summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2012-01-11 10:40:10 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2012-01-11 10:40:10 +0000
commitd7b9fe130c2305d44fa1023283d3c2fcd389ba93 (patch)
tree7dc59876c667dfdf4878fb7fbd4e50778e434115
parentb31314228cd6cef717e0d994ddf2291cbd233205 (diff)
downloadm4-d7b9fe130c2305d44fa1023283d3c2fcd389ba93.tar.gz
Add the output of bootstrap
-rw-r--r--.gitmodules3
m---------gnulib0
-rw-r--r--gnulib/.cvsignore2
-rw-r--r--gnulib/.gitattributes6
-rw-r--r--gnulib/.gitignore8
-rw-r--r--gnulib/COPYING17
-rw-r--r--gnulib/ChangeLog63177
-rw-r--r--gnulib/DEPENDENCIES145
-rwxr-xr-xgnulib/MODULES.html.sh3367
-rw-r--r--gnulib/NEWS452
-rw-r--r--gnulib/README334
-rwxr-xr-xgnulib/build-aux/announce-gen500
-rw-r--r--gnulib/build-aux/arg-nonnull.h26
-rwxr-xr-xgnulib/build-aux/bootstrap853
-rw-r--r--gnulib/build-aux/bootstrap.conf59
-rwxr-xr-xgnulib/build-aux/compile143
-rwxr-xr-xgnulib/build-aux/config.guess1502
-rwxr-xr-xgnulib/build-aux/config.libpath154
-rwxr-xr-xgnulib/build-aux/config.rpath672
-rwxr-xr-xgnulib/build-aux/config.sub1714
-rw-r--r--gnulib/build-aux/csharpcomp.sh.in158
-rw-r--r--gnulib/build-aux/csharpexec.sh.in95
-rwxr-xr-xgnulib/build-aux/depcomp630
-rwxr-xr-xgnulib/build-aux/do-release-commit-and-tag139
-rwxr-xr-xgnulib/build-aux/elisp-comp94
-rwxr-xr-xgnulib/build-aux/gendocs.sh367
-rwxr-xr-xgnulib/build-aux/git-version-gen151
-rwxr-xr-xgnulib/build-aux/gitlog-to-changelog191
-rwxr-xr-xgnulib/build-aux/gnu-web-doc-update115
-rwxr-xr-xgnulib/build-aux/gnupload413
-rwxr-xr-xgnulib/build-aux/install-reloc196
-rwxr-xr-xgnulib/build-aux/install-sh524
-rw-r--r--gnulib/build-aux/javacomp.sh.in75
-rw-r--r--gnulib/build-aux/javaexec.sh.in70
-rw-r--r--gnulib/build-aux/ldd.sh.in22
-rw-r--r--gnulib/build-aux/link-warning.h45
-rwxr-xr-xgnulib/build-aux/mdate-sh206
-rwxr-xr-xgnulib/build-aux/missing376
-rwxr-xr-xgnulib/build-aux/mkinstalldirs162
-rwxr-xr-xgnulib/build-aux/mktempd134
-rwxr-xr-xgnulib/build-aux/move-if-change77
-rwxr-xr-xgnulib/build-aux/ncftpput-ftp57
-rw-r--r--gnulib/build-aux/pmccabe.css227
-rw-r--r--gnulib/build-aux/pmccabe2html907
-rw-r--r--gnulib/build-aux/po/Makefile.in.in429
-rwxr-xr-xgnulib/build-aux/reloc-ldflags101
-rw-r--r--gnulib/build-aux/relocatable.sh.in131
-rw-r--r--gnulib/build-aux/texinfo.tex9294
-rw-r--r--gnulib/build-aux/unused-parameter.h36
-rwxr-xr-xgnulib/build-aux/update-copyright266
-rwxr-xr-xgnulib/build-aux/useless-if-before-free209
-rwxr-xr-xgnulib/build-aux/vc-list-files116
-rw-r--r--gnulib/build-aux/warn-on-use.h75
-rw-r--r--gnulib/build-aux/x-to-1.in62
-rwxr-xr-xgnulib/check-module303
-rw-r--r--gnulib/config/argz.mk64
-rwxr-xr-xgnulib/config/srclist-update136
-rw-r--r--gnulib/config/srclist.txt255
-rw-r--r--gnulib/config/srclistvars.sh53
-rw-r--r--gnulib/doc/.cvsignore4
-rw-r--r--gnulib/doc/.gitignore17
-rw-r--r--gnulib/doc/COPYING.LESSERv2504
-rw-r--r--gnulib/doc/COPYING.LESSERv3165
-rw-r--r--gnulib/doc/COPYINGv2339
-rw-r--r--gnulib/doc/COPYINGv3674
-rw-r--r--gnulib/doc/Copyright/assign.changes.manual128
-rw-r--r--gnulib/doc/Copyright/assign.future.manual129
-rw-r--r--gnulib/doc/Copyright/assign.manual117
-rw-r--r--gnulib/doc/Copyright/assign.translation.manual107
-rw-r--r--gnulib/doc/Copyright/conditions.text136
-rw-r--r--gnulib/doc/Copyright/disclaim.changes.manual62
-rw-r--r--gnulib/doc/Copyright/disclaim.manual63
-rw-r--r--gnulib/doc/Copyright/disclaim.program65
-rw-r--r--gnulib/doc/Copyright/request-assign.changes38
-rw-r--r--gnulib/doc/Copyright/request-assign.future42
-rw-r--r--gnulib/doc/Copyright/request-assign.program32
-rw-r--r--gnulib/doc/Copyright/request-disclaim.changes47
-rw-r--r--gnulib/doc/INSTALL365
-rw-r--r--gnulib/doc/INSTALL.ISO365
-rw-r--r--gnulib/doc/INSTALL.UTF-8365
-rw-r--r--gnulib/doc/README46
-rw-r--r--gnulib/doc/acl-cygwin.txt138
-rw-r--r--gnulib/doc/acl-resources.txt460
-rw-r--r--gnulib/doc/agpl-3.0.texi698
-rw-r--r--gnulib/doc/alloca-opt.texi41
-rw-r--r--gnulib/doc/alloca.texi43
-rw-r--r--gnulib/doc/c-ctype.texi47
-rw-r--r--gnulib/doc/c-strcase.texi29
-rw-r--r--gnulib/doc/c-strcaseeq.texi28
-rw-r--r--gnulib/doc/c-strcasestr.texi27
-rw-r--r--gnulib/doc/c-strstr.texi24
-rw-r--r--gnulib/doc/c-strtod.texi27
-rw-r--r--gnulib/doc/c-strtold.texi23
-rw-r--r--gnulib/doc/ctime.texi30
-rw-r--r--gnulib/doc/error.texi26
-rw-r--r--gnulib/doc/fdl-1.2.texi451
-rw-r--r--gnulib/doc/fdl-1.3.texi506
-rw-r--r--gnulib/doc/fdl.texi506
-rw-r--r--gnulib/doc/func.texi20
-rw-r--r--gnulib/doc/gcd.texi54
-rw-r--r--gnulib/doc/gendocs_template96
-rw-r--r--gnulib/doc/gendocs_template_min101
-rw-r--r--gnulib/doc/getdate.texi556
-rw-r--r--gnulib/doc/glibc-functions/accept4.texi16
-rw-r--r--gnulib/doc/glibc-functions/acct.texi16
-rw-r--r--gnulib/doc/glibc-functions/addmntent.texi16
-rw-r--r--gnulib/doc/glibc-functions/addseverity.texi16
-rw-r--r--gnulib/doc/glibc-functions/adjtime.texi16
-rw-r--r--gnulib/doc/glibc-functions/adjtimex.texi16
-rw-r--r--gnulib/doc/glibc-functions/advance.texi16
-rw-r--r--gnulib/doc/glibc-functions/aio_init.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_err_exit_status.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_error.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_failure.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_help.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_parse.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_program_bug_address.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_program_version.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_program_version_hook.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_state_help.texi16
-rw-r--r--gnulib/doc/glibc-functions/argp_usage.texi16
-rw-r--r--gnulib/doc/glibc-functions/argz_add.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_add_sep.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_append.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_count.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_create.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_create_sep.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_delete.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_extract.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_insert.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_next.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_replace.texi21
-rw-r--r--gnulib/doc/glibc-functions/argz_stringify.texi21
-rw-r--r--gnulib/doc/glibc-functions/asprintf.texi16
-rw-r--r--gnulib/doc/glibc-functions/authdes_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/authdes_getucred.texi16
-rw-r--r--gnulib/doc/glibc-functions/authdes_pk_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/authnone_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/authunix_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/authunix_create_default.texi16
-rw-r--r--gnulib/doc/glibc-functions/backtrace.texi16
-rw-r--r--gnulib/doc/glibc-functions/backtrace_symbols.texi16
-rw-r--r--gnulib/doc/glibc-functions/backtrace_symbols_fd.texi16
-rw-r--r--gnulib/doc/glibc-functions/bdflush.texi16
-rw-r--r--gnulib/doc/glibc-functions/bind_textdomain_codeset.texi16
-rw-r--r--gnulib/doc/glibc-functions/bindresvport.texi16
-rw-r--r--gnulib/doc/glibc-functions/bindtextdomain.texi16
-rw-r--r--gnulib/doc/glibc-functions/brk.texi16
-rw-r--r--gnulib/doc/glibc-functions/bswap_16.texi16
-rw-r--r--gnulib/doc/glibc-functions/bswap_32.texi16
-rw-r--r--gnulib/doc/glibc-functions/bswap_64.texi16
-rw-r--r--gnulib/doc/glibc-functions/callrpc.texi16
-rw-r--r--gnulib/doc/glibc-functions/canonicalize_file_name.texi21
-rw-r--r--gnulib/doc/glibc-functions/capget.texi16
-rw-r--r--gnulib/doc/glibc-functions/capset.texi16
-rw-r--r--gnulib/doc/glibc-functions/cbc_crypt.texi16
-rw-r--r--gnulib/doc/glibc-functions/cfmakeraw.texi16
-rw-r--r--gnulib/doc/glibc-functions/cfree.texi16
-rw-r--r--gnulib/doc/glibc-functions/cfsetspeed.texi16
-rw-r--r--gnulib/doc/glibc-functions/chroot.texi16
-rw-r--r--gnulib/doc/glibc-functions/clearenv.texi16
-rw-r--r--gnulib/doc/glibc-functions/clearerr_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnt_broadcast.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnt_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnt_pcreateerror.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnt_perrno.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnt_perror.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnt_spcreateerror.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnt_sperrno.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnt_sperror.texi16
-rw-r--r--gnulib/doc/glibc-functions/clntraw_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/clnttcp_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/clntudp_bufcreate.texi16
-rw-r--r--gnulib/doc/glibc-functions/clntudp_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/clntunix_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/clog10.texi16
-rw-r--r--gnulib/doc/glibc-functions/clog10f.texi16
-rw-r--r--gnulib/doc/glibc-functions/clog10l.texi16
-rw-r--r--gnulib/doc/glibc-functions/clone.texi16
-rw-r--r--gnulib/doc/glibc-functions/crypt_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/cuserid.texi16
-rw-r--r--gnulib/doc/glibc-functions/daemon.texi16
-rw-r--r--gnulib/doc/glibc-functions/dcgettext.texi16
-rw-r--r--gnulib/doc/glibc-functions/dcngettext.texi16
-rw-r--r--gnulib/doc/glibc-functions/des_setparity.texi16
-rw-r--r--gnulib/doc/glibc-functions/dgettext.texi16
-rw-r--r--gnulib/doc/glibc-functions/dl_iterate_phdr.texi16
-rw-r--r--gnulib/doc/glibc-functions/dladdr.texi16
-rw-r--r--gnulib/doc/glibc-functions/dladdr1.texi16
-rw-r--r--gnulib/doc/glibc-functions/dlinfo.texi16
-rw-r--r--gnulib/doc/glibc-functions/dlmopen.texi16
-rw-r--r--gnulib/doc/glibc-functions/dlvsym.texi16
-rw-r--r--gnulib/doc/glibc-functions/dn_expand.texi16
-rw-r--r--gnulib/doc/glibc-functions/dngettext.texi16
-rw-r--r--gnulib/doc/glibc-functions/drand48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/drem.texi16
-rw-r--r--gnulib/doc/glibc-functions/dremf.texi16
-rw-r--r--gnulib/doc/glibc-functions/dreml.texi16
-rw-r--r--gnulib/doc/glibc-functions/dup3.texi16
-rw-r--r--gnulib/doc/glibc-functions/dysize.texi16
-rw-r--r--gnulib/doc/glibc-functions/ecb_crypt.texi16
-rw-r--r--gnulib/doc/glibc-functions/ecvt_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/encrypt_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/endaliasent.texi16
-rw-r--r--gnulib/doc/glibc-functions/endfsent.texi16
-rw-r--r--gnulib/doc/glibc-functions/endmntent.texi16
-rw-r--r--gnulib/doc/glibc-functions/endnetgrent.texi16
-rw-r--r--gnulib/doc/glibc-functions/endrpcent.texi16
-rw-r--r--gnulib/doc/glibc-functions/endspent.texi16
-rw-r--r--gnulib/doc/glibc-functions/endttyent.texi16
-rw-r--r--gnulib/doc/glibc-functions/endusershell.texi16
-rw-r--r--gnulib/doc/glibc-functions/endutent.texi16
-rw-r--r--gnulib/doc/glibc-functions/envz_add.texi16
-rw-r--r--gnulib/doc/glibc-functions/envz_entry.texi16
-rw-r--r--gnulib/doc/glibc-functions/envz_get.texi16
-rw-r--r--gnulib/doc/glibc-functions/envz_merge.texi16
-rw-r--r--gnulib/doc/glibc-functions/envz_remove.texi16
-rw-r--r--gnulib/doc/glibc-functions/envz_strip.texi16
-rw-r--r--gnulib/doc/glibc-functions/epoll_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/epoll_ctl.texi16
-rw-r--r--gnulib/doc/glibc-functions/epoll_wait.texi16
-rw-r--r--gnulib/doc/glibc-functions/erand48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/err.texi16
-rw-r--r--gnulib/doc/glibc-functions/error.texi16
-rw-r--r--gnulib/doc/glibc-functions/error_at_line.texi16
-rw-r--r--gnulib/doc/glibc-functions/error_message_count.texi16
-rw-r--r--gnulib/doc/glibc-functions/error_one_per_line.texi16
-rw-r--r--gnulib/doc/glibc-functions/error_print_progname.texi16
-rw-r--r--gnulib/doc/glibc-functions/errx.texi16
-rw-r--r--gnulib/doc/glibc-functions/ether_aton.texi16
-rw-r--r--gnulib/doc/glibc-functions/ether_aton_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/ether_hostton.texi16
-rw-r--r--gnulib/doc/glibc-functions/ether_line.texi16
-rw-r--r--gnulib/doc/glibc-functions/ether_ntoa.texi16
-rw-r--r--gnulib/doc/glibc-functions/ether_ntoa_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/ether_ntohost.texi16
-rw-r--r--gnulib/doc/glibc-functions/euidaccess.texi17
-rw-r--r--gnulib/doc/glibc-functions/execvpe.texi18
-rw-r--r--gnulib/doc/glibc-functions/exp10.texi17
-rw-r--r--gnulib/doc/glibc-functions/exp10f.texi17
-rw-r--r--gnulib/doc/glibc-functions/exp10l.texi16
-rw-r--r--gnulib/doc/glibc-functions/fallocate.texi16
-rw-r--r--gnulib/doc/glibc-functions/fcloseall.texi16
-rw-r--r--gnulib/doc/glibc-functions/fcvt_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/fedisableexcept.texi16
-rw-r--r--gnulib/doc/glibc-functions/feenableexcept.texi16
-rw-r--r--gnulib/doc/glibc-functions/fegetexcept.texi16
-rw-r--r--gnulib/doc/glibc-functions/feof_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/ferror_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/fflush_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/ffsl.texi16
-rw-r--r--gnulib/doc/glibc-functions/ffsll.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgetc_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgetfilecon.texi5
-rw-r--r--gnulib/doc/glibc-functions/fgetgrent.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgetgrent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgetpwent.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgetpwent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgets_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgetspent.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgetspent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/fgetwc_unlocked.texi19
-rw-r--r--gnulib/doc/glibc-functions/fgetws_unlocked.texi19
-rw-r--r--gnulib/doc/glibc-functions/fgetxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/fileno_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/finite.texi16
-rw-r--r--gnulib/doc/glibc-functions/finitef.texi16
-rw-r--r--gnulib/doc/glibc-functions/finitel.texi16
-rw-r--r--gnulib/doc/glibc-functions/flistxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/flock.texi19
-rw-r--r--gnulib/doc/glibc-functions/fopencookie.texi17
-rw-r--r--gnulib/doc/glibc-functions/forkpty.texi25
-rw-r--r--gnulib/doc/glibc-functions/fputc_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/fputs_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/fputwc_unlocked.texi19
-rw-r--r--gnulib/doc/glibc-functions/fputws_unlocked.texi19
-rw-r--r--gnulib/doc/glibc-functions/fread_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/freeifaddrs.texi16
-rw-r--r--gnulib/doc/glibc-functions/fremovexattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/fsetxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/fstatfs.texi16
-rw-r--r--gnulib/doc/glibc-functions/fts_children.texi16
-rw-r--r--gnulib/doc/glibc-functions/fts_close.texi16
-rw-r--r--gnulib/doc/glibc-functions/fts_open.texi16
-rw-r--r--gnulib/doc/glibc-functions/fts_read.texi16
-rw-r--r--gnulib/doc/glibc-functions/fts_set.texi16
-rw-r--r--gnulib/doc/glibc-functions/futimes.texi20
-rw-r--r--gnulib/doc/glibc-functions/futimesat.texi25
-rw-r--r--gnulib/doc/glibc-functions/fwrite_unlocked.texi16
-rw-r--r--gnulib/doc/glibc-functions/gamma.texi16
-rw-r--r--gnulib/doc/glibc-functions/gammaf.texi16
-rw-r--r--gnulib/doc/glibc-functions/gammal.texi16
-rw-r--r--gnulib/doc/glibc-functions/get_avphys_pages.texi16
-rw-r--r--gnulib/doc/glibc-functions/get_current_dir_name.texi16
-rw-r--r--gnulib/doc/glibc-functions/get_myaddress.texi16
-rw-r--r--gnulib/doc/glibc-functions/get_nprocs.texi16
-rw-r--r--gnulib/doc/glibc-functions/get_nprocs_conf.texi16
-rw-r--r--gnulib/doc/glibc-functions/get_phys_pages.texi16
-rw-r--r--gnulib/doc/glibc-functions/getaliasbyname.texi16
-rw-r--r--gnulib/doc/glibc-functions/getaliasbyname_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getaliasent.texi16
-rw-r--r--gnulib/doc/glibc-functions/getaliasent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getdate_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getdirentries.texi16
-rw-r--r--gnulib/doc/glibc-functions/getdomainname.texi16
-rw-r--r--gnulib/doc/glibc-functions/getdtablesize.texi16
-rw-r--r--gnulib/doc/glibc-functions/getfilecon-desc.texi27
-rw-r--r--gnulib/doc/glibc-functions/getfilecon.texi5
-rw-r--r--gnulib/doc/glibc-functions/getfsent.texi16
-rw-r--r--gnulib/doc/glibc-functions/getfsfile.texi16
-rw-r--r--gnulib/doc/glibc-functions/getfsspec.texi16
-rw-r--r--gnulib/doc/glibc-functions/getgrent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getgrouplist.texi16
-rw-r--r--gnulib/doc/glibc-functions/gethostbyaddr_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/gethostbyname2.texi16
-rw-r--r--gnulib/doc/glibc-functions/gethostbyname2_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/gethostbyname_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/gethostent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getifaddrs.texi16
-rw-r--r--gnulib/doc/glibc-functions/getipv4sourcefilter.texi16
-rw-r--r--gnulib/doc/glibc-functions/getloadavg.texi16
-rw-r--r--gnulib/doc/glibc-functions/getmntent.texi16
-rw-r--r--gnulib/doc/glibc-functions/getmntent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getnetbyaddr_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getnetbyname_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getnetent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getnetgrent.texi16
-rw-r--r--gnulib/doc/glibc-functions/getnetgrent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getnetname.texi16
-rw-r--r--gnulib/doc/glibc-functions/getopt_long.texi39
-rw-r--r--gnulib/doc/glibc-functions/getopt_long_only.texi44
-rw-r--r--gnulib/doc/glibc-functions/getpagesize.texi19
-rw-r--r--gnulib/doc/glibc-functions/getpass.texi24
-rw-r--r--gnulib/doc/glibc-functions/getprotobyname_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getprotobynumber_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getprotoent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getpt.texi16
-rw-r--r--gnulib/doc/glibc-functions/getpublickey.texi16
-rw-r--r--gnulib/doc/glibc-functions/getpw.texi16
-rw-r--r--gnulib/doc/glibc-functions/getpwent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getresgid.texi16
-rw-r--r--gnulib/doc/glibc-functions/getresuid.texi16
-rw-r--r--gnulib/doc/glibc-functions/getrpcbyname.texi16
-rw-r--r--gnulib/doc/glibc-functions/getrpcbyname_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getrpcbynumber.texi16
-rw-r--r--gnulib/doc/glibc-functions/getrpcbynumber_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getrpcent.texi16
-rw-r--r--gnulib/doc/glibc-functions/getrpcent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getrpcport.texi16
-rw-r--r--gnulib/doc/glibc-functions/getsecretkey.texi16
-rw-r--r--gnulib/doc/glibc-functions/getservbyname_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getservbyport_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getservent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getsourcefilter.texi16
-rw-r--r--gnulib/doc/glibc-functions/getspent.texi16
-rw-r--r--gnulib/doc/glibc-functions/getspent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getspnam.texi16
-rw-r--r--gnulib/doc/glibc-functions/getspnam_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/gettext.texi16
-rw-r--r--gnulib/doc/glibc-functions/getttyent.texi16
-rw-r--r--gnulib/doc/glibc-functions/getttynam.texi16
-rw-r--r--gnulib/doc/glibc-functions/getusershell.texi16
-rw-r--r--gnulib/doc/glibc-functions/getutent.texi16
-rw-r--r--gnulib/doc/glibc-functions/getutent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getutid.texi16
-rw-r--r--gnulib/doc/glibc-functions/getutid_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getutline.texi16
-rw-r--r--gnulib/doc/glibc-functions/getutline_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/getutmp.texi16
-rw-r--r--gnulib/doc/glibc-functions/getutmpx.texi16
-rw-r--r--gnulib/doc/glibc-functions/getw.texi16
-rw-r--r--gnulib/doc/glibc-functions/getwc_unlocked.texi19
-rw-r--r--gnulib/doc/glibc-functions/getwchar_unlocked.texi19
-rw-r--r--gnulib/doc/glibc-functions/getxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/glob_pattern_p.texi17
-rw-r--r--gnulib/doc/glibc-functions/gnu_dev_major.texi16
-rw-r--r--gnulib/doc/glibc-functions/gnu_dev_makedev.texi16
-rw-r--r--gnulib/doc/glibc-functions/gnu_dev_minor.texi16
-rw-r--r--gnulib/doc/glibc-functions/gnu_get_libc_release.texi16
-rw-r--r--gnulib/doc/glibc-functions/gnu_get_libc_version.texi16
-rw-r--r--gnulib/doc/glibc-functions/group_member.texi16
-rw-r--r--gnulib/doc/glibc-functions/gsignal.texi16
-rw-r--r--gnulib/doc/glibc-functions/hasmntopt.texi16
-rw-r--r--gnulib/doc/glibc-functions/hcreate_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/hdestroy_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/herror.texi16
-rw-r--r--gnulib/doc/glibc-functions/host2netname.texi16
-rw-r--r--gnulib/doc/glibc-functions/hsearch_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/hstrerror.texi16
-rw-r--r--gnulib/doc/glibc-functions/in6addr_any.texi16
-rw-r--r--gnulib/doc/glibc-functions/in6addr_loopback.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet6_option_alloc.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet6_option_append.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet6_option_find.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet6_option_init.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet6_option_next.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet6_option_space.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_aton.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_lnaof.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_makeaddr.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_net_ntop.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_net_pton.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_neta.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_netof.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_network.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_nsap_addr.texi16
-rw-r--r--gnulib/doc/glibc-functions/inet_nsap_ntoa.texi16
-rw-r--r--gnulib/doc/glibc-functions/initgroups.texi16
-rw-r--r--gnulib/doc/glibc-functions/initstate_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/innetgr.texi16
-rw-r--r--gnulib/doc/glibc-functions/ioperm.texi16
-rw-r--r--gnulib/doc/glibc-functions/iopl.texi16
-rw-r--r--gnulib/doc/glibc-functions/isctype.texi16
-rw-r--r--gnulib/doc/glibc-functions/isfdtype.texi16
-rw-r--r--gnulib/doc/glibc-functions/isinff.texi16
-rw-r--r--gnulib/doc/glibc-functions/isinfl.texi16
-rw-r--r--gnulib/doc/glibc-functions/isnanf.texi16
-rw-r--r--gnulib/doc/glibc-functions/isnanl.texi16
-rw-r--r--gnulib/doc/glibc-functions/j0f.texi16
-rw-r--r--gnulib/doc/glibc-functions/j0l.texi16
-rw-r--r--gnulib/doc/glibc-functions/j1f.texi16
-rw-r--r--gnulib/doc/glibc-functions/j1l.texi16
-rw-r--r--gnulib/doc/glibc-functions/jnf.texi16
-rw-r--r--gnulib/doc/glibc-functions/jnl.texi16
-rw-r--r--gnulib/doc/glibc-functions/jrand48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/key_decryptsession.texi16
-rw-r--r--gnulib/doc/glibc-functions/key_decryptsession_pk.texi16
-rw-r--r--gnulib/doc/glibc-functions/key_encryptsession.texi16
-rw-r--r--gnulib/doc/glibc-functions/key_encryptsession_pk.texi16
-rw-r--r--gnulib/doc/glibc-functions/key_gendes.texi16
-rw-r--r--gnulib/doc/glibc-functions/key_get_conv.texi16
-rw-r--r--gnulib/doc/glibc-functions/key_secretkey_is_set.texi16
-rw-r--r--gnulib/doc/glibc-functions/key_setsecret.texi16
-rw-r--r--gnulib/doc/glibc-functions/klogctl.texi16
-rw-r--r--gnulib/doc/glibc-functions/lchmod.texi16
-rw-r--r--gnulib/doc/glibc-functions/lckpwdf.texi16
-rw-r--r--gnulib/doc/glibc-functions/lcong48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/lgamma_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/lgammaf_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/lgammal_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/lgetfilecon.texi5
-rw-r--r--gnulib/doc/glibc-functions/lgetxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/listxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/llistxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/loc1.texi16
-rw-r--r--gnulib/doc/glibc-functions/loc2.texi16
-rw-r--r--gnulib/doc/glibc-functions/locs.texi16
-rw-r--r--gnulib/doc/glibc-functions/lrand48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/lremovexattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/lsetxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/lutimes.texi26
-rw-r--r--gnulib/doc/glibc-functions/madvise.texi16
-rw-r--r--gnulib/doc/glibc-functions/mallinfo.texi16
-rw-r--r--gnulib/doc/glibc-functions/malloc_get_state.texi16
-rw-r--r--gnulib/doc/glibc-functions/malloc_set_state.texi16
-rw-r--r--gnulib/doc/glibc-functions/malloc_stats.texi16
-rw-r--r--gnulib/doc/glibc-functions/malloc_trim.texi16
-rw-r--r--gnulib/doc/glibc-functions/malloc_usable_size.texi16
-rw-r--r--gnulib/doc/glibc-functions/mallopt.texi16
-rw-r--r--gnulib/doc/glibc-functions/matherr.texi16
-rw-r--r--gnulib/doc/glibc-functions/mcheck.texi16
-rw-r--r--gnulib/doc/glibc-functions/mcheck_check_all.texi16
-rw-r--r--gnulib/doc/glibc-functions/mcheck_pedantic.texi16
-rw-r--r--gnulib/doc/glibc-functions/memalign.texi16
-rw-r--r--gnulib/doc/glibc-functions/memfrob.texi16
-rw-r--r--gnulib/doc/glibc-functions/memmem.texi32
-rw-r--r--gnulib/doc/glibc-functions/mempcpy.texi16
-rw-r--r--gnulib/doc/glibc-functions/memrchr.texi16
-rw-r--r--gnulib/doc/glibc-functions/mincore.texi16
-rw-r--r--gnulib/doc/glibc-functions/mkostemp.texi16
-rw-r--r--gnulib/doc/glibc-functions/mkostemps.texi16
-rw-r--r--gnulib/doc/glibc-functions/mkstemps.texi17
-rw-r--r--gnulib/doc/glibc-functions/monstartup.texi16
-rw-r--r--gnulib/doc/glibc-functions/mount.texi16
-rw-r--r--gnulib/doc/glibc-functions/mprobe.texi16
-rw-r--r--gnulib/doc/glibc-functions/mrand48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/mremap.texi16
-rw-r--r--gnulib/doc/glibc-functions/mtrace.texi16
-rw-r--r--gnulib/doc/glibc-functions/muntrace.texi16
-rw-r--r--gnulib/doc/glibc-functions/netname2host.texi16
-rw-r--r--gnulib/doc/glibc-functions/netname2user.texi16
-rw-r--r--gnulib/doc/glibc-functions/ngettext.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_add.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_add_entry.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_addmember.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_checkpoint.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_clone_object.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_creategroup.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_destroy_object.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_destroygroup.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_dir_cmp.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_domain_of.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_domain_of_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_first_entry.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_freenames.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_freeresult.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_freeservlist.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_freetags.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_getnames.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_getservlist.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_ismember.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_leaf_of.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_leaf_of_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_lerror.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_list.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_local_directory.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_local_group.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_local_host.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_local_principal.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_lookup.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_mkdir.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_modify.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_modify_entry.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_name_of.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_name_of_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_next_entry.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_perror.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_ping.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_directory.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_entry.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_group.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_group_entry.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_link.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_object.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_result.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_rights.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_print_table.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_remove.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_remove_entry.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_removemember.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_rmdir.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_servstate.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_sperrno.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_sperror.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_sperror_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_stats.texi16
-rw-r--r--gnulib/doc/glibc-functions/nis_verifygroup.texi16
-rw-r--r--gnulib/doc/glibc-functions/nrand48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/ntp_adjtime.texi16
-rw-r--r--gnulib/doc/glibc-functions/ntp_gettime.texi16
-rw-r--r--gnulib/doc/glibc-functions/obstack_alloc_failed_handler.texi16
-rw-r--r--gnulib/doc/glibc-functions/obstack_exit_failure.texi16
-rw-r--r--gnulib/doc/glibc-functions/obstack_free.texi16
-rw-r--r--gnulib/doc/glibc-functions/obstack_printf.texi73
-rw-r--r--gnulib/doc/glibc-functions/obstack_vprintf.texi73
-rw-r--r--gnulib/doc/glibc-functions/on_exit.texi16
-rw-r--r--gnulib/doc/glibc-functions/openpty.texi26
-rw-r--r--gnulib/doc/glibc-functions/parse_printf_format.texi16
-rw-r--r--gnulib/doc/glibc-functions/personality.texi16
-rw-r--r--gnulib/doc/glibc-functions/pipe2.texi16
-rw-r--r--gnulib/doc/glibc-functions/pmap_getmaps.texi16
-rw-r--r--gnulib/doc/glibc-functions/pmap_getport.texi16
-rw-r--r--gnulib/doc/glibc-functions/pmap_rmtcall.texi16
-rw-r--r--gnulib/doc/glibc-functions/pmap_set.texi16
-rw-r--r--gnulib/doc/glibc-functions/pmap_unset.texi16
-rw-r--r--gnulib/doc/glibc-functions/pow10.texi17
-rw-r--r--gnulib/doc/glibc-functions/pow10f.texi17
-rw-r--r--gnulib/doc/glibc-functions/pow10l.texi16
-rw-r--r--gnulib/doc/glibc-functions/prctl.texi16
-rw-r--r--gnulib/doc/glibc-functions/printf_size.texi16
-rw-r--r--gnulib/doc/glibc-functions/printf_size_info.texi16
-rw-r--r--gnulib/doc/glibc-functions/profil.texi16
-rw-r--r--gnulib/doc/glibc-functions/program_invocation_name.texi16
-rw-r--r--gnulib/doc/glibc-functions/program_invocation_short_name.texi16
-rw-r--r--gnulib/doc/glibc-functions/pthread_getattr_np.texi16
-rw-r--r--gnulib/doc/glibc-functions/pthread_kill_other_threads_np.texi16
-rw-r--r--gnulib/doc/glibc-functions/pthread_rwlockattr_getkind_np.texi16
-rw-r--r--gnulib/doc/glibc-functions/pthread_rwlockattr_setkind_np.texi16
-rw-r--r--gnulib/doc/glibc-functions/pthread_yield.texi16
-rw-r--r--gnulib/doc/glibc-functions/ptrace.texi16
-rw-r--r--gnulib/doc/glibc-functions/ptsname_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/putgrent.texi16
-rw-r--r--gnulib/doc/glibc-functions/putpwent.texi16
-rw-r--r--gnulib/doc/glibc-functions/putspent.texi16
-rw-r--r--gnulib/doc/glibc-functions/pututline.texi16
-rw-r--r--gnulib/doc/glibc-functions/putw.texi16
-rw-r--r--gnulib/doc/glibc-functions/putwc_unlocked.texi19
-rw-r--r--gnulib/doc/glibc-functions/putwchar_unlocked.texi19
-rw-r--r--gnulib/doc/glibc-functions/pvalloc.texi16
-rw-r--r--gnulib/doc/glibc-functions/qecvt.texi16
-rw-r--r--gnulib/doc/glibc-functions/qecvt_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/qfcvt.texi16
-rw-r--r--gnulib/doc/glibc-functions/qfcvt_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/qgcvt.texi16
-rw-r--r--gnulib/doc/glibc-functions/quotactl.texi16
-rw-r--r--gnulib/doc/glibc-functions/random_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/rawmemchr.texi16
-rw-r--r--gnulib/doc/glibc-functions/rcmd.texi16
-rw-r--r--gnulib/doc/glibc-functions/rcmd_af.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_comp.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_compile_fastmap.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_compile_pattern.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_exec.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_match.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_match_2.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_search.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_search_2.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_set_registers.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_set_syntax.texi16
-rw-r--r--gnulib/doc/glibc-functions/re_syntax_options.texi16
-rw-r--r--gnulib/doc/glibc-functions/readahead.texi16
-rw-r--r--gnulib/doc/glibc-functions/reboot.texi16
-rw-r--r--gnulib/doc/glibc-functions/register_printf_function.texi16
-rw-r--r--gnulib/doc/glibc-functions/remap_file_pages.texi16
-rw-r--r--gnulib/doc/glibc-functions/removexattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/res_init.texi16
-rw-r--r--gnulib/doc/glibc-functions/res_mkquery.texi16
-rw-r--r--gnulib/doc/glibc-functions/res_query.texi16
-rw-r--r--gnulib/doc/glibc-functions/res_querydomain.texi16
-rw-r--r--gnulib/doc/glibc-functions/res_search.texi16
-rw-r--r--gnulib/doc/glibc-functions/revoke.texi16
-rw-r--r--gnulib/doc/glibc-functions/rexec.texi16
-rw-r--r--gnulib/doc/glibc-functions/rexec_af.texi16
-rw-r--r--gnulib/doc/glibc-functions/rpc_createerr.texi16
-rw-r--r--gnulib/doc/glibc-functions/rpmatch.texi16
-rw-r--r--gnulib/doc/glibc-functions/rresvport.texi16
-rw-r--r--gnulib/doc/glibc-functions/rresvport_af.texi16
-rw-r--r--gnulib/doc/glibc-functions/rtime.texi16
-rw-r--r--gnulib/doc/glibc-functions/ruserok.texi16
-rw-r--r--gnulib/doc/glibc-functions/ruserok_af.texi16
-rw-r--r--gnulib/doc/glibc-functions/sbrk.texi16
-rw-r--r--gnulib/doc/glibc-functions/scalbf.texi16
-rw-r--r--gnulib/doc/glibc-functions/scalbl.texi16
-rw-r--r--gnulib/doc/glibc-functions/sched_getaffinity.texi16
-rw-r--r--gnulib/doc/glibc-functions/sched_setaffinity.texi16
-rw-r--r--gnulib/doc/glibc-functions/seed48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/semtimedop.texi16
-rw-r--r--gnulib/doc/glibc-functions/sendfile.texi16
-rw-r--r--gnulib/doc/glibc-functions/setaliasent.texi16
-rw-r--r--gnulib/doc/glibc-functions/setbuffer.texi16
-rw-r--r--gnulib/doc/glibc-functions/setdomainname.texi16
-rw-r--r--gnulib/doc/glibc-functions/setfsent.texi16
-rw-r--r--gnulib/doc/glibc-functions/setfsgid.texi16
-rw-r--r--gnulib/doc/glibc-functions/setfsuid.texi16
-rw-r--r--gnulib/doc/glibc-functions/setgroups.texi22
-rw-r--r--gnulib/doc/glibc-functions/sethostid.texi16
-rw-r--r--gnulib/doc/glibc-functions/sethostname.texi16
-rw-r--r--gnulib/doc/glibc-functions/setipv4sourcefilter.texi16
-rw-r--r--gnulib/doc/glibc-functions/setkey_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/setlinebuf.texi16
-rw-r--r--gnulib/doc/glibc-functions/setlogin.texi16
-rw-r--r--gnulib/doc/glibc-functions/setmntent.texi16
-rw-r--r--gnulib/doc/glibc-functions/setnetgrent.texi16
-rw-r--r--gnulib/doc/glibc-functions/setresgid.texi16
-rw-r--r--gnulib/doc/glibc-functions/setresuid.texi16
-rw-r--r--gnulib/doc/glibc-functions/setrpcent.texi16
-rw-r--r--gnulib/doc/glibc-functions/setsourcefilter.texi16
-rw-r--r--gnulib/doc/glibc-functions/setspent.texi16
-rw-r--r--gnulib/doc/glibc-functions/setstate_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/settimeofday.texi16
-rw-r--r--gnulib/doc/glibc-functions/setttyent.texi16
-rw-r--r--gnulib/doc/glibc-functions/setusershell.texi16
-rw-r--r--gnulib/doc/glibc-functions/setutent.texi16
-rw-r--r--gnulib/doc/glibc-functions/setxattr.texi17
-rw-r--r--gnulib/doc/glibc-functions/sgetspent.texi16
-rw-r--r--gnulib/doc/glibc-functions/sgetspent_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/sigandset.texi16
-rw-r--r--gnulib/doc/glibc-functions/sigblock.texi16
-rw-r--r--gnulib/doc/glibc-functions/siggetmask.texi16
-rw-r--r--gnulib/doc/glibc-functions/sigisemptyset.texi16
-rw-r--r--gnulib/doc/glibc-functions/significand.texi16
-rw-r--r--gnulib/doc/glibc-functions/significandf.texi16
-rw-r--r--gnulib/doc/glibc-functions/significandl.texi16
-rw-r--r--gnulib/doc/glibc-functions/sigorset.texi16
-rw-r--r--gnulib/doc/glibc-functions/sigreturn.texi16
-rw-r--r--gnulib/doc/glibc-functions/sigsetmask.texi16
-rw-r--r--gnulib/doc/glibc-functions/sigstack.texi16
-rw-r--r--gnulib/doc/glibc-functions/sigvec.texi16
-rw-r--r--gnulib/doc/glibc-functions/sincos.texi16
-rw-r--r--gnulib/doc/glibc-functions/sincosf.texi16
-rw-r--r--gnulib/doc/glibc-functions/sincosl.texi16
-rw-r--r--gnulib/doc/glibc-functions/sprofil.texi16
-rw-r--r--gnulib/doc/glibc-functions/srand48_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/srandom_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/ssignal.texi16
-rw-r--r--gnulib/doc/glibc-functions/statfs.texi16
-rw-r--r--gnulib/doc/glibc-functions/step.texi16
-rw-r--r--gnulib/doc/glibc-functions/stime.texi16
-rw-r--r--gnulib/doc/glibc-functions/strcasestr.texi30
-rw-r--r--gnulib/doc/glibc-functions/strchrnul.texi16
-rw-r--r--gnulib/doc/glibc-functions/strfry.texi16
-rw-r--r--gnulib/doc/glibc-functions/strptime_l.texi16
-rw-r--r--gnulib/doc/glibc-functions/strsep.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtod_l.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtof_l.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtol_l.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtold_l.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtoll_l.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtoq.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtoul_l.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtoull_l.texi16
-rw-r--r--gnulib/doc/glibc-functions/strtouq.texi16
-rw-r--r--gnulib/doc/glibc-functions/strverscmp.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_exit.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_fdset.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_getreq.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_getreq_common.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_getreq_poll.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_getreqset.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_max_pollfd.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_pollfd.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_register.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_run.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_sendreply.texi16
-rw-r--r--gnulib/doc/glibc-functions/svc_unregister.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcerr_auth.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcerr_decode.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcerr_noproc.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcerr_noprog.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcerr_progvers.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcerr_systemerr.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcerr_weakauth.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcraw_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/svctcp_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcudp_bufcreate.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcudp_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/svcunix_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/swapoff.texi16
-rw-r--r--gnulib/doc/glibc-functions/swapon.texi16
-rw-r--r--gnulib/doc/glibc-functions/sys_errlist.texi16
-rw-r--r--gnulib/doc/glibc-functions/sys_nerr.texi16
-rw-r--r--gnulib/doc/glibc-functions/sys_siglist.texi16
-rw-r--r--gnulib/doc/glibc-functions/syscall.texi16
-rw-r--r--gnulib/doc/glibc-functions/sysctl.texi16
-rw-r--r--gnulib/doc/glibc-functions/sysinfo.texi16
-rw-r--r--gnulib/doc/glibc-functions/sysv_signal.texi16
-rw-r--r--gnulib/doc/glibc-functions/tdestroy.texi16
-rw-r--r--gnulib/doc/glibc-functions/textdomain.texi16
-rw-r--r--gnulib/doc/glibc-functions/timegm.texi16
-rw-r--r--gnulib/doc/glibc-functions/timelocal.texi16
-rw-r--r--gnulib/doc/glibc-functions/tmpnam_r.texi16
-rw-r--r--gnulib/doc/glibc-functions/ttyslot.texi16
-rw-r--r--gnulib/doc/glibc-functions/ulckpwdf.texi16
-rw-r--r--gnulib/doc/glibc-functions/umount.texi16
-rw-r--r--gnulib/doc/glibc-functions/umount2.texi16
-rw-r--r--gnulib/doc/glibc-functions/updwtmp.texi16
-rw-r--r--gnulib/doc/glibc-functions/updwtmpx.texi17
-rw-r--r--gnulib/doc/glibc-functions/user2netname.texi16
-rw-r--r--gnulib/doc/glibc-functions/ustat.texi16
-rw-r--r--gnulib/doc/glibc-functions/utmpname.texi16
-rw-r--r--gnulib/doc/glibc-functions/utmpxname.texi16
-rw-r--r--gnulib/doc/glibc-functions/valloc.texi16
-rw-r--r--gnulib/doc/glibc-functions/vasprintf.texi16
-rw-r--r--gnulib/doc/glibc-functions/verr.texi16
-rw-r--r--gnulib/doc/glibc-functions/verrx.texi16
-rw-r--r--gnulib/doc/glibc-functions/versionsort.texi16
-rw-r--r--gnulib/doc/glibc-functions/vhangup.texi16
-rw-r--r--gnulib/doc/glibc-functions/vlimit.texi16
-rw-r--r--gnulib/doc/glibc-functions/vm86.texi16
-rw-r--r--gnulib/doc/glibc-functions/vsyslog.texi16
-rw-r--r--gnulib/doc/glibc-functions/vtimes.texi16
-rw-r--r--gnulib/doc/glibc-functions/vwarn.texi16
-rw-r--r--gnulib/doc/glibc-functions/vwarnx.texi16
-rw-r--r--gnulib/doc/glibc-functions/wait3.texi16
-rw-r--r--gnulib/doc/glibc-functions/wait4.texi16
-rw-r--r--gnulib/doc/glibc-functions/warn.texi16
-rw-r--r--gnulib/doc/glibc-functions/warnx.texi16
-rw-r--r--gnulib/doc/glibc-functions/wcschrnul.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcsftime_l.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstod_l.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstof_l.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstol_l.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstold_l.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstoll_l.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstoq.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstoul_l.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstoull_l.texi19
-rw-r--r--gnulib/doc/glibc-functions/wcstouq.texi19
-rw-r--r--gnulib/doc/glibc-functions/wmempcpy.texi19
-rw-r--r--gnulib/doc/glibc-functions/xdr_array.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_authunix_parms.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_bool.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_bytes.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_callhdr.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_callmsg.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_cback_data.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_char.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_cryptkeyarg.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_cryptkeyarg2.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_cryptkeyres.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_des_block.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_domainname.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_double.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_enum.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_float.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_free.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_getcredres.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_hyper.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_int.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_int16_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_int32_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_int64_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_int8_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_key_netstarg.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_key_netstres.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_keybuf.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_keydat.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_keystatus.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_long.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_longlong_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_mapname.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_netnamestr.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_netobj.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_obj_p.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_opaque.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_opaque_auth.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_peername.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_pmap.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_pmaplist.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_pointer.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_quad_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_reference.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_replymsg.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_rmtcall_args.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_rmtcallres.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_short.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_sizeof.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_string.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_u_char.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_u_hyper.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_u_int.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_u_long.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_u_longlong_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_u_quad_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_u_short.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_uint16_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_uint32_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_uint64_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_uint8_t.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_union.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_unixcred.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_valdat.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_vector.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_void.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_wrapstring.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_yp_buf.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypall.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypbind_binding.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypbind_resp.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypbind_resptype.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypbind_setdom.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypdelete_args.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypmap_parms.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypmaplist.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_yppush_status.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_yppushresp_xfr.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypreq_key.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypreq_nokey.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypreq_xfr.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypresp_all.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypresp_key_val.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypresp_maplist.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypresp_master.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypresp_order.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypresp_val.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypresp_xfr.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypstat.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypupdate_args.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdr_ypxfrstat.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdrmem_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdrrec_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdrrec_endofrecord.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdrrec_eof.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdrrec_skiprecord.texi16
-rw-r--r--gnulib/doc/glibc-functions/xdrstdio_create.texi16
-rw-r--r--gnulib/doc/glibc-functions/xprt_register.texi16
-rw-r--r--gnulib/doc/glibc-functions/xprt_unregister.texi16
-rw-r--r--gnulib/doc/glibc-functions/y0f.texi16
-rw-r--r--gnulib/doc/glibc-functions/y0l.texi16
-rw-r--r--gnulib/doc/glibc-functions/y1f.texi16
-rw-r--r--gnulib/doc/glibc-functions/y1l.texi16
-rw-r--r--gnulib/doc/glibc-functions/ynf.texi16
-rw-r--r--gnulib/doc/glibc-functions/ynl.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_all.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_bind.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_first.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_get_default_domain.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_master.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_match.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_next.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_order.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_unbind.texi16
-rw-r--r--gnulib/doc/glibc-functions/yp_update.texi16
-rw-r--r--gnulib/doc/glibc-functions/ypbinderr_string.texi16
-rw-r--r--gnulib/doc/glibc-functions/yperr_string.texi16
-rw-r--r--gnulib/doc/glibc-functions/ypprot_err.texi16
-rw-r--r--gnulib/doc/glibc-headers/a.out.texi22
-rw-r--r--gnulib/doc/glibc-headers/aliases.texi26
-rw-r--r--gnulib/doc/glibc-headers/alloca.texi30
-rw-r--r--gnulib/doc/glibc-headers/ar.texi19
-rw-r--r--gnulib/doc/glibc-headers/argp.texi26
-rw-r--r--gnulib/doc/glibc-headers/argz.texi31
-rw-r--r--gnulib/doc/glibc-headers/byteswap.texi18
-rw-r--r--gnulib/doc/glibc-headers/crypt.texi44
-rw-r--r--gnulib/doc/glibc-headers/endian.texi19
-rw-r--r--gnulib/doc/glibc-headers/envz.texi28
-rw-r--r--gnulib/doc/glibc-headers/err.texi32
-rw-r--r--gnulib/doc/glibc-headers/error.texi32
-rw-r--r--gnulib/doc/glibc-headers/execinfo.texi31
-rw-r--r--gnulib/doc/glibc-headers/fpu_control.texi19
-rw-r--r--gnulib/doc/glibc-headers/fstab.texi36
-rw-r--r--gnulib/doc/glibc-headers/fts.texi25
-rw-r--r--gnulib/doc/glibc-headers/getopt.texi45
-rw-r--r--gnulib/doc/glibc-headers/ieee754.texi18
-rw-r--r--gnulib/doc/glibc-headers/ifaddrs.texi24
-rw-r--r--gnulib/doc/glibc-headers/libintl.texi43
-rw-r--r--gnulib/doc/glibc-headers/mcheck.texi30
-rw-r--r--gnulib/doc/glibc-headers/mntent.texi38
-rw-r--r--gnulib/doc/glibc-headers/obstack.texi26
-rw-r--r--gnulib/doc/glibc-headers/paths.texi19
-rw-r--r--gnulib/doc/glibc-headers/printf.texi32
-rw-r--r--gnulib/doc/glibc-headers/pty.texi35
-rw-r--r--gnulib/doc/glibc-headers/resolv.texi34
-rw-r--r--gnulib/doc/glibc-headers/shadow.texi39
-rw-r--r--gnulib/doc/glibc-headers/sys_ioctl.texi33
-rw-r--r--gnulib/doc/glibc-headers/sysexits.texi20
-rw-r--r--gnulib/doc/glibc-headers/ttyent.texi24
-rw-r--r--gnulib/doc/gnu-oids.texi50
-rw-r--r--gnulib/doc/gnulib-intro.texi337
-rw-r--r--gnulib/doc/gnulib-tool.texi623
-rw-r--r--gnulib/doc/gnulib.texi6388
-rw-r--r--gnulib/doc/gpl-2.0.texi389
-rw-r--r--gnulib/doc/gpl-3.0.texi717
-rw-r--r--gnulib/doc/havelib.texi207
-rw-r--r--gnulib/doc/inet_ntoa.texi22
-rw-r--r--gnulib/doc/install.texi433
-rw-r--r--gnulib/doc/ld-output-def.texi68
-rw-r--r--gnulib/doc/ld-version-script.texi77
-rw-r--r--gnulib/doc/lgpl-2.1.texi561
-rw-r--r--gnulib/doc/lgpl-3.0.texi190
-rw-r--r--gnulib/doc/lib-symbol-visibility.texi160
-rw-r--r--gnulib/doc/maintain.texi2079
-rw-r--r--gnulib/doc/make-stds.texi1156
-rw-r--r--gnulib/doc/manywarnings.texi48
-rw-r--r--gnulib/doc/pastposix-functions/bcmp.texi21
-rw-r--r--gnulib/doc/pastposix-functions/bcopy.texi21
-rw-r--r--gnulib/doc/pastposix-functions/bsd_signal.texi18
-rw-r--r--gnulib/doc/pastposix-functions/bzero.texi21
-rw-r--r--gnulib/doc/pastposix-functions/ecvt.texi21
-rw-r--r--gnulib/doc/pastposix-functions/fcvt.texi21
-rw-r--r--gnulib/doc/pastposix-functions/ftime.texi22
-rw-r--r--gnulib/doc/pastposix-functions/gcvt.texi21
-rw-r--r--gnulib/doc/pastposix-functions/getcontext.texi18
-rw-r--r--gnulib/doc/pastposix-functions/gethostbyaddr.texi18
-rw-r--r--gnulib/doc/pastposix-functions/gethostbyname.texi18
-rw-r--r--gnulib/doc/pastposix-functions/getwd.texi23
-rw-r--r--gnulib/doc/pastposix-functions/h_errno.texi18
-rw-r--r--gnulib/doc/pastposix-functions/index.texi21
-rw-r--r--gnulib/doc/pastposix-functions/makecontext.texi18
-rw-r--r--gnulib/doc/pastposix-functions/mktemp.texi19
-rw-r--r--gnulib/doc/pastposix-functions/pthread_attr_getstackaddr.texi18
-rw-r--r--gnulib/doc/pastposix-functions/pthread_attr_setstackaddr.texi18
-rw-r--r--gnulib/doc/pastposix-functions/rindex.texi21
-rw-r--r--gnulib/doc/pastposix-functions/scalb.texi15
-rw-r--r--gnulib/doc/pastposix-functions/setcontext.texi22
-rw-r--r--gnulib/doc/pastposix-functions/swapcontext.texi18
-rw-r--r--gnulib/doc/pastposix-functions/ualarm.texi18
-rw-r--r--gnulib/doc/pastposix-functions/usleep.texi28
-rw-r--r--gnulib/doc/pastposix-functions/vfork.texi18
-rw-r--r--gnulib/doc/pastposix-functions/wcswcs.texi24
-rw-r--r--gnulib/doc/posix-functions/FD_CLR.texi15
-rw-r--r--gnulib/doc/posix-functions/FD_ISSET.texi15
-rw-r--r--gnulib/doc/posix-functions/FD_SET.texi15
-rw-r--r--gnulib/doc/posix-functions/FD_ZERO.texi15
-rw-r--r--gnulib/doc/posix-functions/_Exit_C99.texi21
-rw-r--r--gnulib/doc/posix-functions/_exit.texi15
-rw-r--r--gnulib/doc/posix-functions/_longjmp.texi24
-rw-r--r--gnulib/doc/posix-functions/_setjmp.texi24
-rw-r--r--gnulib/doc/posix-functions/_tolower.texi18
-rw-r--r--gnulib/doc/posix-functions/_toupper.texi18
-rw-r--r--gnulib/doc/posix-functions/a64l.texi20
-rw-r--r--gnulib/doc/posix-functions/abort.texi24
-rw-r--r--gnulib/doc/posix-functions/abs.texi15
-rw-r--r--gnulib/doc/posix-functions/accept.texi31
-rw-r--r--gnulib/doc/posix-functions/access.texi23
-rw-r--r--gnulib/doc/posix-functions/acos.texi15
-rw-r--r--gnulib/doc/posix-functions/acosf.texi18
-rw-r--r--gnulib/doc/posix-functions/acosh.texi18
-rw-r--r--gnulib/doc/posix-functions/acoshf.texi18
-rw-r--r--gnulib/doc/posix-functions/acoshl.texi18
-rw-r--r--gnulib/doc/posix-functions/acosl.texi21
-rw-r--r--gnulib/doc/posix-functions/aio_cancel.texi18
-rw-r--r--gnulib/doc/posix-functions/aio_error.texi18
-rw-r--r--gnulib/doc/posix-functions/aio_fsync.texi18
-rw-r--r--gnulib/doc/posix-functions/aio_read.texi18
-rw-r--r--gnulib/doc/posix-functions/aio_return.texi18
-rw-r--r--gnulib/doc/posix-functions/aio_suspend.texi18
-rw-r--r--gnulib/doc/posix-functions/aio_write.texi18
-rw-r--r--gnulib/doc/posix-functions/alarm.texi18
-rw-r--r--gnulib/doc/posix-functions/alphasort.texi24
-rw-r--r--gnulib/doc/posix-functions/asctime.texi17
-rw-r--r--gnulib/doc/posix-functions/asctime_r.texi21
-rw-r--r--gnulib/doc/posix-functions/asin.texi15
-rw-r--r--gnulib/doc/posix-functions/asinf.texi18
-rw-r--r--gnulib/doc/posix-functions/asinh.texi18
-rw-r--r--gnulib/doc/posix-functions/asinhf.texi18
-rw-r--r--gnulib/doc/posix-functions/asinhl.texi18
-rw-r--r--gnulib/doc/posix-functions/asinl.texi21
-rw-r--r--gnulib/doc/posix-functions/assert.texi18
-rw-r--r--gnulib/doc/posix-functions/atan.texi15
-rw-r--r--gnulib/doc/posix-functions/atan2.texi15
-rw-r--r--gnulib/doc/posix-functions/atan2f.texi18
-rw-r--r--gnulib/doc/posix-functions/atan2l.texi18
-rw-r--r--gnulib/doc/posix-functions/atanf.texi18
-rw-r--r--gnulib/doc/posix-functions/atanh.texi18
-rw-r--r--gnulib/doc/posix-functions/atanhf.texi18
-rw-r--r--gnulib/doc/posix-functions/atanhl.texi18
-rw-r--r--gnulib/doc/posix-functions/atanl.texi21
-rw-r--r--gnulib/doc/posix-functions/atexit.texi17
-rw-r--r--gnulib/doc/posix-functions/atof.texi50
-rw-r--r--gnulib/doc/posix-functions/atoi.texi15
-rw-r--r--gnulib/doc/posix-functions/atol.texi15
-rw-r--r--gnulib/doc/posix-functions/atoll.texi18
-rw-r--r--gnulib/doc/posix-functions/basename.texi24
-rw-r--r--gnulib/doc/posix-functions/bind.texi19
-rw-r--r--gnulib/doc/posix-functions/bsearch.texi15
-rw-r--r--gnulib/doc/posix-functions/btowc.texi24
-rw-r--r--gnulib/doc/posix-functions/cabs.texi18
-rw-r--r--gnulib/doc/posix-functions/cabsf.texi18
-rw-r--r--gnulib/doc/posix-functions/cabsl.texi18
-rw-r--r--gnulib/doc/posix-functions/cacos.texi18
-rw-r--r--gnulib/doc/posix-functions/cacosf.texi18
-rw-r--r--gnulib/doc/posix-functions/cacosh.texi18
-rw-r--r--gnulib/doc/posix-functions/cacoshf.texi18
-rw-r--r--gnulib/doc/posix-functions/cacoshl.texi18
-rw-r--r--gnulib/doc/posix-functions/cacosl.texi18
-rw-r--r--gnulib/doc/posix-functions/calloc.texi22
-rw-r--r--gnulib/doc/posix-functions/carg.texi18
-rw-r--r--gnulib/doc/posix-functions/cargf.texi18
-rw-r--r--gnulib/doc/posix-functions/cargl.texi18
-rw-r--r--gnulib/doc/posix-functions/casin.texi18
-rw-r--r--gnulib/doc/posix-functions/casinf.texi18
-rw-r--r--gnulib/doc/posix-functions/casinh.texi18
-rw-r--r--gnulib/doc/posix-functions/casinhf.texi18
-rw-r--r--gnulib/doc/posix-functions/casinhl.texi18
-rw-r--r--gnulib/doc/posix-functions/casinl.texi18
-rw-r--r--gnulib/doc/posix-functions/catan.texi18
-rw-r--r--gnulib/doc/posix-functions/catanf.texi18
-rw-r--r--gnulib/doc/posix-functions/catanh.texi18
-rw-r--r--gnulib/doc/posix-functions/catanhf.texi18
-rw-r--r--gnulib/doc/posix-functions/catanhl.texi18
-rw-r--r--gnulib/doc/posix-functions/catanl.texi18
-rw-r--r--gnulib/doc/posix-functions/catclose.texi18
-rw-r--r--gnulib/doc/posix-functions/catgets.texi18
-rw-r--r--gnulib/doc/posix-functions/catopen.texi18
-rw-r--r--gnulib/doc/posix-functions/cbrt.texi15
-rw-r--r--gnulib/doc/posix-functions/cbrtf.texi18
-rw-r--r--gnulib/doc/posix-functions/cbrtl.texi18
-rw-r--r--gnulib/doc/posix-functions/ccos.texi18
-rw-r--r--gnulib/doc/posix-functions/ccosf.texi18
-rw-r--r--gnulib/doc/posix-functions/ccosh.texi18
-rw-r--r--gnulib/doc/posix-functions/ccoshf.texi18
-rw-r--r--gnulib/doc/posix-functions/ccoshl.texi18
-rw-r--r--gnulib/doc/posix-functions/ccosl.texi18
-rw-r--r--gnulib/doc/posix-functions/ceil.texi15
-rw-r--r--gnulib/doc/posix-functions/ceilf.texi18
-rw-r--r--gnulib/doc/posix-functions/ceill.texi18
-rw-r--r--gnulib/doc/posix-functions/cexp.texi18
-rw-r--r--gnulib/doc/posix-functions/cexpf.texi18
-rw-r--r--gnulib/doc/posix-functions/cexpl.texi18
-rw-r--r--gnulib/doc/posix-functions/cfgetispeed.texi18
-rw-r--r--gnulib/doc/posix-functions/cfgetospeed.texi18
-rw-r--r--gnulib/doc/posix-functions/cfsetispeed.texi18
-rw-r--r--gnulib/doc/posix-functions/cfsetospeed.texi18
-rw-r--r--gnulib/doc/posix-functions/chdir.texi15
-rw-r--r--gnulib/doc/posix-functions/chmod.texi15
-rw-r--r--gnulib/doc/posix-functions/chown.texi34
-rw-r--r--gnulib/doc/posix-functions/cimag.texi18
-rw-r--r--gnulib/doc/posix-functions/cimagf.texi18
-rw-r--r--gnulib/doc/posix-functions/cimagl.texi18
-rw-r--r--gnulib/doc/posix-functions/clearerr.texi15
-rw-r--r--gnulib/doc/posix-functions/clock.texi15
-rw-r--r--gnulib/doc/posix-functions/clock_getcpuclockid.texi18
-rw-r--r--gnulib/doc/posix-functions/clock_getres.texi18
-rw-r--r--gnulib/doc/posix-functions/clock_gettime.texi18
-rw-r--r--gnulib/doc/posix-functions/clock_nanosleep.texi18
-rw-r--r--gnulib/doc/posix-functions/clock_settime.texi18
-rw-r--r--gnulib/doc/posix-functions/clog.texi18
-rw-r--r--gnulib/doc/posix-functions/clogf.texi18
-rw-r--r--gnulib/doc/posix-functions/clogl.texi18
-rw-r--r--gnulib/doc/posix-functions/close.texi23
-rw-r--r--gnulib/doc/posix-functions/closedir.texi15
-rw-r--r--gnulib/doc/posix-functions/closelog.texi18
-rw-r--r--gnulib/doc/posix-functions/confstr.texi18
-rw-r--r--gnulib/doc/posix-functions/conj.texi18
-rw-r--r--gnulib/doc/posix-functions/conjf.texi18
-rw-r--r--gnulib/doc/posix-functions/conjl.texi18
-rw-r--r--gnulib/doc/posix-functions/connect.texi19
-rw-r--r--gnulib/doc/posix-functions/copysign.texi15
-rw-r--r--gnulib/doc/posix-functions/copysignf.texi18
-rw-r--r--gnulib/doc/posix-functions/copysignl.texi18
-rw-r--r--gnulib/doc/posix-functions/cos.texi15
-rw-r--r--gnulib/doc/posix-functions/cosf.texi18
-rw-r--r--gnulib/doc/posix-functions/cosh.texi15
-rw-r--r--gnulib/doc/posix-functions/coshf.texi18
-rw-r--r--gnulib/doc/posix-functions/coshl.texi18
-rw-r--r--gnulib/doc/posix-functions/cosl.texi21
-rw-r--r--gnulib/doc/posix-functions/cpow.texi18
-rw-r--r--gnulib/doc/posix-functions/cpowf.texi18
-rw-r--r--gnulib/doc/posix-functions/cpowl.texi18
-rw-r--r--gnulib/doc/posix-functions/cproj.texi20
-rw-r--r--gnulib/doc/posix-functions/cprojf.texi20
-rw-r--r--gnulib/doc/posix-functions/cprojl.texi20
-rw-r--r--gnulib/doc/posix-functions/creal.texi18
-rw-r--r--gnulib/doc/posix-functions/crealf.texi18
-rw-r--r--gnulib/doc/posix-functions/creall.texi18
-rw-r--r--gnulib/doc/posix-functions/creat.texi23
-rw-r--r--gnulib/doc/posix-functions/crypt.texi18
-rw-r--r--gnulib/doc/posix-functions/csin.texi18
-rw-r--r--gnulib/doc/posix-functions/csinf.texi18
-rw-r--r--gnulib/doc/posix-functions/csinh.texi18
-rw-r--r--gnulib/doc/posix-functions/csinhf.texi18
-rw-r--r--gnulib/doc/posix-functions/csinhl.texi18
-rw-r--r--gnulib/doc/posix-functions/csinl.texi18
-rw-r--r--gnulib/doc/posix-functions/csqrt.texi18
-rw-r--r--gnulib/doc/posix-functions/csqrtf.texi18
-rw-r--r--gnulib/doc/posix-functions/csqrtl.texi18
-rw-r--r--gnulib/doc/posix-functions/ctan.texi18
-rw-r--r--gnulib/doc/posix-functions/ctanf.texi18
-rw-r--r--gnulib/doc/posix-functions/ctanh.texi18
-rw-r--r--gnulib/doc/posix-functions/ctanhf.texi18
-rw-r--r--gnulib/doc/posix-functions/ctanhl.texi18
-rw-r--r--gnulib/doc/posix-functions/ctanl.texi18
-rw-r--r--gnulib/doc/posix-functions/ctermid.texi18
-rw-r--r--gnulib/doc/posix-functions/ctime.texi27
-rw-r--r--gnulib/doc/posix-functions/ctime_r.texi34
-rw-r--r--gnulib/doc/posix-functions/daylight.texi21
-rw-r--r--gnulib/doc/posix-functions/dbm_clearerr.texi18
-rw-r--r--gnulib/doc/posix-functions/dbm_close.texi18
-rw-r--r--gnulib/doc/posix-functions/dbm_delete.texi18
-rw-r--r--gnulib/doc/posix-functions/dbm_error.texi18
-rw-r--r--gnulib/doc/posix-functions/dbm_fetch.texi18
-rw-r--r--gnulib/doc/posix-functions/dbm_firstkey.texi18
-rw-r--r--gnulib/doc/posix-functions/dbm_nextkey.texi18
-rw-r--r--gnulib/doc/posix-functions/dbm_open.texi18
-rw-r--r--gnulib/doc/posix-functions/dbm_store.texi18
-rw-r--r--gnulib/doc/posix-functions/difftime.texi15
-rw-r--r--gnulib/doc/posix-functions/dirfd.texi25
-rw-r--r--gnulib/doc/posix-functions/dirname.texi24
-rw-r--r--gnulib/doc/posix-functions/div.texi15
-rw-r--r--gnulib/doc/posix-functions/dlclose.texi18
-rw-r--r--gnulib/doc/posix-functions/dlerror.texi18
-rw-r--r--gnulib/doc/posix-functions/dlopen.texi21
-rw-r--r--gnulib/doc/posix-functions/dlsym.texi21
-rw-r--r--gnulib/doc/posix-functions/dprintf.texi27
-rw-r--r--gnulib/doc/posix-functions/drand48.texi18
-rw-r--r--gnulib/doc/posix-functions/dup.texi15
-rw-r--r--gnulib/doc/posix-functions/dup2.texi39
-rw-r--r--gnulib/doc/posix-functions/duplocale.texi21
-rw-r--r--gnulib/doc/posix-functions/encrypt.texi18
-rw-r--r--gnulib/doc/posix-functions/endgrent.texi18
-rw-r--r--gnulib/doc/posix-functions/endhostent.texi18
-rw-r--r--gnulib/doc/posix-functions/endnetent.texi18
-rw-r--r--gnulib/doc/posix-functions/endprotoent.texi18
-rw-r--r--gnulib/doc/posix-functions/endpwent.texi18
-rw-r--r--gnulib/doc/posix-functions/endservent.texi18
-rw-r--r--gnulib/doc/posix-functions/endutxent.texi18
-rw-r--r--gnulib/doc/posix-functions/environ.texi34
-rw-r--r--gnulib/doc/posix-functions/erand48.texi18
-rw-r--r--gnulib/doc/posix-functions/erf.texi15
-rw-r--r--gnulib/doc/posix-functions/erfc.texi15
-rw-r--r--gnulib/doc/posix-functions/erfcf.texi18
-rw-r--r--gnulib/doc/posix-functions/erfcl.texi18
-rw-r--r--gnulib/doc/posix-functions/erff.texi18
-rw-r--r--gnulib/doc/posix-functions/erfl.texi18
-rw-r--r--gnulib/doc/posix-functions/errno.texi18
-rw-r--r--gnulib/doc/posix-functions/execl.texi18
-rw-r--r--gnulib/doc/posix-functions/execle.texi18
-rw-r--r--gnulib/doc/posix-functions/execlp.texi18
-rw-r--r--gnulib/doc/posix-functions/execv.texi18
-rw-r--r--gnulib/doc/posix-functions/execve.texi18
-rw-r--r--gnulib/doc/posix-functions/execvp.texi18
-rw-r--r--gnulib/doc/posix-functions/exit.texi18
-rw-r--r--gnulib/doc/posix-functions/exp.texi15
-rw-r--r--gnulib/doc/posix-functions/exp2.texi18
-rw-r--r--gnulib/doc/posix-functions/exp2f.texi18
-rw-r--r--gnulib/doc/posix-functions/exp2l.texi18
-rw-r--r--gnulib/doc/posix-functions/expf.texi18
-rw-r--r--gnulib/doc/posix-functions/expl.texi21
-rw-r--r--gnulib/doc/posix-functions/expm1.texi18
-rw-r--r--gnulib/doc/posix-functions/expm1f.texi18
-rw-r--r--gnulib/doc/posix-functions/expm1l.texi18
-rw-r--r--gnulib/doc/posix-functions/fabs.texi15
-rw-r--r--gnulib/doc/posix-functions/fabsf.texi18
-rw-r--r--gnulib/doc/posix-functions/fabsl.texi18
-rw-r--r--gnulib/doc/posix-functions/faccessat.texi26
-rw-r--r--gnulib/doc/posix-functions/fattach.texi18
-rw-r--r--gnulib/doc/posix-functions/fchdir.texi19
-rw-r--r--gnulib/doc/posix-functions/fchmod.texi18
-rw-r--r--gnulib/doc/posix-functions/fchmodat.texi27
-rw-r--r--gnulib/doc/posix-functions/fchown.texi18
-rw-r--r--gnulib/doc/posix-functions/fchownat.texi31
-rw-r--r--gnulib/doc/posix-functions/fclose.texi22
-rw-r--r--gnulib/doc/posix-functions/fcntl.texi36
-rw-r--r--gnulib/doc/posix-functions/fdatasync.texi18
-rw-r--r--gnulib/doc/posix-functions/fdetach.texi18
-rw-r--r--gnulib/doc/posix-functions/fdim.texi18
-rw-r--r--gnulib/doc/posix-functions/fdimf.texi18
-rw-r--r--gnulib/doc/posix-functions/fdiml.texi18
-rw-r--r--gnulib/doc/posix-functions/fdopen.texi18
-rw-r--r--gnulib/doc/posix-functions/fdopendir.texi27
-rw-r--r--gnulib/doc/posix-functions/feclearexcept.texi18
-rw-r--r--gnulib/doc/posix-functions/fegetenv.texi18
-rw-r--r--gnulib/doc/posix-functions/fegetexceptflag.texi18
-rw-r--r--gnulib/doc/posix-functions/fegetround.texi18
-rw-r--r--gnulib/doc/posix-functions/feholdexcept.texi18
-rw-r--r--gnulib/doc/posix-functions/feof.texi15
-rw-r--r--gnulib/doc/posix-functions/feraiseexcept.texi18
-rw-r--r--gnulib/doc/posix-functions/ferror.texi15
-rw-r--r--gnulib/doc/posix-functions/fesetenv.texi18
-rw-r--r--gnulib/doc/posix-functions/fesetexceptflag.texi18
-rw-r--r--gnulib/doc/posix-functions/fesetround.texi18
-rw-r--r--gnulib/doc/posix-functions/fetestexcept.texi18
-rw-r--r--gnulib/doc/posix-functions/feupdateenv.texi18
-rw-r--r--gnulib/doc/posix-functions/fexecve.texi19
-rw-r--r--gnulib/doc/posix-functions/fflush.texi37
-rw-r--r--gnulib/doc/posix-functions/ffs.texi18
-rw-r--r--gnulib/doc/posix-functions/fgetc.texi18
-rw-r--r--gnulib/doc/posix-functions/fgetpos.texi23
-rw-r--r--gnulib/doc/posix-functions/fgets.texi18
-rw-r--r--gnulib/doc/posix-functions/fgetwc.texi21
-rw-r--r--gnulib/doc/posix-functions/fgetws.texi21
-rw-r--r--gnulib/doc/posix-functions/fileno.texi15
-rw-r--r--gnulib/doc/posix-functions/flockfile.texi18
-rw-r--r--gnulib/doc/posix-functions/floor.texi15
-rw-r--r--gnulib/doc/posix-functions/floorf.texi18
-rw-r--r--gnulib/doc/posix-functions/floorl.texi18
-rw-r--r--gnulib/doc/posix-functions/fma.texi18
-rw-r--r--gnulib/doc/posix-functions/fmaf.texi18
-rw-r--r--gnulib/doc/posix-functions/fmal.texi18
-rw-r--r--gnulib/doc/posix-functions/fmax.texi18
-rw-r--r--gnulib/doc/posix-functions/fmaxf.texi18
-rw-r--r--gnulib/doc/posix-functions/fmaxl.texi18
-rw-r--r--gnulib/doc/posix-functions/fmemopen.texi19
-rw-r--r--gnulib/doc/posix-functions/fmin.texi18
-rw-r--r--gnulib/doc/posix-functions/fminf.texi18
-rw-r--r--gnulib/doc/posix-functions/fminl.texi18
-rw-r--r--gnulib/doc/posix-functions/fmod.texi15
-rw-r--r--gnulib/doc/posix-functions/fmodf.texi18
-rw-r--r--gnulib/doc/posix-functions/fmodl.texi18
-rw-r--r--gnulib/doc/posix-functions/fmtmsg.texi18
-rw-r--r--gnulib/doc/posix-functions/fnmatch.texi20
-rw-r--r--gnulib/doc/posix-functions/fopen.texi36
-rw-r--r--gnulib/doc/posix-functions/fork.texi27
-rw-r--r--gnulib/doc/posix-functions/fpathconf.texi18
-rw-r--r--gnulib/doc/posix-functions/fpclassify.texi18
-rw-r--r--gnulib/doc/posix-functions/fprintf.texi72
-rw-r--r--gnulib/doc/posix-functions/fputc.texi22
-rw-r--r--gnulib/doc/posix-functions/fputs.texi22
-rw-r--r--gnulib/doc/posix-functions/fputwc.texi21
-rw-r--r--gnulib/doc/posix-functions/fputws.texi21
-rw-r--r--gnulib/doc/posix-functions/fread.texi18
-rw-r--r--gnulib/doc/posix-functions/free.texi20
-rw-r--r--gnulib/doc/posix-functions/freeaddrinfo.texi18
-rw-r--r--gnulib/doc/posix-functions/freelocale.texi18
-rw-r--r--gnulib/doc/posix-functions/freopen.texi31
-rw-r--r--gnulib/doc/posix-functions/frexp.texi24
-rw-r--r--gnulib/doc/posix-functions/frexpf.texi18
-rw-r--r--gnulib/doc/posix-functions/frexpl.texi27
-rw-r--r--gnulib/doc/posix-functions/fscanf.texi21
-rw-r--r--gnulib/doc/posix-functions/fseek.texi24
-rw-r--r--gnulib/doc/posix-functions/fseeko.texi31
-rw-r--r--gnulib/doc/posix-functions/fsetpos.texi15
-rw-r--r--gnulib/doc/posix-functions/fstat.texi23
-rw-r--r--gnulib/doc/posix-functions/fstatat.texi38
-rw-r--r--gnulib/doc/posix-functions/fstatvfs.texi18
-rw-r--r--gnulib/doc/posix-functions/fsync.texi18
-rw-r--r--gnulib/doc/posix-functions/ftell.texi29
-rw-r--r--gnulib/doc/posix-functions/ftello.texi39
-rw-r--r--gnulib/doc/posix-functions/ftok.texi18
-rw-r--r--gnulib/doc/posix-functions/ftruncate.texi18
-rw-r--r--gnulib/doc/posix-functions/ftrylockfile.texi18
-rw-r--r--gnulib/doc/posix-functions/ftw.texi18
-rw-r--r--gnulib/doc/posix-functions/funlockfile.texi18
-rw-r--r--gnulib/doc/posix-functions/futimens.texi44
-rw-r--r--gnulib/doc/posix-functions/fwide.texi24
-rw-r--r--gnulib/doc/posix-functions/fwprintf.texi21
-rw-r--r--gnulib/doc/posix-functions/fwrite.texi22
-rw-r--r--gnulib/doc/posix-functions/fwscanf.texi21
-rw-r--r--gnulib/doc/posix-functions/gai_strerror.texi18
-rw-r--r--gnulib/doc/posix-functions/getaddrinfo.texi21
-rw-r--r--gnulib/doc/posix-functions/getc.texi18
-rw-r--r--gnulib/doc/posix-functions/getc_unlocked.texi18
-rw-r--r--gnulib/doc/posix-functions/getchar.texi18
-rw-r--r--gnulib/doc/posix-functions/getchar_unlocked.texi18
-rw-r--r--gnulib/doc/posix-functions/getcwd.texi23
-rw-r--r--gnulib/doc/posix-functions/getdate.texi21
-rw-r--r--gnulib/doc/posix-functions/getdate_err.texi18
-rw-r--r--gnulib/doc/posix-functions/getdelim.texi25
-rw-r--r--gnulib/doc/posix-functions/getegid.texi18
-rw-r--r--gnulib/doc/posix-functions/getenv.texi15
-rw-r--r--gnulib/doc/posix-functions/geteuid.texi18
-rw-r--r--gnulib/doc/posix-functions/getgid.texi18
-rw-r--r--gnulib/doc/posix-functions/getgrent.texi18
-rw-r--r--gnulib/doc/posix-functions/getgrgid.texi18
-rw-r--r--gnulib/doc/posix-functions/getgrgid_r.texi18
-rw-r--r--gnulib/doc/posix-functions/getgrnam.texi18
-rw-r--r--gnulib/doc/posix-functions/getgrnam_r.texi18
-rw-r--r--gnulib/doc/posix-functions/getgroups.texi34
-rw-r--r--gnulib/doc/posix-functions/gethostent.texi18
-rw-r--r--gnulib/doc/posix-functions/gethostid.texi18
-rw-r--r--gnulib/doc/posix-functions/gethostname.texi21
-rw-r--r--gnulib/doc/posix-functions/getitimer.texi18
-rw-r--r--gnulib/doc/posix-functions/getline.texi28
-rw-r--r--gnulib/doc/posix-functions/getlogin.texi18
-rw-r--r--gnulib/doc/posix-functions/getlogin_r.texi18
-rw-r--r--gnulib/doc/posix-functions/getmsg.texi18
-rw-r--r--gnulib/doc/posix-functions/getnameinfo.texi18
-rw-r--r--gnulib/doc/posix-functions/getnetbyaddr.texi18
-rw-r--r--gnulib/doc/posix-functions/getnetbyname.texi18
-rw-r--r--gnulib/doc/posix-functions/getnetent.texi18
-rw-r--r--gnulib/doc/posix-functions/getopt.texi63
-rw-r--r--gnulib/doc/posix-functions/getpeername.texi22
-rw-r--r--gnulib/doc/posix-functions/getpgid.texi18
-rw-r--r--gnulib/doc/posix-functions/getpgrp.texi18
-rw-r--r--gnulib/doc/posix-functions/getpid.texi15
-rw-r--r--gnulib/doc/posix-functions/getpmsg.texi18
-rw-r--r--gnulib/doc/posix-functions/getppid.texi18
-rw-r--r--gnulib/doc/posix-functions/getpriority.texi18
-rw-r--r--gnulib/doc/posix-functions/getprotobyname.texi18
-rw-r--r--gnulib/doc/posix-functions/getprotobynumber.texi18
-rw-r--r--gnulib/doc/posix-functions/getprotoent.texi18
-rw-r--r--gnulib/doc/posix-functions/getpwent.texi18
-rw-r--r--gnulib/doc/posix-functions/getpwnam.texi18
-rw-r--r--gnulib/doc/posix-functions/getpwnam_r.texi18
-rw-r--r--gnulib/doc/posix-functions/getpwuid.texi18
-rw-r--r--gnulib/doc/posix-functions/getpwuid_r.texi18
-rw-r--r--gnulib/doc/posix-functions/getrlimit.texi18
-rw-r--r--gnulib/doc/posix-functions/getrusage.texi21
-rw-r--r--gnulib/doc/posix-functions/gets.texi20
-rw-r--r--gnulib/doc/posix-functions/getservbyname.texi18
-rw-r--r--gnulib/doc/posix-functions/getservbyport.texi18
-rw-r--r--gnulib/doc/posix-functions/getservent.texi18
-rw-r--r--gnulib/doc/posix-functions/getsid.texi18
-rw-r--r--gnulib/doc/posix-functions/getsockname.texi22
-rw-r--r--gnulib/doc/posix-functions/getsockopt.texi30
-rw-r--r--gnulib/doc/posix-functions/getsubopt.texi22
-rw-r--r--gnulib/doc/posix-functions/gettimeofday.texi37
-rw-r--r--gnulib/doc/posix-functions/getuid.texi18
-rw-r--r--gnulib/doc/posix-functions/getutxent.texi18
-rw-r--r--gnulib/doc/posix-functions/getutxid.texi18
-rw-r--r--gnulib/doc/posix-functions/getutxline.texi18
-rw-r--r--gnulib/doc/posix-functions/getwc.texi21
-rw-r--r--gnulib/doc/posix-functions/getwchar.texi21
-rw-r--r--gnulib/doc/posix-functions/glob.texi23
-rw-r--r--gnulib/doc/posix-functions/globfree.texi18
-rw-r--r--gnulib/doc/posix-functions/gmtime.texi15
-rw-r--r--gnulib/doc/posix-functions/gmtime_r.texi21
-rw-r--r--gnulib/doc/posix-functions/google-ranking.txt1114
-rw-r--r--gnulib/doc/posix-functions/grantpt.texi18
-rw-r--r--gnulib/doc/posix-functions/hcreate.texi18
-rw-r--r--gnulib/doc/posix-functions/hdestroy.texi18
-rw-r--r--gnulib/doc/posix-functions/hsearch.texi18
-rw-r--r--gnulib/doc/posix-functions/htonl.texi18
-rw-r--r--gnulib/doc/posix-functions/htons.texi18
-rw-r--r--gnulib/doc/posix-functions/hypot.texi15
-rw-r--r--gnulib/doc/posix-functions/hypotf.texi18
-rw-r--r--gnulib/doc/posix-functions/hypotl.texi18
-rw-r--r--gnulib/doc/posix-functions/iconv.texi34
-rw-r--r--gnulib/doc/posix-functions/iconv_close.texi21
-rw-r--r--gnulib/doc/posix-functions/iconv_open.texi48
-rw-r--r--gnulib/doc/posix-functions/if_freenameindex.texi18
-rw-r--r--gnulib/doc/posix-functions/if_indextoname.texi18
-rw-r--r--gnulib/doc/posix-functions/if_nameindex.texi18
-rw-r--r--gnulib/doc/posix-functions/if_nametoindex.texi18
-rw-r--r--gnulib/doc/posix-functions/ilogb.texi18
-rw-r--r--gnulib/doc/posix-functions/ilogbf.texi18
-rw-r--r--gnulib/doc/posix-functions/ilogbl.texi18
-rw-r--r--gnulib/doc/posix-functions/imaxabs.texi18
-rw-r--r--gnulib/doc/posix-functions/imaxdiv.texi18
-rw-r--r--gnulib/doc/posix-functions/inet_addr.texi21
-rw-r--r--gnulib/doc/posix-functions/inet_ntoa.texi28
-rw-r--r--gnulib/doc/posix-functions/inet_ntop.texi18
-rw-r--r--gnulib/doc/posix-functions/inet_pton.texi18
-rw-r--r--gnulib/doc/posix-functions/initstate.texi18
-rw-r--r--gnulib/doc/posix-functions/insque.texi18
-rw-r--r--gnulib/doc/posix-functions/ioctl.texi21
-rw-r--r--gnulib/doc/posix-functions/isalnum.texi40
-rw-r--r--gnulib/doc/posix-functions/isalnum_l.texi18
-rw-r--r--gnulib/doc/posix-functions/isalpha.texi40
-rw-r--r--gnulib/doc/posix-functions/isalpha_l.texi18
-rw-r--r--gnulib/doc/posix-functions/isascii.texi30
-rw-r--r--gnulib/doc/posix-functions/isastream.texi18
-rw-r--r--gnulib/doc/posix-functions/isatty.texi18
-rw-r--r--gnulib/doc/posix-functions/isblank.texi43
-rw-r--r--gnulib/doc/posix-functions/isblank_l.texi18
-rw-r--r--gnulib/doc/posix-functions/iscntrl.texi40
-rw-r--r--gnulib/doc/posix-functions/iscntrl_l.texi18
-rw-r--r--gnulib/doc/posix-functions/isdigit.texi40
-rw-r--r--gnulib/doc/posix-functions/isdigit_l.texi18
-rw-r--r--gnulib/doc/posix-functions/isfinite.texi31
-rw-r--r--gnulib/doc/posix-functions/isgraph.texi40
-rw-r--r--gnulib/doc/posix-functions/isgraph_l.texi18
-rw-r--r--gnulib/doc/posix-functions/isgreater.texi18
-rw-r--r--gnulib/doc/posix-functions/isgreaterequal.texi18
-rw-r--r--gnulib/doc/posix-functions/isinf.texi18
-rw-r--r--gnulib/doc/posix-functions/isless.texi18
-rw-r--r--gnulib/doc/posix-functions/islessequal.texi18
-rw-r--r--gnulib/doc/posix-functions/islessgreater.texi18
-rw-r--r--gnulib/doc/posix-functions/islower.texi40
-rw-r--r--gnulib/doc/posix-functions/islower_l.texi18
-rw-r--r--gnulib/doc/posix-functions/isnan.texi29
-rw-r--r--gnulib/doc/posix-functions/isnormal.texi18
-rw-r--r--gnulib/doc/posix-functions/isprint.texi40
-rw-r--r--gnulib/doc/posix-functions/isprint_l.texi18
-rw-r--r--gnulib/doc/posix-functions/ispunct.texi40
-rw-r--r--gnulib/doc/posix-functions/ispunct_l.texi18
-rw-r--r--gnulib/doc/posix-functions/isspace.texi40
-rw-r--r--gnulib/doc/posix-functions/isspace_l.texi18
-rw-r--r--gnulib/doc/posix-functions/isunordered.texi18
-rw-r--r--gnulib/doc/posix-functions/isupper.texi40
-rw-r--r--gnulib/doc/posix-functions/isupper_l.texi18
-rw-r--r--gnulib/doc/posix-functions/iswalnum.texi24
-rw-r--r--gnulib/doc/posix-functions/iswalnum_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswalpha.texi24
-rw-r--r--gnulib/doc/posix-functions/iswalpha_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswblank.texi24
-rw-r--r--gnulib/doc/posix-functions/iswblank_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswcntrl.texi24
-rw-r--r--gnulib/doc/posix-functions/iswcntrl_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswctype.texi21
-rw-r--r--gnulib/doc/posix-functions/iswctype_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswdigit.texi24
-rw-r--r--gnulib/doc/posix-functions/iswdigit_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswgraph.texi24
-rw-r--r--gnulib/doc/posix-functions/iswgraph_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswlower.texi24
-rw-r--r--gnulib/doc/posix-functions/iswlower_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswprint.texi24
-rw-r--r--gnulib/doc/posix-functions/iswprint_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswpunct.texi24
-rw-r--r--gnulib/doc/posix-functions/iswpunct_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswspace.texi24
-rw-r--r--gnulib/doc/posix-functions/iswspace_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswupper.texi24
-rw-r--r--gnulib/doc/posix-functions/iswupper_l.texi21
-rw-r--r--gnulib/doc/posix-functions/iswxdigit.texi24
-rw-r--r--gnulib/doc/posix-functions/iswxdigit_l.texi21
-rw-r--r--gnulib/doc/posix-functions/isxdigit.texi40
-rw-r--r--gnulib/doc/posix-functions/isxdigit_l.texi18
-rw-r--r--gnulib/doc/posix-functions/j0.texi15
-rw-r--r--gnulib/doc/posix-functions/j1.texi15
-rw-r--r--gnulib/doc/posix-functions/jn.texi15
-rw-r--r--gnulib/doc/posix-functions/jrand48.texi18
-rw-r--r--gnulib/doc/posix-functions/kill.texi18
-rw-r--r--gnulib/doc/posix-functions/killpg.texi18
-rw-r--r--gnulib/doc/posix-functions/l64a.texi20
-rw-r--r--gnulib/doc/posix-functions/labs.texi15
-rw-r--r--gnulib/doc/posix-functions/lchown.texi29
-rw-r--r--gnulib/doc/posix-functions/lcong48.texi18
-rw-r--r--gnulib/doc/posix-functions/ldexp.texi15
-rw-r--r--gnulib/doc/posix-functions/ldexpf.texi18
-rw-r--r--gnulib/doc/posix-functions/ldexpl.texi24
-rw-r--r--gnulib/doc/posix-functions/ldiv.texi15
-rw-r--r--gnulib/doc/posix-functions/lfind.texi18
-rw-r--r--gnulib/doc/posix-functions/lgamma.texi15
-rw-r--r--gnulib/doc/posix-functions/lgammaf.texi18
-rw-r--r--gnulib/doc/posix-functions/lgammal.texi18
-rw-r--r--gnulib/doc/posix-functions/link.texi26
-rw-r--r--gnulib/doc/posix-functions/linkat.texi20
-rw-r--r--gnulib/doc/posix-functions/lio_listio.texi18
-rw-r--r--gnulib/doc/posix-functions/listen.texi19
-rw-r--r--gnulib/doc/posix-functions/llabs.texi18
-rw-r--r--gnulib/doc/posix-functions/lldiv.texi18
-rw-r--r--gnulib/doc/posix-functions/llrint.texi19
-rw-r--r--gnulib/doc/posix-functions/llrintf.texi19
-rw-r--r--gnulib/doc/posix-functions/llrintl.texi19
-rw-r--r--gnulib/doc/posix-functions/llround.texi18
-rw-r--r--gnulib/doc/posix-functions/llroundf.texi18
-rw-r--r--gnulib/doc/posix-functions/llroundl.texi18
-rw-r--r--gnulib/doc/posix-functions/localeconv.texi15
-rw-r--r--gnulib/doc/posix-functions/localtime.texi15
-rw-r--r--gnulib/doc/posix-functions/localtime_r.texi21
-rw-r--r--gnulib/doc/posix-functions/lockf.texi18
-rw-r--r--gnulib/doc/posix-functions/log.texi15
-rw-r--r--gnulib/doc/posix-functions/log10.texi15
-rw-r--r--gnulib/doc/posix-functions/log10f.texi18
-rw-r--r--gnulib/doc/posix-functions/log10l.texi18
-rw-r--r--gnulib/doc/posix-functions/log1p.texi15
-rw-r--r--gnulib/doc/posix-functions/log1pf.texi18
-rw-r--r--gnulib/doc/posix-functions/log1pl.texi18
-rw-r--r--gnulib/doc/posix-functions/log2.texi22
-rw-r--r--gnulib/doc/posix-functions/log2f.texi22
-rw-r--r--gnulib/doc/posix-functions/log2l.texi18
-rw-r--r--gnulib/doc/posix-functions/logb.texi15
-rw-r--r--gnulib/doc/posix-functions/logbf.texi18
-rw-r--r--gnulib/doc/posix-functions/logbl.texi18
-rw-r--r--gnulib/doc/posix-functions/logf.texi18
-rw-r--r--gnulib/doc/posix-functions/logl.texi21
-rw-r--r--gnulib/doc/posix-functions/longjmp.texi24
-rw-r--r--gnulib/doc/posix-functions/lrand48.texi18
-rw-r--r--gnulib/doc/posix-functions/lrint.texi18
-rw-r--r--gnulib/doc/posix-functions/lrintf.texi18
-rw-r--r--gnulib/doc/posix-functions/lrintl.texi19
-rw-r--r--gnulib/doc/posix-functions/lround.texi18
-rw-r--r--gnulib/doc/posix-functions/lroundf.texi18
-rw-r--r--gnulib/doc/posix-functions/lroundl.texi18
-rw-r--r--gnulib/doc/posix-functions/lsearch.texi18
-rw-r--r--gnulib/doc/posix-functions/lseek.texi35
-rw-r--r--gnulib/doc/posix-functions/lstat.texi42
-rw-r--r--gnulib/doc/posix-functions/malloc.texi25
-rw-r--r--gnulib/doc/posix-functions/mblen.texi15
-rw-r--r--gnulib/doc/posix-functions/mbrlen.texi30
-rw-r--r--gnulib/doc/posix-functions/mbrtowc.texi41
-rw-r--r--gnulib/doc/posix-functions/mbsinit.texi18
-rw-r--r--gnulib/doc/posix-functions/mbsnrtowcs.texi28
-rw-r--r--gnulib/doc/posix-functions/mbsrtowcs.texi31
-rw-r--r--gnulib/doc/posix-functions/mbstowcs.texi18
-rw-r--r--gnulib/doc/posix-functions/mbtowc.texi21
-rw-r--r--gnulib/doc/posix-functions/memccpy.texi18
-rw-r--r--gnulib/doc/posix-functions/memchr.texi21
-rw-r--r--gnulib/doc/posix-functions/memcmp.texi24
-rw-r--r--gnulib/doc/posix-functions/memcpy.texi17
-rw-r--r--gnulib/doc/posix-functions/memmove.texi17
-rw-r--r--gnulib/doc/posix-functions/memset.texi17
-rw-r--r--gnulib/doc/posix-functions/mkdir.texi32
-rw-r--r--gnulib/doc/posix-functions/mkdirat.texi20
-rw-r--r--gnulib/doc/posix-functions/mkdtemp.texi18
-rw-r--r--gnulib/doc/posix-functions/mkfifo.texi22
-rw-r--r--gnulib/doc/posix-functions/mkfifoat.texi25
-rw-r--r--gnulib/doc/posix-functions/mknod.texi29
-rw-r--r--gnulib/doc/posix-functions/mknodat.texi25
-rw-r--r--gnulib/doc/posix-functions/mkstemp.texi26
-rw-r--r--gnulib/doc/posix-functions/mktime.texi19
-rw-r--r--gnulib/doc/posix-functions/mlock.texi18
-rw-r--r--gnulib/doc/posix-functions/mlockall.texi18
-rw-r--r--gnulib/doc/posix-functions/mmap.texi29
-rw-r--r--gnulib/doc/posix-functions/modf.texi15
-rw-r--r--gnulib/doc/posix-functions/modff.texi18
-rw-r--r--gnulib/doc/posix-functions/modfl.texi18
-rw-r--r--gnulib/doc/posix-functions/mprotect.texi24
-rw-r--r--gnulib/doc/posix-functions/mq_close.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_getattr.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_notify.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_open.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_receive.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_send.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_setattr.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_timedreceive.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_timedsend.texi19
-rw-r--r--gnulib/doc/posix-functions/mq_unlink.texi19
-rw-r--r--gnulib/doc/posix-functions/mrand48.texi18
-rw-r--r--gnulib/doc/posix-functions/msgctl.texi18
-rw-r--r--gnulib/doc/posix-functions/msgget.texi18
-rw-r--r--gnulib/doc/posix-functions/msgrcv.texi18
-rw-r--r--gnulib/doc/posix-functions/msgsnd.texi18
-rw-r--r--gnulib/doc/posix-functions/msync.texi20
-rw-r--r--gnulib/doc/posix-functions/munlock.texi18
-rw-r--r--gnulib/doc/posix-functions/munlockall.texi18
-rw-r--r--gnulib/doc/posix-functions/munmap.texi18
-rw-r--r--gnulib/doc/posix-functions/nan.texi18
-rw-r--r--gnulib/doc/posix-functions/nanf.texi18
-rw-r--r--gnulib/doc/posix-functions/nanl.texi18
-rw-r--r--gnulib/doc/posix-functions/nanosleep.texi29
-rw-r--r--gnulib/doc/posix-functions/nearbyint.texi18
-rw-r--r--gnulib/doc/posix-functions/nearbyintf.texi18
-rw-r--r--gnulib/doc/posix-functions/nearbyintl.texi18
-rw-r--r--gnulib/doc/posix-functions/newlocale.texi18
-rw-r--r--gnulib/doc/posix-functions/nextafter.texi15
-rw-r--r--gnulib/doc/posix-functions/nextafterf.texi18
-rw-r--r--gnulib/doc/posix-functions/nextafterl.texi18
-rw-r--r--gnulib/doc/posix-functions/nexttoward.texi18
-rw-r--r--gnulib/doc/posix-functions/nexttowardf.texi18
-rw-r--r--gnulib/doc/posix-functions/nexttowardl.texi18
-rw-r--r--gnulib/doc/posix-functions/nftw.texi18
-rw-r--r--gnulib/doc/posix-functions/nice.texi20
-rw-r--r--gnulib/doc/posix-functions/nl_langinfo.texi31
-rw-r--r--gnulib/doc/posix-functions/nl_langinfo_l.texi18
-rw-r--r--gnulib/doc/posix-functions/nrand48.texi18
-rw-r--r--gnulib/doc/posix-functions/ntohl.texi18
-rw-r--r--gnulib/doc/posix-functions/ntohs.texi18
-rw-r--r--gnulib/doc/posix-functions/open.texi38
-rw-r--r--gnulib/doc/posix-functions/open_memstream.texi19
-rw-r--r--gnulib/doc/posix-functions/open_wmemstream.texi22
-rw-r--r--gnulib/doc/posix-functions/openat.texi25
-rw-r--r--gnulib/doc/posix-functions/opendir.texi15
-rw-r--r--gnulib/doc/posix-functions/openlog.texi18
-rw-r--r--gnulib/doc/posix-functions/optarg.texi18
-rw-r--r--gnulib/doc/posix-functions/opterr.texi18
-rw-r--r--gnulib/doc/posix-functions/optind.texi18
-rw-r--r--gnulib/doc/posix-functions/optopt.texi18
-rw-r--r--gnulib/doc/posix-functions/pathconf.texi18
-rw-r--r--gnulib/doc/posix-functions/pause.texi18
-rw-r--r--gnulib/doc/posix-functions/pclose.texi15
-rw-r--r--gnulib/doc/posix-functions/perror.texi19
-rw-r--r--gnulib/doc/posix-functions/pipe.texi18
-rw-r--r--gnulib/doc/posix-functions/poll.texi22
-rw-r--r--gnulib/doc/posix-functions/popen.texi24
-rw-r--r--gnulib/doc/posix-functions/posix_fadvise.texi19
-rw-r--r--gnulib/doc/posix-functions/posix_fallocate.texi19
-rw-r--r--gnulib/doc/posix-functions/posix_madvise.texi19
-rw-r--r--gnulib/doc/posix-functions/posix_mem_offset.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_memalign.texi19
-rw-r--r--gnulib/doc/posix-functions/posix_openpt.texi19
-rw-r--r--gnulib/doc/posix-functions/posix_spawn.texi25
-rw-r--r--gnulib/doc/posix-functions/posix_spawn_file_actions_addclose.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawn_file_actions_adddup2.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawn_file_actions_addopen.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawn_file_actions_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawn_file_actions_init.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_getflags.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_getpgroup.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_getschedparam.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_getschedpolicy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_getsigdefault.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_getsigmask.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_init.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_setflags.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_setpgroup.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_setschedparam.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_setschedpolicy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_setsigdefault.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnattr_setsigmask.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_spawnp.texi25
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getclockres.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getcreatetime.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getgenversion.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getinherited.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getlogfullpolicy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getlogsize.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getmaxdatasize.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getmaxsystemeventsize.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getmaxusereventsize.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getname.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getstreamfullpolicy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_getstreamsize.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_init.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_setinherited.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_setlogfullpolicy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_setlogsize.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_setmaxdatasize.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_setname.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_setstreamfullpolicy.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_attr_setstreamsize.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_clear.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_close.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_create.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_create_withlog.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_event.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventid_equal.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventid_get_name.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventid_open.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventset_add.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventset_del.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventset_empty.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventset_fill.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventset_ismember.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventtypelist_getnext_id.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_eventtypelist_rewind.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_flush.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_get_attr.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_get_filter.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_get_status.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_getnext_event.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_open.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_rewind.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_set_filter.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_shutdown.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_start.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_stop.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_timedgetnext_event.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_trid_eventid_open.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_trace_trygetnext_event.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_typed_mem_get_info.texi18
-rw-r--r--gnulib/doc/posix-functions/posix_typed_mem_open.texi18
-rw-r--r--gnulib/doc/posix-functions/pow.texi15
-rw-r--r--gnulib/doc/posix-functions/powf.texi18
-rw-r--r--gnulib/doc/posix-functions/powl.texi18
-rw-r--r--gnulib/doc/posix-functions/pread.texi18
-rw-r--r--gnulib/doc/posix-functions/printf.texi72
-rw-r--r--gnulib/doc/posix-functions/pselect.texi18
-rw-r--r--gnulib/doc/posix-functions/psiginfo.texi18
-rw-r--r--gnulib/doc/posix-functions/psignal.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_atfork.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_getdetachstate.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_getguardsize.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_getinheritsched.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_getschedparam.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_getschedpolicy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_getscope.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_getstack.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_getstacksize.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_setdetachstate.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_setguardsize.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_setinheritsched.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_setschedparam.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_setschedpolicy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_setscope.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_setstack.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_attr_setstacksize.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_barrier_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_barrier_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_barrier_wait.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_barrierattr_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_barrierattr_getpshared.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_barrierattr_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_barrierattr_setpshared.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cancel.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cleanup_pop.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cleanup_push.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cond_broadcast.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cond_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cond_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cond_signal.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cond_timedwait.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_cond_wait.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_condattr_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_condattr_getclock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_condattr_getpshared.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_condattr_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_condattr_setclock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_condattr_setpshared.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_create.texi23
-rw-r--r--gnulib/doc/posix-functions/pthread_detach.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_equal.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_exit.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_getconcurrency.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_getcpuclockid.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_getschedparam.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_getspecific.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_join.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_key_create.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_key_delete.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_kill.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_consistent.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_getprioceiling.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_lock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_setprioceiling.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_timedlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_trylock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutex_unlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_getprioceiling.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_getprotocol.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_getpshared.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_getrobust.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_gettype.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_setprioceiling.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_setprotocol.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_setpshared.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_setrobust.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_mutexattr_settype.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_once.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_rdlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_timedrdlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_timedwrlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_tryrdlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_trywrlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_unlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlock_wrlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlockattr_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlockattr_getpshared.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlockattr_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_rwlockattr_setpshared.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_self.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_setcancelstate.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_setcanceltype.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_setconcurrency.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_setschedparam.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_setschedprio.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_setspecific.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_sigmask.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_spin_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_spin_init.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_spin_lock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_spin_trylock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_spin_unlock.texi18
-rw-r--r--gnulib/doc/posix-functions/pthread_testcancel.texi18
-rw-r--r--gnulib/doc/posix-functions/ptsname.texi18
-rw-r--r--gnulib/doc/posix-functions/putc.texi22
-rw-r--r--gnulib/doc/posix-functions/putc_unlocked.texi18
-rw-r--r--gnulib/doc/posix-functions/putchar.texi22
-rw-r--r--gnulib/doc/posix-functions/putchar_unlocked.texi18
-rw-r--r--gnulib/doc/posix-functions/putenv.texi19
-rw-r--r--gnulib/doc/posix-functions/putmsg.texi18
-rw-r--r--gnulib/doc/posix-functions/putpmsg.texi18
-rw-r--r--gnulib/doc/posix-functions/puts.texi22
-rw-r--r--gnulib/doc/posix-functions/pututxline.texi18
-rw-r--r--gnulib/doc/posix-functions/putwc.texi21
-rw-r--r--gnulib/doc/posix-functions/putwchar.texi21
-rw-r--r--gnulib/doc/posix-functions/pwrite.texi18
-rw-r--r--gnulib/doc/posix-functions/qsort.texi15
-rw-r--r--gnulib/doc/posix-functions/raise.texi17
-rw-r--r--gnulib/doc/posix-functions/rand.texi15
-rw-r--r--gnulib/doc/posix-functions/rand_r.texi18
-rw-r--r--gnulib/doc/posix-functions/random.texi18
-rw-r--r--gnulib/doc/posix-functions/read.texi15
-rw-r--r--gnulib/doc/posix-functions/readdir.texi15
-rw-r--r--gnulib/doc/posix-functions/readdir_r.texi18
-rw-r--r--gnulib/doc/posix-functions/readlink.texi42
-rw-r--r--gnulib/doc/posix-functions/readlinkat.texi40
-rw-r--r--gnulib/doc/posix-functions/readv.texi18
-rw-r--r--gnulib/doc/posix-functions/realloc.texi22
-rw-r--r--gnulib/doc/posix-functions/realpath.texi38
-rw-r--r--gnulib/doc/posix-functions/recv.texi19
-rw-r--r--gnulib/doc/posix-functions/recvfrom.texi22
-rw-r--r--gnulib/doc/posix-functions/recvmsg.texi18
-rw-r--r--gnulib/doc/posix-functions/regcomp.texi20
-rw-r--r--gnulib/doc/posix-functions/regerror.texi18
-rw-r--r--gnulib/doc/posix-functions/regexec.texi20
-rw-r--r--gnulib/doc/posix-functions/regfree.texi18
-rw-r--r--gnulib/doc/posix-functions/remainder.texi15
-rw-r--r--gnulib/doc/posix-functions/remainderf.texi18
-rw-r--r--gnulib/doc/posix-functions/remainderl.texi18
-rw-r--r--gnulib/doc/posix-functions/remove.texi26
-rw-r--r--gnulib/doc/posix-functions/remque.texi18
-rw-r--r--gnulib/doc/posix-functions/remquo.texi18
-rw-r--r--gnulib/doc/posix-functions/remquof.texi18
-rw-r--r--gnulib/doc/posix-functions/remquol.texi18
-rw-r--r--gnulib/doc/posix-functions/rename.texi66
-rw-r--r--gnulib/doc/posix-functions/renameat.texi41
-rw-r--r--gnulib/doc/posix-functions/rewind.texi18
-rw-r--r--gnulib/doc/posix-functions/rewinddir.texi15
-rw-r--r--gnulib/doc/posix-functions/rint.texi15
-rw-r--r--gnulib/doc/posix-functions/rintf.texi18
-rw-r--r--gnulib/doc/posix-functions/rintl.texi19
-rw-r--r--gnulib/doc/posix-functions/rmdir.texi33
-rw-r--r--gnulib/doc/posix-functions/round.texi21
-rw-r--r--gnulib/doc/posix-functions/roundf.texi21
-rw-r--r--gnulib/doc/posix-functions/roundl.texi18
-rw-r--r--gnulib/doc/posix-functions/scalbln.texi18
-rw-r--r--gnulib/doc/posix-functions/scalblnf.texi18
-rw-r--r--gnulib/doc/posix-functions/scalblnl.texi18
-rw-r--r--gnulib/doc/posix-functions/scalbn.texi18
-rw-r--r--gnulib/doc/posix-functions/scalbnf.texi18
-rw-r--r--gnulib/doc/posix-functions/scalbnl.texi18
-rw-r--r--gnulib/doc/posix-functions/scandir.texi24
-rw-r--r--gnulib/doc/posix-functions/scanf.texi21
-rw-r--r--gnulib/doc/posix-functions/sched_get_priority_max.texi18
-rw-r--r--gnulib/doc/posix-functions/sched_get_priority_min.texi18
-rw-r--r--gnulib/doc/posix-functions/sched_getparam.texi18
-rw-r--r--gnulib/doc/posix-functions/sched_getscheduler.texi18
-rw-r--r--gnulib/doc/posix-functions/sched_rr_get_interval.texi18
-rw-r--r--gnulib/doc/posix-functions/sched_setparam.texi18
-rw-r--r--gnulib/doc/posix-functions/sched_setscheduler.texi18
-rw-r--r--gnulib/doc/posix-functions/sched_yield.texi18
-rw-r--r--gnulib/doc/posix-functions/seed48.texi18
-rw-r--r--gnulib/doc/posix-functions/seekdir.texi18
-rw-r--r--gnulib/doc/posix-functions/select.texi40
-rw-r--r--gnulib/doc/posix-functions/sem_close.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_destroy.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_getvalue.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_init.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_open.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_post.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_timedwait.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_trywait.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_unlink.texi18
-rw-r--r--gnulib/doc/posix-functions/sem_wait.texi18
-rw-r--r--gnulib/doc/posix-functions/semctl.texi18
-rw-r--r--gnulib/doc/posix-functions/semget.texi18
-rw-r--r--gnulib/doc/posix-functions/semop.texi18
-rw-r--r--gnulib/doc/posix-functions/send.texi19
-rw-r--r--gnulib/doc/posix-functions/sendmsg.texi18
-rw-r--r--gnulib/doc/posix-functions/sendto.texi19
-rw-r--r--gnulib/doc/posix-functions/setbuf.texi15
-rw-r--r--gnulib/doc/posix-functions/setegid.texi18
-rw-r--r--gnulib/doc/posix-functions/setenv.texi30
-rw-r--r--gnulib/doc/posix-functions/seteuid.texi18
-rw-r--r--gnulib/doc/posix-functions/setgid.texi18
-rw-r--r--gnulib/doc/posix-functions/setgrent.texi18
-rw-r--r--gnulib/doc/posix-functions/sethostent.texi18
-rw-r--r--gnulib/doc/posix-functions/setitimer.texi18
-rw-r--r--gnulib/doc/posix-functions/setjmp.texi23
-rw-r--r--gnulib/doc/posix-functions/setkey.texi18
-rw-r--r--gnulib/doc/posix-functions/setlocale.texi21
-rw-r--r--gnulib/doc/posix-functions/setlogmask.texi18
-rw-r--r--gnulib/doc/posix-functions/setnetent.texi18
-rw-r--r--gnulib/doc/posix-functions/setpgid.texi18
-rw-r--r--gnulib/doc/posix-functions/setpgrp.texi18
-rw-r--r--gnulib/doc/posix-functions/setpriority.texi18
-rw-r--r--gnulib/doc/posix-functions/setprotoent.texi18
-rw-r--r--gnulib/doc/posix-functions/setpwent.texi18
-rw-r--r--gnulib/doc/posix-functions/setregid.texi18
-rw-r--r--gnulib/doc/posix-functions/setreuid.texi18
-rw-r--r--gnulib/doc/posix-functions/setrlimit.texi18
-rw-r--r--gnulib/doc/posix-functions/setservent.texi18
-rw-r--r--gnulib/doc/posix-functions/setsid.texi18
-rw-r--r--gnulib/doc/posix-functions/setsockopt.texi21
-rw-r--r--gnulib/doc/posix-functions/setstate.texi18
-rw-r--r--gnulib/doc/posix-functions/setuid.texi18
-rw-r--r--gnulib/doc/posix-functions/setutxent.texi18
-rw-r--r--gnulib/doc/posix-functions/setvbuf.texi18
-rw-r--r--gnulib/doc/posix-functions/shm_open.texi18
-rw-r--r--gnulib/doc/posix-functions/shm_unlink.texi18
-rw-r--r--gnulib/doc/posix-functions/shmat.texi26
-rw-r--r--gnulib/doc/posix-functions/shmctl.texi18
-rw-r--r--gnulib/doc/posix-functions/shmdt.texi18
-rw-r--r--gnulib/doc/posix-functions/shmget.texi21
-rw-r--r--gnulib/doc/posix-functions/shutdown.texi19
-rw-r--r--gnulib/doc/posix-functions/sigaction.texi58
-rw-r--r--gnulib/doc/posix-functions/sigaddset.texi18
-rw-r--r--gnulib/doc/posix-functions/sigaltstack.texi26
-rw-r--r--gnulib/doc/posix-functions/sigdelset.texi18
-rw-r--r--gnulib/doc/posix-functions/sigemptyset.texi18
-rw-r--r--gnulib/doc/posix-functions/sigfillset.texi18
-rw-r--r--gnulib/doc/posix-functions/sighold.texi18
-rw-r--r--gnulib/doc/posix-functions/sigignore.texi18
-rw-r--r--gnulib/doc/posix-functions/siginterrupt.texi21
-rw-r--r--gnulib/doc/posix-functions/sigismember.texi18
-rw-r--r--gnulib/doc/posix-functions/siglongjmp.texi22
-rw-r--r--gnulib/doc/posix-functions/signal.texi25
-rw-r--r--gnulib/doc/posix-functions/signbit.texi18
-rw-r--r--gnulib/doc/posix-functions/signgam.texi18
-rw-r--r--gnulib/doc/posix-functions/sigpause.texi18
-rw-r--r--gnulib/doc/posix-functions/sigpending.texi18
-rw-r--r--gnulib/doc/posix-functions/sigprocmask.texi18
-rw-r--r--gnulib/doc/posix-functions/sigqueue.texi18
-rw-r--r--gnulib/doc/posix-functions/sigrelse.texi18
-rw-r--r--gnulib/doc/posix-functions/sigset.texi18
-rw-r--r--gnulib/doc/posix-functions/sigsetjmp.texi18
-rw-r--r--gnulib/doc/posix-functions/sigsuspend.texi18
-rw-r--r--gnulib/doc/posix-functions/sigtimedwait.texi21
-rw-r--r--gnulib/doc/posix-functions/sigwait.texi23
-rw-r--r--gnulib/doc/posix-functions/sigwaitinfo.texi18
-rw-r--r--gnulib/doc/posix-functions/sin.texi15
-rw-r--r--gnulib/doc/posix-functions/sinf.texi18
-rw-r--r--gnulib/doc/posix-functions/sinh.texi15
-rw-r--r--gnulib/doc/posix-functions/sinhf.texi18
-rw-r--r--gnulib/doc/posix-functions/sinhl.texi18
-rw-r--r--gnulib/doc/posix-functions/sinl.texi21
-rw-r--r--gnulib/doc/posix-functions/sleep.texi29
-rw-r--r--gnulib/doc/posix-functions/snprintf.texi92
-rw-r--r--gnulib/doc/posix-functions/sockatmark.texi18
-rw-r--r--gnulib/doc/posix-functions/socket.texi28
-rw-r--r--gnulib/doc/posix-functions/socketpair.texi18
-rw-r--r--gnulib/doc/posix-functions/sprintf.texi64
-rw-r--r--gnulib/doc/posix-functions/sqrt.texi18
-rw-r--r--gnulib/doc/posix-functions/sqrtf.texi18
-rw-r--r--gnulib/doc/posix-functions/sqrtl.texi21
-rw-r--r--gnulib/doc/posix-functions/srand.texi15
-rw-r--r--gnulib/doc/posix-functions/srand48.texi18
-rw-r--r--gnulib/doc/posix-functions/srandom.texi18
-rw-r--r--gnulib/doc/posix-functions/sscanf.texi21
-rw-r--r--gnulib/doc/posix-functions/stat.texi38
-rw-r--r--gnulib/doc/posix-functions/statvfs.texi18
-rw-r--r--gnulib/doc/posix-functions/stderr.texi27
-rw-r--r--gnulib/doc/posix-functions/stdin.texi27
-rw-r--r--gnulib/doc/posix-functions/stdout.texi27
-rw-r--r--gnulib/doc/posix-functions/stpcpy.texi19
-rw-r--r--gnulib/doc/posix-functions/stpncpy.texi22
-rw-r--r--gnulib/doc/posix-functions/strcasecmp.texi21
-rw-r--r--gnulib/doc/posix-functions/strcasecmp_l.texi18
-rw-r--r--gnulib/doc/posix-functions/strcat.texi15
-rw-r--r--gnulib/doc/posix-functions/strchr.texi19
-rw-r--r--gnulib/doc/posix-functions/strcmp.texi15
-rw-r--r--gnulib/doc/posix-functions/strcoll.texi15
-rw-r--r--gnulib/doc/posix-functions/strcoll_l.texi18
-rw-r--r--gnulib/doc/posix-functions/strcpy.texi15
-rw-r--r--gnulib/doc/posix-functions/strcspn.texi21
-rw-r--r--gnulib/doc/posix-functions/strdup.texi27
-rw-r--r--gnulib/doc/posix-functions/strerror.texi25
-rw-r--r--gnulib/doc/posix-functions/strerror_l.texi18
-rw-r--r--gnulib/doc/posix-functions/strerror_r.texi27
-rw-r--r--gnulib/doc/posix-functions/strfmon.texi18
-rw-r--r--gnulib/doc/posix-functions/strfmon_l.texi18
-rw-r--r--gnulib/doc/posix-functions/strftime.texi22
-rw-r--r--gnulib/doc/posix-functions/strftime_l.texi18
-rw-r--r--gnulib/doc/posix-functions/strlen.texi15
-rw-r--r--gnulib/doc/posix-functions/strncasecmp.texi22
-rw-r--r--gnulib/doc/posix-functions/strncasecmp_l.texi18
-rw-r--r--gnulib/doc/posix-functions/strncat.texi15
-rw-r--r--gnulib/doc/posix-functions/strncmp.texi15
-rw-r--r--gnulib/doc/posix-functions/strncpy.texi15
-rw-r--r--gnulib/doc/posix-functions/strndup.texi21
-rw-r--r--gnulib/doc/posix-functions/strnlen.texi21
-rw-r--r--gnulib/doc/posix-functions/strpbrk.texi21
-rw-r--r--gnulib/doc/posix-functions/strptime.texi18
-rw-r--r--gnulib/doc/posix-functions/strrchr.texi19
-rw-r--r--gnulib/doc/posix-functions/strsignal.texi26
-rw-r--r--gnulib/doc/posix-functions/strspn.texi19
-rw-r--r--gnulib/doc/posix-functions/strstr.texi32
-rw-r--r--gnulib/doc/posix-functions/strtod.texi83
-rw-r--r--gnulib/doc/posix-functions/strtof.texi18
-rw-r--r--gnulib/doc/posix-functions/strtoimax.texi18
-rw-r--r--gnulib/doc/posix-functions/strtok.texi15
-rw-r--r--gnulib/doc/posix-functions/strtok_r.texi26
-rw-r--r--gnulib/doc/posix-functions/strtol.texi17
-rw-r--r--gnulib/doc/posix-functions/strtold.texi18
-rw-r--r--gnulib/doc/posix-functions/strtoll.texi18
-rw-r--r--gnulib/doc/posix-functions/strtoul.texi17
-rw-r--r--gnulib/doc/posix-functions/strtoull.texi18
-rw-r--r--gnulib/doc/posix-functions/strtoumax.texi18
-rw-r--r--gnulib/doc/posix-functions/strxfrm.texi15
-rw-r--r--gnulib/doc/posix-functions/strxfrm_l.texi18
-rw-r--r--gnulib/doc/posix-functions/swab.texi18
-rw-r--r--gnulib/doc/posix-functions/swprintf.texi23
-rw-r--r--gnulib/doc/posix-functions/swscanf.texi21
-rw-r--r--gnulib/doc/posix-functions/symlink.texi25
-rw-r--r--gnulib/doc/posix-functions/symlinkat.texi28
-rw-r--r--gnulib/doc/posix-functions/sync.texi18
-rw-r--r--gnulib/doc/posix-functions/sysconf.texi18
-rw-r--r--gnulib/doc/posix-functions/syslog.texi18
-rw-r--r--gnulib/doc/posix-functions/system.texi20
-rw-r--r--gnulib/doc/posix-functions/tan.texi15
-rw-r--r--gnulib/doc/posix-functions/tanf.texi18
-rw-r--r--gnulib/doc/posix-functions/tanh.texi15
-rw-r--r--gnulib/doc/posix-functions/tanhf.texi18
-rw-r--r--gnulib/doc/posix-functions/tanhl.texi18
-rw-r--r--gnulib/doc/posix-functions/tanl.texi21
-rw-r--r--gnulib/doc/posix-functions/tcdrain.texi22
-rw-r--r--gnulib/doc/posix-functions/tcflow.texi18
-rw-r--r--gnulib/doc/posix-functions/tcflush.texi25
-rw-r--r--gnulib/doc/posix-functions/tcgetattr.texi18
-rw-r--r--gnulib/doc/posix-functions/tcgetpgrp.texi18
-rw-r--r--gnulib/doc/posix-functions/tcgetsid.texi18
-rw-r--r--gnulib/doc/posix-functions/tcsendbreak.texi18
-rw-r--r--gnulib/doc/posix-functions/tcsetattr.texi18
-rw-r--r--gnulib/doc/posix-functions/tcsetpgrp.texi18
-rw-r--r--gnulib/doc/posix-functions/tdelete.texi22
-rw-r--r--gnulib/doc/posix-functions/telldir.texi18
-rw-r--r--gnulib/doc/posix-functions/tempnam.texi18
-rw-r--r--gnulib/doc/posix-functions/tfind.texi18
-rw-r--r--gnulib/doc/posix-functions/tgamma.texi18
-rw-r--r--gnulib/doc/posix-functions/tgammaf.texi18
-rw-r--r--gnulib/doc/posix-functions/tgammal.texi18
-rw-r--r--gnulib/doc/posix-functions/time.texi15
-rw-r--r--gnulib/doc/posix-functions/timer_create.texi18
-rw-r--r--gnulib/doc/posix-functions/timer_delete.texi18
-rw-r--r--gnulib/doc/posix-functions/timer_getoverrun.texi18
-rw-r--r--gnulib/doc/posix-functions/timer_gettime.texi18
-rw-r--r--gnulib/doc/posix-functions/timer_settime.texi18
-rw-r--r--gnulib/doc/posix-functions/times.texi22
-rw-r--r--gnulib/doc/posix-functions/timezone.texi21
-rw-r--r--gnulib/doc/posix-functions/tmpfile.texi18
-rw-r--r--gnulib/doc/posix-functions/tmpnam.texi18
-rw-r--r--gnulib/doc/posix-functions/toascii.texi15
-rw-r--r--gnulib/doc/posix-functions/tolower.texi18
-rw-r--r--gnulib/doc/posix-functions/tolower_l.texi18
-rw-r--r--gnulib/doc/posix-functions/toupper.texi18
-rw-r--r--gnulib/doc/posix-functions/toupper_l.texi18
-rw-r--r--gnulib/doc/posix-functions/towctrans.texi21
-rw-r--r--gnulib/doc/posix-functions/towctrans_l.texi21
-rw-r--r--gnulib/doc/posix-functions/towlower.texi25
-rw-r--r--gnulib/doc/posix-functions/towlower_l.texi21
-rw-r--r--gnulib/doc/posix-functions/towupper.texi25
-rw-r--r--gnulib/doc/posix-functions/towupper_l.texi21
-rw-r--r--gnulib/doc/posix-functions/trunc.texi18
-rw-r--r--gnulib/doc/posix-functions/truncate.texi18
-rw-r--r--gnulib/doc/posix-functions/truncf.texi18
-rw-r--r--gnulib/doc/posix-functions/truncl.texi21
-rw-r--r--gnulib/doc/posix-functions/tsearch.texi18
-rw-r--r--gnulib/doc/posix-functions/ttyname.texi18
-rw-r--r--gnulib/doc/posix-functions/ttyname_r.texi18
-rw-r--r--gnulib/doc/posix-functions/twalk.texi18
-rw-r--r--gnulib/doc/posix-functions/tzname.texi21
-rw-r--r--gnulib/doc/posix-functions/tzset.texi19
-rw-r--r--gnulib/doc/posix-functions/ulimit.texi18
-rw-r--r--gnulib/doc/posix-functions/umask.texi15
-rw-r--r--gnulib/doc/posix-functions/uname.texi18
-rw-r--r--gnulib/doc/posix-functions/ungetc.texi18
-rw-r--r--gnulib/doc/posix-functions/ungetwc.texi21
-rw-r--r--gnulib/doc/posix-functions/unlink.texi33
-rw-r--r--gnulib/doc/posix-functions/unlinkat.texi51
-rw-r--r--gnulib/doc/posix-functions/unlockpt.texi18
-rw-r--r--gnulib/doc/posix-functions/unsetenv.texi34
-rw-r--r--gnulib/doc/posix-functions/uselocale.texi18
-rw-r--r--gnulib/doc/posix-functions/utime.texi30
-rw-r--r--gnulib/doc/posix-functions/utimensat.texi57
-rw-r--r--gnulib/doc/posix-functions/utimes.texi34
-rw-r--r--gnulib/doc/posix-functions/va_arg.texi39
-rw-r--r--gnulib/doc/posix-functions/va_copy.texi18
-rw-r--r--gnulib/doc/posix-functions/va_end.texi15
-rw-r--r--gnulib/doc/posix-functions/va_start.texi15
-rw-r--r--gnulib/doc/posix-functions/vdprintf.texi45
-rw-r--r--gnulib/doc/posix-functions/vfprintf.texi72
-rw-r--r--gnulib/doc/posix-functions/vfscanf.texi24
-rw-r--r--gnulib/doc/posix-functions/vfwprintf.texi21
-rw-r--r--gnulib/doc/posix-functions/vfwscanf.texi22
-rw-r--r--gnulib/doc/posix-functions/vprintf.texi72
-rw-r--r--gnulib/doc/posix-functions/vscanf.texi24
-rw-r--r--gnulib/doc/posix-functions/vsnprintf.texi92
-rw-r--r--gnulib/doc/posix-functions/vsprintf.texi64
-rw-r--r--gnulib/doc/posix-functions/vsscanf.texi24
-rw-r--r--gnulib/doc/posix-functions/vswprintf.texi23
-rw-r--r--gnulib/doc/posix-functions/vswscanf.texi22
-rw-r--r--gnulib/doc/posix-functions/vwprintf.texi25
-rw-r--r--gnulib/doc/posix-functions/vwscanf.texi22
-rw-r--r--gnulib/doc/posix-functions/wait.texi18
-rw-r--r--gnulib/doc/posix-functions/waitid.texi21
-rw-r--r--gnulib/doc/posix-functions/waitpid.texi18
-rw-r--r--gnulib/doc/posix-functions/wcpcpy.texi22
-rw-r--r--gnulib/doc/posix-functions/wcpncpy.texi22
-rw-r--r--gnulib/doc/posix-functions/wcrtomb.texi24
-rw-r--r--gnulib/doc/posix-functions/wcscasecmp.texi22
-rw-r--r--gnulib/doc/posix-functions/wcscasecmp_l.texi21
-rw-r--r--gnulib/doc/posix-functions/wcscat.texi21
-rw-r--r--gnulib/doc/posix-functions/wcschr.texi21
-rw-r--r--gnulib/doc/posix-functions/wcscmp.texi21
-rw-r--r--gnulib/doc/posix-functions/wcscoll.texi21
-rw-r--r--gnulib/doc/posix-functions/wcscoll_l.texi21
-rw-r--r--gnulib/doc/posix-functions/wcscpy.texi21
-rw-r--r--gnulib/doc/posix-functions/wcscspn.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsdup.texi22
-rw-r--r--gnulib/doc/posix-functions/wcsftime.texi21
-rw-r--r--gnulib/doc/posix-functions/wcslen.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsncasecmp.texi22
-rw-r--r--gnulib/doc/posix-functions/wcsncasecmp_l.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsncat.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsncmp.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsncpy.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsnlen.texi22
-rw-r--r--gnulib/doc/posix-functions/wcsnrtombs.texi22
-rw-r--r--gnulib/doc/posix-functions/wcspbrk.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsrchr.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsrtombs.texi27
-rw-r--r--gnulib/doc/posix-functions/wcsspn.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsstr.texi21
-rw-r--r--gnulib/doc/posix-functions/wcstod.texi21
-rw-r--r--gnulib/doc/posix-functions/wcstof.texi22
-rw-r--r--gnulib/doc/posix-functions/wcstoimax.texi22
-rw-r--r--gnulib/doc/posix-functions/wcstok.texi21
-rw-r--r--gnulib/doc/posix-functions/wcstol.texi21
-rw-r--r--gnulib/doc/posix-functions/wcstold.texi21
-rw-r--r--gnulib/doc/posix-functions/wcstoll.texi21
-rw-r--r--gnulib/doc/posix-functions/wcstombs.texi18
-rw-r--r--gnulib/doc/posix-functions/wcstoul.texi21
-rw-r--r--gnulib/doc/posix-functions/wcstoull.texi21
-rw-r--r--gnulib/doc/posix-functions/wcstoumax.texi22
-rw-r--r--gnulib/doc/posix-functions/wcswidth.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsxfrm.texi21
-rw-r--r--gnulib/doc/posix-functions/wcsxfrm_l.texi21
-rw-r--r--gnulib/doc/posix-functions/wctob.texi27
-rw-r--r--gnulib/doc/posix-functions/wctomb.texi18
-rw-r--r--gnulib/doc/posix-functions/wctrans.texi21
-rw-r--r--gnulib/doc/posix-functions/wctrans_l.texi21
-rw-r--r--gnulib/doc/posix-functions/wctype.texi21
-rw-r--r--gnulib/doc/posix-functions/wctype_l.texi21
-rw-r--r--gnulib/doc/posix-functions/wcwidth.texi25
-rw-r--r--gnulib/doc/posix-functions/wmemchr.texi21
-rw-r--r--gnulib/doc/posix-functions/wmemcmp.texi21
-rw-r--r--gnulib/doc/posix-functions/wmemcpy.texi21
-rw-r--r--gnulib/doc/posix-functions/wmemmove.texi21
-rw-r--r--gnulib/doc/posix-functions/wmemset.texi21
-rw-r--r--gnulib/doc/posix-functions/wordexp.texi18
-rw-r--r--gnulib/doc/posix-functions/wordfree.texi18
-rw-r--r--gnulib/doc/posix-functions/wprintf.texi25
-rw-r--r--gnulib/doc/posix-functions/write.texi20
-rw-r--r--gnulib/doc/posix-functions/writev.texi18
-rw-r--r--gnulib/doc/posix-functions/wscanf.texi21
-rw-r--r--gnulib/doc/posix-functions/y0.texi15
-rw-r--r--gnulib/doc/posix-functions/y1.texi15
-rw-r--r--gnulib/doc/posix-functions/yn.texi15
-rw-r--r--gnulib/doc/posix-headers/aio.texi17
-rw-r--r--gnulib/doc/posix-headers/arpa_inet.texi16
-rw-r--r--gnulib/doc/posix-headers/assert.texi14
-rw-r--r--gnulib/doc/posix-headers/complex.texi18
-rw-r--r--gnulib/doc/posix-headers/cpio.texi17
-rw-r--r--gnulib/doc/posix-headers/ctype.texi14
-rw-r--r--gnulib/doc/posix-headers/dirent.texi17
-rw-r--r--gnulib/doc/posix-headers/dlfcn.texi17
-rw-r--r--gnulib/doc/posix-headers/errno.texi38
-rw-r--r--gnulib/doc/posix-headers/fcntl.texi70
-rw-r--r--gnulib/doc/posix-headers/fenv.texi18
-rw-r--r--gnulib/doc/posix-headers/float.texi19
-rw-r--r--gnulib/doc/posix-headers/fmtmsg.texi17
-rw-r--r--gnulib/doc/posix-headers/fnmatch.texi17
-rw-r--r--gnulib/doc/posix-headers/ftw.texi17
-rw-r--r--gnulib/doc/posix-headers/glob.texi17
-rw-r--r--gnulib/doc/posix-headers/google-ranking.txt84
-rw-r--r--gnulib/doc/posix-headers/grp.texi17
-rw-r--r--gnulib/doc/posix-headers/iconv.texi21
-rw-r--r--gnulib/doc/posix-headers/inttypes.texi29
-rw-r--r--gnulib/doc/posix-headers/iso646.texi17
-rw-r--r--gnulib/doc/posix-headers/langinfo.texi24
-rw-r--r--gnulib/doc/posix-headers/libgen.texi17
-rw-r--r--gnulib/doc/posix-headers/limits.texi17
-rw-r--r--gnulib/doc/posix-headers/locale.texi26
-rw-r--r--gnulib/doc/posix-headers/math.texi30
-rw-r--r--gnulib/doc/posix-headers/monetary.texi17
-rw-r--r--gnulib/doc/posix-headers/mqueue.texi18
-rw-r--r--gnulib/doc/posix-headers/ndbm.texi17
-rw-r--r--gnulib/doc/posix-headers/net_if.texi17
-rw-r--r--gnulib/doc/posix-headers/netdb.texi26
-rw-r--r--gnulib/doc/posix-headers/netinet_in.texi20
-rw-r--r--gnulib/doc/posix-headers/netinet_tcp.texi17
-rw-r--r--gnulib/doc/posix-headers/nl_types.texi18
-rw-r--r--gnulib/doc/posix-headers/poll.texi17
-rw-r--r--gnulib/doc/posix-headers/pthread.texi17
-rw-r--r--gnulib/doc/posix-headers/pwd.texi17
-rw-r--r--gnulib/doc/posix-headers/regex.texi20
-rw-r--r--gnulib/doc/posix-headers/sched.texi24
-rw-r--r--gnulib/doc/posix-headers/search.texi17
-rw-r--r--gnulib/doc/posix-headers/semaphore.texi17
-rw-r--r--gnulib/doc/posix-headers/setjmp.texi14
-rw-r--r--gnulib/doc/posix-headers/signal.texi38
-rw-r--r--gnulib/doc/posix-headers/spawn.texi18
-rw-r--r--gnulib/doc/posix-headers/stdarg.texi17
-rw-r--r--gnulib/doc/posix-headers/stdbool.texi30
-rw-r--r--gnulib/doc/posix-headers/stddef.texi21
-rw-r--r--gnulib/doc/posix-headers/stdint.texi62
-rw-r--r--gnulib/doc/posix-headers/stdio.texi27
-rw-r--r--gnulib/doc/posix-headers/stdlib.texi24
-rw-r--r--gnulib/doc/posix-headers/string.texi18
-rw-r--r--gnulib/doc/posix-headers/strings.texi17
-rw-r--r--gnulib/doc/posix-headers/stropts.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_ipc.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_mman.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_msg.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_resource.texi22
-rw-r--r--gnulib/doc/posix-headers/sys_select.texi27
-rw-r--r--gnulib/doc/posix-headers/sys_sem.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_shm.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_socket.texi25
-rw-r--r--gnulib/doc/posix-headers/sys_stat.texi31
-rw-r--r--gnulib/doc/posix-headers/sys_statvfs.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_time.texi18
-rw-r--r--gnulib/doc/posix-headers/sys_timeb.texi14
-rw-r--r--gnulib/doc/posix-headers/sys_times.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_types.texi14
-rw-r--r--gnulib/doc/posix-headers/sys_uio.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_un.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_utsname.texi17
-rw-r--r--gnulib/doc/posix-headers/sys_wait.texi17
-rw-r--r--gnulib/doc/posix-headers/syslog.texi17
-rw-r--r--gnulib/doc/posix-headers/tar.texi17
-rw-r--r--gnulib/doc/posix-headers/termios.texi17
-rw-r--r--gnulib/doc/posix-headers/tgmath.texi18
-rw-r--r--gnulib/doc/posix-headers/time.texi21
-rw-r--r--gnulib/doc/posix-headers/trace.texi18
-rw-r--r--gnulib/doc/posix-headers/ucontext.texi17
-rw-r--r--gnulib/doc/posix-headers/ulimit.texi17
-rw-r--r--gnulib/doc/posix-headers/unistd.texi30
-rw-r--r--gnulib/doc/posix-headers/utime.texi17
-rw-r--r--gnulib/doc/posix-headers/utmpx.texi17
-rw-r--r--gnulib/doc/posix-headers/wchar.texi33
-rw-r--r--gnulib/doc/posix-headers/wctype.texi29
-rw-r--r--gnulib/doc/posix-headers/wordexp.texi17
-rw-r--r--gnulib/doc/quote.texi44
-rw-r--r--gnulib/doc/regexprops-generic.texi715
-rw-r--r--gnulib/doc/relocatable-maint.texi147
-rw-r--r--gnulib/doc/relocatable.texi62
-rw-r--r--gnulib/doc/safe-alloc.texi83
-rw-r--r--gnulib/doc/solaris-versions60
-rw-r--r--gnulib/doc/standards.texi4226
-rw-r--r--gnulib/doc/verify.texi82
-rw-r--r--gnulib/doc/warnings.texi58
-rwxr-xr-xgnulib/gnulib-tool5441
-rw-r--r--gnulib/lib/.cppi-disable41
-rw-r--r--gnulib/lib/.cvsignore20
-rw-r--r--gnulib/lib/README3
-rw-r--r--gnulib/lib/accept.c42
-rw-r--r--gnulib/lib/accept4.c128
-rw-r--r--gnulib/lib/acl-internal.h220
-rw-r--r--gnulib/lib/acl.h27
-rw-r--r--gnulib/lib/acl_entries.c75
-rw-r--r--gnulib/lib/acosl.c226
-rw-r--r--gnulib/lib/alignof.h53
-rw-r--r--gnulib/lib/alloca.c489
-rw-r--r--gnulib/lib/alloca.in.h56
-rw-r--r--gnulib/lib/alphasort.c28
-rw-r--r--gnulib/lib/arcfour.c78
-rw-r--r--gnulib/lib/arcfour.h51
-rw-r--r--gnulib/lib/arctwo.c229
-rw-r--r--gnulib/lib/arctwo.h64
-rw-r--r--gnulib/lib/areadlink-with-size.c104
-rw-r--r--gnulib/lib/areadlink.c119
-rw-r--r--gnulib/lib/areadlink.h33
-rw-r--r--gnulib/lib/areadlinkat-with-size.c132
-rw-r--r--gnulib/lib/areadlinkat.c145
-rw-r--r--gnulib/lib/argmatch.c277
-rw-r--r--gnulib/lib/argmatch.h102
-rw-r--r--gnulib/lib/argp-ba.c34
-rw-r--r--gnulib/lib/argp-eexst.c30
-rw-r--r--gnulib/lib/argp-fmtstream.c435
-rw-r--r--gnulib/lib/argp-fmtstream.h354
-rw-r--r--gnulib/lib/argp-fs-xinl.c42
-rw-r--r--gnulib/lib/argp-help.c1951
-rw-r--r--gnulib/lib/argp-namefrob.h157
-rw-r--r--gnulib/lib/argp-parse.c952
-rw-r--r--gnulib/lib/argp-pin.c27
-rw-r--r--gnulib/lib/argp-pv.c34
-rw-r--r--gnulib/lib/argp-pvh.c31
-rw-r--r--gnulib/lib/argp-version-etc.c38
-rw-r--r--gnulib/lib/argp-version-etc.h40
-rw-r--r--gnulib/lib/argp-xinl.c42
-rw-r--r--gnulib/lib/argp.h645
-rw-r--r--gnulib/lib/argv-iter.c111
-rw-r--r--gnulib/lib/argv-iter.h43
-rw-r--r--gnulib/lib/argz.c407
-rw-r--r--gnulib/lib/argz.in.h160
-rw-r--r--gnulib/lib/arpa_inet.in.h97
-rw-r--r--gnulib/lib/array-mergesort.h274
-rw-r--r--gnulib/lib/asinl.c220
-rw-r--r--gnulib/lib/asnprintf.c35
-rw-r--r--gnulib/lib/asprintf.c40
-rw-r--r--gnulib/lib/at-func.c131
-rw-r--r--gnulib/lib/at-func2.c282
-rw-r--r--gnulib/lib/atanl.c224
-rw-r--r--gnulib/lib/atexit.c13
-rw-r--r--gnulib/lib/atoll.c35
-rw-r--r--gnulib/lib/backupfile.c355
-rw-r--r--gnulib/lib/backupfile.h59
-rw-r--r--gnulib/lib/base64.c576
-rw-r--r--gnulib/lib/base64.h61
-rw-r--r--gnulib/lib/basename-lgpl.c75
-rw-r--r--gnulib/lib/basename.c58
-rw-r--r--gnulib/lib/bcopy.c21
-rw-r--r--gnulib/lib/binary-io.h66
-rw-r--r--gnulib/lib/bind.c40
-rw-r--r--gnulib/lib/bitrotate.h126
-rw-r--r--gnulib/lib/btowc.c38
-rw-r--r--gnulib/lib/byteswap.in.h44
-rw-r--r--gnulib/lib/c-ctype.c396
-rw-r--r--gnulib/lib/c-ctype.h295
-rw-r--r--gnulib/lib/c-stack.c342
-rw-r--r--gnulib/lib/c-stack.h44
-rw-r--r--gnulib/lib/c-strcase.h56
-rw-r--r--gnulib/lib/c-strcasecmp.c57
-rw-r--r--gnulib/lib/c-strcaseeq.h184
-rw-r--r--gnulib/lib/c-strcasestr.c77
-rw-r--r--gnulib/lib/c-strcasestr.h36
-rw-r--r--gnulib/lib/c-strncasecmp.c57
-rw-r--r--gnulib/lib/c-strstr.c32
-rw-r--r--gnulib/lib/c-strstr.h44
-rw-r--r--gnulib/lib/c-strtod.c112
-rw-r--r--gnulib/lib/c-strtod.h37
-rw-r--r--gnulib/lib/c-strtold.c2
-rw-r--r--gnulib/lib/calloc.c70
-rw-r--r--gnulib/lib/canon-host.c90
-rw-r--r--gnulib/lib/canon-host.h29
-rw-r--r--gnulib/lib/canonicalize-lgpl.c371
-rw-r--r--gnulib/lib/canonicalize.c290
-rw-r--r--gnulib/lib/canonicalize.h41
-rw-r--r--gnulib/lib/ceil.c93
-rw-r--r--gnulib/lib/ceilf.c20
-rw-r--r--gnulib/lib/ceill.c20
-rw-r--r--gnulib/lib/chdir-long.c266
-rw-r--r--gnulib/lib/chdir-long.h34
-rw-r--r--gnulib/lib/chdir-safer.c79
-rw-r--r--gnulib/lib/chdir-safer.h20
-rw-r--r--gnulib/lib/check-version.c44
-rw-r--r--gnulib/lib/check-version.h26
-rw-r--r--gnulib/lib/chown.c156
-rw-r--r--gnulib/lib/classpath.c122
-rw-r--r--gnulib/lib/classpath.h33
-rw-r--r--gnulib/lib/clean-temp.c785
-rw-r--r--gnulib/lib/clean-temp.h133
-rw-r--r--gnulib/lib/cloexec.c83
-rw-r--r--gnulib/lib/cloexec.h38
-rw-r--r--gnulib/lib/close-hook.c91
-rw-r--r--gnulib/lib/close-hook.h72
-rw-r--r--gnulib/lib/close-stream.c78
-rw-r--r--gnulib/lib/close-stream.h2
-rw-r--r--gnulib/lib/close.c42
-rw-r--r--gnulib/lib/closein.c111
-rw-r--r--gnulib/lib/closein.h32
-rw-r--r--gnulib/lib/closeout.c124
-rw-r--r--gnulib/lib/closeout.h36
-rw-r--r--gnulib/lib/concat-filename.c73
-rw-r--r--gnulib/lib/concat-filename.h41
-rw-r--r--gnulib/lib/config.charset683
-rw-r--r--gnulib/lib/connect.c47
-rw-r--r--gnulib/lib/copy-acl.c553
-rw-r--r--gnulib/lib/copy-file.c137
-rw-r--r--gnulib/lib/copy-file.h34
-rw-r--r--gnulib/lib/cosl.c98
-rw-r--r--gnulib/lib/count-one-bits.h77
-rw-r--r--gnulib/lib/crc.c103
-rw-r--r--gnulib/lib/crc.h47
-rw-r--r--gnulib/lib/creat-safer.c31
-rw-r--r--gnulib/lib/csharpcomp.c573
-rw-r--r--gnulib/lib/csharpcomp.h40
-rw-r--r--gnulib/lib/csharpexec.c345
-rw-r--r--gnulib/lib/csharpexec.h43
-rw-r--r--gnulib/lib/ctype.in.h55
-rw-r--r--gnulib/lib/cycle-check.c85
-rw-r--r--gnulib/lib/cycle-check.h52
-rw-r--r--gnulib/lib/des.c669
-rw-r--r--gnulib/lib/des.h121
-rw-r--r--gnulib/lib/dev-ino.h13
-rw-r--r--gnulib/lib/diacrit.c161
-rw-r--r--gnulib/lib/diacrit.h27
-rw-r--r--gnulib/lib/diffseq.h500
-rw-r--r--gnulib/lib/dirchownmod.c141
-rw-r--r--gnulib/lib/dirchownmod.h2
-rw-r--r--gnulib/lib/dirent--.h23
-rw-r--r--gnulib/lib/dirent-safer.h22
-rw-r--r--gnulib/lib/dirent.in.h126
-rw-r--r--gnulib/lib/dirfd.c32
-rw-r--r--gnulib/lib/dirname-lgpl.c86
-rw-r--r--gnulib/lib/dirname.c38
-rw-r--r--gnulib/lib/dirname.h74
-rw-r--r--gnulib/lib/dprintf.c70
-rw-r--r--gnulib/lib/dummy.c42
-rw-r--r--gnulib/lib/dup-safer-flag.c44
-rw-r--r--gnulib/lib/dup-safer.c34
-rw-r--r--gnulib/lib/dup2.c128
-rw-r--r--gnulib/lib/dup3.c123
-rw-r--r--gnulib/lib/duplocale.c100
-rw-r--r--gnulib/lib/eealloc.h70
-rw-r--r--gnulib/lib/errno.in.h160
-rw-r--r--gnulib/lib/error.c366
-rw-r--r--gnulib/lib/error.h65
-rw-r--r--gnulib/lib/euidaccess.c222
-rw-r--r--gnulib/lib/exclude.c556
-rw-r--r--gnulib/lib/exclude.h52
-rw-r--r--gnulib/lib/execute.c278
-rw-r--r--gnulib/lib/execute.h44
-rw-r--r--gnulib/lib/exitfail.c25
-rw-r--r--gnulib/lib/exitfail.h18
-rw-r--r--gnulib/lib/expl.c135
-rw-r--r--gnulib/lib/faccessat.c44
-rw-r--r--gnulib/lib/fatal-signal.c286
-rw-r--r--gnulib/lib/fatal-signal.h76
-rw-r--r--gnulib/lib/fbufmode.c83
-rw-r--r--gnulib/lib/fbufmode.h36
-rw-r--r--gnulib/lib/fchdir.c287
-rw-r--r--gnulib/lib/fchmodat.c53
-rw-r--r--gnulib/lib/fchown-stub.c16
-rw-r--r--gnulib/lib/fchownat.c107
-rw-r--r--gnulib/lib/fclose.c47
-rw-r--r--gnulib/lib/fcntl--.h32
-rw-r--r--gnulib/lib/fcntl-safer.h27
-rw-r--r--gnulib/lib/fcntl.c294
-rw-r--r--gnulib/lib/fcntl.in.h258
-rw-r--r--gnulib/lib/fd-safer-flag.c52
-rw-r--r--gnulib/lib/fd-safer.c49
-rw-r--r--gnulib/lib/fdopendir.c134
-rw-r--r--gnulib/lib/fdutimensat.c54
-rw-r--r--gnulib/lib/fflush.c218
-rw-r--r--gnulib/lib/file-has-acl.c606
-rw-r--r--gnulib/lib/file-set.c74
-rw-r--r--gnulib/lib/file-set.h12
-rw-r--r--gnulib/lib/file-type.c71
-rw-r--r--gnulib/lib/file-type.h29
-rw-r--r--gnulib/lib/fileblocks.c74
-rw-r--r--gnulib/lib/filemode.c180
-rw-r--r--gnulib/lib/filemode.h33
-rw-r--r--gnulib/lib/filename.h54
-rw-r--r--gnulib/lib/filenamecat-lgpl.c88
-rw-r--r--gnulib/lib/filenamecat.c41
-rw-r--r--gnulib/lib/filenamecat.h27
-rw-r--r--gnulib/lib/filevercmp.c181
-rw-r--r--gnulib/lib/filevercmp.h42
-rw-r--r--gnulib/lib/findprog-lgpl.c20
-rw-r--r--gnulib/lib/findprog.c138
-rw-r--r--gnulib/lib/findprog.h37
-rw-r--r--gnulib/lib/float+.h148
-rw-r--r--gnulib/lib/float.in.h62
-rw-r--r--gnulib/lib/flock.c222
-rw-r--r--gnulib/lib/floor.c93
-rw-r--r--gnulib/lib/floorf.c20
-rw-r--r--gnulib/lib/floorl.c20
-rw-r--r--gnulib/lib/fnmatch.c354
-rw-r--r--gnulib/lib/fnmatch.in.h68
-rw-r--r--gnulib/lib/fnmatch_loop.c1215
-rw-r--r--gnulib/lib/fopen-safer.c63
-rw-r--r--gnulib/lib/fopen.c105
-rw-r--r--gnulib/lib/fpending.c30
-rw-r--r--gnulib/lib/fpending.h34
-rw-r--r--gnulib/lib/fprintf.c77
-rw-r--r--gnulib/lib/fprintftime.c2
-rw-r--r--gnulib/lib/fprintftime.h29
-rw-r--r--gnulib/lib/fpucw.h107
-rw-r--r--gnulib/lib/fpurge.c137
-rw-r--r--gnulib/lib/freadable.c45
-rw-r--r--gnulib/lib/freadable.h42
-rw-r--r--gnulib/lib/freadahead.c85
-rw-r--r--gnulib/lib/freadahead.h38
-rw-r--r--gnulib/lib/freading.c64
-rw-r--r--gnulib/lib/freading.h53
-rw-r--r--gnulib/lib/freadptr.c103
-rw-r--r--gnulib/lib/freadptr.h39
-rw-r--r--gnulib/lib/freadseek.c136
-rw-r--r--gnulib/lib/freadseek.h42
-rw-r--r--gnulib/lib/free.c30
-rw-r--r--gnulib/lib/freopen-safer.c103
-rw-r--r--gnulib/lib/freopen.c46
-rw-r--r--gnulib/lib/frexp.c166
-rw-r--r--gnulib/lib/frexpl.c18
-rw-r--r--gnulib/lib/fseek.c30
-rw-r--r--gnulib/lib/fseeko.c147
-rw-r--r--gnulib/lib/fseterr.c74
-rw-r--r--gnulib/lib/fseterr.h37
-rw-r--r--gnulib/lib/fstatat.c110
-rw-r--r--gnulib/lib/fstrcmp.c271
-rw-r--r--gnulib/lib/fstrcmp.h45
-rw-r--r--gnulib/lib/fsusage.c264
-rw-r--r--gnulib/lib/fsusage.h40
-rw-r--r--gnulib/lib/fsync.c78
-rw-r--r--gnulib/lib/ftell.c38
-rw-r--r--gnulib/lib/ftello.c54
-rw-r--r--gnulib/lib/ftruncate.c90
-rw-r--r--gnulib/lib/fts-cycle.c160
-rw-r--r--gnulib/lib/fts.c2038
-rw-r--r--gnulib/lib/fts_.h263
-rw-r--r--gnulib/lib/full-read.c18
-rw-r--r--gnulib/lib/full-read.h24
-rw-r--r--gnulib/lib/full-write.c79
-rw-r--r--gnulib/lib/full-write.h34
-rw-r--r--gnulib/lib/futimens.c37
-rw-r--r--gnulib/lib/fwritable.c45
-rw-r--r--gnulib/lib/fwritable.h42
-rw-r--r--gnulib/lib/fwriteerror.c181
-rw-r--r--gnulib/lib/fwriteerror.h62
-rw-r--r--gnulib/lib/fwriting.c56
-rw-r--r--gnulib/lib/fwriting.h53
-rw-r--r--gnulib/lib/gai_strerror.c76
-rw-r--r--gnulib/lib/gc-gnulib.c919
-rw-r--r--gnulib/lib/gc-libgcrypt.c726
-rw-r--r--gnulib/lib/gc-pbkdf2-sha1.c104
-rw-r--r--gnulib/lib/gc.h317
-rw-r--r--gnulib/lib/gcd.c87
-rw-r--r--gnulib/lib/gcd.h34
-rw-r--r--gnulib/lib/gen-uni-tables.c8388
-rw-r--r--gnulib/lib/getaddrinfo.c438
-rw-r--r--gnulib/lib/getcwd.c423
-rw-r--r--gnulib/lib/getdate.h22
-rw-r--r--gnulib/lib/getdate.y1572
-rw-r--r--gnulib/lib/getdelim.c137
-rw-r--r--gnulib/lib/getdomainname.c53
-rw-r--r--gnulib/lib/getdtablesize.c63
-rw-r--r--gnulib/lib/getfilecon.c87
-rw-r--r--gnulib/lib/getgroups.c116
-rw-r--r--gnulib/lib/gethostname.c105
-rw-r--r--gnulib/lib/gethrxtime.c68
-rw-r--r--gnulib/lib/gethrxtime.h37
-rw-r--r--gnulib/lib/getline.c29
-rw-r--r--gnulib/lib/getloadavg.c1050
-rw-r--r--gnulib/lib/getlogin.c41
-rw-r--r--gnulib/lib/getlogin_r.c79
-rw-r--r--gnulib/lib/getndelim2.c217
-rw-r--r--gnulib/lib/getndelim2.h42
-rw-r--r--gnulib/lib/getnline.c36
-rw-r--r--gnulib/lib/getnline.h47
-rw-r--r--gnulib/lib/getopt.c1189
-rw-r--r--gnulib/lib/getopt.in.h249
-rw-r--r--gnulib/lib/getopt1.c170
-rw-r--r--gnulib/lib/getopt_int.h132
-rw-r--r--gnulib/lib/getpagesize.c39
-rw-r--r--gnulib/lib/getpass.c230
-rw-r--r--gnulib/lib/getpass.h31
-rw-r--r--gnulib/lib/getpeername.c40
-rw-r--r--gnulib/lib/getsockname.c40
-rw-r--r--gnulib/lib/getsockopt.c67
-rw-r--r--gnulib/lib/getsubopt.c82
-rw-r--r--gnulib/lib/gettext.h280
-rw-r--r--gnulib/lib/gettime.c48
-rw-r--r--gnulib/lib/gettimeofday.c144
-rw-r--r--gnulib/lib/getugroups.c125
-rw-r--r--gnulib/lib/getugroups.h19
-rw-r--r--gnulib/lib/getusershell.c173
-rw-r--r--gnulib/lib/git-merge-changelog.c1646
-rw-r--r--gnulib/lib/gl_anyavltree_list1.h70
-rw-r--r--gnulib/lib/gl_anyavltree_list2.h809
-rw-r--r--gnulib/lib/gl_anyhash_list1.h27
-rw-r--r--gnulib/lib/gl_anyhash_list2.h138
-rw-r--r--gnulib/lib/gl_anylinked_list1.h48
-rw-r--r--gnulib/lib/gl_anylinked_list2.h1195
-rw-r--r--gnulib/lib/gl_anyrbtree_list1.h76
-rw-r--r--gnulib/lib/gl_anyrbtree_list2.h1028
-rw-r--r--gnulib/lib/gl_anytree_list1.h41
-rw-r--r--gnulib/lib/gl_anytree_list2.h940
-rw-r--r--gnulib/lib/gl_anytree_oset.h297
-rw-r--r--gnulib/lib/gl_anytreehash_list1.h358
-rw-r--r--gnulib/lib/gl_anytreehash_list2.h213
-rw-r--r--gnulib/lib/gl_array_list.c680
-rw-r--r--gnulib/lib/gl_array_list.h34
-rw-r--r--gnulib/lib/gl_array_oset.c357
-rw-r--r--gnulib/lib/gl_array_oset.h34
-rw-r--r--gnulib/lib/gl_avltree_list.c101
-rw-r--r--gnulib/lib/gl_avltree_list.h34
-rw-r--r--gnulib/lib/gl_avltree_oset.c583
-rw-r--r--gnulib/lib/gl_avltree_oset.h34
-rw-r--r--gnulib/lib/gl_avltreehash_list.c127
-rw-r--r--gnulib/lib/gl_avltreehash_list.h34
-rw-r--r--gnulib/lib/gl_carray_list.c873
-rw-r--r--gnulib/lib/gl_carray_list.h34
-rw-r--r--gnulib/lib/gl_linked_list.c64
-rw-r--r--gnulib/lib/gl_linked_list.h34
-rw-r--r--gnulib/lib/gl_linkedhash_list.c124
-rw-r--r--gnulib/lib/gl_linkedhash_list.h34
-rw-r--r--gnulib/lib/gl_list.c283
-rw-r--r--gnulib/lib/gl_list.h844
-rw-r--r--gnulib/lib/gl_oset.c96
-rw-r--r--gnulib/lib/gl_oset.h289
-rw-r--r--gnulib/lib/gl_rbtree_list.c102
-rw-r--r--gnulib/lib/gl_rbtree_list.h34
-rw-r--r--gnulib/lib/gl_rbtree_oset.c814
-rw-r--r--gnulib/lib/gl_rbtree_oset.h34
-rw-r--r--gnulib/lib/gl_rbtreehash_list.c128
-rw-r--r--gnulib/lib/gl_rbtreehash_list.h34
-rw-r--r--gnulib/lib/gl_sublist.c479
-rw-r--r--gnulib/lib/gl_sublist.h49
-rw-r--r--gnulib/lib/gl_xlist.c128
-rw-r--r--gnulib/lib/gl_xlist.h179
-rw-r--r--gnulib/lib/gl_xoset.c46
-rw-r--r--gnulib/lib/gl_xoset.h67
-rw-r--r--gnulib/lib/gl_xsublist.c35
-rw-r--r--gnulib/lib/gl_xsublist.h53
-rw-r--r--gnulib/lib/glob-libc.h212
-rw-r--r--gnulib/lib/glob.c1552
-rw-r--r--gnulib/lib/glob.in.h67
-rw-r--r--gnulib/lib/glthread/cond.c464
-rw-r--r--gnulib/lib/glthread/cond.h408
-rw-r--r--gnulib/lib/glthread/lock.c1058
-rw-r--r--gnulib/lib/glthread/lock.h927
-rw-r--r--gnulib/lib/glthread/thread.c218
-rw-r--r--gnulib/lib/glthread/thread.h376
-rw-r--r--gnulib/lib/glthread/threadlib.c74
-rw-r--r--gnulib/lib/glthread/tls.c61
-rw-r--r--gnulib/lib/glthread/tls.h298
-rw-r--r--gnulib/lib/glthread/yield.h121
-rw-r--r--gnulib/lib/group-member.c125
-rw-r--r--gnulib/lib/group-member.h25
-rw-r--r--gnulib/lib/hard-locale.c70
-rw-r--r--gnulib/lib/hard-locale.h25
-rw-r--r--gnulib/lib/hash-pjw.c40
-rw-r--r--gnulib/lib/hash-pjw.h23
-rw-r--r--gnulib/lib/hash-triple.c77
-rw-r--r--gnulib/lib/hash-triple.h22
-rw-r--r--gnulib/lib/hash.c1194
-rw-r--r--gnulib/lib/hash.h93
-rw-r--r--gnulib/lib/hmac-md5.c81
-rw-r--r--gnulib/lib/hmac-sha1.c81
-rw-r--r--gnulib/lib/hmac.h41
-rw-r--r--gnulib/lib/human.c471
-rw-r--r--gnulib/lib/human.h84
-rw-r--r--gnulib/lib/i-ring.c68
-rw-r--r--gnulib/lib/i-ring.h44
-rw-r--r--gnulib/lib/iconv.c450
-rw-r--r--gnulib/lib/iconv.in.h74
-rw-r--r--gnulib/lib/iconv_close.c47
-rw-r--r--gnulib/lib/iconv_open-aix.gperf44
-rw-r--r--gnulib/lib/iconv_open-hpux.gperf56
-rw-r--r--gnulib/lib/iconv_open-irix.gperf31
-rw-r--r--gnulib/lib/iconv_open-osf.gperf50
-rw-r--r--gnulib/lib/iconv_open-solaris.gperf30
-rw-r--r--gnulib/lib/iconv_open.c173
-rw-r--r--gnulib/lib/iconveh.h41
-rw-r--r--gnulib/lib/idcache.c227
-rw-r--r--gnulib/lib/idcache.h11
-rw-r--r--gnulib/lib/idpriv-drop.c129
-rw-r--r--gnulib/lib/idpriv-droptemp.c204
-rw-r--r--gnulib/lib/idpriv.h116
-rw-r--r--gnulib/lib/ignore-value.h37
-rw-r--r--gnulib/lib/imaxabs.c26
-rw-r--r--gnulib/lib/imaxdiv.c63
-rw-r--r--gnulib/lib/imaxtostr.c4
-rw-r--r--gnulib/lib/inet_ntop.c234
-rw-r--r--gnulib/lib/inet_pton.c253
-rw-r--r--gnulib/lib/intprops.h83
-rw-r--r--gnulib/lib/inttostr.c54
-rw-r--r--gnulib/lib/inttostr.h45
-rw-r--r--gnulib/lib/inttypes.in.h1103
-rw-r--r--gnulib/lib/ioctl.c51
-rw-r--r--gnulib/lib/isapipe.c119
-rw-r--r--gnulib/lib/isapipe.h6
-rw-r--r--gnulib/lib/isblank.c33
-rw-r--r--gnulib/lib/isdir.c33
-rw-r--r--gnulib/lib/isdir.h1
-rw-r--r--gnulib/lib/isfinite.c39
-rw-r--r--gnulib/lib/isinf.c37
-rw-r--r--gnulib/lib/isnan.c173
-rw-r--r--gnulib/lib/isnand-nolibm.h33
-rw-r--r--gnulib/lib/isnand.c19
-rw-r--r--gnulib/lib/isnanf-nolibm.h33
-rw-r--r--gnulib/lib/isnanf.c20
-rw-r--r--gnulib/lib/isnanl-nolibm.h33
-rw-r--r--gnulib/lib/isnanl.c20
-rw-r--r--gnulib/lib/javacomp.c2355
-rw-r--r--gnulib/lib/javacomp.h75
-rw-r--r--gnulib/lib/javaexec.c429
-rw-r--r--gnulib/lib/javaexec.h50
-rw-r--r--gnulib/lib/javaversion.c119
-rw-r--r--gnulib/lib/javaversion.classbin0 -> 510 bytes
-rw-r--r--gnulib/lib/javaversion.h39
-rw-r--r--gnulib/lib/javaversion.java31
-rw-r--r--gnulib/lib/langinfo.in.h162
-rw-r--r--gnulib/lib/lchown.c116
-rw-r--r--gnulib/lib/ldexpl.c77
-rw-r--r--gnulib/lib/linebuffer.c103
-rw-r--r--gnulib/lib/linebuffer.h53
-rw-r--r--gnulib/lib/link.c203
-rw-r--r--gnulib/lib/linkat.c290
-rw-r--r--gnulib/lib/listen.c40
-rw-r--r--gnulib/lib/localcharset.c549
-rw-r--r--gnulib/lib/localcharset.h41
-rw-r--r--gnulib/lib/locale.in.h62
-rw-r--r--gnulib/lib/localename.c2930
-rw-r--r--gnulib/lib/localename.h97
-rw-r--r--gnulib/lib/logl.c261
-rw-r--r--gnulib/lib/long-options.c88
-rw-r--r--gnulib/lib/long-options.h26
-rw-r--r--gnulib/lib/lseek.c62
-rw-r--r--gnulib/lib/lstat.c91
-rw-r--r--gnulib/lib/malloc.c57
-rw-r--r--gnulib/lib/malloca.c137
-rw-r--r--gnulib/lib/malloca.h134
-rw-r--r--gnulib/lib/malloca.valgrind7
-rw-r--r--gnulib/lib/math.in.h633
-rw-r--r--gnulib/lib/mbchar.c35
-rw-r--r--gnulib/lib/mbchar.h350
-rw-r--r--gnulib/lib/mbfile.h242
-rw-r--r--gnulib/lib/mbiter.h215
-rw-r--r--gnulib/lib/mbmemcasecmp.c96
-rw-r--r--gnulib/lib/mbmemcasecmp.h45
-rw-r--r--gnulib/lib/mbmemcasecoll.c186
-rw-r--r--gnulib/lib/mbmemcasecoll.h58
-rw-r--r--gnulib/lib/mbrlen.c32
-rw-r--r--gnulib/lib/mbrtowc.c386
-rw-r--r--gnulib/lib/mbscasecmp.c98
-rw-r--r--gnulib/lib/mbscasestr.c409
-rw-r--r--gnulib/lib/mbschr.c52
-rw-r--r--gnulib/lib/mbscspn.c68
-rw-r--r--gnulib/lib/mbsinit.c47
-rw-r--r--gnulib/lib/mbslen.c44
-rw-r--r--gnulib/lib/mbsncasecmp.c99
-rw-r--r--gnulib/lib/mbsnlen.c45
-rw-r--r--gnulib/lib/mbsnrtowcs.c139
-rw-r--r--gnulib/lib/mbspbrk.c63
-rw-r--r--gnulib/lib/mbspcasecmp.c95
-rw-r--r--gnulib/lib/mbsrchr.c49
-rw-r--r--gnulib/lib/mbsrtowcs-state.c37
-rw-r--r--gnulib/lib/mbsrtowcs.c136
-rw-r--r--gnulib/lib/mbssep.c61
-rw-r--r--gnulib/lib/mbsspn.c89
-rw-r--r--gnulib/lib/mbsstr.c379
-rw-r--r--gnulib/lib/mbstok_r.c66
-rw-r--r--gnulib/lib/mbswidth.c167
-rw-r--r--gnulib/lib/mbswidth.h60
-rw-r--r--gnulib/lib/mbuiter.h222
-rw-r--r--gnulib/lib/md2.c275
-rw-r--r--gnulib/lib/md2.h85
-rw-r--r--gnulib/lib/md4.c390
-rw-r--r--gnulib/lib/md4.h91
-rw-r--r--gnulib/lib/md5.c462
-rw-r--r--gnulib/lib/md5.h126
-rw-r--r--gnulib/lib/memcasecmp.c49
-rw-r--r--gnulib/lib/memcasecmp.h22
-rw-r--r--gnulib/lib/memchr.c172
-rw-r--r--gnulib/lib/memchr.valgrind14
-rw-r--r--gnulib/lib/memchr2.c164
-rw-r--r--gnulib/lib/memchr2.h31
-rw-r--r--gnulib/lib/memchr2.valgrind14
-rw-r--r--gnulib/lib/memcmp.c363
-rw-r--r--gnulib/lib/memcmp2.c36
-rw-r--r--gnulib/lib/memcmp2.h39
-rw-r--r--gnulib/lib/memcoll.c96
-rw-r--r--gnulib/lib/memcoll.h27
-rw-r--r--gnulib/lib/memcpy.c36
-rw-r--r--gnulib/lib/memmem.c76
-rw-r--r--gnulib/lib/memmove.c26
-rw-r--r--gnulib/lib/mempcpy.c29
-rw-r--r--gnulib/lib/memrchr.c161
-rw-r--r--gnulib/lib/memset.c28
-rw-r--r--gnulib/lib/memxfrm.c137
-rw-r--r--gnulib/lib/memxfrm.h48
-rw-r--r--gnulib/lib/memxor.c35
-rw-r--r--gnulib/lib/memxor.h31
-rw-r--r--gnulib/lib/mgetgroups.c206
-rw-r--r--gnulib/lib/mgetgroups.h20
-rw-r--r--gnulib/lib/minmax.h61
-rw-r--r--gnulib/lib/mkancesdirs.c153
-rw-r--r--gnulib/lib/mkancesdirs.h4
-rw-r--r--gnulib/lib/mkdir-p.c208
-rw-r--r--gnulib/lib/mkdir-p.h35
-rw-r--r--gnulib/lib/mkdir.c92
-rw-r--r--gnulib/lib/mkdirat.c34
-rw-r--r--gnulib/lib/mkdtemp.c39
-rw-r--r--gnulib/lib/mkfifo.c58
-rw-r--r--gnulib/lib/mkfifoat.c55
-rw-r--r--gnulib/lib/mknod.c74
-rw-r--r--gnulib/lib/mknodat.c57
-rw-r--r--gnulib/lib/mkostemp.c46
-rw-r--r--gnulib/lib/mkostemps.c54
-rw-r--r--gnulib/lib/mkstemp-safer.c63
-rw-r--r--gnulib/lib/mkstemp.c46
-rw-r--r--gnulib/lib/mkstemps.c54
-rw-r--r--gnulib/lib/mktime-internal.h4
-rw-r--r--gnulib/lib/mktime.c669
-rw-r--r--gnulib/lib/modechange.c385
-rw-r--r--gnulib/lib/modechange.h30
-rw-r--r--gnulib/lib/mountlist.c880
-rw-r--r--gnulib/lib/mountlist.h40
-rw-r--r--gnulib/lib/mpsort.c156
-rw-r--r--gnulib/lib/mpsort.h2
-rw-r--r--gnulib/lib/nanosleep.c177
-rw-r--r--gnulib/lib/netdb.in.h192
-rw-r--r--gnulib/lib/netinet_in.in.h47
-rw-r--r--gnulib/lib/nl_langinfo.c260
-rw-r--r--gnulib/lib/nproc.c358
-rw-r--r--gnulib/lib/nproc.h47
-rw-r--r--gnulib/lib/obstack.c430
-rw-r--r--gnulib/lib/obstack.h512
-rw-r--r--gnulib/lib/obstack_printf.c92
-rw-r--r--gnulib/lib/offtostr.c4
-rw-r--r--gnulib/lib/open-safer.c46
-rw-r--r--gnulib/lib/open.c166
-rw-r--r--gnulib/lib/openat-die.c56
-rw-r--r--gnulib/lib/openat-priv.h44
-rw-r--r--gnulib/lib/openat-proc.c105
-rw-r--r--gnulib/lib/openat-safer.c46
-rw-r--r--gnulib/lib/openat.c265
-rw-r--r--gnulib/lib/openat.h114
-rw-r--r--gnulib/lib/opendir-safer.c68
-rw-r--r--gnulib/lib/pagealign_alloc.c194
-rw-r--r--gnulib/lib/pagealign_alloc.h48
-rw-r--r--gnulib/lib/parse-duration.c595
-rw-r--r--gnulib/lib/parse-duration.h90
-rw-r--r--gnulib/lib/pathmax.h48
-rw-r--r--gnulib/lib/perror.c35
-rw-r--r--gnulib/lib/physmem.c304
-rw-r--r--gnulib/lib/physmem.h26
-rw-r--r--gnulib/lib/pipe-filter-aux.h116
-rw-r--r--gnulib/lib/pipe-filter-gi.c558
-rw-r--r--gnulib/lib/pipe-filter-ii.c446
-rw-r--r--gnulib/lib/pipe-filter.h237
-rw-r--r--gnulib/lib/pipe-safer.c56
-rw-r--r--gnulib/lib/pipe.c445
-rw-r--r--gnulib/lib/pipe.h146
-rw-r--r--gnulib/lib/pipe2-safer.c52
-rw-r--r--gnulib/lib/pipe2.c141
-rw-r--r--gnulib/lib/poll.c595
-rw-r--r--gnulib/lib/poll.in.h53
-rw-r--r--gnulib/lib/popen-safer.c93
-rw-r--r--gnulib/lib/popen.c82
-rw-r--r--gnulib/lib/posixtm.c235
-rw-r--r--gnulib/lib/posixtm.h36
-rw-r--r--gnulib/lib/posixver.c54
-rw-r--r--gnulib/lib/posixver.h1
-rw-r--r--gnulib/lib/pread.c65
-rw-r--r--gnulib/lib/printf-args.c188
-rw-r--r--gnulib/lib/printf-args.h155
-rw-r--r--gnulib/lib/printf-frexp.c188
-rw-r--r--gnulib/lib/printf-frexp.h23
-rw-r--r--gnulib/lib/printf-frexpl.c18
-rw-r--r--gnulib/lib/printf-frexpl.h23
-rw-r--r--gnulib/lib/printf-parse.c627
-rw-r--r--gnulib/lib/printf-parse.h180
-rw-r--r--gnulib/lib/printf.c40
-rw-r--r--gnulib/lib/priv-set.c143
-rw-r--r--gnulib/lib/priv-set.h50
-rw-r--r--gnulib/lib/progname.c92
-rw-r--r--gnulib/lib/progname.h62
-rw-r--r--gnulib/lib/progreloc.c374
-rw-r--r--gnulib/lib/propername.c311
-rw-r--r--gnulib/lib/propername.h106
-rw-r--r--gnulib/lib/pthread.in.h46
-rw-r--r--gnulib/lib/putenv.c132
-rw-r--r--gnulib/lib/quote.c40
-rw-r--r--gnulib/lib/quote.h21
-rw-r--r--gnulib/lib/quotearg.c889
-rw-r--r--gnulib/lib/quotearg.h389
-rw-r--r--gnulib/lib/raise.c30
-rw-r--r--gnulib/lib/random_r.c423
-rw-r--r--gnulib/lib/rawmemchr.c136
-rw-r--r--gnulib/lib/rawmemchr.valgrind12
-rw-r--r--gnulib/lib/read-file.c136
-rw-r--r--gnulib/lib/read-file.h34
-rw-r--r--gnulib/lib/readline.c55
-rw-r--r--gnulib/lib/readline.h34
-rw-r--r--gnulib/lib/readlink.c74
-rw-r--r--gnulib/lib/readtokens.c203
-rw-r--r--gnulib/lib/readtokens.h43
-rw-r--r--gnulib/lib/readtokens0.c99
-rw-r--r--gnulib/lib/readtokens0.h42
-rw-r--r--gnulib/lib/readutmp.c161
-rw-r--r--gnulib/lib/readutmp.h216
-rw-r--r--gnulib/lib/realloc.c88
-rw-r--r--gnulib/lib/recv.c40
-rw-r--r--gnulib/lib/recvfrom.c48
-rw-r--r--gnulib/lib/regcomp.c3869
-rw-r--r--gnulib/lib/regex.c72
-rw-r--r--gnulib/lib/regex.h676
-rw-r--r--gnulib/lib/regex_internal.c1740
-rw-r--r--gnulib/lib/regex_internal.h871
-rw-r--r--gnulib/lib/regexec.c4416
-rw-r--r--gnulib/lib/relocatable.c493
-rw-r--r--gnulib/lib/relocatable.h83
-rw-r--r--gnulib/lib/relocwrapper.c192
-rw-r--r--gnulib/lib/remove.c43
-rw-r--r--gnulib/lib/rename.c473
-rw-r--r--gnulib/lib/renameat.c157
-rw-r--r--gnulib/lib/rijndael-alg-fst.c1083
-rw-r--r--gnulib/lib/rijndael-alg-fst.h67
-rw-r--r--gnulib/lib/rijndael-api-fst.c521
-rw-r--r--gnulib/lib/rijndael-api-fst.h207
-rw-r--r--gnulib/lib/rmdir.c99
-rw-r--r--gnulib/lib/round.c154
-rw-r--r--gnulib/lib/roundf.c19
-rw-r--r--gnulib/lib/roundl.c19
-rw-r--r--gnulib/lib/rpmatch.c173
-rw-r--r--gnulib/lib/safe-alloc.c121
-rw-r--r--gnulib/lib/safe-alloc.h121
-rw-r--r--gnulib/lib/safe-read.c77
-rw-r--r--gnulib/lib/safe-read.h34
-rw-r--r--gnulib/lib/safe-write.c18
-rw-r--r--gnulib/lib/safe-write.h24
-rw-r--r--gnulib/lib/same-inode.h25
-rw-r--r--gnulib/lib/same.c123
-rw-r--r--gnulib/lib/same.h25
-rw-r--r--gnulib/lib/save-cwd.c109
-rw-r--r--gnulib/lib/save-cwd.h34
-rw-r--r--gnulib/lib/savedir.c130
-rw-r--r--gnulib/lib/savedir.h27
-rw-r--r--gnulib/lib/savewd.c305
-rw-r--r--gnulib/lib/savewd.h148
-rw-r--r--gnulib/lib/scandir.c181
-rw-r--r--gnulib/lib/sched.in.h47
-rw-r--r--gnulib/lib/se-context.in.h28
-rw-r--r--gnulib/lib/se-selinux.in.h75
-rw-r--r--gnulib/lib/search.in.h131
-rw-r--r--gnulib/lib/select.c489
-rw-r--r--gnulib/lib/selinux-at.c72
-rw-r--r--gnulib/lib/selinux-at.h52
-rw-r--r--gnulib/lib/send.c40
-rw-r--r--gnulib/lib/sendto.c41
-rw-r--r--gnulib/lib/set-mode-acl.c593
-rw-r--r--gnulib/lib/setenv.c383
-rw-r--r--gnulib/lib/setsockopt.c56
-rw-r--r--gnulib/lib/settime.c59
-rw-r--r--gnulib/lib/sh-quote.c107
-rw-r--r--gnulib/lib/sh-quote.h36
-rw-r--r--gnulib/lib/sha1.c428
-rw-r--r--gnulib/lib/sha1.h92
-rw-r--r--gnulib/lib/sha256.c569
-rw-r--r--gnulib/lib/sha256.h91
-rw-r--r--gnulib/lib/sha512.c619
-rw-r--r--gnulib/lib/sha512.h95
-rw-r--r--gnulib/lib/shutdown.c40
-rw-r--r--gnulib/lib/sig-handler.h44
-rw-r--r--gnulib/lib/sig2str.c343
-rw-r--r--gnulib/lib/sig2str.h43
-rw-r--r--gnulib/lib/sigaction.c204
-rw-r--r--gnulib/lib/siglist.h130
-rw-r--r--gnulib/lib/signal.in.h249
-rw-r--r--gnulib/lib/signbitd.c64
-rw-r--r--gnulib/lib/signbitf.c64
-rw-r--r--gnulib/lib/signbitl.c64
-rw-r--r--gnulib/lib/sigpipe-die.c82
-rw-r--r--gnulib/lib/sigpipe-die.h74
-rw-r--r--gnulib/lib/sigprocmask.c329
-rw-r--r--gnulib/lib/sincosl.c898
-rw-r--r--gnulib/lib/sinl.c104
-rw-r--r--gnulib/lib/size_max.h31
-rw-r--r--gnulib/lib/sleep.c75
-rw-r--r--gnulib/lib/snprintf.c72
-rw-r--r--gnulib/lib/socket.c49
-rw-r--r--gnulib/lib/sockets.c118
-rw-r--r--gnulib/lib/sockets.h51
-rw-r--r--gnulib/lib/spawn.c33
-rw-r--r--gnulib/lib/spawn.in.h548
-rw-r--r--gnulib/lib/spawn_faction_addclose.c59
-rw-r--r--gnulib/lib/spawn_faction_adddup2.c60
-rw-r--r--gnulib/lib/spawn_faction_addopen.c63
-rw-r--r--gnulib/lib/spawn_faction_destroy.c31
-rw-r--r--gnulib/lib/spawn_faction_init.c56
-rw-r--r--gnulib/lib/spawn_int.h62
-rw-r--r--gnulib/lib/spawnattr_destroy.c28
-rw-r--r--gnulib/lib/spawnattr_getdefault.c34
-rw-r--r--gnulib/lib/spawnattr_getflags.c32
-rw-r--r--gnulib/lib/spawnattr_getpgroup.c32
-rw-r--r--gnulib/lib/spawnattr_getschedparam.c31
-rw-r--r--gnulib/lib/spawnattr_getschedpolicy.c33
-rw-r--r--gnulib/lib/spawnattr_getsigmask.c33
-rw-r--r--gnulib/lib/spawnattr_init.c33
-rw-r--r--gnulib/lib/spawnattr_setdefault.c33
-rw-r--r--gnulib/lib/spawnattr_setflags.c45
-rw-r--r--gnulib/lib/spawnattr_setpgroup.c32
-rw-r--r--gnulib/lib/spawnattr_setschedparam.c31
-rw-r--r--gnulib/lib/spawnattr_setschedpolicy.c36
-rw-r--r--gnulib/lib/spawnattr_setsigmask.c33
-rw-r--r--gnulib/lib/spawni.c374
-rw-r--r--gnulib/lib/spawnp.c33
-rw-r--r--gnulib/lib/sprintf.c80
-rw-r--r--gnulib/lib/sqrtl.c59
-rw-r--r--gnulib/lib/stat-macros.h3
-rw-r--r--gnulib/lib/stat-time.h187
-rw-r--r--gnulib/lib/stat.c104
-rw-r--r--gnulib/lib/stdarg.in.h35
-rw-r--r--gnulib/lib/stdbool.in.h119
-rw-r--r--gnulib/lib/stddef.in.h86
-rw-r--r--gnulib/lib/stdint.in.h567
-rw-r--r--gnulib/lib/stdio--.h41
-rw-r--r--gnulib/lib/stdio-impl.h94
-rw-r--r--gnulib/lib/stdio-safer.h36
-rw-r--r--gnulib/lib/stdio-write.c150
-rw-r--r--gnulib/lib/stdio.in.h675
-rw-r--r--gnulib/lib/stdlib--.h36
-rw-r--r--gnulib/lib/stdlib-safer.h32
-rw-r--r--gnulib/lib/stdlib.in.h497
-rw-r--r--gnulib/lib/stpcpy.c49
-rw-r--r--gnulib/lib/stpncpy.c92
-rw-r--r--gnulib/lib/str-kmp.h150
-rw-r--r--gnulib/lib/str-two-way.h429
-rw-r--r--gnulib/lib/strcasecmp.c63
-rw-r--r--gnulib/lib/strcasestr.c83
-rw-r--r--gnulib/lib/strchrnul.c142
-rw-r--r--gnulib/lib/strchrnul.valgrind12
-rw-r--r--gnulib/lib/strcspn.c41
-rw-r--r--gnulib/lib/strdup.c55
-rw-r--r--gnulib/lib/streq.h176
-rw-r--r--gnulib/lib/strerror.c347
-rw-r--r--gnulib/lib/strftime.c1465
-rw-r--r--gnulib/lib/strftime.h34
-rw-r--r--gnulib/lib/striconv.c457
-rw-r--r--gnulib/lib/striconv.h76
-rw-r--r--gnulib/lib/striconveh.c1187
-rw-r--r--gnulib/lib/striconveh.h140
-rw-r--r--gnulib/lib/striconveha.c348
-rw-r--r--gnulib/lib/striconveha.h95
-rw-r--r--gnulib/lib/string.in.h642
-rw-r--r--gnulib/lib/strings.in.h93
-rw-r--r--gnulib/lib/stripslash.c45
-rw-r--r--gnulib/lib/strncasecmp.c63
-rw-r--r--gnulib/lib/strndup.c37
-rw-r--r--gnulib/lib/strnlen.c31
-rw-r--r--gnulib/lib/strnlen1.c35
-rw-r--r--gnulib/lib/strnlen1.h39
-rw-r--r--gnulib/lib/strpbrk.c42
-rw-r--r--gnulib/lib/strptime.c1139
-rw-r--r--gnulib/lib/strsep.c58
-rw-r--r--gnulib/lib/strsignal.c196
-rw-r--r--gnulib/lib/strstr.c83
-rw-r--r--gnulib/lib/strtod.c276
-rw-r--r--gnulib/lib/strtoimax.c75
-rw-r--r--gnulib/lib/strtok_r.c76
-rw-r--r--gnulib/lib/strtol.c434
-rw-r--r--gnulib/lib/strtoll.c33
-rw-r--r--gnulib/lib/strtoul.c19
-rw-r--r--gnulib/lib/strtoull.c27
-rw-r--r--gnulib/lib/strtoumax.c2
-rw-r--r--gnulib/lib/strverscmp.c132
-rw-r--r--gnulib/lib/symlink.c57
-rw-r--r--gnulib/lib/symlinkat.c102
-rw-r--r--gnulib/lib/sys_file.in.h62
-rw-r--r--gnulib/lib/sys_ioctl.in.h73
-rw-r--r--gnulib/lib/sys_select.in.h103
-rw-r--r--gnulib/lib/sys_socket.in.h462
-rw-r--r--gnulib/lib/sys_stat.in.h548
-rw-r--r--gnulib/lib/sys_time.in.h79
-rw-r--r--gnulib/lib/sys_times.in.h77
-rw-r--r--gnulib/lib/sys_utsname.in.h96
-rw-r--r--gnulib/lib/sys_wait.in.h106
-rw-r--r--gnulib/lib/sysexits.in.h71
-rwxr-xr-xgnulib/lib/t-idcache52
-rw-r--r--gnulib/lib/tanl.c223
-rw-r--r--gnulib/lib/tempname.c311
-rw-r--r--gnulib/lib/tempname.h50
-rw-r--r--gnulib/lib/time.in.h134
-rw-r--r--gnulib/lib/time_r.c47
-rw-r--r--gnulib/lib/timegm.c39
-rw-r--r--gnulib/lib/times.c67
-rw-r--r--gnulib/lib/timespec.h39
-rw-r--r--gnulib/lib/tmpdir.c133
-rw-r--r--gnulib/lib/tmpdir.h26
-rw-r--r--gnulib/lib/tmpfile-safer.c69
-rw-r--r--gnulib/lib/tmpfile.c124
-rw-r--r--gnulib/lib/trigl.c636
-rw-r--r--gnulib/lib/trigl.h24
-rw-r--r--gnulib/lib/trim.c133
-rw-r--r--gnulib/lib/trim.h33
-rw-r--r--gnulib/lib/trunc.c93
-rw-r--r--gnulib/lib/truncf.c20
-rw-r--r--gnulib/lib/truncl.c20
-rw-r--r--gnulib/lib/tsearch.c687
-rw-r--r--gnulib/lib/u64.h159
-rw-r--r--gnulib/lib/uinttostr.c4
-rw-r--r--gnulib/lib/umaxtostr.c4
-rw-r--r--gnulib/lib/uname.c268
-rw-r--r--gnulib/lib/unicase.h457
-rw-r--r--gnulib/lib/unicase/cased.c53
-rw-r--r--gnulib/lib/unicase/cased.h343
-rw-r--r--gnulib/lib/unicase/casefold.h22
-rw-r--r--gnulib/lib/unicase/caseprop.h32
-rw-r--r--gnulib/lib/unicase/context.h65
-rw-r--r--gnulib/lib/unicase/empty-prefix-context.c27
-rw-r--r--gnulib/lib/unicase/empty-suffix-context.c27
-rw-r--r--gnulib/lib/unicase/ignorable.c71
-rw-r--r--gnulib/lib/unicase/ignorable.h544
-rw-r--r--gnulib/lib/unicase/invariant.h45
-rw-r--r--gnulib/lib/unicase/locale-language.c55
-rw-r--r--gnulib/lib/unicase/locale-languages.gperf270
-rw-r--r--gnulib/lib/unicase/simple-mapping.h39
-rw-r--r--gnulib/lib/unicase/special-casing-table.gperf136
-rw-r--r--gnulib/lib/unicase/special-casing.c25
-rw-r--r--gnulib/lib/unicase/special-casing.h60
-rw-r--r--gnulib/lib/unicase/tocasefold.c27
-rw-r--r--gnulib/lib/unicase/tocasefold.h567
-rw-r--r--gnulib/lib/unicase/tolower.c27
-rw-r--r--gnulib/lib/unicase/tolower.h567
-rw-r--r--gnulib/lib/unicase/totitle.c27
-rw-r--r--gnulib/lib/unicase/totitle.h615
-rw-r--r--gnulib/lib/unicase/toupper.c27
-rw-r--r--gnulib/lib/unicase/toupper.h615
-rw-r--r--gnulib/lib/unicase/u-casecmp.h69
-rw-r--r--gnulib/lib/unicase/u-casecoll.h68
-rw-r--r--gnulib/lib/unicase/u-casefold.h28
-rw-r--r--gnulib/lib/unicase/u-casemap.h416
-rw-r--r--gnulib/lib/unicase/u-casexfrm.h88
-rw-r--r--gnulib/lib/unicase/u-ct-casefold.h107
-rw-r--r--gnulib/lib/unicase/u-ct-totitle.h501
-rw-r--r--gnulib/lib/unicase/u-is-cased.h128
-rw-r--r--gnulib/lib/unicase/u-is-invariant.h64
-rw-r--r--gnulib/lib/unicase/u-prefix-context.h92
-rw-r--r--gnulib/lib/unicase/u-suffix-context.h90
-rw-r--r--gnulib/lib/unicase/u-totitle.h28
-rw-r--r--gnulib/lib/unicase/u16-casecmp.c35
-rw-r--r--gnulib/lib/unicase/u16-casecoll.c32
-rw-r--r--gnulib/lib/unicase/u16-casefold.c26
-rw-r--r--gnulib/lib/unicase/u16-casemap.c40
-rw-r--r--gnulib/lib/unicase/u16-casexfrm.c35
-rw-r--r--gnulib/lib/unicase/u16-ct-casefold.c35
-rw-r--r--gnulib/lib/unicase/u16-ct-tolower.c40
-rw-r--r--gnulib/lib/unicase/u16-ct-totitle.c43
-rw-r--r--gnulib/lib/unicase/u16-ct-toupper.c40
-rw-r--r--gnulib/lib/unicase/u16-is-cased.c36
-rw-r--r--gnulib/lib/unicase/u16-is-casefolded.c30
-rw-r--r--gnulib/lib/unicase/u16-is-invariant.c34
-rw-r--r--gnulib/lib/unicase/u16-is-lowercase.c30
-rw-r--r--gnulib/lib/unicase/u16-is-titlecase.c30
-rw-r--r--gnulib/lib/unicase/u16-is-uppercase.c30
-rw-r--r--gnulib/lib/unicase/u16-prefix-context.c33
-rw-r--r--gnulib/lib/unicase/u16-suffix-context.c32
-rw-r--r--gnulib/lib/unicase/u16-tolower.c39
-rw-r--r--gnulib/lib/unicase/u16-totitle.c27
-rw-r--r--gnulib/lib/unicase/u16-toupper.c39
-rw-r--r--gnulib/lib/unicase/u32-casecmp.c35
-rw-r--r--gnulib/lib/unicase/u32-casecoll.c32
-rw-r--r--gnulib/lib/unicase/u32-casefold.c26
-rw-r--r--gnulib/lib/unicase/u32-casemap.c40
-rw-r--r--gnulib/lib/unicase/u32-casexfrm.c35
-rw-r--r--gnulib/lib/unicase/u32-ct-casefold.c35
-rw-r--r--gnulib/lib/unicase/u32-ct-tolower.c40
-rw-r--r--gnulib/lib/unicase/u32-ct-totitle.c43
-rw-r--r--gnulib/lib/unicase/u32-ct-toupper.c40
-rw-r--r--gnulib/lib/unicase/u32-is-cased.c36
-rw-r--r--gnulib/lib/unicase/u32-is-casefolded.c30
-rw-r--r--gnulib/lib/unicase/u32-is-invariant.c34
-rw-r--r--gnulib/lib/unicase/u32-is-lowercase.c30
-rw-r--r--gnulib/lib/unicase/u32-is-titlecase.c30
-rw-r--r--gnulib/lib/unicase/u32-is-uppercase.c30
-rw-r--r--gnulib/lib/unicase/u32-prefix-context.c33
-rw-r--r--gnulib/lib/unicase/u32-suffix-context.c32
-rw-r--r--gnulib/lib/unicase/u32-tolower.c39
-rw-r--r--gnulib/lib/unicase/u32-totitle.c26
-rw-r--r--gnulib/lib/unicase/u32-toupper.c39
-rw-r--r--gnulib/lib/unicase/u8-casecmp.c35
-rw-r--r--gnulib/lib/unicase/u8-casecoll.c32
-rw-r--r--gnulib/lib/unicase/u8-casefold.c107
-rw-r--r--gnulib/lib/unicase/u8-casemap.c40
-rw-r--r--gnulib/lib/unicase/u8-casexfrm.c35
-rw-r--r--gnulib/lib/unicase/u8-ct-casefold.c35
-rw-r--r--gnulib/lib/unicase/u8-ct-tolower.c40
-rw-r--r--gnulib/lib/unicase/u8-ct-totitle.c43
-rw-r--r--gnulib/lib/unicase/u8-ct-toupper.c40
-rw-r--r--gnulib/lib/unicase/u8-is-cased.c36
-rw-r--r--gnulib/lib/unicase/u8-is-casefolded.c30
-rw-r--r--gnulib/lib/unicase/u8-is-invariant.c34
-rw-r--r--gnulib/lib/unicase/u8-is-lowercase.c30
-rw-r--r--gnulib/lib/unicase/u8-is-titlecase.c30
-rw-r--r--gnulib/lib/unicase/u8-is-uppercase.c30
-rw-r--r--gnulib/lib/unicase/u8-prefix-context.c33
-rw-r--r--gnulib/lib/unicase/u8-suffix-context.c32
-rw-r--r--gnulib/lib/unicase/u8-tolower.c120
-rw-r--r--gnulib/lib/unicase/u8-totitle.c107
-rw-r--r--gnulib/lib/unicase/u8-toupper.c120
-rw-r--r--gnulib/lib/unicase/ulc-casecmp.c74
-rw-r--r--gnulib/lib/unicase/ulc-casecoll.c31
-rw-r--r--gnulib/lib/unicase/ulc-casexfrm.c64
-rw-r--r--gnulib/lib/unicase/unicasemap.h52
-rw-r--r--gnulib/lib/unicodeio.c214
-rw-r--r--gnulib/lib/unicodeio.h48
-rw-r--r--gnulib/lib/uniconv.h172
-rw-r--r--gnulib/lib/uniconv/u-conv-from-enc.h91
-rw-r--r--gnulib/lib/uniconv/u-conv-to-enc.h156
-rw-r--r--gnulib/lib/uniconv/u-strconv-from-enc.h40
-rw-r--r--gnulib/lib/uniconv/u-strconv-to-enc.h63
-rw-r--r--gnulib/lib/uniconv/u16-conv-from-enc.c47
-rw-r--r--gnulib/lib/uniconv/u16-conv-to-enc.c177
-rw-r--r--gnulib/lib/uniconv/u16-strconv-from-enc.c34
-rw-r--r--gnulib/lib/uniconv/u16-strconv-from-locale.c29
-rw-r--r--gnulib/lib/uniconv/u16-strconv-to-enc.c50
-rw-r--r--gnulib/lib/uniconv/u16-strconv-to-locale.c29
-rw-r--r--gnulib/lib/uniconv/u32-conv-from-enc.c46
-rw-r--r--gnulib/lib/uniconv/u32-conv-to-enc.c49
-rw-r--r--gnulib/lib/uniconv/u32-strconv-from-enc.c34
-rw-r--r--gnulib/lib/uniconv/u32-strconv-from-locale.c29
-rw-r--r--gnulib/lib/uniconv/u32-strconv-to-enc.c49
-rw-r--r--gnulib/lib/uniconv/u32-strconv-to-locale.c29
-rw-r--r--gnulib/lib/uniconv/u8-conv-from-enc.c105
-rw-r--r--gnulib/lib/uniconv/u8-conv-to-enc.c92
-rw-r--r--gnulib/lib/uniconv/u8-strconv-from-enc.c34
-rw-r--r--gnulib/lib/uniconv/u8-strconv-from-locale.c29
-rw-r--r--gnulib/lib/uniconv/u8-strconv-to-enc.c79
-rw-r--r--gnulib/lib/uniconv/u8-strconv-to-locale.c29
-rw-r--r--gnulib/lib/unictype.h717
-rw-r--r--gnulib/lib/unictype/3level.h327
-rw-r--r--gnulib/lib/unictype/3levelbit.h317
-rw-r--r--gnulib/lib/unictype/bidi_byname.c171
-rw-r--r--gnulib/lib/unictype/bidi_name.c35
-rw-r--r--gnulib/lib/unictype/bidi_of.c52
-rw-r--r--gnulib/lib/unictype/bidi_of.h789
-rw-r--r--gnulib/lib/unictype/bidi_test.c27
-rw-r--r--gnulib/lib/unictype/bitmap.h47
-rw-r--r--gnulib/lib/unictype/block_test.c31
-rw-r--r--gnulib/lib/unictype/blocks.c62
-rw-r--r--gnulib/lib/unictype/blocks.h952
-rw-r--r--gnulib/lib/unictype/categ_C.c27
-rw-r--r--gnulib/lib/unictype/categ_C.h890
-rw-r--r--gnulib/lib/unictype/categ_Cc.c27
-rw-r--r--gnulib/lib/unictype/categ_Cc.h156
-rw-r--r--gnulib/lib/unictype/categ_Cf.c27
-rw-r--r--gnulib/lib/unictype/categ_Cf.h452
-rw-r--r--gnulib/lib/unictype/categ_Cn.c27
-rw-r--r--gnulib/lib/unictype/categ_Cn.h1014
-rw-r--r--gnulib/lib/unictype/categ_Co.c27
-rw-r--r--gnulib/lib/unictype/categ_Co.h310
-rw-r--r--gnulib/lib/unictype/categ_Cs.c30
-rw-r--r--gnulib/lib/unictype/categ_Cs.h156
-rw-r--r--gnulib/lib/unictype/categ_L.c27
-rw-r--r--gnulib/lib/unictype/categ_L.h580
-rw-r--r--gnulib/lib/unictype/categ_Ll.c27
-rw-r--r--gnulib/lib/unictype/categ_Ll.h335
-rw-r--r--gnulib/lib/unictype/categ_Lm.c27
-rw-r--r--gnulib/lib/unictype/categ_Lm.h216
-rw-r--r--gnulib/lib/unictype/categ_Lo.c27
-rw-r--r--gnulib/lib/unictype/categ_Lo.h568
-rw-r--r--gnulib/lib/unictype/categ_Lt.c27
-rw-r--r--gnulib/lib/unictype/categ_Lt.h160
-rw-r--r--gnulib/lib/unictype/categ_Lu.c27
-rw-r--r--gnulib/lib/unictype/categ_Lu.h331
-rw-r--r--gnulib/lib/unictype/categ_M.c27
-rw-r--r--gnulib/lib/unictype/categ_M.h528
-rw-r--r--gnulib/lib/unictype/categ_Mc.c27
-rw-r--r--gnulib/lib/unictype/categ_Mc.h331
-rw-r--r--gnulib/lib/unictype/categ_Me.c27
-rw-r--r--gnulib/lib/unictype/categ_Me.h168
-rw-r--r--gnulib/lib/unictype/categ_Mn.c27
-rw-r--r--gnulib/lib/unictype/categ_Mn.h528
-rw-r--r--gnulib/lib/unictype/categ_N.c27
-rw-r--r--gnulib/lib/unictype/categ_N.h403
-rw-r--r--gnulib/lib/unictype/categ_Nd.c27
-rw-r--r--gnulib/lib/unictype/categ_Nd.h351
-rw-r--r--gnulib/lib/unictype/categ_Nl.c27
-rw-r--r--gnulib/lib/unictype/categ_Nl.h307
-rw-r--r--gnulib/lib/unictype/categ_No.c27
-rw-r--r--gnulib/lib/unictype/categ_No.h355
-rw-r--r--gnulib/lib/unictype/categ_P.c27
-rw-r--r--gnulib/lib/unictype/categ_P.h403
-rw-r--r--gnulib/lib/unictype/categ_Pc.c27
-rw-r--r--gnulib/lib/unictype/categ_Pc.h164
-rw-r--r--gnulib/lib/unictype/categ_Pd.c27
-rw-r--r--gnulib/lib/unictype/categ_Pd.h180
-rw-r--r--gnulib/lib/unictype/categ_Pe.c27
-rw-r--r--gnulib/lib/unictype/categ_Pe.h196
-rw-r--r--gnulib/lib/unictype/categ_Pf.c27
-rw-r--r--gnulib/lib/unictype/categ_Pf.h164
-rw-r--r--gnulib/lib/unictype/categ_Pi.c27
-rw-r--r--gnulib/lib/unictype/categ_Pi.h164
-rw-r--r--gnulib/lib/unictype/categ_Po.c27
-rw-r--r--gnulib/lib/unictype/categ_Po.h387
-rw-r--r--gnulib/lib/unictype/categ_Ps.c27
-rw-r--r--gnulib/lib/unictype/categ_Ps.h196
-rw-r--r--gnulib/lib/unictype/categ_S.c27
-rw-r--r--gnulib/lib/unictype/categ_S.h427
-rw-r--r--gnulib/lib/unictype/categ_Sc.c27
-rw-r--r--gnulib/lib/unictype/categ_Sc.h188
-rw-r--r--gnulib/lib/unictype/categ_Sk.c27
-rw-r--r--gnulib/lib/unictype/categ_Sk.h176
-rw-r--r--gnulib/lib/unictype/categ_Sm.c27
-rw-r--r--gnulib/lib/unictype/categ_Sm.h331
-rw-r--r--gnulib/lib/unictype/categ_So.c27
-rw-r--r--gnulib/lib/unictype/categ_So.h403
-rw-r--r--gnulib/lib/unictype/categ_Z.c27
-rw-r--r--gnulib/lib/unictype/categ_Z.h172
-rw-r--r--gnulib/lib/unictype/categ_Zl.c30
-rw-r--r--gnulib/lib/unictype/categ_Zl.h156
-rw-r--r--gnulib/lib/unictype/categ_Zp.c30
-rw-r--r--gnulib/lib/unictype/categ_Zp.h156
-rw-r--r--gnulib/lib/unictype/categ_Zs.c27
-rw-r--r--gnulib/lib/unictype/categ_Zs.h172
-rw-r--r--gnulib/lib/unictype/categ_and.c45
-rw-r--r--gnulib/lib/unictype/categ_and_not.c42
-rw-r--r--gnulib/lib/unictype/categ_byname.c105
-rw-r--r--gnulib/lib/unictype/categ_name.c77
-rw-r--r--gnulib/lib/unictype/categ_none.c30
-rw-r--r--gnulib/lib/unictype/categ_of.c81
-rw-r--r--gnulib/lib/unictype/categ_of.h1088
-rw-r--r--gnulib/lib/unictype/categ_or.c42
-rw-r--r--gnulib/lib/unictype/categ_test.c32
-rw-r--r--gnulib/lib/unictype/combining.c47
-rw-r--r--gnulib/lib/unictype/combining.h839
-rw-r--r--gnulib/lib/unictype/ctype_alnum.c32
-rw-r--r--gnulib/lib/unictype/ctype_alnum.h588
-rw-r--r--gnulib/lib/unictype/ctype_alpha.c32
-rw-r--r--gnulib/lib/unictype/ctype_alpha.h588
-rw-r--r--gnulib/lib/unictype/ctype_blank.c32
-rw-r--r--gnulib/lib/unictype/ctype_blank.h172
-rw-r--r--gnulib/lib/unictype/ctype_cntrl.c32
-rw-r--r--gnulib/lib/unictype/ctype_cntrl.h160
-rw-r--r--gnulib/lib/unictype/ctype_digit.c32
-rw-r--r--gnulib/lib/unictype/ctype_digit.h156
-rw-r--r--gnulib/lib/unictype/ctype_graph.c32
-rw-r--r--gnulib/lib/unictype/ctype_graph.h890
-rw-r--r--gnulib/lib/unictype/ctype_lower.c32
-rw-r--r--gnulib/lib/unictype/ctype_lower.h327
-rw-r--r--gnulib/lib/unictype/ctype_print.c32
-rw-r--r--gnulib/lib/unictype/ctype_print.h890
-rw-r--r--gnulib/lib/unictype/ctype_punct.c32
-rw-r--r--gnulib/lib/unictype/ctype_punct.h734
-rw-r--r--gnulib/lib/unictype/ctype_space.c32
-rw-r--r--gnulib/lib/unictype/ctype_space.h172
-rw-r--r--gnulib/lib/unictype/ctype_upper.c32
-rw-r--r--gnulib/lib/unictype/ctype_upper.h327
-rw-r--r--gnulib/lib/unictype/ctype_xdigit.c32
-rw-r--r--gnulib/lib/unictype/ctype_xdigit.h156
-rw-r--r--gnulib/lib/unictype/decdigit.c49
-rw-r--r--gnulib/lib/unictype/decdigit.h247
-rw-r--r--gnulib/lib/unictype/digit.c49
-rw-r--r--gnulib/lib/unictype/digit.h311
-rw-r--r--gnulib/lib/unictype/identsyntaxmap.h42
-rw-r--r--gnulib/lib/unictype/mirror.c49
-rw-r--r--gnulib/lib/unictype/mirror.h503
-rw-r--r--gnulib/lib/unictype/numeric.c55
-rw-r--r--gnulib/lib/unictype/numeric.h635
-rw-r--r--gnulib/lib/unictype/pr_alphabetic.c35
-rw-r--r--gnulib/lib/unictype/pr_alphabetic.h588
-rw-r--r--gnulib/lib/unictype/pr_ascii_hex_digit.c35
-rw-r--r--gnulib/lib/unictype/pr_ascii_hex_digit.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_arabic_digit.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_arabic_digit.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h172
-rw-r--r--gnulib/lib/unictype/pr_bidi_block_separator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_block_separator.h160
-rw-r--r--gnulib/lib/unictype/pr_bidi_boundary_neutral.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_boundary_neutral.h590
-rw-r--r--gnulib/lib/unictype/pr_bidi_common_separator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_common_separator.h168
-rw-r--r--gnulib/lib/unictype/pr_bidi_control.c35
-rw-r--r--gnulib/lib/unictype/pr_bidi_control.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_embedding_or_override.c49
-rw-r--r--gnulib/lib/unictype/pr_bidi_embedding_or_override.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_eur_num_separator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_eur_num_separator.h172
-rw-r--r--gnulib/lib/unictype/pr_bidi_eur_num_terminator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_eur_num_terminator.h188
-rw-r--r--gnulib/lib/unictype/pr_bidi_european_digit.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_european_digit.h307
-rw-r--r--gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h315
-rw-r--r--gnulib/lib/unictype/pr_bidi_left_to_right.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_left_to_right.h706
-rw-r--r--gnulib/lib/unictype/pr_bidi_non_spacing_mark.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_non_spacing_mark.h528
-rw-r--r--gnulib/lib/unictype/pr_bidi_other_neutral.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_other_neutral.h407
-rw-r--r--gnulib/lib/unictype/pr_bidi_pdf.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_pdf.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_segment_separator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_segment_separator.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_whitespace.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_whitespace.h172
-rw-r--r--gnulib/lib/unictype/pr_byname.c59
-rw-r--r--gnulib/lib/unictype/pr_byname.gperf89
-rw-r--r--gnulib/lib/unictype/pr_combining.c35
-rw-r--r--gnulib/lib/unictype/pr_combining.h528
-rw-r--r--gnulib/lib/unictype/pr_composite.c35
-rw-r--r--gnulib/lib/unictype/pr_composite.h375
-rw-r--r--gnulib/lib/unictype/pr_currency_symbol.c47
-rw-r--r--gnulib/lib/unictype/pr_currency_symbol.h188
-rw-r--r--gnulib/lib/unictype/pr_dash.c35
-rw-r--r--gnulib/lib/unictype/pr_dash.h184
-rw-r--r--gnulib/lib/unictype/pr_decimal_digit.c47
-rw-r--r--gnulib/lib/unictype/pr_decimal_digit.h351
-rw-r--r--gnulib/lib/unictype/pr_default_ignorable_code_point.c35
-rw-r--r--gnulib/lib/unictype/pr_default_ignorable_code_point.h464
-rw-r--r--gnulib/lib/unictype/pr_deprecated.c35
-rw-r--r--gnulib/lib/unictype/pr_deprecated.h312
-rw-r--r--gnulib/lib/unictype/pr_diacritic.c35
-rw-r--r--gnulib/lib/unictype/pr_diacritic.h367
-rw-r--r--gnulib/lib/unictype/pr_extender.c35
-rw-r--r--gnulib/lib/unictype/pr_extender.h192
-rw-r--r--gnulib/lib/unictype/pr_format_control.c35
-rw-r--r--gnulib/lib/unictype/pr_format_control.h444
-rw-r--r--gnulib/lib/unictype/pr_grapheme_base.c35
-rw-r--r--gnulib/lib/unictype/pr_grapheme_base.h616
-rw-r--r--gnulib/lib/unictype/pr_grapheme_extend.c35
-rw-r--r--gnulib/lib/unictype/pr_grapheme_extend.h528
-rw-r--r--gnulib/lib/unictype/pr_grapheme_link.c35
-rw-r--r--gnulib/lib/unictype/pr_grapheme_link.h319
-rw-r--r--gnulib/lib/unictype/pr_hex_digit.c35
-rw-r--r--gnulib/lib/unictype/pr_hex_digit.h160
-rw-r--r--gnulib/lib/unictype/pr_hyphen.c35
-rw-r--r--gnulib/lib/unictype/pr_hyphen.h180
-rw-r--r--gnulib/lib/unictype/pr_id_continue.c35
-rw-r--r--gnulib/lib/unictype/pr_id_continue.h732
-rw-r--r--gnulib/lib/unictype/pr_id_start.c35
-rw-r--r--gnulib/lib/unictype/pr_id_start.h580
-rw-r--r--gnulib/lib/unictype/pr_ideographic.c35
-rw-r--r--gnulib/lib/unictype/pr_ideographic.h316
-rw-r--r--gnulib/lib/unictype/pr_ids_binary_operator.c35
-rw-r--r--gnulib/lib/unictype/pr_ids_binary_operator.h156
-rw-r--r--gnulib/lib/unictype/pr_ids_trinary_operator.c35
-rw-r--r--gnulib/lib/unictype/pr_ids_trinary_operator.h156
-rw-r--r--gnulib/lib/unictype/pr_ignorable_control.c35
-rw-r--r--gnulib/lib/unictype/pr_ignorable_control.h452
-rw-r--r--gnulib/lib/unictype/pr_iso_control.c47
-rw-r--r--gnulib/lib/unictype/pr_iso_control.h156
-rw-r--r--gnulib/lib/unictype/pr_join_control.c47
-rw-r--r--gnulib/lib/unictype/pr_join_control.h156
-rw-r--r--gnulib/lib/unictype/pr_left_of_pair.c35
-rw-r--r--gnulib/lib/unictype/pr_left_of_pair.h184
-rw-r--r--gnulib/lib/unictype/pr_line_separator.c55
-rw-r--r--gnulib/lib/unictype/pr_line_separator.h156
-rw-r--r--gnulib/lib/unictype/pr_logical_order_exception.c35
-rw-r--r--gnulib/lib/unictype/pr_logical_order_exception.h156
-rw-r--r--gnulib/lib/unictype/pr_lowercase.c35
-rw-r--r--gnulib/lib/unictype/pr_lowercase.h339
-rw-r--r--gnulib/lib/unictype/pr_math.c35
-rw-r--r--gnulib/lib/unictype/pr_math.h335
-rw-r--r--gnulib/lib/unictype/pr_non_break.c35
-rw-r--r--gnulib/lib/unictype/pr_non_break.h172
-rw-r--r--gnulib/lib/unictype/pr_not_a_character.c35
-rw-r--r--gnulib/lib/unictype/pr_not_a_character.h306
-rw-r--r--gnulib/lib/unictype/pr_numeric.c35
-rw-r--r--gnulib/lib/unictype/pr_numeric.h540
-rw-r--r--gnulib/lib/unictype/pr_other_alphabetic.c35
-rw-r--r--gnulib/lib/unictype/pr_other_alphabetic.h359
-rw-r--r--gnulib/lib/unictype/pr_other_default_ignorable_code_point.c35
-rw-r--r--gnulib/lib/unictype/pr_other_default_ignorable_code_point.h324
-rw-r--r--gnulib/lib/unictype/pr_other_grapheme_extend.c35
-rw-r--r--gnulib/lib/unictype/pr_other_grapheme_extend.h307
-rw-r--r--gnulib/lib/unictype/pr_other_id_continue.c35
-rw-r--r--gnulib/lib/unictype/pr_other_id_continue.h164
-rw-r--r--gnulib/lib/unictype/pr_other_id_start.c35
-rw-r--r--gnulib/lib/unictype/pr_other_id_start.h160
-rw-r--r--gnulib/lib/unictype/pr_other_lowercase.c35
-rw-r--r--gnulib/lib/unictype/pr_other_lowercase.h176
-rw-r--r--gnulib/lib/unictype/pr_other_math.c35
-rw-r--r--gnulib/lib/unictype/pr_other_math.h323
-rw-r--r--gnulib/lib/unictype/pr_other_uppercase.c35
-rw-r--r--gnulib/lib/unictype/pr_other_uppercase.h160
-rw-r--r--gnulib/lib/unictype/pr_paired_punctuation.c35
-rw-r--r--gnulib/lib/unictype/pr_paired_punctuation.h184
-rw-r--r--gnulib/lib/unictype/pr_paragraph_separator.c55
-rw-r--r--gnulib/lib/unictype/pr_paragraph_separator.h156
-rw-r--r--gnulib/lib/unictype/pr_pattern_syntax.c35
-rw-r--r--gnulib/lib/unictype/pr_pattern_syntax.h188
-rw-r--r--gnulib/lib/unictype/pr_pattern_white_space.c35
-rw-r--r--gnulib/lib/unictype/pr_pattern_white_space.h160
-rw-r--r--gnulib/lib/unictype/pr_private_use.c49
-rw-r--r--gnulib/lib/unictype/pr_private_use.h310
-rw-r--r--gnulib/lib/unictype/pr_punctuation.c47
-rw-r--r--gnulib/lib/unictype/pr_punctuation.h403
-rw-r--r--gnulib/lib/unictype/pr_quotation_mark.c35
-rw-r--r--gnulib/lib/unictype/pr_quotation_mark.h168
-rw-r--r--gnulib/lib/unictype/pr_radical.c35
-rw-r--r--gnulib/lib/unictype/pr_radical.h156
-rw-r--r--gnulib/lib/unictype/pr_sentence_terminal.c35
-rw-r--r--gnulib/lib/unictype/pr_sentence_terminal.h220
-rw-r--r--gnulib/lib/unictype/pr_soft_dotted.c35
-rw-r--r--gnulib/lib/unictype/pr_soft_dotted.h319
-rw-r--r--gnulib/lib/unictype/pr_space.c47
-rw-r--r--gnulib/lib/unictype/pr_space.h172
-rw-r--r--gnulib/lib/unictype/pr_terminal_punctuation.c35
-rw-r--r--gnulib/lib/unictype/pr_terminal_punctuation.h371
-rw-r--r--gnulib/lib/unictype/pr_test.c27
-rw-r--r--gnulib/lib/unictype/pr_titlecase.c47
-rw-r--r--gnulib/lib/unictype/pr_titlecase.h160
-rw-r--r--gnulib/lib/unictype/pr_unassigned_code_value.c35
-rw-r--r--gnulib/lib/unictype/pr_unassigned_code_value.h884
-rw-r--r--gnulib/lib/unictype/pr_unified_ideograph.c35
-rw-r--r--gnulib/lib/unictype/pr_unified_ideograph.h304
-rw-r--r--gnulib/lib/unictype/pr_uppercase.c35
-rw-r--r--gnulib/lib/unictype/pr_uppercase.h335
-rw-r--r--gnulib/lib/unictype/pr_variation_selector.c35
-rw-r--r--gnulib/lib/unictype/pr_variation_selector.h308
-rw-r--r--gnulib/lib/unictype/pr_white_space.c35
-rw-r--r--gnulib/lib/unictype/pr_white_space.h172
-rw-r--r--gnulib/lib/unictype/pr_xid_continue.c35
-rw-r--r--gnulib/lib/unictype/pr_xid_continue.h732
-rw-r--r--gnulib/lib/unictype/pr_xid_start.c35
-rw-r--r--gnulib/lib/unictype/pr_xid_start.h580
-rw-r--r--gnulib/lib/unictype/pr_zero_width.c35
-rw-r--r--gnulib/lib/unictype/pr_zero_width.h452
-rw-r--r--gnulib/lib/unictype/scripts.c75
-rw-r--r--gnulib/lib/unictype/scripts.h3704
-rw-r--r--gnulib/lib/unictype/scripts_byname.gperf89
-rw-r--r--gnulib/lib/unictype/sy_c_ident.c31
-rw-r--r--gnulib/lib/unictype/sy_c_ident.h140
-rw-r--r--gnulib/lib/unictype/sy_c_whitespace.c27
-rw-r--r--gnulib/lib/unictype/sy_c_whitespace.h156
-rw-r--r--gnulib/lib/unictype/sy_java_ident.c31
-rw-r--r--gnulib/lib/unictype/sy_java_ident.h343
-rw-r--r--gnulib/lib/unictype/sy_java_whitespace.c27
-rw-r--r--gnulib/lib/unictype/sy_java_whitespace.h156
-rw-r--r--gnulib/lib/unilbrk.h110
-rw-r--r--gnulib/lib/unilbrk/lbrkprop1.h33
-rw-r--r--gnulib/lib/unilbrk/lbrkprop2.h2558
-rw-r--r--gnulib/lib/unilbrk/lbrktables.c63
-rw-r--r--gnulib/lib/unilbrk/lbrktables.h94
-rw-r--r--gnulib/lib/unilbrk/u16-possible-linebreaks.c164
-rw-r--r--gnulib/lib/unilbrk/u16-width-linebreaks.c108
-rw-r--r--gnulib/lib/unilbrk/u32-possible-linebreaks.c158
-rw-r--r--gnulib/lib/unilbrk/u32-width-linebreaks.c106
-rw-r--r--gnulib/lib/unilbrk/u8-possible-linebreaks.c261
-rw-r--r--gnulib/lib/unilbrk/u8-width-linebreaks.c204
-rw-r--r--gnulib/lib/unilbrk/ulc-common.c51
-rw-r--r--gnulib/lib/unilbrk/ulc-common.h31
-rw-r--r--gnulib/lib/unilbrk/ulc-possible-linebreaks.c212
-rw-r--r--gnulib/lib/unilbrk/ulc-width-linebreaks.c231
-rw-r--r--gnulib/lib/uniname.h45
-rwxr-xr-xgnulib/lib/uniname/gen-uninames.lisp301
-rw-r--r--gnulib/lib/uniname/uniname.c516
-rw-r--r--gnulib/lib/uniname/uninames.h61495
-rw-r--r--gnulib/lib/uninorm.h245
-rw-r--r--gnulib/lib/uninorm/canonical-decomposition.c108
-rw-r--r--gnulib/lib/uninorm/compat-decomposition.c31
-rw-r--r--gnulib/lib/uninorm/composition-table.gperf958
-rw-r--r--gnulib/lib/uninorm/composition.c85
-rw-r--r--gnulib/lib/uninorm/decompose-internal.c28
-rw-r--r--gnulib/lib/uninorm/decompose-internal.h36
-rw-r--r--gnulib/lib/uninorm/decomposing-form.c29
-rw-r--r--gnulib/lib/uninorm/decomposition-table.c23
-rw-r--r--gnulib/lib/uninorm/decomposition-table.h48
-rw-r--r--gnulib/lib/uninorm/decomposition-table1.h20
-rw-r--r--gnulib/lib/uninorm/decomposition-table2.h3152
-rw-r--r--gnulib/lib/uninorm/decomposition.c102
-rw-r--r--gnulib/lib/uninorm/nfc.c31
-rw-r--r--gnulib/lib/uninorm/nfd.c31
-rw-r--r--gnulib/lib/uninorm/nfkc.c32
-rw-r--r--gnulib/lib/uninorm/nfkd.c32
-rw-r--r--gnulib/lib/uninorm/normalize-internal.h37
-rw-r--r--gnulib/lib/uninorm/u-normalize-internal.h375
-rw-r--r--gnulib/lib/uninorm/u-normcmp.h64
-rw-r--r--gnulib/lib/uninorm/u-normcoll.h65
-rw-r--r--gnulib/lib/uninorm/u-normxfrm.h87
-rw-r--r--gnulib/lib/uninorm/u16-normalize.c38
-rw-r--r--gnulib/lib/uninorm/u16-normcmp.c33
-rw-r--r--gnulib/lib/uninorm/u16-normcoll.c31
-rw-r--r--gnulib/lib/uninorm/u16-normxfrm.c34
-rw-r--r--gnulib/lib/uninorm/u32-normalize.c38
-rw-r--r--gnulib/lib/uninorm/u32-normcmp.c33
-rw-r--r--gnulib/lib/uninorm/u32-normcoll.c31
-rw-r--r--gnulib/lib/uninorm/u32-normxfrm.c34
-rw-r--r--gnulib/lib/uninorm/u8-normalize.c38
-rw-r--r--gnulib/lib/uninorm/u8-normcmp.c33
-rw-r--r--gnulib/lib/uninorm/u8-normcoll.c31
-rw-r--r--gnulib/lib/uninorm/u8-normxfrm.c34
-rw-r--r--gnulib/lib/uninorm/uninorm-filter.c367
-rw-r--r--gnulib/lib/unistd--.h32
-rw-r--r--gnulib/lib/unistd-safer.h31
-rw-r--r--gnulib/lib/unistd.in.h921
-rw-r--r--gnulib/lib/unistdio.h256
-rw-r--r--gnulib/lib/unistdio/u-asnprintf.h28
-rw-r--r--gnulib/lib/unistdio/u-asprintf.h28
-rw-r--r--gnulib/lib/unistdio/u-printf-args.c23
-rw-r--r--gnulib/lib/unistdio/u-printf-args.h28
-rw-r--r--gnulib/lib/unistdio/u-printf-parse.h28
-rw-r--r--gnulib/lib/unistdio/u-snprintf.h28
-rw-r--r--gnulib/lib/unistdio/u-sprintf.h28
-rw-r--r--gnulib/lib/unistdio/u-vasprintf.h35
-rw-r--r--gnulib/lib/unistdio/u-vsnprintf.h52
-rw-r--r--gnulib/lib/unistdio/u-vsprintf.h58
-rw-r--r--gnulib/lib/unistdio/u16-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-printf-parse.c27
-rw-r--r--gnulib/lib/unistdio/u16-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-vasnprintf.c50
-rw-r--r--gnulib/lib/unistdio/u16-u16-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u16-u16-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u16-u16-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u16-vasnprintf.c51
-rw-r--r--gnulib/lib/unistdio/u16-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u16-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u16-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u32-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-printf-parse.c27
-rw-r--r--gnulib/lib/unistdio/u32-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-vasnprintf.c50
-rw-r--r--gnulib/lib/unistdio/u32-u32-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u32-u32-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u32-u32-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u32-vasnprintf.c51
-rw-r--r--gnulib/lib/unistdio/u32-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u32-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u32-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u8-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-printf-parse.c27
-rw-r--r--gnulib/lib/unistdio/u8-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-vasnprintf.c50
-rw-r--r--gnulib/lib/unistdio/u8-u8-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u8-u8-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u8-u8-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u8-vasnprintf.c51
-rw-r--r--gnulib/lib/unistdio/u8-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u8-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u8-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/ulc-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/ulc-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/ulc-fprintf.c74
-rw-r--r--gnulib/lib/unistdio/ulc-printf-parse.c28
-rw-r--r--gnulib/lib/unistdio/ulc-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/ulc-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/ulc-vasnprintf.c47
-rw-r--r--gnulib/lib/unistdio/ulc-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/ulc-vfprintf.c71
-rw-r--r--gnulib/lib/unistdio/ulc-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/ulc-vsprintf.c33
-rw-r--r--gnulib/lib/unistr.h685
-rw-r--r--gnulib/lib/unistr/u-cmp2.h32
-rw-r--r--gnulib/lib/unistr/u-cpy-alloc.h40
-rw-r--r--gnulib/lib/unistr/u-cpy.h32
-rw-r--r--gnulib/lib/unistr/u-endswith.h28
-rw-r--r--gnulib/lib/unistr/u-move.h44
-rw-r--r--gnulib/lib/unistr/u-set.h39
-rw-r--r--gnulib/lib/unistr/u-startswith.h30
-rw-r--r--gnulib/lib/unistr/u-stpcpy.h24
-rw-r--r--gnulib/lib/unistr/u-stpncpy.h34
-rw-r--r--gnulib/lib/unistr/u-strcat.h26
-rw-r--r--gnulib/lib/unistr/u-strcoll.h87
-rw-r--r--gnulib/lib/unistr/u-strcpy.h26
-rw-r--r--gnulib/lib/unistr/u-strcspn.h54
-rw-r--r--gnulib/lib/unistr/u-strdup.h41
-rw-r--r--gnulib/lib/unistr/u-strlen.h26
-rw-r--r--gnulib/lib/unistr/u-strncat.h28
-rw-r--r--gnulib/lib/unistr/u-strncpy.h32
-rw-r--r--gnulib/lib/unistr/u-strnlen.h26
-rw-r--r--gnulib/lib/unistr/u-strpbrk.h46
-rw-r--r--gnulib/lib/unistr/u-strspn.h54
-rw-r--r--gnulib/lib/unistr/u-strstr.h49
-rw-r--r--gnulib/lib/unistr/u-strtok.h52
-rw-r--r--gnulib/lib/unistr/u16-check.c51
-rw-r--r--gnulib/lib/unistr/u16-chr.c57
-rw-r--r--gnulib/lib/unistr/u16-cmp.c54
-rw-r--r--gnulib/lib/unistr/u16-cmp2.c28
-rw-r--r--gnulib/lib/unistr/u16-cpy-alloc.c25
-rw-r--r--gnulib/lib/unistr/u16-cpy.c25
-rw-r--r--gnulib/lib/unistr/u16-endswith.c27
-rw-r--r--gnulib/lib/unistr/u16-mblen.c50
-rw-r--r--gnulib/lib/unistr/u16-mbsnlen.c42
-rw-r--r--gnulib/lib/unistr/u16-mbtouc-aux.c51
-rw-r--r--gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c55
-rw-r--r--gnulib/lib/unistr/u16-mbtouc-unsafe.c66
-rw-r--r--gnulib/lib/unistr/u16-mbtouc.c61
-rw-r--r--gnulib/lib/unistr/u16-mbtoucr.c54
-rw-r--r--gnulib/lib/unistr/u16-move.c25
-rw-r--r--gnulib/lib/unistr/u16-next.c37
-rw-r--r--gnulib/lib/unistr/u16-prev.c53
-rw-r--r--gnulib/lib/unistr/u16-set.c26
-rw-r--r--gnulib/lib/unistr/u16-startswith.c25
-rw-r--r--gnulib/lib/unistr/u16-stpcpy.c26
-rw-r--r--gnulib/lib/unistr/u16-stpncpy.c25
-rw-r--r--gnulib/lib/unistr/u16-strcat.c26
-rw-r--r--gnulib/lib/unistr/u16-strchr.c64
-rw-r--r--gnulib/lib/unistr/u16-strcmp.c50
-rw-r--r--gnulib/lib/unistr/u16-strcoll.c33
-rw-r--r--gnulib/lib/unistr/u16-strcpy.c25
-rw-r--r--gnulib/lib/unistr/u16-strcspn.c28
-rw-r--r--gnulib/lib/unistr/u16-strdup.c26
-rw-r--r--gnulib/lib/unistr/u16-strlen.c25
-rw-r--r--gnulib/lib/unistr/u16-strmblen.c44
-rw-r--r--gnulib/lib/unistr/u16-strmbtouc.c51
-rw-r--r--gnulib/lib/unistr/u16-strncat.c26
-rw-r--r--gnulib/lib/unistr/u16-strncmp.c54
-rw-r--r--gnulib/lib/unistr/u16-strncpy.c25
-rw-r--r--gnulib/lib/unistr/u16-strnlen.c25
-rw-r--r--gnulib/lib/unistr/u16-strpbrk.c27
-rw-r--r--gnulib/lib/unistr/u16-strrchr.c65
-rw-r--r--gnulib/lib/unistr/u16-strspn.c29
-rw-r--r--gnulib/lib/unistr/u16-strstr.c28
-rw-r--r--gnulib/lib/unistr/u16-strtok.c27
-rw-r--r--gnulib/lib/unistr/u16-to-u32.c125
-rw-r--r--gnulib/lib/unistr/u16-to-u8.c136
-rw-r--r--gnulib/lib/unistr/u16-uctomb-aux.c58
-rw-r--r--gnulib/lib/unistr/u16-uctomb.c72
-rw-r--r--gnulib/lib/unistr/u32-check.c39
-rw-r--r--gnulib/lib/unistr/u32-chr.c32
-rw-r--r--gnulib/lib/unistr/u32-cmp.c40
-rw-r--r--gnulib/lib/unistr/u32-cmp2.c28
-rw-r--r--gnulib/lib/unistr/u32-cpy-alloc.c25
-rw-r--r--gnulib/lib/unistr/u32-cpy.c25
-rw-r--r--gnulib/lib/unistr/u32-endswith.c27
-rw-r--r--gnulib/lib/unistr/u32-mblen.c37
-rw-r--r--gnulib/lib/unistr/u32-mbsnlen.c27
-rw-r--r--gnulib/lib/unistr/u32-mbtouc-unsafe.c48
-rw-r--r--gnulib/lib/unistr/u32-mbtouc.c43
-rw-r--r--gnulib/lib/unistr/u32-mbtoucr.c39
-rw-r--r--gnulib/lib/unistr/u32-move.c25
-rw-r--r--gnulib/lib/unistr/u32-next.c39
-rw-r--r--gnulib/lib/unistr/u32-prev.c39
-rw-r--r--gnulib/lib/unistr/u32-set.c26
-rw-r--r--gnulib/lib/unistr/u32-startswith.c25
-rw-r--r--gnulib/lib/unistr/u32-stpcpy.c25
-rw-r--r--gnulib/lib/unistr/u32-stpncpy.c25
-rw-r--r--gnulib/lib/unistr/u32-strcat.c26
-rw-r--r--gnulib/lib/unistr/u32-strchr.c36
-rw-r--r--gnulib/lib/unistr/u32-strcmp.c36
-rw-r--r--gnulib/lib/unistr/u32-strcoll.c33
-rw-r--r--gnulib/lib/unistr/u32-strcpy.c25
-rw-r--r--gnulib/lib/unistr/u32-strcspn.c51
-rw-r--r--gnulib/lib/unistr/u32-strdup.c26
-rw-r--r--gnulib/lib/unistr/u32-strlen.c25
-rw-r--r--gnulib/lib/unistr/u32-strmblen.c36
-rw-r--r--gnulib/lib/unistr/u32-strmbtouc.c39
-rw-r--r--gnulib/lib/unistr/u32-strncat.c26
-rw-r--r--gnulib/lib/unistr/u32-strncmp.c40
-rw-r--r--gnulib/lib/unistr/u32-strncpy.c25
-rw-r--r--gnulib/lib/unistr/u32-strnlen.c25
-rw-r--r--gnulib/lib/unistr/u32-strpbrk.c50
-rw-r--r--gnulib/lib/unistr/u32-strrchr.c38
-rw-r--r--gnulib/lib/unistr/u32-strspn.c50
-rw-r--r--gnulib/lib/unistr/u32-strstr.c26
-rw-r--r--gnulib/lib/unistr/u32-strtok.c27
-rw-r--r--gnulib/lib/unistr/u32-to-u16.c130
-rw-r--r--gnulib/lib/unistr/u32-to-u8.c130
-rw-r--r--gnulib/lib/unistr/u32-uctomb.c47
-rw-r--r--gnulib/lib/unistr/u8-check.c105
-rw-r--r--gnulib/lib/unistr/u8-chr.c88
-rw-r--r--gnulib/lib/unistr/u8-cmp.c30
-rw-r--r--gnulib/lib/unistr/u8-cmp2.c28
-rw-r--r--gnulib/lib/unistr/u8-cpy-alloc.c25
-rw-r--r--gnulib/lib/unistr/u8-cpy.c25
-rw-r--r--gnulib/lib/unistr/u8-endswith.c27
-rw-r--r--gnulib/lib/unistr/u8-mblen.c99
-rw-r--r--gnulib/lib/unistr/u8-mbsnlen.c42
-rw-r--r--gnulib/lib/unistr/u8-mbtouc-aux.c158
-rw-r--r--gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c168
-rw-r--r--gnulib/lib/unistr/u8-mbtouc-unsafe.c179
-rw-r--r--gnulib/lib/unistr/u8-mbtouc.c168
-rw-r--r--gnulib/lib/unistr/u8-mbtoucr.c285
-rw-r--r--gnulib/lib/unistr/u8-move.c25
-rw-r--r--gnulib/lib/unistr/u8-next.c37
-rw-r--r--gnulib/lib/unistr/u8-prev.c93
-rw-r--r--gnulib/lib/unistr/u8-set.c44
-rw-r--r--gnulib/lib/unistr/u8-startswith.c25
-rw-r--r--gnulib/lib/unistr/u8-stpcpy.c44
-rw-r--r--gnulib/lib/unistr/u8-stpncpy.c44
-rw-r--r--gnulib/lib/unistr/u8-strcat.c29
-rw-r--r--gnulib/lib/unistr/u8-strchr.c101
-rw-r--r--gnulib/lib/unistr/u8-strcmp.c30
-rw-r--r--gnulib/lib/unistr/u8-strcoll.c33
-rw-r--r--gnulib/lib/unistr/u8-strcpy.c29
-rw-r--r--gnulib/lib/unistr/u8-strcspn.c28
-rw-r--r--gnulib/lib/unistr/u8-strdup.c40
-rw-r--r--gnulib/lib/unistr/u8-strlen.c29
-rw-r--r--gnulib/lib/unistr/u8-strmblen.c97
-rw-r--r--gnulib/lib/unistr/u8-strmbtouc.c130
-rw-r--r--gnulib/lib/unistr/u8-strncat.c29
-rw-r--r--gnulib/lib/unistr/u8-strncmp.c30
-rw-r--r--gnulib/lib/unistr/u8-strncpy.c29
-rw-r--r--gnulib/lib/unistr/u8-strnlen.c44
-rw-r--r--gnulib/lib/unistr/u8-strpbrk.c27
-rw-r--r--gnulib/lib/unistr/u8-strrchr.c102
-rw-r--r--gnulib/lib/unistr/u8-strspn.c29
-rw-r--r--gnulib/lib/unistr/u8-strstr.c28
-rw-r--r--gnulib/lib/unistr/u8-strtok.c27
-rw-r--r--gnulib/lib/unistr/u8-to-u16.c136
-rw-r--r--gnulib/lib/unistr/u8-to-u32.c125
-rw-r--r--gnulib/lib/unistr/u8-uctomb-aux.c69
-rw-r--r--gnulib/lib/unistr/u8-uctomb.c88
-rw-r--r--gnulib/lib/unitypes.h26
-rw-r--r--gnulib/lib/uniwbrk.h83
-rw-r--r--gnulib/lib/uniwbrk/u-wordbreaks.h127
-rw-r--r--gnulib/lib/uniwbrk/u16-wordbreaks.c31
-rw-r--r--gnulib/lib/uniwbrk/u32-wordbreaks.c31
-rw-r--r--gnulib/lib/uniwbrk/u8-wordbreaks.c124
-rw-r--r--gnulib/lib/uniwbrk/ulc-wordbreaks.c201
-rw-r--r--gnulib/lib/uniwbrk/wbrkprop.h3755
-rw-r--r--gnulib/lib/uniwbrk/wbrktable.c52
-rw-r--r--gnulib/lib/uniwbrk/wbrktable.h18
-rw-r--r--gnulib/lib/uniwbrk/wordbreak-property.c44
-rw-r--r--gnulib/lib/uniwidth.h65
-rw-r--r--gnulib/lib/uniwidth/cjk.h37
-rw-r--r--gnulib/lib/uniwidth/u16-strwidth.c29
-rw-r--r--gnulib/lib/uniwidth/u16-width.c47
-rw-r--r--gnulib/lib/uniwidth/u32-strwidth.c29
-rw-r--r--gnulib/lib/uniwidth/u32-width.c43
-rw-r--r--gnulib/lib/uniwidth/u8-strwidth.c29
-rw-r--r--gnulib/lib/uniwidth/u8-width.c47
-rw-r--r--gnulib/lib/uniwidth/width.c359
-rw-r--r--gnulib/lib/unlink.c85
-rw-r--r--gnulib/lib/unlinkat.c105
-rw-r--r--gnulib/lib/unlinkdir.c54
-rw-r--r--gnulib/lib/unlinkdir.h26
-rw-r--r--gnulib/lib/unlocked-io.h136
-rw-r--r--gnulib/lib/unsetenv.c120
-rw-r--r--gnulib/lib/userspec.c309
-rw-r--r--gnulib/lib/userspec.h10
-rw-r--r--gnulib/lib/usleep.c58
-rw-r--r--gnulib/lib/utime.c108
-rw-r--r--gnulib/lib/utimecmp.c356
-rw-r--r--gnulib/lib/utimecmp.h37
-rw-r--r--gnulib/lib/utimens.c513
-rw-r--r--gnulib/lib/utimens.h19
-rw-r--r--gnulib/lib/utimensat.c136
-rw-r--r--gnulib/lib/vasnprintf.c5488
-rw-r--r--gnulib/lib/vasnprintf.h80
-rw-r--r--gnulib/lib/vasprintf.c51
-rw-r--r--gnulib/lib/vdprintf.c67
-rw-r--r--gnulib/lib/verify.h140
-rw-r--r--gnulib/lib/verror.c77
-rw-r--r--gnulib/lib/verror.h53
-rw-r--r--gnulib/lib/version-etc-fsf.c30
-rw-r--r--gnulib/lib/version-etc.c258
-rw-r--r--gnulib/lib/version-etc.h78
-rw-r--r--gnulib/lib/vfprintf.c74
-rw-r--r--gnulib/lib/vprintf.c33
-rw-r--r--gnulib/lib/vsnprintf.c71
-rw-r--r--gnulib/lib/vsprintf.c77
-rw-r--r--gnulib/lib/w32sock.h61
-rw-r--r--gnulib/lib/w32spawn.h212
-rw-r--r--gnulib/lib/wait-process.c361
-rw-r--r--gnulib/lib/wait-process.h74
-rw-r--r--gnulib/lib/wchar.in.h319
-rw-r--r--gnulib/lib/wcrtomb.c53
-rw-r--r--gnulib/lib/wcsnrtombs.c102
-rw-r--r--gnulib/lib/wcsrtombs-state.c37
-rw-r--r--gnulib/lib/wcsrtombs.c128
-rw-r--r--gnulib/lib/wctob.c37
-rw-r--r--gnulib/lib/wctype.in.h239
-rw-r--r--gnulib/lib/wcwidth.c51
-rw-r--r--gnulib/lib/write-any-file.c50
-rw-r--r--gnulib/lib/write-any-file.h2
-rw-r--r--gnulib/lib/write.c62
-rw-r--r--gnulib/lib/xalloc-die.c41
-rw-r--r--gnulib/lib/xalloc.h281
-rw-r--r--gnulib/lib/xasprintf.c34
-rw-r--r--gnulib/lib/xconcat-filename.c41
-rw-r--r--gnulib/lib/xfreopen.c42
-rw-r--r--gnulib/lib/xfreopen.h2
-rw-r--r--gnulib/lib/xgetcwd.c41
-rw-r--r--gnulib/lib/xgetcwd.h17
-rw-r--r--gnulib/lib/xgetdomainname.c77
-rw-r--r--gnulib/lib/xgetdomainname.h30
-rw-r--r--gnulib/lib/xgethostname.c74
-rw-r--r--gnulib/lib/xgethostname.h1
-rw-r--r--gnulib/lib/xmalloc.c118
-rw-r--r--gnulib/lib/xmalloca.c38
-rw-r--r--gnulib/lib/xmalloca.h64
-rw-r--r--gnulib/lib/xmemcoll.c57
-rw-r--r--gnulib/lib/xmemcoll.h2
-rw-r--r--gnulib/lib/xmemdup0.c44
-rw-r--r--gnulib/lib/xmemdup0.h51
-rw-r--r--gnulib/lib/xnanosleep.c118
-rw-r--r--gnulib/lib/xnanosleep.h1
-rw-r--r--gnulib/lib/xprintf.c79
-rw-r--r--gnulib/lib/xprintf.h45
-rw-r--r--gnulib/lib/xreadlink.c44
-rw-r--r--gnulib/lib/xreadlink.h27
-rw-r--r--gnulib/lib/xreadlinkat.c46
-rw-r--r--gnulib/lib/xsetenv.c38
-rw-r--r--gnulib/lib/xsetenv.h31
-rw-r--r--gnulib/lib/xsize.h108
-rw-r--r--gnulib/lib/xstriconv.c62
-rw-r--r--gnulib/lib/xstriconv.h78
-rw-r--r--gnulib/lib/xstriconveh.c86
-rw-r--r--gnulib/lib/xstriconveh.h115
-rw-r--r--gnulib/lib/xstrndup.c36
-rw-r--r--gnulib/lib/xstrndup.h23
-rw-r--r--gnulib/lib/xstrtod.c71
-rw-r--r--gnulib/lib/xstrtod.h31
-rw-r--r--gnulib/lib/xstrtoimax.c6
-rw-r--r--gnulib/lib/xstrtol-error.c98
-rw-r--r--gnulib/lib/xstrtol.c228
-rw-r--r--gnulib/lib/xstrtol.h83
-rw-r--r--gnulib/lib/xstrtold.c2
-rw-r--r--gnulib/lib/xstrtoll.c6
-rw-r--r--gnulib/lib/xstrtoul.c6
-rw-r--r--gnulib/lib/xstrtoull.c6
-rw-r--r--gnulib/lib/xstrtoumax.c6
-rw-r--r--gnulib/lib/xtime.h86
-rw-r--r--gnulib/lib/xvasprintf.c110
-rw-r--r--gnulib/lib/xvasprintf.h55
-rw-r--r--gnulib/lib/yesno.c60
-rw-r--r--gnulib/lib/yesno.h24
-rw-r--r--gnulib/m4/.cvsignore2
-rw-r--r--gnulib/m4/00gnulib.m430
-rw-r--r--gnulib/m4/README85
-rw-r--r--gnulib/m4/absolute-header.m465
-rw-r--r--gnulib/m4/accept4.m418
-rw-r--r--gnulib/m4/acl.m4153
-rw-r--r--gnulib/m4/acosl.m469
-rw-r--r--gnulib/m4/afs.m417
-rw-r--r--gnulib/m4/alloca.m447
-rw-r--r--gnulib/m4/alphasort.m423
-rw-r--r--gnulib/m4/arcfour.m410
-rw-r--r--gnulib/m4/arctwo.m412
-rw-r--r--gnulib/m4/argmatch.m410
-rw-r--r--gnulib/m4/argp.m465
-rw-r--r--gnulib/m4/argz.m480
-rw-r--r--gnulib/m4/arpa_inet_h.m457
-rw-r--r--gnulib/m4/asinl.m463
-rw-r--r--gnulib/m4/assert.m424
-rw-r--r--gnulib/m4/atanl.m463
-rw-r--r--gnulib/m4/atexit.m418
-rw-r--r--gnulib/m4/atoll.m426
-rw-r--r--gnulib/m4/autobuild.m440
-rw-r--r--gnulib/m4/backupfile.m416
-rw-r--r--gnulib/m4/base64.m416
-rw-r--r--gnulib/m4/bison-i18n.m448
-rw-r--r--gnulib/m4/bison.m424
-rw-r--r--gnulib/m4/btowc.m473
-rw-r--r--gnulib/m4/byteswap.m418
-rw-r--r--gnulib/m4/c-stack.m4349
-rw-r--r--gnulib/m4/c-strtod.m457
-rw-r--r--gnulib/m4/calloc.m462
-rw-r--r--gnulib/m4/canon-host.m415
-rw-r--r--gnulib/m4/canonicalize.m481
-rw-r--r--gnulib/m4/ceil.m446
-rw-r--r--gnulib/m4/ceilf.m462
-rw-r--r--gnulib/m4/ceill.m462
-rw-r--r--gnulib/m4/chdir-long.m439
-rw-r--r--gnulib/m4/chdir-safer.m411
-rw-r--r--gnulib/m4/check-math-lib.m431
-rw-r--r--gnulib/m4/check-version.m410
-rw-r--r--gnulib/m4/chown.m4139
-rw-r--r--gnulib/m4/clock_time.m431
-rw-r--r--gnulib/m4/cloexec.m410
-rw-r--r--gnulib/m4/close-stream.m413
-rw-r--r--gnulib/m4/close.m426
-rw-r--r--gnulib/m4/closein.m413
-rw-r--r--gnulib/m4/closeout.m414
-rw-r--r--gnulib/m4/codeset.m421
-rw-r--r--gnulib/m4/cond.m411
-rw-r--r--gnulib/m4/config-h.m413
-rw-r--r--gnulib/m4/copy-file.m411
-rw-r--r--gnulib/m4/cosl.m477
-rw-r--r--gnulib/m4/count-one-bits.m415
-rw-r--r--gnulib/m4/crc.m410
-rw-r--r--gnulib/m4/csharp.m428
-rw-r--r--gnulib/m4/csharpcomp.m478
-rw-r--r--gnulib/m4/csharpexec.m486
-rw-r--r--gnulib/m4/ctype.m432
-rw-r--r--gnulib/m4/cycle-check.m411
-rw-r--r--gnulib/m4/d-ino.m441
-rw-r--r--gnulib/m4/d-type.m432
-rw-r--r--gnulib/m4/des.m410
-rw-r--r--gnulib/m4/dirent-safer.m411
-rw-r--r--gnulib/m4/dirent_h.m453
-rw-r--r--gnulib/m4/dirfd.m483
-rw-r--r--gnulib/m4/dirname.m426
-rw-r--r--gnulib/m4/dos.m471
-rw-r--r--gnulib/m4/double-slash-root.m438
-rw-r--r--gnulib/m4/dprintf-posix.m4101
-rw-r--r--gnulib/m4/dprintf.m428
-rw-r--r--gnulib/m4/dup2.m458
-rw-r--r--gnulib/m4/dup3.m418
-rw-r--r--gnulib/m4/duplocale.m456
-rw-r--r--gnulib/m4/eaccess.m412
-rw-r--r--gnulib/m4/eealloc.m432
-rw-r--r--gnulib/m4/environ.m436
-rw-r--r--gnulib/m4/errno_h.m4115
-rw-r--r--gnulib/m4/error.m422
-rw-r--r--gnulib/m4/euidaccess.m453
-rw-r--r--gnulib/m4/exclude.m411
-rw-r--r--gnulib/m4/execute.m412
-rw-r--r--gnulib/m4/exitfail.m414
-rw-r--r--gnulib/m4/expl.m459
-rw-r--r--gnulib/m4/exponentd.m4114
-rw-r--r--gnulib/m4/exponentf.m491
-rw-r--r--gnulib/m4/exponentl.m497
-rw-r--r--gnulib/m4/extensions.m4118
-rw-r--r--gnulib/m4/faccessat.m423
-rw-r--r--gnulib/m4/fatal-signal.m413
-rw-r--r--gnulib/m4/fbufmode.m411
-rw-r--r--gnulib/m4/fchdir.m447
-rw-r--r--gnulib/m4/fclose.m416
-rw-r--r--gnulib/m4/fcntl-o.m481
-rw-r--r--gnulib/m4/fcntl-safer.m419
-rw-r--r--gnulib/m4/fcntl.m483
-rw-r--r--gnulib/m4/fcntl_h.m441
-rw-r--r--gnulib/m4/fdopendir.m438
-rw-r--r--gnulib/m4/fflush.m482
-rw-r--r--gnulib/m4/file-type.m410
-rw-r--r--gnulib/m4/fileblocks.m420
-rw-r--r--gnulib/m4/filemode.m412
-rw-r--r--gnulib/m4/filenamecat.m419
-rw-r--r--gnulib/m4/findprog.m412
-rw-r--r--gnulib/m4/flexmember.m441
-rw-r--r--gnulib/m4/float_h.m419
-rw-r--r--gnulib/m4/flock.m426
-rw-r--r--gnulib/m4/floor.m446
-rw-r--r--gnulib/m4/floorf.m462
-rw-r--r--gnulib/m4/floorl.m462
-rw-r--r--gnulib/m4/fnmatch.m4121
-rw-r--r--gnulib/m4/fopen.m461
-rw-r--r--gnulib/m4/fpending.m483
-rw-r--r--gnulib/m4/fpieee.m452
-rw-r--r--gnulib/m4/fprintf-posix.m4110
-rw-r--r--gnulib/m4/fprintftime.m410
-rw-r--r--gnulib/m4/fpurge.m445
-rw-r--r--gnulib/m4/freadable.m413
-rw-r--r--gnulib/m4/freading.m410
-rw-r--r--gnulib/m4/free.m440
-rw-r--r--gnulib/m4/freopen.m424
-rw-r--r--gnulib/m4/frexp.m4146
-rw-r--r--gnulib/m4/frexpl.m4186
-rw-r--r--gnulib/m4/fseek.m420
-rw-r--r--gnulib/m4/fseeko.m435
-rw-r--r--gnulib/m4/fstypename.m423
-rw-r--r--gnulib/m4/fsusage.m4272
-rw-r--r--gnulib/m4/fsync.m419
-rw-r--r--gnulib/m4/ftell.m416
-rw-r--r--gnulib/m4/ftello.m432
-rw-r--r--gnulib/m4/ftruncate.m446
-rw-r--r--gnulib/m4/fts.m432
-rw-r--r--gnulib/m4/func.m420
-rw-r--r--gnulib/m4/futimens.m458
-rw-r--r--gnulib/m4/fwritable.m413
-rw-r--r--gnulib/m4/fwriting.m413
-rw-r--r--gnulib/m4/gc-arcfour.m413
-rw-r--r--gnulib/m4/gc-arctwo.m413
-rw-r--r--gnulib/m4/gc-camellia.m420
-rw-r--r--gnulib/m4/gc-des.m413
-rw-r--r--gnulib/m4/gc-hmac-md5.m415
-rw-r--r--gnulib/m4/gc-hmac-sha1.m415
-rw-r--r--gnulib/m4/gc-md2.m49
-rw-r--r--gnulib/m4/gc-md4.m413
-rw-r--r--gnulib/m4/gc-md5.m413
-rw-r--r--gnulib/m4/gc-pbkdf2-sha1.m410
-rw-r--r--gnulib/m4/gc-random.m487
-rw-r--r--gnulib/m4/gc-rijndael.m413
-rw-r--r--gnulib/m4/gc-sha1.m413
-rw-r--r--gnulib/m4/gc.m427
-rw-r--r--gnulib/m4/getaddrinfo.m4173
-rw-r--r--gnulib/m4/getcwd-abort-bug.m4106
-rw-r--r--gnulib/m4/getcwd-path-max.m4190
-rw-r--r--gnulib/m4/getcwd.m480
-rw-r--r--gnulib/m4/getdate.m453
-rw-r--r--gnulib/m4/getdelim.m490
-rw-r--r--gnulib/m4/getdomainname.m424
-rw-r--r--gnulib/m4/getdtablesize.m415
-rw-r--r--gnulib/m4/getgroups.m443
-rw-r--r--gnulib/m4/gethostname.m4101
-rw-r--r--gnulib/m4/gethrxtime.m474
-rw-r--r--gnulib/m4/getline.m497
-rw-r--r--gnulib/m4/getloadavg.m4187
-rw-r--r--gnulib/m4/getlogin.m415
-rw-r--r--gnulib/m4/getlogin_r.m435
-rw-r--r--gnulib/m4/getndelim2.m421
-rw-r--r--gnulib/m4/getnline.m413
-rw-r--r--gnulib/m4/getopt.m4273
-rw-r--r--gnulib/m4/getpagesize.m430
-rw-r--r--gnulib/m4/getpass.m448
-rw-r--r--gnulib/m4/getsubopt.m422
-rw-r--r--gnulib/m4/gettext.m4381
-rw-r--r--gnulib/m4/gettime.m415
-rw-r--r--gnulib/m4/gettimeofday.m4120
-rw-r--r--gnulib/m4/getugroups.m412
-rw-r--r--gnulib/m4/getusershell.m418
-rw-r--r--gnulib/m4/gl_list.m410
-rw-r--r--gnulib/m4/glibc2.m430
-rw-r--r--gnulib/m4/glibc21.m430
-rw-r--r--gnulib/m4/glob.m486
-rw-r--r--gnulib/m4/gnu-make.m419
-rw-r--r--gnulib/m4/gnulib-common.m4142
-rw-r--r--gnulib/m4/gnulib-tool.m457
-rw-r--r--gnulib/m4/group-member.m428
-rw-r--r--gnulib/m4/hard-locale.m412
-rw-r--r--gnulib/m4/hash.m414
-rw-r--r--gnulib/m4/hmac-md5.m410
-rw-r--r--gnulib/m4/hmac-sha1.m410
-rw-r--r--gnulib/m4/host-os.m482
-rw-r--r--gnulib/m4/hostent.m445
-rw-r--r--gnulib/m4/human.m414
-rw-r--r--gnulib/m4/i-ring.m410
-rw-r--r--gnulib/m4/iconv.m4199
-rw-r--r--gnulib/m4/iconv_h.m437
-rw-r--r--gnulib/m4/iconv_open.m4238
-rw-r--r--gnulib/m4/idcache.m411
-rw-r--r--gnulib/m4/idpriv.m414
-rw-r--r--gnulib/m4/imaxabs.m417
-rw-r--r--gnulib/m4/imaxdiv.m417
-rw-r--r--gnulib/m4/include_next.m4187
-rw-r--r--gnulib/m4/inet_ntop.m438
-rw-r--r--gnulib/m4/inet_pton.m438
-rw-r--r--gnulib/m4/inline.m440
-rw-r--r--gnulib/m4/intdiv0.m484
-rw-r--r--gnulib/m4/intl.m4285
-rw-r--r--gnulib/m4/intldir.m419
-rw-r--r--gnulib/m4/intlmacosx.m451
-rw-r--r--gnulib/m4/intmax.m433
-rw-r--r--gnulib/m4/intmax_t.m462
-rw-r--r--gnulib/m4/inttostr.m437
-rw-r--r--gnulib/m4/inttypes-pri.m436
-rw-r--r--gnulib/m4/inttypes.m4302
-rw-r--r--gnulib/m4/inttypes_h.m426
-rw-r--r--gnulib/m4/isapipe.m489
-rw-r--r--gnulib/m4/isblank.m418
-rw-r--r--gnulib/m4/isfinite.m4160
-rw-r--r--gnulib/m4/isinf.m449
-rw-r--r--gnulib/m4/isnan.m447
-rw-r--r--gnulib/m4/isnand.m495
-rw-r--r--gnulib/m4/isnanf.m4179
-rw-r--r--gnulib/m4/isnanl.m4245
-rw-r--r--gnulib/m4/javacomp.m4637
-rw-r--r--gnulib/m4/javaexec.m4104
-rw-r--r--gnulib/m4/jm-winsz1.m448
-rw-r--r--gnulib/m4/jm-winsz2.m429
-rw-r--r--gnulib/m4/langinfo_h.m474
-rw-r--r--gnulib/m4/lchmod.m422
-rw-r--r--gnulib/m4/lchown.m429
-rw-r--r--gnulib/m4/lcmessage.m431
-rw-r--r--gnulib/m4/ld-output-def.m429
-rw-r--r--gnulib/m4/ld-version-script.m444
-rw-r--r--gnulib/m4/ldd.m4207
-rw-r--r--gnulib/m4/ldexpl.m488
-rw-r--r--gnulib/m4/lib-ignore.m443
-rw-r--r--gnulib/m4/lib-ld.m4110
-rw-r--r--gnulib/m4/lib-link.m4764
-rw-r--r--gnulib/m4/lib-prefix.m4224
-rw-r--r--gnulib/m4/libsigsegv.m416
-rw-r--r--gnulib/m4/libunistring.m437
-rw-r--r--gnulib/m4/link-follow.m481
-rw-r--r--gnulib/m4/link.m438
-rw-r--r--gnulib/m4/linkat.m447
-rw-r--r--gnulib/m4/localcharset.m417
-rw-r--r--gnulib/m4/locale-fr.m4185
-rw-r--r--gnulib/m4/locale-ja.m4107
-rw-r--r--gnulib/m4/locale-tr.m497
-rw-r--r--gnulib/m4/locale-zh.m492
-rw-r--r--gnulib/m4/locale_h.m489
-rw-r--r--gnulib/m4/localename.m412
-rw-r--r--gnulib/m4/lock.m437
-rw-r--r--gnulib/m4/logl.m475
-rw-r--r--gnulib/m4/long-options.m413
-rw-r--r--gnulib/m4/longlong.m4106
-rw-r--r--gnulib/m4/ls-mntd-fs.m4336
-rw-r--r--gnulib/m4/lseek.m451
-rw-r--r--gnulib/m4/lstat.m428
-rw-r--r--gnulib/m4/malloc.m441
-rw-r--r--gnulib/m4/malloca.m415
-rw-r--r--gnulib/m4/manywarnings.m4108
-rw-r--r--gnulib/m4/math_h.m4128
-rw-r--r--gnulib/m4/mathfunc.m4115
-rw-r--r--gnulib/m4/mbchar.m414
-rw-r--r--gnulib/m4/mbfile.m418
-rw-r--r--gnulib/m4/mbiter.m418
-rw-r--r--gnulib/m4/mbrlen.m4197
-rw-r--r--gnulib/m4/mbrtowc.m4384
-rw-r--r--gnulib/m4/mbsinit.m430
-rw-r--r--gnulib/m4/mbslen.m416
-rw-r--r--gnulib/m4/mbsnrtowcs.m434
-rw-r--r--gnulib/m4/mbsrtowcs.m4121
-rw-r--r--gnulib/m4/mbstate_t.m434
-rw-r--r--gnulib/m4/mbswidth.m441
-rw-r--r--gnulib/m4/md2.m411
-rw-r--r--gnulib/m4/md4.m415
-rw-r--r--gnulib/m4/md5.m416
-rw-r--r--gnulib/m4/memcasecmp.m410
-rw-r--r--gnulib/m4/memchr.m486
-rw-r--r--gnulib/m4/memcmp.m431
-rw-r--r--gnulib/m4/memcoll.m414
-rw-r--r--gnulib/m4/memcpy.m418
-rw-r--r--gnulib/m4/memmem.m484
-rw-r--r--gnulib/m4/memmove.m418
-rw-r--r--gnulib/m4/mempcpy.m427
-rw-r--r--gnulib/m4/memrchr.m426
-rw-r--r--gnulib/m4/memset.m418
-rw-r--r--gnulib/m4/memxor.m411
-rw-r--r--gnulib/m4/mgetgroups.m411
-rw-r--r--gnulib/m4/minmax.m441
-rw-r--r--gnulib/m4/mkancesdirs.m410
-rw-r--r--gnulib/m4/mkdir-p.m416
-rw-r--r--gnulib/m4/mkdir.m452
-rw-r--r--gnulib/m4/mkdtemp.m421
-rw-r--r--gnulib/m4/mkfifo.m445
-rw-r--r--gnulib/m4/mkfifoat.m424
-rw-r--r--gnulib/m4/mknod.m445
-rw-r--r--gnulib/m4/mkostemp.m425
-rw-r--r--gnulib/m4/mkostemps.m419
-rw-r--r--gnulib/m4/mkstemp.m456
-rw-r--r--gnulib/m4/mkstemps.m419
-rw-r--r--gnulib/m4/mktime.m4234
-rw-r--r--gnulib/m4/mmap-anon.m459
-rw-r--r--gnulib/m4/mode_t.m426
-rw-r--r--gnulib/m4/modechange.m411
-rw-r--r--gnulib/m4/mountlist.m423
-rw-r--r--gnulib/m4/mpsort.m413
-rw-r--r--gnulib/m4/multiarch.m465
-rw-r--r--gnulib/m4/nanosleep.m4126
-rw-r--r--gnulib/m4/netdb_h.m446
-rw-r--r--gnulib/m4/netinet_in_h.m430
-rw-r--r--gnulib/m4/nl_langinfo.m425
-rw-r--r--gnulib/m4/nls.m432
-rw-r--r--gnulib/m4/no-c++.m422
-rw-r--r--gnulib/m4/nocrash.m4102
-rw-r--r--gnulib/m4/nproc.m453
-rw-r--r--gnulib/m4/obstack-printf-posix.m4105
-rw-r--r--gnulib/m4/obstack-printf.m442
-rw-r--r--gnulib/m4/onceonly.m491
-rw-r--r--gnulib/m4/open.m474
-rw-r--r--gnulib/m4/openat.m4124
-rw-r--r--gnulib/m4/openmp.m498
-rw-r--r--gnulib/m4/pagealign_alloc.m422
-rw-r--r--gnulib/m4/pathmax.m413
-rw-r--r--gnulib/m4/perl.m446
-rw-r--r--gnulib/m4/perror.m417
-rw-r--r--gnulib/m4/physmem.m447
-rw-r--r--gnulib/m4/pipe.m412
-rw-r--r--gnulib/m4/pipe2.m418
-rw-r--r--gnulib/m4/po.m4449
-rw-r--r--gnulib/m4/poll.m472
-rw-r--r--gnulib/m4/popen.m434
-rw-r--r--gnulib/m4/posix-shell.m463
-rw-r--r--gnulib/m4/posix_spawn.m4375
-rw-r--r--gnulib/m4/posixtm.m413
-rw-r--r--gnulib/m4/posixver.m445
-rw-r--r--gnulib/m4/pread.m418
-rw-r--r--gnulib/m4/printf-frexp.m445
-rw-r--r--gnulib/m4/printf-frexpl.m464
-rw-r--r--gnulib/m4/printf-posix-rpl.m425
-rw-r--r--gnulib/m4/printf-posix.m445
-rw-r--r--gnulib/m4/printf.m41416
-rw-r--r--gnulib/m4/priv-set.m415
-rw-r--r--gnulib/m4/progtest.m492
-rw-r--r--gnulib/m4/pthread.m427
-rw-r--r--gnulib/m4/pty.m442
-rw-r--r--gnulib/m4/putenv.m441
-rw-r--r--gnulib/m4/quote.m414
-rw-r--r--gnulib/m4/quotearg.m410
-rw-r--r--gnulib/m4/random_r.m421
-rw-r--r--gnulib/m4/rawmemchr.m421
-rw-r--r--gnulib/m4/read-file.m415
-rw-r--r--gnulib/m4/readline.m480
-rw-r--r--gnulib/m4/readlink.m462
-rw-r--r--gnulib/m4/readtokens.m414
-rw-r--r--gnulib/m4/readutmp.m461
-rw-r--r--gnulib/m4/realloc.m423
-rw-r--r--gnulib/m4/regex.m4229
-rw-r--r--gnulib/m4/relocatable-lib.m458
-rw-r--r--gnulib/m4/relocatable.m499
-rw-r--r--gnulib/m4/remove.m440
-rw-r--r--gnulib/m4/rename.m4158
-rw-r--r--gnulib/m4/renameat.m428
-rw-r--r--gnulib/m4/rijndael.m411
-rw-r--r--gnulib/m4/rmdir-errno.m449
-rw-r--r--gnulib/m4/rmdir.m444
-rw-r--r--gnulib/m4/round.m472
-rw-r--r--gnulib/m4/roundf.m481
-rw-r--r--gnulib/m4/roundl.m446
-rw-r--r--gnulib/m4/rpmatch.m432
-rw-r--r--gnulib/m4/safe-alloc.m49
-rw-r--r--gnulib/m4/safe-read.m419
-rw-r--r--gnulib/m4/safe-write.m418
-rw-r--r--gnulib/m4/same.m415
-rw-r--r--gnulib/m4/save-cwd.m412
-rw-r--r--gnulib/m4/savedir.m411
-rw-r--r--gnulib/m4/savewd.m49
-rw-r--r--gnulib/m4/scandir.m423
-rw-r--r--gnulib/m4/sched_h.m436
-rw-r--r--gnulib/m4/search_h.m438
-rw-r--r--gnulib/m4/select.m453
-rw-r--r--gnulib/m4/selinux-context-h.m416
-rw-r--r--gnulib/m4/selinux-selinux-h.m457
-rw-r--r--gnulib/m4/servent.m447
-rw-r--r--gnulib/m4/setenv.m4110
-rw-r--r--gnulib/m4/settime.m415
-rw-r--r--gnulib/m4/sha1.m416
-rw-r--r--gnulib/m4/sha256.m414
-rw-r--r--gnulib/m4/sha512.m414
-rw-r--r--gnulib/m4/sig2str.m419
-rw-r--r--gnulib/m4/sig_atomic_t.m414
-rw-r--r--gnulib/m4/sigaction.m445
-rw-r--r--gnulib/m4/signal_h.m447
-rw-r--r--gnulib/m4/signalblocking.m442
-rw-r--r--gnulib/m4/signbit.m4287
-rw-r--r--gnulib/m4/sigpipe.m429
-rw-r--r--gnulib/m4/sinl.m477
-rw-r--r--gnulib/m4/size_max.m475
-rw-r--r--gnulib/m4/sleep.m449
-rw-r--r--gnulib/m4/snprintf-posix.m4126
-rw-r--r--gnulib/m4/snprintf.m440
-rw-r--r--gnulib/m4/sockets.m490
-rw-r--r--gnulib/m4/socklen.m452
-rw-r--r--gnulib/m4/sockpfaf.m458
-rw-r--r--gnulib/m4/spawn_h.m496
-rw-r--r--gnulib/m4/sprintf-posix.m4108
-rw-r--r--gnulib/m4/sqrt.m410
-rw-r--r--gnulib/m4/sqrtl.m481
-rw-r--r--gnulib/m4/ssize_t.m421
-rw-r--r--gnulib/m4/st_dm_mode.m423
-rw-r--r--gnulib/m4/stat-macros.m412
-rw-r--r--gnulib/m4/stat-time.m485
-rw-r--r--gnulib/m4/stat.m463
-rw-r--r--gnulib/m4/stdarg.m467
-rw-r--r--gnulib/m4/stdbool.m4115
-rw-r--r--gnulib/m4/stddef_h.m445
-rw-r--r--gnulib/m4/stdint.m4472
-rw-r--r--gnulib/m4/stdint_h.m426
-rw-r--r--gnulib/m4/stdio-safer.m425
-rw-r--r--gnulib/m4/stdio_h.m4152
-rw-r--r--gnulib/m4/stdlib-safer.m410
-rw-r--r--gnulib/m4/stdlib_h.m4100
-rw-r--r--gnulib/m4/stpcpy.m426
-rw-r--r--gnulib/m4/stpncpy.m469
-rw-r--r--gnulib/m4/strcase.m444
-rw-r--r--gnulib/m4/strcasestr.m495
-rw-r--r--gnulib/m4/strchrnul.m421
-rw-r--r--gnulib/m4/strcspn.m416
-rw-r--r--gnulib/m4/strdup.m438
-rw-r--r--gnulib/m4/strerror.m468
-rw-r--r--gnulib/m4/strftime.m432
-rw-r--r--gnulib/m4/string_h.m4104
-rw-r--r--gnulib/m4/strings_h.m439
-rw-r--r--gnulib/m4/strndup.m449
-rw-r--r--gnulib/m4/strnlen.m432
-rw-r--r--gnulib/m4/strpbrk.m418
-rw-r--r--gnulib/m4/strptime.m418
-rw-r--r--gnulib/m4/strsep.m425
-rw-r--r--gnulib/m4/strsignal.m455
-rw-r--r--gnulib/m4/strstr.m479
-rw-r--r--gnulib/m4/strtod.m490
-rw-r--r--gnulib/m4/strtoimax.m435
-rw-r--r--gnulib/m4/strtok_r.m473
-rw-r--r--gnulib/m4/strtol.m410
-rw-r--r--gnulib/m4/strtoll.m426
-rw-r--r--gnulib/m4/strtoul.m410
-rw-r--r--gnulib/m4/strtoull.m426
-rw-r--r--gnulib/m4/strtoumax.m435
-rw-r--r--gnulib/m4/strverscmp.m423
-rw-r--r--gnulib/m4/symlink.m438
-rw-r--r--gnulib/m4/symlinkat.m423
-rw-r--r--gnulib/m4/sys_file_h.m445
-rw-r--r--gnulib/m4/sys_ioctl_h.m468
-rw-r--r--gnulib/m4/sys_select_h.m484
-rw-r--r--gnulib/m4/sys_socket_h.m4159
-rw-r--r--gnulib/m4/sys_stat_h.m480
-rw-r--r--gnulib/m4/sys_time_h.m470
-rw-r--r--gnulib/m4/sys_times_h.m451
-rw-r--r--gnulib/m4/sys_utsname_h.m447
-rw-r--r--gnulib/m4/sys_wait_h.m424
-rw-r--r--gnulib/m4/sysexits.m443
-rw-r--r--gnulib/m4/tanl.m476
-rw-r--r--gnulib/m4/tempname.m422
-rw-r--r--gnulib/m4/thread.m418
-rw-r--r--gnulib/m4/threadlib.m4324
-rw-r--r--gnulib/m4/time_h.m474
-rw-r--r--gnulib/m4/time_r.m444
-rw-r--r--gnulib/m4/timegm.m440
-rw-r--r--gnulib/m4/times.m415
-rw-r--r--gnulib/m4/timespec.m415
-rw-r--r--gnulib/m4/tls.m412
-rw-r--r--gnulib/m4/tm_gmtoff.m414
-rw-r--r--gnulib/m4/tmpdir.m412
-rw-r--r--gnulib/m4/tmpfile.m439
-rw-r--r--gnulib/m4/trunc.m448
-rw-r--r--gnulib/m4/truncf.m448
-rw-r--r--gnulib/m4/truncl.m472
-rw-r--r--gnulib/m4/tsearch.m459
-rw-r--r--gnulib/m4/tzset.m459
-rw-r--r--gnulib/m4/uintmax_t.m430
-rw-r--r--gnulib/m4/ulonglong.m45
-rw-r--r--gnulib/m4/uname.m420
-rw-r--r--gnulib/m4/ungetc.m436
-rw-r--r--gnulib/m4/unicodeio.m411
-rw-r--r--gnulib/m4/unistd-safer.m413
-rw-r--r--gnulib/m4/unistd_h.m4149
-rw-r--r--gnulib/m4/unlink-busy.m435
-rw-r--r--gnulib/m4/unlink.m435
-rw-r--r--gnulib/m4/unlinkdir.m434
-rw-r--r--gnulib/m4/unlocked-io.m441
-rw-r--r--gnulib/m4/uptime.m423
-rw-r--r--gnulib/m4/userspec.m413
-rw-r--r--gnulib/m4/usleep.m437
-rw-r--r--gnulib/m4/utimbuf.m439
-rw-r--r--gnulib/m4/utime.m462
-rw-r--r--gnulib/m4/utimecmp.m414
-rw-r--r--gnulib/m4/utimens.m441
-rw-r--r--gnulib/m4/utimensat.m456
-rw-r--r--gnulib/m4/utimes-null.m441
-rw-r--r--gnulib/m4/utimes.m484
-rw-r--r--gnulib/m4/va-args.m425
-rw-r--r--gnulib/m4/vararrays.m425
-rw-r--r--gnulib/m4/vasnprintf-posix.m4100
-rw-r--r--gnulib/m4/vasnprintf.m4276
-rw-r--r--gnulib/m4/vasprintf-posix.m4101
-rw-r--r--gnulib/m4/vasprintf.m446
-rw-r--r--gnulib/m4/vdprintf-posix.m4101
-rw-r--r--gnulib/m4/vdprintf.m428
-rw-r--r--gnulib/m4/version-etc.m433
-rw-r--r--gnulib/m4/vfprintf-posix.m4110
-rw-r--r--gnulib/m4/visibility.m452
-rw-r--r--gnulib/m4/vprintf-posix.m425
-rw-r--r--gnulib/m4/vsnprintf-posix.m4127
-rw-r--r--gnulib/m4/vsnprintf.m440
-rw-r--r--gnulib/m4/vsprintf-posix.m4108
-rw-r--r--gnulib/m4/wait-process.m413
-rw-r--r--gnulib/m4/warn-on-use.m445
-rw-r--r--gnulib/m4/warnings.m436
-rw-r--r--gnulib/m4/wchar.m4150
-rw-r--r--gnulib/m4/wchar_t.m420
-rw-r--r--gnulib/m4/wcrtomb.m492
-rw-r--r--gnulib/m4/wcsnrtombs.m431
-rw-r--r--gnulib/m4/wcsrtombs.m4155
-rw-r--r--gnulib/m4/wctob.m491
-rw-r--r--gnulib/m4/wctype.m484
-rw-r--r--gnulib/m4/wcwidth.m494
-rw-r--r--gnulib/m4/wint_t.m428
-rw-r--r--gnulib/m4/write-any-file.m415
-rw-r--r--gnulib/m4/write.m420
-rw-r--r--gnulib/m4/xalloc.m425
-rw-r--r--gnulib/m4/xgetcwd.m412
-rw-r--r--gnulib/m4/xnanosleep.m412
-rw-r--r--gnulib/m4/xsize.m413
-rw-r--r--gnulib/m4/xstrndup.m415
-rw-r--r--gnulib/m4/xstrtod.m418
-rw-r--r--gnulib/m4/xstrtol.m412
-rw-r--r--gnulib/m4/xvasprintf.m411
-rw-r--r--gnulib/m4/yesno.m414
-rw-r--r--gnulib/m4/yield.m419
-rw-r--r--gnulib/modules/.gitattributes2
-rw-r--r--gnulib/modules/COPYING8
-rw-r--r--gnulib/modules/README15
-rw-r--r--gnulib/modules/TEMPLATE17
-rw-r--r--gnulib/modules/TEMPLATE-EXTENDED27
-rw-r--r--gnulib/modules/TEMPLATE-TESTS8
-rw-r--r--gnulib/modules/absolute-header23
-rw-r--r--gnulib/modules/accept28
-rw-r--r--gnulib/modules/accept430
-rw-r--r--gnulib/modules/acl35
-rw-r--r--gnulib/modules/acl-tests27
-rw-r--r--gnulib/modules/acos24
-rw-r--r--gnulib/modules/acos-tests13
-rw-r--r--gnulib/modules/acosl30
-rw-r--r--gnulib/modules/acosl-tests14
-rw-r--r--gnulib/modules/agpl-3.019
-rw-r--r--gnulib/modules/alignof20
-rw-r--r--gnulib/modules/alignof-tests13
-rw-r--r--gnulib/modules/alloca21
-rw-r--r--gnulib/modules/alloca-opt35
-rw-r--r--gnulib/modules/alloca-opt-tests11
-rw-r--r--gnulib/modules/alphasort26
-rw-r--r--gnulib/modules/announce-gen19
-rw-r--r--gnulib/modules/areadlink27
-rw-r--r--gnulib/modules/areadlink-tests15
-rw-r--r--gnulib/modules/areadlink-with-size26
-rw-r--r--gnulib/modules/areadlink-with-size-tests15
-rw-r--r--gnulib/modules/areadlinkat26
-rw-r--r--gnulib/modules/areadlinkat-tests16
-rw-r--r--gnulib/modules/areadlinkat-with-size26
-rw-r--r--gnulib/modules/areadlinkat-with-size-tests15
-rw-r--r--gnulib/modules/arg-nonnull39
-rw-r--r--gnulib/modules/argmatch32
-rw-r--r--gnulib/modules/argmatch-tests14
-rw-r--r--gnulib/modules/argp61
-rw-r--r--gnulib/modules/argp-tests11
-rw-r--r--gnulib/modules/argp-version-etc22
-rw-r--r--gnulib/modules/argp-version-etc-tests13
-rw-r--r--gnulib/modules/argv-iter25
-rw-r--r--gnulib/modules/argv-iter-tests11
-rw-r--r--gnulib/modules/argz40
-rw-r--r--gnulib/modules/arpa_inet50
-rw-r--r--gnulib/modules/arpa_inet-tests10
-rw-r--r--gnulib/modules/array-list25
-rw-r--r--gnulib/modules/array-list-tests13
-rw-r--r--gnulib/modules/array-mergesort21
-rw-r--r--gnulib/modules/array-mergesort-tests11
-rw-r--r--gnulib/modules/array-oset25
-rw-r--r--gnulib/modules/array-oset-tests16
-rw-r--r--gnulib/modules/asin24
-rw-r--r--gnulib/modules/asin-tests13
-rw-r--r--gnulib/modules/asinl29
-rw-r--r--gnulib/modules/asinl-tests14
-rw-r--r--gnulib/modules/assert22
-rw-r--r--gnulib/modules/atan24
-rw-r--r--gnulib/modules/atan-tests13
-rw-r--r--gnulib/modules/atan224
-rw-r--r--gnulib/modules/atan2-tests13
-rw-r--r--gnulib/modules/atanl29
-rw-r--r--gnulib/modules/atanl-tests14
-rw-r--r--gnulib/modules/atexit28
-rw-r--r--gnulib/modules/atexit-tests13
-rw-r--r--gnulib/modules/atoll26
-rw-r--r--gnulib/modules/autobuild22
-rw-r--r--gnulib/modules/avltree-list28
-rw-r--r--gnulib/modules/avltree-list-tests13
-rw-r--r--gnulib/modules/avltree-oset25
-rw-r--r--gnulib/modules/avltree-oset-tests13
-rw-r--r--gnulib/modules/avltreehash-list35
-rw-r--r--gnulib/modules/avltreehash-list-tests14
-rw-r--r--gnulib/modules/backupfile31
-rw-r--r--gnulib/modules/base6426
-rw-r--r--gnulib/modules/base64-tests11
-rw-r--r--gnulib/modules/bcopy22
-rw-r--r--gnulib/modules/binary-io22
-rw-r--r--gnulib/modules/binary-io-tests13
-rw-r--r--gnulib/modules/bind28
-rw-r--r--gnulib/modules/bison-i18n22
-rw-r--r--gnulib/modules/bitrotate23
-rw-r--r--gnulib/modules/bitrotate-tests11
-rw-r--r--gnulib/modules/btowc25
-rw-r--r--gnulib/modules/btowc-tests20
-rw-r--r--gnulib/modules/byteswap33
-rw-r--r--gnulib/modules/byteswap-tests11
-rw-r--r--gnulib/modules/c-ctype24
-rw-r--r--gnulib/modules/c-ctype-tests12
-rw-r--r--gnulib/modules/c-stack35
-rw-r--r--gnulib/modules/c-stack-tests17
-rw-r--r--gnulib/modules/c-strcase25
-rw-r--r--gnulib/modules/c-strcase-tests19
-rw-r--r--gnulib/modules/c-strcaseeq23
-rw-r--r--gnulib/modules/c-strcasestr29
-rw-r--r--gnulib/modules/c-strcasestr-tests12
-rw-r--r--gnulib/modules/c-strstr24
-rw-r--r--gnulib/modules/c-strstr-tests12
-rw-r--r--gnulib/modules/c-strtod26
-rw-r--r--gnulib/modules/c-strtold27
-rw-r--r--gnulib/modules/calloc23
-rw-r--r--gnulib/modules/calloc-posix26
-rw-r--r--gnulib/modules/canon-host29
-rw-r--r--gnulib/modules/canonicalize37
-rw-r--r--gnulib/modules/canonicalize-lgpl36
-rw-r--r--gnulib/modules/canonicalize-lgpl-tests15
-rw-r--r--gnulib/modules/canonicalize-tests16
-rw-r--r--gnulib/modules/carray-list25
-rw-r--r--gnulib/modules/carray-list-tests14
-rw-r--r--gnulib/modules/cbrt24
-rw-r--r--gnulib/modules/cbrt-tests13
-rw-r--r--gnulib/modules/ceil26
-rw-r--r--gnulib/modules/ceilf31
-rw-r--r--gnulib/modules/ceilf-tests21
-rw-r--r--gnulib/modules/ceill31
-rw-r--r--gnulib/modules/ceill-tests17
-rw-r--r--gnulib/modules/chdir-long31
-rw-r--r--gnulib/modules/chdir-safer29
-rw-r--r--gnulib/modules/check-version24
-rw-r--r--gnulib/modules/chown29
-rw-r--r--gnulib/modules/chown-tests24
-rw-r--r--gnulib/modules/classpath26
-rw-r--r--gnulib/modules/clean-temp37
-rw-r--r--gnulib/modules/clock-time24
-rw-r--r--gnulib/modules/cloexec27
-rw-r--r--gnulib/modules/cloexec-tests12
-rw-r--r--gnulib/modules/close26
-rw-r--r--gnulib/modules/close-hook23
-rw-r--r--gnulib/modules/close-stream26
-rw-r--r--gnulib/modules/closein27
-rw-r--r--gnulib/modules/closein-tests14
-rw-r--r--gnulib/modules/closeout29
-rw-r--r--gnulib/modules/concat-filename27
-rw-r--r--gnulib/modules/cond31
-rw-r--r--gnulib/modules/cond-tests14
-rw-r--r--gnulib/modules/config-h20
-rw-r--r--gnulib/modules/configmake76
-rw-r--r--gnulib/modules/connect28
-rw-r--r--gnulib/modules/copy-file34
-rw-r--r--gnulib/modules/copy-file-tests19
-rw-r--r--gnulib/modules/copysign24
-rw-r--r--gnulib/modules/copysign-tests13
-rw-r--r--gnulib/modules/cos24
-rw-r--r--gnulib/modules/cos-tests13
-rw-r--r--gnulib/modules/cosh24
-rw-r--r--gnulib/modules/cosh-tests13
-rw-r--r--gnulib/modules/cosl35
-rw-r--r--gnulib/modules/cosl-tests14
-rw-r--r--gnulib/modules/count-one-bits23
-rw-r--r--gnulib/modules/count-one-bits-tests11
-rw-r--r--gnulib/modules/crc24
-rw-r--r--gnulib/modules/crc-tests10
-rw-r--r--gnulib/modules/crypto/arcfour24
-rw-r--r--gnulib/modules/crypto/arcfour-tests10
-rw-r--r--gnulib/modules/crypto/arctwo25
-rw-r--r--gnulib/modules/crypto/arctwo-tests10
-rw-r--r--gnulib/modules/crypto/des26
-rw-r--r--gnulib/modules/crypto/des-tests10
-rw-r--r--gnulib/modules/crypto/gc32
-rw-r--r--gnulib/modules/crypto/gc-arcfour27
-rw-r--r--gnulib/modules/crypto/gc-arcfour-tests10
-rw-r--r--gnulib/modules/crypto/gc-arctwo28
-rw-r--r--gnulib/modules/crypto/gc-arctwo-tests10
-rw-r--r--gnulib/modules/crypto/gc-camellia23
-rw-r--r--gnulib/modules/crypto/gc-des28
-rw-r--r--gnulib/modules/crypto/gc-des-tests10
-rw-r--r--gnulib/modules/crypto/gc-hmac-md533
-rw-r--r--gnulib/modules/crypto/gc-hmac-md5-tests10
-rw-r--r--gnulib/modules/crypto/gc-hmac-sha133
-rw-r--r--gnulib/modules/crypto/gc-hmac-sha1-tests10
-rw-r--r--gnulib/modules/crypto/gc-md226
-rw-r--r--gnulib/modules/crypto/gc-md2-tests10
-rw-r--r--gnulib/modules/crypto/gc-md427
-rw-r--r--gnulib/modules/crypto/gc-md4-tests10
-rw-r--r--gnulib/modules/crypto/gc-md528
-rw-r--r--gnulib/modules/crypto/gc-md5-tests10
-rw-r--r--gnulib/modules/crypto/gc-pbkdf2-sha124
-rw-r--r--gnulib/modules/crypto/gc-pbkdf2-sha1-tests10
-rw-r--r--gnulib/modules/crypto/gc-random23
-rw-r--r--gnulib/modules/crypto/gc-rijndael29
-rw-r--r--gnulib/modules/crypto/gc-rijndael-tests10
-rw-r--r--gnulib/modules/crypto/gc-sha127
-rw-r--r--gnulib/modules/crypto/gc-sha1-tests10
-rw-r--r--gnulib/modules/crypto/gc-tests10
-rw-r--r--gnulib/modules/crypto/hmac-md525
-rw-r--r--gnulib/modules/crypto/hmac-md5-tests10
-rw-r--r--gnulib/modules/crypto/hmac-sha125
-rw-r--r--gnulib/modules/crypto/hmac-sha1-tests10
-rw-r--r--gnulib/modules/crypto/md224
-rw-r--r--gnulib/modules/crypto/md2-tests10
-rw-r--r--gnulib/modules/crypto/md424
-rw-r--r--gnulib/modules/crypto/md4-tests10
-rw-r--r--gnulib/modules/crypto/md524
-rw-r--r--gnulib/modules/crypto/md5-tests10
-rw-r--r--gnulib/modules/crypto/rijndael27
-rw-r--r--gnulib/modules/crypto/rijndael-tests10
-rw-r--r--gnulib/modules/crypto/sha124
-rw-r--r--gnulib/modules/crypto/sha1-tests10
-rw-r--r--gnulib/modules/crypto/sha25624
-rw-r--r--gnulib/modules/crypto/sha51225
-rw-r--r--gnulib/modules/csharpcomp34
-rw-r--r--gnulib/modules/csharpcomp-script21
-rw-r--r--gnulib/modules/csharpexec34
-rw-r--r--gnulib/modules/csharpexec-script23
-rw-r--r--gnulib/modules/ctype41
-rw-r--r--gnulib/modules/ctype-tests10
-rw-r--r--gnulib/modules/cycle-check27
-rw-r--r--gnulib/modules/d-ino20
-rw-r--r--gnulib/modules/d-type20
-rw-r--r--gnulib/modules/dev-ino20
-rw-r--r--gnulib/modules/diacrit23
-rw-r--r--gnulib/modules/diffseq21
-rw-r--r--gnulib/modules/dirent53
-rw-r--r--gnulib/modules/dirent-safer28
-rw-r--r--gnulib/modules/dirent-safer-tests12
-rw-r--r--gnulib/modules/dirent-tests10
-rw-r--r--gnulib/modules/dirfd26
-rw-r--r--gnulib/modules/dirname27
-rw-r--r--gnulib/modules/dirname-lgpl29
-rw-r--r--gnulib/modules/dirname-tests13
-rw-r--r--gnulib/modules/do-release-commit-and-tag19
-rw-r--r--gnulib/modules/double-slash-root20
-rw-r--r--gnulib/modules/dprintf28
-rw-r--r--gnulib/modules/dprintf-posix37
-rw-r--r--gnulib/modules/dprintf-posix-tests18
-rw-r--r--gnulib/modules/dummy20
-rw-r--r--gnulib/modules/dup224
-rw-r--r--gnulib/modules/dup2-tests14
-rw-r--r--gnulib/modules/dup330
-rw-r--r--gnulib/modules/dup3-tests13
-rw-r--r--gnulib/modules/duplocale24
-rw-r--r--gnulib/modules/duplocale-tests13
-rw-r--r--gnulib/modules/eealloc22
-rw-r--r--gnulib/modules/elisp-comp19
-rw-r--r--gnulib/modules/environ25
-rw-r--r--gnulib/modules/environ-tests11
-rw-r--r--gnulib/modules/erf24
-rw-r--r--gnulib/modules/erf-tests13
-rw-r--r--gnulib/modules/erfc24
-rw-r--r--gnulib/modules/erfc-tests13
-rw-r--r--gnulib/modules/errno44
-rw-r--r--gnulib/modules/errno-tests11
-rw-r--r--gnulib/modules/error33
-rw-r--r--gnulib/modules/euidaccess31
-rw-r--r--gnulib/modules/exclude30
-rw-r--r--gnulib/modules/exclude-tests27
-rw-r--r--gnulib/modules/execute45
-rw-r--r--gnulib/modules/exit21
-rw-r--r--gnulib/modules/exitfail24
-rw-r--r--gnulib/modules/exp24
-rw-r--r--gnulib/modules/exp-tests13
-rw-r--r--gnulib/modules/expl30
-rw-r--r--gnulib/modules/expl-tests14
-rw-r--r--gnulib/modules/extensions22
-rw-r--r--gnulib/modules/fabs24
-rw-r--r--gnulib/modules/fabs-tests13
-rw-r--r--gnulib/modules/faccessat33
-rw-r--r--gnulib/modules/fatal-signal32
-rw-r--r--gnulib/modules/fbufmode26
-rw-r--r--gnulib/modules/fbufmode-tests12
-rw-r--r--gnulib/modules/fchdir38
-rw-r--r--gnulib/modules/fchdir-tests13
-rw-r--r--gnulib/modules/fclose26
-rw-r--r--gnulib/modules/fcntl27
-rw-r--r--gnulib/modules/fcntl-h52
-rw-r--r--gnulib/modules/fcntl-h-tests10
-rw-r--r--gnulib/modules/fcntl-safer30
-rw-r--r--gnulib/modules/fcntl-safer-tests14
-rw-r--r--gnulib/modules/fcntl-tests15
-rw-r--r--gnulib/modules/fd-safer-flag27
-rw-r--r--gnulib/modules/fdl19
-rw-r--r--gnulib/modules/fdl-1.319
-rw-r--r--gnulib/modules/fdopendir31
-rw-r--r--gnulib/modules/fdopendir-tests15
-rw-r--r--gnulib/modules/fdutimensat30
-rw-r--r--gnulib/modules/fdutimensat-tests22
-rw-r--r--gnulib/modules/fflush34
-rw-r--r--gnulib/modules/fflush-tests17
-rw-r--r--gnulib/modules/file-set27
-rw-r--r--gnulib/modules/file-type25
-rw-r--r--gnulib/modules/fileblocks22
-rw-r--r--gnulib/modules/filemode26
-rw-r--r--gnulib/modules/filename21
-rw-r--r--gnulib/modules/filenamecat26
-rw-r--r--gnulib/modules/filenamecat-lgpl24
-rw-r--r--gnulib/modules/filenamecat-tests13
-rw-r--r--gnulib/modules/filevercmp26
-rw-r--r--gnulib/modules/filevercmp-tests11
-rw-r--r--gnulib/modules/findprog31
-rw-r--r--gnulib/modules/findprog-lgpl32
-rw-r--r--gnulib/modules/flexmember20
-rw-r--r--gnulib/modules/float37
-rw-r--r--gnulib/modules/flock24
-rw-r--r--gnulib/modules/flock-tests13
-rw-r--r--gnulib/modules/floor26
-rw-r--r--gnulib/modules/floorf31
-rw-r--r--gnulib/modules/floorf-tests21
-rw-r--r--gnulib/modules/floorl31
-rw-r--r--gnulib/modules/floorl-tests17
-rw-r--r--gnulib/modules/fmod24
-rw-r--r--gnulib/modules/fmod-tests13
-rw-r--r--gnulib/modules/fnmatch47
-rw-r--r--gnulib/modules/fnmatch-gnu22
-rw-r--r--gnulib/modules/fnmatch-posix27
-rw-r--r--gnulib/modules/fnmatch-tests8
-rw-r--r--gnulib/modules/fopen26
-rw-r--r--gnulib/modules/fopen-safer27
-rw-r--r--gnulib/modules/fopen-safer-tests12
-rw-r--r--gnulib/modules/fopen-tests14
-rw-r--r--gnulib/modules/fpending23
-rw-r--r--gnulib/modules/fpending-tests13
-rw-r--r--gnulib/modules/fpieee23
-rw-r--r--gnulib/modules/fprintf-posix40
-rw-r--r--gnulib/modules/fprintf-posix-tests21
-rw-r--r--gnulib/modules/fprintftime25
-rw-r--r--gnulib/modules/fpucw21
-rw-r--r--gnulib/modules/fpurge26
-rw-r--r--gnulib/modules/fpurge-tests13
-rw-r--r--gnulib/modules/freadable26
-rw-r--r--gnulib/modules/freadable-tests13
-rw-r--r--gnulib/modules/freadahead25
-rw-r--r--gnulib/modules/freadahead-tests14
-rw-r--r--gnulib/modules/freading27
-rw-r--r--gnulib/modules/freading-tests13
-rw-r--r--gnulib/modules/freadptr24
-rw-r--r--gnulib/modules/freadptr-tests16
-rw-r--r--gnulib/modules/freadseek29
-rw-r--r--gnulib/modules/freadseek-tests13
-rw-r--r--gnulib/modules/free25
-rw-r--r--gnulib/modules/freopen25
-rw-r--r--gnulib/modules/freopen-safer29
-rw-r--r--gnulib/modules/freopen-safer-tests11
-rw-r--r--gnulib/modules/freopen-tests13
-rw-r--r--gnulib/modules/frexp29
-rw-r--r--gnulib/modules/frexp-nolibm26
-rw-r--r--gnulib/modules/frexp-nolibm-tests15
-rw-r--r--gnulib/modules/frexp-tests16
-rw-r--r--gnulib/modules/frexpl31
-rw-r--r--gnulib/modules/frexpl-nolibm29
-rw-r--r--gnulib/modules/frexpl-nolibm-tests16
-rw-r--r--gnulib/modules/frexpl-tests18
-rw-r--r--gnulib/modules/fseek27
-rw-r--r--gnulib/modules/fseek-tests16
-rw-r--r--gnulib/modules/fseeko31
-rw-r--r--gnulib/modules/fseeko-tests16
-rw-r--r--gnulib/modules/fseterr24
-rw-r--r--gnulib/modules/fseterr-tests11
-rw-r--r--gnulib/modules/fstrcmp28
-rw-r--r--gnulib/modules/fstrcmp-tests14
-rw-r--r--gnulib/modules/fsusage26
-rw-r--r--gnulib/modules/fsync24
-rw-r--r--gnulib/modules/fsync-tests12
-rw-r--r--gnulib/modules/ftell27
-rw-r--r--gnulib/modules/ftell-tests17
-rw-r--r--gnulib/modules/ftello30
-rw-r--r--gnulib/modules/ftello-tests17
-rw-r--r--gnulib/modules/ftruncate25
-rw-r--r--gnulib/modules/fts41
-rw-r--r--gnulib/modules/fts-lgpl28
-rw-r--r--gnulib/modules/full-read24
-rw-r--r--gnulib/modules/full-write23
-rw-r--r--gnulib/modules/func20
-rw-r--r--gnulib/modules/func-tests9
-rw-r--r--gnulib/modules/futimens29
-rw-r--r--gnulib/modules/futimens-tests20
-rw-r--r--gnulib/modules/fwritable26
-rw-r--r--gnulib/modules/fwritable-tests13
-rw-r--r--gnulib/modules/fwriteerror25
-rw-r--r--gnulib/modules/fwriting26
-rw-r--r--gnulib/modules/fwriting-tests13
-rw-r--r--gnulib/modules/gcd23
-rw-r--r--gnulib/modules/gen-uni-tables26
-rw-r--r--gnulib/modules/gendocs21
-rw-r--r--gnulib/modules/getaddrinfo38
-rw-r--r--gnulib/modules/getaddrinfo-tests14
-rw-r--r--gnulib/modules/getcwd34
-rw-r--r--gnulib/modules/getcwd-tests12
-rw-r--r--gnulib/modules/getdate40
-rw-r--r--gnulib/modules/getdate-tests14
-rw-r--r--gnulib/modules/getdelim28
-rw-r--r--gnulib/modules/getdelim-tests13
-rw-r--r--gnulib/modules/getdomainname25
-rw-r--r--gnulib/modules/getdtablesize25
-rw-r--r--gnulib/modules/getdtablesize-tests12
-rw-r--r--gnulib/modules/getgroups26
-rw-r--r--gnulib/modules/getgroups-tests12
-rw-r--r--gnulib/modules/gethostname31
-rw-r--r--gnulib/modules/gethostname-tests12
-rw-r--r--gnulib/modules/gethrxtime32
-rw-r--r--gnulib/modules/getline26
-rw-r--r--gnulib/modules/getline-tests13
-rw-r--r--gnulib/modules/getloadavg30
-rw-r--r--gnulib/modules/getlogin24
-rw-r--r--gnulib/modules/getlogin-tests12
-rw-r--r--gnulib/modules/getlogin_r25
-rw-r--r--gnulib/modules/getlogin_r-tests12
-rw-r--r--gnulib/modules/getndelim230
-rw-r--r--gnulib/modules/getndelim2-tests12
-rw-r--r--gnulib/modules/getnline26
-rw-r--r--gnulib/modules/getopt26
-rw-r--r--gnulib/modules/getopt-gnu23
-rw-r--r--gnulib/modules/getopt-posix46
-rw-r--r--gnulib/modules/getopt-posix-tests20
-rw-r--r--gnulib/modules/getpagesize24
-rw-r--r--gnulib/modules/getpass27
-rw-r--r--gnulib/modules/getpass-gnu26
-rw-r--r--gnulib/modules/getpeername29
-rw-r--r--gnulib/modules/getsockname29
-rw-r--r--gnulib/modules/getsockopt30
-rw-r--r--gnulib/modules/getsubopt27
-rw-r--r--gnulib/modules/gettext64
-rw-r--r--gnulib/modules/gettext-h26
-rw-r--r--gnulib/modules/gettime30
-rw-r--r--gnulib/modules/gettimeofday24
-rw-r--r--gnulib/modules/gettimeofday-tests12
-rw-r--r--gnulib/modules/getugroups23
-rw-r--r--gnulib/modules/getusershell27
-rw-r--r--gnulib/modules/git-merge-changelog40
-rw-r--r--gnulib/modules/git-version-gen19
-rw-r--r--gnulib/modules/gitlog-to-changelog19
-rw-r--r--gnulib/modules/glob52
-rw-r--r--gnulib/modules/glob-tests8
-rw-r--r--gnulib/modules/gnu-make28
-rw-r--r--gnulib/modules/gnu-web-doc-update20
-rw-r--r--gnulib/modules/gnumakefile32
-rw-r--r--gnulib/modules/gnupload21
-rw-r--r--gnulib/modules/gperf20
-rw-r--r--gnulib/modules/gpl-2.019
-rw-r--r--gnulib/modules/gpl-3.019
-rw-r--r--gnulib/modules/group-member27
-rw-r--r--gnulib/modules/hard-locale25
-rw-r--r--gnulib/modules/hash27
-rw-r--r--gnulib/modules/hash-pjw23
-rw-r--r--gnulib/modules/hash-tests17
-rw-r--r--gnulib/modules/hash-triple25
-rw-r--r--gnulib/modules/havelib22
-rw-r--r--gnulib/modules/host-os20
-rw-r--r--gnulib/modules/hostent27
-rw-r--r--gnulib/modules/human31
-rw-r--r--gnulib/modules/hypot24
-rw-r--r--gnulib/modules/hypot-tests13
-rw-r--r--gnulib/modules/i-ring25
-rw-r--r--gnulib/modules/i-ring-tests11
-rw-r--r--gnulib/modules/iconv28
-rw-r--r--gnulib/modules/iconv-tests14
-rw-r--r--gnulib/modules/iconv_open78
-rw-r--r--gnulib/modules/iconv_open-utf29
-rw-r--r--gnulib/modules/iconv_open-utf-tests13
-rw-r--r--gnulib/modules/idcache24
-rw-r--r--gnulib/modules/idpriv-drop27
-rw-r--r--gnulib/modules/idpriv-drop-tests19
-rw-r--r--gnulib/modules/idpriv-droptemp27
-rw-r--r--gnulib/modules/idpriv-droptemp-tests19
-rw-r--r--gnulib/modules/ignore-value22
-rw-r--r--gnulib/modules/imaxabs24
-rw-r--r--gnulib/modules/imaxdiv24
-rw-r--r--gnulib/modules/include_next19
-rw-r--r--gnulib/modules/inet_ntop32
-rw-r--r--gnulib/modules/inet_ntop-tests16
-rw-r--r--gnulib/modules/inet_pton33
-rw-r--r--gnulib/modules/inet_pton-tests16
-rw-r--r--gnulib/modules/inline21
-rw-r--r--gnulib/modules/intprops20
-rw-r--r--gnulib/modules/inttostr30
-rw-r--r--gnulib/modules/inttypes62
-rw-r--r--gnulib/modules/inttypes-tests10
-rw-r--r--gnulib/modules/ioctl34
-rw-r--r--gnulib/modules/isapipe26
-rw-r--r--gnulib/modules/isblank25
-rw-r--r--gnulib/modules/isblank-tests12
-rw-r--r--gnulib/modules/isdir22
-rw-r--r--gnulib/modules/isfinite29
-rw-r--r--gnulib/modules/isfinite-tests16
-rw-r--r--gnulib/modules/isinf27
-rw-r--r--gnulib/modules/isinf-tests19
-rw-r--r--gnulib/modules/isnan27
-rw-r--r--gnulib/modules/isnan-tests18
-rw-r--r--gnulib/modules/isnand33
-rw-r--r--gnulib/modules/isnand-nolibm29
-rw-r--r--gnulib/modules/isnand-nolibm-tests15
-rw-r--r--gnulib/modules/isnand-tests16
-rw-r--r--gnulib/modules/isnanf33
-rw-r--r--gnulib/modules/isnanf-nolibm29
-rw-r--r--gnulib/modules/isnanf-nolibm-tests15
-rw-r--r--gnulib/modules/isnanf-tests16
-rw-r--r--gnulib/modules/isnanl34
-rw-r--r--gnulib/modules/isnanl-nolibm30
-rw-r--r--gnulib/modules/isnanl-nolibm-tests16
-rw-r--r--gnulib/modules/isnanl-tests17
-rw-r--r--gnulib/modules/j024
-rw-r--r--gnulib/modules/j0-tests13
-rw-r--r--gnulib/modules/j124
-rw-r--r--gnulib/modules/j1-tests13
-rw-r--r--gnulib/modules/javacomp45
-rw-r--r--gnulib/modules/javacomp-script21
-rw-r--r--gnulib/modules/javaexec35
-rw-r--r--gnulib/modules/javaexec-script23
-rw-r--r--gnulib/modules/javaversion33
-rw-r--r--gnulib/modules/jn24
-rw-r--r--gnulib/modules/jn-tests13
-rw-r--r--gnulib/modules/langinfo46
-rw-r--r--gnulib/modules/langinfo-tests10
-rw-r--r--gnulib/modules/lchmod24
-rw-r--r--gnulib/modules/lchown29
-rw-r--r--gnulib/modules/lchown-tests23
-rw-r--r--gnulib/modules/ldd23
-rw-r--r--gnulib/modules/ldexp24
-rw-r--r--gnulib/modules/ldexp-tests13
-rw-r--r--gnulib/modules/ldexpl30
-rw-r--r--gnulib/modules/ldexpl-tests17
-rw-r--r--gnulib/modules/lgamma24
-rw-r--r--gnulib/modules/lgamma-tests13
-rw-r--r--gnulib/modules/lgpl-2.119
-rw-r--r--gnulib/modules/lib-ignore20
-rw-r--r--gnulib/modules/lib-msvc-compat14
-rw-r--r--gnulib/modules/lib-symbol-versions14
-rw-r--r--gnulib/modules/lib-symbol-visibility26
-rw-r--r--gnulib/modules/libsigsegv27
-rw-r--r--gnulib/modules/libunistring40
-rw-r--r--gnulib/modules/linebuffer24
-rw-r--r--gnulib/modules/link27
-rw-r--r--gnulib/modules/link-follow20
-rw-r--r--gnulib/modules/link-tests17
-rw-r--r--gnulib/modules/link-warning40
-rw-r--r--gnulib/modules/linkat42
-rw-r--r--gnulib/modules/linkat-tests20
-rw-r--r--gnulib/modules/linked-list26
-rw-r--r--gnulib/modules/linked-list-tests13
-rw-r--r--gnulib/modules/linkedhash-list30
-rw-r--r--gnulib/modules/linkedhash-list-tests13
-rw-r--r--gnulib/modules/list26
-rw-r--r--gnulib/modules/listen28
-rw-r--r--gnulib/modules/localcharset106
-rw-r--r--gnulib/modules/locale46
-rw-r--r--gnulib/modules/locale-tests12
-rw-r--r--gnulib/modules/localename32
-rw-r--r--gnulib/modules/localename-tests18
-rw-r--r--gnulib/modules/lock29
-rw-r--r--gnulib/modules/lock-tests13
-rw-r--r--gnulib/modules/log24
-rw-r--r--gnulib/modules/log-tests13
-rw-r--r--gnulib/modules/log1024
-rw-r--r--gnulib/modules/log10-tests13
-rw-r--r--gnulib/modules/log1p24
-rw-r--r--gnulib/modules/log1p-tests13
-rw-r--r--gnulib/modules/logb24
-rw-r--r--gnulib/modules/logb-tests13
-rw-r--r--gnulib/modules/logl31
-rw-r--r--gnulib/modules/logl-tests14
-rw-r--r--gnulib/modules/long-options25
-rw-r--r--gnulib/modules/longlong15
-rw-r--r--gnulib/modules/lseek24
-rw-r--r--gnulib/modules/lseek-tests13
-rw-r--r--gnulib/modules/lstat25
-rw-r--r--gnulib/modules/lstat-tests18
-rw-r--r--gnulib/modules/maintainer-makefile20
-rw-r--r--gnulib/modules/malloc23
-rw-r--r--gnulib/modules/malloc-posix25
-rw-r--r--gnulib/modules/malloca28
-rw-r--r--gnulib/modules/malloca-tests11
-rw-r--r--gnulib/modules/manywarnings16
-rw-r--r--gnulib/modules/math113
-rw-r--r--gnulib/modules/math-tests10
-rw-r--r--gnulib/modules/mathl43
-rw-r--r--gnulib/modules/mbchar30
-rw-r--r--gnulib/modules/mbfile30
-rw-r--r--gnulib/modules/mbiter30
-rw-r--r--gnulib/modules/mbmemcasecmp24
-rw-r--r--gnulib/modules/mbmemcasecmp-tests27
-rw-r--r--gnulib/modules/mbmemcasecoll30
-rw-r--r--gnulib/modules/mbmemcasecoll-tests27
-rw-r--r--gnulib/modules/mbrlen28
-rw-r--r--gnulib/modules/mbrtowc35
-rw-r--r--gnulib/modules/mbrtowc-tests32
-rw-r--r--gnulib/modules/mbscasecmp25
-rw-r--r--gnulib/modules/mbscasecmp-tests17
-rw-r--r--gnulib/modules/mbscasestr30
-rw-r--r--gnulib/modules/mbscasestr-tests26
-rw-r--r--gnulib/modules/mbschr25
-rw-r--r--gnulib/modules/mbschr-tests17
-rw-r--r--gnulib/modules/mbscspn27
-rw-r--r--gnulib/modules/mbscspn-tests17
-rw-r--r--gnulib/modules/mbsinit29
-rw-r--r--gnulib/modules/mbsinit-tests19
-rw-r--r--gnulib/modules/mbslen27
-rw-r--r--gnulib/modules/mbsncasecmp25
-rw-r--r--gnulib/modules/mbsncasecmp-tests17
-rw-r--r--gnulib/modules/mbsnlen25
-rw-r--r--gnulib/modules/mbsnrtowcs31
-rw-r--r--gnulib/modules/mbsnrtowcs-tests33
-rw-r--r--gnulib/modules/mbspbrk27
-rw-r--r--gnulib/modules/mbspbrk-tests17
-rw-r--r--gnulib/modules/mbspcasecmp25
-rw-r--r--gnulib/modules/mbspcasecmp-tests17
-rw-r--r--gnulib/modules/mbsrchr25
-rw-r--r--gnulib/modules/mbsrchr-tests17
-rw-r--r--gnulib/modules/mbsrtowcs34
-rw-r--r--gnulib/modules/mbsrtowcs-tests33
-rw-r--r--gnulib/modules/mbssep27
-rw-r--r--gnulib/modules/mbsspn26
-rw-r--r--gnulib/modules/mbsspn-tests17
-rw-r--r--gnulib/modules/mbsstr30
-rw-r--r--gnulib/modules/mbsstr-tests22
-rw-r--r--gnulib/modules/mbstok_r28
-rw-r--r--gnulib/modules/mbswidth32
-rw-r--r--gnulib/modules/mbuiter31
-rw-r--r--gnulib/modules/memcasecmp23
-rw-r--r--gnulib/modules/memchr27
-rw-r--r--gnulib/modules/memchr-tests13
-rw-r--r--gnulib/modules/memchr225
-rw-r--r--gnulib/modules/memchr2-tests18
-rw-r--r--gnulib/modules/memcmp30
-rw-r--r--gnulib/modules/memcmp-tests19
-rw-r--r--gnulib/modules/memcmp222
-rw-r--r--gnulib/modules/memcoll24
-rw-r--r--gnulib/modules/memcpy29
-rw-r--r--gnulib/modules/memmem21
-rw-r--r--gnulib/modules/memmem-simple29
-rw-r--r--gnulib/modules/memmem-tests21
-rw-r--r--gnulib/modules/memmove28
-rw-r--r--gnulib/modules/mempcpy25
-rw-r--r--gnulib/modules/memrchr25
-rw-r--r--gnulib/modules/memrchr-tests19
-rw-r--r--gnulib/modules/memset28
-rw-r--r--gnulib/modules/memxfrm22
-rw-r--r--gnulib/modules/memxor23
-rw-r--r--gnulib/modules/mgetgroups27
-rw-r--r--gnulib/modules/minmax24
-rw-r--r--gnulib/modules/mkancesdirs28
-rw-r--r--gnulib/modules/mkdir24
-rw-r--r--gnulib/modules/mkdir-p37
-rw-r--r--gnulib/modules/mkdir-tests16
-rw-r--r--gnulib/modules/mkdtemp27
-rw-r--r--gnulib/modules/mkfifo25
-rw-r--r--gnulib/modules/mkfifo-tests16
-rw-r--r--gnulib/modules/mkfifoat32
-rw-r--r--gnulib/modules/mkfifoat-tests16
-rw-r--r--gnulib/modules/mknod27
-rw-r--r--gnulib/modules/mknod-tests16
-rw-r--r--gnulib/modules/mkostemp28
-rw-r--r--gnulib/modules/mkostemps28
-rw-r--r--gnulib/modules/mkstemp26
-rw-r--r--gnulib/modules/mkstemps27
-rw-r--r--gnulib/modules/mktempd19
-rw-r--r--gnulib/modules/mktime25
-rw-r--r--gnulib/modules/modechange29
-rw-r--r--gnulib/modules/modf24
-rw-r--r--gnulib/modules/modf-tests13
-rw-r--r--gnulib/modules/mountlist29
-rw-r--r--gnulib/modules/mpsort23
-rw-r--r--gnulib/modules/multiarch21
-rw-r--r--gnulib/modules/nanosleep35
-rw-r--r--gnulib/modules/nanosleep-tests14
-rw-r--r--gnulib/modules/netdb47
-rw-r--r--gnulib/modules/netdb-tests10
-rw-r--r--gnulib/modules/netinet_in42
-rw-r--r--gnulib/modules/netinet_in-tests10
-rw-r--r--gnulib/modules/nextafter24
-rw-r--r--gnulib/modules/nextafter-tests13
-rw-r--r--gnulib/modules/nl_langinfo24
-rw-r--r--gnulib/modules/nl_langinfo-tests18
-rw-r--r--gnulib/modules/no-c++21
-rw-r--r--gnulib/modules/nocrash20
-rw-r--r--gnulib/modules/nproc27
-rw-r--r--gnulib/modules/obstack27
-rw-r--r--gnulib/modules/obstack-printf27
-rw-r--r--gnulib/modules/obstack-printf-posix28
-rw-r--r--gnulib/modules/obstack-printf-posix-tests8
-rw-r--r--gnulib/modules/obstack-printf-tests15
-rw-r--r--gnulib/modules/open28
-rw-r--r--gnulib/modules/open-tests15
-rw-r--r--gnulib/modules/openat55
-rw-r--r--gnulib/modules/openat-die25
-rw-r--r--gnulib/modules/openat-safer28
-rw-r--r--gnulib/modules/openat-safer-tests12
-rw-r--r--gnulib/modules/openat-tests38
-rw-r--r--gnulib/modules/openmp24
-rw-r--r--gnulib/modules/oset26
-rw-r--r--gnulib/modules/pagealign_alloc31
-rw-r--r--gnulib/modules/parse-duration25
-rw-r--r--gnulib/modules/parse-duration-tests14
-rw-r--r--gnulib/modules/pathmax22
-rw-r--r--gnulib/modules/perl20
-rw-r--r--gnulib/modules/perror26
-rw-r--r--gnulib/modules/perror-tests12
-rw-r--r--gnulib/modules/physmem23
-rw-r--r--gnulib/modules/pipe51
-rw-r--r--gnulib/modules/pipe-filter-gi34
-rw-r--r--gnulib/modules/pipe-filter-gi-tests24
-rw-r--r--gnulib/modules/pipe-filter-ii34
-rw-r--r--gnulib/modules/pipe-filter-ii-tests23
-rw-r--r--gnulib/modules/pipe-tests14
-rw-r--r--gnulib/modules/pipe228
-rw-r--r--gnulib/modules/pipe2-safer26
-rw-r--r--gnulib/modules/pipe2-tests13
-rw-r--r--gnulib/modules/pmccabe2html22
-rw-r--r--gnulib/modules/poll39
-rw-r--r--gnulib/modules/poll-tests31
-rw-r--r--gnulib/modules/popen25
-rw-r--r--gnulib/modules/popen-safer29
-rw-r--r--gnulib/modules/popen-safer-tests15
-rw-r--r--gnulib/modules/popen-tests15
-rw-r--r--gnulib/modules/posix-shell30
-rw-r--r--gnulib/modules/posix_spawn31
-rw-r--r--gnulib/modules/posix_spawn-internal28
-rw-r--r--gnulib/modules/posix_spawn-tests27
-rw-r--r--gnulib/modules/posix_spawn_file_actions_addclose32
-rw-r--r--gnulib/modules/posix_spawn_file_actions_adddup232
-rw-r--r--gnulib/modules/posix_spawn_file_actions_addopen32
-rw-r--r--gnulib/modules/posix_spawn_file_actions_destroy30
-rw-r--r--gnulib/modules/posix_spawn_file_actions_init31
-rw-r--r--gnulib/modules/posix_spawnattr_destroy30
-rw-r--r--gnulib/modules/posix_spawnattr_getflags30
-rw-r--r--gnulib/modules/posix_spawnattr_getpgroup30
-rw-r--r--gnulib/modules/posix_spawnattr_getschedparam30
-rw-r--r--gnulib/modules/posix_spawnattr_getschedpolicy30
-rw-r--r--gnulib/modules/posix_spawnattr_getsigdefault30
-rw-r--r--gnulib/modules/posix_spawnattr_getsigmask30
-rw-r--r--gnulib/modules/posix_spawnattr_init30
-rw-r--r--gnulib/modules/posix_spawnattr_setflags30
-rw-r--r--gnulib/modules/posix_spawnattr_setpgroup29
-rw-r--r--gnulib/modules/posix_spawnattr_setschedparam30
-rw-r--r--gnulib/modules/posix_spawnattr_setschedpolicy30
-rw-r--r--gnulib/modules/posix_spawnattr_setsigdefault30
-rw-r--r--gnulib/modules/posix_spawnattr_setsigmask30
-rw-r--r--gnulib/modules/posix_spawnp31
-rw-r--r--gnulib/modules/posix_spawnp-tests51
-rw-r--r--gnulib/modules/posixtm26
-rw-r--r--gnulib/modules/posixtm-tests14
-rw-r--r--gnulib/modules/posixver24
-rw-r--r--gnulib/modules/pow24
-rw-r--r--gnulib/modules/pow-tests13
-rw-r--r--gnulib/modules/pread25
-rw-r--r--gnulib/modules/pread-tests14
-rw-r--r--gnulib/modules/printf-frexp27
-rw-r--r--gnulib/modules/printf-frexp-tests11
-rw-r--r--gnulib/modules/printf-frexpl32
-rw-r--r--gnulib/modules/printf-frexpl-tests12
-rw-r--r--gnulib/modules/printf-posix28
-rw-r--r--gnulib/modules/printf-posix-tests19
-rw-r--r--gnulib/modules/printf-safe22
-rw-r--r--gnulib/modules/priv-set26
-rw-r--r--gnulib/modules/priv-set-tests11
-rw-r--r--gnulib/modules/progname25
-rw-r--r--gnulib/modules/propername46
-rw-r--r--gnulib/modules/pthread29
-rw-r--r--gnulib/modules/pty33
-rw-r--r--gnulib/modules/pty-tests8
-rw-r--r--gnulib/modules/putenv26
-rw-r--r--gnulib/modules/quote24
-rw-r--r--gnulib/modules/quotearg34
-rw-r--r--gnulib/modules/quotearg-tests25
-rw-r--r--gnulib/modules/raise28
-rw-r--r--gnulib/modules/random_r25
-rw-r--r--gnulib/modules/random_r-tests12
-rw-r--r--gnulib/modules/rawmemchr26
-rw-r--r--gnulib/modules/rawmemchr-tests12
-rw-r--r--gnulib/modules/rbtree-list28
-rw-r--r--gnulib/modules/rbtree-list-tests13
-rw-r--r--gnulib/modules/rbtree-oset25
-rw-r--r--gnulib/modules/rbtree-oset-tests13
-rw-r--r--gnulib/modules/rbtreehash-list35
-rw-r--r--gnulib/modules/rbtreehash-list-tests13
-rw-r--r--gnulib/modules/read-file24
-rw-r--r--gnulib/modules/read-file-tests10
-rw-r--r--gnulib/modules/readline28
-rw-r--r--gnulib/modules/readlink26
-rw-r--r--gnulib/modules/readlink-tests16
-rw-r--r--gnulib/modules/readtokens25
-rw-r--r--gnulib/modules/readtokens024
-rw-r--r--gnulib/modules/readutmp27
-rw-r--r--gnulib/modules/realloc23
-rw-r--r--gnulib/modules/realloc-posix26
-rw-r--r--gnulib/modules/recv28
-rw-r--r--gnulib/modules/recvfrom29
-rw-r--r--gnulib/modules/regex45
-rw-r--r--gnulib/modules/regexprops-generic19
-rw-r--r--gnulib/modules/relocatable-lib28
-rw-r--r--gnulib/modules/relocatable-lib-lgpl28
-rw-r--r--gnulib/modules/relocatable-prog42
-rw-r--r--gnulib/modules/relocatable-prog-wrapper63
-rw-r--r--gnulib/modules/relocatable-script26
-rw-r--r--gnulib/modules/remainder24
-rw-r--r--gnulib/modules/remainder-tests13
-rw-r--r--gnulib/modules/remove27
-rw-r--r--gnulib/modules/remove-tests15
-rw-r--r--gnulib/modules/rename31
-rw-r--r--gnulib/modules/rename-dest-slash26
-rw-r--r--gnulib/modules/rename-tests19
-rw-r--r--gnulib/modules/renameat33
-rw-r--r--gnulib/modules/renameat-tests18
-rw-r--r--gnulib/modules/rint24
-rw-r--r--gnulib/modules/rint-tests13
-rw-r--r--gnulib/modules/rmdir26
-rw-r--r--gnulib/modules/rmdir-errno26
-rw-r--r--gnulib/modules/rmdir-tests16
-rw-r--r--gnulib/modules/round34
-rw-r--r--gnulib/modules/round-tests21
-rw-r--r--gnulib/modules/roundf34
-rw-r--r--gnulib/modules/roundf-tests24
-rw-r--r--gnulib/modules/roundl34
-rw-r--r--gnulib/modules/roundl-tests17
-rw-r--r--gnulib/modules/rpmatch30
-rw-r--r--gnulib/modules/safe-alloc21
-rw-r--r--gnulib/modules/safe-alloc-tests11
-rw-r--r--gnulib/modules/safe-read24
-rw-r--r--gnulib/modules/safe-write25
-rw-r--r--gnulib/modules/same30
-rw-r--r--gnulib/modules/same-inode20
-rw-r--r--gnulib/modules/save-cwd27
-rw-r--r--gnulib/modules/savedir26
-rw-r--r--gnulib/modules/savewd33
-rw-r--r--gnulib/modules/scandir26
-rw-r--r--gnulib/modules/sched40
-rw-r--r--gnulib/modules/sched-tests10
-rw-r--r--gnulib/modules/search45
-rw-r--r--gnulib/modules/search-tests10
-rw-r--r--gnulib/modules/select29
-rw-r--r--gnulib/modules/select-tests37
-rw-r--r--gnulib/modules/selinux-at25
-rw-r--r--gnulib/modules/selinux-h62
-rw-r--r--gnulib/modules/send28
-rw-r--r--gnulib/modules/sendto28
-rw-r--r--gnulib/modules/servent28
-rw-r--r--gnulib/modules/setenv29
-rw-r--r--gnulib/modules/setenv-tests12
-rw-r--r--gnulib/modules/setsockopt30
-rw-r--r--gnulib/modules/settime30
-rw-r--r--gnulib/modules/sh-quote25
-rw-r--r--gnulib/modules/shutdown28
-rw-r--r--gnulib/modules/sig2str24
-rw-r--r--gnulib/modules/sigaction26
-rw-r--r--gnulib/modules/sigaction-tests12
-rw-r--r--gnulib/modules/signal50
-rw-r--r--gnulib/modules/signal-tests10
-rw-r--r--gnulib/modules/signbit34
-rw-r--r--gnulib/modules/signbit-tests19
-rw-r--r--gnulib/modules/sigpipe37
-rw-r--r--gnulib/modules/sigpipe-die28
-rw-r--r--gnulib/modules/sigpipe-tests13
-rw-r--r--gnulib/modules/sigprocmask27
-rw-r--r--gnulib/modules/sin24
-rw-r--r--gnulib/modules/sin-tests13
-rw-r--r--gnulib/modules/sinh24
-rw-r--r--gnulib/modules/sinh-tests13
-rw-r--r--gnulib/modules/sinl35
-rw-r--r--gnulib/modules/sinl-tests14
-rw-r--r--gnulib/modules/size_max24
-rw-r--r--gnulib/modules/sleep27
-rw-r--r--gnulib/modules/sleep-tests13
-rw-r--r--gnulib/modules/snprintf27
-rw-r--r--gnulib/modules/snprintf-posix37
-rw-r--r--gnulib/modules/snprintf-posix-tests20
-rw-r--r--gnulib/modules/snprintf-tests13
-rw-r--r--gnulib/modules/socket38
-rw-r--r--gnulib/modules/sockets30
-rw-r--r--gnulib/modules/sockets-tests11
-rw-r--r--gnulib/modules/socklen23
-rw-r--r--gnulib/modules/spawn69
-rw-r--r--gnulib/modules/spawn-tests10
-rw-r--r--gnulib/modules/sprintf-posix40
-rw-r--r--gnulib/modules/sprintf-posix-tests17
-rw-r--r--gnulib/modules/sqrt25
-rw-r--r--gnulib/modules/sqrt-tests13
-rw-r--r--gnulib/modules/sqrtl33
-rw-r--r--gnulib/modules/sqrtl-tests14
-rw-r--r--gnulib/modules/ssize_t21
-rw-r--r--gnulib/modules/stat26
-rw-r--r--gnulib/modules/stat-macros20
-rw-r--r--gnulib/modules/stat-tests17
-rw-r--r--gnulib/modules/stat-time25
-rw-r--r--gnulib/modules/stat-time-tests13
-rw-r--r--gnulib/modules/stdarg44
-rw-r--r--gnulib/modules/stdbool34
-rw-r--r--gnulib/modules/stdbool-tests10
-rw-r--r--gnulib/modules/stddef40
-rw-r--r--gnulib/modules/stddef-tests11
-rw-r--r--gnulib/modules/stdint66
-rw-r--r--gnulib/modules/stdint-tests16
-rw-r--r--gnulib/modules/stdio123
-rw-r--r--gnulib/modules/stdio-tests11
-rw-r--r--gnulib/modules/stdlib94
-rw-r--r--gnulib/modules/stdlib-safer29
-rw-r--r--gnulib/modules/stdlib-tests11
-rw-r--r--gnulib/modules/stpcpy25
-rw-r--r--gnulib/modules/stpncpy25
-rw-r--r--gnulib/modules/strcase24
-rw-r--r--gnulib/modules/strcasestr22
-rw-r--r--gnulib/modules/strcasestr-simple31
-rw-r--r--gnulib/modules/strcasestr-tests14
-rw-r--r--gnulib/modules/strchrnul28
-rw-r--r--gnulib/modules/strchrnul-tests12
-rw-r--r--gnulib/modules/strcspn29
-rw-r--r--gnulib/modules/strdup30
-rw-r--r--gnulib/modules/strdup-posix25
-rw-r--r--gnulib/modules/streq21
-rw-r--r--gnulib/modules/strerror26
-rw-r--r--gnulib/modules/strerror-tests12
-rw-r--r--gnulib/modules/strftime31
-rw-r--r--gnulib/modules/striconv37
-rw-r--r--gnulib/modules/striconv-tests13
-rw-r--r--gnulib/modules/striconveh46
-rw-r--r--gnulib/modules/striconveh-tests13
-rw-r--r--gnulib/modules/striconveha29
-rw-r--r--gnulib/modules/striconveha-tests13
-rw-r--r--gnulib/modules/string105
-rw-r--r--gnulib/modules/string-tests11
-rw-r--r--gnulib/modules/strings43
-rw-r--r--gnulib/modules/strings-tests10
-rw-r--r--gnulib/modules/strndup26
-rw-r--r--gnulib/modules/strnlen26
-rw-r--r--gnulib/modules/strnlen124
-rw-r--r--gnulib/modules/strpbrk30
-rw-r--r--gnulib/modules/strptime30
-rw-r--r--gnulib/modules/strsep26
-rw-r--r--gnulib/modules/strsignal31
-rw-r--r--gnulib/modules/strsignal-tests13
-rw-r--r--gnulib/modules/strstr21
-rw-r--r--gnulib/modules/strstr-simple28
-rw-r--r--gnulib/modules/strstr-tests20
-rw-r--r--gnulib/modules/strtod30
-rw-r--r--gnulib/modules/strtod-tests16
-rw-r--r--gnulib/modules/strtoimax28
-rw-r--r--gnulib/modules/strtok_r25
-rw-r--r--gnulib/modules/strtol24
-rw-r--r--gnulib/modules/strtoll27
-rw-r--r--gnulib/modules/strtoul24
-rw-r--r--gnulib/modules/strtoull27
-rw-r--r--gnulib/modules/strtoumax28
-rw-r--r--gnulib/modules/strverscmp25
-rw-r--r--gnulib/modules/strverscmp-tests12
-rw-r--r--gnulib/modules/sublist24
-rw-r--r--gnulib/modules/symlink25
-rw-r--r--gnulib/modules/symlink-tests15
-rw-r--r--gnulib/modules/symlinkat31
-rw-r--r--gnulib/modules/symlinkat-tests16
-rw-r--r--gnulib/modules/sys_file45
-rw-r--r--gnulib/modules/sys_file-tests10
-rw-r--r--gnulib/modules/sys_ioctl47
-rw-r--r--gnulib/modules/sys_ioctl-tests10
-rw-r--r--gnulib/modules/sys_select48
-rw-r--r--gnulib/modules/sys_select-tests10
-rw-r--r--gnulib/modules/sys_socket69
-rw-r--r--gnulib/modules/sys_socket-tests11
-rw-r--r--gnulib/modules/sys_stat78
-rw-r--r--gnulib/modules/sys_stat-tests11
-rw-r--r--gnulib/modules/sys_time48
-rw-r--r--gnulib/modules/sys_time-tests10
-rw-r--r--gnulib/modules/sys_times48
-rw-r--r--gnulib/modules/sys_times-tests6
-rw-r--r--gnulib/modules/sys_utsname48
-rw-r--r--gnulib/modules/sys_utsname-tests10
-rw-r--r--gnulib/modules/sys_wait40
-rw-r--r--gnulib/modules/sys_wait-tests10
-rw-r--r--gnulib/modules/sysexits38
-rw-r--r--gnulib/modules/sysexits-tests10
-rw-r--r--gnulib/modules/tan24
-rw-r--r--gnulib/modules/tan-tests13
-rw-r--r--gnulib/modules/tanh24
-rw-r--r--gnulib/modules/tanh-tests13
-rw-r--r--gnulib/modules/tanl34
-rw-r--r--gnulib/modules/tanl-tests14
-rw-r--r--gnulib/modules/tempname29
-rw-r--r--gnulib/modules/thread30
-rw-r--r--gnulib/modules/threadlib31
-rw-r--r--gnulib/modules/time48
-rw-r--r--gnulib/modules/time-tests11
-rw-r--r--gnulib/modules/time_r24
-rw-r--r--gnulib/modules/timegm26
-rw-r--r--gnulib/modules/times24
-rw-r--r--gnulib/modules/times-tests7
-rw-r--r--gnulib/modules/timespec23
-rw-r--r--gnulib/modules/tls29
-rw-r--r--gnulib/modules/tls-tests14
-rw-r--r--gnulib/modules/tmpdir27
-rw-r--r--gnulib/modules/tmpfile25
-rw-r--r--gnulib/modules/tmpfile-safer28
-rw-r--r--gnulib/modules/trim27
-rw-r--r--gnulib/modules/trunc30
-rw-r--r--gnulib/modules/trunc-tests21
-rw-r--r--gnulib/modules/truncf31
-rw-r--r--gnulib/modules/truncf-tests21
-rw-r--r--gnulib/modules/truncl31
-rw-r--r--gnulib/modules/truncl-tests17
-rw-r--r--gnulib/modules/tsearch25
-rw-r--r--gnulib/modules/tsearch-tests24
-rw-r--r--gnulib/modules/tzset23
-rw-r--r--gnulib/modules/u6422
-rw-r--r--gnulib/modules/u64-tests6
-rw-r--r--gnulib/modules/ucs4-utf1621
-rw-r--r--gnulib/modules/ucs4-utf821
-rw-r--r--gnulib/modules/uname28
-rw-r--r--gnulib/modules/uname-tests13
-rw-r--r--gnulib/modules/unicase/base24
-rw-r--r--gnulib/modules/unicase/cased28
-rw-r--r--gnulib/modules/unicase/cased-tests15
-rw-r--r--gnulib/modules/unicase/empty-prefix-context23
-rw-r--r--gnulib/modules/unicase/empty-suffix-context23
-rw-r--r--gnulib/modules/unicase/ignorable28
-rw-r--r--gnulib/modules/unicase/ignorable-tests15
-rw-r--r--gnulib/modules/unicase/locale-language34
-rw-r--r--gnulib/modules/unicase/locale-language-tests25
-rw-r--r--gnulib/modules/unicase/special-casing33
-rw-r--r--gnulib/modules/unicase/tocasefold26
-rw-r--r--gnulib/modules/unicase/tolower25
-rw-r--r--gnulib/modules/unicase/tolower-tests15
-rw-r--r--gnulib/modules/unicase/totitle25
-rw-r--r--gnulib/modules/unicase/totitle-tests15
-rw-r--r--gnulib/modules/unicase/toupper25
-rw-r--r--gnulib/modules/unicase/toupper-tests15
-rw-r--r--gnulib/modules/unicase/u16-casecmp28
-rw-r--r--gnulib/modules/unicase/u16-casecmp-tests15
-rw-r--r--gnulib/modules/unicase/u16-casecoll27
-rw-r--r--gnulib/modules/unicase/u16-casecoll-tests16
-rw-r--r--gnulib/modules/unicase/u16-casefold27
-rw-r--r--gnulib/modules/unicase/u16-casefold-tests16
-rw-r--r--gnulib/modules/unicase/u16-casemap36
-rw-r--r--gnulib/modules/unicase/u16-casexfrm29
-rw-r--r--gnulib/modules/unicase/u16-ct-casefold30
-rw-r--r--gnulib/modules/unicase/u16-ct-tolower26
-rw-r--r--gnulib/modules/unicase/u16-ct-totitle38
-rw-r--r--gnulib/modules/unicase/u16-ct-toupper26
-rw-r--r--gnulib/modules/unicase/u16-is-cased30
-rw-r--r--gnulib/modules/unicase/u16-is-cased-tests14
-rw-r--r--gnulib/modules/unicase/u16-is-casefolded25
-rw-r--r--gnulib/modules/unicase/u16-is-casefolded-tests14
-rw-r--r--gnulib/modules/unicase/u16-is-invariant30
-rw-r--r--gnulib/modules/unicase/u16-is-lowercase25
-rw-r--r--gnulib/modules/unicase/u16-is-lowercase-tests14
-rw-r--r--gnulib/modules/unicase/u16-is-titlecase25
-rw-r--r--gnulib/modules/unicase/u16-is-titlecase-tests14
-rw-r--r--gnulib/modules/unicase/u16-is-uppercase25
-rw-r--r--gnulib/modules/unicase/u16-is-uppercase-tests14
-rw-r--r--gnulib/modules/unicase/u16-prefix-context30
-rw-r--r--gnulib/modules/unicase/u16-suffix-context29
-rw-r--r--gnulib/modules/unicase/u16-tolower28
-rw-r--r--gnulib/modules/unicase/u16-tolower-tests15
-rw-r--r--gnulib/modules/unicase/u16-totitle27
-rw-r--r--gnulib/modules/unicase/u16-totitle-tests15
-rw-r--r--gnulib/modules/unicase/u16-toupper28
-rw-r--r--gnulib/modules/unicase/u16-toupper-tests15
-rw-r--r--gnulib/modules/unicase/u32-casecmp28
-rw-r--r--gnulib/modules/unicase/u32-casecmp-tests15
-rw-r--r--gnulib/modules/unicase/u32-casecoll27
-rw-r--r--gnulib/modules/unicase/u32-casecoll-tests16
-rw-r--r--gnulib/modules/unicase/u32-casefold27
-rw-r--r--gnulib/modules/unicase/u32-casefold-tests16
-rw-r--r--gnulib/modules/unicase/u32-casemap36
-rw-r--r--gnulib/modules/unicase/u32-casexfrm29
-rw-r--r--gnulib/modules/unicase/u32-ct-casefold30
-rw-r--r--gnulib/modules/unicase/u32-ct-tolower26
-rw-r--r--gnulib/modules/unicase/u32-ct-totitle38
-rw-r--r--gnulib/modules/unicase/u32-ct-toupper26
-rw-r--r--gnulib/modules/unicase/u32-is-cased30
-rw-r--r--gnulib/modules/unicase/u32-is-cased-tests14
-rw-r--r--gnulib/modules/unicase/u32-is-casefolded25
-rw-r--r--gnulib/modules/unicase/u32-is-casefolded-tests14
-rw-r--r--gnulib/modules/unicase/u32-is-invariant30
-rw-r--r--gnulib/modules/unicase/u32-is-lowercase25
-rw-r--r--gnulib/modules/unicase/u32-is-lowercase-tests14
-rw-r--r--gnulib/modules/unicase/u32-is-titlecase25
-rw-r--r--gnulib/modules/unicase/u32-is-titlecase-tests14
-rw-r--r--gnulib/modules/unicase/u32-is-uppercase25
-rw-r--r--gnulib/modules/unicase/u32-is-uppercase-tests14
-rw-r--r--gnulib/modules/unicase/u32-prefix-context30
-rw-r--r--gnulib/modules/unicase/u32-suffix-context29
-rw-r--r--gnulib/modules/unicase/u32-tolower28
-rw-r--r--gnulib/modules/unicase/u32-tolower-tests15
-rw-r--r--gnulib/modules/unicase/u32-totitle27
-rw-r--r--gnulib/modules/unicase/u32-totitle-tests15
-rw-r--r--gnulib/modules/unicase/u32-toupper28
-rw-r--r--gnulib/modules/unicase/u32-toupper-tests15
-rw-r--r--gnulib/modules/unicase/u8-casecmp28
-rw-r--r--gnulib/modules/unicase/u8-casecmp-tests15
-rw-r--r--gnulib/modules/unicase/u8-casecoll27
-rw-r--r--gnulib/modules/unicase/u8-casecoll-tests16
-rw-r--r--gnulib/modules/unicase/u8-casefold27
-rw-r--r--gnulib/modules/unicase/u8-casefold-tests16
-rw-r--r--gnulib/modules/unicase/u8-casemap36
-rw-r--r--gnulib/modules/unicase/u8-casexfrm29
-rw-r--r--gnulib/modules/unicase/u8-ct-casefold30
-rw-r--r--gnulib/modules/unicase/u8-ct-tolower26
-rw-r--r--gnulib/modules/unicase/u8-ct-totitle38
-rw-r--r--gnulib/modules/unicase/u8-ct-toupper26
-rw-r--r--gnulib/modules/unicase/u8-is-cased30
-rw-r--r--gnulib/modules/unicase/u8-is-cased-tests14
-rw-r--r--gnulib/modules/unicase/u8-is-casefolded25
-rw-r--r--gnulib/modules/unicase/u8-is-casefolded-tests14
-rw-r--r--gnulib/modules/unicase/u8-is-invariant30
-rw-r--r--gnulib/modules/unicase/u8-is-lowercase25
-rw-r--r--gnulib/modules/unicase/u8-is-lowercase-tests14
-rw-r--r--gnulib/modules/unicase/u8-is-titlecase25
-rw-r--r--gnulib/modules/unicase/u8-is-titlecase-tests14
-rw-r--r--gnulib/modules/unicase/u8-is-uppercase25
-rw-r--r--gnulib/modules/unicase/u8-is-uppercase-tests14
-rw-r--r--gnulib/modules/unicase/u8-prefix-context30
-rw-r--r--gnulib/modules/unicase/u8-suffix-context29
-rw-r--r--gnulib/modules/unicase/u8-tolower28
-rw-r--r--gnulib/modules/unicase/u8-tolower-tests15
-rw-r--r--gnulib/modules/unicase/u8-totitle27
-rw-r--r--gnulib/modules/unicase/u8-totitle-tests15
-rw-r--r--gnulib/modules/unicase/u8-toupper28
-rw-r--r--gnulib/modules/unicase/u8-toupper-tests15
-rw-r--r--gnulib/modules/unicase/ulc-casecmp30
-rw-r--r--gnulib/modules/unicase/ulc-casecmp-tests25
-rw-r--r--gnulib/modules/unicase/ulc-casecoll26
-rw-r--r--gnulib/modules/unicase/ulc-casecoll-tests25
-rw-r--r--gnulib/modules/unicase/ulc-casexfrm26
-rw-r--r--gnulib/modules/unicodeio35
-rw-r--r--gnulib/modules/uniconv/base25
-rw-r--r--gnulib/modules/uniconv/u16-conv-from-enc30
-rw-r--r--gnulib/modules/uniconv/u16-conv-from-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u16-conv-to-enc31
-rw-r--r--gnulib/modules/uniconv/u16-conv-to-enc-tests14
-rw-r--r--gnulib/modules/uniconv/u16-strconv-from-enc26
-rw-r--r--gnulib/modules/uniconv/u16-strconv-from-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u16-strconv-from-locale25
-rw-r--r--gnulib/modules/uniconv/u16-strconv-to-enc29
-rw-r--r--gnulib/modules/uniconv/u16-strconv-to-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u16-strconv-to-locale25
-rw-r--r--gnulib/modules/uniconv/u32-conv-from-enc29
-rw-r--r--gnulib/modules/uniconv/u32-conv-from-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u32-conv-to-enc29
-rw-r--r--gnulib/modules/uniconv/u32-conv-to-enc-tests14
-rw-r--r--gnulib/modules/uniconv/u32-strconv-from-enc26
-rw-r--r--gnulib/modules/uniconv/u32-strconv-from-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u32-strconv-from-locale25
-rw-r--r--gnulib/modules/uniconv/u32-strconv-to-enc28
-rw-r--r--gnulib/modules/uniconv/u32-strconv-to-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u32-strconv-to-locale25
-rw-r--r--gnulib/modules/uniconv/u8-conv-from-enc27
-rw-r--r--gnulib/modules/uniconv/u8-conv-from-enc-tests16
-rw-r--r--gnulib/modules/uniconv/u8-conv-to-enc26
-rw-r--r--gnulib/modules/uniconv/u8-conv-to-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u8-strconv-from-enc26
-rw-r--r--gnulib/modules/uniconv/u8-strconv-from-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u8-strconv-from-locale25
-rw-r--r--gnulib/modules/uniconv/u8-strconv-to-enc27
-rw-r--r--gnulib/modules/uniconv/u8-strconv-to-enc-tests15
-rw-r--r--gnulib/modules/uniconv/u8-strconv-to-locale25
-rw-r--r--gnulib/modules/unictype/base23
-rw-r--r--gnulib/modules/unictype/bidicategory-all25
-rw-r--r--gnulib/modules/unictype/bidicategory-byname23
-rw-r--r--gnulib/modules/unictype/bidicategory-byname-tests13
-rw-r--r--gnulib/modules/unictype/bidicategory-name23
-rw-r--r--gnulib/modules/unictype/bidicategory-name-tests13
-rw-r--r--gnulib/modules/unictype/bidicategory-of24
-rw-r--r--gnulib/modules/unictype/bidicategory-of-tests13
-rw-r--r--gnulib/modules/unictype/bidicategory-test24
-rw-r--r--gnulib/modules/unictype/bidicategory-test-tests14
-rw-r--r--gnulib/modules/unictype/block-all23
-rw-r--r--gnulib/modules/unictype/block-list24
-rw-r--r--gnulib/modules/unictype/block-list-tests13
-rw-r--r--gnulib/modules/unictype/block-of22
-rw-r--r--gnulib/modules/unictype/block-of-tests15
-rw-r--r--gnulib/modules/unictype/block-test23
-rw-r--r--gnulib/modules/unictype/block-test-tests13
-rw-r--r--gnulib/modules/unictype/category-C24
-rw-r--r--gnulib/modules/unictype/category-C-tests16
-rw-r--r--gnulib/modules/unictype/category-Cc24
-rw-r--r--gnulib/modules/unictype/category-Cc-tests16
-rw-r--r--gnulib/modules/unictype/category-Cf24
-rw-r--r--gnulib/modules/unictype/category-Cf-tests16
-rw-r--r--gnulib/modules/unictype/category-Cn24
-rw-r--r--gnulib/modules/unictype/category-Cn-tests16
-rw-r--r--gnulib/modules/unictype/category-Co24
-rw-r--r--gnulib/modules/unictype/category-Co-tests16
-rw-r--r--gnulib/modules/unictype/category-Cs24
-rw-r--r--gnulib/modules/unictype/category-Cs-tests16
-rw-r--r--gnulib/modules/unictype/category-L24
-rw-r--r--gnulib/modules/unictype/category-L-tests16
-rw-r--r--gnulib/modules/unictype/category-Ll24
-rw-r--r--gnulib/modules/unictype/category-Ll-tests16
-rw-r--r--gnulib/modules/unictype/category-Lm24
-rw-r--r--gnulib/modules/unictype/category-Lm-tests16
-rw-r--r--gnulib/modules/unictype/category-Lo24
-rw-r--r--gnulib/modules/unictype/category-Lo-tests16
-rw-r--r--gnulib/modules/unictype/category-Lt24
-rw-r--r--gnulib/modules/unictype/category-Lt-tests16
-rw-r--r--gnulib/modules/unictype/category-Lu24
-rw-r--r--gnulib/modules/unictype/category-Lu-tests16
-rw-r--r--gnulib/modules/unictype/category-M24
-rw-r--r--gnulib/modules/unictype/category-M-tests16
-rw-r--r--gnulib/modules/unictype/category-Mc24
-rw-r--r--gnulib/modules/unictype/category-Mc-tests16
-rw-r--r--gnulib/modules/unictype/category-Me24
-rw-r--r--gnulib/modules/unictype/category-Me-tests16
-rw-r--r--gnulib/modules/unictype/category-Mn24
-rw-r--r--gnulib/modules/unictype/category-Mn-tests16
-rw-r--r--gnulib/modules/unictype/category-N24
-rw-r--r--gnulib/modules/unictype/category-N-tests16
-rw-r--r--gnulib/modules/unictype/category-Nd24
-rw-r--r--gnulib/modules/unictype/category-Nd-tests16
-rw-r--r--gnulib/modules/unictype/category-Nl24
-rw-r--r--gnulib/modules/unictype/category-Nl-tests16
-rw-r--r--gnulib/modules/unictype/category-No24
-rw-r--r--gnulib/modules/unictype/category-No-tests16
-rw-r--r--gnulib/modules/unictype/category-P24
-rw-r--r--gnulib/modules/unictype/category-P-tests16
-rw-r--r--gnulib/modules/unictype/category-Pc24
-rw-r--r--gnulib/modules/unictype/category-Pc-tests16
-rw-r--r--gnulib/modules/unictype/category-Pd24
-rw-r--r--gnulib/modules/unictype/category-Pd-tests16
-rw-r--r--gnulib/modules/unictype/category-Pe24
-rw-r--r--gnulib/modules/unictype/category-Pe-tests16
-rw-r--r--gnulib/modules/unictype/category-Pf24
-rw-r--r--gnulib/modules/unictype/category-Pf-tests16
-rw-r--r--gnulib/modules/unictype/category-Pi24
-rw-r--r--gnulib/modules/unictype/category-Pi-tests16
-rw-r--r--gnulib/modules/unictype/category-Po24
-rw-r--r--gnulib/modules/unictype/category-Po-tests16
-rw-r--r--gnulib/modules/unictype/category-Ps24
-rw-r--r--gnulib/modules/unictype/category-Ps-tests16
-rw-r--r--gnulib/modules/unictype/category-S24
-rw-r--r--gnulib/modules/unictype/category-S-tests16
-rw-r--r--gnulib/modules/unictype/category-Sc24
-rw-r--r--gnulib/modules/unictype/category-Sc-tests16
-rw-r--r--gnulib/modules/unictype/category-Sk24
-rw-r--r--gnulib/modules/unictype/category-Sk-tests16
-rw-r--r--gnulib/modules/unictype/category-Sm24
-rw-r--r--gnulib/modules/unictype/category-Sm-tests16
-rw-r--r--gnulib/modules/unictype/category-So24
-rw-r--r--gnulib/modules/unictype/category-So-tests16
-rw-r--r--gnulib/modules/unictype/category-Z24
-rw-r--r--gnulib/modules/unictype/category-Z-tests16
-rw-r--r--gnulib/modules/unictype/category-Zl24
-rw-r--r--gnulib/modules/unictype/category-Zl-tests16
-rw-r--r--gnulib/modules/unictype/category-Zp24
-rw-r--r--gnulib/modules/unictype/category-Zp-tests16
-rw-r--r--gnulib/modules/unictype/category-Zs24
-rw-r--r--gnulib/modules/unictype/category-Zs-tests16
-rw-r--r--gnulib/modules/unictype/category-all65
-rw-r--r--gnulib/modules/unictype/category-and25
-rw-r--r--gnulib/modules/unictype/category-and-not25
-rw-r--r--gnulib/modules/unictype/category-and-not-tests19
-rw-r--r--gnulib/modules/unictype/category-and-tests19
-rw-r--r--gnulib/modules/unictype/category-byname61
-rw-r--r--gnulib/modules/unictype/category-byname-tests15
-rw-r--r--gnulib/modules/unictype/category-name23
-rw-r--r--gnulib/modules/unictype/category-name-tests16
-rw-r--r--gnulib/modules/unictype/category-none23
-rw-r--r--gnulib/modules/unictype/category-none-tests14
-rw-r--r--gnulib/modules/unictype/category-of26
-rw-r--r--gnulib/modules/unictype/category-of-tests14
-rw-r--r--gnulib/modules/unictype/category-or24
-rw-r--r--gnulib/modules/unictype/category-or-tests16
-rw-r--r--gnulib/modules/unictype/category-test25
-rw-r--r--gnulib/modules/unictype/category-test-withtable22
-rw-r--r--gnulib/modules/unictype/category-test-withtable-tests13
-rw-r--r--gnulib/modules/unictype/combining-class24
-rw-r--r--gnulib/modules/unictype/combining-class-tests13
-rw-r--r--gnulib/modules/unictype/ctype-alnum27
-rw-r--r--gnulib/modules/unictype/ctype-alnum-tests15
-rw-r--r--gnulib/modules/unictype/ctype-alpha27
-rw-r--r--gnulib/modules/unictype/ctype-alpha-tests15
-rw-r--r--gnulib/modules/unictype/ctype-blank27
-rw-r--r--gnulib/modules/unictype/ctype-blank-tests15
-rw-r--r--gnulib/modules/unictype/ctype-cntrl27
-rw-r--r--gnulib/modules/unictype/ctype-cntrl-tests15
-rw-r--r--gnulib/modules/unictype/ctype-digit27
-rw-r--r--gnulib/modules/unictype/ctype-digit-tests15
-rw-r--r--gnulib/modules/unictype/ctype-graph27
-rw-r--r--gnulib/modules/unictype/ctype-graph-tests15
-rw-r--r--gnulib/modules/unictype/ctype-lower27
-rw-r--r--gnulib/modules/unictype/ctype-lower-tests15
-rw-r--r--gnulib/modules/unictype/ctype-print27
-rw-r--r--gnulib/modules/unictype/ctype-print-tests15
-rw-r--r--gnulib/modules/unictype/ctype-punct27
-rw-r--r--gnulib/modules/unictype/ctype-punct-tests15
-rw-r--r--gnulib/modules/unictype/ctype-space27
-rw-r--r--gnulib/modules/unictype/ctype-space-tests15
-rw-r--r--gnulib/modules/unictype/ctype-upper27
-rw-r--r--gnulib/modules/unictype/ctype-upper-tests15
-rw-r--r--gnulib/modules/unictype/ctype-xdigit27
-rw-r--r--gnulib/modules/unictype/ctype-xdigit-tests15
-rw-r--r--gnulib/modules/unictype/decimal-digit24
-rw-r--r--gnulib/modules/unictype/decimal-digit-tests14
-rw-r--r--gnulib/modules/unictype/digit24
-rw-r--r--gnulib/modules/unictype/digit-tests14
-rw-r--r--gnulib/modules/unictype/mirror24
-rw-r--r--gnulib/modules/unictype/mirror-tests13
-rw-r--r--gnulib/modules/unictype/numeric24
-rw-r--r--gnulib/modules/unictype/numeric-tests14
-rw-r--r--gnulib/modules/unictype/property-all101
-rw-r--r--gnulib/modules/unictype/property-alphabetic26
-rw-r--r--gnulib/modules/unictype/property-alphabetic-tests15
-rw-r--r--gnulib/modules/unictype/property-ascii-hex-digit26
-rw-r--r--gnulib/modules/unictype/property-ascii-hex-digit-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-arabic-digit27
-rw-r--r--gnulib/modules/unictype/property-bidi-arabic-digit-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-arabic-right-to-left27
-rw-r--r--gnulib/modules/unictype/property-bidi-arabic-right-to-left-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-block-separator27
-rw-r--r--gnulib/modules/unictype/property-bidi-block-separator-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-boundary-neutral27
-rw-r--r--gnulib/modules/unictype/property-bidi-boundary-neutral-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-common-separator27
-rw-r--r--gnulib/modules/unictype/property-bidi-common-separator-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-control27
-rw-r--r--gnulib/modules/unictype/property-bidi-control-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-embedding-or-override27
-rw-r--r--gnulib/modules/unictype/property-bidi-embedding-or-override-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-eur-num-separator27
-rw-r--r--gnulib/modules/unictype/property-bidi-eur-num-separator-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-eur-num-terminator27
-rw-r--r--gnulib/modules/unictype/property-bidi-eur-num-terminator-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-european-digit27
-rw-r--r--gnulib/modules/unictype/property-bidi-european-digit-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-hebrew-right-to-left27
-rw-r--r--gnulib/modules/unictype/property-bidi-hebrew-right-to-left-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-left-to-right27
-rw-r--r--gnulib/modules/unictype/property-bidi-left-to-right-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-non-spacing-mark27
-rw-r--r--gnulib/modules/unictype/property-bidi-non-spacing-mark-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-other-neutral27
-rw-r--r--gnulib/modules/unictype/property-bidi-other-neutral-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-pdf27
-rw-r--r--gnulib/modules/unictype/property-bidi-pdf-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-segment-separator27
-rw-r--r--gnulib/modules/unictype/property-bidi-segment-separator-tests15
-rw-r--r--gnulib/modules/unictype/property-bidi-whitespace27
-rw-r--r--gnulib/modules/unictype/property-bidi-whitespace-tests15
-rw-r--r--gnulib/modules/unictype/property-byname112
-rw-r--r--gnulib/modules/unictype/property-byname-tests15
-rw-r--r--gnulib/modules/unictype/property-combining26
-rw-r--r--gnulib/modules/unictype/property-combining-tests15
-rw-r--r--gnulib/modules/unictype/property-composite26
-rw-r--r--gnulib/modules/unictype/property-composite-tests15
-rw-r--r--gnulib/modules/unictype/property-currency-symbol28
-rw-r--r--gnulib/modules/unictype/property-currency-symbol-tests15
-rw-r--r--gnulib/modules/unictype/property-dash26
-rw-r--r--gnulib/modules/unictype/property-dash-tests15
-rw-r--r--gnulib/modules/unictype/property-decimal-digit28
-rw-r--r--gnulib/modules/unictype/property-decimal-digit-tests15
-rw-r--r--gnulib/modules/unictype/property-default-ignorable-code-point26
-rw-r--r--gnulib/modules/unictype/property-default-ignorable-code-point-tests15
-rw-r--r--gnulib/modules/unictype/property-deprecated26
-rw-r--r--gnulib/modules/unictype/property-deprecated-tests15
-rw-r--r--gnulib/modules/unictype/property-diacritic26
-rw-r--r--gnulib/modules/unictype/property-diacritic-tests15
-rw-r--r--gnulib/modules/unictype/property-extender26
-rw-r--r--gnulib/modules/unictype/property-extender-tests15
-rw-r--r--gnulib/modules/unictype/property-format-control26
-rw-r--r--gnulib/modules/unictype/property-format-control-tests15
-rw-r--r--gnulib/modules/unictype/property-grapheme-base26
-rw-r--r--gnulib/modules/unictype/property-grapheme-base-tests15
-rw-r--r--gnulib/modules/unictype/property-grapheme-extend26
-rw-r--r--gnulib/modules/unictype/property-grapheme-extend-tests15
-rw-r--r--gnulib/modules/unictype/property-grapheme-link26
-rw-r--r--gnulib/modules/unictype/property-grapheme-link-tests15
-rw-r--r--gnulib/modules/unictype/property-hex-digit26
-rw-r--r--gnulib/modules/unictype/property-hex-digit-tests15
-rw-r--r--gnulib/modules/unictype/property-hyphen26
-rw-r--r--gnulib/modules/unictype/property-hyphen-tests15
-rw-r--r--gnulib/modules/unictype/property-id-continue26
-rw-r--r--gnulib/modules/unictype/property-id-continue-tests15
-rw-r--r--gnulib/modules/unictype/property-id-start26
-rw-r--r--gnulib/modules/unictype/property-id-start-tests15
-rw-r--r--gnulib/modules/unictype/property-ideographic26
-rw-r--r--gnulib/modules/unictype/property-ideographic-tests15
-rw-r--r--gnulib/modules/unictype/property-ids-binary-operator26
-rw-r--r--gnulib/modules/unictype/property-ids-binary-operator-tests15
-rw-r--r--gnulib/modules/unictype/property-ids-trinary-operator26
-rw-r--r--gnulib/modules/unictype/property-ids-trinary-operator-tests15
-rw-r--r--gnulib/modules/unictype/property-ignorable-control26
-rw-r--r--gnulib/modules/unictype/property-ignorable-control-tests15
-rw-r--r--gnulib/modules/unictype/property-iso-control28
-rw-r--r--gnulib/modules/unictype/property-iso-control-tests15
-rw-r--r--gnulib/modules/unictype/property-join-control26
-rw-r--r--gnulib/modules/unictype/property-join-control-tests15
-rw-r--r--gnulib/modules/unictype/property-left-of-pair26
-rw-r--r--gnulib/modules/unictype/property-left-of-pair-tests15
-rw-r--r--gnulib/modules/unictype/property-line-separator26
-rw-r--r--gnulib/modules/unictype/property-line-separator-tests15
-rw-r--r--gnulib/modules/unictype/property-logical-order-exception26
-rw-r--r--gnulib/modules/unictype/property-logical-order-exception-tests15
-rw-r--r--gnulib/modules/unictype/property-lowercase26
-rw-r--r--gnulib/modules/unictype/property-lowercase-tests15
-rw-r--r--gnulib/modules/unictype/property-math26
-rw-r--r--gnulib/modules/unictype/property-math-tests15
-rw-r--r--gnulib/modules/unictype/property-non-break26
-rw-r--r--gnulib/modules/unictype/property-non-break-tests15
-rw-r--r--gnulib/modules/unictype/property-not-a-character26
-rw-r--r--gnulib/modules/unictype/property-not-a-character-tests15
-rw-r--r--gnulib/modules/unictype/property-numeric26
-rw-r--r--gnulib/modules/unictype/property-numeric-tests15
-rw-r--r--gnulib/modules/unictype/property-other-alphabetic26
-rw-r--r--gnulib/modules/unictype/property-other-alphabetic-tests15
-rw-r--r--gnulib/modules/unictype/property-other-default-ignorable-code-point26
-rw-r--r--gnulib/modules/unictype/property-other-default-ignorable-code-point-tests15
-rw-r--r--gnulib/modules/unictype/property-other-grapheme-extend26
-rw-r--r--gnulib/modules/unictype/property-other-grapheme-extend-tests15
-rw-r--r--gnulib/modules/unictype/property-other-id-continue26
-rw-r--r--gnulib/modules/unictype/property-other-id-continue-tests15
-rw-r--r--gnulib/modules/unictype/property-other-id-start26
-rw-r--r--gnulib/modules/unictype/property-other-id-start-tests15
-rw-r--r--gnulib/modules/unictype/property-other-lowercase26
-rw-r--r--gnulib/modules/unictype/property-other-lowercase-tests15
-rw-r--r--gnulib/modules/unictype/property-other-math26
-rw-r--r--gnulib/modules/unictype/property-other-math-tests15
-rw-r--r--gnulib/modules/unictype/property-other-uppercase26
-rw-r--r--gnulib/modules/unictype/property-other-uppercase-tests15
-rw-r--r--gnulib/modules/unictype/property-paired-punctuation26
-rw-r--r--gnulib/modules/unictype/property-paired-punctuation-tests15
-rw-r--r--gnulib/modules/unictype/property-paragraph-separator26
-rw-r--r--gnulib/modules/unictype/property-paragraph-separator-tests15
-rw-r--r--gnulib/modules/unictype/property-pattern-syntax26
-rw-r--r--gnulib/modules/unictype/property-pattern-syntax-tests15
-rw-r--r--gnulib/modules/unictype/property-pattern-white-space26
-rw-r--r--gnulib/modules/unictype/property-pattern-white-space-tests15
-rw-r--r--gnulib/modules/unictype/property-private-use26
-rw-r--r--gnulib/modules/unictype/property-private-use-tests15
-rw-r--r--gnulib/modules/unictype/property-punctuation28
-rw-r--r--gnulib/modules/unictype/property-punctuation-tests15
-rw-r--r--gnulib/modules/unictype/property-quotation-mark26
-rw-r--r--gnulib/modules/unictype/property-quotation-mark-tests15
-rw-r--r--gnulib/modules/unictype/property-radical26
-rw-r--r--gnulib/modules/unictype/property-radical-tests15
-rw-r--r--gnulib/modules/unictype/property-sentence-terminal26
-rw-r--r--gnulib/modules/unictype/property-sentence-terminal-tests15
-rw-r--r--gnulib/modules/unictype/property-soft-dotted26
-rw-r--r--gnulib/modules/unictype/property-soft-dotted-tests15
-rw-r--r--gnulib/modules/unictype/property-space28
-rw-r--r--gnulib/modules/unictype/property-space-tests15
-rw-r--r--gnulib/modules/unictype/property-terminal-punctuation26
-rw-r--r--gnulib/modules/unictype/property-terminal-punctuation-tests15
-rw-r--r--gnulib/modules/unictype/property-test23
-rw-r--r--gnulib/modules/unictype/property-test-tests14
-rw-r--r--gnulib/modules/unictype/property-titlecase28
-rw-r--r--gnulib/modules/unictype/property-titlecase-tests15
-rw-r--r--gnulib/modules/unictype/property-unassigned-code-value26
-rw-r--r--gnulib/modules/unictype/property-unassigned-code-value-tests15
-rw-r--r--gnulib/modules/unictype/property-unified-ideograph26
-rw-r--r--gnulib/modules/unictype/property-unified-ideograph-tests15
-rw-r--r--gnulib/modules/unictype/property-uppercase26
-rw-r--r--gnulib/modules/unictype/property-uppercase-tests15
-rw-r--r--gnulib/modules/unictype/property-variation-selector26
-rw-r--r--gnulib/modules/unictype/property-variation-selector-tests15
-rw-r--r--gnulib/modules/unictype/property-white-space26
-rw-r--r--gnulib/modules/unictype/property-white-space-tests15
-rw-r--r--gnulib/modules/unictype/property-xid-continue26
-rw-r--r--gnulib/modules/unictype/property-xid-continue-tests15
-rw-r--r--gnulib/modules/unictype/property-xid-start26
-rw-r--r--gnulib/modules/unictype/property-xid-start-tests15
-rw-r--r--gnulib/modules/unictype/property-zero-width26
-rw-r--r--gnulib/modules/unictype/property-zero-width-tests15
-rw-r--r--gnulib/modules/unictype/scripts34
-rw-r--r--gnulib/modules/unictype/scripts-all21
-rw-r--r--gnulib/modules/unictype/scripts-tests13
-rw-r--r--gnulib/modules/unictype/syntax-c-ident26
-rw-r--r--gnulib/modules/unictype/syntax-c-ident-tests13
-rw-r--r--gnulib/modules/unictype/syntax-c-whitespace23
-rw-r--r--gnulib/modules/unictype/syntax-c-whitespace-tests15
-rw-r--r--gnulib/modules/unictype/syntax-java-ident26
-rw-r--r--gnulib/modules/unictype/syntax-java-ident-tests13
-rw-r--r--gnulib/modules/unictype/syntax-java-whitespace23
-rw-r--r--gnulib/modules/unictype/syntax-java-whitespace-tests15
-rw-r--r--gnulib/modules/unilbrk/base23
-rw-r--r--gnulib/modules/unilbrk/tables27
-rw-r--r--gnulib/modules/unilbrk/u16-possible-linebreaks27
-rw-r--r--gnulib/modules/unilbrk/u16-possible-linebreaks-tests13
-rw-r--r--gnulib/modules/unilbrk/u16-width-linebreaks26
-rw-r--r--gnulib/modules/unilbrk/u16-width-linebreaks-tests13
-rw-r--r--gnulib/modules/unilbrk/u32-possible-linebreaks26
-rw-r--r--gnulib/modules/unilbrk/u32-possible-linebreaks-tests13
-rw-r--r--gnulib/modules/unilbrk/u32-width-linebreaks25
-rw-r--r--gnulib/modules/unilbrk/u32-width-linebreaks-tests13
-rw-r--r--gnulib/modules/unilbrk/u8-possible-linebreaks27
-rw-r--r--gnulib/modules/unilbrk/u8-possible-linebreaks-tests13
-rw-r--r--gnulib/modules/unilbrk/u8-width-linebreaks26
-rw-r--r--gnulib/modules/unilbrk/u8-width-linebreaks-tests13
-rw-r--r--gnulib/modules/unilbrk/ulc-common25
-rw-r--r--gnulib/modules/unilbrk/ulc-possible-linebreaks27
-rw-r--r--gnulib/modules/unilbrk/ulc-possible-linebreaks-tests14
-rw-r--r--gnulib/modules/unilbrk/ulc-width-linebreaks27
-rw-r--r--gnulib/modules/unilbrk/ulc-width-linebreaks-tests14
-rw-r--r--gnulib/modules/uniname/base22
-rw-r--r--gnulib/modules/uniname/uniname26
-rw-r--r--gnulib/modules/uniname/uniname-tests17
-rw-r--r--gnulib/modules/uninorm/base22
-rw-r--r--gnulib/modules/uninorm/canonical-decomposition24
-rw-r--r--gnulib/modules/uninorm/canonical-decomposition-tests13
-rw-r--r--gnulib/modules/uninorm/compat-decomposition25
-rw-r--r--gnulib/modules/uninorm/compat-decomposition-tests13
-rw-r--r--gnulib/modules/uninorm/composition33
-rw-r--r--gnulib/modules/uninorm/composition-tests13
-rw-r--r--gnulib/modules/uninorm/decompose-internal25
-rw-r--r--gnulib/modules/uninorm/decomposing-form24
-rw-r--r--gnulib/modules/uninorm/decomposing-form-tests17
-rw-r--r--gnulib/modules/uninorm/decomposition24
-rw-r--r--gnulib/modules/uninorm/decomposition-table27
-rw-r--r--gnulib/modules/uninorm/decomposition-tests13
-rw-r--r--gnulib/modules/uninorm/filter27
-rw-r--r--gnulib/modules/uninorm/filter-tests15
-rw-r--r--gnulib/modules/uninorm/nfc27
-rw-r--r--gnulib/modules/uninorm/nfc-tests35
-rw-r--r--gnulib/modules/uninorm/nfd25
-rw-r--r--gnulib/modules/uninorm/nfd-tests36
-rw-r--r--gnulib/modules/uninorm/nfkc27
-rw-r--r--gnulib/modules/uninorm/nfkc-tests36
-rw-r--r--gnulib/modules/uninorm/nfkd25
-rw-r--r--gnulib/modules/uninorm/nfkd-tests36
-rw-r--r--gnulib/modules/uninorm/u16-normalize31
-rw-r--r--gnulib/modules/uninorm/u16-normcmp27
-rw-r--r--gnulib/modules/uninorm/u16-normcmp-tests15
-rw-r--r--gnulib/modules/uninorm/u16-normcoll26
-rw-r--r--gnulib/modules/uninorm/u16-normcoll-tests16
-rw-r--r--gnulib/modules/uninorm/u16-normxfrm28
-rw-r--r--gnulib/modules/uninorm/u32-normalize31
-rw-r--r--gnulib/modules/uninorm/u32-normcmp27
-rw-r--r--gnulib/modules/uninorm/u32-normcmp-tests15
-rw-r--r--gnulib/modules/uninorm/u32-normcoll26
-rw-r--r--gnulib/modules/uninorm/u32-normcoll-tests16
-rw-r--r--gnulib/modules/uninorm/u32-normxfrm28
-rw-r--r--gnulib/modules/uninorm/u8-normalize31
-rw-r--r--gnulib/modules/uninorm/u8-normcmp27
-rw-r--r--gnulib/modules/uninorm/u8-normcmp-tests15
-rw-r--r--gnulib/modules/uninorm/u8-normcoll26
-rw-r--r--gnulib/modules/uninorm/u8-normcoll-tests16
-rw-r--r--gnulib/modules/uninorm/u8-normxfrm28
-rw-r--r--gnulib/modules/unistd136
-rw-r--r--gnulib/modules/unistd-safer28
-rw-r--r--gnulib/modules/unistd-safer-tests15
-rw-r--r--gnulib/modules/unistd-tests11
-rw-r--r--gnulib/modules/unistdio/base22
-rw-r--r--gnulib/modules/unistdio/u-printf-args31
-rw-r--r--gnulib/modules/unistdio/u16-asnprintf26
-rw-r--r--gnulib/modules/unistdio/u16-asnprintf-tests15
-rw-r--r--gnulib/modules/unistdio/u16-asprintf25
-rw-r--r--gnulib/modules/unistdio/u16-printf-parse33
-rw-r--r--gnulib/modules/unistdio/u16-snprintf25
-rw-r--r--gnulib/modules/unistdio/u16-sprintf25
-rw-r--r--gnulib/modules/unistdio/u16-u16-asnprintf26
-rw-r--r--gnulib/modules/unistdio/u16-u16-asprintf25
-rw-r--r--gnulib/modules/unistdio/u16-u16-snprintf25
-rw-r--r--gnulib/modules/unistdio/u16-u16-sprintf25
-rw-r--r--gnulib/modules/unistdio/u16-u16-vasnprintf62
-rw-r--r--gnulib/modules/unistdio/u16-u16-vasprintf26
-rw-r--r--gnulib/modules/unistdio/u16-u16-vsnprintf27
-rw-r--r--gnulib/modules/unistdio/u16-u16-vsprintf27
-rw-r--r--gnulib/modules/unistdio/u16-vasnprintf62
-rw-r--r--gnulib/modules/unistdio/u16-vasnprintf-tests32
-rw-r--r--gnulib/modules/unistdio/u16-vasprintf26
-rw-r--r--gnulib/modules/unistdio/u16-vasprintf-tests14
-rw-r--r--gnulib/modules/unistdio/u16-vsnprintf27
-rw-r--r--gnulib/modules/unistdio/u16-vsnprintf-tests16
-rw-r--r--gnulib/modules/unistdio/u16-vsprintf27
-rw-r--r--gnulib/modules/unistdio/u16-vsprintf-tests16
-rw-r--r--gnulib/modules/unistdio/u32-asnprintf26
-rw-r--r--gnulib/modules/unistdio/u32-asnprintf-tests15
-rw-r--r--gnulib/modules/unistdio/u32-asprintf25
-rw-r--r--gnulib/modules/unistdio/u32-printf-parse33
-rw-r--r--gnulib/modules/unistdio/u32-snprintf25
-rw-r--r--gnulib/modules/unistdio/u32-sprintf25
-rw-r--r--gnulib/modules/unistdio/u32-u32-asnprintf26
-rw-r--r--gnulib/modules/unistdio/u32-u32-asprintf25
-rw-r--r--gnulib/modules/unistdio/u32-u32-snprintf25
-rw-r--r--gnulib/modules/unistdio/u32-u32-sprintf25
-rw-r--r--gnulib/modules/unistdio/u32-u32-vasnprintf62
-rw-r--r--gnulib/modules/unistdio/u32-u32-vasprintf26
-rw-r--r--gnulib/modules/unistdio/u32-u32-vsnprintf27
-rw-r--r--gnulib/modules/unistdio/u32-u32-vsprintf27
-rw-r--r--gnulib/modules/unistdio/u32-vasnprintf62
-rw-r--r--gnulib/modules/unistdio/u32-vasnprintf-tests32
-rw-r--r--gnulib/modules/unistdio/u32-vasprintf26
-rw-r--r--gnulib/modules/unistdio/u32-vasprintf-tests14
-rw-r--r--gnulib/modules/unistdio/u32-vsnprintf27
-rw-r--r--gnulib/modules/unistdio/u32-vsnprintf-tests16
-rw-r--r--gnulib/modules/unistdio/u32-vsprintf27
-rw-r--r--gnulib/modules/unistdio/u32-vsprintf-tests16
-rw-r--r--gnulib/modules/unistdio/u8-asnprintf26
-rw-r--r--gnulib/modules/unistdio/u8-asnprintf-tests15
-rw-r--r--gnulib/modules/unistdio/u8-asprintf25
-rw-r--r--gnulib/modules/unistdio/u8-printf-parse33
-rw-r--r--gnulib/modules/unistdio/u8-snprintf25
-rw-r--r--gnulib/modules/unistdio/u8-sprintf25
-rw-r--r--gnulib/modules/unistdio/u8-u8-asnprintf26
-rw-r--r--gnulib/modules/unistdio/u8-u8-asprintf25
-rw-r--r--gnulib/modules/unistdio/u8-u8-snprintf25
-rw-r--r--gnulib/modules/unistdio/u8-u8-sprintf25
-rw-r--r--gnulib/modules/unistdio/u8-u8-vasnprintf62
-rw-r--r--gnulib/modules/unistdio/u8-u8-vasprintf26
-rw-r--r--gnulib/modules/unistdio/u8-u8-vsnprintf27
-rw-r--r--gnulib/modules/unistdio/u8-u8-vsprintf27
-rw-r--r--gnulib/modules/unistdio/u8-vasnprintf62
-rw-r--r--gnulib/modules/unistdio/u8-vasnprintf-tests32
-rw-r--r--gnulib/modules/unistdio/u8-vasprintf26
-rw-r--r--gnulib/modules/unistdio/u8-vasprintf-tests14
-rw-r--r--gnulib/modules/unistdio/u8-vsnprintf27
-rw-r--r--gnulib/modules/unistdio/u8-vsnprintf-tests16
-rw-r--r--gnulib/modules/unistdio/u8-vsprintf27
-rw-r--r--gnulib/modules/unistdio/u8-vsprintf-tests16
-rw-r--r--gnulib/modules/unistdio/ulc-asnprintf26
-rw-r--r--gnulib/modules/unistdio/ulc-asnprintf-tests15
-rw-r--r--gnulib/modules/unistdio/ulc-asprintf25
-rw-r--r--gnulib/modules/unistdio/ulc-fprintf26
-rw-r--r--gnulib/modules/unistdio/ulc-printf-parse34
-rw-r--r--gnulib/modules/unistdio/ulc-snprintf25
-rw-r--r--gnulib/modules/unistdio/ulc-sprintf25
-rw-r--r--gnulib/modules/unistdio/ulc-vasnprintf60
-rw-r--r--gnulib/modules/unistdio/ulc-vasnprintf-tests28
-rw-r--r--gnulib/modules/unistdio/ulc-vasprintf26
-rw-r--r--gnulib/modules/unistdio/ulc-vasprintf-tests14
-rw-r--r--gnulib/modules/unistdio/ulc-vfprintf26
-rw-r--r--gnulib/modules/unistdio/ulc-vsnprintf26
-rw-r--r--gnulib/modules/unistdio/ulc-vsnprintf-tests16
-rw-r--r--gnulib/modules/unistdio/ulc-vsprintf27
-rw-r--r--gnulib/modules/unistdio/ulc-vsprintf-tests16
-rw-r--r--gnulib/modules/unistr/base25
-rw-r--r--gnulib/modules/unistr/u16-check23
-rw-r--r--gnulib/modules/unistr/u16-check-tests12
-rw-r--r--gnulib/modules/unistr/u16-chr24
-rw-r--r--gnulib/modules/unistr/u16-chr-tests21
-rw-r--r--gnulib/modules/unistr/u16-cmp23
-rw-r--r--gnulib/modules/unistr/u16-cmp-tests20
-rw-r--r--gnulib/modules/unistr/u16-cmp226
-rw-r--r--gnulib/modules/unistr/u16-cmp2-tests13
-rw-r--r--gnulib/modules/unistr/u16-cpy24
-rw-r--r--gnulib/modules/unistr/u16-cpy-alloc25
-rw-r--r--gnulib/modules/unistr/u16-cpy-alloc-tests13
-rw-r--r--gnulib/modules/unistr/u16-cpy-tests13
-rw-r--r--gnulib/modules/unistr/u16-endswith26
-rw-r--r--gnulib/modules/unistr/u16-mblen23
-rw-r--r--gnulib/modules/unistr/u16-mblen-tests12
-rw-r--r--gnulib/modules/unistr/u16-mbsnlen24
-rw-r--r--gnulib/modules/unistr/u16-mbsnlen-tests12
-rw-r--r--gnulib/modules/unistr/u16-mbtouc25
-rw-r--r--gnulib/modules/unistr/u16-mbtouc-tests13
-rw-r--r--gnulib/modules/unistr/u16-mbtouc-unsafe25
-rw-r--r--gnulib/modules/unistr/u16-mbtouc-unsafe-tests13
-rw-r--r--gnulib/modules/unistr/u16-mbtoucr24
-rw-r--r--gnulib/modules/unistr/u16-mbtoucr-tests12
-rw-r--r--gnulib/modules/unistr/u16-move25
-rw-r--r--gnulib/modules/unistr/u16-move-tests13
-rw-r--r--gnulib/modules/unistr/u16-next24
-rw-r--r--gnulib/modules/unistr/u16-next-tests12
-rw-r--r--gnulib/modules/unistr/u16-prev23
-rw-r--r--gnulib/modules/unistr/u16-prev-tests12
-rw-r--r--gnulib/modules/unistr/u16-set24
-rw-r--r--gnulib/modules/unistr/u16-set-tests13
-rw-r--r--gnulib/modules/unistr/u16-startswith24
-rw-r--r--gnulib/modules/unistr/u16-stpcpy24
-rw-r--r--gnulib/modules/unistr/u16-stpcpy-tests13
-rw-r--r--gnulib/modules/unistr/u16-stpncpy24
-rw-r--r--gnulib/modules/unistr/u16-stpncpy-tests20
-rw-r--r--gnulib/modules/unistr/u16-strcat25
-rw-r--r--gnulib/modules/unistr/u16-strcat-tests13
-rw-r--r--gnulib/modules/unistr/u16-strchr24
-rw-r--r--gnulib/modules/unistr/u16-strcmp23
-rw-r--r--gnulib/modules/unistr/u16-strcmp-tests14
-rw-r--r--gnulib/modules/unistr/u16-strcoll26
-rw-r--r--gnulib/modules/unistr/u16-strcoll-tests14
-rw-r--r--gnulib/modules/unistr/u16-strcpy24
-rw-r--r--gnulib/modules/unistr/u16-strcpy-tests13
-rw-r--r--gnulib/modules/unistr/u16-strcspn27
-rw-r--r--gnulib/modules/unistr/u16-strdup25
-rw-r--r--gnulib/modules/unistr/u16-strdup-tests13
-rw-r--r--gnulib/modules/unistr/u16-strlen24
-rw-r--r--gnulib/modules/unistr/u16-strlen-tests12
-rw-r--r--gnulib/modules/unistr/u16-strmblen23
-rw-r--r--gnulib/modules/unistr/u16-strmblen-tests12
-rw-r--r--gnulib/modules/unistr/u16-strmbtouc23
-rw-r--r--gnulib/modules/unistr/u16-strmbtouc-tests12
-rw-r--r--gnulib/modules/unistr/u16-strncat25
-rw-r--r--gnulib/modules/unistr/u16-strncat-tests20
-rw-r--r--gnulib/modules/unistr/u16-strncmp23
-rw-r--r--gnulib/modules/unistr/u16-strncmp-tests13
-rw-r--r--gnulib/modules/unistr/u16-strncpy24
-rw-r--r--gnulib/modules/unistr/u16-strncpy-tests20
-rw-r--r--gnulib/modules/unistr/u16-strnlen24
-rw-r--r--gnulib/modules/unistr/u16-strnlen-tests20
-rw-r--r--gnulib/modules/unistr/u16-strpbrk26
-rw-r--r--gnulib/modules/unistr/u16-strrchr24
-rw-r--r--gnulib/modules/unistr/u16-strspn28
-rw-r--r--gnulib/modules/unistr/u16-strstr24
-rw-r--r--gnulib/modules/unistr/u16-strtok26
-rw-r--r--gnulib/modules/unistr/u16-to-u3224
-rw-r--r--gnulib/modules/unistr/u16-to-u32-tests13
-rw-r--r--gnulib/modules/unistr/u16-to-u825
-rw-r--r--gnulib/modules/unistr/u16-to-u8-tests13
-rw-r--r--gnulib/modules/unistr/u16-uctomb25
-rw-r--r--gnulib/modules/unistr/u16-uctomb-tests12
-rw-r--r--gnulib/modules/unistr/u32-check23
-rw-r--r--gnulib/modules/unistr/u32-check-tests12
-rw-r--r--gnulib/modules/unistr/u32-chr23
-rw-r--r--gnulib/modules/unistr/u32-chr-tests21
-rw-r--r--gnulib/modules/unistr/u32-cmp23
-rw-r--r--gnulib/modules/unistr/u32-cmp-tests20
-rw-r--r--gnulib/modules/unistr/u32-cmp226
-rw-r--r--gnulib/modules/unistr/u32-cmp2-tests13
-rw-r--r--gnulib/modules/unistr/u32-cpy24
-rw-r--r--gnulib/modules/unistr/u32-cpy-alloc25
-rw-r--r--gnulib/modules/unistr/u32-cpy-alloc-tests13
-rw-r--r--gnulib/modules/unistr/u32-cpy-tests13
-rw-r--r--gnulib/modules/unistr/u32-endswith26
-rw-r--r--gnulib/modules/unistr/u32-mblen23
-rw-r--r--gnulib/modules/unistr/u32-mblen-tests12
-rw-r--r--gnulib/modules/unistr/u32-mbsnlen23
-rw-r--r--gnulib/modules/unistr/u32-mbsnlen-tests12
-rw-r--r--gnulib/modules/unistr/u32-mbtouc24
-rw-r--r--gnulib/modules/unistr/u32-mbtouc-tests13
-rw-r--r--gnulib/modules/unistr/u32-mbtouc-unsafe24
-rw-r--r--gnulib/modules/unistr/u32-mbtouc-unsafe-tests13
-rw-r--r--gnulib/modules/unistr/u32-mbtoucr24
-rw-r--r--gnulib/modules/unistr/u32-mbtoucr-tests12
-rw-r--r--gnulib/modules/unistr/u32-move25
-rw-r--r--gnulib/modules/unistr/u32-move-tests13
-rw-r--r--gnulib/modules/unistr/u32-next24
-rw-r--r--gnulib/modules/unistr/u32-next-tests12
-rw-r--r--gnulib/modules/unistr/u32-prev23
-rw-r--r--gnulib/modules/unistr/u32-prev-tests12
-rw-r--r--gnulib/modules/unistr/u32-set24
-rw-r--r--gnulib/modules/unistr/u32-set-tests13
-rw-r--r--gnulib/modules/unistr/u32-startswith24
-rw-r--r--gnulib/modules/unistr/u32-stpcpy24
-rw-r--r--gnulib/modules/unistr/u32-stpcpy-tests13
-rw-r--r--gnulib/modules/unistr/u32-stpncpy24
-rw-r--r--gnulib/modules/unistr/u32-stpncpy-tests20
-rw-r--r--gnulib/modules/unistr/u32-strcat25
-rw-r--r--gnulib/modules/unistr/u32-strcat-tests13
-rw-r--r--gnulib/modules/unistr/u32-strchr23
-rw-r--r--gnulib/modules/unistr/u32-strcmp23
-rw-r--r--gnulib/modules/unistr/u32-strcmp-tests14
-rw-r--r--gnulib/modules/unistr/u32-strcoll26
-rw-r--r--gnulib/modules/unistr/u32-strcoll-tests14
-rw-r--r--gnulib/modules/unistr/u32-strcpy24
-rw-r--r--gnulib/modules/unistr/u32-strcpy-tests13
-rw-r--r--gnulib/modules/unistr/u32-strcspn25
-rw-r--r--gnulib/modules/unistr/u32-strdup25
-rw-r--r--gnulib/modules/unistr/u32-strdup-tests13
-rw-r--r--gnulib/modules/unistr/u32-strlen24
-rw-r--r--gnulib/modules/unistr/u32-strlen-tests12
-rw-r--r--gnulib/modules/unistr/u32-strmblen23
-rw-r--r--gnulib/modules/unistr/u32-strmblen-tests12
-rw-r--r--gnulib/modules/unistr/u32-strmbtouc23
-rw-r--r--gnulib/modules/unistr/u32-strmbtouc-tests12
-rw-r--r--gnulib/modules/unistr/u32-strncat25
-rw-r--r--gnulib/modules/unistr/u32-strncat-tests20
-rw-r--r--gnulib/modules/unistr/u32-strncmp23
-rw-r--r--gnulib/modules/unistr/u32-strncmp-tests13
-rw-r--r--gnulib/modules/unistr/u32-strncpy24
-rw-r--r--gnulib/modules/unistr/u32-strncpy-tests20
-rw-r--r--gnulib/modules/unistr/u32-strnlen24
-rw-r--r--gnulib/modules/unistr/u32-strnlen-tests20
-rw-r--r--gnulib/modules/unistr/u32-strpbrk24
-rw-r--r--gnulib/modules/unistr/u32-strrchr23
-rw-r--r--gnulib/modules/unistr/u32-strspn24
-rw-r--r--gnulib/modules/unistr/u32-strstr24
-rw-r--r--gnulib/modules/unistr/u32-strtok26
-rw-r--r--gnulib/modules/unistr/u32-to-u1624
-rw-r--r--gnulib/modules/unistr/u32-to-u16-tests13
-rw-r--r--gnulib/modules/unistr/u32-to-u824
-rw-r--r--gnulib/modules/unistr/u32-to-u8-tests13
-rw-r--r--gnulib/modules/unistr/u32-uctomb24
-rw-r--r--gnulib/modules/unistr/u32-uctomb-tests12
-rw-r--r--gnulib/modules/unistr/u8-check23
-rw-r--r--gnulib/modules/unistr/u8-check-tests12
-rw-r--r--gnulib/modules/unistr/u8-chr24
-rw-r--r--gnulib/modules/unistr/u8-chr-tests21
-rw-r--r--gnulib/modules/unistr/u8-cmp24
-rw-r--r--gnulib/modules/unistr/u8-cmp-tests20
-rw-r--r--gnulib/modules/unistr/u8-cmp226
-rw-r--r--gnulib/modules/unistr/u8-cmp2-tests13
-rw-r--r--gnulib/modules/unistr/u8-cpy24
-rw-r--r--gnulib/modules/unistr/u8-cpy-alloc25
-rw-r--r--gnulib/modules/unistr/u8-cpy-alloc-tests13
-rw-r--r--gnulib/modules/unistr/u8-cpy-tests13
-rw-r--r--gnulib/modules/unistr/u8-endswith26
-rw-r--r--gnulib/modules/unistr/u8-mblen23
-rw-r--r--gnulib/modules/unistr/u8-mblen-tests12
-rw-r--r--gnulib/modules/unistr/u8-mbsnlen24
-rw-r--r--gnulib/modules/unistr/u8-mbsnlen-tests12
-rw-r--r--gnulib/modules/unistr/u8-mbtouc25
-rw-r--r--gnulib/modules/unistr/u8-mbtouc-tests13
-rw-r--r--gnulib/modules/unistr/u8-mbtouc-unsafe25
-rw-r--r--gnulib/modules/unistr/u8-mbtouc-unsafe-tests13
-rw-r--r--gnulib/modules/unistr/u8-mbtoucr24
-rw-r--r--gnulib/modules/unistr/u8-mbtoucr-tests12
-rw-r--r--gnulib/modules/unistr/u8-move25
-rw-r--r--gnulib/modules/unistr/u8-move-tests13
-rw-r--r--gnulib/modules/unistr/u8-next24
-rw-r--r--gnulib/modules/unistr/u8-next-tests12
-rw-r--r--gnulib/modules/unistr/u8-prev23
-rw-r--r--gnulib/modules/unistr/u8-prev-tests12
-rw-r--r--gnulib/modules/unistr/u8-set23
-rw-r--r--gnulib/modules/unistr/u8-set-tests13
-rw-r--r--gnulib/modules/unistr/u8-startswith24
-rw-r--r--gnulib/modules/unistr/u8-stpcpy25
-rw-r--r--gnulib/modules/unistr/u8-stpcpy-tests13
-rw-r--r--gnulib/modules/unistr/u8-stpncpy24
-rw-r--r--gnulib/modules/unistr/u8-stpncpy-tests20
-rw-r--r--gnulib/modules/unistr/u8-strcat23
-rw-r--r--gnulib/modules/unistr/u8-strcat-tests13
-rw-r--r--gnulib/modules/unistr/u8-strchr24
-rw-r--r--gnulib/modules/unistr/u8-strcmp23
-rw-r--r--gnulib/modules/unistr/u8-strcmp-tests14
-rw-r--r--gnulib/modules/unistr/u8-strcoll26
-rw-r--r--gnulib/modules/unistr/u8-strcoll-tests14
-rw-r--r--gnulib/modules/unistr/u8-strcpy23
-rw-r--r--gnulib/modules/unistr/u8-strcpy-tests13
-rw-r--r--gnulib/modules/unistr/u8-strcspn27
-rw-r--r--gnulib/modules/unistr/u8-strdup26
-rw-r--r--gnulib/modules/unistr/u8-strdup-tests13
-rw-r--r--gnulib/modules/unistr/u8-strlen23
-rw-r--r--gnulib/modules/unistr/u8-strlen-tests12
-rw-r--r--gnulib/modules/unistr/u8-strmblen23
-rw-r--r--gnulib/modules/unistr/u8-strmblen-tests12
-rw-r--r--gnulib/modules/unistr/u8-strmbtouc23
-rw-r--r--gnulib/modules/unistr/u8-strmbtouc-tests12
-rw-r--r--gnulib/modules/unistr/u8-strncat23
-rw-r--r--gnulib/modules/unistr/u8-strncat-tests20
-rw-r--r--gnulib/modules/unistr/u8-strncmp23
-rw-r--r--gnulib/modules/unistr/u8-strncmp-tests13
-rw-r--r--gnulib/modules/unistr/u8-strncpy23
-rw-r--r--gnulib/modules/unistr/u8-strncpy-tests20
-rw-r--r--gnulib/modules/unistr/u8-strnlen24
-rw-r--r--gnulib/modules/unistr/u8-strnlen-tests20
-rw-r--r--gnulib/modules/unistr/u8-strpbrk26
-rw-r--r--gnulib/modules/unistr/u8-strrchr24
-rw-r--r--gnulib/modules/unistr/u8-strspn28
-rw-r--r--gnulib/modules/unistr/u8-strstr24
-rw-r--r--gnulib/modules/unistr/u8-strtok26
-rw-r--r--gnulib/modules/unistr/u8-to-u1625
-rw-r--r--gnulib/modules/unistr/u8-to-u16-tests13
-rw-r--r--gnulib/modules/unistr/u8-to-u3224
-rw-r--r--gnulib/modules/unistr/u8-to-u32-tests13
-rw-r--r--gnulib/modules/unistr/u8-uctomb25
-rw-r--r--gnulib/modules/unistr/u8-uctomb-tests12
-rw-r--r--gnulib/modules/unitypes22
-rw-r--r--gnulib/modules/uniwbrk/base22
-rw-r--r--gnulib/modules/uniwbrk/table22
-rw-r--r--gnulib/modules/uniwbrk/u16-wordbreaks27
-rw-r--r--gnulib/modules/uniwbrk/u16-wordbreaks-tests13
-rw-r--r--gnulib/modules/uniwbrk/u32-wordbreaks27
-rw-r--r--gnulib/modules/uniwbrk/u32-wordbreaks-tests13
-rw-r--r--gnulib/modules/uniwbrk/u8-wordbreaks27
-rw-r--r--gnulib/modules/uniwbrk/u8-wordbreaks-tests13
-rw-r--r--gnulib/modules/uniwbrk/ulc-wordbreaks28
-rw-r--r--gnulib/modules/uniwbrk/ulc-wordbreaks-tests19
-rw-r--r--gnulib/modules/uniwbrk/wordbreak-property24
-rw-r--r--gnulib/modules/uniwidth/base23
-rw-r--r--gnulib/modules/uniwidth/u16-strwidth25
-rw-r--r--gnulib/modules/uniwidth/u16-strwidth-tests13
-rw-r--r--gnulib/modules/uniwidth/u16-width25
-rw-r--r--gnulib/modules/uniwidth/u16-width-tests13
-rw-r--r--gnulib/modules/uniwidth/u32-strwidth25
-rw-r--r--gnulib/modules/uniwidth/u32-strwidth-tests13
-rw-r--r--gnulib/modules/uniwidth/u32-width24
-rw-r--r--gnulib/modules/uniwidth/u32-width-tests13
-rw-r--r--gnulib/modules/uniwidth/u8-strwidth25
-rw-r--r--gnulib/modules/uniwidth/u8-strwidth-tests13
-rw-r--r--gnulib/modules/uniwidth/u8-width25
-rw-r--r--gnulib/modules/uniwidth/u8-width-tests13
-rw-r--r--gnulib/modules/uniwidth/width25
-rw-r--r--gnulib/modules/uniwidth/width-tests16
-rw-r--r--gnulib/modules/unlink26
-rw-r--r--gnulib/modules/unlink-busy20
-rw-r--r--gnulib/modules/unlink-tests17
-rw-r--r--gnulib/modules/unlinkdir25
-rw-r--r--gnulib/modules/unlocked-io23
-rw-r--r--gnulib/modules/unsetenv27
-rw-r--r--gnulib/modules/unsetenv-tests13
-rw-r--r--gnulib/modules/unused-parameter40
-rw-r--r--gnulib/modules/update-copyright19
-rw-r--r--gnulib/modules/update-copyright-tests12
-rw-r--r--gnulib/modules/uptime20
-rw-r--r--gnulib/modules/useless-if-before-free19
-rw-r--r--gnulib/modules/userspec32
-rw-r--r--gnulib/modules/userspec-tests12
-rw-r--r--gnulib/modules/usleep26
-rw-r--r--gnulib/modules/usleep-tests13
-rw-r--r--gnulib/modules/utf16-ucs421
-rw-r--r--gnulib/modules/utf16-ucs4-unsafe21
-rw-r--r--gnulib/modules/utf8-ucs421
-rw-r--r--gnulib/modules/utf8-ucs4-unsafe21
-rw-r--r--gnulib/modules/utime38
-rw-r--r--gnulib/modules/utimecmp36
-rw-r--r--gnulib/modules/utimens37
-rw-r--r--gnulib/modules/utimens-tests22
-rw-r--r--gnulib/modules/utimensat30
-rw-r--r--gnulib/modules/utimensat-tests22
-rw-r--r--gnulib/modules/va-args20
-rw-r--r--gnulib/modules/vararrays20
-rw-r--r--gnulib/modules/vasnprintf41
-rw-r--r--gnulib/modules/vasnprintf-posix36
-rw-r--r--gnulib/modules/vasnprintf-posix-tests21
-rw-r--r--gnulib/modules/vasnprintf-tests12
-rw-r--r--gnulib/modules/vasprintf37
-rw-r--r--gnulib/modules/vasprintf-posix36
-rw-r--r--gnulib/modules/vasprintf-posix-tests15
-rw-r--r--gnulib/modules/vasprintf-tests13
-rw-r--r--gnulib/modules/vc-list-files19
-rw-r--r--gnulib/modules/vc-list-files-tests14
-rw-r--r--gnulib/modules/vdprintf28
-rw-r--r--gnulib/modules/vdprintf-posix37
-rw-r--r--gnulib/modules/vdprintf-posix-tests16
-rw-r--r--gnulib/modules/verify21
-rw-r--r--gnulib/modules/verror32
-rw-r--r--gnulib/modules/version-etc26
-rw-r--r--gnulib/modules/version-etc-fsf21
-rw-r--r--gnulib/modules/version-etc-tests12
-rw-r--r--gnulib/modules/vfprintf-posix40
-rw-r--r--gnulib/modules/vfprintf-posix-tests16
-rw-r--r--gnulib/modules/vprintf-posix28
-rw-r--r--gnulib/modules/vprintf-posix-tests16
-rw-r--r--gnulib/modules/vsnprintf28
-rw-r--r--gnulib/modules/vsnprintf-posix37
-rw-r--r--gnulib/modules/vsnprintf-posix-tests20
-rw-r--r--gnulib/modules/vsnprintf-tests13
-rw-r--r--gnulib/modules/vsprintf-posix40
-rw-r--r--gnulib/modules/vsprintf-posix-tests17
-rw-r--r--gnulib/modules/wait-process35
-rw-r--r--gnulib/modules/warn-on-use35
-rw-r--r--gnulib/modules/warnings16
-rw-r--r--gnulib/modules/wchar79
-rw-r--r--gnulib/modules/wchar-tests11
-rw-r--r--gnulib/modules/wcrtomb33
-rw-r--r--gnulib/modules/wcrtomb-tests28
-rw-r--r--gnulib/modules/wcsnrtombs33
-rw-r--r--gnulib/modules/wcsnrtombs-tests30
-rw-r--r--gnulib/modules/wcsrtombs34
-rw-r--r--gnulib/modules/wcsrtombs-tests30
-rw-r--r--gnulib/modules/wctob27
-rw-r--r--gnulib/modules/wctype42
-rw-r--r--gnulib/modules/wctype-tests11
-rw-r--r--gnulib/modules/wcwidth31
-rw-r--r--gnulib/modules/wcwidth-tests14
-rw-r--r--gnulib/modules/winsz-ioctl21
-rw-r--r--gnulib/modules/winsz-termios21
-rw-r--r--gnulib/modules/write26
-rw-r--r--gnulib/modules/write-any-file25
-rw-r--r--gnulib/modules/xalloc25
-rw-r--r--gnulib/modules/xalloc-die25
-rw-r--r--gnulib/modules/xalloc-die-tests12
-rw-r--r--gnulib/modules/xconcat-filename26
-rw-r--r--gnulib/modules/xfreopen26
-rw-r--r--gnulib/modules/xgetcwd26
-rw-r--r--gnulib/modules/xgetdomainname24
-rw-r--r--gnulib/modules/xgethostname25
-rw-r--r--gnulib/modules/xlist28
-rw-r--r--gnulib/modules/xmalloca24
-rw-r--r--gnulib/modules/xmemcoll28
-rw-r--r--gnulib/modules/xmemdup023
-rw-r--r--gnulib/modules/xmemdup0-tests13
-rw-r--r--gnulib/modules/xnanosleep30
-rw-r--r--gnulib/modules/xoset28
-rw-r--r--gnulib/modules/xprintf38
-rw-r--r--gnulib/modules/xprintf-posix24
-rw-r--r--gnulib/modules/xprintf-posix-tests20
-rw-r--r--gnulib/modules/xreadlink24
-rw-r--r--gnulib/modules/xreadlinkat25
-rw-r--r--gnulib/modules/xsetenv28
-rw-r--r--gnulib/modules/xsize25
-rw-r--r--gnulib/modules/xstriconv29
-rw-r--r--gnulib/modules/xstriconveh28
-rw-r--r--gnulib/modules/xstrndup27
-rw-r--r--gnulib/modules/xstrtod24
-rw-r--r--gnulib/modules/xstrtoimax23
-rw-r--r--gnulib/modules/xstrtoimax-tests12
-rw-r--r--gnulib/modules/xstrtol31
-rw-r--r--gnulib/modules/xstrtol-tests15
-rw-r--r--gnulib/modules/xstrtold25
-rw-r--r--gnulib/modules/xstrtoll30
-rw-r--r--gnulib/modules/xstrtoll-tests17
-rw-r--r--gnulib/modules/xstrtoumax23
-rw-r--r--gnulib/modules/xstrtoumax-tests12
-rw-r--r--gnulib/modules/xsublist24
-rw-r--r--gnulib/modules/xvasprintf37
-rw-r--r--gnulib/modules/xvasprintf-posix23
-rw-r--r--gnulib/modules/xvasprintf-tests14
-rw-r--r--gnulib/modules/y024
-rw-r--r--gnulib/modules/y0-tests13
-rw-r--r--gnulib/modules/y124
-rw-r--r--gnulib/modules/y1-tests13
-rw-r--r--gnulib/modules/yesno27
-rw-r--r--gnulib/modules/yesno-tests14
-rw-r--r--gnulib/modules/yield29
-rw-r--r--gnulib/modules/yn24
-rw-r--r--gnulib/modules/yn-tests13
-rwxr-xr-xgnulib/posix-modules267
-rw-r--r--gnulib/tests/init.sh345
-rw-r--r--gnulib/tests/macros.h64
-rw-r--r--gnulib/tests/nan.h60
-rw-r--r--gnulib/tests/nap.h67
-rw-r--r--gnulib/tests/signature.h48
-rw-r--r--gnulib/tests/test-acos.c40
-rw-r--r--gnulib/tests/test-acosl.c45
-rw-r--r--gnulib/tests/test-alignof.c59
-rw-r--r--gnulib/tests/test-alloca-opt.c62
-rw-r--r--gnulib/tests/test-arcfour.c69
-rw-r--r--gnulib/tests/test-arctwo.c177
-rw-r--r--gnulib/tests/test-areadlink-with-size.c46
-rw-r--r--gnulib/tests/test-areadlink.c53
-rw-r--r--gnulib/tests/test-areadlink.h83
-rw-r--r--gnulib/tests/test-areadlinkat-with-size.c89
-rw-r--r--gnulib/tests/test-areadlinkat.c89
-rw-r--r--gnulib/tests/test-argmatch.c98
-rwxr-xr-xgnulib/tests/test-argp-2.sh113
-rwxr-xr-xgnulib/tests/test-argp-version-etc-1.sh43
-rw-r--r--gnulib/tests/test-argp-version-etc.c48
-rw-r--r--gnulib/tests/test-argp.c493
-rw-r--r--gnulib/tests/test-argv-iter.c108
-rw-r--r--gnulib/tests/test-arpa_inet.c27
-rw-r--r--gnulib/tests/test-array-mergesort.c384
-rw-r--r--gnulib/tests/test-array_list.c329
-rw-r--r--gnulib/tests/test-array_oset.c144
-rw-r--r--gnulib/tests/test-asin.c40
-rw-r--r--gnulib/tests/test-asinl.c45
-rw-r--r--gnulib/tests/test-atan.c40
-rw-r--r--gnulib/tests/test-atan2.c60
-rw-r--r--gnulib/tests/test-atanl.c45
-rw-r--r--gnulib/tests/test-atexit.c45
-rwxr-xr-xgnulib/tests/test-atexit.sh32
-rw-r--r--gnulib/tests/test-avltree_list.c415
-rw-r--r--gnulib/tests/test-avltree_oset.c136
-rw-r--r--gnulib/tests/test-avltreehash_list.c445
-rw-r--r--gnulib/tests/test-base64.c230
-rw-r--r--gnulib/tests/test-binary-io.c64
-rwxr-xr-xgnulib/tests/test-binary-io.sh11
-rw-r--r--gnulib/tests/test-bitrotate.c279
-rw-r--r--gnulib/tests/test-btowc.c63
-rwxr-xr-xgnulib/tests/test-btowc1.sh15
-rwxr-xr-xgnulib/tests/test-btowc2.sh15
-rw-r--r--gnulib/tests/test-byteswap.c32
-rw-r--r--gnulib/tests/test-c-ctype.c386
-rw-r--r--gnulib/tests/test-c-stack.c76
-rwxr-xr-xgnulib/tests/test-c-stack.sh21
-rwxr-xr-xgnulib/tests/test-c-stack2.sh36
-rwxr-xr-xgnulib/tests/test-c-strcase.sh21
-rw-r--r--gnulib/tests/test-c-strcasecmp.c65
-rw-r--r--gnulib/tests/test-c-strcasestr.c134
-rw-r--r--gnulib/tests/test-c-strncasecmp.c79
-rw-r--r--gnulib/tests/test-c-strstr.c127
-rw-r--r--gnulib/tests/test-canonicalize-lgpl.c222
-rw-r--r--gnulib/tests/test-canonicalize.c347
-rw-r--r--gnulib/tests/test-carray_list.c411
-rw-r--r--gnulib/tests/test-cbrt.c40
-rw-r--r--gnulib/tests/test-ceilf1.c68
-rw-r--r--gnulib/tests/test-ceilf2.c151
-rw-r--r--gnulib/tests/test-ceill.c87
-rw-r--r--gnulib/tests/test-chown.c49
-rw-r--r--gnulib/tests/test-chown.h209
-rw-r--r--gnulib/tests/test-cloexec.c141
-rw-r--r--gnulib/tests/test-closein.c53
-rwxr-xr-xgnulib/tests/test-closein.sh38
-rw-r--r--gnulib/tests/test-cond.c208
-rw-r--r--gnulib/tests/test-copy-acl.c76
-rwxr-xr-xgnulib/tests/test-copy-acl.sh534
-rw-r--r--gnulib/tests/test-copy-file.c42
-rwxr-xr-xgnulib/tests/test-copy-file.sh528
-rw-r--r--gnulib/tests/test-copysign.c60
-rw-r--r--gnulib/tests/test-cos.c40
-rw-r--r--gnulib/tests/test-cosh.c40
-rw-r--r--gnulib/tests/test-cosl.c45
-rw-r--r--gnulib/tests/test-count-one-bits.c69
-rw-r--r--gnulib/tests/test-crc.c59
-rw-r--r--gnulib/tests/test-ctype.c27
-rw-r--r--gnulib/tests/test-des.c219
-rw-r--r--gnulib/tests/test-dirent-safer.c96
-rw-r--r--gnulib/tests/test-dirent.c32
-rw-r--r--gnulib/tests/test-dirname.c191
-rw-r--r--gnulib/tests/test-dprintf-posix.c171
-rwxr-xr-xgnulib/tests/test-dprintf-posix.sh16
-rw-r--r--gnulib/tests/test-dprintf-posix2.c109
-rwxr-xr-xgnulib/tests/test-dprintf-posix2.sh31
-rw-r--r--gnulib/tests/test-dup-safer.c175
-rw-r--r--gnulib/tests/test-dup2.c193
-rw-r--r--gnulib/tests/test-dup3.c157
-rw-r--r--gnulib/tests/test-duplocale.c122
-rwxr-xr-xgnulib/tests/test-echo.sh166
-rw-r--r--gnulib/tests/test-environ.c44
-rw-r--r--gnulib/tests/test-erf.c40
-rw-r--r--gnulib/tests/test-erfc.c40
-rw-r--r--gnulib/tests/test-errno.c117
-rw-r--r--gnulib/tests/test-exclude.c117
-rwxr-xr-xgnulib/tests/test-exclude1.sh45
-rwxr-xr-xgnulib/tests/test-exclude2.sh45
-rwxr-xr-xgnulib/tests/test-exclude3.sh45
-rwxr-xr-xgnulib/tests/test-exclude4.sh40
-rwxr-xr-xgnulib/tests/test-exclude5.sh43
-rwxr-xr-xgnulib/tests/test-exclude6.sh41
-rwxr-xr-xgnulib/tests/test-exclude7.sh44
-rw-r--r--gnulib/tests/test-exp.c40
-rw-r--r--gnulib/tests/test-expl.c45
-rw-r--r--gnulib/tests/test-fabs.c45
-rw-r--r--gnulib/tests/test-fbufmode.c72
-rw-r--r--gnulib/tests/test-fchdir.c97
-rw-r--r--gnulib/tests/test-fchownat.c82
-rw-r--r--gnulib/tests/test-fcntl-h.c38
-rw-r--r--gnulib/tests/test-fcntl-safer.c38
-rw-r--r--gnulib/tests/test-fcntl.c346
-rw-r--r--gnulib/tests/test-fdopendir.c68
-rw-r--r--gnulib/tests/test-fdutimensat.c133
-rw-r--r--gnulib/tests/test-fflush.c145
-rw-r--r--gnulib/tests/test-fflush2.c108
-rwxr-xr-xgnulib/tests/test-fflush2.sh9
-rw-r--r--gnulib/tests/test-file-has-acl.c71
-rwxr-xr-xgnulib/tests/test-file-has-acl.sh344
-rw-r--r--gnulib/tests/test-filenamecat.c66
-rw-r--r--gnulib/tests/test-filevercmp.c121
-rw-r--r--gnulib/tests/test-flock.c97
-rw-r--r--gnulib/tests/test-floorf1.c68
-rw-r--r--gnulib/tests/test-floorf2.c151
-rw-r--r--gnulib/tests/test-floorl.c87
-rw-r--r--gnulib/tests/test-fmod.c42
-rw-r--r--gnulib/tests/test-fnmatch.c50
-rw-r--r--gnulib/tests/test-fopen-safer.c31
-rw-r--r--gnulib/tests/test-fopen.c34
-rw-r--r--gnulib/tests/test-fopen.h73
-rw-r--r--gnulib/tests/test-fpending.c41
-rwxr-xr-xgnulib/tests/test-fpending.sh12
-rw-r--r--gnulib/tests/test-fprintf-posix.c40
-rw-r--r--gnulib/tests/test-fprintf-posix.h151
-rwxr-xr-xgnulib/tests/test-fprintf-posix.sh16
-rw-r--r--gnulib/tests/test-fprintf-posix2.c112
-rwxr-xr-xgnulib/tests/test-fprintf-posix2.sh34
-rw-r--r--gnulib/tests/test-fprintf-posix3.c108
-rwxr-xr-xgnulib/tests/test-fprintf-posix3.sh31
-rw-r--r--gnulib/tests/test-fpurge.c132
-rw-r--r--gnulib/tests/test-freadable.c117
-rw-r--r--gnulib/tests/test-freadahead.c73
-rwxr-xr-xgnulib/tests/test-freadahead.sh5
-rw-r--r--gnulib/tests/test-freading.c130
-rw-r--r--gnulib/tests/test-freadptr.c94
-rwxr-xr-xgnulib/tests/test-freadptr.sh5
-rw-r--r--gnulib/tests/test-freadptr2.c62
-rwxr-xr-xgnulib/tests/test-freadptr2.sh5
-rw-r--r--gnulib/tests/test-freadseek.c93
-rwxr-xr-xgnulib/tests/test-freadseek.sh5
-rw-r--r--gnulib/tests/test-freopen-safer.c97
-rw-r--r--gnulib/tests/test-freopen.c34
-rw-r--r--gnulib/tests/test-frexp.c199
-rw-r--r--gnulib/tests/test-frexpl.c223
-rw-r--r--gnulib/tests/test-fseek.c70
-rwxr-xr-xgnulib/tests/test-fseek.sh5
-rwxr-xr-xgnulib/tests/test-fseek2.sh3
-rw-r--r--gnulib/tests/test-fseeko.c74
-rwxr-xr-xgnulib/tests/test-fseeko.sh5
-rwxr-xr-xgnulib/tests/test-fseeko2.sh3
-rw-r--r--gnulib/tests/test-fseterr.c44
-rw-r--r--gnulib/tests/test-fstatat.c82
-rw-r--r--gnulib/tests/test-fstrcmp.c79
-rw-r--r--gnulib/tests/test-fsync.c45
-rw-r--r--gnulib/tests/test-ftell.c107
-rwxr-xr-xgnulib/tests/test-ftell.sh5
-rwxr-xr-xgnulib/tests/test-ftell2.sh3
-rw-r--r--gnulib/tests/test-ftello.c118
-rwxr-xr-xgnulib/tests/test-ftello.sh5
-rwxr-xr-xgnulib/tests/test-ftello2.sh3
-rw-r--r--gnulib/tests/test-func.c40
-rw-r--r--gnulib/tests/test-futimens.c51
-rw-r--r--gnulib/tests/test-futimens.h148
-rw-r--r--gnulib/tests/test-fwritable.c117
-rw-r--r--gnulib/tests/test-fwriting.c164
-rw-r--r--gnulib/tests/test-gc-arcfour.c97
-rw-r--r--gnulib/tests/test-gc-arctwo.c96
-rw-r--r--gnulib/tests/test-gc-des.c89
-rw-r--r--gnulib/tests/test-gc-hmac-md5.c81
-rw-r--r--gnulib/tests/test-gc-hmac-sha1.c72
-rw-r--r--gnulib/tests/test-gc-md2.c128
-rw-r--r--gnulib/tests/test-gc-md4.c130
-rw-r--r--gnulib/tests/test-gc-md5.c130
-rw-r--r--gnulib/tests/test-gc-pbkdf2-sha1.c109
-rw-r--r--gnulib/tests/test-gc-rijndael.c165
-rw-r--r--gnulib/tests/test-gc-sha1.c127
-rw-r--r--gnulib/tests/test-gc.c41
-rw-r--r--gnulib/tests/test-getaddrinfo.c187
-rw-r--r--gnulib/tests/test-getcwd.c76
-rw-r--r--gnulib/tests/test-getdate.c255
-rw-r--r--gnulib/tests/test-getdelim.c95
-rw-r--r--gnulib/tests/test-getdtablesize.c34
-rw-r--r--gnulib/tests/test-getgroups.c78
-rw-r--r--gnulib/tests/test-gethostname.c67
-rw-r--r--gnulib/tests/test-getline.c95
-rw-r--r--gnulib/tests/test-getlogin.c70
-rw-r--r--gnulib/tests/test-getlogin_r.c88
-rw-r--r--gnulib/tests/test-getndelim2.c152
-rw-r--r--gnulib/tests/test-getopt.c99
-rw-r--r--gnulib/tests/test-getopt.h1268
-rw-r--r--gnulib/tests/test-getopt_long.h2120
-rw-r--r--gnulib/tests/test-getpass.c31
-rw-r--r--gnulib/tests/test-gettimeofday.c47
-rw-r--r--gnulib/tests/test-glob.c77
-rw-r--r--gnulib/tests/test-hash.c259
-rw-r--r--gnulib/tests/test-hmac-md5.c147
-rw-r--r--gnulib/tests/test-hmac-sha1.c121
-rw-r--r--gnulib/tests/test-hypot.c42
-rw-r--r--gnulib/tests/test-i-ring.c63
-rw-r--r--gnulib/tests/test-iconv-utf.c288
-rw-r--r--gnulib/tests/test-iconv.c148
-rw-r--r--gnulib/tests/test-iconvme.c85
-rw-r--r--gnulib/tests/test-idpriv-drop.c153
-rwxr-xr-xgnulib/tests/test-idpriv-drop.sh33
-rwxr-xr-xgnulib/tests/test-idpriv-drop.su.sh52
-rw-r--r--gnulib/tests/test-idpriv-droptemp.c160
-rwxr-xr-xgnulib/tests/test-idpriv-droptemp.sh33
-rwxr-xr-xgnulib/tests/test-idpriv-droptemp.su.sh52
-rw-r--r--gnulib/tests/test-inet_ntop.c56
-rw-r--r--gnulib/tests/test-inet_pton.c58
-rw-r--r--gnulib/tests/test-inttypes.c121
-rw-r--r--gnulib/tests/test-isblank.c50
-rw-r--r--gnulib/tests/test-isfinite.c236
-rw-r--r--gnulib/tests/test-isinf.c242
-rw-r--r--gnulib/tests/test-isnan.c244
-rw-r--r--gnulib/tests/test-isnand-nolibm.c22
-rw-r--r--gnulib/tests/test-isnand.c22
-rw-r--r--gnulib/tests/test-isnand.h65
-rw-r--r--gnulib/tests/test-isnanf-nolibm.c21
-rw-r--r--gnulib/tests/test-isnanf.c21
-rw-r--r--gnulib/tests/test-isnanf.h67
-rw-r--r--gnulib/tests/test-isnanl-nolibm.c23
-rw-r--r--gnulib/tests/test-isnanl.c23
-rw-r--r--gnulib/tests/test-isnanl.h141
-rw-r--r--gnulib/tests/test-j0.c40
-rw-r--r--gnulib/tests/test-j1.c40
-rw-r--r--gnulib/tests/test-jn.c90
-rw-r--r--gnulib/tests/test-langinfo.c92
-rw-r--r--gnulib/tests/test-lchown.c49
-rw-r--r--gnulib/tests/test-lchown.h260
-rw-r--r--gnulib/tests/test-ldexp.c48
-rw-r--r--gnulib/tests/test-ldexpl.c130
-rw-r--r--gnulib/tests/test-lgamma.c41
-rw-r--r--gnulib/tests/test-link.c47
-rw-r--r--gnulib/tests/test-link.h176
-rw-r--r--gnulib/tests/test-linkat.c342
-rw-r--r--gnulib/tests/test-linked_list.c411
-rw-r--r--gnulib/tests/test-linkedhash_list.c441
-rw-r--r--gnulib/tests/test-locale.c49
-rw-r--r--gnulib/tests/test-localename.c747
-rw-r--r--gnulib/tests/test-lock.c601
-rw-r--r--gnulib/tests/test-log.c40
-rw-r--r--gnulib/tests/test-log10.c40
-rw-r--r--gnulib/tests/test-log1p.c40
-rw-r--r--gnulib/tests/test-logb.c62
-rw-r--r--gnulib/tests/test-logl.c45
-rw-r--r--gnulib/tests/test-lseek.c96
-rwxr-xr-xgnulib/tests/test-lseek.sh17
-rw-r--r--gnulib/tests/test-lstat.c60
-rw-r--r--gnulib/tests/test-lstat.h116
-rw-r--r--gnulib/tests/test-lutimens.h213
-rw-r--r--gnulib/tests/test-malloca.c59
-rw-r--r--gnulib/tests/test-math.c53
-rw-r--r--gnulib/tests/test-mbmemcasecmp.c60
-rw-r--r--gnulib/tests/test-mbmemcasecmp.h372
-rwxr-xr-xgnulib/tests/test-mbmemcasecmp1.sh15
-rwxr-xr-xgnulib/tests/test-mbmemcasecmp2.sh15
-rwxr-xr-xgnulib/tests/test-mbmemcasecmp3.sh15
-rw-r--r--gnulib/tests/test-mbmemcasecoll.c66
-rwxr-xr-xgnulib/tests/test-mbmemcasecoll1.sh15
-rwxr-xr-xgnulib/tests/test-mbmemcasecoll2.sh15
-rwxr-xr-xgnulib/tests/test-mbmemcasecoll3.sh15
-rw-r--r--gnulib/tests/test-mbrtowc.c323
-rwxr-xr-xgnulib/tests/test-mbrtowc1.sh15
-rwxr-xr-xgnulib/tests/test-mbrtowc2.sh15
-rwxr-xr-xgnulib/tests/test-mbrtowc3.sh15
-rwxr-xr-xgnulib/tests/test-mbrtowc4.sh15
-rw-r--r--gnulib/tests/test-mbscasecmp.c55
-rwxr-xr-xgnulib/tests/test-mbscasecmp.sh15
-rw-r--r--gnulib/tests/test-mbscasestr1.c129
-rw-r--r--gnulib/tests/test-mbscasestr2.c141
-rwxr-xr-xgnulib/tests/test-mbscasestr2.sh15
-rw-r--r--gnulib/tests/test-mbscasestr3.c82
-rwxr-xr-xgnulib/tests/test-mbscasestr3.sh15
-rw-r--r--gnulib/tests/test-mbscasestr4.c56
-rwxr-xr-xgnulib/tests/test-mbscasestr4.sh15
-rw-r--r--gnulib/tests/test-mbschr.c68
-rwxr-xr-xgnulib/tests/test-mbschr.sh15
-rw-r--r--gnulib/tests/test-mbscspn.c61
-rwxr-xr-xgnulib/tests/test-mbscspn.sh15
-rw-r--r--gnulib/tests/test-mbsinit.c53
-rwxr-xr-xgnulib/tests/test-mbsinit.sh15
-rw-r--r--gnulib/tests/test-mbsncasecmp.c69
-rwxr-xr-xgnulib/tests/test-mbsncasecmp.sh15
-rw-r--r--gnulib/tests/test-mbsnrtowcs.c293
-rwxr-xr-xgnulib/tests/test-mbsnrtowcs1.sh15
-rwxr-xr-xgnulib/tests/test-mbsnrtowcs2.sh15
-rwxr-xr-xgnulib/tests/test-mbsnrtowcs3.sh15
-rwxr-xr-xgnulib/tests/test-mbsnrtowcs4.sh15
-rw-r--r--gnulib/tests/test-mbspbrk.c55
-rwxr-xr-xgnulib/tests/test-mbspbrk.sh15
-rw-r--r--gnulib/tests/test-mbspcasecmp.c90
-rwxr-xr-xgnulib/tests/test-mbspcasecmp.sh15
-rw-r--r--gnulib/tests/test-mbsrchr.c62
-rwxr-xr-xgnulib/tests/test-mbsrchr.sh15
-rw-r--r--gnulib/tests/test-mbsrtowcs.c293
-rwxr-xr-xgnulib/tests/test-mbsrtowcs1.sh15
-rwxr-xr-xgnulib/tests/test-mbsrtowcs2.sh15
-rwxr-xr-xgnulib/tests/test-mbsrtowcs3.sh15
-rwxr-xr-xgnulib/tests/test-mbsrtowcs4.sh15
-rw-r--r--gnulib/tests/test-mbsspn.c57
-rwxr-xr-xgnulib/tests/test-mbsspn.sh15
-rw-r--r--gnulib/tests/test-mbsstr1.c128
-rw-r--r--gnulib/tests/test-mbsstr2.c141
-rwxr-xr-xgnulib/tests/test-mbsstr2.sh15
-rw-r--r--gnulib/tests/test-mbsstr3.c81
-rwxr-xr-xgnulib/tests/test-mbsstr3.sh15
-rw-r--r--gnulib/tests/test-md2.c68
-rw-r--r--gnulib/tests/test-md4.c69
-rw-r--r--gnulib/tests/test-md5.c67
-rw-r--r--gnulib/tests/test-memchr.c119
-rw-r--r--gnulib/tests/test-memchr2.c100
-rw-r--r--gnulib/tests/test-memcmp.c71
-rw-r--r--gnulib/tests/test-memmem.c187
-rw-r--r--gnulib/tests/test-memrchr.c91
-rw-r--r--gnulib/tests/test-mkdir.c47
-rw-r--r--gnulib/tests/test-mkdir.h98
-rw-r--r--gnulib/tests/test-mkdirat.c85
-rw-r--r--gnulib/tests/test-mkfifo.c47
-rw-r--r--gnulib/tests/test-mkfifo.h74
-rw-r--r--gnulib/tests/test-mkfifoat.c124
-rw-r--r--gnulib/tests/test-mknod.c56
-rw-r--r--gnulib/tests/test-modf.c48
-rw-r--r--gnulib/tests/test-nanosleep.c84
-rw-r--r--gnulib/tests/test-netdb.c29
-rw-r--r--gnulib/tests/test-netinet_in.c27
-rw-r--r--gnulib/tests/test-nextafter.c53
-rw-r--r--gnulib/tests/test-nl_langinfo.c115
-rwxr-xr-xgnulib/tests/test-nl_langinfo.sh17
-rw-r--r--gnulib/tests/test-obstack-printf.c138
-rw-r--r--gnulib/tests/test-open.c41
-rw-r--r--gnulib/tests/test-open.h87
-rw-r--r--gnulib/tests/test-openat-safer.c121
-rw-r--r--gnulib/tests/test-openat.c86
-rw-r--r--gnulib/tests/test-parse-duration.c59
-rwxr-xr-xgnulib/tests/test-parse-duration.sh68
-rw-r--r--gnulib/tests/test-perror.c37
-rwxr-xr-xgnulib/tests/test-perror.sh27
-rw-r--r--gnulib/tests/test-pipe-filter-gi1.c114
-rwxr-xr-xgnulib/tests/test-pipe-filter-gi1.sh20
-rw-r--r--gnulib/tests/test-pipe-filter-gi2-child.c43
-rw-r--r--gnulib/tests/test-pipe-filter-gi2-main.c140
-rwxr-xr-xgnulib/tests/test-pipe-filter-gi2.sh32
-rw-r--r--gnulib/tests/test-pipe-filter-ii1.c136
-rwxr-xr-xgnulib/tests/test-pipe-filter-ii1.sh20
-rw-r--r--gnulib/tests/test-pipe-filter-ii2-child.c43
-rw-r--r--gnulib/tests/test-pipe-filter-ii2-main.c152
-rwxr-xr-xgnulib/tests/test-pipe-filter-ii2.sh31
-rw-r--r--gnulib/tests/test-pipe.c204
-rwxr-xr-xgnulib/tests/test-pipe.sh8
-rw-r--r--gnulib/tests/test-pipe2.c145
-rw-r--r--gnulib/tests/test-poll.c377
-rw-r--r--gnulib/tests/test-popen-safer.c76
-rw-r--r--gnulib/tests/test-popen-safer2.c24
-rw-r--r--gnulib/tests/test-popen.c28
-rw-r--r--gnulib/tests/test-popen.h93
-rw-r--r--gnulib/tests/test-posix_spawn1.c166
-rw-r--r--gnulib/tests/test-posix_spawn1.in.sh2
-rw-r--r--gnulib/tests/test-posix_spawn2.c139
-rw-r--r--gnulib/tests/test-posix_spawn2.in.sh3
-rw-r--r--gnulib/tests/test-posix_spawn3.c160
-rw-r--r--gnulib/tests/test-posixtm.c172
-rw-r--r--gnulib/tests/test-pow.c40
-rw-r--r--gnulib/tests/test-pread.c85
-rwxr-xr-xgnulib/tests/test-pread.sh7
-rw-r--r--gnulib/tests/test-printf-frexp.c119
-rw-r--r--gnulib/tests/test-printf-frexpl.c134
-rw-r--r--gnulib/tests/test-printf-posix.c51
-rw-r--r--gnulib/tests/test-printf-posix.h153
-rw-r--r--gnulib/tests/test-printf-posix.output40
-rwxr-xr-xgnulib/tests/test-printf-posix.sh16
-rw-r--r--gnulib/tests/test-printf-posix2.c112
-rwxr-xr-xgnulib/tests/test-printf-posix2.sh34
-rw-r--r--gnulib/tests/test-priv-set.c88
-rw-r--r--gnulib/tests/test-pty.c61
-rw-r--r--gnulib/tests/test-quotearg.c471
-rwxr-xr-xgnulib/tests/test-quotearg.sh16
-rw-r--r--gnulib/tests/test-random_r.c54
-rw-r--r--gnulib/tests/test-rawmemchr.c76
-rw-r--r--gnulib/tests/test-rbtree_list.c415
-rw-r--r--gnulib/tests/test-rbtree_oset.c136
-rw-r--r--gnulib/tests/test-rbtreehash_list.c445
-rw-r--r--gnulib/tests/test-read-file.c97
-rw-r--r--gnulib/tests/test-readlink.c48
-rw-r--r--gnulib/tests/test-readlink.h119
-rw-r--r--gnulib/tests/test-remainder.c42
-rw-r--r--gnulib/tests/test-remove.c125
-rw-r--r--gnulib/tests/test-rename.c46
-rw-r--r--gnulib/tests/test-rename.h446
-rw-r--r--gnulib/tests/test-renameat.c179
-rw-r--r--gnulib/tests/test-rijndael.c103
-rw-r--r--gnulib/tests/test-rint.c61
-rw-r--r--gnulib/tests/test-rmdir.c47
-rw-r--r--gnulib/tests/test-rmdir.h101
-rw-r--r--gnulib/tests/test-round1.c75
-rw-r--r--gnulib/tests/test-round2.c108
-rw-r--r--gnulib/tests/test-roundf1.c75
-rw-r--r--gnulib/tests/test-roundf2.c2
-rw-r--r--gnulib/tests/test-roundl.c94
-rw-r--r--gnulib/tests/test-safe-alloc.c55
-rw-r--r--gnulib/tests/test-sameacls.c527
-rw-r--r--gnulib/tests/test-sched.c38
-rw-r--r--gnulib/tests/test-search.c27
-rw-r--r--gnulib/tests/test-select-fd.c72
-rwxr-xr-xgnulib/tests/test-select-in.sh37
-rwxr-xr-xgnulib/tests/test-select-out.sh35
-rw-r--r--gnulib/tests/test-select-stdin.c80
-rw-r--r--gnulib/tests/test-select.c391
-rw-r--r--gnulib/tests/test-set-mode-acl.c44
-rwxr-xr-xgnulib/tests/test-set-mode-acl.sh203
-rw-r--r--gnulib/tests/test-setenv.c56
-rw-r--r--gnulib/tests/test-sha1.c48
-rw-r--r--gnulib/tests/test-sigaction.c116
-rw-r--r--gnulib/tests/test-signal.c125
-rw-r--r--gnulib/tests/test-signbit.c197
-rw-r--r--gnulib/tests/test-sigpipe.c69
-rwxr-xr-xgnulib/tests/test-sigpipe.sh31
-rw-r--r--gnulib/tests/test-sin.c40
-rw-r--r--gnulib/tests/test-sinh.c40
-rw-r--r--gnulib/tests/test-sinl.c45
-rw-r--r--gnulib/tests/test-sleep.c58
-rw-r--r--gnulib/tests/test-snprintf-posix.c38
-rw-r--r--gnulib/tests/test-snprintf-posix.h3113
-rw-r--r--gnulib/tests/test-snprintf.c64
-rw-r--r--gnulib/tests/test-sockets.c46
-rw-r--r--gnulib/tests/test-spawn.c54
-rw-r--r--gnulib/tests/test-sprintf-posix.c41
-rw-r--r--gnulib/tests/test-sprintf-posix.h3099
-rw-r--r--gnulib/tests/test-sqrt.c40
-rw-r--r--gnulib/tests/test-sqrtl.c45
-rw-r--r--gnulib/tests/test-stat-time.c263
-rw-r--r--gnulib/tests/test-stat.c56
-rw-r--r--gnulib/tests/test-stat.h100
-rw-r--r--gnulib/tests/test-stdbool.c95
-rw-r--r--gnulib/tests/test-stddef.c38
-rw-r--r--gnulib/tests/test-stdint.c360
-rw-r--r--gnulib/tests/test-stdio.c43
-rw-r--r--gnulib/tests/test-stdlib.c43
-rw-r--r--gnulib/tests/test-stpncpy.c61
-rw-r--r--gnulib/tests/test-stpncpy.out.aix4331000
-rw-r--r--gnulib/tests/test-stpncpy.out.glibc1000
-rw-r--r--gnulib/tests/test-strcasestr.c147
-rw-r--r--gnulib/tests/test-strchrnul.c86
-rw-r--r--gnulib/tests/test-strerror.c57
-rw-r--r--gnulib/tests/test-striconv.c180
-rw-r--r--gnulib/tests/test-striconveh.c1108
-rw-r--r--gnulib/tests/test-striconveha.c597
-rw-r--r--gnulib/tests/test-string.c33
-rw-r--r--gnulib/tests/test-strings.c27
-rw-r--r--gnulib/tests/test-strsignal.c78
-rw-r--r--gnulib/tests/test-strstr.c169
-rw-r--r--gnulib/tests/test-strtod.c918
-rw-r--r--gnulib/tests/test-strverscmp.c46
-rw-r--r--gnulib/tests/test-symlink.c47
-rw-r--r--gnulib/tests/test-symlink.h95
-rw-r--r--gnulib/tests/test-symlinkat.c118
-rw-r--r--gnulib/tests/test-sys_file.c35
-rw-r--r--gnulib/tests/test-sys_ioctl.c27
-rw-r--r--gnulib/tests/test-sys_select.c35
-rw-r--r--gnulib/tests/test-sys_socket.c53
-rw-r--r--gnulib/tests/test-sys_stat.c288
-rw-r--r--gnulib/tests/test-sys_time.c29
-rw-r--r--gnulib/tests/test-sys_times.c30
-rw-r--r--gnulib/tests/test-sys_utsname.c37
-rw-r--r--gnulib/tests/test-sys_wait.c30
-rw-r--r--gnulib/tests/test-sysexits.c52
-rw-r--r--gnulib/tests/test-tan.c40
-rw-r--r--gnulib/tests/test-tanh.c40
-rw-r--r--gnulib/tests/test-tanl.c45
-rw-r--r--gnulib/tests/test-time.c35
-rw-r--r--gnulib/tests/test-times.c105
-rw-r--r--gnulib/tests/test-tls.c212
-rw-r--r--gnulib/tests/test-trunc1.c67
-rw-r--r--gnulib/tests/test-trunc2.c155
-rw-r--r--gnulib/tests/test-truncf1.c67
-rw-r--r--gnulib/tests/test-truncf2.c155
-rw-r--r--gnulib/tests/test-truncl.c86
-rw-r--r--gnulib/tests/test-tsearch.c352
-rwxr-xr-xgnulib/tests/test-tsearch.sh12
-rw-r--r--gnulib/tests/test-u64.c47
-rw-r--r--gnulib/tests/test-uname.c64
-rw-r--r--gnulib/tests/test-unistd.c56
-rw-r--r--gnulib/tests/test-unlink.c49
-rw-r--r--gnulib/tests/test-unlink.h86
-rw-r--r--gnulib/tests/test-unlinkat.c82
-rw-r--r--gnulib/tests/test-unsetenv.c61
-rwxr-xr-xgnulib/tests/test-update-copyright.sh526
-rw-r--r--gnulib/tests/test-userspec.c191
-rw-r--r--gnulib/tests/test-usleep.c40
-rw-r--r--gnulib/tests/test-utimens-common.h60
-rw-r--r--gnulib/tests/test-utimens.c80
-rw-r--r--gnulib/tests/test-utimens.h170
-rw-r--r--gnulib/tests/test-utimensat.c111
-rw-r--r--gnulib/tests/test-vasnprintf-posix.c3671
-rw-r--r--gnulib/tests/test-vasnprintf-posix2.c63
-rwxr-xr-xgnulib/tests/test-vasnprintf-posix2.sh22
-rw-r--r--gnulib/tests/test-vasnprintf.c117
-rw-r--r--gnulib/tests/test-vasprintf-posix.c3652
-rw-r--r--gnulib/tests/test-vasprintf.c83
-rwxr-xr-xgnulib/tests/test-vc-list-files-cvs.sh62
-rwxr-xr-xgnulib/tests/test-vc-list-files-git.sh48
-rw-r--r--gnulib/tests/test-vdprintf-posix.c52
-rwxr-xr-xgnulib/tests/test-vdprintf-posix.sh16
-rw-r--r--gnulib/tests/test-verify.c48
-rw-r--r--gnulib/tests/test-version-etc.c33
-rwxr-xr-xgnulib/tests/test-version-etc.sh43
-rw-r--r--gnulib/tests/test-vfprintf-posix.c52
-rwxr-xr-xgnulib/tests/test-vfprintf-posix.sh16
-rw-r--r--gnulib/tests/test-vprintf-posix.c52
-rwxr-xr-xgnulib/tests/test-vprintf-posix.sh16
-rw-r--r--gnulib/tests/test-vsnprintf-posix.c51
-rw-r--r--gnulib/tests/test-vsnprintf.c77
-rw-r--r--gnulib/tests/test-vsprintf-posix.c54
-rw-r--r--gnulib/tests/test-wchar.c37
-rw-r--r--gnulib/tests/test-wcrtomb.c154
-rwxr-xr-xgnulib/tests/test-wcrtomb.sh35
-rw-r--r--gnulib/tests/test-wcsnrtombs.c202
-rwxr-xr-xgnulib/tests/test-wcsnrtombs1.sh15
-rwxr-xr-xgnulib/tests/test-wcsnrtombs2.sh15
-rwxr-xr-xgnulib/tests/test-wcsnrtombs3.sh15
-rwxr-xr-xgnulib/tests/test-wcsnrtombs4.sh15
-rw-r--r--gnulib/tests/test-wcsrtombs.c202
-rwxr-xr-xgnulib/tests/test-wcsrtombs1.sh15
-rwxr-xr-xgnulib/tests/test-wcsrtombs2.sh15
-rwxr-xr-xgnulib/tests/test-wcsrtombs3.sh15
-rwxr-xr-xgnulib/tests/test-wcsrtombs4.sh15
-rw-r--r--gnulib/tests/test-wctype.c74
-rw-r--r--gnulib/tests/test-wcwidth.c81
-rw-r--r--gnulib/tests/test-xalloc-die.c30
-rwxr-xr-xgnulib/tests/test-xalloc-die.sh36
-rw-r--r--gnulib/tests/test-xfprintf-posix.c40
-rw-r--r--gnulib/tests/test-xmemdup0.c82
-rw-r--r--gnulib/tests/test-xprintf-posix.c39
-rwxr-xr-xgnulib/tests/test-xprintf-posix.sh24
-rw-r--r--gnulib/tests/test-xstrtoimax.c4
-rwxr-xr-xgnulib/tests/test-xstrtoimax.sh51
-rw-r--r--gnulib/tests/test-xstrtol.c66
-rwxr-xr-xgnulib/tests/test-xstrtol.sh72
-rw-r--r--gnulib/tests/test-xstrtoll.c4
-rwxr-xr-xgnulib/tests/test-xstrtoll.sh67
-rw-r--r--gnulib/tests/test-xstrtoul.c4
-rw-r--r--gnulib/tests/test-xstrtoull.c4
-rw-r--r--gnulib/tests/test-xstrtoumax.c4
-rwxr-xr-xgnulib/tests/test-xstrtoumax.sh51
-rw-r--r--gnulib/tests/test-xvasprintf.c129
-rw-r--r--gnulib/tests/test-y0.c40
-rw-r--r--gnulib/tests/test-y1.c40
-rw-r--r--gnulib/tests/test-yesno.c65
-rwxr-xr-xgnulib/tests/test-yesno.sh74
-rw-r--r--gnulib/tests/test-yn.c90
-rw-r--r--gnulib/tests/unicase/test-casecmp.h69
-rw-r--r--gnulib/tests/unicase/test-cased.c135
-rw-r--r--gnulib/tests/unicase/test-ignorable.c246
-rw-r--r--gnulib/tests/unicase/test-is-cased.h58
-rw-r--r--gnulib/tests/unicase/test-is-casefolded.h43
-rw-r--r--gnulib/tests/unicase/test-is-lowercase.h95
-rw-r--r--gnulib/tests/unicase/test-is-titlecase.h95
-rw-r--r--gnulib/tests/unicase/test-is-uppercase.h95
-rw-r--r--gnulib/tests/unicase/test-locale-language.c44
-rwxr-xr-xgnulib/tests/unicase/test-locale-language.sh30
-rw-r--r--gnulib/tests/unicase/test-mapping-part1.h31
-rw-r--r--gnulib/tests/unicase/test-mapping-part2.h37
-rw-r--r--gnulib/tests/unicase/test-predicate-part1.h31
-rw-r--r--gnulib/tests/unicase/test-predicate-part2.h37
-rw-r--r--gnulib/tests/unicase/test-u16-casecmp.c321
-rw-r--r--gnulib/tests/unicase/test-u16-casecoll.c39
-rw-r--r--gnulib/tests/unicase/test-u16-casefold.c201
-rw-r--r--gnulib/tests/unicase/test-u16-is-cased.c36
-rw-r--r--gnulib/tests/unicase/test-u16-is-casefolded.c50
-rw-r--r--gnulib/tests/unicase/test-u16-is-lowercase.c78
-rw-r--r--gnulib/tests/unicase/test-u16-is-titlecase.c36
-rw-r--r--gnulib/tests/unicase/test-u16-is-uppercase.c78
-rw-r--r--gnulib/tests/unicase/test-u16-tolower.c238
-rw-r--r--gnulib/tests/unicase/test-u16-totitle.c198
-rw-r--r--gnulib/tests/unicase/test-u16-toupper.c198
-rw-r--r--gnulib/tests/unicase/test-u32-casecmp.c321
-rw-r--r--gnulib/tests/unicase/test-u32-casecoll.c39
-rw-r--r--gnulib/tests/unicase/test-u32-casefold.c201
-rw-r--r--gnulib/tests/unicase/test-u32-is-cased.c36
-rw-r--r--gnulib/tests/unicase/test-u32-is-casefolded.c50
-rw-r--r--gnulib/tests/unicase/test-u32-is-lowercase.c78
-rw-r--r--gnulib/tests/unicase/test-u32-is-titlecase.c36
-rw-r--r--gnulib/tests/unicase/test-u32-is-uppercase.c78
-rw-r--r--gnulib/tests/unicase/test-u32-tolower.c238
-rw-r--r--gnulib/tests/unicase/test-u32-totitle.c198
-rw-r--r--gnulib/tests/unicase/test-u32-toupper.c198
-rw-r--r--gnulib/tests/unicase/test-u8-casecmp.c330
-rw-r--r--gnulib/tests/unicase/test-u8-casecoll.c39
-rw-r--r--gnulib/tests/unicase/test-u8-casefold.c207
-rw-r--r--gnulib/tests/unicase/test-u8-is-cased.c36
-rw-r--r--gnulib/tests/unicase/test-u8-is-casefolded.c50
-rw-r--r--gnulib/tests/unicase/test-u8-is-lowercase.c78
-rw-r--r--gnulib/tests/unicase/test-u8-is-titlecase.c36
-rw-r--r--gnulib/tests/unicase/test-u8-is-uppercase.c78
-rw-r--r--gnulib/tests/unicase/test-u8-tolower.c244
-rw-r--r--gnulib/tests/unicase/test-u8-totitle.c204
-rw-r--r--gnulib/tests/unicase/test-u8-toupper.c204
-rw-r--r--gnulib/tests/unicase/test-uc_tolower.c1047
-rw-r--r--gnulib/tests/unicase/test-uc_totitle.c1055
-rw-r--r--gnulib/tests/unicase/test-uc_toupper.c1055
-rw-r--r--gnulib/tests/unicase/test-ulc-casecmp.c394
-rwxr-xr-xgnulib/tests/unicase/test-ulc-casecmp1.sh15
-rwxr-xr-xgnulib/tests/unicase/test-ulc-casecmp2.sh15
-rw-r--r--gnulib/tests/unicase/test-ulc-casecoll.c45
-rwxr-xr-xgnulib/tests/unicase/test-ulc-casecoll1.sh15
-rwxr-xr-xgnulib/tests/unicase/test-ulc-casecoll2.sh15
-rw-r--r--gnulib/tests/uniconv/test-u16-conv-from-enc.c219
-rw-r--r--gnulib/tests/uniconv/test-u16-conv-to-enc.c176
-rw-r--r--gnulib/tests/uniconv/test-u16-strconv-from-enc.c119
-rw-r--r--gnulib/tests/uniconv/test-u16-strconv-to-enc.c109
-rw-r--r--gnulib/tests/uniconv/test-u32-conv-from-enc.c219
-rw-r--r--gnulib/tests/uniconv/test-u32-conv-to-enc.c151
-rw-r--r--gnulib/tests/uniconv/test-u32-strconv-from-enc.c119
-rw-r--r--gnulib/tests/uniconv/test-u32-strconv-to-enc.c95
-rw-r--r--gnulib/tests/uniconv/test-u8-conv-from-enc.c205
-rw-r--r--gnulib/tests/uniconv/test-u8-conv-to-enc.c180
-rw-r--r--gnulib/tests/uniconv/test-u8-strconv-from-enc.c101
-rw-r--r--gnulib/tests/uniconv/test-u8-strconv-to-enc.c100
-rw-r--r--gnulib/tests/unictype/test-bidi_byname.c51
-rw-r--r--gnulib/tests/unictype/test-bidi_name.c32
-rw-r--r--gnulib/tests/unictype/test-bidi_of.c33
-rw-r--r--gnulib/tests/unictype/test-bidi_test.c48
-rw-r--r--gnulib/tests/unictype/test-block_list.c50
-rw-r--r--gnulib/tests/unictype/test-block_of.c67
-rw-r--r--gnulib/tests/unictype/test-block_test.c42
-rw-r--r--gnulib/tests/unictype/test-categ_C.c469
-rw-r--r--gnulib/tests/unictype/test-categ_Cc.c24
-rw-r--r--gnulib/tests/unictype/test-categ_Cf.c36
-rw-r--r--gnulib/tests/unictype/test-categ_Cn.c467
-rw-r--r--gnulib/tests/unictype/test-categ_Co.c25
-rw-r--r--gnulib/tests/unictype/test-categ_Cs.c23
-rw-r--r--gnulib/tests/unictype/test-categ_L.c412
-rw-r--r--gnulib/tests/unictype/test-categ_Ll.c620
-rw-r--r--gnulib/tests/unictype/test-categ_Lm.c61
-rw-r--r--gnulib/tests/unictype/test-categ_Lo.c304
-rw-r--r--gnulib/tests/unictype/test-categ_Lt.c32
-rw-r--r--gnulib/tests/unictype/test-categ_Lu.c613
-rw-r--r--gnulib/tests/unictype/test-categ_M.c183
-rw-r--r--gnulib/tests/unictype/test-categ_Mc.c107
-rw-r--r--gnulib/tests/unictype/test-categ_Me.c27
-rw-r--r--gnulib/tests/unictype/test-categ_Mn.c182
-rw-r--r--gnulib/tests/unictype/test-categ_N.c91
-rw-r--r--gnulib/tests/unictype/test-categ_Nd.c55
-rw-r--r--gnulib/tests/unictype/test-categ_Nl.c33
-rw-r--r--gnulib/tests/unictype/test-categ_No.c52
-rw-r--r--gnulib/tests/unictype/test-categ_P.c134
-rw-r--r--gnulib/tests/unictype/test-categ_Pc.c28
-rw-r--r--gnulib/tests/unictype/test-categ_Pd.c36
-rw-r--r--gnulib/tests/unictype/test-categ_Pe.c92
-rw-r--r--gnulib/tests/unictype/test-categ_Pf.c32
-rw-r--r--gnulib/tests/unictype/test-categ_Pi.c33
-rw-r--r--gnulib/tests/unictype/test-categ_Po.c130
-rw-r--r--gnulib/tests/unictype/test-categ_Ps.c94
-rw-r--r--gnulib/tests/unictype/test-categ_S.c201
-rw-r--r--gnulib/tests/unictype/test-categ_Sc.c36
-rw-r--r--gnulib/tests/unictype/test-categ_Sk.c48
-rw-r--r--gnulib/tests/unictype/test-categ_Sm.c87
-rw-r--r--gnulib/tests/unictype/test-categ_So.c156
-rw-r--r--gnulib/tests/unictype/test-categ_Z.c31
-rw-r--r--gnulib/tests/unictype/test-categ_Zl.c23
-rw-r--r--gnulib/tests/unictype/test-categ_Zp.c23
-rw-r--r--gnulib/tests/unictype/test-categ_Zs.c30
-rw-r--r--gnulib/tests/unictype/test-categ_and.c39
-rw-r--r--gnulib/tests/unictype/test-categ_and_not.c39
-rw-r--r--gnulib/tests/unictype/test-categ_byname.c99
-rw-r--r--gnulib/tests/unictype/test-categ_name.c33
-rw-r--r--gnulib/tests/unictype/test-categ_none.c35
-rw-r--r--gnulib/tests/unictype/test-categ_of.c55
-rw-r--r--gnulib/tests/unictype/test-categ_or.c36
-rw-r--r--gnulib/tests/unictype/test-categ_test_withtable.c38
-rw-r--r--gnulib/tests/unictype/test-combining.c35
-rw-r--r--gnulib/tests/unictype/test-ctype_alnum.c439
-rw-r--r--gnulib/tests/unictype/test-ctype_alpha.c438
-rw-r--r--gnulib/tests/unictype/test-ctype_blank.c30
-rw-r--r--gnulib/tests/unictype/test-ctype_cntrl.c25
-rw-r--r--gnulib/tests/unictype/test-ctype_digit.c23
-rw-r--r--gnulib/tests/unictype/test-ctype_graph.c471
-rw-r--r--gnulib/tests/unictype/test-ctype_lower.c592
-rw-r--r--gnulib/tests/unictype/test-ctype_print.c469
-rw-r--r--gnulib/tests/unictype/test-ctype_punct.c354
-rw-r--r--gnulib/tests/unictype/test-ctype_space.c31
-rw-r--r--gnulib/tests/unictype/test-ctype_upper.c576
-rw-r--r--gnulib/tests/unictype/test-ctype_xdigit.c25
-rw-r--r--gnulib/tests/unictype/test-decdigit.c49
-rw-r--r--gnulib/tests/unictype/test-decdigit.h373
-rw-r--r--gnulib/tests/unictype/test-digit.c49
-rw-r--r--gnulib/tests/unictype/test-digit.h471
-rw-r--r--gnulib/tests/unictype/test-mirror.c41
-rw-r--r--gnulib/tests/unictype/test-numeric.c59
-rw-r--r--gnulib/tests/unictype/test-numeric.h939
-rw-r--r--gnulib/tests/unictype/test-pr_alphabetic.c465
-rw-r--r--gnulib/tests/unictype/test-pr_ascii_hex_digit.c25
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_arabic_digit.c26
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_arabic_right_to_left.c47
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_block_separator.c27
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_boundary_neutral.c53
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_common_separator.c35
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_control.c24
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_embedding_or_override.c24
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_eur_num_separator.c31
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_eur_num_terminator.c41
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_european_digit.c32
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_hebrew_right_to_left.c42
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_left_to_right.c295
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_non_spacing_mark.c178
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_other_neutral.c175
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_pdf.c23
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_segment_separator.c25
-rw-r--r--gnulib/tests/unictype/test-pr_bidi_whitespace.c30
-rw-r--r--gnulib/tests/unictype/test-pr_byname.c42
-rw-r--r--gnulib/tests/unictype/test-pr_combining.c183
-rw-r--r--gnulib/tests/unictype/test-pr_composite.c291
-rw-r--r--gnulib/tests/unictype/test-pr_currency_symbol.c36
-rw-r--r--gnulib/tests/unictype/test-pr_dash.c40
-rw-r--r--gnulib/tests/unictype/test-pr_decimal_digit.c55
-rw-r--r--gnulib/tests/unictype/test-pr_default_ignorable_code_point.c37
-rw-r--r--gnulib/tests/unictype/test-pr_deprecated.c28
-rw-r--r--gnulib/tests/unictype/test-pr_diacritic.c124
-rw-r--r--gnulib/tests/unictype/test-pr_extender.c38
-rw-r--r--gnulib/tests/unictype/test-pr_format_control.c30
-rw-r--r--gnulib/tests/unictype/test-pr_grapheme_base.c524
-rw-r--r--gnulib/tests/unictype/test-pr_grapheme_extend.c194
-rw-r--r--gnulib/tests/unictype/test-pr_grapheme_link.c44
-rw-r--r--gnulib/tests/unictype/test-pr_hex_digit.c28
-rw-r--r--gnulib/tests/unictype/test-pr_hyphen.c32
-rw-r--r--gnulib/tests/unictype/test-pr_id_continue.c499
-rw-r--r--gnulib/tests/unictype/test-pr_id_start.c414
-rw-r--r--gnulib/tests/unictype/test-pr_ideographic.c32
-rw-r--r--gnulib/tests/unictype/test-pr_ids_binary_operator.c24
-rw-r--r--gnulib/tests/unictype/test-pr_ids_trinary_operator.c23
-rw-r--r--gnulib/tests/unictype/test-pr_ignorable_control.c40
-rw-r--r--gnulib/tests/unictype/test-pr_iso_control.c24
-rw-r--r--gnulib/tests/unictype/test-pr_join_control.c23
-rw-r--r--gnulib/tests/unictype/test-pr_left_of_pair.c63
-rw-r--r--gnulib/tests/unictype/test-pr_line_separator.c23
-rw-r--r--gnulib/tests/unictype/test-pr_logical_order_exception.c24
-rw-r--r--gnulib/tests/unictype/test-pr_lowercase.c623
-rw-r--r--gnulib/tests/unictype/test-pr_math.c127
-rw-r--r--gnulib/tests/unictype/test-pr_non_break.c32
-rw-r--r--gnulib/tests/unictype/test-pr_not_a_character.c40
-rw-r--r--gnulib/tests/unictype/test-pr_numeric.c101
-rw-r--r--gnulib/tests/unictype/test-pr_other_alphabetic.c144
-rw-r--r--gnulib/tests/unictype/test-pr_other_default_ignorable_code_point.c32
-rw-r--r--gnulib/tests/unictype/test-pr_other_grapheme_extend.c38
-rw-r--r--gnulib/tests/unictype/test-pr_other_id_continue.c25
-rw-r--r--gnulib/tests/unictype/test-pr_other_id_start.c25
-rw-r--r--gnulib/tests/unictype/test-pr_other_lowercase.c35
-rw-r--r--gnulib/tests/unictype/test-pr_other_math.c121
-rw-r--r--gnulib/tests/unictype/test-pr_other_uppercase.c24
-rw-r--r--gnulib/tests/unictype/test-pr_paired_punctuation.c49
-rw-r--r--gnulib/tests/unictype/test-pr_paragraph_separator.c23
-rw-r--r--gnulib/tests/unictype/test-pr_pattern_syntax.c50
-rw-r--r--gnulib/tests/unictype/test-pr_pattern_white_space.c27
-rw-r--r--gnulib/tests/unictype/test-pr_private_use.c25
-rw-r--r--gnulib/tests/unictype/test-pr_punctuation.c134
-rw-r--r--gnulib/tests/unictype/test-pr_quotation_mark.c34
-rw-r--r--gnulib/tests/unictype/test-pr_radical.c25
-rw-r--r--gnulib/tests/unictype/test-pr_sentence_terminal.c59
-rw-r--r--gnulib/tests/unictype/test-pr_soft_dotted.c53
-rw-r--r--gnulib/tests/unictype/test-pr_space.c30
-rw-r--r--gnulib/tests/unictype/test-pr_terminal_punctuation.c77
-rw-r--r--gnulib/tests/unictype/test-pr_test.c35
-rw-r--r--gnulib/tests/unictype/test-pr_titlecase.c32
-rw-r--r--gnulib/tests/unictype/test-pr_unassigned_code_value.c476
-rw-r--r--gnulib/tests/unictype/test-pr_unified_ideograph.c32
-rw-r--r--gnulib/tests/unictype/test-pr_uppercase.c615
-rw-r--r--gnulib/tests/unictype/test-pr_variation_selector.c25
-rw-r--r--gnulib/tests/unictype/test-pr_white_space.c33
-rw-r--r--gnulib/tests/unictype/test-pr_xid_continue.c506
-rw-r--r--gnulib/tests/unictype/test-pr_xid_start.c421
-rw-r--r--gnulib/tests/unictype/test-pr_zero_width.c36
-rw-r--r--gnulib/tests/unictype/test-predicate-part1.h31
-rw-r--r--gnulib/tests/unictype/test-predicate-part2.h37
-rw-r--r--gnulib/tests/unictype/test-scripts.c74
-rw-r--r--gnulib/tests/unictype/test-sy_c_ident.c38
-rw-r--r--gnulib/tests/unictype/test-sy_c_whitespace.c24
-rw-r--r--gnulib/tests/unictype/test-sy_java_ident.c38
-rw-r--r--gnulib/tests/unictype/test-sy_java_whitespace.c25
-rw-r--r--gnulib/tests/unilbrk/test-u16-possible-linebreaks.c84
-rw-r--r--gnulib/tests/unilbrk/test-u16-width-linebreaks.c74
-rw-r--r--gnulib/tests/unilbrk/test-u32-possible-linebreaks.c84
-rw-r--r--gnulib/tests/unilbrk/test-u32-width-linebreaks.c74
-rw-r--r--gnulib/tests/unilbrk/test-u8-possible-linebreaks.c78
-rw-r--r--gnulib/tests/unilbrk/test-u8-width-linebreaks.c68
-rw-r--r--gnulib/tests/unilbrk/test-ulc-possible-linebreaks.c54
-rw-r--r--gnulib/tests/unilbrk/test-ulc-width-linebreaks.c53
-rw-r--r--gnulib/tests/uniname/UnicodeDataNames.txt30423
-rw-r--r--gnulib/tests/uniname/test-uninames.c262
-rwxr-xr-xgnulib/tests/uniname/test-uninames.sh2
-rw-r--r--gnulib/tests/uninorm/NormalizationTest.txt17819
-rw-r--r--gnulib/tests/uninorm/test-canonical-decomposition.c143
-rw-r--r--gnulib/tests/uninorm/test-compat-decomposition.c184
-rw-r--r--gnulib/tests/uninorm/test-composition.c53
-rw-r--r--gnulib/tests/uninorm/test-decomposing-form.c34
-rw-r--r--gnulib/tests/uninorm/test-decomposition.c207
-rw-r--r--gnulib/tests/uninorm/test-nfc.c44
-rw-r--r--gnulib/tests/uninorm/test-nfd.c44
-rw-r--r--gnulib/tests/uninorm/test-nfkc.c44
-rw-r--r--gnulib/tests/uninorm/test-nfkd.c44
-rw-r--r--gnulib/tests/uninorm/test-u16-nfc.c332
-rw-r--r--gnulib/tests/uninorm/test-u16-nfd.c316
-rw-r--r--gnulib/tests/uninorm/test-u16-nfkc.c380
-rw-r--r--gnulib/tests/uninorm/test-u16-nfkd.c336
-rw-r--r--gnulib/tests/uninorm/test-u16-normcmp.c116
-rw-r--r--gnulib/tests/uninorm/test-u16-normcmp.h69
-rw-r--r--gnulib/tests/uninorm/test-u16-normcoll.c35
-rw-r--r--gnulib/tests/uninorm/test-u32-nfc-big.c125
-rwxr-xr-xgnulib/tests/uninorm/test-u32-nfc-big.sh2
-rw-r--r--gnulib/tests/uninorm/test-u32-nfc.c332
-rw-r--r--gnulib/tests/uninorm/test-u32-nfd-big.c125
-rwxr-xr-xgnulib/tests/uninorm/test-u32-nfd-big.sh2
-rw-r--r--gnulib/tests/uninorm/test-u32-nfd.c316
-rw-r--r--gnulib/tests/uninorm/test-u32-nfkc-big.c122
-rwxr-xr-xgnulib/tests/uninorm/test-u32-nfkc-big.sh2
-rw-r--r--gnulib/tests/uninorm/test-u32-nfkc.c380
-rw-r--r--gnulib/tests/uninorm/test-u32-nfkd-big.c122
-rwxr-xr-xgnulib/tests/uninorm/test-u32-nfkd-big.sh2
-rw-r--r--gnulib/tests/uninorm/test-u32-nfkd.c336
-rw-r--r--gnulib/tests/uninorm/test-u32-normalize-big.c304
-rw-r--r--gnulib/tests/uninorm/test-u32-normalize-big.h70
-rw-r--r--gnulib/tests/uninorm/test-u32-normcmp.c116
-rw-r--r--gnulib/tests/uninorm/test-u32-normcmp.h69
-rw-r--r--gnulib/tests/uninorm/test-u32-normcoll.c35
-rw-r--r--gnulib/tests/uninorm/test-u8-nfc.c362
-rw-r--r--gnulib/tests/uninorm/test-u8-nfd.c345
-rw-r--r--gnulib/tests/uninorm/test-u8-nfkc.c414
-rw-r--r--gnulib/tests/uninorm/test-u8-nfkd.c366
-rw-r--r--gnulib/tests/uninorm/test-u8-normcmp.c116
-rw-r--r--gnulib/tests/uninorm/test-u8-normcmp.h69
-rw-r--r--gnulib/tests/uninorm/test-u8-normcoll.c35
-rw-r--r--gnulib/tests/uninorm/test-uninorm-filter-nfc.c109
-rw-r--r--gnulib/tests/unistdio/test-u16-asnprintf1.c46
-rw-r--r--gnulib/tests/unistdio/test-u16-asnprintf1.h60
-rw-r--r--gnulib/tests/unistdio/test-u16-printf1.h941
-rw-r--r--gnulib/tests/unistdio/test-u16-vasnprintf1.c75
-rw-r--r--gnulib/tests/unistdio/test-u16-vasnprintf2.c119
-rwxr-xr-xgnulib/tests/unistdio/test-u16-vasnprintf2.sh21
-rw-r--r--gnulib/tests/unistdio/test-u16-vasnprintf3.c119
-rwxr-xr-xgnulib/tests/unistdio/test-u16-vasnprintf3.sh21
-rw-r--r--gnulib/tests/unistdio/test-u16-vasprintf1.c62
-rw-r--r--gnulib/tests/unistdio/test-u16-vsnprintf1.c71
-rw-r--r--gnulib/tests/unistdio/test-u16-vsprintf1.c71
-rw-r--r--gnulib/tests/unistdio/test-u32-asnprintf1.c46
-rw-r--r--gnulib/tests/unistdio/test-u32-asnprintf1.h60
-rw-r--r--gnulib/tests/unistdio/test-u32-printf1.h941
-rw-r--r--gnulib/tests/unistdio/test-u32-vasnprintf1.c75
-rw-r--r--gnulib/tests/unistdio/test-u32-vasnprintf2.c119
-rwxr-xr-xgnulib/tests/unistdio/test-u32-vasnprintf2.sh21
-rw-r--r--gnulib/tests/unistdio/test-u32-vasnprintf3.c119
-rwxr-xr-xgnulib/tests/unistdio/test-u32-vasnprintf3.sh21
-rw-r--r--gnulib/tests/unistdio/test-u32-vasprintf1.c62
-rw-r--r--gnulib/tests/unistdio/test-u32-vsnprintf1.c71
-rw-r--r--gnulib/tests/unistdio/test-u32-vsprintf1.c71
-rw-r--r--gnulib/tests/unistdio/test-u8-asnprintf1.c46
-rw-r--r--gnulib/tests/unistdio/test-u8-asnprintf1.h57
-rw-r--r--gnulib/tests/unistdio/test-u8-printf1.h704
-rw-r--r--gnulib/tests/unistdio/test-u8-vasnprintf1.c75
-rw-r--r--gnulib/tests/unistdio/test-u8-vasnprintf2.c109
-rwxr-xr-xgnulib/tests/unistdio/test-u8-vasnprintf2.sh21
-rw-r--r--gnulib/tests/unistdio/test-u8-vasnprintf3.c109
-rwxr-xr-xgnulib/tests/unistdio/test-u8-vasnprintf3.sh21
-rw-r--r--gnulib/tests/unistdio/test-u8-vasprintf1.c62
-rw-r--r--gnulib/tests/unistdio/test-u8-vsnprintf1.c71
-rw-r--r--gnulib/tests/unistdio/test-u8-vsprintf1.c71
-rw-r--r--gnulib/tests/unistdio/test-ulc-asnprintf1.c44
-rw-r--r--gnulib/tests/unistdio/test-ulc-asnprintf1.h54
-rw-r--r--gnulib/tests/unistdio/test-ulc-printf1.h498
-rw-r--r--gnulib/tests/unistdio/test-ulc-vasnprintf1.c73
-rw-r--r--gnulib/tests/unistdio/test-ulc-vasnprintf2.c246
-rwxr-xr-xgnulib/tests/unistdio/test-ulc-vasnprintf2.sh21
-rw-r--r--gnulib/tests/unistdio/test-ulc-vasnprintf3.c234
-rwxr-xr-xgnulib/tests/unistdio/test-ulc-vasnprintf3.sh21
-rw-r--r--gnulib/tests/unistdio/test-ulc-vasprintf1.c60
-rw-r--r--gnulib/tests/unistdio/test-ulc-vsnprintf1.c64
-rw-r--r--gnulib/tests/unistdio/test-ulc-vsprintf1.c64
-rw-r--r--gnulib/tests/unistr/test-chr.h103
-rw-r--r--gnulib/tests/unistr/test-cmp.h97
-rw-r--r--gnulib/tests/unistr/test-cmp2.h56
-rw-r--r--gnulib/tests/unistr/test-cpy-alloc.h41
-rw-r--r--gnulib/tests/unistr/test-cpy.h44
-rw-r--r--gnulib/tests/unistr/test-move.h152
-rw-r--r--gnulib/tests/unistr/test-set.h44
-rw-r--r--gnulib/tests/unistr/test-stpcpy.h47
-rw-r--r--gnulib/tests/unistr/test-stpncpy.h79
-rw-r--r--gnulib/tests/unistr/test-strcat.h56
-rw-r--r--gnulib/tests/unistr/test-strcmp.h56
-rw-r--r--gnulib/tests/unistr/test-strcpy.h47
-rw-r--r--gnulib/tests/unistr/test-strdup.h41
-rw-r--r--gnulib/tests/unistr/test-strncat.h90
-rw-r--r--gnulib/tests/unistr/test-strncmp.h92
-rw-r--r--gnulib/tests/unistr/test-strncpy.h79
-rw-r--r--gnulib/tests/unistr/test-strnlen.h60
-rw-r--r--gnulib/tests/unistr/test-u16-check.c66
-rw-r--r--gnulib/tests/unistr/test-u16-chr.c31
-rw-r--r--gnulib/tests/unistr/test-u16-cmp.c47
-rw-r--r--gnulib/tests/unistr/test-u16-cmp2.c28
-rw-r--r--gnulib/tests/unistr/test-u16-cpy-alloc.c29
-rw-r--r--gnulib/tests/unistr/test-u16-cpy.c28
-rw-r--r--gnulib/tests/unistr/test-u16-mblen.c84
-rw-r--r--gnulib/tests/unistr/test-u16-mbsnlen.c68
-rw-r--r--gnulib/tests/unistr/test-u16-mbtouc-unsafe.c33
-rw-r--r--gnulib/tests/unistr/test-u16-mbtouc.c33
-rw-r--r--gnulib/tests/unistr/test-u16-mbtouc.h82
-rw-r--r--gnulib/tests/unistr/test-u16-mbtoucr.c90
-rw-r--r--gnulib/tests/unistr/test-u16-move.c28
-rw-r--r--gnulib/tests/unistr/test-u16-next.c91
-rw-r--r--gnulib/tests/unistr/test-u16-prev.c175
-rw-r--r--gnulib/tests/unistr/test-u16-set.c29
-rw-r--r--gnulib/tests/unistr/test-u16-stpcpy.c28
-rw-r--r--gnulib/tests/unistr/test-u16-stpncpy.c59
-rw-r--r--gnulib/tests/unistr/test-u16-strcat.c28
-rw-r--r--gnulib/tests/unistr/test-u16-strcmp.c34
-rw-r--r--gnulib/tests/unistr/test-u16-strcmp.h42
-rw-r--r--gnulib/tests/unistr/test-u16-strcoll.c41
-rw-r--r--gnulib/tests/unistr/test-u16-strcpy.c28
-rw-r--r--gnulib/tests/unistr/test-u16-strdup.c27
-rw-r--r--gnulib/tests/unistr/test-u16-strlen.c57
-rw-r--r--gnulib/tests/unistr/test-u16-strmblen.c78
-rw-r--r--gnulib/tests/unistr/test-u16-strmbtouc.c91
-rw-r--r--gnulib/tests/unistr/test-u16-strncat.c59
-rw-r--r--gnulib/tests/unistr/test-u16-strncmp.c47
-rw-r--r--gnulib/tests/unistr/test-u16-strncpy.c59
-rw-r--r--gnulib/tests/unistr/test-u16-strnlen.c56
-rw-r--r--gnulib/tests/unistr/test-u16-to-u32.c156
-rw-r--r--gnulib/tests/unistr/test-u16-to-u8.c159
-rw-r--r--gnulib/tests/unistr/test-u16-uctomb.c110
-rw-r--r--gnulib/tests/unistr/test-u32-check.c66
-rw-r--r--gnulib/tests/unistr/test-u32-chr.c31
-rw-r--r--gnulib/tests/unistr/test-u32-cmp.c45
-rw-r--r--gnulib/tests/unistr/test-u32-cmp2.c28
-rw-r--r--gnulib/tests/unistr/test-u32-cpy-alloc.c29
-rw-r--r--gnulib/tests/unistr/test-u32-cpy.c28
-rw-r--r--gnulib/tests/unistr/test-u32-mblen.c81
-rw-r--r--gnulib/tests/unistr/test-u32-mbsnlen.c63
-rw-r--r--gnulib/tests/unistr/test-u32-mbtouc-unsafe.c33
-rw-r--r--gnulib/tests/unistr/test-u32-mbtouc.c36
-rw-r--r--gnulib/tests/unistr/test-u32-mbtouc.h77
-rw-r--r--gnulib/tests/unistr/test-u32-mbtoucr.c83
-rw-r--r--gnulib/tests/unistr/test-u32-move.c28
-rw-r--r--gnulib/tests/unistr/test-u32-next.c86
-rw-r--r--gnulib/tests/unistr/test-u32-prev.c133
-rw-r--r--gnulib/tests/unistr/test-u32-set.c29
-rw-r--r--gnulib/tests/unistr/test-u32-stpcpy.c28
-rw-r--r--gnulib/tests/unistr/test-u32-stpncpy.c59
-rw-r--r--gnulib/tests/unistr/test-u32-strcat.c28
-rw-r--r--gnulib/tests/unistr/test-u32-strcmp.c34
-rw-r--r--gnulib/tests/unistr/test-u32-strcmp.h42
-rw-r--r--gnulib/tests/unistr/test-u32-strcoll.c41
-rw-r--r--gnulib/tests/unistr/test-u32-strcpy.c28
-rw-r--r--gnulib/tests/unistr/test-u32-strdup.c27
-rw-r--r--gnulib/tests/unistr/test-u32-strlen.c57
-rw-r--r--gnulib/tests/unistr/test-u32-strmblen.c75
-rw-r--r--gnulib/tests/unistr/test-u32-strmbtouc.c86
-rw-r--r--gnulib/tests/unistr/test-u32-strncat.c59
-rw-r--r--gnulib/tests/unistr/test-u32-strncmp.c47
-rw-r--r--gnulib/tests/unistr/test-u32-strncpy.c59
-rw-r--r--gnulib/tests/unistr/test-u32-strnlen.c56
-rw-r--r--gnulib/tests/unistr/test-u32-to-u16.c156
-rw-r--r--gnulib/tests/unistr/test-u32-to-u8.c159
-rw-r--r--gnulib/tests/unistr/test-u32-uctomb.c104
-rw-r--r--gnulib/tests/unistr/test-u8-check.c188
-rw-r--r--gnulib/tests/unistr/test-u8-chr.c31
-rw-r--r--gnulib/tests/unistr/test-u8-cmp.c45
-rw-r--r--gnulib/tests/unistr/test-u8-cmp2.c28
-rw-r--r--gnulib/tests/unistr/test-u8-cpy-alloc.c29
-rw-r--r--gnulib/tests/unistr/test-u8-cpy.c28
-rw-r--r--gnulib/tests/unistr/test-u8-mblen.c155
-rw-r--r--gnulib/tests/unistr/test-u8-mbsnlen.c61
-rw-r--r--gnulib/tests/unistr/test-u8-mbtouc-unsafe.c33
-rw-r--r--gnulib/tests/unistr/test-u8-mbtouc.c33
-rw-r--r--gnulib/tests/unistr/test-u8-mbtouc.h179
-rw-r--r--gnulib/tests/unistr/test-u8-mbtoucr.c187
-rw-r--r--gnulib/tests/unistr/test-u8-move.c28
-rw-r--r--gnulib/tests/unistr/test-u8-next.c188
-rw-r--r--gnulib/tests/unistr/test-u8-prev.c315
-rw-r--r--gnulib/tests/unistr/test-u8-set.c29
-rw-r--r--gnulib/tests/unistr/test-u8-stpcpy.c28
-rw-r--r--gnulib/tests/unistr/test-u8-stpncpy.c52
-rw-r--r--gnulib/tests/unistr/test-u8-strcat.c28
-rw-r--r--gnulib/tests/unistr/test-u8-strcmp.c34
-rw-r--r--gnulib/tests/unistr/test-u8-strcmp.h42
-rw-r--r--gnulib/tests/unistr/test-u8-strcoll.c41
-rw-r--r--gnulib/tests/unistr/test-u8-strcpy.c28
-rw-r--r--gnulib/tests/unistr/test-u8-strdup.c27
-rw-r--r--gnulib/tests/unistr/test-u8-strlen.c50
-rw-r--r--gnulib/tests/unistr/test-u8-strmblen.c149
-rw-r--r--gnulib/tests/unistr/test-u8-strmbtouc.c188
-rw-r--r--gnulib/tests/unistr/test-u8-strncat.c52
-rw-r--r--gnulib/tests/unistr/test-u8-strncmp.c53
-rw-r--r--gnulib/tests/unistr/test-u8-strncpy.c52
-rw-r--r--gnulib/tests/unistr/test-u8-strnlen.c49
-rw-r--r--gnulib/tests/unistr/test-u8-to-u16.c158
-rw-r--r--gnulib/tests/unistr/test-u8-to-u32.c158
-rw-r--r--gnulib/tests/unistr/test-u8-uctomb.c157
-rw-r--r--gnulib/tests/uniwbrk/test-u16-wordbreaks.c94
-rw-r--r--gnulib/tests/uniwbrk/test-u32-wordbreaks.c94
-rw-r--r--gnulib/tests/uniwbrk/test-u8-wordbreaks.c85
-rw-r--r--gnulib/tests/uniwbrk/test-ulc-wordbreaks.c62
-rwxr-xr-xgnulib/tests/uniwbrk/test-ulc-wordbreaks.sh15
-rw-r--r--gnulib/tests/uniwidth/test-u16-strwidth.c58
-rw-r--r--gnulib/tests/uniwidth/test-u16-width.c64
-rw-r--r--gnulib/tests/uniwidth/test-u32-strwidth.c58
-rw-r--r--gnulib/tests/uniwidth/test-u32-width.c64
-rw-r--r--gnulib/tests/uniwidth/test-u8-strwidth.c53
-rw-r--r--gnulib/tests/uniwidth/test-u8-width.c62
-rw-r--r--gnulib/tests/uniwidth/test-uc_width.c56
-rw-r--r--gnulib/tests/uniwidth/test-uc_width2.c86
-rwxr-xr-xgnulib/tests/uniwidth/test-uc_width2.sh382
-rw-r--r--gnulib/tests/zerosize-ptr.h68
-rw-r--r--gnulib/top/GNUmakefile127
-rw-r--r--gnulib/top/maint.mk940
-rw-r--r--gnulib/users.txt95
7430 files changed, 749705 insertions, 3 deletions
diff --git a/.gitmodules b/.gitmodules
index bb9e1baf..e69de29b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +0,0 @@
-[submodule "gnulib"]
- path = gnulib
- url = git://git.sv.gnu.org/gnulib.git
diff --git a/gnulib b/gnulib
deleted file mode 160000
-Subproject 4fc10daa05477586fea99b6b3ca02a87d1102fa
diff --git a/gnulib/.cvsignore b/gnulib/.cvsignore
new file mode 100644
index 00000000..4763721f
--- /dev/null
+++ b/gnulib/.cvsignore
@@ -0,0 +1,2 @@
+.msg
+testdir*
diff --git a/gnulib/.gitattributes b/gnulib/.gitattributes
new file mode 100644
index 00000000..35a14df8
--- /dev/null
+++ b/gnulib/.gitattributes
@@ -0,0 +1,6 @@
+# See lib/git-merge-changelog.c for making this useful.
+ChangeLog merge=merge-changelog
+
+# Run this to make 'git diff' on texinfo files give nicer hunk context:
+# git config diff.texinfo.funcname '^@node[ ][ ]*\\([^,][^,]*\\)'
+*.texi* diff=texinfo
diff --git a/gnulib/.gitignore b/gnulib/.gitignore
new file mode 100644
index 00000000..b95fb408
--- /dev/null
+++ b/gnulib/.gitignore
@@ -0,0 +1,8 @@
+*.orig
+*.rej
+*~
+.#*
+\#*#
+allsnippets.tmp
+amsnippet.tmp
+testdir*
diff --git a/gnulib/COPYING b/gnulib/COPYING
new file mode 100644
index 00000000..9a209ca0
--- /dev/null
+++ b/gnulib/COPYING
@@ -0,0 +1,17 @@
+$Id: COPYING,v 1.3 2006-10-26 16:20:28 eggert Exp $
+The files in here are mostly copyright (C) Free Software Foundation, and
+are under assorted licenses. Mostly, but not entirely, GPL.
+
+Many modules are provided dual-license, either GPL or LGPL at your
+option. The headers of files in the lib directory (e.g., lib/error.c)
+state GPL for convenience, since the bulk of current gnulib users are
+GPL'd programs. But the files in the modules directory (e.g.,
+modules/error) state the true license of each file, and when you use
+'gnulib-tool --lgpl --import <modules>', gnulib-tool either rewrites
+the files to have an LGPL header as part of copying them from gnulib
+to your project directory, or fails because the modules you requested
+were not licensed under LGPL.
+
+Some of the source files in lib/ have different licenses. Also, the
+copy of maintain.texi in doc/ has a verbatim-copying license, and
+doc/standards.texi and make-stds.texi are GFDL.
diff --git a/gnulib/ChangeLog b/gnulib/ChangeLog
new file mode 100644
index 00000000..f7c7482f
--- /dev/null
+++ b/gnulib/ChangeLog
@@ -0,0 +1,63177 @@
+2010-03-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (Initial import): Clarify the requirements
+ regarding Automake.
+
+2010-02-25 Bruno Haible <bruno@clisp.org>
+
+ Fix breakage of gnulib-tool with ksh, introduced on 2010-02-21.
+ * gnulib-tool: Define 'echo' as a function only before the ksh alias
+ setting, not afterwards.
+ Reported by Ben Walton <bwalton@artsci.utoronto.ca>.
+
+2010-02-24 Eric Blake <eblake@redhat.com>
+
+ bootstrap, git-version-gen: use timestamp
+ * build-aux/git-version-gen (scriptversion): Force UTC.
+ * build-aux/bootstrap (scriptversion): New variable.
+
+ bootstrap: allow older git
+ * build-aux/bootstrap (GNULIB_SRCDIR): Add fallback if git is
+ older than 1.6.4. Requested by the libvirt project.
+
+2010-02-23 Eric Blake <eblake@redhat.com>
+
+ warn-on-use: work with old autoconf
+ * m4/warn-on-use.m4 (gl_WARN_ON_USE_PREPARE): Accomodate older
+ AS_VAR semantics of autoconf 2.60.
+ Reported by Bruno Haible.
+
+ bootstrap: improve some comments
+ * build-aux/bootstrap: Drop unneeded emacs hint. Add some
+ clarification comments.
+
+ gettimeofday: provide correct function
+ * lib/gettimeofday.c (gettimeofday): Provide rpl_gettimeofday only
+ when replacement is declared, otherwise provide gettimeofday.
+ Reported by Michael Goffioul.
+
+2010-02-23 Jim Meyering <meyering@redhat.com>
+
+ lib-ignore: relax license to "unlimited", not LGPLv2+
+ * modules/lib-ignore (License): Relax to "unlimited".
+
+2010-02-23 Jim Meyering <meyering@redhat.com>
+
+ lib-ignore: relax license to LGPLv2+
+ * modules/lib-ignore (License): Relax to LGPLv2+.
+
+2010-02-22 Eric Blake <eblake@redhat.com>
+
+ lseek: avoid bash 3.2 broken pipe bug
+ * m4/lseek.m4 (gl_FUNC_LSEEK): Drain pipe, to avoid spurious
+ warning from bash 3.2.
+ Reported by Ben Pfaff, with analysis from Bruno Haible.
+
+ bootstrap: support non-FSF copyright holder
+ * build-aux/bootstrap (COPYRIGHT_HOLDER, with_gettext): Allow
+ bootstrap.conf override of COPYRIGHT_HOLDER.
+ (MSGID_BUGS_ADDRESS): Allow URL rather than email.
+
+ bootstrap: interoperate with gettext 0.14.1
+ * build-aux/bootstrap (slurp): Fix typo when using older gettext.
+
+ bootstrap: allow for alternate submodule location
+ * build-aux/bootstrap (gnulib_path): New variable; use instead of
+ hardcoding submodule location.
+ (gnulib_mk): Allow direct use of Makefile.am.
+
+ bootstrap: use GNULIB_SRCDIR to reduce disk usage
+ * build-aux/bootstrap (GNULIB_SRCDIR): If set, use as a reference,
+ rather than reconfiguring where the submodule points.
+
+ gettimeofday: restore support for platforms that lack function
+ * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): Also compile
+ replacement if function is missing.
+ * m4/sys_time_h.m4 (gl_HEADER_SYS_TIME_H_DEFAULTS): New witness.
+ * modules/sys_time (Makefile.am): Substitute it.
+ * lib/sys_time.in.h (gettimeofday): Check it.
+ Reported by Michael Goffioul.
+
+2010-02-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio.in.h (obstack_printf): Fix typo.
+
+2010-02-21 Jose E. Marchesi <jemarch@gnu.org>
+
+ vc-list-files: use bzr ls's -R option
+ * build-aux/vc-list-files: Invoke bazaar to generate a recursive
+ list of versioned files based on 'dir' (usage of -R in 'bzr ls').
+
+2010-02-21 Jim Meyering <meyering@redhat.com>
+
+ init.sh: fix EXEEXT shims to work also for names like test-prog
+ * tests/init.sh: Re-exec a better shell, when needed.
+ If the current shell lacks support for posix $(...), an init.sh-using
+ test will now try to find a shell that supports that. If EXEEXT is
+ nonempty, we also require support for hyphen-in-alias-name and shell
+ substitutions like ${var#glob}. Failure to find such a shell results
+ in a skipped test.
+
+2010-02-21 Bruno Haible <bruno@clisp.org>
+
+ Really work around around "broken pipe" error message from bash 3.2.
+ * gnulib-tool (func_reset_sigpipe): Remove function.
+ (echo): In bash 3.2, define to a function that uses printf.
+ Analyzed by Ralf Wildenhues, Chet Ramey, Ben Pfaff.
+
+2010-02-20 Bruno Haible <bruno@clisp.org>
+
+ Restore support for automake 1.9.6 with autoconf 2.61.
+ * m4/gnulib-common.m4 (AC_PROG_MKDIR_P): Ensure MKDIR_P is AC_SUBSTed.
+ Reported by James Youngman <jay@gnu.org>.
+
+2010-02-20 Bruno Haible <bruno@clisp.org>
+
+ Improve *printf warning condition.
+ * lib/stdio.in.h (fprintf, printf, vfprintf, vprintf): Emit warning
+ also if GNULIB_POSIXCHECK is defined, the *-posix module is not used,
+ and the function is overridden due to SIGPIPE emulation.
+
+2010-02-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio.in.h: Tweak comments.
+
+2010-02-19 Bruno Haible <bruno@clisp.org>
+
+ Make it easier to find modules. New gnulib-tool option '--find'.
+ * gnulib-tool: New option --find.
+ (func_usage): Document it.
+ (func_sanitize_modulelist): New function, extracted from
+ func_all_modules.
+ (func_all_modules): Invoke it.
+ * doc/gnulib-tool.texi (Which modules?): New node.
+
+2010-02-18 Markus Duft <mduft@gentoo.org> (tiny change)
+
+ * lib/sys_select.in.h: Provide select replacement even if
+ sys/select.h exists on a system, for Interix.
+
+2010-02-18 Jim Meyering <meyering@redhat.com>
+
+ init.sh: don't use $(...) just yet
+ * tests/init.sh (create_exe_shim_functions_): Use `...`, not $(...),
+ to accommodate e.g., Solaris' /bin/sh.
+
+2010-02-17 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/netdb.texi: Mention NetBSD 5.0 problem.
+ Reported by Ludovic Courtès <ludo@gnu.org>.
+
+2010-02-16 Simon Josefsson <simon@josefsson.org>
+
+ * modules/userspec-tests (test_userspec_LDADD): Add variable, for
+ linking with -lintl.
+
+2010-02-17 Simon Josefsson <simon@josefsson.org>
+
+ * lib/netdb.in.h (AI_V4MAPPED, AI_ALL, AI_ADDRCONFIG): Define to 0
+ if not provided by the system's netdb.h. Reported by
+ ludo@gnu.org (Ludovic Courtès).
+
+2010-02-15 Jim Meyering <meyering@redhat.com>
+
+ init.sh: improve portability and efficiency
+ * tests/init.sh (find_exe_basenames_): Remove unnecessary use of
+ "dummy" in a for loop.
+ Use '!', not '^' to select the complement of a character set used
+ in a "case" statement.
+ Use shell variable manipulation, a la ${...%.exe}, rather than sed.
+ Suggestions from Eric Blake.
+
+ init.sh: automatically accommodate programs with the .exe suffix
+ Automatically arrange for an invocation of "prog" to execute the
+ program named "prog$EXEEXT" (usually prog.exe). Thus, all invocations
+ may use the simpler "prog", yet still work when built on a system
+ that requires specifying the added suffix.
+ Do this by constructing a function named "prog" that invokes
+ "prog.exe" for each .exe file in selected directories.
+ * tests/init.sh (find_exe_basenames_): New function.
+ (create_exe_shim_functions_): New function.
+ (path_prepend_): Use it.
+
+ maint.mk: mark syntax-check sc_*.m rules as .PHONY
+ * top/maint.mk ($(syntax-check-rules)): Add .PHONY, so that
+ "make -t syntax-check" doesn't create a ton of sc_*.m files.
+
+2010-02-14 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: prohibit inclusion of "hash-pjw.h" without_use
+ * top/maint.mk (sc_prohibit_hash_without_use): Re-add "@".
+ (sc_prohibit_hash_pjw_without_use): New rule.
+
+ maint.mk: allow the default upload destination dir to be overridden
+ * top/maint.mk (upload_dest_dir_): Define with a default that
+ preserves the status quo.
+ (emit_upload_commands): Use it, rather than hard-coding $(PACKAGE).
+ Reported by Peter Simons.
+
+ maint.mk: prohibit inclusion of "hash.h" without_use
+ * top/maint.mk (sc_prohibit_hash_without_use): New rule.
+
+2010-02-10 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: prohibit inclusion of "ignore-value.h" without_use
+ * top/maint.mk (sc_prohibit_ignore_value_without_use): New rule.
+
+2010-02-09 Eric Blake <ebb9@byu.net>
+ and Bruno Haible <bruno@clisp.org>
+
+ obstack-printf-posix: ensure declaration
+ * m4/obstack-printf.m4 (gl_DECL_OBSTACK_PRINTF): New macro,
+ extracted from gl_FUNC_OBSTACK_PRINTF.
+ (gl_FUNC_OBSTACK_PRINTF): Invoke it.
+ * m4/obstack-printf-posix.m4 (gl_FUNC_OBSTACK_PRINTF_POSIX):
+ Likewise.
+ * lib/stdio.in.h (obstack_printf, obstack_vprintf): Declare also
+ if GNULIB_OBSTACK_PRINTF_POSIX is 1 and GNULIB_OBSTACK_PRINTF is
+ 0.
+
+2010-02-08 Bruno Haible <bruno@clisp.org>
+
+ gnulib-tool: Fix typo in 2010-02-07 commit.
+ * gnulib-tool (func_get_dependencies): Fix typo in last commit.
+ Reported by Eric Blake.
+
+2010-02-07 Bruno Haible <bruno@clisp.org>
+
+ gnulib-tool: Fix up caching patches.
+ * gnulib-tool: New options --cache-modules, --no-cache-modules. Remove
+ option --no-cache. Use associative arrays when supported by the shell.
+ (sed_comments): New variable.
+ (modcache): Renamed from do_cache.
+ (sed_extract_field_header): Renamed from sed_extract_cache_prog. Don't
+ abbreviate unnecessarily.
+ (have_associative): New variable.
+ (func_cache_var): Define correctly for bash 1.x. Define in an optimized
+ way also for ksh and zsh.
+ (func_init_sed_convert_to_cache_statements): New function, extracted
+ from func_cache_lookup_module. Add support for associative arrays.
+ Don't set the c_MODULE_cached variable here. Ignore all lines before
+ the first field header. Remove only the final newline, not all trailing
+ newlines. Support empty fields correctly. Limit the use of 'eval' to
+ assignments.
+ (func_get_description, func_get_status, func_get_notice,
+ func_get_applicability, func_get_filelist, func_get_dependencies,
+ func_get_autoconf_early_snippet, func_get_autoconf_snippet,
+ func_get_automake_snippet, func_get_include_directive,
+ func_get_link_directive, func_get_license, func_get_maintainer):
+ Update documentation. List the unoptimized code first. Add support for
+ associative arrays. Limit the use of 'eval' to assignments.
+ (func_get_applicability): Undo stylistic pessimisations.
+ (func_get_automake_snippet, func_get_include_directive): Reduce code
+ duplication.
+ (func_modules_transitive_closure, func_modules_add_dummy,
+ func_modules_notice, func_modules_to_filelist, func_add_file,
+ func_update_file, func_emit_lib_Makefile_am, func_emit_po_Makevars,
+ func_emit_po_POTFILES_in, func_emit_tests_Makefile_am, func_import,
+ func_create_testdir, func_create_megatestdir): Update documentation.
+
+2010-01-18 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_cache_lookup_module): Store the module name
+ belonging to the cache variable; error out if two different
+ module names map to the same cache variable name.
+
+2010-01-18 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ gnulib-tool: Make caching optional.
+ * gnulib-tool: Accept option --no-cache, turning off $do_cache.
+ Update matching short versions of --no-changelog.
+ (func_usage): Update.
+ (sed_extract_cache_prog): Renamed from ...
+ (sed_extract_prog): ... this; revert to old extraction script.
+ (func_get_description, func_get_status)
+ (func_get_notice, func_get_applicability, func_get_filelist)
+ (func_get_dependencies, func_get_autoconf_early_snippet)
+ (func_get_autoconf_snippet, func_get_automake_snippet)
+ (func_get_include_directive, func_get_link_directive)
+ (func_get_license, func_get_maintainer): If $do_cache is false,
+ use old, non-caching extraction scripts.
+ Suggestion by Bruno Haible.
+
+2010-01-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ gnulib-tool: cache module metainformation.
+ * gnulib-tool (sed_extract_prog): Match newline before each
+ header, and rewrite header to a shell variable suffix.
+ (func_cache_var, func_cache_lookup_module): New functions,
+ to turn a module name into a cache variable prefix, and to
+ look up and cache module metainformation.
+ (func_get_description, func_get_status)
+ (func_get_notice, func_get_applicability, func_get_filelist)
+ (func_get_dependencies, func_get_autoconf_early_snippet)
+ (func_get_autoconf_snippet, func_get_automake_snippet)
+ (func_get_include_directive, func_get_link_directive)
+ (func_get_license, func_get_maintainer): Use
+ func_cache_lookup_module.
+
+2010-02-07 Bruno Haible <bruno@clisp.org>
+
+ fnctl: Fix missing dependency.
+ * modules/fcntl (Depends-on): Add getdtablesize.
+ Reported by John W. Eaton <jwe@gnu.org>.
+
+2010-02-05 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Argp: fix recognition of short alias options.
+
+ * lib/argp-parse.c (convert_options): Fix improper use of
+ `|' between character values.
+ * tests/test-argp.c (group1_option): New alias option
+ --read (-r).
+ (group1_parser): Special handling for 'r'.
+ (test15): New test case.
+ (test_fun): Add test15.
+ * tests/test-argp-2.sh: Update expected --help and --usage
+ outputs.
+
+2010-02-05 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * tests/test-argp.c: Fix indentation.
+
+2010-02-04 Eric Blake <ebb9@byu.net>
+
+ gettimeofday: expose type of second argument
+ * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): Do better detection
+ of glibc extension signature, and define GETTIMEOFDAY_TIMEZONE.
+ * tests/test-gettimeofday.c: Use it to silence warning.
+ * doc/posix-functions/gettimeofday.texi (gettimeofday): Document
+ the issue.
+
+2010-02-03 Jim Meyering <meyering@redhat.com>
+
+ regcomp.c: avoid the sole warning from gcc's -Wtype-limits
+ * lib/regcomp.c (TYPE_SIGNED): Define.
+ (parse_dup_op): Use it to avoid the sole warning from -Wtype-limits.
+
+ regcomp.c: avoid a new -Wshadow warning
+ * lib/regcomp.c (create_initial_state): Do not shadow local "err".
+
+2010-02-01 Jim Meyering <meyering@redhat.com>
+
+ removing useless parentheses in cpp #define directives
+ For motivation, see commit c0221df4, "define STREQ(a,b)
+ consistently, removing useless parentheses"
+ * lib/memcmp.c (CMP_LT_OR_GT): Remove useless parentheses.
+ * lib/mountlist.c (MNT_IGNORE): Likewise.
+ * lib/trim.h (trim, trim_trailing, trim_leading): Likewise.
+
+2010-02-01 Eric Blake <ebb9@byu.net>
+
+ sys_time: use link-warning
+ * m4/sys_time_h.m4 (gl_HEADER_SYS_TIME_H_BODY): Split defaults...
+ (gl_HEADER_SYS_TIME_H_DEFAULTS): ...into new macro.
+ (gl_SYS_TIME_MODULE_INDICATOR): New macro.
+ * modules/sys_time (Depends-on): Add warn-on-use.
+ (Makefile.am): Always build replacement.
+ (configure.ac): Update substitutions.
+ * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY)
+ (gl_FUNC_GETTIMEOFDAY_CLOBBER): Include defaults, and no longer
+ bother with SYS_TIME_H.
+ * modules/gettimeofday (configure.ac): Declare indicator.
+ * lib/sys_time.in.h (gettimeofday): Warn if gnulib module is not
+ in use.
+
+ closein-tests: silence compiler warning
+ * tests/test-closein.c (main): Ignore fread result.
+ * modules/closein-tests (Depends-on): Add ignore-value.
+
+ tests: silence warning about system return
+ * tests/test-areadlink-with-size.c (main): Ignore system result.
+ * tests/test-areadlink.c (main): Likewise.
+ * tests/test-areadlinkat-with-size.c (main): Likewise.
+ * tests/test-areadlinkat.c (main): Likewise.
+ * tests/test-canonicalize-lgpl.c (main): Likewise.
+ * tests/test-canonicalize.c (main): Likewise.
+ * tests/test-chown.c (main): Likewise.
+ * tests/test-fchownat.c (main): Likewise.
+ * tests/test-fdutimensat.c (main): Likewise.
+ * tests/test-fstatat.c (main): Likewise.
+ * tests/test-futimens.c (main): Likewise.
+ * tests/test-lchown.c (main): Likewise.
+ * tests/test-link.c (main): Likewise.
+ * tests/test-linkat.c (main): Likewise.
+ * tests/test-lstat.c (main): Likewise.
+ * tests/test-mkdir.c (main): Likewise.
+ * tests/test-mkdirat.c (main): Likewise.
+ * tests/test-mkfifo.c (main): Likewise.
+ * tests/test-mkfifoat.c (main): Likewise.
+ * tests/test-mknod.c (main): Likewise.
+ * tests/test-readlink.c (main): Likewise.
+ * tests/test-remove.c (main): Likewise.
+ * tests/test-rename.c (main): Likewise.
+ * tests/test-renameat.c (main): Likewise.
+ * tests/test-rmdir.c (main): Likewise.
+ * tests/test-symlink.c (main): Likewise.
+ * tests/test-symlinkat.c (main): Likewise.
+ * tests/test-unlink.c (main): Likewise.
+ * tests/test-unlinkat.c (main): Likewise.
+ * tests/test-utimens.c (main): Likewise.
+ * tests/test-utimensat.c (main): Likewise.
+ * modules/areadlink-tests (Depends-on): Add ignore-value.
+ * modules/areadlink-with-size-tests (Depends-on): Likewise.
+ * modules/areadlinkat-tests (Depends-on): Likewise.
+ * modules/areadlinkat-with-size-tests (Depends-on): Likewise.
+ * modules/canonicalize-lgpl-tests (Depends-on): Likewise.
+ * modules/canonicalize-tests (Depends-on): Likewise.
+ * modules/chown-tests (Depends-on): Likewise.
+ * modules/fdutimensat-tests (Depends-on): Likewise.
+ * modules/futimens-tests (Depends-on): Likewise.
+ * modules/lchown-tests (Depends-on): Likewise.
+ * modules/link-tests (Depends-on): Likewise.
+ * modules/linkat-tests (Depends-on): Likewise.
+ * modules/lstat-tests (Depends-on): Likewise.
+ * modules/mkdir-tests (Depends-on): Likewise.
+ * modules/mkfifo-tests (Depends-on): Likewise.
+ * modules/mkfifoat-tests (Depends-on): Likewise.
+ * modules/mknod-tests (Depends-on): Likewise.
+ * modules/openat-tests (Depends-on): Likewise.
+ * modules/readlink-tests (Depends-on): Likewise.
+ * modules/remove-tests (Depends-on): Likewise.
+ * modules/rename-tests (Depends-on): Likewise.
+ * modules/renameat-tests (Depends-on): Likewise.
+ * modules/rmdir-tests (Depends-on): Likewise.
+ * modules/symlink-tests (Depends-on): Likewise.
+ * modules/symlinkat-tests (Depends-on): Likewise.
+ * modules/unlink-tests (Depends-on): Likewise.
+ * modules/utimens-tests (Depends-on): Likewise.
+ * modules/utimensat-tests (Depends-on): Likewise.
+
+2010-01-31 Bruno Haible <bruno@clisp.org>
+
+ Perform the same test for many <math.h> functions.
+ * m4/mathfunc.m4 (gl_COMMON_DOUBLE_MATHFUNC,
+ gl_COMMON_DOUBLE_MATHFUNC_TEST): New macros.
+ * m4/sqrt.m4 (gl_FUNC_SQRT): Invoke gl_COMMON_DOUBLE_MATHFUNC instead
+ of gl_MATHFUNC.
+ * modules/acos (configure.ac): Likewise.
+ * modules/asin (configure.ac): Likewise.
+ * modules/atan (configure.ac): Likewise.
+ * modules/atan2 (configure.ac): Likewise.
+ * modules/cbrt (configure.ac): Likewise.
+ * modules/copysign (configure.ac): Likewise.
+ * modules/cos (configure.ac): Likewise.
+ * modules/cosh (configure.ac): Likewise.
+ * modules/erf (configure.ac): Likewise.
+ * modules/erfc (configure.ac): Likewise.
+ * modules/exp (configure.ac): Likewise.
+ * modules/fmod (configure.ac): Likewise.
+ * modules/hypot (configure.ac): Likewise.
+ * modules/j0 (configure.ac): Likewise.
+ * modules/j1 (configure.ac): Likewise.
+ * modules/jn (configure.ac): Likewise.
+ * modules/lgamma (configure.ac): Likewise.
+ * modules/log (configure.ac): Likewise.
+ * modules/log10 (configure.ac): Likewise.
+ * modules/log1p (configure.ac): Likewise.
+ * modules/pow (configure.ac): Likewise.
+ * modules/remainder (configure.ac): Likewise.
+ * modules/sin (configure.ac): Likewise.
+ * modules/sinh (configure.ac): Likewise.
+ * modules/tan (configure.ac): Likewise.
+ * modules/tanh (configure.ac): Likewise.
+ * modules/y0 (configure.ac): Likewise.
+ * modules/y1 (configure.ac): Likewise.
+ * modules/yn (configure.ac): Likewise.
+ Suggested by Paolo Bonzini.
+
+2010-01-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/getline.m4 (gl_FUNC_GETLINE): Add comment about REPLACE_GETLINE.
+
+2010-01-31 Bruno Haible <bruno@clisp.org>
+
+ Work around getdelim() bug on FreeBSD 8.0.
+ * m4/getdelim.m4 (gl_FUNC_GETDELIM): Test whether getdelim supports an
+ initially NULL line. Set REPLACE_GETDELIM if getdelim exists but does
+ not work.
+ * lib/stdio.in.h (getdelim): Define as an alias if REPLACE_GETDELIM
+ is 1.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Initialize REPLACE_GETDELIM.
+ * modules/stdio (Makefile.am): Also substitute REPLACE_GETDELIM.
+ * tests/test-getdelim.c (main): Also test result for a NULL buffer and
+ a non-zero size.
+ * doc/posix-functions/getdelim.texi: Mention the FreeBSD bug.
+
+2010-01-31 Bruno Haible <bruno@clisp.org>
+
+ Work around getline() bug on FreeBSD 8.0.
+ * m4/getline.m4 (gl_FUNC_GETLINE): Also test result for a NULL buffer
+ and a non-zero size.
+ * tests/test-getline.c (main): Likewise.
+ * doc/posix-functions/getline.texi: Mention the FreeBSD bug.
+ Reported by Dennis <noordsij@cs.helsinki.fi> via Eric Blake.
+
+2010-01-28 Eric Blake <ebb9@byu.net>
+
+ regex: fix build failure
+ * lib/regex_internal.h (__GNUC_PREREQ): Define for non-glibc
+ platforms.
+
+2010-01-28 Jim Meyering <meyering@redhat.com>
+
+ regex: do not ignore memory allocation failure
+ * lib/regex_internal.c (create_cd_newstate): Detect
+ re_node_set_init_copy failure. Extracted from glibc commit
+ 2da42bc06566bc89785e580fa1ac89b4c9f2a63c.
+
+ regex: sync more white-space changes from libc
+ * lib/regex_internal.c: White-space only changes.
+ * lib/regexec.c: Likewise.
+
+ regex: add many uses of __attribute_warn_unused_result__
+ * lib/regex_internal.c: Use __attribute_warn_unused_result__.
+ * lib/regexec.c: Likewise.
+ Extracted from a messy glibc commit.
+
+ regcomp.c: spelling and merge-artifact from glibc
+ * lib/regcomp.c: Merge remainder of glibc's
+ 2da42bc06566bc89785e580fa1ac89b4c9f2a63c.
+
+ regcomp.c: sync white-space changes from glibc
+ * lib/regcomp.c: Merge to accommodate white space
+ changes from glibc's 2da42bc06566bc89785e580fa1ac89b4c9f2a63c.
+
+ regcomp.c: do not ignore internal return values
+ * lib/regcomp.c: Do not ignore internal return values.
+ This is from glibc's 2da42bc06566bc89785e580fa1ac89b4c9f2a63c,
+ but without its white-space changes and spelling fixes.
+
+ regex_internal.h: define __attribute_warn_unused_result__
+ * lib/regex_internal.h (__attribute_warn_unused_result__): Define.
+
+ maint: add a syntax-check rule to check for vulnerable Makefile.in
+ * top/maint.mk (sc_vulnerable_makefile_CVE-2009-4029): New rule.
+
+2010-01-27 Jim Meyering <meyering@redhat.com>
+
+ ncftpput-ftp: clean up spaces
+ * build-aux/ncftpput-ftp: Make Copyright line consistent.
+ Remove trailing blanks.
+
+2010-01-27 Simon Josefsson <simon@josefsson.org>
+
+ * build-aux/git-version-gen: Fix copyright statement.
+ * build-aux/gnupload: Likewise.
+ * tests/test-arcfour.c: Likewise.
+ * tests/test-arctwo.c: Likewise.
+ * tests/test-count-one-bits.c: Likewise.
+ * tests/test-crc.c: Likewise.
+ * tests/test-des.c: Likewise.
+ * tests/test-gc-arcfour.c: Likewise.
+ * tests/test-gc-arctwo.c: Likewise.
+ * tests/test-gc-des.c: Likewise.
+ * tests/test-gc-hmac-md5.c: Likewise.
+ * tests/test-gc-hmac-sha1.c: Likewise.
+ * tests/test-gc-md2.c: Likewise.
+ * tests/test-gc-md4.c: Likewise.
+ * tests/test-gc-md5.c: Likewise.
+ * tests/test-gc-pbkdf2-sha1.c: Likewise.
+ * tests/test-gc-rijndael.c: Likewise.
+ * tests/test-gc-sha1.c: Likewise.
+ * tests/test-gc.c: Likewise.
+ * tests/test-gethostname.c: Likewise.
+ * tests/test-gettimeofday.c: Likewise.
+ * tests/test-hash.c: Likewise.
+ * tests/test-hmac-md5.c: Likewise.
+ * tests/test-hmac-sha1.c: Likewise.
+ * tests/test-md2.c: Likewise.
+ * tests/test-md4.c: Likewise.
+ * tests/test-md5.c: Likewise.
+ * tests/test-memchr.c: Likewise.
+ * tests/test-memchr2.c: Likewise.
+ * tests/test-memcmp.c: Likewise.
+ * tests/test-memmem.c: Likewise.
+ * tests/test-memrchr.c: Likewise.
+ * tests/test-rawmemchr.c: Likewise.
+ * tests/test-read-file.c: Likewise.
+ * tests/test-rijndael.c: Likewise.
+ * tests/test-sockets.c: Likewise.
+ * tests/test-strchrnul.c: Likewise.
+ * tests/test-strstr.c: Likewise.
+ * tests/test-strtod.c: Likewise.
+ * build-aux/ncftpput-ftp: Likewise.
+
+2010-01-26 Eric Blake <ebb9@byu.net>
+
+ ignore-value: update recommended header name
+ * modules/ignore-value (Include): Only use <> for headers that
+ exist in glibc.
+
+2010-01-26 Jim Meyering <meyering@redhat.com>
+
+ test-userspec.c: avoid compiler warnings
+ * tests/test-userspec.c (main): Avoid shadowing ("uid"),
+ and "initialization discards qualifiers..." warnings.
+ Put the first "uid" in its own scope, and make char* members "const".
+
+2010-01-25 Bruno Haible <bruno@clisp.org>
+
+ gnulib-tool: Make warning diagnostics consistent.
+ * gnulib-tool (func_warning): New function.
+ Use it everywhere where gnulib-tool produces output to stderr and it is
+ not a fatal error.
+
+2010-01-25 Bruno Haible <bruno@clisp.org>
+
+ Fix test dependencies.
+ * modules/xstrtol-tests (Depends-on): Add inttypes.
+ * modules/xstrtoll-tests (Depends-on): Likewise. Remove xstrtoll.
+
+2010-01-25 Pádraig Brady <P@draigBrady.com>
+
+ syntax-check: detect incorrect boolean macro values in config.h
+ * modules/maintainer-makefile (configure.ac): Parameterize the location
+ of config.h which will be available to makefiles as $(CONFIG_INCLUDE).
+ The logic is from Eric Blake and the location indicated by Jim Meyering.
+ Note the more natural CONFIG_HEADER name is prohibited by automake
+ for backwards compatibility reasons.
+ * top/maint.mk (sc_Wundef_boolean): New rule.
+
+2010-01-25 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: detect MacOS 10.6's shasum, too
+ * build-aux/bootstrap: Also recognize MacOS 10.6's shasum.
+ Suggested by Thomas Treichl <Thomas.Treichl@gmx.net>.
+
+2010-01-23 Jim Meyering <meyering@redhat.com>
+
+ xstrtoll: new module
+ * modules/xstrtoll: New file.
+ * MODULES.html.sh (Numeric conversion functions): Add xstrtoll.
+ * lib/xstrtol.h [HAVE_LONG_LONG_INT]: Declare xstrtoll and xstrtoull.
+ * lib/xstrtoll.c, lib/xstrtoull.c: New files.
+ ./configure fails if you use this module and lack "long long".
+ * modules/xstrtoll-tests: New module.
+ * tests/test-xstrtoll.c, tests/test-xstrtoull.c: New files.
+ * tests/test-xstrtoll.sh: Like test-xstrtol.c, but use the
+ new init.sh-based test framework.
+
+2010-01-24 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'yn'.
+ * modules/yn-tests: New file.
+ * tests/test-yn.c: New file.
+
+ Tests for module 'y1'.
+ * modules/y1-tests: New file.
+ * tests/test-y1.c: New file.
+
+ Tests for module 'y0'.
+ * modules/y0-tests: New file.
+ * tests/test-y0.c: New file.
+
+ Tests for module 'tanh'.
+ * modules/tanh-tests: New file.
+ * tests/test-tanh.c: New file.
+
+ Tests for module 'tan'.
+ * modules/tan-tests: New file.
+ * tests/test-tan.c: New file.
+
+ Tests for module 'sqrt'.
+ * modules/sqrt-tests: New file.
+ * tests/test-sqrt.c: New file.
+
+ Tests for module 'sinh'.
+ * modules/sinh-tests: New file.
+ * tests/test-sinh.c: New file.
+
+ Tests for module 'sin'.
+ * modules/sin-tests: New file.
+ * tests/test-sin.c: New file.
+
+ Tests for module 'rint'.
+ * modules/rint-tests: New file.
+ * tests/test-rint.c: New file.
+
+ Tests for module 'remainder'.
+ * modules/remainder-tests: New file.
+ * tests/test-remainder.c: New file.
+
+ Tests for module 'pow'.
+ * modules/pow-tests: New file.
+ * tests/test-pow.c: New file.
+
+ Tests for module 'nextafter'.
+ * modules/nextafter-tests: New file.
+ * tests/test-nextafter.c: New file.
+
+ Tests for module 'modf'.
+ * modules/modf-tests: New file.
+ * tests/test-modf.c: New file.
+
+ Tests for module 'logb'.
+ * modules/logb-tests: New file.
+ * tests/test-logb.c: New file.
+
+ Tests for module 'log1p'.
+ * modules/log1p-tests: New file.
+ * tests/test-log1p.c: New file.
+
+ Tests for module 'log10'.
+ * modules/log10-tests: New file.
+ * tests/test-log10.c: New file.
+
+ Tests for module 'log'.
+ * modules/log-tests: New file.
+ * tests/test-log.c: New file.
+
+ Tests for module 'lgamma'.
+ * modules/lgamma-tests: New file.
+ * tests/test-lgamma.c: New file.
+
+ Tests for module 'ldexp'.
+ * modules/ldexp-tests: New file.
+ * tests/test-ldexp.c: New file.
+
+ Tests for module 'jn'.
+ * modules/jn-tests: New file.
+ * tests/test-jn.c: New file.
+
+ Tests for module 'j1'.
+ * modules/j1-tests: New file.
+ * tests/test-j1.c: New file.
+
+ Tests for module 'j0'.
+ * modules/j0-tests: New file.
+ * tests/test-j0.c: New file.
+
+ Tests for module 'hypot'.
+ * modules/hypot-tests: New file.
+ * tests/test-hypot.c: New file.
+
+ Tests for module 'fmod'.
+ * modules/fmod-tests: New file.
+ * tests/test-fmod.c: New file.
+
+ Tests for module 'fabs'.
+ * modules/fabs-tests: New file.
+ * tests/test-fabs.c: New file.
+
+ Tests for module 'exp'.
+ * modules/exp-tests: New file.
+ * tests/test-exp.c: New file.
+
+ Tests for module 'erfc'.
+ * modules/erfc-tests: New file.
+ * tests/test-erfc.c: New file.
+
+ Tests for module 'erf'.
+ * modules/erf-tests: New file.
+ * tests/test-erf.c: New file.
+
+ Tests for module 'cosh'.
+ * modules/cosh-tests: New file.
+ * tests/test-cosh.c: New file.
+
+ Tests for module 'cos'.
+ * modules/cos-tests: New file.
+ * tests/test-cos.c: New file.
+
+ Tests for module 'copysign'.
+ * modules/copysign-tests: New file.
+ * tests/test-copysign.c: New file.
+
+ Tests for module 'cbrt'.
+ * modules/cbrt-tests: New file.
+ * tests/test-cbrt.c: New file.
+
+ Tests for module 'atan2'.
+ * modules/atan2-tests: New file.
+ * tests/test-atan2.c: New file.
+
+ Tests for module 'atan'.
+ * modules/atan-tests: New file.
+ * tests/test-atan.c: New file.
+
+ Tests for module 'asin'.
+ * modules/asin-tests: New file.
+ * tests/test-asin.c: New file.
+
+ Tests for module 'acos'.
+ * modules/acos-tests: New file.
+ * tests/test-acos.c: New file.
+
+2010-01-24 Bruno Haible <bruno@clisp.org>
+
+ Fix tests for common <math.h> functions.
+ * m4/mathfunc.m4 (gl_MATHFUNC): Take two additional parameters. Use a
+ code snippet that references the function pointer, rather than merely
+ calling the function. Substitute the FUNC_LIBM variable.
+ * m4/sqrt.m4 (gl_FUNC_SQRT): Update gl_MATHFUNC invocation.
+ * modules/acos (configure.ac): Likewise.
+ * modules/asin (configure.ac): Likewise.
+ * modules/atan (configure.ac): Likewise.
+ * modules/atan2 (configure.ac): Likewise.
+ * modules/cbrt (configure.ac): Likewise.
+ * modules/copysign (configure.ac): Likewise.
+ * modules/cos (configure.ac): Likewise.
+ * modules/cosh (configure.ac): Likewise.
+ * modules/erf (configure.ac): Likewise.
+ * modules/erfc (configure.ac): Likewise.
+ * modules/exp (configure.ac): Likewise.
+ * modules/fabs (configure.ac): Likewise.
+ * modules/fmod (configure.ac): Likewise.
+ * modules/hypot (configure.ac): Likewise.
+ * modules/j0 (configure.ac): Likewise.
+ * modules/j1 (configure.ac): Likewise.
+ * modules/jn (configure.ac): Likewise.
+ * modules/ldexp (configure.ac): Likewise.
+ * modules/lgamma (configure.ac): Likewise.
+ * modules/log (configure.ac): Likewise.
+ * modules/log10 (configure.ac): Likewise.
+ * modules/log1p (configure.ac): Likewise.
+ * modules/logb (configure.ac): Likewise.
+ * modules/modf (configure.ac): Likewise.
+ * modules/nextafter (configure.ac): Likewise.
+ * modules/pow (configure.ac): Likewise.
+ * modules/remainder (configure.ac): Likewise.
+ * modules/rint (configure.ac): Likewise.
+ * modules/sin (configure.ac): Likewise.
+ * modules/sinh (configure.ac): Likewise.
+ * modules/tan (configure.ac): Likewise.
+ * modules/tanh (configure.ac): Likewise.
+ * modules/y0 (configure.ac): Likewise.
+ * modules/y1 (configure.ac): Likewise.
+ * modules/yn (configure.ac): Likewise.
+
+2010-01-24 Bruno Haible <bruno@clisp.org>
+
+ Tests: Defeat inlining of math functions by GCC >= 4.3.0.
+ * tests/test-acosl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+ * tests/test-asinl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+ * tests/test-atanl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+ * tests/test-cosl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+ * tests/test-expl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+ * tests/test-logl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+ * tests/test-sinl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+ * tests/test-sqrtl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+ * tests/test-tanl.c (x): New variable.
+ (main): Store argument in x and fetch it from x.
+
+2010-01-24 Bruno Haible <bruno@clisp.org>
+
+ Provide EXEEXT and srcdir in TESTS_ENVIRONMENT by default.
+ * gnulib-tool (func_emit_tests_Makefile_am): Add EXEEXT and srcdir
+ assignments to the initial TESTS_ENVIRONMENT.
+ * doc/gnulib.texi (Unit test modules): Document it.
+ * modules/acl-tests (Makefile.am): Drop EXEEXT assignment from
+ TESTS_ENVIRONMENT.
+ * modules/btowc-tests (Makefile.am): Likewise.
+ * modules/c-stack-tests (Makefile.am): Likewise.
+ * modules/c-strcase-tests (Makefile.am): Likewise.
+ * modules/copy-file-tests (Makefile.am): Likewise.
+ * modules/mbmemcasecmp-tests (Makefile.am): Likewise.
+ * modules/mbmemcasecoll-tests (Makefile.am): Likewise.
+ * modules/mbrtowc-tests (Makefile.am): Likewise.
+ * modules/mbscasecmp-tests (Makefile.am): Likewise.
+ * modules/mbscasestr-tests (Makefile.am): Likewise.
+ * modules/mbschr-tests (Makefile.am): Likewise.
+ * modules/mbscspn-tests (Makefile.am): Likewise.
+ * modules/mbsinit-tests (Makefile.am): Likewise.
+ * modules/mbsncasecmp-tests (Makefile.am): Likewise.
+ * modules/mbsnrtowcs-tests (Makefile.am): Likewise.
+ * modules/mbspbrk-tests (Makefile.am): Likewise.
+ * modules/mbspcasecmp-tests (Makefile.am): Likewise.
+ * modules/mbsrchr-tests (Makefile.am): Likewise.
+ * modules/mbsrtowcs-tests (Makefile.am): Likewise.
+ * modules/mbsspn-tests (Makefile.am): Likewise.
+ * modules/mbsstr-tests (Makefile.am): Likewise.
+ * modules/nl_langinfo-tests (Makefile.am): Likewise.
+ * modules/unicase/locale-language-tests (Makefile.am): Likewise.
+ * modules/unistdio/u16-vasnprintf-tests (Makefile.am): Likewise.
+ * modules/unistdio/u32-vasnprintf-tests (Makefile.am): Likewise.
+ * modules/unistdio/u8-vasnprintf-tests (Makefile.am): Likewise.
+ * modules/unistdio/ulc-vasnprintf-tests (Makefile.am): Likewise.
+ * modules/uniwbrk/ulc-wordbreaks-tests (Makefile.am): Likewise.
+ * modules/vasnprintf-posix-tests (Makefile.am): Likewise.
+ * modules/wcrtomb-tests (Makefile.am): Likewise.
+ * modules/wcsnrtombs-tests (Makefile.am): Likewise.
+ * modules/wcsrtombs-tests (Makefile.am): Likewise.
+ * modules/quotearg-tests (Makefile.am): Drop EXEEXT and srcdir
+ assignments from TESTS_ENVIRONMENT.
+ * modules/argp-tests (Makefile.am): Drop TESTS_ENVIRONMENT
+ augmentation.
+ * modules/argp-version-etc-tests (Makefile.am): Likewise.
+ * modules/atexit-tests (Makefile.am): Likewise.
+ * modules/binary-io-tests (Makefile.am): Likewise.
+ * modules/closein-tests (Makefile.am): Likewise.
+ * modules/dprintf-posix-tests (Makefile.am): Likewise.
+ * modules/exclude-tests (Makefile.am): Likewise.
+ * modules/fflush-tests (Makefile.am): Likewise.
+ * modules/fpending-tests (Makefile.am): Likewise.
+ * modules/fprintf-posix-tests (Makefile.am): Likewise.
+ * modules/freadahead-tests (Makefile.am): Likewise.
+ * modules/freadptr-tests (Makefile.am): Likewise.
+ * modules/freadseek-tests (Makefile.am): Likewise.
+ * modules/fseek-tests (Makefile.am): Likewise.
+ * modules/fseeko-tests (Makefile.am): Likewise.
+ * modules/ftell-tests (Makefile.am): Likewise.
+ * modules/ftello-tests (Makefile.am): Likewise.
+ * modules/idpriv-drop-tests (Makefile.am): Likewise.
+ * modules/idpriv-droptemp-tests (Makefile.am): Likewise.
+ * modules/lseek-tests (Makefile.am): Likewise.
+ * modules/parse-duration-tests (Makefile.am): Likewise.
+ * modules/perror-tests (Makefile.am): Likewise.
+ * modules/pipe-filter-gi-tests (Makefile.am): Likewise.
+ * modules/pipe-filter-ii-tests (Makefile.am): Likewise.
+ * modules/pipe-tests (Makefile.am): Likewise.
+ * modules/pread-tests (Makefile.am): Likewise.
+ * modules/printf-posix-tests (Makefile.am): Likewise.
+ * modules/select-tests (Makefile.am): Likewise.
+ * modules/sigpipe-tests (Makefile.am): Likewise.
+ * modules/tsearch-tests (Makefile.am): Likewise.
+ * modules/unicase/ulc-casecmp-tests (Makefile.am): Likewise.
+ * modules/unicase/ulc-casecoll-tests (Makefile.am): Likewise.
+ * modules/uniname/uniname-tests (Makefile.am): Likewise.
+ * modules/uniwidth/width-tests (Makefile.am): Likewise.
+ * modules/vdprintf-posix-tests (Makefile.am): Likewise.
+ * modules/version-etc-tests (Makefile.am): Likewise.
+ * modules/vfprintf-posix-tests (Makefile.am): Likewise.
+ * modules/vprintf-posix-tests (Makefile.am): Likewise.
+ * modules/xalloc-die-tests (Makefile.am): Likewise.
+ * modules/xprintf-posix-tests (Makefile.am): Likewise.
+ * modules/xstrtoimax-tests (Makefile.am): Likewise.
+ * modules/xstrtol-tests (Makefile.am): Likewise.
+ * modules/xstrtoumax-tests (Makefile.am): Likewise.
+ * modules/yesno-tests (Makefile.am): Likewise.
+ Suggested by Jim Meyering.
+
+2010-01-24 Bruno Haible <bruno@clisp.org>
+
+ More documentation.
+ * doc/gnulib.texi (Writing modules): New chapter.
+ (Miscellaneous Notes): Move sections "Comments" and "Header files" to
+ the new chapter.
+
+2010-01-24 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: do not prepend "./" after filtering
+ * top/maint.mk (_prepend_srcdir_prefix): New variable
+ (VC_LIST_EXCEPT): Use it to avoid prepending (post-filter)
+ "./" when $(srcdir) is ".".
+
+ define STREQ(a,b) consistently, removing useless parentheses
+ #define STREQ(a, b) (strcmp ((a), (b)) == 0) is over-parenthesized,
+ since the only risk is that "a" or "b" contains an unparenthesized
+ comma, but if either did that, STREQ would have 3 or more arguments.
+ Hence, #define STREQ(a, b) (strcmp (a, b) == 0) is better.
+ * lib/fts.c (STREQ): Remove unnecessary parentheses.
+ * lib/hash-triple.c (STREQ): Likewise.
+ * tests/test-argv-iter.c (STREQ): Use a and b, not s1 and s2.
+ * lib/getugroups.c (STREQ): Likewise.
+
+2010-01-23 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: fix syntax-check in a non-srcdir build directory
+ * top/maint.mk (_dot_escaped_srcdir): Remove erroneous backslash,
+ introduced in my 2010-01-21 commit, a6da6c45. Reported by Eric Blake.
+
+2010-01-22 Jim Meyering <meyering@redhat.com>
+
+ userspec: add unit tests
+ * tests/test-userspec.c: New file.
+ * modules/userspec-tests: Likewise.
+
+2010-01-21 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: handle source file names containing "." robustly
+ * top/maint.mk (_dot_escaped_srcdir): Define.
+ (VC_LIST): Use it in LHS of sed substitution.
+
+2010-01-21 Jiri Denemark <jdenemar@redhat.com>
+
+ maint.mk: fix VC_LIST_EXCEPT for srcdir != builddir
+ * top/maint.mk (VC_LIST_EXCEPT): Preprocess the output of
+ $(VC_LIST) to remove a prefix of '$(srcdir)/', so that it works
+ from a non-srcdir build.
+
+2010-01-20 Eric Blake <ebb9@byu.net>
+
+ warn-on-use: use instead of link-warning
+ * modules/stdio (Depends-on, Makefile.am): Drop link-warning.
+ * modules/unistd (Depends-on, Makefile.am): Likewise.
+ * modules/arpa_inet (Depends-on): Replace link-warning with
+ warn-on-use.
+ (Makefile.am): Update rules accordingly.
+ * modules/ctype (Depends-on, Makefile.am): Likewise.
+ * modules/dirent (Depends-on, Makefile.am): Likewise.
+ * modules/fcntl-h (Depends-on, Makefile.am): Likewise.
+ * modules/inttypes (Depends-on, Makefile.am): Likewise.
+ * modules/langinfo (Depends-on, Makefile.am): Likewise.
+ * modules/locale (Depends-on, Makefile.am): Likewise.
+ * modules/math (Depends-on, Makefile.am): Likewise.
+ * modules/search (Depends-on, Makefile.am): Likewise.
+ * modules/signal (Depends-on, Makefile.am): Likewise.
+ * modules/spawn (Depends-on, Makefile.am): Likewise.
+ * modules/stdlib (Depends-on, Makefile.am): Likewise.
+ * modules/string (Depends-on, Makefile.am): Likewise.
+ * modules/strings (Depends-on, Makefile.am): Likewise.
+ * modules/sys_file (Depends-on, Makefile.am): Likewise.
+ * modules/sys_ioctl (Depends-on, Makefile.am): Likewise.
+ * modules/sys_select (Depends-on, Makefile.am): Likewise.
+ * modules/sys_socket (Depends-on, Makefile.am): Likewise.
+ * modules/sys_stat (Depends-on, Makefile.am): Likewise.
+ * modules/sys_times (Depends-on, Makefile.am): Likewise.
+ * modules/sys_utsname (Depends-on, Makefile.am): Likewise.
+ * modules/wchar (Depends-on, Makefile.am): Likewise.
+ * m4/arpa_inet_h.m4 (gl_HEADER_ARPA_INET): Check which functions
+ should be poisoned.
+ * m4/ctype.m4 (gl_CTYPE_H): Likewise.
+ * m4/dirent_h.m4 (gl_DIRENT_H): Likewise.
+ * m4/fcntl_h.m4 (gl_FCNTL_H): Likewise.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Likewise.
+ * m4/langinfo_h.m4 (gl_LANGINFO_H): Likewise.
+ * m4/locale_h.m4 (gl_LOCALE_H): Likewise.
+ * m4/math_h.m4 (gl_MATH_H): Likewise.
+ * m4/search_h.m4 (gl_SEARCH_H): Likewise.
+ * m4/signal_h.m4 (gl_SIGNAL_H): Likewise.
+ * m4/spawn_h.m4 (gl_SPAWN_H): Likewise.
+ * m4/stdio_h.m4 (gl_STDIO_H): Likewise.
+ * m4/stdlib_h.m4 (gl_STDLIB_H): Likewise.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_BODY): Likewise.
+ * m4/strings_h.m4 (gl_HEADER_STRINGS_H_BODY): Likewise.
+ * m4/sys_file_h.m4 (gl_HEADER_SYS_FILE_H_DEFAULTS): Likewise.
+ * m4/sys_ioctl_h.m4 (gl_SYS_IOCTL_H): Likewise.
+ * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Likewise.
+ * m4/sys_socket_h.m4 (gl_HEADER_SYS_SOCKET): Likewise.
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Likewise.
+ * m4/sys_times_h.m4 (gl_SYS_TIMES_H): Likewise.
+ * m4/sys_utsname_h.m4 (gl_SYS_UTSNAME_H): Likewise.
+ * m4/unistd_h.m4 (gl_UNISTD_H): Likewise.
+ * m4/wchar.m4 (gl_WCHAR_H): Likewise.
+ * lib/arpa_inet.in.h: Use _GL_WARN_ON_USE instead of
+ GL_LINK_WARNING.
+ * lib/ctype.in.h: Likewise.
+ * lib/dirent.in.h: Likewise.
+ * lib/fcntl.in.h: Likewise.
+ * lib/inttypes.in.h: Likewise.
+ * lib/langinfo.in.h: Likewise.
+ * lib/locale.in.h: Likewise.
+ * lib/math.in.h: Likewise.
+ * lib/search.in.h: Likewise.
+ * lib/signal.in.h: Likewise.
+ * lib/spawn.in.h: Likewise.
+ * lib/stdio.in.h: Likewise.
+ * lib/stdlib.in.h: Likewise.
+ * lib/string.in.h: Likewise.
+ * lib/strings.in.h: Likewise.
+ * lib/sys_file.in.h: Likewise.
+ * lib/sys_ioctl.in.h: Likewise.
+ * lib/sys_select.in.h: Likewise.
+ * lib/sys_socket.in.h: Likewise.
+ * lib/sys_stat.in.h: Likewise.
+ * lib/sys_times.in.h: Likewise.
+ * lib/sys_utsname.in.h: Likewise.
+ * lib/unistd.in.h: Likewise.
+ * lib/wchar.in.h: Likewise.
+
+2010-01-20 Bruno Haible <bruno@clisp.org>
+
+ Avoid duplicate -lm.
+ * m4/isnan.m4 (gl_ISNAN): Avoid duplicate -lm in $ISNAN_LIBM.
+ * m4/round.m4 (gl_FUNC_ROUND): Avoid duplicate -lm in $ROUND_LIBM.
+ * m4/roundf.m4 (gl_FUNC_ROUNDF): Avoid duplicate -lm in $ROUNDF_LIBM.
+ * m4/roundl.m4 (gl_FUNC_ROUNDL): Avoid duplicate -lm in $ROUNDL_LIBM.
+ * m4/acosl.m4 (gl_FUNC_ACOSL): Avoid duplicate -lm in $ACOSL_LIBM.
+ * m4/cosl.m4 (gl_FUNC_COSL): Avoid duplicate -lm in $COSL_LIBM.
+ * m4/logl.m4 (gl_FUNC_LOGL): Avoid duplicate -lm in $LOGL_LIBM.
+ * m4/sinl.m4 (gl_FUNC_SINL): Avoid duplicate -lm in $SINL_LIBM.
+ * m4/sqrtl.m4 (gl_FUNC_SQRTL): Avoid duplicate -lm in $SQRTL_LIBM.
+ * m4/tanl.m4 (gl_FUNC_TANL): Avoid duplicate -lm in $TANL_LIBM.
+ * m4/asinl.m4 (gl_FUNC_ASINL): Same change, for consistency.
+ * m4/atanl.m4 (gl_FUNC_ATANL): Likewise.
+ Reported by Paolo Bonzini.
+
+2010-01-19 Bruno Haible <bruno@clisp.org>
+
+ langinfo, nl_langinfo: Relicense under LGPLv2+.
+ * modules/langinfo (License): Change to LGPLv2+.
+ * modules/nl_langinfo (License): Likewise.
+ Patch by David Lutterkort <lutter@redhat.com>.
+
+2010-01-19 Bruno Haible <bruno@clisp.org>
+
+ Avoid compilation error with cc on OSF/1 5.1.
+ * lib/fcntl.in.h: Include <unistd.h> after the #include_next <fcntl.h>
+ statement, not before.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2010-01-18 Bruno Haible <bruno@clisp.org>
+
+ Avoid a link error due to the __printf__ symbol.
+ * lib/stdio.in.h (__attribute__): Define to empty also for gcc 2.5.x
+ and 2.6.x.
+ (__format__, __printf__): Remove definitions.
+ * lib/argp-fmtstream.h: Likewise.
+ * lib/argp.h: Likewise.
+ * lib/error.h: Likewise.
+ * lib/vasnprintf.h: Likewise.
+ * lib/xprintf.h: Likewise.
+ * lib/xvasprintf.h: Likewise.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2010-01-18 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'tanl'.
+ * modules/tanl-tests: New file.
+ * tests/test-tanl.c: New file.
+
+ Tests for module 'sqrtl'.
+ * modules/sqrtl-tests: New file.
+ * tests/test-sqrtl.c: New file.
+
+ Tests for module 'sinl'.
+ * modules/sinl-tests: New file.
+ * tests/test-sinl.c: New file.
+
+ Tests for module 'logl'.
+ * modules/logl-tests: New file.
+ * tests/test-logl.c: New file.
+
+ Tests for module 'expl'.
+ * modules/expl-tests: New file.
+ * tests/test-expl.c: New file.
+
+ Tests for module 'cosl'.
+ * modules/cosl-tests: New file.
+ * tests/test-cosl.c: New file.
+
+ Tests for module 'atanl'.
+ * modules/atanl-tests: New file.
+ * tests/test-atanl.c: New file.
+
+ Tests for module 'asinl'.
+ * modules/asinl-tests: New file.
+ * tests/test-asinl.c: New file.
+
+ Tests for module 'acosl'.
+ * modules/acosl-tests: New file.
+ * tests/test-acosl.c: New file.
+
+ New modules acosl, asinl, atanl, cosl, expl, logl, sinl, sqrtl, tanl.
+ * lib/math.in.h (acosl, asinl, atanl, cosl, expl, logl, sinl, sqrtl,
+ tanl): Use the standard gnulib idiom.
+ * lib/cosl.c: Don't include trigl.c and sincosl.c.
+ * lib/sinl.c: Likewise.
+ * lib/tanl.c: Don't include trigl.c.
+ (kernel_tanl): Make static.
+ * lib/sincosl.c: Include trigl.h first.
+ * lib/trigl.c: Likewise.
+ * m4/acosl.m4: New file.
+ * m4/asinl.m4: New file.
+ * m4/atanl.m4: New file.
+ * m4/cosl.m4: New file.
+ * m4/expl.m4: New file.
+ * m4/logl.m4: New file.
+ * m4/sinl.m4: New file.
+ * m4/sqrtl.m4: New file.
+ * m4/tanl.m4: New file.
+ * m4/mathl.m4: Remove file.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_* and HAVE_*
+ variables for acosl, asinl, atanl, cosl, expl, logl, sinl, sqrtl, tanl.
+ Don't initialize GNULIB_MATHL.
+ * modules/acosl: New file.
+ * modules/asinl: New file.
+ * modules/atanl: New file.
+ * modules/cosl: New file.
+ * modules/expl: New file.
+ * modules/logl: New file.
+ * modules/sinl: New file.
+ * modules/sqrtl: New file.
+ * modules/tanl: New file.
+ * modules/math (Makefile.am): Substitute GNULIB_* and HAVE_* variables
+ for acosl, asinl, atanl, cosl, expl, logl, sinl, sqrtl, tanl. Don't
+ substitute GNULIB_MATHL.
+ * modules/mathl: Rewritten.
+ * doc/posix-functions/acosl.texi: Mention the 'acosl' module.
+ * doc/posix-functions/asinl.texi: Mention the 'asinl' module.
+ * doc/posix-functions/atanl.texi: Mention the 'atanl' module.
+ * doc/posix-functions/cosl.texi: Mention the 'cosl' module.
+ * doc/posix-functions/expl.texi: Mention the 'expl' module.
+ * doc/posix-functions/logl.texi: Mention the 'logl' module.
+ * doc/posix-functions/sinl.texi: Mention the 'sinl' module.
+ * doc/posix-functions/sqrtl.texi: Mention the 'sqrtl' module.
+ * doc/posix-functions/tanl.texi: Mention the 'tanl' module.
+
+2010-01-18 Bruno Haible <bruno@clisp.org>
+
+ sqrt: Make gl_FUNC_SQRT requirable.
+ * m4/sqrt.m4: New file.
+ * modules/sqrt (Files): Add it.
+ (configure.ac): Invoke gl_FUNC_SQRT.
+
+2010-01-18 Bruno Haible <bruno@clisp.org>
+
+ New modules for common <math.h> functions.
+ * m4/mathfunc.m4: New file.
+ * modules/acos: New file.
+ * modules/asin: New file.
+ * modules/atan: New file.
+ * modules/atan2: New file.
+ * modules/cbrt: New file.
+ * modules/copysign: New file.
+ * modules/cos: New file.
+ * modules/cosh: New file.
+ * modules/erf: New file.
+ * modules/erfc: New file.
+ * modules/exp: New file.
+ * modules/fabs: New file.
+ * modules/fmod: New file.
+ * modules/hypot: New file.
+ * modules/j0: New file.
+ * modules/j1: New file.
+ * modules/jn: New file.
+ * modules/ldexp: New file.
+ * modules/lgamma: New file.
+ * modules/log: New file.
+ * modules/log10: New file.
+ * modules/log1p: New file.
+ * modules/logb: New file.
+ * modules/modf: New file.
+ * modules/nextafter: New file.
+ * modules/pow: New file.
+ * modules/remainder: New file.
+ * modules/rint: New file.
+ * modules/sin: New file.
+ * modules/sinh: New file.
+ * modules/sqrt: New file.
+ * modules/tan: New file.
+ * modules/tanh: New file.
+ * modules/y0: New file.
+ * modules/y1: New file.
+ * modules/yn: New file.
+ * doc/posix-functions/acos.texi: Mention the 'acos' module.
+ * doc/posix-functions/asin.texi: Mention the 'asin' module.
+ * doc/posix-functions/atan.texi: Mention the 'atan' module.
+ * doc/posix-functions/atan2.texi: Mention the 'atan2' module.
+ * doc/posix-functions/cbrt.texi: Mention the 'cbrt' module.
+ * doc/posix-functions/copysign.texi: Mention the 'copysign' module.
+ * doc/posix-functions/cos.texi: Mention the 'cos' module.
+ * doc/posix-functions/cosh.texi: Mention the 'cosh' module.
+ * doc/posix-functions/erf.texi: Mention the 'erf' module.
+ * doc/posix-functions/erfc.texi: Mention the 'erfc' module.
+ * doc/posix-functions/exp.texi: Mention the 'exp' module.
+ * doc/posix-functions/fabs.texi: Mention the 'fabs' module.
+ * doc/posix-functions/fmod.texi: Mention the 'fmod' module.
+ * doc/posix-functions/hypot.texi: Mention the 'hypot' module.
+ * doc/posix-functions/j0.texi: Mention the 'j0' module.
+ * doc/posix-functions/j1.texi: Mention the 'j1' module.
+ * doc/posix-functions/jn.texi: Mention the 'jn' module.
+ * doc/posix-functions/ldexp.texi: Mention the 'ldexp' module.
+ * doc/posix-functions/lgamma.texi: Mention the 'lgamma' module.
+ * doc/posix-functions/log.texi: Mention the 'log' module.
+ * doc/posix-functions/log10.texi: Mention the 'log10' module.
+ * doc/posix-functions/log1p.texi: Mention the 'log1p' module.
+ * doc/posix-functions/logb.texi: Mention the 'logb' module.
+ * doc/posix-functions/modf.texi: Mention the 'modf' module.
+ * doc/posix-functions/nextafter.texi: Mention the 'nextafter' module.
+ * doc/posix-functions/pow.texi: Mention the 'pow' module.
+ * doc/posix-functions/remainder.texi: Mention the 'remainder' module.
+ * doc/posix-functions/rint.texi: Mention the 'rint' module.
+ * doc/posix-functions/sin.texi: Mention the 'sin' module.
+ * doc/posix-functions/sinh.texi: Mention the 'sinh' module.
+ * doc/posix-functions/sqrt.texi: Mention the 'sqrt' module.
+ * doc/posix-functions/tan.texi: Mention the 'tan' module.
+ * doc/posix-functions/tanh.texi: Mention the 'tanh' module.
+ * doc/posix-functions/y0.texi: Mention the 'y0' module.
+ * doc/posix-functions/y1.texi: Mention the 'y1' module.
+ * doc/posix-functions/yn.texi: Mention the 'yn' module.
+
+2010-01-18 Jim Meyering <meyering@redhat.com>
+
+ ignore-value: relax license to LGPLv2+
+ * modules/ignore-value (License): Relax to LGPLv2+.
+
+ getdate: don't leak when TZ contains two or more '"'s
+ * lib/getdate.y (get_date): Don't leak a copy of TZ for each
+ double quote in TZ after the first one.
+
+ readtokens: do not leak internal token_lengths buffer
+ * lib/readtokens.c (readtokens): Free the local, lengths,
+ when the supplied "token_lengths" parameter is NULL.
+
+2010-01-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Fix a couple of missing LIBTHREAD link failures on AIX.
+ * modules/git-merge-changelog (git_merge_changelog_LDADD): Add
+ $(LIBTHREAD).
+ * modules/strsignal-tests (test_strsignal_LDADD): Likewise.
+
+ Link test-poll against INET_PTON_LIB.
+ * modules/poll-tests (test_poll_LDADD): Add $(INET_PTON_LIB),
+ for inet_pton on Solaris 10.
+
+2010-01-17 Bruno Haible <bruno@clisp.org>
+
+ unistdio/*-sprintf: Fix typo in module description.
+ * modules/unistdio/u8-sprintf (Depends-on): Fix typo.
+ * modules/unistdio/u8-u8-sprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-sprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-sprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-sprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-sprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-sprintf (Depends-on): Likewise.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2010-01-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ gnulib-tool: fix filelist for AIX, HP-UX ksh.
+ * gnulib-tool (func_filter_filelist): Do not quote possibly-empty
+ variables in shell case patterns, for AIX and HP-UX ksh.
+
+ Split large sed scripts, for HP-UX sed.
+ * modules/stdio: Split sed scripts around 50 sed commands,
+ to avoid HP-UX limit of 99 commands, in the near future.
+ * modules/string: Likewise.
+ * modules/unistd: Likewise.
+
+ gnulib-tool: avoid writing in the current directory.
+ * gnulib-tool (func_emit_lib_Makefile_am)
+ (func_emit_tests_Makefile_am): Put temporary files in $tmp,
+ not in the current directory, so concurrent gnulib-tool
+ instances do not interfere.
+
+2010-01-16 Jim Meyering <meyering@redhat.com>
+
+ doc: update users.txt
+ * users.txt: Add grep.
+ (diffutils, gzip): Update URLs.
+
+2010-01-12 Bruno Haible <bruno@clisp.org>
+
+ posix_spawn: Avoid test failure on Cygwin.
+ * tests/test-posix_spawn3.c (DATA_FILENAME) [CYGWIN]: Use less risky
+ characters.
+ Reported by Simon Josefsson.
+
+2010-01-12 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-cond.c (main): When skipping the test, show the reason.
+
+2010-01-12 Simon Josefsson <simon@josefsson.org>
+
+ * lib/striconv.c (str_cd_iconv): Avoid if before free.
+
+2010-01-12 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk (VC_LIST_EXCEPT): Filter list through
+ VC_LIST_ALWAYS_EXCLUDE_REGEX.
+
+2010-01-12 Eric Blake <ebb9@byu.net>
+
+ build: guarantee AS_VAR_IF
+ * m4/warnings.m4 (gl_WARN_ADD): Use autoconf name.
+ (gl_AS_VAR_IF): Move...
+ * m4/gnulib-common.m4 (AS_VAR_IF): ...here.
+ Reported by Simon Josefsson.
+
+2010-01-12 Simon Josefsson <simon@josefsson.org>
+
+ * lib/stdio.in.h: Fix typo.
+
+2010-01-12 Simon Josefsson <simon@josefsson.org>
+
+ * m4/gc.m4: Check if linking to libgcrypt also needs linking to
+ libgpg-error.
+
+2010-01-12 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-xalloc-die.sh: Use $EXEEXT.
+
+2010-01-12 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ getlogin, getlogin_r: Avoid test failure.
+ * tests/test-getlogin.c: Include <stdio.h>.
+ (main): Skip the test when the function fails because stdin is not a
+ tty.
+ * tests/test-getlogin_r.c: Include <stdio.h>.
+ (main): Skip the test when the function fails because stdin is not a
+ tty.
+
+2010-01-11 Eric Blake <ebb9@byu.net>
+
+ tests: avoid more large file warnings
+ * tests/test-fflush.c: Avoid warning about ftell use.
+ * tests/test-fseek.c: Avoid warning about fseek use.
+
+2010-01-10 Bruno Haible <bruno@clisp.org>
+
+ nproc: Work better on Linux when /proc and /sys are not mounted.
+ * lib/nproc.c (num_processors): Use num_processors_via_affinity_mask ()
+ as lower bound when, on glibc/Linux systems,
+ sysconf (_SC_NPROCESSORS_CONF) returns 1.
+ Suggested by Pádraig Brady <P@draigbrady.com>.
+ Reported by Dmitry V. Levin <ldv@altlinux.org>.
+
+ nproc: Refactor.
+ * lib/nproc.c (num_processors_via_affinity_mask): New function,
+ extracted from num_processors.
+ (num_processors): Call it.
+
+2010-01-11 Jim Meyering <meyering@redhat.com>
+
+ utimecmp: avoid new warning from upcoming gcc-4.5.0
+ * lib/utimecmp.c (BILLION): Define using #define rather than an
+ anonymous enum, to placate upcoming gcc-4.5.0's -Wenum-compare.
+
+2010-01-11 Eric Blake <ebb9@byu.net>
+
+ math: add portability warnings for classification macros
+ * modules/math (Depends-on): Add warn-on-use.
+ (Makefile.am): Provide new substitutions.
+ * m4/math_h.m4 (gl_MATH_H): Require inline.
+ * lib/math.in.h (_GL_WARN_REAL_FLOATING_DECL)
+ (_GL_WARN_REAL_FLOATING_IMPL): New helper macros.
+ (isfinite, isinf, isnan, signbit) [GNULIB_POSIXCHECK]: Use them to
+ implement warnings.
+
+ unistd: warn on use of environ without module
+ * modules/unistd (Depends-on): Add warn-on-use.
+ (Makefile.am): Provide new substitutions.
+ * m4/unistd_h.m4 (gl_UNISTD_H): Check for inline and environ.
+ * lib/unistd.in.h (environ): Wrap with a warning helper function.
+
+ stdio: warn on suspicious uses
+ * modules/stdio (Depends-on): Add warn-on-use.
+ (Makefile.am): Provide new substitutions.
+ * m4/stdio_h.m4 (gl_STDIO_H): Check for inline, ftello, and
+ fseeko.
+ * lib/stdio.in.h (gets): Always warn on use.
+ (fseek, ftell): Adjust when warnings are issued, and honor
+ _GL_NO_LARGE_FILES as a way to silence the warning.
+ * tests/test-fpurge.c [!GNULIB_FSEEK]: Use new means to squelch
+ any warning about large file offsets.
+ * tests/test-freadable.c [!GNULIB_FSEEK]: Likewise.
+ * tests/test-freading.c [!GNULIB_FSEEK]: Likewise.
+ * tests/test-fseeko.c [!GNULIB_FSEEK]: Likewise.
+ * tests/test-ftell.c [!GNULIB_FSEEK]: Likewise.
+ * tests/test-ftello.c [!GNULIB_FSEEK]: Likewise.
+ * tests/test-fwritable.c [!GNULIB_FSEEK]: Likewise.
+ * tests/test-fwriting.c [!GNULIB_FSEEK]: Likewise.
+ * tests/test-getopt.c [!GNULIB_FTELL]: Likewise.
+
+ warn-on-use: new module
+ * modules/warn-on-use: New file.
+ * build-aux/warn-on-use.h: Likewise.
+ * m4/warn-on-use.m4: Likewise.
+ * MODULES.html.sh (Support for building): Mention it.
+
+2010-01-10 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'unistr/u32-strdup'.
+ * modules/unistr/u32-strdup-tests: New file.
+ * tests/unistr/test-u32-strdup.c: New file.
+
+ Tests for module 'unistr/u16-strdup'.
+ * modules/unistr/u16-strdup-tests: New file.
+ * tests/unistr/test-u16-strdup.c: New file.
+
+ Tests for module 'unistr/u8-strdup'.
+ * modules/unistr/u8-strdup-tests: New file.
+ * tests/unistr/test-u8-strdup.c: New file.
+ * tests/unistr/test-strdup.h: New file.
+
+ Tests for module 'unistr/u32-strncmp'.
+ * modules/unistr/u32-strncmp-tests: New file.
+ * tests/unistr/test-u32-strncmp.c: New file.
+
+ Tests for module 'unistr/u16-strncmp'.
+ * modules/unistr/u16-strncmp-tests: New file.
+ * tests/unistr/test-u16-strncmp.c: New file.
+
+ Tests for module 'unistr/u8-strncmp'.
+ * modules/unistr/u8-strncmp-tests: New file.
+ * tests/unistr/test-u8-strncmp.c: New file.
+ * tests/unistr/test-strncmp.h: New file.
+
+ Tests for module 'unistr/u32-strcoll'.
+ * modules/unistr/u32-strcoll-tests: New file.
+ * tests/unistr/test-u32-strcoll.c: New file.
+
+ Tests for module 'unistr/u16-strcoll'.
+ * modules/unistr/u16-strcoll-tests: New file.
+ * tests/unistr/test-u16-strcoll.c: New file.
+
+ Tests for module 'unistr/u8-strcoll'.
+ * modules/unistr/u8-strcoll-tests: New file.
+ * tests/unistr/test-u8-strcoll.c: New file.
+
+ Tests for module 'unistr/u32-strcmp'.
+ * modules/unistr/u32-strcmp-tests: New file.
+ * tests/unistr/test-u32-strcmp.c: New file.
+ * tests/unistr/test-u32-strcmp.h: New file.
+
+ Tests for module 'unistr/u16-strcmp'.
+ * modules/unistr/u16-strcmp-tests: New file.
+ * tests/unistr/test-u16-strcmp.c: New file.
+ * tests/unistr/test-u16-strcmp.h: New file.
+
+ Tests for module 'unistr/u8-strcmp'.
+ * modules/unistr/u8-strcmp-tests: New file.
+ * tests/unistr/test-u8-strcmp.c: New file.
+ * tests/unistr/test-u8-strcmp.h: New file.
+ * tests/unistr/test-strcmp.h: New file.
+
+ Tests for module 'unistr/u32-strncat'.
+ * modules/unistr/u32-strncat-tests: New file.
+ * tests/unistr/test-u32-strncat.c: New file.
+
+ Tests for module 'unistr/u16-strncat'.
+ * modules/unistr/u16-strncat-tests: New file.
+ * tests/unistr/test-u16-strncat.c: New file.
+
+ Tests for module 'unistr/u8-strncat'.
+ * modules/unistr/u8-strncat-tests: New file.
+ * tests/unistr/test-u8-strncat.c: New file.
+ * tests/unistr/test-strncat.h: New file.
+
+ Tests for module 'unistr/u32-strcat'.
+ * modules/unistr/u32-strcat-tests: New file.
+ * tests/unistr/test-u32-strcat.c: New file.
+
+ Tests for module 'unistr/u16-strcat'.
+ * modules/unistr/u16-strcat-tests: New file.
+ * tests/unistr/test-u16-strcat.c: New file.
+
+ Tests for module 'unistr/u8-strcat'.
+ * modules/unistr/u8-strcat-tests: New file.
+ * tests/unistr/test-u8-strcat.c: New file.
+ * tests/unistr/test-strcat.h: New file.
+
+ Tests for module 'unistr/u32-stpncpy'.
+ * modules/unistr/u32-stpncpy-tests: New file.
+ * tests/unistr/test-u32-stpncpy.c: New file.
+
+ Tests for module 'unistr/u16-stpncpy'.
+ * modules/unistr/u16-stpncpy-tests: New file.
+ * tests/unistr/test-u16-stpncpy.c: New file.
+
+ Tests for module 'unistr/u8-stpncpy'.
+ * modules/unistr/u8-stpncpy-tests: New file.
+ * tests/unistr/test-u8-stpncpy.c: New file.
+ * tests/unistr/test-stpncpy.h: New file.
+
+ Tests for module 'unistr/u32-strncpy'.
+ * modules/unistr/u32-strncpy-tests: New file.
+ * tests/unistr/test-u32-strncpy.c: New file.
+
+ Tests for module 'unistr/u16-strncpy'.
+ * modules/unistr/u16-strncpy-tests: New file.
+ * tests/unistr/test-u16-strncpy.c: New file.
+
+ Tests for module 'unistr/u8-strncpy'.
+ * modules/unistr/u8-strncpy-tests: New file.
+ * tests/unistr/test-u8-strncpy.c: New file.
+ * tests/unistr/test-strncpy.h: New file.
+
+ Tests for module 'unistr/u32-stpcpy'.
+ * modules/unistr/u32-stpcpy-tests: New file.
+ * tests/unistr/test-u32-stpcpy.c: New file.
+
+ Tests for module 'unistr/u16-stpcpy'.
+ * modules/unistr/u16-stpcpy-tests: New file.
+ * tests/unistr/test-u16-stpcpy.c: New file.
+
+ Tests for module 'unistr/u8-stpcpy'.
+ * modules/unistr/u8-stpcpy-tests: New file.
+ * tests/unistr/test-u8-stpcpy.c: New file.
+ * tests/unistr/test-stpcpy.h: New file.
+
+ Tests for module 'unistr/u32-strcpy'.
+ * modules/unistr/u32-strcpy-tests: New file.
+ * tests/unistr/test-u32-strcpy.c: New file.
+
+ Tests for module 'unistr/u16-strcpy'.
+ * modules/unistr/u16-strcpy-tests: New file.
+ * tests/unistr/test-u16-strcpy.c: New file.
+
+ Tests for module 'unistr/u8-strcpy'.
+ * modules/unistr/u8-strcpy-tests: New file.
+ * tests/unistr/test-u8-strcpy.c: New file.
+ * tests/unistr/test-strcpy.h: New file.
+
+ Tests for module 'unistr/u32-strnlen'.
+ * modules/unistr/u32-strnlen-tests: New file.
+ * tests/unistr/test-u32-strnlen.c: New file.
+
+ Tests for module 'unistr/u16-strnlen'.
+ * modules/unistr/u16-strnlen-tests: New file.
+ * tests/unistr/test-u16-strnlen.c: New file.
+
+ Tests for module 'unistr/u8-strnlen'.
+ * modules/unistr/u8-strnlen-tests: New file.
+ * tests/unistr/test-u8-strnlen.c: New file.
+ * tests/unistr/test-strnlen.h: New file.
+
+ Tests for module 'unistr/u32-strlen'.
+ * modules/unistr/u32-strlen-tests: New file.
+ * tests/unistr/test-u32-strlen.c: New file.
+
+ Tests for module 'unistr/u16-strlen'.
+ * modules/unistr/u16-strlen-tests: New file.
+ * tests/unistr/test-u16-strlen.c: New file.
+
+ Tests for module 'unistr/u8-strlen'.
+ * modules/unistr/u8-strlen-tests: New file.
+ * tests/unistr/test-u8-strlen.c: New file.
+
+ Tests for module 'unistr/u32-prev'.
+ * modules/unistr/u32-prev-tests: New file.
+ * tests/unistr/test-u32-prev.c: New file.
+
+ Tests for module 'unistr/u16-prev'.
+ * modules/unistr/u16-prev-tests: New file.
+ * tests/unistr/test-u16-prev.c: New file.
+
+ Tests for module 'unistr/u8-prev'.
+ * modules/unistr/u8-prev-tests: New file.
+ * tests/unistr/test-u8-prev.c: New file.
+
+ Tests for module 'unistr/u32-next'.
+ * modules/unistr/u32-next-tests: New file.
+ * tests/unistr/test-u32-next.c: New file.
+
+ Tests for module 'unistr/u16-next'.
+ * modules/unistr/u16-next-tests: New file.
+ * tests/unistr/test-u16-next.c: New file.
+
+ Tests for module 'unistr/u8-next'.
+ * modules/unistr/u8-next-tests: New file.
+ * tests/unistr/test-u8-next.c: New file.
+
+ Tests for module 'unistr/u32-strmbtouc'.
+ * modules/unistr/u32-strmbtouc-tests: New file.
+ * tests/unistr/test-u32-strmbtouc.c: New file.
+
+ Tests for module 'unistr/u16-strmbtouc'.
+ * modules/unistr/u16-strmbtouc-tests: New file.
+ * tests/unistr/test-u16-strmbtouc.c: New file.
+
+ Tests for module 'unistr/u8-strmbtouc'.
+ * modules/unistr/u8-strmbtouc-tests: New file.
+ * tests/unistr/test-u8-strmbtouc.c: New file.
+
+ Tests for module 'unistr/u32-strmblen'.
+ * modules/unistr/u32-strmblen-tests: New file.
+ * tests/unistr/test-u32-strmblen.c: New file.
+
+ Tests for module 'unistr/u16-strmblen'.
+ * modules/unistr/u16-strmblen-tests: New file.
+ * tests/unistr/test-u16-strmblen.c: New file.
+
+ Tests for module 'unistr/u8-strmblen'.
+ * modules/unistr/u8-strmblen-tests: New file.
+ * tests/unistr/test-u8-strmblen.c: New file.
+
+ Tests for module 'unistr/u32-cpy-alloc'.
+ * modules/unistr/u32-cpy-alloc-tests: New file.
+ * tests/unistr/test-u32-cpy-alloc.c: New file.
+
+ Tests for module 'unistr/u16-cpy-alloc'.
+ * modules/unistr/u16-cpy-alloc-tests: New file.
+ * tests/unistr/test-u16-cpy-alloc.c: New file.
+
+ Tests for module 'unistr/u8-cpy-alloc'.
+ * modules/unistr/u8-cpy-alloc-tests: New file.
+ * tests/unistr/test-u8-cpy-alloc.c: New file.
+ * tests/unistr/test-cpy-alloc.h: New file.
+
+ Tests for module 'unistr/u32-mbsnlen'.
+ * modules/unistr/u32-mbsnlen-tests: New file.
+ * tests/unistr/test-u32-mbsnlen.c: New file.
+
+ Tests for module 'unistr/u16-mbsnlen'.
+ * modules/unistr/u16-mbsnlen-tests: New file.
+ * tests/unistr/test-u16-mbsnlen.c: New file.
+
+ Tests for module 'unistr/u8-mbsnlen'.
+ * modules/unistr/u8-mbsnlen-tests: New file.
+ * tests/unistr/test-u8-mbsnlen.c: New file.
+
+ Tests for module 'unistr/u32-chr'.
+ * modules/unistr/u32-chr-tests: New file.
+ * tests/unistr/test-u32-chr.c: New file.
+
+ Tests for module 'unistr/u16-chr'.
+ * modules/unistr/u16-chr-tests: New file.
+ * tests/unistr/test-u16-chr.c: New file.
+
+ Tests for module 'unistr/u8-chr'.
+ * modules/unistr/u8-chr-tests: New file.
+ * tests/unistr/test-u8-chr.c: New file.
+ * tests/unistr/test-chr.h: New file, based on tests/test-memchr.c.
+
+ Tests for module 'unistr/u32-cmp2'.
+ * modules/unistr/u32-cmp2-tests: New file.
+ * tests/unistr/test-u32-cmp2.c: New file.
+
+ Tests for module 'unistr/u16-cmp2'.
+ * modules/unistr/u16-cmp2-tests: New file.
+ * tests/unistr/test-u16-cmp2.c: New file.
+
+ Tests for module 'unistr/u8-cmp2'.
+ * modules/unistr/u8-cmp2-tests: New file.
+ * tests/unistr/test-u8-cmp2.c: New file.
+ * tests/unistr/test-cmp2.h: New file, based on tests/unistr/test-cmp.h.
+
+ Tests for module 'unistr/u32-cmp'.
+ * modules/unistr/u32-cmp-tests: New file.
+ * tests/unistr/test-u32-cmp.c: New file.
+
+ Tests for module 'unistr/u16-cmp'.
+ * modules/unistr/u16-cmp-tests: New file.
+ * tests/unistr/test-u16-cmp.c: New file.
+
+ Tests for module 'unistr/u8-cmp'.
+ * modules/unistr/u8-cmp-tests: New file.
+ * tests/unistr/test-u8-cmp.c: New file.
+ * tests/unistr/test-cmp.h: New file, based on tests/test-memcmp.c.
+
+ Tests for module 'unistr/u32-set'.
+ * modules/unistr/u32-set-tests: New file.
+ * tests/unistr/test-u32-set.c: New file.
+
+ Tests for module 'unistr/u16-set'.
+ * modules/unistr/u16-set-tests: New file.
+ * tests/unistr/test-u16-set.c: New file.
+
+ Tests for module 'unistr/u8-set'.
+ * modules/unistr/u8-set-tests: New file.
+ * tests/unistr/test-u8-set.c: New file.
+ * tests/unistr/test-set.h: New file.
+
+ Tests for module 'unistr/u32-move'.
+ * modules/unistr/u32-move-tests: New file.
+ * tests/unistr/test-u32-move.c: New file.
+
+ Tests for module 'unistr/u16-move'.
+ * modules/unistr/u16-move-tests: New file.
+ * tests/unistr/test-u16-move.c: New file.
+
+ Tests for module 'unistr/u8-move'.
+ * modules/unistr/u8-move-tests: New file.
+ * tests/unistr/test-u8-move.c: New file.
+ * tests/unistr/test-move.h: New file.
+
+ Tests for module 'unistr/u32-cpy'.
+ * modules/unistr/u32-cpy-tests: New file.
+ * tests/unistr/test-u32-cpy.c: New file.
+
+ Tests for module 'unistr/u16-cpy'.
+ * modules/unistr/u16-cpy-tests: New file.
+ * tests/unistr/test-u16-cpy.c: New file.
+
+ Tests for module 'unistr/u8-cpy'.
+ * modules/unistr/u8-cpy-tests: New file.
+ * tests/unistr/test-u8-cpy.c: New file.
+ * tests/unistr/test-cpy.h: New file.
+
+2010-01-09 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'unistr/u32-uctomb'.
+ * modules/unistr/u32-uctomb-tests: New file.
+ * tests/unistr/test-u32-uctomb.c: New file.
+
+ Tests for module 'unistr/u16-uctomb'.
+ * modules/unistr/u16-uctomb-tests: New file.
+ * tests/unistr/test-u16-uctomb.c: New file.
+
+ Tests for module 'unistr/u8-uctomb'.
+ * modules/unistr/u8-uctomb-tests: New file.
+ * tests/unistr/test-u8-uctomb.c: New file.
+
+ Tests for module 'unistr/u32-mbtoucr'.
+ * modules/unistr/u32-mbtoucr-tests: New file.
+ * tests/unistr/test-u32-mbtoucr.c: New file.
+
+ Tests for module 'unistr/u16-mbtoucr'.
+ * modules/unistr/u16-mbtoucr-tests: New file.
+ * tests/unistr/test-u16-mbtoucr.c: New file.
+
+ Tests for module 'unistr/u8-mbtoucr'.
+ * modules/unistr/u8-mbtoucr-tests: New file.
+ * tests/unistr/test-u8-mbtoucr.c: New file.
+
+ Tests for module 'unistr/u32-mbtouc'.
+ * modules/unistr/u32-mbtouc-tests: New file.
+ * tests/unistr/test-u32-mbtouc.c: New file.
+
+ Tests for module 'unistr/u16-mbtouc'.
+ * modules/unistr/u16-mbtouc-tests: New file.
+ * tests/unistr/test-u16-mbtouc.c: New file.
+
+ Tests for module 'unistr/u8-mbtouc'.
+ * modules/unistr/u8-mbtouc-tests: New file.
+ * tests/unistr/test-u8-mbtouc.c: New file.
+
+ Tests for module 'unistr/u32-mbtouc-unsafe'.
+ * modules/unistr/u32-mbtouc-unsafe-tests: New file.
+ * tests/unistr/test-u32-mbtouc-unsafe.c: New file.
+ * tests/unistr/test-u32-mbtouc.h: New file.
+
+ Tests for module 'unistr/u16-mbtouc-unsafe'.
+ * modules/unistr/u16-mbtouc-unsafe-tests: New file.
+ * tests/unistr/test-u16-mbtouc-unsafe.c: New file.
+ * tests/unistr/test-u16-mbtouc.h: New file.
+
+ Tests for module 'unistr/u8-mbtouc-unsafe'.
+ * modules/unistr/u8-mbtouc-unsafe-tests: New file.
+ * tests/unistr/test-u8-mbtouc-unsafe.c: New file.
+ * tests/unistr/test-u8-mbtouc.h: New file.
+
+ Tests for module 'unistr/u32-mblen'.
+ * modules/unistr/u32-mblen-tests: New file.
+ * tests/unistr/test-u32-mblen.c: New file.
+
+ Tests for module 'unistr/u16-mblen'.
+ * modules/unistr/u16-mblen-tests: New file.
+ * tests/unistr/test-u16-mblen.c: New file.
+
+ Tests for module 'unistr/u8-mblen'.
+ * modules/unistr/u8-mblen-tests: New file.
+ * tests/unistr/test-u8-mblen.c: New file.
+
+ Tests for module 'unistr/u32-to-u16'.
+ * modules/unistr/u32-to-u16-tests: New file.
+ * tests/unistr/test-u32-to-u16.c: New file.
+
+ Tests for module 'unistr/u32-to-u8'.
+ * modules/unistr/u32-to-u8-tests: New file.
+ * tests/unistr/test-u32-to-u8.c: New file.
+
+ Tests for module 'unistr/u16-to-u32'.
+ * modules/unistr/u16-to-u32-tests: New file.
+ * tests/unistr/test-u16-to-u32.c: New file.
+
+ Tests for module 'unistr/u16-to-u8'.
+ * modules/unistr/u16-to-u8-tests: New file.
+ * tests/unistr/test-u16-to-u8.c: New file.
+
+ Tests for module 'unistr/u8-to-u32'.
+ * modules/unistr/u8-to-u32-tests: New file.
+ * tests/unistr/test-u8-to-u32.c: New file.
+
+ Tests for module 'unistr/u8-to-u16'.
+ * modules/unistr/u8-to-u16-tests: New file.
+ * tests/unistr/test-u8-to-u16.c: New file.
+
+ Tests for module 'unistr/u32-check'.
+ * modules/unistr/u32-check-tests: New file.
+ * tests/unistr/test-u32-check.c: New file.
+
+ Tests for module 'unistr/u16-check'.
+ * modules/unistr/u16-check-tests: New file.
+ * tests/unistr/test-u16-check.c: New file.
+
+ Tests for module 'unistr/u8-check'.
+ * modules/unistr/u8-check-tests: New file.
+ * tests/unistr/test-u8-check.c: New file.
+
+ * tests/unictype/test-categ_byname.c: Include <stdbool.h>.
+ (category_equals): New function.
+ (main): Add more tests.
+ * modules/unictype/category-byname-tests (Depends-on): Add stdbool.
+
+ * tests/unictype/test-bidi_byname.c (main): Add more tests.
+
+2010-01-10 Bruno Haible <bruno@clisp.org>
+
+ unistr/u*-strcoll: Try harder to distinguish different strings.
+ * lib/unistr/u-strcoll.h (FUNC): When sl1 and sl2 are the same,
+ compare s1 and s2 to see if they are different.
+
+2010-01-10 Bruno Haible <bruno@clisp.org>
+
+ unistr/u*-stpncpy: Fix the return value.
+ * lib/unistr.h (u8_stpncpy, u16_stpncpy, u32_stpncpy): Make the
+ description of the return value consistent with stpncpy in glibc.
+ * lib/unistr/u-stpncpy.h (FUNC): Return the pointer past the last
+ written non-NUL unit.
+
+2010-01-10 Bruno Haible <bruno@clisp.org>
+
+ unistr/u*-next: Add missing dependencies.
+ * modules/unistr/u8-next (Depends-on): Add unistr/u8-strmbtouc.
+ * modules/unistr/u16-next (Depends-on): Add unistr/u16-strmbtouc.
+ * modules/unistr/u32-next (Depends-on): Add unistr/u32-strmbtouc.
+
+2010-01-10 Bruno Haible <bruno@clisp.org>
+
+ unistr/u8-mbsnlen: Fix return value for incomplete character.
+ * lib/unistr/u8-mbsnlen.c (u8_mbsnlen): Use u8_mbtoucr instead of
+ u8_mblen.
+ * modules/unistr/u8-mbsnlen (Depends-on): Add unistr/u8-mbtoucr.
+ Remove unistr/u8-mblen.
+ * lib/unistr/u16-mbsnlen.c (u16_mbsnlen): Use u16_mbtoucr instead of
+ u16_mblen.
+ * modules/unistr/u16-mbsnlen (Depends-on): Add unistr/u16-mbtoucr.
+ Remove unistr/u16-mblen.
+
+2010-01-10 Bruno Haible <bruno@clisp.org>
+
+ wchar: Fix compilation error when <wchar.h> is used from coreutils.
+ * lib/wchar.in.h: Treat __need_wint_t like __need_mbstate_t.
+ Reported by Brian Gough <bjg@gnu.org> and
+ Chris Clayton <chris2553@googlemail.com> via
+ Mike Frysinger <vapier@gentoo.org> and Jim Meyering <jim@meyering.net>.
+
+2010-01-09 Bruno Haible <bruno@clisp.org>
+
+ unistr/u16-to-u32: Reject invalid input.
+ * lib/unistr/u16-to-u32.c (u16_to_u32): Call u16_mbtoucr instead of
+ u16_mbtouc.
+ * modules/unistr/u16-to-u32 (Depends-on): Add unistr/u16-mbtoucr.
+ Remove unistr/u16-mbtouc.
+
+ unistr/u16-to-u8: Reject invalid input.
+ * lib/unistr/u16-to-u8.c (u16_to_u8): Call u16_mbtoucr instead of
+ u16_mbtouc.
+ * modules/unistr/u16-to-u8 (Depends-on): Add unistr/u16-mbtoucr.
+ Remove unistr/u16-mbtouc.
+
+ unistr/u8-to-u32: Reject invalid input.
+ * lib/unistr/u8-to-u32.c (u8_to_u32): Call u8_mbtoucr instead of
+ u8_mbtouc.
+ * modules/unistr/u8-to-u32 (Depends-on): Add unistr/u8-mbtoucr.
+ Remove unistr/u8-mbtouc.
+
+ unistr/u8-to-u16: Reject invalid input.
+ * lib/unistr/u8-to-u16.c (u8_to_u16): Call u8_mbtoucr instead of
+ u8_mbtouc.
+ * modules/unistr/u8-to-u16 (Depends-on): Add unistr/u8-mbtoucr.
+ Remove unistr/u8-mbtouc.
+
+2010-01-09 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'getlogin'.
+ * modules/getlogin-tests: New file.
+ * tests/test-getlogin.c: New file.
+
+ New module 'getlogin'.
+ * lib/unistd.in.h (getlogin): New declaration.
+ * lib/getlogin.c: New file.
+ * m4/getlogin.m4: New file.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_GETLOGIN,
+ HAVE_GETLOGIN.
+ * modules/unistd (Makefile.am): Substitute GNULIB_GETLOGIN,
+ HAVE_GETLOGIN.
+ * modules/getlogin: New file.
+ * doc/posix-functions/getlogin.texi: Mention the new module.
+ Reported by John W. Eaton <jwe@gnu.org>.
+
+2010-01-09 Bruno Haible <bruno@clisp.org>
+
+ getlogin_r: Support for native Windows.
+ * lib/getlogin_r.c: Include <windows.h>
+ (getlogin_r): Implement for native Windows.
+ * tests/test-getlogin_r.c (main): Also test with a huge buffer.
+ Reported by Tatsuro MATSUOKA <tmacchant5@yahoo.co.jp>
+ via John W. Eaton <jwe@gnu.org>.
+
+2010-01-09 Bruno Haible <bruno@clisp.org>
+
+ getlogin_r: Small fixes.
+ * lib/getlogin_r.c (getlogin_r): Don't set errno if the function
+ succeeds.
+ * m4/getlogin_r.m4 (gl_GETLOGIN_R): Require gl_USE_SYSTEM_EXTENSIONS
+ before testing whether getlogin_r is declared. No need to set
+ HAVE_DECL_GETLOGIN_R to 1.
+ (gl_PREREQ_GETLOGIN_R): Don't check for the getlogin_r declaration.
+
+2010-01-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistd.in.h (getlogin_r): Add comment.
+
+2010-01-09 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'getlogin_r'.
+ * modules/getlogin_r-tests: New file.
+ * tests/test-getlogin_r.c: New file.
+
+2010-01-09 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: extend proper_name_utf8-vs-LIBICONV-checking rule
+ * top/maint.mk (sc_proper_name_utf8_requires_ICONV): Adapt to work
+ also when $(LIBICONV) is part of LDADD, rather than ${prog}_LDADD.
+
+2010-01-08 Simon Josefsson <simon@josefsson.org>
+
+ * lib/dup2.c (rpl_dup2): Improve comment.
+
+2010-01-08 Eric Blake <ebb9@byu.net>
+
+ maint.mk: allow packages to add makefile @@ exceptions
+ * top/maint.mk (_makefile_at_at_check_exceptions): New hook.
+ (sc_makefile_check): Rename...
+ (sc_makefile_at_at_check): ...to this, and use hook.
+
+ dup2: work around mingw bug
+ * lib/dup2.c (rpl_dup2): Sanitize return value on mingw.
+ Reported by Simon Josefsson.
+
+2010-01-07 John W. Eaton <jwe@octave.org> (tiny change)
+
+ glob: Fix C++ compilation.
+ * lib/glob.in.h [__cplusplus]: Define __BEGIN_DECLS and __END_DECLS for
+ C++.
+
+2010-01-07 Bruno Haible <bruno@clisp.org>
+
+ Fix indentation of wctype.in.h, broken since 2007-01-06.
+ * lib/wctype.in.h: Fix indentation of preprocessor directives.
+
+2010-01-07 Bruno Haible <bruno@clisp.org>
+
+ mbslen: Avoid collision with system function.
+ * lib/string.in.h [MirBSD]: Include <wchar.h>.
+ (mbslen): Undefine first. Alias mbslen to rpl_mbslen.
+ * m4/mbslen.m4: New file.
+ * modules/mbslen (Files): Add it.
+ (configure.ac): Invoke gl_MBSLEN.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize HAVE_MBSLEN.
+ * modules/string (Makefile.am): Substitute HAVE_MBSLEN.
+ Reported by Nelson H. F. Beebe <beebe@math.utah.edu>
+ via Ian Beckwith <ianb@erislabs.net>.
+
+2010-01-07 Bruno Haible <bruno@clisp.org>
+
+ dirent: Document the last fix.
+ * doc/posix-headers/dirent.texi: Document the bug of missing 'ino_t'.
+
+2010-01-07 Bruno Haible <bruno@clisp.org>
+
+ stdio: Ensure <stdio.h> defines off_t, ssize_t, va_list.
+ * lib/stdio.in.h: Include <sys/types.h> unconditionally.
+ * tests/test-stdio.c: Verify that fpos_t, off_t, size_t, ssize_t,
+ va_list are defined.
+ * doc/posix-headers/stdio.texi: Document the bug of missing types.
+ Reported by Eric Blake.
+
+2010-01-07 Bruno Haible <bruno@clisp.org>
+
+ xlist, xoset: Fix missing dependency bug, introduced on 2009-12-13.
+ * modules/xlist (Depends-on): Add 'list',
+ * modules/xoset (Depends-on): Add 'oset'.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2010-01-07 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/strcasecmp.texi: Clarify the platforms.
+ * doc/posix-functions/strncasecmp.texi: Likewise.
+
+2010-01-07 Bruno Haible <bruno@clisp.org>
+
+ * m4/nl_langinfo.m4 (gl_FUNC_NL_LANGINFO): Simplify logic.
+
+2010-01-07 John W. Eaton <jwe@octave.org>
+
+ wctype: allow C++ use
+ * lib/wctype.in.h: Add extern "C" block for C++.
+
+2010-01-06 Eric Blake <ebb9@byu.net>
+
+ maint.mk: detect incorrect GFDL usage
+ * top/maint.mk (_GFDL_regexp, sc_GFDL_version): New rule.
+
+2010-01-06 Jim Meyering <meyering@redhat.com>
+ and Eric Blake <ebb9@byu.net>
+
+ maint.mk: ignore multi-line copyright in NEWS
+ * top/maint.mk (NEWS_hash): Add immunity to multi-line copyright.
+
+2010-01-06 Eric Blake <ebb9@byu.net>
+
+ select: add missing dependency
+ * modules/select-tests (Depends-on): Move sockets dependency...
+ * modules/select (Depends-on): ...here.
+ Reported by Ian Beckwith.
+
+ doc: regenerate INSTALL
+ * doc/INSTALL: Reflect recent autoconf update.
+ * doc/INSTALL.ISO: Likewise.
+ * doc/INSTALL.UTF-8: Likewise.
+
+ pread: fix compilation on glibc
+ * m4/pread.m4 (gl_FUNC_PREAD): Request all interfaces.
+ Reported by Ralf Wildenhues.
+
+ dirent: fix test failure
+ * lib/dirent.in.h (includes): Guarantee ino_t.
+ Reported by Ralf Wildenhues.
+
+2010-01-06 Petr Salinger <Petr.Salinger@seznam.cz> (tiny change)
+
+ linkat, renameat: avoid bad free
+ * lib/at-func2.c (at_func2): Fix typo.
+ Reported via Ian Beckwith, from http://bugs.debian.org/561117.
+
+2010-01-06 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ cleanup after gl_FUNC_READLINK, for gl_FUNC_SYMLINK test
+ * m4/readlink.m4 (gl_FUNC_READLINK): Remove conftest.lnk2,
+ to avoid failure of symlink test later.
+
+2010-01-06 Eric Blake <ebb9@byu.net>
+
+ stdio, unistd: guarantee ssize_t
+ * lib/unistd.in.h (includes): Ensure that types required by POSIX
+ 2008 are exposed when needed.
+ * lib/stdio.in.h (includes): Likewise.
+ Reported by Ralf Wildenhues.
+
+2010-01-06 Paolo Bonzini <bonzini@gnu.org>
+
+ nl_langinfo: do not call AC_CHECK_FUNC_ONCE inside if.
+ * m4/nl_langinfo.m4 (gl_FUNC_NL_LANGINFO): Do not call
+ AC_CHECK_FUNC_ONCE inside if, do not adjust ac_cv_func_nl_langinfo.
+
+2010-01-06 Jim Meyering <meyering@redhat.com>
+
+ readtokens: this module *does* require xalloc.h
+ It uses only functions that were omitted by the old syntax-check rule.
+ * lib/readtokens.c: Include "xalloc.h" once again.
+ * modules/readtokens (Depends-on): Add xalloc.
+ This reverts part of 0e0f8f12ec241c0f1c1f21f960bb5cf908a0fa3c.
+
+2010-01-05 Eric Blake <ebb9@byu.net>
+
+ maint: support 'make announcement' from a VPATH build
+ * top/maint.mk (announcement): Look for correct NEWS file.
+
+2010-01-05 Aurelien Jarno <aurelien@aurel32.net> (tiny change)
+
+ utimens (fdutimens): ignore a negative FD, per contract
+ * lib/utimens.c (fdutimens) [HAVE_FUTIMENS]: Call futimens only
+ when we have a valid file descriptor. Otherwise, using a brand
+ new glibc (with just-patched futimens that now fails with EBADF)
+ would cause this function to fail with ENOSYS.
+ Reported by Guillaume Ayoub in http://bugs.debian.org/563726.
+ See also http://bugzilla.redhat.com/552320.
+
+2010-01-05 Eric Blake <ebb9@byu.net>
+
+ strcase: document what it provides
+ * doc/posix-functions/strcasecmp.texi (strcasecmp): Mention the
+ gnulib module.
+ * doc/posix-functions/strncasecmp.texi (strncasecmp): Likewise.
+ Reported by Dilyan Palauzov <Dilyan.Palauzov@aegee.org>.
+
+2010-01-05 Jim Meyering <meyering@redhat.com>
+
+ maint: remove useless inclusions of "xalloc.h"
+ * lib/getloadavg.c: Remove useless inclusion of "xalloc.h".
+ * lib/readtokens.c: Likewise.
+ * lib/same.c: Likewise.
+ * modules/getloadavg (Depends-on): Remove xalloc.
+ * modules/readtokens: Likewise.
+ * modules/same: Likewise.
+
+ maint.mk: include 4 more function names in alloca.h-checking regexp
+ * top/maint.mk (sc_prohibit_xalloc_without_use): Use more complete
+ regexp. Before, we would give a false-positive (saying alloca.h
+ is included unnecessarily) when the only uses involved omitted symbols.
+
+ xalloc.h: use consistent formatting
+ * lib/xalloc.h: Move declarations to start in the first column.
+
+2010-01-05 Eric Blake <ebb9@byu.net>
+
+ mkdir: avoid xalloc
+ * lib/mkdir.c (includes): Drop unused header.
+ Reported by John W. Eaton.
+
+2010-01-04 Jim Meyering <meyering@redhat.com>
+
+ nl_langinfo: avoid configure-time syntax error
+ * m4/nl_langinfo.m4 (gl_FUNC_NL_LANGINFO): When we've already tested
+ for nl_langinfo.h, AC_CHECK_FUNCS_ONCE([nl_langinfo]) expands to
+ the empty string. Don't let that provoke a shell syntax error.
+
+ regcomp, regexec, fnmatch: avoid array bounds read error
+ * lib/regcomp.c (build_equiv_class): From glibc:
+ Use only the low 24 bits of a findidx return value as an index
+ into the weights array. Patch by Ulrich Drepper:
+ http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commit;h=b7d1c5fa30
+ * lib/regexec.c (check_node_accept_bytes): Likewise.
+ * lib/fnmatch_loop.c (FCT): Likewise.
+
+ regcomp: skip collseq lookup when there are no rules
+ * lib/regcomp.c (lookup_collation_sequence_value): From glibc:
+ http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=a532a41df58
+
+ regcomp: recognize ill-formed { } expressions
+ * lib/regcomp.c (parse_dup_op): From glibc:
+ http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=a87cd2894cb
+
+ regcomp: fix typo in comment
+ * lib/regcomp.c (duplicate_node_closure): Sync from glibc.
+ s/satisfy/satisfies/.
+
+ regcomp: sync from glibc: remove dead store
+ * lib/regcomp.c (duplicate_node_closure): Remove useless
+ search_duplicated_node call and dead store.
+
+ regcomp: sync from glibc; always use nl_langinfo
+ * lib/regcomp.c (init_dfa) [!LIBC]: Always use nl_langinfo (CODESET),
+ now that gnulib provides it. Recognize UTF8 as well as UTF-8.
+ * modules/regex (Depends-on): Add nl_langinfo.
+
+2010-01-04 Eric Blake <ebb9@byu.net>
+
+ fdopendir: fix configure test
+ * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Check for existing file.
+
+2010-01-01 Bruno Haible <bruno@clisp.org>
+
+ wchar: Remove unused configure check.
+ * m4/wchar.m4 (gl_WCHAR_H): Don't test whether <wchar.h> is standalone.
+
+2010-01-01 Eric Blake <ebb9@byu.net>
+
+ headers: make check of system header explicit
+ * m4/netdb_h.m4 (gl_HEADER_NETDB): Don't exploit knowledge of
+ gl_CHECK_NEXT_HEADER internals, but call AC_CHECK_HEADERS_ONCE
+ ourselves.
+ * m4/search_h.m4 (gl_SEARCH_H): Likewise.
+ * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Likewise.
+ * m4/sys_time_h.m4 (gl_HEADER_SYS_TIME_H_BODY): Likewise.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Likewise, for gt_INTTYPES_PRI
+ internals.
+ * m4/wchar.m4 (gl_WCHAR_H): Skip followup test if header is
+ missing.
+ Suggested by Bruno Haible.
+
+2010-01-01 Jim Meyering <meyering@redhat.com>
+
+ ChangeLog: tweak to eliminate unnecessary copyright line
+ * ChangeLog: Remove a copyright line that was mistakenly updated
+ by today's update-copyright run. Reported by Eric Blake.
+
+ test-update-copyright: don't let envvar setting cause test failure
+ * tests/test-update-copyright.sh: Set UPDATE_COPYRIGHT_MAX_LINE_LENGTH.
+
+2010-01-01 Bruno Haible <bruno@clisp.org>
+
+ localename: Avoid gcc warning.
+ * lib/localename.c (gl_locale_name_thread_unsafe): Don't define this
+ function if it is not used.
+
+2010-01-01 Jim Meyering <meyering@redhat.com>
+
+ update nearly all FSF copyright year lists to include 2010
+ Use the same procedure as for 2009, outlined in
+ http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/20081
+
+ version-etc: set COPYRIGHT_YEAR to 2010
+ * lib/version-etc.c (COPYRIGHT_YEAR): Manually update the enum.
+
+2009-12-31 Eric Blake <ebb9@byu.net>
+
+ doc: correct availability of cygwin 1.5.x getopt
+ * doc/posix-functions/optarg.texi (optarg): Cygwin supplies getopt
+ variables.
+ * doc/posix-functions/opterr.texi (opterr): Likewise.
+ * doc/posix-functions/optind.texi (optind): Likewise.
+ * doc/posix-functions/optopt.texi (optopt): Likewise.
+ * doc/posix-functions/tzname.texi (tzname): Likewise.
+
+ openat: update maintainer
+ * modules/openat (Maintainer): Add myself.
+
+ utimens: avoid shadowing warning
+ * lib/utimens.c (fdutimens, lutimens): Consolidate separate stat
+ buffers into one, to avoid shadowing, as well as avoiding a
+ redundant stat.
+ Reported by Jim Meyering.
+
+ test-dup2: avoid compiler warning
+ * tests/test-dup2.c (is_inheritable): Only define if used.
+
+2010-01-01 Bruno Haible <bruno@clisp.org>
+
+ vasnprintf: Avoid passing an 'rpl_mbstate_t *' to the system's wcrtomb.
+ * lib/vasnprintf.c (VASNPRINTF): If GNULIB_defined_mbstate_t is
+ defined, use wctomb instead of wcrtomb.
+
+2010-01-01 Bruno Haible <bruno@clisp.org>
+
+ iconv: Reject native Solaris iconv.
+ * m4/iconv.m4 (AM_ICONV_LINK): Recognize native Solaris iconv() bug.
+ * doc/posix-functions/iconv.texi: Document native Solaris iconv() bug.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-signal.c (main): Remove test of 'SIG'.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ spawn: Fix incomplete fix.
+ * lib/spawn.in.h (posix_spawnattr_getflags, posix_spawnattr_setflags,
+ posix_spawnattr_getpgroup, posix_spawnattr_setpgroup): Correct the link
+ warnings for GNULIB_POSIXCHECK again.
+ Reported by Eric Blake.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ Avoid namespace pollution on glibc systems.
+ * lib/spawn.in.h: Don't include <sched.h>, <signal.h> on glibc systems.
+ * lib/sys_times.in.h: Don't include <time.h> on glibc systems.
+ * lib/wchar.in.h: Don't include <stddef.h>, <stdio.h>, <time.h> on
+ glibc systems.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/wchar.m4 (gl_WCHAR_H): Remove gl_STDDEF_H invocation.
+ (gl_REPLACE_WCHAR_H): Turn into a no-op.
+ * m4/arpa_inet_h.m4 (gl_REPLACE_ARPA_INET_H): Likewise.
+ * m4/dirent_h.m4 (gl_REPLACE_DIRENT_H): Likewise.
+ * m4/locale_h.m4 (gl_REPLACE_LOCALE_H): Likewise.
+ * m4/spawn_h.m4 (gl_REPLACE_SPAWN_H): Likewise.
+ * m4/sys_ioctl_h.m4 (gl_REPLACE_SYS_IOCTL_H): Likewise.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Invoke
+ gl_CHECK_NEXT_HEADERS before testing ac_cv_header_sys_select_h, not
+ afterwards.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/sys_utsname_h.m4 (gl_SYS_UTSNAME_H_DEFAULTS): Don't set
+ SYS_UTSNAME_H.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ spawn: Fix misapplied patch.
+ * lib/spawn.in.h (posix_spawnattr_getflags, posix_spawnattr_setflags,
+ posix_spawnattr_getpgroup, posix_spawnattr_setpgroup): Correct the link
+ warnings for GNULIB_POSIXCHECK.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ times: Update after sys_times changed.
+ * m4/times.m4: New file, extracted from modules/times. Set HAVE_TIMES.
+ * modules/times (Files): Add it.
+ (configure.ac): Invoke gl_FUNC_TIMES.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ Use AC_C_INLINE where necessary.
+ * m4/chdir-long.m4 (gl_PREREQ_CHDIR_LONG): Require AC_C_INLINE.
+ * m4/fatal-signal.m4 (gl_FATAL_SIGNAL): Likewise.
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Likewise.
+ * m4/mbchar.m4 (gl_MBCHAR): Likewise.
+ * m4/mbfile.m4 (gl_MBFILE): Likewise.
+ * m4/mbiter.m4 (gl_MBITER): Likewise.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Likewise.
+ * m4/stat.m4 (gl_FUNC_STAT): Likewise.
+ * m4/wait-process.m4 (gl_WAIT_PROCESS): Likewise.
+ * modules/u64 (configure.ac): Likewise.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ Use AC_C_INLINE instead of module 'inline' where possible.
+ * modules/inline (Description): Clarify purpose.
+ * m4/count-one-bits.m4 (gl_COUNT_ONE_BITS): Require AC_C_INLINE.
+ * modules/count-one-bits (Depends-on): Remove inline.
+ * m4/openat.m4 (gl_PREREQ_OPENAT): Require AC_C_INLINE.
+ * modules/openat (Depends-on): Remove inline.
+ * modules/fdutimensat (Depends-on, configure.ac): Require AC_C_INLINE
+ instead of depending on module 'inline'.
+ * modules/filevercmp (Depends-on, configure.ac): Likewise.
+ * modules/unicase/cased (Depends-on, configure.ac): Likewise.
+ * modules/unicase/ignorable (Depends-on, configure.ac): Likewise.
+ * modules/unictype/category-of (Depends-on, configure.ac): Likewise.
+ * modules/unictype/category-test (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-alnum (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-alpha (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-blank (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-cntrl (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-digit (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-graph (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-lower (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-print (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-punct (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-space (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-upper (Depends-on, configure.ac): Likewise.
+ * modules/unictype/ctype-xdigit (Depends-on, configure.ac): Likewise.
+ * modules/unictype/property-alphabetic (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-ascii-hex-digit (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-arabic-digit (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-arabic-right-to-left (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-block-separator (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-boundary-neutral (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-common-separator (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-control (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-bidi-embedding-or-override (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-eur-num-separator (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-eur-num-terminator (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-european-digit (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-hebrew-right-to-left (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-left-to-right (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-non-spacing-mark (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-other-neutral (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-pdf (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-bidi-segment-separator (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-bidi-whitespace (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-combining (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-composite (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-currency-symbol (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-dash (Depends-on, configure.ac): Likewise.
+ * modules/unictype/property-decimal-digit (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-default-ignorable-code-point (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-deprecated (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-diacritic (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-extender (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-format-control (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-grapheme-base (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-grapheme-extend (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-grapheme-link (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-hex-digit (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-hyphen (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-id-continue (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-id-start (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-ideographic (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-ids-binary-operator (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-ids-trinary-operator (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-ignorable-control (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-iso-control (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-join-control (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-left-of-pair (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-line-separator (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-logical-order-exception (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-lowercase (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-math (Depends-on, configure.ac): Likewise.
+ * modules/unictype/property-non-break (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-not-a-character (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-numeric (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-other-alphabetic (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-other-default-ignorable-code-point
+ (Depends-on, configure.ac): Likewise.
+ * modules/unictype/property-other-grapheme-extend (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-other-id-continue (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-other-id-start (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-other-lowercase (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-other-math (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-other-uppercase (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-paired-punctuation (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-paragraph-separator (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-pattern-syntax (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-pattern-white-space (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-private-use (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-punctuation (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-quotation-mark (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-radical (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-sentence-terminal (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-soft-dotted (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-space (Depends-on, configure.ac): Likewise.
+ * modules/unictype/property-terminal-punctuation (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-titlecase (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-unassigned-code-value (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-unified-ideograph (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-uppercase (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-variation-selector (Depends-on,
+ configure.ac): Likewise.
+ * modules/unictype/property-white-space (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-xid-continue (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-xid-start (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/property-zero-width (Depends-on, configure.ac):
+ Likewise.
+ * modules/unictype/syntax-c-ident (Depends-on, configure.ac): Likewise.
+ * modules/unictype/syntax-java-ident (Depends-on, configure.ac):
+ Likewise.
+
+2009-12-31 Bruno Haible <bruno@clisp.org>
+
+ Remove unnecessary AC_C_INLINE invocation.
+ * m4/popen.m4 (gl_PREREQ_POPEN): Don't invoke AC_C_INLINE. Not needed
+ since 2009-08-21.
+
+2009-12-31 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: don't require explicit gpg_key_ID in cfg.mk
+ * top/maint.mk (gpg_key_ID): Derive key ID from signed release tag.
+ With this change, we can all remove the gpg_key_ID = ... definition
+ from our respective cfg.mk files.
+
+ maint.mk: create announcement template in ~/, not in /tmp
+ * top/maint.mk (emit_upload_commands): Adjust.
+ (release-prep): Emit into ~/announce-..., not /tmp/announce-...
+ Remove temporary file, .ci-msg.
+
+2009-12-31 Eric Blake <ebb9@byu.net>
+
+ link-warning: always build headers with link warnings
+ * modules/arpa_inet (Makefile.am): Always build replacement
+ header.
+ * modules/ctype (Makefile.am): Likewise.
+ * modules/dirent (Makefile.am): Likewise.
+ * modules/inttypes (Makefile.am): Likewise.
+ * modules/langinfo (Makefile.am): Likewise.
+ * modules/locale (Makefile.am): Likewise.
+ * modules/spawn (Makefile.am): Likewise.
+ * modules/sys_file (Makefile.am): Likewise.
+ * modules/sys_ioctl (Makefile.am): Likewise.
+ * modules/sys_select (Makefile.am): Likewise.
+ * modules/sys_socket (Makefile.am): Likewise.
+ * modules/sys_times (Makefile.am): Likewise.
+ * modules/sys_utsname (Makefile.am): Likewise.
+ * modules/sys_wait (Makefile.am): Likewise.
+ * modules/wchar (Makefile.am): Likewise.
+ * m4/arpa_inet_h.m4 (gl_HEADER_ARPA_INET)
+ (gl_ARPA_INET_H_DEFAULTS): Drop unneeded variable.
+ * m4/ctype.m4 (gl_CTYPE_H_DEFAULTS): Likewise.
+ * m4/isblank.m4 (gl_FUNC_ISBLANK): Likewise.
+ * m4/dirent_h.m4 (gl_REPLACE_DIRENT_H, gl_DIRENT_H_DEFAULTS):
+ Likewise.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Likewise.
+ * m4/langinfo_h.m4 (gl_LANGINFO_H): Likewise.
+ * m4/locale_h.m4 (gl_REPLACE_LOCALE_H, gl_LOCALE_H_DEFAULTS):
+ Likewise.
+ * m4/spawn_h.m4 (gl_REPLACE_SPAWN_H, gl_SPAWN_H_DEFAULTS):
+ Likewise.
+ * m4/sys_file_h.m4 (gl_HEADER_SYS_FILE_H): Likewise.
+ * m4/sys_ioctl_h.m4 (gl_SYS_IOCTL_H, gl_REPLACE_SYS_IOCTL_H)
+ (gl_SYS_IOCTL_H_DEFAULTS): Likewise.
+ * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Likewise.
+ * m4/sys_times_h.m4 (gl_SYS_TIMES_H): Likewise.
+ * m4/sys_utsname_h.m4 (gl_SYS_UTSNAME_H)
+ (gl_SYS_UTSNAME_H_DEFAULTS): Likewise.
+ * m4/wchar.m4 (gl_WCHAR_H, gl_REPLACE_WCHAR_H)
+ (gl_WCHAR_H_DEFAULTS): Likewise.
+
+2009-12-31 Eric Blake <ebb9@byu.net>
+
+ signal, spawn: use link warnings
+ * lib/signal.in.h (sigset_t): Make unconditional.
+ (sigismember, sigemptyset, sigaddset, sigdelset, sigfillset)
+ (sigpending, sigprocmask, sigaction): Add link warnings.
+ * lib/spawn.in.h (posix_spawn, posix_spawnp, posix_spawnattr_init)
+ (posix_spawnattr_destroy, posix_spawnattr_getsigdefault)
+ (posix_spawnattr_setsigdefault, posix_spawnattr_getsigmask)
+ (posix_spawnattr_setsigmask, posix_spawnattr_getflags)
+ (posix_spawnattr_setflags, posix_spawnattr_getpgroup)
+ (posix_spawnattr_setpgroup, posix_spawnattr_getschedpolicy)
+ (posix_spawnattr_setschedpolicy, posix_spawnattr_getschedparam)
+ (posix_spawnattr_setschedparam, posix_spawn_file_actions_init)
+ (posix_spawn_file_actions_destroy)
+ (posix_spawn_file_actions_addopen)
+ (posix_spawn_file_actions_addclose)
+ (posix_spawwn_file_actions_adddup2): Likewise.
+ * m4/signal_h.m4 (gl_SIGNAL_H): Guarantee uid_t.
+ * tests/test-signal.c (main): Enhance test.
+
+ spawn: improve wrapper support
+ * m4/spawn_h.m4 (gl_SPAWN_H): Check for type existence.
+ (gl_SPAWN_H_DEFAULTS): New defaults.
+ * modules/spawn (Makefile.am): Substitute them.
+ * lib/spawn.in.h: (posix_spawnattr_t, posix_spawn_file_actions_t):
+ Only declare if missing or broken.
+
+ sys_times, sys_utsname: use include_next
+ * m4/sys_times_h.m4 (gl_SYS_TIMES_H): Support wrapping an existing
+ header.
+ (gl_SYS_TIMES_H_DEFAULTS): Add another variable.
+ * m4/sys_utsname_h.m4 (gl_SYS_UTSNAME_H)
+ (gl_SYS_UTSNAME_H_DEFAULTS): Likewise.
+ * modules/sys_times (Depends-on): Add include_next.
+ (Makefile.am): Substitute additional values.
+ * modules/sys_utsname (Depends-on, Makefile.am): Likewise.
+ * lib/sys_times.in.h (includes): Include native header, if
+ available.
+ * lib/sys_utsname.in.h (includes): Likewise.
+ * tests/test-sys_times.c (main): Enhance test.
+
+ fdutimensat: revert prior patch
+ * modules/fdutimensat (Depends-on): Re-add inline; it is needed by
+ utimens.h.
+ Reported by Bruno Haible.
+
+2009-12-30 Eric Blake <ebb9@byu.net>
+
+ sys_wait: drop link-warning dependency
+ * modules/sys_wait (Depends-on, Makefile.am): Drop unneeded
+ link-warning efforts.
+ * lib/sys_wait.in.h: Likewise.
+
+ fdutimensat: remove bogus dependency
+ * modules/fdutimensat (Depends-on): Drop inline.
+
+ unistd: fix typo
+ * lib/unistd.in.h (linkat) [GNULIB_POSIXCHECK]: Fix typo.
+
+2009-12-30 Bruno Haible <bruno@clisp.org>
+
+ Fix compilation error with Solaris cc.
+ * lib/unicase/u8-is-invariant.c: Include <stdbool.h>.
+ * lib/unicase/u16-is-invariant.c: Likewise.
+ * lib/unicase/u32-is-invariant.c: Likewise.
+ Reported by Nelson H. F. Beebe <beebe@math.utah.edu>.
+
+2009-12-30 Bruno Haible <bruno@clisp.org>
+
+ Fix test crash.
+ * tests/test-localename.c (test_locale_name_thread): Skip unavailable
+ locales.
+ Reported by Simon Josefsson <simon@josefsson.org>.
+
+2009-12-30 Bruno Haible <bruno@clisp.org>
+
+ Fix compilation error on most platforms.
+ * tests/test-localename.c (categories): Define only if HAVE_NEWLOCALE.
+ Reported by Simon Josefsson <simon@josefsson.org>
+ and Nelson H. F. Beebe <beebe@math.utah.edu>.
+
+2009-12-30 Eric Blake <ebb9@byu.net>
+
+ futimens, utimensat: work around ntfs-3g bug
+ * lib/utimensat.c (rpl_utimensat): Drop attempts to cache whether
+ a ctime bug is present, and expand workaround to cover ntfs-3g.
+ * lib/utimens.c (fdutimens, lutimens): Likewise.
+ (utimensat_ctime_really, detect_ctime_bug): Drop cache mechanism.
+ (validate_timespec): Adjust return value.
+ * m4/futimens.m4 (gl_FUNC_FUTIMENS): Update comment.
+ * m4/utimensat.m4 (gl_FUNC_UTIMENSAT): Likewise.
+ Reported by ctrn3e8 <ctrn3e8@gmail.com>.
+
+2009-12-29 Eric Blake <ebb9@byu.net>
+
+ link-warning: make usage consistent
+ * modules/ctype (Depends-on): Add link-warning.
+ (Makefile.am): Update rules accordingly.
+ * modules/langinfo (Depends-on, Makefile.am): Likewise.
+ * modules/locale (Depends-on, Makefile.am): Likewise.
+ * modules/sys_file (Makefile.am): Likewise.
+ * modules/getopt-posix (Makefile.am): Delete unused link warning
+ efforts.
+ * lib/ctype.in.h (GL_LINK_WARNING): Ensure definition before use.
+ * lib/langinfo.in.h (GL_LINK_WARNING): Likewise.
+ * lib/locale.in.h (GL_LINK_WARNING): Likewise.
+ * lib/sys_file.in.h (GL_LINK_WARNING): Likewise.
+
+ stdio: remove unused variables
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Remove unused variables.
+ * m4/fseeko.m4 (gl_FUNC_FSEEKO): Likewise.
+ * m4/ftello.m4 (gl_FUNC_FTELLO): Likewise.
+
+ tests: test more substitute headers
+ * modules/ctype-tests: New file.
+ * modules/dirent-tests: Likewise.
+ * modules/spawn-tests: Likewise.
+ * modules/sys_file-tests: Likewise.
+ * modules/sys_ioctl-tests: Likewise.
+ * modules/sys_wait-tests: Likewise.
+ * tests/test-ctype.c: Likewise.
+ * tests/test-dirent.c: Likewise.
+ * tests/test-spawn.c: Likewise.
+ * tests/test-sys_file.c: Likewise.
+ * tests/test-sys_ioctl.c: Likewise.
+ * tests/test-sys_wait.c: Likewise.
+ * m4/spawn_h.m4 (gl_SPAWN_H): Replace header if it is missing.
+ * lib/sys_file.in.h (LOCK_SH, LOCK_EX, LOCK_UN, LOCK_NB): Provide
+ whether or not flock is in use.
+
+ tests: remove License section from module
+ * modules/arpa_inet-tests: Remove unneeded section.
+ * modules/byteswap-tests: Likewise.
+ * modules/ceilf-tests: Likewise.
+ * modules/ceill-tests: Likewise.
+ * modules/crypto/des-tests: Likewise.
+ * modules/crypto/gc-arcfour-tests: Likewise.
+ * modules/crypto/gc-arctwo-tests: Likewise.
+ * modules/crypto/gc-des-tests: Likewise.
+ * modules/crypto/gc-hmac-md5-tests: Likewise.
+ * modules/crypto/gc-hmac-sha1-tests: Likewise.
+ * modules/crypto/gc-md2-tests: Likewise.
+ * modules/crypto/gc-md4-tests: Likewise.
+ * modules/crypto/gc-md5-tests: Likewise.
+ * modules/crypto/gc-pbkdf2-sha1-tests: Likewise.
+ * modules/crypto/gc-rijndael-tests: Likewise.
+ * modules/crypto/gc-sha1-tests: Likewise.
+ * modules/crypto/gc-tests: Likewise.
+ * modules/crypto/md2-tests: Likewise.
+ * modules/crypto/md4-tests: Likewise.
+ * modules/fcntl-h-tests: Likewise.
+ * modules/floorf-tests: Likewise.
+ * modules/floorl-tests: Likewise.
+ * modules/frexp-nolibm-tests: Likewise.
+ * modules/frexp-tests: Likewise.
+ * modules/frexpl-nolibm-tests: Likewise.
+ * modules/frexpl-tests: Likewise.
+ * modules/getaddrinfo-tests: Likewise.
+ * modules/inttypes-tests: Likewise.
+ * modules/isfinite-tests: Likewise.
+ * modules/isinf-tests: Likewise.
+ * modules/ldexpl-tests: Likewise.
+ * modules/locale-tests: Likewise.
+ * modules/math-tests: Likewise.
+ * modules/netdb-tests: Likewise.
+ * modules/netinet_in-tests: Likewise.
+ * modules/printf-frexp-tests: Likewise.
+ * modules/printf-frexpl-tests: Likewise.
+ * modules/priv-set-tests: Likewise.
+ * modules/random_r-tests: Likewise.
+ * modules/round-tests: Likewise.
+ * modules/roundf-tests: Likewise.
+ * modules/roundl-tests: Likewise.
+ * modules/search-tests: Likewise.
+ * modules/select-tests: Likewise.
+ * modules/signal-tests: Likewise.
+ * modules/stdbool-tests: Likewise.
+ * modules/stddef-tests: Likewise.
+ * modules/stdint-tests: Likewise.
+ * modules/stdio-tests: Likewise.
+ * modules/stdlib-tests: Likewise.
+ * modules/string-tests: Likewise.
+ * modules/strings-tests: Likewise.
+ * modules/sys_select-tests: Likewise.
+ * modules/sys_socket-tests: Likewise.
+ * modules/sys_stat-tests: Likewise.
+ * modules/sys_time-tests: Likewise.
+ * modules/sys_utsname-tests: Likewise.
+ * modules/sysexits-tests: Likewise.
+ * modules/time-tests: Likewise.
+ * modules/trunc-tests: Likewise.
+ * modules/truncf-tests: Likewise.
+ * modules/truncl-tests: Likewise.
+ * modules/tsearch-tests: Likewise.
+ * modules/unistd-tests: Likewise.
+ * modules/wchar-tests: Likewise.
+ * modules/wctype-tests: Likewise.
+
+ tests: fix license on several tests
+ * tests/test-des.c: Update to GPLv3+.
+ * tests/test-flock.c: Likewise.
+ * tests/test-fsync.c: Likewise.
+ * tests/test-futimens.h: Likewise.
+ * tests/test-gc-arcfour.c: Likewise.
+ * tests/test-gc-arctwo.c: Likewise.
+ * tests/test-gc-des.c: Likewise.
+ * tests/test-gc-hmac-md5.c: Likewise.
+ * tests/test-gc-hmac-sha1.c: Likewise.
+ * tests/test-gc-md2.c: Likewise.
+ * tests/test-gc-md4.c: Likewise.
+ * tests/test-gc-md5.c: Likewise.
+ * tests/test-gc-pbkdf2-sha1.c: Likewise.
+ * tests/test-gc-rijndael.c: Likewise.
+ * tests/test-gc-sha1.c: Likewise.
+ * tests/test-gc.c: Likewise.
+ * tests/test-getcwd.c: Likewise.
+ * tests/test-link.c: Likewise.
+ * tests/test-link.h: Likewise.
+ * tests/test-lutimens.h: Likewise.
+ * tests/test-md2.c: Likewise.
+ * tests/test-md4.c: Likewise.
+ * tests/test-mkdir.h: Likewise.
+ * tests/test-rename.c: Likewise.
+ * tests/test-rename.h: Likewise.
+ * tests/test-safe-alloc.c: Likewise.
+ * tests/test-utimens-common.h: Likewise.
+ * tests/test-utimens.h: Likewise.
+
+ maint: sync license texts
+ * config/srclist.txt: Add gpl-1.3.texi, lgpl-1.3.texi.
+ * doc/gpl-3.0.texi: Revert copyright year update.
+ * doc/lgpl-3.0.texi: Likewise.
+
+2009-12-29 Jim Meyering <meyering@redhat.com>
+
+ update nearly all FSF copyright year lists to include 2009
+ The files named by the following are exempted:
+ grep -v '^#' config/srclist.txt|grep -v '^$' | while read src dst; do
+ test -f "$dst" && { echo "$dst"; continue; }
+ test -d "$dst" || continue
+ echo "$dst"/$(basename "$src")
+ done > exempt
+ git ls-files tests/unictype >> exempt
+ In the remaining files, convert to all-interval notation if
+ - there is already at least one year interval like 2000-2003
+ - the file is maintained by me
+ - the file is in lib/uni*/, where that style already prevails
+ Otherwise, use update-copyright's default.
+
+2009-12-29 Simon Josefsson <simon@josefsson.org>
+ and Eric Blake <ebb9@byu.net>
+
+ tests: don't require debug system() to pass
+ * tests/test-lstat.h (test_lstat_func): Move debug cleanup...
+ * tests/test-rmdir.h (test_rmdir_func): Likewise.
+ * tests/test-unlink.h (test_unlink_func): Likewise.
+ * tests/test-fstatat.c (main): ...into callers.
+ * tests/test-lstat.c (main): Likewise.
+ * tests/test-rmdir.c (main): Likewise.
+ * tests/test-unlink.c (main): Likewise.
+ * tests/test-unlinkat.c (main): Likewise.
+ * tests/test-areadlink-with-size.c (main): Don't require a
+ debug-only system call to pass, aiding cross-testing to mingw.
+ * tests/test-areadlink.c (main): Likewise.
+ * tests/test-areadlinkat-with-size.c (main): Likewise.
+ * tests/test-areadlinkat.c (main): Likewise.
+ * tests/test-canonicalize-lgpl.c (main): Likewise.
+ * tests/test-canonicalize.c (main): Likewise.
+ * tests/test-chown.c (main): Likewise.
+ * tests/test-fchownat.c (main): Likewise.
+ * tests/test-lchown.c (main): Likewise.
+ * tests/test-fdutimensat.c (main): Likewise.
+ * tests/test-futimens.c (main): Likewise.
+ * tests/test-link.c (main): Likewise.
+ * tests/test-linkat.c (main): Likewise.
+ * tests/test-mkdir.c (main): Likewise.
+ * tests/test-mkdirat.c (main): Likewise.
+ * tests/test-mkfifo.c (main): Likewise.
+ * tests/test-mkfifoat.c (main): Likewise.
+ * tests/test-mknod.c (main): Likewise.
+ * tests/test-readlink.c (main): Likewise.
+ * tests/test-remove.c (main): Likewise.
+ * tests/test-rename.c (main): Likewise.
+ * tests/test-renameat.c (main): Likewise.
+ * tests/test-symlink.c (main): Likewise.
+ * tests/test-symlinkat.c (main): Likewise.
+ * tests/test-utimens.c (main): Likewise.
+ * tests/test-utimensat.c (main): Likewise.
+
+2009-12-29 Simon Josefsson <simon@josefsson.org>
+
+ * modules/selinux-h (selinux/selinux.h, selinux/context.h): Depend
+ on $(UNUSED_PARAMETER_H) to avoid build failure.
+
+2009-12-28 Jim Meyering <meyering@redhat.com>
+
+ update-copyright: you may specify a max. line length other than 72
+ * build-aux/update-copyright: Honor $UPDATE_COPYRIGHT_MAX_LINE_LENGTH.
+
+ maint: use consistent FSF copyright line syntax
+ * lib/posixtm.c: Add missing comma in FSF copyright line.
+ * lib/posixtm.h: Likewise.
+ * lib/getugroups.c: Add missing ", Inc.".
+
+ pmccabe2html: emit consistent FSF copyright; remove trailing blanks
+ * build-aux/pmccabe2html: Insert comma before "Inc." in emitted
+ FSF copyright line. Remove trailing blanks.
+
+2009-12-28 Eric Blake <ebb9@byu.net>
+
+ test-dup2: reduce dependencies
+ * modules/cloexec (Configure.ac): Set witness.
+ * modules/dup2-tests (Depends-on): Drop cloexec.
+ * tests/test-dup2.c (main): Skip portion of test if cloexec module
+ not present.
+ Suggested by Bruno Haible.
+
+2009-12-26 Bruno Haible <bruno@clisp.org>
+
+ Remove an unneeded dependency.
+ * modules/fseterr (Depends-on): Remove dup2.
+
+2009-12-26 Eric Blake <ebb9@byu.net>
+
+ tests: use macros.h in more places
+ * tests/macros.h (ASSERT): Depend on ASSERT_STREAM.
+ (ASSERT_STREAM): Provide default of stderr.
+ * tests/test-dirent-safer.c: Include macros.h, using alternate
+ stream for assertions.
+ * tests/test-dup-safer.c: Likewise.
+ * tests/test-freopen-safer.c: Likewise.
+ * tests/test-getopt.c: Likewise.
+ * tests/test-openat-safer.c: Likewise.
+ * tests/test-pipe.c: Likewise.
+ * tests/test-popen-safer.c: Likewise.
+ * modules/dirent-safer-tests (Files): Include macros.h.
+ * modules/unistd-safer-tests (Files): Likewise.
+ * modules/freopen-safer-tests (Files): Likewise.
+ * modules/getopt-posix-tests (Files): Likewise.
+ * modules/openat-safer-tests (Files): Likewise.
+ * modules/pipe-tests (Files): Likewise.
+
+2009-12-26 Bruno Haible <bruno@clisp.org>
+
+ javacomp: Portability fix.
+ * m4/javacomp.m4 (gt_JAVACOMP): Fix creation of conftestver.class so
+ that it also works on Solaris.
+
+2009-12-26 Bruno Haible <bruno@clisp.org>
+
+ localename: Fix storage allocation of gl_locale_name_thread's result.
+ * lib/localename.c (SIZE_BITS, string_hash, struct hash_node,
+ HASH_TABLE_SIZE, struniq_hash_table, struniq_lock, struniq): Define on
+ all platforms that have 'uselocale'.
+ (gl_locale_name_thread_unsafe): New function, extracted from
+ gl_locale_name_thread.
+ (gl_locale_name_thread): Call struniq on all platforms that have
+ 'uselocale'.
+ * tests/test-localename.c (test_locale_name_thread): Check that the
+ resulting strings are permanently allocated.
+ * modules/localename-tests (Depends-on): Add strdup.
+
+2009-12-26 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-localename.c (categories): Fill in the strings.
+
+2009-12-26 Jim Meyering <meyering@redhat.com>
+
+ isdir: complete the removal of m4/isdir.m4
+ * modules/isdir (configure.ac): Remove reference to gl_ISDIR.
+
+ isdir: clean up, since at least grep still uses it
+ * lib/isdir.c: Include "isdir.h".
+ (S_ISDIR): Remove now-unneeded definition.
+ * modules/isdir (Files): Add lib/isdir.h.
+ * lib/isdir.h: New file, with declaration.
+ * m4/isdir.m4: Remove file -- unneeded.
+
+2009-12-25 Bruno Haible <bruno@clisp.org>
+
+ selinux-h: Make generated .h files standalone.
+ * lib/se-context.in.h: Arrange to include _GL_UNUSED_PARAMETER
+ definition. Use _GL_UNUSED_PARAMETER instead of _GL_UNUSED.
+ * lib/se-selinux.in.h: Likewise.
+ * modules/selinux-h (Depends-on): Add unused-parameter.
+ (Makefile.am): Insert definition of _GL_UNUSED_PARAMETER into
+ selinux/selinux.h and selinux/context.h.
+ Suggested by Eric Blake.
+
+2009-12-25 Bruno Haible <bruno@clisp.org>
+
+ Move gl_FCNTL_O_FLAGS to a separate .m4 file.
+ * m4/fcntl-o.m4: New file, extracted from m4/fcntl_h.m4.
+ * m4/fcntl_h.m4 (gl_FCNTL_O_FLAGS): Remove macro.
+ * modules/fcntl-h (Files): Add m4/fcntl-o.m4.
+ * modules/localcharset (Files): Likewise. Remove m4/fcntl_h.m4.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ openat: Fix warning.
+ * lib/openat-proc.c: Include <unistd.h>.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ New module 'unused-parameter'.
+ * build-aux/unused-parameter.h: New file, extracted from earlier
+ gnulib-common.m4.
+ * modules/unused-parameter: New file.
+ * lib/unistr.h: Include unused-parameter.h.
+ (u32_mbtouc_unsafe, u32_mbtouc): Use _GL_UNUSED_PARAMETER instead of
+ _GL_UNUSED.
+ * modules/unistr/base (Depends-on): Add unused-parameter.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ Add missing dependencies to 'extensions' module.
+ * m4/extensions.m4: Add comment.
+ * modules/accept4 (Depends-on): Add extensions.
+ * modules/dup3 (Depends-on): Likewise.
+ * modules/fcntl (Depends-on): Likewise.
+ * modules/futimens (Depends-on): Likewise.
+ * modules/mknod (Depends-on): Likewise.
+ * modules/pipe2 (Depends-on): Likewise.
+ * modules/stat-time (Depends-on): Likewise.
+ * modules/strcasestr-simple (Depends-on): Likewise.
+ * modules/strsignal (Depends-on): Likewise.
+ * modules/utimensat (Depends-on): Likewise.
+ * modules/localcharset (Depends-on): Likewise. Needed because of
+ gl_FCNTL_O_FLAGS.
+ * modules/wcrtomb (Depends-on): Likewise. Needed because of
+ AC_TYPE_MBSTATE_T.
+ * modules/wcsnrtombs (Depends-on): Likewise.
+ * modules/wcsrtombs (Depends-on): Likewise.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ binary-io: Avoid gcc warning due to SET_BINARY.
+ * lib/binary-io.h (SET_BINARY): Cast the result to void.
+ Reported by Jim Meyering <jim@meyering.net>. Suggestion by Eric Blake.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ Avoid future namespace pollution on glibc systems.
+ * lib/arpa_inet.in.h: Don't include <sys/socket.h> on glibc systems.
+ * lib/sys_ioctl.in.h: Don't include <unistd.h> on glibc systems.
+ * lib/sys_select.in.h: Don't include <sys/time.h> and <string.h> on
+ glibc systems.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ Refactor common macros used in tests.
+ * tests/macros.h: New file.
+ * tests/test-areadlink.c: Include macros.h. Don't include <stdio.h>
+ and/or <stdlib.h>, if appropriate.
+ (ASSERT, SIZEOF): Remove macros.
+ * tests/test-areadlink-with-size.c: Likewise.
+ * tests/test-areadlinkat.c: Likewise.
+ * tests/test-areadlinkat-with-size.c: Likewise.
+ * tests/test-argmatch.c: Likewise.
+ * tests/test-argv-iter.c: Likewise.
+ * tests/test-array-mergesort.c: Likewise.
+ * tests/test-array_list.c: Likewise.
+ * tests/test-array_oset.c: Likewise.
+ * tests/test-avltree_list.c: Likewise.
+ * tests/test-avltree_oset.c: Likewise.
+ * tests/test-avltreehash_list.c: Likewise.
+ * tests/test-base64.c: Likewise.
+ * tests/test-binary-io.c: Likewise.
+ * tests/test-bitrotate.c: Likewise.
+ * tests/test-btowc.c: Likewise.
+ * tests/test-byteswap.c: Likewise.
+ * tests/test-c-ctype.c: Likewise.
+ * tests/test-c-stack.c: Likewise.
+ * tests/test-c-strcasecmp.c: Likewise.
+ * tests/test-c-strcasestr.c: Likewise.
+ * tests/test-c-strncasecmp.c: Likewise.
+ * tests/test-c-strstr.c: Likewise.
+ * tests/test-canonicalize-lgpl.c: Likewise.
+ * tests/test-canonicalize.c: Likewise.
+ * tests/test-carray_list.c: Likewise.
+ * tests/test-ceilf1.c: Likewise.
+ * tests/test-ceilf2.c: Likewise.
+ * tests/test-ceill.c: Likewise.
+ * tests/test-chown.c: Likewise.
+ * tests/test-cloexec.c: Likewise.
+ * tests/test-copy-acl.c: Likewise.
+ * tests/test-copy-file.c: Likewise.
+ * tests/test-count-one-bits.c: Likewise.
+ * tests/test-dprintf-posix.c: Likewise.
+ * tests/test-dup2.c: Likewise.
+ * tests/test-dup3.c: Likewise.
+ * tests/test-duplocale.c: Likewise.
+ * tests/test-fbufmode.c: Likewise.
+ * tests/test-fchdir.c: Likewise.
+ * tests/test-fchownat.c: Likewise.
+ * tests/test-fcntl-safer.c: Likewise.
+ * tests/test-fcntl.c: Likewise.
+ * tests/test-fdopendir.c: Likewise.
+ * tests/test-fdutimensat.c: Likewise.
+ * tests/test-fflush2.c: Likewise.
+ * tests/test-file-has-acl.c: Likewise.
+ * tests/test-filevercmp.c: Likewise.
+ * tests/test-flock.c: Likewise.
+ * tests/test-floorf1.c: Likewise.
+ * tests/test-floorf2.c: Likewise.
+ * tests/test-floorl.c: Likewise.
+ * tests/test-fnmatch.c: Likewise.
+ * tests/test-fopen.h: Likewise.
+ * tests/test-fpending.c: Likewise.
+ * tests/test-fprintf-posix.c: Likewise.
+ * tests/test-fpurge.c: Likewise.
+ * tests/test-freadable.c: Likewise.
+ * tests/test-freadahead.c: Likewise.
+ * tests/test-freading.c: Likewise.
+ * tests/test-freadptr.c: Likewise.
+ * tests/test-freadptr2.c: Likewise.
+ * tests/test-freadseek.c: Likewise.
+ * tests/test-freopen.c: Likewise.
+ * tests/test-frexp.c: Likewise.
+ * tests/test-frexpl.c: Likewise.
+ * tests/test-fseek.c: Likewise.
+ * tests/test-fseeko.c: Likewise.
+ * tests/test-fstatat.c: Likewise.
+ * tests/test-fstrcmp.c: Likewise.
+ * tests/test-fsync.c: Likewise.
+ * tests/test-ftell.c: Likewise.
+ * tests/test-ftello.c: Likewise.
+ * tests/test-func.c: Likewise.
+ * tests/test-futimens.c: Likewise.
+ * tests/test-fwritable.c: Likewise.
+ * tests/test-fwriting.c: Likewise.
+ * tests/test-getcwd.c: Likewise.
+ * tests/test-getdate.c: Likewise.
+ * tests/test-getdelim.c: Likewise.
+ * tests/test-getdtablesize.c: Likewise.
+ * tests/test-getgroups.c: Likewise.
+ * tests/test-getline.c: Likewise.
+ * tests/test-getndelim2.c: Likewise.
+ * tests/test-glob.c: Likewise.
+ * tests/test-hash.c: Likewise.
+ * tests/test-i-ring.c: Likewise.
+ * tests/test-iconv-utf.c: Likewise.
+ * tests/test-iconv.c: Likewise.
+ * tests/test-idpriv-drop.c: Likewise.
+ * tests/test-idpriv-droptemp.c: Likewise.
+ * tests/test-inet_ntop.c: Likewise.
+ * tests/test-inet_pton.c: Likewise.
+ * tests/test-isblank.c: Likewise.
+ * tests/test-isfinite.c: Likewise.
+ * tests/test-isinf.c: Likewise.
+ * tests/test-isnan.c: Likewise.
+ * tests/test-isnand.h: Likewise.
+ * tests/test-isnanf.h: Likewise.
+ * tests/test-isnanl.h: Likewise.
+ * tests/test-lchown.c: Likewise.
+ * tests/test-ldexpl.c: Likewise.
+ * tests/test-link.c: Likewise.
+ * tests/test-linkat.c: Likewise.
+ * tests/test-linked_list.c: Likewise.
+ * tests/test-linkedhash_list.c: Likewise.
+ * tests/test-localename.c: Likewise.
+ * tests/test-lseek.c: Likewise.
+ * tests/test-lstat.c: Likewise.
+ * tests/test-mbmemcasecmp.c: Likewise.
+ * tests/test-mbmemcasecoll.c: Likewise.
+ * tests/test-mbrtowc.c: Likewise.
+ * tests/test-mbscasecmp.c: Likewise.
+ * tests/test-mbscasestr1.c: Likewise.
+ * tests/test-mbscasestr2.c: Likewise.
+ * tests/test-mbscasestr3.c: Likewise.
+ * tests/test-mbscasestr4.c: Likewise.
+ * tests/test-mbschr.c: Likewise.
+ * tests/test-mbscspn.c: Likewise.
+ * tests/test-mbsinit.c: Likewise.
+ * tests/test-mbsncasecmp.c: Likewise.
+ * tests/test-mbsnrtowcs.c: Likewise.
+ * tests/test-mbspbrk.c: Likewise.
+ * tests/test-mbspcasecmp.c: Likewise.
+ * tests/test-mbsrchr.c: Likewise.
+ * tests/test-mbsrtowcs.c: Likewise.
+ * tests/test-mbsspn.c: Likewise.
+ * tests/test-mbsstr1.c: Likewise.
+ * tests/test-mbsstr2.c: Likewise.
+ * tests/test-mbsstr3.c: Likewise.
+ * tests/test-memchr.c: Likewise.
+ * tests/test-memchr2.c: Likewise.
+ * tests/test-memcmp.c: Likewise.
+ * tests/test-memmem.c: Likewise.
+ * tests/test-memrchr.c: Likewise.
+ * tests/test-mkdir.c: Likewise.
+ * tests/test-mkdirat.c: Likewise.
+ * tests/test-mkfifo.c: Likewise.
+ * tests/test-mkfifoat.c: Likewise.
+ * tests/test-mknod.c: Likewise.
+ * tests/test-nanosleep.c: Likewise.
+ * tests/test-nl_langinfo.c: Likewise.
+ * tests/test-obstack-printf.c: Likewise.
+ * tests/test-open.c: Likewise.
+ * tests/test-openat.c: Likewise.
+ * tests/test-pipe-filter-gi1.c: Likewise.
+ * tests/test-pipe-filter-gi2-main.c: Likewise.
+ * tests/test-pipe-filter-ii1.c: Likewise.
+ * tests/test-pipe-filter-ii2-main.c: Likewise.
+ * tests/test-pipe2.c: Likewise.
+ * tests/test-popen.h: Likewise.
+ * tests/test-posixtm.c: Likewise.
+ * tests/test-pread.c: Likewise.
+ * tests/test-printf-frexp.c: Likewise.
+ * tests/test-printf-frexpl.c: Likewise.
+ * tests/test-printf-posix.c: Likewise.
+ * tests/test-priv-set.c: Likewise.
+ * tests/test-quotearg.c: Likewise.
+ * tests/test-random_r.c: Likewise.
+ * tests/test-rawmemchr.c: Likewise.
+ * tests/test-rbtree_list.c: Likewise.
+ * tests/test-rbtree_oset.c: Likewise.
+ * tests/test-rbtreehash_list.c: Likewise.
+ * tests/test-readlink.c: Likewise.
+ * tests/test-remove.c: Likewise.
+ * tests/test-rename.c: Likewise.
+ * tests/test-renameat.c: Likewise.
+ * tests/test-rmdir.c: Likewise.
+ * tests/test-round1.c: Likewise.
+ * tests/test-roundf1.c: Likewise.
+ * tests/test-roundl.c: Likewise.
+ * tests/test-safe-alloc.c: Likewise.
+ * tests/test-sameacls.c: Likewise.
+ * tests/test-set-mode-acl.c: Likewise.
+ * tests/test-setenv.c: Likewise.
+ * tests/test-sigaction.c: Likewise.
+ * tests/test-signbit.c: Likewise.
+ * tests/test-sleep.c: Likewise.
+ * tests/test-snprintf-posix.c: Likewise.
+ * tests/test-snprintf.c: Likewise.
+ * tests/test-sprintf-posix.c: Likewise.
+ * tests/test-stat-time.c: Likewise.
+ * tests/test-stat.c: Likewise.
+ * tests/test-strcasestr.c: Likewise.
+ * tests/test-strchrnul.c: Likewise.
+ * tests/test-strerror.c: Likewise.
+ * tests/test-striconv.c: Likewise.
+ * tests/test-striconveh.c: Likewise.
+ * tests/test-striconveha.c: Likewise.
+ * tests/test-strsignal.c: Likewise.
+ * tests/test-strstr.c: Likewise.
+ * tests/test-strtod.c: Likewise.
+ * tests/test-strverscmp.c: Likewise.
+ * tests/test-symlink.c: Likewise.
+ * tests/test-symlinkat.c: Likewise.
+ * tests/test-trunc1.c: Likewise.
+ * tests/test-trunc2.c: Likewise.
+ * tests/test-truncf1.c: Likewise.
+ * tests/test-truncf2.c: Likewise.
+ * tests/test-truncl.c: Likewise.
+ * tests/test-uname.c: Likewise.
+ * tests/test-unlink.c: Likewise.
+ * tests/test-unlinkat.c: Likewise.
+ * tests/test-unsetenv.c: Likewise.
+ * tests/test-usleep.c: Likewise.
+ * tests/test-utimens.c: Likewise.
+ * tests/test-utimensat.c: Likewise.
+ * tests/test-vasnprintf-posix.c: Likewise.
+ * tests/test-vasnprintf-posix2.c: Likewise.
+ * tests/test-vasnprintf.c: Likewise.
+ * tests/test-vasprintf-posix.c: Likewise.
+ * tests/test-vasprintf.c: Likewise.
+ * tests/test-vdprintf-posix.c: Likewise.
+ * tests/test-vfprintf-posix.c: Likewise.
+ * tests/test-vprintf-posix.c: Likewise.
+ * tests/test-vsnprintf-posix.c: Likewise.
+ * tests/test-vsnprintf.c: Likewise.
+ * tests/test-vsprintf-posix.c: Likewise.
+ * tests/test-wcrtomb.c: Likewise.
+ * tests/test-wcsnrtombs.c: Likewise.
+ * tests/test-wcsrtombs.c: Likewise.
+ * tests/test-wctype.c: Likewise.
+ * tests/test-wcwidth.c: Likewise.
+ * tests/test-xfprintf-posix.c: Likewise.
+ * tests/test-xmemdup0.c: Likewise.
+ * tests/test-xprintf-posix.c: Likewise.
+ * tests/test-xvasprintf.c: Likewise.
+ * tests/unicase/test-locale-language.c: Likewise.
+ * tests/unicase/test-mapping-part1.h: Likewise.
+ * tests/unicase/test-predicate-part1.h: Likewise.
+ * tests/unicase/test-u8-casecmp.c: Likewise.
+ * tests/unicase/test-u8-casecoll.c: Likewise.
+ * tests/unicase/test-u8-casefold.c: Likewise.
+ * tests/unicase/test-u8-is-cased.c: Likewise.
+ * tests/unicase/test-u8-is-casefolded.c: Likewise.
+ * tests/unicase/test-u8-is-lowercase.c: Likewise.
+ * tests/unicase/test-u8-is-titlecase.c: Likewise.
+ * tests/unicase/test-u8-is-uppercase.c: Likewise.
+ * tests/unicase/test-u8-tolower.c: Likewise.
+ * tests/unicase/test-u8-totitle.c: Likewise.
+ * tests/unicase/test-u8-toupper.c: Likewise.
+ * tests/unicase/test-u16-casecmp.c: Likewise.
+ * tests/unicase/test-u16-casecoll.c: Likewise.
+ * tests/unicase/test-u16-casefold.c: Likewise.
+ * tests/unicase/test-u16-is-cased.c: Likewise.
+ * tests/unicase/test-u16-is-casefolded.c: Likewise.
+ * tests/unicase/test-u16-is-lowercase.c: Likewise.
+ * tests/unicase/test-u16-is-titlecase.c: Likewise.
+ * tests/unicase/test-u16-is-uppercase.c: Likewise.
+ * tests/unicase/test-u16-tolower.c: Likewise.
+ * tests/unicase/test-u16-totitle.c: Likewise.
+ * tests/unicase/test-u16-toupper.c: Likewise.
+ * tests/unicase/test-u32-casecmp.c: Likewise.
+ * tests/unicase/test-u32-casecoll.c: Likewise.
+ * tests/unicase/test-u32-casefold.c: Likewise.
+ * tests/unicase/test-u32-is-cased.c: Likewise.
+ * tests/unicase/test-u32-is-casefolded.c: Likewise.
+ * tests/unicase/test-u32-is-lowercase.c: Likewise.
+ * tests/unicase/test-u32-is-titlecase.c: Likewise.
+ * tests/unicase/test-u32-is-uppercase.c: Likewise.
+ * tests/unicase/test-u32-tolower.c: Likewise.
+ * tests/unicase/test-u32-totitle.c: Likewise.
+ * tests/unicase/test-u32-toupper.c: Likewise.
+ * tests/unicase/test-ulc-casecmp.c: Likewise.
+ * tests/unicase/test-ulc-casecoll.c: Likewise.
+ * tests/uniconv/test-u8-conv-from-enc.c: Likewise.
+ * tests/uniconv/test-u8-conv-to-enc.c: Likewise.
+ * tests/uniconv/test-u8-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u8-strconv-to-enc.c: Likewise.
+ * tests/uniconv/test-u16-conv-from-enc.c: Likewise.
+ * tests/uniconv/test-u16-conv-to-enc.c: Likewise.
+ * tests/uniconv/test-u16-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u16-strconv-to-enc.c: Likewise.
+ * tests/uniconv/test-u32-conv-from-enc.c: Likewise.
+ * tests/uniconv/test-u32-conv-to-enc.c: Likewise.
+ * tests/uniconv/test-u32-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u32-strconv-to-enc.c: Likewise.
+ * tests/unictype/test-bidi_byname.c: Likewise.
+ * tests/unictype/test-bidi_name.c: Likewise.
+ * tests/unictype/test-bidi_of.c: Likewise.
+ * tests/unictype/test-bidi_test.c: Likewise.
+ * tests/unictype/test-block_list.c: Likewise.
+ * tests/unictype/test-block_of.c: Likewise.
+ * tests/unictype/test-block_test.c: Likewise.
+ * tests/unictype/test-categ_and.c: Likewise.
+ * tests/unictype/test-categ_and_not.c: Likewise.
+ * tests/unictype/test-categ_byname.c: Likewise.
+ * tests/unictype/test-categ_name.c: Likewise.
+ * tests/unictype/test-categ_none.c: Likewise.
+ * tests/unictype/test-categ_of.c: Likewise.
+ * tests/unictype/test-categ_or.c: Likewise.
+ * tests/unictype/test-categ_test_withtable.c: Likewise.
+ * tests/unictype/test-combining.c: Likewise.
+ * tests/unictype/test-decdigit.c: Likewise.
+ * tests/unictype/test-digit.c: Likewise.
+ * tests/unictype/test-mirror.c: Likewise.
+ * tests/unictype/test-numeric.c: Likewise.
+ * tests/unictype/test-pr_byname.c: Likewise.
+ * tests/unictype/test-pr_test.c: Likewise.
+ * tests/unictype/test-predicate-part1.h: Likewise.
+ * tests/unictype/test-scripts.c: Likewise.
+ * tests/unictype/test-sy_c_ident.c: Likewise.
+ * tests/unictype/test-sy_java_ident.c: Likewise.
+ * tests/unilbrk/test-u8-possible-linebreaks.c: Likewise.
+ * tests/unilbrk/test-u8-width-linebreaks.c: Likewise.
+ * tests/unilbrk/test-u16-possible-linebreaks.c: Likewise.
+ * tests/unilbrk/test-u16-width-linebreaks.c: Likewise.
+ * tests/unilbrk/test-u32-possible-linebreaks.c: Likewise.
+ * tests/unilbrk/test-u32-width-linebreaks.c: Likewise.
+ * tests/unilbrk/test-ulc-possible-linebreaks.c: Likewise.
+ * tests/unilbrk/test-ulc-width-linebreaks.c: Likewise.
+ * tests/uninorm/test-canonical-decomposition.c: Likewise.
+ * tests/uninorm/test-compat-decomposition.c: Likewise.
+ * tests/uninorm/test-composition.c: Likewise.
+ * tests/uninorm/test-decomposing-form.c: Likewise.
+ * tests/uninorm/test-decomposition.c: Likewise.
+ * tests/uninorm/test-u8-nfc.c: Likewise.
+ * tests/uninorm/test-u8-nfd.c: Likewise.
+ * tests/uninorm/test-u8-nfkc.c: Likewise.
+ * tests/uninorm/test-u8-nfkd.c: Likewise.
+ * tests/uninorm/test-u8-normcmp.c: Likewise.
+ * tests/uninorm/test-u8-normcoll.c: Likewise.
+ * tests/uninorm/test-u16-nfc.c: Likewise.
+ * tests/uninorm/test-u16-nfd.c: Likewise.
+ * tests/uninorm/test-u16-nfkc.c: Likewise.
+ * tests/uninorm/test-u16-nfkd.c: Likewise.
+ * tests/uninorm/test-u16-normcmp.c: Likewise.
+ * tests/uninorm/test-u16-normcoll.c: Likewise.
+ * tests/uninorm/test-u32-nfc.c: Likewise.
+ * tests/uninorm/test-u32-nfd.c: Likewise.
+ * tests/uninorm/test-u32-nfkc.c: Likewise.
+ * tests/uninorm/test-u32-nfkd.c: Likewise.
+ * tests/uninorm/test-u32-normalize-big.c: Likewise.
+ * tests/uninorm/test-u32-normcmp.c: Likewise.
+ * tests/uninorm/test-u32-normcoll.c: Likewise.
+ * tests/uninorm/test-uninorm-filter-nfc.c: Likewise.
+ * tests/unistdio/test-u8-asnprintf1.c: Likewise.
+ * tests/unistdio/test-u8-vasnprintf1.c: Likewise.
+ * tests/unistdio/test-u8-vasnprintf2.c: Likewise.
+ * tests/unistdio/test-u8-vasnprintf3.c: Likewise.
+ * tests/unistdio/test-u8-vasprintf1.c: Likewise.
+ * tests/unistdio/test-u8-vsnprintf1.c: Likewise.
+ * tests/unistdio/test-u8-vsprintf1.c: Likewise.
+ * tests/unistdio/test-u16-asnprintf1.c: Likewise.
+ * tests/unistdio/test-u16-vasnprintf1.c: Likewise.
+ * tests/unistdio/test-u16-vasnprintf2.c: Likewise.
+ * tests/unistdio/test-u16-vasnprintf3.c: Likewise.
+ * tests/unistdio/test-u16-vasprintf1.c: Likewise.
+ * tests/unistdio/test-u16-vsnprintf1.c: Likewise.
+ * tests/unistdio/test-u16-vsprintf1.c: Likewise.
+ * tests/unistdio/test-u32-asnprintf1.c: Likewise.
+ * tests/unistdio/test-u32-vasnprintf1.c: Likewise.
+ * tests/unistdio/test-u32-vasnprintf2.c: Likewise.
+ * tests/unistdio/test-u32-vasnprintf3.c: Likewise.
+ * tests/unistdio/test-u32-vasprintf1.c: Likewise.
+ * tests/unistdio/test-u32-vsnprintf1.c: Likewise.
+ * tests/unistdio/test-u32-vsprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-asnprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-vasnprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-vasnprintf2.c: Likewise.
+ * tests/unistdio/test-ulc-vasnprintf3.c: Likewise.
+ * tests/unistdio/test-ulc-vasprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-vsnprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-vsprintf1.c: Likewise.
+ * tests/uniwbrk/test-u8-wordbreaks.c: Likewise.
+ * tests/uniwbrk/test-u16-wordbreaks.c: Likewise.
+ * tests/uniwbrk/test-u32-wordbreaks.c: Likewise.
+ * tests/uniwbrk/test-ulc-wordbreaks.c: Likewise.
+ * tests/uniwidth/test-u8-strwidth.c: Likewise.
+ * tests/uniwidth/test-u8-width.c: Likewise.
+ * tests/uniwidth/test-u16-strwidth.c: Likewise.
+ * tests/uniwidth/test-u16-width.c: Likewise.
+ * tests/uniwidth/test-u32-strwidth.c: Likewise.
+ * tests/uniwidth/test-u32-width.c: Likewise.
+ * tests/uniwidth/test-uc_width.c: Likewise.
+ * tests/uniwidth/test-uc_width2.c: Likewise.
+ * modules/acl-tests (Files): Add tests/macros.h.
+ * modules/areadlink-tests (Files): Likewise.
+ * modules/areadlink-with-size-tests (Files): Likewise.
+ * modules/areadlinkat-tests (Files): Likewise.
+ * modules/areadlinkat-with-size-tests (Files): Likewise.
+ * modules/argmatch-tests (Files): Likewise.
+ * modules/argv-iter-tests (Files): Likewise.
+ * modules/array-list-tests (Files): Likewise.
+ * modules/array-mergesort-tests (Files): Likewise.
+ * modules/array-oset-tests (Files): Likewise.
+ * modules/avltree-list-tests (Files): Likewise.
+ * modules/avltree-oset-tests (Files): Likewise.
+ * modules/avltreehash-list-tests (Files): Likewise.
+ * modules/base64-tests (Files): Likewise.
+ * modules/binary-io-tests (Files): Likewise.
+ * modules/bitrotate-tests (Files): Likewise.
+ * modules/btowc-tests (Files): Likewise.
+ * modules/byteswap-tests (Files): Likewise.
+ * modules/c-ctype-tests (Files): Likewise.
+ * modules/c-stack-tests (Files): Likewise.
+ * modules/c-strcase-tests (Files): Likewise.
+ * modules/c-strcasestr-tests (Files): Likewise.
+ * modules/c-strstr-tests (Files): Likewise.
+ * modules/canonicalize-lgpl-tests (Files): Likewise.
+ * modules/canonicalize-tests (Files): Likewise.
+ * modules/carray-list-tests (Files): Likewise.
+ * modules/ceilf-tests (Files): Likewise.
+ * modules/ceill-tests (Files): Likewise.
+ * modules/chown-tests (Files): Likewise.
+ * modules/cloexec-tests (Files): Likewise.
+ * modules/copy-file-tests (Files): Likewise.
+ * modules/count-one-bits-tests (Files): Likewise.
+ * modules/dprintf-posix-tests (Files): Likewise.
+ * modules/dup2-tests (Files): Likewise.
+ * modules/dup3-tests (Files): Likewise.
+ * modules/duplocale-tests (Files): Likewise.
+ * modules/fbufmode-tests (Files): Likewise.
+ * modules/fchdir-tests (Files): Likewise.
+ * modules/fcntl-safer-tests (Files): Likewise.
+ * modules/fcntl-tests (Files): Likewise.
+ * modules/fdopendir-tests (Files): Likewise.
+ * modules/fdutimensat-tests (Files): Likewise.
+ * modules/fflush-tests (Files): Likewise.
+ * modules/filevercmp-tests (Files): Likewise.
+ * modules/flock-tests (Files): Likewise.
+ * modules/floorf-tests (Files): Likewise.
+ * modules/floorl-tests (Files): Likewise.
+ * modules/fnmatch-tests (Files): Likewise.
+ * modules/fopen-safer-tests (Files): Likewise.
+ * modules/fopen-tests (Files): Likewise.
+ * modules/fpending-tests (Files): Likewise.
+ * modules/fprintf-posix-tests (Files): Likewise.
+ * modules/fpurge-tests (Files): Likewise.
+ * modules/freadable-tests (Files): Likewise.
+ * modules/freadahead-tests (Files): Likewise.
+ * modules/freading-tests (Files): Likewise.
+ * modules/freadptr-tests (Files): Likewise.
+ * modules/freadseek-tests (Files): Likewise.
+ * modules/freopen-tests (Files): Likewise.
+ * modules/frexp-nolibm-tests (Files): Likewise.
+ * modules/frexp-tests (Files): Likewise.
+ * modules/frexpl-nolibm-tests (Files): Likewise.
+ * modules/frexpl-tests (Files): Likewise.
+ * modules/fseek-tests (Files): Likewise.
+ * modules/fseeko-tests (Files): Likewise.
+ * modules/fstrcmp-tests (Files): Likewise.
+ * modules/fsync-tests (Files): Likewise.
+ * modules/ftell-tests (Files): Likewise.
+ * modules/ftello-tests (Files): Likewise.
+ * modules/func-tests (Files): Likewise.
+ * modules/futimens-tests (Files): Likewise.
+ * modules/fwritable-tests (Files): Likewise.
+ * modules/fwriting-tests (Files): Likewise.
+ * modules/getcwd-tests (Files): Likewise.
+ * modules/getdate-tests (Files): Likewise.
+ * modules/getdelim-tests (Files): Likewise.
+ * modules/getdtablesize-tests (Files): Likewise.
+ * modules/getgroups-tests (Files): Likewise.
+ * modules/getline-tests (Files): Likewise.
+ * modules/getndelim2-tests (Files): Likewise.
+ * modules/glob-tests (Files): Likewise.
+ * modules/hash-tests (Files): Likewise.
+ * modules/i-ring-tests (Files): Likewise.
+ * modules/iconv-tests (Files): Likewise.
+ * modules/iconv_open-utf-tests (Files): Likewise.
+ * modules/idpriv-drop-tests (Files): Likewise.
+ * modules/idpriv-droptemp-tests (Files): Likewise.
+ * modules/inet_ntop-tests (Files): Likewise.
+ * modules/inet_pton-tests (Files): Likewise.
+ * modules/isblank-tests (Files): Likewise.
+ * modules/isfinite-tests (Files): Likewise.
+ * modules/isinf-tests (Files): Likewise.
+ * modules/isnan-tests (Files): Likewise.
+ * modules/isnand-nolibm-tests (Files): Likewise.
+ * modules/isnand-tests (Files): Likewise.
+ * modules/isnanf-nolibm-tests (Files): Likewise.
+ * modules/isnanf-tests (Files): Likewise.
+ * modules/isnanl-nolibm-tests (Files): Likewise.
+ * modules/isnanl-tests (Files): Likewise.
+ * modules/lchown-tests (Files): Likewise.
+ * modules/ldexpl-tests (Files): Likewise.
+ * modules/link-tests (Files): Likewise.
+ * modules/linkat-tests (Files): Likewise.
+ * modules/linked-list-tests (Files): Likewise.
+ * modules/linkedhash-list-tests (Files): Likewise.
+ * modules/localename-tests (Files): Likewise.
+ * modules/lseek-tests (Files): Likewise.
+ * modules/lstat-tests (Files): Likewise.
+ * modules/mbmemcasecmp-tests (Files): Likewise.
+ * modules/mbmemcasecoll-tests (Files): Likewise.
+ * modules/mbrtowc-tests (Files): Likewise.
+ * modules/mbscasecmp-tests (Files): Likewise.
+ * modules/mbscasestr-tests (Files): Likewise.
+ * modules/mbschr-tests (Files): Likewise.
+ * modules/mbscspn-tests (Files): Likewise.
+ * modules/mbsinit-tests (Files): Likewise.
+ * modules/mbsncasecmp-tests (Files): Likewise.
+ * modules/mbsnrtowcs-tests (Files): Likewise.
+ * modules/mbspbrk-tests (Files): Likewise.
+ * modules/mbspcasecmp-tests (Files): Likewise.
+ * modules/mbsrchr-tests (Files): Likewise.
+ * modules/mbsrtowcs-tests (Files): Likewise.
+ * modules/mbsspn-tests (Files): Likewise.
+ * modules/mbsstr-tests (Files): Likewise.
+ * modules/memchr-tests (Files): Likewise.
+ * modules/memchr2-tests (Files): Likewise.
+ * modules/memcmp-tests (Files): Likewise.
+ * modules/memmem-tests (Files): Likewise.
+ * modules/memrchr-tests (Files): Likewise.
+ * modules/mkdir-tests (Files): Likewise.
+ * modules/mkfifo-tests (Files): Likewise.
+ * modules/mkfifoat-tests (Files): Likewise.
+ * modules/mknod-tests (Files): Likewise.
+ * modules/nanosleep-tests (Files): Likewise.
+ * modules/nl_langinfo-tests (Files): Likewise.
+ * modules/obstack-printf-tests (Files): Likewise.
+ * modules/open-tests (Files): Likewise.
+ * modules/openat-tests (Files): Likewise.
+ * modules/pipe-filter-gi-tests (Files): Likewise.
+ * modules/pipe-filter-ii-tests (Files): Likewise.
+ * modules/pipe2-tests (Files): Likewise.
+ * modules/popen-safer-tests (Files): Likewise.
+ * modules/popen-tests (Files): Likewise.
+ * modules/posixtm-tests (Files): Likewise.
+ * modules/pread-tests (Files): Likewise.
+ * modules/printf-frexp-tests (Files): Likewise.
+ * modules/printf-frexpl-tests (Files): Likewise.
+ * modules/printf-posix-tests (Files): Likewise.
+ * modules/priv-set-tests (Files): Likewise.
+ * modules/quotearg-tests (Files): Likewise.
+ * modules/random_r-tests (Files): Likewise.
+ * modules/rawmemchr-tests (Files): Likewise.
+ * modules/rbtree-list-tests (Files): Likewise.
+ * modules/rbtree-oset-tests (Files): Likewise.
+ * modules/rbtreehash-list-tests (Files): Likewise.
+ * modules/readlink-tests (Files): Likewise.
+ * modules/remove-tests (Files): Likewise.
+ * modules/rename-tests (Files): Likewise.
+ * modules/renameat-tests (Files): Likewise.
+ * modules/rmdir-tests (Files): Likewise.
+ * modules/round-tests (Files): Likewise.
+ * modules/roundf-tests (Files): Likewise.
+ * modules/roundl-tests (Files): Likewise.
+ * modules/safe-alloc-tests (Files): Likewise.
+ * modules/setenv-tests (Files): Likewise.
+ * modules/sigaction-tests (Files): Likewise.
+ * modules/signbit-tests (Files): Likewise.
+ * modules/sleep-tests (Files): Likewise.
+ * modules/snprintf-posix-tests (Files): Likewise.
+ * modules/snprintf-tests (Files): Likewise.
+ * modules/sprintf-posix-tests (Files): Likewise.
+ * modules/stat-tests (Files): Likewise.
+ * modules/stat-time-tests (Files): Likewise.
+ * modules/strcasestr-tests (Files): Likewise.
+ * modules/strchrnul-tests (Files): Likewise.
+ * modules/strerror-tests (Files): Likewise.
+ * modules/striconv-tests (Files): Likewise.
+ * modules/striconveh-tests (Files): Likewise.
+ * modules/striconveha-tests (Files): Likewise.
+ * modules/strsignal-tests (Files): Likewise.
+ * modules/strstr-tests (Files): Likewise.
+ * modules/strtod-tests (Files): Likewise.
+ * modules/strverscmp-tests (Files): Likewise.
+ * modules/symlink-tests (Files): Likewise.
+ * modules/symlinkat-tests (Files): Likewise.
+ * modules/trunc-tests (Files): Likewise.
+ * modules/truncf-tests (Files): Likewise.
+ * modules/truncl-tests (Files): Likewise.
+ * modules/uname-tests (Files): Likewise.
+ * modules/unicase/cased-tests (Files): Likewise.
+ * modules/unicase/ignorable-tests (Files): Likewise.
+ * modules/unicase/locale-language-tests (Files): Likewise.
+ * modules/unicase/tolower-tests (Files): Likewise.
+ * modules/unicase/totitle-tests (Files): Likewise.
+ * modules/unicase/toupper-tests (Files): Likewise.
+ * modules/unicase/u8-casecmp-tests (Files): Likewise.
+ * modules/unicase/u8-casecoll-tests (Files): Likewise.
+ * modules/unicase/u8-casefold-tests (Files): Likewise.
+ * modules/unicase/u8-is-cased-tests (Files): Likewise.
+ * modules/unicase/u8-is-casefolded-tests (Files): Likewise.
+ * modules/unicase/u8-is-lowercase-tests (Files): Likewise.
+ * modules/unicase/u8-is-titlecase-tests (Files): Likewise.
+ * modules/unicase/u8-is-uppercase-tests (Files): Likewise.
+ * modules/unicase/u8-tolower-tests (Files): Likewise.
+ * modules/unicase/u8-totitle-tests (Files): Likewise.
+ * modules/unicase/u8-toupper-tests (Files): Likewise.
+ * modules/unicase/u16-casecmp-tests (Files): Likewise.
+ * modules/unicase/u16-casecoll-tests (Files): Likewise.
+ * modules/unicase/u16-casefold-tests (Files): Likewise.
+ * modules/unicase/u16-is-cased-tests (Files): Likewise.
+ * modules/unicase/u16-is-casefolded-tests (Files): Likewise.
+ * modules/unicase/u16-is-lowercase-tests (Files): Likewise.
+ * modules/unicase/u16-is-titlecase-tests (Files): Likewise.
+ * modules/unicase/u16-is-uppercase-tests (Files): Likewise.
+ * modules/unicase/u16-tolower-tests (Files): Likewise.
+ * modules/unicase/u16-totitle-tests (Files): Likewise.
+ * modules/unicase/u16-toupper-tests (Files): Likewise.
+ * modules/unicase/u32-casecmp-tests (Files): Likewise.
+ * modules/unicase/u32-casecoll-tests (Files): Likewise.
+ * modules/unicase/u32-casefold-tests (Files): Likewise.
+ * modules/unicase/u32-is-cased-tests (Files): Likewise.
+ * modules/unicase/u32-is-casefolded-tests (Files): Likewise.
+ * modules/unicase/u32-is-lowercase-tests (Files): Likewise.
+ * modules/unicase/u32-is-titlecase-tests (Files): Likewise.
+ * modules/unicase/u32-is-uppercase-tests (Files): Likewise.
+ * modules/unicase/u32-tolower-tests (Files): Likewise.
+ * modules/unicase/u32-totitle-tests (Files): Likewise.
+ * modules/unicase/u32-toupper-tests (Files): Likewise.
+ * modules/unicase/ulc-casecmp-tests (Files): Likewise.
+ * modules/unicase/ulc-casecoll-tests (Files): Likewise.
+ * modules/uniconv/u8-conv-from-enc-tests (Files): Likewise.
+ * modules/uniconv/u8-conv-to-enc-tests (Files): Likewise.
+ * modules/uniconv/u8-strconv-from-enc-tests (Files): Likewise.
+ * modules/uniconv/u8-strconv-to-enc-tests (Files): Likewise.
+ * modules/uniconv/u16-conv-from-enc-tests (Files): Likewise.
+ * modules/uniconv/u16-conv-to-enc-tests (Files): Likewise.
+ * modules/uniconv/u16-strconv-from-enc-tests (Files): Likewise.
+ * modules/uniconv/u16-strconv-to-enc-tests (Files): Likewise.
+ * modules/uniconv/u32-conv-from-enc-tests (Files): Likewise.
+ * modules/uniconv/u32-conv-to-enc-tests (Files): Likewise.
+ * modules/uniconv/u32-strconv-from-enc-tests (Files): Likewise.
+ * modules/uniconv/u32-strconv-to-enc-tests (Files): Likewise.
+ * modules/unictype/bidicategory-byname-tests (Files): Likewise.
+ * modules/unictype/bidicategory-name-tests (Files): Likewise.
+ * modules/unictype/bidicategory-of-tests (Files): Likewise.
+ * modules/unictype/bidicategory-test-tests (Files): Likewise.
+ * modules/unictype/block-list-tests (Files): Likewise.
+ * modules/unictype/block-of-tests (Files): Likewise.
+ * modules/unictype/block-test-tests (Files): Likewise.
+ * modules/unictype/category-C-tests (Files): Likewise.
+ * modules/unictype/category-Cc-tests (Files): Likewise.
+ * modules/unictype/category-Cf-tests (Files): Likewise.
+ * modules/unictype/category-Cn-tests (Files): Likewise.
+ * modules/unictype/category-Co-tests (Files): Likewise.
+ * modules/unictype/category-Cs-tests (Files): Likewise.
+ * modules/unictype/category-L-tests (Files): Likewise.
+ * modules/unictype/category-Ll-tests (Files): Likewise.
+ * modules/unictype/category-Lm-tests (Files): Likewise.
+ * modules/unictype/category-Lo-tests (Files): Likewise.
+ * modules/unictype/category-Lt-tests (Files): Likewise.
+ * modules/unictype/category-Lu-tests (Files): Likewise.
+ * modules/unictype/category-M-tests (Files): Likewise.
+ * modules/unictype/category-Mc-tests (Files): Likewise.
+ * modules/unictype/category-Me-tests (Files): Likewise.
+ * modules/unictype/category-Mn-tests (Files): Likewise.
+ * modules/unictype/category-N-tests (Files): Likewise.
+ * modules/unictype/category-Nd-tests (Files): Likewise.
+ * modules/unictype/category-Nl-tests (Files): Likewise.
+ * modules/unictype/category-No-tests (Files): Likewise.
+ * modules/unictype/category-P-tests (Files): Likewise.
+ * modules/unictype/category-Pc-tests (Files): Likewise.
+ * modules/unictype/category-Pd-tests (Files): Likewise.
+ * modules/unictype/category-Pe-tests (Files): Likewise.
+ * modules/unictype/category-Pf-tests (Files): Likewise.
+ * modules/unictype/category-Pi-tests (Files): Likewise.
+ * modules/unictype/category-Po-tests (Files): Likewise.
+ * modules/unictype/category-Ps-tests (Files): Likewise.
+ * modules/unictype/category-S-tests (Files): Likewise.
+ * modules/unictype/category-Sc-tests (Files): Likewise.
+ * modules/unictype/category-Sk-tests (Files): Likewise.
+ * modules/unictype/category-Sm-tests (Files): Likewise.
+ * modules/unictype/category-So-tests (Files): Likewise.
+ * modules/unictype/category-Z-tests (Files): Likewise.
+ * modules/unictype/category-Zl-tests (Files): Likewise.
+ * modules/unictype/category-Zp-tests (Files): Likewise.
+ * modules/unictype/category-Zs-tests (Files): Likewise.
+ * modules/unictype/category-and-not-tests (Files): Likewise.
+ * modules/unictype/category-and-tests (Files): Likewise.
+ * modules/unictype/category-byname-tests (Files): Likewise.
+ * modules/unictype/category-name-tests (Files): Likewise.
+ * modules/unictype/category-none-tests (Files): Likewise.
+ * modules/unictype/category-of-tests (Files): Likewise.
+ * modules/unictype/category-or-tests (Files): Likewise.
+ * modules/unictype/category-test-withtable-tests (Files): Likewise.
+ * modules/unictype/combining-class-tests (Files): Likewise.
+ * modules/unictype/ctype-alnum-tests (Files): Likewise.
+ * modules/unictype/ctype-alpha-tests (Files): Likewise.
+ * modules/unictype/ctype-blank-tests (Files): Likewise.
+ * modules/unictype/ctype-cntrl-tests (Files): Likewise.
+ * modules/unictype/ctype-digit-tests (Files): Likewise.
+ * modules/unictype/ctype-graph-tests (Files): Likewise.
+ * modules/unictype/ctype-lower-tests (Files): Likewise.
+ * modules/unictype/ctype-print-tests (Files): Likewise.
+ * modules/unictype/ctype-punct-tests (Files): Likewise.
+ * modules/unictype/ctype-space-tests (Files): Likewise.
+ * modules/unictype/ctype-upper-tests (Files): Likewise.
+ * modules/unictype/ctype-xdigit-tests (Files): Likewise.
+ * modules/unictype/decimal-digit-tests (Files): Likewise.
+ * modules/unictype/digit-tests (Files): Likewise.
+ * modules/unictype/mirror-tests (Files): Likewise.
+ * modules/unictype/numeric-tests (Files): Likewise.
+ * modules/unictype/property-alphabetic-tests (Files): Likewise.
+ * modules/unictype/property-ascii-hex-digit-tests (Files): Likewise.
+ * modules/unictype/property-bidi-arabic-digit-tests (Files): Likewise.
+ * modules/unictype/property-bidi-arabic-right-to-left-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-block-separator-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-boundary-neutral-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-common-separator-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-control-tests (Files): Likewise.
+ * modules/unictype/property-bidi-embedding-or-override-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-eur-num-separator-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-eur-num-terminator-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-european-digit-tests (Files): Likewise.
+ * modules/unictype/property-bidi-hebrew-right-to-left-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-left-to-right-tests (Files): Likewise.
+ * modules/unictype/property-bidi-non-spacing-mark-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-other-neutral-tests (Files): Likewise.
+ * modules/unictype/property-bidi-pdf-tests (Files): Likewise.
+ * modules/unictype/property-bidi-segment-separator-tests (Files):
+ Likewise.
+ * modules/unictype/property-bidi-whitespace-tests (Files): Likewise.
+ * modules/unictype/property-byname-tests (Files): Likewise.
+ * modules/unictype/property-combining-tests (Files): Likewise.
+ * modules/unictype/property-composite-tests (Files): Likewise.
+ * modules/unictype/property-currency-symbol-tests (Files): Likewise.
+ * modules/unictype/property-dash-tests (Files): Likewise.
+ * modules/unictype/property-decimal-digit-tests (Files): Likewise.
+ * modules/unictype/property-default-ignorable-code-point-tests (Files):
+ Likewise.
+ * modules/unictype/property-deprecated-tests (Files): Likewise.
+ * modules/unictype/property-diacritic-tests (Files): Likewise.
+ * modules/unictype/property-extender-tests (Files): Likewise.
+ * modules/unictype/property-format-control-tests (Files): Likewise.
+ * modules/unictype/property-grapheme-base-tests (Files): Likewise.
+ * modules/unictype/property-grapheme-extend-tests (Files): Likewise.
+ * modules/unictype/property-grapheme-link-tests (Files): Likewise.
+ * modules/unictype/property-hex-digit-tests (Files): Likewise.
+ * modules/unictype/property-hyphen-tests (Files): Likewise.
+ * modules/unictype/property-id-continue-tests (Files): Likewise.
+ * modules/unictype/property-id-start-tests (Files): Likewise.
+ * modules/unictype/property-ideographic-tests (Files): Likewise.
+ * modules/unictype/property-ids-binary-operator-tests (Files): Likewise.
+ * modules/unictype/property-ids-trinary-operator-tests (Files):
+ Likewise.
+ * modules/unictype/property-ignorable-control-tests (Files): Likewise.
+ * modules/unictype/property-iso-control-tests (Files): Likewise.
+ * modules/unictype/property-join-control-tests (Files): Likewise.
+ * modules/unictype/property-left-of-pair-tests (Files): Likewise.
+ * modules/unictype/property-line-separator-tests (Files): Likewise.
+ * modules/unictype/property-logical-order-exception-tests (Files):
+ Likewise.
+ * modules/unictype/property-lowercase-tests (Files): Likewise.
+ * modules/unictype/property-math-tests (Files): Likewise.
+ * modules/unictype/property-non-break-tests (Files): Likewise.
+ * modules/unictype/property-not-a-character-tests (Files): Likewise.
+ * modules/unictype/property-numeric-tests (Files): Likewise.
+ * modules/unictype/property-other-alphabetic-tests (Files): Likewise.
+ * modules/unictype/property-other-default-ignorable-code-point-tests
+ (Files): Likewise.
+ * modules/unictype/property-other-grapheme-extend-tests (Files):
+ Likewise.
+ * modules/unictype/property-other-id-continue-tests (Files): Likewise.
+ * modules/unictype/property-other-id-start-tests (Files): Likewise.
+ * modules/unictype/property-other-lowercase-tests (Files): Likewise.
+ * modules/unictype/property-other-math-tests (Files): Likewise.
+ * modules/unictype/property-other-uppercase-tests (Files): Likewise.
+ * modules/unictype/property-paired-punctuation-tests (Files): Likewise.
+ * modules/unictype/property-paragraph-separator-tests (Files): Likewise.
+ * modules/unictype/property-pattern-syntax-tests (Files): Likewise.
+ * modules/unictype/property-pattern-white-space-tests (Files): Likewise.
+ * modules/unictype/property-private-use-tests (Files): Likewise.
+ * modules/unictype/property-punctuation-tests (Files): Likewise.
+ * modules/unictype/property-quotation-mark-tests (Files): Likewise.
+ * modules/unictype/property-radical-tests (Files): Likewise.
+ * modules/unictype/property-sentence-terminal-tests (Files): Likewise.
+ * modules/unictype/property-soft-dotted-tests (Files): Likewise.
+ * modules/unictype/property-space-tests (Files): Likewise.
+ * modules/unictype/property-terminal-punctuation-tests (Files):
+ Likewise.
+ * modules/unictype/property-test-tests (Files): Likewise.
+ * modules/unictype/property-titlecase-tests (Files): Likewise.
+ * modules/unictype/property-unassigned-code-value-tests (Files):
+ Likewise.
+ * modules/unictype/property-unified-ideograph-tests (Files): Likewise.
+ * modules/unictype/property-uppercase-tests (Files): Likewise.
+ * modules/unictype/property-variation-selector-tests (Files): Likewise.
+ * modules/unictype/property-white-space-tests (Files): Likewise.
+ * modules/unictype/property-xid-continue-tests (Files): Likewise.
+ * modules/unictype/property-xid-start-tests (Files): Likewise.
+ * modules/unictype/property-zero-width-tests (Files): Likewise.
+ * modules/unictype/scripts-tests (Files): Likewise.
+ * modules/unictype/syntax-c-ident-tests (Files): Likewise.
+ * modules/unictype/syntax-c-whitespace-tests (Files): Likewise.
+ * modules/unictype/syntax-java-ident-tests (Files): Likewise.
+ * modules/unictype/syntax-java-whitespace-tests (Files): Likewise.
+ * modules/unilbrk/u8-possible-linebreaks-tests (Files): Likewise.
+ * modules/unilbrk/u8-width-linebreaks-tests (Files): Likewise.
+ * modules/unilbrk/u16-possible-linebreaks-tests (Files): Likewise.
+ * modules/unilbrk/u16-width-linebreaks-tests (Files): Likewise.
+ * modules/unilbrk/u32-possible-linebreaks-tests (Files): Likewise.
+ * modules/unilbrk/u32-width-linebreaks-tests (Files): Likewise.
+ * modules/unilbrk/ulc-possible-linebreaks-tests (Files): Likewise.
+ * modules/unilbrk/ulc-width-linebreaks-tests (Files): Likewise.
+ * modules/uninorm/canonical-decomposition-tests (Files): Likewise.
+ * modules/uninorm/compat-decomposition-tests (Files): Likewise.
+ * modules/uninorm/composition-tests (Files): Likewise.
+ * modules/uninorm/decomposing-form-tests (Files): Likewise.
+ * modules/uninorm/decomposition-tests (Files): Likewise.
+ * modules/uninorm/filter-tests (Files): Likewise.
+ * modules/uninorm/nfc-tests (Files): Likewise.
+ * modules/uninorm/nfd-tests (Files): Likewise.
+ * modules/uninorm/nfkc-tests (Files): Likewise.
+ * modules/uninorm/nfkd-tests (Files): Likewise.
+ * modules/uninorm/u8-normcmp-tests (Files): Likewise.
+ * modules/uninorm/u8-normcoll-tests (Files): Likewise.
+ * modules/uninorm/u16-normcmp-tests (Files): Likewise.
+ * modules/uninorm/u16-normcoll-tests (Files): Likewise.
+ * modules/uninorm/u32-normcmp-tests (Files): Likewise.
+ * modules/uninorm/u32-normcoll-tests (Files): Likewise.
+ * modules/unistdio/u8-asnprintf-tests (Files): Likewise.
+ * modules/unistdio/u8-vasnprintf-tests (Files): Likewise.
+ * modules/unistdio/u8-vasprintf-tests (Files): Likewise.
+ * modules/unistdio/u8-vsnprintf-tests (Files): Likewise.
+ * modules/unistdio/u8-vsprintf-tests (Files): Likewise.
+ * modules/unistdio/u16-asnprintf-tests (Files): Likewise.
+ * modules/unistdio/u16-vasnprintf-tests (Files): Likewise.
+ * modules/unistdio/u16-vasprintf-tests (Files): Likewise.
+ * modules/unistdio/u16-vsnprintf-tests (Files): Likewise.
+ * modules/unistdio/u16-vsprintf-tests (Files): Likewise.
+ * modules/unistdio/u32-asnprintf-tests (Files): Likewise.
+ * modules/unistdio/u32-vasnprintf-tests (Files): Likewise.
+ * modules/unistdio/u32-vasprintf-tests (Files): Likewise.
+ * modules/unistdio/u32-vsnprintf-tests (Files): Likewise.
+ * modules/unistdio/u32-vsprintf-tests (Files): Likewise.
+ * modules/unistdio/ulc-asnprintf-tests (Files): Likewise.
+ * modules/unistdio/ulc-vasnprintf-tests (Files): Likewise.
+ * modules/unistdio/ulc-vasprintf-tests (Files): Likewise.
+ * modules/unistdio/ulc-vsnprintf-tests (Files): Likewise.
+ * modules/unistdio/ulc-vsprintf-tests (Files): Likewise.
+ * modules/uniwbrk/u8-wordbreaks-tests (Files): Likewise.
+ * modules/uniwbrk/u16-wordbreaks-tests (Files): Likewise.
+ * modules/uniwbrk/u32-wordbreaks-tests (Files): Likewise.
+ * modules/uniwbrk/ulc-wordbreaks-tests (Files): Likewise.
+ * modules/uniwidth/u8-strwidth-tests (Files): Likewise.
+ * modules/uniwidth/u8-width-tests (Files): Likewise.
+ * modules/uniwidth/u16-strwidth-tests (Files): Likewise.
+ * modules/uniwidth/u16-width-tests (Files): Likewise.
+ * modules/uniwidth/u32-strwidth-tests (Files): Likewise.
+ * modules/uniwidth/u32-width-tests (Files): Likewise.
+ * modules/uniwidth/width-tests (Files): Likewise.
+ * modules/unlink-tests (Files): Likewise.
+ * modules/unsetenv-tests (Files): Likewise.
+ * modules/usleep-tests (Files): Likewise.
+ * modules/utimens-tests (Files): Likewise.
+ * modules/utimensat-tests (Files): Likewise.
+ * modules/vasnprintf-posix-tests (Files): Likewise.
+ * modules/vasnprintf-tests (Files): Likewise.
+ * modules/vasprintf-posix-tests (Files): Likewise.
+ * modules/vasprintf-tests (Files): Likewise.
+ * modules/vdprintf-posix-tests (Files): Likewise.
+ * modules/vfprintf-posix-tests (Files): Likewise.
+ * modules/vprintf-posix-tests (Files): Likewise.
+ * modules/vsnprintf-posix-tests (Files): Likewise.
+ * modules/vsnprintf-tests (Files): Likewise.
+ * modules/vsprintf-posix-tests (Files): Likewise.
+ * modules/wcrtomb-tests (Files): Likewise.
+ * modules/wcsnrtombs-tests (Files): Likewise.
+ * modules/wcsrtombs-tests (Files): Likewise.
+ * modules/wctype-tests (Files): Likewise.
+ * modules/wcwidth-tests (Files): Likewise.
+ * modules/xmemdup0-tests (Files): Likewise.
+ * modules/xprintf-posix-tests (Files): Likewise.
+ * modules/xvasprintf-tests (Files): Likewise.
+
+2009-12-24 Eric Blake <ebb9@byu.net>
+
+ test-nanosleep: fix typo
+ * tests/test-nanosleep.c (SIGNATURE_CHECK): Fix typo in previous
+ patch.
+ Reported by Bruno Haible.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ Reduce namespace pollution on glibc systems.
+ * lib/inttypes.in.h: Don't include <stdint.h> on glibc systems.
+ * lib/stdlib.in.h: Don't include <stdint.h>, <unistd.h> on glibc
+ systems.
+ * lib/unistd.in.h: Don't include <stdio.h>, <fcntl.h>, <stdlib.h>,
+ <getopt.h> on glibc systems.
+ * lib/fcntl.in.h: Don't include <sys/stat.h>, <unistd.h> on glibc
+ systems.
+ * lib/fcntl.c: Include <unistd.h> here instead.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdlib.in.h (includes): Fix typo in today's commit.
+
+2009-12-24 Eric Blake <ebb9@byu.net>
+
+ tests: add signature checks
+ * tests/signature.h (SIGNATURE_CHECK): New file.
+ * modules/atexit-tests (Files): Use it.
+ * modules/btowc-tests (Files): Likewise.
+ * modules/canonicalize-lgpl-tests (Files): Likewise.
+ * modules/ceilf-tests (Files): Likewise.
+ * modules/ceill-tests (Files): Likewise.
+ * modules/chown-tests (Files): Likewise.
+ * modules/dprintf-posix-tests (Files): Likewise.
+ * modules/dup2-tests (Files): Likewise.
+ * modules/dup3-tests (Files): Likewise.
+ * modules/duplocale-tests (Files): Likewise.
+ * modules/fchdir-tests (Files): Likewise.
+ * modules/fcntl-tests (Files): Likewise.
+ * modules/fdopendir-tests (Files): Likewise.
+ * modules/fflush-tests (Files): Likewise.
+ * modules/flock-tests (Files): Likewise.
+ * modules/floorf-tests (Files): Likewise.
+ * modules/floorl-tests (Files): Likewise.
+ * modules/fnmatch-tests (Files): Likewise.
+ * modules/fopen-tests (Files): Likewise.
+ * modules/fprintf-posix-tests (Files): Likewise.
+ * modules/freopen-tests (Files): Likewise.
+ * modules/frexp-nolibm-tests (Files): Likewise.
+ * modules/frexp-tests (Files): Likewise.
+ * modules/frexpl-nolibm-tests (Files): Likewise.
+ * modules/frexpl-tests (Files): Likewise.
+ * modules/fseek-tests (Files): Likewise.
+ * modules/fseeko-tests (Files): Likewise.
+ * modules/fsync-tests (Files): Likewise.
+ * modules/ftell-tests (Files): Likewise.
+ * modules/ftello-tests (Files): Likewise.
+ * modules/futimens-tests (Files): Likewise.
+ * modules/getaddrinfo-tests (Files): Likewise.
+ * modules/getcwd-tests (Files): Likewise.
+ * modules/getdelim-tests (Files): Likewise.
+ * modules/getdtablesize-tests (Files): Likewise.
+ * modules/getgroups-tests (Files): Likewise.
+ * modules/gethostname-tests (Files): Likewise.
+ * modules/getline-tests (Files): Likewise.
+ * modules/getopt-posix-tests (Files): Likewise.
+ * modules/gettimeofday-tests (Files): Likewise.
+ * modules/glob-tests (Files): Likewise.
+ * modules/iconv-tests (Files): Likewise.
+ * modules/inet_ntop-tests (Files): Likewise.
+ * modules/inet_pton-tests (Files): Likewise.
+ * modules/isblank-tests (Files): Likewise.
+ * modules/lchown-tests (Files): Likewise.
+ * modules/ldexpl-tests (Files): Likewise.
+ * modules/link-tests (Files): Likewise.
+ * modules/linkat-tests (Files): Likewise.
+ * modules/lseek-tests (Files): Likewise.
+ * modules/lstat-tests (Files): Likewise.
+ * modules/mbrtowc-tests (Files): Likewise.
+ * modules/mbsinit-tests (Files): Likewise.
+ * modules/mbsnrtowcs-tests (Files): Likewise.
+ * modules/mbsrtowcs-tests (Files): Likewise.
+ * modules/memchr-tests (Files): Likewise.
+ * modules/memcmp-tests (Files): Likewise.
+ * modules/memmem-tests (Files): Likewise.
+ * modules/memrchr-tests (Files): Likewise.
+ * modules/mkdir-tests (Files): Likewise.
+ * modules/mkfifo-tests (Files): Likewise.
+ * modules/mkfifoat-tests (Files): Likewise.
+ * modules/mknod-tests (Files): Likewise.
+ * modules/nanosleep-tests (Files): Likewise.
+ * modules/nl_langinfo-tests (Files): Likewise.
+ * modules/obstack-printf-tests (Files): Likewise.
+ * modules/open-tests (Files): Likewise.
+ * modules/openat-tests (Files): Likewise.
+ * modules/perror-tests (Files): Likewise.
+ * modules/pipe2-tests (Files): Likewise.
+ * modules/poll-tests (Files): Likewise.
+ * modules/popen-tests (Files): Likewise.
+ * modules/posix_spawn-tests (Files): Likewise.
+ * modules/posix_spawnp-tests (Files): Likewise.
+ * modules/pread-tests (Files): Likewise.
+ * modules/printf-posix-tests (Files): Likewise.
+ * modules/pty-tests (Files): Likewise.
+ * modules/random_r-tests (Files): Likewise.
+ * modules/rawmemchr-tests (Files): Likewise.
+ * modules/readlink-tests (Files): Likewise.
+ * modules/remove-tests (Files): Likewise.
+ * modules/rename-tests (Files): Likewise.
+ * modules/renameat-tests (Files): Likewise.
+ * modules/rmdir-tests (Files): Likewise.
+ * modules/round-tests (Files): Likewise.
+ * modules/roundf-tests (Files): Likewise.
+ * modules/roundl-tests (Files): Likewise.
+ * modules/select-tests (Files): Likewise.
+ * modules/setenv-tests (Files): Likewise.
+ * modules/sigaction-tests (Files): Likewise.
+ * modules/sleep-tests (Files): Likewise.
+ * modules/snprintf-posix-tests (Files): Likewise.
+ * modules/snprintf-tests (Files): Likewise.
+ * modules/sprintf-posix-tests (Files): Likewise.
+ * modules/stat-tests (Files): Likewise.
+ * modules/strcasestr-tests (Files): Likewise.
+ * modules/strchrnul-tests (Files): Likewise.
+ * modules/strerror-tests (Files): Likewise.
+ * modules/strsignal-tests (Files): Likewise.
+ * modules/strstr-tests (Files): Likewise.
+ * modules/strtod-tests (Files): Likewise.
+ * modules/strverscmp-tests (Files): Likewise.
+ * modules/symlink-tests (Files): Likewise.
+ * modules/symlinkat-tests (Files): Likewise.
+ * modules/times-tests (Files): Likewise.
+ * modules/trunc-tests (Files): Likewise.
+ * modules/truncf-tests (Files): Likewise.
+ * modules/truncl-tests (Files): Likewise.
+ * modules/tsearch-tests (Files): Likewise.
+ * modules/uname-tests (Files): Likewise.
+ * modules/unlink-tests (Files): Likewise.
+ * modules/unsetenv-tests (Files): Likewise.
+ * modules/usleep-tests (Files): Likewise.
+ * modules/utimensat-tests (Files): Likewise.
+ * modules/vasprintf-tests (Files): Likewise.
+ * modules/vdprintf-posix-tests (Files): Likewise.
+ * modules/vfprintf-posix-tests (Files): Likewise.
+ * modules/vprintf-posix-tests (Files): Likewise.
+ * modules/vsnprintf-posix-tests (Files): Likewise.
+ * modules/vsnprintf-tests (Files): Likewise.
+ * modules/vsprintf-posix-tests (Files): Likewise.
+ * modules/wcrtomb-tests (Files): Likewise.
+ * modules/wcsnrtombs-tests (Files): Likewise.
+ * modules/wcsrtombs-tests (Files): Likewise.
+ * modules/wcwidth-tests (Files): Likewise.
+ * tests/test-isfinite.c (isfinite): Ensure macro declaration.
+ * tests/test-isinf.c (isinf): Likewise.
+ * tests/test-isnan.c (isnan): Likewise.
+ * tests/test-signbit.c (signbit): Likewise.
+ * tests/test-select.c (FD_CLR, FD_ISSET, FD_SET, FD_ZERO): Ensure
+ declaration, either as macro or with correct signature.
+ (select): Ensure function under test is declared with correct
+ signature in correct header.
+ * tests/test-atexit.c (atexit): Likewise.
+ * tests/test-btowc.c (btowc): Likewise.
+ * tests/test-canonicalize-lgpl.c (realpath)
+ (canonicalize_file_name): Likewise.
+ * tests/test-ceilf1.c (ceilf): Likewise.
+ * tests/test-ceill.c (ceill): Likewise.
+ * tests/test-chown.c (chown): Likewise.
+ * tests/test-dprintf-posix.c (dprintf): Likewise.
+ * tests/test-dup2.c (dup2): Likewise.
+ * tests/test-dup3.c (dup3): Likewise.
+ * tests/test-duplocale.c (duplocale): Likewise.
+ * tests/test-fchdir.c (fchdir): Likewise.
+ * tests/test-fchownat.c (fchownat): Likewise.
+ * tests/test-fcntl.c (fcntl): Likewise.
+ * tests/test-fdopendir.c (fdopendir): Likewise.
+ * tests/test-fflush.c (fflush): Likewise.
+ * tests/test-flock.c (flock): Likewise.
+ * tests/test-floorf1.c (floorf): Likewise.
+ * tests/test-floorl.c (floorl): Likewise.
+ * tests/test-fnmatch.c (fnmatch): Likewise.
+ * tests/test-fopen.c (fopen): Likewise.
+ * tests/test-fprintf-posix.c (fprintf): Likewise.
+ * tests/test-freopen.c (freopen): Likewise.
+ * tests/test-frexp.c (frexp): Likewise.
+ * tests/test-frexpl.c (frexpl): Likewise.
+ * tests/test-fseek.c (fseek): Likewise.
+ * tests/test-fseeko.c (fseeko): Likewise.
+ * tests/test-fstatat.c (fstatat): Likewise.
+ * tests/test-fsync.c (fsync): Likewise.
+ * tests/test-ftell.c (ftell): Likewise.
+ * tests/test-ftello.c (ftello): Likewise.
+ * tests/test-futimens.c (futimens): Likewise.
+ * tests/test-getaddrinfo.c (getaddrinfo, freeaddrinfo)
+ (gai_strerror): Likewise.
+ * tests/test-getcwd.c (getcwd): Likewise.
+ * tests/test-getdelim.c (getdelim): Likewise.
+ * tests/test-getdtablesize.c (getdtablesize): Likewise.
+ * tests/test-getgroups.c (getgroups): Likewise.
+ * tests/test-gethostname.c (gethostname): Likewise.
+ * tests/test-getline.c (getline): Likewise.
+ * tests/test-getopt.c (getopt, getopt_long, getopt_long_only):
+ Likewise.
+ * tests/test-gettimeofday.c (gettimeofday): Likewise.
+ * tests/test-glob.c (glob, globfree): Likewise.
+ * tests/test-iconv.c (iconv, iconv_open, iconv_close): Likewise.
+ * tests/test-inet_ntop.c (inet_ntop): Likewise.
+ * tests/test-inet_pton.c (inet_pton): Likewise.
+ * tests/test-isblank.c (isblank): Likewise.
+ * tests/test-lchown.c (lchown): Likewise.
+ * tests/test-ldexpl.c (ldexpl): Likewise.
+ * tests/test-link.c (link): Likewise.
+ * tests/test-linkat.c (linkat): Likewise.
+ * tests/test-lseek.c (lseek): Likewise.
+ * tests/test-lstat.c (lstat): Likewise.
+ * tests/test-mbrtowc.c (mbrtowc): Likewise.
+ * tests/test-mbsinit.c (mbsinit): Likewise.
+ * tests/test-mbsnrtowcs.c (mbsnrtowcs): Likewise.
+ * tests/test-mbsrtowcs.c (mbsrtowcs): Likewise.
+ * tests/test-memchr.c (memchr): Likewise.
+ * tests/test-memcmp.c (memcmp): Likewise.
+ * tests/test-memmem.c (memmem): Likewise.
+ * tests/test-memrchr.c (memrchr): Likewise.
+ * tests/test-mkdir.c (mkdir): Likewise.
+ * tests/test-mkdirat.c (mkdirat): Likewise.
+ * tests/test-mkfifo.c (mkfifo): Likewise.
+ * tests/test-mkfifoat.c (mkfifoat, mknodat): Likewise.
+ * tests/test-mknod.c (mknod): Likewise.
+ * tests/test-nanosleep.c (nanosleep): Likewise.
+ * tests/test-nl_langinfo.c (nl_langinfo): Likewise.
+ * tests/test-obstack-printf.c (obstack_printf, obstack_vprintf):
+ Likewise.
+ * tests/test-open.c (open): Likewise.
+ * tests/test-openat.c (openat): Likewise.
+ * tests/test-perror.c (perror): Likewise.
+ * tests/test-pipe2.c (pipe2): Likewise.
+ * tests/test-poll.c (poll): Likewise.
+ * tests/test-popen.c (popen, pclose): Likewise.
+ * tests/test-posix_spawn1.c (posix_spawnp, posix_spawnattr_init)
+ (posix_spawnattr_destroy, posix_spawnattr_setsigmask)
+ (posix_spawnattr_setflags, posix_spawn_file_actions_init)
+ (posix_spawn_file_actions_destroy)
+ (posix_spawn_file_actions_addclose)
+ (posix_spawn_file_actions_addopen)
+ (posix_spawn_file_actions_adddup2): Likewise.
+ * tests/test-posix_spawn3.c (posix_spawn): Likewise.
+ * tests/test-pread.c (pread): Likewise.
+ * tests/test-printf-posix.c (printf): Likewise.
+ * tests/test-pty.c (openpty, forkpty): Likewise.
+ * tests/test-random_r.c (srandom_r, initstate_r, setstate_r)
+ (random_r): Likewise.
+ * tests/test-rawmemchr.c (rawmemchr): Likewise.
+ * tests/test-readlink.c (readlink): Likewise.
+ * tests/test-remove.c (remove): Likewise.
+ * tests/test-rename.c (rename): Likewise.
+ * tests/test-renameat.c (renameat): Likewise.
+ * tests/test-rmdir.c (rmdir): Likewise.
+ * tests/test-round1.c (round): Likewise.
+ * tests/test-roundf1.c (roundf): Likewise.
+ * tests/test-roundl.c (roundl): Likewise.
+ * tests/test-setenv.c (setenv): Likewise.
+ * tests/test-sigaction.c (sigaction): Likewise.
+ * tests/test-sleep.c (sleep): Likewise.
+ * tests/test-snprintf.c (snprintf): Likewise.
+ * tests/test-sprintf-posix.c (sprintf): Likewise.
+ * tests/test-stat.c (stat): Likewise.
+ * tests/test-stpncpy.c (stpncpy): Likewise.
+ * tests/test-strcasestr.c (strcasestr): Likewise.
+ * tests/test-strchrnul.c (strchrnul): Likewise.
+ * tests/test-strerror.c (strerror): Likewise.
+ * tests/test-strsignal.c (strsignal): Likewise.
+ * tests/test-strstr.c (strstr): Likewise.
+ * tests/test-strtod.c (strtod): Likewise.
+ * tests/test-strverscmp.c (strverscmp): Likewise.
+ * tests/test-symlink.c (symlink): Likewise.
+ * tests/test-symlinkat.c (symlinkat, readlinkat): Likewise.
+ * tests/test-times.c (times): Likewise.
+ * tests/test-trunc1.c (trunc): Likewise.
+ * tests/test-truncf1.c (truncf): Likewise.
+ * tests/test-truncl.c (truncl): Likewise.
+ * tests/test-tsearch.c (tdelete, tfind, tsearch, twalk):
+ Likewise.
+ * tests/test-uname.c (uname): Likewise.
+ * tests/test-unlink.c (unlink): Likewise.
+ * tests/test-unlinkat.c (unlinkat): Likewise.
+ * tests/test-unsetenv.c (unsetenv): Likewise.
+ * tests/test-usleep.c (usleep): Likewise.
+ * tests/test-utimensat.c (utimensat): Likewise.
+ * tests/test-vasprintf.c (asprintf, vasprintf): Likewise.
+ * tests/test-vdprintf-posix.c (vdprintf): Likewise.
+ * tests/test-vfprintf-posix.c (vfprintf): Likewise.
+ * tests/test-vprintf-posix.c (vprintf): Likewise.
+ * tests/test-vsnprintf.c (vsnprintf): Likewise.
+ * tests/test-vsprintf-posix.c (vsprintf): Likewise.
+ * tests/test-wcrtomb.c (wcrtomb): Likewise.
+ * tests/test-wcsnrtombs.c (wcsnrtombs): Likewise.
+ * tests/test-wcsrtombs.c (wcsrtombs): Likewise.
+ * tests/test-wcwidth.c (wcwidth): Likewise.
+
+ build: pull in conditional headers during GNULIB_POSIXCHECK
+ * lib/stdio.in.h (includes): Using GNULIB_POSIXCHECK also requires
+ definitions from any conditionally-included headers.
+ * lib/stdlib.in.h (includes): Likewise.
+ * lib/unistd.in.h (includes): Likewise.
+
+2009-12-24 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-argv-iter.c: Include header file being tested immediately
+ after config.h.
+ * tests/test-base64.c: Likewise.
+ * tests/test-flock.c: Likewise.
+ * tests/test-fsync.c: Likewise.
+ * tests/test-getdate.c: Likewise.
+ * tests/test-getndelim2.c: Likewise.
+ * tests/test-isfinite.c: Likewise.
+ * tests/test-isinf.c: Likewise.
+ * tests/test-strerror.c: Likewise.
+ * tests/test-strsignal.c: Likewise.
+
+2009-12-23 Eric Blake <ebb9@byu.net>
+
+ unistd: work around cygwin bug
+ * lib/unistd.in.h (includes): Pick up headers needed for cygwin.
+ * doc/posix-functions/unlinkat.texi (unlinkat): Document the bug.
+ * doc/posix-functions/symlinkat.texi (symlinkat): Likewise.
+
+2009-12-23 Bruno Haible <bruno@clisp.org>
+
+ localename: More tests.
+ * tests/test-localename.c (SIZEOF): New macro.
+ (categories): New variable.
+ (test_locale_name, test_locale_name_posix, test_locale_name_environ,
+ test_locale_name_default): Add test w.r.t. thread locale.
+ (test_locale_name_thread): New function.
+ (main): Invoke it.
+
+ localename: Make aware of thread locale.
+ * lib/localename.h (gl_locale_name_thread): New declaration.
+ (gl_locale_name, gl_locale_name_posix, gl_locale_name_default): Clarify
+ behaviour with respect to thread locale.
+ * lib/localename.c: Include <limits.h>, <stddef.h>, <xlocale.h>,
+ <langinfo.h>, glthread/lock.h.
+ (SIZE_BITS): New macro.
+ (string_hash): New function.
+ (struct hash_node): New type.
+ (HASH_TABLE_SIZE): New macro.
+ (struniq_hash_table, struniq_lock): New variables.
+ (struniq): New function.
+ (gl_locale_name_thread): New function.
+ (gl_locale_name): Invoke it.
+ * m4/localename.m4 (gl_LOCALENAME): Test for uselocale function.
+ * modules/localename (Depends-on): Add lock.
+ Reported by Mike Gran <spk121@yahoo.com>.
+
+2009-12-23 Eric Blake <ebb9@byu.net>
+
+ va-args: new module
+ * modules/va-args: New file.
+ * m4/va-args.m4 (gl_VA_ARGS): Likewise.
+ * MODULES.html.sh (Core language properties): Mention it.
+
+ gnulib-common: prefer _GL_UNUSED over _UNUSED_PARAMETER_
+ * m4/gnulib-common.m4 (gl_COMMON): Create a more-appropriately
+ named alias for __attribute__((__unused__)).
+ * lib/chown.c: Update client.
+ * lib/fchmodat.c: Likewise.
+ * lib/fts.c: Likewise.
+ * lib/getdate.y: Likewise.
+ * lib/getgroups.c: Likewise.
+ * lib/getopt.c: Likewise.
+ * lib/getugroups.c: Likewise.
+ * lib/mkdir.c: Likewise.
+ * lib/mkfifo.c: Likewise.
+ * lib/mkfifoat.c: Likewise.
+ * lib/mknod.c: Likewise.
+ * lib/mknodat.c: Likewise.
+ * lib/readlink.c: Likewise.
+ * lib/se-context.in.h: Likewise.
+ * lib/se-selinux.in.h: Likewise.
+ * lib/sockets.c: Likewise.
+ * lib/symlink.c: Likewise.
+ * lib/symlinkat.c: Likewise.
+ * lib/unicodeio.c: Likewise.
+ * lib/unistr.h: Likewise.
+ * tests/test-areadlink.c: Likewise.
+ * tests/test-areadlinkat.c: Likewise.
+ * tests/test-filenamecat.c: Likewise.
+ * tests/test-fseeko.c: Likewise.
+ * tests/test-ftello.c: Likewise.
+ * tests/test-getdate.c: Likewise.
+ * tests/test-getgroups.c: Likewise.
+ * tests/test-gethostname.c: Likewise.
+ * tests/test-quotearg.c: Likewise.
+ * tests/test-version-etc.c: Likewise.
+ * tests/test-xalloc-die.c: Likewise.
+ * tests/test-xfprintf-posix.c: Likewise.
+ * tests/test-xprintf-posix.c: Likewise.
+ * tests/test-xvasprintf.c: Likewise.
+
+ tests: avoid compiler warnings
+ * tests/test-fcntl.c (main): Delete unused parameters.
+ * tests/test-freopen-safer.c (main): Likewise.
+ * tests/test-xalloc-die.c (main): Mark unused parameters.
+ * tests/test-fseeko.c (main): Likewise.
+ * tests/test-ftello.c (main): Likewise.
+ * tests/test-nanosleep.c (main): Avoid declaration warning.
+ * tests/test-sleep.c (main): Likewise.
+ * tests/test-unsetenv.c (main): Silence warning about string
+ literal.
+ * m4/setenv.m4 (gl_FUNC_UNSETENV): Likewise.
+
+2009-12-23 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-localename.c (test_locale_name): New function, extracted
+ from main. Also test mixed situations.
+ (test_locale_name_posix, test_locale_name_environ,
+ test_locale_name_default): New functions.
+ (main): Invoke them all.
+ * modules/localename-tests (configure.ac): Test for newlocale.
+
+2009-12-23 Bruno Haible <bruno@clisp.org>
+
+ unistd: Ensure getcwd gets declared before being overridden.
+ * lib/unistd.in.h: Conditionally include <io.h>.
+
+2009-12-22 Bruno Haible <bruno@clisp.org>
+
+ wchar: Diagnose broken combination of glibc and gcc versions and flags.
+ * m4/wchar.m4 (gl_WCHAR_H_INLINE_OK): New macro.
+ (gl_WCHAR_H): Invoke it.
+ * m4/btowc.m4 (gl_FUNC_BTOWC): Require it.
+ * doc/posix-headers/wchar.texi: Mention the interoperability problem.
+ Reported by Karl Berry <karl@freefriends.org>.
+
+2009-12-22 Eric Blake <ebb9@byu.net>
+
+ math, unistd: avoid redundant includes
+ * lib/math.in.h (isnan): No need to re-include <math.h>.
+ * lib/unistd.in.h (getcwd): Likewise, for <stdlib.h>.
+
+ getsubopt: work around cygwin bug
+ * lib/stdlib.in.h (includes): Move unistd inclusion sooner, to
+ avoid conflicting with system getsubopt.
+ * doc/posix-functions/getsubopt.texi (getsubopt): Document the
+ bug.
+
+ getopt: synchronize from glibc
+ * lib/getopt.c (_getopt_initialize, _getopt_internal_r): Swap
+ parameter order. Adjust all callers.
+ (_getopt_internal_r, main): Adjust quoting in error messages.
+ Drop considerations for outdated POSIX 1003.2 error message.
+ * lib/getopt1.c (_getopt_long_r, _getopt_long_only_r): Adjust
+ callers.
+ * lib/getopt_int.h (_getopt_internal_r): Adjust prototype.
+
+ test-getopt: test stderr behavior
+ * modules/getopt-posix-tests (Depends-on): Add dup2.
+ * tests/test-getopt.c (ASSERT): Avoid stderr.
+ (main): Move stderr to a temporary file.
+ * tests/test-getopt.h (getopt_loop): No longer manipulate opterr.
+ Instead, add parameter to inform caller if output occurred.
+ (test_getopt): Adjust all existing tests to expect silence, and
+ add new tests of leading ":".
+ * doc/glibc-functions/getopt_long.texi (getopt_long): Document
+ glibc shortcomings with leading "-:" or "+:" in optstring.
+ * doc/glibc-functions/getopt_long_only.texi (getopt_long_only):
+ Likewise.
+ * doc/posix-functions/getopt.texi (getopt): Likewise.
+
+ test-getopt: enhance test
+ * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS): Require that getopt_long
+ supports optind=0.
+ * tests/test-getopt.c (OPTIND_MIN): Move...
+ * tests/test-getopt.h (OPTIND_MIN): ...here.
+ * tests/test-getopt_long.h (test_getopt_long): Add more coverage.
+ Require that optind=0 works, since modern BSD supports it in
+ addition to optreset, and since coreutils expects it.
+ (test_getopt_long_only): New test.
+ * doc/glibc-functions/getopt_long.texi (getopt_long): Document
+ glibc shortcomings with 'W;', and enforcement of optind=0.
+ * doc/glibc-functions/getopt_long_only.texi (getopt_long_only):
+ Likewise.
+
+2009-12-21 Bruno Haible <bruno@clisp.org>
+
+ localename: Improvements for MacOS X and Cygwin.
+ * lib/localename.h (gl_locale_name_environ): New declaration.
+ * lib/localename.c (gl_locale_name_environ): New function, extracted from
+ gl_locale_name_posix. Ignore dummy LANG values on MacOS X and Cygwin.
+ (gl_locale_name_posix): Invoke it.
+ (gl_locale_name_default): Add comments. Use Windows native API also on
+ Cygwin.
+
+2009-12-21 Bruno Haible <bruno@clisp.org>
+
+ Update list of Win32 locale ids.
+ * lib/localename.c (LANG_ROMANSH): Renamed from LANG_RHAETO_ROMANCE.
+ (LANG_SAMI): Renamed from LANG_SAAMI.
+ (LANG_BASHKIR, LANG_LUXEMBOURGISH, LANG_GREENLANDIC,
+ LANG_MAPUDUNGUN, LANG_MOHAWK, LANG_BRETON, LANG_OCCITAN, LANG_CORSICAN,
+ LANG_ALSATIAN, LANG_YAKUT, LANG_KICHE, LANG_KINYARWANDA, LANG_WOLOF,
+ LANG_DARI, LANG_SCOTTISH_GAELIC): New macros.
+ (SUBLANG_AFRIKAANS_SOUTH_AFRICA, SUBLANG_ALBANIAN_ALBANIA,
+ SUBLANG_ALSATIAN_FRANCE, SUBLANG_AMHARIC_ETHIOPIA,
+ SUBLANG_ARMENIAN_ARMENIA, SUBLANG_ASSAMESE_INDIA,
+ SUBLANG_BASHKIR_RUSSIA, SUBLANG_BASQUE_BASQUE,
+ SUBLANG_BELARUSIAN_BELARUS, SUBLANG_BRETON_FRANCE,
+ SUBLANG_BULGARIAN_BULGARIA, SUBLANG_CAMBODIAN_CAMBODIA,
+ SUBLANG_CATALAN_SPAIN, SUBLANG_CORSICAN_FRANCE,
+ SUBLANG_CZECH_CZECH_REPUBLIC, SUBLANG_DANISH_DENMARK,
+ SUBLANG_DARI_AFGHANISTAN, SUBLANG_DIVEHI_MALDIVES,
+ SUBLANG_DUTCH_SURINAM, SUBLANG_ESTONIAN_ESTONIA,
+ SUBLANG_FAEROESE_FAROE_ISLANDS, SUBLANG_FARSI_IRAN,
+ SUBLANG_FINNISH_FINLAND, SUBLANG_FRISIAN_NETHERLANDS,
+ SUBLANG_GALICIAN_SPAIN, SUBLANG_GEORGIAN_GEORGIA,
+ SUBLANG_GREEK_GREECE, SUBLANG_GREENLANDIC_GREENLAND,
+ SUBLANG_GUJARATI_INDIA, SUBLANG_HAUSA_NIGERIA_LATIN,
+ SUBLANG_HEBREW_ISRAEL, SUBLANG_HINDI_INDIA, SUBLANG_HUNGARIAN_HUNGARY,
+ SUBLANG_ICELANDIC_ICELAND, SUBLANG_IGBO_NIGERIA,
+ SUBLANG_INDONESIAN_INDONESIA, SUBLANG_INUKTITUT_CANADA,
+ SUBLANG_INUKTITUT_CANADA_LATIN, SUBLANG_IRISH_IRELAND,
+ SUBLANG_JAPANESE_JAPAN, SUBLANG_KANNADA_INDIA,
+ SUBLANG_KAZAK_KAZAKHSTAN, SUBLANG_KICHE_GUATEMALA,
+ SUBLANG_KINYARWANDA_RWANDA, SUBLANG_KONKANI_INDIA,
+ SUBLANG_KYRGYZ_KYRGYZSTAN, SUBLANG_LAO_LAOS, SUBLANG_LATVIAN_LATVIA,
+ SUBLANG_LITHUANIAN_LITHUANIA, SUBLANG_LOWER_SORBIAN_GERMANY,
+ SUBLANG_LUXEMBOURGISH_LUXEMBOURG, SUBLANG_MACEDONIAN_MACEDONIA,
+ SUBLANG_MALAYALAM_INDIA, SUBLANG_MALTESE_MALTA,
+ SUBLANG_MAORI_NEW_ZEALAND, SUBLANG_MAPUDUNGUN_CHILE,
+ SUBLANG_MARATHI_INDIA, SUBLANG_MOHAWK_CANADA, SUBLANG_NEPALI_NEPAL,
+ SUBLANG_OCCITAN_FRANCE, SUBLANG_ORIYA_INDIA,
+ SUBLANG_PASHTO_AFGHANISTAN, SUBLANG_POLISH_POLAND,
+ SUBLANG_ROMANSH_SWITZERLAND, SUBLANG_SAMI_NORTHERN_NORWAY,
+ SUBLANG_SAMI_NORTHERN_SWEDEN, SUBLANG_SAMI_NORTHERN_FINLAND,
+ SUBLANG_SAMI_LULE_NORWAY, SUBLANG_SAMI_LULE_SWEDEN,
+ SUBLANG_SAMI_SOUTHERN_NORWAY, SUBLANG_SAMI_SOUTHERN_SWEDEN,
+ SUBLANG_SAMI_SKOLT_FINLAND, SUBLANG_SAMI_INARI_FINLAND,
+ SUBLANG_SANSKRIT_INDIA, SUBLANG_SINHALESE_SRI_LANKA,
+ SUBLANG_SLOVAK_SLOVAKIA, SUBLANG_SLOVENIAN_SLOVENIA,
+ SUBLANG_SOTHO_SOUTH_AFRICA, SUBLANG_SWAHILI_KENYA,
+ SUBLANG_SWEDISH_SWEDEN, SUBLANG_SYRIAC_SYRIA,
+ SUBLANG_TAGALOG_PHILIPPINES, SUBLANG_TAJIK_TAJIKISTAN,
+ SUBLANG_TAMIL_INDIA, SUBLANG_TATAR_RUSSIA, SUBLANG_TELUGU_INDIA,
+ SUBLANG_THAI_THAILAND, SUBLANG_TSWANA_SOUTH_AFRICA,
+ SUBLANG_TURKISH_TURKEY, SUBLANG_TURKMEN_TURKMENISTAN,
+ SUBLANG_UKRAINIAN_UKRAINE, SUBLANG_UPPER_SORBIAN_GERMANY,
+ SUBLANG_VIETNAMESE_VIETNAM, SUBLANG_WELSH_UNITED_KINGDOM,
+ SUBLANG_WOLOF_SENEGAL, SUBLANG_XHOSA_SOUTH_AFRICA,
+ SUBLANG_YAKUT_RUSSIA, SUBLANG_YI_PRC, SUBLANG_YORUBA_NIGERIA,
+ SUBLANG_ZULU_SOUTH_AFRICA): New macros.
+ (gl_locale_name_from_win32_LANGID): Handle also the territory neutral
+ locale ids. Add support for Alsatian, Bashkir, Breton, Corsican, Dari,
+ Greenlandic, K'iche', Kinyarwanda, Luxembourgish, Mapudungun, Mohawk,
+ Occitan, Scottish Gaelic, Wolof, Yakut. Change language code for Yi.
+ Add more languages and countries for Sami, Sorbian. Add more countries
+ for Serbian, Dutch. Add more scripts for Inuktitut. Be more precise
+ for Pashto. Change country for Syriac, Tswana.
+
+2009-12-21 Eric Blake <ebb9@byu.net>
+
+ test-utimens: avoid spurious failure
+ * tests/test-chown.h (nap): Factor...
+ * tests/nap.h: ...into new file.
+ * tests/test-lchown.h (nap): Avoid duplication.
+ * tests/test-utimens-common.h (nap): Use shared implementation,
+ necessary on file systems with 1-second resolution.
+ * modules/chown-tests (Files): Include new file.
+ * modules/fdutimensat-tests (Files): Likewise.
+ * modules/futimens-tests (Files): Likewise.
+ * modules/lchown-tests (Files): Likewise.
+ * modules/openat-tests (Files): Likewise.
+ * modules/utimens-tests (Files): Likewise.
+ * modules/utimensat-tests (Files): Likewise.
+
+2009-12-19 Eric Blake <ebb9@byu.net>
+
+ futimens, utimensat: work around Linux bug
+ * m4/futimens.m4 (gl_FUNC_FUTIMENS): Detect ctime bug.
+ * m4/utimensat.m4 (gl_FUNC_UTIMENSAT): Likewise.
+ * lib/utimensat.c (rpl_utimensat): Work around it.
+ * lib/futimens.c (rpl_futimens): Adjust comment.
+
+ utimens: work around Linux ctime bug
+ * lib/utimens.c (detect_ctime_bug): New helper function.
+ (update_timespec): Differentiate between workaround needed for
+ this bug vs. what is needed for systems that lack utimensat.
+ (fdutimens, lutimens): Work around bug.
+
+ utimens: check for ctime update
+ * tests/test-utimens-common.h (check_ctime): Define.
+ * tests/test-utimens.h (test_utimens): Expose the Linux bug.
+ * tests/test-futimens.h (test_futimens): Likewise.
+ * tests/test-lutimens.h (test_lutimens): Likewise.
+ * doc/posix-functions/futimens.texi (futimens): Document the bug.
+ * doc/posix-functions/utimensat.texi (utimensat): Likewise.
+
+2009-12-19 Bruno Haible <bruno@clisp.org>
+
+ dprintf-posix: Check against memory leak fixed on 2009-12-15.
+ * tests/test-dprintf-posix2.sh: New file.
+ * tests/test-dprintf-posix2.c: New file.
+ * modules/dprintf-posix-tests (Files): Add them.
+ (configure.ac): Check for getrlimit and setrlimit.
+ (Makefile.am): Augment TESTS and CHECK_PROGRAMS.
+
+2009-12-19 Bruno Haible <bruno@clisp.org>
+
+ fprintf-posix: Check against memory leak fixed on 2009-12-15.
+ * tests/test-fprintf-posix3.sh: New file.
+ * tests/test-fprintf-posix3.c: New file.
+ * modules/fprintf-posix-tests (Files): Add them.
+ (Makefile.am): Augment TESTS and CHECK_PROGRAMS.
+
+2009-12-19 Eric Blake <ebb9@byu.net>
+
+ dirfd: fix prototype
+ * lib/dirent.in.h (dirfd): Argument is not const, per POSIX.
+ * lib/dirfd.c (dirfd): Likewise.
+
+ canonicalize: reduce memory usage
+ * lib/canonicalize.c (canonicalize_filename_mode): Trim the
+ allocation to size.
+ Reported by Solar Designer <solar@openwall.com>.
+
+2009-12-19 Bruno Haible <bruno@clisp.org>
+
+ New module attribute 'Applicability'.
+ * modules/TEMPLATE-EXTENDED: New field 'Applicability'.
+ * gnulib-tool: New option --extract-applicability.
+ (func_usage): Document it.
+ (sed_extract_prog): Recognize it.
+ (func_get_applicability): New function.
+ (func_import): Generalize handling of 'link-warning' module.
+ * modules/link-warning (Applicability): New section.
+ * modules/arg-nonnull (Applicability): New section.
+ Repoted by Simon Josefsson <simon@josefsson.org>.
+
+2009-12-19 Bruno Haible <bruno@clisp.org>
+
+ fflush: tweak
+ * lib/fflush.c (update_fpos_cache): Don't use fpos_t on Cygwin.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+
+2009-12-16 José E. Marchesi <jemarch@gnu.org> (tiny change)
+
+ * lib/gl_list.h: Fix typo in comment.
+
+2009-12-16 Eric Blake <ebb9@byu.net>
+
+ fcntl: use to simplify other modules
+ * modules/cloexec (Depends-on): Add fcntl.
+ * modules/fchdir (Depends-on): Likewise.
+ * modules/fd-safer-flag (Depends-on): Likewise.
+ * modules/unistd-safer (Depends-on): Likewise.
+ * modules/dup3 (configure.ac): Set module indicator.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Replace fcntl if fchdir is
+ missing.
+ * lib/fchdir.c (_gl_register_dup): Fix comment.
+ * lib/cloexec.c (dup_cloexec): Simplify, by relying on fcntl.
+ * lib/dup-safer.c (dup_safer): Likewise.
+ * lib/dup-safer-flag.c (dup_safer_flag): Likewise.
+ * lib/dup3.c (dup3): Likewise.
+ * tests/test-fchdir.c (main): Enhance test.
+ Fixes a dup_cloexec bug reported by Ondřej Vašík.
+
+ fcntl: port portions of fcntl to mingw
+ * m4/fcntl.m4 (gl_FUNC_FCNTL): Also build fcntl.c on mingw.
+ * lib/fcntl.c (fcntl) <F_DUPFD, F_DUPFD_CLOEXEC, F_GETFD>: Provide
+ replacement for mingw.
+ * modules/fcntl (Description): Update.
+ (Depends-on): Add dup2.
+ * m4/fcntl_h.m4 (gl_FCNTL_H_DEFAULTS): Add witness.
+ * modules/fcntl-h (Makefile.am): Substitute it.
+ * lib/fcntl.in.h (fcntl): Update declaration.
+ (F_DUPFD, F_GETFD): New macros, when needed.
+ * doc/posix-headers/fcntl.texi (fcntl.h): Update documentation.
+ * doc/posix-functions/fcntl.texi (fcntl): Likewise.
+ * tests/test-fcntl.c (check_flags, main): Enhance test for items
+ we now guarantee.
+
+ fcntl: work around cygwin bug in F_DUPFD
+ * m4/fcntl.m4 (gl_REPLACE_FCNTL): New macro.
+ (gl_FUNC_FCNTL): Use it. Test for F_DUPFD bug.
+ * lib/fcntl.c (rpl_fcntl) <F_DUPFD>: Work around it.
+ <F_DUPFD_CLOEXEC>: Reduce calls to _gl_register_dup.
+ * doc/posix-functions/fcntl.texi (fcntl): Document it.
+
+ fcntl: support F_DUPFD_CLOEXEC on systems with fcntl
+ * modules/fcntl (Files): List new files.
+ (configure.ac): Run a test.
+ * m4/fcntl.m4 (gl_FUNC_FCNTL): New file.
+ * lib/fcntl.c (rpl_fcntl): Likewise.
+ * m4/fcntl_h.m4 (gl_FCNTL_H_DEFAULTS): Add witness defaults.
+ (gl_FCNTL_H): Always replace fcntl.h.
+ * modules/fcntl-h (Makefile.am): Substitute witnesses.
+ * lib/fcntl.in.h (fcntl): Declare replacement.
+ (F_DUPFD_CLOEXEC, GNULIB_defined_F_DUPFD_CLOEXEC): New macro when
+ needed, plus a witness.
+ * doc/posix-functions/fcntl.texi (fcntl): Document this.
+ * doc/posix-headers/fcntl.texi (fcntl.h): Likewise.
+ * tests/test-fcntl.c: New file.
+ * modules/fcntl-tests: Likewise.
+
+ binary-io: avoid potential compilation warning
+ * lib/binary-io.h [__DJGPP__]: Avoid null preprocessor
+ directives.
+
+ fflush: avoid compilation error on NetBSD
+ * lib/fflush.c (update_fpos_cache): Use a union to safely convert
+ between off_t and fpos_t, since the latter is sometimes a struct.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ Reported by Alexander Nasonov <alnsn@yandex.ru>.
+
+2009-12-15 Eric Blake <ebb9@byu.net>
+
+ fcntl-h, stdio, sys_ioctl: fix declarations
+ * lib/stdio.in.h (dprintf): Use of link warning on a variadic
+ function must not take arguments.
+ * lib/sys_ioctl.in.h (ioctl): Likewise.
+ * lib/fcntl.in.h (openat): Likewise. Declare extern.
+ (open): Add a link warning.
+
+2009-12-15 Jim Meyering <meyering@redhat.com>
+
+ areadlink, areadlink-with-size: relax license to LGPLv2+
+ * modules/areadlink (License): Relax to LGPLv2+.
+ * modules/areadlink-with-size (License): Likewise.
+
+2009-12-15 Joel E. Denny <jdenny@clemson.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ *printf: Fix memory leak.
+ * lib/fprintf.c (fprintf): Free memory allocated by vasnprintf.
+ * lib/vfprintf.c (vfprintf): Likewise.
+ * lib/dprintf.c (dprintf): Likewise.
+ * lib/vdprintf.c (vdprintf): Likewise.
+
+2009-12-14 Eric Blake <ebb9@byu.net>
+
+ accept4: adjust module dependencies
+ * modules/accept4 (Depends-on): Use fcntl-h, not fcntl.
+
+ utimens: one more try at avoiding compiler warning
+ * lib/utimens.c (lutimens): Lower scope of result.
+
+2009-12-13 Bruno Haible <bruno@clisp.org>
+
+ Move the malloc checking from module 'list' to new module 'xlist'.
+ * modules/xlist: New file.
+ * lib/gl_xlist.h: New file.
+ * lib/gl_xlist.c: New file.
+ * lib/gl_list.h (gl_list_create_empty, gl_list_create,
+ gl_list_node_set_value, gl_list_set_at, gl_list_add_first,
+ gl_list_add_last, gl_list_add_before, gl_list_add_after,
+ gl_list_nx_add_at, gl_sortedlist_add): Disable declarations.
+ (gl_list_nx_create_empty, gl_list_nx_create, gl_list_node_nx_set_value,
+ gl_list_nx_set_at, gl_list_nx_add_first, gl_list_nx_add_last,
+ gl_list_nx_add_before, gl_list_nx_add_after, gl_list_nx_add_at,
+ gl_sortedlist_nx_add): New declarations.
+ (struct gl_list_implementation): Rename and change methods accordingly.
+ (gl_list_nx_create_empty): Renamed from gl_list_create_empty.
+ (gl_list_nx_create): Renamed from gl_list_create.
+ (gl_list_node_nx_set_value): Renamed from gl_list_node_set_value.
+ (gl_list_nx_set_at): Renamed from gl_list_set_at.
+ (gl_list_nx_add_first): Renamed from gl_list_add_first.
+ (gl_list_nx_add_last): Renamed from gl_list_add_last.
+ (gl_list_nx_add_before): Renamed from gl_list_add_before.
+ (gl_list_nx_add_after): Renamed from gl_list_add_after.
+ (gl_list_nx_add_at): Renamed from gl_list_add_at.
+ (gl_sortedlist_nx_add): Renamed from gl_sortedlist_add.
+ * lib/gl_list.c (gl_list_nx_create_empty): Renamed from
+ gl_list_create_empty.
+ (gl_list_nx_create): Renamed from gl_list_create.
+ (gl_list_node_nx_set_value): Renamed from gl_list_node_set_value.
+ (gl_list_nx_set_at): Renamed from gl_list_set_at.
+ (gl_list_nx_add_first): Renamed from gl_list_add_first.
+ (gl_list_nx_add_last): Renamed from gl_list_add_last.
+ (gl_list_nx_add_before): Renamed from gl_list_add_before.
+ (gl_list_nx_add_after): Renamed from gl_list_add_after.
+ (gl_list_nx_add_at): Renamed from gl_list_add_at.
+ (gl_sortedlist_nx_add): Renamed from gl_sortedlist_add.
+ * lib/gl_array_list.c: Don't include xalloc.h.
+ (gl_array_nx_create_empty): Renamed from gl_array_create_empty. Return
+ NULL upon out-of-memory.
+ (gl_array_nx_create): Renamed from gl_array_create. Return NULL upon
+ out-of-memory.
+ (gl_array_node_nx_set_value): Renamed from gl_array_node_set_value.
+ Change return type to 'int'.
+ (gl_array_nx_set_at): Renamed from gl_array_set_at.
+ (grow): Change return type to 'int'. Return -1 upon out-of-memory.
+ (gl_array_nx_add_first): Renamed from gl_array_add_first. Return NULL
+ upon out-of-memory.
+ (gl_array_nx_add_last): Renamed from gl_array_add_last. Return NULL
+ upon out-of-memory.
+ (gl_array_nx_add_before): Renamed from gl_array_add_before. Return NULL
+ upon out-of-memory.
+ (gl_array_nx_add_after): Renamed from gl_array_add_after. Return NULL
+ upon out-of-memory.
+ (gl_array_nx_add_at): Renamed from gl_array_add_at. Return NULL upon
+ out-of-memory.
+ (gl_array_sortedlist_nx_add): Renamed from gl_array_sortedlist_add.
+ Update.
+ (gl_array_list_implementation): Update.
+ * lib/gl_carray_list.c: Don't include xalloc.h.
+ (gl_carray_nx_create_empty): Renamed from gl_carray_create_empty.
+ Return NULL upon out-of-memory.
+ (gl_carray_nx_create): Renamed from gl_carray_create. Return NULL upon
+ out-of-memory.
+ (gl_carray_node_nx_set_value): Renamed from gl_carray_node_set_value.
+ Change return type to 'int'.
+ (gl_carray_nx_set_at): Renamed from gl_carray_set_at.
+ (grow): Change return type to 'int'. Return -1 upon out-of-memory.
+ (gl_carray_nx_add_first): Renamed from gl_carray_add_first. Return NULL
+ upon out-of-memory.
+ (gl_carray_nx_add_last): Renamed from gl_carray_add_last. Return NULL
+ upon out-of-memory.
+ (gl_carray_nx_add_at): Renamed from gl_carray_add_at. Return NULL upon
+ out-of-memory.
+ (gl_carray_nx_add_before): Renamed from gl_carray_add_before. Update.
+ (gl_carray_nx_add_after): Renamed from gl_carray_add_after. Update.
+ (gl_carray_sortedlist_nx_add): Renamed from gl_carray_sortedlist_add.
+ Update.
+ (gl_carray_list_implementation): Update.
+ * lib/gl_anyhash_list2.h (hash_resize): Do nothing upon out-of-memory.
+ * lib/gl_anylinked_list2.h (gl_linked_nx_create_empty): Renamed from
+ gl_linked_create_empty. Return NULL upon out-of-memory.
+ (gl_linked_nx_create): Renamed from gl_linked_create. Return NULL upon
+ out-of-memory.
+ (gl_linked_node_nx_set_value): Renamed from gl_linked_node_set_value.
+ Change return type to 'int'. Return -1 upon out-of-memory.
+ (gl_linked_nx_set_at): Renamed from gl_linked_set_at. Return NULL upon
+ out-of-memory.
+ (gl_linked_nx_add_first): Renamed from gl_linked_add_first. Return NULL
+ upon out-of-memory.
+ (gl_linked_nx_add_last): Renamed from gl_linked_add_last. Return NULL
+ upon out-of-memory.
+ (gl_linked_nx_add_before): Renamed from gl_linked_add_before. Return
+ NULL upon out-of-memory.
+ (gl_linked_nx_add_after): Renamed from gl_linked_add_after. Return NULL
+ upon out-of-memory.
+ (gl_linked_nx_add_at): Renamed from gl_linked_add_at. Return NULL upon
+ out-of-memory.
+ (gl_linked_sortedlist_nx_add): Renamed from gl_linked_sortedlist_add.
+ Update.
+ * lib/gl_linked_list.c: Don't include xalloc.h.
+ (gl_linked_list_implementation): Update.
+ * lib/gl_linkedhash_list.c: Don't include xalloc.h.
+ (add_to_bucket): Change return type to 'int'.
+ (gl_linkedhash_list_implementation): Update.
+ * lib/gl_anytree_list1.h (free_subtree): New function.
+ * lib/gl_anytree_list2.h (gl_tree_nx_create_empty): Renamed from
+ gl_tree_create_empty. Return NULL upon out-of-memory.
+ (gl_tree_node_nx_set_value): Renamed from gl_tree_node_set_value.
+ Change return type to 'int'. Return -1 upon out-of-memory.
+ (gl_tree_nx_set_at): Renamed from gl_tree_set_at. Return NULL upon
+ out-of-memory.
+ (gl_tree_nx_add_at): Renamed from gl_tree_add_at. Update.
+ (gl_tree_remove_node): New function, moved here from
+ lib/gl_anyavltree_list2.h and lib/gl_anyrbtree_list2.h.
+ (gl_tree_sortedlist_nx_add): Renamed from gl_tree_sortedlist_add.
+ Update.
+ * lib/gl_anyavltree_list2.h (create_subtree_with_contents): Use
+ malloc, not xmalloc. Return NULL upon out-of-memory.
+ (gl_tree_nx_create): Renamed from gl_tree_create. Return NULL upon
+ out-of-memory.
+ (gl_tree_remove_node_from_tree): New function, extracted from
+ gl_tree_remove_node.
+ (gl_tree_nx_add_first): Renamed from gl_tree_add_first. Return NULL
+ upon out-of-memory.
+ (gl_tree_nx_add_last): Renamed from gl_tree_add_last. Return NULL upon
+ out-of-memory.
+ (gl_tree_nx_add_before): Renamed from gl_tree_add_before. Return NULL
+ upon out-of-memory.
+ (gl_tree_nx_add_after): Renamed from gl_tree_add_after. Return NULL
+ upon out-of-memory.
+ (gl_tree_remove_node): Remove function. Moved to gl_anytree_list2.h.
+ * lib/gl_anyrbtree_list2.h (create_subtree_with_contents): Use malloc,
+ not xmalloc. Return NULL upon out-of-memory.
+ (gl_tree_nx_create): Renamed from gl_tree_create. Return NULL upon
+ out-of-memory.
+ (gl_tree_remove_node_from_tree): New function, extracted from
+ gl_tree_remove_node.
+ (gl_tree_nx_add_first): Renamed from gl_tree_add_first. Return NULL
+ upon out-of-memory.
+ (gl_tree_nx_add_last): Renamed from gl_tree_add_last. Return NULL upon
+ out-of-memory.
+ (gl_tree_nx_add_before): Renamed from gl_tree_add_before. Return NULL
+ upon out-of-memory.
+ (gl_tree_nx_add_after): Renamed from gl_tree_add_after. Return NULL
+ upon out-of-memory.
+ (gl_tree_remove_node): Remove function. Moved to gl_anytree_list2.h.
+ * lib/gl_avltree_list.c: Don't include xalloc.h. Include
+ gl_anytree_list1.h before gl_anyavltree_list2.h.
+ (gl_avltree_list_implementation): Update.
+ * lib/gl_rbtree_list.c: Don't include xalloc.h. Include
+ gl_anytree_list1.h before gl_anyavltree_list2.h.
+ (gl_rbtree_list_implementation): Update.
+ * lib/gl_anytreehash_list1.h (add_to_bucket, add_nodes_to_buckets):
+ Change return type to 'int'. Return -1 upon out-of-memory. Use
+ __builtin_expect.
+ * lib/gl_avltreehash_list.c: Don't include xalloc.h.
+ (gl_avltreehash_list_implementation): Update.
+ * lib/gl_rbtreehash_list.c: Don't include xalloc.h.
+ (gl_rbtreehash_list_implementation): Update.
+ * modules/array-list (Depends-on): Remove xalloc.
+ * modules/carray-list (Depends-on): Likewise.
+ * modules/linked-list (Depends-on): Likewise.
+ * modules/linkedhash-list (Depends-on): Likewise.
+ * modules/avltree-list (Depends-on): Likewise.
+ * modules/rbtree-list (Depends-on): Likewise.
+ * modules/avltreehash-list (Depends-on): Likewise.
+ * modules/rbtreehash-list (Depends-on): Likewise.
+
+ * modules/xsublist: New file.
+ * lib/gl_xsublist.h: New file.
+ * lib/gl_xsublist.c: New file.
+ * lib/gl_sublist.h (gl_sublist_create): Disable declaration.
+ (gl_sublist_nx_create): New declaration.
+ * lib/gl_sublist.c: Don't include xalloc.h.
+ (gl_sublist_nx_create_empty): Renamed from gl_sublist_create_empty.
+ (gl_sublist_nx_create_fill): Renamed from gl_sublist_create_fill.
+ (gl_sublist_node_nx_set_value): Renamed from gl_sublist_node_set_value.
+ Change return type to 'int'. Return -1 upon out-of-memory.
+ (gl_sublist_nx_set_at): Renamed from gl_sublist_set_at. Return NULL
+ upon out-of-memory.
+ (gl_sublist_nx_add_first): Renamed from gl_sublist_add_first. Return
+ NULL upon out-of-memory.
+ (gl_sublist_nx_add_last): Renamed from gl_sublist_add_last. Return NULL
+ upon out-of-memory.
+ (gl_sublist_nx_add_before): Renamed from gl_sublist_add_before. Return
+ NULL upon out-of-memory.
+ (gl_sublist_nx_add_after): Renamed from gl_sublist_add_after. Return
+ NULL upon out-of-memory.
+ (gl_sublist_nx_add_at): Renamed from gl_sublist_add_at. Return NULL
+ upon out-of-memory.
+ (gl_sublist_sortedlist_nx_add): Renamed from gl_sublist_sortedlist_add.
+ (gl_sublist_list_implementation): Update.
+ (gl_sublist_nx_create): Renamed from gl_sublist_create. Return NULL
+ upon out-of-memory.
+ * modules/sublist (Depends-on): Remove xalloc.
+
+ * tests/test-array_list.c: Use gl_list_nx_* functions where possible.
+ * tests/test-carray_list.c: Likewise.
+ * tests/test-linked_list.c: Likewise.
+ * tests/test-linkedhash_list.c: Likewise.
+ * tests/test-avltree_list.c: Likewise.
+ * tests/test-rbtree_list.c: Likewise.
+ * tests/test-avltreehash_list.c: Likewise.
+ * tests/test-rbtreehash_list.c: Likewise.
+ * modules/array-list-tests (Makefile.am): Don't link with @LIBINTL@.
+ * modules/carray-list-tests (Makefile.am): Likewise.
+ * modules/linked-list-tests (Makefile.am): Likewise.
+ * modules/linkedhash-list-tests (Makefile.am): Likewise.
+ * modules/avltree-list-tests (Makefile.am): Likewise.
+ * modules/rbtree-list-tests (Makefile.am): Likewise.
+ * modules/avltreehash-list-tests (Makefile.am): Likewise.
+ * modules/rbtreehash-list-tests (Makefile.am): Likewise.
+
+ * NEWS: Mention the changes.
+
+ * lib/clean-temp.c: Include gl_xlist.h.
+ * modules/clean-temp (Depends-on): Add xlist.
+
+ * lib/git-merge-changelog.c: Include gl_xlist.h instead of gl_list.h.
+ * modules/git-merge-changelog (Depends-on): Add xlist. Remove list.
+
+ * tests/test-array_oset.c: Include gl_xlist.h.
+ * modules/array-oset-tests (Depends-on): Add xlist.
+
+ Reported by José E. Marchesi <jemarch@gnu.org>.
+
+2009-12-13 Bruno Haible <bruno@clisp.org>
+
+ Move the malloc checking from module 'oset' to new module 'xoset'.
+ * modules/xoset: New file.
+ * lib/gl_xoset.h: New file.
+ * lib/gl_xoset.c: New file.
+ * lib/gl_oset.h (gl_oset_create_empty, gl_oset_add): Disable
+ declarations.
+ (gl_oset_nx_create_empty, gl_oset_nx_add): New declarations.
+ (struct gl_oset_implementation): Rename and change methods accordingly.
+ (gl_oset_nx_create_empty): Renamed from gl_oset_create_empty.
+ (gl_oset_nx_add): Renamed from gl_oset_add. Change return type to
+ 'int'. Mark as __warn_unused_result__.
+ * lib/gl_oset.c (gl_oset_nx_create_empty): Renamed from
+ gl_oset_create_empty.
+ (gl_oset_nx_add): Renamed from gl_oset_add. Change return type to
+ 'int'.
+ * lib/gl_array_oset.c: Don't include xalloc.h.
+ (gl_array_nx_create_empty): Renamed from gl_array_create_empty. Use
+ malloc, not xmalloc.
+ (grow): Change return type to 'int'. Don't call xalloc_die.
+ (gl_array_nx_add_at): Renamed from gl_array_add_at. Change return type
+ to 'int'.
+ (gl_array_nx_add): Renamed from gl_array_add. Change return type to
+ 'int'.
+ (gl_array_oset_implementation): Update.
+ * lib/gl_anytree_oset.h (gl_tree_nx_create_empty): Renamed from
+ gl_tree_create_empty.
+ (gl_tree_nx_add): Renamed from gl_tree_add. Change return type to
+ 'int'.
+ * lib/gl_avltree_oset.c: Don't include xalloc.h.
+ (gl_tree_nx_add_first): Renamed from gl_tree_add_first. Use malloc, not
+ xmalloc.
+ (gl_tree_nx_add_before): Renamed from gl_tree_add_before. Use malloc,
+ not xmalloc.
+ (gl_tree_nx_add_after): Renamed from gl_tree_add_after. Use malloc, not
+ xmalloc.
+ (gl_avltree_oset_implementation): Update.
+ * lib/gl_rbtree_oset.c: Don't include xalloc.h.
+ (gl_tree_nx_add_first): Renamed from gl_tree_add_first. Use malloc, not
+ xmalloc.
+ (gl_tree_nx_add_before): Renamed from gl_tree_add_before. Use malloc,
+ not xmalloc.
+ (gl_tree_nx_add_after): Renamed from gl_tree_add_after. Use malloc, not
+ xmalloc.
+ (gl_rbtree_oset_implementation): Update.
+ * modules/array-oset (Depends-on): Remove xalloc.
+ * modules/avltree-oset (Depends-on): Likewise.
+ * modules/rbtree-oset (Depends-on): Likewise.
+ * tests/test-array_oset.c: Use gl_oset_nx_* functions where possible.
+ * tests/test-avltree_oset.c: Likewise.
+ * tests/test-rbtree_oset.c: Likewise.
+ * lib/gl_anytreehash_list1.h (add_to_bucket): Likewise.
+ * modules/avltree-oset-tests (Makefile.am): Don't link with @LIBINTL@.
+ * modules/rbtree-oset-tests (Makefile.am): Likewise.
+ * NEWS: Mention the change.
+
+2009-12-05 Alfred M. Szmidt <ams@gnu.org>
+
+ maint.mk: allow a project to override release-prep commands
+ * top/maint.mk (alpha, beta, stable): Move release-preparatory
+ commands into a new rule.
+ (release-prep): New rule.
+ (release-prep-hook): New overridable variable.
+
+2009-12-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c (locale_charset): Fix comment about use of GetACP.
+
+2009-12-13 Jim Meyering <meyering@redhat.com>
+
+ maint.mk (null_AM_MAKEFLAGS, built_programs): remove unused definitions
+ * top/maint.mk (null_AM_MAKEFLAGS, built_programs): Remove definitions.
+
+2009-12-12 Bruno Haible <bruno@clisp.org>
+
+ duplocale: Tweak.
+ * lib/duplocale.c (rpl_duplocale): Mark categories array as 'const'.
+
+2009-12-12 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (strtoll.c): tab changes, no more sync.
+
+2009-12-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/po.m4: Undo incorrect untabification.
+
+2009-12-12 Bruno Haible <bruno@clisp.org>
+
+ c-strtod, c-strtold: Use multithread-safe implementation on MacOS X.
+ * modules/c-strtod (Depends-on): Add locale.
+ * modules/c-strtold (Depends-on): Likewise.
+
+2009-12-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c (locale_charset): Add comment about use of GetACP.
+
+2009-12-11 Eric Blake <ebb9@byu.net>
+
+ setenv: relax requirement in light of POSIX ruling
+ * m4/setenv.m4 (gl_FUNC_SETENV_SEPARATE): Test handling of "" but
+ not NULL.
+ * tests/test-setenv.c (main): Relax test.
+ * tests/test-unsetenv.c (main): Likewise.
+ * doc/posix-functions/setenv.texi (setenv): Document this.
+ * doc/posix-functions/unsetenv.texi (unsetenv): Likewise.
+
+2009-12-11 Bruno Haible <bruno@clisp.org>
+
+ New module 'fd-safer-flag'.
+ * lib/dup-safer-flag.c: New file, extracted from lib/dup-safer.c.
+ * lib/dup-safer.c (dup_safer_flag): Remove function.
+ * lib/fd-safer-flag.c: New file, extracted from lib/fd-safer.c.
+ * lib/fd-safer.c (fd_safer_flag): Remove function.
+ * lib/unistd-safer.h (dup_safer_flag, fd_safer_flag): Update condition.
+ * modules/cloexec (configure.ac): Drop indicator macro.
+ * modules/fd-safer-flag: New file.
+ * modules/pipe2-safer (Depends-on): Add fd-safer-flag. Remove cloexec.
+ * modules/stdlib-safer (Depends-on): Add fd-safer-flag.
+ * modules/unistd-safer-tests (Depends-on): Add fd-safer-flag.
+
+2009-12-11 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'nl_langinfo'.
+ * modules/nl_langinfo-tests: New file.
+ * tests/test-nl_langinfo.sh: New file.
+ * tests/test-nl_langinfo.c: New file.
+
+ New module 'nl_langinfo'.
+ * lib/nl_langinfo.c: New file.
+ * m4/nl_langinfo.m4: New file.
+ * modules/nl_langinfo: New file.
+ * doc/posix-functions/nl_langinfo.texi: Mention the new module.
+
+2009-12-11 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'langinfo'.
+ * modules/langinfo-tests: New file.
+ * tests/test-langinfo.c: New file.
+
+ New module 'langinfo'.
+ * lib/langinfo.in.h: New file.
+ * m4/langinfo_h.m4: New file.
+ * modules/langinfo: New file.
+ * doc/posix-headers/langinfo.texi: Mention the new module.
+
+2009-12-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/config.charset: Untabify.
+
+2009-12-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistd-safer (configure.ac): Drop indicator macro.
+
+2009-12-11 Bruno Haible <bruno@clisp.org>
+
+ Move pipe2-safer code to its own file.
+ * lib/pipe2-safer.c: New file, extracted from lib/pipe-safer.c.
+ * lib/pipe-safer.c (pipe2_safer): Remove function.
+ * modules/pipe2-safer (Files): Add lib/pipe2-safer.c.
+ (Makefile.am): Add it to lib_SOURCES.
+
+2009-12-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/recvfrom.c (rpl_recvfrom): Allow the from argument to be NULL.
+
+2009-12-10 Bruno Haible <bruno@clisp.org>
+
+ Declare which arguments expect non-NULL values, for GCC and clang.
+ * build-aux/arg-nonnull.h: New file.
+ * modules/arg-nonnull: New file.
+ * lib/arpa_inet.in.h (_GL_ARG_NONNULL): New placeholder.
+ (inet_ntop, inet_pton): Use it.
+ * lib/dirent.in.h (_GL_ARG_NONNULL): New placeholder.
+ (closedir, dirfd, opendir, scandir, alphasort): Use it.
+ * lib/fcntl.in.h (_GL_ARG_NONNULL): New placeholder.
+ (open, openat): Use it.
+ * lib/fnmatch.in.h (_GL_ARG_NONNULL): New placeholder.
+ (fnmatch): Use it.
+ * lib/getopt.in.h (_GL_ARG_NONNULL): New placeholder.
+ (getopt, getopt_long, getopt_long_only): Use it.
+ * lib/glob.in.h (_GL_ARG_NONNULL): New placeholder.
+ * lib/glob-libc.h (glob, globfree, glob64, globfree64, glob_pattern_p):
+ Use it.
+ * lib/iconv.in.h (_GL_ARG_NONNULL): New placeholder.
+ (iconv_open): Use it.
+ * lib/inttypes.in.h (_GL_ARG_NONNULL): New placeholder.
+ (strtoimax, strtoumax): Use it.
+ * lib/locale.in.h (_GL_ARG_NONNULL): New placeholder.
+ (duplocale): Use it.
+ * lib/math.in.h (_GL_ARG_NONNULL): New placeholder.
+ (frexp, frexpl): Use it.
+ * lib/netdb.in.h (_GL_ARG_NONNULL): New placeholder.
+ (getaddrinfo, freeaddrinfo, getnameinfo): Use it.
+ * lib/search.in.h (_GL_ARG_NONNULL): New placeholder.
+ (tsearch, tfind, tdelete, twalk): Use it.
+ * lib/signal.in.h (_GL_ARG_NONNULL): New placeholder.
+ (sigismember, sigemptyset, sigaddset, sigdelset, sigfillset,
+ sigpending): Use it.
+ * lib/spawn.in.h (_GL_ARG_NONNULL): New placeholder.
+ (posix_spawn, posix_spawnp, posix_spawnattr_init,
+ posix_spawnattr_destroy, posix_spawnattr_getsigdefault,
+ posix_spawnattr_setsigdefault, posix_spawnattr_getsigmask,
+ posix_spawnattr_setsigmask, posix_spawnattr_getflags,
+ posix_spawnattr_setflags, posix_spawnattr_getpgroup,
+ posix_spawnattr_setpgroup, posix_spawnattr_getschedpolicy,
+ posix_spawnattr_setschedpolicy, posix_spawnattr_getschedparam,
+ posix_spawnattr_setschedparam, posix_spawn_file_actions_init,
+ posix_spawn_file_actions_destroy, posix_spawn_file_actions_addopen,
+ posix_spawn_file_actions_addclose, posix_spawn_file_actions_adddup2):
+ Use it.
+ * lib/stdio.in.h (_GL_ARG_NONNULL): New placeholder.
+ (dprintf, fclose, fopen, fprintf, fpurge, fputc, fputs, freopen,
+ rpl_fseek, fseeko, rpl_ftell, ftello, fwrite, getdelim, getline,
+ obstack_printf, obstack_vprintf, popen, printf, putc, puts, remove,
+ rename, renameat, snprintf, sprintf, asprintf, vasprintf, vdprintf,
+ vfprintf, vprintf, vsnprintf, vsprintf): Use it.
+ * lib/stdlib.in.h (_GL_ARG_NONNULL): New placeholder.
+ (atoll, canonicalize_file_name, getloadavg, getsubopt, mkdtemp,
+ mkostemp, mkostemps, mkstemp, mkstemps, putenv, srandom_r, initstate_r,
+ setstate_r, random_r, realpath, rpmatch, setenv, strtod, strtoll,
+ strtoull, unsetenv): Use it.
+ * lib/string.in.h (_GL_ARG_NONNULL): New placeholder.
+ (memchr, memmem, mempcpy, memrchr, rawmemchr, stpcpy, stpncpy,
+ strchrnul, strdup, strndup, strnlen, strpbrk, strsep, strstr,
+ strcasestr, strtok_r, mbslen, mbsnlen, mbschr, mbsrchr, mbsstr,
+ mbscasecmp, mbsncasecmp, mbspcasecmp, mbscasestr, mbscspn, mbspbrk,
+ mbsspn, mbssep, mbstok_r, strverscmp): Use it.
+ * lib/strings.in.h (_GL_ARG_NONNULL): New placeholder.
+ (strcasecmp, strncasecmp): Use it.
+ * lib/sys_socket.in.h (_GL_ARG_NONNULL): New placeholder.
+ (rpl_connect, rpl_bind, rpl_getpeername, rpl_getsockname,
+ rpl_getsockopt, rpl_recv, rpl_send, rpl_recvfrom, rpl_sendto,
+ rpl_setsockopt): Use it.
+ * lib/sys_stat.in.h (_GL_ARG_NONNULL): New placeholder.
+ (fchmodat, fstat, fstatat, lchmod, rpl_lstat, mkdir, mkdirat, mkfifo,
+ mkfifoat, mknod, mknodat, stat, utimensat): Use it.
+ * lib/sys_time.in.h (_GL_ARG_NONNULL): New placeholder.
+ (gettimeofday): Use it.
+ * lib/sys_times.in.h (_GL_ARG_NONNULL): New placeholder.
+ (times): Use it.
+ * lib/sys_utsname.in.h (_GL_ARG_NONNULL): New placeholder.
+ (uname): Use it.
+ * lib/time.in.h (_GL_ARG_NONNULL): New placeholder.
+ (nanosleep, mktime, localtime_r, gmtime_r, strptime, timegm): Use it.
+ * lib/unistd.in.h (_GL_ARG_NONNULL): New placeholder.
+ (chown, euidaccess, faccessat, _gl_register_fd, fchownat,
+ getdomainname, gethostname, getlogin_r, lchown, link, linkat, pipe2,
+ pread, readlink, readlinkat, rmdir, symlink, symlinkat, unlink,
+ unlinkat, write): Use it.
+ * lib/wchar.in.h (_GL_ARG_NONNULL): New placeholder.
+ (mbsrtowcs, mbsnrtowcs, wcsrtombs, wcsnrtombs): Use it.
+ * lib/argv-iter.h: Include arg-nonnull.h.
+ (_ATTRIBUTE_NONNULL_): Remove macro.
+ (argv_iter_init_argv, argv_iter_init_stream, argv_iter,
+ argv_iter_n_args, argv_iter_free): Use _GL_ARG_NONNULL.
+ * lib/canonicalize-lgpl.c (_GL_ARG_NONNULL): Define, to defeat gcc
+ optimization.
+ * lib/getaddrinfo.c (_GL_ARG_NONNULL): Likewise.
+ * lib/getdelim.c (_GL_ARG_NONNULL): Likewise.
+ * lib/glob.c (_GL_ARG_NONNULL): Likewise.
+ * lib/random_r.c (_GL_ARG_NONNULL): Likewise.
+ * lib/setenv.c (_GL_ARG_NONNULL): Likewise.
+ * lib/strtod.c (_GL_ARG_NONNULL): Likewise.
+ * lib/tsearch.c (_GL_ARG_NONNULL): Likewise.
+ * lib/unsetenv.c (_GL_ARG_NONNULL): Likewise.
+ * modules/arpa_inet (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into arpa/inet.h.
+ * modules/dirent (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into dirent.h.
+ * modules/fcntl-h (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into fcntl.h.
+ * modules/fnmatch (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into fnmatch.h.
+ * modules/getopt-posix (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into getopt.h.
+ * modules/glob (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into glob.h.
+ * modules/iconv_open (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into iconv.h.
+ * modules/inttypes (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into inttypes.h.
+ * modules/locale (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into locale.h.
+ * modules/math (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into math.h.
+ * modules/netdb (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into netdb.h.
+ * modules/search (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into search.h.
+ * modules/signal (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into signal.h.
+ * modules/spawn (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into spawn.h.
+ * modules/stdio (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into stdio.h.
+ * modules/stdlib (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into stdlib.h.
+ * modules/string (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into string.h.
+ * modules/strings (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into strings.h.
+ * modules/sys_socket (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into sys/socket.h.
+ * modules/sys_stat (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into sys/stat.h.
+ * modules/sys_time (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into sys/time.h.
+ * modules/sys_times (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into sys/times.h.
+ * modules/sys_utsname (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into sys/utsname.h.
+ * modules/time (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into time.h.
+ * modules/unistd (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into unistd.h.
+ * modules/wchar (Depends-on): Add arg-nonnull.
+ (Makefile.am): Insert arg-nonnull.h into wchar.h.
+ * modules/argv-iter (Depends-on): Add arg-nonnull.
+ * tests/test-canonicalize.c (null_ptr): New function.
+ (main): Use it.
+ * tests/test-canonicalize-lgpl.c (null_ptr): New function.
+ (main): Use it.
+ * tests/test-memmem.c (null_ptr): New function.
+ (main): Use it.
+ Reported by Jim Meyering.
+
+2009-12-10 Bruno Haible <bruno@clisp.org>
+
+ Use spaces for indentation, not tabs.
+ * lib/**/*.[hcy] except lib/reg*.[hc]: Untabify.
+ * m4/*.m4: Untabify.
+ * build-aux/*.h: Untabify.
+ * tests/**/*.[hc]: Untabify.
+ * README: New section "Indent with spaces, not TABs", based on
+ coreutils/HACKING and comments by Pádraig Brady and Paolo Bonzini.
+ * NEWS: Mention the change.
+
+2009-12-10 Bruno Haible <bruno@clisp.org>
+
+ pty test: Fix link error.
+ * modules/pty-tests (Makefile.am): Add the default LDADD value to
+ test_pty_LDADD.
+
+2009-12-07 Simon Josefsson <simon@josefsson.org>
+
+ * modules/pty: New file.
+ * modules/pty-tests: New file.
+ * m4/pty.m4: New file.
+ * tests/test-pty.c: New file.
+ * doc/glibc-headers/pty.texi: Modified.
+ * doc/glibc-functions/forkpty.texi: Modified.
+ * doc/glibc-functions/openpty.texi: Modified.
+
+2009-12-10 Bruno Haible <bruno@clisp.org>
+
+ Avoid syntax error in C++ mode.
+ * lib/stdio.in.h (rename): Don't use parameter name 'new'.
+
+2009-12-10 Bruno Haible <bruno@clisp.org>
+
+ Use sed with option -e.
+ * gnulib-tool (func_version, func_emit_copyright_notice,
+ func_emit_initmacro_end, func_import, func_create_testdir): Pass
+ option -e to sed.
+ * modules/link-warning (Makefile.am): Likewise.
+
+2009-12-10 Jim Meyering <meyering@redhat.com>
+
+ mgetgroups: do not write bytes beyond end of malloc'd buffer
+ * lib/mgetgroups.c: Fix an off-by-one error. When we have no
+ username, we call getgroups with a one-element-shorter buffer,
+ but still told it the length was original, max_n_groups.
+
+2009-12-09 Eric Blake <ebb9@byu.net>
+
+ cloexec: relax license
+ * modules/cloexec (Maintainer): Add myself.
+ (License): Use LGPL, not GPL.
+
+ link-warning: optimize generation
+ * modules/link-warning (Makefile.am): Reduce process usage.
+
+2009-12-09 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/unsetenv.texi: Mention Solaris 10 bug for which a
+ workaround was added on 2009-11-17.
+
+2009-12-09 Jim Meyering <meyering@redhat.com>
+ Bruno Haible <bruno@clisp.org>
+
+ link-warning: Allow extra lines at the top of build-aux/link-warning.h.
+ * modules/link-warning (Makefile.am): Make the comment-removing sed
+ command more robust in the face of bootstrap-prepended comment lines.
+
+2009-12-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/mgetgroups.c (mgetgroups): Don't remove duplicates if there is at
+ most one group.
+
+2009-12-09 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * build-aux/link-warning.h: Add copyright notice.
+ * modules/link-warning (Makefile.am): Generate link-warning.h from
+ build-aux/link-warning.h. Update LINK_WARNING_H accordingly.
+ * NEWS: Mention change in link-warning module.
+ * modules/arpa_inet (Makefile.am): Add dependency to arpa/inet.h.
+ * modules/dirent (Makefile.am): Add dependency to dirent.h.
+ * modules/fcntl-h (Makefile.am): Add dependency to fcntl.h.
+ * modules/getopt-posix (Makefile.am): Add dependency to getopt.h.
+ * modules/inttypes (Makefile.am): Add dependency to inttypes.h.
+ * modules/math (Makefile.am): Add dependency to math.h.
+ * modules/search (Makefile.am): Add dependency to search.h.
+ * modules/signal (Makefile.am): Add dependency to signal.h.
+ * modules/spawn (Makefile.am): Add dependency to spawn.h.
+ * modules/stdio (Makefile.am): Add dependency to stdio.h.
+ * modules/stdlib (Makefile.am): Add dependency to stdlib.h.
+ * modules/string (Makefile.am): Add dependency to string.h.
+ * modules/strings (Makefile.am): Add dependency to strings.h.
+ * modules/sys_ioctl (Makefile.am): Add dependency to sys/ioctl.h.
+ * modules/sys_select (Makefile.am): Add dependency to sys/select.h.
+ * modules/sys_socket (Makefile.am): Add dependency to sys/socket.h.
+ * modules/sys_stat (Makefile.am): Add dependency to sys/stat.h.
+ * modules/sys_times (Makefile.am): Add dependency to sys/times.h.
+ * modules/sys_utsname (Makefile.am): Add dependency to sys/utsname.h.
+ * modules/sys_wait (Makefile.am): Add dependency to sys/wait.h.
+ * modules/unistd (Makefile.am): Add dependency to unistd.h.
+ * modules/wchar (Makefile.am): Add dependency to wchar.h.
+
+2009-12-09 Bruno Haible <bruno@clisp.org>
+
+ fchdir: Optimize away rpl_fstat when possible.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Set REPLACE_FSTAT only together with
+ REPLACE_OPEN_DIRECTORY.
+ * lib/fchdir.c (rpl_fstat): Define only when REPLACE_OPEN_DIRECTORY.
+
+2009-12-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/fchdir.c: Update comment.
+
+2009-12-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/cloexec.c (set_cloexec_flag): Clarify intent of dup2 call.
+
+2009-12-08 Eric Blake <ebb9@byu.net>
+
+ fchdir: avoid memory leak on re-registration.
+ * lib/fchdir.c (ensure_dirs_slot): Avoid memory leak.
+
+2009-12-08 Jim Meyering <meyering@redhat.com>
+
+ init.sh: avoid Solaris 10 /bin/sh portability problem
+ Solaris 10's /bin/sh does not pass '.' arguments 2.. to the
+ sourced script:
+ $ printf 'echo "$@"\n' > f; /bin/sh -c '. ./f bar'
+ $ printf 'echo "$@"\n' > f; /bin/bash -c '. ./f bar'
+ bar
+ tests/init.sh relied on that, accepting a --set-path=DIR argument,
+ and two tests used that idiom.
+ * tests/init.sh: Update suggested usage comments.
+ (path_prepend_): New function, to be used in place
+ of the --src-path=DIR option.
+ (setup_): Move PATH-prepending code into path_prepend_.
+ * tests/test-pread.sh: Adapt to new usage.
+ * tests/test-xalloc-die.sh: Likewise.
+
+2009-12-08 Simon Josefsson <simon@josefsson.org>
+
+ * doc/gnulib.texi (Glibc pty.h): Add.
+ * doc/glibc-functions/forkpty.texi: Add.
+ * doc/glibc-functions/openpty.texi: Add.
+ Suggested by Bruno Haible.
+
+2009-12-08 Eric Blake <ebb9@byu.net>
+
+ fchdir: fix logic bugs
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Fix logic bug.
+ * tests/test-fchdir.c (main): Enhance test.
+ * lib/fchdir.c (rpl_fstat): Always provide if fchdir replacement
+ is in use.
+
+ dup2: fix logic bugs
+ * lib/dup2.c (dup2): Fix logic bugs. Use HAVE_DUP2 rather than
+ REPLACE_DUP2 to decide when rpl_dup2 is needed.
+ * m4/dup2.m4 (gl_REPLACE_DUP2): Only define REPLACE_DUP2 when dup2
+ exists.
+ (gl_FUNC_DUP2): Drop unneeded AC_DEFINE.
+
+2009-12-07 Eric Blake <ebb9@byu.net>
+
+ unlink: fix m4 detection
+ * m4/unlink.m4 (gl_FUNC_UNLINK): Include correct header.
+
+ unistd-safer: add unit test
+ * modules/unistd-safer-tests: New file.
+ * tests/test-dup-safer.c: Likewise.
+ * tests/test-cloexec.c (setmode): Avoid compiler warning.
+ * tests/test-dup2.c (setmode): Likewise.
+ * lib/cloexec.c (dup_cloexec): Fix mingw compile error.
+
+ cloexec: preserve text vs. binary across dup_cloexec
+ * lib/cloexec.c (dup_cloexec) [W32]: Query and use translation
+ mode.
+ * modules/dup2-tests (Depends-on): Add binary-io.
+ * modules/cloexec-tests (Depends-on): Likewise.
+ * tests/test-dup2.c (setmode, is_mode): New helpers.
+ (main): Add tests that translation mode is preserved.
+ * tests/test-cloexec.c (setmode, is_mode, main): Likewise.
+ Reported by Bruno Haible.
+
+ mgetgroups: reduce duplicate listings
+ * lib/mgetgroups.c (mgetgroups): Reduce duplicates from the
+ resulting array.
+ * tests/test-chown.h (test_chown): Simplify client.
+ * tests/test-lchown.h (test_lchown): Likewise.
+
+2009-12-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/cloexec.c (dup_cloexec): Fix handling of _gl_register_dup return
+ value.
+
+2009-12-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.c: Include stdio.h, stdlib.h.
+ (set_program_name): Reject a NULL argument.
+
+2009-12-05 Eric Blake <ebb9@byu.net>
+
+ pipe2-safer: new module
+ * modules/pipe2-safer: New file.
+ * lib/unistd-safer.h (pipe2_safer): New prototype.
+ * lib/unistd--.h (pipe2): New wrapper.
+ * lib/pipe-safer.c (pipe2_safer): New function.
+ * modules/pipe (Depends-on): Add pipe2-safer.
+ * lib/pipe.c (create_pipe) [WIN32]: Let pipe2_safer do the work.
+
+ stdlib-safer: preserve cloexec flag for mkostemp[s]
+ * lib/mkstemp-safer.c (mkostemp_safer, mkostemps_safer): Use new
+ fd_safer_flag.
+
+ unistd-safer: allow preservation of cloexec status via flag
+ * lib/unistd-safer.h (dup_safer_flag, fd_safer_flag): New
+ prototypes.
+ * lib/dup-safer.c (dup_safer_flag): New function.
+ * lib/fd-safer.c (fd_safer_flag): Likewise.
+ * modules/cloexec (configure.ac): Set witness.
+
+ test-dup2: enhance test
+ * modules/dup2-tests (Depends-on): Add cloexec.
+ * tests/test-dup2.c (main): Enhance test.
+
+ cloexec: add dup_cloexec
+ * lib/cloexec.h (dup_cloexec): New prototype. Add copyright
+ header and comments.
+ * lib/cloexec.c (set_cloexec_flag): Add comments.
+ (dup_cloexec): New function, with mingw implementation borrowed
+ from...
+ * lib/w32spawn.h (dup_noinherit): ...here.
+ * modules/execute (Depends-on): Add cloexec.
+ * modules/pipe (Depends-on): Likewise.
+ * modules/cloexec (Depends-on): Add dup2.
+ * modules/cloexec-tests (Files): New file.
+ * tests/test-cloexec.c: Likewise.
+
+ test-xalloc-die: fix test for mingw
+ * modules/xalloc-die-tests (Files): Add tests/init.sh.
+ * tests/test-xalloc-die.sh: Rewrite to use init.sh. Strip
+ directory and .exe suffix off argv[0] output.
+
+ test-fseeko: fix test for mingw
+ * tests/test-fseeko.c (fseek): Redefine GL_LINK_WARNING, rather
+ than undefining fseek, so test will pass on mingw.
+
+2009-12-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.h (set_program_name): Clarify specification.
+ * lib/progname.c (set_program_name): Likewise.
+ Reported by Jim Meyering.
+
+2009-12-05 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: backslash-escape parens in default regexp
+ * top/maint.mk (news-check-regexp): Now that we're using grep -E,
+ backslash-escape the literal parentheses.
+
+ maint.mk: news-date-check: use grep -E
+ * top/maint.mk (today): Define a Make variable, not a...
+ (news-date-check): ...shell variable.
+ (news-date-regexp): Use the Make variable.
+ Use grep's -E option. Change the failing diagnostic to mention
+ the variable, $(news-date-regexp).
+
+2009-12-04 Alfred M. Szmidt <ams@gnu.org>
+
+ maintainer-makefile: allow customization of NEWS entry format
+ * top/maint.mk (news-date-regexp): New overridable variable.
+ (news-date-check): Use it.
+
+2009-12-04 Eric Blake <ebb9@byu.net>
+
+ mgetgroups: add xgetgroups, and avoid ENOSYS failures
+ * lib/mgetgroups.h (xgetgroups): New prototype.
+ * lib/mgetgroups.c (xgetgroups): New wrapper.
+ (mgetgroups): Handle ENOSYS.
+ * modules/mgetgroups (Depends-on): Add realloc.
+ Reported by Scott Harrison <scott.gnu.2009@scottrix.co.uk>.
+
+ mgetgroups: avoid argument promotion issues with -1
+ * lib/mgetgroups.c (mgetgroups): A cast is required when checking
+ for invalid gid_t.
+ * tests/test-chown.h (getegid, test_chown): Likewise.
+ * tests/test-lchown.h (getegid, test_lchown): Likewise.
+
+2009-12-03 Paolo Bonzini <bonzini@gnu.org>
+
+ exclude: Fix header file problems.
+ * lib/exclude.h: Add multiple inclusion guards and include stdbool.h.
+
+2009-12-01 Jim Meyering <meyering@redhat.com>
+
+ fts: fts_open: do not let an empty string cause immediate failure
+ This is required in support of GNU rm, for which the command
+ "rm A '' B" must process and remove both A and B, in spite of
+ the empty string argument.
+ * lib/fts.c (fts_open): Do not let the presence of an empty string
+ cause fts_open to fail immediately. Most fts-using tools must be
+ able to process all arguments, in order, and can be expected to
+ diagnose such arguments themselves.
+
+2009-11-30 Eric Blake <ebb9@byu.net>
+
+ utimens: fix compilation error
+ * lib/utimens.c (lutimens) [!HAVE_UTIMENSAT && HAVE_LUTIMES]:
+ Declare variable at right scope.
+
+2009-11-29 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: handle perl-5.11's changed --version output
+ * build-aux/bootstrap (get_version): Handle perl separately,
+ since perl-5.11's --version output is different.
+
+2009-11-28 Jim Meyering <meyering@redhat.com>
+
+ userspec: depend on the inttostr module, too
+ * modules/userspec (Depends-on): Add inttostr.
+
+ userspec: disallow an ID that maps to (uid_t)-1 or (gid_t)-1
+ * lib/userspec.c (parse_with_separator): Do not accept a user ID
+ number of MAXUID when it evaluates to (uid_t) -1.
+ Likewise for group ID. Reported by Matt McCutchen in
+ <http://savannah.gnu.org/bugs/?28113>
+
+ userspec: reformat to use spaces, not TABs
+ * lib/userspec.c: Expand TABs to spaces.
+ Add Emacs' "indent-tabs-mode: nil" hint.
+
+2009-11-27 Eric Blake <ebb9@byu.net>
+
+ getopt-gnu: flush out another BSD bug
+ * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS): Test for the bug.
+ * tests/test-getopt.c (main): Check POSIXLY_CORRECT first, to
+ flush out BSD bug.
+ * tests/test-getopt.h (test_getopt): End lists with NULL.
+ * tests/test-getopt_long.h (test_getopt_long): Likewise.
+ (test_getopt_long_posix): Enhance test.
+ * modules/getopt-posix-tests (Depends-on): Add stdbool.
+ * doc/glibc-functions/getopt_long.texi (getopt_long): Mention
+ getopt-gnu.
+ * doc/glibc-functions/getopt_long_only.texi (getopt_long_only):
+ Likewise.
+
+2009-11-27 Simon Josefsson <simon@josefsson.org>
+
+ * modules/idpriv-droptemp-tests (Notice): Fix text.
+
+2009-11-27 Jim Meyering <meyering@redhat.com>
+
+ test-xalloc-die: avoid spurious failure due to libtool argv difference
+ In a libtool-enabled project, this test would fail due to a difference
+ in the emitted program name, e.g.,
+ -test-xalloc-die: memory exhausted
+ +/tmp/.../tests/.libs/lt-test-xalloc-die: memory exhausted
+ Use program to avoid that.
+ * modules/xalloc-die-tests (Depends-on): Add progname.
+ * tests/test-xalloc-die.c: Include progname.h".
+ (program_name): Remove decl.
+ (main): Call set_program_name.
+ * tests/test-xalloc-die.sh (compare): Remove unnecessary ${EXE}.
+
+2009-11-26 Richard Jones <rjones@redhat.com>
+
+ w32sock: leave win32 error in place.
+ * lib/w32sock.h (set_winsock_errno): Do not call WSASetLastError.
+
+2009-11-26 Eric Blake <ebb9@byu.net>
+
+ init.sh: suggest to use skip_ and fail_ functions in comments
+ * tests/init.sh: Add a sentence.
+
+2009-11-25 Bruno Haible <bruno@clisp.org>
+
+ init.sh: add documentation in comments
+ * tests/init.sh: Add some developer and user documentation.
+
+2009-11-26 Jim Meyering <meyering@redhat.com>
+
+ init.sh: accommodate even those who specify bogus srcdir manually
+ * tests/init.sh: Normally, srcdir is guaranteed by automake and
+ configure-time tests to be sanitized, so that there is no need to
+ use "$srcdir" in Makefile rules and shell scripts. Using $srcdir
+ (with no double quotes) suffices. However, since tests may be
+ invoked manually, and since you may explicitly set srcdir to the
+ name of a directory containing spaces, do quote its uses here.
+ * tests/test-pread.sh: Likewise.
+ Suggested by Bruno Haible.
+
+ test-pread.sh: avoid diagnostics for those who ignore SIGPIPE
+ * tests/test-pread.sh: Write no data into the pipe, because
+ test-pread actually reads none. This avoids a diagnostic,
+ "bash: echo: write error: Broken pipe", that arises in the unusual
+ event something is ignoring SIGPIPE, and might be interpreted
+ as some sort of failure. Reported by Bruno Haible.
+
+2009-11-25 Jim Meyering <meyering@redhat.com>
+
+ test-pread: cover failure with ESPIPE and EINVAL
+ * tests/test-pread.c (main): Test for failure, too.
+ * tests/test-pread.sh: Invoke with stdin on a pipe.
+ Suggested by Eric Blake.
+
+ pread: improvement and fix
+ * modules/pread (Depends-on): Depend on lseek, for portability to
+ e.g., mingw. Suggested by Eric Blake.
+ * lib/pread.c (__libc_read): Define. Reported by Richard W.M. Jones.
+
+ unistd.in.h: correct declaration of pread
+ * lib/unistd.in.h: Correct type of "buf" parameter: void*, not char*
+ Reported by Richard W.M. Jones.
+
+ test-pread.sh: distribute the test script
+ * modules/pread-tests (Files): Include test-pread.sh.
+
+ test-pread.sh: clean up
+ * tests/test-pread.sh: Don't refer to $builddir. Just use equivalent ".".
+ * modules/pread-tests (TESTS_ENVIRONMENT): Don't export builddir.
+ That is unnecessary, since it's always ".".
+ Suggestion from Eric Blake.
+
+ test-pread.sh: make executable
+ * tests/test-pread.sh: Set executable bit.
+ Reported by Eric Blake.
+
+ correct typo in test-pread.sh
+ * tests/test-pread.sh: Add #! line.
+
+ test pread
+ * tests/test-pread.c: New file.
+ * tests/test-pread.sh: Likewise.
+ * modules/pread-tests: Likewise.
+
+ pread: new module
+ * modules/pread: New file.
+ * lib/unistd.in.h (pread): Define/declare.
+ * lib/pread.c (pread): New file.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Define defaults.
+ * modules/unistd (Makefile.am): Substitute witnesses.
+ * doc/posix-functions/pread.texi (pread): Update.
+ * MODULES.html.sh: Add pread.
+
+2009-11-25 Jim Meyering <meyering@redhat.com>
+
+ tests/init.sh: new file to be used via most *.sh tests
+ * tests/init.sh: New file.
+
+2009-11-25 Eric Blake <ebb9@byu.net>
+
+ utimens: work around older Linux failure with symlinks
+ * lib/utimens.c (lutimensat_works_really): New variable.
+ (fdutimens, lutimens): Use it to manage kernels that support
+ nanosecond times on files, but not on symlinks.
+ Reported by Ondřej Vašík.
+
+ utimes: fix configure grammar
+ * m4/utimes.m4 (gl_FUNC_UTIMES): Delete spurious word.
+
+2009-11-25 Paolo Bonzini <bonzini@gnu.org>
+
+ regex: Fix fastmap for multibyte character ranges.
+ * lib/regcomp.c (re_compute_fastmap_iter): Add all multibyte lead
+ characters when a multibyte character range is included.
+
+2009-11-22 Andy Wingo <wingo@pobox.com>
+
+ version-etc: work also with AM_INIT_AUTOMAKE's no-define option
+ * lib/version-etc.c [!defined PACKAGE]: Define to PACKAGE_TARNAME.
+
+2009-11-24 Bruno Haible <bruno@clisp.org>
+
+ doc: Most *_l functions exist in MacOS X 10.5.
+ * doc/posix-functions/duplocale.texi: Update platforms list.
+ * doc/posix-functions/freelocale.texi: Likewise.
+ * doc/posix-functions/newlocale.texi: Likewise.
+ * doc/posix-functions/uselocale.texi: Likewise.
+ * doc/posix-functions/isalnum_l.texi: Likewise.
+ * doc/posix-functions/isalpha_l.texi: Likewise.
+ * doc/posix-functions/isblank_l.texi: Likewise.
+ * doc/posix-functions/iscntrl_l.texi: Likewise.
+ * doc/posix-functions/isdigit_l.texi: Likewise.
+ * doc/posix-functions/isgraph_l.texi: Likewise.
+ * doc/posix-functions/islower_l.texi: Likewise.
+ * doc/posix-functions/isprint_l.texi: Likewise.
+ * doc/posix-functions/ispunct_l.texi: Likewise.
+ * doc/posix-functions/isspace_l.texi: Likewise.
+ * doc/posix-functions/isupper_l.texi: Likewise.
+ * doc/posix-functions/iswalnum_l.texi: Likewise.
+ * doc/posix-functions/iswalpha_l.texi: Likewise.
+ * doc/posix-functions/iswblank_l.texi: Likewise.
+ * doc/posix-functions/iswcntrl_l.texi: Likewise.
+ * doc/posix-functions/iswctype_l.texi: Likewise.
+ * doc/posix-functions/iswdigit_l.texi: Likewise.
+ * doc/posix-functions/iswgraph_l.texi: Likewise.
+ * doc/posix-functions/iswlower_l.texi: Likewise.
+ * doc/posix-functions/iswprint_l.texi: Likewise.
+ * doc/posix-functions/iswpunct_l.texi: Likewise.
+ * doc/posix-functions/iswspace_l.texi: Likewise.
+ * doc/posix-functions/iswupper_l.texi: Likewise.
+ * doc/posix-functions/iswxdigit_l.texi: Likewise.
+ * doc/posix-functions/isxdigit_l.texi: Likewise.
+ * doc/posix-functions/nl_langinfo_l.texi: Likewise.
+ * doc/posix-functions/strcasecmp_l.texi: Likewise.
+ * doc/posix-functions/strcoll_l.texi: Likewise.
+ * doc/posix-functions/strfmon_l.texi: Likewise.
+ * doc/posix-functions/strftime_l.texi: Likewise.
+ * doc/posix-functions/strncasecmp_l.texi: Likewise.
+ * doc/posix-functions/strxfrm_l.texi: Likewise.
+ * doc/posix-functions/tolower_l.texi: Likewise.
+ * doc/posix-functions/toupper_l.texi: Likewise.
+ * doc/posix-functions/towctrans_l.texi: Likewise.
+ * doc/posix-functions/towlower_l.texi: Likewise.
+ * doc/posix-functions/towupper_l.texi: Likewise.
+ * doc/posix-functions/wcscoll_l.texi: Likewise.
+ * doc/posix-functions/wcsxfrm_l.texi: Likewise.
+ * doc/posix-functions/wctrans_l.texi: Likewise.
+ * doc/posix-functions/wctype_l.texi: Likewise.
+ * doc/glibc-functions/strptime_l.texi: Likewise.
+ * doc/glibc-functions/strtod_l.texi: Likewise.
+ * doc/glibc-functions/strtof_l.texi: Likewise.
+ * doc/glibc-functions/strtol_l.texi: Likewise.
+ * doc/glibc-functions/strtold_l.texi: Likewise.
+ * doc/glibc-functions/strtoll_l.texi: Likewise.
+ * doc/glibc-functions/strtoul_l.texi: Likewise.
+ * doc/glibc-functions/strtoull_l.texi: Likewise.
+ * doc/glibc-functions/wcsftime_l.texi: Likewise.
+ * doc/glibc-functions/wcstod_l.texi: Likewise.
+ * doc/glibc-functions/wcstof_l.texi: Likewise.
+ * doc/glibc-functions/wcstol_l.texi: Likewise.
+ * doc/glibc-functions/wcstold_l.texi: Likewise.
+ * doc/glibc-functions/wcstoll_l.texi: Likewise.
+ * doc/glibc-functions/wcstoul_l.texi: Likewise.
+ * doc/glibc-functions/wcstoull_l.texi: Likewise.
+
+2009-11-24 Bruno Haible <bruno@clisp.org>
+
+ duplocale: Fix logic bug.
+ * lib/duplocale.c: Don't include <langinfo.h>.
+ (_NL_LOCALE_NAME): Remove macro.
+ (rpl_duplocale): Use setlocale instead of nl_langinfo.
+ * tests/test-duplocale.c (main): Also test duplocale after uselocale.
+
+2009-11-23 Jim Meyering <meyering@redhat.com>
+
+ test-update-copyright: don't hard-code /usr/bin/perl
+ * tests/test-update-copyright.sh (YEAR): Use date +%Y, rather than
+ perl to print the current year. Gilles Espinasse reported that
+ the replaced use of perl was hard-coded as /usr/bin/perl.
+
+2009-11-23 Bruno Haible <bruno@clisp.org>
+
+ duplocale: Add support for glibc 2.3.x.
+ * lib/duplocale.c (rpl_duplocale): Add fallback code for glibc 2.3.x.
+
+2009-11-22 Bruno Haible <bruno@clisp.org>
+
+ vasnprintf: Tiny optimization.
+ * lib/vasnprintf.c (decimal_point_char): Choose the fast path also on
+ MacOS X.
+
+2009-11-22 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'duplocale'.
+ * modules/duplocale-tests: New file.
+ * tests/test-duplocale.c: New file.
+
+ New module 'duplocale'.
+ * m4/duplocale.m4: New file.
+ * lib/locale.in.h (duplocale): New declaration.
+ * lib/duplocale.c: New file.
+ * m4/locale_h.m4 (gl_REPLACE_LOCALE_H, gl_LOCALE_MODULE_INDICATOR,
+ gl_LOCALE_H_DEFAULTS): New macros.
+ (gl_LOCALE_H): Require gl_LOCALE_H_DEFAULTS. Invoke
+ gl_CHECK_NEXT_HEADERS unconditionally. Invoke gl_REPLACE_LOCALE_H.
+ * modules/locale (Makefile.am): Substitute also GNULIB_DUPLOCALE,
+ REPLACE_DUPLOCALE.
+ * modules/duplocale: New file.
+ * doc/posix-functions/duplocale.texi: Mention the glibc bug.
+
+2009-11-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/locale-tests (configure.ac): Test for newlocale function.
+ * tests/test-locale.c: When the system has extended locale functions,
+ verify that <locale.h> defines locale_t and LC_GLOBAL_LOCALE.
+
+ locale: Make locale_t available when possible.
+ * lib/locale.in.h: Include <xlocale.h> when it exists.
+ * m4/locale_h.m4 (gl_LOCALE_H): Check for <xlocale.h> and arrange to
+ replace <locale.h> if it does not define locale_t but <xlocale.h> does.
+ * modules/locale (Depends-on): Add extensions.
+ (Makefile.am): Also substitute HAVE_XLOCALE_H.
+ * doc/posix-headers/locale.texi: Document the problem with locale_t.
+
+2009-11-22 Bruno Haible <bruno@clisp.org>
+
+ Add comments.
+ * m4/dirent_h.m4 (gl_DIRENT_H): Add comment about gl_CHECK_NEXT_HEADERS
+ invocation.
+ * m4/iconv_h.m4 (gl_ICONV_H): Likewise.
+ * m4/spawn_h.m4 (gl_SPAWN_H): Likewise.
+ * m4/wchar.m4 (gl_WCHAR_H): Likewise.
+
+2009-11-22 Bruno Haible <bruno@clisp.org>
+
+ error: account for the possibility of freopen (stdout).
+ * lib/error.c: Include <unistd.h>.
+ (flush_stdout): New function, extracted from error and error_at_line.
+ Determine stdout's fd dynamically.
+ (error, error_at_line): Invoke flush_stdout.
+ * m4/error.m4 (gl_PREREQ_ERROR): Require AC_C_INLINE.
+ * modules/error (Depends-on): Add unistd.
+
+2009-11-22 Bruno Haible <bruno@clisp.org>
+
+ diffseq: Add comment.
+ * lib/diffseq.h (IF_LINT): Add comment about pitfall.
+
+2009-11-22 Jim Meyering <meyering@redhat.com>
+
+ c-stack: avoid defining an unused static function
+ * lib/c-stack.c (find_stack_direction): Do not define this function
+ when it will not be used.
+
+ diffseq: avoid spurious gcc warnings
+ * lib/diffseq.h (IF_LINT2): Define.
+ (compareseq): Use it to initialize two members of "part".
+ This avoids two used-uninitialized warnings.
+
+2009-11-21 Jim Meyering <meyering@redhat.com>
+
+ c-stack: avoid "ignoring return value of `write'" warning
+ * lib/c-stack.c: Include "ignore-value.h".
+ (die): Explicitly ignore each write return value.
+ * modules/c-stack (Depends-on): Add ignore-value.
+
+2009-11-21 Bruno Haible <bruno@clisp.org>
+
+ diffseq: reduce scope of variable 'best'.
+ * lib/diffseq.h (diag) [USE_HEURISTIC]: Reduce scope of 'best'
+ variable, earlier used for two different purposes.
+
+2009-11-21 Jim Meyering <meyering@redhat.com>
+
+ diffseq: remove useless assignment to "best"
+ * lib/diffseq.h (diag) [USE_HEURISTIC]: Remove useless "best = 0"
+ assignment. At that point "best" is already guaranteed to be zero.
+
+2009-11-20 Eric Blake <ebb9@byu.net>
+
+ build: mention ftp redirector in release announcements
+ * top/maint.mk (gnu_rel_host, url_dir_list): Provide defaults for
+ values that used to come from cfg.mk; mention FTP redirect URL.
+ * build-aux/announce-gen: Mention the mirror list.
+ Suggested by Karl Berry.
+
+ nanosleep: improve port to mingw
+ * lib/nanosleep.c (rpl_nanosleep): Reject invalid arguments.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Incorporate LIBSOCKET into
+ LIB_NANOSLEEP, but only when needed.
+ * modules/select (Link): Document LIBSOCKET.
+ * m4/select.m4 (gl_FUNC_SELECT): Ensure LIBSOCKET is defined early
+ enough.
+
+ nanosleep: work around cygwin bug
+ * lib/nanosleep.c (rpl_nanosleep) [HAVE_BUG_BIG_NANOSLEEP]:
+ Fix logic bug when nanosleep fails. Work around cygwin 1.5.x
+ bug.
+ (getnow): Delete, not needed.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): No longer require
+ LIB_CLOCK_GETTIME.
+ * modules/nanosleep (Depends-on): Add intprops and verify. Drop
+ clock-time, gettime.
+ * doc/posix-functions/nanosleep.texi (nanosleep): Document the
+ bug.
+ * modules/nanosleep-tests: New test.
+ * tests/test-nanosleep.c: New file.
+
+ sleep: work around cygwin bug
+ * lib/sleep.c (rpl_sleep): Work around the bug.
+ * m4/sleep.m4 (gl_FUNC_SLEEP): Detect the bug.
+ (gl_PREREQ_SLEEP): Delete unused macro.
+ * modules/sleep (Depends-on): Add verify.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add default.
+ * modules/unistd (Makefile.am): Substitute witness.
+ * lib/unistd.in.h (sleep): Update prototype.
+ * doc/posix-functions/sleep.texi (sleep): Document the bug.
+ * tests/test-sleep.c (main) [HAVE_DECL_ALARM]: Test it.
+ * modules/sleep-tests (Depends-on): Check for alarm.
+
+2009-11-20 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: improve sc_prohibit_magic_number_exit
+ * top/maint.mk (sc_prohibit_magic_number_exit): Tighten regexp
+ so it does not match uses like System.exit(1).
+ Add comments showing how to correct all offenders.
+
+2009-11-19 Eric Blake <ebb9@byu.net>
+
+ xalloc-die-tests: add missing library
+ * modules/xalloc-die-tests (Makefile.am): Add LDADD line.
+
+ test-xvasprintf: silence compiler warnings
+ * tests/test-xvasprintf.c (test_xvasprintf, test_xasprintf): Mask
+ empty string from gcc.
+
+2009-11-19 Jim Meyering <meyering@redhat.com>
+
+ xfreopen: new module, from coreutils
+ * modules/xfreopen: New module.
+ * lib/xfreopen.c: New file.
+ * lib/xfreopen.h: New file.
+ * MODULES.html.sh (File stream based Input/Output"): Add it.
+
+2009-11-19 Eric Blake <ebb9@byu.net>
+
+ manywarnings: depend on warnings
+ * modules/manywarnings (Depends-on): Add warnings.
+
+ build: avoid compiler warnings
+ * lib/select.c (rpl_select): Delete unused variable.
+ * lib/setsockopt.c (rpl_setsockopt): Avoid incompatible pointer.
+
+2009-11-18 Eric Blake <ebb9@byu.net>
+
+ tests: avoid false negative with --with-packager
+ * tests/test-version-etc.sh: Discard packager information.
+ * tests/test-argp-version-etc-1.sh: Likewise.
+ Reported by Mike Frysinger.
+
+ utimens: fix regression on Solaris
+ * m4/utimens.m4 (gl_UTIMENS): Check for BSD bug.
+ * lib/utimens.c (fdutimens): Revert 2009-11-08 change; Solaris 10
+ can only change fd timestamps via futimesat. Instead, use an
+ additional witness macro to avoid BSD bug.
+ Reported by Jim Meyering.
+
+2009-11-17 Eric Blake <ebb9@byu.net>
+
+ usleep: use it to simplify tests
+ * modules/stat-time-tests (Depends-on): Add usleep.
+ (configure.ac): Drop usleep check.
+ * modules/chown-tests (Depends-on, configure.ac): Likewise.
+ * modules/lchown-tests (Depends-on, configure.ac): Likewise.
+ * modules/fdutimensat-tests (Depends-on, configure.ac): Likewise.
+ * modules/futimens-tests (Depends-on, configure.ac): Likewise.
+ * modules/openat-tests (Depends-on, configure.ac): Likewise.
+ * modules/utimens-tests (Depends-on, configure.ac): Likewise.
+ * modules/utimensat-tests (Depends-on, configure.ac): Likewise.
+ * modules/pipe-filter-gi-tests (Depends-on, configure.ac):
+ Likewise.
+ * tests/test-chown.h (nap): Rely on nicer usleep semantics.
+ * tests/test-lchown.h (nap): Likewise.
+ * tests/test-pipe-filter-gi2-main.c (small_nap): Likewise.
+ * tests/test-stat-time.c (nap): Likewise.
+ * tests/test-utimens-common.h (nap): Update comments.
+
+ usleep: new module
+ * modules/usleep: New file.
+ * m4/usleep.m4 (gl_FUNC_USLEEP): Likewise.
+ * lib/usleep.c (usleep): Likewise.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add defaults.
+ * modules/unistd (Makefile.am): Substitute witnesses.
+ * lib/unistd.in.h (usleep): Add declaration.
+ * doc/pastposix-functions/usleep.texi (usleep): Document this.
+ * MODULES.html.sh (Date and time): Likewise.
+ * modules/usleep-tests (Depends-on): New test.
+ * tests/test-usleep.c: New file.
+
+ chown: work around OpenBSD bug
+ * lib/chown.c (rpl_chown): Work around the bug.
+ * lib/lchown.c (rpl_lchown): Attempt to do likewise.
+ * m4/chown.m4 (gl_FUNC_CHOWN): Test for ctime bug.
+ * m4/lchown.m4 (gl_FUNC_LCHOWN): Check for lchmod.
+ * modules/chown (Depends-on): Add stdbool.
+ * modules/lchown (Depends-on): Likewise.
+ * doc/posix-functions/chown.texi (chown): Document the bug.
+ * doc/posix-functions/lchown.texi (lchown): Likewise.
+ * tests/test-lchown.h (test_chown): Relax test.
+
+ mkstemp: avoid conflict with C++ keyword template
+ * lib/mkdtemp.c (mkdtemp): Change spelling of template.
+ * lib/mkostemp.c (mkostemp): Likewise.
+ * lib/mkostemps.c (mkostemps): Likewise.
+ * lib/mkstemp.c (mkstemp): Likewise.
+ * lib/mkstemps.c (mkstemps): Likewise.
+
+ xalloc-die-tests: optimize
+ * tests/test-xalloc-die.sh: Reduce number of processes.
+
+2009-11-17 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool: Support LGPLv3+ licenses in module files. Tiny
+ patch from ludo@gnu.org (Ludovic Courtès).
+
+2009-11-17 Jim Meyering <meyering@redhat.com>
+
+ version-etc: use proper license string
+ * modules/version-etc (License): Use LGPL, not LGPLv3+.
+ * modules/version-etc-fsf: Likewise.
+
+2009-11-17 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-xalloc-die.sh: Add license. Check that nothing is
+ printed to stdout. Deal with EOL differences.
+
+2009-11-17 Eric Blake <ebb9@byu.net>
+
+ unsetenv: work around Solaris bug
+ * m4/setenv.m4 (gl_FUNC_UNSETENV): Check for bug.
+ * lib/unsetenv.c (rpl_unsetenv): Work around it.
+ Reported by Jim Meyering.
+
+ vasnprintf: avoid compiler warnings
+ * lib/vasnprintf.c (VASNPRINTF): Avoid shadowing our own local
+ variables.
+ * lib/printf-args.c (PRINTF_FETCHARGS): Avoid type mismatch.
+
+2009-11-17 Simon Josefsson <simon@josefsson.org>
+
+ * modules/xalloc-die-tests (Makefile.am): Drop XFAIL_TESTS
+ settings since xalloc-die is no longer the self test,
+ xalloc-die.sh is.
+
+2009-11-17 Jim Meyering <meyering@redhat.com>
+
+ test-xalloc-die.sh: make the code agree with the commit log
+ * tests/test-xalloc-die.sh: Put "." at the front of $PATH, not
+ at the end, just in case you happen to have a test-xalloc-die
+ program in some other PATH directory.
+
+ test-xalloc-die.sh: fix a portability bug
+ * tests/test-xalloc-die.sh: Do not invoke via ./test-xalloc-die.
+ Instead, set PATH to start with "." and invoke via "test-xalloc-die".
+ Otherwise, argv[0] (as often seen in diagnostics) would be too
+ system-dependent, sometimes with, and sometimes without the leading "./".
+
+ version-etc-fsf: relax license to LGPLv3+
+ * modules/version-etc-fsf (License): Relax license.
+
+2009-11-16 Eric Blake <ebb9@byu.net>
+
+ xalloc-die-tests: avoid printing null pointer
+ * modules/xalloc-die-tests (Files, Makefile.am): Wrap execution in
+ shell script.
+ * tests/test-xalloc-die.c (program_name): Declare.
+ * tests/test-xalloc-die.sh (tmpfiles): New file.
+
+ setenv, unsetenv: work around various bugs
+ * lib/setenv.c (setenv) [!HAVE_SETENV]: Resync from glibc.
+ (setenv) [HAVE_SETENV]: Work around bugs.
+ * lib/unsetenv.c (unsetenv) [HAVE_UNSETENV]: Work around bugs.
+ * m4/setenv.m4 (gl_FUNC_SETENV_SEPARATE, gl_FUNC_UNSETENV): Check
+ for bugs.
+ (gl_FUNC_SETENV): Write in terms of gl_FUNC_SETENV_SEPARATE.
+ * m4/environ.m4 (gl_ENVIRON): Avoid expand-before-require.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Update defaults.
+ * modules/stdlib (Makefile.am): Update substitutions.
+ * lib/stdlib.in.h (setenv, unsetenv): Update prototypes.
+ * doc/posix-functions/setenv.texi (setenv): Document the bugs.
+ * doc/posix-functions/unsetenv.texi (unsetenv): Likewise.
+ * modules/setenv-tests: New test.
+ * modules/unsetenv-tests: Likewise.
+ * tests/test-setenv.c: New file.
+ * tests/test-unsetenv.c: Likewise.
+
+2009-11-16 Jim Meyering <meyering@redhat.com>
+
+ version-etc: relax license to LGPLv3+
+ * modules/version-etc (License): Relax license.
+
+ better AC_REQUIRE expanded-before-required-warning avoidance
+ * m4/chown.m4 (gl_FUNC_CHOWN, gl_FUNC_CHOWN_FOLLOWS_SYMLINK): Define
+ with AC_DEFUN_ONCE, rather than AC_DEFUN, to avoid AC_REQUIRE warnings.
+ Suggested by Eric Blake. This change also reverts commit 1b712ba8,
+ which is no longer needed.
+
+2009-11-16 Eric Blake <ebb9@byu.net>
+
+ test-freading: clean up temporary file
+ * tests/test-freading.c (main): Remove file on success, and use
+ ASSERT more liberally.
+ Reported by Jim Meyering.
+
+2009-11-16 Jim Meyering <meyering@redhat.com>
+
+ avoid new AC_REQUIRE expanded-before-required warnings
+ * modules/chown (configure.ac): Require gl_FUNC_CHOWN, rather than
+ merely using it.
+ * modules/euidaccess (configure.ac): Likewise for gl_FUNC_EUIDACCESS.
+ * modules/faccessat (configure.ac): Likewise for gl_FUNC_FACCESSAT.
+
+2009-11-15 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-xalloc-die.c: New file.
+ * modules/xalloc-die-tests: New file.
+ * gnulib-tool (func_emit_tests_Makefile_am): Also initialize
+ XFAIL_TESTS so it can be appended by modules.
+
+2009-11-15 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc-pbkdf2-sha1.c: Remove comments from RFC 2898. Reported
+ by Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>.
+
+2009-11-14 Eric Blake <ebb9@byu.net>
+
+ fnmatch: avoid compiler warning
+ * lib/fnmatch_loop.c (NEW_PATTERN): Coerce addition to unsigned,
+ to silence compiler warning about mismatch signedness in ?:.
+ Reported by Robert Millan.
+
+ intprops: add double-inclusion guard
+ * lib/intprops.h: Allow idempotent includes.
+ Suggested by Bruce Korb.
+
+ openat: detect Solaris fchownat bug
+ * lib/fchownat.c (rpl_fchownat): Work around Solaris bug. Avoid
+ penalizing glibc chownat when only lchownat is broken.
+ * m4/openat.m4 (gl_FUNC_FCHOWNAT): Replace fchownat if there are
+ trailing slash bugs.
+ * doc/posix-functions/fchownat.texi (fchownat): Document the bug.
+ * modules/openat-tests (Files): Include more files.
+ (Depends-on): Add mgetgroups, sleep, stat-time.
+ (configure.ac): Add additional checks.
+ (Makefile.am): Build new test.
+ * tests/test-fchownat.c: New file.
+
+ lchown: detect Solaris and FreeBSD bug
+ * lib/lchown.c (rpl_lchown): Work around bug.
+ * m4/lchown.m4 (gl_FUNC_LCHOWN): Check for trailing slash bugs.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witness.
+ * modules/unistd (Makefile.am): Populate it.
+ * lib/unistd.in.h (lchown): Update declaration.
+ * doc/posix-functions/lchown.texi (lchown): Document the bug.
+ * modules/lchown-tests: New file.
+ * tests/test-lchown.h (test_lchown): Likewise.
+ * tests/test-lchown.c (main): Likewise.
+
+ chown: detect Solaris and FreeBSD bug
+ * lib/chown.c (rpl_chown): Work around bug.
+ * m4/chown.m4 (gl_FUNC_CHOWN): Check for trailing slash bugs.
+ (gl_PREREQ_CHOWN): Delete.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witness.
+ * modules/unistd (Makefile.am): Populate it.
+ * lib/unistd.in.h (chown): Update declaration.
+ * lib/lchown.c (chown): Update client.
+ * modules/lchown (Depends-on): Add lstat.
+ * doc/posix-functions/chown.texi (chown): Document the bug.
+ * doc/posix-functions/getgroups.texi (getgroups): Document
+ getgroups pitfall.
+ * modules/chown-tests: New file.
+ * tests/test-chown.h (test_chown): Likewise.
+ * tests/test-chown.c (main): Likewise.
+
+2009-11-14 Robert Millan <rmh.grub@aybabtu.com> (tiny change)
+
+ gnulib-tool: correctly detect absence of m4 directories
+ * gnulib-tool: Avoid extra newline on data passed to wc -l.
+
+2009-11-14 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: Prohibit inclusion of "xalloc.h" without use.
+ * top/maint.mk (sc_prohibit_close_stream_without_use): New rule.
+
+2009-11-14 John W. Eaton <jwe@gnu.org>
+
+ strftime.h: wrap funtion declaration in extern "C" block
+ * lib/strftime.h (nstrftime) [__cplusplus]: Wrap declaration.
+
+2009-11-13 Eric Blake <ebb9@byu.net>
+
+ getgroups: avoid compiler warning
+ * lib/getgroups.c (rpl_getgroups): Delete shadowed variable.
+
+ getgroups: work around FreeBSD bug
+ * lib/getgroups.c (rpl_getgroups): Work around the bug.
+ * m4/getgroups.m4 (gl_FUNC_GETGROUPS): Detect the bug.
+ * doc/posix-functions/getgroups.texi (getgroups): Document it.
+ * tests/test-getgroups.c (main): Fix buffer overrun.
+
+ getgroups: avoid compilation failure
+ * lib/getgroups.c (includes): Include <stdint.h> for SIZE_MAX.
+ * modules/getgroups (Depends-on): Add stdint.
+
+2009-11-13 Jim Meyering <meyering@redhat.com>
+
+ test-getgroups: avoid compilation failure
+ * tests/test-getgroups.c: Include <stdint.h> for use of SIZE_MAX.
+
+2009-11-13 Eric Blake <ebb9@byu.net>
+
+ mgetgroups: new module, taken from coreutils
+ * modules/mgetgroups: New file.
+ * lib/mgetgroups.h: Likewise.
+ * lib/mgetgroups.c (mgetgroups): Likewise.
+ * m4/mgetgroups.m4 (gl_MGETGROUPS): Likewise.
+ * MODULES.html.sh (Users and groups): Mention it.
+
+ getgroups: don't expose GETGROUPS_T to user
+ * lib/getgroups.c (rpl_getgroups): Change signature. Copy array
+ an element at a time if GETGROUPS_T is wrong size.
+ * lib/getugroups.h (getugroups): Change signature.
+ * lib/unistd.in.h (getgroups): Likewise.
+ * m4/getgroups.m4 (gl_FUNC_GETGROUPS): Use replacement if
+ signature needs fixing.
+ * m4/getugroups.m4 (gl_GETUGROUPS): No longer need
+ AC_TYPE_GETGROUPS.
+ * modules/group-member (Depends-on): Add getgroups.
+ * lib/group-member.c (group_info, get_group_info): Use gid_t.
+ (group_member): Rely on getgroups replacement.
+ * lib/getugroups.c (getugroups): Use gid_t.
+ * tests/test-getgroups.c (main): Likewise.
+ * NEWS: Mention the signature change.
+ * doc/posix-functions/getgroups.texi (getgroups): Mention the
+ problem with signature.
+ * doc/glibc-functions/setgroups.texi (setgroups): Mention that
+ GETGROUPS_T is still useful for setgroups.
+
+ getgroups, getugroups: provide stubs for mingw
+ * lib/getgroups.c (getgroups): Provide ENOSYS stub for mingw.
+ * lib/getugroups.c (getugroups): Likewise.
+ * m4/getgroups.m4 (gl_FUNC_GETGROUPS): Check for missing
+ function. Modernize replacement scheme.
+ (gl_PREREQ_GETGROUPS): Delete.
+ * m4/getugroups.m4 (gl_GETUGROUPS): Check for <grp.h>.
+ * modules/getgroups (configure.ac): Declare witness.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add default.
+ * modules/unistd (Depends-on): Substitute witness.
+ * lib/unistd.in.h (getgroups): Declare replacement.
+
+ getgroups: avoid calling exit
+ * modules/getgroups (Depends-on): Add malloc-posix and unistd,
+ drop xalloc.
+ * modules/getgroups-tests (Depends-on, Makefile.am): Drop unneeded
+ dependencies.
+ * lib/getgroups.c (rpl_getgroups): Fail with ENOMEM rather than
+ exiting, in the rare case of malloc failure.
+
+ getgroups: fix logic error
+ * lib/getgroups.c (rpl_getgroups): Don't fail if current process
+ has more than 20 groups.
+ * modules/getgroups-tests: New test.
+ * tests/test-getgroups.c: New file.
+
+2009-11-13 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-base64.c: Improve.
+
+2009-11-13 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-xvasprintf.c: Fix memory leak, suggested by Eric
+ Blake <ebb9@byu.net>.
+
+2009-11-13 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-xvasprintf.c: Add %s%s related checks.
+
+2009-11-12 Eric Blake <ebb9@byu.net>
+
+ version-etc: match standards.texi style
+ * lib/version-etc.c (emit_bug_reporting_address): Drop periods,
+ and use <> only for URLs.
+
+2009-11-10 Kamil Dudka <kdudka@redhat.com>
+
+ fts: do not fail on a submount during traversal
+ * lib/fts.c (fts_build): Read the stat info again after opening
+ a directory if the FTS_TIGHT_CYCLE_CHECK flag is set.
+ Original report at http://bugzilla.redhat.com/501848.
+
+2009-11-12 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: sync from coreutils
+ * build-aux/bootstrap (bootstrap_epilogue): New function.
+ Use git_modules_config in one more place. This make bootstrap's
+ --gnulib-srcdir option more useful for testing.
+
+ bootstrap: generalize autoheader check
+ * build-aux/bootstrap: Look for AC_CONFIG_HEADER as well as
+ AC_CONFIG_HEADERS.
+
+2009-11-11 Eric Blake <ebb9@byu.net>
+
+ mkfifoat: use new modules for Solaris and BSD bugs
+ * m4/mkfifoat.m4 (gl_FUNC_MKFIFOAT): Simplify.
+ * lib/mkfifoat.c (mknodat): Split...
+ * lib/mknodat.c (mknodat): ...into new file.
+ * modules/mkfifoat (Files): Ship new file.
+ (Depends-on): Add mkfifo, mknod.
+ * modules/mkfifoat-tests (Files): Reuse mkfifo tests.
+ (Depends-on): Add symlink.
+ * tests/test-mkfifoat.c (main): Enhance test. Drop portions now
+ redundant with test_mkfifo.h.
+ (do_mkfifoat, do_mknodat): New helpers.
+
+ mknod: new module
+ * modules/mknod: New file.
+ * m4/mknod.m4 (gl_FUNC_MKNOD): Likewise.
+ * lib/mknod.c (mknod): Likewise.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Set witness
+ defaults.
+ * modules/sys_stat (Makefile.am): Substitute them.
+ * lib/sys_stat.in.h (mknod): Declare replacement.
+ * MODULES.html.sh (Support for systems lacking POSIX:2008):
+ Document it.
+ * doc/posix-functions/mknod.texi (mknod): Likewise.
+ * modules/mknod-tests: New test.
+ * tests/test-mknod.c: Likewise.
+
+ mkfifo: new module
+ * modules/mkfifo: New file.
+ * m4/mkfifo.m4 (gl_FUNC_MKFIFO): Likewise.
+ * lib/mkfifo.c (mkfifo): Likewise.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Set witness
+ defaults.
+ * modules/sys_stat (Makefile.am): Substitute them.
+ * lib/sys_stat.in.h (mkfifo): Declare replacement.
+ * MODULES.html.sh (Support for systems lacking POSIX:2008):
+ Document it.
+ * doc/posix-functions/mkfifo.texi (mkfifo): Likewise.
+ * modules/mkfifo-tests: New test.
+ * tests/test-mkfifo.h (test_mkfifo): New file, borrowed in part
+ from test-mkfifoat.c.
+ * tests/test-mkfifo.c: New file.
+
+ readlink: detect FreeBSD bug
+ * m4/readlink.m4 (gl_FUNC_READLINK): Also detect FreeBSD bug with
+ slash on symlink.
+ * doc/posix-functions/readlink.texi (readlink): Document the bug.
+ * tests/test-readlink.h (test_readlink): Enhance test.
+
+ symlink: detect FreeBSD bug
+ * m4/symlink.m4 (gl_FUNC_SYMLINK): Also detect FreeBSD bug with
+ slash on symlink.
+ * doc/posix-functions/symlink.texi (symlink): Document the bug.
+ * tests/test-symlink.h (test_symlink): Enhance test.
+
+2009-11-10 Eric Blake <ebb9@byu.net>
+
+ link: detect FreeBSD bug
+ * m4/link.m4 (gl_FUNC_LINK): Also detect FreeBSD bug with slash on
+ symlink.
+ * doc/posix-functions/link.texi (link): Document the bug.
+ * tests/test-link.h (test_link): Enhance test.
+ * tests/test-linkat.c (main): Update caller.
+
+ unlink, remove: detect FreeBSD bug
+ * m4/unlink.m4 (gl_FUNC_UNLINK): Also detect FreeBSD bug with
+ slash on symlink.
+ * doc/posix-functions/unlink.texi (unlink): Document the bug.
+ * doc/posix-functions/remove.texi (remove): Likewise.
+ * tests/test-unlink.h (test_unlink): Enhance test.
+ * tests/test-remove.c (main): Likewise.
+
+2009-11-09 Eric Blake <ebb9@byu.net>
+
+ rename: detect FreeBSD bug
+ * m4/rename.m4 (gl_FUNC_RENAME): Also detect FreeBSD bug with
+ slash on symlink.
+ * modules/renameat-tests (Depends-on): Add filenamecat.
+ * tests/test-rename.h (test_rename): Allow one more errno.
+ * tests/test-renameat.c (main): Likewise.
+ * doc/posix-functions/rename.texi (rename): Document the bug.
+
+ open: detect FreeBSD bug
+ * m4/open.m4 (gl_FUNC_OPEN): Also detect FreeBSD bug with slash on
+ symlink.
+ * doc/posix-functions/open.texi (open): Document the bug.
+ * doc/posix-functions/utimes.texi (utimes): Likewise.
+ * tests/test-open.h (test_open): Add parameters, and test symlink
+ handling.
+ * tests/test-open.c (main): Adjust caller.
+ * tests/test-fcntl-safer.c (main): Likewise.
+ * modules/open-tests (Depends-on): Add stdbool, symlink.
+ * modules/fcntl-safer-tests (Depends-on): Likewise.
+ * tests/test-openat.c (main): Add test-open tests.
+
+ stat: detect FreeBSD bug
+ * m4/stat.m4 (gl_FUNC_STAT): Also detect FreeBSD bug with slash on
+ symlink.
+ * doc/posix-functions/stat.texi (stat): Document the bug.
+ * tests/test-stat.h (test_stat_func): Add argument.
+ * tests/test-stat.c (main): Adjust caller.
+ * tests/test-fstatat.c (main): Likewise.
+ * modules/stat-tests (Depends-on): Add stdbool, symlink.
+ Reported by Jim Meyering.
+
+2009-11-09 James Youngman <jay@gnu.org>
+
+ strftime.c: include ignore-value.h only when FPRINTFTIME is defined
+ * lib/strftime.c: Correct placement of #include "ignore-value.h".
+
+2009-11-08 Jim Meyering <meyering@redhat.com>
+
+ utimens: remove invalid futimesat call
+ * lib/utimens.c (fdutimens): Remove invalid futimesat call.
+ It used the file descriptor of the target file as the DIR_FD
+ parameter and NULL as the file name. That caused failure with
+ errno == EFAULT on FreeBSD-8.0-rc2
+
+2009-11-07 Eric Blake <ebb9@byu.net>
+
+ fflush, freadseek: use fseeko, not fseek
+ * lib/fflush.c (clear_ungetc_buffer_preserving_position)
+ (clear_ungetc_buffer): Avoid potential problems on large files.
+ * lib/freadseek.c (freadseek): Likewise.
+ * modules/freadseek (Depends-on): Add fseeko.
+ * modules/fseek (configure.ac): Set a witness.
+ * tests/test-fflush.c (main): Use fseeko.
+ * tests/test-fpurge.c (fseek): Disable link warning.
+ * tests/test-freadable.c (fseek): Likewise.
+ * tests/test-freading.c (fseek): Likewise.
+ * tests/test-fseeko.c (fseek): Likewise.
+ * tests/test-ftell.c (fseek): Likewise.
+ * tests/test-ftello.c (fseek): Likewise.
+ * tests/test-fwritable.c (fseek): Likewise.
+ * tests/test-fwriting.c (fseek): Likewise.
+
+2009-11-06 Simon Josefsson <simon@josefsson.org>
+
+ * modules/memchr (Depends-on): Drop getpagesize dependency.
+
+2009-11-06 Simon Josefsson <simon@josefsson.org>
+
+ * build-aux/pmccabe2html: Disable execute bit. Suggested by
+ Reported by Ludovic Courtès.
+ * build-aux/pmccabe2html: Improve example usage.
+ * build-aux/pmccabe2html: Drop #! header. Doc fix.
+
+2009-11-06 Jim Meyering <meyering@redhat.com>
+
+ do-release-commit-and-tag: New module.
+ Automate the release-commit and tag process.
+ * build-aux/do-release-commit-and-tag: New script, from coreutils.
+ * modules/do-release-commit-and-tag: New file.
+ * MODULES.html.sh (Support for maintaining and releasing): Add it.
+
+2009-11-06 Simon Josefsson <simon@josefsson.org>
+
+ * modules/select-tests (test_select_LDADD): Add $(INET_PTON_LIB)
+ because test-select.c uses inet_pton.
+
+2009-11-06 Simon Josefsson <simon@josefsson.org>
+
+ * m4/getaddrinfo.m4: Add content of INET_NTOP_LIB to
+ GETADDRINFO_LIB. Bump serial number.
+ * modules/getaddrinfo (Link): Only mention GETADDRINFO_LIB again.
+ Suggested by Eric Blake <ebb9@byu.net>.
+
+2009-11-05 Eric Blake <ebb9@byu.net>
+
+ strtod: detect darwin bug
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Filter out darwin bug on "nan(".
+ Reported by Leo Davis.
+
+ freopen-safer: new module
+ * modules/freopen-safer: New module.
+ * m4/stdio-safer.m4 (gl_FREOPEN_SAFER): New macro.
+ * lib/freopen-safer.c (freopen_safer): New file.
+ * lib/stdio-safer.h (freopen_safer): New declaration.
+ * lib/stdio--.h (freopen): New override.
+ * MODULES.html.sh (File stream based Input/Output): Mention it.
+ * doc/posix-functions/freopen.texi (freopen): Mention pitfalls and
+ freopen-safer module.
+ * doc/posix-functions/stderr.texi (stderr): Likewise.
+ * doc/posix-functions/stdin.texi (stdin): Likewise.
+ * doc/posix-functions/stdout.texi (stdout): Likewise.
+ * modules/freopen-safer-tests: New test.
+ * tests/test-reopen-safer.c: New file.
+
+2009-11-05 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: Prohibit inclusion of "close-stream.h" without use.
+ * top/maint.mk (sc_prohibit_close_stream_without_use): New rule.
+
+2009-11-05 Simon Josefsson <simon@josefsson.org>
+
+ * modules/pmccabe2html (configure.ac): Check for pmccabe tool.
+
+2009-11-05 Simon Josefsson <simon@josefsson.org>
+
+ * modules/getaddrinfo (Link): Add $(INET_NTOP_LIB).
+
+2009-11-05 Simon Josefsson <simon@josefsson.org>
+
+ Fix link error.
+ * m4/inet_ntop.m4 (gl_INET_NTOP): Fix test of AC_SEARCH_LIBS result.
+ * m4/inet_pton.m4 (gl_INET_PTON): Likewise.
+
+2009-11-05 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-func.c: Also test value of __func__.
+
+2009-11-05 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-sys_socket.c: Use smaller constant value, sa_family_t
+ may be an 8-bit type. Reported by Bruno Haible <bruno@clisp.org>.
+
+2009-11-05 Bruno Haible <bruno@clisp.org>
+
+ Fix link error.
+ * m4/inet_ntop.m4 (gl_INET_NTOP): Fix test of AC_SEARCH_LIBS result.
+ * m4/inet_pton.m4 (gl_INET_PTON): Likewise.
+ Reported by Brad Hards <bradh@frogmouth.net> via Simon Josefsson.
+
+2009-11-05 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'inet_pton'.
+ * modules/inet_pton-tests: New file.
+ * tests/test-inet_pton.c: New file.
+
+2009-11-05 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'inet_ntop'.
+ * modules/inet_ntop-tests: New file.
+ * tests/test-inet_ntop.c: New file.
+
+2009-11-04 Eric Blake <ebb9@byu.net>
+
+ stdlib-safer: wrap all mkstemp variants
+ * modules/mkostemp (configure.ac): Set witness.
+ * modules/mkostemps (configure.ac): Likewise.
+ * modules/mkstemps (configure.ac): Likewise.
+ * lib/stdlib-safer.h (mkostemp_safer, mkostemps_safer)
+ (mkstemps_safer): Wrap more functions.
+ * lib/stdlib--.h (mkostemp, mkostemps, mkstemps): Default the
+ wrapping.
+ * lib/mkstemp-safer.c (mkostemp_safer, mkostemps_safer)
+ (mkstemps_safer): Implement the wrappers.
+
+ mkstemps, mkostemps: new modules
+ * modules/mkostemps: New module.
+ * modules/mkstemps: Likewise.
+ * lib/mkostemps.c (mkostemps): New file.
+ * lib/mkstemps.c (mkstemps): Likewise.
+ * m4/mkostemps.m4 (gl_FUNC_MKOSTEMPS): Likewise.
+ * m4/mkstemps.m4 (gl_FUNC_MKSTEMPS): Likewise.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Add witnesses.
+ * modules/stdlib (Makefile.am): Substitute them.
+ * lib/stdlib.in.h (mkostemps, mkstemps): Declare them.
+ * doc/glibc-functions/mkstemps.texi (mkstemps): New file.
+ * doc/glibc-functions/mkostemps.texi (mkostemps): Likewise.
+ * doc/gnulib.texi (Glibc stdlib.h): Include them.
+ * MODULES.html.sh (File system functions): Mention them.
+
+ tempname: resync from glibc
+ * lib/tempname.c (__gen_tempname): Add suffixlen argument. Use
+ same values for __GT_FILE as glibc. Abort even when assertions
+ are disabled.
+ * lib/tempname.h (GT_FILE): Use glibc __GT_FILE, if available, and
+ match its value otherwise. Allow idempotent inclusion.
+ * lib/mkdtemp.c (mkdtemp): Adjust caller.
+ * lib/mkostemp.c (mkostemp): Likewise.
+ * lib/mkstemp.c (mkstemp): Likewise.
+ * lib/tmpfile.c (tmpfile): Likewise.
+ * NEWS: Document this.
+
+ utimens: fix use of futimens on older Linux
+ * lib/utimens.c (fdutimens): Use updated, rather than original,
+ timespec to avoid bug in older Linux kernel.
+ Reported by Simon Josefsson.
+
+2009-11-04 Bruno Haible <bruno@clisp.org>
+
+ Make num_processors more flexible and consistent.
+ * lib/nproc.h (enum nproc_query): New type.
+ (num_processors): Add a 'query' argument.
+ * lib/nproc.c: Include <stdlib.h>, <sched.h>, c-ctype.h.
+ (num_processors): Add a 'query' argument. Test the value of the
+ OMP_NUM_THREADS environment variable if requested. On Linux, NetBSD,
+ mingw, count the number of CPUs available for the current process.
+ * m4/nproc.m4 (gl_PREREQ_NPROC): Require AC_USE_SYSTEM_EXTENSIONS.
+ Check for sched_getaffinity and sched_getaffinity_np.
+ * modules/nproc (Depends-on): Add c-ctype, extensions.
+ * NEWS: Mention the change.
+
+2009-11-03 Bruno Haible <bruno@clisp.org>
+
+ * NEWS: Document the new library dependencies of inet_ntop, inet_pton.
+
+2009-11-03 Jim Meyering <meyering@redhat.com>
+
+ test-getaddrinfo: avoid compilation failure on FreeBSD 7.2
+ * tests/test-getaddrinfo.c (simple): Test for EAI_NODATA only
+ if it is defined.
+
+2009-11-02 Eric Blake <ebb9@byu.net>
+
+ mktime, timegm: share common declaration
+ * lib/mktime-internal.h: New file.
+ * lib/mktime.c: Use it rather than open-coding a declaration.
+ * lib/timegm.c: Likewise.
+ * modules/mktime (Files): Ship it.
+ * modules/timegm (Files): Likewise.
+ Suggested by Bruno Haible.
+
+ test-update-copyright: update test to match script changes
+ * tests/test-update-copyright.sh: Avoid hard-coding perl
+ location. Don't update *.bak created by earlier runs.
+
+2009-11-02 Paul Eggert <eggert@cs.ucla.edu>
+ Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Fix link error on Solaris 8.
+ * m4/inet_pton.m4 (gl_INET_PTON): Search for the function inet_pton
+ also in libnsl. Define also INET_PTON_LIB.
+ * modules/inet_pton (Link): New section.
+
+2009-11-02 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/inet_ntop.m4 (gl_INET_NTOP): Define also INET_NTOP_LIB.
+ * modules/inet_ntop (Link): New section.
+ Reported by Boyan Kasarov <bkasarov@gmail.com>.
+
+2009-11-02 Eric Blake <ebb9@byu.net>
+
+ maint: avoid compiler warnings in m4 macros
+ * m4/ungetc.m4 (gl_FUNC_UNGETC_WORKS): Avoid unused variable.
+ * m4/rmdir.m4 (gl_FUNC_RMDIR): Include correct header.
+
+2009-11-02 Simon Josefsson <simon@josefsson.org>
+
+ * m4/pmccabe2html.m4: Remove file.
+ * modules/pmccabe2html: Drop pmccabe2html.m4. Don't call m4
+ function. Change maintainer.
+ * build-aux/pmccabe2html: Use /bin/sh with magic instead of
+ hard-coding path to awk. Tiny patch from ludo@gnu.org (Ludovic
+ Courtès).
+
+2009-10-31 Eric Blake <ebb9@byu.net>
+
+ fseeko: fix m4 regression
+ * m4/fseeko.m4 (gl_FUNC_FSEEKO): Use modern macro. Fixes
+ regression from 2009-10-27.
+ Reported by Ralf Wildenhues.
+
+2009-10-31 Jim Meyering <meyering@redhat.com>
+
+ inttostr: aesthetics and improved (compile-time) safety
+ Define inttype_is_signed rather than inttype_is_unsigned,
+ since the sole use is via "#if inttype_is_signed".
+ * lib/imaxtostr.c (inttype_is_signed): Define this, rather than
+ inttype_is_unsigned.
+ * lib/offtostr.c (inttype_is_signed): Likewise.
+ * lib/uinttostr.c (inttype_is_signed): Likewise.
+ * lib/umaxtostr.c (inttype_is_signed): Likewise.
+ * lib/inttostr.c (inttostr): Use verify to cross-check the
+ inttype_is_signed value and the signedness of the actual type.
+ * modules/inttostr (Depends-on): Add verify.
+
+2009-10-30 Eric Blake <ebb9@byu.net>
+
+ build: avoid compiler warnings
+ * lib/fchmodat.c (lchmod): Mark unused variables.
+ * lib/getopt.c (_getopt_initialize): Likewise.
+ * lib/mktime.c (__mktime_internal): Provide prototype.
+ * lib/inttostr.c (inttostr): Avoid compiler warning even with
+ older gcc that do not understand #pragma GCC diagnostic.
+ * lib/uinttostr.c (inttype_is_unsigned): Define.
+ * lib/umaxtostr.c (inttype_is_unsigned): Likewise.
+
+2009-10-30 Michael Haubenwallner <michael.haubenwallner@salomon.at>
+
+ stat: fix compilation on AIX
+ * lib/sys_stat.in.h (stat): Work with fact that large files on AIX
+ only see struct stat64.
+
+2009-10-30 Eric Blake <ebb9@byu.net>
+
+ exclude: make more robust
+ * lib/exclude.c (excluded_file_name): Abort on unexpected value,
+ rather than masking a coding bug.
+ Suggested by Bruno Haible.
+
+2009-10-30 Jim Meyering <meyering@redhat.com>
+
+ perl scripts: remove #!/usr/bin/perl in favor of more portable...
+ Rather than putting #!/usr/bin/perl on the first line,
+ start with a variant of what's recommended by "man perlrun" that
+ invokes the first "perl" program from your shell's search path.
+ * build-aux/gitlog-to-changelog: Replace #!... as above.
+ Add a "Local Variables" perl mode setting.
+ Prompted by a patch from Ludovic Courtès.
+ Improved by Eric Blake.
+ * build-aux/useless-if-before-free: Likewise.
+ * build-aux/announce-gen: Likewise.
+ * build-aux/update-copyright: Likewise.
+
+2009-10-29 Eric Blake <ebb9@byu.net>
+
+ filenamecat-lgpl: adjust clients
+ * modules/linkat (Depends-on): Use filenamecat-lgpl, not
+ filenamecat.
+ * modules/renameat (Depends-on): Likewise.
+
+ filenamecat: split into filenamecat-lgpl
+ * modules/filenamecat-lgpl: New module.
+ * modules/filenamecat (Files): Move library-safe files into
+ filenamecat-lgpl.
+ (Depends-on): Add filenamecat-lgpl.
+ (configure.ac): Declare witness.
+ * lib/filenamecat.h (file_name_concat): Only declare when using
+ GPL module.
+ * lib/filenamecat.c (longest_relative_suffix, mfile_name_concat):
+ Move...
+ * lib/filenamecat-lgpl.c: ...into new file.
+ * m4/filenamecat.m4 (gl_FILE_NAME_CONCAT_LGPL): New macro.
+ (gl_FILE_NAME_CONCAT): Use it.
+ * MODULES.html.sh (File system functions): Mention new module.
+
+ argp: avoid memory leak
+ * modules/argp (Depends-on): Use dirname-lgpl, not dirname.
+ * lib/argp-namefrob.h (__argp_base_name): Use last_component, not
+ base_name, since the latter malloc()s and can call exit().
+ Leak introduced 2006-07-03.
+
+ dirname-lgpl: adjust clients that don't need full dirname
+ * modules/backupfile (Depends-on): Use dirname-lgpl, not dirname.
+ * modules/filenamecat (Depends-on): Likewise.
+ * modules/linkat (Depends-on): Likewise.
+ * modules/mkancesdirs (Depends-on): Likewise.
+ * modules/mkdir (Depends-on): Likewise.
+ * modules/openat (Depends-on): Likewise.
+ * modules/savewd (Depends-on): Likewise.
+ * modules/rename (Depends-on): Likewise.
+ (License): Relax license.
+ * modules/mkdir-tests (Depends-on): Drop progname.
+ (Makefile.am): Delete unneeded LDADD.
+ * modules/rename-tests (Depends-on, Makefile.am): Likewise.
+
+ dirname: split into dirname-lgpl
+ * modules/dirname-lgpl: New module.
+ * modules/dirname (Files): Move library-safe files into
+ dirname-lgpl.
+ (Depends-on): Add dirname-lgpl.
+ (configure.ac): Declare witness.
+ * modules/double-slash-root (License): Relax license.
+ * lib/dirname.h (base_name, dir_name): Only declare when using GPL
+ module.
+ * lib/dirname.c (dir_len, mdir_name): Move...
+ * lib/dirname-lgpl.c: ...into new file.
+ * lib/basename.c (last_component, base_len): Move...
+ * lib/basename-lgpl.c: ...into new file.
+ * m4/dirname.m4 (gl_DIRNAME_LGPL): New macro.
+ (gl_DIRNAME): Use it.
+ * MODULES.html.sh (Enhancements for POSIX:2008 functions):
+ Mention new module.
+ * modules/dirname-tests (Depends-on): Add progname.
+ * tests/test-dirname.c (program_name): Delete.
+
+ mkdir: make safe for libraries
+ * modules/mkdir (Depends-on): Drop xalloc.
+ * lib/mkdir.c (rpl_mkdir): Fail with ENOMEM rather than calling
+ exit.
+
+ tests: avoid some compiler warnings
+ * tests/test-getaddrinfo.c (simple): Mark static, and allow string
+ literals.
+ * tests/test-memchr.c (main): Avoid type mismatch.
+ * tests/test-arpa_inet.c (main): Avoid unused parameters.
+ * tests/test-base64.c (main): Likewise.
+ * tests/test-getdelim.c (main): Likewise.
+ * tests/test-gethostname.c (main): Likewise.
+ * tests/test-getline.c (main): Likewise.
+ * tests/test-netinet_in.c (main): Likewise.
+ * tests/test-select.c (open_server_socket, main): Likewise.
+ * tests/test-select-stdin.c (main): Likewise.
+ * tests/test-sockets.c (main): Likewise.
+ * tests/test-strsignal.c (main): Likewise.
+ * tests/test-sys_select.c (main): Likewise.
+ * tests/test-sys_socket.c (main): Likewise.
+ * tests/test-u64.c (main): Likewise.
+ * tests/test-xfprintf-posix.c (main): Likewise.
+ * tests/test-xvasprintf.c (test_xvasprintf, main): Likewise.
+
+ sockets: avoid compiler warning
+ * lib/sockets.c (gl_sockets_startup): Mark unused parameter.
+
+ maint: detect usage(1) and other suspicious exits
+ * top/maint.mk (sc_prohibit_magic_number_exit): New rule.
+
+2009-10-29 Jim Meyering <meyering@redhat.com>
+
+ timespec: long-to-int truncation could make timespec_cmp malfunction
+ * lib/timespec.h (timespec_cmp): Do not interpret a difference of
+ a multiple of 2^32 nanoseconds as no difference.
+
+2009-10-28 Jim Meyering <meyering@redhat.com>
+
+ fprintftime: wrap macro code argument in "do {...} while(0)"
+ * lib/strftime.c (cpy) [FPRINTFTIME]: The second argument to the
+ cpy macro must be a statement that can be followed by a semicolon.
+ Now that the else clause contains a comment and is hence longer
+ than one line, I require curly braces. That in turn requires
+ that we wrap this code block in the standard do...while(0).
+
+ fprintftime: remove stray semicolon from previous change
+ * lib/strftime.c (cpy) [FPRINTFTIME]: Remove trailing semicolon.
+
+ fprintftime: avoid a warning about ignored fwrite return value
+ * lib/strftime.c [FPRINTFTIME]: Include "ignore-value.h".
+ (cpy) [FPRINTFTIME]: Ignore fwrite failure, even though technically,
+ that is unsafe.
+ * modules/fprintftime (Depends-on): Add ignore-value.
+
+ exclude: avoid an unwarranted warning
+ * lib/exclude.c (excluded_file_name): Initialize "rc" before switch.
+
+2009-10-27 Eric Blake <ebb9@byu.net>
+
+ fseek: avoid compilation failure when fflush is replaced
+ * m4/fseek.m4 (gl_REPLACE_FSEEK): New macro.
+ * m4/fseeko.m4 (gl_REPLACE_FSEEKO): Also replace fseek, if fseek
+ module is in use.
+ * lib/stdio.in.h (GNULIB_FSEEKO): Only poison fseek if fseek
+ module is not in use; since REPLACE_FSEEK worked otherwise.
+ (GNULIB_FTELLO): Likewise for ftell.
+ Reported by Ian Beckwith and others.
+
+2009-10-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/isnan.c (rpl_isnan[fdl]): Repeat the specification declaration.
+ Reported by Jim Meyering.
+
+2009-10-27 Jim Meyering <jim@meyering.net>
+ Bruno Haible <bruno@clisp.org>
+
+ Avoid warning despite dropping the return value of fwrite.
+ * lib/unicodeio.c: Include ignore-value.h.
+ (fwrite_success_callback): Explicitly ignore fwrite's return value.
+ * modules/unicodeio (Depends-on): Add ignore-value.
+
+2009-10-26 Eric Blake <ebb9@byu.net>
+
+ areadlinkat: fix fallback path
+ * lib/at-func.c (AT_FUNC_NAME): Avoid signed comparison between
+ pointer and zero.
+
+2009-10-22 Pádraig Brady <P@draigBrady.com>
+
+ Use a better IO block size for modern systems
+ * lib/copy-file.c (copy_file_preserving): Used a 32KiB malloced buffer.
+ * lib/md2.c: Likewise.
+ * lib/md4.c: Likewise.
+ * lib/md5.c: Likewise.
+ * lib/sha1.c: Likewise.
+ * lib/sha256.c: Likewise.
+ * lib/sha512.c: Likewise.
+
+2009-10-22 Eric Blake <ebb9@byu.net>
+
+ tests: avoid several compiler warnings
+ * tests/test-getcwd.c (main): Avoid buffer underflow.
+ * tests/test-getdate.c (main): String literals are not safe with
+ putenv, so use setenv. Declare unused argument.
+ * modules/getdate-tests (Depends-on): Add setenv.
+ * tests/test-argv-iter.c (main): Declare unused argument. Avoid
+ problems with string literals in char *.
+ * tests/test-hash.c (main): Avoid shadowing declaration.
+ (insert_new): Treat string literals as char const *.
+ * tests/test-getopt.h (test_getopt): Likewise.
+ (getopt_loop): Alter types to minimize casting elsewhere.
+ * tests/test-getopt_long.h (test_getopt_long, getopt_long_loop)
+ (test_getopt_long_posix): Likewise.
+ (do_getopt_long): Add wrapper to minimize casting.
+ * tests/test-atexit.c (clear_temp_file): Use void.
+ * tests/test-areadlink-with-size.c (main): Declare unused
+ arguments.
+ * tests/test-areadlink.c (main): Likewise.
+ * tests/test-areadlinkat-with-size.c (main): Likewise.
+ * tests/test-areadlinkat.c (main): Likewise.
+ * tests/test-canonicalize-lgpl.c (main): Likewise.
+ * tests/test-canonicalize.c (main): Likewise.
+ * tests/test-dirent-safer.c (main): Likewise.
+ * tests/test-dirname.c (main): Likewise.
+ * tests/test-dup2.c (main): Likewise.
+ * tests/test-fchdir.c (main): Likewise.
+ * tests/test-fcntl-h.c (main): Likewise.
+ * tests/test-fcntl-safer.c (main): Likewise.
+ * tests/test-fdopendir.c (main): Likewise.
+ * tests/test-fdutimensat.c (main): Likewise.
+ * tests/test-fflush.c (main): Likewise.
+ * tests/test-filenamecat.c (main): Likewise.
+ * tests/test-filevercmp.c (main): Likewise.
+ * tests/test-fopen-safer.c (main): Likewise.
+ * tests/test-fopen.c (main): Likewise.
+ * tests/test-fpending.c (main): Likewise.
+ * tests/test-fpurge.c (main): Likewise.
+ * tests/test-freading.c (main): Likewise.
+ * tests/test-fstatat.c (main): Likewise.
+ * tests/test-fsync.c (main): Likewise.
+ * tests/test-futimens.c (main): Likewise.
+ * tests/test-getndelim2.c (main): Likewise.
+ * tests/test-gettimeofday.c (main): Likewise.
+ * tests/test-getopt.c (main): Likewise.
+ * tests/test-i-ring.c (main): Likewise.
+ * tests/test-inttypes.c (main): Likewise.
+ * tests/test-link.c (main): Likewise.
+ * tests/test-lstat.c (main): Likewise.
+ * tests/test-math.c (main): Likewise.
+ * tests/test-md5.c (main): Likewise.
+ * tests/test-memchr2.c (main): Likewise.
+ * tests/test-memrchr.c (main): Likewise.
+ * tests/test-mkdir.c (main): Likewise.
+ * tests/test-mkdirat.c (main): Likewise.
+ * tests/test-mkfifoat.c (main): Likewise.
+ * tests/test-open.c (main): Likewise.
+ * tests/test-openat-safer.c (main): Likewise.
+ * tests/test-openat.c (main): Likewise.
+ * tests/test-quotearg.c (main): Likewise.
+ * tests/test-rawmemchr.c (main): Likewise.
+ * tests/test-readlink.c (main): Likewise.
+ * tests/test-remove.c (main): Likewise.
+ * tests/test-rename.c (main): Likewise.
+ * tests/test-renameat.c (main): Likewise.
+ * tests/test-rmdir.c (main): Likewise.
+ * tests/test-sha1.c (main): Likewise.
+ * tests/test-signal.c (main): Likewise.
+ * tests/test-sigaction.c (main): Likewise.
+ * tests/test-stat.c (main): Likewise.
+ * tests/test-stat-time.c (main): Likewise.
+ * tests/test-stddef.c (main): Likewise.
+ * tests/test-stdint.c (main): Likewise.
+ * tests/test-stdio.c (main): Likewise.
+ * tests/test-stdlib.c (main): Likewise.
+ * tests/test-strchrnul.c (main): Likewise.
+ * tests/test-strerror.c (main): Likewise.
+ * tests/test-string.c (main): Likewise.
+ * tests/test-strtod.c (main): Likewise.
+ * tests/test-strverscmp.c (main): Likewise.
+ * tests/test-symlink.c (main): Likewise.
+ * tests/test-symlinkat.c (main): Likewise.
+ * tests/test-sys_stat.c (main): Likewise.
+ * tests/test-sys_time.c (main): Likewise.
+ * tests/test-time.c (main): Likewise.
+ * tests/test-unistd.c (main): Likewise.
+ * tests/test-unlink.c (main): Likewise.
+ * tests/test-unlinkat.c (main): Likewise.
+ * tests/test-utimens.c (main): Likewise.
+ * tests/test-utimensat.c (main): Likewise.
+ * tests/test-version-etc.c (main): Likewise.
+ * tests/test-wchar.c (main): Likewise.
+ * tests/test-wctype.c (main): Likewise.
+ * tests/test-xprintf-posix.c (main): Likewise.
+ * tests/test-posixtm.c (main): Likewise.
+ (STREQ): Delete unused macro.
+ * tests/test-linkat.c (main): Declare unused arguments. Avoid
+ shadowed variables.
+ * tests/test-memchr.c (main): Likewise.
+
+2009-10-21 Eric Blake <ebb9@byu.net>
+
+ areadlinkat: avoid failure on older glibc
+ * lib/at-func.c (AT_FUNC_NAME): Check for explicit FUNC_FAIL,
+ rather than mis-comparing 0 against FUNC_RESULT of char*.
+
+2009-10-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/stpncpy (License): Relicense under LGPLv2+.
+ Reported by David Lutterkort <lutter@redhat.com>.
+
+2009-10-20 Eric Blake <ebb9@byu.net>
+
+ utimensat: work around Solaris 9 bug
+ * lib/utimens.c (fdutimens, lutimens): Force a stat if platform
+ has trailing slash bugs.
+ * tests/test-lutimens.h (test_lutimens): Enhance test.
+ * tests/test-utimens.h (test_utimens): Likewise.
+ * doc/posix-functions/utime.texi (utime): Enhance documentation.
+ * doc/posix-functions/utimes.texi (utimes): Likewise.
+ * doc/posix-functions/utimensat.texi (utimensat): Likewise.
+ * doc/glibc-functions/futimesat.texi (futimesat): Likewise.
+ * doc/glibc-functions/lutimes.texi (lutimes): Likewise.
+ * doc/posix-functions/futimens.texi (futimens): Likewise.
+
+ fdutimensat: new module
+ * modules/fdutimensat: New file.
+ * lib/fdutimensat.c (fdutimensat): Likewise.
+ * lib/utimens.h (fdutimensat, lutimensat): Declare new functions.
+ * MODULES.html.sh (File system functions): Mention module.
+ * modules/fdutimensat-tests: New test.
+ * tests/test-fdutimensat.c: Likewise.
+
+ doc: regenerate INSTALL
+ * doc/INSTALL: Reflect recent autoconf update.
+ * doc/INSTALL.ISO: Likewise.
+ * doc/INSTALL.UTF-8: Likewise.
+
+2009-10-20 Pádraig Brady <P@draigBrady.com>
+
+ acl: warn if ACL support is not detected
+ * m4/acl.m4 (gl_FUNC_ACL): Output a warning if ACL support is not found.
+
+2009-10-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * lib/nproc.h: Add extern "C" block for C++.
+
+2009-10-18 Reuben Thomas <rrt@sc3d.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/isascii.texi: Document the 2 alternative APIs.
+ * doc/posix-functions/isalnum.texi: Document the 4 alternative APIs.
+ * doc/posix-functions/isalpha.texi: Likewise.
+ * doc/posix-functions/isblank.texi: Likewise.
+ * doc/posix-functions/iscntrl.texi: Likewise.
+ * doc/posix-functions/isdigit.texi: Likewise.
+ * doc/posix-functions/isgraph.texi: Likewise.
+ * doc/posix-functions/islower.texi: Likewise.
+ * doc/posix-functions/isprint.texi: Likewise.
+ * doc/posix-functions/ispunct.texi: Likewise.
+ * doc/posix-functions/isspace.texi: Likewise.
+ * doc/posix-functions/isupper.texi: Likewise.
+ * doc/posix-functions/isxdigit.texi: Likewise.
+
+2009-10-18 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'isblank'.
+ * modules/isblank-tests: New file.
+ * tests/test-isblank.c: New file.
+
+ New module 'isblank'.
+ * lib/isblank.c: New file.
+ * m4/isblank.m4: New file.
+ * modules/isblank: New file.
+ * doc/posix-functions/isblank.texi: Mention the new module.
+
+2009-10-18 Bruno Haible <bruno@clisp.org>
+
+ New module 'ctype'.
+ * lib/ctype.in.h: New file.
+ * m4/ctype.m4: New file.
+ * modules/ctype: New file.
+ * doc/posix-headers/ctype.texi: Mention the new module.
+
+2009-10-18 Jim Meyering <meyering@redhat.com>
+
+ m4: stylistic-only: hoist AC_SUBST to be adjacent to initialization
+ Declare a variable like LIB_CLOCK_GETTIME to be AC_SUBSTituted
+ right after its initialization, rather than farther down.
+ Keeping these in close proximity makes it easier to ensure
+ that each such variable is initialized. E.g.,
+
+ LIB_CLOCK_GETTIME=
+ AC_SUBST([LIB_CLOCK_GETTIME])
+
+ This change also increments these serial numbers.
+ * m4/clock_time.m4 (gl_CLOCK_TIME): Hoist AC_SUBST use.
+ * m4/euidaccess.m4 (gl_PREREQ_EUIDACCESS): Likewise.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Likewise.
+
+2009-10-18 Bruno Haible <bruno@clisp.org>
+
+ Don't let environment variables perturb build.
+ * m4/gethrxtime.m4 (gl_GETHRXTIME): Initialize LIB_GETHRXTIME here...
+ (gl_PREREQ_GETHRXTIME): ... not here.
+
+2009-10-18 Bruno Haible <bruno@clisp.org>
+
+ Avoid symlink attack in localcharset module.
+ * lib/localcharset.c: Include <fcntl.h>, <unistd.h>.
+ (O_NOFOLLOW): Define fallback.
+ (get_charset_aliases): Don't open the file if it is a symbolic link.
+ * m4/fcntl_h.m4 (gl_FCNTL_O_FLAGS): New macro, extracted from
+ gl_FCNTL_H.
+ (gl_FCNTL_H): Require it.
+ * m4/localcharset.m4 (gl_LOCALCHARSET): Likewise.
+ * modules/localcharset (Files): Add m4/fcntl_h.m4.
+ Reported by Fergal Glynn <fglynn@veracode.com>.
+
+2009-10-18 Bruno Haible <bruno@clisp.org>
+
+ Implement nproc for mingw.
+ * lib/nproc.c: Include <windows.h>
+ (num_processors): On native Windows platforms, try GetSystemInfo.
+
+2009-10-18 Bruno Haible <bruno@clisp.org>
+
+ Implement nproc for IRIX.
+ * lib/nproc.c: Include <sys/sysmp.h>.
+ (num_processors): On IRIX systems, try sysmp.
+ * m4/nproc.m4 (gl_PREREQ_NPROC): Check for sys/sysmp.h and sysmp.
+
+2009-10-18 Bruno Haible <bruno@clisp.org>
+
+ Implement nproc for HP-UX.
+ * lib/nproc.c: Include <sys/pstat.h>
+ (num_processors): On HP-UX systems, try pstat_getdynamic.
+ * m4/nproc.m4 (gl_PREREQ_NPROC): Check for sys/pstat.h and
+ pstat_getdynamic.
+
+2009-10-18 Giuseppe Scrivano <gscrivano@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Implement nproc for NetBSD, OpenBSD.
+ * lib/nproc.c: Include <sys/types.h>, <sys/param.h>, <sys/sysctl.h>.
+ (ARRAY_SIZE): New macro.
+ (num_processors): On BSD systems, try sysctl of HW_NCPU.
+ * m4/nproc.m4: New file.
+ * modules/nproc (Files): Add m4/nproc.m4.
+ (configure.ac): Invoke gl_NPROC. Remove AC_LIBOBJ invocation.
+ (Makefile.am): Instead, augment lib_SOURCES.
+
+2009-10-18 Bruno Haible <bruno@clisp.org>
+
+ Fix recognition of sys/sysctl.h on OpenBSD 4.0.
+ * m4/physmem.m4 (gl_PHYSMEM): Before including sys/sysctl.h, include
+ sys/param.h.
+
+2009-10-16 Eric Blake <ebb9@byu.net>
+
+ utimensat: new module
+ * modules/utimensat: New file.
+ * lib/utimensat.c (utimensat): Likewise.
+ * m4/utimensat.m4 (gl_FUNC_UTIMENSAT): Likewise.
+ * lib/utimens.c (utimensat): Avoid recursion into rpl_utimensat,
+ so we can work around Linux bugs.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Add witnesses.
+ * modules/sys_stat (Makefile.am): Substitute them.
+ * lib/sys_stat.in.h (utimensat): Declare it.
+ * MODULES.html.sh (systems lacking POSIX:2008): Mention module.
+ * doc/posix-functions/utimensat.texi (utimensat): Likewise.
+ * modules/utimensat-tests: New test.
+ * tests/test-utimensat.c: Likewise.
+
+ utimens: let lutimens work on non-symlinks
+ * lib/utimens.c (lutimens): Fall back to utimens rather than
+ failing with ENOSYS, when file is not a symlink.
+ (utimens): Reduce redirection.
+ * tests/test-lutimens.h (test_lutimens): Update test to cover
+ non-symlinks.
+ * tests/test-utimens.h (test_utimens): Update test to cover
+ symlinks.
+ * tests/test-utimens.c (main): Update caller.
+
+ utimens: cache whether utimensat syscall works
+ * lib/utimens.c (utimensat_works_really): New cache variable.
+ (fdutimens, lutimens): Use it to avoid failing syscall.
+
+ test-stat-time, test-utimens: improve portability
+ * tests/test-stat-time.c (nap): Lengthen delay to 20ms, for
+ ext4 on alpha, and for cygwin.
+ * tests/test-utimens-common.h: New file.
+ (nap): Factor delays into single function.
+ * tests/test-lutimens.h (test_lutimens): Use new header.
+ * tests/test-futimens.h (test_futimens): Likewise.
+ * tests/test-utimens.h (test_utimens): Likewise. Also, force NFS
+ timestamps to occur from same machine, as was done previously for
+ test_utimens.
+ * modules/utimens-tests (Files): Ship new file.
+ * modules/futimens-tests (Files): Likewise.
+ Reported in part by Jim Meyering.
+
+ sys_stat: sort replacement declarations
+ * lib/sys_stat.in.h: Sort declarations.
+ * lib/futimens.c (futimens): Fix typo.
+
+2009-10-15 Jim Meyering <meyering@redhat.com>
+
+ don't let environment settings perturb build
+ Setting the envvars, LIB_CLOCK_GETTIME, LIB_EACCESS or LIB_NANOSLEEP
+ could cause a configure-time and/or build-time malfunction.
+ Typically, a configure-time function-in-library test is performed
+ via code like this:
+
+ LIB_VAR=
+ AC_SUBST([LIB_VAR])
+ prefix_saved_LIBS=$LIBS
+ AC_SEARCH_LIBS([FUNC], [LIB_NAME],
+ [test "$ac_cv_search_FUNC" = "none required" ||
+ LIB_VAR=$ac_cv_search_FUNC])
+ LIBS=$prefix_saved_LIBS
+
+ However, in each of the files affected by this change, the LIB_VAR=
+ initialization was omitted. Thus, when set in the environment, its
+ value would propagate into generated Makefiles when FUNC is not found
+ in LIB_NAME.
+ * m4/clock_time.m4 (gl_CLOCK_TIME): Initialize AC_SUBST'd var.
+ * m4/euidaccess.m4 (gl_PREREQ_EUIDACCESS): Likewise.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Likewise.
+
+2009-10-14 Eric Blake <ebb9@byu.net>
+
+ fchdir: avoid infinite recursion in mingw
+ * lib/fchdir.c (rpl_fstat): Call system fstat, rather than
+ recursing.
+
+ test-stat-time: port to mingw
+ * tests/test-stat-time.c (force_unlink): Return a value.
+ (test_ctime) [W32]: Fix compilation error.
+ (nap): Don't call usleep with too large an argument. Use
+ force_unlink.
+ * doc/pastposix-functions/usleep.texi (usleep): Document the
+ portability issue.
+
+2009-10-13 Jim Meyering <meyering@redhat.com>
+
+ use AC_CHECK_FUNCS_ONCE, not AC_CHECK_FUNCS in modules/*
+ * modules/pipe-filter-gi: Use AC_CHECK_FUNCS_ONCE, not AC_CHECK_FUNCS.
+ * modules/pipe-filter-ii: Likewise.
+ * modules/sys_socket-tests: Likewise.
+ * modules/tsearch-tests: Likewise.
+ * Makefile (sc_prefer_ac_check_funcs_once): New rule.
+ (check): Depend on it.
+
+2009-10-12 Eric Blake <ebb9@byu.net>
+
+ utimens-tests: port to NFS file systems
+ * tests/test-utimens.h (test_utimens): Refactor utimecmp
+ comparisons to avoid spurious failures from timestamp drift
+ between NFS machines.
+
+2009-10-12 Eric Blake <ebb9@byu.net>
+
+ stat-time-tests: minor cleanups
+ * modules/stat-time-tests (configure.ac): Use AC_CHECK_FUNCS_ONCE.
+ * tests/test-stat-time.c (nap): Separate assignment from call.
+ Suggested by Paolo Bonzini and Bruno Haible.
+
+ sys_stat: guarantee struct timespec
+ * lib/sys_stat.in.h (includes): Always include <time.h>
+ * modules/sys_stat (Depends-on): Add time.
+ * tests/test-sys_stat.c: Guarantee struct timespec, as well as
+ mode_t permission values.
+ * doc/posix-headers/sys_stat.texi (sys/stat.h): Document how to
+ get at subsecond timestamps.
+
+2009-10-10 Eric Blake <ebb9@byu.net>
+
+ futimens: new module
+ * modules/futimens: New file.
+ * lib/futimens.c (futimens): Likewise.
+ * m4/futimens.m4 (gl_FUNC_FUTIMENS): Likewise.
+ * lib/utimens.c (futimens): Avoid recursion into rpl_futimens, so
+ we can work around Linux bugs.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Add witnesses.
+ * modules/sys_stat (Makefile.am): Substitute them.
+ * lib/sys_stat.in.h (futimens): Declare it.
+ * MODULES.html.sh (systems lacking POSIX:2008): Mention module.
+ * doc/posix-functions/futimens.texi (futimens): Likewise.
+ * modules/futimens-tests: New test.
+ * tests/test-futimens.c: Likewise.
+
+ utimens: introduce fdutimens
+ * lib/utimens.h (fdutimens): New prototype.
+ * lib/utimens.c (gl_futimens): Move guts...
+ (fdutimens): ...to new interface.
+ * tests/test-utimens.c (do_fdutimens): Use it.
+
+ utimens: add UTIME_NOW and UTIME_OMIT support
+ * lib/utimens.c (validate_timespec, update_timespec): New helper
+ functions.
+ (gl_futimens, lutimens): Use them.
+ * modules/utimens (Depends-on): Add gettime, lstat, stat-time,
+ stdbool, sys_stat.
+ (Link): Mention resulting library dependency.
+ * modules/utimecmp (Link): Likewise.
+ * modules/utimens-tests (Depends-on): Drop stat-time, stdbool.
+ (Makefile.am): Pick up library dependency.
+ * lib/sys_stat.in.h (UTIME_NOW, UTIME_OMIT): Guarantee a
+ definition.
+ * tests/test-sys_stat.c: Test the definitions.
+ * doc/posix-headers/sys_stat.texi (sys/stat.h): Document this.
+ * NEWS: Document library dependency.
+
+ utimecmp: support symlink timestamps
+ * lib/utimecmp.c (utimecmp): Use new interface. Skip effort of
+ hashing when possible. Use pathconf when available.
+ (SYSCALL_RESOLUTION): Recognize tighter resolution.
+ * modules/utimecmp (Depends-on): Add lstat.
+
+ utimens: add lutimens interface
+ * lib/utimens.c (lutimens): New function.
+ * m4/utimens.m4 (gl_UTIMENS): Check for lutimes.
+ * lib/utimens.h (lutimens): Declare new interface.
+ * tests/test-utimens.c (main): Enhance test.
+ * tests/test-lutimens.h (test_lutimens): New file.
+ * modules/utimens-tests (Files): Distribute it.
+ (Depends-on): Add symlink.
+ (configure.ac): Check for usleep.
+
+ utimens: validate futimens usage
+ * lib/utimens.c (gl_futimens): Require valid fd up front, using
+ fewer syscalls on failure later on. Avoid compiler warning on
+ mingw.
+ * modules/utimens (Depends-on): Add dup2.
+
+ utimens: add test
+ * modules/utimens-tests: New test.
+ * tests/test-utimens.h: New file.
+ * tests/test-futimens.h: Likewise.
+ * tests/test-utimens.c: Likewise.
+
+ doc: mention timestamp portability issues
+ * doc/glibc-functions/lutimes.texi (lutimes): Refer to utimensat
+ instead.
+ * doc/posix-functions/utime.texi (utime): Likewise.
+ * doc/posix-functions/utimes.texi (utimes): Likewise.
+ * doc/glibc-functions/futimes.texi (futimes): Refer to futimens
+ instead.
+ * doc/posix-functions/futimens.texi (futimens): Mention utimens
+ module.
+ * doc/posix-functions/utimensat.texi (utimensat): Likewise.
+ Mention weakness with symlink timestamps.
+ * doc/glibc-functions/futimesat.texi (futimesat): New file; refer
+ to utimensat/futimens instead.
+ * doc/gnulib.texi (Glibc sys/time.h): Include new file.
+
+ test-dup2: enhance test
+ * tests/test-dup2.c (main): Also check AT_FDCWD.
+
+ test-stat-time: avoid more spurious failures
+ * tests/test-stat-time.c (nap): Wait for 15ms rather than 2ms, for
+ xfs; and avoid race if the two timestamps cross quantization edge.
+
+ relocatable: prefer 'file system' over 'filesystem'
+ * m4/relocatable-lib.m4 (gl_RELOCATABLE_NOP): Use AS_HELP_STRING.
+ (gl_RELOCATABLE_LIBRARY_BODY): Fix spelling.
+ * doc/relocatable-maint.texi (Supporting Relocation): Likewise.
+ * doc/relocatable.texi (Enabling Relocatability): Likewise.
+ * lib/relocatable.c (compute_curr_prefix): Likewise.
+
+2009-10-10 Jim Meyering <meyering@redhat.com>
+
+ stat-time-tests: check for the usleep function
+ * modules/stat-time-tests (configure.ac): Now that we test HAVE_USLEEP.
+
+2009-10-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/xnanosleep: Put the Link section after the Include section.
+
+2009-10-09 Eric Blake <ebb9@byu.net>
+
+ dup2: work around FreeBSD 6.1 bug
+ * m4/dup2.m4 (gl_FUNC_DUP2): Detect bug.
+ * doc/posix-functions/dup2.texi (dup2): Document it.
+ Reported by Nelson H. F. Beebe and Jim Meyering.
+
+ test-stat-time: port to buggy NFS clients
+ * tests/test-stat-time.c (main) [W32]: Reduce ifdefs.
+ (test_ctime): Also skip test if mtime and ctime are skewed.
+
+ maint: prefer 'file system' over 'filesystem'
+ * doc/posix-functions/fstatat.texi (fstatat): Likewise.
+ * doc/posix-functions/lstat.texi (lstat): Likewise.
+ * lib/file-has-acl.c (file_has_acl): Likewise.
+ * lib/fwriteerror.c [TEST]: Likewise.
+ * tests/test-areadlink.h (test_areadlink): Likewise.
+ * tests/test-areadlinkat-with-size.c (main): Likewise.
+ * tests/test-areadlinkat.c (main): Likewise.
+ * tests/test-canonicalize-lgpl.c (main): Likewise.
+ * tests/test-canonicalize.c (main): Likewise.
+ * tests/test-fstatat.c (main): Likewise.
+ * tests/test-linkat.c (main): Likewise.
+ * tests/test-lstat.h (test_lstat_func): Likewise.
+ * tests/test-mkdir.h (test_mkdir): Likewise.
+ * tests/test-readlink.h (test_readlink): Likewise.
+ * tests/test-remove.c (main): Likewise.
+ * tests/test-rename.h (test_rename): Likewise.
+ * tests/test-renameat.c (main): Likewise.
+ * tests/test-rmdir.h (test_rmdir_func): Likewise.
+ * tests/test-symlink.h (test_symlink): Likewise.
+ * tests/test-symlinkat.c (main): Likewise.
+ * tests/test-unlink.h (test_unlink_func): Likewise.
+ * tests/test-unlinkat.c (main): Likewise.
+
+ maint: make realtime library usage explicit
+ * modules/gethrxtime (Link): Mention LIB_GETHRXTIME.
+ * modules/gettime (Link): Mention LIB_CLOCK_GETTIME.
+ * modules/settime (Link): Likewise.
+ * modules/xnanosleep (Link): Mention LIB_NANOSLEEP.
+
+ test-stat-time: speed up execution
+ * tests/test-stat-time.c (test_ctime) [!W32]: Avoid compiler
+ warning on mingw.
+ (nap): New helper function.
+ (prepare_test): Use it to reduce sleep time.
+ (test_mtime, test_ctime, test_birthtime): Allow for subsecond
+ execution.
+ * modules/stat-time-tests (configure.ac): Check for usleep.
+
+2009-10-09 Jim Meyering <meyering@redhat.com>
+
+ selinux-h: always use getfilecon wrappers
+ * lib/getfilecon.c: New file.
+ * lib/se-selinux.in.h: Use a better inclusion guard symbol name.
+ [HAVE_SELINUX_SELINUX_H]: Include-next <selinux/selinux.h>.
+ [!HAVE_SELINUX_SELINUX_H]: Use better parameter names.
+ (fgetfilecon): Provide a stub.
+ * m4/selinux-selinux-h.m4 (gl_HEADERS_SELINUX_SELINUX_H): Don't
+ AC_SUBST SELINUX_SELINUX_H, since now we're generating that
+ file unconditionally.
+ When <selinux/selinux.h> is found, arrange to use wrappers.
+ * modules/selinux-h (Files): Add getfilecon.c.
+ (Makefile.am): Substitute include-next-related bits
+ into the now-always-generated selinux/selinux.h file.
+ * doc/glibc-functions/lgetfilecon.texi: New file.
+ * doc/glibc-functions/fgetfilecon.texi: New file.
+ * doc/glibc-functions/getfilecon.texi: New file.
+ * doc/glibc-functions/getfilecon-desc.texi: New file.
+ * doc/gnulib.texi (Glibc selinux/selinux.h): New section, by
+ which to pull in the new files.
+ * MODULES.html.sh (Misc): Add selinux-h.
+
+2009-10-08 Jim Meyering <meyering@redhat.com>
+
+ unistd: fix comment typo
+ * lib/unistd.in.h (euidaccess): Fix a comment typo.
+
+2009-10-08 Eric Blake <ebb9@byu.net>
+
+ areadlink: use SIZE_MAX consistently
+ * modules/areadlink (Depends-on): Add stdint.
+ * modules/areadlink-with-size (Depends-on): Likewise.
+ * lib/areadlink-with-size.c (includes): Drop stdio, since stdlib
+ gives NULL; drop sys/types, since unistd gives size_t; and add
+ stdint for SIZE_MAX.
+ (SIZE_MAX): Rely on headers.
+ * lib/areadlinkat-with-size.c (includes): Drop stdio, sys/types,
+ and add stdint.
+ * lib/areadlink.c (includes): Drop sys/types, and add stdint.
+ (SIZE_MAX): Likewise.
+ (INITIAL_BUF_SIZE): Turn into enum.
+ * lib/areadlinkat.c (INITIAL_BUF_SIZE): Likewise.
+
+2009-10-08 Jim Meyering <meyering@redhat.com>
+
+ areadlinkat: avoid compilation failure
+ * lib/areadlinkat.c: Include <stdint.h> for use of SIZE_MAX.
+ Fix typo in comment.
+
+2009-10-07 Eric Blake <ebb9@byu.net>
+
+ areadlinkat-with-size: new module
+ * modules/areadlinkat-with-size: New module.
+ * lib/areadlinkat-with-size.c (areadlinkat_with_size): New file.
+ * lib/areadlink.h (areadlinkat): Declare it.
+ * MODULES.html.sh (File system functions): Mention it.
+ * modules/areadlinkat-with-size-tests: New test.
+ * tests/test-areadlinkat-with-size.c: New file.
+
+ xreadlinkat: new module
+ * modules/xreadlinkat: New module.
+ * lib/xreadlinkat.c (xreadlinkat): New file.
+ * lib/xreadlink.h (xreadlinkat): Declare it.
+ * MODULES.html.sh (File system functions): Mention it.
+
+ areadlinkat: new module
+ * lib/at-func.c (FUNC_FAIL): New define.
+ (AT_FUNC_NAME, VALIDATE_FLAG): Use it rather than raw -1.
+ * modules/areadlinkat: New module.
+ * lib/linkat.c (areadlinkat): Move...
+ * lib/areadlinkat.c (areadlinkat): ...to new file.
+ * lib/areadlink.h (areadlinkat): Declare it.
+ * modules/linkat (Depends-on): Add areadlinkat.
+ * MODULES.html.sh (File system functions): Mention it.
+ * modules/areadlinkat-tests: New test.
+ * tests/test-areadlinkat.c: New file.
+
+ areadlink, areadlink-with-size: add tests
+ * modules/areadlink-tests: New test.
+ * modules/areadlink-with-size-tests: Likewise.
+ * tests/test-areadlink.h: New file.
+ * tests/test-areadlink.c: Likewise.
+ * tests/test-areadlink-with-size.c: Likewise.
+
+ maint: minor cleanups
+ * lib/fts.c (ATTRIBUTE_UNUSED): Delete; use gnulib-guaranteed
+ _UNUSED_PARAMETER_ instead.
+ * lib/getdate.y (ATTRIBUTE_UNUSED): Likewise.
+ * lib/utimens.c (ATTRIBUTE_UNUSED): Likewise.
+ * modules/linkat-tests (Files): Distribute test-link.h.
+
+ openat, utimens: whitespace cleanup
+ * lib/openat.c: Prefer space throughout, rather than mix of 8
+ spaces vs. tabs.
+ * lib/at-func.c: Likewise.
+ * lib/utimens.c: Likewise.
+
+ openat: avoid using wrong fd
+ * lib/openat.c (openat_permissive): Reject user's fd if saving the
+ working directory chooses same fd.
+ * lib/at-func.c (AT_FUNC_NAME): Likewise.
+
+ mkdir, mkdirat: fix cygwin 1.5.x bug
+ * lib/mkdir.c (rpl_mkdir) [FUNC_MKDIR_DOT_BUG]: Work around bug.
+ * m4/mkdir-slash.m4 (gl_FUNC_MKDIR_TRAILING_SLASH): Move...
+ * m4/mkdir.m4 (gl_FUNC_MKDIR): ...here, and add check for cygwin
+ bug.
+ (gl_PREREQ_MKDIR): Delete unused macro.
+ * modules/mkdir (Files): Track file rename.
+ (configure.ac): Update macro name.
+ * modules/openat (Depends-on): Add mkdir.
+ * doc/posix-functions/mkdir.texi (mkdir): Document the bug.
+
+ mkdir, mkdirat: add tests
+ * modules/mkdir-tests: New test.
+ * tests/test-mkdir.h: New file.
+ * tests/test-mkdir.c: Likewise.
+ * tests/test-mkdirat.c: Likewise.
+ * modules/openat-tests (Files): Add new files.
+ (Makefile.am): Run new test.
+
+2009-10-06 Eric Blake <ebb9@byu.net>
+
+ doc: tweak *at function documentation
+ * doc/posix-functions/faccessat.texi (faccessat): Mention
+ known issue with replacement.
+ * doc/posix-functions/fchdir.texi (fchdir): Likewise.
+ * doc/posix-functions/linkat.texi (linkat): Likewise.
+ * doc/posix-functions/mkfifoat.texi (mkfifoat): Likewise.
+ * doc/posix-functions/mknodat.texi (mknodat): Likewise.
+ * doc/posix-functions/readlinkat.texi (readlinkat): Likewise.
+ * doc/posix-functions/renameat.texi (renameat): Likewise.
+ * doc/posix-functions/symlinkat.texi (symlinkat): Likewise.
+
+ openat: fix GNU/Hurd bug in unlinkat
+ * m4/openat.m4 (gl_FUNC_OPENAT): Replace unlinkat if unlink is
+ broken.
+ * doc/posix-functions/unlink.texi (unlink): Document this.
+ * doc/posix-functions/unlinkat.texi (unlinkat): Likewise.
+
+ fdopendir: fix GNU/Hurd bug
+ * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Check for Hurd bug in
+ allowing non-directory fds.
+ * lib/fdopendir.c (rpl_fdopendir): Work around it.
+ * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): New witness.
+ * modules/dirent (Makefile.am): Substitute it.
+ * lib/dirent.in.h (fdopendir): Declare replacement.
+ * doc/posix-functions/fdopendir.texi (fdopendir): Document this.
+ * tests/test-fdopendir.c (main): Test something other than
+ /dev/null, since on Hurd that behaves like a directory.
+
+ test-symlink: port to GNU/Hurd
+ * tests/test-symlink.h (test_symlink): Relax expected errno.
+
+ doc: tweak more cygwin information
+ * doc/glibc-headers/getopt.texi (getopt.h): Cygwin 1.7 getopt is
+ now compatible with glibc.
+ * doc/posix-functions/getopt.texi (getopt): Likewise.
+
+ getopt-gnu: add another test
+ * tests/test-getopt_long.h (test_getopt_long_posix): New test, to
+ guarantee behavior relied on by m4.
+ * tests/test-getopt.c (main): Use it.
+ * modules/getopt-posix-tests (Depends-on): Add setenv.
+ See http://lists.gnu.org/archive/html/bug-m4/2006-09/msg00028.html.
+
+ getopt: fix compilation on darwin
+ * lib/getopt.in.h (includes): Leave breadcrumbs during system
+ include.
+ * lib/unistd.in.h (getopt): Use them to avoid recursive include.
+ Reported by Ludovic Courtès.
+
+2009-10-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/size_max (Description): Discourage its use.
+ Reported by Simon Josefsson.
+
+2009-10-06 Jim Meyering <meyering@redhat.com>
+
+ linkat: avoid compilation failure
+ * lib/linkat.c: Include <stdint.h> for use of SIZE_MAX.
+
+2009-10-05 Eric Blake <ebb9@byu.net>
+
+ linkat: support Linux 2.6.17
+ * m4/linkat.m4 (gl_FUNC_LINKAT): Default to always replacing
+ linkat on Linux, but allow cache variable override.
+ * lib/linkat.c (rpl_linkat): Define override.
+ * modules/linkat (Depends-on): Add symlinkat.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add new default.
+ * modules/unistd (Makefile.am): Substitute it.
+ * lib/unistd.in.h (linkat): Declare replacement.
+ Reported by Pádraig Brady.
+
+ quotearg: port test to systems with C.UTF-8 locale
+ * tests/test-quotearg.c (struct result_strings): Add another
+ member, differentiating between C.ASCII and C.UTF-8 handling.
+ (compare_strings): Add parameter.
+ (main): Adjust all callers.
+
+ getopt: avoid clash with FreeBSD _getopt_internal
+ * lib/getopt.in.h (_getopt_internal): Override the name.
+ * lib/getopt_int.h (includes): Pick up any overrides.
+ Reported by Reuben Thomas.
+
+ hash: allow C89 compilation
+ * lib/hash.c (check_tuning): Move declaration before statement.
+ Reported by Reuben Thomas.
+
+2009-10-05 Karl Berry <karl@gnu.org>
+
+ * doc/gnulib.texi: @include execvpe.texi, missing for several days.
+
+2009-10-04 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/uname.c (uname): Use a table-driven algorithm to compute
+ Windows NT versions.
+
+2009-10-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.c (set_program_name): Also remove the "lt-" prefix from
+ program_invocation_short_name.
+ * modules/progname (configure.ac): Test for presence of
+ program_invocation_short_name.
+ Reported by Sergey Poznyakoff <gray@gnu.org.ua>.
+
+2009-10-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.c (set_program_name): Fix comment.
+ Reported by Jim Meyering.
+
+2009-10-03 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/uname.c: Include <string.h>.
+ (uname): Do only one call to GetVersionEx in the common case.
+
+2009-10-03 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/uname.c (VER_PLATFORM_WIN32_CE, PROCESSOR_ARCHITECTURE_AMD64,
+ PROCESSOR_ARCHITECTURE_IA32_ON_WIN64): Define fallbacks.
+ (uname): Add support for Windows CE and various non-x86 CPU types.
+
+2009-10-03 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Conditionally emit AM_PROG_CC_C_O
+ invocation to tests/configure.ac.
+ Reported by Ian Beckwith <ianb@erislabs.net>.
+
+2009-10-02 Eric Blake <ebb9@byu.net>
+
+ fchdir: avoid compiler warning
+ * lib/fchdir.c (canonicalize_file_name)
+ [!HAVE_CANONICALIZE_FILE_NAME]: Avoid compiler warning on mingw.
+
+ test-open: support mingw errno values
+ * tests/test-open.h (test_open): Relax test.
+ * tests/test-fopen.h (test_fopen): Likewise.
+ * tests/test-openat-safer.c (main): Likewise.
+
+ open: fix opening directory on mingw
+ * lib/open.c (open) [REPLACE_OPEN_DIRECTORY]: Correct typo.
+
+ test-open: on GNU/Hurd, /dev/null is a directory
+ * tests/test-fopen.h (main): Rename...
+ (test_fopen): ...to this. Use a guaranteed non-directory when
+ confirming open behavior on trailing slash.
+ * tests/test-openat-safer.c (main): Likewise.
+ * tests/test-open.h (main): Likewise....
+ (test_open): ...to this.
+ * tests/test-fopen.c (main): Adjust caller.
+ * tests/test-fopen-safer.c (main): Likewise.
+ * tests/test-open.c (main): Likewise.
+ * tests/test-fcntl-safer.c (main): Likewise.
+ Reported by Samuel Thibault.
+
+ rename, fchdir: don't ignore chdir failure
+ * lib/fchdir.c (get_name): Abort on unexpected chdir failure.
+ * lib/rename.c (rpl_rename) [W32]: Likewise.
+ (rpl_rename) [RENAME_DEST_EXISTS_BUG]: Avoid one case of losing
+ an empty destination directory if source cannot be renamed,
+ although there is still possibility for failure.
+ * doc/posix-functions/rename.texi (rename): Document the race.
+ Reported by Jim Meyering.
+
+ maint: cleanup whitespace in recent commits
+ * lib/rename.c (rpl_rename): Remove tabs.
+ * tests/test-link.h (test_link): Likewise.
+ * lib/fchdir.c (get_name): Likewise.
+ Reported by Jim Meyering.
+
+2009-10-02 Ben Pfaff <blp@gnu.org>
+
+ relocatable-prog-wrapper: Add missing dependency on
+ double-slash-root.
+ * modules/relocatable-prog-wrapper: Add dependency.
+ Reported by Ian Beckwith <ianb@erislabs.net>.
+
+2009-10-02 Eric Blake <ebb9@byu.net>
+
+ renameat: fix Solaris bugs
+ * m4/renameat.m4 (gl_FUNC_RENAMEAT): Replace renameat if rename
+ needed fixing.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): New witness.
+ * modules/stdio (Makefile.am): Substitute it.
+ * lib/stdio.in.h (renameat): Declare replacement.
+ * lib/renameat.c (rpl_renameat): Implement fix.
+
+ renameat: new module
+ * modules/renameat: New file.
+ * lib/renameat.c (renameat): Likewise.
+ * m4/renameat.m4 (gl_FUNC_RENAMEAT): Likewise.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Add witnesses.
+ * modules/stdio (Makefile.am): Substitute them.
+ * lib/stdio.in.h (renameat): Declare it.
+ * MODULES.html.sh (systems lacking POSIX:2008): Mention module.
+ * doc/posix-functions/renameat.texi (renameat): Likewise.
+ * modules/renameat-tests: New test.
+ * tests/test-renameat.c: Likewise.
+
+ rename: fix mingw bugs
+ * lib/rename.c (rpl_rename) [W32]: Fix trailing slash and
+ directory overwrite bugs.
+
+ rename: fix another cygwin 1.5 bug
+ * m4/rename.m4 (gl_FUNC_RENAME): Split cygwin bugs into two
+ checks.
+ * lib/rename.c (rpl_rename): Don't penalize NetBSD with
+ unnecessary cygwin workarounds. Also work around bug with moving
+ full directory onto an empty one.
+ * modules/rename (Depends-on): Add canonicalize-lgpl, rmdir.
+
+ rename-dest-slash: merge into rename module
+ * modules/rename-dest-slash (Status): Mark obsolete.
+ (Depends-on): Add rename.
+ (Files): Let rename do it all.
+ * m4/rename.m4 (gl_FUNC_RENAME): Also test for NetBSD bugs,
+ subsuming the test from gl_FUNC_RENAME_TRAILING_DEST_SLASH...
+ * m4/rename-dest-slash.m4: ...so this file can be deleted.
+ * lib/rename-dest-slash.c (rpl_rename_dest_slash): Delete.
+ * lib/rename.c (rpl_rename): Update comments.
+
+ rename: fix cygwin 1.5.x bugs
+ * m4/rename.m4 (gl_FUNC_RENAME): Detect cygwin bugs.
+ * lib/rename.c (rpl_rename): Work around them.
+ * modules/rename (Depends-on): Add same-inode.
+
+ rename: fix Solaris 10 bug
+ * m4/rename.m4 (gl_FUNC_RENAME): Detect Solaris bug.
+ * lib/rename.c (rpl_rename): Don't cripple POSIX behavior if this
+ was the only bug.
+
+ rename: fix Solaris 9 bug
+ * lib/rename.c (rpl_rename): Rewrite to recognize trailing slash
+ on non-directory. Avoid calling exit.
+ * modules/rename (Depends-on): Drop xalloc; add lstat, stdbool,
+ strdup.
+ * modules/rename-tests (Depends-on): Drop lstat.
+ * m4/rename.m4 (gl_FUNC_RENAME): Detect Solaris bug.
+ (gl_PREREQ_RENAME): Delete unused macro.
+
+ rename-dest-slash: fix NetBSD bug
+ * lib/rename-dest-slash.c (rpl_rename_dest_slash): Detect hard
+ links.
+ * modules/rename-dest-slash (Depends-on): Add same-inode.
+
+ rename-tests: new test, exposes several platform bugs
+ * modules/rename-tests: New file.
+ * tests/test-rename.h: Likewise.
+ * tests/test-rename.c: Likewise.
+ * doc/posix-functions/rename.texi (rename): Improve documentation,
+ including bugs that will eventually be fixed in gnulib.
+
+2009-10-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/uname.c: Include <stdlib.h>
+ (uname): Assume version info is available.
+
+2009-10-02 Jim Meyering <meyering@redhat.com>
+
+ gnu-web-doc-update: correct --help output
+ * build-aux/gnu-web-doc-update: Make --help output relevant.
+
+ gnu-web-doc-update: add standard options
+ * build-aux/gnu-web-doc-update: Add --help, --version, etc.
+
+ gnu-web-doc-update: New module.
+ Use this script to automatically update the on-line web documentation
+ for your GNU project at http://www.gnu.org/software/$pkg/manual/
+ * modules/gnu-web-doc-update: New file, from coreutils.
+ * build-aux/gnu-web-doc-update: New script.
+
+2009-10-01 Paolo Bonzini <bonzini@gnu.org>
+
+ link: LoadLibrary is not needed.
+ * lib/link.c: Use GetModuleHandle.
+
+2009-10-01 Eric Blake <ebb9@byu.net>
+
+ getopt: bump serial number
+ * m4/getopt.m4: Increment serial number, to account for 2009-09-24
+ change.
+
+ tests: tighten link, rmdir, and remove tests
+ * tests/test-link.h (includes): No need to use <config.h> here.
+ Clean up if directory hard link was created, otherwise test for
+ trailing '.'.
+ * tests/test-linkat.c (main): Simplify.
+ * tests/test-remove.c (main): Enhance test for trailing '.'.
+ * tests/test-rmdir.h (test_rmdir_func): Likewise.
+
+2009-10-01 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: requiring "make major" was annoying, for a "minor" release.
+ What is intended is "stable", to contrast with alpha and beta,
+ so require "make stable", not "make major".
+ * build-aux/announce-gen (%valid_release_types): s/major/stable/.
+ (get_tool_versions): Likewise.
+ * top/maint.mk (ALL_RECURSIVE_TARGETS): s/major/stable/
+
+2009-09-30 Ben Pfaff <blp@gnu.org>
+
+ Fix broken build of replacement for Windows tmpfile().
+ * lib/tmpfile.c (tmpfile): Fix call to gen_tempname() to provide
+ flags argument added along with the 'mkostemp' module.
+
+2009-09-28 Bruno Haible <bruno@clisp.org>
+
+ Avoid identifier clash with POSIX function 'remove' defined as a macro.
+ * lib/gl_list.h (struct gl_list_implementation): Rename field 'remove'
+ to 'remove_elt'.
+ (gl_list_remove): Update.
+ * lib/gl_list.c (gl_list_remove): Update.
+ * lib/gl_oset.h (struct gl_oset_implementation): Rename field 'remove'
+ to 'remove_elt'.
+ (gl_oset_remove): Update.
+ * lib/gl_list.c (gl_oset_remove): Update.
+ Reported by Eric Blake.
+
+2009-09-28 Eric Blake <ebb9@byu.net>
+
+ doc: mention yet more cygwin 1.7 status
+ * doc/posix-functions/fexecve.texi (fexecve): Now implemented in
+ cygwin.
+ * doc/glibc-functions/execvpe.texi (execvpe): New file.
+ * doc/gnulib.texi (Glibc unistd.h): Mention it.
+
+ argp: fix test failure
+ * lib/argp-help.c (hol_entry_cmp): Don't use _tolower on values
+ that are not upper-case. Pass correct range to tolower.
+
+2009-09-27 Jim Meyering <meyering@redhat.com>
+
+ test-yesno: work around sparc-dash here-document infelicity
+ Without this change, the literal \177 byte in a here document
+ would make dash 0.5.5.1-3 access uninitialized memory.
+ * tests/test-yesno.sh: Don't put the \177 byte in the here document.
+ Instead, use a marker, "@", and filter through tr to create the desired
+ contents. Reported as <http://bugs.debian.org/548493> by Kurt Roeckx.
+
+2009-09-27 Bruno Haible <bruno@clisp.org>
+
+ Disable untested support for new flavours of ACLs on AIX.
+ * lib/file-has-acl.c (file_has_acl): Mark newer AIX code as work in
+ progress.
+ * lib/set-mode-acl.c (qset_acl): Likewise.
+
+2008-12-07 Bruno Haible <bruno@clisp.org>
+
+ Add support for new flavours of ACLs on AIX. (Untested.)
+ * lib/file-has-acl.c [AIX] (acl_nfs4_nontrivial): New function.
+ (file_has_acl): Add support for newer AIX.
+ * lib/set-mode-acl.c (qset_acl): Likewise.
+ * tests/test-sameacls.c (main): Fix use of aclx_get function. Hint by
+ Rainer Tammer <tammer@tammer.net>.
+
+2009-09-26 Eric Blake <ebb9@byu.net>
+
+ argp: fix compilation of getopt
+ * lib/getopt.in.h (includes): Use different guard than glibc.
+ Reported by Sergey Poznyakoff.
+
+ doc: mention more cygwin 1.7 status
+ * doc/posix-functions/access.texi (access): Mention cygwin 1.5
+ bug.
+ * doc/posix-functions/execl.texi (execl): Likewise.
+ * doc/posix-functions/execle.texi (execle): Likewise.
+ * doc/posix-functions/execlp.texi (execlp): Likewise.
+ * doc/posix-functions/execv.texi (execv): Likewise.
+ * doc/posix-functions/execve.texi (execve): Likewise.
+ * doc/posix-functions/execvp.texi (execvp): Likewise.
+ * doc/glibc-functions/canonicalize_file_name.texi
+ (canonicalize_file_name): Cygwin 1.7 now provides this.
+ * doc/glibc-functions/euidaccess.texi (euidaccess): Likewise.
+ * doc/posix-functions/fchmodat.texi (fchmodat): Mention limitation
+ on AT_SYMLINK_NOFOLLOW.
+
+2009-09-24 Eric Blake <ebb9@byu.net>
+
+ test-linkat: make test more robust
+ * tests/test-linkat.c (main): Avoid collision with EEXIST.
+
+ getopt: fix inclusion guards for cygwin
+ * modules/getopt-posix (Depends-on): Add include-next.
+ (Makefile.am): Substitute more items in replacement header.
+ * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS): Also check for native
+ <getopt.h>.
+ * lib/getopt.in.h (includes): Use split inclusion guard, and
+ prefer <getopt.h> over include <unistd.h> when one is present.
+ (option): Also override name of 'struct option'.
+
+ same-inode: revert prior change; it is not yet ready
+ * NEWS: Undo mention of this change.
+ * lib/same-inode.h (same-inode.h): Undo tri-state change.
+ * lib/cycle-check.h (CYCLE_CHECK_REFLECT_CHDIR_UP): Update caller.
+ * lib/cycle-check.c (cycle_check): Likewise.
+ * lib/same.c (same_name): Likewise.
+ * lib/at-func2.c (at_func2): Likewise.
+
+2009-09-23 Eric Blake <ebb9@byu.net>
+
+ linkat: new module
+ * modules/linkat: New file.
+ * lib/at-func2.c (at_func2): Likewise.
+ * lib/linkat.c (linkat): Likewise.
+ * m4/linkat.m4 (gl_FUNC_LINKAT): Likewise.
+ * lib/openat-priv.h (at_func2): Add declaration.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witnesses.
+ * modules/unistd (Makefile.am): Substitute them.
+ * lib/unistd.in.h (linkat): Declare it.
+ * MODULES.html.sh (systems lacking POSIX:2008): Mention module.
+ * doc/posix-functions/linkat.texi (linkat): Likewise.
+ * doc/posix-functions/link.texi (link): Tweak wording.
+ * tests/test-link.c (main): Move guts...
+ * tests/test-link.h (test_link): ...into new file.
+ * modules/linkat-tests: New test.
+ * tests/test-linkat.c: Likewise.
+ * modules/link-tests (Files): Ship new file.
+ (Depends-on): Add stdbool.
+
+ dirname: add library-safe mdir_name
+ * lib/dirname.h (mdir_name): New prototype.
+ * lib/dirname.c (dir_name): Move guts...
+ (mdir_name): ...to new function that avoids xalloc_die.
+
+ fchdir: another mingw fix
+ * modules/fchdir (Depends-on): Drop canonicalize-lgpl.
+ * lib/fchdir.c (get_name): New helper method; skips canonicalize
+ on mingw (where it has not yet been ported), and make it optional
+ elsewhere.
+ (_gl_register_fd): Use it.
+
+ same-inode: make SAME_INODE tri-state, to port to mingw
+ * NEWS: Mention this change.
+ * lib/same-inode.h (same-inode.h): Recognize mingw limitation of
+ st_ino always being 0.
+ * lib/cycle-check.h (CYCLE_CHECK_REFLECT_CHDIR_UP): Update caller.
+ * lib/cycle-check.c (cycle_check): Likewise.
+ * lib/same.c (same_name): Likewise.
+
+ lstat: avoid mingw compilation error
+ * m4/lstat.m4 (gl_FUNC_LSTAT): Avoid duplicate calls to
+ AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK, and deal with missing
+ lstat ourselves.
+ * lib/lstat.c [!HAVE_LSTAT]: Do nothing if <sys/stat.h> override
+ was adequate.
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Let lstat module handle
+ the checks for lstat.
+ (gl_SYS_STAT_H_DEFAULTS): Set default for HAVE_LSTAT.
+
+ link: fix test failure on Solaris 9
+ * lib/link.c (rpl_link): Don't assume link will catch bogus
+ trailing slash on source.
+
+ test-symlinkat: enhance test
+ * tests/test-readlink.c (main): Move guts...
+ * tests/test-readlink.h (test_readlink): ...into new file.
+ * tests/test-symlink.c (main): Move guts...
+ * tests/test-symlink.h (test_symlink): ...into new file.
+ * tests/test-symlinkat.c (main): Use new files for further
+ coverage.
+ (do_symlink, do_readlink): New helper functions.
+ * modules/symlink-tests (Files): Ship new file.
+ (Depends-on): Add stdbool.
+ * modules/readlink-tests (Files): Ship new file.
+ (Depends-on): Add stdbool.
+ * modules/symlinkat-tests (Files): Use new files.
+
+2009-09-23 Eric Blake <ebb9@byu.net>
+
+ readlink: document portability issue with symlink length
+ * doc/posix-functions/lstat.texi (lstat): Mention that some file
+ systems have bogus st_size on symlinks, and mention the
+ areadlink-with-size module.
+ * doc/posix-functions/fstatat.texi (fstatat): Likewise.
+ * doc/posix-functions/readlink.texi (readlink): Mention the
+ areadlink module, and ERANGE failure.
+ * doc/posix-functions/readlinkat.texi (readlinkat): Likewise.
+ * tests/test-readlink.c (main): Relax test for AIX, HP-UX.
+
+ readlink: fix Solaris 9 bug with trailing slash
+ * lib/readlink.c (rpl_readlink): Work around trailing slash bug.
+ * m4/readlink.m4 (gl_FUNC_READLINK): Detect the bug.
+ * doc/posix-functions/readlink.texi (readlink): Document this.
+ * modules/readlink-tests: New test.
+ * tests/test-readlink.c: Likewise.
+
+ readlink: fix cygwin 1.5.x bug with return type
+ * m4/readlink.m4 (gl_FUNC_READLINK): Require correct signature.
+ * lib/unistd.in.h (readlink): Use ssize_t.
+ * lib/readlink.c (readlink): Likewise.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witness.
+ * modules/unistd (Makefile.am): Substitute it.
+ * lib/unistd.in.h (readlink): Declare replacement.
+ * doc/posix-functions/readlink.texi (readlink): Document this.
+
+ symlink: use throughout gnulib
+ * m4/symlinkat.m4 (gl_FUNC_SYMLINKAT): Omit symlink check.
+ * lib/symlinkat.c (symlinkat) [!HAVE_SYMLINK]: Document why
+ symlink is not used.
+ * modules/symlinkat (Depends-on): Add symlink.
+ * modules/canonicalize-lgpl-tests (Depends-on): Likewise.
+ * modules/canonicalize-tests (Depends-on): Likewise.
+ * modules/lstat-tests (Depends-on): Likewise.
+ * modules/openat-tests (Depends-on): Likewise.
+ * modules/remove-tests (Depends-on): Likewise.
+ * modules/rmdir-tests (Depends-on): Likewise.
+ * modules/unlink-tests (Depends-on): Likewise.
+ * tests/test-canonicalize-lgpl.c (symlink): Delete stub.
+ * tests/test-canonicalize.c (symlink): Likewise.
+ * tests/test-fstatat.c (symlink): Likewise.
+ * tests/test-lstat.c (symlink): Likewise.
+ * tests/test-remove.c (symlink): Likewise.
+ * tests/test-rmdir.c (symlink): Likewise.
+ * tests/test-unlink.c (symlink): Likewise.
+ * tests/test-unlinkat.c (symlink): Likewise.
+
+ symlink: new module, for Solaris 9 bug
+ * modules/symlink: New file.
+ * m4/symlink.m4 (gl_FUNC_SYMLINK): Likewise.
+ * lib/symlink.c: Likewise.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add defaults.
+ * modules/unistd (Makefile.am): Substitute them.
+ * lib/unistd.in.h (symlink): Declare replacement.
+ * MODULES.html.sh (File system functions): Mention it.
+ * doc/posix-functions/symlink.texi (symlink): Likewise.
+ * modules/symlink-tests: New test.
+ * tests/test-symlink.c: Likewise.
+
+2009-09-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Add 'link-warning' to testsrelated_modules
+ when needed.
+ Test case: gnulib-tool --import --with-tests atexit inttypes.
+ Reported by Pauli Miettinen <pauli.miettinen@cs.helsinki.fi>.
+
+2009-09-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_tests_Makefile_am): Set uses_subdirs in a
+ subcommand, not in a subshell.
+
+2009-09-22 Eric Blake <ebb9@byu.net>
+
+ unistd: sort replacement declarations
+ * lib/unistd.in.h: Sort declarations.
+
+ open, openat: minor optimization
+ * lib/open.c (open): If open succeeded, len is non-zero.
+ * lib/openat.c (rpl_openat): Likewise.
+
+ link-follow: ensure correct result
+ * m4/fcntl_h.m4 (gl_FCNTL_H): Clean up temporary file.
+ * m4/link-follow.m4 (gl_FUNC_LINK_FOLLOWS_SYMLINK): Likewise, and
+ distinguish between possible failures.
+
+2009-09-21 Eric Blake <ebb9@byu.net>
+
+ fts: avoid compiler warning
+ * lib/fts.c (dirent_inode_sort_may_be_useful)
+ (leaf_optimization_applies) [!__linux__]: Mark unused parameters.
+
+2009-09-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/progreloc.c (canonicalize_file_name): New declaration.
+
+2009-09-19 Eric Blake <ebb9@byu.net>
+
+ link: fix quoting
+ * m4/link.m4 (gl_FUNC_LINK): Fix shell quoting.
+
+ openat: fix openat bugs on Solaris 9
+ * lib/openat.c (rpl_openat): Work around Solaris 9 bug.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Also replace openat on Solaris.
+ * modules/openat (Depends-on): Add open.
+ * m4/fcntl_h.m4 (gl_FCNTL_H_DEFAULTS): Provide new default.
+ * modules/fcntl-h (Makefile.am): Substitute it.
+ * lib/fcntl.in.h (openat): Declare replacement.
+ * doc/posix-functions/openat.texi (openat): Document this.
+
+ openat: move fstatat and unlinkat into correct files
+ * m4/openat.m4 (gl_FUNC_OPENAT): Adjust which files will be
+ compiled.
+ * lib/openat.c (fstatat, unlinkat): Move...
+ * lib/fstatat.c (fstatat): ...into correct files.
+ * lib/unlinkat.c (unlinkat): Likewise.
+
+ openat: fix unlinkat bugs on Solaris 9
+ * lib/unlinkat.c (unlinkat): New file.
+ * modules/openat (Depends-on): Add unlink.
+ (Files): Distribute it.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Mark unlinkat for replacement if
+ trailing slash behavior is broken.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witness.
+ * modules/unistd (Makefile.am): Substitute it.
+ * lib/unistd.in.h (unlinkat): Declare replacement.
+ * doc/posix-functions/unlinkat.texi (unlinkat): Document this.
+
+ openat: fix fstatat bugs on Solaris 9
+ * lib/fstatat.c (rpl_fstatat): Copy recent fixes from lstat and
+ stat.
+ * doc/posix-functions/fstatat.texi (fstatat): Document this.
+
+ test-unlinkat: enhance test, to expose Solaris 9 bug
+ * tests/test-unlink.c (main): Factor guts...
+ * tests/test-unlink.h (test_rmdir_func): ...into new file.
+ * tests/test-rmdir.h (test_rmdir_func): Add parameter.
+ * tests/test-rmdir.c (main): Adjust caller.
+ * tests/test-unlinkat.c (main): Likewise. Add unlink tests.
+ (unlinker): New helper function.
+ (rmdirat): Enhance check.
+ * modules/rmdir-tests (Depends-on): Add stdbool.
+ * modules/unlink-tests (Depends-on): Likewise.
+ (Files): Add test-unlink.h.
+ * modules/openat-tests (Files): Likewise.
+ (Depends-on): Add unlinkdir.
+
+ test-fstatat: new test, to expose Solaris 9 bugs
+ * tests/test-stat.c (main): Factor guts...
+ * tests/test-stat.h (test_stat_func): ...into new file.
+ * tests/test-lstat.c (main): Factor guts...
+ * tests/test-lstat.h (test_lstat_func): ...into new file.
+ * tests/test-fstatat.c: New file.
+ * modules/stat-tests (Files): Add test-stat.h.
+ * modules/lstat-tests (Files): Add test-lstat.h.
+ (Depends-on): Add stdbool.
+ * modules/openat-tests (Depends-on): Add pathmax.
+ (Files): Add test-lstat.h, test-stat.h, test-fstatat.c.
+ (Makefile.am): Run new test.
+
+ remove: new module, for mingw and Solaris 9 bugs
+ * modules/remove: New file.
+ * lib/remove.c: Likewise.
+ * m4/remove.m4 (gl_FUNC_REMOVE): Likewise.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Add witnesses.
+ * modules/stdio (Makefile.am): Use them.
+ * lib/stdio.in.h (remove): Declare replacement.
+ * MODULES.html.sh (systems lacking POSIX:2008): Mention module.
+ * doc/posix-functions/remove.texi (remove): Likewise.
+ * modules/remove-tests: New test.
+ * tests/test-remove.c: Likewise.
+
+ unlink: new module, for Solaris 9 bug
+ * modules/unlink: New file.
+ * lib/unlink.c: Likewise.
+ * m4/unlink.m4 (gl_FUNC_UNLINK): Likewise.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witnesses.
+ * modules/unistd (Makefile.am): Use them.
+ * lib/unistd.in.h (stat): Declare replacement.
+ * MODULES.html.sh (systems lacking POSIX:2008): Mention module.
+ * doc/posix-functions/unlink.texi (unlink): Likewise.
+ * modules/unlink-tests: New test.
+ * tests/test-unlink.c: Likewise.
+
+ lstat: fix Solaris 9 bug
+ * lib/lstat.c (lstat): Also check for trailing slash on
+ non-symlink, non-directories. Use stat module to simplify logic.
+ * doc/posix-functions/lstat.texi (lstat): Document it.
+ * modules/lstat-tests (Depends-on): Add errno, same-inode.
+ (configure.ac): Check for symlink.
+ * tests/test-lstat.c (main): Add more tests.
+
+ stat: add as dependency to other modules
+ * modules/chown (Depends-on): Add stat.
+ * modules/euidaccess (Depends-on): Likewise.
+ * modules/fchdir (Depends-on): Likewise.
+ * modules/isdir (Depends-on): Likewise.
+ * modules/link (Depends-on): Likewise.
+ * modules/lstat (Depends-on): Likewise.
+ * modules/mkdir-p (Depends-on): Likewise.
+ * modules/modechange (Depends-on): Likewise.
+ * modules/open (Depends-on): Likewise.
+ * modules/readlink (Depends-on): Likewise.
+ * modules/same (Depends-on): Likewise.
+
+ stat: fix Solaris 9 bug
+ * m4/stat.m4 (gl_FUNC_STAT): Detect Solaris 9 bug with trailing
+ slash.
+ * lib/stat.c (rpl_stat): Work around it.
+ * doc/posix-functions/stat.texi (stat): Update documentation.
+
+ stat: new module, for mingw bug
+ * modules/stat: New file.
+ * lib/stat.c: Likewise.
+ * m4/stat.m4 (gl_FUNC_STAT): Likewise.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Add witnesses.
+ * modules/sys_stat (Makefile.am): Use them.
+ * lib/sys_stat.in.h (stat): Declare replacement.
+ * lib/openat.c (fstatat): Deal with lstat and stat being function
+ macros.
+ * modules/openat (Depends-on): Add inline.
+ * MODULES.html.sh (systems lacking POSIX:2008): Mention module.
+ * doc/posix-functions/stat.texi (stat): Likewise.
+ * modules/stat-tests: New test.
+ * tests/test-stat.c: Likewise.
+
+2009-09-19 Jim Meyering <meyering@redhat.com>
+
+ syntax-check: detect unnecessary inclusion of canonicalize.h
+ * top/maint.mk (sc_prohibit_canonicalize_without_use): New rule.
+
+2009-09-19 Eric Blake <ebb9@byu.net>
+
+ canonicalize-lgpl: adjust clients to use correct header
+ * m4/canonicalize.m4 (gl_FUNC_CANONICALIZE_FILENAME_MODE)
+ (gl_CANONICALIZE_LGPL): Use correct shell quoting.
+ * modules/relocatable-prog-wrapper (Files): Drop canonicalize.h.
+ * lib/fchdir.c (includes): Use <stdlib.h>, not "canonicalize.h".
+ * lib/progreloc.c (includes): Likewise.
+
+2009-09-19 Jim Meyering <meyering@redhat.com>
+
+ test-posixtm.c: correct a comment
+ * tests/test-posixtm.c: Correct first-line comment.
+ Spotted by Eric Blake.
+
+2009-09-16 Jim Meyering <meyering@redhat.com>
+
+ posixtm-tests: make T const-correct; add a test case
+ * tests/test-posixtm.c (T): Declare const.
+ Add a test for -(2^31+1).
+ Remove useless can-succeed-only-in-2002 test.
+
+ posixtm-tests: adjust the sole failing test
+ * tests/test-posixtm.c: Correct 0000-01-01 00:00:00 test so that
+ expected output matches what mktime now produces. Cross-checked via
+ erlang's calendar:datetime_to_gregorian_seconds({{1970,1,1},{0,0,0}})
+
+ posixtm: move #ifdef'd tests into a new module
+ * lib/posixtm.c (posixtime): Remove #ifdef'd tests. Move to...
+ * tests/test-posixtm.c: ... this new file.
+ * modules/posixtm-tests: New module.
+
+2009-09-19 Eric Blake <ebb9@byu.net>
+
+ openat: simplify use of at-func.c
+ * lib/at-func.c (includes): Include prerequisites here, to
+ simplify requirements on client files.
+ * lib/openat-priv.h: Add double-inclusion guard.
+ * lib/faccessat.c (includes): Simplify.
+ * lib/fchmodat.c (includes): Likewise.
+ * lib/fchownat.c (includes): Likewise.
+ * lib/mkdirat.c (includes): Likewise.
+ * lib/mkfifoat.c (includes): Likewise.
+ * lib/symlinkat.c (includes): Likewise.
+
+ openat: allow return of fd 0
+ * modules/chdir-long (Depends-on): Relax openat-safer to openat.
+ * modules/save-cwd (Depends-on): Replace fcntl-safer with
+ unistd-safer.
+ * lib/chdir-long.c (includes): Replace "fcntl--.h" with
+ <fcntl.h>; this module does not leak fds.
+ * lib/openat.c (includes): Do not use "fcntl_safer"; plain openat
+ must be allowed to return 0, leaving openat_safer to add the
+ safety.
+ (openat_permissive): Avoid writing to just-opened fd 2 if
+ restoring the current directory fails.
+ * lib/openat-die.c (openat_restore_fail): Add comment.
+ * lib/save-cwd.c (includes): Make "fcntl--.h" conditional.
+ (save_cwd): Guarantee safe fd, but without use of open_safer.
+ * tests/test-openat.c: New test.
+ * modules/openat-tests (Files, Makefile.am): Distribute and build
+ new file.
+
+ relocatable-prog-wrapper: fix build
+ * modules/relocatable-prog-wrapper (Files): Update name of
+ canonicalize m4 file, broken on 2009-09-17.
+ Reported by emad hajjar <aleppos@hotmail.com>.
+
+2009-09-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/safe-alloc.h: Use the standard header with GPL copyright.
+ * lib/safe-alloc.c: Likewise.
+ Reported by Ian Beckwith <ianb@erislabs.net>.
+
+2009-09-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Add advice to "cannot find configure.ac" error message.
+ Reported by <erobles@sensacd.com.mx>.
+
+2009-09-17 Eric Blake <ebb9@byu.net>
+
+ canonicalize: in CAN_ALL_BUT_LAST, allow trailing slash
+ * lib/canonicalize.c (canonicalize_filename_mode): Skip trailing
+ slashes when checking if last component is missing.
+ * tests/test-canonicalize.c (main): Test this.
+
+ canonicalize, canonicalize-lgpl: honor // if distinct from /
+ * modules/canonicalize (Files): Add double-slash-root.m4.
+ * modules/canonicalize-lgpl (Files): Likewise.
+ * m4/canonicalize.m4 (gl_FUNC_CANONICALIZE_FILENAME_MODE)
+ (gl_CANONICALIZE_LGPL_SEPARATE): Add dependency.
+ * lib/canonicalize.c (DOUBLE_SLASH_IS_DISTINCT_ROOT): Provide
+ fallback definition.
+ (canonicalize_filename_mode): Use it to protect //.
+ * lib/canonicalize-lgpl.c (DOUBLE_SLASH_IS_DISTINCT_ROOT)
+ (__realpath): Likewise.
+ * tests/test-canonicalize.c (main): Test this.
+ * tests/test-canonicalize-lgpl.c (main): Likewise.
+ * modules/canonicalize-tests (Depends-on): Add same-inode.
+ * modules/canonicalize-lgpl-tests (Depends-on): Likewise.
+
+ canonicalize-lgpl: fix glibc bug with trailing slash
+ * m4/canonicalize-lgpl.m4: Move contents...
+ * m4/canonicalize.m4: ...here.
+ (gl_CANONICALIZE_LGPL): Factor realpath check...
+ (gl_FUNC_REALPATH_WORKS): ...into new macro. Enhance to catch
+ glibc 2.3.5 bug, fixed 2005-04-27.
+ (gl_FUNC_CANONICALIZE_FILENAME_MODE): Use it.
+ (gl_PREREQ_CANONICALIZE_LGPL): Inline...
+ (gl_CANONICALIZE_LGPL_SEPARATE): ...into this macro.
+ * modules/canonicalize-lgpl (Files): Manage file rename.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Provide default.
+ * modules/stdlib (Makefile.am): Substitute witness.
+ * lib/stdlib.in.h (canonicalize_file_name): Declare if replacement
+ is needed.
+ * lib/canonicalize-lgpl.c: Also compile if canonicalize_file_name
+ replacement is required.
+ * lib/canonicalize.c (canonicalize_file_name): Likewise.
+ * doc/glibc-functions/canonicalize_file_name.texi
+ (canonicalize_file_name): Document this.
+ * doc/posix-functions/realpath.texi (realpath): Likewise.
+
+ canonicalize-lgpl: reject non-directory with trailing slash
+ * lib/canonicalize-lgpl.c (__realpath): Synchronize with glibc.
+ * tests/test-canonicalize-lgpl.c (main): Enhance test. This
+ catches failures in glibc 2.3.5.
+ * tests/test-canonicalize.c (main): Likewise.
+
+ canonicalize-lgpl: use native realpath if it works
+ * lib/canonicalize-lgpl.c (realpath): Guard with
+ FUNC_REALPATH_WORKS.
+ * lib/stdlib.in.h (realpath): Make declaration optional based on
+ HAVE_REALPATH.
+ * m4/canonicalize-lgpl.m4 (gl_CANONICALIZE_LGPL): Check whether
+ native realpath works.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Provide default.
+ * modules/stdlib (Makefile.am): Substitute witness.
+
+ canonicalize, canonicalize-lgpl: use <stdlib.h>
+ * modules/canonicalize-lgpl (Files): Drop canonicalize.h.
+ (Include): Mention <stdlib.h>.
+ (configure.ac): Mention functions we provide.
+ * modules/canonicalize (configure.ac): Likewise.
+ * m4/canonicalize-lgpl.m4 (gl_CANONICALIZE_LGPL): Always replace
+ realpath if canonicalize_file_name is missing.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Provide defaults.
+ * modules/stdlib (Makefile.am): Substitute witnesses.
+ * lib/stdlib.in.h (canonicalize_file_name, realpath): Declare.
+ * lib/canonicalize-lgpl.c (includes): Adjust accordingly.
+ * lib/canonicalize.h (canonicalize_file_name): Drop declaration.
+ * NEWS: Document this.
+ * doc/glibc-functions/canonicalize_file_name.texi
+ (canonicalize_file_name): Likewise.
+ * doc/posix-functions/realpath.texi (realpath): Likewise.
+ * tests/test-canonicalize-lgpl.c (includes): Use <stdlib.h>.
+
+ test-canonicalize: consolidate into single C program
+ * tests/test-canonicalize.sh: Delete; move setup into...
+ * tests/test-canonicalize.c (main): ...the program, making it
+ easier to run in debugger. Add some tests.
+ * modules/canonicalize-tests (Files): Remove unused file.
+ (Depends-on): Add progname.
+ (configure.ac, Makefile.am): Simplify.
+
+ test-canonicalize-lgpl: consolidate into single C program
+ * tests/test-canonicalize-lgpl.sh: Delete; move setup into...
+ * tests/test-canonicalize-lgpl.c (main): ...the program, making it
+ easier to run in debugger. Add some tests.
+ * modules/canonicalize-lgpl-tests (Files): Remove unused file.
+ (configure.ac, Makefile.am): Simplify.
+
+ canonicalize: avoid resolvepath
+ * m4/canonicalize.m4 (gl_FUNC_CANONICALIZE_FILENAME_MODE): Delete
+ unnecessary checks.
+ * lib/canonicalize.c (includes): Simplify.
+ (canonicalize_file_name): Drop resolvepath implementation.
+ * modules/canonicalize (Depends-on): Drop filenamecat.
+
+ canonicalize: don't lose errno
+ * lib/canonicalize.c (canonicalize_filename_mode): Protect errno
+ over calls to free.
+
+ canonicalize: simplify errno handling
+ * lib/canonicalize.c (__set_errno): Delete macro, and use direct
+ assignment.
+
+ canonicalize, canonicalize-lgpl: update module dependencies
+ * modules/canonicalize (Depends-on): Add extensions, lstat,
+ pathmax, stdlib.
+ (Files): Drop pathmax.h.
+ (configure.ac): Adjust macro name.
+ * modules/canonicalize-lgpl (Depends-on): Add errno, extensions,
+ lstat, stdlib, sys_stat.
+ * m4/canonicalize.m4 (AC_FUNC_CANONICALIZE_FILE_NAME): Rename...
+ (gl_FUNC_CANONICALIZE_FILENAME_MODE): ...to this, and require
+ extensions.
+ * m4/canonicalize-lgpl.m4 (gl_CANONICALIZE_LGPL)
+ (gl_CANONICALIZE_LGPL_SEPARATE): Require extensions.
+ (gl_PREREQ_CANONICALIZE_LGPL): Assume unistd.h.
+ * lib/canonicalize.h (canonicalize_file_name): Use <stdlib.h>
+ declaration, if available.
+ * lib/canonicalize-lgpl.c [HAVE_READLINK]: Delete this condition;
+ we can rely on the readlink module.
+ (MAXSYMLINKS): Also consult SYMLOOP_MAX.
+ (includes): Use <unistd.h> unconditionally.
+
+2009-09-17 Eric Blake <ebb9@byu.net>
+
+ maint: make Include sections of modules consistent
+ * modules/alloca: Use only header name; no need to list #include.
+ * modules/alloca-opt: Likewise.
+ * modules/arpa_inet: Likewise.
+ * modules/canon-host: Likewise.
+ * modules/configmake: Likewise.
+ * modules/dirent: Likewise.
+ * modules/eealloc: Likewise.
+ * modules/environ: Likewise.
+ * modules/fchdir: Likewise.
+ * modules/fcntl: Likewise.
+ * modules/fcntl-h: Likewise.
+ * modules/gethrxtime: Likewise.
+ * modules/gettime: Likewise.
+ * modules/ignore-value: Likewise.
+ * modules/inet_ntop: Likewise.
+ * modules/inet_pton: Likewise.
+ * modules/inttypes: Likewise.
+ * modules/isnand-nolibm: Likewise.
+ * modules/isnanf-nolibm: Likewise.
+ * modules/mbchar: Likewise.
+ * modules/mbfile: Likewise.
+ * modules/mbiter: Likewise.
+ * modules/mbuiter: Likewise.
+ * modules/netdb: Likewise.
+ * modules/netinet_in: Likewise.
+ * modules/nproc: Likewise.
+ * modules/pagealign_alloc: Likewise.
+ * modules/poll: Likewise.
+ * modules/printf-frexp: Likewise.
+ * modules/pthread: Likewise.
+ * modules/putenv: Likewise.
+ * modules/random_r: Likewise.
+ * modules/relocatable-prog: Likewise.
+ * modules/search: Likewise.
+ * modules/select: Likewise.
+ * modules/selinux-h: Likewise.
+ * modules/settime: Likewise.
+ * modules/signal: Likewise.
+ * modules/size_max: Likewise.
+ * modules/socklen: Likewise.
+ * modules/ssize_t: Likewise.
+ * modules/stdarg: Likewise.
+ * modules/stdbool: Likewise.
+ * modules/stddef: Likewise.
+ * modules/stdint: Likewise.
+ * modules/stdio: Likewise.
+ * modules/stdlib: Likewise.
+ * modules/string: Likewise.
+ * modules/strings: Likewise.
+ * modules/sys_file: Likewise.
+ * modules/sys_ioctl: Likewise.
+ * modules/sys_select: Likewise.
+ * modules/sys_socket: Likewise.
+ * modules/sys_stat: Likewise.
+ * modules/sys_time: Likewise.
+ * modules/sys_times: Likewise.
+ * modules/sys_utsname: Likewise.
+ * modules/sys_wait: Likewise.
+ * modules/sysexits: Likewise.
+ * modules/time: Likewise.
+ * modules/times: Likewise.
+ * modules/tmpfile: Likewise.
+ * modules/trim: Likewise.
+ * modules/unistd: Likewise.
+ * modules/wchar: Likewise.
+ * modules/wctype: Likewise.
+
+2009-09-17 Bruno Haible <bruno@clisp.org>
+
+ Make getdate.y compile on QNX and NetBSD 5 / i386.
+ * m4/getdate.m4 (gl_GETDATE): Conditionally define
+ TIME_T_FITS_IN_LONG_INT.
+ * lib/getdate.y (long_time_t): New type.
+ (relative_time): Change type of 'seconds' field to long_time_t.
+ (get_date): Update types of local variables. Check against overflow
+ during conversion from long_time_t to time_t.
+ Reported by Matt Kraai <kraai@ftbfs.org>
+ and Hasso Tepper <hasso@netbsd.org>.
+
+2009-09-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/COPYING: Update copyright years.
+ * modules/README: Likeiwse.
+ * doc/gnulib-intro.texi (Copyright): Use a wildcard year.
+ Reported by Ian Beckwith <ianb@erislabs.net>.
+
+2009-09-17 Ian Beckwith <ianb@erislabs.net> (tiny change)
+
+ * users.txt: Update references for gnuit package.
+
+2009-09-17 Ian Beckwith <ianb@erislabs.net> (tiny change)
+
+ * m4/getdelim.m4: Fix typo in copyright line.
+
+2009-09-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/atoll.c: Use the standard header with GPL copyright.
+ * lib/argz.in.h: Likewise.
+ * lib/glob.c: Likewise.
+ * lib/glob-libc.h: Likewise.
+ * lib/random_r.c: Likewise.
+ * lib/siglist.h: Likewise.
+ * lib/strsignal.c: Likewise.
+ Reported by Ian Beckwith <ianb@erislabs.net>.
+
+2009-09-17 Eric Blake <ebb9@byu.net>
+
+ rmdir: ensure correct dependency order
+ * m4/rmdir.m4 (gl_FUNC_RMDIR): Require unistd defaults.
+
+2009-09-17 Bruno Haible <bruno@clisp.org>
+
+ Disable assertion that fails on NetBSD 5 / i386.
+ * lib/mktime.c (ydhms_diff): Disable assertion about time_t size.
+ Reported by Sam Steingold <sds@gnu.org>
+ and Hasso Tepper <hasso@netbsd.org>.
+
+2009-09-16 Eric Blake <ebb9@byu.net>
+
+ unlinkdir: port to mingw
+ * m4/unlinkdir.m4 (gl_UNLINKDIR): Add mingw to list of platforms
+ on which no one can unlink a directory.
+
+ stdlib: sort witness names
+ * modules/stdlib (Makefile.am): Sort replacements.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Likewise.
+ * lib/stdlib.in.h: Likewise.
+
+ parse-duration-tests: avoid link failure
+ * modules/parse-duration-tests (test_parse_duration_LDADD): Add
+ LIBINTL.
+ Reported by Tom G. Christensen.
+
+ openat-tests: ensure unlinkat behaves like rmdir
+ * tests/test-rmdir.c (main): Factor guts...
+ * tests/test-rmdir.h (test_rmdir_func): ...into new file.
+ * modules/rmdir-tests (Files): Ship new file.
+ * modules/openat-tests: New test.
+ * tests/test-unlinkat.c: Likewise.
+
+ rmdir-errno: mark obsolete, it is unsafe for cross-compilation
+ * modules/rmdir-errno (Status, Notice): Now obsolete.
+
+ rmdir: work around cygwin 1.5.x and mingw bugs
+ * m4/rmdir.m4 (gl_FUNC_RMDIR): Detect the bugs.
+ * lib/rmdir.c (rmdir): Work around it.
+ * modules/rmdir (Status, Notice): No longer obsolete.
+ (Files): Add dos.m4.
+ (Depends-on): Add unistd.
+ (configure.ac): Set witnesses.
+ (License): Relax to LGPLv2+.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Set defaults.
+ * modules/unistd (Makefile.am): Substitute witnesses.
+ * lib/unistd.in.h (rmdir): Declare replacement.
+ * doc/posix-functions/rmdir.texi (rmdir): Document this.
+ * modules/rmdir-tests: New tests.
+ * tests/test-rmdir.c: Likewise.
+
+2009-09-15 Eric Blake <ebb9@byu.net>
+
+ fchdir: improve use of replacement functions
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Set appropriate witnesses.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Add REPLACE_FSTAT.
+ * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): Add REPLACE_OPENDIR,
+ REPLACE_CLOSEDIR.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add REPLACE_DUP.
+ * modules/sys_stat (Makefile.am): Substitute correct witness.
+ * modules/dirent (Makefile.am): Likewise.
+ * modules/unistd (Makefile.am): Likewise.
+ * lib/dirent.in.h (opendir, closedir): Use better witnesses.
+ * lib/unistd.in.h (dup): Likewise.
+ * lib/sys_stat.in.h (fstat): Likewise.
+
+ maint: ignore gnulib-tool temp files
+ * .gitignore: Ignore files created during gnulib-tool --test.
+
+2009-09-13 Jim Meyering <meyering@redhat.com>
+
+ posixtm: don't reject a time that specify "60" as the number of seconds
+ * lib/posixtm.c (posixtime): The code to reject invalid dates
+ would also reject a time specified with the .60 suffix.
+ But POSIX allows that, in order to accommodate leap seconds.
+ So don't reject it.
+ (main): Adjust tests accordingly.
+ * modules/posixtm (Depends-on): Add stpcpy.
+
+2009-09-11 Jim Meyering <meyering@redhat.com>
+
+ announce-gen: include [$release_type] in emitted Subject:
+ * build-aux/announce-gen (get_tool_versions): Include [$release_type],
+ e.g., [stable] in the emitted Subject: line.
+
+2009-09-10 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Remove obsolete macros from several modules.
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Replace
+ obsolete Autoconf macros with their modern counterparts.
+ * m4/check-math-lib.m4 (gl_CHECK_MATH_LIB): Likewise.
+ * m4/gc-camellia.m4 (gl_GC_CAMELLIA): Likewise.
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Likewise.
+ * m4/getdate.m4 (gl_C_COMPOUND_LITERALS): Likewise.
+ * m4/gethostname.m4 (gl_FUNC_GETHOSTNAME): Likewise.
+ * m4/getline.m4 (gl_FUNC_GETLINE): Likewise.
+ * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS): Likewise.
+ * m4/isfinite.m4 (gl_ISFINITEL_WORKS): Likewise.
+ * m4/poll.m4 (gl_FUNC_POLL): Likewise.
+ * m4/readline.m4 (gl_FUNC_READLINE): Likewise.
+ * m4/round.m4 (gl_FUNC_ROUND): Likewise.
+ * m4/roundf.m4 (gl_FUNC_ROUNDF): Likewise.
+ * m4/select.m4 (gl_FUNC_SELECT): Likewise.
+ * m4/sockets.m4 (gl_SOCKETS): Likewise.
+ * m4/socklen.m4 (gl_TYPE_SOCKLEN_T): Likewise.
+ * m4/sockpfaf.m4 (gl_SOCKET_FAMILIES): Likewise.
+ * m4/sysexits.m4 (gl_SYSEXITS): Likewise.
+ * m4/time_r.m4 (gl_TIME_R): Likewise.
+ * m4/tsearch.m4 (gl_FUNC_TSEARCH): Likewise.
+ * m4/vararrays.m4 (AC_C_VARARRAYS): Likewise.
+ * m4/wctype.m4 (gl_WCTYPE_H): Likewise.
+
+ Fix copyright header in build-aux scripts.
+ * build-aux/git-version-gen: Fix copyright header to match GPLv3
+ recommendation.
+ * build-aux/ncftpput-ftp: Likewise.
+ * build-aux/update-copyright: Likewise.
+
+2009-09-09 Eric Blake <ebb9@byu.net>
+
+ test-link: allow Linux choice of errno
+ * tests/test-link.c (main): Relax test for alternate error.
+
+ strndup: fix improper m4 caching
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): Rework to avoid side effects
+ inside AC_CACHE_CHECK. Use REPLACE_STRNDUP, not HAVE_STRNDUP.
+ (gl_PREREQ_STRNDUP): Delete.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Update default.
+ * modules/string (Makefile.am): Substitute it.
+ * lib/string.in.h (strndup): Modernize prototype.
+
+ getcwd: port to mingw
+ * m4/getcwd.m4 (gl_FUNC_GETCWD): Mingw directories are very
+ different from the POSIX assumptions made throughout the getcwd
+ module; fortunately, the mingw getcwd does not need replacement.
+ (gl_FUNC_GETCWD_NULL): Skip test on mingw.
+ * modules/getcwd-tests: New test.
+ * tests/test-getcwd.c: Likewise.
+
+ link: fix platform bugs
+ * m4/link.m4 (gl_FUNC_LINK): Detect Solaris and Cygwin bugs.
+ * lib/link.c (link): Work around them. Fix related mingw bug.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add REPLACE_LINK.
+ * modules/unistd (Makefile.am): Substitute it.
+ * lib/unistd.in.h (link): Declare replacement.
+ * doc/posix-functions/link.texi (link): Document this.
+ * modules/link (Depends-on): Add strdup-posix, sys_stat.
+
+ test-link: consolidate into single C program, test more cases
+ * tests/test-link.sh: Delete.
+ * tests/test-link.c: Test more error conditions. Exposes bugs on
+ at least Cygwin and Solaris.
+ * modules/link-tests (Files): Remove unused file.
+ (Depends-on): Add errno, sys_stat.
+ (Makefile.am): Simplify.
+
+2009-09-08 Bruno Haible <bruno@clisp.org>
+
+ Work around towlower, towupper bug on mingw.
+ * lib/wctype.in.h (towlower, towupper) [__MINGW32__]: New replacements.
+ * m4/wctype.m4 (gl_WCTYPE_H): Replace <wctype.h> also on mingw.
+ * doc/posix-functions/towlower.texi: Mention the mingw bug.
+ * doc/posix-functions/towupper.texi: Likewise.
+ Reported by Eric Blake.
+
+2009-09-08 Jim Meyering <meyering@redhat.com>
+
+ build: don't try to run autoheader if we don't use it
+ * build-aux/bootstrap: Define AUTOHEADER=true when AC_CONFIG_HEADERS
+ is not used in configure.ac.
+
+2009-09-08 Eric Blake <ebb9@byu.net>
+
+ euidaccess: fix compilation error
+ * lib/euidaccess.c (includes): Add <fcntl.h>, for AT_EACCESS.
+
+ rawmemchr: relax license
+ * modules/rawmemchr (License): Derived from glibc, so LGPLv2+ is
+ okay.
+ Reported by Jim Meyering.
+
+ mkfifoat: new module
+ * modules/mkfifoat: New file.
+ * lib/mkfifoat.c: Likewise.
+ * m4/mkfifoat.m4 (gl_FUNC_MKFIFOAT): Likewise.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Add witnesses.
+ * modules/sys_stat (Makefile.am): Use them.
+ * lib/sys_stat.in.h (mkfifoat, mknodat): Declare them.
+ * MODULES.html.sh (File system functions): Mention module.
+ * doc/posix-functions/mkfifoat.texi (mkfifoat): Likewise.
+ * doc/posix-functions/mknodat.texi (mknodat): Likewise.
+ * modules/mkfifoat-tests: New test.
+ * tests/test-mkfifoat.c: Likewise.
+
+ strchrnul: relax license
+ * modules/strchrnul (License): Derived from glibc, so LGPLv2+ is
+ okay.
+ Reported by Jim Meyering.
+
+2009-09-08 Eric Blake <ebb9@byu.net>
+
+ fstatat: fix compilation on Solaris
+ * lib/fstatat.c (includes): Add fcntl.h.
+ Reported by Pádraig Brady.
+
+2009-09-07 Eric Blake <ebb9@byu.net>
+
+ rename: modernize replacement
+ * modules/rename (Depends-on): Add stdio.
+ (configure.ac): Declare witness.
+ * m4/rename.m4 (gl_FUNC_RENAME): Ensure dependency order, and let
+ stdio take care of replacement.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Add new defaults.
+ * modules/stdio (Makefile.am): Substitute them.
+ * lib/stdio.in.h (rename): Declare replacement.
+ * lib/rename.c (includes): Allow cross-compilation to non-windows
+ machines.
+ * doc/posix-functions/rename.texi (rename): Improve
+ documentation.
+
+ stdio: sort witness names
+ * modules/stdio (Makefile.am): Sort replacements.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Likewise.
+ * lib/stdio.in.h: Likewise.
+
+ getcwd: minor cleanups
+ * lib/getcwd.c (AT_FDCWD): Delete; rely on <fcntl.h> instead.
+ (is_ENAMETOOLONG): Delete; ENAMETOOLONG is portable.
+
+ openat: provide more convenience names
+ * modules/faccessat (configure.ac): Add C witness.
+ * lib/unistd.in.h (readlinkat): Fix typo.
+ * lib/openat.h (statat, lstatat, accessat, euidaccessat): New
+ convenience wrappers.
+ * top/maint.mk (sc_prohibit_openat_without_use): Allow these
+ wrappers in syntax checks.
+
+2009-09-06 Eric Blake <ebb9@byu.net>
+
+ doc: fix comments in recent patches
+ * lib/faccessat.c: Mention correct function.
+ * lib/fchmodat.c: Likewise.
+ * lib/fchownat.c: Likewise.
+ * lib/symlinkat.c: Likewise.
+ * doc/posix-headers/fcntl.texi (fcntl.h): Cygwin 1.7 has AT_*
+ constants.
+
+ faccessat, symlinkat: continue cleanup of previous patch
+ * m4/symlinkat.m4 (gl_FUNC_SYMLINKAT): Ensure dependency order.
+ * m4/faccessat.m4 (gl_FUNC_FACCESSAT): Likewise.
+ * modules/unistd (Makefile.am): Substitute GNULIB_READLINKAT.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Offer GNULIB_READLINKAT.
+ * modules/symlinkat (configure.ac): Set GNULIB_READLINKAT.
+ * lib/unistd.in.h (readlinkat): Declare if GNULIB_READLINKAT is
+ set.
+
+2009-09-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_stat.in.h (fchmodat): Declare if GNULIB_FCHMODAT is set.
+ (fstatat): Declare if GNULIB_FSTATAT is set.
+ (mkdirat): Declare if GNULIB_MKDIRAT is set.
+ * lib/unistd.in.h (fchownat): Declare if GNULIB_FCHOWNAT is set.
+ (unlinkat): Declare if GNULIB_UNLINKAT is set.
+ * modules/fcntl-h (Files): Remove m4/openat.m4.
+ * modules/sys_stat (Files): Remove m4/openat.m4.
+ (Makefile.am): Substitute GNULIB_FCHMODAT, GNULIB_FSTATAT,
+ GNULIB_MKDIRAT instead of GNULIB_OPENAT.
+ * modules/unistd (Files): Remove m4/openat.m4.
+ (Makefile.am): Substitute GNULIB_FCHOWNAT, GNULIB_UNLINKAT instead of
+ GNULIB_OPENAT.
+ * m4/fcntl_h.m4 (gl_FCNTL_H_DEFAULTS): Initialize GNULIB_OPENAT,
+ HAVE_OPENAT here. Don't require gl_OPENAT_DEFAULTS.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Initialize
+ GNULIB_FCHMODAT, GNULIB_FSTATAT, GNULIB_MKDIRAT, HAVE_FCHMODAT,
+ HAVE_FSTATAT, HAVE_MKDIRAT, REPLACE_FSTATAT here. Don't require
+ gl_OPENAT_DEFAULTS.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_FCHOWNAT,
+ GNULIB_UNLINKAT, HAVE_FCHOWNAT, HAVE_UNLINKAT, REPLACE_FCHOWNAT here.
+ Don't require gl_OPENAT_DEFAULTS.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Require gl_FCNTL_H_DEFAULTS,
+ gl_SYS_STAT_H_DEFAULTS, gl_UNISTD_H_DEFAULTS. Set GNULIB_FCHMODAT,
+ GNULIB_FSTATAT, GNULIB_MKDIRAT, GNULIB_FCHOWNAT, GNULIB_UNLINKAT.
+ (gl_OPENAT_DEFAULTS): Remove macro.
+
+2009-09-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/openat (configure.ac): Remove unneeded witness.
+
+2009-09-06 Bruno Haible <bruno@clisp.org>
+
+ Set errno to ENOSYS when a function is entirely unsupported.
+ * lib/chown.c (rpl_chown) [!HAVE_CHOWN]: Set errno to ENOSYS instead of
+ EOPNOTSUPP.
+ * lib/lchown.c (lchown) [!HAVE_CHOWN]: Likewise.
+ * modules/chown (Depends-on): Remove errno.
+
+2009-09-06 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/fcntl.texi (AT_*): Mention affected platforms.
+
+2009-09-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_stat.in.h: Fix preprocessor command indentation.
+
+2009-09-06 Ben Pfaff <blp@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Work around a glibc bug in strtok_r.
+ * lib/string.in.h (strtok_r): Replace if REPLACE_STRTOK_R is set.
+ Undefine if UNDEFINE_STRTOK_R is set.
+ * lib/strtok_r.c (strtok_r, __strtok_r) [!_LIBC]: Don't undefine.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize
+ REPLACE_STRTOK_R and UNDEFINE_STRTOK_R.
+ * m4/strtok_r.m4 (gl_FUNC_STRTOK_R): Check against the glibc bug.
+ * modules/string (Makefile.am): Substitute REPLACE_STRTOK_R,
+ UNDEFINE_STRTOK_R.
+ * doc/posix-functions/strtok_r.texi: Mention the glibc 2.7 bug.
+
+2009-09-06 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ exclude: minor fix
+ * lib/exclude.c: Include wctype.h
+
+2009-09-06 Akim Demaille <demaille@gostai.com>
+
+ bootstrap: improve error message
+ * build-aux/bootstrap (find_tool): Upon failure, report the list
+ of candidates.
+ Honor the initial value of the envvar.
+
+2009-09-05 Eric Blake <ebb9@byu.net>
+
+ symlinkat: new module
+ * modules/symlinkat: New file.
+ * lib/symlinkat.c: Likewise.
+ * m4/symlinkat.m4 (gl_FUNC_SYMLINKAT): Likewise.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witnesses.
+ * modules/unistd (Makefile.am): Use them.
+ * lib/unistd.in.h (symlinkat, readlinkat): Declare them.
+ (faccessat) [GNULIB_POSIXCHECK]: Fix typo.
+ * lib/at-func.c (FUNC_RESULT): New macro, defaulting to int.
+ * MODULES.html.sh (File system functions): Mention module.
+ * doc/posix-functions/symlinkat.texi (symlinkat): Likewise.
+ * doc/posix-functions/readlinkat.texi (readlinkat): Likewise.
+ * modules/symlinkat-tests: New test.
+ * tests/test-symlinkat.c: Likewise.
+
+ test-openat-safer: add more checks
+ * tests/test-openat-safer.c (main): Check more code paths.
+
+2009-09-05 Jim Meyering <meyering@redhat.com>
+
+ syntax-check: detect unnecessary inclusion of openat.h
+ * top/maint.mk (sc_prohibit_openat_without_use): New rule.
+
+2009-09-05 Bruno Haible <bruno@clisp.org>
+
+ Support towlower, towupper.
+ * doc/posix-functions/towlower.texi: Mention module wctype.
+ * doc/posix-functions/towupper.texi: Likewise.
+ * lib/wctype.in.h (towlower, towupper): New functions.
+ * tests/test-wctype.c: Include stdio.h, stdlib.h.
+ (ASSERT): New macro.
+ (e): New variable.
+ (main): Test also towlower, towupper. Test WEOF argument.
+ Reported by Alan Hourihane <alanh@fairlite.co.uk>.
+
+2009-09-05 Bruno Haible <bruno@clisp.org>
+
+ Fix conversion behaviour when the input is invalid.
+ * lib/striconveh.c (mem_cd_iconveh_internal): Fix storing of question
+ mark occurring in first pass of indirect conversion.
+ * tests/test-striconveh.c (main): Test conversion of invalid ASCII
+ input.
+ Found by clang's static analyzer.
+
+2009-09-05 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-striconveh.c (main): Test indirect conversion on platforms
+ where direct conversion is possible.
+
+2009-09-04 Eric Blake <ebb9@byu.net>
+
+ openat: fail with ENOENT on empty name
+ * lib/openat-proc.c (openat_proc_name): Special-case the empty
+ buffer.
+
+ link-follow: fix logic bug in prior patch
+ * m4/link-follow.m4 (gl_FUNC_LINK_FOLLOWS_SYMLINK): Fix bug that
+ reversed sense of yes and no in prior patch. Avoid confusing
+ compilation failure with desired semantics.
+
+ link-follow: accomodate mingw and cross-compilation
+ * m4/link-follow.m4 (gl_AC_FUNC_LINK_FOLLOWS_SYMLINK): Rename...
+ (gl_FUNC_LINK_FOLLOWS_SYMLINK): ...to this. Change
+ cross-compilation results to -1, to make linkat easier to
+ implement when cross-compiling. Trivially support mingw.
+ * modules/link-follow (configure.ac): Call new name.
+ * NEWS: Mention this.
+
+2009-09-03 Eric Blake <ebb9@byu.net>
+
+ faccessat: compile replacement
+ * m4/faccessat.m4 (gl_FUNC_FACCESSAT): Build replacement when
+ needed.
+
+ fts: fix compilation error
+ * lib/fts.c (includes): Re-add "openat.h", for
+ openat_needs_fchdir.
+
+ faccessat: new module
+ * modules/faccessat: New file.
+ * lib/faccessat.c: Likewise.
+ * m4/faccessat.m4 (gl_FUNC_FACCESSAT): Likewise.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witness.
+ * modules/unistd (Makefile.am): Use it.
+ * lib/unistd.in.h (faccessat): Declare it.
+ (F_OK, X_OK, W_OK, R_OK): Provide definitions.
+ * lib/fcntl.in.h (AT_SYMLINK_FOLLOW, AT_EACCESS): Likewise.
+ * MODULES.html.sh (File system functions): Mention it.
+ * doc/posix-functions/faccessat.texi (faccessat): Likewise.
+ * doc/posix-headers/fcntl.texi (fcntl.h): Likewise.
+
+ euidaccess: prefer POSIX over non-standard implementation
+ * m4/euidaccess.m4 (gl_PREREQ_EUIDACCESS): Check for faccessat.
+ * lib/euidaccess.c (euidaccess): Use it if available.
+
+ openat: make template easier to use
+ * lib/at-func.c (CALL_FUNC): Allow AT_FUNC_USE_F1_COND and
+ AT_FUNC_F2 to be undefined.
+ (VALIDATE_FLAG): New macro; use it to reject bad flags.
+ (AT_FUNC_USE_F1_COND): Change sense to just flag bit.
+ * lib/fchmodat.c (AT_FUNC_USE_F1_COND): Adjust.
+ * lib/fchownat.c (AT_FUNC_USE_F1_COND): Likewise.
+ * lib/openat.c (AT_FUNC_USE_F1_COND) [fstatat, unlinkat]:
+ Likewise.
+ * lib/mkdirat.c (AT_FUNC_F2, AT_FUNC_USE_F1_COND): Delete.
+ * lib/selinux-at.c (AT_FUNC_F2, AT_FUNC_USE_F1_COND)
+ [getfileconat, lgetfileconat, setfileconat, lsetfileconat]:
+ Likewise.
+
+ openat: declare in POSIX headers
+ * NEWS: Mention this.
+ * modules/openat (configure.ac): Declare witnesses.
+ (Depends-on): Add fcntl-h, sys_stat, unistd.
+ (Include): Mention correct headers.
+ * modules/fcntl-h (Depends-on): Add link-warning.
+ (Files): Add openat.m4.
+ (Makefile.am): Substitute witnesses.
+ * modules/sys_stat (Files, Makefile.am): Likewise.
+ * modules/unistd (Files, Makefile.am): Likewise.
+ * m4/openat.m4 (gl_FUNC_OPENAT, gl_FUNC_FCHOWNAT): Set witnesses.
+ (gl_OPENAT_DEFAULTS): New macro.
+ * m4/fcntl_h.m4 (gl_FCNTL_H_DEFAULTS): Use it.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Likewise.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Likewise.
+ (SYS_STAT_H): Remove unused variable.
+ * doc/posix-headers/fcntl.texi (fcntl.h): Update content.
+ * lib/fcntl--.h (includes): Remove unneeded header.
+ * lib/openat-safer.c (includes): Likewise.
+ * lib/openat.h (AT_FDCWD, AT_SYMLINK_NOFOLLOW, AT_REMOVEDIR)
+ (openat, fstatat, unlinkat, mkdirat, fchmodat, fchownat): Move to
+ appropriate headers.
+ (__OPENAT_PREFIX): Delete.
+ * lib/fcntl.in.h (openat): Provide declaration.
+ (AT_FDCWD): Fix Solaris bug.
+ (AT_SYMLINK_NOFOLLOW, AT_REMOVEDIR): Provide macros.
+ * lib/sys_stat.in.h (fstatat, mkdirat): Provide declaration.
+ * lib/fchmodat.c (includes): Adjust to find declaration.
+ * lib/fchownat.c (includes): Likewise.
+ * lib/mkdirat.c (includes): Likewise.
+ * lib/fstatat.c (includes): Likewise. Ensure original fstatat is
+ still visible.
+
+2009-09-02 Eric Blake <ebb9@byu.net>
+
+ errno: use consistently
+ * lib/c-stack.c (ENOTSUP): <errno.h> guarantees a definition.
+ * lib/canonicalize-lgpl.c (ENAMETOOLONG): Likewise.
+ * lib/canonicalize.c (ELOOP): Likewise.
+ * lib/inet_ntop.c (EAFNOSUPPORT): Likewise.
+ * lib/inet_pton.c (EAFNOSUPPORT): Likewise.
+ * lib/lchown.c (EOPNOTSUPP): Likewise.
+ * lib/openat-priv.h (ENOSYS, EOPNOTSUPP): Likewise.
+ * lib/savewd.c (ESTALE): Likewise.
+ * lib/settime.c (ENOSYS): Likewise.
+ * lib/utimens.c (ENOSYS): Likewise.
+ * lib/xgethostname.c (ENAMETOOLONG): Likewise.
+ * lib/chdir-safer.c (ELOOP): Likewise.
+ (chdir_no_follow): Use HAVE_READLINK, not ELOOP, as witness.
+ * modules/c-stack (Depends-on): Add errno.
+ * modules/canonicalize (Depends-on): Likewise.
+ * modules/chdir-safer (Depends-on): Likewise.
+ * modules/fdopendir (Depends-on): Likewise.
+ * modules/inet_ntop (Depends-on): Likewise.
+ * modules/inet_pton (Depends-on): Likewise.
+ * modules/lchown (Depends-on): Likewise.
+ * modules/openat (Depends-on): Likewise.
+ * modules/savewd (Depends-on): Likewise.
+ * modules/settime (Depends-on): Likewise.
+ * m4/chdir-safer.m4 (gl_CHDIR_SAFER): Check for readlink.
+
+ fts: avoid leaking fds
+ * modules/fts (Depends-on): Add cloexec.
+ * lib/fts.c (opendirat, diropen, fts_build): Set close-on-exec
+ flag.
+
+ fts: make directory fds more robust
+ * lib/fts.c (O_DIRECTORY): Let <fcntl.h> take care of this.
+ (opendirat): Specify O_DIRECTORY, and add fallbacks for safety.
+
+ backupfile, chdir-long, fts, savedir: make safer
+ * lib/backupfile.c (includes): Use "dirent--.h", since
+ numbered_backup can write to stderr during readdir.
+ * lib/savedir.c (includes): Likewise.
+ * lib/chdir-long.c (includes): Use "fcntl--.h", since openat
+ emulation can write to stderr on failure.
+ * lib/fts.c (includes) [!_LIBC]: Likewise for opendir and openat.
+ * lib/getcwd.c: Document why opendir_safer is unused.
+ * lib/glob.c: Likewise.
+ * lib/scandir.c: Likewise.
+ * lib/openat-proc.c: Likewise, for open_safer.
+ * modules/backupfile (Depends-on): Add dirent-safer.
+ * modules/savedir (Depends-on): Likewise.
+ * modules/fts (Depends-on): Add dirent-safer and openat-safer.
+ * modules/chdir-long (Depends-on): Add openat-safer.
+
+ openat-safer: new module
+ * modules/openat-safer: New file.
+ * lib/openat-safer.c: Likewise.
+ * m4/fcntl-safer.m4 (gl_OPENAT_SAFER): New macro.
+ * lib/fcntl-safer.h (openat_safer): Declare.
+ * lib/fcntl--.h (openat): Override.
+ * MODULES.html.sh (File descriptor based I/O): Mention it.
+ * lib/openat.h: Add double-inclusion guards.
+ * lib/openat.c (includes): Only include "fcntl-safer.h", not
+ "fcntl--.h", so we can implement openat.
+ * modules/openat-safer-tests: New test.
+ * tests/test-openat-safer.c: New file.
+
+ dirent-safer: new module
+ * modules/dirent-safer: New file.
+ * lib/dirent--.h: Likewise.
+ * lib/dirent-safer.h: Likewise.
+ * lib/opendir-safer.c: Likewise.
+ * m4/dirent-safer.m4: Likewise.
+ * MODULES.html.sh (Enhancements for POSIX:2008): Mention it.
+ * modules/dirent-safer-tests: New test.
+ * tests/test-dirent-safer.c: New file.
+ * lib/fdopendir.c (includes): Ensure fdopendir is also safe.
+
+ fdopendir: optimize on mingw
+ * lib/unistd.in.h (_gl_directory_name): New prototype.
+ * lib/fchdir.c (_gl_directory_name): Implement it.
+ (fchdir): Use it to simplify implementation.
+ * lib/fdopendir.c (fdopendir) [REPLACE_FCHDIR]: Use metadata from
+ fchdir, when available, to avoid calling [f]chdir().
+
+ fdopendir: split into its own module
+ * lib/openat.c (fdopendir): Move...
+ * lib/fdopendir.c: ...into new file.
+ * modules/fdopendir: New module.
+ * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): New file.
+ * modules/openat (Depends-on): Add fdopendir.
+ * m4/openat.m4 (gl_FUNC_OPENAT): No longer need to check for
+ fdopendir here.
+ * modules/savedir (Depends-on): Only need fdopendir, not full
+ openat.
+ * lib/savedir.c (include): Use <dirent.h>, not "openat.h".
+ * lib/openat.h (fdopendir): Drop prototype.
+ * lib/dirent.in.h (fdopendir): Provide prototype.
+ * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): Add replacements.
+ * modules/dirent (Makefile.am): Substitute them.
+ * MODULES.html.sh (File system functions): Mention it.
+ * doc/posix-functions/fdopendir.texi (fdopendir): Likewise.
+ * modules/fdopendir-tests: New file.
+ * tests/test-fdopendir.c: Likewise.
+
+ fchdir: use more consistent macro convention
+ * lib/fcntl.in.h (_gl_register_fd): Move declaration to unistd.
+ * lib/sys_stat.in.h (rpl_fstat): Declare via make-time
+ REPLACE_FCHDIR, rather than relying on config.h macros.
+ * lib/unistd.in.h (fchdir): Move all fchdir internal declarations
+ inside a single make-time REPLACE_FCHDIR block, rather than using
+ the config.h FCHDIR_REPLACEMENT.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): REPLACE_FCHDIR was already
+ AC_SUBST'd, also AC_DEFINE it. Don't define FCHDIR_REPLACEMENT.
+ Manage fstat replacement.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Pick up
+ REPLACE_FCHDIR.
+ * modules/sys_stat (Files): Add m4/unistd_h.m4.
+ (Makefile.am): Substitute REPLACE_FCHDIR.
+ * lib/close.c (rpl_close): Use REPLACE_FCHDIR, not
+ FCHDIR_REPLACEMENT.
+ * lib/dup-safer.c (dup_safer): Likewise.
+ * lib/dup2.c (rpl_dup2): Likewise.
+ * lib/dup3.c (rpl_dup3): Likewise.
+ * lib/open.c (rpl_open): Likewise.
+
+ fchdir: simplify error handling, and support dup3
+ * modules/fchdir (Depends-on): Use strdup-posix, not strdup. Add
+ stdbool, malloc-posix, realloc-posix.
+ * lib/fchdir.c (struct dir_info_t): Delete saved_errno.
+ (ensure_dirs_slot): Return false on allocation failure.
+ (rpl_dup2): Delete.
+ (_gl_register_dup): New function.
+ (_gl_unregister_fd, rpl_opendir, rpl_dup): Update callers.
+ (_gl_register_fd): Close fd on allocation failure.
+ * lib/fcntl.in.h (_gl_register_fd): Update signature.
+ * lib/unistd.in.h (_gl_register_dup) [FCHDIR_REPLACEMENT]: New
+ prototype.
+ (rpl_dup2_fchdir): Delete prototype.
+ * lib/open.c (open): Update caller.
+ * lib/dup2.c (dup2): Track fchdir metadata.
+ * lib/dup3.c (dup3): Likewise.
+ * m4/dup2.m4 (gl_REPLACE_DUP2): New macro.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Use it.
+
+2009-09-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_create_testdir, func_create_megatestdir): Use
+ AC_CONFIG_HEADERS instead of AM_CONFIG_HEADER. Use AC_CONFIG_FILES and
+ don't pass arguments to AC_OUTPUT.
+
+2009-09-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/mkdtemp (License): Relicense under LGPLv2+.
+ Reported by Paolo Bonzini.
+
+2009-09-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Replace uses of obsolete autoconf macros in Jim's modules.
+ The Autoconf macros AC_TRY_CPP, AC_TRY_COMPILE, AC_TRY_LINK and
+ AC_TRY_RUN have been obsolete since Autoconf 2.55, and each use
+ can evoke a warning from autoconf when run with -Wobsolete
+ enabled. They were declared obsolete for good reasons (see
+ the `AC_FOO_IFELSE vs AC_TRY_FOO' node in the Autoconf manual,
+ recently renamed to `AC_ACT_IFELSE vs AC_TRY_ACT'), and we
+ should not continue using the deprecated macros.
+ * m4/d-type.m4 (gl_CHECK_TYPE_STRUCT_DIRENT_D_TYPE): Replace
+ obsolete Autoconf macros with modern counterparts.
+ * m4/dirfd.m4 (gl_FUNC_DIRFD): Likewise.
+ * m4/dos.m4 (gl_AC_DOS): Likewise.
+ * m4/fpending.m4 (gl_FUNC_FPENDING): Likewise.
+ * m4/fsusage.m4 (gl_FILE_SYSTEM_USAGE): Likewise.
+ * m4/getloadavg.m4 (gl_PREREQ_GETLOADAVG): Likewise.
+ * m4/jm-winsz1.m4 (gl_WINSIZE_IN_PTEM): Likewise.
+ * m4/link-follow.m4 (gl_AC_FUNC_LINK_FOLLOWS_SYMLINK): Likewise.
+ * m4/ls-mntd-fs.m4 (gl_LIST_MOUNTED_FILE_SYSTEMS): Likewise.
+ * m4/mkdir-slash.m4 (gl_FUNC_MKDIR_TRAILING_SLASH): Likewise.
+ * m4/mode_t.m4 (gl_PROMOTED_TYPE_MODE_T): Likewise.
+ * m4/rename-dest-slash.m4 (gl_FUNC_RENAME_TRAILING_DEST_SLASH):
+ Likewise.
+ * m4/rename.m4 (gl_FUNC_RENAME): Likewise.
+ * m4/rmdir-errno.m4 (gl_FUNC_RMDIR_NOTEMPTY): Likewise.
+ * m4/rpmatch.m4 (gl_PREREQ_RPMATCH): Likewise.
+ * m4/st_dm_mode.m4 (AC_STRUCT_ST_DM_MODE): Likewise.
+ * m4/stat-time.m4 (gl_STAT_TIME): Likewise.
+ * m4/utimes-null.m4 (gl_FUNC_UTIMES_NULL): Likewise.
+
+2009-09-01 Eric Blake <ebb9@byu.net>
+
+ fchdir: fix off-by-one bug in previous patch
+ * lib/fchdir.c (rpl_fstat): Use correct bounds.
+ (_gl_unregister_fd): Delete useless if.
+
+2009-09-01 Daniel P. Berrange <berrange@redhat.com>
+
+ maint.mk: sort the list of syntax-check rules
+ * top/maint.mk (syntax-check-rules): Sort syntax-check rules, so it's
+ easier to get a sense of progress when the rules are run sequentially
+ and take a long time.
+
+2009-09-01 Simon Josefsson <simon@josefsson.org>
+
+ * modules/arpa_inet: Use $(MKDIR_P) instead of @MKDIR_P@.
+ * modules/netinet_in: Likewise.
+ * modules/sys_file: Likewise.
+ * modules/sys_ioctl: Likewise.
+ * modules/sys_select: Likewise.
+ * modules/sys_socket: Likewise.
+ * modules/sys_stat: Likewise.
+ * modules/sys_time: Likewise.
+ * modules/sys_times: Likewise.
+ * modules/sys_utsname: Likewise.
+ * modules/sys_wait: Likewise.
+
+2009-09-01 Jim Meyering <meyering@redhat.com>
+
+ fts: help ensure that return values are not ignored
+ * lib/fts_.h (__GNUC_PREREQ): Define.
+ (__attribute_warn_unused_result__): Define.
+ (fts_children, fts_close, fts_open, fts_read): Declare with
+ __attribute_warn_unused_result__.
+
+ fts: fts_close now fails also when closing a dir file descriptor fails
+ * lib/fts.c (fts_close): Detect close failure, not just fchdir failure,
+ and propagate to caller, along with errno.
+
+ announce-gen: correct formatting in --help output
+ * build-aux/announce-gen (usage): Move the one-line description in
+ --help output "up", to where it belongs, just after Usage:.
+
+2009-08-31 Eric Blake <ebb9@byu.net>
+
+ fchdir: port to mingw
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Check for mingw bug.
+ * lib/open.c (open) [FCHDIR_REPLACEMENT]: If directories can't be
+ opened, then use a substitute.
+ * lib/sys_stat.in.h (fstat) [REPLACE_OPEN_DIRECTORY]: Declare
+ replacement.
+ * lib/fchdir.c (fstat) [REPLACE_OPEN_DIRECTORY]: Implement it.
+ (_gl_register_fd): No need to check stat if open already filters
+ all directories.
+ (fchdir): Fix error condition to match POSIX.
+ * modules/fchdir (Depends-on): Add sys_stat.
+ * doc/posix-functions/open.texi (open): Document the limitation.
+ * modules/fchdir-tests: New file.
+ * tests/test-fchdir.c: Likewise.
+
+ canonicalize: allow cross-testing from cygwin to mingw
+ * modules/canonicalize-tests (configure.ac): Define HAVE_SYMLINK.
+ (Makefile.am): Pass it through TESTS_ENVIRONMENT.
+ * modules/canonicalize-lgpl-tests (configure.ac, Makefile.am):
+ Likewise.
+ * tests/test-canonicalize.sh: Also skip test if 'ln -s' works, but
+ target does not support symlinks.
+ * tests/test-canonicalize-lgpl.sh: Likewise.
+
+ chown: avoid compilation warning on mingw
+ * m4/chown.m4 (gl_FUNC_CHOWN): Recognize missing chown.
+ * lib/chown.c (rpl_chown) [!HAVE_CHOWN]: Always return failure on
+ mingw.
+ * lib/lchown.c (lchown) [!HAVE_CHOWN]: Likewise.
+ * modules/chown (Depends-on): Add errno.
+
+2009-08-31 Stefano Lattarini <stefano.lattarini@gmail.com> (tiny change)
+
+ * gnulib-tool: Fix test whether $CONFIG_SHELL has a working 'echo'
+ command.
+
+2009-08-31 Jim Meyering <meyering@redhat.com>
+
+ canonicalize: remove useless initialization
+ * lib/canonicalize.c (canonicalize_filename_mode): Remove useless
+ initialization of local, "end".
+
+2009-08-30 Bruno Haible <bruno@clisp.org>
+
+ Fix an unnecessary error on Solaris 10 on NFSv3 file systems.
+ * lib/set-mode-acl.c (qset_acl) [Solaris 10 new]: Treat EOPNOTSUPP like
+ ENOSYS.
+
+2009-08-30 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-pipe-filter-ii1.sh: Prefer /usr/xpg6/bin/tr over
+ /usr/xpg4/bin/tr when it exists.
+ * tests/test-pipe-filter-gi1.sh: Likewise.
+
+2009-08-30 Bruno Haible <bruno@clisp.org>
+
+ Work around deficient /usr/bin/id program on Solaris.
+ * tests/test-file-has-acl.sh (ID): New variable.
+ * tests/test-set-mode-acl.sh (ID): Likewise.
+ * tests/test-copy-acl.sh (ID): Likewise.
+ * tests/test-copy-file.sh (ID): Likewise.
+
+2009-08-30 Bruno Haible <bruno@clisp.org>
+
+ New module 'xstriconveh'.
+ * lib/xstriconveh.h: New file.
+ * lib/xstriconveh.c: New file.
+ * modules/xstriconveh: New file.
+
+2009-08-30 Bruno Haible <bruno@clisp.org>
+
+ Make it easier to use mem_cd_iconveh.
+ * lib/striconveh.h (iconveh_t): New type.
+ (iconveh_open, iconveh_close): New declarations.
+ (mem_cd_iconveh, str_cd_iconveh): Replace the three iconv_t arguments
+ with a single 'const iconveh_t *' argument.
+ * lib/striconveh.c (iconveh_open, iconveh_close): New functions.
+ (mem_cd_iconveh, str_cd_iconveh): Replace the three iconv_t arguments
+ with a single 'const iconveh_t *' argument.
+ (mem_iconveh, str_iconveh): Use iconveh_open, iconveh_close.
+ * tests/test-striconveh.c (main): Update.
+ * NEWS: Mention the change.
+
+2009-08-30 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/iconv_open.texi: Mention indirect conversion
+ problem.
+
+2009-08-30 Bruno Haible <bruno@clisp.org>
+
+ Work around iconv_open problem on Solaris.
+ * lib/iconv_open-solaris.gperf: New file.
+ * lib/iconv_open.c (ICONV_FLAVOR_SOLARIS): New macro.
+ * m4/iconv_open.m4 (gl_FUNC_ICONV_OPEN): Also handle Solaris.
+ * modules/iconv_open (Files): Add lib/iconv_open-solaris.gperf.
+ (Makefile.am): Add rule for iconv_open-solaris.h. Augment
+ BUILT_SOURCES, MOSTLYCLEANFILES, MAINTAINERCLEANFILES, EXTRA_DIST.
+ * doc/posix-functions/iconv_open.texi: Mention the Solaris problem.
+
+2009-08-29 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: remove more coreutils-specific targets; XZ_OPT=-9ev
+ * top/maint.mk (cvs-check): Remove target; it was just an alias
+ to the better-named vc-diff-check.
+ (maintainer-distcheck): Remove rule. It was used only from
+ the (alpha/beta/major) target, and all of its commands but one
+ were coreutils-specific.
+ (vc-dist): Remove rule.
+ (alpha beta major): Run "$(MAKE) distcheck" explicitly.
+ Run vc-diff-check, not vc-dist.
+ Run $(MAKE) dist with XZ_OPT=-9ev. Note spelling, with "-".
+
+2009-08-27 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-bitrotate.c (main): Remove test that uses a shift count
+ of 0.
+
+2009-08-27 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-func.c (main): Don't verify sizeof __func__ on SunPRO C
+ compilers.
+ * doc/func.texi: Document the SunPRO C bug.
+
+2009-08-27 Bruno Haible <bruno@clisp.org>
+
+ Fix link error on Solaris.
+ * tests/test-parse-duration.c (xstrdup): Remove function.
+
+2009-08-26 Pádraig Brady <P@draigbrady.com>
+
+ ignore-value: handle pointer types, too
+ * lib/ignore-value.h (__attribute__): Remove definition.
+ (ignore_value): Remove use of "__attribute__ ((unused))" in favor
+ of a more concise and more-often effective "(void) i" statement.
+ (ignore_ptr): New function to suppress warnings from functions that
+ return pointers, and to make it explicit that one function doesn't
+ handle all cases.
+
+2009-08-25 Bruno Haible <bruno@clisp.org>
+
+ dup2: work around a Linux bug.
+ * m4/dup2.m4 (gl_FUNC_DUP2): Test for the Linux bug.
+ * lib/dup2.c (rpl_dup2): Correct the return value if it is -EBADF.
+ * doc/posix-functions/dup2.texi: Mention the Linux bug.
+ Reported by Simon Josefsson.
+
+2009-08-25 Jim Meyering <meyering@redhat.com>
+
+ libguestfs uses gnulib
+ * users.txt: Add libguestfs.
+
+2009-08-24 Eric Blake <ebb9@byu.net>
+
+ dup2, pipe2: fix some recent test failures on cygwin 1.5.x
+ * lib/pipe2.c (includes): Add binary-io.h.
+ * lib/dup2.c (rpl_dup2): Correct buggy errno value.
+
+2009-08-24 Bruno Haible <bruno@clisp.org>
+
+ Tolerate declared but missing accept4 syscall.
+ * lib/accept4.c (accept4): Invoke original accept4 function first, if
+ available.
+ * lib/sys_socket.in.h (accept4): If the function is already present,
+ override it.
+ * m4/accept4.m4 (gl_FUNC_ACCEPT4): Remove AC_LIBOBJ invocation.
+ * modules/accept4 (Makefile.am): Compile accept4.c always.
+ Reported by Paolo Bonzini and Eric Blake.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ New module 'accept4'.
+ * lib/sys_socket.in.h (accept4): New declaration.
+ * lib/accept4.c: New file.
+ * m4/accept4.m4: New file.
+ * m4/sys_socket_h.m4 (gl_SYS_SOCKET_H_DEFAULTS): Initialize
+ GNULIB_ACCEPT4, HAVE_ACCEPT4.
+ * modules/sys_socket (Makefile.am): Substitute GNULIB_ACCEPT4,
+ HAVE_ACCEPT4.
+ * modules/accept4: New file.
+ * doc/glibc-functions/accept4.texi: Mention the new module.
+
+2009-08-24 Jim Meyering <meyering@redhat.com>
+
+ progname: also set global program_invocation_name, when possible
+ Before this change, a libtool-enabled program that calls glibc's
+ error function would report the program name as
+ "/abs/dir/.libs/lt-program_name" rather than the desired program_name.
+ * modules/progname (configure.ac): Check for a declaration of
+ program_invocation_name.
+ * lib/progname.c: Include <errno.h>.
+ (set_program_name) [HAVE_DECL_PROGRAM_INVOCATION_NAME]:
+ Set program_invocation_name.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/dup3.c: Include <string.h>.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/dup3.c (dup3): Test only once whether the system actually exists.
+ * lib/pipe2.c (pipe2): Likewise.
+ Suggested by Eric Blake.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ Tolerate declared but missing dup3 syscall.
+ * lib/dup3.c (dup3): Invoke original dup3 function first, if available.
+ * lib/unistd.in.h (dup3): If the function is already present,
+ override it.
+ * m4/dup3.m4 (gl_FUNC_DUP3): Remove AC_LIBOBJ invocation.
+ * modules/dup3 (Makefile.am): Compile dup3.c always.
+ Reported by Paolo Bonzini.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ Tolerate declared but missing pipe2 syscall.
+ * lib/pipe2.c (pipe2): Invoke original pipe2 function first, if
+ available.
+ * lib/unistd.in.h (pipe2): If the function is already present,
+ override it.
+ * m4/pipe2.m4 (gl_FUNC_PIPE2): Remove AC_LIBOBJ invocation.
+ * modules/pipe2 (Makefile.am): Compile pipe2.c always.
+ Reported by Paolo Bonzini.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe2.c (pipe2): Move #ifs inside function.
+
+2009-08-22 Joel E. Denny <jdenny@clemson.edu>
+
+ quotearg: document limitations of quote_these_too
+ * lib/quotearg.c (quotearg_buffer_restyled): Add comments where
+ those limitations are created.
+ * lib/quotearg.h (set_char_quoting): Document that digits and
+ letters that are special after backslash are not permitted.
+ (quotearg_char): Cross-reference set_char_quoting documentation.
+
+2009-08-23 Joel E. Denny <jdenny@clemson.edu>
+
+ quotearg: implement custom_quoting_style
+ * lib/quotearg.c: (struct quoting_options): Add left_quote and
+ right_quote fields.
+ (set_custom_quoting): New public function.
+ (quotearg_buffer_restyled): Add left_quote and right_quote
+ arguments, handle them very much like locale quoting, and update
+ all uses.
+ (quotearg_n_custom): New public function.
+ (quotearg_n_custom_mem): New public function.
+ (quotearg_custom): New public function.
+ (quotearg_custom_mem): New public function.
+ * lib/quotearg.h: Prototype and document new public functions.
+ (enum quoting_style): For escape_quoting_style and
+ clocale_quoting_style, comment that QA_SPLIT_TRIGRAPHS is
+ ignored even though they're otherwise like c_quoting_style.
+ Add custom_quoting_style member and document with comparison to
+ clocale_quoting_style.
+ * tests/test-quotearg.c (custom_quotes): New array.
+ (custom_results): New array.
+ (main): Extend to test custom quoting.
+
+2009-08-22 Joel E. Denny <jdenny@clemson.edu>
+
+ quotearg: fix right quote escaping when it's in quote_these_too
+ * lib/quotearg.c (quotearg_buffer_restyled): Upon seeing a right
+ quote, be sure to prepend only one backslash.
+ * tests/test-quotearg.c (use_quote_double_quotes): New function.
+ (main): Test it.
+
+2009-08-22 Joel E. Denny <jdenny@clemson.edu>
+
+ quotearg-tests: test escaping of embedded locale quotes
+ * tests/test-quotearg.c (struct result_strings): Add member for
+ new input.
+ (LQ_ENC, RQ_ENC, RQ_ESC): New macros.
+ (inputs): Add new input.
+ (results_g): Add expected results.
+ (flag_results): Likewise.
+ (locale_results): Likewise.
+ (compare_strings): Check those.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'dup3'.
+ * modules/dup3-tests: New file.
+ * tests/test-dup3.c: New file.
+
+ New module 'dup3'.
+ * lib/unistd.in.h (dup3): New declaration.
+ * lib/dup3.c: New file.
+ * m4/dup3.m4: New file.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_DUP3 and
+ HAVE_DUP3.
+ * modules/unistd (Makefile.am): Substitute GNULIB_DUP3 and HAVE_DUP3.
+ * modules/dup3: New file.
+ * doc/glibc-functions/dup3.texi: Mention the new module.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ Tweak the dup2 test.
+ * tests/test-dup2.c (main): Create the test file empty. Verify that an
+ out-of-range fd yields EBADF. Verify that after writing to /dev/null,
+ the test file is still empty. Fix argument order of lseek.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ Avoid test link errors when the modules getopt-gnu, gettext are used.
+ * modules/getopt-posix-tests (Makefile.am): Define test_getopt_LDADD.
+ Reported by Tom G. Christensen <tgc@jupiterrise.com>.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ Fix getdtablesize() on mingw.
+ * lib/getdtablesize.c (getdtablesize): Implement differently.
+ * lib/unistd.in.h (getdtablesize): Improve comment.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ New module 'mkostemp'.
+ Based on Ulrich Drepper's 2007-08-10 change in glibc.
+ * lib/stdlib.in.h (mksotemp): New declaration.
+ * lib/mkostemp.c: New file, from glibc with modifications.
+ * lib/tempname.h (GT_FILE): Remove outdated comment.
+ (gen_tempname): Add flags argument.
+ * lib/tempname.c (__GT_BIGFILE): Remove macro.
+ (__GT_FILE): Map to 1.
+ (small_open, large_open): Remove macros.
+ (__gen_tempname): Add flags argument. Remove code for __GT_BIGFILE.
+ * lib/mkstemp.c (mkstemp): Update.
+ * lib/mkdtemp.c (mkdtemp): Likewise.
+ * m4/mkostemp.m4: New file.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_MKOSTEMP,
+ HAVE_MKOSTEMP.
+ * modules/stdlib (Makefile.am): Substitute GNULIB_MKOSTEMP,
+ HAVE_MKOSTEMP.
+ * modules/mkostemp: New file, based on modules/mkstemp.
+ * doc/glibc-functions/mkostemp.texi: Mention the new module.
+ * NEWS: Mention the change.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe2.c (pipe2): Support O_TEXT, O_BINARY on all platforms.
+ Reported by Eric Blake.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe2.c (pipe2): Fix test of fcntl's return value.
+ Reported by Eric Blake.
+
+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ * modules/fchdir (Depends-on): Use fcntl-h instead of fcntl.
+ * modules/pipe2 (Depends-on): Likewise.
+
+2009-08-23 Eric Blake <ebb9@byu.net>
+
+ fcntl-h: add O_TTY_INIT support
+ * lib/fcntl.in.h (O_TTY_INIT): Support another POSIX macro.
+ * tests/test-fcntl-h.c (o): Test it.
+ * doc/posix-headers/fcntl.texi (fcntl.h): Update documentation.
+
+ fcntl-h: rename from fcntl, in preparation for fcntl(2)
+ * modules/fcntl: Move <fcntl.h> header replacement...
+ * modules/fcntl-h: ...to new name, so as not to collide with
+ like-named function.
+ * tests/test-fcntl.c: Rename...
+ * tests/test-fcntl-h.c: ...to this. Test FD_CLOEXEC.
+ * modules/fcntl-tests: Rename...
+ * modules/fcntl-h-tests: ...to this. Update test file name.
+ * modules/chdir-long (Depends-on): Update clients.
+ * modules/chdir-safer (Depends-on): Likewise.
+ * modules/fcntl-safer (Depends-on): Likewise.
+ * modules/fts (Depends-on): Likewise.
+ * modules/mkancesdirs (Depends-on): Likewise.
+ * modules/mkdir-p (Depends-on): Likewise.
+ * modules/open (Depends-on): Likewise.
+ * modules/savewd (Depends-on): Likewise.
+ * MODULES.html.sh (systems lacking POSIX:2008): Update name.
+ * doc/posix-headers/fcntl.texi (fcntl.h): Update documentation.
+
+2009-08-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/binary-io (License): Relicense under LGPL.
+ * modules/pipe2 (License): Likewise.
+
+2009-08-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe-filter-ii.c (pipe_filter_ii_execute): Fix test of fcntl's
+ return value.
+ * lib/pipe-filter-gi.c (filter_init): Likewise.
+ Reported by Eric Blake.
+
+2009-08-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe.c (create_pipe): Use pipe2 instead of _pipe.
+ * modules/pipe (Depends-on): Add pipe2.
+
+2009-08-22 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'pipe2'.
+ * modules/pipe2-tests: New file.
+ * tests/test-pipe2.c: New file.
+
+ New module 'pipe2'.
+ * lib/unistd.in.h (pipe2): New declaration.
+ * lib/pipe2.c: New file.
+ * m4/pipe2.m4: New file.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_PIPE2 and
+ HAVE_PIPE2.
+ * modules/unistd (Makefile.am): Substitute GNULIB_PIPE2 and HAVE_PIPE2.
+ * modules/pipe2: New file.
+ * doc/glibc-functions/pipe2.texi: Mention the new module.
+
+2009-08-22 Bruno Haible <bruno@clisp.org>
+
+ Reference some new glibc functions.
+ * doc/glibc-functions/accept4.texi: New file.
+ * doc/glibc-functions/dup3.texi: New file.
+ * doc/glibc-functions/mkostemp.texi: New file.
+ * doc/glibc-functions/pipe2.texi: New file.
+ * doc/gnulib.texi (Glibc stdlib.h): Refer to mkostemp.
+ (Glibc sys/socket.h): Refer to accept4.
+ (Glibc unistd.h): Refer to dup3, pipe2.
+ Reported by Eric Blake.
+
+2009-08-22 Jim Meyering <meyering@redhat.com>
+ Bruno Haible <bruno@clisp.org>
+
+ annotate automake snippets with $(AM_V_GEN) and $(AM_V_at)
+ This makes it so packages using automake-1.11's silent-rules option
+ can print e.g., a single "GEN configmake.h" line, rather than
+ the 30+ statements that perform the job. If you want to see the
+ actual commands, you can still run "make V=1".
+ * modules/alloca-opt: Add $(AM_V_GEN) and $(AM_V_at) prefixes
+ so that make output is abbreviated when those variables are defined
+ appropriately.
+ * modules/argz: Likewise.
+ * modules/arpa_inet: Likewise.
+ * modules/byteswap: Likewise.
+ * modules/configmake: Likewise.
+ * modules/dirent: Likewise.
+ * modules/errno: Likewise.
+ * modules/fcntl: Likewise.
+ * modules/float: Likewise.
+ * modules/fnmatch: Likewise.
+ * modules/getopt-posix: Likewise.
+ * modules/glob: Likewise.
+ * modules/iconv_open: Likewise.
+ * modules/inttypes: Likewise.
+ * modules/localcharset: Likewise.
+ * modules/locale: Likewise.
+ * modules/math: Likewise.
+ * modules/netdb: Likewise.
+ * modules/netinet_in: Likewise.
+ * modules/poll: Likewise.
+ * modules/posix_spawnp-tests: Likewise.
+ * modules/sched: Likewise.
+ * modules/search: Likewise.
+ * modules/selinux-h: Likewise.
+ * modules/signal: Likewise.
+ * modules/spawn: Likewise.
+ * modules/stdarg: Likewise.
+ * modules/stdbool: Likewise.
+ * modules/stddef: Likewise.
+ * modules/stdint: Likewise.
+ * modules/stdio: Likewise.
+ * modules/stdlib: Likewise.
+ * modules/string: Likewise.
+ * modules/strings: Likewise.
+ * modules/sys_file: Likewise.
+ * modules/sys_ioctl: Likewise.
+ * modules/sys_select: Likewise.
+ * modules/sys_socket: Likewise.
+ * modules/sys_stat: Likewise.
+ * modules/sys_time: Likewise.
+ * modules/sys_times: Likewise.
+ * modules/sys_utsname: Likewise.
+ * modules/sys_wait: Likewise.
+ * modules/sysexits: Likewise.
+ * modules/time: Likewise.
+ * modules/unistd: Likewise.
+ * modules/wchar: Likewise.
+ * modules/wctype: Likewise.
+
+2009-08-22 Jim Meyering <meyering@redhat.com>
+
+ announce-gen: detect write failure
+ * build-aux/announce-gen: Add Coda at end.
+ Remove equivalent-but-more-verbose block at top.
+
+2009-08-19 Akim Demaille <demaille@gostai.com>
+
+ bootstrap: --help to stdout.
+ * bootstrap (usage): Don't send --help to stderr.
+ Use a here doc instead of a long string.
+
+2009-08-21 Eric Blake <ebb9@byu.net>
+
+ test-popen-safer: split from test-popen
+ * tests/test-popen.c (main): Move...
+ * tests/test-popen.h: ...into new file.
+ * tests/test-popen-safer2.c: New file.
+ * modules/popen-tests (Files): Add test-popen.h.
+ * modules/popen-safer-tests (Files): Add test-popen-safer2.c.
+ Suggested by Bruno Haible.
+
+ test-fcntl-safer: split from test-open
+ * tests/test-open.c (main): Move...
+ * tests/test-open.h: ...into new file.
+ * tests/test-fcntl-safer.c: New file.
+ * modules/open-tests (Files): Add test-open.h.
+ * modules/fcntl-safer-tests: New file.
+ Suggested by Bruno Haible.
+
+ test-fopen-safer: split from test-fopen
+ * tests/test-fopen.c (main): Move...
+ * tests/test-fopen.h: ...into new file.
+ * tests/test-fopen-safer.c: New file.
+ * modules/fopen-tests (Files): Add test-fopen.h.
+ * modules/fopen-safer-tests: New file.
+ Suggested by Bruno Haible.
+
+2009-08-21 Paolo Bonzini <bonzini@gnu.org>
+
+ popen-safer: test O_CLOEXEC at run-time.
+ * lib/popen-safer.c: Test O_CLOEXEC at run-time.
+
+2009-08-21 Paolo Bonzini <bonzini@gnu.org>
+
+ fcntl: move more flags to the header
+ * lib/cloexec.c: Do not define FD_CLOEXEC here.
+ * lib/popen-safer.c: Do not alias O_NOINHERIT to O_CLOEXEC here.
+ * lib/fcntl.in.h: Do both things here.
+
+2009-08-21 Jim Meyering <meyering@redhat.com>
+
+ consistently remove $@-t before redirecting to it
+ * modules/argz: Remove $@-t and $@ before redirecting to the former.
+ * modules/alloca-opt: Likewise.
+ * modules/byteswap: Likewise.
+ * modules/fnmatch: Likewise.
+ * modules/getopt-posix: Likewise.
+ * modules/glob: Likewise.
+ * modules/poll: Likewise.
+ * modules/posix_spawnp-tests: Likewise.
+ * modules/sys_socket: Likewise.
+ * modules/sysexits: Likewise.
+
+2009-08-21 Eric Blake <ebb9@byu.net>
+
+ popen: simplify access to original popen
+ * lib/popen.c (rpl_popen): No need to worry about popen being a
+ macro.
+ Reported by Bruno Haible.
+
+2009-08-20 Eric Blake <ebb9@byu.net>
+
+ build: avoid some compiler warnings
+ * lib/selinux-at.h: Use dir_fd, not dirfd, to avoid shadowing.
+ * lib/exclude.c (fnmatch_pattern_has_wildcards): Use correct
+ type.
+ (new_exclude_segment, excluded_file_pattern_p)
+ (excluded_file_name_p): Reduce scope.
+ * lib/vasnprintf.c (decimal_point_char): Avoid warning on
+ old-style declaration.
+
+2009-08-20 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-exclude1.sh: Handle Windows EOL.
+ * tests/test-exclude2.sh: Likewise.
+ * tests/test-exclude3.sh: Likewise.
+ * tests/test-exclude4.sh: Likewise.
+ * tests/test-exclude5.sh: Likewise.
+ * tests/test-exclude6.sh: Likewise.
+ * tests/test-exclude7.sh: Likewise.
+
+2009-08-19 Akim Demaille <demaille@gostai.com>
+
+ bootstrap: find sha1sum when named gsha1sum.
+ * bootstrap (find_tool): New.
+ ($SHA1SUM): New.
+ Use it.
+
+2009-08-20 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: _header_without_use: fix a quoting bug and remove a bash'ism
+ * top/maint.mk (_header_without_use): Use "\\\\", not "\\" in the sed
+ expression that converts "." in a file name to "\." in the resulting
+ regexp. Start with a dummy statement, so that prior shell variable
+ definitions are expanded portably. Reported by Simon Josefsson.
+
+2009-08-20 Paolo Bonzini <bonzini@gnu.org>
+
+ Fix polling for writeability of a screen buffer.
+ * lib/poll.c: Distinguish input and screen buffers for the
+ Win32 implementation.
+ * lib/select.c: Likewise.
+
+2009-08-19 Eric Blake <ebb9@byu.net>
+
+ popen-safer: prevent popen from clobbering std descriptors
+ * modules/popen-safer: New file.
+ * lib/popen-safer.c: Likewise.
+ * m4/stdio-safer.m4 (gl_POPEN_SAFER): New macro.
+ * lib/stdio--.h (popen): Provide override.
+ * lib/stdio-safer.h (popen_safer): Provide declaration.
+ * tests/test-popen.c (includes): Partially test this.
+ * modules/popen-safer-tests: New file, for more tests.
+ * tests/test-popen-safer.c: Likewise.
+ * MODULES.html.sh (file stream based Input/Output): Mention it.
+
+ tests: test some of the *-safer modules
+ * modules/fopen-safer (Depends-on): Add fopen.
+ * modules/fcntl-safer (Depends-on): Add fcntl.
+ * modules/stdlib-safer (Depends-on): Add stdlib.
+ (configure.ac): Set indicator.
+ * modules/unistd-safer (configure.ac): Likewise.
+ * modules/tmpfile-safer (configure.ac): Likewise.
+ (Depends-on): Add tmpfile.
+ * lib/stdio--.h (fopen, tmpfile): Don't override unless module is
+ active.
+ * tests/test-fopen.c (includes): Test safer versions when they are
+ in use.
+ * tests/test-open.c (includes): Likewise.
+
+ popen: fix cygwin 1.5 bug when stdin closed
+ * doc/posix-functions/popen.texi (popen): Document cygwin bugs.
+ * modules/popen: New file.
+ * modules/popen-tests: Likewise.
+ * tests/test-popen.c: Likewise.
+ * m4/popen.m4: Likewise.
+ * lib/popen.c: Likewise.
+ * lib/stdio.in.h (popen): New declaration.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Add popen.
+ * modules/stdio (Makefile.am): Likewise.
+ * MODULES.html.sh (systems lacking POSIX:2008): Mention it.
+
+2009-08-17 Joel E. Denny <jdenny@clemson.edu>
+
+ maint.mk: give full control over update-copyright exclusions
+ * top/maint.mk (VC_LIST_EXCEPT): Instead of ChangeLog, use
+ ${VC_LIST_EXCEPT_DEFAULT-ChangeLog} as the default exclusion.
+ (update-copyright): Don't force inclusion of top-level
+ ChangeLog. Don't force exclusion of all COPYING files, but make
+ them the default exclusion instead.
+
+2009-08-16 Bruno Haible <bruno@clisp.org>
+
+ Fix test failures on Solaris 10.
+ * tests/uniconv/test-u8-conv-from-enc.c (main): Disable autodetect_jp
+ tests when Solaris iconv() is used.
+ * tests/uniconv/test-u16-conv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u32-conv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u8-strconv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u16-strconv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u32-strconv-from-enc.c (main): Likewise.
+
+2009-08-16 Bruno Haible <bruno@clisp.org>
+
+ Fix test failures on Solaris 10.
+ * tests/test-pipe-filter-ii1.sh: Determine the filename of a working
+ 'tr' program and pass it as first argument.
+ * tests/test-pipe-filter-gi1.sh: Likewise.
+ * tests/test-pipe-filter-ii1.c (main): Except the filename of a 'tr'
+ program as first argument.
+ * tests/test-pipe-filter-gi1.c (main): Likewise.
+
+2009-08-16 Eric Blake <ebb9@byu.net>
+
+ fpurge: fix previous commits
+ * modules/fpurge (Makefile.am): Make replacement conditional,
+ partially reverting 2007-04-29 change; missed in previous
+ attempt.
+ * m4/fpurge.m4 (gl_FUNC_FPURGE): Also compile fpurge.c when fpurge
+ is missing.
+
+2009-08-16 Bruno Haible <bruno@clisp.org>
+
+ Clarify fpurge's effect on the file position.
+ * lib/stdio.in.h (fpurge): Specify the file position after fpurge.
+ * tests/test-fpurge.c (main): Make a second pass for checking the file
+ position.
+
+2009-08-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/fpurge.m4 (gl_FUNC_FPURGE): Don't compile fpurge.c if only the
+ declaration of fpurge is missing.
+ * tests/test-fpurge.c (main): Check that the file has not more contents
+ than expected. Close the file before removing it.
+
+2009-08-15 Eric Blake <ebb9@byu.net>
+
+ fpurge: don't wrap working cygwin implementation
+ * lib/fpurge.c (fpurge): Fix comment typo.
+ * m4/fpurge.m4 (gl_FUNC_FPURGE): Detect BSD bug, allowing cygwin
+ 1.7 to avoid replacement.
+ * tests/test-fpurge.c (main): Enhance test.
+
+2009-08-15 Eric Blake <ebb9@byu.net>
+ and Jim Meyering <meyering@redhat.com>
+
+ test-update-copyright: skip if perl is insufficient
+ * tests/test-update-copyright.sh: Failure to run maintainer tool
+ should not cause testsuite failure on cygwin 1.5.
+
+2009-08-14 Eric Blake <ebb9@byu.net>
+
+ doc: mention more functions added in cygwin 1.7.0
+ * doc/posix-headers/limits.texi (limits.h): Update for recent
+ cygwin additions.
+ * doc/posix-headers/wordexp.texi (wordexp.h): Likewise.
+ * doc/posix-functions/wordexp.texi (wordexp): Likewise.
+ * doc/posix-functions/wordfree.texi (wordfree): Likewise.
+ * doc/posix-functions/setlocale.texi (setlocale): Likewise.
+ * doc/posix-functions/nl_langinfo.texi (nl_langinfo): Likewise.
+
+2009-08-14 Eric Blake <ebb9@byu.net>
+
+ maint.mk: simplify update-copyright rule
+ * top/maint.mk (update-copyright-local): Delete, and document how
+ to do it in cfg.mk instead.
+ (update-copyright-exclude-regexp): Delete, and document how to do
+ it in .x-update-copyright instead.
+ (update-copyright): Simplify, thanks to VC_LIST_EXCEPT. Don't
+ exclude ChangeLog.
+
+2009-08-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/wchar.m4 (gl_WCHAR_H): Undo invalid optimization in last commit.
+
+2009-08-14 Joel E. Denny <jdenny@clemson.edu>
+
+ maint.mk: support update-copyright-env
+ * top/maint.mk (update-copyright-env): Define place-holder.
+ (update-copyright): Expand $(update-copyright-env) before
+ invoking update-copyright.
+
+2009-08-14 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: implement forced reformatting
+ * build-aux/update-copyright: Implement and document
+ UPDATE_COPYRIGHT_FORCE.
+ * tests/test-update-copyright.sh: Test it.
+
+2009-08-14 Eric Blake <ebb9@byu.net>
+ and Bruno Haible <bruno@clisp.org>
+
+ stddef: fix NetBSD 5.0 NULL bug, rather than working around it
+ * tests/test-locale.c: Revert previous patch related to NULL.
+ * tests/test-stdio.c: Likewise.
+ * tests/test-stdlib.c: Likewise.
+ * tests/test-string.c: Likewise.
+ * tests/test-unistd.c: Likewise.
+ * modules/time-tests (Depends-on): Add verify.
+ * modules/wchar-tests (Depends-on): Likewise.
+ * tests/test-time.c: Test for NULL compliance.
+ * tests/test-wchar.c: Likewise.
+ * modules/locale (Depends-on): Add stddef.
+ * modules/stdio (Depends-on): Likewise.
+ * modules/stdlib (Depends-on): Likewise.
+ * modules/string (Depends-on): Likewise.
+ * modules/time (Depends-on): Likewise.
+ * modules/unistd (Depends-on): Likewise.
+ * modules/wchar (Depends-on): Likewise.
+ * lib/locale.in.h (includes): Use <stddef.h> to fix NULL.
+ * lib/stdlib.in.h (includes): Likewise.
+ * lib/string.in.h (includes): Likewise.
+ * lib/time.in.h (includes): Likewise.
+ * lib/unistd.in.h (includes): Likewise.
+ * m4/locale_h.m4 (gl_LOCALE_H): Replace locale.h if stddef.h was
+ replaced.
+ * m4/wchar.m4 (gl_WCHAR_H): Likewise.
+ * m4/stddef_h.m4: New file.
+ * modules/stddef: Likewise.
+ * lib/stddef.in.h: Likewise.
+ * modules/stddef-tests: Likewise.
+ * tests/test-stddef.c: Likewise.
+ * MODULES.html.sh (Basic types <stddef.h>): Mention new module.
+ * doc/posix-headers/stddef.texi (stddef.h): Document the bug.
+ * doc/posix-headers/locale.texi (locale.h): Likewise.
+ * doc/posix-headers/stdio.texi (stdio.h): Likewise.
+ * doc/posix-headers/stdlib.texi (stdlib.h): Likewise.
+ * doc/posix-headers/string.texi (string.h): Likewise.
+ * doc/posix-headers/time.texi (time.h): Likewise.
+ * doc/posix-headers/unistd.texi (unistd.h): Likewise.
+ * doc/posix-headers/wchar.texi (wchar.h): Likewise.
+
+2009-08-14 Eric Blake <ebb9@byu.net>
+
+ doc: improve git diff of texinfo files
+ * .gitattributes: Add rule for *.texi files, with hint on how to
+ use it.
+ Copied from m4, and based on a report by Bruno Haible.
+
+2009-08-14 Bruno Haible <bruno@clisp.org>
+
+ Disable multithread support by default on Cygwin 1.5.x for real.
+ * m4/threadlib.m4 (gl_THREADLIB_EARLY_BODY): Fix last commit.
+
+2009-08-14 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: much ado about intervals
+ * build-aux/update-copyright: Implement and document
+ UPDATE_COPYRIGHT_USE_INTERVALS to control expansion and collapse
+ of copyright year intervals.
+ Also, document UPDATE_COPYRIGHT_YEAR.
+ * tests/test-update-copyright.sh: Test it.
+
+ update-copyright: convert 2-digit to 4-digit years
+ * build-aux/update-copyright: Implement and document.
+ * tests/test-update-copyright.sh: Update.
+
+2009-08-14 Jim Meyering <meyering@redhat.com>
+
+ test-exclude: avoid coreutils "make check" failure
+ * tests/test-exclude.c (ARGMATCH_DIE_DECL) [ARGMATCH_DIE_DECL]: Define,
+ just as in test-argmatch.c.
+
+2009-08-13 Eric Blake <ebb9@byu.net>
+
+ test-dup2: fix bad assumption
+ * tests/test-dup2.c (main): Tolerate leaked fds from environment.
+ Reported by Peter Breitenlohner <peb@mppmu.mpg.de>.
+
+ test-version-etc: fix CRLF portability issue
+ * tests/test-version-etc.sh: Use tr, not sed, as not all sed
+ recognize \r.
+ * tests/test-argp-version-etc-1.sh: Likewise.
+
+ getopt: update client modules
+ * modules/argp (Depends-on): Use getopt-gnu.
+ * modules/git-merge-changelog (Depends-on): Likewise.
+ * modules/long-options (Depends-on): Likewise.
+ * modules/xstrtol (Depends-on): Likewise.
+
+2009-08-13 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-version-etc.sh: Don't fail on different
+ project/version. Don't fail on CRLF differences. Rewrite to use
+ multiple -e instead of multiple sed forks, suggested by Eric Blake
+ <ebb9@byu.net>.
+ * tests/test-argp-version-etc-1.sh: Likewise.
+
+2009-08-13 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-version-etc.sh: Don't fail on different
+ project/version.
+
+2009-08-12 Bruno Haible <bruno@clisp.org>
+
+ Tests for modules 'getopt-posix', 'getopt-gnu'.
+ * modules/getopt-posix-tests: New file.
+ * tests/test-getopt.c: New file.
+ * tests/test-getopt.h: New file.
+ * tests/test-getopt_long.h: New file.
+
+ New modules 'getopt-posix', 'getopt-gnu'.
+ * modules/getopt-gnu: New file, renamed from modules/getopt.
+ * modules/getopt-posix: New file.
+ * modules/getopt: Turn into an obsolete alias for getopt-gnu.
+ * m4/getopt.m4 (gl_FUNC_GETOPT_POSIX, gl_FUNC_GETOPT_GNU): New macros.
+ (gl_GETOPT): Remove macro.
+ (gl_GETOPT_CHECK_HEADERS): Do some checks only for gl_FUNC_GETOPT_GNU.
+ Disable the test against BSD systems that declare optreset. Test
+ against mingw bug. Test against lack of support of optional arguments
+ on many platforms.
+ * doc/glibc-headers/getopt.texi: Update module name and list of
+ relevant platforms.
+ * doc/posix-functions/getopt.texi: Mention modules 'getopt-posix' and
+ 'getopt-gnu' and more portability problems.
+ * NEWS: Mention the changes.
+
+2009-08-12 Bruno Haible <bruno@clisp.org>
+
+ Ensure that optarg etc. get declared by <unistd.h>.
+ * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS): Require
+ AC_USE_SYSTEM_EXTENSIONS.
+ * modules/getopt (Depends-on): Add 'extensions'.
+
+2009-08-12 Bruno Haible <bruno@clisp.org>
+
+ Avoid test link errors.
+ * modules/pipe-filter-ii-tests (Makefile.am): Define
+ test_pipe_filter_ii1_LDADD and test_pipe_filter_ii2_main_LDADD.
+ * modules/pipe-filter-gi-tests (Makefile.am): Define
+ test_pipe_filter_gi1_LDADD and test_pipe_filter_gi2_main_LDADD.
+ Reported by Tom G. Christensen <tgc@jupiterrise.com>.
+
+2009-08-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/getopt.m4 (gl_REPLACE_GETOPT): New macro, was called
+ gl_GETOPT_SUBSTITUTE before.
+ (gl_GETOPT): Use it.
+ * m4/argp.m4 (gl_ARGP): Update.
+ Reported by Sergey Poznyakoff.
+
+ * m4/getopt.m4: Reorder macros.
+ (gl_GETOPT): Inline gl_GETOPT_SUBSTITUTE.
+ (gl_GETOPT_SUBSTITUTE): Remove macro.
+
+2009-08-12 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Minor improvement in gitlog-to-changelog
+
+ * build-aux/gitlog-to-changelog: New option `--format' makes
+ output format string configurable.
+
+2009-08-12 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Optimize exclude: use hash tables for non-wildcard patterns.
+
+ * lib/exclude.c: Include hash.h and mbuiter.h
+ (struct exclude_pattern, exclude_segment): New data types.
+ (struct exclude): Rewrite.
+ (fnmatch_pattern_has_wildcards): New function.
+ (new_exclude_segment, free_exclude_segment): New functions.
+ (excluded_file_pattern_p, excluded_file_name_p): New functions.
+ (excluded_file_name, add_exclude): Rewrite using new struct exclude.
+ * lib/exclude.h (is_fnmatch_pattern): New prototype.
+ * modules/exclude: Depend on hash and mbuiter.
+
+ * modules/exclude-tests: New file.
+ * tests/test-exclude.c: New file.
+ * tests/test-exclude1.sh: New file.
+ * tests/test-exclude2.sh: New file.
+ * tests/test-exclude3.sh: New file.
+ * tests/test-exclude4.sh: New file.
+ * tests/test-exclude5.sh: New file.
+ * tests/test-exclude6.sh: New file.
+ * tests/test-exclude7.sh: New file.
+
+2009-08-12 Bruno Haible <bruno@clisp.org>
+
+ Ensure that getopt() gets declared by <unistd.h>.
+ * lib/unistd.in.h: Conditionally include getopt.h.
+ * m4/getopt.m4 (gl_GETOPT_SUBSTITUTE): Require gl_UNISTD_H_DEFAULTS.
+ Set GNULIB_UNISTD_H_GETOPT.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
+ GNULIB_UNISTD_H_GETOPT.
+ * modules/unistd (Makefile.am): Substitute GNULIB_UNISTD_H_GETOPT.
+
+2009-08-12 Bruno Haible <bruno@clisp.org>
+
+ Clarify logic.
+ * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS, gl_GETOPT_IFELSE): Use
+ gl_replace_getopt instead of GETOPT_H.
+
+2009-08-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/getopt.m4: Add comments.
+
+2009-08-12 Bruno Haible <bruno@clisp.org>
+
+ Disable multithread support by default on Cygwin 1.5.x.
+ * m4/threadlib.m4 (gl_THREADLIB_EARLY_BODY): On Cygwin 1.5.x and older,
+ set gl_use_threads=no if not specified otherwise.
+
+2009-08-11 Bruno Haible <bruno@clisp.org>
+
+ Avoid compilation error on NetBSD 5.0.
+ * tests/test-locale.c: Write sizeof (NULL) instead of sizeof NULL.
+ * tests/test-stdio.c: Likewise.
+ * tests/test-stdlib.c: Likewise.
+ * tests/test-string.c: Likewise.
+ * tests/test-unistd.c: Likewise.
+ Reported by Greg Troxel <gdt@ir.bbn.com>
+ at <https://savannah.gnu.org/support/?106973>.
+
+2009-08-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/dup2-tests (Depends-on): Remove close.
+
+ Undo 2009-07-19 commit.
+ * modules/acl-tests (Depends-on): Remove close.
+ * modules/binary-io-tests (Depends-on): Likewise.
+ * modules/closein-tests (Depends-on): Likewise.
+ * modules/flock-tests (Depends-on): Likewise.
+ * modules/fsync-tests (Depends-on): Likewise.
+ * modules/lseek-tests (Depends-on): Likewise.
+ * modules/pipe-tests (Depends-on): Likewise.
+ * modules/posix_spawn-tests (Depends-on): Likewise.
+ * modules/posix_spawnp-tests (Depends-on): Likewise.
+ * modules/stat-time-tests (Depends-on): Likewise.
+ * modules/yesno-tests (Depends-on): Likewise.
+
+2009-08-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (DCHAR_SET): Undefine at the end.
+
+2009-08-10 Bruno Haible <bruno@clisp.org>
+
+ Fix a gcc warning.
+ * lib/write.c (rpl_write): Cast result of _get_osfhandle.
+
+2009-08-10 Bruno Haible <bruno@clisp.org>
+
+ Don't optimize AC_LIBOBJs, as they may appear in different contexts.
+ * m4/close.m4 (gl_REPLACE_CLOSE): Execute AC_LIBOBJ unconditionally,
+ not only the first time.
+ * m4/fclose.m4 (gl_REPLACE_FCLOSE): Likewise.
+ * m4/open.m4 (gl_REPLACE_OPEN): Likewise.
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Execute AC_LIBOBJ when REPLACE_STRSTR
+ is 1, not only the the first time.
+
+2009-08-10 Bruno Haible <bruno@clisp.org>
+
+ Make it possible to use module 'gethostname' without module 'close'.
+ * lib/unistd.in.h (close): Evoke a link error only if
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS is set.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS.
+ * modules/unistd (Makefile.am): Substitute
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS.
+ * lib/sys_ioctl.in.h (ioctl): Evoke a link error only if
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS is set.
+ * m4/sys_ioctl_h.m4 (gl_SYS_IOCTL_H_DEFAULTS): Initialize
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS.
+ * modules/sys_ioctl (Makefile.am): Substitute
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS.
+ * modules/socket (configure.ac): On native Windows, set
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS and
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS.
+ Reported by Sam Steingold <sds@gnu.org>.
+
+2009-08-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/close.m4 (gl_FUNC_CLOSE): Add comment.
+ * modules/ioctl (configure.ac): Likewise.
+
+2009-08-10 Bruno Haible <bruno@clisp.org>
+
+ Avoid collision between gnulib wrapper and libintl wrapper.
+ * lib/stdio-write.c (printf): Don't define if a printf wrapper is
+ already defined in intl/printf.c.
+ (vprintf): Test REPLACE_VPRINTF_POSIX, not REPLACE_VFPRINTF_POSIX.
+ (vfprintf): Test REPLACE_VFPRINTF_POSIX, not REPLACE_VPRINTF_POSIX.
+
+2009-08-09 Bruno Haible <bruno@clisp.org>
+
+ Make <sys/select.h> really self-contained, also on Solaris 10.
+ * lib/sys_select.in.h: Include <string.h>.
+ * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Test also against
+ Solaris 10 problem.
+ * tests/test-sys_select.c (main): Add check that FD_ZERO can be used.
+ * doc/posix-headers/sys_select.texi: Mention the Solaris 10 problem.
+ Reported by Jim Meyering.
+
+2009-08-09 Bruno Haible <bruno@clisp.org>
+
+ Avoid warnings from 'aclocal' that are due to a use of macro name
+ AM_XGETTEXT_OPTION that is not defined in automake.
+ * modules/argp (configure.ac): Hide use of AM_XGETTEXT_OPTION from
+ automake.
+ * modules/error (configure.ac): Likewise.
+ * modules/propername (configure.ac): Likewise.
+ * modules/vasprintf (configure.ac): Likewise.
+ * modules/verror (configure.ac): Likewise.
+ * modules/xprintf (configure.ac): Likewise.
+ * modules/xvasprintf (configure.ac): Likewise.
+
+2009-08-08 Bruno Haible <bruno@clisp.org>
+
+ Avoid compilation error in C++ mode.
+ * lib/gettimeofday.c (rpl_gettimeofday): Cast timezone argument.
+ Reported by Sam Steingold <sds@gnu.org>.
+
+2009-08-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/gethostname.m4 (gl_FUNC_GETHOSTNAME): Define HOST_NAME_MAX also
+ for the various Unix platforms.
+ * doc/posix-headers/limits.texi: Update platforms list regarding
+ HOST_NAME_MAX.
+ Reported by Tom G. Christensen <tgc@jupiterrise.com>.
+
+2009-08-07 Jim Meyering <meyering@redhat.com>
+
+ selinux-at: fix typo in a comment
+ * lib/selinux-at.h: s/getfileconat/getfilecon/ in a comment.
+ Spotted by Paolo Bonzini.
+
+ selinux-at: remove redundant m4 code, add documentation
+ * modules/selinux-at (configure.ac): Remove redundant code.
+ LIB_SELINUX is already set via the dependent module, selinux-h.
+ (Include): Add quotes around selinux-at.h.
+ * lib/selinux-at.h: Add documentation.
+ Reported by Bruno Haible in
+ http://marc.info/?l=gnulib-bug&m=124958988300749
+
+2009-08-07 Bruno Haible <bruno@clisp.org>
+
+ Avoid link error on MacOS X 10.3 and 10.4.
+ * lib/argp-ba.c (argp_program_bug_address): Explicitly zero-initialize
+ on non-ELF systems.
+ * lib/argp-pv.c (argp_program_version): Likewise.
+ Reported by Simon Josefsson.
+
+2009-08-07 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-version-etc.sh: Use $EXEEXT.
+
+2009-08-06 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: update documentation to point to maint.mk
+ * build-aux/update-copyright: Here.
+
+2009-08-06 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: support update-copyright-local
+ * top/maint.mk (update-copyright-local): Define place-holder.
+ (update-copyright): Depend on $(update-copyright-local).
+
+2009-08-06 Jim Meyering <meyering@redhat.com>
+
+ selinux-at: new module
+ Initially written for coreutils, this module will soon be
+ used by findutils, too.
+ * MODULES.html.sh [Misc]: Add selinux-at.
+ * lib/selinux-at.h: New file, from coreutils.
+ * lib/selinux-at.c: Likewise.
+ * modules/selinux-at: Likewise.
+ (License): Change from LGPL to GPL, since it depends
+ on the GPL'd openat module.
+
+ doc: update README
+ * README: Remove references to cogito.
+ Remove cvs-repo-updating instructions from 2007.
+ Don't imply that CVS is better if you have limited disk space.
+
+2009-08-05 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: support C-style comments
+ * build-aux/update-copyright: Implement and document.
+ * tests/test-update-copyright.sh: Test.
+
+2009-08-05 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: support omitted "(C)"
+ * build-aux/update-copyright: Implement and document. Also,
+ allow variable whitespace before "(C)".
+ * tests/test-update-copyright.sh: Test.
+
+2009-08-05 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: don't trip on non-FSF copyright statements
+ * build-aux/update-copyright: Fix so that the first correctly
+ formatted FSF copyright statement is recognized no matter what
+ appears before it. Update documentation.
+ * tests/test-update-copyright.sh: Test that.
+
+2009-08-05 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: clean up code a little
+ * build-aux/update-copyright: Append "_re" to the name of any
+ variable holding a regular expression.
+ Replace "old" and "new" with "stmt" in variable names.
+ Do not accept 2-digit UPDATE_COPYRIGHT_YEAR, which was not
+ handled correctly.
+ Format code more consistently.
+
+2009-08-05 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright-tests: improve portability
+ * tests/test-update-copyright.sh: Use cmp if diff cannot handle
+ -u or /dev/null. Suggested by Jim Meyering and Eric Blake.
+
+2009-08-03 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: support @copyright{} and &copy;
+ * build-aux/update-copyright: Implement and document.
+ * tests/test-update-copyright.sh: Test.
+
+2009-08-04 Jim Meyering <meyering@redhat.com>
+
+ update-copyright-tests: correctly test EOL=\r\n handling
+ * tests/test-update-copyright.sh: Put \r at the end of some lines
+ for the dos-eol tests. Based on a patch by Joel E. Denny.
+
+ maint.mk: make update-copyright exclusion list more configurable
+ * top/maint.mk (update-copyright): Default to excluding COPYING,
+ but allow an override, in case someone does want to update that file.
+
+ maint.mk: don't update copyright date in COPYING
+ * top/maint.mk (update-copyright): Exclude COPYING.
+
+ maint.mk: add a copyright-updating rule
+ * top/maint.mk (update-copyright): New rule.
+ Derived from coreutils/Makefile.am.
+
+ update-copyright: rename some variables
+ * build-aux/update-copyright: Rename a few variables for clarity.
+ Tweak syntax. List Joel E. Denny as coauthor.
+
+2009-08-03 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: fix bug for 2-digit last year and add tests
+ * build-aux/update-copyright: Fix bug.
+ Use UPDATE_COPYRIGHT_YEAR from environment as current year if
+ specified.
+ * modules/update-copyright-tests: New
+ * tests/test-update-copyright.sh: New.
+
+2009-07-31 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: handle leading tabs in line prefix
+ * build-aux/update-copyright: Count leading tabs as 8 spaces
+ when computing margin. This helps with the formatting of
+ ChangeLogs, for example.
+ Fix documentation a little.
+
+2009-07-31 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: support EOL=\r\n
+ * build-aux/update-copyright: Implement that.
+
+2009-07-31 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: automatically format copyright statements
+ * build-aux/update-copyright: Implement that.
+ Also, be a little more predictable and safer by always failing
+ when the full copyright format is not perfectly recognized as an
+ unbroken whole. Discussed at
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-07/msg00131.html>.
+ Rewrite documentation.
+
+2009-08-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/iconv.m4 (AM_ICONV): Fix displayed message with autoconf-2.64.
+
+2009-08-02 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'uname'.
+ * modules/uname-tests: New file.
+ * tests/test-uname.c: New file.
+
+ New module 'uname'.
+ * lib/uname.c: New file.
+ * m4/uname.m4: New file.
+ * modules/uname: New file.
+ * doc/posix-functions/uname.texi: Mention the new module.
+
+2009-08-02 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'sys_utsname'.
+ * modules/sys_utsname-tests: New file.
+ * tests/test-sys_utsname.c: New file.
+
+ New module 'sys_utsname'.
+ * lib/sys_utsname.in.h: New file, based on glibc's <sys/utsname.h>.
+ * m4/sys_utsname_h.m4: New file.
+ * modules/sys_utsname: New file.
+ * doc/posix-headers/sys_utsname.texi: Mention the new module.
+
+2009-08-02 Bruno Haible <bruno@clisp.org>
+
+ Implicitly initialize the sockets library.
+ * lib/gethostname.c: Include sockets.h.
+ (rpl_gethostname): Invoke gl_sockets_startup.
+ * lib/socket.c: Include sockets.h.
+ (rpl_socket): Invoke gl_sockets_startup.
+ * modules/gethostname (Depends-on): Add sockets.
+ * modules/socket (Depends-on): Likewise.
+ * tests/test-poll.c: Don't include sockets.h.
+ (main): Don't invoke gl_sockets_startup.
+ * tests/test-select.c: Don't include sockets.h.
+ (main): Don't invoke gl_sockets_startup.
+
+2009-08-02 Bruno Haible <bruno@clisp.org>
+
+ Allow multiple calls to gl_sockets_startup.
+ * lib/sockets.c (initialized_sockets_version): New variable.
+ (gl_sockets_startup): Do nothing if already called for this or a higher
+ version.
+ (gl_sockets_cleanup): Reset initialized_sockets_version.
+
+2009-08-03 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-argp-version-etc-1.sh: Use EXEEXT. Don't fail on
+ different project/version.
+
+2009-08-02 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'pipe-filter-gi'.
+ * modules/pipe-filter-gi-tests: New file.
+ * tests/test-pipe-filter-gi1.sh: New file.
+ * tests/test-pipe-filter-gi1.c: New file.
+ * tests/test-pipe-filter-gi2.sh: New file.
+ * tests/test-pipe-filter-gi2-main.c: New file.
+ * tests/test-pipe-filter-gi2-child.c: New file.
+
+ New module 'pipe-filter-gi'.
+ * lib/pipe-filter-gi.c: New file.
+ * modules/pipe-filter-gi: New file.
+
+2009-08-02 Bruno Haible <bruno@clisp.org>
+ Paolo Bonzini <bonzini@gnu.org>
+
+ Tests for module 'pipe-filter-ii'.
+ * modules/pipe-filter-ii-tests: New file.
+ * tests/test-pipe-filter-ii1.sh: New file.
+ * tests/test-pipe-filter-ii1.c: New file.
+ * tests/test-pipe-filter-ii2.sh: New file.
+ * tests/test-pipe-filter-ii2-main.c: New file.
+ * tests/test-pipe-filter-ii2-child.c: New file.
+
+ New module 'pipe-filter-ii'.
+ * lib/pipe-filter.h: New file.
+ * lib/pipe-filter-ii.c: New file.
+ * lib/pipe-filter-aux.h: New file.
+ * modules/pipe-filter-ii: New file.
+
+2009-08-02 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc-libgcrypt.c: Change copyright to FSF.
+ * lib/gc-gnulib.c: Likewise.
+
+2009-08-02 Martin Lambers <marlam@marlam.de> (tiny change)
+
+ * lib/gethostname.c: Include limits.h.
+
+2009-08-02 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Ensure HOST_NAME_MAX as part of the gethostname module.
+ * m4/gethostname.m4 (gl_FUNC_GETHOSTNAME): On native Windows platforms,
+ define also HOST_NAME_MAX.
+ * tests/test-gethostname.c: Include <limits.h>.
+ (main): Check also HOST_NAME_MAX.
+ * doc/posix-headers/limits.texi: Document the mingw problem.
+
+2009-08-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/gethostname.c (gethostname): Fix handling of large len argument.
+ Add comments.
+
+2009-03-31 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gethostname.c: Add Windows wrapper.
+ * m4/gethostname.m4: Look for gethostname in -lws2_32.
+ * modules/gethostname: Depend on sys_socket & errno, for also
+ added lib/w32sock.h. Add GETHOSTNAME_LIB link directive.
+ * modules/gethostname-tests: Link to @GETHOSTNAME_LIB@.
+
+2009-07-31 Jim Meyering <meyering@redhat.com>
+
+ getloadavg: fix symbol name in comment
+ * lib/getloadavg.c: Correct a typo I introduced when adding
+ comments to Matt's change: s/NLIST_POINTER/N_NAME_POINTER/.
+ Matt Kraai spotted the problem.
+
+2009-07-29 Matt Kraai <mkraai@beckman.com>
+
+ getloadavg: check whether n_name is a pointer, for QNX 6.4.1
+ * lib/getloadavg.c (getloadavg): Use the strcpy-into-nlist.n_name
+ code also if ! defined N_NAME_POINTER.
+ * m4/getloadavg.m4 (gl_GETLOADAVG): Add a link-test for N_NAME_POINTER.
+ This is required on QNX 6.4.1, where /usr/include/nlist.h exists,
+ but the n_name member is a 12-byte array.
+
+2009-07-29 Joel E. Denny <jdenny@clemson.edu>
+
+ update-copyright: generalize comment handling
+ * build-aux/update-copyright: Handle copyright statements
+ within more comment styles.
+ Document usage.
+ Report any file with an external copyright holder or parse failure.
+
+2009-07-29 Jim Meyering <meyering@redhat.com>
+
+ mktime: correct setting of REPLACE_MKTIME
+ * m4/mktime.m4 (gl_FUNC_MKTIME): Set REPLACE_MKTIME=0, when required.
+
+ update-copyright: new module
+ * modules/update-copyright: New file.
+ * build-aux/update-copyright: New file.
+ * MODULES.html.sh (maint+release support): Add update-copyright.
+
+2009-07-27 Bruno Haible <bruno@clisp.org>
+
+ Fix compilation error when <ctime> is used and mktime is replaced.
+ * lib/time.in.h (mktime): New declaration.
+ * m4/mktime.m4 (gl_FUNC_MKTIME): Require gl_HEADER_TIME_H_DEFAULTS. Set
+ REPLACE_MKTIME instead of defining mktime in config.h.
+ * m4/time_h.m4 (gl_HEADER_TIME_H_DEFAULTS): Initialize REPLACE_MKTIME.
+ * modules/time (Makefile.am): Substitute REPLACE_MKTIME.
+ Reported by Ross McFarland <rwmcfa1@neces.com>.
+
+2009-07-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/math.in.h (cosl, logl, sinl): Undefine before declaring it.
+ Reported by Matt Kraai <mkraai@beckman.com>.
+
+2009-07-25 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: avoid warnings about missing files
+ * top/maint.mk (PREV_VERSION): Suppress stderr, to hide a
+ diagnostic when .prev-version does not exist.
+ (_cfg_mk): Define, so it can be empty when cfg.mk does not exist.
+ (syntax-check-rules): Use $(_cfg_mk) to avoid a diagnostic about
+ nonexistent cfg.mk.
+ Suggestions from Simon Josefsson.
+
+2009-07-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/math.in.h (cosl, logl, sinl): Don't declare if they are already
+ defined as macros. Needed on QNX 6.4.1.
+ Reported by Matt Kraai <mkraai@beckman.com>.
+
+2009-07-23 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: invoke "make dist" with a working value of XZ_OPT
+ * top/maint.mk (vc-dist): Use no "-" in the value of XZ_OPT.
+
+2009-07-22 Matt Kraai <mkraai@beckman.com> (tiny change)
+
+ Make fseeko.c compile on QNX.
+ * lib/fseeko.c (rpl_fseeko): Use the numerical value of _MWRITE.
+
+2009-07-22 Peter Simons <simons@cryp.to>
+
+ C++: wrap md2,md5,sha1,etc. function declarations in extern "C" scope
+ * lib/md2.h [__cplusplus]: Wrap declarations in extern "C" scope.
+ * lib/md4.h: Likewise.
+ * lib/md5.h: Likewise.
+ * lib/sha1.h: Likewise.
+ * lib/sha256.h: Likewise.
+ * lib/sha512.h: Likewise.
+
+ tests-sha1: don't assign literal string to 'char *' variable
+ * tests/test-sha1.c (main): Declare locals with "const" to match
+ attributes of the right hand side.
+
+2009-07-21 Eric Blake <ebb9@byu.net>
+
+ dup2: fix more mingw problems
+ * lib/dup2.c (rpl_dup2) [_WIN32]: Avoid hanging when duplicating
+ fd to itself.
+ * doc/posix-functions/dup2.texi (dup2): Document the bug.
+ * lib/unistd.in.h (dup2) [REPLACE_FCHDIR]: Avoid name collision.
+ * lib/fchdir.c (dup2): Manage preprocessor macros correctly.
+ (rpl_dup2_fchdir): Rename from rpl_dup2, and let dup2 module take
+ care of mingw bugs.
+
+2009-07-21 Jim Meyering <meyering@redhat.com>
+
+ vc-list-files: avoid failure when /bin/sh is dash
+ * build-aux/vc-list-files: Avoid a shell portability problem with dash.
+ On some Debian based systems, /bin/sh is a symlink to dash, and running
+ this command would omit the "/" following each 'tests' prefix:
+ dash -x build-aux/vc-list-files -C . tests
+ That is because bash and dash work differently:
+ $ for i in bash dash; do $i -c 'a=odd; a=ok b=$a; echo '$i' $b'; done
+ bash ok
+ dash odd
+
+2009-07-21 Eric Blake <ebb9@byu.net>
+
+ dup2-tests: test previous patch
+ * modules/dup2-tests: New file.
+ * tests/test-dup2.c: Likewise.
+ * tests/test-open.c (main): Avoid unspecified behavior.
+ * tests/test-pipe.c (child_main): Use dup2 semantics to simplify
+ test.
+
+ dup2: work around mingw and cygwin 1.5 bug
+ * m4/dup2.m4 (gl_FUNC_DUP2): Detect mingw bug.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add witness.
+ * modules/unistd (Makefile.am): Substitute it.
+ * lib/unistd.in.h (dup2): Declare the replacement.
+ * lib/dup2.c (dup2) [REPLACE_DUP2]: Implement it.
+ * doc/posix-functions/dup2.texi (dup2): Document the bugs.
+ * lib/fchdir.c (rpl_dup2): Don't collide with mingw replacement.
+ * modules/execute (Depends-on): Add dup2.
+ * modules/fseterr (Depends-on): Likewise.
+ * modules/pipe (Depends-on): Likewise.
+ * modules/posix_spawn-internal (Depends-on): Likewise.
+
+2009-07-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/.gitattributes: New file.
+
+2009-07-20 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-pipe.c (BACKUP_STDERR_FILENO): New macro.
+ (main): Use it.
+
+2009-07-20 Eric Blake <ebb9@byu.net>
+
+ test-pipe: make a bit more robust.
+ * tests/test-pipe.c (myerr): Allow error messages regardless of
+ what we do to stderr.
+ (test_pipe): Rearrange to avoid deadlock.
+ (child_main): Try a larger read, to ensure we avoided deadlock.
+ * lib/pipe.c (create_pipe) [_WIN32]: Fix comment.
+ * lib/pipe.h (create_pipe_bidi): Document potential for deadlock
+ if misused.
+
+2009-07-19 Jim Meyering <meyering@redhat.com>
+
+ fts: avoid false-positive cycle-detection
+ * lib/fts.c (fts_read): Reinitialize cycle-detection data structures
+ for each new command line argument.
+
+2009-07-19 Bruno Haible <bruno@clisp.org>
+
+ Fix build error on mingw with the modules sys_select and unistd.
+ * modules/acl-tests (Depends-on): Add close.
+ * modules/binary-io-tests (Depends-on): Likewise.
+ * modules/closein-tests (Depends-on): Likewise.
+ * modules/flock-tests (Depends-on): Likewise.
+ * modules/fsync-tests (Depends-on): Likewise.
+ * modules/lseek-tests (Depends-on): Likewise.
+ * modules/pipe-tests (Depends-on): Likewise.
+ * modules/posix_spawn-tests (Depends-on): Likewise.
+ * modules/posix_spawnp-tests (Depends-on): Likewise.
+ * modules/stat-time-tests (Depends-on): Likewise.
+ * modules/yesno-tests (Depends-on): Likewise.
+
+2009-07-19 Bruno Haible <bruno@clisp.org>
+
+ Unify conditionals.
+ * lib/pipe.h: Detect native Win32 by looking at _WIN32 and __WIN32__
+ macros, not at the compiler macros.
+ * lib/pipe.c: Likewise.
+ * lib/execute.c: Likewise.
+ * lib/spawni.c: Likewise.
+
+2009-07-19 Bruno Haible <bruno@clisp.org>
+
+ Fix handling of closed stdin/stdout/stderr on mingw.
+ * lib/w32spawn.h: Include unistd.h.
+ (dup_noinherit): Return -1 if the old handle is invalid. Allocate new
+ file descriptor with O_NOINHERIT flag.
+ (fd_safer_noinherit): New function, based on fd-safer.c.
+ (dup_safer_noinherit): New function, based on dup-safer.c.
+ (undup_safer_noinherit): New function.
+ * lib/execute.c (execute) [WIN32]: Use dup_safer_noinherit instead of
+ dup_noinherit. Use undup_safer_noinherit instead of dup2 and close.
+ * lib/pipe.c (create_pipe) [WIN32]: Likewise. Use fd_safer_noinherit
+ instead of fd_safer.
+ * tests/test-pipe.c: Include <windows.h>.
+ (child_main) [WIN32]: Test the handle of STDERR_FILENO, not its close() result.
+
+ * tests/test-pipe.c (child_main, parent_main): New functions, extracted
+ from main.
+ (test_pipe): Pass an extra argument for disambiguation.
+ (main): Invoke parent_main or child_main.
+
+ * tests/test-pipe.c (test_pipe): Pass slave_process = true argument
+ consistently.
+
+2009-07-18 Eric Blake <ebb9@byu.net>
+
+ test-pipe: fix mingw build
+ * tests/test-pipe.c (main): Avoid fcntl on mingw.
+
+2009-07-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/pipe-tests (Makefile.am): Fix typo.
+
+2009-07-18 Eric Blake <ebb9@byu.net>
+
+ error: fix mingw build
+ * lib/error.c (error, error_at_line): Avoid fcntl on mingw.
+ Reported by Bruno Haible.
+
+ error: avoid undefined use of stdout
+ * lib/error.c (error, error_at_line): Check that fd 1 is open
+ before flushing stdout. Avoids a crash on cygwin when libsigsegv
+ is handling faults and the close_stdout module wants to report the
+ detection of closed stdout as an error.
+
+2009-07-17 Eric Blake <ebb9@byu.net>
+
+ pipe: be robust in face of closed fds
+ * lib/pipe.c (create_pipe): Closed standard descriptors in parent
+ should cause child to misbehave.
+ * modules/pipe-tests: New module.
+ * tests/test-pipe.c: New file.
+ * tests/test-pipe.sh: New file.
+ Reported by Akim Demaille.
+
+2009-07-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Guess it works on glibc systems.
+ Reported by anonymous kc.
+
+2009-07-07 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: don't look for translatable strings in *.m4 or *.mk
+ * top/maint.mk (sc_po_check): Skip *.m4 and *.mk files,
+ when searching for translatable strings.
+
+2009-07-05 Jim Meyering <meyering@redhat.com>
+
+ remove superfluous parentheses in STREQ definition
+ * tests/test-argv-iter.c (STREQ): Remove redundant parentheses.
+ * lib/getugroups.c (STREQ): Likewise.
+ * lib/fnmatch.c (STREQ): Likewise.
+ Spotted by Bruno Haible.
+
+2009-07-04 Jim Meyering <meyering@redhat.com>
+
+ argv-iter: new module
+ * MODULES.html.sh: Add argv-iter.
+ * lib/argv-iter.c, lib/argv-iter.h: New files.
+ * modules/argv-iter: New file.
+ * modules/argv-iter-tests: New file.
+ * tests/test-argv-iter.c: Test it.
+
+2009-07-04 Bruno Haible <bruno@clisp.org>
+
+ Fix assertion.
+ * lib/git-merge-changelog.c (compute_mapping): In the case where file1
+ contains more exact copies of a given entry than file2, leave the extra
+ copies unpaired rather than aborting.
+ Reported by Eric Blake.
+
+2009-07-02 Bruno Haible <bruno@clisp.org>
+
+ Speedup git-merge-changelog for git cherry-pick.
+ * lib/git-merge-changelog.c (struct entries_mapping): New type.
+ (entries_mapping_get): New function, extracted from compute_mapping.
+ (entries_mapping_reverse_get): New function.
+ (compute_mapping): Add a 'full' argument. Return the result in a
+ 'struct entries_mapping'.
+ (main): Update. Access the mappings through entries_mapping_get.
+ Reported by Eric Blake.
+
+2009-07-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/git-merge-changelog.c (compute_mapping): Fix determination of
+ best_i.
+
+2009-07-02 Bruno Haible <bruno@clisp.org>
+
+ Speed up approximate search for matching ChangeLog entries.
+ * lib/git-merge-changelog.c (entry_fstrcmp): Add a lower_bound
+ argument. Call fstrcmp_bounded instead of fstrcmp.
+ (compute_mapping, try_split_merged_entry, main): Update callers.
+
+2009-07-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/git-merge-changelog.c (main): Add comment about git cherry-pick.
+
+2009-06-30 Bruno Haible <bruno@clisp.org>
+
+ Reduce the number of uc_is_cased calls.
+ * lib/unicase.h (casing_suffix_context_t): Add
+ 'first_char_except_ignorable' field.
+ * lib/unicase/context.h (SCC_FINAL_SIGMA_MASK): Remove macro.
+ (SCC_MORE_ABOVE_MASK, SCC_BEFORE_DOT_MASK): Update.
+ * lib/unicase/empty-suffix-context.c (unicase_empty_suffix_context):
+ Update initializer.
+ * lib/unicase/u-casemap.h (FUNC): Don't invoke uc_is_cased on
+ case-ignorable characters.
+ * lib/unicase/u-ct-totitle.h (FUNC): Likewise.
+ * lib/unicase/u-suffix-context.h (FUNC2): Don't call uc_is_cased here.
+ * modules/unicase/u8-suffix-context (Depends-on): Remove unicase/cased.
+ * modules/unicase/u16-suffix-context (Depends-on): Likewise.
+ * modules/unicase/u32-suffix-context (Depends-on): Likewise.
+
+2009-06-30 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'unicase/ignorable'.
+ * modules/unicase/ignorable-tests: New file.
+ * tests/unicase/test-ignorable.c: New file, generated by
+ gen-uni-tables.
+
+ Tests for module 'unicase/cased'.
+ * modules/unicase/cased-tests: New file.
+ * tests/unicase/test-cased.c: New file, generated by gen-uni-tables.
+ * tests/unicase/test-predicate-part1.h: New file, derived from
+ tests/unictype/test-predicate-part1.h.
+ * tests/unicase/test-predicate-part2.h: New file, same as
+ tests/unictype/test-predicate-part2.h.
+
+ Fix evaluation of "Before C" condition of FINAL_SIGMA.
+ * lib/gen-uni-tables.c (is_cased, is_case_ignorable): New functions.
+ (output_casing_properties): New function.
+ (main): Call it.
+ * lib/unicase/cased.h: New file, generated by gen-uni-tables.
+ * lib/unicase/cased.c: Include unictype/bitmap.h.
+ (uc_is_cased): Define through a bitmap lookup.
+ * lib/unicase/ignorable.h: New file, generated by gen-uni-tables.
+ * lib/unicase/ignorable.c: Include unictype/bitmap.h.
+ (uc_is_case_ignorable): Define through a bitmap lookup.
+ * modules/unicase/cased (Files): Add lib/unicase/cased.h,
+ lib/unictype/bitmap.h.
+ (Depends-on): Add inline. Clean up.
+ * modules/unicase/ignorable (Files): Add lib/unicase/ignorable.h,
+ lib/unictype/bitmap.h.
+ (Depends-on): Add inline. Clean up.
+ * tests/unicase/test-u8-tolower.c (main): Add more tests of FINAL_SIGMA
+ recognition.
+ * tests/unicase/test-u16-tolower.c (main): Likewise.
+ * tests/unicase/test-u32-tolower.c (main): Likewise.
+
+2009-06-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/unicase/u8-casemap.c: Don't include uniwbrk.h.
+ * lib/unicase/u16-casemap.c: Likewise.
+ * lib/unicase/u32-casemap.c: Likewise.
+
+2009-06-29 Bruno Haible <bruno@clisp.org>
+
+ Define u32_casefold as a wrapper around u32_ct_casefold.
+ * lib/unicase/u32-casefold.c: Update.
+ * modules/unicase/u32-casefold (Depends-on): Add
+ unicase/u32-ct-casefold, unicase/empty-prefix-context,
+ unicase/empty-suffix-context. Clean up.
+
+ Define u16_casefold as a wrapper around u16_ct_casefold.
+ * lib/unicase/u16-casefold.c: Update.
+ * modules/unicase/u16-casefold (Depends-on): Add
+ unicase/u16-ct-casefold, unicase/empty-prefix-context,
+ unicase/empty-suffix-context. Clean up.
+
+ Define u8_casefold as a wrapper around u8_ct_casefold.
+ * lib/unicase/u-casefold.h (FUNC): Delegate to U_CT_CASEFOLD.
+ * lib/unicase/u8-casefold.c: Update.
+ * modules/unicase/u8-casefold (Depends-on): Add unicase/u8-ct-casefold,
+ unicase/empty-prefix-context, unicase/empty-suffix-context. Clean up.
+
+ Define u32_totitle as a wrapper around u32_ct_totitle.
+ * lib/unicase/u32-totitle.c: Update.
+ * modules/unicase/u32-totitle (Depends-on): Add unicase/u32-ct-totitle,
+ unicase/empty-prefix-context, unicase/empty-suffix-context. Clean up.
+
+ Define u16_totitle as a wrapper around u16_ct_totitle.
+ * lib/unicase/u16-totitle.c: Update.
+ * modules/unicase/u16-totitle (Depends-on): Add unicase/u16-ct-totitle,
+ unicase/empty-prefix-context, unicase/empty-suffix-context. Clean up.
+
+ Define u8_totitle as a wrapper around u8_ct_totitle.
+ * lib/unicase/u-totitle.h (is_cased, is_case_ignorable): Remove
+ functions.
+ (FUNC): Delegate to U_CT_TOTITLE.
+ * lib/unicase/u8-totitle.c: Update.
+ * modules/unicase/u8-totitle (Depends-on): Add unicase/u8-ct-totitle,
+ unicase/empty-prefix-context, unicase/empty-suffix-context. Clean up.
+
+ * lib/unicase/u32-tolower.c (u32_tolower): Update u32_casemap
+ invocation.
+ * modules/unicase/u32-tolower (Depends-on): Add
+ unicase/empty-prefix-context, unicase/empty-suffix-context.
+
+ * lib/unicase/u16-tolower.c (u16_tolower): Update u16_casemap
+ invocation.
+ * modules/unicase/u16-tolower (Depends-on): Add
+ unicase/empty-prefix-context, unicase/empty-suffix-context.
+
+ * lib/unicase/u8-tolower.c (u8_tolower): Update u8_casemap invocation.
+ * modules/unicase/u8-tolower (Depends-on): Add
+ unicase/empty-prefix-context, unicase/empty-suffix-context.
+
+ * lib/unicase/u32-toupper.c (u32_toupper): Update u32_casemap
+ invocation.
+ * modules/unicase/u32-toupper (Depends-on): Add
+ unicase/empty-prefix-context, unicase/empty-suffix-context.
+
+ * lib/unicase/u16-toupper.c (u16_toupper): Update u16_casemap
+ invocation.
+ * modules/unicase/u16-toupper (Depends-on): Add
+ unicase/empty-prefix-context, unicase/empty-suffix-context.
+
+ * lib/unicase/u8-toupper.c (u8_toupper): Update u8_casemap invocation.
+ * modules/unicase/u8-toupper (Depends-on): Add
+ unicase/empty-prefix-context, unicase/empty-suffix-context.
+
+ New module 'unicase/u32-ct-casefold'.
+ * lib/unicase/u32-ct-casefold.c: New file.
+ * modules/unicase/u32-ct-casefold: New file.
+
+ New module 'unicase/u16-ct-casefold'.
+ * lib/unicase/u16-ct-casefold.c: New file.
+ * modules/unicase/u16-ct-casefold: New file.
+
+ New module 'unicase/u8-ct-casefold'.
+ * lib/unicase/u8-ct-casefold.c: New file.
+ * lib/unicase/u-ct-casefold.h: New file, derived from
+ lib/unicase/u-casefold.h.
+ * modules/unicase/u8-ct-casefold: New file.
+
+ New module 'unicase/u32-ct-totitle'.
+ * lib/unicase/u32-ct-totitle.c: New file.
+ * modules/unicase/u32-ct-totitle: New file.
+
+ New module 'unicase/u16-ct-totitle'.
+ * lib/unicase/u16-ct-totitle.c: New file.
+ * modules/unicase/u16-ct-totitle: New file.
+
+ New module 'unicase/u8-ct-totitle'.
+ * lib/unicase/u8-ct-totitle.c: New file.
+ * lib/unicase/u-ct-totitle.h: New file, derived from
+ lib/unicase/u-totitle.h.
+ * modules/unicase/u8-ct-totitle: New file.
+
+ New module 'unicase/u32-ct-tolower'.
+ * lib/unicase/u32-ct-tolower.c: New file.
+ * modules/unicase/u32-ct-tolower: New file.
+
+ New module 'unicase/u16-ct-tolower'.
+ * lib/unicase/u16-ct-tolower.c: New file.
+ * modules/unicase/u16-ct-tolower: New file.
+
+ New module 'unicase/u8-ct-tolower'.
+ * lib/unicase/u8-ct-tolower.c: New file.
+ * modules/unicase/u8-ct-tolower: New file.
+
+ New module 'unicase/u32-ct-toupper'.
+ * lib/unicase/u32-ct-toupper.c: New file.
+ * modules/unicase/u32-ct-toupper: New file.
+
+ New module 'unicase/u16-ct-toupper'.
+ * lib/unicase/u16-ct-toupper.c: New file.
+ * modules/unicase/u16-ct-toupper: New file.
+
+ New module 'unicase/u8-ct-toupper'.
+ * lib/unicase/u8-ct-toupper.c: New file.
+ * modules/unicase/u8-ct-toupper: New file.
+
+ Add context arguments to u*_casemap functions.
+ * lib/unicase/unicasemap.h: Include unicase.h.
+ (u8_casemap, u16_casemap, u32_casemap): Add prefix_context and
+ suffix_context arguments.
+ * lib/unicase/u-casemap.h (is_cased, is_case_ignorable): Remove
+ functions.
+ (FUNC): Add prefix_context and suffix_context arguments. Use
+ uc_is_cased and uc_is_case_ignorable.
+ * lib/unicase/u8-casemap.c: Include caseprop.h and context.h.
+ * lib/unicase/u16-casemap.c: Likewise.
+ * lib/unicase/u32-casemap.c: Likewise.
+ * modules/unicase/u8-casemap (Files): Add lib/unicase/context.h.
+ (Depends-on): Add unicase/cased, unicase/ignorable. Clean up.
+ * modules/unicase/u16-casemap (Files): Add lib/unicase/context.h.
+ (Depends-on): Add unicase/cased, unicase/ignorable. Clean up.
+ * modules/unicase/u32-casemap (Files): Add lib/unicase/context.h.
+ (Depends-on): Add unicase/cased, unicase/ignorable. Clean up.
+
+ New module 'unicase/u32-suffix-context'.
+ * lib/unicase/u32-suffix-context.c: New file.
+ * modules/unicase/u32-suffix-context: New file.
+
+ New module 'unicase/u16-suffix-context'.
+ * lib/unicase/u16-suffix-context.c: New file.
+ * modules/unicase/u16-suffix-context: New file.
+
+ New module 'unicase/u8-suffix-context'.
+ * lib/unicase/u8-suffix-context.c: New file.
+ * lib/unicase/u-suffix-context.h: New file.
+ * modules/unicase/u8-suffix-context: New file.
+
+ New module 'unicase/empty-suffix-context'.
+ * lib/unicase/empty-suffix-context.c: New file.
+ * modules/unicase/empty-suffix-context: New file.
+
+ New module 'unicase/u32-prefix-context'.
+ * lib/unicase/u32-prefix-context.c: New file.
+ * modules/unicase/u32-prefix-context: New file.
+
+ New module 'unicase/u16-prefix-context'.
+ * lib/unicase/u16-prefix-context.c: New file.
+ * modules/unicase/u16-prefix-context: New file.
+
+ New module 'unicase/u8-prefix-context'.
+ * lib/unicase/u8-prefix-context.c: New file.
+ * lib/unicase/u-prefix-context.h: New file.
+ * lib/unicase/context.h: New file.
+ * modules/unicase/u8-prefix-context: New file.
+
+ New module 'unicase/empty-prefix-context'.
+ * lib/unicase/empty-prefix-context.c: New file.
+ * modules/unicase/empty-prefix-context: New file.
+
+ New module 'unicase/ignorable'.
+ * lib/unicase/ignorable.c: New file.
+ * modules/unicase/ignorable: New file.
+
+ New module 'unicase/cased'.
+ * lib/unicase/caseprop.h: New file.
+ * lib/unicase/cased.c: New file.
+ * modules/unicase/cased: New file.
+
+ New functions for case mapping of substrings.
+ * lib/unicase.h (casing_prefix_context_t): New type.
+ (unicase_empty_prefix_context): New variable.
+ (u8_casing_prefix_context, u16_casing_prefix_context,
+ u32_casing_prefix_context, u8_casing_prefixes_context,
+ u16_casing_prefixes_context, u32_casing_prefixes_context): New
+ declarations.
+ (casing_suffix_context_t): New type.
+ (unicase_empty_suffix_context): New variable.
+ (u8_casing_suffix_context, u16_casing_suffix_context,
+ u32_casing_suffix_context, u8_casing_suffixes_context,
+ u16_casing_suffixes_context, u32_casing_suffixes_context,
+ u8_ct_toupper, u16_ct_toupper, u32_ct_toupper, u8_ct_tolower,
+ u16_ct_tolower, u32_ct_tolower, u8_ct_totitle, u16_ct_totitle,
+ u32_ct_totitle, u8_ct_casefold, u16_ct_casefold, u32_ct_casefold): New
+ declarations.
+
+2009-06-28 Jim Meyering <meyering@redhat.com>
+
+ boostrap: indent only with spaces
+ * build-aux/bootstrap: Indent only with spaces, never TABs.
+
+ bootstrap: split long lines
+ * build-aux/bootstrap: Keep line length < 80.
+
+ bootstrap: sync from coreutils
+ * build-aux/bootstrap: Honor variables like $ACLOCAL, etc.,
+ just as autoreconf does. Verify a list of prerequisite
+ package-name,version-number pairs if defined in bootstrap.conf.
+ Refer to README-prereq, if prerequisites are not satisfied.
+
+2009-06-27 Eric Blake <ebb9@byu.net>
+
+ tests: add test for bogus NULL definition
+ * tests/test-stdio.c: Ensure POSIX 2008 requirement on NULL.
+ * tests/test-stdlib.c: Likewise.
+ * tests/test-string.c: Likewise.
+ * tests/test-locale.c: Likewise.
+ * tests/test-unistd.c: Likewise.
+ * modules/stdio-tests (Depends-on): Add verify.
+ * modules/stdlib-tests (Depends-on): Likewise.
+ * modules/string-tests (Depends-on): Likewise.
+ * modules/locale-tests (Depends-on): Likewise.
+ * modules/unistd-tests (Depends-on): Likewise.
+
+2009-06-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * m4/selinux-context-h (gl_HEADERS_SELINUX_CONTEXT_H): Remove
+ self-explaining comment.
+ * m4/selinux-selinux-h: Update serial.
+ (gl_LIBSELINUX): New macro, adding a warning for missing development
+ packages to code extracted from...
+ (gl_HEADERS_SELINUX_SELINUX_H): ... this one. Require gl_LIBSELINUX.
+ Add warning for missing development packages here, too.
+
+2009-06-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * build-aux/bootstrap: Do not use GIT_CONFIG_LOCAL.
+
+2009-06-25 Eric Blake <ebb9@byu.net>
+
+ version-etc: fix regression
+ * lib/version-etc.h (ATTRIBUTE_SENTINEL): Define for new enough
+ gcc.
+ (version_etc): Use it, to catch bugs with trailing NULL.
+ * lib/version-etc.c (version_etc_arn): Delete unused argument.
+ (version_etc_va): Fix logic bug.
+ * modules/version-etc-tests: Add test.
+ * tests/test-version-etc.c: New file.
+ * tests/test-version-etc.sh: Likewise.
+
+2009-06-25 Sam Steingold <sds@gnu.org>
+
+ * mbrtowc.m4 (gl_MBRTOWC_SANITYCHECK): Include <stdlib.h>, for the
+ mbtowc declaration.
+
+2009-06-25 Eric Blake <ebb9@byu.net>
+
+ fpurge: migrate into <stdio.h>
+ * lib/fpurge.h: Delete...
+ * lib/stdio.in.h (fpurge): ...and declare here, instead.
+ * lib/fpurge.c (fpurge): Change declaring header.
+ * modules/fpurge (Files): Drop deleted file.
+ (Depends-on): Add stdio.
+ (configure.ac): Set witness.
+ * modules/stdio (Makefile.am): Support fpurge macros.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Likewise.
+ * m4/fpurge.m4 (gl_FUNC_FPURGE): Set appropriate variables.
+ * lib/fflush.c: Update client.
+ * tests/test-fpurge.c: Likewise.
+ * NEWS: Mention the change.
+
+2009-06-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-version-etc.c (program_authors): Add const
+ qualifier.
+ * lib/version-etc.c: Fix typos in the comments.
+ * modules/argp-version-etc: Depends on version-etc.
+
+2009-06-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ argp-version-etc: new module.
+
+ * lib/argp-version-etc.c: New file.
+ * lib/argp-version-etc.h: New file.
+ * modules/argp-version-etc: New file.
+ * modules/argp-version-etc-tests: New file.
+ * tests/test-argp-version-etc.c: New test.
+ * tests/test-argp-version-etc-1.sh: New test.
+
+2009-06-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Provide additional interfaces and documentation for version-etc
+ module.
+
+ * lib/version-etc.c (version_etc_arn, version_etc_ar): New
+ interfaces.
+ * lib/version-etc.h (version_etc_arn, version_etc_ar): New
+ prototypes.
+
+2009-06-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/lib-link.m4 (AC_LIB_HAVE_LINKFLAGS): Fix description of
+ HAVE_LIB${NAME} macro.
+ Reported by Sam Steingold <sds@gnu.org>.
+
+2009-06-23 Simon Josefsson <simon@josefsson.org>
+
+ * modules/hash-tests (test_hash_LDADD): Link to libintl when
+ needed.
+
+2009-06-21 Bruno Haible <bruno@clisp.org>
+
+ Make two consecutive identical invocations of AC_LIB_HAVE_LINKFLAGS
+ work.
+ * m4/lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Reset HAVE_LIB${NAME}
+ together with LIB${NAME}, LTLIB${NAME}.
+ Reported by Sam Steingold <sds@gnu.org>.
+
+2009-06-20 Jim Meyering <meyering@redhat.com>
+
+ tests: make sc_require_test_exit_idiom more generic
+ * top/maint.mk (Exit_witness_file): New overridable variable.
+ (sc_require_test_exit_idiom): Don't hard-code tests/test-lib.sh.
+ Relax test for /^Exit \$fail$$/ to just /^Exit ./.
+
+2009-06-19 Jim Meyering <meyering@redhat.com>
+
+ hash: reverse order of src/dst parameters in an internal interface
+ * lib/hash.c (transfer_entries): Reverse order of parameters to
+ put DST before SRC. Adjust callers.
+
+ tests: test-hash: avoid wholesale duplication
+ * tests/test-hash.c (main): Don't copy/paste a 60-line loop.
+ Instead, use a loop and add a single conditional.
+
+ tests: test-hash: allow seed selection via a command line argument
+ * tests/test-hash.c (get_seed): New function.
+ (main): Use it.
+
+2009-06-19 Eric Blake <ebb9@byu.net>
+
+ hash: avoid memory leak on allocation failure
+ * lib/hash.c: (hash_rehash): Avoid memory leak on allocation
+ failure. Factor repeated algorithm...
+ (transfer_entries): ...into new helper routine.
+ (hash_delete): React to hash_rehash return value.
+
+ hash: reduce memory pressure in hash_rehash no-op case
+ * lib/hash.c (next_prime): Avoid overflow.
+ (hash_initialize): Factor bucket size computation...
+ (compute_bucket_size): ...into new helper function.
+ (hash_rehash): Use new function and open coding to reduce memory
+ pressure, and avoid a memory leak in USE_OBSTACK code.
+ Reported by Jim Meyering.
+
+2009-06-18 Eric Blake <ebb9@byu.net>
+
+ hash: make rotation more obvious
+ * modules/hash (Depends-on): Add bitrotate and stdint.
+ * lib/bitrotate.h (rotl_sz, rotr_sz): New functions.
+ * lib/hash.c (headers): Drop limits.h. Add stdint.h.
+ (SIZE_MAX): Rely on headers for definition.
+ (hash_string) [USE_DIFF_HASH]: Use rotl_sz.
+ (raw_hasher): Use rotr_sz.
+ Suggested by Jim Meyering.
+
+ hash: fix memory leak in last patch
+ * lib/hash.c (hash_rehash): Avoid memory leak.
+
+ hash: avoid no-op rehashing
+ * lib/hash.c (hash_rehash): Recognize useless rehash attempts.
+
+ hash: provide default callback functions
+ * lib/hash.c (raw_hasher, raw_comparator): New functions.
+ (hash_initialize): Use them as defaults.
+ * tests/test-hash.c (main): Test this.
+
+ hash: minor optimization
+ * lib/hash.c (hash_lookup, hash_find_entry): Avoid function call
+ when possible.
+ (hash_initialize): Document this promise.
+ (hash_do_for_each, hash_clear, hash_free): Use C89 syntax.
+ * tests/test-hash.c (hash_compare_strings): Test this.
+
+2009-06-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Skip linear time test if strstr is
+ going to be replaced anyway.
+
+2009-06-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR_SIMPLE): Invoke AC_LIBOBJ only
+ in one place.
+ (gl_FUNC_STRCASESTR): Skip linear time test if strcasestr is going to
+ be replaced anyway.
+
+2009-06-18 Eric Blake <ebb9@byu.net>
+
+ hash: check for resize before insertion
+ * lib/hash.c (hash_insert): Check whether bucket usage exceeds
+ threshold before insertion, so that a pathological hash_rehash
+ that fills every bucket can still trigger another rehash.
+
+2009-06-18 Jim Meyering <meyering@redhat.com>
+
+ hash-tests: add a loop around the small tests
+ * tests/test-hash.c (main): Repeat small tests with selected
+ small initial table sizes.
+
+2009-06-17 Eric Blake <ebb9@byu.net>
+
+ hash: minor cleanups
+ * lib/hash.h (hash_entry): Make opaque, by moving...
+ * lib/hash.c (hash_entry): ...here.
+ (hash_insert): Clarify restrictions on what can be inserted.
+ (hash_get_next): Clarify when it is safe to remove an element
+ during traversal.
+ (check_tuning): Skip verification when tuning is known safe.
+ (hash_initialize): Clarify restrictions on tuning.
+
+2009-06-17 Jim Meyering <jim@meyering.net>
+ and Eric Blake <ebb9@byu.net>
+
+ hash-tests: new module
+ * modules/hash-tests: New file.
+ * tests/test-hash.c: New file.
+
+2009-06-17 Eric Blake <ebb9@byu.net>
+
+ strstr-simple: document new module
+ * MODULES.html.sh: Document new module.
+
+ strstr, strcasestr: replace on platforms with broken memchr
+ * modules/strstr: Split into...
+ * modules/strstr-simple: ...new module that does not care about
+ performance, but does care about glibc bug.
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Split...
+ (gl_FUNC_STRSTR_SIMPLE): ...into new macro, which replaces strstr
+ if platform memchr is broken, per Debian bug 521737.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR_SIMPLE): React to broken
+ memchr.
+ * m4/memchr.m4 (gl_FUNC_MEMCHR): Only expand once.
+ * doc/posix-functions/strstr.texi (strstr): Document the fix.
+ * doc/glibc-functions/strcasestr.texi (strcasestr): Likewise.
+ * modules/mountlist (Depends-on): Add strstr-simple.
+ * modules/gen-uni-tables (Depends-on): Likewise.
+ * modules/argz (Depends-on): Add strstr.
+
+2009-06-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/posix_spawn-internal (Depends-on): Add errno.
+
+2009-06-17 Bruno Haible <bruno@clisp.org>
+
+ Define missing ESTALE on Interix 3.5.
+ * lib/errno.in.h (ESTALE): Assign a value if missing.
+ * lib/strerror.c (rpl_strerror): Handle missing ESTALE and ECANCELED.
+ * m4/errno_h.m4 (gl_HEADER_ERRNO_H): Also test whether ESTALE is
+ missing.
+ * doc/posix-headers/errno.texi: Mention the Interix bug.
+ Reported by Jay Krell <jay.krell@cornell.edu> via Eric Blake.
+
+2009-06-15 Eric Blake <ebb9@byu.net>
+
+ memchr, memchr2: add valgrind exception
+ * lib/memchr.valgrind: New file.
+ * lib/memchr2.valgrind: New file.
+ * modules/memchr (Files): Distribute valgrind file.
+ * modules/memchr2 (Files): Likewise.
+
+ docs: memchr is no longer obsolete
+ * MODULES.html.sh: Move memchr from obsolete to string.h section.
+ * lib/string.in.h (memchr): Simplify logic.
+
+2009-06-14 Jim Meyering <meyering@redhat.com>
+
+ link-follow: fix the "checking..." message to not mention trailing slash
+ * m4/link-follow.m4 (gl_AC_FUNC_LINK_FOLLOWS_SYMLINK): This test has
+ never considered trailing slashes.
+
+2009-06-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/memchr.m4: Mention also the bug on IA-64.
+ * doc/posix-functions/memchr.texi: Likewise.
+
+2009-06-12 Eric Blake <ebb9@byu.net>
+
+ memchr: detect broken x86_64 and alpha implementations
+ * modules/memchr-tests (Depends-on): Move mmap detection...
+ * modules/memchr (Depends-on): ...here.
+ (configure.ac): Set indicator.
+ * lib/string.in.h (memchr): Declare replacement.
+ * modules/string (Makefile.am): Trigger replacement.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Likewise.
+ * m4/memchr.m4 (gl_FUNC_MEMCHR): Use mmap to detect platform
+ bugs.
+ * doc/posix-functions/memchr.texi (memchr): Document the bug.
+ * modules/getpagesize (License): Relax license.
+
+2009-06-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/idpriv.h: Add more references.
+
+2009-06-08 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'idpriv-droptemp'.
+ * modules/idpriv-droptemp-tests: New file.
+ * tests/test-idpriv-droptemp.sh: New file.
+ * tests/test-idpriv-droptemp.su.sh: New file.
+ * tests/test-idpriv-droptemp.c: New file.
+
+ New module 'idpriv-droptemp'.
+ * lib/idpriv-droptemp.c: New file.
+ * modules/idpriv-droptemp: New file.
+
+2009-06-08 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'idpriv-drop'.
+ * modules/idpriv-drop-tests: New file.
+ * tests/test-idpriv-drop.sh: New file.
+ * tests/test-idpriv-drop.su.sh: New file.
+ * tests/test-idpriv-drop.c: New file.
+
+ New module 'idpriv-drop'.
+ * lib/idpriv.h: New file.
+ * lib-idpriv-drop.c: New file.
+ * m4/idpriv.m4: New file.
+ * modules/idpriv-drop: New file.
+
+2009-06-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistdio/u8-vasnprintf (Depends-on): Add memchr.
+ * modules/unistdio/u8-u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vasnprintf (Depends-on): Likewise.
+
+2009-06-08 Eric Blake <ebb9@byu.net>
+
+ test-strstr: use memory fence, when possible
+ * tests/test-strstr.c (main): Use memory fence, in order to be
+ more likely to trigger Debian bug 521737.
+ * modules/strstr-tests (Files): Pull in additional files.
+
+ memchr: no longer obsolete, for wider field testing
+ * modules/memchr (Status, Notice): Delete, this module is no
+ longer obsolete.
+ * modules/vasnprintf (Depends-on): Add memchr.
+
+2009-06-07 Jim Meyering <meyering@redhat.com>
+
+ hash: declare some functions with the warn_unused_result attribute
+ * lib/hash.h (__attribute__, ATTRIBUTE_WUR): Define.
+
+2009-06-07 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-alignof.c: Don't test int64_t if it does not exist.
+ Reported by Eric Blake.
+
+2009-06-06 Eric Blake <ebb9@byu.net>
+
+ test-alignof: fix typo with long double
+ * tests/test-alignof.c (CHECK): Use longdouble typedef to avoid
+ compiler error.
+
+2009-06-06 Neil Jerram <neil@ossau.uklinux.net> (tiny change)
+
+ Escape non-texinfo { and }s.
+ * doc/ld-output-def.texi (Visual Studio Compatibility): Fix
+ markup error.
+
+2009-06-04 Jim Meyering <meyering@redhat.com>
+
+ gitlog-to-changelog: don't infloop on an empty commit log
+ * build-aux/gitlog-to-changelog: Warn about an empty log message.
+ Reported by Boris Petersen <transacid@centerim.org>.
+
+2009-06-03 Mike Frysinger <vapier@gentoo.org>
+
+ version-etc: extend for packagers
+ Add three new configure options, intended for packagers:
+ --with-packager="packager name"
+ --with-packager-version="packager-specific version"
+ --with-packager-bug-reports="packager bug reporting"
+ An example with coreutils:
+ $ ./configure \
+ --with-packager=Gentoo \
+ --with-packager-bug-report=http://bugs.gentoo.org/ \
+ --with-packager-version="patchset 1.6"
+ $ ./src/ls --version | head -n2
+ ls (GNU coreutils) 7.1-dirty
+ Packaged by Gentoo (patchset 1.6)
+ Note that the bug reporting info via --help doesn't show up because
+ coreutils uses its own custom emit_bug_reporting_address() implementation
+ in src/system.h. If it didn't, it'd look like:
+ $ ./src/ls --help | tail -n4
+ Report bugs to <bug-coreutils@gnu.org>.
+ Report Gentoo bugs to <http://bugs.gentoo.org/>.
+ GNU coreutils home page: <http://www.gnu.org/software/coreutils/>.
+ General help using GNU software: <http://www.gnu.org/gethelp/>.
+ * lib/version-etc.c: Print new information, if provided.
+ * m4/version-etc.m4: New file.
+ * modules/version-etc (Files): Add m4/version-etc.m4.
+ (configure.ac): Add gl_VERSION_ETC.
+
+2009-05-31 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-alignof.c: Include <stdint.h>. Check also 'long double'
+ and 'int64_t'.
+ * modules/alignof-tests (Dependencies): Add stdint.
+ Reported by Eric Blake.
+
+2009-05-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/alignof.h (alignof_slot, alignof_type, alignof): Document
+ restriction due to compiler bugs.
+ Reported by Eric Blake.
+
+2009-05-31 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Fix test-alignof failure.
+ * lib/alignof.h (alignof_slot): New macro.
+ (alignof_type): New macro, with the same semantics as the previous
+ 'alignof'.
+ (alignof): Alias to alignof_slot.
+ * tests/test-alignof.c (CHECK): Check alignof_slot, not alignof. Also
+ check that the results are usable as constant expressions.
+
+2009-05-31 Bruno Haible <bruno@clisp.org>
+
+ * tests/zerosize-ptr.h (zerosize_ptr): Specify more details.
+ * tests/test-memchr.c (main): Check that memchr does not read past the
+ first occurrence of the byte.
+ * tests/test-strstr.c (main): Update comment.
+ Suggested by Eric Blake.
+
+2009-05-30 Bruno Haible <bruno@clisp.org>
+
+ * doc/ld-output-def.texi (Visual Studio Compatibility): Explain in more
+ detail how to use dumpbin.
+ Reported by David Byron <dbyron@dbyron.com>.
+
+2009-06-02 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-parse-duration.sh: Don't use non-portable 'read -u3'.
+
+2009-06-02 Simon Josefsson <simon@josefsson.org>
+
+ * m4/manywarnings.m4: Add GCC 4.4 warnings.
+
+2009-05-28 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Don't do HAVE_CONFIG_H replacements on
+ build-aux/ files.
+
+2009-05-28 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool (func_import): Transform license on build-aux/ files too.
+
+2009-05-27 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool (sed_transform_main_lib_file)
+ (sed_transform_testsrelated_lib_file): : Don't use non-POSIX
+ regexps.
+
+2009-05-26 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-strstr.c: Add another self-test.
+ * tests/test-strstr.c: Rewrite to use malloc/strcpy instead of
+ strdup. Suggested by Eric Blake <ebb9@byu.net>.
+
+2009-05-23 Bruno Haible <bruno@clisp.org>
+
+ * doc/havelib.texi (AC_LIB_HAVE_LINKFLAGS): Update for 2009-04-26
+ change.
+
+2009-05-21 Bruno Haible <bruno@clisp.org>
+
+ Simplify use of mode_t varargs.
+ * lib/open.c (open): Use PROMOTED_MODE_T instead of a conditional that
+ uses 'mode_t' or 'int'.
+ * lib/openat.c (openat): Likewise.
+ * lib/open-safer.c (open_safer): Likewise.
+ * m4/mode_t.m4: New file.
+ * m4/open.m4 (gl_PREREQ_OPEN): Require gl_PROMOTED_TYPE_MODE_T.
+ * m4/openat.m4 (gl_PREREQ_OPENAT): Likewise.
+ * m4/fcntl-safer.m4 (gl_FCNTL_SAFER): Likewise.
+ * modules/open (Files): Add m4/mode_t.m4.
+ * modules/openat (Files): Likewise.
+ * modules/fcntl-safer (Files): Likewise.
+ Suggested by Eric Blake.
+
+2009-05-21 Pádraig Brady <P@draigbrady.com>
+
+ * doc/glibc-functions/fallocate.texi: New file.
+ * doc/gnulib.texi: Include it.
+
+2009-05-21 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/include_next.m4 (gl_CHECK_NEXT_HEADERS): Remove redundant m4_quote
+ invocations.
+ * m4/absolute-header.m4 (gl_ABSOLUTE_HEADER): Likewise.
+
+2009-05-21 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ Second attempt to work around an AIX 5.3, 6.1 compiler bug with
+ include_next. Fix of 2008-11-20 commit.
+ * m4/include_next.m4 (gl_CHECK_NEXT_HEADERS): Also set
+ NEXT_AS_FIRST_DIRECTIVE_FOO_H.
+ * lib/math.in.h: Use NEXT_AS_FIRST_DIRECTIVE_MATH_H instead of
+ NEXT_MATH_H.
+ * modules/math (Makefile.am): Substitute NEXT_AS_FIRST_DIRECTIVE_MATH_H
+ instead of NEXT_MATH_H.
+
+2009-05-21 Bruno Haible <bruno@clisp.org>
+
+ Avoid redefinition warnings for SIZE_MAX.
+ * m4/size_max.m4 (gl_SIZE_MAX): Avoid redefining SIZE_MAX in config.h.
+ Reported by Simon Josefsson.
+
+2009-05-21 Bruno Haible <bruno@clisp.org>
+
+ * m4/size_max.m4 (gl_SIZE_MAX): Use AC_CACHE_CHECK instead of
+ AC_CACHE_VAL.
+
+2009-05-20 Bruno Haible <bruno@clisp.org>
+
+ Make zeroptr.h work on mingw.
+ * tests/zerosize-ptr.h: Test for the presence of <sys/mman.h> and
+ mprotect.
+ * modules/memchr-tests (configure.ac): Also test for sys/mman.h.
+ * modules/memchr2-tests (configure.ac): Likewise.
+ * modules/memcmp-tests (configure.ac): Likewise.
+ * modules/memmem-tests (configure.ac): Likewise.
+ * modules/memrchr-tests (configure.ac): Likewise.
+ Reported by Simon Josefsson.
+
+2009-05-20 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-glob.c: Include string.h for strcmp prototype.
+
+2009-05-20 Simon Josefsson <simon@josefsson.org>
+
+ * modules/getdelim (Depends-on): Add explicit stdint, although it
+ was implicitly already pulled in via realloc-posix.
+ * lib/getdelim.c: Get SIZE_MAX from stdint.h.
+
+2009-05-20 Simon Josefsson <simon@josefsson.org>
+
+ MinGW and IRIX does not have sa_family_t type. Reported by "Tom
+ G. Christensen" <tgc@jupiterrise.com>.
+ * m4/sys_socket_h.m4: Check for sa_family_t.
+ * lib/sys_socket.in.h: Typedef sa_family_t when needed.
+ * modules/sys_socket: Substitute HAVE_SA_FAMILY_T.
+ * tests/test-sys_socket.c: Check that sa_family_t works.
+
+2009-05-18 Eric Blake <ebb9@byu.net>
+
+ maint.mk: allow gnulib_dir in VPATH build
+ * top/maint.mk (gnulib_dir): Make relative to $(srcdir).
+
+2009-05-15 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: Give gnulib_dir a default definition.
+ * top/maint.mk (gnulib_dir): Define to 'gnulib', by default.
+ Thus, most packages no longer need to specify this variable in cfg.mk
+
+2009-05-14 Tom Prince <tom.prince@ualberta.net> (tiny change)
+
+ rename.m4: fix typos that would make non-mingw cross-configure fail
+ * m4/rename.m4 (gl_FUNC_RENAME): Fix typos.
+
+2009-05-13 Eric Blake <ebb9@byu.net>
+
+ mmap-anon: avoid out-of-order autoconf expansion
+ * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Use correct
+ SYSTEM_EXTENSIONS macro to silence warnings from autoconf 2.63b.
+ * modules/memchr-tests (Depends-on): Add extensions.
+ * modules/memchr2-tests (Depends-on): Add extensions.
+ * modules/memcmp-tests (Depends-on): Add extensions.
+ * modules/memmem-tests (Depends-on): Add extensions.
+ * modules/memrchr-tests (Depends-on): Add extensions.
+
+2009-05-13 Bruno Haible <bruno@clisp.org>
+
+ Make some tests ISO C 99 compliant.
+ * tests/zerosize-ptr.h: New file.
+ * tests/test-memchr.c: Include zerosize-ptr.h.
+ (main): Use a zero-size object pointer instead of NULL.
+ * tests/test-memchr2.c: Include zerosize-ptr.h.
+ (main): Use a zero-size object pointer instead of NULL.
+ * tests/test-memcmp.c: Include zerosize-ptr.h.
+ (main): Use a zero-size object pointer instead of NULL.
+ * tests/test-memmem.c: Include zerosize-ptr.h.
+ (main): Use a zero-size object pointer instead of NULL.
+ * tests/test-memrchr.c: Include zerosize-ptr.h.
+ (main): Use a zero-size object pointer instead of NULL.
+ * modules/memchr-tests (Files): Add tests/zerosize-ptr.h,
+ m4/mmap-anon.m4.
+ (Depends-on): Add getpagesize.
+ (configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
+ * modules/memchr2-tests (Files): Add tests/zerosize-ptr.h,
+ m4/mmap-anon.m4.
+ (Depends-on): Add getpagesize.
+ (configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
+ * modules/memcmp-tests (Files): Add tests/zerosize-ptr.h,
+ m4/mmap-anon.m4.
+ (Depends-on): Add getpagesize.
+ (configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
+ * modules/memmem-tests (Files): Add tests/zerosize-ptr.h,
+ m4/mmap-anon.m4.
+ (Depends-on): Add getpagesize.
+ (configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
+ * modules/memrchr-tests (Files): Add tests/zerosize-ptr.h,
+ m4/mmap-anon.m4.
+ (Depends-on): Add getpagesize.
+ (configure.ac): Invoke gl_FUNC_MMAP_ANON. Check for mprotect.
+
+2009-05-12 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'alignof'.
+ * modules/alignof-tests: New file.
+ * tests/test-alignof.c: New file.
+
+2009-05-12 Bruno Haible <bruno@clisp.org>
+
+ Fix alignof macro.
+ * lib/alignof.h (alignof): Remove special cases for AIX and HP-UX
+ vendor compilers that are always correct.
+
+2009-05-12 Bruno Haible <bruno@clisp.org>
+
+ Make the MAP_ANONYMOUS detection work on HP-UX 11.
+ * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Check whether mmap exists, but
+ not whether its fully works.
+
+2009-05-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Add comments.
+
+2009-05-12 Jim Meyering <meyering@redhat.com>
+
+ * top/maint.mk: Adjust backslash alignment.
+
+2009-05-11 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk: Make $(srcdir)/build-aux configurable.
+
+2009-05-11 Eric Blake <ebb9@byu.net>
+
+ argp: avoid undefined behavior
+ * lib/argp-fmtstream.c (weak_alias): Pass correct types to ctype
+ macros.
+
+2009-05-08 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-vc-list-files-git.sh: Do git config of user.email and
+ user.name to prevent git commit from complaining.
+
+2009-05-10 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir, copy-file): Change
+ sed_rewrite_old_files, sed_rewrite_new_files, sed_rewrite_files so that
+ it rewrites every file name only once.
+ Reported by Simon Josefsson. Helped by Ralf Wildenhues.
+
+2009-05-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_socket.in.h (_SS_PADSIZE): Use a conditional expression
+ instead of 'max'.
+
+2009-05-08 Simon Josefsson <simon@josefsson.org>
+
+ * m4/sys_socket_h.m4: Test for ws2tcpip.h earlier, needed for
+ sockaddr_storage test.
+
+2009-05-07 Simon Josefsson <simon@josefsson.org>
+
+ * modules/sys_socket (Makefile.am): Substitute
+ HAVE_STRUCT_SOCKADDR_STORAGE. Depend on alignof.
+ * m4/sys_socket_h.m4: Check for sockaddr_storage.
+ * lib/sys_socket.in.h (sockaddr_storage): Define when needed.
+ * tests/test-sys_socket.c: Check sockaddr_storage.
+
+2009-05-08 Bruno Haible <bruno@clisp.org>
+
+ New module 'alignof'.
+ * lib/alignof.h: New file.
+ * modules/alignof: New file.
+
+2009-05-04 David Bartley <dtbartle@csclub.uwaterloo.ca>
+ Bruno Haible <bruno@clisp.org>
+
+ Fix test-file-has-acl on FreeBSD.
+ * tests/test-file-has-acl.sh: Also test a directory. On FreeBSD, the
+ mask is implicitly added.
+ * tests/test-file-has-acl.c: Include <signal.h>.
+ (main): Terminate the test after 5 seconds.
+ * modules/acl-tests (configure.ac): Check for alarm function.
+
+2009-05-04 Bruno Haible <bruno@clisp.org>
+
+ Exploit new semantics of AC_DEFUN_ONCE available since 2009-01-26.
+ * m4/errno_h.m4 (gl_HEADER_ERRNO_H): Remove outdated comment.
+ * modules/errno (configure.ac): Drop AC_REQUIRE.
+ * m4/multiarch.m4 (gl_MULTIARCH): Remove outdated comment.
+ * modules/multiarch (configure.ac): Drop AC_REQUIRE.
+
+2009-05-04 Simon Josefsson <simon@josefsson.org>
+
+ * modules/glob-tests: New module.
+ * tests/test-glob.c: Add.
+
+2009-05-04 Simon Josefsson <simon@josefsson.org>
+
+ * modules/fnmatch-tests: New module.
+ * tests/test-fnmatch.c: Add.
+
+2009-05-04 Eric Blake <ebb9@byu.net>
+
+ maint: make the new no-submodule-changes rule VPATH-safe
+ * top/maint.mk (no-submodule-changes): Don't assume a srcdir build.
+
+2009-05-04 David Bartley <dtbartle@csclub.uwaterloo.ca>
+ Bruno Haible <bruno@clisp.org>
+
+ acl: Fix infinite loop on FreeBSD.
+ * lib/acl_entries.c (acl_entries) [Linux, FreeBSD]: Fix interpretation
+ of return value from acl_get_entry.
+ * lib/file-has-acl.c (acl_access_nontrivial) [Linux, FreeBSD]:
+ Likewise.
+
+2009-05-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl-internal.h (acl_entries): Clarify return value.
+ * lib/acl_entries.c (acl_entries): Likewise.
+
+2009-05-04 David Bartley <dtbartle@csclub.uwaterloo.ca>
+
+ Bug fix in acl module.
+ * lib/set-mode-acl.c: Use correct struct with ACL_SETACL.
+
+2009-05-03 Bruno Haible <bruno@clisp.org>
+
+ Create gperf-generated file in the source dir, not in the build dir.
+ * modules/iconv_open (iconv_open-aix.h, iconv_open-hpux.h,
+ iconv_open-irix.h, iconv_open-osf.h): Create file in the source tree.
+ * modules/unicase/locale-language (unicase/locale-languages.h):
+ Likewise.
+ * modules/unicase/special-casing (unicase/special-casing-table.h):
+ Likewise.
+ * modules/unictype/property-byname (unictype/pr_byname.h): Likewise.
+ * modules/unictype/scripts (unictype/scripts_byname.h): Likewise.
+ * modules/uninorm/composition (uninorm/composition-table.h): Likewise.
+ Reported by Ralf Wildenhues.
+
+2009-05-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/fnmatch (Description, configure.ac): Taken from
+ fnmatch-posix.
+ * modules/fnmatch-posix: Turn into a symbolic reference to the
+ 'fnmatch' module, and deprecate.
+ * doc/posix-functions/fnmatch.texi: Mention the fnmatch module.
+
+2009-05-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF,
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE): Define through AC_DEFUN_ONCE.
+ Reported by Ralf Wildenhues.
+
+2009-05-04 Simon Josefsson <simon@josefsson.org>
+
+ * m4/fnmatch.m4: Fix fnmatch re-define.
+
+2009-04-27 David Bartley <dtbartle@csclub.uwaterloo.ca>
+
+ priv-set: new module and tests; adapt write-any-file
+ * lib/priv-set.c: New file.
+ * lib/priv-set.h: New file.
+ * lib/unlinkdir.c: Make cannot_unlink_dir thread-safe.
+ * lib/write-any-file.c: Simplify by using priv-set module.
+ * m4/priv-set.m4: New file.
+ * modules/priv-set: New file.
+ * modules/unlinkdir: Add dependency on priv-set module.
+ * modules/write-any-file: Likewise.
+
+ Tests for module 'priv-set'.
+ * modules/priv-set-tests: New file.
+ * tests/test-priv-set.c: New file.
+
+2009-05-03 Jim Meyering <meyering@redhat.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/propername.c (proper_name_utf8): Ignore no-op translations;
+ use the converted UTF-8 variant of the name instead.
+
+2009-05-03 Jim Meyering <meyering@redhat.com>
+
+ tests: tighten some getdate tests
+ * tests/test-getdate.c (main): Tighten tests: require equality,
+ not just greater than. Set TZ envvar to UTC0.
+
+2009-05-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ getdate: correctly interpret "next monday" when run on a Monday
+ * lib/getdate.y (get_date): Correct the calculation of tm_mday so
+ that e.g., "next tues" (when run on a tuesday) results in a date
+ that is one week in the future, and not today's date.
+ I.e., add a week when the wday is the same as the current one.
+ Reported by Tom Broadhurst in http://savannah.gnu.org/bugs/?25406,
+ and earlier by Martin Bernreuther and Jan Minář.
+ * tests/test-getdate.c (main): Check that "next DAY" is always in
+ the future and that "last DAY" is always in the past.
+
+2009-05-02 Jim Meyering <meyering@redhat.com>
+
+ build: ensure that a release build fails when a submodule is unclean
+ * top/maint.mk (no-submodule-changes): New rule.
+ (alpha beta major): Depend on it.
+
+2009-05-02 Bruno Haible <bruno@clisp.org>
+
+ Remove incompatibility between modules fnmatch-posix and fnmatch-gnu.
+ * m4/fnmatch.m4 (gl_FUNC_FNMATCH_POSIX, gl_FUNC_FNMATCH_GNU): Use a
+ shell variable gl_fnmatch_required to detect which variant is
+ requested.
+ (_AC_FUNC_FNMATCH_IF, _AC_LIBOBJ_FNMATCH): Remove macros. Inlined into
+ gl_FUNC_FNMATCH_POSIX.
+ * gnulib-tool (func_create_testdir, func_create_megatestdir): Don't
+ exclude fnmatch-posix.
+
+2009-05-02 Bruno Haible <bruno@clisp.org>
+
+ Relicense mbsrtowcs and strnlen1 under LGPLv2+.
+ * modules/mbsrtowcs (License): Change to LGPLv2+.
+ * modules/strnlen1 (License): Likewise.
+ Reported by Simon Josefsson.
+
+2009-05-02 Bruno Haible <bruno@clisp.org>
+
+ * m4/fnmatch.m4 (_AC_FUNC_FNMATCH_IF): Say "guessing no" instead of
+ "cross".
+ (gl_FUNC_FNMATCH_POSIX, gl_FUNC_FNMATCH_GNU): Update. Don't assume that
+ gnulib-tool was called with option --source-base=lib.
+
+2009-05-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Use automake *-local hooks without commands, for extensibility.
+ * modules/localcharset (Makefile.am): Rename install-exec-local
+ rule to install-exec-localcharset, and make it a prerequisite of
+ install-exec-local. Likewise, rename the uninstall-local rule to
+ uninstall-localcharset, and make it a prerequisite of the former.
+
+2009-05-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/wchar.in.h (wcsnrtombs): Define if REPLACE_WCSNRTOMBS is 1.
+ * m4/wcsnrtombs.m4 (gl_FUNC_WCSRTOMBS): Invoke gl_MBSTATE_T_BROKEN, and
+ set REPLACE_WCSNRTOMBS if mbstate_t must be replaced.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize REPLACE_WCSNRTOMBS.
+ * modules/wchar (Makefile.am): Substitute REPLACE_WCSNRTOMBS.
+ * modules/wcsnrtombs (Files): Add m4/mbrtowc.m4, m4/locale-ja.m4,
+ m4/locale-zh.m4, m4/codeset.m4.
+
+ * m4/wcsrtombs.m4 (gl_FUNC_WCSNRTOMBS): Invoke gl_MBSTATE_T_BROKEN, and
+ set REPLACE_WCSRTOMBS if mbstate_t must be replaced.
+ * modules/wcsrtombs (Files): Add m4/mbrtowc.m4, m4/locale-ja.m4,
+ m4/locale-zh.m4.
+
+ * m4/wcrtomb.m4 (gl_FUNC_WCRTOMB): Invoke gl_MBSTATE_T_BROKEN, and set
+ REPLACE_WCRTOMB if mbstate_t must be replaced.
+ * modules/wcrtomb (Files): Add m4/mbrtowc.m4.
+ Reported by Jens Rehsack <rehsack@googlemail.com> via Eric Blake.
+
+2009-05-01 Bruno Haible <bruno@clisp.org>
+
+ Avoid compiler warnings when redefining macros defined by <libintl.h>.
+ * lib/gettext.h [!ENABLE_NLS] (gettext, dgettext, dcgettext, ngettext,
+ dngettext, dcngettext, textdomain, bindtextdomain,
+ bind_textdomain_codeset): Undefine before redefining.
+
+2009-04-30 Bruno Haible <bruno@clisp.org>
+
+ Fix bug introduced on 2009-04-25.
+ * lib/math.in.h (gl_signbitf_OPTIMIZED_MACRO,
+ gl_signbitd_OPTIMIZED_MACRO, gl_signbitl_OPTIMIZED_MACRO): New macros.
+ * lib/signbitf.c (gl_signbitd): Undefine if gl_signbitf_OPTIMIZED_MACRO
+ is defined.
+ * lib/signbitd.c (gl_signbitd): Undefine if gl_signbitd_OPTIMIZED_MACRO
+ is defined.
+ * lib/signbitl.c (gl_signbitd): Undefine if gl_signbitl_OPTIMIZED_MACRO
+ is defined.
+ Reported by Elbert_Pol <elbert.pol@gmail.com>.
+
+2009-04-28 Bruno Haible <bruno@clisp.org>
+
+ Comment tweaks.
+ * lib/unistr.h (u*_cmp2): Clarify what memcmp2 is.
+ * lib/uninorm.h (u*_normxfrm): Fix description of return value.
+ * lib/unicase.h (u*_casexfrm): Likewise.
+ Reported by Paolo Bonzini.
+
+2009-04-28 Bruno Haible <bruno@clisp.org>
+
+ Fix a compilation error.
+ * lib/mbsrtowcs-state.c (_gl_mbsrtowcs_state): Fix initializer.
+ * lib/wcsrtombs-state.c (_gl_wcsrtombs_state): Likewise.
+ Reported by Jim Meyering.
+
+2009-04-27 Bruno Haible <bruno@clisp.org>
+
+ New module 'libunistring'.
+ * modules/libunistring: New file.
+ * m4/libunistring.m4: New file.
+ * MODULES.html.sh (Unicode string functions): Add it.
+
+2009-04-27 Eric Blake <ebb9@byu.net>
+
+ maint.mk: allow package-specific header to provide <config.h>
+ * top/maint.mk (sc_require_config_h): New variable.
+ (sc_require_config_h, sc_require_config_h_first): Use it.
+
+2009-04-27 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk (sc_avoid_if_before_free): Except
+ useless-if-before-free script.
+
+2009-04-27 Eric Blake <ebb9@byu.net>
+
+ maintainer-makefile: depend on all required helper scripts
+ * modules/maintainer-makefile (Depends-on): Add vc-list-files and
+ useless-if-before-free.
+ * top/maint.mk (VC_LIST, sc_avoid_if_before_free): Use local
+ version, rather than assuming gnulib checkout is available.
+ Reported by Simen Josefsson.
+
+2009-04-26 Bruno Haible <bruno@clisp.org>
+
+ Make the lib vs. lib64 recognition work on openSUSE 11 with "gcc -m32".
+ * m4/lib-prefix.m4 (AC_LIB_PREPARE_MULTILIB): Ignore paths that end in
+ "../" or "..".
+
+2009-04-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/lib-link.m4 (AC_LIB_HAVE_LINKFLAGS): Accept a fifth argument.
+ * m4/libsigsegv.m4 (gl_LIBSIGSEGV): Simplify by using
+ AC_LIB_HAVE_LINKFLAGS.
+
+2009-04-26 Bruno Haible <bruno@clisp.org>
+
+ Simplify calling convention of u*_conv_from_encoding.
+ * lib/uniconv.h (u8_conv_from_encoding, u16_conv_from_encoding,
+ u32_conv_from_encoding): Expect a resultbuf argument and return the
+ result directly as a pointer.
+ * lib/uniconv/u8-conv-from-enc.c (u8_conv_from_encoding): Likewise.
+ * lib/uniconv/u-conv-from-enc.h (FUNC): Likewise.
+ * lib/uniconv/u-strconv-from-enc.h (FUNC): Update.
+ * lib/unicase/ulc-casecmp.c (ulc_u8_casefold): Update.
+ * lib/unicase/ulc-casexfrm.c (ulc_casexfrm): Update.
+ * lib/unilbrk/ulc-possible-linebreaks.c (ulc_possible_linebreaks):
+ Update.
+ * lib/unilbrk/ulc-width-linebreaks.c (ulc_width_linebreaks): Update.
+ * lib/uniwbrk/ulc-wordbreaks.c (ulc_wordbreaks): Update.
+ * lib/vasnprintf.c (VASNPRINTF): Update.
+ * tests/uniconv/test-u8-conv-from-enc.c (main): Update.
+ * tests/uniconv/test-u16-conv-from-enc.c (main): Update.
+ * tests/uniconv/test-u32-conv-from-enc.c (main): Update.
+ * NEWS: Mention the change.
+
+2009-04-26 Bruno Haible <bruno@clisp.org>
+
+ Simplify calling convention of u*_conv_to_encoding.
+ * lib/uniconv.h (u8_conv_to_encoding, u16_conv_to_encoding,
+ u32_conv_to_encoding): Expect a resultbuf argument and return the
+ result directly as a pointer.
+ * lib/uniconv/u8-conv-to-enc.c (u8_conv_to_encoding): Likewise.
+ * lib/uniconv/u-conv-to-enc.h (FUNC): Likewise. Preserve errno while
+ freeing scaled_offsets if mem_iconveha failed.
+ * lib/unicase/u-casexfrm.h (FUNC): Update.
+ * lib/uninorm/u-normxfrm.h (FUNC): Update.
+ * lib/vasnprintf.c (VASNPRINTF): Update.
+ * tests/uniconv/test-u8-conv-to-enc.c (main): Update.
+ * tests/uniconv/test-u16-conv-to-enc.c (main): Update.
+ * tests/uniconv/test-u32-conv-to-enc.c (main): Update.
+ * NEWS: Mention the change.
+
+2009-04-26 Bruno Haible <bruno@clisp.org>
+
+ Avoid test failures on AIX and OSF/1.
+ * lib/uniconv/u8-conv-from-enc.c (u8_conv_from_encoding): Avoid calling
+ malloc(0).
+ * lib/uniconv/u8-conv-to-enc.c (u8_conv_to_encoding): Likewise.
+ * lib/unilbrk/ulc-possible-linebreaks.c (ulc_possible_linebreaks):
+ Likewise.
+ * lib/unilbrk/ulc-width-linebreaks.c (ulc_width_linebreaks): Likewise.
+ * lib/uniwbrk/ulc-wordbreaks.c (ulc_wordbreaks): Likewise.
+ * lib/uniconv/u-conv-to-enc.h (FUNC): Likewise. Fix memory leak.
+ * lib/unistr/u-cpy-alloc.h (FUNC): Call malloc(1) instead of malloc(0).
+ * doc/posix-functions/malloc.texi: Document the portability problem
+ related to malloc(0).
+
+2009-04-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistr/u8-cpy-alloc (Depends-on): Add malloc-posix.
+ * modules/unistr/u16-cpy-alloc (Depends-on): Likewise.
+ * modules/unistr/u32-cpy-alloc (Depends-on): Likewise.
+
+2009-04-25 Bruno Haible <bruno@clisp.org>
+
+ Avoid link error when creating a namespace clean library.
+ * lib/math.in.h (gl_signbitf, gl_signbitd, gl_signbitl): Don't define
+ as macro with arguments if already defined as an alias.
+ * lib/signbitf.c (gl_signbitf): Don't undefine.
+ * lib/signbitd.c (gl_signbitd): Don't undefine.
+ * lib/signbitl.c (gl_signbitl): Don't undefine.
+
+2009-04-25 Jim Meyering <meyering@redhat.com>
+
+ vc-list-files: fix another quoting bug
+ * build-aux/vc-list-files: Avoid sed backslash expansion
+ of pathological directory names.
+
+2009-04-25 Eric Blake <ebb9@byu.net>
+
+ vc-list-files: fix shell quoting error
+ * build-aux/vc-list-files: Protect against $ in $dir. Normalize
+ timestamp.
+
+2009-04-25 Jim Meyering <meyering@redhat.com>
+
+ vc-list-files: restore lost functionality with subdir argument
+ * build-aux/vc-list-files: When given a non-"." sub-directory
+ argument, substitute the $dir/ prefix back onto each resulting name.
+ Otherwise, coreutils' root_tests check would fail.
+
+2009-04-24 Eric Blake <ebb9@byu.net>
+
+ vc-list-files: ignore git symlinks
+ * build-aux/vc-list-files (.git): Use ls-tree and a filter, rather
+ than ls-files, to ignore git symlinks.
+
+ maint.mk: import improvements from m4
+ * top/maint.mk (VC-tag): Use signing key from cfg.mk.
+ (move_if_change): Delete unused macro.
+ (news-date-check, vc-diff-check): Support VPATH builds.
+ (announcement): Likewise. Split --bootstrap-tools list...
+ (boostrap-tools): ...into separate list, which can be overridden
+ in cfg.mk.
+ (sc_avoid_if_before_free): Point to $(gnulib_dir), rather than
+ requiring dependency on useless-if-before-free module.
+ (VC_LIST, VC_LIST_EXCEPT): Likewise for vc-list-files module.
+ Support VPATH builds.
+
+2009-04-24 Jim Meyering <meyering@redhat.com>
+
+ maint.mk: remove coreutils-specific rules and variables
+ * top/maint.mk (bin, taint-distcheck, coreutils-path-check, t): Remove.
+ (fake_home, install-transform-check, my-instcheck, pfx, TMPDIR): Remove.
+ (t_prefix, t_taint, tp, warn_cflags, write_loser, my-distcheck): Remove.
+
+ maint.mk: remove obsolete rule
+ * top/maint.mk (rel-check): Remove rule.
+ (WGET, WGETFLAGS): Remove now-unused variables.
+
+2009-04-24 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk (makefile-check): Renamed to sc_makefile_check for
+ consistency.
+
+ * modules/vc-list-files-tests (TESTS_ENVIRONMENT): Use
+ '$(PATH_SEPARATOR)' instead of ':'.
+
+2009-04-24 Simon Josefsson <simon@josefsson.org>
+
+ * lib/getopt1.c (main): Use 'const' for static array.
+
+2009-04-24 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk: Sync with coreutils.
+ * NEWS: Explain incompatibilities.
+
+2009-04-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ Fix cross-compilation results.
+ * m4/btowc.m4 (gl_FUNC_BTOWC): Use no-op statement, rather than empty
+ statement, as third argument of AC_TRY_RUN.
+ * m4/mbrtowc.m4 (gl_MBRTOWC_INCOMPLETE_STATE, gl_MBRTOWC_SANITYCHECK,
+ gl_MBRTOWC_NULL_ARG, gl_MBRTOWC_RETVAL, gl_MBRTOWC_NUL_RETVAL):
+ Likewise.
+ * m4/mbsrtowcs.m4 (gl_MBSRTOWCS_WORKS): Likewise.
+ * m4/wcsrtombs.m4 (gl_WCSRTOMBS_TERMINATION, gl_WCSRTOMBS_NULL):
+ Likewise.
+ * m4/wctob.m4 (gl_FUNC_WCTOB): Likewise.
+ * m4/wcrtomb.m4 (gl_FUNC_WCRTOMB): Likewise. Update for AIX 4.3.
+ * doc/posix-functions/wcrtomb.texi: Mention the bug on AIX 4.3.
+
+2009-04-20 Bruno Haible <bruno@clisp.org>
+
+ Avoid test failure on mingw.
+ * tests/uniwidth/test-uc_width2.sh: Convert newlines in output.
+
+2009-04-20 Bruno Haible <bruno@clisp.org>
+
+ Avoid compilation error on mingw.
+ * modules/localename-tests (Depends-on): Add locale.
+
+2009-04-19 Bruno Haible <bruno@clisp.org>
+
+ Support for building a shared library on Windows platforms.
+ * tests/uninorm/test-nfc.c (n): Don't define if WOE32DLL.
+ (main): Test the presence of UNINORM_NFC here.
+ * tests/uninorm/test-nfd.c (n): Don't define if WOE32DLL.
+ (main): Test the presence of UNINORM_NFD here.
+ * tests/uninorm/test-nfkc.c (n): Don't define if WOE32DLL.
+ (main): Test the presence of UNINORM_NFKC here.
+ * tests/uninorm/test-nfkd.c (n): Don't define if WOE32DLL.
+ (main): Test the presence of UNINORM_NFKD here.
+
+2009-04-19 Bruno Haible <bruno@clisp.org>
+
+ Avoid a compiler warning.
+ * tests/uninorm/test-u32-normalize-big.c (read_normalization_test_file):
+ Change type of variable 'sequence'.
+
+2009-04-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/configmake (Makefile.am): When the contents of configmake.h
+ does not change, arrange to preserve its modification time.
+
+2009-04-17 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk (PO_DOMAIN): New variable, allows overriding of
+ gettext domain.
+
+2009-04-16 Jim Meyering <meyering@redhat.com>
+
+ useless-if-before-free: improve conversion code
+ * build-aux/useless-if-before-free: Adjust code-in-comment to match
+ "...!= 0" as well as "...!= NULL". emacs has one of the former.
+
+2009-04-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/fcntl (Depends-on): Add extensions.
+ * m4/fcntl_h.m4 (gl_FCNTL_H): Add a comment.
+
+2009-04-12 Ben Pfaff <blp@gnu.org>
+
+ Make fcntl module detect O_NOATIME, O_NOFOLLOW on GNU/Linux.
+ * m4/fcntl_h.m4 (gl_FCNTL_H): Require AC_USE_SYSTEM_EXTENSIONS.
+
+2009-03-20 Ben Pfaff <blp@gnu.org>
+
+ Make rename replace existing destinations on Windows.
+ * m4/rename.m4: Add test for Mingw.
+ * lib/rename.c: Add rename replacement that uses MoveFileEx with
+ MOVEFILE_REPLACE_EXISTING to replace existing destination files.
+ * doc/posix-functions/rename.texi: Document.
+
+2009-04-10 Bruno Haible <bruno@clisp.org>
+
+ New include file "iconveh.h".
+ * lib/iconveh.h: New file, extracted from lib/striconveh.h.
+ * lib/striconveh.h: Include it.
+ (enum iconv_ilseq_handler): Remove definition.
+ * lib/striconveha.h: Include <stddef.h> and iconveh.h instead of
+ striconveh.h.
+ * lib/striconveha.c: Include striconveh.h.
+ * lib/uniconv.h: Include iconveh.h instead of striconveh.h.
+ * modules/striconveh (Files): Add lib/iconveh.h.
+ * modules/uniconv/base (Files): Add lib/iconveh.h. Remove
+ lib/striconveh.h.
+
+2009-04-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/uniconv.h: Update comment.
+
+2009-04-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistr/u8-mbtouc-aux.c: Inside libunistring, define the function
+ always.
+ * lib/unistr/u8-mbtouc-unsafe-aux.c: Likewise.
+ * lib/unistr/u16-mbtouc-aux.c: Likewise.
+ * lib/unistr/u16-mbtouc-unsafe-aux.c: Likewise.
+ * lib/unistr/u8-mbtouc.c: Inside libunistring, include
+ "unistring-notinline.h", so that the function gets defined always.
+ * lib/unistr/u8-mbtouc-unsafe.c: Likewise.
+ * lib/unistr/u8-uctomb.c: Likewise.
+ * lib/unistr/u16-mbtouc.c: Likewise.
+ * lib/unistr/u16-mbtouc-unsafe.c: Likewise.
+ * lib/unistr/u16-uctomb.c: Likewise.
+ * lib/unistr/u32-mbtouc.c: Likewise.
+ * lib/unistr/u32-mbtouc-unsafe.c: Likewise.
+ * lib/unistr/u32-uctomb.c: Likewise.
+
+2009-04-10 Bruno Haible <bruno@clisp.org>
+
+ Mark 'utime' obsolete.
+ * modules/utime (Status, Notice): New sections.
+ Suggested by Jim Meyering.
+
+ Fix cross-compile guess for utime test.
+ * m4/utime.m4 (AC_FUNC_UTIME_NULL): Add definition from newest unstable
+ autoconf.
+ * doc/posix-functions/utime.texi: Give more precisions.
+ Reported by Jan <ipif@ymail.com>.
+
+2009-04-09 Kamil Dudka <kdudka@redhat.com>
+
+ filevercmp: correct today's change
+ * lib/filevercmp.c: Also handle coreutils' test inputs.
+ * tests/test-filevercmp.c: Add inputs from one of coreutils' test scripts.
+
+ Fix regression in 'filevercmp' module. Thanks Sven Joachim
+ for reporting it.
+ * lib/filevercmp.c: Special handle for "", "." and "..".
+ * tests/test-filevercmp.c: Enlarge the set suite.
+
+2009-04-07 Jim Meyering <meyering@redhat.com>
+
+ useless-if-before-free: show how to remove braced useless free, too
+ * build-aux/useless-if-before-free: still only in a comment, though.
+
+2009-04-07 Reuben Thomas <rrt@sc3d.org>
+
+ maint.mk: import changes to syntax-check macros from coreutils
+ * top/maint.mk (_prohibit_regexp, _header_without_use): Define.
+ Use them in the relevant macros.
+
+2009-04-06 Bruno Haible <bruno@clisp.org>
+
+ Fix unportable use of bit-fields.
+ * lib/unicase/special-casing.h (struct special_casing_rule): Change the
+ bit-field type from 'int' to 'signed int'. Otherwise Solaris cc,
+ AIX xlc, and OSF/1 cc interpret it as 'unsigned int'.
+
+2009-04-06 Bruno Haible <bruno@clisp.org>
+
+ Avoid test failures on AIX and OSF/1.
+ * tests/unicase/test-u8-casefold.c (check): Account for the possibility
+ that malloc(0) = NULL.
+ * tests/unicase/test-u8-tolower.c (check): Likewise.
+ * tests/unicase/test-u8-totitle.c (check): Likewise.
+ * tests/unicase/test-u8-toupper.c (check): Likewise.
+ * tests/unicase/test-u16-casefold.c (check): Likewise.
+ * tests/unicase/test-u16-tolower.c (check): Likewise.
+ * tests/unicase/test-u16-totitle.c (check): Likewise.
+ * tests/unicase/test-u16-toupper.c (check): Likewise.
+ * tests/unicase/test-u32-casefold.c (check): Likewise.
+ * tests/unicase/test-u32-tolower.c (check): Likewise.
+ * tests/unicase/test-u32-totitle.c (check): Likewise.
+ * tests/unicase/test-u32-toupper.c (check): Likewise.
+ * tests/uninorm/test-u8-nfc.c (check): Likewise.
+ * tests/uninorm/test-u8-nfd.c (check): Likewise.
+ * tests/uninorm/test-u8-nfkc.c (check): Likewise.
+ * tests/uninorm/test-u8-nfkd.c (check): Likewise.
+ * tests/uninorm/test-u16-nfc.c (check): Likewise.
+ * tests/uninorm/test-u16-nfd.c (check): Likewise.
+ * tests/uninorm/test-u16-nfkc.c (check): Likewise.
+ * tests/uninorm/test-u16-nfkd.c (check): Likewise.
+ * tests/uninorm/test-u32-nfc.c (check): Likewise.
+ * tests/uninorm/test-u32-nfd.c (check): Likewise.
+ * tests/uninorm/test-u32-nfkc.c (check): Likewise.
+ * tests/uninorm/test-u32-nfkd.c (check): Likewise.
+
+2009-04-05 Bruno Haible <bruno@clisp.org>
+
+ Work around an autoconf limitation.
+ * gnulib-tool (func_emit_lib_Makefile_am): Omit the "Reproduce by"
+ comment line if it would be longer than 3 KB.
+
+2009-04-05 Bruno Haible <bruno@clisp.org>
+
+ Avoid test failure with libiconv-1.13.
+ * tests/test-striconveh.c (main): Allow result of libiconv 1.13 as one
+ of the expected test results.
+
+2009-04-05 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Don't add the library to
+ noinst_LTLIBRARIES if the Makefile.am in the same directory specifies
+ that it should be installed.
+
+2009-04-05 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: New option --copy-file.
+ (func_usage): Document it.
+ (func_dest_tmpfilename): Moved out of func_import.
+ (func_add_file, func_update_file): New functions, extracted from
+ func_import.
+ (func_import): Update.
+
+2009-04-05 Karl Berry <karl@gnu.org>
+
+ * README: prominently mention gnulib-tool.
+ Rearrange sections so getting the code is near the top.
+
+2009-04-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/unicase.h: Mention u*_cmp2.
+ * lib/unicase/u-casecmp.h (FUNC): Invoke U_CMP2 instead of U_CMP.
+ * lib/unicase/u8-casecmp.c: Use u8_cmp2 instead of u8_cmp.
+ * lib/unicase/ulc-casecmp.c: Likewise.
+ * lib/unicase/u16-casecmp.c: Use u16_cmp2 instead of u16_cmp.
+ * lib/unicase/u32-casecmp.c: Use u32_cmp2 instead of u32_cmp.
+ * modules/unicase/u8-casecmp (Depends-on): Add unistr/u8-cmp2, remove
+ unistr/u8-cmp.
+ * modules/unicase/ulc-casecmp (Depends-on): Likewise.
+ * modules/unicase/u16-casecmp (Depends-on): Add unistr/u16-cmp2, remove
+ unistr/u16-cmp.
+ * modules/unicase/u32-casecmp (Depends-on): Add unistr/u32-cmp2, remove
+ unistr/u32-cmp.
+
+ * lib/uninorm.h: Mention u*_cmp2.
+ * lib/uninorm/u-normcmp.h (FUNC): Invoke U_CMP2 instead of U_CMP.
+ * lib/uninorm/u8-normcmp.c: Use u8_cmp2 instead of u8_cmp.
+ * lib/uninorm/u16-normcmp.c: Use u16_cmp2 instead of u16_cmp.
+ * lib/uninorm/u32-normcmp.c: Use u32_cmp2 instead of u32_cmp.
+ * modules/uninorm/u8-normcmp (Depends-on): Add unistr/u8-cmp2, remove
+ unistr/u8-cmp.
+ * modules/uninorm/u16-normcmp (Depends-on): Add unistr/u16-cmp2, remove
+ unistr/u16-cmp.
+ * modules/uninorm/u32-normcmp (Depends-on): Add unistr/u32-cmp2, remove
+ unistr/u32-cmp.
+
+ New module 'unistr/u32-cmp2'.
+ * lib/unistr/u32-cmp2.c: New file.
+ * modules/unistr/u32-cmp2: New file.
+
+ New module 'unistr/u16-cmp2'.
+ * lib/unistr/u16-cmp2.c: New file.
+ * modules/unistr/u16-cmp2: New file.
+
+ New module 'unistr/u8-cmp2'.
+ * lib/unistr.h (u8_cmp2, u16_cmp2, u32_cmp2): New declarations.
+ * lib/unistr/u8-cmp2.c: New file.
+ * lib/unistr/u-cmp2.h: New file.
+ * modules/unistr/u8-cmp2: New file.
+
+2009-04-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/unictype.h (uc_property_is_valid): New macro.
+ * tests/unictype/test-pr_byname.c (main): Use it.
+
+ * lib/unistr.h: Doc fixes.
+ * lib/uniconv.h: Doc fixes.
+ * lib/unictype.h: Doc fixes.
+
+2009-04-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port coreutils 7.2 to Solaris 8.
+
+ * modules/arpa_inet (arpa/inet.h): Depend on arpa_inet.in.h.
+ * m4/inet_ntop.m4 (gl_INET_NTOP): Search for inet_ntop in -lnsl,
+ for Solaris 8. This is a bit of a hack, as it means it's the
+ caller's responsibility to add -lnsl if needed, but most likely it
+ won't be needed since only getaddrinfo uses this and getaddrinfo
+ isn't needed on Solaris 8.
+
+ * modules/fnmatch (Depends-on): Add mbsrtowcs, to fix a porting
+ problem to Solaris 8 encountered with coreutils 7.2, which
+ resulted in a message "fnmatch.c:292: warning: passing argument 4
+ of 'mbsrtowcs' from incompatible pointer type". Also, add mbsinit
+ at the suggestion of Bruno Haible, since fnmatch uses mbsinit.
+
+2009-04-03 Simon Josefsson <simon@josefsson.org>
+
+ * m4/ld-version-script.m4: Add FIXME comment.
+
+2009-04-02 Simon Josefsson <simon@josefsson.org>
+
+ * doc/ld-output-def.texi: Use DLL_VERSION instead of confusing
+ SOVERSION variable.
+
+2009-04-02 Bruno Haible <bruno@clisp.org>
+
+ * Makefile (info, html, dvi, pdf): Combine the rules.
+ Suggested by Jim Meyering.
+
+2009-04-01 Bruno Haible <bruno@clisp.org>
+
+ * Makefile (info, html, dvi, pdf): New targets.
+ Reported by Reuben Thomas <rrt@sc3d.org>.
+
+2009-04-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (Invoking gnulib-tool): Document how gnulib-tool
+ can be put into PATH.
+ Reported by Reuben Thomas <rrt@sc3d.org>. Suggested by Karl Berry.
+
+2009-04-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/lib-symbol-visibility.texi: Follow texinfo style conventions.
+
+2009-04-01 Bruno Haible <bruno@clisp.org>
+
+ Rename module 'visibility'.
+ * modules/lib-symbol-visibility: Renamed from modules/visibility.
+ * doc/lib-symbol-visibility.texi: Renamed from visibility.texi.
+ * doc/gnulib.texi: Update.
+ * MODULES.html.sh (Misc): Update.
+ * NEWS: Mention the change.
+
+2009-04-01 Simon Josefsson <simon@josefsson.org>
+
+ * modules/lib-msvc-compat: New module. Thanks to Bruno Haible
+ <bruno@clisp.org>, Ralf Wildenhues <Ralf.Wildenhues@gmx.de>, and
+ Eric Blake <ebb9@byu.net> for review.
+ * MODULES.html.sh: Add lib-msvc-compat.
+ * doc/gnulib.texi: Link to new section.
+ * m4/ld-output-def.m4: New file.
+ * doc/ld-output-def.texi: New file.
+
+2009-04-01 Simon Josefsson <simon@josefsson.org>
+
+ Rename ld-version-script to lib-symbol-versions. Suggested by
+ Bruno Haible <bruno@clisp.org>.
+ * modules/ld-version-script: Renamed to lib-symbol-versions.
+ * doc/ld-version-script.texi: Fix module name.
+ * MODULES.html.sh: Add lib-symbol-versions.
+
+2009-03-31 Simon Josefsson <simon@josefsson.org>
+
+ * modules/u64-tests: New file.
+ * tests/test-u64.c: New file.
+
+2009-03-04 Simon Josefsson <simon@josefsson.org>
+
+ * MODULES.html.sh: Mention u64.
+ * modules/u64: New module.
+ * modules/crypto/sha512: Depend on u64 module instead of providing
+ u64.h.
+
+2009-03-27 Eric Blake <ebb9@byu.net>
+
+ test-strerror: make debugging EAI_SYSTEM easier
+ * modules/getaddrinfo-tests (Depends-on): Add strerror.
+ * test-getaddrinfo.c (simple) [ENABLE_DEBUGGING]: Report errno if
+ failure was EAI_SYSTEM.
+
+2009-03-25 Bruno Haible <bruno@clisp.org>
+
+ Fix a problem with --enable-relocatable on Solaris 7.
+ * modules/relocatable-prog-wrapper (Depends-on): Add environ. Needed
+ since 2008-02-24.
+
+2009-03-25 Eric Blake <ebb9@byu.net>
+
+ test-sockets: avoid gcc warning
+ * tests/test-sockets.c (main): Silence compiler warning.
+
+2009-03-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ New modules nproc, pthread, contributed by Glen Lenker.
+
+ * MODULES.html.sh: Add pthread, nproc.
+ * lib/nproc.c: New file.
+ * lib/nproc.h: New file.
+ * lib/pthread.in.h: New file.
+ * m4/pthread.m4: New file.
+ * modules/nproc: New file.
+ * modules/pthread: New file.
+
+2009-03-24 Simon Josefsson <simon@josefsson.org>
+
+ * modules/unicase/locale-language-tests (test_locale_language_LDADD):
+ New variable.
+
+2009-03-24 Kamil Dudka <kdudka@redhat.com>
+
+ filevercmp: handle simple~ and numbered.~3~ backup suffixes
+ * lib/filevercmp.c: Handle simple~ and numbered.~3~ backup suffixes.
+ * tests/test-filevercmp.c: Add tests for backup suffixes.
+
+2009-03-24 Simon Josefsson <simon@josefsson.org>
+
+ * modules/stdlib (Depends-on): Add stdint, needed when defining
+ struct random_data on, for example, HP-UX 10.20. Reported by
+ Albert Chin <bug-gnulib@mlists.thewrittenword.com>.
+
+2009-03-24 Simon Josefsson <simon@josefsson.org>
+
+ * lib/readline.c (readline): Call fflush on stdout after printing
+ prompt.
+
+2009-03-20 Bruno Haible <bruno@clisp.org>
+
+ Remove dependency from 'close' module to -lws2_32 on native Windows.
+ * lib/close-hook.h: New file.
+ * lib/close-hook.c: New file.
+ * lib/close.c: Include close-hook.h. Don't include <sys/socket.h>,
+ w32sock.h.
+ (_gl_close_fd_maybe_socket): Remove function.
+ (rpl_close): Invoke execute_all_close_hooks instead of
+ _gl_close_fd_maybe_socket.
+ * lib/sockets.c: Include close-hook.h, w32sock.h.
+ (close_fd_maybe_socket): New function, essentially from lib/close.c.
+ (close_sockets_hook): New variable.
+ (gl_sockets_startup): Register close_fd_maybe_socket as a hook.
+ (gl_sockets_cleanup): Unregister it.
+ * lib/unistd.in.h (HAVE__GL_CLOSE_FD_MAYBE_SOCKET): Remove macro.
+ * m4/close.m4 (gl_REPLACE_CLOSE): Undo 2009-02-05 change.
+ * modules/close-hook: New file.
+ * modules/close (Files): Remove lib/w32sock.h.
+ (Depends-on): Add close-hook.
+ (Link): Remove section.
+ * modules/sockets (Files): Add lib/w32sock.h.
+ (Depends-on): Add close-hook.
+ * modules/sys_socket (configure.ac): Remove gl_MODULE_INDICATOR
+ invocation.
+ * NEWS: Mention that LIB_CLOSE is gone.
+
+2009-03-23 Eric Blake <ebb9@byu.net>
+
+ signal-tests: test previous patch
+ * tests/test-signal.c: New file.
+ * modules/signal-tests: Likewise.
+
+ signal.h: always support 'volatile sig_atomic_t'
+ * m4/signal_h.m4 (gl_SIGNAL_H): Check for AIX limitation.
+ (gl_SIGNAL_H_DEFAULTS): Add a default.
+ * modules/signal (Makefile.am): Substitute if needed.
+ * lib/signal.in.h (sig_atomic_t): Redefine if needed, so that
+ users can blindly add volatile.
+ * doc/posix-headers/signal.texi (signal.h): Document it.
+ Reported by Matthew Woehlke.
+
+2009-03-23 Jim Meyering <meyering@redhat.com>
+
+ pathmax: PATH_MAX: use pathconf only when available
+ * lib/pathmax.h (PATH_MAX): Select the pathconf-using definition
+ only if HAVE_PATHCONF is defined. Patch by Sylvain Beucler.
+ * m4/pathmax.m4 (gl_PATHMAX): Check for pathconf.
+ This avoids a link failure in a PSP cross-compilation environment
+ described in http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/17048
+
+ * lib/vasnprintf.c (divide): Fix typo in comment.
+
+2009-03-23 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_filter_filelist): Fix comment.
+
+2009-03-20 Bruno Haible <bruno@clisp.org>
+
+ Make sockets.h self-contained.
+ * lib/sockets.c: Include sockets.h first.
+ * lib/sockets.h: Include <sys/socket.h> before using the SOCKET type.
+
+2009-03-19 Eric Blake <ebb9@byu.net>
+
+ doc: mention more functions added in cygwin 1.7.0
+ * doc/posix-functions/log2.texi: Mention recent cygwin 1.7.0
+ addition.
+ * doc/posix-functions/log2f.texi: Likewise.
+
+2009-03-19 Jim Meyering <meyering@redhat.com>
+
+ fsusage: avoid syntax error due to statement-before-declaration
+ * lib/fsusage.c (get_fs_usage): Put warning-avoidance statement
+ after all declarations. Reported by Matthew Woehlke in
+ http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/16231
+
+2009-03-18 Eric Blake <ebb9@byu.net>
+
+ build-aux/compile: sync from automake
+ * build-aux/compile: New file, from automake.
+ * config/srclist.txt: Mention build-aux/compile.
+
+2009-03-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/git-merge-changelog.c: Fix typo in comment.
+ Reported by Reuben Thomas <rrt@sc3d.org>.
+
+2009-03-17 Reuben Thomas <rrt@sc3d.org>
+
+ * m4/regex.m4: update and improve help for
+ --without-included-regex.
+
+2009-03-17 Simon Josefsson <simon@josefsson.org>
+
+ * modules/isnanl-nolibm-tests (Files): Add tests/nan.h to avoid
+ failure on missing include files.
+
+2009-03-17 Eric Blake <ebb9@byu.net>
+
+ doc: mention more functions added in cygwin 1.7.0
+ * doc/posix-functions/fwprintf.texi: Mention recent cygwin 1.7.0
+ addition.
+ * doc/posix-functions/fwscanf.texi: Likewise.
+ * doc/posix-functions/swprintf.texi: Likewise.
+ * doc/posix-functions/swscanf.texi: Likewise.
+ * doc/posix-functions/vfwprintf.texi: Likewise.
+ * doc/posix-functions/vfwscanf.texi: Likewise.
+ * doc/posix-functions/vswprintf.texi: Likewise.
+ * doc/posix-functions/vswscanf.texi: Likewise.
+ * doc/posix-functions/vwprintf.texi: Likewise.
+ * doc/posix-functions/vwscanf.texi: Likewise.
+ * doc/posix-functions/wcscasecmp.texi: Likewise.
+ * doc/posix-functions/wcsdup.texi: Likewise.
+ * doc/posix-functions/wcsftime.texi: Likewise.
+ * doc/posix-functions/wcsncasecmp.texi: Likewise.
+ * doc/posix-functions/wprintf.texi: Likewise.
+ * doc/posix-functions/wscanf.texi: Likewise.
+ * doc/glibc-functions/gethostbyname2.texi: Likewise.
+
+2009-03-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ maint.mk: really add $(AM_MAKEFLAGS)
+ * top/maint.mk (init-coverage, build-coverage): `$(AM_MAKEFLAGS)'
+ was inadvertently omitted in the last commit.
+ Spotted by Bruno Haible.
+
+ maint.mk: use $(MAKE) $(AM_MAKEFLAGS) not make
+ * top/maint.mk (init-coverage, build-coverage): Use `$(MAKE)
+ $(AM_MAKEFLAGS)' rather than plain `make'.
+
+ gnulib-tool: execute $MAKE not make
+ * gnulib-tool: Default $MAKE to 'make'.
+ (func_create_testdir, func_create_megatestdir): Use $MAKE rather
+ than make. Initialize $MAKE in the do-autobuild script.
+
+ gnulib-tool: use $MAKE not make in generated files
+ * gnulib-tool (func_create_megatestdir): Use $MAKE rather than
+ make, in generated files. Initialize $MAKE in the do-autobuild
+ script.
+
+ * top/GNUmakefile (_have-git-version-gen): Fix typo.
+
+ GNUmakefile: disable parallelism only for multiple, recursive targets
+ * top/GNUmakefile (ALL_RECURSIVE_TARGETS): New macro; allow user
+ additions in the Makefile.
+ (AM_RECURSIVE_TARGETS): New macro, override only if not provided
+ by Automake.
+ (.NOTPARALLEL): Only disable parallel builds if multiple targets
+ are listed on the command line and at least one of them is
+ listed in $(ALL_RECURSIVE_TARGETS).
+
+2009-03-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/unilbrk/u8-possible-linebreaks (Depends-on): Replace
+ utf8-ucs4-unsafe with unistr/u8-mbtouc-unsafe.
+ * modules/unilbrk/u8-width-linebreaks (Depends-on): Likewise.
+ * modules/unilbrk/u16-possible-linebreaks (Depends-on): Replace
+ utf16-ucs4-unsafe with unistr/u16-mbtouc-unsafe.
+ * modules/unilbrk/u16-width-linebreaks (Depends-on): Likewise.
+ * modules/unistr/u8-chr (Depends-on): Replace ucs4-utf8 with
+ unistr/u8-uctomb.
+ * modules/unistr/u8-strchr (Depends-on): Likewise.
+ * modules/unistr/u8-strrchr (Depends-on): Likewise.
+ * modules/unistr/u16-chr (Depends-on): Replace ucs4-utf16 with
+ unistr/u16-uctomb.
+ * modules/unistr/u16-strchr (Depends-on): Likewise.
+ * modules/unistr/u16-strrchr (Depends-on): Likewise.
+
+2009-03-12 Bruno Haible <bruno@clisp.org>
+
+ Work around select() bug on Interix 3.5.
+ * lib/sys_select.in.h (select): Also replace if REPLACE_SELECT is 1.
+ * lib/select.c (rpl_select): Add an implementation for Unix platforms.
+ * m4/select.m4: New file.
+ * m4/sys_select_h.m4 (gl_SYS_SELECT_H_DEFAULTS): Initialize REPLACE_SELECT.
+ * modules/sys_select (Makefile.am): Substitute REPLACE_SELECT.
+ * modules/select (Files): Add m4/select.m4.
+ (configure.ac): Move conditional to m4/select.m4. Invoke gl_FUNC_SELECT.
+ * modules/nanosleep (Depends-on): Add select.
+ * modules/poll (Depends-on): Likewise.
+ * doc/posix-functions/select.texi: Mention the Interix bug.
+ Reported by Markus Duft <mduft@gentoo.org>.
+
+ * lib/select.c: Renamed from lib/winsock-select.c.
+ * modules/select (Files): Add lib/select.c, remove
+ lib/winsock-select.c.
+ (configure.ac): Update.
+
+2009-03-12 Jim Meyering <meyering@redhat.com>
+
+ avoid gcc warnings about unused macro definitions
+ * lib/readtokens.c (STREQ): Remove unused definition.
+ * lib/xmalloc.c (SIZE_MAX): Likewise.
+ * lib/openat-die.c (N_): Likewise.
+ * lib/mountlist.c (SIZE_MAX): Remove definition.
+ Instead, include <stdint.h>.
+ * lib/readutmp.c: Likewise.
+ * modules/readutmp (Depends-on): Add stdint.
+ * modules/mountlist (Depends-on): Add stdint.
+ * lib/userspec.c (ISDIGIT): Move definition into #if block where used.
+
+2009-03-10 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'mbmemcasecoll'.
+ * modules/mbmemcasecoll-tests: New file.
+ * tests/test-mbmemcasecoll1.sh: New file.
+ * tests/test-mbmemcasecoll2.sh: New file.
+ * tests/test-mbmemcasecoll3.sh: New file.
+ * tests/test-mbmemcasecoll.c: New file.
+
+ New module 'mbmemcasecoll'.
+ * lib/mbmemcasecoll.h: New file.
+ * lib/mbmemcasecoll.c: New file.
+ * modules/mbmemcasecoll: New file.
+
+ * tests/test-mbmemcasecmp.h: New file, extracted from
+ tests/test-mbmemcasecmp.c.
+ * tests/test-mbmemcasecmp.c: Include test-mbmemcasecmp.h.
+ (test_ascii, test_iso_8859_1, test_utf_8): Remove functions.
+ (main): Update.
+ * modules/mbmemcasecmp-tests (Files): Add tests/test-mbmemcasecmp.h.
+
+2009-03-09 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'mbmemcasecmp'.
+ * modules/mbmemcasecmp-tests: New file.
+ * tests/test-mbmemcasecmp1.sh: New file.
+ * tests/test-mbmemcasecmp2.sh: New file.
+ * tests/test-mbmemcasecmp3.sh: New file.
+ * tests/test-mbmemcasecmp.c: New file.
+
+ New module 'mbmemcasecmp'.
+ * lib/mbmemcasecmp.h: New file.
+ * lib/mbmemcasecmp.c: New file.
+ * modules/mbmemcasecmp: New file.
+
+2009-03-09 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'unicase/ulc-casecoll'.
+ * modules/unicase/ulc-casecoll-tests: New file.
+ * tests/unicase/test-ulc-casecoll1.sh: New file.
+ * tests/unicase/test-ulc-casecoll2.sh: New file.
+ * tests/unicase/test-ulc-casecoll.c: New file.
+
+ New module 'unicase/ulc-casecoll'.
+ * lib/unicase.h (ulc_casecoll): New declaration.
+ * lib/unicase/ulc-casecoll.c: New file.
+ * modules/unicase/ulc-casecoll: New file.
+
+ New module 'unicase/ulc-casexfrm'.
+ * lib/unicase.h (ulc_casexfrm): New declaration.
+ * lib/unicase/ulc-casexfrm.c: New file.
+ * modules/unicase/ulc-casexfrm: New file.
+
+2009-03-09 Bruno Haible <bruno@clisp.org>
+
+ Followup to 2008-12-22 commit: Remove unnecessary AC_FUNC_MBRTOWC
+ invocations.
+
+ * m4/mbscasecmp.m4: Remove file.
+ * modules/mbscasecmp (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSCASECMP invocation.
+
+ * m4/mbscasestr.m4: Remove file.
+ * modules/mbscasestr (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSCASESTR invocation.
+
+ * m4/mbschr.m4: Remove file.
+ * modules/mbschr (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSCHR invocation.
+
+ * m4/mbscspn.m4: Remove file.
+ * modules/mbscspn (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSCSPN invocation.
+
+ * m4/mbslen.m4: Remove file.
+ * modules/mbslen (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSLEN invocation.
+
+ * m4/mbsncasecmp.m4: Remove file.
+ * modules/mbsncasecmp (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSNCASECMP invocation.
+
+ * m4/mbsnlen.m4: Remove file.
+ * modules/mbsnlen (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSNLEN invocation.
+
+ * m4/mbspbrk.m4: Remove file.
+ * modules/mbspbrk (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSPBRK invocation.
+
+ * m4/mbspcasecmp.m4: Remove file.
+ * modules/mbspcasecmp (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSPCASECMP invocation.
+
+ * m4/mbsrchr.m4: Remove file.
+ * modules/mbsrchr (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSRCHR invocation.
+
+ * m4/mbssep.m4: Remove file.
+ * modules/mbssep (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSSEP invocation.
+
+ * m4/mbsspn.m4: Remove file.
+ * modules/mbsspn (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSSPN invocation.
+
+ * m4/mbsstr.m4: Remove file.
+ * modules/mbsstr (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSSTR invocation.
+
+ * m4/mbstok_r.m4: Remove file.
+ * modules/mbstok_r (Files): Remove it and m4/mbrtowc.m4
+ (configure.ac): Remove gl_FUNC_MBSTOK_R invocation.
+
+ * m4/mbswidth.m4 (gl_MBSWIDTH): Remove AC_FUNC_MBRTOWC invocation.
+
+ * m4/quotearg.m4 (gl_QUOTEARG): Remove mbsinit test and
+ AC_TYPE_MBSTATE_T, AC_FUNC_MBRTOWC invocations.
+
+ * modules/trim (configure.ac): Remove AC_FUNC_MBRTOWC invocation.
+
+2009-03-08 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'unicase/ulc-casecmp'.
+ * modules/unicase/ulc-casecmp-tests: New file.
+ * tests/unicase/test-ulc-casecmp1.sh: New file.
+ * tests/unicase/test-ulc-casecmp2.sh: New file.
+ * tests/unicase/test-ulc-casecmp.c: New file.
+
+ New module 'unicase/ulc-casecmp'.
+ * lib/unicase.h (ulc_casecmp): New declaration.
+ * lib/unicase/ulc-casecmp.c: New file.
+ * lib/unicase/u-casecmp.h (FUNC): Change argument types to
+ 'const SRC_UNIT *'.
+ * lib/unicase/u8-casecmp.c (SRC_UNIT): Define like UNIT.
+ * lib/unicase/u16-casecmp.c (SRC_UNIT): Likewise.
+ * lib/unicase/u32-casecmp.c (SRC_UNIT): Likewise.
+ * modules/unicase/ulc-casecmp: New file.
+
+ Tests for module 'unicase/u32-is-cased'.
+ * modules/unicase/u32-is-cased-tests: New file.
+ * tests/unicase/test-u32-is-cased.c: New file.
+
+ Tests for module 'unicase/u16-is-cased'.
+ * modules/unicase/u16-is-cased-tests: New file.
+ * tests/unicase/test-u16-is-cased.c: New file.
+
+ Tests for module 'unicase/u8-is-cased'.
+ * modules/unicase/u8-is-cased-tests: New file.
+ * tests/unicase/test-u8-is-cased.c: New file.
+ * tests/unicase/test-is-cased.h: New file.
+
+ New module 'unicase/u32-is-cased'.
+ * lib/unicase/u32-is-cased.c: New file.
+ * modules/unicase/u32-is-cased: New file.
+
+ New module 'unicase/u16-is-cased'.
+ * lib/unicase/u16-is-cased.c: New file.
+ * modules/unicase/u16-is-cased: New file.
+
+ New module 'unicase/u8-is-cased'.
+ * lib/unicase/u8-is-cased.c: New file.
+ * lib/unicase/u-is-cased.h: New file.
+ * modules/unicase/u8-is-cased: New file.
+
+ Tests for module 'unicase/u32-is-casefolded'.
+ * modules/unicase/u32-is-casefolded-tests: New file.
+ * tests/unicase/test-u32-is-casefolded.c: New file.
+
+ Tests for module 'unicase/u16-is-casefolded'.
+ * modules/unicase/u16-is-casefolded-tests: New file.
+ * tests/unicase/test-u16-is-casefolded.c: New file.
+
+ Tests for module 'unicase/u8-is-casefolded'.
+ * modules/unicase/u8-is-casefolded-tests: New file.
+ * tests/unicase/test-u8-is-casefolded.c: New file.
+ * tests/unicase/test-is-casefolded.h: New file.
+
+ New module 'unicase/u32-is-casefolded'.
+ * lib/unicase/u32-is-casefolded.c: New file.
+ * modules/unicase/u32-is-casefolded: New file.
+
+ New module 'unicase/u16-is-casefolded'.
+ * lib/unicase/u16-is-casefolded.c: New file.
+ * modules/unicase/u16-is-casefolded: New file.
+
+ New module 'unicase/u8-is-casefolded'.
+ * lib/unicase/u8-is-casefolded.c: New file.
+ * modules/unicase/u8-is-casefolded: New file.
+
+ Tests for module 'unicase/u32-is-titlecase'.
+ * modules/unicase/u32-is-titlecase-tests: New file.
+ * tests/unicase/test-u32-is-titlecase.c: New file.
+
+ Tests for module 'unicase/u16-is-titlecase'.
+ * modules/unicase/u16-is-titlecase-tests: New file.
+ * tests/unicase/test-u16-is-titlecase.c: New file.
+
+ Tests for module 'unicase/u8-is-titlecase'.
+ * modules/unicase/u8-is-titlecase-tests: New file.
+ * tests/unicase/test-u8-is-titlecase.c: New file.
+ * tests/unicase/test-is-titlecase.h: New file.
+
+ New module 'unicase/u32-is-titlecase'.
+ * lib/unicase/u32-is-titlecase.c: New file.
+ * modules/unicase/u32-is-titlecase: New file.
+
+ New module 'unicase/u16-is-titlecase'.
+ * lib/unicase/u16-is-titlecase.c: New file.
+ * modules/unicase/u16-is-titlecase: New file.
+
+ New module 'unicase/u8-is-titlecase'.
+ * lib/unicase/u8-is-titlecase.c: New file.
+ * modules/unicase/u8-is-titlecase: New file.
+
+ Tests for module 'unicase/u32-is-lowercase'.
+ * modules/unicase/u32-is-lowercase-tests: New file.
+ * tests/unicase/test-u32-is-lowercase.c: New file.
+
+ Tests for module 'unicase/u16-is-lowercase'.
+ * modules/unicase/u16-is-lowercase-tests: New file.
+ * tests/unicase/test-u16-is-lowercase.c: New file.
+
+ Tests for module 'unicase/u8-is-lowercase'.
+ * modules/unicase/u8-is-lowercase-tests: New file.
+ * tests/unicase/test-u8-is-lowercase.c: New file.
+ * tests/unicase/test-is-lowercase.h: New file.
+
+ New module 'unicase/u32-is-lowercase'.
+ * lib/unicase/u32-is-lowercase.c: New file.
+ * modules/unicase/u32-is-lowercase: New file.
+
+ New module 'unicase/u16-is-lowercase'.
+ * lib/unicase/u16-is-lowercase.c: New file.
+ * modules/unicase/u16-is-lowercase: New file.
+
+ New module 'unicase/u8-is-lowercase'.
+ * lib/unicase/u8-is-lowercase.c: New file.
+ * modules/unicase/u8-is-lowercase: New file.
+
+ Tests for module 'unicase/u32-is-uppercase'.
+ * modules/unicase/u32-is-uppercase-tests: New file.
+ * tests/unicase/test-u32-is-uppercase.c: New file.
+
+ Tests for module 'unicase/u16-is-uppercase'.
+ * modules/unicase/u16-is-uppercase-tests: New file.
+ * tests/unicase/test-u16-is-uppercase.c: New file.
+
+ Tests for module 'unicase/u8-is-uppercase'.
+ * modules/unicase/u8-is-uppercase-tests: New file.
+ * tests/unicase/test-u8-is-uppercase.c: New file.
+ * tests/unicase/test-is-uppercase.h: New file.
+
+ New module 'unicase/u32-is-uppercase'.
+ * lib/unicase/u32-is-uppercase.c: New file.
+ * modules/unicase/u32-is-uppercase: New file.
+
+ New module 'unicase/u16-is-uppercase'.
+ * lib/unicase/u16-is-uppercase.c: New file.
+ * modules/unicase/u16-is-uppercase: New file.
+
+ New module 'unicase/u8-is-uppercase'.
+ * lib/unicase/u8-is-uppercase.c: New file.
+ * modules/unicase/u8-is-uppercase: New file.
+
+ New module 'unicase/u32-is-invariant'.
+ * lib/unicase/u32-is-invariant.c: New file.
+ * modules/unicase/u32-is-invariant: New file.
+
+ New module 'unicase/u16-is-invariant'.
+ * lib/unicase/u16-is-invariant.c: New file.
+ * modules/unicase/u16-is-invariant: New file.
+
+ New module 'unicase/u8-is-invariant'.
+ * lib/unicase/u8-is-invariant.c: New file.
+ * lib/unicase/invariant.h: New file.
+ * lib/unicase/u-is-invariant.h: New file.
+ * modules/unicase/u8-is-invariant: New file.
+
+ Tests for module 'unicase/u32-casecoll'.
+ * modules/unicase/u32-casecoll-tests: New file.
+ * tests/unicase/test-u32-casecoll.c: New file.
+
+ Tests for module 'unicase/u16-casecoll'.
+ * modules/unicase/u16-casecoll-tests: New file.
+ * tests/unicase/test-u16-casecoll.c: New file.
+
+ Tests for module 'unicase/u8-casecoll'.
+ * modules/unicase/u8-casecoll-tests: New file.
+ * tests/unicase/test-u8-casecoll.c: New file.
+
+ New module 'unicase/u32-casecoll'.
+ * lib/unicase/u32-casecoll.c: New file.
+ * modules/unicase/u32-casecoll: New file.
+
+ New module 'unicase/u16-casecoll'.
+ * lib/unicase/u16-casecoll.c: New file.
+ * modules/unicase/u16-casecoll: New file.
+
+ New module 'unicase/u8-casecoll'.
+ * lib/unicase/u8-casecoll.c: New file.
+ * lib/unicase/u-casecoll.h: New file.
+ * modules/unicase/u8-casecoll: New file.
+
+ New module 'unicase/u32-casexfrm'.
+ * lib/unicase/u32-casexfrm.c: New file.
+ * modules/unicase/u32-casexfrm: New file.
+
+ New module 'unicase/u16-casexfrm'.
+ * lib/unicase/u16-casexfrm.c: New file.
+ * modules/unicase/u16-casexfrm: New file.
+
+ New module 'unicase/u8-casexfrm'.
+ * lib/unicase/u8-casexfrm.c: New file.
+ * lib/unicase/u-casexfrm.h: New file.
+ * modules/unicase/u8-casexfrm: New file.
+
+ Tests for module 'unicase/u32-casecmp'.
+ * modules/unicase/u32-casecmp-tests: New file.
+ * tests/unicase/test-u32-casecmp.c: New file.
+
+ Tests for module 'unicase/u16-casecmp'.
+ * modules/unicase/u16-casecmp-tests: New file.
+ * tests/unicase/test-u16-casecmp.c: New file.
+
+ Tests for module 'unicase/u8-casecmp'.
+ * modules/unicase/u8-casecmp-tests: New file.
+ * tests/unicase/test-u8-casecmp.c: New file.
+ * tests/unicase/test-casecmp.h: New file.
+
+ New module 'unicase/u32-casecmp'.
+ * lib/unicase/u32-casecmp.c: New file.
+ * modules/unicase/u32-casecmp: New file.
+
+ New module 'unicase/u16-casecmp'.
+ * lib/unicase/u16-casecmp.c: New file.
+ * modules/unicase/u16-casecmp: New file.
+
+ New module 'unicase/u8-casecmp'.
+ * lib/unicase/u8-casecmp.c: New file.
+ * lib/unicase/u-casecmp.h: New file.
+ * modules/unicase/u8-casecmp: New file.
+
+ Tests for module 'unicase/u32-casefold'.
+ * modules/unicase/u32-casefold-tests: New file.
+ * tests/unicase/test-u32-casefold.c: New file.
+
+ Tests for module 'unicase/u16-casefold'.
+ * modules/unicase/u16-casefold-tests: New file.
+ * tests/unicase/test-u16-casefold.c: New file.
+
+ Tests for module 'unicase/u8-casefold'.
+ * modules/unicase/u8-casefold-tests: New file.
+ * tests/unicase/test-u8-casefold.c: New file.
+
+ New module 'unicase/u32-casefold'.
+ * lib/unicase/u32-casefold.c: New file.
+ * modules/unicase/u32-casefold: New file.
+
+ New module 'unicase/u16-casefold'.
+ * lib/unicase/u16-casefold.c: New file.
+ * modules/unicase/u16-casefold: New file.
+
+ New module 'unicase/u8-casefold'.
+ * lib/unicase/u8-casefold.c: New file.
+ * lib/unicase/u-casefold.h: New file.
+ * modules/unicase/u8-casefold: New file.
+
+ New module 'unicase/tocasefold'.
+ * lib/unicase/casefold.h: New file.
+ * lib/unicase/tocasefold.c: New file.
+ * lib/unicase/tocasefold.h: New file, generated by gen-uni-tables.c.
+ * modules/unicase/tocasefold: New file.
+
+ Tests for module 'unicase/u32-totitle'.
+ * modules/unicase/u32-totitle-tests: New file.
+ * tests/unicase/test-u32-totitle.c: New file.
+
+ Tests for module 'unicase/u16-totitle'.
+ * modules/unicase/u16-totitle-tests: New file.
+ * tests/unicase/test-u16-totitle.c: New file.
+
+ Tests for module 'unicase/u8-totitle'.
+ * modules/unicase/u8-totitle-tests: New file.
+ * tests/unicase/test-u8-totitle.c: New file.
+
+ New module 'unicase/u32-totitle'.
+ * lib/unicase/u32-totitle.c: New file.
+ * modules/unicase/u32-totitle: New file.
+
+ New module 'unicase/u16-totitle'.
+ * lib/unicase/u16-totitle.c: New file.
+ * modules/unicase/u16-totitle: New file.
+
+ New module 'unicase/u8-totitle'.
+ * lib/unicase/u8-totitle.c: New file.
+ * lib/unicase/u-totitle.h: New file.
+ * modules/unicase/u8-totitle: New file.
+
+ Tests for module 'unicase/u32-tolower'.
+ * modules/unicase/u32-tolower-tests: New file.
+ * tests/unicase/test-u32-tolower.c: New file.
+
+ Tests for module 'unicase/u16-tolower'.
+ * modules/unicase/u16-tolower-tests: New file.
+ * tests/unicase/test-u16-tolower.c: New file.
+
+ Tests for module 'unicase/u8-tolower'.
+ * modules/unicase/u8-tolower-tests: New file.
+ * tests/unicase/test-u8-tolower.c: New file.
+
+ New module 'unicase/u32-tolower'.
+ * lib/unicase/u32-tolower.c: New file.
+ * modules/unicase/u32-tolower: New file.
+
+ New module 'unicase/u16-tolower'.
+ * lib/unicase/u16-tolower.c: New file.
+ * modules/unicase/u16-tolower: New file.
+
+ New module 'unicase/u8-tolower'.
+ * lib/unicase/u8-tolower.c: New file.
+ * modules/unicase/u8-tolower: New file.
+
+ Tests for module 'unicase/u32-toupper'.
+ * modules/unicase/u32-toupper-tests: New file.
+ * tests/unicase/test-u32-toupper.c: New file.
+
+ Tests for module 'unicase/u16-toupper'.
+ * modules/unicase/u16-toupper-tests: New file.
+ * tests/unicase/test-u16-toupper.c: New file.
+
+ Tests for module 'unicase/u8-toupper'.
+ * modules/unicase/u8-toupper-tests: New file.
+ * tests/unicase/test-u8-toupper.c: New file.
+
+ New module 'unicase/u32-toupper'.
+ * lib/unicase/u32-toupper.c: New file.
+ * modules/unicase/u32-toupper: New file.
+
+ New module 'unicase/u16-toupper'.
+ * lib/unicase/u16-toupper.c: New file.
+ * modules/unicase/u16-toupper: New file.
+
+ New module 'unicase/u8-toupper'.
+ * lib/unicase/u8-toupper.c: New file.
+ * modules/unicase/u8-toupper: New file.
+
+ New module 'unicase/u32-casemap'.
+ * lib/unicase/u32-casemap.c: New file.
+ * modules/unicase/u32-casemap: New file.
+
+ New module 'unicase/u16-casemap'.
+ * lib/unicase/u16-casemap.c: New file.
+ * modules/unicase/u16-casemap: New file.
+
+ New module 'unicase/u8-casemap'.
+ * lib/unicase/unicasemap.h: New file.
+ * lib/unicase/u8-casemap.c: New file.
+ * lib/unicase/u-casemap.h: New file.
+ * modules/unicase/u8-casemap: New file.
+
+ New module 'unicase/special-casing'.
+ * lib/unicase/special-casing.h: New file.
+ * lib/unicase/special-casing.c: New file.
+ * lib/unicase/special-casing-table.gperf: New file, generated by
+ gen-uni-tables.c.
+ * modules/unicase/special-casing: New file.
+
+ Tests for module 'unicase/locale-language'.
+ * modules/unicase/locale-language-tests: New file.
+ * tests/unicase/test-locale-language.sh: New file.
+ * tests/unicase/test-locale-language.c: New file.
+
+ New module 'unicase/locale-language'.
+ * lib/unicase/locale-language.c: New file.
+ * lib/unicase/locale-languages.gperf: New file.
+ * modules/unicase/locale-language: New file.
+
+ Generate more tables for case conversion and case folding.
+ * lib/gen-uni-tables.c (SCC_*): New enum items.
+ (struct special_casing_rule): New type.
+ (casing_rules, num_casing_rules, allocated_casing_rules): New
+ variables.
+ (add_casing_rule, fill_casing_rules): New functions.
+ (struct casefold_rule): New type.
+ (casefolding_rules, num_casefolding_rules,
+ allocated_casefolding_rules): New variables.
+ (fill_casefolding_rules): New function.
+ (unicode_casefold): New variable.
+ (to_casefold, redistribute_casefolding_rules, compare_casing_rules,
+ sort_casing_rules, output_casing_rules): New functions.
+ (main): Accept to more arguments: SpecialCasing.txt and
+ CaseFolding.txt. Invoke fill_casing_rules, fill_casefolding_rules,
+ redistribute_casefolding_rules, sort_casing_rules, output_casing_rules.
+ Output mapping for casefolding.
+
+ * lib/unicase.h: Include stdbool.h, uninorm.h.
+ (u8_toupper, u16_toupper, u32_toupper, u8_tolower, u16_tolower,
+ u32_tolower, u8_totitle, u16_totitle, u32_totitle): Add nf argument.
+ (u8_casefold, u16_casefold, u32_casefold): Add iso639_language and nf
+ arguments.
+ (u8_casecmp, u16_casecmp, u32_casecmp): Add iso639_language, nf,
+ resultp arguments.
+ (u8_casexfrm, u16_casexfrm, u32_casexfrm): New declarations.
+ (u8_casecoll, u16_casecoll, u32_casecoll): Add iso639_language, nf,
+ resultp arguments.
+ (u8_is_uppercase, u16_is_uppercase, u32_is_uppercase, u8_is_lowercase,
+ u16_is_lowercase, u32_is_lowercase, u8_is_titlecase, u16_is_titlecase,
+ u32_is_titlecase, u8_is_casefolded, u16_is_casefolded,
+ u32_is_casefolded, u8_is_cased, u16_is_cased, u32_is_cased): New
+ declarations.
+ * modules/unicase/base (Depends-on): Add uninorm/base, stdbool.
+
+2009-03-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/uninorm.h (u8_normcmp, u16_normcmp, u32_normcmp, u8_normcoll,
+ u16_normcoll, u32_normcoll): Rename argument 'result' to 'resultp'.
+ * lib/uninorm/u-normcmp.h (FUNC): Likewise.
+ * lib/uninorm/u-normcoll.h (FUNC): Likewise.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ Adjust u*_normcmp, u*_normcoll API.
+ * lib/uninorm.h (u8_normcmp, u16_normcmp, u32_normcmp, u8_normcoll,
+ u16_normcoll, u32_normcoll): Change failure conventions.
+ * lib/uninorm/u-normcmp.h (FUNC): Upon failure, store the error code in
+ errno and return -1.
+ * lib/uninorm/u-normcoll.h (FUNC): Likewise.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'uninorm/u32-normcoll'.
+ * modules/uninorm/u32-normcoll-tests: New file.
+ * tests/uninorm/test-u32-normcoll.c: New file.
+
+ Tests for module 'uninorm/u16-normcoll'.
+ * modules/uninorm/u16-normcoll-tests: New file.
+ * tests/uninorm/test-u16-normcoll.c: New file.
+
+ Tests for module 'uninorm/u8-normcoll'.
+ * modules/uninorm/u8-normcoll-tests: New file.
+ * tests/uninorm/test-u8-normcoll.c: New file.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ * tests/uninorm/test-u32-normcmp.h: New file, extracted from
+ tests/uninorm/test-u32-normcmp.c.
+ * tests/uninorm/test-u32-normcmp.c: Include it.
+ (test_nonascii): New function, extracted from main. Add some more
+ tests.
+ (main): Invoke test_ascii and test_nonascii.
+ * modules/uninorm/u32-normcmp-tests (Files): Add
+ tests/uninorm/test-u32-normcmp.h.
+ (Depends-on): Remove uninorm/u32-normcmp.
+
+ * tests/uninorm/test-u16-normcmp.h: New file, extracted from
+ tests/uninorm/test-u16-normcmp.c.
+ * tests/uninorm/test-u16-normcmp.c: Include it.
+ (test_nonascii): New function, extracted from main. Add some more
+ tests.
+ (main): Invoke test_ascii and test_nonascii.
+ * modules/uninorm/u16-normcmp-tests (Files): Add
+ tests/uninorm/test-u16-normcmp.h.
+ (Depends-on): Remove uninorm/u16-normcmp.
+
+ * tests/uninorm/test-u8-normcmp.h: New file, extracted from
+ tests/uninorm/test-u8-normcmp.c.
+ * tests/uninorm/test-u8-normcmp.c: Include it.
+ (test_nonascii): New function, extracted from main. Add some more
+ tests.
+ (main): Invoke test_ascii and test_nonascii.
+ * modules/uninorm/u8-normcmp-tests (Files): Add
+ tests/uninorm/test-u8-normcmp.h.
+ (Depends-on): Remove uninorm/u8-normcmp.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ New module 'uninorm/u32-normcoll'.
+ * lib/uninorm/u32-normcoll.c: New file.
+ * modules/uninorm/u32-normcoll: New file.
+
+ New module 'uninorm/u16-normcoll'.
+ * lib/uninorm/u16-normcoll.c: New file.
+ * modules/uninorm/u16-normcoll: New file.
+
+ New module 'uninorm/u8-normcoll'.
+ * lib/uninorm.h (u8_normcoll, u16_normcoll, u32_normcoll): New
+ declarations.
+ * lib/uninorm/u8-normcoll.c: New file.
+ * lib/uninorm/u-normcoll.h: New file.
+ * modules/uninorm/u8-normcoll: New file.
+
+ New module 'uninorm/u32-normxfrm'.
+ * lib/uninorm/u32-normxfrm.c: New file.
+ * modules/uninorm/u32-normxfrm: New file.
+
+ New module 'uninorm/u16-normxfrm'.
+ * lib/uninorm/u16-normxfrm.c: New file.
+ * modules/uninorm/u16-normxfrm: New file.
+
+ New module 'uninorm/u8-normxfrm'.
+ * lib/uninorm.h (u8_normxfrm, u16_normxfrm, u32_normxfrm): New
+ declarations.
+ * lib/uninorm/u8-normxfrm.c: New file.
+ * lib/uninorm/u-normxfrm.h: New file.
+ * modules/uninorm/u8-normxfrm: New file.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ * modules/uninorm/u8-normcmp (Depends-on): Add uninorm/base.
+ * modules/uninorm/u16-normcmp (Depends-on): Likewise.
+ * modules/uninorm/u32-normcmp (Depends-on): Likewise.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ New module 'memxfrm'.
+ * lib/memxfrm.h: New file.
+ * lib/memxfrm.c: New file.
+ * modules/memxfrm: New file.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ New module 'memcmp2'.
+ * lib/memcmp2.h: New file.
+ * lib/memcmp2.c: New file.
+ * modules/memcmp2: New file.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'uninorm/decomposing-form'.
+ * modules/uninorm/decomposing-form-tests: New file.
+ * tests/uninorm/test-decomposing-form.c: New file.
+
+ New module 'uninorm/decomposing-form'.
+ * lib/uninorm.h (uninorm_decomposing_form): New declaration.
+ * lib/uninorm/normalize-internal.h (struct unicode_normalization_form):
+ Add 'decomposing_variant' field.
+ * lib/uninorm/decomposing-form.c: New file.
+ * lib/uninorm/nfc.c (uninorm_nfc): Update.
+ * lib/uninorm/nfd.c (uninorm_nfd): Update.
+ * lib/uninorm/nfkc.c (uninorm_nfkc): Update.
+ * lib/uninorm/nfkd.c (uninorm_nfkd): Update.
+ * modules/uninorm/decomposing-form: New file.
+ * modules/uninorm/nfc (Depends-on): Add uninorm/nfd.
+ * modules/uninorm/nfkc (Depends-on): Add uninorm/nfkd.
+
+2009-03-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/uninorm/u-normcmp.h (FUNC): Use stack=allocated buffers for small
+ strings.
+
+2009-03-06 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'uninorm/u32-normcmp'.
+ * tests/uninorm/test-u32-normcmp.c: New file.
+ * modules/uninorm/u32-normcmp-tests: New file.
+
+ Tests for module 'uninorm/u16-normcmp'.
+ * tests/uninorm/test-u16-normcmp.c: New file.
+ * modules/uninorm/u16-normcmp-tests: New file.
+
+ Tests for module 'uninorm/u8-normcmp'.
+ * tests/uninorm/test-u8-normcmp.c: New file.
+ * modules/uninorm/u8-normcmp-tests: New file.
+
+ New module 'uninorm/u32-normcmp'.
+ * lib/uninorm/u32-normcmp.c: New file.
+ * modules/uninorm/u32-normcmp: New file.
+
+ New module 'uninorm/u16-normcmp'.
+ * lib/uninorm/u16-normcmp.c: New file.
+ * modules/uninorm/u16-normcmp: New file.
+
+ New module 'uninorm/u8-normcmp'.
+ * lib/uninorm.h (u8_normcmp, u16_normcmp, u32_normcmp): New
+ declarations.
+ * lib/uninorm/u8-normcmp.c: New file.
+ * lib/uninorm/u-normcmp.h: New file.
+ * modules/uninorm/u8-normcmp: New file.
+
+2009-03-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/w32spawn.h (dup_noinherit): Add cast, to avoid gcc warning.
+ Reported by Eric Blake.
+
+2009-03-06 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/spawni.c (__spawni) [WIN32_NATIVE]: Define as a stub.
+ * modules/posix_spawn-tests (configure.ac): Define POSIX_SPAWN_PORTED
+ condition.
+ (Makefile.am): Do nothing if POSIX_SPAWN_PORTED is false.
+ * modules/posix_spawnp-tests (configure.ac): Define POSIX_SPAWN_PORTED
+ condition.
+ (Makefile.am): Do nothing if POSIX_SPAWN_PORTED is false.
+
+2009-03-06 Eric Blake <ebb9@byu.net>
+
+ * lib/execute.c (execute) [WIN32_NATIVE]: Cast arguments of spawnvpe,
+ to avoid compiler warnings.
+ * lib/pipe.c (create_pipe) [WIN32_NATIVE]: Likewise.
+
+2009-03-05 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-ftell.c (main): Disable test beyond end of file on
+ FreeMiNT.
+ Patch by Alan Hourihane <alanh@fairlite.co.uk>.
+
+2009-03-05 Kamil Dudka <kdudka@redhat.com>
+
+ * lib/filevercmp.c: Move hidden files up in ordering.
+ * tests/test-filevercmp.c: Add tests for hidden files.
+
+2009-03-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/visibility (Makefile.am): Augment AM_CFLAGS.
+ * gnulib-tool (func_emit_lib_Makefile_am): Emit initialization of
+ AM_CFLAGS.
+ Reported by Simon Josefsson.
+
+2009-03-03 Bruno Haible <bruno@clisp.org>
+
+ * doc/visibility.texi: Recommend to use HAVE_VISIBILITY as a C macro.
+ Reported by Simon Josefsson.
+
+ * doc/ld-version-script.texi: Update node reference.
+
+2009-03-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/visibility (License): Change to 'unlimited'.
+ Suggested by Simon Josefsson.
+
+2009-03-03 Jim Meyering <meyering@redhat.com>
+
+ unlinkdir: cannot_unlink_dir may modify process state
+ * lib/unlinkdir.c (cannot_unlink_dir): Add a comment warning that
+ it's neither thread-safe nor appropriate for use in a library.
+
+2009-03-03 Eric Blake <ebb9@byu.net>
+
+ test-closein: silence test under Darwin
+ * tests/test-closein.sh: Ignore stderr from cat, since we don't
+ care if it dies from EPIPE or EBADF.
+
+2009-03-03 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi: Include visibility.texi and ld-version-script.texi
+ earlier.
+ * doc/visibility.texi: Fix @node and @section.
+
+2009-03-03 Simon Josefsson <simon@josefsson.org>
+
+ * doc/gnulib.texi: Link to sections for ld version script and
+ visibility.
+ * doc/visibility.texi: Add @node and @section.
+ * modules/ld-version-script: New module.
+ * m4/ld-version-script.m4: New file.
+ * doc/ld-version-script.texi: New file.
+
+2009-03-02 David Lutterkort <lutter@redhat.com>
+
+ * lib/safe-alloc.h (__GNUC_PREREQ): New macro.
+ Reported by Tom G. Christensen <tgc@jupiterrise.com>.
+
+2009-03-02 Bruno Haible <bruno@clisp.org>
+
+ * doc/visibility.texi: Mention libtool's -export-symbols option.
+
+2009-03-02 Jim Meyering <meyering@redhat.com>
+
+ announce-gen: new option: --no-print-checksums
+ * build-aux/announce-gen (usage): Describe it.
+ (print_checksums): Print a newline here, not in the [*] footnote.
+ (main): Honor it.
+
+2009-03-01 Bruno Haible <bruno@clisp.org>
+
+ Use socklen_t in the native Windows replacements prototypes.
+ * lib/sys_socket.in.h (rpl_getsockopt, rpl_setsockopt): Use socklen_t
+ instead of 'int'.
+ * lib/getsockopt.c (rpl_getsockopt): Likewise.
+ * lib/setsockopt.c (rpl_setsockopt): Likewise.
+ * modules/getsockopt (Depends-on): Add socklen.
+ * modules/setsockopt (Depends-on): Add socklen.
+
+2009-03-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (sed): Do alias as "sed --posix" if sed's version is at
+ least 4.2.
+
+2009-03-01 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.h (wait_subprocess): Describe effect of termsigp on
+ error messages.
+ * lib/wait-process.c (wait_subprocess): Omit error message about
+ deadly signal sent to the child of termsigp != NULL.
+
+2009-03-01 Eric Blake <ebb9@byu.net>
+
+ * lib/wait-process.c (wait_subprocess): Remove unnecessary cast.
+
+2009-03-01 Bruno Haible <bruno@clisp.org>
+
+ Avoid a gcc warning.
+ * tests/test-sched.c (b): Make global.
+ Reported by Eric Blake.
+
+2009-01-19 Martin Lambers <marlam@marlam.de>
+
+ Provide POSIX semantics for socket timeout options on W32.
+ * lib/setsockopt.c: Convert struct timeval to milliseconds on W32.
+ * lib/getsockopt.c: Convert milliseconds to struct timeval on W32.
+ * modules/setsockopt: Depend on sys_time module for struct timeval.
+ * modules/getsockopt: Depend on sys_time module for struct timeval.
+
+2009-03-01 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gai_strerror.c (values): Use EAI_INPROGRESS instead of
+ __USE_GNU, for consistency with netdb.in.h.
+ Reported by Alan Hourihane <alanh@fairlite.co.uk>.
+
+2009-03-01 Bruno Haible <bruno@clisp.org>
+
+ More support for FreeMiNT.
+ * lib/fseeko.c (rpl_fseeko): Complete last commit.
+ Reported by Alan Hourihane <alanh@fairlite.co.uk>.
+
+2009-03-01 Bruno Haible <bruno@clisp.org>
+
+ More support for FreeMiNT.
+ * lib/fpurge.c (fpurge): Correct last commit.
+ Reported by Alan Hourihane <alanh@fairlite.co.uk>.
+
+2009-03-01 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Fix unportable awk script in vc-list-files.
+ * build-aux/vc-list-files: In the replacement awk script, use
+ substr with a second argument of 1, not zero.
+ Report by Simon Josefsson.
+
+2009-02-28 Bruno Haible <bruno@clisp.org>
+
+ More support for FreeMiNT.
+ * lib/freading.c (freading) [__MINT__]: Use new macros that were added
+ to FreeMiNT today.
+ * lib/fwriting.c (fwriting): Likewise.
+ Based on patch by Alan Hourihane <alanh@fairlite.co.uk>.
+
+2009-02-28 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-freadseek.c (main): Disable test beyond end of file on
+ FreeMiNT.
+ * tests/test-ftello.c (main): Likewise.
+ Patch by Alan Hourihane <alanh@fairlite.co.uk>.
+
+2009-02-28 Bruno Haible <bruno@clisp.org>
+
+ Add tentative support for FreeMiNT.
+ * lib/fbufmode.c (fbufmode) [__MINT__]: Add conditional code.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/freadable.c (freadable): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/freadptr.c (freadptr): Likewise.
+ * lib/freadseek.c (freadptrinc): Likewise.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ * lib/fseterr.c (fseterr): Likewise.
+ * lib/fwritable.c (fwritable): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+ * lib/freadahead.c (freadahead): Likewise, based on code by Alan
+ Hourihane.
+ Reported by Alan Hourihane <alanh@fairlite.co.uk>.
+
+2009-02-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.h (wait_subprocess): Clarify restriction regarding
+ SIGCHLD.
+ Reported by Jim Meyering.
+
+2009-02-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_LS): Separate the two first tests.
+ Mention the results of these tests on various platforms.
+ * doc/posix-functions/fprintf.texi: Mention platforms in canonical
+ order.
+ * doc/posix-functions/printf.texi: Likewise.
+ * doc/posix-functions/snprintf.texi: Likewise.
+ * doc/posix-functions/sprintf.texi: Likewise.
+ * doc/posix-functions/vfprintf.texi: Likewise.
+ * doc/posix-functions/vprintf.texi: Likewise.
+ * doc/posix-functions/vsnprintf.texi: Likewise.
+ * doc/posix-functions/vsprintf.texi: Likewise.
+ * doc/glibc-functions/obstack_printf.texi: Likewise.
+ * doc/glibc-functions/obstack_vprintf.texi: Likewise.
+
+2009-02-28 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/po/Makefile.in.in: Update from GNU gettext 0.17.
+ Reported by Loïc Minier <lool@dooz.org>.
+
+2009-02-27 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Make the sed expression used to create the
+ sed script for updating the .gitignore file POSIX compliant.
+ Reported by Eric Blake.
+
+2009-02-27 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (sed): Don't alias as "sed --posix".
+ Reported by Eric Blake.
+
+2009-02-27 Bruno Haible <bruno@clisp.org>
+
+ Avoid test link errors.
+ * modules/uninorm/nfc-tests (test_u32_nfc_big_LDADD): New variable.
+ * modules/uninorm/nfd-tests (test_u32_nfd_big_LDADD): New variable.
+ * modules/uninorm/nfkc-tests (test_u32_nfkc_big_LDADD): New variable.
+ * modules/uninorm/nfkd-tests (test_u32_nfkd_big_LDADD): New variable.
+ Reported by Tom G. Christensen <tgc@jupiterrise.com>.
+
+2009-02-27 Bruno Haible <bruno@clisp.org>
+
+ Avoid spurious "(cached)" in configure output.
+ * m4/gnulib-common.m4 (gl_CACHE_VAL_SILENT): New macro.
+ * m4/ceil.m4 (gl_FUNC_CEIL_LIBS): Use it instead of AC_CACHE_VAL.
+ * m4/ceilf.m4 (gl_FUNC_CEILF_LIBS): Likewise.
+ * m4/ceill.m4 (gl_FUNC_CEILL_LIBS): Likewise.
+ * m4/floor.m4 (gl_FUNC_FLOOR_LIBS): Likewise.
+ * m4/floorf.m4 (gl_FUNC_FLOORF_LIBS): Likewise.
+ * m4/floorl.m4 (gl_FUNC_FLOORL_LIBS): Likewise.
+ * m4/stdarg.m4 (gl_STDARG_H): Likewise.
+ Reported by Eric Blake.
+
+2009-02-27 Eric Blake <ebb9@byu.net>
+
+ printf: fix regression in previous patch
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_LS): Fix compilation error.
+
+2009-02-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/inttypes.in.h: Test merely whether _LP64 is defined, not its
+ value.
+ * lib/stdint.in.h: Likewise.
+ Suggested by Eric Blake. Reported by Peter Bray <pdb_ml@yahoo.com.au>.
+
+2009-02-27 Eric Blake <ebb9@byu.net>
+
+ doc: mention more functions added in cygwin 1.7.0
+ * doc/posix-functions/mbsnrtowcs.texi: Mention recent cygwin 1.7.0
+ addition.
+ * doc/posix-functions/open_wmemstream.texi: Likewise.
+ * doc/posix-functions/wcsnlen.texi: Likewise.
+ * doc/posix-functions/wcsnrtombs.texi: Likewise.
+ * doc/posix-functions/wcstod.texi: Likewise.
+ * doc/posix-functions/wcstof.texi: Likewise.
+ * doc/posix-functions/wcstoimax.texi: Likewise.
+ * doc/posix-functions/wcstok.texi: Likewise.
+ * doc/posix-functions/wcstoumax.texi: Likewise.
+
+ Detect bug in cygwin 1.5.x *printf on 1-character %ls.
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_LS): Enhance filter.
+ * doc/posix-functions/fprintf.texi: Update.
+ * doc/posix-functions/printf.texi: Update.
+ * doc/posix-functions/snprintf.texi: Update.
+ * doc/posix-functions/sprintf.texi: Update.
+ * doc/posix-functions/vfprintf.texi: Update.
+ * doc/posix-functions/vprintf.texi: Update.
+ * doc/posix-functions/vsnprintf.texi: Update.
+ * doc/posix-functions/vsprintf.texi: Update.
+ * doc/glibc-functions/obstack_printf.texi: Update.
+ * doc/glibc-functions/obstack_vprintf.texi: Update.
+
+2009-02-26 Eric Blake <ebb9@byu.net>
+
+ avoid gcc 3.4.3 bug on long double NaN on Irix 6.5
+ * tests/nan.h (NaNl): Rewrite as function on Irix, to avoid
+ compilation bug by using runtime conversion.
+ * m4/isfinite.m4 (gl_ISFINITE): Likewise.
+ * m4/isnanl.m4 (gl_FUNC_ISNANL): Likewise.
+ * modules/ceill-tests (Files): Use nan.h.
+ * modules/floorl-tests (Files): Likewise.
+ * modules/frexpl-tests (Files): Likewise.
+ * modules/isnanl-tests (Files): Likewise.
+ * modules/ldexpl-tests (Files): Likewise.
+ * modules/roundl-tests (Files): Likewise.
+ * modules/truncl-tests (Files): Likewise.
+ * tests/test-ceill.c (main): Use a working NaN.
+ * tests/test-floorl.c (main): Likewise.
+ * tests/test-frexpl.c (main): Likewise.
+ * tests/test-isnan.c (test_long_double): Likewise.
+ * tests/test-isnanl.h (main): Likewise.
+ * tests/test-ldexpl.h (main): Likewise.
+ * tests/test-roundl.h (main): Likewise.
+ * tests/test-truncl.h (main): Likewise.
+ See http://lists.gnu.org/archive/html/bug-gnulib/2009-02/msg00190.html.
+
+2009-02-26 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ Work around a *printf bug with %ls on Solaris.
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_LS): Also test whether, when a
+ precision is specified, sprintf stops converting the wide string
+ argument when the number of bytes that have been produced by this
+ conversion equals or exceeds the precision.
+ * doc/posix-functions/fprintf.texi: Update.
+ * doc/posix-functions/printf.texi: Update.
+ * doc/posix-functions/snprintf.texi: Update.
+ * doc/posix-functions/sprintf.texi: Update.
+ * doc/posix-functions/vfprintf.texi: Update.
+ * doc/posix-functions/vprintf.texi: Update.
+ * doc/posix-functions/vsnprintf.texi: Update.
+ * doc/posix-functions/vsprintf.texi: Update.
+ * doc/glibc-functions/obstack_printf.texi: Update.
+ * doc/glibc-functions/obstack_vprintf.texi: Update.
+
+2009-02-26 Eric Blake <ebb9@byu.net>
+
+ stdlib: favor compiler check of random.h
+ * m4/stdlib_h.m4 (gl_STDLIB_H): Skip preprocessor check. Needed
+ to avoid an ObjC random.h installed by Swarm.
+
+2009-02-26 Bruno Haible <bruno@clisp.org>
+
+ Work around *printf bug with %g directive and 0.0 on HP-UX 10.20.
+ * m4/printf.m4 (gl_PRINTF_INFINITE): Also test for %g output of -0.0.
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2009-02-26 Bruno Haible <bruno@clisp.org>
+
+ Fix *printf behaviour regarding the %ls directive.
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_LS): New macro.
+ * lib/vasnprintf.c (local_wcslen, VASNPRINTF): Handle
+ NEED_PRINTF_DIRECTIVE_LS.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_DIRECTIVE_LS): New macro.
+ (gl_PREREQ_VASNPRINTF_WITH_EXTRAS): Invoke it.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS.
+ * m4/dprintf-posix.m4 (gl_FUNC_DPRINTF_POSIX): Likewise.
+ * m4/obstack-printf-posix.m4 (gl_FUNC_OBSTACK_PRINTF_POSIX): Likewise.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vdprintf-posix.m4 (gl_FUNC_VDPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * doc/posix-functions/fprintf.texi: Update.
+ * doc/posix-functions/printf.texi: Update.
+ * doc/posix-functions/snprintf.texi: Update.
+ * doc/posix-functions/sprintf.texi: Update.
+ * doc/posix-functions/vfprintf.texi: Update.
+ * doc/posix-functions/vprintf.texi: Update.
+ * doc/posix-functions/vsnprintf.texi: Update.
+ * doc/posix-functions/vsprintf.texi: Update.
+ * doc/glibc-functions/obstack_printf.texi: Update.
+ * doc/glibc-functions/obstack_vprintf.texi: Update.
+ Reported by Eric Blake.
+
+2009-02-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbrtowc.m4 (gl_MBRTOWC_NUL_RETVAL): Update guess for Solaris 8
+ with known value.
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2009-02-25 Bruno Haible <bruno@clisp.org>
+
+ Work around mbrtowc bug in zh_CN.GB18030 locale on Solaris 8.
+ * m4/mbrtowc.m4 (gl_MBRTOWC_SANITYCHECK): New macro.
+ (gl_MBSTATE_T_BROKEN): Invoke it. Replace mbstate_t when it says "no".
+ * doc/posix-functions/mbrtowc.texi: Document the Solaris 8 bug.
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2009-02-25 Bruno Haible <bruno@clisp.org>
+
+ Work around broken INT8_MAX, UINT8_MAX etc. values on HP-UX 11.23.
+ * m4/stdint.m4 (gl_STDINT_H): Also check whether the expansions of
+ INT8_MAX, UINT8_MAX etc. contain casts to elementary types.
+ * doc/posix-headers/stdint.texi: Mention the HP-UX bug.
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2009-02-25 Eric Blake <ebb9@byu.net>
+
+ tests: skip fseek/ftell tests if ungetc is broken
+ * m4/ungetc.m4: New file.
+ * modules/fseek-tests: Split test, so ungetc dependency is
+ separate from rest of test.
+ * modules/fseeko-tests: Likewise.
+ * modules/ftell-tests: Likewise.
+ * modules/ftello-tests: Likewise.
+ * tests/test-fseek.c (main): Isolate ungetc dependency.
+ * tests/test-fseeko.c (main): Likewise.
+ * tests/test-ftell.c (main): Likewise.
+ * tests/test-ftello.c (main): Likewise.
+ * tests/test-fseek2.sh: New file.
+ * tests/test-fseeko2.sh: Likewise.
+ * tests/test-ftell2.sh: Likewise.
+ * tests/test-ftello2.sh: Likewise.
+
+2009-02-25 Ondřej Vašík <ovasik@redhat.com>
+
+ test-getaddrinfo: fix usage of skip return code 77
+ * tests/test-gettaddrinfo.c: Return skip code 77 only
+ for first occurance of skip (4x77 is not 77)
+
+2009-02-25 Gary V. Vaughan <gary@gnu.org>
+
+ strtod: avoid C99 decl-after-statement
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Rearrange declaration.
+
+2009-02-24 Eric Blake <ebb9@byu.net>
+
+ strtod: detect HP-UX 11.31 bug
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Detect errno handling bug.
+ Reported by Gary V. Vaughan.
+
+2009-02-23 Bruno Haible <bruno@clisp.org>
+
+ Fix invalid read past end of memory block.
+ * lib/vasnprintf.c (DCHAR_SET): Define.
+ (local_wcslen): Define only when needed.
+ (local_strnlen, local_wcsnlen): New functions.
+ (VASNPRINTF) [!USE_SNPRINTF && HAVE_WCHAR_T]: Implement the %s and %ls
+ directives that involve a conversion ourselves.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF): Also check for strnlen,
+ wcsnlen, mbrtowc, wcrtomb.
+ * tests/test-vasnprintf-posix.c (test_function): Add tests for %.*s.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ Reported by Ben Pfaff <blp@cs.stanford.edu>.
+
+2009-02-22 Bruno Haible <bruno@clisp.org>
+
+ Implement new clarified decomposition of Hangul syllables.
+ * lib/uninorm/decomposition.c (uc_decomposition): For Hangul syllables
+ of type LTV, return only a pairwise decomposition.
+ * lib/uninorm/canonical-decomposition.c (uc_canonical_decomposition):
+ Likewise.
+ * tests/uninorm/test-decomposition.c (main): Updated expected result.
+ * tests/uninorm/test-canonical-decomposition.c (main): Likewise.
+ * tests/uninorm/test-compat-decomposition.c (main): Likewise.
+
+2009-02-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/uninorm/u-normalize-internal.h (FUNC): At the end, handle
+ zero-length results and shrink excess allocated memory.
+ * tests/uninorm/test-u8-nfc.c (test_u8_nfc): Check empty string result.
+ * tests/uninorm/test-u8-nfd.c (test_u8_nfd): Likewise.
+ * tests/uninorm/test-u8-nfkc.c (test_u8_nfkc): Likewise.
+ * tests/uninorm/test-u8-nfkd.c (test_u8_nfkd): Likewise.
+ * tests/uninorm/test-u16-nfc.c (test_u16_nfc): Likewise.
+ * tests/uninorm/test-u16-nfd.c (test_u16_nfd): Likewise.
+ * tests/uninorm/test-u16-nfkc.c (test_u16_nfkc): Likewise.
+ * tests/uninorm/test-u16-nfkd.c (test_u16_nfkd): Likewise.
+ * tests/uninorm/test-u32-nfc.c (test_u32_nfc): Likewise.
+ * tests/uninorm/test-u32-nfd.c (test_u32_nfd): Likewise.
+ * tests/uninorm/test-u32-nfkc.c (test_u32_nfkc): Likewise.
+ * tests/uninorm/test-u32-nfkd.c (test_u32_nfkd): Likewise.
+
+2009-02-21 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi: Include safe-alloc.texi earlier.
+ * doc/safe-alloc.texi: Terminate sentences with a period. Use two
+ spaces after a period. Put a space between a macro name and its
+ argument list. Trivial rewordings.
+ * lib/safe-alloc.c: Include safe-alloc.h right after config.h.
+ * tests/test-safe-alloc.c: Likewise. Include stdlib.h.
+ (main): Return 0 explicitly.
+
+2009-02-21 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'uninorm/filter'.
+ * tests/uninorm/test-uninorm-filter-nfc.c: New file.
+ * modules/uninorm/filter-tests: New file.
+
+ New module 'uninorm/filter'.
+ * lib/uninorm.h (uninorm_filter_create, uninorm_filter_write,
+ uninorm_filter_flush, uninorm_filter_free): New declarations.
+ * lib/uninorm/uninorm-filter.c: New file.
+ * modules/uninorm/filter: New file.
+
+2009-02-21 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'uninorm/nfkc'.
+ * tests/uninorm/test-nfkc.c: New file.
+ * tests/uninorm/test-u8-nfkc.c: New file.
+ * tests/uninorm/test-u16-nfkc.c: New file.
+ * tests/uninorm/test-u32-nfkc.c: New file.
+ * tests/uninorm/test-u32-nfkc-big.sh: New file.
+ * tests/uninorm/test-u32-nfkc-big.c: New file.
+ * modules/uninorm/nfkc-tests: New file.
+
+ New module 'uninorm/nfkc'.
+ * lib/uninorm/nfkc.c: New file.
+ * modules/uninorm/nfkc: New file.
+
+ Tests for module 'uninorm/nfkd'.
+ * tests/uninorm/test-nfkd.c: New file.
+ * tests/uninorm/test-u8-nfkd.c: New file.
+ * tests/uninorm/test-u16-nfkd.c: New file.
+ * tests/uninorm/test-u32-nfkd.c: New file.
+ * tests/uninorm/test-u32-nfkd-big.sh: New file.
+ * tests/uninorm/test-u32-nfkd-big.c: New file.
+ * modules/uninorm/nfkd-tests: New file.
+
+ New module 'uninorm/nfkd'.
+ * lib/uninorm/nfkd.c: New file.
+ * modules/uninorm/nfkd: New file.
+
+ Tests for module 'uninorm/nfc'.
+ * tests/uninorm/test-nfc.c: New file.
+ * tests/uninorm/test-u8-nfc.c: New file.
+ * tests/uninorm/test-u16-nfc.c: New file.
+ * tests/uninorm/test-u32-nfc.c: New file.
+ * tests/uninorm/test-u32-nfc-big.sh: New file.
+ * tests/uninorm/test-u32-nfc-big.c: New file.
+ * modules/uninorm/nfc-tests: New file.
+
+ New module 'uninorm/nfc'.
+ * lib/uninorm/nfc.c: New file.
+ * modules/uninorm/nfc: New file.
+
+ Tests for module 'uninorm/nfd'.
+ * tests/uninorm/test-nfd.c: New file.
+ * tests/uninorm/test-u8-nfd.c: New file.
+ * tests/uninorm/test-u16-nfd.c: New file.
+ * tests/uninorm/test-u32-nfd.c: New file.
+ * tests/uninorm/test-u32-nfd-big.sh: New file.
+ * tests/uninorm/test-u32-nfd-big.c: New file.
+ * tests/uninorm/test-u32-normalize-big.h: New file.
+ * tests/uninorm/test-u32-normalize-big.c: New file.
+ * tests/uninorm/NormalizationTest.txt: New file, created from
+ Unicode 5.1.0 NormalizationTest.txt.
+ * modules/uninorm/nfd-tests: New file.
+
+ New module 'uninorm/nfd'.
+ * lib/uninorm/nfd.c: New file.
+ * modules/uninorm/nfd: New file.
+
+ New module 'uninorm/u32-normalize'.
+ * lib/uninorm/u32-normalize.c: New file.
+ * modules/uninorm/u32-normalize: New file.
+
+ New module 'uninorm/u16-normalize'.
+ * lib/uninorm/u16-normalize.c: New file.
+ * modules/uninorm/u16-normalize: New file.
+
+ New module 'uninorm/u8-normalize'.
+ * lib/uninorm/u8-normalize.c: New file.
+ * lib/uninorm/normalize-internal.h: New file.
+ * lib/uninorm/u-normalize-internal.h: New file.
+ * modules/uninorm/u8-normalize: New file.
+
+ New module 'uninorm/decompose-internal'.
+ * lib/uninorm/decompose-internal.c: New file.
+ * modules/uninorm/decompose-internal: New file.
+
+ Tests for module 'uninorm/composition'.
+ * tests/uninorm/test-composition.c: New file.
+ * modules/uninorm/composition-tests: New file.
+
+ New module 'uninorm/composition'.
+ * lib/uninorm/composition.c: New file.
+ * lib/uninorm/composition-table.gperf: New file, generated by
+ gen-uni-tables.
+ * modules/uninorm/composition: New file.
+
+ Tests for module 'uninorm/compat-decomposition'.
+ * tests/uninorm/test-compat-decomposition.c: New file.
+ * modules/uninorm/compat-decomposition-tests: New file.
+
+ New module 'uninorm/compat-decomposition'.
+ * lib/uninorm/decompose-internal.h: New file.
+ * lib/uninorm/compat-decomposition.c: New file.
+ * modules/uninorm/compat-decomposition: New file.
+
+ Tests for module 'uninorm/canonical-decomposition'.
+ * tests/uninorm/test-canonical-decomposition.c: New file.
+ * modules/uninorm/canonical-decomposition-tests: New file.
+
+ New module 'uninorm/canonical-decomposition'.
+ * lib/uninorm/canonical-decomposition.c: New file.
+ * modules/uninorm/canonical-decomposition: New file.
+
+ Tests for module 'uninorm/decomposition'.
+ * tests/uninorm/test-decomposition.c: New file.
+ * modules/uninorm/decomposition-tests: New file.
+
+ New module 'uninorm/decomposition'.
+ * lib/uninorm/decomposition.c: New file.
+ * modules/uninorm/decomposition: New file.
+
+ New module 'uninorm/decomposition-table'.
+ * lib/uninorm/decomposition-table.h: New file.
+ * lib/uninorm/decomposition-table.c: New file.
+ * lib/uninorm/decomposition-table1.h: New file, generated by
+ gen-uni-tables.
+ * lib/uninorm/decomposition-table2.h: New file, generated by
+ gen-uni-tables.
+ * modules/uninorm/decomposition-table: New file.
+
+ * lib/gen-uni-tables.c (MAX_DECOMP_LENGTH): New macro.
+ (UC_DECOMP_*): New enumeration items.
+ (get_decomposition): New function.
+ (struct decomp_table): New type.
+ (output_decomposition, output_decomposition_tables): New functions.
+ (unicode_composition_exclusions): New variable.
+ (fill_composition_exclusions, debug_output_composition_tables): New
+ functions.
+ (main): Accept one more argument. Invoke fill_composition_exclusions.
+ Output decomposition and composition tables.
+
+ New module 'uninorm/base'.
+ * lib/uninorm.h: New file.
+ * lib/unictype.h: Update comment.
+ * modules/uninorm/base: New file.
+
+2009-02-21 David Lutterkort <lutter@redhat.com>
+
+ Tests for module 'safe-alloc'.
+ * tests/test-safe-alloc.c: New file.
+ * modules/safe-alloc-tests: New file.
+
+ New module 'safe-alloc'.
+ * lib/safe-alloc.h: New file.
+ * lib/safe-alloc.c: New file.
+ * m4/safe-alloc.m4: New file.
+ * modules/safe-alloc: New file.
+ * doc/safe-alloc.texi: New file.
+ * doc/gnulib.texi: Include it.
+ * MODULES.html.sh (Memory management functions <stdlib.h>): Add
+ safe-alloc.
+
+2009-02-18 Bruno Haible <bruno@clisp.org>
+
+ Fix link error on non-glibc systems.
+ * modules/uniwbrk/ulc-wordbreaks-tests (test_ulc_wordbreaks_LDADD): New
+ variable.
+ Reported by Tom G. Christensen <tgc@jupiterrise.com>.
+
+2009-02-18 Jim Meyering <meyering@redhat.com>
+
+ fts: avoid used-uninitialized error due to recent change
+ * lib/fts.c (fts_read): Guard uses of the new member,
+ parent->fts_n_dirs_remaining, since it's not relevant for
+ the parent of a directory specified on the command-line.
+
+2009-02-17 James Youngman <jay@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/include_next.m4: Reformulate comment.
+
+2009-02-16 Jim Meyering <meyering@redhat.com>
+
+ fts: add #if guards so that the fts_lgpl module still builds
+ * lib/fts.c: Guard just-added hash-table-using parts with
+ #if GNULIB_FTS, so as not to break builds of the fts_lgpl module.
+ Reported by Simon Josefsson.
+
+2009-02-15 Bruno Haible <bruno@clisp.org>
+
+ * modules/array-mergesort-tests: New file.
+ * tests/test-array-mergesort.c: New file.
+
+ New module 'array-mergesort'.
+ * modules/array-mergesort: New file.
+ * lib/array-mergesort.h: New file.
+
+2009-02-15 Bruno Haible <bruno@clisp.org>
+
+ Fix 2009-02-07 commit.
+ * lib/gen-uni-tables.c (output_predicate, output_category,
+ output_combclass, output_bidi_category, output_decimal_digit,
+ output_digit, output_numeric, output_mirror, output_scripts,
+ output_ident_category, output_simple_mapping): Fix format directives.
+ (output_lbp, output_wbp): Don't convert -1 to a size_t implicitly.
+
+2009-02-15 Albert Chin-A-Young <china@thewrittenword.com>
+
+ * m4/include_next.m4: Update comment about IBM C 9.0/10.1 bug, now that
+ fixes are available from IBM.
+
+2009-02-13 Jim Meyering <meyering@redhat.com>
+
+ fts: arrange not to stat non-directories in more cases
+ This makes GNU find (when it doesn't need to stat each file)
+ *much* more efficient at traversing reiserfs file systems.
+ * lib/fts_.h (struct ftsent) [fts_n_dirs_remaining]: New member.
+ (struct FTS) [fts_leaf_optimization_works_ht]: Add member.
+ * lib/fts.c (fts_close): Free ->fts_leaf_optimization_works_ht.
+ (S_MAGIC_REISERFS, S_MAGIC_PROC): Define.
+ (leaf_optimization_applies): New function.
+ (LCO_hash, LCO_compare): New helper functions.
+ (link_count_optimize_ok): New function.
+ (fts_stat): Initialize new member (if dir).
+ (fts_read): Decrement parent's fts_n_dirs_remaining count if
+ we've just stat'ed a directory. Skip the stat call when possible.
+ ---
+ Note this AFS-related exchange:
+ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=143111
+ and note find's pioctl call in find/fstype.c.
+ But that is necessary only if you want to enable the
+ optimization for AFS, and for now, I don't.
+
+ fts: move a function definition "up" (no semantic change)
+ * lib/fts.c (dirent_inode_sort_may_be_useful): Move definition
+ "up" to precede upcoming use of a related function.
+
+2009-02-11 Jim Meyering <meyering@redhat.com>
+
+ fts: correct internal computation of nlinks (optimization-related)
+ * lib/fts.c (fts_build): ISSET(FTS_NOSTAT) has no bearing on
+ whether the current entry is a directory, so don't test it.
+
+2009-02-10 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'uniwbrk/ulc-wordbreaks'.
+ * modules/uniwbrk/ulc-wordbreaks-tests: New file.
+ * tests/uniwbrk/test-ulc-wordbreaks.sh: New file.
+ * tests/uniwbrk/test-ulc-wordbreaks.c: New file.
+
+ Tests for module 'uniwbrk/u32-wordbreaks'.
+ * modules/uniwbrk/u32-wordbreaks-tests: New file.
+ * tests/uniwbrk/test-u32-wordbreaks.c: New file.
+
+ Tests for module 'uniwbrk/u16-wordbreaks'.
+ * modules/uniwbrk/u16-wordbreaks-tests: New file.
+ * tests/uniwbrk/test-u16-wordbreaks.c: New file.
+
+ Tests for module 'uniwbrk/u8-wordbreaks'.
+ * modules/uniwbrk/u8-wordbreaks-tests: New file.
+ * tests/uniwbrk/test-u8-wordbreaks.c: New file.
+
+2009-02-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/uniwbrk/u8-wordbreaks (Depends-on): Add uniwbrk/wordbreak
+ property.
+ * modules/uniwbrk/u16-wordbreaks (Depends-on): Likewise.
+ * modules/uniwbrk/u32-wordbreaks (Depends-on): Likewise.
+ * modules/uniwbrk/ulc-wordbreaks (Depends-on): Add localcharset.
+
+2009-02-10 Simon Josefsson <simon@josefsson.org>
+
+ * m4/sockets.m4: Call AC_C_INLINE since sockets.h now can use
+ inline keywords. Reported by Bruno Haible <bruno@clisp.org>.
+
+2009-02-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/unilbrk/lbrktables.h: Renamed from lib/unilbrk/tables.h.
+ * lib/unilbrk/lbrktables.c: Renamed from lib/unilbrk/tables.c.
+ * modules/unilbrk/tables (Files, Makefile.am, Include): Update.
+ * lib/unilbrk/u8-possible-linebreaks.c: Update.
+ * lib/unilbrk/u16-possible-linebreaks.c: Likewise.
+ * lib/unilbrk/u32-possible-linebreaks.c: Likewise.
+
+2009-02-09 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sockets.h (gl_fd_to_handle): New function.
+
+ * tests/test-sockets.c: Call gl_fd_to_handle.
+
+2009-02-09 Bruno Haible <bruno@clisp.org>
+
+ * doc/havelib.texi: Document the conventions on bi-arch systems.
+
+2009-02-08 Bruno Haible <bruno@clisp.org>
+
+ Document the AC_LIB_LINKFLAGS macro.
+ * doc/havelib.texi: New file, mostly written on 2005-05-24.
+ * doc/gnulib.texi: Include it.
+
+2009-02-08 Bruno Haible <bruno@clisp.org>
+
+ Fix wrong order of sections, compared to TOC.
+ * doc/gnulib.texi: Include relocatable-maint.texi after the
+ "Regular expressions" node, not before.
+
+2009-02-08 Bruno Haible <bruno@clisp.org>
+
+ Tests for module 'unicase/totitle'.
+ * modules/unicase/totitle-tests: New file.
+
+ Tests for module 'unicase/tolower'.
+ * modules/unicase/tolower-tests: New file.
+
+ Tests for module 'unicase/toupper'.
+ * modules/unicase/toupper-tests: New file.
+ * tests/unicase/test-mapping-part1.h: New file.
+ * tests/unicase/test-mapping-part2.h: New file.
+
+ New module 'unicase/totitle'.
+ * modules/unicase/totitle: New file.
+ * lib/unicase/totitle.c: New file.
+
+ New module 'unicase/tolower'.
+ * modules/unicase/tolower: New file.
+ * lib/unicase/tolower.c: New file.
+
+ New module 'unicase/toupper'.
+ * modules/unicase/toupper: New file.
+ * lib/unicase/toupper.c: New file.
+ * lib/unicase/simple-mapping.h: New file.
+
+ * lib/gen-uni-tables.c (output_simple_mapping_test): New function.
+ (mapping_table): New structure.
+ (output_simple_mapping): New function.
+ (main): Invoke output_simple_mapping_test and output_simple_mapping.
+ * modules/gen-uni-tables (Description): Update.
+ * lib/unicase/toupper.h: New file, automatically generated by
+ gen-uni-tables.
+ * lib/unicase/tolower.h: New file, automatically generated by
+ gen-uni-tables.
+ * lib/unicase/totitle.h: New file, automatically generated by
+ gen-uni-tables.
+ * tests/unicase/test-uc_toupper.c: New file, automatically generated by
+ gen-uni-tables.
+ * tests/unicase/test-uc_tolower.c: New file, automatically generated by
+ gen-uni-tables.
+ * tests/unicase/test-uc_totitle.c: New file, automatically generated by
+ gen-uni-tables.
+
+ New module 'unicase/base'.
+ * modules/unicase/base: New file.
+ * lib/unicase.h: New file.
+
+2009-02-08 Bruno Haible <bruno@clisp.org>
+
+ New module 'uniwbrk/ulc-wordbreaks'.
+ * modules/uniwbrk/ulc-wordbreaks: New file.
+ * lib/uniwbrk/ulc-wordbreaks.c: New file.
+
+ New module 'uniwbrk/u32-wordbreaks'.
+ * modules/uniwbrk/u32-wordbreaks: New file.
+ * lib/uniwbrk/u32-wordbreaks.c: New file.
+
+ New module 'uniwbrk/u16-wordbreaks'.
+ * modules/uniwbrk/u16-wordbreaks: New file.
+ * lib/uniwbrk/u16-wordbreaks.c: New file.
+
+ New module 'uniwbrk/u8-wordbreaks'.
+ * modules/uniwbrk/u8-wordbreaks: New file.
+ * lib/uniwbrk/u8-wordbreaks.c: New file.
+ * lib/uniwbrk/u-wordbreaks.h: New file.
+
+ New module 'uniwbrk/table'.
+ * modules/uniwbrk/table: New file.
+ * lib/uniwbrk/wbrktable.h: New file.
+ * lib/uniwbrk/wbrktable.c: New file.
+
+ New module 'uniwbrk/wordbreak-property'.
+ * modules/uniwbrk/wordbreak-property: New file.
+ * lib/uniwbrk/wordbreak-property.c: New file.
+
+ * lib/gen-uni-tables.c (WBP_*): New enum items.
+ (get_wbp, debug_output_wbp, debug_output_wbrk_tables): New functions.
+ (unicode_org_wbp): New variable.
+ (fill_org_wbp, debug_output_org_wbp, debug_output_org_wbrk_tables):
+ New functions.
+ (wbp_table): New structure.
+ (output_wbp, output_wbrk_tables): New functions.
+ (main): Accept additional argument. Invoke fill_org_wbp,
+ debug_output_wbrk_tables, debug_output_org_wbrk_tables,
+ output_wbrk_tables.
+ * modules/gen-uni-tables (Description): Update.
+ * lib/uniwbrk/wbrkprop.h: New file, automatically generated by
+ gen-uni-tables.
+
+ New module 'uniwbrk/base'.
+ * modules/uniwbrk/base: New file.
+ * lib/uniwbrk.h: New file.
+
+2009-02-08 Bruno Haible <bruno@clisp.org>
+
+ Update to Unicode 5.1.0.
+ * lib/gen-uni-tables.c (is_property_alphabetic): Include
+ U+2185..U+2188.
+ (is_property_default_ignorable_code_point): Don't include characters
+ of category Cc or Cs and not-a-characters.
+ (get_lbp): Assume REVISION_22. Special handling of U+0609, U+060A,
+ U+0D79, U+109E, U+109F, U+A60C.
+ * lib/unictype/bidi_of.h: Regenerated.
+ * lib/unictype/blocks.h: Regenerated.
+ * lib/unictype/categ_C.h: Regenerated.
+ * lib/unictype/categ_Cf.h: Regenerated.
+ * lib/unictype/categ_Cn.h: Regenerated.
+ * lib/unictype/categ_L.h: Regenerated.
+ * lib/unictype/categ_Ll.h: Regenerated.
+ * lib/unictype/categ_Lm.h: Regenerated.
+ * lib/unictype/categ_Lo.h: Regenerated.
+ * lib/unictype/categ_Lu.h: Regenerated.
+ * lib/unictype/categ_M.h: Regenerated.
+ * lib/unictype/categ_Mc.h: Regenerated.
+ * lib/unictype/categ_Me.h: Regenerated.
+ * lib/unictype/categ_Mn.h: Regenerated.
+ * lib/unictype/categ_N.h: Regenerated.
+ * lib/unictype/categ_Nd.h: Regenerated.
+ * lib/unictype/categ_Nl.h: Regenerated.
+ * lib/unictype/categ_No.h: Regenerated.
+ * lib/unictype/categ_P.h: Regenerated.
+ * lib/unictype/categ_Pd.h: Regenerated.
+ * lib/unictype/categ_Pe.h: Regenerated.
+ * lib/unictype/categ_Pf.h: Regenerated.
+ * lib/unictype/categ_Pi.h: Regenerated.
+ * lib/unictype/categ_Po.h: Regenerated.
+ * lib/unictype/categ_Ps.h: Regenerated.
+ * lib/unictype/categ_S.h: Regenerated.
+ * lib/unictype/categ_Sk.h: Regenerated.
+ * lib/unictype/categ_Sm.h: Regenerated.
+ * lib/unictype/categ_So.h: Regenerated.
+ * lib/unictype/categ_of.h: Regenerated.
+ * lib/unictype/combining.h: Regenerated.
+ * lib/unictype/ctype_alnum.h: Regenerated.
+ * lib/unictype/ctype_alpha.h: Regenerated.
+ * lib/unictype/ctype_graph.h: Regenerated.
+ * lib/unictype/ctype_lower.h: Regenerated.
+ * lib/unictype/ctype_print.h: Regenerated.
+ * lib/unictype/ctype_punct.h: Regenerated.
+ * lib/unictype/ctype_upper.h: Regenerated.
+ * lib/unictype/decdigit.h: Regenerated.
+ * lib/unictype/digit.h: Regenerated.
+ * lib/unictype/mirror.h: Regenerated.
+ * lib/unictype/numeric.h: Regenerated.
+ * lib/unictype/pr_alphabetic.h: Regenerated.
+ * lib/unictype/pr_bidi_arabic_digit.h: Regenerated.
+ * lib/unictype/pr_bidi_arabic_right_to_left.h: Regenerated.
+ * lib/unictype/pr_bidi_boundary_neutral.h: Regenerated.
+ * lib/unictype/pr_bidi_eur_num_terminator.h: Regenerated.
+ * lib/unictype/pr_bidi_left_to_right.h: Regenerated.
+ * lib/unictype/pr_bidi_non_spacing_mark.h: Regenerated.
+ * lib/unictype/pr_bidi_other_neutral.h: Regenerated.
+ * lib/unictype/pr_combining.h: Regenerated.
+ * lib/unictype/pr_dash.h: Regenerated.
+ * lib/unictype/pr_decimal_digit.h: Regenerated.
+ * lib/unictype/pr_default_ignorable_code_point.h: Regenerated.
+ * lib/unictype/pr_deprecated.h: Regenerated.
+ * lib/unictype/pr_diacritic.h: Regenerated.
+ * lib/unictype/pr_extender.h: Regenerated.
+ * lib/unictype/pr_format_control.h: Regenerated.
+ * lib/unictype/pr_grapheme_base.h: Regenerated.
+ * lib/unictype/pr_grapheme_extend.h: Regenerated.
+ * lib/unictype/pr_grapheme_link.h: Regenerated.
+ * lib/unictype/pr_id_continue.h: Regenerated.
+ * lib/unictype/pr_id_start.h: Regenerated.
+ * lib/unictype/pr_ideographic.h: Regenerated.
+ * lib/unictype/pr_ignorable_control.h: Regenerated.
+ * lib/unictype/pr_lowercase.h: Regenerated.
+ * lib/unictype/pr_math.h: Regenerated.
+ * lib/unictype/pr_numeric.h: Regenerated.
+ * lib/unictype/pr_other_alphabetic.h: Regenerated.
+ * lib/unictype/pr_other_default_ignorable_code_point.h: Regenerated.
+ * lib/unictype/pr_other_grapheme_extend.h: Regenerated.
+ * lib/unictype/pr_other_id_continue.h: Regenerated.
+ * lib/unictype/pr_other_lowercase.h: Regenerated.
+ * lib/unictype/pr_other_math.h: Regenerated.
+ * lib/unictype/pr_punctuation.h: Regenerated.
+ * lib/unictype/pr_sentence_terminal.h: Regenerated.
+ * lib/unictype/pr_soft_dotted.h: Regenerated.
+ * lib/unictype/pr_terminal_punctuation.h: Regenerated.
+ * lib/unictype/pr_unassigned_code_value.h: Regenerated.
+ * lib/unictype/pr_unified_ideograph.h: Regenerated.
+ * lib/unictype/pr_uppercase.h: Regenerated.
+ * lib/unictype/pr_xid_continue.h: Regenerated.
+ * lib/unictype/pr_xid_start.h: Regenerated.
+ * lib/unictype/pr_zero_width.h: Regenerated.
+ * lib/unictype/scripts.h: Regenerated.
+ * lib/unictype/scripts_byname.gperf: Regenerated.
+ * lib/unictype/sy_java_ident.h: Regenerated.
+ * lib/unilbrk/lbrkprop1.h: Regenerated.
+ * lib/unilbrk/lbrkprop2.h: Regenerated.
+ * tests/unictype/test-categ_C.c: Regenerated.
+ * tests/unictype/test-categ_Cf.c: Regenerated.
+ * tests/unictype/test-categ_Cn.c: Regenerated.
+ * tests/unictype/test-categ_L.c: Regenerated.
+ * tests/unictype/test-categ_Ll.c: Regenerated.
+ * tests/unictype/test-categ_Lm.c: Regenerated.
+ * tests/unictype/test-categ_Lo.c: Regenerated.
+ * tests/unictype/test-categ_Lu.c: Regenerated.
+ * tests/unictype/test-categ_M.c: Regenerated.
+ * tests/unictype/test-categ_Mc.c: Regenerated.
+ * tests/unictype/test-categ_Me.c: Regenerated.
+ * tests/unictype/test-categ_Mn.c: Regenerated.
+ * tests/unictype/test-categ_N.c: Regenerated.
+ * tests/unictype/test-categ_Nd.c: Regenerated.
+ * tests/unictype/test-categ_Nl.c: Regenerated.
+ * tests/unictype/test-categ_No.c: Regenerated.
+ * tests/unictype/test-categ_P.c: Regenerated.
+ * tests/unictype/test-categ_Pd.c: Regenerated.
+ * tests/unictype/test-categ_Pe.c: Regenerated.
+ * tests/unictype/test-categ_Pf.c: Regenerated.
+ * tests/unictype/test-categ_Pi.c: Regenerated.
+ * tests/unictype/test-categ_Po.c: Regenerated.
+ * tests/unictype/test-categ_Ps.c: Regenerated.
+ * tests/unictype/test-categ_S.c: Regenerated.
+ * tests/unictype/test-categ_Sk.c: Regenerated.
+ * tests/unictype/test-categ_Sm.c: Regenerated.
+ * tests/unictype/test-categ_So.c: Regenerated.
+ * tests/unictype/test-ctype_alnum.c: Regenerated.
+ * tests/unictype/test-ctype_alpha.c: Regenerated.
+ * tests/unictype/test-ctype_graph.c: Regenerated.
+ * tests/unictype/test-ctype_lower.c: Regenerated.
+ * tests/unictype/test-ctype_print.c: Regenerated.
+ * tests/unictype/test-ctype_punct.c: Regenerated.
+ * tests/unictype/test-ctype_upper.c: Regenerated.
+ * tests/unictype/test-decdigit.h: Regenerated.
+ * tests/unictype/test-digit.h: Regenerated.
+ * tests/unictype/test-numeric.h: Regenerated.
+ * tests/unictype/test-pr_alphabetic.c: Regenerated.
+ * tests/unictype/test-pr_bidi_arabic_digit.c: Regenerated.
+ * tests/unictype/test-pr_bidi_arabic_right_to_left.c: Regenerated.
+ * tests/unictype/test-pr_bidi_boundary_neutral.c: Regenerated.
+ * tests/unictype/test-pr_bidi_eur_num_terminator.c: Regenerated.
+ * tests/unictype/test-pr_bidi_left_to_right.c: Regenerated.
+ * tests/unictype/test-pr_bidi_non_spacing_mark.c: Regenerated.
+ * tests/unictype/test-pr_bidi_other_neutral.c: Regenerated.
+ * tests/unictype/test-pr_combining.c: Regenerated.
+ * tests/unictype/test-pr_dash.c: Regenerated.
+ * tests/unictype/test-pr_decimal_digit.c: Regenerated.
+ * tests/unictype/test-pr_default_ignorable_code_point.c: Regenerated.
+ * tests/unictype/test-pr_deprecated.c: Regenerated.
+ * tests/unictype/test-pr_diacritic.c: Regenerated.
+ * tests/unictype/test-pr_extender.c: Regenerated.
+ * tests/unictype/test-pr_format_control.c: Regenerated.
+ * tests/unictype/test-pr_grapheme_base.c: Regenerated.
+ * tests/unictype/test-pr_grapheme_extend.c: Regenerated.
+ * tests/unictype/test-pr_grapheme_link.c: Regenerated.
+ * tests/unictype/test-pr_id_continue.c: Regenerated.
+ * tests/unictype/test-pr_id_start.c: Regenerated.
+ * tests/unictype/test-pr_ideographic.c: Regenerated.
+ * tests/unictype/test-pr_ignorable_control.c: Regenerated.
+ * tests/unictype/test-pr_lowercase.c: Regenerated.
+ * tests/unictype/test-pr_math.c: Regenerated.
+ * tests/unictype/test-pr_numeric.c: Regenerated.
+ * tests/unictype/test-pr_other_alphabetic.c: Regenerated.
+ * tests/unictype/test-pr_other_default_ignorable_code_point.c:
+ Regenerated.
+ * tests/unictype/test-pr_other_grapheme_extend.c: Regenerated.
+ * tests/unictype/test-pr_other_id_continue.c: Regenerated.
+ * tests/unictype/test-pr_other_lowercase.c: Regenerated.
+ * tests/unictype/test-pr_other_math.c: Regenerated.
+ * tests/unictype/test-pr_punctuation.c: Regenerated.
+ * tests/unictype/test-pr_sentence_terminal.c: Regenerated.
+ * tests/unictype/test-pr_soft_dotted.c: Regenerated.
+ * tests/unictype/test-pr_terminal_punctuation.c: Regenerated.
+ * tests/unictype/test-pr_unassigned_code_value.c: Regenerated.
+ * tests/unictype/test-pr_unified_ideograph.c: Regenerated.
+ * tests/unictype/test-pr_uppercase.c: Regenerated.
+ * tests/unictype/test-pr_xid_continue.c: Regenerated.
+ * tests/unictype/test-pr_xid_start.c: Regenerated.
+ * tests/unictype/test-pr_zero_width.c: Regenerated.
+
+ Update to Unicode 5.1.0.
+ * lib/uniwidth/width.c (nonspacing_table_data): Add U+0487,
+ U+0616..U+061A, U+0A51, U+0A75, U+0B44, U+0B62..U+0B63, U+0C62..U+0C63,
+ U+0D44, U+0D62..U+0D63, U+1033..U+1035, U+103A, U+103D..U+103E,
+ U+105E..U+1060, U+1071..U+1074, U+1082, U+1085..U+1086, U+108D,
+ U+1B80..U+1B81, U+1BA2..U+1BA5, U+1BA8..U+1BA9, U+1C2C..U+1C33,
+ U+1C36..U+1C37, U+1DCB..U+1DE6, U+2064, U+20F0, U+2DE0..U+2DFF,
+ U+A66F..U+A672, U+A67C..U+A67D, U+A8C4, U+A926..U+A92D, U+A947..U+A951,
+ U+AA29..U+AA2E, U+AA31..U+AA32, U+AA35..U+AA36, U+AA43, U+AA4C,
+ U+FE24..U+FE26, U+101FD. Remove U+1929..U+192B.
+ (nonspacing_table_ind): Update.
+ * tests/uniwidth/test-uc_width2.sh: Update expected result.
+
+ Update to Unicode 5.1.0.
+ * lib/uniname/gen-uninames.lisp (main): Add the range 0x1Fxxx to the
+ code transform.
+ * lib/uniname/uniname.c (unicode_character_name,
+ unicode_name_character): Add the range 0x1Fxxx to the code transform.
+ * lib/uniname/uninames.h: Regenerated.
+ * tests/uniname/UnicodeDataNames.txt: Update to Unicode 5.1.0.
+
+2009-02-07 Bruno Haible <bruno@clisp.org>
+
+ Merge gen-ctype and gen-lbrk into a single program.
+ * lib/gen-uni-tables.c: New file, incorporating
+ lib/unictype/gen-ctype.c and lib/unilbrk/gen-lbrk.c.
+ Add directory prefixes to the names of the generated files.
+ * lib/unictype/gen-ctype.c: Remove file.
+ * lib/unilbrk/gen-lbrk.c: Remove file.
+ * modules/gen-uni-tables: New file.
+ * modules/unictype/gen-ctype: Remove file.
+ * modules/unilbrk/gen-lbrk: Remove file.
+
+2009-02-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistr.h (u8_strcoll, u16_strcoll, u32_strcoll): New declations.
+
+ New module 'unistr/u32-strcoll'.
+ * modules/unistr/u32-strcoll: New file.
+ * lib/unistr/u32-strcoll.c: New file.
+
+ New module 'unistr/u16-strcoll'.
+ * modules/unistr/u16-strcoll: New file.
+ * lib/unistr/u16-strcoll.c: New file.
+
+ New module 'unistr/u8-strcoll'.
+ * modules/unistr/u8-strcoll: New file.
+ * lib/unistr/u8-strcoll.c: New file.
+ * lib/unistr/u-strcoll.h: New file.
+
+2009-02-07 Bruno Haible <bruno@clisp.org>
+
+ * test-mbrtowc4.sh (LOCALE_ZH_CN): Fix default value.
+ * test-mbsnrtowcs4.sh (LOCALE_ZH_CN): Likewise.
+ * test-mbsrtowcs4.sh (LOCALE_ZH_CN): Likewise.
+ * test-wcrtomb.sh (LOCALE_ZH_CN): Likewise.
+ * test-wcsnrtombs4.sh (LOCALE_ZH_CN): Likewise.
+ * test-wcsrtombs4.sh (LOCALE_ZH_CN): Likewise.
+
+2009-02-07 Bruno Haible <bruno@clisp.org>
+
+ Make 64-bit clean.
+ * lib/unictype/gen-ctype.c (output_predicate, output_category,
+ output_combclass, output_bidi_category, output_decimal_digit,
+ output_digit, output_numeric, output_mirror, output_scripts,
+ output_ident_category): Use proper width specifier in format strings.
+
+2009-02-07 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/dirfd.texi: Clarify situation on mingw. Document
+ failure behaviour.
+
+2009-02-07 Jim Meyering <meyering@redhat.com>
+
+ regex: avoid compilation failure with upcoming gcc-4.4
+ * lib/regex_internal.h: Revert e48d8b47fb3eee81d341b71c3e006efe9e3433a7
+ [workaround for PGC prior to 6.1-2]. Otherwise, we'd get this:
+ "... error: integer overflow in preprocessor expression".
+
+2009-02-05 Ben Pfaff <blp@gnu.org>
+
+ Fix link errors on Windows when close module is used.
+ * modules/close: Add $(LIB_CLOSE) to Link section.
+ * m4/close.m4 (gl_REPLACE_CLOSE): Substitute -lws2_32 into
+ $(LIB_CLOSE) on Windows.
+
+2009-02-05 Jim Meyering <meyering@redhat.com>
+
+ still avoid unused-parameter warnings, but do it cleanly
+ * lib/fsusage.c (UNUSED_PARAM): Remove definition.
+ (get_fs_usage): Cast to void instead.
+ * lib/mountlist.c (UNUSED_PARAM): Remove definition.
+ (dev_from_mount_options, read_file_system_list): Cast to void.
+ Prompted by Bruno Haible.
+
+2009-02-04 Jim Meyering <meyering@redhat.com>
+
+ fsusage.c: correct copyright year
+ * lib/fsusage.c: Reflect year in which the change is pushed into
+
+ avoid misc. warnings
+ * lib/fsusage.c (UNUSED_PARAM): Define.
+ (get_fs_usage): Mark parameter "disk" as unused.
+ * lib/getugroups.c (getgrent): Use "void" in prototype.
+ * lib/mountlist.c: Mark unused parameters.
+ (read_file_system_list): Declare a local with "const".
+ * lib/nanosleep.c (getnow): Declare static.
+ * lib/strftime.c: Include strftime.h, for declaration of nstrftime.
+
+ dirfd: set errno upon failure
+ * lib/dirfd.c: Include <errno.h>.
+ Set errno to ENOTSUP when returning -1.
+ * modules/dirfd (Depends-on): Add errno.
+ Suggested by John Kodis <kodis@comcast.net>.
+
+2009-02-01 Bruno Haible <bruno@clisp.org>
+
+ Don't assume sizeof (long) >= sizeof (void *).
+ * lib/memcmp.c: Include stdint.h.
+ (memcmp_bytes): Change argument types to op_t. Change type of srcp1,
+ srcp2 to 'const byte *'.
+ (memcmp_common_alignment, memcmp_not_common_alignment): Change argument
+ types to uintptr_t.
+ (rpl_memcmp): Change type of srcp1, srcp2 to 'uintptr_t'.
+ * modules/memcmp (Depends-on): Add stdint.
+ Reported by Ozkan Sezer <sezeroz@gmail.com>.
+
+2009-01-30 Eric Blake <ebb9@byu.net>
+
+ fix more require-before-expand issues
+ * m4/pmccabe2html.m4 (gl_PMCCABE2HTML): Require, rather than
+ expand, AC_PROG_AWK.
+ * m4/gnulib-common.m4 (AC_PROG_MKDIR_P): Use AC_DEFUN_ONCE.
+
+2009-01-28 Eric Blake <ebb9@byu.net>
+
+ version-etc: use consistent URL formatting
+ * lib/version-etc.c (emit_bug_reporting_address, version_etc_va):
+ Improve formatting. Use fputs for string without %.
+
+2009-01-28 Jim Meyering <meyering@redhat.com>
+
+ 00gnulib.m4: add m4 quotes in shell comment to avoid autoconf warning
+ * m4/00gnulib.m4 (AC_DEFUN_ONCE): Add quotes to avoid an
+ "underquoted definition of NAME" from autoconf-2.59.
+
+2009-01-28 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi: Add "Obsolete modules" to index.
+
+2009-01-28 Jim Meyering <meyering@redhat.com>
+
+ useless-if-before-free: recognize more variants
+ * build-aux/useless-if-before-free: Also recognize e.g.,
+ if (NULL != p) free (p);
+
+2009-01-27 Mark McLoughlin <markmc@redhat.com>
+
+ test-getaddrinfo: skip (don't fail) this test when there's no network
+ * tests/test-getaddrinfo.c: Skip test upon failure with EAI_AGAIN,
+ on the presumption that it means you lack network access.
+
+2009-01-26 Jim Meyering <meyering@redhat.com>
+
+ fflush: avoid warnings on modern systems
+ * lib/fflush.c (rpl_fflush): Move declarations of locals,
+ pos and result, into scopes where they're used.
+
+2009-01-26 Eric Blake <ebb9@byu.net>
+
+ Silence warning reintroduced by recent extensions patch.
+ * m4/extensions.m4 (AC_USE_SYSTEM_EXTENSIONS)
+ (gl_USE_SYSTEM_EXTENSIONS): Use AC_DEFUN_ONCE to silence newer
+ autoconf.
+
+ Backport improved autoconf semantics of AC_DEFUN_ONCE.
+ * m4/00gnulib.m4: New file.
+ * gnulib-tool (func_get_filelist): Always use it.
+ * m4/gnulib-common.m4 (gl_COMMON): Force the file to be used.
+ Reported by Bruno Haible, with suggestions from Paolo Bonzini.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ Make test-quotearg work on MacOS X and AIX.
+ * tests/test-quotearg.sh: New file.
+ * tests/locale/fr/LC_MESSAGES/test-quotearg.po: New file.
+ * tests/locale/fr/LC_MESSAGES/test-quotearg.mo: New file.
+ * tests/test-quotearg.c: Include <locale.h> and gettext.h. Don't
+ include <libintl.h>.
+ (fake_locale): Remove variable.
+ (gettext, dgettext, dcgettext): Remove functions.
+ (main): Instead of setting a fake locale, set a real locale. Call
+ textdomain and bindtextdomain.
+ * modules/quotearg-tests (Files): Add the new files.
+ (Depends-on): Add gettext, setenv, unsetenv.
+ (configure.ac): Invoke gt_LOCALE_FR and gt_LOCALE_FR_UTF8.
+ (Makefile.am): Add test-quotearg.sh to TESTS, remove test-quotearg.
+ Augment TESTS_ENVIRONMENT.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-fr.m4 (gt_LOCALE_FR): Remove special code that hid the
+ fr_FR.ISO8859-1 locale on MacOS X.
+ * m4/locale-ja.m4 (gt_LOCALE_JA): Remove special code that hid the
+ ja_JP.eucJP locale on MacOS X.
+ * m4/locale-zh.m4 (gt_LOCALE_ZH_CN): Remove special code that hid the
+ zh_CN.GB18030 locale on MacOS X.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ Avoid link errors on MacOS X 10.3.
+ * lib/mbsrtowcs-state.c (_gl_mbsrtowcs_state): Add initializer.
+ * lib/wcsrtombs-state.c (_gl_wcsrtombs_state): Likewise.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe.c: On Unix, assume HAVE_POSIX_SPAWN and use posix_spawnp.
+ * m4/pipe.m4 (gl_PIPE): Remove tests for vfork() based code.
+ * modules/pipe (Files): Remove m4/posix_spawn.m4.
+ (Depends-on): Add spawn, posix_spawnp, posix_spawn_file_actions_init,
+ posix_spawn_file_actions_addclose, posix_spawn_file_actions_adddup2,
+ posix_spawn_file_actions_addopen, posix_spawn_file_actions_destroy,
+ posix_spawnattr_init, posix_spawnattr_setsigmask,
+ posix_spawnattr_setflags, posix_spawnattr_destroy.
+
+ * lib/execute.c: On Unix, assume HAVE_POSIX_SPAWN and use posix_spawnp.
+ * m4/execute.m4 (gl_EXECUTE): Remove tests for vfork() based code.
+ * modules/execute (Files): Remove m4/posix_spawn.m4.
+ (Depends-on): Add spawn, posix_spawnp, posix_spawn_file_actions_init,
+ posix_spawn_file_actions_addopen, posix_spawn_file_actions_destroy,
+ posix_spawnattr_init, posix_spawnattr_setsigmask,
+ posix_spawnattr_setflags, posix_spawnattr_destroy.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/threadlib.c: Include <stdlib.h>.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/threadlib.c (dummy): New declaration.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbrtowc.c (mbrtowc): Distinguish invalid and incomplete
+ multibyte characters also for the GB18030 encoding. Don't crash when
+ the encoding is unknown and nstate = 0. Needed on OSF/1 5.1.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ Avoid redefining 'struct random_data' on OSF/1 5.1.
+ * lib/stdlib.in.h: Include <random.h> if it exists.
+ * m4/stdlib_h.m4 (gl_STDLIB_H): Test whether <random.h> exists. Set
+ HAVE_RANDOM_H. Include <random.h> when testing whether
+ 'struct random_data' exists.
+ * modules/stdlib (Makefile.am): Substitute HAVE_RANDOM_H.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ Don't install charset.alias on MacOS X >= 10.3.
+ * lib/localcharset.c (DARWIN7): New macro.
+ (get_charset_aliases): Hardcode the result for Darwin7.
+ * modules/localcharset (install-exec-local): Don't install
+ charset.alias on MacOS X >= 10.3, if the file does not yet exist.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ Don't install charset.alias on mingw and Cygwin.
+ * modules/localcharset (install-exec-local): Don't install
+ charset.alias on mingw and Cygwin, if the file does not yet exist.
+ The result for these platforms is hardcoded in localcharset.c.
+
+2009-01-25 Bruno Haible <bruno@clisp.org>
+
+ Make it possible again to use AC_GNU_SOURCE together with gnulib.
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Require AC_GNU_SOURCE
+ before requiring AC_USE_SYSTEM_EXTENSIONS.
+
+2009-01-25 Jim Meyering <meyering@redhat.com>
+
+ c-strtod: avoid warnings
+ * lib/c-strtod.c (C_STRTOD): Cast nptr to (char *) to avoid
+ "assignment discards qualifiers from pointer target type" warnings.
+
+2009-01-24 Bruno Haible <bruno@clisp.org>
+
+ Add support for non-UTF-8 locales on MacOS X.
+ * lib/config.charset: Add CP1131, ARMSCII-8, PT154 to the list of
+ canonical encodings. For Darwin 7 and newer, don't map traditional
+ encodings to UTF-8.
+ Reported by Vincent Lefevre <vincent@vinc17.org>
+ at <http://savannah.gnu.org/bugs/?25235>.
+
+2009-01-24 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi (Obsolete modules): New section.
+ Reported by Mike Frysinger <vapier@gentoo.org>.
+
+2009-01-24 Bruno Haible <bruno@clisp.org>
+
+ * doc/Makefile (%.pdf): Clarify where to find texmf.cnf.
+ (%.dvi): New rule.
+
+2009-01-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strtod.h (c_strtod, c_strtold): Adjust specification.
+ Reported by Eric Blake.
+
+2009-01-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-stack.c (segv_handler): If !HAVE_XSI_STACK_OVERFLOW_HEURISTIC,
+ set signo = 0 also if info->si_code <= 0. Needed on HP-UX 11.11.
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2009-01-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strtod.h (c_strtod, c_strtold): Add specification.
+
+2009-01-23 Bruno Haible <bruno@clisp.org>
+
+ Make c-strtod, c-strtold usable in libraries.
+ * lib/c-strtod.c: Include string.h instead of xalloc.h.
+ (C_STRTOD): Call strdup instead of xstrdup.
+ * modules/c-strtod (Depends-on): Add strdup-posix, remove xalloc.
+ * modules/c-strtold (Depends-on): Likewise.
+ * doc/c-strtod.texi: Remove the sentence mentioning xalloc_die.
+ * NEWS: Mention the change.
+ Reported by Michael Gold <mgold@ncf.ca>.
+
+2009-01-23 Jim Meyering <meyering@redhat.com>
+
+ c-strtod: when ENDPTR is non-NULL, set *ENDPTR in new failure path
+ * lib/c-strtod.c (C_STRTOD) [LC_ALL_MASKC]: Ensure that when
+ ENDPTR is non-NULL, *ENDPTR is set to NPTR upon failure.
+
+2009-01-23 Simon Josefsson <simon@josefsson.org>
+
+ * lib/version-etc.c: Add emit_bug_reporting_address, inspired by
+ GNU CoreUtils.
+ * lib/version-etc.h: Add prototype for emit_bug_reporting_address.
+ * modules/version-etc (Description): Update.
+
+2009-01-22 Bruno Haible <bruno@clisp.org>
+
+ Cache the C locale object.
+ * lib/c-strtod.c (c_locale_cache): New variable.
+ (c_locale): New function.
+ (C_STRTOD): Use it, and don't call freelocale.
+ * m4/c-strtod.m4 (gl_C_STRTOD, gl_C_STRTOLD): Require AC_C_INLINE.
+ Suggested by Paolo Bonzini.
+
+2009-01-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/getloadavg.c (getloadavg): Check c_strtod result against error
+ conditions other than overflow.
+
+2009-01-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strtod.c: Include errno.h.
+ (C_STRTOD): Check against NULL return from newlocale. Preserve errno
+ value from STRTOD_L and STRTOD.
+
+2009-01-21 Bruno Haible <bruno@clisp.org>
+ and Jim Meyering <meyering@redhat.com>
+
+ nanosleep: skip configure test (fail it) for apple universal builds
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Require gl_MULTIARCH. In Apple
+ universal builds, assume that nanosleep does not work.
+ * modules/nanosleep (Depends-on): Add multiarch.
+
+ mktime: skip configure test (fail it) for apple universal builds
+ * m4/mktime.m4 (AC_FUNC_MKTIME): Require gl_MULTIARCH. In Apple
+ universal builds, assume that mktime does not work.
+ * modules/mktime (Depends-on): Add multiarch.
+
+2009-01-21 Eric Blake <ebb9@byu.net>
+
+ multiarch: avoid expand-before-require warning
+ * modules/multiarch (configure.ac): Require, rather than expand,
+ gl_MULTIARCH.
+ * m4/multiarch.m4 (gl_MULTIARCH_BODY): Merge...
+ (gl_MULTIARCH): ...into this macro, and use AC_DEFUN_ONCE to
+ enforce that all clients require it. Partial reversion of
+ 2008-12-29 patch.
+
+ error: avoid expand-before-require warning
+ * modules/errno (configure.ac): Require, rather than expand,
+ gl_HEADER_ERRNO_H.
+ * m4/errno_h.m4 (gl_HEADER_ERRNO_H_BODY): Merge...
+ (gl_HEADER_ERRNO_H): ...into this macro, and use AC_DEFUN_ONCE to
+ enforce that all clients require it.
+
+ gnulib-tool: avoid warnings from using obsolete AC_GNU_SOURCE
+ * gnulib-tool (func_dest_tmpfilename, func_create_testdir): Using
+ obsolete AC_GNU_SOURCE causes out-of-order expansion; avoid it,
+ and rely solely on gl_USE_SYSTEM_EXTENSIONS.
+
+2009-01-21 Paolo Bonzini <bonzini@gnu.org>
+
+ Revert:
+ 2009-01-20 Paolo Bonzini <bonzini@gnu.org>
+
+ regex: do not depend on obsolete modules.
+ * modules/regex: Remove memcmp and memmove.
+
+2009-01-20 Bruno Haible <bruno@clisp.org>
+
+ Make the 'link' module link on Windows NT 4.
+ * lib/link.c (_WIN32_WINNT): Don't define.
+ (CreateHardLinkFuncType): New type.
+ (CreateHardLinkFunc, initialized): New variables.
+ (initialize): New function.
+ (link): Invoke CreateHardLink indirectly through the function pointer.
+
+2009-01-20 Bruno Haible <bruno@clisp.org>
+
+ Fix compilation failure on mingw.
+ * tests/test-link.c (main): Don't assume that EOPNOTSUPP exists.
+
+2009-01-20 Michael Gold <mgold@ncf.ca> (tiny change)
+
+ * doc/c-strtod.texi: Mention a couple of restrictions.
+
+2009-01-20 Jim Meyering <meyering@redhat.com>
+
+ gettimeofday: move more declarations out of functions
+ * lib/gettimeofday.c: Move extern declarations of tzset and
+ gmtime out of containing functions. Prompted by Bruno Haible.
+
+2009-01-20 Paolo Bonzini <bonzini@gnu.org>
+
+ regex: do not depend on obsolete modules.
+ * modules/regex: Remove memcmp and memmove.
+
+2009-01-19 Bruno Haible <bruno@clisp.org>
+
+ Don't use AC_REQUIRE([AC_C_BIGENDIAN]).
+ * modules/uniconv/u16-conv-from-enc (configure.ac): Require
+ gl_BIGENDIAN, not AC_C_BIGENDIAN.
+ * modules/uniconv/u16-conv-to-enc (configure.ac): Likewise.
+ * modules/uniconv/u16-strconv-to-enc (configure.ac): Likewise.
+
+2009-01-19 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-link.c: Include <errno.h>.
+ (main): Exit with code 77 when a hard link cannot be created due to
+ the file system.
+ * tests/test-link.sh: Skip test when a hard link cannot be created due
+ to the file system.
+ Suggested by Eric Blake.
+
+2009-01-19 Martin Lambers <marlam@marlam.de>
+
+ * modules/link-tests: New file.
+ * tests/test-link.sh: New file.
+ * tests/test-link.c: New file.
+
+2009-01-19 Eric Blake <ebb9@byu.net>
+
+ doc: mention another function added in cygwin 1.7.0
+ * doc/glibc-functions/glob_pattern_p.texi (glob_pattern_p):
+ Another new function in cygwin 1.7.
+
+2009-01-19 Bruno Haible <bruno@clisp.org>
+
+ Don't use AC_REQUIRE([AC_C_BIGENDIAN]).
+ * m4/gnulib-common.m4 (gl_BIGENDIAN): New macro.
+ * m4/exponentl.m4 (gl_LONG_DOUBLE_EXPONENT_LOCATION): Require
+ gl_BIGENDIAN, not AC_C_BIGENDIAN.
+ * m4/isfinite.m4 (gl_ISFINITEL_WORKS): Likewise.
+ * m4/isinf.m4 (gl_ISINFL_WORKS): Likewise.
+ * m4/isnanl.m4 (gl_FUNC_ISNANL_WORKS): Likewise.
+ * m4/md4.m4 (gl_MD4): Likewise.
+ * m4/md5.m4 (gl_MD5): Likewise.
+ * m4/printf.m4 (gl_PRINTF_INFINITE_LONG_DOUBLE): Likewise.
+ * m4/sha1.m4 (gl_SHA1): Likewise.
+ * m4/sha256.m4 (gl_SHA256): Likewise.
+ * m4/sha512.m4 (gl_SHA512): Likewise.
+
+2009-01-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/uniname/uniname-tests (Depends-on): Add progname.
+ * tests/uniname/test-uninames.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/unistdio/u8-vsprintf-tests (Depends-on): Add progname.
+ * tests/unistdio/test-u8-vsprintf1.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/unistdio/u8-vsnprintf-tests (Depends-on): Add progname.
+ * tests/unistdio/test-u8-vsnprintf1.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/unistdio/u16-vsprintf-tests (Depends-on): Add progname.
+ * tests/unistdio/test-u16-vsprintf1.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/unistdio/u16-vsnprintf-tests (Depends-on): Add progname.
+ * tests/unistdio/test-u16-vsnprintf1.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/unistdio/u32-vsprintf-tests (Depends-on): Add progname.
+ * tests/unistdio/test-u32-vsprintf1.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/unistdio/u32-vsnprintf-tests (Depends-on): Add progname.
+ * tests/unistdio/test-u32-vsnprintf1.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/unistdio/ulc-vsprintf-tests (Depends-on): Add progname.
+ * tests/unistdio/test-ulc-vsprintf1.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/unistdio/ulc-vsnprintf-tests (Depends-on): Add progname.
+ * tests/unistdio/test-ulc-vsnprintf1.c: Include progname.h.
+ (main): Call set_program_name.
+
+2009-01-19 Eric Blake <ebb9@byu.net>
+
+ test-unistd: test previous patch
+ * tests/test-unistd.c: Test *_FILENO macros.
+
+ unistd: guarantee STDIN_FILENO here, for OS/2 EMX
+ * lib/unistd.in.h (STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO):
+ Guarantee a definition.
+ * doc/posix-headers/unistd.texi (unistd.h): Document the bug.
+ * modules/unistd-safer (Depends-on): Add dependency on unistd.
+ * lib/c-stack.c (STDERR_FILENO): Rely on <unistd.h>.
+ * lib/dup-safer.c (STDERR_FILENO): Likewise.
+ * lib/execute.c (STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO):
+ Likewise.
+ * lib/fd-safer.c (STDIN_FILENO, STDERR_FILENO): Likewise.
+ * lib/fopen-safer.c (STDERR_FILENO): Likewise.
+ * lib/pipe.c (STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO):
+ Likewise.
+ * lib/tmpfile-safer.c (STDERR_FILENO): Likewise.
+ * tests/test-posix_spawn1.c (STDIN_FILENO, STDOUT_FILENO)
+ (STDERR_FILENO): Likewise.
+ * tests/test-posix_spawn2.c (STDIN_FILENO, STDOUT_FILENO)
+ (STDERR_FILENO): Likewise.
+ * tests/test-posix_spawn3.c (STDIN_FILENO, STDOUT_FILENO)
+ (STDERR_FILENO): Likewise.
+ Reported by Elbert Pol.
+
+2009-01-19 Eric Blake <ebb9@byu.net>
+
+ doc: mention more functions added in cygwin 1.7.0
+ * doc/posix-functions/abort.texi (abort): Update wording related
+ to cygwin.
+ * doc/posix-functions/daylight.texi (daylight): Likewise.
+ * doc/posix-functions/optarg.texi (optarg): Likewise.
+ * doc/posix-functions/optarg.texi (opterr): Likewise.
+ * doc/posix-functions/optarg.texi (optind): Likewise.
+ * doc/posix-functions/optarg.texi (optopt): Likewise.
+ * doc/posix-functions/wprintf.texi (wprintf): Cygwin wprintf never
+ worked in 1.5.x, and was withdrawn in 1.7.
+ * doc/posix-functions/vwprintf.texi (vwprintf): Likewise.
+ * doc/posix-functions/fprintf.texi (fprintf): Tighten mention of
+ cygwin versions.
+ * doc/posix-functions/perror.texi (perror): Likewise.
+ * doc/posix-functions/printf.texi (printf): Likewise.
+ * doc/posix-functions/snprintf.texi (snprintf): Likewise.
+ * doc/posix-functions/sprintf.texi (sprintf): Likewise.
+ * doc/posix-functions/vfprintf.texi (vfprintf): Likewise.
+ * doc/posix-functions/vprintf.texi (vprintf): Likewise.
+ * doc/posix-functions/vsnprintf.texi (vsnprintf): Likewise.
+ * doc/posix-functions/vsprintf.texi (vsprintf): Likewise.
+ * doc/glibc-functions/obstack_printf.texi (obstack_printf):
+ Likewise.
+ * doc/glibc-functions/obstack_vprintf.texi (obstack_vprintf):
+ Likewise.
+ * doc/glibc-functions/cfmakeraw.texi (cfmakeraw): Cygwin 1.7 adds
+ this function.
+ * doc/glibc-functions/in6addr_any.texi (in6addr_any): Likewise.
+ * doc/glibc-functions/in6addr_loopback.texi (in6addr_loopback):
+ Likewise.
+ * doc/glibc-functions/updwtmpx.texi (updwtmpx): Likewise.
+ * doc/posix-functions/_Exit_C99.texi (_Exit): Likewise.
+ * doc/posix-functions/confstr.texi (confstr): Likewise.
+ * doc/posix-functions/dprintf.texi (dprintf): Likewise.
+ * doc/posix-functions/fgetwc.texi (fgetwc): Likewise.
+ * doc/posix-functions/fgetws.texi (fgetws): Likewise.
+ * doc/posix-functions/fputwc.texi (fputwc): Likewise.
+ * doc/posix-functions/fputws.texi (fputws): Likewise.
+ * doc/posix-functions/fwide.texi (fwide): Likewise.
+ * doc/posix-functions/getwc.texi (getwc): Likewise.
+ * doc/posix-functions/getwchar.texi (getwchar): Likewise.
+ * doc/posix-functions/putwc.texi (putwc): Likewise.
+ * doc/posix-functions/putwchar.texi (putwchar): Likewise.
+ * doc/posix-functions/sigignore.texi (sigignore): Likewise.
+ * doc/posix-functions/ungetwc.texi (ungetwc): Likewise.
+ * doc/posix-functions/vdprintf.texi (vdprintf): Likewise.
+ * doc/posix-functions/wcpcpy.texi (wcpcpy): Likewise.
+ * doc/posix-functions/wcpncpy.texi (wcpncpy): Likewise.
+ * doc/posix-functions/wcstol.texi (wcstol): Likewise.
+ * doc/posix-functions/wcstoll.texi (wcstoll): Likewise.
+ * doc/posix-functions/wcstoul.texi (wcstoul): Likewise.
+ * doc/posix-functions/wcstoull.texi (wcstoull): Likewise.
+ * doc/posix-functions/wcsxfrm.texi (wcsxfrm): Likewise.
+
+2009-01-19 Daniel P. Berrange <berrange@redhat.com>
+
+ ioctl: avoid warning: no previous prototype for 'rpl_ioctl'
+ * lib/ioctl.c: Include <sys/ioctl.h>.
+
+2009-01-19 Simon Josefsson <simon@josefsson.org>
+
+ * modules/getdate-tests (Depends-on): Add progname.
+ * tests/test-getdate.c: Use progname module, to avoid link errors
+ on non-glibc systems.
+
+2009-01-18 Simon Josefsson <simon@josefsson.org>
+
+ * modules/filenamecat-tests (Depends-on): Add progname.
+ * modules/fstrcmp-tests (Depends-on): Likewise.
+
+ * tests/test-filenamecat.c: Use progname module, to avoid link
+ errors on non-glibc systems.
+ * tests/test-fstrcmp.c: Likewise.
+
+2009-01-19 Daniel P. Berrange <berrange@redhat.com>
+
+ gettimeofday: avoid warning: nested extern declaration of 'localtime'
+ * lib/gettimeofday.c: Move extern declaration out of function.
+
+2009-01-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/strftime.m4 (gl_FUNC_STRFTIME): Don't test for mblen and mbrlen.
+ * lib/strftime.c (HAVE_MBLEN, HAVE_MBRLEN): Remove macros.
+ (MULTIBYTE_IS_FORMAT_SAFE): Define to 1 on all platforms except OSF/1.
+
+2009-01-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/strftime.c (MEMPCPY): Remove unused macro.
+ * m4/strftime.m4 (gl_FUNC_STRFTIME): Don't test for mempcpy.
+
+2009-01-18 Martin Lambers <marlam@marlam.de>
+
+ New module 'link'.
+ * lib/unistd.in.h (link): New declaration.
+ * lib/link.c: New file.
+ * m4/link.m4: New file.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_LINK,
+ HAVE_LINK.
+ * modules/unistd (Makefile.am): Substitute GNULIB_LINK, HAVE_LINK.
+ * modules/link: New file.
+ * doc/posix-functions/link.texi: Mention the new module.
+
+2009-01-18 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-avltree_list.c (main): Call set_program_name.
+ * tests/test-avltree_oset.c (main): Likewise.
+ * tests/test-obstack-printf.c: Include progname.h.
+ (main): Call set_program_name.
+ * tests/test-quotearg.c: Include progname.h.
+ (main): Call set_program_name.
+ * tests/test-xmemdup0.c: Include progname.h.
+ (main): Call set_program_name.
+
+2009-01-18 Bruno Haible <bruno@clisp.org>
+
+ New module 'alphasort'.
+ * lib/dirent.in.h (alphasort): New declaration.
+ * lib/alphasort.c: New file, from glibc with modifications.
+ * m4/alphasort.m4: New file.
+ * modules/alphasort: New file.
+ * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): Initialize GNULIB_ALPHASORT,
+ HAVE_ALPHASORT.
+ * modules/dirent (Makefile.am): Substitute GNULIB_ALPHASORT,
+ HAVE_ALPHASORT.
+ * doc/posix-functions/alphasort.texi: Mention the new module and the
+ portability problems.
+
+2009-01-18 Bruno Haible <bruno@clisp.org>
+
+ New module 'scandir'.
+ * lib/dirent.in.h (scandir): New declaration.
+ * lib/scandir.c: New file, from glibc with modifications.
+ * m4/scandir.m4: New file.
+ * modules/scandir: New file.
+ * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): Initialize GNULIB_SCANDIR,
+ HAVE_SCANDIR.
+ * modules/dirent (Makefile.am): Substitute GNULIB_SCANDIR,
+ HAVE_SCANDIR.
+ * doc/posix-functions/scandir.texi: Mention the new module and the
+ portability problems.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_remove_prefix): Escape all dots in the prefix.
+ Update documentation.
+ (func_remove_suffix): Escape all dots in the suffix. Update
+ documentation.
+ (func_filter_filelist): Update documentation.
+ Reported by Ralf Wildenhues.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/dprintf-posix-tests: New file.
+ * tests/test-dprintf-posix.sh: New file.
+ * tests/test-dprintf-posix.c: New file.
+
+ New modules 'dprintf', 'dprintf-posix'.
+ * lib/stdio.in.h (dprintf): New declaration.
+ * lib/dprintf.c: New file.
+ * m4/dprintf.m4: New file.
+ * m4/dprintf-posix.m4: New file.
+ * modules/dprintf: New file.
+ * modules/dprintf-posix: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Initialize GNULIB_DPRINTF,
+ HAVE_DPRINTF, REPLACE_DPRINTF.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_DPRINTF,
+ HAVE_DPRINTF, REPLACE_DPRINTF.
+ * doc/posix-functions/dprintf.texi: Mention the new modules.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/vdprintf-posix-tests: New file.
+ * tests/test-vdprintf-posix.sh: New file.
+ * tests/test-vdprintf-posix.c: New file.
+
+ New modules 'vdprintf', 'vdprintf-posix'.
+ * lib/stdio.in.h (vdprintf): New declaration.
+ * lib/vdprintf.c: New file.
+ * m4/vdprintf.m4: New file.
+ * m4/vdprintf-posix.m4: New file.
+ * modules/vdprintf: New file.
+ * modules/vdprintf-posix: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Initialize GNULIB_VDPRINTF,
+ HAVE_VDPRINTF, REPLACE_VDPRINTF.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_VDPRINTF,
+ HAVE_VDPRINTF, REPLACE_VDPRINTF.
+ * doc/posix-functions/vdprintf.texi: Mention the new modules.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ Fix replacement of fopen on mingw.
+ * m4/fopen.m4 (gl_FUNC_FOPEN): Define FOPEN_TRAILING_SLASH_BUG also on
+ mingw.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ Fix compilation error on HP-UX 11.00, present since 2008-09-24.
+ * lib/fopen.c: Include <sys/types.h> and <sys/types.h>.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ Avoid test-fflush2.sh failure on mingw.
+ * tests/test-fflush2.c: Include binary-io.h.
+ (main): Put standard input into binary mode.
+ * modules/fflush-tests (Depends-on): Add binary-io.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/wchar.in.h: In another particular situation, include only the
+ system's <wchar.h> file.
+ (_GL_ALREADY_INCLUDING_WCHAR_H): New macro.
+ Reported by Albert Chin-A-Young <china@thewrittenword.com>
+ and Thomas Guyot-Sionnest <dermoth@aei.ca>.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ Support for stripping executables in --enable-relocatable.
+ * build-aux/install-reloc: Expect one more argument, or an environment
+ variable RELOC_STRIP_PROG. If set, strip the destination program and
+ its wrapper.
+ * m4/relocatable.m4 (gl_RELOCATABLE_BODY): In INSTALL_PROGRAM_ENV, set
+ RELOC_STRIP_PROG.
+ * doc/relocatable-maint.texi (Supporting Relocation): Mention the need
+ to set RELOCATABLE_STRIP.
+ * NEWS: Mention the new Makefile requirement.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/install-reloc: Remove debugging information left over by
+ C compiler on MacOS X.
+
+2009-01-17 Bruno Haible <bruno@clisp.org>
+
+ Update use of _NSGetExecutablePath after API change in MacOS X 10.4.
+ * lib/progreloc.c (find_executable): Fix type of pointer passed to
+ _NSGetExecutablePath.
+
+2009-01-16 Jim Meyering <meyering@redhat.com>
+
+ strerror: avoid warnings about discarding "const"
+ * lib/strerror.c (rpl_strerror): Instead of returning a const
+ string from each and every "case", use a variable, and add a single
+ cast after the switch.
+
+2009-01-16 Albert Chin-A-Young <china@thewrittenword.com>
+
+ * lib/arpa_inet.in.h: Add extern "C" block for C++.
+
+2009-01-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_SNPRINTF_SIZE1, gl_VSNPRINTF_ZEROSIZE_C99): Use an
+ array initializer syntax that also works in C++ mode.
+ Reported by Albert Chin <bug-gnulib@mlists.thewrittenword.com>.
+
+2009-01-16 Jim Meyering <meyering@redhat.com>
+
+ poll: suppress a warning
+ * lib/poll.c: Use #pragma GCC diagnostic ignored "-Wtype-limits"
+ to ignore "...unsigned expression < 0 is always false" warnings.
+
+2009-01-16 Daniel P. Berrange <berrange@redhat.com>
+
+ poll: remove declarations of unused variables
+ * lib/poll.c (poll) [WIN32_NATIVE]: Remove declarations of unused
+ sockbuf and optlen.
+
+2009-01-15 Bruno Haible <bruno@clisp.org>
+
+ Make fflush-after-ungetc POSIX compliant on BSD systems.
+ * lib/fflush.c (clear_ungetc_buffer_preserving_position): New function.
+ (clear_ungetc_buffer): Implement also for other systems.
+ (rpl_fflush): On glibc systems, invoke
+ clear_ungetc_buffer_preserving_position. Otherwise, invoke
+ clear_ungetc_buffer after fetching the stream's position, not before.
+
+2009-01-15 Bruno Haible <bruno@clisp.org>
+
+ Make fflush-after-ungetc POSIX compliant on glibc systems.
+ * m4/fflush.m4 (gl_FUNC_FFLUSH): Test also the behaviour of fflush
+ after ungetc.
+ * lib/fflush.c (clear_ungetc_buffer): Implement for glibc systems.
+ (rpl_fflush): On glibc systems, simply call the system's fflush
+ function after clearing the ungetc buffer.
+ * lib/fseeko.c (rpl_fseeko): Don't try to lseek past the end of file.
+ Instead, lseek only to the end of file, then use the system's fseeko
+ for the rest. On glibc systems, reset the EOF indicator bit.
+
+2009-01-15 Jim Meyering <meyering@redhat.com>
+
+ openmp.m4: revert quote-adding change, for portability to older autoconf
+ * m4/openmp.m4: Remove the quotes added on 2009-01-14.
+ This reverts part of 42d1eda5dcce2d68deab7a642e7f29bcd7144a0d.
+ Simon Josefsson noticed the problem when using autoconf-2.61.
+
+2009-01-15 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fflush2.sh: Invoke test-fflush2 twice.
+ * tests/test-fflush2.c (ASSERT): Always fail.
+ (main): Add two tests for fflush() after ungetc(), taking into account
+ the Austin Group's clarification.
+ Suggested by Eric Blake.
+
+2009-01-15 Albert Chin-A-Young <china@thewrittenword.com>
+
+ mktime.m4: remove K&R-style function prototypes
+ * m4/mktime.m4 (AC_FUNC_MKTIME): Remove K&R-style function prototypes
+ for the Sun C++ compiler.
+
+2009-01-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint.in.h (_GL_JUST_INCLUDE_SYSTEM_WCHAR_H): New macro, defined
+ while including <wchar.h>.
+ * lib/wchar.in.h: In two particular situations on HP-UX, include only
+ the system's <wchar.h> file.
+ Reported by Albert Chin <bug-gnulib@mlists.thewrittenword.com>.
+
+2009-01-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/csharp.m4: Don't mention gettext on the serial number line.
+ * m4/csharpexec.m4: Likewise.
+ * m4/eaccess.m4: Likewise.
+ * m4/javaexec.m4: Likewise.
+ * m4/sig_atomic_t.m4: Likewise.
+ * m4/tmpdir.m4: Likewise.
+ * m4/intldir.m4: Bump gettext version.
+ * m4/lib-ld.m4: Likewise.
+
+2009-01-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.c (set_program_name): Add more comments.
+ Reported by Sergey Poznyakoff <gray@gnu.org.ua>.
+
+2009-01-14 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sys_stat.in.h: Include sys/types.h for nlink_t on systems
+ were sys/stat.h does not define it.
+
+2009-01-14 Jim Meyering <meyering@redhat.com>
+
+ many *.m4 files: improve m4 quoting
+ 99% of this change was performed by running the following commands:
+ git ls-files | grep '\.m4$' | xargs perl -pi \
+ -e 's/(AC_\w+\()([^[()]+?)([,)])/$1\[$2]$3/g;' \
+ -e 's/(AC_\w+\((?:\[[^,]+?\], ){1})([^,[()]+?)([,)])/$1\[$2]$3/g;' \
+ -e 's/(AC_\w+\((?:\[[^,]+?\], ){2})([^,[()]+?)([,)])/$1\[$2]$3/g;' \
+ -e 's/(AC_\w+\((?:\[[^,]+?\], ){3})([^,[()]+?)([,)])/$1\[$2]$3/g'
+ perl -pi -e 's/\[\.\.\.\]/.../' m4/onceonly.m4
+ The remainder were to add Copyright dates, increment serial numbers,
+ undo some changes in comments, exclude m4/intl.m4, and add quotes
+ around the "1" in ",1" where the unusual spacing prohibited the
+ above regexps from doing the job. For more details, see
+ <http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/16175>.
+ * m4/acl.m4: Modified.
+ * m4/afs.m4: Likewise.
+ * m4/alloca.m4: Likewise.
+ * m4/argp.m4: Likewise.
+ * m4/argz.m4: Likewise.
+ * m4/atexit.m4: Likewise.
+ * m4/bison-i18n.m4: Likewise.
+ * m4/bison.m4: Likewise.
+ * m4/byteswap.m4: Likewise.
+ * m4/c-stack.m4: Likewise.
+ * m4/c-strtod.m4: Likewise.
+ * m4/calloc.m4: Likewise.
+ * m4/canonicalize-lgpl.m4: Likewise.
+ * m4/chown.m4: Likewise.
+ * m4/clock_time.m4: Likewise.
+ * m4/codeset.m4: Likewise.
+ * m4/copy-file.m4: Likewise.
+ * m4/csharp.m4: Likewise.
+ * m4/csharpcomp.m4: Likewise.
+ * m4/csharpexec.m4: Likewise.
+ * m4/d-ino.m4: Likewise.
+ * m4/d-type.m4: Likewise.
+ * m4/dirfd.m4: Likewise.
+ * m4/double-slash-root.m4: Likewise.
+ * m4/eaccess.m4: Likewise.
+ * m4/eealloc.m4: Likewise.
+ * m4/environ.m4: Likewise.
+ * m4/errno_h.m4: Likewise.
+ * m4/euidaccess.m4: Likewise.
+ * m4/execute.m4: Likewise.
+ * m4/fatal-signal.m4: Likewise.
+ * m4/fchdir.m4: Likewise.
+ * m4/fcntl_h.m4: Likewise.
+ * m4/fileblocks.m4: Likewise.
+ * m4/filenamecat.m4: Likewise.
+ * m4/findprog.m4: Likewise.
+ * m4/flexmember.m4: Likewise.
+ * m4/fnmatch.m4: Likewise.
+ * m4/fopen.m4: Likewise.
+ * m4/fpending.m4: Likewise.
+ * m4/fprintf-posix.m4: Likewise.
+ * m4/free.m4: Likewise.
+ * m4/frexp.m4: Likewise.
+ * m4/frexpl.m4: Likewise.
+ * m4/fsusage.m4: Likewise.
+ * m4/ftruncate.m4: Likewise.
+ * m4/gc-camellia.m4: Likewise.
+ * m4/gc-random.m4: Likewise.
+ * m4/gc.m4: Likewise.
+ * m4/getaddrinfo.m4: Likewise.
+ * m4/getcwd-abort-bug.m4: Likewise.
+ * m4/getcwd-path-max.m4: Likewise.
+ * m4/getdate.m4: Likewise.
+ * m4/getdomainname.m4: Likewise.
+ * m4/getgroups.m4: Likewise.
+ * m4/gethostname.m4: Likewise.
+ * m4/gethrxtime.m4: Likewise.
+ * m4/getline.m4: Likewise.
+ * m4/getloadavg.m4: Likewise.
+ * m4/getndelim2.m4: Likewise.
+ * m4/getpass.m4: Likewise.
+ * m4/gettext.m4: Likewise.
+ * m4/gettime.m4: Likewise.
+ * m4/gettimeofday.m4: Likewise.
+ * m4/gnulib-common.m4: Likewise.
+ * m4/group-member.m4: Likewise.
+ * m4/host-os.m4: Likewise.
+ * m4/iconv.m4: Likewise.
+ * m4/iconv_open.m4: Likewise.
+ * m4/inet_ntop.m4: Likewise.
+ * m4/inet_pton.m4: Likewise.
+ * m4/inline.m4: Likewise.
+ * m4/intldir.m4: Likewise.
+ * m4/intlmacosx.m4: Likewise.
+ * m4/intmax.m4: Likewise.
+ * m4/intmax_t.m4: Likewise.
+ * m4/inttypes.m4: Likewise.
+ * m4/inttypes_h.m4: Likewise.
+ * m4/inttypes-pri.m4: Likewise.
+ * m4/isapipe.m4: Likewise.
+ * m4/isnand.m4: Likewise.
+ * m4/isnanf.m4: Likewise.
+ * m4/isnanl.m4: Likewise.
+ * m4/javacomp.m4: Likewise.
+ * m4/javaexec.m4: Likewise.
+ * m4/jm-winsz1.m4: Likewise.
+ * m4/jm-winsz2.m4: Likewise.
+ * m4/lchown.m4: Likewise.
+ * m4/lcmessage.m4: Likewise.
+ * m4/ldexpl.m4: Likewise.
+ * m4/lib-ld.m4: Likewise.
+ * m4/lib-link.m4: Likewise.
+ * m4/libsigsegv.m4: Likewise.
+ * m4/link-follow.m4: Likewise.
+ * m4/localcharset.m4: Likewise.
+ * m4/locale-fr.m4: Likewise.
+ * m4/locale-ja.m4: Likewise.
+ * m4/locale-tr.m4: Likewise.
+ * m4/locale-zh.m4: Likewise.
+ * m4/lock.m4: Likewise.
+ * m4/longlong.m4: Likewise.
+ * m4/ls-mntd-fs.m4: Likewise.
+ * m4/lstat.m4: Likewise.
+ * m4/malloc.m4: Likewise.
+ * m4/mathl.m4: Likewise.
+ * m4/mbrtowc.m4: Likewise.
+ * m4/mbstate_t.m4: Likewise.
+ * m4/mbswidth.m4: Likewise.
+ * m4/memchr.m4: Likewise.
+ * m4/memcmp.m4: Likewise.
+ * m4/memcpy.m4: Likewise.
+ * m4/memmem.m4: Likewise.
+ * m4/memmove.m4: Likewise.
+ * m4/mempcpy.m4: Likewise.
+ * m4/memrchr.m4: Likewise.
+ * m4/memset.m4: Likewise.
+ * m4/minmax.m4: Likewise.
+ * m4/mkdir-slash.m4: Likewise.
+ * m4/mkdtemp.m4: Likewise.
+ * m4/mktime.m4: Likewise.
+ * m4/mmap-anon.m4: Likewise.
+ * m4/mountlist.m4: Likewise.
+ * m4/nanosleep.m4: Likewise.
+ * m4/nls.m4: Likewise.
+ * m4/nocrash.m4: Likewise.
+ * m4/open.m4: Likewise.
+ * m4/openat.m4: Likewise.
+ * m4/openmp.m4: Likewise.
+ * m4/pathmax.m4: Likewise.
+ * m4/perl.m4: Likewise.
+ * m4/physmem.m4: Likewise.
+ * m4/pipe.m4: Likewise.
+ * m4/po.m4: Likewise.
+ * m4/poll.m4: Likewise.
+ * m4/posixtm.m4: Likewise.
+ * m4/posixver.m4: Likewise.
+ * m4/printf-frexp.m4: Likewise.
+ * m4/printf-frexpl.m4: Likewise.
+ * m4/printf-posix.m4: Likewise.
+ * m4/printf-posix-rpl.m4: Likewise.
+ * m4/printf.m4: Likewise.
+ * m4/progtest.m4: Likewise.
+ * m4/putenv.m4: Likewise.
+ * m4/readline.m4: Likewise.
+ * m4/readlink.m4: Likewise.
+ * m4/readutmp.m4: Likewise.
+ * m4/realloc.m4: Likewise.
+ * m4/regex.m4: Likewise.
+ * m4/relocatable.m4: Likewise.
+ * m4/relocatable-lib.m4: Likewise.
+ * m4/rename-dest-slash.m4: Likewise.
+ * m4/rename.m4: Likewise.
+ * m4/rmdir-errno.m4: Likewise.
+ * m4/rmdir.m4: Likewise.
+ * m4/roundf.m4: Likewise.
+ * m4/roundl.m4: Likewise.
+ * m4/rpmatch.m4: Likewise.
+ * m4/save-cwd.m4: Likewise.
+ * m4/selinux-selinux-h.m4: Likewise.
+ * m4/setenv.m4: Likewise.
+ * m4/settime.m4: Likewise.
+ * m4/sig2str.m4: Likewise.
+ * m4/sig_atomic_t.m4: Likewise.
+ * m4/signalblocking.m4: Likewise.
+ * m4/signbit.m4: Likewise.
+ * m4/sigpipe.m4: Likewise.
+ * m4/sockets.m4: Likewise.
+ * m4/sockpfaf.m4: Likewise.
+ * m4/st_dm_mode.m4: Likewise.
+ * m4/stat-time.m4: Likewise.
+ * m4/stdbool.m4: Likewise.
+ * m4/stdint.m4: Likewise.
+ * m4/stdint_h.m4: Likewise.
+ * m4/stpcpy.m4: Likewise.
+ * m4/stpncpy.m4: Likewise.
+ * m4/strcase.m4: Likewise.
+ * m4/strchrnul.m4: Likewise.
+ * m4/strcspn.m4: Likewise.
+ * m4/strdup.m4: Likewise.
+ * m4/strftime.m4: Likewise.
+ * m4/strndup.m4: Likewise.
+ * m4/strnlen.m4: Likewise.
+ * m4/strpbrk.m4: Likewise.
+ * m4/strptime.m4: Likewise.
+ * m4/strsep.m4: Likewise.
+ * m4/strtod.m4: Likewise.
+ * m4/strtoimax.m4: Likewise.
+ * m4/strtok_r.m4: Likewise.
+ * m4/strtol.m4: Likewise.
+ * m4/strtoll.m4: Likewise.
+ * m4/strtoul.m4: Likewise.
+ * m4/strtoull.m4: Likewise.
+ * m4/strtoumax.m4: Likewise.
+ * m4/strverscmp.m4: Likewise.
+ * m4/threadlib.m4: Likewise.
+ * m4/timegm.m4: Likewise.
+ * m4/tm_gmtoff.m4: Likewise.
+ * m4/tmpdir.m4: Likewise.
+ * m4/tmpfile.m4: Likewise.
+ * m4/tzset.m4: Likewise.
+ * m4/uintmax_t.m4: Likewise.
+ * m4/unlinkdir.m4: Likewise.
+ * m4/unlocked-io.m4: Likewise.
+ * m4/uptime.m4: Likewise.
+ * m4/userspec.m4: Likewise.
+ * m4/utimbuf.m4: Likewise.
+ * m4/utime.m4: Likewise.
+ * m4/utimes-null.m4: Likewise.
+ * m4/utimes.m4: Likewise.
+ * m4/vararrays.m4: Likewise.
+ * m4/vasnprintf.m4: Likewise.
+ * m4/vfprintf-posix.m4: Likewise.
+ * m4/vprintf-posix.m4: Likewise.
+ * m4/wait-process.m4: Likewise.
+ * m4/wchar_t.m4: Likewise.
+ * m4/wint_t.m4: Likewise.
+ * m4/write-any-file.m4: Likewise.
+ * m4/yield.m4: Likewise.
+
+2009-01-13 Bruno Haible <bruno@clisp.org>
+
+ Avoid test-copy-file.sh failures when ACL support insufficient.
+ * modules/copy-file-tests (Makefile.am): Pass USE_ACL in
+ TESTS_ENVIRONMENT.
+ * tests/test-copy-file.sh: Skip the ACL comparisons if USE_ACL is 0.
+ Reported by Jim Meyering.
+
+2009-01-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistdio/u-printf-args (Files): Add m4/stdint_h.m4 and
+ m4/inttypes_h.m4, needed by m4/intmax_t.m4.
+ * modules/unistdio/u8-printf-parse (Files): Likewise.
+ * modules/unistdio/u32-printf-parse (Files): Likewise.
+ * modules/unistdio/ulc-printf-parse (Files): Likewise.
+
+2009-01-13 Simon Josefsson <simon@josefsson.org>
+
+ * modules/unistdio/u16-printf-parse (Files): Add m4/stdint_h.m4
+ and m4/inttypes_h.m4 too.
+
+2009-01-12 Eric Blake <ebb9@byu.net>
+
+ tests: IRIX 6.2 cc can't compile -0.0 into .data
+ * tests/test-ceill.c (minus_zero): Compute -0.0L at runtime,
+ rather than at compile-time.
+ * tests/test-floorl.c (minus_zero): Likewise.
+ * tests/test-frexpl.c (minus_zero): Likewise.
+ * tests/test-isnan.c (minus_zerol): Likewise.
+ * tests/test-isnanl.h (minus_zero): Likewise.
+ * tests/test-ldexpl.c (minus_zero): Likewise.
+ * tests/test-roundl.c (minus_zero): Likewise.
+ * tests/test-signbit.c (minus_zerol): Likewise.
+ * tests/test-snprintf-posix.h (minus_zerol): Likewise.
+ * tests/test-sprintf-posix.h (minus_zerol): Likewise.
+ * tests/test-truncl.c (minus_zero): Likewise.
+ * tests/test-vasnprintf-posix.c (minus_zerol): Likewise.
+ * tests/test-vasprintf-posix.c (minus_zerol): Likewise.
+ Reported by Tom G. Christensen and Nelson H. F. Beebe.
+
+2009-01-09 Paolo Bonzini <bonzini@gnu.org>
+
+ regex: fix glibc bug 9697
+ * lib/regcomp.c (re_compile_fastmap_iter): Rewrite COMPLEX_BRACKET
+ handling.
+
+2009-01-09 Paolo Bonzini <bonzini@gnu.org>
+
+ regex: fix glibc bug 697
+ * lib/regexec.c (prune_impossible_nodes): Handle sifted_states[0]
+ being NULL also if there are no backreferences.
+
+2009-01-09 Paolo Bonzini <bonzini@gnu.org>
+
+ regex: merge glibc changes
+ * lib/regcomp.c (re_compile_fastmap_iter): Use __mbrtowc.
+ * lib/regex_internal.c (build_wcs_buffer, build_wcs_upper_buffer,
+ re_string_skip_chars, re_string_reconstruct): Likewise.
+ * lib/regex_internal.h [!_LIBC] (__mbrtowc): New #define.
+
+2009-01-07 Jim Meyering <meyering@redhat.com>
+
+ poll: filter through cppi
+ * lib/poll.c: Indent cpp directives to reflect nesting.
+
+2009-01-07 Daniel P. Berrange <berrange@redhat.com>
+
+ poll: don't return uninitialized
+ * lib/poll.c (poll) [WIN32_NATIVE]: Initialize "rc".
+
+2009-01-06 Jeremy Olexa <darkside@gentoo.org> (tiny change)
+
+ avoid compile failure on AIX 6.1
+ * lib/getloadavg.c [HAVE_LIBPERFSTAT]: Include <sys/protosw.h>.
+ Details in http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/15465
+
+2009-01-04 Jim Meyering <meyering@redhat.com>
+
+ remove duplicate inclusion of <stdio.h>
+ * tests/test-fprintf-posix.c: Likewise.
+ * tests/test-printf-posix.c: Likewise.
+ * tests/test-snprintf-posix.c: Likewise.
+ * tests/test-sprintf-posix.c: Likewise.
+ * tests/test-vasprintf-posix.c: Likewise.
+ * tests/test-vfprintf-posix.c: Likewise.
+ * tests/test-vprintf-posix.c: Likewise.
+ * tests/test-vsnprintf-posix.c: Likewise.
+ * tests/test-vsprintf-posix.c: Likewise.
+
+2009-01-03 Jim Meyering <meyering@redhat.com>
+
+ gnulib-tool: fix sed-based filtering
+ * gnulib-tool (func_filter_filelist): Remove extra backslash
+ in sed_fff_filter definition.
+
+2009-01-02 Jim Meyering <meyering@redhat.com>
+
+ strftime: avoid compilation failure on Solaris 2.6
+ * modules/strftime (Depends-on): Add mbrlen and mbsinit.
+ * lib/strftime.c [DO_MULTIBYTE]: Include <wchar.h> unconditionally.
+ Don't #define mbrlen or mbsinit, since now they're guaranteed to
+ be available. Reported by Tom G. Christensen. Details in
+ <http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/16180>.
+
+2009-01-01 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ Speed up gnulib-tool by doing more string processing through shell
+ built-ins.
+ * gnulib-tool (fast_func_append): New variable.
+ (func_remove_prefix, func_remove_suffix): New functions.
+ (fast_func_remove_prefix, fast_func_remove_suffix): New variables.
+ (func_filter_filelist): New function.
+ (func_get_dependencies): Use func_remove_suffix instead of sed.
+ (func_get_automake_snippet): Use func_filter_filelist instead of a
+ subshell and sed invocation.
+
+2009-01-01 Bruno Haible <bruno@clisp.org>
+
+ Fix a security bug.
+ * gnulib-tool (func_import, import, update): Don't allow the characters
+ '"', '$', '`', '\' in macro arguments that become part of commands that
+ are evaluated.
+
+2009-01-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_reset_sigpipe): Add more comments.
+
+2009-01-01 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_modules_add_dummy, func_emit_lib_Makefile_am,
+ func_emit_tests_Makefile_am, func_import): Abort loops early if we
+ already know the answer.
+
+2009-01-01 Jim Meyering <meyering@redhat.com>
+
+ * lib/version-etc.c (version_etc_va): Update copyright year.
+
+2008-12-30 Bruno Haible <bruno@clisp.org>
+
+ * m4/lib-prefix.m4 (AC_LIB_LINKFLAGS_BODY): Don't overwrite
+ LIB${NAME}_PREFIX when considering the dependencies of lib${name}.
+ Reported by Charles Wilson <cygwin@cwilson.fastmail.fm>.
+
+2008-12-29 Eric Blake <ebb9@byu.net>
+
+ multiarch: avoid autoconf AC_REQUIRE bug
+ * m4/multiarch.m4 (gl_MULTIARCH): Split body...
+ (gl_MULTIARCH_BODY): ...into new macro, to work around bug in Autoconf
+ 2.63 and older.
+ Reported by Bruno Haible, and analyzed in
+ http://lists.gnu.org/archive/html/bug-autoconf/2008-12/msg00039.html
+
+2008-12-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): When generating sed-ignore-removed, handle
+ files in subdirectories correctly.
+ Reported by Ralf Wildenhues.
+
+2008-12-29 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_update_ignorelist): Use 'join - FILE'
+ rather than 'join FILE -', for Solaris join.
+
+2008-12-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/codeset.m4 (AM_LANGINFO_CODESET): More systematic m4 argument
+ quoting.
+ * m4/gettext.m4 (AM_GNU_GETTEXT): Likewise.
+ * m4/glibc2.m4 (gt_GLIBC2): Likewise.
+ * m4/glibc21.m4 (gl_GLIBC21): Likewise.
+ * m4/iconv.m4 (AM_ICONV_LINK, AM_ICONV): Likewise.
+ * m4/intdiv0.m4 (gt_INTDIV0): Likewise.
+ * m4/intlmacosx.m4 (gt_INTL_MACOSX): Likewise.
+ * m4/intmax.m4 (gt_TYPE_INTMAX_T): Likewise.
+ * m4/inttypes-pri.m4 (gt_INTTYPES_PRI): Likewise.
+ * m4/inttypes_h.m4 (gl_AC_HEADER_INTTYPES_H): Likewise.
+ * m4/lcmessage.m4 (gt_LC_MESSAGES): Likewise.
+ * m4/nls.m4 (AM_NLS): Likewise.
+ * m4/po.m4 (AM_PO_SUBDIRS): Likewise.
+ * m4/printf-posix.m4 (gt_PRINTF_POSIX): Likewise.
+ * m4/progtest.m4 (AM_PATH_PROG_WITH_TEST): Likewise.
+ * m4/size_max.m4 (gl_SIZE_MAX): Likewise.
+ * m4/stdint_h.m4 (gl_AC_HEADER_STDINT_H): Likewise.
+ * m4/threadlib.m4 (gl_THREADLIB_BODY): Likewise.
+ * m4/uintmax_t.m4 (gl_AC_TYPE_UINTMAX_T): Likewise.
+ * m4/visibility.m4 (gl_VISIBILITY): Likewise.
+ * m4/wchar_t.m4 (gt_TYPE_WCHAR_T): Likewise.
+ * m4/wint_t.m4 (gt_TYPE_WINT_T): Likewise.
+ * m4/xsize.m4 (gl_XSIZE): Likewise.
+ Suggested by Jim Meyering.
+
+2008-11-17 Bruce Korb <bkorb@gnu.org>
+
+ * lib/parse-duration.h: non-iso form accepts years, months weeks, too
+ * lib/parse-duration.c: use a switch instead of cascading if's.
+
+2008-12-29 Eric Blake <ebb9@byu.net>
+
+ wchar.h: supply WEOF on Irix 5.3
+ * lib/wchar.in.h (wint_t): Also supply WEOF.
+ * lib/wctype.in.h (wint_t): Likewise.
+ * doc/posix-headers/wchar.texi (wchar.h): Document the bug.
+ * doc/posix-headers/wctype.texi (wctype.h): Likewise.
+ Reported by Tom G. Christensen.
+
+2008-12-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/multiarch.m4 (gl_MULTIARCH): Recognize also the architecture names
+ i486, i586, i686.
+
+2008-12-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdlib.in.h (struct random_data): Fix indentation of comments.
+
+2008-12-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint.in.h: Move the include of <wchar.h> down until after all
+ the types are defined. Also conditionalize it on __STDC_LIMIT_MACROS,
+ not __STDC_CONSTANT_MACROS.
+ Reported by Nelson H. F. Beebe <beebe@math.utah.edu> via Eric Blake.
+
+2008-12-25 Bruno Haible <bruno@clisp.org>
+
+ Add support for universal builds to vasnprintf.
+ * m4/printf.m4 (gl_PRINTF_ENOMEM): Require gl_MULTIARCH. In Apple
+ universal builds, guess no.
+ * modules/vasnprintf-posix (Depends-on): Add multiarch.
+ * modules/vasprintf-posix (Depends-on): Likewise.
+ * modules/fprintf-posix (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/snprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf-posix (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+ * modules/unistdio/u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vasnprintf (Depends-on): Likewise.
+
+ Add support for universal builds to <inttypes.h>.
+ * lib/inttypes.in.h (_PRI64_PREFIX, _PRIu64_PREFIX, _SCN64_PREFIX,
+ _SCNu64_PREFIX): In Apple
+ universal builds, define directly, using _LP64.
+ * m4/inttypes.m4 (gl_INTTYPES_H): In Apple universal builds, set
+ INT64_MAX_EQ_LONG_MAX and UINT64_MAX_EQ_ULONG_MAX to -1.
+ * modules/inttypes (Depends-on): Add multiarch.
+ (Makefile.am): Substitute APPLE_UNIVERSAL_BUILD.
+
+ Add support for universal builds to <stdint.h>.
+ * lib/stdint.in.h (PDFDIFF_MIN, PTRDIFF_MAX, SIZE_MAX): In Apple
+ universal builds, define directly, using _LP64.
+ * m4/stdint.m4 (gl_STDINT_TYPE_PROPERTIES): Require gl_MULTIARCH. In
+ Apple universal builds, don't test for the size and suffix of ptrdiff_t
+ and size_t.
+ * modules/stdint (Depends-on): Add multiarch.
+ (Makefile.am): Substitute APPLE_UNIVERSAL_BUILD.
+
+ New module 'multiarch'.
+ * modules/multiarch: New file.
+ * m4/multiarch.m4: New file.
+
+2008-12-25 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Avoid failure of mv command.
+
+2008-12-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/btowc (License): Relicense under LGPLv2+.
+ * modules/mbsinit (License): Likewise.
+ * modules/mbrtowc (License): Likewise.
+ * modules/wcrtomb (License): Likewise.
+ * modules/streq (License): Likewise.
+ Reported by David Lutterkort <lutter@redhat.com>.
+
+2008-12-23 Bruno Haible <bruno@clisp.org>
+
+ * m4/fsusage.m4 (gl_FILE_SYSTEM_USAGE): Fix conditional and comment.
+
+2008-12-23 Bruno Haible <bruno@clisp.org>
+
+ Module getaddrinfo requires linking with $(GETADDRINFO_LIB).
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Put link options into
+ GETADDRINFO_LIB, not in LIBS.
+ * modules/getaddrinfo (Link): Set to $(GETADDRINFO_LIB).
+ * modules/canon-host (Link): Likewise.
+ * NEWS: Mention the change.
+ * modules/getaddrinfo-tests (test_getaddrinfo_LDADD): Add the
+ GETADDRINFO_LIB.
+
+2008-12-22 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/iswalnum_l.texi: Mention limitation of wchar_t.
+ * doc/posix-functions/iswalpha_l.texi: Likewise.
+ * doc/posix-functions/iswblank_l.texi: Likewise.
+ * doc/posix-functions/iswcntrl_l.texi: Likewise.
+ * doc/posix-functions/iswctype_l.texi: Likewise.
+ * doc/posix-functions/iswdigit_l.texi: Likewise.
+ * doc/posix-functions/iswgraph_l.texi: Likewise.
+ * doc/posix-functions/iswlower_l.texi: Likewise.
+ * doc/posix-functions/iswprint_l.texi: Likewise.
+ * doc/posix-functions/iswpunct_l.texi: Likewise.
+ * doc/posix-functions/iswspace_l.texi: Likewise.
+ * doc/posix-functions/iswupper_l.texi: Likewise.
+ * doc/posix-functions/iswxdigit_l.texi: Likewise.
+ * doc/posix-functions/mbsnrtowcs.texi: Likewise.
+ * doc/posix-functions/open_wmemstream.texi: Likewise.
+ * doc/posix-functions/swscanf.texi: Likewise.
+ * doc/posix-functions/towctrans_l.texi: Likewise.
+ * doc/posix-functions/towlower.texi: Likewise.
+ * doc/posix-functions/towlower_l.texi: Likewise.
+ * doc/posix-functions/towupper.texi: Likewise.
+ * doc/posix-functions/towupper_l.texi: Likewise.
+ * doc/posix-functions/vfwprintf.texi: Likewise.
+ * doc/posix-functions/vfwscanf.texi: Likewise.
+ * doc/posix-functions/vswscanf.texi: Likewise.
+ * doc/posix-functions/vwprintf.texi: Likewise.
+ * doc/posix-functions/vwscanf.texi: Likewise.
+ * doc/posix-functions/wcpcpy.texi: Likewise.
+ * doc/posix-functions/wcpncpy.texi: Likewise.
+ * doc/posix-functions/wcscasecmp.texi: Likewise.
+ * doc/posix-functions/wcscasecmp_l.texi: Likewise.
+ * doc/posix-functions/wcscoll_l.texi: Likewise.
+ * doc/posix-functions/wcsdup.texi: Likewise.
+ * doc/posix-functions/wcsncasecmp.texi: Likewise.
+ * doc/posix-functions/wcsncasecmp_l.texi: Likewise.
+ * doc/posix-functions/wcsnlen.texi: Likewise.
+ * doc/posix-functions/wcsnrtombs.texi: Likewise.
+ * doc/posix-functions/wcsxfrm_l.texi: Likewise.
+ * doc/posix-functions/wctrans_l.texi: Likewise.
+ * doc/posix-functions/wctype_l.texi: Likewise.
+ * doc/glibc-functions/fgetwc_unlocked.texi: Likewise.
+ * doc/glibc-functions/fgetws_unlocked.texi: Likewise.
+ * doc/glibc-functions/fputwc_unlocked.texi: Likewise.
+ * doc/glibc-functions/fputws_unlocked.texi: Likewise.
+ * doc/glibc-functions/getwc_unlocked.texi: Likewise.
+ * doc/glibc-functions/getwchar_unlocked.texi: Likewise.
+ * doc/glibc-functions/putwc_unlocked.texi: Likewise.
+ * doc/glibc-functions/putwchar_unlocked.texi: Likewise.
+ * doc/glibc-functions/wcschrnul.texi: Likewise.
+ * doc/glibc-functions/wcsftime_l.texi: Likewise.
+ * doc/glibc-functions/wcstod_l.texi: Likewise.
+ * doc/glibc-functions/wcstof_l.texi: Likewise.
+ * doc/glibc-functions/wcstol_l.texi: Likewise.
+ * doc/glibc-functions/wcstold_l.texi: Likewise.
+ * doc/glibc-functions/wcstoll_l.texi: Likewise.
+ * doc/glibc-functions/wcstoq.texi: Likewise.
+ * doc/glibc-functions/wcstoul_l.texi: Likewise.
+ * doc/glibc-functions/wcstoull_l.texi: Likewise.
+ * doc/glibc-functions/wcstouq.texi: Likewise.
+ * doc/glibc-functions/wmempcpy.texi: Likewise.
+
+2008-12-22 Ingo Weinhold <ingo_weinhold@gmx.de> (tiny change)
+ Eric Blake <ebb9@byu.net>
+ Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Make c-stack work on Haiku.
+ * lib/c-stack.c (SA_ONSTACK): Define fallback.
+ (c_stack_action): Use SA_ONSTACK flag.
+
+2008-12-22 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-fr.m4 (gt_LOCALE_FR_UTF8): Treat Haiku like BeOS.
+
+2008-12-22 Bruno Haible <bruno@clisp.org>
+
+ Work around mbrlen() bugs on AIX, HP-UX, OSF/1, Solaris.
+ * m4/mbrlen.m4 (gl_FUNC_MBRLEN): Set REPLACE_MBRLEN if mbrtowc is
+ being overridden.
+ (gl_MBRLEN_INCOMPLETE_STATE, gl_MBRLEN_RETVAL, gl_MBRLEN_NUL_RETVAL):
+ New macros.
+ * lib/wchar.in.h (mbrlen): Override if REPLACE_MBRLEN is set.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize REPLACE_MBRLEN.
+ * modules/wchar (Makefile.am): Substitute REPLACE_MBRLEN.
+ * doc/posix-functions/mbrlen.texi: Mention the various platform bugs.
+
+2008-12-22 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbrtowc.m4 (gl_MBRTOWC_INCOMPLETE_STATE): Remove unused variable
+ from test code.
+
+2008-12-22 Eric Blake <ebb9@byu.net>
+
+ Avoid gcc warnings on cygwin.
+ * lib/regex_internal.c (re_string_reconstruct) [!RE_ENABLE_I18N]:
+ Avoid unused variable.
+ * lib/regexec.c (check_arrival_add_next_nodes) [!RE_ENABLE_I18N]:
+ Likewise.
+
+2008-12-22 Bruno Haible <bruno@clisp.org>
+
+ Remove HAVE_MBRTOWC conditionals.
+ * lib/mbscasecmp.c: Include mbuiter.h unconditionally.
+ (mbscasecmp): Assume mbrtowc function.
+ * lib/mbscasestr.c: Include mbuiter.h unconditionally.
+ (knuth_morris_pratt_multibyte, mbscasestr): Assume mbrtowc function.
+ * lib/mbschr.c: Include mbuiter.h unconditionally.
+ (mbschr): Assume mbrtowc function.
+ * lib/mbscspn.c: Include mbuiter.h unconditionally.
+ (mbscspn): Assume mbrtowc function.
+ * lib/mbslen.c: Include mbuiter.h unconditionally.
+ (mbslen): Assume mbrtowc function.
+ * lib/mbsncasecmp.c: Include mbuiter.h unconditionally.
+ (mbsncasecmp): Assume mbrtowc function.
+ * lib/mbsnlen.c: Include mbiter.h unconditionally.
+ (mbsnlen): Assume mbrtowc function.
+ * lib/mbspbrk.c: Include mbuiter.h unconditionally.
+ (mbspbrk): Assume mbrtowc function.
+ * lib/mbspcasecmp.c: Include mbuiter.h unconditionally.
+ (mbspcasecmp): Assume mbrtowc function.
+ * lib/mbsrchr.c: Include mbuiter.h unconditionally.
+ (mbsrchr): Assume mbrtowc function.
+ * lib/mbssep.c: Include mbuiter.h unconditionally.
+ (mbssep): Assume mbrtowc function.
+ * lib/mbsspn.c: Include mbuiter.h unconditionally.
+ (mbsspn): Assume mbrtowc function.
+ * lib/mbsstr.c: Include mbuiter.h unconditionally.
+ (knuth_morris_pratt_multibyte, mbsstr): Assume mbrtowc function.
+ * lib/mbstok_r.c: Include mbuiter.h unconditionally.
+ (mbstok_r): Assume mbrtowc function.
+ * lib/propername.c: Include mbuiter.h unconditionally.
+ (mbsstr_trimmed_wordbounded): Assume mbrtowc function.
+ * lib/trim.c: Include mbchar.h, mbiter.h uncondtionally.
+ (trim2): Assume mbrtowc function.
+ * lib/mbswidth.c (mbsinit): Remove fallback definition.
+ (mbsnwidth): Assume mbrtowc function.
+ * modules/mbswidth (Depends-on): Add mbrtowc, mbsinit.
+ * lib/quotearg.c (MB_CUR_MAX, mbstate_t, mbrtowc, iswprint): Remove
+ fallback definitions.
+ * modules/quotearg (Depends-on): Add mbrtowc, mbsinit.
+
+2008-12-22 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/mbtowc.texi: Mention a glibc bug.
+
+2008-12-22 Paolo Bonzini <bonzini@gnu.org>
+
+ * modules/regex: Request emulations for the mb*/wc* functions we need.
+ * m4/regex.m4: Don't look for those functions here.
+ * lib/regex_internal.h: Do not check HAVE_WCRTOMB and HAVE_MBRTOWC.
+
+2008-12-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/fnmatch (Depends-on): Remove duplicated dependency.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ Make mbiter.h, mbuiter.h, mbfile.h usable unconditionally.
+ * modules/mbiter (Depends-on): Add mbrtowc, mbsinit.
+ (Include): Remove conditionalization.
+ * modules/mbuiter (Depends-on): Add mbrtowc, mbsinit.
+ (Include): Remove conditionalization.
+ * modules/mbfile (Depends-on): Add mbrtowc, mbsinit.
+ (Include): Remove conditionalization.
+ * m4/mbiter.m4 (gl_MBITER): Deprecate the use of AC_FUNC_MBRTOWC.
+ * m4/mbfile.m4 (gl_MBFILE): Likewise.
+ * NEWS: Mention the change.
+ Reported by Alan Hourihane <alanh@fairlite.co.uk>
+ via Sergey Poznyakoff <gray@gnu.org.ua>.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Extended multibyte and wide character utilities
+ <wchar.h>): Add btowc, wctob, mbsinit, mbrlen, mbrtowc, mbsrtowcs,
+ wcrtomb, wcsrtombs.
+ (Support for systems lacking POSIX:2008): Add accept, bind, close,
+ connect, fclose, getpeername, getsockname, getsockopt, hostent, listen,
+ mbsnrtowcs, posix_spawn*, recv, recvfrom, sched, select, send, sendto,
+ setsockopt, shutdown, socket, spawn, sys_wait, wcsnrtombs, write.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh: Change section titles to refer to POSIX:2008.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/wcsnrtombs-tests: New file.
+ * tests/test-wcsnrtombs1.sh: New file.
+ * tests/test-wcsnrtombs2.sh: New file.
+ * tests/test-wcsnrtombs3.sh: New file.
+ * tests/test-wcsnrtombs4.sh: New file.
+ * tests/test-wcsnrtombs.c: New file.
+
+ New module 'wcsnrtombs'.
+ * lib/wchar.in.h (wcsnrtombs): New declaration.
+ * lib/wcsnrtombs.c: New file.
+ * lib/wcsrtombs-state.c: New file.
+ * lib/wcsrtombs.c: Refer to _gl_wcsrtombs_state.
+ (internal_state): Remove variable.
+ * m4/wcsnrtombs.m4: New file.
+ * m4/wcsrtombs.m4 (gl_FUNC_WCSRTOMBS): Add wcsrtombs-state.c to the
+ compilation units.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCSNRTOMBS,
+ HAVE_WCSNRTOMBS.
+ * modules/wchar (Makefile.am): Substitute GNULIB_WCSNRTOMBS,
+ HAVE_WCSNRTOMBS.
+ * modules/wcsnrtombs: New file.
+ * modules/wcsrtombs (Files): Add lib/wcsrtombs-state.c.
+ * doc/posix-functions/wcsnrtombs.texi: Mention the new module.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/wcsrtombs-tests: New file.
+ * tests/test-wcsrtombs1.sh: New file.
+ * tests/test-wcsrtombs2.sh: New file.
+ * tests/test-wcsrtombs3.sh: New file.
+ * tests/test-wcsrtombs4.sh: New file.
+ * tests/test-wcsrtombs.c: New file.
+
+ New module 'wcsrtombs'.
+ * lib/wchar.in.h (wcsrtombs): New declaration.
+ * lib/wcsrtombs.c: New file.
+ * m4/wcsrtombs.m4: New file.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCSRTOMBS,
+ HAVE_WCSRTOMBS, REPLACE_WCSRTOMBS.
+ * modules/wchar (Makefile.am): Substitute GNULIB_WCSRTOMBS,
+ HAVE_WCSRTOMBS, REPLACE_WCSRTOMBS.
+ * modules/wcsrtombs: New file.
+ * doc/posix-functions/wcsrtombs.texi: Mention the new module and the
+ bugs.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ Work around a wcrtomb() bug on Solaris 10 and OSF/1 5.1.
+ * lib/wchar.in.h (wcrtomb): Override if REPLACE_WCRTOMB is set.
+ * m4/wcrtomb.m4 (gl_FUNC_WCRTOMB): Test the return value of wcrtomb
+ with NULL destination argument in various locales. Set REPLACE_WCRTOMB
+ if not correct.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize REPLACE_WCRTOMB.
+ * modules/wchar (Makefile.am): Substitute REPLACE_WCRTOMB.
+ * modules/wcrtomb (Files): Add m4/locale-fr.m4, m4/locale-ja.m4,
+ m4/locale-zh.m4, m4/codeset.m4.
+ * doc/posix-functions/wcrtomb.texi: Document the bug.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ Work around a btowc() bug on IRIX 6.5.
+ * lib/wchar.in.h (btowc): Override if REPLACE_BTOWC is set.
+ * m4/btowc.m4 (gl_FUNC_BTOWC): Test whether btowc(EOF) is correct. Set
+ REPLACE_WTOBC if not.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize REPLACE_BTOWC.
+ * modules/wchar (Makefile.am): Substitute REPLACE_BTOWC.
+ * doc/posix-functions/btowc.texi: Mention the IRIX bug.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/wcrtomb-tests: New file.
+ * tests/test-wcrtomb.sh: New file.
+ * tests/test-wcrtomb.c: New file.
+
+ New module 'wcrtomb'.
+ * lib/wchar.in.h (wcrtomb): New declaration.
+ * lib/wcrtomb.c: New file.
+ * m4/wcrtomb.m4: New file.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCRTOMB,
+ HAVE_WCRTOMB.
+ * modules/wchar (Makefile.am): Substitute GNULIB_WCRTOMB,
+ HAVE_WCRTOMB.
+ * modules/wcrtomb: New file.
+ * doc/posix-functions/wcrtomb.texi: Mention the new module.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbrtowc (Files): Add m4/codeset.m4, needed by m4/locale-fr.m4.
+ * modules/mbsrtowcs (Files): Likewise.
+ * modules/wctob (Files): Likewise.
+ * modules/c-strcase-tests (Files): Likewise.
+ * modules/unistdio/u8-vasnprintf-tests (Files): Likewise.
+ * modules/unistdio/u16-vasnprintf-tests (Files): Likewise.
+ * modules/unistdio/u32-vasnprintf-tests (Files): Likewise.
+ * modules/unistdio/ulc-vasnprintf-tests (Files): Likewise.
+ * modules/vasnprintf-posix-tests (Files): Likewise.
+
+2008-12-21 William Pursell <bill.pursell@gmail.com>
+
+ gitlog-to-changelog: pass all command-line arguments to git-log
+ * build-aux/gitlog-to-changelog: When producing a ChangeLog,
+ it is sometimes convenient to filter the commits in various ways.
+ gitlog-to-changelog only allows --since to specify a start date,
+ but git-log itself supports many other filtering mechanisms.
+ At the moment, I want to filter by branch name. Rather than
+ adding a --branch option to gitlog-to-changelog, it seems more
+ flexible to simply pass all options directly to git-log and let
+ git do the work. Notice that this effectively makes --since a
+ redundant option for gitlog-to-changelog, but removing it would
+ require current usage to change since calls would then require
+ an additional '--'.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbsnrtowcs-tests: New file.
+ * tests/test-mbsnrtowcs1.sh: New file.
+ * tests/test-mbsnrtowcs2.sh: New file.
+ * tests/test-mbsnrtowcs3.sh: New file.
+ * tests/test-mbsnrtowcs4.sh: New file.
+ * tests/test-mbsnrtowcs.c: New file.
+
+ New module 'mbsnrtowcs'.
+ * lib/wchar.in.h (mbsnrtowcs): New declaration.
+ * lib/mbsnrtowcs.c: New file.
+ * lib/mbsrtowcs-state.c: New file.
+ * lib/mbsrtowcs.c: Refer to _gl_mbsrtowcs_state.
+ (internal_state): Remove variable.
+ * m4/mbsnrtowcs.m4: New file.
+ * m4/mbsrtowcs.m4 (gl_FUNC_MBSRTOWCS): Add mbsrtowcs-state.c to the
+ compilation units.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_MBSNRTOWCS,
+ HAVE_MBSNRTOWCS, REPLACE_MBSNRTOWCS.
+ * modules/wchar (Makefile.am): Substitute GNULIB_MBSNRTOWCS,
+ HAVE_MBSNRTOWCS, REPLACE_MBSNRTOWCS.
+ * modules/mbsnrtowcs: New file.
+ * modules/mbsrtowcs (Files): Add lib/mbsrtowcs-state.c.
+ * doc/posix-functions/mbsnrtowcs.texi: Mention the new module and a
+ portability problem.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ Work around mbsrtowcs bug.
+ * m4/mbsrtowcs.m4 (gl_MBSRTOWCS_WORKS): New macro.
+ (gl_FUNC_MBSRTOWCS): Invoke it.
+ * modules/mbsrtowcs (Files): Add m4/locale-fr.m4, m4/locale-ja.m4,
+ m4/locale-zh.m4.
+ * doc/posix-functions/mbsrtowcs.texi: Document the bug.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-mbsrtowcs.c (main): Execute the loop also for unlimited=1.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ Update doc for AIX.
+ * doc/pastposix-functions/wcswcs.texi: Mention that AIX has only a
+ 16-bit wchar_t type.
+ * doc/posix-functions/btowc.texi: Likewise.
+ * doc/posix-functions/fgetwc.texi: Likewise.
+ * doc/posix-functions/fgetws.texi: Likewise.
+ * doc/posix-functions/fputwc.texi: Likewise.
+ * doc/posix-functions/fputws.texi: Likewise.
+ * doc/posix-functions/fwide.texi: Likewise.
+ * doc/posix-functions/fwprintf.texi: Likewise.
+ * doc/posix-functions/fwscanf.texi: Likewise.
+ * doc/posix-functions/getwchar.texi: Likewise.
+ * doc/posix-functions/getwc.texi: Likewise.
+ * doc/posix-functions/iswalnum.texi: Likewise.
+ * doc/posix-functions/iswalpha.texi: Likewise.
+ * doc/posix-functions/iswblank.texi: Likewise.
+ * doc/posix-functions/iswcntrl.texi: Likewise.
+ * doc/posix-functions/iswctype.texi: Likewise.
+ * doc/posix-functions/iswdigit.texi: Likewise.
+ * doc/posix-functions/iswgraph.texi: Likewise.
+ * doc/posix-functions/iswlower.texi: Likewise.
+ * doc/posix-functions/iswprint.texi: Likewise.
+ * doc/posix-functions/iswpunct.texi: Likewise.
+ * doc/posix-functions/iswspace.texi: Likewise.
+ * doc/posix-functions/iswupper.texi: Likewise.
+ * doc/posix-functions/iswxdigit.texi: Likewise.
+ * doc/posix-functions/mbrtowc.texi: Likewise.
+ * doc/posix-functions/mbsrtowcs.texi: Likewise.
+ * doc/posix-functions/mbstowcs.texi: Likewise.
+ * doc/posix-functions/mbtowc.texi: Likewise.
+ * doc/posix-functions/putwchar.texi: Likewise.
+ * doc/posix-functions/putwc.texi: Likewise.
+ * doc/posix-functions/swprintf.texi: Likewise.
+ * doc/posix-functions/tolower.texi: Likewise.
+ * doc/posix-functions/toupper.texi: Likewise.
+ * doc/posix-functions/towctrans.texi: Likewise.
+ * doc/posix-functions/ungetwc.texi: Likewise.
+ * doc/posix-functions/vswprintf.texi: Likewise.
+ * doc/posix-functions/wcrtomb.texi: Likewise.
+ * doc/posix-functions/wcscat.texi: Likewise.
+ * doc/posix-functions/wcschr.texi: Likewise.
+ * doc/posix-functions/wcscmp.texi: Likewise.
+ * doc/posix-functions/wcscoll.texi: Likewise.
+ * doc/posix-functions/wcscpy.texi: Likewise.
+ * doc/posix-functions/wcscspn.texi: Likewise.
+ * doc/posix-functions/wcsftime.texi: Likewise.
+ * doc/posix-functions/wcslen.texi: Likewise.
+ * doc/posix-functions/wcsncat.texi: Likewise.
+ * doc/posix-functions/wcsncmp.texi: Likewise.
+ * doc/posix-functions/wcsncpy.texi: Likewise.
+ * doc/posix-functions/wcspbrk.texi: Likewise.
+ * doc/posix-functions/wcsrchr.texi: Likewise.
+ * doc/posix-functions/wcsrtombs.texi: Likewise.
+ * doc/posix-functions/wcsspn.texi: Likewise.
+ * doc/posix-functions/wcsstr.texi: Likewise.
+ * doc/posix-functions/wcstod.texi: Likewise.
+ * doc/posix-functions/wcstof.texi: Likewise.
+ * doc/posix-functions/wcstoimax.texi: Likewise.
+ * doc/posix-functions/wcstok.texi: Likewise.
+ * doc/posix-functions/wcstold.texi: Likewise.
+ * doc/posix-functions/wcstoll.texi: Likewise.
+ * doc/posix-functions/wcstol.texi: Likewise.
+ * doc/posix-functions/wcstombs.texi: Likewise.
+ * doc/posix-functions/wcstoull.texi: Likewise.
+ * doc/posix-functions/wcstoul.texi: Likewise.
+ * doc/posix-functions/wcstoumax.texi: Likewise.
+ * doc/posix-functions/wcswidth.texi: Likewise.
+ * doc/posix-functions/wcsxfrm.texi: Likewise.
+ * doc/posix-functions/wctob.texi: Likewise.
+ * doc/posix-functions/wctomb.texi: Likewise.
+ * doc/posix-functions/wctrans.texi: Likewise.
+ * doc/posix-functions/wctype.texi: Likewise.
+ * doc/posix-functions/wcwidth.texi: Likewise.
+ * doc/posix-functions/wmemchr.texi: Likewise.
+ * doc/posix-functions/wmemcmp.texi: Likewise.
+ * doc/posix-functions/wmemcpy.texi: Likewise.
+ * doc/posix-functions/wmemmove.texi: Likewise.
+ * doc/posix-functions/wmemset.texi: Likewise.
+ * doc/posix-functions/wprintf.texi: Likewise.
+ * doc/posix-functions/wscanf.texi: Likewise.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ Update doc for HP-UX 11.11.
+ * doc/posix-functions/btowc.texi: Clarify that the function is missing
+ in HP-UX version 11.00, not in all versions of HP-UX 11.
+ * doc/posix-functions/fwide.texi: Likewise.
+ * doc/posix-functions/fwprintf.texi: Likewise.
+ * doc/posix-functions/fwscanf.texi: Likewise.
+ * doc/posix-functions/inet_ntop.texi: Likewise.
+ * doc/posix-functions/inet_pton.texi: Likewise.
+ * doc/posix-functions/mbrlen.texi: Likewise.
+ * doc/posix-functions/mbrtowc.texi: Likewise.
+ * doc/posix-functions/mbsinit.texi: Likewise.
+ * doc/posix-functions/mbsrtowcs.texi: Likewise.
+ * doc/posix-functions/swprintf.texi: Likewise.
+ * doc/posix-functions/swscanf.texi: Likewise.
+ * doc/posix-functions/towctrans.texi: Likewise.
+ * doc/posix-functions/vfwprintf.texi: Likewise.
+ * doc/posix-functions/vswprintf.texi: Likewise.
+ * doc/posix-functions/vwprintf.texi: Likewise.
+ * doc/posix-functions/wcrtomb.texi: Likewise.
+ * doc/posix-functions/wcsrtombs.texi: Likewise.
+ * doc/posix-functions/wcsstr.texi: Likewise.
+ * doc/posix-functions/wctob.texi: Likewise.
+ * doc/posix-functions/wctrans.texi: Likewise.
+ * doc/posix-functions/wmemchr.texi: Likewise.
+ * doc/posix-functions/wmemcmp.texi: Likewise.
+ * doc/posix-functions/wmemcpy.texi: Likewise.
+ * doc/posix-functions/wmemmove.texi: Likewise.
+ * doc/posix-functions/wmemset.texi: Likewise.
+ * doc/posix-functions/wprintf.texi: Likewise.
+ * doc/posix-functions/wscanf.texi: Likewise.
+
+2008-12-21 Bruno Haible <bruno@clisp.org>
+
+ Work around a portability problem.
+ * tests/test-mbsrtowcs.c (main): Use a temporary conversion state.
+ * doc/posix-functions/mbsrtowcs.texi: Document the portability problem.
+
+2008-12-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/wchar.in.h (mbsrtowcs): Redefine if REPLACE_MBSRTOWCS is set.
+ * m4/mbsrtowcs.m4 (gl_FUNC_MBSRTOWCS): Invoke gl_MBSTATE_T_BROKEN. Set
+ REPLACE_MBSRTOWCS if mbsrtowcs needs to be overridden.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize REPLACE_MBSRTOWCS.
+ * modules/wchar (Makefile.am): Substitute REPLACE_MBSRTOWCS.
+
+ Work around mbrtowc bugs on AIX, HP-UX, OSF/1, Solaris.
+ * lib/wchar.in.h (mbstate_t): Redefine also if REPLACE_MBSTATE_T is
+ set.
+ (GNULIB_defined_mbstate_t): New macro.
+ (mbsinit): Redefine if REPLACE_MBSINIT is set.
+ (mbrtowc): Redefine if REPLACE_MBRTOWC is set.
+ * lib/mbrtowc.c (rpl_mbrtowc): Add an alternative implementation that
+ reuses the system's mbrtowc function but works around the bugs.
+ * m4/mbrtowc.m4 (gl_MBSTATE_T_BROKEN, gl_MBRTOWC_INCOMPLETE_STATE,
+ gl_MBRTOWC_NULL_ARG, gl_MBRTOWC_RETVAL, gl_MBRTOWC_NUL_RETVAL): New
+ macros.
+ (gl_FUNC_MBRTOWC): Invoke them. Set REPLACE_MBRTOWC if mbrtowc needs to
+ be overridden. Optionally define MBRTOWC_NULL_ARG_BUG,
+ MBRTOWC_RETVAL_BUG, MBRTOWC_NUL_RETVAL_BUG.
+ * m4/mbsinit.m4 (gl_FUNC_MBSINIT): Invoke gl_MBSTATE_T_BROKEN. Set
+ REPLACE_MBSINIT if mbsinit needs to be overridden.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize REPLACE_MBSTATE_T,
+ REPLACE_MBSINIT, REPLACE_MBRTOWC.
+ * modules/wchar (Makefile.am): Substitute REPLACE_MBSTATE_T,
+ REPLACE_MBSINIT, REPLACE_MBRTOWC.
+ * modules/mbrtowc (Files): Add m4/locale-fr.m4, m4/locale-ja.m4,
+ m4/locale-zh.m4.
+ (Depends): Add mbsinit.
+ * modules/mbsinit (Depends): Add mbrtowc.
+ * doc/posix-functions/mbrtowc.texi: Mention the various bugs.
+
+2008-12-20 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-mbrtowc.c (main): Change sample string in EUC-JP encoding
+ so that there are no conversion errors on AIX.
+ * tests/test-mbsrtowcs.c (main): LIkewise.
+
+2008-12-20 Bruno Haible <bruno@clisp.org>
+
+ Work around wctob bug on Solaris <= 9.
+ * lib/wchar.in.h (wctob): Redefine if REPLACE_WCTOB is set.
+ * m4/wctob.m4 (gl_FUNC_WCTOB): Test whether wctob works.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize REPLACE_WCTOB.
+ * modules/wchar (Makefile.am): Substitute REPLACE_WCTOB.
+ * modules/wctob (Files): Add m4/locale-fr.m4.
+ * doc/posix-functions/wctob.texi: Mention the Solaris bug.
+
+2008-12-20 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/select.texi: Mention Solaris 2.6 bug with
+ /dev/null.
+ * tests/test-select-in.sh: Likewise.
+ Reported by Tom G. Christensen <tgc@jupiterrise.com>.
+
+2008-12-20 Bruno Haible <bruno@clisp.org>
+
+ Don't pretend that Cygwin has a ja_JP.EUC-JP locale.
+ * m4/locale-ja.m4 (gt_LOCALE_JA): Add test for MB_CUR_MAX. Needed on
+ Cygwin 1.5.x.
+
+2008-12-20 Bruno Haible <bruno@clisp.org>
+
+ Ensure mbstate_t is defined on HP-UX 11.11.
+ * m4/extensions.m4 (AC_USE_SYSTEM_EXTENSIONS): Require
+ AC_CANONICAL_HOST. On HP-UX, define _XOPEN_SOURCE to 500.
+ * m4/mbstate_t.m4 (AC_TYPE_MBSTATE_T): Require
+ AC_USE_SYSTEM_EXTENSIONS.
+ * modules/fnmatch (Depends-on): Add extensions.
+ * modules/mbrlen (Depends-on): Likewise.
+ * modules/mbrtowc (Depends-on): Likewise.
+ * modules/mbsinit (Depends-on): Likewise.
+ * modules/mbsrtowcs (Depends-on): Likewise.
+ * modules/mbswidth (Depends-on): Likewise.
+ * modules/quotearg (Depends-on): Likewise.
+ * modules/strftime (Depends-on): Likewise.
+
+2008-12-20 Bruno Haible <bruno@clisp.org>
+
+ Ensure wctob is declared on IRIX 6.5.
+ * lib/wchar.in.h (wctob): Declare also when HAVE_DECL_WCTOB is 0.
+ * m4/wctob.m4 (gl_FUNC_WCTOB): Set HAVE_DECL_WCTOB instead of
+ HAVE_WCTOB. Also test whether <wchar.h> declares wctob.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize HAVE_DECL_WCTOB instead
+ of HAVE_WCTOB.
+ * modules/wchar (Makefile.am): Substitute HAVE_DECL_WCTOB instead of
+ HAVE_WCTOB.
+ * doc/posix-functions/wctob.texi: Mention missing declaration on IRIX.
+
+2008-12-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbsrtowcs-tests: New file.
+ * tests/test-mbsrtowcs1.sh: New file.
+ * tests/test-mbsrtowcs2.sh: New file.
+ * tests/test-mbsrtowcs3.sh: New file.
+ * tests/test-mbsrtowcs4.sh: New file.
+ * tests/test-mbsrtowcs.c: New file.
+
+ New module 'mbsrtowcs'.
+ * lib/wchar.in.h (mbsrtowcs): New declaration.
+ * lib/mbsrtowcs.c: New file.
+ * m4/mbsrtowcs.m4: New file.
+ * modules/mbsrtowcs: New file.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_MBSRTOWCS and
+ HAVE_MBSRTOWCS.
+ * modules/wchar (Makefile.am): Substitute GNULIB_MBSRTOWCS and
+ HAVE_MBSRTOWCS.
+ * doc/posix-functions/mbsrtowcs.texi: Document the new module.
+
+2008-12-19 Bruno Haible <bruno@clisp.org>
+
+ New module 'mbrlen'.
+ * lib/wchar.in.h (mbrlen): New declaration.
+ * lib/mbrlen.c: New file.
+ * m4/mbrlen.m4: New file.
+ * modules/mbrlen: New file.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_MBRLEN and
+ HAVE_MBRLEN.
+ * modules/wchar (Makefile.am): Substitute GNULIB_MBRLEN and
+ HAVE_MBRLEN.
+ * doc/posix-functions/mbrlen.texi: Document the new module.
+
+2008-12-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbrtowc.c: Include verify.h. Verify an assumption.
+ * modules/mbrtowc (Depends-on): Add verify.
+ Suggested by Paul Eggert.
+
+2008-12-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbsinit-tests: New file.
+ * tests/test-mbsinit.sh: New file.
+ * tests/test-mbsinit.c: New file.
+
+2008-12-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbrtowc-tests: New file.
+ * tests/test-mbrtowc1.sh: New file.
+ * tests/test-mbrtowc2.sh: New file.
+ * tests/test-mbrtowc3.sh: New file.
+ * tests/test-mbrtowc4.sh: New file.
+ * tests/test-mbrtowc.c: New file.
+
+ New module 'mbrtowc'.
+ * lib/wchar.in.h (mbstate_t): Override when the system does not have
+ mbsinit and mbrtowc.
+ (mbrtowc): New declaration.
+ * lib/mbrtowc.c: New file.
+ * m4/mbrtowc.m4 (gl_FUNC_MBRTOWC, gl_PREREQ_MBRTOWC): New macros.
+ * modules/mbrtowc: New file.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_MBRTOWC and
+ HAVE_MBRTOWC.
+ * modules/wchar (Makefile.am): Substitute GNULIB_MBRTOWC and
+ HAVE_MBRTOWC.
+ * doc/posix-functions/mbrtowc.texi: Document the new module.
+
+2008-12-18 Bruno Haible <bruno@clisp.org>
+
+ New module 'wctob'.
+ * lib/wchar.in.h (wctob): New declaration.
+ * lib/wctob.c: New file.
+ * m4/wctob.m4: New file.
+ * modules/wctob: New file.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCTOB and
+ HAVE_WCTOB.
+ * modules/wchar (Makefile.am): Substitute GNULIB_WCTOB and HAVE_WCTOB.
+ * doc/posix-functions/wctob.texi: Document the new module.
+
+2008-12-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbsinit.m4 (gl_FUNC_MBSINIT): Invoke gl_REPLACE_WCHAR_H.
+ * m4/btowc.m4 (gl_FUNC_BTOWC): Likewise.
+
+2008-12-18 Simon Josefsson <simon@josefsson.org>
+
+ * lib/flock.c: Use proper #if symbol in check. Reported by "Tom
+ G. Christensen" <tgc@jupiterrise.com>.
+
+ * lib/flock.c: Need to include errno.h. Reported by "Tom
+ G. Christensen" <tgc@jupiterrise.com>.
+
+ * lib/flock.c: Need to include string.h. Reported by "Tom
+ G. Christensen" <tgc@jupiterrise.com> and Eric Blake
+ <ebb9@byu.net>.
+
+2008-12-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-ja.m4: New file, from GNU gettext.
+
+2008-12-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbrtowc.m4 (AC_FUNC_MBRTOWC): Don't override in autoconf >= 2.60.
+ Suggested by Eric Blake.
+
+2008-12-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/errno_h.m4 (AC_COMPUTE_INT): Provide fallback definition.
+
+2008-12-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbsinit.c: Include verify.h. Verify an assumption.
+ * modules/mbsinit (Depends-on): Add verify.
+ Suggested by Paul Eggert.
+
+2008-12-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbrtowc.m4 (AC_FUNC_MBRTOWC): Renamed from gl_FUNC_MBRTOWC.
+ * m4/mbfile.m4 (gl_MBFILE): Use AC_FUNC_MBRTOWC instead of
+ gl_FUNC_MBRTOWC.
+ * m4/mbiter.m4 (gl_MBITER): LIkewise.
+ * m4/mbscasecmp.m4 (gl_PREREQ_MBSCASECMP): Likewise.
+ * m4/mbscasestr.m4 (gl_PREREQ_MBSCASESTR): Likewise.
+ * m4/mbschr.m4 (gl_PREREQ_MBSCHR): Likewise.
+ * m4/mbscspn.m4 (gl_PREREQ_MBSCSPN): Likewise.
+ * m4/mbslen.m4 (gl_PREREQ_MBSLEN): Likewise.
+ * m4/mbsncasecmp.m4 (gl_PREREQ_MBSNCASECMP): Likewise.
+ * m4/mbsnlen.m4 (gl_PREREQ_MBSNLEN): Likewise.
+ * m4/mbspbrk.m4 (gl_PREREQ_MBSPBRK): Likewise.
+ * m4/mbspcasecmp.m4 (gl_PREREQ_MBSPCASECMP): Likewise.
+ * m4/mbsrchr.m4 (gl_PREREQ_MBSRCHR): Likewise.
+ * m4/mbssep.m4 (gl_PREREQ_MBSSEP): Likewise.
+ * m4/mbsspn.m4 (gl_PREREQ_MBSSPN): Likewise.
+ * m4/mbsstr.m4 (gl_PREREQ_MBSSTR): Likewise.
+ * m4/mbstok_r.m4 (gl_PREREQ_MBSTOK_R): Likewise.
+ * m4/mbswidth.m4 (gl_MBSWIDTH): Likewise.
+ * m4/quotearg.m4 (gl_QUOTEARG): Likewise.
+ * modules/trim (configure.ac): Likewise.
+
+2008-12-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/btowc-tests: New file.
+ * tests/test-btowc1.sh: New file.
+ * tests/test-btowc2.sh: New file.
+ * tests/test-btowc.c: New file.
+
+ New module 'btowc'.
+ * lib/wchar.in.h (btowc): New declaration.
+ * lib/btowc.c: New file.
+ * m4/btowc.m4: New file.
+ * modules/btowc: New file.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_BTOWC and
+ HAVE_BTOWC.
+ * modules/wchar (Makefile.am): Substitute GNULIB_BTOWC and HAVE_BTOWC.
+ * doc/posix-functions/btowc.texi: Document the new module.
+
+2008-12-17 Bruno Haible <bruno@clisp.org>
+
+ New module 'mbsinit'.
+ * lib/wchar.in.h (mbsinit): New declaration.
+ * lib/mbsinit.c: New file.
+ * m4/mbsinit.m4: New file.
+ * modules/mbsinit: New file.
+ * m4/wchar.m4 (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_MBSINIT and
+ HAVE_MBSINIT.
+ * modules/wchar (Makefile.am): Substitute GNULIB_MBSINIT and
+ HAVE_MBSINIT.
+ * doc/posix-functions/mbsinit.texi: Document the new module.
+
+2008-12-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistd.in.h: Add comment.
+ * tests/test-environ.c: Don't include <stdlib.h>.
+
+2008-12-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/parse-duration.h (parse_duration): Document return value
+ convention.
+ * lib/parse-duration.c: Include specification header first. Add
+ comments.
+ (_): Remove macro.
+ (parse_year_month_day, parse_hour_minute_second): Move side effects
+ outside of strchr call.
+ (parse_non_iso8601): Move side effects outside of isspace call.
+ (parse_duration): Don't test errno is res != BAD_TIME. Remove fprintf
+ call.
+
+2008-12-16 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-parse-duration.sh: Produce no output when the test
+ succeeds.
+
+2008-12-16 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-parse-duration.sh: Fix quoting of $tmp and $tmpf
+ expressions.
+
+2008-12-15 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/fgetxattr.texi: Tweak wording.
+ * doc/glibc-functions/flistxattr.texi: Likewise.
+ * doc/glibc-functions/fopencookie.texi: Likewise.
+ * doc/glibc-functions/fremovexattr.texi: Likewise.
+ * doc/glibc-functions/fsetxattr.texi: Likewise.
+ * doc/glibc-functions/getxattr.texi: Likewise.
+ * doc/glibc-functions/lgetxattr.texi: Likewise.
+ * doc/glibc-functions/listxattr.texi: Likewise.
+ * doc/glibc-functions/llistxattr.texi: Likewise.
+ * doc/glibc-functions/lremovexattr.texi: Likewise.
+ * doc/glibc-functions/lsetxattr.texi: Likewise.
+ * doc/glibc-functions/removexattr.texi: Likewise.
+ * doc/glibc-functions/setxattr.texi: Likewise.
+ * doc/posix-functions/open_memstream.texi: Likewise.
+
+2008-12-15 Eric Blake <ebb9@byu.net>
+
+ Update doc for cygwin 1.7.
+ * doc/posix-functions/faccessat.texi: Cygwin 1.7 added several new
+ functions.
+ * doc/posix-functions/fchmodat.texi: Likewise.
+ * doc/posix-functions/fchownat.texi: Likewise.
+ * doc/posix-functions/fdopendir.texi: Likewise.
+ * doc/posix-functions/fmemopen.texi: Likewise.
+ * doc/posix-functions/freeaddrinfo.texi: Likewise.
+ * doc/posix-functions/fstatat.texi: Likewise.
+ * doc/posix-functions/futimens.texi: Likewise.
+ * doc/posix-functions/gai_strerror.texi: Likewise.
+ * doc/posix-functions/getaddrinfo.texi: Likewise.
+ * doc/posix-functions/getnameinfo.texi: Likewise.
+ * doc/posix-functions/if_freenameindex.texi: Likewise.
+ * doc/posix-functions/if_indextoname.texi: Likewise.
+ * doc/posix-functions/if_nameindex.texi: Likewise.
+ * doc/posix-functions/if_nametoindex.texi: Likewise.
+ * doc/posix-functions/insque.texi: Likewise.
+ * doc/posix-functions/linkat.texi: Likewise.
+ * doc/posix-functions/llrint.texi: Likewise.
+ * doc/posix-functions/llrintf.texi: Likewise.
+ * doc/posix-functions/llrintl.texi: Likewise.
+ * doc/posix-functions/lockf.texi: Likewise.
+ * doc/posix-functions/lrintl.texi: Likewise.
+ * doc/posix-functions/mkdirat.texi: Likewise.
+ * doc/posix-functions/mkfifoat.texi: Likewise.
+ * doc/posix-functions/mknodat.texi: Likewise.
+ * doc/posix-functions/mq_close.texi: Likewise.
+ * doc/posix-functions/mq_getattr.texi: Likewise.
+ * doc/posix-functions/mq_notify.texi: Likewise.
+ * doc/posix-functions/mq_open.texi: Likewise.
+ * doc/posix-functions/mq_receive.texi: Likewise.
+ * doc/posix-functions/mq_send.texi: Likewise.
+ * doc/posix-functions/mq_setattr.texi: Likewise.
+ * doc/posix-functions/mq_timedreceive.texi: Likewise.
+ * doc/posix-functions/mq_timedsend.texi: Likewise.
+ * doc/posix-functions/mq_unlink.texi: Likewise.
+ * doc/posix-functions/open_memstream.texi: Likewise.
+ * doc/posix-functions/openat.texi: Likewise.
+ * doc/posix-functions/posix_fadvise.texi: Likewise.
+ * doc/posix-functions/posix_fallocate.texi: Likewise.
+ * doc/posix-functions/posix_madvise.texi: Likewise.
+ * doc/posix-functions/posix_memalign.texi: Likewise.
+ * doc/posix-functions/posix_openpt.texi: Likewise.
+ * doc/posix-functions/readlinkat.texi: Likewise.
+ * doc/posix-functions/remque.texi: Likewise.
+ * doc/posix-functions/renameat.texi: Likewise.
+ * doc/posix-functions/rintl.texi: Likewise.
+ * doc/posix-functions/sem_unlink.texi: Likewise.
+ * doc/posix-functions/shm_open.texi: Likewise.
+ * doc/posix-functions/shm_unlink.texi: Likewise.
+ * doc/posix-functions/signgam.texi: Likewise.
+ * doc/posix-functions/sigset.texi: Likewise.
+ * doc/posix-functions/stpcpy.texi: Likewise.
+ * doc/posix-functions/stpncpy.texi: Likewise.
+ * doc/posix-functions/strerror.texi: Likewise.
+ * doc/posix-functions/strtod.texi: Likewise.
+ * doc/posix-functions/symlinkat.texi: Likewise.
+ * doc/posix-functions/unlinkat.texi: Likewise.
+ * doc/posix-functions/utimensat.texi: Likewise.
+ * doc/glibc-functions/bindresvport.texi: Likewise.
+ * doc/glibc-functions/dn_expand.texi: Likewise.
+ * doc/glibc-functions/exp10.texi: Likewise.
+ * doc/glibc-functions/exp10f.texi: Likewise.
+ * doc/glibc-functions/fgetxattr.texi: Likewise.
+ * doc/glibc-functions/flistxattr.texi: Likewise.
+ * doc/glibc-functions/fopencookie.texi: Likewise.
+ * doc/glibc-functions/freeifaddrs.texi: Likewise.
+ * doc/glibc-functions/fremovexattr.texi: Likewise.
+ * doc/glibc-functions/fsetxattr.texi: Likewise.
+ * doc/glibc-functions/getifaddrs.texi: Likewise.
+ * doc/glibc-functions/getxattr.texi: Likewise.
+ * doc/glibc-functions/lgetxattr.texi: Likewise.
+ * doc/glibc-functions/listxattr.texi: Likewise.
+ * doc/glibc-functions/llistxattr.texi: Likewise.
+ * doc/glibc-functions/lremovexattr.texi: Likewise.
+ * doc/glibc-functions/lsetxattr.texi: Likewise.
+ * doc/glibc-functions/pow10.texi: Likewise.
+ * doc/glibc-functions/pow10f.texi: Likewise.
+ * doc/glibc-functions/rcmd_af.texi: Likewise.
+ * doc/glibc-functions/removexattr.texi: Likewise.
+ * doc/glibc-functions/res_init.texi: Likewise.
+ * doc/glibc-functions/res_mkquery.texi: Likewise.
+ * doc/glibc-functions/res_query.texi: Likewise.
+ * doc/glibc-functions/res_querydomain.texi: Likewise.
+ * doc/glibc-functions/res_send.texi: Likewise.
+ * doc/glibc-functions/rresvport_af.texi: Likewise.
+ * doc/glibc-functions/setxattr.texi: Likewise.
+ * doc/glibc-functions/strcasestr.texi: Likewise.
+
+2008-12-15 Bruno Haible <bruno@clisp.org>
+
+ Fix compilation error on OSF/1 4.0.
+ * lib/sys_select.in.h: When invoked from OSF/1 <sys/types.h> or
+ <sys/time.h>, simply delegate to the system header.
+ Reported by Daniel Richard G. <oss@teragram.com>.
+
+2008-12-15 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/openat.texi: Mention the 'openat' module.
+ * doc/posix-functions/fchmodat.texi: Likewise.
+ * doc/posix-functions/fchownat.texi: Likewise.
+ * doc/posix-functions/fdopendir.texi: Likewise.
+ * doc/posix-functions/fstatat.texi: Likewise.
+ * doc/posix-functions/mkdirat.texi: Likewise.
+ * doc/posix-functions/unlinkat.texi: Likewise.
+
+2008-12-14 Bruno Haible <bruno@clisp.org>
+
+ Update doc for POSIX:2008.
+ * doc/posix-functions/faccessat.texi: New file.
+ * doc/posix-functions/fchmodat.texi: New file.
+ * doc/posix-functions/fchownat.texi: New file.
+ * doc/posix-functions/fdopendir.texi: New file.
+ * doc/posix-functions/fstatat.texi: New file.
+ * doc/posix-functions/futimens.texi: New file.
+ * doc/posix-functions/linkat.texi: New file.
+ * doc/posix-functions/mkdirat.texi: New file.
+ * doc/posix-functions/mkfifoat.texi: New file.
+ * doc/posix-functions/mknodat.texi: New file.
+ * doc/posix-functions/open_wmemstream.texi: New file.
+ * doc/posix-functions/openat.texi: New file.
+ * doc/posix-functions/psiginfo.texi: New file.
+ * doc/posix-functions/pthread_mutex_consistent.texi: New file.
+ * doc/posix-functions/pthread_mutexattr_getrobust.texi: New file.
+ * doc/posix-functions/pthread_mutexattr_setrobust.texi: New file.
+ * doc/posix-functions/readlinkat.texi: New file.
+ * doc/posix-functions/renameat.texi: New file.
+ * doc/posix-functions/strerror_l.texi: New file.
+ * doc/posix-functions/symlinkat.texi: New file.
+ * doc/posix-functions/unlinkat.texi: New file.
+ * doc/posix-functions/utimensat.texi: New file.
+ * doc/gnulib.texi (Function Substitutes): Add these subsections.
+
+2008-12-14 Bruno Haible <bruno@clisp.org>
+
+ Update doc for POSIX:2008.
+ * doc/posix-functions/alphasort.texi: Renamed from
+ doc/glibc-functions/alphasort.texi.
+ * doc/posix-functions/dirfd.texi: Renamed from
+ doc/glibc-functions/dirfd.texi.
+ * doc/posix-functions/dprintf.texi: Renamed from
+ doc/glibc-functions/dprintf.texi.
+ * doc/posix-functions/duplocale.texi: Renamed from
+ doc/glibc-functions/duplocale.texi.
+ * doc/posix-functions/fexecve.texi: Renamed from
+ doc/glibc-functions/fexecve.texi.
+ * doc/posix-functions/fmemopen.texi: Renamed from
+ doc/glibc-functions/fmemopen.texi.
+ * doc/posix-functions/freelocale.texi: Renamed from
+ doc/glibc-functions/freelocale.texi.
+ * doc/posix-functions/getdate_err.texi: Renamed from
+ doc/glibc-functions/getdate_err.texi.
+ * doc/posix-functions/isalnum_l.texi: Renamed from
+ doc/glibc-functions/isalnum_l.texi.
+ * doc/posix-functions/isalpha_l.texi: Renamed from
+ doc/glibc-functions/isalpha_l.texi.
+ * doc/posix-functions/isblank_l.texi: Renamed from
+ doc/glibc-functions/isblank_l.texi.
+ * doc/posix-functions/iscntrl_l.texi: Renamed from
+ doc/glibc-functions/iscntrl_l.texi.
+ * doc/posix-functions/isdigit_l.texi: Renamed from
+ doc/glibc-functions/isdigit_l.texi.
+ * doc/posix-functions/isgraph_l.texi: Renamed from
+ doc/glibc-functions/isgraph_l.texi.
+ * doc/posix-functions/islower_l.texi: Renamed from
+ doc/glibc-functions/islower_l.texi.
+ * doc/posix-functions/isprint_l.texi: Renamed from
+ doc/glibc-functions/isprint_l.texi.
+ * doc/posix-functions/ispunct_l.texi: Renamed from
+ doc/glibc-functions/ispunct_l.texi.
+ * doc/posix-functions/isspace_l.texi: Renamed from
+ doc/glibc-functions/isspace_l.texi.
+ * doc/posix-functions/isupper_l.texi: Renamed from
+ doc/glibc-functions/isupper_l.texi.
+ * doc/posix-functions/iswalnum_l.texi: Renamed from
+ doc/glibc-functions/iswalnum_l.texi.
+ * doc/posix-functions/iswalpha_l.texi: Renamed from
+ doc/glibc-functions/iswalpha_l.texi.
+ * doc/posix-functions/iswblank_l.texi: Renamed from
+ doc/glibc-functions/iswblank_l.texi.
+ * doc/posix-functions/iswcntrl_l.texi: Renamed from
+ doc/glibc-functions/iswcntrl_l.texi.
+ * doc/posix-functions/iswctype_l.texi: Renamed from
+ doc/glibc-functions/iswctype_l.texi.
+ * doc/posix-functions/iswdigit_l.texi: Renamed from
+ doc/glibc-functions/iswdigit_l.texi.
+ * doc/posix-functions/iswgraph_l.texi: Renamed from
+ doc/glibc-functions/iswgraph_l.texi.
+ * doc/posix-functions/iswlower_l.texi: Renamed from
+ doc/glibc-functions/iswlower_l.texi.
+ * doc/posix-functions/iswprint_l.texi: Renamed from
+ doc/glibc-functions/iswprint_l.texi.
+ * doc/posix-functions/iswpunct_l.texi: Renamed from
+ doc/glibc-functions/iswpunct_l.texi.
+ * doc/posix-functions/iswspace_l.texi: Renamed from
+ doc/glibc-functions/iswspace_l.texi.
+ * doc/posix-functions/iswupper_l.texi: Renamed from
+ doc/glibc-functions/iswupper_l.texi.
+ * doc/posix-functions/iswxdigit_l.texi: Renamed from
+ doc/glibc-functions/iswxdigit_l.texi.
+ * doc/posix-functions/isxdigit_l.texi: Renamed from
+ doc/glibc-functions/isxdigit_l.texi.
+ * doc/posix-functions/mbsnrtowcs.texi: Renamed from
+ doc/glibc-functions/mbsnrtowcs.texi.
+ * doc/posix-functions/mkdtemp.texi: Renamed from
+ doc/glibc-functions/mkdtemp.texi.
+ * doc/posix-functions/newlocale.texi: Renamed from
+ doc/glibc-functions/newlocale.texi.
+ * doc/posix-functions/nl_langinfo_l.texi: Renamed from
+ doc/glibc-functions/nl_langinfo_l.texi.
+ * doc/posix-functions/open_memstream.texi: Renamed from
+ doc/glibc-functions/open_memstream.texi.
+ * doc/posix-functions/opterr.texi: Renamed from
+ doc/glibc-functions/opterr.texi.
+ * doc/posix-functions/optind.texi: Renamed from
+ doc/glibc-functions/optind.texi.
+ * doc/posix-functions/optopt.texi: Renamed from
+ doc/glibc-functions/optopt.texi.
+ * doc/posix-functions/psignal.texi: Renamed from
+ doc/glibc-functions/psignal.texi.
+ * doc/posix-functions/scandir.texi: Renamed from
+ doc/glibc-functions/scandir.texi.
+ * doc/posix-functions/sched_get_priority_min.texi: Renamed from
+ doc/glibc-functions/sched_get_priority_min.texi.
+ * doc/posix-functions/signgam.texi: Renamed from
+ doc/glibc-functions/signgam.texi.
+ * doc/posix-functions/stpcpy.texi: Renamed from
+ doc/glibc-functions/stpcpy.texi.
+ * doc/posix-functions/stpncpy.texi: Renamed from
+ doc/glibc-functions/stpncpy.texi.
+ * doc/posix-functions/strcasecmp_l.texi: Renamed from
+ doc/glibc-functions/strcasecmp_l.texi.
+ * doc/posix-functions/strcoll_l.texi: Renamed from
+ doc/glibc-functions/strcoll_l.texi.
+ * doc/posix-functions/strfmon_l.texi: Renamed from
+ doc/glibc-functions/strfmon_l.texi.
+ * doc/posix-functions/strftime_l.texi: Renamed from
+ doc/glibc-functions/strftime_l.texi.
+ * doc/posix-functions/strncasecmp_l.texi: Renamed from
+ doc/glibc-functions/strncasecmp_l.texi.
+ * doc/posix-functions/strndup.texi: Renamed from
+ doc/glibc-functions/strndup.texi.
+ * doc/posix-functions/strnlen.texi: Renamed from
+ doc/glibc-functions/strnlen.texi.
+ * doc/posix-functions/strsignal.texi: Renamed from
+ doc/glibc-functions/strsignal.texi.
+ * doc/posix-functions/strxfrm_l.texi: Renamed from
+ doc/glibc-functions/strxfrm_l.texi.
+ * doc/posix-functions/timer_gettime.texi: Renamed from
+ doc/glibc-functions/timer_gettime.texi.
+ * doc/posix-functions/tolower_l.texi: Renamed from
+ doc/glibc-functions/tolower_l.texi.
+ * doc/posix-functions/toupper_l.texi: Renamed from
+ doc/glibc-functions/toupper_l.texi.
+ * doc/posix-functions/towctrans_l.texi: Renamed from
+ doc/glibc-functions/towctrans_l.texi.
+ * doc/posix-functions/towlower_l.texi: Renamed from
+ doc/glibc-functions/towlower_l.texi.
+ * doc/posix-functions/towupper_l.texi: Renamed from
+ doc/glibc-functions/towupper_l.texi.
+ * doc/posix-functions/uselocale.texi: Renamed from
+ doc/glibc-functions/uselocale.texi.
+ * doc/posix-functions/vdprintf.texi: Renamed from
+ doc/glibc-functions/vdprintf.texi.
+ * doc/posix-functions/wcpcpy.texi:
+ Renamed from doc/glibc-functions/wcpcpy.texi.
+ * doc/posix-functions/wcpncpy.texi: Renamed from
+ doc/glibc-functions/wcpncpy.texi.
+ * doc/posix-functions/wcscasecmp.texi: Renamed from
+ doc/glibc-functions/wcscasecmp.texi.
+ * doc/posix-functions/wcscasecmp_l.texi: Renamed from
+ doc/glibc-functions/wcscasecmp_l.texi.
+ * doc/posix-functions/wcscoll_l.texi: Renamed from
+ doc/glibc-functions/wcscoll_l.texi.
+ * doc/posix-functions/wcsdup.texi: Renamed from
+ doc/glibc-functions/wcsdup.texi.
+ * doc/posix-functions/wcsncasecmp.texi: Renamed from
+ doc/glibc-functions/wcsncasecmp.texi.
+ * doc/posix-functions/wcsncasecmp_l.texi: Renamed from
+ doc/glibc-functions/wcsncasecmp_l.texi.
+ * doc/posix-functions/wcsnlen.texi: Renamed from
+ doc/glibc-functions/wcsnlen.texi.
+ * doc/posix-functions/wcsnrtombs.texi: Renamed from
+ doc/glibc-functions/wcsnrtombs.texi.
+ * doc/posix-functions/wcsxfrm_l.texi: Renamed from
+ doc/glibc-functions/wcsxfrm_l.texi.
+ * doc/posix-functions/wctrans_l.texi: Renamed from
+ doc/glibc-functions/wctrans_l.texi.
+ * doc/posix-functions/wctype_l.texi: Renamed from
+ doc/glibc-functions/wctype_l.texi.
+ * doc/gnulib.texi (Function Substitutes): Add these subsections.
+ (Glibc ctype.h, Glibc dirent.h, Glibc getopt.h, Glibc math.h,
+ Glibc sched.h, Glibc signal.h, Glibc stdio.h, Glibc stdlib.h,
+ Glibc string.h, Glibc time.h, Glibc unistd.h, Glibc wchar.h): Remove
+ these subsections.
+ (Glibc langinfo.h, Glibc locale.h, Glibc monetary.h, Glibc wctype.h):
+ Remove sections.
+
+2008-12-14 Bruno Haible <bruno@clisp.org>
+
+ Update doc for POSIX:2008.
+ * doc/posix-functions/*.texi: Update URL of POSIX specification.
+
+2008-12-14 Bruno Haible <bruno@clisp.org>
+
+ Update doc for POSIX:2008.
+ * doc/pastposix-functions/bcmp.texi: Renamed from
+ doc/posix-functions/bcmp.texi.
+ * doc/pastposix-functions/bcopy.texi: Renamed from
+ doc/posix-functions/bcopy.texi.
+ * doc/pastposix-functions/bsd_signal.texi: Renamed from
+ doc/posix-functions/bsd_signal.texi.
+ * doc/pastposix-functions/bzero.texi: Renamed from
+ doc/posix-functions/bzero.texi.
+ * doc/pastposix-functions/ecvt.texi: Renamed from
+ doc/posix-functions/ecvt.texi.
+ * doc/pastposix-functions/fcvt.texi: Renamed from
+ doc/posix-functions/fcvt.texi.
+ * doc/pastposix-functions/ftime.texi: Renamed from
+ doc/posix-functions/ftime.texi.
+ * doc/pastposix-functions/gcvt.texi: Renamed from
+ doc/posix-functions/gcvt.texi.
+ * doc/pastposix-functions/getcontext.texi: Renamed from
+ doc/posix-functions/getcontext.texi.
+ * doc/pastposix-functions/gethostbyaddr.texi: Renamed from
+ doc/posix-functions/gethostbyaddr.texi.
+ * doc/pastposix-functions/gethostbyname.texi: Renamed from
+ doc/posix-functions/gethostbyname.texi.
+ * doc/pastposix-functions/getwd.texi: Renamed from
+ doc/posix-functions/getwd.texi.
+ * doc/pastposix-functions/h_errno.texi: Renamed from
+ doc/posix-functions/h_errno.texi.
+ * doc/pastposix-functions/index.texi: Renamed from
+ doc/posix-functions/index.texi.
+ * doc/pastposix-functions/makecontext.texi: Renamed from
+ doc/posix-functions/makecontext.texi.
+ * doc/pastposix-functions/mktemp.texi: Renamed from
+ doc/posix-functions/mktemp.texi.
+ * doc/pastposix-functions/pthread_attr_getstackaddr.texi: Renamed from
+ doc/posix-functions/pthread_attr_getstackaddr.texi.
+ * doc/pastposix-functions/pthread_attr_setstackaddr.texi: Renamed from
+ doc/posix-functions/pthread_attr_setstackaddr.texi.
+ * doc/pastposix-functions/rindex.texi: Renamed from
+ doc/posix-functions/rindex.texi.
+ * doc/pastposix-functions/scalb.texi: Renamed from
+ doc/posix-functions/scalb.texi.
+ * doc/pastposix-functions/setcontext.texi: Renamed from
+ doc/posix-functions/setcontext.texi.
+ * doc/pastposix-functions/swapcontext.texi: Renamed from
+ doc/posix-functions/swapcontext.texi.
+ * doc/pastposix-functions/ualarm.texi: Renamed from
+ doc/posix-functions/ualarm.texi.
+ * doc/pastposix-functions/usleep.texi: Renamed from
+ doc/posix-functions/usleep.texi.
+ * doc/pastposix-functions/vfork.texi: Renamed from
+ doc/posix-functions/vfork.texi.
+ * doc/pastposix-functions/wcswcs.texi: Renamed from
+ doc/posix-functions/wcswcs.texi.
+ * doc/gnulib.texi (Legacy Function Substitutes): New chapter.
+ (Function Substitutes): Update.
+
+2008-12-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/relocatable-prog-wrapper (Depends-on): Add errno, needed by
+ m4/strerror.m4.
+
+2008-12-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/unilbrk/tables (Depends-on): Add unilbrk/base.
+
+2008-12-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/strtoull (Depends-on): Remove unistd.
+
+2008-12-11 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/strtoull (Depends-on): Add stdlib.
+
+2008-12-11 Simon Josefsson <simon@josefsson.org>
+
+ * m4/manywarnings.m4 (gl_MANYWARN_ALL_GCC): Add more warnings.
+
+2008-12-10 Jim Meyering <meyering@redhat.com>
+
+ gl_ASSERT: don't say assertions are disabled when they're not
+ * m4/assert.m4 (gl_ASSERT): Do not make configure report
+ "checking whether to enable assertions... no", when they are in
+ fact enabled. This is solely a bug in the output of configure.
+ In spite of saying "no", NDEBUG was not defined in that case.
+ Also, as noted by Eric Blake, leave assertions enabled upon
+ --enable-assert=INVALID.
+
+2008-12-10 Bruno Haible <bruno@clisp.org>
+
+ Change MODULES.html to refer to POSIX:2008 where possible.
+ * MODULES.html.sh (POSIX2008_URL): New variable.
+ (posix_headers): Remove sys/timeb, ucontext.
+ (posix2001_headers): New variable.
+ (posix_functions): Remove bcmp, bcopy, bsd_signal, bzero, ecvt, fcvt,
+ ftime, gcvt, getcontext, gethostbyaddr, gethostbyname, getwd, h_errno,
+ index, makecontext, mktemp, pthread_attr_getstackaddr,
+ pthread_attr_setstackaddr, rindex, scalb, setcontext, swapcontext,
+ ualarm, usleep, vfork, wcswcs. Add the new POSIX:2008 functions.
+ (posix2001_functions): New variable.
+ (func_module): Use URLs to POSIX:2008 where possible and to POSIX:2001
+ otherwise.
+
+2008-12-09 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ add missing include to parse-duration.c
+ * lib/parse-duration.c: #include "xalloc.h", for xstrdup.
+ * modules/parse-duration (Depends-on): Add xalloc.
+
+ fix sed script reading maint.mk
+ * top/maint.mk (MYSELF): New macro, define as $(srcdir)/$(ME).
+ (syntax-check-rules): Use it.
+
+2008-12-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/ldexpl.m4 (gl_FUNC_LDEXPL_WORKS): Add another check, that fails on
+ MacOS X 10.4/PowerPC.
+ Reported by Simon Josefsson.
+
+2008-12-08 Jim Meyering <meyering@redhat.com>
+
+ work around mingw's lack of some S_IF definitions
+ * lib/fts.c (S_IFLNK, S_IFSOCK): Define if not already defined.
+ Reported by Simon Josefsson.
+
+2008-12-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/signbitl.m4 (gl_SIGNBIT_TEST_PROGRAM): Add a link check of signbit
+ applied to variables. Needed on MacOS X 10.4/PowerPC.
+ Reported by Simon Josefsson.
+
+2008-12-08 William Pursell <bill.pursell@gmail.com> (tiny change)
+ and Eric Blake <ebb9@byu.net>
+
+ assert: honor --enable-assert
+ * m4/assert.m4 (gl_ASSERT): Synchronize with autoconf 2.64, in
+ order to honor --enable-assert, rather than treating it as a
+ synonym for --disable-assert.
+
+2008-12-08 Jim Meyering <meyering@redhat.com>
+
+ * lib/posixtm.c: Remove now-useless declaration of mktime.
+
+ * build-aux/announce-gen (get_tool_versions): Accept .xz tarballs.
+
+2008-12-07 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-lock.c (test_lock, test_rwlock, test_recursive_lock,
+ test_once): Mark functions as static.
+ * tests/test-tls.c (test_tls): Likewise.
+
+2008-12-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveha.h (uniconv_register_autodetect): Renamed from
+ iconv_register_autodetect.
+
+2008-12-07 Jim Meyering <meyering@redhat.com>
+
+ posixtm.c: avoid a warning
+ * lib/posixtm.c (posixtime): Don't initialize tm0.
+ It's no longer needed to placate gcc4's -Wuninitialized,
+ and the attempt to placate would elicit a new warning.
+
+ unicodeio.c: mark unused parameters
+ * lib/unicodeio.c (exit_failure_callback): Mark unused parameter.
+ (fallback_failure_callback): Likewise.
+
+2008-12-07 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): When building the tests
+ subdirectory, ignore the modules gnumakefile and maintainer-makefile.
+ Reported by Simon Josefsson.
+
+2008-12-07 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * doc/manywarnings.texi, doc/gnulib-intro.texi: Fix typos.
+
+2008-12-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-stack.h (c_stack_action): Clarify possible side effects.
+ Suggested by Eric Blake.
+
+2008-12-06 Bruno Haible <bruno@clisp.org>
+
+ Fix a c-stack test failure on MacOS X.
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Require
+ AC_CANONICAL_HOST. Define FAULT_YIELDS_SIGBUS. If set, install a signal
+ handler for SIGBUS as well.
+ * lib/c-stack.c (c_stack_action): If FAULT_YIELDS_SIGBUS is set,
+ install a signal handler for SIGBUS as well.
+ Reported by Bruce Dugan <bld0401@gmail.com> via Eric Blake.
+
+2008-12-06 Bruno Haible <bruno@clisp.org>
+
+ Advocacy documentation.
+ * doc/gnulib-intro.texi (Benefits): New section.
+ * doc/gnulib.texi: Update.
+
+2008-12-06 Bruno Haible <bruno@clisp.org>
+
+ Document the 'manywarnings' module.
+ * doc/manywarnings.texi: New file.
+ * doc/gnulib.texi: Include it.
+
+2008-12-05 Eric Blake <ebb9@byu.net>
+
+ tests: silence some gcc warnings
+ * tests/test-getdate.c (LOG) [!DEBUG]: Mark no-op void.
+ * tests/uniwidth/test-uc_width2.c (finish_interval): Avoid printf
+ type mismatches.
+
+2008-12-03 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/openmp.m4 (AC_OPENMP): Do not define with Autoconf 2.62 or newer.
+
+2008-11-29 Jim Meyering <meyering@redhat.com>
+
+ unicodeio.c: mark unused parameters
+ * lib/unicodeio.c (exit_failure_callback): Mark unused parameter.
+ (fallback_failure_callback): Likewise.
+
+ fts: fix a thinko
+ * lib/fts.c (s_ifmt_shift_bits): Remove function. Not needed after all.
+ (set_stat_type): Return S_IF*-valued "type" directly.
+ Prompted by James Youngman's spotting a related bug.
+ Confirmed by further testing through find.
+
+ fts: provide dirent.d_type via FTSENT.fts_statp, when possible
+ * lib/fts.c (D_TYPE): Define.
+ (DT_UNKNOWN, DT_BLK, DT_CHR) [HAVE_STRUCT_DIRENT_D_TYPE]: Define.
+ (DT_DIR, DT_FIFO, DT_LNK, DT_REG, DT_SOCK): Likewise.
+ (s_ifmt_shift_bits): New function.
+ (set_stat_type): New function.
+ (fts_build): When not calling fts_stat, call set_stat_type
+ to propagate dirent.d_type info to fts_read caller.
+ * lib/fts_.h (FTSENT) [FTS_DEFER_STAT]: Mention that
+ fts_statp->st_mode type information may be valid.
+
+2008-11-28 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sys_time.in.h: Add extern "C" block for C++. Suggested by
+ Brian Dessent <brian@dessent.net>. Reported by Sam Steingold
+ <sds@gnu.org>.
+
+2008-11-20 Bruno Haible <bruno@clisp.org>
+
+ Attempt to work around an AIX 5.3, 6.1 compiler bug with include_next.
+ * lib/math.in.h: Use INCLUDE_NEXT_AS_FIRST_DIRECTIVE instead of
+ INCLUDE_NEXT.
+ * m4/include_next.m4 (gl_INCLUDE_NEXT): Set also
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE.
+ * modules/math (Makefile.am): Substitute
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE instead of INCLUDE_NEXT.
+ Reported by Albert Chin <bug-gnulib@mlists.thewrittenword.com>.
+
+2008-11-18 Alexandre Duret-Lutz <adl@lrde.epita.fr>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint.in.h: Define all type macros so that their expansion is
+ a single typedef'ed token. Fixes a compilation failure in Boost which
+ does "using ::int8_t;".
+
+2008-11-18 Simon Josefsson <simon@josefsson.org>
+
+ * m4/manywarnings.m4: New file with gl_MANYWARN_COMPLEMENT and
+ gl_MANYWARN_ALL_GCC.
+ * m4/warnings.m4: Removed gl_WARN_SUPPORTED and
+ gl_WARN_COMPLEMENT. Suggested by Bruno Haible <bruno@clisp.org>.
+ * modules/manywarnings: New file.
+ * MODULES.html.sh: Mention manywarnings module.
+
+2008-11-18 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (Unit tests): New section.
+
+2008-11-18 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk (refresh-po): Fix sed regexp to avoid problems with
+ paths like 'lib/po/foo.po'.
+
+2008-11-17 Simon Josefsson <simon@josefsson.org>
+
+ * m4/warnings.m4: Improve code. Reported by Ralf Wildenhues
+ <Ralf.Wildenhues@gmx.de> and Paolo Bonzini <bonzini@gnu.org>.
+
+2008-11-17 Simon Josefsson <simon@josefsson.org>
+
+ * m4/warnings.m4: Use CPPFLAGS to really check whether the
+ parameter works.
+
+2008-11-17 Simon Josefsson <simon@josefsson.org>
+
+ * m4/warnings.m4: Add gl_WARN_COMPLEMENT and gl_WARN_SUPPORTED.
+
+2008-11-17 Bruce Korb <bkorb@gnu.org>
+
+ * modules/parse-duration-tests: New file.
+ * tests/test-parse-duration.sh: New file.
+ * tests/test-parse-duration.c: New file.
+
+ New module 'parse-duration'.
+ * lib/parse-duration.h: New file.
+ * lib/parse-duration.c: New file.
+ * modules/parse-duration: New file.
+
+2008-11-17 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-select-out.sh: Comment out the first pipe test.
+ Reported by Simon Josefsson.
+
+2008-11-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/getaddrinfo (Depends-on): Add servent, hostent.
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Use gl_SERVENT and
+ gl_HOSTENT.
+
+2008-11-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/sockets.m4 (gl_SOCKETS): After trying -lsocket, try also
+ -lnetwork and -lnet. Needed for Haiku and BeOS.
+
+2008-11-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Fix indentation.
+
+2008-11-16 Bruno Haible <bruno@clisp.org>
+
+ Avoid test failure on Haiku.
+ * tests/test-fsync.c: Include <errno.h>.
+ (main): Don't require that fsync (0) fails.
+
+2008-11-15 Bruno Haible <bruno@clisp.org>
+
+ New module 'hostent'.
+ * modules/hostent: New file.
+ * m4/hostent.m4: New file, based on code in m4/getaddrinfo.m4.
+
+2008-11-15 Bruno Haible <bruno@clisp.org>
+
+ New module 'servent'.
+ * modules/servent: New file.
+ * m4/servent.m4: New file, based on code in m4/getaddrinfo.m4.
+
+2008-11-15 Bruno Haible <bruno@clisp.org>
+
+ Avoid generating same test program with two different rules.
+ * modules/frexp-nolibm-tests (Makefile.am): Rename test program from
+ test-frexp to test-frexp-nolibm.
+ * modules/frexpl-nolibm-tests (Makefile.am): Rename test program from
+ test-frexpl to test-frexpl-nolibm.
+
+2008-11-15 Bruno Haible <bruno@clisp.org>
+
+ * modules/frexpl-tests (Makefile.am): Link test-frexpl with
+ $(FREXPL_LIBM).
+
+2008-11-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/netdb.in.h: Activate the definitions also when the system's
+ <netdb.h> has 'struct addrinfo'.
+ * m4/netdb_h.m4 (gl_HEADER_NETDB): Replace netdb.h also when it lacks
+ EAI_OVERFLOW or AI_NUMERICSERV.
+ * doc/posix-headers/netdb.texi: Document the problem.
+
+2008-11-15 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-sched.c: Test also the existence of the SCHED_* macros.
+
+ Make the 'sched' module work on platforms where <sched.h> exists but
+ is incomplete (such as Haiku).
+ * lib/sched.in.h; Include the system's <sched.h> if it exists.
+ (SCHED_FIFO, SCHED_RR, SCHED_OTHER): New macros.
+ * m4/sched_h.m4 (gl_SCHED_H): Test whether <sched.h> exists and also
+ defines SCHED_FIFO, SCHED_RR, SCHED_OTHER. Set HAVE_SCHED_H,
+ HAVE_STRUCT_SCHED_PARAM.
+ * modules/sched (Depends-on): Add include_next.
+ (Makefile.am): Substitute HAVE_SCHED_H, INCLUDE_NEXT,
+ PRAGMA_SYSTEM_HEADER, NEXT_SCHED_H, HAVE_STRUCT_SCHED_PARAM.
+ * doc/posix-headers/sched.texi: Document the issue.
+
+2008-11-13 Jim Meyering <meyering@redhat.com>
+
+ test-argp-2: avoid test failure when PACKAGE_BUGREPORT is defined
+ * tests/test-argp-2.sh: When PACKAGE_BUGREPORT was defined, this
+ test would fail due to the difference in the Report bugs to ...
+ line. The expected address is empty, "<>", while the actual
+ would contain e.g., "<bug-tar@gnu.org>". Filter out any address.
+
+2008-11-12 Bruno Haible <bruno@clisp.org>
+
+ lstat: don't compile lstat.c on systems lacking lstat
+ * m4/lstat.m4 (gl_FUNC_LSTAT): Don't compile lstat.c on systems
+ which don't have lstat; this is handled by lib/sys_stat.in.h already.
+ Reported by Daniel P. Berrange via Jim Meyering.
+
+2008-11-12 Jim Meyering <meyering@redhat.com>
+
+ * lib/unicodeio.c (unicode_to_mb): Correct spelling of u8_uctomb.
+
+2008-11-12 Simon Josefsson <simon@josefsson.org>
+
+ * modules/warnings (configure.ac): Do AC_SUBST([WARN_CFLAGS]) here
+ instead.
+
+2008-11-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/unicodeio.c: Include unistr.h.
+ (utf8_wctomb): Remove function.
+ (unicode_to_mb): Use utf8_uctomb instead of utf8_wctomb.
+
+2008-11-12 Simon Josefsson <simon@josefsson.org>
+
+ * m4/warnings.m4 (gl_WARN_INIT): Remove, suggested by Ralf
+ Wildenhues <Ralf.Wildenhues@gmx.de> and Bruno Haible
+ <bruno@clisp.org>.
+ * modules/warnings (configure.ac): Don't call gl_WARN_INIT.
+
+2008-11-12 Simon Josefsson <simon@josefsson.org>
+
+ * doc/warnings.texi: New file, from Bruno Haible <bruno@clisp.org>.
+ * doc/gnulib.texi: Add section for warnings.
+
+2008-11-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/sockets.h: Add a comment.
+
+2008-11-11 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (fdl.texi): add, syncing from gnustandards.
+
+2008-11-11 Eric Blake <ebb9@byu.net>
+
+ fdl.texi: avoid git symlinks
+ * doc/fdl.texi: Copy, rather than link, fdl-1.3.texi.
+
+2008-11-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * m4/warnings.m4 (gl_WARN_ADD): Don't AC_SUBST the empty string.
+
+2008-11-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * m4/warnings.m4 (gl_WARN_INIT): Substitute WARN_CFLAGS.
+ (gl_WARN_ADD): Substitute $2 if literal.
+
+2008-11-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * m4/warning.m4: Remove.
+
+2008-11-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * m4/warnings.m4: Almost complete rewrite. :-)
+
+2008-11-10 Simon Josefsson <simon@josefsson.org>
+
+ * modules/warnings: New module.
+ * m4/warnings.m4: New file.
+ * MODULES.html.sh: Mention warnings module.
+ With review improvements from Paolo Bonzini <bonzini@gnu.org> and
+ Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2008-11-10 Eric Blake <ebb9@byu.net>
+
+ fdl.texi: make a symlink to the latest version
+ * doc/standards.texi: Revert today's earlier change.
+ * doc/fdl-1.2.texi: Rename from old fdl.texi...
+ * doc/fdl.texi: ...and replace this with a symlink to the newer
+ fdl-1.3.texi.
+
+2008-11-10 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-select-fd.c (main): Accept the result file name as fourth
+ argument.
+ * tests/test-select-in.sh: Pass t-select-in.tmp as fourth argument.
+ * tests/test-select-out.sh: Pass t-select-out.tmp as fourth argument.
+
+2008-11-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/netdb.in.h: Use HAVE_STRUCT_ADDRINFO, HAVE_DECL_GETADDRINFO,
+ HAVE_DECL_FREEADDRINFO, HAVE_DECL_GAI_STRERROR, HAVE_DECL_GETNAMEINFO
+ as autoconf-substituted macros.
+ * m4/netdb_h.m4 (gl_NETDB_H_DEFAULTS): Initialize these variables to 1.
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Require
+ gl_NETDB_H_DEFAULTS. Set these variables.
+ * modules/netdb (Makefile.am): Substitute these variables.
+
+2008-11-10 Eric Blake <ebb9@byu.net>
+
+ standards.texi: include correct file for FDL 1.3
+ * doc/standards.texi (GNU Free Documentation License): Change
+ include file to pull in FDL 1.3, not 1.2.
+
+ fdl.texi: revert accidental change to license
+ * doc/fdl.texi: This is FDL 1.2, not 1.3.
+
+2008-11-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_ENOMEM): Guess yes on Haiku. Use the
+ cross-compiling guesses also when the native compile gives no result.
+
+2008-11-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/spawni.c (__spawni): Force variable into the stack.
+
+2008-11-10 Bruno Haible <bruno@clisp.org>
+
+ Add support for Haiku.
+ * lib/fbufmode.c (fbufmode): Test a symbol that is not only defined on
+ glibc and BeOS, but also on Haiku.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/freadable.c (freadable): Likewise.
+ * lib/freadahead.c (freadahead): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/freadptr.c (freadptr): Likewise.
+ * lib/freadseek.c (freadptrinc): Likewise.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ * lib/fseterr.c (fseterr): Likewise.
+ * lib/fwritable.c (fwritable): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+ Reported by Ingo Weinhold <ingo_weinhold@gmx.de>.
+
+2008-11-10 Ingo Weinhold <ingo_weinhold@gmx.de>
+
+ * lib/config.charset: Treat Haiku like BeOS.
+
+2008-11-10 Ingo Weinhold <ingo_weinhold@gmx.de>
+
+ * lib/binary-io.h (O_BINARY, O_TEXT): Treat Haiku like BeOS.
+ * lib/fcntl.in.h (O_BINARY, O_TEXT): Likewise.
+
+2008-11-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/sys_ioctl_h.m4 (gl_SYS_IOCTL_H): Avoid using AC_CHECK_DECL inside
+ AC_CACHE_CHECK.
+
+2008-11-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/select-tests (configure.ac): Check for unistd.h, sys/wait.h.
+
+2008-11-08 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-select-fd.c: New file.
+ * tests/test-select-in.sh: New file.
+ * tests/test-select-out.sh: New file.
+ * tests/test-select-stdin.c: New file.
+ * modules/select-tests (Files): Add the new files.
+ (Depends-on): Add gettimeofday.
+ (Makefile.am): Add test-select-in.sh, test-select-out.sh to TESTS.
+ Set TESTS_ENVIRONMENT. Add test-select-fd, test-select-stdin to
+ check_PROGRAMS. Define test_select_fd_LDADD, test_select_stdin_LDADD.
+
+2008-11-06 Alexander V. Lukyanov <lav@netis.ru>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_stat.in.h: Enclose function definitions in extern "C".
+
+2008-10-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * build-aux/pmccabe2html: Added support for C++ source files.
+
+2008-11-05 Ben Pfaff <blp@gnu.org>
+
+ Fix lib/close.c build on Windows.
+ * modules/close (Files): Add lib/w32sock.h.
+
+2008-11-05 Joel E. Denny <jdenny@ces.clemson.edu>
+
+ Accept Bison's NEWS format.
+ * build-aux/announce-gen (print_news_deltas): Tweak
+ $re_prefix.
+
+2008-11-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/random_r (Maintainer): Add glibc.
+
+2008-11-04 Simon Josefsson <simon@josefsson.org>
+
+ * doc/alloca-opt.texi: Change license to GFDLv1.3+, as suggested
+ by karl@freefriends.org (Karl Berry).
+ * doc/alloca.texi: Likewise.
+ * doc/c-ctype.texi: Likewise.
+ * doc/c-strcase.texi: Likewise.
+ * doc/c-strcaseeq.texi: Likewise.
+ * doc/c-strcasestr.texi: Likewise.
+ * doc/c-strstr.texi: Likewise.
+ * doc/c-strtod.texi: Likewise.
+ * doc/c-strtold.texi: Likewise.
+ * doc/ctime.texi: Likewise.
+ * doc/error.texi: Likewise.
+ * doc/fdl.texi: Likewise.
+ * doc/gcd.texi: Likewise.
+ * doc/getdate.texi: Likewise.
+ * doc/gnulib-intro.texi: Likewise.
+ * doc/gnulib-tool.texi: Likewise.
+ * doc/gnulib.texi: Likewise.
+ * doc/inet_ntoa.texi: Likewise.
+ * doc/maintain.texi: Likewise.
+ * doc/make-stds.texi: Likewise.
+ * doc/quote.texi: Likewise.
+ * doc/regexprops-generic.texi: Likewise.
+ * doc/standards.texi: Likewise.
+ * doc/verify.texi: Likewise.
+ * doc/visibility.texi: Likewise.
+ * doc/gnulib.texi (GNU Free Documentation License): Include
+ fdl-1.3.texi instead of fdl.texi.
+
+2008-11-04 Simon Josefsson <simon@josefsson.org>
+
+ * doc/fdl-1.3.texi: New file, from
+ <http://www.gnu.org/licenses/fdl-1.3.texi>.
+ * modules/fdl-1.3: Add.
+ * MODULES.html.sh: Add fdl-1.3.
+
+2008-11-03 Bruno Haible <bruno@clisp.org>
+
+ Make determination of absolute name of header file work with AIX xlc.
+ * m4/include_next.m4 (gl_CHECK_NEXT_HEADERS): Require
+ AC_CANONICAL_HOST. On AIX, use "$CPP -C" rather than "$CPP" for
+ preprocessing.
+ * m4/absolute-header.m4 (gl_ABSOLUTE_HEADER): Likewise.
+ Reported by Gary V. Vaughan <gary@thewrittenword.com>.
+
+2008-11-03 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk (COVERAGE_CCOPTS): Use --coverage instead of
+ -fprofile-arcs -ftest-coverage. Suggested by Ludovic Courtès
+ <ludo@gnu.org>.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'strpbrk' obsolete.
+ * modules/strpbrk (Status, Notice): New sections.
+ * modules/strtok_r (Depends-on): Add strpbrk.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'strdup' obsolete.
+ * modules/strdup (Status, Notice): New sections.
+ * modules/findprog (Depends-on): Add strdup.
+ * modules/getaddrinfo (Depends-on): Likewise.
+ * modules/localename (Depends-on): Likewise.
+ * modules/relocatable-lib (Depends-on): Likewise.
+ * modules/relocatable-lib-lgpl (Depends-on): Likewise.
+ * modules/relocatable-prog (Depends-on): Likewise.
+ * modules/trim (Depends-on): Likewise.
+ * modules/unictype/gen-ctype (Depends-on): Likewise.
+ * modules/unilbrk/gen-lbrk (Depends-on): Likewise.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'strcspn' obsolete.
+ * modules/strcspn (Status, Notice): New sections.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'rmdir' obsolete.
+ * modules/rmdir (Status, Notice): New sections.
+ * modules/clean-temp (Depends-on): Add rmdir.
+ * modules/openat (Depends-on): Likewise.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'raise' obsolete.
+ * modules/raise (Status, Notice): New sections.
+ (Include): Specify <signal.h>.
+ * modules/stdio (Depends-on): Add raise.
+ * modules/write (Depends-on): Likewise.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'memset' obsolete.
+ * modules/memset (Status, Notice): New sections.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'memmove' obsolete.
+ * modules/memmove (Status, Notice): New sections.
+ * modules/argp (Depends-on): Add memmove.
+ * modules/argz (Depends-on): Likewise.
+ * modules/canonicalize (Depends-on): Likewise.
+ * modules/canonicalize-lgpl (Depends-on): Likewise.
+ * modules/fts (Depends-on): Likewise.
+ * modules/getcwd (Depends-on): Likewise.
+ * modules/human (Depends-on): Likewise.
+ * modules/regex (Depends-on): Likewise.
+ * modules/striconveh (Depends-on): Likewise.
+ * modules/trim (Depends-on): Likewise.
+ * modules/unistr/u8-move (Depends-on): Likewise.
+ * modules/unistr/u16-move (Depends-on): Likewise.
+ * modules/unistr/u32-move (Depends-on): Likewise.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'memcpy' obsolete.
+ * modules/memcpy (Status, Notice): New sections.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'memcmp' obsolete.
+ * modules/memcmp (Status, Notice): New sections.
+ * modules/argmatch (Depends-on): Add memchr.
+ * modules/backupfile (Depends-on): Likewise.
+ * modules/c-strcasestr (Depends-on): Likewise.
+ * modules/crypto/des (Depends-on): Likewise.
+ * modules/csharpcomp (Depends-on): Likewise.
+ * modules/fnmatch (Depends-on): Likewise.
+ * modules/git-merge-changelog (Depends-on): Likewise.
+ * modules/isnand (Depends-on): Likewise.
+ * modules/isnand-nolibm (Depends-on): Likewise.
+ * modules/isnanf (Depends-on): Likewise.
+ * modules/isnanf-nolibm (Depends-on): Likewise.
+ * modules/isnanl (Depends-on): Likewise.
+ * modules/isnanl-nolibm (Depends-on): Likewise.
+ * modules/mbchar (Depends-on): Likewise.
+ * modules/memcoll (Depends-on): Likewise.
+ * modules/quotearg (Depends-on): Likewise.
+ * modules/regex (Depends-on): Likewise.
+ * modules/relocatable-prog (Depends-on): Likewise.
+ * modules/same (Depends-on): Likewise.
+ * modules/signbit (Depends-on): Likewise.
+ * modules/strcasestr-simple (Depends-on): Likewise.
+ * modules/unictype/gen-ctype (Depends-on): Likewise.
+ * modules/unilbrk/gen-lbrk (Depends-on): Likewise.
+ * modules/uniname/uniname (Depends-on): Likewise.
+ * modules/unistr/u8-cmp (Depends-on): Likewise.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'memchr' obsolete.
+ * modules/memchr (Status, Notice): New sections.
+ * modules/argp (Depends-on): Add memchr.
+ * modules/base64 (Depends-on): Likewise.
+ * modules/c-strcasestr (Depends-on): Likewise.
+ * modules/chdir-long (Depends-on): Likewise.
+ * modules/fnmatch (Depends-on): Likewise.
+ * modules/getsubopt (Depends-on): Likewise.
+ * modules/git-merge-changelog (Depends-on): Likewise.
+ * modules/glob (Depends-on): Likewise.
+ * modules/strcasestr-simple (Depends-on): Likewise.
+ * modules/strnlen (Depends-on): Likewise.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ Mark 'atexit' obsolete.
+ * modules/atexit (Status, Notice): New sections.
+ * modules/chdir-long (Depends-on): Add atexit.
+ * modules/wait-process (Depends-on): Likewise.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: New option --with-obsolete.
+ (func_usage): Document it.
+ (func_modules_transitive_closure): Drop obsolete dependencies if
+ incobsolete is not true.
+ (func_import): Read and save the incobsolete variable to the cache.
+
+2008-11-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/TEMPLATE-EXTENDED: New field 'Status'.
+ * gnulib-tool: New option --extract-status.
+ (func_usage): Document it.
+ (sed_extract_prog): Recognize it.
+ (func_get_status): New function.
+
+2008-10-30 Simon Josefsson <simon@josefsson.org>
+
+ * modules/sockets (License): Change from LGPL to LGPLv2+.
+
+2008-10-28 Simon Josefsson <simon@josefsson.org>
+
+ * top/maint.mk: Add coverage rules, inspired by scripts in gnupdf.
+
+2008-10-28 Simon Josefsson <simon@josefsson.org>
+
+ * MODULES.html.sh (Support for systems lacking POSIX:2001):
+ Mention times and sys_times.
+ * modules/sys_times, modules/sys_times-tests: New modules.
+ * modules/times, modules/times-tests: Likewise
+ * m4/sys_times_h.m4: New file.
+ * lib/sys_times.in.h: Likewise
+ * lib/times.c: Likewise.
+ * tests/test-sys_times.c: Likewise.
+ * tests/test-times.c: Likewise.
+ * doc/posix-headers/sys_times.texi: Update.
+ * doc/posix-functions/times.texi: Update.
+
+2008-10-28 Jim Meyering <meyering@redhat.com>
+
+ * modules/tempname (Depends-on): Add lstat.
+
+ * modules/lstat (License): Relicense: LGPL -> LGPLv2+.
+
+2008-10-28 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool (func_emit_tests_Makefile_am): Revert last commit.
+ * modules/argp-tests (test_argp_LDADD): Set EXEEXT here instead,
+ using idiom used elsewhere in gnulib.
+
+2008-10-27 Jim Meyering <meyering@redhat.com>
+
+ * modules/gethostname (License): Relicense: LGPL -> LGPLv2+.
+
+2008-10-27 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool (func_emit_tests_Makefile_am): Set EXEEXT in
+ TESTS_ENVIRONMENT, for shell scripts that needs to call built
+ programs.
+ * tests/test-argp-2.sh: Use $EXEEXT when needed.
+
+2008-10-27 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sys_stat.in.h (lstat): Fix declaration for mingw.
+
+2008-10-27 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-lstat.c: Include <stdio.h>.
+
+2008-10-27 Simon Josefsson <simon@josefsson.org>
+
+ * modules/lstat-tests: New module.
+ * tests/test-lstat.c: New file.
+
+2008-10-26 Jim Meyering <meyering@redhat.com>
+
+ * lib/mkdir.c (rpl_mkdir) [_WIN32...]: Mark mode as an unused parameter.
+
+2008-10-26 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Fix a clash between the type DATADIR on Windows and the macro DATADIR.
+ * modules/configmake (Include): Add a note that the include must come
+ after all system headers.
+ * lib/javaversion.c: Include configmake.h after all other includes.
+
+2008-10-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Set default of
+ HAVE_STRUCT_RANDOM_DATA to 1.
+ (gl_STDLIB_H): Simplify.
+
+2008-10-26 Simon Josefsson <simon@josefsson.org>
+
+ * m4/stdlib_h.m4: Check for struct random_data. Initialize and
+ substitute HAVE_STRUCT_RANDOM_DATA.
+ * lib/stdlib.in.h [!HAVE_STRUCT_RANDOM_DATA]: Provide struct
+ random_data.
+ * modules/stdlib (Makefile.am): Substitute
+ HAVE_STRUCT_RANDOM_DATA.
+
+2008-10-26 Simon Josefsson <simon@josefsson.org>
+
+ * doc/gnulib.texi (@copying): Use GFDLv1.2+.
+ * doc/gnulib-intro.texi (Copyright): Likewise.
+
+2008-10-26 Simon Josefsson <simon@josefsson.org>
+
+ * doc/gnulib.texi (Header files): C++ fixes, based on Bruno's
+ findings.
+
+2008-10-25 Ben Pfaff <blp@cs.stanford.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/unistd.in.h: Include <winsock2.h>.
+ (socket, connect,accept, bind, getpeername, getsockname, getsockopt,
+ listen, recv, send, recvfrom, sendto, setsockopt, shutdown, select):
+ Provide dummy declarations.
+ (gethostname): Override.
+ * lib/sys_socket.in.h (gethostname): Provide dummy declaration.
+ * m4/gethostname.m4 (gl_FUNC_GETHOSTNAME): Invoke
+ gl_PREREQ_SYS_H_WINSOCK2.
+ * modules/gethostname (Files): Add m4/sys_socket_h.m4.
+ * doc/posix-functions/gethostname.texi: More details.
+
+2008-10-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/sys_socket_h.m4 (gl_PREREQ_SYS_H_WINSOCK2): Require
+ gl_UNISTD_H_DEFAULTS, gl_SYS_IOCTL_H_DEFAULTS only if they exist.
+ * modules/sys_socket (Files): Remove m4/unistd_h.m4, m4/sys_ioctl_h.m4.
+
+ * lib/sys_socket.in.h (HAVE__GL_CLOSE_FD_MAYBE_SOCKET); Move macro from
+ here ...
+ * lib/unistd.in.h (HAVE__GL_CLOSE_FD_MAYBE_SOCKET); ... to here.
+ * m4/sys_socket_h.m4 (gl_SYS_SOCKET_H_DEFAULTS): Remove invocation of
+ gl_UNISTD_H_DEFAULTS.
+
+2008-10-25 Eric Blake <ebb9@byu.net>
+
+ signbit: avoid spurious compiler failure
+ * m4/signbit.m4 (gl_SIGNBIT_TEST_PROGRAM): Move non-constant
+ declarations inside function.
+
+2008-10-24 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/stdlib.in.h (@GNULIB_RANDOM_R@): Include stdint.h.
+ * modules/random_r (Depends-on): Add stdint.
+
+2008-10-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/intprops (License): Change to LGPLv2+, with approval by Paul
+ Eggert.
+ * modules/strerror (License): Likewise.
+
+2008-10-24 Jim Meyering <meyering@redhat.com>
+
+ sys_socket: fix typo that inhibited expansion of @GNULIB_SEND@
+ * modules/sys_socket (Depends-on) [Depends-on]: Fix typo.
+
+2008-10-24 Eric Blake <ebb9@byu.net>
+
+ getgroups: fix compilation when getgroups is available
+ * lib/getgroups.c (includes): Include <unistd.h> for getgroups,
+ but with <config.h> override of getgroups disabled.
+
+2008-10-24 Simon Josefsson <simon@josefsson.org>
+
+ * doc/gnulib.texi (Header files): Add note about C++ problems.
+ Explained by Bruno Haible <bruno@clisp.org>.
+
+2008-10-23 Bruno Haible <bruno@clisp.org>
+
+ Define a dummy SA_NODEFER macro on Interix.
+ * lib/signal.in.h (SA_NODEFER): Define fallback.
+ Reported by Aleksey Cheusov <cheusov@tut.by> via
+ Thomas Klausner <wiz@netbsd.org> and Eric Blake.
+
+2008-10-23 Bruno Haible <bruno@clisp.org>
+
+ * modules/freadahead (License): Change to LGPLv2+.
+ Suggested by Simon Josefsson.
+
+2008-10-23 Jim Meyering <meyering@redhat.com>
+
+ random_r: new module
+ * modules/random_r: New file.
+ * m4/random_r.m4: New file.
+ * lib/random_r.c: New file, from glibc.
+ * modules/random_r-tests: New file.
+ * tests/test-random_r.c: New file.
+ * lib/stdlib.in.h (srandom_r, initstate_r, setstate_r, random_r):
+ Declare.
+ (RAND_MAX): Define.
+ * m4/stdlib_h.m4: Define and AC_SUBST GNULIB_RANDOM_R and HAVE_RANDOM_R.
+ * modules/stdlib: Substitute them, too.
+ * MODULES.html.sh (Extra functions based on POSIX:2001) [Misc]: Add it.
+ * doc/glibc-functions/initstate_r.texi: Mention the new module.
+ * doc/glibc-functions/random_r.texi: Likewise.
+ * doc/glibc-functions/setstate_r.texi: Likewise.
+ * doc/glibc-functions/srandom_r.texi: Likewise.
+ * config/srclist.txt: Mention it.
+
+2008-10-23 David Lutterkort <lutter@redhat.com>
+
+ * modules/selinux-h: Search for LIB_SELINUX and mark it as a
+ link requirement
+
+2008-10-23 Jim Meyering <meyering@redhat.com>
+
+ selinux-h: mark parameters of stub functions as intentionally unused
+ * lib/se-selinux.in.h: Mark parameters as _UNUSED_PARAMETER_.
+ * lib/se-context.in.h: Likewise.
+
+2008-10-22 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sys_socket.in.h (FD_ISSET): Fix warnings under mingw.
+
+2008-10-22 Simon Josefsson <simon@josefsson.org>
+
+ * m4/getgroups.m4: Avoid invoking test with wrong parameters.
+
+2008-10-22 Eric Blake <ebb9@byu.net>
+
+ glthread/thread: avoid compiler warning
+ * lib/glthread/thread.c (gl_thread_exit_func) [USE_WIN32_THREADS]:
+ Add unreachable abort to silence compiler.
+
+2008-10-22 Eric Blake <ebb9@byu.net>
+
+ netdb: also supply struct addrinfo for cygwin 1.5.x
+ * m4/netdb_h.m4 (gl_HEADER_NETDB): Check for incomplete header on
+ older cygwin.
+ * lib/netdb.in.h [!HAVE_STRUCT_ADDRINFO]: Also supply contents for
+ cygwin.
+ * doc/posix-headers/netdb.texi (netdb.h): Document this.
+
+2008-10-22 Bruno Haible <bruno@clisp.org>
+
+ * users.txt: Update entry about pspp.
+
+2008-10-21 Bruno Haible <bruno@clisp.org>
+
+ Simplification.
+ * lib/sys_socket.in.h (_gl_close_fd_maybe_socket): Remove declaration.
+ * lib/close.c (_gl_close_fd_maybe_socket): Make static.
+
+ Simplification.
+ * lib/ioctl.c (ioctl): Don't undefine.
+ * lib/socket.c (socket): Don't undefine.
+
+ Remove unused module indicator macros.
+ * m4/sys_socket_h.m4 (gl_SYS_SOCKET_MODULE_INDICATOR): Don't define
+ GNULIB_$1 as a C macro.
+
+ * doc/posix-functions/close.texi: Undo last change.
+ * doc/posix-functions/ioctl.texi: Merge the two paragraphs about
+ Windows platforms.
+
+2008-10-21 Bruno Haible <bruno@clisp.org>
+
+ Add gethostname() declaration to <unistd.h>.
+ * lib/unistd.in.h (gethostname): New declaration.
+ * lib/gethostname.c: Include <unistd.h>.
+ * m4/gethostname.m4 (gl_FUNC_GETHOSTNAME): Require
+ gl_UNISTD_H_DEFAULTS. Set HAVE_GETHOSTNAME.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_GETHOSTNAME
+ and HAVE_GETHOSTNAME.
+ * modules/gethostname (Depends-on): Add unistd.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Include): Specify <unistd.h>.
+ * modules/unistd (Makefile.am): Substitute GNULIB_GETHOSTNAME and
+ HAVE_GETHOSTNAME.
+ * tests/test-gethostname.c: Include <unistd.h> first.
+
+2008-10-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/poll-tests (Depends-on): Add sys_ioctl, ioctl.
+ * modules/select-tests (Depends-on): Likewise.
+ Reported by Simon Josefsson.
+
+2008-10-21 Simon Josefsson <simon@josefsson.org>
+
+ * lib/close.c: Add _gl_close_fd_maybe_socket from winsock.c.
+ * lib/accept.c: New file, based on winsock.c.
+ * lib/bind.c: New file, based on winsock.c.
+ * lib/connect.c: New file, based on winsock.c.
+ * lib/getpeername.c: New file, based on winsock.c.
+ * lib/getsockname.c: New file, based on winsock.c.
+ * lib/getsockopt.c: New file, based on winsock.c.
+ * lib/ioctl.c: New file, based on winsock.c.
+ * lib/listen.c: New file, based on winsock.c.
+ * lib/recv.c: New file, based on winsock.c.
+ * lib/recvfrom.c: New file, based on winsock.c.
+ * lib/send.c: New file, based on winsock.c.
+ * lib/sendto.c: New file, based on winsock.c.
+ * lib/setsockopt.c: New file, based on winsock.c.
+ * lib/shutdown.c: New file, based on winsock.c.
+ * lib/socket.c: New file, based on winsock.c.
+ * lib/w32sock.h: New file, based on winsock.c.
+ * lib/winsock.c: Remove file.
+ * modules/accept: Likewise.
+ * modules/bind: Likewise.
+ * modules/connect: Likewise.
+ * modules/getpeername: Likewise.
+ * modules/getsockname: Likewise.
+ * modules/getsockopt: Likewise.
+ * modules/ioctl: Likewise.
+ * modules/listen: Likewise.
+ * modules/recv: Likewise.
+ * modules/recvfrom: Likewise.
+ * modules/send: Likewise.
+ * modules/sendto: Likewise.
+ * modules/setsockopt: Likewise.
+ * modules/shutdown: Likewise.
+ * modules/socket: Use socket.c instead of winsock.c.
+ * modules/sys_socket: Remove (unneeded?) dependency on winsock.c.
+ * doc/posix-functions/accept.texi: Doc fix.
+ * doc/posix-functions/bind.texi: Doc fix.
+ * doc/posix-functions/close.texi: Doc fix.
+ * doc/posix-functions/connect.texi: Doc fix.
+ * doc/posix-functions/getpeername.texi: Doc fix.
+ * doc/posix-functions/getsockname.texi: Doc fix.
+ * doc/posix-functions/getsockopt.texi: Doc fix.
+ * doc/posix-functions/ioctl.texi: Doc fix.
+ * doc/posix-functions/listen.texi: Doc fix.
+ * doc/posix-functions/recv.texi: Doc fix.
+ * doc/posix-functions/recvfrom.texi: Doc fix.
+ * doc/posix-functions/send.texi: Doc fix.
+ * doc/posix-functions/sendto.texi: Doc fix.
+ * doc/posix-functions/setsockopt.texi: Doc fix.
+ * doc/posix-functions/shutdown.texi: Doc fix.
+ * doc/posix-functions/socket.texi: Doc fix.
+
+2008-10-20 Bruno Haible <bruno@clisp.org>
+
+ Take into account the role of SIGABRT_COMPAT on Windows 2008.
+ * lib/sigprocmask.c (SIGABRT_COMPAT, SIGABRT_COMPAT_MASK): New macros.
+ (sigismember, sigaddset, sigdelset, sigfillset, rpl_signal): Handle it
+ as an alias for SIGABRT.
+ * lib/sigaction.c (SIGABRT_COMPAT): New macro.
+ (sigaction): Map it to SIGABRT.
+ Reported by Ramiro Polla <ramiro.polla@gmail.com> via Eric Blake.
+
+2008-10-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/fts.c: Don't include lstat.h.
+ * lib/openat.c: Include <sys/stat.h> instead of lstat.h.
+
+ Move the lstat() declaration to <sys/stat.h>.
+ * lib/lstat.h: Remove file.
+ * lib/sys_stat.in.h: Add special invocation convention.
+ (lstat): New declaration.
+ * lib/lstat.c (orig_lstat): New function.
+ (rpl_lstat): Use orig_lstat instead of lstat.
+ * m4/lstat.m4 (gl_FUNC_LSTAT): Require gl_SYS_STAT_H_DEFAULTS and
+ AC_C_INLINE. Set REPLACE_LSTAT.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Initialize GNULIB_LSTAT
+ and REPLACE_LSTAT.
+ * modules/lstat (Files): Remove lib/lstat.h.
+ (configure.ac): Invoke gl_SYS_STAT_MODULE_INDICATOR.
+ (Include): Specify <sys/stat.h> instead of lstat.h.
+ * modules/sys_stat (Makefile.am): Substitute GNULIB_LSTAT and
+ REPLACE_LSTAT.
+ * NEWS: Mention the change.
+
+2008-10-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/posix_spawn-tests: New file.
+ * tests/test-posix_spawn3.c: New file.
+
+2008-10-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/posix_spawnp-tests (Depends-on): Add sys_wait.
+ * tests/test-posix_spawn1.c (WTERMSIG, WCOREDUMP, WEXITSTATUS,
+ WIFSIGNALED, WIFEXITED, WIFSTOPPED): Remove fallback definitions.
+ * tests/test-posix_spawn2.c (WTERMSIG, WCOREDUMP, WEXITSTATUS,
+ WIFSIGNALED, WIFEXITED, WIFSTOPPED): Likewise.
+
+2008-10-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/posix_spawn.m4 (gl_POSIX_SPAWN_WORKS): Test against another bug
+ of posix_spawn on AIX 5.3.
+
+2008-10-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/posix_spawn.m4 (gl_POSIX_SPAWN_WORKS): Make the check on MacOS X.
+
+2008-10-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/posix_spawn.m4 (gl_POSIX_SPAWN_WORKS): Use AC_LANG_SOURCE instead
+ of AC_LANG_PROGRAM.
+
+2008-10-20 Simon Josefsson <simon@josefsson.org>
+
+ * lib/netdb.in.h: Don't define GNU specific constants until they
+ are supported or needed. Reported by Bruno Haible
+ <bruno@clisp.org>.
+
+2008-10-20 Simon Josefsson <simon@josefsson.org>
+
+ * lib/canon-host.c: Include netdb.h instead of getaddrinfo.h.
+
+2008-10-20 Simon Josefsson <simon@josefsson.org>
+
+ * lib/getaddrinfo.h: Remove file.
+ * modules/getaddrinfo: Reflect move from getaddrinfo.h to netdb.h.
+ * m4/getaddrinfo.m4: Call gl_HEADER_NETDB. Don't check for netdb.h.
+ * lib/netdb.in.h: Add declarations from getaddrinfo.h.
+ * m4/netdb_h.m4: Initialize GNULIB_GETADDRINFO to 0.
+ * modules/netdb: Substitute GNULIB_GETADDRINFO.
+ * lib/getaddrinfo.c: Include netdb.h instead of getaddrinfo.h.
+ * tests/test-getaddrinfo.c: Likewise.
+ * lib/gai_strerror.c: Likewise. Also drop HAVE_NETDB_H check.
+ * NEWS: Mention change.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/posix_spawn.m4 (gl_POSIX_SPAWN_WORKS): Remove unneeded code.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.c: Include simply <sys/wait.h>.
+ (waitpid, WTERMSIG, WCOREDUMP, WEXITSTATUS, WIFSIGNALED, WIFEXITED,
+ WIFSTOPPED): Remove fallback definitions.
+ * modules/wait-process (Depends-on): Add sys_wait.
+
+ New module 'sys_wait'.
+ * modules/sys_wait: New file.
+ * lib/sys_wait.in.h: New file, partially copied from
+ lib/wait-process.c.
+ * m4/sys_wait_h.m4: New file.
+ * doc/posix-headers/sys_wait.texi: Mention the new module.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/wait-process.m4 (gl_WAIT_PROCESS): Remove test for unistd.h.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ Assume that waitpid() fills an 'int' status, not a 'union wait'.
+ * lib/wait-process.c (WAIT_T): Remove type.
+ (WTERMSIG, WCOREDUMP, WEXITSTATUS): Define fallbacks using bit masks.
+ (wait_subprocess): Update.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ New module 'atoll'.
+ * modules/atoll: New file.
+ * lib/stdlib.in.h (atoll): New declaration.
+ * lib/atoll.c: New file, from glibc with modifications.
+ * m4/atoll.m4: New file.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_ATOLL,
+ HAVE_ATOLL.
+ * modules/stdlib (Makefile.am): Substitute GNULIB_ATOLL, HAVE_ATOLL.
+ * doc/posix-functions/atoll.texi: Mention the new module.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ Add strtoull() declaration to <stdlib.h>.
+ * lib/stdlib.in.h (strtoull): New declaration.
+ * m4/strtoull.m4 (gl_FUNC_STRTOLL): Require gl_STDLIB_H_DEFAULTS.
+ Set HAVE_STRTOULL.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_STRTOULL,
+ HAVE_STRTOULL.
+ * modules/strtoull (Depends-on): Add stdlib.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR.
+ * modules/stdlib (Makefile.am): Substitute GNULIB_STRTOULL,
+ HAVE_STRTOULL.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ Add strtoll() declaration to <stdlib.h>.
+ * lib/stdlib.in.h (strtoll): New declaration.
+ * m4/strtoll.m4 (gl_FUNC_STRTOLL): Require gl_STDLIB_H_DEFAULTS.
+ Set HAVE_STRTOLL.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_STRTOLL,
+ HAVE_STRTOLL.
+ * modules/strtoll (Depends-on): Add stdlib.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR.
+ * modules/stdlib (Makefile.am): Substitute GNULIB_STRTOLL, HAVE_STRTOLL.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/bcopy (Depends-on): Add strings.
+ (Include): Specify <strings.h>.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/atexit.texi: Update doc regarding mingw.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/openat-die.c (openat_save_fail, openat_restore_fail): Rename
+ the parameter from 'errno' to 'errnum'. Fixes a compilation error on
+ mingw.
+
+2008-10-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/atanl.c: Don't include isnanl.h.
+ * lib/cosl.c: Likewise.
+ * lib/ldexpl.c: Likewise.
+ * lib/logl.c: Likewise.
+ * lib/sinl.c: Likewise.
+ * lib/sqrtl.c: Likewise.
+ * lib/tanl.c: Likewise.
+
+ Move the isnanf(), isnand(), isnanl() declarations to <math.h>.
+ * lib/isnanf.h: Remove file.
+ * lib/isnand.h: Remove file.
+ * lib/isnanl.h: Remove file.
+ * lib/math.in.h: Include the contents of lib/isnanf.h, lib/isnand.h,
+ lib/isnanl.h. Use HAVE_ISNANF, HAVE_ISNAND, HAVE_ISNANL as substituted
+ macros.
+ * m4/isnanf.m4 (gl_FUNC_ISNANF): Require gl_MATH_H_DEFAULTS. Set
+ HAVE_ISNANF, don't define it as a C macro.
+ * m4/isnand.m4 (gl_FUNC_ISNAND): Require gl_MATH_H_DEFAULTS. Set
+ HAVE_ISNAND, don't define it as a C macro.
+ * m4/isnanl.m4 (gl_FUNC_ISNANL): Require gl_MATH_H_DEFAULTS. Set
+ HAVE_ISNANL, don't define it as a C macro.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_ISNAN[FDL] and
+ HAVE_ISNAN[FDL].
+ * modules/isnanf (Files): Remove lib/isnanf.h.
+ (Depends-on): Add math.
+ (configure.ac): Invoke gl_MATH_MODULE_INDICATOR.
+ (Include): Specify <math.h> instead of isnanf.h.
+ * modules/isnand (Files): Remove lib/isnand.h.
+ (Depends-on): Add math.
+ (configure.ac): Invoke gl_MATH_MODULE_INDICATOR.
+ (Include): Specify <math.h> instead of isnand.h.
+ * modules/isnanl (Files): Remove lib/isnanl.h.
+ (Depends-on): Add math.
+ (configure.ac): Invoke gl_MATH_MODULE_INDICATOR.
+ (Include): Specify <math.h> instead of isnanl.h.
+ * modules/math (Makefile.am): Substitute GNULIB_ISNAN[FDL] and
+ HAVE_ISNAN[FDL].
+ * tests/test-isnanf.c: Include <math.h> instead of isnanf.h.
+ * tests/test-isnand.c: Include <math.h> instead of isnand.h.
+ * tests/test-isnanl.c: Include <math.h> instead of isnanl.h.
+ * NEWS: Mention the change.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ Add getusershell(), setusershell(), endusershell() declarations to
+ <unistd.h>.
+ * lib/unistd.in.h (getusershell, setusershell, endusershell): New
+ declarations.
+ * lib/getusershell.c: Include unistd.h.
+ * m4/getusershell.m4 (gl_FUNC_GETUSERSHELL): Require
+ gl_UNISTD_H_DEFAULTS and AC_USE_SYSTEM_EXTENSIONS. Set
+ HAVE_GETUSERSHELL.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_GETUSERSHELL
+ and HAVE_GETUSERSHELL.
+ * modules/getusershell (Depends-on): Add unistd, extensions.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Include): Specify <unistd.h>.
+ * modules/unistd (Makefile.am): Substitute GNULIB_GETUSERSHELL and
+ HAVE_GETUSERSHELL.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ Add a getloadavg() declaration to <stdlib.h>.
+ * lib/stdlib.in.h; Include <sys/loadavg.h> when needed for the
+ getloadavg declaration.
+ (getloadavg): New declaration.
+ * lib/getloadavg.c: Include <stdlib.h> first.
+ * m4/getloadavg.m4 (gl_GETLOADAVG): Require gl_STDLIB_H_DEFAULTS and
+ AC_USE_SYSTEM_EXTENSIONS. Test whether sys/loadavg.h exists. Set
+ HAVE_SYS_LOADAVG_H and HAVE_DECL_GETLOADAVG.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_GETLOADAVG,
+ HAVE_SYS_LOADAVG_H, HAVE_DECL_GETLOADAVG.
+ * modules/getloadavg (Depends-on): Add stdlib, extensions.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR.
+ (Include): Specify <stdlib.h>.
+ * modules/stdlib (Makefile.am): Substitute GNULIB_GETLOADAVG,
+ HAVE_SYS_LOADAVG_H, HAVE_DECL_GETLOADAVG.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/dirchownmod.c: Don't include lchmod.h.
+
+ Move the lchmod() declaration to <sys/stat.h>.
+ * lib/lchmod.h: Remove file.
+ * lib/sys_stat.in.h: Add placeholder for GL_LINK_WARNING.
+ (lchmod): New declaration, moved here from lib/lchown.h.
+ * m4/lchmod.m4 (gl_FUNC_LCHMOD): Require gl_SYS_STAT_H_DEFAULTS and
+ AC_USE_SYSTEM_EXTENSIONS. Set HAVE_LCHMOD.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Initialize GNULIB_LCHMOD
+ and HAVE_LCHMOD.
+ * modules/lchmod (Files): Remove lib/lchmod.h.
+ (Depends-on): Add sys_stat, extensions.
+ (configure.ac): Invoke gl_SYS_STAT_MODULE_INDICATOR.
+ (Include): Specify <sys/stat.h> instead of lchmod.h.
+ * modules/sys_stat (Depends-on): Add link-warning.
+ (Makefile.am): Substitute GNULIB_LCHMOD, HAVE_LCHMOD, and the
+ definition of GL_LINK_WARNING.
+ * NEWS: Mention the change.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/fchdir.c: Don't include dirfd.h.
+ * lib/fts.c: Likewise.
+ * lib/getcwd.c: Likewise.
+ * lib/glob.c: Likewise.
+
+ Move the dirfd() declaration to <dirent.h>.
+ * lib/dirfd.h: Remove file.
+ * lib/dirent.in.h: Add placeholder for GL_LINK_WARNING.
+ (dirfd): New declaration.
+ * lib/dirfd.c: Include <dirent.h> instead of dirfd.h.
+ * m4/dirfd.m4 (gl_FUNC_DIRFD): Require gl_DIRENT_H_DEFAULTS and
+ AC_USE_SYSTEM_EXTENSIONS. Invoke gl_REPLACE_DIRENT_H. Set
+ HAVE_DECL_DIRFD.
+ * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): Initialize GNULIB_DIRFD and
+ HAVE_DECL_DIRFD.
+ * modules/dirfd (Files): Remove lib/dirfd.h.
+ (Depends-on): Add dirent, extensions.
+ (configure.ac): Invoke gl_DIRENT_MODULE_INDICATOR.
+ (Include): Specify <dirent.h> instead of dirfd.h.
+ * modules/dirent (Depends-on): Add link-warning.
+ (Makefile.am): Substitute GNULIB_DIRFD, HAVE_DECL_DIRFD, and
+ definition of GL_LINK_WARNING.
+ * NEWS: Mention the change.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ Move the euidaccess() declaration to <unistd.h>.
+ * lib/euidaccess.h: Remove file.
+ * lib/unistd.in.h (euidaccess): New declaration.
+ * lib/euidaccess.c: Don't include euidaccess.h.
+ * m4/euidaccess.m4 (gl_FUNC_EUIDACCESS): Require gl_UNISTD_H_DEFAULTS.
+ Don't check whether euidaccess is declared. Set HAVE_EUIDACCESS.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_EUIDACCESS
+ and HAVE_EUIDACCESS.
+ * modules/euidaccess (Files): Remove lib/euidaccess.h.
+ (Depends-on): Add unistd.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Include): Specify <unistd.h> instead of euidaccess.h.
+ * modules/unistd (Makefile.am): Substitute GNULIB_EUIDACCESS and
+ HAVE_EUIDACCESS.
+ * NEWS: Mention the change.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/xgetdomainname.c: Include <unistd.h> instead of getdomainname.h.
+
+ Move the getdomainname() declaration to <unistd.h>.
+ * lib/getdomainname.h: Remove file.
+ * lib/unistd.in.h (getdomainname): New declaration.
+ * lib/getdomainname.c: Include <unistd.h> instead of getdomainname.h.
+ * m4/getdomainname.m4 (gl_FUNC_GETDOMAINNAME): Require
+ gl_UNISTD_H_DEFAULTS and AC_USE_SYSTEM_EXTENSIONS. Set
+ HAVE_GETDOMAINNAME.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
+ GNULIB_GETDOMAINNAME and HAVE_GETDOMAINNAME.
+ * modules/getdomainname (Files): Remove lib/getdomainname.h.
+ (Depends-on): Add unistd, extensions.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Includes): Specify <unistd.h> instead of getdomainname.h.
+ * modules/unistd (Makefile.am): Substitute GNULIB_GETDOMAINNAME and
+ HAVE_GETDOMAINNAME.
+ * NEWS: Mention the change.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/dirent: New file.
+ * m4/dirent_h.m4: New file.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Require gl_DIRENT_H_DEFAULTS.
+ Invoke gl_REPLACE_DIRENT_H. Don't assign DIRENT_H directly.
+ * modules/fchdir (Files): Remove lib/dirent.in.h.
+ (Depends-on): Add dirent.
+ (Makefile.am): Move rules to modules/dirent.
+ * doc/posix-headers/dirent.texi: Mention the new module.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ Avoid -Wunused-parameter warnings in public gnulib header files.
+ * m4/gnulib-common.m4 (gl_COMMON_BODY): Define _UNUSED_PARAMETER_ as a
+ macro.
+ * lib/unistr.h (u32_mbtouc_unsafe, u32_mbtouc): Use it.
+
+2008-10-18 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/dirfd.texi: Mention the module 'dirfd'.
+ * doc/glibc-functions/error.texi: Mention the module 'error'.
+ * doc/glibc-functions/euidaccess.texi: Mention the module 'euidaccess'.
+ * doc/glibc-functions/getdomainname.texi: Mention the module
+ 'getdomainname'.
+ * doc/glibc-functions/getloadavg.texi: Mention the module 'getloadavg'.
+ * doc/glibc-functions/getpagesize.texi: Mention the module
+ 'getpagesize'.
+ * doc/glibc-functions/getusershell.texi: Mention the module
+ 'getusershell'.
+ * doc/glibc-functions/isnanl.texi: Mention the module 'isnanl'.
+ * doc/glibc-functions/lchmod.texi: Mention the module 'lchmod'.
+ * doc/glibc-functions/mempcpy.texi: Mention the module 'mempcpy'.
+ * doc/glibc-functions/memrchr.texi: Mention the module 'memrchr'.
+ * doc/glibc-functions/mkdtemp.texi: Mention the module 'mkdtemp'.
+ * doc/glibc-functions/rpmatch.texi: Mention the module 'rpmatch'.
+ * doc/glibc-functions/stpcpy.texi: Mention the module 'stpcpy'.
+ * doc/glibc-functions/stpncpy.texi: Mention the module 'stpncpy'.
+ * doc/glibc-functions/strchrnul.texi: Mention the module 'strchrnul'.
+ * doc/glibc-functions/strndup.texi: Mention the module 'strndup'.
+ * doc/glibc-functions/strnlen.texi: Mention the module 'strnlen'.
+ * doc/glibc-functions/strsep.texi: Mention the module 'strsep'.
+ * doc/glibc-functions/timegm.texi: Mention the module 'timegm'.
+ * doc/glibc-functions/vasprintf.texi: Mention the module 'vasprintf'.
+
+2008-10-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/signbit.m4 (gl_SIGNBIT_TEST_PROGRAM): On platforms other than
+ HP-UX and IRIX, use -0.0L.
+ * tests/test-ceill.c (minus_zero): Likewise.
+ * tests/test-floorl.c (minus_zero): Likewise.
+ * tests/test-frexpl.c (minus_zero): Likewise.
+ * tests/test-isnan.c (minus_zerol): Likewise.
+ * tests/test-isnanl.h (minus_zero): Likewise.
+ * tests/test-ldexpl.c (minus_zero): Likewise.
+ * tests/test-roundl.c (minus_zero): Likewise.
+ * tests/test-signbit.c (minus_zerol): Likewise.
+ * tests/test-snprintf-posix.h (minus_zerol): Likewise.
+ * tests/test-sprintf-posix.h (minus_zerol): Likewise.
+ * tests/test-truncl.c (minus_zero): Likewise.
+ * tests/test-vasnprintf-posix.c (minus_zerol): Likewise.
+ * tests/test-vasprintf-posix.c (minus_zerol): Likewise.
+ Reported by Markus Armbruster <armbru@redhat.com> via Jim Meyering
+ and by Nelson H. F. Beebe <beebe@math.utah.edu> via Eric Blake.
+
+2008-10-17 Bruno Haible <bruno@clisp.org>
+
+ Avoid gcc warnings because of #pragma GCC system_header on older gcc.
+ * lib/arpa_inet.in.h: Encloses reference to PRAGMA_SYSTEM_HEADER so
+ that it gets activated only for gcc >= 3.0.
+ * lib/dirent.in.h: Likewise.
+ * lib/errno.in.h: Likewise.
+ * lib/fcntl.in.h: Likewise.
+ * lib/float.in.h: Likewise.
+ * lib/iconv.in.h: Likewise.
+ * lib/inttypes.in.h: Likewise.
+ * lib/locale.in.h: Likewise.
+ * lib/math.in.h: Likewise.
+ * lib/netdb.in.h: Likewise.
+ * lib/netinet_in.in.h: Likewise.
+ * lib/search.in.h: Likewise.
+ * lib/signal.in.h: Likewise.
+ * lib/spawn.in.h: Likewise.
+ * lib/stdarg.in.h: Likewise.
+ * lib/stdint.in.h: Likewise.
+ * lib/stdio.in.h: Likewise.
+ * lib/stdlib.in.h: Likewise.
+ * lib/string.in.h: Likewise.
+ * lib/strings.in.h: Likewise.
+ * lib/sys_file.in.h: Likewise.
+ * lib/sys_ioctl.in.h: Likewise.
+ * lib/sys_select.in.h: Likewise.
+ * lib/sys_socket.in.h: Likewise.
+ * lib/sys_stat.in.h: Likewise.
+ * lib/sys_time.in.h: Likewise.
+ * lib/sysexits.in.h: Likewise.
+ * lib/time.in.h: Likewise.
+ * lib/unistd.in.h: Likewise.
+ * lib/wchar.in.h: Likewise.
+ * lib/wctype.in.h: Likewise.
+ Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
+2008-10-17 Jim Meyering <meyering@redhat.com>
+
+ ignore-value: don't depend on inline module
+ * modules/ignore-value (Depends-on): Remove 'inline'.
+ (configure.ac): Instead, add AC_REQUIRE([AC_C_INLINE]) here.
+ Suggestion from Bruno Haible.
+
+2008-10-17 Bruno Haible <bruno@clisp.org>
+
+ New implementation of condition variables for Win32.
+ * lib/glthread/cond.h (struct gl_waitqueue_link): New type.
+ (gl_linked_waitqueue_t): New type.
+ (gl_cond_t): Use it.
+ * lib/glthread/cond.c (struct gl_waitqueue_element): New type.
+ (gl_waitqueue_init, gl_waitqueue_add, gl_waitqueue_remove,
+ gl_waitqueue_notify_first, gl_waitqueue_notify_all): New functions.
+ (glthread_cond_init_func, glthread_cond_wait_func,
+ glthread_cond_timedwait_func, glthread_cond_signal_func,
+ glthread_cond_broadcast_func, glthread_cond_destroy_func):
+ Reimplemented on the basis of gl_linked_waitqueue_t.
+ * lib/glthread/lock.h (gl_carray_waitqueue_t): Renamed from
+ gl_waitqueue_t.
+ (gl_rwlock_t): Update.
+ * lib/glthread/lock.c (gl_waitqueue_t): Alias to gl_carray_waitqueue_t.
+
+2008-10-17 Simon Josefsson <simon@josefsson.org>
+
+ * modules/recvfrom (Depends-on): Add dependency on getpeername.
+ Reported by Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+2008-10-17 Jim Meyering <meyering@redhat.com>
+
+ ignore-value: new module
+ * modules/ignore-value: New file.
+ * lib/ignore-value.h: New file.
+ * MODULES.html.sh (Compiler warning management): New section,
+ just for this module. More to come.
+
+2008-10-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ open-safer.c: avoid 'signed and unsigned in conditional...' warning
+ * lib/open-safer.c (open_safer): Use an "if/else" statement in place
+ of the ternary operator. Reported by Reuben Thomas <rrt@sc3d.org>.
+
+2008-10-16 Jim Meyering <meyering@redhat.com>
+
+ openat-die.c: avoid 'no previous prototype' warning
+ * lib/openat-die.c: Include "openat.h".
+ Reported by Reuben Thomas <rrt@sc3d.org>.
+
+2008-10-16 Simon Josefsson <simon@josefsson.org>
+
+ * m4/netdb_h.m4: Assume that if netdb.h exists, it works.
+ * lib/netdb.in.h: Fix typo.
+ Reported by Bruno Haible <bruno@clisp.org>
+
+ * lib/netdb.in.h: Include sys/socket.h for platforms without
+ netdb.h, to get structures like hostent on MinGW.
+ * modules/netdb (Depends-on): Add sys_socket.
+
+2008-10-15 Simon Josefsson <simon@josefsson.org>
+
+ * modules/netdb, modules/netdb-tests: New file.
+ * m4/netdb_h.m4: New file.
+ * lib/netdb.in.h: Add, currently just an empty file pending
+ definitions.
+ * tests/test-netdb.c: New file.
+ * doc/posix-headers/netdb.texi: Mention that we replace it if
+ needed.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ netdb.
+
+2008-10-15 Simon Josefsson <simon@josefsson.org>
+
+ * doc/gnulib.texi (Getaddrinfo and WINVER): Sync documentation
+ with code.
+
+2008-10-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/cond.c (glthread_cond_wait_func,
+ glthread_cond_timedwait_func): Add a comment.
+
+2008-10-13 Yoann Vandoorselaere <yoann@prelude-ids.org>
+
+ * tests/test-poll.c: Include <sys/ioctl.h>, for ioctl().
+ * tests/test-select.c: Likewise,
+
+2008-10-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/cond.c (glthread_cond_wait_func,
+ glthread_cond_timedwait_func): Fix variable name.
+ Reported by Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+2008-10-13 Paolo Bonzini <bonzini@gnu.org>
+
+ fix getaddrinfo emulation for systems with struct sockaddr.sa_len
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Detect
+ struct sockaddr.sa_len.
+ * lib/getaddrinfo.c (getaddrinfo): Set it if appropriate.
+
+2008-10-13 Simon Josefsson <simon@josefsson.org>
+
+ * build-aux/pmccabe2html: Add css and css_url parameters.
+
+2008-10-12 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-sameacls.c (main) [AIX]: Clear type argument before
+ calling aclx_get.
+ Reported by Rainer Tammer <tammer@tammer.net>.
+
+2008-10-12 Bruno Haible <bruno@clisp.org>
+
+ Use msvcrt aware primitives for creation/termination of Win32 threads.
+ * lib/glthread/thread.c: Include <process.h>.
+ (glthread_create_func): Use _beginthreadex instead of CreateThread.
+ (wrapper_func): Update signature.
+ (gl_thread_exit_func): Use _endthreadex instead of EndThread.
+
+2008-10-11 Yoann Vandoorselaere <yoann@prelude-ids.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Provide a Win32 implementation of the 'cond' module.
+ * lib/glthread/cond.h [USE_WIN32]: New implementation.
+ * lib/glthread/cond.c (glthread_cond_init_func,
+ glthread_cond_wait_func, glthread_cond_timedwait_func,
+ glthread_cond_signal_func, glthread_cond_broadcast_func,
+ glthread_cond_destroy_func) [USE_WIN32]: New functions.
+ * modules/cond (Dependencies): Add gettimeofday.
+
+2008-10-11 Bruno Haible <bruno@clisp.org>
+
+ Make sleep work on older versions of mingw.
+ * m4/sleep.m4 (gl_FUNC_SLEEP): Test whether 'sleep' is declared, not
+ only whether it exists.
+ * doc/posix-functions/sleep.texi: Mention the problem with older
+ versions of mingw.
+
+2008-10-11 Bruno Haible <bruno@clisp.org>
+
+ New module 'shutdown'.
+ * modules/shutdown: New file.
+ * lib/sys_socket.in.h (shutdown): New declaration.
+ * lib/winsock.c (shutdown): New function.
+ * m4/sys_socket_h.m4 (gl_SYS_SOCKET_H_DEFAULTS): Initialize
+ GNULIB_SHUTDOWN.
+ * modules/sys_socket (Makefile.am): Substitute GNULIB_SHUTDOWN.
+ * doc/posix-functions/shutdown.texi: Document the new module.
+
+2008-10-11 Jim Meyering <meyering@redhat.com>
+
+ * lib/fclose.c: Fix typo in comment: s/close/fclose/.
+
+2008-10-11 Bruno Haible <bruno@clisp.org>
+
+ New module 'fclose'.
+ * modules/fclose: New file.
+ * lib/stdio.in.h (fclose): New declaration.
+ * lib/fclose.c: New file.
+ * m4/fclose.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Initialize GNULIB_FCLOSE,
+ REPLACE_FCLOSE.
+ * m4/close.m4 (gl_REPLACE_CLOSE): Invoke gl_REPLACE_FCLOSE.
+ * modules/stdio (Makefile.am): Substitute GNULIB_FCLOSE,
+ REPLACE_FCLOSE.
+ * modules/close (Depends-on): fclose.
+ * doc/posix-functions/fclose.texi: Mention the problem on Windows.
+
+2008-10-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/winsock.c (_gl_close_fd_maybe_socket): If closesocket fails,
+ set errno and don't call _close.
+
+2008-10-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-acl.c (qcopy_acl) [CYGWIN]: Call chmod before setting the
+ ACL, not afterwards. Fixes test failure on Cygwin.
+
+2008-10-09 Ben Pfaff <blp@gnu.org>
+
+ * build-aux/announce-gen: Fix gnulib version related part of usage
+ message. Die with a useful error message if no tarballs are
+ found.
+
+2008-10-10 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: use git's --depth=N option only if it's supported
+ * build-aux/bootstrap: Work with git-1.4.4.4, which does not
+ recognize the --depth option. Reported by Pádraig Brady.
+
+2008-10-09 Bruno Haible <bruno@clisp.org>
+
+ New module 'ioctl'.
+ * modules/ioctl: New file.
+ * lib/sys_socket.in.h (ioctl): Remove declaration.
+ * lib/winsock.c: Include <sys/ioctl.h>.
+ (rpl_ioctl): Define only of the gnulib module 'ioctl' is present.
+ * m4/sys_socket_h.m4 (gl_PREREQ_SYS_H_WINSOCK2): Require
+ gl_SYS_IOCTL_H_DEFAULTS. Set also SYS_IOCTL_H_HAVE_WINSOCK2_H.
+ * modules/sys_socket (Files): Add m4/sys_ioctl_h.m4.
+ * doc/posix-functions/ioctl.texi: Mention the new module.
+
+2008-10-09 Bruno Haible <bruno@clisp.org>
+
+ New module 'sys_ioctl'.
+ * lib/sys_ioctl.in.h: New file.
+ * m4/sys_ioctl_h.m4: New file.
+ * modules/sys_ioctl: New file.
+ * doc/glibc-headers/sys_ioctl.texi: Mention the new module.
+
+2008-10-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_socket.in.h (ioctl): Make signature POSIX compliant.
+ * lib/winsock.c: Include <stdarg.h>.
+ (rpl_ioctl): Change to second argument 'int' and then varargs.
+
+2008-10-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/close.m4 (gl_FUNC_CLOSE): Arrange to replace the close() function
+ when the sys_socket module is present and the system has <winsock2.h>.
+
+2008-10-09 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/close.texi: Mention module 'close' instead of
+ module 'sys_socket'.
+
+2008-10-09 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-headers/sys_ioctl.texi: New file.
+ * doc/gnulib.texi: Include it.
+
+2008-10-09 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Combine the two replacements of 'close'.
+ * lib/sys_socket.in.h (close): Define to a reminder to include
+ <unistd.h>.
+ (_gl_close_fd_maybe_socket): New declaration.
+ (HAVE__GL_CLOSE_FD_MAYBE_SOCKET): New macro.
+ * lib/winsock.c (close): Remove undefinition.
+ (_gl_close_fd_maybe_socket): Renamed from rpl_close. Define only when
+ needed for the gnulib module 'close'.
+ * lib/unistd.in.h (close): If the gnulib module 'close' is not used,
+ define to an error symbol or to a warning, if suitable.
+ * lib/close.c: Include <sys/socket.h>.
+ (rpl_close): Invoke _gl_close_fd_maybe_socket when gnulib defines it.
+ * m4/sys_socket_h.m4 (gl_PREREQ_SYS_H_WINSOCK2): Set also
+ UNISTD_H_HAVE_WINSOCK2_H.
+ (gl_SYS_SOCKET_H_DEFAULTS): Require gl_UNISTD_H_DEFAULTS.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
+ UNISTD_H_HAVE_WINSOCK2_H.
+ * modules/sys_socket (Files): Add m4/unistd_h.m4.
+ (configure.ac): Set a module indicator.
+ (Makefile.am): Substitute GNULIB_CLOSE.
+ * modules/unistd (Makefile.am): Substitute UNISTD_H_HAVE_WINSOCK2_H.
+ * modules/poll-tests (Depends-on): Add close.
+ * modules/select-tests (Depends-on): Likewise.
+
+2008-10-09 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ New module 'close'.
+ * modules/close: New file.
+ * lib/unistd.in.h (close): Move declaration out of the
+ FCHDIR_REPLACEMENT scope.
+ (_gl_unregister_fd): New declaration.
+ * lib/close.c: New file.
+ * lib/fchdir.c (rpl_close): Remove function.
+ * m4/close.m4: New file.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): When replacing fchdir, also replace
+ close.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_CLOSE and
+ REPLACE_CLOSE.
+ * modules/unistd (Makefile.am): Substitute GNULIB_CLOSE and
+ REPLACE_CLOSE.
+ * modules/fchdir (Depends-on): Add close.
+
+2008-10-09 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/fcntl.in.h (open): Simplify conditionals.
+ (_gl_register_fd): New declaration.
+ * lib/fchdir.c (rpl_open): Remove function.
+ * lib/open.c: When FCHDIR_REPLACEMENT is defined, compile the file
+ also.
+ (open): When FCHDIR_REPLACEMENT is defined, invoke _gl_register_fd.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): When replacing fchdir, also replace
+ open.
+
+2008-10-09 Jim Meyering <meyering@redhat.com>
+
+ GNUmakefile: use the more name-space-friendly "_version"
+ * top/GNUmakefile (_dummy): Update.
+ (_version): Rename from "version".
+
+2008-10-09 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/fchdir.c (_gl_unregister_fd): New functions, extracted from
+ rpl_close.
+ (_gl_register_fd): New function, extracted from rpl_open.
+ (rpl_close, rpl_closedir): Use _gl_unregister_fd.
+ (rpl_open, rpl_opendir): Use _gl_register_fd.
+
+2008-10-09 Paolo Bonzini <bonzini@gnu.org>
+
+ Fix organization of 'open' replacement.
+ * m4/open.m4 (gl_REPLACE_OPEN): New macro.
+ (gl_FUNC_OPEN): Use it.
+ (gl_PREREQ_OPEN): Add a : to make the body non-empty.
+
+2008-10-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/getdate-tests (test_getdata_LDADD): Add LIBINTL.
+
+2008-10-08 Simon Josefsson <simon@josefsson.org>
+
+ * m4/sys_socket_h.m4: Don't AC_LIBOBJ(winsock). The file is
+ AC_LIBOBJ'ed by each gnulib module that needs it (e.g., socket,
+ listen).
+
+2008-10-08 Eric Blake <ebb9@byu.net>
+
+ GNUmakefile: add 'make version' target
+ * top/GNUmakefile (_curr-ver): Split version update rules...
+ (version): ...into a target.
+
+2008-10-07 Bruno Haible <bruno@clisp.org>
+
+ Use a more portable replacement expression for -0.0L.
+ * m4/signbit.m4 (gl_SIGNBIT_TEST_PROGRAM): Use -LDBL_MIN * LDBL_MIN
+ instead of -0.0L. Fix m4 quotation.
+
+ * tests/test-signbit.c: Include <float.h>.
+ (minus_zero): New variable.
+ (test_signbitl): Use minus_zero instead of -zero.
+ * modules/signbit-tests (Depends-on): Add float.
+
+ * tests/test-ceill.c: Include <float.h>.
+ (zero): Remove variable.
+ (minus_zero): New variable.
+ (main): Use minus_zero instead of -zero.
+ * modules/ceill-tests (Depends-on): Add float.
+
+ * tests/test-floorl.c: Include <float.h>.
+ (zero): Remove variable.
+ (minus_zero): New variable.
+ (main): Use minus_zero instead of -zero.
+ * modules/floorl-tests (Depends-on): Add float.
+
+ * tests/test-roundl.c: Include <float.h>.
+ (zero): Remove variable.
+ (minus_zero): New variable.
+ (main): Use minus_zero instead of -zero.
+ * modules/roundl-tests (Depends-on): Add float.
+
+ * tests/test-truncl.c: Include <float.h>.
+ (zero): Remove variable.
+ (minus_zero): New variable.
+ (main): Use minus_zero instead of -zero.
+ * modules/truncl-tests (Depends-on): Add float.
+
+ * tests/test-frexpl.c (zero): Remove variable.
+ (minus_zero): New variable.
+ (main): Use minus_zero instead of -zero.
+ * modules/frexpl-tests (Depends-on): Add float.
+
+ * tests/test-isnan.c (zerol): Remove variable.
+ (minus_zerol): New variable.
+ (test_long_double): Use minus_zerol instead of -zerol.
+ * modules/isnan-tests (Depends-on): Add float.
+
+ * tests/test-isnanl.h (zero): Remove variable.
+ (minus_zero): New variable.
+ (main): Use minus_zero instead of -zero.
+ * modules/isnanl-nolibm-tests (Depends-on): Add float.
+ * modules/isnanl-tests (Depends-on): Add float.
+
+ * tests/test-ldexpl.c (zero): Remove variable.
+ (minus_zero): New variable.
+ (main): Use minus_zero instead of -zero.
+ * modules/ldexpl-tests (Depends-on): Add float.
+
+ * tests/test-snprintf-posix.h (zerol): Remove variable.
+ (minus_zerol): New variable.
+ (test_function): Use minus_zerol instead of -zerol.
+ * modules/snprintf-posix-tests (Depends-on): Add float.
+ * modules/vsnprintf-posix-tests (Depends-on): Add float.
+
+ * tests/test-sprintf-posix.h (zerol): Remove variable.
+ (minus_zerol): New variable.
+ (test_function): Use minus_zerol instead of -zerol.
+ * modules/sprintf-posix-tests (Depends-on): Add float.
+ * modules/vsprintf-posix-tests (Depends-on): Add float.
+
+ * tests/test-vasnprintf-posix.c (zerol): Remove variable.
+ (minus_zerol): New variable.
+ (test_function): Use minus_zerol instead of -zerol.
+ * modules/vasnprintf-posix-tests (Depends-on): Add float.
+
+ * tests/test-vasprintf-posix.c (zerol): Remove variable.
+ (minus_zerol): New variable.
+ (test_function): Use minus_zerol instead of -zerol.
+ * modules/vasprintf-posix-tests (Depends-on): Add float.
+
+2008-10-07 Simon Josefsson <simon@josefsson.org>
+
+ * MODULES.html.sh (Support for building documentation): Mention
+ pmccabe2html. Sort entries.
+
+ Add pmccabe2html module, from gnupdf.
+ * build-aux/pmccabe.css: New file.
+ * build-aux/pmccabe2html: New file.
+ * m4/pmccabe2html.m4: New file.
+ * modules/pmccabe2html: New file.
+
+2008-10-07 Richard W.M. Jones <rjones@redhat.com>
+
+ flock: new module
+ * MODULES.html.sh: Add to list of modules.
+ * lib/flock.c: flock implementation for Windows and Unix systems
+ which have fcntl.
+ * doc/glibc-functions/flock.texi: Update documentation.
+ * lib/sys_file.in.h: <sys/file.h> header file.
+ * m4/flock.m4: M4 macros.
+ * m4/sys_file_h.m4: M4 macros for replacement sys/file.h.
+ * modules/flock: flock module.
+ * modules/flock-tests: flock tests module.
+ * modules/sys_file: sys/file.h module.
+ * tests/test-flock.c: test suite for flock.
+
+2008-10-06 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: check for LT_INIT more portably still ;-)
+ * build-aux/bootstrap: Don't rely on \>, since it's not portable.
+ Spotted by Bruno Haible.
+
+2008-10-06 Eric Blake <ebb9@byu.net>
+
+ test-signbit: avoid tripping Irix cc bug on -0.0L
+ * tests/test-signbit.c (minus_zerol): Delete, and replace with
+ '-zerol'. This may break on HP-UX/hppa, but at least makes the
+ entire testsuite consistent and avoids an Irix 6.2 bug.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+ Jim Meyering <jim@meyering.net>
+
+ Add an option for ignoring EPIPE during close_stdout.
+ * lib/closeout.h: Include <stdbool.h>.
+ (close_stdout_set_ignore_EPIPE): New declaration.
+ * lib/closeout.c: Include <stdbool.h>.
+ (ignore_EPIPE): New variable.
+ (close_stdout_set_ignore_EPIPE): New function.
+ (close_stdout): Ignore EPIPE error if ignore_EPIPE is set.
+ * lib/close-stream.c (close_stream): Mention the possible EPIPE
+ failure.
+ * modules/closeout (Depends-on): Add stdbool.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * modules/accept: New file.
+ * modules/bind: New file.
+ * modules/connect: New file.
+ * modules/getpeername: New file.
+ * modules/getsockname: New file.
+ * modules/getsockopt: New file.
+ * modules/listen: New file.
+ * modules/recv: New file.
+ * modules/recvfrom: New file.
+ * modules/send: New file.
+ * modules/sendto: New file.
+ * modules/setsockopt: New file.
+ * modules/socket: New file.
+ * lib/sys_socket.in.h: Include the GL_LINK_WARNING definition.
+ (socket, connect, accept, bind, getpeername, getsockname, getsockopt,
+ listen, recv, send, recvfrom, sendto, setsockopt): Declare only when
+ the particular module is requested. Add a link warning when the
+ particular module is not requested.
+ * lib/winsock.c (rpl_socket, rpl_connect, rpl_accept, rpl_bind,
+ rpl_getpeername, rpl_getsockname, rpl_getsockopt, rpl_listen, rpl_recv,
+ rpl_send, rpl_recvfrom, rpl_sendto, rpl_setsockopt): Define only when
+ the particular module is requested.
+ * m4/sys_socket_h.m4 (gl_SYS_SOCKET_MODULE_INDICATOR,
+ gl_SYS_SOCKET_H_DEFAULTS): New macros.
+ (gl_HEADER_SYS_SOCKET): Require gl_SYS_SOCKET_H_DEFAULTS.
+ * modules/sys_socket (Depends-on): Add link-warning.
+ (Makeifle.am): Substitute GNULIB_SOCKET, GNULIB_CONNECT, GNULIB_ACCEPT,
+ GNULIB_BIND, GNULIB_GETPEERNAME, GNULIB_GETSOCKNAME, GNULIB_GETSOCKOPT,
+ GNULIB_LISTEN, GNULIB_RECV, GNULIB_SEND, GNULIB_RECVFROM,
+ GNULIB_SENDTO, GNULIB_SETSOCKOPT, and the definition of
+ GL_LINK_WARNING.
+ * doc/posix-functions/accept.texi: Mention the new module 'accept'.
+ * doc/posix-functions/bind.texi: Mention the new module 'bind'.
+ * doc/posix-functions/connect.texi: Mention the new module 'connect'.
+ * doc/posix-functions/getpeername.texi: Mention the new module
+ 'getpeername'.
+ * doc/posix-functions/getsockname.texi: Mention the new module
+ 'getsockname'.
+ * doc/posix-functions/getsockopt.texi: Mention the new module
+ 'getsockopt'.
+ * doc/posix-functions/listen.texi: Mention the new module 'listen'.
+ * doc/posix-functions/recv.texi: Mention the new module 'recv'.
+ * doc/posix-functions/recvfrom.texi: Mention the new module 'recvfrom'.
+ * doc/posix-functions/send.texi: Mention the new module 'send'.
+ * doc/posix-functions/sendto.texi: Mention the new module 'sendto'.
+ * doc/posix-functions/setsockopt.texi: Mention the new module
+ 'setsockopt'.
+ * doc/posix-functions/socket.texi: Mention the new module 'socket'.
+ * modules/poll-tests (Depends-on): Add socket, bind, getsockopt,
+ listen, connect, accept.
+ * modules/select-tests (Depends-on): Likewise.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/winsock.c (strerror): Remove unused #undef.
+ (rpl_close): Remove unused local variable.
+
+ * modules/sys_socket (Depends-on); Add errno.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_select.in.h: Include the GL_LINK_WARNING definition.
+ (select): Add a link warning when the 'select' module is not used.
+ * modules/sys_select (Depends-on): Add link-warning.
+ (Makefile.am): Substitute the definition of GL_LINK_WARNING.
+ Suggested by Paolo Bonzini.
+
+2008-10-05 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: check for LT_INIT more portably
+ * build-aux/bootstrap: Avoid using grep -E, since it's not
+ portable enough. Suggestion from Bruno Haible.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/sys_select.texi: Mention 'struct timeval' problem
+ as being fixed by gnulib.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * modules/select-tests: New file, mostly copied from
+ modules/sys_select-tests.
+ * tests/test-select.c: New file, mostly copied from
+ tests/test-sys_select.c.
+ * tests/test-sys_select.c: Move most of the code to tests/test-select.c.
+ * modules/sys_select-tests (Depends-on): Remove all dependencies.
+ (Makefile.am): Remove test_sys_select_LDADD.
+
+ * lib/sys_select.in.h (select): If GNULIB_SELECT is not set, define it
+ to an undefined symbol, for an error message.
+ * m4/sys_select_h.m4 (gl_SYS_SELECT_MODULE_INDICATOR): New macro.
+ (gl_SYS_SELECT_H_DEFAULTS): New macro.
+ (gl_HEADER_SYS_SELECT): Require it. Don't require compilation of
+ winsock-select.c here.
+ * modules/sys_select (Files): Remove lib/winsock-select.c.
+ (Depends-on): Remove alloca.
+ (Makefile.am): Substitute GNULIB_SELECT.
+ * modules/select: New file.
+ * doc/posix-functions/select.texi: Update.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/spawn_faction_addclose.c (__sysconf): Use getdtablesize always.
+ * lib/spawn_faction_adddup2.c (__sysconf): Likewise.
+ * lib/spawn_faction_addopen.c (__sysconf): Likewise.
+ * modules/posix_spawn_file_actions_addclose (Depends-on): Add
+ getdtablesize.
+ * modules/posix_spawn_file_actions_adddup2 (Depends-on): Likewise.
+ * modules/posix_spawn_file_actions_addopen (Depends-on): Likewise.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * modules/getdtablesize-tests: New file.
+ * tests/test-getdtablesize.c: New file.
+
+ New module 'getdtablesize'.
+ * lib/unistd.in.h (getdtablesize): New declaration.
+ * lib/getdtablesize.c: New file.
+ * m4/getdtablesize.m4: New file.
+ * modules/getdtablesize: New file.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
+ GNULIB_GETDTABLESIZE, HAVE_GETDTABLESIZE.
+ * modules/unistd (Makefile.am): Substitute GNULIB_GETDTABLESIZE,
+ HAVE_GETDTABLESIZE.
+ * doc/glibc-functions/getdtablesize.texi: Mention the new module.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * modules/sched (Makefile.am): Fix typo.
+ Reported by Simon Josefsson.
+
+2008-10-05 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: check for LT_INIT, too
+ * build-aux/bootstrap: Both AC_PROG_LIBTOOL and AM_PROG_LIBTOOL
+ are deprecated. Suggestion from Ralf Wildenhues.
+
+2008-10-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/spawn.in.h (POSIX_SPAWN_*): Use the system's values, rather than
+ overriding them by ours.
+ (POSIX_SPAWN_USEVFORK): Use the next free bit position.
+
+2008-10-05 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: check for AC_PROG_LIBTOOL as well as AM_PROG_LIBTOOL
+ * build-aux/bootstrap: Check for AC_PROG_LIBTOOL, as well as the
+ obsolete AM_PROG_LIBTOOL. Spotted by Debarshi Ray <rishi@gnu.org>.
+
+2008-10-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/dup2 (License): Change to LGPLv2+.
+ * modules/sleep (License): Likewise.
+ * modules/perror (License): Likewise.
+ * modules/fopen (License): Change to LGPLv2+, with approval by Eric
+ Blake.
+ * modules/signal (License): Likewise.
+ * modules/sigprocmask (License): Likewise.
+ * modules/raise (License): Change to LGPLv2+, with approval by Jim
+ Meyering.
+
+2008-10-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/spawn.in.h (POSIX_SPAWN_*): Undefine before redefining.
+ Reported by Rainer Tammer <tammer@tammer.net>.
+
+2008-10-03 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/errno.in.h (EWOULDBLOCK) [win32]: Define to EAGAIN.
+ * lib/winsock.c (set_winsock_errno): Map WSAEWOULDBLOCK to EWOULDBLOCK.
+ * lib/strerror.c (rpl_strerror): Remove error string for EWOULDBLOCK.
+
+2008-10-03 Kamil Dudka <kdudka@redhat.com>
+
+ filevercmp: new module
+ * lib/filevercmp.h: New function filevercmp comparing version strings.
+ * lib/filevercmp.c: Implementation of filevercmp function.
+ * modules/filevercmp: Module metadata.
+ * tests/test-filevercmp.c: Unit test for new module.
+ * modules/filevercmp-tests: Unit test metadata.
+ * MODULES.html.sh: Add filevercmp module.
+
+2008-10-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-ctype.h: Add comment.
+ Reported by Jim Meyering.
+
+2008-10-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/posix_spawn-internal (Depends-on): Add 'open'.
+
+2008-10-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * build-aux/bootstrap: Allow renaming bootstrap, and change the
+ name of bootstrap.conf accordingly.
+
+2008-10-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * build-aux/bootstrap: Install git-merge-changelog configuration
+ items into .gitconfig if needed.
+
+2008-10-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * build-aux/bootstrap: Recognize `gnulib' being a submodule in a
+ git repository, and initialize/update it accordingly.
+
+2008-10-02 Richard W.M. Jones <rjones@redhat.com>
+
+ * modules/fsync-tests: New file.
+ * tests/test-fsync.c: New file.
+
+ New module 'fsync'.
+ * lib/fsync.c: New file.
+ * m4/fsync.m4: New file.
+ * modules/fsync: New file.
+ * lib/unistd.in.h (fsync): New declaration.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Define and AC_SUBST both
+ GNULIB_FSYNC and HAVE_FSYNC.
+ * modules/unistd: Substitute GNULIB_FSYNC and HAVE_FSYNC.
+ * MODULES.html.sh (posix_functions): Add fsync.
+ * doc/posix-functions/fsync.texi: Mention the new module.
+
+2008-10-02 Jim Meyering <meyering@redhat.com>
+
+ fts.c: sync with similar code from coreutils' remove.c
+ * lib/fts.c (dirent_inode_sort_may_be_useful): Merge from coreutils.
+ Guard also with "#if defined __linux__", since for now at least,
+ this code is Linux-kernel-specific.
+
+2008-10-02 Jim Meyering <meyering@redhat.com>
+
+ fts: bug fixes
+ * lib/fts.c: Remove unnecessary "defined" in cpp directive.
+ Include <sys/vfs.h>, not <sys/statfs.h>.
+
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Fix typo s/vfs/vfs.h/.
+ Include <sys/vfs.h>, not <sys/statfs.h>.
+
+2008-10-01 Bruno Haible <bruno@clisp.org>
+
+ Avoid the broken posix_spawn function on AIX 5.3 and 6.1.
+ * m4/posix_spawn.m4 (gl_POSIX_SPAWN_WORKS): New macro.
+ (gl_POSIX_SPAWN_BODY): Invoke it. Set REPLACE_POSIX_SPAWN if needed.
+ * doc/posix-functions/posix_spawn.texi: Mention the AIX bugs.
+ * doc/posix-functions/posix_spawnp.texi: Likewise.
+ * m4/execute.m4 (gl_EXECUTE): Invoke gl_POSIX_SPAWN_WORKS, to check
+ whether posix_spawn actually works.
+ * m4/pipe.m4 (gl_PIPE): Likewise.
+ * modules/execute (Files): Add m4/posix_spawn.m4.
+ * modules/pipe (Files): Add m4/posix_spawn.m4.
+ Reported and analyzed by Rainer Tammer <tammer@tammer.net>.
+
+2008-10-01 Jim Meyering <meyering@redhat.com>
+
+ remove trailing spaces
+ * NEWS: Likewise.
+ * lib/poll.c (poll): Likewise.
+ * lib/sys_socket.in.h (SHUT_RDWR): Likewise.
+ * lib/winsock.c (rpl_close): Likewise.
+ * m4/memcmp.m4 (gl_FUNC_MEMCMP): Likewise.
+ * modules/yield: Likewise.
+ * tests/test-poll.c (connect_to_socket, poll1): Likewise.
+ * tests/test-sys_select.c (connect_to_socket): Likewise.
+
+ fts.c: adjust a new interface to be more generally useful
+ * lib/fts.c (dirent_inode_sort_may_be_useful): Take an FD parameter.
+ (fts_build): Adjust caller.
+
+2008-09-30 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * modules/cond-tests: New file.
+ * tests/test-cond.c: New file.
+
+2008-09-30 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/cond (Dependencies): Add errno, time.
+ * lib/glthread/cond.h: Include <time.h>.
+ (gl_cond_define, gl_cond_define_initialized): Use the same definition
+ across platforms.
+
+2008-09-30 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/thread.m4 (gl_THREAD): Fix detection of pthread_atfork function.
+
+2008-09-30 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/tls-tests (Depends-on): Add thread, yield.
+ (configure.ac): Remove all checks.
+ (test_tls_LDADD): Use YIELD_LIB instead of LIBSCHED.
+ * tests/test-tls.c (gl_thread_t, gl_thread_join, gl_thread_yield,
+ gl_thread_self): Remove definitions. Include glthread/thread.h and
+ glthread/yield.h instead.
+ (test_tls): Pass an additional NULL argument to gl_thread_join.
+
+2008-09-30 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/lock-tests (Depends-on): Add thread, yield.
+ (configure.ac): Remove all checks.
+ (test_lock_LDADD): Use YIELD_LIB instead of LIBSCHED.
+ * tests/test-lock.c (gl_thread_t, gl_thread_join, gl_thread_yield,
+ gl_thread_self): Remove definitions. Include glthread/thread.h and
+ glthread/yield.h instead.
+ (test_lock, test_rwlock, test_recursive_lock, test_once): Pass an
+ additional NULL argument to gl_thread_join.
+
+2008-09-30 Bruno Haible <bruno@clisp.org>
+
+ Fix the Win32 implementation of the 'thread' module.
+ * lib/glthread/thread.h [USE_WIN32_THREADS] (gl_thread_t): Change to a
+ pointer type.
+ (gl_thread_self): Invoke gl_thread_self_func.
+ (gl_thread_self_func): New declaration.
+ * lib/glthread/thread.c [USE_WIN32_THREADS] (self_key): New variable.
+ (do_init_self_key, init_self_key): New functions.
+ (struct gl_thread_struct): Renamed from 'struct thread_extra'.
+ Remove some fields.
+ (running_threads, running_lock): Remove variables.
+ (get_current_thread_handle): New function.
+ (gl_thread_self_func, wrapper_func, glthread_create_func,
+ glthread_join_func, gl_thread_exit_func): Largely rewritten and
+ simplified.
+
+2008-09-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/winsock-select.c (win32_poll_handle): Add shortcut for regular
+ files.
+
+2008-09-30 Jim Meyering <meyering@redhat.com>
+
+ fts.m4: correct the test for statfs.f_type
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Include <sys/statfs.h>
+ when checking for statfs.f_type.
+
+2008-09-15 Simon Josefsson <simon@josefsson.org>
+
+ tests: avoid some compiler warnings
+ * tests/test-memchr.c (main): Pass NULL indirectly.
+ * tests/test-getdate.c (main): Remove unused variable 'ret'.
+
+2008-09-29 Ondřej Vašík <ovasik@redhat.com>
+
+ getdate.y: disallow countable dayshifts like "4 yesterday ago"
+ * lib/getdate.y (relative_time_table) [tDAY_SHIFT]: New type for
+ exactly specified dayshifts.
+ (dayshift): New rule.
+ (rel): Add dayshift.
+ (relative_time_table) [tomorrow, yesterday, today, now]:
+ Use tDAY_SHIFT in place of tDAY_UNIT.
+ * tests/test-getdate.c: Add tests for now-disallowed countable
+ dayshifts, e.g., "4 yesterday ago".
+
+2008-09-29 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-posix_spawn1.c: Renamed from tests/test-posix_spawn.c.
+ * tests/test-posix_spawn1.in.sh: Renamed from
+ tests/test-posix_spawn.in.sh.
+ * tests/test-posix_spawn2.c: New file.
+ * tests/test-posix_spawn2.in.sh: New file.
+ * modules/posix_spawnp-tests (Files): Update.
+ (Makefile.am): Update. Add test-posix_spawn2 to the tests.
+
+2008-09-29 Bruno Haible <bruno@clisp.org>
+
+ Propagate effects of putenv/setenv/unsetenv to child processes.
+ * lib/execute.c (execute): Use spawnvpe instead of spawnvp.
+ * lib/pipe.c (create_pipe): Likewise.
+
+2008-09-29 Bruno Haible <bruno@clisp.org>
+
+ Enable use of shell scripts as executables in mingw.
+ * lib/execute.c (execute): When spawnv fails with error ENOEXEC,
+ run the program as a shell script.
+ * lib/pipe.c (create_pipe): Likewise.
+ * lib/w32spawn.h (prepare_spawn): Add a hidden element in front of the
+ resulting array.
+
+2008-09-29 Eric Blake <ebb9@byu.net>
+
+ * m4/arpa_inet_h.m4 (gl_REPLACE_ARPA_INET_H): Fix typo.
+
+2008-08-24 Paolo Bonzini <bonzini@gnu.org>
+
+ * doc/posix-functions/accept.texi: Update mingw problems.
+ * doc/posix-functions/bind.texi: Update mingw problems.
+ * doc/posix-functions/close.texi: Update mingw problems.
+ * doc/posix-functions/connect.texi: Update mingw problems.
+ * doc/posix-functions/getpeername.texi: Update mingw problems.
+ * doc/posix-functions/getsockname.texi: Update mingw problems.
+ * doc/posix-functions/getsockopt.texi: Update mingw problems.
+ * doc/posix-functions/ioctl.texi: Update mingw problems.
+ * doc/posix-functions/listen.texi: Update mingw problems.
+ * doc/posix-functions/recv.texi: Update mingw problems.
+ * doc/posix-functions/recvfrom.texi: Update mingw problems.
+ * doc/posix-functions/select.texi: Update mingw problems.
+ * doc/posix-functions/send.texi: Update mingw problems.
+ * doc/posix-functions/sendto.texi: Update mingw problems.
+ * doc/posix-functions/setsockopt.texi: Update mingw problems.
+ * doc/posix-functions/socket.texi: Update mingw problems.
+
+2008-09-29 Paolo Bonzini <bonzini@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_select.in.h: Include sys/time.h.
+ * m4/sys_select.h.m4: Test that struct timeval is fully defined.
+ * modules/sys_select: Depend on sys_time.
+ * tests/test-sys_select.c: Test that sys/select.h defines struct
+ timeval fully.
+
+2008-09-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_socket.in.h: Wrap the definitions in 'extern "C"'.
+ * lib/sys_select.in.h: Likewise.
+
+2008-09-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/winsock.c (rpl_close, rpl_socket): Remove unused variables.
+
+2008-09-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/sockets.m4 (gl_SOCKETS): Check also for the need to use -lsocket.
+ Set LIBSOCKET instead of augmenting LIBS.
+ * modules/sockets (Link): New section.
+ * modules/sockets-tests (test_sockets_LDADD): New variable.
+ * modules/sys_select-tests (test_sys_select_LDADD): New variable.
+ * modules/poll-tests (test_poll_LDADD): New variable.
+ * NEWS: Document the change.
+
+2008-09-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/arpa_inet_h.m4 (gl_REPLACE_ARPA_INET_H): New macro.
+ * m4/inet_ntop.m4 (gl_INET_NTOP): Invoke it instead of assigning
+ ARPA_INET_H directly.
+ * m4/inet_pton.m4 (gl_INET_PTON): Likewise.
+
+2008-09-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/sys_socket_h.m4 (gl_PREREQ_SYS_H_WINSOCK2): New macro, extracted
+ from gl_HEADER_SYS_SOCKET.
+ (gl_HEADER_SYS_SOCKET): Invoke it.
+ * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Likewise.
+
+2008-09-28 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/sys_select.texi: Mention 'struct timeval' problem.
+ * tests/test-sys_select.c: Include <sys/time.h>, for struct timeval.
+ Needed on OSF/1 4.0.
+
+2008-09-28 Bruno Haible <bruno@clisp.org>
+
+ Override open more carefully.
+ * lib/open.c (orig_open): New function.
+ (rpl_open): Use orig_open instead of open.
+ * lib/fcntl.in.h: Add special invocation convention.
+ * m4/open.m4 (gl_PREREQ_OPEN): New macro.
+ (gl_FUNC_OPEN): Invoke it.
+
+ Override freopen more carefully.
+ * lib/freopen.c (orig_freopen): New function.
+ (rpl_freopen): Use orig_freopen instead of freopen.
+ * m4/freopen.m4 (gl_PREREQ_FREOPEN): New macro.
+ (gl_FUNC_FREOPEN): Invoke it.
+
+ Override fopen more carefully.
+ * lib/fopen.c (orig_fopen): New function.
+ (rpl_fopen): Use orig_fopen instead of fopen.
+ * m4/fopen.m4 (gl_PREREQ_FOPEN): New macro.
+ (gl_FUNC_FOPEN): Invoke it.
+ Needed on AIX. Reported by Rainer Tammer <tammer@tammer.net>.
+
+2008-09-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe.h (create_pipe_out, create_pipe_bidi): Add comment about
+ SIGPIPE.
+
+2008-09-28 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-sigaction.c (handler, main): Disable the check whether
+ SA_RESETHAND has reverted the installed handler to SIG_DFL. Needed on
+ glibc systems with LinuxThreads.
+
+2008-09-28 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/freopen.texi: Mention the trailing slash problem.
+
+ * lib/stdio.in.h (fopen, freopen): Undefine before redefining. Needed
+ with AIX xlc.
+ * lib/fcntl.in.h (open): Likewise.
+ Reported by Rainer Tammer <tammer@tammer.net>.
+
+2008-09-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/posix_spawnp-tests: New file.
+ * tests/test-posix_spawn.c: New file.
+ * tests/test-posix_spawn.in.sh: New file.
+
+ New module 'posix_spawnp'.
+ * modules/posix_spawnp: New file.
+ * lib/spawnp.c: New file, from GNU libc with modifications.
+ * doc/posix-functions/posix_spawnp.texi: Mention the new module.
+
+ New module 'posix_spawn'.
+ * modules/posix_spawn: New file.
+ * lib/spawn.c: New file, from GNU libc with modifications.
+ * doc/posix-functions/posix_spawn.texi: Mention the new module.
+
+ New module 'posix_spawnattr_destroy'.
+ * modules/posix_spawnattr_destroy: New file.
+ * lib/spawnattr_destroy.c: New file, from GNU libc with modifications.
+ * doc/posix-functions/posix_spawnattr_destroy.texi: Mention the new
+ module.
+
+ New module 'posix_spawnattr_setsigmask'.
+ * modules/posix_spawnattr_setsigmask: New file.
+ * lib/spawnattr_setsigmask.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_setsigmask.texi: Mention the
+ new module.
+
+ New module 'posix_spawnattr_getsigmask'.
+ * modules/posix_spawnattr_getsigmask: New file.
+ * lib/spawnattr_getsigmask.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_getsigmask.texi: Mention the
+ new module.
+
+ New module 'posix_spawnattr_setsigdefault'.
+ * modules/posix_spawnattr_setsigdefault: New file.
+ * lib/spawnattr_setdefault.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_setsigdefault.texi: Mention the
+ new module.
+
+ New module 'posix_spawnattr_getsigdefault'.
+ * modules/posix_spawnattr_getsigdefault: New file.
+ * lib/spawnattr_getdefault.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_getsigdefault.texi: Mention the
+ new module.
+
+ New module 'posix_spawnattr_setschedpolicy'.
+ * modules/posix_spawnattr_setschedpolicy: New file.
+ * lib/spawnattr_setschedpolicy.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_setschedpolicy.texi: Mention the
+ new module.
+
+ New module 'posix_spawnattr_getschedpolicy'.
+ * modules/posix_spawnattr_getschedpolicy: New file.
+ * lib/spawnattr_getschedpolicy.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_getschedpolicy.texi: Mention the
+ new module.
+
+ New module 'posix_spawnattr_setschedparam'.
+ * modules/posix_spawnattr_setschedparam: New file.
+ * lib/spawnattr_setschedparam.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_setschedparam.texi: Mention the
+ new module.
+
+ New module 'posix_spawnattr_getschedparam'.
+ * modules/posix_spawnattr_getschedparam: New file.
+ * lib/spawnattr_getschedparam.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_getschedparam.texi: Mention the
+ new module.
+
+ New module 'posix_spawnattr_setpgroup'.
+ * modules/posix_spawnattr_setpgroup: New file.
+ * lib/spawnattr_setpgroup.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_setpgroup.texi: Mention the new
+ module.
+
+ New module 'posix_spawnattr_getpgroup'.
+ * modules/posix_spawnattr_getpgroup: New file.
+ * lib/spawnattr_getpgroup.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawnattr_getpgroup.texi: Mention the new
+ module.
+
+ New module 'posix_spawnattr_setflags'.
+ * modules/posix_spawnattr_setflags: New file.
+ * lib/spawnattr_setflags.c: New file, from GNU libc with modifications.
+ * doc/posix-functions/posix_spawnattr_setflags.texi: Mention the new
+ module.
+
+ New module 'posix_spawnattr_getflags'.
+ * modules/posix_spawnattr_getflags: New file.
+ * lib/spawnattr_getflags.c: New file, from GNU libc with modifications.
+ * doc/posix-functions/posix_spawnattr_getflags.texi: Mention the new
+ module.
+
+ New module 'posix_spawnattr_init'.
+ * modules/posix_spawnattr_init: New file.
+ * lib/spawnattr_init.c: New file, from GNU libc with modifications.
+ * doc/posix-functions/posix_spawnattr_init.texi: Mention the new
+ module.
+
+ New module 'posix_spawn_file_actions_destroy'.
+ * modules/posix_spawn_file_actions_destroy: New file.
+ * lib/spawn_faction_destroy.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawn_file_actions_destroy.texi: Mention
+ the new module.
+
+ New module 'posix_spawn_file_actions_addopen'.
+ * modules/posix_spawn_file_actions_addopen: New file.
+ * lib/spawn_faction_addopen.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawn_file_actions_addopen.texi: Mention
+ the new module.
+
+ New module 'posix_spawn_file_actions_adddup2'.
+ * modules/posix_spawn_file_actions_adddup2: New file.
+ * lib/spawn_faction_adddup2.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawn_file_actions_adddup2.texi: Mention
+ the new module.
+
+ New module 'posix_spawn_file_actions_addclose'.
+ * modules/posix_spawn_file_actions_addclose: New file.
+ * lib/spawn_faction_addclose.c: New file, from GNU libc with
+ modifications.
+ * doc/posix-functions/posix_spawn_file_actions_addclose.texi: Mention
+ the new module.
+
+ New module 'posix_spawn_file_actions_init'.
+ * modules/posix_spawn_file_actions_init: New file.
+ * lib/spawn_faction_init.c: New file, from GNU libc with modifications.
+ * doc/posix-functions/posix_spawn_file_actions_init.texi: Mention the
+ new module.
+
+ New module 'posix_spawn-internal'.
+ * modules/posix_spawn-internal: New file.
+ * lib/spawn_int.h: New file, from GNU libc with modifications.
+ * lib/spawni.c: New file, from GNU libc with modifications.
+ * m4/posix_spawn.m4: New file.
+
+ New module 'spawn'.
+ * modules/spawn: New file.
+ * lib/spawn.in.h: New file, from GNU libc with modifications.
+ * m4/spawn_h.m4: New file.
+ * doc/posix-headers/spawn.texi: Mention the new module.
+
+2008-09-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/sched-tests: New file.
+ * tests/test-sched.c: New file.
+
+ New module 'sched'.
+ * modules/sched: New file.
+ * lib/sched.in.h: New file.
+ * m4/sched_h.m4: New file.
+ * doc/posix-headers/sched.texi: Mention the new module.
+
+2008-09-27 Eric Blake <ebb9@byu.net>
+
+ Fix previous patch, and tweak references to $0.
+ * posix-modules: Call func_gnulib_dir before using $gnulib_dir.
+ (func_version, func_gnulib_dir): Don't call this program
+ gnulib-tool.
+ (func_gnulib_dir, func_tmpdir, func_fatal_error): Avoid shell bugs
+ with using $0 in function.
+ * gnulib-tool (func_gnulib_dir, func_tmpdir): Likewise.
+ (func_fatal_error): Reuse the name the user invoked us with.
+
+2008-09-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/iconv_h.m4 (gl_REPLACE_ICONV_H): New macro.
+ (gl_ICONV_H_DEFAULTS): Initialize ICONV_H here...
+ (gl_ICONV_H): Not here.
+ * m4/iconv_open.m4 (gl_REPLACE_ICONV_OPEN): Invoke gl_REPLACE_ICONV_H
+ instead of assigning ICONV_H directly.
+
+ * m4/wchar.m4 (gl_REPLACE_WCHAR_H): New macro.
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Invoke it instead of assigning
+ WCHAR_H directly.
+
+2008-09-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/arpa_inet.in.h: Include the GL_LINK_WARNING anchor.
+ * modules/arpa_inet (Depends-on): Add link-warning.
+ (Makefile.am): Insert the definition of GL_LINK-WARNING.
+ * modules/unistd (Makefile.am): Likewise.
+
+2008-09-26 Bruno Haible <bruno@clisp.org>
+
+ * posix-modules (cvsdatestamp, last_checkin_date, version): Remove
+ variables.
+ (func_version): Essentially copied from gnulib-tool.
+ (func_exit, func_gnulib_dir, func_tmpdir, func_fatal_error,
+ func_readlink): Copied from gnulib-tool.
+
+2008-09-26 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_version): Change directory to $gnulib_dir before
+ invoking git-version-gen.
+
+2008-09-26 Bruno Haible <bruno@clisp.org>
+
+ * posix-modules: Update to directory names changed on 2008-01-19.
+ Remove commas in output before splitting into words. No more need to
+ avoid 'ftruncate' since 2007-02-19.
+
+2008-09-26 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/errno.texi: Remove mention of module 'EOVERFLOW'.
+
+2008-09-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/fwriteerror.c (do_fwriteerror): Ignore error EPIPE.
+ * modules/fwriteerror (Depends-on): Add errno.
+
+2008-09-26 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vc-list-files-git.sh: Explain reason for skipping test.
+ * tests/test-vc-list-files-cvs.sh: Likewise.
+
+2008-09-26 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/sys_resource.texi: Reorder items.
+
+2008-09-26 Jim Meyering <meyering@redhat.com>
+
+ fts: tweak inode comparison function
+ * lib/fts.c (fts_compare_ino): Sort on increasing, not decreasing
+ inode numbers, as documented.
+
+ fts: sort dirent entries on inode number before traversing
+ This avoids a quadratic, seek-related performance penalty when
+ operating on a directory containing many entries (measurable at 10k;
+ 3.5 hours at 2 million entries with a cold cache) on certain types
+ of file systems, including ext3 and ext4, but not tmpfs.
+ * lib/fts.c (DT_MUST_BE, NOT_AN_INODE_NUMBER, D_INO): Define.
+ (FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD): Define if not defined.
+ (S_MAGIC_TMPFS, S_MAGIC_NFS): Define.
+ (fs_handles_readdir_ordered_dirents_efficiently): New function.
+ (dirent_inode_sort_may_be_useful, fts_compare_ino): Likewise.
+ (fts_build): Set the stat.st_ino member from D_INO.
+ If it is likely to be useful, sort dirent entries on inode number.
+
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Check for fstatfs, sys/vfs.h,
+ and the struct statfs.f_type member.
+ * modules/fts (Depends-on): Add d-ino.
+
+2008-09-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/sigpipe-die (Depends-on): Add sigpipe.
+
+ * lib/stdio.in.h (fprintf, vfprintf, printf, vprintf, fputc, putc,
+ putchar, fputs, puts, fwrite): Replace when REPLACE_STDIO_WRITE_FUNCS
+ and GNULIB_STDIO_H_SIGPIPE are set.
+ * lib/stdio-write.c: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H): Set GNULIB_FPRINTF, GNULIB_PRINTF,
+ GNULIB_VFPRINTF, GNULIB_VPRINTF, GNULIB_FPUTC, GNULIB_PUTC,
+ GNULIB_PUTCHAR, GNULIB_FPUTS, GNULIB_PUTS, GNULIB_FWRITE,
+ REPLACE_STDIO_WRITE_FUNCS.
+ (gl_STDIO_H_DEFAULTS): Initialize GNULIB_FPRINTF, GNULIB_PRINTF,
+ GNULIB_VFPRINTF, GNULIB_VPRINTF, GNULIB_FPUTC, GNULIB_PUTC,
+ GNULIB_PUTCHAR, GNULIB_FPUTS, GNULIB_PUTS, GNULIB_FWRITE,
+ GNULIB_STDIO_H_SIGPIPE, REPLACE_STDIO_WRITE_FUNCS.
+ * modules/stdio (Files): Add lib/stdio-write.c.
+ (Makefile.am): Substitute GNULIB_FPRINTF, GNULIB_PRINTF,
+ GNULIB_VFPRINTF, GNULIB_VPRINTF, GNULIB_FPUTC, GNULIB_PUTC,
+ GNULIB_PUTCHAR, GNULIB_FPUTS, GNULIB_PUTS, GNULIB_FWRITE,
+ GNULIB_STDIO_H_SIGPIPE, REPLACE_STDIO_WRITE_FUNCS.
+ * m4/fprintf-posix.m4 (gl_REPLACE_FPRINTF): Define
+ REPLACE_FPRINTF_POSIX.
+ * m4/printf-posix-rpl.m4 (gl_REPLACE_PRINTF): Define
+ REPLACE_PRINTF_POSIX.
+ * m4/vfprintf-posix.m4 (gl_REPLACE_VFPRINTF): Define
+ REPLACE_VFPRINTF_POSIX.
+ * m4/vprintf-posix.m4 (gl_REPLACE_VPRINTF): Define
+ REPLACE_VPRINTF_POSIX.
+ * doc/posix-functions/fprintf.texi: Mention the sigpipe module and the
+ SIGPIPE issue.
+ * doc/posix-functions/fputc.texi: Likewise.
+ * doc/posix-functions/fputs.texi: Likewise.
+ * doc/posix-functions/fwrite.texi: Likewise.
+ * doc/posix-functions/printf.texi: Likewise.
+ * doc/posix-functions/putc.texi: Likewise.
+ * doc/posix-functions/putchar.texi: Likewise.
+ * doc/posix-functions/puts.texi: Likewise.
+ * doc/posix-functions/vfprintf.texi: Likewise.
+ * doc/posix-functions/vprintf.texi: Likewise.
+
+ * modules/safe-write (Depends-on): Add write.
+
+ * modules/sigpipe-tests: New file.
+ * tests/test-sigpipe.c: New file.
+ * tests/test-sigpipe.sh: New file.
+
+ * modules/write: New file.
+ * lib/unistd.in.h: Include <sys/types.h>.
+ (write): New declaration.
+ * lib/write.c: New file.
+ * m4/write.m4: New file.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
+ GNULIB_UNISTD_H_SIGPIPE, GNULIB_WRITE, REPLACE_WRITE.
+ * modules/unistd (Makefile.am): Substitute GNULIB_UNISTD_H_SIGPIPE,
+ GNULIB_WRITE, REPLACE_WRITE.
+ * doc/posix-functions/write.texi: Mention the write, sigpipe modules
+ and the SIGPIPE issue.
+
+ * lib/signal.in.h (SIGPIPE): Define to a replacement value.
+ (raise): New declaration.
+ * lib/sigprocmask.c (SIGPIPE_handler): New variable.
+ (ext_signal): New function.
+ (rpl_raise): New function.
+ * m4/signal_h.m4 (gl_SIGNAL_H_DEFAULTS): Initialize
+ GNULIB_SIGNAL_H_SIGPIPE.
+ * modules/signal (Makefile.am): Substitute GNULIB_SIGNAL_H_SIGPIPE.
+ * doc/posix-headers/signal.texi: Mention the SIGPIPE issue.
+
+ * modules/sigpipe: New file.
+ * m4/sigpipe.m4: New file.
+
+2008-09-25 Derek Price <derek@ximbiot.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Report all license incompatibilities, not
+ just the first one.
+
+2008-09-25 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): When computing the edits, consider not
+ only the Makefile.ams that exist but also those that will be generated.
+
+2008-09-25 Simon Josefsson <simon@josefsson.org>
+
+ * modules/sys_select-tests (Depends-on): Remove sys_select itself,
+ fixes gnulib-tool --test warning about duplicate dependency.
+
+2008-09-25 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Don't ask the user to perform edits in the generated
+ Makefile.ams.
+ (func_emit_lib_Makefile_am): Emit empty SUBDIRS. Execute edits that
+ apply to the Makefile.am being generated.
+ (func_emit_tests_Makefile_am): Execute edits that apply to the
+ Makefile.am being generated.
+ (func_import): Setup list of Makefile.am edits before emitting the
+ Makefile.ams, not at the end.
+ (func_create_testdir): Update.
+ Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
+2008-09-25 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * gnulib-tool (func_import): Store the --tests-base option in the
+ comment in gnulib-cache.m4.
+
+2008-09-24 Paolo Bonzini <bonzini@gnu.org>
+
+ * NEWS: Document increased portability that sys_select now provides.
+
+ * lib/sys_select.in.h: Install select wrapper.
+ * lib/sys_socket.in.h: Use more descriptive name when there is no
+ select wrapper.
+ * lib/winsock-select.c: New.
+ * m4/sys_select_h.m4: Compile lib/winsock-select.c if WinSock is used.
+ Require gl_HEADER_SYS_SOCKET.
+ * modules/sys_select: Depend on alloca, add lib/winsock-select.c.
+ * modules/sys_select-tests: Copy dependencies from modules/poll-tests.
+ * tests/test-sys_select.c: Add functional tests.
+
+2008-09-24 Eric Blake <ebb9@byu.net>
+
+ open, fopen: close fd leak in last patch
+ * lib/open.c (rpl_open): Close fd before returning error.
+ * lib/fopen.c (rpl_fopen): Close fd before returning error.
+ * doc/posix-functions/open.texi (open): Document that Irix also
+ has the bug.
+ * doc/posix-functions/fopen.texi (fopen): Likewise.
+ Reported by Paolo Bonzini.
+
+2008-09-24 Bruno Haible <bruno@clisp.org>
+
+ Ensure that a filename ending in a slash cannot be used to access a
+ non-directory.
+ * lib/open.c (rpl_open): When the filename ends in a slash, use fstat()
+ to check whether it's really a directory.
+ * lib/fopen.c: Include fcntl.h, unistd.h.
+ (rpl_fopen): When the filename ends in a slash, use open(), fstat(),
+ and fdopen().
+ * modules/fopen (Depends-on): Add unistd.
+ * tests/test-open.c (main): Try to open "/dev/null/" as a directory.
+ * tests/test-fopen.c (main): Likewise.
+ * doc/posix-functions/open.texi: Mention the HP-UX, Solaris bug.
+ * doc/posix-functions/fopen.texi: Likewise.
+ Reported by Eric Blake.
+
+2008-09-23 Eric Blake <ebb9@byu.net>
+
+ c-stack: avoid compiler optimizations when provoking overflow
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Make
+ recursion harder to optimize, to ensure a stack overflow occurs.
+ * tests/test-c-stack.c (recurse): Likewise.
+ Borrowed from libsigsegv.
+
+ c-stack: work around Irix sigaltstack bug
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Check
+ whether sigaltstack uses wrong end of stack_t (copied in part from
+ libsigsegv).
+ * lib/c-stack.c (c_stack_action) [!HAVE_LIBSIGSEGV]: Work around
+ Irix bug, without requiring an over-allocation.
+ * doc/posix-functions/sigaltstack.texi (sigaltstack): Document the
+ bug.
+
+ fopen: document mingw bug on directories
+ * doc/posix-functions/fopen.texi (fopen): Mention mingw bug for
+ not allowing a stream visiting a directory, even though reading
+ from such a stream is not portable.
+
+2008-09-23 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/poll.c: Rewrite.
+ * modules/poll: Depend on alloca.
+
+2008-09-23 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/sys_socket.in.h: Do not implement rpl_setsockopt here,
+ instead define prototypes for a full set of wrappers. Ensure
+ that Cygwin does not use the compatibility code, which is only
+ for MinGW.
+ * lib/winsock.c: New.
+ * m4/sys_socket_h.m4: Compile lib/winsock.c if WinSock is being used.
+ * modules/sys_socket: Add lib/winsock.c.
+
+ * modules/poll-tests: Add errno and perror.
+ * tests/test-poll.c: Use ioctl, not ioctlsocket.
+
+2008-09-23 Paolo Bonzini <bonzini@gnu.org>
+
+ * tests/test-poll.c: Downgrade minimum needed Winsock version.
+
+2008-09-23 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/*: Add info about functions missing on IRIX 5.3.
+ * doc/glibc-functions/*: Likewise.
+
+2008-09-23 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-perror.sh (tmpfiles): Cleanup temporary files on
+ success.
+
+2008-09-22 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ vasnprintf: fix x86/glibc regression on printf("%La", 0.0L)
+ * lib/vasnprintf.c (VASNPRINTF): Support 0.0 on platforms that
+ supply %A but mishandle pseudo-NaN.
+ Reported by Simon Josefsson.
+
+2008-09-21 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-lock.c (main): Tweak skip message.
+ * tests/test-tls.c (main): Likewise.
+
+2008-09-21 Bruno Haible <bruno@clisp.org>
+
+ * m4/sigaction.m4 (gl_SIGACTION): Remove unnecessary AC_SUBST. Check
+ whether 'struct sigaction' has sa_sigaction here...
+ (gl_PREREQ_SIG_HANDLER_H): ... not here.
+ (gl_PREREQ_SIGACTION): Remove unnecessary AC_SUBST.
+
+2008-09-21 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Support for obsolete systems lacking ANSI C 89): New
+ section.
+ (Support for systems lacking ANSI C 89): Move stdlib, exit, strtol,
+ strtoul, memchr, memcmp, memcpy, memmove, memset, strcspn, strpbrk to
+ the new section.
+ (Support for obsolete systems lacking POSIX:2001): New section.
+ (String handling <string.h>): Move strdup to the new section.
+ Suggested by Simon Josefsson and Paolo Bonzini.
+
+2008-09-21 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (test_function): Allow 3-digit
+ exponents in %e and %g results on 'long double'. Needed for mingw's
+ improved *printf functions.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ Reported by Eric Blake.
+
+2008-09-21 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-snprintf-posix.h (test_function): Remove useless ASSERTs.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+
+2008-09-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/getpass (Depends-on): Add strdup-posix.
+
+ New module 'strdup-posix'.
+ * modules/strdup-posix: New file.
+ * m4/strdup.m4 (gl_FUNC_STRDUP_POSIX): New macro.
+ * lib/string.in.h (strdup): Replace if REPLACE_STRDUP is 1.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize
+ REPLACE_STRDUP.
+ * modules/string (Makefile.am): Substitute REPLACE_STRDUP.
+ * doc/posix-functions/strdup.texi: Mention module strdup-posix.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ strdup-posix.
+
+ * modules/strdup (Depends-on): Remove malloc-posix.
+
+2008-09-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/fstrcmp.c: Add data about branch probabilities, from Ralf
+ Wildenhues.
+
+2008-09-20 Bruno Haible <bruno@clisp.org>
+
+ Ensure that wint_t gets defined on IRIX 5.3.
+ * lib/wchar.in.h (wint_t): Define if not defined by the system.
+ * lib/wctype.in.h (wint_t): Likewise.
+ (__wctype_wint_t): Remove type.
+ (isw*): Use wint_t instead of __wctype_wint_t.
+ * m4/wchar.m4 (gl_WCHAR_H): Invoke gt_TYPE_WINT_T and set HAVE_WINT_T.
+ * modules/wchar (Files): Add m4/wint_t.m4.
+ (Makefile.am): Substitute HAVE_WINT_T.
+ * tests/test-wchar.c: Check that wchar_t and wint_t are defined.
+ * tests/test-wctype.c: Check that wint_t is defined.
+ * doc/posix-headers/wchar.texi: Mention the IRIX 5 problem.
+ * doc/posix-headers/wctype.texi: Likewise.
+ Reported by Tom G. Christensen <tgc@jupiterrise.com>.
+
+2008-09-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_exit): Update comment.
+
+2008-09-18 Simon Josefsson <simon@josefsson.org>
+
+ * modules/getaddrinfo (Depends-on): Remove strdup, this module
+ assumes strdup exists and does not depend on strdup to return
+ ENOMEM on out of memory conditions.
+
+2008-09-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): When printing ±0.0L in
+ NEED_PRINTF_INFINITE_LONG_DOUBLE case with 'e' format, always use two
+ digits for the exponent.
+
+2008-09-18 Jim Meyering <meyering@redhat.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (decimal_point_char): Define also if
+ NEED_PRINTF_INFINITE_LONG_DOUBLE.
+
+2008-09-16 Bruno Haible <bruno@clisp.org>
+ and Eric Blake <ebb9@byu.net>
+
+ vasnprintf: support Irix 5.3
+ * lib/vasnprintf.c (VASNPRINTF): Also handle -0.0L on platforms
+ that mishandle long double infinity.
+ Reported by Tom G. Christensen.
+
+2008-09-16 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/scandir.texi: Mention the function is missing on
+ Solaris 9.
+ * doc/glibc-functions/alphasort.texi: Likewise.
+ Reported by Michael Haubenwallner <michael.haubenwallner@salomon.at>.
+
+2008-09-16 Jim Meyering <meyering@redhat.com>
+
+ posix-shell.m4: reject opensolaris's "sh (AT&T Research) 1993-12-28 s+"
+ * m4/posix-shell.m4 (gl_POSIX_SHELL): Reject a shell that lets
+ a umask modification leak out of a subshell. Otherwise, the
+ opensolaris /bin/sh would be accepted and thus cause unwarranted
+ failures in the coreutils test suite.
+
+2008-09-16 Paolo Bonzini <bonzini@gnu.org>
+
+ * tests/test-poll.c (connect_to_socket): Allow non-blocking connect
+ to succeed.
+
+2008-09-16 Jim Meyering <meyering@redhat.com>
+
+ avoid spurious test failure when library is built without ACL support
+ * m4/acl.m4 (USE_ACL): Define as a shell variable, too, for...
+ * modules/acl-tests (Makefile.am) [TESTS_ENVIRONMENT]: Add USE_ACL.
+ * tests/test-file-has-acl.sh: Skip if USE_ACL == 0.
+ * tests/test-copy-acl.sh: Likewise.
+
+2008-09-15 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/fstrcmp.c (fstrcmp_bounded): Use a second, less quick upper bound
+ based on character occurrence counts.
+
+2008-09-15 Eric Blake <ebb9@byu.net>
+
+ tests: avoid some compiler warnings
+ * tests/test-memchr.c (main): Pass NULL indirectly.
+ * tests/test-closein.c (main): Avoid unused variable.
+
+2008-09-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/errno_h.m4 (gl_HEADER_ERRNO_H_BODY): Test for all the macros that
+ are missing on OpenBSD 4.0 individually.
+ Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
+2008-09-15 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/errno.texi: Mention the Cygwin problem.
+ * doc/posix-functions/strerror.texi: Mention also Cygwin.
+ * doc/posix-functions/perror.texi: Likewise.
+ * m4/errno_h.m4 (gl_HEADER_ERRNO_H_BODY): Test also whether ECANCELED
+ is missing.
+ Reported by Eric Blake.
+
+ * lib/errno.in.h: Use replacement values >= 2000.
+ Reported by Eric Blake.
+
+2008-09-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/fstrcmp.c (EXTRA_CONTEXT_FIELDS): Add field 'edit_count_limit'.
+ (EARLY_ABORT): Return true when the edit_count has grown too beyond the
+ limit.
+ (fstrcmp_bounded): Initialize the edit_count_limit. Return 0 when
+ compareseq was aborted.
+
+2008-09-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/fstrcmp.c (EXTRA_CONTEXT_FIELDS): Combine xvec_edit_count and
+ yvec_edit_count.
+ (NOTE_DELETE, NOTE_INSERT): Increment the combined edit count.
+ (fstrcmp_bounded): Simplify result computation accordingly.
+
+2008-09-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/fstrcmp.h (fstrcmp_bounded): New declaration.
+ (fstrcmp): Define in terms of fstrcmp_bounded.
+ * lib/fstrcmp.c (fstrcmp_bounded): Renamed from fstrcmp. Add
+ lower_bound argument.
+ Return quickly if the result is certainly < lower_bound.
+ * tests/test-fstrcmp.c (check_fstrcmp): Test also fstrcmp_bounded.
+
+2008-09-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/diffseq.h (EARLY_ABORT): New macro.
+ (compareseq): Change return type to bool. Return true when EARLY_ABORT
+ evaluates to true.
+
+2008-09-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/perror-tests: New file.
+ * tests/test-perror.sh: New file.
+ * tests/test-perror.c: New file.
+
+ New module 'perror'.
+ * lib/stdio.in.h (perror): New declaration.
+ * lib/perror.c: New file.
+ * m4/perror.m4: New file.
+ * modules/perror: New file.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add perror.
+ * doc/posix-functions/perror.texi: Mention the perror module.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Initialize GNULIB_PERROR,
+ REPLACE_PERROR.
+ * modules/stdio (Makefile.am): Substitute GNULIB_PERROR,
+ REPLACE_PERROR.
+
+2008-09-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdio (Makefile.am): Reorder to match the order in
+ lib/stdio.in.h.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Likewise.
+
+2008-09-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_socket.in.h (EINPROGRESS, ...): Remove definitions.
+
+2008-09-13 Bruno Haible <bruno@clisp.org>
+
+ Extend strerror to cover the added errno values.
+ * lib/strerror.c: Include errno.h and winsock2.h if it exists.
+ (rpl_strerror): Provide error messages for the added errno values and
+ for the WSA* values.
+ * m4/strerror.m4 (gl_FUNC_STRERROR): Test REPLACE_STRERROR.
+ (gl_FUNC_STRERROR_SEPARATE): If errno.h is replaced, always replace
+ strerror.
+ (gl_PREREQ_STRERROR): Test whether winsock2.h exists.
+ * modules/strerror (Depends-on): Add errno.
+ * doc/posix-functions/strerror.texi: Document the change.
+ * tests/test-strerror.c (main): Check also the string for ETIMEDOUT
+ and EOVERFLOW.
+
+2008-09-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/EOVERFLOW: Remove file.
+ * m4/eoverflow.m4: Remove file.
+ * modules/EOVERFLOW-tests: Remove file.
+ * tests/test-EOVERFLOW.c: Remove file.
+ * modules/fprintf-posix (Depends-on): Replace EOVERFLOW with errno.
+ * modules/ftell (Depends-on): Likewise.
+ * modules/getdelim (Depends-on): Likewise.
+ * modules/getugroups (Depends-on): Likewise.
+ * modules/poll (Depends-on): Likewise.
+ * modules/snprintf (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/vasnprintf (Depends-on): Likewise.
+ * modules/vasprintf (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+ * modules/xvasprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-vasprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-vsnprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-vsprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-u8-vasprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-u8-vsnprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-u8-vsprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-vasprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-vsnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-vsprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-vasprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-vsnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-vsprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-vasprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-vsnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-vsprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-vasprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-vsnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-vsprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-fprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vasprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vfprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vsnprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vsprintf (Depends-on): Likewise.
+ * MODULES.html.sh: Remove EOVERFLOW.
+ * NEWS: Mention the change.
+
+2008-09-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/errno-tests: New file.
+ * tests/test-errno.c: New file, incorporating tests/test-EOVERFLOW.c.
+
+ * lib/errno.in.h: New file.
+ * m4/errno_h.m4: New file, borrowing from m4/eoverflow.m4.
+ * modules/errno: New file.
+ * doc/posix-headers/errno.texi: Update documentation.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add errno.
+
+2008-09-13 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-poll.c: Use #if for native Windows, rather than testing
+ __MSVCRT__.
+
+2008-09-13 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/glob.c: Don't include <pwd.h> on native Windows.
+ (WINDOWS32): New macro.
+ (glob) [WINDOW32]: Provide a reasonable replacement for getenv("HOME").
+
+2008-09-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/cond.h [USE_SOLARIS_THREADS]
+ (ETIMEDOUT): Remove macro.
+ (glthread_cond_timedwait_multithreaded): New declaration.
+ (glthread_cond_timedwait): Use it.
+ * lib/glthread/cond.c [USE_SOLARIS_THREADS]
+ (glthread_cond_timedwait_multithreaded): New function.
+
+2008-09-12 Paolo Bonzini <bonzini@gnu.org>
+
+ * modules/poll-tests: Do not check for io.h.
+ * tests/test-poll.c: Check for __MSVCRT__ instead.
+
+2008-09-12 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/sys_socket.in.h (EINPROGRESS): Define for Winsock case.
+ * modules/poll-tests: Add inet_pton, stdbool, sockets.
+ * tests/test-poll.c: Use them. Use _pipe on Windows.
+
+2008-09-12 Paolo Bonzini <bonzini@gnu.org>
+
+ * modules/poll-tests: New.
+ * tests/test-poll.c: New.
+
+2008-09-12 Eric Blake <ebb9@byu.net>
+
+ frexp: test for NetBSD failure on -0.0
+ * m4/frexp.m4 (gl_FUNC_FREXP_WORKS): Enhance test, since some, but
+ not all, bugs from NetBSD 3.0 have been fixed.
+ * doc/posix-functions/frexp.texi (frexp): Document bug.
+ Reported by Thomas Klausner.
+
+ signbit: work around bug of HP-UX 10.20 cc with -0.0 literal
+ * m4/signbit.m4 (gl_SIGNBIT_TEST_PROGRAM): Rewrite test to avoid
+ literal -0.0.
+ Reported by Jonathan C. Patschke <jp@centtech.com>.
+
+2008-09-11 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * lib/glthread/cond.h: Use dummy implementation also if
+ USE_WIN32_THREADS.
+
+2008-09-11 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * modules/fnmatch-posix (License): Change to LGPLv2+.
+ * modules/fnmatch-gnu (License): Likewise.
+
+2008-09-11 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * lib/poll.c (poll): Fix polling unconnected server sockets on WIN32.
+
+2008-09-11 Jim Meyering <meyering@redhat.com>
+
+ * users.txt: Add gtk-vnc.
+
+2008-09-08 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-bitrotate.c: Test 8/16-bit rotates with 0 and maximum
+ rotate amounts.
+
+ * lib/bitrotate.h: Doc fix, mention that N can be wider than minimally
+ required for 16-bit and 8-bit rotates.
+ * lib/bitrotate.h (rotl64, rotr64, rotl32, rotl32, rotl16, rotr16,
+ rotl8, rotr8): Use UINT64_MAX, UINT32_MAX, UINT16_MAX, and
+ UINT8_MAX instead of hard-coded constants.
+ Suggested by Paul Eggert.
+
+2008-09-07 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-striconveh.c (main): Check behaviour when converting from
+ UTF-7.
+
+ Make striconveh work better with stateful encodings.
+ * lib/striconveh.c (iconv_carefully, iconv_carefully_1): Don't assume
+ that iconv does not increment the inptr when returning -1/EINVAL.
+
+2008-09-07 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/config.rpath: Update according to libtool-2.2.6.
+ * build-aux/config.libpath: Likewise.
+
+2008-09-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/freadahead.c (freadahead): Add conditional for SLOW_BUT_NO_HACKS.
+ * lib/freadptr.c (freadptr): Likewise.
+ * lib/freadseek.c (freadptrinc): Likewise.
+ Reported by Simon Josefsson.
+
+2008-09-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/freadptr (License): Change to LGPLv2+.
+ * modules/freadseek (License): Likewise.
+ Suggested by Eric Blake.
+
+ * modules/memchr2 (License): Change to LGPLv2+.
+ Approved by Eric Blake.
+
+2008-09-04 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ Make gnulib-tool work with native 'sed' on AIX.
+ * gnulib-tool (sed_noop): New variable.
+ (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am, func_import,
+ func_add_or_update, func_create_testdir): Use it to initialize sed
+ script variables.
+ Reported by Albert Chin <bug-gnulib@mlists.thewrittenword.com>.
+
+2008-09-04 Albert Chin <bug-gnulib@mlists.thewrittenword.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/include_next.m4 (gl_INCLUDE_NEXT): Add check whether #include_next
+ also works after #include directives.
+
+2008-09-04 Ondřej Vašík <ovasik@redhat.com>
+
+ getdate.y: reject an out-of-range timezone value
+ * lib/getdate.y (time_zone_hhmm): Reject any TZ offset that is outside
+ the range [-24...+24]. When specified with only one or two digits,
+ * tests/test-getdate.c: Tests for the fix.
+ * doc/getdate.texi: Document this change.
+
+2008-09-03 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/strverscmp.texi: Mention the strverscmp module.
+
+2008-09-02 Simon Josefsson <simon@josefsson.org>
+
+ * lib/bitrotate.h (rotl64, rotr64): Add. Suggested by Bruce Korb
+ <bruce.korb@gmail.com> with ideas from Ben Pfaff
+ <blp@cs.stanford.edu>, Bruno Haible <bruno@clisp.org> and Eric
+ Blake <ebb9@byu.net>.
+
+ * tests/test-bitrotate.c: Add more test vectors.
+
+2008-09-02 Eric Blake <ebb9@byu.net>
+
+ vasnprintf-posix: handle large precision via %.*d
+ * lib/vasnprintf.c (VASNPRINTF): Don't pass precision to snprintf
+ when handling it ourselves.
+ * tests/test-vasnprintf-posix.c (test_function): Add test.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ Reported by Alain Guibert.
+
+2008-09-01 Eric Blake <ebb9@byu.net>
+
+ c-stack: make configure-time check more robust
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Check for
+ successful sigaction call.
+ Reported by Tom G. Christensen.
+
+2008-09-01 Bruno Haible <bruno@clisp.org>
+
+ New module 'findprog-lgpl'.
+ * modules/findprog-lgpl: New file.
+ * lib/findprog-lgpl.c: New file.
+ * lib/findprog.c: Compile nothing in findprog.c if findprog-lgpl.c is
+ also compiled. Consider the possibly defined symbol IN_FINDPROG_LGPL
+ to decide whether to use strdup or xstrdup, concatenated_filename or
+ xconcatenated_filename.
+
+2008-09-01 Bruno Haible <bruno@clisp.org>
+
+ Split module 'concat-filename' into 'concat-filename' (LGPL) and
+ 'xconcat-filename' (GPL).
+ * modules/concat-filename (Depends-on): Add malloc-posix, remove xalloc.
+ (License): Change to LGPLv2+.
+ * modules/xconcat-filename: New file.
+ * lib/concat-filename.h (concatenated_filename): Change specification.
+ (xconcatenated_filename): New declaration.
+ * lib/concat-filename.c: Include errno.h, stdlib.h, not xalloc.h.
+ (concatenated_filename): Use malloc instead of xalloc. Handle out-of-
+ memory situations.
+ * lib/xconcat-filename.c: New file.
+ * NEWS: Mention the change.
+ * lib/findprog.c: Include concat-filename.h, not filename.h.
+ (find_in_path): Use xconcatenated_filename instead of
+ concatenated_filename.
+ * lib/javacomp.c: Include concat-filename.h, not filename.h.
+ (is_envjavac_gcj43_usable, is_envjavac_oldgcj_14_14_usable,
+ is_envjavac_oldgcj_14_13_usable, is_envjavac_nongcj_usable,
+ is_gcj_present, is_gcj43_usable, is_oldgcj_14_14_usable,
+ is_oldgcj_14_13_usable, is_javac_usable): Use xconcatenated_filename
+ instead of concatenated_filename.
+ * lib/javaexec.c: Include concat-filename.h, not filename.h.
+ (execute_java_class): Use xconcatenated_filename instead of
+ concatenated_filename.
+ * modules/findprog (Depends-on): Add xconcat-filename, remove filename.
+ * modules/javacomp (Depends-on): Likewise.
+ * modules/javaexec (Depends-on): Likewise.
+
+2008-09-01 Bruno Haible <bruno@clisp.org>
+
+ Split module 'filename' into 'filename' and 'concat-filename'.
+ * modules/filename: Keep only lib/filename.h.
+ (License): Change to LGPLv2+.
+ * modules/concat-filename: New file, extracted from modules/filename.
+ * lib/filename.h (concatenated_filename): Remove declaration.
+ * lib/concat-filename.h: New file, extracted from lib/filename.h.
+ * lib/concat-filename.c: Include concat-filename.h.
+ * NEWS: Mention the change.
+
+2008-09-01 Simon Josefsson <simon@josefsson.org>
+
+ * lib/bitrotate.h (rotl8, rotr8): Add.
+
+ * modules/bitrotate (configure.ac): Need
+ AC_REQUIRE([AC_C_INLINE]).
+ (Description): Mention stdint.h. Reported by Bruno Haible
+ <bruno@clisp.org>.
+
+ * lib/bitrotate.h (rotr16, rotl16): Fix mask value. Reported by
+ Paolo Bonzini <bonzini@gnu.org>.
+
+2008-08-31 Bruno Haible <bruno@clisp.org>
+
+ Assume Solaris specific bi-arch conventions on Solaris systems.
+ * m4/lib-prefix.m4 (AC_LIB_PREPARE_MULTILIB): On Solaris in 64-bit
+ mode, set acl_libdirstem to lib/64. Also set acl_libdirstem2.
+ * m4/lib-link.m4 (AC_LIB_LINKFLAGS_BODY): If acl_libdirstem does not
+ work, try acl_libdirstem2 as fallback. Otherwise treat acl_libdirstem2
+ like acl_libdirstem.
+ (AC_LIB_LINKFLAGS_FROM_LIBS): Treat acl_libdirstem2 like
+ acl_libdirstem.
+ * NEWS: Mention the change.
+ Reported by Ben Taylor <bentaylor.solx86@gmail.com>.
+
+2008-08-31 Jim Meyering <meyering@redhat.com>
+
+ * lib/strftime.h: Add comments describing the two added arguments.
+
+ remove duplicate #include directives
+ * lib/chdir-long.c [TEST_CHDIR]: Remove duplicate #include <stdio.h>.
+ * lib/putenv.c: Remove duplicate #include <stdlib.h>.
+
+2008-08-31 Bruno Haible <bruno@clisp.org>
+
+ New module 'sigpipe-die'.
+ * modules/sigpipe-die: New file.
+ * lib/sigpipe-die.h: New file.
+ * lib/sigpipe-die.c: New file.
+ * MODULES.html.sh (Signal handling): Add sigpipe-die.
+
+2008-08-31 Bruno Haible <bruno@clisp.org>
+
+ Don't override previously installed signal handlers.
+ * lib/fatal-signal.c (saved_sigactions): New variable.
+ (uninstall_handlers): Reset the signal to the saved handler, not
+ to SIG_DFL (except when ignored).
+ (install_handlers): Save the previous handlers.
+
+2008-08-30 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_reset_sigpipe): New function.
+ (func_get_automake_snippet, func_modules_transitive_closure,
+ func_import): Invoke it before a join command that reads from stdin,
+ to avoid "echo: write error: Broken pipe" error messages on stderr.
+ Reported by Sam Steingold <sds@gnu.org>.
+
+2008-08-30 Bruno Haible <bruno@clisp.org>
+
+ * m4/fopen.m4 (gl_FUNC_FOPEN): Test against bug with trailing slash.
+ Code copied from m4/open.m4.
+ * lib/fopen.c (rpl_fopen): Return NULL if the mode specifies write
+ access and the filename ends in a slash. Code copied from lib/open.c.
+ * doc/posix-functions/fopen.texi: Document bug with trailing slash.
+ * tests/test-fopen.c (main): Check against bug with trailing slash.
+
+2008-08-29 Bruno Haible <bruno@clisp.org>
+
+ Avoid some "gcc -pedantic" warnings.
+ * m4/include_next.m4 (gl_INCLUDE_NEXT): Set also PRAGMA_SYSTEM_HEADER.
+ * lib/arpa_inet.in.h: Use PRAGMA_SYSTEM_HEADER.
+ * lib/dirent.in.h: Likewise.
+ * lib/fcntl.in.h: Likewise.
+ * lib/float.in.h: Likewise.
+ * lib/iconv.in.h: Likewise.
+ * lib/inttypes.in.h: Likewise.
+ * lib/locale.in.h: Likewise.
+ * lib/math.in.h: Likewise.
+ * lib/netinet_in.in.h: Likewise.
+ * lib/search.in.h: Likewise.
+ * lib/signal.in.h: Likewise.
+ * lib/stdarg.in.h: Likewise.
+ * lib/stdint.in.h: Likewise.
+ * lib/stdio.in.h: Likewise.
+ * lib/stdlib.in.h: Likewise.
+ * lib/string.in.h: Likewise.
+ * lib/strings.in.h: Likewise.
+ * lib/sys_select.in.h: Likewise.
+ * lib/sys_socket.in.h: Likewise.
+ * lib/sys_stat.in.h: Likewise.
+ * lib/sys_time.in.h: Likewise.
+ * lib/sysexits.in.h: Likewise.
+ * lib/time.in.h: Likewise.
+ * lib/unistd.in.h: Likewise.
+ * lib/wchar.in.h: Likewise.
+ * lib/wctype.in.h: Likewise.
+ * modules/arpa_inet (Makefile.am): Also substitute PRAGMA_SYSTEM_HEADER.
+ * modules/fchdir (Makefile.am): Likewise.
+ * modules/fcntl (Makefile.am): Likewise.
+ * modules/float (Makefile.am): Likewise.
+ * modules/iconv_open (Makefile.am): Likewise.
+ * modules/inttypes (Makefile.am): Likewise.
+ * modules/locale (Makefile.am): Likewise.
+ * modules/math (Makefile.am): Likewise.
+ * modules/netinet_in (Makefile.am): Likewise.
+ * modules/search (Makefile.am): Likewise.
+ * modules/signal (Makefile.am): Likewise.
+ * modules/stdarg (Makefile.am): Likewise.
+ * modules/stdint (Makefile.am): Likewise.
+ * modules/stdio (Makefile.am): Likewise.
+ * modules/stdlib (Makefile.am): Likewise.
+ * modules/string (Makefile.am): Likewise.
+ * modules/strings (Makefile.am): Likewise.
+ * modules/sys_select (Makefile.am): Likewise.
+ * modules/sys_socket (Makefile.am): Likewise.
+ * modules/sys_stat (Makefile.am): Likewise.
+ * modules/sys_time (Makefile.am): Likewise.
+ * modules/sysexits (Makefile.am): Likewise.
+ * modules/time (Makefile.am): Likewise.
+ * modules/unistd (Makefile.am): Likewise.
+ * modules/wchar (Makefile.am): Likewise.
+ * modules/wctype (Makefile.am): Likewise.
+ Reported by Reuben Thomas <rrt@sc3d.org>.
+
+2008-08-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/include_next.m4 (gl_INCLUDE_NEXT): Don't define HAVE_INCLUDE_NEXT
+ any more.
+
+2008-08-29 Simon Josefsson <simon@josefsson.org>
+
+ * MODULES.html.sh (Misc): Add bitrotate.
+
+ * modules/bitrotate: New file.
+
+ * lib/bitrotate.h: New file.
+
+ * modules/bitrotate-tests: New file.
+
+ * tests/test-bitrotate.c: New file.
+
+ * modules/crypto/gc-arctwo, modules/crypto/arctwo: Add dependency
+ on the bitrotate module.
+
+ * lib/arctwo.c: Use new bitrotate module.
+
+2008-08-29 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: merge changes from coreutils
+ * build-aux/bootstrap (cp_mark_as_generated): Preserve perms
+ of copied files. Remove a kludge, now that this is fixed.
+ * build-aux/bootstrap: Fix unportable expr usage. (by Ralf Wildenhues)
+ * build-aux/bootstrap: Remove $bt and $bt2 also when not using gettext.
+ * build-aux/bootstrap: Remove coreutils-specific SUBDIRS-related code.
+
+2008-08-29 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh: Remove --cvs-urls option.
+
+2008-08-28 Jose E. Marchesi <jemarch@gnu.org> (tiny change)
+
+ maint.mk: adjust to file name change
+ * top/maint.mk: s/Makefile.cfg/cfg.mk/.
+
+2008-08-28 Jim Meyering <meyering@redhat.com>
+
+ * modules/getndelim2 (License): Relicense to LGPLv2+.
+ Approved by Richard Stallman for the version of 1995, and by
+ Paul Eggert, Bruno Haible, Eric Blake for their contributions.
+
+2008-08-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/getdelim.c (flockfile, funlockfile): Make all of them
+ dummy if one is not available. Do not touch them if
+ USE_UNLOCKED_IO, instead letting unlocked-io.h do that.
+ (getc_maybe_unlocked): New.
+ * m4/getdelim.m4 (gl_PREREQ_GETDELIM): Check for getc_unlocked.
+
+2008-08-26 Eric Blake <ebb9@byu.net>
+
+ doc/INSTALL: resync from autoconf
+ * doc/Makefile (INSTALL, INSTALL.ISO, INSTALL.UTF-8): Simplify.
+ (INSTALL_PRELUDE): Delete; this is done more efficiently by
+ moving...
+ * install.texi [!autoconf]: ...here. Resync from autoconf.
+ * INSTALL: Regenerate.
+ * INSTALL.ISO: New file.
+ * INSTALL.UTF-8: Likewise.
+
+2008-08-26 Jim Meyering <meyering@redhat.com>
+
+ GNUmakefile: cfg.mk definitions override default autoreconf-rerun policy
+ * top/GNUmakefile (_is-dist-target, _is-install-target): Make
+ these definitions conditional, so that they may be overridden, too.
+
+2008-08-26 Bruno Haible <bruno@clisp.org>
+
+ Generate INSTALL file variants with prettier quotes.
+ * doc/Makefile (INSTALL_PRELUDE): New macro.
+ (INSTALL): Use it.
+ (INSTALL.ISO, INSTALL.UTF-8): New rules.
+
+2008-08-26 Bruno Haible <bruno@clisp.org>
+
+ Run makeinfo in an English locale.
+ * doc/Makefile (MAKEINFO): New variable.
+
+2008-08-26 Bruno Haible <bruno@clisp.org>
+
+ * doc/Makefile (INSTALL): Use --no-validate instead of --no-warn.
+ Suggested by Eric Blake.
+
+2008-08-25 Bruno Haible <bruno@clisp.org>
+
+ * doc/Makefile (INSTALL): Generate with @firstparagraphindent set.
+
+2008-08-25 Eric Blake <ebb9@byu.net>
+
+ c-stack: test that stack overflow can be caught
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Also check
+ that platform allows handling stack overflow; at least OS/2 EMX
+ has sigaltstack, but crashes before transferring control to
+ handler on stack overflow.
+ * lib/c-stack.c [HAVE_SIGALTSTACK]: Adjust conditions to also
+ check for HAVE_STACK_OVERFLOW_HANDLING.
+ Reported by Elbert Pol.
+
+2008-08-25 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/strftime.texi: Fix description of strftime
+ module.
+
+2008-08-24 Bruno Haible <bruno@clisp.org>
+
+ * tests/uniwidth/test-uc_width2.c: New file.
+ * tests/uniwidth/test-uc_width2.sh: New file.
+ * modules/uniwidth/width-tests (Files): Add the new files.
+ (TESTS): Add uniwidth/test-uc_width2.sh.
+ (TESTS_ENVIRONMENT): New variable.
+ (check_PROGRAMS): Add test-uc_width2.
+ (test_uc_width2_SOURCES): New variable.
+
+ Fix uc_width(0x00AB) bug, introduced on 2007-07-08.
+ * lib/uniwidth/width.c (nonspacing_table_data): Set bit for 0x00AD,
+ not 0x00AB.
+ Reported by Alexander V. Lukyanov <lav@netis.ru>.
+
+2008-08-22 Eric Blake <ebb9@byu.net>
+
+ test-lock, test-tls: mention why a test is skipped
+ * tests/test-lock.c (main) [!USE_*_THREADS]: Print why test is
+ skipped.
+ * tests/test-tls.c (main) [!USE_*_THREADS]: Likewise.
+
+ count-one-bits: relax license
+ * modules/count-one-bits (License): Relicense to LGPLv2+.
+ Suggested by Ludovic Courtès, approved by Ben Pfaff.
+
+2008-08-22 Andreas Schwab <schwab@suse.de>
+
+ * m4/obstack-printf-posix.m4 (gl_FUNC_OBSTACK_PRINTF_POSIX):
+ Remove spurious space in assignment.
+
+2008-08-21 Simon Josefsson <simon@josefsson.org>
+
+ * m4/autobuild.m4: Use TZ=UTC0 instead of TZ=UTC. Reported by
+ Paul Eggert <eggert@CS.UCLA.EDU>.
+
+2008-08-20 Paolo Bonzini <bonzini@gnu.org>
+
+ * modules/gettext: Add m4/threadlib.m4.
+
+2008-08-19 Eric Blake <ebb9@byu.net>
+
+ test-c-stack: fix compilation failure on FreeBSD 5.0
+ * tests/test-c-stack.c [HAVE_SETRLIMIT]: Include prerequisite
+ headers before <sys/resource.h>.
+ * doc/posix-headers/sys_resource.texi (sys/resource.h): Document
+ the bug.
+ Reported by Nelson H. F. Beebe.
+
+ strverscmp: migrate from "strverscmp.h" to <string.h>
+ * modules/string (Makefile.am): Add new hooks.
+ * modules/strverscmp (Files): Remove strverscmp.h.
+ (Depends-on): Add string.
+ (configure.ac): Add indicator.
+ (Include): Mention new header.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Provide new
+ defaults.
+ * m4/strverscmp.m4 (gl_FUNC_STRVERSCMP): Inform string module of
+ results.
+ * lib/strverscmp.h: Delete.
+ * lib/string.in.h (strverscmp): Provide declaration, when needed.
+ * tests/test-strverscmp.c (includes): Adjust client.
+ * lib/check-version.c (includes): Likewise.
+ * NEWS: Document the change.
+
+ strverscmp: add unit test
+ * modules/strverscmp-tests: New file.
+ * tests/test-strverscmp.c: Likewise.
+
+2008-08-19 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc-gnulib.c: Indentation cleanup. Add some comments
+ regarding Windows crypto stuff, from Mono.
+
+2008-08-19 Adam Strzelecki <ono@java.pl> (tiny change)
+
+ * lib/gc-gnulib.c: Use CRYPT_VERIFY_CONTEXT. Try to use Intel CSP
+ if present, for intel RND. Return error on failures.
+
+2008-08-18 Ben Pfaff <blp@gnu.org>
+
+ gitlog-to-changelog: give better diagnostic for failed pipe-open
+ * build-aux/gitlog-to-changelog: Improve error message: suggest
+ that the version of Git may be too old.
+
+2008-08-18 Simon Josefsson <simon@josefsson.org>
+
+ * m4/autobuild.m4: Use TZ=UTC to avoid time zone complexity. Use
+ ISO 8601 format. Suggested by Greg Troxel <gdt@ir.bbn.com>.
+
+2008-08-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/thread.h [USE_SOLARIS_THREADS]: Use thread_in_use(), not
+ pthread_in_use().
+
+2008-08-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/threadlib.c: Include <pthread.h>.
+
+2008-08-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/lock.h [USE_SOLARIS_THREADS]: Fix
+ glthread_recursive_lock_* macros.
+ * lib/glthread/lock.c (glthread_recursive_lock_destroy_multithreaded):
+ Fix syntax error.
+
+2008-08-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/thread.c: Avoid forcing a context switch right after
+ thread creation.
+
+2008-08-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/thread.c: New file, based on code from tests/test-lock.c.
+ * lib/glthread/thread.h: Provide Win32 specific implementation.
+ * modules/thread (Files): Add lib/glthread/thread.c.
+ (Depends-on): Add lock.
+ (Makefile.am): Add glthread/thread.c to lib_SOURCES.
+
+2008-08-17 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ New module 'yield'.
+ * modules/yield: New file.
+ * lib/glthread/yield.h: New file.
+ * m4/yield.m4: New file.
+ * MODULES.html.sh (Multithreading): Add yield.
+
+2008-08-17 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ New module 'thread'.
+ * modules/thread: New file.
+ * lib/glthread/thread.h: New file.
+ * m4/thread.m4: New file.
+ * MODULES.html.sh (Multithreading): Add thread.
+
+2008-08-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/lock.h: Include <stdlib.h> always.
+ * lib/glthread/tls.h: Likewise.
+ * lib/glthread/cond.h: Likewise.
+
+2008-08-17 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ New module 'cond'.
+ * modules/cond: New file.
+ * lib/glthread/cond.h: New file.
+ * lib/glthread/cond.c: New file.
+ * m4/cond.m4: New file.
+ * MODULES.html.sh (Multithreading): Add cond.
+
+2008-08-16 Eric Blake <ebb9@byu.net>
+
+ c-stack: fix regression on Irix 5.3 from 2008-06-21
+ * m4/c-stack.m4 (gl_PREREQ_C_STACK): Move check for
+ sa_sigaction...
+ * m4/sigaction.m4 (gl_PREREQ_SIG_HANDLER_H): ...here.
+ (gl_PREREQ_SIGACTION): Depend on sig-handler.h prereq's.
+ * m4/signal_h.m4 (gl_SIGNAL_H_DEFAULTS): Set the default.
+ * modules/signal (Makefile.am): Use the value.
+ * lib/signal.in.h (sa_sigaction) [HAVE_SIGACTION
+ && !HAVE_STRUCT_SIGACTION_SA_SIGACTION]: Define.
+ * doc/posix-headers/signal.texi (signal.h): Document this
+ portability issue.
+ * doc/posix-functions/sigaction.texi (sigaction): Likewise.
+ Reported by Tom G. Christensen.
+
+2008-08-17 Bruno Haible <bruno@clisp.org>
+
+ New module 'threadlib'.
+ * modules/threadlib: New file.
+ * lib/glthread/threadlib.c: New file, extracted from
+ lib/glthread/lock.c.
+ * lib/glthread/lock.c (dummy_thread_func, glthread_in_use): Remove
+ functions.
+ * m4/threadlib.m4: New file, from m4/lock.m4, renaming gl_LOCK to
+ gl_THREADLIB and gl_LOCK_EARLY to gl_THREADLIB_EARLY.
+ * m4/lock.m4 (gl_LOCK_EARLY, gl_LOCK_EARLY_BODY, gl_LOCK_BODY): Remove
+ macros.
+ (gl_LOCK): Just require gl_THREADLIB and perform checks for lock.h.
+ (gl_DISABLE_THREADS): Remove macro.
+ * modules/lock (Files): Remove build-aux/config.rpath.
+ (Depends-on): Remove havelib. Add threadlib.
+ (configure.ac-early): Remove section.
+ * m4/tls.m4 (gl_TLS): Require gl_THREADLIB instead of gl_LOCK.
+ * modules/tls (Depends-on): Remove lock. Add threadlib.
+ (Link): New section, copied from threadlib.
+ * MODULES.html.sh (Multithreading): Add threadlib.
+
+2008-08-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/lock.h (glthread_lock_lock, glthread_lock_unlock,
+ glthread_lock_destroy, glthread_rwlock_rdlock, glthread_rwlock_wrlock,
+ glthread_rwlock_unlock, glthread_rwlock_destroy,
+ glthread_recursive_lock_lock, glthread_recursive_lock_unlock,
+ glthread_recursive_lock_destroy): Define as macros always.
+ * lib/glthread/lock.c (glthread_lock_lock_func): Renamed from
+ glthread_lock_lock.
+ (glthread_lock_unlock_func): Renamed from glthread_lock_unlock.
+ (glthread_lock_destroy_func): Renamed from glthread_lock_destroy.
+ (glthread_rwlock_rdlock_func): Renamed from glthread_rwlock_rdlock.
+ (glthread_rwlock_wrlock_func): Renamed from glthread_rwlock_wrlock.
+ (glthread_rwlock_unlock_func): Renamed from glthread_rwlock_unlock.
+ (glthread_rwlock_destroy_func): Renamed from glthread_rwlock_destroy.
+ (glthread_recursive_lock_lock_func): Renamed from
+ glthread_recursive_lock_lock.
+ (glthread_recursive_lock_unlock_func): Renamed from
+ glthread_recursive_lock_unlock.
+ (glthread_recursive_lock_destroy_func): Renamed from
+ glthread_recursive_lock_destroy.
+
+2008-08-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/glthread/lock.h: Renamed from lib/lock.h.
+ * lib/glthread/lock.c: Renamed from lib/lock.c. Update includes.
+ * lib/glthread/tls.h: Renamed from lib/tls.h.
+ * lib/glthread/tls.c: Renamed from lib/tls.c. Update includes.
+ * lib/fstrcmp.c: Update includes.
+ * lib/strsignal.c: Update includes.
+ * modules/lock (Files, Makefile.am): Update.
+ (Include): Change to "glthread/lock.h".
+ * modules/tls (Files, Makefile.am): Update.
+ (Include): Change to "glthread/tls.h".
+ * tests/test-lock.c: Update includes.
+ * tests/test-tls.c: Update includes.
+ * NEWS: Mention the renamed header files.
+
+2008-08-11 Jim Meyering <meyering@redhat.com>
+
+ * lib/fts_.h: Fix grammar (insert a missing "is") in a comment.
+
+2008-08-11 Eric Blake <ebb9@byu.net>
+
+ test-c-stack: avoid C99-ism
+ * tests/test-c-stack.c (main): Fix whitespace, move declaration
+ before statement.
+ Reported by Alain Guibert.
+
+2008-08-10 Jim Meyering <meyering@redhat.com>
+
+ ensure that return value of uinttostr et al are not ignored
+ * lib/inttostr.h (__GNUC_PREREQ): Define.
+ (__attribute_warn_unused_result__): Define.
+ (offtostr, imaxtostr, umaxtostr, uinttostr): Apply the attribute.
+
+2008-08-07 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/lock.c (glthread_recursive_lock_init_multithreaded)
+ [!PTHREAD_RECURSIVE_MUTEX_INITIALIZER]: Fix typo.
+
+2008-08-07 Jim Meyering <meyering@redhat.com>
+
+ * m4/inet_pton.m4: Fix typo in comment: s/inet_ntop/inet_pton/.
+
+ * modules/mkstemp (License): Relicense under LGPLv2+.
+ * modules/tempname (License): Likewise.
+
+2008-08-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/poll.c (poll): Further micro-optimization.
+
+2008-08-06 Jim Meyering <meyering@redhat.com>
+
+ inet_pton.c: use locale-independent tolower
+ * lib/inet_pton.c: Include <c-ctype.h> rather than <ctype.h>.
+ (inet_pton6): Use c_tolower rather than tolower.
+ * modules/inet_pton (Depends-on): Add c-ctype.
+
+2008-08-06 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/poll.c (poll): Avoid division when timeout is 0, cache
+ _SC_OPEN_MAX, avoid repeated access to errno. Check for nfd < 0.
+
+2008-08-06 Jim Meyering <meyering@redhat.com>
+
+ * modules/inet_pton (License): Relicense under LGPLv2+.
+
+2008-08-03 Bruno Haible <bruno@clisp.org>
+
+ Additional non-aborting API for lock and tls.
+ * lib/lock.h: Include <errno.h>.
+ (glthread_lock_init): New macro/function.
+ (gl_lock_init): Define as wrapper around glthread_lock_init.
+ (glthread_lock_lock): New macro/function.
+ (gl_lock_lock): Define as wrapper around glthread_lock_lock.
+ (glthread_lock_unlock): New macro/function.
+ (gl_lock_unlock): Define as wrapper around glthread_lock_unlock.
+ (glthread_lock_destroy): New macro/function.
+ (gl_lock_destroy): Define as wrapper around glthread_lock_destroy.
+ (glthread_rwlock_init): New macro/function.
+ (gl_rwlock_init): Define as wrapper around glthread_rwlock_init.
+ (glthread_rwlock_rdlock): New macro/function.
+ (gl_rwlock_rdlock): Define as wrapper around glthread_rwlock_rdlock.
+ (glthread_rwlock_wrlock): New macro/function.
+ (gl_rwlock_wrlock): Define as wrapper around glthread_rwlock_wrlock.
+ (glthread_rwlock_unlock): New macro/function.
+ (gl_rwlock_unlock): Define as wrapper around glthread_rwlock_unlock.
+ (glthread_rwlock_destroy): New macro/function.
+ (gl_rwlock_destroy): Define as wrapper around glthread_rwlock_destroy.
+ (glthread_recursive_lock_init): New macro/function.
+ (gl_recursive_lock_init): Define as wrapper around
+ glthread_recursive_lock_init.
+ (glthread_recursive_lock_lock): New macro/function.
+ (gl_recursive_lock_lock): Define as wrapper around
+ glthread_recursive_lock_lock.
+ (glthread_recursive_lock_unlock): New macro/function.
+ (gl_recursive_lock_unlock): Define as wrapper around
+ glthread_recursive_lock_unlock.
+ (glthread_recursive_lock_destroy): New macro/function.
+ (gl_recursive_lock_destroy): Define as wrapper around
+ glthread_recursive_lock_destroy.
+ (glthread_once): New macro/function.
+ (gl_once): Define as wrapper around glthread_once.
+ Update function declarations.
+ * lib/lock.c (glthread_rwlock_init_multithreaded): Renamed from
+ glthread_rwlock_init. Return error code.
+ (glthread_rwlock_rdlock_multithreaded): Renamed from
+ glthread_rwlock_rdlock. Return error code.
+ (glthread_rwlock_wrlock_multithreaded): Renamed from
+ glthread_rwlock_wrlock. Return error code.
+ (glthread_rwlock_unlock_multithreaded): Renamed from
+ glthread_rwlock_unlock. Return error code.
+ (glthread_rwlock_destroy_multithreaded): Renamed from
+ glthread_rwlock_destroy. Return error code.
+ (glthread_recursive_lock_init_multithreaded): Renamed from
+ glthread_recursive_lock_init. Return error code.
+ (glthread_recursive_lock_lock_multithreaded): Renamed from
+ glthread_recursive_lock_lock. Return error code.
+ (glthread_recursive_lock_unlock_multithreaded): Renamed from
+ glthread_recursive_lock_unlock. Return error code.
+ (glthread_recursive_lock_destroy_multithreaded): Renamed from
+ glthread_recursive_lock_destroy. Return error code.
+ (glthread_once_call): Make static.
+ (glthread_once_multithreaded): Renamed from glthread_once.
+ * lib/tls.h: Include <errno.h>.
+ (glthread_tls_key_init): New macro/function.
+ (gl_tls_key_init): Define as wrapper around glthread_tls_key_init.
+ (glthread_tls_set): New macro/function.
+ (gl_tls_set): Define as wrapper around glthread_tls_set.
+ (glthread_tls_key_destroy): New macro/function.
+ (gl_tls_key_destroy): Define as wrapper around glthread_tls_key_destroy.
+ Update function declarations.
+ * lib/tls.c (glthread_tls_get_multithreaded): Renamed from
+ glthread_tls_get.
+ Suggested by Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+2008-08-04 Eric Blake <ebb9@byu.net>
+
+ gnumakefile: use space, not TAB, outside of targets
+ * top/GNUmakefile (_dummy): Fix whitespace error in prior edit.
+
+2008-08-02 Jim Meyering <meyering@redhat.com>
+
+ getdate.y: avoid locale-dependent date parsing failure
+ In Turkish locales, getdate would fail to recognize keywords
+ containing a lowercase "i". The solution is not to rely on
+ locale-sensitive case-conversion.
+ * lib/getdate.y: Include <c-ctype.h> rather than <ctype.h>.
+ (lookup_word): Use c_toupper in place of toupper.
+ (yylex, get_date): Use c_ prefixed variants of isspace and isalpha, too.
+ Reported by Vefa Bicakci <bicave@superonline.com> in
+ <http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/14184>.
+ * modules/getdate (Depends-on): Add c-ctype.
+
+2008-08-02 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): When updating or creating a .gitignore
+ file, prepend each added line with a slash, and ignore leading slashes
+ from the existing lines.
+ Reported by Joel E. Denny <jdenny@ces.clemson.edu>.
+
+2008-08-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Portability fix for GNU make 3.79.1.
+ * top/GNUmakefile: Avoid 'else COND', which older GNU make
+ versions do not understand.
+
+2008-08-01 Bruno Haible <bruno@clisp.org>
+
+ Work around bug of HP-UX 10.20 cc with -0.0 literal.
+ * tests/test-isnanf.h (zero): New variable.
+ (main): Avoid literal -0.0f.
+ * tests/test-isnand.h (zero): New variable.
+ (main): Avoid literal -0.0.
+ * tests/test-isnanl.h (zero): New variable.
+ (main): Avoid literal -0.0L.
+ * tests/test-isnan.c (zerof, zerod, zerol): New variables.
+ (test_float, test_double, test_long_double): Avoid literals -0.0f,
+ -0.0, -0.0L.
+ * tests/test-signbit.c (test_signbitf): Avoid literal -0.0f.
+ (test_signbitd): Avoid literal -0.0.
+ (test_signbitl): Avoid literal -0.0L.
+ * tests/test-ceilf1.c (zero): New variable.
+ (main): Avoid literal -0.0f.
+ * tests/test-ceill.c (zero): New variable.
+ (main): Avoid literal -0.0L.
+ * tests/test-floorf1.c (zero): New variable.
+ (main): Avoid literal -0.0f.
+ * tests/test-floorl.c (zero): New variable.
+ (main): Avoid literal -0.0L.
+ * tests/test-roundf1.c (zero): New variable.
+ (main): Avoid literal -0.0f.
+ * tests/test-round1.c (zero): New variable.
+ (main): Avoid literal -0.0.
+ * tests/test-roundl.c (zero): New variable.
+ (main): Avoid literal -0.0L.
+ * tests/test-truncf1.c (zero): New variable.
+ (main): Avoid literal -0.0f.
+ * tests/test-trunc1.c (zero): New variable.
+ (main): Avoid literal -0.0.
+ * tests/test-truncl.c (zero): New variable.
+ (main): Avoid literal -0.0L.
+ * tests/test-frexp.c (zero): New variable.
+ (main): Avoid literal -0.0.
+ * tests/test-frexpl.c (zero): New variable.
+ (main): Avoid literal -0.0L.
+ * tests/test-ldexpl.c (zero): New variable.
+ (main): Avoid literal -0.0L.
+ * tests/test-snprintf-posix.h (have_minus_zero): Avoid literal -0.0.
+ (zerod, zerol): New variables.
+ (test_function): Avoid literals -0.0, -0.0L.
+ * tests/test-sprintf-posix.h (have_minus_zero): Avoid literal -0.0.
+ (zerod, zerol): New variables.
+ (test_function): Avoid literals -0.0, -0.0L.
+ * tests/test-vasnprintf-posix.c (have_minus_zero): Avoid literal -0.0.
+ (zerod, zerol): New variables.
+ (test_function): Avoid literals -0.0, -0.0L.
+ * tests/test-vasprintf-posix.c (have_minus_zero): Avoid literal -0.0.
+ (zerod, zerol): New variables.
+ (test_function): Avoid literals -0.0, -0.0L.
+ * tests/test-strtod.c (zero): New variable.
+ (main): Avoid literal -0.0.
+ Reported by Jonathan C. Patschke <jp@centtech.com>.
+
+2008-07-31 Jim Meyering <meyering@redhat.com>
+
+ sha256.h: correct definition of SHA224_DIGEST_SIZE
+ * lib/sha256.h (SHA224_DIGEST_SIZE): Define to 28, not 24.
+ Reported by Paulie Pena IV <paulie4@gmail.com>.
+ Define as 224 / 8, rather than as a literal.
+ (SHA256_DIGEST_SIZE): Define as 256/8 rather than equivalent literal.
+ * lib/sha512.h (SHA384_DIGEST_SIZE): Likewise, define as equiv: 384/8.
+ (SHA512_DIGEST_SIZE): Likewise, define as equivalent quotient: 512/8.
+
+2008-07-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/regex_internal.h (BITSET_WORD_BITS): Make first conditional work
+ on HP-UX 10.20 with "cc -Ae". Fix second conditional.
+ Reported by Jonathan Patschke <jp@centtech.com>.
+
+2008-07-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Make change from 2008-06-23 more robust.
+ Reported by Paolo Bonzini <bonzini@gnu.org>.
+
+2008-07-30 Eric Blake <ebb9@byu.net>
+
+ test-strtod: allow compilation without -lm
+ * tests/test-strtod.c (main): Avoid link dependence on fabs.
+ Reported by Dennis Clarke <blastwave@gmail.com>.
+
+2008-07-28 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: work also when there are no .po files in po/
+ * build-aux/bootstrap (update_po_files): Complete the change
+ that I began in bc960df8c789c878f1c1c54a28a3c2648dead8d9.
+
+2008-07-27 Jim Meyering <meyering@redhat.com>
+
+ * users.txt: Add zile.
+
+2008-07-26 Ben Pfaff <blp@gnu.org>
+
+ Add missing dependencies on new m4/exponent[fdl].m4 files.
+ * modules/isnanf-nolibm: Add m4/exponentf.m4.
+ * modules/isnand-nolibm: Add m4/exponentd.m4.
+ * modules/isnanl-nolibm: Add m4/exponentl.m4.
+ * modules/signbit-tests: Use m4/exponent[fdl].m4 instead of
+ m4/isnan[fdl].m4, because the macros actually used moved.
+ Reported by Jim Meyering.
+
+2008-07-14 Ben Pfaff <blp@gnu.org>
+
+ Add isinf module.
+ * lib/isinf.c: New file.
+ * lib/math.in.h: Define isinf macro if we have decided to replace
+ it.
+ * m4/isinf.m4: New file.
+ * m4/math_h.m4: Initialize and substitute variables for isinf
+ module.
+ * modules/isinf: New file.
+ * modules/isinf-tests: New file.
+ * modules/math: Add substitutions for new module.
+ * tests/test-isinf.c: New file.
+ * doc/posix-functions/isinf.texi: Mention new module.
+ * MODULES.html.sh: Mention new module.
+
+2008-07-14 Ben Pfaff <blp@gnu.org>
+
+ Factor out some macros for use by additional modules.
+ * m4/isnanf.m4 (gl_FLOAT_EXPONENT_LOCATION): Move into new file
+ exponentf.m4.
+ * m4/isnand.m4 (gl_DOUBLE_EXPONENT_LOCATION): Move into new file
+ exponentd.m4.
+ * m4/isnanl.m4 (gl_LONG_DOUBLE_EXPONENT_LOCATION): Move into new
+ file exponentl.m4.
+ * m4/exponentf.m4: New file.
+ * m4/exponentd.m4: New file.
+ * m4/exponentl.m4: New file.
+ * modules/isnanf: Use new file m4/exponentf.m4.
+ * modules/isnand: Use new file m4/exponentd.m4.
+ * modules/isnanl: Use new file m4/exponentl.m4.
+
+2008-07-23 Ulrich Drepper <drepper@redhat.com>
+
+ mktime.c: normalize tp->tm_isdst value to -1/0/1.
+ * lib/mktime.c (__mktime_internal): Normalize tp->tm_isdst value.
+ Reported by Michael Ringe <Michael.Ringe@gmx.de> in
+ <http://sourceware.org/bugzilla/show_bug.cgi?id=6723>.
+
+ * lib/canonicalize-lgpl.c (__realpath): Avoid buffer overflow after
+ readlink on platforms without PATH_MAX.
+
+2008-07-21 Eric Blake <ebb9@byu.net>
+
+ Warn, not fail, on stale version.
+ * top/GNUmakefile (_curr-ver): Tone down previous patch.
+
+ Don't allow installation with stale devel version number.
+ * top/GNUmakefile (_is-install-target): New macro.
+ (_curr-ver): Forbid installation with stale version number.
+
+2008-07-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/c-stack-tests (Makefile.am): Add LIBSIGSEGV to
+ TESTS_ENVIRONMENT.
+ * tests/test-c-stack2.sh: React differently if LIBSIGSEGV is in use.
+
+2008-07-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-stack.h (c_stack_action): Add documentation.
+ * lib/c-stack.c (c_stack_action): Remove incomplete documentation.
+
+2008-07-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/canonicalize-lgpl (License): Relicense under LGPLv2+.
+ * modules/readlink (License): Likewise.
+
+2008-07-17 Eric Blake <ebb9@byu.net>
+
+ * modules/c-stack (Link): Fix typo.
+
+ Make c-stack use libsigsegv, when available.
+ * modules/c-stack (Depends-on): Add libsigsegv.
+ * modules/c-stack-tests (Makefile.am): Link with libsigsegv, if
+ needed.
+ * lib/c-stack.c (SIGSTKSZ): Define fallback.
+ (segv_handler, overflow_handler, c_stack_action)
+ [HAVE_LIBSIGSEGV && !HAVE_XSI_STACK_OVERFLOW_HEURISTIC]: Add new
+ implementation when libsigsegv is available, but only when using
+ the library is necessary.
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Add
+ comment, explaining why XSI check fails on Linux.
+ (gl_PREREQ_C_STACK): Supply LIBCSTACK, LTLIBCSTACK.
+ * tests/test-c-stack2.sh: Tweak skip message.
+ * NEWS: Document new link-time requirements.
+
+2008-07-16 Eric Blake <ebb9@byu.net>
+
+ c-stack: Expose false positives when not using libsigsegv.
+ * modules/c-stack-tests (Files): Expand test.
+ * tests/test-c-stack.c (main): Add means to conditionally trigger
+ non-overflow SIGSEGV.
+ * tests/test-c-stack2.sh: New file.
+
+2008-07-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/libsigsegv.m4: Remove unneeded AC_PREREQ.
+ Reported by Eric Blake.
+
+2008-07-14 Sam Steingold <sds@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ New module libsigsegv.
+ * modules/libsigsegv: New file.
+ * m4/libsigsegv.m4: New file, from GNU clisp sigsegv.m4 with
+ modifications.
+ * MODULES.html.sh (Signal handling): New section.
+
+2008-07-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/unictype/ctype-* (Description): Add the word "function".
+ Improves the resulting doc in MODULES.html.
+
+2008-07-12 Ben Pfaff <blp@gnu.org>
+
+ Add longlong module.
+ * modules/longlong: New file.
+
+2008-07-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnan.m4 (gl_ISNAN): When the replacement is used, set ISNAN_LIBM
+ to empty.
+
+2008-07-10 Ben Pfaff <blp@gnu.org>
+
+ Add isnan module.
+ * doc/posix-functions/isnan.texi: Mention new module.
+ * lib/math.in.h: Define isnan macro if we have decided to replace
+ it.
+ * m4/isnan.m4: New file.
+ * m4/isnanl.m4 (gl_FUNC_ISNANL): Factor out some code into new
+ macro gl_BUILD_ISNANL so that isnan.m4 can use that functionality
+ also.
+ (gl_FUNC_ISNANL_NO_LIBM): Factor out same code, to reduce
+ redundancy.
+ * m4/math_h.m4: Initialize and substitute variables for isnan
+ module.
+ * modules/isnan: New file.
+ * modules/isnan-tests: New file.
+ * modules/math: Add substitutions for new module.
+ * tests/test-isnan.c: New file.
+ * MODULES.html.sh: Mention new module.
+
+2008-07-10 Ben Pfaff <blp@gnu.org>
+
+ Add isnanf module.
+ * lib/isnanf.m4: New file.
+ * m4/isnanf.m4 (gl_FUNC_ISNANF): New macro.
+ (gl_HAVE_ISNANF_IN_LIBM): New macro.
+ (gl_BUILD_ISNANF): New macro used by gl_FUNC_ISNANF,
+ gl_FUNC_ISNANF_NO_LIBM, and gl_FUNC_ISNAN.
+ * modules/isnanf: New file.
+ * modules/isnanf-tests: New file.
+ * modules/isnanf-nolibm-tests: Add tests/test-isnanf.h to list of
+ files.
+ * tests/test-isnanf-nolibm.c: factored most of its contents into
+ new file tests/test-isnanf.h.
+ * tests/test-isnanf.h: New file.
+ * tests/test-isnanf.c: New file.
+ * MODULES.html.sh: Mention new module.
+ * doc/glibc-functions/isnanf.texi: Mention new module.
+
+2008-07-10 Ben Pfaff <blp@gnu.org>
+
+ Add isnand module.
+ * lib/isnand.h: New file.
+ * m4/isnand.m4 (gl_FUNC_ISNAND): New macro.
+ (gl_FUNC_ISNAND_NO_LIBM): Split partially into new macro
+ gl_HAVE_ISNAND_NO_LIBM so that gl_FUNC_ISNAND can use that
+ functionality also.
+ (gl_BUILD_ISNAND): New macro used by gl_FUNC_ISNAND,
+ gl_FUNC_ISNAND_NO_LIBM, and gl_FUNC_ISNAN.
+ (gl_HAVE_ISNAND_IN_LIBM): New macro.
+ * modules/isnand: New file.
+ * modules/isnand-tests: New file.
+ * modules/isnand-nolibm-tests: Add tests/test-isnand.h to list of
+ files.
+ * tests/test-isnand-nolibm.c: factored most of its contents into
+ new file tests/test-isnand.h.
+ * tests/test-isnand.h: New file.
+ * tests/test-isnand.c: New file.
+ * MODULES.html.sh: Mention new module.
+
+2008-07-10 Ben Pfaff <blp@gnu.org>
+
+ * lib/isnanf.h: Rename lib/isnanf-nolibm.h.
+ * lib/isnand.h: Rename lib/isnand-nolibm.h.
+ * tests/test-isnanf.c: Rename tests/test-isnanf-nolibm.c.
+ * tests/test-isnand.c: Rename tests/test-isnand-nolibm.c.
+ * modules/isnanf-nolibm: Update references to renamed files.
+ * modules/isnand-nolibm: Likewise.
+ * modules/isnanf-nolibm-tests: Likewise.
+ * modules/isnand-nolibm-tests: Likewise.
+ * lib/frexp.c: Likewise.
+ * lib/isfinite.c: Likewise.
+ * lib/signbitd.c: Likewise.
+ * lib/signbitf.c: Likewise.
+ * lib/vasnprintf.c: Likewise.
+ * tests/test-ceilf1.c: Likewise.
+ * tests/test-ceilf2.c: Likewise.
+ * tests/test-floorf1.c: Likewise.
+ * tests/test-floorf2.c: Likewise.
+ * tests/test-frexp.c: Likewise.
+ * tests/test-round1.c: Likewise.
+ * tests/test-round2.c: Likewise.
+ * tests/test-roundf1.c: Likewise.
+ * tests/test-strtod.c: Likewise.
+ * tests/test-trunc1.c: Likewise.
+ * tests/test-trunc2.c: Likewise.
+ * tests/test-truncf1.c: Likewise.
+ * tests/test-truncf2.c: Likewise.
+ * NEWS: Mention the renamed header files.
+
+2008-07-11 Jim Meyering <meyering@redhat.com>
+
+ vc-list-files: make the last-resort awk code more portable
+ * build-aux/vc-list-files: Don't rely on awk's "sub" command.
+ /bin/awk from OpenSolaris 11's SUNWesu version 2008.03.22.10.56
+ does not support it.
+
+2008-07-10 Eric Blake <ebb9@byu.net>
+
+ Work with tar's bootstrap.
+ * gnulib-tool (func_emit_initmacro_end): Use m4_defn in the case
+ where LIBSOURCES_DIR contains .#bootmp but must not be treated as
+ an m4 comment.
+
+2008-07-09 Jim Meyering <meyering@redhat.com>
+
+ posix-shell.m4: fix typo that made this test malfunction
+ * m4/posix-shell.m4: Remove capitalization in variable name.
+
+2008-07-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/onceonly.m4: Update comments.
+ Reported by Ben Pfaff <blp@cs.stanford.edu>.
+
+2008-07-04 Jim Meyering <meyering@redhat.com>
+
+ * users.txt: Add vc-dwim.
+ (bison, coreutils): Use the gitweb URL.
+
+2008-07-03 Jim Meyering <meyering@redhat.com>
+
+ * users.txt: Add libffcall. From Sam Steingold.
+
+2008-07-03 Ondřej Vašík <ovasik@redhat.com>
+
+ getdate.y: do not ignore TZ with relative day, month or year offset
+ * lib/getdate.y (get_date): Move the tz-handling block to follow the
+ relative-date-handling, since otherwise, the latter would clobber the
+ sole output (an updated Start value) of the tz-handling block.
+ * tests/test-getdate.c: Tests for the fix
+
+2008-07-03 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Recognize 'foo_LIBRARIES += libgnu.a'.
+ * gnulib-tool (func_emit_lib_Makefile_am): Recognize if a
+ makefile snippet has already specified an installation location,
+ also using '+='.
+
+2008-07-02 Ondřej Vašík <ovasik@redhat.com>
+
+ getdate.y: factor out common actions
+ * lib/getdate.y (apply_relative_time, set_hhmmss): New functions.
+ Use them in place of open-coded actions.
+
+2008-07-01 Simon Josefsson <simon@josefsson.org>
+
+ Add self-test for getdate module.
+ * modules/getdate-tests: New file.
+ * tests/test-getdate.c: New file.
+
+2008-06-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Put gnulib-comp.m4 into .cvsignore or
+ .gitignore.
+ Reported by Sylvain Beucler <beuc@beuc.net>.
+
+2008-06-29 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (VCS Issues): Mention --no-vc-files option.
+ * m4/gnulib-tool.m4: Update to match current gnulib-tool.
+
+2008-06-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Recommend to put gnulib-cache.m4 into
+ EXTRA_DIST.
+ Reported by Sylvain Beucler <beuc@beuc.net>.
+
+2008-06-26 Jim Meyering <meyering@redhat.com>
+
+ make several modules depend on the "open" module
+ This provides slightly increased consistency when opening-for-write
+ the name of a non-directory spelled with a trailing slash.
+ * modules/chdir-safer: Likewise.
+ * modules/chown: Likewise.
+ * modules/clean-temp: Likewise.
+ * modules/copy-file: Likewise.
+ * modules/fchdir: Likewise.
+ * modules/fcntl-safer: Likewise.
+ * modules/pipe: Likewise.
+ * modules/utime: Likewise.
+ Prompted by Eric Blake and Bruno Haible.
+
+2008-06-24 Andreas Schwab <schwab@suse.de>
+
+ * m4/getdate.m4 (gl_C_COMPOUND_LITERALS): Don't test whether compound
+ literals can be used as initializers for global variables.
+
+2008-06-23 Eric Blake <ebb9@byu.net>
+
+ Make gnulib-cache.m4 easier to diff.
+ * gnulib-tool (func_import): Allow newlines when reading cached
+ gl_MODULES, and generate newlines when creating gnulib-cache.m4.
+
+2008-06-23 Bruno Haible <bruno@clisp.org>
+
+ * m4/signalblocking.m4 (gl_PREREQ_SIG_HANDLER_H): Remove macro.
+ (gl_PREREQ_SIGPROCMASK): Don't invoke it.
+ * m4/sigaction.m4 (gl_PREREQ_SIG_HANDLER_H): New macro, moved here from
+ m4/signalblocking.m4.
+ (gl_PREREQ_SIGACTION): Don't invoke it.
+ * m4/nanosleep.m4 (gl_PREREQ_NANOSLEEP): Invoke
+ gl_PREREQ_SIG_HANDLER_H.
+ * m4/fatal-signal.m4 (gl_FATAL_SIGNAL): Likewise.
+ Don't check for sigaction here.
+
+2008-06-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/fatal-signal.c (fatal_signal_handler): Update comment.
+ (install_handlers): Don't set the SA_RESETHAND flag.
+
+2008-06-23 Bruno Haible <bruno@clisp.org>
+
+ * m4/sigaction.m4: Comment fixes.
+ * lib/signal.in.h: Likewise.
+
+2008-06-23 Eric Blake <ebb9@byu.net>
+
+ Fix typo.
+ * tests/test-sigaction.c (MASK_SA_FLAGS): Add missing operator.
+
+ Avoid SA_ namespace.
+ * tests/test-sigaction.c (MASK_SA_FLAGS): Rename from SA_MASK.
+ Reported by Ralf Wildenhues.
+
+ Avoid test failure due to SA_RESTORER.
+ * tests/test-sigaction.c (SA_MASK): New macro.
+ (main): Avoid failing due to extension flags being set.
+ Reported by Jim Meyering.
+
+ Revert use of sig-handler.h in sigprocmask.c.
+ * modules/sigprocmask (Files): Don't rely on sig-handler.h, since
+ it requires the existence of struct sigaction.
+ * lib/sigprocmask.c (handler_t): Restore typedef.
+ (rpl_signal, old_handlers): Use local type.
+
+2008-06-22 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-stdint.c: Disable the INTMAX_MAX preprocessor test
+ conditionally.
+ Reported by Albert Chin <bug-gnulib@mlists.thewrittenword.com>.
+
+2008-06-22 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/siginterrupt.texi: Move note.
+
+ * lib/signal.in.h (SA_RESTART): New macro.
+ * lib/sigaction.c: Update comment.
+
+ * m4/sigaction.m4 (gl_SIGACTION): Require gl_SIGNAL_H_DEFAULTS.
+
+ * m4/signalblocking.m4 (gl_PREREQ_SIG_HANDLER_H): New macro.
+ (gl_PREREQ_SIGPROCMASK): Invoke it.
+ * m4/sigaction.m4 (gl_PREREQ_SIGACTION): Likewise.
+
+ * lib/nanosleep.c (rpl_nanosleep): Setup newact only when it is needed.
+
+ * lib/sigprocmask.c: Update a comment.
+
+2008-06-21 Eric Blake <ebb9@byu.net>
+
+ Use sigaction module rather than signal().
+ * modules/c-stack (Depends-on): Add sigaction.
+ * modules/fatal-signal (Depends-on): Likewise.
+ * modules/nanosleep (Depends-on): Likewise.
+ * modules/sigprocmask (Files): Add sig-handler.h.
+ * modules/sigaction (Files): Likewise.
+ * lib/sig-handler.h (get_handler): New file, suggested by Paul
+ Eggert.
+ * lib/c-stack.c (SIGACTION_WORKS): Simplify conditions.
+ (c_stack_action) [!SIGACTION_WORKS]: Use sigaction, not signal.
+ * lib/fatal-signal.c (uninstall_handlers, install_handlers)
+ (init_fatal_signals): Likewise.
+ * lib/nanosleep.c (rpl_nanosleep): Likewise.
+ (siginterrupt): Delete fallback.
+ * lib/sigprocmask.c (handler_t, old_handlers): Use sa_handler_t
+ instead.
+ * m4/nanosleep.m4 (gl_PREREQ_NANOSLEEP): Drop check for
+ siginterrupt.
+
+ New module sigaction, for mingw.
+ * modules/sigaction: New module...
+ * modules/sigaction-tests: ...and its test.
+ * m4/sigaction.m4: New file.
+ * lib/sigaction.c: Likewise.
+ * tests/test-sigaction.c: Likewise.
+ * m4/signal_h.m4 (gl_SIGNAL_H_DEFAULTS): Add sigaction variables.
+ * modules/signal (Makefile.am): Likewise.
+ * lib/signal.in.h (!@HAVE_SIGACTION@): Define replacements when
+ needed.
+ * doc/posix-headers/signal.texi (signal.h): Mention provided
+ types.
+ * doc/posix-functions/siginterrupt.texi (siginterrupt): Mention
+ that sigaction is preferable.
+ * doc/posix-functions/sigaction.texi (sigaction): Mention new
+ module.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ sigaction.
+
+ Improve robustness of sigprocmask by overriding signal.
+ * lib/signal.in.h (rpl_signal): Override signal when sigprocmask
+ is in use.
+ * lib/sigprocmask.c (blocked_handler): Reinstall block handler.
+ (SIGKILL, SIGSTOP): Provide fallbacks.
+ (rpl_signal): Implement.
+ (old_handlers, blocked_set): Mark volatile, since sigprocmask and
+ signal can be called inside handlers.
+
+ Fix nanosleep module on mingw.
+ * modules/nanosleep (Depends-on): Add sys_select.
+ * lib/nanosleep.c (HAVE_SYS_SELECT_H): Rely on gnulib module.
+
+ Fix licensing of sigprocmask.
+ * modules/raise (License): Relicense as LGPL.
+
+2008-06-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/propername.c (proper_name_utf8): Don't use the transliterated
+ result if it contains question marks.
+ Reported by Michael Geng <linux@michaelgeng.de>.
+
+2008-06-19 Bruno Haible <bruno@clisp.org>
+
+ Fix CVS-ism.
+ * doc/gnulib.texi: Include updated-stamp.texi.
+ * doc/Makefile (GNULIB_TEXI_FILES): New variable.
+ (updated-stamp.texi): New rule.
+ (gnulib.info): Depend on it.
+ * doc/.gitignore: Add updated-stamp.texi.
+ Based on a patch by Thien-Thi Nguyen <ttn@gnuvola.org>.
+
+2008-06-19 Bruno Haible <bruno@clisp.org>
+
+ * doc/Makefile (gnulib.info): Update and simplify dependencies.
+ Reported by Thien-Thi Nguyen <ttn@gnuvola.org>.
+
+2008-06-19 Eric Blake <ebb9@byu.net>
+
+ Fix VPATH 'make dist' with GNU make and non-VCS tarball.
+ * top/GNUmakefile (_curr-ver): Don't use $(srcdir) unnecessarily.
+ Reported by Stepan Kasal.
+
+2008-06-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/fatal-signal.c (init_fatal_signals): Add comment.
+ Reported by Eric Blake.
+
+2008-06-18 Eric Blake <ebb9@byu.net>
+
+ Work around cygwin 1.5.25 strsignal bug.
+ * tests/test-strsignal.c: Allow for const char *.
+ * doc/glibc-functions/strsignal.texi (strsignal): Document the bug.
+
+2008-06-18 Simon Josefsson <simon@josefsson.org>
+
+ * users.txt: Update URL to article and add author/date
+ information.
+
+2008-06-17 Bruno Haible <bruno@clisp.org>
+
+ New macro gl_DISABLE_THREADS.
+ * m4/lock.m4 (gl_LOCK_EARLY_BODY): Use value gl_use_threads_default
+ if the user did not pass --enable-threads or --disable-threads option.
+ (gl_DISABLE_THREADS): New macro.
+ Reported by Eric Blake <ebb9@byu.net>.
+
+2008-06-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/tls.h (gl_tls_key_init): Evaluate the destructor argument also
+ when the macro ignores it.
+ Based on a patch by Eric Blake <ebb9@byu.net>.
+
+2008-06-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/tls (License): Change to LGPLv2+.
+ Reported by Eric Blake.
+
+2008-06-17 Eric Blake <ebb9@byu.net>
+
+ Simplify c-stack prerequisites.
+ * lib/c-stack.c (includes): Remove unused <sys/resource.h>.
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Posix 200x
+ no longer requires <ucontext.h> to exist. Optimize setrlimit
+ check.
+ (gl_PREREQ_C_STACK): Remove check for unused getcontext and
+ <sys/resource.h>.
+
+ Move c-stack test into testsuite.
+ * modules/c-stack-tests: New file.
+ * lib/c-stack.c [DEBUG]: Move test program...
+ * tests/test-c-stack.c: ...into this new file. Skip rather than
+ fail test if sigaltstack is lacking.
+ * tests/test-c-stack.sh: New driver file.
+
+2008-06-16 Eric Blake <ebb9@byu.net>
+
+ Use raise module consistently.
+ * modules/fatal-signal (Depends-on): Add raise.
+ * modules/sigprocmask (Depends-on): Likewise.
+ * lib/fatal-signal.c (fatal_signal_handler): Rely on raise.
+ * lib/sigprocmask.c (sigprocmask): Likewise.
+ * m4/fatal-signal.m4 (gl_FATAL_SIGNAL): Likewise.
+ * m4/signalblocking.m4 (gl_PREREQ_SIGPROCMASK): Likewise.
+
+ Fix compliance bug in sigpending.
+ * lib/sigprocmask.c (sigpending): Return pending array via
+ parameter, not return value.
+
+2008-06-14 Eric Blake <ebb9@byu.net>
+
+ Improve obstack-printf test code.
+ * tests/test-obstack-printf.c (test_function): Fix comment, and
+ simplify usage of obstack_* in macros. Add a test for coverage.
+ Reported by Bruno Haible.
+
+2008-06-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/obstack_printf.c (obstack_vprintf): Define the stack-allocated
+ array size as a constant, not as a const variable.
+ * m4/obstack-printf.m4 (gl_FUNC_OBSTACK_PRINTF): Require
+ AC_USE_SYSTEM_EXTENSIONS.
+ * m4/obstack-printf-posix.m4 (gl_FUNC_OBSTACK_PRINTF_POSIX): Likewise.
+ Test whether the obstack_printf function actually exists.
+ * modules/obstack-printf (Depends-on): Add extensions.
+ (Include): Remove obstack.h.
+ * modules/obstack-printf-posix (Depends-on): Add extensions.
+ (Include): Remove obstack.h.
+
+2008-06-13 Eric Blake <ebb9@byu.net>
+
+ Add obstack-printf and obstack-printf-posix modules.
+ * modules/obstack-printf: New file.
+ * modules/obstack-printf-posix: Likewise.
+ * MODULES.html.sh (Misc): Mention them.
+ * doc/glibc-functions/obstack_printf.texi (obstack_printf):
+ Likewise.
+ * doc/glibc-functions/obstack_vprintf.texi (obstack_vprintf):
+ Likewise.
+ * modules/stdio (Makefile.am): Accomodate new modules.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Likewise.
+ * lib/stdio.in.h (rpl_obstack_printf, rpl_obstack_vprintf):
+ Declare.
+ * lib/obstack_printf.c (obstack_printf, obstack_vprintf): New
+ functions.
+ * m4/obstack-printf.m4 (gl_OBSTACK_PRINTF)
+ (gl_REPLACE_OBSTACK_PRINTF): New macros
+ * m4/obstack-printf-posix.m4 (gl_OBSTACK_PRINTF_POSIX): Likewise.
+ * tests/test-obstack-printf.c: New file.
+ * modules/obstack-printf-tests: Likewise.
+ * modules/obstack-printf-posix-tests: Likewise.
+
+2008-06-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/open.m4 (gl_FUNC_OPEN): Add test against trailing slash bug.
+ * lib/open.c: Include errno.h.
+ (open): Fail when attempting to write to a file that has a trailing
+ slash.
+ * tests/test-open.c (main): Test against trailing slash bug.
+ * doc/posix-functions/open.texi: Mention the trailing slash bug.
+
+2008-06-10 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vc-list-files-git.sh: Make double use of 'exit'. Needed
+ for $? to work inside the trap command, with various /bin/sh-s.
+ * tests/test-vc-list-files-cvs.sh: Likewise.
+
+2008-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl-internal.h: Don't include gettext.h here.
+ * lib/set-mode-acl.c: Include gettext.h here.
+ * lib/copy-acl.c: Likewise.
+
+2008-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.h (wait_subprocess): Add termsigp argument.
+ * lib/wait-process.c (wait_subprocess): Likewise.
+ * lib/execute.h (execute): Add termsigp argument.
+ * lib/execute.c (execute): Likewise.
+ * lib/csharpcomp.c (compile_csharp_using_pnet,
+ compile_csharp_using_mono, compile_csharp_using_sscli): Update.
+ * lib/csharpexec.c (execute_csharp_using_pnet,
+ execute_csharp_using_mono, execute_csharp_using_sscli): Update.
+ * lib/javacomp.c (compile_using_envjavac, compile_using_gcj,
+ compile_using_javac, compile_using_jikes, is_envjavac_gcj,
+ is_envjavac_gcj43, is_gcj_present, is_gcj_43, is_javac_present,
+ is_jikes_present): Update.
+ * lib/javaexec.c (execute_java_class): Update.
+ * lib/javaversion.c (execute_and_read_line): Update.
+ * NEWS: Document the changes.
+ Reported by Eric Blake.
+
+2008-06-10 Eric Blake <ebb9@byu.net>
+
+ Add missing include.
+ * tests/test-strstr.c (includes): Add <signal.h>.
+ * tests/test-strcasestr.c (includes): Likewise.
+ * tests/test-memmem.c (includes): Likewise.
+
+2008-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.c (wait_subprocess): Add an assertion.
+
+2008-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.c (wait_subprocess): Try to fix waitid() based code.
+
+2008-06-10 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-memmem.c (main): Reset SIGALRM to default handling before
+ using alarm().
+ * tests/test-strcasestr.c (main): Likewise.
+ * tests/test-strstr.c (main): Likewise.
+
+2008-06-09 Bruno Haible <bruno@clisp.org>
+
+ Work around the Solaris 10 ACE ACLs ABI change.
+ * lib/acl-internal.h (acl_nontrivial, acl_ace_nontrivial): Don't
+ declare if ACL_NO_TRIVIAL is present.
+ (ACE_ACCESS_ALLOWED_ACE_TYPE, ACE_ACCESS_DENIED_ACE_TYPE,
+ NEW_ACE_OWNER, NEW_ACE_GROUP, NEW_ACE_IDENTIFIER_GROUP, ACE_EVERYONE,
+ NEW_ACE_READ_DATA, NEW_ACE_WRITE_DATA, NEW_ACE_EXECUTE): New macros.
+ * lib/file-has-acl.c (acl_nontrivial, acl_ace_nontrivial): Don't
+ define if ACL_NO_TRIVIAL is present.
+ (acl_ace_nontrivial): Detect whether the old or new ABI is in use,
+ and use the current ABI.
+ (file_has_acl): Use same #if condition as elsewhere.
+ * lib/set-mode-acl.c (qset_acl): Detect whether the old or new ABI is
+ in use, and use the current ABI.
+ * doc/acl-resources.txt: More doc about newer Solaris 10 versions.
+ Reported by Jim Meyering.
+
+2008-06-09 Eric Blake <ebb9@byu.net>
+
+ Work around environments that (stupidly) ignore SIGALRM.
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Reset SIGALRM to default handling
+ before using alarm().
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR): Likewise.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): Likewise.
+ Reported by Ian Beckwith <ianb@erislabs.net>.
+
+ Produce autobuild blurb earlier in log.
+ * modules/autobuild (configure.ac-early): Move AB_INIT here.
+
+2008-06-09 Jim Meyering <meyering@redhat.com>
+ and Ondřej Vašík <ovasik@redhat.com>
+
+ utimens.c: correct kernel bug work-around
+ Ondřej Vašík found that the invalid return value of 280 indicates
+ failure, not success, and the kernel bug we're trying to work
+ around affects not just the utimensat call, but also the fallback
+ futimens call.
+ * lib/utimens.c (gl_futimens) [HAVE_UTIMENSAT]: Simulate failure,
+ not success.
+ [HAVE_FUTIMENS]: Use the same work-around, here.
+
+2008-06-09 Jim Meyering <meyering@redhat.com>
+
+ add more guards around definition of ACE_-related code
+ * lib/file-has-acl.c (acl_ace_nontrivial): Define only if
+ ALLOW and ACE_OWNER are also defined.
+
+2008-06-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl-internal.h: Add me as co-author.
+ * lib/file-has-acl.c: Likewise.
+ * lib/set-mode-acl.c: Likewise.
+ * lib/copy-acl.c: Likewise.
+
+2008-06-08 Bruno Haible <bruno@clisp.org>
+
+ Add support for AIX ACLs.
+ * lib/acl-internal.h (acl_nontrivial): New declaration.
+ * lib/file-has-acl.c (acl_nontrivial): New function.
+ (file_has_acl): Add implementation using AIX 4 ACL API.
+ * lib/set-mode-acl.c (qset_acl): Likewise.
+ * lib/copy-acl.c (qcopy_acl): Likewise.
+
+2008-06-08 Bruno Haible <bruno@clisp.org>
+
+ Add support for HP-UX ACLs.
+ * lib/acl-internal.h (acl_nontrivial): New declaration.
+ * lib/file-has-acl.c (acl_nontrivial): New function.
+ (file_has_acl): Add implementation using HP-UX 11 ACL API.
+ * lib/set-mode-acl.c (qset_acl): Likewise.
+ * lib/copy-acl.c (qcopy_acl): Likewise.
+
+2008-06-08 Bruno Haible <bruno@clisp.org>
+
+ Add support for Cygwin ACLs.
+ * lib/acl-internal.h (MODE_INSIDE_ACL): New macro for Solaris-like API.
+ * lib/set-mode-acl.c (qset_acl) [!MODE_INSIDE_ACL]: Don't optimize away
+ the chmod_or_fchmod call.
+ * lib/copy-acl.c (qcopy_acl) [!MODE_INSIDE_ACL]: Likewise.
+
+2008-06-08 Bruno Haible <bruno@clisp.org>
+
+ Fix bug with setuid modes in Solaris 10+ code.
+ * lib/set-mode-acl.c (qset_acl): Call chmod_or_fchmod when acl_set
+ succeeded, when the mode contains some special bits.
+
+2008-06-08 Bruno Haible <bruno@clisp.org>
+
+ Add support for Solaris 7..10 ACLs.
+ * lib/acl-internal.h (acl_nontrivial, acl_ace_nontrivial): New
+ declarations.
+ * lib/file-has-acl.c (acl_nontrivial, acl_ace_nontrivial): New
+ functions.
+ (file_has_acl): Add implementation using Solaris 7..10 ACL API.
+ * lib/set-mode-acl.c (qset_acl): Likewise.
+ * lib/copy-acl.c (qcopy_acl): Likewise.
+
+2008-06-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl-internal.h (acl_extended_nontrivial) [MacOS X]: New
+ declaration.
+ * lib/file-has-acl.c (acl_extended_nontrivial) [MacOS X]: New function.
+ (acl_access_nontrivial): Remove MacOS X case.
+ (file_has_acl): Use acl_extended_nontrivial.
+ * lib/copy-acl.c (qcopy_acl): Likewise.
+
+2008-06-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/set-mode-acl.c (qset_acl): Trivial code simplifications.
+
+2008-06-08 Jim Meyering <meyering@redhat.com>
+
+ * modules/acl (Maintainer): Add Bruno Haible.
+
+2008-06-07 Bruno Haible <bruno@clisp.org>
+
+ Improve support for Tru64 ACLs.
+ * lib/file-has-acl.c (file_has_acl): Don't test the ACL_TYPE_DEFAULT
+ ACL on OSF/1.
+
+2008-06-07 Bruno Haible <bruno@clisp.org>
+
+ Add support for MacOS X ACLs.
+ * lib/file-has-acl.c (file_has_acl): Use ACL_TYPE_EXTENDED instead of
+ ACL_TYPE_ACCESS and ACL_TYPE_DEFAULT.
+ * lib/set-mode-acl.c (qset_acl): Likewise.
+ * lib/copy-acl.c (qcopy_acl): Likewise.
+
+2008-06-07 Bruno Haible <bruno@clisp.org>
+
+ Fix memory leak introduced on 2008-05-22.
+ * lib/set-mode-acl.c (qset_acl) [!MODE_INSIDE_ACL]: Free ACLs after
+ use.
+
+2008-06-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/set-mode-acl.c (qset_acl): Use acl_init(), not acl_from_text(),
+ to construct an empty ACL.
+
+2008-06-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/set-mode-acl.c (chmod_or_fchmod): Document return value
+ precisely.
+ * lib/copy-acl.c (qcopy_acl): Trivial code simplifications.
+
+2008-06-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-acl.c (qcopy_acl): Make the #if branches independent.
+ * lib/set-mode-acl.c (qset_acl): Choose better local variable names.
+
+2008-06-07 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/_setjmp.texi: Explain the use of this function
+ regardless of POSIX.
+ * doc/posix-functions/_longjmp.texi: Likewise.
+ * doc/posix-functions/setjmp.texi: Mention HP-UX as not counting as a
+ SystemV platform in this case.
+
+2008-06-06 Eric Blake <ebb9@byu.net>
+
+ Document abort() bugs.
+ * doc/posix-functions/abort.texi (abort): Mention anomalies.
+
+ * doc/posix-functions/setjmp.texi (setjmp): Mingw has setjmp.
+ * doc/posix-functions/sigsetjmp.texi (sigsetjmp): Cygwin has
+ sigsetjmp.
+ * doc/posix-functions/siglongjmp.texi (siglongjmp): Cygwin has
+ siglongjmp, but only as a macro.
+ * doc/posix-functions/_longjmp.texi (_longjmp): Mention that this
+ is obsolete.
+ * doc/posix-functions/_setjmp.texi (_setjmp): Likewise.
+
+ Tweak documentation to cover cygwin argz bugs.
+ * m4/argz.m4 (gl_FUNC_ARGZ): Mention date of last known cygwin
+ argz bug fix; no code change needed since no cygwin releases
+ occurred between the last fix and the bug being tested.
+ * doc/glibc-functions/argz_add.texi (argz_add): Document the argz
+ module and recently fixed cygwin bugs.
+ * doc/glibc-functions/argz_add_sep.texi (argz_add_sep): Likewise.
+ * doc/glibc-functions/argz_append.texi (argz_append): Likewise.
+ * doc/glibc-functions/argz_count.texi (argz_count): Likewise.
+ * doc/glibc-functions/argz_create.texi (argz_create): Likewise.
+ * doc/glibc-functions/argz_create_sep.texi (argz_create_sep):
+ Likewise.
+ * doc/glibc-functions/argz_delete.texi (argz_delete): Likewise.
+ * doc/glibc-functions/argz_extract.texi (argz_extract): Likewise.
+ * doc/glibc-functions/argz_insert.texi (argz_insert): Likewise.
+ * doc/glibc-functions/argz_next.texi (argz_next): Likewise.
+ * doc/glibc-functions/argz_replace.texi (argz_replace): Likewise.
+ * doc/glibc-functions/argz_stringify.texi (argz_stringify):
+ Likewise.
+
+ Avoid gcc warning on cygwin.
+ * lib/copy-acl.c (qcopy_acl) [!HAVE_ACL_GET_FILE &&
+ !ACL_NO_TRIVIAL]: Avoid unused variable.
+
+2008-06-05 Eric Blake <ebb9@byu.net>
+
+ Be tolerant of UNKNOWN version in gnulib-tool test dir.
+ * top/GNUmakefile (_dummy): Warn rather than reconfigure if
+ git-version-gen fails to come up with a version.
+ Reported by Simon Josefsson.
+
+2008-06-05 Jim Meyering <meyering@redhat.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ utimens.c: work around a probable Linux kernel bug
+ * lib/utimens.c (gl_futimens) [HAVE_UTIMENSAT]: Work around what
+ appears to be a kernel bug that causes utimensat to return 280
+ instead of 0, indicating success.
+
+2008-06-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-acl.c (qcopy_acl): Call qset_acl, not set_acl. Fixes
+ 2008-06-01 commit.
+
+2008-06-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl-internal.h (acl_access_nontrivial): New declaration.
+ * lib/file-has-acl.c (acl_access_nontrivial): New function.
+ (file_has_acl): Use it. Save errno afterwards.
+ * lib/copy-acl.c (qcopy_acl): Use acl_access_nontrivial.
+
+2008-06-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/file-has-acl.c (file_has_acl): Put Solaris 10 code after POSIX-
+ draft code. Simplify #ifs.
+ * lib/set-mode-acl.c (qset_acl): Don't test for symlink if !USE_ACL.
+ Put Solaris code after POSIX-draft code. Fix comments regarding
+ Solaris 10, HP-UX. Mention Cygwin.
+ * lib/copy-acl.c (qcopy_acl): Simplify #ifs.
+
+2008-06-03 Eric Blake <ebb9@byu.net>
+
+ Provide fallback for older kernels.
+ * lib/utimens.c (gl_futimens) [HAVE_UTIMENSAT, HAVE_FUTIMENS]:
+ Provide runtime fallback if kernel lacks support.
+ Reported by Mike Frysinger.
+
+2008-06-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl-internal.h (ACL_NOT_WELL_SUPPORTED): Include EOPNOTSUPP if
+ it exists.
+
+2008-06-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl_entries.c (acl_entries): Rewrite to use acl_get_entry.
+ * lib/copy-acl.c (qcopy_acl): Update comment.
+
+2008-06-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl-entries.h: Enclose most definitions in #ifs for POSIX-draft
+ like ACL APIs.
+
+2008-06-02 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-file-has-acl.sh: Use different code for Cygwin.
+ * tests/test-set-mode-acl.sh: Likewise.
+ * tests/test-copy-acl.sh: Likewise.
+ * tests/test-copy-file.sh: Likewise.
+
+2008-06-02 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-file-has-acl.sh: Remove unused code.
+
+2008-06-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-acl.c (qcopy_acl): New function, extracted from copy_acl.
+ (copy_acl): Just a wrapper around qcopy_acl that emits the error
+ messages.
+ * lib/set-mode-acl.c (qset_acl): Document return value precisely.
+
+2008-06-01 Bruno Haible <bruno@clisp.org>
+
+ * m4/acl.m4 (gl_FUNC_ACL): Separate the POSIX-like and the Solaris
+ tests. Test for libpacl, needed for OSF/1. Test for extended ACLs,
+ needed for MacOS X. Test for HP-UX API. Test for newer and older AIX
+ APIs.
+ * modules/acl-tests (configure.ac): Remove tests now contained in
+ m4/acl.m4.
+
+2008-06-02 Jim Meyering <meyering@redhat.com>
+
+ announce-gen: use a better key-server host name
+ * build-aux/announce-gen (main): Recommend keys.gnupg.net, since
+ it may be more consistently reliable. Suggested by Werner Koch
+ in <http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/13717>.
+
+2008-06-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio-impl.h (fp_ub): Use fp_. Needed for DragonFly BSD.
+ Reported by Voroskoi Andras <voroskoi@gmail.com>.
+
+2008-06-01 Voroskoi Andras <voroskoi@gmail.com> (tiny change)
+
+ * lib/stdio-impl.h [__DragonFly__]: Fix typo.
+
+2008-06-01 Bruno Haible <bruno@clisp.org>
+
+ New ACL tests.
+ * tests/test-file-has-acl.sh: New file.
+ * tests/test-file-has-acl.c: New file.
+ * tests/test-set-mode-acl.sh: New file.
+ * tests/test-set-mode-acl.c: New file.
+ * tests/test-copy-acl.sh: New file, based on tests/test-copy-file.sh.
+ * tests/test-copy-acl.c: New file.
+ * modules/acl-tests: New file, based on modules/copy-file-tests.
+ * modules/copy-file-tests (Files): Remove tests/test-sameacls.c.
+ (Depends-on): Add acl-tests.
+ (configure.ac): Remove checks.
+ (Makefile.am): Don't create test-sameacls program here any more.
+
+2008-06-01 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-copy-file.sh: Portability fixes for Solaris, HP-UX, IRIX.
+ * tests/test-sameacls.c: Include progname.h.
+ (main): Invoke set_program_name. Portability fixes for MacOS X,
+ Solaris, HP-UX.
+
+2008-06-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/freadahead.c (freadahead) [__DragonFly__]: Use the __sreadahead
+ function.
+ Reported by VOROSKOI Andras <voroskoi@gmail.com>.
+
+2008-06-01 Bruno Haible <bruno@clisp.org>
+
+ * modules/rpmatch (Depends-on): Add strdup.
+
+2008-06-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe.c: Include unistd-safer.h.
+ (create_pipe): Ensure the returned file descriptors are not in {0,1,2}.
+ * modules/pipe (Depends-on): Add unistd-safer.
+
+2008-05-30 Simon Josefsson <simon@josefsson.org>
+
+ * modules/autobuild (configure.ac): Call AB_INIT.
+
+2008-05-30 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-getaddrinfo.c: Don't print debug messages by default.
+ Suggested by Bruno Haible <bruno@clisp.org>.
+
+2008-05-30 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-base64.c: Cast size_t to unsigned long when invoking
+ printf. Use %lu instead of %d. Reported by Bruno Haible
+ <bruno@clisp.org>.
+
+2008-05-29 Eric Blake <ebb9@byu.net>
+
+ Prefer new POSIX 200x interfaces over futimesat.
+ * m4/utimens.m4 (gl_UTIMENS): Check for futimens, utimensat.
+ * lib/utimens.c (gl_futimens): Use them for nanosecond resolution
+ when available.
+ [HAVE_BUGGY_NFS_TIME_STAMPS]: Allow C89 compilation.
+
+2008-05-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/stpcpy (License): Change to LGPLv2+.
+ Requested by David Lutterkort <dlutter@redhat.com>.
+
+2008-05-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/localename.c (SUBLANG_TIBETAN_BHUTAN): Force value 2. Needed for
+ current mingw.
+ Reported by Jose E. Marchesi <jemarch@gnu.org>.
+
+2008-05-27 Bruno Haible <bruno@clisp.org>
+
+ * modules/iconv_open (Link): New section, from module 'iconv'.
+ * modules/striconv (Link): Likewise.
+ * modules/striconveh (Link): Likewise.
+ * modules/xstriconv (Link): Likewise.
+ * modules/unicodeio (Link): Likewise.
+ * modules/propername (Link): Likewise.
+ Reported by Jim Meyering.
+
+2008-05-26 Jim Meyering <meyering@redhat.com>
+
+ sha256: do not artificially restrict buffer length to be < 2^32
+ * lib/sha256.h (struct sha256_ctx) [buflen]: Change type from
+ uint32_t to size_t.
+ * lib/sha256.c (sha256_conclude_ctx): Change type of a local
+ to match.
+
+ avoid unaligned access errors, e.g., on sparc
+ * lib/sha512.c (sha512_conclude_ctx): Use set_uint64 rather than
+ direct access through a possibly-unaligned uint64* pointer.
+ * lib/sha256.c (sha256_conclude_ctx): Use set_uint32 rather than
+ direct access through a possibly-unaligned uint32* pointer.
+ Prompted by this patch from Tom "spot" Callaway:
+ http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/13638
+
+ sha512.c: fix typo in comment
+ * lib/sha512.c (sha512_conclude_ctx): Length is 128-bit, not 64-bit.
+
+2008-05-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/set-mode-acl.c: Renamed from lib/acl.c.
+ * modules/acl (Files): Add lib/set-mode-acl.c, remove lib/acl.c.
+ (Makefile.am): Update lib_SOURCES.
+
+2008-05-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/acl.m4 (gl_FUNC_ACL): Don't set LIB_ACL_TRIVIAL.
+
+2008-05-25 Jim Meyering <meyering@redhat.com>
+
+ useless-if-before-free: freed expr may have white-space differences
+ * build-aux/useless-if-before-free: Recognize cases in which the
+ freed expression differs from the tested one in embedded white
+ space, e.g., if (p[i + 1]) free(p[i+1]). Correct thinko in prev:
+ $1 was used, so we can't make any regexp shy. Improved tests now
+ detect this.
+
+ useless-if-before-free: accept white space in the expression.
+ * build-aux/useless-if-before-free: For now, any white space
+ in the expression must be identical in the free argument.
+
+ useless-if-before-free: efficiency tweak
+ * build-aux/useless-if-before-free: Make the expression-matching
+ regexp "shy".
+ Make the *outer* regexp shy, not the expr-matching one.
+
+ update code-in-comment to accept cast of free arg
+ * build-aux/useless-if-before-free: Update regexp.
+
+2008-05-25 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-sameacls.c: Renamed from tests/test-copy-file-sameacls.c.
+ * modules/copy-file-tests (Files, Makefile.am): Update.
+ * tests/test-copy-file.c (func_test_copy): Update.
+
+2008-05-24 Andreas Färber <andreas.faerber@web.de> (tiny change)
+
+ * lib/stdbool.in.h [__HAIKU__]: Disable __BEOS__ workarounds.
+
+2008-05-23 Bruno Haible <bruno@clisp.org>
+
+ Improve support for ACLs on OSF/1.
+ * lib/acl.c (qset_acl): For OSF/1, use a string that ends in a comma.
+ Remove fallback for unknown flavors of ACLs.
+
+2008-05-22 Bruno Haible <bruno@clisp.org>
+
+ Add support for ACLs on OSF/1.
+ * lib/acl-internal.h (acl_get_fd, acl_set_fd): New inline function
+ replacements.
+ (acl_free_text): New macro fallback.
+ * lib/acl_entries.c (acl_entries): Use acl_free_text instead of
+ acl_free.
+ * m4/acl.m4 (gl_FUNC_ACL): Look also in libpacl library. Test for
+ acl_free_text function. Require AC_C_INLINE.
+
+2008-05-22 Bruno Haible <bruno@clisp.org>
+
+ Make copy_acl work on MacOS X 10.5.
+ * lib/acl-internal.h (MODE_INSIDE_ACL): New macro.
+ (ACL_NOT_WELL_SUPPORTED): On MacOS X, also handle ENOENT.
+ * lib/acl.c (qset_acl): Add different code branch for !MODE_INSIDE_ACL.
+ If MODE_INSIDE_ACL, don't assume that every system has the same text
+ representation for ACLs as FreeBSD.
+ * lib/copy-acl.c (copy_acl): Add support for platforms with
+ !MODE_INSIDE_ACL.
+ * lib/file-has-acl.c (file_has_acl): Likewise.
+ * m4/acl.m4 (gl_FUNC_ACL): Test for some functions that are witness of
+ FreeBSD, MacOS X, or IRIX, respectively.
+
+2008-05-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl.h: Don't include <sys/acl.h>.
+ (GETACLCNT): Move fallback to lib/acl-internal.h.
+ * lib/acl-internal.h: Include <sys/acl.h> here.
+ (GETACLCNT): New macro fallback, moved here from lib/acl.h.
+
+2008-05-22 Bruno Haible <bruno@clisp.org>
+
+ Split off copy_acl function to separate file.
+ * lib/copy-acl.c: New file, extracted from lib/acl.c.
+ * lib/acl.c (copy_acl): Moved function to separate file.
+ * m4/acl.m4 (gl_FUNC_ACL): Remove unconditional AC_LIBOBJs.
+ * modules/acl (Files): Add lib/copy-acl.c.
+ (Makefiles.am): Augment lib_SOURCES.
+
+2008-05-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/copy-file-tests: New file.
+ * tests/test-copy-file.sh: New file.
+ * tests/test-copy-file.c: New file.
+ * tests/test-copy-file-sameacls.c: New file.
+
+2008-05-22 Eric Blake <ebb9@byu.net>
+
+ Avoid gcc warning.
+ * tests/test-memcmp.c (main): Pass NULL indirectly.
+
+2008-05-21 Bruno Haible <bruno@clisp.org>
+
+ Add reference doc about ACLs.
+ * doc/acl-resources.txt: New file.
+ * doc/acl-cygwin.txt: New file.
+
+2008-05-21 Bruno Haible <bruno@clisp.org>
+
+ Avoid one more warning from gcc.
+ * lib/vasnprintf.c (IF_LINT): Update comments.
+ (VASNPRINTF): Use it also for the 'prefix' array initializer.
+
+2008-05-21 Jim Meyering <meyering@redhat.com>
+
+ avoid a warning from gcc
+ * lib/vasnprintf.c (IF_LINT): Define.
+ (scale10_round_decimal_long_double):
+ Use it to avoid a "may be used uninitialized" warning.
+ (scale10_round_decimal_double): Likewise.
+
+2008-05-21 Simon Josefsson <simon@josefsson.org>
+
+ * m4/memcmp.m4: When cross-compiling, assume memcmp works if it is
+ declared.
+
+2008-05-20 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-memcmp.c (main): Test also the sign of the result. Test
+ against two known bugs; code taken from autoconf's AC_FUNC_MEMCMP.
+
+2008-05-20 Simon Josefsson <simon@josefsson.org>
+
+ * modules/memcmp-tests: New file.
+ * tests/test-memcmp.c: New file.
+
+2008-05-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/propername (Notice, configure.ac): Put quoted "..." into
+ --keyword option.
+ * lib/propername.h: Update comments accordingly.
+ Reported by Eric Blake.
+
+2008-05-19 Martin Lambers <marlam@marlam.de> (tiny change)
+
+ * modules/getpass-gnu (Depends-on): Add fseeko.
+
+2008-05-19 Simon Josefsson <simon@josefsson.org>
+
+ * modules/base64-tests: New file.
+
+2008-05-19 Bo Borgerson <gigabo@gmail.com>
+
+ * lib/base64.c (base64_decode_ctx): If a decode context structure
+ was passed in use it to ignore newlines. If a context structure
+ was _not_ passed in, continue to treat newlines as garbage (this
+ is the historical behavior). Formerly base64_decode.
+ (base64_decode_alloc_ctx): Formerly base64_decode_alloc. Now
+ takes a decode context structure.
+ * lib/base64.h (base64_decode): Macro for four-argument calls.
+ (base64_decode_alloc): Likewise.
+ * lib/base64.c (base64_decode_ctx): If a decode context structure
+ was passed in use it to ignore newlines. If a context structure
+ was _not_ passed in, continue to treat newlines as garbage (this
+ is the historical behavior). Formerly base64_decode.
+ (base64_decode_alloc_ctx): Formerly base64_decode_alloc. Now
+ takes a decode context structure.
+ * lib/base64.h (base64_decode): Macro for four-argument calls.
+ (base64_decode_alloc): Likewise.
+
+2008-05-19 Jim Meyering <meyering@redhat.com>
+
+ avoid a warning from gcc
+ * lib/trim.c (IF_LINT): Define.
+ (trim2): Use it to avoid a "may be used uninitialized" warning.
+
+ Fix doc typo.
+ * doc/glibc-functions/getpass.texi (getpass): s/PATH_MAX/PASS_MAX/.
+
+2008-05-19 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/getpass.texi: Document limits of other
+ implementations.
+
+2008-05-19 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/getpass.texi: Document gnulib implementation.
+
+2008-05-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/propername: New file, from GNU gettext.
+ * lib/propername.h: New file, from GNU gettext.
+ * lib/propername.c: New file, from GNU gettext.
+ * MODULES.html.sh (Internationalization functions): Add propername.
+
+2008-05-16 Jim Meyering <meyering@redhat.com>
+ Bruno Haible <bruno@clisp.org>
+
+ Avoid some warnings from "gcc -Wshadow".
+ * lib/vasnprintf.c (exp, remainder): Define to different identifiers.
+
+2008-05-15 Eric Blake <ebb9@byu.net>
+
+ Extend previous patch to cygwin 1.7.0.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): When cross-compiling, assume a
+ fast implementation in cygwin >= 1.7.0.
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Likewise.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR): Likewise.
+
+2008-05-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): When cross-compiling, assume a fast
+ implementation in glibc >= 2.9.
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Likewise.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR): Likewise.
+
+2008-05-15 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Internationalization functions): Remove linebreak.
+ (Unicode string functions): Add unilbrk/*.
+ Reported by Karl Berry.
+
+2008-05-15 Eric Blake <ebb9@byu.net>
+
+ Fix violation of <stdbool.h> replacement in regex.
+ * lib/regcomp.c (re_compile_internal): Avoid implicit cast to bool.
+ * lib/regexec.c (re_search_internal): Likewise.
+ Reported by Heinrich Mislik <Heinrich.Mislik@univie.ac.at>.
+
+2008-05-15 Jim Meyering <meyering@redhat.com>
+
+ avoid distracting test output when git or cvs is not found
+ * tests/test-vc-list-files-cvs.sh: Suppress 'init' error output.
+ * tests/test-vc-list-files-git.sh: Likewise.
+
+2008-05-15 Eric Blake <ebb9@byu.net>
+
+ Glibc finally accepted the memmem speedup code, bugzilla #5514.
+ * doc/glibc-functions/memmem.texi (memmem): Mention last broken
+ glibc version.
+ * doc/glibc-functions/strcasestr.texi (strcasestr): Likewise.
+ * doc/posix-functions/strstr.texi (strstr): Likewise.
+ * lib/str-two-way.h (MAX): Sychronize with glibc.
+
+2008-05-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/regcomp.c (optimize_utf8): Add a note on why we test
+ opr.ctx_type.
+ (calc_first): Initialize constraint field.
+ (duplicate_node_closure): Use it instead of special casing ANCHORS.
+ Fix grammar.
+ (duplicate_node): Merge constraint field for all node types.
+ (calc_eclosure_iter): Look at constraint field for all node types.
+ * lib/regex_internal.c (create_cd_newstate): Don't look at
+ opr.ctx_type.
+
+2008-05-14 Bruno Haible <bruno@clisp.org>
+
+ Help GCC to do better code generation.
+ * lib/eealloc.h (eemalloc) [GCC >= 3]: Declare with attribute 'malloc'.
+ * lib/pagealign_alloc.h (pagealign_alloc, pagealign_xalloc): Likewise.
+ * lib/xalloc.h (ATTRIBUTE_MALLOC): New macro.
+ (xmalloc, xzalloc, xcalloc, xmemdup, xstrdup, xnmalloc, xcharalloc):
+ Declare with attribute 'malloc' if supported.
+
+2008-05-14 Lasse Collin <lasse.collin@tukaani.org>
+
+ use "echo STR|wc -c" rather than unportable "expr length STR"
+ * build-aux/mktempd (mktempd): Vendor-supplied expr from at least
+ OpenBSD 4.3 and Solaris 10 do not honor expr's "length" function.
+
+2008-05-14 Jim Meyering <meyering@redhat.com>
+
+ use dd ibs=$n count=1 ... rather than less-portable head -c$n
+ * build-aux/mktempd (rand_bytes): head's -cN option is not accepted
+ by Solaris 10's /bin/head or by the one from HP-UX 11.x.
+ Reported in http://sourceforge.net/forum/message.php?msg_id=4960334
+ via Collin Lasse.
+
+2008-05-14 Eric Blake <ebb9@byu.net>
+
+ Avoid quadratic growth in gl_LIBSOURCES.
+ * gnulib-tool (func_emit_initmacro_done): s/\(m4_append\)_uniq/\1/.
+ Suggested by Bruno Haible.
+
+ Test xmemdup0.
+ * modules/xmemdup0-tests: New file.
+ * tests/test-xmemdup0.c: Likewise.
+
+2008-05-13 Eric Blake <ebb9@byu.net>
+
+ Split xmemdup0 into its own module.
+ * modules/xmemdup0: New file.
+ * lib/xmemdup0.h: Likewise.
+ * lib/xmemdup0.c: Likewise.
+ * MODULES.html.sh (Memory management functions): Add xmemdup0.
+ * lib/xalloc.h (xmemdup0): Remove.
+ * lib/xmalloc.c (xmemdup0): Likewise.
+
+2008-05-13 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ Reduce number of forks required during autoconf.
+ * gnulib-tool (func_emit_initmacro_start): Prepare gl_LIBSOURCES_LIST
+ and gl_LIBSOURCES_DIR.
+ (func_emit_initmacro_end): Use them here in a single m4_syscmd...
+ (func_emit_initmacro_done) <gl_LIBSOURCES>: ...rather than in one
+ m4_syscmd per file.
+ <m4_foreach_w>: Move...
+ * m4/gnulib-common.m4 (m4_foreach_w): ...here.
+
+2008-05-13 Eric Blake <ebb9@byu.net>
+
+ * gnulib-tool: Fix various comment typos.
+
+2008-05-12 Bruno Haible <bruno@clisp.org>
+
+ Tailor the linebreaking algorithm.
+ * lib/unilbrk/tables.c (unilbrk_table): Change (IS,AL) entry.
+
+2008-05-12 Bruno Haible <bruno@clisp.org>
+
+ Update to Unicode 5.0.0.
+ * lib/unilbrk/tables.h (LBP_*): Add LBP_WJ, LBP_H2, LBP_H3, LBP_JL,
+ LBP_JV, LBP_JT. Redistribute values.
+ (unilbrk_table): Change size.
+ * lib/unilbrk/tables.c (unilbrk_table): Change size. Update to match
+ Unicode TR#14 rev. 22.
+ * lib/unilbrk/gen-lbrk.c (LBP_*): Add LBP_WJ, LBP_H2, LBP_H3, LBP_JL,
+ LBP_JV, LBP_JT. Redistribute values.
+ (get_lbp): Update to match Unicode TR#14 rev. 21/22 and Unicode 5.0.0.
+ (debug_output_lbp, fill_org_lbp, debug_output_org_lbp, output_lbp):
+ Update.
+ * lib/unilbrk/lbrkprop1.h: Regenerated.
+ * lib/unilbrk/lbrkprop2.h: Regenerated.
+ * lib/unilbrk/u8-possible-linebreaks.c (u8_possible_linebreaks):
+ Change handling of LBP_CM after LBP_ZW. Update for new value of LBP_BK.
+ * lib/unilbrk/u16-possible-linebreaks.c (u16_possible_linebreaks):
+ Likewise.
+ * lib/unilbrk/u32-possible-linebreaks.c (u32_possible_linebreaks):
+ Likewise.
+ * tests/unilbrk/test-u8-possible-linebreaks.c (main): Update expected
+ result.
+ * tests/unilbrk/test-u16-possible-linebreaks.c (main): Likewise.
+ * tests/unilbrk/test-u32-possible-linebreaks.c (main): Likewise.
+ * tests/unilbrk/test-ulc-possible-linebreaks.c (main): Likewise.
+ * tests/unilbrk/test-u8-width-linebreaks.c (main): Likewise.
+ * tests/unilbrk/test-u16-width-linebreaks.c (main): Likewise.
+ * tests/unilbrk/test-u32-width-linebreaks.c (main): Likewise.
+
+2008-05-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/unilbrk/gen-lbrk.c (output_lbp): Fix whitespace.
+
+2008-05-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/unilbrk/gen-lbrk.c: New file, from GNU gettext (gen-lbrkprop.c).
+ * modules/unilbrk/gen-lbrk: New file.
+
+2008-05-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/sha256.m4 (gl_SHA256): Require AC_C_INLINE.
+ * m4/sha512.m4 (gl_SHA512): Likewise.
+
+2008-05-11 Jim Meyering <meyering@redhat.com>
+
+ New modules: crypto/sha256, crypto/sha512 (from coreutils)
+ * modules/crypto/sha256: New file.
+ * modules/crypto/sha512: Likewise.
+ * lib/sha256.c: Likewise.
+ * lib/sha256.h: Likewise.
+ * lib/sha512.c: Likewise.
+ * lib/sha512.h: Likewise.
+ * lib/u64.h: Likewise.
+ * m4/sha256.m4: Likewise.
+ * m4/sha512.m4: Likewise.
+ * MODULES.html.sh (Cryptographic computations (low-level)): List them.
+
+2008-05-10 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Environment variables <stdlib.h>): Add unsetenv.
+ (Input/Output <stdio.h>): Add xprintf.
+ (Signal handling <signal.h>): Add strsignal.
+ (Cryptographic computations (high-level)): Add crypto/gc-camellia.
+ (Core language properties): Add func.
+ (Mathematics <math.h>): Add ceil, floor, frexp-nolibm.
+ (Support for systems lacking POSIX:2001): Add environ, EOVERFLOW,
+ strings.
+ (Enhancements for POSIX:2001 functions): Add iconv_open-utf.
+ (Input/output): New section.
+ (File system functions): Add openat-die, stat-macros.
+ (Networking functions): Add sockets.
+ (Unicode string functions): Add unictype/*.
+ (Support for building libraries and executables): Add gperf.
+ (Support for building documentation): Add agpl-3.0.
+ (Misc): Add nocrash.
+
+2008-05-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/unictype/gen-ctype: New file.
+
+2008-05-10 Jim Meyering <meyering@redhat.com>
+
+ Make chdir-safer.c more efficient on a system with no symlinks.
+ * lib/chdir-safer.c (chdir_no_follow): Skip lstat and fstat calls
+ also if ELOOP is zero. Suggested by Bruno Haible.
+
+ Make chdir-safer.c slightly safer.
+ * lib/chdir-safer.c (chdir_no_follow): Test HAVE_WORKING_O_NOFOLLOW,
+ not O_NOFOLLOW, in case the latter is nonzero and open ignores it.
+
+ Avoid compile failure on systems without ELOOP (like mingw).
+ * lib/chdir-safer.c (ELOOP): Define if not already defined.
+ Reported by Bruno Haible.
+
+2008-05-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/unilbrk/ulc-common.c: Include c-strcaseeq.h instead of streq.h.
+ (is_utf8_encoding): Use a case-insensitive comparison.
+ * modules/unilbrk/ulc-common (Depends-on): Add c-strcaseeq. Remove
+ streq.
+
+2008-05-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/unilbrk/ulc-common.c: Don't include <stdlib.h>.
+ (iconv_string_length, iconv_string_keeping_offsets): Remove functions.
+ * lib/unilbrk/ulc-common.h (iconv_string_length,
+ iconv_string_keeping_offsets): Remove declarations.
+ * lib/unilbrk/ulc-possible-linebreaks.c: Include <string.h>, uniconv.h.
+ Don't include <iconv.h>, streq.h, xsize.h.
+ (ulc_possible_linebreaks): Use u8_conv_from_encoding for doing the
+ conversion.
+ * lib/unilbrk/ulc-width-linebreaks.c: Include uniconv.h. Don't include
+ <iconv.h>, streq.h, xsize.h.
+ (ulc_width_linebreaks): Use u8_conv_from_encoding for doing the
+ conversion.
+ * modules/unilbrk/ulc-common (Depends-on): Remove iconv.
+ * modules/unilbrk/ulc-possible-linebreaks (Depends-on): Add
+ uniconv/u8-conv-from-enc. Remove iconv_open, streq, xsize.
+ * modules/unilbrk/ulc-width-linebreaks (Depends-on): Likewise.
+
+2008-05-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/unilbrk/ulc-width-linebreaks-tests: New file.
+ * tests/unilbrk/test-ulc-width-linebreaks.c: New file.
+
+ * modules/unilbrk/u32-width-linebreaks-tests: New file.
+ * tests/unilbrk/test-u32-width-linebreaks.c: New file.
+
+ * modules/unilbrk/u16-width-linebreaks-tests: New file.
+ * tests/unilbrk/test-u16-width-linebreaks.c: New file.
+
+ * modules/unilbrk/u8-width-linebreaks-tests: New file.
+ * tests/unilbrk/test-u8-width-linebreaks.c: New file.
+
+ * modules/unilbrk/ulc-possible-linebreaks-tests: New file.
+ * tests/unilbrk/test-ulc-possible-linebreaks.c: New file.
+
+ * modules/unilbrk/u32-possible-linebreaks-tests: New file.
+ * tests/unilbrk/test-u32-possible-linebreaks.c: New file.
+
+ * modules/unilbrk/u16-possible-linebreaks-tests: New file.
+ * tests/unilbrk/test-u16-possible-linebreaks.c: New file.
+
+ * modules/unilbrk/u8-possible-linebreaks-tests: New file.
+ * tests/unilbrk/test-u8-possible-linebreaks.c: New file.
+
+2008-05-10 Bruno Haible <bruno@clisp.org>
+
+ Split up 'linebreak' module.
+ * lib/unilbrk.h: New file, based on lib/linebreak.h.
+ * lib/unilbrk/lbrkprop1.h: New file, extracted from lib/lbrkprop.h.
+ * lib/unilbrk/lbrkprop2.h: New file, renamed from lib/lbrkprop.h with
+ modifications.
+ * lib/unilbrk/tables.h: New file, extracted from lib/linebreak.c.
+ * lib/unilbrk/tables.c: New file, extracted from lib/linebreak.c.
+ * lib/unilbrk/u8-possible-linebreaks.c: New file, extracted from
+ lib/linebreak.c.
+ * lib/unilbrk/u16-possible-linebreaks.c: New file, extracted from
+ lib/linebreak.c.
+ * lib/unilbrk/u32-possible-linebreaks.c: New file, extracted from
+ lib/linebreak.c.
+ * lib/unilbrk/ulc-common.h: New file, extracted from lib/linebreak.c.
+ * lib/unilbrk/ulc-common.c: New file, extracted from lib/linebreak.c.
+ * lib/unilbrk/ulc-possible-linebreaks.c: New file, extracted from
+ lib/linebreak.c.
+ * lib/unilbrk/u8-width-linebreaks.c: New file, extracted from
+ lib/linebreak.c.
+ * lib/unilbrk/u16-width-linebreaks.c: New file, extracted from
+ lib/linebreak.c.
+ * lib/unilbrk/u32-width-linebreaks.c: New file, extracted from
+ lib/linebreak.c.
+ * lib/unilbrk/ulc-width-linebreaks.c: New file, extracted from
+ lib/linebreak.c.
+ * modules/unilbrk/base: New file.
+ * modules/unilbrk/tables: New file.
+ * modules/unilbrk/u8-possible-linebreaks: New file.
+ * modules/unilbrk/u16-possible-linebreaks: New file.
+ * modules/unilbrk/u32-possible-linebreaks: New file.
+ * modules/unilbrk/ulc-common: New file.
+ * modules/unilbrk/ulc-possible-linebreaks: New file.
+ * modules/unilbrk/u8-width-linebreaks: New file.
+ * modules/unilbrk/u16-width-linebreaks: New file.
+ * modules/unilbrk/u32-width-linebreaks: New file.
+ * modules/unilbrk/ulc-width-linebreaks: New file.
+ * lib/linebreak.h: Remove file.
+ * lib/linebreak.c: Remove file.
+ * m4/linebreak.m4: Remove file.
+ * modules/linebreak: Remove file.
+ * NEWS: Mention the changes.
+
+2008-05-09 Eric Blake <ebb9@byu.net>
+
+ Add xmemdup0.
+ * lib/xalloc.h (xmemdup0): New prototype and C++ typesafe
+ implementation.
+ * lib/xmalloc.c (xmemdup0): New C implementation.
+
+2008-05-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/wctype.m4 (gl_WCTYPE_H): Correct indentation.
+
+2008-05-07 Eric Blake <ebb9@byu.net>
+
+ Support cross-compilation of <wctype.h>.
+ * m4/wctype.m4 (gl_WCTYPE_H): Fix improper nesting in
+ AC_CACHE_CHECK.
+
+2008-05-06 Soren Hansen <soren@ubuntu.com> (tiny change)
+
+ * build-aux/vc-list-files: Add support for bzr.
+
+2008-05-03 Jim Meyering <meyering@redhat.com>
+
+ avoid failed assertion with tight malloc
+ * tests/test-getndelim2.c: Correct an off-by-one assertion.
+
+2008-05-03 Simon Josefsson <simon@josefsson.org>
+
+ * m4/inet_pton.m4: Set HAVE_DECL_INET_PTON to 0 when declarations
+ are needed from arpa/inet.h.
+ * m4/inet_ntop.m4: Likewise, for HAVE_DECL_INET_NTOP.
+ Reported by Bruno Haible.
+
+2008-05-02 Jim Meyering <meyering@redhat.com>
+
+ avoid compilation error on FreeBSD 6
+ * tests/test-getaddrinfo.c [!defined EAI_NODATA] (EAI_NODATA): Define.
+
+2008-05-01 Jim Meyering <meyering@redhat.com>
+
+ useless-if-before-free: correct --help's exit status description
+ * build-aux/useless-if-before-free (usage): Like grep, exit 0
+ for one or more matches, etc. Reported by Bruno Haible.
+
+ vc-list-files: make the stand-alone gnulib test work
+ * modules/vc-list-files-tests (configure.ac):
+ Define and AC_SUBST abs_aux_dir.
+ (Makefile.am) [TESTS_ENVIRONMENT]: Rather than passing
+ $(abs_top_srcdir) to each script and having each of them
+ duplicate the work of setting PATH, set PATH here, using
+ the new variable, abs_aux_dir instead.
+ * tests/test-vc-list-files-cvs.sh: Don't set PATH here.
+ * tests/test-vc-list-files-git.sh: Likewise.
+ Reported by Bruno Haible.
+
+2008-05-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/getndelim2.c (getndelim2): Fix newsize computation during
+ reallocation. Rename 'done' to 'found_delimiter'.
+
+2008-05-01 Jim Meyering <meyering@redhat.com>
+
+ vc-list-files: accommodate /bin/sh like the one from Solaris 10
+ * build-aux/vc-list-files: Use `...`, not $(...).
+
+2008-04-30 Jim Meyering <meyering@redhat.com>
+
+ add tests for vc-list-files
+ * modules/vc-list-files-tests: New module.
+ * tests/test-vc-list-files-cvs.sh: New file.
+ * tests/test-vc-list-files-git.sh: New file.
+
+ avoid a warning from gcc
+ * lib/getndelim2.c (IF_LINT): Define.
+ (getndelim2): Use it to avoid a "may be used uninitialized" warning.
+
+ vc-list-files: work properly with build-aux/cvsu, too
+ * build-aux/vc-list-files: Hoist the "./"-removing code to apply
+ to all cvs-based clauses.
+
+ vc-list-files: work properly in the CVS+awk case, too
+ * build-aux/vc-list-files: In the CVS+awk case, remove "./" prefix.
+
+ vc-list-files: avoid use of ${*-*} that fails when /bin/sh is dash
+ * build-aux/vc-list-files: Simplify ${*-*} to $dir, since we no longer
+ take more than one file argument, so . Add quotes, just in case $dir
+ ever contains a shell meta-character. Prompted by Soren Hansen in
+ <http://thread.gmane.org/gmane.comp.emulators.libvirt/6221/focus=6240>.
+
+2008-04-29 Eric Blake <ebb9@byu.net>
+
+ Optimize getndelim2 to use block operations when possible.
+ * modules/getndelim2 (Depends-on): Add stdbool, freadptr,
+ freadseek, and memchr2.
+ * lib/getndelim2.c (getndelim2): Use them for block reads.
+
+2008-04-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/inet_ntop.m4 (gl_INET_NTOP): Require gl_USE_SYSTEM_EXTENSIONS.
+ * m4/inet_pton.m4 (gl_INET_PTON): Likewise.
+ * modules/inet_ntop (Depends-on): Add extensions.
+ * modules/inet_pton (Depends-on): Likewise.
+ Reported by Simon Josefsson.
+
+2008-04-29 Jim Meyering <meyering@redhat.com>
+
+ When the is more than one match in a block, match all of them.
+ * build-aux/useless-if-before-free: Iterate through each block
+ until there are no more matches.
+
+ Fix broken useless-if-before-free script.
+ * build-aux/useless-if-before-free: Fix typo: missing "?" after
+ the expression to match cast of argument to free-like function.
+
+2008-04-29 Eric Blake <ebb9@byu.net>
+
+ Use new header.
+ * lib/getaddrinfo.c (includes): s/"inet_ntop.h"/<arpa/inet.h>/.
+
+2008-04-29 Jim Meyering <meyering@redhat.com>
+
+ Avoid test segfault on x86_64 due to lack of inet_ntop declaration.
+ * tests/test-getaddrinfo.c: Include <arpa/inet.h>, now guaranteed
+ by gnulib to exist and to declare e.g., inet_ntop.
+ Don't include "inet_ntop.h", now removed.
+
+ * m4/arpa_inet_h.m4: Remove trailing blanks.
+
+2008-04-29 Eric Blake <ebb9@byu.net>
+
+ Silence valgrind on safe reads beyond potential array bounds.
+ * lib/rawmemchr.valgrind: New file.
+ * lib/strchrnul.valgrind: Likewise.
+ * modules/rawmemchr (Files): Distribute new file.
+ * modules/strchrnul (Files): Likewise.
+ Suggested by Bruno Haible.
+
+2008-04-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/arpa_inet.in.h: Include system's <arpa/inet.h> if it exists.
+ (inet_ntop, inet_pton): Change portability warning's wording.
+ * m4/arpa_inet_h.m4 (gl_HEADER_ARPA_INET): Set HAVE_ARPA_INET_H.
+ Invoke gl_CHECK_NEXT_HEADERS.
+ (gl_ARPA_INET_H_DEFAULTS): Initialize ARPA_INET_H.
+ * m4/inet_ntop.m4 (gl_INET_NTOP): Require gl_ARPA_INET_H_DEFAULTS and
+ set ARPA_INET_H.
+ * m4/inet_pton.m4 (gl_INET_PTON): Likewise.
+ * modules/arpa_inet (Description): No longer only for systems that
+ lack it.
+ (Depends-on): Add include_next.
+ (Makeile.am): Substitute INCLUDE_NEXT, NEXT_ARPA_INET_H,
+ HAVE_ARPA_INET_H.
+
+2008-04-29 Jim Meyering <meyering@redhat.com>
+
+ * modules/mkdir (License): Re-license as LGPLv2+.
+
+2008-04-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/rawmemchr (Maintainer): Set to Eric.
+ * modules/strchrnul (Maintainer): Likewise.
+
+2008-04-29 Simon Josefsson <simon@josefsson.org>
+
+ * m4/arpa_inet_h.m4 (gl_ARPA_INET_H_DEFAULTS): Set
+ HAVE_DECL_INET_NTOP and HAVE_DECL_INET_PTON.
+
+ * modules/arpa_inet (arpa/inet.h): Use them.
+
+2008-04-28 Eric Blake <ebb9@byu.net>
+
+ Test getndelim2.
+ * modules/getndelim2-tests: New file.
+ * tests/test-getndelim2.c: Likewise.
+ * lib/getndelim2.c (getndelim2): Never return 0. Lock the
+ stream.
+ * m4/getndelim2.m4 (gl_GETNDELIM2): Check for lock functions.
+
+ * MODULES.html.sh: Document new module.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-stack.c (die): Use raise.
+ * modules/c-stack (Depends-on): Add raise.
+
+2008-04-28 Bruno Haible <bruno@clisp.org>
+
+ Expect rpmatch to be declared.
+ * lib/yesno.c (rpmatch): Remove declaration.
+
+ Declare rpmatch.
+ * lib/stdlib.in.h (rpmatch): New declaration.
+ * lib/rpmatch.c: Include <stdlib.h> first.
+ * m4/rpmatch.m4 (gl_FUNC_RPMATCH): Require AC_USE_SYSTEM_EXTENSIONS and
+ gl_STDLIB_H_DEFAULTS. Set HAVE_RPMATCH.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_RPMATCH,
+ HAVE_RPMATCH.
+ * modules/rpmatch (Depends-on): Add stdlib, extensions.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR.
+ (Include): Set to <stdlib.h>.
+ * modules/stdlib (Makefile.am): Substitute GNULIB_RPMATCH and
+ HAVE_RPMATCH.
+ * NEWS: Document the change.
+
+2008-04-28 Bruno Haible <bruno@clisp.org>
+
+ Change rpmatch to use nl_langinfo when appropriate.
+ * lib/rpmatch.c: Include stdbool.h, string.h, langinfo.h.
+ (N_): New macro.
+ (localized_pattern): New function/macro.
+ (try): Remove match, nomatch arguments. Copy the pattern into safe
+ memory before caching it.
+ (rpmatch): Use localized_pattern. Add translator comments.
+ * m4/rpmatch.m4 (gl_PREREQ_RPMATCH): Test for nl_langinfo and YESEXPR.
+ Suggested by Eric Blake.
+ * modules/rpmatch (Depends-on): Add stdbool.
+
+2008-04-28 Eric Blake <ebb9@byu.net>
+
+ Add rawmemchr module, matching glibc.
+ * modules/string (Makefile.am): New indicator.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Set it.
+ * lib/string.in.h (rawmemchr): Declare when appropriate.
+ * modules/rawmemchr: New file.
+ * m4/rawmemchr.m4: Likewise.
+ * lib/rawmemchr.c: Likewise.
+ * modules/rawmemchr-tests: Likewise.
+ * tests/test-rawmemchr.c: Likewise.
+ * doc/glibc-functions/rawmemchr.texi (rawmemchr): Document
+ module.
+ * modules/strchrnul (Depends-on): Add rawmemchr.
+ * lib/strchrnul.c (strchrnul): Optimize a corner case.
+
+ Whitespace cleanup.
+ * tests/test-strchrnul.c: Reindent.
+ * lib/strchrnul.c: Likewise.
+
+ Optimize and test strchrnul.
+ * lib/strchrnul.c (strchrnul): Rewrite to do parallel search.
+ * modules/strchrnul-tests: New file.
+ * tests/test-strchrnul.c: Likewise.
+
+ Remove intprops dependency.
+ * modules/memchr (Depends-on): Remove intprops.
+ * modules/memrchr (Depends-on): Likewise.
+ * modules/memchr2 (Depends-on): Likewise.
+ * lib/memchr.c (__memchr): Hand-inline the TYPE_MAXIMUM check.
+ * lib/memrchr.c (__memrchr): Likewise.
+ * lib/memrchr2.c (memchr2): Likewise.
+ Reported by Simon Josefsson.
+
+2008-04-28 Simon Josefsson <simon@josefsson.org>
+
+ * m4/sys_socket_h.m4: Move AC_REQUIRE([AC_C_INLINE]) to top.
+ Suggested by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2008-04-28 Simon Josefsson <simon@josefsson.org>
+
+ * lib/inet_ntop.h, lib/inet_pton.h: Remove files.
+
+ * lib/inet_ntop.c: Include arpa/inet.h instead of inet_ntop.h.
+
+ * lib/inet_pton.c: Include arpa/inet.h instead of inet_pton.h.
+
+ * lib/arpa_inet.in.h [@GNULIB_INET_NTOP@]: Inline inet_ntop.h
+ declarations.
+ [@GNULIB_INET_PTON@]: Inline inet_pton.h declarations.
+
+ * m4/inet_pton.m4: Don't check for header files.
+
+ * m4/inet_ntop.m4: Don't check for header files.
+
+2008-04-28 Simon Josefsson <simon@josefsson.org>
+
+ * m4/sys_socket_h.m4: Require AC_C_INLINE when necessary.
+ * lib/sys_socket.in.h (setsockopt): Use proper win32 tests (don't
+ trigger for cygwin).
+ Reported by Bruno Haible <bruno@clisp.org>.
+
+2008-04-28 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/strdup.texi: Mention mingw problem.
+
+2008-04-27 Bruno Haible <bruno@clisp.org>
+
+ * modules/stat-time-tests (Depends-on): Add sleep.
+ * tests/test-stat-time.c (force_unlink): New function.
+ (cleanup): Use it.
+ (test_mtime): Remove the ctime related tests.
+ (test_ctime): New function, containing the ctime related tests.
+ (main): Call test_ctime, except on native Windows platforms.
+
+2008-04-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/rpmatch.c (rpmatch): Add some comments.
+ Reported by James Youngman <jay@gnu.org>.
+
+2008-04-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanl.m4 (gl_FUNC_ISNANL_WORKS): Also test the behaviour on
+ quiet NaNs.
+
+2008-04-27 Bruno Haible <bruno@clisp.org>
+
+ Make test-yesno.sh work on mingw.
+ * tests/test-yesno.sh: Postprocess the output to convert CR/LF to LF.
+ * tests/test-yesno.c: Include yesno.h first. Include binary-io.h.
+ (main): Set stdin to binary mode.
+ * modules/yesno-tests (Depends-on): Add binary-io.
+
+2008-04-27 Bruno Haible <bruno@clisp.org>
+
+ Fix 'isfinite' on x86, x86_64, ia64 platforms.
+ * tests/test-isfinite.c (test_isfinitel): Also test the behavior on
+ argument that lie outside the IEEE 854 domain.
+ * m4/isfinite.m4 (gl_ISFINITEL_WORKS): New macro.
+ (gl_ISFINITE): Use it.
+ * doc/posix-functions/isfinite.texi: Document the fixed bugs.
+
+2008-04-27 Bruno Haible <bruno@clisp.org>
+
+ Allow local renaming in config.h.
+ * lib/memrchr.c (memrchr): Don't undefine outside libc.
+
+2008-04-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/memchr.c (__memchr): Change type of 'i'.
+ * lib/memchr2.c (memchr2): Likewise.
+
+2008-04-26 Eric Blake <ebb9@byu.net>
+ and Bruno Haible <bruno@clisp.org>
+
+ Optimize and test memrchr.
+ * modules/memrchr (Depends-on): Add intprops.
+ * lib/memrchr.c (__memrchr): Avoid false positives in loop.
+ * modules/memrchr-tests: New file.
+ * tests/test-memrchr.c: New file.
+
+2008-04-26 Bruno Haible <bruno@clisp.org>
+
+ Add tentative support for DragonFly BSD.
+ * lib/stdio-impl.h: Add macros for DragonFly BSD.
+ * lib/fbufmode.c (fbufmode): Update conditionals. Use fp_ instead of
+ fp.
+ * lib/fflush.c (clear_ungetc_buffer, disable_seek_optimization,
+ restore_seek_optimization, update_fpos_cache, rpl_fflush: Likewise.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/freadable.c (freaadable): Likewise.
+ * lib/freadahead.c (freadahead): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/freadptr.c (freadptr): Likewise.
+ * lib/freadseek.c (freadptrinc): Likewise.
+ * lib/fseeko.c (fseeko): Likewise.
+ * lib/fseterr.c (fseterr): Likewise.
+ * lib/fwritable.c (fwritable): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+
+2008-04-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio-impl.h: New file.
+ * lib/fbufmode.c: Include stdio-impl.h.
+ (fbufmode): Use fp_, remove redundant #defines.
+ * lib/fflush.c: Include stdio-impl.h.
+ (clear_ungetc_buffer): Remove redundant #defines.
+ * lib/fpurge.c: Include stdio-impl.h.
+ (fpurge): Remove redundant #defines.
+ * lib/freadable.c: Include stdio-impl.h.
+ (freadable): Remove redundant #defines.
+ * lib/freadahead.c: Include stdio-impl.h.
+ (freadahead): Remove redundant #defines.
+ * lib/freading.c: Include stdio-impl.h.
+ (freading): Remove redundant #defines.
+ * lib/freadptr.c: Include stdio-impl.h.
+ (freadptr): Remove redundant #defines.
+ * lib/freadseek.c: Include stdio-impl.h.
+ (freadptrinc): Remove redundant #defines.
+ * lib/fseeko.c: Include stdio-impl.h.
+ (rpl_fseeko): Remove redundant #defines.
+ * lib/fseterr.c: Include stdio-impl.h.
+ (fseterr): Remove redundant #defines.
+ * lib/fwritable.c: Include stdio-impl.h.
+ (fwritable: Remove redundant #defines.
+ * lib/fwriting.c: Include stdio-impl.h.
+ (fwriting): Remove redundant #defines.
+ * modules/fbufmode (Files): Add lib/stdio-impl.h.
+ * modules/fflush (Files): Likewise.
+ * modules/fpurge (Files): Likewise.
+ * modules/freadable (Files): Likewise.
+ * modules/freadahead (Files): Likewise.
+ * modules/freading (Files): Likewise.
+ * modules/freadptr (Files): Likewise.
+ * modules/freadseek (Files): Likewise.
+ * modules/fseeko (Files): Likewise.
+ * modules/fseterr (Files): Likewise.
+ * modules/fwritable (Files): Likewise.
+ * modules/fwriting (Files): Likewise.
+
+2008-04-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/fflush.c (clear_ungetc_buffer, disable_seek_optimization,
+ restore_seek_optimization, update_fpos_cache): New functions, extracted
+ from rpl_fflush.
+ (rpl_fflush): Use them.
+ * m4/fflush.m4 (gl_PREREQ_FFLUSH): New macro.
+ (gl_REPLACE_FFLUSH): Use it.
+
+2008-04-26 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-xstrtol.sh: Work around limitation of an old 'tr' program
+ on Solaris.
+ * tests/test-xstrtoimax.sh: Likewise.
+ * tests/test-xstrtoumax.sh: Likewise.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2008-04-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/memchr-tests: New file.
+ * tests/test-memchr.c; New file, based on tests/test-memchr2.c.
+
+2008-04-26 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/memchr.c: Include intprops.h.
+ (__memchr): Optimize parallel detection of matching bytes. Rename local
+ variables. Add explanatory comments.
+
+2008-04-26 Bruno Haible <bruno@clisp.org>
+
+ Fix module 'memchr', broken since 2000-10-28.
+ * lib/memchr.c: Outside glibc, define memchr, not __memchr.
+
+2008-04-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/memchr2.c (memchr2): Rename local variables. Add explanatory
+ comments.
+
+2008-04-25 Eric Blake <ebb9@byu.net>
+
+ Use native fstatat on cygwin 1.7.0.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Make sure lstat check is made
+ first.
+
+2008-04-23 Eric Blake <ebb9@byu.net>
+
+ Improve memchr2 performance.
+ * lib/memchr2.c (memchr2): Further optimize parallel detection of
+ NUL bytes.
+ * modules/memchr2 (Depends-on): Use intprops.h.
+
+2008-04-23 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sys_socket.in.h (setsockopt): Be more type safe by declaring
+ an inline function instead of a CPP macro. Patch by Ben Pfaff
+ <blp@cs.stanford.edu>.
+
+2008-04-23 Simon Josefsson <simon@josefsson.org>
+
+ * lib/arpa_inet.in.h: New file.
+
+ * modules/arpa_inet (Files): Add lib/arpa_inet.in.h.
+ (Makefile.am): Sed in substitute header file.
+
+ * m4/arpa_inet_h.m4: Add gl_ARPA_INET_H_DEFAULTS and
+ gl_ARPA_INET_MODULE_INDICATOR. Use them.
+
+ * modules/inet_ntop (configure.ac): Use
+ gl_ARPA_INET_MODULE_INDICATOR.
+
+ * modules/inet_pton (configure.ac): Use
+ gl_ARPA_INET_MODULE_INDICATOR.
+
+2008-04-22 Jim Meyering <meyering@redhat.com>
+
+ * modules/verify (License): Re-license as LGPLv2+.
+
+2008-04-22 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sys_socket.in.h: Define setsockopt macro to cast fourth
+ parameter to void* as per POSIX standard (MinGW uses char*).
+
+2008-04-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/wctype.in.h (iswalnum, iswalpha, iswblank, iswcntrl, iswdigit,
+ iswgraph, iswlower, iswprint, iswpunct, iswspace, iswupper, iswxdigit):
+ Define to replacements if REPLACE_ISWCNTRL is 1.
+ * m4/wctype.m4 (gl_WCTYPE_H): Test whether the isw* functions work.
+ If not, set WCTYPE_H to nonempty and REPLACE_ISWCNTRL to 1.
+ * modules/wctype (Makefile.am): Substitute REPLACE_ISWCNTRL.
+ * doc/posix-functions/iswalnum.texi: Mention the 'wctype' module and
+ what it fixes.
+ * doc/posix-functions/iswalpha.texi: Likewise.
+ * doc/posix-functions/iswblank.texi: Likewise.
+ * doc/posix-functions/iswcntrl.texi: Likewise.
+ * doc/posix-functions/iswdigit.texi: Likewise.
+ * doc/posix-functions/iswgraph.texi: Likewise.
+ * doc/posix-functions/iswlower.texi: Likewise.
+ * doc/posix-functions/iswprint.texi: Likewise.
+ * doc/posix-functions/iswpunct.texi: Likewise.
+ * doc/posix-functions/iswspace.texi: Likewise.
+ * doc/posix-functions/iswupper.texi: Likewise.
+ * doc/posix-functions/iswxdigit.texi: Likewise.
+ Reported by Alain Guibert.
+
+2008-04-21 Bruno Haible <bruno@clisp.org>
+
+ * m4/vsnprintf.m4 (gl_FUNC_VSNPRINTF): Fix typo in last commit.
+ Patch by Alain Guibert.
+
+2008-04-21 Bruno Haible <bruno@clisp.org>
+
+ Fix test failures on mingw.
+ * tests/test-xstrtol.c (print_no_progname): New function.
+ (main): Install it in error_print_progname hook.
+ * tests/test-xstrtol.sh: Convert CR/LF to NL in output.
+ * tests/test-xstrtoimax.sh: Likewise.
+ * tests/test-xstrtoumax.sh: Likewise.
+
+2008-04-21 Bruno Haible <bruno@clisp.org>
+
+ Fix test failure on mingw.
+ * tests/test-argp-2.sh (func_compare): Remove CRs from sed's output.
+
+2008-04-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/localename.c (SUBLANG_TIBETAN_PRC, SUBLANG_TIBETAN_BHUTAN):
+ Actually assign a value.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ Fix conflict between modules 'canonicalize' and 'canonicalize-lgpl',
+ take 2.
+ * lib/canonicalize.c (canonicalize_file_name): Elide if the
+ 'canonicalize-lgpl' module is also used.
+ * lib/canonicalize-lgpl.c: Undo last change.
+ * modules/canonicalize-lgpl (configure.ac): Invoke gl_MODULE_INDICATOR.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/mkdir.c (mkdir): Undefine after the includes, not right after
+ config.h. Provide _mkdir based fallback for mingw.
+ * lib/sys_stat.in.h (mkdir): Define through an 'extern' declaration
+ if REPLACE_MKDIR is 1. Otherwise, test for mingw directly.
+ * m4/mkdir-slash.m4 (gl_FUNC_MKDIR_TRAILING_SLASH): Require
+ gl_SYS_STAT_H_DEFAULTS. When doing the replacement, set REPLACE_MKDIR
+ rather than defining mkdir in config.h.
+ * m4/sys_stat_h.m4 (gl_SYS_STAT_MODULE_INDICATOR): New macro.
+ (gl_SYS_STAT_H_DEFAULTS): New macro.
+ (gl_HEADER_SYS_STAT_H): Require it. Don't set HAVE_DECL_MKDIR and
+ HAVE_IO_H any more.
+ * modules/sys_stat (Makefile.am): Substitute REPLACE_MKDIR instead of
+ HAVE_DECL_MKDIR and HAVE_IO_H.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/isapipe.c: Port to native Windows platforms.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/gc-gnulib.c: Include <windows.h> before <wincrypt.h>.
+
+2008-04-21 Eric Blake <ebb9@byu.net>
+
+ Work around preprocessors that don't handle UINTMAX_MAX.
+ * lib/memchr2.c (memchr2): Avoid embedded #if.
+ Reported by Alain Guibert, fix suggested by Bruno Haible.
+
+2008-04-21 Simon Josefsson <simon@josefsson.org>
+
+ * doc/posix-functions/strftime.texi (strftime): Explain better
+ Windows incompatibility. Suggested by Micah Cowan
+ <micah@cowan.name>.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/uniconv/u32-conv-to-enc (Depends-on): Add unistr/u32-mblen,
+ unistr/u8-mblen.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ Fix test failure on platforms with non-GNU iconv.
+ * lib/uniconv/u16-conv-to-enc.c (u16_to_u8_lenient): New function.
+ (U_TO_U8): Use it, rather than u16_to_u8.
+ * lib/uniconv/u-conv-to-enc.h (FUNC): Allow an incomplete sequence of
+ units at the end of the input string.
+ * modules/uniconv/u16-conv-to-enc (Depends-on): Update.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * tests/uniconv/test-u8-conv-to-enc.c (main): Accept result == NULL
+ when the resulting length is 0.
+ * tests/uniconv/test-u16-conv-to-enc.c (main): Likewise.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/roundf.m4 (gl_FUNC_ROUNDF): Add test whether roundf actually
+ works.
+ * doc/posix-functions/roundf.texi: Mention roundf bug on mingw.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-tsearch.c (main): Don't use initstate if it is missing.
+ * modules/tsearch-tests (configure.ac): Test for initstate function.
+
+2008-04-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Also provided a substitute
+ for nlink_t if missing.
+ * tests/test-sys_stat.c: Check the existence of the nlink_t type.
+
+2008-04-19 Bruno Haible <bruno@clisp.org>
+
+ Work around snprintf bug on Linux libc5.
+ * m4/printf.m4 (gl_SNPRINTF_SIZE1): New macro.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Invoke
+ gl_SNPRINTF_SIZE1.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/snprintf.m4 (gl_FUNC_SNPRINTF): Likewise. Replace snprintf if
+ that test failed.
+ * m4/vsnprintf.m4 (gl_FUNC_VSNPRINTF): Likewise.
+ * lib/vasnprintf.c (USE_SNPRINTF): Set to 0 on Linux libc5 systems.
+ * modules/snprintf (Files): Add m4/printf.m4.
+ * modules/vsnprintf (Files): Likewise.
+ * doc/posix-functions/snprintf.texi: Document Linux libc5 problem.
+ * doc/posix-functions/vsnprintf.texi: Likewise.
+
+2008-04-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (floorlog10l, floorlog10): Reduce maximum error
+ from 0.0058 to less than 10^-7.
+
+2008-04-19 Bruno Haible <bruno@clisp.org>
+
+ Fix rounding when a precision is given.
+ * lib/vasnprintf.c (is_borderline): New function.
+ (VASNPRINTF): For %e and %g, consider replacing the digits 10....0 with
+ 9...9x.
+ * tests/test-vasnprintf-posix.c (test_function): Test rounding with %f,
+ %e, %g.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-fprintf-posix.h (test_function): Test rounding with %f.
+ * tests/test-printf-posix.h (test_function): Likewise.
+ * tests/test-printf-posix.output: Update.
+ Reported by John Darrington <john@darrington.wattle.id.au> via
+ Ben Pfaff <blp@cs.stanford.edu>.
+
+2008-04-18 Simon Josefsson <simon@josefsson.org>
+
+ * doc/posix-functions/strftime.texi (strftime): Clarify platform.
+ Suggested by Bruno Haible <bruno@clisp.org>.
+
+2008-04-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h (gl_lock_destroy, gl_rwlock_destroy,
+ gl_recursive_lock_destroy): Provide no-op definitions for the dummy
+ implementation.
+ Patch by Bruce Merry <bmerry@gmail.com>.
+
+2008-04-17 Simon Josefsson <simon@josefsson.org>
+
+ * doc/posix-functions/strftime.texi (strftime): Mention that %e
+ doesn't work under Windows.
+
+2008-04-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/localename.c (LANG_MAORI, LANG_QUECHUA, LANG_SOTHO, LANG_UIGHUR):
+ New macros.
+ (SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN,
+ SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC,
+ SUBLANG_CROATIAN_CROATIA, SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN,
+ SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA, SUBLANG_MONGOLIAN_PRC,
+ SUBLANG_QUECHUA_BOLIVIA, SUBLANG_QUECHUA_ECUADOR, SUBLANG_QUECHUA_PERU,
+ SUBLANG_RUSSIAN_RUSSIA, SUBLANG_RUSSIAN_MOLDAVIA, SUBLANG_SPANISH_US,
+ SUBLANG_TIBETAN_PRC, SUBLANG_TIBETAN_BHUTAN, SUBLANG_UIGHUR_PRC): New
+ macros.
+ (gl_locale_name_from_win32_LANGID): Refine code for Croatian/Bosnian,
+ Mongolian, Russian, Spanish, Tibetan. Add code for Maori, Quechua,
+ Northern Sotho, Uighur.
+
+2008-04-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/localename.c (SUBLANG_SINDHI_INDIA): New macro.
+ (SUBLANG_SINDHI_PAKISTAN): Change value from 1 to 2.
+ (gl_locale_name_from_win32_LANGID): Fix code for Sindhi.
+ Reported by Daniel Bergström <daniel@octocode.com>.
+
+2007-12-25 KJK::Hyperion <hackbunny@reactos.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/localename.c (gl_locale_name_canonicalize) [WIN32_NATIVE]: New
+ function.
+ (gl_locale_name_from_win32_LANGID, gl_locale_name_from_win32_LCID):
+ New functions, mostly extracted from gl_locale_name_default.
+ (gl_locale_name_default): Use gl_locale_name_from_win32_LCID.
+
+2008-04-16 Eric Blake <ebb9@byu.net>
+
+ Adjust strtod detection to catch glibc 2.7 bug.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Test "nan()" behavior.
+ Reported by John Gatewood Ham.
+
+2008-04-16 Bruno Haible <bruno@clisp.org>
+
+ Add tentative support for Linux libc5.
+ * lib/fbufmode.c (fbufmode) [__GNU_LIBRARY__==1]: Reuse glibc2 code.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/freadable.c (freadable): Likewise.
+ * lib/freadahead.c (freadahead): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/freadptr.c (freadptr): Likewise.
+ * lib/freadseek.c (freadptrinc): Likewise.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ * lib/fseterr.c (fseterr): Likewise.
+ * lib/fwritable.c (fwritable): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+ Reported by Alain Guibert <alguibert+bts@free.fr>.
+
+2008-04-15 Bruno Haible <bruno@clisp.org>
+
+ * modules/mathl (configure.ac): Define module indicator.
+
+2008-04-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/logl.c (logl): Remove unused variables.
+
+2008-04-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/uniconv/u-conv-to-enc.h (FUNC): Fix return value when U_TO_U8
+ fails.
+
+2008-04-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/trim.c (trim2): Fix argument of isspace() macro.
+
+2008-04-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/tanl.c (kernel_tanl): Rename flag to invert, initialize it
+ to 0.
+ * lib/trigl.c (ieee754_rem_pio2l): Fix range checks.
+
+2008-04-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/calloc.m4 (_AC_FUNC_CALLOC_IF): Fix underquoting of
+ AC_LANG_PROGRAM argument.
+ * m4/extensions.m4 (AC_USE_SYSTEM_EXTENSIONS): Likewise.
+ * m4/gethrxtime.m4 (gl_ARITHMETIC_HRTIME_T): Likewise.
+ * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS): Likewise.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Likewise.
+ * m4/math_h.m4 (gl_MATH_H): Likewise.
+ * m4/mbstate_t.m4 (AC_TYPE_MBSTATE_T): Likewise.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): Likewise.
+ * m4/netinet_in_h.m4 (gl_HEADER_NETINET_IN): Likewise.
+ * m4/physmem.m4 (gl_SYS__SYSTEM_CONFIGURATION): Likewise.
+ * m4/putenv.m4 (gl_FUNC_PUTENV): Likewise.
+ * m4/regex.m4 (gl_REGEX): Likewise.
+ * m4/stdint.m4 (gl_INTEGER_TYPE_SUFFIX): Likewise.
+ * m4/stdio_h.m4 (gl_STDIN_LARGE_OFFSET): Likewise.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR): Likewise.
+ * m4/strerror.m4 (gl_FUNC_STRERROR_SEPARATE): Likewise.
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): Likewise.
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Likewise.
+ * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Likewise.
+ * m4/sys_socket_h.m4 (gl_HEADER_SYS_SOCKET): Likewise.
+
+2008-04-14 Jim Meyering <meyering@redhat.com>
+
+ test-strtod: fix typos: s/abs/fabs/
+ * tests/test-strtod.c (main): Use fabs, not narrowing-to-int "abs".
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ Fix conflict between modules 'canonicalize' and 'canonicalize-lgpl'.
+ * lib/canonicalize-lgpl.c: Elide the contents if the 'canonicalize'
+ module is also used and while not building the reloc-wrapper.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-getaddrinfo.c (simple): Ignore EAI_NODATA error.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ Fix AIX compilation failure introduced on 2008-04-02.
+ * tests/test-frexp.c (exp): Undefine before redefining.
+ * tests/test-frexpl.c (exp): Likewise.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ Work around a HP-UX stdio bug.
+ * tests/test-ftell.c (main): Disable the fseek/ftell test on HP-UX.
+ * tests/test-ftello.c (main): Likewise.
+ * doc/posix-functions/ftell.texi: Mention HP-UX bug.
+ * doc/posix-functions/ftello.texi: Likewise.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ Make test-signbit pass on HP-UX/hppa.
+ * tests/test-signbit.c (minus_zerol): New variable.
+ (test_signbitl): Use it.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ Make truncl work on OSF/1 4.0.
+ * m4/truncl.m4 (gl_FUNC_TRUNCL): Test whether truncl actually works.
+ Set REPLACE_TRUNCL, not HAVE_DECL_TRUNCL.
+ * lib/math.in.h (truncl): Test REPLACE_TRUNCL, not HAVE_DECL_TRUNCL.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_TRUNCL, not
+ HAVE_DECL_TRUNCL.
+ * modules/math (Makefile.am): Substitute REPLACE_TRUNCL, not
+ HAVE_DECL_TRUNCL.
+ * doc/posix-functions/truncl.texi: Document the OSF/1 4.0 problem.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/unictype.h: Remove trailing comma from enumeration definitions.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/count-one-bits.h (COUNT_ONE_BITS): Rewrite verification
+ expression, so as to avoid HP-UX 11 cc compiler bug.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * m4/regex.m4 (gl_PREREQ_REGEX): Also check for <libintl.h>.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/git-merge-changelog.c: Remove empty declaration outside of
+ functions.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/quotearg-tests (Makefile.am): Define test_quotearg_LDADD.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/sys_socket.texi: Document the problem on EMX.
+ * lib/sys_socket.in.h (SHUT_RD, SHUT_WR, SHUT_RDWR): Define if missing.
+ * m4/sys_socket_h.m4 (gl_HEADER_SYS_SOCKET): Replace <sys/socket.h>
+ also if it exists but lacks definitions of the SHUT_* macros.
+ * modules/sys_socket (Description): Update.
+ Reported by Elbert Pol <e.pol@chello.nl>.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c (OS2): Don't redefine if already defined.
+ Reported by Elbert Pol <e.pol@chello.nl>.
+
+2008-04-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/binary-io.h [__EMX__]: Include <io.h>.
+ Reported by Elbert Pol <e.pol@chello.nl>.
+
+2008-04-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/fpucw.h: Enable the definitions also for x86_64.
+ Needed for NetBSD/x86_64.
+ Reported by Thomas Klausner <tk@giga.or.at>.
+
+2008-04-12 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-strtod.c: Include isnand.h.
+ (main): Use isnand instead of isnan.
+ Reported by Jim Meyering.
+
+2008-04-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanf.m4 (gl_ISNANF_WORKS): Add a test for a special NaN.
+ Reported by Nelson H. F. Beebe <beebe@math.utah.edu>.
+
+2008-04-12 Jim Meyering <meyering@redhat.com>
+
+ * m4/math_h.m4 (gl_MATH_H): Fix typos.
+
+2008-04-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/freadptr.c (freadptr) [__EMX__]: Fix wrong assertion.
+ Reported by Elbert Pol <e.pol@chello.nl>.
+
+2008-04-12 Eric Blake <ebb9@byu.net>
+
+ Work around Solaris 10 math.h bug.
+ * m4/math_h.m4 (gl_MATH_H): Check for bug.
+ (gl_MATH_H_DEFAULTS): Set up default.
+ * modules/math (Makefile.am): Replace new indicators.
+ * lib/math.in.h (NAN, HUGE_VAL): Provide replacements.
+ * tests/test-math.c (main): Test this.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Don't rely on HUGE_VAL.
+ * doc/posix-headers/math.texi (math.h): Mention bug.
+ Reported by Nelson H. F. Beebe and Jim Meyering.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ Adapt to future versions of Apple GCC.
+ * lib/argp-fmtstream.h (ARGP_FS_EI): Don't test __GNUC_GNU_INLINE__.
+ Reported by Peter O'Gorman <peter@pogma.com>.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-getaddrinfo.c (simple): Ignore EAI_NONAME error.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/strsignal-tests (Makefile.am): Define test_strsignal_LDADD.
+
+ * modules/getaddrinfo-tests (Makefile.am): Define
+ test_getaddrinfo_LDADD.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/strsignal.c (_sys_siglist): Don't declare if already declared.
+ (init): Fix syntax error.
+ * m4/strsignal.m4 (gl_PREREQ_STRSIGNAL): Check whether _sys_siglist
+ is declared.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/glob.c: Include <stdbool.h>. Needed at least with IRIX cc.
+ * modules/glob (Depends-on): Add stdbool.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/trim.c: Include <string.h>.
+
+2008-04-11 Eric Blake <ebb9@byu.net>
+
+ Avoid compile failure on OS/2.
+ * lib/regex_internal.h (internal_function): Disable optimization
+ on OS/2 (__EMX__), where it caused compiler error.
+ Reported by Elbert Pol.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ Flush the standard error stream before aborting. Needed on mingw.
+ * tests/test-argmatch.c (ASSERT): Call fflush(stderr) before abort().
+ * tests/test-array_list.c (ASSERT): Likewise.
+ * tests/test-array_oset.c (ASSERT): Likewise.
+ * tests/test-avltree_list.c (ASSERT): Likewise.
+ * tests/test-avltree_oset.c (ASSERT): Likewise.
+ * tests/test-avltreehash_list.c (ASSERT): Likewise.
+ * tests/test-binary-io.c (ASSERT): Likewise.
+ * tests/test-byteswap.c (ASSERT): Likewise.
+ * tests/test-c-ctype.c (ASSERT): Likewise.
+ * tests/test-c-strcasecmp.c (ASSERT): Likewise.
+ * tests/test-c-strcasestr.c (ASSERT): Likewise.
+ * tests/test-c-strncasecmp.c (ASSERT): Likewise.
+ * tests/test-c-strstr.c (ASSERT): Likewise.
+ * tests/test-canonicalize-lgpl.c (ASSERT): Likewise.
+ * tests/test-canonicalize.c (ASSERT): Likewise.
+ * tests/test-carray_list.c (ASSERT): Likewise.
+ * tests/test-ceilf1.c (ASSERT): Likewise.
+ * tests/test-ceilf2.c (ASSERT): Likewise.
+ * tests/test-ceill.c (ASSERT): Likewise.
+ * tests/test-count-one-bits.c (ASSERT): Likewise.
+ * tests/test-fbufmode.c (ASSERT): Likewise.
+ * tests/test-fflush2.c (ASSERT): Likewise.
+ * tests/test-floorf1.c (ASSERT): Likewise.
+ * tests/test-floorf2.c (ASSERT): Likewise.
+ * tests/test-floorl.c (ASSERT): Likewise.
+ * tests/test-fopen.c (ASSERT): Likewise.
+ * tests/test-fpending.c (ASSERT): Likewise.
+ * tests/test-fprintf-posix.c (ASSERT): Likewise.
+ * tests/test-fpurge.c (ASSERT): Likewise.
+ * tests/test-freadable.c (ASSERT): Likewise.
+ * tests/test-freadahead.c (ASSERT): Likewise.
+ * tests/test-freading.c (ASSERT): Likewise.
+ * tests/test-freadptr.c (ASSERT): Likewise.
+ * tests/test-freadptr2.c (ASSERT): Likewise.
+ * tests/test-freadseek.c (ASSERT): Likewise.
+ * tests/test-freopen.c (ASSERT): Likewise.
+ * tests/test-frexp.c (ASSERT): Likewise.
+ * tests/test-frexpl.c (ASSERT): Likewise.
+ * tests/test-fseek.c (ASSERT): Likewise.
+ * tests/test-fseeko.c (ASSERT): Likewise.
+ * tests/test-fstrcmp.c (ASSERT): Likewise.
+ * tests/test-ftell.c (ASSERT): Likewise.
+ * tests/test-ftello.c (ASSERT): Likewise.
+ * tests/test-func.c (ASSERT): Likewise.
+ * tests/test-fwritable.c (ASSERT): Likewise.
+ * tests/test-fwriting.c (ASSERT): Likewise.
+ * tests/test-getdelim.c (ASSERT): Likewise.
+ * tests/test-getline.c (ASSERT): Likewise.
+ * tests/test-i-ring.c (ASSERT): Likewise.
+ * tests/test-iconv-utf.c (ASSERT): Likewise.
+ * tests/test-iconv.c (ASSERT): Likewise.
+ * tests/test-isfinite.c (ASSERT): Likewise.
+ * tests/test-isnand.c (ASSERT): Likewise.
+ * tests/test-isnanf.c (ASSERT): Likewise.
+ * tests/test-isnanl.h (ASSERT): Likewise.
+ * tests/test-ldexpl.c (ASSERT): Likewise.
+ * tests/test-linked_list.c (ASSERT): Likewise.
+ * tests/test-linkedhash_list.c (ASSERT): Likewise.
+ * tests/test-localename.c (ASSERT): Likewise.
+ * tests/test-lseek.c (ASSERT): Likewise.
+ * tests/test-mbscasecmp.c (ASSERT): Likewise.
+ * tests/test-mbscasestr1.c (ASSERT): Likewise.
+ * tests/test-mbscasestr2.c (ASSERT): Likewise.
+ * tests/test-mbscasestr3.c (ASSERT): Likewise.
+ * tests/test-mbscasestr4.c (ASSERT): Likewise.
+ * tests/test-mbschr.c (ASSERT): Likewise.
+ * tests/test-mbscspn.c (ASSERT): Likewise.
+ * tests/test-mbsncasecmp.c (ASSERT): Likewise.
+ * tests/test-mbspbrk.c (ASSERT): Likewise.
+ * tests/test-mbspcasecmp.c (ASSERT): Likewise.
+ * tests/test-mbsrchr.c (ASSERT): Likewise.
+ * tests/test-mbsspn.c (ASSERT): Likewise.
+ * tests/test-mbsstr1.c (ASSERT): Likewise.
+ * tests/test-mbsstr2.c (ASSERT): Likewise.
+ * tests/test-mbsstr3.c (ASSERT): Likewise.
+ * tests/test-memchr2.c (ASSERT): Likewise.
+ * tests/test-memmem.c (ASSERT): Likewise.
+ * tests/test-open.c (ASSERT): Likewise.
+ * tests/test-printf-frexp.c (ASSERT): Likewise.
+ * tests/test-printf-frexpl.c (ASSERT): Likewise.
+ * tests/test-printf-posix.c (ASSERT): Likewise.
+ * tests/test-quotearg.c (ASSERT): Likewise.
+ * tests/test-rbtree_list.c (ASSERT): Likewise.
+ * tests/test-rbtree_oset.c (ASSERT): Likewise.
+ * tests/test-rbtreehash_list.c (ASSERT): Likewise.
+ * tests/test-round1.c (ASSERT): Likewise.
+ * tests/test-roundf1.c (ASSERT): Likewise.
+ * tests/test-roundl.c (ASSERT): Likewise.
+ * tests/test-signbit.c (ASSERT): Likewise.
+ * tests/test-sleep.c (ASSERT): Likewise.
+ * tests/test-snprintf-posix.c (ASSERT): Likewise.
+ * tests/test-snprintf.c (ASSERT): Likewise.
+ * tests/test-sprintf-posix.c (ASSERT): Likewise.
+ * tests/test-stat-time.c (ASSERT): Likewise.
+ * tests/test-strcasestr.c (ASSERT): Likewise.
+ * tests/test-strerror.c (ASSERT): Likewise.
+ * tests/test-striconv.c (ASSERT): Likewise.
+ * tests/test-striconveh.c (ASSERT): Likewise.
+ * tests/test-striconveha.c (ASSERT): Likewise.
+ * tests/test-strsignal.c (ASSERT): Likewise.
+ * tests/test-strstr.c (ASSERT): Likewise.
+ * tests/test-strtod.c (ASSERT): Likewise.
+ * tests/test-trunc1.c (ASSERT): Likewise.
+ * tests/test-trunc2.c (ASSERT): Likewise.
+ * tests/test-truncf1.c (ASSERT): Likewise.
+ * tests/test-truncf2.c (ASSERT): Likewise.
+ * tests/test-truncl.c (ASSERT): Likewise.
+ * tests/test-vasnprintf-posix.c (ASSERT): Likewise.
+ * tests/test-vasnprintf-posix2.c (ASSERT): Likewise.
+ * tests/test-vasnprintf.c (ASSERT): Likewise.
+ * tests/test-vasprintf-posix.c (ASSERT): Likewise.
+ * tests/test-vasprintf.c (ASSERT): Likewise.
+ * tests/test-vfprintf-posix.c (ASSERT): Likewise.
+ * tests/test-vprintf-posix.c (ASSERT): Likewise.
+ * tests/test-vsnprintf-posix.c (ASSERT): Likewise.
+ * tests/test-vsnprintf.c (ASSERT): Likewise.
+ * tests/test-vsprintf-posix.c (ASSERT): Likewise.
+ * tests/test-wcwidth.c (ASSERT): Likewise.
+ * tests/test-xfprintf-posix.c (ASSERT): Likewise.
+ * tests/test-xprintf-posix.c (ASSERT): Likewise.
+ * tests/test-xvasprintf.c (ASSERT): Likewise.
+ * tests/uniconv/test-u16-conv-from-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u16-conv-to-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u16-strconv-from-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u16-strconv-to-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u32-conv-from-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u32-conv-to-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u32-strconv-from-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u32-strconv-to-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u8-conv-from-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u8-conv-to-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u8-strconv-from-enc.c (ASSERT): Likewise.
+ * tests/uniconv/test-u8-strconv-to-enc.c (ASSERT): Likewise.
+ * tests/unictype/test-bidi_byname.c (ASSERT): Likewise.
+ * tests/unictype/test-bidi_name.c (ASSERT): Likewise.
+ * tests/unictype/test-bidi_of.c (ASSERT): Likewise.
+ * tests/unictype/test-bidi_test.c (ASSERT): Likewise.
+ * tests/unictype/test-block_list.c (ASSERT): Likewise.
+ * tests/unictype/test-block_of.c (ASSERT): Likewise.
+ * tests/unictype/test-block_test.c (ASSERT): Likewise.
+ * tests/unictype/test-categ_and.c (ASSERT): Likewise.
+ * tests/unictype/test-categ_and_not.c (ASSERT): Likewise.
+ * tests/unictype/test-categ_byname.c (ASSERT): Likewise.
+ * tests/unictype/test-categ_name.c (ASSERT): Likewise.
+ * tests/unictype/test-categ_none.c (ASSERT): Likewise.
+ * tests/unictype/test-categ_of.c (ASSERT): Likewise.
+ * tests/unictype/test-categ_or.c (ASSERT): Likewise.
+ * tests/unictype/test-categ_test_withtable.c (ASSERT): Likewise.
+ * tests/unictype/test-combining.c (ASSERT): Likewise.
+ * tests/unictype/test-decdigit.c (ASSERT): Likewise.
+ * tests/unictype/test-digit.c (ASSERT): Likewise.
+ * tests/unictype/test-mirror.c (ASSERT): Likewise.
+ * tests/unictype/test-numeric.c (ASSERT): Likewise.
+ * tests/unictype/test-pr_byname.c (ASSERT): Likewise.
+ * tests/unictype/test-pr_test.c (ASSERT): Likewise.
+ * tests/unictype/test-predicate-part1.h (ASSERT): Likewise.
+ * tests/unictype/test-scripts.c (ASSERT): Likewise.
+ * tests/unictype/test-sy_c_ident.c (ASSERT): Likewise.
+ * tests/unictype/test-sy_java_ident.c (ASSERT): Likewise.
+ * tests/unistdio/test-u16-asnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u16-vasnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u16-vasnprintf2.c (ASSERT): Likewise.
+ * tests/unistdio/test-u16-vasnprintf3.c (ASSERT): Likewise.
+ * tests/unistdio/test-u16-vasprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u16-vsnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u16-vsprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u32-asnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u32-vasnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u32-vasnprintf2.c (ASSERT): Likewise.
+ * tests/unistdio/test-u32-vasnprintf3.c (ASSERT): Likewise.
+ * tests/unistdio/test-u32-vasprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u32-vsnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u32-vsprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u8-asnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u8-vasnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u8-vasnprintf2.c (ASSERT): Likewise.
+ * tests/unistdio/test-u8-vasnprintf3.c (ASSERT): Likewise.
+ * tests/unistdio/test-u8-vasprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u8-vsnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-u8-vsprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-ulc-asnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-ulc-vasnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-ulc-vasnprintf2.c (ASSERT): Likewise.
+ * tests/unistdio/test-ulc-vasnprintf3.c (ASSERT): Likewise.
+ * tests/unistdio/test-ulc-vasprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-ulc-vsnprintf1.c (ASSERT): Likewise.
+ * tests/unistdio/test-ulc-vsprintf1.c (ASSERT): Likewise.
+ * tests/uniwidth/test-u16-strwidth.c (ASSERT): Likewise.
+ * tests/uniwidth/test-u16-width.c (ASSERT): Likewise.
+ * tests/uniwidth/test-u32-strwidth.c (ASSERT): Likewise.
+ * tests/uniwidth/test-u32-width.c (ASSERT): Likewise.
+ * tests/uniwidth/test-u8-strwidth.c (ASSERT): Likewise.
+ * tests/uniwidth/test-u8-width.c (ASSERT): Likewise.
+ * tests/uniwidth/test-uc_width.c (ASSERT): Likewise.
+ Reported by Eric Blake.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/wchar.in.h: Tweak comment.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ Fix __GNUC_STDC_INLINE__ predefine with Apple GCC on MacOS X 10.5.
+ * gnulib-tool (func_emit_initmacro_start): Emit an invocation of
+ gl_COMMON.
+ * m4/gnulib-common.m4 (gl_COMMON, gl_COMMON_BODY): New macros.
+
+2008-04-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/git-merge-changelog (git_merge_changelog_LDADD): Add LIBINTL.
+
+2008-04-11 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc-gnulib.c: On Windows, use CryptGenRandom from CSP instead
+ of attempting to use non-existing /dev/*random. Based on patch
+ from Adam Strzelecki <ono@java.pl> in
+ <http://lists.gnu.org/archive/html/help-gsasl/2008-02/msg00000.html>.
+
+2008-04-08 Bruno Haible <bruno@clisp.org>
+
+ Add tentative support for emx+gcc.
+ * lib/fbufmode.c (fbufmode) [__EMX__]: Add conditional code.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/freadable.c (freadable): Likewise.
+ * lib/freadahead.c (freadahead): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/freadptr.c (freadptr): Likewise.
+ * lib/freadseek.c (freadptrinc): Likewise.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ * lib/fseterr.c (fseterr): Likewise.
+ * lib/fwritable.c (fwritable): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+ * m4/fpending.m4 (gl_FUNC_FPENDING): Add a variant for emx+gcc.
+
+2008-04-09 Eric Blake <ebb9@byu.net>
+
+ Avoid some autoconf warnings.
+ * m4/regex.m4 (gl_REGEX): s/AC_HELP_STRING/AS_HELP_STRING/.
+ * m4/acl.m4 (gl_FUNC_ACL): Likewise.
+ * m4/afs.m4 (gl_AFS): Likewise.
+ * m4/gc-random.m4 (gl_GC_RANDOM): Likewise.
+ * m4/include_next.m4 (gl_INCLUDE_NEXT): s/AC_FOREACH/m4_foreach_w/.
+ * m4/absolute-header.m4 (gl_ABSOLUTE_HEADER): Likewise.
+ * m4/stdint.m4 (gl_STDINT_BITSIZEOF, gl_CHECK_TYPES_SIGNED)
+ (gl_INTEGER_TYPE_SUFFIX): Likewise.
+ * m4/onceonly_2_57.m4 (AC_CHECK_HEADERS_ONCE, AC_CHECK_FUNCS_ONCE)
+ (AC_CHECK_DECLS_ONCE): Likewise.
+ Rename file...
+ * m4/onceonly.m4: ...to this, and delete 2.54 variant, now that
+ gnulib-tool requires autoconf 2.59 or better.
+ * gnulib-tool (func_get_filelist): s/\(onceonly\)_2_57.m4/\1.m4/.
+
+2008-04-08 Eric Blake <ebb9@byu.net>
+
+ Use 'git describe --match' if present (added in git 1.5.5).
+ * build-aux/git-version-gen: Limit result to tags that match 'v*'
+ if possible.
+
+2008-04-08 Bruno Haible <bruno@clisp.org>
+
+ Add tentative support for OpenServer.
+ * lib/fbufmode.c (fbufmode): Add conditional define for _flag, _base,
+ _ptr, _cnt.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/freadable.c (freadable): Likewise.
+ * lib/freadahead.c (freadahead): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/freadptr.c (freadptr): Likewise.
+ * lib/freadseek.c (freadptrinc): Likewise.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ * lib/fseterr.c (fseterr): Likewise.
+ * lib/fwritable.c (fwritable): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+ Reported by Roger Cornelius <rac@tenzing.org> and
+ Brian K. White <brian@aljex.com>.
+
+2008-04-06 Jim Meyering <meyering@redhat.com>
+
+ * gnulib-tool (func_add_or_update): s/backuped/backed up/ in diagnostic
+
+2008-04-06 Bruno Haible <bruno@clisp.org>
+
+ Avoid possible error with non-ASCII bytes in UTF-8 locales.
+ * tests/test-fprintf-posix.sh: Use "LC_ALL=C tr" instead of "tr".
+ * tests/test-printf-posix.sh: Likewise.
+ * tests/test-vfprintf-posix.sh: Likewise.
+ * tests/test-vprintf-posix.sh: Likewise.
+ * tests/test-xprintf-posix.sh: Likewise.
+
+2008-04-06 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/double-slash-root.m4 (gl_DOUBLE_SLASH_ROOT): Fix quoting,
+ hide error from 'ls', needed on OS/2.
+ Report by Elbert Pol <elbert.pol@gmail.com>.
+
+2008-04-04 Eric Blake <ebb9@byu.net>
+
+ Make test-fseeko.c failures meaningful.
+ * tests/test-fseeko.c: Print line number on failure.
+ * tests/test-fseek.c: Likewise.
+ Reported by Nelson H. F. Beebe.
+
+ Improve strtod bug detection check.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Also check for hex-float parsing,
+ required for Solaris 10.
+ Reported by Bob Friesenhahn and Nelson H. F. Beebe.
+
+2008-04-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/relocatable-prog-wrapper (Files): Add m4/environ.m4. Needed
+ by m4/setenv.m4.
+
+2008-04-03 Eric Blake <ebb9@byu.net>
+
+ Ensure sane .version contents.
+ * top/GNUmakefile (_dummy): Also delete .version when rebuilding
+ version string.
+ * build-aux/git-version-gen: Improve documentation.
+
+ Make GNU make output nicer.
+ * top/GNUmakefile [!_have-Makefile]: Add dependency on
+ MAKECMDGOALS to enforce message for all command line targets. Set
+ srcdir for use in maint.mk.
+
+ Another maintainer tweak.
+ * top/GNUmakefile (_is-dist-target): Allow maintainer-distcheck as
+ a target that regenerates version.
+
+2008-04-03 Jim Meyering <meyering@redhat.com>
+
+ vc-list-files: don't cause coreutils "make po-check" failure
+ * build-aux/vc-list-files: Skip postprocessing when $2 is '.'
+
+2008-04-03 Eric Blake <ebb9@byu.net>
+
+ Allow VPATH usage of vc-list-files.
+ * build-aux/vc-list-files (scriptversion): Add timestamp.
+ (options): Add --help, --version, -C.
+ (CVS): Support installed cvsu.
+
+2008-04-02 Bruno Haible <bruno@clisp.org>
+
+ Avoid some "statement with no effect" warnings from gcc.
+ * tests/test-wctype.c (main): Explicitly ignore unused values.
+ Reported by Jim Meyering.
+
+2008-04-02 Jim Meyering <meyering@redhat.com>
+
+ Avoid some warnings from "gcc -Wshadow".
+ * tests/test-frexp.c (exp): Define to a different identifier.
+ * tests/test-frexpl.c (exp): Likewise.
+
+2008-04-03 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: remove dangling *.[ch] symlinks from lib
+ * build-aux/bootstrap [dangling symlink removal]: Move find's
+ -depth option to precede all others, to avoid a warning.
+ Remove *.[ch] files too, and from "$source_base" (usually lib/).
+
+2008-04-02 Bruno Haible <bruno@clisp.org>
+
+ Avoid some warnings from "gcc -Wshadow".
+ * tests/tests-vfprintf-posix.c (my_fprintf): Move after test_function.
+ * tests/tests-vprintf-posix.c (my_printf): Move after test_function.
+ * tests/tests-vsnprintf-posix.c (my_snprintf): Move after test_function.
+ * tests/tests-vsprintf-posix.c (my_sprintf): Move after test_function.
+ Reported by Jim Meyering.
+
+2008-04-01 Bruno Haible <bruno@clisp.org>
+
+ Fix test to work on IRIX 6.5 with cc.
+ * tests/test-math.c (numeric_equal): New function.
+ (main): Use it.
+
+2008-04-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers/math.texi: Refine documentation of NAN problem.
+
+2008-04-01 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c: Include nan.h instead of <math.h>.
+ (test_function): Use NaNd, NaNl instead of NAN or 0.0L/0.0L.
+ * modules/vasnprintf-posix-tests (Files): Add tests/nan.h.
+ (Depends-on): Remove math.
+
+ * tests/test-vasprintf-posix.c: Include nan.h instead of <math.h>.
+ (test_function): Use NaNd, NaNl instead of NAN or 0.0L/0.0L.
+ * modules/vasprintf-posix-tests (Files): Add tests/nan.h.
+ (Depends-on): Remove math.
+
+ * tests/test-snprintf-posix.h: Include nan.h instead of <math.h>.
+ (test_function): Use NaNd, NaNl instead of NAN or 0.0L/0.0L.
+ * modules/snprintf-posix-tests (Files): Add tests/nan.h.
+ (Depends-on): Remove math.
+ * modules/vsnprintf-posix-tests (Files): Add tests/nan.h.
+ (Depends-on): Remove math.
+
+ * tests/test-sprintf-posix.h: Include nan.h instead of <math.h>.
+ (test_function): Use NaNd, NaNl instead of NAN or 0.0L/0.0L.
+ * modules/sprintf-posix-tests (Files): Add tests/nan.h.
+ (Depends-on): Remove math.
+ * modules/vsprintf-posix-tests (Files): Add tests/nan.h.
+ (Depends-on): Remove math.
+
+ * tests/test-round1.c: Include nan.h.
+ (main): Use NaNd instead of NAN.
+ * modules/round-tests (Files): Add tests/nan.h.
+
+ * tests/test-trunc1.c: Include nan.h.
+ (main): Use NaNd instead of NAN.
+ * modules/trunc-tests (Files): Add tests/nan.h.
+
+ * tests/test-roundf1.c: Include nan.h.
+ (main): Use NaNf instead of NAN.
+ * modules/roundf-tests (Files): Add tests/nan.h.
+
+ * tests/test-truncf1.c: Include nan.h.
+ (main): Use NaNf instead of NAN.
+ * modules/truncf-tests (Files): Add tests/nan.h.
+
+ * tests/test-ceilf1.c: Include nan.h.
+ (main): Use NaNf instead of NAN.
+ * modules/ceilf-tests (Files): Add tests/nan.h.
+
+ * tests/test-floorf1.c: Include nan.h.
+ (main): Use NaNf instead of NAN.
+ * modules/floorf-tests (Files): Add tests/nan.h.
+
+ * tests/test-isnanf.c: Include nan.h instead of <math.h>.
+ (main): Use NaNf instead of NAN.
+ * modules/isnanf-nolibm-tests (Files): Add tests/nan.h.
+
+ * tests/test-isnand.c: Include nan.h instead of <math.h>.
+ (main): Use NaNd instead of NAN.
+ * modules/isnand-nolibm-tests (Files): Add tests/nan.h.
+
+ * tests/test-frexp.c: Include nan.h.
+ (main): Use NaNd instead of NAN.
+ * modules/frexp-tests (Files): Add tests/nan.h.
+
+ * lib/isnan.c: Don't include <math.h>.
+ (FUNC): Don't use NAN macro.
+ * modules/isnand-nolibm (Depends-on): Remove math.
+ * modules/isnanf-nolibm (Depends-on): Remove math.
+ * modules/isnanl (Depends-on): Remove math.
+ * modules/isnanl-nolibm (Depends-on): Remove math.
+
+ * tests/nan.h: New file.
+
+2008-04-01 Eric Blake <ebb9@byu.net>
+
+ Fix typos.
+ * tests/test-strtod.c (main): s/FLT_/DBL_/ for minimum and epsilon
+ values to be the right type.
+
+ For now, cater to gnulib strtod inaccuracies.
+ * tests/test-strtod.c (main): Allow 1-ulp error on expected
+ fractional results. While not as nice from a QoI perspective, it
+ is a quicker patch than correctly implementing decimal to binary
+ rounding.
+
+2008-03-31 Eric Blake <ebb9@byu.net>
+
+ Guarantee a definition of NAN.
+ * lib/math.in.h (NAN): Define if missing.
+ * tests/test-math.c (main): Test it.
+ * doc/posix-headers/math.texi (math.h): Document this.
+ * lib/isnan.c (rpl_isnand): Use it.
+ * tests/test-ceilf1.c (NaN): Delete, and use NAN instead.
+ * tests/test-floorf1.c (NaN): Likewise.
+ * tests/test-frexp.c (NaN): Likewise.
+ * tests/test-isnand.c (NaN): Likewise.
+ * tests/test-isnanf.c (NaN): Likewise.
+ * tests/test-round1.c (NaN): Likewise.
+ * tests/test-roundf1.c (NaN): Likewise.
+ * tests/test-snprintf-posix.h (NaN): Likewise.
+ * tests/test-sprintf-posix.h (NaN): Likewise.
+ * tests/test-trunc1.c (NaN): Likewise.
+ * tests/test-truncf1.c (NaN): Likewise.
+ * tests/test-vasnprintf-posix.c (NaN): Likewise.
+ * tests/test-vasprintf-posix.c (NaN): Likewise.
+ * modules/isnand-nolibm (Depends-on): Add math.
+ * modules/isnanf-nolibm (Depends-on): Likewise.
+ * modules/isnanl (Depends-on): Likewise.
+ * modules/isnanl-nolibm (Depends-on): Likewise.
+ * modules/snprintf-posix-tests (Depends-on): Likewise.
+ * modules/sprintf-posix-tests (Depends-on): Likewise.
+ * modules/vsnprintf-posix-tests (Depends-on): Likewise.
+ * modules/vsprintf-posix-tests (Depends-on): Likewise.
+ * modules/vasnprintf-posix-tests (Depends-on): Likewise.
+ * modules/vasprintf-posix-tests (Depends-on): Likewise.
+
+2008-03-31 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-strtod.c (main): Update results for OSF/1 platforms.
+ * doc/posix-functions/strtod.texi: Likewise.
+
+2008-03-31 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-strtod.c (main): Don't use C99 syntax.
+
+2008-03-31 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-strtod.c (main): Don't test NAN macro. Needed for Solaris.
+ Reported by Eric Blake.
+
+2008-03-31 Jim Meyering <meyering@redhat.com>
+
+ Don't compare actual signbit return values.
+ * tests/test-strtod.c (main): Rather, compare only their
+ zero/non-zero nature.
+
+2008-03-31 Eric Blake <ebb9@byu.net>
+
+ More strtod documentation.
+ * doc/posix-functions/strtod.texi (strtod): Interpret more test
+ failures as distinct bugs.
+
+2008-03-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/wchar.in.h [defined __need_mbstate_t]: Just include <wchar.h>.
+ Problem reported by Erik Benada in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2008-03/msg00249.html>.
+
+2008-03-30 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-strtod.c: Add comments about which assertion fails on which
+ platform.
+ * doc/posix-functions/strtod.texi: Add info about many more platforms.
+
+2008-03-30 Eric Blake <ebb9@byu.net>
+
+ Test signbit behavior on zeros.
+ * tests/test-signbit.c (test_signbitf): Add tests for zero.
+ (test_signbitd, test_signbitl): Likewise.
+
+ More strtod touchups.
+ * tests/test-strtod.c (main): Ignore tests for signbit on NaN, and
+ sign of negative underflow, for now. Use .5, not .1.
+ * doc/posix-functions/strtod.texi (strtod): Mention these
+ limitations.
+ Reported by Jim Meyering.
+
+2008-03-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveh.h (mem_iconveh, str_iconveh): Optimize the conversion
+ from UTF-8 to UTF-8//TRANSLIT in the same way as from UTF-8 to UTF-8.
+
+2008-03-30 Bruno Haible <bruno@clisp.org>
+
+ Avoid failure when attempting to return empty iconv results on some
+ platforms.
+ * lib/striconveh.c (mem_cd_iconveh_internal): In the final memory
+ allocation, don't report ENOMEM when the resulting string is empty.
+
+2008-03-30 Bruno Haible <bruno@clisp.org>
+
+ Fix buffer overrun.
+ * lib/vasnprintf.c (VASNPRINTF): If !USE_SNPRINTF && pad_ourselves:
+ Don't consider the width for tmp_length. Check count against tmp_length
+ before doing the padding. Ensure enough allocation during padding.
+
+2008-03-30 Eric Blake <ebb9@byu.net>
+
+ strtod touchups.
+ * lib/strtod.c (strtod): Avoid compiler warnings.
+ Reported by Jim Meyering.
+
+2008-03-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistdio/u-vsprintf.h (EOVERFLOW): Remove fallback.
+ * modules/unistdio/ulc-vsprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u8-vsprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u8-u8-vsprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u16-vsprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u16-u16-vsprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u32-vsprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u32-u32-vsprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/unistdio/u-vsnprintf.h (EOVERFLOW): Remove fallback.
+ * modules/unistdio/ulc-vsnprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u8-vsnprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u8-u8-vsnprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u16-vsnprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u16-u16-vsnprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u32-vsnprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u32-u32-vsnprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/unistdio/u-vasprintf.h (EOVERFLOW): Remove fallback.
+ * modules/unistdio/ulc-vasprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u8-vasprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u8-u8-vasprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u16-vasprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u16-u16-vasprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u32-vasprintf (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u32-u32-vasprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/unistdio/ulc-vfprintf.c (EOVERFLOW): Remove fallback.
+ * modules/unistdio/ulc-vfprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/unistdio/ulc-fprintf.c (EOVERFLOW): Remove fallback.
+ * modules/unistdio/ulc-fprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/xvasprintf.c (EOVERFLOW): Remove fallback.
+ * modules/xvasprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/vsprintf.c (EOVERFLOW): Remove fallback.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Drop gl_EOVERFLOW.
+ * modules/vsprintf-posix (Depends-on): Add EOVERFLOW.
+
+ * lib/vsnprintf.c (EOVERFLOW): Remove fallback.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Drop gl_EOVERFLOW.
+ * modules/vsnprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/vfprintf.c (EOVERFLOW): Remove fallback.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Drop gl_EOVERFLOW.
+ * modules/vfprintf-posix (Depends-on): Add EOVERFLOW.
+
+ * lib/vasprintf.c (EOVERFLOW): Remove fallback.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Drop gl_EOVERFLOW.
+ * modules/vasprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/vasnprintf.c (EOVERFLOW): Remove fallback.
+ * m4/vasnprintf.m4 (gl_FUNC_VASNPRINTF): Drop gl_EOVERFLOW.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Drop gl_EOVERFLOW.
+ * modules/vasnprintf (Files): Remove m4/eoverflow.m4.
+ (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/ulc-vasnprintf (Files): Remove m4/eoverflow.m4.
+ (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u8-vasnprintf (Files): Remove m4/eoverflow.m4.
+ (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u8-u8-vasnprintf (Files): Remove m4/eoverflow.m4.
+ (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u16-vasnprintf (Files): Remove m4/eoverflow.m4.
+ (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u16-u16-vasnprintf (Files): Remove m4/eoverflow.m4.
+ (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u32-vasnprintf (Files): Remove m4/eoverflow.m4.
+ (Depends-on): Add EOVERFLOW.
+ * modules/unistdio/u32-u32-vasnprintf (Files): Remove m4/eoverflow.m4.
+ (Depends-on): Add EOVERFLOW.
+
+ * lib/sprintf.c (EOVERFLOW): Remove fallback.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Drop gl_EOVERFLOW.
+ * modules/sprintf-posix (Depends-on): Add EOVERFLOW.
+
+ * lib/snprintf.c (EOVERFLOW): Remove fallback.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Drop gl_EOVERFLOW.
+ * modules/snprintf (Depends-on): Add EOVERFLOW.
+
+ * lib/poll.c (EOVERFLOW): Remove fallback.
+ * modules/poll (Depends-on): Add EOVERFLOW.
+
+ * lib/getugroups.c (EOVERFLOW): Remove fallback.
+ * modules/getugroups (Depends-on): Add EOVERFLOW.
+
+ * lib/getdelim.c (EOVERFLOW): Remove fallback.
+ * modules/getdelim (Depends-on): Add EOVERFLOW.
+
+ * lib/ftell.c (EOVERFLOW): Remove fallback.
+ * modules/ftell (Depends-on): Add EOVERFLOW.
+
+ * lib/fprintf.c (EOVERFLOW): Remove fallback.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Drop gl_EOVERFLOW.
+ * modules/fprintf-posix (Depends-on): Add EOVERFLOW.
+
+ * lib/c-stack.c (EOVERFLOW): Remove unused fallback.
+
+ * modules/EOVERFLOW-tests: New file.
+ * tests/test-EOVERFLOW.c: New file.
+
+ * modules/EOVERFLOW: New file.
+ * doc/posix-headers/errno.texi: Mention EOVERFLOW portability problem.
+
+2008-03-30 Bruno Haible <bruno@clisp.org>
+
+ Fix bug introduced on 2007-06-10.
+ * lib/vasnprintf.c (VASNPRINTF): When performing zero-padding, use
+ spaces instead of 0 digits for 's' also when ENABLE_UNISTDIO.
+
+2008-03-30 Bruno Haible <bruno@clisp.org>
+
+ Improve freadseek's efficiency after ungetc.
+ * lib/freadseek.c: Include freadahead.h.
+ (freadptrinc): New function, extracted from freadseek.
+ (freadseek): Use it in a loop. Use freadahead to determine the number
+ of loop iterations.
+ * modules/freadseek (Depends-on): Add freadahead.
+ (configure.ac): Require AC_C_INLINE.
+
+2008-03-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/freadseek.c (freadseek): Don't ignore the return value of
+ freadptr.
+
+2008-03-29 Eric Blake <ebb9@byu.net>
+
+ Add hex float support.
+ * modules/strtod (Depends-on): Add c-ctype.
+ (Link): Mention POW_LIB.
+ * lib/strtod.c (strtod): Recognize hex floats. Don't allow
+ whitespace between 'e' and exponent.
+ * tests/test-strtod.c (main): Enable hex float tests.
+ * doc/posix-functions/strtod.texi (strtod): Document what gnulib
+ now provides.
+
+ Document various strtod bugs, with some fixes.
+ * doc/posix-functions/strtod.texi (strtod): Document bugs with
+ "-0x", "inf", "nan", and hex constants.
+ * doc/posix-functions/atof.texi (atof): Likewise.
+ * modules/stdlib (Makefile.am): Support strtod.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Likewise.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Fit in stdlib framework, and
+ detect additional strtod bugs.
+ * lib/stdlib.in.h (rpl_strtod): Add declarations.
+ * lib/strtod.c (strtod): Return -0.0 on negative underflow. Use
+ bool where appropriate. Parse 'inf' and 'nan'.
+ * tests/test-strtod.c: New file.
+ * modules/strtod (Depends-on): Add stdbool, stdlib.
+ (configure.ac): Turn on module indicator.
+ * modules/strtod-tests: New module.
+
+2008-03-29 Eric Blake <ebb9@byu.net>
+
+ Fix ftell on mingw.
+ * lib/ftell.c (EOVERFLOW): Define if the system lacks it.
+ * modules/ftell-tests (Depends-on): Add binary-io.
+ * modules/ftello-tests (Depends-on): Likewise.
+ * tests/test-ftell.c (main): Enhance test to cover behavior after
+ ungetc. Enforce binary mode.
+ * tests/test-ftello.c (main): Likewise.
+
+ Pass test-freadseek on cygwin.
+ * modules/freadseek (Depends-on): Use freadptr, not freadahead.
+ * lib/freadseek.c (freadseek): Don't increment beyond bounds of
+ ungetc buffer.
+
+ * tests/test-fflush2.c (main): Fix typo.
+
+2008-03-29 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fflush2.c (main): Temporarily disable the contents of
+ this test.
+ * m4/fflush.m4 (gl_FUNC_FFLUSH): Add a TODO.
+ Reported by Eric Blake.
+
+2008-03-28 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc.h (enum Gc_hash): Add GC_SHA224.
+ (GC_SHA224_DIGEST_SIZE): Add.
+
+ * lib/gc-libgcrypt.c (gc_hash_open): Handle SHA-224.
+ (gc_hash_digest_length): Likewise.
+ (gc_hash_buffer): Likewise.
+
+2008-03-25 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (gettextize and autopoint): Explain in more
+ detail which gettext release to use.
+ Reported by Simon Josefsson.
+
+2008-03-26 Jim Meyering <meyering@redhat.com>
+
+ gnumakefile: remove file from $(top_builddir), not from $(top_srcdir)
+ * modules/gnumakefile (clean-GNUmakefile): Also, use
+ test ... && ... || : syntax rather than if-then ... fi.
+
+ gnumakefile: Don't double-quote-expand $(VPATH) value.
+ * modules/gnumakefile (clean-GNUmakefile): Use single quotes.
+
+2008-03-24 Eric Blake <ebb9@byu.net>
+
+ Alter GNUmakefile to install into top directory.
+ * modules/maintainer-makefile: Split, and add dependency...
+ * modules/gnumakefile: to this new module.
+ * build-aux/GNUmakefile: Move...
+ * top/GNUmakefile: ...here.
+ * build-aux/maint.mk: Move...
+ * top/maint.mk: ...here.
+ * MODULES.html.sh (Support for maintaining...): Document new
+ module.
+
+2008-03-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: New options --vc-files, --no-vc-files.
+ (func_usage): Document them.
+ (vc_files): New variable.
+ (func_import): Consider vc_files.
+ (func_create_testdir): Set vc_files to empty.
+ Suggested by Jim Meyering and Karl Berry.
+
+2008-03-23 Bruno Haible <bruno@clisp.org>
+
+ Fix regex compilation error on HP-UX 11.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Require AC_TYPE_MBSTATE_T.
+ * modules/regex (Files): Add m4/mbstate_t.m4.
+ Reported by Ton Voon <ton.voon@altinity.com>.
+
+2008-03-23 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (gettextize and autopoint): New section.
+
+2008-03-23 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ Install files from top/ in the destination directory.
+ * gnulib-tool (func_get_automake_snippet): Synthesize an EXTRA_DIST
+ augmentation also for the files from top/.
+ (func_import, func_create_testdir): Rewrite file names:
+ top/filename -> filename.
+
+2008-03-23 Bruno Haible <bruno@clisp.org>
+
+ Tweak "gnulib --version" output.
+ * gnulib-tool (func_version): Replace "-dirty" suffix with "-modified".
+
+2008-03-23 Bruno Haible <bruno@clisp.org>
+
+ Tweak "gnulib --version" output.
+ * gnulib-tool (func_version): Use date of last commit to ChangeLog,
+ rather than contents of ChangeLog, when possible.
+
+2008-03-21 Eric Blake <ebb9@byu.net>
+
+ More --version tweaks.
+ * gnulib-tool (func_version): Obey GNU Coding Standards. Output
+ date of last ChangeLog entry.
+
+2008-03-21 Jim Meyering <meyering@redhat.com>
+
+ * build-aux/GNUmakefile (_have-git-version-gen): Split long line.
+
+2008-03-20 Eric Blake <ebb9@byu.net>
+
+ VPATH fix.
+ * build-aux/GNUmakefile (_have_git-version-gen): Look in correct dir.
+
+2008-03-20 Simon Josefsson <simon@josefsson.org>
+
+ * build-aux/GNUmakefile: Make git-version-gen optional. Add
+ _build-aux variable. Suggested by Eric Blake <ebb9@byu.net>.
+
+2008-03-20 Eric Blake <ebb9@byu.net>
+
+ Sync GNUmakefile with coreutils.
+ * build-aux/GNUmakefile (have-Makefile): Rename...
+ (_have-Makefile): ...to this, for namespace consideration.
+ (GNUmakefile.cfg): Include, if present.
+ (_autoreconf): Define a default.
+ (_is-dist-target): New rule for rebuilds to pick up intra-release
+ version.
+ (maint-cfg.mk): Rename...
+ (cfg.mk): ...to this.
+
+2008-03-18 Jim Meyering <meyering@redhat.com>
+
+ New script and module: mktempd
+ * MODULES.html.sh (maint+release support): Add mktempd.
+ * build-aux/mktempd: New file.
+ * modules/mktempd: New file.
+
+2008-03-15 Jim Meyering <meyering@redhat.com>
+
+ Undo last change.
+ * lib/sha1.c, lib/md5.c: 63 != ~63.
+ Reported by Andreas Schwab.
+
+ sha1.c, md5.c: Hoist a redundant expression.
+ * lib/sha1.c (sha1_process_bytes): AND-off the low bits in
+ "ctx->buflen" only once, before calling *_process_block.
+ * lib/md5.c (md5_process_bytes): Likewise.
+
+2008-03-14 Eric Blake <ebb9@byu.net>
+
+ Bump copyright year in files generated by gnulib-tool.
+ * gnulib-tool (func_emit_copyright_notice): Extract copyright from
+ gnulib-tool, rather than hard-coding it.
+
+ Fix 'gnulib-tool --version' output to work with git.
+ * gnulib-tool (func_gnulib_dir): New function, extracted from...
+ (startup): ...here.
+ (func_version): Use it to invoke git-version-gen, rather than
+ relying on CVS keyword expansion. Modernize wording.
+ (cvsdatestamp, last_checkin_date, version): Kill unused
+ variables.
+
+2008-03-12 Jim Meyering <meyering@redhat.com>
+
+ Recognize optional cast of the argument to free.
+ * build-aux/useless-if-before-free: Update regexps.
+
+ * build-aux/bootstrap (gnulib_tool): Remove trailing blanks.
+
+2008-03-11 Bruno Haible <bruno@clisp.org>
+
+ Extend AC_LIB_LINKFLAGS to the situation of several libraries provided
+ by a single package.
+ * m4/lib-link.m4 (AC_LIB_FROMPACKAGE): New macro.
+ (AC_LIB_LINKFLAGS_BODY): Use the information stored by
+ AC_LIB_FROMPACKAGE. Use AC_ARG_WITH instead of AC_LIB_ARG_WITH.
+ Reported by Sam Steingold <sds@gnu.org>.
+
+2008-03-12 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * build-aux/bootstrap (version_controlled_file): Adapt for SVN
+ repositories.
+
+2008-03-11 Bruno Haible <bruno@clisp.org>
+
+ Avoid conflicts between local macro definitions.
+ * m4/lib-link.m4 (AC_LIB_LINKFLAGS, AC_LIB_HAVE_LINKFLAGS,
+ AC_LIB_LINKFLAGS_BODY): Use pushdef/popdef instead of define/undefine.
+
+2008-03-10 Peter O'Gorman <bug-gnulib@mlists.thewrittenword.com>
+ Bruno Haible <bruno@clisp.org>
+
+ Make va_copy work with some version of xlc on AIX 5.1.
+ * lib/stdarg.in.h: New file.
+ * m4/stdarg.m4 (gl_STDARG_H): Initialize STDARG_H and NEXT_STDARG_H.
+ On AIX, use a <stdarg.h> file substitute.
+ * modules/stdarg (Files): Add lib/stdarg.in.h.
+ (Depends-on): Add include_next.
+ (Makefile.am): Build a stdarg.h substitute if requested.
+ * doc/posix-functions/va_copy.texi: Document the platforms lacking it.
+
+2008-03-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/include_next.m4 (gl_CHECK_NEXT_HEADERS): Document a restriction.
+ * m4/absolute-header.m4 (gl_ABSOLUTE_HEADER): Likewise.
+ Reported by Peter O'Gorman <bug-gnulib@mlists.thewrittenword.com>.
+
+2008-03-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdlib (Depends-on): Add include_next, remove
+ absolute-header.
+
+2008-03-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/freadahead.h (freadahead): Document more precisely.
+ * lib/freadahead.c (freadahead): When an ungetc is in effect, return
+ the sum of both buffer sizes.
+ * tests/test-freadahead.c (main): Also test behaviour after ungetc.
+ * NEWS: Document the change.
+
+2008-03-09 Bruno Haible <bruno@clisp.org>
+
+ Extend freadptr to return also the buffer size.
+ * lib/freadptr.h (freadptr): Add sizep argument.
+ * lib/freadptr.c: Include freadptr.h, not freadahead.h.
+ (freadptr): Add sizep argument. Determine buffer size like freadahead
+ does.
+ * tests/test-freadptr.c: Don't include freadahead.h.
+ (main): Adapt for new calling convention of freadptr.
+ * tests/test-freadptr2.c: New file, based on tests/test-freadahead.c.
+ * tests/test-freadptr2.sh: New file, based on tests/test-freadahead.sh.
+ * modules/freadptr-tests (Files): Add tests/test-freadptr2.c,
+ tests/test-freadptr2.sh.
+ (Depends): Remove freadahead.
+ (TESTS): Add test-freadptr2.sh.
+ (check_PROGRAMS): Add test-freadptr2.
+
+2008-03-09 Bruno Haible <bruno@clisp.org>
+
+ * doc/Makefile (%.pdf): Explain how to remedy the save_size error.
+ Report and solution by Simon Josefsson.
+
+2008-03-06 Bruno Haible <bruno@clisp.org>
+
+ Make fflush after ungetc work on BSD platforms.
+ * lib/fflush.c (rpl_fflush): Discard ungetc buffer if possible.
+ * tests/test-fflush2.c: New file.
+ * tests/test-fflush2.sh: New file.
+ * modules/fflush-tests (Files): Add tests/test-fflush2.sh,
+ tests/test-fflush2.c.
+ (Makefile.am): Build test-fflush2 and run test-fflush2.sh.
+ * doc/posix-functions/fflush.texi: Document fflush after ungetc bug.
+
+2008-03-06 Eric Blake <ebb9@byu.net>
+
+ Likewise for ftello.
+ * modules/ftello (Dependencies): Add extensions.
+ * m4/ftello.m4 (gl_FUNC_FTELLO): Require AC_USE_SYSTEM_EXTENSIONS.
+
+2008-03-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/fseeko (Dependencies): Add extensions.
+ * m4/fseeko.m4 (gl_FUNC_FSEEKO): Require AC_USE_SYSTEM_EXTENSIONS.
+ Needed on glibc systems.
+
+2008-03-06 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (@nosuchmodulenote): Avoid line break inside
+ email address.
+ Reported by Thien-Thi Nguyen <ttn@gnuvola.org>.
+
+2008-03-06 Bruno Haible <bruno@clisp.org>
+
+ * users.txt: Add libgnupdf.
+
+2008-03-06 Thien-Thi Nguyen <ttn@gnuvola.org> (tiny change)
+
+ * doc/gnulib-tool.texi (@nosuchmodulenote): New macro.
+ (Header File Substitutes, Function Substitutes,
+ Glibc Header File Substitutes, Glibc Function Substitutes): Use it.
+ (Build robot for gnulib): Fix typo.
+
+2008-03-06 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (VCS Issues): Small updates.
+ Reported by Thien-Thi Nguyen <ttn@gnuvola.org>.
+
+2008-03-06 Bruno Haible <bruno@clisp.org>
+
+ * doc/func.texi: New file, extracted from doc/gnulib.texi.
+ * doc/gnulib.texi: Include it.
+
+2008-03-06 Simon Josefsson <simon@josefsson.org>
+
+ * modules/func (License): Change license to unlimited; there was
+ no LGPL parts in the module anyway.
+
+2008-03-06 Simon Josefsson <simon@josefsson.org>
+
+ * modules/__func__: Renamed to modules/func.
+ * modules/__func__-tests: Renamed to modules/func-tests.
+ * tests/test-__func__.c: Renamed to tests/test-func.c.
+ * m4/__func__.m4: Renamed to m4/func.m4.
+ * doc/gnulib.texi (__func__): Section renamed to func.
+ Suggested by Eric Blake <ebb9@byu.net>.
+
+2008-03-06 Simon Josefsson <simon@josefsson.org>
+
+ * doc/gnulib.texi (__func__): Use C99 terminology when talking
+ about __func__. Make example self-contained. Suggested by Eric
+ Blake <ebb9@byu.net>.
+
+ * tests/test-__func__.c (main): Avoid extraneous () around __func.
+ Suggested by Eric Blake <ebb9@byu.net>.
+
+2008-03-06 Simon Josefsson <simon@josefsson.org>
+
+ * modules/__func__: New file.
+ * modules/__func__-tests: New file.
+ * tests/test-__func__.c: New file.
+ * m4/__func__.m4: New file.
+ * doc/gnulib.texi (__func__): Document __func__ module.
+
+2008-03-05 Simon Josefsson <simon@josefsson.org>
+
+ * modules/byteswap (License): Re-license as LGPLv2+.
+
+2008-03-05 Simon Josefsson <simon@josefsson.org>
+
+ * doc/Makefile: Add pdf target.
+
+2008-03-05 Simon Josefsson <simon@josefsson.org>
+
+ * modules/inline (License): Use 'unlimited', since there are only
+ *.m4 files in this module.
+
+2008-03-03 John E. Malmberg <wb8tyw@qsl.net> (tiny change)
+ Bruno Haible <bruno@clisp.org>
+
+ Add support for HP C 7.1 on OpenVMS 8.3.
+ * lib/alloca.in.h (alloca): Define as alias for DEC C on VMS.
+
+2008-03-03 John E. Malmberg <wb8tyw@qsl.net> (tiny change)
+
+ Update VMS specifics.
+ * lib/getopt.c [VMS]: Remove include of unixlib.h.
+
+2008-03-02 Jim Meyering <meyering@redhat.com>
+
+ Remove the last dependency on the "free" module.
+ * m4/readutmp.m4 (gl_READUTMP): Don't require gl_FUNC_FREE.
+ Reported by Bob Proulx.
+
+ * lib/getdelim.c (getdelim): Don't leak memory upon failed realloc.
+
+ Remove useless "if" tests before free. Deprecate "free" module.
+ * doc/posix-functions/free.texi: Mention that this
+ module is no longer useful.
+ * modules/free (Notice): Say this module is obsolete.
+ * modules/readutmp (Depends-on): Remove free.
+ * lib/save-cwd.c (free_cwd): Remove useless "if" before free.
+ * lib/putenv.c (putenv): Likewise.
+ * lib/gc-gnulib.c (gc_cipher_close): Likewise.
+ * lib/getaddrinfo.c (freeaddrinfo): Likewise.
+ * tests/test-c-strcasestr.c (main): Likewise.
+ * tests/test-c-strstr.c (main): Likewise.
+ * tests/test-mbscasestr1.c (main): Likewise.
+ * tests/test-mbscasestr2.c (main): Likewise.
+ * tests/test-mbsstr1.c (main): Likewise.
+ * tests/test-mbsstr2.c (main): Likewise.
+ * tests/test-memmem.c (main): Likewise.
+ * tests/test-strcasestr.c (main): Likewise.
+ * tests/test-striconv.c (main): Likewise.
+ * tests/test-striconveh.c (main): Likewise.
+ * tests/test-striconveha.c (main): Likewise.
+ * tests/test-strstr.c (main): Likewise.
+
+ * build-aux/git-version-gen: Adjust a comment and the Usage string.
+
+ bootstrap: sync from coreutils again
+ * build-aux/bootstrap: Remove dangling m4/*.m4 symlinks.
+
+2008-03-01 Jim Meyering <meyering@redhat.com>
+
+ bootstrap: sync from coreutils
+ * build-aux/bootstrap (update_po_files): Copy a .po file into place
+ also when the target doesn't exist.
+
+2008-03-01 Eric Blake <ebb9@byu.net>
+
+ Fix bugs in last patch.
+ * lib/memchr2.c (memchr2): Fix typo.
+ * tests/test-memchr2.c: Test previous bug, and don't use GNU
+ extension.
+ Reported by Bruce Korb.
+
+ New module 'memchr2'.
+ * modules/memchr2: New file.
+ * modules/memchr2-tests: Likewise.
+ * lib/memchr2.h: Likewise.
+ * lib/memchr2.c: Likewise, based on memchr.c.
+ * tests/test-memchr2.c: New test.
+ * MODULES.html.sh (String handling): Add memchr2.
+
+2008-02-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/freadseek-tests: New file.
+ * tests/test-freadseek.sh: New file.
+ * tests/test-freadseek.c: New file.
+
+ New module 'freadseek'.
+ * modules/freadseek: New file.
+ * lib/freadseek.h: New file.
+ * lib/freadseek.c: New file.
+ * MODULES.html.sh (File stream based Input/Output): Add freadseek.
+
+2008-02-29 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * users.txt: Add anubis, cpio, mailfromd, mailutils, radius,
+ wydawca.
+
+ * m4/argp.m4 (gl_ARGP): Use AC_TRY_LINK to test if
+ program_invocation_name and program_invocation_short_name are
+ present.
+
+2008-02-28 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-freadptr.c: Add a test for behaviour after ungetc.
+ * tests/test-freadptr.sh: Also test non-seekable stdin.
+
+2008-02-28 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * build-aux/bootstrap (source_base, m4_base)
+ (doc_base, tests_base): New variables.
+ (gnulib_tool_options): Do not hardcode base directories, use
+ the above variables instead.
+
+2008-02-28 Atsushi SAKAI <sakaia@jp.fujitsu.com>
+
+ * lib/xsize.h: Fix typo in comment: s/tupe/type/.
+
+2008-02-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/freadptr-tests: New file.
+ * tests/test-freadptr.sh: New file.
+ * tests/test-freadptr.c: New file.
+
+ New module 'freadptr'.
+ * modules/freadptr: New file.
+ * lib/freadptr.h: New file.
+ * lib/freadptr.c: New file.
+ * MODULES.html.sh (File stream based Input/Output): Add freadptr.
+
+2008-02-26 Karl Berry <karl@freefriends.org>
+
+ Sync from Libtool:
+ * libltdl/argz.c (argz_add, argz_count): New functions.
+ * libltdl/argz.in.h: Declare them.
+ Report by Juan Manuel Guerrero <juan.guerrero@gmx.de>.
+
+2008-02-22 Bruno Haible <bruno@clisp.org>
+
+ * m4/time_r.m4 (gl_TIME_R): Also check that localtime_r's return type
+ is a pointer type. Needed for HP-UX 10.
+ * doc/posix-functions/localtime_r.texi: Mention HP-UX 10.
+ * doc/posix-functions/gmtime_r.texi: Likewise.
+ Reported by Peter O'Gorman <bug-gnulib@mlists.thewrittenword.com>.
+
+2008-02-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/environ-tests: New file.
+ * tests/test-environ.c: New file.
+
+ New module 'environ'.
+ * modules/environ: New file.
+ * lib/unistd.in.h (environ): New declaration.
+ * m4/environ.m4: New file.
+ (gt_CHECK_VAR_DECL): Moved here from m4/setenv.m4. Undefine gt_cv_var
+ after use.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_ENVIRON and
+ HAVE_DECL_ENVIRON.
+ * modules/unistd (Makefile.am): Substitute also GNULIB_ENVIRON and
+ HAVE_DECL_ENVIRON.
+ * doc/posix-functions/environ.texi: Mention module 'environ'. Remove
+ wrong claim that 'environ' is missing on some systems.
+ * modules/execute (Depends-on): Add environ.
+ * lib/execute.c (environ): Remove fallback declaration.
+ * modules/pipe (Depends-on): Add environ.
+ * lib/pipe.c (environ): Remove fallback declaration.
+ * modules/setenv (Depends-on): Add environ.
+ * lib/setenv.c (environ): Remove fallback declaration.
+ * modules/unsetenv (Depends-on): Add environ.
+ * lib/unsetenv.c (environ): Remove fallback declaration.
+ * m4/setenv.m4 (gt_CHECK_VAR_DECL): Remove macro. Moved to
+ m4/environ.m4.
+ (gl_PREREQ_SETENV): Require gl_ENVIRON instead of testing for environ.
+ (gl_PREREQ_UNSETENV): Likewise.
+
+2008-02-24 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-functions/environ.texi: Document the MacOS X problem.
+
+2008-02-20 Bob Proulx <bob@proulx.com>
+
+ Enable use of older two part flavor 'git describe'.
+ * build-aux/git-version-gen: If using the older two part flavor of
+ git version then recreate the third part now present in the
+ newer three part flavor of git describe.
+
+2008-02-20 Martin Buchholz <martin@xemacs.org> (tiny change)
+
+ * lib/fts.c (fts_build): Typo correction to comment.
+
+2008-02-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/git-merge-changelog.c (main) [split_merged_entry]: Avoid
+ generating no-op conflicts.
+
+2008-02-17 Bruno Haible <bruno@clisp.org>
+
+ Speed up by 10%.
+ * lib/git-merge-changelog.c (main): Use the iterator to iterate through
+ result_entries, rather than an index-based loop.
+
+2008-02-17 Bruno Haible <bruno@clisp.org>
+
+ Speed up by 25%.
+ * lib/git-merge-changelog.c (struct entry): New fields 'hashcode',
+ 'hashcode_cached'.
+ (entry_create): New function.
+ (entry_hashcode): Use the cached hashcode if possible.
+ (read_changelog_file, try_split_merged_entry): Use entry_create.
+
+2008-02-17 Bruno Haible <bruno@clisp.org>
+
+ Speed up from O(n^2) to O(n) for long ChangeLog files.
+ * lib/git-merge-changelog.c: Include gl_rbtreehash_list.h.
+ (read_changelog_file): Change implementation of entries_reversed list
+ to rbtreehash.
+ * modules/git-merge-changelog (Depends-on): Add rbtreehash-list.
+
+2008-02-17 Bruno Haible <bruno@clisp.org>
+
+ New option --split-merged-entry.
+ * lib/git-merge-changelog.c (FSTRCMP_STRICTER_THRESHOLD): New macro.
+ (find_paragraph_end, try_split_merged_entry): New functions.
+ (long_options): Add option --split-merged-entry.
+ (usage): Document option --split-merged-entry.
+ (main): Implement option --split-merged-entry.
+ Reported by Eric Blake.
+
+2008-02-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/git-merge-changelog.c: Include c-strstr.h.
+ (main): Support the "git pull --rebase" situation.
+ * modules/git-merge-changelog (Depends-on): Add c-strstr.
+ Reported by Eric Blake.
+
+2008-02-16 Eric Blake <ebb9@byu.net>
+
+ Avoid doubling \ in common case of "c-maybe" quoting style.
+ * lib/quotearg.c (quotearg_buffer_restyled): Don't escape \ when
+ eliding outer quotes.
+ * lib/quotearg.h: Document this.
+ * tests/test-quotearg.c (result_strings, inputs, results_g)
+ (flag_results, locale_results): Test it by adding a new string to
+ each test group.
+ (compare_strings): Test new string.
+
+2008-02-13 Eric Blake <ebb9@byu.net>
+
+ Avoid trigraph quoting in default output.
+ * lib/quotearg.h (enum quoting_flags): Add QA_SPLIT_TRIGRAPHS.
+ * lib/quotearg.c (quotearg_buffer_restyled): Don't quote trigraphs
+ unless explicitly requested.
+ * tests/test-quotearg.c (flag_results, main): Add additional tests.
+
+2008-02-13 Lasse Collin <lasse.collin@tukaani.org>
+
+ Don't rely on signed integer overflowing to negative value.
+ * lib/getugroups.c (getugroups): Include <limits.h>.
+ Instead, compare against INT_MAX, and increment only if the test passes.
+
+2008-02-13 Jim Meyering <meyering@redhat.com>
+ and Eric Blake <ebb9@byu.net>
+
+ Avoid shadowing warning and compile errors on Linux.
+ * tests/test-quotearg.c [ENABLE_NLS]: Disable <libintl.h>
+ forwarding macros on Linux.
+ (dcgettext): Define a stub, for Linux.
+ (results_g, main): Avoid warnings.
+
+2008-02-12 Eric Blake <ebb9@byu.net>
+
+ Silence warning in last patch.
+ * lib/quotearg.c (quotearg_buffer_restyled): Add missing const.
+
+ Quotearg part 4: add tests, fix c-maybe colon quoting.
+ * lib/quotearg.h: Improve documentation.
+ * lib/quotearg.c (quotearg_buffer_restyled): Don't add extra
+ escapes when adding outer quotes. When quoting trigraphs, use
+ valid C notation. When quoting NUL, omit extra characters if next
+ character is not digit. Alter prototype.
+ (quotearg_buffer, quotearg_alloc_mem, quotearg_n_options): Adjust
+ callers.
+ * modules/quotearg-tests: New module.
+ * tests/test-quotearg.c: New test.
+
+2008-02-07 Eric Blake <ebb9@byu.net>
+
+ Quotearg part 3: add flag to control outer quote elision.
+ * lib/quotearg.h (c_maybe_quoting_style): New style.
+ (enum quoting_flags): Better documentation of flags.
+ * lib/quotearg.c (quoting_style_args, quoting_style_vals): Add
+ c-maybe style.
+ (quotearg_buffer_restyled): Handle new flag to elide outer
+ quotes.
+
+ Quotearg part 2: add flag that can control NUL elision.
+ * lib/quotearg.h (set_quoting_flags): New prototype.
+ * lib/quotearg.c (struct quoting_options): Add flag field.
+ (set_quoting_flags): New function.
+ (quotearg_buffer_restyled): Add flags parameter.
+ (quotearg_alloc_mem): Set the flag if length cannot be returned.
+ (quotearg_n_options): Set the flag, since length cannot be
+ returned.
+ (quoting_options_from_style): Default flags correctly.
+
+ Quotearg part 1: more wrappers, restore quotearg_char state.
+ * lib/quotearg.h (quotearg_alloc_mem, quotearg_n_mem)
+ (quotearg_mem, quotearg_style_mem, quotearg_char_mem)
+ (quotearg_colon_mem): New wrappers.
+ * lib/quotearg.c (quotearg_alloc, quotearg_char): Rewrite...
+ (quotearg_alloc_mem, quotearg_char_mem): ...in terms of these new
+ functions.
+ (quotearg_n_mem, quotearg_mem, quotearg_style_mem)
+ (quotearg_colon_mem): New functions.
+
+2008-02-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/git-merge-changelog (Makefile.am): Don't use -L and -l for a
+ library in the current directory: it does not work with parallel make.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2008-02-11 Bruno Haible <bruno@clisp.org>
+
+ * .gitattributes: New file.
+
+2008-02-11 Jim Meyering <meyering@redhat.com>
+
+ useless-if-before-free: Fix reversed exit values.
+ * build-aux/useless-if-before-free: Use correct values
+ for EXIT_MATCH and EXIT_NO_MATCH.
+
+ * build-aux/useless-if-before-free: Close stdout carefully.
+
+2008-02-10 Bruno Haible <bruno@clisp.org>
+
+ New module 'git-merge-changelog'.
+ * modules/git-merge-changelog: New file.
+ * lib/git-merge-changelog.c: New file.
+
+2008-02-10 Jim Meyering <meyering@redhat.com>
+
+ useless-if-before-free: New option: --list (-l).
+
+ useless-if-before-free: Don't exit immediately upon open failure.
+ * build-aux/useless-if-before-free: Exit 2 for errors.
+ Upon failure to open a file, don't exit immediately.
+ Rather, just warn and continue with any remaining files.
+
+2008-02-10 Bruno Haible <bruno@clisp.org>
+
+ New abstract list operation 'node_set_value'.
+ * lib/gl_list.h (gl_list_node_set_value): New function.
+ (struct gl_list_implementation): New field node_set_value.
+ * lib/gl_list.c (gl_list_node_set_value): New function.
+ * lib/gl_array_list.c (gl_array_node_set_value): New function.
+ (gl_array_list_implementation): Update.
+ * lib/gl_carray_list.c (gl_carray_node_set_value): New function.
+ (gl_carray_list_implementation): Update.
+ * lib/gl_anylinked_list2.h (gl_linked_node_set_value): New function.
+ * lib/gl_linked_list.c (gl_linked_list_implementation): Update.
+ * lib/gl_linkedhash_list.c (gl_linkedhash_list_implementation): Update.
+ * lib/gl_anytree_list2.h (gl_tree_node_set_value): New function.
+ * lib/gl_avltree_list.c (gl_avltree_list_implementation): Update.
+ * lib/gl_rbtree_list.c (gl_rbtree_list_implementation): Update.
+ * lib/gl_avltreehash_list.c (gl_avltreehash_list_implementation):
+ Update.
+ * lib/gl_rbtreehash_list.c (gl_rbtreehash_list_implementation): Update.
+ * lib/gl_sublist.c (gl_sublist_node_set_value): New function.
+ (gl_sublist_list_implementation): Update.
+
+2008-02-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/diffseq.h: Write "ELEMENT const" instead of "const ELEMENT".
+ Needed when ELEMENT is #defined to 'some_type *'.
+
+2008-02-10 Jim Meyering <meyering@redhat.com>
+
+ New script and module: useless-if-before-free
+ * MODULES.html.sh (maint+release support): Add useless-if-before-free.
+ * build-aux/useless-if-before-free: New file.
+ * modules/useless-if-before-free: New file.
+
+ * build-aux/gitlog-to-changelog: Use committer date, not author date.
+
+ xstrtol_error: Fix typo.
+ * lib/xstrtol-error.c (xstrtol_error): The parameter was unused:
+ s/exit_failure/exit_status/.
+
+2008-02-09 Jim Meyering <meyering@redhat.com>
+
+ New script and module: gitlog-to-changelog
+ * MODULES.html.sh (maint+release support): Add gitlog-to-changelog.
+ * modules/gitlog-to-changelog: New file.
+ * build-aux/gitlog-to-changelog: New file.
+
+2008-02-08 Jim Meyering <meyering@redhat.com>
+
+ Avoid two "parameter unused" warnings.
+ * lib/stat-time.h (get_stat_birthtime_ns, get_stat_birthtime):
+ Mark "st" as used.
+
+ Use "git COMMAND", not "git-COMMAND".
+ * build-aux/bootstrap (version_controlled_file): s/git-rm/git-rm/.
+ * build-aux/announce-gen (get_tool_versions): Correct a diagnostic.
+ * build-aux/git-version-gen: Use "git status", not "git-status".
+
+2008-02-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Don't use %n on native Woe32 systems.
+ Avoids a crash on Windows Vista.
+ Reported by Adam Strzelecki <ono@java.pl> via
+ Simon Josefsson <simon@josefsson.org>.
+
+2008-02-06 Bruno Haible <bruno@clisp.org>
+
+ Fix *printf behaviour regarding the left-adjust flag on HP-UX 10.20.
+ * m4/printf.m4 (gl_PRINTF_FLAG_LEFTADJUST): New macro.
+ * lib/vasnprintf.c (VASNPRINTF): Handle NEED_PRINTF_FLAG_LEFTADJUST.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST): New macro.
+ (gl_PREREQ_VASNPRINTF_WITH_EXTRAS): Invoke it.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+ gl_PRINTF_FLAG_LEFTADJUST and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * tests/test-vasnprintf-posix.c (test_function): Add testcases for the
+ left-adjust flag.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * doc/posix-functions/fprintf.texi: Update.
+ * doc/posix-functions/printf.texi: Update.
+ * doc/posix-functions/snprintf.texi: Update.
+ * doc/posix-functions/sprintf.texi: Update.
+ * doc/posix-functions/vfprintf.texi: Update.
+ * doc/posix-functions/vprintf.texi: Update.
+ * doc/posix-functions/vsnprintf.texi: Update.
+ * doc/posix-functions/vsprintf.texi: Update.
+ Reported by Peter Fales <psfales@alcatel-lucent.com>.
+
+2008-02-06 Bruno Haible <bruno@clisp.org>
+
+ Fix bug introduced on 2008-01-26.
+ * lib/isnan.c (FUNC): Set to rpl_isnand, not rpl_isnan.
+
+2008-02-06 Bruno Haible <bruno@clisp.org>
+
+ Fix bug introduced on 2007-06-10.
+ * lib/vasnprintf.c (VASNPRINTF): Perform zero-padding also if
+ !NEED_PRINTF_FLAG_ZERO.
+
+2008-02-05 Peter O'Gorman <pogma@thewrittenword.com>
+
+ getloadavg: use libperfstat on AIX5
+ * lib/getloadavg.c, m4/getloadavg.m4 [aix]: Use libperfstat
+
+2008-02-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/diffseq.h: Add comments about required #includes.
+ Reported by Michael Biggs <gnulib@doubleplum.net>.
+
+2008-02-01 Bruno Haible <bruno@clisp.org>
+
+ * users.txt: Add gnuit.
+
+2008-01-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/md4.c (set_uint32): Mark as inline.
+ * lib/md5.c (set_uint32): Likewise.
+ * lib/sha1.c (set_uint32): Likewise.
+ * m4/md4.m4 (gl_MD4): Require AC_C_INLINE.
+ * m4/md5.m4 (gl_MD5): Likewise.
+ * m4/sha1.m4 (gl_SHA1): Likewise.
+
+2008-01-31 Jim Meyering <meyering@redhat.com>
+
+ Use "sizeof VAR", rather than a literal "4".
+ * lib/md5.c (md5_read_ctx): Use sizeof ctx->A, not 4.
+ * lib/md4.c (md4_read_ctx): Likewise.
+ * lib/sha1.c (sha1_read_ctx): Likewise.
+
+2008-01-31 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-sha1.c: New file, based on test-md5.c.
+
+ * modules/crypto/sha1-tests: New file.
+
+2008-01-31 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sha1.h (SHA1_DIGEST_SIZE): Define.
+
+2008-01-31 Jim Meyering <meyering@redhat.com>
+
+ Prefer "sizeof v" over the equivalent "4".
+ * lib/md4.c (set_uint32): Use "sizeof v" as memcpy length, not 4.
+ * lib/md5.c (set_uint32): Likewise.
+ * lib/sha1.c (set_uint32): Likewise.
+
+2008-01-31 Simon Josefsson <simon@josefsson.org>
+
+ * lib/sha1.c (set_uint32): Mark function as static.
+
+2008-01-31 Simon Josefsson <simon@josefsson.org>
+
+ md2: clarify comments to say that alignment is not required.
+ * lib/md2.h: Remove warning about alignment in comment.
+ * lib/md2.c (md2_read_ctx, md2_finish_ctx): Doc fix, alignment has
+ never been required.
+
+2008-01-31 Simon Josefsson <simon@josefsson.org>
+
+ md4: adapt alignment constraint fix from sha1.
+ * lib/md4.c (set_uint32): New function, from sha1.c
+ (md4_read_ctx): Use it.
+ (md4_finish_ctx): Doc fix.
+ * lib/md4.h: Doc fix.
+
+2008-01-31 Simon Josefsson <simon@josefsson.org>
+
+ md5: adapt alignment constraint fix from sha1.
+ * lib/md5.c (set_uint32): New function, from sha1.c
+ (md5_read_ctx): Use it.
+ (md5_finish_ctx): Doc fix.
+ * lib/md5.h: Doc fix.
+
+2008-01-30 Peter Palfrader <weasel@debian.org>
+
+ sha1: remove the result buffer alignment constraint
+ * lib/sha1.c (set_uint32): New function.
+ (sha1_read_ctx): Rewrite to remove the result buffer alignment
+ constraint.
+ (sha1_finish_ctx): Remove comment warning about alignment constraint.
+ * lib/sha1.h: Likewise.
+
+2008-01-30 Andreas Schwab <schwab@suse.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): Include <float.h> and ensure a
+ correct definition of LDBL_MIN_EXP.
+
+2008-01-30 Karl Berry <karl@gnu.org>
+
+ * config/srclist-update: try to preserve x bit on updates.
+ * config/srclistvars.sh: update for karl.
+
+2008-01-29 Jim Meyering <meyering@redhat.com>
+
+ vasnprintf.c: Avoid warning about unused label
+ * lib/vasnprintf.c (VASNPRINTF) [!USE_SNPRINTF]: Guard the
+ "overflow" label definition and associated code with the
+ same cpp condition that guards the sole use of that label.
+
+2008-01-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanl.m4 (gl_HAVE_ISNANL_NO_LIBM, gl_HAVE_ISNANL_IN_LIBM,
+ gl_FUNC_ISNANL_WORKS): Test the GCC >= 4.0 built-in.
+ * lib/isnanl.h (isnanl): Use the GCC >= 4.0 built-in.
+ * lib/isnanl-nolibm.h (isnanl): Likewise.
+ Reported by Paul Eggert <eggert@cs.ucla.edu>.
+
+2008-01-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnand.m4 (gl_FUNC_ISNAND_NO_LIBM): Test the GCC >= 4.0 built-in.
+ * lib/isnand.h (isnand): Use the GCC >= 4.0 built-in.
+
+2008-01-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanf.m4 (gl_HAVE_ISNANF_NO_LIBM, gl_ISNANF_WORKS): Test the
+ GCC >= 4.0 built-in.
+ * lib/isnanf.h (isnanf): Use the GCC >= 4.0 built-in.
+
+2008-01-26 Bruno Haible <bruno@clisp.org>
+
+ Rename isnan, applicable to 'double' only, to isnand.
+ * modules/isnand-nolibm: Renamed from modules/isnan-nolibm.
+ (Files): Add lib/isnand.h, lib/isnand.c. Remove lib/isnan.h.
+ (configure.ac): Update.
+ (Include): Replace "isnan.h" with "isnand.h".
+ * m4/isnand.m4: Renamed from m4/isnan.m4.
+ (gl_FUNC_ISNAND_NO_LIBM): Renamed from gl_FUNC_ISNAN_NO_LIBM. Set
+ HAVE_ISNAND_IN_LIBC instead of HAVE_ISNAN_IN_LIBC. Build isnand.c
+ instead of isnan.c.
+ * lib/isnand.h: Renamed from lib/isnan.h. Test HAVE_ISNAND_IN_LIBC
+ instead of HAVE_ISNAN_IN_LIBC.
+ (isnand): Renamed from isnan.
+ * lib/isnand.c: New file.
+ * modules/isnand-nolibm-tests: Renamed from modules/isnan-nolibm-tests.
+ (Files): Add tests/test-isnand.c. Remove tests/test-isnan.c.
+ (Makefile.am): Update.
+ * tests/test-isnand.c: Renamed from tests/test-isnan.c.
+ Include isnand.h instead of isnan.h.
+ (main): Test isnand instead of isnan.
+ * modules/fprintf-posix (Depends-on): Add isnand-nolibm, remove
+ isnan-nolibm.
+ * modules/frexp (Depends-on): Likewise.
+ * modules/frexp-tests (Depends-on): Likewise.
+ * modules/frexp-nolibm (Depends-on): Likewise.
+ * modules/frexp-nolibm-tests (Depends-on): Likewise.
+ * modules/isfinite (Depends-on): Likewise.
+ * modules/round-tests (Depends-on): Likewise.
+ * modules/signbit (Depends-on): Likewise.
+ * modules/signbit-tests (Depends-on): Likewise.
+ * modules/snprintf-posix (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/trunc-tests (Depends-on): Likewise.
+ * modules/unistdio/u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vasnprintf (Depends-on): Likewise.
+ * modules/vasnprintf-posix (Depends-on): Likewise.
+ * modules/vasprintf-posix (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf-posix (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+ * lib/frexp.c: Include isnand.h instead of isnan.h.
+ (ISNAN): Set to isnand instead of isnan.
+ * lib/isfinite.c: Include isnand.h instead of isnan.h.
+ (gl_isfinited): Use isnand instead of isnan.
+ * lib/signbitd.c: Include isnand.h instead of isnan.h.
+ (gl_signbitd): Use isnand instead of isnan.
+ * lib/vasnprintf.c: Include isnand.h instead of isnan.h.
+ (is_infinite_or_zero, VASNPRINTF): Use isnand instead of isnan.
+ * tests/test-frexp.c: Include isnand.h instead of isnan.h.
+ (main): Use isnand instead of isnan.
+ * tests/test-round1.c: Include isnand.h.
+ (main): Use isnand instead of isnan.
+ * tests/test-round2.c: Include isnand.h instead of isnan.h.
+ (ISNAN): Set to isnand instead of isnan.
+ * tests/test-trunc1.c: Include isnand.h.
+ (main): Use isnand instead of isnan.
+ * tests/test-trunc2.c: Include isnand.h instead of isnan.h.
+ (equal): Use isnand instead of isnan.
+ * MODULES.html.sh (Mathematics <math.h>): Replace isnan-nolibm with
+ isnand-nolibm.
+ * NEWS: Mention the change.
+
+2008-01-25 Paul Eggert <eggert@cs.ucla.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/signbit.m4 (gl_SIGNBIT): Require a macro definition. Test whether
+ the GCC builtins for signbits are present and set
+ REPLACE_SIGNBIT_USING_GCC if so.
+ * lib/math.in.h (signbit): Define using GCC builtins if
+ REPLACE_SIGNBIT_USING_GCC is set.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize
+ REPLACE_SIGNBIT_USING_GCC.
+ * modules/math (Makefile.am): Substitute REPLACE_SIGNBIT_USING_GCC.
+
+2008-01-25 Jim Meyering <meyering@redhat.com>
+
+ Prefer <config.h> over "config.h". See autoconf doc for explanation.
+ * lib/poll.c: Include <config.h>, not "config.h".
+ * tests/test-getaddrinfo.c: Likewise.
+
+2008-01-25 Simon Josefsson <simon@josefsson.org>
+
+ * modules/sockets-tests: New file.
+
+2008-01-24 Simon Josefsson <simon@josefsson.org>
+
+ * modules/sockets: New module, can be used to call WSA_Startup and
+ WSA_Cleanup when needed.
+
+ * lib/sockets.h, lib/sockets.c: New files.
+
+ * m4/sockets.m4: New file.
+
+ * tests/test-sockets.c: New file.
+
+2008-01-19 Bruno Haible <bruno@clisp.org>
+
+ * doc/posix-headers: Renamed from doc/headers.
+ * doc/posix-functions: Renamed from doc/functions.
+ * doc/gnulib.texi: Update.
+
+2008-01-19 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/strcasestr.texi: Include contents of
+ doc/functions/strcasestr.texi, fixing the list of platforms.
+ * doc/functions/strcasestr.texi: Remove file.
+
+2008-01-19 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/memmem.texi: Include contents of
+ doc/functions/memmem.texi.
+ * doc/functions/memmem.texi: Remove file.
+
+2008-01-18 Bruno Haible <bruno@clisp.org>
+
+ * doc/glibc-functions/*.texi: New files.
+ * doc/gnulib.texi (Glibc Function Substitutes): Completely rewritten
+ to use the new files.
+
+2008-01-17 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-gethostname.c (main): Fix printf statement.
+
+2008-01-17 Simon Josefsson <simon@josefsson.org>
+
+ * modules/gethostname-tests: New file.
+
+ * tests/test-gethostname.c: New file.
+
+2008-01-17 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gethostname.c: Include string.h unconditionally, strncpy is
+ used by the UNAME case. Reported by Bruno Haible
+ <bruno@clisp.org>.
+
+2008-01-17 Eric Blake <ebb9@byu.net>
+
+ Convert c-strcasestr to be more efficient.
+ * modules/c-strcasestr (Files): Use Two-Way, not KMP.
+ (Depends-on): Add c-strcase, remove malloca, strnlen.
+ * tests/test-c-strcasestr.c (main): Enhance test.
+ * lib/c-strcasestr.c (c_strcasestr): Rewrite to new algorithm.
+
+2007-01-16 Paolo Bonzini <bonzini@gnu.org>
+
+ * build-aux/bootstrap (MSGID_BUGS_ADDRESS): New overridable variable.
+ Use it in creating po/Makevars.
+
+2008-01-15 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc-libgcrypt.c (gc_init): Disable secure memory by default.
+ Applications that requires it should initialize libgcrypt
+ manually.
+
+2008-01-16 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gethostname.c [!HAVE_UNAME]: Need string.h for strcpy.
+
+2008-01-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix problem with getdate on mingw32 reported by Simon Josefsson
+ in <http://lists.gnu.org/archive/html/bug-gnulib/2008-01/msg00192.html>.
+ * lib/getdate.y (get_date): Check "HAVE_DECL_TZNAME", not "defined
+ tzname", when deciding whether to declare tzname.
+ * lib/strftime.c (tzname): Likewise.
+
+2008-01-15 Bruno Haible <bruno@clisp.org>
+
+ Work around a MacOS X 10.5 bug in frexpl().
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): Also check denormalized numbers.
+ * doc/functions/frexpl.texi: Document the bug.
+ Reported by Elias Pipping <pipping@gentoo.org>.
+
+2008-01-14 Eric Blake <ebb9@byu.net>
+
+ Touch up previous patch.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR_SIMPLE): Fix typo.
+ * doc/functions/strcasestr.texi (strcasestr): Document OpenBSD bug.
+
+ Convert strcasestr module to use Two-Way algorithm.
+ * modules/strcasestr-simple: New module, based on the old
+ strcasestr, but with Two-Way rather than KMP.
+ * modules/strcasestr (Depends-on): Change to strcasestr-simple.
+ * lib/string.in.h (rpl_strcasestr): Declare.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR): Check for linear
+ performance.
+ * lib/strcasestr.c (strcasestr): Simplify, and avoid malloc.
+ * modules/string (Makefile.am): Support strcasestr.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Likewise.
+ * modules/strcasestr-tests (Depends-on): Check for alarm.
+ * tests/test-strcasestr.c: Augment test.
+ * lib/str-two-way.h: Clean up stray macro.
+ * NEWS: Document new module.
+ * MODULES.html.sh (string handling): Likewise.
+ * doc/functions/strcasestr.texi: New file.
+ * doc/gnulib.texi (Function Substitutes): New node. Move memmem
+ here, since it is not a POSIX function.
+
+2008-01-14 Colin Watson <cjwatson@debian.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/strsignal.m4 (gl_FUNC_STRSIGNAL): Also check whether strsignal
+ works fine; if not, set REPLACE_STRSIGNAL.
+ (gl_PREREQ_STRSIGNAL): Require AC_DECL_SYS_SIGLIST.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize
+ REPLACE_STRSIGNAL.
+ * lib/string.in.h (strsignal): Consider REPLACE_STRSIGNAL.
+ * modules/string (Makefile.am): Substitute REPLACE_STRSIGNAL.
+ * tests/test-strsignal.c (main): Check out-of-range signal numbers.
+
+2008-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/strsignal (Include): Change to <string.h>.
+
+2008-01-14 Colin Watson <cjwatson@debian.org>
+
+ * modules/argp (Notice): Add a notice recommending to change
+ XGETTEXT_OPTIONS.
+ (configure.ac): Invoke AM_XGETTEXT_OPTION if it exists.
+
+2008-01-13 Colin Watson <cjwatson@debian.org>
+
+ * modules/strsignal-tests: New file.
+ * tests/test-strsignal.c: New file.
+
+ * lib/strsignal.c: New file, from glibc with modifications.
+ * lib/siglist.h: New file, from glibc with modifications.
+ * lib/string.in.h (strsignal): New declaration.
+ * m4/strsignal.m4: New file.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize
+ GNULIB_STRSIGNAL and HAVE_DECL_STRSIGNAL.
+ * modules/strsignal: New file.
+ * modules/string (Makefile.am): Substitute GNULIB_STRSIGNAL and
+ HAVE_DECL_STRSIGNAL.
+
+2008-01-13 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-fr.m4 (gt_LOCALE_FR, gt_LOCALE_FR_UTF8): Check that the
+ locale encoding is not ASCII. Needed for OpenBSD 4.0.
+ * m4/locale-tr.m4 (gt_LOCALE_TR_UTF8): Likewise.
+ * m4/locale-zh.m4 (gt_LOCALE_ZH_CN): Likewise.
+
+2008-01-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/argp-fmtstream.h (__attribute__): Don't redefine if
+ __STRICT_ANSI__ is set: it's not needed by any version of gcc.
+ * lib/argp.h (__attribute__): Likewise.
+ * lib/c-stack.c (__attribute__): Likewise.
+ * lib/error.h (__attribute__): Likewise.
+ * lib/fts.c (__attribute__): Likewise.
+ * lib/openat.h (__attribute__): Likewise.
+ * lib/stdio.in.h (__attribute__): Likewise.
+ * lib/string.in.h (__attribute__): Likewise.
+ * lib/utimens.c (__attribute__): Likewise.
+ * lib/vasnprintf.h (__attribute__): Likewise.
+ * lib/xalloc.h (__attribute__): Likewise.
+ * lib/xprintf.h (__attribute__): Likewise.
+ * lib/xstrtol.h (__attribute__): Likewise.
+ * lib/xvasprintf.h (__attribute__): Likewise.
+
+2008-01-12 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi (Glibc Header File Substitutes): New chapter.
+ * doc/glibc-headers/a.out.texi: New file.
+ * doc/glibc-headers/aliases.texi: New file.
+ * doc/glibc-headers/alloca.texi: New file.
+ * doc/glibc-headers/ar.texi: New file.
+ * doc/glibc-headers/argp.texi: New file.
+ * doc/glibc-headers/argz.texi: New file.
+ * doc/glibc-headers/byteswap.texi: New file.
+ * doc/glibc-headers/crypt.texi: New file.
+ * doc/glibc-headers/endian.texi: New file.
+ * doc/glibc-headers/envz.texi: New file.
+ * doc/glibc-headers/err.texi: New file.
+ * doc/glibc-headers/error.texi: New file.
+ * doc/glibc-headers/execinfo.texi: New file.
+ * doc/glibc-headers/fpu_control.texi: New file.
+ * doc/glibc-headers/fstab.texi: New file.
+ * doc/glibc-headers/fts.texi: New file.
+ * doc/glibc-headers/getopt.texi: New file.
+ * doc/glibc-headers/ieee754.texi: New file.
+ * doc/glibc-headers/ifaddrs.texi: New file.
+ * doc/glibc-headers/libintl.texi: New file.
+ * doc/glibc-headers/mcheck.texi: New file.
+ * doc/glibc-headers/mntent.texi: New file.
+ * doc/glibc-headers/obstack.texi: New file.
+ * doc/glibc-headers/paths.texi: New file.
+ * doc/glibc-headers/printf.texi: New file.
+ * doc/glibc-headers/pty.texi: New file.
+ * doc/glibc-headers/resolv.texi: New file.
+ * doc/glibc-headers/shadow.texi: New file.
+ * doc/glibc-headers/sysexits.texi: New file.
+ * doc/glibc-headers/ttyent.texi: New file.
+
+2008-01-12 Jim Meyering <meyering@redhat.com>
+
+ announce-gen: emit Gnulib's git-based version string.
+ * build-aux/announce-gen: Remove option: --gnulib-snapshot-time-stamp=S.
+ New option --gnulib-version=V, where V is expected to be
+ the output of running git describe in the gnulib directory.
+ (get_tool_versions): Request feedback on xdelta. I suspect it's
+ not useful, and plan to stop publishing an xdelta file with each
+ coreutils release.
+
+ * build-aux/announce-gen: Also check for lzma-compressed files.
+
+2008-01-11 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-memmem.c (main): Increase maximum allowed time.
+ * tests/test-strstr.c (main): Likewise.
+
+2008-01-11 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions/memmem.texi: Add more precisions about platforms.
+ * doc/functions/strstr.texi: Likewise.
+
+2008-01-10 Eric Blake <ebb9@byu.net>
+
+ * m4/strstr.m4: Delete cruft from copy-n-paste.
+ Reported by Bruno Haible.
+
+2008-01-10 Bruno Haible <bruno@clisp.org>
+
+ Make c-strstr rely on strstr.
+ * lib/c-strstr.c: Don't include str-kmp.h.
+ (c_strstr): Define in terms of strstr.
+ * modules/c-strstr (Files): Remove lib/str-kmp.h.
+ (Depends-on): Remove stdbool, malloca, strnlen. Add strstr.
+
+2008-01-10 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi (String Functions in C Locale): New section.
+ * doc/c-ctype.texi: New file.
+ * doc/c-strcase.texi: New file.
+ * doc/c-strcaseeq.texi: New file.
+ * doc/c-strcasestr.texi: New file.
+ * doc/c-strstr.texi: New file.
+ * doc/c-strtod.texi: New file.
+ * doc/c-strtold.texi: New file.
+
+2008-01-10 Eric Blake <ebb9@byu.net>
+
+ * lib/relocatable.h: Fix a comment.
+
+2008-01-10 Eric Blake <ebb9@byu.net>
+
+ Share two-way algorithm.
+ * lib/str-two-way.h: New file, merged from...
+ * lib/memmem.c: ...here...
+ * lib/strstr.c: ...and here.
+ * modules/memmem (Files): Use it.
+ * modules/strstr (Files): Likewise.
+
+ Avoid quadratic strstr implementations.
+ * lib/strstr.c: New file.
+ * m4/strstr.m4: Likewise.
+ * modules/strstr: Likewise.
+ * modules/strstr-tests: Likewise.
+ * tests/test-strstr.c: Likewise.
+ * lib/string.in.h (rpl_strstr): Declare.
+ (memmem) [GNULIB_POSIXCHECK]: Document speed issue.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Support strstr.
+ * modules/string (Makefile.am): Likewise.
+ * MODULES.html.sh (string handling): Mention new module.
+ * doc/functions/strstr.texi (strstr): Document the bug.
+
+2008-01-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/relocatable.h (relocate): State whether result is freshly
+ allocated or not.
+ * lib/relocatable.c (relocate): Return a freshly allocated string
+ instead of a pointer to a privately held string.
+ Reported by Sylvain Beucler <beuc@gnu.org>.
+
+2008-01-10 Colin Watson <cjwatson@debian.org>
+
+ * lib/canonicalize-lgpl.c [!_LIBC]: Fix typo in #if directive:
+ s/S_ISNLK/S_ISLNK/.
+
+2008-01-09 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions/memmem.texi: Use the same structure as snprintf.texi
+ and other files.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): Say "guessing no" instead of "no"
+ if it's only a guess.
+ * modules/memmem: Simplify by depending on memmem-simple.
+
+2008-01-09 Bruno Haible <bruno@clisp.org>
+
+ Work around OpenBSD 4.0 tdelete() bug.
+ * m4/tsearch.m4 (gl_FUNC_TSEARCH): Also check tdelete's return value.
+ * lib/search.in.h: If REPLACE_TSEARCH is 1, define tsearch etc. as
+ macros and don't redefine the enum values.
+ * m4/search_h.m4 (gl_SEARCH_H_DEFAULTS): Initialize REPLACE_TSEARCH.
+ * modules/search (Makefile.am): Also substitute REPLACE_TSEARCH.
+ * doc/functions/tdelete.texi: Document the OpenBSD 4.0 bug.
+
+2008-01-09 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-wcwidth.c: Include <string.h> and localcharset.h.
+ (main): Don't perform the tests if setlocale did not install a UTF-8
+ locale. Needed on OpenBSD 4.0.
+ * modules/wcwidth-tests (Depends-on): Add localcharset.
+
+2008-01-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ gl_FUNC_ALLOCA no longer defines HAVE_ALLOCA_H unconditionally.
+ See <http://lists.gnu.org/archive/html/bug-gnulib/2007-12/msg00149.html>.
+ * NEWS: announce this.
+ * m4/alloca.m4 (gl_FUNC_ALLOCA): Don't define HAVE_ALLOCA_H.
+
+2008-01-09 Simon Josefsson <simon@josefsson.org>
+ and Eric Blake <ebb9@byu.net>
+
+ Add memmem-simple module.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM_SIMPLE): New macro.
+ (gl_FUNC_MEMMEM): Separate performance from presence checks.
+ * modules/memmem-simple: New file.
+ * modules/memmem (Description): Tweak.
+ * MODULES.html.sh (string handling): Mention new module.
+ * doc/functions/memmem.texi (memmem): Distinguish which flaws are
+ addressed by memmem-simple.
+ * NEWS: Document the difference.
+
+2008-01-09 Eric Blake <ebb9@byu.net>
+
+ Give gcc some memmem optimization hints.
+ * lib/string.in.h (memmem, memrchr, strchrnul, strnlen, strpbrk)
+ (strcasestr): Declare as pure.
+ * modules/memmem (Maintainer): Claim my implementation.
+
+2008-01-09 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Support AIX 6.1 and higher.
+ * build-aux/config.libpath: Likewise.
+ * build-aux/config.rpath: Likewise.
+
+2008-01-08 Jim Meyering <meyering@redhat.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/printf-parse.c (PRINTF_PARSE): Handle a size specifier "q"
+ on MacOS X and a size specifier "I64" on mingw. Needed for PRIdMAX.
+ Reported by Peter Fales in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2007-12/msg00148.html>.
+
+2008-01-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/unictype/category-of (Depends-on): Add
+ unictype/category-none.
+ * modules/unictype/category-and-tests (Depends-on): Add
+ unictype/category-{L,N,Lu,Nd}.
+ * modules/unictype/category-and-not-tests (Depends-on): Likewise.
+ * modules/unictype/category-or-tests (Depends-on): Add
+ unictype/category-{L,N}.
+ * modules/unictype/category-name-tests (Depends-on): Add
+ unictype/category-{Z,Nl}.
+ Reported by Simon Josefsson.
+
+2008-01-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/str-kmp.h (knuth_morris_pratt_unibyte): Document the calling
+ convention better.
+ * lib/mbsstr.c (knuth_morris_pratt_multibyte): Likewise.
+ * lib/mbscasestr.c (knuth_morris_pratt_multibyte): Likewise.
+ Reported by Peter Miller <millerp@canb.auug.org.au>.
+
+2008-01-08 Eric Blake <ebb9@byu.net>
+
+ Rewrite memmem to guarantee linear complexity without malloc.
+ * lib/memmem.c (memmem): Use Two-Way rather than
+ Knuth-Morris-Pratt, to allow O(1) space usage.
+ (critical_factorization, two_way_short_needle)
+ (two_way_long_needle): New functions.
+ (knuth_morris_pratt): Delete.
+ * modules/memmem (Depends-on): No longer need malloca or stdbool.
+ Add stdint.
+ * tests/test-memmem.c (main): Add tests for periodic needle and
+ sublinear performance.
+ * doc/functions/memmem.texi (memmem): Document other deficiencies
+ in cygwin and older glibc.
+
+2008-01-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/memmem-tests (Makefile.am): Remove TESTS_ENVIRONMENT
+ augmentation.
+
+2008-01-08 Mike Frysinger <vapier@gentoo.org>
+
+ Add a configure time option: --disable-acl.
+ * m4/acl.m4 (gl_FUNC_ACL): Wrap all ACL logic in a call to
+ AC_ARG_ENABLE(acl).
+
+2008-01-06 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-localename.c: Don't include obsolete "setenv.h".
+
+ * modules/localename-tests (Depends-on): Need unsetenv.
+
+2008-01-08 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * DEPENDENCIES: Require Texinfo version 4.6 or newer.
+
+2008-01-06 Colin Watson <cjwatson@debian.org>
+
+ * users.txt: Add man-db.
+
+2008-01-07 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-intro.texi (Library vs Reusable Code): Restore the
+ previous section name.
+
+2008-01-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.c (set_program_name): Don't strip off a leading
+ "lt-" prefix outside a .libs directory.
+ Suggested by Paul Eggert.
+
+2008-01-01 Sylvain Beucler <beuc@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ Improve memory cleanup in 'relocatable' module.
+ * lib/relocatable.h (compute_curr_prefix): Change return type to
+ 'char *'.
+ * lib/relocatable.c (compute_curr_prefix): Change return type to
+ 'char *'. Free curr_installdir after use.
+ (relocate): Free curr_prefix_better after use.
+ * lib/progreloc.c (prepare_relocate): Free curr_prefix after use.
+
+2008-01-01 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-wcwidth.c (main): Relax test of U+2060. Avoids a test
+ failure on older glibc systems.
+ Reported by Peter Fales <psfales@alcatel-lucent.com>.
+
+2008-01-05 Eric Blake <ebb9@byu.net>
+
+ Avoid quadratic system memmem.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): Check for quadratic memmem.
+ Reported by Ralf Wildenhues.
+
+ Fix memmem test for mingw.
+ * modules/memmem-tests (configure.ac): Check for alarm.
+ * tests/test-memmem.c (main): Avoid alarm on platforms that lack
+ it.
+ * doc/functions/memmem.texi: New file.
+ * doc/gnulib.texi (Function Substitutes): Add memmem.
+ Reported by Bruno Haible.
+
+2008-01-04 Bruno Haible <bruno@clisp.org>
+
+ * m4/strcase.m4 (gl_FUNC_STRCASECMP, gl_FUNC_STRNCASECMP):
+ Require gl_HEADER_STRINGS_H_DEFAULTS, not
+ gl_HEADER_STRING_H_DEFAULTS.
+
+2008-01-04 Eric Blake <ebb9@byu.net>
+
+ Shorten duration of memmem test.
+ * tests/test-memmem.c (main): Use alarm to declare failure if test
+ is taking too long.
+ Reported by Ralf Wildenhues.
+
+2007-12-21 Simon Josefsson <simon@josefsson.org>
+
+ * modules/relocatable-prog-wrapper (Depends-on): Add intprops and
+ string, needed by strerror.
+
+2008-01-03 Colin Watson <cjwatson@debian.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (Localization): New section.
+
+2008-01-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/memmem.c (knuth_morris_pratt, memmem): Change all 'char *'
+ variables to 'unsigned char *' type.
+ Reported by Paul Eggert.
+
+2008-01-02 Jim Meyering <jim@meyering.net>
+
+ * lib/version-etc.c (COPYRIGHT_YEAR): Increase for new year.
+
+2007-12-31 Jim Meyering <jim@meyering.net>
+
+ Avoid use of private FTS type name.
+ * lib/fts.c (fts_sort): Use FTSENT rather than "struct _ftsent".
+
+2007-12-30 Karl Berry <karl@gnu.org>
+
+ * doc/gnulib.texi (Library vs. Reusable Code): remove period, to
+ work around defect in Texinfo and/or the standalone Info browser.
+
+2007-12-30 Bruno Haible <bruno@clisp.org>
+
+ Unify 5 copies of the KMP code.
+ * lib/str-kmp.h: New file.
+ * lib/c-strcasestr.c: Include str-kmp.h.
+ (knuth_morris_pratt): Remove function.
+ (c_strcasestr): Update.
+ * lib/c-strstr.c: Include str-kmp.h.
+ (knuth_morris_pratt): Remove function.
+ (c_strcasestr): Update.
+ * lib/mbscasestr.c: Include str-kmp.h.
+ (knuth_morris_pratt_unibyte): Remove function.
+ * lib/mbsstr.c: Include str-kmp.h.
+ (knuth_morris_pratt_unibyte): Remove function.
+ * lib/strcasestr.c: Include str-kmp.h.
+ (knuth_morris_pratt): Remove function.
+ (strcasestr): Update.
+ * modules/c-strcasestr (Files): Add lib/str-kmp.h.
+ * modules/c-strstr (Files): Likewise.
+ * modules/mbscasestr (Files): Likewise.
+ * modules/mbsstr (Files): Likewise.
+ * modules/strcasestr (Files): Likewise.
+ Suggested by Paul Eggert.
+
+2007-12-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/xmalloca.c (xmmalloca): Don't define if HAVE_ALLOCA is not
+ defined.
+
+2007-12-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/xmalloca.h: Include xalloc.h.
+ (xnmalloca): New macro.
+
+2007-12-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/malloca.h (nmalloca): New macro.
+ * lib/c-strcasestr.c (knuth_morris_pratt): Use it.
+ * lib/c-strstr.c (knuth_morris_pratt): Likewise.
+ * lib/mbscasestr.c (knuth_morris_pratt_unibyte,
+ knuth_morris_pratt_multibyte): Likewise.
+ * lib/mbsstr.c (knuth_morris_pratt_unibyte,
+ knuth_morris_pratt_multibyte): Likewise.
+ * lib/memmem.c (knuth_morris_pratt): Likewise.
+ * lib/strcasestr.c (knuth_morris_pratt): Likewise.
+
+2007-12-25 Bruno Haible <bruno@clisp.org>
+
+ Fixup after 2007-10-17 commit. Ensure that 'glob' stays under LGPLv2+.
+ * lib/glob.c: Don't include openat.h.
+ (link_exists2_p): Add back the code that deals with the
+ !GLOB_ALTDIRFUNC case.
+ (link_exists_p) [!_LIBC && !HAVE_FSTATAT]: Just call link_exists2_p and
+ let it do the filename concatenation.
+ * m4/glob.m4 (gl_PREREQ_GLOB): Add check for fstatat.
+ * modules/glob (Depends-on): Remove openat.
+
+2007-12-31 Bruno Haible <bruno@clisp.org>
+
+ * modules/dirfd (License): Change to LGPLv2+.
+ Approved by Jim Meyering.
+
+2007-12-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/memmem.c (knuth_morris_pratt): Check for size_t overflow
+ when multiplying M by sizeof (size_t).
+
+2007-12-10 Martin Lambers <marlam@marlam.de>
+
+ Override getpagesize on mingw.
+ * lib/getpagesize.c: New file.
+ * m4/getpagesize.m4 (gl_FUNC_GETPAGESIZE): Enable replacement on mingw.
+ * modules/getpagesize (Files): Add lib/getpagesize.c.
+ * lib/unistd.in.h (getpagesize): Declare if we are using a replacement.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
+ REPLACE_GETPAGESIZE.
+ * modules/unistd (Makefile.am): Substitute REPLACE_GETPAGESIZE.
+
+2007-12-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/localcharset (Notice): New field.
+ (configure.ac): Define LOCALCHARSET_TESTS_ENVIRONMENT.
+ Suggested by Ben Pfaff <blp@cs.stanford.edu>.
+
+2007-12-25 Paul Eggert <eggert@cs.ucla.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ Avoid using the syntax symbol() in formatted documentation.
+ * MODULES.html.sh (func_module): When replacing symbol() with a
+ hyperlink, remove the parentheses. Show an error if some remain.
+ Recognize and render the '...' syntax.
+ * doc/alloca-opt.texi: Remove parentheses from symbol reference.
+ Rework. Add paragraph about GCC's inlining.
+ * doc/alloca.texi: Likewise.
+ * doc/error.texi: Remove parentheses from symbol reference.
+ * doc/gnulib-intro.texi: Likewise.
+ * doc/gnulib.texi (alloca, alloca-opt): New nodes.
+ * modules/fnmatch (Description): Reword to say "the ... function".
+ * modules/full-read (Description): Likewise.
+ * modules/full-write (Description): Likewise.
+ * modules/safe-read (Description): Likewise.
+ * modules/safe-write (Description): Likewise.
+ * modules/strchrnul (Description): Likewise.
+ * modules/trim (Description): Likewise.
+ * modules/error (Description): Remove parentheses from symbol
+ references.
+ * modules/verror (Description): Likewise.
+ Reported by Karl Berry.
+
+2007-12-25 Bruno Haible <bruno@clisp.org>
+
+ Fixup after 2007-10-16 commit.
+ * lib/glob.c (glob_in_dir): Don't use ISO C99 syntax.
+
+2007-12-24 Bruno Haible <bruno@clisp.org>
+
+ Make --enable-relocatable work with DESTDIR.
+ * build-aux/install-reloc: Accept another argument 'destdir'. Use it
+ to compute installdir from destprog.
+ * m4/relocatable.m4 (gl_RELOCATABLE_BODY): In INSTALL_PROGRAM_ENV,
+ also set the RELOC_DESTDIR variable.
+ Reported by Левашев Иван <octagram@bluebottle.com>.
+
+2007-12-24 Bruno Haible <bruno@clisp.org>
+
+ Fix link error due to xalloc_die().
+ * lib/progreloc.c: When NO_XMALLOC is defined, use areadlink instead
+ of xreadlink.
+ * lib/relocwrapper.c: Update comments.
+ * build-aux/install-reloc: Remove xreadlink.c from file list.
+ * modules/relocatable-prog-wrapper (Files): Remove xreadlink.h and
+ xreadlink.c.
+ Reported by Левашев Иван <octagram@bluebottle.com>.
+
+2007-12-24 Bruno Haible <bruno@clisp.org>
+
+ Split setenv module into setenv and unsetenv. Get rid of setenv.h.
+ * lib/setenv.h: Remove file.
+ * lib/stdlib.in.h (setenv, unsetenv): New declarations, moved here from
+ lib/setenv.h.
+ * modules/setenv (Files): Remove lib/setenv.h, lib/unsetenv.c.
+ (Depends-on): Add stdlib.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR. Don't invoke
+ gl_FUNC_UNSETENV.
+ (Include): Replace setenv.h with <stdlib.h>.
+ * modules/unsetenv: New file.
+ * lib/setenv.c: Include <stdlib.h> first, after alloca.h.
+ * lib/unsetenv.c: Include <stdlib.h> first.
+ * m4/setenv.m4 (gl_FUNC_SETENV, gl_FUNC_SETENV_SEPARATE): Require
+ gl_STDLIB_H_DEFAULTS. Conditionally set HAVE_SETENV to 0.
+ (gl_FUNC_UNSETENV): Require gl_STDLIB_H_DEFAULTS. Conditionally set
+ HAVE_UNSETENV to 0. Set VOID_UNSETENV as an AC_SUBSTed variable.
+ * modules/stdlib (Makefile.am): Substitute also GNULIB_SETENV,
+ HAVE_SETENV, GNULIB_UNSETENV, HAVE_UNSETENV, VOID_UNSETENV.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_SETENV,
+ HAVE_SETENV, GNULIB_UNSETENV, HAVE_UNSETENV, VOID_UNSETENV.
+ * doc/functions/unsetenv.texi: Update.
+ * modules/xsetenv (Depends-on): Add unsetenv.
+ * modules/getdate (Depends-on): Likewise.
+ * lib/xsetenv.h: Include <stdlib.h> instead of setenv.h.
+ * lib/xsetenv.c: Don't include setenv.h.
+ * lib/getdate.y: Likewise.
+ * lib/relocwrapper.c: Likewise.
+ * modules/relocatable-prog-wrapper (Files): Remove lib/setenv.h.
+ (Depends-on): Add stdlib.
+ * NEWS: Mention the changes.
+ Reported by Левашев Иван <octagram@bluebottle.com>.
+
+2007-12-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/memmem.c (memmem): Use lowercase variable names. Tab
+ indentation.
+
+2007-12-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strcasestr.c: Add more comments.
+ * lib/c-strstr.c: Likewise.
+ * lib/mbscasestr.c: Likewise.
+ * lib/mbsstr.c: Likewise.
+ * lib/strcasestr.c: Likewise.
+ * lib/memmem.c: Likewise.
+
+2007-12-23 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-memmem.c: Include <string.h> first.
+
+2007-12-22 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Change $auxdir while generating
+ the contents of $testsbase.
+ Reported by Ralf Wildenhues.
+
+2007-12-22 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_tests_Makefile_am): Replace local_ldadd with
+ two variables local_ldadd_before, local_ldadd_last.
+
+2007-12-20 Eric Blake <ebb9@byu.net>
+
+ Work around circular library issue when cross-compiling.
+ * lib/progname.c (set_program_name): Use strncmp, not memcmp, so
+ that progname.o does not need to pull in rpl_memcmp.
+
+2007-12-19 Eric Blake <ebb9@byu.net>
+
+ Fix memmem to avoid O(n^2) worst-case complexity.
+ * lib/memmem.c (knuth_morris_pratt): New function.
+ (memmem): Use it if first few naive iterations fail.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): Detect cygwin bug.
+ * modules/memcmp (License): Set to LGPLv2+, not LGPL.
+ * modules/memchr (License): Likewise.
+ * modules/memmem (Depends-on): Add memcmp, memchr, stdbool, and
+ malloca.
+ * tests/test-memmem.c: Rewrite, borrowing ideas from
+ test-mbsstr1.c; the old version wouldn't even compile!
+ * modules/memmem-tests: New file.
+ * lib/string.in.h (rpl_memmem): Add declaration.
+ * modules/string (Makefile.am): Substitute REPLACE_MEMMEM.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Default for
+ REPLACE_MEMMEM.
+
+2007-12-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix problem with _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H on VMS.
+ * lib/stdint.in.h (_GL_JUST_INCLUDE_SYSTEM_INTTYPES_H): Define
+ before any system include files, and undef after them all. This
+ should fix a problem on VMS reported by John E. Malmberg in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-12/msg00118.html>.
+
+2007-12-17 Eric Blake <ebb9@byu.net>
+
+ Revert addition of verify, for BSD/OS.
+ * lib/fseeko.c [!HAVE_FSEEKO]: Allow off_t > long, even though it
+ can't handle large files, for the sake of obsolete platforms.
+ * modules/fseeko (Depends-on): Remove verify.
+ * doc/functions/fseeko.texi (fseeko): Document BSD/OS limitation.
+ * doc/functions/ftello.texi (ftello): Likewise.
+ * doc/functions/fgetpos.texi (fgetpos): Likewise.
+ Reported by Larry Jones.
+
+2007-12-17 Petr Salinger <Petr.Salinger@seznam.cz>
+
+ getcwd.c: Use a more readable witness: HAVE_OPENAT_SUPPORT
+ * lib/getcwd.c: Define and use HAVE_OPENAT_SUPPORT, in place of AT_FDCWD.
+
+2007-12-17 Jim Meyering <meyering@redhat.com>
+
+ Port to GNU/kFreeBSD - FreeBSD kernel + GNU libc,
+ which has no openat syscall, yet <fcntl.h> does define AT_FDCWD.
+ * lib/getcwd.c: Undef AT_FDCWD if there is no openat function.
+ * modules/getcwd (Depends-on): Add openat.
+ Reported by Petr Salinger.
+
+2007-12-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_INFINITE_LONG_DOUBLE): Use GL_NOCRASH to
+ avoid a segmentation fault of the configure test on x86_64 systems.
+
+2007-12-15 Jim Meyering <meyering@redhat.com>
+
+ * build-aux/gnupload (GPG): Don't hard-code absolute name of gpg binary.
+
+2007-12-13 Eric Blake <ebb9@byu.net>
+
+ Another fseek test.
+ * tests/test-fseek.c (main): Also test ungetc handling.
+ * tests/test-fseeko.c (main): Likewise.
+ * modules/fseeko (Depends-on): Add verify.
+ * lib/fseeko.c [!HAVE_FSEEKO]: Verify that off_t is not too
+ large.
+ Reported by Larry Jones.
+
+ Fix fseeko on mingw.
+ * lib/fseeko.c (rpl_fseeko) [_IOERR]: Reset EOF flag on successful
+ seek.
+
+ Beef up fseek tests.
+ * tests/test-fseek.c (main): Also test eof handling.
+ * tests/test-fseeko.c (main): Likewise.
+ Reported by Larry Jones.
+
+2007-12-13 Larry Jones <lawrence.jones@siemens.com> (tiny change)
+
+ Fix fseeko on BSD-based platforms.
+ * lib/fseeko.c (rpl_fseeko) [__sferror]: Reset EOF flag on
+ successful seek.
+
+2007-12-12 Eric Blake <ebb9@byu.net>
+
+ Allow circular dependency of separate libtests.a
+ * gnulib-tool (func_emit_tests_Makefile_am): Add AM_LIBTOOLFLAGS
+ when use_libtests.
+
+2007-12-11 Eric Blake <ebb9@byu.net>
+
+ Fix bug with -0.0L in previous patch.
+ * lib/isnan.c (rpl_isnanl): Make robust to -0.0L and pad bits.
+ * tests/test-isnan.c (main): Also test on zeroes.
+ * tests/test-isnanf.c (main): Likewise.
+ * tests/test-isnanl.h (main): Likewise.
+
+ Detect pseudo-denormals on x86 even when cross-compiling.
+ * lib/isnan.c (rpl_isnanl) [!KNOWN_EXPBIT0_LOCATION
+ && USE_LONG_DOUBLE && x86]: Add one more check to filter out
+ invalid bit patterns that happen to satisfy ==.
+
+ Avoid link failures with separate libtests.a.
+ * gnulib-tool (func_emit_tests_Makefile_am): Also list local_ldadd
+ last, to satisfy circular dependencies.
+
+2007-12-11 Eric Blake <ebb9@byu.net>
+ and Bruno Haible <bruno@clisp.org>
+
+ Fix OpenBSD 4.0 <float.h> handling of long double.
+ * m4/float_h.m4 (gl_FLOAT_H): Also claim OpenBSD is broken.
+ * lib/float.in.h [__OpenBSD__]: Add fixes for OpenBSD.
+ * doc/headers/float.texi (float.h): Document OpenBSD bug.
+
+2007-12-11 Jim Meyering <meyering@redhat.com>
+
+ * users.txt: Add libvirt.
+
+ Support versions of autoconf prior to 2.59c.
+ * gnulib-tool (func_emit_initmacro_done): Define m4_foreach_w
+ if it is not already defined.
+
+2007-12-09 Bruno Haible <bruno@clisp.org>
+
+ Let 'gnulib-tool --import' collect sources needed for the tests in
+ tests/ rather than in lib/.
+ * gnulib-tool (func_emit_tests_Makefile_am): Accept use_libtests
+ argument. If true, add rules to generate libtests.a, and put libtests.a
+ into $(LDADD). Consider source files in subdirectories and set
+ uses_subdirs.
+ (func_emit_initmacro_start, func_emit_initmacro_end,
+ func_emit_initmacro_done): Pass all arguments explicitly.
+ (func_import): Determine two module lists main_modules,
+ testsrelated_modules. Determine use_libtests. Determine two variables
+ sed_transform_main_lib_file, sed_transform_testsrelated_lib_file
+ instead of just sed_transform_lib_file. Determine two variables
+ main_files and testsrelated_files. Compute 'files' as the union of
+ both. Adjust sed_rewrite_old_files, sed_rewrite_new_files,
+ func_add_or_update. In the generated gnulib-comp.m4, collect the
+ object files for tests/ in different variables than those for lib/.
+ Substitute LIBTESTS_LIBDEPS.
+ (func_create_testdir): Combine the uses_subdirs results from
+ func_emit_lib_Makefile_am and from func_emit_tests_Makefile_am.
+
+2007-12-09 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_tests_Makefile_am): Expand references to
+ the build-aux directory.
+
+2007-12-09 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_tests_Makefile_am): Remove redundant code
+ introduced on 2006-09-09.
+
+2007-12-07 Jim Meyering <meyering@redhat.com>
+
+ Let these macros work also with autoconf-2.59.
+ * m4/getline.m4 (gl_FUNC_GETLINE): Require only autoconf-2.59. 2.60
+ is not needed, since gnulib now permits use of AC_CHECK_DECLS_ONCE.
+ * m4/getdelim.m4 (gl_FUNC_GETDELIM): Likewise.
+
+2007-12-06 Jim Meyering <meyering@redhat.com>
+
+ Avoid a configure-time syntax error in gl_FUNC_ACL.
+ * m4/acl.m4 (gl_FUNC_ACL): Be careful to check for the acl_trivial
+ function in each branch, before testing the cache variable.
+
+2007-12-04 Eric Blake <ebb9@byu.net>
+
+ Make scripts executable.
+ * build-aux/config.guess: Add execute permissions.
+ * build-aux/config.sub: Likewise.
+ * build-aux/gendocs.sh: Likewise.
+
+ Fix frexp on mingw.
+ * m4/frexp.m4 (gl_FUNC_FREXP_WORKS): Detect mingw bug when
+ cross-compiling.
+ * doc/functions/frexp.texi (frexp): Document the bug.
+
+ Make cygwin fseeko check more reliable.
+ * m4/stdio_h.m4 (gl_STDIN_LARGE_OFFSET) [__CYGWIN__]: Use cygwin
+ version numbers, rather than unrelated feature check.
+ * doc/functions/fseeko.texi (fseeko): Tweak failure report.
+ * doc/functions/ftello.texi (ftello): Likewise.
+ Reported by Bruno Haible.
+
+ * m4/strerror.m4: Bump version number.
+
+2007-12-03 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions/mprotect.texi: Mention the mingw problem.
+
+2007-12-03 Eric Blake <ebb9@byu.net>
+
+ * m4/strerror.m4 (gl_FUNC_STRERROR_SEPARATE): Ensure
+ REPLACE_STRERROR is initialized before this macro.
+
+2007-12-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ Add support for Solaris 10 ACLs. Also, ACLs are Gnulib, not Autoconf.
+ * modules/acl (configure.ac): Rename AC_FUNC_ACL to gl_FUNC_ACL.
+ * m4/acl.m4 (gl_FUNC_ACL): Renamed from AC_FUNC_ACL. On Solaris,
+ put -lsec in even for programs other than 'ls'. This fixes a problem
+ for gettext reported by Bruno Haible in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-12/msg00007.html>.
+ * lib/acl.c (copy_acl, qset_acl) [USE_ACL && defined ACL_NO_TRIVIAL]:
+ Add support for Solaris 10. This isn't efficient, but should get the
+ job done for now.
+
+2007-12-03 James Youngman <jay@gnu.org>
+
+ * doc/regexprops-generic.texi: change "an close-group" to "a
+ close-group" and "illegal" to "not allowed".
+
+2007-11-23 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/unictype/pr_byname.c: Include unictype/pr_byname.h instead of
+ pr_byname.h. Needed for the rare case when the maintainer has done
+ "make maintainer-clean" in the source directory and then attempts a
+ build outside the source directory.
+ * lib/unictype/scripts.c: Include unictype/scripts_byname.h instead of
+ scripts_byname.h.
+
+2007-12-02 Martin Lambers <marlam@marlam.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/getpagesize.h: Remove file.
+ * lib/unistd.in.h: Include declaration of getpagesize here.
+ * m4/getpagesize.m4 (gl_FUNC_GETPAGESIZE): Renamed from gl_GETPAGESIZE.
+ Invoke gl_UNISTD_H_DEFAULTS. Set HAVE_GETPAGESIZE, HAVE_OS_H,
+ HAVE_SYS_PARAM_H.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_GETPAGESIZE,
+ HAVE_GETPAGESIZE, HAVE_OS_H, HAVE_SYS_PARAM_H.
+ * modules/getpagesize (Files): Remove lib/getpagesize.h.
+ (Depends-on): Add unistd.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Include): Use <unistd.h> instead of getpagesize.h.
+ * modules/unistd (Makefile.am): Substitute also GNULIB_GETPAGESIZE,
+ HAVE_GETPAGESIZE, HAVE_OS_H, HAVE_SYS_PARAM_H.
+ * m4/pagealign_alloc.m4 (gl_PREREQ_PAGEALIGN_ALLOC): Remove
+ gl_GETPAGESIZE invocation, already handled by module dependency.
+ * lib/pagealign_alloc.c: Don't include getpagesize.h.
+
+2007-12-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/strings-tests: New file.
+ * tests/test-strings.c: New file.
+
+ Move declarations of str{,n}casecmp from <string.h> to <strings.h>.
+ * lib/strings.in.h: New file.
+ * lib/string.in.h (strcasecmp, strncasecmp): Remove declarations.
+ * m4/strings_h.m4: New file.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Remove initialization
+ of HAVE_STRCASECMP, HAVE_DECL_STRNCASECMP.
+ * modules/strings: New file.
+ * modules/string (Makefile.am): Update.
+ * modules/strcase (Include): Mention <strings.h>, not <string.h>.
+ Reported by Karl Berry.
+
+2007-12-01 Eric Blake <ebb9@byu.net>
+
+ * m4/stdio_h.m4 (gl_STDIN_LARGE_OFFSET) [__CYGWIN__]: Rewrite to
+ accomodate fix in cygwin 1.5.25.
+
+2007-12-01 Jim Meyering <meyering@redhat.com>
+
+ Fix a bug that inhibited much of the utf8-optimization in regcomp.c.
+ * lib/regcomp.c (optimize_utf8): Fix a typo, s/idx/ctx_type/,
+ that would inhibit utf8-optimization of a regexp containing line-
+ or buffer-anchors, e.g., `^', `$'.
+
+2007-11-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h (gl_recursive_lock_init) [PTHREAD &&
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER]: Call
+ glthread_recursive_lock_init.
+ * lib/lock.c (glthread_recursive_lock_init)
+ [PTHREAD_RECURSIVE_MUTEX_INITIALIZER]: New function.
+ Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
+2007-11-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ New function qset_acl, like set_acl but with syscall semantics.
+ * lib/acl.h (qset_acl): New decl.
+ * lib/acl.c (qset_acl): New function.
+ (set_acl): Use new function. Use more-consistent diagnostics.
+
+2007-11-28 Jim Meyering <meyering@redhat.com>
+
+ * modules/physmem (License): Change from GPL to LGPLv2+.
+
+2007-11-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (decode_long_double): Don't abort if the
+ 'long double' type has excess precision.
+ Reported by Jim Meyering in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-11/msg00120.html>.
+
+2007-11-25 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * doc/fdl.texi, doc/gpl-3.0.texi, doc/lgpl-3.0.texi:
+ Sync from <http://gnu.org/licenses>.
+ * modules/agpl-3.0, doc/agpl-3.0.texi: New module,
+ with license text from same location.
+ * doc/maintain.texi, doc/standards.texi: Sync from
+ <http://savannah.gnu.org/projects/gnustandards>.
+
+2007-11-22 Ondřej Vašík <ovasik@redhat.com>
+ and Jim Meyering <meyering@redhat.com>
+
+ Adjust getdate' grammar to accept a slightly more regular language.
+ E.g., accept "YYYYMMDD +N days" as well as "YYYYMMDD N days".
+ Before, the former was rejected.
+ * lib/getdate.y (digits_to_date_time): New function, factored
+ out of ...
+ (number): ...here. Just call digits_to_date_time.
+ (hybrid): New non-terminal to handle an <unsigned number,
+ signed relative offset> sequence consistently.
+
+2007-11-18 Jim Meyering <meyering@redhat.com>
+
+ Pull my changes from coreutils:
+ bootstrap: fix typo to enable use of $gnulib_tool_option_extras.
+ * build-aux/bootstrap (gnulib_tool_options): Add a space before the
+ use of $gnulib_tool_option_extras, so that it's separated from the
+ preceding argument.
+
+ Fix bootstrap failure to handle files like lib/uniwidth/cjk.h.
+ * build-aux/bootstrap (cp_mark_as_generated): Create any required
+ parent destination directories before copying a file into place.
+
+2007-11-18 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ bootstrap: work also with 4-argument variant of AC_INIT
+ * build-aux/bootstrap (gnulib_extra_files): Adjust sed command.
+
+2007-11-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port test-getaddrinfo to Solaris.
+ Problem reported by Bruno Haible in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-03/msg00171.html>.
+ * tests/test-getaddrinfo.c (simple): Add a comment asking for an
+ explanation of setting 'hints'.
+ Don't reject an implementation merely because it returns EAI_SERVICE.
+ (EAI_SERVICE): Define to 0 if not defined.
+
+2007-11-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ The license of gnu-make and posix-shell is now "GPLed build tool".
+ * modules/gnu-make (License): Likewise.
+ * modules/posix-shell (License): Likewise.
+
+ New module posix-shell, for determining a POSIX shell
+ or perhaps something that is close enough to a POSIX shell.
+ * m4/posix-shell.m4: New file.
+ * modules/posix-shell: New file.
+
+ * MODULES.html.sh: Mention new module.
+
+ New module gnu-make, for determining whether we're using GNU Make.
+ * m4/gnu-make.m4: New file.
+ * modules/gnu-make: New file.
+ * MODULES.html.sh: Mention new module.
+
+2007-11-14 Jim Meyering <meyering@redhat.com>
+
+ Define a sometimes-link-required function using ARGMATCH_DIE_DECL.
+ * tests/test-argmatch.c (ARGMATCH_DIE_DECL): When defined,
+ use this macro to create a function _definition_.
+ Remove useless "#undef ARGMATCH_DIE".
+
+2007-11-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/config.charset: Update for OpenBSD 4.1.
+ Reported and helped by Ben Pfaff <blp@cs.stanford.edu>.
+
+2007-11-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ Document 64-bit #if problems in stdint.texi.
+ * doc/headers/stdint.texi (stdint.h): Mention problems with
+ 64-bit-#if, and how to work around them.
+
+ Don't insist on 'long long int' support in the preprocessor. It
+ breaks too many things. For example, PRIdMAX still uses a 'long
+ long int' format with the latest Sun compiler, even though
+ HAVE_LONG_LONG_INT isn't defined due to that compiler's
+ preprocessor problem. This causes the latest coreutils to dump
+ core on Solaris 10 sparc with the Sun C compiler.
+ Instead, fix the 2007-10-16 problem in a different way, by evaluating
+ the troublesome expressions at configure-time, not at #if-time.
+ * m4/longlong.m4 (_AC_TYPE_LONG_LONG_SNIPPET): Don't test the
+ preprocessor.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Move the #if checks into
+ compile-time C checks, done at 'configure'-time.
+ (gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION): New macro.
+ * modules/inttypes (Makefile): Substitute the new symbols that
+ gl_INTTYPES_H now generates.
+ * lib/inttypes.in.h: Don't use constants wider than 'long' in #if.
+
+2007-11-12 Bruno Haible <bruno@clisp.org>
+
+ Tests for Unicode character classification functions.
+
+ * modules/unictype/bidicategory-byname-tests: New file.
+ * modules/unictype/bidicategory-name-tests: New file.
+ * modules/unictype/bidicategory-of-tests: New file.
+ * modules/unictype/bidicategory-test-tests: New file.
+ * modules/unictype/block-list-tests: New file.
+ * modules/unictype/block-of-tests: New file.
+ * modules/unictype/block-test-tests: New file.
+ * modules/unictype/category-C-tests: New file.
+ * modules/unictype/category-Cc-tests: New file.
+ * modules/unictype/category-Cf-tests: New file.
+ * modules/unictype/category-Cn-tests: New file.
+ * modules/unictype/category-Co-tests: New file.
+ * modules/unictype/category-Cs-tests: New file.
+ * modules/unictype/category-L-tests: New file.
+ * modules/unictype/category-Ll-tests: New file.
+ * modules/unictype/category-Lm-tests: New file.
+ * modules/unictype/category-Lo-tests: New file.
+ * modules/unictype/category-Lt-tests: New file.
+ * modules/unictype/category-Lu-tests: New file.
+ * modules/unictype/category-M-tests: New file.
+ * modules/unictype/category-Mc-tests: New file.
+ * modules/unictype/category-Me-tests: New file.
+ * modules/unictype/category-Mn-tests: New file.
+ * modules/unictype/category-N-tests: New file.
+ * modules/unictype/category-Nd-tests: New file.
+ * modules/unictype/category-Nl-tests: New file.
+ * modules/unictype/category-No-tests: New file.
+ * modules/unictype/category-P-tests: New file.
+ * modules/unictype/category-Pc-tests: New file.
+ * modules/unictype/category-Pd-tests: New file.
+ * modules/unictype/category-Pe-tests: New file.
+ * modules/unictype/category-Pf-tests: New file.
+ * modules/unictype/category-Pi-tests: New file.
+ * modules/unictype/category-Po-tests: New file.
+ * modules/unictype/category-Ps-tests: New file.
+ * modules/unictype/category-S-tests: New file.
+ * modules/unictype/category-Sc-tests: New file.
+ * modules/unictype/category-Sk-tests: New file.
+ * modules/unictype/category-Sm-tests: New file.
+ * modules/unictype/category-So-tests: New file.
+ * modules/unictype/category-Z-tests: New file.
+ * modules/unictype/category-Zl-tests: New file.
+ * modules/unictype/category-Zp-tests: New file.
+ * modules/unictype/category-Zs-tests: New file.
+ * modules/unictype/category-and-not-tests: New file.
+ * modules/unictype/category-and-tests: New file.
+ * modules/unictype/category-byname-tests: New file.
+ * modules/unictype/category-name-tests: New file.
+ * modules/unictype/category-none-tests: New file.
+ * modules/unictype/category-of-tests: New file.
+ * modules/unictype/category-or-tests: New file.
+ * modules/unictype/category-test-withtable-tests: New file.
+ * modules/unictype/combining-class-tests: New file.
+ * modules/unictype/ctype-alnum-tests: New file.
+ * modules/unictype/ctype-alpha-tests: New file.
+ * modules/unictype/ctype-blank-tests: New file.
+ * modules/unictype/ctype-cntrl-tests: New file.
+ * modules/unictype/ctype-digit-tests: New file.
+ * modules/unictype/ctype-graph-tests: New file.
+ * modules/unictype/ctype-lower-tests: New file.
+ * modules/unictype/ctype-print-tests: New file.
+ * modules/unictype/ctype-punct-tests: New file.
+ * modules/unictype/ctype-space-tests: New file.
+ * modules/unictype/ctype-upper-tests: New file.
+ * modules/unictype/ctype-xdigit-tests: New file.
+ * modules/unictype/decimal-digit-tests: New file.
+ * modules/unictype/digit-tests: New file.
+ * modules/unictype/mirror-tests: New file.
+ * modules/unictype/numeric-tests: New file.
+ * modules/unictype/property-alphabetic-tests: New file.
+ * modules/unictype/property-ascii-hex-digit-tests: New file.
+ * modules/unictype/property-bidi-arabic-digit-tests: New file.
+ * modules/unictype/property-bidi-arabic-right-to-left-tests: New file.
+ * modules/unictype/property-bidi-block-separator-tests: New file.
+ * modules/unictype/property-bidi-boundary-neutral-tests: New file.
+ * modules/unictype/property-bidi-common-separator-tests: New file.
+ * modules/unictype/property-bidi-control-tests: New file.
+ * modules/unictype/property-bidi-embedding-or-override-tests: New file.
+ * modules/unictype/property-bidi-eur-num-separator-tests: New file.
+ * modules/unictype/property-bidi-eur-num-terminator-tests: New file.
+ * modules/unictype/property-bidi-european-digit-tests: New file.
+ * modules/unictype/property-bidi-hebrew-right-to-left-tests: New file.
+ * modules/unictype/property-bidi-left-to-right-tests: New file.
+ * modules/unictype/property-bidi-non-spacing-mark-tests: New file.
+ * modules/unictype/property-bidi-other-neutral-tests: New file.
+ * modules/unictype/property-bidi-pdf-tests: New file.
+ * modules/unictype/property-bidi-segment-separator-tests: New file.
+ * modules/unictype/property-bidi-whitespace-tests: New file.
+ * modules/unictype/property-byname-tests: New file.
+ * modules/unictype/property-combining-tests: New file.
+ * modules/unictype/property-composite-tests: New file.
+ * modules/unictype/property-currency-symbol-tests: New file.
+ * modules/unictype/property-dash-tests: New file.
+ * modules/unictype/property-decimal-digit-tests: New file.
+ * modules/unictype/property-default-ignorable-code-point-tests: New file.
+ * modules/unictype/property-deprecated-tests: New file.
+ * modules/unictype/property-diacritic-tests: New file.
+ * modules/unictype/property-extender-tests: New file.
+ * modules/unictype/property-format-control-tests: New file.
+ * modules/unictype/property-grapheme-base-tests: New file.
+ * modules/unictype/property-grapheme-extend-tests: New file.
+ * modules/unictype/property-grapheme-link-tests: New file.
+ * modules/unictype/property-hex-digit-tests: New file.
+ * modules/unictype/property-hyphen-tests: New file.
+ * modules/unictype/property-id-continue-tests: New file.
+ * modules/unictype/property-id-start-tests: New file.
+ * modules/unictype/property-ideographic-tests: New file.
+ * modules/unictype/property-ids-binary-operator-tests: New file.
+ * modules/unictype/property-ids-trinary-operator-tests: New file.
+ * modules/unictype/property-ignorable-control-tests: New file.
+ * modules/unictype/property-iso-control-tests: New file.
+ * modules/unictype/property-join-control-tests: New file.
+ * modules/unictype/property-left-of-pair-tests: New file.
+ * modules/unictype/property-line-separator-tests: New file.
+ * modules/unictype/property-logical-order-exception-tests: New file.
+ * modules/unictype/property-lowercase-tests: New file.
+ * modules/unictype/property-math-tests: New file.
+ * modules/unictype/property-non-break-tests: New file.
+ * modules/unictype/property-not-a-character-tests: New file.
+ * modules/unictype/property-numeric-tests: New file.
+ * modules/unictype/property-other-alphabetic-tests: New file.
+ * modules/unictype/property-other-default-ignorable-code-point-tests: New file.
+ * modules/unictype/property-other-grapheme-extend-tests: New file.
+ * modules/unictype/property-other-id-continue-tests: New file.
+ * modules/unictype/property-other-id-start-tests: New file.
+ * modules/unictype/property-other-lowercase-tests: New file.
+ * modules/unictype/property-other-math-tests: New file.
+ * modules/unictype/property-other-uppercase-tests: New file.
+ * modules/unictype/property-paired-punctuation-tests: New file.
+ * modules/unictype/property-paragraph-separator-tests: New file.
+ * modules/unictype/property-pattern-syntax-tests: New file.
+ * modules/unictype/property-pattern-white-space-tests: New file.
+ * modules/unictype/property-private-use-tests: New file.
+ * modules/unictype/property-punctuation-tests: New file.
+ * modules/unictype/property-quotation-mark-tests: New file.
+ * modules/unictype/property-radical-tests: New file.
+ * modules/unictype/property-sentence-terminal-tests: New file.
+ * modules/unictype/property-soft-dotted-tests: New file.
+ * modules/unictype/property-space-tests: New file.
+ * modules/unictype/property-terminal-punctuation-tests: New file.
+ * modules/unictype/property-test-tests: New file.
+ * modules/unictype/property-titlecase-tests: New file.
+ * modules/unictype/property-unassigned-code-value-tests: New file.
+ * modules/unictype/property-unified-ideograph-tests: New file.
+ * modules/unictype/property-uppercase-tests: New file.
+ * modules/unictype/property-variation-selector-tests: New file.
+ * modules/unictype/property-white-space-tests: New file.
+ * modules/unictype/property-xid-continue-tests: New file.
+ * modules/unictype/property-xid-start-tests: New file.
+ * modules/unictype/property-zero-width-tests: New file.
+ * modules/unictype/scripts-tests: New file.
+ * modules/unictype/syntax-c-ident-tests: New file.
+ * modules/unictype/syntax-c-whitespace-tests: New file.
+ * modules/unictype/syntax-java-ident-tests: New file.
+ * modules/unictype/syntax-java-whitespace-tests: New file.
+ * tests/unictype/test-bidi_byname.c: New file.
+ * tests/unictype/test-bidi_name.c: New file.
+ * tests/unictype/test-bidi_of.c: New file.
+ * tests/unictype/test-bidi_test.c: New file.
+ * tests/unictype/test-block_list.c: New file.
+ * tests/unictype/test-block_of.c: New file.
+ * tests/unictype/test-block_test.c: New file.
+ * tests/unictype/test-categ_and.c: New file.
+ * tests/unictype/test-categ_and_not.c: New file.
+ * tests/unictype/test-categ_byname.c: New file.
+ * tests/unictype/test-categ_name.c: New file.
+ * tests/unictype/test-categ_none.c: New file.
+ * tests/unictype/test-categ_of.c: New file.
+ * tests/unictype/test-categ_or.c: New file.
+ * tests/unictype/test-categ_test_withtable.c: New file.
+ * tests/unictype/test-combining.c: New file.
+ * tests/unictype/test-decdigit.c: New file.
+ * tests/unictype/test-digit.c: New file.
+ * tests/unictype/test-mirror.c: New file.
+ * tests/unictype/test-numeric.c: New file.
+ * tests/unictype/test-pr_byname.c: New file.
+ * tests/unictype/test-pr_test.c: New file.
+ * tests/unictype/test-predicate-part1.h: New file.
+ * tests/unictype/test-predicate-part2.h: New file.
+ * tests/unictype/test-scripts.c: New file.
+ * tests/unictype/test-sy_c_ident.c: New file.
+ * tests/unictype/test-sy_java_ident.c: New file.
+
+ * tests/unictype/test-categ_C.c: New file, generated by gen-ctype.c
+ for Unicode 5.0.0.
+ * tests/unictype/test-categ_Cc.c: Likewise.
+ * tests/unictype/test-categ_Cf.c: Likewise.
+ * tests/unictype/test-categ_Cn.c: Likewise.
+ * tests/unictype/test-categ_Co.c: Likewise.
+ * tests/unictype/test-categ_Cs.c: Likewise.
+ * tests/unictype/test-categ_L.c: Likewise.
+ * tests/unictype/test-categ_Ll.c: Likewise.
+ * tests/unictype/test-categ_Lm.c: Likewise.
+ * tests/unictype/test-categ_Lo.c: Likewise.
+ * tests/unictype/test-categ_Lt.c: Likewise.
+ * tests/unictype/test-categ_Lu.c: Likewise.
+ * tests/unictype/test-categ_M.c: Likewise.
+ * tests/unictype/test-categ_Mc.c: Likewise.
+ * tests/unictype/test-categ_Me.c: Likewise.
+ * tests/unictype/test-categ_Mn.c: Likewise.
+ * tests/unictype/test-categ_N.c: Likewise.
+ * tests/unictype/test-categ_Nd.c: Likewise.
+ * tests/unictype/test-categ_Nl.c: Likewise.
+ * tests/unictype/test-categ_No.c: Likewise.
+ * tests/unictype/test-categ_P.c: Likewise.
+ * tests/unictype/test-categ_Pc.c: Likewise.
+ * tests/unictype/test-categ_Pd.c: Likewise.
+ * tests/unictype/test-categ_Pe.c: Likewise.
+ * tests/unictype/test-categ_Pf.c: Likewise.
+ * tests/unictype/test-categ_Pi.c: Likewise.
+ * tests/unictype/test-categ_Po.c: Likewise.
+ * tests/unictype/test-categ_Ps.c: Likewise.
+ * tests/unictype/test-categ_S.c: Likewise.
+ * tests/unictype/test-categ_Sc.c: Likewise.
+ * tests/unictype/test-categ_Sk.c: Likewise.
+ * tests/unictype/test-categ_Sm.c: Likewise.
+ * tests/unictype/test-categ_So.c: Likewise.
+ * tests/unictype/test-categ_Z.c: Likewise.
+ * tests/unictype/test-categ_Zl.c: Likewise.
+ * tests/unictype/test-categ_Zp.c: Likewise.
+ * tests/unictype/test-categ_Zs.c: Likewise.
+ * tests/unictype/test-ctype_alnum.c: Likewise.
+ * tests/unictype/test-ctype_alpha.c: Likewise.
+ * tests/unictype/test-ctype_blank.c: Likewise.
+ * tests/unictype/test-ctype_cntrl.c: Likewise.
+ * tests/unictype/test-ctype_digit.c: Likewise.
+ * tests/unictype/test-ctype_graph.c: Likewise.
+ * tests/unictype/test-ctype_lower.c: Likewise.
+ * tests/unictype/test-ctype_print.c: Likewise.
+ * tests/unictype/test-ctype_punct.c: Likewise.
+ * tests/unictype/test-ctype_space.c: Likewise.
+ * tests/unictype/test-ctype_upper.c: Likewise.
+ * tests/unictype/test-ctype_xdigit.c: Likewise.
+ * tests/unictype/test-decdigit.h: Likewise.
+ * tests/unictype/test-digit.h: Likewise.
+ * tests/unictype/test-numeric.h: Likewise.
+ * tests/unictype/test-pr_alphabetic.c: Likewise.
+ * tests/unictype/test-pr_ascii_hex_digit.c: Likewise.
+ * tests/unictype/test-pr_bidi_arabic_digit.c: Likewise.
+ * tests/unictype/test-pr_bidi_arabic_right_to_left.c: Likewise.
+ * tests/unictype/test-pr_bidi_block_separator.c: Likewise.
+ * tests/unictype/test-pr_bidi_boundary_neutral.c: Likewise.
+ * tests/unictype/test-pr_bidi_common_separator.c: Likewise.
+ * tests/unictype/test-pr_bidi_control.c: Likewise.
+ * tests/unictype/test-pr_bidi_embedding_or_override.c: Likewise.
+ * tests/unictype/test-pr_bidi_eur_num_separator.c: Likewise.
+ * tests/unictype/test-pr_bidi_eur_num_terminator.c: Likewise.
+ * tests/unictype/test-pr_bidi_european_digit.c: Likewise.
+ * tests/unictype/test-pr_bidi_hebrew_right_to_left.c: Likewise.
+ * tests/unictype/test-pr_bidi_left_to_right.c: Likewise.
+ * tests/unictype/test-pr_bidi_non_spacing_mark.c: Likewise.
+ * tests/unictype/test-pr_bidi_other_neutral.c: Likewise.
+ * tests/unictype/test-pr_bidi_pdf.c: Likewise.
+ * tests/unictype/test-pr_bidi_segment_separator.c: Likewise.
+ * tests/unictype/test-pr_bidi_whitespace.c: Likewise.
+ * tests/unictype/test-pr_combining.c: Likewise.
+ * tests/unictype/test-pr_composite.c: Likewise.
+ * tests/unictype/test-pr_currency_symbol.c: Likewise.
+ * tests/unictype/test-pr_dash.c: Likewise.
+ * tests/unictype/test-pr_decimal_digit.c: Likewise.
+ * tests/unictype/test-pr_default_ignorable_code_point.c: Likewise.
+ * tests/unictype/test-pr_deprecated.c: Likewise.
+ * tests/unictype/test-pr_diacritic.c: Likewise.
+ * tests/unictype/test-pr_extender.c: Likewise.
+ * tests/unictype/test-pr_format_control.c: Likewise.
+ * tests/unictype/test-pr_grapheme_base.c: Likewise.
+ * tests/unictype/test-pr_grapheme_extend.c: Likewise.
+ * tests/unictype/test-pr_grapheme_link.c: Likewise.
+ * tests/unictype/test-pr_hex_digit.c: Likewise.
+ * tests/unictype/test-pr_hyphen.c: Likewise.
+ * tests/unictype/test-pr_id_continue.c: Likewise.
+ * tests/unictype/test-pr_id_start.c: Likewise.
+ * tests/unictype/test-pr_ideographic.c: Likewise.
+ * tests/unictype/test-pr_ids_binary_operator.c: Likewise.
+ * tests/unictype/test-pr_ids_trinary_operator.c: Likewise.
+ * tests/unictype/test-pr_ignorable_control.c: Likewise.
+ * tests/unictype/test-pr_iso_control.c: Likewise.
+ * tests/unictype/test-pr_join_control.c: Likewise.
+ * tests/unictype/test-pr_left_of_pair.c: Likewise.
+ * tests/unictype/test-pr_line_separator.c: Likewise.
+ * tests/unictype/test-pr_logical_order_exception.c: Likewise.
+ * tests/unictype/test-pr_lowercase.c: Likewise.
+ * tests/unictype/test-pr_math.c: Likewise.
+ * tests/unictype/test-pr_non_break.c: Likewise.
+ * tests/unictype/test-pr_not_a_character.c: Likewise.
+ * tests/unictype/test-pr_numeric.c: Likewise.
+ * tests/unictype/test-pr_other_alphabetic.c: Likewise.
+ * tests/unictype/test-pr_other_default_ignorable_code_point.c: Likewise.
+ * tests/unictype/test-pr_other_grapheme_extend.c: Likewise.
+ * tests/unictype/test-pr_other_id_continue.c: Likewise.
+ * tests/unictype/test-pr_other_id_start.c: Likewise.
+ * tests/unictype/test-pr_other_lowercase.c: Likewise.
+ * tests/unictype/test-pr_other_math.c: Likewise.
+ * tests/unictype/test-pr_other_uppercase.c: Likewise.
+ * tests/unictype/test-pr_paired_punctuation.c: Likewise.
+ * tests/unictype/test-pr_paragraph_separator.c: Likewise.
+ * tests/unictype/test-pr_pattern_syntax.c: Likewise.
+ * tests/unictype/test-pr_pattern_white_space.c: Likewise.
+ * tests/unictype/test-pr_private_use.c: Likewise.
+ * tests/unictype/test-pr_punctuation.c: Likewise.
+ * tests/unictype/test-pr_quotation_mark.c: Likewise.
+ * tests/unictype/test-pr_radical.c: Likewise.
+ * tests/unictype/test-pr_sentence_terminal.c: Likewise.
+ * tests/unictype/test-pr_soft_dotted.c: Likewise.
+ * tests/unictype/test-pr_space.c: Likewise.
+ * tests/unictype/test-pr_terminal_punctuation.c: Likewise.
+ * tests/unictype/test-pr_titlecase.c: Likewise.
+ * tests/unictype/test-pr_unassigned_code_value.c: Likewise.
+ * tests/unictype/test-pr_unified_ideograph.c: Likewise.
+ * tests/unictype/test-pr_uppercase.c: Likewise.
+ * tests/unictype/test-pr_variation_selector.c: Likewise.
+ * tests/unictype/test-pr_white_space.c: Likewise.
+ * tests/unictype/test-pr_xid_continue.c: Likewise.
+ * tests/unictype/test-pr_xid_start.c: Likewise.
+ * tests/unictype/test-pr_zero_width.c: Likewise.
+ * tests/unictype/test-sy_c_whitespace.c: Likewise.
+ * tests/unictype/test-sy_java_whitespace.c: Likewise.
+
+2007-11-12 Bruno Haible <bruno@clisp.org>
+
+ Unicode character classification functions.
+ * lib/unictype.h: New file.
+ * modules/unictype/base: New file.
+ * modules/unictype/category-L: New file.
+ * modules/unictype/category-Lu: New file.
+ * modules/unictype/category-Ll: New file.
+ * modules/unictype/category-Lt: New file.
+ * modules/unictype/category-Lm: New file.
+ * modules/unictype/category-Lo: New file.
+ * modules/unictype/category-M: New file.
+ * modules/unictype/category-Mn: New file.
+ * modules/unictype/category-Mc: New file.
+ * modules/unictype/category-Me: New file.
+ * modules/unictype/category-N: New file.
+ * modules/unictype/category-Nd: New file.
+ * modules/unictype/category-Nl: New file.
+ * modules/unictype/category-No: New file.
+ * modules/unictype/category-P: New file.
+ * modules/unictype/category-Pc: New file.
+ * modules/unictype/category-Pd: New file.
+ * modules/unictype/category-Ps: New file.
+ * modules/unictype/category-Pe: New file.
+ * modules/unictype/category-Pi: New file.
+ * modules/unictype/category-Pf: New file.
+ * modules/unictype/category-Po: New file.
+ * modules/unictype/category-S: New file.
+ * modules/unictype/category-Sm: New file.
+ * modules/unictype/category-Sc: New file.
+ * modules/unictype/category-Sk: New file.
+ * modules/unictype/category-So: New file.
+ * modules/unictype/category-Z: New file.
+ * modules/unictype/category-Zs: New file.
+ * modules/unictype/category-Zl: New file.
+ * modules/unictype/category-Zp: New file.
+ * modules/unictype/category-C: New file.
+ * modules/unictype/category-Cc: New file.
+ * modules/unictype/category-Cf: New file.
+ * modules/unictype/category-Cs: New file.
+ * modules/unictype/category-Co: New file.
+ * modules/unictype/category-Cn: New file.
+ * modules/unictype/category-or: New file.
+ * modules/unictype/category-of: New file.
+ * modules/unictype/category-test: New file.
+ * modules/unictype/category-test-withtable: New file.
+ * modules/unictype/category-byname: New file.
+ * modules/unictype/category-none: New file.
+ * modules/unictype/category-and: New file.
+ * modules/unictype/category-and-not: New file.
+ * modules/unictype/category-name: New file.
+ * modules/unictype/combining-class: New file.
+ * modules/unictype/category-all: New file.
+ * modules/unictype/bidicategory-all: New file.
+ * modules/unictype/bidicategory-byname: New file.
+ * modules/unictype/bidicategory-name: New file.
+ * modules/unictype/bidicategory-of: New file.
+ * modules/unictype/bidicategory-test: New file.
+ * modules/unictype/decimal-digit: New file.
+ * modules/unictype/digit: New file.
+ * modules/unictype/numeric: New file.
+ * modules/unictype/mirror: New file.
+ * modules/unictype/property-white-space: New file.
+ * modules/unictype/property-alphabetic: New file.
+ * modules/unictype/property-other-alphabetic: New file.
+ * modules/unictype/property-not-a-character: New file.
+ * modules/unictype/property-default-ignorable-code-point: New file.
+ * modules/unictype/property-other-default-ignorable-code-point: New
+ file.
+ * modules/unictype/property-deprecated: New file.
+ * modules/unictype/property-logical-order-exception: New file.
+ * modules/unictype/property-variation-selector: New file.
+ * modules/unictype/property-private-use: New file.
+ * modules/unictype/property-unassigned-code-value: New file.
+ * modules/unictype/property-uppercase: New file.
+ * modules/unictype/property-other-uppercase: New file.
+ * modules/unictype/property-lowercase: New file.
+ * modules/unictype/property-other-lowercase: New file.
+ * modules/unictype/property-titlecase: New file.
+ * modules/unictype/property-soft-dotted: New file.
+ * modules/unictype/property-id-start: New file.
+ * modules/unictype/property-other-id-start: New file.
+ * modules/unictype/property-id-continue: New file.
+ * modules/unictype/property-other-id-continue: New file.
+ * modules/unictype/property-xid-start: New file.
+ * modules/unictype/property-xid-continue: New file.
+ * modules/unictype/property-pattern-white-space: New file.
+ * modules/unictype/property-pattern-syntax: New file.
+ * modules/unictype/property-join-control: New file.
+ * modules/unictype/property-grapheme-base: New file.
+ * modules/unictype/property-grapheme-extend: New file.
+ * modules/unictype/property-other-grapheme-extend: New file.
+ * modules/unictype/property-grapheme-link: New file.
+ * modules/unictype/property-bidi-control: New file.
+ * modules/unictype/property-bidi-left-to-right: New file.
+ * modules/unictype/property-bidi-hebrew-right-to-left: New file.
+ * modules/unictype/property-bidi-arabic-right-to-left: New file.
+ * modules/unictype/property-bidi-european-digit: New file.
+ * modules/unictype/property-bidi-eur-num-separator: New file.
+ * modules/unictype/property-bidi-eur-num-terminator: New file.
+ * modules/unictype/property-bidi-arabic-digit: New file.
+ * modules/unictype/property-bidi-common-separator: New file.
+ * modules/unictype/property-bidi-block-separator: New file.
+ * modules/unictype/property-bidi-segment-separator: New file.
+ * modules/unictype/property-bidi-whitespace: New file.
+ * modules/unictype/property-bidi-non-spacing-mark: New file.
+ * modules/unictype/property-bidi-boundary-neutral: New file.
+ * modules/unictype/property-bidi-pdf: New file.
+ * modules/unictype/property-bidi-embedding-or-override: New file.
+ * modules/unictype/property-bidi-other-neutral: New file.
+ * modules/unictype/property-hex-digit: New file.
+ * modules/unictype/property-ascii-hex-digit: New file.
+ * modules/unictype/property-ideographic: New file.
+ * modules/unictype/property-unified-ideograph: New file.
+ * modules/unictype/property-radical: New file.
+ * modules/unictype/property-ids-binary-operator: New file.
+ * modules/unictype/property-ids-trinary-operator: New file.
+ * modules/unictype/property-zero-width: New file.
+ * modules/unictype/property-space: New file.
+ * modules/unictype/property-non-break: New file.
+ * modules/unictype/property-iso-control: New file.
+ * modules/unictype/property-format-control: New file.
+ * modules/unictype/property-dash: New file.
+ * modules/unictype/property-hyphen: New file.
+ * modules/unictype/property-punctuation: New file.
+ * modules/unictype/property-line-separator: New file.
+ * modules/unictype/property-paragraph-separator: New file.
+ * modules/unictype/property-quotation-mark: New file.
+ * modules/unictype/property-sentence-terminal: New file.
+ * modules/unictype/property-terminal-punctuation: New file.
+ * modules/unictype/property-currency-symbol: New file.
+ * modules/unictype/property-math: New file.
+ * modules/unictype/property-other-math: New file.
+ * modules/unictype/property-paired-punctuation: New file.
+ * modules/unictype/property-left-of-pair: New file.
+ * modules/unictype/property-combining: New file.
+ * modules/unictype/property-composite: New file.
+ * modules/unictype/property-decimal-digit: New file.
+ * modules/unictype/property-numeric: New file.
+ * modules/unictype/property-diacritic: New file.
+ * modules/unictype/property-extender: New file.
+ * modules/unictype/property-ignorable-control: New file.
+ * modules/unictype/property-test: New file.
+ * modules/unictype/property-byname: New file.
+ * modules/unictype/property-all: New file.
+ * modules/unictype/scripts: New file.
+ * modules/unictype/scripts-all: New file.
+ * modules/unictype/block-of: New file.
+ * modules/unictype/block-test: New file.
+ * modules/unictype/block-list: New file.
+ * modules/unictype/block-all: New file.
+ * modules/unictype/syntax-c-whitespace: New file.
+ * modules/unictype/syntax-java-whitespace: New file.
+ * modules/unictype/syntax-c-ident: New file.
+ * modules/unictype/syntax-java-ident: New file.
+ * modules/unictype/ctype-alnum: New file.
+ * modules/unictype/ctype-alpha: New file.
+ * modules/unictype/ctype-cntrl: New file.
+ * modules/unictype/ctype-digit: New file.
+ * modules/unictype/ctype-graph: New file.
+ * modules/unictype/ctype-lower: New file.
+ * modules/unictype/ctype-print: New file.
+ * modules/unictype/ctype-punct: New file.
+ * modules/unictype/ctype-space: New file.
+ * modules/unictype/ctype-upper: New file.
+ * modules/unictype/ctype-xdigit: New file.
+ * modules/unictype/ctype-blank: New file.
+ * lib/unictype/bidi_byname.c: New file.
+ * lib/unictype/bidi_name.c: New file.
+ * lib/unictype/bidi_of.c: New file.
+ * lib/unictype/bidi_test.c: New file.
+ * lib/unictype/bitmap.h: New file.
+ * lib/unictype/block_test.c: New file.
+ * lib/unictype/blocks.c: New file.
+ * lib/unictype/categ_C.c: New file.
+ * lib/unictype/categ_Cc.c: New file.
+ * lib/unictype/categ_Cf.c: New file.
+ * lib/unictype/categ_Cn.c: New file.
+ * lib/unictype/categ_Co.c: New file.
+ * lib/unictype/categ_Cs.c: New file.
+ * lib/unictype/categ_L.c: New file.
+ * lib/unictype/categ_Ll.c: New file.
+ * lib/unictype/categ_Lm.c: New file.
+ * lib/unictype/categ_Lo.c: New file.
+ * lib/unictype/categ_Lt.c: New file.
+ * lib/unictype/categ_Lu.c: New file.
+ * lib/unictype/categ_M.c: New file.
+ * lib/unictype/categ_Mc.c: New file.
+ * lib/unictype/categ_Me.c: New file.
+ * lib/unictype/categ_Mn.c: New file.
+ * lib/unictype/categ_N.c: New file.
+ * lib/unictype/categ_Nd.c: New file.
+ * lib/unictype/categ_Nl.c: New file.
+ * lib/unictype/categ_No.c: New file.
+ * lib/unictype/categ_P.c: New file.
+ * lib/unictype/categ_Pc.c: New file.
+ * lib/unictype/categ_Pd.c: New file.
+ * lib/unictype/categ_Pe.c: New file.
+ * lib/unictype/categ_Pf.c: New file.
+ * lib/unictype/categ_Pi.c: New file.
+ * lib/unictype/categ_Po.c: New file.
+ * lib/unictype/categ_Ps.c: New file.
+ * lib/unictype/categ_S.c: New file.
+ * lib/unictype/categ_Sc.c: New file.
+ * lib/unictype/categ_Sk.c: New file.
+ * lib/unictype/categ_Sm.c: New file.
+ * lib/unictype/categ_So.c: New file.
+ * lib/unictype/categ_Z.c: New file.
+ * lib/unictype/categ_Zl.c: New file.
+ * lib/unictype/categ_Zp.c: New file.
+ * lib/unictype/categ_Zs.c: New file.
+ * lib/unictype/categ_and.c: New file.
+ * lib/unictype/categ_and_not.c: New file.
+ * lib/unictype/categ_byname.c: New file.
+ * lib/unictype/categ_name.c: New file.
+ * lib/unictype/categ_none.c: New file.
+ * lib/unictype/categ_of.c: New file.
+ * lib/unictype/categ_or.c: New file.
+ * lib/unictype/categ_test.c: New file.
+ * lib/unictype/combining.c: New file.
+ * lib/unictype/ctype_alnum.c: New file.
+ * lib/unictype/ctype_alpha.c: New file.
+ * lib/unictype/ctype_blank.c: New file.
+ * lib/unictype/ctype_cntrl.c: New file.
+ * lib/unictype/ctype_digit.c: New file.
+ * lib/unictype/ctype_graph.c: New file.
+ * lib/unictype/ctype_lower.c: New file.
+ * lib/unictype/ctype_print.c: New file.
+ * lib/unictype/ctype_punct.c: New file.
+ * lib/unictype/ctype_space.c: New file.
+ * lib/unictype/ctype_upper.c: New file.
+ * lib/unictype/ctype_xdigit.c: New file.
+ * lib/unictype/decdigit.c: New file.
+ * lib/unictype/digit.c: New file.
+ * lib/unictype/identsyntaxmap.h: New file.
+ * lib/unictype/mirror.c: New file.
+ * lib/unictype/numeric.c: New file.
+ * lib/unictype/pr_alphabetic.c: New file.
+ * lib/unictype/pr_ascii_hex_digit.c: New file.
+ * lib/unictype/pr_bidi_arabic_digit.c: New file.
+ * lib/unictype/pr_bidi_arabic_right_to_left.c: New file.
+ * lib/unictype/pr_bidi_block_separator.c: New file.
+ * lib/unictype/pr_bidi_boundary_neutral.c: New file.
+ * lib/unictype/pr_bidi_common_separator.c: New file.
+ * lib/unictype/pr_bidi_control.c: New file.
+ * lib/unictype/pr_bidi_embedding_or_override.c: New file.
+ * lib/unictype/pr_bidi_eur_num_separator.c: New file.
+ * lib/unictype/pr_bidi_eur_num_terminator.c: New file.
+ * lib/unictype/pr_bidi_european_digit.c: New file.
+ * lib/unictype/pr_bidi_hebrew_right_to_left.c: New file.
+ * lib/unictype/pr_bidi_left_to_right.c: New file.
+ * lib/unictype/pr_bidi_non_spacing_mark.c: New file.
+ * lib/unictype/pr_bidi_other_neutral.c: New file.
+ * lib/unictype/pr_bidi_pdf.c: New file.
+ * lib/unictype/pr_bidi_segment_separator.c: New file.
+ * lib/unictype/pr_bidi_whitespace.c: New file.
+ * lib/unictype/pr_byname.c: New file.
+ * lib/unictype/pr_byname.gperf: New file.
+ * lib/unictype/pr_combining.c: New file.
+ * lib/unictype/pr_composite.c: New file.
+ * lib/unictype/pr_currency_symbol.c: New file.
+ * lib/unictype/pr_dash.c: New file.
+ * lib/unictype/pr_decimal_digit.c: New file.
+ * lib/unictype/pr_default_ignorable_code_point.c: New file.
+ * lib/unictype/pr_deprecated.c: New file.
+ * lib/unictype/pr_diacritic.c: New file.
+ * lib/unictype/pr_extender.c: New file.
+ * lib/unictype/pr_format_control.c: New file.
+ * lib/unictype/pr_grapheme_base.c: New file.
+ * lib/unictype/pr_grapheme_extend.c: New file.
+ * lib/unictype/pr_grapheme_link.c: New file.
+ * lib/unictype/pr_hex_digit.c: New file.
+ * lib/unictype/pr_hyphen.c: New file.
+ * lib/unictype/pr_id_continue.c: New file.
+ * lib/unictype/pr_id_start.c: New file.
+ * lib/unictype/pr_ideographic.c: New file.
+ * lib/unictype/pr_ids_binary_operator.c: New file.
+ * lib/unictype/pr_ids_trinary_operator.c: New file.
+ * lib/unictype/pr_ignorable_control.c: New file.
+ * lib/unictype/pr_iso_control.c: New file.
+ * lib/unictype/pr_join_control.c: New file.
+ * lib/unictype/pr_left_of_pair.c: New file.
+ * lib/unictype/pr_line_separator.c: New file.
+ * lib/unictype/pr_logical_order_exception.c: New file.
+ * lib/unictype/pr_lowercase.c: New file.
+ * lib/unictype/pr_math.c: New file.
+ * lib/unictype/pr_non_break.c: New file.
+ * lib/unictype/pr_not_a_character.c: New file.
+ * lib/unictype/pr_numeric.c: New file.
+ * lib/unictype/pr_other_alphabetic.c: New file.
+ * lib/unictype/pr_other_default_ignorable_code_point.c: New file.
+ * lib/unictype/pr_other_grapheme_extend.c: New file.
+ * lib/unictype/pr_other_id_continue.c: New file.
+ * lib/unictype/pr_other_id_start.c: New file.
+ * lib/unictype/pr_other_lowercase.c: New file.
+ * lib/unictype/pr_other_math.c: New file.
+ * lib/unictype/pr_other_uppercase.c: New file.
+ * lib/unictype/pr_paired_punctuation.c: New file.
+ * lib/unictype/pr_paragraph_separator.c: New file.
+ * lib/unictype/pr_pattern_syntax.c: New file.
+ * lib/unictype/pr_pattern_white_space.c: New file.
+ * lib/unictype/pr_private_use.c: New file.
+ * lib/unictype/pr_punctuation.c: New file.
+ * lib/unictype/pr_quotation_mark.c: New file.
+ * lib/unictype/pr_radical.c: New file.
+ * lib/unictype/pr_sentence_terminal.c: New file.
+ * lib/unictype/pr_soft_dotted.c: New file.
+ * lib/unictype/pr_space.c: New file.
+ * lib/unictype/pr_terminal_punctuation.c: New file.
+ * lib/unictype/pr_test.c: New file.
+ * lib/unictype/pr_titlecase.c: New file.
+ * lib/unictype/pr_unassigned_code_value.c: New file.
+ * lib/unictype/pr_unified_ideograph.c: New file.
+ * lib/unictype/pr_uppercase.c: New file.
+ * lib/unictype/pr_variation_selector.c: New file.
+ * lib/unictype/pr_white_space.c: New file.
+ * lib/unictype/pr_xid_continue.c: New file.
+ * lib/unictype/pr_xid_start.c: New file.
+ * lib/unictype/pr_zero_width.c: New file.
+ * lib/unictype/scripts.c: New file.
+ * lib/unictype/sy_c_ident.c: New file.
+ * lib/unictype/sy_c_whitespace.c: New file.
+ * lib/unictype/sy_java_ident.c: New file.
+ * lib/unictype/sy_java_whitespace.c: New file.
+
+ * lib/unictype/bidi_of.h: New file, generated by gen-ctype.c for
+ Unicode 5.0.0.
+ * lib/unictype/blocks.h: Likewise.
+ * lib/unictype/categ_C.h: Likewise.
+ * lib/unictype/categ_Cc.h: Likewise.
+ * lib/unictype/categ_Cf.h: Likewise.
+ * lib/unictype/categ_Cn.h: Likewise.
+ * lib/unictype/categ_Co.h: Likewise.
+ * lib/unictype/categ_Cs.h: Likewise.
+ * lib/unictype/categ_L.h: Likewise.
+ * lib/unictype/categ_Ll.h: Likewise.
+ * lib/unictype/categ_Lm.h: Likewise.
+ * lib/unictype/categ_Lo.h: Likewise.
+ * lib/unictype/categ_Lt.h: Likewise.
+ * lib/unictype/categ_Lu.h: Likewise.
+ * lib/unictype/categ_M.h: Likewise.
+ * lib/unictype/categ_Mc.h: Likewise.
+ * lib/unictype/categ_Me.h: Likewise.
+ * lib/unictype/categ_Mn.h: Likewise.
+ * lib/unictype/categ_N.h: Likewise.
+ * lib/unictype/categ_Nd.h: Likewise.
+ * lib/unictype/categ_Nl.h: Likewise.
+ * lib/unictype/categ_No.h: Likewise.
+ * lib/unictype/categ_P.h: Likewise.
+ * lib/unictype/categ_Pc.h: Likewise.
+ * lib/unictype/categ_Pd.h: Likewise.
+ * lib/unictype/categ_Pe.h: Likewise.
+ * lib/unictype/categ_Pf.h: Likewise.
+ * lib/unictype/categ_Pi.h: Likewise.
+ * lib/unictype/categ_Po.h: Likewise.
+ * lib/unictype/categ_Ps.h: Likewise.
+ * lib/unictype/categ_S.h: Likewise.
+ * lib/unictype/categ_Sc.h: Likewise.
+ * lib/unictype/categ_Sk.h: Likewise.
+ * lib/unictype/categ_Sm.h: Likewise.
+ * lib/unictype/categ_So.h: Likewise.
+ * lib/unictype/categ_Z.h: Likewise.
+ * lib/unictype/categ_Zl.h: Likewise.
+ * lib/unictype/categ_Zp.h: Likewise.
+ * lib/unictype/categ_Zs.h: Likewise.
+ * lib/unictype/categ_of.h: Likewise.
+ * lib/unictype/combining.h: Likewise.
+ * lib/unictype/ctype_alnum.h: Likewise.
+ * lib/unictype/ctype_alpha.h: Likewise.
+ * lib/unictype/ctype_blank.h: Likewise.
+ * lib/unictype/ctype_cntrl.h: Likewise.
+ * lib/unictype/ctype_digit.h: Likewise.
+ * lib/unictype/ctype_graph.h: Likewise.
+ * lib/unictype/ctype_lower.h: Likewise.
+ * lib/unictype/ctype_print.h: Likewise.
+ * lib/unictype/ctype_punct.h: Likewise.
+ * lib/unictype/ctype_space.h: Likewise.
+ * lib/unictype/ctype_upper.h: Likewise.
+ * lib/unictype/ctype_xdigit.h: Likewise.
+ * lib/unictype/decdigit.h: Likewise.
+ * lib/unictype/digit.h: Likewise.
+ * lib/unictype/mirror.h: Likewise.
+ * lib/unictype/numeric.h: Likewise.
+ * lib/unictype/pr_alphabetic.h: Likewise.
+ * lib/unictype/pr_ascii_hex_digit.h: Likewise.
+ * lib/unictype/pr_bidi_arabic_digit.h: Likewise.
+ * lib/unictype/pr_bidi_arabic_right_to_left.h: Likewise.
+ * lib/unictype/pr_bidi_block_separator.h: Likewise.
+ * lib/unictype/pr_bidi_boundary_neutral.h: Likewise.
+ * lib/unictype/pr_bidi_common_separator.h: Likewise.
+ * lib/unictype/pr_bidi_control.h: Likewise.
+ * lib/unictype/pr_bidi_embedding_or_override.h: Likewise.
+ * lib/unictype/pr_bidi_eur_num_separator.h: Likewise.
+ * lib/unictype/pr_bidi_eur_num_terminator.h: Likewise.
+ * lib/unictype/pr_bidi_european_digit.h: Likewise.
+ * lib/unictype/pr_bidi_hebrew_right_to_left.h: Likewise.
+ * lib/unictype/pr_bidi_left_to_right.h: Likewise.
+ * lib/unictype/pr_bidi_non_spacing_mark.h: Likewise.
+ * lib/unictype/pr_bidi_other_neutral.h: Likewise.
+ * lib/unictype/pr_bidi_pdf.h: Likewise.
+ * lib/unictype/pr_bidi_segment_separator.h: Likewise.
+ * lib/unictype/pr_bidi_whitespace.h: Likewise.
+ * lib/unictype/pr_combining.h: Likewise.
+ * lib/unictype/pr_composite.h: Likewise.
+ * lib/unictype/pr_currency_symbol.h: Likewise.
+ * lib/unictype/pr_dash.h: Likewise.
+ * lib/unictype/pr_decimal_digit.h: Likewise.
+ * lib/unictype/pr_default_ignorable_code_point.h: Likewise.
+ * lib/unictype/pr_deprecated.h: Likewise.
+ * lib/unictype/pr_diacritic.h: Likewise.
+ * lib/unictype/pr_extender.h: Likewise.
+ * lib/unictype/pr_format_control.h: Likewise.
+ * lib/unictype/pr_grapheme_base.h: Likewise.
+ * lib/unictype/pr_grapheme_extend.h: Likewise.
+ * lib/unictype/pr_grapheme_link.h: Likewise.
+ * lib/unictype/pr_hex_digit.h: Likewise.
+ * lib/unictype/pr_hyphen.h: Likewise.
+ * lib/unictype/pr_id_continue.h: Likewise.
+ * lib/unictype/pr_id_start.h: Likewise.
+ * lib/unictype/pr_ideographic.h: Likewise.
+ * lib/unictype/pr_ids_binary_operator.h: Likewise.
+ * lib/unictype/pr_ids_trinary_operator.h: Likewise.
+ * lib/unictype/pr_ignorable_control.h: Likewise.
+ * lib/unictype/pr_iso_control.h: Likewise.
+ * lib/unictype/pr_join_control.h: Likewise.
+ * lib/unictype/pr_left_of_pair.h: Likewise.
+ * lib/unictype/pr_line_separator.h: Likewise.
+ * lib/unictype/pr_logical_order_exception.h: Likewise.
+ * lib/unictype/pr_lowercase.h: Likewise.
+ * lib/unictype/pr_math.h: Likewise.
+ * lib/unictype/pr_non_break.h: Likewise.
+ * lib/unictype/pr_not_a_character.h: Likewise.
+ * lib/unictype/pr_numeric.h: Likewise.
+ * lib/unictype/pr_other_alphabetic.h: Likewise.
+ * lib/unictype/pr_other_default_ignorable_code_point.h: Likewise.
+ * lib/unictype/pr_other_grapheme_extend.h: Likewise.
+ * lib/unictype/pr_other_id_continue.h: Likewise.
+ * lib/unictype/pr_other_id_start.h: Likewise.
+ * lib/unictype/pr_other_lowercase.h: Likewise.
+ * lib/unictype/pr_other_math.h: Likewise.
+ * lib/unictype/pr_other_uppercase.h: Likewise.
+ * lib/unictype/pr_paired_punctuation.h: Likewise.
+ * lib/unictype/pr_paragraph_separator.h: Likewise.
+ * lib/unictype/pr_pattern_syntax.h: Likewise.
+ * lib/unictype/pr_pattern_white_space.h: Likewise.
+ * lib/unictype/pr_private_use.h: Likewise.
+ * lib/unictype/pr_punctuation.h: Likewise.
+ * lib/unictype/pr_quotation_mark.h: Likewise.
+ * lib/unictype/pr_radical.h: Likewise.
+ * lib/unictype/pr_sentence_terminal.h: Likewise.
+ * lib/unictype/pr_soft_dotted.h: Likewise.
+ * lib/unictype/pr_space.h: Likewise.
+ * lib/unictype/pr_terminal_punctuation.h: Likewise.
+ * lib/unictype/pr_titlecase.h: Likewise.
+ * lib/unictype/pr_unassigned_code_value.h: Likewise.
+ * lib/unictype/pr_unified_ideograph.h: Likewise.
+ * lib/unictype/pr_uppercase.h: Likewise.
+ * lib/unictype/pr_variation_selector.h: Likewise.
+ * lib/unictype/pr_white_space.h: Likewise.
+ * lib/unictype/pr_xid_continue.h: Likewise.
+ * lib/unictype/pr_xid_start.h: Likewise.
+ * lib/unictype/pr_zero_width.h: Likewise.
+ * lib/unictype/scripts.h: Likewise.
+ * lib/unictype/scripts_byname.gperf: Likewise.
+ * lib/unictype/sy_c_ident.h: Likewise.
+ * lib/unictype/sy_c_whitespace.h: Likewise.
+ * lib/unictype/sy_java_ident.h: Likewise.
+ * lib/unictype/sy_java_whitespace.h: Likewise.
+
+ * lib/unictype/Makefile: New file.
+ * lib/unictype/gen-ctype.c: New file, based on gen-unicode-ctype.c in
+ glibc.
+ * lib/unictype/3level.h: New file, copied from glibc.
+ * lib/unictype/3levelbit.h: New file.
+
+2007-11-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/gperf: New file.
+ * modules/iconv_open (Depends-on): Add it.
+ (Makefile.am): Remove the GPERF definition.
+
+2007-11-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/round.m4 (gl_FUNC_ROUND): Test against NetBSD 3.0 bug.
+ * doc/functions/round.texi: Mention the NetBSD 3.0 bug.
+
+2007-11-11 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-argmatch.c (ARGMATCH_DIE): Undefine.
+ (usage): Remove function.
+
+2007-11-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/roundf.m4 (gl_FUNC_ROUNDF): Use gl_FUNC_FLOORF_LIBS and
+ gl_FUNC_CEILF_LIBS.
+ * m4/round.m4 (gl_FUNC_ROUND): Use gl_FUNC_FLOOR_LIBS and
+ gl_FUNC_CEIL_LIBS.
+ * m4/roundl.m4 (gl_FUNC_ROUNDL): Use gl_FUNC_FLOORL_LIBS and
+ gl_FUNC_CEILL_LIBS.
+ * modules/roundf (Files): Add m4/floorf.m4, m4/ceilf.m4.
+ * modules/round (Files): Add m4/floor.m4, m4/ceil.m4.
+ * modules/roundl (Files): Add m4/floorl.m4, m4/ceill.m4.
+
+2007-11-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/roundf.m4 (gl_FUNC_ROUNDF): Handle the case that floorf and
+ roundf were declared but do not exist on functions.
+ * m4/roundl.m4 (gl_FUNC_ROUNDL): Handle the case that floorl and
+ roundl were declared but do not exist on functions.
+ * lib/round.c (HAVE_FLOOR_AND_CEIL): Use HAVE_FLOORF_AND_CEILF and
+ HAVE_FLOORL_AND_CEILL, respectively.
+ Needed for Sun C on Solaris 10.
+
+2007-11-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/roundf.m4 (gl_FUNC_ROUNDF): Set REPLACE_ROUNDF instead of
+ HAVE_DECL_ROUNDF. Remove redundant AC_SUBST.
+ * m4/round.m4 (gl_FUNC_ROUND): Set REPLACE_ROUND instead of
+ HAVE_DECL_ROUND. Remove redundant AC_SUBST.
+ * m4/roundl.m4 (gl_FUNC_ROUNDL): Set REPLACE_ROUNDL instead of
+ HAVE_DECL_ROUNDL. Remove redundant AC_SUBST.
+ * lib/math.in.h (roundf): Use REPLACE_ROUNDF instead of
+ HAVE_DECL_ROUNDF.
+ (round): Use REPLACE_ROUND instead of HAVE_DECL_ROUND.
+ (roundl): Use REPLACE_ROUNDL instead of HAVE_DECL_ROUNDL.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_ROUND* instead
+ of HAVE_DECL_ROUND*.
+ * modules/math (Makefile.am): Update.
+
+2007-11-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_PRINTF_PARSE): Use same check for
+ ptrdiff_t as m4/intl.m4.
+
+2007-11-10 Jim Meyering <meyering@redhat.com>
+
+ Avoid link failure for the argmatch test.
+ * tests/test-argmatch.c (usage): Define function to avoid a link
+ failure: argmatch_die requires a usage function.
+
+2007-11-09 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions/snprintf.texi: Mention BeOS deficiency.
+ * doc/functions/vsnprintf.texi: Likewise.
+ * lib/vasnprintf.c (VASNPRINTF): Ensure that we never call snprintf
+ with a size argument < 2.
+
+2007-11-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Increase reallocation of snprintf
+ buffer. Fixes an inefficiency introduced on 2007-11-03.
+
+2007-11-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-tr.m4 (gt_LOCALE_TR_UTF8) [BeOS]: Make this test return
+ none instead of tr_TR. Fixes a failure of test-c-strcasecmp.c.
+
+2007-11-08 Jim Meyering <meyering@redhat.com>
+
+ Change cache variable name prefix "jm_" to "gl_" everywhere.
+ * m4/d-type.m4, m4/jm-winsz1.m4, m4/jm-winsz2.m4, m4/link-follow.m4:
+ * m4/putenv.m4, m4/strtoimax.m4, m4/strtoumax.m4, m4/unlink-busy.m4:
+ * m4/uptime.m4: s/gl_/jm_/
+
+2007-11-07 Bruno Haible <bruno@clisp.org>
+
+ Update to GNU gettext 0.17.
+ * m4/intl.m4: Update to GNU gettext 0.17.
+ * m4/po.m4: Likewise.
+ * modules/gettext (Files): Remove m4/ulonglong.m4.
+ (configure.ac): Require gettext infrastructure from version 0.17.
+
+2007-11-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/fbufmode.c (fbufmode) [QNX]: Use numerical values for flags; the
+ symbolic values are not defined in a public header.
+ * lib/freadable.c (freadable) [QNX]: Likewise.
+ * lib/freadahead.c (freadahead) [QNX]: Likewise.
+ * lib/freading.c (freading) [QNX]: Likewise.
+ * lib/fseterr.c (fseterr) [QNX]: Likewise.
+ * lib/fwritable.c (fwritable) [QNX]: Likewise.
+ * lib/fwriting.c (fwriting) [QNX]: Likewise.
+ * lib/fpurge.c (fpurge) [QNX]: Likewise. Add a return statement.
+ Reported by Alain Magloire.
+
+ * m4/fpending.m4 (gl_FUNC_FPENDING): Add a variant for QNX.
+
+2007-11-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Expand the NEED_PRINTF_DIRECTIVE_A
+ code when NEED_PRINTF_LONG_DOUBLE or NEED_PRINTF_DOUBLE is set.
+ Needed on Cygwin, where !NEED_PRINTF_DIRECTIVE_A && NEED_PRINTF_DOUBLE.
+ Reported by Eric Blake.
+
+2007-10-27 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/malloc (configure.ac): Define GNULIB_MALLOC_GNU always.
+ * modules/realloc (configure.ac): Define GNULIB_REALLOC_GNU always.
+ * lib/realloc.c (SYSTEM_MALLOC_GLIBC_COMPATIBLE): New macro.
+ (malloc): Undefine also before including <stdlib.h>.
+ (rpl_realloc): Turn malloc(0) into malloc(1) if necessary.
+ Needed on OSF/1 4.0.
+
+2007-11-05 Jim Meyering <meyering@redhat.com>
+
+ git-version-gen: sync from coreutils.
+ * build-aux/git-version-gen: Add comments.
+ Change the first '-' to '.' in the snapshot version string,
+ e.g., 6.9-377-08144 -> 6.9.377-08144
+ Remove first parameter.
+ Don't declare a version "-dirty" merely because a time
+ stamp has changed.
+
+2007-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h: Protect all macro definitions containing an 'if'
+ statement through a "do { ... } while (0)".
+ * lib/tls.h: Likewise.
+
+2007-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (DCHAR_IS_TCHAR, DCHAR_CPY): Undefine at the end.
+
+2007-11-04 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_ENOMEM): Use GL_NOCRASH.
+ * modules/fprintf-posix (Depends-on): Add nocrash.
+ * modules/snprintf-posix (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/vasnprintf-posix (Depends-on): Likewise.
+ * modules/vasprintf-posix (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf-posix (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+ * modules/unistdio/u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u8-u8-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u16-u16-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/u32-u32-vasnprintf (Depends-on): Likewise.
+ * modules/unistdio/ulc-vasnprintf (Depends-on): Likewise.
+
+2007-11-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/nocrash: New file.
+ * m4/nocrash.m4: New file, taken from GNU clisp. Code taken from
+ GNU libsigsegv, with permission of GNU libsigsegv's copyright holders.
+
+2007-11-04 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (test_function): Add some tests of
+ precision handling.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+
+ Fix *printf behaviour for large precisions on mingw and BeOS.
+ * m4/printf.m4 (gl_PRINTF_PRECISION): New macro.
+ * lib/vasnprintf.c (VASNPRINTF): Handle NEED_PRINTF_UNBOUNDED_PRECISION.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_PRECISION): New macro.
+ (gl_PREREQ_VASNPRINTF_WITH_EXTRAS): Invoke it.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+ gl_PRINTF_PRECISION and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_PRECISION.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * doc/functions/fprintf.texi: Update.
+ * doc/functions/printf.texi: Update.
+ * doc/functions/snprintf.texi: Update.
+ * doc/functions/sprintf.texi: Update.
+ * doc/functions/vfprintf.texi: Update.
+ * doc/functions/vprintf.texi: Update.
+ * doc/functions/vsnprintf.texi: Update.
+ * doc/functions/vsprintf.texi: Update.
+
+2007-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (scale10_round_decimal_decoded): Fix shift loop.
+
+2007-11-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/relocatable-prog (Files): Add m4/lib-ld.m4.
+ Reported by Sylvain Beucler <beuc@gnu.org>.
+
+2007-11-03 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fprintf-posix2.sh: New file.
+ * tests/test-fprintf-posix2.c: New file.
+ * modules/fprintf-posix-tests (Files): Add them.
+ (TESTS): Add test-fprintf-posix2.sh.
+ (configure.ac): Check for getrlimit and setrlimit.
+ (check_PROGRAMS): Add test-fprintf-posix2.
+
+ * tests/test-printf-posix2.sh: New file.
+ * tests/test-printf-posix2.c: New file.
+ * modules/printf-posix-tests (Files): Add them.
+ (TESTS): Add test-printf-posix2.sh.
+ (configure.ac): Check for getrlimit and setrlimit.
+ (check_PROGRAMS): Add test-printf-posix2.
+
+ Fix *printf behaviour in out-of-memory situations on MacOS X and *BSD.
+ * m4/printf.m4 (gl_PRINTF_ENOMEM): New macro.
+ * lib/vasnprintf.c: Implement NEED_PRINTF_DOUBLE.
+ (decode_double): New function, copied from decode_long_double.
+ (scale10_round_decimal_decoded): New function, extracted from
+ scale10_round_decimal_long_double.
+ (scale10_round_decimal_long_double): Use it.
+ (scale10_round_decimal_double): New function.
+ (floorlog10): New function.
+ (VASNPRINTF): Handle NEED_PRINTF_DOUBLE case.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_ENOMEM): New macro.
+ (gl_PREREQ_VASNPRINTF_WITH_EXTRAS): Invoke it.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+ gl_PRINTF_ENOMEM and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_ENOMEM.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * modules/fprintf-posix (Depends-on): Add frexp-nolibm.
+ * modules/snprintf-posix (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/vasnprintf-posix (Depends-on): Likewise.
+ * modules/vasprintf-posix (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf-posix (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+ * doc/functions/fprintf.texi: Update.
+ * doc/functions/printf.texi: Update.
+ * doc/functions/snprintf.texi: Update.
+ * doc/functions/sprintf.texi: Update.
+ * doc/functions/vfprintf.texi: Update.
+ * doc/functions/vprintf.texi: Update.
+ * doc/functions/vsnprintf.texi: Update.
+ * doc/functions/vsprintf.texi: Update.
+
+2007-11-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/frexp-nolibm-tests: New file.
+
+ * modules/frexp-nolibm: New file.
+ * m4/frexp.m4 (gl_FUNC_FREXP_NO_LIBM): New macro.
+
+2007-11-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Don't assume that snprintf's return
+ value is C99 compliant.
+ Needed for OSF/1 5.1.
+
+2007-11-03 Bruno Haible <bruno@clisp.org>
+
+ Fix out-of-memory handling of vasnprintf.
+ * lib/printf-parse.c: Include <errno.h>.
+ (PRINTF_PARSE): When failing, set errno to EINVAL or ENOMEM.
+ * lib/vasnprintf.c (VASNPRINTF): When PRINTF_PARSE fails, assume errno
+ is already set.
+
+2007-11-02 Eric Blake <ebb9@byu.net>
+
+ Fix tests on cygwin.
+ * modules/xprintf-posix-tests (Makefile.am): Link against -lintl.
+
+2007-11-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdlib.in.h (putenv): Remove the "not POSIX compliant everywhere"
+ warning.
+ * doc/functions/putenv.texi: Clarify that the 'putenv' module is not
+ needed for POSIX compatibility.
+
+2007-11-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/putenv.m4 (gl_FUNC_PUTENV): Also mention that we're checking
+ for compatibility with GNU.
+
+2007-11-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/putenv.c: Include <stdlib.h>. Remove rpl_putenv declaration.
+ (putenv): Renamed from rpl_putenv. Change argument type from
+ 'const char *' to 'char *'.
+ * m4/putenv.m4 (gl_FUNC_PUTENV): Require gl_STDLIB_H_DEFAULTS. Instead
+ of defining putenv in config.h, just set REPLACE_PUTENV.
+ * modules/putenv (Depends-on): Add stdlib.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR.
+ (Include): Use <stdlib.h>.
+ * lib/stdlib.in.h (putenv): New declaration.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize GNULIB_PUTENV and
+ REPLACE_PUTENV.
+ * modules/stdlib (Makefile.am): Substitute GNULIB_PUTENV and
+ REPLACE_PUTENV.
+ Needed for MacOS X 10.5.0.
+ Reported by Peter O'Gorman <peter@pogma.com>.
+
+2007-11-01 Jim Meyering <meyering@redhat.com>
+
+ Treat an empty date string exactly like "0".
+ * lib/getdate.y (get_date): Once any isspace or TZ= prefix is consumed,
+ if the remaining date string (to be parsed) is empty, use "0".
+ Reported by Mischa Molhoek and discussed in this thread:
+ <http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/11726>.
+
+2007-10-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/intmax_t.m4 (gl_AC_TYPE_INTMAX_T, gt_AC_TYPE_INTMAX_T): Use
+ AC_TYPE_LONG_LONG_INT instead of gl_AC_TYPE_LONG_LONG.
+ * m4/uintmax_t.m4 (gl_AC_TYPE_UINTMAX_T): Use
+ AC_TYPE_UNSIGNED_LONG_LONG_INT instead of gl_AC_TYPE_UNSIGNED_LONG_LONG.
+ * m4/longlong.m4 (gl_AC_TYPE_LONG_LONG): Remove macro.
+ * m4/ulonglong.m4 (gl_AC_TYPE_UNSIGNED_LONG_LONG): Remove macro.
+
+2007-10-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/longlong.m4 (_AC_TYPE_LONG_LONG_SNIPPET): New macro, extracted
+ from AC_TYPE_LONG_LONG_INT and AC_TYPE_UNSIGNED_LONG_LONG_INT.
+ (AC_TYPE_LONG_LONG_INT): Use it.
+ (AC_TYPE_UNSIGNED_LONG_LONG_INT): Moved here from m4/ulonglong.m4. Use
+ it as well.
+ * m4/ulonglong.m4 (AC_TYPE_UNSIGNED_LONG_LONG_INT): Remove macro; moved
+ to m4/longlong.m4.
+ * modules/stdint (Files): Remove m4/ulonglong.m4.
+ * modules/strtoull (Files): Use m4/longlong.m4 instead of
+ m4/ulonglong.m4.
+ * modules/strtoumax (Files): Likewise.
+
+2007-10-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/xvasprintf-posix: New file.
+ Suggested by Eric Blake.
+
+2007-10-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/xprintf-posix-tests: New file.
+ * tests/test-xprintf-posix.sh: New file.
+ * tests/test-xprintf-posix.c: New file.
+ * tests/test-xfprintf-posix.c: New file.
+
+ * modules/xprintf-posix: New file.
+
+2007-10-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/fbufmode-tests (MOSTLYCLEANFILES): Remove temp files.
+ * modules/freadable-tests (MOSTLYCLEANFILES): Likewise.
+ * modules/fwritable-tests (MOSTLYCLEANFILES): Likewise.
+
+2007-10-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/floorf.m4 (gl_FUNC_FLOORF_LIBS): Rename the cache variable to
+ contain the special marker '_cv_'.
+ * m4/floor.m4 (gl_FUNC_FLOOR_LIBS): Likewise.
+ * m4/floorl.m4 (gl_FUNC_FLOORL_LIBS): Likewise.
+ * m4/ceilf.m4 (gl_FUNC_CEILF_LIBS): Likewise.
+ * m4/ceil.m4 (gl_FUNC_CEIL_LIBS): Likewise.
+ * m4/ceill.m4 (gl_FUNC_CEILL_LIBS): Likewise.
+ Reported by Ralf Wildenhues.
+
+2007-10-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): When --lgpl is not specified, set
+ sed_transform_lib_file to convert LGPL and GPLv2+ copyright headers to
+ GPLv3.
+ Reported by Simon Josefsson.
+
+2007-10-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/math.in.h: Test REPLACE_ISFINITE instead of HAVE_DECL_ISFINITE.
+ * m4/isfinite.m4 (gl_ISFINITE): Initialize REPLACE_ISFINITE instead of
+ HAVE_DECL_ISFINITE.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Update.
+ * modules/math (Makefile.am): Substitute REPLACE_ISFINITE instead of
+ HAVE_DECL_ISFINITE.
+
+2007-10-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint.in.h (_STDINT_MAX): Subtract 1 from an unused signed
+ integer shift in the signed case. Fixes warnings with OSF/1 5.1 cc.
+
+2007-10-28 Bruno Haible <bruno@clisp.org>
+
+ Fix link errors with Sun C 5.0 on Solaris 10.
+ * m4/floorf.m4 (gl_FUNC_FLOORF): Consider also the case that the
+ function is declared but not present in the compiler's libm.
+ * m4/floorl.m4 (gl_FUNC_FLOORL): Likewise.
+ * m4/ceilf.m4 (gl_FUNC_CEILF): Likewise.
+ * m4/ceill.m4 (gl_FUNC_CEILL: Likewise.
+ * lib/math.in.h: Test REPLACE_CEILF instead of HAVE_DECL_CEILF.
+ Test REPLACE_CEILL instead of HAVE_DECL_CEILL.
+ Test REPLACE_FLOORF instead of HAVE_DECL_FLOORF.
+ Test REPLACE_FLOORL instead of HAVE_DECL_FLOORL.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Update.
+ * modules/math (Makefile.am): Substitute REPLACE_CEILF instead of
+ HAVE_DECL_CEILF, REPLACE_CEILL instead of HAVE_DECL_CEILL,
+ REPLACE_FLOORF instead of HAVE_DECL_FLOORF, REPLACE_FLOORL instead of
+ HAVE_DECL_FLOORL.
+
+2007-10-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/floorl.m4 (gl_FUNC_FLOORL_LIBS): New macro, extracted from
+ gl_FUNC_FLOORL. Cache the result.
+ (gl_FUNC_FLOORL): Use it.
+ * m4/ceill.m4 (gl_FUNC_CEILL_LIBS): New macro, extracted from
+ gl_FUNC_CEILL. Cache the result.
+ (gl_FUNC_CEILL): Use it.
+
+ * m4/floor.m4 (gl_FUNC_FLOOR_LIBS): New macro, extracted from
+ gl_FUNC_FLOOR. Cache the result.
+ (gl_FUNC_FLOOR): Use it.
+ * m4/ceil.m4 (gl_FUNC_CEIL_LIBS): New macro, extracted from
+ gl_FUNC_CEIL. Cache the result.
+ (gl_FUNC_CEIL): Use it.
+
+ * m4/floorf.m4 (gl_FUNC_FLOORF_LIBS): New macro, extracted from
+ gl_FUNC_FLOORF. Cache the result.
+ (gl_FUNC_FLOORF): Use it.
+ * m4/ceilf.m4 (gl_FUNC_CEILF_LIBS): New macro, extracted from
+ gl_FUNC_CEILF. Cache the result.
+ (gl_FUNC_CEILF): Use it.
+
+2007-10-28 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Allow specifying the LGPL version number through
+ --lgpl=2 or --lgpl=3.
+ (func_usage): Document --lgpl with argument.
+ Handle --lgpl=... arguments.
+ (func_import): Recognize also gl_LGPL calls with an argument. When
+ --lgpl=2 is used and the module's license is just LGPL, report an
+ error. Set sed_transform_lib_file according to the lgpl variable. In
+ the generated files, use --lgpl or gl_LGPL invocations with argument,
+ if necessary.
+ * doc/gnulib-intro.texi (Copyright): Explain how to get modules under
+ an LGPv2+ license.
+ * doc/gnulib-tool.texi (Modified imports): Update explanation of
+ gl_LGPL macro.
+
+2007-10-28 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/unistr.h (u8_uctomb_aux): Declare also if !HAVE_INLINE.
+ (u16_uctomb_aux): Likewise.
+ * lib/unistr/u8-uctomb-aux.c (u8_uctomb_aux): Define also if
+ !HAVE_INLINE.
+ * lib/unistr/u16-uctomb-aux.c (u16_uctomb_aux): Likewise
+
+2007-10-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/error: Add a notice recommending to change XGETTEXT_OPTIONS.
+ Invoke AM_GETTEXT_OPTION if it exists.
+ * modules/vasprintf: Likewise.
+ * modules/verror: Likewise.
+ * modules/xprintf: Likewise.
+ * modules/xvasprintf: Likewise.
+
+2007-10-27 Ben Pfaff <blp@gnu.org>
+
+ * lib/math.in.h: Define isfinite macro and prototypes for
+ gl_isfinitef, gl_isfinited, gl_isfinitel if we are providing
+ implementations.
+ * m4/math_h.m4: New substitutions for isfinite module.
+ * lib/isfinite.c: New file.
+ * m4/isfinite.m4: New file.
+ * modules/math: Replace isfinite-related @VARS@ in math.in.h.
+ * modules/isfinite: New file.
+ * modules/isfinite-tests: New file.
+ * tests/tests-isfinite.c: New file.
+ * doc/functions/isfinite.texi: Mention isfinite module.
+ * MODULES.html.sh: Mention new module.
+
+2007-10-27 Ben Pfaff <blp@gnu.org>
+
+ Ralf Wildenhues reported that Tru64 4.0D declares the round
+ functions but does not have definitions.
+ * m4/check-math-lib.m4 (gl_CHECK_MATH_LIB): If the target function
+ cannot be found in any library, set the output variable to
+ "missing" instead of "".
+ * m4/round.m4: Also use our substitute if we cannot find round in
+ any library, even if it is declared.
+ * m4/roundf.m4: Likewise for roundf.
+ * m4/roundl.m4: Likewise for roundl.
+ * lib/math.in.h: Undefine roundf, round, roundl before defining
+ their replacements, to allow for hypothetical systems where these
+ may be defined as macros but not available in libraries.
+
+2007-10-27 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi: Invoke @firstparagraphindent.
+ * doc/gnulib-tool.texi (Simple update): Mention possible incompatible
+ changes in gnulib.
+ (Source changes): New section.
+
+2007-10-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/gnulib-common.m4 (AC_C_RESTRICT): New overriding definition,
+ borrowed from autoconf.
+
+2007-10-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/strerror.c (rpl_strerror): Return "Unknown error ..." also if
+ strerror returned the empty string. Needed on HP-UX 11.00.
+
+2007-10-24 Micah Cowan <micah@cowan.name>
+
+ Remove vestiges of cvs-gnulib-checkout process. Now we use git.
+ * build-aux/bootstrap: Remove support for now-unnecessary option,
+ --cvs-user, and envvars CVS_USER, CVS_RSH.
+
+2007-10-24 Jim Meyering <meyering@redhat.com>
+
+ Avoid diagnostics from sha1sum when there is no cached checksum.
+ * build-aux/bootstrap (update_po_files): Skip the sha1sum check
+ if the po.s1 file hasn't been created yet.
+
+ * build-aux/bootstrap: Sync from coreutils:
+ 2007-10-24 Jim Meyering <meyering@redhat.com>
+ Get gnulib from the git repository, not from an obsolete cvs one.
+ * build-aux/bootstrap: Suggestion from Micah Cowan.
+ 2007-10-04 Jim Meyering <jim@meyering.net>
+ * build-aux/bootstrap (slurp): Adapt to _.h -> .in.h name change.
+ (update_po_files): Work also when there are no .po files in po/.
+
+2007-10-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * README: Append ".git" to git and cg examples.
+ Problem reported by Benoit Sigoure.
+
+2007-10-23 Micah Cowan <micah@cowan.name>
+
+ * users.txt: Add wget.
+
+2007-10-23 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Fix linking of some unistdio tests on FreeBSD.
+ * modules/unistdio/u16-vsnprintf-tests
+ (test_u16_vsprintf1_LDADD): Add @LIBINTL@.
+ * modules/unistdio/u16-vsprintf-tests
+ (test_u16_vsnprintf1_LDADD): Likewise.
+ * modules/unistdio/u32-vsnprintf-tests
+ (test_u32_vsnprintf1_LDADD): Likewise.
+ * modules/unistdio/u32-vsprintf-tests
+ (test_u32_vsprintf1_LDADD): Likewise.
+ * modules/unistdio/u8-vsnprintf-tests
+ (test_u8_vsnprintf1_LDADD): Likewise.
+ * modules/unistdio/u8-vsprintf-tests
+ (test_u8_vsprintf1_LDADD): Likewise.
+ * modules/unistdio/ulc-vsnprintf-tests
+ (test_ulc_vsnprintf1_LDADD): Likewise.
+ * modules/unistdio/ulc-vsprintf-tests
+ (test_ulc_vsprintf1_LDADD): Likewise.
+
+ Fix linking of some uniconv tests on FreeBSD.
+ * modules/uniconv/u16-conv-from-enc-tests
+ (test_u16_conv_from_enc_LDADD): Link $(LDADD) before @LIBICONV@.
+ * modules/uniconv/u16-conv-to-enc-tests
+ (test_u16_conv_to_enc_LDADD): Likewise.
+ * modules/uniconv/u16-strconv-from-enc-tests
+ (test_u16_strconv_from_enc_LDADD): Likewise.
+ * modules/uniconv/u16-strconv-to-enc-tests
+ (test_u16_strconv_to_enc_LDADD): Likewise.
+ * modules/uniconv/u32-conv-from-enc-tests
+ (test_u32_conv_from_enc_LDADD): Likewise.
+ * modules/uniconv/u32-conv-to-enc-tests
+ (test_u32_conv_to_enc_LDADD): Likewise.
+ * modules/uniconv/u32-strconv-from-enc-tests
+ (test_u32_strconv_from_enc_LDADD): Likewise.
+ * modules/uniconv/u32-strconv-to-enc-tests
+ (test_u32_strconv_to_enc_LDADD): Likewise.
+ * modules/uniconv/u8-conv-from-enc-tests
+ (test_u8_conv_from_enc_LDADD): Likewise.
+ * modules/uniconv/u8-conv-to-enc-tests
+ (test_u8_conv_to_enc_LDADD): Likewise.
+ * modules/uniconv/u8-strconv-from-enc-tests
+ (test_u8_strconv_from_enc_LDADD): Likewise.
+ * modules/uniconv/u8-strconv-to-enc-tests
+ (test_u8_strconv_to_enc_LDADD): Likewise.
+
+2007-10-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint.in.h: Add check that intmax_t and uintmax_t have the same
+ size.
+
+2007-10-22 Eric Blake <ebb9@byu.net>
+
+ Tweak x*printf documentation.
+ * lib/xprintf.c (xprintf, xvprintf, xfprintf, xvfprintf): Adjust
+ variable name and comments.
+ Suggested by Bruno Haible.
+
+2007-10-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/acl.c (copy_acl): Fix file name in comment.
+
+2007-10-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix Tru64 problem with stdbool.h.
+ * lib/stdbool.in.h (false, true):
+ [! (defined __cplusplus || defined __BEOS__) && !defined __GNUC__]:
+ Don't declare as an enum in this situation; it runs afoul of Tru64.
+ Problem reported by Steven M. Schweda in
+ <http://lists.gnu.org/archive/html/bug-autoconf/2007-10/msg00019.html>.
+
+2007-10-22 Eric Blake <ebb9@byu.net>
+
+ Also wrap vf?printf.
+ * lib/xprintf.h (xvprintf, xvfprintf): New declarations.
+ * lib/xprintf.c (xprintf, xfprintf): Work for C89.
+ (xvprintf, xvfprintf): New functions.
+
+2007-10-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/fstrcmp-tests (test_fstrcmp_LDADD): New, add
+ @LIBINTL@ for FreeBSD 6.2, $(LIBTHREAD) for AIX 4.3.3.
+
+ * lib/uniconv/u16-conv-to-enc.c (U_MBLEN): Define.
+ * lib/uniconv/u32-conv-to-enc.c (U_MBLEN): Likewise.
+
+2007-10-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/acl.c (copy_acl): Adjust to IRIX 6.5. Problem reported
+ by Bruno Haible.
+
+2007-10-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/getloadavg.c
+ [defined (__osf__) && (defined (__alpha) || defined (__alpha__)]:
+ Undef `sys' after including sys/table.h, for Tru64 4.0D.
+
+ * tests/test-i-ring.c: Work for C89.
+
+2007-10-22 Bruno Haible <bruno@clisp.org>
+
+ * m4/ulonglong.m4 (AC_TYPE_UNSIGNED_LONG_LONG_INT): Use -1ull, not
+ -1u, in preprocessor expression, so that we don't test for the bug
+ in HP-UX 11.00 cpp. Testing for this bug caused problems; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-10/msg00329.html>.
+
+2007-10-22 Eric Blake <ebb9@byu.net>
+
+ * tests/test-yesno.sh: Silence stderr during test.
+
+2007-10-22 Simon Josefsson <simon@josefsson.org>
+
+ * modules/crypto/gc-camellia: New file.
+
+ * m4/gc-camellia.m4: New file.
+
+ * lib/gc-libgcrypt.c (gc_cipher_open): Support Camellia.
+
+ * lib/gc.h (enum Gc_cipher): Add GC_CAMELLIA128, GC_CAMELLIA256.
+
+2007-10-22 Simon Josefsson <simon@josefsson.org>
+
+ * build-aux/maint.mk (gzip_rsyncable): Don't fail if gzip sends
+ --help to stdout. Reported by sms@antinode.org (Steven
+ M. Schweda).
+
+2007-10-22 Simon Josefsson <simon@josefsson.org>
+
+ * users.txt: Fix link to libksba.
+
+2007-10-21 Ben Pfaff <blp@gnu.org>
+
+ * modules/roundf-tests: Add dependency on floorf, ceilf to allow
+ round.c roundf implementation that depends on floorf and ceilf to
+ be tested unconditionally.
+
+2007-10-21 Ben Pfaff <blp@gnu.org>
+
+ * m4/check-libm-func.m4: Removed.
+ * m4/check-math-lib.m4: New file.
+ * m4/round.m4: Rewrite to use gl_CHECK_MATH_LIB.
+ * m4/roundf.m4: Ditto, and fix lack of HAVE_DECL_ROUNDF
+ definition and lack of AC_LIBOBJ([roundf]).
+ * m4/roundl.m4: Ditto, and similarly for roundl.
+ * modules/round: Reference new m4 file.
+ * modules/roundf: Ditto.
+ * modules/roundl: Ditto.
+ * tests/test-round2.c (main): Use ROUND instead of round.
+ Bug report from Bruno Haible.
+
+2007-10-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/printf-parse.c: Don't assume <stdint.h> exists in IN_LIBASPRINTF
+ context.
+
+2007-10-21 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-wcwidth.c (main): Allow negative result for some control
+ characters.
+
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Check also the width of U+200B.
+ Needed on OSF/1 5.1.
+
+2007-10-21 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-floorf1.c: Include isnanf.h.
+ (main): Use isnanf() instead of isnan().
+ * tests/test-ceilf1.c: Include isnanf.h.
+ (main): Use isnanf() instead of isnan().
+ * tests/test-truncf1.c: Include isnanf.h.
+ (main): Use isnanf() instead of isnan().
+ * tests/test-roundf1.c: Include isnanf.h.
+ (main): Use isnanf() instead of isnan().
+
+2007-10-21 Eric Blake <ebb9@byu.net>
+
+ * users.txt: Update URL for m4.
+
+2007-10-21 Bruno Haible <bruno@clisp.org>
+
+ * users.txt: Add clisp. Update URLs to Simon Josefsson's projects.
+
+2007-10-21 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_megatestdir): Determine the cvsdate from
+ Git's management files if the CVS files are not present.
+
+2007-10-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/count-one-bits.h (COUNT_ONE_BITS): Use the builtin also for
+ gcc-3.4.x.
+
+2007-10-20 Ben Pfaff <blp@gnu.org>
+
+ * lib/math.in.h: Declare round, roundf, roundl if we are providing
+ implementations.
+ * m4/math_h.m4: New substitutions for round, roundf, roundl modules.
+ * lib/round.c: New file.
+ * lib/roundf.c: New file.
+ * lib/roundl.c: New file.
+ * m4/round.m4: New file.
+ * m4/roundf.m4: New file.
+ * m4/roundl.m4: New file.
+ * m4/check-libm-func-m4: New file.
+ * modules/math: Replace round, roundf, roundl related @VARS@ in
+ math.in.h.
+ * modules/round: New file.
+ * modules/round-tests: New file.
+ * modules/roundf: New file.
+ * modules/roundf-tests: New file.
+ * modules/roundl: New file.
+ * modules/roundl-tests: New file.
+ * tests/test-round1.c: New file.
+ * tests/test-round2.c: New file.
+ * tests/test-roundf1.c: New file.
+ * tests/test-roundf2.c: New file.
+ * tests/test-roundl.c: New file.
+ * doc/functions/round.texi: Mention round module.
+ * doc/functions/roundf.texi: Mention roundf module.
+ * doc/functions/roundl.texi: Mention roundl module.
+ * MODULES.html.sh: Mention new modules.
+ Thanks to Bruno Haible for suggestions.
+
+2007-10-20 Jim Meyering <meyering@redhat.com>
+
+ * lib/xprintf.c: Include <config.h> unconditionally.
+
+ Change xprintf's license to GPL.
+ * modules/xprintf (License): s/LGPL/GPL/, since this module
+ depends on modules (exit and exitfail) which are GPL.
+ Suggestion from Bruno Haible.
+
+ xprintf fixes.
+ * lib/xprintf.c (xprintf, xfprintf): Use va_end.
+ Use a clearer diagnostic.
+ Patch from Bruno Haible.
+
+2007-10-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Don't report overflow if the available
+ length is INT_MAX and sizeof (DCHAR_T) > sizeof (TCHAR_T).
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2007-10-20 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-floorf2.c (correct_result_p): Don't rely on excess
+ precision in the comparison result > x - 1 or similar.
+ * tests/test-ceilf2.c (correct_result_p): Likewise.
+ * tests/test-truncf2.c (correct_result_p): Likewise.
+ * tests/test-trunc2.c (correct_result_p): Likewise.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2007-10-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/ceil: New file.
+ * m4/ceil.m4: New file.
+ * doc/functions/ceil.texi: Mention the 'ceil' module.
+
+2007-10-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/floor: New file.
+ * m4/floor.m4: New file.
+ * doc/functions/floor.texi: Mention the 'floor' module.
+
+2007-10-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/ceilf-tests (Depends-on): Add fprintf-posix. Needed for use
+ of %a.
+ * modules/floorf-tests (Depends-on): Likewise.
+ * modules/truncf-tests (Depends-on): Likewise.
+ * modules/trunc-tests (Depends-on): Likewise.
+ Reported by Ben Pfaff.
+
+2007-10-19 Jim Meyering <meyering@redhat.com>
+
+ * lib/xprintf.c (xprintf, xfprintf): Test err < 0, not just "err".
+ Don't bother testing specific errno values. Just test ferror.
+
+ New module: xprintf
+ * modules/xprintf, lib/xprintf.c, lib/xprintf.h: New files.
+
+2007-10-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/csharpexec (Makefile.am): Use @FOO@ syntax instead of $(FOO)
+ syntax.
+ * modules/javaexec (Makefile.am): Likewise.
+ * modules/relocatable-prog (Makefile.am): Likewise.
+ Suggested by Jim Meyering.
+
+2007-10-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Don't use %n on glibc >= 2.3 systems.
+ Reported by Jim Meyering.
+
+2007-10-18 Eric Blake <ebb9@byu.net>
+
+ * modules/filenamecat-tests (Makefile.am): Link against -lintl.
+
+2007-10-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N): Put
+ the format string into writable memory. Needed in Fortify conditions.
+
+2007-10-18 Colin Watson <cjwatson@debian.org> (tiny change)
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/trim.c: Include config.h unconditionally. Include trim.h always.
+ Include ctype.h always. Include stdlib.h, not mbuiter.h, for MB_CUR_MAX.
+ * modules/trim (Depends-on): Add mbchar.
+ (configure.ac): Add gl_FUNC_MBRTOWC.
+ (Makefile.am): Augment lib_SOURCES.
+
+2007-10-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Modify glob.c to use fstatat and dirfd, to simplify it.
+ Suggested by Eric Blake.
+ * lib/glob.c (__fxstatat64) [!_LIBC]: New macro.
+ Don't include <stdbool.h>; not used.
+ (link_exists2_p, glob_in_dir) [!_LIBC]: No longer a special case.
+ (link_exists_p): Simplify implementation, since we can now assume
+ dirfd and fstatat.
+ * modules/glob (Depends-on): Add dirfd, openat. Remove stdbool.
+
+2007-10-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_get_dependencies): Fix sed script to
+ match only tests.
+
+2007-10-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-fr.m4 (gt_LOCALE_FR, gt_LOCALE_FR_UTF8): On Cygwin, don't
+ allow locale names without encoding suffix.
+ * m4/locale-tr.m4 (gt_LOCALE_TR_UTF8): Likewise.
+ * m4/locale-zh.m4 (gt_LOCALE_ZH_CN): Likewise.
+
+2007-10-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/getcwd.c (__getcwd): Define with explicit rpl_ prefix.
+ * lib/getgroups.c (getgroups): Likewise.
+ * lib/gettimeofday.c (localtime, gmtime, tzset): Likewise.
+
+2007-10-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/absolute-header (License): Change from LGPL to LGPLv2+.
+ * modules/malloc-posix (License): Likewise.
+ * modules/realloc-posix (License): Likewise.
+ * modules/calloc-posix (License): Likewise.
+ * modules/intprops (License): Change from GPL to LGPL, with
+ Paul Eggert's approval.
+
+2007-10-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge glibc changes into lib/glob.c.
+
+ * lib/glob.c (glob_in_dir): Sync with glibc/posix/glob.c, dated
+ 2007-10-15 04:59:03 UTC. Here are the changes:
+
+ 2007-10-14 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/glob.c: Reimplement link_exists_p to use fstatat64.
+
+ * lib/glob.c: Add some branch prediction throughout.
+
+ 2007-10-07 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #5103]
+ * lib/glob.c (glob): Recognize patterns starting \/.
+
+ 2007-02-14 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #3996]
+ * lib/glob.c (attribute_hidden): Define if not defined.
+ (glob): Unescape dirname, filename or username when needed and not
+ GLOB_NOESCAPE. Handle \/ correctly. Handle GLOB_MARK if filename
+ is NULL. Handle unescaped [ in pattern without closing ].
+ Don't pass GLOB_CHECK down to recursive glob for directories.
+ (__glob_pattern_type): New function.
+ (__glob_pattern_p): Implement using __glob_pattern_type.
+ (glob_in_dir): Handle GLOB_NOCHECK patterns containing no meta
+ characters and backslashes if not GLOB_NOESCAPE or unterminated [.
+ Remove unreachable code.
+
+ 2006-09-30 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/glob.c (glob_in_dir): Add some comments and asserts to
+ explain why there are no leaks.
+
+ 2006-09-25 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #3253]
+ * lib/glob.c (glob_in_dir): Don't alloca one struct globlink at a
+ time, rather allocate increasingly bigger arrays of pointers, if
+ possible with alloca, if too large with malloc.
+
+2007-10-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ Check for 64-bit int errors in HP-UX 10.20 preprocessor.
+ Problem reported by H.Merijn Brand in
+ <http://lists.gnu.org/archive/html/bug-tar/2007-10/msg00018.html>.
+ * m4/longlong.m4 (AC_TYPE_LONG_LONG_INT): Check preprocessor too.
+ * m4/ulonglong.m4 (AC_TYPE_UNSIGNED_LONG_LONG_INT): Likewise.
+
+2007-10-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/fchdir.c (close, open, closedir, opendir, dup, dup2): Define
+ with explicit rpl_ prefix.
+ * lib/fopen.c (fopen): Likewise.
+ * lib/freopen.c (freopen): Likewise.
+ * lib/iconv.c (iconv): Likewise.
+ * lib/iconv_close.c (iconv_close): Likewise.
+
+2007-10-15 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/iconv_open (gl_FUNC_ICONV_OPEN_UTF): Fix cache variable name.
+
+2007-10-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO, gl_PREREQ_GETADDRINFO): Use
+ <stddef.h> instead of <stdlib.h> since we only need NULL.
+ Reported by Ben Pfaff <blp@cs.stanford.edu>.
+
+2007-10-15 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (Initial import): Swap order of -I directives.
+ Replace paragraph talking about LIBOBJS.
+ Reported by Colin Watson <cjwatson@debian.org>.
+
+2007-10-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO, gl_PREREQ_GETADDRINFO): Include
+ <stdlib.h> before using NULL.
+
+2007-10-15 Simon Josefsson <simon@josefsson.org>
+
+ * m4/getaddrinfo.m4: Use NULL rather than 0 for pointers.
+ Reported by Albert Chin <china@thewrittenword.com>.
+
+2007-10-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/iconv_open-utf-tests: New file.
+ * tests/test-iconv-utf.c: New file.
+
+ Enhance iconv_open to support UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE.
+ * modules/iconv_open-utf: New file.
+ * lib/iconv.in.h (_ICONV_UTF8_UTF*, _ICONV_UTF*_UTF8): New macros.
+ (iconv, iconv_close): New declarations.
+ * lib/iconv_open.c: Include c-strcase.h. Don't require ICONV_FLAVOR to
+ be defined.
+ (iconv_open): Add special handling of conversion between UTF-8 and
+ UTF-{16,32}{BE,LE}.
+ * lib/iconv.c: New file, incorporating code from GNU libiconv 1.11.
+ * lib/iconv_close.c: New file.
+ * m4/iconv_open.m4 (gl_REPLACE_ICONV_OPEN): New macro, extracted from
+ gl_FUNC_ICONV_OPEN.
+ (gl_FUNC_ICONV_OPEN): Use it.
+ (gl_FUNC_ICONV_OPEN_UTF): New macro.
+ * m4/iconv_h.m4 (gl_ICONV_H_DEFAULTS): Initialize also REPLACE_ICONV
+ and REPLACE_ICONV_UTF.
+ * modules/iconv_open (Depends-on): Add c-strcase.
+ (Makefile.am): Substitute also REPLACE_ICONV, REPLACE_ICONV_UTF,
+ ICONV_CONST.
+ * doc/functions/iconv_open.texi: Mention the iconv_open-utf module.
+
+2007-10-13 Albert Chin <china@thewrittenword.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Perform the test for getaddrinfo
+ through a link check that includes <netdb.h>. Needed for OSF/1 5.1.
+
+2007-10-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/argp-fmtstream.h (ARGP_FS_EI): If __GNUC_STDC_INLINE__ is
+ defined, use the ISO C99 inline semantics.
+ * lib/argp.h (ARGP_EI): Likewise.
+
+2007-10-13 Bruno Haible <bruno@clisp.org>
+
+ Handle 'inline' change in gcc 4.3.0.
+ * lib/argp-fmtstream.h (argp_fmtstream_putc, argp_fmtstream_puts,
+ argp_fmtstream_write, argp_fmtstream_set_lmargin,
+ argp_fmtstream_set_rmargin, argp_fmtstream_set_wmargin,
+ argp_fmtstream_point): Disable 'extern' declaration if the function
+ definition is going to be provided inline.
+ (ARGP_FS_EI): If __GNUC_STDC_INLINE__ is defined, use the GNU C inline
+ semantics, not the ISO C99 inline semantics.
+ * lib/argp.h (argp_usage, _option_is_short, _option_is_end): Disable
+ 'extern' declaration if the function definition is going to be provided
+ inline.
+ (ARGP_EI): Don't assume GNU C. If __GNUC_STDC_INLINE__ is defined, use
+ the GNU C inline semantics, not the ISO C99 inline semantics. With
+ GCC 4.2, avoid a warning.
+
+2007-10-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/freading.h (freading): Enable the use of __freading for
+ glibc >= 2.7.
+ * lib/freading.c (freading): Likewise.
+
+2007-10-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argp-fmtstream.h (ARGP_FS_EI): Work around GCC 4.2.1 diagnostic
+ "warning: C99 inline functions are not supported; using GNU89".
+
+2007-10-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/ceil.c (FUNC): Avoid rounding errors for values near a power
+ of 2.
+ * tests/test-ceilf2.c: New file.
+ * modules/ceilf-tests: (Files, Depends-on, Makefile.am): Add new test.
+
+ * tests/test-ceilf1.c: Renamed from tests/test-ceilf.c.
+ * modules/ceilf-tests: Update.
+
+2007-10-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/floor.c (FUNC): Avoid rounding errors for values near a power
+ of 2.
+ * tests/test-floorf2.c: New file.
+ * modules/floorf-tests: (Files, Depends-on, Makefile.am): Add new test.
+
+ * tests/test-floorf1.c: Renamed from tests/test-floorf.c.
+ * modules/floorf-tests: Update.
+
+2007-10-12 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-trunc2.c: New file.
+ * modules/trunc-tests: (Files, Depends-on, Makefile.am): Add new test.
+
+ * tests/test-trunc1.c: Renamed from tests/test-trunc.c.
+ * modules/trunc-tests: Update.
+
+2007-10-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/trunc.c (FUNC): Avoid rounding errors for values near a power
+ of 2.
+ * tests/test-truncf2.c: New file.
+ * modules/truncf-tests: (Files, Depends-on, Makefile.am): Add new test.
+
+ * tests/test-truncf1.c: Renamed from tests/test-truncf.c.
+ * modules/truncf-tests: Update.
+
+2007-10-11 Eric Blake <ebb9@byu.net>
+
+ Don't claim strerror is broken on Interix.
+ * doc/functions/strerror.texi (strerror): Known broken systems are
+ now Solaris 8, and not Interix.
+ * m4/strerror.m4 (gl_FUNC_STRERROR_SEPARATE): No longer filter out
+ Interix on cross-compile.
+ Reported by Martin Koeppe in
+ http://lists.gnu.org/archive/html/bug-gnulib/2007-10/msg00005.html.
+
+2007-10-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/i-ring-tests: New file.
+ * tests/test-i-ring.c: Renamed from lib/i-ring-test.c. Use ASSERT
+ instead of assert.
+
+2007-10-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/filenamecat-tests: New file.
+ * tests/test-filenamecat.c: New file, extracted from lib/filenamecat.c.
+ * lib/filenamecat.c: Remove test code.
+
+2007-10-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ Simplify and modernize strerror substitute, partly to fix Solaris 8 bug.
+
+ * lib/strerror.c: Include <string.h> always, to test interface,
+ and to remove the need for the dummy.
+ Include intprops.h to compute width instead of doing it ourselves
+ and missing a CHAR_BIT declaration, which broke tar 1.19 on Solaris 8.
+ (strerror): Define it to return NULL if there's no system strerror.
+ (rpl_strerror): Use INT_STRLEN_BOUND to compute bound.
+ Omit !HAVE_STRERROR code. We don't need to worry about supporting
+ ancient pre-strerror Unix systems well any more. Saying "unknown
+ system error" is enough.
+ * lib/string.in.h (strerror): Simplify the ifdef to reflect the
+ simpler strerror.c implementation.
+ * m4/strerror.m4 (gl_FUNC_STRERROR_SEPARATE, gl_PREREQ_STDERROR):
+ Simplify the tests to reflect the simpler strerror implementation.
+ * modules/strerror (Depends-on): Add intprops.
+
+2007-10-09 Eric Blake <ebb9@byu.net>
+
+ Silence test-fpending.
+ * modules/fpending-tests (Files): Add wrapper script.
+ * tests/test-fpending.sh: New file.
+
+2007-10-09 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (func_module): Don't create a hyperlink for
+ function names like 'printf_frexp'.
+ (Misc): Add crc, memxor.
+ (Characteristics of floating types): New section.
+ (Mathematics): Add ceilf, ceill, floorf, floorl, frexpl-nolibm,
+ isnanf-nolibm, signbit, trunc, truncf, truncl.
+ (Enhancements for ISO C 99 functions): New subsection Input/output.
+ (Support for systems lacking POSIX:2001): Add arpa_inet, calloc-posix,
+ fcntl, fopen, freopen, fseek, fseeko, ftell, ftello, iconv_open,
+ locale, malloc-posix, netinet_in, open, realloc-posix, signal, sleep.
+ (Compatibility checks for POSIX:2001 functions): Add clock-time.
+ (Enhancements for POSIX:2001 functions): Add chdir-long.
+ (File system functions): Add areadlink, chdir-safer, read-file.
+ Remove cycle-check.
+ (File system as inode set): New section.
+ (Date and time): Add gethrxtime.
+ (Multithreading): Add openmp.
+ (Internationalization functions): Add localename.
+ (Unicode string functions): Add unistr/u*-mbsnlen.
+ (Support for maintaining and releasing projects): Add git-version-gen.
+ (Lone files): Remove directories.
+
+2007-10-08 Ben Pfaff <blp@gnu.org>
+
+ * lib/xmalloca.h: Fix typo in comment.
+
+2007-10-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xnanosleep.c (xnanosleep): Don't assume GCC 4.3.0 behavior
+ when avoiding problems with integer overflow. Use a portable test
+ instead.
+
+2007-10-08 Simon Josefsson <simon@josefsson.org>
+
+ * modules/dummy (License): Change to LGPLv2+.
+ * modules/float (License): Likewise
+ * modules/realloc (License): Likewise
+ * modules/stdlib (License): Likewise
+
+2007-10-07 Bruno Haible <bruno@clisp.org>
+
+ * trunc.c (TWO_MANT_DIG): Change type to DOUBLE.
+ * floor.c (TWO_MANT_DIG): Likewise.
+ * ceil.c (TWO_MANT_DIG): Likewise.
+ Reported by Ben Pfaff.
+
+2007-10-07 Bruno Haible <bruno@clisp.org>
+
+ Avoid gcc warnings "declaration of 'exp' shadows a global declaration".
+ * lib/math.in.h (frexp, frexpl): Change parameter name to 'expptr'.
+ * lib/frexp.c (FUNC): Likewise.
+ * lib/printf-frexp.h (printf_frexp): Likewise.
+ * lib/printf-frexpl.h (printf_frexpl): Likewise.
+ * lib/printf-frexp.c (FUNC): Likewise.
+ Suggested by Jim Meyering.
+
+2007-10-07 Jim Meyering <meyering@redhat.com>
+
+ Make xnanosleep's integer overflow test more robust.
+ * lib/xnanosleep.c (xnanosleep): Declare a temporary to be "volatile",
+ so that gcc-4.3.0 doesn't optimize away this test for overflow.
+
+2007-10-07 Bruno Haible <bruno@clisp.org>
+
+ * NEWS: Mention the license change.
+
+ * doc/gnulib-intro.texi (Copyright): Update the meaning of the license
+ abbreviations in the modules files.
+
+ Change copyright notice from GPLv2+ to GPLv3+.
+ * README: Change copyright notice.
+ * MODULES.html.sh: Likewise.
+ * build-aux/bootstrap.conf: Likewise.
+ * build-aux/config.libpath: Likewise.
+ * build-aux/csharpcomp.sh.in: Likewise.
+ * build-aux/csharpexec.sh.in: Likewise.
+ * build-aux/install-reloc: Likewise.
+ * build-aux/javacomp.sh.in: Likewise.
+ * build-aux/javaexec.sh.in: Likewise.
+ * build-aux/ldd.sh.in: Likewise.
+ * build-aux/reloc-ldflags: Likewise.
+ * build-aux/relocatable.sh.in: Likewise.
+ * build-aux/x-to-1.in: Likewise.
+ * check-module: Likewise.
+ * config/srclistvars.sh: Likewise.
+ * gnulib-tool: Likewise.
+ * lib/acl-internal.h: Likewise.
+ * lib/acl.c: Likewise.
+ * lib/acl.h: Likewise.
+ * lib/acl_entries.c: Likewise.
+ * lib/areadlink-with-size.c: Likewise.
+ * lib/areadlink.c: Likewise.
+ * lib/areadlink.h: Likewise.
+ * lib/argmatch.c: Likewise.
+ * lib/argmatch.h: Likewise.
+ * lib/argp-ba.c: Likewise.
+ * lib/argp-eexst.c: Likewise.
+ * lib/argp-fmtstream.c: Likewise.
+ * lib/argp-fmtstream.h: Likewise.
+ * lib/argp-fs-xinl.c: Likewise.
+ * lib/argp-help.c: Likewise.
+ * lib/argp-namefrob.h: Likewise.
+ * lib/argp-parse.c: Likewise.
+ * lib/argp-pin.c: Likewise.
+ * lib/argp-pv.c: Likewise.
+ * lib/argp-pvh.c: Likewise.
+ * lib/argp-xinl.c: Likewise.
+ * lib/argp.h: Likewise.
+ * lib/at-func.c: Likewise.
+ * lib/atanl.c: Likewise.
+ * lib/backupfile.c: Likewise.
+ * lib/backupfile.h: Likewise.
+ * lib/basename.c: Likewise.
+ * lib/binary-io.h: Likewise.
+ * lib/byteswap.in.h: Likewise.
+ * lib/c-stack.c: Likewise.
+ * lib/c-stack.h: Likewise.
+ * lib/c-strcasestr.c: Likewise.
+ * lib/c-strcasestr.h: Likewise.
+ * lib/c-strstr.c: Likewise.
+ * lib/c-strstr.h: Likewise.
+ * lib/c-strtod.c: Likewise.
+ * lib/calloc.c: Likewise.
+ * lib/canon-host.c: Likewise.
+ * lib/canon-host.h: Likewise.
+ * lib/canonicalize-lgpl.c: Likewise.
+ * lib/canonicalize.c: Likewise.
+ * lib/canonicalize.h: Likewise.
+ * lib/ceil.c: Likewise.
+ * lib/ceilf.c: Likewise.
+ * lib/ceill.c: Likewise.
+ * lib/chdir-long.c: Likewise.
+ * lib/chdir-long.h: Likewise.
+ * lib/chdir-safer.c: Likewise.
+ * lib/chdir-safer.h: Likewise.
+ * lib/chown.c: Likewise.
+ * lib/classpath.c: Likewise.
+ * lib/classpath.h: Likewise.
+ * lib/clean-temp.c: Likewise.
+ * lib/clean-temp.h: Likewise.
+ * lib/cloexec.c: Likewise.
+ * lib/close-stream.c: Likewise.
+ * lib/closein.c: Likewise.
+ * lib/closein.h: Likewise.
+ * lib/closeout.c: Likewise.
+ * lib/closeout.h: Likewise.
+ * lib/concat-filename.c: Likewise.
+ * lib/copy-file.c: Likewise.
+ * lib/copy-file.h: Likewise.
+ * lib/count-one-bits.h: Likewise.
+ * lib/crc.c: Likewise.
+ * lib/crc.h: Likewise.
+ * lib/creat-safer.c: Likewise.
+ * lib/csharpcomp.c: Likewise.
+ * lib/csharpcomp.h: Likewise.
+ * lib/csharpexec.c: Likewise.
+ * lib/csharpexec.h: Likewise.
+ * lib/cycle-check.c: Likewise.
+ * lib/cycle-check.h: Likewise.
+ * lib/diacrit.c: Likewise.
+ * lib/diacrit.h: Likewise.
+ * lib/diffseq.h: Likewise.
+ * lib/dirchownmod.c: Likewise.
+ * lib/dirent.in.h: Likewise.
+ * lib/dirfd.c: Likewise.
+ * lib/dirfd.h: Likewise.
+ * lib/dirname.c: Likewise.
+ * lib/dirname.h: Likewise.
+ * lib/dummy.c: Likewise.
+ * lib/dup-safer.c: Likewise.
+ * lib/dup2.c: Likewise.
+ * lib/eealloc.h: Likewise.
+ * lib/error.c: Likewise.
+ * lib/error.h: Likewise.
+ * lib/euidaccess.c: Likewise.
+ * lib/exclude.c: Likewise.
+ * lib/exclude.h: Likewise.
+ * lib/execute.c: Likewise.
+ * lib/execute.h: Likewise.
+ * lib/exitfail.c: Likewise.
+ * lib/exitfail.h: Likewise.
+ * lib/expl.c: Likewise.
+ * lib/fatal-signal.c: Likewise.
+ * lib/fatal-signal.h: Likewise.
+ * lib/fbufmode.c: Likewise.
+ * lib/fbufmode.h: Likewise.
+ * lib/fchdir.c: Likewise.
+ * lib/fchmodat.c: Likewise.
+ * lib/fchownat.c: Likewise.
+ * lib/fcntl--.h: Likewise.
+ * lib/fcntl-safer.h: Likewise.
+ * lib/fcntl.in.h: Likewise.
+ * lib/fd-safer.c: Likewise.
+ * lib/fflush.c: Likewise.
+ * lib/file-has-acl.c: Likewise.
+ * lib/file-set.c: Likewise.
+ * lib/file-type.c: Likewise.
+ * lib/file-type.h: Likewise.
+ * lib/fileblocks.c: Likewise.
+ * lib/filemode.c: Likewise.
+ * lib/filemode.h: Likewise.
+ * lib/filename.h: Likewise.
+ * lib/filenamecat.c: Likewise.
+ * lib/filenamecat.h: Likewise.
+ * lib/findprog.c: Likewise.
+ * lib/findprog.h: Likewise.
+ * lib/float.in.h: Likewise.
+ * lib/floor.c: Likewise.
+ * lib/floorf.c: Likewise.
+ * lib/floorl.c: Likewise.
+ * lib/fopen-safer.c: Likewise.
+ * lib/fopen.c: Likewise.
+ * lib/fpending.c: Likewise.
+ * lib/fpending.h: Likewise.
+ * lib/fprintf.c: Likewise.
+ * lib/fprintftime.h: Likewise.
+ * lib/fpucw.h: Likewise.
+ * lib/fpurge.c: Likewise.
+ * lib/fpurge.h: Likewise.
+ * lib/freadable.c: Likewise.
+ * lib/freadable.h: Likewise.
+ * lib/freadahead.c: Likewise.
+ * lib/freadahead.h: Likewise.
+ * lib/freading.c: Likewise.
+ * lib/freading.h: Likewise.
+ * lib/free.c: Likewise.
+ * lib/freopen.c: Likewise.
+ * lib/frexp.c: Likewise.
+ * lib/frexpl.c: Likewise.
+ * lib/fseek.c: Likewise.
+ * lib/fseterr.c: Likewise.
+ * lib/fseterr.h: Likewise.
+ * lib/fstatat.c: Likewise.
+ * lib/fstrcmp.c: Likewise.
+ * lib/fstrcmp.h: Likewise.
+ * lib/fsusage.c: Likewise.
+ * lib/fsusage.h: Likewise.
+ * lib/ftell.c: Likewise.
+ * lib/ftello.c: Likewise.
+ * lib/fts-cycle.c: Likewise.
+ * lib/fts.c: Likewise.
+ * lib/fts_.h: Likewise.
+ * lib/full-read.c: Likewise.
+ * lib/full-read.h: Likewise.
+ * lib/full-write.c: Likewise.
+ * lib/full-write.h: Likewise.
+ * lib/fwritable.c: Likewise.
+ * lib/fwritable.h: Likewise.
+ * lib/fwriteerror.c: Likewise.
+ * lib/fwriteerror.h: Likewise.
+ * lib/fwriting.c: Likewise.
+ * lib/fwriting.h: Likewise.
+ * lib/gcd.c: Likewise.
+ * lib/gcd.h: Likewise.
+ * lib/getcwd.c: Likewise.
+ * lib/getdate.h: Likewise.
+ * lib/getdate.y: Likewise.
+ * lib/getdomainname.c: Likewise.
+ * lib/getdomainname.h: Likewise.
+ * lib/getgroups.c: Likewise.
+ * lib/gethostname.c: Likewise.
+ * lib/gethrxtime.c: Likewise.
+ * lib/gethrxtime.h: Likewise.
+ * lib/getloadavg.c: Likewise.
+ * lib/getndelim2.c: Likewise.
+ * lib/getndelim2.h: Likewise.
+ * lib/getnline.c: Likewise.
+ * lib/getnline.h: Likewise.
+ * lib/getopt.c: Likewise.
+ * lib/getopt.in.h: Likewise.
+ * lib/getopt1.c: Likewise.
+ * lib/getopt_int.h: Likewise.
+ * lib/getpagesize.h: Likewise.
+ * lib/getsubopt.c: Likewise.
+ * lib/gettime.c: Likewise.
+ * lib/getugroups.c: Likewise.
+ * lib/getugroups.h: Likewise.
+ * lib/getusershell.c: Likewise.
+ * lib/gl_anyavltree_list1.h: Likewise.
+ * lib/gl_anyavltree_list2.h: Likewise.
+ * lib/gl_anyhash_list1.h: Likewise.
+ * lib/gl_anyhash_list2.h: Likewise.
+ * lib/gl_anylinked_list1.h: Likewise.
+ * lib/gl_anylinked_list2.h: Likewise.
+ * lib/gl_anyrbtree_list1.h: Likewise.
+ * lib/gl_anyrbtree_list2.h: Likewise.
+ * lib/gl_anytree_list1.h: Likewise.
+ * lib/gl_anytree_list2.h: Likewise.
+ * lib/gl_anytree_oset.h: Likewise.
+ * lib/gl_anytreehash_list1.h: Likewise.
+ * lib/gl_anytreehash_list2.h: Likewise.
+ * lib/gl_array_list.c: Likewise.
+ * lib/gl_array_list.h: Likewise.
+ * lib/gl_array_oset.c: Likewise.
+ * lib/gl_array_oset.h: Likewise.
+ * lib/gl_avltree_list.c: Likewise.
+ * lib/gl_avltree_list.h: Likewise.
+ * lib/gl_avltree_oset.c: Likewise.
+ * lib/gl_avltree_oset.h: Likewise.
+ * lib/gl_avltreehash_list.c: Likewise.
+ * lib/gl_avltreehash_list.h: Likewise.
+ * lib/gl_carray_list.c: Likewise.
+ * lib/gl_carray_list.h: Likewise.
+ * lib/gl_linked_list.c: Likewise.
+ * lib/gl_linked_list.h: Likewise.
+ * lib/gl_linkedhash_list.c: Likewise.
+ * lib/gl_linkedhash_list.h: Likewise.
+ * lib/gl_list.c: Likewise.
+ * lib/gl_list.h: Likewise.
+ * lib/gl_oset.c: Likewise.
+ * lib/gl_oset.h: Likewise.
+ * lib/gl_rbtree_list.c: Likewise.
+ * lib/gl_rbtree_list.h: Likewise.
+ * lib/gl_rbtree_oset.c: Likewise.
+ * lib/gl_rbtree_oset.h: Likewise.
+ * lib/gl_rbtreehash_list.c: Likewise.
+ * lib/gl_rbtreehash_list.h: Likewise.
+ * lib/gl_sublist.c: Likewise.
+ * lib/gl_sublist.h: Likewise.
+ * lib/group-member.c: Likewise.
+ * lib/group-member.h: Likewise.
+ * lib/hard-locale.c: Likewise.
+ * lib/hard-locale.h: Likewise.
+ * lib/hash-pjw.c: Likewise.
+ * lib/hash-pjw.h: Likewise.
+ * lib/hash-triple.c: Likewise.
+ * lib/hash.c: Likewise.
+ * lib/hash.h: Likewise.
+ * lib/human.c: Likewise.
+ * lib/human.h: Likewise.
+ * lib/i-ring.c: Likewise.
+ * lib/i-ring.h: Likewise.
+ * lib/idcache.c: Likewise.
+ * lib/imaxabs.c: Likewise.
+ * lib/imaxdiv.c: Likewise.
+ * lib/inet_pton.c: Likewise.
+ * lib/inet_pton.h: Likewise.
+ * lib/intprops.h: Likewise.
+ * lib/inttostr.c: Likewise.
+ * lib/inttostr.h: Likewise.
+ * lib/inttypes.in.h: Likewise.
+ * lib/isapipe.c: Likewise.
+ * lib/isdir.c: Likewise.
+ * lib/isnan.c: Likewise.
+ * lib/isnan.h: Likewise.
+ * lib/isnanf.c: Likewise.
+ * lib/isnanf.h: Likewise.
+ * lib/isnanl-nolibm.h: Likewise.
+ * lib/isnanl.c: Likewise.
+ * lib/isnanl.h: Likewise.
+ * lib/javacomp.c: Likewise.
+ * lib/javacomp.h: Likewise.
+ * lib/javaexec.c: Likewise.
+ * lib/javaexec.h: Likewise.
+ * lib/javaversion.c: Likewise.
+ * lib/javaversion.h: Likewise.
+ * lib/javaversion.java: Likewise.
+ * lib/lbrkprop.h: Likewise.
+ * lib/lchmod.h: Likewise.
+ * lib/lchown.c: Likewise.
+ * lib/ldexpl.c: Likewise.
+ * lib/linebreak.c: Likewise.
+ * lib/linebreak.h: Likewise.
+ * lib/linebuffer.c: Likewise.
+ * lib/linebuffer.h: Likewise.
+ * lib/locale.in.h: Likewise.
+ * lib/logl.c: Likewise.
+ * lib/long-options.c: Likewise.
+ * lib/long-options.h: Likewise.
+ * lib/lstat.c: Likewise.
+ * lib/lstat.h: Likewise.
+ * lib/math.in.h: Likewise.
+ * lib/mbchar.c: Likewise.
+ * lib/mbchar.h: Likewise.
+ * lib/mbfile.h: Likewise.
+ * lib/mbiter.h: Likewise.
+ * lib/mbscasecmp.c: Likewise.
+ * lib/mbscasestr.c: Likewise.
+ * lib/mbschr.c: Likewise.
+ * lib/mbscspn.c: Likewise.
+ * lib/mbslen.c: Likewise.
+ * lib/mbsncasecmp.c: Likewise.
+ * lib/mbsnlen.c: Likewise.
+ * lib/mbspbrk.c: Likewise.
+ * lib/mbspcasecmp.c: Likewise.
+ * lib/mbsrchr.c: Likewise.
+ * lib/mbssep.c: Likewise.
+ * lib/mbsspn.c: Likewise.
+ * lib/mbsstr.c: Likewise.
+ * lib/mbstok_r.c: Likewise.
+ * lib/mbswidth.c: Likewise.
+ * lib/mbswidth.h: Likewise.
+ * lib/mbuiter.h: Likewise.
+ * lib/memcasecmp.c: Likewise.
+ * lib/memcasecmp.h: Likewise.
+ * lib/memchr.c: Likewise.
+ * lib/memcmp.c: Likewise.
+ * lib/memcoll.c: Likewise.
+ * lib/memcoll.h: Likewise.
+ * lib/memcpy.c: Likewise.
+ * lib/memrchr.c: Likewise.
+ * lib/mkancesdirs.c: Likewise.
+ * lib/mkdir-p.c: Likewise.
+ * lib/mkdir-p.h: Likewise.
+ * lib/mkdir.c: Likewise.
+ * lib/mkdirat.c: Likewise.
+ * lib/mkdtemp.c: Likewise.
+ * lib/mkstemp-safer.c: Likewise.
+ * lib/mkstemp.c: Likewise.
+ * lib/modechange.c: Likewise.
+ * lib/modechange.h: Likewise.
+ * lib/mountlist.c: Likewise.
+ * lib/mountlist.h: Likewise.
+ * lib/mpsort.c: Likewise.
+ * lib/nanosleep.c: Likewise.
+ * lib/obstack.c: Likewise.
+ * lib/obstack.h: Likewise.
+ * lib/open-safer.c: Likewise.
+ * lib/open.c: Likewise.
+ * lib/openat-die.c: Likewise.
+ * lib/openat-priv.h: Likewise.
+ * lib/openat-proc.c: Likewise.
+ * lib/openat.c: Likewise.
+ * lib/openat.h: Likewise.
+ * lib/pagealign_alloc.c: Likewise.
+ * lib/pagealign_alloc.h: Likewise.
+ * lib/physmem.c: Likewise.
+ * lib/physmem.h: Likewise.
+ * lib/pipe-safer.c: Likewise.
+ * lib/pipe.c: Likewise.
+ * lib/pipe.h: Likewise.
+ * lib/posixtm.c: Likewise.
+ * lib/posixtm.h: Likewise.
+ * lib/posixver.c: Likewise.
+ * lib/printf-frexp.c: Likewise.
+ * lib/printf-frexp.h: Likewise.
+ * lib/printf-frexpl.c: Likewise.
+ * lib/printf-frexpl.h: Likewise.
+ * lib/printf.c: Likewise.
+ * lib/progname.c: Likewise.
+ * lib/progname.h: Likewise.
+ * lib/progreloc.c: Likewise.
+ * lib/putenv.c: Likewise.
+ * lib/quote.c: Likewise.
+ * lib/quote.h: Likewise.
+ * lib/quotearg.c: Likewise.
+ * lib/quotearg.h: Likewise.
+ * lib/raise.c: Likewise.
+ * lib/readline.c: Likewise.
+ * lib/readline.h: Likewise.
+ * lib/readlink.c: Likewise.
+ * lib/readtokens.c: Likewise.
+ * lib/readtokens.h: Likewise.
+ * lib/readtokens0.c: Likewise.
+ * lib/readtokens0.h: Likewise.
+ * lib/readutmp.c: Likewise.
+ * lib/readutmp.h: Likewise.
+ * lib/realloc.c: Likewise.
+ * lib/relocwrapper.c: Likewise.
+ * lib/rename-dest-slash.c: Likewise.
+ * lib/rename.c: Likewise.
+ * lib/rmdir.c: Likewise.
+ * lib/rpmatch.c: Likewise.
+ * lib/safe-read.c: Likewise.
+ * lib/safe-read.h: Likewise.
+ * lib/safe-write.c: Likewise.
+ * lib/safe-write.h: Likewise.
+ * lib/same-inode.h: Likewise.
+ * lib/same.c: Likewise.
+ * lib/same.h: Likewise.
+ * lib/save-cwd.c: Likewise.
+ * lib/save-cwd.h: Likewise.
+ * lib/savedir.c: Likewise.
+ * lib/savedir.h: Likewise.
+ * lib/savewd.c: Likewise.
+ * lib/savewd.h: Likewise.
+ * lib/search.in.h: Likewise.
+ * lib/setenv.c: Likewise.
+ * lib/setenv.h: Likewise.
+ * lib/settime.c: Likewise.
+ * lib/sh-quote.c: Likewise.
+ * lib/sh-quote.h: Likewise.
+ * lib/sig2str.c: Likewise.
+ * lib/sig2str.h: Likewise.
+ * lib/signal.in.h: Likewise.
+ * lib/signbitd.c: Likewise.
+ * lib/signbitf.c: Likewise.
+ * lib/signbitl.c: Likewise.
+ * lib/sigprocmask.c: Likewise.
+ * lib/sincosl.c: Likewise.
+ * lib/sleep.c: Likewise.
+ * lib/sprintf.c: Likewise.
+ * lib/sqrtl.c: Likewise.
+ * lib/stat-time.h: Likewise.
+ * lib/stdio--.h: Likewise.
+ * lib/stdio-safer.h: Likewise.
+ * lib/stdlib--.h: Likewise.
+ * lib/stdlib-safer.h: Likewise.
+ * lib/stdlib.in.h: Likewise.
+ * lib/stpcpy.c: Likewise.
+ * lib/stpncpy.c: Likewise.
+ * lib/strchrnul.c: Likewise.
+ * lib/strcspn.c: Likewise.
+ * lib/strerror.c: Likewise.
+ * lib/strftime.c: Likewise.
+ * lib/strftime.h: Likewise.
+ * lib/striconveh.c: Likewise.
+ * lib/striconveh.h: Likewise.
+ * lib/striconveha.c: Likewise.
+ * lib/striconveha.h: Likewise.
+ * lib/stripslash.c: Likewise.
+ * lib/strnlen1.c: Likewise.
+ * lib/strnlen1.h: Likewise.
+ * lib/strtod.c: Likewise.
+ * lib/strtoimax.c: Likewise.
+ * lib/strtok_r.c: Likewise.
+ * lib/strtol.c: Likewise.
+ * lib/strtoll.c: Likewise.
+ * lib/strtoul.c: Likewise.
+ * lib/strtoull.c: Likewise.
+ * lib/sysexits.in.h: Likewise.
+ * lib/tempname.c: Likewise.
+ * lib/tempname.h: Likewise.
+ * lib/timespec.h: Likewise.
+ * lib/tls.c: Likewise.
+ * lib/tls.h: Likewise.
+ * lib/tmpdir.c: Likewise.
+ * lib/tmpdir.h: Likewise.
+ * lib/tmpfile-safer.c: Likewise.
+ * lib/tmpfile.c: Likewise.
+ * lib/trigl.c: Likewise.
+ * lib/trigl.h: Likewise.
+ * lib/trim.c: Likewise.
+ * lib/trim.h: Likewise.
+ * lib/trunc.c: Likewise.
+ * lib/truncf.c: Likewise.
+ * lib/truncl.c: Likewise.
+ * lib/tsearch.c: Likewise.
+ * lib/unicodeio.c: Likewise.
+ * lib/unicodeio.h: Likewise.
+ * lib/unistd--.h: Likewise.
+ * lib/unistd-safer.h: Likewise.
+ * lib/unistdio/ulc-fprintf.c: Likewise.
+ * lib/unistdio/ulc-vfprintf.c: Likewise.
+ * lib/unlinkdir.c: Likewise.
+ * lib/unlinkdir.h: Likewise.
+ * lib/unlocked-io.h: Likewise.
+ * lib/unsetenv.c: Likewise.
+ * lib/userspec.c: Likewise.
+ * lib/utime.c: Likewise.
+ * lib/utimecmp.c: Likewise.
+ * lib/utimecmp.h: Likewise.
+ * lib/utimens.c: Likewise.
+ * lib/verify.h: Likewise.
+ * lib/verror.c: Likewise.
+ * lib/verror.h: Likewise.
+ * lib/version-etc-fsf.c: Likewise.
+ * lib/version-etc.c: Likewise.
+ * lib/version-etc.h: Likewise.
+ * lib/vfprintf.c: Likewise.
+ * lib/vprintf.c: Likewise.
+ * lib/vsprintf.c: Likewise.
+ * lib/w32spawn.h: Likewise.
+ * lib/wait-process.c: Likewise.
+ * lib/wait-process.h: Likewise.
+ * lib/wcwidth.c: Likewise.
+ * lib/write-any-file.c: Likewise.
+ * lib/xalloc-die.c: Likewise.
+ * lib/xalloc.h: Likewise.
+ * lib/xasprintf.c: Likewise.
+ * lib/xgetcwd.c: Likewise.
+ * lib/xgetcwd.h: Likewise.
+ * lib/xgetdomainname.c: Likewise.
+ * lib/xgetdomainname.h: Likewise.
+ * lib/xgethostname.c: Likewise.
+ * lib/xmalloc.c: Likewise.
+ * lib/xmalloca.c: Likewise.
+ * lib/xmalloca.h: Likewise.
+ * lib/xmemcoll.c: Likewise.
+ * lib/xnanosleep.c: Likewise.
+ * lib/xreadlink.c: Likewise.
+ * lib/xreadlink.h: Likewise.
+ * lib/xsetenv.c: Likewise.
+ * lib/xsetenv.h: Likewise.
+ * lib/xstriconv.c: Likewise.
+ * lib/xstriconv.h: Likewise.
+ * lib/xstrndup.c: Likewise.
+ * lib/xstrndup.h: Likewise.
+ * lib/xstrtod.c: Likewise.
+ * lib/xstrtod.h: Likewise.
+ * lib/xstrtol-error.c: Likewise.
+ * lib/xstrtol.c: Likewise.
+ * lib/xstrtol.h: Likewise.
+ * lib/xtime.h: Likewise.
+ * lib/xvasprintf.c: Likewise.
+ * lib/xvasprintf.h: Likewise.
+ * lib/yesno.c: Likewise.
+ * lib/yesno.h: Likewise.
+ * posix-modules: Likewise.
+ * tests/test-alloca-opt.c: Likewise.
+ * tests/test-arcfour.c: Likewise.
+ * tests/test-arctwo.c: Likewise.
+ * tests/test-argmatch.c: Likewise.
+ * tests/test-argp-2.sh: Likewise.
+ * tests/test-argp.c: Likewise.
+ * tests/test-arpa_inet.c: Likewise.
+ * tests/test-array_list.c: Likewise.
+ * tests/test-array_oset.c: Likewise.
+ * tests/test-atexit.c: Likewise.
+ * tests/test-avltree_list.c: Likewise.
+ * tests/test-avltree_oset.c: Likewise.
+ * tests/test-avltreehash_list.c: Likewise.
+ * tests/test-base64.c: Likewise.
+ * tests/test-binary-io.c: Likewise.
+ * tests/test-byteswap.c: Likewise.
+ * tests/test-c-ctype.c: Likewise.
+ * tests/test-c-strcasecmp.c: Likewise.
+ * tests/test-c-strcasestr.c: Likewise.
+ * tests/test-c-strncasecmp.c: Likewise.
+ * tests/test-c-strstr.c: Likewise.
+ * tests/test-canonicalize-lgpl.c: Likewise.
+ * tests/test-canonicalize.c: Likewise.
+ * tests/test-carray_list.c: Likewise.
+ * tests/test-ceilf.c: Likewise.
+ * tests/test-ceill.c: Likewise.
+ * tests/test-count-one-bits.c: Likewise.
+ * tests/test-crc.c: Likewise.
+ * tests/test-dirname.c: Likewise.
+ * tests/test-fbufmode.c: Likewise.
+ * tests/test-fcntl.c: Likewise.
+ * tests/test-fflush.c: Likewise.
+ * tests/test-floorf.c: Likewise.
+ * tests/test-floorl.c: Likewise.
+ * tests/test-fopen.c: Likewise.
+ * tests/test-fprintf-posix.c: Likewise.
+ * tests/test-fprintf-posix.h: Likewise.
+ * tests/test-fpurge.c: Likewise.
+ * tests/test-freadable.c: Likewise.
+ * tests/test-freadahead.c: Likewise.
+ * tests/test-freading.c: Likewise.
+ * tests/test-freopen.c: Likewise.
+ * tests/test-frexp.c: Likewise.
+ * tests/test-frexpl.c: Likewise.
+ * tests/test-fseek.c: Likewise.
+ * tests/test-fseeko.c: Likewise.
+ * tests/test-fseterr.c: Likewise.
+ * tests/test-fstrcmp.c: Likewise.
+ * tests/test-ftell.c: Likewise.
+ * tests/test-ftello.c: Likewise.
+ * tests/test-fwritable.c: Likewise.
+ * tests/test-fwriting.c: Likewise.
+ * tests/test-getaddrinfo.c: Likewise.
+ * tests/test-getpass.c: Likewise.
+ * tests/test-gettimeofday.c: Likewise.
+ * tests/test-hmac-md5.c: Likewise.
+ * tests/test-hmac-sha1.c: Likewise.
+ * tests/test-iconv.c: Likewise.
+ * tests/test-iconvme.c: Likewise.
+ * tests/test-inttypes.c: Likewise.
+ * tests/test-isnan.c: Likewise.
+ * tests/test-isnanf.c: Likewise.
+ * tests/test-isnanl-nolibm.c: Likewise.
+ * tests/test-isnanl.c: Likewise.
+ * tests/test-isnanl.h: Likewise.
+ * tests/test-ldexpl.c: Likewise.
+ * tests/test-linked_list.c: Likewise.
+ * tests/test-linkedhash_list.c: Likewise.
+ * tests/test-locale.c: Likewise.
+ * tests/test-localename.c: Likewise.
+ * tests/test-lock.c: Likewise.
+ * tests/test-lseek.c: Likewise.
+ * tests/test-malloca.c: Likewise.
+ * tests/test-math.c: Likewise.
+ * tests/test-mbscasecmp.c: Likewise.
+ * tests/test-mbscasestr1.c: Likewise.
+ * tests/test-mbscasestr2.c: Likewise.
+ * tests/test-mbscasestr3.c: Likewise.
+ * tests/test-mbscasestr4.c: Likewise.
+ * tests/test-mbschr.c: Likewise.
+ * tests/test-mbscspn.c: Likewise.
+ * tests/test-mbsncasecmp.c: Likewise.
+ * tests/test-mbspbrk.c: Likewise.
+ * tests/test-mbspcasecmp.c: Likewise.
+ * tests/test-mbsrchr.c: Likewise.
+ * tests/test-mbsspn.c: Likewise.
+ * tests/test-mbsstr1.c: Likewise.
+ * tests/test-mbsstr2.c: Likewise.
+ * tests/test-mbsstr3.c: Likewise.
+ * tests/test-md5.c: Likewise.
+ * tests/test-memmem.c: Likewise.
+ * tests/test-netinet_in.c: Likewise.
+ * tests/test-open.c: Likewise.
+ * tests/test-printf-frexp.c: Likewise.
+ * tests/test-printf-frexpl.c: Likewise.
+ * tests/test-printf-posix.c: Likewise.
+ * tests/test-printf-posix.h: Likewise.
+ * tests/test-rbtree_list.c: Likewise.
+ * tests/test-rbtree_oset.c: Likewise.
+ * tests/test-rbtreehash_list.c: Likewise.
+ * tests/test-read-file.c: Likewise.
+ * tests/test-rijndael.c: Likewise.
+ * tests/test-search.c: Likewise.
+ * tests/test-signbit.c: Likewise.
+ * tests/test-sleep.c: Likewise.
+ * tests/test-snprintf-posix.c: Likewise.
+ * tests/test-snprintf-posix.h: Likewise.
+ * tests/test-snprintf.c: Likewise.
+ * tests/test-sprintf-posix.c: Likewise.
+ * tests/test-sprintf-posix.h: Likewise.
+ * tests/test-stat-time.c: Likewise.
+ * tests/test-stdbool.c: Likewise.
+ * tests/test-stdint.c: Likewise.
+ * tests/test-stdio.c: Likewise.
+ * tests/test-stdlib.c: Likewise.
+ * tests/test-stpncpy.c: Likewise.
+ * tests/test-strcasestr.c: Likewise.
+ * tests/test-striconv.c: Likewise.
+ * tests/test-striconveh.c: Likewise.
+ * tests/test-striconveha.c: Likewise.
+ * tests/test-string.c: Likewise.
+ * tests/test-sys_select.c: Likewise.
+ * tests/test-sys_socket.c: Likewise.
+ * tests/test-sys_stat.c: Likewise.
+ * tests/test-sys_time.c: Likewise.
+ * tests/test-sysexits.c: Likewise.
+ * tests/test-time.c: Likewise.
+ * tests/test-tls.c: Likewise.
+ * tests/test-trunc.c: Likewise.
+ * tests/test-truncf.c: Likewise.
+ * tests/test-truncl.c: Likewise.
+ * tests/test-unistd.c: Likewise.
+ * tests/test-vasnprintf-posix.c: Likewise.
+ * tests/test-vasnprintf-posix2.c: Likewise.
+ * tests/test-vasnprintf.c: Likewise.
+ * tests/test-vasprintf-posix.c: Likewise.
+ * tests/test-vasprintf.c: Likewise.
+ * tests/test-verify.c: Likewise.
+ * tests/test-vfprintf-posix.c: Likewise.
+ * tests/test-vprintf-posix.c: Likewise.
+ * tests/test-vsnprintf-posix.c: Likewise.
+ * tests/test-vsnprintf.c: Likewise.
+ * tests/test-vsprintf-posix.c: Likewise.
+ * tests/test-wchar.c: Likewise.
+ * tests/test-wctype.c: Likewise.
+ * tests/test-wcwidth.c: Likewise.
+ * tests/test-xstrtol.c: Likewise.
+ * tests/test-xvasprintf.c: Likewise.
+ * tests/uniconv/test-u16-conv-from-enc.c: Likewise.
+ * tests/uniconv/test-u16-conv-to-enc.c: Likewise.
+ * tests/uniconv/test-u16-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u16-strconv-to-enc.c: Likewise.
+ * tests/uniconv/test-u32-conv-from-enc.c: Likewise.
+ * tests/uniconv/test-u32-conv-to-enc.c: Likewise.
+ * tests/uniconv/test-u32-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u32-strconv-to-enc.c: Likewise.
+ * tests/uniconv/test-u8-conv-from-enc.c: Likewise.
+ * tests/uniconv/test-u8-conv-to-enc.c: Likewise.
+ * tests/uniconv/test-u8-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u8-strconv-to-enc.c: Likewise.
+ * tests/uniname/test-uninames.c: Likewise.
+ * tests/unistdio/test-u16-asnprintf1.c: Likewise.
+ * tests/unistdio/test-u16-asnprintf1.h: Likewise.
+ * tests/unistdio/test-u16-printf1.h: Likewise.
+ * tests/unistdio/test-u16-vasnprintf1.c: Likewise.
+ * tests/unistdio/test-u16-vasnprintf2.c: Likewise.
+ * tests/unistdio/test-u16-vasnprintf3.c: Likewise.
+ * tests/unistdio/test-u16-vasprintf1.c: Likewise.
+ * tests/unistdio/test-u16-vsnprintf1.c: Likewise.
+ * tests/unistdio/test-u16-vsprintf1.c: Likewise.
+ * tests/unistdio/test-u32-asnprintf1.c: Likewise.
+ * tests/unistdio/test-u32-asnprintf1.h: Likewise.
+ * tests/unistdio/test-u32-printf1.h: Likewise.
+ * tests/unistdio/test-u32-vasnprintf1.c: Likewise.
+ * tests/unistdio/test-u32-vasnprintf2.c: Likewise.
+ * tests/unistdio/test-u32-vasnprintf3.c: Likewise.
+ * tests/unistdio/test-u32-vasprintf1.c: Likewise.
+ * tests/unistdio/test-u32-vsnprintf1.c: Likewise.
+ * tests/unistdio/test-u32-vsprintf1.c: Likewise.
+ * tests/unistdio/test-u8-asnprintf1.c: Likewise.
+ * tests/unistdio/test-u8-asnprintf1.h: Likewise.
+ * tests/unistdio/test-u8-printf1.h: Likewise.
+ * tests/unistdio/test-u8-vasnprintf1.c: Likewise.
+ * tests/unistdio/test-u8-vasnprintf2.c: Likewise.
+ * tests/unistdio/test-u8-vasnprintf3.c: Likewise.
+ * tests/unistdio/test-u8-vasprintf1.c: Likewise.
+ * tests/unistdio/test-u8-vsnprintf1.c: Likewise.
+ * tests/unistdio/test-u8-vsprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-asnprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-asnprintf1.h: Likewise.
+ * tests/unistdio/test-ulc-printf1.h: Likewise.
+ * tests/unistdio/test-ulc-vasnprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-vasnprintf2.c: Likewise.
+ * tests/unistdio/test-ulc-vasnprintf3.c: Likewise.
+ * tests/unistdio/test-ulc-vasprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-vsnprintf1.c: Likewise.
+ * tests/unistdio/test-ulc-vsprintf1.c: Likewise.
+ * tests/uniwidth/test-u16-strwidth.c: Likewise.
+ * tests/uniwidth/test-u16-width.c: Likewise.
+ * tests/uniwidth/test-u32-strwidth.c: Likewise.
+ * tests/uniwidth/test-u32-width.c: Likewise.
+ * tests/uniwidth/test-u8-strwidth.c: Likewise.
+ * tests/uniwidth/test-u8-width.c: Likewise.
+ * tests/uniwidth/test-uc_width.c: Likewise.
+ * config/srclist-update: Likewise.
+ (fixlicense): Update to GPLv3+.
+
+ Change copyright notice from LGPLv2.1+ to LGPLv3+.
+ * tests/test-tsearch.c: Change copyright notice.
+
+ Change copyright notice from LGPLv2.0+ to LGPLv3+.
+ * lib/c-strcaseeq.h: Change copyright notice.
+ * lib/streq.h: Likewise.
+ * lib/uniconv.h: Likewise.
+ * lib/uniconv/u-conv-from-enc.h: Likewise.
+ * lib/uniconv/u-conv-to-enc.h: Likewise.
+ * lib/uniconv/u-strconv-from-enc.h: Likewise.
+ * lib/uniconv/u-strconv-to-enc.h: Likewise.
+ * lib/uniconv/u16-conv-from-enc.c: Likewise.
+ * lib/uniconv/u16-conv-to-enc.c: Likewise.
+ * lib/uniconv/u16-strconv-from-enc.c: Likewise.
+ * lib/uniconv/u16-strconv-from-locale.c: Likewise.
+ * lib/uniconv/u16-strconv-to-enc.c: Likewise.
+ * lib/uniconv/u16-strconv-to-locale.c: Likewise.
+ * lib/uniconv/u32-conv-from-enc.c: Likewise.
+ * lib/uniconv/u32-conv-to-enc.c: Likewise.
+ * lib/uniconv/u32-strconv-from-enc.c: Likewise.
+ * lib/uniconv/u32-strconv-from-locale.c: Likewise.
+ * lib/uniconv/u32-strconv-to-enc.c: Likewise.
+ * lib/uniconv/u32-strconv-to-locale.c: Likewise.
+ * lib/uniconv/u8-conv-from-enc.c: Likewise.
+ * lib/uniconv/u8-conv-to-enc.c: Likewise.
+ * lib/uniconv/u8-strconv-from-enc.c: Likewise.
+ * lib/uniconv/u8-strconv-from-locale.c: Likewise.
+ * lib/uniconv/u8-strconv-to-enc.c: Likewise.
+ * lib/uniconv/u8-strconv-to-locale.c: Likewise.
+ * lib/uniname.h: Likewise.
+ * lib/uniname/uniname.c: Likewise.
+ * lib/unistdio.h: Likewise.
+ * lib/unistdio/u-asnprintf.h: Likewise.
+ * lib/unistdio/u-asprintf.h: Likewise.
+ * lib/unistdio/u-printf-args.c: Likewise.
+ * lib/unistdio/u-printf-args.h: Likewise.
+ * lib/unistdio/u-printf-parse.h: Likewise.
+ * lib/unistdio/u-snprintf.h: Likewise.
+ * lib/unistdio/u-sprintf.h: Likewise.
+ * lib/unistdio/u-vasprintf.h: Likewise.
+ * lib/unistdio/u-vsnprintf.h: Likewise.
+ * lib/unistdio/u-vsprintf.h: Likewise.
+ * lib/unistdio/u16-asnprintf.c: Likewise.
+ * lib/unistdio/u16-asprintf.c: Likewise.
+ * lib/unistdio/u16-printf-parse.c: Likewise.
+ * lib/unistdio/u16-snprintf.c: Likewise.
+ * lib/unistdio/u16-sprintf.c: Likewise.
+ * lib/unistdio/u16-u16-asnprintf.c: Likewise.
+ * lib/unistdio/u16-u16-asprintf.c: Likewise.
+ * lib/unistdio/u16-u16-snprintf.c: Likewise.
+ * lib/unistdio/u16-u16-sprintf.c: Likewise.
+ * lib/unistdio/u16-u16-vasnprintf.c: Likewise.
+ * lib/unistdio/u16-u16-vasprintf.c: Likewise.
+ * lib/unistdio/u16-u16-vsnprintf.c: Likewise.
+ * lib/unistdio/u16-u16-vsprintf.c: Likewise.
+ * lib/unistdio/u16-vasnprintf.c: Likewise.
+ * lib/unistdio/u16-vasprintf.c: Likewise.
+ * lib/unistdio/u16-vsnprintf.c: Likewise.
+ * lib/unistdio/u16-vsprintf.c: Likewise.
+ * lib/unistdio/u32-asnprintf.c: Likewise.
+ * lib/unistdio/u32-asprintf.c: Likewise.
+ * lib/unistdio/u32-printf-parse.c: Likewise.
+ * lib/unistdio/u32-snprintf.c: Likewise.
+ * lib/unistdio/u32-sprintf.c: Likewise.
+ * lib/unistdio/u32-u32-asnprintf.c: Likewise.
+ * lib/unistdio/u32-u32-asprintf.c: Likewise.
+ * lib/unistdio/u32-u32-snprintf.c: Likewise.
+ * lib/unistdio/u32-u32-sprintf.c: Likewise.
+ * lib/unistdio/u32-u32-vasnprintf.c: Likewise.
+ * lib/unistdio/u32-u32-vasprintf.c: Likewise.
+ * lib/unistdio/u32-u32-vsnprintf.c: Likewise.
+ * lib/unistdio/u32-u32-vsprintf.c: Likewise.
+ * lib/unistdio/u32-vasnprintf.c: Likewise.
+ * lib/unistdio/u32-vasprintf.c: Likewise.
+ * lib/unistdio/u32-vsnprintf.c: Likewise.
+ * lib/unistdio/u32-vsprintf.c: Likewise.
+ * lib/unistdio/u8-asnprintf.c: Likewise.
+ * lib/unistdio/u8-asprintf.c: Likewise.
+ * lib/unistdio/u8-printf-parse.c: Likewise.
+ * lib/unistdio/u8-snprintf.c: Likewise.
+ * lib/unistdio/u8-sprintf.c: Likewise.
+ * lib/unistdio/u8-u8-asnprintf.c: Likewise.
+ * lib/unistdio/u8-u8-asprintf.c: Likewise.
+ * lib/unistdio/u8-u8-snprintf.c: Likewise.
+ * lib/unistdio/u8-u8-sprintf.c: Likewise.
+ * lib/unistdio/u8-u8-vasnprintf.c: Likewise.
+ * lib/unistdio/u8-u8-vasprintf.c: Likewise.
+ * lib/unistdio/u8-u8-vsnprintf.c: Likewise.
+ * lib/unistdio/u8-u8-vsprintf.c: Likewise.
+ * lib/unistdio/u8-vasnprintf.c: Likewise.
+ * lib/unistdio/u8-vasprintf.c: Likewise.
+ * lib/unistdio/u8-vsnprintf.c: Likewise.
+ * lib/unistdio/u8-vsprintf.c: Likewise.
+ * lib/unistdio/ulc-asnprintf.c: Likewise.
+ * lib/unistdio/ulc-asprintf.c: Likewise.
+ * lib/unistdio/ulc-printf-parse.c: Likewise.
+ * lib/unistdio/ulc-snprintf.c: Likewise.
+ * lib/unistdio/ulc-sprintf.c: Likewise.
+ * lib/unistdio/ulc-vasnprintf.c: Likewise.
+ * lib/unistdio/ulc-vasprintf.c: Likewise.
+ * lib/unistdio/ulc-vsnprintf.c: Likewise.
+ * lib/unistdio/ulc-vsprintf.c: Likewise.
+ * lib/unistr.h: Likewise.
+ * lib/unistr/u-cpy-alloc.h: Likewise.
+ * lib/unistr/u-cpy.h: Likewise.
+ * lib/unistr/u-endswith.h: Likewise.
+ * lib/unistr/u-move.h: Likewise.
+ * lib/unistr/u-set.h: Likewise.
+ * lib/unistr/u-startswith.h: Likewise.
+ * lib/unistr/u-stpcpy.h: Likewise.
+ * lib/unistr/u-stpncpy.h: Likewise.
+ * lib/unistr/u-strcat.h: Likewise.
+ * lib/unistr/u-strcpy.h: Likewise.
+ * lib/unistr/u-strcspn.h: Likewise.
+ * lib/unistr/u-strdup.h: Likewise.
+ * lib/unistr/u-strlen.h: Likewise.
+ * lib/unistr/u-strncat.h: Likewise.
+ * lib/unistr/u-strncpy.h: Likewise.
+ * lib/unistr/u-strnlen.h: Likewise.
+ * lib/unistr/u-strpbrk.h: Likewise.
+ * lib/unistr/u-strspn.h: Likewise.
+ * lib/unistr/u-strstr.h: Likewise.
+ * lib/unistr/u-strtok.h: Likewise.
+ * lib/unistr/u16-check.c: Likewise.
+ * lib/unistr/u16-chr.c: Likewise.
+ * lib/unistr/u16-cmp.c: Likewise.
+ * lib/unistr/u16-cpy-alloc.c: Likewise.
+ * lib/unistr/u16-cpy.c: Likewise.
+ * lib/unistr/u16-endswith.c: Likewise.
+ * lib/unistr/u16-mblen.c: Likewise.
+ * lib/unistr/u16-mbsnlen.c: Likewise.
+ * lib/unistr/u16-mbtouc-aux.c: Likewise.
+ * lib/unistr/u16-mbtouc-unsafe-aux.c: Likewise.
+ * lib/unistr/u16-mbtouc-unsafe.c: Likewise.
+ * lib/unistr/u16-mbtouc.c: Likewise.
+ * lib/unistr/u16-mbtoucr.c: Likewise.
+ * lib/unistr/u16-move.c: Likewise.
+ * lib/unistr/u16-next.c: Likewise.
+ * lib/unistr/u16-prev.c: Likewise.
+ * lib/unistr/u16-set.c: Likewise.
+ * lib/unistr/u16-startswith.c: Likewise.
+ * lib/unistr/u16-stpcpy.c: Likewise.
+ * lib/unistr/u16-stpncpy.c: Likewise.
+ * lib/unistr/u16-strcat.c: Likewise.
+ * lib/unistr/u16-strchr.c: Likewise.
+ * lib/unistr/u16-strcmp.c: Likewise.
+ * lib/unistr/u16-strcpy.c: Likewise.
+ * lib/unistr/u16-strcspn.c: Likewise.
+ * lib/unistr/u16-strdup.c: Likewise.
+ * lib/unistr/u16-strlen.c: Likewise.
+ * lib/unistr/u16-strmblen.c: Likewise.
+ * lib/unistr/u16-strmbtouc.c: Likewise.
+ * lib/unistr/u16-strncat.c: Likewise.
+ * lib/unistr/u16-strncmp.c: Likewise.
+ * lib/unistr/u16-strncpy.c: Likewise.
+ * lib/unistr/u16-strnlen.c: Likewise.
+ * lib/unistr/u16-strpbrk.c: Likewise.
+ * lib/unistr/u16-strrchr.c: Likewise.
+ * lib/unistr/u16-strspn.c: Likewise.
+ * lib/unistr/u16-strstr.c: Likewise.
+ * lib/unistr/u16-strtok.c: Likewise.
+ * lib/unistr/u16-to-u32.c: Likewise.
+ * lib/unistr/u16-to-u8.c: Likewise.
+ * lib/unistr/u16-uctomb-aux.c: Likewise.
+ * lib/unistr/u16-uctomb.c: Likewise.
+ * lib/unistr/u32-check.c: Likewise.
+ * lib/unistr/u32-chr.c: Likewise.
+ * lib/unistr/u32-cmp.c: Likewise.
+ * lib/unistr/u32-cpy-alloc.c: Likewise.
+ * lib/unistr/u32-cpy.c: Likewise.
+ * lib/unistr/u32-endswith.c: Likewise.
+ * lib/unistr/u32-mblen.c: Likewise.
+ * lib/unistr/u32-mbsnlen.c: Likewise.
+ * lib/unistr/u32-mbtouc-unsafe.c: Likewise.
+ * lib/unistr/u32-mbtouc.c: Likewise.
+ * lib/unistr/u32-mbtoucr.c: Likewise.
+ * lib/unistr/u32-move.c: Likewise.
+ * lib/unistr/u32-next.c: Likewise.
+ * lib/unistr/u32-prev.c: Likewise.
+ * lib/unistr/u32-set.c: Likewise.
+ * lib/unistr/u32-startswith.c: Likewise.
+ * lib/unistr/u32-stpcpy.c: Likewise.
+ * lib/unistr/u32-stpncpy.c: Likewise.
+ * lib/unistr/u32-strcat.c: Likewise.
+ * lib/unistr/u32-strchr.c: Likewise.
+ * lib/unistr/u32-strcmp.c: Likewise.
+ * lib/unistr/u32-strcpy.c: Likewise.
+ * lib/unistr/u32-strcspn.c: Likewise.
+ * lib/unistr/u32-strdup.c: Likewise.
+ * lib/unistr/u32-strlen.c: Likewise.
+ * lib/unistr/u32-strmblen.c: Likewise.
+ * lib/unistr/u32-strmbtouc.c: Likewise.
+ * lib/unistr/u32-strncat.c: Likewise.
+ * lib/unistr/u32-strncmp.c: Likewise.
+ * lib/unistr/u32-strncpy.c: Likewise.
+ * lib/unistr/u32-strnlen.c: Likewise.
+ * lib/unistr/u32-strpbrk.c: Likewise.
+ * lib/unistr/u32-strrchr.c: Likewise.
+ * lib/unistr/u32-strspn.c: Likewise.
+ * lib/unistr/u32-strstr.c: Likewise.
+ * lib/unistr/u32-strtok.c: Likewise.
+ * lib/unistr/u32-to-u16.c: Likewise.
+ * lib/unistr/u32-to-u8.c: Likewise.
+ * lib/unistr/u32-uctomb.c: Likewise.
+ * lib/unistr/u8-check.c: Likewise.
+ * lib/unistr/u8-chr.c: Likewise.
+ * lib/unistr/u8-cmp.c: Likewise.
+ * lib/unistr/u8-cpy-alloc.c: Likewise.
+ * lib/unistr/u8-cpy.c: Likewise.
+ * lib/unistr/u8-endswith.c: Likewise.
+ * lib/unistr/u8-mblen.c: Likewise.
+ * lib/unistr/u8-mbsnlen.c: Likewise.
+ * lib/unistr/u8-mbtouc-aux.c: Likewise.
+ * lib/unistr/u8-mbtouc-unsafe-aux.c: Likewise.
+ * lib/unistr/u8-mbtouc-unsafe.c: Likewise.
+ * lib/unistr/u8-mbtouc.c: Likewise.
+ * lib/unistr/u8-mbtoucr.c: Likewise.
+ * lib/unistr/u8-move.c: Likewise.
+ * lib/unistr/u8-next.c: Likewise.
+ * lib/unistr/u8-prev.c: Likewise.
+ * lib/unistr/u8-set.c: Likewise.
+ * lib/unistr/u8-startswith.c: Likewise.
+ * lib/unistr/u8-stpcpy.c: Likewise.
+ * lib/unistr/u8-stpncpy.c: Likewise.
+ * lib/unistr/u8-strcat.c: Likewise.
+ * lib/unistr/u8-strchr.c: Likewise.
+ * lib/unistr/u8-strcmp.c: Likewise.
+ * lib/unistr/u8-strcpy.c: Likewise.
+ * lib/unistr/u8-strcspn.c: Likewise.
+ * lib/unistr/u8-strdup.c: Likewise.
+ * lib/unistr/u8-strlen.c: Likewise.
+ * lib/unistr/u8-strmblen.c: Likewise.
+ * lib/unistr/u8-strmbtouc.c: Likewise.
+ * lib/unistr/u8-strncat.c: Likewise.
+ * lib/unistr/u8-strncmp.c: Likewise.
+ * lib/unistr/u8-strncpy.c: Likewise.
+ * lib/unistr/u8-strnlen.c: Likewise.
+ * lib/unistr/u8-strpbrk.c: Likewise.
+ * lib/unistr/u8-strrchr.c: Likewise.
+ * lib/unistr/u8-strspn.c: Likewise.
+ * lib/unistr/u8-strstr.c: Likewise.
+ * lib/unistr/u8-strtok.c: Likewise.
+ * lib/unistr/u8-to-u16.c: Likewise.
+ * lib/unistr/u8-to-u32.c: Likewise.
+ * lib/unistr/u8-uctomb-aux.c: Likewise.
+ * lib/unistr/u8-uctomb.c: Likewise.
+ * lib/unitypes.h: Likewise.
+ * lib/uniwidth.h: Likewise.
+ * lib/uniwidth/cjk.h: Likewise.
+ * lib/uniwidth/u16-strwidth.c: Likewise.
+ * lib/uniwidth/u16-width.c: Likewise.
+ * lib/uniwidth/u32-strwidth.c: Likewise.
+ * lib/uniwidth/u32-width.c: Likewise.
+ * lib/uniwidth/u8-strwidth.c: Likewise.
+ * lib/uniwidth/u8-width.c: Likewise.
+ * lib/uniwidth/width.c: Likewise.
+
+2007-10-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/inttypes.in.h: Change copyright notice from LGPL to GPL.
+ The file is still under LGPL (see modules/inttypes).
+
+2007-10-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/trunc (Dependencies): Add 'extensions'.
+ * m4/trunc.m4 (gl_FUNC_TRUNC): Require gl_USE_SYSTEM_EXTENSIONS.
+ Reported by Ben Pfaff <blp@gnu.org>.
+
+2007-10-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/freopen-tests: New file.
+ * tests/test-freopen.c: New file.
+
+ * modules/fopen-tests: New file.
+ * tests/test-fopen.c: New file.
+
+ * modules/fopen: New file.
+ * lib/fopen.c: New file.
+ * m4/fopen.m4: New file.
+ * modules/freopen: New file.
+ * lib/freopen.c: New file.
+ * m4/freopen.m4: New file.
+ * lib/stdio.in.h (fopen, freopen): New declarations.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Initialize also GNULIB_FOPEN,
+ GNULIB_FREOPEN, REPLACE_FOPEN, REPLACE_FREOPEN.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_FOPEN,
+ GNULIB_FREOPEN, REPLACE_FOPEN, REPLACE_FREOPEN.
+ * doc/functions/fopen.texi: Mention the 'fopen' module.
+ * doc/functions/freopen.texi: Mention the 'freopen' module.
+
+2007-10-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/open-tests: New file.
+ * tests/test-open.c: New file.
+
+ * modules/open: New file.
+ * lib/open.c: New file.
+ * m4/open.m4: New file.
+ * lib/fchdir.c (open): If the gnulib module 'open' is used, do what
+ lib/open.c does.
+ * lib/fcntl.in.h (open): Declare also if replaced by the 'open' module.
+ * m4/fcntl_h.m4 (gl_FCNTL_MODULE_INDICATOR, gl_FCNTL_H_DEFAULTS): New
+ macros.
+ (gl_FCNTL_H): Require gl_FCNTL_H_DEFAULTS.
+ * modules/fcntl (Makefile.am): Also substitute GNULIB_OPEN and
+ REPLACE_OPEN.
+ * doc/functions/open.texi: Mention the 'open' module.
+
+2007-10-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/ceill-tests: New file.
+ * tests/test-ceill.c: New file.
+
+ * modules/ceill: New file.
+ * lib/ceill.c: Replace entire file.
+ * m4/ceill.m4: New file.
+ * lib/math.in.h (ceill): Replace declaration.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_CEILL.
+ * modules/math (Makefile.am): Substitute also GNULIB_CEILL.
+ * doc/functions/ceill.texi: Mention the 'ceill' module.
+ * modules/mathl (Files): Remove lib/ceill.c.
+ (Depends-on): Add ceill.
+
+2007-10-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/ceilf-tests: New file.
+ * tests/test-ceilf.c: New file.
+
+ * modules/ceilf: New file.
+ * lib/ceil.c: New file.
+ * lib/ceilf.c: New file.
+ * m4/ceilf.m4: New file.
+ * lib/math.in.h (ceilf): New declaration.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_CEILF and
+ HAVE_DECL_CEILF.
+ * modules/math (Makefile.am): Substitute also GNULIB_CEILF and
+ HAVE_DECL_CEILF.
+ * doc/functions/ceilf.texi: Mention the 'ceilf' module.
+
+2007-10-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/floorl-tests: New file.
+ * tests/test-floorl.c: New file.
+
+ * modules/floorl: New file.
+ * lib/floorl.c: Replace entire file.
+ * m4/floorl.m4: New file.
+ * lib/math.in.h (floorl): Replace declaration.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_FLOORL.
+ * modules/math (Makefile.am): Substitute also GNULIB_FLOORL.
+ * doc/functions/floorl.texi: Mention the 'floorl' module.
+ * modules/mathl (Files): Remove lib/floorl.c.
+ (Depends-on): Add floorl.
+
+2007-10-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/floorf-tests: New file.
+ * tests/test-floorf.c: New file.
+
+ * modules/floorf: New file.
+ * lib/floor.c: New file.
+ * lib/floorf.c: New file.
+ * m4/floorf.m4: New file.
+ * lib/math.in.h (floorf): New declaration.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_FLOORF and
+ HAVE_DECL_FLOORF.
+ * modules/math (Makefile.am): Substitute also GNULIB_FLOORF and
+ HAVE_DECL_FLOORF.
+ * doc/functions/floorf.texi: Mention the 'floorf' module.
+
+2007-10-04 Benoit Sigoure <tsuna@lrde.epita.fr>
+ Bruno Haible <bruno@clisp.org>
+
+ Advertise for the Git server instead of the CVS server.
+ * doc/gnulib-intro.texi (Steady Development): Mention the Git
+ repository instead of the CVS one.
+ * doc/gnulib-tool.texi (VCS Issues): Renamed from "CVS Issues". Talk
+ about all VCS systems generically.
+ * doc/gnulib.texi (Introduction): Capitalize `Git'.
+
+2007-10-04 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi (Function Substitutes): Explain what an absent module
+ means.
+ Reported by Benoît Sigoure <tsuna@lrde.epita.fr>.
+
+2007-10-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/truncl-tests: New file.
+ * tests/test-truncl.c: New file.
+
+ * modules/truncl: New file.
+ * lib/truncl.c: New file.
+ * m4/truncl.m4: New file.
+ * lib/math.in.h (truncl): New declaration.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_TRUNCL and
+ HAVE_DECL_TRUNCL.
+ * modules/math (Makefile.am): Substitute also GNULIB_TRUNCL and
+ HAVE_DECL_TRUNCL.
+ * doc/functions/truncl.texi: Mention the 'truncl' module.
+
+2007-10-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/truncf-tests: New file.
+ * tests/test-truncf.c: New file.
+
+ * modules/truncf: New file.
+ * lib/trunc.c: Make paramerizable through USE_* macros.
+ * lib/truncf.c: New file.
+ * m4/truncf.m4: New file.
+ * lib/math.in.h (truncf): New declaration.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_TRUNCF and
+ HAVE_DECL_TRUNCF.
+ * modules/math (Makefile.am): Substitute also GNULIB_TRUNCF and
+ HAVE_DECL_TRUNCF.
+ * doc/functions/truncf.texi: Mention the 'truncf' module.
+
+2007-10-03 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_automake_snippet): Synthesize an EXTRA_DIST
+ augmentation also for tests modules.
+ * modules/argp-tests (Makefile.am): Remove EXTRA_DIST augmentation.
+ * modules/atexit-tests (Makefile.am): Likewise.
+ * modules/binary-io-tests (Makefile.am): Likewise.
+ * modules/c-strcase-tests (Makefile.am): Likewise.
+ * modules/canonicalize-lgpl-tests (Makefile.am): Likewise.
+ * modules/canonicalize-tests (Makefile.am): Likewise.
+ * modules/closein-tests (Makefile.am): Likewise.
+ * modules/fprintf-posix-tests (Makefile.am): Likewise.
+ * modules/freadahead-tests (Makefile.am): Likewise.
+ * modules/fseek-tests (Makefile.am): Likewise.
+ * modules/fseeko-tests (Makefile.am): Likewise.
+ * modules/ftell-tests (Makefile.am): Likewise.
+ * modules/ftello-tests (Makefile.am): Likewise.
+ * modules/isnanl-nolibm-tests (Makefile.am): Likewise.
+ * modules/isnanl-tests (Makefile.am): Likewise.
+ * modules/lseek-tests (Makefile.am): Likewise.
+ * modules/mbscasecmp-tests (Makefile.am): Likewise.
+ * modules/mbscasestr-tests (Makefile.am): Likewise.
+ * modules/mbschr-tests (Makefile.am): Likewise.
+ * modules/mbscspn-tests (Makefile.am): Likewise.
+ * modules/mbsncasecmp-tests (Makefile.am): Likewise.
+ * modules/mbspbrk-tests (Makefile.am): Likewise.
+ * modules/mbspcasecmp-tests (Makefile.am): Likewise.
+ * modules/mbsrchr-tests (Makefile.am): Likewise.
+ * modules/mbsspn-tests (Makefile.am): Likewise.
+ * modules/mbsstr-tests (Makefile.am): Likewise.
+ * modules/printf-posix-tests (Makefile.am): Likewise.
+ * modules/snprintf-posix-tests (Makefile.am): Likewise.
+ * modules/sprintf-posix-tests (Makefile.am): Likewise.
+ * modules/tsearch-tests (Makefile.am): Likewise.
+ * modules/uniname/uniname-tests (Makefile.am): Likewise.
+ * modules/unistdio/u16-vasnprintf-tests (Makefile.am): Likewise.
+ * modules/unistdio/u32-vasnprintf-tests (Makefile.am): Likewise.
+ * modules/unistdio/u8-vasnprintf-tests (Makefile.am): Likewise.
+ * modules/unistdio/ulc-vasnprintf-tests (Makefile.am): Likewise.
+ * modules/vasnprintf-posix-tests (Makefile.am): Likewise.
+ * modules/vfprintf-posix-tests (Makefile.am): Likewise.
+ * modules/vprintf-posix-tests (Makefile.am): Likewise.
+ * modules/vsnprintf-posix-tests (Makefile.am): Likewise.
+ * modules/vsprintf-posix-tests (Makefile.am): Likewise.
+ * modules/xstrtoimax-tests (Makefile.am): Likewise.
+ * modules/xstrtol-tests (Makefile.am): Likewise.
+ * modules/xstrtoumax-tests (Makefile.am): Likewise.
+ * modules/yesno-tests (Makefile.am): Likewise.
+
+2007-10-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/trunc-tests: New file.
+ * tests/test-trunc.c: New file.
+
+ * modules/trunc: New file.
+ * lib/trunc.c: New file.
+ * m4/trunc.m4: New file.
+ * lib/math.in.h (trunc): New declaration.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_TRUNC and
+ HAVE_DECL_TRUNC.
+ * modules/math (Makefile.am): Substitute also GNULIB_TRUNC and
+ HAVE_DECL_TRUNC.
+ * doc/functions/trunc.texi: Mention the 'trunc' module.
+
+2007-10-03 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fpending.c: New file, mostly copied
+ from coreutils/lib/t-fpending.c.
+ * modules/fpending-tests: New file.
+
+2007-10-03 Bruno Haible <bruno@clisp.org>
+
+ Port the stdio extensions to QNX (untested).
+ * lib/fseterr.c (fseterr): Add support for QNX.
+ * lib/fbufmode.c (fbufmode): Likewise.
+ * lib/freadable.c (freadable): Likewise.
+ * lib/fwritable.c (fwritable): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+ * lib/freadahead.c (freadahed): Likewise.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+
+2007-10-03 Bruno Haible <bruno@clisp.org>
+ Jim Meyering <jim@meyering.net>
+ Eric Blake <ebb9@byu.net>
+
+ * doc/relocatable.texi: Use @command instead of @program.
+
+2007-10-02 Jim Meyering <jim@meyering.net>
+
+ Perform one more "_.h" -> ".in.h" substitution.
+ * modules/unistd (Makefile.am) [unistd.h]: Use unistd.h.in
+ instead of unistd_.h here, too.
+
+2007-10-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_initmacro_done): Special case for alloca.c.
+ Needed for the alloca-opt module.
+
+2007-09-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/alloca.in.h: Renamed from lib/alloca_.h.
+ * modules/alloca-opt (Files, Makefile.am): Use alloca.in.h instead of
+ alloca_.h.
+ * lib/argz.in.h: Renamed from lib/argz_.h.
+ * modules/argz (Files, Makefile.am): Use argz.in.h instead of argz_.h.
+ * lib/byteswap.in.h: Renamed from lib/byteswap_.h.
+ * modules/byteswap (Files, Makefile.am): Use byteswap.in.h instead of
+ byteswap_.h.
+ * lib/dirent.in.h: Renamed from lib/dirent_.h.
+ * modules/fchdir (Files, Makefile.am): Use dirent.in.h instead of
+ dirent_.h.
+ * lib/fcntl.in.h: Renamed from lib/fcntl_.h.
+ * modules/fcntl (Files, Makefile.am): Use fcntl.in.h instead of
+ fcntl_.h.
+ * lib/float.in.h: Renamed from lib/float_.h.
+ * modules/float (Files, Makefile.am): Use float.in.h instead of
+ float_.h.
+ * lib/fnmatch.in.h: Renamed from lib/fnmatch_.h.
+ * modules/fnmatch (Files, Makefile.am): Use fnmatch.in.h instead of
+ fnmatch_.h.
+ * lib/getopt.in.h: Renamed from lib/getopt_.h.
+ * modules/getopt (Files, Makefile.am): Use getopt.in.h instead of
+ getopt_.h.
+ * lib/glob.in.h: Renamed from lib/glob_.h.
+ * modules/glob (Files, Makefile.am): Use glob.in.h instead of glob_.h.
+ * lib/iconv.in.h: Renamed from lib/iconv_.h.
+ * modules/iconv_open (Files, Makefile.am): Use iconv.in.h instead of
+ iconv_.h.
+ * lib/inttypes.in.h: Renamed from lib/inttypes_.h.
+ * modules/inttypes (Files, Makefile.am): Use inttypes.in.h instead of
+ inttypes_.h.
+ * lib/locale.in.h: Renamed from lib/locale_.h.
+ * modules/locale (Files, Makefile.am): Use locale.in.h instead of
+ locale_.h.
+ * lib/math.in.h: Renamed from lib/math_.h.
+ * modules/math (Files, Makefile.am): Use math.in.h instead of math_.h.
+ * lib/netinet_in.in.h: Renamed from lib/netinet_in_.h.
+ * modules/netinet_in (Files, Makefile.am): Use netinet_in.in.h instead
+ of netinet_in_.h. Add dependency.
+ * lib/poll.in.h: Renamed from lib/poll_.h.
+ * modules/poll (Files, Makefile.am): Use poll.in.h instead of poll_.h.
+ * lib/search.in.h: Renamed from lib/search_.h.
+ * modules/search (Files, Makefile.am): Use search.in.h instead of
+ search_.h.
+ * lib/signal.in.h: Renamed from lib/signal_.h.
+ * modules/signal (Files, Makefile.am): Use signal.in.h instead of
+ _signal.h.
+ * lib/stdbool.in.h: Renamed from lib/stdbool_.h.
+ * modules/stdbool (Files, Makefile.am): Use stdbool.in.h instead of
+ stdbool_.h.
+ * lib/stdint.in.h: Renamed from lib/stdint_.h.
+ * modules/stdint (Files, Makefile.am): Use stdint.in.h instead of
+ stdint_.h.
+ * lib/stdio.in.h: Renamed from lib/stdio_.h.
+ * modules/stdio (Files, Makefile.am): Use stdio.in.h instead of
+ stdio_.h.
+ * lib/stdlib.in.h: Renamed from lib/stdlib_.h.
+ * modules/stdlib (Files, Makefile.am): Use stdlib.in.h instead of
+ stdlib_.h.
+ * lib/string.in.h: Renamed from lib/string_.h.
+ * modules/string (Files, Makefile.am): Use string.in.h instead of
+ string_.h.
+ * doc/gnulib-tool.texi (Initial import): Update.
+ * lib/sys_select.in.h: Renamed from lib/sys_select_.h.
+ * modules/sys_select (Files, Makefile.am): Use sys_select.in.h instead
+ of sys_select_.h. Add dependency.
+ * lib/sys_socket.in.h: Renamed from lib/sys_socket_.h.
+ * modules/sys_socket (Files, Makefile.am): Use sys_socket.in.h instead
+ of sys_socket_.h.
+ * lib/sys_stat.in.h: Renamed from lib/sys_stat_.h.
+ * modules/sys_stat (Files, Makefile.am): Use sys_stat.in.h instead of
+ sys_stat_.h.
+ * lib/sys_time.in.h: Renamed from lib/sys_time_.h.
+ * modules/sys_time (Files, Makefile.am): Use sys_time.in.h instead of
+ sys_time_.h.
+ * lib/sysexits.in.h: Renamed from lib/sysexits_.h.
+ * modules/sysexits (Files, Makefile.am): Use sysexits.in.h instead of
+ sysexits_.h.
+ * lib/time.in.h: Renamed from lib/time_.h.
+ * modules/time (Files, Makefile.am): Use time.in.h instead of time_.h.
+ * lib/unistd.in.h: Renamed from lib/unistd_.h.
+ * modules/unistd (Files, Makefile.am): Use unistd.in.h instead of
+ unistd_.h.
+ * lib/wchar.in.h: Renamed from lib/wchar_.h.
+ * modules/wchar (Files, Makefile.am): Use wchar.in.h instead of
+ wchar_.h.
+ * lib/wctype.in.h: Renamed from lib/wctype_.h.
+ * modules/wctype (Files, Makefile.am): Use wctype.in.h instead of
+ wctype_.h.
+ * build-aux/bootstrap (slurp): Update.
+ * lib/.cppi-disable: Update.
+
+2007-09-30 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-getaddrinfo.c (AF_UNSPEC): Provide a fallback definition.
+ Needed on BeOS.
+
+2007-09-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/dirname-tests (check_PROGRAMS): Renamed from noinst_PROGRAMS.
+
+2007-09-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h (getdelim, getline): Add identifiers. Doc tweak.
+
+2007-09-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/xreadlink.c (xreadlink): Simplify to a wrapper around areadlink.
+ * modules/xreadlink (Depends-on): Add areadlink, remove readlink etc.
+ * build-aux/install-reloc: Compile also areadlink.c.
+ * modules/relocatable-prog-wrapper (Files): Add lib/areadlink.[hc].
+
+2007-09-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_initmacro_done): Indentation.
+
+2007-09-29 Bruno Haible <bruno@clisp.org>
+
+ * README: Add CVS checkout update instructions.
+ Info from Bob Proulx <bob@proulx.com>.
+
+2007-09-28 Eric Blake <ebb9@byu.net>
+
+ Provide move-if-change.
+ * build-aux/move-if-change: New file, based on best practice
+ rather than any canonical upstream location.
+
+2007-09-28 Jim Meyering <jim@meyering.net>
+
+ Fix canonicalize loop-detection corner case.
+ Do not attempt to stat the symlink values stored via seen_triple.
+ Without this, coreutils' tests/misc/readlink-fp-loop test would fail
+ on linux-2.6.18, (but not 2.6.22).
+ * lib/canonicalize.c (seen_triple): Use triple_compare_ino_str, not
+ triple_compare. The former compares dev,ino,filename, while the latter
+ would actually stat dirname(filename) when dev and ino were equal.
+ * lib/hash-triple.c: Install <string.h>.
+ (STREQ): Define.
+ (triple_compare_ino_str): New function.
+ * lib/hash-triple.h (triple_compare_ino_str): Declare it.
+
+2007-09-28 Eric Blake <ebb9@byu.net>
+
+ Enforce that AC_REPLACE_FUNCS files exist.
+ * gnulib-tool (func_emit_initmacro_done): Make AC_LIBSOURCES
+ override check for typos.
+
+ Fix test-closein on Solaris 10.
+ * tests/test-closein.c (main): Don't assume stdin can be inherited
+ closed on all systems.
+ * tests/test-closein.sh: Likewise.
+ Reported by Piotr Tarnowski.
+
+2007-09-28 Jim Meyering <jim@meyering.net>
+
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Fix typo in comment.
+
+2007-09-27 Jim Meyering <jim@meyering.net>
+
+ canonicalize: Avoid a false-positive cycle failure.
+ * modules/canonicalize (Depends-on): Add file-set and hash-triple.
+ Sort. Remove cycle-check.
+ * lib/canonicalize.c: Include file-set.h and hash-triple.h,
+ not cycle-check.h.
+ (seen_triple): New function.
+ (canonicalize_filename_mode): Use it instead of cycle-check.
+ * tests/test-canonicalize.c: Add a test for this bug.
+ * tests/test-canonicalize.sh: Set up and run the test.
+
+ New module, file-set, from coreutils.
+ * modules/file-set: Define it.
+ * lib/file-set.c, lib/file-set.h: Implement.
+
+ New module, hash-triple, from coreutils.
+ * modules/hash-triple: Define it.
+ * lib/hash-triple.c, lib/hash-triple.h: Implement.
+
+2007-09-25 Eric Blake <ebb9@byu.net>
+
+ Fix strerror on Interix.
+ * lib/string_.h (strerror): Declare replacement.
+ * doc/functions/strerror.texi (strerror): Document the Interix
+ shortcoming.
+ * modules/string (Makefile.am): Support new hooks.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Add new hooks.
+ * m4/strerror.m4 (gl_FUNC_STRERROR): Defer to
+ gl_FUNC_STRERROR_SEPARATE.
+ (gl_FUNC_STRERROR_SEPARATE): Check for Interix bug.
+ * lib/strerror.c (rpl_strerror): Provide replacement.
+ * modules/strerror (Depends-on): Add string.
+ (configure.ac): Detect use of module.
+ * tests/test-strerror.c: New file.
+ * modules/strerror-tests: New test module.
+ * modules/argp (Depends-on): Add strerror.
+ * modules/error (Depends-on): Likewise.
+ Reported by Martin Koeppe.
+
+2007-09-24 Bruno Haible <bruno@clisp.org>
+
+ * README: Update git instructions.
+
+2007-09-24 Eric Blake <ebb9@byu.net>
+
+ Revert fpending breakage from 2007-09-08.
+ * m4/fpending.m4 (gl_FUNC_FPENDING): Don't require existence of
+ __fpending.c.
+
+2007-09-24 Jim Meyering <jim@meyering.net>
+
+ filenamecat.c: Add a test.
+ * lib/filenamecat.c (main) [TEST_FILE_NAME_CONCAT]: Add a test
+ showing how the function works when DIR is the empty string.
+
+2007-09-21 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-canonicalize.sh: Turn on executable bit.
+
+2007-09-19 Eric Blake <ebb9@byu.net>
+
+ * README: Update CVS instructions.
+
+2007-09-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/areadlink: New file.
+ * lib/areadlink.h (areadlink): New declaration.
+ * lib/areadlink.c: New file, based on lib/xreadlink.c.
+
+2007-09-17 Jim Meyering <jim@meyering.net>
+
+ * lib/savewd.c (ESTALE) [!defined]: Define.
+ Reported to be required on Interix by Martin Koeppe.
+
+2007-09-17 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_version): Use $version.
+
+2007-09-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_LONG_DOUBLE, gl_PRINTF_INFINITE,
+ gl_PRINTF_INFINITE_LONG_DOUBLE): Increase buf's size from 100 to 10000.
+ Needed on glibc-2.6.1 with -fstack-protector -D_FORTIFY_SOURCE=2.
+ Reported by Greg Schafer <gschafer@zip.com.au>.
+
+2007-09-15 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (sed): Try a little harder to make bash understand the
+ alias.
+ Reported by Bruce Korb <bruce.korb@gmail.com>.
+
+2007-09-13 Eric Blake <ebb9@byu.net>
+
+ * ChangeLog: Remove conflict markers.
+
+2007-09-13 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc-gnulib.c (gc_hash_open): Catch NULL calloc return value.
+ Reported by Bruno Haible <bruno@clisp.org>.
+
+2007-09-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/lock.m4: Don't provide an AC_USE_SYSTEM_EXTENSIONS definition.
+ (gl_LOCK_EARLY_BODY): Use AC_GNU_SOURCE when AC_USE_SYSTEM_EXTENSIONS
+ is not defined.
+
+2007-09-12 Eric Blake <ebb9@byu.net>
+
+ Track CVS Autoconf on AC_USE_SYSTEM_EXTENSIONS.
+ * m4/extensions.m4 (AC_USE_SYSTEM_EXTENSIONS): Update to CVS
+ Autoconf definition.
+ * modules/euidaccess (Depends-on): Add extensions, for
+ AC_USE_SYSTEM_EXTENSIONS with autoconf <= 2.59.
+ * modules/fnmatch (Depends-on): Likewise.
+ * modules/getaddrinfo (Depends-on): Likewise.
+ * modules/getdelim (Depends-on): Likewise.
+ * modules/getline (Depends-on): Likewise.
+ * modules/getsubopt (Depends-on): Likewise.
+ * modules/gettext (Depends-on): Likewise.
+ * modules/group-member (Depends-on): Likewise.
+ * modules/mbchar (Depends-on): Likewise.
+ * modules/memmem (Depends-on): Likewise.
+ * modules/mempcpy (Depends-on): Likewise.
+ * modules/memrchr (Depends-on): Likewise.
+ * modules/pagealign_alloc (Depends-on): Likewise.
+ * modules/readutmp (Depends-on): Likewise.
+ * modules/stpcpy (Depends-on): Likewise.
+ * modules/stpncpy (Depends-on): Likewise.
+ * modules/strchrnul (Depends-on): Likewise.
+ * modules/strndup (Depends-on): Likewise.
+ * modules/strsep (Depends-on): Likewise.
+ * modules/strverscmp (Depends-on): Likewise.
+ * modules/vasprintf (Depends-on): Likewise.
+ * modules/wcwidth (Depends-on): Likewise.
+ * m4/euidaccess.m4 (gl_FUNC_EUIDACCESS): AC_GNU_SOURCE will be
+ obsolete in Autoconf 2.62; use AC_USE_SYSTEM_EXTENSIONS instead.
+ * m4/fnmatch.m4 (gl_FUNC_FNMATCH_GNU): Likewise.
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDR_INFO): Likewise.
+ * m4/getdelim.m4 (gl_FUNC_GETDELIM): Likewise.
+ * m4/getline.m4 (gl_FUNC_GETLINE): Likewise.
+ * m4/getsubopt.m4 (gl_FUNC_GETSUBOPT): Likewise.
+ * m4/glob.m4 (gl_PREREQ_GLOB): Likewise.
+ * m4/group-member.m4 (gl_FUNC_GROUP_MEMBER): Likewise.
+ * m4/mbchar.m4 (gl_MBCHAR): Likewise.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): Likewise.
+ * m4/mempcpy.m4 (gl_FUNC_MEMPCPY): Likewise.
+ * m4/memrchr.m4 (gl_FUNC_MEMRCHR): Likewise.
+ * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Likewise.
+ * m4/pagealign_alloc.m4 (gl_PAGEALIGN_ALLOC): Likewise.
+ * m4/readutmp.m4 (gl_READUTMP): Likewise.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Likewise.
+ * m4/stpcpy.m4 (gl_FUNC_STPCPY): Likewise.
+ * m4/stpncpy.m4 (gl_FUNC_STPNCPY): Likewise.
+ * m4/strchrnul.m4 (gl_FUNC_STRCHRNUL): Likewise.
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): Likewise.
+ * m4/strnlen.m4 (gl_FUNC_STRNLEN): Likewise.
+ * m4/strsep.m4 (gl_FUNC_STRSEP): Likewise.
+ * m4/strverscmp.m4 (gl_FUNC_STRVERSCMP): Likewise.
+ * m4/vasprintf.m4 (gl_PREREQ_VASPRINTF_H): Likewise.
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Likewise.
+ * m4/lock.m4 (gl_LOCK_EARLY_BODY): Likewise, but provide fallback,
+ so that lock.m4 can be used in gettext without extensions module.
+
+2007-09-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/isc-posix.m4: Remove file.
+ Suggested by Eric Blake.
+
+2007-09-11 Eric Blake <ebb9@byu.net>
+
+ * ChangeLog: Restore lines accidentally truncated 2007-04-06.
+
+2007-09-10 Bruno Haible <bruno@clisp.org>
+
+ * posix-modules: Fix typo in error message.
+ Reported by Matt <mkraai@beckman.com>.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions/getdelim.texi: Update list of platforms lacking the
+ function.
+ * doc/functions/getline.texi: Likewise.
+
+2007-09-09 Jim Meyering <jim@meyering.net>
+
+ * lib/hash.c (hash_initialize): Detect calloc failure.
+ Reported by Bruno Haible.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/canonicalize-lgpl.c (__realpath): Set errno to ENOMEM when
+ malloc or realloc fails.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/getcwd (Depends-on): Add malloc-posix.
+ * modules/glob (Depends-on): Likewise.
+ * modules/putenv (Depends-on): Likewise.
+ * modules/strdup (Depends-on): Likewise.
+ * modules/getdelim (Depends-on): Add realloc-posix.
+ * modules/read-file (Depends-on): Likewise.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/malloc.m4 (gl_CHECK_MALLOC_POSIX): New macro.
+ (gl_FUNC_MALLOC_POSIX): Require it.
+ * m4/realloc.m4 (gl_FUNC_REALLOC_POSIX): Likewise.
+ * m4/calloc.m4 (gl_FUNC_CALLOC_POSIX): Likewise.
+ * modules/realloc (Files): Add m4/malloc.m4.
+ * modules/calloc (Files): Likewise.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/malloc-posix: New file.
+ * modules/malloc (Depends-on): Add malloc-posix.
+ * lib/malloc.c: Include errno.h.
+ (rpl_malloc): Merge the requirements of a glibc-compatible malloc
+ and a POSIX-compatible malloc into a single function. Set ENOMEM
+ when returning NULL.
+ * m4/malloc.m4: New file.
+ * doc/functions/malloc.texi: Mention the malloc-posix module.
+ * lib/stdlib_.h (malloc): New declaration.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize
+ GNULIB_MALLOC_POSIX and HAVE_MALLOC_POSIX.
+ * modules/stdlib (stdlib.h): Substitute also GNULIB_MALLOC_POSIX
+ and HAVE_MALLOC_POSIX.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/realloc-posix: New file.
+ * modules/realloc (Depends-on): Add realloc-posix.
+ * lib/realloc.c: Include errno.h.
+ (rpl_realloc): Merge the requirements of a glibc-compatible realloc
+ and a POSIX-compatible realloc into a single function. Set ENOMEM
+ when returning NULL.
+ * m4/realloc.m4: New file.
+ * doc/functions/realloc.texi: Mention the realloc-posix module.
+ * lib/stdlib_.h (realloc): New declaration.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize
+ GNULIB_REALLOC_POSIX and HAVE_REALLOC_POSIX.
+ * modules/stdlib (stdlib.h): Substitute also GNULIB_REALLOC_POSIX
+ and HAVE_REALLOC_POSIX.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/calloc-posix: New file.
+ * modules/calloc (Depends-on): Add calloc-posix.
+ * lib/calloc.c: Include errno.h.
+ (rpl_calloc): Merge the requirements of a glibc-compatible calloc
+ and a POSIX-compatible calloc into a single function. Set ENOMEM
+ when returning NULL.
+ * m4/calloc.m4 (gl_FUNC_CALLOC_POSIX): New macro.
+ * doc/functions/calloc.texi: Mention the calloc-posix module.
+ * lib/stdlib_.h (calloc): New declaration.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize
+ GNULIB_CALLOC_POSIX and HAVE_CALLOC_POSIX.
+ * modules/stdlib (stdlib.h): Substitute also GNULIB_CALLOC_POSIX
+ and HAVE_CALLOC_POSIX.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ Allow for modules to show an arbitrary notice.
+ * modules/TEMPLATE-EXTENDED: Add 'Notice' field.
+ * gnulib-tool: New option --extract-notice.
+ (func_usage): Document it.
+ (sed_extract_prog): Update.
+ (func_get_notice): New function.
+ (func_modules_notice): New function.
+ (func_import, func_create_testdir): Invoke it.
+ Suggested by Jim Meyering.
+
+2007-09-09 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: New options --verbose, --quiet.
+ (func_usage): Document them.
+ (verbose): New variable.
+ (func_execute_command): New function.
+ (func_import): Don't show the module list and the file list if
+ $verbose < 0.
+ (func_create_testdir): Likewise. Use func_execute_command.
+ (func_create_megatestdir): Use func_execute_command.
+
+2007-09-08 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Prefer rsync over wget when available,
+ for fetching the PO files.
+
+2007-09-08 Bruno Haible <bruno@clisp.org>
+
+ * posix-modules: New file. Portions copied from gnulib-tool.
+ * doc/gnulib.texi (POSIX Substitutes Library): New chapter.
+
+2007-09-08 Jim Meyering <jim@meyering.net>
+
+ Rename __fpending.c -> fpending.c and __fpending.h -> fpending.h
+ * lib/fpending.h: Rename from __fpending.h.
+ * lib/fpending.c: Rename from __fpending.c.
+ Include "fpending.h", not "__fpending.h".
+ * lib/__fpending.h, lib/__fpending.c: Remove files.
+ * modules/fpending (Files): Reflect new file names.
+ * lib/close-stream.c: Include "fpending.h", not "__fpending.h".
+
+2007-09-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/inttypes-h.m4: Remove stub file.
+
+2007-09-07 Simon Josefsson <simon@josefsson.org>
+
+ * doc/headers/stdint.texi: Discuss #include_next issue.
+
+2007-09-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * build-aux/bootstrap: Remove obsolete comment about wget --help.
+
+2007-09-06 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * m4/time_h.m4 (gl_CHECK_TYPE_STRUCT_TIMESPEC): Fix misspelling
+ in variable name.
+
+2007-09-03 Jim Meyering <jim@meyering.net>
+
+ New module: git-version-gen.
+ * modules/git-version-gen: New file.
+
+ Import changes from coreutils for bootstrap script.
+
+ * build-aux/bootstrap (WGET_COMMAND): Remove code to set this variable.
+
+ bootstrap: uses rsync to download the .po files
+ * build-aux/bootstrap (po_download_command_format): New global.
+ (download_po_files): Use rsync.
+ (update_po_files): Don't remove .po files after download,
+ so future rsync runs can take advantage of the copies.
+
+ * build-aux/bootstrap (gnulib_tool): Make sha1sum check quietly.
+
+ Solve the unnecessary-.po-file-regeneration problem once and for all.
+ * build-aux/bootstrap (download_po_files): New function, renamed from
+ get_translations. Now, downloads, but doesn't update LINGUAS.
+ (update_po_files): New function.
+
+ bootstrap: Ignore more.
+ * build-aux/bootstrap (symlink_to_dir): Add a directory name like
+ uniwidth to e.g., lib/.gitignore.
+ (slurp): Handle the sys_stat_.h -> sys mapping, too.
+
+ * build-aux/bootstrap: New setting: vc_ignore.
+ (insert_sorted_if_absent): Create $file if absent.
+ Adapt to new, possibly empty, list: $vc_ignore.
+
+ bootstrap: generate more ignorable names
+ * build-aux/bootstrap (slurp): When generating ignorable names,
+ also map .sin to .sed, .gperf to .c, and .y to .c.
+
+2007-09-03 Jim Meyering <jim@meyering.net>
+
+ * build-aux/git-version-gen: New file, from coreutils. For details, see
+ http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=bfe49f506
+
+2007-09-02 Bruno Haible <bruno@clisp.org>
+
+ Fix mis-recognition of 'mcs' on QNX 6.
+ * m4/csharpcomp.m4 (gt_CSHARPCOMP): Test whether the "mcs --version"
+ output contains the string "Mono".
+ * lib/csharpcomp.c (compile_csharp_using_mono): Likewise.
+ Reported by <kraai@ftbfs.org> at <https://savannah.gnu.org/bugs/?18337>.
+
+2007-09-01 Bruno Haible <bruno@clisp.org>
+
+ Fix collision between uniwidth/* and linebreak modules.
+ * lib/linebreak.h (locale_charset, uc_width, u8_width, u16_width,
+ u32_width): Remove declarations.
+ * lib/linebreak.c: Include uniwidth.h, uniwidth/cjk.h, streq.h.
+ (u32_mbtouc_unsafe, streq9, streq8, streq7, streq6, streq5, streq4,
+ streq3, streq2, streq1, streq0): Remove functions.
+ (STREQ): Remove macro.
+ (is_cjk_encoding): Remove function.
+ (nonspacing_table_data, nonspacing_table_ind): Remove constants.
+ (uc_width, u8_width, u16_width, u32_width): Remove functions.
+ * modules/linebreak (Depends-on): Add streq, uniwidth/width.
+ * NEWS: Document the change.
+
+2007-09-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/streq.h: Add double-inclusion guard.
+
+2007-09-01 Karl Berry <karl@gnu.org>
+
+ * MODULES.html.sh: Rename mreadlink_with_size to areadlink_with_size.
+
+2007-08-28 Jim Meyering <jim@meyering.net>
+
+ Rename mreadlink_with_size to areadlink_with_size.
+ * NEWS: Document the change.
+ * lib/mreadlink-with-size.c (mreadlink_with_size): Rename this to...
+ * lib/areadlink-with-size.c (areadlink_with_size): ...this.
+ * lib/mreadlink.h: Rename this to...
+ * lib/areadlink.h: ...this.
+ * modules/mreadlink-with-size: Rename this to...
+ * modules/areadlink-with-size: ...this.
+ * lib/canonicalize.c: Reflect the renaming.
+ * modules/canonicalize: Likewise.
+
+2007-08-26 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): When deciding which files to remove,
+ consider also dangling symbolic links.
+ Reported by Eric Blake.
+
+2007-08-26 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_ln_if_changed): Use "test -h", not "test -L".
+
+2007-08-23 Simon Josefsson <simon@josefsson.org>
+
+ * lib/readline.c: Don't include getline.h, the prototype is now
+ found in stdio.h.
+
+2007-08-23 Jim Meyering <jim@meyering.net>
+
+ Getdelim touchup.
+ * lib/getdelim.c (getdelim): Don't bother to save/restore errno
+ around the funlockfile call, since funlockfile never sets errno.
+ Don't set errno upon failed realloc.
+
+2007-08-22 Eric Blake <ebb9@byu.net>
+
+ Getline touchups.
+ * lib/getdelim.c (getdelim): Revert regression that required *n to
+ be 0 when *lineptr is NULL. Preserve errno across funlockfile.
+ * m4/getdelim.m4 (gl_FUNC_GETDELIM): Check for declaration of
+ getdelim, rather than whether implementation is missing.
+ * m4/getline.m4 (gl_FUNC_GETLINE): Likewise for getline.
+ * lib/stdio_.h (getline): Also declare if replacement is
+ required.
+ * doc/functions/getdelim.texi: New file.
+ * doc/functions/getline.texi: Likewise.
+ * doc/gnulib.texi (Function Substitutes): Add new files.
+ Reported by Bruno Haible.
+
+2007-08-22 Ludovic Courtès <ludo@gnu.org>
+
+ * users.txt: Add Guile.
+
+2007-08-22 Eric Blake <ebb9@byu.net>
+
+ * tests/test-getdelim.c (main): Use remove, not unlink.
+ * tests/test-getline.c (main): Likewise.
+
+ Move getline and getdelim into stdio.h, per POSIX 200x.
+ * modules/getline (Files): Remove getline.h.
+ (Depends-on): Add stdio.
+ (configure.ac): Add module indicator.
+ * modules/getdelim (Files): Remove getdelim.h.
+ (Depends-on): Add stdio.
+ (configure.ac): Add module indicator.
+ * modules/stdio (Makefile.am): Work with new indicators.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Add new defaults.
+ * m4/getdelim.m4 (gl_FUNC_GETDELIM): Work with stdio needs.
+ * m4/getline.m4 (gl_FUNC_GETLINE): Likewise.
+ * lib/getdelim.h: Delete.
+ * lib/getline.h: Delete.
+ * lib/stdio_.h (getdelim, getline): Declare.
+ * modules/getdelim-tests: New module.
+ * modules/getline-tests: Likewise.
+ * tests/test-getdelim.c: New file.
+ * tests/test-getline.c: Likewise.
+ * NEWS: Document the change.
+ * lib/getline.c: Update choice of header.
+ * lib/csharpcomp.c: Likewise.
+ * lib/getpass.c: Likewise.
+ * lib/javacomp.c: Likewise.
+ * lib/javaversion.c: Likewise.
+ * lib/yesno.c: Likewise.
+ * lib/getdelim.c: Likewise.
+ (getdelim): Set errno on failure, and avoid memory leak.
+
+2007-08-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/closein (Depends-on): Add freadahead.
+ * lib/closein.c: Include freadahead.h.
+ (close_stdin): Skip the fseeko and fflush calls if freadahead(stdin)
+ is zero.
+
+2007-08-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/freadahead-tests: New file.
+ * tests/test-freadahead.sh: New file.
+ * tests/test-freadahead.c: New file.
+
+ * modules/freadahead: New file.
+ * lib/freadahead.h: New file.
+ * lib/freadahead.c: New file.
+ * MODULES.html.sh (File stream based Input/Output): Add freadahead,
+ fbufmode, fpurge, freadable, fwritable.
+
+2007-08-19 Eric Blake <ebb9@byu.net>
+
+ Test yesno in combination with closein.
+ * lib/yesno.c (yesno): Document use of stdin.
+ * modules/yesno-tests (Files): New module.
+ * tests/test-yesno.c (main): New file.
+ * tests/test-yesno.sh: Likewise.
+
+2007-08-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/fbufmode.c (fbufmode): Add tentative support for Solaris/AMD64.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ * lib/fseterr.c (fseterr): Likewise.
+
+2007-08-19 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-lseek.c (main): Disable a test for BeOS.
+ * doc/functions/lseek.texi: Document the BeOS bug.
+
+2007-08-19 Bruno Haible <bruno@clisp.org>
+ Eric Blake <ebb9@byu.net>
+
+ * lib/lseek.c: Include <sys/stat.h>.
+ (rpl_lseek): Add workaround code also for Unix platforms.
+ Needed for BeOS.
+ * m4/lseek.m4 (gl_FUNC_LSEEK): When cross-compiling, fail on BeOS.
+ * doc/functions/lseek.texi: Document BeOS definiency.
+
+2007-08-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/fstrcmp-tests: New file.
+ * tests/test-fstrcmp.c: New file.
+
+2007-08-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/fstrcmp: New file, from GNU gettext with modifications.
+ * lib/fstrcmp.h: New file, from GNU gettext.
+ * lib/fstrcmp.c: New file, from GNU gettext.
+ * MODULES.html.sh (String handling): Add fstrcmp.
+
+2007-08-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/diffseq.h (struct context): Change type of 'heuristic' field to
+ 'bool'.
+ (diag, compareseq): Remove const from the ctxt argument.
+ (USE_HEURISTIC): Undefine at the end.
+
+2007-08-18 Jim Meyering <jim@meyering.net>
+
+ New file: lib/idcache.h
+ * NEWS: Mention the addition.
+ * modules/idcache (Files): Add lib/idcache.h
+ * lib/idcache.c: Include "idcache.h".
+ Don't include <sys/types.h>.
+ Add a FIXME comment.
+ Move file-scoped "static" declarations to the top.
+ * lib/idcache.h: New file. Include <sys/types.h> here, instead.
+
+2007-08-17 Bruno Haible <bruno@clisp.org>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh: Add diffseq.
+ * modules/diffseq: New file.
+ * lib/diffseq.h: New file, from GNU gettext with a few minor changes,
+ extracted from GNU gettext's fstrcmp.c and GNU diff's analyze.c.
+
+2007-08-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ Import changes from coreutils for bootstrap script.
+
+ 2007-07-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * build-aux/bootstrap (slurp): Work even in environments where
+ "ls" defaults to "ls -A". Put in a FIXME, though, since the
+ current code does not slurp files whose names start with ".", and
+ this looks like it might be a troublesome area.
+
+ 2007-07-11 Jim Meyering <jim@meyering.net>
+
+ If there's a GPL vN copyright comment, require that N == 3.
+
+ 2007-07-08 Jim Meyering <jim@meyering.net>
+
+ Run the coreutils-specific code only if tests/Makefile.am.in exists.
+ * build-aux/bootstrap (mam_template): Move definition out of loop.
+
+ Create symlinks for gl/{lib,m4}/*, just as for gnulib/{lib,m4}/*.
+
+ * build-aux/bootstrap (symlink_to_dir): Rename function from
+ symlink_to_gnulib. Add a directory parameter. Update all
+ callers.
+ (cp_mark_as_generated): Also check for -- and link to -- files in
+ gl/.
+
+ 2007-07-08 Jim Meyering <jim@meyering.net>
+
+ Adapt to deeper hierarchy in gnulib.
+ * build-aux/bootstrap (symlink_to_dir): If the destination
+ directory doesn't exist, create it. This is required at least for
+ "lib/uniwidth/cjk.h".
+
+ 2007-05-15 Jim Meyering <jim@meyering.net>
+
+ * build-aux/bootstrap: Now that generated Makefile.am files
+ are no longer under version control, they must be created at
+ bootstrap time.
+
+2007-08-14 Ben Pfaff <blp@gnu.org>
+
+ * lib/count-one-bits.h: Add comments. From Bruno Haible.
+
+2007-08-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/count-one-bits.h: Don't include <limits.h>; no longer needed
+ given the changes below.
+ (COUNT_ONE_BITS): Use 'verify' rather than 'verify_true'. Work
+ even on hosts that have padding bits beyond the supported 64.
+
+2007-08-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * NEWS: In xstrtol, remove STRTOL_FATAL_ERROR and add xstrtol_fatal.
+ * lib/xstrtol.h: Don't include exitfail.h; that's now internal to
+ xstrtol.c. Include getopt.h, since xstrtol_fatal's signature
+ depends on it.
+ (xstrtol_error): Remove.
+ (xstrtol_fatal): New decl, replacing the functionality of xstrtol_error
+ but with a different signature.
+ (ATTRIBUTE_NORETURN, __attribute__): New macros.
+ * lib/xstrtol-error.c: Include exitfail.h.
+ (xstrtol_fatal): New function, with a different signature from the
+ old xstrtol_error, so that the caller need not worry about passing
+ in an exit status, or about storage management of the option argument.
+ (xstrtol_error): Now a static function. Redo signature to
+ implement xstrtol_fatal. Output the correct number of hyphens in
+ front of the option so that the caller need not worry about
+ storage management.
+ (N_): New macro.
+ (_): Remove; not used now.
+ * modules/xstrtol: Depend on getopt.
+ * tests/test-xstrtol.c (main): Use new xstrtol_error function instead
+ of old STRTOL_FATAL_ERROR macro.
+ * tests/test-xstrtol.sh (t-xstrtol.xo): Adjust to match new behavior
+ of test program.
+ * tests/test-xstrtoimax.sh (t-xstrtoimax.xo): Likewise.
+ * tests/test-xstrtoumax.sh (t-xstrtoumax.xo): Likewise.
+
+2007-08-08 Eric Blake <ebb9@byu.net>
+
+ * lib/xstrtol-error.c: Add missing include.
+
+ Move xstrtol messages into gnulib domain, when --pobase is used.
+ * lib/xstrtol.h (_STRTOL_ERROR): Move messages out of macro...
+ * lib/xstrtol-error.c (xstrtol_error): ...into new file.
+ * modules/xstrtol (Files): Distribute new file.
+ * m4/xstrtol.m4 (gl_XSTRTOL): Build new file.
+ * lib/xstrtol.c (TESTING_XSTRTO): Move tests...
+ * tests/test-xstrtol.c: ...into new file.
+ * tests/test-xstrtoul.c: Also test xstrtoul.
+ * tests/test-xstrtoimax.c: Also test xstrtoimax.
+ * tests/test-xstrtoumax.c: Also test xstrtoumax.
+ * tests/test-xstrtol.sh: Drive the tests.
+ * tests/test-xstrtoimax.sh: Likewise.
+ * tests/test-xstrtoumax.sh: Likewise.
+ * modules/xstrtol-tests: New module.
+ * modules/xstrtoimax-tests: Likewise.
+ * modules/xstrtoumax-tests: Likewise.
+
+2007-08-08 Jim Meyering <jim@meyering.net>
+
+ New function: mfile_name_concat.
+ * lib/filenamecat.c (mfile_name_concat): New function, just like
+ file_name_concat, but return NULL upon failure rather than exiting
+ with a diagnostic.
+ * lib/filenamecat.h: Declare it.
+
+2007-08-07 Bruno Haible <bruno@clisp.org>
+
+ * m4/inttypes.m4 (gl_INTTYPES_H): Use GL_TRIGGER_STDC_LIMIT_MACROS
+ instead of __STDC_LIMIT_MACROS_TRIGGER. This avoids a redefinition
+ warning from gcc.
+ Reported by Eric Blake.
+
+2007-08-07 Simon Josefsson <simon@josefsson.org>
+
+ * modules/crypto/arctwo (License): Use the synonymous term "LGPLv2+".
+ * modules/crypto/arcfour (License): Likewise.
+ * modules/crypto/des-tests (License): Likewise.
+ * modules/crypto/gc-arctwo-tests (License): Likewise.
+ * modules/crypto/gc-des-tests (License): Likewise.
+ * modules/crypto/gc-hmac-md5-tests (License): Likewise.
+ * modules/crypto/gc-hmac-sha1-tests (License): Likewise.
+ * modules/crypto/gc-md2-tests (License): Likewise.
+ * modules/crypto/gc-md4-tests (License): Likewise.
+ * modules/crypto/gc-md5-tests (License): Likewise.
+ * modules/crypto/gc-pbkdf2-sha1-tests (License): Likewise.
+ * modules/crypto/gc-rijndael-tests (License): Likewise.
+ * modules/crypto/gc-sha1-tests (License): Likewise.
+ * modules/crypto/gc-tests (License): Likewise.
+ * modules/crypto/hmac-md5 (License): Likewise.
+ * modules/crypto/hmac-sha1 (License): Likewise.
+ * modules/crypto/md2-tests (License): Likewise.
+ * modules/crypto/md4-tests (License): Likewise.
+ * modules/crypto/md5 (License): Likewise.
+ * modules/crypto/rijndael (License): Likewise.
+ * modules/crypto/sha1 (License): Likewise.
+ * modules/memxor (License): Likewise.
+
+2007-08-06 Paul Eggert <eggert@cs.ucla.edu>
+ and Bruno Haible <bruno@clisp.org>
+
+ * NEWS: Describe interface changes to human, xstrtol.
+ * lib/human.h: Include <xstrtol.h>.
+ (human_options): Return enum strtol_error, not int. Remove
+ bool arg; take int * instead.
+ * lib/human.c: Don't include "gettext.h".
+ (_): Remove; no longer used.
+ Don't include <xstrtol.h>, since human.h does it.
+ (human_options): Adjust to abovementioned interface changes.
+ Do not report error to stderr; that's now the caller's
+ responsibility.
+ * lib/xstrtol.c (main) [defined TESTING_XSTRTO]: Adjust to
+ interface change.
+ * lib/xstrtol.h (_STRTOL_ERROR): Take Option, Arg rather than
+ Str, Argument_type_string. All uses changed. Put " argument"
+ in diagnostics to make them clearer. Change wording of suffix
+ message for clarity.
+ (STRTOL_FATAL_ERROR): Take Option, Arg rather than Str,
+ Argument_type_string.
+ (STRTOL_FATAL_WARN): Remove; no longer used.
+ * modules/human (Depends-on): Remove gettext-h.
+
+2007-08-06 Simon Josefsson <simon@josefsson.org>
+
+ * build-aux/maint.mk, build-aux/GNUmakefile: Relicense to GPLv3+.
+
+2007-07-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Test whether WCHAR_MIN and WCHAR_MAX
+ are defined by <stdint.h> (as opposed to <wchar.h>, as on Dragonfly).
+ Reported by Joerg Sonnenberger <joerg@britannica.bec.de>.
+
+2007-07-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/fflush.c (rpl_fflush): On BSD systems, use the __SNPT flag.
+ Suggested by Joerg Sonnenberger <joerg@britannica.bec.de>.
+
+2007-07-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/base64 (License): Use the synonymous term "LGPLv2+".
+ * modules/c-ctype (License): Likewise.
+ * modules/c-strcase (License): Likewise.
+ * modules/check-version (License): Likewise.
+ * modules/iconv (License): Likewise.
+ * modules/iconv_open (License): Likewise.
+ * modules/read-file (License): Likewise.
+ * modules/striconv (License): Likewise.
+ * modules/strverscmp (License): Likewise.
+ * modules/vasprintf (License): Likewise.
+ * modules/crypto/des (License): Likewise.
+ * modules/crypto/gc (License): Likewise.
+ * modules/crypto/gc-arcfour (License): Likewise.
+ * modules/crypto/gc-arctwo (License): Likewise.
+ * modules/crypto/gc-des (License): Likewise.
+ * modules/crypto/gc-hmac-md5 (License): Likewise.
+ * modules/crypto/gc-hmac-sha1 (License): Likewise.
+ * modules/crypto/gc-md2 (License): Likewise.
+ * modules/crypto/gc-md4 (License): Likewise.
+ * modules/crypto/gc-md5 (License): Likewise.
+ * modules/crypto/gc-pbkdf2-sha1 (License): Likewise.
+ * modules/crypto/gc-random (License): Likewise.
+ * modules/crypto/gc-rijndael (License): Likewise.
+ * modules/crypto/gc-sha1 (License): Likewise.
+ * modules/crypto/md2 (License): Likewise.
+ * modules/crypto/md4 (License): Likewise.
+
+2007-07-30 Jim Meyering <jim@meyering.net>
+
+ * lib/fts.c (fts_read): Upon failure to chdir into a subdirectory,
+ set fts_info to FTS_DNR, not to FTS_ERR, so that the caller knows
+ it has valid stat data. This bug would cause du not to count the
+ sizes of inaccessible directories.
+ Patch by Bryan Mason <bmason@redhat.com>, via Jose Maria Plans
+ in <http://bugzilla.redhat.com/250077>.
+
+2007-07-25 Peter O'Gorman <peter@pogma.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/include_next.m4 (gl_INCLUDE_NEXT): Test whether #include_next
+ really works. Needed because AIX 4.3 "xlc -E" doesn't understand
+ #include_next, gives a diagnostic about it, but reports no error in
+ the exit code.
+ Reported by Gary V. Vaughan <gary@thewrittenword.com>.
+
+2007-07-24 Ben Pfaff <blp@gnu.org>
+
+ Improve name: "count-one-bits" is better than "popcount".
+ * MODULES.html.sh: Update name.
+ * lib/popcount.h: Renamed lib/count-one-bits.h.
+ (popcount): Renamed count_one_bits.
+ (popcountl): Renamed count_one_bits_l.
+ (popcountll): Renamed count_one_bits_ll.
+ * m4/popcount.m4: Renamed m4/count-one-bits.m4.
+ * modules/popcount: Renamed module/count-one-bits.
+ * modules/popcount-tests: Renamed module/count-one-bits-tests.
+ * tests/test-popcount.c: Renamed tests/test-count-one-bits.c.
+
+2007-07-23 Ben Pfaff <blp@gnu.org>
+
+ * lib/popcount.h (popcount32): Reduce size of constants, to allow
+ better code generation, and add U to large constants to avoid
+ warnings, in non-GCC case.
+ Suggested by Bruno Haible.
+
+2007-07-23 Ben Pfaff <blp@gnu.org>
+
+ * lib/popcount.h: Use verify_true instead of if...abort.
+ * modules/popcount: Depend on verify module.
+ Suggested by Jim Meyering.
+
+2007-07-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Create a .cvsignore file also when the
+ directory is not yet in CVS but the toplevel directory is. When
+ creating a .cvsignore file, add ".deps" and ".dirstamp" to it.
+ Reported by Karl Berry.
+
+2007-07-22 Ben Pfaff <blp@gnu.org>
+
+ * lib/popcount.h: Use faster, branchless algorithm for non-GCC
+ case.
+ Suggested by Eric Blake.
+
+2007-07-22 Ben Pfaff <blp@gnu.org>
+
+ New module: popcount.
+ * MODULES.html.sh: Add popcount.
+ * modules/popcount: New file.
+ * modules/popcount-tests: New file.
+ * tests/test-popcount.c: New file.
+ * lib/popcount.h: New file.
+ * m4/popcount.m4: New file.
+
+2007-07-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * build-aux/announce-gen: Update to GPLv3.
+
+ * build-aux/config.guess: Update from config.
+
+2007-07-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/error.c (_) [ENABLE_NLS]: Define to gettext.
+ * lib/verror.c (_) [ENABLE_NLS]: Likewise.
+
+2007-07-20 Jim Meyering <jim@meyering.net>
+
+ * check-module: Diagnose a self-dependency.
+
+2007-07-19 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Don't abort if pobase or po_domain is
+ empty.
+ Reported by Eric Blake.
+
+2007-07-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: New options --po-base, --po-domain.
+ (func_usage): Document them.
+ (pobase, po_domain): New variables.
+ (func_emit_lib_Makefile_am): Augment AM_CPPFLAGS, defining
+ DEFAULT_TEXT_DOMAIN.
+ (func_emit_po_Makevars, func_emit_po_POTFILES_in): New functions.
+ (func_import): Consider pobase and po_domain. Create a po/ directory.
+ (func_create_testdir): Set pobase and po_domain to empty.
+ * build-aux/po/Makefile.in.in: New file, from GNU gettext 0.16.1.
+ * build-aux/po/remove-potcdate.sin: New file, from GNU gettext 0.16.1.
+
+2007-07-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_automake_snippet): Synthesize also an
+ EXTRA_DIST augmentation for files in build-aux/.
+
+2007-07-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/lseek (License): Use the synonymous term "LGPLv2+".
+ * modules/getdelim (License): Likewise.
+
+2007-07-16 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * modules/arpa_inet (License): Use the synonymous term LGPLv2+.
+ * modules/d-type (License): Likewise.
+ * modules/extensions (License): Likewise.
+ * modules/fnmatch (License): Likewise.
+ * modules/fseeko (License): Likewise.
+ * modules/getaddrinfo (License): Likewise.
+ * modules/getline (License): Likewise.
+ * modules/getlogin_r (License): Likewise.
+ * modules/getpass (License): Likewise.
+ * modules/gettimeofday (License): Likewise.
+ * modules/glob (License): Likewise.
+ * modules/inet_ntop (License): Likewise.
+ * modules/malloc (License): Likewise.
+ * modules/malloca (License): Likewise.
+ * modules/memmem (License): Likewise.
+ * modules/mempcpy (License): Likewise.
+ * modules/memset (License): Likewise.
+ * modules/minmax (License): Likewise.
+ * modules/mktime (License): Likewise.
+ * modules/netinet_in (License): Likewise.
+ * modules/pathmax (License): Likewise.
+ * modules/poll (License): Likewise.
+ * modules/regex (License): Likewise.
+ * modules/snprintf (License): Likewise.
+ * modules/stdbool (License): Likewise.
+ * modules/stdint (License): Likewise.
+ * modules/stdio (License): Likewise.
+ * modules/strcase (License): Likewise.
+ * modules/strcasestr (License): Likewise.
+ * modules/strdup (License): Likewise.
+ * modules/string (License): Likewise.
+ * modules/strndup (License): Likewise.
+ * modules/strnlen (License): Likewise.
+ * modules/strpbrk (License): Likewise.
+ * modules/strptime (License): Likewise.
+ * modules/strsep (License): Likewise.
+ * modules/sys_select (License): Likewise.
+ * modules/sys_socket (License): Likewise.
+ * modules/sys_stat (License): Likewise.
+ * modules/sys_time (License): Likewise.
+ * modules/time (License): Likewise.
+ * modules/time_r (License): Likewise.
+ * modules/timegm (License): Likewise.
+ * modules/unistd (License): Likewise.
+ * modules/vsnprintf (License): Likewise.
+ * modules/wctype (License): Likewise.
+
+2007-07-16 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/argz (License): LGPLv2+.
+
+2007-07-15 Karl Berry <karl@gnu.org>
+
+ * doc/gnulib.texi: revise node structure per new fdl.texi.
+
+2007-07-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/uniname/gen-uninames.lisp (main): Emit a "do not edit" line to
+ the output file.
+ * lib/uniname/uninames.h: Regenerated.
+
+2007-07-14 Karl Berry <karl@gnu.org>
+
+ * doc/*gpl*.texi, doc/fdl.texi: new versions, consistently
+ omitting sectioning and index commands.
+
+2007-07-13 Bruno Haible <bruno@clisp.org>
+
+ New gnulib-tool option --more-symlinks.
+ * gnulib-tool (func_usage): Document --more-symlinks.
+ (do_copyrights): New variable.
+ Recognize option --more-symlinks.
+ (func_import): Don't add a copyright notice transform to
+ sed_transform_lib_file if do_copyrights is empty.
+
+2007-07-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (decimal_point_char): Define also if
+ (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE)
+ && !NEED_PRINTF_DIRECTIVE_A.
+ Reported by Clemens Koller <clemens.koller@anagramm.de> via
+ Gary V. Vaughan <gary@gnu.org>.
+
+2007-07-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/inttypes_.h: Undo previous change, since it was fixed
+ in a different way in the 2007-07-02 fix to m4/inttypes.m4.
+
+2007-07-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: Fix typo: _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H was
+ misspelled as _GL_JUST_INCLUDE_ABSOLUTE_INTTYPES_H.
+
+2007-07-13 Jim Meyering <jim@meyering.net>
+
+ df: Don't fail for Tru64's "file-on-file mount".
+ * m4/fsusage.m4 (gl_FSUSAGE): Reject Tru64's buggy statvfs,
+ so we fall through and use statfs instead. Details here:
+ <http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/10878>
+ Reported by Albert Chin.
+
+2007-07-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/alloca-opt (License): Use the synonymous term "LGPLv2+".
+ * modules/configmake (License): Likewise.
+ * modules/gettext (License): Likewise.
+ * modules/gettext-h (License): Likewise.
+ * modules/include_next (License): Likewise.
+ * modules/link-warning (License): Likewise.
+ * modules/localcharset (License): Likewise.
+ * modules/localename (License): Likewise.
+ * modules/lock (License): Likewise.
+ * modules/relocatable-lib-lgpl (License): Likewise.
+ * modules/size_max (License): Likewise.
+ * modules/vasnprintf (License): Likewise.
+ * modules/wchar (License): Likewise.
+ * modules/xsize (License): Likewise.
+
+2007-07-13 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Treat LGPLv2 as synonymous to LGPL.
+ (func_create_testdir): Handle copying terms "GPLv2+" and "LGPLv2+".
+
+2007-07-12 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-intro.texi (Copyright): Clarify the license abbreviations
+ in the modules files.
+
+2007-07-11 Karl Berry <karl@gnu.org>
+
+ * MODULES.html.sh (func_module): use
+ sed -e '\|^'"${includefile}"'$|d'
+ instead of /.../d, to avoid errors on $includefile's containing /.
+
+2007-07-10 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * gnulib-tool (func_import): Avoid duplication of --avoid
+ statements
+ (func_dest_tmpfilename,func_create_testdir): Translate `-' in file
+ names to `_' in variable names.
+
+2007-07-10 Eric Blake <ebb9@byu.net>
+
+ * lib/version-etc.c (version_etc_va): Default to GPLv3+.
+ * NEWS: Document this change.
+
+2007-07-08 Bruno Haible <bruno@clisp.org>
+
+ Update to Unicode 5.0.
+ * lib/uniwidth/width.c (nonspacing_table_data): Add U+00AD,
+ U+0350..U+035F, U+05A2, U+05BA, U+05C5, U+05C7, U+0600..U+0603,
+ U+0610..U+0615, U+0656..U+065E, U+07EB..U+07F3, U+0A01, U+0AE2..U+0AE3,
+ U+0CBC. Remove U+0CBF, U+0CC6. Add U+0CE2..U+0CE3, U+135F,
+ U+17B4..U+17B5, U+17DD. Remove U+180E. Add U+1920..U+1922,
+ U+1927..U+192B, U+1932, U+1939..U+193B, U+1A17..U+1A18, U+1B00..U+1B03,
+ U+1B34, U+1B36..U+1B3A, U+1B3C, U+1B42, U+1B6B..U+1B73, U+1DC0..U+1DCA,
+ U+1DFE..U+1DFF, U+20EB..U+20EF, U+A802, U+A806, U+A80B, U+A825..U+A826,
+ U+10A01..U+10A03, U+10A05..U+10A06, U+10A0C..U+10A0F, U+10A38..U+10A3A,
+ U+10A3F, U+1D242..U+1D244.
+ (nonspacing_table_ind): Update.
+ (uc_width): Assign width 0 to U+E0100..U+E01EF. Assign width 1 to
+ U+4DC0..U+4DFF. Assign width 2 to U+2329..U+232A, U+FE10..U+FE1F.
+
+2007-07-08 Bruno Haible <bruno@clisp.org>
+
+ Update to Unicode 5.0.
+ * lib/uniname/gen-uninames.lisp (main): Add the range 0x12xxx to the
+ code transform. Extend the name index field of unicode_name_to_code and
+ unicode_code_to_name from 16 to 24 bits.
+ * lib/uniname/uniname.c (unicode_character_name,
+ unicode_name_character): Add the range 0x12xxx to the code transform.
+ * lib/uniname/uninames.h: Regenerated.
+ * tests/uniname/UnicodeDataNames.txt: Update to Unicode 5.0.
+
+2007-07-07 Bruno Haible <bruno@clisp.org>
+
+ * modules/wcwidth-tests: New file.
+ * tests/test-wcwidth.c: New file.
+
+ Work around MacOS X wcwidth() bug.
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Test against MacOS X 10.3 bug.
+ * lib/wcwidth.c: Include localcharset.h, streq.h, uniwidth.h.
+ (rpl_wcwidth): Special-case the UTF-8 locales. Fall back to the
+ original wcwidth in non-UTF-8 locales.
+ * modules/wcwidth (Depends-on): Add localcharset, streq,
+ uniwidth/width.
+ * doc/functions/wcwidth.texi: Update.
+
+2007-07-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/wchar_.h: Include the GL_LINK_WARNING macro.
+ (wcwidth): New declaration.
+ * m4/wchar.m4 (gl_WCHAR_MODULE_INDICATOR, gl_WCHAR_H_DEFAULTS): New
+ macros.
+ (gl_WCHAR_H): Require gl_WCHAR_H_DEFAULTS. Don't set WCHAR_H to empty
+ here. Prepare for creating <wchar.h> unconditionally.
+ * modules/wchar (Depends-on): Add link-warning.
+ (Makefile.am): Substitute also GNULIB_WCWIDTH, HAVE_DECL_WCWIDTH,
+ REPLACE_WCWIDTH, and GL_LINK_WARNING.
+ * lib/wcwidth.h: Remove file.
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Require gl_WCHAR_H_DEFAULTS. Set
+ HAVE_DECL_WCWIDTH, REPLACE_WCWIDTH, WCHAR_H.
+ * modules/wcwidth (Files): Remove lib/wcwidth.h.
+ (configure.ac): Invoke gl_WCHAR_MODULE_INDICATOR.
+ (Include): Replace wcwidth.h with <wchar.h>.
+ * lib/wcwidth.c: Include <wchar.h> instead of wcwidth.h.
+ * lib/mbchar.h: Don't include wcwidth.h.
+ * lib/mbswidth.c: Likewise.
+ * NEWS: Mention the change.
+
+2007-07-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/wcwidth.c: New file, extracted from lib/wcwidth.h.
+ * lib/wcwidth.h: Don't include wctype.h. Replace inline function
+ definition with an external declaration.
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Use wcwidth.c when wcwidth is not
+ defined as a function. Remove AC_C_INLINE requirement.
+ * modules/wcwidth (Files): Add lib/wcwidth.c.
+ (Makefile.am): Remove redundant statement.
+
+2007-07-07 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Unicode string functions): Add the new modules.
+
+ * tests/uniwidth/test-u32-strwidth.c: New file.
+ * modules/uniwidth/u32-strwidth-tests: New file.
+
+ * lib/uniwidth/u32-strwidth.c: New file.
+ * modules/uniwidth/u32-strwidth: New file.
+
+ * tests/uniwidth/test-u16-strwidth.c: New file.
+ * modules/uniwidth/u16-strwidth-tests: New file.
+
+ * lib/uniwidth/u16-strwidth.c: New file.
+ * modules/uniwidth/u16-strwidth: New file.
+
+ * tests/uniwidth/test-u8-strwidth.c: New file.
+ * modules/uniwidth/u8-strwidth-tests: New file.
+
+ * lib/uniwidth/u8-strwidth.c: New file.
+ * modules/uniwidth/u8-strwidth: New file.
+
+ * tests/uniwidth/test-u32-width.c: New file.
+ * modules/uniwidth/u32-width-tests: New file.
+
+ * lib/uniwidth/u32-width.c: New file.
+ * modules/uniwidth/u32-width: New file.
+
+ * tests/uniwidth/test-u16-width.c: New file.
+ * modules/uniwidth/u16-width-tests: New file.
+
+ * lib/uniwidth/u16-width.c: New file.
+ * modules/uniwidth/u16-width: New file.
+
+ * tests/uniwidth/test-u8-width.c: New file.
+ * modules/uniwidth/u8-width-tests: New file.
+
+ * lib/uniwidth/u8-width.c: New file.
+ * modules/uniwidth/u8-width: New file.
+
+ * tests/uniwidth/test-uc_width.c: New file.
+ * modules/uniwidth/width-tests: New file.
+
+ * lib/uniwidth/width.c: New file, from GNU libiconv.
+ * lib/uniwidth/cjk.h: New file, from GNU libiconv.
+ * modules/uniwidth/width: New file.
+
+ * lib/uniwidth.h: New file, from GNU libiconv.
+ * modules/uniwidth/base: New file.
+
+2007-07-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/uniname.h: New file, from GNU gettext.
+ * lib/uniname/gen-uninames.lisp: New file, from GNU gettext.
+ * lib/uniname/uninames.h: New file, from GNU gettext.
+ * lib/uniname/uniname.c: New file, from GNU gettext.
+ * tests/uniname/test-uninames.sh: New file.
+ * tests/uniname/test-uninames.c: New file, from GNU gettext.
+ * tests/uniname/UnicodeDataNames.txt: New file, from GNU gettext.
+ * modules/uniname/base: New file.
+ * modules/uniname/uniname: New file.
+ * modules/uniname/uniname-tests: New file.
+ * MODULES.html.sh (Unicode string functions): Add the new modules.
+
+2007-07-06 Bruno Haible <bruno@clisp.org>
+
+ * doc/Makefile (TEXI2HTML): Specify a --reference-limit.
+
+2007-07-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_time_.h: Use a recursion-safe inclusion guard rather than
+ a split double-inclusion guard. Needed for cygwin, where <sys/time.h>
+ includes <cygwin/sys_time.h> which includes <sys/select.h> which
+ include <sys/time.h>.
+ Reported by Eric Blake.
+
+2007-07-06 Eric Blake <ebb9@byu.net>
+
+ Fix testing canonicalize on cygwin.
+ * modules/canonicalize-lgpl-tests (test_canonicalize_lgpl_LDADD):
+ Revert patch from 2007-06-19.
+ * tests/test-canonicalize-lgpl.c (main): Instead, skip test when
+ canonicalize module is also in use.
+ * tests/test-canonicalize.c: New file.
+ * tests/test-canonicalize.sh: Likewise.
+ * modules/canonicalize-tests: Likewise.
+
+2007-07-06 Jim Meyering <jim@meyering.net>
+
+ * lib/getugroups.c (getugroups): Detect getgrent failure.
+ Adjust comment to reflect reality: this function may return -1.
+
+2007-07-05 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * build-aux/bootstrap (TP_URL,get_translations): Update to use
+ the new TP address.
+ (usage): Fix typo
+ (gnulib_mk): New variable.
+
+2007-07-05 Jim Meyering <jim@meyering.net>
+
+ Don't let endgrent clobber errno, no matter how improbable.
+ * lib/getugroups.c (getugroups): Save and restore errno around
+ endgrent call.
+
+ Close the group DB even when failing with 2^31 or more members.
+ * lib/getugroups.c (getugroups): Don't return without calling endgrent.
+
+2007-07-04 Jim Meyering <jim@meyering.net>
+
+ * lib/getugroups.h: New file.
+ * lib/getugroups.c: Include "getugroups.h".
+ Remove uses of "register" keyword.
+ Move local variable, "cp", down into scope where used.
+ Give "username" parameter the "const" attribute.
+ * modules/getugroups (Files): Add lib/getugroups.h
+
+2007-07-04 Karl Berry <karl@gnu.org>
+
+ * MODULES.html.sh (func_all_modules): Complete rename of
+ gpl/lgpl to gpl-2.0 and lgpl-2.1, and add gpl-3.0.
+
+2007-07-02 Bruno Haible <bruno@clisp.org>
+
+ * m4/inttypes.m4 (gl_INTTYPES_H): Define __STDC_LIMIT_MACROS in C++
+ mode, when inttypes.h comes from gnulib.
+ Reported by Joel E. Denny <jdenny@ces.clemson.edu>.
+
+2007-07-02 Simon Josefsson <simon@josefsson.org>
+
+ * NEWS: Mention lgpl module name change.
+
+ * modules/lgpl-2.1: Renamed from lgpl.
+
+ * NEWS: Mention gpl module name change.
+
+ * modules/gpl-3.0: New file, based on gpl-2.0.
+
+ * modules/gpl-2.0: Renamed from gpl.
+
+ * modules/gpl: Fix filename, doc/gpl.texi is now found at
+ doc/gpl-2.0.texi.
+
+2007-07-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/inttypes_.h [defined __cplusplus&&!defined __STDC_LIMIT_MACROS]:
+ #define __STDC_LIMIT_MACROS temporarily while including
+ <stdint.h>, so that __STDC_LIMIT_MACROS is defined.
+ Problem reported by Joel E. Denny in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-07/msg00008.html>.
+
+2007-07-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistdio.h: New file.
+ * lib/unistdio/u-asnprintf.h: New file.
+ * lib/unistdio/u-asprintf.h: New file.
+ * lib/unistdio/u-printf-args.c: New file.
+ * lib/unistdio/u-printf-args.h: New file.
+ * lib/unistdio/u-printf-parse.h: New file.
+ * lib/unistdio/u-snprintf.h: New file.
+ * lib/unistdio/u-sprintf.h: New file.
+ * lib/unistdio/u-vasprintf.h: New file.
+ * lib/unistdio/u-vsnprintf.h: New file.
+ * lib/unistdio/u-vsprintf.h: New file.
+ * lib/unistdio/ulc-asnprintf.c: New file.
+ * lib/unistdio/ulc-asprintf.c: New file.
+ * lib/unistdio/ulc-fprintf.c: New file, based on lib/fprintf.c.
+ * lib/unistdio/ulc-printf-parse.c: New file.
+ * lib/unistdio/ulc-snprintf.c: New file.
+ * lib/unistdio/ulc-sprintf.c: New file.
+ * lib/unistdio/ulc-vasnprintf.c: New file.
+ * lib/unistdio/ulc-vasprintf.c: New file.
+ * lib/unistdio/ulc-vfprintf.c: New file, based on lib/vfprintf.c.
+ * lib/unistdio/ulc-vsnprintf.c: New file.
+ * lib/unistdio/ulc-vsprintf.c: New file.
+ * lib/unistdio/u8-asnprintf.c: New file.
+ * lib/unistdio/u8-asprintf.c: New file.
+ * lib/unistdio/u8-printf-parse.c: New file.
+ * lib/unistdio/u8-snprintf.c: New file.
+ * lib/unistdio/u8-sprintf.c: New file.
+ * lib/unistdio/u8-vasnprintf.c: New file.
+ * lib/unistdio/u8-vasprintf.c: New file.
+ * lib/unistdio/u8-vsnprintf.c: New file.
+ * lib/unistdio/u8-vsprintf.c: New file.
+ * lib/unistdio/u8-u8-asnprintf.c: New file.
+ * lib/unistdio/u8-u8-asprintf.c: New file.
+ * lib/unistdio/u8-u8-snprintf.c: New file.
+ * lib/unistdio/u8-u8-sprintf.c: New file.
+ * lib/unistdio/u8-u8-vasnprintf.c: New file.
+ * lib/unistdio/u8-u8-vasprintf.c: New file.
+ * lib/unistdio/u8-u8-vsnprintf.c: New file.
+ * lib/unistdio/u8-u8-vsprintf.c: New file.
+ * lib/unistdio/u16-asnprintf.c: New file.
+ * lib/unistdio/u16-asprintf.c: New file.
+ * lib/unistdio/u16-printf-parse.c: New file.
+ * lib/unistdio/u16-snprintf.c: New file.
+ * lib/unistdio/u16-sprintf.c: New file.
+ * lib/unistdio/u16-vasnprintf.c: New file.
+ * lib/unistdio/u16-vasprintf.c: New file.
+ * lib/unistdio/u16-vsnprintf.c: New file.
+ * lib/unistdio/u16-vsprintf.c: New file.
+ * lib/unistdio/u16-u16-asnprintf.c: New file.
+ * lib/unistdio/u16-u16-asprintf.c: New file.
+ * lib/unistdio/u16-u16-snprintf.c: New file.
+ * lib/unistdio/u16-u16-sprintf.c: New file.
+ * lib/unistdio/u16-u16-vasnprintf.c: New file.
+ * lib/unistdio/u16-u16-vasprintf.c: New file.
+ * lib/unistdio/u16-u16-vsnprintf.c: New file.
+ * lib/unistdio/u16-u16-vsprintf.c: New file.
+ * lib/unistdio/u32-asnprintf.c: New file.
+ * lib/unistdio/u32-asprintf.c: New file.
+ * lib/unistdio/u32-printf-parse.c: New file.
+ * lib/unistdio/u32-snprintf.c: New file.
+ * lib/unistdio/u32-sprintf.c: New file.
+ * lib/unistdio/u32-vasnprintf.c: New file.
+ * lib/unistdio/u32-vasprintf.c: New file.
+ * lib/unistdio/u32-vsnprintf.c: New file.
+ * lib/unistdio/u32-vsprintf.c: New file.
+ * lib/unistdio/u32-u32-asnprintf.c: New file.
+ * lib/unistdio/u32-u32-asprintf.c: New file.
+ * lib/unistdio/u32-u32-snprintf.c: New file.
+ * lib/unistdio/u32-u32-sprintf.c: New file.
+ * lib/unistdio/u32-u32-vasnprintf.c: New file.
+ * lib/unistdio/u32-u32-vasprintf.c: New file.
+ * lib/unistdio/u32-u32-vsnprintf.c: New file.
+ * lib/unistdio/u32-u32-vsprintf.c: New file.
+ * tests/unistdio/test-ulc-asnprintf1.c: New file.
+ * tests/unistdio/test-ulc-asnprintf1.h: New file.
+ * tests/unistdio/test-ulc-printf1.h: New file.
+ * tests/unistdio/test-ulc-vasnprintf1.c: New file.
+ * tests/unistdio/test-ulc-vasnprintf2.c: New file.
+ * tests/unistdio/test-ulc-vasnprintf2.sh: New file.
+ * tests/unistdio/test-ulc-vasnprintf3.c: New file.
+ * tests/unistdio/test-ulc-vasnprintf3.sh: New file.
+ * tests/unistdio/test-ulc-vasprintf1.c: New file.
+ * tests/unistdio/test-ulc-vsnprintf1.c: New file.
+ * tests/unistdio/test-ulc-vsprintf1.c: New file.
+ * tests/unistdio/test-u8-asnprintf1.c: New file.
+ * tests/unistdio/test-u8-asnprintf1.h: New file.
+ * tests/unistdio/test-u8-printf1.h: New file.
+ * tests/unistdio/test-u8-vasnprintf1.c: New file.
+ * tests/unistdio/test-u8-vasnprintf2.c: New file.
+ * tests/unistdio/test-u8-vasnprintf2.sh: New file.
+ * tests/unistdio/test-u8-vasnprintf3.c: New file.
+ * tests/unistdio/test-u8-vasnprintf3.sh: New file.
+ * tests/unistdio/test-u8-vasprintf1.c: New file.
+ * tests/unistdio/test-u8-vsnprintf1.c: New file.
+ * tests/unistdio/test-u8-vsprintf1.c: New file.
+ * tests/unistdio/test-u16-asnprintf1.c: New file.
+ * tests/unistdio/test-u16-asnprintf1.h: New file.
+ * tests/unistdio/test-u16-printf1.h: New file.
+ * tests/unistdio/test-u16-vasnprintf1.c: New file.
+ * tests/unistdio/test-u16-vasnprintf2.c: New file.
+ * tests/unistdio/test-u16-vasnprintf2.sh: New file.
+ * tests/unistdio/test-u16-vasnprintf3.c: New file.
+ * tests/unistdio/test-u16-vasnprintf3.sh: New file.
+ * tests/unistdio/test-u16-vasprintf1.c: New file.
+ * tests/unistdio/test-u16-vsnprintf1.c: New file.
+ * tests/unistdio/test-u16-vsprintf1.c: New file.
+ * tests/unistdio/test-u32-asnprintf1.c: New file.
+ * tests/unistdio/test-u32-asnprintf1.h: New file.
+ * tests/unistdio/test-u32-printf1.h: New file.
+ * tests/unistdio/test-u32-vasnprintf1.c: New file.
+ * tests/unistdio/test-u32-vasnprintf2.c: New file.
+ * tests/unistdio/test-u32-vasnprintf2.sh: New file.
+ * tests/unistdio/test-u32-vasnprintf3.c: New file.
+ * tests/unistdio/test-u32-vasnprintf3.sh: New file.
+ * tests/unistdio/test-u32-vasprintf1.c: New file.
+ * tests/unistdio/test-u32-vsnprintf1.c: New file.
+ * tests/unistdio/test-u32-vsprintf1.c: New file.
+ * modules/unistdio/base: New file.
+ * modules/unistdio/u-printf-args: New file.
+ * modules/unistdio/ulc-asnprintf: New file.
+ * modules/unistdio/ulc-asprintf: New file.
+ * modules/unistdio/ulc-fprintf: New file.
+ * modules/unistdio/ulc-printf-parse: New file.
+ * modules/unistdio/ulc-snprintf: New file.
+ * modules/unistdio/ulc-sprintf: New file.
+ * modules/unistdio/ulc-vasnprintf: New file.
+ * modules/unistdio/ulc-vasprintf: New file.
+ * modules/unistdio/ulc-vfprintf: New file.
+ * modules/unistdio/ulc-vsnprintf: New file.
+ * modules/unistdio/ulc-vsprintf: New file.
+ * modules/unistdio/u8-asnprintf: New file.
+ * modules/unistdio/u8-asprintf: New file.
+ * modules/unistdio/u8-printf-parse: New file.
+ * modules/unistdio/u8-snprintf: New file.
+ * modules/unistdio/u8-sprintf: New file.
+ * modules/unistdio/u8-vasnprintf: New file.
+ * modules/unistdio/u8-vasprintf: New file.
+ * modules/unistdio/u8-vsnprintf: New file.
+ * modules/unistdio/u8-vsprintf: New file.
+ * modules/unistdio/u8-u8-asnprintf: New file.
+ * modules/unistdio/u8-u8-asprintf: New file.
+ * modules/unistdio/u8-u8-snprintf: New file.
+ * modules/unistdio/u8-u8-sprintf: New file.
+ * modules/unistdio/u8-u8-vasnprintf: New file.
+ * modules/unistdio/u8-u8-vasprintf: New file.
+ * modules/unistdio/u8-u8-vsnprintf: New file.
+ * modules/unistdio/u8-u8-vsprintf: New file.
+ * modules/unistdio/u16-asnprintf: New file.
+ * modules/unistdio/u16-asprintf: New file.
+ * modules/unistdio/u16-printf-parse: New file.
+ * modules/unistdio/u16-snprintf: New file.
+ * modules/unistdio/u16-sprintf: New file.
+ * modules/unistdio/u16-vasnprintf: New file.
+ * modules/unistdio/u16-vasprintf: New file.
+ * modules/unistdio/u16-vsnprintf: New file.
+ * modules/unistdio/u16-vsprintf: New file.
+ * modules/unistdio/u16-u16-asnprintf: New file.
+ * modules/unistdio/u16-u16-asprintf: New file.
+ * modules/unistdio/u16-u16-snprintf: New file.
+ * modules/unistdio/u16-u16-sprintf: New file.
+ * modules/unistdio/u16-u16-vasnprintf: New file.
+ * modules/unistdio/u16-u16-vasprintf: New file.
+ * modules/unistdio/u16-u16-vsnprintf: New file.
+ * modules/unistdio/u16-u16-vsprintf: New file.
+ * modules/unistdio/u32-asnprintf: New file.
+ * modules/unistdio/u32-asprintf: New file.
+ * modules/unistdio/u32-printf-parse: New file.
+ * modules/unistdio/u32-snprintf: New file.
+ * modules/unistdio/u32-sprintf: New file.
+ * modules/unistdio/u32-vasnprintf: New file.
+ * modules/unistdio/u32-vasprintf: New file.
+ * modules/unistdio/u32-vsnprintf: New file.
+ * modules/unistdio/u32-vsprintf: New file.
+ * modules/unistdio/u32-u32-asnprintf: New file.
+ * modules/unistdio/u32-u32-asprintf: New file.
+ * modules/unistdio/u32-u32-snprintf: New file.
+ * modules/unistdio/u32-u32-sprintf: New file.
+ * modules/unistdio/u32-u32-vasnprintf: New file.
+ * modules/unistdio/u32-u32-vasprintf: New file.
+ * modules/unistdio/u32-u32-vsnprintf: New file.
+ * modules/unistdio/u32-u32-vsprintf: New file.
+ * modules/unistdio/ulc-asnprintf-tests: New file.
+ * modules/unistdio/ulc-vasnprintf-tests: New file.
+ * modules/unistdio/ulc-vasprintf-tests: New file.
+ * modules/unistdio/ulc-vsnprintf-tests: New file.
+ * modules/unistdio/ulc-vsprintf-tests: New file.
+ * modules/unistdio/u8-asnprintf-tests: New file.
+ * modules/unistdio/u8-vasnprintf-tests: New file.
+ * modules/unistdio/u8-vasprintf-tests: New file.
+ * modules/unistdio/u8-vsnprintf-tests: New file.
+ * modules/unistdio/u8-vsprintf-tests: New file.
+ * modules/unistdio/u16-asnprintf-tests: New file.
+ * modules/unistdio/u16-vasnprintf-tests: New file.
+ * modules/unistdio/u16-vasprintf-tests: New file.
+ * modules/unistdio/u16-vsnprintf-tests: New file.
+ * modules/unistdio/u16-vsprintf-tests: New file.
+ * modules/unistdio/u32-asnprintf-tests: New file.
+ * modules/unistdio/u32-vasnprintf-tests: New file.
+ * modules/unistdio/u32-vasprintf-tests: New file.
+ * modules/unistdio/u32-vsnprintf-tests: New file.
+ * modules/unistdio/u32-vsprintf-tests: New file.
+ * MODULES.html.sh (Unicode string functions): Add the new modules.
+
+2007-07-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/sprintf.c (sprintf): Limit the available length estimation,
+ to avoid address wraparound.
+ * lib/vsprintf.c (vsprintf): Likewise.
+ * modules/sprintf-posix (Dependencies): Add stdint.
+ * modules/vsprintf-posix (Dependencies): Likewise.
+
+2007-07-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (self_abspathname): Determine PATH_SEPARATOR and handle
+ Windows PATH as well. Conservative double-quoting. Comments.
+
+2007-07-01 Bruno Haible <bruno@clisp.org>
+ Eric Blake <ebb9@byu.net>
+ Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (self_abspathname): Fix algorithm to cope with
+ empty components in $PATH, denoting '.'.
+
+2007-07-01 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool: Fix indentation.
+ (func_create_megatestdir): Likewise.
+ Report by Bruno Haible.
+
+2007-06-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Sync from Automake.
+ * build-aux/gnupload: Fix shell portability issues with for loops.
+ Report by Karl Berry.
+
+2007-06-29 Simon Josefsson <simon@josefsson.org>
+
+ * build-aux/maint.mk (POURL): Use translationproject.org.
+
+2007-06-27 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Require gl_HEADER_SYS_SOCKET
+ before using HAVE_WS2TCPIP_H. Check for gai_strerror through an
+ explicit link test, rather than AC_REPLACE_FUNCS - for mingw.
+ (gl_PREREQ_GETADDRINFO): Require gl_HEADER_SYS_SOCKET before using
+ HAVE_SYS_SOCKET_H and HAVE_WS2TCPIP_H.
+
+2007-06-27 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/config.rpath: Upgrade to libtool-1.5.24.
+ * build-aux/config.libpath: Upgrade to libtool-1.5.24.
+
+2007-06-26 Karl Berry <karl@gnu.org>
+
+ * MODULES.html.sh: remove xreadlink-with-size.
+
+2007-06-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/time_.h: Port to Solaris 8 with Sun Studio 11, using a
+ method that I hope also handles the double-include problem noted
+ by Bruno Haible in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-05/msg00186.html>.
+
+2007-06-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+ Don't let the 'mostlyclean' target fail if the last subdirectory could
+ not be removed.
+ Reported by Karl Berry.
+
+2007-06-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (echo): Add a speedier workaround for ksh.
+ * tests/test-echo.sh: Likewise.
+
+2007-06-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (echo): Add workarounds also for bash versions < 2.04.
+ * tests/test-echo.sh: Likewise.
+
+2007-06-23 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (IFS): Initialize early, so we don't set it to
+ empty later.
+ (self_abspathname): Rewrite algorithm to set it, reindent.
+ (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am)
+ (func_create_megatestdir): Merge some sed scripts.
+
+2007-06-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/include_next.m4 (gl_CHECK_NEXT_HEADERS): Check some typos
+ exposed by Sun Studio 11 cc on Solaris 8.
+
+2007-06-22 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (echo): Ensure the echo primitive does not interpret
+ backslashes.
+ * tests/test-echo.sh: New file.
+
+2007-06-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_add_or_update, func_create_testdir): Do not
+ simplify `sed_replace_build_aux' scripts, they are portable but
+ echoing them with `echo' is not.
+ Report and analysis by Fernando Ferreira <fernando.prog@netcabo.pt>.
+
+2007-06-21 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: guess we can't handle the licenses via
+ srclist at the moment.
+
+2007-06-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh: Add include_next.
+ * modules/include_next: New file.
+
+2007-06-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/include_next.m4 (gl_INCLUDE_NEXT): Define and AC_SUBST
+ INCLUDE_NEXT.
+ (gl_CHECK_NEXT_HEADERS): New macro.
+ * m4/fcntl_h.m4 (gl_FCNTL_H): use gl_CHECK_NEXT_HEADERS instead of
+ the obsolescent gl_ABSOLUTE_HEADER.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Likewise.
+ * m4/float_h.m4 (gl_FLOAT_H): Likewise.
+ * m4/iconv_h.m4 (gl_ICONV_H): Likewise.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Likewise.
+ * m4/locale_h.m4 (gl_LOCALE_H): Likewise.
+ * m4/math_h.m4 (gl_MATH_H): Likewise.
+ * m4/netinet_in_h.m4 (gl_HEADER_NETINET_IN): Likewise.
+ * m4/search_h.m4 (gl_SEARCH_H): Likewise.
+ * m4/signal_h.m4 (gl_SIGNAL_H): Likewise.
+ * m4/stdint.m4 (gl_STDINT_H): Likewise.
+ * m4/stdio_h.m4 (gl_STDIO_H): Likewise.
+ * m4/stdlib_h.m4 (gl_STDLIB_H): Likewise.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_BODY): Likewise.
+ * m4/sys_select_h.m4 (gl_HEADER_SYS_SELECT): Likewise.
+ * m4/sys_socket_h.m4 (gl_HEADER_SYS_SOCKET): Likewise.
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Likewise.
+ * m4/sys_time_h.m4 (gl_HEADER_SYS_TIME_H_BODY): Likewise.
+ * m4/sysexits.m4 (gl_SYSEXITS): Likewise.
+ * m4/time_h.m4 (gl_HEADER_TIME_H_BODY): Likewise.
+ * m4/unistd_h.m4 (gl_UNISTD_H): Likewise.
+ * m4/wchar.m4 (gl_WCHAR_H): Likewise.
+ * m4/wctype.m4 (gl_WCTYPE_H): Likewise.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Define
+ _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H to avoid the problem of unclean
+ builds, since ABSOLUTE_INTTYPES_H is no longer being defined.
+ * m4/stdint.m4 (gl_STDINT_H): Likewise, for
+ _GL_JUST_INCLUDE_SYSTEM_STDINT_H.
+ * lib/fcntl_.h: Use @INCLUDE_NEXT@ @NEXT_foo_H@
+ rather than @HAVE_INCLUDE_NEXT@ and @ABSOLUTE_foo_H@.
+ * lib/float_.h: Likewise.
+ * lib/inttypes_.h: Likewise.
+ * lib/math_.h: Likewise.
+ * lib/search_.h: Likewise.
+ * lib/signal_.h: Likewise.
+ * lib/stdint_.h: Likewise.
+ * lib/stdio_.h: Likewise.
+ * lib/stdlib_.h: Likewise.
+ * lib/string_.h: Likewise.
+ * lib/sys_stat_.h: Likewise.
+ * lib/sys_time_.h: Likewise.
+ * lib/time_.h: Likewise.
+ * lib/unistd_.h: Likewise.
+ * lib/wchar_.h: Likewise.
+ * lib/wctype_.h: Likewise.
+ * lib/dirent_.h: Likewise.
+ * lib/iconv_.h: Likewise.
+ * lib/locale_.h: Likewise.
+ * lib/netinet_in_.h: Likewise.
+ * lib/sys_select_.h: Likewise.
+ * lib/sys_socket_.h: Likewise.
+ * lib/sysexits_.h: Likewise.
+ * modules/fcntl (Depends-on): Depend on include_next, not
+ absolute_header.
+ (Makefile): Substitute INCLUDE_NEXT and NEXT_foo_H, not
+ HAVE_INCLUDE_NEXT and ABSOLUTE_foo_H.
+ * modules/fchdir: Likewise.
+ * modules/float: Likewise.
+ * modules/iconv_open: Likewise.
+ * modules/inttypes: Likewise.
+ * modules/locale: Likewise.
+ * modules/math: Likewise.
+ * modules/netinet_in: Likewise.
+ * modules/search: Likewise.
+ * modules/signal: Likewise.
+ * modules/stdint: Likewise.
+ * modules/stdio: Likewise.
+ * modules/stdlib: Likewise.
+ * modules/string: Likewise.
+ * modules/sys_select: Likewise.
+ * modules/sys_socket: Likewise.
+ * modules/sys_stat: Likewise.
+ * modules/sys_time: Likewise.
+ * modules/sysexits: Likewise.
+ * modules/time: Likewise.
+ * modules/unistd: Likewise.
+ * modules/wchar: Likewise.
+ * modules/wctype: Likewise.
+ * modules/sys_stat: Change maintainer to "all".
+ * modules/unistd: Likewise.
+
+2007-06-20 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: track www changes in license files.
+
+2007-06-20 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * build-aux/bootstrap: Remove stray dot.
+ Make sure build_aux settings are honored when linking
+ gnulib_extra_files.
+
+2007-06-19 Eric Blake <ebb9@byu.net>
+
+ * modules/canonicalize-lgpl-tests (test_canonicalize_lgpl_LDADD):
+ Allow compilation on cygwin.
+
+2007-06-19 Jim Meyering <jim@meyering.net>
+
+ xreadlink-with-size: Remove module. No longer used.
+ Ex-callers now use xreadlink or mreadlink-with-size.
+ * modules/xreadlink-with-size: Remove module.
+ * lib/xreadlink-with-size.c: Remove file.
+ * lib/xreadlink.h (xreadlink_with_size): Remove prototype.
+ (xreadlink): Remove inaccurate comment. The one in xreadlink.c,
+ just before the function definition *is* accurate.
+
+ Eliminate one way canonicalize_filename_mode could exit.
+ * lib/canonicalize.c (canonicalize_filename_mode):
+ Use mreadlink_with_size, not xreadlink_with_size.
+
+2007-06-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ Detect porting problems to FreeBSD/arm, which has time_t wider than
+ long int. Original problem reported for GNU diff by Xin Li in
+ <http://lists.gnu.org/archive/html/bug-gnu-utils/2007-06/msg00091.html>.
+ * modules/getdate (Depends-on): Add intprops, verify.
+ * lib/getdate.y: Include intprops.h, verify.h. Verify that time_t
+ is an integer type no wider than long int.
+
+2007-06-18 Jim Meyering <jim@meyering.net>
+
+ New module: mreadlink-with-size.
+ * MODULES.html.sh: Add mreadlink-with-size.
+ * modules/mreadlink-with-size: New module
+ * modules/canonicalize (Depends-on): Depend on mreadlink-with-size,
+ not xreadlink-with-size.
+ * lib/mreadlink-with-size.c, lib/mreadlink.h: New files.
+
+2007-06-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): Catch the MacOS X 10.4 bug.
+ * doc/functions/frexpl.texi: Document the MacOS X 10.4 bug.
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2007-06-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ Revamp lchown so that it lives in unistd.h where it belongs.
+ * lib/lchown.h: Remove.
+ * lib/dirchownmod.c: Don't include lib/lchown.h.
+ * lib/fchownat.c: Likewise.
+ * lib/openat.c: Likewise.
+ * lib/lchown.c (REPLACE_CHOWN): Define to 0 if the system chown
+ does not follow symlinks.
+ (EOPNOTSUPP): Define if not defined.
+ * lib/unistd_.h (chown): Do not replace if REPLADE_CHOWN
+ is defined to 0.
+ (lchown): New decl.
+ * m4/lchown.m4 (gl_FUNC_LCHOWN): Require gl_UNISTD_H_DEFAULTS.
+ Do not check for lchown decl.
+ Set REPLACE_LCHOWN.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Set GNULIB_LCHOWN,
+ REPLACE_LCHOWN.
+ * modules/chown: Make it clear it follows symlinks.
+ * modules/lchown: Make it clear it doesn't follow symlinks.
+ (Files): Remove lib/lchown.h
+ (Depends-on): Add unistd.
+ (configure.ac): Add gl_UNISTD_MODULE_INDICATOR([lchown]).
+ (Include): Include <unistd.h>, not "lchown.h".
+ * modules/unistd (unistd.h): Substitude GNULIB_LCHOWN and
+ REPLACE_LCHOWN.
+
+2007-06-15 Jim Meyering <jim@meyering.net>
+
+ Change license (GPL to LGPL) of fsusage and dependents.
+ * modules/fsusage (License): Change to LGPL.
+ * modules/full-read (License): Likewise.
+ * modules/full-write (License): Likewise.
+ * modules/safe-read (License): Likewise.
+ * modules/safe-write (License): Likewise.
+
+2007-06-14 Ben Pfaff <blp@gnu.org>
+
+ Missing part of allocsa -> malloca transition.
+ * modules/relocatable-prog-wrapper: gl_ALLOCSA should be
+ gl_MALLOCA.
+
+2007-06-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanl.m4 (gl_FUNC_ISNANL_WORKS): Guess no when cross-compiling
+ to ia64, x86_64, i386.
+ Reported by Eric Blake.
+
+2007-06-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_INFINITE_LONG_DOUBLE): Guess no also when
+ cross-compiling to x86_64.
+
+2007-06-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/absolute-header.m4 (gl_ABSOLUTE_HEADER): Fix POSIX sed portability
+ glitch reported by Ralf Wildenhues in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-06/msg00114.html>.
+
+ * m4/regex.m4 (gl_REGEX): Catch a bug with [[:alnum:]_-] reported by
+ Vin Shelton.
+
+2007-06-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/printf-args.c (PRINTF_FETCHARGS) [ENABLE_UNISTDIO]: Fix NULL
+ replacement string.
+ Reported by Eric Blake.
+
+2007-06-10 Bruno Haible <bruno@clisp.org>
+
+ Prepare vasnprintf code for use with Unicode strings.
+ * lib/printf-args.h (PRINTF_FETCHARGS): New macro.
+ (arg_type) [ENABLE_UNISTDIO]: Define TYPE_U8_STRING, TYPE_U16_STRING,
+ TYPE_U32_STRING.
+ (argument) [ENABLE_UNISTDIO]: Add a_u8_string, a_u16_string,
+ a_u32_string variants.
+ (PRINTF_FETCHARGS): Renamed from printf_fetchargs.
+ * lib/printf-args.c: Don't include config.h and the specification
+ header if PRINTF_FETCHARGS is already defined.
+ (PRINTF_FETCHARGS): Renamed from printf_fetchargs.
+ (PRINTF_FETCHARGS) [ENABLE_UNISTDIO]: Add code for TYPE_U8_STRING,
+ TYPE_U16_STRING, TYPE_U32_STRING.
+ * lib/printf-parse.h [ENABLE_UNISTDIO] (u8_directive, u8_directives,
+ u16_directive, u16_directives, u32_directive, u32_directives): New
+ types.
+ (ulc_printf_parse, u8_printf_parse, u16_printf_parse, u32_printf_parse):
+ New declarations.
+ * lib/printf-parse.c: Don't include config.h and the specification
+ header if PRINTF_PARSE is already defined. Eliminate the set of
+ parameters for WIDE_CHAR_VERSION; the user of this file must provide
+ them now. Include c-ctype.h.
+ (PRINTF_PARSE) [ENABLE_UNISTDIO]: Add code implementing the 'U'
+ directive and CHAR_T_ONLY_ASCII.
+ * lib/vasnprintf.c: Don't include config.h and the specification header
+ if VASNPRINTF is already defined.
+ (DCHAR_IS_TCHAR, DCHAR_CPY): New macros.
+ (VASNPRINTF): Use PRINTF_FETCHARGS instead of printf_fetchargs. Use
+ DCHAR_CPY. Handle the case that DCHAR_T and FCHAR_T are not the same
+ type. Handle the case that TCHAR_T and FCHAR_T are not of the same
+ size. Handle the case that DCHAR_T and TCHAR_T are not the same type,
+ add a conversion from TCHAR_T[] to DCHAR_T[], and rework the padding
+ code accordingly.
+ (VASNPRINTF) [ENABLE_UNISTDIO]: Implement the 'U' directive. Enable
+ pad_ourselves also in this case, with the 'c' and 's' directives, and
+ with a different notion of "width".
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_WITH_EXTRAS): New macros.
+
+2007-06-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistr/u32-mbsnlen: New file.
+ * lib/unistr/u32-mbsnlen.c: New file.
+
+ * modules/unistr/u16-mbsnlen: New file.
+ * lib/unistr/u16-mbsnlen.c: New file.
+
+ * modules/unistr/u8-mbsnlen: New file.
+ * lib/unistr/u8-mbsnlen.c: New file.
+
+ * lib/unistr.h (u8_mbsnlen, u16_mbsnlen, u32_mbsnlen): New
+ declarations.
+
+2007-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h (mbsnlen): New declaration.
+ * lib/mbsnlen.c: New file.
+ * m4/mbsnlen.m4: New file.
+ * modules/mbsnlen: New file.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Set GNULIB_MBSNLEN.
+ * modules/string (string.h): Substitute GNULIB_MBSNLEN.
+ * MODULES.html.sh (Internationalization functions): Add mbsnlen.
+
+2007-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbslen.c: Include <stdlib.h>, needed for MB_CUR_MAX.
+
+2007-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbiter.h: Include <stddef.h>, needed for ptrdiff_t.
+ * lib/mbuiter.h: Likewise.
+
+2007-06-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF): Check for _snprintf
+ declaration.
+
+2007-06-10 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: remove gettext entries, Bruno prefers
+ to update individually.
+
+2007-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF) [!USE_SNPRINTF]: Remove variable
+ 'maxlen'. Ensure only length + width bytes are allocated, not
+ length + 1 + width.
+
+2007-06-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (FCHAR_T, DCHAR_T, TCHAR_T): New macros.
+ (CHAR_T): Remove macro.
+ (VASNPRINTF): Update.
+
+2007-06-09 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Unicode string functions): Add the new modules.
+
+ * modules/uniconv/u32-conv-to-enc: New file.
+ * lib/uniconv/u32-conv-to-enc.c: New file.
+ * modules/uniconv/u32-conv-to-enc-tests: New file.
+ * tests/uniconv/test-u32-conv-to-enc.c: New file.
+
+ * modules/uniconv/u16-conv-to-enc: New file.
+ * lib/uniconv/u16-conv-to-enc.c: New file.
+ * lib/uniconv/u-conv-to-enc.h: New file.
+ * modules/uniconv/u16-conv-to-enc-tests: New file.
+ * tests/uniconv/test-u16-conv-to-enc.c: New file.
+
+ * modules/uniconv/u8-conv-to-enc: New file.
+ * lib/uniconv/u8-conv-to-enc.c: New file.
+ * modules/uniconv/u8-conv-to-enc-tests: New file.
+ * tests/uniconv/test-u8-conv-to-enc.c: New file.
+
+ * lib/uniconv.h (u8_conv_to_encoding, u16_conv_to_encoding,
+ u32_conv_to_encoding): New declarations.
+
+2007-06-09 Bruno Haible <bruno@clisp.org>
+
+ * tests/uniconv/test-u32-strconv-to-enc.c (main): Remove unused code.
+
+2007-06-09 Bruno Haible <bruno@clisp.org>
+
+ Rename 'allocsa' -> 'malloca', 'freesa' -> 'freea'.
+ * modules/malloca: Renamed from modules/allocsa, updated.
+ * lib/malloca.h: Renamed from lib/allocsa.h, updated.
+ * lib/malloca.c: Renamed from lib/allocsa.c, updated.
+ * lib/malloca.valgrind: Renamed from lib/allocsa.valgrind, updated.
+ * m4/malloca.m4: Renamed from m4/allocsa.m4, updated.
+ * modules/malloca-tests: Renamed from modules/allocsa-tests, updated.
+ * tests/test-malloca.c: Renamed from tests/test-allocsa.c, updated.
+ * modules/xmalloca: Renamed from modules/xallocsa, updated.
+ * lib/xmalloca.h: Renamed from lib/xallocsa.h, updated.
+ * lib/xmalloca.c: Renamed from lib/xallocsa.c, updated.
+ * modules/c-strcasestr (Depends-on): Update.
+ * lib/c-strcasestr.c: Update.
+ * modules/c-strstr (Depends-on): Update.
+ * lib/c-strstr.c: Update.
+ * modules/canonicalize-lgpl (Depends-on): Update.
+ * lib/canonicalize-lgpl.c: Update.
+ * modules/clean-temp (Depends-on): Update.
+ * lib/clean-temp.c: Update.
+ * modules/csharpcomp (Depends-on): Update.
+ * lib/csharpcomp.c: Update.
+ * modules/csharpexec (Depends-on): Update.
+ * lib/csharpexec.c: Update.
+ * modules/javacomp (Depends-on): Update.
+ * lib/javacomp.c: Update.
+ * modules/javaexec (Depends-on): Update.
+ * lib/javaexec.c: Update.
+ * modules/mbscasestr (Depends-on): Update.
+ * lib/mbscasestr.c: Update.
+ * modules/mbsstr (Depends-on): Update.
+ * lib/mbsstr.c: Update.
+ * modules/setenv (Depends-on): Update.
+ * lib/setenv.c: Update.
+ * modules/strcasestr (Depends-on): Update.
+ * lib/strcasestr.c: Update.
+ * modules/striconveha (Depends-on): Update.
+ * lib/striconveha.c: Update.
+ * modules/relocatable-prog-wrapper (Files): Update.
+ * lib/relocwrapper.c: Update.
+ * build-aux/install-reloc: Update.
+ * MODULES.html.sh (Memory management functions <stdlib.h>): Update.
+
+2007-06-08 Bruno Haible <bruno@clisp.org>
+
+ Port to uClibc.
+ * lib/fbufmode.c (fbufmode): Add special code for uClibc.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ * lib/fseterr.c (fseterr): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+ * tests/test-fflush.c (main): Avoid a failure on uClibc.
+
+2007-06-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/intlmacosx.m4: New file, extracted from gettext.m4.
+ * m4/gettext.m4 (gt_INTL_MACOSX): Remove macro, moved to intlmacosx.m4.
+ * modules/gettext (Files): Add m4/intlmacosx.m4.
+
+2007-06-07 Bruno Haible <bruno@clisp.org>
+
+ * modules/localename-tests: New file.
+ * tests/test-localename.c: New file.
+
+ New module 'localename'.
+ * lib/localename.h: New file.
+ * lib/localename.c: New file, from GNU gettext.
+ * m4/localename.m4: New file.
+ * modules/localename: New file.
+
+2007-06-07 Bruno Haible <bruno@clisp.org>
+
+ Work around the lack of <wchar.h> on some builds of uClibc.
+ * doc/headers/wchar.texi: Update.
+ * lib/wchar_.h: Include <wchar.h> only if it exists.
+ * m4/wchar.m4 (gl_WCHAR_H): Check for <wchar.h>. Set HAVE_WCHAR_H.
+ * m4/stdint.m4 (gl_STDINT_H): Check for <wchar.h>.
+ (gl_STDINT_TYPE_PROPERTIES): Don't try to include <wchar.h> if it
+ doesn't exist.
+ * modules/wchar (wchar.h): Substitute HAVE_WCHAR_H.
+ * modules/mbfile (Depends-on): Add wchar.
+ * modules/mbiter (Depends-on): Likewise.
+ * modules/mbuiter (Depends-on): Likewise.
+ Reported by Simon Josefsson.
+
+2007-06-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ Work around problem reported by Steven M. Schweda in
+ <http://lists.gnu.org/archive/html/bug-tar/2007-06/msg00002.html>:
+ Tru64 5.1B with the Compaq compiler environment installed declares
+ an 'isblank' function but does not define it in the C library.
+ * lib/fnmatch.c (isblank): Check for HAVE_ISBLANK, too.
+ * lib/regex_internal.h (isblank): Likewise.
+ * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Check for isblank existence.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Likewise.
+
+2007-06-05 Bruno Haible <bruno@clisp.org>
+
+ Fix *printf so that it recognizes non-IEEE numbers on i386, x86_64,
+ ia64.
+ * modules/printf-safe: New file.
+ * modules/fprintf-posix (Depends-on): Add printf-safe.
+ * modules/printf-posix (Depends-on): Likewise.
+ * modules/snprintf-posix (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/vasnprintf-posix (Depends-on): Likewise.
+ * modules/vasprintf-posix (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/vprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf-posix (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+ * m4/printf.m4 (gl_PRINTF_INFINITE_LONG_DOUBLE): Require
+ AC_C_BIGENDIAN. Define CHECK_PRINTF_SAFE if printf-safe is used. Test
+ non-IEEE numbers on i386, x86_64, ia64. When cross-compiling, guess
+ "no" on i386, x86_64, ia64.
+ * tests/test-snprintf-posix.h (LDBL80_WORDS): New macro.
+ (test_function): Check result of %La, %Lf, %Le, %Lg on non-IEEE numbers
+ on i386, x86_64, ia64.
+ * tests/test-sprintf-posix.h (LDBL80_WORDS): New macro.
+ (test_function): Check result of %La, %Lf, %Le, %Lg on non-IEEE numbers
+ on i386, x86_64, ia64.
+ * tests/test-vasnprintf-posix.c: Include float.h.
+ (LDBL80_WORDS): New macro.
+ (test_function): Check result of %La, %Lf, %Le, %Lg on non-IEEE numbers
+ on i386, x86_64, ia64.
+ * tests/test-vasprintf-posix.c: Include float.h.
+ (LDBL80_WORDS): New macro.
+ (test_function): Check result of %La, %Lf, %Le, %Lg on non-IEEE numbers
+ on i386, x86_64, ia64.
+ * tests/test-snprintf-posix.c: Include float.h.
+ * tests/test-sprintf-posix.c: Likewise.
+ * tests/test-vsnprintf-posix.c: Likewise.
+ * tests/test-vsprintf-posix.c: Likewise.
+
+2007-06-05 Bruno Haible <bruno@clisp.org>
+
+ Fix isnanl so that it recognizes non-IEEE numbers on i386, x86_64, ia64.
+ * m4/isnanl.m4 (gl_FUNC_ISNANL_WORKS): Require AC_C_BIGENDIAN. Test
+ non-IEEE numbers on i386, x86_64, ia64.
+ (gl_LONG_DOUBLE_EXPONENT_LOCATION): Require AC_C_BIGENDIAN.
+ * lib/isnan.c (FUNC): Add special code for i386, x86_64, ia64.
+ * tests/test-isnanl.h: Include float.h.
+ (main): Check also non-IEEE numbers on i386, x86_64, ia64.
+
+2007-06-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Do the extra handling of NaN and Inf
+ also the %a / %A. Handle the %a / %A code before this extra handling.
+
+2007-06-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c [NEED_PRINTF_LONG_DOUBLE ||
+ NEED_PRINTF_INFINITE_LONG_DOUBLE]: Include fpucw.h.
+
+2007-06-05 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE): Fix
+ typo in variable name.
+
+2007-06-05 Eric Blake <ebb9@byu.net>
+
+ * m4/lseek.m4 (gl_FUNC_LSEEK): Work when cross-compiling.
+ Reported by Simon Josefsson.
+
+2007-06-04 Bruno Haible <bruno@clisp.org>
+
+ Avoid test failures on some PowerPC platforms.
+ * tests/test-printf-frexpl.c (MIN_NORMAL_EXP, MIN_SUBNORMAL_EXP):
+ Define differently for PowerPC.
+ * tests/test-frexpl.c (MIN_NORMAL_EXP): Likewise.
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2007-06-02 Bruno Haible <bruno@clisp.org>
+
+ Fix test-stdint failure on FreeBSD/ia64.
+ * m4/stdint.m4 (gl_STDINT_H): Check the values of PTRDIFF_MIN,
+ PTRDIFF_MAX, SIG_ATOMIC_MIN, SIG_ATOMIC_MAX, SIZE_MAX, WCHAR_MIN,
+ WCHAR_MAX, WINT_MIN, WINT_MAX entirely, not only for plausibility.
+ * doc/headers/stdint.texi: Update.
+
+2007-06-01 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-binary-io.c (main): Pass a third argument to open().
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2007-06-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions/frexpl.texi: Update for mingw.
+
+2007-06-01 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-lseek.c (main): Disable test of errno for invalid third
+ argument.
+ * doc/functions/lseek.texi: Update.
+ Reported by Gary V. Vaughan <gary@gnu.org>.
+
+2007-05-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/intl.m4 (AM_INTL_SUBDIR): Substitute variables WOE32, WINDRES.
+
+2007-05-31 Eric Blake <ebb9@byu.net>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): Guess no on mingw when
+ cross compiling.
+
+2007-05-30 Eric Blake <ebb9@byu.net>
+ and Bruno Haible <bruno@clisp.org>
+
+ Work around mingw test failures exposed by m4-1.4.9b.
+ * m4/stdint.m4 (gl_STDINT_H): Detect mingw bug.
+ * tests/test-unistd.c: Disable uid_t and git_t tests for the
+ moment.
+
+2007-05-30 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-lseek.c: Explicitly close file descriptors 0 and 1 before
+ assuming that they are closed. Needed on HP-UX 11.
+
+2007-05-29 Bruno Haible <bruno@clisp.org>
+
+ Fix a problem with #include_next.
+ * lib/dirent_.h: Split the double-inclusion guard.
+ * lib/fcntl_.h: Likewise.
+ * lib/float_.h: Likewise.
+ * lib/iconv_.h: Likewise.
+ * lib/inttypes_.h: Likewise.
+ * lib/locale_.h: Likewise.
+ * lib/math_.h: Likewise.
+ * lib/netinet_in_.h: Likewise.
+ * lib/search_.h: Likewise.
+ * lib/signal_.h: Likewise.
+ * lib/stdint_.h: Likewise.
+ * lib/stdio_.h: Likewise.
+ * lib/stdlib_.h: Likewise.
+ * lib/string_.h: Likewise.
+ * lib/sys_select_.h: Likewise.
+ * lib/sys_socket_.h: Likewise.
+ * lib/sys_stat_.h: Likewise.
+ * lib/sys_time_.h: Likewise.
+ * lib/sysexits_.h: Likewise.
+ * lib/time_.h: Likewise.
+ * lib/unistd_.h: Likewise.
+ * lib/wchar_.h: Likewise.
+ * lib/wctype_.h: Likewise.
+
+2007-05-29 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-unistd.c: Disable the tests for useconds_t and intptr_t
+ for the moment.
+
+2007-05-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnan.m4 (gl_DOUBLE_EXPONENT_LOCATION): Silence the AC_C_BIGENDIAN
+ invocation.
+ Reported by Eric Blake.
+
+2007-05-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanf.m4 (gl_FLOAT_EXPONENT_LOCATION): Fix typo in cross-
+ compiling case.
+
+2007-05-29 Eric Blake <ebb9@byu.net>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanf.m4 (gl_FUNC_ISNANF_NO_LIBM): Avoid syntax error on
+ cross compiles.
+
+2007-05-28 Eric Blake <ebb9@byu.net>
+
+ * modules/closein-tests (test_closein_LDADD): Support test on
+ cygwin with libtool.
+
+2007-05-28 Bruno Haible <bruno@clisp.org>
+
+ * tests/uniconv/test-u16-conv-from-enc.c: Remove #ifdef HAVE_CONFIG_H.
+ * tests/uniconv/test-u16-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u16-strconv-to-enc.c: Likewise.
+ * tests/uniconv/test-u32-conv-from-enc.c: Likewise.
+ * tests/uniconv/test-u32-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u32-strconv-to-enc.c: Likewise.
+ * tests/uniconv/test-u8-conv-from-enc.c: Likewise.
+ * tests/uniconv/test-u8-strconv-from-enc.c: Likewise.
+ * tests/uniconv/test-u8-strconv-to-enc.c: Likewise.
+
+2007-05-28 Eric Blake <ebb9@byu.net>
+
+ Unconditionally include <config.h> in unit tests.
+ * tests/test-alloca-opt.c: Remove #ifdef HAVE_CONFIG_H.
+ * tests/test-allocsa.c, tests/test-arcfour.c,
+ tests/test-arctwo.c, tests/test-argmatch.c, tests/test-argp.c,
+ tests/test-array_list.c, tests/test-array_oset.c,
+ tests/test-atexit.c, test-avltree_list.c, test-avltree_oset.c,
+ test-avltreehash_list.c, test-base64.c, test-binary-io.c,
+ test-c-ctype.c, test-c-strcasecmp.c, test-c-strcasestr.c,
+ test-c-strncasecmp.c, test-c-strstr.c, test-canonicalize-lgpl.c,
+ test-carray_list.c, test-crc.c, test-des.c, test-dirname.c,
+ test-fflush.c, test-fprintf-posix.c, test-gc-arcfour.c,
+ test-gc-arctwo.c, test-gc-des.c, test-gc-hmac-md5.c,
+ test-gc-hmac-sha1.c, test-gc-md2.c, test-gc-md4.c, test-gc-md5.c,
+ test-gc-pbkdf2-sha1.c, test-gc-rijndael.c, test-gc-sha1.c,
+ test-gc.c, test-getpass.c, test-hmac-md5.c, test-hmac-sha1.c,
+ test-iconv.c, test-linked_list.c, test-linkedhash_list.c,
+ test-lock.c, test-mbscasecmp.c, test-mbscasestr1.c,
+ test-mbscasestr2.c, test-mbscasestr3.c, test-mbscasestr4.c,
+ test-mbschr.c, test-mbscspn.c, test-mbsncasecmp.c, test-mbspbrk.c,
+ test-mbspcasecmp.c, test-mbsrchr.c, test-mbsspn.c, test-mbsstr1.c,
+ test-mbsstr2.c, test-mbsstr3.c, test-md2.c, test-md4.c,
+ test-md5.c, test-memmem.c, test-printf-posix.c,
+ test-rbtree_list.c, test-rbtree_oset.c, test-rbtreehash_list.c,
+ test-read-file.c, test-rijndael.c, test-snprintf-posix.c,
+ test-snprintf.c, test-sprintf-posix.c, test-stdint.c,
+ test-strcasestr.c, test-striconv.c, test-striconveh.c,
+ test-striconveha.c, test-tls.c, test-vasnprintf-posix.c,
+ test-vasnprintf-posix2.c, test-vasnprintf.c,
+ test-vasprintf-posix.c, test-vasprintf.c, test-verify.c,
+ test-vfprintf-posix.c, test-vprintf-posix.c,
+ test-vsnprintf-posix.c, test-vsnprintf.c, test-vsprintf-posix.c,
+ test-xvasprintf.c: Likewise.
+
+2007-05-28 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Remember the --with-tests command-line
+ option through the macro gl_WITH_TESTS in the gnulib-cache.m4.
+ Reported by Eric Blake.
+
+2007-05-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/ftell-tests: New file.
+ * tests/test-ftell.c: New file, based on tests/test-ftello.c.
+ * tests/test-ftell.sh: New file, based on tests/test-ftello.sh.
+
+ * lib/ftell.c: New file.
+ * modules/ftell: New file.
+ * m4/ftell.m4: New file.
+ * doc/functions/ftell.texi: Update.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_FTELL,
+ REPLACE_FTELL.
+ * lib/stdio_.h (rpl_ftell): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_FTELL,
+ REPLACE_FTELL.
+
+2007-05-28 Eric Blake <ebb9@byu.net>
+
+ * lib/allocsa.h (safe_alloca): Avoid compiler warning.
+
+2007-05-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/fseek-tests: New file.
+ * tests/test-fseek.c: New file, based on tests/test-fseeko.c.
+ * tests/test-fseek.sh: New file, based on tests/test-fseeko.sh.
+
+ * lib/fseek.c: New file.
+ * modules/fseek: New file.
+ * m4/fseek.m4: New file.
+ * doc/functions/fseek.texi: Update.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_FSEEK,
+ REPLACE_FSEEK.
+ * lib/stdio_.h (rpl_fseek): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_FSEEK,
+ REPLACE_FSEEK.
+
+2007-05-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h (fflush): More comments.
+
+2007-05-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/lseek.m4 (gl_FUNC_LSEEK): When not cross-compiling, perform a real
+ runtime test.
+
+2007-05-28 Eric Blake <ebb9@byu.net>
+
+ Improve lseek module.
+ * lib/lseek.c (rpl_lseek): Detect EBADF on mingw.
+ * lib/unistd_.h (lseek): Scale back link warning message.
+ * tests/test-lseek.c: Beef up test.
+ * tests/test-lseek.sh: Exercise more facets of lseek.
+ Reported by Bruno Haible.
+
+2007-05-28 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-unistd.c: Test all the types that <unistd.h> is expected
+ to define.
+
+2007-05-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/iconv.m4 (AM_ICONV_LINK): Fix 2007-03-31 patch.
+
+2007-05-27 Bruno Haible <bruno@clisp.org>
+
+ * modules/openmp: New file.
+ * m4/openmp.m4: New file, taken from autoconf's CVS with changes by
+ Noah Misch.
+
+2007-05-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/chdir-long (Depends-on): Add fchdir.
+ * modules/chdir-safer (Depends-on): Likewise.
+ * modules/fts (Depends-on): Likewise.
+ * modules/fts-lgpl (Depends-on): Likewise.
+ * modules/openat (Depends-on): Likewise.
+ * modules/savewd (Depends-on): Likewise.
+
+2007-05-24 Eric Blake <ebb9@byu.net>
+
+ Fix lseek on mingw.
+ * modules/lseek: New module.
+ * m4/lseek.m4: New file.
+ * lib/lseek.c: New file.
+ * modules/lseek-tests: New file.
+ * tests/test-lseek.c: New file.
+ * tests/test-lseek.sh: New file.
+ * MODULES.html.sh: Document lseek module.
+ * modules/fflush (Depends-on): Add lseek, fseeko.
+ * modules/fseeko (Depends-on): Likewise.
+ * modules/ftello (Depends-on): Likewise.
+ * m4/fseeko.m4 (gl_FUNC_FSEEKO): Replace fseek[o] if lseek is
+ broken.
+ * m4/ftello.m4 (gl_FUNC_FTELLO): Replace ftell[o] if lseek is
+ broken.
+ * m4/fflush.m4 (gl_REPLACE_FFLUSH): Trigger fseeko module.
+ * lib/fseeko.c (rpl_fseeko): Quit early on non-seekable files.
+ * lib/ftello.c (rpl_ftello): Likewise.
+ * tests/test-fseeko.c (main): Test this.
+ * tests/test-fseeko.sh: Likewise.
+ * tests/test-ftello.c (main): Likewise.
+ * tests/test-ftello.sh: Likewise.
+ * lib/stdio_.h (fseek, ftell): Simplify, since missing fseeko now
+ implies replacing fseek.
+ * modules/stdio (Makefile.am): No longer need HAVE_FSEEKO,
+ HAVE_FTELLO.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add lseek info.
+ * modules/unistd (Makefile.am): Likewise.
+ * lib/unistd_.h (lseek): Declare a replacement.
+ * doc/functions/lseek.texi (lseek): Document this fix.
+ * doc/functions/fseek.texi (fseek): Likewise.
+ * doc/functions/ftell.texi (ftell): Likewise.
+
+2007-05-24 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (test_function): Allow up to 50 bytes
+ in the printed representation of a NaN.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ Reported by Eric Blake.
+
+2007-05-23 Eric Blake <ebb9@byu.net>
+
+ Fix fseeko/ftello on cygwin 1.5.24.
+ * doc/functions/fseeko.texi (fseeko): Document the fix.
+ * doc/functions/ftello.texi (ftello): Document the fix.
+ * doc/functions/stdin.texi (stdin): Document the cygwin bug.
+ * doc/functions/stdout.text (stdout): New file.
+ * doc/functions/stderr.text (stderr): New file.
+ * doc/gnulib.texi (Function Substitutes): Use new files.
+ * tests/test-fseeko.c (main): Check for broken fseeko on cygwin
+ prior to 1.7.0.
+ * tests/test-ftello.c (main): Likewise for ftello.
+ * tests/test-fseeko.sh: New file.
+ * tests/test-ftello.sh: New file.
+ * modules/fseeko-tests (Makefile.am): Ensure test-fseeko is run
+ with seekable stdin.
+ * modules/ftello-tests (Makefile.am): Likewise for test-ftello.
+ * m4/fseeko.m4 (gl_FUNC_FSEEKO): Detect the cygwin bug.
+ (gl_REPLACE_FSEEKO): New macro.
+ * m4/ftello.m4 (gl_FUNC_FTELLO, gl_REPLACE_FTELLO): Likewise.
+ * modules/fseeko (Files): Distribute fseeko.c.
+ * modules/ftello (Files): Distribute ftello.c.
+ * lib/fseeko.c (rpl_fseeko) [__CYGWIN__]: Convert stdin to 64-bit
+ mode.
+ * lib/ftello.c (rpl_ftello): New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Allow replacement of
+ fseeko, ftello.
+ (gl_STDIN_LARGE_OFFSET): New macro.
+ * modules/stdio (Makefile.am): Perform the replacement.
+ * lib/stdio_.h (rpl_fseeko, rpl_ftello): Define when needed.
+
+2007-05-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h (fseeko, ftello): Provide a link warning only if
+ GNULIB_POSIXCHECK is defined.
+
+2007-05-21 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_INFINITE, gl_PRINTF_INFINITE_LONG_DOUBLE):
+ Check also the output for NaN arguments. When cross-compiling, guess
+ no on IRIX.
+ * lib/vasnprintf.c: Update comments.
+ * tests/test-vasnprintf-posix.c (strisnan): New function.
+ (test_function): Use it.
+ * tests/test-vasprintf-posix.c (strisnan): New function.
+ (test_function): Use it.
+ * tests/test-snprintf-posix.h (strisnan): New function.
+ (test_function): Use it.
+ * tests/test-sprintf-posix.h (strisnan): New function.
+ (test_function): Use it.
+ Reported by Eric Blake.
+
+2007-05-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): Add test for large finite
+ numbers that fails on BeOS.
+ * doc/functions/frexpl.texi: Update.
+
+2007-05-20 Jim Meyering <jim@meyering.net>
+
+ * NEWS: Mention the incompatible change (s/futimens/gl_futimens/)
+ forced upon us by glibc-2.6.
+
+2007-05-20 Bruno Haible <bruno@clisp.org>
+
+ Fix *printf result for NaN, Inf on AIX, Solaris, OSF/1.
+ * m4/printf.m4 (gl_PRINTF_INFINITE): Update cross-compiling guesses.
+ (gl_PRINTF_INFINITE_LONG_DOUBLE): New macro.
+ * lib/vasnprintf.c: Use NEED_PRINTF_INFINITE_DOUBLE instead of
+ NEED_PRINTF_INFINITE.
+ (is_infinitel): New function.
+ (VASNPRINTF): Handle NEED_PRINTF_INFINITE_LONG_DOUBLE case.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE): Renamed from
+ gl_PREREQ_VASNPRINTF_INFINITE.
+ (gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE): New macro.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+ gl_PRINTF_INFINITE_LONG_DOUBLE and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE and
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE instead of
+ gl_PREREQ_VASNPRINTF_INFINITE.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * doc/functions/fprintf.texi: Update.
+ * doc/functions/printf.texi: Update.
+ * doc/functions/snprintf.texi: Update.
+ * doc/functions/sprintf.texi: Update.
+ * doc/functions/vfprintf.texi: Update.
+ * doc/functions/vprintf.texi: Update.
+ * doc/functions/vsnprintf.texi: Update.
+ * doc/functions/vsprintf.texi: Update.
+
+2007-05-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_NO_LIBM): Set REPLACE_FREXPL if frexpl
+ was not found in libc.
+ * m4/printf-frexpl.m4 (gl_FUNC_PRINTF_FREXPL): Likewise.
+
+2007-05-20 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (test_function): Allow NaN to be
+ printed as "-nan" instead of "nan".
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ Needed for HP-UX 11.
+
+2007-05-20 Jim Meyering <jim@meyering.net>
+
+ Fix buggy test for the fchownat-deref bug.
+ * m4/openat.m4 (gl_FUNC_FCHOWNAT_DEREF_BUG): Create the dangling
+ symlink required for the run-test. Without it, this test would
+ always declare that fchownat doesn't work, and client code would
+ unnecessarily use the replacement function with fixed libc.
+ (gl_FUNC_FCHOWNAT): Eliminate a variable that wasn't initialized.
+ Reported by Greg Schafer.
+
+2007-05-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanf.m4 (gl_ISNANF_WORKS): New macro.
+ (gl_FUNC_ISNANF_NO_LIBM): Invoke it.
+ * lib/isnan.c (FUNC): Use run-time expressions for SGI compiler.
+ Needed for IRIX 6.5 and Solaris 2.5.1.
+
+2007-05-19 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (have_minus_zero): New function.
+ (test_function): Skip tests involving -0.0 on platforms where
+ -0.0 = 0.0.
+ * tests/test-vasprintf-posix.c (have_minus_zero): New function.
+ (test_function): Skip tests involving -0.0 on platforms where
+ -0.0 = 0.0.
+ * tests/test-snprintf-posix.h (have_minus_zero): New function.
+ (test_function): Skip tests involving -0.0 on platforms where
+ -0.0 = 0.0.
+ * tests/test-sprintf-posix.h (have_minus_zero): New function.
+ (test_function): Skip tests involving -0.0 on platforms where
+ -0.0 = 0.0.
+ * tests/test-fprintf-posix.h (test_function): Remove all -0.0 related
+ tests.
+ * tests/test-printf-posix.h (test_function): Likewise.
+ * tests/test-printf-posix.output: Remove all -0.0 related results.
+ Needed for IRIX 6.5.
+
+2007-05-19 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (test_function): Allow NaN to be
+ printed as "nan0x7fffffff" instead of "nan".
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-fprintf-posix.h (NaN): Remove macro.
+ (test_function): Remove all NaN related tests.
+ * tests/test-printf-posix.h (NaN): Remove macro.
+ (test_function): Remove all NaN related tests.
+ * tests/test-printf-posix.output: Remove all NaN related results.
+ Needed for IRIX 6.5.
+
+2007-05-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexp.m4 (gl_FUNC_FREXP_WORKS): Fix C89 syntax error in test code.
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): Likewise.
+
+2007-05-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/float_.h: New file.
+ * m4/float_h.m4: New file.
+ * modules/float: New file.
+ * modules/isnanl (Dependencies): Add float.
+ * modules/isnanl-nolibm (Dependencies): Likewise.
+ * modules/mathl (Dependencies): Likewise.
+ * modules/printf-frexpl (Dependencies): Likewise.
+ * modules/signbit (Dependencies): Likewise.
+ * modules/vasnprintf (Dependencies): Likewise.
+ * doc/headers/float.texi: Update.
+
+2007-05-19 Jim Meyering <jim@meyering.net>
+
+ * lib/utimens.c (gl_futimens): Rename from futimens,
+ now that glibc-2.6 declares futimens.
+ * lib/utimens.h: Likewise.
+
+2007-05-19 Bruno Haible <bruno@clisp.org>
+
+ Avoid test failures on mingw.
+ * tests/test-fprintf-posix.sh: Convert CR/LF to LF in output.
+ * tests/test-printf-posix.sh: Likewise.
+ * tests/test-vfprintf-posix.sh: Likewise.
+ * tests/test-vprintf-posix.sh: Likewise.
+
+2007-05-19 Bruno Haible <bruno@clisp.org>
+
+ Fix *printf result for NaN, Inf, -0.0 on mingw.
+ * m4/printf.m4 (gl_PRINTF_INFINITE): New macro.
+ * lib/vasnprintf.c: Include math.h and isnan.h.
+ (is_infinite_or_zero): New function.
+ (VASNPRINTF): Fix also the handling of infinite or zero 'double'
+ values in the %f, %F, %e, %E, %g, %G directives.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_INFINITE): New macro.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+ gl_PRINTF_INFINITE and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_INFINITE.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * doc/functions/fprintf.texi: Update.
+ * doc/functions/printf.texi: Update.
+ * doc/functions/snprintf.texi: Update.
+ * doc/functions/sprintf.texi: Update.
+ * doc/functions/vfprintf.texi: Update.
+ * doc/functions/vprintf.texi: Update.
+ * doc/functions/vsnprintf.texi: Update.
+ * doc/functions/vsprintf.texi: Update.
+
+2007-05-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (convert_to_decimal): Add an extra_zeroes argument.
+ (scale10_round_decimal_long_double): Inline scale10_round_long_double.
+ Instead of multiplying with 10^k, set extra_zeroes to k.
+ (scale10_round_long_double): Remove function.
+
+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF) [NEED_PRINTF_FLAG_ZERO]: Fix logic bug
+ introduced on 2007-05-06.
+
+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (test_function): Also test the %e and
+ %g directives.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+
+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (SIZEOF): New macro.
+ (strmatch): New function.
+ (test_function): Test the %f directive on numbers of various exponents.
+ * tests/test-vasprintf-posix.c (SIZEOF): New macro.
+ (strmatch): New function.
+ (test_function): Test the %f directive on numbers of various exponents.
+ * tests/test-snprintf-posix.h (strmatch): New function.
+ (test_function): Test the %f directive on numbers of various exponents.
+ * tests/test-sprintf-posix.h (strmatch): New function.
+ (test_function): Test the %f directive on numbers of various exponents.
+ * tests/test-snprintf-posix.c (SIZEOF): New macro.
+ * tests/test-sprintf-posix.c (SIZEOF): New macro.
+ * tests/test-vsnprintf-posix.c (SIZEOF): New macro.
+ * tests/test-vsprintf-posix.c (SIZEOF): New macro.
+
+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ Add support for 'long double' number output.
+ * m4/printf.m4 (gl_PRINTF_LONG_DOUBLE): New macro.
+ * lib/vasnprintf.c: Include math.h and float+.h.
+ (mp_limb_t): New type.
+ (GMP_LIMB_BITS): New macro.
+ (mp_twolimb_t): New type.
+ (GMP_TWOLIMB_BITS): New macro.
+ (mpn_t): New type.
+ (multiply, divide, convert_to_decimal, decode_long_double,
+ scale10_round_long_double, scale10_round_decimal_long_double,
+ floorlog10l): New functions.
+ (VASNPRINTF) [NEED_PRINTF_LONG_DOUBLE]: Implement 'long double' support
+ for the %f, %F, %e, %E, %g, %G directives.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_LONG_DOUBLE): New macro.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+ gl_PRINTF_LONG_DOUBLE and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * modules/fprintf-posix (Depends-on): Add frexpl-nolibm.
+ * modules/snprintf-posix (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/vasnprintf-posix (Depends-on): Likewise.
+ * modules/vasprintf-posix (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf-posix (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+ * modules/vasnprintf (Files): Add lib/float+.h.
+ * doc/functions/fprintf.texi: Update.
+ * doc/functions/printf.texi: Update.
+ * doc/functions/snprintf.texi: Update.
+ * doc/functions/sprintf.texi: Update.
+ * doc/functions/vfprintf.texi: Update.
+ * doc/functions/vprintf.texi: Update.
+ * doc/functions/vsnprintf.texi: Update.
+ * doc/functions/vsprintf.texi: Update.
+
+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (USE_SNPRINTF): Define to 0 on BeOS.
+
+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF) [WIN32]: Use %I64d instead of %lld
+ for printing 64-bit integers. Needed for mingw.
+
+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf-frexpl.m4 (gl_FUNC_PRINTF_FREXPL): Invoke
+ gl_FUNC_FREXPL_WORKS.
+ * modules/printf-frexpl (Files): Add m4/frexpl.m4.
+
+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/frexpl-nolibm-tests: New file.
+
+ * modules/frexpl-nolibm: New file.
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_NO_LIBM): New macro.
+
+2007-05-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/dirent_.h: Prefer #include_next <foo.h> to #include
+ @ABSOLUTE_FOO_H@ if @HAVE_INCLUDE_NEXT@. This works better with
+ GCC 4.2, which otherwise issues a lot of warnings.
+ * lib/iconv_.h, lib/locale_.h, lib/netinet_in_.h, lib/sys_select_.h:
+ * lib/sys_socket_.h, lib/sys_stat_.h, lib/sysexits_.h, lib/unistd_.h:
+ Likewise.
+ * modules/fchdir (dirent.h): Substitute @HAVE_INCLUDE_NEXT@.
+ * modules/iconv_open (iconv.h): Likewise.
+ * modules/locale (locale.h): Likewise.
+ * modules/netinet_in (netinet/in.h): Likewise.
+ * modules/sys_select (sys_select.h): Likewise.
+ * modules/sys_socket (sys/socket.h): Likewise.
+ * modules/sys_stat (sys/stat.h): Likewise.
+ * modules/sysexits (sysexits.h): Likewise.
+ * modules/unistd (unistd.h): Likewise.
+
+2007-05-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/closein-tests (Makefile.am): Distribute
+ `test-closein.sh'.
+
+2007-05-17 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-printf-posix.output: Renamed from
+ tests/test-fprintf-posix.out.
+ * modules/fprintf-posix-tests: Update.
+ * modules/printf-posix-tests: Update.
+ * modules/vfprintf-posix-tests: Update.
+ * modules/vprintf-posix-tests: Update.
+ * tests/test-fprintf-posix.sh: Update.
+ * tests/test-printf-posix.sh: Update.
+ * tests/test-vfprintf-posix.sh: Update.
+ * tests/test-vprintf-posix.sh: Update.
+ Reported by Ralf Wildenhues.
+
+2007-05-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fcntl_.h: Prefer #include_next <foo.h> to #include
+ @ABSOLUTE_FOO_H@ if @HAVE_INCLUDE_NEXT@. This works better with
+ GCC 4.2, which otherwise issues a lot of warnings.
+ * lib/inttypes_.h, lib/math_.h, lib/search_.h, lib/signal_.h:
+ * lib/stdint_.h, lib/stdio_.h, lib/stdlib_.h, lib/string_.h:
+ * lib/sys_time_.h, lib/time_.h, lib/wchar_.h, lib/wctype_.h: Likewise.
+ * lib/stdlib_.h: Don't bother with #pragma GCC system_header, as
+ it should no longer be needed.
+ * lib/string_.h: Likewise.
+ * modules/absolute-header (HAVE_INCLUDE_NEXT): New 'make' define.
+ * modules/fcntl (fcntl.h): Substitute @HAVE_INCLUDE_NEXT@.
+ * modules/inttypes (inttypes.h): Likewise.
+ * modules/math (math.h): Likewise.
+ * modules/search (search.h): Likewise.
+ * modules/signal (signal.h): Likewise.
+ * modules/stdint (stdint.h): Likewise.
+ * modules/stdio (stdio.h): Likewise.
+ * modules/stdlib (stdlib.h): Likewise.
+ * modules/string (string.h): Likewise.
+ * modules/sys_time (sys/time.h): Likewise.
+ * modules/time (time.h): Likewise.
+ * modules/wchar (wchar.h): Likewise.
+ * modules/wctype (wtype.h): Likewise.
+
+2007-05-16 Thien-Thi Nguyen <ttn@gnuvola.org> (tiny change)
+
+ * doc/gnulib-tool.texi (CVS Issues): Fix typo.
+
+2007-05-13 Bruno Haible <bruno@clisp.org>
+
+ * stpcpy.m4 (gl_FUNC_STPCPY): Require AC_C_RESTRICT.
+ * stpncpy.m4 (gl_FUNC_STPNCPY): Likewise.
+ * strsep.m4 (gl_FUNC_STRSEP): Likewise.
+ * strtok_r.m4 (gl_FUNC_STRTOK_R): Likewise.
+ (gl_PREREQ_STRTOK_R): Don't require it here.
+
+2007-05-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdlib_.h (mkdtemp, mkstemp): Comment out argument name. Needed
+ when used in C++ mode.
+
+2007-05-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/linebuffer.h: Tweak doc.
+ * lib/linebuffer.c: Likewise.
+
+2007-05-12 James Youngman <jay@gnu.org>
+
+ * lib/linebuffer.c (readlinebuffer_delim): New function,
+ like readlinebuffer, but use a caller-specified delimiter.
+ (readlinebuffer): Just call readlinebuffer_delim with '\n'
+ as the delimiter.
+ * lib/linebuffer.h (readlinebuffer_delim): Declare it.
+
+2007-05-12 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * m4/openat.m4 (gl_FUNC_OPENAT): Do not require openat-die.
+ * modules/openat (Files): Remove openat-die.c.
+ (Depends-on): Add openat-die.
+ * modules/openat-die: New module.
+
+2007-05-06 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_FLAG_GROUPING, gl_VSNPRINTF_ZEROSIZE_C99):
+ Update with info about Cygwin.
+ * doc/functions/fprintf.texi: Update.
+ * doc/functions/printf.texi: Update.
+ * doc/functions/snprintf.texi: Update.
+ * doc/functions/sprintf.texi: Update.
+ * doc/functions/vfprintf.texi: Update.
+ * doc/functions/vprintf.texi: Update.
+ * doc/functions/vsnprintf.texi: Update.
+ * doc/functions/vsprintf.texi: Update.
+ Reported by Eric Blake.
+
+2007-05-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF) [NEED_PRINTF_FLAG_ZERO]: Perform the
+ padding ourselves for the floating-point directives.
+ * m4/printf.m4 (gl_PRINTF_FLAG_ZERO): New macro.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_FLAG_ZERO): New macro.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Invoke
+ gl_PRINTF_FLAG_ZERO and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Also check the width
+ and some flags in the %f directive.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-vasnprintf-posix.c (test_function): Likewise.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * doc/functions/fprintf.texi: Update.
+ * doc/functions/printf.texi: Update.
+ * doc/functions/snprintf.texi: Update.
+ * doc/functions/sprintf.texi: Update.
+ * doc/functions/vfprintf.texi: Update.
+ * doc/functions/vprintf.texi: Update.
+ * doc/functions/vsnprintf.texi: Update.
+ * doc/functions/vsprintf.texi: Update.
+
+2007-05-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF) [NEED_PRINTF_FLAG_GROUPING]: Don't
+ pass the ' flag character to sprintf or snprintf.
+ * m4/printf.m4 (gl_PRINTF_FLAG_GROUPING): New macro.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_FLAG_GROUPING): New macro.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Invoke
+ gl_PRINTF_FLAG_GROUPING and test its result. Invoke
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Also check the grouping
+ flag.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-vasnprintf-posix.c (test_function): Likewise.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * doc/functions/fprintf.texi: Update.
+ * doc/functions/printf.texi: Update.
+ * doc/functions/snprintf.texi: Update.
+ * doc/functions/sprintf.texi: Update.
+ * doc/functions/vfprintf.texi: Update.
+ * doc/functions/vprintf.texi: Update.
+ * doc/functions/vsnprintf.texi: Update.
+ * doc/functions/vsprintf.texi: Update.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-argp-2.sh (func_compare): Drop .exe suffix.
+
+2007-05-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/d-ino.m4 (gl_CHECK_TYPE_STRUCT_DIRENT_D_INO): Use better
+ comment for D_INO_IN_DIRENT. Problem reported by James Youngman.
+
+2007-05-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/d-ino.m4 (gl_CHECK_TYPE_STRUCT_DIRENT_D_INO): Test whether
+ readdir returns garbage in d_ino. Problem reported by Kaz Sasayama in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-05/msg00021.html>.
+
+2007-05-02 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-help.c (struct hol_entry): New member `ord'.
+ (HOL_ENTRY_PTRCMP): Use ord for comparison
+ (hol_sort): Initialize ord.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions/_Exit_C99.texi: Renamed from doc/functions/_Exit.texi.
+ Reported by Eric Blake.
+ * doc/gnulib.texi (Function Substitutes): Update.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions.texi: Remove file, now redundant through
+ doc/functions/*.texi.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * modules/argp (Depends-on): Add sleep.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * modules/sleep-tests: New file.
+ * tests/test-sleep.c: New file.
+
+ * modules/sleep: New file.
+ * lib/sleep.c: New file.
+ * m4/sleep.m4: New file.
+ * lib/unistd_.h (sleep): New declaration.
+ * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_SLEEP,
+ HAVE_SLEEP.
+ * modules/unistd (Makefile.am): Substitute GNULIB_SLEEP, HAVE_SLEEP.
+ * doc/functions/sleep.texi: Document the sleep module.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/sigprocmask.h: Remove file.
+ * lib/signal_.h: Incorporate the previous contents of sigprocmask.h.
+ * lib/sigprocmask.c: Include <signal.h> instead of sigprocmask.h.
+ * m4/signal_h.m4 (gl_SIGNAL_H_DEFAULTS): Substitute GNULIB_SIGPROCMASK,
+ HAVE_POSIX_SIGNALBLOCKING, HAVE_SIGSET_T.
+ * m4/signalblocking.m4 (gl_SIGNALBLOCKING): Require
+ gl_SIGNAL_H_DEFAULTS. Set HAVE_POSIX_SIGNALBLOCKING as a shell variable.
+ (gl_PREREQ_SIGPROCMASK): Require gl_SIGNAL_H_DEFAULTS. Set
+ HAVE_SIGSET_T as a shell variable.
+ * modules/signal (Makefile.am): Substitute GNULIB_SIGPROCMASK,
+ HAVE_POSIX_SIGNALBLOCKING, HAVE_SIGSET_T into signal.h.
+ * modules/sigprocmask (Files): Remove lib/sigprocmask.h.
+ (Depends-on): Add signal. Remove verify.
+ (configure.ac): Invoke gl_SIGNAL_MODULE_INDICATOR.
+ (Include): Mention <signal.h> instead of sigprocmask.h.
+ * NEWS: Mention the change.
+ * lib/fatal-signal.c: Don't include sigprocmask.h.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * modules/signal: New file.
+ * lib/signal_.h: New file.
+ * m4/signal_h.m4: New file.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/wctype_.h: Test HAVE_ISWCNTRL at configure time.
+ * m4/wctype.m4 (gl_WCTYPE_H): Substitute HAVE_ISWCNTRL.
+ * modules/wctype (Makefile.am): Substitute HAVE_ISWCNTRL instead of
+ HAVE_WCTYPE_CTMP_BUG into wctype.h.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_stat_.h: Test HAVE_LSTAT, HAVE_DECL_MKDIR, HAVE_IO_H at
+ configure time.
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Substitute HAVE_LSTAT,
+ HAVE_DECL_MKDIR, HAVE_IO_H via AC_SUBST.
+ * modules/sys_stat (Makefile.am): Substitute their values into
+ sys/stat.h.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/glob_.h: Test HAVE_SYS_CDEFS_H at configure time.
+ * m4/glob.m4 (gl_PREREQ_GLOB): Substitute HAVE_SYS_CDEFS_H via AC_SUBST.
+ * modules/glob (Makefile.am): Put HAVE_SYS_CDEFS_H value into glob.h.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/header/assert.texi: Undo last change: don't mention the gnulib
+ 'assert' module here.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/functions/*.texi: New files.
+ * doc/functions/google-ranking.txt: New file.
+ * doc/gnulib.texi (Function Substitutes): New chapter.
+ (ctime, inet_ntoa): Remove sections.
+ * doc/ctime.texi: Remove file.
+ * doc/inet_ntoa.texi: Remove file.
+ * doc/Makefile (gnulib.info, gnulib.html, gnulib.dvi): Update
+ dependencies.
+ (%.info): New rule, specifying a --reference-limit.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (posix_functions): Remove 'exec', 'toc'.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * modules/mkdir (Depends-on): Add sys_stat, because sys_stat provides
+ the portability of 'mkdir' to mingw systems.
+
+2007-05-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/headers/google-ranking.txt: New file.
+
+2007-04-30 Eric Blake <ebb9@byu.net>
+
+ Prefer fseeko to fseek.
+ * modules/getpass (Depends-on): Add fseeko.
+ * lib/getpass.c (getpass): Use fseeko, not fseek.
+
+2007-04-30 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-help.c (hol_entry_cmp): Option sorting algorithm
+ assumes the sorting is stable, while most qsort implementations
+ are not. Use argument addresses to ensure they never compare as
+ equal.
+
+ * tests/test-argp-2.sh (usage-indent test): Fix output
+ (func_compare): Restore diff options
+ * tests/test-argp.c: Restore #include "progname.h"
+
+2007-04-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_VSNPRINTF_ZEROSIZE_C99): New macro.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Invoke
+ gl_VSNPRINTF_ZEROSIZE_C99. Test gl_cv_func_vsnprintf_zerosize_c99.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * modules/snprintf-posix-tests (Files): Add tests/test-snprintf.c.
+ (configure.ac): Define CHECK_SNPRINTF_POSIX.
+ (TESTS, check_PROGRAMS): Add test-snprintf.
+ * modules/vsnprintf-posix-tests (Files): Add tests/test-vsnprintf.c.
+ (configure.ac): Define CHECK_VSNPRINTF_POSIX.
+ (TESTS, check_PROGRAMS): Add test-vsnprintf.
+ * tests/test-snprintf.c (main) [!CHECK_SNPRINTF_POSIX]: Disable
+ assertions that fail on HP-UX, OSF/1, or IRIX.
+ * tests/test-vsnprintf.c (main) [!CHECK_VSNPRINTF_POSIX]: Likewise.
+
+2007-04-29 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (posix_functions): Remove 'contents'.
+
+2007-04-29 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (gendocs_template_min): new entry.
+
+2007-04-29 Bruno Haible <bruno@clisp.org>
+
+ Work around fpurge bug on BSD systems.
+ * modules/fpurge (Makefile.am): Compile fpurge.c unconditionally.
+ * m4/fpurge.m4 (gl_FUNC_FPURGE): Don't invoke AC_LIBOBJ.
+ * lib/fpurge.h (fpurge): Don't handle __fpurge wrapper here. Define
+ fpurge to rpl_fpurge if the system already has this function.
+ * lib/fpurge.c (fpurge): Handle also the __fpurge wrapper case and
+ the case where the system already has this function. Correct invariants
+ on BSD systems.
+ * lib/fseeko.c (rpl_fseeko): Update recognition of preceding fflush on
+ BSD systems.
+
+2007-04-29 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-help.c (hol_cluster_cmp): Reverse comparison. Change
+ proposed by Sven Verdoolaege.
+
+ * tests/test-argp.c: Fix option ordering. Test deeply clustered
+ options.
+ * tests/test-argp-2.sh (func_compare): Use diff instead of cmp.
+ (usage and help tests): Update
+
+2007-04-29 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fflush.c (main): Use a file of size 17, not 10.
+ Print more information in case of failure. Disable a test on BeOS.
+
+2007-04-29 Bruno Haible <bruno@clisp.org>
+
+ * tests/**/test-*.[hc] (ASSERT): Use fprintf to show the line number.
+ This helps debugging on systems on which no gdb is available.
+
+2007-04-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/freading.h: Improve comments.
+ * lib/fwriting.h: Likewise.
+ * tests/test-freading.c (main): Don't check freading immediately after
+ repositioning. Needed for glibc.
+
+2007-04-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/freading.c (freading): Trivial simplification.
+
+2007-04-28 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fwriting.c (main): Also test the interaction between
+ fflush and fwriting.
+ * modules/fwriting-tests (Depends-on): Add fflush.
+
+ * tests/test-freading.c (main): Also test the interaction between
+ fflush and freading.
+ * modules/freading-tests (Depends-on): Add fflush.
+
+2007-04-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h (fseek, ftell): Provide link warnings suggesting to use
+ fseeko and ftello.
+ Suggested by Eric Blake.
+
+2007-04-28 Jim Meyering <jim@meyering.net>
+
+ Avoid false-negative in gl_STDINT_H's C99 conformance test.
+ * m4/stdint.m4 (gl_STDINT_H): When checking whether stdint.h conforms
+ to C99, include all of gl_STDINT_INCLUDES, not just <stddef.h>.
+
+2007-04-27 Eric Blake <ebb9@byu.net>
+
+ * doc/headers/assert.texi (assert.h): Document assert module use.
+
+2007-04-27 Bruno Haible <bruno@clisp.org>
+
+ * doc/headers/*.texi: New files.
+ * doc/gnulib.texi (Header File Substitutes): New chapter.
+ * doc/Makefile (gnulib.info, gnulib.html, gnulib.dvi): Specify
+ dependencies.
+ (standards.info ,standards.html, standards.dvi): Update dependencies.
+ (mostlyclean, clean): New targets.
+
+2007-04-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/sysexits_.h: Renamed from lib/sysexit_.h.
+ * modules/sysexits (Files, Makefile.am): Update.
+
+ * lib/sys_socket_.h: Renamed from lib/socket_.h.
+ * modules/sys_socket (Files, Makefile.am): Update.
+
+ * lib/sys_stat_.h: Renamed from lib/stat_.h.
+ * modules/sys_stat (Files, Makefile.am): Update.
+
+2007-04-27 Eric Blake <ebb9@byu.net>
+
+ * lib/freading.h: Improve comments.
+ * lib/fwriting.h: Likewise.
+ * lib/fflush.c: Likewise.
+
+ Fix closein for mingw.
+ * modules/closein-tests: Add tests for closein.
+ * tests/test-closein.c: New file.
+ * tests/test-closein.sh: Likewise.
+ * lib/unistd_.h [!SEEK_CUR]: Mingw also needs stdlib.h for _exit.
+ * lib/closein.c (close_stdin): Don't fflush non-seekable streams.
+
+2007-04-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/inttypes_.h [_DECC]: Don't use #include_next if the compiler
+ version is < 6.
+ * lib/math_.h [__DECC]: Likewise.
+ * lib/stdio_.h [__DECC]: Likewise.
+ * lib/stdlib_.h [__DECC]: Likewise.
+ * lib/string_.h [__DECC]: Likewise.
+ * lib/time_.h [__DECC]: Likewise.
+ * lib/wchar_.h [__DECC]: Likewise.
+ * lib/wctype_.h [__DECC]: Likewise.
+
+2007-04-27 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fbufmode.c (main): Relax test, to avoid failure on mingw.
+
+2007-04-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/fflush.c: Add comments.
+ * modules/fpurge-tests (Depends-on): Add fflush.
+ * modules/freadable-tests (Depends-on): Likewise.
+ * modules/fwritable-tests (Depends-on): Likewise.
+
+2007-04-27 Charles Wilson <libtool@cwilson.fastmail.fm>
+
+ * m4/argz.m4 (gl_FUNC_ARGZ): Use !HAVE_WORKING_ARGZ instead of
+ SYSTEM_ARGZ_IS_BROKEN. Also, minor stylistic improvements.
+ Report by Bruno Haible <bruno@clisp.org>.
+
+2007-04-26 Eric Blake <ebb9@byu.net>
+
+ Fix fflush on mingw.
+ * modules/fflush (Depends-on): Add freading.
+ * lib/fflush.c (rpl_fflush): Use freading to avoid losing buffered
+ but unread data.
+
+2007-04-26 Eric Blake <ebb9@byu.net>
+ and Bruno Haible <bruno@clisp.org>
+
+ Implement freading and fwriting.
+ * lib/freading.c: New file.
+ * lib/freading.h: Likewise.
+ * m4/freading.m4: Likewise.
+ * modules/freading: Likewise.
+ * modules/freading-tests: Likewise.
+ * tests/test-freading.c: Likewise.
+ * lib/fwriting.c: New file.
+ * lib/fwriting.h: Likewise.
+ * m4/fwriting.m4: Likewise.
+ * modules/fwriting: Likewise.
+ * modules/fwriting-tests: Likewise.
+ * tests/test-fwriting.c: Likewise.
+ * MODULES.html.sh (File stream based Input/Output): Mention them.
+
+2007-04-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h (fseeko, ftello): Check that off_t has the same size as
+ 'long' when we assume it.
+ Suggested by Eric Blake.
+
+2007-04-26 Bruno Haible <bruno@clisp.org>
+
+ Ensure fseeko, ftello are declared on glibc systems.
+ * modules/fflush (configure.ac-early): Require AC_FUNC_FSEEKO.
+ * modules/fseeko (configure.ac-early): Likewise.
+ * modules/ftello (configure.ac-early): Likewise.
+ * m4/fflush.m4 (gl_REPLACE_FFLUSH): Don't define HAVE_FSEEKO, rely on
+ AC_FUNC_FSEEKO for this.
+ * m4/fseeko.m4 (gl_FUNC_FSEEKO): Inline gl_CHECK_FSEEKO.
+ (gl_CHECK_FSEEKO): Remove macro.
+
+2007-04-26 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fflush.c (main): Also check the ftell result after
+ fflush and fseek/fseeko.
+ * lib/fflush.c (rpl_fflush): For BSD implementations, update the
+ file descriptor position cache in the stream.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+
+2007-04-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/fflush-tests (Depends-on): Add fseeko.
+
+2007-04-25 Charles Wilson <libtool@cwilson.fastmail.fm>
+ Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/argz_.h: ensure error_t definition is obtained in same
+ mechanism system argz.h would have.
+ * m4/argz.m4 (gl_FUNC_ARGZ): add new test to check if $host's
+ argz facilities are known bad. Err on the side of caution if
+ cross-compiling.
+
+2007-04-25 Eric Blake <ebb9@byu.net>
+
+ * lib/fpurge.c (includes): Use stdlib.h for free.
+ * tests/test-fflush.c (main): Also test fflush-fseeko.
+
+2007-04-25 Bruno Haible <bruno@clisp.org>
+
+ Make fflush+fseek POSIX-compliant on FreeBSD and MacOS X.
+ * lib/fseeko.c: New file.
+ * lib/stdio_.h: Include <sys/types.h> when off_t is needed.
+ (fseeko, fseek): Define to replacements if REPLACE_FFLUSH.
+ * m4/fseeko.m4 (gl_CHECK_FSEEKO): New macro, extracted from
+ gl_FUNC_FSEEKO.
+ (gl_FUNC_FSEEKO): Invoke it.
+ * m4/fflush.m4 (gl_REPLACE_FFLUSH): Arrange to compile fseeko.c. Invoke
+ gl_CHECK_FSEEKO. Define HAVE_FSEEKO.
+ * modules/fflush (Files): Add lib/fseeko.c, m4/fseeko.m4.
+
+2007-04-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/fflush (Depends-on): Add ftello.
+
+2007-04-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/ftello-tests: New file.
+ * tests/test-ftello.c: New file.
+
+ * modules/ftello: New file.
+ * m4/ftello.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_FTELLO,
+ HAVE_FTELLO.
+ * lib/stdio_.h (ftello): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_FTELLO,
+ HAVE_FTELLO.
+
+2007-04-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/fseeko-tests: New file.
+ * tests/test-fseeko.c: New file.
+
+ * modules/fseeko: New file.
+ * m4/fseeko.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_FSEEKO,
+ HAVE_FSEEKO.
+ * lib/stdio_.h (fseeko): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_FSEEKO,
+ HAVE_FSEEKO.
+
+2007-04-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h (fflush): Add support for GNULIB_POSIXCHECK.
+
+2007-04-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistd_.h: Include <stdio.h> if needed to get the SEEK_* macros.
+ * tests/test-stdio.c: Check that the various SEEK_* macros are defined.
+ * tests/test-unistd.c: Likewise.
+ * tests/test-fcntl.c: Likewise.
+
+2007-04-23 Eric Blake <ebb9@byu.net>
+
+ * lib/fflush.c: Fix missing include.
+ Reported by Bruno Haible.
+
+2007-04-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/fpurge.c (fpurge) [glibc, BSD]: Free a malloc()ed ungetc buffer.
+ Reported by Eric Blake.
+
+2007-04-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/fbufmode.c (fbufmode): Port to Solaris/SPARC64.
+
+2007-04-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/fseterr.c (fseterr): Don't hardcode the value of _IOERR.
+
+2007-04-23 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-fbufmode.c (main): Be prepared to a failure of setvbuf.
+ Needed on HP-UX 11.
+
+2007-04-16 Eric Blake <ebb9@byu.net>
+
+ Make fflush rely on fpurge.
+ * lib/fflush.c (rpl_fflush): Rely on fpurge module, rather than
+ open coding all variants.
+ * modules/fflush (Depends-on): Add fpurge and unistd.
+ * modules/fflush-tests (Depends-on): Unistd is no longer extra.
+ * m4/fflush.m4 (gl_REPLACE_FFLUSH): Simplify.
+
+ Fix --with-tests compilation on cygwin.
+ * modules/argmatch-tests (Makefile.am): List gnulib library first
+ in LDADD.
+ * modules/argp-tests (Makefile.am): Likewise.
+ * modules/array-list-tests (Makefile.am): Likewise.
+ * modules/array-oset-tests (Makefile.am): Likewise.
+ * modules/avltree-list-tests (Makefile.am): Likewise.
+ * modules/avltree-oset-tests (Makefile.am): Likewise.
+ * modules/avltreehash-list-tests (Makefile.am): Likewise.
+ * modules/carray-list-tests (Makefile.am): Likewise.
+ * modules/dirname-tests (Makefile.am): Likewise.
+ * modules/frexp-tests (Makefile.am): Likewise.
+ * modules/isnanl-tests (Makefile.am): Likewise.
+ * modules/linked-list-tests (Makefile.am): Likewise.
+ * modules/linkedhash-list-tests (Makefile.am): Likewise.
+ * modules/lock-tests (Makefile.am): Likewise.
+ * modules/rbtree-list-tests (Makefile.am): Likewise.
+ * modules/rbtree-oset-tests (Makefile.am): Likewise.
+ * modules/rbtreehash-list-tests (Makefile.am): Likewise.
+ * modules/tls-tests (Makefile.am): Likewise.
+ * modules/tsearch-tests (Makefile.am): Likewise.
+ * modules/xvasprintf-tests (Makefile.am): Likewise.
+
+ Fix fpurge for cygwin.
+ * lib/fpurge.c (fpurge): Fix order of operation flub, and return a
+ value.
+ * modules/fpurge-tests (Depends-on): Clean up trash.
+
+2007-04-16 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc-libgcrypt.c (gc_hash_open): Shut up compiler warnings.
+
+ * m4/autobuild.m4: Re-indent.
+
+2007-04-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/fpurge-tests: New file.
+ * tests/test-fpurge.c: New file.
+
+ * modules/fpurge: New file.
+ * lib/fpurge.h: New file.
+ * lib/fpurge.c: New file.
+ * m4/fpurge.m4: New file.
+
+2007-04-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/fbufmode-tests: New file.
+ * tests/test-fbufmode.c: New file.
+
+ * modules/fbufmode: New file.
+ * lib/fbufmode.h: New file.
+ * lib/fbufmode.c: New file.
+ * m4/fbufmode.m4: New file.
+
+2007-04-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/fwritable-tests: New file.
+ * tests/test-fwritable.c: New file.
+
+ * modules/fwritable: New file.
+ * lib/fwritable.h: New file.
+ * lib/fwritable.c: New file.
+ * m4/fwritable.m4: New file.
+
+2007-04-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/freadable-tests: New file.
+ * tests/test-freadable.c: New file.
+
+ * modules/freadable: New file.
+ * lib/freadable.h: New file.
+ * lib/freadable.c: New file.
+ * m4/freadable.m4: New file.
+
+2007-04-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/fflush-tests (Makefile.am): Remove EXTRA_DIST. Augment
+ MOSTLYCLEANFILES.
+
+2007-04-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * build-aux/bootstrap (gnulib_tool_option_extras): New var, used by
+ gzip bootstrap.conf to avoid dragging in i18n machinery.
+ (gnulib_tool_option): Use it.
+
+2007-04-13 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (test_function): Add tests for %f and
+ %F directives.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-fprintf-posix.h (test_function): Likewise.
+ * tests/test-printf-posix.h (test_function): Likewise.
+ * tests/test-fprintf-posix.out: Likewise.
+
+2007-04-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/lock-tests (configure.ac): For LIBSCHED, try also -lposix4.
+ * modules/tls-tests (configure.ac): Likewise.
+ Reported by Arto C. Nirkko <anirkko@insel.ch>.
+
+2007-04-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/tls.c (glthread_tls_get): Fix return type.
+ Patch by Arto C. Nirkko <anirkko@insel.ch>.
+
+2007-04-12 Eric Blake <ebb9@byu.net>
+
+ * modules/gettime (Depends-on): Remove gettime.
+ Reported by Dmitry V. Levin.
+
+2007-04-12 Bruno Haible <bruno@clisp.org>
+
+ * modules/fflush (Include): Mention <stdio.h>.
+ * modules/strtoimax (Include): Mention <inttypes.h>.
+ * modules/strtoumax (Include): Likewise.
+
+2007-04-12 Eric Blake <ebb9@byu.net>
+
+ * .cvsignore: New file.
+ * .gitignore: Likewise.
+
+2007-04-12 Bruno Haible <bruno@clisp.org>
+
+ * modules/iconv-tests (test_iconv_LDADD): Mention -liconv after LDADD,
+ not before, since $(LDADD) often contains libgnu.a.
+ * modules/striconv-tests (test_striconv_LDADD): Likewise.
+ * modules/striconveh-tests (test_striconveh_LDADD): Likewise.
+ * modules/striconveha-tests (test_striconveha_LDADD): Likewise.
+ Needed on Cygwin.
+
+2007-04-12 Eric Blake <ebb9@byu.net>
+
+ Work around glibc's failure to flush stdin on fclose.
+ * lib/closein.c (close_stdin): Flush stdin before closing.
+
+ Work around glibc's failure to reset seekable stdin on exit.
+ * modules/closein: New module.
+ * lib/closein.c: New file.
+ * lib/closein.h: Likewise.
+ * m4/closein.m4: Likewise.
+ * MODULES.html.sh (File stream based Input/Output): Document it.
+
+2007-04-12 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool: Rename generated 'autobuild' script to
+ 'do-autobuild' in --create-megatestdir output.
+
+ * doc/gnulib.texi (Build robot for gnulib): Fix.
+
+2007-04-12 Simon Josefsson <simon@josefsson.org>
+
+ * modules/sysexits (Depends-on): Add absolute-header.
+
+2007-04-12 Eric Blake <ebb9@byu.net>
+
+ No need to preserve errno on success.
+ * lib/fflush.c (rpl_fflush): Simplify errno tracking.
+ Reported by Bruno Haible.
+
+2007-04-12 Simon Josefsson <simon@josefsson.org>
+
+ * MODULES.html.sh (Support for maintaining and releasing
+ projects): Add autobuild. Suggested by Eric Blake <ebb9@byu.net>.
+
+2007-04-12 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool (func_modules_add_dummy): Respect --avoid=dummy.
+
+2007-04-12 Simon Josefsson <simon@josefsson.org>
+
+ * modules/autobuild: New module.
+
+ * m4/autobuild.m4: New file.
+
+2007-04-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Implement the %F directive using the
+ %f directive, if NEED_PRINTF_DIRECTIVE_F is defined.
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_F): New macro.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_DIRECTIVE_F): New macro.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+ gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Invoke
+ gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Invoke
+ gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Invoke
+ gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Invoke
+ gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Invoke
+ gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Invoke
+ gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Invoke
+ gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+ Reported by Eric Blake.
+
+2007-04-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_A): Fix test. It always failed.
+
+2007-04-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_A): Add a test for correct result
+ for NaN and Infinity. Needed on FreeBSD 6.1.
+ * tests/test-vasnprintf-posix.c (test_function): Undo last change
+ regarding results for "%010a" of Infinity and NaN.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-fprintf-posix.h (test_function): Likewise.
+ * tests/test-printf-posix.h (test_function): Likewise.
+ * tests/test-fprintf-posix.out: Likewise.
+
+2007-04-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/locale-tests: New file.
+ * tests/test-locale.c: New file.
+
+ * modules/locale: New file.
+ * lib/locale_.h: New file.
+ * m4/locale_h.m4: New file.
+
+2007-04-10 Paul Eggert <eggert@cs.ucla.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/signbit.m4 (gl_SIGNBIT): When the sign bit position could not
+ be determined, test for availability of the copysignf, copysign,
+ copysignl functions.
+ * lib/signbitf.c (gl_signbitf): Use copysignf if available in libc.
+ * lib/signbitd.c (gl_signbitd): Use copysign if available in libc.
+ * lib/signbitl.c (gl_signbitl): Use copysignl if available in libc.
+
+2007-04-09 Eric Blake <ebb9@byu.net>
+
+ * lib/stdio_.h [REPLACE_FFLUSH]: Declare rpl_fflush.
+ * modules/stdio (Makefile.am): Support fflush.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Likewise.
+ * modules/fflush: New file.
+ * lib/fflush.c: Likewise.
+ * m4/fflush.m4: Likewise.
+ * modules/fflush-tests: New test.
+ * tests/test-fflush.c: Likewise.
+ * MODULES.html.sh (Input/output <stdio.h>): Document new module.
+
+2007-04-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c: Include <math.h>. Don't include float+.h.
+ (VASNPRINTF): Use signbit for faster determination whether to print a
+ minus sign.
+ * modules/vasnprintf (Files): Remove lib/float+.h.
+ * modules/fprintf-posix (Depends-on): Add signbit.
+ * modules/snprintf-posix (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/vasnprintf-posix (Depends-on): Likewise.
+ * modules/vasprintf-posix (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf-posix (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+
+2007-04-06 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-frexp.c (main): Test also the sign bit of zero results.
+ * tests/test-frexpl.c (main): Likewise.
+ * tests/test-ldexpl.c (main): Likewise.
+ * modules/frexp-tests (Depends-on): Add signbit.
+ * modules/frexpl-tests (Depdends-on): Likewise.
+ * modules/ldexpl-tests (Depdends-on): Likewise.
+
+2007-04-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/signbit-tests: New file.
+ * tests/test-signbit.c: New file.
+
+ * modules/signbit: New file.
+ * lib/signbitf.c: New file.
+ * lib/signbitd.c: New file.
+ * lib/signbitl.c: New file.
+ * m4/signbit.m4: New file.
+ * lib/math_.h (gl_signbitf, gl_signbitd, gl_signbitl): New declarations.
+ (signbit): New macro.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_SIGNBIT and
+ REPLACE_SIGNBIT.
+ * modules/math (Makefile.am) Substibute also GNULIB_SIGNBIT and
+ REPLACE_FREXPL into math.h.
+
+2007-04-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/isnanf-nolibm-tests: New file.
+ * tests/test-isnanf.c: New file.
+
+ * modules/isnanf-nolibm: New file.
+ * lib/isnanf.h: New file.
+ * lib/isnanf.c: New file.
+ * lib/isnan.c: Consider the USE_FLOAT macro.
+ * m4/isnanf.m4: New file.
+
+2007-04-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/gettext-h (configure.ac): AC_SUBST LIBINTL and LTLIBINTL.
+ (Link): New section.
+
+ * modules/canonicalize-lgpl-tests (Makefile.am): Undo last change.
+
+2007-04-06 Bruno Haible <bruno@clisp.org>
+
+ Assume the 'long double' type.
+ * m4/longdouble.m4: Remove file.
+ * config/srclist.txt: Don't mention longdouble.m4.
+ * lib/allocsa.h: Assume HAVE_LONG_DOUBLE to be true.
+ * lib/float+.h: Likewise.
+ * lib/frexp.c: Likewise.
+ * lib/printf-args.h: Likewise.
+ * lib/printf-args.c: Likewise.
+ * lib/printf-frexp.c: Likewise.
+ * lib/printf-parse.c: Likewise.
+ * lib/vasnprintf.c: Likewise.
+ * m4/allocsa.m4: Remove gt_TYPE_LONGDOUBLE invocation.
+ * m4/intl.m4: Likewise.
+ * m4/isnanl.m4: Likewise.
+ * m4/printf.m4: Likewise.
+ * m4/printf-frexpl.m4: Likewise.
+ * m4/vasnprintf.m4: Likewise.
+ * modules/allocsa (Files): Remove m4/longdouble.m4.
+ * modules/gettext (Files): Likewise.
+ * modules/relocatable-prog-wrapper (Files): Likewise.
+ * modules/vasnprintf (Files): Likewise.
+ * modules/isnanl (Files): Likewise.
+ (Include): Simplify.
+ * modules/isnanl-nolibm (Files): Remove m4/longdouble.m4.
+ (Include): Simplify.
+ * modules/printf-frexpl (Files): Remove m4/longdouble.m4.
+ (Include): Simplify.
+ * modules/snprintf-posix-tests (Files): Remove m4/longdouble.m4.
+ (configure.ac): Remove gt_TYPE_LONGDOUBLE invocation.
+ * modules/sprintf-posix-tests (Files): Remove m4/longdouble.m4.
+ (configure.ac): Remove gt_TYPE_LONGDOUBLE invocation.
+ * modules/vasnprintf-posix-tests (Files): Remove m4/longdouble.m4.
+ (configure.ac): Remove gt_TYPE_LONGDOUBLE invocation.
+ * modules/vasprintf-posix-tests (Files): Remove m4/longdouble.m4.
+ (configure.ac): Remove gt_TYPE_LONGDOUBLE invocation.
+ * modules/vsnprintf-posix-tests (Files): Remove m4/longdouble.m4.
+ (configure.ac): Remove gt_TYPE_LONGDOUBLE invocation.
+ * modules/vsprintf-posix-tests (Files): Remove m4/longdouble.m4.
+ (configure.ac): Remove gt_TYPE_LONGDOUBLE invocation.
+ * tests/test-isnanl-nolibm.c: Assume HAVE_LONG_DOUBLE to be true.
+ * tests/test-isnanl.c: Likewise.
+ * tests/test-snprintf-posix.h: Likewise.
+ * tests/test-sprintf-posix.h: Likewise.
+ * tests/test-vasnprintf-posix.c: Likewise.
+ * tests/test-vasnprintf-posix2.c: Likewise.
+ * tests/test-vasprintf-posix.c: Likewise.
+
+2007-04-06 Bruno Haible <bruno@clisp.org>
+
+ Fix problem with Compaq (ex-DEC) Desktop C compiler on Tru64.
+ * lib/math_.h [__DECC]: Include the overridden include file through
+ #include_next, outside the double-inclusion guard.
+ * lib/stdio_.h [__DECC]: Likewise.
+ * lib/stdlib_.h [__DECC]: Likewise.
+ * lib/string_.h [__DECC]: Likewise.
+ * lib/time_.h [__DECC]: Likewise.
+ * lib/wchar_.h [__DECC]: Likewise.
+ * lib/wctype_.h [__DECC]: Likewise.
+ * lib/inttypes_.h [__DECC]: Likewise.
+ Reported by Albert Chin <china@thewrittenword.com> in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00088.html>.
+
+2007-04-04 Eric Blake <ebb9@byu.net>
+
+ * m4/stdint.m4 (gl_STDINT_H): Detect WINT_MAX bug in cygwin
+ 1.5.x.
+
+2007-04-04 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_A): Add a test for correct
+ rounding. Don't assume that FreeBSD 6 and NetBSD 4 pass this test.
+
+2007-04-04 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix.c (test_function): Allow two possible
+ results for "%010a" of Infinity and NaN.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+ * tests/test-snprintf-posix.h (test_function): Likewise.
+ * tests/test-sprintf-posix.h (test_function): Likewise.
+ * tests/test-fprintf-posix.h (test_function): Remove these tests.
+ * tests/test-printf-posix.h (test_function): Likewise.
+ * tests/test-fprintf-posix.out: Update.
+ Needed for FreeBSD 6.1.
+
+2007-04-04 Bruno Haible <bruno@clisp.org>
+
+ * DEPENDENCIES: Remove mentions of tar and gzip, since they are not
+ directly used by the gnulib modules nor by gnulib-tool.
+
+2007-04-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * DEPENDENCIES: Give overall description of version dependency
+ desirability. Use more-typical names for apps.
+ Add shell, coreutils, diffutils, grep, tar, gzip.
+
+2007-04-04 Simon Josefsson <simon@josefsson.org>
+
+ * MODULES.html.sh: Rename crypto modules. Remove iconvme.
+
+2007-04-04 Karl Berry <karl@gnu.org>
+
+ * MODULES.html.sh (func_module): missing '.
+
+2007-04-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/argmatch-tests (Makefile.am): New variable
+ test_argmatch_LDADD.
+ * modules/argp-tests (Makefile.am): New variable test_argp_LDADD.
+ * modules/array-list-tests (Makefile.am): New variable
+ test_array_list_LDADD.
+ * modules/array-oset-tests (Makefile.am): New variable
+ test_array_oset_LDADD.
+ * modules/avltree-list-tests (Makefile.am): New variable
+ test_avltree_list_LDADD.
+ * modules/avltree-oset-tests (Makefile.am): New variable
+ test_avltree_oset_LDADD.
+ * modules/avltreehash-list-tests (Makefile.am): New variable
+ test_avltreehash_list_LDADD.
+ * modules/canonicalize-lgpl-tests (Makefile.am): New variable
+ test_canonicalize_lgpl_LDADD.
+ * modules/carray-list-tests (Makefile.am): New variable
+ test_carray_list_LDADD.
+ * modules/dirname-tests (Makefile.am): New variable
+ test_dirname_LDADD.
+ * modules/linked-list-tests (Makefile.am): New variable
+ test_linked_list_LDADD.
+ * modules/linkedhash-list-tests (Makefile.am): New variable
+ test_linkedhash_list_LDADD.
+ * modules/rbtree-list-tests (Makefile.am): New variable
+ test_rbtree_list_LDADD.
+ * modules/rbtree-oset-tests (Makefile.am): New variable
+ test_rbtree_oset_LDADD.
+ * modules/rbtreehash-list-tests (Makefile.am): New variable
+ test_rbtreehash_list_LDADD.
+ * modules/xvasprintf-tests (Makefile.am): New variable
+ test_xvasprintf_LDADD.
+ Reported by Eric Blake.
+
+2007-04-03 Eric Blake <ebb9@byu.net>
+
+ * DEPENDENCIES: Weaken m4 requirements.
+
+2007-04-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/frexp-tests (configure.ac): Remove AC_SUBST.
+ * modules/isnanl-tests (configure.ac): Likewise.
+
+2007-04-03 Ben Pfaff <blp@gnu.org>
+
+ * modules/iconv_open: Add $(srcdir)/ to source directory
+ references in Makefile fragments that call gperf, to fix VPATH
+ builds.
+
+2007-04-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/ldexpl (Depends-on): Add isnanl, remove isnanl-nolibm.
+ * lib/ldexpl.c: Undo last change.
+
+2007-04-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/printf-frexpl (Depends-on): Undo last change.
+ (Files): Add m4/ldexpl.m4.
+
+2007-04-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/isnanl.m4 (gl_FUNC_ISNANL): Substitute ISNANL_LIBM.
+ * modules/isnanl (Link): New section.
+
+ * m4/frexp.m4 (gl_FUNC_FREXP): Substitute FREXP_LIBM.
+ * modules/frexp (Link): New section.
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL): Substitute FREXPL_LIBM.
+ * modules/frexpl (Link): New section.
+
+ * m4/ldexpl.m4 (gl_FUNC_LDEXPL): Substitute LDEXPL_LIBM.
+ * modules/ldexpl (Link): New section.
+
+2007-04-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/TEMPLATE-EXTENDED: New file.
+ * gnulib-tool (func_all_modules, func_verify_module): Exclude it.
+
+2007-04-03 Bruno Haible <bruno@clisp.org>
+
+ * DEPENDENCIES: New file.
+ Suggested by Simon Josefsson.
+
+2007-04-03 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi: Escape @.
+
+2007-04-03 James Youngman <jay@gnu.org>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stat-time.h (get_stat_birthtime): Check for zero-valued
+ birthtime on all systems that have birthtime, not just those which
+ use st_birthtimensec rather than st_birthtim. Putting zero in
+ st_birthtim.tv_sec is how (for example) FreeBSD/x86 6.1 indicates
+ that the birth time is not available for files on an NFS mount.
+
+2007-04-03 Simon Josefsson <simon@josefsson.org>
+
+ * modules/memxor: Move back from crypto/, suggested by Bruno.
+ * modules/crypto/hmac-sha1: Fix memxor dependency.
+
+ * modules/crypto/gc: Moved from ../.
+
+2007-04-02 Eric Blake <ebb9@byu.net>
+
+ * lib/ldexpl.c (includes): Avoid libm.
+
+ * modules/printf-frexpl (Depends-on): Depend on ldexpl.
+
+2007-04-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/sysexit_.h (EX_OK): Disable the EX_OK definition from <unistd.h>
+ on IRIX.
+
+2007-04-02 Bruno Haible <bruno@clisp.org>
+
+ * m4/intdiv0.m4 (gt_INTDIV0): Avoid performing the test for real on
+ x86 or x86_64 platforms running MacOS X.
+ Reported by Ryan Schmidt <@ryandesign.com>.
+
+2007-04-02 Bruno Haible <bruno@clisp.org>
+
+ * m4/intdiv0.m4 (gt_INTDIV0): When cross-compiling, treat x86_64 like
+ i386.
+
+2007-04-01 Simon Josefsson <simon@josefsson.org>
+
+ * modules/crypto/arcfour: Moved from ../.
+ * modules/crypto/arcfour-tests: Moved from ../.
+ * modules/crypto/arctwo: Moved from ../.
+ * modules/crypto/arctwo-tests: Moved from ../.
+ * modules/crypto/des: Moved from ../.
+ * modules/crypto/des-tests: Moved from ../.
+ * modules/crypto/gc-arcfour: Moved from ../.
+ * modules/crypto/gc-arcfour-tests: Moved from ../.
+ * modules/crypto/gc-arctwo: Moved from ../.
+ * modules/crypto/gc-arctwo-tests: Moved from ../.
+ * modules/crypto/gc-des: Moved from ../.
+ * modules/crypto/gc-des-tests: Moved from ../.
+ * modules/crypto/gc-hmac-md5: Moved from ../.
+ * modules/crypto/gc-hmac-md5-tests: Moved from ../.
+ * modules/crypto/gc-hmac-sha1: Moved from ../.
+ * modules/crypto/gc-hmac-sha1-tests: Moved from ../.
+ * modules/crypto/gc-md2: Moved from ../.
+ * modules/crypto/gc-md2-tests: Moved from ../.
+ * modules/crypto/gc-md4: Moved from ../.
+ * modules/crypto/gc-md4-tests: Moved from ../.
+ * modules/crypto/gc-md5: Moved from ../.
+ * modules/crypto/gc-md5-tests: Moved from ../.
+ * modules/crypto/gc-pbkdf2-sha1: Moved from ../.
+ * modules/crypto/gc-pbkdf2-sha1-tests: Moved from ../.
+ * modules/crypto/gc-random: Moved from ../.
+ * modules/crypto/gc-rijndael: Moved from ../.
+ * modules/crypto/gc-rijndael-tests: Moved from ../.
+ * modules/crypto/gc-sha1: Moved from ../.
+ * modules/crypto/gc-sha1-tests: Moved from ../.
+ * modules/crypto/gc-tests: Moved from ../.
+ * modules/crypto/hmac-md5: Moved from ../.
+ * modules/crypto/hmac-md5-tests: Moved from ../.
+ * modules/crypto/hmac-sha1: Moved from ../.
+ * modules/crypto/hmac-sha1-tests: Moved from ../.
+ * modules/crypto/md2: Moved from ../.
+ * modules/crypto/md2-tests: Moved from ../.
+ * modules/crypto/md4: Moved from ../.
+ * modules/crypto/md4-tests: Moved from ../.
+ * modules/crypto/md5: Moved from ../.
+ * modules/crypto/md5-tests: Moved from ../.
+ * modules/crypto/memxor: Moved from ../.
+ * modules/crypto/rijndael: Moved from ../.
+ * modules/crypto/rijndael-tests: Moved from ../.
+ * modules/crypto/sha1: Moved from ../.
+
+2007-03-30 James Youngman <jay@gnu.org>
+
+ * tests/test-stat-time.c (prepare_test): use chmod() rather than
+ rename() to change the ctime of a file (because ctime is unaffected
+ by rename on jfs2 on AIX 5.1).
+ (main): Start by doing cleanup, in case a previous run failed leaving
+ test files behind.
+
+2007-03-31 Bruno Haible <bruno@clisp.org>
+
+ Support old proprietary implementations of iconv.
+ * modules/iconv_open: New file.
+ * lib/iconv_.h: New file.
+ * m4/iconv_h.m4: New file.
+ * lib/iconv_open.c: New file.
+ * lib/iconv_open-aix.gperf: New file.
+ * lib/iconv_open-hpux.gperf: New file.
+ * lib/iconv_open-irix.gperf: New file.
+ * lib/iconv_open-osf.gperf: New file.
+ * m4/iconv_open.m4: New file.
+ * modules/linebreak (Depends-on): Add iconv_open.
+ * modules/striconv (Depends-on): Likewise.
+ * modules/striconveh (Depends-on): Likewise.
+ * modules/unicodeio (Depends-on): Likewise.
+ * lib/striconveh.h (mem_cd_iconveh, str_cd_iconveh): Allow cd to be
+ (iconv_t)(-1).
+ * lib/striconveh.c (mem_cd_iconveh_internal): Use an indirect
+ conversion if cd is (iconv_t)(-1).
+ (mem_iconveh, str_iconveh): Don't fail just because a direct conversion
+ is not possible.
+
+2007-03-31 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-striconveha.c (main): Don't expect "autodetect_jp" to
+ work on Solaris either. Protect also second use of "autodetect_jp".
+
+2007-03-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL): Set HAVE_DECL_FREXPL to 0 when
+ the function is not present.
+
+2007-03-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/ldexpl.m4 (gl_FUNC_LDEXPL): Set HAVE_DECL_LDEXPL to 0 when
+ the function is not present.
+
+2007-03-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/iconv.m4 (AM_ICONV_LINK): Fix 2007-03-29 patch. Test also against
+ a bug in HP-UX iconv_open().
+
+2007-03-31 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (func_module): Don't show gnulib-common.m4.
+ (Mathematics <math.h>): New section, add fpieee.
+ (Input/output <stdio.h>): Add fseterr.
+ (Mathematics <math.h>): New section, add printf-frexp.
+ (Container data structures): Add sublist.
+ (Core language properties): Add fpucw, inline.
+ (Functions for greatest-width integer types <inttypes.h>): Add
+ imaxabs, imaxdiv, inttypes.
+ (Mathematics <math.h>): Add frexp, frexpl, isnan-nolibm, isnanl,
+ isnanl-nolibm, ldexp.
+ (Mathematics <math.h>): New section, add printf-frexpl.
+ (Support for systems lacking POSIX:2001): Add fprintf-posix,
+ printf-posix, snprintf-posix, sprintf-posix, string, search, socklen,
+ sys_select, sys_socket, vasnprintf-posix, vasprintf-posix,
+ vfprintf-posix, vprintf-posix, vsnprintf-posix, vsprintf-posix.
+ (Unicode string functions): Add unistr/u*-mbtoucr.
+ (Java): Add javacomp-script, javaexec-script.
+ (C#): Add csharpcomp-script, csharpexec-script.
+ (Support for building libraries and executables): Add havelib,
+ relocatable-*.
+ (Support for maintaining and releasing projects): Renamed from
+ 'Support for maintaining and release projects'. Add announce-gen.
+
+2007-03-31 Bruno Haible <bruno@clisp.org>
+
+ * README: Talk primarily about git.
+ (git and CVS): Renamed from CVS.
+ * doc/gnulib.texi (Introduction, Build robot for gnulib): Mention that
+ gnulib is available through git.
+ * doc/gnulib-tool.texi (CVS Issues): Mention git and svn as well.
+
+2007-03-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/alloca_.h: Change prefix of double-inclusion guard macro to _GL_.
+ * lib/poll_.h: Likewise.
+ * lib/stat_.h: Likewise.
+ * lib/sys_time_.h: Likewise.
+ * lib/sysexit_.h: Likewise.
+ * lib/glob_.h: Prefix double-inclusion guard macro with _GL_.
+ * lib/stdbool_.h: Likewise.
+ * lib/byteswap_.h: Add double-inclusion guard.
+
+2007-03-30 Sergey Poznyakoff <gray@mirddin.farlep.net>
+
+ * lib/sysexit_.h: Prefix double-inclusion guard macro with _GNULIB.
+
+2007-03-30 Karl Berry <karl@gnu.org>
+
+ * config/srclist-update: double space after USA in the license
+ substitution, since that's how it's usually (?) written.
+
+2007-03-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/write-any-file.c (can_write_any_file): Fix else-else bug
+ reported by Bruno Haible.
+
+2007-03-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/iconv.m4 (AM_ICONV_LINK): Require AC_CANONICAL_HOST. Test against
+ a bug in AIX iconv().
+
+2007-03-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/ldexpl-tests: New file.
+ * tests/test-ldexpl.c: New file.
+
+2007-03-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/ldexpl.c: Include fpucw.h.
+ (ldexpl): Use BEGIN/END_LONG_DOUBLE_ROUNDING. Skip the last unneeded
+ multiplication.
+ * modules/ldexpl (Depends-on): Add fpucw.
+
+2007-03-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/ldexpl: New file.
+ * m4/ldexpl.m4: New file.
+ * lib/math_.h (ldexpl): Define to a replacement if REPLACE_LDEXPL is
+ set.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize also GNULIB_LDEXPL,
+ REPLACE_LDEXPL.
+ * modules/math (Makefile.am): Substitute also GNULIB_LDEXPL,
+ REPLACE_LDEXPL.
+ * m4/printf-frexpl.m4 (gl_FUNC_PRINTF_FREXPL): Invoke
+ gl_FUNC_LDEXPL_WORKS.
+ * m4/mathl.m4 (gl_FUNC_LONG_DOUBLE_MATH): Remove test for ldexpl.
+ * modules/mathl (Files): Remove lib/ldexpl.c.
+ (Depends-on): Add ldexpl.
+
+2007-03-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): Declare frexpl.
+
+2007-03-29 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-striconveh.c (main): Don't assume that a direct conversion
+ between ISO-8859-1 and ISO-8859-2 is possible. Needed for OSF/1, IRIX
+ and possibly also HP-UX.
+ * tests/test-striconveha.c (main): Don't expect "autodetect_jp" to
+ work on AIX, IRIX, HP-UX, OSF/1.
+ * tests/uniconv/test-u16-conv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u16-strconv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u32-conv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u32-strconv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u8-conv-from-enc.c (main): Likewise.
+ * tests/uniconv/test-u8-strconv-from-enc.c (main): Likewise.
+
+2007-03-29 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-stat-time.c: Include <fcntl.h>, not <sys/fcntl.h>.
+
+2007-03-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/acl-internal.h (acl_get_fd, acl_set_fd): undef before defining,
+ to work around a problem on OSF/1 5.1 reported by Bruno Haible.
+
+2007-03-29 Eric Blake <ebb9@byu.net>
+
+ * lib/acl-internal.h: Remove redundant include.
+ (ACL_NOT_WELL_SUPPORTED): Also filter on EBUSY, returned by
+ Cygwin when a file is locked.
+
+2007-03-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasprintf.c [IN_LIBASPRINTF]: Include different specification
+ file.
+ * lib/asprintf.c [IN_LIBASPRINTF]: Likewise.
+
+2007-03-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getcwd-path-max.m4 (gl_FUNC_GETCWD_PATH_MAX): Don't bother to
+ try to remove a parent directory if the child couldn't be removed
+ (except for the first rmdir, which could fail because the child
+ doesn't exist). Problem reported by Jeff Blaine in
+ <http://lists.gnu.org/archive/html/bug-tar/2007-03/msg00014.html>.
+
+2007-03-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveh.c (utf8conv_carefully): New function.
+ (mem_cd_iconveh_internal): Invoke it.
+
+2007-03-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveh.c (mem_cd_iconveh_internal): Use u8_mbtoucr instead
+ of u8_mbtouc in order to distinguish invalid and incomplete UTF-8
+ input.
+ * modules/striconveh (Depends-on): Add unistr/u8-mbtoucr. Replace
+ utf8-ucs4 with unistr/u8-mbtouc. Replace ucs4-utf8 with
+ unistr/u8-uctomb.
+
+2007-03-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistr/u8-mbtoucr: New file.
+ * lib/unistr/u8-mbtoucr.c: New file.
+ * modules/unistr/u16-mbtoucr: New file.
+ * lib/unistr/u16-mbtoucr.c: New file.
+ * modules/unistr/u16-mbtoucr: New file.
+ * lib/unistr/u16-mbtoucr.c: New file.
+ * lib/unistr.h (u8_mbtoucr, u16_mbtoucr, u32_mbtoucr): New declarations.
+
+2007-03-27 Simon Josefsson <simon@josefsson.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/vasprintf.m4: Convert AC_SUBST into shell variable for
+ REPLACE_VASPRINTF. Set HAVE_VASPRINTF. Add
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS]).
+
+ * m4/stdio_h.m4: Add stubs for vasprintf too.
+
+ * modules/stdio: Support vasprintf in sed command.
+
+ * modules/vasprintf: Depend on stdio for prototypes. Remove
+ vasprintf.h. Add stdio module indicator.
+
+ * lib/stdio_.h: Declare asprintf and vasprintf, based on
+ vasprintf.h.
+
+ * lib/vasprintf.h: File removed.
+
+ * lib/asprintf.c: Use stdio.h instead of vasprintf.h.
+ * lib/vasprintf.c: Ditto.
+ * lib/xvasprintf.c: Ditto.
+ * tests/test-vasprintf-posix.c: Ditto.
+ * tests/test-vasprintf.c: Ditto.
+
+2007-03-27 Bruno Haible <bruno@clisp.org>
+
+ Make vasnprintf multithread-safe.
+ * lib/vasnprintf.c (decimal_point_char): New function.
+ (VASNPRINTF): Use it.
+ Suggested by Simon Josefsson.
+
+2007-03-27 Eric Blake <ebb9@byu.net>
+
+ Support sub-second birthtime on cygwin.
+ * m4/stat-time.m4 (gl_STAT_BIRTHTIME): Also check for st_birthtim.
+ * lib/stat-time.h (STAT_TIMESPEC): Adjust comments.
+ (get_stat_birthtime): Also work with st_birthtim.
+
+2007-03-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stat-time.h (USE_BIRTHTIME): Remove.
+ (get_stat_atime_ns, get_stat_ctime_ns, get_stat_mtime_ns):
+ (get_stat_birthtime_ns): Do not try to use "spare" fields.
+ (get_stat_birthtime_ns): Simplify compile-time tests.
+ (get_stat_birthtime): Change the API to look like
+ get_stat_mtime etc., except return a negative tv_nsec on error.
+ * m4/stat-time.m4 (gl_STAT_TIME, gl_STAT_BIRTHTIME):
+ Don't check for "spare" fields.
+ (gl_STAT_BIRTHTIME): Don't check for struct stat.st_birthtimespec.tv_sec
+ or for struct stat.st_birthtime, as these tests aren't used.
+ * tests/test-stat-time.c (test_birthtime): Adjust to new API.
+
+2007-03-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/stat-time.h: Include <sys/stat.h>.
+
+2007-03-27 James Youngman <jay@gnu.org>
+
+ * lib/stat-time.h (get_stat_birthtime): New function for
+ retrieving st_birthtime as provided by UFS2 (hence *BSD).
+ * m4/stat-time.m4 (gl_STAT_BIRTHTIME): Probe for st_birthtime
+ and its variants.
+ * modules/stat-time (configure.ac): call gl_STAT_BIRTHTIME.
+ * modules/stat-time-test: New file.
+ * tests/test-stat-time.c: New test, devised by Bruno Haible.
+
+2007-03-26 Bruno Haible <bruno@clisp.org>
+
+ Better support of signalling NaNs.
+ * lib/atanl.c: Include isnanl.h.
+ (atanl): Perform test for NaN at the beginning of the function and
+ through a call to isnanl.
+ * lib/cosl.c: Include isnanl.h.
+ (cosl): Perform test for NaN at the beginning of the function and
+ through a call to isnanl.
+ * lib/ldexpl.c: Include isnanl.h.
+ (ldexpl): Perform test for NaN through a call to isnanl.
+ * lib/logl.c: Include isnanl.h.
+ (logl): Perform test for NaN at the beginning of the function and
+ through a call to isnanl.
+ * lib/sinl.c: Include isnanl.h.
+ (sinl): Perform test for NaN at the beginning of the function and
+ through a call to isnanl.
+ * lib/sqrtl.c: Include isnanl.h.
+ (sqrtl): Perform test for NaN at the beginning of the function and
+ through a call to isnanl.
+ * lib/tanl.c: Include isnanl.h.
+ (tanl): Perform test for NaN at the beginning of the function and
+ through a call to isnanl.
+ * lib/trigl.c (ieee754_rem_pio2l): Remove test for NaN.
+ * modules/mathl (Depends-on): Add isnanl.
+
+2007-03-26 Eric Blake <ebb9@byu.net>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_DIRECTIVE_A): Fix
+ regression in logic sense of previous patch.
+
+2007-03-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_DIRECTIVE_A): Don't use
+ unportable shell command "if ! ...".
+ Reported by Ralf Wildenhues.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/sysexit_,h: If HAVE_SYSEXITS_H is defined, include the original
+ <sysexits.h> file, and only add EX_CONFIG.
+ * m4/sysexits.m4 (gl_SYSEXITS): If <sysexits.h> exists, check its
+ absolute file name and whether it is sufficient. Substitute also
+ HAVE_SYSEXITS_H and ABSOLUTE_SYSEXITS_H.
+ * modules/sysexits (Makefile.am): Substitute HAVE_SYSEXITS_H and
+ ABSOLUTE_SYSEXITS_H into sysexits.h.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/getaddrinfo.c (getaddrinfo): Don't access hints->ai_flags when
+ hints is NULL.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/uniconv/u8-conv-from-enc.c (u8_conv_from_encoding): Add a cast.
+ * lib/uniconv/u8-strconv-to-enc.c (u8_strconv_to_encoding): Likewise.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c: Include langinfo.h.
+ (VASNPRINTF): Prefer nl_langinfo over localeconv, since it's more
+ multithread-safe.
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_DIRECTIVE_A): New macro.
+ * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke it.
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX: Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ Reported by Simon Josefsson.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/printf-parse.c [!IN_LIBINTL]: Include <stdint.h>, for intmax_t.
+ (PRINTF_PARSE): Make the support for size specifier 'j' unconditional.
+ * modules/vasnprintf (Depends-on): Add stdint.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/fpieee: New file.
+ * m4/fpieee.m4: New file.
+ * modules/isnan-nolibm (Depends-on): Add fpieee.
+ * modules/isnanl-nolibm (Depends-on): Add fpieee.
+ * modules/isnanl (Depends-on): Add fpieee.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): Test also finite numbers.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ Avoid test failures on IRIX 6.5.
+ * tests/test-frexpl.c (MIN_NORMAL_EXP): New macro.
+ (main): Use it.
+ * tests/test-printf-frexpl.c (MIN_NORMAL_EXP, MIN_SUBNORMAL_EXP): New
+ macros.
+ (main): Use them.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): New macro.
+ (gl_FUNC_FREXPL): Invoke it. Set REPLACE_FREXPL to 1 if it frexpl
+ exists but doesn't work.
+ * lib/math_.h (frexpl): Define as a replacement macro if REPLACE_FREXPL
+ is set. Don't provide a prototype if REPLACE_FREXPL is not set.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_FREXPL.
+ * modules/math (Makefile.am) Substibute also REPLACE_FREXPL into math.h.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/frexp.m4 (gl_FUNC_FREXP_WORKS): Add check whether frexp(inf)
+ returns inf. Needed on IRIX 6.5.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-frexpl.c: Include isnanl-nolibm.h.
+ (main): Use isnanl instead of x != x idiom.
+ * modules/frexpl-tests (Depends-on): Add isnanl-nolibm.
+
+ * tests/test-frexp.c: Include isnan.h.
+ (main): Use isnan instead of x != x idiom.
+ * modules/frexp-tests (Depends-on): Add isnan-nolibm.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-frexp.c (NaN): New function/macro.
+ (main): Use it instead of 0.0 / 0.0.
+ * tests/test-isnan.c (NaN): New function/macro.
+ (main): Use it instead of 0.0 / 0.0.
+ * tests/test-vasnprintf-posix.c (NaN): New function/macro.
+ (test_function): Use it instead of 0.0 / 0.0.
+ * tests/test-vasprintf-posix.c (NaN): New function/macro.
+ (test_function): Use it instead of 0.0 / 0.0.
+ * tests/test-snprintf-posix.h (NaN): New function/macro.
+ (test_function): Use it instead of 0.0 / 0.0.
+ * tests/test-sprintf-posix.h (NaN): New function/macro.
+ (test_function): Use it instead of 0.0 / 0.0.
+ * tests/test-fprintf-posix.h (NaN): New function/macro.
+ (test_function): Use it instead of 0.0 / 0.0.
+ * tests/test-printf-posix.h (NaN): New function/macro.
+ (test_function): Use it instead of 0.0 / 0.0.
+
+ * lib/isnan.c (FUNC): Work around a DEC C compiler bug.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/glob_.h: Include <sys/stat.h>. Avoids warnings on AIX 5.1.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/regexec.c (merge_state_with_log): Make static.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/trigl.c (kernel_rem_pio2): Make static.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/sincosl.c (sincosl_table): Make static.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/argp.h (__restrict): Define to empty, rather than to 'restrict',
+ if the compiler does not support C99.
+
+2007-03-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/time (Makefile.am): Ensure all rule action lines start with a
+ tab.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/tsearch-tests: New file.
+ * tests/test-tsearch.sh: New file.
+ * tests/test-tsearch.c: New file, mostly copied from glibc.
+
+ * modules/search-tests: New file.
+ * tests/test-search.c: New file.
+
+ * modules/search: New file.
+ * lib/search_.h: New file, incorporating lib/tsearch.h.
+ * m4/search_h.m4: New file.
+ * lib/tsearch.h: Remove file.
+ * lib/tsearch.c: Include search.h instead of tsearch.h.
+ * m4/tsearch.m4 (gl_FUNC_TSEARCH): Require gl_SEARCH_H_DEFAULTS. Set
+ HAVE_TSEARCH.
+ * modules/tsearch (Files): Remove lib/tsearch.h.
+ (Depends-on): Add search.
+ (configure.ac): Invoke gl_SEARCH_MODULE_INDICATOR.
+ (Include): Change tsearch.h into search.h.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/fpucw: New file.
+ * lib/fpucw.h: New file.
+ * lib/frexp.c: Include fpucw.h.
+ (DECL_ROUNDING, BEGIN_ROUNDING, END_ROUNDING): New macros.
+ (FUNC): Use them.
+ * lib/printf-frexp.c: Include fpucw.h.
+ (DECL_ROUNDING, BEGIN_ROUNDING, END_ROUNDING): New macros.
+ (FUNC): Use them.
+ * lib/vasnprintf.c: Include fpucw.h.
+ (VASNPRINTF): Invoke BEGIN/END_LONG_DOUBLE_ROUNDING around the
+ 'long double' calculations.
+ * tests/test-frexpl.c: Include fpucw.h.
+ (main): Invoke BEGIN_LONG_DOUBLE_ROUNDING.
+ * tests/test-printf-frexpl.c: Include fpucw.h.
+ (main): Invoke BEGIN_LONG_DOUBLE_ROUNDING.
+ * modules/frexpl (Depends-on): Add fpucw.
+ * modules/printf-frexpl (Depends-on): Likewise.
+ * modules/fprintf-posix (Depends-on): Likewise.
+ * modules/snprintf-posix (Depends-on): Likewise.
+ * modules/sprintf-posix (Depends-on): Likewise.
+ * modules/vasnprintf-posix (Depends-on): Likewise.
+ * modules/vasprintf-posix (Depends-on): Likewise.
+ * modules/vfprintf-posix (Depends-on): Likewise.
+ * modules/vsnprintf-posix (Depends-on): Likewise.
+ * modules/vsprintf-posix (Depends-on): Likewise.
+ * modules/frexpl-tests (Depends-on): Likewise.
+ * modules/printf-frexpl-tests (Depends-on): Likewise.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/float+.h: New file.
+ * lib/isnan.c: Include float+.h.
+ (SIZE): New macro.
+ (FUNC): Compare only SIZE bytes of the value.
+ * lib/vasnprintf.c: Include float+.h.
+ (VASNPRINTF): When comparing agains +0.0L or +0.0, compare only
+ SIZEOF_LDBL or SIZEOF_DBL bytes.
+ * modules/isnan-nolibm (Files): Add lib/float+.h.
+ * modules/isnanl-nolibm (Files): Add lib/float+.h.
+ * modules/isnanl (Files): Add lib/float+.h.
+ * modules/vasnprintf (Files): Add lib/float+.h.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c [!HAVE_LONG_DOUBLE]: Include printf-frexp.h. Don't
+ include isnanl-nolibm.h.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-read-file.c (main): Don't produce spurious output for
+ expected situations. Make the test fail if it encountered unexpected
+ results.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-fr.m4 (gt_LOCALE_FR): Remove the special-casing of NetBSD,
+ since its fr_FR.ISO8859-1 locale wouldn't pass the tests.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-fr.m4 (gt_LOCALE_FR, gt_LOCALE_FR_UTF8): Fix last change.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistr/base (Depends-on): Remove utf8-ucs4-unsafe,
+ utf16-ucs4-unsafe, utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
+
+ * modules/unistr/u8-mbtouc: Add source files from module utf8-ucs4.
+ * modules/utf8-ucs4: Turn into a symbolic link to module
+ unistr/u8-mbtouc.
+
+ * modules/unistr/u8-mbtouc-unsafe: Add source files from module
+ utf8-ucs4-unsafe.
+ * modules/utf8-ucs4-unsafe: Turn into a symbolic link to module
+ unistr/u8-mbtouc-unsafe.
+
+ * modules/unistr/u16-mbtouc: Add source files from module utf16-ucs4.
+ * modules/utf16-ucs4: Turn into a symbolic link to module
+ unistr/u16-mbtouc.
+
+ * modules/unistr/u16-mbtouc-unsafe: Add source files from module
+ utf16-ucs4-unsafe.
+ * modules/utf16-ucs4-unsafe: Turn into a symbolic link to module
+ unistr/u16-mbtouc-unsafe.
+
+ * modules/unistr/u8-uctomb: Add source files from module utf4-utf8.
+ * modules/ucs4-utf8: Turn into a symbolic link to module
+ unistr/u8-ubtomb.
+
+ * modules/unistr/u16-uctomb: Add source files from module utf4-utf16.
+ * modules/ucs4-utf16: Turn into a symbolic link to module
+ unistr/u16-ubtomb.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistr/u8-mbtouc-aux.c: Renamed from lib/unistr/utf8-ucs4.c.
+ Enable the function only if HAVE_INLINE.
+ * lib/unistr/u8-mbtouc-unsafe-aux.c: Renamed from
+ lib/unistr/utf8-ucs4-unsafe.c. Enable the function only if HAVE_INLINE.
+ * lib/unistr/u16-mbtouc-aux.c: Renamed from lib/unistr/utf16-ucs4.c.
+ Enable the function only if HAVE_INLINE.
+ * lib/unistr/u16-mbtouc-unsafe-aux.c: Renamed from
+ lib/unistr/utf16-ucs4-unsafe.c. Enable the function only if HAVE_INLINE.
+ * lib/unistr/u8-uctomb-aux.c: Renamed from lib/unistr/ucs4-utf8.c.
+ Enable the function only if HAVE_INLINE.
+ * lib/unistr/u16-uctomb-aux.c: Renamed from lib/unistr/ucs4-utf16.c.
+ Enable the function only if HAVE_INLINE.
+ * modules/utf8-ucs4: Update.
+ * modules/utf8-ucs4-unsafe: Update.
+ * modules/utf16-ucs4: Update.
+ * modules/utf16-ucs4-unsafe: Update.
+ * modules/ucs4-utf8: Update.
+ * modules/ucs4-utf16: Update.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/utf8-ucs4.h: Remove file.
+ * lib/utf8-ucs4-unsafe.h: Remove file.
+ * lib/utf16-ucs4.h: Remove file.
+ * lib/utf16-ucs4-unsafe.h: Remove file.
+ * lib/ucs4-utf8.h: Remove file.
+ * lib/ucs4-utf16.h: Remove file.
+ * lib/unistr.h: Include their previous contents.
+ * m4/utf-ucs4.m4: Remove file.
+ * m4/ucs4-utf.m4: Remove file.
+ * modules/utf8-ucs4 (Files): Remove lib/utf8-ucs4.h.
+ (Depends-on): Add unistr/base.
+ (configure.ac): Remove gl_UTF_UCS4.
+ (Makefile.am): Update.
+ (Include): Change to unistr.h.
+ * modules/utf8-ucs4-unsafe (Files): Remove lib/utf8-ucs4-unsafe.h.
+ (Depends-on): Add unistr/base.
+ (configure.ac): Remove gl_UTF_UCS4.
+ (Makefile.am): Update.
+ (Include): Change to unistr.h.
+ * modules/utf16-ucs4 (Files): Remove lib/utf16-ucs4.h.
+ (Depends-on): Add unistr/base.
+ (configure.ac): Remove gl_UTF_UCS4.
+ (Makefile.am): Update.
+ (Include): Change to unistr.h.
+ * modules/utf16-ucs4-unsafe (Files): Remove lib/utf16-ucs4-unsafe.h.
+ (Depends-on): Add unistr/base.
+ (configure.ac): Remove gl_UTF_UCS4.
+ (Makefile.am): Update.
+ (Include): Change to unistr.h.
+ * modules/ucs4-utf8 (Files): Remove lib/ucs4-utf8.h.
+ (Depends-on): Add unistr/base.
+ (configure.ac): Remove gl_UCS4_UTF.
+ (Makefile.am): Update.
+ (Include): Change to unistr.h.
+ * modules/ucs4-utf16 (Files): Remove lib/ucs4-utf16.h.
+ (Depends-on): Add unistr/base.
+ (configure.ac): Remove gl_UCS4_UTF.
+ (Makefile.am): Update.
+ (Include): Change to unistr.h.
+ * lib/unistr/utf8-ucs4.c: Include unistr.h instead of utf8-ucs4.h.
+ * lib/unistr/utf8-ucs4-unsafe.c: Include unistr.h instead of
+ utf8-ucs4-unsafe.h.
+ * lib/unistr/utf16-ucs4.c: Include unistr.h instead of utf16-ucs4.h.
+ * lib/unistr/utf16-ucs4-unsafe.c: Include unistr.h instead of
+ utf16-ucs4-unsafe.h.
+ * lib/unistr/ucs4-utf8.c: Include unistr.h instead of ucs4-utf8.h.
+ * lib/unistr/ucs4-utf16.c: Include unistr.h instead of ucs4-utf16.h.
+ * lib/unistr/u8-chr.c: Don't include ucs4-utf8.h.
+ * lib/unistr/u8-strchr.c: Likewise.
+ * lib/unistr/u8-strrchr.c: Likewise.
+ * lib/unistr/u16-chr.c: Don't include ucs4-utf16.h.
+ * lib/unistr/u16-strchr.c: Likewise.
+ * lib/unistr/u16-strrchr.c: Likewise.
+ * lib/striconveh.c: Update.
+ * lib/linebreak.c: Update.
+
+2007-03-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/argp-help.c (fill_in_uparams, canon_doc_option): Cast the
+ arguments of isspace, isalpha, isalnum, isdigit to 'unsigned char'.
+
+2007-03-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/strptime.c (__strptime_internal): Use ANSI C syntax.
+
+2007-03-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (File system functions): New module write-any-file.
+ * modules/write-any-file, lib/write-any-file.c, lib/write-any-file.h:
+ * m4/write-any-file.m4: New files.
+
+2007-03-23 Eric Blake <ebb9@byu.net>
+
+ * gnulib-tool: Rearrange space-tab sequences, since some editors
+ like to eat them.
+
+2007-03-23 Eric Blake <ebb9@byu.net>
+
+ * lib/version-etc.c (version_etc_va): Update license wording to
+ be more concise. Recommended by Richard Stallman.
+
+2007-03-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/poll.c (MSG_PEEK): New fallback definition.
+
+2007-03-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/sys_socket-tests (configure.ac): Check for shutdown function.
+ * tests/test-sys_socket.c (a): Test only if shutdown() exists.
+ (main): Update.
+ Fixes a compilation error on BeOS.
+
+2007-03-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/frexpl-tests: New file.
+ * tests/test-frexpl.c: New file.
+
+ * modules/frexpl: New file.
+ * m4/frexpl.m4: New file.
+ * modules/math (Makefile.am): Also substitute GNULIB_FREXPL into math.h.
+ * lib/math_.h (frexpl): Test GNULIB_FREXPL instead of GNULIB_MATHL.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_FREXPL.
+ * modules/mathl (Files): Remove lib/frexpl.c, lib/frexp.c.
+ (Depends-on): Add frexpl. Remove isnanl-nolibm.
+ * m4/mathl.m4 (gl_FUNC_LONG_DOUBLE_MATH): Don't test for frexpl.
+
+2007-03-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/frexpl.c: Share code with lib/frexp.c.
+ * modules/mathl (Files): Add lib/frexp.c.
+ (Depends-on): Add isnanl-nolibm.
+
+2007-03-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/printf-frexp (Files): Add m4/frexp.m4.
+ * m4/printf-frexp.m4 (gl_FUNC_PRINTF_FREXP): Define HAVE_FREXP_IN_LIBC
+ only if the found frexp function actually works.
+
+2007-03-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/frexp.c: Remove older implementation that uses divisions.
+
+2007-03-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/frexp-tests: New file.
+ * tests/test-frexp.c: New file.
+
+ * modules/frexp: New file.
+ * lib/frexp.c: New file.
+ * m4/frexp.m4: New file.
+ * lib/math_.h (frexp): New declaration.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Also initialize GNULIB_FREXP and
+ REPLACE_FREXP.
+ * modules/math (math.h): Also substitute GNULIB_FREXP, REPLACE_FREXP.
+
+2007-03-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/isnanl-tests: New file.
+ * tests/test-isnanl.c: New file.
+
+ * modules/isnanl: New file.
+ * lib/isnanl.h: New file.
+ * m4/isnanl.m4 (gl_FUNC_ISNANL): New macro.
+ (gl_FUNC_ISNANL_NO_LIBM): Invoke gl_HAVE_ISNANL_NO_LIBM,
+ gl_FUNC_ISNANL_WORKS.
+ (gl_HAVE_ISNANL_NO_LIBM, gl_HAVE_ISNANL_IN_LIBM, gl_FUNC_ISNANL_WORKS):
+ New macros.
+
+2007-03-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/isnanl-nolibm (Files): Add lib/isnanl-nolibm.h, remove
+ lib/isnanl.h.
+ (Include): Update.
+ * lib/isnanl-nolibm.h: Renamed from lib/isnanl.h.
+ * lib/vasnprintf.c: Update.
+ * modules/isnanl-nolibm-tests (Files): Add tests/test-isnanl-nolibm.c,
+ tests/test-isnanl.h, remove tests/test-isnanl.c.
+ (Makefile.am): Update.
+ * tests/test-isnanl-nolibm.c: New file.
+ * tests/test-isnanl.h: New file.
+ * tests/test-isnanl.c: Remove file.
+
+2007-03-21 Jim Meyering <jim@meyering.net>
+
+ When trying to open ".", treat ESTALE like EACCES.
+ * lib/savewd.c (savewd_save): Resort to forking not just upon
+ failure with EACCES, but also when errno is ESTALE.
+
+2007-03-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h (strndup): Enable declaration also if HAVE_STRNDUP.
+ Needed on AIX 5.1. Reported by Matthew Woehlke.
+
+2007-03-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ Suggestions by Bruno Haible:
+ * lib/acl-internal.h: Include "gettext.h" rather than rolling
+ our own.
+ (ACL_NOT_WELL_SUPPORTED): Parenthesize arg when used.
+ * modules/acl (Depends-on): Add gettext.
+
+2007-03-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/iconvme: Remove file.
+ * lib/iconvme.h: Remove file.
+ * lib/iconvme.c: Remove file.
+ * m4/iconvme.m4: Remove file.
+
+2007-03-19 Bruno Haible <bruno@clisp.org>
+
+ * doc/relocatable-maint.texi: Break long shell script line.
+ Suggested by Thien-Thi Nguyen <ttn@gnuvola.org>.
+
+2007-03-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ Add limited support for Solaris 10 ZFS-style ACLs: just enough to
+ handle file_has_acl.
+ * lib/acl-internal.h, lib/acl_entries.c, lib/file-has-acl.c: New files.
+ * lib/acl.c: Move header inclusions and related macro defns into
+ lib/acl-internal.h.
+ (S_ISLNK): Remove defn, since that's now done for us.
+ (file_has_acl): Move to lib/file-has-acl.c.
+ Call acl_trivial if available. This is the crucial part of the fix.
+ (acl_entries): Move to lib/acl_entries.c. Now extern, since it's
+ shared within the library. Rewrite a bit, partly to make it compatible
+ with the GNU coding style.
+ * m4/acl.m4 (AC_FUNC_ACL): Add AC_LIBOBJ([file-has-acl]).
+ Remove unnecessary double-quotes.
+ Don't test for acl_to_text; the build will catch that.
+ Replace acl_entries if it doesn't exist and it is needed.
+ Check for -lsec and acl_trivial (as used on Solaris 10).
+ * modules/acl (Files): Add lib/acl-internal.h, lib/acl_entries.c,
+ lib/file-has-acl.c.
+ (Depends-on): Add sys_stat, for S_ISLNK.
+
+2007-03-19 Ben Pfaff <blp@gnu.org>
+
+ * doc/gnulib.texi: Fix typos.
+ Suggested by Thien-Thi Nguyen <ttn@gnuvola.org>.
+
+2007-03-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getcwd.c (__getcwd): Remove redundant comparison of buf to NULL.
+ If size is zero here, buf must be zero.
+
+2007-03-19 Simon Josefsson <simon@josefsson.org>
+
+ * des.c: Remove weak_keys_chksum. Reported by Bruno Haible
+ <bruno@clisp.org>.
+
+2007-03-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Undo first part of last patch.
+ Suggested by Eric Blake.
+
+2007-03-18 Ben Pfaff <blp@gnu.org>
+
+ * doc/relocatable.texi: Recommend using as prefix a directory
+ that does not exist and will never be created. Based on
+ discussion with Bruno Haible, Ralf Wildenhues, Matthew Woehlke,
+ and others.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/fchownat.c: Include lchown.h.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ Fix endless loop when the given allocated size was > INT_MAX.
+ * lib/vasnprintf.c (EOVERFLOW): New fallback definition.
+ (VASNPRINTF): Fail with EOVERFLOW when the given allocated size is
+ larger than INT_MAX, or when it grow to a value larger than INT_MAX.
+ * lib/vsprintf.c (vsprintf): Don't pass a size > INT_MAX to vasnprintf.
+ * lib/sprintf.c (sprintf): Likewise.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-argp-2.sh (func_compare): Output a context diff.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-fr.m4 (gt_LOCALE_FR, gt_LOCALE_FR_UTF8): Check also the
+ locale's decimal-point character.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Clear out the memory used for arg_mem
+ before comparing it. Needed because on some platforms (e.g. x86) a
+ 'long double' occupies less bytes than sizeof (long double).
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-crc.c (main): Make printf statements 64-bit clean.
+ * tests/test-gc-pbkdf2-sha1.c (main): Likewise.
+ * tests/test-getaddrinfo.c (simple): Likewise.
+ * tests/test-read-file.c (main): Likewise.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-dirname.c (main): Make printf statements 64-bit clean.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-xvasprintf.c (test_xvasprintf, test_xasprintf): Remove
+ unused variable.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-c-strcasecmp.c: Include c-strcase.h.
+ * tests/test-c-strncasecmp.c: Likewise.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdlib (Depends-on): Add unistd.
+ * lib/stdlib_.h: Include <unistd.h> if mkstemp is desired.
+ Needed for MacOS X 10.3.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistr/u-strdup.h: Include <stdlib.h>.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistr/u-cpy-alloc.h: Include <stdlib.h>.
+
+2007-03-17 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Update .cvsignore and .gitignore files
+ to reflect files copied from gnulib (with or without modifications).
+ Suggested by Jim Meyering.
+
+2007-03-17 Eric Blake <ebb9@byu.net>
+
+ * NEWS: Document stdlib change from 2007-02-18.
+
+2007-03-17 Jim Meyering <jim@meyering.net>
+
+ Detect use of AC_CONFIG_AUX_DIR also when its argument is quoted.
+ * build-aux/bootstrap: Put ""s around use of $build_aux, in case
+ someone uses a name containing shell meta-characters.
+ Reported by Alfred M. Szmidt.
+
+ * build-aux/bootstrap: Don't use \> in grep regexp. For HP-UX.
+
+2007-03-16 Alfred M. Szmidt <ams@gnu.org>
+
+ * build-aux/bootstrap (with_gettext): New variable. Run autopoint
+ and copy gettext configuration files only if configure.ac contains
+ a use of AM_GNU_GETTEXT_VERSION.
+
+2007-03-16 Alfred M. Szmidt <ams@gnu.org>
+
+ * build-aux/bootstrap (gnulib_name): New variable.
+ (gnulib_tool_options): Use it.
+
+2007-03-13 Simon Josefsson <simon@josefsson.org>
+
+ * tests/test-des.c: Use new namespace.
+
+2007-03-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/dummy.c (gl_dummy_symbol): Renamed from 'dummy'.
+ Reported by James Youngman <jay@gnu.org>.
+
+2007-03-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/glob.c (glob): Add 'restrict' so that prototype matches the
+ declared prototype. Needed with cc on OSF/1 5.1.
+
+2007-03-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_list.h (gl_listelement_dispose_fn): New type.
+ (gl_list_create_empty, gl_list_create): Add dispose_fn argument.
+ (struct gl_list_implementation): Add dispose_fn argument to the
+ 'create_empty', 'create' methods.
+ (struct gl_list_impl_base): Add field 'dispose_fn'.
+ * lib/gl_list.c (gl_list_create_empty, gl_list_create): Add dispose_fn
+ argument.
+ * lib/gl_array_list.c (gl_array_create_empty, gl_array_create): Add
+ dispose_fn argument.
+ (gl_array_remove_node, gl_array_remove_at, gl_array_list_free): Call
+ dispose_fn on the dropped values.
+ * lib/gl_carray_list.c (gl_carray_create_empty, gl_carray_create): Add
+ dispose_fn argument.
+ (gl_carray_remove_at, gl_carray_list_free): Call dispose_fn on the
+ dropped values.
+ * lib/gl_anyavltree_list2.h (gl_tree_create): Add dispose_fn argument.
+ (gl_tree_remove_node): Call dispose_fn on the dropped value.
+ * lib/gl_anyrbtree_list2.h (gl_tree_create): Add dispose_fn argument.
+ (gl_tree_remove_node): Call dispose_fn on the dropped value.
+ * lib/gl_anytree_list2.h (gl_tree_create_empty): Add dispose_fn
+ argument.
+ (gl_tree_list_free): Call dispose_fn on the dropped values.
+ * lib/gl_anytreehash_list2.h (gl_tree_list_free): Call dispose_fn on
+ the dropped values.
+ * lib/gl_anylinked_list2.h (gl_linked_create_empty, gl_linked_create):
+ Add dispose_fn argument.
+ (gl_linked_remove_node, gl_linked_remove_at, gl_linked_list_free):
+ Call dispose_fn on the dropped values.
+ * lib/gl_sublist.c (gl_sublist_create_empty, gl_sublist_create_fill):
+ Add dispose_fn argument.
+ (gl_sublist_create): Initialize the 'dispose_fn' field.
+ * lib/clean-temp.c (create_temp_dir, register_fd): Update.
+ * tests/test-array_list.c (main): Update.
+ * tests/test-carray_list.c (main): Update.
+ * tests/test-avltree_list.c (main): Update.
+ * tests/test-rbtree_list.c (main): Update.
+ * tests/test-avltreehash_list.c (main): Update.
+ * tests/test-rbtreehash_list.c (main): Update.
+ * tests/test-linked_list.c (main): Update.
+ * tests/test-linkedhash_list.c (main): Update.
+ * tests/test-array_oset.c (main): Update.
+
+2007-03-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_oset.h (gl_setelement_dispose_fn): New type.
+ (gl_oset_create_empty): Add dispose_fn argument.
+ (struct gl_oset_implementation): Add dispose_fn argument to
+ 'create_empty' method.
+ (struct gl_oset_impl_base): Add dispose_fn field.
+ * lib/gl_oset.c (gl_oset_create_empty): Add dispose_fn argument.
+ * lib/gl_array_oset.c (gl_array_create_empty): Add dispose_fn argument.
+ (gl_array_remove_at, gl_array_free): Call dispose_fn on the dropped
+ values.
+ * lib/gl_anytree_oset.h (gl_tree_create_empty): Add dispose_fn argument.
+ (gl_tree_oset_free): Call dispose_fn on the dropped values.
+ * lib/gl_avltree_oset.c (gl_tree_remove_node): Call dispose_fn on the
+ dropped value.
+ * lib/gl_rbtree_oset.c (gl_tree_remove_node): Call dispose_fn on the
+ dropped value.
+ * tests/test-array_oset.c (main): Update.
+ * tests/test-avltree_oset.c (main): Update.
+ * tests/test-rbtree_oset.c (main): Update.
+ * lib/gl_anytreehash_list1.h (add_to_bucket): Update.
+
+2007-03-13 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-stdbool.c (i): Update after last patch.
+
+2007-03-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/quotearg.c: Include <wctype.h> early, before the definition of
+ the iswprint macro. Needed on Solaris 2.5.1.
+
+2007-03-12 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-printf-frexp.c (main): Declare x as volatile.
+
+2007-03-12 Simon Josefsson <simon@josefsson.org>
+
+ * doc/gnulib.texi (Build robot for gnulib): New section.
+
+2007-03-12 Jim Meyering <jim@meyering.net>
+
+ * build-aux/bootstrap: New file.
+ * build-aux/bootstrap.conf: New file, from coreutils.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/cycle-check.m4 (gl_CYCLE_CHECK): Require AC_C_INLINE.
+
+2007-03-12 Simon Josefsson <simon@josefsson.org>
+
+ * lib/des.h, lib/des.c, lib/gc-gnulib.c: Use gl_ namespace, to
+ avoid collisions with 'des_setkey'. Reported by Bruno Haible
+ <bruno@clisp.org>. Also change 'tripledes_' to '3des_'.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-tr.m4 (gt_LOCALE_TR_UTF8): If the test program fails to
+ compile, set LOCALE_TR_UTF8 to 'none' instead of empty.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (INT64_MIN, INTMAX_MIN): Avoid using the ~INT..._MAX
+ formula. Needed for SunPRO C 5.0.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/long-options (Depends-on): Add getopt.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/modechange (Depends-on): Add stdbool.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/i-ring (Depends-on): Add stdbool.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/gc-des (Depends-on): Add stdbool.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/mktime.m4 (gl_PREREQ_MKTIME): Require AC_C_INLINE.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/mempcpy.m4 (gl_FUNC_MEMPCPY): Require AC_C_RESTRICT.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/unistr/u32-mbtouc-unsafe.c (u32_mbtouc_unsafe): Fix syntax error.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (sprintf): Undefine.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/isnan.c (rpl_isnan, rpl_isnanl): Work around bug regarding
+ initializers in SunPRO C and Compaq C compilers.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_array_oset.c (gl_array_iterator_next): Make pointer
+ decrementing code ANSI C compliant.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/dummy.c [__sun]: Define a dummy variable, not just a typedef.
+ Needed for Solaris 2.5.1 ranlib and SunPRO C 5.0.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-stdbool.c (s, d, e, xlcbug): Disable checks that gnulib's
+ <stdbool.h> substitute doesn't pass.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (snprintf): Undefine. Avoids an endless recursion.
+
+2007-03-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_megatestdir): Create also an autobuild
+ script, for submission to autobuild.josefsson.org.
+
+2007-03-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/canonicalize-lgpl-tests: New file.
+ * tests/test-canonicalize-lgpl.sh: New file.
+ * tests/test-canonicalize-lgpl.c: New file.
+
+ * modules/c-strcase-tests: New file.
+ * tests/test-c-strcase.sh: New file.
+ * tests/test-c-strcasecmp.c: New file.
+ * tests/test-c-strncasecmp.c: New file.
+
+ * modules/atexit-tests: New file.
+ * tests/test-atexit.sh: New file.
+ * tests/test-atexit.c: New file.
+
+2007-03-10 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-binary-io.sh: Use temporary filenames that are not so
+ likely to clash with those of other tests (in a parallel make).
+ * tests/test-binary-io.c: Likewise.
+
+2007-03-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/fseterr.c (fseterr): Port to Solaris/SPARC64. Deactivate the
+ fallback; use #error instead.
+ Suggested by Simon Josefsson.
+
+2007-03-10 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Treat MOSTLYCLEANFILES like
+ CLEANFILES. Put spaces in each line of $cleaned_files, not only the
+ first and the last.
+
+2007-03-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (uint_least64_t): Fix typo in last patch.
+
+2007-03-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/snprintf-posix-tests (EXTRA_DIST): New variable. Needed for
+ "make distcheck".
+ * modules/sprintf-posix-tests (EXTRA_DIST): Likewise.
+ * modules/vsnprintf-posix-tests (EXTRA_DIST): Likewise.
+ * modules/vsprintf-posix-tests (EXTRA_DIST): Likewise.
+
+2007-03-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/allocsa-tests (test_allocsa_SOURCES): Remove redundant
+ variable.
+ * modules/dirname-tests (test_dirname_SOURCES): Remove redundant
+ variable.
+
+2007-03-09 Eric Blake <ebb9@byu.net>
+ and Matthew Woehlke <mw_triad@users.sourceforge.net> (tiny change)
+
+ * lib/stdint_.h (int64_t, uint64_t): Don't undefine if 64-bit
+ types are not being provided by gnulib.
+ (GL_INT64_T, GL_UINT64_T): New witnesses of whether gnulib 64-bit
+ types are supported.
+
+2007-03-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h (__attribute__): New macro.
+ (fprintf, vfprintf, printf, vprintf, snprintf, vsnprintf, sprintf,
+ vsprintf): Specify __attribute__ __format__ for GCC.
+ Suggested by Eric Blake.
+
+2007-03-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/printf-posix-tests: New file.
+ * tests/test-printf-posix.sh: New file.
+ * tests/test-printf-posix.c: New file.
+
+ * modules/printf-posix: New file.
+ * lib/printf.c: New file.
+ * m4/printf-posix-rpl.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_PRINTF_POSIX,
+ REPLACE_PRINTF.
+ * lib/stdio_.h (printf): New declaration.
+ (format, __format__, ____printf____, ____scanf____, ____strftime____,
+ ____strfmon____): New macros.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_PRINTF_POSIX,
+ REPLACE_PRINTF.
+
+2007-03-09 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-vasnprintf-posix2.sh: New file.
+ * tests/test-vasnprintf-posix2.c: New file.
+ * modules/vasnprintf-posix-tests (Files): Add them and m4/locale-fr.m4.
+ (configure.ac): Invoke gt_LOCALE_FR and gt_LOCALE_FR_UTF8.
+ (Makefile.am): Activate test-vasnprintf-posix2.sh.
+
+ * lib/vasnprintf.c (VASNPRINTF): For the 'a' and 'A' directives, use
+ a locale dependent decimal point, rather than always '.'.
+
+2007-03-09 Eric Blake <ebb9@byu.net>
+
+ * lib/stdlib_.h (EXIT_FAILURE): GNU code expects this to be 1, in
+ spite of platforms like Tandem/NSK that define it to -1.
+
+2007-03-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/vprintf-posix-tests: New file.
+ * tests/test-vprintf-posix.sh: New file.
+ * tests/test-vprintf-posix.c: New file.
+ * tests/test-printf-posix.h: New file.
+
+ * modules/vprintf-posix: New file.
+ * lib/vprintf.c: New file.
+ * m4/vprintf-posix.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_VPRINTF_POSIX,
+ REPLACE_VPRINTF.
+ * lib/stdio_.h (vprintf): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_VPRINTF_POSIX,
+ REPLACE_VPRINTF.
+
+2007-03-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/fprintf-posix-tests: New file.
+ * tests/test-fprintf-posix.sh: New file.
+ * tests/test-fprintf-posix.c: New file.
+
+ * modules/fprintf-posix: New file.
+ * lib/fprintf.c: New file.
+ * m4/fprintf-posix.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_FPRINTF_POSIX,
+ REPLACE_FPRINTF.
+ * lib/stdio_.h (fprintf): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_FPRINTF_POSIX,
+ REPLACE_FPRINTF.
+
+2007-03-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/vfprintf-posix-tests: New file.
+ * tests/test-vfprintf-posix.sh: New file.
+ * tests/test-vfprintf-posix.c: New file.
+ * tests/test-fprintf-posix.h: New file.
+ * tests/test-fprintf-posix.out: New file.
+
+ * modules/vfprintf-posix: New file.
+ * lib/vfprintf.c: New file.
+ * m4/vfprintf-posix.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_VFPRINTF_POSIX,
+ REPLACE_VFPRINTF.
+ * lib/stdio_.h (vfprintf): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_VFPRINTF_POSIX,
+ REPLACE_VFPRINTF.
+
+2007-03-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h: Treat __need___FILE like __need_FILE.
+
+2007-03-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Use 'case' statements
+ instead of 'expr' invocations.
+ * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise.
+ * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise.
+ * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise.
+ Suggested by Paul Eggert.
+
+2007-03-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/fseterr-tests: New file.
+ * tests/test-fseterr.c: New file.
+
+ * modules/fseterr: New file.
+ * lib/fseterr.h: New file.
+ * lib/fseterr.c: New file.
+
+2007-03-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/fnmatch_.h: Convert tabs in the middle of lines to spaces.
+ * lib/getopt_.h: Likewise.
+ * lib/mbswidth.h: Likewise.
+ * lib/setenv.h: Likewise.
+ * lib/vasnprintf.h: Likewise.
+ * lib/vasprintf.h: Likewise.
+ * lib/verror.h: Likewise.
+ * lib/xsetenv.h: Likewise.
+ * lib/xvasprintf.h: Likewise.
+
+2007-03-08 Jim Meyering <jim@meyering.net>
+
+ * users.txt: Add parted.
+
+ * ChangeLog: Restore 1500 lines mistakenly removed from the end.
+
+2007-03-07 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4: Make the shell script snippets copy&pastable.
+
+2007-03-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/netinet_in_.h: New file.
+ * m4/netinet_in_h.m4 (gl_HEADER_NETINET_IN): Test whether netinet/in.h
+ is self-contained. Set ABSOLUTE_NETINET_IN_H, HAVE_NETINET_IN_H.
+ * modules/netinet_in (Files): Add lib/netinet_in_.h.
+ (Depends-on): Add absolute-header.
+ (Makefile.am): Substitute ABSOLUTE_NETINET_IN_H, HAVE_NETINET_IN_H
+ into netinet/in.h.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_select_.h: New file.
+ * m4/sys_socket_h.m4 (gl_HEADER_SYS_SELECT): Test whether sys/select.h
+ is self-contained. Set ABSOLUTE_SYS_SELECT_H, HAVE_SYS_SELECT_H.
+ * modules/sys_select (Files): Add lib/sys_select_.h.
+ (Depends-on): Add absolute-header.
+ (Makefile.am): Substitute ABSOLUTE_SYS_SELECT_H, HAVE_SYS_SELECT_H
+ into sys/select.h.
+
+2007-03-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/socket_.h: If sys/socket.h exists, include that and <sys/types.h>
+ before it. Turn HAVE_WINSOCK2_H and HAVE_WS2TCPIP_H into configute-time
+ values.
+ * m4/sys_socket_h.m4 (gl_HEADER_SYS_SOCKET): Test also whether
+ <sys/socket.h> is self-contained. Set ABSOLUTE_SYS_SOCKET_H,
+ HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H, HAVE_WS2TCPIP_H.
+ * modules/sys_socket (Depends-on): Add absolute-header.
+ (Makefile.am): Substitute ABSOLUTE_SYS_SOCKET_H, HAVE_SYS_SOCKET_H,
+ HAVE_WINSOCK2_H, HAVE_WS2TCPIP_H into sys/socket.h.
+ (Include): Remove requirement of inclusion of <sys/types.h>.
+
+2007-03-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/byteswap_.h (bswap_32): Fix formula.
+
+2007-03-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/sprintf-posix-tests: New file.
+ * tests/test-sprintf-posix.c: New file.
+
+ * modules/sprintf-posix: New file.
+ * lib/sprintf.c: New file.
+ * m4/sprintf-posix.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_SPRINTF_POSIX,
+ REPLACE_SPRINTF.
+ * lib/stdio_.h (sprintf): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_SPRINTF_POSIX,
+ REPLACE_SPRINTF.
+
+2007-03-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/vsprintf-posix-tests: New file.
+ * tests/test-vsprintf-posix.c: New file.
+ * tests/test-sprintf-posix.h: New file.
+
+ * modules/vsprintf-posix: New file.
+ * lib/vsprintf.c: New file.
+ * m4/vsprintf-posix.m4: New file.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also GNULIB_VSPRINTF_POSIX,
+ REPLACE_VSPRINTF.
+ * lib/stdio_.h (vsprintf): New declaration.
+ * modules/stdio (Makefile.am): Substitute also GNULIB_VSPRINTF_POSIX,
+ REPLACE_VSPRINTF.
+
+2007-03-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/vsnprintf (Depend-on): Remove minmax.
+
+2007-03-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/snprintf-posix-tests: New file.
+ * tests/test-snprintf-posix.c: New file.
+
+ * modules/snprintf-posix: New file.
+ * m4/snprintf-posix.m4: New file.
+ * m4/snprintf.m4 (gl_REPLACE_SNPRINTF): New macro, extracted from
+ gl_FUNC_SNPRINTF.
+ (gl_FUNC_SNPRINTF): Invoke it.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also REPLACE_SNPRINTF.
+ * lib/stdio_.h (snprintf): Define as a replacement if REPLACE_SNPRINTF
+ is set.
+ * modules/stdio (Makefile.am): Substitute also REPLACE_SNPRINTF.
+
+2007-03-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/vsnprintf-posix-tests: New file.
+ * tests/test-vsnprintf-posix.c: New file.
+ * tests/test-snprintf-posix.h: New file.
+
+ * modules/vsnprintf-posix: New file.
+ * m4/vsnprintf-posix.m4: New file.
+ * m4/vsnprintf.m4 (gl_REPLACE_VSNPRINTF): New macro, extracted from
+ gl_FUNC_VSNPRINTF.
+ (gl_FUNC_VSNPRINTF): Invoke it.
+ * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also REPLACE_VSNPRINTF.
+ * lib/stdio_.h (vsnprintf): Define as a replacement if
+ REPLACE_VSNPRINTF is set.
+ * modules/stdio (Makefile.am): Substitute also REPLACE_VSNPRINTF.
+
+2007-03-06 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_REPLACE_VASNPRINTF): Test for vasnprintf here.
+ * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): ... not here.
+
+2007-03-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/math_.h (acosl): Declare also if HAVE_DECL_ACOSL is set.
+ (asinl): Declare also if HAVE_DECL_ASINL is set.
+ (atanl): Declare also if HAVE_DECL_ATANL is set.
+ (ceill): Declare also if HAVE_DECL_CEILL is set.
+ (cosl): Declare also if HAVE_DECL_COSL is set.
+ (expl): Declare also if HAVE_DECL_EXPL is set.
+ (floorl): Declare also if HAVE_DECL_FLOORL is set.
+ (frexpl): Declare also if HAVE_DECL_FREXPL is set.
+ (ldexpl): Declare also if HAVE_DECL_LDEXPL is set.
+ (logl): Declare also if HAVE_DECL_LOGL is set.
+ (sinl): Declare also if HAVE_DECL_SINL is set.
+ (sqrtl): Declare also if HAVE_DECL_SQRTL is set.
+ (tanl): Declare also if HAVE_DECL_TANL is set.
+ * modules/math (Makefile.am): Substitute the values of HAVE_DECL_*.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Set HAVE_DECL_* to 1.
+ * m4/printf-frexpl.m4 (gl_FUNC_PRINTF_FREXPL): Fix tests for the
+ declaration of frexpl, ldexpl.
+ * modules/printf-frexpl (Depends-on): Add math.
+ * lib/printf-frexp.c (frexpl, ldexpl): Undo last change.
+
+2007-03-05 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf-frexpl.m4 (gl_FUNC_PRINTF_FREXPL): Also test whether
+ frexpl and ldexpl are declared.
+ * lib/printf-frexp.c (frexpl, ldexpl): Provide fallback declarations.
+
+2007-03-05 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_automake_snippet): Don't synthesize an
+ EXTRA_lib_SOURCES augmentation for the relocatable-prog-wrapper module.
+
+2007-03-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdio_.h: Include <stddef.h>.
+
+2007-03-05 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_SNPRINTF_DIRECTIVE_N): New macro.
+
+2007-03-05 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4: Update with info about OpenBSD 3.9, HP-UX 10.20,
+ NetBSD 4, from Ralf Wildenhues.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasprintf.h: Update #if logic for the case when the functions
+ exist but are overridden.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ * m4/printf.m4 (gl_PRINTF_DIRECTIVE_A): Exclude two buggy
+ implementations: glibc-2.4 and MacOS X 10.3.
+ * tests/test-vasnprintf-posix.c (test_function): Test also the case
+ that exhibits the bugs in glibc-2.4 and MacOS X 10.3.
+ * tests/test-vasprintf-posix.c (test_function): Likewise.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/vasprintf-posix-tests: New file.
+ * tests/test-vasprintf-posix.c: New file.
+
+ * modules/vasprintf-posix: New file.
+ * lib/vasprintf.h (asprintf, vasprintf): Rename if REPLACE_VASPRINTF is
+ defined.
+ * m4/vasprintf-posix.m4: New file.
+ * m4/vasprintf.m4 (gl_REPLACE_VASPRINTF): New macro, extracted from
+ gl_FUNC_VASPRINTF.
+ (gl_FUNC_VASPRINTF): Invoke it.
+ * m4/vasnprintf.m4 (gl_REPLACE_VASNPRINTF): Define REPLACE_VASNPRINTF
+ here.
+ * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Not here.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/sys_time_.h: Rename GETTIMEOFDAY_REPLACEMENT to
+ REPLACE_GETTIMEOFDAY.
+ * modules/sys_time (Makefile.am): Likewise.
+ * m4/sys_time_h.m4: Likewise.
+ * m4/gettimeofday.m4: Likewise.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/vasnprintf-posix-tests: New file.
+ * tests/test-vasnprintf-posix.c: New file.
+
+ * modules/vasnprintf-posix: New file.
+ * lib/vasnprintf.c: Include isnan.h, isnanl.h, printf-frexp.h,
+ printf-frexpl.h.
+ (VASNPRINTF): Handle the 'a' and 'A' directives here, if needed.
+ * lib/vasnprintf.h (asnprintf, vasnprintf): Rename if
+ REPLACE_VASNPRINTF is defined.
+ * m4/vasnprintf.m4 (gl_REPLACE_VASNPRINTF): New macro, extracted from
+ gl_FUNC_VASNPRINTF.
+ (gl_FUNC_VASNPRINTF): Invoke it.
+ * m4/vasnprintf-posix.m4: New file.
+ * m4/printf.m4: New file.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ Compile progreloc.c only if --enable-relocatable is specified.
+ * m4/relocatable.m4 (gl_RELOCATABLE): Arrange to compile progreloc.c
+ if --enable-relocatable was specified.
+ * modules/relocatable-prog (Makefile.am): Remove progreloc.c from
+ lib_SOURCES.
+
+2007-03-04 Jim Meyering <jim@meyering.net>
+
+ * lib/acl.c (ACL_NOT_WELL_SUPPORTED): New macro.
+ Use it consistently, rather than enumerating errno constants.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/xvasprintf-tests: New file.
+ * tests/test-xvasprintf.c: New file.
+
+ * modules/vasprintf-tests: New file.
+ * tests/test-vasprintf.c: New file.
+
+ * modules/vasnprintf-tests: New file.
+ * tests/test-vasnprintf.c: New file.
+
+ * modules/vsnprintf-tests: New file.
+ * tests/test-vsnprintf.c: New file.
+
+ * modules/snprintf-tests: New file.
+ * tests/test-snprintf.c: New file.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ Compile relocatable.c only if --enable-relocatable is specified.
+ * m4/relocatable-lib.m4 (gl_RELOCATABLE_LIBRARY_BODY): Renamed from
+ gl_RELOCATABLE_LIBRARY.
+ (gl_RELOCATABLE_LIBRARY, gl_RELOCATABLE_LIBRARY_SEPARATE): New macros.
+ * m4/relocatable.m4 (gl_RELOCATABLE): Invoke gl_RELOCATABLE_LIBRARY.
+ (gl_RELOCATABLE_BODY): Require gl_RELOCATABLE_LIBRARY_BODY instead of
+ gl_RELOCATABLE_LIBRARY.
+ * modules/relocatable-lib (configure.ac): Invoke gl_RELOCATABLE_LIBRARY.
+ (Makefile.am): Remove lib_SOURCES.
+ * modules/relocatable-lib-lgpl (configure.ac): Invoke
+ gl_RELOCATABLE_LIBRARY.
+ (Makefile.am): Remove lib_SOURCES.
+ * modules/relocatable-prog (Makefile.am): Don't compile relocatable.c
+ always.
+ * modules/relocatable-prog-wrapper (configure.ac): Invoke
+ gl_RELOCATABLE_LIBRARY_SEPARATE instead of gl_RELOCATABLE_LIBRARY.
+
+2007-03-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/argmatch-tests: New file.
+ * tests/test-argmatch.c: New file.
+
+ * tests/test-allocsa.c (main): Halve the number of loop runs.
+
+ * modules/alloca-opt-tests: New file.
+ * tests/test-alloca-opt.c: New file.
+
+2007-03-04 Jim Meyering <jim@meyering.net>
+
+ Work around difference between Linux ACLs and Solaris 10 ZFS.
+ * lib/acl.c (set_acl): Revert to using chmod_or_fchmod also
+ for EINVAL.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/relocatable-prog (Depends-on): Add back progreloc's
+ dependencies: canonicalize-lgpl, xalloc, xreadlink, stdbool, unistd.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/relocatable-lib-lgpl: Renamed from modules/relocatable-lib.
+ * modules/relocatable-lib: New file.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/relocatable-prog: Renamed from modules/relocatable.
+ * doc/relocatable-maint.texi: Talk about module 'relocatable-prog'.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/relocatable-script (Files): Add doc/relocatable.texi,
+ m4/relocatable-lib.m4.
+ (Depends-on): Remove 'relocatable'.
+ (configure.ac): Add gl_RELOCATABLE_NOP.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/relocatable-prog-wrapper: New file.
+ * modules/relocatable (Depends-on): Add it. Remove all other
+ dependencies except progname.
+ (Files): Remove build-aux/install-reloc, lib/relocwrapper.c.
+
+ * m4/strerror.m4 (gl_FUNC_STRERROR_SEPARATE): New macro.
+ (gl_FUNC_STRERROR): Nop.
+ * lib/strerror.c: Compile the file only if !HAVE_STRERROR.
+
+ * m4/setenv.m4 (gl_FUNC_SETENV_SEPARATE): New macro.
+ * lib/setenv.c: Compile the file only if _LIBC || !HAVE_SETENV.
+
+ * m4/readlink.m4 (gl_FUNC_READLINK_SEPARATE): New macro.
+ (gl_FUNC_READLINK): Update.
+
+ * m4/canonicalize-lgpl.m4 (gl_CANONICALIZE_LGPL_SEPARATE): New macro.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/xreadlink.c: Include <unistd.h> unconditionally.
+ * modules/xreadlink (Depends-on): Add unistd.
+ * modules/xreadlink-with-size (Depends-on): Likewise.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/setenv.m4 (gl_FUNC_SETENV, gl_FUNC_UNSETENV): New macros,
+ extracted from gt_FUNC_SETENV.
+ (gt_FUNC_SETENV): Remove macro.
+ * modules/setenv (configure.ac): Add gl_FUNC_SETENV, gl_FUNC_UNSETENV,
+ remove gt_FUNC_SETENV.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/relocatable-lib.m4 (gl_RELOCATABLE_LIBRARY): Define
+ ENABLE_RELOCATABLE here.
+ * m4/relocatable.m4 (gl_RELOCATABLE_BODY): Don't define it here.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/rbtreehash-list-tests (Depends-on): Add progname.
+ * tests/test-rbtreehash_list.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/rbtree-oset-tests (Depends-on): Add progname.
+ * tests/test-rbtree_oset.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/rbtree-list-tests (Depends-on): Add progname.
+ * tests/test-rbtree_list.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/linked-list-tests (Depends-on): Add progname.
+ * tests/test-linked_list.c: Include progname.h.
+ (main): Call set_program_name.
+
+2007-03-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/glob-libc.h (_Restrict_): New macro, copied from lib/regex.h.
+ All uses of __restrict changed to _Restrict_.
+ * lib/glob_.h (__restrict): Remove macro.
+
+2007-03-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/gettext (configure.ac): Require gettext infrastructure
+ from version 0.16.1.
+
+2007-03-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/linkedhash-list-tests (Depends-on): Add progname.
+ * tests/test-linkedhash_list.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/carray-list-tests (Depends-on): Add progname.
+ * tests/test-carray_list.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/avltreehash-list-tests (Depends-on): Add progname.
+ * tests/test-avltreehash_list.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/avltree-oset-tests (Depends-on): Add progname.
+ * tests/test-avltree_oset.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/avltree-list-tests (Depends-on): Add progname.
+ * tests/test-avltree_list.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/array-oset-tests (Depends-on): Add progname.
+ * tests/test-array_oset.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/array-list-tests (Depends-on): Add progname.
+ * tests/test-array_list.c: Include progname.h.
+ (main): Call set_program_name.
+
+ * modules/argp-tests (Depends-on): Add progname.
+ * tests/test-argp.c: Include argp.h first. Include progname.h.
+ (main): Call set_program_name.
+
+2007-03-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/gnulib-tool.texi (Initial import): Reword description of
+ _FILE_OFFSET_BITS and _GNU_SOURCE, since they sometimes have a
+ limited effect even if defined after the first system include.
+
+2007-03-01 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/config.libpath: Update to libtool-1.5.22.
+ Reported by Albert Chin <bug-gnulib@mlists.thewrittenword.com>.
+
+2007-03-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/relocatable-maint.texi: Recommend to set foo_CPPFLAGS, not
+ foo_CFLAGS.
+ Reported by Ralf Wildenhues.
+
+2007-03-01 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/install-reloc: Remove object files left over by some
+ compilers.
+ Reported by Ralf Wildenhues.
+
+2007-03-01 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/install-reloc: Break long lines.
+
+2007-03-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/relocatable.texi: Document that it may not work on OpenBSD.
+ Reported by Ralf Wildenhues.
+
+2007-03-01 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (Initial import): Remove paragraph about
+ include ordering constraints.
+
+2007-03-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ Followup to the 2007-02-12 patch, using suggestions from Bruno Haible in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-02/msg00136.html>.
+ * doc/gnulib-tool.texi (Initial import): Mention _FILE_OFFSET_BITS
+ as another example.
+ * lib/time_.h: Fix misspelling.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP):
+ Require gl_HEADER_TIME_H_DEFAULTS.
+ * m4/strptime.m4 (gl_FUNC_STRPTIME): Likewise.
+ * m4/time_r.m4 (gl_TIME_R): Likewise.
+ * m4/timegm.m4 (gl_FUNC_TIMEGM): Likewise.
+
+2007-03-01 Bruno Haible <bruno@clisp.org>
+
+ * m4/utimecmp.m4 (gl_UTIMECMP): Don't require gl_TIMESPEC.
+ * m4/utimens.m4 (gl_UTIMENS): Likewise.
+
+2007-03-01 Jim Meyering <jim@meyering.net>
+
+ * modules/xreadlink (Maintainer): Add my name.
+ * modules/xreadlink-with-size (Depends-on): Alphabetize.
+
+2007-02-26 Ben Pfaff <blp@cs.stanford.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ * build-aux/install-reloc: Compile also c-ctype.c.
+ * build-aux/relocatable.sh.in: New file.
+ * doc/relocatable.texi: New file.
+ * doc/relocatable-maint.texi: New file.
+ * doc/gnulib.texi: Include relocatable-maint.texi.
+ * lib/progreloc.c: Include unistd.h unconditionally.
+ * lib/relocwrapper.c: Include unistd.h unconditionally.
+ Include c-ctype.h.
+ (add_dotbin): Use c_tolower.
+ * m4/relocatable-lib.m4: New file, extracted from m4/relocatable.m4.
+ (gl_RELOCATABLE_LIBRARY): Renamed from AC_RELOCATABLE_LIBRARY.
+ (gl_RELOCATABLE_NOP): Renamed from AC_RELOCATABLE_NOP.
+ * m4/relocatable.m4 (AC_RELOCATABLE_LIBRARY, AC_RELOCATABLE_NOP): Move
+ to m4/relocatable-lib.m4.
+ (gl_RELOCATABLE): Renamed from AC_RELOCATABLE. Set also
+ RELOCATABLE_CONFIG_H_DIR, RELOCATABLE_SRC_DIR, RELOCATABLE_BUILD_DIR.
+ (gl_RELOCATABLE_BODY): Renamed from AC_RELOCATABLE_BODY. Don't
+ require obsolete macro AC_EXEEXT. Don't check for unistd.h. Don't set
+ SET_RELOCATABLE. Instead set RELOCATABLE_LDFLAGS, INSTALL_PROGRAM_ENV.
+ * modules/relocatable: New file.
+ * modules/relocatable-lib: New file.
+ * modules/relocatable-script: New file.
+
+2007-02-28 Bruno Haible <bruno@clisp.org>
+
+ Import --enable-relocatable infrastructure.
+ * build-aux/config.libpath: New file, from GNU gettext.
+ * build-aux/install-reloc: New file, from GNU gettext.
+ * build-aux/reloc-ldflags: New file, from GNU gettext.
+ * lib/relocatable.h: New file, from GNU gettext.
+ * lib/relocatable.c: New file, from GNU gettext.
+ * lib/relocwrapper.c: New file, from GNU gettext.
+ * m4/relocatable.m4: New file, from GNU gettext.
+
+2007-02-28 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (File system functions): Add xreadlink-with-size.
+
+ * modules/xreadlink: New file, from GNU gettext with modifications.
+ * lib/xreadlink.c: New file, from GNU gettext.
+ * lib/xreadlink.h: Add comments.
+ (xreadlink): New declaration.
+
+ * modules/xreadlink-with-size: Renamed from modules/xreadlink.
+ (Files): Remove m4/xreadlink.m4. Replace lib/xreadlink.c with
+ lib/xreadlink-with-size.c.
+ (configure.ac): Remove gl_XREADLINK invocation.
+ (Makefile.am): Augment lib_SOURCES.
+ * m4/xreadlink.m4: Remove file.
+ * lib/xreadlink-with-size.c: Renamed from lib/xreadlink.c.
+ (xreadlink_with_size): Renamed from xreadink.
+ * lib/xreadlink.h (xreadlink_with_size): Renamed from xreadink.
+ * modules/canonicalize (Depends-on): Replace xreadlink with
+ xreadlink-with-size.
+ * lib/canonicalize.c (canonicalize_filename_mode): Update.
+
+2007-02-25 Jim Meyering <jim@meyering.net>
+
+ * build-aux/announce-gen: When complaining about excess arguments,
+ list them.
+
+2007-02-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * README: Document signed integer overflow situation more
+ accurately.
+
+2007-02-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Fix estimate of size needed for a
+ 'a' or 'A' conversion.
+
+2007-02-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/filename: Renamed from modules/pathname.
+ (Files): Replace lib/pathname.h with lib/filename.h. Replace
+ lib/concatpath.c with lib/concat-filename.c.
+ (Makefile.am): Update.
+ (Include): Replace pathname.h with filename.h.
+ * lib/filename.h: Renamed from lib/pathname.h.
+ (concatenated_filename): Renamed from concatenated_pathname.
+ * lib/concat-filename.c: Renamed from lib/concatpath.c.
+ (concatenated_filename): Renamed from concatenated_pathname.
+ * lib/findprog.c: Include filename.h instead of pathname.h.
+ (find_in_path): Update.
+ * lib/javacomp.c: Include filename.h instead of pathname.h.
+ (is_envjavac_gcj43_usable, is_envjavac_oldgcj_14_14_usable,
+ is_envjavac_oldgcj_14_13_usable, is_envjavac_nongcj_usable,
+ is_gcj_present, is_gcj43_usable, is_oldgcj_14_14_usable,
+ is_oldgcj_14_13_usable, is_javac_usable): Update.
+ * lib/javaexec.c: Include filename.h instead of pathname.h.
+ (execute_java_class): Update.
+ * modules/findprog: Update.
+ * modules/javacomp: Update.
+ * modules/javaexec: Update.
+ * MODULES.html.sh (File system functions): Add 'filename', remove
+ 'pathname'.
+
+2007-02-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/printf-frexpl-tests: New file.
+ * tests/test-printf-frexpl.c: New file.
+
+ * modules/printf-frexpl: New file.
+ * lib/printf-frexpl.h: New file.
+ * lib/printf-frexpl.c: New file.
+ * m4/printf-frexpl.m4: New file.
+
+2007-02-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/printf-frexp-tests: New file.
+ * tests/test-printf-frexp.c: New file.
+
+ * modules/printf-frexp: New file.
+ * lib/printf-frexp.h: New file.
+ * lib/printf-frexp.c: New file.
+ * m4/printf-frexp.m4: New file.
+
+2007-02-25 Bruno Haible <bruno@clisp.org>
+
+ Assume automake >= 1.10 for the tests.
+ * modules/arcfour-tests (TESTS): Remove $(EXEEXT) suffix.
+ * modules/arctwo-tests: Likewise.
+ * modules/argp-tests: Likewise.
+ * modules/avltree-list-tests: Likewise.
+ * modules/avltree-oset-tests: Likewise.
+ * modules/avltreehash-list-tests: Likewise.
+ * modules/carray-list-tests: Likewise.
+ * modules/crc-tests: Likewise.
+ * modules/des-tests: Likewise.
+ * modules/gc-arcfour-tests: Likewise.
+ * modules/gc-arctwo-tests: Likewise.
+ * modules/gc-des-tests: Likewise.
+ * modules/gc-hmac-md5-tests: Likewise.
+ * modules/gc-hmac-sha1-tests: Likewise.
+ * modules/gc-md2-tests: Likewise.
+ * modules/gc-md4-tests: Likewise.
+ * modules/gc-md5-tests: Likewise.
+ * modules/gc-pbkdf2-sha1-tests: Likewise.
+ * modules/gc-rijndael-tests: Likewise.
+ * modules/gc-sha1-tests: Likewise.
+ * modules/gc-tests: Likewise.
+ * modules/getaddrinfo-tests: Likewise.
+ * modules/hmac-md5-tests: Likewise.
+ * modules/hmac-sha1-tests: Likewise.
+ * modules/linked-list-tests: Likewise.
+ * modules/linkedhash-list-tests: Likewise.
+ * modules/lock-tests: Likewise.
+ * modules/md2-tests: Likewise.
+ * modules/md4-tests: Likewise.
+ * modules/md5-tests: Likewise.
+ * modules/rbtree-list-tests: Likewise.
+ * modules/rbtree-oset-tests: Likewise.
+ * modules/rbtreehash-list-tests: Likewise.
+ * modules/read-file-tests: Likewise.
+ * modules/rijndael-tests: Likewise.
+ * modules/stdint-tests: Likewise.
+ * modules/tls-tests: Likewise.
+
+2007-02-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/isnanl.h (isnanl): Define through isnan if isnan is a macro.
+ * m4/isnan.m4 (gl_FUNC_ISNAN_NO_LIBM): Don't check for isnan as a
+ function; instead check whether isnan with a double argument links.
+ * m4/isnanl.m4 (gl_FUNC_ISNANL_NO_LIBM): Don't check for isnanl as a
+ function; instead check whether isnan with a 'long double' argument
+ links.
+ Reported by Eric Blake <ebb9@byu.net>.
+
+2007-02-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/isnan.c: Support the 'long double' case if USE_LONG_DOUBLE is
+ defined.
+ * lib/isnanl.c: Remove all code. Just include isnan.c.
+ * modules/isnanl-nolibm (Files): Add lib/isnan.c.
+
+2007-02-25 Jim Meyering <jim@meyering.net>
+
+ Avoid conflicting types for 'unsetenv' on FreeBSD.
+ * lib/putenv.c (_unsetenv): Rename from "unsetenv", to avoid
+ conflicting with FreeBSD's (5.0 and 6.1) function declaration
+ in stdlib.h.
+
+2007-02-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/isnanl-nolibm-tests: New file.
+ * tests/test-isnanl.c: New file.
+
+ * modules/isnanl-nolibm: New file.
+ * lib/isnanl.h: New file.
+ * lib/isnanl.c: New file.
+ * m4/isnanl.m4: New file.
+
+2007-02-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/isnan-nolibm-tests: New file.
+ * tests/test-isnan.c: New file.
+
+ * modules/isnan-nolibm: New file.
+ * lib/isnan.h: New file.
+ * lib/isnan.c: New file.
+ * m4/isnan.m4: New file.
+
+2007-02-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/frexpl.c (frexpl): Correct return values for x = 1.0L. Don't
+ assume that an exponent fits in 20 bits.
+
+2007-02-24 Jim Meyering <jim@meyering.net>
+
+ * m4/regex.m4: Update the description of the configure-time option,
+ --without-included-regex, to state accurately what the defaults are,
+ and perhaps to give people an idea why using this option is risky.
+
+2007-02-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Check for a nanosleep that
+ loops on small arguments. This attempts to avoid the problem
+ Bruno Haible reported for AIX 4.3.2 in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-02/msg00309.html>.
+
+2007-02-23 Bruno Haible <bruno@clisp.org>
+
+ * m4/perl.m4 (gl_PERL): Require version 5.005, not 5.003.
+ Needed for help2man.
+
+2007-02-23 Karl Berry <karl@gnu.org>
+
+ * doc/gnulib-tool.texi (CVS Issues): mention that when foo_.h
+ exists, foo.h should be cvs-ignored, not committed.
+
+2007-02-23 Eric Blake <ebb9@byu.net>
+
+ * lib/getdate.h (includes): Include <time.h>, not "timespec.h".
+ * lib/stat-time.h (includes): Likewise.
+ * lib/utimecmp.c (includes): Likewise.
+ * lib/utimens.h (includes): Likewise.
+ * lib/getdate.y (includes): Also include "timespec.h" for use
+ internal to the module.
+ * modules/utimens (Depends-on): Revert yesterday's patch.
+ * modules/nanosleep (Depends-on): Add missing dependency.
+
+2007-02-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/glob.c: Don't include getlogin_r.h.
+
+2007-02-22 Jim Meyering <jim@meyering.net>
+
+ * modules/utimens (Depends-on): Add timespec, required for
+ utimens.h's inclusion of timespec.h.
+
+2007-02-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
+ long unreadable paths in GNU/Linux. Problem reported by Andreas
+ Schwab in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-02/msg00261.html>.
+ I'll try to think of a better way to fix the Solaris problem.
+
+ * lib/getcwd.c (__getcwd): Don't assume getcwd (NULL, 0) works
+ like glibc; on Solaris 10, it fails with errno == EINVAL.
+ POSIX says the behavior is unspecified if the first argument is NULL,
+ so play it safe and never pass NULL to the system getcwd.
+
+2007-02-21 Jim Meyering <jim@meyering.net>
+
+ * lib/gettimeofday.c (rpl_gettimeofday): Remove declaration
+ of gettimeofday. It would conflict with the one now always
+ provided via sys_time_.h. Reported by Matthew Woehlke, as
+ an IRIX 6.5 build failure.
+
+2007-02-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ Minor fixups to port to Solaris 10 with Sun C 5.8.
+ * lib/getcwd.c [!_LIBC]: Include dirfd.h, since we use dirfd.
+ * modules/getcwd (Depends-on): Add dirfd.
+ * lib/putenv.c (putenv): #undef it.
+ (rpl_putenv): New decl.
+ (malloc, free): Include <stdlib.h> rather than prototyping separately.
+
+2007-02-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdio-tests: New file.
+ * tests/test-stdio.c: New file.
+
+ * modules/vsnprintf (Files): Remove lib/vsnprintf.h.
+ (Depends-on): Add stdio.
+ (configure.ac): Invoke gl_STDIO_MODULE_INDICATOR.
+ (Include): Use <stdio.h> instead of vsnprintf.h.
+ * m4/vsnprintf.m4 (gl_FUNC_VSNPRINTF): Require gl_STDIO_H_DEFAULTS. Set
+ HAVE_DECL_VSNPRINTF.
+ * lib/vsnprintf.c: Include <stdio.h> instead of vsnprintf.h.
+
+ * modules/snprintf (Files): Remove lib/snprintf.h.
+ (Depends-on): Add stdio.
+ (configure.ac): Invoke gl_STDIO_MODULE_INDICATOR.
+ (Include): Use <stdio.h> instead of snprintf.h.
+ * m4/snprintf.m4 (gl_FUNC_SNPRINTF): Require gl_STDIO_H_DEFAULTS. Set
+ HAVE_DECL_SNPRINTF.
+ * lib/snprintf.c: Include <stdio.h> instead of snprintf.h.
+ * lib/getaddrinfo.c: Likewise.
+
+ * modules/stdio: New file.
+ * lib/stdio_.h: New file, incorporating snprintf.h and vsnprintf.h.
+ * lib/snprintf.h: Remove file.
+ * lib/vsnprintf.h: Remove file.
+ * lib/.cppi-disable: Remove snprintf.h.
+ * m4/stdio_h.m4: New file.
+ * MODULES.html.sh (Support for systems lacking ISO C 99): Add stdio.
+
+2007-02-20 Jim Meyering <jim@meyering.net>
+
+ * lib/ftruncate.c [HAVE_CHSIZE]: Document that this code is
+ used by e.g., mingw. From Bruno Haible.
+
+2007-02-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h: Use "#pragma GCC system_header" to suppress some gcc
+ warnings.
+ Reported by Ben Pfaff <blp@cs.stanford.edu>.
+
+2007-02-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/ftruncate.m4 (gl_FUNC_FTRUNCATE): Don't request a complaint mail
+ from mingw users.
+
+2007-02-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdlib_.h: Use "#pragma GCC system_header" to suppress some gcc
+ warnings.
+ Reported by Joel E. Denny <jdenny@ces.clemson.edu> via Paul Eggert.
+
+2007-02-19 Jim Meyering <jim@meyering.net>
+
+ Don't use FD after a successful "fdopendir (fd)".
+ * lib/getcwd.c (__getcwd) [AT_FDCWD]: fdopendir (fd) usually closes fd.
+ Reset it by calling dirfd on the just-obtained DIR*.
+
+ * m4/ftruncate.m4: Adjust comment to give this module a 3-year reprieve.
+ Prompted by a report from Bruno Haible that mingw lacks ftruncate.
+
+2007-02-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/readlink.c: Include <unistd.h>.
+ * m4/readlink.m4 (gl_FUNC_READLINK): Require gl_UNISTD_H_DEFAULTS. Set
+ HAVE_READLINK.
+ * modules/readlink (Depends-on): Add unistd.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Include): Add <unistd.h>.
+
+ * lib/getlogin_r.h: Remove file.
+ * lib/getlogin_r.c: Include <unistd.h> instead of getlogin_r.h.
+ * m4/getlogin_r.m4 (gl_GETLOGIN_R_SUBSTITUTE): Remove macro.
+ (gl_GETLOGIN_R): Inline it here. Require gl_UNISTD_H_DEFAULTS. Set
+ HAVE_DECL_GETLOGIN_R.
+ * modules/getlogin_r (Files): Remove lib/getlogin_r.h.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Include): Use <unistd.h> instead of getlogin_r.h.
+
+ * lib/getcwd.h: Remove file.
+ * lib/getcwd.c: Include <unistd.h> instead of getcwd.h.
+ * lib/xgetcwd.c: Likewise.
+ * m4/getcwd.m4 (gl_FUNC_GETCWD): Require gl_UNISTD_H_DEFAULTS. Set
+ REPLACE_GETCWD. Don't define __GETCWD_PREFIX.
+ * modules/getcwd (Files): Remove lib/getcwd.h.
+ (Depends-on): Add unistd.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Include): Use <unistd.h> instad of getcwd.h.
+
+ * lib/ftruncate.c: Include <unistd.h> first.
+ * m4/ftruncate.m4 (gl_FUNC_FTRUNCATE): Require gl_UNISTD_H_DEFAULTS.
+ Set HAVE_FTRUNCATE.
+ * modules/ftruncate (Depends-on): Add unistd.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+
+ * lib/fchdir.c: Include <unistd.h> first.
+ * lib/dirent_.h: Test REPLACE_FCHDIR, not FCHDIR_REPLACEMENT.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Require gl_UNISTD_H_DEFAULTS instead
+ of gl_HEADER_UNISTD_DEFAULTS. Set REPLACE_FCHDIR. Don't set UNISTD_H.
+ * modules/fchdir (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+ (Makefile.am): Substitute also REPLACE_FCHDIR into dirent.h.
+
+ * lib/dup2.c: Include <unistd.h> first.
+ * m4/dup2.m4 (gl_FUNC_DUP2): Require gl_UNISTD_H_DEFAULTS. Set
+ HAVE_DUP2.
+ * modules/dup2 (Depends-on): Add unistd.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+
+ * lib/chown.c: Include <unistd.h> first. Undefine chown later.
+ * m4/chown.m4 (gl_FUNC_CHOWN): Require gl_UNISTD_H_DEFAULTS. Set
+ REPLACE_CHOWN. Don't define chown as a macro here.
+ * modules/chown (Depends-on): Add unistd.
+ (configure.ac): Invoke gl_UNISTD_MODULE_INDICATOR.
+
+ * lib/unistd_.h: Test HAVE_UNISTD_H determined at configure time.
+ Add definition for GL_LINK_WARNING.
+ (chown, dup2): New declarations.
+ (fchdir): Test REPLACE_FCHDIR, not FCHDIR_REPLACEMENT. Provide optional
+ link warning.
+ (ftruncate): New declaration.
+ (getcwd): New declaration, taken from old getcwd.h.
+ (getlogin_r): New declaration, taken from old getlogin_r.h.
+ (readlink): New declaration.
+ * m4/unistd_h.m4 (gl_UNISTD_H): Renamed from gl_HEADER_UNISTD. Don't
+ set UNISTD_H. Inline gl_PREREQ_UNISTD. Set HAVE_UNISTD_H.
+ (gl_PREREQ_UNISTD): Remove macro.
+ (gl_UNISTD_MODULE_INDICATOR): New macro.
+ (gl_UNISTD_H_DEFAULTS): Renamed from gl_HEADER_UNISTD_DEFAULTS. Set
+ many new variables. Don't set UNISTD_H.
+ * modules/unistd (Description): Change.
+ (Depends-on): Add link-warning.
+ (configure.ac): Update.
+ (Makefile.am): Create unistd.h always. Substitute many new variables
+ into it.
+
+2007-02-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdlib_.h (getsubopt): New declaration, copied from getsubopt.h.
+ * modules/stdlib (stdlib.h): Also substitute GNULIB_GETSUBOPT and
+ HAVE_GETSUBOPT.
+ * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Also initialize
+ GNULIB_GETSUBOPT and HAVE_GETSUBOPT.
+ * lib/getsubopt.h: Remove file.
+ * modules/getsubopt (Files): Remove lib/getsubopt.h.
+ (Depends-on): Add stdlib.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR.
+ (Includes): Use <stdlib.h> instead of getsubopt.h.
+ * m4/getsubopt.m4 (gl_FUNC_GETSUBOPT): Require gl_STDLIB_H_DEFAULTS.
+ Set HAVE_GETSUBOPT.
+ * lib/getsubopt.c: Don't include getsubopt.h.
+
+2007-02-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/fchdir (Depends-on): Add dup2.
+
+2007-02-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdlib_.h: Handle glibc's special invocation convention
+ specially.
+
+2007-02-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdlib-tests: New file.
+ * tests/test-stdlib.c: New file.
+
+ * modules/mkstemp (Files): Remove lib/mkstemp.h.
+ (Depends-on): Add stdlib.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR.
+ (Includes): Use <stdlib.h> instead of mkstemp.h.
+ * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Require gl_STDLIB_H_DEFAULTS. Set
+ REPLACE_MKSTEMP. Remove definition of __MKSTEMP_PREFIX.
+ * lib/mkstemp.c: Don't include mkstemp.h.
+ * lib/mkstemp-safer.c: Include <stdlib.h> instead of mkstemp.h.
+ * lib/stdlib--.h: Don't include mkstemp.h.
+
+ * modules/mkdtemp (Files): Remove lib/mkdtemp.h.
+ (Depends-on): Add stdlib.
+ (configure.ac): Invoke gl_STDLIB_MODULE_INDICATOR.
+ (Includes): Use <stdlib.h> instead of mkdtemp.h.
+ * m4/mkdtemp.m4 (gt_FUNC_MKDTEMP): Require gl_STDLIB_H_DEFAULTS. Set
+ HAVE_MKDTEMP.
+ * lib/mkdtemp.c: Don't include mkdtemp.h.
+ * lib/clean-temp.c: Don't include mkdtemp.h.
+
+ * modules/exit (Files): Remove lib/exit.h.
+ (Depends-on): Add stdlib.
+ (Makefile.am): Remove lib_SOURCES.
+ (Include): Use <stdlib.h> instead of exit.h.
+ * lib/argmatch.c: Don't include exit.h.
+ * lib/execute.c: Likewise.
+ * lib/pagealign_alloc.c: Likewise.
+ * lib/pipe.c: Likewise.
+ * lib/wait-process.c: Likewise.
+ * lib/copy-file.c: Include <stdlib.h> instead of exit.h.
+ * lib/exitfail.c: Likewise.
+ * lib/savewd.c: Likewise.
+ * lib/xsetenv.c: Likewise.
+
+ * modules/stdlib: New file.
+ * lib/stdlib_.h: New file, incorporating exit.h, mkdtemp.h, mkstemp.h
+ and extra comments about mkstemp().
+ * lib/exit.h: Remove file.
+ * lib/mkdtemp.h: Remove file.
+ * lib/mkstemp.h: Remove file.
+ * m4/stdlib_h.m4: New file.
+ * MODULES.html.sh (Support for systems lacking ANSI C 89): Add stdlib.
+
+2007-02-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/math-tests: New file.
+ * tests/test-math.c: New file.
+
+ * modules/math: New file.
+ * modules/mathl (Files): Remove lib/mathl.h.
+ (Depends-on): Add math.
+ (Makefile.am): Don't mention mathl.h.
+ (Include): Use <math.h> instead of mathl.h.
+ * lib/math_.h: New file.
+ * lib/mathl.h: Remove file.
+ * lib/acosl.c: Include <config.h> and <math.h> first. Don't include
+ mathl.h.
+ * lib/asinl.c: Likewise.
+ * lib/atanl.c: Likewise.
+ * lib/ceill.c: Likewise.
+ * lib/cosl.c: Likewise.
+ * lib/expl.c: Likewise.
+ * lib/floorl.c: Likewise.
+ * lib/frexpl.c: Likewise.
+ * lib/ldexpl.c: Likewise.
+ * lib/logl.c: Likewise.
+ * lib/sincosl.c: Likewise.
+ * lib/sinl.c: Likewise.
+ * lib/sqrtl.c: Likewise.
+ * lib/tanl.c: Likewise.
+ * lib/trigl.c: Likewise.
+ * m4/math_h.m4: New file.
+ * MODULES.html.sh (Mathematics): Add math.
+
+2007-02-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/wctype-tests: New file.
+ * tests/test-wctype.c: New file.
+
+ * modules/wchar-tests: New file.
+ * tests/test-wchar.c: New file.
+
+ * modules/unistd-tests: New file.
+ * tests/test-unistd.c: New file.
+
+ * modules/time-tests: New file.
+ * tests/test-time.c: New file.
+
+ * modules/sysexits-tests: New file.
+ * tests/test-sysexits.c: New file.
+
+ * modules/sys_time-tests: New file.
+ * tests/test-sys_time.c: New file.
+
+ * modules/sys_stat-tests: New file.
+ * tests/test-sys_stat.c: New file.
+
+ * modules/sys_socket-tests: New file.
+ * tests/test-sys_socket.c: New file.
+
+ * modules/sys_select-tests: New file.
+ * tests/test-sys_select.c: New file.
+
+ * modules/string-tests: New file.
+ * tests/test-string.c: New file.
+
+ * modules/stdbool-tests: New file.
+ * tests/test-stdbool.c: New file.
+
+ * modules/netinet_in-tests: New file.
+ * tests/test-netinet_in.c: New file.
+
+ * modules/inttypes-tests: New file.
+ * tests/test-inttypes.c: New file.
+
+ * modules/fcntl-tests: New file.
+ * tests/test-fcntl.c: New file.
+
+ * modules/byteswap-tests: New file.
+ * tests/test-byteswap.c: New file.
+
+ * modules/arpa_inet-tests: New file.
+ * tests/test-arpa_inet.c: New file.
+
+2007-02-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/inttypes_.h: Add definition for GL_LINK_WARNING.
+ (imaxabs, imaxdiv, strtoimax, strtoumax): Don't declare the function
+ if the corresponding module is not enabled. Emit link warnings if
+ the function is used nevertheless.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Never use the existing <inttypes.h>.
+ Don't AC_SUBST HAVE_DECL_IMAXABS, HAVE_DECL_IMAXDIV,
+ HAVE_DECL_STRTOIMAX, HAVE_DECL_STRTOUMAX.
+ (gl_INTTYPES_MODULE_INDICATOR, gl_INTTYPES_H_DEFAULTS): New macros.
+ * modules/inttypes (Depends-on): Add link-warning.
+ (Makefile.am): Copy the contents of build-aux/link-warning.h into
+ inttypes.h. Substitute also GNULIB_IMAXABS, GNULIB_IMAXDIV,
+ GNULIB_STRTOIMAX, GNULIB_STRTOUMAX.
+ * modules/imaxabs (configure.ac): Invoke gl_INTTYPES_MODULE_INDICATOR.
+ * modules/imaxdiv (configure.ac): Likewise.
+ * modules/strtoimax (configure.ac): Likewise.
+ * modules/strtoumax (configure.ac): Likewise.
+
+2007-02-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Include the contents of
+ gl_STRING_MODULE_INDICATOR_DEFAULTS.
+ (gl_STRING_MODULE_INDICATOR_DEFAULTS): Remove macro.
+ (gl_HEADER_STRING_H_BODY, gl_STRING_MODULE_INDICATOR): Update.
+
+2007-02-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/link-warning: New file.
+ * build-aux/link-warning.h: New file, extracted from lib/string_.h.
+ * lib/string_.h (GL_LINK_WARNING): Remove definition.
+ * modules/string (Depends-on): Add link-warning.
+ (Makefile.am): Copy the contents of build-aux/link-warning.h into
+ string.h.
+ * MODULES.html.sh (Support for building libraries and executables): Add
+ link-warning.
+
+2007-02-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h (memmem, mempcpy, memrchr, stpcpy, stpncpy, strcasecmp,
+ strncasecmp, strchr, strchrnul, strdup, strndup, strnlen, strcspn,
+ strpbrk, strspn, strrchr, strsep, strstr, strcasestr, strtok_r): Break
+ long lines.
+
+2007-02-17 Ben Pfaff <blp@cs.stanford.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/tmpfile: New file.
+ * lib/tmpfile.c: New file.
+ * m4/tmpfile.m4: New file.
+ * MODULES.html.sh (func_all_modules): New section "Input/output".
+
+2007-02-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/clean-temp.c [WIN32 && !CYGWIN]: Include <windows.h>.
+ (supports_delete_on_close): New function.
+ (open_temp, fopen_temp): Use _O_TEMPORARY when supported.
+
+2007-02-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbspcasecmp-tests: New file.
+ * tests/test-mbspcasecmp.sh: New file.
+ * tests/test-mbspcasecmp.c: New file.
+
+ New module mbspcasecmp.
+ * modules/mbspcasecmp: New file.
+ * lib/mbspcasecmp.c: New file.
+ * lib/string_.h (strncasecmp): Change warning message.
+ (mbspcasecmp): New declaration.
+ * m4/mbspcasecmp.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSPCASECMP.
+ * modules/string (string.h): Also substitute GNULIB_MBSPCASECMP.
+ * MODULES.html.sh (Internationalization functions): Add mbspcasecmp.
+
+2007-02-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbsncasecmp-tests: New file.
+ * tests/test-mbsncasecmp.sh: New file.
+ * tests/test-mbsncasecmp.c: New file.
+
+ New module mbsncasecmp.
+ * modules/mbsncasecmp: New file.
+ * lib/mbsncasecmp.c: New file.
+ * lib/string_.h (mbsncasecmp): New declaration.
+ * m4/mbsncasecmp.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSNCASECMP.
+ * modules/string (string.h): Also substitute GNULIB_MBSNCASECMP.
+ * MODULES.html.sh (Internationalization functions): Add mbsncasecmp.
+
+2007-02-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/exclude.c (FNM_EXTMATCH): Define if system does not.
+ Verify that it doesn't overlap with our flags.
+ (fnmatch_no_wildcards): Don't use strcasecmp or strncasecmp, which
+ do not have the desired effect in multibyte locales; instead, use
+ mbscasecmp.
+ * modules/exclude (Depends-on): Depend on mbscasecmp, not strcase.
+ Add dependency on xalloc. Depend on fnmatch, not fnmatch-gnu, since
+ we don't require GNU fnmatch ourselves (if our users require it, they
+ should do so explicitly).
+
+ Fix regex code so it doesn't rely on strcasecmp.
+ * lib/regex_internal.h: Include <langinfo.h> only if _LIBC is defined.
+ Otherwise, include gnulib's langinfo.h.
+ * lib/regcomp.c (init_dfa): Don't use strcasecmp, as it can have
+ undesirable behavior in non-C locales. Instead, rely on localecharset.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Don't require AM_LANGINFO_CODESET.
+ * modules/regex (FILES): Remove m4/codeset.m4.
+ (Depends-on): Add localcharset. Remove strcase.
+
+2007-02-13 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/unlinkdir.m4 (gl_UNLINKDIR): Fix m4 quoting bug.
+ * m4/unlink-busy.m4 (gl_FUNC_UNLINK_BUSY_TEXT): Likewise.
+
+2007-02-13 Bruno Haible <bruno@clisp.org>
+
+ * m4/intdiv0.m4 (gt_INTDIV0): Assume ANSI C. Fix underquoting bug.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2007-02-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h (memmem, mempcpy, memrchr, stpcpy, stpncpy, strchrnul,
+ strdup, strndup, strnlen, strpbrk, strsep, strtok_r): If
+ GNULIB_POSIXCHECK and the gnulib module not enabled, provoke a link-
+ time warning rather than a link error.
+
+2007-02-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/locale-fr.m4 (gt_LOCALE_FR): Fix m4 quoting bug.
+ * m4/locale-zh.m4 (gt_LOCALE_ZH_CN): Likewise.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2007-02-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/string_.h (strncasecmp): Fix typo: this macro takes 3
+ args, not 2.
+
+2007-02-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ New module 'time', so that apps can include <time.h> as per
+ POSIX and GNU instead of separate include files like time_r.h
+ and timegm.h. This implementation tries out a simpler approach
+ for replacing decls in standard include files (as compared to
+ the string module), somewhat as an experiment.
+
+ * config/srclist.txt: Comment out mktime.c for now.
+ * doc/gnulib-tool.texi (Initial import): Don't use time_r as an example
+ since it doesn't apply any more. Use generic wording instead.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): New module
+ 'time'.
+ * lib/time_.h, m4/time_h.m4, modules/time: New files.
+ * lib/strptime.h, lib/time_r.h, lib/timegm.h: Remove.
+ * lib/mktime.c: Include config.h depending on _LIBC, not HAVE_CONFIG_H.
+ Don't include <sys/types.h>; no longer needed since we assume C89.
+ * lib/mktime.c: Don't include "time_r.h"; no longer needed.
+ * lib/strftime.c: Likewise.
+ * lib/time_r.c: Likewise.
+ * lib/nanosleep.c (nanosleep): #undef after include files, not before.
+ * lib/nanosleep.c: Include <time.h> first, to check interface.
+ * lib/strptime.c: Likewise.
+ * lib/time_r.c: Likewise.
+ * lib/timegm.c: Likewise.
+ * lib/strptime.c: Don't include strptime.h or time_r.h; no longer
+ needed.
+ * lib/timegm.c: Don't include timegm.h; no longer needed.
+ * lib/timespec.h: Don't include <sys/time.h> before <time.h>;
+ time.h now handles any problems in that area.
+ (struct timespec, nanosleep): Remove; time.h now arranges for these.
+ * lib/xnanosleep.c: Don't include timespec.h; no longer needed now
+ that time.h defines struct timespec.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Check that nanosleep is declared.
+ Set REPLACE_NANOSLEEP. Don't AC_DEFINE nanosleep; the time module now
+ handles that.
+ * m4/strptime.m4 (gl_FUNC_STPRTIME): Set REPLACE_STRPTIME.
+ * m4/time_r.m4 (gl_TIME_R): Don't define HAVE_TIME_R_POSIX; no longer
+ needed. Set REPLACE_LOCALTIME.
+ * m4/timegm.m4 (gl_FUNC_TIMEGM): Set REPLACE_TIMEGM.
+ * m4/timespec.m4 (gl_CHECK_TYPE_STRUCT_TIMESPEC): Move to time_h.m4.
+ (gl_TIMESPEC): Don't check for sys/time.h or struct timespec or
+ nanosleep; time_h.m4 now does that. Don't require
+ gl_USE_SYSTEM_EXTENSIONS; no longer needed directly, and the time
+ module handles this now.
+ * modules/getdate (Depends-on): Remove timespec. Add time.
+ * modules/nanosleep (Depends-on): Likewise.
+ * modules/stat-time (Depends-on): Likewise.
+ * modules/nanosleep (Include): Include time.h, not timespec.h.
+ * modules/strptime (Files): Remove lib/strptime.h.
+ (Depends-on): Add extensions, time.
+ (Include): Include time.h, not strptime.h.
+ * modules/time_r (Files): Remove lib/time_r.h.
+ (Depends-on): Add time.
+ (Include): Include time.h, not time_r.h.
+ * modules/timegm: Likewise.
+ * modules/timespec (Description): Now does timespec-related decls
+ of our own, instead of struct timespec itself.
+ (Depends-on): Add time; remove extensions.
+ (Maintainer): Add self.
+ * modules/utimecmp (Depends-on): Add time; remove timespec.
+ * modules/utimens (Depends-on): Likewise.
+ * modules/xnanosleep (Depends-on): Likewise.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strstr.c: Include allocsa.h.
+ (knuth_morris_pratt): Use allocsa/freesa instead of malloc/free.
+ * lib/c-strcasestr.c: Include allocsa.h.
+ (knuth_morris_pratt): Use allocsa/freesa instead of malloc/free.
+ * lib/strcasestr.c: Include allocsa.h.
+ (knuth_morris_pratt): Use allocsa/freesa instead of malloc/free.
+ * lib/mbsstr.c: Include allocsa.h.
+ (knuth_morris_pratt_unibyte, knuth_morris_pratt_multibyte): Use
+ allocsa/freesa instead of malloc/free.
+ * lib/mbscasestr.c: Include allocsa.h.
+ (knuth_morris_pratt_unibyte, knuth_morris_pratt_multibyte): Use
+ allocsa/freesa instead of malloc/free.
+ * modules/c-strstr (Depends-on): Add allocsa.
+ * modules/c-strcasestr (Depends-on): Likewise.
+ * modules/strcasestr (Depends-on): Likewise.
+ * modules/mbsstr (Depends-on): Likewise.
+ * modules/mbscasestr (Depends-on): Likewise.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbsspn.c (mbsspn): Fix bug. Remove unnecessary strlen call.
+
+ * modules/mbsspn-tests: New file.
+ * tests/test-mbsspn.sh: New file.
+ * tests/test-mbsspn.c: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbspbrk.c (mbspbrk): Remove unneeded cast.
+
+ * modules/mbspbrk-tests: New file.
+ * tests/test-mbspbrk.sh: New file.
+ * tests/test-mbspbrk.c: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbscspn.c (mbscspn): Remove unnecessary strlen call and
+ unneeded cast.
+
+ * modules/mbscspn-tests: New file.
+ * tests/test-mbscspn.sh: New file.
+ * tests/test-mbscspn.c: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbscasecmp-tests: New file.
+ * tests/test-mbscasecmp.sh: New file.
+ * tests/test-mbscasecmp.c: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ Ensure O(n) worst-case complexity of mbscasestr.
+ * lib/mbscasestr.c: Include stdbool.h.
+ (knuth_morris_pratt_unibyte, knuth_morris_pratt_multibyte): New
+ functions.
+ (mbscasestr): Add some bookkeeping. Invoke knuth_morris_pratt_* when
+ the bookkeeping indicates that it's worth it.
+ * modules/mbscasestr (Depends-on): Add stdbool, mbslen, strnlen.
+
+ * modules/mbscasestr-tests: New file.
+ * tests/test-mbscasestr1.c: New file.
+ * tests/test-mbscasestr2.sh: New file.
+ * tests/test-mbscasestr2.c: New file.
+ * tests/test-mbscasestr3.sh: New file.
+ * tests/test-mbscasestr3.c: New file.
+ * tests/test-mbscasestr4.sh: New file.
+ * tests/test-mbscasestr4.c: New file.
+ * m4/locale-tr.m4: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ Ensure O(n) worst-case complexity of mbsstr.
+ * lib/mbsstr.c: Include stdbool.h.
+ (knuth_morris_pratt_unibyte, knuth_morris_pratt_multibyte): New
+ functions.
+ (mbsstr): Add some bookkeeping. Invoke knuth_morris_pratt_* when the
+ bookkeeping indicates that it's worth it.
+ * modules/mbsstr (Depends-on): Add stdbool, mbslen, strnlen.
+
+ * modules/mbsstr-tests: New file.
+ * tests/test-mbsstr1.c: New file.
+ * tests/test-mbsstr2.sh: New file.
+ * tests/test-mbsstr2.c: New file.
+ * tests/test-mbsstr3.sh: New file.
+ * tests/test-mbsstr3.c: New file.
+ * m4/locale-fr.m4: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbsrchr.c (mbsrchr): Fix bug.
+
+ * modules/mbsrchr-tests: New file.
+ * tests/test-mbsrchr.sh: New file.
+ * tests/test-mbsrchr.c: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbschr.c (mbschr): Fix bug.
+
+ * modules/mbschr-tests: New file.
+ * tests/test-mbschr.sh: New file.
+ * tests/test-mbschr.c: New file.
+ * m4/locale-zh.m4: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ Support for copying multibyte string iterators.
+ * lib/mbiter.h: Include <string.h>.
+ (mbiter_multi_copy): New function.
+ (mbi_copy): New macro.
+ * lib/mbuiter.h: Include <string.h>.
+ (mbuiter_multi_copy): New function.
+ (mbui_copy): New macro.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ New module mbslen.
+ * modules/mbslen: New file.
+ * lib/mbslen.c: New file.
+ * lib/string_.h (mbslen): New declaration.
+ * m4/mbslen.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSLEN.
+ * modules/string (string.h): Also substitute GNULIB_MBSLEN.
+ * MODULES.html.sh (Internationalization functions): Add mbslen.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ Ensure O(n) worst-case complexity of strcasestr substitute.
+ * lib/strcasestr.c: Include stdbool.h.
+ (knuth_morris_pratt): New function.
+ (strcasestr): Add some bookkeeping. Invoke knuth_morris_pratt when the
+ bookkeeping indicates that it's worth it.
+ * modules/strcasestr (Depends-on): Add stdbool, strnlen.
+
+ * modules/strcasestr-tests: New file.
+ * tests/test-strcasestr.c: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ Ensure O(n) worst-case complexity of c_strcasestr.
+ * lib/c-strcasestr.c: Include stdbool.h, string.h.
+ (knuth_morris_pratt): New function.
+ (c_strcasestr): Add some bookkeeping. Invoke knuth_morris_pratt when
+ the bookkeeping indicates that it's worth it.
+ * modules/c-strcasestr (Depends-on): Add stdbool, strnlen.
+
+ * modules/c-strcasestr-tests: New file.
+ * tests/test-c-strcasestr.c: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ Ensure O(n) worst-case complexity of c_strstr.
+ * lib/c-strstr.c: Include stdbool.h, string.h.
+ (knuth_morris_pratt): New function.
+ (c_strstr): Add some bookkeeping. Invoke knuth_morris_pratt when the
+ bookkeeping indicates that it's worth it.
+ * modules/c-strstr (Depends-on): Add stdbool, strnlen.
+
+ * lib/c-strstr.c: Complete rewrite for maintainability.
+
+ * modules/c-strstr-tests: New file.
+ * tests/test-c-strstr.c: New file.
+
+2007-02-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/javacomp.m4 (gt_JAVACOMP): Work around a 'tr' bug in coreutils
+ 5.2.1 and earlier, whereby \055 was treated just like the range
+ delimiter '-'.
+ Reported by Joel E. Denny <jdenny@ces.clemson.edu>.
+
+2007-02-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/regex (Depends-on): Add stdbool.
+ Reported by Dalibor Topic <robilad@kaffe.org>.
+
+2007-02-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_REGEX): Check for glibc bug #3957.
+ Prefer returning from main to exiting from it.
+ Remove unnecessary parens after sizeof.
+
+2007-02-05 Bruno Haible <bruno@clisp.org>
+
+ New module mbssep.
+ * modules/mbssep: New file.
+ * lib/mbssep.c: New file.
+ * lib/string_.h (strsep): Add a conditional link warning.
+ (mbssep): New declaration.
+ * m4/mbssep.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSSEP.
+ * modules/string (string.h): Also substitute GNULIB_MBSSEP.
+ * MODULES.html.sh (Internationalization functions): Add mbssep.
+
+2007-02-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/strsep.c (strsep): Fix actions in case of no delimiters.
+ Optimize search in case of 1 delimiter.
+
+2007-02-05 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/acl.h: Include sys/types.h before sys/acl.h.
+
+2007-02-05 Paolo Bonzini <bonzini@gnu.org>
+
+ Merge upstream fix for glibc bugzilla #3957:
+
+ 2007-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ * lib/regcomp.c (parse_bracket_exp): Set '\n' bit rather than '\0'
+ bit for RE_HAT_LISTS_NOT_NEWLINE.
+ (build_charclass_op): Remove bogus comment.
+
+2007-02-05 Simon Josefsson <simon@josefsson.org>
+
+ * lib/gc.h, lib/gc-libgcrypt.c: Support SHA-256/384/512.
+
+2007-02-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getsubopt.c [!_LIBC]: Include config.h and getsubopt.h.
+ * lib/memmem.c [!defined _LIBC]: Include config.h.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h (GL_LINK_WARNING2): Put the word "warning:" into the
+ warning message.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbstok_r.
+ * modules/mbstok_r: New file.
+ * lib/mbstok_r.c: New file.
+ * lib/string_.h (strtok_r): Change argument names to match the
+ comments. Add a conditional link warning.
+ (mbstok_r): New declaration.
+ * m4/mbstok_r.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSTOK_R.
+ * modules/string (string.h): Also substitute GNULIB_MBSTOK_R.
+ * MODULES.html.sh (Internationalization functions): Add mbstok_r.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbsspn.
+ * modules/mbsspn: New file.
+ * lib/mbsspn.c: New file.
+ * lib/string_.h (strspn): Add a conditional link warning.
+ (mbsspn): New declaration.
+ * m4/mbsspn.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSSPN.
+ * modules/string (string.h): Also substitute GNULIB_MBSSPN.
+ * MODULES.html.sh (Internationalization functions): Add mbsspn.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbspbrk.
+ * modules/mbspbrk: New file.
+ * lib/mbspbrk.c: New file.
+ * lib/string_.h (strpbrk): Add a conditional link warning.
+ (mbspbrk): New declaration.
+ * m4/mbspbrk.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSPBRK.
+ * modules/string (string.h): Also substitute GNULIB_MBSPBRK.
+ * MODULES.html.sh (Internationalization functions): Add mbspbrk.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbscspn.
+ * modules/mbscspn: New file.
+ * lib/mbscspn.c: New file.
+ * lib/string_.h (strcspn): Add a conditional link warning.
+ (mbscspn): New declaration.
+ * m4/mbscspn.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSCSPN.
+ * modules/string (string.h): Also substitute GNULIB_MBSCSPN.
+ * MODULES.html.sh (Internationalization functions): Add mbscspn.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbscasestr, reduced goal of strcasestr.
+ * modules/mbscasestr: New file.
+ * lib/mbscasestr.c: New file, copied from lib/strcasestr.c.
+ (mbscasestr): Renamed from strcasestr.
+ * lib/strcasestr.c: Don't include mbuiter.h.
+ (strcasestr): Remove support for multibyte locales.
+ * lib/string_.h (strcasestr): Don`t rename. Declare only if missing.
+ Change the conditional link warning.
+ (mbscasestr): New declaration.
+ * m4/mbscasestr.m4: New file.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR): Enable the replacement only if
+ the system does not have strcasestr. Set HAVE_STRCASESTR instead of
+ REPLACE_STRCASESTR.
+ (gl_PREREQ_STRCASESTR): Don't require gl_FUNC_MBRTOWC.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize
+ HAVE_STRCASESTR instead of REPLACE_STRCASESTR.
+ (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize GNULIB_MBSCASESTR.
+ * modules/string (string.h): Also substitute GNULIB_MBSCASESTR.
+ Substitute HAVE_STRCASESTR instead of REPLACE_STRCASESTR.
+ * modules/strcasestr (Files): Remove m4/mbrtowc.m4.
+ (Depends-on): Remove mbuiter.
+ * MODULES.html.sh (Internationalization functions): Add mbscasestr.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ Simplify handling of strncasecmp.
+ * lib/string_.h (strncasecmp): Remove test for GNULIB_STRCASE. Change
+ the conditional link warning.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize
+ HAVE_STRCASECMP, not REPLACE_STRCASECMP.
+ (gl_STRING_MODULE_INDICATOR_DEFAULTS): Don't initialize GNULIB_STRCASE.
+ * modules/strcase (configure.ac): Don't invoke
+ gl_STRING_MODULE_INDICATOR.
+ * modules/string (string.h): Don't substitute GNULIB_STRCASE.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbscasecmp, reduced goal of strcasecmp.
+ * modules/mbscasecmp: New file.
+ * lib/mbscasecmp.c: New file, copied from lib/strcasecmp.c.
+ (mbscasecmp): Renamed from strcasecmp.
+ * lib/strcasecmp.c: Don't include mbuiter.h.
+ (strcasecmp): Remove support for multibyte locales.
+ * lib/string_.h (strcasecmp): Don`t rename. Declare only if missing.
+ Change the conditional link warning.
+ (mbscasecmp): New declaration.
+ * m4/mbscasecmp.m4: New file.
+ * m4/strcase.m4 (gl_FUNC_STRCASECMP): Enable the replacement only if
+ the system lacks strcasecmp. Set HAVE_STRCASECMP instead of
+ REPLACE_STRCASECMP.
+ (gl_PREREQ_STRCASECMP): Don't require gl_FUNC_MBRTOWC.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSCASECMP.
+ * modules/string (string.h): Also substitute GNULIB_MBSCASECMP.
+ Substitute HAVE_STRCASECMP instead of REPLACE_STRCASECMP.
+ * modules/strcase (Files): Remove m4/mbrtowc.m4.
+ (Depends-on): Remove mbuiter.
+ * MODULES.html.sh (Internationalization functions): Add mbscasecmp.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbsstr. Remove module strstr.
+ * modules/mbsstr: New file.
+ * modules/strstr: Remove file.
+ * lib/mbsstr.c: Renamed from lib/strstr.c.
+ (mbsstr): Renamed from strstr.
+ * lib/string_.h (strstr): Remove declaration. Change the conditional
+ link warning.
+ (mbsstr): New declaration.
+ * m4/mbsstr.m4: New file.
+ * m4/strstr.m4: Remove file.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Don't initialize
+ REPLACE_STRSTR.
+ (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize GNULIB_MBSSTR.
+ Don't initialize GNULIB_STRSTR.
+ * modules/string (string.h): Also substitute GNULIB_MBSSTR. Don't
+ substitute GNULIB_STRSTR and REPLACE_STRSTR.
+ * MODULES.html.sh (Internationalization functions): Add mbsstr.
+ (Support for systems lacking ANSI C 89): Remove strstr.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbsrchr.
+ * modules/mbsrchr: New file.
+ * lib/mbsrchr.c: New file.
+ * lib/string_.h (strrchr): Add a conditional link warning.
+ (mbsrchr): New declaration.
+ * m4/mbsrchr.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSRCHR.
+ * modules/string (string.h): Also substitute GNULIB_MBSRCHR.
+ * MODULES.html.sh (Internationalization functions): Add mbsrchr.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module mbschr.
+ * modules/mbschr: New file.
+ * lib/mbschr.c: New file.
+ * lib/string_.h (strchr): Add a conditional link warning.
+ (mbschr): New declaration.
+ * m4/mbschr.m4: New file.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR_DEFAULTS): Initialize
+ GNULIB_MBSCHR.
+ * modules/string (string.h): Also substitute GNULIB_MBSCHR.
+ * MODULES.html.sh (Internationalization functions): Add mbschr.
+
+2007-02-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stdbool_.h: Mention that bool bit-fields aren't supported.
+
+ * modules/stdarg (configure.ac-early): Require AC_PROG_CC_STDC.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ New module description section 'configure.ac-early'.
+ * gnulib-tool (sed_extract_prog): Recognize configure.ac-early.
+ (func_get_autoconf_early_snippet): New function.
+ (func_import, func_create_testdir): Use it. Remove special cases for
+ modules 'extensions' and 'lock'.
+ * modules/extensions (configure.ac-early): Require
+ gl_USE_SYSTEM_EXTENSIONS.
+ * modules/lock (configure.ac-early): Require gl_LOCK_EARLY.
+
+2007-02-04 Bruno Haible <bruno@clisp.org>
+
+ Make use of gcj-4.3's -fsource and -ftarget option.
+ * m4/javacomp.m4 (gt_JAVACOMP): Test whether gcj is in version >= 4.3,
+ and if so try the options -fsource and -ftarget.
+ * lib/javacomp.c (compile_using_gcj): Add fsource_option,
+ source_version, ftarget_option, target_version arguments.
+ (is_envjavac_gcj43, is_envjavac_gcj43_usable): New functions.
+ (is_envjavac_oldgcj_14_14_usable): Renamed from
+ is_envjavac_gcj_14_14_usable.
+ (is_envjavac_oldgcj_14_13_usable): Renamed from
+ is_envjavac_gcj_14_13_usable.
+ (is_gcj_present): Update.
+ (is_gcj_43, is_gcj43_usable): New functions.
+ (is_oldgcj_14_14_usable): Renamed from is_gcj_14_14_usable. Update.
+ (is_oldgcj_14_13_usable): Renamed from is_gcj_14_13_usable. Update.
+ (compile_java_class): Test whether gcj is in version >= 4.3, and if so
+ try the options -fsource and -ftarget.
+
+2007-02-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xalloc.h (x2nrealloc): Fix an unlikely bug in the overflow
+ checking code. Set N = ceil (1.5 * N) rather than to a slightly
+ larger value.
+
+2007-02-03 Jim Meyering <jim@meyering.net>
+
+ Give tools a better chance to allocate space for very large buffers.
+ * lib/xalloc.h (x2nrealloc): Use 3/2, not 2, as buffer size factor.
+
+ Make pwd and readlink work also when run with an unreadable parent dir
+ on systems with openat support.
+ * lib/getcwd.c (__getcwd) [HAVE_PARTLY_WORKING_GETCWD]: Use the system
+ provided getcwd function, even when we have openat support.
+ Reported by Dmitry V. Levin in <http://bugzilla.redhat.com/227168>.
+
+2007-02-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h (memmem, mempcpy, memrchr, stpcpy, stpncpy, strchrnul,
+ strdup, strndup, strnlen, strpbrk, strsep, strtok_r): Provoke a link
+ error only if GNULIB_POSIXCHECK is defined. Needed to avoid artificial
+ portability problems if one of these functions is only used on specific
+ platforms.
+ Reported by Paul Eggert.
+
+2007-02-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ Avoid mempcpy in the regex code, as the string.h mempcpy stuff
+ is causing more trouble than it's curing.
+ * lib/regex_internal.h (__mempcpy): Remove.
+ * lib/regcomp.c (regerror): Rewrite to avoid the need for mempcpy
+ (and make the code a tad smaller to boot).
+ * m4/regex.m4 (gl_PREREQ_REGEX): Don't check for mempcpy.
+
+2007-02-02 Jim Meyering <jim@meyering.net>
+
+ * modules/arpa_inet: Put AC_PROG_MKDIR_P in the configure.ac:
+ section, not in the Makefile.am: one.
+
+2007-02-02 Eric Blake <ebb9@byu.net>
+
+ * lib/strchrnul.c: Always include config.h first.
+
+ * modules/mountlist (Depends-on): Revert 2007-01-31 change,
+ gnulib strstr is not necessary here.
+
+2007-02-02 Simon Josefsson <simon@josefsson.org>
+
+ * m4/socklen.m4: Fix typo.
+
+2007-02-02 Eric Blake <ebb9@byu.net>
+
+ * modules/arpa_inet (Makefile.am): Use MKDIR_P to avoid races.
+ * modules/netinet_in (Makefile.am): Likewise.
+
+2007-02-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h (GL_LINK_WARNING): New macro.
+ (strcasecmp, strstr, strcasestr): If provided by the system,
+ conditionally define as a macro that leads to a warning instead of to
+ an error.
+ (strncasecmp): Conditionally define as a macro that leads to a warning.
+
+2007-02-01 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (strtok_r.c): lose sync, no more strtok_r.h.
+
+2007-02-01 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Unicode string functions): Update after 2007-01-27
+ renamings.
+
+2007-02-01 Eric Blake <ebb9@byu.net>
+
+ * modules/regex (Depends-on): Revert dependence on mempcpy.
+ * lib/regex_internal.h [! _LIBC && !__mempcpy]: Undo string
+ module's definition of mempcpy.
+ Reported by Paul Eggert.
+
+2007-02-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/string_.h: If the gnulib module XYZ is not present, undefine
+ the symbol XYZ before redefining it. This fixes a problem with
+ programs that don't use XYZ, when compiled on systems that define
+ XYZ to something else.
+
+2007-01-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mkdir-p.c (make_dir_parents): Close a race condition that
+ occurs when "mkdir -m foo" creates a setgid directory that is (1)
+ writeable to group or other and (2) is intended to have a special
+ mode bit that is set or cleared. In such a case, the directory
+ should be neither group- nor other-writeable until the special
+ mode bits are right.
+
+2007-01-31 Eric Blake <ebb9@byu.net>
+
+ * modules/mountlist (Depends-on): Add strstr.
+
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR): Correct m4 usage
+ bug.
+ * modules/string (Makefile.am): Remove redundant replacement.
+ * modules/regex (Depends-on): Add mempcpy.
+
+2007-01-31 Bruno Haible <bruno@clisp.org>
+
+ New module description field 'Link'.
+ * gnulib-tool (func_usage): Document --extract-link-directive.
+ (sed_extract_prog): Recognize 'Link' directive.
+ (func_get_link_directive): New function.
+ (func_import): Show summary of link directives.
+ Handle --extract-link-directive option.
+ * modules/acl (Link): New section.
+ * modules/clock-time (Link): New section.
+ * modules/euidaccess (Link): New section.
+ * modules/gettext (Link): New section.
+ * modules/iconv (Link): New section.
+ * modules/lock (Link): New section.
+ * modules/nanosleep (Link): New section.
+ * modules/readline (Link): New section.
+
+2007-01-27 Bruno Haible <bruno@clisp.org>
+
+ Enforce the use of gnulib modules for unportable <string.h> functions.
+ * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR): New macro.
+ (gl_STRING_MODULE_INDICATOR_DEFAULTS): New macro.
+ (gl_HEADER_STRING_H_BODY): Require it.
+ * lib/string_.h: If the gnulib module XYZ is not present, redefine
+ the symbol XYZ to one that gives a link error.
+ * modules/string (Makefile.am): Also substitute the GNULIB_* variables.
+ * modules/memmem (configure.ac): Invoke gl_STRING_MODULE_INDICATOR.
+ * modules/mempcpy (configure.ac): Likewise.
+ * modules/memrchr (configure.ac): Likewise.
+ * modules/stpcpy (configure.ac): Likewise.
+ * modules/stpncpy (configure.ac): Likewise.
+ * modules/strcase (configure.ac): Likewise.
+ * modules/strcasestr (configure.ac): Likewise.
+ * modules/strchrnul (configure.ac): Likewise.
+ * modules/strdup (configure.ac): Likewise.
+ * modules/strndup (configure.ac): Likewise.
+ * modules/strnlen (configure.ac): Likewise.
+ * modules/strpbrk (configure.ac): Likewise.
+ * modules/strsep (configure.ac): Likewise.
+ * modules/strstr (configure.ac): Likewise.
+ * modules/strtok_r (configure.ac): Likewise.
+
+2007-01-31 Jean-Louis Martineau <martineau@zmanda.com> (tiny change)
+
+ * lib/gai_strerror.c (values): Add EAI_OVERFLOW.
+
+2007-01-30 Jim Meyering <jim@meyering.net>
+
+ * lib/mpsort.c (mpsort): Remove spurious "return" in void function.
+
+2007-01-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/allocsa.h: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
+ * lib/execute.c: Likewise.
+ * lib/pipe.c: Likewise.
+ * lib/printf-args.h: Likewise.
+ * lib/printf-args.c: Likewise.
+ * lib/printf-parse.c: Likewise.
+ * lib/vasnprintf.c: Likewise.
+
+2007-01-29 Eric Blake <ebb9@byu.net>
+
+ * lib/memrchr.c: Assume <string.h> unconditionally, to pull in
+ declaration.
+
+2007-01-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/strptime.h (strptime): Use 'restrict' for args where
+ POSIX requires this.
+ * lib/strptime.c (strptime): Likewise.
+ Change license notice from LGPL to GPL, since gnulib-tool will
+ change this as needed.
+ Include <config.h> if _LIBC is not defined, not if HAVE_CONFIG_H is
+ defined.
+ Include "strptime.h" first, to check interface.
+ Do not #undef _LIBC and _NL_CURRENT.
+ Do not include <stdlib.h>; no longer needed.
+ Include "time_r.h" and declare ptime_locale_status
+ only if _LIBC is not defined.
+ (__P): Remove unused macro.
+ (match_string): Bring back glibc version, but use it only if _LIBC
+ is defined.
+ (__strptime_internal): Compile tm_gmtoff code if _LIBC is defined, too.
+ Remove unnecessary assertion and abort() call.
+ Use #ifdef _NL_CURRENT rather than #if 0, for benefit of glibc.
+ * m4/strptime.m4: Fix serial number comment.
+ (gl_FUNC_STRPTIME): Require AC_C_RESTRICT, gl_TM_GMTOFF.
+ * modules/strptime (Files): Add m4/tm_gmtoff.m4.
+ (Depends-on): Add time_r.
+
+2007-01-29 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ strptime.
+ * modules/strptime (Depends-on): Add stdbool.
+ * lib/strptime.h: Include <time.h> always. Add comments.
+
+2007-01-29 Yoann Vandoorselaere <yoann@prelude-ids.org>
+
+ * modules/strptime: New file.
+ * lib/strptime.h: New file.
+ * lib/strptime.c: New file.
+ * m4/strptime.m4: New file.
+
+2007-01-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh: New module mpsort.
+ * lib/mpsort.c, lib/mpsort.h, m4/mpsort.m4, modules/mpsort: New files.
+
+ * lib/regex.h (_Restrict_): Renamed from __restrict, to avoid
+ a circularity problem with HP-UX ia64 reported by Bob Proulx in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-01/msg00394.html>.
+ All uses changed.
+ (_Restrict_arr_): Renamed from __restrict_arr, for similar reasons.
+ All uses changed.
+ * lib/regcomp.c, lib/regexec.c: Change all uses from __restrict
+ to _Restrict_.
+ * lib/regexec.c (regexec): Declare pmatch with _Restrict_arr_, so that
+ the parameter matches the prototype.
+
+2007-01-28 Jim Meyering <jim@meyering.net>
+
+ * modules/sys_time (Makefile.am) [MOSTLYCLEANFILES]: Do use
+ sys/time.h here, reverting that part of the previous patch:
+ <http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/8959>.
+
+2007-01-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/sys_time (Makefile.am): Build sys/time.h only when it's the
+ value of $(SYS_TIME_H).
+ [MOSTLYCLEANFILES]: Now that sys/time.h is created only when needed,
+ remove it conditionally, too. [added by Jim Meyering]
+ * m4/sys_time_h.m4 (gl_HEADER_SYS_TIME_H_BODY): Set SYS_TIME_H.
+ * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY):
+ (gl_FUNC_GETTIMEOFDAY_CLOBBER): Set SYS_TIME_H when setting
+ GETTIMEOFDAY_REPLACEMENT to 1.
+
+2007-01-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/unistd_h.m4 (gl_HEADER_UNISTD_DEFAULTS): New macro.
+ (gl_HEADER_UNISTD): Require it. Don't set UNISTD_H to empty here.
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Require gl_HEADER_UNISTD_DEFAULTS.
+ Set UNISTD_H instead of UNISTD_H2.
+ * modules/fchdir (BUILT_SOURCES): Drop $(UNISTD_H2).
+
+2007-01-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbchar (Makefile.am): Add mbchar.c to lib_SOURCES.
+ * m4/mbchar.m4 (gl_MBCHAR): Remove AC_LIBOBJ invocation.
+
+2007-01-28 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_emit_lib_Makefile_am, func_add_or_update)
+ (func_create_testdir): Ensure C locale for `grep' and `tr'
+ character ranges.
+ (func_create_megatestdir): Avoid one `grep'. Fix bug in
+ ACLOCAL_AMFLAGS parsing state machine.
+
+2007-01-27 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistr/base: Update.
+
+2007-01-27 Bruno Haible <bruno@clisp.org>
+
+ Rename u32-mbtouc -> u32-mbtouc-unsafe, u32-mbtouc-safe -> u32-mbtouc,
+ u32_mbtouc -> u32_mbtouc_unsafe, u32_mbtouc_safe -> u32_mbtouc.
+ * modules/unistr/u32-mbtouc-unsafe: Renamed from
+ modules/unistr/u32-mbtouc.
+ * lib/unistr/u32-mbtouc-unsafe.c: Renamed from lib/unistr/u32-mbtouc.c.
+ * lib/unistr.h: Update.
+ * lib/linebreak.c: Update.
+ * modules/unistr/u32-mbtouc: Renamed from
+ modules/unistr/u32-mbtouc-safe.
+ * lib/unistr/u32-mbtouc.c: Renamed from lib/unistr/u32-mbtouc-safe.c.
+ * lib/unistr.h: Update.
+ * lib/unistr/u32-to-u8.c: Update.
+ * lib/unistr/u32-to-u16.c: Update.
+
+2007-01-27 Bruno Haible <bruno@clisp.org>
+
+ Rename utf16-ucs4 -> utf16-ucs4-unsafe, utf16-ucs4-safe -> utf16-ucs4,
+ u16_mbtouc -> u16_mbtouc_unsafe, u16_mbtouc_safe -> u16_mbtouc.
+ * modules/utf16-ucs4-unsafe: Renamed from modules/utf16-ucs4.
+ * lib/utf16-ucs4-unsafe.h: Renamed from lib/utf16-ucs4.h.
+ * lib/unistr/utf16-ucs4-unsafe.c: Renamed from lib/unistr/utf16-ucs4.c.
+ * modules/unistr/u16-mbtouc-unsafe: Renamed from
+ modules/unistr/u16-mbtouc.
+ * lib/unistr/u16-mbtouc-unsafe.c: Renamed from lib/unistr/u16-mbtouc.c.
+ * lib/unistr.h: Update.
+ * lib/linebreak.c: Update.
+ * modules/linebreak: Update.
+ * modules/utf16-ucs4: Renamed from modules/utf16-ucs4-safe.
+ * lib/utf16-ucs4.h: Renamed from lib/utf16-ucs4-safe.h.
+ * lib/unistr/utf16-ucs4.c: Renamed from lib/unistr/utf16-ucs4-safe.c.
+ * modules/unistr/u16-mbtouc: Renamed from
+ modules/unistr/u16-mbtouc-safe.
+ * lib/unistr/u16-mbtouc.c: Renamed from lib/unistr/u16-mbtouc-safe.c.
+ * lib/unistr.h: Update.
+ * lib/unistr/u16-to-u8.c: Update.
+ * modules/unistr/u16-to-u8: Update.
+ * lib/unistr/u16-to-u32.c: Update.
+ * modules/unistr/u16-to-u32: Update.
+
+2007-01-27 Bruno Haible <bruno@clisp.org>
+
+ Rename utf8-ucs4 -> utf8-ucs4-unsafe, utf8-ucs4-safe -> utf8-ucs4,
+ u8_mbtouc -> u8_mbtouc_unsafe, u8_mbtouc_safe -> u8_mbtouc.
+ * modules/utf8-ucs4-unsafe: Renamed from modules/utf8-ucs4.
+ * lib/utf8-ucs4-unsafe.h: Renamed from lib/utf8-ucs4.h.
+ * lib/unistr/utf8-ucs4-unsafe.c: Renamed from lib/unistr/utf8-ucs4.c.
+ * modules/unistr/u8-mbtouc-unsafe: Renamed from
+ modules/unistr/u8-mbtouc.
+ * lib/unistr/u8-mbtouc-unsafe.c: Renamed from lib/unistr/u8-mbtouc.c.
+ * lib/unistr.h: Update.
+ * lib/striconveh.c: Update.
+ * modules/striconveh: Update.
+ * lib/linebreak.c: Update.
+ * modules/linebreak: Update.
+ * modules/utf8-ucs4: Renamed from modules/utf8-ucs4-safe.
+ * lib/utf8-ucs4.h: Renamed from lib/utf8-ucs4-safe.h.
+ * lib/unistr/utf8-ucs4.c: Renamed from lib/unistr/utf8-ucs4-safe.c.
+ * modules/unistr/u8-mbtouc: Renamed from modules/unistr/u8-mbtouc-safe.
+ * lib/unistr/u8-mbtouc.c: Renamed from lib/unistr/u8-mbtouc-safe.c.
+ * lib/unistr.h: Update.
+ * lib/striconveh.c: Update.
+ * modules/striconveh: Update.
+ * lib/unistr/u8-to-u16.c: Update.
+ * modules/unistr/u8-to-u16: Update.
+ * lib/unistr/u8-to-u32.c: Update.
+ * modules/unistr/u8-to-u32: Update.
+
+2007-01-27 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Sync from Libtool.
+ * lib/argz.c: Do not include strings.h nor memory.h, include
+ string.h unconditionally. Patch by Simon Josefsson.
+
+2007-01-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): New macro, extracted
+ from gl_HEADER_STRING_H_BODY.
+ (gl_HEADER_STRING_H_BODY): Require it.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): Require gl_HEADER_STRING_H_DEFAULTS.
+ * m4/mempcpy.m4 (gl_FUNC_MEMPCPY): Likewise.
+ * m4/memrchr.m4 (gl_FUNC_MEMRCHR): Likewise.
+ * m4/stpcpy.m4 (gl_FUNC_STPCPY): Likewise.
+ * m4/stpncpy.m4 (gl_FUNC_STPNCPY): Likewise.
+ * m4/strcase.m4 (gl_FUNC_STRCASECMP, gl_FUNC_STRNCASECMP): Likewise.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR): Likewise.
+ * m4/strchrnul.m4 (gl_FUNC_STRCHRNUL): Likewise.
+ * m4/strdup.m4 (gl_FUNC_STRDUP): Likewise.
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): Likewise.
+ * m4/strnlen.m4 (gl_FUNC_STRNLEN): Likewise.
+ * m4/strpbrk.m4 (gl_FUNC_STRPBRK): Likewise.
+ * m4/strsep.m4 (gl_FUNC_STRSEP): Likewise.
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Likewise.
+ * m4/strtok_r.m4 (gl_FUNC_STRTOK_R): Likewise.
+
+2007-01-27 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): If $for_test is true, turn
+ check_PROGRAMS into noinst_PROGRAMS.
+ (func_emit_tests_Makefile_am): Likewise. Also don't initialize
+ check_PROGRAMS in this case.
+ (func_import): Set for_test to false.
+ (func_create_testdir): Set for_test to true.
+
+2007-01-27 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/strcasestr (Files): Remove lib/strcasestr.h.
+ (Depends-on): Add string.
+ (Includes): Use <string.h> instead of strcasestr.h.
+ * modules/string (Makefile.am): Also substitute the value of
+ REPLACE_STRCASESTR.
+ * m4/strcasestr.m4 (gl_FUNC_STRCASESTR): Don't define strcasestr here;
+ assume strcasestr is declared in <string.h> not <strings.h>. Also
+ set REPLACE_STRCASESTR.
+ * m4/string_h.m4 (gl_HEADER_STRING_H_BODY): Provide a default value for
+ REPLACE_STRCASESTR.
+ * lib/strcasestr.h: Remove file.
+ * lib/strcasestr.c: Include <string.h> instead of strcasestr.h.
+ * lib/string_.h (strcasestr): New declaration.
+
+2007-01-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/string_.h: Use 'extern'.
+
+2007-01-27 Jim Meyering <jim@meyering.net>
+
+ * lib/regex_internal.c (re_string_reconstruct): Remove declaration
+ of set-but-not-used local, "q".
+
+ * lib/mempcpy.c: Include <config.h> before <string.h>.
+ This fixes a compilation error on HP-UX, due to the system's
+ "restrict"-using mempcpy prototype.
+
+2007-01-26 Bruno Haible <bruno@clisp.org>
+
+ Small optimization.
+ * lib/javacomp.c: Include c-strstr.h.
+ (is_envjavac_gcj): Use c_strstr instead of strstr.
+ * modules/javacomp (Depends-on): Add c-strstr, remove strstr.
+
+2007-01-26 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Unicode string functions): Add the new modules.
+
+ * modules/uniconv/u32-strconv-to-locale: New file.
+ * lib/uniconv/u32-strconv-to-locale.c: New file.
+
+ * modules/uniconv/u16-strconv-to-locale: New file.
+ * lib/uniconv/u16-strconv-to-locale.c: New file.
+
+ * modules/uniconv/u8-strconv-to-locale: New file.
+ * lib/uniconv/u8-strconv-to-locale.c: New file.
+
+ * modules/uniconv/u32-strconv-from-locale: New file.
+ * lib/uniconv/u32-strconv-from-locale.c: New file.
+
+ * modules/uniconv/u16-strconv-from-locale: New file.
+ * lib/uniconv/u16-strconv-from-locale.c: New file.
+
+ * modules/uniconv/u8-strconv-from-locale: New file.
+ * lib/uniconv/u8-strconv-from-locale.c: New file.
+
+ * modules/uniconv/u32-strconv-to-enc: New file.
+ * lib/uniconv/u32-strconv-to-enc.c: New file.
+ * modules/uniconv/u32-strconv-to-enc-tests: New file.
+ * tests/uniconv/test-u32-strconv-to-enc.c: New file.
+
+ * modules/uniconv/u16-strconv-to-enc: New file.
+ * lib/uniconv/u16-strconv-to-enc.c: New file.
+ * lib/uniconv/u-strconv-to-enc.h: New file.
+ * modules/uniconv/u16-strconv-to-enc-tests: New file.
+ * tests/uniconv/test-u16-strconv-to-enc.c: New file.
+
+ * modules/uniconv/u8-strconv-to-enc: New file.
+ * lib/uniconv/u8-strconv-to-enc.c: New file.
+ * modules/uniconv/u8-strconv-to-enc-tests: New file.
+ * tests/uniconv/test-u8-strconv-to-enc.c: New file.
+
+ * modules/uniconv/u32-strconv-from-enc: New file.
+ * lib/uniconv/u32-strconv-from-enc.c: New file.
+ * modules/uniconv/u32-strconv-from-enc-tests: New file.
+ * tests/uniconv/test-u32-strconv-from-enc.c: New file.
+
+ * modules/uniconv/u16-strconv-from-enc: New file.
+ * lib/uniconv/u16-strconv-from-enc.c: New file.
+ * modules/uniconv/u16-strconv-from-enc-tests: New file.
+ * tests/uniconv/test-u16-strconv-from-enc.c: New file.
+
+ * modules/uniconv/u8-strconv-from-enc: New file.
+ * lib/uniconv/u8-strconv-from-enc.c: New file.
+ * lib/uniconv/u-strconv-from-enc.h: New file.
+ * modules/uniconv/u8-strconv-from-enc-tests: New file.
+ * tests/uniconv/test-u8-strconv-from-enc.c: New file.
+
+ * modules/uniconv/u32-conv-from-enc: New file.
+ * lib/uniconv/u32-conv-from-enc.c: New file.
+ * modules/uniconv/u32-conv-from-enc-tests: New file.
+ * tests/uniconv/test-u32-conv-from-enc.c: New file.
+
+ * modules/uniconv/u16-conv-from-enc: New file.
+ * lib/uniconv/u16-conv-from-enc.c: New file.
+ * lib/uniconv/u-conv-from-enc.h: New file.
+ * modules/uniconv/u16-conv-from-enc-tests: New file.
+ * tests/uniconv/test-u16-conv-from-enc.c: New file.
+
+ * modules/uniconv/u8-conv-from-enc: New file.
+ * lib/uniconv/u8-conv-from-enc.c: New file.
+ * modules/uniconv/u8-conv-from-enc-tests: New file.
+ * tests/uniconv/test-u8-conv-from-enc.c: New file.
+
+ * modules/uniconv/base: New file.
+ * lib/uniconv.h: New file.
+
+2007-01-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/gnulib-tool.texi (Initial import): Update to match current
+ behavior with strdup module.
+ * lib/.cppi-disable: Remove strcase.h, strdup.h, strndup.h, strnlen.h.
+ * lib/memmem.h: Remove; all uses removed. This is now done
+ by <string.h>.
+ * lib/mempcpy.h: Likewise.
+ * lib/memrchr.h: Likewise.
+ * lib/stpcpy.h: Likewise.
+ * lib/stpncpy.h: Likewise.
+ * lib/strcase.h: Likewise.
+ * lib/strchrnul.h: Likewise.
+ * lib/strdup.h: Likewise.
+ * lib/strndup.h: Likewise.
+ * lib/strnlen.h: Likewise.
+ * lib/strpbrk.h: Likewise.
+ * lib/strsep.h: Likewise.
+ * lib/strstr.h: Likewise.
+ * lib/strtok_r.h: Likewise.
+ * lib/string_.h: New file.
+ * lib/argp-namefrob.h: Don't include no-longer-existent include files.
+ Rely on <string.h> instead.
+ * lib/canon-host.c: Likewise.
+ * lib/chdir-long.c: Likewise.
+ * lib/concatpath.c: Likewise.
+ * lib/exclude.c: Likewise.
+ * lib/fchdir.c: Likewise.
+ * lib/getaddrinfo.c: Likewise.
+ * lib/getcwd.c: Likewise.
+ * lib/getsubopt.c: Likewise.
+ * lib/glob.c: Likewise.
+ * lib/hard-locale.c: Likewise.
+ * lib/iconvme.c: Likewise.
+ * lib/javacomp.c: Likewise.
+ * lib/mempcpy.c: Likewise.
+ * lib/memrchr.c: Likewise.
+ * lib/regex_internal.h: Likewise.
+ * lib/stpncpy.c: Likewise.
+ * lib/strcasecmp.c: Likewise.
+ * lib/strchrnul.c: Likewise.
+ * lib/strdup.c: Likewise.
+ * lib/striconv.c: Likewise.
+ * lib/striconveh.c: Likewise.
+ * lib/striconveha.c: Likewise.
+ * lib/strncasecmp.c: Likewise.
+ * lib/strndup.c: Likewise.
+ * lib/strnlen.c: Likewise.
+ * lib/strsep.c: Likewise.
+ * lib/strstr.c: Likewise.
+ * lib/strtok_r.c: Likewise.
+ * lib/userspec.c: Likewise.
+ * lib/w32spawn.h: Likewise.
+ * lib/xstrndup.c: Likewise.
+ * lib/mountlist.c (strstr): Remove decl.
+ * m4/string_h.m4: New file.
+ * m4/memmem.m4 (gl_FUNC_MEMMEM): Set HAVE_DECL_MEMMEM if necessary.
+ * m4/mempcpy.m4 (gl_FUNC_MEMPCPY): Set HAVE_MEMPCPY if necessary.
+ * m4/memrchr.m4 (gl_FUNC_MEMRCHR): Set HAVE_MEMRCHR
+ * m4/stpcpy.m4 (gl_FUNC_STPCPY): Set HAVE_STPCPY if necessary.
+ * m4/stpncpy.m4 (gl_PREREQ_STPNCPY): Set HAVE_STPNCPY if necessary.
+ * m4/strcase.m4 (gl_FUNC_STRCASECMP):
+ Set REPLACE_STRCASECMP if necessary.
+ (gl_FUNC_STRNCASECMP): Set HAVE_DECL_STRNCASECMP if necessary.
+ * m4/strchrnul.m4 (gl_FUNC_STRCHRNUL): Set HAVE_STRCHRNUL if necessary.
+ * m4/strdup.m4 (gl_FUNC_STRDUP): Set HAVE_DECL_STRDUP if necessary.
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): Set HAVE_DECL_STRNLEN and
+ HAVE_DECL_STRDUP if necessary.
+ (gl_PREREQ_STRNLEN): Don't bother to check for strnlen decl,
+ since gl_FUNC_STRNDUP does that now.
+ * m4/strnlen.m4 (gl_FUNC_STRNLEN): Set HAVE_DECL_STRNLEN if necessary.
+ Check for decl here...
+ (gl_PREREQ_STRNLEN): ... not here.
+ * m4/strpbrk.m4 (gl_FUNC_STRPBRK): Set HAVE_STRPBRK if necessary.
+ * m4/strsep.m4 (gl_FUNC_STRSEP): Set HAVE_STRSEP if necessary.
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Set REPLACE_STRSTR if necessary.
+ * m4/strtok_r.m4 (gl_FUNC_STRTOK_R): Set HAVE_DECL_STRTOK_R if
+ necessary.
+ * modules/string: New file.
+ * modules/memmem (Files): Remove special-purpose include file.
+ (Depends-on): Add string.
+ (Include): Include <string.h>, not the removed file.
+ * modules/mempcpy: Likewise.
+ * modules/memrchr: Likewise.
+ * modules/stpcpy: Likewise.
+ * modules/stpncpy: Likewise.
+ * modules/strcase: Likewise.
+ * modules/strchrnul: Likewise.
+ * modules/strdup: Likewise.
+ * modules/strndup: Likewise.
+ * modules/strnlen: Likewise.
+ * modules/strpbrk: Likewise.
+ * modules/strsep: Likewise.
+ * modules/strstr: Likewise.
+ * modules/strtok_r: Likewise.
+ * tests/test-dirname.c: Don't include "strdup.h", since
+ <string.h> now suffices.
+ * tests/test-memmem.c: Don't include "memmem.h", since
+ <string.h> now suffices.
+
+2007-01-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveh.c (mem_cd_iconveh_internal): Ignore *lengthp if
+ *resultp is 0.
+
+ * lib/unistr/u16-to-u8.c (u16_to_u8): Fix u8_uctomb invocation.
+ * lib/unistr/u32-to-u8.c (u32_to_u8): Likewise.
+ * lib/unistr/u8-to-u16.c (u8_to_u16): Fix u16_uctomb invocation.
+ * lib/unistr/u32-to-u16.c (u32_to_u16): Likewise.
+
+ * modules/unistr/u8-to-u16 (Depends-on): Add missing modules.
+ * modules/unistr/u8-to-u32 (Depends-on): Add missing modules.
+ * modules/unistr/u16-to-u8 (Depends-on): Add missing modules.
+ * modules/unistr/u16-to-u32 (Depends-on): Add missing modules.
+ * modules/unistr/u32-to-u8 (Depends-on): Add missing modules.
+ * modules/unistr/u32-to-u16 (Depends-on): Add missing modules.
+
+2007-01-24 Bruno Haible <bruno@clisp.org>
+
+ Don't AC_REQUIRE autoconf macros that invoke AC_LIBOBJ. See
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-10/msg00279.html>.
+ * m4/argp.m4 (gl_ARGP): Invoke, don't require, gl_GETOPT_SUBSTITUTE.
+ * m4/fts.m4 (gl_FUNC_FTS, gl_FUNC_FTS_LGPL): Invoke, don't require,
+ gl_FUNC_FTS_CORE.
+ (gl_FUNC_FTS_CORE): Invoke, don't require, gl_FUNC_OPENAT.
+ * m4/lstat.m4 (gl_FUNC_LSTAT): Invoke, don't require,
+ AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK.
+ * m4/memcmp.m4 (gl_FUNC_MEMCMP): Invoke, don't require, AC_FUNC_MEMCMP.
+ * m4/mktime.m4 (gl_FUNC_MKTIME): Invoke, don't require, AC_FUNC_MKTIME.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Invoke, don't require,
+ gl_FUNC_FCHOWNAT.
+ * m4/strftime.m4 (gl_FUNC_GNU_STRFTIME): Invoke, don't require,
+ gl_FUNC_STRFTIME.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Invoke, don't require, AC_FUNC_STRTOD.
+ Reported by Ralf Wildenhues.
+
+2007-01-24 Bruno Haible <bruno@clisp.org>
+
+ Drop AC_REQUIRE calls that are redundant with the module dependencies.
+ * m4/canon-host.m4 (gl_PREREQ_CANON_HOST): Don't require
+ gl_GETADDRINFO.
+ * m4/chdir-long.m4 (gl_PREREQ_CHDIR_LONG): Don't require AM_STDBOOL_H,
+ gl_FUNC_MEMPCPY, gl_FUNC_OPENAT, gl_FUNC_MEMRCHR.
+ * m4/openat.m4 (gl_PREREQ_OPENAT): Don't require gl_SAVE_CWD.
+
+2007-01-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/fnmatch.m4 (_AC_FUNC_FNMATCH_IF): Add test for glibc bug 361.
+ Don't use 'exit'; just return from 'main'.
+ (_AC_LIBOBJ_FNMATCH): Check for headers and functions just once.
+
+ * lib/fnmatch_.h: Readjust white space and comments to match
+ glibc, to avoid spurious diffs.
+
+2007-01-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fnmatch_loop.c (internal_fnmatch) [!_LIBC]: #if-out the
+ 2004-12-01 change by Jakub Jelinek, since this code won't compile
+ if !LIBC. Problem reported by Bob Proulx.
+
+2007-01-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveh.c: Include c-strcaseeq.h.
+ (mem_iconveh, str_iconveh): Use STRCASEEQ instead of c_strcasecmp.
+ * modules/striconveh (Depends-on): Add c-strcaseeq.
+
+2007-01-23 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (String handling): Add streq, c-strcaseeq.
+
+ * modules/c-strcaseeq: New file.
+ * lib/c-strcaseeq.h: New file.
+
+ * modules/streq: New file.
+ * lib/streq.h: New file.
+
+2007-01-23 Bruno Haible <bruno@clisp.org>
+
+ * modules/striconveha-tests: New file.
+ * tests/test-striconveha.c: New file.
+
+ * lib/striconveha.h: Include <stdbool.h>.
+ (mem_iconveha, str_iconveha): Add 'transliterate' argument.
+ * lib/striconveha.c: Include allocsa.h, strdup.h, c-strcase.h.
+ (mem_iconveha_notranslit): Renamed from mem_iconveha.
+ (mem_iconveha): New function.
+ (str_iconveha_notranslit): Renamed from str_iconveha.
+ (str_iconveha): New function.
+ * modules/striconveha (Depends-on): Add stdbool, allocsa, strdup,
+ c-strcase.
+
+2007-01-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveha.c (mem_iconveha): Fix endless recursion. Try all
+ encodings without forgiving before trying any encoding with handler.
+ (str_iconveha): Try all encodings without forgiving before trying any
+ encoding with handler.
+
+2007-01-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ Import the following changes from libc.
+
+ 2005-10-14 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/fnmatch_loop.c: Adjust for changed secondary hash function.
+
+ 2004-12-01 Jakub Jelinek <jakub@redhat.com>
+
+ * lib/fnmatch_loop.c (internal_fnmatch): Clear is_seqval after
+ normal_bracket label.
+
+ 2004-09-01 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #361]
+ * lib/fnmatch_loop.c (FCT): For backslash between brackets, branch
+ to normal_bracket after fetching the next character.
+
+2007-01-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveh.h (mem_cd_iconveh, mem_iconveh): Add 'offsets'
+ argument.
+ * lib/striconveh.c (iconv_carefully_1): New function.
+ (mem_cd_iconveh_internal, mem_cd_iconveh, mem_iconveh): Add 'offsets'
+ argument.
+ (str_cd_iconveh): Update.
+ * lib/striconveha.h (mem_iconveha): Add 'offsets' argument.
+ * lib/striconveha.c (mem_iconveha): Add 'offsets' argument.
+ * tests/test-striconveh.c (MAGIC): New macro.
+ (new_offsets): New function.
+ (main): Test call with and without offsets.
+
+2007-01-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/sys_stat (Makefile.am): Use @MKDIR_P@ instead of $(MKDIR_P).
+ * modules/sys_select (Makefile.am): Likewise.
+ * modules/sys_socket (Makefile.am): Likewise.
+ * modules/sys_time (Makefile.am): Likewise.
+
+2007-01-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/gettimeofday (License): Change from GPL to LGPL, since
+ gettimeofday is a library function.
+
+2007-01-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * lib/poll.c (rpl_poll): Don't check against FD_SETSIZE under Win32.
+
+2007-01-21 Bruno Haible <bruno@clisp.org>
+
+ * m4/gnulib-common.m4 (AC_PROG_MKDIR_P): New macro.
+
+2007-01-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/striconveha: New file.
+ * lib/striconveha.h: New file.
+ * lib/striconveha.c: New file.
+ * MODULES.html.sh (Internationalization functions): Add striconveha.
+ * lib/striconv.c (str_iconv): Optimize the case of an empty input
+ string.
+ * lib/striconveh.c (mem_iconveh, str_iconveh): Likewise.
+
+2007-01-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconv.c (str_iconv): Guarantee errno is set when strdup fails.
+ * lib/striconveh.c (str_iconveh): Likewise.
+
+2007-01-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconveh.h (mem_iconveh): New declaration.
+ * lib/striconveh.c (mem_iconveh): New function.
+ * tests/test-striconveh.c (main): Add tests for mem_iconveh.
+
+2007-01-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/xstriconv.h (xmem_cd_iconv): Change specification.
+
+ * lib/striconveh.h (mem_cd_iconveh): Change specification.
+ * lib/striconveh.c (mem_cd_iconveh): Don't free the user-supplied
+ original result buffer.
+ (str_cd_iconveh): Update.
+ * tests/test-striconveh.c (main): Update.
+
+ * lib/striconv.h (mem_cd_iconv): Change specification.
+ * lib/striconv.c (mem_cd_iconv): Don't free the user-supplied original
+ result buffer.
+ (str_cd_iconv): Update.
+ * tests/test-striconv.c (main): Update.
+
+2007-01-21 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Fix test whether sed is GNU sed supporting --posix.
+
+2007-01-20 Jim Meyering <jim@meyering.net>
+
+ * lib/userspec.c (parse_with_separator): If a user or group string
+ starts with "+", skip the corresponding name-to-ID look-up, since
+ such a look-up must fail: user and group names may not include "+".
+
+2007-01-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/poll.c: Include sys/time.h and time.h unconditionally,
+ since we now assume the sys_time module.
+ * m4/poll.m4 (gl_PREREQ_POLL): Don't require AC_HEADER_TIME or
+ check for sys/time.h; no longer needed.
+ * modules/poll (Depends-on): Depend on sys_time.
+
+2007-01-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/mktime.m4 (AC_FUNC_MKTIME): Remove test for <sys/time.h>.
+ * m4/strftime.m4 (gl_FUNC_STRFTIME): Likewise.
+
+ * m4/tempname.m4 (gl_PREREQ_TEMPNAME): Remove tests for sys/time.h and
+ gettimeofday.
+
+ * tests/test-gettimeofday.c: Include <time.h>.
+ (dummy): Remove variable.
+
+ * m4/sys_time_h.m4 (gl_HEADER_SYS_TIME_H_BODY): Renamed from
+ gl_HEADER_SYS_TIME_H.
+ (gl_HEADER_SYS_TIME_H): New macro.
+
+ * lib/sys_time_.h: Test GETTIMEOFDAY_REPLACEMENT instead of
+ HAVE_GETTIMEOFDAY_POSIX_SIGNATURE and GETTIMEOFDAY_CLOBBERS_LOCALTIME.
+ * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY,
+ gl_FUNC_GETTIMEOFDAY_CLOBBER): Set GETTIMEOFDAY_REPLACEMENT instead of
+ HAVE_GETTIMEOFDAY_POSIX_SIGNATURE and GETTIMEOFDAY_CLOBBERS_LOCALTIME.
+ * m4/sys_time_h.m4 (gl_HEADER_SYS_TIME_H): Initialize
+ GETTIMEOFDAY_REPLACEMENT instead of HAVE_GETTIMEOFDAY_POSIX_SIGNATURE
+ and GETTIMEOFDAY_CLOBBERS_LOCALTIME.
+ * modules/sys_time (sys/time.h): Substitute GETTIMEOFDAY_REPLACEMENT
+ instead of HAVE_GETTIMEOFDAY_POSIX_SIGNATURE and
+ GETTIMEOFDAY_CLOBBERS_LOCALTIME.
+
+ * m4/gettimeofday.m4 (gl_GETTIMEOFDAY_REPLACE_LOCALTIME): Undo the
+ last change; it caused a compilation error when cross-compiling to
+ Cygwin.
+
+2007-01-18 Jim Meyering <jim@meyering.net>
+
+ Use "$(MKDIR_P) sys", not race-prone "test -d sys || mkdir sys".
+ * modules/sys_stat (Makefile.am): Use "$(MKDIR_P) sys", rather
+ than the race-prone "test -d sys || mkdir sys".
+ (configure.ac): Use AC_PROG_MKDIR_P.
+ * modules/sys_select: Likewise.
+ * modules/sys_socket: Likewise.
+ * modules/sys_time: Likewise.
+
+2007-01-18 Eric Blake <ebb9@byu.net>
+
+ * m4/gettimeofday.m4 (gl_GETTIMEOFDAY_REPLACE_LOCALTIME): Also
+ replace gettimeofday.
+ * lib/gettimeofday.c (rpl_gettimeofday): Declare with replacement
+ name, to avoid infinite recursion.
+
+2007-01-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): New
+ module sys_time.
+ * lib/gethrxtime.c: Include <sys/time.h>, since we can no longer
+ assume timespec.h defines struct timeval.
+ * lib/settime.c: Likewise.
+ * lib/utimens.c: Likewise.
+ * lib/gettime.c (gettime): Remove test against HAVE_GETTIMEOFDAY,
+ since we now assume the gettimeofday module.
+ * lib/tempname.c (__gen_tempname): Likewise.
+ * lib/gettimeofday.h: Remove.
+ * lib/gettimeofday.c: Include <sys/time.h> instead of "gettimeofday.h".
+ Don't include <sys/types.h> and <stdlib.h>; shouldn't be needed.
+ Include <time.h>, for 'time()'.
+ (localtime_buffer_addr): Also use this workaround if
+ TZSET_CLOBBERS_LOCALTIME. Set to a dummy static variable by default,
+ to simplify the uses. All uses changed.
+ (localtime, gmtime, tzset, gettimeofday): Reformat slightly so
+ that #undef is inside {}, and 'const' follows type name consistently.
+ (tzset): Define replacement only if TZSET_CLOBBERS_LOCALTIME.
+ (gettimeofday): Do not use the maximum possible value for
+ tv->tv_usec, since that might break usages other than ls.c.
+ Instead, we'll leave ls.c alone. This undoes today's patch
+ by Bruno. Add a compile-time warning for 1s-clock resolution;
+ we've never observed the problem but might as well keep the
+ canary.
+ * lib/nanosleep.c: Include timespec.h first, for interface check.
+ * lib/nanosleep.c: Include <sys/time.h> unconditionally, since we
+ now assume the sys_time module.
+ * lib/tempname.c: Likewise.
+ * lib/timespec.h: Likewise.
+ * lib/nanosleep.c: Don't worry about TIME_WITH_SYS_TIME; no longer
+ needed.
+ * lib/strftime.c: Likewise.
+ * lib/timespec.h: Likewise.
+ * lib/posixtm.c: Include posixtm.h first, for interface check.
+ Don't worry about TM_IN_SYS_TIME; that's wayyy obsolete.
+ * lib/posixtm.h: Include stdbool.h and time.h, for proper interface.
+ * lib/strftime.c: Don't include <sys/types.h>; shouldn't be needed.
+ * lib/sys_time_.h: New file.
+ * lib/timespec.h (struct timespec): Use long int, not long.
+ * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY):
+ (gl_FUNC_GETTIMEOFDAY_CLOBBER, gl_PREREQ_GETTIMEOFDAY):
+ Remove obsolescent call to AC_HEADER_TIME.
+ * m4/mktime.m4 (AC_FUNC_MKTIME): Likewise.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Likewise.
+ * m4/strftime.m4 (gl_FUNC_STRFTIME): Likewise.
+ * m4/timespec.m4 (gl_TIMESPEC, gl_CHECK_TYPE_STRUCT_TIMESPEC):
+ Likewise.
+ * m4/tzset.m4 (gl_FUNC_TZSET_CLOBBER): Likewise.
+ * m4/utimbuf.m4 (gl_CHECK_TYPE_STRUCT_UTIMBUF): Likewise.
+ * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): Move sys/time.h tests
+ into the sys_time module. Check for gettimeofday just once.
+ Prefix our variables with gl_, not with ac_ or jm_. Tighten test
+ for gettimeofday signature to just check the signature. Merely
+ compile it, since linking doesn't test signature. Improve test for
+ whether gettimeofday.o is actually needed.
+ (gl_FUNC_GETTIMEOFDAY_CLOBBER): Renamed from
+ AC_FUNC_GETTIMEOFDAY_CLOBBER. All uses changed. Use
+ AC_RUN_IFELSE rather than AC_TRY_RUN. If clobbering, set
+ and define GETTIMEOFDAY_CLOBBERS_LOCALTIME.
+ (gl_GETTIMEOFDAY_REPLACE_LOCALTIME): Don't define
+ GETTIMEOFDAY_CLOBBERS_LOCALTIME; that's gl_FUNC_GETTIMEOFDAY_CLOBBER's
+ job. Don't define tzset; that's gl_FUNC_TZSET_CLOBBER's job.
+ * m4/mktime.m4 (AC_FUNC_MKTIME): Just include <time.h> rather
+ than worrying about sys/time.h.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP):
+ Don't bother worrying about TIME_WITH_SYS_TIME.
+ * m4/stat-time.m4 (gl_STAT_TIME): Likewise.
+ * m4/posixtm.m4 (gl_POSIXTM): Remove obsolescent call to AC_STRUCT_TM.
+ * m4/sys_time_h.m4: New file.
+ * m4/tzset.m4 (gl_FUNC_TZSET_CLOBBER): Require gl_HEADER_SYS_TIME_H.
+ Don't include sys/time.h. Return from main rather than exiting.
+ Define TZSET_CLOBBERS_LOCALTIME, for consistency with other names;
+ all uses changed.
+ * modules/gethrxtime (Depends-on): Add sys_time.
+ * modules/gettime (Depends-on): Likewise.
+ * modules/gettimeofday (Depends-on): Likewise.
+ * modules/nanosleep (Depends-on): Likewise.
+ * modules/settime (Depends-on): Likewise.
+ * modules/tempname (Depends-on): Likewise.
+ * modules/utimens (Depends-on): Likewise.
+ * modules/gettimeofday (Files): Remove lib/gettimeofday.h.
+ (Include:) Change back to <sys/time.h>.
+ (Maintainer:) Add self.
+ * modules/sys_time: New file.
+ * modules/tempname (Depends-on): Add gettimeofday.
+ * tests/test-gettimeofday.c: Include <sys/time.h>
+ rather than gettimeofday.h.
+
+2007-01-17 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_license): Revert last patch. Instead, let
+ the license default to GPL.
+ (func_create_testdir): Don't complain if a module is LGPL and its
+ tests module depends on GPLed modules.
+
+2007-01-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/gettimeofday.c (gettimeofday): Add code for the case
+ HAVE_GETTIMEOFDAY && !GETTIMEOFDAY_CLOBBERS_LOCALTIME. Use the
+ maximum possible value for tv->tv_usec, rather than the minimum one.
+
+2005-10-08 Martin Lambers <marlam@marlam.de>
+2005-10-08 Paul Eggert <eggert@cs.ucla.edu>
+2007-01-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/gettimeofday (Files): Add lib/gettimeofday.h.
+ (configure.ac): Remove AC_FUNC_GETTIMEOFDAY_CLOBBER. Add
+ gl_FUNC_GETTIMEOFDAY.
+ (Include): Add gettimeofday.h.
+ * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): New macro.
+ (AC_FUNC_GETTIMEOFDAY_CLOBBER): Don't invoke gl_PREREQ_GETTIMEOFDAY.
+ (gl_GETTIMEOFDAY_REPLACE_LOCALTIME): Define
+ GETTIMEOFDAY_CLOBBERS_LOCALTIME. Invoke gl_PREREQ_GETTIMEOFDAY here.
+ (gl_PREREQ_GETTIMEOFDAY): Check for <sys/timeb.h> and _ftime.
+ * lib/gettimeofday.h: New file.
+ * lib/gettimeofday.c: Include <sys/timeb.h>.
+ (localtime_buffer_addr, rpl_localtime, rpl_gmtime, rpl_tzset): Define
+ only if GETTIMEOFDAY_CLOBBERS_LOCALTIME.
+ (rpl_gettimeofday) [!HAVE_GETTIMEOFDAY]: Use _ftime() when available;
+ fall back on time().
+
+ * tests/test-gettimeofday.c: New file.
+ * modules/gettimeofday-tests: New file.
+
+2007-01-16 Eric Blake <ebb9@byu.net>
+
+ * modules/fnmatch (Depends-on): Depend on wchar.
+ * lib/fnmatch.c (WIDE_CHAR_SUPPORT): Assume <wchar.h>.
+ * m4/fnmatch.m4: Likewise.
+ * modules/mbchar (Makefile.am): Assume <wchar.h>.
+ * m4/mbchar.m4: Likewise.
+ * modules/mbswidth (Depends-on): Depend on wchar.
+ * lib/mbswidth.c: Assume <wchar.h>.
+ * m4/mbswidth.m4: Likewise.
+ * modules/quotearg (Depends-on): Depend on wchar.
+ * lib/quotearg.c: Assume <wchar.h>.
+ * m4/quotearg.m4: Likewise.
+ * modules/regex (Depends-on): Depend on wchar.
+ * lib/regex_internal.h: Assume <wchar.h>.
+ * m4/regex.m4: Likewise.
+ * modules/stdint (Depends-on): Depend on wchar.
+ * lib/stdint_.h [!defined WCHAR_MIN]: Assume <wchar.h>.
+ * m4/stdint.m4: Likewise.
+ * tests/test-stdint.c [HAVE_WINT_T]: Likewise.
+ * modules/strftime (Depends-on): Depend on wchar.
+ * lib/strftime.c (DO_MULTIBYTE): Assume <wchar.h>.
+ * modules/strtol (Depends-on): Depend on wchar.
+ * lib/strtol.c: Assume <wchar.h>.
+ * modules/wcwidth (Depends-on): Depend on wchar.
+ * lib/wcwidth.h: Assume <wchar.h>.
+ * m4/wcwidth.m4: Likewise.
+
+2007-01-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/csharpexec-script: New, created from...
+ * modules/csharpexec: ... this.
+
+2007-01-16 Paolo Bonzini <bonzini@gnu.org>
+
+ * modules/javaexec-script: New, created from...
+ * modules/javaexec: ... this.
+
+2007-01-16 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * modules/poll (Dependencies): Add sys_select.
+
+2007-01-15 Jim Meyering <jim@meyering.net>
+
+ * m4/readutmp.m4 (gl_READUTMP): Work around AIX 4.3 struct-
+ redefinition bug when using both <utmp.h> and <utmpx.h> headers.
+ * lib/readutmp.h: Likewise. Reported by Daniel Richard G. in
+ <http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/9415>.
+
+2007-01-15 Bruno Haible <bruno@clisp.org>
+
+ * modules/striconveh: New file.
+ * lib/striconveh.h: New file.
+ * lib/striconveh.c: New file.
+ * MODULES.html.sh (Internationalization functions): Add striconveh.
+
+ * modules/striconveh-tests: New file.
+ * tests/test-striconveh.c: New file.
+
+2007-01-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconv.c (str_cd_iconv): Use the first algorithm if iconv is
+ not from GNU libiconv or GNU libc.
+
+2007-01-15 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-intro.texi (Copyright): Explain the different license
+ terms for module descriptions, autoconf macros, tests, documentation.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/striconv-tests: New file.
+ * tests/test-striconv.c: New file.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/iconv-tests: New file.
+ * tests/test-iconv.c: New file.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_license): For test modules, use the license of
+ the main module.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/iconv (Include): Clarify that <iconv.h> can only be included
+ if iconv is found to exist.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/c-ctype-tests: New file.
+ * tests/test-c-ctype.c: New file.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/binary-io-tests: New file.
+ * tests/test-binary-io.sh: New file.
+ * tests/test-binary-io.c: New file.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/array-oset-tests: New file.
+ * tests/test-array_oset.c: New file.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/array-list-tests: New file.
+ * tests/test-array_list.c: New file.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Don't unnecessarily run configure
+ and make.
+ Reported by Simon Josefsson in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-01/msg00139.html>
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/allocsa-tests: New file.
+ * tests/test-allocsa.c: New file.
+
+2007-01-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/fchdir (Depends-on): Add absolute-header.
+ * modules/unistd (Depends-on): Likewise.
+
+2006-12-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/fchdir: New file.
+ * modules/unistd (Files): Add lib/unistd_.h.
+ (Makefile.am): Generate unistd.h from unistd_.h.
+ * lib/fchdir.c: New file.
+ * lib/dirent_.h: New file.
+ * lib/unistd_.h: New file.
+ * lib/fcntl_.h (open) [FCHDIR_REPLACEMENT]: New replacement.
+ * m4/fchdir.m4: New file.
+ * m4/unistd_h.m4 (gl_PREREQ_UNISTD): New macro.
+ (gl_HEADER_UNISTD): Invoke it.
+ * lib/dup-safer.c (dup_safer) [FCHDIR_REPLACEMENT]: Use the dup
+ function.
+ * lib/backupfile.c (opendir, closedir): Undefine.
+ * lib/chown.c (open, close): Undefine.
+ * lib/clean-temp.c (open, close): Undefine.
+ * lib/copy-file.c (open, close): Undefine.
+ * lib/execute.c (open, close): Undefine.
+ * lib/fsusage.c (open, close): Undefine.
+ * lib/gc-gnulib.c (open, close): Undefine.
+ * lib/getcwd.c (opendir, closedir): Undefine.
+ * lib/glob.c (opendir, closedir): Undefine.
+ * lib/javacomp.c (open, close): Undefine.
+ * lib/mountlist.c (open, close, opendir, closedir): Undefine.
+ * lib/openat-proc.c (open, close): Undefine.
+ * lib/pagealign_alloc.c (open, close): Undefine.
+ * lib/pipe.c (open, close): Undefine.
+ * lib/progreloc.c (open, close): Undefine.
+ * lib/savedir.c (opendir, closedir): Undefine.
+ * lib/utime.c (open, close): Undefine.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add fchdir.
+
+2007-01-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconv.c (mem_cd_iconv): Align the temporary buffer.
+
+2007-01-12 Eric Blake <ebb9@byu.net>
+
+ Provide a robust <wchar.h>. Further simplifications are now
+ possible in other modules, but not included here.
+ * modules/wchar: New module.
+ * m4/wchar.m4: New file.
+ * lib/wchar_.h: Likewise.
+ * modules/mbchar (Depends-on): Depend on wchar, as the first use
+ of the new module.
+ * MODULES.html.sh (Extended multibyte and wide character utilities):
+ New section.
+
+2007-01-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xreadlink.c (SYMLINK_MAX) [!defined SYMLINK_MAX]: Define
+ to a reasonable default for memory allocation.
+ (xreadlink): Don't allocate a huge buffer, to work around a buggy
+ file system that reports garbage st_size values for symlinks.
+ Problem reported by Liyang Hu.
+
+2007-01-11 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool (func_all_modules): Exclude all .* files (e.g.,
+ Emacs .#* auto-save files).
+
+2007-01-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_all_modules): Exclude all files inside the CVS
+ directory.
+
+2007-01-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ Use @...@ consistently in lib/wctype_.h.
+ * lib/wctype_.h [HAVE_WINT_T]: Go back to using @...@, but rely
+ on it being set to 1 or 0.
+ * m4/wctype.m4 (gl_WCTYPE_H): Set HAVE_WINT_T to 1 or 0, and
+ go back to AC_SUBSTing it.
+ * modules/wctype (Makefile.am): Undo previous change.
+
+2007-01-10 Eric Blake <ebb9@byu.net>
+
+ * lib/wctype_.h [HAVE_WINT_T]: Rely on AC_DEFINE.
+ * m4/wctype.m4 (gl_WCTYPE_H): No need to AC_SUBST(HAVE_WINT_T).
+ * modules/wctype (Makefile.am): Likewise.
+ Reported by Chris McGuire.
+
+2007-01-10 Jim Meyering <jim@meyering.net>
+
+ fts.c: a small readability/maintainability improvement
+ * lib/fts.c (fts_read): Make this code slightly more readable and
+ maintainable by hoisting the "sp->fts_cur = p" assignments to
+ immediately follow the statements that set P. Derived from
+ the patch by Miloslav Trmac in http://bugzilla.redhat.com/222089.
+
+2007-01-10 Eric Blake <ebb9@byu.net>
+
+ * lib/wctype_.h [HAVE_WINT_T]: Include <stddef.h> before
+ <wchar.h>, to work around BSDI bug in BSD/OS 4.0.1.
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Likewise.
+ * m4/wint_t.m4 (gt_TYPE_WINT_T): Likewise.
+ Reported by Chris McGuire.
+
+2007-01-09 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_all_modules): Use POSIX conforming escaping
+ in sed script.
+
+2007-01-09 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh: Accept options --cvs-urls, --git-urls.
+ (repo_url_prefix, repo_url_suffix, repo_url_suffix_repl): New
+ variables.
+ (func_module): Use them.
+
+2007-01-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/unistr/base: New file.
+ * lib/unistr.h: New file.
+
+ * modules/unistr/u8-to-u16: New file.
+ * lib/unistr/u8-to-u16.c: New file.
+
+ * modules/unistr/u8-to-u32: New file.
+ * lib/unistr/u8-to-u32.c: New file.
+
+ * modules/unistr/u16-to-u8: New file.
+ * lib/unistr/u16-to-u8.c: New file.
+
+ * modules/unistr/u16-to-u32: New file.
+ * lib/unistr/u16-to-u32.c: New file.
+
+ * modules/unistr/u32-to-u8: New file.
+ * lib/unistr/u32-to-u8.c: New file.
+
+ * modules/unistr/u32-to-u16: New file.
+ * lib/unistr/u32-to-u16.c: New file.
+
+ * modules/unistr/u8-check: New file.
+ * modules/unistr/u16-check: New file.
+ * modules/unistr/u32-check: New file.
+ * lib/unistr/u8-check.c: New file.
+ * lib/unistr/u16-check.c: New file.
+ * lib/unistr/u32-check.c: New file.
+
+ * modules/unistr/u8-chr: New file.
+ * modules/unistr/u16-chr: New file.
+ * modules/unistr/u32-chr: New file.
+ * lib/unistr/u8-chr.c: New file.
+ * lib/unistr/u16-chr.c: New file.
+ * lib/unistr/u32-chr.c: New file.
+
+ * modules/unistr/u8-cmp: New file.
+ * modules/unistr/u16-cmp: New file.
+ * modules/unistr/u32-cmp: New file.
+ * lib/unistr/u8-cmp.c: New file.
+ * lib/unistr/u16-cmp.c: New file.
+ * lib/unistr/u32-cmp.c: New file.
+
+ * modules/unistr/u8-cpy: New file.
+ * modules/unistr/u16-cpy: New file.
+ * modules/unistr/u32-cpy: New file.
+ * lib/unistr/u8-cpy.c: New file.
+ * lib/unistr/u16-cpy.c: New file.
+ * lib/unistr/u32-cpy.c: New file.
+ * lib/unistr/u-cpy.h: New file.
+
+ * modules/unistr/u8-cpy-alloc: New file.
+ * modules/unistr/u16-cpy-alloc: New file.
+ * modules/unistr/u32-cpy-alloc: New file.
+ * lib/unistr/u8-cpy-alloc.c: New file.
+ * lib/unistr/u16-cpy-alloc.c: New file.
+ * lib/unistr/u32-cpy-alloc.c: New file.
+ * lib/unistr/u-cpy-alloc.h: New file.
+
+ * modules/unistr/u8-endswith: New file.
+ * modules/unistr/u16-endswith: New file.
+ * modules/unistr/u32-endswith: New file.
+ * lib/unistr/u8-endswith.c: New file.
+ * lib/unistr/u16-endswith.c: New file.
+ * lib/unistr/u32-endswith.c: New file.
+ * lib/unistr/u-endswith.h: New file.
+
+ * modules/unistr/u8-mblen: New file.
+ * modules/unistr/u16-mblen: New file.
+ * modules/unistr/u32-mblen: New file.
+ * lib/unistr/u8-mblen.c: New file.
+ * lib/unistr/u16-mblen.c: New file.
+ * lib/unistr/u32-mblen.c: New file.
+
+ * modules/unistr/u8-mbtouc: New file.
+ * modules/unistr/u16-mbtouc: New file.
+ * modules/unistr/u32-mbtouc: New file.
+ * lib/unistr/u8-mbtouc.c: New file.
+ * lib/unistr/u16-mbtouc.c: New file.
+ * lib/unistr/u32-mbtouc.c: New file.
+
+ * modules/unistr/u8-mbtouc-safe: New file.
+ * modules/unistr/u16-mbtouc-safe: New file.
+ * modules/unistr/u32-mbtouc-safe: New file.
+ * lib/unistr/u8-mbtouc-safe.c: New file.
+ * lib/unistr/u16-mbtouc-safe.c: New file.
+ * lib/unistr/u32-mbtouc-safe.c: New file.
+
+ * modules/unistr/u8-move: New file.
+ * modules/unistr/u16-move: New file.
+ * modules/unistr/u32-move: New file.
+ * lib/unistr/u8-move.c: New file.
+ * lib/unistr/u16-move.c: New file.
+ * lib/unistr/u32-move.c: New file.
+ * lib/unistr/u-move.h: New file.
+
+ * modules/unistr/u8-next: New file.
+ * modules/unistr/u16-next: New file.
+ * modules/unistr/u32-next: New file.
+ * lib/unistr/u8-next.c: New file.
+ * lib/unistr/u16-next.c: New file.
+ * lib/unistr/u32-next.c: New file.
+
+ * modules/unistr/u8-prev: New file.
+ * modules/unistr/u16-prev: New file.
+ * modules/unistr/u32-prev: New file.
+ * lib/unistr/u8-prev.c: New file.
+ * lib/unistr/u16-prev.c: New file.
+ * lib/unistr/u32-prev.c: New file.
+
+ * modules/unistr/u8-set: New file.
+ * modules/unistr/u16-set: New file.
+ * modules/unistr/u32-set: New file.
+ * lib/unistr/u8-set.c: New file.
+ * lib/unistr/u16-set.c: New file.
+ * lib/unistr/u32-set.c: New file.
+ * lib/unistr/u-set.h: New file.
+
+ * modules/unistr/u8-startswith: New file.
+ * modules/unistr/u16-startswith: New file.
+ * modules/unistr/u32-startswith: New file.
+ * lib/unistr/u8-startswith.c: New file.
+ * lib/unistr/u16-startswith.c: New file.
+ * lib/unistr/u32-startswith.c: New file.
+ * lib/unistr/u-startswith.h: New file.
+
+ * modules/unistr/u8-stpcpy: New file.
+ * modules/unistr/u16-stpcpy: New file.
+ * modules/unistr/u32-stpcpy: New file.
+ * lib/unistr/u8-stpcpy.c: New file.
+ * lib/unistr/u16-stpcpy.c: New file.
+ * lib/unistr/u32-stpcpy.c: New file.
+ * lib/unistr/u-stpcpy.h: New file.
+
+ * modules/unistr/u8-stpncpy: New file.
+ * modules/unistr/u16-stpncpy: New file.
+ * modules/unistr/u32-stpncpy: New file.
+ * lib/unistr/u8-stpncpy.c: New file.
+ * lib/unistr/u16-stpncpy.c: New file.
+ * lib/unistr/u32-stpncpy.c: New file.
+ * lib/unistr/u-stpncpy.h: New file.
+
+ * modules/unistr/u8-strcat: New file.
+ * modules/unistr/u16-strcat: New file.
+ * modules/unistr/u32-strcat: New file.
+ * lib/unistr/u8-strcat.c: New file.
+ * lib/unistr/u16-strcat.c: New file.
+ * lib/unistr/u32-strcat.c: New file.
+ * lib/unistr/u-strcat.h: New file.
+
+ * modules/unistr/u8-strchr: New file.
+ * modules/unistr/u16-strchr: New file.
+ * modules/unistr/u32-strchr: New file.
+ * lib/unistr/u8-strchr.c: New file.
+ * lib/unistr/u16-strchr.c: New file.
+ * lib/unistr/u32-strchr.c: New file.
+
+ * modules/unistr/u8-strcmp: New file.
+ * modules/unistr/u16-strcmp: New file.
+ * modules/unistr/u32-strcmp: New file.
+ * lib/unistr/u8-strcmp.c: New file.
+ * lib/unistr/u16-strcmp.c: New file.
+ * lib/unistr/u32-strcmp.c: New file.
+
+ * modules/unistr/u8-strcpy: New file.
+ * modules/unistr/u16-strcpy: New file.
+ * modules/unistr/u32-strcpy: New file.
+ * lib/unistr/u8-strcpy.c: New file.
+ * lib/unistr/u16-strcpy.c: New file.
+ * lib/unistr/u32-strcpy.c: New file.
+ * lib/unistr/u-strcpy.h: New file.
+
+ * modules/unistr/u8-strcspn: New file.
+ * modules/unistr/u16-strcspn: New file.
+ * modules/unistr/u32-strcspn: New file.
+ * lib/unistr/u8-strcspn.c: New file.
+ * lib/unistr/u16-strcspn.c: New file.
+ * lib/unistr/u32-strcspn.c: New file.
+ * lib/unistr/u-strcspn.h: New file.
+
+ * modules/unistr/u8-strdup: New file.
+ * modules/unistr/u16-strdup: New file.
+ * modules/unistr/u32-strdup: New file.
+ * lib/unistr/u8-strdup.c: New file.
+ * lib/unistr/u16-strdup.c: New file.
+ * lib/unistr/u32-strdup.c: New file.
+ * lib/unistr/u-strdup.h: New file.
+
+ * modules/unistr/u8-strlen: New file.
+ * modules/unistr/u16-strlen: New file.
+ * modules/unistr/u32-strlen: New file.
+ * lib/unistr/u8-strlen.c: New file.
+ * lib/unistr/u16-strlen.c: New file.
+ * lib/unistr/u32-strlen.c: New file.
+ * lib/unistr/u-strlen.h: New file.
+
+ * modules/unistr/u8-strmblen: New file.
+ * modules/unistr/u16-strmblen: New file.
+ * modules/unistr/u32-strmblen: New file.
+ * lib/unistr/u8-strmblen.c: New file.
+ * lib/unistr/u16-strmblen.c: New file.
+ * lib/unistr/u32-strmblen.c: New file.
+
+ * modules/unistr/u8-strmbtouc: New file.
+ * modules/unistr/u16-strmbtouc: New file.
+ * modules/unistr/u32-strmbtouc: New file.
+ * lib/unistr/u8-strmbtouc.c: New file.
+ * lib/unistr/u16-strmbtouc.c: New file.
+ * lib/unistr/u32-strmbtouc.c: New file.
+
+ * modules/unistr/u8-strncat: New file.
+ * modules/unistr/u16-strncat: New file.
+ * modules/unistr/u32-strncat: New file.
+ * lib/unistr/u8-strncat.c: New file.
+ * lib/unistr/u16-strncat.c: New file.
+ * lib/unistr/u32-strncat.c: New file.
+ * lib/unistr/u-strncat.h: New file.
+
+ * modules/unistr/u8-strncmp: New file.
+ * modules/unistr/u16-strncmp: New file.
+ * modules/unistr/u32-strncmp: New file.
+ * lib/unistr/u8-strncmp.c: New file.
+ * lib/unistr/u16-strncmp.c: New file.
+ * lib/unistr/u32-strncmp.c: New file.
+
+ * modules/unistr/u8-strncpy: New file.
+ * modules/unistr/u16-strncpy: New file.
+ * modules/unistr/u32-strncpy: New file.
+ * lib/unistr/u8-strncpy.c: New file.
+ * lib/unistr/u16-strncpy.c: New file.
+ * lib/unistr/u32-strncpy.c: New file.
+ * lib/unistr/u-strncpy.h: New file.
+
+ * modules/unistr/u8-strnlen: New file.
+ * modules/unistr/u16-strnlen: New file.
+ * modules/unistr/u32-strnlen: New file.
+ * lib/unistr/u8-strnlen.c: New file.
+ * lib/unistr/u16-strnlen.c: New file.
+ * lib/unistr/u32-strnlen.c: New file.
+ * lib/unistr/u-strnlen.h: New file.
+
+ * modules/unistr/u8-strpbrk: New file.
+ * modules/unistr/u16-strpbrk: New file.
+ * modules/unistr/u32-strpbrk: New file.
+ * lib/unistr/u8-strpbrk.c: New file.
+ * lib/unistr/u16-strpbrk.c: New file.
+ * lib/unistr/u32-strpbrk.c: New file.
+ * lib/unistr/u-strpbrk.h: New file.
+
+ * modules/unistr/u8-strrchr: New file.
+ * modules/unistr/u16-strrchr: New file.
+ * modules/unistr/u32-strrchr: New file.
+ * lib/unistr/u8-strrchr.c: New file.
+ * lib/unistr/u16-strrchr.c: New file.
+ * lib/unistr/u32-strrchr.c: New file.
+
+ * modules/unistr/u8-strspn: New file.
+ * modules/unistr/u16-strspn: New file.
+ * modules/unistr/u32-strspn: New file.
+ * lib/unistr/u8-strspn.c: New file.
+ * lib/unistr/u16-strspn.c: New file.
+ * lib/unistr/u32-strspn.c: New file.
+ * lib/unistr/u-strspn.h: New file.
+
+ * modules/unistr/u8-strstr: New file.
+ * modules/unistr/u16-strstr: New file.
+ * modules/unistr/u32-strstr: New file.
+ * lib/unistr/u8-strstr.c: New file.
+ * lib/unistr/u16-strstr.c: New file.
+ * lib/unistr/u32-strstr.c: New file.
+ * lib/unistr/u-strstr.h: New file.
+
+ * modules/unistr/u8-strtok: New file.
+ * modules/unistr/u16-strtok: New file.
+ * modules/unistr/u32-strtok: New file.
+ * lib/unistr/u8-strtok.c: New file.
+ * lib/unistr/u16-strtok.c: New file.
+ * lib/unistr/u32-strtok.c: New file.
+ * lib/unistr/u-strtok.h: New file.
+
+ * modules/unistr/u8-uctomb: New file.
+ * modules/unistr/u16-uctomb: New file.
+ * modules/unistr/u32-uctomb: New file.
+ * lib/unistr/u8-uctomb.c: New file.
+ * lib/unistr/u16-uctomb.c: New file.
+ * lib/unistr/u32-uctomb.c: New file.
+
+ * MODULES.html.sh (Unicode string functions): Add the new modules.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_all_modules): Use find, not ls, to traverse the
+ modules directory. Filter out CVS, ChangeLog, COPYING, README also from
+ subdirectories.
+
+2007-01-08 Karl Berry <karl@gnu.org>
+
+ * doc/error.texi: mention that main() fns must set program_name
+ when progname is used.
+
+2007-01-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/wctype.m4 (gl_WCTYPE_H): Compute ABSOLUTE_WCTYPE_H even if
+ WCTYPE_H is empty, for the benefit of builds from non-distclean
+ directories. Problem reported by Eric Blake in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-01/msg00157.html>.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/canonicalize.m4 (AC_FUNC_CANONICALIZE_FILE_NAME): Remove
+ PROVIDE_CANONICALIZE_FILENAME_MODE macro definition.
+ * lib/canonicalize.h: Test GNULIB_CANONICALIZE instead of
+ PROVIDE_CANONICALIZE_FILENAME_MODE.
+ * modules/canonicalize (configure.ac): Use gl_MODULE_INDICATOR.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/fts.m4 (gl_FUNC_FTS_LGPL): Remove _LGPL_PACKAGE macro definition.
+ * lib/fts_.h (_LGPL_PACKAGE): Remove macro.
+ Use !GNULIB_FTS instead of _LGPL_PACKAGE.
+ * lib/fts.c: Likewise.
+ * modules/fts (configure.ac): Use gl_MODULE_INDICATOR.
+
+2006-12-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/utf8-ucs4-safe: New file.
+ * lib/utf8-ucs4-safe.h: New file.
+ * lib/unistr/utf8-ucs4-safe.c: New file.
+
+ * modules/utf16-ucs4-safe: New file.
+ * lib/utf16-ucs4-safe.h: New file.
+ * lib/unistr/utf16-ucs4-safe.c: New file.
+
+ * MODULES.html.sh (Unicode string functions): Add the new modules.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/utf8-ucs4 (Files, lib_SOURCES): Add unistr/utf8-ucs4.c.
+ (Depends-on): Add unitypes.
+ * lib/utf8-ucs4.h: Add double-inclusion guard. Include unitypes.h.
+ (u8_mbtouc_aux): Move out to separate file.
+ (u8_mbtouc): Use ucs4_t, uint8_t types.
+ * lib/unistr/utf8-ucs4.c: New file.
+
+ * modules/utf16-ucs4 (Files, lib_SOURCES): Add unistr/utf16-ucs4.c.
+ (Depends-on): Add unitypes.
+ * lib/utf16-ucs4.h: Add double-inclusion guard. Include unitypes.h.
+ (u16_mbtouc_aux): Move out to separate file.
+ (u16_mbtouc): Use ucs4_t, uint16_t types.
+ * lib/unistr/utf16-ucs4.c: New file.
+
+ * modules/ucs4-utf8 (Files, lib_SOURCES): Add unistr/ucs4-utf8.c.
+ (Depends-on): Add unitypes.
+ * lib/ucs4-utf8.h: Add double-inclusion guard. Include unitypes.h.
+ (u8_uctomb_aux): Move out to separate file.
+ (u8_uctomb): Use ucs4_t, uint8_t types.
+ * lib/unistr/ucs4-utf8.c: New file.
+
+ * modules/ucs4-utf16 (Files, lib_SOURCES): Add unistr/ucs4-utf16.c.
+ (Depends-on): Add unitypes.
+ * lib/ucs4-utf16.h: Add double-inclusion guard. Include unitypes.h.
+ (u16_uctomb_aux): Move out to separate file.
+ (u16_uctomb): Use ucs4_t, uint16_t types.
+ * lib/unistr/ucs4-utf16.c: New file.
+
+2006-12-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/unitypes: New file.
+ * lib/unitypes.h: New file.
+ * MODULES.html.sh (func_all_modules): New section "Unicode string
+ functions". Move ucs4-utf8, ucs4-utf16, utf8-ucs4, utf16-ucs4 to
+ this section. Add unitypes.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ Avoid variable names that conflict with those from libtool.
+ * m4/lib-link.m4 (AC_LIB_RPATH, AC_LIB_LINKFLAGS_BODY,
+ AC_LIB_LINKFLAGS_FROM_LIBS): Rename libext to acl_libext,
+ shlibext to acl_shlibext, libname_spec to acl_libname_spec,
+ library_names_spec to acl_library_names_spec, hardcode_* to
+ acl_hardcode_*.
+ Reported by Ralf Wildenhues.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/gc-arcfour.m4 (gl_GC_ARCFOUR): Remove GC_USE_ARCFOUR macro
+ definition.
+ * m4/gc-arctwo.m4 (gl_GC_ARCTWO): Remove GC_USE_ARCTWO macro
+ definition.
+ * m4/gc-des.m4 (gl_GC_DES): Remove GC_USE_DES macro definition.
+ * m4/gc-hmac-md5.m4 (gl_GC_HMAC_MD5): Remove GC_USE_HMAC_MD5 macro
+ definition.
+ * m4/gc-hmac-sha1.m4 (gl_GC_HMAC_SHA1): Remove GC_USE_HMAC_SHA1 macro
+ definition.
+ * m4/gc-md2.m4 (gl_GC_MD2): Remove GC_USE_MD2 macro definition.
+ * m4/gc-md4.m4 (gl_GC_MD4): Remove GC_USE_MD4 macro definition.
+ * m4/gc-md5.m4 (gl_GC_MD5): Remove GC_USE_MD5 macro definition.
+ * m4/gc-random.m4 (gl_GC_RANDOM): Remove GC_USE_RANDOM macro
+ definition.
+ * m4/gc-rijndael.m4 (gl_GC_RIJNDAEL): Remove GC_USE_RIJNDAEL macro
+ definition.
+ * m4/gc-sha1.m4 (gl_GC_SHA1): Remove GC_USE_SHA1 macro definition.
+ * lib/gc-gnulib.c: Use GNULIB_GC_<algorithm> instead of
+ GC_USE_<algorithm>.
+ * lib/gc-libgcrypt.c: Likewise.
+ * modules/gc-arcfour (configure.ac): Use gl_MODULE_INDICATOR.
+ * modules/gc-arctwo (configure.ac): Likewise.
+ * modules/gc-des (configure.ac): Likewise.
+ * modules/gc-hmac-md5 (configure.ac): Likewise.
+ * modules/gc-hmac-sha1 (configure.ac): Likewise.
+ * modules/gc-md2 (configure.ac): Likewise.
+ * modules/gc-md4 (configure.ac): Likewise.
+ * modules/gc-md5 (configure.ac): Likewise.
+ * modules/gc-random (configure.ac): Likewise.
+ * modules/gc-rijndael (configure.ac): Likewise.
+ * modules/gc-sha1 (configure.ac): Likewise.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/close-stream.m4 (gl_CLOSE_STREAM): Remove GNULIB_CLOSE_STREAM
+ macro definition.
+ * m4/fcntl-safer.m4 (gl_FCNTL_SAFER): Remove GNULIB_FCNTL_SAFER macro
+ definition.
+ * m4/stdio-safer.m4 (gl_FOPEN_SAFER): Remove GNULIB_FOPEN_SAFER macro
+ definition.
+ * modules/close-stream (configure.ac): Invoke gl_MODULE_INDICATOR.
+ * modules/fcntl-safer (configure.ac): Likewise.
+ * modules/fopen-safer (configure.ac): Likewise.
+ * modules/fwriteerror (configure.ac): Likewise. Remove explicit
+ GNULIB_FWRITEERROR macro definition.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/gnulib-common.m4: New file.
+ * gnulib-tool (func_get_autoconf_snippet): Undo last change.
+ (func_get_filelist): Add m4/gnulib-common.m4.
+
+2007-01-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Simplify the sorting
+ command.
+
+2007-01-08 Jim Meyering <jim@meyering.net>
+
+ Use a more robust test for a "can't happen" condition.
+ * lib/fts.c (fts_read): Revert the change of 2006-11-22, since it
+ narrowed the st_size value. Presuming the "can't happen" condition
+ is true, that narrowing could conceivably convert an invalid st_size
+ value into a valid one. Instead, use a change based on Matthew
+ Woehlke's original patch.
+
+ Slight readability improvement: use an assert-like macro
+ in place of literal "abort ()" uses.
+ * lib/fts.c (fts_assert): Define.
+ (fts_set_stat_required, cwd_advance_fd, fts_read, fd_ring_check):
+ Use this macro instead of a bare 'abort'.
+
+2007-01-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ Don't worry about using IRIX 5.3's wctype.h broken definitions;
+ simply work around them.
+ * lib/wctype_.h: Remove test for HAVE_WCTYPE_CTMP_BUG.
+ (iswalnum, iswalpha, iswblank, iswcntrl, iswdigit, iswgraph, iswlower):
+ (iswprint, iswpunct, iswspace, iswupper, iswxdigit): Undef before
+ declaring.
+ Don't bother to define as macros, since the standard doesn't require it.
+ * m4/wctype.m4 (WCTYPE_H, ABSOLUTE_WCTYPE_H): Simplify, since we no
+ longer worry about IRIX 5.3.
+ (HAVE_WCTYPE_CTMP_BUG): Remove.
+
+2007-01-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/wctype_.h (_ctmp_) [HAVE_WCTYPE_CTMP_BUG]: Now of type wchar_t,
+ not wint_t. Also, include <ctype.h>, to fix another IRIX bug.
+ * m4/wctype.m4 (gl_WCTYPE_H): Likewise.
+ Problems reported by Georg Schwarz for IRIX 5.3.
+
+ * gnulib-tool (autoconf_minversion): Take the maximum version number
+ found, not the minimum. Problem reported by James Youngman.
+
+2007-01-03 Karl Berry <karl@gnu.org>
+
+ * doc/error.texi: new file, explaining interaction with progname.
+ * doc/gnulib.texi: include it. Update copyright.
+
+2007-01-03 Simon Josefsson <simon@josefsson.org>
+
+ * gnulib-tool (func_create_testdir): Run AC_CANONICAL_BUILD and
+ AC_CANONICAL_HOST, to improve autobuild outputs.
+
+2007-01-03 Paolo Bonzini <bonzini@gnu.org>
+ Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * lib/poll.c (poll): Use recv on Mac OS X to distinguish connected
+ sockets, server sockets, and other file descriptors. Count errors
+ to compute the return value. Reorder the code a bit to be easier
+ to follow. Don't set event bits that were not requested (except
+ POLLERR and POLLHUP).
+
+2007-01-01 Bruno Haible <bruno@clisp.org>
+
+ * modules/lchmod (Include): Require lchmod.h, not lchown.h.
+
+2007-01-03 Jim Meyering <jim@meyering.net>
+
+ * modules/fts-lgpl (Depends-on): Add i-ring. Reported by Bruno Haible.
+
+2007-01-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/settime (Include): Require timespec.h.
+ * modules/nanosleep (Include): Likewise.
+
+2007-01-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_copyright_notice): Bump year.
+ (func_get_autoconf_snippet): Emit a GNULIB_<modulename> macro.
+
+2007-01-01 Bruno Haible <bruno@clisp.org>
+
+ Improve support for OpenBSD.
+ * build-aux/config.rpath (libname_spec): Export.
+ (library_names_spec): New variable. Export.
+ * m4/lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Extract libname_spec and
+ library_names_spec from the config.rpath output. Locate shared library
+ through the name pattern in library_names_spec.
+
+2007-01-01 Eric Blake <ebb9@byu.net>
+
+ * lib/version-etc.c (COPYRIGHT_YEAR): Bump for new year.
+
+2006-12-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool (SORT): Remove, since we no longer assume GNU sort.
+ Rewrite so as not to assume GNU sort or "tail -1". Also, don't
+ assume the C locale, and avoid an "eval" that could cause trouble.
+ Problem with SORT reported by Bob Proulx.
+
+ * lib/getpagesize.h (getpagesize) [defined __amigaos4__]:
+ Define. Trivial patch from Henning Nielsen Lund, originally
+ sent to bug-grep@gnu.org today.
+
+2006-12-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/acl.h: Include sys/types.h and sys/stat.h, for mode_t and
+ struct stat. Problem reported by Henning Nielsen Lund.
+ * lib/acl.c: Include acl.h first, to check interface. Don't
+ bother to include sys/types.h and sys/stat.h again.
+
+2006-12-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ Import the following change from libc; problem reported by
+ Sven Verdoolaege.
+
+ 2005-10-13 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #1373]
+ * lib/argp.h: Remove __NTH for __argp_usage inline function.
+
+2006-12-28 Jim Meyering <jim@meyering.net>
+
+ * build-aux/announce-gen: Do not assume that the package
+ builds any of tar.gz, tar.bz2, and .xdelta files.
+ Suggestion from Simon Josefsson.
+
+2006-12-28 Simon Josefsson <simon@josefsson.org>
+
+ * modules/announce-gen: New file.
+
+2006-12-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mbchar.h: Just include <wctype.h>; the wctype module
+ handles its gotchas now.
+ * lib/mbswidth.c: Likewise.
+ * lib/wcwidth.h: Likewise.
+ * m4/mbchar.m4 (gl_MBCHAR): Don't bother checking for wctype.h
+ and iswcntrl; the wctype module does this stuff now.
+ * m4/mbswidth.m4 (gl_MBSWIDTH): Likewise.
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Likewise.
+ * modules/mbchar (Depends-on): Add wctype.
+ * modules/mbswidth (Depends-on): Likewise.
+ * modules/wcwidth (Depends-on): Likewise.
+
+2006-12-27 Eric Blake <ebb9@byu.net>
+
+ * lib/fnmatch.c: Reinstate inclusion of <wchar.h>, since this
+ module uses more than what <wctype.h> is required to provide.
+
+2006-12-26 Eric Blake <ebb9@byu.net>
+
+ * gnulib-tool (sed_extract_prog): Avoid space-tab.
+
+2006-12-26 Eric Blake <ebb9@byu.net>
+
+ * modules/absolute-header: New module.
+ * modules/fcntl (Depends-on): Depend on it.
+ * modules/inttypes (Depends-on): Likewise.
+ * modules/stdint (Depends-on): Likewise.
+ * modules/sys_stat (Depends-on): Likewise.
+ * modules/wctype (Depends-on): Likewise.
+ * MODULES.html.sh (Support for building libraries and
+ executables): Document it.
+
+2006-12-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool (SED): Remove, undoing previous change.
+ The problem was that it broke coreutils on Solaris, because
+ "sed --posix" leaked into a makefile.
+ (sed): New alias, if 'alias' and GNU sed.
+
+2006-12-24 Jim Meyering <jim@meyering.net>
+
+ Work around an fchownat bug in glibc-2.4:
+ http://lists.ubuntu.com/archives/ubuntu-users/2006-September/093218.html
+ This bug would cause "chown -RP ... DIR" to follow symlinks in DIR,
+ in spite of the -P option.
+ * m4/openat.m4 (gl_FUNC_FCHOWNAT, gl_FUNC_FCHOWNAT_DEREF_BUG):
+ New macros.
+ (gl_PREREQ_OPENAT): Require gl_FUNC_FCHOWNAT.
+ * modules/openat (Files): Add lib/fchownat.c.
+ * lib/openat.c (fchownat): Don't define here. Move to...
+ * lib/fchownat.c: ...this new file.
+
+2006-12-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix bug reported by Bruno Haible in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-12/msg00228.html>
+ where quotearg.c didn't compile on Mac OS X 10.2 because it
+ lacks <wchar.h> and wint_t.
+ * lib/wctype_.h (__wctype_wint_t): New type.
+ Include <stdio.h>, <time.h>, <wchar.h> only if HAVE_WINT_T.
+ (iswalnum, iswalpha, iswblank, iswcntrl, iswdigit, iswgraph):
+ (iswlower, iswprint, iswpunct, iswspace, iswupper, ixwxdigit):
+ Arg is now of type __wctype_wint_t, not wint_t.
+ * m4/wctype.m4 (gl_WCTYPE_H): Require gt_TYPE_WINT_T, and
+ substitute HAVE_WINT_T.
+ * modules/wctype (Files): Add m4/wint_t.m4.
+ (wctype.h): Substitute HAVE_WINT_T.
+
+2006-12-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/safe-read.h [C++]: Wrap declarations in extern "C".
+
+2006-12-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/canonicalize-lgpl.c (__realpath): Test HAVE_READLINK instead of
+ S_ISLNK.
+ Needed because gnulib's sys/stat.h replacement defines S_ISLNK on
+ mingw.
+
+2006-12-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-file.c: Include acl.h.
+ (copy_file_preserving) [USE_ACL]: Use copy_acl instead of chmod.
+ Close the file descriptors only after being done with copy_acl.
+ * modules/copy-file (Depends-on): Add acl.
+
+2006-12-22 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (SED): New variable.
+ Use $SED instead of sed everywhere.
+
+2006-12-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/no-c++: New file.
+ * m4/no-c++.m4: New file.
+ * MODULES.html.sh (Support for building libraries and executables):
+ Add no-c++.
+
+2006-12-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/mktime.m4 (AC_FUNC_MKTIME): Sync from Autoconf.
+ Include <limits.h>, and use its INT_MAX to rewrite the
+ j loop so that it does not overflow 'int'. Problem reported by
+ Ralf Wildenhues in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-12/msg00084.html>.
+ Play it safe by shifting left by 1 rather than multiplying by 2,
+ as GCC is less likely to optimize this away when the value
+ is signed (when it assumes overflow leads to undefined behavior).
+ Also, don't assume time_t uses two's complement.
+
+2006-12-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh: New module wctype.
+ * lib/wctype_.h, m4/wctype.m4, modules/wctype: New files.
+ * lib/fnmatch.c: Don't bother to include <wchar.h> before
+ <wctype.h>, since the new wctype module should fix this.
+ * lib/quotearg.c: Include <wctype.h> unconditionally, since
+ the wctype module should arrange for it.
+ * lib/regex_internal.h: Likewise.
+ * m4/quotearg.m4 (gl_QUOTEARG): Don't check for wctype.h or iswprint,
+ since the wctype module should handle this now.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Don't check for wctype.h.
+ * modules/fnmatch (Depends-on): Add wctype.
+ * modules/quotearg (Depends-on): Likewise.
+ * modules/regex (Depends-on): Likewise.
+
+2006-12-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/strdup.h [C++]: Wrap definitions in extern "C".
+ Suggested by Lorenzo Bettini <bettini@dsi.unifi.it>.
+
+2006-12-19 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/savewd (Depends-on): Fix dependency on fcntl.
+
+2006-12-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stdint.m4 (gl_STDINT_H): Set STDINT_H to empty if stdint.h
+ conforms to C99, rather than relying on the user's environment
+ setting of STDINT_H.
+
+2006-12-18 Paul Eggert <eggert@cs.ucla.edu>
+ and Eric Blake <ebb9@byu.net>
+
+ * lib/dirname.h (DOUBLE_SLASH_IS_DISTINCT_ROOT): Default to 0, not 1.
+ This is more consistent with the other defines here.
+ * m4/double-slash-root.m4 (gl_DOUBLE_SLASH_ROOT):
+ Port to z/OS. Problem reported by Paul Gilmartin.
+ Change local vars to use gl_ prefix rather than ac_.
+ Don't define DOUBLE_SLASH_IS_DISTINCT_ROOT to 0, for consistency
+ with other defines.
+ * modules/double-slash-root: New module.
+ * modules/dirname (Files): Remove m4/double-slash-root.m4.
+ (Depends-on): Add double-slash-root.
+ * MODULES.html.sh (File system functions): Mention new module.
+
+2006-12-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/yesno.c [!ENABLE_NLS]: Don't include getline.h.
+ (yesno) [!ENABLE_NLS]: Don't invoke getline or rpmatch.
+ This is for the benefit of gzip, which doesn't do i18n.
+
+2006-12-12 Jim Meyering <jim@meyering.net>
+
+ * m4/acl.m4 (gl_ACL_GET_FILE): Fix logic error.
+ Reported by Andreas Schwab <schwab@suse.de>.
+
+2006-12-12 Bruno Haible <bruno@clisp.org>
+
+ Merge these changes.
+ 2006-09-05 Bruno Haible <bruno@clisp.org>
+ * lib/iconvme.c (iconv_string): No need to save and restore errno when
+ iconv_alloc succeeded.
+ (iconv_alloc): Don't assume that malloc() or realloc(), when failing,
+ sets errno to ENOMEM. (malloc on GNU/kFreeBSD doesn't.) No need to
+ test for " && dest " at the end - dest is always != NULL there. Call
+ iconv with 4xNULL arguments initially, to reset the state. Call iconv
+ with 2xNULL arguments, also to flush the state storage. Handle the
+ IRIX iconv behaviour. Realloc the final result, to throw away unused
+ memory.
+
+2006-12-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/openat.m4 (gl_FUNC_OPENAT): Don't compile mkdirat
+ and fchmodat unconditionally, since glibc 2.4 has them.
+ Problem reported by Arkadiusz Miskiewicz.
+
+2006-12-10 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Show the include files only for those
+ modules that are copied and specified.
+ Reported by Karl Berry.
+
+2006-12-08 Jim Meyering <jim@meyering.net>
+
+ * build-aux/announce-gen ($VERSION): Don't use of $Revision...$.
+ Instead, use Emacs' time-stamp write hook. Note that the time is UTC.
+
+ * build-aux/announce-gen: Add two new options, both optional:
+ --bootstrap-tools=TOOL_LIST
+ a comma-separated list of tools, e.g.,
+ autoconf,automake,bison,gnulib
+ --gnulib-snapshot-date=DATE
+ if gnulib is in the bootstrap tool list,
+ then report this as the snapshot date.
+ If not specified, use the current date/time.
+ If you specify a date here, be sure it's UTC.
+
+2006-12-05 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * tests/test-argp-2.sh: Fix test to match actual output.
+ (func_compare): Fix sed script to be portable.
+
+2006-12-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a
+ workaround for this case. It is not autoconfigured now; offhand
+ it's hard to see how to autoconfigure it.
+
+2006-12-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mkdir-p.c (make_dir_parents): Fix race condition when making
+ a directory that is about to be chowned. Such a directory's
+ initial file permissions should permit the owner only and this
+ should not be changed until after the chown, since the group and
+ other bits would be incorrect if they granted permission before
+ the chown.
+
+ Fix porting problem for iswctype reported by Georg Schwarz in:
+ http://lists.gnu.org/archive/html/bug-coreutils/2006-12/msg00017.html
+ * lib/fnmatch.c (WIDE_CHAR_SUPPORT): Require HAVE_ISWCTYPE, too.
+ * lib/regex_internal.h (RE_ENABLE_I18N): Likewise.
+ * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Check for iswctype, too.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Likewise.
+
+2006-12-03 Jim Meyering <jim@meyering.net>
+
+ * lib/fts.c (fts_load): Don't set sp->fts_dev here, since
+ p->fts_statp may not yet be defined.
+ (fts_read): Instead, set it in the caller, once p->fts_statp is
+ sure to be defined, and corresponds to a top-level directory.
+ This bug made du -x fail. Here's the coreutils test case:
+ http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=commit;h=ba45154d8e9f
+ Reported by Mike Frysinger.
+
+2006-12-01 Jim Meyering <jim@meyering.net>
+
+ * modules/savewd (Depends-on): Add fcntl_h to avoid self-test
+ build failure due to missing definition of HAVE_WORKING_O_NOFOLLOW.
+ Reported by Simon Josefsson.
+
+2006-11-30 Jim Meyering <jim@meyering.net>
+
+ * m4/warning.m4: Use the all-permissive copyright notice
+ recommended by RMS (rather than LGPL).
+ * m4/vararrays.m4: Likewise.
+ * m4/flexmember.m4: Likewise.
+
+2006-11-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Initialize also
+ noinst_LIBRARIES. Augment noinst_LIBRARIES and noinst_LTLIBRARIES
+ using +=.
+ Reported by Simon Josefsson <simon@josefsson.org>.
+
+2006-11-28 James Youngman <jay@gnu.org>
+
+ * README: Advise users that they might find the bug-gnulib@gnu.org
+ and autotools-announce@gnu.org mailing lists useful.
+
+2006-11-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/ptrdiff_max.m4: Remove file.
+
+2006-11-21 Bruno Haible <bruno@clisp.org>
+
+ * m4/eoverflow.m4 (gl_EOVERFLOW): Use AC_COMPUTE_INT instead of
+ _AC_COMPUTE_INT.
+ (AC_COMPUTE_INT): Add fallback definition for autoconf < 2.61.
+ * m4/ptrdiff_max.m4 (gl_PTRDIFF_MAX): Use AC_COMPUTE_INT instead of
+ _AC_COMPUTE_INT.
+ (AC_COMPUTE_INT): Add fallback definition for autoconf < 2.61.
+ * m4/size_max.m4 (gl_SIZE_MAX): Use AC_COMPUTE_INT instead of
+ _AC_COMPUTE_INT.
+ (AC_COMPUTE_INT): Add fallback definition for autoconf < 2.61.
+
+2006-11-28 Jim Meyering <jim@meyering.net>
+
+ * lib/regcomp.c (parse_branch): Rename local, exp->expr, to avoid
+ warning from "gcc -Wshadow" about shadowing the builtin.
+
+2006-11-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_BITSIZEOF): Use AC_COMPUTE_INT instead of
+ _AC_COMPUTE_INT.
+ (AC_COMPUTE_INT): Add fallback definition for autoconf < 2.61.
+
+2006-11-27 Bruno Haible <bruno@clisp.org>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex.h (__restrict_arr): Redo logic of #if, for clarity.
+
+2006-11-26 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Initialize also
+ noinst_LTLIBRARIES.
+
+2006-11-27 Paul Eggert <eggert@cs.ucla.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/gettext.h (_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS): Define to 0
+ if compiling with "gcc -ansi".
+
+2006-11-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix some incompatibilities with gcc -ansi -pedantic.
+ * lib/regex.h (__restrict_arr): Don't use the [restrict] syntax
+ if compiling pedantically with GCC, unless it's C99 or later.
+ Don't trust sys/cdefs.h's definition of __restrict_arr, either, as
+ it mishandles gcc -ansi -pedantic as well.
+ * lib/regex_internal.h (re_token_t): Don't use enum bitfields
+ if gcc -pedantic.
+ * lib/regexec.c (check_node_accept_bytes): Don't use auto
+ initializers for struct if -pedantic, unless it's C99 or later.
+
+2006-11-25 Nix <nix@esperi.org.uk> (tiny change)
+
+ * m4/fcntl_h.m4 (gl_FCNTL_H): Test the atime, not the mtime.
+ Don't close an fd more than once. Identical atimes indicate
+ success, not failure.
+
+2006-11-22 Robinson Mittmann <bob@hoplon.com> (tiny change)
+
+ * lib/sincosl.c (kernel_sinl): Fix typo in threshold.
+
+2006-11-23 Jim Meyering <jim@meyering.net>
+
+ * build-aux/announce-gen: New file. From coreutils.
+
+2006-11-22 Jim Meyering <jim@meyering.net>
+
+ Work around a compile-time error from the HP-UX 11.00 /bin/cc.
+ * lib/fts.c (enum Fts_stat): Give this previously-anon enum a name.
+ (fts_read): Use a temporary to narrow the overused st_size member
+ before using it in a switch statement. Reported by Matthew Woehlke.
+
+ * m4/clock_time.m4 (gl_CLOCK_TIME): Quote AC_SUBST argument.
+ * m4/euidaccess.m4 (gl_PREREQ_EUIDACCESS): Likewise.
+
+2006-11-20 Bruno Haible <bruno@clisp.org>
+
+ * gettext.m4 (AM_GNU_GETTEXT): Revert 2005-07-28 patch: Use
+ changequote instead of pairs of brackets.
+ Reported by Andreas Schwab <schwab@suse.de>.
+
+2006-11-21 Jim Meyering <jim@meyering.net>
+
+ * lib/fts.c (fts_safe_changedir): Move a declaration "up",
+ so as to remain compatible with older compilers.
+ Patch from Michael Deutschmann.
+
+2006-11-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (File system functions): Add openat.
+
+ * lib/openat.h (rpl_fstatat): New macro, if
+ [HAVE_OPENAT && ! LSTAT_FOLLOWS_SLASHED_SYMLINK.
+ (fstatat): Define to rpl_fstatat under the same conditions,
+ unless COMPILING_FSTATAT.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Compile fstatat.c too, if fstatat
+ seems to have the bug.
+ * lib/fstatat.c: New file.
+ * modules/openat (Files): Add it.
+
+2006-11-20 Bruno Haible <bruno@clisp.org>
+
+ * Makefile: New file.
+
+2006-11-20 Jim Meyering <jim@meyering.net>
+
+ The beginnings of syntax-related checks for gnulib.
+ * lib/Makefile: New file.
+ * lib/t-idcache: New script. Ensure that the two halves of
+ idcache.c stay in sync.
+
+ * lib/idcache.c: Adjust comments in user- and group- portions to
+ be more accurate, and to be consistent with one another.
+
+2006-11-20 Jim Meyering <jim@meyering.net>
+
+ * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
+ continue using the flexible array member (thus, this module performs
+ half as many malloc calls), with the addition that...
+ (getgroup, getuser): Consistently record a non-match via an empty
+ "name" string, and map an empty string match to a NULL return value.
+ * modules/idcache (Depends-on): Re-add flexmember.
+
+ * lib/idcache.c (getuser): Remove all uses of the register keyword.
+ (getuidbyname, getgroup, getgidbyname): Likewise.
+
+ Use cleaner syntax: NULL rather than 0.
+ * lib/idcache.c (getuidbyname, getgidbyname): Return NULL, not 0.
+
+2006-11-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/idcache.c: Undo most recent patch, dated 2006-11-06.
+ It mishandled the case where the group was missing.
+ Problem reported by Greg Schafer.
+ * modules/idcache: Likewise.
+
+2006-11-18 Jim Meyering <jim@meyering.net>
+
+ * check-module (%exempt_header): Add exception for some
+ conditionally-included headers.
+
+ * modules/i-ring (Depends-on): Add verify.
+ (License): Change to LGPL.
+
+2006-11-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/getaddinfo (Depends-on): Remove inttostr; add snprintf.
+ * lib/getaddrinfo.c: Include snprintf.h rather than intprops.h
+ and inttostr.h. Use snprintf rather than uinttostr, so that
+ LGPLed code doesn't depend on GPLed.
+
+2006-11-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/inline (License): Change from GPL to LGPL.
+
+2006-11-17 Jim Meyering <jim@meyering.net>
+
+ * modules/d-type (License): Switch to LGPL.
+
+2006-11-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/alloca.m4 (gl_FUNC_ALLOCA): Fix the AC_CACHE_CHECK message.
+
+2006-11-15 Eric Blake <ebb9@byu.net>
+
+ * m4/allocsa.m4 (gl_ALLOCSA): Don't invoke macro already picked up by
+ the module dependency.
+
+2006-11-15 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Add license consistency check.
+
+2006-11-15 Eric Blake <ebb9@byu.net>
+
+ * m4/alloca.m4 (gl_FUNC_ALLOCA): Use AC_CACHE_CHECK to avoid a
+ random "(cached)" in configure output.
+
+2006-11-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/inttypes.m4 (gl_INTTYPES_H): Use AC_CACHE_CHECK so that the
+ test for conforming inttypes.h is both announced and cached.
+
+ * MODULES.html.sh (seen_modules, seen_files): New variables.
+ (func_module): Rewrite to use a few less gnulib-tool and sed
+ invocations. Avoid a couple of quadratic algorithms for ...
+ (missed_modules, missed_files): ... these, with ...
+ (func_append, func_tmpdir): ... these new functions, from
+ gnulib-tool. Analogously, install traps for cleanup.
+
+ * tests/test-gc.c (main): Remove unused variables.
+ * tests/test-read-file.c: Include stdlib.h, for 'free'.
+
+2006-11-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/inttostr (License): Change to LGPL.
+
+2006-11-14 Eric Blake <ebb9@byu.net>
+
+ * modules/tempname (License): Change to LGPL.
+
+2006-11-14 Eric Blake <ebb9@byu.net>
+
+ * doc/functions.texi (Function Portability): *printf functions on
+ Cygwin now understand all POSIX size specifiers.
+
+2006-11-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/c-ctype (License): Change to LGPL.
+
+2006-11-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/lib-link.m4 (AC_LIB_LINKFLAGS, AC_LIB_HAVE_LINKFLAGS,
+ AC_LIB_LINKFLAGS_BODY): Also set a LIB${NAME}_PREFIX variable. Needed
+ for GNOME libraries, for which the include files are installed in
+ subdirectories of $prefix/include.
+
+2006-11-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/lib-link.m4: Require at least autoconf-2.54.
+ (AC_LIB_LINKFLAGS_BODY) [autoconf < 2.61]: Turn dots into the library
+ name to underscores for the --with option.
+
+2006-11-13 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Set gl_source_base correctly in
+ the tests directory.
+ Reported by Ralf Wildenhues.
+
+2006-11-13 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_initmacro_start): Also override AC_LIBSOURCES.
+ (func_emit_initmacro_end): Undo the override here.
+ (func_emit_initmacro_done): Emit a definition for gl_LIBSOURCES.
+ Works around the famous automake error in coreutils.
+
+2006-11-13 Eric Blake <ebb9@byu.net>
+
+ * lib/gl_anytree_oset.h (gl_tree_search_atleast): Return the
+ element, not its node.
+
+2006-11-12 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Replace occurrences of
+ '$(top_srcdir)/build-aux/', taking into account the real auxdir.
+
+2006-11-12 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: New option --local-symlink.
+ (func_usage): Document it.
+ (lsymbolic): New variable.
+ (func_import, func_create_testdir): If --symlink was not specified,
+ test whether --local-symlink was specified and the file comes from
+ the local_gnulib_dir.
+
+2006-11-12 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_ln): New function.
+ (func_ln_if_changed, func_create_testdir): Use it instead of "ln -s".
+
+2006-11-12 Bruno Haible <bruno@clisp.org>
+
+ Finish support for source files in subdirectories.
+ * gnulib-tool (func_emit_lib_Makefile_am): If some of the source files
+ are in subdirectories, set uses_subdirs and add 'subdir-objects' to
+ AUTOMAKE_OPTIONS.
+ (func_import, func_create_testdir): Invoke AM_PROG_CC_C_O in this case.
+
+2006-11-12 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_automake_snippet): Synthesize also an
+ EXTRA_lib_SOURCES augmentation.
+ (func_emit_lib_Makefile_am): Initialize EXTRA_lib..._SOURCES to empty.
+
+2006-11-12 Jim Meyering <jim@meyering.net>
+
+ Make fts (in FTS_CWDFD mode) more efficient by caching a few open
+ file descriptors. This also averts a failure on systems with
+ native openat support when a traversed directory lacks "x" access.
+ * lib/fts_.h: Include "i-ring.h"
+ (struct FTS) [fts_fd_ring]: New member.
+ * lib/fts.c (RESTORE_INITIAL_CWD): Also call fd_ring_clear.
+ (FCHDIR): Add parentheses.
+ (fd_ring_check, fd_ring_print) [!FTS_DEBUG]: Define away.
+ (cwd_advance_fd): Add a 3rd parameter. Adjust all callers.
+ When descending, rather than simply closing the previous
+ fts_cwd_fd value, push that file descriptor onto the ring.
+ (same_fd, fd_ring_print, fd_ring_check) [FTS_DEBUG]: New functions.
+ (fts_open): Initialize the new fd_ring member.
+ (fts_close): Clear the ring.
+ (fts_safe_changedir): When possible, use our new fd_ring to skip
+ the diropen and fstat and dev/ino comparison that would normally
+ accompany a virtual `chdir ("..")'.
+
+ * modules/fts (Depends-on): Add i-ring.
+ * modules/i-ring: New module.
+ * lib/i-ring.c, lib/i-ring.h, lib/i-ring-test.c: New files.
+ * m4/i-ring.m4: New file.
+
+2006-11-12 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_create_testdir): Fix replacement of
+ `build-aux' in configure.ac. Run autotools in gltests
+ subdirectory.
+ (func_create_testdir, func_create_megatestdir, test): There is
+ no need for '--force' in most autotool invocations in a new
+ tree. Actually fail the whole test if any of the tools, or the
+ configure or make stages fail.
+
+ Sync from Automake.
+ * build-aux/gnupload: Revert last change. Add pointer to upload
+ instructions of the GNU Maintenance Instructions.
+ Suggestion by Karl Berry.
+
+2006-11-10 Jim Meyering <jim@meyering.net>
+
+ * lib/fts.c [FTS_DEBUG]: Don't try to print a pointer via %s.
+
+2006-11-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/gettext.h (dgettext, dcgettext, ngettext) [! ENABLE_NLS]:
+ (dngettext, dcngettext, bindtextdomain) [! ENABLE_NLS]:
+ (bind_textdomain_codeset) [! ENABLE_NLS]:
+ Evaluate all the arguments. That way, callers get compatible behavior
+ if the arguments have side effects. Also, it avoids some GCC
+ diagnostics in some cases; Joel E. Denny reported problems when Bison
+ was configured with --enable-gcc-warnigs.
+
+2006-11-10 Jim Meyering <jim@meyering.net>
+
+ * m4/inline.m4 (gl_INLINE): Check with the compiler, not cpp, so that
+ relevant options in CFLAGS (like -O, -fno-inline) are taken into
+ account.
+
+2006-11-10 Jim Meyering <jim@meyering.net>
+
+ * modules/inline: New file/module.
+ * modules/xalloc (Files): Remove m4/inline.m4.
+ (Depends-on): Add inline, instead.
+ * modules/oset: Likewise.
+ * modules/list: Likewise.
+
+2006-11-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stdint_.h (uintmax_t): Fix typo: int64_t -> uint64_t.
+ Problem reported by Matthew Woehlke.
+
+2006-11-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/tempname.c (gen_tempname): Remove variant that invokes
+ __gen_tempname.
+ * m4/tempname.m4 (gl_FUNC_GEN_TEMPNAME): Don't test for
+ __gen_tempname.
+
+2006-11-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/longlong.m4 (AC_TYPE_LONG_LONG_INT): Set ac_cv_type_long_long_int
+ to 'yes' instead of 'cross-compiling'.
+
+2006-11-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/quotearg.h (quotearg_free): New decl.
+ * lib/quotearg.c (quotearg_free): New function.
+ (slot0, nslots, slotvec0, slotvec):
+ Now file-scope so that quotearg_free can get at them.
+
+2006-11-08 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Sync from Automake.
+ * build-aux/gnupload: Add missing 'gnu' to example URL.
+ Report by Karl Berry.
+
+2006-11-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/inline.m4 (gl_INLINE): Also test __NO_INLINE__.
+ Suggested by Paul Eggert.
+
+2006-11-08 Jim Meyering <jim@meyering.net>
+
+ * lib/fts.c [!_LGPL_PACKAGE]: Don't include fcntl--.h twice.
+ It's already included if !_LIBC.
+ (fts_safe_changedir): Add a comment.
+
+2006-11-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/longlong.m4 (AC_TYPE_LONG_LONG_INT): Detect bug in
+ Tandem NonStop Kernel (OSS) cc -O circa 2004, reported by
+ Matthew Woehlke.
+
+ * lib/xalloc.h (XMALLOC, XNMALLOC, XZALLOC, XCALLOC): Move
+ definitions up, to avoid colliding with change below.
+ (static_inline) [HAVE_INLINE]: New macro.
+ (xnmalloc, xnrealloc, x2nrealloc, xcharalloc):
+ Provide extern decls when !HAVE_INLINE. Do not define unless
+ static_inline is defined, either by us or by xmalloc.c. Use
+ static_inline rather than static inline.
+ (XCALLOC): Optimize sizeof(T) = 1 case.
+ * lib/xmalloc.c (static_inline) [!HAVE_INLINE]: New macro.
+
+2006-11-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/xalloc.h (XNMALLOC): Restore optimization of sizeof(T) = 1 case.
+ * m4/xalloc.m4 (gl_PREREQ_XALLOC): Require gl_INLINE instead of
+ AC_C_INLINE.
+ * modules/xalloc (Files): Add m4/inline.m4.
+
+2006-11-07 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * README: Fix typo.
+ * doc/gnulib.texi (Miscellaneous Notes): Likewise, rename...
+ (Miscellanous Notes): ...from this.
+
+2006-11-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/flexmember.m4 (AC_C_FLEXIBLE_ARRAY_MEMBER):
+ Mention that offsetof should be used instead of sizeof.
+ From Bruno Haible.
+
+2006-11-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/w32spawn.h (prepare_spawn): Use XNMALLOC instead of xmalloc.
+
+2006-11-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ Simplify xmalloc expressions. Add overflow check in xmalloc arguments.
+ * lib/gl_anyavltree_list2.h (create_subtree_with_contents):
+ (gl_tree_create, gl_tree_add_first, gl_tree_add_last):
+ (gl_tree_add_before, gl_tree_add_after):
+ Use XMALLOC instead of xmalloc, and XCALLOC instead of xzalloc.
+ * lib/gl_anyhash_list2.h (hash_resize): Likewise.
+ * lib/gl_anylinked_list2.h (gl_linked_create_empty, gl_linked_create):
+ (gl_linked_add_first, gl_linked_add_last, gl_linked_add_before):
+ (gl_linked_add_after, gl_linked_add_at): Likewise.
+ * lib/gl_anyrbtree_list2.h (create_subtree_with_contents):
+ (gl_tree_create, gl_tree_add_first, gl_tree_add_last):
+ (gl_tree_add_before, gl_tree_add_after): Likewise.
+ * lib/gl_anytree_list2.h (gl_tree_create_empty): Likewise.
+ * lib/gl_anytree_oset.h (gl_tree_create_empty): Likewise.
+ * lib/gl_anytreehash_list1.h (add_to_bucket): Likewise.
+
+2006-11-06 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/gl_oset.h: Use C comment style, not C++ comment style.
+
+2006-11-06 Bruno Haible <bruno@clisp.org>
+
+ * m4/inline.m4: New file.
+ * m4/gl_list.m4 (gl_LIST): Require gl_INLINE.
+ * modules/list (Files): Add m4/inline.m4.
+ * modules/oset (Files): Likewise.
+
+2006-11-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/idcache.c: Include <stddef.h>, for offsetof.
+ (struct userid.name): Change from char * to a flexible array member.
+ All uses changed.
+ * modules/idcache (Depends-on): Add flexmember.
+
+ * MODULES.html.sh (Core language properties): New module flexmember.
+ * modules/flexmember, m4/flexmember.m4: New files.
+
+ * lib/xalloc.h (xnmalloc, xnrealloc, x2nrealloc): Now static
+ inline functions that are identical with the old xnmalloc_inline,
+ xnrealloc_inline, x2nrealloc_inline of lib/xmalloc.c. This is so
+ that we can avoid some unnecessary integer multiplications and
+ divisions in the common case where the element size is known at
+ compile time.
+ (XNMALLOC) [HAVE_INLINE]: Remove special case, which is no longer
+ needed.
+ (xnboundedmalloc): Remove.
+ (XMALLOC, XNMALLOC, XZALLOC, XCALLOC): Use lower-case letters for
+ arguments, for consistency with rest of this header.
+ (xcharalloc): Rewrite using XNMALLOC.
+ * lib/xmalloc.c (xnmalloc_inline, xnmalloc, xnrealloc_inline):
+ (xnrealloc, x2nrealloc_inline, x2nrealloc): Remove. The *_inline
+ versions have been moved to lib/xalloc.h and renamed to be the
+ non-*_inline versions.
+ (xmalloc, xrealloc): Implement without reference to the xnmalloc
+ and xnrealloc functions, since those functions are now inline and
+ now call us.
+ (x2realloc): Invoke x2realloc, not x2realloc_inline, to accommodate
+ renaming described above.
+ * m4/xalloc.m4 (gl_PREREQ_XMALLOC): Remove AC_C_INLINE since
+ xmalloc.c no longer uses inline directly. gl_PREREQ_XALLOC now
+ captures the dependency in AC_C_INLINE.
+
+ New module canonicalize-lgpl, proposed by Charles Wilson in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-11/msg00020.html>
+ with a few small changes afterwards.
+ * MODULES.html.sh (File system functions): New module
+ canonicalize-lgpl.
+ * lib/canonicalize.h: Add comments for canonicalize_filename_mode
+ and canonicalize_file_name.
+ * lib/canonicalize-lgpl.c, m4/canonicalize-lgpl.m4:
+ * modules/canonicalize-lgpl: New files.
+
+2006-11-05 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir): Create directories
+ also for files in subdirectories of lib/.
+
+2006-11-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_array_list.c (gl_array_iterator_next): Make pointer decrement
+ ANSI C compliant.
+
+2006-11-03 Bruno Haible <bruno@clisp.org>
+
+ Simplify xmalloc expressions. Add overflow check in xmalloc arguments.
+ * m4/xalloc.m4 (gl_PREREQ_XALLOC): Require AC_C_INLINE.
+ * lib/xalloc.h (XMALLOC, XNMALLOC, XZALLOC, XCALLOC): New macros.
+ (xnboundedmalloc): New inline function.
+ * lib/classpath.c (new_classpath): Use XNMALLOC instead of xmalloc.
+ * lib/clean-temp.c (create_temp_dir): Use XNMALLOC, XMALLOC instead of
+ xmalloc.
+ * lib/concatpath.c (concatenated_pathname): Use XNMALLOC instead of
+ xmalloc.
+ * lib/fatal-signal.c (at_fatal_signal): Use XNMALLOC instead of xmalloc.
+ * lib/findprog.c (find_in_path): Use XNMALLOC instead of xmalloc.
+ * lib/gl_array_list.c (gl_array_create_empty): Use XMALLOC instead of
+ xmalloc.
+ (gl_array_create): Use XNMALLOC, XMALLOC instead of xmalloc.
+ * lib/gl_array_oset.c (gl_array_create_empty): Use XNMALLOC instead of
+ xmalloc.
+ * lib/gl_avltree_oset.c (gl_tree_add_first, gl_tree_add_before,
+ gl_tree_add_after): Use XMALLOC instead of xmalloc.
+ * lib/gl_carray_list.c (gl_carray_create_empty): Use XMALLOC instead of
+ xmalloc.
+ (gl_carray_create): Use XNMALLOC, XMALLOC instead of xmalloc.
+ * lib/gl_rbtree_oset.c (gl_tree_add_first, gl_tree_add_before,
+ gl_tree_add_after): Use XMALLOC instead of xmalloc.
+ * lib/gl_sublist.c (gl_sublist_create): Use XMALLOC instead of xmalloc.
+ * lib/pagealign_alloc.c (new_memnode): Use XMALLOC instead of xmalloc.
+ * lib/sh-quote.c (shell_quote_argv): Use XNMALLOC instead of xmalloc.
+ * lib/xvasprintf.c (xstrcat): Use XNMALLOC instead of xmalloc.
+
+2006-11-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-ctype.h [C++]: Define functions without name mangling.
+ * lib/fwriteerror.h [C++]: Likewise.
+ * lib/gcd.h [C++]: Likewise.
+ * lib/linebreak.h [C++]: Likewise.
+
+2006-11-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/canonicalize.h: (canonicalize_mode_t, CAN_EXISTING):
+ (CAN_ALL_BUT_LAST, CAN_MISSING, canonicalize_filename_mode):
+ Define only if PROVIDE_CANONICALIZE_FILENAME_MODE is defined.
+ * m4/canonicalize.m4 (AC_FUNC_CANONICALIZE_FILE_NAME):
+ Check for functions and headers just once.
+ Check for declaration of canonicalize_file_name.
+ Define PROVIDE_CANONICALIZE_FILENAME_MODE.
+
+2006-11-02 Charles Wilson <cygwin@cwilson.fastmail.fm>
+
+ * gnulib-tool (func_import): Fix typo in actioncmd.
+
+2006-11-02 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_automake_snippet): Interpret a backslash-
+ newline sequence in the Makefile.am snippet as a space, like "make"
+ does.
+ Reported by Roger Persson <perrog@gmail.com>.
+
+2006-11-01 Bruno Haible <bruno@clisp.org>
+
+ * m4/strcase.m4 (gl_FUNC_STRNCASECMP): Check whether strncasecmp is
+ already declared in <string.h>.
+ * lib/strcase.h (strncasecmp): Don't declare it if yes.
+
+2006-11-01 Bruno Haible <bruno@clisp.org>
+
+ * m4/strcase.m4 (gl_FUNC_STRCASECMP): Don't define strcasecmp here.
+ * lib/strcase.h: Include <string.h>.
+ (strcasecmp): Define to rpl_strcasecmp here.
+
+2006-11-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/printf-parse.c (PRINTF_PARSE): Cast malloc/realloc results.
+
+2006-11-01 Eric Blake <ebb9@byu.net>
+
+ * lib/mkstemp-safer.c (mkstemp_safer): Allow C++ compilation.
+
+ * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Allow C++ configuration.
+
+2006-10-29 Bruno Haible <bruno@clisp.org>
+
+ Make it compile in C++ mode.
+ * lib/full-write.c (full_rw): Add a cast.
+
+2006-11-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_automake_snippet): Change sed_combine_lines to
+ be POSIX compliant.
+ Reported by Roger Persson <perrog@gmail.com>.
+
+2006-11-01 Eric Blake <ebb9@byu.net>
+
+ * lib/getopt_.h: Fix comments.
+
+2006-10-31 Eric Blake <ebb9@byu.net>
+
+ * modules/tmpdir (Depends-on): Add sys_stat.
+ * modules/mkdtemp (Depends-on): Add tempname, drop unistd.
+ * lib/mkdtemp.c (gen_tempname): Remove; tempname covers this.
+ * lib/tmpdir.c (S_ISDIR): Simplify, thanks to sys_stat.
+ * m4/mkdtemp.m4 (gl_PREREQ_MKDTEMP): Simplify, thanks to
+ tempname.
+
+2006-10-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ Avoid some C++ diagnostics reported by Bruno Haible.
+ * lib/quotearg.c (clone_quoting_options): Use xmemdup rather than
+ xmalloc.
+ (quotearg_alloc): Use xcharalloc rather than xmalloc.
+ (struct slotvec): Move to top level.
+ (quotearg_n_options): Rewrite to avoid xmalloc.
+ * lib/xalloc.h (xcharalloc): New function.
+ * (xrealloc, xnrealloc, x2realloc, x2nrealloc, xmemdup):
+ [defined __cplusplus]: Add function template that provides result
+ type propagation. This part of the change is from Bruno Haible.
+
+2006-10-29 Bruno Haible <bruno@clisp.org>
+
+ Make it compile in C++ mode.
+ * lib/striconv.c (mem_cd_iconv): Cast malloc/realloc result.
+ * lib/strnlen1.c (strnlen1): Cast memchr result.
+ * lib/mbchar.h (mb_copy): Rename arguments to 'new_mbc', 'old_mbc'.
+ * lib/clean-temp.c (string_equals, string_hash): Add casts.
+ (create_temp_dir): Rename local variable 'template'.
+ (compile_csharp_using_sscli): Add cast.
+ * lib/fatal-signal.c (at_fatal_signal): Cast xmalloc result.
+ * lib/findprog.c (find_in_path): Likewise.
+ * lib/linebreak.c (mbs_width_linebreaks): Cast malloc result.
+ * lib/wait-process.c (register_slave_subprocess): Likewise.
+
+2006-10-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/tsearch: New file.
+ * lib/tsearch.h: New file.
+ * lib/tsearch.c: New file, from glibc-2.5 with small modifications.
+ * m4/tsearch.m4: New file.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add tsearch.
+
+2006-10-29 Eric Blake <ebb9@byu.net>
+
+ * lib/arcfour.c: Assume config.h.
+ * lib/arctwo.c: Likewise.
+ * lib/base64.c: Likewise.
+ * lib/check-version.c: Likewise.
+ * lib/crc.c: Likewise.
+ * lib/des.c: Likewise.
+ * lib/gc-gnulib.c: Likewise.
+ * lib/gc-libgcrypt.c: Likewise.
+ * lib/gc-pbkdf2-sha1.c: Likewise.
+ * lib/getaddrinfo.c: Likewise.
+ * lib/getdelim.c: Likewise.
+ * lib/getline.c: Likewise.
+ * lib/hmac-md5.c: Likewise.
+ * lib/hmac-sha1.c: Likewise.
+ * lib/iconvme.c: Likewise.
+ * lib/md2.c: Likewise.
+ * lib/md4.c: Likewise.
+ * lib/memxor.c: Likewise.
+ * lib/read-file.c: Likewise.
+ * lib/readline.c: Likewise.
+ * lib/rijndael-alg-fst.c: Likewise.
+ * lib/rijndael-api-fst.c: Likewise.
+ * lib/xgetdomainname.c: Likewise.
+
+2006-10-28 Eric Blake <ebb9@byu.net>
+
+ * lib/xstrndup.c: Assume config.h.
+
+2006-10-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ Move stat.h-substitute stuff from lib/stat-macros.h to lib/stat_.h.
+ stat-macros.h is now for our own macros, whereas stat_h is for
+ macros in the <sys/stat.h> name space.
+ * lib/stat-macros.h: Remove copyright notice, as this file is now tiny.
+ (STAT_MACROS_H): Remove.
+ (S_IFMT, S_ISBLK, S_ISCHR, S_ISDIR, S_ISFIFO, S_ISLNK, S_ISNAM):
+ (S_ISMPB, S_ISMPC, S_ISNWK, S_ISREG, S_ISSOCK, S_ISDOOR, S_ISPORT):
+ (S_TYPEISMQ, S_TYPEISTMO, S_TYPEISSEM, S_TYPEISSHM, S_ISCTG, S_ISOFD):
+ (S_ISOFL, S_ISWHT, S_ISUID, S_ISGID, S_ISVTX, S_IRUSR, S_IRGRP):
+ (S_IROTH, S_IWUSR, S_IWGRP, S_IWOTH, S_IXUSR, S_IXGRP, S_IXOTH):
+ (S_IRWXU, S_IRWXG, S_IRWXO, S_IXUGO, S_IRWXUGO):
+ Move these macros to ...
+ * lib/stat_.h: here. Don't include stat-macros.h.
+ * lib/canonicalize.c: Don't include stat-macros.h.
+ * lib/chown.c: Likewise.
+ * lib/euidaccess.c: Likewise.
+ * lib/file-type.c: Likewise.
+ * lib/filemode.c: Likewise.
+ * lib/glob.c: Likewise.
+ * lib/isapipe.c: Likewise.
+ * lib/lchown.c: Likewise.
+ * lib/lstat.c: Likewise.
+ * lib/mkdir-p.c: Likewise.
+ * lib/rmdir.c: Likewise.
+ * m4/lchown.m4 (gl_FUNC_LCHOWN): Don't require gl_STAT_MACROS.
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Don't check for io.h
+ unless mkdir isn't declared, to speed up 'configure'.
+ Always create sys/stat.h, since it's unlikely any real sys/stat.h
+ would define all the S_* symbols.
+ * modules/canonicalize (Depends-on):
+ Depend on sys_stat, not stat-macros.
+ * modules/chown: Likewise.
+ * modules/euidaccess: Likewise.
+ * modules/filemode: Likewise.
+ * modules/file-type: Likewise.
+ * modules/glob: Likewise.
+ * modules/isapipe: Likewise.
+ * modules/lchown: Likewise.
+ * modules/lstat: Likewise.
+ * modules/mkancesdirs: Likewise.
+ * modules/rmdir: Likewise.
+ * modules/mkdir-p (Depends-on): Also depend on sys_stat.
+ * modules/modechange: Likewise.
+ * modules/stat-macros (Files): Remove m4/stat-macros.m4.
+ (configure.ac): Remove gl_STAT_MACROS.
+ * modules/sys_stat (Depends-on): Remove stat-macros.
+
+2006-10-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/signed.m4: Remove file.
+ * m4/vasnprintf.m4 (gl_PREREQ_PRINTF_ARGS_: Remove bh_C_SIGNED
+ invocation.
+ * modules/vasnprintf (Files): Remove m4/signed.m4.
+
+2006-10-27 Bruno Haible <bruno@clisp.org>
+
+ Update to GNU gettext 0.16.
+ * modules/gettext (Files): Add m4/intl.m4, m4/intldir.m4. Remove
+ m4/inttypes-h.m4, m4/signed.m4.
+ * m4/gettext.m4: Update to GNU gettext 0.16.
+ * m4/intl.m4: New file, from GNU gettext.
+ * m4/intldir.m4: New file, from GNU gettext.
+ * config/srclist.txt: Update
+
+2006-10-27 Eric Blake <ebb9@byu.net>
+
+ * MODULES.html.sh: Document tempname.
+ * modules/mkstemp (Depends-on): Add tempname, and drop transitive
+ dependencies.
+ (Files): Move lib/tempname.c...
+ * modules/tempname: ...to this new module.
+ * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Remove tempname checks.
+ (gl_PREREQ_TEMPNAME): Move...
+ * m4/tempname.m4: ...to this new file.
+ * lib/mkstemp.c (includes) [!_LIBC]: Use tempname.h.
+ * modules/sys_stat (Depends-on): Add stat-macros.
+ * lib/stat_.h (includes): Pick up stat macros.
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Replace <sys/stat.h>
+ if stat macros are broken.
+ * lib/tempname.c (includes): No need to include "stat-macros.h".
+ (__gen_tempname) [!_LIBC]: Expose as gen_tempname.
+ (direxists, __path_search) [!_LIBC]: Don't compile these in
+ gnulib; the tmpdir module covers that.
+ * lib/tempname.h: New file.
+
+2006-10-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * COPYING: Explain how gnulib-tool converts licence headers.
+ Almost all wording by Eric Blake.
+
+2006-10-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mbchar.h (is_basic_table): Make read-only.
+ * lib/mbchar.c (is_basic_table): Likewise.
+ Reported by John Darrington.
+
+2006-10-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.h (set_program_name): Undefine before defining.
+
+2006-10-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/gettext.h (_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS): Define to
+ false for non-gcc C++ compilers.
+ Reported by Nelson H. F. Beebe <beebe@math.utah.edu>.
+
+2006-10-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconv.c (mem_cd_iconv, str_cd_iconv): Treat all non-GNU
+ iconv implementations like Irix iconv.
+
+2006-10-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/vararrays: New file.
+ * m4/vararrays.m4: New file, taken from diffutils.
+ * MODULES.html.sh: New module vararrays.
+
+2006-10-24 Karl Berry <karl@gnu.org>
+
+ * doc/gnulib-intro.texi: --- instead of --; non-naive naive.
+ Don't call GNU Unix.
+
+2006-10-24 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * users.txt: Add Libtool.
+
+ Sync from Libtool:
+
+ 2006-10-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argz.c: Remove check for HAVE_CONFIG_H, to conform
+ to gnulib's policy of including config.h unconditionally.
+
+2006-10-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/wcwidth (Files): Add m4/wint_t.m4.
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Require gt_TYPE_WINT_T.
+ * lib/wcwidth.h (iswprint): Use 'int' if 'wint_t' is not defined.
+
+2006-10-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y (yyerror): Make the arguments pointer-to-const,
+ to pacify GCC with some -W flags enabled. Problem reported by
+ Bruno Haible.
+
+2006-10-24 Jim Meyering <jim@meyering.net>
+
+ * MODULES.html.sh: Remove uinttostr. It's not a module.
+ Reported by Karl Berry.
+
+2006-10-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/fts.c (fts_build): Move variable declaration, for C89 compliance.
+
+2006-10-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_list.h: Use C comment style, not C++ comment style.
+
+2006-10-23 Eric Blake <ebb9@byu.net>
+
+ * lib/getaddrinfo.c (includes): Add missing include.
+
+2006-10-23 Bruno Haible <bruno@clisp.org>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ Ability to rename obstack_free.
+ * lib/obstack.h (__obstack_free): New macro. Declare instead of
+ obstack_free.
+ (obstack_free): Invoke the __obstack_free macro.
+ * lib/obstack.c (obstack_free): Use __obstack_free macro.
+
+2006-10-23 Bruno Haible <bruno@clisp.org>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argp.h (argp_parse, __argp_parse): Comment out the identifiers
+ __argc, __argv from the declaration. (They are defined as macros on
+ mingw.)
+
+2006-10-22 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-intro.texi: New file.
+ * doc/gnulib.texi: Include it.
+
+2006-10-21 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi: Split the chapter "Gnulib" into 3 chapters
+ "Introduction", "Miscellanous Notes", "Particular Modules".
+
+2006-10-21 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+ Change mostlyclean-local rule to avoid sh syntax error from bash
+ versions 2.00..2.05 when $(MOSTLYCLEANDIRS) is empty.
+
+2006-10-23 Jim Meyering <jim@meyering.net>
+
+ * lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
+ in place of snprintf.
+
+ * modules/inttostr (Files): Add lib/uinttostr.c.
+ * lib/uinttostr.c (inttostr): New file/function.
+ * lib/inttostr.h (uinttostr): Declare.
+ * m4/inttostr.m4: Add AC_LIBOBJ([uinttostr]).
+ * MODULES.html.sh (Numeric conversion functions <stdlib.h>):
+ Add uinttostr.
+ * modules/getaddrinfo (Depends-on): Remove snprintf. Add inttostr.
+
+2006-10-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/canonicalize.c (ELOOP): Define if not already defined.
+ Problem reported by Bruno Haible in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-10/msg00282.html>.
+
+2006-10-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stdint_.h [defined _AIX]: Don't include <sys/types.h>.
+ Problem reported by Perry Smith and Ville Laurikari.
+
+ * lib/getndelim2.c (SSIZE_MAX): Use same defn that getdelim.c
+ uses.
+
+2006-10-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/getndelim2.c (SSIZE_MAX): Provide fallback definition. Needed
+ for mingw.
+
+2006-10-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/openat-priv.h (EOPNOTSUPP): Provide fallback definition.
+ Needed for mingw.
+
+2006-10-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/size_max.m4 (gl_SIZE_MAX): Cache the result.
+
+2006-10-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/allocsa.m4 (gl_ALLOCSA): Invoke gl_FUNC_ALLOCA, don't AC_REQUIRE
+ it.
+
+2006-10-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/alloca.m4 (gl_FUNC_ALLOCA): Cache the result of the AC_EGREP_CPP
+ invocation.
+
+2006-10-19 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Don't include ftruncate and
+ mountlist by default.
+
+2006-10-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strstr.c: Include c-strstr.h.
+
+2006-10-18 Charles Wilson <cygwin@cwilson.fastmail.fm>
+
+ * gnulib-tool: Don't clobber $sourcebase when $local_gnulib_dir ends
+ in a slash.
+
+2006-10-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h [C++]: Wrap definitions in extern "C".
+
+2006-10-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_initmacro_end): Remove duplicates from the
+ gl_LIBOBJS list.
+
+2006-10-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/findprog.c (find_in_path): Avoid "gcc -Wwrite-strings" warning.
+
+2006-10-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xstrtol.h: Include gettext.h.
+ (_STRTOL_ERROR): Wrap English-language formats inside gettext.
+ Problem reported by Eric Blake.
+ * modules/xstrtol (Depends-on): Add gettext-h.
+
+2006-10-19 Paul Eggert <eggert@cs.ucla.edu> (tiny change)
+
+ * lib/strftime.c (advance): New macro.
+ (add): Use it to avoid adding 0 to a FILE *. FILE can be an
+ incomplete type, so you can't add 0 to it. Problem and patch
+ reported by Eelco Dolstra for dietlibc.
+
+2006-10-18 Jim Meyering <jim@meyering.net>
+
+ * lib/readutmp.c (desirable_utmp_entry): Use "bool" as the
+ type for a local, and rename it: s/up/user_proc/.
+
+2006-10-18 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/readutmp.c (desirable_utmp_entry): Implement new flag:
+ READ_UTMP_USER_PROCESS.
+ * lib/readutmp.h (READ_UTMP_USER_PROCESS): New flag
+
+2006-10-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/localcharset.c: Do not check HAVE_SETLOCALE.
+ * m4/localcharset.m4 (gl_LOCALCHARSET): Don't check for setlocale.
+
+2006-10-17 Eric Blake <ebb9@byu.net>
+
+ * lib/sigprocmask.c (sigprocmask): Fix typo.
+
+ * m4/signalblocking.m4 (gl_PREREQ_SIGPROCMASK): Fix typo.
+
+ * modules/clean-temp (Makefile.am): Don't add to make output...
+ (configure.ac): ...instead define SIGNAL_SAFE_LIST inside
+ config.h.
+
+2006-10-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/gettext.h (gettext, ngettext, pgettext, npgettext): Define
+ differently if DEFAULT_TEXT_DOMAIN is set.
+
+2006-10-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/clean-temp.c: Include fwriteerror.h.
+
+2006-10-16 Bruno Haible <bruno@clisp.org>
+
+ * getndelim2.m4 (gl_GETNDELIM2): Remove 2003-10-23 hack.
+
+2006-10-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/signalblocking.m4 (gl_PREREQ_SIGPROCMASK): Also test for sigset_t.
+ * lib/sigprocmask.h: Include <sys/types.h>.
+ (sigset_t): Use the system's definition if present.
+
+2006-10-17 Eric Blake <ebb9@byu.net>
+
+ * lib/xvasprintf.c (includes): Assume config.h.
+ * lib/xasprintf.c (includes): Likewise.
+
+2006-10-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fsusage.c (PROPAGATE_ALL_ONES): Don't assume uintmax_t is
+ at least as wide as intmax_t.
+
+2006-10-16 Alexandre Duret-Lutz <adl@gnu.org>
+
+ (Imported from Automake.)
+ * build-aux/gnupload: Update to version 1.1 of directive file.
+
+2006-10-16 Eric Blake <ebb9@byu.net>
+
+ * modules/configmake (Makefile.am): Add pkglibexecdir support, to
+ match Automake 1.10a.
+
+2006-10-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/sigprocmask: New file.
+ * lib/sigprocmask.h: New file.
+ * lib/sigprocmask.c: New file.
+ * m4/signalblocking.m4 (gl_SIGNALBLOCKING): Renamed from
+ gt_SIGNALBLOCKING. When not defining HAVE_POSIX_SIGNALBLOCKING,
+ request sigprocmask.o.
+ (gl_PREREQ_SIGPROCMASK): New macro.
+ * modules/fatal-signal (Files): Remove m4/signalblocking.m4.
+ (Depends-on): Add sigprocmask.
+ * m4/fatal-signal.m4 (gl_FATAL_SIGNAL): Don't require
+ gt_SIGNALBLOCKING. Test for 'raise' only once.
+ * lib/fatal-signal.c: Include sigprocmask.h.
+ (fatal_signal_set, init_fatal_signal_set, block_fatal_signals,
+ unblock_fatal_signals): Define always.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ sigprocmask.
+
+2006-10-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from Automake.
+ * build-aux/install-sh (posix_mkdir): Reject FreeBSD 6.1 mkdir -p -m,
+ which incorrectly sets the mode of an existing destination
+ directory. In some cases the unpatched install-sh could do the
+ equivalent of "chmod 777 /" or "chmod 0 /" on a buggy FreeBSD
+ system. We hope this is rare in practice, but it's clearly worth
+ fixing. Problem reported by Alex Unleashed in
+ <http://lists.gnu.org/archive/html/bug-autoconf/2006-10/msg00012.html>.
+ Also, don't bother to check for -m bugs unless we're using -m;
+ suggested by Stepan Kasal.
+
+2006-10-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Sync from Automake.
+ * build-aux/depcomp (gcc3): Put dependency extraction flags before the
+ `-c' flag, so they appear at the same position as in %FASTDEP%
+ mode in depend2.am. Fixes build failure for FreeBSD's c89,
+ which ignores unknown options only after the first non-option.
+ Bug report against M4 by Nelson H. F. Beebe.
+
+2006-10-13 Jim Meyering <jim@meyering.net>
+
+ Fix a bug in yesterday's change.
+ * lib/fts.c (fts_open): When using FTS_XDEV|FTS_NOSTAT,
+ p->fts_statp->st_dev would be used uninitialized.
+ Ensures that we always call fts_stat on the very first entry.
+ Miklos Szeredi reported that find -xdev stopped working.
+
+2006-10-12 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_automake_snippet): Append an automatically
+ computed EXTRA_DIST augmentation.
+ * modules/acl (Makefile.am): Remove EXTRA_DIST augmentation.
+ * modules/alloca-opt (Makefile.am): Likewise.
+ * modules/allocsa (Makefile.am): Likewise.
+ * modules/arcfour (Makefile.am): Likewise.
+ * modules/arctwo (Makefile.am): Likewise.
+ * modules/argmatch (Makefile.am): Likewise.
+ * modules/argz (Makefile.am): Likewise.
+ * modules/atexit (Makefile.am): Likewise.
+ * modules/backupfile (Makefile.am): Likewise.
+ * modules/byteswap (Makefile.am): Likewise.
+ * modules/c-strtod (Makefile.am): Likewise.
+ * modules/c-strtold (Makefile.am): Likewise.
+ * modules/calloc (Makefile.am): Likewise.
+ * modules/canon-host (Makefile.am): Likewise.
+ * modules/canonicalize (Makefile.am): Likewise.
+ * modules/chdir-long (Makefile.am): Likewise.
+ * modules/chdir-safer (Makefile.am): Likewise.
+ * modules/check-version (Makefile.am): Likewise.
+ * modules/chown (Makefile.am): Likewise.
+ * modules/cloexec (Makefile.am): Likewise.
+ * modules/close-stream (Makefile.am): Likewise.
+ * modules/closeout (Makefile.am): Likewise.
+ * modules/crc (Makefile.am): Likewise.
+ * modules/csharpexec (Makefile.am): Likewise.
+ * modules/cycle-check (Makefile.am): Likewise.
+ * modules/des (Makefile.am): Likewise.
+ * modules/dev-ino (Makefile.am): Likewise.
+ * modules/dirfd (Makefile.am): Likewise.
+ * modules/dirname (Makefile.am): Likewise.
+ * modules/dup2 (Makefile.am): Likewise.
+ * modules/eealloc (Makefile.am): Likewise.
+ * modules/error (Makefile.am): Likewise.
+ * modules/euidaccess (Makefile.am): Likewise.
+ * modules/exclude (Makefile.am): Likewise.
+ * modules/exitfail (Makefile.am): Likewise.
+ * modules/fcntl-safer (Makefile.am): Likewise.
+ * modules/fcntl (Makefile.am): Likewise.
+ * modules/file-type (Makefile.am): Likewise.
+ * modules/fileblocks (Makefile.am): Likewise.
+ * modules/filemode (Makefile.am): Likewise.
+ * modules/filenamecat (Makefile.am): Likewise.
+ * modules/fnmatch (Makefile.am): Likewise.
+ * modules/fopen-safer (Makefile.am): Likewise.
+ * modules/fpending (Makefile.am): Likewise.
+ * modules/fprintftime (Makefile.am): Likewise.
+ * modules/free (Makefile.am): Likewise.
+ * modules/fsusage (Makefile.am): Likewise.
+ * modules/ftruncate (Makefile.am): Likewise.
+ * modules/fts (Makefile.am): Likewise.
+ * modules/gc-arcfour (Makefile.am): Likewise.
+ * modules/gc-des (Makefile.am): Likewise.
+ * modules/gc-hmac-md5 (Makefile.am): Likewise.
+ * modules/gc-hmac-sha1 (Makefile.am): Likewise.
+ * modules/gc-md4 (Makefile.am): Likewise.
+ * modules/gc-pbkdf2-sha1 (Makefile.am): Likewise.
+ * modules/gc-sha1 (Makefile.am): Likewise.
+ * modules/gc (Makefile.am): Likewise.
+ * modules/getaddrinfo (Makefile.am): Likewise.
+ * modules/getcwd (Makefile.am): Likewise.
+ * modules/getdelim (Makefile.am): Likewise.
+ * modules/getdomainname (Makefile.am): Likewise.
+ * modules/getgroups (Makefile.am): Likewise.
+ * modules/gethostname (Makefile.am): Likewise.
+ * modules/gethrxtime (Makefile.am): Likewise.
+ * modules/getline (Makefile.am): Likewise.
+ * modules/getloadavg (Makefile.am): Likewise.
+ * modules/getlogin_r (Makefile.am): Likewise.
+ * modules/getndelim2 (Makefile.am): Likewise.
+ * modules/getopt (Makefile.am): Likewise.
+ * modules/getpagesize (Makefile.am): Likewise.
+ * modules/getpass-gnu (Makefile.am): Likewise.
+ * modules/getpass (Makefile.am): Likewise.
+ * modules/getsubopt (Makefile.am): Likewise.
+ * modules/gettime (Makefile.am): Likewise.
+ * modules/gettimeofday (Makefile.am): Likewise.
+ * modules/getugroups (Makefile.am): Likewise.
+ * modules/getusershell (Makefile.am): Likewise.
+ * modules/glob (Makefile.am): Likewise.
+ * modules/group-member (Makefile.am): Likewise.
+ * modules/hard-locale (Makefile.am): Likewise.
+ * modules/hash (Makefile.am): Likewise.
+ * modules/hmac-md5 (Makefile.am): Likewise.
+ * modules/hmac-sha1 (Makefile.am): Likewise.
+ * modules/human (Makefile.am): Likewise.
+ * modules/idcache (Makefile.am): Likewise.
+ * modules/imaxabs (Makefile.am): Likewise.
+ * modules/imaxdiv (Makefile.am): Likewise.
+ * modules/inet_ntop (Makefile.am): Likewise.
+ * modules/inet_pton (Makefile.am): Likewise.
+ * modules/intprops (Makefile.am): Likewise.
+ * modules/inttostr (Makefile.am): Likewise.
+ * modules/inttypes (Makefile.am): Likewise.
+ * modules/isapipe (Makefile.am): Likewise.
+ * modules/javaversion (Makefile.am): Likewise.
+ * modules/lchmod (Makefile.am): Likewise.
+ * modules/lchown (Makefile.am): Likewise.
+ * modules/localcharset (Makefile.am): Likewise.
+ * modules/long-options (Makefile.am): Likewise.
+ * modules/lstat (Makefile.am): Likewise.
+ * modules/malloc (Makefile.am): Likewise.
+ * modules/mathl (Makefile.am): Likewise.
+ * modules/mbchar (Makefile.am): Likewise.
+ * modules/md2 (Makefile.am): Likewise.
+ * modules/md4 (Makefile.am): Likewise.
+ * modules/md5 (Makefile.am): Likewise.
+ * modules/memcasecmp (Makefile.am): Likewise.
+ * modules/memchr (Makefile.am): Likewise.
+ * modules/memcmp (Makefile.am): Likewise.
+ * modules/memcoll (Makefile.am): Likewise.
+ * modules/memcpy (Makefile.am): Likewise.
+ * modules/memmem (Makefile.am): Likewise.
+ * modules/memmove (Makefile.am): Likewise.
+ * modules/mempcpy (Makefile.am): Likewise.
+ * modules/memrchr (Makefile.am): Likewise.
+ * modules/memset (Makefile.am): Likewise.
+ * modules/memxor (Makefile.am): Likewise.
+ * modules/mkancesdirs (Makefile.am): Likewise.
+ * modules/mkdir-p (Makefile.am): Likewise.
+ * modules/mkdir (Makefile.am): Likewise.
+ * modules/mkdtemp (Makefile.am): Likewise.
+ * modules/mkstemp (Makefile.am): Likewise.
+ * modules/mktime (Makefile.am): Likewise.
+ * modules/modechange (Makefile.am): Likewise.
+ * modules/mountlist (Makefile.am): Likewise.
+ * modules/nanosleep (Makefile.am): Likewise.
+ * modules/obstack (Makefile.am): Likewise.
+ * modules/openat (Makefile.am): Likewise.
+ * modules/pagealign_alloc (Makefile.am): Likewise.
+ * modules/pathmax (Makefile.am): Likewise.
+ * modules/physmem (Makefile.am): Likewise.
+ * modules/poll (Makefile.am): Likewise.
+ * modules/posixtm (Makefile.am): Likewise.
+ * modules/posixver (Makefile.am): Likewise.
+ * modules/putenv (Makefile.am): Likewise.
+ * modules/quote (Makefile.am): Likewise.
+ * modules/quotearg (Makefile.am): Likewise.
+ * modules/raise (Makefile.am): Likewise.
+ * modules/read-file (Makefile.am): Likewise.
+ * modules/readline (Makefile.am): Likewise.
+ * modules/readlink (Makefile.am): Likewise.
+ * modules/readtokens (Makefile.am): Likewise.
+ * modules/readutmp (Makefile.am): Likewise.
+ * modules/realloc (Makefile.am): Likewise.
+ * modules/regex (Makefile.am): Likewise.
+ * modules/rename-dest-slash (Makefile.am): Likewise.
+ * modules/rename (Makefile.am): Likewise.
+ * modules/rijndael (Makefile.am): Likewise.
+ * modules/rmdir (Makefile.am): Likewise.
+ * modules/rpmatch (Makefile.am): Likewise.
+ * modules/safe-read (Makefile.am): Likewise.
+ * modules/safe-write (Makefile.am): Likewise.
+ * modules/same-inode (Makefile.am): Likewise.
+ * modules/same (Makefile.am): Likewise.
+ * modules/save-cwd (Makefile.am): Likewise.
+ * modules/savedir (Makefile.am): Likewise.
+ * modules/setenv (Makefile.am): Likewise.
+ * modules/settime (Makefile.am): Likewise.
+ * modules/sha1 (Makefile.am): Likewise.
+ * modules/sig2str (Makefile.am): Likewise.
+ * modules/snprintf (Makefile.am): Likewise.
+ * modules/stat-macros (Makefile.am): Likewise.
+ * modules/stat-time (Makefile.am): Likewise.
+ * modules/stdbool (Makefile.am): Likewise.
+ * modules/stdint (Makefile.am): Likewise.
+ * modules/stdlib-safer (Makefile.am): Likewise.
+ * modules/stpcpy (Makefile.am): Likewise.
+ * modules/stpncpy (Makefile.am): Likewise.
+ * modules/strcase (Makefile.am): Likewise.
+ * modules/strcasestr (Makefile.am): Likewise.
+ * modules/strchrnul (Makefile.am): Likewise.
+ * modules/strcspn (Makefile.am): Likewise.
+ * modules/strdup (Makefile.am): Likewise.
+ * modules/strerror (Makefile.am): Likewise.
+ * modules/strftime (Makefile.am): Likewise.
+ * modules/strndup (Makefile.am): Likewise.
+ * modules/strnlen (Makefile.am): Likewise.
+ * modules/strpbrk (Makefile.am): Likewise.
+ * modules/strsep (Makefile.am): Likewise.
+ * modules/strstr (Makefile.am): Likewise.
+ * modules/strtod (Makefile.am): Likewise.
+ * modules/strtoimax (Makefile.am): Likewise.
+ * modules/strtok_r (Makefile.am): Likewise.
+ * modules/strtol (Makefile.am): Likewise.
+ * modules/strtoll (Makefile.am): Likewise.
+ * modules/strtoul (Makefile.am): Likewise.
+ * modules/strtoull (Makefile.am): Likewise.
+ * modules/strtoumax (Makefile.am): Likewise.
+ * modules/strverscmp (Makefile.am): Likewise.
+ * modules/sys_socket (Makefile.am): Likewise.
+ * modules/sys_stat (Makefile.am): Likewise.
+ * modules/sysexits (Makefile.am): Likewise.
+ * modules/time_r (Makefile.am): Likewise.
+ * modules/timegm (Makefile.am): Likewise.
+ * modules/timespec (Makefile.am): Likewise.
+ * modules/tmpfile-safer (Makefile.am): Likewise.
+ * modules/trim (Makefile.am): Likewise.
+ * modules/unistd-safer (Makefile.am): Likewise.
+ * modules/unlinkdir (Makefile.am): Likewise.
+ * modules/unlocked-io (Makefile.am): Likewise.
+ * modules/userspec (Makefile.am): Likewise.
+ * modules/utime (Makefile.am): Likewise.
+ * modules/utimecmp (Makefile.am): Likewise.
+ * modules/utimens (Makefile.am): Likewise.
+ * modules/vasnprintf (Makefile.am): Likewise.
+ * modules/vasprintf (Makefile.am): Likewise.
+ * modules/vsnprintf (Makefile.am): Likewise.
+ * modules/xalloc (Makefile.am): Likewise.
+ * modules/xgetcwd (Makefile.am): Likewise.
+ * modules/xnanosleep (Makefile.am): Likewise.
+ * modules/xreadlink (Makefile.am): Likewise.
+ * modules/xstrtod (Makefile.am): Likewise.
+ * modules/xstrtol (Makefile.am): Likewise.
+ * modules/xstrtold (Makefile.am): Likewise.
+ * modules/yesno (Makefile.am): Likewise.
+ * modules/getdate (Makefile.am): Don't add getdate.h to EXTRA_DIST.
+
+2006-10-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/error (Makefile.am): Distribute files through
+ EXTRA_DIST, not lib_SOURCES.
+
+2006-10-12 Eric Blake <ebb9@byu.net>
+
+ * modules/error (Makefile.am): Distribute files in /lib.
+ * modules/obstack (Makefile.am): Likewise.
+
+2006-10-12 Bruno Haible <bruno@clisp.org>
+
+ * modules/acl (Makefile.am): Distribute all files in lib/ through
+ EXTRA_DIST.
+ * modules/arcfour (Makefile.am): Likewise.
+ * modules/arctwo (Makefile.am): Likewise.
+ * modules/argmatch (Makefile.am): Likewise.
+ * modules/argz (Makefile.am): Likewise.
+ * modules/atexit (Makefile.am): Likewise.
+ * modules/backupfile (Makefile.am): Likewise.
+ * modules/c-strtod (Makefile.am): Likewise.
+ * modules/c-strtold (Makefile.am): Likewise.
+ * modules/calloc (Makefile.am): Likewise.
+ * modules/canon-host (Makefile.am): Likewise.
+ * modules/canonicalize (Makefile.am): Likewise.
+ * modules/chdir-long (Makefile.am): Likewise.
+ * modules/chdir-safer (Makefile.am): Likewise.
+ * modules/check-version (Makefile.am): Likewise.
+ * modules/chown (Makefile.am): Likewise.
+ * modules/cloexec (Makefile.am): Likewise.
+ * modules/close-stream (Makefile.am): Likewise.
+ * modules/closeout (Makefile.am): Likewise.
+ * modules/crc (Makefile.am): Likewise.
+ * modules/cycle-check (Makefile.am): Likewise.
+ * modules/des (Makefile.am): Likewise.
+ * modules/dirfd (Makefile.am): Likewise.
+ * modules/dirname (Makefile.am): Likewise.
+ * modules/dup2 (Makefile.am): Likewise.
+ * modules/euidaccess (Makefile.am): Likewise.
+ * modules/exclude (Makefile.am): Likewise.
+ * modules/exitfail (Makefile.am): Likewise.
+ * modules/fcntl-safer (Makefile.am): Likewise.
+ * modules/file-type (Makefile.am): Likewise.
+ * modules/fileblocks (Makefile.am): Likewise.
+ * modules/filemode (Makefile.am): Likewise.
+ * modules/filenamecat (Makefile.am): Likewise.
+ * modules/fnmatch (Makefile.am): Likewise.
+ * modules/fopen-safer (Makefile.am): Likewise.
+ * modules/fpending (Makefile.am): Likewise.
+ * modules/fprintftime (Makefile.am): Likewise.
+ * modules/free (Makefile.am): Likewise.
+ * modules/fsusage (Makefile.am): Likewise.
+ * modules/ftruncate (Makefile.am): Likewise.
+ * modules/fts (Makefile.am): Likewise.
+ * modules/gc (Makefile.am): Likewise.
+ * modules/gc-pbkdf2-sha1 (Makefile.am): Likewise.
+ * modules/getaddrinfo (Makefile.am): Likewise.
+ * modules/getcwd (Makefile.am): Likewise.
+ * modules/getdelim (Makefile.am): Likewise.
+ * modules/getdomainname (Makefile.am): Likewise.
+ * modules/getgroups (Makefile.am): Likewise.
+ * modules/gethostname (Makefile.am): Likewise.
+ * modules/gethrxtime (Makefile.am): Likewise.
+ * modules/getline (Makefile.am): Likewise.
+ * modules/getloadavg (Makefile.am): Likewise.
+ * modules/getlogin_r (Makefile.am): Likewise.
+ * modules/getopt (Makefile.am): Likewise.
+ * modules/getpass (Makefile.am): Likewise.
+ * modules/getpass-gnu (Makefile.am): Likewise.
+ * modules/getsubopt (Makefile.am): Likewise.
+ * modules/gettime (Makefile.am): Likewise.
+ * modules/gettimeofday (Makefile.am): Likewise.
+ * modules/getugroups (Makefile.am): Likewise.
+ * modules/getusershell (Makefile.am): Likewise.
+ * modules/glob (Makefile.am): Likewise.
+ * modules/group-member (Makefile.am): Likewise.
+ * modules/hard-locale (Makefile.am): Likewise.
+ * modules/hash (Makefile.am): Likewise.
+ * modules/hmac-md5 (Makefile.am): Likewise.
+ * modules/hmac-sha1 (Makefile.am): Likewise.
+ * modules/human (Makefile.am): Likewise.
+ * modules/idcache (Makefile.am): Likewise.
+ * modules/imaxabs (Makefile.am): Likewise.
+ * modules/imaxdiv (Makefile.am): Likewise.
+ * modules/inet_ntop (Makefile.am): Likewise.
+ * modules/inet_pton (Makefile.am): Likewise.
+ * modules/inttostr (Makefile.am): Likewise.
+ * modules/isapipe (Makefile.am): Likewise.
+ * modules/lchown (Makefile.am): Likewise.
+ * modules/long-options (Makefile.am): Likewise.
+ * modules/lstat (Makefile.am): Likewise.
+ * modules/malloc (Makefile.am): Likewise.
+ * modules/mathl (Makefile.am): Likewise.
+ * modules/mbchar (Makefile.am): Likewise.
+ * modules/md2 (Makefile.am): Likewise.
+ * modules/md4 (Makefile.am): Likewise.
+ * modules/md5 (Makefile.am): Likewise.
+ * modules/memcasecmp (Makefile.am): Likewise.
+ * modules/memchr (Makefile.am): Likewise.
+ * modules/memcmp (Makefile.am): Likewise.
+ * modules/memcoll (Makefile.am): Likewise.
+ * modules/memcpy (Makefile.am): Likewise.
+ * modules/memmem (Makefile.am): Likewise.
+ * modules/memmove (Makefile.am): Likewise.
+ * modules/mempcpy (Makefile.am): Likewise.
+ * modules/memrchr (Makefile.am): Likewise.
+ * modules/memset (Makefile.am): Likewise.
+ * modules/memxor (Makefile.am): Likewise.
+ * modules/mkancesdirs (Makefile.am): Likewise.
+ * modules/mkdir (Makefile.am): Likewise.
+ * modules/mkdir-p (Makefile.am): Likewise.
+ * modules/mkdtemp (Makefile.am): Likewise.
+ * modules/mkstemp (Makefile.am): Likewise.
+ * modules/mktime (Makefile.am): Likewise.
+ * modules/modechange (Makefile.am): Likewise.
+ * modules/mountlist (Makefile.am): Likewise.
+ * modules/nanosleep (Makefile.am): Likewise.
+ * modules/openat (Makefile.am): Likewise.
+ * modules/pagealign_alloc (Makefile.am): Likewise.
+ * modules/physmem (Makefile.am): Likewise.
+ * modules/poll (Makefile.am): Likewise.
+ * modules/posixtm (Makefile.am): Likewise.
+ * modules/posixver (Makefile.am): Likewise.
+ * modules/putenv (Makefile.am): Likewise.
+ * modules/quote (Makefile.am): Likewise.
+ * modules/quotearg (Makefile.am): Likewise.
+ * modules/raise (Makefile.am): Likewise.
+ * modules/read-file (Makefile.am): Likewise.
+ * modules/readline (Makefile.am): Likewise.
+ * modules/readlink (Makefile.am): Likewise.
+ * modules/readtokens (Makefile.am): Likewise.
+ * modules/readutmp (Makefile.am): Likewise.
+ * modules/realloc (Makefile.am): Likewise.
+ * modules/regex (Makefile.am): Likewise.
+ * modules/rename (Makefile.am): Likewise.
+ * modules/rename-dest-slash (Makefile.am): Likewise.
+ * modules/rijndael (Makefile.am): Likewise.
+ * modules/rmdir (Makefile.am): Likewise.
+ * modules/rpmatch (Makefile.am): Likewise.
+ * modules/safe-read (Makefile.am): Likewise.
+ * modules/safe-write (Makefile.am): Likewise.
+ * modules/same (Makefile.am): Likewise.
+ * modules/save-cwd (Makefile.am): Likewise.
+ * modules/savedir (Makefile.am): Likewise.
+ * modules/setenv (Makefile.am): Likewise.
+ * modules/settime (Makefile.am): Likewise.
+ * modules/sha1 (Makefile.am): Likewise.
+ * modules/sig2str (Makefile.am): Likewise.
+ * modules/snprintf (Makefile.am): Likewise.
+ * modules/stdlib-safer (Makefile.am): Likewise.
+ * modules/stpcpy (Makefile.am): Likewise.
+ * modules/stpncpy (Makefile.am): Likewise.
+ * modules/strcase (Makefile.am): Likewise.
+ * modules/strcasestr (Makefile.am): Likewise.
+ * modules/strchrnul (Makefile.am): Likewise.
+ * modules/strcspn (Makefile.am): Likewise.
+ * modules/strdup (Makefile.am): Likewise.
+ * modules/strerror (Makefile.am): Likewise.
+ * modules/strftime (Makefile.am): Likewise.
+ * modules/strndup (Makefile.am): Likewise.
+ * modules/strnlen (Makefile.am): Likewise.
+ * modules/strpbrk (Makefile.am): Likewise.
+ * modules/strsep (Makefile.am): Likewise.
+ * modules/strstr (Makefile.am): Likewise.
+ * modules/strtod (Makefile.am): Likewise.
+ * modules/strtoimax (Makefile.am): Likewise.
+ * modules/strtok_r (Makefile.am): Likewise.
+ * modules/strtol (Makefile.am): Likewise.
+ * modules/strtoll (Makefile.am): Likewise.
+ * modules/strtoul (Makefile.am): Likewise.
+ * modules/strtoull (Makefile.am): Likewise.
+ * modules/strtoumax (Makefile.am): Likewise.
+ * modules/strverscmp (Makefile.am): Likewise.
+ * modules/time_r (Makefile.am): Likewise.
+ * modules/timegm (Makefile.am): Likewise.
+ * modules/tmpfile-safer (Makefile.am): Likewise.
+ * modules/unistd-safer (Makefile.am): Likewise.
+ * modules/unlinkdir (Makefile.am): Likewise.
+ * modules/userspec (Makefile.am): Likewise.
+ * modules/utime (Makefile.am): Likewise.
+ * modules/utimecmp (Makefile.am): Likewise.
+ * modules/utimens (Makefile.am): Likewise.
+ * modules/vasnprintf (Makefile.am): Likewise.
+ * modules/vasprintf (Makefile.am): Likewise.
+ * modules/vsnprintf (Makefile.am): Likewise.
+ * modules/xalloc (Makefile.am): Likewise.
+ * modules/xgetcwd (Makefile.am): Likewise.
+ * modules/xnanosleep (Makefile.am): Likewise.
+ * modules/xreadlink (Makefile.am): Likewise.
+ * modules/xstrtod (Makefile.am): Likewise.
+ * modules/xstrtol (Makefile.am): Likewise.
+ * modules/xstrtold (Makefile.am): Likewise.
+ * modules/yesno (Makefile.am): Likewise.
+
+2006-10-12 Jim Meyering <jim@meyering.net>
+
+ * m4/getloadavg.m4: Revert the change below.
+
+ * m4/getloadavg.m4 (gl_GETLOADAVG): Test for the existence of
+ lib/getloadavg.c using "ls -L", not "test -f". The latter would
+ fail with a symlink, which is what coreutils' ./bootstrap now
+ creates by default.
+
+2006-10-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/inttypes_.h (_LONG_LONG_FORMAT_PREFIX): Don't define for MSVC or
+ mingw.
+ (_PRI64_PREFIX, _PRIu64_PREFIX, _SCN64_PREFIX, _SCNu64_PREFIX): Handle
+ MSVC and mingw explicitly.
+
+2006-10-11 Simon Josefsson <jas@extundo.com>
+ Bruno Haible <bruno@clisp.org>
+
+ Add support for multiple gnulib-tool invocations in the scope of a
+ single configure.ac file.
+ * gnulib-tool (func_emit_lib_Makefile_am): In the _LIBADD variable,
+ use a private [LT]LIBOBJS variant. Define a _DEPENDENCIES variable
+ with the same contents as the _LIBADD variable.
+ (func_emit_initmacro_start, func_emit_initmacro_end,
+ func_emit_initmacro_done): New functions.
+ (func_import, func_create_testdir): Invoke them. Allow the identifiers
+ gl_LIBOBJS and gl_LTLIBOBJS.
+
+2006-10-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (GETTEXTPATH, AUTOHEADER, AUTOPOINT): New variables.
+ (func_create_testdir): Don't create po/Makefile.am, don't invoke
+ autoreconf. Instead, invoke autopoint explicitly but move back the
+ *.m4 files from gnulib.
+
+2006-10-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_usage): Make module names after --create-testdir
+ optional.
+ (func_create_testdir): If no module was specified, use nearly all
+ modules.
+
+2006-10-12 Jim Meyering <jim@meyering.net>
+
+ Big performance improvement for fts-based tools that use FTS_NOSTAT.
+ Avoid spurious inode-mismatch problems on non-POSIX file systems.
+ Details: http://article.gmane.org/gmane.comp.lib.gnulib.bugs/7416
+ * lib/fts_.h (FTS_DEFER_STAT): Define new flag.
+ (FTS_OPTIONMASK): Extend the mask to reflect this addition.
+ * lib/fts.c (DT_IS_KNOWN, DT_MUST_BE): Define.
+ (FTS_NO_STAT_REQUIRED, FTS_STAT_REQUIRED): Define.
+ (fts_set_stat_required): New function.
+ (fts_open): Defer the calls to fts_stat, if possible or requested.
+ Move the code that maps a command-line fts_info value FTS_DOT to FTS_D
+ into fts_stat itself.
+ (fts_read): Perform any required (deferred) fts_stat call.
+ (fts_build): Likewise, for the directory we're about to open and read.
+ In the readdir loop, carefully decide whether each entry will require
+ an eventual call to fts_stat, using dirent.d_type info if available.
+ (fts_stat): Move the test for whether to honor FTS_COMFOLLOW on
+ a command line argument into this function. Update all callers.
+ Map a return value of FTS_DOT to FTS_D for a command line argument.
+ * modules/fts (Depends-on): Add d-type. Alphabetize.
+ Thanks to Miklos Szeredi for his tenacity and for the initial
+ bug report about "find" failing on a FUSE-based file system.
+
+ * lib/fts.c (fts_open): Use consistent indentation.
+
+2006-10-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/extensions.m4 (AC_USE_SYSTEM_EXTENSIONS): Renamed from
+ gl_USE_SYSTEM_EXTENSIONS, to fix a coreutils bootstrap failure
+ reported by Jim Meyering. All uses of cache variables renamed
+ to match Autoconf's.
+ (gl_USE_SYSTEM_EXTENSIONS): New macro, which simply requires
+ the other one.
+
+ * m4/rename-dest-slash.m4 (gl_FUNC_RENAME_TRAILING_DEST_SLASH):
+ Fix misspelling in diagnostic.
+
+2006-10-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mkdir-p.c (HAVE_FCHMOD): Define to false if not already
+ defined. Problem reported by Matthew Woehlke.
+
+ * lib/inttypes_.h (_LONG_LONG_FORMAT_PREFIX): New macro.
+ Add support for Tandem NonStop R series.
+ (_PRI64_PREFIX, _PRIu64_PREFIX, _SCN64_PREFIX, _SCNu64_PREFIX):
+ Use new macro.
+
+ * lib/rename-dest-slash.c: Include stdbool.h but not string.h.
+ (has_trailing_slash): Omit size arg; all callers changed.
+ Omit 'inline', since it doesn't help performance and we'd
+ need to configure it.
+ Don't count //, ///, etc. as having a trailing slash.
+ As a side effect, this removes a C99ism reported by Matthew Woehlke.
+ (rpl_rename_dest_slash): On failure, use rename's errno rather
+ than (in some cases) an incorrect or junk errno.
+ Simplify code by removing need to compute length; this does
+ cause it to make two passes instead of one over the file name,
+ but it's worth it.
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Undo previous
+ change, since Autoconf's version may no longer be appropriate now
+ that we are using CVS Autoconf's version. Add support for Tandem.
+
+2006-10-11 Paul Eggert <eggert@cs.ucla.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/allocsa.h (sa_alignment_longlong, sa_alignment_max): Test
+ HAVE_LONG_LONG_INT instead of HAVE_LONG_LONG.
+ * m4/allocsa.m4 (gl_ALLOCSA): Invoke AC_TYPE_LONG_LONG_INT instead of
+ gl_AC_TYPE_LONG_LONG.
+
+ * lib/printf-args.h (arg_type, argument): Test HAVE_LONG_LONG_INT
+ instead of HAVE_LONG_LONG.
+ * lib/printf-args.c (printf_fetchargs): Likewise.
+ * lib/printf-parse.c (PRINTF_PARSE): Likewise.
+ * lib/vasnprintf.c (VASNPRINTF): Likewise.
+ * m4/vasnprintf.m4 (gl_PREREQ_PRINTF_ARGS, gl_PREREQ_PRINTF_PARSE,
+ gl_PREREQ_VASNPRINTF): Invoke AC_TYPE_LONG_LONG_INT instead of
+ gl_AC_TYPE_LONG_LONG.
+
+2006-10-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/longlong.m4: Add comments.
+ * m4/ulonglong.m4: Likewise.
+
+2006-10-10 Bruno Haible <bruno@clisp.org>
+
+ Make it possible to #define stpcpy, strdup to aliases.
+ * lib/stpcpy.c (stpcpy) [!_LIBC]: Don't undefine.
+ * lib/strdup.c (strdup) [!_LIBC]: Don't undefine.
+
+2006-10-10 Bruno Haible <bruno@clisp.org>
+
+ Make it possible to #define gcd to an alias.
+ * lib/gcd.c: Include config.h.
+
+2006-10-10 Bruno Haible <bruno@clisp.org>
+
+ Make it possible to #define c_isascii to an alias.
+ * lib/c-ctype.h: Don't define the macros if NO_C_CTYPE_MACROS is
+ defined. Undefine the macros before defining them, to avoid gcc
+ warnings.
+ * lib/c-ctype.c: Include config.h. Don't undefine the macros; instead,
+ define NO_C_CTYPE_MACROS early.
+
+2006-10-10 Bruno Haible <bruno@clisp.org>
+
+ Make it possible to #define set_program_name to an alias.
+ * lib/progname.c: Don't undefine set_program_name; instead, undefine
+ ENABLE_RELOCATABLE early.
+
+2006-10-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port to Tandem NSK OSS, which has 64-bit signed int but at most
+ 32-bit unsigned int. Problem reported by Matthew Woehlke in:
+ http://lists.gnu.org/archive/html/bug-coreutils/2006-10/msg00062.html
+ More generally, don't assume that 64-bit signed int is available
+ if unsigned int is, and vice versa.
+ * lib/inttypes_.h (_PRIu64_PREFIX, _SCNu64_PREFIX): Depend on
+ unsigned symbols, not on their signed counterparts.
+ * lib/stdint_.h (uint64_t, uint_least64_t, uint_fast64_t, uintmax_t):
+ (UINT64_MAX, UINT_LEAST64_MAX, UINT_FAST64_MAX, UINTMAX_MAX):
+ (UINT64_C, UINTMAX_C):
+ Likewise.
+ * lib/strtoimax.c (strtoll): Depend on signed symbols, not their
+ unsigned counterparts.
+ (Have_long_long, Unsigned): New macros.
+ (Int): Renamed from INT.
+ (strtoimax): Use the new macros.
+ * m4/stdint.m4 (gl_STDINT_H): Require AC_TYPE_UNSIGNED_LONG_LONG_INT
+ and substitute HAVE_UNSIGNED_LONG_LONG_INT.
+ * modules/inttypes (inttypes.h): Substitute
+ HAVE_UNSIGNED_LONG_LONG_INT.
+ * modules/stdint (stdint.h): Likewise.
+ (Files): Add m4/ulonglong.m4.
+
+2006-10-10 Bruno Haible <bruno@clisp.org>
+
+ Fix a gcc -Wshadow warning.
+ * lib/gl_anyhash_list2.h (hash_resize): Rename local variable 'index'
+ to 'bucket'.
+ * lib/gl_anylinked_list2.h (gl_linked_search_from_to,
+ gl_linked_indexof_from_to): Likewise.
+ * lib/gl_linkedhash_list.c (add_to_bucket, remove_from_bucket):
+ Likewise.
+ * lib/gl_anytreehash_list1.h (add_to_bucket, remove_from_bucket):
+ Likewise.
+ * lib/gl_anytreehash_list2.h (gl_tree_search_from_to): Likewise.
+ Reported by Eric Blake.
+
+2006-10-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/filemode.h [HAVE_DECL_STRMODE]: Include unistd.h too,
+ for NetBSD. Problem reported by Bruno Haible.
+
+2006-10-09 Jim Meyering <jim@meyering.net>
+
+ * lib/lchown.c: Include <sys/stat.h> before "stat-macros.h".
+ Patch from Bruno Haible.
+
+2006-10-09 Jim Meyering <jim@meyering.net>
+
+ * lib/fts-cycle.c (leave_dir): When "leaving" a top level directory due
+ to FTS_SKIP, don't copy the parent's uninitialized dev/ino values.
+ Trigger with e.g., mkdir d && valgrind ./chmod u+rwx d d
+
+2006-10-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ Don't include <config.h> twice; this doesn't work in some cases,
+ e.g., when config.h has "#define intmax_t long long int" and
+ we include <config.h>, <inttypes.h>, <config.h> in that order.
+ Problem reported by Matthew Woehlke in:
+ http://lists.gnu.org/archive/html/bug-coreutils/2006-10/msg00073.html
+ * lib/fprintftime.c: Don't include config.h or fprintftime.h.
+ * lib/fts-cycle.c: Don't include config.h.
+ * lib/strftime.c: Include fprintftime.h if FPRINTFTIME is defined.
+ * lib/xstrtoimax.c: Remove copyright notice since it's short tnow.
+ Don't include config.h or xstrtol.h. Define STRTOL_T_MINIMUM
+ and STRTOL_T_MAXIMUM unconditionally, since we now assume gnulib
+ inttypes.h.
+ * lib/xstrtoumax.c: Likewise.
+ * lib/xstrtol.c: Include config.h and xstrtol.h after defining
+ __strtol and the like, so that this module is more like its siblings.
+ (STRTOL_T_MINIMUM, STRTOL_T_MAXIMUM) [! defined STRTOL_T_MINIMUM]:
+ Remove; no longer needed now that we assume gnulib inttypes.h.
+
+2006-10-08 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi: Emphasize the drawbacks of the --symlink
+ option.
+
+2006-10-07 Jim Meyering <jim@meyering.net>
+
+ * modules/inttypes (inttypes.h): Revert what seems to have been
+ an inadvertent part of today's change: use "|", not "/" in the
+ substitution for the "/"-containing string, $(ABSOLUTE_INTTYPES_H).
+
+2006-10-07 Bruno Haible <bruno@clisp.org>
+
+ * modules/sublist: New file.
+
+2006-10-07 Bruno Haible <bruno@clisp.org>
+
+ * modules/alloca-opt (alloca.h): Add a "DO NOT EDIT" comment.
+ * modules/argz (argz.h): Likewise.
+ * modules/arpa_inet (arpa/inet.h): Likewise.
+ * modules/byteswap (byteswap.h): Likewise.
+ * modules/configmake (configmake.h): Likewise.
+ * modules/fcntl (fcntl.h): Likewise.
+ * modules/fnmatch (fnmatch.h): Likewise.
+ * modules/getopt (getopt.h): Likewise.
+ * modules/glob (glob.h): Likewise.
+ * modules/inttypes (inttypes.h): Likewise.
+ * modules/netinet_in (netinet/in.h): Likewise.
+ * modules/poll (poll.h): Likewise.
+ * modules/stdbool (stdbool.h): Likewise.
+ * modules/stdint (stdint.h): Likewise.
+ * modules/sys_select (sys/select.h): Likewise.
+ * modules/sys_socket (sys/socket.h): Likewise.
+ * modules/sys_stat (sys/stat.h): Likewise.
+ * modules/sysexits (sysexits.h): Likewise.
+ * modules/unistd (unistd.h): Likewise.
+ * gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+ Add a "DO NOT EDIT" comment to the generated file.
+ (func_import): Likewise for gnulib-comp.m4.
+
+2006-10-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_sublist.h: New file.
+ * lib/gl_sublist.c: New file.
+
+2006-10-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mkancesdirs.c (mkancesdirs): Pass to MAKE_DIR both the full file
+ name (relative to the original working directory) and the file
+ name component (relative to the temporary working directory). All
+ callers changed.
+ * lib/mkancesdirs.h (mkancesdirs): Adjust prototype to match.
+ * lib/mkdir-p.c (make_dir_parents): Likewise.
+ * lib/mkdir-p.h (make_dir_parents): Likewise.
+
+2006-10-06 Eric Blake <ebb9@byu.net>
+
+ Define several macros for use by the clean-temp module.
+ * m4/close-stream.m4 (gl_CLOSE_STREAM): Define GNULIB_CLOSE_STREAM.
+ * m4/fcntl-safer.m4 (gl_FCNTL_SAFER): Define GNULIB_FCNTL_SAFER.
+ * m4/stdio-safer.m4 (gl_FOPEN_SAFER): Define GNULIB_FOPEN_SAFER.
+
+ * lib/clean-temp.h (close_stream_temp): New declaration.
+ * lib/clean-temp.c (includes): Pull in headers according to what
+ other modules are in use.
+ (close_stream_temp) [GNULIB_CLOSE_STREAM]: New function.
+
+2006-10-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/javacomp.c (write_temp_file): Use fopen_temp, fwriteerror_temp
+ instead of fopen, fwriteerror.
+
+2006-10-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/clean-temp.h (cleanup_temp_file, cleanup_temp_subdir,
+ cleanup_temp_dir_contents, cleanup_temp_dir): Change return type to
+ int.
+ * lib/clean-temp.c (do_unlink, do_rmdir, cleanup_temp_file,
+ cleanup_temp_subdir, cleanup_temp_dir_contents, cleanup_temp_dir):
+ Return an error indicator.
+ Suggested by Eric Blake.
+
+2006-10-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/clean-temp.c (PATH_MAX): Provide a fallback for GNU Hurd.
+ Reported by Eric Blake.
+
+2006-10-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/closeout (Description): Mention stderr too.
+
+2006-10-06 Bruno Haible <bruno@clisp.org>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/closeout.c (close_stdout): Also close stderr.
+ * lib/closeout.h: Update comment.
+
+2006-10-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix some Darwin-7.9.0 porting problems reported by Bruno Haible in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2006-10/msg00063.html>.
+ * lib/dirchownmod.c: Include lchown.h.
+ * lib/lchown.c: Don't include files that lchown.h now includes.
+ Don't declare chown, since lchown.h now does that.
+ * lib/lchown.h: Include errno.h, sys/types.h, unistd.h.
+ (lchown): Define to rpl_chown if lchown is declared but
+ does not exist. Declare using a prototype if lchown is not
+ declared. Add a copyright notice.
+ * lib/mkstemp.h: Include <unistd.h>.
+ * lib/openat.c: Include lchown.h.
+
+ * lib/fcntl_.h (O_NOFOLLOW): Don't depend on O_NOFOLLOW_IS_INEFFECTIVE;
+ we now test for that separately.
+ * lib/fts.c (fts_safe_changedir): Inspect HAVE_WORKING_O_NOFOLLOW
+ rather than O_NOFOLLOW, when testing whether it's possible to
+ avoid a race condition reliably.
+ * lib/savewd.c (savewd_chdir): Likewise.
+
+ Remove macros that are no longer needed now that stdint.h is
+ reliable.
+ * lib/fsusage.c (UINTMAX_MAX): Remove.
+ * lib/human.c (SIZE_MAX, UINTMAX_MAX): Remove.
+ * lib/utimecmp.c (SIZE_MAX): Remove.
+
+ * m4/lchown.m4 (gl_FUNC_LCHOWN): Check whether lchown is declared.
+
+ * m4/fcntl_h.m4 (gl_FCNTL_H): Define HAVE_WORKING_O_NOFOLLOW instead
+ of O_NOFOLLOW_IS_INEFFECTIVE. Define HAVE_WORKING_O_NOATIME if
+ O_NOATIME works.
+
+2006-10-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_list.h (gl_sortedlist_search_from_to,
+ gl_sortedlist_indexof_from_to): New declarations.
+ (gl_list_implementation): New fields sortedlist_search_from_to,
+ sortedlist_indexof_from_to.
+ (gl_sortedlist_search_from_to, gl_sortedlist_indexof_from_to): New
+ inline functions.
+ * lib/gl_list.c (gl_sortedlist_search_from_to,
+ gl_sortedlist_indexof_from_to): New functions.
+ * lib/gl_array_list.c (gl_array_sortedlist_indexof_from_to): New
+ function.
+ (gl_array_sortedlist_indexof, gl_array_sortedlist_search): Use it.
+ (gl_array_sortedlist_search_from_to): New function.
+ (gl_array_list_implementation): Update.
+ * lib/gl_carray_list.c (gl_carray_sortedlist_indexof_from_to): New
+ function.
+ (gl_carray_sortedlist_indexof, gl_carray_sortedlist_search): Use it.
+ (gl_carray_sortedlist_search_from_to): New function.
+ (gl_carray_list_implementation): Update.
+ * lib/gl_anylinked_list2.h (gl_linked_sortedlist_search_from_to,
+ gl_linked_sortedlist_indexof_from_to): New functions.
+ * lib/gl_linked_list.c (gl_linked_list_implementation): Update.
+ * lib/gl_linkedhash_list.c (gl_linkedhash_list_implementation): Update.
+ * lib/gl_anytree_list2.h (gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof_from_to): New functions.
+ * lib/gl_avltree_list.c (gl_avltree_list_implementation): Update.
+ * lib/gl_avltreehash_list.c (gl_avltreehash_list_implementation):
+ Update.
+ * lib/gl_rbtree_list.c (gl_rbtree_list_implementation): Update.
+ * lib/gl_rbtreehash_list.c (gl_avltreehash_list_implementation):
+ Update.
+
+2006-10-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_list.h (gl_list_search_from, gl_list_search_from_to,
+ gl_list_indexof_from, gl_list_indexof_from_to): New declarations.
+ (struct gl_list_implementation): Add fields search_from_to,
+ indexof_from_to. Remove fields search, indexof.
+ (gl_list_search): Use the search_from_to method.
+ (gl_list_search_from, gl_list_search_from_to): New functions.
+ (gl_list_indexof): Use the indexof_from_to method.
+ (gl_list_indexof_from, gl_list_indexof_from_to): New functions.
+ * lib/gl_list.c (gl_list_search): Use the search_from_to method.
+ (gl_list_search_from, gl_list_search_from_to): New functions.
+ (gl_list_indexof): Use the indexof_from_to method.
+ (gl_list_indexof_from, gl_list_indexof_from_to): New functions.
+ * lib/gl_array_list.c (gl_array_indexof_from_to): Renamed from
+ gl_array_indexof. Add start_index, end_index arguments.
+ (gl_array_search_from_to): Renamed from gl_array_search. Add
+ start_index, end_index arguments.
+ (gl_array_remove, gl_array_list_implementation): Update.
+ * lib/gl_carray_list.c (gl_carray_indexof_from_to): Renamed from
+ gl_carray_indexof. Add start_index, end_index arguments.
+ (gl_carray_search_from_to): Renamed from gl_carray_search. Add
+ start_index, end_index arguments.
+ (gl_carray_remove, gl_carray_list_implementation): Update.
+ * lib/gl_anylinked_list2.h (gl_linked_search_from_to): Renamed from
+ gl_linked_search. Add start_index, end_index arguments.
+ (gl_linked_indexof_from_to): Renamed from gl_linked_indexof. Add
+ start_index, end_index arguments.
+ (gl_linked_remove): Update.
+ * lib/gl_linked_list.c (gl_linked_list_implementation): Update.
+ * lib/gl_linkedhash_list.c (gl_linkedhash_list_implementation): Update.
+ * lib/gl_anytree_list1.h (iterstack_item_t): Change type of 'rightp'
+ field to 'size_t'.
+ * lib/gl_anytree_list2.h (gl_tree_search_from_to): Renamed from
+ gl_tree_search. Add start_index, end_index arguments.
+ (gl_tree_indexof_from_to): Renamed from gl_tree_indexof. Add
+ start_index, end_index arguments.
+ (gl_tree_remove): Update.
+ * lib/gl_avltree_list.c (gl_avltree_list_implementation): Update.
+ * lib/gl_rbtree_list.c (gl_rbtree_list_implementation): Update.
+ * lib/gl_anytreehash_list1.h (compare_position_threshold): New
+ function.
+ * lib/gl_anytreehash_list2.h (gl_tree_search_from_to): Renamed from
+ gl_tree_search. Add start_index, end_index arguments.
+ (gl_tree_indexof_from_to): Renamed from gl_tree_indexof. Add
+ start_index, end_index arguments.
+ * lib/gl_avltreehash_list.c (gl_avltreehash_list_implementation):
+ Update.
+ * lib/gl_rbtreehash_list.c (gl_rbtreehash_list_implementation): Update.
+
+2006-10-05 Bruno Haible <bruno@clisp.org>
+
+ * modules/fwriteerror (configure.ac): Define GNULIB_FWRITEERROR.
+
+ * lib/clean-temp.h (open_temp, fopen_temp, close_temp, fclose_temp,
+ fwriteerror_temp): New declarations.
+ * lib/clean-temp.c (uintptr_t): Provide fallback definition.
+ (descriptors): New variable.
+ (cleanup): First, close the descriptors.
+ (register_fd, unregister_fd, open_temp, fopen_temp, close_temp,
+ fclose_temp, fwriteerror_temp): New functions.
+
+2006-10-04 Jim Meyering <jim@meyering.net>
+
+ * lib/fts.c (fts_open): Tiny comment change.
+
+2006-10-04 Bruno Haible <bruno@clisp.org>
+
+ Make it possible to invoke AC_GNU_SOURCE after gl_LOCK_EARLY.
+ * m4/lock.m4 (gl_LOCK_EARLY_BODY): New macro, extracted code from
+ gl_LOCK_BODY.
+ (gl_LOCK_EARLY): Require gl_LOCK_EARLY_BODY, not gl_LOCK_BODY.
+ (gl_LOCK_BODY): Remove settings of CPPFLAGS, now done in
+ gl_LOCK_EARLY_BODY.
+ (gl_LOCK): Require gl_LOCK_BODY.
+
+2006-10-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_oset.h (gl_setelement_threshold_fn): New type.
+ (gl_oset_search_atleast): New declaration.
+ (struct gl_oset_implementation): Add field 'search_atleast'.
+ (gl_oset_search_atleast): New inline function.
+ * lib/gl_oset.c (gl_oset_search_atleast): New function.
+ * lib/gl_array_oset.c (gl_array_search_atleast): New function.
+ (gl_array_oset_implementation): Update.
+ * lib/gl_anytree_oset.h (gl_tree_search_atleast): New function.
+ * lib/gl_avltree_oset.c (gl_avltree_oset_implementation): Update.
+ * lib/gl_rbtree_oset.c (gl_rbtree_oset_implementation): Update.
+
+2006-10-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/fatal-signal.c (fatal_signals) [WOE32]: Add the SIGBREAK signal.
+
+2006-10-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_rbtreehash_list.c (gl_rbtreehash_list_implementation): Renamed
+ from gl_avltreehash_list_implementation.
+
+2006-10-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_oset.c (gl_oset_add): Fix return type.
+
+2006-10-02 Paolo Bonzini <bonzini@gnu.org> (tiny change)
+
+ * lib/quotearg.c (mbstate_t) [!HAVE_MBRTOWC]: #define to int.
+
+2006-10-02 Eric Blake <ebb9@byu.net>
+
+ * modules/strnlen (Depends-on): Add extensions.
+
+2006-10-02 Eric Blake <ebb9@byu.net>
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Use autoconf's
+ definition in 2.60+.
+
+2006-10-02 Dmitry V. Levin <ldv@altlinux.org>
+
+ * lib/fts.c (fts_close, fts_build, fts_palloc): Remove redundant
+ checks.
+
+2006-10-02 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Don't add no-dependencies
+ to the AUTOMAKE_OPTIONS.
+ Reported by Jim Meyering.
+
+2006-09-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ Work around bug in Solaris 10 /proc file system:
+ /proc/self/fd/NNN/.. isn't the parent directory of
+ the directory whose file descriptor is NNN. This needs to
+ be worked around at run time, not compile time, since a
+ program might be built on Solaris 8, where things work, and
+ run on Solaris 10.
+ * lib/openat-priv.h (BUILD_PROC_NAME): Remove. All callers changed
+ to use the following interface instead:
+ (OPENAT_BUFFER_SIZE): New macro.
+ (openat_proc_name): New function.
+ * lib/at-func.c (AT_FUNC_NAME): Adjust to above changes.
+ * lib/openat.c (openat_permissive, openat_needs_fchdir, fdopendir):
+ Likewise.
+ * lib/openat-proc.c: New file.
+ * modules/openat (Files): Add lib/openat-proc.c.
+ (Depends-on): Add same-inode, stdbool.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Add AC_LIBOBJ(openat-proc).
+
+2006-09-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/fwriteerror.h (fwriteerror_no_ebadf): New declaration.
+ * lib/(do_fwriteerror): Renamed from fwriteerror. Add ignore_ebadf
+ argument. Set stdout_closed before testing for ferror, not after.
+ (fwriteerror, fwriteerror_no_ebadf): New functions.
+
+2006-09-28 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/intmax.m4 (gt_TYPE_INTMAX_T): Avoid unused variables warning.
+
+2006-09-28 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/poll.c (rpl_poll) [__APPLE__]: Use FIONREAD instead of MSG_PEEK.
+ * m4/poll.m4: Look for sys/ioctl.h and sys/filio.h.
+
+2006-09-28 Jim Meyering <jim@meyering.net>
+
+ * lib/mkdir-p.c: Include "dirchownmod.h", not "dirchownmod.c".
+ Include <unistd.h>.
+
+2006-09-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/avltreehash-list (Depends-on): Add stdint, remove size_max.
+ * modules/linkedhash-list (Depends-on): Likewise.
+ * modules/rbtreehash-list (Depends-on): Likewise.
+
+2006-09-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/strndup.h: Simplify the redefinition of strndup.
+ (_GL_CONCAT, _GL_XCONCAT, __STRNDUP_ID): Remove macros.
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): Don't define __STRNDUP_PREFIX.
+
+2006-09-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_avltreehash_list.c: Include <stdint.h> instead of size_max.h.
+ * lib/gl_linkedhash_list.c: Likewise.
+ * lib/gl_rbtreehash_list.c: Likewise.
+
+2006-09-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/canon-host.c (canon_host_r): Work around bug in Darwin 7.9.0
+ getaddrinfo.
+
+ * lib/__fpending.h: Don't include <stdio_ext.h> unless
+ HAVE_DECL___FPENDING. This avoids a bug with lsbcc, where
+ it causes <stdio_ext.h> to cause a compile-time error.
+ Problem reported by Nelson H. F. Beebe.
+ * lib/getpass.c: Likewise, except for HAVE_DECL___FSETLOCKING instead
+ of HAVE_DECL___PENDING.
+
+ * m4/fpending.m4 (gl_FUNC_FPENDING): Check for stdio_ext at most once.
+ * m4/getpass.m4 (gl_PREREQ_GETPASS): Check for __fsetlocking's
+ declaration.
+
+2006-09-27 Jim Meyering <jim@meyering.net>
+
+ This file could end up with a definition for a function
+ named __strndup, rather than rpl_strndup on a system with
+ incomplete weak_alias support.
+ * lib/strndup.c (strndup): Rename from __strndup.
+ Remove #defines that used to map __strndup to strndup.
+ Don't use K&R prototypes.
+ Remove LIBC-related code, since this file is not sync'd with glibc.
+ * lib/strndup.h: Revamp, accordingly.
+ * m4/strndup.m4: Modernize.
+
+2006-09-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/savewd (Depends-on): Add 'raise'.
+ * lib/savewd.c: Include <signal.h>, for 'raise'.
+
+2006-09-26 Jim Meyering <jim@meyering.net>
+
+ * m4/acl.m4 (AC_FUNC_ACL): Disable ACL support altogether
+ when we detect Darwin 8.7.0's acl_get_file bug.
+ Rearrange to perform the new (below) run-test while $LIBS
+ contains any acl-related library. Set USE_ACL at the end.
+ (gl_ACL_GET_FILE): New function.
+
+2006-09-26 Eric Blake <ebb9@byu.net>
+
+ * lib/verror.c: Include <config.h> unconditionally.
+
+2006-09-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/clock-time (Maintainer): Add self.
+ * modules/getlogin_r (Depends-on): Add extensions.
+
+2006-09-25 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/clock-time: New module.
+ * modules/nanosleep (Depends-on): Add clock-time.
+ * modules/gethrxtime (Depends-on): Likewise.
+ * modules/gettime (Depends-on): Likewise.
+ * modules/settime (Depends-on): Likewise.
+
+ * modules/fts-lgpl: Depend on openat.
+ * modules/mkancesdirs: Depend on savewd.
+ * modules/mkdir-p: Likewise.
+
+2006-09-25 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/host-os.m4 (gl_HOST_OS): Require AC_CANONICAL_HOST.
+
+ * m4/chdir-long.m4 (gl_FUNC_CHDIR_LONG): Rename cache variable from
+ `gl_have_arbitrary_file_name_length_limit' to
+ `gl_cv_have_arbitrary_file_name_length_limit', so that caching
+ actually works between configure runs.
+
+2006-09-25 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/stpncpy.m4 (gl_FUNC_STPNCPY): Include <string.h>.
+
+2006-09-25 Jim Meyering <jim@meyering.net>
+
+ * m4/fcntl_h.m4 (gl_FCNTL_H): Fix typo in test for failed open.
+ This typo caused coreutils/tests/dd/misc to fail on Darwin 8.7.0.
+
+2006-09-25 Eric Blake <ebb9@byu.net>
+
+ * gnulib-tool (func_import, func_create_testdir): Fix typos in
+ exec's in 2006-09-18 patch when shuffling fds.
+
+2006-09-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/getloadavg.m4 (gl_GETLOADAVG): Fix directory in error message.
+ Reported by Jim Meyering.
+
+2006-09-24 Jim Meyering <jim@meyering.net>
+
+ * m4/ls-mntd-fs.m4 (gl_LIST_MOUNTED_FILE_SYSTEMS): Don't use '>' to
+ compare a pointer against a literal "0". That caused failures with
+ at least HP-UX's hpcc.
+
+2006-09-22 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-sha1:
+ * modules/gc-md4:
+ * modules/gc-hmac-sha1:
+ * modules/gc-hmac-md5:
+ * modules/gc-des:
+ * modules/gc-arcfour: Distribute more files.
+
+2006-09-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/gl_anylinked_list2.h [lint] (gl_linked_iterator)
+ (gl_linked_iterator_from_to): Initialize struct completely.
+ * lib/gl_anytree_list2.h [lint] (gl_tree_iterator): Likewise.
+ (gl_tree_iterator_from_to): Likewise
+ * lib/gl_anytree_oset.h [lint] (gl_tree_iterator): Likewise.
+ * lib/gl_array_list.c [lint] (gl_array_iterator)
+ (gl_array_iterator_from_to): Likewise.
+ * lib/gl_array_oset.c [lint] (gl_array_iterator): Likewise.
+ * lib/gl_carray_list.c [lint] (gl_carray_iterator)
+ (gl_carray_iterator_from_to): Likewise.
+
+ * lib/gc-gnulib.c [GC_USE_HMAC_SHA1]: include hmac.h for hmac_sha1.
+ * lib/md4.c (md4_process_block): Remove unused variable.
+ * lib/rijndael-api-fst.c (rijndaelBlockDecrypt): GCC suggests
+ parentheses for clarity.
+
+2006-09-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * modules/bison-i18n (Depends-on): Add gettext.
+
+2006-09-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/fsusage.m4 (gl_STATFS_TRUNCATES): Avoid unused variable.
+ * m4/getdate.m4 (gl_C_COMPOUND_LITERALS): Likewise.
+ * m4/jm-winsz1.m4 (gl_HEADER_TIOCGWINSZ_IN_TERMIOS_H): Likewise;
+ also add missing comma that caused broken test.
+ * m4/link-follow.m4 (gl_AC_FUNC_LINK_FOLLOWS_SYMLINK): Include
+ stdlib.h, for `abort'.
+ * m4/ls-mntd-fs.m4 (gl_LIST_MOUNTED_FILE_SYSTEMS): Avoid unused
+ variables.
+ * m4/mkdir-slash.m4 (gl_FUNC_MKDIR_TRAILING_SLASH): Check for and
+ include unistd.h if present, for `rmdir'.
+ * m4/physmem.m4 (gl_SYS__SYSTEM_CONFIGURATION): Avoid unused
+ variables.
+ * m4/putenv.m4 (gl_FUNC_PUTENV): Rewrite using AC_RUN_IFELSE, and
+ in the process include standard headers for prototypes.
+ * m4/readutmp.m4 (gl_READUTMP): Require AC_GNU_SOURCE, so utmpxname
+ gets declared on GNU/Linux.
+ * m4/rmdir-errno.m4 (gl_FUNC_RMDIR_NOTEMPTY): Check for and include
+ unistd.h, for `rmdir'.
+ * m4/time_r.m4 (gl_TIME_R): Avoid unused variables.
+
+ * m4/fnmatch.m4 (_AC_FUNC_FNMATCH_IF): Avoid expression that is
+ always true.
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): include stdlib.h, for `free'.
+
+ * m4/sockpfaf.m4 (gl_SOCKET_FAMILIES): Avoid gcc -Wall warnings.
+
+2006-09-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_version): Create output all at once. This
+ may help avoid triggering unnecessary SIGPIPEs, and at any
+ rate it doesn't hurt.
+
+2006-09-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/lock.m4 (gl_LOCK_BODY): Avoid unused variables warning.
+ * m4/mbswidth.m4 (gl_MBSWIDTH): Likewise.
+ * m4/signed.m4 (bh_C_SIGNED): Likewise.
+
+ * m4/vasprintf.m4 (gl_PREREQ_VASPRINTF_H): New macro.
+ (gl_FUNC_VASPRINTF): Invoke it.
+
+2006-09-22 Bruno Haible <bruno@clisp.org>
+
+ * m4/getloadavg.m4 (gl_GETLOADAVG): Expect the directory of
+ getloadavg.c as first argument.
+
+2006-09-22 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir): Set gl_source_base
+ at the beginning of the gl_INIT macro.
+ * modules/getloadavg (configure.ac): Pass $gl_source_base to
+ gl_GETLOADAVG.
+
+2006-09-22 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_megatestdir): Don't include the config-h
+ module.
+ Suggested by Ralf Wildenhues.
+
+2006-09-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ Import this patch from libc:
+
+ 2006-09-06 Jakub Jelinek <jakub@redhat.com>
+
+ * lib/regex_internal.c (re_string_reconstruct): Handle
+ offset < pstr->valid_raw_len && pstr->offsets_needed case.
+ Ensure no bytes read before raw_mbs array. Pass a saved copy of
+ pstr->valid_len - 1 rather than pstr->valid_raw_len - 1 to
+ re_string_context_at.
+
+ * m4/regex.m4 (gl_REGEX): Check for locale.h, since the test
+ now requires it.
+ (gl_PREREQ_REGEX): Don't check for locale.h any more, since
+ gl_REGEX now does it for us.
+ (gl_REGEX): Add test taken from
+ http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html.
+
+ * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Require AC_SYS_LARGEFILE.
+ Check that large offsets work. Modernize Autoconf usages.
+ Prefer "yes" to mean a good thing rather than a bad.
+ Don't put "#define mkstemp" in config.h, as this might interfere
+ with standard system headers that "#define mkstemp mkstemp64".
+
+ * modules/mkstemp (Depends-on): Add extensions, so that
+ mkstemp is visible on some platforms.
+ (Makefile.am): Add mkstemp.h to EXTRA_DIST.
+ (Include): Change to "mkstemp.h" from <stdlib.h>.
+ (Files): Add mkstemp.h.
+
+ * lib/mkstemp.h: New file, since some standard headers
+ #define mkstemp.
+ * lib/mkstemp.c: Revamp to put the !_LIBC code together.
+ Include "mkstemp.h".
+ Make the _LIBC code resemble glibc original more,
+ e.g., use K&R style.
+ * lib/mkstemp-safer.c: Include "mkstemp.h" instead of <stdlib.h>.
+ (mkstemp): Remove, since mkstemp.h does this for us.
+ * lib/stdlib--.h: Include mkstemp.h.
+
+ Import this patch from libc:
+
+ 2006-04-07 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/tempname.c (__gen_tempname): Change attempts_min
+ into a macro. Use preprocessor to decide how to initialize
+ attempts [Coverity CID 67].
+
+2006-09-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/mkdtemp.c: Import from libc.
+ 2006-04-07 Ulrich Drepper <drepper@redhat.com>
+ * sysdeps/posix/tempname.c (__gen_tempname): Change
+ attempts_min into a macro. Use preprocessor to decide how to
+ initialize attempts [Coverity CID 67].
+ 2001-11-27 Paul Eggert <eggert@twinsun.com>
+ * sysdeps/posix/tempname.c (__gen_tempname): Try at least
+ ATTEMPTS_MIN or TMP_MAX times, whichever is greater.
+
+2006-09-19 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_exit): New function, to allow to pass the
+ exit status portably through the trap. Use everywhere.
+ (--help, --version): Signal a write error.
+ (trap): catch SIGPIPE, for write errors.
+ Exit at the end of the trap, with the correct exit status.
+
+2006-09-19 Karl Berry <karl@gnu.org>
+
+ * doc/gnulib.texi: note about the license texinfo files.
+
+2006-09-19 Eric Blake <ebb9@byu.net>
+
+ * gnulib-tool: Avoid space-tab.
+
+2006-09-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getaddrinfo.c (getaddrinfo) [defined HAVE_IPV6]: Fix typo
+ that prevented coreutils 6.1 from building. Problem reported
+ by Petter Reinholdtsen.
+
+2006-09-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool (avoidlist): Fix typo that broke options like
+ --avoid=lock that are used by coreutils bootstrap.
+
+2006-09-18 Mark D. Baushke <mdb@gnu.org>
+
+ * m4/inttypes.m4 (gl_INTTYPES_H): Quote "test" args
+ more systematically.
+
+2006-09-18 Jim Meyering <jim@meyering.net>
+
+ * lib/savewd.c (savewd_restore): Don't shadow: s/status/child_status/.
+
+2006-09-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/inttypes (Files): Remove m4/inttypes-h.m4.
+
+2006-09-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/inttypes-h.m4 (gl_HEADER_INTTYPES_H): Remove macro.
+ * m4/inttypes-pri.m4: Require autoconf >= 2.52.
+ (gt_INTTYPES_PRI): Invoke AC_CHECK_HEADERS on inttypes.h. Test
+ ac_cv_header_inttypes_h instead of gl_cv_header_inttypes_h.
+ * m4/gettext.m4: Require autoconf >= 2.52.
+ (gt_INTL_SUBDIR_CORE): Invoke AC_CHECK_HEADERS on inttypes.h.
+ * m4/inttypes.m4 (gl_INTTYPES_H): Test ac_cv_header_inttypes_h instead
+ of gl_cv_header_inttypes_h.
+
+2006-09-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/javaversion.c: Include configmake.h.
+
+2006-09-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir): Use exec tricks to
+ avoid that the while loops be executed in a subshell.
+
+2006-09-18 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (func_module): Break long lines.
+ Suggested by Bruce Korb <bkorb@gnu.org>.
+
+2006-09-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Speed up by a factor of 1.12.
+ * gnulib-tool (nl): New variable.
+ (func_import): Rewrite include directive extraction to only read each
+ directive once.
+
+2006-09-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/javaversion (Makefile.am): Remove DEFS setting.
+ (Depends-on): Add configmake, for PKGDATADIR definition.
+
+2006-09-17 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Rewrite all files at once.
+
+2006-09-17 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_append): New function, stolen from libtool.m4.
+ (func_modules_transitive_closure, func_modules_add_dummy,
+ func_modules_to_filelist, func_import, func_create_testdir,
+ func_create_megatestdir, ...): Use it wherever possible.
+ Suggested by Ralf Wildenhues.
+
+2006-09-16 Karl Berry <karl@gnu.org>
+
+ * doc/fdl.texi (ADDENDUM): switch to @heading from @appendixsubsec,
+ to avoid sectioning errors.
+ * doc/lgpl.texi, gpl.texi (Copying): downcase @unnumbered title.
+ [ifinfo]: blank line after @center-ed titles.
+ * doc/lgpl.texi (Library Copying): Rename main node to GNU LGPL.
+ Spell FSF address consistently with others.
+ (These changes approved by rms.)
+
+2006-09-15 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Speed up by a factor of 1.61.
+ * gnulib-tool (func_modules_transitive_closure): Rewrite to not check
+ already checked module names again.
+
+2006-09-15 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Speed up by a factor of 1.13.
+ * gnulib-tool (func_import): Rewrite all old_files at once; likewise
+ for new_files, and the input to func_add_or_update.
+
+2006-09-15 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_all_modules, func_modules_to_filelist, func_import,
+ func_create_testdir, ...): Change 'sort | uniq' to 'sort -u'.
+
+2006-09-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/mkancesdirs (Depends-on): Add fcntl.
+ * modules/savewd: New file.
+ * MODULES.html.sh (File system functions): Add savewd.
+
+ * modules/configmake (Makefile.am): Add support for the
+ Automake-supplied PKGLIBDIR, PKGINCLUDEDIR, PKGDATADIR.
+
+2006-09-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/savewd.m4: New file.
+
+2006-09-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/dirchownmod.c: Don't include fcntl.h; no longer needed.
+ (dirchownmod): New arg FD. All callers changed.
+ Use FD rather than opening the directory ourself, as opening is
+ now the caller's responsibility.
+ * lib/dirchownmod.h: Likewise.
+ * lib/mkancesdirs.c: Include <sys/types.h>, for portability to older
+ hosts that require <sys/types.h> before <sys/stat.h>. Include
+ fcntl.h, savewd.h, and unistd.h, not dirname.h and stat-macros.h.
+ (test_dir): Remove.
+ (mkancesdirs): Return length of prefix of FILE that has already
+ been made, or -2 if there is a child doing the work. Redo
+ algorithm so that it is O(N) rather than O(N**2). Optimize away
+ ".", and treat ".." specially since it might stray back into
+ already-created areas. Use a subprocess if necessary. New arg
+ WD; all users changed. MAKE_DIR function should now return 1
+ if it creates a directory that is not readable. Return -2 if
+ a child process is spun off.
+ * lib/mkancesdirs.h: Include <stddef.h>, for ptrdiff_t.
+ Adjust signature to match code.
+ * lib/mkdir-p.c: Include dirname.h, for IS_ABSOLUTE_FILE_NAME.
+ (make_dir_parents): Use a subprocess if necessary. New arg WD;
+ all users changed.
+ * lib/savewd.c, lib/savewd.h: New files.
+
+2006-09-15 Jim Meyering <jim@meyering.net>
+
+ * modules/rename-dest-slash: New module.
+ * MODULES.html.sh (posix_compat): Add it here.
+
+ * modules/rename: Reflect vb_FUNC_RENAME -> gl_FUNC_RENAME change.
+
+2006-09-15 Jim Meyering <jim@meyering.net>
+
+ * m4/rename-dest-slash.m4 (gl_FUNC_RENAME_TRAILING_DEST_SLASH): New
+ file.
+
+ * m4/rename.m4 (gl_FUNC_RENAME): Rename from vb_FUNC_RENAME.
+
+2006-09-15 Jim Meyering <jim@meyering.net>
+
+ * lib/rename-dest-slash.c (has_trailing_slash): Use
+ FILE_SYSTEM_PREFIX_LEN, for non-POSIX systems.
+ (rpl_rename_dest_slash): Perform the cheaper trailing slash
+ test before testing whether SRC is a directory.
+ Suggestions from Bruno Haible.
+
+ Avoid a warning about an unused variable.
+ * lib/regex_internal.c (re_dfa_add_node): Move declaration of "type"
+ into the #ifdef block where it's used.
+
+ * lib/rename-dest-slash.c: New file.
+
+2006-09-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/allocsa.c: Include <config.h> unconditionally.
+ * lib/asnprintf.c: Likewise.
+ * lib/asprintf.c: Likewise.
+ * lib/c-strcasecmp.c: Likewise.
+ * lib/c-strcasestr.c: Likewise.
+ * lib/c-strncasecmp.c: Likewise.
+ * lib/c-strstr.c: Likewise.
+ * lib/classpath.c: Likewise.
+ * lib/clean-temp.c: Likewise.
+ * lib/concatpath.c: Likewise.
+ * lib/copy-file.c: Likewise.
+ * lib/csharpcomp.c: Likewise.
+ * lib/csharpexec.c: Likewise.
+ * lib/execute.c: Likewise.
+ * lib/fatal-signal.c: Likewise.
+ * lib/findprog.c: Likewise.
+ * lib/fwriteerror.c: Likewise.
+ * lib/gl_array_list.c: Likewise.
+ * lib/gl_array_oset.c: Likewise.
+ * lib/gl_avltree_list.c: Likewise.
+ * lib/gl_avltree_oset.c: Likewise.
+ * lib/gl_avltreehash_list.c: Likewise.
+ * lib/gl_carray_list.c: Likewise.
+ * lib/gl_linked_list.c: Likewise.
+ * lib/gl_linkedhash_list.c: Likewise.
+ * lib/gl_list.c: Likewise.
+ * lib/gl_oset.c: Likewise.
+ * lib/gl_rbtree_list.c: Likewise.
+ * lib/gl_rbtree_oset.c: Likewise.
+ * lib/gl_rbtreehash_list.c: Likewise.
+ * lib/imaxabs.c: Likewise.
+ * lib/imaxdiv.c: Likewise.
+ * lib/javacomp.c: Likewise.
+ * lib/javaexec.c: Likewise.
+ * lib/javaversion.c: Likewise.
+ * lib/linebreak.c: Likewise.
+ * lib/localcharset.c: Likewise.
+ * lib/lock.c: Likewise.
+ * lib/mbchar.c: Likewise.
+ * lib/mbswidth.c: Likewise.
+ * lib/mkdtemp.c: Likewise.
+ * lib/pipe.c: Likewise.
+ * lib/printf-args.c: Likewise.
+ * lib/printf-parse.c: Likewise.
+ * lib/progname.c: Likewise.
+ * lib/progreloc.c: Likewise.
+ * lib/readlink.c: Likewise.
+ * lib/sh-quote.c: Likewise.
+ * lib/stpcpy.c: Likewise.
+ * lib/stpncpy.c: Likewise.
+ * lib/strcasecmp.c: Likewise.
+ * lib/strcasestr.c: Likewise.
+ * lib/strcspn.c: Likewise.
+ * lib/striconv.c: Likewise.
+ * lib/strncasecmp.c: Likewise.
+ * lib/strnlen1.c: Likewise.
+ * lib/strstr.c: Likewise.
+ * lib/strtok_r.c: Likewise.
+ * lib/tls.c: Likewise.
+ * lib/tmpdir.c: Likewise.
+ * lib/unicodeio.c: Likewise.
+ * lib/unsetenv.c: Likewise.
+ * lib/vasnprintf.c: Likewise.
+ * lib/vasprintf.c: Likewise.
+ * lib/wait-process.c: Likewise.
+ * lib/xallocsa.c: Likewise.
+ * lib/xsetenv.c: Likewise.
+ * lib/xstriconv.c: Likewise.
+
+2006-09-13 Simon Josefsson <jas@extundo.com>
+
+ * m4/getdate.m4: Don't AC_LIBOBJ([getdate]), automake takes care of
+ that internally, suggested by Ralf Wildenhues
+ <Ralf.Wildenhues@gmx.de>.
+
+2006-09-13 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Use $(LIBOBJS), not
+ @LIBOBJS@.
+ Suggested by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2006-09-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/_fpending.c: Include <config.h> unconditionally, since we no
+ longer worry about uses that don't define HAVE_CONFIG_H.
+ * lib/acl.c, lib/alloca.c, lib/argmatch.c, lib/atexit.c:
+ * lib/backupfile.c, lib/basename.c, lib/c-stack.c, lib/c-strtod.c:
+ * lib/calloc.c,lib/ canon-host.c, lib/canonicalize.c, lib/chdir-long.c:
+ * lib/chdir-safer.c, lib/chown.c, lib/cloexec.c, lib/close-stream.c:
+ * lib/closeout.c, lib/creat-safer.c, lib/cycle-check.c, lib/diacrit.c:
+ * lib/dirchownmod.c, lib/dirfd.c, lib/dirname.c, lib/dup-safer.c:
+ * lib/dup2.c, lib/error.c, lib/euidaccess.c, lib/exclude.c:
+ * lib/exitfail.c, lib/fchmodat.c, lib/fchown-stub.c, lib/fd-safer.c:
+ * lib/file-type.c, lib/fileblocks.c, lib/filemode.c, lib/filenamecat.c:
+ * lib/fnmatch.c, lib/fopen-safer.c, lib/fprintftime.c, lib/free.c:
+ * lib/fsusage.c, lib/ftruncate.c, lib/fts-cycle.c, lib/fts.c:
+ * lib/full-write.c, lib/gai_strerror.c, lib/getcwd.c, lib/getdate.y:
+ * lib/getdomainname.c, lib/getgroups.c, lib/gethostname.c:
+ * lib/gethrxtime.c, lib/getloadavg.c, lib/getlogin_r.c:
+ * lib/getndelim2.c, lib/getnline.c, lib/getopt.c, lib/getopt1.c:
+ * lib/getpass.c, lib/gettime.c, lib/gettimeofday.c, lib/getugroups.c:
+ * lib/getusershell.c, lib/glob.c, lib/group-member.c:
+ * lib/hard-locale.c, lib/hash-pjw.c, lib/hash.c, lib/human.c:
+ * lib/idcache.c, lib/inet_ntop.c, lib/inet_pton.c, lib/inttostr.c:
+ * lib/isdir.c, lib/lchown.c, lib/linebuffer.c, lib/long-options.c:
+ * lib/lstat.c, lib/malloc.c, lib/md5.c, lib/memcasecmp.c, lib/memchr.c:
+ * lib/memcmp.c, lib/memcoll.c, lib/memcpy.c, lib/memmove.c:
+ * lib/memrchr.c, lib/mkancesdirs.c, lib/mkdir-p.c, lib/mkdir.c:
+ * lib/mkdirat.c, lib/mkstemp-safer.c, lib/mkstemp.c, lib/modechange.c:
+ * lib/mountlist.c, lib/nanosleep.c, lib/obstack.c, lib/open-safer.c:
+ * lib/openat-die.c, lib/openat.c, lib/pagealign_alloc.c, lib/physmem.c:
+ * lib/pipe-safer.c, lib/posixtm.c, lib/posixver.c, lib/putenv.c:
+ * lib/quote.c, lib/quotearg.c, lib/raise.c, lib/readtokens.c:
+ * lib/readtokens0.c, lib/readutmp.c, lib/realloc.c, lib/regex.c:
+ * lib/rename.c, lib/rmdir.c, lib/rpmatch.c, lib/safe-read.c:
+ * lib/same.c, lib/save-cwd.c, lib/savedir.c, lib/setenv.c:
+ * lib/settime.c, lib/sha1.c, lib/sig2str.c, lib/snprintf.c:
+ * lib/strdup.c, lib/strerror.c, lib/strftime.c, lib/stripslash.c:
+ * lib/strndup.c, lib/strnlen.c, lib/strpbrk.c, lib/strtod.c:
+ * lib/strtoimax.c, lib/strtol.c, lib/strverscmp.c, lib/tempname.c:
+ * lib/time_r.c, lib/timegm.c, lib/tmpfile-safer.c, lib/unlinkdir.c:
+ * lib/userspec.c, lib/utime.c, lib/utimecmp.c, lib/utimens.c:
+ * lib/version-etc-fsf.c, lib/version-etc.c, lib/xalloc-die.c:
+ * lib/xgetcwd.c, lib/xgethostname.c, lib/xmalloc.c, lib/xmemcoll.c:
+ * lib/xnanosleep.c, lib/xreadlink.c, lib/xstrtod.c, lib/xstrtoimax.c:
+ * lib/xstrtol.c, lib/xstrtoumax.c, lib/yesno.c:
+ Likewise.
+
+2006-09-13 Eric Blake <ebb9@byu.net>
+
+ * lib/getopt.c: Fix typo in last commit.
+
+2006-09-12 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-help.c (argp_doc): Make sure NULL is not passed to
+ dgettext.
+
+2006-09-12 Jim Meyering <jim@meyering.net>
+
+ * lib/nanosleep.c: Include <sys/types.h> before sys/select.h, to avoid
+ compilation failure (due to use of pid_t in latter) on NetBSD 1.6.
+ Reported by Nelson H. F. Beebe.
+
+2006-09-10 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-parse.c (__argp_parse) [!_LIBC]: Make sure
+ program_invocation_name and program_invocation_short_name are
+ initialized.
+ * lib/argp-namefrob.h: Move declarations of program_invocation_name
+ and program_invocation_short_name to argp.h, so they are visible
+ to user programs.
+ * lib/argp.h: Likewise
+
+2006-09-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/mkdtemp (Files): Remove m4/ulonglong.m4, m4/stdint_h.m4,
+ m4/inttypes_h.m4, m4/uintmax_t.m4.
+
+2006-09-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/mkdtemp.m4 (gl_PREREQ_MKDTEMP): Don't require
+ gl_AC_TYPE_UINTMAX_T.
+
+2006-09-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/mkdtemp.c: Include <stdint.h> always. Don't include <inttypes.h>.
+
+2006-09-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp.h (struct argp): Document the N_("..") "\v" N_("..")
+ convention. Text proposed by Bruno Haible.
+ (struct argp_option): Document the use of N_() wrappers.
+
+ * lib/argp-help.c (argp_doc): Split the untranslated doc string on
+ '\v', and translate the two parts separately, instead of feeding
+ the whole string to gettext. This allows to exclude
+ '\v' from the strings visible to the translator by writing doc
+ strings as N_("..") "\v" N_("..").
+
+2006-09-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Undo latest change; the bug was fixed.
+
+2006-09-09 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Eliminate lib_LDFLAGS
+ assignments if building a library without libtool.
+ (func_emit_tests_Makefile_am): Likewise. Handle lib_* variables as
+ in func_emit_lib_Makefile_am.
+ (func_import): When building a static library libfoo.a, arrange to
+ define variables LIBFOO_LIBDEPS and LIBFOO_LTLIBDEPS.
+ (func_create_testdir): Likewise.
+ * modules/gc (configure.ac, Makefile.am): If building statically,
+ augment gl_libdeps and gl_ltlibdeps instead of lib_LDFLAGS.
+ * modules/iconvme (configure.ac, Makefile.am): Likewise.
+ * modules/striconv (configure.ac, Makefile.am): Likewise.
+ Based on a suggestion by Ralf Wildenhues.
+
+2006-09-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/mktime.m4 (AC_FUNC_MKTIME): Sync from Autoconf.
+ Check for unistd.h too, since Autoconf doesn't assume POSIX.
+ Also:
+
+ 2006-09-08 Paul Eggert <eggert@cs.ucla.edu>
+ Add year_2050_test to catch glibc bug 2821
+ <http://sourceware.org/bugzilla/show_bug.cgi?id=2821>.
+
+ 2006-08-15 Paul Eggert <eggert@cs.ucla.edu>
+ Prefer #ifdef to #if.
+
+ 2006-04-02 Paul Eggert <eggert@cs.ucla.edu>
+ Return from 'main' instead of calling 'exit'.
+
+2006-09-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mktime.c (guess_time_tm): Fix bug where mktime
+ returned the maximum time_t value rather than (time_t) -1.
+ Problem originally reported by William Bardwell
+ <http://sourceware.org/bugzilla/show_bug.cgi?id=2821>.
+
+ * lib/isapipe.h (HAVE_FIFO_PIPES) [!defined HAVE_FIFO_PIPES]:
+ Moved to here ...
+ * lib/isapipe.c (HAVE_FIFO_PIPES) [!defined HAVE_FIFO_PIPES]:
+ ... from here.
+
+2006-09-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Temporarily comment out mktime.c until glibc bug
+ 2821 is fixed.
+
+2006-09-08 Jim Meyering <jim@meyering.net>
+
+ Don't make generated files read-only. That would bother too many
+ people. However, do retain the ability to work when targets are
+ read-only: remove the destination and temporary files before writing
+ them (when generated via sed or echo), or by using the -f option for
+ both cp and mv commands. Suggestion to use -f from Paul Eggert.
+ * modules/alloca-opt, modules/argz, modules/arpa_inet:
+ * modules/byteswap, modules/configmake, modules/fcntl:
+ * modules/fnmatch, modules/getopt, modules/glob, modules/inttypes:
+ * modules/localcharset, modules/netinet_in, modules/poll:
+ * modules/stdbool, modules/stdint, modules/sys_select:
+ * modules/sys_socket, modules/sys_stat, modules/sysexits:
+
+2006-09-08 Jim Meyering <jim@meyering.net>
+
+ Avoid new build failure on FreeBSD 6.0.
+ * m4/ls-mntd-fs.m4 (gl_LIST_MOUNTED_FILE_SYSTEMS): Include
+ <sys/param.h> when testing whether getmntinfo uses statvfs. Patch by
+ Pavel Tsekov, in <http://savannah.gnu.org/bugs/?17643>.
+
+2006-09-07 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/fsusage.m4 (gl_FILE_SYSTEM_USAGE): Don't use plain echo.
+
+2006-09-07 Jim Meyering <jim@meyering.net>
+
+ Fix global typo in last change: use chmod u-w, not chmod u-x.
+ Spotted by Paul Eggert and Bruce Korb.
+ * modules/alloca-opt, modules/argz, modules/arpa_inet:
+ * modules/byteswap, modules/configmake, modules/fcntl:
+ * modules/fnmatch, modules/getopt, modules/glob, modules/inttypes:
+ * modules/localcharset, modules/netinet_in, modules/poll:
+ * modules/stdbool, modules/stdint, modules/sys_select:
+ * modules/sys_socket, modules/sys_stat, modules/sysexits:
+
+2006-09-06 Jim Meyering <jim@meyering.net>
+
+ Make generated files be read-only.
+ * modules/alloca-opt (Makefile.am): Work also when $@ is read-only.
+ Ensure that each generated file is now read-only.
+ * modules/argz: Likewise.
+ * modules/arpa_inet: Likewise.
+ * modules/byteswap: Likewise.
+ * modules/configmake: Likewise.
+ * modules/fcntl: Likewise.
+ * modules/fnmatch: Likewise.
+ * modules/getopt: Likewise.
+ * modules/glob: Likewise.
+ * modules/inttypes: Likewise.
+ * modules/netinet_in: Likewise.
+ * modules/poll: Likewise.
+ * modules/stdbool: Likewise.
+ * modules/stdint: Likewise.
+ * modules/sys_select: Likewise.
+ * modules/sys_socket: Likewise.
+ * modules/sys_stat: Likewise.
+ * modules/sysexits: Likewise.
+ * modules/localcharset: Same as above, but continue using temporary
+ file named "t-$@" (why different?) rather than the "$@-t" used
+ everywhere else.
+
+ * modules/sysexits (Makefile.am): Replace literal occurrences
+ of "sysexit.h" more readable, and more consistent, "$@".
+
+2006-09-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/striconv: New file.
+ * modules/xstriconv: New file.
+ * MODULES.html.sh (Internationalization functions): Add striconv,
+ xstriconv.
+
+2006-09-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/gc (Makefile.am): Augment lib_LDFLAGS, not lib_LIBADD.
+ * modules/iconvme (Makefile.am): Likewise. Also handle the case of
+ not using libtool correctly.
+
+2006-09-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/striconv.h: New file.
+ * lib/striconv.c: New file, merging iconvme.c with GNU gettext's
+ iconvstring.c.
+ * lib/xstriconv.h: New file.
+ * lib/xstriconv.c: New file.
+
+2006-09-06 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Initialize also
+ lib_..._LDFLAGS.
+
+2006-09-05 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/argz_.h: Sync from Libtool.
+
+ 2006-09-04 George Bosilca <bosilca@cs.utk.edu>
+ and Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/libltdl/argz_.h: It's __cplusplus, not _cplusplus.
+
+2006-09-05 Davide Angelocola <davide.angelocola@tiscali.it>
+
+ * modules/trim: New file.
+
+2006-09-05 Davide Angelocola <davide.angelocola@tiscali.it>
+
+ * lib/trim.h: New file.
+ * lib/trim.c: New file.
+
+2006-09-05 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (String handling): Add trim.
+
+2006-09-04 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (signed.m4, gettext.m4): changes not propagated
+ until next release.
+
+2006-09-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Locate mingw shared libraries
+ correctly.
+
+2006-09-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getloadavg.m4 (gl_GETLOADAVG): Use CONFIGURING_GETLOADAVG,
+ not gl_GETLOADAVG. Omit unneeded semicolons.
+ Problems reported by Ralf Wildenhues in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-09/msg00000.html>.
+ (gl_PREREQ_GETLOADAVG): Use AC_DEFUN, not m4_define. Put
+ at the end, which is the usual gnulib style.
+
+ * m4/fstypename.m4 (gl_FSTYPENAME): Use AC_CHECK_MEMBERS instead
+ of doing all the work ourselves.
+ * m4/fsusage.m4 (gl_PREREQ_FSUSAGE_EXTRA): Don't check for
+ sys/statvfs.h since the code doesn't use HAVE_SYS_STATVFS_H.
+
+2006-09-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getloadavg.c: Use CONFIGURING_GETLOADAVG, not gl_GETLOADAVG.
+ Problem reported by Ralf Wildenhues in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-09/msg00000.html>.
+
+ * lib/mountlist.c: All uses of HAVE_F_FSTYPENAME_IN_STATFS replaced by
+ HAVE_STRUCT_STATFS_F_FSTYPENAME.
+
+2006-09-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Fix typos in
+ yesterday's patch by changing test -n to test -z.
+
+2006-08-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/getloadavg (Files): Add m4/getloadavg.m4.
+ (configure.ac): AC_FUNC_GETLOADAVG -> gl_GETLOADAVG, as
+ the former is now obsolescent.
+
+ * modules/chdir-long (Depends-on): Add fcntl.
+
+2006-08-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/fnmatch.m4: Add comment that Autoconf AC_FUNC_FNMATCH is
+ obsolescent, and programs should use gnulib instead.
+ * m4/getloadavg.m4: New file, with contents taken from Autoconf
+ but with prefixes changed.
+
+2006-08-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getloadavg.c [defined gl_GETLOADAVG]: Don't include config.h
+ or stdbool.h, because they might not exist while configuring.
+
+ * lib/chdir-long.c: Include <fcntl.h>, for O_DIRECTORY.
+ Don't include unistd.h or limits.h; not needed, since chdir-long.h
+ does that for us.
+ (O_DIRECTORY): Remove.
+
+2006-08-31 Eric Blake <ebb9@byu.net>
+
+ * gnulib-tool: Don't let emacs change spaces to TAB.
+
+2006-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: When calling func_import more than once, do it in a
+ subshell.
+ Reported by Eric Blake <ebb9@byu.net>.
+
+2006-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (nl): Remove variable.
+ (sed_transform_lib_file): Use more robust test for config-h module.
+ (func_import): Fix typo in 2006-08-25 patch.
+
+2006-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): When --makefile-name was
+ specified, augment Makefile.am variables instead of assigning them.
+
+2006-08-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ Work around a bug in both the Linux and SunOS 64-bit kernels:
+ nanosleep mishandles sleeps for longer than 2**31 seconds.
+ Problem reported by Frank v Waveren in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2006-08/msg00298.html>.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Require gl_CLOCK_TIME.
+ Check for nanosleep bug.
+ (LIB_NANOSLEEP): Append clock_gettime library if needed.
+
+2006-08-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ Work around a bug in both the Linux and SunOS 64-bit kernels:
+ nanosleep mishandles sleeps for longer than 2**31 seconds.
+ Problem reported by Frank v Waveren in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2006-08/msg00298.html>.
+ * lib/nanosleep.c (BILLION): New constant.
+ (getnow) [HAVE_BUG_BIG_NANOSLEEP]: New functions.
+ (rpl_nanosleep) [HAVE_BUG_BIG_NANOSLEEP]: Completely new
+ implementation.
+
+2006-08-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/nanosleep (Depends-on): Add gettime.
+
+2006-08-30 Paul Eggert <eggert@cs.ucla.edu>
+ and Simon Josefsson <jas@extundo.com>
+ and Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * MODULES.html.sh (Support for building documentation): Add gpl, lgpl.
+ * gnulib-tool (func_import): New license type 'unmodifiable license
+ text'.
+ * modules/fdl: Use it. Longer description.
+ * module/gpl, module/lgpl: New files.
+
+2006-08-30 Jim Meyering <jim@meyering.net>
+
+ * lib/isapipe.c (isapipe): Rename local s/fd/fd_pair/ to avoid
+ shadowing the parameter.
+
+2006-08-29 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Sync from Libtool:
+
+ 2006-08-28 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/libltdl/argz.c: Use `#ifdef HAVE_CONFIG_H', to facilitate code
+ sharing with gnulib. Report by Eric Blake.
+
+2006-08-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/isapipe: New file.
+ * MODULES.html.sh (File descriptor based Input/Output): Add isapipe.
+
+2006-08-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/configmake (Makefile.am): Add a comment, and omit
+ the CONFIGMAKE_ prefix from generated macro names. Suggested
+ by Bruno Haible.
+
+2006-08-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/isapipe.m4: New file.
+
+2006-08-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/isapipe.c, lib/isapipe.h: New files.
+
+2006-08-29 Jim Meyering <jim@meyering.net>
+
+ * modules/configmake (Makefile.am): Make configmake.h depend on
+ Makefile. Otherwise, a stale configmake.h could hang around.
+
+2006-08-29 Eric Blake <ebb9@byu.net>
+
+ * lib/error.c (error_at_line, print_errno_message): Match libc, after
+ resolution of upstream bug 3044.
+
+2006-08-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/localcharset (Depends-on): Add configmake.
+ (Makefile.am): Remove setting of LIBDIR through DEFS.
+
+2006-08-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c: Include configmake.h in order to get LIBDIR
+ defined.
+
+2006-08-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/fcntl: New file.
+ * modules/chdir-safer (Depends-on): Add fcntl.
+ * modules/fts: Likewise.
+ * modules/mkdir-p: Likewise.
+
+ * modules/stdint (Makefile.am): Do not substitute ABSOLUTE_INTTYPES_H.
+ This undoes the most recent change, since we're now addressing the
+ problem in a different way.
+
+ * gnulib-tool (emit_lib_Makefile_am): Don't put $makefile_name
+ into output, since the output might be called Makefile.am even
+ if $makefile_name is something different.
+ (func_import): Use $makefile_am rather than
+ ${makefile_name-Makefile.am}, to fix a bug where makefile_name was
+ empty.
+
+ * modules/inttypes (Files): Add m4/inttypes-h.m4.
+
+2006-08-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/inttypes.m4 (gl_INTTYPES_H): Move ABSOLUTE_INTTYPES_H code here...
+ * m4/stdint.m4 (gl_STDINT_H): ... from here. This undoes the most
+ recent change to stdint.m4, since we're now addressing the problem in a
+ different way.
+
+2006-08-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/fcntl_h.m4: New file.
+
+2006-08-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fcntl_.h: New file.
+ * lib/chdir-safer.c (O_DIRECTORY, O_NOFOLLOW): Remove, now that we have
+ the fcntl module.
+ * lib/dirchownmod.c: Likewise.
+ * lib/fts.c: Likewise.
+
+ * lib/inttypes_.h [defined _GL_JUST_INCLUDE_ABSOLUTE_INTTYPES_H]:
+ Include @ABSOLUTE_INTTYPES_H@ if available, but do nothing else.
+ * lib/stdint_.h (_GL_JUST_INCLUDE_ABSOLUTE_INTTYPES_H): Define
+ just before including <inttypes.h>, to avoid circular inclusion.
+
+2006-08-28 Jim Meyering <jim@meyering.net>
+
+ * doc/visibility.texi: Actually read and correct the grammar of the
+ sentence affected by yesterday's change.
+
+2006-08-28 Eric Blake <ebb9@byu.net>
+
+ * modules/inttypes (Makefile.am): Fix sed error when inttypes.h
+ needs wrapper.
+
+2006-08-28 Eric Blake <ebb9@byu.net>
+
+ * m4/inttypes.m4 (gl_INTTYPES_H): Fix missing #endif.
+
+2006-08-28 Eric Blake <ebb9@byu.net>
+
+ * m4/codeset.m4 (AM_LANGINFO_CODESET): Avoid compiler warning.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/c-strstr: New file, from GNU gettext.
+ * MODULES.html.sh (String handling): Add c-strstr.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/inttypes.m4 (gl_INTTYPES_H): Don't test for the existence of SCNX*
+ macros.
+ Reported by Eric Blake.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (EOVERFLOW): Remove definition.
+ (VASNPRINTF): Return a string of length > INT_MAX without failing.
+ * lib/vasprintf.c: Include errno.h, limits.h.
+ (EOVERFLOW): New fallback definition.
+ (vasprintf): Test here whether the string length is > INT_MAX.
+ * lib/vsnprintf.c: Include errno.h, limits.h.
+ (EOVERFLOW): New fallback definition.
+ (vsnprintf): Fix bug when generated string was too long for the buffer.
+ Test here whether the string length is > INT_MAX.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/inttypes_.h (SCNX*): Remove definitions.
+ Reported by Eric Blake.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strstr.h: New file, from GNU gettext.
+ * lib/c-strstr.c: New file, from GNU gettext.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Reorder some statements.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: New option --makefile-name.
+ (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am): Use
+ $makefile_name.
+ (func_import): Write $makefile_name to the cache file, and read it from
+ there unless explicitly specified. Use $makefile_name as file name
+ instead of Makefile.am. Adjust the recommendations accordingly.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_verify_module): Check against misapplying patch.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_relativize, func_relconcat): New functions.
+ Give an error if --local-dir is given with --update.
+ Remove trailing slashes from $local_gnulib_dir.
+ (func_import): Store the relativized $local_gnulib_dir in
+ gnulib-cache.m4, and read it from there if not specified explicitly.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_get_tests_module): Don't assume that $gnulib_dir
+ is the current directory. Respect also $local_gnulib_dir.
+
+2006-08-28 Bruno Haible <bruno@clisp.org>
+ Simon Josefsson <jas@extundo.com>
+
+ BeOS portability.
+ * lib/getaddrinfo.c (PF_INET, PF_UNSPEC): New macros.
+
+2006-08-27 Jim Meyering <jim@meyering.net>
+
+ * doc/visibility.texi: Remove duplicate word: "pointer".
+
+2006-08-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/inttypes (Files): Add lib/inttypes_.h, remove lib/inttypes.h.
+ Add m4/inttypes.m4, remove m4/_inttypes_h.m4 and m4/include_next.m4.
+ (Makefile.am): Create inttypes.h from inttypes_.h.
+ * modules/stdint (Makefile.am): Substitute also ABSOLUTE_INTTYPES_H.
+
+ * modules/imaxabs: New file.
+
+ * modules/imaxdiv: New file.
+
+2006-08-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/inttypes.m4: New file.
+ * m4/_inttypes_h.m4: Remove file.
+ * m4/inttypes-pri.m4 (gt_INTTYPES_PRI): Also AC_SUBST
+ PRI_MACROS_BROKEN.
+ * m4/stdint.m4 (gl_STDINT_H): Define also ABSOLUTE_INTTYPES_H.
+
+ * m4/imaxabs.m4: New file.
+
+ * m4/imaxdiv.m4: New file.
+
+2006-08-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/inttypes_.h: New file.
+ * lib/inttypes.h: Remove file.
+ * lib/stdint_.h: Include <inttypes.h> through its absolute filename.
+
+ * lib/imaxabs.c: New file.
+
+ * lib/imaxdiv.c: New file.
+
+2006-08-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ New config-h module, so that "make" output needn't be cluttered
+ by -DHAVE_CONFIG_H.
+ * MODULES.html.sh (Support for building libraries and executables):
+ Add config-h.
+ * modules/config-h: New file.
+ * gnulib-tool (nl, sed_transform_lib_file): New vars.
+ (func_import): Turn "#ifdef HAVE_CONFIG_H" to "#if 1" if
+ the config-h module is used.
+
+ New configmake module, so that "make" output needn't be cluttered
+ by fluff like '-DLIBDIR=\"/usr/local/lib\"'.
+ * MODULES.html.sh (Support for building libraries and executables):
+ Add configmake.
+ * modules/configmake: New file.
+
+2006-08-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/config-h.m4: New file.
+
+2006-08-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add elisp-comp.
+
+2006-08-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (Support for building libraries and executables):
+ Add elisp-comp.
+ * build-aux/elisp-comp: New file.
+ * modules/elisp-comp: New file.
+
+2006-08-24 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Use non-default values of
+ sourcebase and m4base.
+
+2006-08-24 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Compatibility checks for POSIX:2001 functions: Fix
+ HTML structure.
+
+2006-08-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/openat (Depends-on): Add lchown.
+
+2006-08-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir): Emit an invocation
+ of gl_LOCK_EARLY instead of gl_LOCK.
+
+2006-08-23 Bruno Haible <bruno@clisp.org>
+
+ * m4/lock.m4 (gl_LOCK_BODY): Change the default value of gl_use_threads
+ on OSF/1 to no.
+ Reported by Stephen Cartwright <sgcartwr@ucalgary.ca>.
+
+2006-08-23 Bruno Haible <bruno@clisp.org>
+
+ * m4/fsusage.m4 (gl_FILE_SYSTEM_USAGE): Don't consider BeOS statvfs
+ as unusable.
+
+ * m4/lock.m4 (gl_LOCK_EARLY): Renamed from gl_LOCK.
+ (gl_LOCK_BODY): Remove gl_PREREQ_LOCK invocation.
+ (gl_LOCK): New macro.
+
+2006-08-22 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-md5 (Makefile.am): Need to add md5.h, after changes
+ to md5 module.
+
+2006-08-22 Simon Josefsson <jas@extundo.com>
+
+ * MODULES.html.sh: Add "Support for maintaining and release
+ projects".
+
+ * build-aux/gnupload: New file, from coreutils.
+
+2006-08-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ Avoid the need for AC_LIBSOURCES in m4 macros.
+ * modules/arcfour (EXTRA_DIST): Add arcfour.h.
+ * modules/arctwo (EXTRA_DIST): Add arctwo.h.
+ * modules/check-version (EXTRA_DIST): Add check-version.h.
+ * modules/crc (EXTRA_DIST): Add crc.h.
+ * modules/des (EXTRA_DIST): Add des.h.
+ * modules/gc (EXTRA_DIST): Add gc.h.
+ * modules/getdelim (EXTRA_DIST): Add getdelim.h.
+ * modules/getline (EXTRA_DIST): Add getline.h.
+ * modules/getlogin_r (EXTRA_DIST): Add getlogin_r.h.
+ * modules/hmac-md5 (EXTRA_DIST): Add hmac.h.
+ * modules/hmac-sha1 (EXTRA_DIST): Add hmac.h.
+ * modules/md2 (EXTRA_DIST): Add md2.h.
+ * modules/md4 (EXTRA_DIST): Add md4.h.
+ * modules/pagealign_alloc (EXTRA_DIST): Add pagealign_alloc.h.
+ * modules/read-file (EXTRA_DIST): Add read-file.h.
+ * modules/readline (EXTRA_DIST): Add readline.h.
+ * modules/rijndael (EXTRA_DIST): Add rijndael-alg-fst.h,
+ rijndael-api-fst.h.
+
+2006-08-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/rijndael.m4 (gl_ARCFOUR):
+ * m4/arctwo.m4 (gl_ARCTWO):
+ * m4/check-version.m4 (gl_CHECK_VERSION):
+ * m4/crc.m4 (gl_CRC):
+ * m4/des.m4 (gl_DES):
+ * m4/gc-pbkdf2-sha1.m4 (gl_GC_PBKDF2_SHA1):
+ * m4/gc.m4 (gl_GC):
+ * m4/getdelim.m4 (gl_FUNC_GETDELIM):
+ * m4/getline.m4 (gl_FUNC_GETLINE):
+ * m4/getlogin_r.m4 (gl_GETLOGIN_R_SUBSTITUTE):
+ * m4/hmac-md5.m4 (gl_HMAC_MD5):
+ * m4/hmac-sha1.m4 (gl_HMAC_SHA1):
+ * m4/md2.m4 (gl_MD2):
+ * m4/md4.m4 (gl_MD4):
+ * m4/pagealign_alloc.m4 (gl_PAGEALIGN_ALLOC):
+ * m4/read-file.m4 (gl_FUNC_READ_FILE):
+ * m4/readline.m4 (gl_FUNC_READLINE):
+ * m4/rijndael.m4 (gl_RIJNDAEL):
+ Don't use AC_LIBSOURCES; instead, rely on the files in ../modules/
+ to get the necessary .h files and whatnot.
+
+2006-08-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Remove gnupload, since coreutils now syncs from
+ gnulib rather than the other way around.
+ * config/srclistvars.sh (COREUTILS): Remove.
+
+2006-08-22 Jim Meyering <jim@meyering.net>
+
+ * modules/mkdir-p (Makefile.am): Fix typo: s/lib+SOURCES/lib_SOURCES/.
+
+ * modules/getpass-gnu (Makefile.am): Add getpass.h to EXTRA_DIST.
+
+2006-08-22 Eric Blake <ebb9@byu.net>
+
+ * modules/regexprops-generic: New file.
+ * MODULES.html.sh (Support for building documentation): List it.
+
+2006-08-22 Eric Blake <ebb9@byu.net>
+
+ * m4/stdint_h.m4 (gl_AC_HEADER_STDINT_H): Avoid compiler warning.
+ * m4/inttypes_h.m4 (gl_AC_HEADER_INTTYPES_H): Likewise.
+ * m4/longlong.m4 (AC_TYPE_LONG_LONG_INT): Likewise.
+ * m4/intmax_t.m4 (gt_AC_TYPE_INTMAX_T): Likewise.
+
+2006-08-22 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Don't treat lib_LIBRARIES
+ and lib_LTLIBRARIES like the other lib_* variables.
+
+2006-08-22 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/x-to-1.in: New file, from GNU gettext.
+
+2006-08-22 Bruno Haible <bruno@clisp.org>
+
+ * m4/readutmp.m4 (gl_READUTMP): Compile readutmp.c only if <utmp.h> or
+ <utmpx.h> exists.
+
+2006-08-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/readutmp.h: Skip most definitions if neither <utmp.h> nor
+ <utmpx.h> exists.
+
+2006-08-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ BeOS portability.
+ * lib/dirchownmod.c (dirchownmod): Don't use fchmod if it doesn't
+ exist.
+ Problem reported by Bruno Haible.
+
+2006-08-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ Avoid the need for AC_LIBSOURCES in m4 macros.
+ * modules/acl (EXTRA_DIST): Add acl.h.
+ * modules/argmatch (Files): Add m4/argmatch.m4.
+ (configure.ac): Add gl_ARGMATCH.
+ (EXTRA_DIST): Renamed from lib_SOURCES, for
+ consistency with the other modules. Remove argmatch.c.
+ * modules/backupfile (EXTRA_DIST): Add backupfile.h.
+ * modules/c-strtod (EXTRA_DIST): Add c-strtod.h.
+ * modules/c-strtold (EXTRA_DIST): Add c-strtod.c, c-strtod.h.
+ * modules/canonhost (EXTRA_DIST): Add c-canonhost.h.
+ * modules/canonicalize (EXTRA_DIST): Add canonicalize.h.
+ * modules/chdir-long (EXTRA_DIST): Add chdir-long.h.
+ * modules/chdir-safer (EXTRA_DIST): Add chdir-safer.h.
+ * modules/cloexec (EXTRA_DIST): Add cloexec.h.
+ * modules/close-stream (EXTRA_DIST): Add close-stream.h.
+ * modules/closeout (EXTRA_DIST): Add closeout.h.
+ * modules/cycle-check (EXTRA_DIST): Add cycle-check.h.
+ * modules/dev-ino (EXTRA_DIST): Add dev-ino.h.
+ * modules/dirfd (EXTRA_DIST): Add dirfd.h.
+ * modules/dirname (EXTRA_DIST): Renamed from lib_SOURCES. Add
+ dirname.h; remove basename.c and stripslash.c.
+ * modules/exclude (EXTRA_DIST): Add exclude.h.
+ * modules/exitfail (EXTRA_DIST): Add exitfail.h.
+ * modules/fcntl-safer (EXTRA_DIST): Add fcntl-safer.h fcntl--.h.
+ * modules/file-type (EXTRA_DIST): Add file-type.h.
+ * modules/filemode (EXTRA_DIST): Add filemode.h.
+ * modules/filenamecat (EXTRA_DIST): Add filenamecat.h.
+ * modules/fopen-safer (EXTRA_DIST): Add stdio-safer.h stdio--.h.
+ * modules/fpending (EXTRA_DIST): Add __fpending.h.
+ * modules/fprintftime (EXTRA_DIST): Add fprintftime.h.
+ * modules/fsusage (EXTRA_DIST): Add fsusage.h.
+ * modules/fts (EXTRA_DIST): Add fts_.h fts-cycle.c.
+ * modules/getcwd (EXTRA_DIST): Add getcwd.h.
+ * modules/getdate (EXTRA_DIST): Add getdate.c.
+ * modules/gethrxtime (EXTRA_DIST): Add gethrxtime.h xtime.h.
+ * modules/getpagesize (EXTRA_DIST): Add getpagesize.h.
+ * modules/getpass (EXTRA_DIST): Add getpass.h.
+ * modules/glob (EXTRA_DIST): Add glob_.h glob-libc.h.
+ * modules/group-member (EXTRA_DIST): Add group-member.h.
+ * modules/hard-locale (EXTRA_DIST): Add hard-locale.h.
+ * modules/hash (EXTRA_DIST): Add hash.h.
+ * modules/human (EXTRA_DIST): Add human.h.
+ * modules/inttypes (EXTRA_DIST): Add inttypes.h.
+ * modules/lchmod (EXTRA_DIST): Add lchmod.h.
+ * modules/lchown (EXTRA_DIST): Add lchown.h.
+ * modules/long-options (EXTRA_DIST): Add long-options.h.
+ * modules/lstat (EXTRA_DIST): Add lstat.h.
+ * modules/md5 (EXTRA_DIST): Add memcasecmp.h.
+ * modules/memcoll (EXTRA_DIST): Add memcoll.h.
+ * modules/mempcpy (EXTRA_DIST): Add mempcpy.h.
+ * modules/memrchr (EXTRA_DIST): Add memrchr.h.
+ * modules/memxor (EXTRA_DIST): Add memxor.h.
+ * modules/mkancesdirs (EXTRA_DIST): Add mkancesdirs.h.
+ * modules/mkdir-p (EXTRA_DIST): Add modechange.h.
+ * modules/mountlist (EXTRA_DIST): Add mountlist.h.
+ * modules/openat (EXTRA_DIST): Add at-func.c openat.h openat-priv.h.
+ * modules/pathmax (EXTRA_DIST): Add pathmax.h.
+ * modules/physmem (EXTRA_DIST): Add physmem.h.
+ * modules/posixtm (EXTRA_DIST): Add posixtm.h.
+ * modules/posixver (EXTRA_DIST): Add posixver.h.
+ * modules/quote (EXTRA_DIST): Add quote.h.
+ * modules/quotearg (EXTRA_DIST): Add quotearg.h.
+ * modules/readtokens (EXTRA_DIST): Add readtokens.h.
+ * modules/readutmp (EXTRA_DIST): Add readutmp.h.
+ * modules/regex (EXTRA_DIST): Add regcomp.c regex.h regex_internal.c
+ regex_internal.h regexec.c.
+ * modules/safe-read (EXTRA_DIST): Add safe-read.h.
+ * modules/safe-write (EXTRA_DIST): Add safe-write.h.
+ * modules/same (EXTRA_DIST): Add same.h.
+ * modules/same-inode (EXTRA_DIST): Add same-inode.h.
+ * modules/save-cwd (EXTRA_DIST): Add save-cwd.h.
+ * modules/savedir (EXTRA_DIST): Add savedir.h.
+ * modules/sha1 (EXTRA_DIST): Add sha1.h.
+ * modules/sig2str (EXTRA_DIST): Add sig2str.h.
+ * modules/stat-macros (EXTRA_DIST): Add stat-macros.h.
+ * modules/stat-time (EXTRA_DIST): Add stat-time.h.
+ * modules/stdlib-safer (EXTRA_DIST): Add stdlib-safer.h stdlib--.h.
+ * modules/strdup (EXTRA_DIST): Add strdup.h.
+ * modules/strftime (EXTRA_DIST): Add strftime.h.
+ * modules/strndup (EXTRA_DIST): Add strndup.h.
+ * modules/strnlen (EXTRA_DIST): Add strnlen.h.
+ * modules/strverscmp (EXTRA_DIST): Add strverscmp.h.
+ * modules/time_r (EXTRA_DIST): Add time_r.h.
+ * modules/timespec (EXTRA_DIST): Add timespec.h.
+ * modules/tmpfile-safer (EXTRA_DIST): Add stdio-safer.h stdio--.h.
+ * modules/unistd-safer (EXTRA_DIST): Add unistd-safer.h unistd--.h.
+ * modules/unlinkdir (EXTRA_DIST): Add unlinkdir.h.
+ * modules/unlocked-io (EXTRA_DIST): Add unlocked-io.h.
+ * modules/userspec (EXTRA_DIST): Add userspec.h.
+ * modules/utimecmp (EXTRA_DIST): Add utimecmp.h.
+ * modules/utimens (EXTRA_DIST): Add utimens.h.
+ * modules/xalloc (EXTRA_DIST): Add xalloc.h.
+ * modules/xgetcwd (EXTRA_DIST): Add xgetcwd.h.
+ * modules/xnanosleep (EXTRA_DIST): Add xnanosleep.h.
+ * modules/xreadlink (EXTRA_DIST): Add xreadlink.h.
+ * modules/xstrtod (EXTRA_DIST): Add xstrtod.h.
+ * modules/xstrtol (EXTRA_DIST): Add xstrtol.h.
+ * modules/xstrtold (EXTRA_DIST): Add xstrtod.c xstrtod.h.
+ * modules/yesno (EXTRA_DIST): Add yesno.h.
+
+2006-08-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/mkdir-p.m4 (gl_MKDIR_PARENTS): Check for fchmod.
+
+ * m4/argmatch.m4: New file, from coreutils with AC_LIBSOURCES removed.
+ * m4/dev-ino.m4, same-inode.m4: Remove.
+
+ * m4/_inttypes_h.m4 (gl_INTTYPES_H):
+ * m4/acl.m4 (AC_FUNC_ACL):
+ * m4/backupfile.m4 (gl_BACKUPFILE):
+ * m4/c-strtod.m4 (gl_C99_STRTOLD):
+ * m4/canon-host.m4 (gl_CANON_HOST):
+ * m4/canonicalize.m4 (AC_FUNC_CANONICALIZE_FILE_NAME):
+ * m4/chdir-long.m4 (gl_FUNC_CHDIR_LONG):
+ * m4/chdir-safer.m4 (gl_CHDIR_SAFER):
+ * m4/cloexec.m4 (gl_CLOEXEC):
+ * m4/close-stream.m4 (gl_CLOSE_STREAM):
+ * m4/closeout.m4 (gl_CLOSEOUT):
+ * m4/dirfd.m4 (gl_FUNC_DIRFD):
+ * m4/dirname.m4 (gl_DIRNAME):
+ * m4/exclude.m4 (gl_EXCLUDE):
+ * m4/exitfail.m4 (gl_EXITFAIL):
+ * m4/fcntl-safer.m4 (gl_FCNTL_SAFER):
+ * m4/file-type.m4 (gl_FILE_TYPE):
+ * m4/filemode.m4 (gl_FILEMODE):
+ * m4/filenamecat.m4 (gl_FILE_NAME_CONCAT):
+ * m4/fpending.m4 (gl_FUNC_FPENDING):
+ * m4/fprintftime.m4 (gl_FPRINTFTIME):
+ * m4/fts.m4 (gl_FUNC_FTS):
+ * m4/getcwd.m4 (gl_FUNC_GETCWD_NULL):
+ * m4/getdate.m4 (gl_GETDATE):
+ * m4/gethrxtime.m4 (gl_GETHRXTIME):
+ * m4/getpagesize.m4 (gl_GETPAGESIZE):
+ * m4/getpass.m4 (gl_FUNC_GETPASS):
+ * m4/gettime.m4 (gl_GETTIME):
+ * m4/getugroups.m4 (gl_GETUGROUPS):
+ * m4/glob.m4 (gl_GLOB_SUBSTITUTE):
+ * m4/group-member.m4 (gl_FUNC_GROUP_MEMBER):
+ * m4/hard-locale.m4 (gl_HARD_LOCALE):
+ * m4/hash.m4 (gl_HASH):
+ * m4/idcache.m4 (gl_IDCACHE):
+ * m4/lchmod.m4 (gl_FUNC_LCHMOD):
+ * m4/lchown.m4 (gl_FUNC_LCHOWN):
+ * m4/long-options.m4 (gl_LONG_OPTIONS):
+ * m4/lstat.m4 (gl_FUNC_LSTAT):
+ * m4/md5.m4 (gl_MD5):
+ * m4/memcasecmp.m4 (gl_MEMCASECMP):
+ * m4/memcoll.m4 (gl_MEMCOLL):
+ * m4/mempcpy.m4 (gl_FUNC_MEMPCPY):
+ * m4/memrchr.m4 (gl_FUNC_MEMRCHR):
+ * m4/memxor.m4 (gl_MEMXOR):
+ * m4/mkancesdirs.m4 (gl_MKANCESDIRS):
+ * m4/mkdir-p.m4 (gl_MKDIR_PARENTS):
+ * m4/modechange.m4 (gl_MODECHANGE):
+ * m4/mountlist.m4 (gl_MOUNTLIST):
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP):
+ * m4/openat.m4 (gl_FUNC_OPENAT):
+ * m4/pathmax.m4 (gl_PATHMAX):
+ * m4/physmem.m4 (gl_PHYSMEM):
+ * m4/posixtm.m4 (gl_POSIXTM):
+ * m4/posixver.m4 (gl_POSIXVER):
+ * m4/quote.m4 (gl_QUOTE):
+ * m4/quotearg.m4 (gl_QUOTEARG):
+ * m4/readtokens.m4 (gl_READTOKENS):
+ * m4/readutmp.m4 (gl_READUTMP):
+ * m4/regex.m4 (gl_REGEX):
+ * m4/safe-read.m4 (gl_SAFE_READ):
+ * m4/safe-write.m4 (gl_SAFE_WRITE):
+ * m4/same.m4 (gl_SAME):
+ * m4/save-cwd.m4 (gl_SAVE_CWD):
+ * m4/savedir.m4 (gl_SAVEDIR):
+ * m4/settime.m4 (gl_SETTIME):
+ * m4/sha1.m4 (gl_SHA1):
+ * m4/sig2str.m4 (gl_FUNC_SIG2STR):
+ * m4/stat-macros.m4 (gl_STAT_MACROS):
+ * m4/stat-time.m4 (gl_STAT_TIME):
+ * m4/stdio-safer.m4 (gl_FOPEN_SAFER):
+ * m4/stdlib-safer.m4 (gl_STDLIB_SAFER):
+ * m4/strdup.m4 (gl_FUNC_STRDUP):
+ * m4/strftime.m4 (gl_FUNC_GNU_STRFTIME):
+ * m4/strndup.m4 (gl_FUNC_STRNDUP):
+ * m4/strnlen.m4 (gl_FUNC_STRNLEN):
+ * m4/strverscmp.m4 (gl_FUNC_STRVERSCMP):
+ * m4/time_r.m4 (gl_TIME_R):
+ * m4/timespec.m4 (gl_TIMESPEC):
+ * m4/unistd-safer.m4 (gl_UNISTD_SAFER):
+ * m4/unlinkdir.m4 (gl_UNLINKDIR):
+ * m4/unlocked-io.m4 (gl_FUNC_GLIBC_UNLOCKED_IO):
+ * m4/userspec.m4 (gl_USERSPEC):
+ * m4/utimecmp.m4 (gl_UTIMECMP):
+ * m4/utimens.m4 (gl_UTIMENS):
+ * m4/xalloc.m4 (gl_XALLOC):
+ * m4/xgetcwd.m4 (gl_XGETCWD):
+ * m4/xnanosleep.m4 (gl_XNANOSLEEP):
+ * m4/xreadlink.m4 (gl_XREADLINK):
+ * m4/xstrtod.m4 (gl_XSTRTOD):
+ * m4/yesno.m4 (gl_YESNO):
+ Don't use AC_LIBSOURCES; instead, rely on the files in ../modules/
+ to get the necessary .h files and whatnot.
+
+2006-08-21 Mark D. Baushke <mdb@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_verify_module): Work around Sun's non-POSIX 1003.2
+ /bin/sh understanding of '!' conditional negation.
+
+2006-08-21 Jim Meyering <jim@meyering.net>
+
+ * modules/openat (Depends-on): Really alphabetize.
+
+ * modules/acl (Depends-on): Add error and quote.
+
+ * check-module (find_included_lib_files): Add at-func.c to the
+ ok-to-include-more-than-once white list.
+
+ * modules/openat (Depends-on): Add lstat. Alphabetize.
+
+2006-08-21 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+ Emit a pkgdata_DATA variable only if some snippets add contents to it.
+ Reported by Martin Lambers <marlam@marlam.de>.
+
+2006-08-21 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): If the snippets already
+ specify an installation location, don't emit a noinst_LIBRARIES or
+ noinst_LTLIBRARIES assignment.
+
+2006-08-21 Bruno Haible <bruno@clisp.org>
+
+ BeOS portability.
+ * modules/mbchar (Include): Don't test HAVE_WCTYPE_H any more, since
+ BeOS has mbrtowc() but no <wctype.h>.
+
+2006-08-21 Bruno Haible <bruno@clisp.org>
+
+ BeOS portability.
+ * m4/mbchar.m4 (gl_MBCHAR): Compile mbchar.c also if <wctype.h> doesn't
+ exist.
+
+2006-08-21 Bruno Haible <bruno@clisp.org>
+
+ BeOS portability.
+ * lib/mbchar.h: Include <wctype.h> only if it exists.
+
+2006-08-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ Remove files that are no longer needed by their respective modules.
+ * m4/obstack.m4: Remove.
+ * m4/strerror_r.m4: Remove.
+ * m4/uint32_t.m4: Remove.
+ * m4/uintptr_t.m4: Remove.
+ * m4/ullong_max.m4: Remove.
+ * m4/xstrtoimax.m4: Remove.
+ * m4/xstrtoumax.m4: Remove.
+
+ * m4/cycle-check.m4 (gl_CYCLE_CHECK): Do not require
+ gl_AC_TYPE_UINTMAX_T, gl_STRUCT_DEV_INO, or gl_SAME_INODE, since gnulib
+ dependencies now capture this.
+
+ * m4/cycle-check.m4 (gl_CYCLE_CHECK):
+ Do not use AC_LIBSOURCES, since gnulib modules now do this.
+ * m4/fsusage.m4 (gl_FSUSAGE): Likewise.
+ * m4/human.m4 (gl_HUMAN): Likewise.
+ * m4/inttostr.m4 (gl_INTTOSTR): Likewise.
+ * m4/xstrtol.m4 (gl_XSTRTOL): Likewise.
+
+ * m4/filemode.m4 (gl_FILEMODE): Require AC_STRUCT_ST_DM_MODE.
+
+ * m4/filemode.m4 (gl_PREREQ_FSUSAGE_EXTRA): Do not require
+ gl_AC_TYPE_INTMAX_T or gl_AC_TYPE_UINTMAX_T, since we now require
+ stdint.
+ * m4/human.m4 (gl_HUMAN): Likewise.
+ * m4/inttostr.m4 (gl_PREREQ_INTTOSTR): Likewise.
+ * m4/mkstemp.m4 (gl_PREREQ_TEMPNAME): Likewise.
+ * m4/strtoimax.m4 (gl_PREREQ_STRTOIMAX): Likewise.
+ * m4/strtoumax.m4 (gl_PREREQ_STRTOUMAX): Likewise.
+ * m4/xstrtol (gl_XSTRTOL): Likewise.
+
+ * m4/gethrxtime.m4 (gl_XTIME): gl_AC_TYPE_LONG_LONG ->
+ AC_TYPE_LONG_LONG_INT.
+ * m4/strtoimax.m4 (gl_PREREQ_STRTOIMAX): Likewise.
+ * m4/strtoll.m4 (gl_FUNC_STRTOLL): Likewise.
+ * m4/strtoull.m4 (gl_FUNC_STRTOULL): Likewise, for unsigned long.
+ * m4/strtoumax.m4 (gl_PREREQ_STRTOUMAX): Likewise.
+
+ * m4/human.m4 (gl_HUMAN): Do not require AM_STDBOOL_H since we depend
+ on stdbool.
+
+ * m4/xstrtol.m4 (gl_PREREQ_XSTRTOL_H, gl_PREREQ_XSTRTOL): Remove.
+ (gl_PREREQ_XSTRTOUL): Remove.
+
+ * m4/ls-mntd-fs.m4 (gl_LIST_MOUNTED_FILE_SYSTEMS): Check for hasmntopt.
+
+ * m4/posixver.m4: Fix comment since head -1 now works even in POSIX
+ mode.
+
+2006-08-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ Add and change modules to make it easier for coreutils to use
+ gnulib-tool.
+ * modules/backupfile (Files): Remove m4/d-ino.m4.
+ (Depends-on): Add d-ino.
+ * modules/cycle-check (Depends-on): Add stdint.
+ (lib_SOURCES): Add cycle-check.h.
+ * modules/d-ino: New module.
+ * modules/d-type: New module.
+ * modules/error (Files): Remove m4/strerror_r.m4.
+ * modules/filemode (Files): Add m4/st_dm_mode.m4.
+ * modules/fsuage (Files): Remove m4/ulonglong.m4, m4/stdint_h.m4,
+ m4/inttypes_h.m4, m4/uintmax_t.m4.
+ (Depends-on): Add stdint.
+ (lib_SOURCES): Add fsusage.h.
+ * modules/getcwd (Files): Remove d-ino.m4.
+ (Depends-on): Add d-ino.
+ * modules/getndelim2 (Depends-on): Add stdint.
+ * modules/glob (Files): Remove m4/d-type.m4.
+ (Depends-on): Add d-type.
+ * modules/host-os: New module.
+ * modules/human (Files): Remove m4/ulonglong.m4, m4/stdint_h.m4,
+ m4/inttypes_h.m4, m4/uintmax_t.m4.
+ * Depends-on: Add stdint.
+ (lib_SOURCES): Add human.h.
+ * modules/inttostr (Files): Remove m4/intmax_t.m4,
+ m4/inttostr.m4, m4/inttypes_h.m4, m4/longlong.m4, m4/stdint_h.m4,
+ m4/uintmax_t.m4, m4/ulonglong.m4.
+ (Depends-on): Add stdint.
+ (EXTRA_DIST): Add inttostr.h.
+ * modules/lchmod: New module.
+ * modules/link-follow: New module.
+ * modules/mkdir-p (Files): Remove lib/lchmod.h, m4/lchmod.m4.
+ (Depends-on): Add lchmod.
+ * modules/mkstemp (Files): Remove m4/ulonglong.m4,
+ m4/stdint_h.m4, m4/inttypes_h.m4, m4/uintmax_t.m4.
+ (Depends-on): Add stdint.
+ * modules/obstack (Files): Remove m4/inttypes_h.m4, m4/obstack.m4,
+ m4/stdint_h.m4, m4/uintmax_t.m4, m4/ulonglong.m4.
+ (Depends-on): Add stdint.
+ (configure.ac): Change gl_OBSTACK to AC_FUNC_OBSTACK.
+ * modules/perl: New module.
+ * modules/regex (Depends-on): Add stdint.
+ * modules/rmdir-errno: New module.
+ * modules/strtoimax (Files): Remove m4/stdint_h.m4, m4/inttypes_h.m4,
+ m4/intmax_t.m4.
+ (Depends-on): Add stdint.
+ * modules/strtoumax (Files): Remove m4/stdint_h.m4, m4/inttypes_h.m4,
+ m4/uintmax_t.m4.
+ (Depends-on): Add stdint.
+ * modules/unlink-busy: New module.
+ * modules/utimecmp (Depends-on): Add stdint.
+ * modules/uptime: New module.
+ * modules/winsz-ioctl: New module.
+ * modules/winsz-termios: New module.
+ * modules/xnanosleep (Depends-on): Add nanosleep.
+ * modules/ullong_max: Remove.
+ * modules/xstrtoimax (Files): Remove m4/xstrtoimax.m4.
+ (configure.ac): Remove gl_XSTRTOIMAX; no action needed now.
+ * modules/xstrtol (Files): Remove m4/ulonglong.m4, m4/longlong.m4,
+ m4/stdint_h.m4, m4/inttypes_h.m4, m4/uintmax_t.m4, m4/intmax_t.m4.
+ (Depends-on): Add inttypes.
+ (lib_SOURCES): Add xstrtol.h.
+ * modules/xstrtoumax (Files): Remove m4/xstrtoumax.m4.
+ (configure.ac): Remove gl_XSTRTOUMAX; no action needed now.
+ * MODULES.html.sh: Move 'assert' into the assert section.
+ Move 'dummy' into the linking section.
+ Remove ullong_max.
+ Add section for compatibility checks for POSIX:2001 functions,
+ and put d-ino, d-type, link-follow, rmdir-errno, unlink-busy,
+ winsz-ioctl, and winsz-termios into it.
+ Add lchmod.
+ Add top-level Misc section and put host-os, perl, and uptime
+ into it.
+
+2006-08-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/cycle-check.h: Include <stdint.h> unconditionally, since we
+ now assume the stdint module. Do not include inttypes.h.
+ * lib/fsusage.h: Likewise.
+ * lib/getndelim2.c: Likewise.
+ * lib/human.h: Likewise.
+ * lib/inttostr.h: Likewise.
+ * lib/obstack.c: Likewise.
+ * lib/regex_internal.h: Likewise.
+ * lib/tempname.c: Likewise.
+ * lib/utimecmp.c: Likewise.
+ * lib/xstrtol.h: Likewise.
+
+ * lib/stat_.h: Fix typo: HAVE_FUNC_LSTAT -> HAVE_LSTAT.
+
+ * lib/strtoimax.c: Adjust to macro name changes in Autoconf,
+ e.g., HAVE_LONG_LONG -> HAVE_LONG_LONG_INT.
+ * lib/xtime.h: Likewise.
+
+2006-08-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/openat (Files): Add lib/fchmodat.c.
+ Fixes problem reported by Jay Youngman.
+
+2006-08-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fchmodat.c: New file, from coreutils. This was inadvertently
+ omitted in the 2006-08-17 update. Problem reported by Jay Youngman.
+
+2006-08-18 Paul Eggert <eggert@cs.ucla.edu>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/bison-i18n.m4 (BISON_I18N): Also handle the case where yacc exists
+ and is a script that invokes bison. Tighten the code. Add comments.
+
+2006-08-18 Jim Meyering <jim@meyering.net>
+
+ * m4/gethrxtime.m4 (gl_PREREQ_GETHRXTIME): Also check for
+ CLOCK_REALTIME, since gethrxtime may revert to using clock_gettime via
+ gettime.c. Gabor Z. Papp reported that gethrxtime-using programs
+ failed to link due to unresolved clock_gettime on a linux-2.4.x system.
+
+2006-08-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/bison-i18n: New file.
+ * MODULES.html.sh (Internationalization functions): Add it.
+
+2006-08-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/ls-mntd-fs.m4 (gl_LIST_MOUNTED_FILE_SYSTEMS): Also check for
+ sys/statvfs.h. When getmntinfo was found, check its declaration and
+ set either MOUNTED_GETMNTINFO or MOUNTED_GETMNTINFO2 depending on it.
+
+2006-08-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/bison-i18n.m4: New file, from bison.
+
+2006-08-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/mountlist.c [MOUNTED_GETMNTINFO2]: Include sys/statvfs.h.
+ (ME_DUMMY): Treat "kernfs" as a dummy.
+ (read_file_system_list) [MOUNTED_GETMNTINFO2]: Implement.
+
+2006-08-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Update from coreutils.
+
+ 2006-08-15 Jim Meyering <jim@meyering.net>
+
+ * m4/openat.m4 (gl_FUNC_OPENAT): Add at-func.c via AC_LIBSOURCES.
+
+ 2006-01-17 Jim Meyering <jim@meyering.net>
+
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Depend on gl_FUNC_OPENAT.
+
+ 2006-01-11 Jim Meyering <jim@meyering.net>
+
+ * m4/openat.m4 (gl_FUNC_OPENAT): Require and compile fchmodat.c.
+ Check for the lchmod function.
+
+2006-08-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Update from coreutils.
+
+ * lib/__fpending.h: Add copyright notice.
+ * lib/fprintftime.h: Likewise.
+ * lib/savedir.c: Use (C) in copyright notice.
+ * lib/savedir.h: Likewise.
+
+ 2006-08-15 Jim Meyering <jim@meyering.net>
+
+ * lib/at-func.c: New file, with the logic of all emulated at-functions.
+ * lib/openat-priv.h: Include <errno.h> and define ENOSYS,
+ in support of the EXPECTED_ERRNO macro.
+ * lib/openat.c (fstatat, unlinkat, fchownat): Remove function
+ definitions. Instead, define the appropriate symbols and include
+ "at-func.c".
+ * lib/mkdirat.c (mkdirat): Likewise.
+ * lib/fchmodat.c (fchmodat): Likewise.
+ (ENOSYS): Remove definition.
+ * lib/openat.c: Don't include <errno.h>, now that "openat-priv.h" does
+ it. Don't include "unistd--.h" -- it wasn't ever used.
+
+ 2006-01-17 Jim Meyering <jim@meyering.net>
+
+ Rewrite fts.c not to change the current working directory,
+ by using openat, fstatat, fdopendir, etc..
+
+ * lib/fts.c [! _LIBC]: Include "openat.h" and "unistd--.h".
+ (HAVE_OPENAT_SUPPORT): Define.
+ [_LIBC] (fchdir): Don't undef or define; no longer used.
+ (FCHDIR): Define in terms of cwd_advance_fd rather than fchdir.
+ Now, this `function' always succeeds, and consumes its file descriptor
+ parameter -- so callers must not close such FDs. Update callers.
+ (diropen_fd, opendirat, cwd_advance_fd): New functions.
+ (diropen): Add parameter, SP. Adjust all callers.
+ Implement using diropen_fd, rather than open.
+ (fts_open): Initialize new member, fts_cwd_fd.
+ Remove fts_rft-setting code.
+ (fts_close): Close fts_cwd_fd, if necessary.
+ (__opendir2): Define in terms of opendir or opendirat,
+ depending on whether the FST_NOCHDIR flag is set.
+ (fts_build): Since fts_safe_changedir consumes its FD, and since
+ this code must do `closedir(dirp)', dup the dirfd(dirp) argument,
+ and close the dup'd file descriptor upon failure.
+ (fts_stat): Use fstatat(...AT_SYMLINK_NOFOLLOW) in place of lstat.
+ (fts_safe_changedir): Tweak semantics to reflect that this function
+ now calls cwd_advance_fd and hence consumes its FD argument.
+ * lib/fts_.h [struct FTS] (fts_cwd_fd): New member.
+ [struct FTS] (fts_rft): Remove now-unused member.
+ [struct FTS] (fts_cycle.state): Improve comment.
+
+ * lib/openat.c (openat_needs_fchdir): New function.
+ * lib/openat.h (openat_needs_fchdir): Declare it.
+
+2006-08-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/memcoll.c (memcoll): Set errno = 0 in the shortcut case, too.
+ Problem and fix reported by Pádraig Brady in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2006-08/msg00099.html>.
+
+2006-08-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/cycle-check (configure.ac): Add gl_CYCLE_CHECK.
+
+2006-08-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/memcoll.c (memcoll): Optimize for the common case where the
+ arguments are bytewise equal.
+
+2006-08-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/regexprops-generic.texi: Add a copyright notice.
+
+2006-08-15 Bruno Haible <bruno@clisp.org>
+
+ * modules/tmpdir (License): Change to LGPL.
+
+2006-08-15 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_all_modules, func_verify_module): COPYING is not a
+ module.
+
+2006-08-14 Simon Josefsson <jas@extundo.com>
+
+ * config/srclist.txt: Add gnupload.
+
+2006-08-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Change copyright notice from LGPL 2 to GPL 2, since that's the
+ standard form used in the gnulib repository.
+ * tests/test-lock.c: Likewise.
+ * tests/test-stdint.c: Likewise.
+ * tests/test-tls.c: Likewise.
+
+ * users.txt: Add bison, diffutils, libprelude, prelude-lml,
+ prelude-manager. User shorter URLs for GNU projects, without '?'.
+ Add copyright notice.
+
+ * check-module: Add copyright notice. Output a copyright
+ notice if "--version" is specified.
+ * modules/COPYING: New file.
+ * tests/test-getaddrinfo.c: Add copyright notice.
+ * tests/test-verify.c: Likewise.
+
+2006-08-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Change copyright notice from LGPL 2 to GPL 2, since that's the
+ standard form used in the gnulib repository.
+ * lib/lock.c: LGPL -> GPL.
+ * lib/lock.h: Likewise.
+ * lib/strnlen1.c: Likewise.
+ * lib/strnlen1.h: Likewise.
+ * lib/tls.c: Likewise.
+ * lib/tls.h: Likewise.
+ * lib/tmpdir.c: Likewise.
+
+ * lib/TODO: Remove; this belongs only in coreutils.
+
+2006-08-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Add copyright notices to long-enough files that lack them, since
+ otherwise the files aren't clearly free. Use the same notice that
+ getdate.texi already uses.
+ * doc/alloca-opt.texi: Add copyright notice.
+ * doc/alloca.texi: Likewise.
+ * doc/ctime.texi: Likewise.
+ * doc/functions.texi: Likewise.
+ * doc/gcd.texi: Likewise.
+ * doc/gnulib-tool.texi: Likewise.
+ * doc/inet_ntoa.texi: Likewise.
+ * doc/visibility.texi: Likewise.
+
+ * doc/getdate.texi: Update FDL version from 1.1 to 1.2.
+ * doc/quote.texi: Add copyright notice.
+
+ * doc/solaris-versions: Add SunOS 5.10, SunOS 1.x, SunOS 4.0, SunOS
+ 4.0.x, SunOS 4.1.1.1, SunOS 4.1.1_U1, SunOS 4.1.3B. SunOS 4.1.3
+ was Solaris 1.1A. Remove space before B in Solaris 1.1.1B.
+ Mention SunOS 5.11. Mention that everything before SunOS 5.7
+ is now obsolete, and give a pointer to the Sun list.
+ Add copyright notice.
+
+2006-08-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclistvars.sh: Add copyright notice.
+
+2006-08-14 Eric Blake <ebb9@byu.net>
+
+ Import the following change from libc:
+
+ 2006-08-12 Ulrich Drepper <drepper@redhat.com>
+
+ Upstream bug 2997.
+ * lib/misc/error.c: Add space between program name and message if file
+ name is missing.
+
+2006-08-12 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (ssize_t.m4, sig_atomic_t.m4, signalblocking.m4):
+ remove, these originate in gnulib now.
+
+2006-08-11 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * doc/Makefile (standards.info standards.html standards.dvi):
+ Also depend on make-stds.texi.
+
+2006-08-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/pipe-safer.c (pipe_safer): Fix misspelling: HAVE_FUNC_PIPE ->
+ HAVE_PIPE. Fix a file descriptor leak when fd_safer fails.
+
+ * lib/regex_internal.c (re_string_skip_chars): Don't assume WEOF fits
+ in wchar_t. Problem reported by Eric Blake.
+
+ * lib/snprintf.c (snprintf): memcpy LEN bytes, not SIZE - 1, when
+ LEN is smaller than SIZE. Suggested by Bruno Haible.
+ Also, help the compiler to keep LEN in a register.
+
+2006-08-11 Eric Blake <ebb9@byu.net>
+
+ * users.txt: Sort. Add tar.
+
+2006-08-11 Bruno Haible <bruno@clisp.org>
+
+ * users.txt: New file.
+
+2006-08-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Include <stdio.h> and <time.h>
+ before <wchar.h>. Needed for OSF/1 and BSD/OS.
+
+2006-08-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/snprintf (Depends-on): Remove minmax.
+ (Maintainer): Add self and Bruno.
+
+2006-08-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/.cppi-disable: Add snprintf.h, socket_.h.
+ * lib/snprintf.c: Include <errno.h> and <limits.h>.
+ (EOVERFLOW): Define if the system does not.
+ Do not include "minmax.h"; it wasn't used.
+ (snprintf): Don't assume size_t promotes to an unsigned type.
+ Fix bug when generated string was too long for the buffer: the
+ buffer's contents are supposed to be the initial prefix of the
+ output. Don't assume vasnprintf returns EOVERFLOW if the size
+ exceeds INT_MAX; do the check ourselves.
+
+ Import the following changes from libc:
+
+ 2006-06-02 Jakub Jelinek <jakub@redhat.com>
+
+ * lib/posix/regex_internal.c (re_string_skip_chars): If no character
+ has been converted at all, set *last_wc to WEOF. If mbrtowc failed,
+ set wc to the byte which couldn't be converted.
+ (re_string_reconstruct): Don't clear valid_raw_len before calling
+ re_string_skip_chars. If wc is WEOF after re_string_skip_chars, set
+ tip_context using re_string_context_at.
+
+ 2006-05-02 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/posix/regex.h: g++ still cannot handled [restrict].
+
+ 2006-04-21 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/posix/regex.h: Remove special handling for VMS.
+
+2006-08-10 Jim Meyering <jim@meyering.net>
+
+ * modules/same-inode: New module.
+ * modules/dev-ino: New module.
+ * modules/cycle-check: Depend on these modules, rather than simply
+ including their .h files.
+ (Makefile.am): Don't list cycle-check.[ch] here, now that they're
+ required via m4/cycle-check.m4.
+ * modules/same: Depend on new same-inode module, rather than
+ including same-inode.h.
+ * modules/chdir-safer: New file.
+
+ * modules/chown (Depends-on): Add stat-macros.
+
+2006-08-10 Jim Meyering <jim@meyering.net>
+
+ * m4/cycle-check.m4: New file.
+ Require gl_STRUCT_DEV_INO and gl_SAME_INODE.
+ * m4/dev-ino.m4, m4/same-inode.m4: New files.
+
+2006-08-10 Eric Blake <ebb9@byu.net>
+
+ * modules/verror (Depends-on): Remove bogus gl_VERROR that snuck
+ in from original proposal.
+
+2006-08-10 Eric Blake <ebb9@byu.net>
+ and Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_import): Detect unexpanded macros in gnulib
+ namespace.
+
+2006-08-10 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Detect unexpanded macros here
+ as well.
+
+2006-08-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+
+ 2006-07-19 Mike Frysinger <vapier@gentoo.org>
+
+ * lib/mountlist.c [ME_REMOTE]: Filter out cifs.
+ Reported by Toralf Förster in <http://bugs.gentoo.org/141012>.
+
+2006-08-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/restrict: Remove; no longer needed now that we assume
+ Autoconf 2.59 or later.
+ * MODULES.html.sh: Remove 'restrict'.
+ * modules/argp (Depends-on): Remove 'restrict'.
+ * modules/base64 (Depends-on): Likewise.
+ * modules/gc (Depends-on): Likewise.
+ * modules/getaddrinfo (Depends-on): Likewise.
+ * modules/glob (Depends-on): Likewise.
+ * modules/inet_ntop (Depends-on): Likewise.
+ * modules/inet_pton (Depends-on): Likewise.
+ * modules/memxor (Depends-on): Likewise.
+ * modules/regex (Depends-on): Likewise.
+ * modules/strtok_r (Depends-on): Likewise.
+ * modules/time_r (Depends-on): Likewise.
+
+2006-08-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/argp.m4 (gl_ARGP): Require AC_C_RESTRICT.
+ * m4/gc.m4 (gl_PREREQ_GC): Likewise.
+ * m4/glob.m4 (gl_PREREQ_GLOB): Likewise.
+ * m4/inet_ntop.m4 (gl_PREREQ_INET_NTOP): Likewise.
+ * m4/inet_pton.m4 (gl_PREREQ_INET_PTON): Likewise.
+ * m4/memxor.m4 (gl_MEMXOR): Likewise.
+ * m4/restrict.m4: Remove; no longer needed. All remaining uses of
+ gl_C_RESTRICT replaced by AC_C_RESTRICT.
+
+ Merge from coreutils.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Require AC_C_RESTRICT, not
+ gl_C_RESTRICT, now that we assume Autoconf 2.59 or later.
+ * m4/strtok_r.m4 (gl_FUNC_STRTOK_R): Likewise.
+ * m4/time_r.m4 (gl_TIME_R): Likewise.
+
+2006-08-09 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: no more gettext-tools, per Bruno.
+
+2006-08-08 Eric Blake <ebb9@byu.net>
+
+ * modules/verror: New module.
+ * MODULES.html.sh: Document it.
+
+2006-08-08 Eric Blake <ebb9@byu.net>
+
+ * lib/verror.h, lib/verror.c: New files.
+
+2006-08-08 Eric Blake <ebb9@byu.net>
+
+ * lib/verror.c (verror_at_line): Work around glibc bug 2997, so that
+ verror_at_line output complies with GNU Coding Standards even when
+ file is NULL.
+
+2006-08-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/allocsa.h (sa_alignof) [_AIX]: Also consider 'long long' in newer
+ versions of AIX.
+ Reported by Ralf Wildenhues.
+
+2006-08-07 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Wrap the set of autoconf snippets
+ in an AC_DEFUN. Needed so that the autoconf snippets can use
+ AC_REQUIRE.
+
+2006-08-06 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+ Initialize pkgdata_DATA.
+ * modules/javaversion (Makefile.am): Add to pkgdata_DATA, rather than
+ overriding it.
+
+2006-08-06 Eric Blake <ebb9@byu.net>
+
+ * lib/error.h: Fold in some upstream changes from glibc.
+ * lib/error.c: Likewise.
+
+2006-08-04 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+ Make the mostlyclean-local rule depend on mostlyclean-generic.
+ Reported by Jim Meyering. Solution suggested by Ralf Wildenhues.
+
+2006-07-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/localcharset.m4 (gl_LOCALCHARSET): Remove tests for <stddef.h>,
+ <stdlib.h>, <string.h>.
+
+2006-07-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/readlink (License): Change to LGPL.
+
+2006-07-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/javaversion (Makefile.am): Distribute javaversion.java and
+ javaversion.class. Also install javaversion.class in $(pkgdatadir) and
+ set PKGDATADIR to point to it.
+
+2006-07-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/csharpexec (configure.ac): Comment out macro invocation.
+ * modules/javaexec (configure.ac): Likewise.
+ * modules/javacomp-script (configure.ac): Likewise.
+
+ * modules/csharpcomp-script (configure.ac): Use AC_REQUIRE.
+
+2006-07-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/clean-temp (Depends-on): Add linkedhash-list, remove
+ linked-list.
+
+2006-07-30 Bruno Haible <bruno@clisp.org>
+
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Assume <string.h> exists.
+
+2006-07-30 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+ Initialize MOSTLYCLEANFILES to core and *.stackdump, so that core dumps
+ get removed.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ Make it possible for gnulib-tool to work with locally modified or
+ augmented gnulib repositories.
+ * gnulib-tool (func_usage): Document --local-dir option.
+ (local_gnulib_dir): New variable.
+ Handle --local-dir option.
+ (func_lookup_file): New function.
+ (func_all_modules, func_verify_module): Look also in $local_gnulib_dir.
+ (func_get_description, func_get_filelist, func_get_description,
+ func_get_filelist, func_get_dependencies, func_get_autoconf_snippet,
+ func_get_automake_snippet, func_get_include_directive,
+ func_get_license, func_get_maintainer): Use func_lookup_file.
+ (func_import, func_create_testdir): Use func_lookup_file.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/setenv (Depends-on): Add unistd.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/setenv.c: Undo unintended modification done on 2006-02-27.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c: Assume <stddef.h>, <stdlib.h>, <string.h> exist.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (import, update): If there is no Makefile.am, look at
+ aclocal.m4, instead of bailing out.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_usage): Revert most of the 2006-07-15 change.
+ Categorize the options by when they are useful.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_usage): Document option --no-libtool.
+ Handle option --no-libtool.
+ (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am): Update
+ for changed semantics of $libtool variable.
+ (func_import): Likewise. If libtool is not used, show this through
+ an option --no-libtool.
+ (func_create_testdir): Update.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Extend error message about missing
+ --doc-base.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Don't create the $docbase directory if
+ there is no file to store there.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (autoconf_minversion): If a --dir option is given and
+ relevant, look for configure.ac there, not in the current directory.
+ Also use a simple search for AC_PREREQ, not "autoconf --trace".
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (SORT): New variable.
+ (func_usage): Undocument --assume-autoconf option.
+ Remove --assume-autoconf option handling.
+ (autoconf_minversion): Determine from the contents of configure.ac.
+ (func_import): Remove autoconf_minversion handling.
+ Suggested by Eric Blake.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib-tool.texi (gl_LIBTOOL): Mention --no-libtool option.
+
+2006-07-29 Bruno Haible <bruno@clisp.org>
+
+ * config/srclist.txt (*setenv.[ch]): Remove rules.
+
+2006-07-28 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * m4/inet_pton.m4, inet_ntop.m4: Check for netinet/in.h too.
+
+2006-07-28 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * lib/inet_ntop.h, inet_pton.h: Need to include netinet/in.h before
+ arpa/inet.h.
+
+2006-07-28 Simon Josefsson <jas@extundo.com>
+
+ * modules/inet_ntop (Depends-on): Depend on arpa_inet.
+ * modules/inet_pton (Depends-on): Likewise.
+
+2006-07-28 Simon Josefsson <jas@extundo.com>
+
+ * m4/netinet_in_h.m4: New file.
+
+2006-07-28 Simon Josefsson <jas@extundo.com>
+
+ * lib/inet_ntop.h, inet_pton.h: No need to guard netinet/in.h
+ #include's.
+
+2006-07-28 Simon Josefsson <jas@extundo.com>
+
+ * lib/inet_ntop.h, inet_pton.h: No need to guard arpa/inet.h
+ #include's.
+
+2006-07-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/modechange.c (mode_compile): Numeric modes now affect setuid and
+ setgid on directories only if they set these bits.
+ * lib/modechange.h: Remove obsolete comment about masks.
+
+2006-07-28 Eric Blake <ebb9@byu.net>
+
+ * lib/regex_internal.h (struct re_dfa_t) [!_LIBC]: Avoid invalid C89
+ macro expansion.
+
+2006-07-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/inet_ntop.h, inet_pton.h: Use #if HAVE* instead of #ifdef HAVE*.
+
+2006-07-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbchar.m4 (gl_MBCHAR): Also test for iswcntrl.
+
+2006-07-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbchar.h (iswalnum, iswalpha, iswblank, iswcntrl, iswdigit,
+ iswgraph, iswlower, iswprint, iswpunct, iswspace, iswupper, iswxdigit):
+ Define fallbacks.
+ Avoids link error on FreeBSD 4.x.
+ Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
+ * lib/wcwidth.h (iswprint): Assume an ASCII compatible wide character
+ encoding.
+ * lib/mbswidth.c (iswcntrl): Likewise.
+
+2006-07-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Define __STDC_CONSTANT_MACROS during the
+ test.
+
+2006-07-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (INT*_C, UINT*_C) [C++]: Define these if
+ __STDC_CONSTANT_MACROS is defined, not if __STDC_LIMIT_MACROS is
+ defined.
+
+2006-07-26 Eric Blake <ebb9@byu.net>
+
+ * m4/unistd-safer.m4 (gl_UNISTD_SAFER): Check for missing pipe.
+
+2006-07-26 Eric Blake <ebb9@byu.net>
+
+ * lib/mkstemp-safer.c [! HAVE_MKSTEMP]: Add prototype for platforms
+ like mingw that lack mkstemp.
+ * lib/pipe-safer.c (pipe_safer) [!HAVE_FUNC_PIPE]: Provide fallback to
+ avoid compilation warning on mingw.
+
+2006-07-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Also verify the existence of the macros
+ INT*_MIN, INT_LEAST*_MAX, INT_LEAST*_MIN, UINT_LEAST*_MAX,
+ INT_FAST*_MIN, INTPTR_MIN.
+
+2006-07-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/version-etc (Depends-on): Add stdarg.
+
+2006-07-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_INTEGER_TYPE_SUFFIX): Avoid 'eval' in front of
+ complex commands.
+
+2006-07-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/version-etc.c (version_etc_va): Use va_copy, assumed to be
+ defined in <stdarg.h> or config.h.
+
+2006-07-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stdio-safer.m4 (gl_FOPEN_SAFER, gl_TMPFILE_SAFER): New macros.
+ (gl_STDIO_SAFER): Remove.
+
+2006-07-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (File stream based Input/Output):
+ Add fopen-safer, tmpfile-safer; remove stdio-safer.
+ * modules/getusershell (Depends-on): Change stdio-safer to fopen-safer.
+ * modules/fopen-safer, modules/tmpfile-safer: New files.
+ * modules/stdio-safer: Remove.
+
+2006-07-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/tmpdir: New file.
+ * MODULES.html.sh (File system functions): Add it.
+
+2006-07-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/javacomp (Depends-on): Add unistd, javaversion, binary-io,
+ getline, pathname, fwriteerror, clean-temp, xvasprintf, strstr.
+
+2006-07-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/clean-temp: New file.
+
+2006-07-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/tmpdir.m4: New file, from GNU gettext.
+
+2006-07-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/tmpdir.h: New file, from GNU gettext.
+ * lib/tmpdir.c: New file, from GNU gettext.
+
+2006-07-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/clean-temp.h: New file, from GNU gettext.
+ * lib/clean-temp.c: New file, from GNU gettext.
+
+2006-07-23 Eric Blake <ebb9@byu.net>
+
+ * modules/stdio-safer (Files): Add tmpfile-safer.c.
+ (Depends-on): Add binary-io.
+
+2006-07-23 Eric Blake <ebb9@byu.net>
+
+ * m4/stdio-safer.m4 (gl_STDIO_SAFER): Add tmpfile-safer.c.
+
+2006-07-23 Eric Blake <ebb9@byu.net>
+
+ * lib/tmpfile-safer.c: New file.
+ * lib/stdio-safer.h (fopen_safer): Add prototype.
+ * lib/stdio--.h (tmpfile): Make safer.
+
+2006-07-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_anylinked_list2.h (ASYNCSAFE): New macro.
+ (gl_linked_add_first, gl_linked_add_last, gl_linked_add_before,
+ gl_linked_add_after, gl_linked_add_at, gl_linked_remove_node,
+ gl_linked_remove_at): Use it.
+
+2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ and Simon Josefsson <jas@extundo.com>
+
+ * lib/getaddrinfo.h (AI_PASSIVE): Make sure it is defined.
+
+ * lib/getaddrinfo.c (getaddrinfo): Support AI_PASSIVE.
+
+2006-07-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/close-stream: New file.
+ * modules/closeout (Description): Make it clear that it exits
+ with a diagnostic on error.
+ (Depends-on): Add close-stream. Remove fpending, stdbool.
+ * MODULES.html.sh (File stream based Input/Output): Add close-stream.
+
+2006-07-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/close-stream.m4: New file.
+
+2006-07-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/close-stream.c, lib/close-stream.h: New files.
+
+2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ Merge from GNU gettext 0.15.
+
+ 2006-05-01 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/javacomp.sh.in: Update for changed javacomp.m4.
+
+ 2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/javaversion: New file.
+ * MODULES.html.sh (Java): Add javaversion.
+
+ 2006-03-12 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/javaexec.sh.in: Update for changed javaexec.m4.
+
+ 2005-12-04 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/csharpexec.sh.in: Add support for 'clix' launcher
+ (untested).
+
+ 2006-06-21 Bruno Haible <bruno@clisp.org>
+
+ Avoid warnings from recent versions of mcs.
+ * build-aux/csharpcomp.sh.in (options_mcs): Don't use options
+ -o, -L, -r any more. Use options documented since mcs-1.0
+ instead. Similarly for -g.
+
+ 2005-12-04 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/csharpcomp.sh.in: Suffix for resources is
+ .resources, not .resource.
+
+ 2005-07-09 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/csharpcomp.sh.in (options_csc): For -l option,
+ add a .dll suffix.
+ Reported by Mark Junker <mjscod@gmx.de>.
+
+ 2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/gettext: Upgrade to gettext-0.15.
+ (Files): Remove m4/isc-posix.m4. Add m4/lock.m4,
+ m4/visibility.m4.
+ Replace m4/inttypes.m4 with m4/inttypes-h.m4.
+
+2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ Merge from GNU gettext 0.15.
+
+ 2006-03-25 Bruno Haible <bruno@clisp.org>
+
+ * lib-link.m4 (AC_LIB_LINKFLAGS_FROM_LIBS): New macro.
+
+ 2006-07-21 Bruno Haible <bruno@clisp.org>
+
+ * javacomp.m4 (gt_JAVACOMP): Convert target_version "null" to
+ "1.1".
+
+ 2006-05-09 Bruno Haible <bruno@clisp.org>
+
+ * javacomp.m4 (gt_JAVACOMP): On Cygwin, set
+ CLASSPATH_SEPARATOR to a semicolon. Use CLASSPATH_SEPARATOR
+ for the conftestver execution.
+
+ 2006-05-01 Bruno Haible <bruno@clisp.org>
+
+ * javacomp.m4 (gt_JAVACOMP): Accept a source-version and an
+ optional target-version argument. Verify that the compiler
+ groks source of the specified source-version, or add -source
+ option as necessary. Verify that the compiler produces
+ bytecode in the specified target-version, or add -target and
+ -source options as necessary. Make the result of the test
+ available as variable CONF_JAVAC. Also log error output in
+ config.log.
+
+ 2006-03-11 Bruno Haible <bruno@clisp.org>
+
+ * javacomp.m4 (gt_JAVACOMP): Treat gcj-4.x like gcj-3.x.
+
+ 2006-05-09 Bruno Haible <bruno@clisp.org>
+
+ * javaexec.m4 (gt_JAVAEXEC): On Cygwin, set
+ CLASSPATH_SEPARATOR to a semicolon.
+
+ 2006-03-12 Bruno Haible <bruno@clisp.org>
+
+ * javaexec.m4 (gt_JAVAEXEC): Make the result of the test
+ available as variable CONF_JAVA, for subsequent autoconf
+ tests. Also log error output in config.log.
+
+ 2006-07-19 Bruno Haible <bruno@clisp.org>
+
+ * getline.m4 (AM_FUNC_GETLINE): When cross-compiling, assume
+ that getline works on glibc2 systems. Needed to avoid trouble
+ in relocatable.c.
+ Reported by Nils Magnus Larsgard <nmlarsgaard@atmel.no>.
+
+ 2005-12-04 Bruno Haible <bruno@clisp.org>
+
+ * csharpexec.m4 (gt_CSHARPEXEC): Add support for 'clix'
+ launcher (untested).
+
+ 2005-12-04 Bruno Haible <bruno@clisp.org>
+
+ * csharpcomp.m4 (gt_CSHARPCOMP): Also set CSHARPCOMPFLAGS.
+
+ 2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ * gettext.m4: Update from GNU gettext-0.15.
+ * nls.m4: Likewise.
+ * po.m4: Likewise.
+ * inttypes-pri.m4: Likewise.
+ * inttypes-h.m4: Renamed from inttypes.m4.
+ (gl_HEADER_INTTYPES_H): Renamed from gt_HEADER_INTTYPES_H.
+
+2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ Merge from GNU gettext 0.15.
+
+ 2005-07-05 Bruno Haible <bruno@clisp.org>
+
+ * printf-args.c (printf_fetchargs): Work around broken
+ definition of wint_t on mingw.
+
+ 2005-02-12 Bruno Haible <bruno@clisp.org>
+
+ * xallocsa.h: Add extern "C" for C++.
+
+ 2006-05-17 Bruno Haible <bruno@clisp.org>
+
+ Cygwin portability.
+ * progreloc.c (WIN32_NATIVE): Renamed from WIN32.
+
+ 2006-04-30 Bruno Haible <bruno@clisp.org>
+
+ * progreloc.c: Include <mach-o/dyld.h> if available.
+ (find_executable): Use _NSGetExecutablePath when possible.
+
+ 2006-05-06 Charles Wilson <cygwin@cwilson.fastmail.fm>
+
+ * progreloc.c (maybe_executable) [CYGWIN]: Use the access()
+ function.
+
+ 2005-12-29 Bruno Haible <bruno@clisp.org>
+
+ * progreloc.c (set_program_name_and_installdir): Fix
+ compilation error.
+
+ 2005-12-04 Bruno Haible <bruno@clisp.org>
+
+ Cygwin portability.
+ * progreloc.c: Include <windows.h> also on Cygwin.
+ (find_executable): Add support for Cygwin.
+ (set_program_name_and_installdir): Handle also platforms with
+ nonempty EXEEXT.
+
+ 2006-07-11 Bruno Haible <bruno@clisp.org>
+
+ * javacomp.c: Fix a comment.
+ Reported by Jim Meyering.
+
+ 2006-04-30 Bruno Haible <bruno@clisp.org>
+
+ * javacomp.h (compile_java_class): Add source_version,
+ target_version arguments.
+ * javacomp.c: Rewritten to choose only a compiler that
+ respects the specified source_version and target_version.
+
+ 2006-06-27 Bruno Haible <bruno@clisp.org>
+
+ Assume correct S_ISDIR macro.
+ * mkdtemp.c: Remove test of STAT_MACROS_BROKEN.
+
+ 2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ * javaversion.h: New file, from GNU gettext.
+ * javaversion.c: New file, from GNU gettext.
+ * javaversion.java: New file, from GNU gettext.
+ * javaversion.class: New file, from GNU gettext.
+
+ 2006-05-17 Bruno Haible <bruno@clisp.org>
+
+ Cygwin portability.
+ * javaexec.c (execute_java_class): Test for jview program
+ also on Cygwin.
+
+ 2006-04-09 Bruno Haible <bruno@clisp.org>
+
+ * fatal-signal.c: Don't include string.h.
+ (at_fatal_signal): Use a copying loop instead of memcpy.
+
+ 2005-12-04 Bruno Haible <bruno@clisp.org>
+
+ * csharpexec.c: Add support for 'clix' launcher (untested).
+ (execute_csharp_using_sscli): New function.
+ (execute_csharp_program): Call it.
+
+ 2006-06-21 Bruno Haible <bruno@clisp.org>
+
+ Avoid warnings from recent versions of mcs.
+ * csharpcomp.c (compile_csharp_using_mono): Don't use options
+ -o, -L, -r any more. Use options documented since mcs-1.0
+ instead. Similarly for -g.
+
+ 2005-07-09 Bruno Haible <bruno@clisp.org>
+
+ * csharpcomp.c (compile_csharp_using_sscli): For -l option,
+ add a .dll suffix.
+ Reported by Mark Junker <mjscod@gmx.de>.
+
+ 2006-06-17 Bruno Haible <bruno@clisp.org>
+
+ * config.charset: Update for NetBSD 3.0.
+
+ 2006-05-17 Bruno Haible <bruno@clisp.org>
+
+ Cygwin portability.
+ * localcharset.c (WIN32_NATIVE): Renamed from WIN32.
+
+ 2006-05-16 Bruno Haible <bruno@clisp.org>
+
+ * localcharset.c [CYGWIN]: Include <windows.h>.
+ (get_charset_aliases): For Cygwin, return the same CPxxx
+ aliases list as under WIN32.
+ (locale_charset) [CYGWIN]: Try to retrieve the encoding from
+ the environment variables. Fall back to GetACP().
+
+ 2006-04-05 Bruno Haible <bruno@clisp.org>
+
+ * config.charset: Update Juan Manuel Guerrero's address.
+
+ 2005-02-12 Bruno Haible <bruno@clisp.org>
+
+ * allocsa.h: Add extern "C" for C++.
+
+ 2005-02-10 Bruno Haible <bruno@clisp.org>
+
+ * allocsa.h (sa_alignof): Define differently with AIX xlc, to
+ avoid a bug of this compiler on AIX 3.2.5 dealing with enums.
+
+ 2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ * gettext.h: Update to GNU gettext-0.15.
+
+2006-07-22 Bruno Haible <bruno@clisp.org>
+
+ * config/srclist.txt: Resync printf-args.c, vasnprintf.c,
+ localcharset.c, mkdtemp.c, config.rpath, lib-ld.m4, lib-link.m4,
+ lib-prefix.m4, longdouble.m4, ssize_t.m4.
+
+2006-07-21 Eric Blake <ebb9@byu.net>
+
+ * modules/stdlib-safer: New file.
+ * MODULES.html.sh (File stream based Input/Output): Add
+ stdlib-safer.
+
+2006-07-21 Eric Blake <ebb9@byu.net>
+
+ * lib/stdlib-safer.h: New file from coreutils, required by
+ stdlib--.h.
+
+2006-07-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool (func_usage): Document --assume-autoconf='latest-stable'.
+
+2006-07-20 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Recognize new option --assume-autoconf.
+ (autoconf_minversion): New variable.
+ (func_get_filelist): Use it to decide whether to add onceonly_2_57.m4.
+
+2006-07-20 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (func_all_modules): Add a missing func_begin_table.
+
+2006-07-19 Derek R. Price <derek@ximbiot.com>
+
+ * lib/getaddrinfo.h: Don't define unimplemented AI_* flags.
+ Reindent and repaginate.
+
+2006-07-19 Derek Price <derek@ximbiot.com>
+
+ * doc/gnulib.texi (Libtool and Windows): Eliminate passive voice.
+ Correct grammar.
+
+2006-07-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/list: New file.
+ * modules/array-list: New file.
+ * modules/carray-list, modules/carray-list-tests: New files.
+ * modules/linked-list, modules/linked-list-tests: New files.
+ * modules/avltree-list, modules/avltree-list-tests: New files.
+ * modules/rbtree-list, modules/rbtree-list-tests: New files.
+ * modules/linkedhash-list, modules/linkedhash-list-tests: New files.
+ * modules/avltreehash-list, modules/avltreehash-list-tests: New files.
+ * modules/rbtreehash-list, modules/rbtreehash-list-tests: New files.
+ * modules/oset: New file.
+ * modules/array-oset: New file.
+ * modules/avltree-oset, modules/avltree-oset-tests: New files.
+ * modules/rbtree-oset, modules/rbtree-oset-tests: New files.
+ * tests/test-carray_list.c: New file.
+ * tests/test-linked_list.c: New file.
+ * tests/test-avltree_list.c: New file.
+ * tests/test-rbtree_list.c: New file.
+ * tests/test-linkedhash_list.c: New file.
+ * tests/test-avltreehash_list.c: New file.
+ * tests/test-rbtreehash_list.c: New file.
+ * tests/test-avltree_oset.c: New file.
+ * tests/test-rbtree_oset.c: New file.
+ * MODULES.html.sh (Container data structures): New section.
+
+2006-07-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/gl_list.m4: New file.
+
+2006-07-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/gl_list.h: New file.
+ * lib/gl_list.c: New file.
+ * lib/gl_array_list.h: New file.
+ * lib/gl_array_list.c: New file.
+ * lib/gl_carray_list.h: New file.
+ * lib/gl_carray_list.c: New file.
+ * lib/gl_linked_list.h: New file.
+ * lib/gl_linked_list.c: New file.
+ * lib/gl_anylinked_list1.h: New file.
+ * lib/gl_anylinked_list2.h: New file.
+ * lib/gl_avltree_list.h: New file.
+ * lib/gl_avltree_list.c: New file.
+ * lib/gl_anyavltree_list1.h: New file.
+ * lib/gl_anyavltree_list2.h: New file.
+ * lib/gl_rbtree_list.h: New file.
+ * lib/gl_rbtree_list.c: New file.
+ * lib/gl_anyrbtree_list1.h: New file.
+ * lib/gl_anyrbtree_list2.h: New file.
+ * lib/gl_anytree_list1.h: New file.
+ * lib/gl_anytree_list2.h: New file.
+ * lib/gl_linkedhash_list.h: New file.
+ * lib/gl_linkedhash_list.c: New file.
+ * lib/gl_anyhash_list1.h: New file.
+ * lib/gl_anyhash_list2.h: New file.
+ * lib/gl_avltreehash_list.h: New file.
+ * lib/gl_avltreehash_list.c: New file.
+ * lib/gl_rbtreehash_list.h: New file.
+ * lib/gl_rbtreehash_list.c: New file.
+ * lib/gl_anytreehash_list1.h: New file.
+ * lib/gl_anytreehash_list2.h: New file.
+
+ * lib/gl_oset.h: New file.
+ * lib/gl_oset.c: New file.
+ * lib/gl_array_oset.h: New file.
+ * lib/gl_array_oset.c: New file.
+ * lib/gl_avltree_oset.h: New file.
+ * lib/gl_avltree_oset.c: New file.
+ * lib/gl_rbtree_oset.h: New file.
+ * lib/gl_rbtree_oset.c: New file.
+ * lib/gl_anytree_oset.h: New file.
+
+2006-07-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/mkancesdirs.m4: New file.
+ * m4/mkdir-p.m4 (gl_MKDIR_PARENTS): Mention dirchownmod.c,
+ dirchownmod.h. Don't require AC_FUNC_ALLOCA, gl_AFS, gl_CHDIR_SAFER;
+ no longer needed. Require gl_FUNC_LCHOWN, since dirchownmod.c needs
+ it.
+
+2006-07-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/dirchownmod.c, lib/dirchownmod.h, lib/mkancesdirs.c:
+ * lib/mkancesdirs.h: New files.
+ * lib/mkdir-p.c: Don't include alloca.h, stdio.h, sys/types.h,
+ unistd.h, string.h, chdir-safer.h, dirname.h, lchmod.h, lchown.h,
+ save-cwd.h. Instead, include dirchownmod.h and mkancesdirs.h.
+ (make_dir_parents): New args MAKE_ANCESTOR, OPTIONS, ANNOUNCE,
+ MODE_BITS. Remove options VERBOSE_FMT_STRING, CWD_ERRNO. All
+ callers changed. Revamp internals significantly, by not
+ attempting to create directories that are temporarily more
+ permissive than the final results. Do not attempt to use
+ save_cwd/restore_cwd; it isn't worth it for mkdir and install.
+ This removes some race conditions, fixes some bugs, and simplifies
+ things. Use new dirchownmod function to do owner and mode changes.
+ * lib/mkdir-p.h: Likewise.
+ * lib/modechange.c (octal_to_mode): New function.
+ (struct mode_change): New member mentioned.
+ (make_node_op_equals): New arg mentioned. All callers changed.
+ (mode_compile): Keep track of which mode bits the user has explicitly
+ mentioned.
+ (mode_adjust): New arg DIR, so that we implement the X op correctly.
+ New arg PMODE_BITS, to keep track of which mode bits the user
+ mentioned; it treats S_ISUID and S_ISGID speciall.
+ All callers changed.
+ * lib/modechange.h: Likewise.
+
+2006-07-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh: Add mkancestors.
+ * modules/mkancesdirs: New module.
+ * modules/mkdir-p (Files): Remove lib/chdir-safer.c, lib/chdir-safer.h,
+ lib/same-inode.h, m4/afs.m4, m4/chdir-safer.m4.
+ The chdir-safer and afs files are now orphans; I'll remove them
+ unless someone speaks up.
+ Add lib/dirchownmod.c, lib/dirchownmod.h.
+ (Depends-on): Remove alloca, chown, save-cwd, dirname.
+ Add lchown, mkancesdirs.
+ (Maintainer): Add self.
+
+2006-07-15 Karl Berry <karl@gnu.org>
+
+ * gnulib-tool: help message wording/arrangement.
+
+2006-07-14 Simon Josefsson <jas@extundo.com>
+
+ * doc/gnulib.texi (Libtool and Windows): New section.
+
+2006-07-12 Simon Josefsson <jas@extundo.com>
+
+ * modules/gendocs (License): Fix license, approved by Karl.
+
+2006-07-12 Eric Blake <ebb9@byu.net>
+
+ * MODULES.html.sh: Add gendocs.
+
+2006-07-11 Eric Blake <ebb9@byu.net>
+
+ * modules/fdl: New module, to install doc/fdl.texi.
+ * MODULES.html.sh: Add new section for documentation modules.
+ * gnulib-tool: Avoid space-tab.
+ (--doc-base): New option, to manage files from doc.
+
+2006-07-11 Eric Blake <ebb9@byu.net>
+
+ * m4/absolute-header.m4: Fix comments to match recent change.
+
+2006-07-11 Eric Blake <ebb9@byu.net>
+
+ * gnulib-tool: List --doc-base before --tests-base.
+
+2006-07-11 Derek R. Price <derek@ximbiot.com>
+
+ * lib/glob.c: s/NAMLEN/_D_EXACT_NAMLEN/.
+
+2006-07-11 Bruno Haible <bruno@clisp.org>
+
+ * README: Mention where to put documentation.
+
+2006-07-10 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * doc/functions.texi, gnulib-tool.texi, gnulib.texi: Fix some typos.
+
+2006-07-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Like today's change
+ to stdint.m4.
+
+2006-07-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stdint.m4 (gl_STDINT_H): Like yesterday's change to
+ absolute-header.m4. Also, set ABSOLUTE_STDINT_H to a string
+ "no/such/file/stdint.h" when there is no such file, so that
+ the resulting C code can be parsed by dodgy compilers.
+ Problems reported by Bob Proulx.
+
+2006-07-10 Derek R. Price <derek@ximbiot.com>
+
+ * lib/backupfile.c, dirfd.h, fts.c, getcwd.c, glob.c, glob_.h:
+ Ignore the obsolescent !HAVE_DIRENT_H case. Consolidate NAMLEN
+ macros into the GNU _D_EXACT_NAMLEN.
+ * lib/savedir.c: Likewise.
+ (savedirstream): Use _D_EXACT_NAMLEN in preference to strlen.
+
+2006-07-10 Derek R. Price <derek@ximbiot.com>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/backupfile.m4, d-ino.m4, d-type.m4, dirfd.m4, fts.m4, getcwd.m4:
+ * m4/savedir.m4:
+ Ignore the obsolescent !HAVE_DIRENT_H case. Consolidate NAMLEN
+ macros into the GNU _D_EXACT_NAMLEN.
+
+2006-07-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/absolute-header.m4 (gl_ABSOLUTE_HEADER): Use "" rather than <>
+ around the absolute name, to work around a problem with the HP-UX
+ 11.23 native C compiler, reported by Bob Proulx.
+
+2006-07-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/maintain.texi, make-stds.texi: Sync from
+ <http://savannah.gnu.org/projects/gnustandards>.
+
+2006-07-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * build-aux/depcomp, build-aux/install-sh: Sync from Automake.
+
+2006-07-09 Jim Meyering <jim@meyering.net>
+
+ * m4/glob.m4: Remove a doubled word in a comment.
+
+2006-07-09 Jim Meyering <jim@meyering.net>
+
+ * lib/argp-pv.c: Remove a doubled word in a comment.
+ * lib/check-version.c (check_version): Likewise.
+ * lib/javacomp.c (compile_java_class): Likewise.
+
+2006-07-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool (func_get_filelist): Don't echo m4/onceonly_2_57.m4,
+ for the benefit of people using Autoconf 2.60. If you want to
+ support older Autoconf versions you can copy m4/onceonly_2_57.m4
+ (or m4/onceonly.m4, if pre-2.57) manually.
+
+2006-07-08 Jim Meyering <jim@meyering.net>
+
+ * m4/link-follow.m4: Remove one of two adjacent "whether"s in a
+ comment.
+ * m4/getopt.m4: Remove one of two adjacent "your"s in a comment.
+ * m4/regex.m4 (gl_REGEX): Remove one of two adjacent "the"s in a
+ comment.
+
+2006-07-08 Jim Meyering <jim@meyering.net>
+
+ * lib/getndelim2.h (getndelim2): Remove doubled "after" in comment.
+
+2006-07-07 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-crc.c: Change expected crc value, the test vector
+ were probably computed using the old broken crc.c?
+
+2006-07-06 Simon Josefsson <jas@extundo.com>
+
+ * modules/sys_socket (Files): Add m4/sockpfaf.m4 (this module is
+ now the canonical place for the M4 file).
+
+ * modules/getaddrinfo (Files): Remove m4/sockpfaf.m4, we get it
+ from the sys_socket dependency now.
+
+ * modules/inet_pton (Files): Ditto.
+
+ * modules/inet_ntop (Files): Ditto.
+
+2006-07-06 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> (tiny change)
+
+ * modules/getusershell (configure.ac): Use gl_FUNC_GETUSERSHELL,
+ not gl_PREREQ_GETUSERSHELL.
+
+2006-07-06 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/_inttypes_h.m4 (gl_INTTYPES_H): Use AC_CHECK_DECLS_ONCE
+ with only one argument, for Autoconf 2.60.
+ * m4/fileblocks.m4 (gl_PREREQ_FILEBLOCKS): AC_CHECK_DECLS_ONCE may
+ expand to nothing, so add a shell command to avoid syntax error.
+ * m4/getpass.m4 (gl_PREREQ_GETPASS): Likewise.
+
+2006-07-06 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/strtod.c (strtod): cast the argument of tolower to unsigned char.
+
+2006-07-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Don't check for getenv decl;
+ no longer needed. Check for isblank decl.
+ * m4/mkstemp.m4 (gl_PREREQ_TEMPNAME): Don't check for getenv decl.
+ * m4/regex.m4 (gl_PREREQ_REGEX): Dheck for isblank decl instead
+ of existence.
+
+2006-07-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getloadavg.c: Use __VMS, not VMS.
+ * lib/getopt.c: Likewise.
+ * lib/getpagesize.h: Likewise.
+ * lib/glob.c: Remove most VMS cruft; it hasn't been tested for a while
+ and probably does not work.
+
+2006-07-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/.cppi-disable: Add wcwidth.
+ * lib/fnmatch.c (ISBLANK): Remove. All uses changed to isblank.
+ (isblank) [! (defined isblank || HAVE_DECL_ISBLANK)]: New macro.
+ (ISGRAPH): Remove. All uses changed to isgraph.
+ (FOLD) [!defined _LIBC]: Remove special case.
+ * lib/getdate.y (lookup_word): Remove no-longer-needed call to islower.
+ * lib/regex_internal.h (isblank): Depend on HAVE_DECL_ISBLANK, not
+ HAVE_ISBLANK.
+ * lib/strftime.c (TOLOWER, TOUPPER) [!defined _LIBC]: Remove special
+ case.
+
+2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
+
+ * lib/getaddrinfo.c: Changes to compile under MSVC6: changed
+ '#if WIN32_NATIVE' to '#ifdef' & moved WSAAPI macro inside
+ brackets. Other minor changes to suppress some compiler
+ warnings.
+
+2006-07-06 Derek R. Price <derek@ximbiot.com>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/backupfile.m4 (gl_BACKUPFILE): Check for dirent.h, instead
+ of invoking obsolescent AC_HEADER_DIRENT macro.
+ * m4/d-ino.m4 (gl_CHECK_TYPE_STRUCT_DIRENT_D_INO): Likewise.
+ * m4/d-type.m4 (gl_CHECK_TYPE_STRUCT_DIRENT_D_TYPE): Likewise.
+ * m4/dirfd.m4 (gl_FUNC_DIRFD): Likewise.
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Likewise.
+ * m4/getcwd.m4 (gl_PREREQ_GETCWD): Likewise.
+ * m4/glob.m4 (gl_PREREQ_GLOB): Likewise.
+ * m4/savedir.m4 (gl_SAVEDIR): Likewise.
+ * m4/readdir.m4: Remove; no longer needed.
+
+2006-07-06 Derek R. Price <derek@ximbiot.com>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/backupfile.c [HAVE_DIRENT_H && ! HAVE_NDIR_H]:
+ Don't worry about this obsolete case any more.
+ (HAVE_DIR): Remove. All uses removed; we now assume you can read
+ directories.
+ * lib/dirfd.h [HAVE_DIRENT_H && ! HAVE_NDIR_H]: Don't
+ worry about this obsolete case any more.
+ * lib/fts.c: Likewise.
+ * lib/getcwd.c: Likewise.
+ * lib/glob.h: Likewise.
+ * lib/savedir.c: Likewise.
+
+2006-07-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/xstrtol.m4 (gl_PREREQ_XSTRTOL): Use AC_CHECK_DECLS_ONCE
+ rather than AC_CHECK_DECLS for strtoimax and strtoumax.
+ * m4/getusershell.m4 (gl_PREREQ_GETUSERSHELL): Remove; no longer
+ needed.
+ All uses removed.
+ * m4/strtol.m4 (gl_PREREQ_STRTOL): Likewise.
+ * m4/strtoul.m4 (gl_PREREQ_STRTOUL): Likewise.
+ * m4/exclude.m4 (gl_EXCLUDE): Don't check for isascii; no longer
+ needed.
+ * m4/getdate.m4 (gl_GETDATE): Likewise.
+ * m4/getusershell.m4 (gl_PREREQ_GETUSERSHELL): Likewise.
+ * m4/memcasecmp.m4 (gl_MEMCASECMP): Likewise.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Likewise.
+ * m4/strtol.m4 (gl_PREREQ_STRTOL): Likewise.
+ * m4/strtoul.m4 (gl_PREREQ_STRTOUL): Likewise.
+ * m4/xstrtol.m4 (gl_PREREQ_XSTRTOL): Likewise.
+ * m4/exclude.m4 (gl_EXCLUDE): Don't require AC_C_INLINE; no longer
+ needed.
+
+2006-07-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/memcasecmp.c: Include <limits.h>.
+ (memcasecmp): Don't assume UCHAR_MAX <= INT_MAX.
+ * lib/strtod.c (strtod): Don't assume isspace works on negative chars.
+ Don't assume isdigit succeeds only on '0' through '9'.
+
+2006-07-05 Eric Blake <ebb9@byu.net>
+
+ * modules/getaddrinfo (Depends-on): Add snprintf.
+
+2006-07-05 Eric Blake <ebb9@byu.net>
+
+ * m4/sockpfaf.m4 (gl_SOCKET_FAMILIES): Use gl_HEADER_SYS_SOCKET
+ to avoid 'header present but could not be compiled' on cygwin.
+
+2006-07-05 Eric Blake <ebb9@byu.net>
+
+ * lib/getaddrinfo.h (NI_NUMERICHOST, NI_NUMERICSERV): Define if
+ missing from netdb.h.
+ * lib/getaddrinfo.c (includes): Include inet_ntop and snprintf.
+
+2006-07-05 Derek R. Price <derek@ximbiot.com>
+
+ * m4/calloc.m4 (_AC_FUNC_CALLOC_IF): Don't require AC_HEADER_STDC;
+ no longer needed.
+ * m4/exclude.m4 (gl_EXCLUDE): Likewise.
+ * m4/getdate.m4 (gl_GETDATE): Likewise.
+ * m4/getusershell.m4 (gl_PREREQ_GETUSERSHELL): Likewise.
+ * m4/memcasecmp.m4 (gl_MEMCASECMP): Likewise.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Likewise.
+ * m4/strtol.m4 (gl_PREREQ_STRTOL): Likewise.
+ * m4/xstrtol.m4 (gl_PREREQ_XSTRTOL): Likewise.
+
+2006-07-05 Derek R. Price <derek@ximbiot.com>
+
+ * lib/exclude.c (IN_CTYPE_DOMAIN, is_space): Remove; no longer needed.
+ All uses of is_space replaced by isspace.
+ * lib/exit.h: Don't talk about STDC_HEADERS.
+ * lib/fnmatch.c (ISASCII): Remove; no longer needed. All uses removed.
+ (ISPRINT, ISDIGIT, ISALNUM, ISALPHA, ISCNTRL, ISLOWER, ISPUNCT):
+ (ISSPACE, ISUPPER, ISXDIGIT): Remove; no longer needed. All uses
+ replaced by isprint etc.
+ * lib/getdate.y (IN_CTYPE_DOMAIN, ISSPACE, ISALPHA, ISLOWER): Likewise.
+ * lib/getusershell.c (IN_CTYPE_DOMAIN, ISSPACE): Likewise.
+ * lib/memcasecmp.c (IN_CTYPE_DOMAIN, ISLOWER, TOUPPER): Likewise.
+ * lib/strtod.c (IN_CTYPE_DOMAIN, ISSPACE, ISDIGIT, TOLOWER): Likewise.
+ * lib/strtol.c (IN_CTYPE_DOMAIN): Likewise.
+ * lib/xstrtol.c (IN_CTYPE_DOMAIN, ISSPACE): Likewise.
+
+2006-07-05 Bruno Haible <bruno@clisp.org>
+
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): When cross-compiling, check whether
+ the function exists, before testing against AIX.
+ Reported by Martin Lambers <marlam@marlam.de>.
+
+2006-07-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/cycle-check (lib_SOURCES): Add same-inode.h.
+ From Mark D. Baushke.
+
+2006-07-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/absolute-header.m4 (gl_ABSOLUTE_HEADER): Prepend three slashes
+ to the absolute name, not just one, to bypass Sun C 5.8's
+ "warning: #include of /usr/include/... may be non-portable".
+
+2006-07-04 Eric Blake <ebb9@byu.net>
+
+ * modules/dirname-tests: New test module.
+ * tests/test-dirname.c: New file, replacing dirname.c
+ TEST_DIRNAME section that was recently deleted.
+
+2006-07-04 Bruno Haible <bruno@clisp.org>
+
+ Assume ANSI C header files and <ctype.h> functions.
+ * lib/mbswidth.c (IN_CTYPE_DOMAIN, ISPRINT, ISCNTRL): Remove macros.
+ (mbsnwidth): Use isprint, iscntrl instead.
+
+2006-07-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils.
+ * MODULES.html.sh: Add xstrtold.
+ * modules/xstrtold: New file.
+ * modules/cycle-check (Files): Add lib/same-inode.h.
+ * modules/dirname (Files): Add m4/double-slash-root.m4.
+ * modules/getcwd (Files): Add m4/getcwd-abort-bug.m4.
+ * modules/mkdir-p (Files): Add lib/same-inode.h.
+ * modules/same (Files): Add lib/same-inode.h.
+
+2006-07-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/absolute-header.m4: Renamed from full-header-path.m4.
+ This is to keep the terminology clean; POSIX talks about
+ "absolute pathnames", not "full pathnames", but the GNU
+ Coding Standards say to use "path" for something else;
+ so use "absolute" to keep both sides happy.
+ (gl_ABSOLUTE_HEADER): Renamed from gl_FULL_HEADER_PATH.
+ Set gl_absolute_header, not gl_full_header_path.
+ Set gl_cv_absolute_<header>, not gl_full_path_<header>.
+ Define ABSOLUTE_<HEADER>, not FULL_PATH_<HEADER>.
+ All uses changed.
+
+ Merge from coreutils.
+
+ 2006-06-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/c-strtod.m4 (gl_C_STRTOLD): Add c-strtod.c to LIBSOURCES.
+ Require gl_USE_SYSTEM_EXTENSIONS, not gl_C_STRTOD, since we don't
+ want to require the building of c-strtod.o.
+ * m4/lib-check.m4 (cu_LIB_CHECK): Remove SEQ_LIBM, since seq no longer
+ needs -lm directly.
+ * m4/xstrtod.m4 (gl_XSTRTOLD): New macro.
+
+ 2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/lib-ignore.m4 (gl_IGNORE_UNUSED_LIBRARIES): Prefer binutils's
+ --as-needed option if available. Problem reported by Albert Chin in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-06/msg00114.html>.
+ However, use -Wl,--as-needed, not bare --as-needed, since HP-UX 11.11
+ cc merely issues a bunch of annoying warnings for --as-needed
+ (this problem was reported by Bob Proulx). Also, try linking with
+ -lm to detect a bug in binutils 2.16 (this problem was reported
+ by Ralf Wildenhues).
+
+ 2006-06-18 Jim Meyering <jim@meyering.net>
+
+ Test for a bug that causes glibc's getcwd to suffer a failed assertion.
+ * m4/getcwd-abort-bug.m4 (gl_FUNC_GETCWD_ABORT_BUG): New file and
+ macro.
+ * m4/getcwd.m4 (gl_FUNC_GETCWD): If we detect support for getcwd_null,
+ also check for glibc-2.4's abort-inducing bug.
+
+ * m4/getcwd-path-max.m4 (gl_FUNC_GETCWD_PATH_MAX): Fix typo.
+ Low-probability clean-up should be to use rmdir to get rid of
+ the just-created directory, not unlink.
+
+ * m4/ftruncate.m4 (gl_FUNC_FTRUNCATE): If ftruncate is missing, make
+ configure fail, and request a bug report to inform us about it.
+ Add a comment that, barring reports to the contrary, in 2007 we'll
+ assume ftruncate is universally available.
+
+ 2006-04-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/filemode.m4 (gl_FILEMODE): Check for strmode declaration.
+
+ 2006-03-12 Jim Meyering <jim@meyering.net>
+
+ * m4/chdir-safer.m4 (gl_CHDIR_SAFER): Add same-inode.h to the list.
+ * m4/cycle-check.m4 (gl_CYCLE_CHECK): Likewise.
+ * m4/same.m4 (gl_SAME): Likewise.
+ * m4/root-dev-ino.m4 (gl_ROOT_DEV_INO): Likewise.
+
+ 2006-03-11 Eric Blake <ebb9@byu.net>
+
+ * m4/double-slash-root.m4: New file, provides gl_DOUBLE_SLASH_ROOT.
+ * m4/dirname.m4 (gl_DIRNAME): Use gl_DOUBLE_SLASH_ROOT.
+ * m4/dos.m4 (FILE_SYSTEM_PREFIX_LEN): Move from here to dirname.h.
+ (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE): New define.
+
+2006-07-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stdint_.h: Include <sys/types.h> after @FULL_PATH_STDINT_H@, for
+ MacOS X 10.4.6. Don't mention <sys/int_types.h>. Problems
+ reported by Mark D. Baushke, one in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-07/msg00015.html>.
+
+ Merge from coreutils.
+
+ * lib/.cppi-disable: Add stdint_.h.
+ * lib/.cvsignore: Add stdint.h.
+
+ 2006-06-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xstrtod.c (XSTRTOD, DOUBLE): New macros, so that we can support
+ both double and long double versions.
+ (XSTRTOD): Renamed from xstrtod. Use DOUBLE internally.
+ * lib/xstrtold.c: New file.
+ * lib/xstrtod.h (xstrtold): New decl.
+
+ 2006-05-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/filemode.c (setst): Remove.
+ (strmode): Rewrite to avoid setst. This makes the code shorter,
+ (arguably) clearer, and the generated code is a bit smaller on my
+ Debian GNU/Linux stable x86 host.
+
+ 2006-04-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/filemode.c: Include "filemode.h" first, to test the interface.
+ Assume that filemode.h includes sys/types.h and sys/stat.h.
+ (HAVE_ST_DM_MODE): New macro, moved here from ls.c.
+ (ftypelet): Reorder to put common cases first, for efficiency.
+ Add 'P', 'w'. Remove 'M', since it's now the caller's responsibility
+ to do 'M'.
+ (strmode): Renamed from mode_string, and now stores 12 bytes instead
+ of 10, for compatibility with FreeBSD. All callers changed.
+ (filemodestring): Now stores 12 bytes instead of 10, and sets file
+ types that can't be deduced solely from st_mode. First arg is now a
+ const pointer.
+ * lib/filemode.h (HAVE_DECL_STRMODE): Include <string.h> for strmode.
+ (strmode): Renamed from mode_string.
+ (filemodestring): New decl.
+ * lib/stat-macros.h: Don't undef S_ISDOOR, since it's never buggy.
+ (S_ISDOOR): Don't bother with S_IFDOOR, since that code is never
+ needed.
+ (S_ISPORT, S_ISWHT): New macros, if not already defined.
+
+ 2006-04-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fsusage.c: Don't include <inttypes.h> or <stdint.h>, since
+ fsusage.h now does that. Include fsusage.h first, to test interface.
+ Prefer statvfs if it works, since it's blessed by POSIX. Attempt
+ at most one method (the old code could have generated decls that
+ didn't conform to C89, not that this was ever exercised).
+ * lib/fsusage.h: Include <inttypes.h> and <stdint.h> if they exist.
+
+ 2006-03-19 Jim Meyering <jim@meyering.net>
+
+ Work even in a chroot where d_ino values for entries in "/"
+ don't match the stat.st_ino values for the same names.
+ * lib/getcwd.c (__getcwd): When no d_ino value matches the target inode
+ number, iterate through all entries again, using lstat instead.
+ Reported by Kenshi Muto in http://bugs.debian.org/355810, and by
+ Zouhir Hafidi in https://bugzilla.redhat.com/bugzilla/190656.
+
+ * lib/getcwd.c (__getcwd): Clarify a comment.
+ Use memcpy in place of a call to strcpy.
+
+ 2006-03-12 Jim Meyering <jim@meyering.net>
+
+ * lib/fts-cycle.c (leave_dir): If cycle-check's saved dev-ino pair
+ matches that of the current directory (which we're about to chdir ".."
+ out of), then save the dev-ino of the parent, instead.
+
+ * lib/same-inode.h (SAME_INODE): New file/macro.
+ * lib/chdir-safer.c (SAME_INODE): Remove definition.
+ Include "same-inode.h", instead.
+ * lib/same.c: Likewise.
+ * lib/cycle-check.h: Include "same-inode.h".
+ (CYCLE_CHECK_REFLECT_CHDIR_UP): Define.
+ * lib/cycle-check.c (SAME_INODE): Remove definition.
+ * lib/root-dev-ino.h: Include "same-inode.h".
+
+ 2006-03-11 Eric Blake <ebb9@byu.net>
+
+ * lib/same.c (same_name): s/base_name/last_component/
+ * lib/backupfile.c (check_extension, numbered_backup): Likewise.
+ * lib/filenamecat.c (file_name_concat): Likewise.
+
+ 2006-03-11 Eric Blake <ebb9@byu.net>,
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/dirname.h (FILE_SYSTEM_PREFIX_LEN): Move here from dos.m4.
+ [FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX]: Don't treat 1: as a
+ drive prefix.
+ (IS_ABSOLUTE_FILE_NAME): Treat all drive letters as absolute on
+ platforms like cygwin with FILE_SYSTEM_DRIVE_PREFIX_IS_ABSOLUTE.
+ (last_component): New method.
+ * lib/dirname.c (dir_len): Determine when drive letters need a
+ subsequent slash. Preserve // when it is special.
+ (dir_name): Don't append dot when drive letter is absolute.
+ [TEST_DIRNAME]: Move into a full-blown gnulib test.
+ * lib/basename.c (base_name): New semantics - malloc the result.
+ Preserve // when it is special. Preserve relative files that look
+ like drive letters.
+ (base_len): Preserve // when it is special.
+ (last_component): New method, similar to old base_name semantics.
+ * lib/stripslash.c (strip_trailing_slashes): Use last_component, not
+ base_name. Strip redundant slashes from ///.
+
+2006-07-03 Jim Meyering <jim@meyering.net>
+
+ * lib/cycle-check.h (CYCLE_CHECK_REFLECT_CHDIR_UP): Abort if this
+ macro is used before the first cycle_check call.
+
+2006-07-03 Eric Blake <ebb9@byu.net>
+
+ * modules/dirname (Depends-on): Add xstrndup.
+
+2006-07-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stdint.m4 (gl_STDINT_H): Use more-mnemonic identifiers for
+ test cases, so that config.log is a bit easier to follow.
+
+2006-07-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stdint_.h (intmax_t, uintmax_t): Prefer long to long long if
+ both are 64 bits, since this seems to be the tradition, and this
+ prevents gcc -Wformat from warning about usages with PRIuMAX. If
+ we ever run into a host that prefers long long to long in this
+ case, we'll need another configure-time test. Problem reported by
+ Jim Meyering.
+
+2006-07-02 Eric Blake <ebb9@byu.net>
+
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Simplify by using AC_CHECK_DECLS.
+
+2006-07-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/inttypes (Depends-on): No longer depends on stdint.
+ * modules/stdint (Description): Say more about assumptions.
+ Say that the fast types might differ. Say macros are used.
+ (Files): Remove m4/size_max.m4, m4/wchar_t.m4. Add m4/longlong.m4.
+ (Makefile.am): Revise list of substituted symbols to match
+ new stdint.m4.
+ * modules/stdint-tests (Files): Add m4/wchar_t.m4, m4/wint_t.m4.
+ (configure.ac): Add gt_TYPE_WCHAR_T, gt_TYPE_WINT_T.
+ * tests/test-stdint.c (verify_same_types)
+ [! (__GNUC__ >= 2 && DO_PEDANTIC)]: Put in a decl, so that
+ the code conforms to C99/C89.
+ Test for WCHAR_MIN and WCHAR_MAX only if HAVE_WCHAR_T.
+ Test for WINT_MIN and WINT_MAX only if HAVE_WINT_T.
+
+2006-07-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/longlong.m4 (AC_TYPE_LONG_LONG_INT): Backport from Autoconf 2.60,
+ but fix a bug, by requiring at least 64 bits.
+ * m4/ulonglong.m4 (AC_TYPE_UNSIGNED_LONG_LONG_INT): Likewise.
+ * m4/longlong.m4 (gl_AC_TYPE_LONG_LONG): Now just call
+ AC_TYPE_LONG_LONG_INT. This macro is obsolete and will go soon.
+ * m4/ulonglong.m4 (gl_AC_TYPE_UNSIGNED_LONG_LONG) Likewise.
+
+ * m4/stdint.m4 (gl_STDINT_H): Rewrite to accommodate stdint_.h
+ changes. Make 2.59 a prerequisite. Check and substitute for
+ HAVE_LONG_LONG_INT. Rely on Autoconf to check for stdint.h and
+ inttypes.h. Do not use special include files; just use the
+ defaults. Check for sys/inttypes.h and sys/bitypes.h in the usual
+ way now. Remove no-longer-needed tests for HAVE_LONG_64BIT,
+ HAVE_LONG_LONG_64BIT, int8_t, int16_t, int32_t, int64_t, uint8_t,
+ uint16_t, uint32_t uint64_t, int_least8_t, int_least16_t,
+ int_least32_t, int_least64_t, uint_least8_t, uint_least16_t,
+ uint_least32_t, uint_least64_t, int_fast8_t, int_fast16_t,
+ int_fast32_t, int_fast64_t, uint_fast8_t uint_fast16_t,
+ uint_fast32_t, uint_fast64_t, intptr_t, uintptr_t, intmax_t,
+ uintmax_t, INT8_MIN, INT8_MAX, UINT8_MAX, INT16_MIN, INT16_MAX,
+ UINT16_MAX, INT32_MIN, INT32_MAX, UINT32_MAX, INT64_MIN,
+ INT64_MAX, UINT64_MAX, INT_LEAST8_MIN, INT_LEAST8_MAX,
+ UINT_LEAST8_MAX, INT_LEAST16_MIN, INT_LEAST16_MAX,
+ UINT_LEAST16_MAX, INT_LEAST32_MIN, INT_LEAST32_MAX,
+ UINT_LEAST32_MAX, INT_LEAST64_MIN, INT_LEAST64_MAX,
+ UINT_LEAST64_MAX, INT_FAST8_MIN, INT_FAST8_MAX, UINT_FAST8_MAX,
+ INT_FAST16_MIN, INT_FAST16_MAX, UINT_FAST16_MAX, INT_FAST32_MIN,
+ INT_FAST32_MAX, UINT_FAST32_MAX, INT_FAST64_MIN, INT_FAST64_MAX,
+ UINT_FAST64_MAX, INTPTR_MIN, INTPTR_MAX, UINTPTR_MAX, INTMAX_MIN,
+ INTMAX_MAX, UINTMAX_MAX, PTRDIFF_MIN, PTRDIFF_MAX, SIG_ATOMIC_MIN,
+ SIG_ATOMIC_MAX, SIZE_MAX, WCHAR_MIN, WCHAR_MAX, WINT_MIN,
+ WINT_MAX. Check for C99 conformance more strictly, by detecting
+ bugs in glibc 2.4, Solaris 10, and OpenBSD 3.9. On the other hand do
+ not check for things that C99 does not require, e.g., int8_t. If
+ a test isn't needed unless <stdint.h> isn't working, and is
+ unlikely to be needed for any other reason, then don't do it
+ unless <stdint.h> isn't working. Do not check for ptrdiff_t or
+ size_t, since we assume C89 freestanding at least. Do not check
+ for sig_atomic_t, wchar_t, or wint_t, since the code now does
+ the right thing even if the types are not defined. Instead use:
+ (gl_STDINT_TYPE_PROPERTIES): New macro.
+ (gl_HEADER_STDINT_H, gl_HEADER_INTTYPES_H): Remove. Don't bother
+ testing whether <sys/types.h> clashes, as Autoconf does this for
+ us now. All uses removed.
+ (gl_STDINT_CHECK_TYPES, gl_STDINT_MISSING_BOUND):
+ (gl_STDINT_MISSING_BOUNDS, gl_STDINT_MISSING_BOUNDS2):
+ (gl_CHECK_TYPE_SAME):
+ Remove; no longer needed.
+ (gl_STDINT_BITSIZEOF): Don't bother to check whether the type
+ exists, since we'll return 0 anyway in that case.
+ (gl_INTEGER_TYPE_SUFFIX, gl_STDINT_INCLUDES): New macros.
+
+2006-07-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stdint_.h (_GL_STDINT_H): Renamed from _STDINT_H, to avoid
+ possible collision with system files.
+ (<stdio.h>, <time.h>, <wchar.h>) [defined __cplusplus && ! defined
+ __STDC_CONSTANT_MACROS)]: Do not include, since we don't need
+ WCHAR_MIN and WCHAR_MAX in this case.
+ (<stddef.h>): Do not include; no longer needed.
+ (<sys/types.h>): Include if @HAVE_SYS_TYPES_H@, not if
+ (defined(__OpenBSD__) || defined(__bsdi__) || defined(__sgi)).
+ (<sys/inttypes.h>): Include if @HAVE_SYS_INTTYPES_H@ &&
+ !@HAVE_INTTYPES_H@, not if (defined(__FreeBSD__)
+ && (__FreeBSD__ >= 3) && (__FreeBSD__ <= 4)).
+ (__STDINT_H__) [@HAVE_STDINT_H@ && defined __sgi && ! defined
+ __c99]: Define, to work around IRIX <stdint.h> incompatibility.
+ (@FULL_PATH_STDINT_H@) [!(defined(__sgi) && @HAVE_INTTYPES_H@ &&
+ !defined(__c99))]: Include in this case too, since it's harmless
+ now.
+ (<inttypes.h>) [@HAVE_INTTYPES_H@]: Include, since it's no longer
+ dangerous to do so.
+ (@FULL_PATH_INTTYPES_H@) [(defined(__hpux) || defined(_AIX)) &&
+ @HAVE_INTTYPES_H@]: Do not include, since we now include <inttypes.h>.
+ (_STDINT_MIN, _STDINT_MAX): New macros.
+ (int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t):
+ (uint64_t, int_least8_t, uint_least8_t, int_least16_t):
+ (uint_least16_t, int_least32_t, uint_least32_t, int_least64_t):
+ (uint_least64_t, int_fast8_t, uint_fast8_t, int_fast16_t):
+ (uint_fast16_t, int_fast32_t, uint_fast32_t, int_fast64_t):
+ (uint_fast64_t, intptr_t, uintptr_t, intmax_t, uintmax_t): Now
+ macros, not typedefs; this simplifies things quite a bit.
+ Use long int for all types narrower than int64_t.
+ (intmax_t, uintmax_t, INTMAX_C, UINTMAX_C):
+ Define in terms of long long int or int64_t or long int,
+ not int64_t or int32_t. This saves some compile-time testing.
+ (INT8_MIN, INT8_MAX, UINT8_MAX, INT16_MIN, INT16_MAX, UINT16_MAX):
+ (INT32_MIN, INT32_MAX, UINT32_MAX, INT64_MIN, INT64_MAX):
+ (UINT64_MAX, INT_LEAST8_MIN, INT_LEAST8_MAX, UINT_LEAST8_MAX):
+ (INT_LEAST16_MIN, INT_LEAST16_MAX, UINT_LEAST16_MAX):
+ (INT_LEAST32_MIN, INT_LEAST32_MAX, UINT_LEAST32_MAX):
+ (INT_LEAST64_MIN, INT_LEAST64_MAX, UINT_LEAST64_MAX, INT_FAST8_MIN):
+ (INT_FAST8_MAX, UINT_FAST8_MAX, INT_FAST16_MIN, INT_FAST16_MAX):
+ (UINT_FAST16_MAX, INT_FAST32_MIN, INT_FAST32_MAX, UINT_FAST32_MAX):
+ (INT_FAST64_MIN, INT_FAST64_MAX, UINT_FAST64_MAX, INTPTR_MIN):
+ (INTPTR_MAX, UINTPTR_MAX, INTMAX_MIN, INTMAX_MAX, UINTMAX_MAX):
+ (PTRDIFF_MIN, PTRDIFF_MAX, SIG_ATOMIC_MIN, SIG_ATOMIC_MAX):
+ (SIZE_MAX, WCHAR_MIN, WCHAR_MAX, WINT_MIN, WINT_MAX):
+ undef any previous version and define our own version, for
+ simplicity and consistency with the new macros for types.
+ (PTRDIFF_MIN, PTRDIFF_MAX, SIG_ATOMIC_MIN, SIG_ATOMIC_MAX):
+ (SIZE_MAX, WCHAR_MIN, WCHAR_MAX, WINT_MIN, WINT_MAX):
+ Simplify definitions by using _STDINT_MIN and _STDINT_MAX
+ where appropriate. Rely on new symbols @PTRDIFF_T_SUFFIX@,
+ @SIG_ATOMIC_T_SUFFIX@, @SIZE_T_SUFFIX@, @WCHAR_T_SUFFIX@,
+ @WINT_T_SUFFIX@ to keep things simple here.
+ (UINT8_C, UINT16_C, UINT32_C, INT64_C, UINT64_C):
+ Simplify by assuming typical 8/16/32/64 host, since we're
+ already doing that elsewhere anyway.
+ Use (LONG_MAX >> 31 >> 31 == 1) rather than @HAVE_LONG_64BIT@,
+ and assume long long int is 64 bits if available. This
+ speeds up 'configure'.
+
+2006-07-01 Eric Blake <ebb9@byu.net>
+
+ * m4/stdarg.m4 (gl_STDARG_H): Use proper AH_VERBATIM.
+ Reported by Andreas Buening.
+
+2006-07-01 Eric Blake <ebb9@byu.net>
+
+ * m4/stdarg.m4 (gl_STDARG_H): Properly parenthesize gl_va_copy.
+
+2006-06-30 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
+
+ * lib/getaddrinfo.c: fixed typo
+
+2006-06-29 Jim Meyering <jim@meyering.net>
+
+ * modules/strftime (Maintainer): Add my name, since with the
+ FPRINTFTIME changes strftime.c has forked from glibc.
+
+2006-06-29 Eric Blake <ebb9@byu.net>
+
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Use AC_C_INLINE.
+
+2006-06-29 Eric Blake <ebb9@byu.net>
+
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): New file.
+
+2006-06-29 Eric Blake <ebb9@byu.net>
+
+ * lib/stat_.h: New file.
+
+2006-06-29 Eric Blake <ebb9@byu.net>
+
+ * lib/stat_.h (rpl_mkdir): Declare inline, to avoid warnings about
+ unused static function.
+
+2006-06-29 Eric Blake <ebb9@byu.net>
+
+ * doc/functions.texi (Function Portability): Document missing lstat
+ on mingw.
+
+2006-06-29 Eric Blake <ebb9@byu.net>
+
+ * MODULES.html.sh: Add sys_stat.
+ * modules/sys_stat: New module.
+ * modules/mkstemp (Depends-on): Add sys_stat.
+
+2006-06-29 Derek R. Price <derek@ximbiot.com>
+
+ * m4/strftime.m4: Don't call AC_FUNC_STRFTIME.
+
+2006-06-29 Derek R. Price <derek@ximbiot.com>
+
+ * m4/c-bs-a.m4: Removed.
+
+2006-06-29 Derek R. Price <derek@ximbiot.com>
+
+ * lib/strftime.c: Assume strftime() exists.
+
+2006-06-29 Derek Price <derek@ximbiot.com>
+
+ * modules/c-bs-a: Removed - \a is C89.
+ * MODULES.html.sh: Remove c-bs-a.
+
+2006-06-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/wcwidth (License): Change to LGPL.
+
+2006-06-28 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-getaddrinfo.c: Test getnameinfo too. Call WSAStartup
+ on _WIN32.
+
+ * modules/getaddrinfo (Depends-on): Add inet_ntop, needed by
+ getnameinfo.
+
+2006-06-28 Simon Josefsson <jas@extundo.com>
+
+ * m4/getaddrinfo.m4: Look for getnameinfo prototypes too.
+
+2006-06-28 Simon Josefsson <jas@extundo.com>
+
+ * lib/getaddrinfo.c: Try to load ws2_32.dll on Windows, to find the
+ functions there. It will succeed on Windows XP, but on Windows
+ 2000 and (presumably) earlier, it will fail, and use the internal
+ re-implementation.
+ (use_win32_p): New function.
+ (getaddrinfo): Use strtoul on servname, to support numeric ports.
+ Support AI_NUMERICSERV to disable getservbyname.
+ (getnameinfo): New function, only supports
+ NI_NUMERICHOST|NI_NUMERICSERV for now.
+
+ * lib/getaddrinfo.h: Test and check for AI_* flags separately, MinGW
+ only have some of them. Add AI_NUMERICSERV. Add prototype for
+ getnameinfo.
+
+2006-06-28 Eric Blake <ebb9@byu.net>
+
+ * modules/wcwidth: New file.
+ * modules/mbchar (Depends-on): Add wcwidth.
+ * modules/mbswidth (Depends-on): Add wcwidth.
+ * MODULES.html.sh: Add wcwidth.
+
+2006-06-28 Eric Blake <ebb9@byu.net>
+
+ * m4/mbswidth.m4 (gl_MBSDWIDTH): Move wcwidth from here...
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): ...to this new file.
+
+2006-06-28 Eric Blake <ebb9@byu.net>
+
+ * lib/xvasprintf.h: Fix comments.
+
+2006-06-28 Eric Blake <ebb9@byu.net>
+
+ * lib/mbchar.h (wcwidth): Include wcwidth.h.
+ * lib/mbswidth.c (wcwidth): Move from here...
+ * lib/wcwidth.h: ...to this new file.
+
+2006-06-28 Derek R. Price <derek@ximbiot.com>
+
+ * m4/savedir.m4: Remove AC_FUNC_CLOSEDIR_VOID requirement.
+
+ * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Don't require AC_C_CONST, since
+ it's obsolete.
+ * m4/strftime.m4 (gl_FUNC_GNU_STRFTIME): Likewise.
+
+2006-06-28 Derek R. Price <derek@ximbiot.com>
+
+ * lib/savedir.c (CLOSEDIR): Remove. All uses changed to closedir.
+ Autoconf 2.60 says this stuff was obsolete.
+
+2006-06-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/wcwidth (Files): Add m4/wchar_t.m4.
+
+2006-06-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Also require AC_C_INLINE and
+ gt_TYPE_WCHAR_T.
+
+2006-06-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/wcwidth.h: Declare nothing if !HAVE_WCHAR_T. Provide a fallback
+ declaration for wcwidth.
+ * lib/mbswidth.c: Restore the includes of <wchar.h> and <wctypes.h>.
+
+2006-06-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/mkdtemp.c [MINGW]: Include <io.h>.
+ (mkdir): Define using _mkdir.
+
+2006-06-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/getaddrinfo.h: Fix POSIX URL.
+ * lib/getaddrinfo.c (WIN32_NATIVE): New macro. Use it instead of
+ _WIN32.
+ (use_win32_p): Make static.
+ (getaddrinfo): Reject service name if it is empty or does not consist
+ solely of decimal digits, or if its value is > 65535.
+ (getnameinfo): Remove useless casts.
+
+2006-06-27 Simon Josefsson <jas@extundo.com>
+
+ * modules/sys_select: New file, suggested by Bruno Haible, Paul
+ Eggert and Martin Lambers.
+
+2006-06-27 Simon Josefsson <jas@extundo.com>
+
+ * m4/sys_select_h.m4: New file, suggested by Bruno Haible, Paul
+ Eggert and Martin Lambers.
+
+2006-06-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_BITSIZEOF): For nonexistent types, set the
+ result to 0, not to empty.
+ Reported by Martin Neitzel <neitzel@sco.gaertner.de>.
+
+2006-06-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (intmax_t, uintmax_t): Undefine before typedef.
+
+2006-06-26 Simon Josefsson <jas@extundo.com>
+
+ * m4/inet_ntop.m4: Don't check for sys/types.h, we assume it is
+ present.
+
+2006-06-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/base64.c (B64): Use _ as the formal parameter, not x, to avoid
+ bug in IBM C V6 for AIX. Problem reported by Larry Jones in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-06/msg00181.html>.
+
+2006-06-26 Mark D. Baushke <mdb@gnu.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Treat BSD/OS like OpenBSD.
+
+2006-06-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdint (Makefile.am): Also substitute HAVE_WCHAR_H.
+
+2006-06-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Test also for <wchar.h>.
+
+2006-06-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Don't include <stdint.h> when using the
+ SGI C compiler in pre-C99 mode.
+ Suggested by Mark D. Baushke and Larry Jones.
+
+2006-06-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: Include <wchar.h> if necessary for WCHAR_MIN or
+ WCHAR_MAX.
+ Reported by Mark D. Baushke and Larry Jones.
+
+2006-06-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: Don't include <stdint.h> when using the SGI C compiler
+ in pre-C99 mode.
+ Suggested by Mark D. Baushke and Larry Jones.
+
+2006-06-23 Simon Josefsson <jas@extundo.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Define MOSTLYCLEANDIRS.
+ Emit mostlyclean-local rule.
+ (func_emit_tests_Makefile_am): Likewise.
+ * modules/sys_socket (Makefile.am): Use MOSTLYCLEANDIRS.
+
+2006-06-23 Mark D. Baushke <mdb@gnu.org>
+
+ * lib/stdint_.h: Treat BSD/OS like OpenBSD.
+
+2006-06-23 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-stdint.c: Update to match ISO C 99 Technical
+ Corrigendum 1.
+
+2006-06-23 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Treat IRIX like OpenBSD.
+
+2006-06-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: Treat IRIX like OpenBSD.
+
+2006-06-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (UINT8_C, UINT16_C, UINT32_C): Define according to
+ ISO C 99 Technical Corrigendum 1.
+
+2006-06-22 Simon Josefsson <jas@extundo.com>
+
+ * m4/sockpfaf.m4: Include winsock2.h too, to make it work under
+ MinGW.
+
+2006-06-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/glob.c (collated_compare): Remove 'const' uses that weren't
+ needed. Some compiler complained about some of them. Problem reported
+ by Larry Jones in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-06/msg00172.html>.
+
+2006-06-21 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-getaddrinfo.c: New file.
+
+ * modules/getaddrinfo-tests: New file.
+
+ * MODULES.html.sh: Add inet_pton.
+
+ * modules/inet_pton: New file.
+
+2006-06-21 Simon Josefsson <jas@extundo.com>
+
+ * m4/getaddrinfo.m4: Don't define WINVER. Look for gethostbyname in
+ -lws2_32 too. Fixes getaddrinfo on Windows 2000, with the price
+ of using the (limited) gnulib implementation on Windows XP.
+
+ * m4/inet_pton.m4: New file.
+
+2006-06-21 Simon Josefsson <jas@extundo.com>
+
+ * lib/getaddrinfo.c (getaddrinfo): Set ai_family in the return
+ variable.
+
+ * lib/socket_.h: Don't define WINVER.
+
+ * lib/inet_pton.h, inet_pton.c: New file, taken from glibc but
+ slightly modified to work in gnulib.
+
+2006-06-21 Simon Josefsson <jas@extundo.com>
+
+ * doc/gnulib.texi (Windows sockets): Add.
+
+2006-06-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/read-file.c (fread_file): Start with buffer allocation of
+ 0 bytes rather than 1 byte; this simplifies the code.
+ Don't invoke feof; it's not needed. Refactor to avoid duplicate
+ code to free buffer and save/restore errno.
+ (internal_read_file): Remove unused local.
+
+2006-06-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/openat.c (openat): Use ?:, not if, to work around GCC bug 4210
+ <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=4210>.
+ Problem reported by Denis Excoffier in
+ <http://lists.gnu.org/archive/html/bug-tar/2006-06/msg00023.html>.
+
+2006-06-19 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * modules/sys_socket, modules/socklen: Include sys/types since
+ FreeBSD 4.x's sys/socket.h needs it.
+
+2006-06-19 Simon Josefsson <jas@extundo.com>
+
+ * lib/inet_ntop.c: Always build inet_ntop4, since inet_ntop6 calls it.
+
+2006-06-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/alloca_.h (alloca) [defined alloca]: Don't define or declare.
+
+2006-06-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Enclose the values of FULL_PATH_STDINT_H
+ and FULL_PATH_INTTYPES_H in angle brackets.
+ Reported by Mark D. Baushke <mdb@gnu.org>.
+
+2006-06-17 Eric Blake <ebb9@byu.net>
+
+ * m4/rmdir-errno.m4 (gl_FUNC_FMDIR_NOTEMPTY): Assume errno.h declares
+ errno.
+
+2006-06-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H) [FreeBSD >= 5]: Don't include
+ <sys/inttypes.h>.
+
+2006-06-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/setenv.m4 (gl_PREREQ_SETENV, gl_PREREQ_UNSETENV): Remove test
+ whether errno is declared. Assume <errno.h> declares errno.
+
+2006-06-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h [FreeBSD >= 5]: Don't include <sys/inttypes.h>.
+
+2006-06-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (_UINT8_T, _UINT32_T, _UINT64_T): New macros. Fixes a
+ problem on Solaris 2.5.1.
+
+2006-06-16 Eric Blake <ebb9@byu.net>
+
+ * lib/unsetenv.c [!defined errno]: Assume errno.h declares errno.
+ * lib/unicodeio.c [!defined errno]: Likewise.
+ * lib/strtol.c [!defined errno]: Likewise.
+ * lib/strtod.c [!defined errno]: Likewise.
+
+2006-06-15 Eric Blake <ebb9@byu.net>
+
+ * m4/ssize_t.m4 (gt_TYPE_SSIZE_T): Work in spite of -Werror.
+
+2006-06-15 Eric Blake <ebb9@byu.net>
+
+ * config/srclist.txt (ssize_t.m4): Lose sync.
+
+2006-06-15 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdint (Files): Include m4/full-header-path.m4,
+ m4/size_max.m4, m4/wchar_t.m4.
+ (Makefile.am): Many more substitutions.
+ * modules/stdint-tests: New file.
+ * tests/test-stdint.c: New file.
+
+2006-06-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Rewritten to produce a complete stdint.h.
+ (gl_HEADER_STDINT_H, gl_HEADER_INTTYPES_H, gl_STDINT_CHECK_TYPES,
+ gl_STDINT_MISSING_BOUND, gl_STDINT_MISSING_BOUNDS,
+ gl_STDINT_MISSING_BOUNDS2, gl_STDINT_BITSIZEOF, gl_CHECK_TYPES_SIGNED,
+ gl_CHECK_TYPE_SAME): New macros.
+
+2006-06-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/size_max.m4 (gl_SIZE_MAX): Make it work also when cross-compiling.
+
+2006-06-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: Rewritten to be fully auto-configured.
+ Fixes bug on HP-UX/IA64.
+
+2006-06-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y (__attribute__): Don't define if already defined.
+ Problem reported by Larry Jones.
+ * lib/utimens.c (__attribute__): Likewise.
+
+2006-06-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regexec.c (group_nodes_into_DFAstates): Fix a buffer overrun
+ reported by Andreas Schwab.
+
+2006-05-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/strndup.m4 (gl_FUNC_STRNDUP): Replace the AC_REPLACE_FUNCS with a
+ check for the declaration of strnlen and a run test that exposes the
+ AIX 5.1 strnlen bug. In the failure case, #define strndup to
+ rpl_strndup.
+
+2006-05-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/strndup.c (strndup) [!_LIBC]: Don't undefine macro definition.
+
+2006-05-28 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/c-strtod.m4 (gl_C99_STRTOLD): Use a link test rather than a
+ compile test, for Tru64 4.0D.
+
+2006-05-28 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (printf-args.c): lose sync.
+
+2006-05-26 Martin Lambers <marlam@marlam.de>
+
+ * lib/getpass.c: Updates the test for the native W32 API, and adds
+ missing includes, thus fixing compilation warnings.
+
+2006-05-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/exclude.c (exclude_fnmatch): New function.
+ (excluded_file_name): Call exclude_fnmatch.
+ * lib/exclude.h (excluded_file_name): New prototype
+
+2006-05-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/tempname.c (small_open, large_open): New macros.
+ (__open, __open64) [!_LIBC]: Remove.
+ (__gen_tempname): Use small_open and large_open instead of __open
+ and __open64. This fixes a portability bug on HP-UX 11.11i
+ reported by Simon Wing-Tang in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2006-05/msg00114.html>.
+
+2006-05-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/printf-args.c (printf_fetchargs): Turn NULL pointers for
+ TYPE_STRING and TYPE_WIDE_STRING into a non-NULL replacement.
+ Reported by Thorsten Maerz <torte@netztorte.de> via
+ Aaron Stone <aaron@serendipity.cx>.
+
+2006-05-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Rename cache variables to use
+ gl_ rather than jm_. Link, don't run, so that cross-compiles are
+ allowed. Check that resulting type is arithmetic. Move AC_REQUIRE
+ and AC_CHECK_HEADERS_ONCE outside of AC_CACHE_CHECK, since they're
+ not really conditional on the cache.
+ (gl_PREREQ_NANOSLEEP): Check for sys/select.h.
+
+2006-05-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/nanosleep.c [HAVE_SYS_SELECT_H]: Include <sys/select.h>.
+ Use the usual Autoconf way to include <time.h> and/or sys/time.h.
+ (my_usleep): Don't mishandle maximum value.
+
+2006-05-19 Jim Meyering <jim@meyering.net>
+
+ * lib/getugroups.c: Correct an outdated comment. From Bruno Haible.
+
+2006-05-17 Bruno Haible <bruno@clisp.org>
+
+ Cygwin portability.
+ * lib/classpath.c (PATH_SEPARATOR) [CYGWIN]: Define as ':'.
+
+2006-05-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: Fix recognition of Cygwin.
+
+2006-05-15 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/config.rpath: Improve support for Sun C 5.9 on Linux, based
+ on libtool patch by Ralf Wildenhues.
+
+2006-05-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stdbool.m4 (AC_HEADER_STDBOOL): Fix overly-picky
+ test for C99 conformance; (bool) 0.5 is an integer constant
+ expression, but (bool) -0.5 is not. Problem reported by Fedor
+ Sergeev in <http://forum.sun.com/jive/thread.jspa?threadID=96202>.
+
+2006-05-11 Simon Josefsson <jas@extundo.com>
+
+ * m4/xvasprintf.m4: Fix obvious typo.
+
+2006-05-11 Jim Meyering <jim@meyering.net>
+
+ * lib/sha1.c (sha1_buffer): Correct comment: s/MD5/SHA1/. From
+ James Lemley.
+
+2006-05-10 Simon Josefsson <jas@extundo.com>
+
+ * lib/md4.c: Typo fix, update copyright years.
+ (K1, K2): Don't use L because it turn computations into 64-bit on
+ 64-bit platforms.
+
+2006-05-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/crc.c (crc32_update): Remove unnecessary L suffix.
+ * lib/md4.c (rol): Cast right-shift arg to uint32_t to prevent
+ unwanted sign propagation, e.g., on hosts with 64-bit int.
+ There still are some problems with reeelly weird theoretical hosts
+ (e.g., 33-bit int) but it's not worth worrying about now.
+ * lib/sha1.c (rol): Likewise.
+ (K1, K2, K3, K4): Remove unnecessary L suffix.
+
+2006-05-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/des.c: Cast to avoid warnings.
+
+2006-05-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/xvasprintf (Files): Add m4/xvasprintf.m4.
+ (Depends-on): Depend also on xsize, stdarg.
+ (configure.ac): Add gl_XVASPRINTF.
+
+2006-05-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/xvasprintf.m4: New file.
+
+2006-05-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/xvasprintf.c: Include limits.h, string.h, xsize.h.
+ (EOVERFLOW): Define fallback value.
+ (xstrcat): New function.
+ (xvasprintf): Recognize the special case of a string concatenation.
+
+2006-05-08 Eric Blake <ebb9@byu.net>
+
+ * gnulib-tool (func_version): Base copyright year on CVS date.
+ (func_emit_copyright_notice): New function.
+ (func_emit_lib_Makefile_am): Use it.
+ (func_emit_tests_Makefile_am): Likewise.
+ (func_import): Likewise.
+
+2006-05-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdarg: New file.
+ * MODULES.html.sh (func_all_modules): Add section for <stdarg.h>.
+
+2006-05-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdarg.m4: New file, from GNU gettext.
+
+2006-05-08 Bruno Haible <bruno@clisp.org>
+
+ * config/srclist.txt (build-aux/config.rpath): different from latest
+ release.
+
+2006-05-08 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/config.rpath: Add support for Sun C 5.9 on Linux.
+
+2006-05-05 Jim Meyering <jim@meyering.net>
+
+ * m4/warning.m4: New file, derived from bison's file by the same name.
+
+2006-05-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: Shorter URL.
+ * lib/inttypes.h: Likewise.
+
+2006-05-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/inttypes (Maintainer): Change from Derek Price to 'all'.
+
+2006-05-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/verify.h: Document the internals better. Most of this change
+ was written by Bruno Haible.
+
+2006-05-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/verify.texi: New file, partly based on a proposal by
+ Bruno Haible.
+
+2006-05-02 Bruno Haible <bruno@clisp.org>
+
+ * m4/full-header-path.m4 (gl_FULL_HEADER_PATH): Move the include_next
+ test from here...
+ * m4/_inttypes_h.m4 (gl_INTTYPES_H): ... to here.
+
+2006-04-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/gcd.c: Use WORD_T and GCD instead of unsigned long and gcd.
+ Suggested by Oskar Liljeblad <oskar@osk.mine.nu>.
+
+2006-04-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Make --update option actually work.
+
+2006-04-29 Bruno Haible <bruno@clisp.org>
+
+ * doc/gcd.texi: New file.
+ * doc/gnulib.texi: Include it.
+
+2006-04-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y (get_date): When adding relative date, start with the
+ initial time, not with the result of the first mktime call.
+
+2006-04-25 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Output the include directives in three
+ blocks, sorted separately.
+ Reported by Ben Pfaff <blp@cs.stanford.edu>.
+
+2006-04-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/unlink-busy.m4 (gl_FUNC_UNLINK_BUSY_TEXT): Use prototype
+ to define main with arguments, for C++. Reported by Eric Blake.
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC):
+ Prefer 'int main ()' to 'int main (void)', for C++.
+ * m4/getcwd-path-max.m4 (gl_FUNC_GETCWD_PATH_MAX): Likewise.
+ * m4/fsusage.m4 (gl_FILE_SYSTEM_USAGE): Specify a return type
+ for 'main', for C99 and C++.
+
+2006-04-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/fsusage.m4 (gl_FILE_SYSTEM_USAGE): Use return, not exit.
+ Don't assume that exit status -1 is valid.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Likewise.
+ * m4/putenv.m4 (gl_FUNC_PUTENV): Likewise.
+ * m4/rmdir-errno.m4 (gl_FUNC_RMDIR_NOTEMPTY): Likewise.
+ * m4/readdir.m4 (GL_FUNC_READDIR): Include <stdlib.h>.
+ * m4/rename.m4 (vb_FUNC_RENAME): Likewise.
+ * m4/unlink-busy.m4 (gl_FUNC_UNLINK_BUSY_TEXT): Use AC_RUN_IFELSE,
+ not AC_TRY_RUN. Use return, not exit. Don't assume that
+ functions can be used without declaring them, or that you can
+ exit with status -1.
+ * m4/utimes-null.m4 (gl_FUNC_UTIMES_NULL): Likewise.
+
+2006-04-24 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (longdouble.m4): sync lost.
+
+2006-04-24 Eric Blake <ebb9@byu.net>
+
+ * m4/strerror_r.m4 (AC_FUNC_STRERROR_R): Avoid unused variable warning.
+
+2006-04-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/poll.m4 (gl_FUNC_POLL): When cross-compiling, reject also the
+ poll() implementation in AIX.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2006-04-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/poll.m4 (gl_FUNC_POLL): Rearrange code, so that POLL_H gets
+ assigned exactly once.
+
+2006-04-23 Claudio Fontana <claudio@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/gettext (Makefile.am): Add a -I flag for <libintl.h>.
+ * gnulib-tool (func_emit_lib_Makefile_am): Emit empty default value
+ for AM_CPPFLAGS.
+
+2006-04-23 Bruno Haible <bruno@clisp.org>
+
+ * modules/copy-file: Depend on unistd.
+ * modules/execute: Likewise.
+ * modules/fatal-signal: Likewise.
+ * modules/findprog: Likewise.
+ * modules/mkdtemp : Likewise.
+ * modules/pipe: Likewise.
+ * modules/wait-process: Likewise.
+
+2006-04-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/fwriteerror.c (fwriteerror): Call fclose also when an error
+ condition was already detected.
+ Reported by Ben Pfaff <blp@cs.stanford.edu>.
+
+2006-04-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-file.c: Include <unistd.h> unconditionally.
+ * lib/execute.c: Likewise.
+ * lib/fatal-signal.c: Likewise.
+ * lib/findprog.c: Likewise.
+ * lib/mkdtemp.c: Likewise.
+ * lib/pipe.h: Likewise.
+ * lib/pipe.c: Likewise.
+ * lib/wait-process.h: Likewise.
+
+2006-04-23 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_usage): Fix --import description. Document
+ --update.
+ (func_import): Create temporary file in a temporary directory, if
+ --dry-run is specified. Silence errors from 'grep' when there are no
+ m4 files in $m4dir.
+ (func_create_testdir): Silence errors from 'grep' when there are no
+ m4 files in $m4dir.
+ Reported by Karl Berry <karl@freefriends.org>.
+
+2006-04-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/argp.m4 (gl_ARGP): Don't call AC_CHECK_DECLS_ONCE with more than
+ one argument, so that the code will be portable to Autoconf 2.60.
+ * m4/getlogin_r.m4 (gl_PREREQ_GETLOGIN_R): Likewise.
+ * m4/getpass.m4 (gl_PREREQ_GETPASS): Likewise.
+ * m4/unlocked-io.m4 (gl_FUNC_GLIBC_UNLOCKED_IO): Likewise.
+
+2006-04-19 Derek Price <derek@ximbiot.com>
+ Eric Blake <ebb9@byu.net>
+
+ * m4/full-header-path.m4 (gl_FULL_HEADER_PATH): Use </full/path.h>
+ rather than "/full/path.h". Update comment to match. Shorten &
+ generalize m4_translit call via AS_TR_CPP.
+
+2006-04-19 Derek Price <derek@ximbiot.com>
+ Eric Blake <ebb9@byu.net>
+
+ * lib/inttypes.h: Correct grammar in comment.
+
+2006-04-18 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/inttypes: New file.
+ * modules/strtoimax, modules/strtoumax: Depend on inttypes.
+
+2006-04-18 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/_inttypes_h.m4, m4/full-header-path.m4, m4/include_next.m4:
+ New files.
+
+2006-04-18 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/inttypes.h: New file.
+ * lib/strtoimax.c: Assume <inttypes.h>.
+
+2006-04-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/utimens.c (futimens): glibc futimesat messes up if /proc
+ isn't mounted. Problem reported by Kir Kolyshkin.
+
+2006-04-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regcomp.c (init_dfa): Don't use wchar_t or wctype_t if
+ RE_ENABLE_I18N is not defined. Problem reported by Mark D. Baushke via
+ Derek R. Price.
+ * lib/regex.h (RE_DUP_MAX): Update comment to match current
+ implementation.
+
+2006-04-12 Eric Blake <ebb9@byu.net>
+
+ * modules/time_r (Makefile.am): Remove lib_SOURCES line, as this
+ is now done automatically by the corresponding Autoconf macro.
+
+2006-04-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/time_r.m4 (gl_TIME_R): Add AC_LIBSOURCES for time_r.c and
+ time_r.h.
+
+2006-04-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge regex changes from libc, removing some of our
+ POSIX-conformance changes that were rejected and redoing them in a
+ less-intrusive way.
+
+ * lib/regcomp.c (re_compile_internal, init_dfa):
+ Length arg is now size_t, not Idx. All uses changed.
+ (peek_token): Forward decl now says internal_function.
+ (__re_error_msgid, __re_error_msgid_idx):
+ Now static rather than extern with attribute_hidden.
+ (re_compile_pattern) [!defined _LIBC]: Use K&R-style defn.
+ For some reason libc prefers K&R style defns for external functions.
+ (regerror) [!defined _LIBC]: Likewise.
+ (re_set_syntax, re_compile_fastmap, regcomp, regfree, re_comp):
+ (seek_collating_symbol_entry, lookup_collation_sequence_value):
+ (build_range_exp, build_collating_symbol):
+ Use K&R-style defn.
+ (re_compile_fastmap): Use '\0' to memset, not 0.
+ (utf8_sb_map): Make the calculations more obvious.
+ (init_dfa, parse_bracket_exp, build_charclass_op):
+ Call calloc and cast result, as glibc does.
+ (init_word_char, fetch_token, peek_token, peek_token_bracket):
+ (build_range_exp, build_collating_symbol):
+ Now internal functions.
+
+ * lib/regex.c [!defined _LIBC]: Allow compiling with C++ compilers.
+
+ * lib/regex.h (__USE_GNU_REGEX): New macro. Don't depend on
+ _REGEX_SOURCE any more; depend on _GNU_SOURCE instead.
+ Don't depend on VMS; depend on __VMS instead, for POSIX
+ namespace cleanness.
+ (regoff_t): Define to ssize_t, not long int.
+
+ Remove the REG_ macros named below. Instead, make the old names
+ (e.g., RE_BACKSLASH_ESCAPE_IN_LISTS) visible only if
+ __USE_GNU_REGEX.
+ (REG_BACKSLASH_ESCAPE_IN_LISTS):
+ (REG_BK_PLUS_QM, REG_CHAR_CLASSES, REG_CONTEXT_INDEP_ANCHORS):
+ (REG_CONTEXT_INDEP_OPS, REG_CONTEXT_INVALID_OPS):
+ (REG_DOT_NEWLINE, REG_DOT_NOT_NULL, REG_HAT_LISTS_NOT_NEWLINE):
+ (REG_INTERVALS, REG_LIMITED_OPS, REG_NEWLINE_ALT):
+ (REG_NO_BK_BRACES, REG_NO_BK_PARENS, REG_NO_BK_REFS):
+ (REG_NO_BK_VBAR, REG_NO_EMPTY_RANGES):
+ (REG_UNMATCHED_RIGHT_PAREN_ORD, REG_NO_POSIX_BACKTRACKING):
+ (REG_NO_GNU_OPS, REG_DEBUG, REG_INVALID_INTERVAL_ORD):
+ (REG_IGNORE_CASE, REG_CARET_ANCHORS_HERE):
+ (REG_CONTEXT_INVALID_DUP, REG_NO_SUB, REG_SYNTAX_EMACS):
+ (REG_SYNTAX_AWK, REG_SYNTAX_GNU_AWK, REG_SYNTAX_POSIX_AWK):
+ (REG_SYNTAX_GREP, REG_SYNTAX_EGREP, REG_SYNTAX_POSIX_EGREP):
+ (REG_SYNTAX_ED, REG_SYNTAX_SED, _REG_SYNTAX_POSIX_COMMON):
+ (REG_SYNTAX_POSIX_BASIC, REG_SYNTAX_POSIX_MINIMAL_BASIC):
+ (REG_SYNTAX_POSIX_EXTENDED, REG_SYNTAX_POSIX_MINIMAL_EXTENDED):
+ (REG_DUP_MAX, REG_UNALLOCATED, REG_REALLOCATE, REG_FIXED):
+ (REG_NREGS):
+ Remove. All uses replaced by the old RE_* names.
+ (RE_BACKSLASH_ESCAPE_IN_LISTS):
+ (RE_BK_PLUS_QM, RE_CHAR_CLASSES, RE_CONTEXT_INDEP_ANCHORS):
+ (RE_CONTEXT_INDEP_OPS, RE_CONTEXT_INVALID_OPS):
+ (RE_DOT_NEWLINE, RE_DOT_NOT_NULL, RE_HAT_LISTS_NOT_NEWLINE):
+ (RE_INTERVALS, RE_LIMITED_OPS, RE_NEWLINE_ALT):
+ (RE_NO_BK_BRACES, RE_NO_BK_PARENS, RE_NO_BK_REFS):
+ (RE_NO_BK_VBAR, RE_NO_EMPTY_RANGES):
+ (RE_UNMATCHED_RIGHT_PAREN_ORD, RE_NO_POSIX_BACKTRACKING):
+ (RE_NO_GNU_OPS, RE_DEBUG, RE_INVALID_INTERVAL_ORD):
+ (RE_IGNORE_CASE, RE_CARET_ANCHORS_HERE):
+ (RE_CONTEXT_INVALID_DUP, RE_NO_SUB):
+ Don't bother having these macros be independent of each others'
+ values, since they no longer exist in the POSIX name space.
+
+ Rename the following member names back to their old names,
+ unless !__USE_GNU_REGEX. All uses changed back.
+ (buffer): Renamed from re_buffer.
+ (allocated): Renamed from re_allocated.
+ (used): Renamed from re_used.
+ (syntax): Renamed from re_syntax.
+ (fastmap): Renamed from re_fastmap.
+ (translate): Renamed from re_translate.
+ (can_be_null): Renamed from re_can_be_null.
+ (regs_allocated): Renamed from re_regs_allocated.
+ (fastmap_accurate): Renamed from re_fastmap_accurate.
+ (no_sub): Renamed from re_no_sub.
+ (not_bol): Renamed from re_not_bol.
+ (not_eol): Renamed from re_not_eol.
+ (newline_anchor): Renamed from re_newline_anchor.
+ (num_regs): Renamed from rm_num_regs.
+ (start): Renamed from rm_start.
+ (end): Renamed from rm_end.
+
+ (free_state): Move up a bit.
+
+ * lib/regex_internal.h (inline) [__GNUC__ < 3 && defined _LIBC]:
+ #define to be empty.
+ (ASCII_CHARS): New macro, replacing all uses of 0x80 and/or SBC_MAX / 2
+ when that is what is intended.
+ (SBC_MAX): Define to UCHAR_MAX + 1, not 256.
+ (__re_error_msgid, __re_error_msgid_idx): Remove decls; not needed.
+ (MAX): New macro.
+ (re_xmalloc, re_calloc, re_xrealloc, re_x2realloc): Remove.
+ All uses changed back to re_malloc, etc. It's now the caller's
+ responsibility to check for overflow; all callers changed.
+ (re_alloc_oversized, re_x2alloc_oversized, re_xnmalloc, re_xnrealloc):
+ (re_x2nrealloc): Remove.
+ (free_state): Remove decl.
+
+ * lib/regexc.c (regexec, re_match, re_search, re_match_2, re_search_2):
+ (re_set_registers, re_exec):
+ Use K&R-style defn.
+
+ 2006-01-31 Roland McGrath <roland@redhat.com>
+
+ * lib/regcomp.c (calc_eclosure_iter): Remove dead variables.
+ Reported by Mike Frysinger <vapier@gentoo.org>.
+
+ 2006-01-15 Andreas Jaeger <aj@suse.de>
+
+ [BZ #1950]
+ * lib/regex_internal.c (re_string_reconstruct): Adjust for
+ build_wcs_upper_buffer change.
+ (build_wcs_upper_buffer): Change return type.
+
+ 2005-12-10 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/regex_internal.h: Include <stdint.h> if available.
+
+ 2005-12-06 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/regex_internal.h (SIZE_MAX): Provide a default definition.
+
+ 2005-10-14 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/regcomp.c: Adjust for changed secondary hash function.
+
+ 2005-09-30 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/regex.h: Pretty printing.
+ Clean up namespace a bit.
+
+ 2005-09-30 Jakub Jelinek <jakub@redhat.com>
+
+ * lib/regexec.c (update_cur_sifted_state, check_arrival,
+ check_arrival_add_next_nodes): Avoid using uninitialized variable.
+
+ 2005-09-06 Paul Eggert <eggert@cs.ucla.edu>
+ Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #1302]
+ * lib/regex_internal.h (bitset_t): Renamed from bitset. All uses
+ changed.
+ (bitset_word_t): Renamed from bitset_word. All uses changed.
+
+ 2005-09-22 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #281]
+ * lib/regex.h: Define RE_TRANSLATE_TYPE as unsigned char *.
+ * lib/regcomp.c: Remove unnecessary uses of
+ unsigned RE_TRANSLATE_TYPE.
+ * lib/regex_internal.h: Likewise.
+ * lib/regex_internal.c: Likewise.
+ * lib/regexec.c: Likewise.
+ Based on a patch by Stepan Kasal <kasal@ucw.cz>.
+
+ 2005-09-07 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/regexec.c (find_recover_state): Remove unnecessary
+ initialization.
+ (transit_state_bkref): Make DFA a const pointer.
+ (get_subexp): Likewise.
+ (check_arrival): Likewise.
+ (update_cur_sifted_state): Likewise.
+ (re_search_internal): Likewise.
+ (prune_impossible_nodes): Likewise.
+ (acquire_init_state_context): Likewise.
+ (proceed_next_node): Likewise.
+ (set_regs): Likewise.
+ (free_fail_stack_return): Likewise.
+ (check_arrival_expand_ecl): Mark DFA parameter as const.
+ (check_arrival_expand_ecl_sub): Likewise.
+ (check_subexp_limits): Likewise.
+ (sub_epsilon_src_nodes): Likewise.
+ (add_epsilon_src_nodes): Likewise.
+ (merge_state_array): Likewise.
+ (update_regs): Likewise.
+ (build_trtable): Likewise.
+ (sift_states_backward): Mark MCTX parameter as const.
+ (build_sifted_states): Likewise.
+ (update_cur_sifted_state): Likewise.
+ (sift_states_mkref): Likewise.
+ (check_arrival_expand_ecl): Mark eclosure as const.
+ (check_dst_limits_calc_pos_1): Likewise.
+ * lib/regex_internal.h (re_match_context_t): Make dfa a const
+ pointer.
+
+ 2005-09-06 Ulrich Drepper <drepper@redhat.com>
+
+ * lib/regexec.c (merge_state_with_log): Define dfa as const pointer.
+ (transit_state_sb): Likewise.
+ (transit_state_mb): Likewise.
+ (sift_states_iter_mb): Likewise.
+ (check_arrival_add_next_nodes): Likewise.
+ (check_node_accept_bytes): Change first parameter to pointer-to-const.
+ [_LIBC] (re_search_2_stub): Use mempcpy.
+
+ * lib/regex_internal.c (re_string_reconstruct): Avoid calling
+ mbrtowc for very simple UTF-8 case.
+
+ * lib/regex_internal.c (re_acquire_state): Make DFA pointer arg
+ a pointer-to-const.
+ (re_acquire_state_context): Likewise.
+ * lib/regex_internal.h: Adjust prototypes.
+
+ * lib/regex.c: Prevent using C++ compilers.
+
+ * lib/regex_internal.c (re_acquire_state): Minor code rearrangement.
+ (re_acquire_state_context): Likewise.
+
+2006-04-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/regex (Depends-on): Add ssize_t.
+
+2006-04-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_REGEX): Check for new glibc interface to
+ translation table.
+
+2006-04-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/gnulib-tool.texi (Modified imports): pathname -> file name.
+
+2006-03-29 Mark D. Baushke <mdb@gnu.org>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: On OpenBSD, don't redefine types already included in
+ <sys/types.h> and <inttypes.h>.
+
+2006-03-25 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/argz.m4 (gl_FUNC_ARGZ): If we define `error_t', also define
+ `__error_t_defined', so argp.h will not typedef the former.
+
+2006-03-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_REGEX): Don't insist on REG_SYNTAX_POSIX_EGREP,
+ REG_SYNTAX_EMACS, and REG_IGNORE_CASE. Settle for the traditional
+ glibc names. Even if glibc is changed to conform to POSIX, the
+ traditional names will be available anyway, since regex depends on
+ the extensions module. Also, fix a longstanding typo in the
+ implementation of Spencer ERE test #75 from grep 2.3. Problems
+ reported by Emanuele Giaquinta. Also, change sense of cached
+ variable, so that the message makes sense.
+
+2006-03-24 Simon Josefsson <jas@extundo.com>
+
+ * lib/base64.c: Fix problems reported by Eric Blake <ebb9@byu.net>,
+ including some doc fixes.
+ (base64_encode_alloc): Fix +1 bug on allocation failures.
+
+2006-03-24 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/base64.c (base64_encode): Do not read past end of array with
+ unsanitized input on systems with CHAR_BIT > 8.
+
+2006-03-24 Eric Blake <ebb9@byu.net>
+
+ * lib/time_r.c (copy_string_result): Remove, as it is no longer used.
+
+2006-03-22 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (*setenv.[ch]): get from coreutils.
+ * config/srclistvars.sh (COREUTILS): new var.
+
+2006-03-17 Jim Meyering <jim@meyering.net>
+
+ * m4/regex.m4 (gl_REGEX): Fix typo in last change:
+ s/_REGEX_WIDE_OFFSETS/_REGEX_LARGE_OFFSETS/.
+
+2006-03-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_REGEX): Don't check for off_t, since the code
+ no longer needs it. Instead, check that regoff_t is as least
+ as wide as ptrdiff_t.
+
+ Don't define _REGEX_WIDE_OFFSETS unless using the included regex,
+ so that our regex.h stays compatible with the installed regex.
+ This is helpful for installers who configure --without-included-regex.
+ Problem reported by Emanuele Giaquinta.
+
+2006-03-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex.h (regoff_t) [defined _REGEX_LARGE_OFFSETS]:
+ Typedef to long int, not to off_, as POSIX will likely change
+ in that direction.
+
+2006-03-15 Eric Blake <ebb9@byu.net>
+
+ * m4/dirfd.m4 (gl_FUNC_DIRFD): Use AC_REQUIRE for AC_HEADER_DIRENT.
+
+2006-03-13 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-help.c (validate_uparams): Fix typo
+ * lib/argp-parse.c (argp_default_options): Consistently begin help
+ messages with a lowercase letter.
+
+2006-03-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/time_r.h (asctime_r, ctime_r): Remove. These functions can
+ overrun buffers and shouldn't be used (much as gets shouldn't be
+ used).
+ * lib/time_r.c (asctime_r, ctime_r): Likewise.
+
+2006-03-08 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc-random.m4: Permit 'no' as variable values and fix warnings,
+ suggested by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2006-03-08 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc-random.m4: Call AC_CANONICAL_HOST and use $host_os instead of
+ $target, suggested by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2006-03-08 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-gnulib.c (randomize): Don't open files called 'no', they
+ signal that configure disabled the device.
+
+2006-03-08 Simon Josefsson <jas@extundo.com>
+
+ * build-aux/maint.mk: Fix refresh-po, to handle no translated
+ languages.
+
+2006-03-07 Simon Josefsson <jas@extundo.com>
+
+ * modules/getopt (Depends-on): Add unistd.
+
+ * modules/unistd: New file.
+
+2006-03-07 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-random: New file.
+
+2006-03-07 Simon Josefsson <jas@extundo.com>
+
+ * m4/unistd_h.m4: New file.
+
+2006-03-07 Simon Josefsson <jas@extundo.com>
+
+ * m4/readline.m4 (gl_FUNC_READLINE): Rewrite the cached part of the
+ test to be side-effect free by storing the result in the cache
+ variable gl_cv_lib_readline, and moving the assignment of
+ LIBREADLINE and LTLIBREADLINE outside the COMMANDS-TO-SET-IT.
+ From Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2006-03-07 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc-random.m4: New file, mostly from gc.m4. Warn instead of
+ error on missing devices (the functions will return an error).
+
+ * m4/gc.m4: Move random stuff to gc-random.m4
+
+2006-03-07 Simon Josefsson <jas@extundo.com>
+
+ * lib/unistd_.h: New file.
+
+2006-03-07 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-libgcrypt.c, gc-gnulib.c: Use GC_USE_RANDOM.
+
+2006-03-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/unistd_h.m4 (gl_HEADER_UNISTD): Rename, to match modules file.
+ Problem reported by Juan Manuel Guerrero.
+
+2006-03-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/c-stack.c: Include unistd.h unconditionally, since we now assume
+ the unistd module.
+ * lib/getlogin_r.c: Likewise.
+ * lib/getlogin_r.h: Likewise.
+ * lib/glob.c: Likewise.
+ * lib/pagealign_alloc.c: Likewise.
+ * lib/unistd_.h: Remove; no longer needed.
+
+2006-03-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (Support for systems lacking POSIX:2001):
+ Add unistd.
+ * modules/c-stack (Depends-on): Add unistd.
+ * modules/getlogin_r: Likewise.
+ * modules/glob: Likewise.
+ * modules/pagealign_alloc: Likewise.
+ * modules/unistd (Files): Remove lib/unistd_.h.
+ (EXTRA_DIST): Remove.
+ (unistd.h): Create using 'echo' rather than 'cp', so that we don't
+ need unistd_.h.
+ (MOSTLYCLEANFILES): Remove unistd.h-t.
+
+2006-03-03 Simon Josefsson <jas@extundo.com>
+
+ * build-aux/maint.mk: Add several syntax checks from CoreUtils.
+
+2006-03-03 Simon Josefsson <jas@extundo.com>
+
+ * build-aux/maint.mk: Add refresh-po rule, based on ideas from
+ libidn and bison.
+
+2006-03-03 Simon Josefsson <jas@extundo.com>
+
+ * build-aux/maint.mk: Add indent target.
+
+2006-03-03 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> (tiny change)
+
+ * m4/poll.m4 (gl_FUNC_POLL): If we deem poll(2) unacceptable, use
+ our replacement poll.h in any case, to avoid a differing
+ declaration from a system header. Seen on AIX.
+
+2006-03-01 Simon Josefsson <jas@extundo.com>
+
+ * lib/readline.c: Fix typo, tiny patch from Stepan Kasal
+ <kasal@ucw.cz>.
+
+2006-03-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/gettime (Depends-on): Add extensions module.
+ * modules/nanosleep (Depends-on): Likewise.
+ * modules/settime (Depends-on): Likewise.
+
+2006-03-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/clock_time.m4 (gl_CLOCK_TIME): Require gl_USE_SYSTEM_EXTENSIONS,
+ not merely AC_GNU_SOURCE, for the benefit of Solaris 10 when compiled
+ pedantically.
+ * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Likewise.
+ * m4/timespec.m4 (gl_TIMESPEC): Likewise.
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Use "=" with "test",
+ not "==". Reported by Ralf Wildenhues.
+
+2006-03-01 Karl Berry <karl@gnu.org>
+
+ * doc/Copyright/request-*: new files, synced from gnuorg.
+
+2006-03-01 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (Copyright/*): new entries.
+
+2006-02-28 Simon Josefsson <jas@extundo.com>
+
+ * lib/getopt.c: Protect #include of unistd.h, for MSVS.
+
+2006-02-27 Simon Josefsson <jas@extundo.com>
+
+ * lib/base64.h: Indent #define's. From Jim Meyering
+ <jim@meyering.net>.
+
+2006-02-27 Jim Meyering <jim@meyering.net>
+
+ Revert the change of 2006-02-24, so these files can continue
+ to be sync'd from gettext.
+ * lib/mkdtemp.c, setenv.c, unsetenv.c: *Un*-normalize inclusion
+ of `config.h'.
+
+2006-02-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/intprops: New file.
+ * MODULES.html.sh (Numeric conversion functions <stdlib.h>):
+ Add intprops.
+ * modules/getloadavg (Files): Remove lib/intprops.h.
+ (Depends-on): Add intprops.
+ * modules/human: Likewise.
+ * modules/inttostr: Likewise.
+ * modules/openat: Likewise.
+ * modules/sig2str: Likewise.
+ * modules/userspec: Likewise.
+ * modules/utimecmp: Likewise.
+ * modules/xnanosleep: Likewise.
+ * modules/xstrtol: Likewise.
+
+2006-02-24 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> (tiny changes)
+
+ * modules/xstrtod: Omit xstrtod.h, xstrtod.c; they're in LIB_SOURCES.
+ * modules/lock-tests (TESTS): Use $(EXEEXT).
+ * modules/tls-tests: Likewise.
+ * modules/argp-tests: Likewise.
+ (check_PROGRAMS): New var, replacing...
+ (noinst_PROGRAMS, test_argp_SOURCES): Remove.
+
+2006-02-24 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * lib/mkdtemp.c, lib/setenv.c, lib/unsetenv.c: Normalize inclusion of
+ `config.h'.
+
+2006-02-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/glob.c: Say "invalid" rather than "illegal" in comments.
+
+2006-02-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Sync from coreutils.
+ * m4/mkdir-p.m4 (gl_MKDIR_PARENTS): Require gl_FUNC_LCHMOD and
+ gl_CHDIR_SAFER.
+
+2006-02-22 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * m4/chdir-safer.m4: New file.
+
+2006-02-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
+ AT_FDCWD exceeds INT_MAX.
+ * lib/openat.h (AT_FDCWD): Likewise.
+
+2006-02-17 Eric Blake <address@hidden>
+
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Fix caching error.
+
+2006-02-16 Simon Josefsson <jas@extundo.com>
+
+ * modules/getaddrinfo (Depends-on): Add sys_socket.
+
+2006-02-15 Simon Josefsson <jas@extundo.com>
+
+ * build-aux/maint.mk: Add dsyntax-check rule.
+
+2006-02-15 Eric Blake <ebb9@byu.net>
+
+ * m4/sys_socket_h.m4 (gl_HEADER_SYS_SOCKET): Don't attempt using
+ winsock2.h or ws2tcpip.h when sys/socket.h is present. Fixes
+ 'present but cannot compile' warnings on cygwin.
+ * m4/socklen.m4 (gl_TYPE_SOCKLEN_T): Use gl_HEADER_SYS_SOCKET. Don't
+ use ws2tcpip.h if sys/socket.h works.
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Use gl_HEADER_SYS_SOCKET.
+ (gl_GETADDRINFO): Don't use ws2tcpip.h when sys/socket.h is present.
+
+2006-02-14 Simon Josefsson <jas@extundo.com>
+
+ * modules/maintainer-makefile (Files): Rename.
+
+ * build-aux/GNUmakefile: Rename Makefile.maint to maint.mk
+ and (the local) Makefile.cfg to maint-cfg.mk.
+
+ * build-aux/Makefile.maint, build-aux/maint.mk: Renamed the former
+ to the latter.
+
+ * modules/maintainer-makefile: New module.
+
+ * build-aux/Makefile.maint: New file, from GNU CoreUtils, although
+ severaly stripped to make it possible to build it up from scratch
+ with reliable tests.
+
+ * build-aux/GNUmakefile: New file, from GNU CoreUtils with some
+ fixes to permit overriding the default actions when configure and
+ makefile are not available.
+
+2006-02-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * modules/lstat (Depends-on): Don't depend on xalloc.
+ (License): Change from GPL to LGPL, since this is now simply a
+ replacement for a libc function.
+
+2006-02-14 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+
+ Eliminate the unwelcome (albeit unlikely) possibility of xmalloc
+ failure on deficient systems, and simplify gnulib lgpl dependencies.
+ * lib/lstat.c (rpl_lstat): Rewrite to use stat() in place of the
+ xmalloc/lstat combination. Based on a patch from Bruno Haible.
+
+ * lib/xalloc-die.c: Remove unused definition of N_.
+
+2006-02-14 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * m4/ls-mntd-fs.m4 (AC_FUNC_GETMNTENT): Invoke
+ AC_CHECK_FUNCS(getmntent) unconditionally so that tests of
+ $ac_cv_func_getmntent (e.g., in gl_LIST_MOUNTED_FILE_SYSTEMS) need not
+ double-quote uses of that variable, to accommodate the rare case in
+ which getmntent is available in none of the libraries checked. This
+ happens at least on FreeBSD 5.0.
+
+2006-02-13 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool (Usage): Fix --import, from
+ karl@freefriends.org (Karl Berry).
+
+2006-02-13 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-fmtstream.c: Restore another bugfix lost on 2005-12-12
+
+2006-02-07 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-namefrob.h: Restore changes accidentally lost during the
+ "autoupdate" on 2005-12-12.
+
+2006-02-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/closeout (Depends-on): Remove atexit.
+
+2006-02-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/closeout.c (close_stdout): Don't assume 'bool' converts nonzero
+ ints to 0 or 1, as this isn't true for the stdbool.h substitute.
+
+2006-02-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Don't #define
+ __EXTENSIONS__ if this causes compilation to fail. Problem
+ reported by Nelson H. F. Beebe with Solaris 10 and Sun C 5.7
+ c89 -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED.
+
+2006-01-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fnmatch.c (L_): Renamed from L, to work around a bug in
+ Mac OS X 10.3.9 with GCC 3 reported by Claudio Fontana in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2006-01/msg00074.html>.
+ All uses changed.
+
+2006-01-26 Simon Josefsson <jas@extundo.com>
+
+ * lib/socket_.h: Set WINVER to 0x0501, to make sure getaddrinfo
+ prototype is visible on mingw32.
+
+ * lib/getaddrinfo.h: Define EAI_ADDRFAMILY and EAI_SYSTEM if not set,
+ for mingw32.
+
+ * lib/gai_strerror.c, getaddrinfo.h: Protect netdb.h #include (for
+ mingw32).
+
+2006-01-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fts.c (diropen): Open with O_NOCTTY | O_NONBLOCK too. Don't
+ attempt to open for write; this always fails, at least on POSIX
+ hosts. This reinstates the 2006-01-09 change, which was
+ inadvertently removed.
+
+2006-01-26 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Use "trap 'exit $?' instead of "trap :".
+ Reported by Paul Eggert.
+
+2006-01-26 Bruno Haible <bruno@clisp.org>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stdbool_.h (_Bool)
+ [(! (defined __cplusplus || defined __BEOS__)
+ && !defined __GNUC__
+ && !(defined __HP_cc || defined __xlc__
+ || (defined __SUNPRO_C && (__SUNPRO_C < 0x550 || __STDC__ == 1))
+ || defined __sgi))]:
+ #define to signed char in these cases too; this simplifies
+ the code (so that we don't have to worry about HP-UX, AIX, SunPRO,
+ etc., separately) and makes it more conservative.
+
+2006-01-25 Simon Josefsson <jas@extundo.com>
+
+ * m4/getaddrinfo.m4: Look for getaddrinfo inside ws2tcip.h and
+ -lws2_32. Protect sys/socket.h and netdb.h #include's. Include
+ ws2tcpip.h with WINVER=0x0501. All for mingw32.
+
+2006-01-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-namefrob.h: Bugfix. Remove stray #
+
+2006-01-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stdbool.m4 (AC_HEADER_STDBOOL): Check for xlc bug if __GCC__ too,
+ so that we test the test.
+ Check for yet another HP-UX cc bug involving *bool |= bool.
+
+2006-01-25 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (vasnprintf.c): sync lost.
+
+2006-01-25 Jim Meyering <jim@meyering.net>
+
+ Sync from the stable (b5) branch of coreutils:
+
+ * lib/fts.c (fts_children): Don't let close() clobber errno from
+ failed fchdir().
+
+ * lib/fts.c (fts_stat): When following a symlink-to-directory,
+ don't necessarily interpret stat-fails+lstat-succeeds as indicating
+ a dangling symlink. That can also happen at least for ELOOP.
+ The fix: return FTS_SLNONE only when the stat errno is ENOENT.
+ FYI, this bug predates the inclusion of fts.c in coreutils.
+
+ * lib/fts.c (fts_open): Put new maxarglen declaration and uses
+ in their own block, so pre-c99 compilers don't object.
+
+ Avoid the double-free (first in fts_read, second in fts_close) that
+ would occur when an `active' directory is made inaccessible (e.g.,
+ via chmod a-x) during a traversal.
+ * lib/fts.c (fts_read): After a failed fchdir, update sp->fts_cur
+ before returning. Reproduce this failure by
+ mkdir -p a/b; cd a; chmod a-x . b
+ Reported by Stavros Passas.
+
+2006-01-25 Jim Meyering <jim@meyering.net>
+
+ * lib/fileblocks.c: Remove more useless parentheses.
+ * lib/readutmp.h: Likewise.
+
+2006-01-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdbool_.h (_Bool) [IRIX cc]: Define as 'signed char', to avoid
+ warnings.
+ Reported by Paul Eggert.
+
+2006-01-25 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Use "trap :" instead of "trap -" to get
+ rid of a trap command. For Solaris sh.
+ Reported by Mark D. Baushke <mdb@gnu.org>.
+
+2006-01-24 Simon Josefsson <jas@extundo.com>
+
+ * lib/socket_.h (SHUT_WR, SHUT_RDWR): Don't hardcode, suggested by
+ Bruno.
+
+2006-01-24 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (argp-namefrob.h): sync lost.
+
+2006-01-24 Jim Meyering <jim@meyering.net>
+
+ * modules/openat (Files): Add lib/intprops.h.
+ From Mark D. Baushke.
+
+2006-01-24 Jim Meyering <jim@meyering.net>
+
+ * m4/openat.m4 (gl_FUNC_OPENAT): Add AC_LIBSOURCES([intprops.h]).
+ Reported by Mark D. Baushke.
+
+2006-01-24 Jim Meyering <jim@meyering.net>
+
+ * lib/socket_.h: Remove useless parentheses in uses of cpp `defined'.
+
+2006-01-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/strnlen (Maintainer): Change from glibc to all.
+
+2006-01-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdbool.m4 (AC_HEADER_STDBOOL): Check for IBM and HP-UX bugs.
+ Patch by Paul Eggert.
+
+2006-01-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdbool_.h (_Bool) [__cplusplus]: Don't define if the compiler
+ already has it.
+ Report and patch by Albert Chin-A-Young <china@thewrittenword.com> on
+ 2005-11-26.
+
+ * lib/stdbool_.h (_Bool) [HP-UX cc, AIX cc,xlc]: Define as
+ 'signed char' to avoid problems with the built-in _Bool type.
+ Reported by Paul Eggert on 2005-11-26.
+
+2006-01-24 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Avoid constructing complicated sed
+ expressions inside backquote.
+ Report and solution by Mark D. Baushke <mdb@gnu.org>.
+
+2006-01-23 Ulrich Drepper <drepper@redhat.com>
+
+ These changes imported from libc.
+ * lib/getopt.c: Use __fxprintf instead of inline stream orientation
+ test and two separate function calls.
+ * lib/strndup.c (__strndup): Add libc_hidden_def.
+
+2006-01-23 Simon Josefsson <jas@extundo.com>
+
+ * modules/lock-tests: Use check_PROGRAMS instead of noinst_PROGRAMS.
+ Remove the test_*_SOURCES variable: automake infers it by default.
+ * modules/tls-tests: Likewise.
+
+2006-01-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ Work around porting bugs reported by Dieter in
+ <http://lists.gnu.org/archive/html/bug-bison/2006-01/msg00049.html>.
+ * lib/getopt.c (_NOPROTO): Remove; no longer needed.
+ Include <stdlib.h> and <unistd.h> in all environments; it's safe now.
+ Include "getopt.h" first, to check interface.
+ (getenv): Declare only if defined HAVE_DECL_GETENV &&
+ !HAVE_DECL_GETENV.
+ * lib/strndup.c [!_LIBC]: Include "strndup.h" to get prototype.
+ (__strndup): Revert to K&R-style function dfns, the glibc style.
+ * lib/strnlen.c: Don't claim it's taken from glibc; it's not.
+ (strnlen, __strnlen): Remove #defines and #undefs; not needed.
+ Include strnlen.h first, to get prototype properly.
+ (strnlen): Renamed from __strnlen.
+ Remove weak alias.
+
+2006-01-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getopt.m4 (gl_PREREQ_GETOPT): Check for getenv decl.
+
+2006-01-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Adjust to reflect glibc reorganization.
+ This affects only comments.
+
+2006-01-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> (tiny change)
+
+ * gnulib-tool, build-aux/csharpcomp.sh.in: Do not pass `-q' to mktemp.
+ Reported by Bruce Korb <bkorb@gnu.org>.
+
+2006-01-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/quotearg.c (quotearg_buffer_restyled): Add "default: break;"
+ to pacify gcc -Wswitch-default.
+
+2006-01-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): In the computation of the size of the
+ temporary buffer for sprintf, take into account the precision also
+ for 'd', 'i', 'u', 'o', 'x', 'X'.
+
+2006-01-21 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * modules/argp-tests: New module
+ * tests/test-argp.c: New file
+ * tests/test-argp-2.sh: New file
+
+2006-01-21 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-help.c (usage_long_opt): Do not print DOC options.
+ (__argp_base_name): Removed
+ * lib/argp-namefrob.h (__argp_basename): Removed definition. Was a
+ typo.
+ (__argp_base_name): Provide macro definition or extern declaration
+ depending on the configuration
+
+2006-01-20 Simon Josefsson <jas@extundo.com>
+
+ * modules/inet_ntop (Depends-on): Depend on sys_socket.
+
+2006-01-20 Simon Josefsson <jas@extundo.com>
+
+ * lib/inet_ntop.h: Unconditionally include sys/socket.h.
+
+2006-01-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/lib-ignore.m4 (gl_IGNORE_UNUSED_LIBRARIES): Use -Wl,-z,ignore
+ rather than -Xlinker -z -Xlinker ignore, as it's more portable.
+ Suggested by Bruno Haible.
+
+2006-01-20 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (argp-fmtstream.h, localcharset.c): comment out
+ until changes propagate, I guess.
+
+2006-01-19 Simon Josefsson <jas@extundo.com>
+
+ * m4/socklen.m4: Look in ws2tcpip.h too, for mingw32.
+
+2006-01-19 Simon Josefsson <jas@extundo.com>
+
+ * lib/socket_.h: Map SHUT_RD, SHUT_WR, SHUT_RDWR correctly.
+
+2006-01-19 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool: Set check_PROGRAMS.
+
+ * modules/arcfour-tests, modules/arctwo-tests, modules/crc-tests,
+ modules/des-tests, modules/gc-arcfour-tests,
+ modules/gc-arctwo-tests, modules/gc-des-tests,
+ modules/gc-hmac-md5-tests, modules/gc-hmac-sha1-tests,
+ modules/gc-md2-tests, modules/gc-md4-tests, modules/gc-md5-tests,
+ modules/gc-pbkdf2-sha1-tests, modules/gc-rijndael-tests,
+ modules/gc-sha1-tests, modules/gc-tests, modules/hmac-md5-tests,
+ modules/hmac-sha1-tests, modules/md2-tests, modules/md4-tests,
+ modules/md5-tests, modules/readline, modules/rijndael-tests: Use
+ check_PROGRAMS instead of noinst_PROGRAMS to be able to remove
+ test_*_SOURCES.
+
+2006-01-18 Simon Josefsson <jas@extundo.com>
+
+ * modules/socklen (Depends-on): Depend on sys_socket.
+
+2006-01-18 Simon Josefsson <jas@extundo.com>
+
+ * modules/arcfour-tests, modules/arctwo-tests, modules/crc-tests,
+ modules/des-tests, modules/gc-arcfour-tests,
+ modules/gc-arctwo-tests, modules/gc-des-tests,
+ modules/gc-hmac-md5-tests, modules/gc-hmac-sha1-tests,
+ modules/gc-md2-tests, modules/gc-md4-tests, modules/gc-md5-tests,
+ modules/gc-pbkdf2-sha1-tests, modules/gc-rijndael-tests,
+ modules/gc-sha1-tests, modules/gc-tests, modules/hmac-md5-tests,
+ modules/hmac-sha1-tests, modules/md2-tests, modules/md4-tests,
+ modules/md5-tests, modules/readline, modules/rijndael-tests: Add
+ $(EXEEXT) to automake TESTS variable, for mingw32.
+
+2006-01-17 Simon Josefsson <jas@extundo.com>
+
+ * modules/socklen (Include): Need sys/socket.h.
+
+2006-01-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/ssize_t (Include): Add <sys/types.h>.
+
+2006-01-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/lib-ignore.m4 (gl_IGNORE_UNUSED_LIBRARIES): Don't use ldd, as
+ it's not portable and it doesn't work with cross-compiles.
+ Problem reported by Bruno Haible. Fix missing-$ typo in
+ 'test "gl_cv_ignore_unused_libraries" ...' that prevented
+ -zignore from being used with Sun's C compiler.
+
+2006-01-12 Simon Josefsson <jas@extundo.com>
+
+ * lib/base64.c: Fix warning, reported by Bruno Haible
+ <bruno@clisp.org> and patch by Paul Eggert <eggert@CS.UCLA.EDU>.
+
+2006-01-12 Bruno Haible <bruno@clisp.org>
+
+ * modules/ldd: New file.
+ * build-aux/ldd.sh.in: New file.
+ * MODULES.html.sh (Support for building libraries and executables): Add
+ ldd.
+
+2006-01-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/ldd.m4: New file.
+
+2006-01-12 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir): Don't go into an
+ endless loop while replacing $auxdir with build-aux.
+
+2006-01-11 Simon Josefsson <jas@extundo.com>
+
+ * lib/stdint_.h (SIZE_MAX): Add missing (.
+
+2006-01-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * lib/md5.c: Fix commentary typos.
+ (alignof, UNALIGNED_P): No need for a GCC-specific version.
+ * lib/md5.h (__attribute__): Remove; unused.
+ * lib/sha1.c: Fix commentary to match md5 better.
+ * lib/sha1.h (struct sha1_ctx): Use a word buffer, not a byte buffer,
+ so that we don't need to worry about alignment. All uses changed.
+ This merges the 2005-10-28 md5 change into sha1.
+
+2006-01-11 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * lib/md5.c (OP): Fix spacing.
+
+2006-01-11 Bruno Haible <bruno@clisp.org>
+
+ Ensure automatic ordering between gl_LOCK and gl_ARGP.
+ * m4/lock.m4 (gl_LOCK_BODY): Renamed from gl_LOCK.
+ (gl_LOCK): New macro, requiring gl_LOCK_BODY.
+
+2006-01-11 Bruno Haible <bruno@clisp.org>
+
+ Ensure automatic ordering between gl_LOCK and gl_ARGP.
+ * gnulib-tool (func_import, func_create_testdir): Put gl_LOCK into
+ the "early" section as well.
+
+2006-01-11 Bruno Haible <bruno@clisp.org>
+
+ Avoid "ar: no archive members specified" error on MacOS X.
+ * gnulib-tool (func_modules_add_dummy): New function.
+ (func_import, func_create_testdir): Invoke it.
+
+2006-01-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir): Replace build-aux
+ with $auxdir in AC_CONFIG_FILES statements.
+
+2006-01-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+ Initialize also noinst_HEADERS to empty.
+
+2006-01-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (AUTOMAKEPATH, AUTOCONF, ACLOCAL, AUTOMAKE): New
+ variables.
+ (func_create_megatestdir): Call aclocal, autoconf, automake here, not
+ autoreconf.
+
+2006-01-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (AUTOCONF, ACLOCAL, AUTOMAKE, AUTORECONF): Make
+ overridable by the user.
+ Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2006-01-10 Simon Josefsson <jas@extundo.com>
+
+ * modules/sys_socket: New file.
+
+2006-01-10 Simon Josefsson <jas@extundo.com>
+
+ * m4/sys_socket_h.m4: New file.
+
+2006-01-10 Simon Josefsson <jas@extundo.com>
+
+ * lib/socket_.h: New file.
+
+2006-01-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/readutmp (Maintainer): Add myself.
+
+2006-01-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/memcoll.m4 (gl_MEMCOLL): Don't require AC_FUNC_MEMCMP, undoing
+ the 2002-12-31 change. Problem and fix reported by Bruno Haible.
+ People who are still concerned with buggy memcmp implementations
+ can invoke gl_FUNC_MEMCMP themselves.
+
+2006-01-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex_internal.h (BITSET_WORD_BITS):
+ Work around a bug in 64-bit PGC (before version 6.1-2), where the
+ preprocessor mishandles large unsigned values as if they were signed.
+ Problem reported by Claudio Fontana in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2005-12/msg00061.html>.
+
+2006-01-10 Jim Meyering <jim@meyering.net>
+
+ Avoid the double-free (first in fts_read, second in fts_close) that
+ would occur when an `active' directory is made inaccessible (e.g.,
+ via chmod a-x) during a traversal.
+ * lib/fts.c (fts_read): After a failed fchdir, update sp->fts_cur
+ before returning. Reproduce this failure by
+ mkdir -p a/b; cd a; chmod a-x . b
+ Reported by Stavros Passas.
+
+ Sync from coreutils.
+ * lib/sha1.c: Tweak grammar in a comment.
+
+2006-01-10 Jim Meyering <jim@meyering.net>
+
+ * m4/fpending.m4: Also include <stdio.h>, for Dragonfly.
+ Patch by Joerg Sonnenberger.
+
+2006-01-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/readutmp: Depend on module free.
+ * modules/strtok_r: Depend on module restrict.
+
+2006-01-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/gettext (configure.ac): Add an invocation of
+ AM_GNU_GETTEXT_VERSION. Needed since autoreconf is used by gnulib-tool.
+
+2006-01-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/localcharset.m4 (gl_LOCALCHARSET): Also test for getc_unlocked.
+ Reported by Werner Lemberg <wl@gnu.org>.
+
+2006-01-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c: Update from GNU gettext.
+
+2006-01-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/argp.h (__const): Remove macro. Use const instead.
+ * lib/argp-fmtstream.h (__const): Likewise.
+ * lib/glob_.h (__const): Remove macro.
+ * lib/glob-libc.h: Use const instead of __const.
+
+2006-01-10 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_tests_Makefile_am): Emit an empty SUBDIR
+ variable.
+ Needed to avoid an automake error regarding the 'gettext' module.
+
+2006-01-09 Simon Josefsson <jas@extundo.com>
+
+ * modules/inet_ntop (Depends-on): Add restrict.
+
+2006-01-09 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-rijndael-tests (License): Put under LGPL.
+
+ * modules/gc-des-tests (License): Likewise.
+
+ * modules/gc-arcfour-tests (License): Likewise.
+
+ * modules/gc-arctwo-tests (License): Likewise.
+
+ * modules/gc-pbkdf2-sha1-tests (License): Likewise.
+
+ * modules/gc-hmac-sha1-tests (Files): Likewise.
+
+ * modules/gc-hmac-md5-tests (License): Likewise.
+
+ * modules/gc-sha1-tests (License): Likewise.
+
+ * modules/gc-md5-tests (License): Likewise.
+
+ * modules/gc-md4-tests (License): Likewise.
+
+ * modules/gc-md2-tests (License): Likewise.
+
+ * modules/gc-tests (License): Likewise.
+
+ * modules/des-tests (License): Likewise.
+
+ * modules/md4-tests (License): Likewise.
+
+ * modules/md2-tests (License): Likewise.
+
+2006-01-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils:
+
+ * MODULES.html.sh (build_lib): New section, with new lib-ignore module.
+ * modules/lib-ignore: New file.
+ * modules/mkdir-p (Files): Add chdir-safer.c, chdir-safer.h, lchmod.h,
+ chdir-safer.m4, lchmod.m4.
+ * modules/openat: Add mkdirat.c, openat-priv.h.
+
+2006-01-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * m4/lib-ignore.m4: New file.
+ * m4/lchmod.m4: New file.
+
+2006-01-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * lib/chdir-long.c (cdb_free): Don't bother trying to open directory
+ for write access: POSIX says that must fail.
+ * lib/fts.c (diropen): Likewise.
+ * lib/save-cwd.c (save_cwd): Likewise.
+ * lib/chdir-long.c (cdb_free): Open with O_NOCTTY | O_NONBLOCK as
+ well, for minor improvements on hosts that lack O_DIRECTORY.
+ * lib/chown.c (rpl_chown) [CHOWN_MODIFIES_SYMLINK]:
+ Don't try O_WRONLY unless O_RDONLY failed wth EACCES.
+ Fall back on chown if open failed with EACCES.
+
+ * lib/gettime.c (gettime) [!defined OK_TO_USE_1S_CLOCK]:
+ Report an error at compile-time if only a 1-second nominal clock
+ resolution is found.
+
+ * lib/lchmod.h: New file.
+ * lib/mkdir-p.c: Include lchmod.h, lchown.h.
+ (make_dir_parents): Use lchown rather than chown, and
+ lchmod rather than chmod.
+
+ * lib/mountlist.c (ME_DUMMY): "none" and "proc" file systems are
+ dummies too. Problem with "none" reported by Bob Proulx. Problem with
+ "proc" reported by n0dalus.
+
+ * lib/mountlist.c: Include <limits.h>.
+ (dev_from_mount_options)
+ [defined MOUNTED_GETMNTENT1 || defined MOUNTED_GETMNTENT2]:
+ New function. It no longer assumes "dev=" has the System V meaning
+ on Linux (since it doesn't). It also parses "dev=" more carefully.
+ (read_file_system_list)
+ [defined MOUNTED_GETMNTENT1 || defined MOUNTED_GETMNTENT2]: Use it.
+ MOUNTED_GETMNTENT2 is new here; the code didn't used to look for
+ dev= in that case.
+
+ * lib/posixtm.h (PDS_PRE_2000): New macro.
+ * lib/posixtm.c (year): Arg is now syntax_bits rather than
+ allow_century. All usages changed. Reject dates outside the range
+ 1969-1999 if PDS_PRE_2000 is used.
+
+2006-01-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * doc/getdate.texi (General date syntax): Invalid dates are rejected.
+ (Time of day items): Mention the possibility of leap seconds.
+ Problem reported by Dr. David Alan Gilbert.
+
+2006-01-09 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+
+ * lib/version-etc.c (COPYRIGHT_YEAR): Update to 2006.
+
+ * lib/chdir-safer.h, lib/chdir-safer.c: New files.
+
+ * lib/modechange.c (mode_compile): Reject an invalid mode string
+ that starts with an octal digit. From Andreas Gruenbacher.
+
+ * lib/openat.c: Include "fcntl--.h" and "unistd--.h", to map open
+ and dup to open_safer and dup_safer, respectively.
+ (openat_permissive): Fix typo in comment.
+
+ * lib/openat.c: Don't include <stdlib.h>, <unistd.h>, <fcntl.h>,
+ "gettext.h"; either no longer needed or are guaranteed by openat.h.
+ (_): Remove; no longer needed.
+ (openat): Renamed from rpl_openat; no need for rpl_openat
+ since openat.h renames openat for us.
+ Replace most of the body with a call to openat_permissive,
+ to avoid duplicate code.
+ Port to (probably hypothetical) environments were mode_t is
+ wider than int.
+ (openat_permissive): Require mode arg, so that we can check
+ types better. Put it just after flags. Change cwd failure
+ indicator from pointer-to-bool to pointer-to-errno-value.
+ All callers changed.
+ Invoke openat_save_fail and/or openat_restore_fail if
+ cwd_errno is null, so that openat can call us.
+ (openat_permissive, fdopendir, fstatat, unlinkat):
+ Simplify errno handling to avoid some duplicate code,
+ as it's OK to set errno on success.
+ * lib/openat.h: Revamp code so that function macros depend on
+ __OPENAT_PREFIX only, not also on AT_FDCWD.
+ (openat_ro): Remove. Caller changed to use openat_permissive.
+ (openat_permissive): Now a macro, if not a function.
+ (openat_restore_fail, openat_save_fail): Now always functions,
+ since mkdirat needs them even if __OPENAT_PREFIX is defined.
+
+ * lib/openat-priv.h: New file, defining macros used by mkdirat.c
+ and openat.c.
+ * lib/mkdirat.c: Include openat-priv.h.
+ Remove definitions of macros defined therein.
+ * lib/openat.c: Likewise.
+
+ * lib/mkdirat.c (mkdirat): New file and function.
+ * lib/openat.h (mkdirat): Declare.
+
+ * lib/openat.c (fdopendir): Don't change errno when returning non-NULL.
+
+ * lib/openat.h (openat_permissive): Declare.
+ (openat_ro): Define.
+
+ * lib/openat.c (EXPECTED_ERRNO): New macro.
+ (openat_permissive): New function -- used in remove.c rewrite.
+ (all functions): Set errno just before returning, only if there
+ was an actual failure.
+ Use EXPECTED_ERRNO rather than comparing against only ENOTDIR.
+
+ Emulate openat-family functions using Linux's procfs, if possible.
+ Idea and some code based on Ulrich Drepper's glibc changes.
+
+ * lib/openat.c: (BUILD_PROC_NAME): New macro.
+ Include <stdio.h>, <string.h>, "alloca.h" and "intprops.h".
+ (rpl_openat): Emulate by trying to open /proc/self/fd/%d/%s,
+ before falling back on save_cwd and restore_cwd.
+ (fdopendir, fstatat, unlinkat): Likewise.
+
+ * lib/openat.c (fstatat, unlinkat): Perform the syscall directly,
+ skipping the save_cwd...restore_cwd overhead, if FILE is absolute.
+
+ * lib/openat.c (rpl_openat): Use the promoted type (int), not mode_t,
+ as second argument to va_arg. Otherwise, some versions of gcc
+ warn that `if this code is reached, the program will abort'.
+
+2006-01-09 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Require and compile mkdirat.c.
+ Require openat-priv.h.
+
+2006-01-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/strnlen (Include): Use strnlen.h.
+
+2006-01-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Also test for <sys/bitypes.h>.
+
+2006-01-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/sysexit_.h (EX_OK): New macro.
+ Suggested by Martin Lambers <marlam@marlam.de>.
+
+2006-01-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: On Linux libc4 and libc5, include <sys/bitypes.h> and
+ don't define _STDINT_H_NEED_SIGNED_INT_TYPES.
+
+2006-01-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (SIZE_MAX): Write the value without involving negative
+ numbers.
+
+2006-01-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/javacomp.sh.in: Move to ../build-aux/javacomp.sh.in.
+ * lib/javaexec.sh.in: Move to ../build-aux/javaexec.sh.in.
+ * lib/csharpcomp.sh.in: Move to ../build-aux/csharpcomp.sh.in.
+ * lib/csharpexec.sh.in: Move to ../build-aux/csharpexec.sh.in.
+
+2006-01-09 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/javacomp.sh.in: New file, moved from lib/.
+ * modules/javacomp-script (Files): Update.
+ (configure.ac): Add AC_CONFIG_FILES invocation.
+ (EXTRA_DIST): Remove variable.
+
+ * build-aux/javaexec.sh.in: New file, moved from lib/.
+ * modules/javaexec (Files): Update.
+ (configure.ac): Add AC_CONFIG_FILES invocation.
+ (EXTRA_DIST): Remove javaexec.sh.in.
+
+ * build-aux/csharpcomp.sh.in: New file, moved from lib/.
+ * modules/csharpcomp-script (Files): Update.
+ (configure.ac): Add AC_CONFIG_FILES invocation.
+ (EXTRA_DIST): Remove variable.
+
+ * build-aux/csharpexec.sh.in: New file, moved from lib/.
+ * modules/csharpexec (Files): Update.
+ (configure.ac): Add AC_CONFIG_FILES invocation.
+ (EXTRA_DIST): Remove csharpexec.sh.in.
+
+2006-01-09 Andreas Gruenbacher <agruen@suse.de>
+
+ Sync from coreutils.
+
+ Add POSIX ACL support
+ * lib/acl.h (copy_acl, set_acl): Add declarations.
+ * lib/acl.c (acl_entries): Add fallback implementation for POSIX ACL
+ systems other than Linux.
+ (chmod_or_fchmod): New function: use fchmod when possible,
+ and chmod otherwise.
+ (file_has_acl): Add a POSIX ACL implementation, with a
+ Linux-specific subcase.
+ (copy_acl): Add: copy an acl and S_ISUID, S_ISGID, and
+ S_ISVTX from one file to another. Fall back to fchmod/chmod when
+ acls are unsupported.
+ (set_acl): Add: set a file's acl and S_ISUID, S_ISGID, and
+ S_ISVTX to a defined value. Fall back to fchmod/chmod when acls
+ are unsupported.
+
+2006-01-09 Andreas Gruenbacher <agruen@suse.de>
+
+ Sync from coreutils.
+ * m4/acl.m4 (AC_FUNC_ACL): Add POSIX ACL and Linux-specific acl tests.
+
+2006-01-07 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Add an AC_PROG_RANLIB dependency to
+ gl_EARLY.
+
+2006-01-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/strftime.c (tzname): Don't declare if it is already #defined.
+ Problem reported for Mingw by Mark Junker.
+
+2006-01-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * README: Gnulib normally doesn't generate a tarball.
+
+2006-01-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xtime.h (xtime_make, xtime_nonnegative_nsec, xtime_nsec): Use
+ long int, not int, for nanosecond counts, so that people who are
+ used to POSIX struct timespec won't be surprised. Reported by Jim
+ Meyering.
+
+2005-12-28 Bruno Haible <bruno@clisp.org>
+
+ * build-aux/config.rpath: Update from GNU gettext.
+
+2005-12-16 Jim Meyering <jim@meyering.net>
+
+ * modules/fprintftime: New module.
+ * MODULES.html.sh (Date and time <time.h>): Add fprintftime.
+
+2005-12-16 Jim Meyering <jim@meyering.net>
+
+ * m4/fprintftime.m4: New file.
+
+2005-12-16 Jim Meyering <jim@meyering.net>
+
+ * lib/fprintftime.c, lib/fprintftime.h: New files.
+
+2005-12-15 Simon Josefsson <jas@extundo.com>
+
+ * modules/socklen (configure.ac): Fix M4 macro name, to align with
+ new m4/socklen.m4.
+
+2005-12-10 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * m4/argp.m4: Define HAVE_DECL_PROGRAM_INVOCATION_NAME and
+ HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+
+2005-12-10 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-fmtstream.c (__argp_fmtstream_update): Fix coredump
+ * lib/argp-help.c (fill_in_uparams): Check if the constructed
+ struct uparams is valid. Fall back to the default values if it is
+ not.
+
+2005-12-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * modules/argp (Files): Add argp-pin.c
+ (Depends-on): dirname
+ (lib_SOURCES): Add argp-pin.c
+
+2005-12-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * m4/argp.m4: Check if program_invocation_name and
+ program_invocation_short_name are declared and define appropriate
+ macros if they are not.
+
+2005-12-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-help.c (__argp_base_name): New function
+ (__argp_short_program_name): Rewrite using __argp_base_name
+ * lib/argp-namefrob.h: Define program_invocation_name and
+ program_invocation_short_name if requested
+ (__argp_base_name): Add prototype
+ * lib/argp-parse.c (argp_def): Use gettext wrappers
+ (argp_default_parser): Use __argp_base_name
+ * lib/argp-pin.c: New file. Defines program_invocation_name and
+ program_invocation_short_name on systems that lack them.
+
+2005-12-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stat-time.m4 (gl_STAT_TIME): Add check for
+ TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC, to fix IRIX 5.3
+ porting problem reported by Georg Schwarz in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2005-12/msg00083.html>.
+
+2005-12-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stat-time.h (STATE_TIMESPEC, STAT_TIMESPEC_NS): Add check for
+ TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC, to fix IRIX 5.3
+ porting problem reported by Georg Schwarz in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2005-12/msg00083.html>.
+
+2005-12-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/csharpcomp.sh.in (options_csc): For -l option, add a .dll suffix.
+ * lib/csharpcomp.c (compile_csharp_using_sscli): Likewise.
+ Reported by Mark Junker <mjscod@gmx.de>.
+
+2005-12-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/socklen.m4 (gl_TYPE_SOCKLEN_T): Renamed from gl_SOCKLEN_T.
+ Use implementation from Albert Chin, with some
+ comments/corrections by Stepan Kasal and myself.
+
+2005-12-02 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Accept GPLed build tool modules when
+ --lgpl is given.
+ * modules/csharpcomp-script: New file.
+ * modules/csharpcomp: Depend on it.
+ * modules/javacomp-script: New file.
+ * modules/javacomp: Depend on it.
+ Suggested by Simon Josefsson.
+
+2005-12-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_REGEX): Check whether off_t can be used in a switch
+ statement, to work around an HP-UX 10.20 compiler bug reported by
+ Peter O'Gorman.
+
+2005-11-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/savedir (Depends-on): Add openat.
+
+2005-11-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stdint_.h (intmax_t) [defined intmax_t]: Do not declare.
+ (uintmax_t) [defined uintmax_t]: Do not declare.
+ (SIZE_MAX) [defined SIZE_MAX]: Do not define.
+ This works around a problem if intmax_t.m4 and/or uintmax_t.m4
+ and/or size_max.m4 are also used. Problem reported by Mark D. Baushke.
+ (SIZE_MAX): Define to ((size_t) -1), not (~(size_t)0), for the
+ sake of portability to weird hosts that C allows (though we don't
+ know of any practical examples).
+
+ * lib/savedir.h (fdsavedir): New decl.
+ * lib/savedir.c (fdsavedir, savedirstream): New functions; the latter
+ contains most of the former guts of savedir.
+ (savedir): Use savedirstream.
+ Include "openat.h".
+
+2005-11-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/obstack (Files): Add m4/ulonglong.m4.
+ Problem reported by Davide Angelocola.
+
+2005-11-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xstrtod.c: Don't bother with #pragma STDC FENV_ACCESS ON, as
+ coreutils no longer futzes with rounding modes.
+
+2005-11-14 Jim Meyering <jim@meyering.net>
+
+ * lib/mkstemp-safer.c: Include <config.h>, required for possible
+ replacement of mkstemp.
+
+2005-11-10 Simon Josefsson <jas@extundo.com>
+
+ * lib/readline.c: Remove EOL.
+
+2005-11-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/gethrxtime (Depends-on): Add gettime.
+
+2005-11-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/gethrxtime.m4 (gl_PREREQ_GETHRXTIME): Don't require AC_HEADER_TIME
+ or gettimeofday; no longer needed.
+
+2005-11-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/gethrxtime.c: Include "timespec.h" rather than the sys/time /
+ time business.
+ (gethrxtime) [! (HAVE_NANOUPTIME
+ || (defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME)
+ || HAVE_MICROUPTIME)]: Fall back on gettime rather than rolling
+ our own approximation.
+
+2005-11-08 Eric Blake <ebb9@byu.net>
+
+ * lib/inet_ntop.h: Use #if !, not #ifndef, for AC_CHECK_DECLS.
+
+2005-11-08 Eric Blake <ebb9@byu.net>
+
+ * lib/getaddrinfo.h: Use #if !, not #ifndef, for AC_CHECK_DECLS.
+
+2005-11-04 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Implement --update mode.
+
+2005-10-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix porting problem reported by Theodoros V. Kalamatianos.
+ * lib/utimens.c (futimens) [HAVE_WORKING_UTIMES && HAVE_FUTIMES]:
+ Don't assume that futimes failing means we must fail.
+
+2005-10-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/chdir-long.m4 (gl_FUNC_CHDIR_LONG): Revamp wording and local
+ variables to suggest the intended function of the PATH_MAX check.
+
+2005-10-30 Kean Johnston <jkj@sco.com>
+
+ Trivial changes to support SCO systems.
+ * m4/chdir-long.m4 (gl_FUNC_CHDIR_LONG): Check for MAXPATHLEN as well
+ as PATH_MAX.
+ * m4/fpending.m4 (gl_FUNC_FPENDING): Correct check for SCO systems,
+ where __ptr is null when no I/O is pending.
+
+2005-10-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getcwd.c (__getcwd): Don't assume that system calls after readdir
+ leave errno alone. Problem reported by Dmitry V. Levin.
+
+2005-10-28 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-gc-md4.c, tests/test-gc-md5.c, tests/test-gc-sha1.c:
+ Test more.
+
+ * tests/test-gc-md2.c, tests/test-md2.c: New files.
+
+ * modules/md2, modules/md2-tests: New files.
+
+2005-10-28 Simon Josefsson <jas@extundo.com>
+
+ * m4/inet_ntop.m4: More tests.
+
+ * m4/gc-md2.m4, md2.m4: New file.
+
+2005-10-28 Simon Josefsson <jas@extundo.com>
+
+ * lib/inet_ntop.h, inet_ntop.c: Make it work under mingw32: Add
+ "restrict" keywords, as per POSIX. Protect the function
+ declaration around HAVE_DECL_INET_NTOP rather than HAVE_INET_NTOP.
+ Don't use K&R prototypes. Check the sprintf return values.
+ Re-define EAFNOSUPPORT if not present. Indent.
+
+ * lib/md5.h, md5.c: Simplify buffer handling visavi alignment,
+ suggested by Bruno Haible <bruno@clisp.org>.
+
+ * lib/gc-gnulib.c, gc-libgcrypt.c: Check calloc return value.
+
+ * lib/gc.h: Add MD2 and RMD160 length defines. Add prototypes.
+
+ * lib/gc-libgcrypt.c: Add MD2 (which is not available through
+ libgcrypt).
+
+ * lib/gc-gnulib.c: Add MD2. Implement gc_hash_* API.
+
+ * lib/md2.h, lib/md2.c: New files.
+
+2005-10-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/savedir.c (savedir): Don't assume that xrealloc etc. leave
+ errno alone. Problem reported by Frederic Jolliton.
+
+2005-10-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/verify (License): Change from GPL to LGPL. This is a
+ tiny module and there are apparently near-equivalents that are
+ under the BSD license.
+
+2005-10-24 Simon Josefsson <jas@extundo.com>
+
+ * modules/sha1: Relicense to LGPL.
+
+2005-10-24 Simon Josefsson <jas@extundo.com>
+
+ * lib/md4.h: Shrink buffer size, now that we changed the type.
+
+2005-10-23 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool (func_import): Fix --tests-base.
+
+2005-10-22 Simon Josefsson <jas@extundo.com>
+
+ * modules/arcfour (Depends-on): Need stdint.
+
+2005-10-22 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc.m4: Don't be fooled by --disable-*random-device parameters,
+ suggested by Bruno Haible <bruno@clisp.org>. Fix error messages.
+
+2005-10-22 Simon Josefsson <jas@extundo.com>
+
+ * lib/md4.h, md4.c: Simplify buffer handling visavi alignment,
+ suggested by Bruno Haible <bruno@clisp.org>.
+
+2005-10-22 Simon Josefsson <jas@extundo.com>
+
+ * lib/crc.h: Include stddef.h, for size_t.
+
+2005-10-22 Simon Josefsson <jas@extundo.com>
+
+ * lib/arcfour.h, arcfour.c: Use fixed size indices in the
+ arcfour_context struct (simplify test vector testing in GNU
+ Shishi).
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * modules/des, modules/des-tests: New files.
+
+ * modules/gc-des, modules/gc-des-tests: New files.
+
+ * tests/test-des.c, tests/test-gc-des.c: New file.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * modules/arctwo, modules/arctwo-tests: New files.
+
+ * tests/test-arctwo.c: New file.
+
+ * modules/gc-arctwo, modules/gc-arctwo-tests: New files.
+
+ * tests/test-gc-arctwo.c: New file.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc.m4: Don't use libgcrypt if gcrypt.h isn't found, suggested by
+ Bruno Haible <bruno@clisp.org>.
+
+ * m4/gc-des.m4: New file.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * m4/arctwo.m4: New file.
+
+ * m4/gc-arctwo.m4: New file.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * lib/rijndael-api-fst.c: Fix bugs in CBC mode for more than one
+ block.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * lib/hmac-md5.c (hmac_md5): Add comments, suggested by Bruno Haible
+ <bruno@clisp.org>.
+
+ * lib/hmac-sha1.c (hmac_sha1): Likewise.
+
+ * lib/crc.c (crc32_update): Actually use crc parameter, suggested by
+ Bruno Haible <bruno@clisp.org>.
+
+ * lib/crc.h: Include stdint.h directly, suggested by Bruno Haible
+ <bruno@clisp.org>.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-libgcrypt.c (gc_cipher_open): Handle ECB.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-gnulib.c: Support ARCTWO in CBC mode.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * lib/des.h, lib/des.c: New files.
+
+ * lib/gc-gnulib.c: Support DES.c
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * lib/arctwo.h, lib/arctwo.c: New files.
+
+ * lib/gc-gnulib.c: Support ARCTWO.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * lib/arctwo.h (arctwo_setkey): Protect variable in CPP macro,
+ suggested by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+
+2005-10-21 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool (func_import, func_create_testdir): Define automake
+ conditional GL_COND_LIBTOOL if libtool is used (to be used by modules
+ Makefile.am snippet),
+ suggested by Bruno Haible <bruno@clisp.org>.
+
+ * modules/gc (Makefile.am): Use it.
+
+2005-10-21 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir): Add quoting to last
+ patch.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-gc-rijndael.c: New file.
+
+ * modules/gc-rijndael, modules/gc-rijndael-test: New files.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-gc-md4.c, tests/test-gc-md5.c: Test gc_hash_buffer
+ interface too.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-gc-arcfour.c: New file.
+
+ * modules/gc-arcfour, modules/gc-arcfour-tests: New files.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-md4, modules/gc-md4-tests: New file.
+
+ * tests/test-gc-md4.c: New file.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc-md4.m4: New file.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc-hmac-md5.m4, gc-hmac-sha1.m4, gc-md4.m4,
+ gc-md5.m4, gc-sha1.m4: Fix typo, suggested by Stepan Kasal
+ <kasal@ucw.cz>.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc-arcfour.m4: New file.
+
+ * m4/gc-rijndael.m4: New file.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc.h, gc-gnulib.c, gc-libgcrypt.c: Support MD4.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-gnulib.c: Support ARCFOUR.
+
+2005-10-19 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-gnulib.c: Implement gc_cipher_* API, currently only with AES
+ support.
+
+ * lib/gc.h: Add ECB enum type.
+
+ * lib/hmac-md5.c, hmac-sha1.c: Include memxor.h.
+
+2005-10-18 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-md5.c: New file.
+
+ * modules/md5-tests: New file.
+
+2005-10-18 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-md4.c: New file.
+
+ * modules/md4, modules/md4-tests: New files.
+
+2005-10-18 Simon Josefsson <jas@extundo.com>
+
+ * m4/md4.m4: New file.
+
+2005-10-18 Simon Josefsson <jas@extundo.com>
+
+ * lib/md4.h, lib/md4.c: New files, based on md5.?.
+
+2005-10-17 Stepan Kasal <kasal@ucw.cz>
+
+ * gnulib-tool (func_create_testdir): Omit the second check whether
+ BUILT_SOURCES in nonempty.
+
+2005-10-17 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-rijndael.c: New file.
+
+2005-10-17 Simon Josefsson <jas@extundo.com>
+
+ * modules/sha1: Depend on stdint instead of md5.
+
+ * modules/md5: Depend on stdint, remove uint32_t.
+
+2005-10-17 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-sha1-tests: New file.
+
+ * tests/test-gc-sha1.c: New file.
+
+2005-10-17 Simon Josefsson <jas@extundo.com>
+
+ * m4/md5.m4: Remove call to uint32_t.m4.
+
+2005-10-17 Simon Josefsson <jas@extundo.com>
+
+ * lib/sha1.c: Use uint32_t instead of md5_uint32.t
+
+ * lib/sha1.h: Use stdint.h and uint32_t instead of md5_uint32 from
+ md5.h.
+
+ * lib/md5.c: Use uin32_t. Fix non-gcc UNALIGNED_P macro.
+
+ * lib/md5.h: Use stdint.h and uint32_t. Doc fix.
+
+2005-10-17 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc.h, gc-libgcrypt.c: Add more hash types/functions.
+
+2005-10-17 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc.h, gc-libgcrypt.c: Add ciphers.
+
+2005-10-17 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-libgcrypt.c (gc_hmac_sha1): Fix assert.
+
+ * lib/gc.h (gc_nonce, gc_pseudo_random, gc_random): Add prototypes.
+
+2005-10-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdbool.m4 (AC_HEADER_STDBOOL): Change the return statement so
+ that it can also be used in a test.
+
+2005-10-16 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_tests_Makefile_am): Also define
+ TESTS_ENVIRONMENT, so that individual tests can augment it.
+
+ * gnulib-tool (func_create_testdir): Use an intermediate target for
+ building $(BUILT_SOURCES). Needed because BUILT_SOURCES can contain
+ macros, like $(ALLOCA_H), which cannot be passed through the command
+ line.
+
+2005-10-15 Simon Josefsson <jas@extundo.com>
+
+ * modules/rijndael-tests: New file.
+
+ * modules/rijndael: New file.
+
+2005-10-15 Simon Josefsson <jas@extundo.com>
+
+ * m4/rijndael.m4: New file.
+
+2005-10-15 Simon Josefsson <jas@extundo.com>
+
+ * lib/rijndael-api-fst.h, lib/rijndael-api-fst.c: New files.
+
+ * lib/rijndael-alg-fst.h, lib/rijndael-alg-fst.c: New files.
+
+2005-10-14 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-arcfour.c: New file.
+
+ * modules/arcfour, modules/arcfour-tests: New files.
+
+2005-10-14 Simon Josefsson <jas@extundo.com>
+
+ * m4/arcfour.m4: New file.
+
+2005-10-14 Simon Josefsson <jas@extundo.com>
+
+ * lib/arcfour.h, lib/arcfour.c: New files.
+
+2005-10-14 Roland McGrath <roland@redhat.com>
+
+ Import from libc. [BZ #1331]
+ * lib/obstack.h [!__STDC__] (obstack_int_grow_fast): Fix misnamed
+ macro argument.
+ Reported by Matej Vela <vela@debian.org>.
+
+2005-10-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/obstack.c [defined _LIBC && defined USE_IN_LIBIO]: Don't
+ include <wchar.h>; no longer needed.
+
+2005-10-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add glibc bug 321 for obstack.c, obstack.h.
+
+2005-10-14 Jakub Jelinek <jakub@redhat.com>
+ and Ulrich Drepper <drepper@redhat.com>
+
+ Import from libc.
+ * lib/obstack.c (print_and_abort) [defined _LIBC]: Use __fxprintf
+ instead of inline stream orientation test and two separate
+ function calls. Pay no attention to USE_IN_LIBIO.
+
+2005-10-13 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-hmac-md5-tests: New file.
+
+ * tests/test-gc-hmac-sha1.c: New file.
+
+ * tests/test-gc.c (main): Remove MD5 and HMAC-MD5 tests.
+
+ * modules/gc-hmac-md5-tests: New file.
+
+ * tests/test-gc-md5.c: New file.
+
+ * modules/gc-md5-tests: New file.
+
+2005-10-13 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-pbkdf2-sha1.c (gc_pbkdf2_sha1): Optimize CEIL computation.
+ Move memory allocation outside of loop.
+
+2005-10-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mkdir-p.c (make_dir_parents): Don't report an error if an
+ intermediate directory is in a read-only file system. Problem
+ reported by Eric Blake.
+
+2005-10-13 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * modules/human (Depends-on): Depend on xstrtoumax, not xstrtol.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-hmac-sha1.c: New file.
+
+ * modules/hmac-sha1-tests: New file.
+
+ * modules/hmac-sha1: New file.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-sha1: New file.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-pbkdf2-sha1, modules/gc-pbkdf2-sha1-tests: New files.
+
+ * tests/test-gc-pbkdf2-sha1.c: New file.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * modules/gc-md5, modules/gc-hmac-md5: New files.
+
+ * modules/gc (Files): Remove md5, memxor and hmac files.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc-pbkdf2-sha1.m4: New file.
+
+ * m4/gc-hmac-sha1.m4: New file.
+
+ * m4/gc-sha1: New file.
+
+ * m4/hmac-sha1.m4: New file.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * m4/gc-md5.m4, m4/gc-hmac-md5.m4: New files.
+
+ * m4/gc.m4: Don't call gl_MD5, gl_MEMXOR or gl_HMAC_MD5.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc.h, gc-gnulib.c, gc-libgcrypt.c: Use Gc_rc for return types,
+ suggested by Bruno Haible <bruno@clisp.org>.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc.h, gc-gnulib.c, gc-libgcrypt.c: Support SHA-1.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-pbkdf2-sha1.c: New file.
+
+ * lib/gc.h: Add gc_pbkdf2_sha1 prototype.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-libgcrypt.c (gc_hmac_sha1): New function.
+
+ * lib/gc-gnulib.c (gc_hmac_sha1): New function.
+
+2005-10-12 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc-gnulib.c: Condition MD5 and HMAC-MD5 use on GC_USE_MD5 and
+ GC_USE_HMAC_MD5, respectively.
+
+ * lib/gc-libgcrypt.c (gc_md5): Fix assert call.
+ (gc_md5): Fix typo.
+
+ * lib/gc.h (gc_hash_buffer): Use gc_hash in prototype.
+
+ * lib/gc-libgcrypt.c (gc_hash_buffer): Ditto.
+
+ * lib/gc-gnulib.c (gc_hash_buffer): Ditto.
+
+2005-10-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdbool.m4 (gl_STDBOOL_H): Define as an alias of AM_STDBOOL_H.
+ Reported by Stepan Kasal <kasal@ucw.cz>.
+
+2005-10-11 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-crc.c: New file.
+
+ * modules/crc, modules/crc-tests: New files.
+
+2005-10-11 Simon Josefsson <jas@extundo.com>
+
+ * m4/crc.m4: New file.
+
+2005-10-11 Simon Josefsson <jas@extundo.com>
+
+ * lib/gc.h: Add gc_hash and gc_hash_buffer.
+
+ * lib/gc-gnulib.c (gc_hash_buffer): Add. Reorder #include's.
+
+ * lib/gc-libgcrypt.c (gc_hash_buffer): Add.
+
+2005-10-11 Simon Josefsson <jas@extundo.com>
+
+ * lib/crc.h, lib/crc.c: New files.
+
+ * lib/gc.h (gc_hash_buffer): Add doc.
+
+2005-10-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/c-strcasestr: New file.
+ * MODULES.html.sh (String handling <string.h>): Add c-strcasestr.
+
+2005-10-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/c-strcase: New file.
+ * MODULES.html.sh (String handling <string.h>): Add c-strcase.
+
+2005-10-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/strcasecmp.c: Include limits.h.
+ (strcasecmp): Avoid integer overflow on exotic platforms.
+ * lib/strncasecmp.c: Include limits.h.
+ (strncasecmp): Avoid integer overflow on exotic platforms.
+ Reported by Paul Eggert.
+
+2005-10-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strcasestr.h: New file, from GNU gettext.
+ * lib/c-strcasestr.c: New file, from GNU gettext.
+
+2005-10-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-strcase.h: New file, from GNU gettext.
+ * lib/c-strcasecmp.c: New file, from GNU gettext.
+ * lib/c-strncasecmp.c: New file, from GNU gettext.
+
+2005-10-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/mempcpy (License): GPL -> LGPL.
+ * modules/strchrnul (License): Likewise.
+ * modules/sysexits (License): Likewise.
+
+2005-10-08 Simon Josefsson <jas@extundo.com>
+
+ * config/srclist.txt: Bug 1423 is closed, but 1439 remains.
+
+2005-10-07 Simon Josefsson <jas@extundo.com>
+
+ * m4/memxor.m4: Remove gl_C_RESTRICT call.
+
+2005-10-06 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-hmac-md5.c: New file.
+
+ * modules/hmac-md5-tests: New file.
+
+ * modules/hmac-md5: New file.
+
+2005-10-06 Simon Josefsson <jas@extundo.com>
+
+ * m4/hmac-md5.m4: New file.
+
+ * m4/memxor.m4: Require gl_C_RESTRICT.
+
+2005-10-06 Simon Josefsson <jas@extundo.com>
+
+ * lib/memxor.c (memxor): Avoid casts and warnings.
+
+2005-10-06 Simon Josefsson <jas@extundo.com>
+
+ * lib/hmac-md5.c: New file.
+
+ * lib/hmac.h: New file.
+
+2005-10-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stdbool.m4 (AC_HEADER_STDBOOL): Check that bool
+ promotes to int, not unsigned int, to catch the AIX 5.3
+ compiler bug.
+
+2005-10-05 Simon Josefsson <jas@extundo.com>
+
+ * modules/memxor: New file.
+
+ * modules/iconv (Files): Move config.rpath to havelib, it is used
+ there.
+
+ * modules/havelib (Files): Add config.rpath.
+
+2005-10-05 Simon Josefsson <jas@extundo.com>
+
+ * m4/memxor.m4: New file.
+
+2005-10-05 Simon Josefsson <jas@extundo.com>
+
+ * lib/memxor.c (memxor): Fix compiler error.
+
+ * lib/md5.h (MD5_DIGEST_SIZE, MD5_BLOCK_SIZE): Add, see also
+ <http://sourceware.org/bugzilla/show_bug.cgi?id=1423>.
+
+ * lib/memxor.h, lib/memxor.c: New files.
+
+ * lib/getaddrinfo.h: Don't protect sys/types.h with HAVE_SYS_TYPES_H,
+ we assume all systems have it, suggested by Jim Meyering
+ <jim@meyering.net>. Remove HAVE_SYS_SOCKET_H test too, to see if
+ any systems lack sys/socket.h; mingw32 is known to lack it, but we
+ don't support it yet anyway. Also remove HAVE_NETDB_H test, for
+ same reasons.
+
+2005-10-05 Simon Josefsson <jas@extundo.com>
+
+ * config/srclist.txt: Add glibc bug 1423 for md5.h.
+
+2005-10-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Don't check for
+ sys/socket.h, netdb.h, sys/types.h; the checks areno longer
+ needed, since the source code now assumes these .h files.
+
+2005-10-05 Derek Price <derek@ximbiot.com>
+
+ * lib/getdelim.c (SIZE_MAX): New macro, if not already defined.
+
+2005-10-05 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdint (License): Change to LGPL.
+
+2005-10-04 Simon Josefsson <jas@extundo.com>
+
+ * lib/getaddrinfo.h: Move sys/types.h include first, reported by "Mark
+ D. Baushke" <mdb@gnu.org>.
+
+2005-10-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/verify.h (verify_true): Provide alternative definition for C++.
+
+2005-10-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdelim.c: Include getdelim.h first. Include <limits.h>.
+ (SSIZE_MAX): New macro, if not already defined.
+ (getdelim): Fix buffer overrun on 64-bit hosts with lines longer
+ than 2 GiB.
+
+2005-10-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * m4/openat.m4 (gl_FUNC_OPENAT): Check for fdopendir.
+ * m4/ullong_max.m4 (gl_ULLONG_MAX): Simplify so that it merely
+ defines ULONG_MAX_LT_ULLONG_MAX. Thomas M.Ott reports that
+ ULLONG_MAX doesn't work with 2.7.2.1.
+
+2005-10-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/xreadlink (Makefile.am): Remove lib_SOURCES.
+ From Ben Pfaff.
+
+ * modules/exclude (Depends-on): Depend on verify.
+ * modules/strtoimax (Depends-on): Likewise.
+ * modules/utimecmp (Depends-on): Likewise.
+
+2005-10-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/exclude.c: Include verify.h.
+ (verify): Remove. All callers changed to use verify.h's version.
+ * lib/strtoimax.c: Likewise.
+ * lib/utimecmp.c: Likewis.e
+
+ Sync from coreutils.
+ * lib/.cppi-disable: Add getaddrinfo.h, getdelim.h, getline.h,
+ getpass.c, mbchar.h, mbuiter.h, strcase.h, strnlen.h, strnlen1.h.
+ * lib/.cvsignore: Add fts.h, search.h, t-fpending.
+ * lib/settime.c (settime): Fix { typo in previous patch. Also, don't
+ bother returning ENOSYS if settimeofday or stime fails; just let
+ them return whatever errno they want to return.
+ * lib/utimens.c: Include unistd.h, for dup2.
+ (futimens): Fix typo: HAVE_FUTIMESAT was misspelled in an #if.
+ (futimens) [! HAVE_FUTIMESAT]: If !file, set errno before returning -1.
+
+2005-10-02 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * m4/utimes.m4 (gl_FUNC_UTIMES): Detect the version of utimes
+ from glibc-2.2.5 that fails for read-only files.
+
+2005-10-02 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * lib/fts-cycle.c [HAVE_CONFIG_H]: Include <config.h>.
+ * lib/openat-die.c: Use `#ifdef HAVE_CONFIG_H', not
+ `#if HAVE_CONFIG_H'.
+ * lib/openat.c (fdopendir): Do not define if HAVE_FDOPENDIR.
+ Remove AT_FDCWD test.
+ Do not consume the fd unless successful.
+ * lib/openat.h (fdopendir): Do not define if HAVE_FDOPENDIR.
+ * lib/settime.c (settime): Move the HAVE_STIME block `up' into an #elif
+ block, so that we don't even try to compile it if settimeofday is
+ available. This works around a compilation failure on OSF1 V5.1,
+ due to stime requiring a `long int*' while tv_sec is `int'.
+
+2005-10-02 Alfred M. Szmidt <ams@gnu.org>
+
+ Sync from coreutils.
+ * m4/chdir-long.m4 (gl_FUNC_CHDIR_LONG): Compare $gl_have_path...
+ against `yes', rather than just testing for nonempty.
+
+2005-10-01 Simon Josefsson <jas@extundo.com>
+
+ * m4/getaddrinfo.m4: Include sys/types.h for sys/socket.h, on FreeBSD
+ and Darwin.
+
+ * m4/getaddrinfo.m4: Use AC_GNU_SOURCE, GNU only declare getaddrinfo
+ as an (POSIX) extension. Check for sys/types.h, sys/socket.h, and
+ netdb.h too, needed by getaddrinfo.h. Check if getaddrinfo,
+ freeaddrinfo and gai_strerror are declared by the POSIX headers.
+ Check if struct addrinfo is declared.
+
+2005-10-01 Simon Josefsson <jas@extundo.com>
+
+ * lib/getaddrinfo.h: Protect #include's of sys/socket.h and netdb.h.
+ Only define struct addrinfo if !HAVE_STRUCT_ADDRINFO. Protect
+ AI_* and EAI_* definitions. Protect function declarations.
+
+2005-10-01 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Look for getservbyname in these
+ libraries [inet nsl socket xnet]. Nelson Beebe reported that with
+ native cc on Solaris 7, getaddrinfo.c requires -lsocket.
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Check for gethostbyname
+ in the inet and nsl libraries. Required on Solaris 5.7.
+
+2005-10-01 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Check for gethostbyname
+ in the inet and nsl libraries. Required on Solaris 5.7.
+
+2005-10-01 Eric Blake <ebb9@byu.net> (tiny change)
+
+ * lib/getdelim.c (getdelim): Remove unused variables.
+
+2005-09-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xtime.h (XTIME_PRECISION): Now of type int, not long long int,
+ so that the code works even with ancient cpp. Portability problem
+ with GCC 2.7.2.1 reported by Thomas M.Ott.
+
+2005-09-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/regex (Depends-on): Add strcase.
+
+ * modules/gethostname (Licence): Change from GPL to LGPL, since
+ gethostname.c is a trivial implementation of a standard library
+ function.
+ * modules/poll (License): Change from GPL to LGPL, since it's
+ derived from LGPL code.
+
+2005-09-27 Jim Meyering <jim@meyering.net>
+
+ * lib/getcwd.c: Change #ifdef<TAB>HAVE_CONFIG_H to #ifdef
+ HAVE_CONFIG_H.
+
+ * lib/intprops.h (signed_type_or_expr__): Define.
+ (INT_STRLEN_BOUND) [__GNUC__]: Use a slightly tighter bound
+ for unsigned types.
+
+2005-09-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/verify.h (verify_expr): Remove, replacing with:
+ (verify_true): New macro that returns true instead of void.
+ (verify_type__): Remove.
+ (verify): Use verify_true rather than verify_type__.
+
+2005-09-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbchar (Include): Mention that HAVE_WCHAR_H && HAVE_WCTYPE_H
+ is necessary.
+ (lib_SOURCES): Remove mbchar.c.
+ * modules/mbfile (Include): Mention that HAVE_MBRTOWC is necessary.
+ (Files): Add m4/mbrtowc.m4.
+ * modules/mbiter: Likewise.
+ * modules/mbuiter: Likewise.
+
+2005-09-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbchar.m4 (gl_MBCHAR): Check for wchar.h and wctype.h. Don't
+ compile mbchar.c if they are not both present.
+ * m4/mbfile.m4 (gl_MBFILE): Require gl_FUNC_MBRTOWC.
+ * m4/mbiter.m4 (gl_MBITER): Likewise.
+ * m4/strstr.m4 (gl_PREREQ_STRSTR): Use AC_REQUIRE.
+ * m4/strcasestr.m4 (gl_PREREQ_STRCASESTR): Likewise.
+ * m4/strcase.m4 (gl_PREREQ_STRCASECMP): Likewise.
+
+2005-09-25 Jim Meyering <jim@meyering.net>
+
+ * modules/inet_ntop (Depends-on): Add socklen, since inet_ntop.c
+ also uses socklen_t.
+
+2005-09-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/utimens.c (ENOSYS): Define if not already defined.
+ (futimens): Support having a null PATH if the file descriptor
+ is nonnegative.
+
+ * lib/regex_internal.h (__GNUC_PREREQ, always_inline, inline, pure):
+ Remove.
+ (__attribute): Define to empty unless GCC 3.1 or later.
+ This works around a core dump on OpenBSD 3.4, which has GCC
+ 2.95.3, which dumps core when given __attribute__(()). It also
+ simplifies other tests, since we really don't want to bother with
+ worrying about which ancient version of GCC supported what.
+ Original problem reported by Yoann Vandoorselaere, with part of
+ the fix suggested by Derek Price.
+
+2005-09-24 Jim Meyering <jim@meyering.net>
+
+ * lib/verify.h (verify_type__): Use `unsigned int' as the bitfield type
+ so we can once again use a positive bitfield width of 1 -- now we
+ don't have to explain why we were using a bitfield width of 2.
+
+2005-09-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_REGEX): If replacing, define regcomp to rpl_regcomp,
+ and similarly for the other external symbols. Problem reported
+ by James Gallager.
+
+ * m4/fnmatch.m4 (_AC_FUNC_FNMATCH_IF): Catch Sun Studio 10u1 on Linux
+ bug reported by Jim Meyering.
+
+ * m4/utimens.m4 (gl_UTIMENS): Check for futimesat.
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Undo previous change;
+ not needed, since socklen is a prerequisite module.
+
+2005-09-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
+ Problem reported by Eric Blake.
+ (getaddrinfo): Initialize se so that it's not garbage.
+ Redo internal storage allocation so that it doesn't make unportable
+ assumptions about alignment.
+ Fix a memory leak.
+
+ * lib/utimens.c (futimens): Use futimesat if available.
+ Prefer it to futimes since it doesn't have the futimes bug.
+
+ * lib/verify.h (GL_CONCAT0, GL_CONCAT): Remove.
+ (verify): Don't use the __LINE__ trick, as it doesn't work in general.
+ Instead, declare a function that returns a pointer to an array,
+ and use verify_type__ to declare the size of the array.
+ Problem and germ of a solution reported by Bruno Haible.
+ (verify_type__): Use 2, not 1, for bitfield size, to avoid
+ a warning with Irix 6.5 cc. Problem reported by Bruno Haible.
+
+2005-09-23 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ Correct build failure (socklen_t not defined) on at least
+ mips-sgi-irix6.5 and alphaev67-dec-osf5.1.
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Require gl_SOCKLEN_T.
+
+2005-09-23 Jim Meyering <jim@meyering.net>
+
+ * modules/getaddrinfo (Depends-on): Add socklen.
+
+2005-09-23 Bruno Haible <bruno@clisp.org>
+
+ * tests/test-verify.c: New file.
+
+2005-09-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+
+ * modules/argmatch (Depends-on): Add verify.
+ * modules/getloadavg (Depends-on): Depend on fcntl-safer, not
+ unistd-safer.
+ * modules/save-cwd (Depends-on): Likewise.
+
+ * modules/openat (Files): Add lib/openat-die.c.
+ (Depends-on): Remove error, exitfail.
+ Add dirname.
+
+ * modules/verify: New file.
+ * MODULES.html.sh (Diagnostics <assert.h>): New section,
+ with "verify" module.
+
+2005-09-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+
+ * m4/backupfile.m4, calloc.m4, chown.m4, cloexec.m4, dup2.m4:
+ * m4/fileblocks.m4, free.m4, ftruncate.m4, getcwd.m4, getpagesize.m4:
+ * m4/getugroups.m4, group-member.m4, idcache.m4, link-follow.m4:
+ * m4/mkstemp.m4, mktime.m4, mountlist.m4, nanosleep.m4, pathmax.m4:
+ * m4/physmem.m4, posixver.m4, putenv.m4, safe-read.m4, same.m4:
+ * m4/save-cwd.m4, stdio-safer.m4, unistd-safer.m4, unlinkdir.m4:
+ * m4/userspec.m4, xgetcwd.m4, xreadlink.m4:
+ Don't bother checking for string.h, stdlib.h, unistd.h.
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Don't require
+ AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK; that's now the lstat
+ module's job.
+ * m4/jm-macros.m4 (gl_MACROS): Likewise.
+ * m4/prereq.m4 (gl_PREREQ): Add gl_FUNC_LSTAT.
+
+ * m4/getdate.m4 (gl_C_COMPOUND_LITERALS): New macro.
+ (gl_GETDATE): Use it.
+
+ * m4/mkdir-p.m4 (gl_MKDIR_PARENTS): Don't bother checking for unistd.h.
+
+2005-09-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+
+ * lib/.cppi-disable: Add regcomp.c, regex_internal.c, regex_internal.h,
+ stat-time.h.
+ * lib/argmatch.h: Include verify.h
+ (ARGMATCH_VERIFY): Use verify rather than rolling our own.
+ (ARGMATCH_ASSERT): Remove; unused.
+ * lib/canonicalize.c: Assume STDC_HEADERS.
+ * lib/exclude.c: Include "strcase.h".
+ * lib/regex_internal.h [!defined _LIBC]: Likewise.
+ * lib/getusershell.c: Include stdio--.h rather than stdio.h
+ and stdio-safer.h.
+ (getusershell): Call fopen, not fopen_safer.
+ * lib/save-cwd.c: Include fcntl--.h rather than fcntl.h.
+ Do not include unistd-safer.h.
+ (save_cwd): Don't call fd_safer; no longer needed
+ now that we include fcntl--.h.
+
+ * lib/getdate.y (relative_time): New type.
+ (RELATIVE_TIME_0): New constant.
+ (parser_control): Use relative_time instead of doing it ourselves.
+ (%union): Add new relative_time rel member.
+ (tYEAR_UNIT, tMONTH_UNIT, tHOUR_UNIT, tMINUTE_UNIT, tSEC_UNIT):
+ Now typeless.
+ (relunit, relunit_snumber): Now of type rel.
+ (zone, rel, relunit, get_date): Adjust to above changes.
+
+ * lib/getloadavg.c: Include fcntl--.h rather than fcntl.h.
+ Do not include unistd-safer.h.
+ (getloadavg): Don't call fd_safer; no longer needed
+ now that we include fcntl--.h.
+
+ * lib/mkdir-p.c (ENOSYS): Define to EEXIST if not defined.
+ (make_dir_parents): Treat ENOSYS like EEXIST.
+
+ Improve quality of diagnostics on restore_cwd failure.
+ * lib/mkdir-p.h (make_dir): Remove. All uses replaced by mkdir.
+ (make_dir_parents): Last arg is now int * (for errno), not bool *.
+ * lib/mkdir-p.c (make_dir, make_dir_parents): Likewise.
+ Rewrite "mkdir -p" algorithm to avoid the need for "stat"
+ each time through the loop. Do not diagnose restore_cwd failure;
+ that is the caller's job (and perhaps the caller does not care).
+
+ * lib/mkdir-p.c (CLEANUP_CWD, CLEANUP): Remove.
+ (make_dir_parents): Revamp to avoid need for CLEANUP_CWD, CLEANUP.
+ If the file already exists but is not a directory, don't bother
+ to try to make its parents.
+ Close potential file descriptor leak if we can't chdir("/") (!).
+ Don't always return true if chdir($PWD) fails; return true only
+ if the requested action was done successfully (except for the
+ chdir($PWD)).
+ Don't log final directory unless we actually made it.
+ Refactor to avoid duplicate code to fix up permissions.
+ Don't attempt to fix up parent permissions if chdir($PWD) fails.
+
+ * lib/strftime.c (my_strftime): Rewrite the previous change slightly,
+ to make it a bit faster and (I hope) clearer.
+ * lib/strftime.c (my_strftime): Add support for %:z, %::z, %:::z.
+ Fix bug in formats like %2N.
+
+ * lib/verify.h: New file.
+
+2005-09-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Check for netinet/in.h.
+
+2005-09-22 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+
+ * m4/lstat.m4 (gl_FUNC_LSTAT):
+ Use AC_LIBSOURCES to require lstat.c and lstat.h.
+ Remove obsolete comment.
+ * m4/xreadlink.m4: Use AC_LIBSOURCES and AC_LIBOBJ.
+ * m4/xstrtod.m4: Likewise.
+
+ * m4/openat.m4 (gl_FUNC_OPENAT): Add openat-die.c.
+
+2005-09-22 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+
+ * lib/backupfile.c: Use ARGMATCH_VERIFY, just in case.
+
+ * lib/posixtm.c (posixtime) [lint]: Initialize *all* of tm0, not just
+ the .tm_year member, since otherwise gcc-4.0 would now warn about
+ tm_zone, tm_gmtoff, tm_isdst, tm_yday, tm_wday.
+
+ * lib/quotearg.c (quotearg_n_options): Change code to be suboptimal, in
+ order to avoid an unsuppressible warning from gcc on 64-bit systems.
+
+ * lib/getdate.y (get_date): Undo part of the 2005-04-04 change, so that
+ the command "date -d'2005-03-27 +1 day'" succeeds once again, even
+ when run in a time zone for which daylight savings time is in effect
+ for the starting date.
+
+ * lib/mkdir-p.c (make_dir_parents): Don't let a failed chdir($PWD)
+ stop us from restricting permissions of just-created absolute-named
+ directories.
+ * lib/mkdir-p.c (CLEANUP_CWD): Return *true*, not false when failing
+ to restore initial working directory.
+ * lib/mkdir-p.c (make_dir_parents): New parameter:
+ different_working_dir, to tell caller if/when we change the working
+ directory and are unable to return to the initial one.
+ * lib/mkdir-p.h (make_dir_parents): Update prototype.
+ * lib/mkdir-p.c (CLEANUP_CWD): Change one more `return 1' to
+ `return false'. This fixes a bug introduced on 2004-07-30.
+
+ * lib/openat.c (fdopendir): Be sure to close the supplied
+ file descriptor before returning. This makes our replacement
+ implementation a little closer to Solaris's, where fdopendir
+ ties the file descriptor to the returned DIR* pointer.
+ * lib/openat.c (unlinkat): New function.
+ * lib/openat.h (unlinkat): Add prototype.
+ * lib/openat-die.c (openat_save_fail): Rename from openat_save_die.
+ (openat_restore_fail): Rename from openat_restore_die.
+ * lib/openat.c, openat.h: Reflect s/_die/_fail/ renaming.
+
+ Provide an alternative to exiting immediately upon save_cwd or
+ restore_cwd failure. Now, an application can arrange e.g.,
+ to perform a longjump in that case.
+ * lib/openat.c: Include dirname.h.
+ Use IS_ABSOLUTE_FILE_NAME rather than testing for leading slash.
+ (rpl_openat, fdopendir, fstatat): Call openat_save_die
+ and openat_restore_die rather than calling error directly.
+ Don't include "error.h" or "exitfail.h"; they're no longer needed.
+
+ * lib/openat-die.c (openat_save_die, openat_restore_die): New file.
+ * lib/openat.h (openat_save_die, openat_restore_die): Declare and
+ define.
+
+ * lib/strftime.c [FPRINTFTIME] (fprintftime): Provide a new interface:
+ size_t fprintftime (FILE *fp, char const *fmt, struct tm const *tm,
+ int utc, int nanoseconds);
+ Background:
+ date should not have to allocate a megabyte of virtual memory to
+ handle a format argument like +%1048575T. When implemented with
+ strftime, it must allocate such a buffer, use strftime to fill it
+ in, print it, then free it.
+ With fprintftime, it simply prints everything and exits.
+ With no need for memory allocation, that's one fewer way to fail.
+ * lib/strftime.c (my_strftime): Parse the colons of %:::z *after* the
+ optional field width, not before, so we accept %9:z, not %:9z.
+ (my_strftime): Be sure to use L_('x') for literals.
+
+ * lib/backupfile.c, lib/canon-host.c, lib/canonicalize.c, lib/chown.c:
+ * lib/cloexec.c, lib/dup-safer.c, lib/dup2.c, lib/euidaccess.c:
+ * lib/fd-safer.c, lib/fileblocks.c, lib/fopen-safer.c, lib/fsusage.c:
+ * lib/ftruncate.c, lib/getcwd.c, lib/getcwd.h, lib/getloadavg.c:
+ * lib/getopt_.h, lib/getpagesize.h, lib/getugroups.c:
+ * lib/group-member.c, lib/human.h, lib/idcache.c, lib/mkdir-p.c:
+ * lib/mountlist.c, lib/nanosleep.c, lib/pathmax.h, lib/physmem.c:
+ * lib/posixver.c, lib/putenv.c, lib/raise.c, lib/safe-read.c:
+ * lib/same.c, lib/save-cwd.c, lib/setenv.c, lib/settime.c:
+ * lib/tempname.c, lib/unlinkdir.c, lib/unsetenv.c, lib/userspec.c:
+ * lib/xgethostname.c, lib/xreadlink.c:
+ Assume HAVE_UNISTD_H, i.e., include <unistd.h> unconditionally.
+
+ * lib/chown.c, lib/cloexec.c, lib/dup-safer.c, lib/dup2.c:
+ * lib/fsusage.c, lib/getcwd.c, lib/getloadavg.c, lib/mountlist.c:
+ * lib/openat.h, lib/save-cwd.c, lib/tempname.c:
+ Assume HAVE_FCNTL_H (i.e., include <fcntl.h> unconditionally,
+ and don't include <sys/file.h>).
+
+2005-09-22 Eric Blake <ebb9@byu.net> (tiny change)
+
+ Sync from coreutils.
+
+ * lib/getloadavg.c (getloadavg) [__CYGWIN__]: Port to cygwin.
+ [__linux__]: Allocate a big enough buffer for /proc/loadavg.
+ [!LDAV_DONE]: Avoid unused variable warning.
+
+2005-09-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/unicodeio.h (unicode_to_mb): New declaration.
+
+2005-09-20 Derek Price <derek@ximbiot.com>
+
+ * lib/getaddrinfo.c: Don't include <netdb.h> included from
+ getaddrinfo.h.
+
+2005-09-20 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Remove trailing slashes from the values specified for
+ --source-base, --m4-base, --tests-base, --aux-dir.
+ Suggested by Simon Josefsson <jas@extundo.com>.
+
+2005-09-20 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_all_modules, func_modules_transitive_closure,
+ func_modules_to_filelist, func_import, func_create_testdir): Make all
+ sorting results locale-independent, so that gnulib-cache.m4 doesn't
+ change when gnulib-tool is invoked in a different locale.
+
+2005-09-19 Simon Josefsson <jas@extundo.com>
+
+ * m4/socklen.m4: Fix typo.
+
+2005-09-19 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Use a consistent style for including <config.h>.
+ * lib/__fpending.c, lib/acl.c, lib/argmatch.c, lib/argp-help.c,
+ lib/argp-parse.c, lib/argp-pvh.c, lib/backupfile.c, lib/basename.c,
+ lib/c-stack.c, lib/calloc.c, lib/check-version.c, lib/cloexec.c,
+ lib/closeout.c, lib/copy-file.c, lib/creat-safer.c, lib/cycle-check.c,
+ lib/dirfd.c, lib/dirname.c, lib/dup-safer.c, lib/dup2.c,
+ lib/euidaccess.c, lib/exclude.c, lib/exitfail.c, lib/fatal-signal.c,
+ lib/fd-safer.c, lib/file-type.c, lib/fileblocks.c, lib/filemode.c,
+ lib/filenamecat.c, lib/findprog.c, lib/fnmatch.c, lib/fopen-safer.c,
+ lib/free.c, lib/fsusage.c, lib/ftruncate.c, lib/full-write.c,
+ lib/fwriteerror.c, lib/getaddrinfo.c, lib/getcwd.c, lib/getdelim.c,
+ lib/getline.c, lib/getlogin_r.c, lib/getndelim2.c, lib/getnline.c,
+ lib/getopt1.c, lib/getpass.c, lib/group-member.c, lib/hard-locale.c,
+ lib/hash-pjw.c, lib/hash.c, lib/human.c, lib/idcache.c,
+ lib/inet_ntop.c, lib/isdir.c, lib/long-options.c, lib/malloc.c,
+ lib/memcasecmp.c, lib/memcmp.c, lib/memcoll.c, lib/memcpy.c,
+ lib/memmove.c, lib/mkdir-p.c, lib/modechange.c, lib/mountlist.c,
+ lib/open-safer.c, lib/physmem.c, lib/pipe-safer.c, lib/pipe.c,
+ lib/poll.c, lib/posixver.c, lib/progname.c, lib/progreloc.c,
+ lib/putenv.c, lib/quote.c, lib/quotearg.c, lib/readline.c,
+ lib/readlink.c, lib/realloc.c, lib/regex.c, lib/rename.c, lib/rmdir.c,
+ lib/rpmatch.c, lib/safe-read.c, lib/same.c, lib/save-cwd.c,
+ lib/savedir.c, lib/sig2str.c, lib/strcspn.c, lib/strerror.c,
+ lib/stripslash.c, lib/strncasecmp.c, lib/strndup.c, lib/strnlen.c,
+ lib/strnlen1.c, lib/strsep.c, lib/strstr.c, lib/strtod.c,
+ lib/strtoimax.c, lib/strtol.c, lib/strverscmp.c, lib/tempname.c,
+ lib/time_r.c, lib/userspec.c, lib/utimecmp.c, lib/version-etc-fsf.c,
+ lib/version-etc.c, lib/wait-process.c, lib/xalloc-die.c, lib/xgetcwd.c,
+ lib/xmalloc.c, lib/xmemcoll.c, lib/xnanosleep.c, lib/xreadlink.c,
+ lib/xsetenv.c, lib/xstrndup.c, lib/xstrtoimax.c, lib/xstrtol.c,
+ lib/xstrtoumax.c, lib/yesno.c:
+ Standardize inclusion of config.h.
+ * lib/__fpending.h, lib/dirfd.h, lib/getdate.h, lib/human.h,
+ lib/inttostr.h: Removed inclusion of config.h from header files.
+ * lib/inttostr.c: Adjusted in-tree users.
+ * lib/timespec.h: Remove superfluous warning to include config.h.
+ * lib/atexit.c, lib/chdir-long.c, lib/chown.c, lib/fchown-stub.c,
+ lib/getgroups.c, lib/gettimeofday.c, lib/lchown.c, lib/lstat.c,
+ lib/mkdir.c, lib/mkstemp.c, lib/nanosleep.c, lib/openat.c, lib/raise.c,
+ lib/readtokens0.c, lib/readutmp.c, lib/unlinkdir.c: Guard inclusion of
+ config.h with HAVE_CONFIG_H.
+
+2005-09-19 Jim Meyering <jim@meyering.net>
+
+ * modules/pathmax (License): Change to LGPL.
+
+2005-09-19 Derek Price <derek@ximbiot.com>
+
+ * config/srclist.txt: glibc's glob.h is now in lib/glob-libc.h.
+
+2005-09-19 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (import): Provide default for --tests-base.
+
+2005-09-19 Bruno Haible <bruno@clisp.org>
+
+ * doc/quote.texi: New file, extracted from gnulib.texi.
+ * doc/ctime.texi: New file, extracted from gnulib.texi.
+ * doc/inet_ntoa.texi: New file, extracted from gnulib.texi.
+ * doc/gnulib-tool.texi: New file, extracted from gnulib.texi.
+ * doc/gnulib.texi: Include them.
+
+2005-09-18 Bruno Haible <bruno@clisp.org>
+
+ Portability fix.
+ * gnulib-tool (func_readlink): New function.
+ (func_ln_if_changed): Use it.
+
+2005-09-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Support --with-tests also with --import.
+ (func_emit_tests_Makefile_am): Use variables $m4base and $testsbase.
+ (func_import): Use variables $testsbase and $inctests. Emit a
+ gl_TESTS_BASE form into gnulib-cache.m4. Create $testsbase/Makefile.am.
+ Remind the user to add AC_CONFIG_FILES($testsdir/Makefile) and
+ SUBDIRS += $testsdir.
+ (func_create_testdir): Update.
+
+2005-09-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Revise --dry-run implementation. Use variable $doit
+ instead of $dry_run.
+ (func_cp_if_changed, func_mv_if_changed): Remove functions.
+ (func_ln_if_changed): Don't handle dry-run here.
+ (func_import): In dry-run mode, detect more precisely which actions
+ would be performed, and don't use "...ing" verbs.
+
+2005-09-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_tmpdir): New function, taken from GNU gettextize.
+ (func_import): Use join on two temporary files instead of three nested
+ loops, in order to determine which files are new or old.
+
+2005-09-18 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Comment out code that spits out the
+ new files with --dry-run.
+
+2005-09-18 Bruno Haible <bruno@clisp.org>
+
+ * doc/gnulib.texi (Invoking gnulib-tool): 50% rewritten.
+
+2005-09-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/stat-time.h: New file.
+ * lib/timespec.h (ST_TIME_CMP_NS, ST_TIME_CMP, ATIME_CMP, CTIME_CMP):
+ (MTIME_CMP, TIMESPEC_NS): Remove. Now done by stat-time.h,
+ in a different way.
+ (timespec_cmp): New function.
+ * lib/utimecmp.c: Include stat-time.h.
+ (SYSCALL_RESOLUTION): Depend on whether various struct stat
+ members exist, not on the obsolescent ST_MTIM_NSEC.
+ (utimecmp): Use the new stat-time functions rater than TIMESPEC_NS.
+
+2005-09-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Remove glibc bug 1033 and uncomment mktime.c.
+
+2005-09-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (File system functions): Add stat-time.
+ * modules/stat-time: New file.
+ * modules/timespec (Files): Remove m4/st_mtim.m4; this
+ is now done in a different way, by the stat-time module.
+ * modules/utimecmp (Depends-on): Add stat-time.
+
+2005-09-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/st_mtim.m4: Remove. Superseded by...
+ * m4/stat-time.m4: New file.
+ * m4/timespec.m4 (gl_TIMESPEC): Require AC_C_INLINE.
+ Do not invoke AC_STRUCT_ST_MTIM_NSEC; no longer needed.
+
+2005-09-15 Derek Price <derek@ximbiot.com>
+
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Don't define strstr here.
+
+2005-09-15 Derek Price <derek@ximbiot.com>
+
+ * lib/regex_internal.h: Blank `pure' for GNUC < 3.
+ * lib/regex_internal.c: Ditto, using this...
+ (__GNUC_PREREQ): ...new macro.
+ * lib/regcomp.c, regexec.c: Blank `always_inline' for GNUC < 3.1
+ using...
+ (__GNUC_PREREQ): ...this new macro.
+
+ * lib/strstr.h: Include string.h. Define strstr as a macro here.
+
+2005-09-15 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regcomp.c, regexec.c, regex_internal.c: Back out previous
+ changes, consolidating in...
+ * lib/regex_internal.h: ...this file.
+
+2005-09-13 Jim Meyering <jim@meyering.net>
+
+ * lib/canon-host.c: Filter through gnu indent and reword comments
+ slightly.
+ * lib/canon-host.h (ch_strerror_r): Tweak cpp indentation and spacing.
+
+2005-09-13 Derek Price <derek@ximbiot.com>
+
+ * lib/canon-host.c (canon_host_r): Set *cherror on memory allocation
+ failure.
+ Reported by Jim Meyering <jim@meyering.net>.
+
+2005-09-12 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> (tiny change)
+
+ * lib/base64.c: Typo.
+ (base64_encode): Put b64str in initialized data section.
+
+2005-09-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge glibc and coreutils changes into gnulib, plus a few
+ extra fixes.
+ * lib/md5.c: Use #error rather than a string.
+ (CYCLIC): New macro, from glibc source. Use it instead of rol.
+ * lib/md5.h (__GNUC_PREREQ, __THROW): Define if not defined already.
+ (__attribute__): Define to empty for non recent-GCC.
+ (__md5_buffer, __md5_finish_ctx, __md5_init_ctx, __md5_process_block):
+ (__md5_process_bytes, __md5_read_ctx, __md5_stream):
+ Renamed from their non-__ counterparts, with new macros replacing
+ them if not _LIBC. Add __THROW attribute.
+ (rol): Remove.
+ (struct md5_ctx): Align buffer if using GCC.
+ * lib/sha1.h (struct sha1_ctx): Likewise.
+ * lib/sha1.c (SWAP): Renamed from the NOTSWAP. All uses changed.
+ The old name was backwards.
+ (NOTSWAP): Remove; not used.
+ (rol): New macro, moved here from md5.h.
+ (sha1_process_block): Remove a FIXME that doesn't make sense.
+
+2005-09-12 Derek Price <derek@ximbiot.com>
+
+ Return usable errors from canon-host.
+ * lib/canon-host.h: New file.
+ * lib/canon-host.c (canon_host): Wrap...
+ (canon_host_r): ...this new function, which now relies exclusively on
+ getaddrinfo.
+ (ch_strerror): New function.
+ (last_cherror): New global.
+ * lib/getaddrinfo.c: Move include of getaddrinfo.h first to test
+ interface.
+ (getaddrinfo): Add AI_CANONNAME functionality. Don't do arithmetic on
+ void *.
+ (freeaddrinfo): Free ai->ai_canonname when set.
+
+2005-09-12 Derek Price <derek@ximbiot.com>
+
+ Make canon-host require getaddrinfo.
+ * m4/canon-host.m4 (gl_CANON_HOST): Remove most dependencies.
+ AC_LIBSOURCE canon-host.h. Call...
+ (gl_PREREQ_CANON_HOST): ...this new function, which requires
+ gl_GETADDRINFO.
+ * m4/getaddrinfo.m4 (gl_GETADDRINFO): Compile gai_strerror when needed.
+
+2005-09-12 Derek Price <derek@ximbiot.com>
+
+ * modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
+ LGPL.
+ * modules/getaddrinfo: Add link to opengroup spec. Depend on strdup.
+
+2005-09-12 Derek Price <derek@ximbiot.com>
+
+ * lib/gai_strerror.c: Include config.h when available. Include
+ getaddrinfo.h before other headers to test interface.
+ Reported by Larry Jones <lawrence.jones@ugs.com>.
+
+2005-09-12 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/glob (Files): Add glob-libc.h.
+
+2005-09-12 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/glob.m4 (gl_GLOB_SUBSTITUTE): AC_LIBSOURCES for glob.c,
+ glob_.h, glob-libc.h.
+ (gl_PREREQ_GLOB): Remove _SYS_CDEFS_H hack; no longer needed.
+
+2005-09-12 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/glob-libc.h: Renamed from glob_.h. The new version is
+ taken from libc's glob.h, except with '#ifdef __GLOB_GNULIB'
+ protecting things that should be done only in gnulib contexts.
+ * lib/glob_.h: New file, containing only the glob things needed for
+ gnulib.
+ (GLOB_PREFIX): Remove. All uses changed to look for __GLOB_GNULIB.
+ (__GLOB_CONCAT, __GLOB_XCONCAT, __GLOB_ID): Remove; no longer needed.
+ (glob, globfree, glob_pattern_p): Now defined simply in terms of
+ rpl_glob, rpl_globfree, rpl_glob_pattern_p.
+ (__GLOB_GNULIB): New macro, to keep the glob.h changes clearer
+ and to respect the namespace rules better.
+
+2005-09-08 Simon Josefsson <jas@extundo.com>
+
+ * modules/socklen: New file.
+
+2005-09-08 Simon Josefsson <jas@extundo.com>
+
+ * m4/socklen.m4: New file.
+
+2005-09-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/utimens (Files): Add m4/utimbuf.m4, since
+ m4/utimens.m4 requires gl_CHECK_TYPE_STRUCT_UTIMBUF.
+ Reported by Sergey Poznyakoff.
+
+2005-09-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
+ definitions, since that's the preferred style in glibc.
+ Fix a minor spacing issue, and update copyright notice to match
+ glibc's.
+
+2005-09-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Remove glibc bug 1061; it's been fixed.
+
+2005-09-06 Simon Josefsson <jas@extundo.com>
+
+ * lib/getpass.c (getpass): Fix typo, test for HAVE_TCSETATTR and not
+ TCSETATTR. Reported by Derek Price <derek@ximbiot.com>.
+
+2005-09-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex_internal.h (bitset_not): Add parens to avoid gcc -Wall
+ warning.
+
+2005-09-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add glibc bug 1302.
+
+2005-09-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ Change bitset word type from unsigned int to unsigned long int,
+ as this has better performance on typical 64-bit hosts.
+ Port bitset code to hosts with unusual word sizes.
+ * lib/regcomp.c (build_equiv_class, build_charclass, build_range_exp):
+ (build_collating_symbol):
+ Prefer bitset to re_bitset_ptr_t in prototypes, when the actual
+ argument is a bitset. This is merely a style issue, but it makes
+ it clearer that an entire array is expected.
+ (re_compile_fastmap_iter, init_dfa, init_word_char, optimize_subexps):
+ * lib/regcomp.c (lower_subexp, parse_bracket_exp, built_charclass_op):
+ Port to the case where bitset_word is not the same as unsigned int.
+ * lib/regex_internal.h (bitset_set, bitset_clear, bitset_contain):
+ (bitset_not, bitset_merge, bitset_set_all, bitset_mask):
+ Likewise.
+ * lib/regexec.c (check_dst_limits_calc_pos_1,
+ check_subexp_matching_top):
+ (build_trtable, group_nodes_into_DFAstates):
+ Likewise.
+ * lib/regcomp.c (re_compile_fastmap_iter, utf8_sb_map, optimize_utf8):
+ Don't assume that SBC_MAX is a multiple of BITSET_WORD_BITS.
+ * lib/regex_internal.h (bitset_set_all, bitset_not): Likewise.
+ * lib/regexec.c (group_nodes_into_DFAstates): Likewise.
+ * lib/regcomp.c (utf8_sb_map): Don't assume UINT_MAX == 0xffffffff.
+ * lib/regcomp.c (optimize_subexps, lower_subexp):
+ Work even if bitset_word has holes in its bitwise representation.
+ * lib/regex_internal.h (BITSET_WORD_BITS): Likewise.
+ * lib/regexec.c (check_dst_limits_calc_pos_1,
+ check_subexp_matching_top):
+ Likewise.
+ * lib/regex_internal.c (re_string_reconstruct):
+ Don't assume UCHAR_MAX == 255.
+ * lib/regex_internal.h (bitset_set_all): Likewise.
+ * lib/regex_internal.h (BITSET_WORD_BITS): Renamed from UINT_BITS.
+ All uses changed.
+ (BITSET_WORDS): Renamed from BITSET_UINTS. All uses changed.
+ (bitset_word): New type, replacing 'unsigned int' for bitset uses.
+ All uses changed.
+ (BITSET_WORD_MAX): New macro.
+ (bitset_set, bitset_clear, bitset_contain, bitset_empty):
+ (bitset_set_all, bitset_copy): Now inline functions, not macros.
+ (bitset_empty, bitset_copy):
+ Prefer sizeof (bitset) to multiplying it out ourselves.
+ (bitset_not_merge): Remove; unused.
+ (bitset_contain): Return bool, not unsigned int with one bit on.
+ All callers changed.
+ * lib/regexec.c (build_trtable): Don't assume bitset has no stricter
+ alignment than re_node_set; do this by defining a new internal
+ type struct dests_alloc and using it to allocate memory.
+
+2005-09-05 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Fix comparison in handling of symbolic
+ links.
+
+2005-09-04 Martin Lambers <marlam@marlam.de> (tiny change)
+
+ * modules/size_max (Makefile.am): Add size_max.h
+
+2005-09-04 Derek Price <derek@ximbiot.com>
+
+ * gnulib-tool (func_import): Fix reversed $symbolic logic.
+
+2005-09-03 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool: Fix typo.
+
+2005-09-03 Simon Josefsson <jas@extundo.com>
+
+ * config/srclist.txt: Add glibc bug 1293.
+
+2005-09-03 Derek Price <derek@ximbiot.com>
+
+ * m4/getlogin_r (gl_GETLOGIN_R): Fix cut & paste error.
+ From Larry Jones <lawrence.jones@ugs.com>.
+
+2005-09-02 Simon Josefsson <jas@extundo.com>
+
+ * modules/socklen: New file.
+
+2005-09-02 Simon Josefsson <jas@extundo.com>
+
+ * modules/havelib: New module.
+
+ * modules/gettext, modules/iconv, modules/lock, modules/readline:
+ Use havelib.
+
+2005-09-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ Check for arithmetic overflow when calculating sizes, to prevent
+ some buffer-overflow issues. These patches are conservative, in the
+ sense that when I couldn't determine whether an overflow was possible,
+ I inserted a run-time check.
+ * lib/regex_internal.h (re_xmalloc, re_xrealloc, re_x2realloc): New
+ macros.
+ (SIZE_MAX) [!defined SIZE_MAX]: New macro.
+ (re_alloc_oversized, re_x2alloc_oversized, re_xnmalloc):
+ (re_xnrealloc, re_x2nrealloc): New inline functions.
+ * lib/regcomp.c (init_dfa, analyze, build_range_exp,
+ parse_bracket_exp):
+ (build_equiv_class, build_charclass): Check for arithmetic overflow
+ in size expression calculations.
+ * lib/regex_internal.c (re_string_realloc_buffers):
+ (build_wcs_upper_buffer, re_node_set_add_intersect):
+ (re_node_set_init_union, re_node_set_insert, re_node_set_insert_last):
+ (re_dfa_add_node, register_state): Likewise.
+ * lib/regexec.c (re_search_stub, re_copy_regs, re_search_internal):
+ (prune_impossible_nodes, push_fail_stack, set_regs, check_arrival):
+ (build_trtable, extend_buffers, match_ctx_init, match_ctx_add_entry):
+ (match_ctx_add_subtop, match_ctx_add_sublast): Likewise.
+
+2005-09-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/inttostr (Files): Add m4/inttypes_h.m4, m4/stdint_h.m4,
+ m4/ulonglong.m4. Problem reported by Martin Lambers.
+
+2005-09-02 Bruno Haible <bruno@clisp.org>
+
+ Support for lib vs. lib64 distinction on biarch platforms.
+ * m4/lib-prefix.m4 (AC_LIB_PREPARE_MULTILIB): New macro.
+ (AC_LIB_PREFIX): Require it. Use $acl_libdirstem instead of 'lib'.
+ * m4/lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Likewise.
+
+2005-09-02 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (import): In the other first-use case, provide defaults
+ as well.
+
+2005-09-02 Bruno Haible <bruno@clisp.org>
+
+ * config/srclist.txt: lib-link.m4 and lib-prefix.m4 currently have
+ patches not yet found in the latest gettext release.
+
+2005-09-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/glob.c (GET_LOGIN_NAME_MAX): Renamed from LOGIN_NAME_MAX,
+ to avoid a collision with bits/local_lim.h in glibc.
+ All uses changed. Problem reported by Dmitry V. Levin in
+ <http://sources.redhat.com/bugzilla/show_bug.cgi?id=1060>.
+
+ * lib/regex_internal.c (build_wcs_upper_buffer): Fix portability
+ bugs in int versus size_t comparisons.
+ (re_string_context_at): Fix bug where the code assumed that
+ Idx is signed.
+
+ Use bool where appropriate.
+ * lib/regcomp.c (re_set_fastmap): ICASE arg is bool, not int.
+ All callers changed.
+ (calc_eclosure_iter): Likewise, for ROOT arg.
+ (parse_bracket_element): Likewise, for ACCEPT_HYPHEN arg.
+ (build_charclass_op): Likewise, for NON_MATCH arg.
+ * lib/regex_internal.c (re_string_allocate, re_string_construct):
+ (re_string_construct_common): Likewise, for ICASE arg.
+ * lib/regexec.c (re_search_2_stub, re_search_stub):
+ Likewise, for RET_LEN arg.
+ (check_matching): Likewise, for FL_LONGEST_MATCH arg.
+ (set_regs): Likewise, for FL_BACKTRACK arg.
+ * lib/regcomp.c (re_compile_fastmap_iter, optimize_utf8):
+ (duplicate_node_closure, calc_inveclosure, calc_eclosure):
+ (calc_eclosure_iter, parse_bracket_exp):
+ Use bool for internal variables that are booleans.
+ * lib/regexec.c (re_search_internal, check_matching,
+ proceed_next_node):
+ (set_regs, build_sifted_states, sift_states_bkref):
+ (check_arrival_add_next_nodes, check_arrival_expand_ecl_sub):
+ (expand_bkref_cache, build_trtable, group_nodes_into_DFAstates):
+ (find_collation_sequence_value):
+ Likewise.
+ * lib/regex_internal.c (re_node_set_insert, re_node_set_insert_last):
+ (re_node_set_compare):
+ Return bool, not int. All callers changed.
+ * lib/regexec.c (check_halt_node_context, check_dst_limits):
+ (build_trtable, check_node_accept): Likewise.
+ * lib/regex_internal.h: Include stdbool.h.
+
+ Fix bugs uncovered when converting to bool.
+ * lib/regcomp.c (calc_eclosure_iter): Check for storage allocation
+ failure instead of charging ahead blindly.
+ * lib/regex_internal.c (register_state): Likewise.
+ * lib/regexec.c (re_search_2_stub): Use simpler method than boolean
+ for freeing internal storage.
+ (group_nodes_into_DFA_states): Use unsigned int, not int, for
+ bitset pieces used as boolean, to avoid undefined behavior
+ on hosts that do int overflow checking.
+
+2005-09-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add glibc bugs 1285-1287.
+
+2005-09-01 Jim Meyering <jim@meyering.net>
+
+ * m4/lchown.m4: Require gl_FUNC_CHOWN, for the definition of
+ CHOWN_MODIFIES_SYMLINK, which is used by lchown.c.
+ Require gl_STAT_MACROS, too.
+
+2005-09-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (import): In the first-use case, provide defaults.
+
+2005-09-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Remove the .tmp files.
+
+2005-09-01 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Fix handling of symbolic links.
+
+2005-08-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ On 64-bit hosts (where size_t is 64 bits and int is 32 bits), the
+ old glibc regex code mishandles strings longer than 2**31 bytes.
+ This patch fixes this when the regex code is used in gnulib
+ (i.e., outside glibc).
+
+ This patch should not affect the use of the regex code inside
+ glibc. No doubt this problem also needs to be handled for glibc
+ as well, but the result will be an incompatible change to the
+ glibc ABI, and the old ABI will have to be supported too. That
+ can be the the subject for another patch.
+
+ * lib/regex.h (_REGEX_LARGE_OFFSETS): New feature-test macro,
+ governing whether the rest of this patch is active. By default,
+ the macro is disabled and the patch has no effect.
+ (regoff_t) [defined _REGEX_LARGE_OFFSETS]: Define to off_t, not int.
+ (__re_idx_t, __re_size_t, __re_long_size_t): New types.
+ (struct re_pattern_buffer, re_search, re_search_2, re_match):
+ (re_match_2, re_set_registers): Use the new types.
+ * lib/regex_internal.h (Idx, re_hashval_t): New types.
+ (REG_MISSING, REG_ERROR, REG_VALID_INDEX, REG_VALID_NONZERO_INDEX):
+ New macros.
+ (re_node_set, re_charset_t, re_token_t, re_string_realloc_buffers):
+ (re_string_context_at, bin_tree_t, re_dfastate_t):
+ (struct re_state_table_entry, state_array_t, re_sub_match_last_t):
+ (re_sub_match_top_t, re_match_context_t, re_sift_context_t):
+ (struct re_fail_stack_ent_t, struct re_fail_stack_t, struct re_dfa_t):
+ (re_string_char_size_at, re_string_wchar_at):
+ (re_string_elem_size_at):
+ Use the new types and macros to port to 64-bit hosts.
+ Use unsigned types for internal values, so that the code
+ mostly works even for arrays larger than SSIZE_MAX.
+ * lib/regcomp.c (re_compile_internal, init_dfa, duplicate_node):
+ (search_duplicated_node, calc_eclosure_iter, fetch_number):
+ (parse_reg_exp, parse_branch, parse_expression, parse_sub_exp):
+ (build_equiv_class, build_charclass, re_compile_fastmap_iter):
+ (free_dfa_content, create_initial_state, optimize_utf8, analyze):
+ (optimize_subexps, calc_first, link_nfa_nodes, duplicate_node_closure):
+ (calc_inveclosure, parse_dup_op, build_range_exp):
+ (build_collating_symbol, parse_bracket_exp, build_charclass_op):
+ (fetch_number, create_token_tree, mark_opt_subexp):
+ Likewise.
+ * lib/regex_internal.c (re_string_construct_common,
+ create_ci_newstate):
+ (create_cd_newstate, re_string_allocate, re_string_construct):
+ (re_string_realloc_buffers, build_wcs_upper_buffer):
+ (re_string_skip_chars, build_upper_buffer, re_string_translate_buffer):
+ (re_string_reconstruct, re_string_peek_byte_case):
+ (re_string_fetch_byte_case, re_string_context_at):
+ (re_node_set_alloc, re_node_set_init_1, re_node_set_init_2):
+ (re_node_set_init_copy, re_node_set_add_intersect):
+ (re_node_set_init_union, re_node_set_merge, re_node_set_insert):
+ (re_node_set_insert_last, re_node_set_compare, re_node_set_contains):
+ (re_node_set_remove_at, re_dfa_add_node, calc_state_hash):
+ (re_acquire_state, re_acquire_state_context, register_state):
+ Likewise.
+ * lib/regex.c (match_ctx_init, match_ctx_add_entry,
+ search_cur_bkref_entry):
+ (match_ctx_add_subtop, match_ctx_add_sublast, sift_ctx_init):
+ (re_search_internal, re_search_2_stub, re_search_stub)
+ (re_copy_regs, check_matching, check_halt_state_context, update_regs):
+ (push_fail_stack, sift_states_iter_mb, build_sifted_states):
+ (update_cur_sifted_state, check_dst_limits):
+ (check_dst_limits_calc_pos_1, check_dst_limits_calc_pos):
+ (check_subexp_limits, sift_states_bkref, merge_state_array):
+ (check_subexp_matching_top, get_subexp, get_subexp_sub):
+ (find_subexp_node, check_arrival, check_arrival_add_next_nodes):
+ (check_arrival_expand_ecl, check_arrival_expand_ecl_sub):
+ (expand_bkref_cache, check_node_accept_bytes):
+ (group_nodes_into_DFAstates, check_node_accept, regexec, re_match):
+ (re_search, re_match_2, re_search_2, prune_impossible_nodes):
+ (acquire_init_state_context, check_halt_node_context):
+ (proceed_next_node, pop_fail_stack, set_regs, free_fail_stack_return):
+ (sift_states_backward, clean_state_log_if_needed):
+ (sub_epsilon_src_nodes, add_epsilone_src_nodes, merge_state_with_log):
+ (find_recover_state, transit_state_sb, transit_state_mb):
+ (transit_state_bkref, build_trtable, match_ctx_clean):
+ Likewise.
+ * lib/regcomp.c (parse_dup_op): Add an extra test if Idx is unsigned,
+ to work around an assumption that REG_MISSING is negative.
+
+ * lib/regcomp.c (re_comp) [defined _REGEX_RE_COMP || defined _LIBC]:
+ (seek_collating_symbol_entry) [defined _LIBC]:
+ (lookup_collation_sequence_value) [defined _LIBC]:
+ (build_range_exp, build_collating_symbol) [defined _LIBC]:
+ Use prototypes rather than old-style function definitions.
+ * lib/regexec.c (re_exec) [defined _REGEX_RE_COMP || defined _LIBC]:
+ (transit_state_sb) [0]:
+ (find_collation_sequence_value) [defined _LIBC]: Likewise.
+
+ * lib/regexec.c (re_search_internal): Simplify update of rm_so and
+ rm_eo.
+
+ * lib/regcomp.c (re_compile_fastmap_iter, init_dfa, init_word_char):
+ (optimize_subexps, lower_subexp):
+ Don't assume 1<<31 has defined behavior on hosts with 32-bit int,
+ since the signed shift might overflow. Use 1u<<31 instead.
+ * lib/regex_internal.h (bitset_set, bitset_clear, bitset_contain):
+ Likewise.
+ * lib/regexec.c (check_dst_limits_calc_pos_1,
+ check_subexp_matching_top): Likewise.
+
+ * lib/regcomp.c (optimize_subexps, lower_subexp):
+ Use CHAR_BIT rather than 8, for clarity.
+ * lib/regexec.c (check_dst_limits_calc_pos_1):
+ (check_subexp_matching_top): Likewise.
+ * lib/regcomp.c (init_dfa): Make table_size unsigned, so that we don't
+ have to worry about portability issues when shifting it left.
+ Remove no-longer-needed test for table_size > 0.
+ * lib/regcomp.c (parse_sub_exp): Do not shift more bits than there are
+ in a word, as the resulting behavior is undefined.
+ * lib/regexec.c (check_dst_limits_calc_pos_1): Likewise;
+ in one case, a <= should have been an <, and in another case the
+ whole test was missing.
+ * lib/regex_internal.h (BYTE_BITS): Remove. All uses changed to
+ the standard name CHAR_BIT.
+ * lib/regexec.c (match_ctx_add_entry): Don't assume that ~0 == -1;
+ this is not true on one's complement and signed-magnitude hosts.
+
+ * lib/regex_internal.h (re_sub_match_top_t): Remove unused member
+ next_last_offset.
+ (struct re_dfa_t): Remove unused member states_alloc.
+ * lib/regcomp.c (init_dfa): Don't initialize unused members.
+
+2005-08-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_REGEX): Require AC_SYS_LARGEFILE, Define
+ _REGEX_LARGE_OFFSETS). Test for regoff_t/off_t bug in 64-bit
+ and large-file glibc and in 32-bit large-file Solaris.
+
+2005-08-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex_internal.c (re_string_reconstruct): Don't assume buffer
+ lengths fit in regoff_t; this isn't true if regoff_t is the same
+ width as size_t.
+ * lib/regex.c (re_search_internal): 5th arg is LAST_START
+ (= START + RANGE) instead of RANGE. This avoids overflow
+ problems when regoff_t is the same width as size_t.
+ All callers changed.
+ (re_search_2_stub): Check for overflow when adding the
+ sizes of the two strings.
+ (re_search_stub): Check for overflow when adding START
+ to RANGE; if it occurs, substitute the extreme value.
+
+2005-08-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add glibc bugs 1273, 1278-1282, 1284.
+
+2005-08-31 Jim Meyering <jim@meyering.net>
+
+ * lib/regcomp.c (search_duplicated_node): Make first pointer arg
+ a pointer-to-const.
+ * lib/regex_internal.c (create_ci_newstate, create_cd_newstate):
+ (register_state): Likewise.
+ * lib/regexec.c (search_cur_bkref_entry, check_dst_limits):
+ (check_dst_limits_calc_pos_1, check_dst_limits_calc_pos):
+ (group_nodes_into_DFAstates): Likewise.
+
+2005-08-31 Jim Meyering <jim@meyering.net>
+
+ * check-module: Add a FIXME comment.
+
+2005-08-31 Eric Blake <ebb9@byu.net>
+
+ * modules/unistd-safer (Files): Add unistd--.h.
+ * modules/stdio-safer (Files): Add stdio--.h.
+
+2005-08-31 Derek Price <derek@ximbiot.com>
+
+ * lib/getdelim.c (getdelim): Return EOF on EOF.
+ Reported by Larry Jones <lawrence.jones@ugs.com>.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ Avoid unnecessary diffs in the generated lib/Makefile.am.
+ * gnulib-tool (func_emit_lib_Makefile_am): Don't write the cmd into
+ the generated files.
+ (func_import): Don't set cmd.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/strstr.c: Include <stddef.h>, for NULL.
+ * lib/strcasestr.c: Likewise.
+ Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: New option --macro-prefix.
+ (func_import): Use macro_prefix.
+ (import): Handle option --macro-prefix.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (import): Rename most ac_* variables to cached_*.
+ Also use new variables cached_lgpl, cached_libtool.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Require AC_GNU_SOURCE etc. instead of
+ always instantiating them.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Read the previous cached settings
+ from gnulib-cache.m4 and gnulib-comp.m4. Remove files that were
+ earlier added by gnulib but are now dropped. Warn when a gnulib file
+ overwrites a non-gnulib file.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Generate two files gnulib-cache.m4 and
+ gnulib-comp.m4 instead of a single gnulib.m4, to make it easy for
+ projects that don't keep autogenerated files in CVS. Put into
+ actioncmd only the specified modules, not the transitive closure.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Fix defaulting of $libname and $libtool.
+ Create directories that shall be filled.
+ (import): Don't look for gl_* macros in configure.ac. Recurse across
+ all directories containing a gnulib-cache.m4 files, if meaningful.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Emit also a stub for gl_LIBTOOL.
+ (import): Set seen_libtool when we see gl_LIBTOOL.
+
+2005-08-31 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Also copy m4/gnulib-tool.m4. Omit
+ declaration macro definitions from generated gnulib.m4.
+
+2005-08-30 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * lib/iconvme.h: Add prototype for iconv_alloc.
+
+2005-08-29 Simon Josefsson <jas@extundo.com>
+
+ * lib/iconvme.c: Fix errno.
+
+2005-08-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Enclose all occurrences of $destdir in "...", so
+ that it works when the directory contains spaces.
+
+2005-08-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (import): Avoid unnecessary spaces in $avoidlist.
+
+2005-08-29 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Emit more comments into gnulib.m4.
+ Emit more advice.
+
+2005-08-29 Bruno Haible <bruno@clisp.org>
+ and Stepan Kasal <kasal@ucw.cz>
+
+ * check-module: If more parameters are given, check each of them
+ separately; add more exceptions, as noted by Jim Meyering.
+ (check_module): New procedure.
+ (%exempt_header): Now contains all exceptions.
+
+2005-08-29 Ben Pfaff <blp@cs.stanford.edu>
+
+ * modules/byteswap (Makefile.am): Fix rule to not assume GNU make.
+
+2005-08-29 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * lib/iconvme.c: Split iconv_string into iconv_alloc.
+
+2005-08-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/gnulib-tool.m4: New file.
+
+2005-08-27 Jim Meyering <jim@meyering.net>
+
+ * modules/unistd-safer (Files): Add pipe-safer.c.
+ * modules/fcntl-safer (Files): Add creat-safer.c.
+
+2005-08-27 Jim Meyering <jim@meyering.net>
+
+ * m4/stdlib-safer.m4: New file. From coreutils.
+ * m4/stdio-safer.m4 (gl_STDIO_SAFER): Add stdio--.h.
+ * m4/fcntl-safer.m4 (gl_FCNTL_SAFER): Add creat-safer.c to the
+ AC_LIBSOURCES list and arrange to compile it via AC_LIBOBJ.
+ * m4/unistd-safer.m4 (gl_UNISTD_SAFER): Likewise, add pipe-safer.c.
+ Add pipe-safer.c and unistd--.h to the AC_LIBSOURCES list.
+
+2005-08-27 Jim Meyering <jim@meyering.net>
+
+ * lib/fopen-safer.c: Merge minor changes from coreutils.
+ * lib/dup-safer.c: Likewise.
+ * lib/fd-safer.c: Likewise.
+
+ Merge from coreutils.
+ * lib/stdio--.h: New file.
+ * lib/stdlib--.h: New file.
+ * lib/mkstemp-safer.c: New file.
+
+ GNU tar needs these.
+ * lib/pipe-safer.c: New file.
+ * lib/creat-safer.c: New file.
+ * lib/fcntl--.h (creat): Define to creat_safer.
+ * lib/fcntl-safer.h: Include <sys/types.h> and declare creat_safer.
+ * lib/unistd--.h (pipe): Define to pipe_safer.
+ * lib/unistd-safer.h: Declare pipe_safer.
+
+2005-08-26 Simon Josefsson <jas@extundo.com>
+
+ * lib/getpass.c: Use _WIN32 instead of WIN32, suggested by Bruno
+ Haible <bruno@clisp.org>.
+
+2005-08-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex_internal.h: Remove all references to
+ RE_NO_INTERNAL_PROTOTYPES; no longer neeeded now that we assume C89
+ or better.
+ (bitset_not, bitset_merge, bitset_not_merge):
+ (bitset_mask, re_string_allocate, re_string_construct):
+ (re_string_reconstruct, re_string_destruct, re_string_elem_size_at):
+ (re_string_char_size_at, re_string_wchar_at, re_string_peek_byte_case):
+ (re_string_fetch_byte_case, re_node_set_alloc, re_node_set_init_1):
+ (re_node_set_init_2, re_node_set_init_copy, re_node_set_add_intersect):
+ (re_node_set_init_union, re_node_set_merge, re_node_set_insert):
+ (re_node_set_insert_last, re_node_set_compare, re_node_set_contains):
+ (re_node_set_remove_at, re_dfa_add_node, re_acquire_state):
+ (re_acquire_state_context):
+ Remove unnecessary forward decls.
+ (re_string_char_size_at, re_string_wchar_at, re_string_elem_size_at):
+ Put __attribute at function definition,
+ now that the function decl has been removed.
+ * lib/regex_internal.c (re_string_peek_byte_case):
+ (re_string_fetch_byte_case, re_node_set_compare, re_node_set_contains):
+ Likewise.
+
+2005-08-25 Stepan Kasal <kasal@ucw.cz>
+
+ * m4/regex.m4: Add AC_PREREQ(2.50).
+ (gl_REGEX): If --with-included-regex was given, skip the autodetection.
+
+2005-08-25 Simon Josefsson <jas@extundo.com>
+
+ * m4/getpass.m4: Check for termios.h, tcgetattr, tcsetattr, and
+ __fsetlocking.
+
+2005-08-25 Simon Josefsson <jas@extundo.com>
+
+ * lib/getpass.c: Add WIN32 implementation. Conditionalize use of
+ termios.h, tcgetattr, tcsetattr and __fsetlocking. Remove some
+ GLIBC specific code.
+
+2005-08-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ Make regex safe for g++. This fixes one real bug (an "err"
+ that should have been "*err"). g++ problem reported by
+ Sam Steingold.
+ * lib/regex_internal.h (re_calloc): New macro, consistent with
+ re_malloc etc. All callers of calloc changed to use re_calloc.
+ * lib/regex_internal.c (build_wcs_upper_buffer): Return reg_errcode_t,
+ not int. All callers changed.
+ * lib/regcomp.c (re_compile_fastmap_iter): Don't use
+ alloca (mb_cur_max); just use an array of size MB_LEN_MAX.
+ * lib/regexec.c (push_fail_stack): Use re_realloc, not realloc.
+ (find_recover_state): Change "err" to "*err"; this fixes what
+ appears to be a real bug.
+ (check_arrival_expand_ecl_sub): Be consistent about reg_errcode_t
+ versus int.
+
+2005-08-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/regex (Depends-on): Add malloc, since the code
+ assumes that !malloc(0) means failure.
+
+2005-08-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regexec.c (set_regs): Don't alloca with an unbounded size.
+
+ alloca modernization/simplification for regex.
+ * lib/regex.c: Remove portability cruft for alloca. This no longer
+ needs to be at the start of the file, and can be moved into
+ regex_internal.h and simplified.
+ * lib/regex_internal.h: Include <alloca.h>.
+ (__libc_use_alloca) [!defined _LIBC]: New macro.
+ * lib/regexec.c (build_trtable): Remove "#ifdef _LIBC", since the code
+ now works outside glibc.
+
+2005-08-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add glibc bugs 1241, 1245.
+
+2005-08-25 Jim Meyering <jim@meyering.net>
+
+ * lib/open-safer.c: Include <config.h>.
+ Otherwise, we'd lose LARGEFILE support in any file using
+ e.g. "fcntl--.h"
+
+2005-08-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/minmax.m4: Require autoconf 2.52.
+ (gl_MINMAX_IN_HEADER): Add comments. Use m4_pushdef/m4_popdef instead
+ of define/undefine. Use AS_TR_SH and AS_TR_CPP as more robust
+ alternatives of translit over the alphabet.
+ Based on a patch from Stepan Kasal <kasal@ucw.cz>.
+
+2005-08-24 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-getpass.c: New file.
+
+2005-08-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_REGEX): Use POSIX-compliant spellings when testing
+ for GNU regex features.
+
+2005-08-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regcomp.c (regerror): 2nd arg is 'restrict', as per POSIX.
+ * lib/regex.h (regerror): Likewise.
+
+ * lib/regex.c: Do not include <sys/types.h>, as POSIX no longer
+ requires this. (The code never needed it.)
+
+ * lib/regcomp.c, regex_internal.c, regex_internal.h, regexec.c:
+ All uses of recently-renamed identifiers changed to use the new,
+ POSIX-compliant names. The code will build and run just fine
+ without these changes, but it's better to eat our own dog food
+ and use the standard-conforming names.
+
+ * lib/regex.h: Fix a multitude of POSIX name space violations.
+ These changes have an effect only for programs that define
+ _POSIX_C_SOURCE, _POSIX_SOURCE, or _XOPEN_SOURCE; they
+ do not change anything for programs compiled in the normal way.
+ Also, there is no effect on the ABI.
+
+ (_REGEX_SOURCE): New macro.
+ Do not include <stddef.h> if _XOPEN_SOURCE and VMS are both
+ defined and _GNU_SOURCE is not; this fixes a name space violation.
+
+ Rename the following macros to obey POSIX requirements.
+ The old names are still visible as macros if _REGEX_SOURCE is defined.
+ (REG_BACKSLASH_ESCAPE_IN_LISTS): renamed from
+ RE_BACKSLASH_ESCAPE_IN_LISTS.
+ (REG_BK_PLUS_QM): renamed from RE_BK_PLUS_QM.
+ (REG_CHAR_CLASSES): renamed from RE_CHAR_CLASSES.
+ (REG_CONTEXT_INDEP_ANCHORS): renamed from RE_CONTEXT_INDEP_ANCHORS.
+ (REG_CONTEXT_INDEP_OPS): renamed from RE_CONTEXT_INDEP_OPS.
+ (REG_CONTEXT_INVALID_OPS): renamed from RE_CONTEXT_INVALID_OPS.
+ (REG_DOT_NEWLINE): renamed from RE_DOT_NEWLINE.
+ (REG_DOT_NOT_NULL): renamed from RE_DOT_NOT_NULL.
+ (REG_HAT_LISTS_NOT_NEWLINE): renamed from RE_HAT_LISTS_NOT_NEWLINE.
+ (REG_INTERVALS): renamed from RE_INTERVALS.
+ (REG_LIMITED_OPS): renamed from RE_LIMITED_OPS.
+ (REG_NEWLINE_ALT): renamed from RE_NEWLINE_ALT.
+ (REG_NO_BK_BRACES): renamed from RE_NO_BK_BRACES.
+ (REG_NO_BK_PARENS): renamed from RE_NO_BK_PARENS.
+ (REG_NO_BK_REFS): renamed from RE_NO_BK_REFS.
+ (REG_NO_BK_VBAR): renamed from RE_NO_BK_VBAR.
+ (REG_NO_EMPTY_RANGES): renamed from RE_NO_EMPTY_RANGES.
+ (REG_UNMATCHED_RIGHT_PAREN_ORD): renamed from
+ RE_UNMATCHED_RIGHT_PAREN_ORD.
+ (REG_NO_POSIX_BACKTRACKING): renamed from RE_NO_POSIX_BACKTRACKING.
+ (REG_NO_GNU_OPS): renamed from RE_NO_GNU_OPS.
+ (REG_DEBUG): renamed from RE_DEBUG.
+ (REG_INVALID_INTERVAL_ORD): renamed from RE_INVALID_INTERVAL_ORD.
+ (REG_IGNORE_CASE): renamed from RE_ICASE. This renaming is a bit
+ unusual, since we can't clash with the POSIX REG_ICASE.
+ (REG_CARET_ANCHORS_HERE): renamed from RE_CARET_ANCHORS_HERE.
+ (REG_CONTEXT_INVALID_DUP): renamed from RE_CONTEXT_INVALID_DUP.
+ (REG_NO_SUB): renamed from RE_NO_SUB.
+ (REG_SYNTAX_EMACS): renamed from RE_SYNTAX_EMACS.
+ (REG_SYNTAX_AWK): renamed from RE_SYNTAX_AWK.
+ (REG_SYNTAX_GNU_AWK): renamed from RE_SYNTAX_GNU_AWK.
+ (REG_SYNTAX_POSIX_AWK): renamed from RE_SYNTAX_POSIX_AWK.
+ (REG_SYNTAX_GREP): renamed from RE_SYNTAX_GREP.
+ (REG_SYNTAX_EGREP): renamed from RE_SYNTAX_EGREP.
+ (REG_SYNTAX_POSIX_EGREP): renamed from RE_SYNTAX_POSIX_EGREP.
+ (REG_SYNTAX_ED): renamed from RE_SYNTAX_ED.
+ (REG_SYNTAX_SED): renamed from RE_SYNTAX_SED.
+ (_REG_SYNTAX_POSIX_COMMON): renamed from _RE_SYNTAX_POSIX_COMMON.
+ (REG_SYNTAX_POSIX_BASIC): renamed from RE_SYNTAX_POSIX_BASIC.
+ (REG_SYNTAX_POSIX_MINIMAL_BASIC): renamed from
+ RE_SYNTAX_POSIX_MINIMAL_BASIC.
+ (REG_SYNTAX_POSIX_EXTENDED): renamed from RE_SYNTAX_POSIX_EXTENDED.
+ (REG_SYNTAX_POSIX_MINIMAL_EXTENDED): renamed from
+ RE_SYNTAX_POSIX_MINIMAL_EXTENDED.
+ (REG_DUP_MAX): renamed from RE_DUP_MAX. No need to undef it.
+ (REG_UNALLOCATED): Renamed from REGS_UNALLOCATED.
+ (REG_REALLOCATE): Renamed from REGS_REALLOCATE.
+ (REG_FIXED): Renamed from REGS_FIXED.
+ (REG_NREGS): Renamed from RE_NREGS.
+
+ (REG_ICASE, REG_NEWLINE, REG_NOSUB): Do not depend on the values
+ of other REG_* macros, since POSIX says the user is allowed to
+ #undef these macros selectively.
+
+ (reg_errcode_t): Update comment stating what other tables need
+ to be consistent.
+
+ Rename the following enum values to obey POSIX requirements.
+ The old names are still visible as macros.
+ (_REG_ENOSYS): Renamed from REG_ENOSYS. Define even if _XOPEN_SOURCE
+ is not defined, since GNU is supposed to be a superset of POSIX as
+ much as possible, and since we want reg_errcode_t to be a signed
+ type for implementation consistency.
+ (_REG_NOERROR): Renamed from REG_NOERROR.
+ (_REG_NOMATCH): Renamed from REG_NOMATCH.
+ (_REG_BADPAT): Renamed from REG_BADPAT.
+ (_REG_ECOLLATE): Renamed from REG_ECOLLATE.
+ (_REG_ECTYPE): Renamed from REG_ECTYPE.
+ (_REG_EESCAPE): Renamed from REG_EESCAPE.
+ (_REG_ESUBREG): Renamed from REG_ESUBREG.
+ (_REG_EBRACK): Renamed from REG_EBRACK.
+ (_REG_EPAREN): Renamed from REG_EPAREN.
+ (_REG_EBRACE): Renamed from REG_EBRACE.
+ (_REG_BADBR): Renamed from REG_BADBR.
+ (_REG_ERANGE): Renamed from REG_ERANGE.
+ (_REG_ESPACE): Renamed from REG_ESPACE.
+ (_REG_BADRPT): Renamed from REG_BADRPT.
+ (_REG_EEND): Renamed from REG_EEND.
+ (_REG_ESIZE): Renamed from REG_ESIZE.
+ (_REG_ERPAREN): Renamed from REG_ERPAREN.
+ (REG_ENOSYS, REG_NOERROR, REG_NOMATCH, REG_BADPAT, REG_ECOLLATE):
+ (REG_ECTYPE, REG_EESCAPE, REG_ESUBREG, REG_EBRACK, REG_EPAREN):
+ (REG_EBRACE, REG_BADBR, REG_ERANGE, REG_ESPACE, REG_BADRPT, REG_EEND):
+ (REG_ESIZE, REG_ERPAREN): Now macros, not enum constants.
+
+ (_REG_RE_NAME, _REG_RM_NAME): New macros.
+ (REG_TRANSLATE_TYPE): Renamed from RE_TRANSLATE_TYPE. All uses
+ changed. But support the old name if the new one is not defined
+ and if _REGEX_SOURCE.
+
+ Change the following member names in struct re_pattern_buffer.
+ The old names are still supported if !_REGEX_SOURCE.
+ The new names are always supported, regardless of _REGEX_SOURCE.
+ (re_buffer): Renamed from buffer.
+ (re_allocated): Renamed from allocated.
+ (re_used): Renamed from used.
+ (re_syntax): Renamed from syntax.
+ (re_fastmap): Renamed from fastmap.
+ (re_translate): Renamed from translate.
+ (re_can_be_null): Renamed from can_be_null.
+ (re_regs_allocated): Renamed from regs_allocated.
+ (re_fastmap_accurate): Renamed from fastmap_accurate.
+ (re_no_sub): Renamed from no_sub.
+ (re_not_bol): Renamed from not_bol.
+ (re_not_eol): Renamed from not_eol.
+ (re_newline_anchor): Renamed from newline_anchor.
+
+ Change the following member names in struct re_registers.
+ The old names are still supported if !_REGEX_SOURCE.
+ The new names are always supported, regardless of _REGEX_SOURCE.
+ (rm_num_regs): Renamed from num_regs.
+ (rm_start): Renamed from start.
+ (rm_end): Renamed from end.
+
+ (re_set_syntax, re_compile_pattern, re_compile_fastmap):
+ (re_search, re_search_2, re_match, re_match_2, re_set_registers):
+ Prepend __ to parameter names.
+
+ Undo yesterday's changes.
+
+2005-08-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Remove glibc bug 1233 and add 1236, which
+ supersedes it. Add glibc bugs 1237, 1238, 1240. Comment out
+ lib/regex.c.
+
+2005-08-24 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * m4/fcntl-safer.m4: New file.
+
+ * m4/xgetcwd.m4: Use AC_LIBSOURCES and AC_LIBOBJ to indicate source
+ and object files for this module.
+
+2005-08-24 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+ * lib/fcntl--.h, lib/fcntl-safer.h, lib/open-safer.c: New files.
+
+2005-08-24 Jim Meyering <jim@meyering.net>
+
+ * modules/xgetcwd (Makefile.am): Remove `lib_SOURCES += ...' line,
+ now that xgetcwd.m4 requires xgetcwd.c and xgetcwd.h.
+
+2005-08-24 Jim Meyering <jim@meyering.net>
+
+ * modules/fcntl-safer: New module.
+ * modules/fts (Depends-on): Add fcntl-safer.
+ * MODULES.html.sh (File descriptor based Input/Output):
+ Add fcntl-safer.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ Support for unit test modules.
+ * modules/README: Mention tests modules.
+ * modules/TEMPLATE-TESTS: New file.
+ * gnulib-tool: New options --extract-tests-module, --with-tests and
+ --tests-base (unused for the moment).
+ (testsbase, inctests): New variables.
+ (func_all_modules): Exclude TEMPLATE-TESTS and *-tests.
+ (func_verify_module): Exclude TEMPLATE-TESTS.
+ (func_verify_nontests_module, func_verify_tests_module): New functions.
+ (func_get_dependencies): Add implicit dependency for tests modules.
+ (func_get_tests_module): New function.
+ (func_modules_transitive_closure): When --with-tests was specified,
+ include the unit tests as well, unless explicitly avoided.
+ (func_emit_lib_Makefile_am): Ignore the tests modules here.
+ (func_emit_tests_Makefile_am): New function.
+ (func_create_testdir): When --with-tests was specified, emit a
+ tests/ directory.
+ * MODULES.html.sh (Future developments): Update.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/tls-tests: New file.
+ * tests/test-tls.c: New file, from GNU gettext.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/lock-tests: New file.
+ * tests/test-lock.c: New file, from GNU gettext.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h: Add multiple inclusion guard.
+ * lib/tls.h: Add multiple inclusion guard.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Add support for the --aux-dir option to
+ --create-testdir, --create-megatestdir, --test, --megatest.
+ (func_create_testdir, func_create_megatestdir): Optionally emit a
+ AC_CONFIG_AUX_DIR directive.
+ (create-testdir, create-megatestdir, test, megatest): Provide a
+ default value for $auxdir.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (import): Use compound statement instead of subshell
+ where possible.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (import): Change --aux-dir default to "build-aux".
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_version): Update.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import, func_create_testdir,
+ func_create_megatestdir): Quote all autoconf macro arguments.
+
+2005-08-24 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_megatestdir): Call autoreconf without the
+ option --force, because --force causes the aclocal.m4 of each
+ subdirectory to be newer than the corresponding config.h.in.
+
+2005-08-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_INCLUDED_REGEX): Remove; no longer used.
+ All contents moved to gl_REGEX.
+ (gl_REGEX): Don't bother checking whether lib/regex.c exists;
+ assume that it does.
+
+2005-08-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex.h (REG_NOSYS)
+ [!defined _XOPEN_SOURCE && 200112L <= _POSIX_C_SOURCE]:
+ Define, since POSIX requires it as of 2001.
+ (_REG_ENOSYS)
+ [! (defined _XOPEN_SOURCE || 200112L <= _POSIX_C_SOURCE)]:
+ New private symbol, used to keep the enum signed in all cases.
+ * lib/regex.h (RE_NO_EMPTY_RANGES): Fix doc bug reported by James
+ Youngman in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2005-07/msg00132.html>.
+
+ * lib/regex_internal.c (re_string_skip_chars, register_state):
+ (calc_state_hash):
+ Remove forward decls; no longer needed now that we use prototypes.
+ * lib/regexec.c (acquire_init_state_context, check_halt_node_context):
+ (proceed_next_node, pop_fail_stack, sub_epsilon_src_nodes):
+ (clean_state_log_if_needed): Likewise.
+
+2005-08-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add glibc bugs 1231-1233.
+
+2005-08-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix problems reported by Sam Steingold in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2005-08/msg00007.html>.
+ * lib/regexec.c (sift_states_bkref): Fix portability bug: the code
+ assumed that reg_errcode_t is a signed type, which is not
+ necessarily true if _XOPEN_SOURCE is not defined.
+ * lib/regex_internal.c (calc_state_hash): Put 'inline' before type,
+ since some compilers warn about it otherwise.
+
+2005-08-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regcomp.c (create_initial_state): Remove duplicate decl.
+ (init_word_char, create_initial_state, duplicate_node_closure):
+ (fetch_token, peek_token_bracket, build_range_exp):
+ (build_collating_symbol): Remove forward decls; no longer needed
+ now that we use prototypes.
+
+ * lib/regcomp.c:
+ (re_compile_pattern, re_set_syntax, re_compile_fastmap):
+ (re_compile_fastmap_iter, regcomp, regerror, regfree):
+ (re_compile_internal, init_dfa, init_word_char, free_workarea_compile):
+ (create_initial_state, optimize_utf8, analyze, postorder, preorder):
+ (optimize_subexps, lower_subexps, lower_subexp, calc_first, calc_next):
+ (link_nfa_nodes, duplicate_node_closure, search_duplicated_node):
+ (duplicate_node, calc_inveclosure, calc_eclosure, calc_eclosure_iter):
+ (fetch_token, peek_token, peek_token_bracket, parse, parse_reg_exp):
+ (parse_branch, parse_expression, parse_sub_exp, parse_dup_op):
+ (build_range_exp, build_collating_symbol, parse_bracket_exp):
+ (parse_bracket_element, parse_bracket_symbol, build_equiv_class):
+ (build_charclass, build_charclass_op, fetch_number, create_tree):
+ (create_token_tree, mark_opt_subexp, duplicate_tree):
+ Use prototypes rather than old-style definitions.
+
+ * lib/regex_internal.c:
+ (re_string_allocate, re_string_construct, re_string_realloc_buffers):
+ (re_string_construct_common, build_wcs_buffer, build_wcs_upper_buffer):
+ (re_string_skip_chars, build_upper_buffer, re_string_translate_buffer):
+ (re_string_reconstruct, re_string_peek_byte_case):
+ (re_string_fetch_byte_case, re_string_destruct, re_string_context_at):
+ (re_node_set_alloc, re_node_set_init_1, re_node_set_init_2):
+ (re_node_set_init_copy, re_node_set_add_intersect):
+ (re_node_set_init_union, re_node_set_merge, re_node_set_insert):
+ (re_node_set_insert_last, re_node_set_compare, re_node_set_contains):
+ (re_node_set_remove_at, re_dfa_add_node, calc_state_hash):
+ (re_acquire_state, re_acquire_state_context, register_state):
+ (create_ci_newstate, create_cd_newstate, free_state):
+ Likewise.
+ * lib/regexec.c (regexec, re_match, re_search, re_match_2,
+ re_search_2):
+ (re_search_2_stub, re_search_stub, re_copy_regs, re_set_registers):
+ (re_search_internal, prune_impossible_nodes):
+ (acquire_init_state_context, check_matching, static):
+ (check_halt_node_context, check_halt_state_context, proceed_next_node):
+ (push_fail_stack, pop_fail_stack, set_regs, free_fail_stack_return):
+ (update_regs, sift_states_backward, build_sifted_states):
+ (clean_state_log_if_needed, merge_state_array):
+ (update_cur_sifted_state, add_epsilon_src_nodes):
+ (sub_epsilon_src_nodes, check_dst_limits, check_dst_limits_calc_pos_1):
+ (check_dst_limits_calc_pos, check_subexp_limits, sift_states_bkref):
+ (sift_states_iter_mb, transit_state, merge_state_with_log, static):
+ (find_recover_state, check_subexp_matching_top, transit_state_mb):
+ (transit_state_bkref, get_subexp, get_subexp_sub, find_subexp_node):
+ (check_arrival, check_arrival_add_next_nodes):
+ (check_arrival_expand_ecl, check_arrival_expand_ecl_sub):
+ (expand_bkref_cache, build_trtable, group_nodes_into_DFAstates):
+ (check_node_accept_bytes, check_node_accept, extend_buffers):
+ (match_ctx_init, match_ctx_clean, match_ctx_free, match_ctx_add_entry):
+ (search_cur_bkref_entry, match_ctx_add_subtop, match_ctx_add_sublast):
+ (sift_ctx_init):
+ Likewise.
+
+ * lib/regex_internal.h:
+ (re_string_allocate, re_string_construct, re_string_reconstruct):
+ (re_string_realloc_buffers, build_wcs_buffer, build_wcs_upper_buffer):
+ (build_upper_buffer, re_string_translate_buffer, re_string_destruct):
+ (re_string_elem_size_at, re_string_char_size_at, re_string_wchar_at):
+ (re_string_context_at, re_string_peek_byte_case):
+ (re_string_fetch_byte_case): Declare even if RE_NO_INTERNAL_PROTOTYPES
+ is defined, since we now use prototypes always.
+
+ * lib/regex.h (_RE_ARGS): Remove. No longer needed, since we assume
+ C89 or better. All uses removed.
+
+2005-08-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add glibc bugs 1220-1227.
+
+2005-08-20 Jim Meyering <jim@meyering.net>
+
+ * lib/regexec.c (regexec, re_search_stub) [!_LIBC]: Omit declaration
+ of unused local, dfa.
+
+2005-08-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/regex.m4 (gl_PREREQ_REGEX): Require AC_GNU_SOURCE.
+
+2005-08-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex_internal.c (re_string_realloc_buffers, re_node_set_insert):
+ (re_node_set_insert_last, re_dfa_add_node):
+ Rename local variables to avoid GCC shadowing warnings.
+
+2005-08-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex_internal.c (re_acquire_state, re_acquire_state_context)
+ [defined lint]: Suppress bogus uninitialized-variable warnings.
+
+ * lib/regcomp.c (duplicate_node): Return new index, not an error code,
+ and let the caller return REG_ESPACE if out of space. This
+ removes an uninitialied-variable warning with GCC 4.0.1, and also
+ avoids taking the address of a local variable. All callers
+ changed.
+
+2005-08-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Comment out $LIBCSRC/posix/regex_internal.c,
+ $LIBCSRC/posix/regexec.c.
+ Add glibc bug 1217 for regcomp.c.
+
+2005-08-19 Jim Meyering <jim@meyering.net>
+
+ * lib/regexec.c (proceed_next_node): Redo local variables to
+ avoid GCC shadowing warnings.
+
+2005-08-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/strstr.c (strstr): Fix return value in multibyte case.
+ * lib/strcasestr.c (strcasestr): Likewise.
+
+2005-08-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex.h: Remove useless space-before-tab. From coreutils.
+
+2005-08-17 Jim Meyering <jim@meyering.net>
+
+ Make the %s format (seconds since the epoch) work for a negative
+ number and when used with a zero-padded field width, e.g. %015s.
+
+ * lib/strftime.c (my_strftime): Move the `do_number_sign_and_padding'
+ label so that it precedes the code to set `digits'. Otherwise,
+ %0Ns wouldn't work. Before this change, `date -d @-22 +%05s' would
+ print `00-22'. Now, it prints `-0022', as it should.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/strstr (Files): Add m4/mbrtowc.m4.
+ (Depends-on): Add mbuiter.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/strcasestr: New file.
+ * MODULES.html.sh (String handling, based on ANSI C 89): Add
+ strcasestr.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/strcase (Depends-on): Add mbuiter. Remove strnlen1, mbchar.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbuiter: New file.
+ * MODULES.html.sh (Extended multibyte and wide character utilities):
+ Add mbuiter.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/strstr.m4 (gl_FUNC_STRSTR): Use the replacement function always.
+ (gl_PREREQ_STRSTR): Use gl_FUNC_MBRTOWC.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/strcasestr.m4: New file.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/strstr.h: Ignore HAVE_STRSTR, always declare the gnulib function.
+ * lib/strstr.c: Completely rewritten, with multibyte locale support.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/strcasestr.h: New file.
+ * lib/strcasestr.c: New file.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/strcasecmp.c: Use mbuiter.h.
+
+2005-08-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbuiter.h: New file.
+
+2005-08-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS): Do not override the results
+ of gl_GETOPT_SUBSTITUTE. That way, if both gl_GETOPT_SUBSTITUTE
+ and gl_GETOPT are both invoked via different paths (as happens
+ with GNU tar CVS because it uses both argp and getopt), the former
+ wins.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/tls: New file.
+ * MODULES.html.sh (Multithreading): Add tls.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/strnlen1: New file.
+ * MODULES.html.sh (String handling): Add strnlen1.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/strcase (Files): Add m4/mbrtowc.m4.
+ (Depends-on): Add strnlen1, mbchar.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbiter: New file.
+ * MODULES.html.sh (Extended multibyte and wide character utilities):
+ Add mbiter.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbfile: New file.
+ * MODULES.html.sh (Extended multibyte and wide character utilities):
+ Add mbfile.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/mbchar: New file.
+ * MODULES.html.sh (Extended multibyte and wide character utilities):
+ New section.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/tls.m4: New file, from GNU gettext.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/strcase.m4 (gl_FUNC_STRCASECMP): Use the replacement function
+ always.
+ (gl_PREREQ_STRCASECMP): Use gl_FUNC_MBRTOWC.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbiter.m4: New file.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbfile.m4: New file.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbchar.m4: New file.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/tls.h: New file, from GNU gettext.
+ * lib/tls.c: New file, from GNU gettext.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/strnlen1.h: New file.
+ * lib/strnlen1.c: New file.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/strcasecmp.c (struct mbiter_multi): Remove at_end field.
+ (mbi_init): Update.
+ (mbi_avail, mbi_advance): Let the iteration end before the terminating
+ NUL byte, not after it.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/strcase.h (strcasecmp): Add note in comments.
+ * lib/strncasecmp.c: Use code from strcasecmp.c.
+ * lib/strcasecmp.c: Use mbchar module. Define private mbiter variant.
+ (strcasecmp): Work correctly in multibyte locales.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbiter.h: New file.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbfile.h: New file.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbchar.h: New file.
+ * lib/mbchar.c: New file.
+
+2005-08-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbchar.h (mb_cmp, mb_casecmp): Order the invalid characters after
+ the valid ones. Makes the comparison operations transitive:
+ cmp (a, b) < 0 && cmp (b, c) < 0 ==> cmp (a, c) < 0.
+ * lib/strcasecmp.c (strcasecmp): Use mb_casecmp.
+
+2005-08-15 Simon Josefsson <jas@extundo.com>
+
+ * modules/ssize_t (License): Change to 'unlimited'.
+
+ * gnulib-tool (sed_extract_prog): Recognize 'unlimited' license.
+
+2005-08-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Comment out $LIBCSRC/posix/regex.h.
+ Add comments for each pending glibc patch.
+
+2005-08-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/regex.h (__restrict_arr): Don't define to __restrict if
+ __cplusplus is defined.
+
+2005-08-14 Jim Meyering <jim@meyering.net>
+
+ Sync from coreutils.
+
+ * lib/fts-cycle.c (setup_dir, enter_dir, leave_dir, free_dir):
+ Use the hash-table-based cycle-detection code not just when
+ FTS_TIGHT_CYCLE_CHECK if specified, but also with FTS_LOGICAL.
+ Reported by James Youngman in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2005-08/msg00011.html>.
+ * lib/fts_.h: Mention that with FTS_LOGICAL, we use
+ FTS_TIGHT_CYCLE_CHECK.
+ * lib/fts.c (fts_cross_check) [FTS_DEBUG]:
+ s/active_dir_ht/fts_cycle.ht/. This lets us compile with -DFTS_DEBUG,
+ once again.
+ * lib/fts.c [! _LIBC]: Include "lstat.h" rather than rolling our own.
+ * lib/fts.c (fd_safer): Remove decl.
+ Include fcntl--.h rather than unistd-safer.h
+ (fts_safe_changedir): Don't call fd_safer; no longer needed
+ now that we include fcntl--.h.
+
+2005-08-12 Simon Josefsson <jas@extundo.com>
+
+ * modules/getndelim2: Use ssize_t module.
+ * modules/getnline: Likewise.
+ * modules/safe-read: Likewise.
+ * modules/xreadlink: Likewise.
+
+ * modules/ssize_t: New file.
+
+2005-08-12 Simon Josefsson <jas@extundo.com>
+
+ * m4/readline.m4: Look for termcap, curses or ncurses if required.
+
+2005-08-12 Simon Josefsson <jas@extundo.com>
+
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ ssize_t.
+
+2005-08-12 Simon Josefsson <jas@extundo.com>
+
+ * MODULES.html.sh (Extra functions based on ANSI C 89: Misc): Add
+ readline, getdelim and check_version.
+ (Support for systems lacking ISO C 99: Sizes of integer types):
+ Add size_max.
+
+2005-08-12 Bruno Haible <bruno@clisp.org>
+
+ * m4/readline.m4 (gl_FUNC_READLINE): Look for ncurses first.
+
+2005-08-11 Simon Josefsson <jas@extundo.com>
+
+ * modules/readline: New file.
+
+ * modules/strnlen (Files): Add strnlen.h.
+
+2005-08-11 Simon Josefsson <jas@extundo.com>
+
+ * m4/readline.m4: New file.
+
+2005-08-11 Simon Josefsson <jas@extundo.com>
+
+ * lib/readline.h, readline.c: New file.
+
+2005-08-11 Simon Josefsson <jas@extundo.com>
+
+ * doc/gnulib.texi (Initial import, Finishing touches): Mention
+ gl_AVOID.
+
+2005-08-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/strnlen.h (strnlen): Change parameter name to match comment.
+
+2005-08-10 Stepan Kasal <kasal@ucw.cz>
+
+ * m4/onceonly_2_57.m4: Really require Autoconf 2.57.
+
+2005-08-10 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-iconvme.c: New file.
+
+2005-08-10 Simon Josefsson <jas@extundo.com>
+
+ * m4/strnlen.m4: New file.
+
+ * m4/strndup.m4: Don't check for strnlen declaration, done in
+ strnlen.m4.
+
+2005-08-10 Simon Josefsson <jas@extundo.com>
+
+ * lib/strndup.c: Use strnlen.h.
+
+ * lib/strnlen.h: New file.
+
+2005-08-08 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> (tiny change)
+
+ * README: Typos.
+
+2005-08-02 Simon Josefsson <jas@extundo.com>
+
+ * modules/readline: New file.
+
+2005-08-02 Simon Josefsson <jas@extundo.com>
+
+ * modules/getdelim: New file.
+
+ * modules/getline: Rewrite, don't use getndelim2.
+
+2005-08-02 Simon Josefsson <jas@extundo.com>
+
+ * m4/getline.m4: Separate out getdelim stuff into separate module.
+
+ * m4/getdelim.m4: New file.
+
+2005-08-02 Simon Josefsson <jas@extundo.com>
+
+ * lib/getline.h, getline.c: Rewrite.
+
+ * lib/getdelim.h, lib/getdelim.c: New files, ported from glibc.
+
+2005-07-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h (gl_lock_initializer): New macro.
+ (gl_lock_define_initialized): Use it.
+ (gl_rwlock_initializer): New macro.
+ (gl_rwlock_define_initialized): Use it.
+ (gl_recursive_lock_initializer): New macro.
+ (gl_recursive_lock_define_initialized): Use it.
+
+2005-07-30 Karl Berry <karl@gnu.org>
+
+ * doc/gnulib.texi (Initial import): mention -I$(top_builddir)/lib.
+ Report from Ben Pfaff, regarding getopt.
+
+2005-07-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ Add support to getopt for Emacs, which doesn't use LIBOBJS in the
+ normal way.
+ * m4/getopt.m4 (gl_GETOPT_SUBSTITUTE_HEADER): New macro.
+ (gl_GETOPT_SUBSTITUTE): Use it. Invoke gl_PREREQ_GETOPT.
+ (gl_GETOPT_IFELSE, gl_GETOPT_CHECK_HEADERS): New macros.
+ (gl_GETOPT): Use the new macros. Most of the implementation
+ is moved to the new macros. This is for programs like Emacs
+ that don't want all the functionality of gl_GETOPT.
+
+2005-07-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/lock.m4: Update from GNU gettext.
+
+2005-07-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h: Update from GNU gettext.
+ * lib/lock.c: Update from GNU gettext.
+
+2005-07-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/regex.m4 (gl_INCLUDED_REGEX): Use AC_RUN_IFELSE instead of the
+ obsolescent AC_TRY_RUN. Include the default includes files, for
+ 'exit'.
+
+2005-07-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/visibility: New file.
+ * MODULES.html.sh (Misc): Add visibility.
+
+2005-07-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/visibility.m4: New file.
+
+2005-07-24 Bruno Haible <bruno@clisp.org>
+
+ * doc/visibility.texi: New file.
+
+2005-07-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/alloca-opt (Makefile.am): Remove explicit dependency on
+ $(ALLOCA_H), redundant through BUILT_SOURCES.
+ * modules/argz (Makefile.am): Remove explicit dependency on $(ARGZ_H),
+ redundant through BUILT_SOURCES.
+ * modules/byteswap (Makefile.am): Remove explicit dependency on
+ $(BYTESWAP_H), redundant through BUILT_SOURCES.
+ * modules/fnmatch (Makefile.am): Remove explicit dependency on
+ $(FNMATCH_H), redundant through BUILT_SOURCES.
+ * modules/getopt (Makefile.am): Remove explicit dependency on
+ $(GETOPT_H), redundant through BUILT_SOURCES.
+ * modules/glob (Makefile.am): Remove explicit dependency on $(GLOB_H),
+ redundant through BUILT_SOURCES.
+ * modules/poll (Makefile.am): Remove explicit dependency on $(POLL_H),
+ redundant through BUILT_SOURCES.
+ * modules/stdbool (Makefile.am): Remove explicit dependency on
+ $(STDBOOL_H), redundant through BUILT_SOURCES.
+ * modules/stdint (Makefile.am): Remove explicit dependency on
+ $(STDINT_H), redundant through BUILT_SOURCES.
+ * modules/sysexits (Makefile.am): Add $(SYSEXITS_H) to BUILT_SOURCES.
+ Remove explicit dependency on $(SYSEXITS_H).
+ Reported by Alexandre Duret-Lutz <adl@src.lip6.fr>.
+
+2005-07-18 Simon Josefsson <jas@extundo.com>
+
+ * lib/check-version.c (check_version): Accept identical versions too.
+
+2005-07-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/lock: New file.
+ * MODULES.html.sh (Multithreading): New section.
+
+2005-07-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/lock.m4: New file, from GNU gettext.
+
+2005-07-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h: New file, from GNU gettext.
+ * lib/lock.c: New file, from GNU gettext.
+
+2005-07-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h (gl_once_t): New type.
+ (gl_once_define, gl_once): New macros.
+ * lib/lock.c (fresh_once): New variable.
+ (glthread_once, glthread_once_call, glthread_once_singlethreaded): New
+ functions.
+
+2005-07-16 Simon Josefsson <jas@extundo.com>
+
+ * doc/gnulib.texi (Library version handling): Add ELF symbol collision
+ workaround, suggested by Bruno.
+
+2005-07-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/xalloc (Depends-on): Add xalloc-die.
+ * modules/xvasprintf (Depends-on): Add xalloc-die.
+
+2005-07-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/quotearg.c: Add translator comment suggested by Bruno Haible,
+ with a minor change.
+
+2005-07-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/poll.m4 (gl_FUNC_POLL): Check against MacOS X 10.4 poll() bug.
+ When using lib/poll.c, define poll as rpl_poll.
+
+2005-07-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/argp (Depends-on): Remove unlocked-io.
+
+2005-07-14 Derek Price <derek@ximbiot.com>
+
+ * m4/glob.m4 (gl_GLOB): Cache glob interface check result. Add check
+ for glob symlink bug.
+
+2005-07-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/argp.m4 (gl_ARGP): Remove invocation of gl_FUNC_GLIBC_UNLOCKED_IO.
+ Instead, test for *_unlocked function declarations directly.
+
+2005-07-11 Simon Josefsson <jas@extundo.com>
+
+ * modules/size_max: New file.
+
+ * modules/xsize: Depend on size_max module for size_max.m4.
+
+2005-07-11 Simon Josefsson <jas@extundo.com>
+
+ * lib/size_max.h: New file.
+
+2005-07-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/version-etc-fsf.c (version_etc_copyright): Parameterize the
+ copyright symbol and the year.
+ * lib/version-etc.c (COPYRIGHT_YEAR): New constant.
+ (version_etc_va): Use parameterized copyright notice.
+ Reword to conform to the current GNU coding standards.
+
+2005-07-11 Karl Berry <karl@gnu.org>
+
+ * doc/gnulib.texi (Quoting): new node.
+ (Initial import): more info, from Patrice.
+
+2005-07-11 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_usage): Document option --avoid.
+ (Command line options): Handle --avoid.
+ (func_acceptable): New function.
+ (func_modules_transitive_closure): Use it.
+
+2005-07-11 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh: Use shortcut URLs to the www.opengroup.org site.
+ Reported by Jim Meyering.
+
+2005-07-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/size_max.m4 (gl_SIZE_MAX): Cast ~(size_t)0 back to size_t.
+ Needed when size_t is smaller than 'unsigned int'.
+ Reported by Paul Eggert.
+
+2005-07-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * modules/argp (Depends-on): Add unlocked-io
+
+2005-07-09 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * lib/argp-namefrob.h: Include unlocked-io.h. Removed unnecessary
+ block of defines.
+
+2005-07-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Comment out regcomp.c, since we have a porting
+ fix now.
+
+2005-07-08 Eric Blake <ebb9@byu.net> (tiny change)
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regcomp.c (init_dfa, build_range_exp): Store __btowc value
+ in wint_t, not wchar_t. Remove now-unnecessary cast.
+
+2005-07-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/regex (Files): Add lib/regex_internal.c,
+ lib/regex_internal.h, lib/regexec.c, lib/regcomp.c, m4/codeset.m4.
+ (Depends-on): Add extensions.
+ (Makefile.am): Remove lib_SOURCES; now done by m4 code.
+
+2005-07-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/backupfile.m4 (gl_BACKUPFILE): Use AC_CHECK_FUNCS_ONCE on
+ pathconf.
+ * m4/same.m4 (gl_SAME): Likewise.
+ Require AC_SYS_LONG_FILE_NAMES; bug reported by Gerrit P. Haase.
+
+ * m4/regex.m4: Adjust to new libc regex implementation.
+ (gl_INCLUDED_REGEX): Add AC_LIBSOURCES for
+ all the .c and .h parts of (the new) regex.
+ Quote the m4 stuff better.
+ Check for RE_ICASE bug of old gnulib.
+ Check for REG_STARTEND of recent libc.
+ Rename local variables from jm_* to gl_*.
+ Quote operand of "test -f".
+ Say "recent enough" version of libc, not "version 2".
+ (gl_PREREQ_REGEX): Remove AC_FUNC_ALLOCA, since alloca is a
+ prerequisite module. Remove AC_HEADER_STDC; no longer needed.
+ Check for locale.h, isblank, mbrtowc, wcrtomb, wcscoll.
+ Remove check for btowc, isascii.
+ Require AM_LANGINFO_CODESET.
+
+2005-07-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/regex.c, regex.h: Sync from libc.
+ * lib/regcomp.c, lib/regexec_internal.c, lib/regex_internal.h:
+ * lib/regexec.c:
+ New files, synced from libc, except that regex_internal.h
+ currently has a small porting fix.
+
+2005-07-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add regcomp.c, regex.c, regex.h,
+ regex_internal.c, regexec.c.
+ Add regex_internal.h too, but as a comment, since the libc version
+ is currently broken in gnulib mode.
+
+2005-07-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ Support programs like Emacs that use gnulib but not gettext.
+ * MODULES.html.sh (Internationalization functions): Add gettext-h.
+ * modules/gettext-h: New file.
+ * modules/gettext (Files): Remove lib/gettext.h.
+ (Depends-on): Add gettext-h.
+ (Makefile.am): Remove lib_SOURCES.
+ * modules/argmatch, modules/c-stack, modules/closeout:
+ * modules/copy-file, modules/csharpcomp, modules/csharpexec:
+ * modules/execute, modules/file-type, modules/getaddrinfo:
+ * modules/getopt, modules/human, modules/javacomp:
+ * modules/javaexec, modules/mkdir-p, modules/obstack:
+ * modules/openat, modules/pagealign_alloc, modules/pipe:
+ * modules/quotearg, modules/regex, modules/rpmatch:
+ * modules/unicodeio, modules/userspec, modules/version-etc:
+ * modules/wait-process, modules/xalloc-die, modules/xmemcoll:
+ * modules/xsetenv:
+ Depend on gettext-h, not gettext.
+
+2005-07-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool (func_import): Add support for 'public domain' license.
+ * modules/alloca, modules/atexit, modules/memmove:
+ Now public domain, not GPL.
+ * modules/dup2, modules/getpagesize, modules/malloc, modules/memset:
+ * modules/realloc, modules/strerror, modules/strtod:
+ Now LGPL, not GPL.
+
+2005-07-05 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbrtowc.m4 (gl_FUNC_MBRTOWC): Upgrade to version from current
+ autoconf CVS. Needed for mingw.
+
+2005-07-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ Remove the dependency of the strftime module on the tzset module.
+ * modules/strftime (Depends-on): Remove dependency on tzset.
+
+2005-07-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ Remove the dependency of the strftime module on the tzset module.
+ * m4/strftime.m4 (gl_FUNC_STRFTIME): Don't require
+ gl_FUNC_TZSET_CLOBBER.
+
+2005-07-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ Remove the dependency of the strftime module on the tzset module.
+ * lib/strftime.c (my_strftime)
+ [! defined _LIBC && ! HAVE_RUN_TZSET_TEST]:
+ Copy the input structure, to work around some of the bug with
+ Solaris 2.5.1 and Solaris 2.6. If you still care about these old
+ Solaris releases, you should also use the tzset module, but we won't
+ require it as a dependency any more since we don't want LGPLed code
+ to depend on GPLed code.
+
+2005-07-02 Jim Meyering <jim@meyering.net>
+
+ * m4/chown.m4, cloexec.m4, dup2.m4, fsusage.m4:
+ * m4/getcwd-path-max.m4, getcwd.m4, mkstemp.m4, mountlist.m4:
+ * m4/pagealign_alloc.m4, save-cwd.m4, unistd-safer.m4:
+ Don't check for fcntl.h, and don't test for HAVE_FCNTL_H.
+
+2005-07-02 Jim Meyering <jim@meyering.net>
+
+ * lib/backupfile.c (backup_args): Change a `0' to NULL.
+
+2005-07-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xnanosleep.c: Include timespec.h, since OpenBSD 3.4 <time.h>
+ declares only 'struct timespec;' (!).
+
+2005-07-01 Jim Meyering <jim@meyering.net>
+
+ * lib/chown.c, cloexec.c, dup-safer.c, dup2.c, fsusage.c, getcwd.c:
+ * lib/getloadavg.c, mountlist.c, openat.h, pagealign_alloc.c:
+ * lib/save-cwd.c, tempname.c:
+ Assume HAVE_FCNTL_H (i.e., include <fcntl.h> unconditionally,
+ and don't include <sys/file.h>).
+
+2005-06-29 Jim Meyering <jim@meyering.net>
+
+ * lib/mkdir-p.c (make_dir_parents): Don't apply sizeof to a hard-coded
+ type name. Use the variable name instead.
+ * lib/idcache.c (getuser, getuidbyname, getgroup, getgidbyname):
+ Likewise.
+
+2005-06-28 Simon Josefsson <jas@extundo.com>
+
+ * modules/check-version (Files): Add check-version.m4.
+
+2005-06-28 Simon Josefsson <jas@extundo.com>
+
+ * m4/check-version.m4: New file, suggested by Jim Meyering
+ <jim@meyering.net>.
+
+2005-06-28 Simon Josefsson <jas@extundo.com>
+
+ * lib/check-version.h, lib/check-version.c: New files.
+
+2005-06-28 Simon Josefsson <jas@extundo.com>
+
+ * lib/base64.c (base64_encode): Indent. Rename 'b64' to avoid
+ collision with global variable. Better indentation. Don't
+ increment buffer pointer beyond buffer end. Based on comments
+ from Paul Eggert <eggert@cs.ucla.edu>.
+
+ * lib/base64.h: Indent.
+
+2005-06-28 Simon Josefsson <jas@extundo.com>
+
+ * doc/gnulib.texi (Library version handling): New section.
+
+2005-06-28 Jim Meyering <jim@meyering.net>
+
+ * check-module (find_included_lib_files): Hard-code another
+ pair of exceptions: fts.c includes fts-cycle.c and unistd-safer.h
+ but modules/fts-lgpl (correctly) does not list those files.
+
+ * modules/canonicalize (Files): Add lib/pathmax.h.
+
+2005-06-25 Simon Josefsson <jas@extundo.com>
+
+ * modules/check-version: New file.
+
+2005-06-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/canon-host.c (canon-host): Append trailing "," to 0 in
+ initializer of struct addrinfo, as an indication that we don't
+ care how many members the structure has.
+
+2005-06-24 Derek Price <derek@ximbiot.com>
+ and Bruno Haible <bruno@clisp.org>
+
+ Remove stat module & update lstat.
+ * m4/lstat.m4 (gl_FUNC_LSTAT): Drop AC_FUNC_LSTAT in favor of
+ AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK.
+ * m4/stat.m4: Remove this file.
+
+2005-06-24 Derek Price <derek@ximbiot.com>
+ and Bruno Haible <bruno@clisp.org>
+
+ Remove stat module & update lstat.
+ * lib/stat.c: Remove this file...
+ (slash_aware_lstat): ...moving this content and its support...
+ * lib/lstat.c (rpl_lstat): ...into here.
+ * lib/lstat.h: New file.
+
+2005-06-24 Derek Price <derek@ximbiot.com>
+ and Bruno Haible <bruno@clisp.org>
+
+ Remove stat module & update lstat.
+ * config/srclist.txt (libc sources): Remove stat.
+
+2005-06-24 Derek Price <derek@ximbiot.com>
+ and Bruno Haible <bruno@clisp.org>
+
+ Remove stat module & update lstat.
+ * MODULES.html.sh (stat): Remove.
+ * MODULES.html: Regenerated.
+ * modules/lstat (Description): Correct function name.
+ (Files): Add "lstat.h".
+ (Depends-on): Remove stat, add xalloc, stat-macros.
+ * modules/stat: Remove this file.
+ (Include): Add "lstat.h", remove <sys/stat.h>.
+
+2005-06-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mktime.c: Include <string.h> even if !DEBUG. (From glibc.)
+ (ranged_convert): Don't save conversion in a temporary struct.
+ This causes a warning with GCC 4.0.0, and anyway in the typical
+ case it's not worth the extra 100 bytes or so of code.
+ (ranged_convert, __mktime_internal): When calling a function via a
+ pointer P, use P () rather than (*P) (), as we now assume C89 or
+ better.
+
+2005-06-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/readutmp.c (desirable_utmp_entry): Fix bug where "who -b" and
+ "who -r" failed to give output. Problem reported by Tim Waugh.
+
+ * lib/xmalloc.c (HAVE_GNU_CALLOC): New constant.
+ (xcalloc): Use it to avoid needless tests.
+ Problem reported by Jim Meyering.
+
+2005-06-20 Derek Price <derek@ximbiot.com>
+
+ * m4/bison.m4: Note that precious decls of YACC & YFLAGS will be
+ unnecessary for Autoconfs > 2.59c.
+
+2005-06-16 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * lib/argp.h (__option_is_short): Check upper limit of
+ __key. Isprint() requires its argument to have the value
+ of an unsigned char or EOF.
+
+2005-06-16 Jim Meyering <jim@meyering.net>
+
+ * lib/calloc.c (rpl_calloc): Allocate a 1-byte buffer (not 1xS or Nx1)
+ when either N or S is zero.
+
+2005-06-16 Derek Price <derek@ximbiot.com>
+
+ * m4/bison.m4: Declare YACC & YFLAGS precious.
+
+2005-06-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fnmatch.c (fnmatch): If there is an encoding error in a
+ multibyte string or pattern, fall back on unibyte matching.
+ Problem reported by James Youngman.
+
+2005-06-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/csharpcomp: New file.
+ * MODULES.html.sh (C#): Add csharpcomp.
+
+2005-06-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/csharpcomp.m4: New file, from GNU gettext.
+
+2005-06-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/csharpcomp.h: New file, from GNU gettext.
+ * lib/csharpcomp.c: New file, from GNU gettext.
+ * lib/csharpcomp.sh.in: New file, from GNU gettext.
+
+2005-06-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/binary-io.h (fileno): Undefine before defining it. Avoids a gcc
+ warning on mingw.
+
+2005-06-07 Derek Price <derek@ximbiot.com>
+
+ Sync from CVS.
+ * lib/glob_.h: Indent nested #ifdef.
+
+2005-06-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ Use "file name" when talking about file names, instead of "filename"
+ or "path", as per the GNU coding standards.
+ * lib/mkdir-p.c: Renamed from makepath.c.
+ (make_dir_parents): Renamed from make_path. All callers changed.
+ * lib/mkdir-p.h: Likewise. All includers changed.
+ * lib/filenamecat.c: Renamed from path-concat.c.
+ (file_name_concat): Renamed from path_concat. All callers changed.
+ [TEST_FILE_NAME_CONCAT]: Renamed from TEST_PATH_CONCAT.
+ * lib/filenamecat.h: Likewise. All includers changed.
+ * lib/acl.c: Don't use "path" or "filename" to mean "file name"
+ in comments or local variable names.
+ * lib/basename.c: Likewise.
+ * lib/canonicalize.c, canonicalize.h: Likewise.
+ * lib/dirname.c, dirname.h: Likewise.
+ * lib/euidaccess.c: Likewise.
+ * lib/exclude.c: Likewise
+ * lib/fnmatch_.h, fnmatch_loop.c: Likewise.
+ * lib/fsusage.c, fsuage.h: Likewise.
+ * lib/fts.c, fts_.h: Likewise.
+ * lib/getcwd.c: Likewise.
+ * lib/getloadavg.c: Likewise.
+ * lib/mkstemp.c: Likewise.
+ * lib/mountlist.c, mountlist.h: Likewise.
+ * lib/openat.c, openat.h: Likewise.
+ * lib/readlink-stub.c: Likewise.
+ * lib/readutmp.c, readutmp.h: Likewise.
+ * lib/rename.c: Likewise.
+ * lib/rmdir.c: Likewise.
+ * lib/same.c: Likewise.
+ * lib/savedir.c: Likewise.
+ * lib/stripslash.c: Likewise.
+ * lib/tempname.c: Likewise.
+ * lib/xreadlink.c: Likewise.
+ * lib/exclude.c (excluded_file_name): Renamed from excluded_filename.
+ All uses changed.
+ * lib/exclude.h: Likewise.
+
+ * lib/euidaccess.c (getuid, getgid, getuid, getegid)
+ [!defined _POSIX_VERSION]: Remove decls; not needed these days.
+ * lib/idcache.c (getpwuid, getpwnam, getgrgid, getgrnam)
+ [!defined _POSIX_VERSION]: Remove decls; not needed these days.
+ * lib/pathmax.h: Include <limits.h> unconditionally, since other
+ files have been getting away with it for years (MORE/BSD 4.3
+ is extinct now).
+ * lib/userspec.c (getpwnam, getgrnam, getgrgid)
+ [!defined _POSIX_VERSION]: Remove decls; not needed these days.
+
+ * lib/pathmax.h (_POSIX_PATH_MAX) [!defined _POSIX_PATH_MAX]:
+ Define to 256, not 255, as per modern POSIX.
+
+2005-06-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ Use "file name" when talking about file names, instead of "filename"
+ or "path", as per the GNU coding standards.
+ * MODULES.html.sh: mkdir-p renamed from makepath.
+ filenamecat renamed from path-concat.
+ * modules/filenamecat: Renamed from modules/path-concat.
+ (Files): filenamecat.h and filenamecat.c renamed from
+ path-concat.h and path-concat.c.
+ (configure.ac): gl_FILE_NAME_CONCAT, not gl_PATH_CONCAT.
+ (Include): filenamecat.h, not path-concat.h.
+ * modules/mkdir-p: Renamed from modules/makepath.
+ (Files): mkdir-p.h and mkdir-p.c renamed from makepath.h and
+ makepath.c.
+ (configure.ac): gl_MKDIR_PARENTS, not gl_MAKEPATH.
+ (Include): mkdir-p.h, not makepath.h.
+
+2005-06-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * m4/mkdir-p.m4: Renamed from makepath.m4.
+ (gl_MKDIR_PARENTS): Renamed from gl_MAKEPATH. All uses changed.
+ Rename files from makepath.c to mkdir-p.c, and from
+ makepath.h to mkdir-p.h.
+ * m4/filenamecat.m4: Renamed from path-concat.m4.
+ (gl_FILE_NAME_CONCAT): Renamed from gl_PATH_CONCAT. All uses changed.
+ Rename files from path-concat.c to filenamecat.c,
+ and from path-concat.h to filenamecat.h.
+ * m4/getcwd-path-max.m4: Don't use "path" or "filename" to mean
+ "file name" in local variables or comments.
+ * m4/rename.m4: Likewise.
+
+2005-06-01 Bruno Haible <bruno@clisp.org>
+
+ * modules/csharpexec: New file.
+ * MODULES.html.sh (C#): New section.
+
+2005-06-01 Bruno Haible <bruno@clisp.org>
+
+ * m4/csharp.m4: New file, from GNU gettext.
+ * m4/csharpexec.m4: New file, from GNU gettext.
+
+2005-06-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/csharpexec.h: New file, from GNU gettext.
+ * lib/csharpexec.c: New file, from GNU gettext.
+ * lib/csharpexec.sh.in: New file, from GNU gettext.
+
+2005-05-31 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from cvs.
+ * m4/glob.m4: s/MISSING_SYS_CDEFS_H/_SYS_CDEFS_H/ and comment.
+
+2005-05-31 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from cvs.
+ * lib/glob_.h: s/MISSING_SYS_CDEFS_H/_SYS_CDEFS_H/ and comment.
+
+2005-05-29 Derek Price <derek@ximbiot.com>
+
+ * config/srclist.txt (glob_.h, glob.c): Add these files.
+
+2005-05-29 Derek Price <derek@ximbiot.com>
+
+ * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
+ * modules/glob: New file.
+ * modules/getlogin_r: Add link to POSIX spec in description.
+
+2005-05-29 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/glob.m4: New file.
+
+2005-05-29 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/glob_.h, lib/glob.c: New files.
+
+2005-05-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/fts (Files): Remove m4/inttypes-pri.m4.
+ * modules/fts-lgpl (Depends-on): Remove gettext.
+
+2005-05-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Don't check for inttypes.h or stdint.h,
+ and don't require gt_INTTYPES_PRI.
+
+2005-05-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getlogin_r.c (getlogin_r): Don't set errno to 0 on return.
+
+ * lib/fts.c: Don't worry about debugging on pre-C99-compatible hosts;
+ the configuration hassle isn't worth it.
+ Include inttypes.h and stdint.h unconditionally if FTS_DEBUG.
+ (LONGEST_MODIFIER, PRIuMAX): Remove.
+
+2005-05-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/getlogin_r.h: Remove second include of <stddef.h>.
+
+2005-05-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Define
+ _POSIX_PTHREAD_SEMANTICS for Solaris.
+
+2005-05-25 Derek Price <derek@ximbiot.com>
+
+ * MODULES.html.sh: Add getlogin_r to POSIX.2001 support section.
+
+2005-05-25 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/getlogin_r, m4/getlogin_r.m4: New files.
+ * lib/getlogin_r.c, getlogin_r.h: New files.
+
+2005-05-25 Bruno Haible <bruno@clisp.org>
+ Derek Price <derek@ximbiot.com>
+
+ * lib/getlogin_r.h: Simplify API documentation.
+
+2005-05-23 Derek Price <derek@ximbiot.com>
+
+ * modules/minmax (Files): Add m4/minmax.m4.
+ (configure.ac): Add gl_MINMAX.
+
+2005-05-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fts.c (fd_safer) [_LGPL_PACKAGE]: New static function,
+ so that unistd-safer.h (GPL'ed code) need not be included.
+
+2005-05-22 Bruno Haible <bruno@clisp.org>
+
+ * m4/minmax.m4: New file.
+ Based on a patch by Derek Price <derek@ximbiot.com>.
+
+2005-05-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (_STDINT_H_HAVE_INT64): New macro. Use it in #ifdefs.
+ (INT64_MIN): Fix definition.
+ Suggested by Paul Eggert <eggert@cs.ucla.edu>.
+
+ * lib/stdint_.h (_STDINT_H_NEED_SIGNED_INT_TYPES): Renamed from
+ NEED_SIGNED_INT_TYPES.
+
+ * lib/stdint_.h (_STDINT_H_HAVE_SYSTEM_INTTYPES): Renamed from
+ HAVE_SYSTEM_INTTYPES.
+
+2005-05-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/minmax.h: Include <limits.h> only when it defines MIN, MAX.
+ Also include <sys/param.h> if it defines MIN, MAX.
+ Based on a patch by Derek Price <derek@ximbiot.com>.
+
+2005-05-21 Jim Meyering <jim@meyering.net>
+
+ * modules/fts (Files): Add m4/inttypes-pri.m4.
+ (Depends-on): Add lstat and remove gettext. Alphabetize.
+
+2005-05-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ New fts module.
+ * lib/fts.c: Don't include "cycle-check.h" or "hash.h".
+ (setup_dir, free_dir): New functions.
+ (enter_dir, leave_dir): Define trivial
+ alternatives of _LGPL_PACKAGE. Move to fts-cycle.c if !_LGPL_PACKAGE.
+ (HT_INITIAL_SIZE, ENTER_DIR): Remove. All uses removed.
+ (LEAVE_DIR): Fix typo: pass Fts and Ent to leave_dir.
+ (struct Active_dir, AD_compare, AD_hash, enter_dir, leave_dir):
+ Move to fts-cycle.c.
+ (fts_open): Use setup_dir.
+ (fts_close): Use free_dir.
+ (fts_read): Have just one copy of the ENTER_DIR code rather than three.
+ This adds a label and some gotos, but the alternatives were messier.
+ Check for memory allocation failure when entering a dir.
+ (fts_stat) [_LGPL_PACKAGE]: Bring back glibc cycle detection code.
+ * lib/fts_.h (_LGPL_PACKAGE) [defined _LIBC]: New macro.
+ (FTS): New member fts_cycle, that is a union that contains the
+ old active_dir_ht and cycle_state. All uses changed to mention
+ fts_cycle.ht and fts_cycle.state.
+ * lib/fts-cycle.c: New file, containing GPL'ed code migrated out of
+ fts.c, with the following changes:
+ (setup_dir, free_dir): New functions.
+ (enter_dir): Now returns bool. Return true if successful, false
+ if memory exhausted. All callers changed.
+ Do not bother partly cleaning up on
+ memory allocation failure; that is free_dir's job.
+ However, free ad if hash_insert fails, to avoid memory leak.
+ (enter_dir, leave_dir): Accommodate change to FTS by inspecting
+ fts->fts_options to see which union member to use.
+
+2005-05-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/fts.m4 (gl_FUNC_FTS_CORE): Renamed from gl_FUNC_FTS.
+ (gl_FUNC_FTS, gl_FUNC_FTS_LGPL): New macros.
+
+2005-05-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (File system functions): Add fts, fts-lgpl.
+
+2005-05-20 Jim Meyering <jim@meyering.net>
+
+ * lib/unlinkdir.h (cannot_unlink_dir) [UNLINK_CANNOT_UNLINK_DIR]:
+ Now a macro, to pacify GCC.
+
+2005-05-20 Eric Blake <ebb9@byu.net> (tiny change)
+
+ * m4/chown.m4 (gl_FUNC_CHOWN): Correct sense of test for honoring IDs
+ of -1.
+
+2005-05-20 Eric Blake <ebb9@byu.net> (tiny change)
+
+ * lib/chown.c (rpl_chown): Return -1 on failure.
+
+2005-05-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/canonicalize.m4 (AC_FUNC_CANONICALIZE_FILE_NAME]):
+ Don't check for stddef.h.
+ * m4/fts.m4 (gl_FUNC_FTS): Don't require AC_HEADER_STDC, as we
+ don't use its results.
+ Don't check for fcntl.h, stddef.h, stdlib.h, string.h, unistd.h,
+ since we include them unconditionally. Don't require
+ AM_STDBOOL_H, since stdbool is a prerequisite.
+ Don't require AC_C_CONST, AC_TYPE_SIZE_T or check for ptrdiff_t
+ since we assume C89 or better.
+ Don't require AC_FUNC_CLOSEDIR_VOID, AC_FUNC_LSTAT, or AC_FUNC_STAT,
+ as we don't use their results.
+ Don't check for fchdir, memmove, memset, strrchr, as we use
+ them unconditionally.
+ * m4/gettimeofday.m4 (AC_FUNC_GETTIMEOFDAY_CLOBBER): Don't define
+ GETTIMEOFDAY_CLOBBERS_LOCALTIME_BUFFER, since nobody uses it.
+
+2005-05-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/canonicalize.c: Include canonicalize.h first, to test interface.
+ Include <stddef.h> unconditionally, since we assume C89 now.
+ All uses of PTR_INT_TYPE replaced by ptrdiff_t.
+ * lib/fts.c: Include fts_.h first, to check interface.
+ Do not include intprops.h; no longer needed.
+ Include cycle-check.h and hash.h, since fts_.h no longer does.
+ Remove unnecessary casts of closedir to void.
+ (fts_build): Use a simpler method (not involving TYPE_SIGNED) to
+ decide whether to decrement nlinks.
+ * lib/fts_.h: Do not include hash.h or cycle-check.h; no longer needed.
+ (FTS): Use struct hash_table * instead of Hash_table, so that
+ we no longer need to include hash.h here.
+
+2005-05-18 Jim Meyering <jim@meyering.net>
+
+ * modules/dirfd (License): Change to LGPL. Most of the code
+ is already in the public domain.
+
+2005-05-18 Jim Meyering <jim@meyering.net>
+
+ * m4/fts.m4 (AC_LIBSOURCES): Add intprops.h to the list.
+ Reported by Yoann Vandoorselaere.
+
+2005-05-17 Jim Meyering <jim@meyering.net>
+
+ * m4/fts.m4: New file, from coreutils.
+
+2005-05-17 Jim Meyering <jim@meyering.net>
+
+ * lib/fts.c, lib/fts_.h: New files, from coreutils.
+
+2005-05-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * m4/unlinkdir.m4: New file.
+
+2005-05-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * lib/unlinkdir.c, lib/unlinkdir.h: New files.
+ * lib/gethrxtime.c, lib/gethrxtime.h, lib/getpass.h, lib/mountlist.h,
+ lib/path-concat.c, lib/regex.h, lib/unlocked-io.h, lib/xtime.h:
+ White space changes only.
+ * lib/makepath.c (make_path): Port to hosts where leading "//" is
+ special.
+ * lib/yesno.c: Include getline.h, not ctype.h.
+ (yesno): Don't remove leading white space; POSIX doesn't allow it.
+ Use getline to remove arbitrary restriction on response length.
+
+2005-05-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist-update: Spell out "Street" in FSF postal
+ mail address; this is the style the FSF seems to prefer.
+
+ * build-aux/depcomp, build-aux/install-sh, build-aux/mdate-sh,
+ build-aux/missing, build-aux/mkinstalldirs: Sync from Automake;
+ this updates FSF postal mail address.
+
+ Sync from coreutils.
+ * modules/unlinkdir: New file.
+ * modules/yesno (Depends-on): Add getline.
+ * MODULES.html.sh (File system functions): Add unlinkdir.
+
+2005-05-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/byteswap_.h, lib/getsubopt.h, lib/iconvme.h, lib/strsep.c,
+ lib/strsep.h:
+ Change the initial comment to refer to GPL, not LGPL.
+ gnulib-tool will change it to LGPL as needed.
+
+ * lib/__fpending.c, lib/acl.c, lib/acl.h, lib/alloca_.h, lib/allocsa.c,
+ lib/allocsa.h, lib/argmatch.c, lib/argmatch.h, lib/argp-ba.c,
+ lib/argp-eexst.c, lib/argp-fmtstream.c, lib/argp-fmtstream.h,
+ lib/argp-fs-xinl.c, lib/argp-help.c, lib/argp-namefrob.h,
+ lib/argp-parse.c, lib/argp-pv.c, lib/argp-pvh.c, lib/argp-xinl.c,
+ lib/argp.h, lib/argz.c, lib/argz_.h, lib/asnprintf.c, lib/asprintf.c,
+ lib/atanl.c, lib/backupfile.c, lib/backupfile.h, lib/base64.c,
+ lib/base64.h, lib/basename.c, lib/binary-io.h, lib/byteswap_.h,
+ lib/c-ctype.c, lib/c-ctype.h, lib/c-stack.c, lib/c-stack.h,
+ lib/c-strtod.c, lib/calloc.c, lib/canon-host.c, lib/canonicalize.c,
+ lib/canonicalize.h, lib/ceill.c, lib/chdir-long.c, lib/chdir-long.h,
+ lib/chown.c, lib/classpath.c, lib/classpath.h, lib/cloexec.c,
+ lib/closeout.c, lib/closeout.h, lib/concatpath.c, lib/config.charset,
+ lib/copy-file.c, lib/copy-file.h, lib/cycle-check.c, lib/cycle-check.h,
+ lib/diacrit.c, lib/diacrit.h, lib/dirfd.c, lib/dirfd.h, lib/dirname.c,
+ lib/dirname.h, lib/dummy.c, lib/dup-safer.c, lib/dup2.c, lib/eealloc.h,
+ lib/error.c, lib/error.h, lib/euidaccess.c, lib/exclude.c,
+ lib/exclude.h, lib/execute.c, lib/execute.h, lib/exit.h,
+ lib/exitfail.c, lib/exitfail.h, lib/expl.c, lib/fatal-signal.c,
+ lib/fatal-signal.h, lib/fd-safer.c, lib/file-type.c, lib/file-type.h,
+ lib/fileblocks.c, lib/filemode.c, lib/filemode.h, lib/findprog.c,
+ lib/findprog.h, lib/floorl.c, lib/fnmatch.c, lib/fnmatch_.h,
+ lib/fnmatch_loop.c, lib/fopen-safer.c, lib/free.c, lib/frexpl.c,
+ lib/fsusage.c, lib/fsusage.h, lib/full-read.c, lib/full-read.h,
+ lib/full-write.c, lib/full-write.h, lib/fwriteerror.c,
+ lib/fwriteerror.h, lib/gai_strerror.c, lib/gcd.c, lib/gcd.h,
+ lib/getaddrinfo.c, lib/getaddrinfo.h, lib/getcwd.c, lib/getcwd.h,
+ lib/getdate.h, lib/getdate.y, lib/getdomainname.c, lib/getdomainname.h,
+ lib/getgroups.c, lib/gethostname.c, lib/gethrxtime.c, lib/gethrxtime.h,
+ lib/getline.c, lib/getline.h, lib/getloadavg.c, lib/getndelim2.c,
+ lib/getndelim2.h, lib/getnline.c, lib/getnline.h, lib/getopt.c,
+ lib/getopt1.c, lib/getopt_.h, lib/getopt_int.h, lib/getpagesize.h,
+ lib/getpass.c, lib/getpass.h, lib/getsubopt.c, lib/getsubopt.h,
+ lib/gettext.h, lib/gettime.c, lib/gettimeofday.c, lib/getugroups.c,
+ lib/getusershell.c, lib/group-member.c, lib/group-member.h,
+ lib/hard-locale.c, lib/hard-locale.h, lib/hash-pjw.c, lib/hash-pjw.h,
+ lib/hash.c, lib/hash.h, lib/human.c, lib/human.h, lib/iconvme.c,
+ lib/iconvme.h, lib/idcache.c, lib/inet_ntop.h, lib/intprops.h,
+ lib/inttostr.c, lib/inttostr.h, lib/isdir.c, lib/javacomp.c,
+ lib/javacomp.h, lib/javacomp.sh.in, lib/javaexec.c, lib/javaexec.h,
+ lib/javaexec.sh.in, lib/lbrkprop.h, lib/lchown.c, lib/ldexpl.c,
+ lib/linebreak.c, lib/linebreak.h, lib/linebuffer.c, lib/linebuffer.h,
+ lib/localcharset.c, lib/localcharset.h, lib/logl.c, lib/long-options.c,
+ lib/long-options.h, lib/lstat.c, lib/makepath.c, lib/makepath.h,
+ lib/malloc.c, lib/mathl.h, lib/mbswidth.c, lib/mbswidth.h, lib/md5.c,
+ lib/md5.h, lib/memcasecmp.c, lib/memcasecmp.h, lib/memchr.c,
+ lib/memcmp.c, lib/memcoll.c, lib/memcoll.h, lib/memcpy.c, lib/memmem.c,
+ lib/memmem.h, lib/mempcpy.c, lib/mempcpy.h, lib/memrchr.c,
+ lib/memrchr.h, lib/memset.c, lib/minmax.h, lib/mkdir.c, lib/mkdtemp.c,
+ lib/mkdtemp.h, lib/mkstemp.c, lib/mktime.c, lib/modechange.c,
+ lib/modechange.h, lib/mountlist.c, lib/mountlist.h, lib/nanosleep.c,
+ lib/obstack.c, lib/obstack.h, lib/openat.c, lib/openat.h,
+ lib/pagealign_alloc.c, lib/pagealign_alloc.h, lib/path-concat.c,
+ lib/path-concat.h, lib/pathmax.h, lib/pathname.h, lib/physmem.c,
+ lib/physmem.h, lib/pipe.c, lib/pipe.h, lib/poll.c, lib/poll_.h,
+ lib/posixtm.c, lib/posixtm.h, lib/posixver.c, lib/printf-args.c,
+ lib/printf-args.h, lib/printf-parse.c, lib/printf-parse.h,
+ lib/progname.c, lib/progname.h, lib/progreloc.c, lib/putenv.c,
+ lib/quote.c, lib/quote.h, lib/quotearg.c, lib/quotearg.h, lib/raise.c,
+ lib/readlink.c, lib/readtokens.c, lib/readtokens.h, lib/readtokens0.c,
+ lib/readtokens0.h, lib/readutmp.c, lib/readutmp.h, lib/realloc.c,
+ lib/ref-add.sin, lib/ref-del.sin, lib/regex.c, lib/regex.h,
+ lib/rename.c, lib/rmdir.c, lib/rpmatch.c, lib/safe-read.c,
+ lib/safe-read.h, lib/safe-write.c, lib/safe-write.h, lib/same.c,
+ lib/same.h, lib/save-cwd.c, lib/save-cwd.h, lib/savedir.c,
+ lib/savedir.h, lib/setenv.c, lib/setenv.h, lib/settime.c,
+ lib/sh-quote.c, lib/sh-quote.h, lib/sha1.c, lib/sha1.h, lib/sig2str.c,
+ lib/sig2str.h, lib/sincosl.c, lib/snprintf.c, lib/snprintf.h,
+ lib/sqrtl.c, lib/stat-macros.h, lib/stat.c, lib/stdbool_.h,
+ lib/stdint_.h, lib/stdio-safer.h, lib/stpcpy.c, lib/stpcpy.h,
+ lib/stpncpy.c, lib/stpncpy.h, lib/strcase.h, lib/strcasecmp.c,
+ lib/strchrnul.c, lib/strchrnul.h, lib/strcspn.c, lib/strdup.c,
+ lib/strdup.h, lib/strerror.c, lib/strftime.c, lib/strftime.h,
+ lib/stripslash.c, lib/strndup.c, lib/strndup.h, lib/strnlen.c,
+ lib/strpbrk.c, lib/strpbrk.h, lib/strsep.c, lib/strsep.h, lib/strstr.c,
+ lib/strstr.h, lib/strtod.c, lib/strtoimax.c, lib/strtok_r.c,
+ lib/strtok_r.h, lib/strtol.c, lib/strtoll.c, lib/strtoul.c,
+ lib/strtoull.c, lib/strverscmp.c, lib/strverscmp.h, lib/sysexit_.h,
+ lib/tempname.c, lib/time_r.c, lib/time_r.h, lib/timegm.c, lib/timegm.h,
+ lib/timespec.h, lib/trigl.c, lib/trigl.h, lib/ucs4-utf16.h,
+ lib/ucs4-utf8.h, lib/unicodeio.c, lib/unicodeio.h, lib/unistd-safer.h,
+ lib/unlocked-io.h, lib/unsetenv.c, lib/userspec.c, lib/utf16-ucs4.h,
+ lib/utf8-ucs4.h, lib/utime.c, lib/utimecmp.c, lib/utimecmp.h,
+ lib/utimens.c, lib/vasnprintf.c, lib/vasnprintf.h, lib/vasprintf.c,
+ lib/vasprintf.h, lib/version-etc-fsf.c, lib/version-etc.c,
+ lib/version-etc.h, lib/vsnprintf.c, lib/vsnprintf.h, lib/w32spawn.h,
+ lib/wait-process.c, lib/wait-process.h, lib/xalloc-die.c, lib/xalloc.h,
+ lib/xallocsa.c, lib/xallocsa.h, lib/xasprintf.c, lib/xgetcwd.c,
+ lib/xgetcwd.h, lib/xgetdomainname.c, lib/xgetdomainname.h,
+ lib/xgethostname.c, lib/xmalloc.c, lib/xmemcoll.c, lib/xnanosleep.c,
+ lib/xreadlink.c, lib/xreadlink.h, lib/xsetenv.c, lib/xsetenv.h,
+ lib/xsize.h, lib/xstrndup.c, lib/xstrndup.h, lib/xstrtod.c,
+ lib/xstrtod.h, lib/xstrtoimax.c, lib/xstrtol.c, lib/xstrtol.h,
+ lib/xstrtoumax.c, lib/xtime.h, lib/xvasprintf.c, lib/xvasprintf.h,
+ lib/yesno.c, lib/yesno.h:
+ Update FSF postal mail address.
+
+2005-05-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh, README, gnulib-tool, tests/test-base64.c,
+ tests/test-memmem.c, tests/test-stpncpy.c:
+ Update FSF postal mail address.
+
+2005-05-13 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h (int64_t, uint64_t, int_least64_t, uint_least64_t,
+ int_fast64_t, uint_fast64_t, intmax_t, uintmax_t, INT64_MIN, INT64_MAX,
+ UINT64_MAX, INT_LEAST64_MIN, INT_LEAST64_MAX, UINT_LEAST64_MAX,
+ INT_FAST64_MIN, INT_FAST64_MAX, UINT_FAST64_MAX, INTMAX_MIN,
+ INTMAX_MAX, UINTMAX_MAX, INT64_C, UINT64_C, INTMAX_C, UINTMAX_C):
+ Add support for 64-bit integers in the MSVC compiler.
+
+2005-05-12 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * modules/getdate (Makefile.am): Add getdate.c to EXTRA_DIST
+
+2005-05-12 Eric Blake <ebb9@byu.net> (tiny change)
+
+ * gnulib-tool (func_import): Sort and uniquify recommended includes.
+
+2005-05-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/getdate.texi (General date syntax): Don't say that date
+ date --iso-8601=ns generates acceptable dates; it doesn't yet.
+ Problem reported by Nic Ferrier.
+
+2005-05-10 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+
+ * lib/getaddrinfo.c: Don't fail when SOCK_STREAM or SOCK_DGRAM are
+ specified in ai_socktype. Fix invalid ai_protocol
+ check. ai_protocol is usually set to 0 or depending on
+ ai_family/ai_socktype to IPPROTO_TCP / IPPROTO_UDP. Checking for
+ SOCK_STREAM / SOCK_DGRAM in ai_protocol was invalid. Set
+ ai_socktype / ai_protocol in the returned addrinfo structure.
+
+2005-05-10 Simon Josefsson <jas@extundo.com>
+
+ * m4/getaddrinfo.m4: Look in libnsl/libsocket for getaddrinfo, from
+ Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
+2005-05-10 Karl Berry <karl@gnu.org>
+
+ * doc/fdl.texi, gpl.texi, lgpl.texi, COPYING: update FSF address
+ (from http://www.gnu.org/licenses).
+ * doc/COPYING.LIB: also rename to COPYING.LESSER.
+ * doc/COPYING.DOC: remove; per rms, only needed in doc files, so
+ fdl.texi suffices.
+
+2005-05-10 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (COPYING.LESSER): rename from COPYING.LIB.
+ (COPYING.DOC): remove.
+
+ * config/srclist-update: new FSF address.
+
+2005-05-10 Derek Price <derek@ximbiot.com>
+
+ * m4/getopt.m4 (gl_GETOPT): Check for Solaris 10 bug, not decl, when
+ possible.
+
+2005-05-09 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/inet_ntop: New file.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ inet_ntop.
+
+2005-05-09 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/inet_ntop.m4: New file.
+
+2005-05-09 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/inet_ntop.h: New file.
+ * lib/inet_ntop.c: New file, from glibc with modifications.
+
+2005-05-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/time_r (License): Change to LGPL.
+ * modules/extensions (License): Change to LGPL. Actually,
+ the license is more permissive than that, but currently gnulib-tool
+ doesn't know how to handle more-permissive licenses.
+
+ * modules/stat-macros (Depends-on): Don't depend on stat-macros (!).
+ Problem reported by Dave Love.
+
+2005-05-08 Jim Meyering <jim@meyering.net>
+
+ * lib/classpath.c (PATH_SEPARATOR): Remove insignificant trailing
+ blank.
+
+2005-05-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/argmatch (Depends-on): Add stdbool.
+ * modules/backupfile (Depends-on): Likewise.
+ * modules/chdir-long (Depends-on): Likewise.
+ * modules/closeout (Depends-on): Likewise.
+ * modules/cycle-check (Depends-on): Likewise.
+ * modules/dirname (Depends-on): Likewise.
+ * modules/fnmatch (Depends-on): Likewise.
+ * modules/fsusage (Depends-on): Likewise.
+ * modules/fwriteerror (Depends-on): Likewise.
+ * modules/getcwd (Depends-on): Likewise.
+ * modules/getloadavg (Depends-on): Likewise.
+ * modules/hard-locale (Depends-on): Likewise.
+ * modules/makepath (Depends-on): Likewise.
+ * modules/mountlist (Depends-on): Likewise.
+ * modules/nanosleep (Depends-on): Likewise.
+ * modules/posixtm (Depends-on): Likewise.
+ * modules/quotearg (Depends-on): Likewise.
+ * modules/readtokens (Depends-on): Likewise.
+ * modules/readtokens0 (Depends-on): Likewise.
+ * modules/readutmp (Depends-on): Likewise.
+ * modules/save-cwd (Depends-on): Likewise.
+ * modules/strftime (Depends-on): Likewise.
+ * modules/userspec (Depends-on): Likewise.
+ * modules/utimecmp (Depends-on): Likewise.
+ * modules/xgetcwd (Depends-on): Likewise.
+ * modules/xnanosleep (Depends-on): Likewise.
+ * modules/xstrtod (Depends-on): Likewise.
+ * modules/yesno (Depends-on): Likewise.
+
+2005-05-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getopt.m4 (gl_GETOPT): Check for Solaris 10 getopt, and avoid
+ needless checks.
+
+2005-05-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils. Among other things,
+ add bulletproofing for cases where stdin, stdout, or stderr are closed.
+ * lib/fd-safer.c: New file.
+ * lib/fcntl-safer.h, open-safer.c: Remove.
+ * lib/chdir-long.c: Fix comment "fetish" -> "coreutils".
+ * lib/dup-safer.c: Include unistd-safer.h first.
+ Don't include errno.h.
+ (dup_safer) [!defined F_DUPFD]: Let fd_safer do the real work.
+ * lib/file-type.h: Don't assume invoker included sys/stat.h first.
+ * lib/file-type.c: Rely on file-type.h change.
+ * lib/getloadavg.c: Include unistd-safer.h.
+ (getloadavg): Use safer open.
+ * lib/getusershell.c: Include "stdio-safer.h".
+ (getusershell): Use safer fopen.
+ * lib/long-options.c (long_options): Use NULL rather than 0.
+ * lib/modechange.h (mode_free): Remove; all callers changed to invoke
+ 'free'.
+ * lib/modechange.c: Likewise.
+ xstrtol.h, stdbool.h, stddef.h: Don't include; no longer needed.
+ (MODE_DONE): New constant.
+ (struct mode_change): Remove 'next' member.
+ (make_node_op_equals): New function; like the old one of the
+ same name, except it allocates an array.
+ (mode_compile, mode_create_from_ref): Use it.
+ (mode_compile): Allocate result as an array, not a linked list.
+ Parse octal string ourself, so that we catch mistakes like "+0".
+ (mode_adjust): Arg is an array, not a linked list.
+ * lib/modechange.c: Include stat-macros.h, xalloc.h.
+ (S_ISDIR, S_ISUID, S_ISGID, S_ISVTX, S_IRUSR, S_IWUSR, S_IXUSR):
+ (S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH, S_IRXWU):
+ (S_IRWXG, S_IRWXO, CHMOD_MODE_BITS):
+ Remove. This is now stat-macros.h's job.
+ (talloc): Remove. All callers replaced by xalloc, so that
+ our invokers don't have to worry about reporting memory failures.
+ (make_node_op_equals): Remove.
+ (MODE_ORDINARY_CHAGE, MODE_X_IF_ANY_X, MODE_COPY_EXISTING):
+ New constants.
+ (struct mode_change): Moved here from modechange.h.
+ (mode_append_entry): Remove.
+ (mode_compile): Remove MASKED_OPS arg, since it encouraged
+ apps to have incorrect behavior. Use simpler algorithm for head
+ and tail. Don't futz with umask; that's now the job of mode_adjust.
+ Detect more invalid usages rather than having somewhat-random behavior.
+ Don't insert an "a=" action, as that leads to incorrect behavior.
+ (mode_compile, mode_create_from_ref): Return NULL on error instead
+ of an enum, since now there's only one way to have an error. All
+ callers changed.
+ (mode_adjust): Accept new arg UMASK_VALUE, and interpret it
+ at the correct time. Simplify calculation of "+u" and its ilk.
+ Don't mishandle "+X".
+ (mode_free): Remove "register" and localize decls.
+ * lib/modechange.h (MODE_X_IF_ANY_X, MODE_COPY_EXISTING):
+ (struct mode_change): Move to modechange.c; callers don't
+ need to see this stuff.
+ (MODE_MASK_EQUALS, MODE_MASK_PLUS, MODE_MASK_MINUS, MODE_MASK_ALL):
+ (MODE_INVALID, MODE_MEMORY_EXHAUSTED, MODE_BAD_REFERENCE): Remove.
+ (mode_change, mode_adjust): Reflect the new signatures noted above.
+ * lib/nanosleep.c (rpl_nanosleep): Include "timespec.h" before macros
+ that might redefine system include files.
+ (siginterrupt) [!HAVE_SIGINTERRUPT]: New macro.
+ (my_usleep): Use NULL rather than (void *) 0.
+ (rpl_nanosleep) [!defined SA_NOCLDSTOP]:
+ Use siginterrupt to specify that system calls should be interrupted.
+ (rpl_nanosleep): Move initialization of suspended closer to call of
+ my_usleep.
+ * lib/readutmp.h (read_utmp): New arg OPTIONS. All uses changed.
+ * lib/readutmp.c: Likewise. Include signal.h, stdbool.h.
+ (desirable_utmp_entry): New function.
+ (read_utmp) [defined UTMP_NAME_FUNCTION]: Redo memory allocation
+ using x2nrealloc, to simplify logic.
+ (read_utmp) [!defined UTMP_NAME_FUNCTION]: Check for overflow in
+ size calculation. Do not assume utmp file is a regular file.
+ * lib/readutmp.h (UT_PID): Moved here from ../src/who.c.
+ (READ_UTMP_CHECK_PIDS): New constant.
+ * lib/save-cwd.c: Include unistd-safer.h.
+ (save_cwd): Use fd_safer.
+ * lib/tempname.c (S_ISDIR, S_IRUSR, S_IRUSR, S_IWUSR, S_IXUSR): Remove.
+ [!_LIBC] Include "stat-macros.h" instead.
+ * lib/unistd-safer.h (fd_safer): New decl.
+
+2005-05-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/getloadavg (Depends-on): Add unistd-safer.
+ * modules/getusershell (Depends-on): Add stdio-safer.
+ * modules/lstat (Depends-on): Remove xalloc.
+ * modules/mkstemp (Depends-on): Add stat-macros.
+ * modules/modechange (Depends-on): Remove xstrtol.
+ Add stat-macros, xalloc.
+ * modules/save-cwd (Depends-on): Add unistd-safer.
+ * modules/stdio-safer (Makefile.am): Remove lib_SOURCES.
+ * modules/unistd-safer (Files): Add lib/fd-safer.c
+ (Makefile.am): Remove lib_SOURCES.
+
+ * MODULES.html.sh (Enhancements for POSIX:2001 functions):
+ Remove fcntl-safer; unistd-safer supersedes it.
+
+2005-05-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/euidaccess.m4 (gl_PREREQ_EUIDACCESS): Don't require
+ AC_HEADER_STAT.
+ * m4/lchown.m4 (gl_FUNC_CHOWN): Likewise.
+ (gl_PREREQ_CHOWN): Remove.
+ * m4/lstat.m4 (gl_FUNC_LSTAT): Require AC_FUNC_LSTAT instead of calling
+ it. Don't require AC_HEADER_STAT.
+ (gl_PREREQ_LSTAT): Remove.
+ * m4/mkstemp.m4 (gl_PREREQ_TEMPNAME): Check stdint.h only once.
+ Don't require AC_HEADER_STAT.
+ * m4/rmdir.m4 (gl_FUNC_RMDIR): Don't require AC_HEADER_STAT.
+ (gl_PREREQ_RMDIR): Remove.
+ * m4/canonicalize.m4 (AC_FUNC_CANONICALIZE_FILE_NAME): Don't
+ mention stat-macros.h or AC_HEADER_STAT, since we'll make
+ the stat-macros module a prerequisite.
+ * m4/file-type.m4 (gl_FILE_TYPE): Likewise.
+ * m4/filemode.m4 (gl_FILEMODE): Likewise.
+ * m4/makepath.m4 (gl_MAKEPATH): Likewise.
+ * m4/modechange.m4 (gl_MODECHANGE): Likewise.
+ * m4/clock_time.m4 (gl_CLOCK_TIME): Use gl_ rather than fetish_ for
+ variable names.
+ * m4/rmdir-errno.m4 (gl_FUNC_RMDIR_NOTEMPTY): Renamed from
+ fetish_FUNC_RMDIR_NOTEMPTY. All uses changed. Use gl_ for
+ variable prefixes.
+ * m4/fcntl-safer.m4: Remove.
+ * m4/stdio-safer.m4 (gl_STDIO_SAFER): Use AC_LIBSOURCES and AC_LIBOBJ.
+ * m4/unistd-safer.m4 (gl_UNISTD_SAFER): Likewise.
+ Invoke gl_PREREQ_FD_SAFER.
+ (gl_PREREQ_FD_SAFER): New macro.
+ * m4/nanosleep.m4 (gl_PREREQ_NANOSLEEP): Check for siginterrupt.
+ * m4/readutmp.m4 (gl_READUTMP): Require AC_C_INLINE.
+ Use AC_CHECK_HEADERS_ONCE and AC_CHECK_FUNCS_ONCE when possible.
+ Remove duplicate call to AC_LIBOBJ(readutmp).
+ (gl_PREREQ_READUTMP): Remove. All uses inlined.
+
+ * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Check for message, not for
+ MAP_ANON. Problem reported by Moriyoshi Koizumi to bug-cvs.
+
+2005-05-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (Misc): Add byteswap.
+
+2005-05-01 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * modules/getcwd (Depends-on): Add extensions.
+ * modules/openat (Depends-on): Likewise.
+
+2005-05-01 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * modules/byteswap: New file.
+
+2005-05-01 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * m4/byteswap.m4: New file.
+
+2005-05-01 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * lib/byteswap_.h: New file.
+
+2005-04-25 Karl Berry <karl@gnu.org>
+
+ * m4/gettext.m4: Update from GNU gettext 0.14.4.
+
+2005-04-25 Albert Chin <china@thewrittenword.com>
+
+ * lib/regex.c: Include <stdio.h>, as a workaround to a Compaq Desktop
+ Toolkit C bug.
+
+2005-04-21 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * gnulib-tool (Options): Add -s for --symlink/--symbolic.
+ (func_ln_if_changed) Remove forcibly for no error message
+ in case file does not exist.
+
+2005-04-19 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool (Options): Make --symlink mean --symbolic.
+
+2005-04-18 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * doc/gnulib.texi (Initial import): Fix. Mention --aux-dir.
+
+2005-04-16 Simon Josefsson <jas@extundo.com>
+
+ * modules/getpass-gnu (Makefile.am): Don't mention getpass.h.
+
+2005-04-15 Simon Josefsson <jas@extundo.com>
+
+ * m4/getpass.m4 (gl_FUNC_GETPASS): Use AC_LIBSOURCES.
+
+2005-04-15 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool: Rename --symlink to --symbolic.
+
+2005-04-15 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * gnulib-tool: Add -s, --symlink option to gnulib-tool to make
+ symbolic links to files instead of copying/moving. Add --aux-dir,
+ specifying directory relative --dir where auxiliary build tools
+ are placed.
+
+2005-04-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/allocsa (License): Change to LGPL.
+ Requested by Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+2005-04-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y (zone): Allow relunit_snumber after tZONE, so
+ that "UTC +1 second" continues to work. Problem reported
+ by Dmitry V. Levin.
+ (relunit_snumber): New rule.
+ (relunit): Use it.
+
+2005-04-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y (universal_time_zone_table): New constant.
+ (time_zone_table): Remove GMT, UT, UTC entries; they're now in
+ universal_time_zone_table.
+ (lookup_zone): Prefer universal_time_zone_table to
+ local_time_zone_table, so that "GMT" time stamps are allowed in
+ London during the summer. Problem reported by Ian Abbott.
+
+2005-04-12 Jim Meyering <jim@meyering.net>
+
+ * lib/human.c (humblock): Set *options even when returning due to
+ xstrtoumax conversion failure. Thanks to a used-uninitialized
+ warning from gcc-4.
+
+2005-04-09 Jim Meyering <jim@meyering.net>
+
+ * lib/posixtm.c (posixtime) [lint]: Avoid spurious warning from gcc-4's
+ -Wuninitialized: initialize tm0.tm_year.
+
+2005-04-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y (parser_control): rels_seen is now a boolean, not a
+ count, since there's no maximum. All uses changed.
+ Add member dsts_seen.
+ (local_zone): Accumulate dsts_seen rather than relying on tm_isdst
+ not being INT_MAX.
+ (get_date): Initialize dsts_seen, and check that it doesn't go over 1.
+ Use pc_rels_seen to decide whther a date is absolute.
+
+ * lib/getdate.y (number): Don't overwrite year.
+ (get_date): Initialize pc.year.digits to 0, not 4, to enable above
+ check.
+
+2005-04-02 Simon Josefsson <jas@extundo.com>
+
+ * lib/getaddrinfo.h: Fix OpenBSD compilation failure, inspired by tiny
+ patch from Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+2005-03-28 Eric Blake <ebb9@byu.net> (tiny change)
+
+ * m4/getcwd-path-max.m4: Return success on systems such as Cygwin
+ where no absolute path name can be longer than PATH_MAX.
+
+2005-03-27 Jim Meyering <jim@meyering.net>
+
+ * lib/argmatch.c: Clarify comment: null-terminated -> NULL-terminated.
+
+2005-03-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/intprops.h (INT_STRLEN_BOUND, INT_BUFSIZE_BOUND):
+ "one's complement" -> "ones' complement" in comment, as per Knuth.
+ "value of type" -> "type or expression" in comment.
+ * lib/mktime.c, strftime.c: Propagate intprops.h comment nits.
+
+2005-03-26 Jim Meyering <jim@meyering.net>
+
+ Comment nits.
+ * lib/intprops.h: Add the apostrophe in `(one|two)'s complement'.
+ Correct typos: s/or/of/.
+
+2005-03-26 Jim Meyering <jim@meyering.net>
+
+ * modules/check-include-files: Move to ../ and rename to...
+ * check-module: ...this.
+
+2005-03-25 Jim Meyering <jim@meyering.net>
+
+ * modules/xvasprintf (Files): Add xalloc.h.
+
+2005-03-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/gettext (Files): config/config.rpath ->
+ build-aux/config.rpath
+ * modules/iconv (Files): Likewise.
+ Problem reported by Oskar Liljeblad.
+
+2005-03-23 Jim Meyering <jim@meyering.net>
+
+ * modules/check-include-files: New script to check for
+ missing dependencies, multiple includes, etc.
+
+ * modules/c-strtold (Depends-on): Add xalloc.
+ * modules/c-strtod (Depends-on): Add xalloc.
+ * modules/hash (Depends-on): Add xalloc.
+ (Files): Remove lib/xalloc.h.
+
+ * modules/gethrxtime (Files): Add lib/gethrxtime.h.
+ * modules/userspec (Files): Add lib/inttostr.h.
+
+2005-03-23 Jim Meyering <jim@meyering.net>
+
+ * lib/canonicalize.c: Remove duplicate `#include "stat-macros.h"'.
+
+2005-03-22 Jim Meyering <jim@meyering.net>
+
+ * modules/stat-macros: New module.
+ * modules/canonicalize, modules/euidaccess, modules/file-type,
+ * modules/filemode, modules/lchown, modules/makepath,
+ * modules/rmdir, modules/stat: Depend on new stat-macros module
+ rather than listing lib/stat-macros.h manually.
+ Don't add stat-macros.h to lib_SOURCES or list it in Files: section.
+
+2005-03-22 Jim Meyering <jim@meyering.net>
+
+ * m4/stat-macros.m4 (gl_STAT_MACROS): New file/macro.
+
+2005-03-22 Bruno Haible <bruno@clisp.org>
+
+ * config/srclist.txt: Replace target directory 'config' with
+ 'build-aux'.
+ * config/config.guess, config.sub, config.rpath, depcomp, install-sh:
+ * config/mdate-sh, missing, mkinstalldirs, texinfo.tex: Move to
+ ../build-aux/.
+
+2005-03-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/chdir-long (Depends-on): Add mempcpy.
+
+ * modules/acl, modules/backupfile, modules/c-strtod,
+ modules/c-strtold, modules/canon-host, modules/canonicalize,
+ modules/cloexec, modules/closeout, modules/dirfd, modules/dirname,
+ modules/exclude, modules/exitfail, modules/file-type,
+ modules/filemode, modules/fpending, modules/fsusage, modules/getcwd,
+ modules/getdate, modules/getline, modules/getpagesize,
+ modules/getpass, modules/getugroups, modules/group-member,
+ modules/hard-locale, modules/hash, modules/human, modules/idcache,
+ modules/inttostr, modules/long-options, modules/makepath,
+ modules/md5, modules/memcasecmp, modules/memcoll,
+ modules/modechange, modules/mountlist, modules/path-concat,
+ modules/pathmax, modules/physmem, modules/posixtm, modules/posixver,
+ modules/quote, modules/quotearg, modules/readtokens, modules/readutmp,
+ modules/safe-read, modules/safe-write, modules/same, modules/savedir,
+ modules/settime, modules/sha1, modules/sig2str, modules/strdup,
+ modules/strftime, modules/strndup, modules/strverscmp,
+ modules/timespec, modules/unlocked-io, modules/userspec,
+ modules/utimecmp, modules/utimens, modules/xalloc, modules/xstrtol,
+ modules/yesno:
+ Remove lib_SOURCES line from Makefile.am section, as this is now
+ done automatically by the corresponding Autoconf macro.
+
+2005-03-21 Jim Meyering <jim@meyering.net>
+
+ Changes imported from coreutils.
+
+ * lib/cycle-check.c: Don't include xalloc.h.
+
+ * lib/path-concat.c: Don't include assert.h.
+ (path_concat): Remove assertion that would have triggered
+ for ABASE starting with more than one slash.
+ Reported by Andreas Schwab.
+
+ * lib/path-concat.c (path_concat): Set *BASE_IN_RESULT
+ properly when ABASE is an absolute file name.
+ Correct the description of this function.
+ Include <assert.h>.
+ Add an assertion and a test driver.
+ This fixes a bug introduced on 2004-07-02.
+ Andreas Schwab reported the resulting failure of cp --parents:
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-01/msg00130.html
+
+2005-03-21 Jim Meyering <jim@meyering.net>
+
+ * m4/chdir-long.m4 (gl_PREREQ_CHDIR_LONG): Invoke gl_FUNC_MEMRCHR.
+ * m4/memrchr.m4 (gl_FUNC_MEMRCHR): Check for memrchr decl.
+
+2005-03-21 Jim Meyering <jim@meyering.net>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/acl.m4, m4/backupfile.m4, m4/c-strtod.m4, m4/canon-host.m4,
+ m4/canonicalize.m4, m4/cloexec.m4, m4/closeout.m4, m4/dirfd.m4,
+ m4/dirname.m4, m4/exclude.m4, m4/exitfail.m4, m4/file-type.m4,
+ m4/filemode.m4, m4/fpending.m4, m4/fsusage.m4, m4/getcwd.m4,
+ m4/getdate.m4, m4/getline.m4, m4/getpagesize.m4, m4/getpass.m4,
+ m4/getugroups.m4, m4/group-member.m4, m4/hard-locale.m4, m4/hash.m4,
+ m4/human.m4, m4/idcache.m4, m4/inttostr.m4, m4/long-options.m4,
+ m4/makepath.m4, m4/md5.m4, m4/memcasecmp.m4, m4/memcoll.m4,
+ m4/modechange.m4, m4/mountlist.m4, m4/nanosleep.m4, m4/path-concat.m4,
+ m4/pathmax.m4, m4/physmem.m4, m4/posixtm.m4, m4/posixver.m4,
+ m4/quote.m4, m4/quotearg.m4, m4/readtokens.m4, m4/readutmp.m4,
+ m4/safe-read.m4, m4/safe-write.m4, m4/same.m4, m4/savedir.m4,
+ m4/settime.m4, m4/sha1.m4, m4/sig2str.m4, m4/strdup.m4, m4/strftime.m4,
+ m4/strndup.m4, m4/strverscmp.m4, m4/timespec.m4, m4/unlocked-io.m4,
+ m4/userspec.m4, m4/utimecmp.m4, m4/utimens.m4, m4/xalloc.m4,
+ m4/xnanosleep.m4, m4/xstrtol.m4, m4/yesno.m4:
+ Use AC_LIBSOURCES and AC_LIBOBJ to indicate source and object files
+ for these modules.
+
+2005-03-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/strftime.c (my_strftime): If the underlying strftime returns 0
+ (which shouldn't happen), generate nothing instead of returning 0
+ immediately, so that nstrftime (NULL, ...) doesn't return 0.
+
+2005-03-16 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdint (Makefile.am): Use HAVE_LONG_LONG_64BIT instead of
+ HAVE_LONGLONG_64BIT.
+
+2005-03-16 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4 (gl_STDINT_H): Define HAVE_LONG_LONG_64BIT instead of
+ HAVE_LONGLONG_64BIT.
+
+2005-03-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: Use HAVE_LONG_LONG_64BIT instead of
+ HAVE_LONGLONG_64BIT.
+
+2005-03-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/strftime.c (my_strftime): Prepend space to format so that we can
+ reliably distinguish strftime failure from empty output on POSIX
+ hosts.
+
+2005-03-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/iconvme.c (SIZE_MAX): New macro, if not already defined.
+ (iconv_string): Don't guess a size-zero buffer, as that might cause
+ buffer overrun. Instead, avoid multiplying by MB_LEN_MAX if the
+ result would be 'too large', where 'too large' is (heuristically)
+ the square root of SIZE_MAX, divided by MB_LEN_MAX to allay
+ overflow concerns. This will prevent some unwanted malloc failures
+ when the inputs are very large.
+
+2005-03-15 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (config.rpath): from gettext.
+ * config/config.rpath: update.
+
+2005-03-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/regex.c (byte_re_match_2_internal): Rename local variable 'not'
+ to 'negate'.
+
+ * lib/regex.c (byte_re_match_2_internal): Reduce scope of same_str_p
+ variable.
+
+ * lib/regex.c (EXTEND_BUFFER, regcomp): Cast the realloc/malloc
+ results.
+
+2005-03-14 Simon Josefsson <jas@extundo.com>
+
+ * lib/timegm.h: Use proper prototype CPP guards, reported by Dave Love
+ <fx@gnu.org>.
+
+2005-03-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mktime.c (TYPE_TWOS_COMPLEMENT, TYPE_ONES_COMPLEMENT,
+ TYPE_SIGNED_MAGNITUDE, TYPE_MINIMUM, TYPE_MAXIMUM): Sync from
+ intprops.h.
+ * lib/strtol.c: Likewise.
+
+2005-03-14 Jim Meyering <jim@meyering.net>
+
+ * lib/strftime.c (my_strftime) [HAVE_STRFTIME && ! (_NL_CURRENT
+ && HAVE_STRUCT_ERA_ENTRY)]: Initialize the first byte of ubuf[]
+ to be nonzero so that we (and caller) can detect the difference
+ between a valid zero-length expansion and an error return, even
+ when the underlying strftime fails before writing anything into
+ that location.
+
+2005-03-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/lib-link.m4, gettext.m4, nls.m4, po.m4:
+ Update from GNU gettext 0.14.3.
+
+2005-03-10 Jim Meyering <jim@meyering.net>
+
+ * m4/save-cwd.m4 (gl_SAVE_CWD): Check for fchdir.
+
+2005-03-10 Jim Meyering <jim@meyering.net>
+
+ * lib/save-cwd.c [!HAVE_FCHDIR]: Define open, fchdir, and chdir_long
+ so that this module works on systems without fchdir.
+
+2005-03-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Factor int-properties macros into a single file, except for
+ glibc-related files.
+ * lib/intprops.h: New file.
+ * lib/getloadavg.c: Include it instead of limits.h.
+ (INT_STRLEN_BOUND): Remove.
+ * lib/human.c: Include intprops.h.
+ (group_number): Use INT_STRLEN_BOUND instead of rolling it ourself.
+ * lib/human.h (LONGEST_HUMAN_READABLE): Use 146/485 rather than
+ 302/1000.
+ * lib/inttostr.h: Include intprops.h instead of limits.h.
+ (INT_STRLEN_BOUND, INT_BUFSIZE_BOUND): Remove.
+ * lib/mktime.c (TYPE_IS_INTEGER, TYPE_TWOS_COMPLEMENT): New macros,
+ for consistency with intprops.h.
+ (time_t_is_integer, twos_complement_arithmetic): Use them.
+ * lib/sig2str.h: Include <signal.h>, intprops.h.
+ (INT_STRLEN_BOUND): Remove.
+ * lib/strftime.c (TYPE_SIGNED): Remove.
+ (INT_STRLEN_BOUND): Switch to same implementation as intprops.h.
+ * lib/strtol.c: Adjust comments to match intprops.h.
+ * lib/userspec.c: Include intprops.h.
+ (TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM): Remove.
+ * lib/utimecmp.c, xnanosleep.c, xstrtol.c: Likewise.
+ * lib/utimecmp.c (utimecmp): Use TYPE_IS_INTEGER, TYPE_TWOS_COMPLEMENT
+ instead of rolling our own expressions.
+ * lib/xstrtol.c: Include xstrtol.h first, to test interface.
+
+ * lib/strftime.c: Include <stdbool.h>. Use bool where appropriate,
+ instead of int.
+ (my_strftime): Do not mishandle years close to INT_MAX, by doing
+ the right thing even if adding 1900 would overflow. Similarly
+ for tm_mon + 1 and tm_yday + 1.
+ Make %Y always equivalent to %C%y, and similarly for %G and %g.
+ (DO_NUMBER, DO_NUMBER_SPACEPAD): Set digits to d, not a conditional.
+ (DO_SIGNED_NUMBER): New macro.
+ (my_strftime) [HAVE_TZNAME]: Don't dump core if tp->tm_dst > 1.
+
+2005-03-07 Bruno Haible <bruno@clisp.org>
+
+ * m4/mmap-anon.m4 (MAP_FILE, MAP_FAILED): Remove definitions.
+
+2005-03-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/pagealign_alloc.c (MAP_FILE, MAP_FAILED): Define fallbacks.
+
+2005-03-04 Derek R. Price <derek@ximbiot.com>
+
+ * gnulib-tool (func_cp_if_changed, func_mv_if_changed): New functions.
+ (func_import): Only replace files via --import when they have actually
+ changed.
+
+2005-03-03 Derek R. Price <derek@ximbiot.com>
+
+ * m4/mmap-anon.m4: New file.
+ * m4/pagealign_alloc.m4: New file.
+
+2005-03-03 Derek R. Price <derek@ximbiot.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/pagealign_alloc: New file.
+ * MODULES.html.sh (Memory management functions): Add pagealign_alloc.
+
+2005-03-03 Derek R. Price <derek@ximbiot.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/pagealign_alloc.h: New file.
+ * lib/pagealign_alloc.c: New file.
+
+2005-03-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/inttypes.m4, isc-posix.m4, once-only.m4:
+ Use an all-permissive copyright notice, recommended by RMS.
+
+2005-03-02 Bruno Haible <bruno@clisp.org>
+
+ * m4/stpncpy.m4 (gl_FUNC_STPNCPY): Undo the replacement here. Because
+ of AIX, the replacement has to be done only after <string.h> is
+ included, therefore not in config.h. stpncpy.h does the replacement,
+ and stpncpy.c uses it.
+
+2005-03-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/stpncpy.h (stpncpy): Define as a macro without arguments, so that
+ stpncpy.c uses it.
+
+2005-03-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ Remove workaround for bug in Linux kernel 2.6.8 or thereabouts.
+ The workaround isn't strictly needed for POSIX conformance, and
+ it's too much of a pain to configure and maintain. We'll ask
+ people to fix their kernels instead.
+ * lib/xnanosleep.c: Don't include gethrxtime.h or xtime.h.
+ (NANOSLEEP_BUG_WORKAROUND): Remove.
+ (xnanosleep): Remove the workaround.
+
+2005-03-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/gettime (Makefile.am): Remove lib_SOURCES line.
+ Reported by Derek Price.
+ (Include): Add "timespec.h".
+
+ * modules/xnanosleep (Depends-on): Remove gethrxtime.
+
+2005-03-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/xnanosleep.m4 (gl_XNANOSLEEP): Remove configuration attempting
+ to detect nanosleep bug.
+
+2005-03-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (EOVERFLOW): Define to a fallback if needed.
+
+2005-02-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/gethrxtime: New file.
+ * modules/xnanosleep (Files): Add m4/xnanosleep.m4.
+ (Depends-on): Add gethrxtime.
+ (configure.ac): Add gl_XNANOSLEEP.
+ (Makefile.am): Remove lib_SOURCES line.
+
+2005-02-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/gethrxtime.m4, m4/xnanosleep.m4: New files.
+ * m4/gettime.m4 (gl_GETTIME): Check for nanotime.
+
+2005-02-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/gethrxtime.h, lib/gethrxtime.c, lib/xtime.h: New files.
+ * lib/timespec.h (gettime): Return void, since it always
+ succeeds now. All uses changed.
+ * lib/gettime.c (gettime) Likewise.
+ [HAVE_NANOTIME]: Prefer nanotime.
+ Assume gettimeofday succeeds, as POSIX requires.
+ Assime time () succeeds, since other code already does.
+ * lib/xnanosleep.c: Include xtime.h and gethrxtime.h, not xalloc.h.
+ (timespec_subtract): Remove.
+ (NANOSLEEP_BUG_WORKAROUND): New constant.
+ (xnanosleep): Use gethrxtime rather than gettime; this simplifies
+ things considerably. Use it only on GNU/Linux hosts, since the
+ workaround shouldn't be needed elsewhere.
+
+2005-02-24 Bruno Haible <bruno@clisp.org>
+
+ * modules/gettext (Files): Add m4/glibc2.m4.
+
+2005-02-24 Bruno Haible <bruno@clisp.org>
+
+ * m4/gettext.m4, intdiv0.m4, intmax.m4, inttypes-pri.m4, lcmessage.m4:
+ * m4/lib-link.m4, lib-prefix.m4, nls.m4, po.m4, printf-posix.m4:
+ * m4/progtest.m4:
+ Update from GNU gettext 0.14.2.
+ * m4/glibc2.m4: New file, from GNU gettext 0.14.2.
+
+2005-02-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c: Update from GNU gettext 0.14.2.
+ * lib/config.charset: Update from GNU gettext 0.14.2.
+
+2005-02-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/gettext.h: Update from GNU gettext 0.14.2.
+
+2005-02-23 Simon Josefsson <jas@extundo.com>
+
+ * m4/iconvme.m4: New file.
+
+2005-02-23 Jim Meyering <jim@meyering.net>
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Revert yesteday's
+ change.
+ Thanks to Bruno Haible for catching it.
+
+2005-02-22 Simon Josefsson <jas@extundo.com>
+
+ * modules/iconvme: New file.
+
+ * MODULES.html.sh: Add iconvme.
+
+2005-02-22 Simon Josefsson <jas@extundo.com>
+
+ * lib/iconvme.h, lib/iconvme.c: New files, from libc.
+
+2005-02-22 Simon Josefsson <jas@extundo.com>
+
+ * config/srclist.txt: Sync iconvme.h, iconvme.c from libc.
+
+2005-02-22 Jim Meyering <jim@meyering.net>
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Fix typo:
+ s/ifndef/ifdef/.
+
+2005-02-20 Neil Conway <neilc@samurai.com>
+
+ * lib/xgethostname.c (xgethostname): Check for ENOMEM, which is
+ returned by OSX/Darwin if the specified buffer is not large
+ enough for the hostname.
+
+2005-02-03 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * lib/argp-help.c (__argp_help): Create a fake struct argp_state and
+ pass it to _help, otherwise the latter coredumps trying to
+ dereference state.root_argp.
+
+2005-02-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/chdir-long (Depends-on): Add memrchr.
+ * modules/memrchr (Files): Add lib/memrchr.h.
+ (Include): "memrchr.h".
+
+2005-02-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/memrchr.m4 (gl_FUNC_MEMRCHR): Add AC_LIBSOURCES, for memrchr.h.
+
+2005-02-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/memrchr.h: New file.
+ * lib/chdir-long.c: Include it.
+ * lib/memrchr.c [!defined _LIBC]: Include it rather than <string.h>
+ Don't bother including stddef.h.
+
+2005-02-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mountlist.h (MOUNTLIST_H_): New macro, to protect against double
+ inclusion.
+ Include <sys/types.h>, for dev_t.
+ (ME_DUMMY, ME_REMOTE): Move from here....
+ * lib/mountlist.c (ME_DUMMY, ME_REMOTE): To here.
+ (ME_DUMMY): Count "subfs" as a dummy. Problem reported by
+ Dmitry V. Levin.
+ Include mountlist.h first, to test the interface.
+
+2005-01-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.c (program_name): Initialize.
+ Needed when linking statically on MacOS X.
+
+2005-01-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * modules/getloadavg (Files): Remove m4/getloadavg.m4.
+ (Depends-on): Add c-strtod.
+ (configure.ac): Replace gl_FUNC_GETLOADAVG with AC_FUNC_GETLOADAVG.
+
+2005-01-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ Sync from coreutils.
+ * m4/getloadavg.m4, glibc.m4, search-libs.m4: Remove.
+
+ Remove files that are specific to coreutils.
+ * m4/check-decl.m4, jm-macros.m4, lib-check.m4, prereq.m4: Remove.
+
+2005-01-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/javacomp: New file.
+ * MODULES.html.sh (Java): Add javacomp.
+
+2005-01-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/javacomp.m4: New file, from GNU gettext.
+
+2005-01-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/javacomp.sh.in: New file, from GNU gettext.
+ * lib/javacomp.h: New file, from GNU gettext.
+ * lib/javacomp.c: New file, from GNU gettext.
+
+2005-01-26 Simon Josefsson <jas@extundo.com>
+
+ * lib/gai_strerror.c: Use GPL in header.
+
+2005-01-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/javaexec: New file.
+ * MODULES.html.sh (Java): Add javaexec.
+
+2005-01-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/javaexec.m4: New file, from GNU gettext.
+
+2005-01-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/javaexec.sh.in: New file, from GNU gettext.
+ * lib/javaexec.h: New file, from GNU gettext.
+ * lib/javaexec.c: New file, from GNU gettext.
+
+2005-01-24 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * modules/lchown (Depends-on): Remove lchown.h
+
+2005-01-24 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * m4/sysexits.m4 (gl_SYSEXITS): Reverted logic. SYSEXITS_H
+ must be defined if the header file was not found, in order
+ to provide a replacement. Reported by Todd Vierling <tv@duh.org>
+
+2005-01-24 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * lib/argp-help.c (hol_entry_help): Avoid using non-constant
+ initializers for struct pentry_state.
+ (__argp_error): Check return value of __asprintf
+ (__argp_failure): Translate error message
+
+ * lib/argp-parse.c: Removed braces around the expansion of N_()
+
+2005-01-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/acl.m4, afs.m4, alloca.m4, argp.m4, assert.m4, atexit.m4,
+ backupfile.m4, base64.m4, bison.m4, c-bs-a.m4, c-stack.m4,
+ c-strtod.m4, calloc.m4, canon-host.m4, canonicalize.m4,
+ clock_time.m4, cloexec.m4, closeout.m4, d-ino.m4, d-type.m4,
+ dirfd.m4, dirname.m4, dos.m4, dup2.m4, error.m4, euidaccess.m4,
+ exclude.m4, exitfail.m4, extensions.m4, fcntl-safer.m4,
+ file-type.m4, fileblocks.m4, filemode.m4, fnmatch.m4, fpending.m4,
+ free.m4, fstypename.m4, fsusage.m4, ftruncate.m4, getaddrinfo.m4,
+ getcwd-path-max.m4, getcwd.m4, getdate.m4, getdomainname.m4,
+ getgroups.m4, gethostname.m4, getline.m4, getndelim2.m4,
+ getnline.m4, getopt.m4, getpagesize.m4, getpass.m4, getsubopt.m4,
+ gettime.m4, gettimeofday.m4, getugroups.m4, getusershell.m4,
+ group-member.m4, hard-locale.m4, hash.m4, host-os.m4, human.m4,
+ idcache.m4, inttostr.m4, isdir.m4, jm-winsz1.m4, jm-winsz2.m4,
+ link-follow.m4, long-options.m4, ls-mntd-fs.m4, lstat.m4,
+ makepath.m4, mathl.m4, md5.m4, memcasecmp.m4, memchr.m4,
+ memcmp.m4, memcoll.m4, memcpy.m4, memmem.m4, memmove.m4,
+ memrchr.m4, memset.m4, mkdir-slash.m4, mkstemp.m4, mktime.m4,
+ modechange.m4, mountlist.m4, nanosleep.m4, obstack.m4,
+ path-concat.m4, pathmax.m4, perl.m4, physmem.m4, poll.m4,
+ posixtm.m4, posixver.m4, putenv.m4, quote.m4, quotearg.m4,
+ readdir.m4, readtokens.m4, readutmp.m4, regex.m4, rename.m4,
+ restrict.m4, rmdir-errno.m4, rmdir.m4, rpmatch.m4, same.m4,
+ savedir.m4, settime.m4, sha1.m4, sig2str.m4, snprintf.m4,
+ sockpfaf.m4, st_dm_mode.m4, st_mtim.m4, stat.m4, stdint.m4,
+ stdio-safer.m4, strchrnul.m4, strdup.m4, strerror.m4,
+ strerror_r.m4, strftime.m4, strndup.m4, strnlen.m4, strsep.m4,
+ strtod.m4, strtoimax.m4, strtok_r.m4, strtol.m4, strtoll.m4,
+ strtoul.m4, strtoull.m4, strtoumax.m4, strverscmp.m4, sysexits.m4,
+ time_r.m4, timegm.m4, timespec.m4, tm_gmtoff.m4, tzset.m4,
+ uint32_t.m4, uintptr_t.m4, unistd-safer.m4, unlink-busy.m4,
+ unlocked-io.m4, uptime.m4, userspec.m4, utimbuf.m4, utime.m4,
+ utimecmp.m4, utimens.m4, utimes-null.m4, vsnprintf.m4, xalloc.m4,
+ xgetcwd.m4, xreadlink.m4, xstrndup.m4, xstrtod.m4, xstrtoimax.m4,
+ xstrtol.m4, xstrtoumax.m4, yesno.m4:
+ Use an all-permissive copyright notice, recommended by RMS.
+
+2005-01-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/chdir-long (Depends-on): Remove mempcpy.
+
+2005-01-21 Jim Meyering <jim@meyering.net>
+
+ * lib/openat.h (AT_SYMLINK_NOFOLLOW): Define to 4096, so it's the
+ same value as for Solaris 9.
+
+ * lib/chdir-long.c (chdir_long): Rewrite to remove limitation on
+ component length. This included changing the parameter to be
+ of type `char *' rather than `char const *'.
+ * lib/chdir-long.h (chdir_long): Update prototype.
+
+ * lib/openat.c (fdopendir, fstatat): New functions.
+ * lib/openat.h: Include headers required for use of DIR and struct
+ stat.
+ [AT_SYMLINK_NOFOLLOW]: Define.
+ (fdopendir, fstatat): Add prototypes.
+
+2005-01-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/classpath: New file.
+ * MODULES.html.sh (Java): Add classpath.
+
+2005-01-21 Bruno Haible <bruno@clisp.org>
+
+ * lib/classpath.h: New file, from GNU gettext.
+ * lib/classpath.c: New file, from GNU gettext.
+
+2005-01-20 Simon Josefsson <jas@extundo.com>
+
+ * modules/version-etc-fsf: New file.
+
+2005-01-20 Simon Josefsson <jas@extundo.com>
+
+ * lib/version-etc-fsf.c: New file, with version_etc_copyright.
+ * lib/version-etc.c: Remove version_etc_copyright.
+ * lib/version-etc.h (version_etc_copyright): Use [] instead of * in
+ prototype, suggested by Paul Eggert <eggert@CS.UCLA.EDU>.
+
+2005-01-20 Simon Josefsson <jas@extundo.com>
+
+ * lib/base64.h (isbase64): Add.
+
+ * lib/base64.c (isb64): Rename to isbase64, use to_uchar instead of
+ using a unsigned prototype, don't inline.
+ (base64_decode): Use it.
+
+2005-01-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/save-cwd.m4 (gl_SAVE_CWD): Remove check for fcntl; we now assume
+ it.
+
+2005-01-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/save-cwd.c (save_cwd): Remove code to support the case
+ where fchdir is missing or flaky.
+
+2005-01-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (Command-line arguments): Add version-etc-fsf.
+
+2005-01-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/mempcpy (Makefile.am): Remove mention of mempcpy.h;
+ AC_LIBSOURCES now does this.
+ * MODULES.html.sh (Sizes of integer types <limits.h>): New element,
+ with new ullong_max module.
+
+2005-01-19 Bruno Haible <bruno@clisp.org>
+
+ * modules/sh-quote: New file.
+ * MODULES.html.sh (Executing programs): Add sh-quote.
+
+2005-01-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/sh-quote.h: New file, from GNU gettext.
+ * lib/sh-quote.c: New file, from GNU gettext.
+
+2005-01-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils.
+ * m4/ullong_max.m4: New file.
+ * m4/jm-macros.m4 (gl_MACROS): Require gl_ULLONG_MAX.
+ (gl_MACROS): Assume localeconv exists.
+
+2005-01-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge changes from coreutils, as described below in several
+ changelogs dated today.
+
+ * lib/save-cwd.c: Include "save-cwd.h" before other include files.
+ (O_DIRECTORY): Remove; not needed here, since "." must be
+ a directory. All uses removed.
+ (save_cwd): Use __sgi || __sun, not sun || __sun. __sun is
+ universal on Suns, and we also need to test for IRIX.
+ Revamp code to use 'if' rather than '#if'.
+ Avoid unnecessary comparison of cwd->desc to 0.
+
+ * lib/utimens.c (futimens): Robustify the previous patch, by checking
+ for known valid error numbers rather than observed invalid ones.
+
+2005-01-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/ullong_max: New file.
+
+ * modules/chdir-long, modules/openat: New files.
+ * modules/save-cwd (Depends-on): Depend on chdir-long.
+ (Makefile.am): Remove lib_SOURCES; now handled by AC_LIBSOURCES.
+
+2005-01-18 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+ * m4/chdir-long.m4, m4/openat.m4: New files.
+ * m4/save-cwd.m4 (gl_SAVE_CWD): Add AC_LIBSOURCES for save-cwd.c,
+ save-cwd.h. Add AC_LIBOBJ for save-cwd.
+ * m4/chown.m4 (gl_FUNC_CHOWN): When cross-compiling, assume that chown
+ is sane and DOES follow symlinks. Besides, testing 20 different
+ systems found no broken chown implementations.
+ Prompted by a change in rsync's copy of this macro.
+ * m4/jm-macros.m4 (gl_MACROS): Require gl_FUNC_CHDIR_LONG.
+
+ * m4/lchown.m4 (gl_FUNC_LCHOWN): Use AC_LIBSOURCES.
+
+ * m4/utimes.m4: Work around tests/touch/empty-file failure on a system
+ (sparc64, Linux-2.4.28, glibc-2.3.3) that didn't honor utimes'
+ NULL-means-set-to-current-time semantics.
+ Remove temporary file immediately, rather than waiting
+ for configure's at-exit trap code to do it.
+
+2005-01-18 Jim Meyering <jim@meyering.net>
+
+ * lib/version-etc.c (version_etc_copyright): Update copyright date.
+
+ * lib/utimens.c (futimens): Account for the fact that futimes
+ can also fail with errno == ENOSYS or errno == ENOENT.
+ Patch from Dmitry V. Levin.
+
+ Change the name of the robust chdir function from chdir to chdir_long.
+ * lib/save-cwd.c: Include chdir-long.h rather than chdir.h.
+ (restore_cwd): Use chdir_long, not chdir.
+ * lib/chdir-long.c: Renamed from chdir.c.
+ * lib/chdir-long.h: Renamed from chdir.h.
+ [!defined PATH_MAX]: Define chdir_long to chdir on systems like the
+ Hurd.
+
+2005-01-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/allocsa.m4, m4/codeset.m4, m4/copy-file.m4, m4/eaccess.m4:
+ * m4/eealloc.m4, m4/eoverflow.m4, m4/execute.m4, m4/fatal-signal.m4:
+ * m4/findprog.m4, m4/glibc21.m4, m4/iconv.m4, m4/intmax_t.m4:
+ * m4/inttypes_h.m4, m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4:
+ * m4/linebreak.m4, m4/localcharset.m4, m4/longdouble.m4:
+ * m4/longlong.m4, m4/mbrtowc.m4, m4/mbstate_t.m4, m4/mbswidth.m4:
+ * m4/mkdtemp.m4, m4/pipe.m4, m4/readlink.m4, m4/safe-read.m4:
+ * m4/safe-write.m4, m4/setenv.m4, m4/sig_atomic_t.m4:
+ * m4/signalblocking.m4, m4/signed.m4, m4/size_max.m4, m4/ssize_t.m4:
+ * m4/stdbool.m4, m4/stdint_h.m4, m4/stpcpy.m4, m4/stpncpy.m4:
+ * m4/strcase.m4, m4/strcspn.m4, m4/strpbrk.m4, m4/strstr.m4:
+ * m4/ucs4-utf.m4, m4/uintmax_t.m4, m4/ulonglong.m4, m4/unicodeio.m4:
+ * m4/utf-ucs4.m4, m4/vasnprintf.m4, m4/vasprintf.m4:
+ * m4/wait-process.m4, m4/wchar_t.m4, m4/wint_t.m4, m4/xsize.m4:
+ Use an all-permissive copyright notice, recommended by RMS.
+
+2005-01-18 Bob Proulx <bob@proulx.com>
+
+ * lib/obstack.c [DEFAULT_ALIGNMENT]: Use an intermediate type to
+ simplify offsetof() macro construct to avoid compile failure with
+ native HP-UX 11.0 ANSI C compiler.
+
+2005-01-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/stpncpy.c: Remove HAVE_STPNCPY and gnu_stpncpy renaming,
+ redundant because stpncpy.m4 takes care of it.
+
+2005-01-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/progreloc.c: Include xalloc.h instead of xmalloc.h.
+
+2005-01-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/progreloc.c (xstrdup): Define as strdup if no xmalloc should be
+ used.
+
+2005-01-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/fwriteerror.h (fwriteerror): Change specification to include
+ fclose.
+ * lib/fwriteerror.c: Include <stdbool.h>.
+ (fwriteerror): At the end, close the file stream. Record whether
+ stdout was already closed.
+
+2005-01-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/execute.c (environ): Declare if needed.
+ * lib/pipe.c (environ): Likewise.
+ Reported by Michael Schloh von Bennewitz <michael.schloh@cw.com>.
+
+2005-01-11 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * modules/argp: Depend on vsnprintf
+
+2005-01-10 Jim Meyering <jim@meyering.net>
+
+ * modules/closeout (Depends-on): Add atexit.
+
+2005-01-06 Bruno Haible <bruno@clisp.org>
+
+ * m4/stpncpy.m4 (gl_FUNC_STPNCPY): Rename stpncpy to gnu_stpncpy here.
+
+2005-01-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/human.c (SIZE_MAX, UINTMAX_MAX): Move these conditional
+ definitions to be after all include files, to avoid collisions.
+ Problem reported by Bob Proulx.
+
+2005-01-04 Jim Meyering <jim@meyering.net>
+
+ Changes imported from coreutils.
+ * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Rather than using "conftestXXXXXX"
+ as the mkstemp template, use a temporary directory and an
+ 8.3-friendly template to avoid trouble on systems like DJGPP.
+ Reported by Juan M. Guerrero via Stepan Kasal.
+ * m4/(gl_FUNC_MKSTEMP): Include <unistd.h> for the declaration of
+ close. Remove the temporary directory right away, rather than waiting
+ for configure's at-exit trap code to do it.
+ Suggestion from Stepan Kasal.
+
+2005-01-01 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool: Print #include directives when --import'ing.
+
+2004-12-28 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-base64.c: Include required header files. Remove
+ unused variables.
+
+2004-12-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/error (Depends-on): Remove gettext.
+
+2004-12-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/error.c [!_LIBC && !ENABLE_NLS]: Do not include "gettext.h";
+ not needed. This removes a dependency on the gettext module.
+ [defined _LIBC]: Do not include <libintl.h>; not needed.
+
+2004-12-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/c-strtod.m4 (gl_C99_STRTOLD): New macro.
+ (gl_C_STRTOD): Use it instead of AC_CHECK_DECLS_ONCE(strtold).
+
+2004-12-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/c-strtod.c (STRTOD): Depend on HAVE_C99_STRTOLD, not
+ HAVE_DECL_STRTOLD.
+
+2004-12-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/getdate (Depends-on): Remove alloca-opt.
+
+2004-12-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getdate.m4 (gl_GETDATE): Remove AC_FUNC_ALLOCA.
+
+2004-12-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argp-parse.c: Include <stddef.h>.
+ (alignof, alignto): New macros.
+ (parser_init): Don't assume that void * is aligned sufficiently
+ for struct option.
+
+ * lib/getdate.y (YYSTACK_USE_ALLOCA): Define to 0, since there's no
+ need to extend the stack.
+ (YYINITDEPTH): New macro, so that the initial stack isn't overly
+ large.
+
+2004-12-22 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * lib/argp-parse.c (parser_init): Avoid arithmetics on void pointers.
+
+2004-12-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/regex (lib_SOURCES): Remove regex.c, undoing previous
+ (2004-10-24) change. Apparently this was a false alarm.
+
+ * modules/getdate: Depend on alloca-opt, not alloca.
+
+2004-12-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/alloca_.h: Conditionalize on _GNULIB_ALLOCA_H, not _ALLOCA_H.
+ Remove now-obsolete comment about AIX.
+ * lib/getdate.y: Include <alloca.h> only if HAVE_ALLOCA.
+ (YYSTACK_USE_ALLOCA): Define to 0 if !HAVE_ALLOCA.
+ (YYMAXDEPTH): New macro.
+
+2004-12-18 Simon Josefsson <jas@extundo.com>
+
+ * modules/alloca: Depend on alloca-opt, instead of duplicating it.
+
+2004-12-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/fatal-signal.m4 (gl_FATAL_SIGNAL): Also test for sigaction.
+
+2004-12-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/fatal-signal.c (fatal_signals): Make non-const.
+ (init_fatal_signals): New function.
+ (uninstall_handlers, install_handlers): Ignore signals that were set to
+ SIG_IGN.
+ (at_fatal_signal): Call init_fatal_signals.
+ (init_fatal_signal_set): Likewise. Ignore signals that were set to
+ SIG_IGN.
+ Reported by Paul Eggert.
+
+2004-12-18 Bruno Haible <bruno@clisp.org>
+
+ * doc/alloca.texi: New file.
+ * doc/alloca-opt.texi: New file.
+
+2004-12-17 Jim Meyering <jim@meyering.net>
+
+ * config/install-sh: Use `(exit N); exit N', not `(exit N); exit'.
+ Otherwise, install-sh could exit with improper exit status when
+ exiting via a trapped interrupt. Thanks to a report from Bob Proulx.
+
+2004-12-16 Simon Josefsson <jas@extundo.com>
+
+ * tests/test-base64.c: Add license.
+
+2004-12-15 Stepan Kasal <address@hidden>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Shorten a long sed command.
+
+2004-12-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/getcwd (Files): Add m4/d-ino.m4.
+ Suggested by Mark D. Baushke.
+
+2004-12-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y (textint): New member "negative".
+ (time_zone_hhmm): New function.
+ Expect 14 shift-reduce conflicts, not 13.
+ (o_colon_minutes): New rule.
+ (time, zone): Use it to add support for +HH:MM, UTC+HH:MM.
+ (yylex): Set the "negative" member of signed numbers.
+
+2004-12-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/getdate.texi (Time of day items, Time zone items):
+ Describe new formats +00:00, UTC+00:00.
+
+2004-12-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/ls-mntd-fs.m4 (AC_FUNC_GETMNTENT): Fix typo in previous change:
+ spurious "-l"s. Problem reported by Stepan Kasal.
+
+2004-12-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/ls-mntd-fs.m4 (AC_FUNC_GETMNTENT): New macro, to work around bug
+ in Autoconf 2.59. Problem reported by Mark D. Baushke.
+
+2004-12-04 Simon Josefsson <jas@extundo.com>
+
+ * modules/getaddrinfo (License): Add LGPL, reported by Yoann
+ Vandoorselaere <yoann@prelude-ids.org>.
+
+2004-12-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ Changes imported from coreutils.
+ * m4/hard-locale.m4 (gl_HARD_LOCALE): Assume locale.h and setlocale
+ exist.
+ * m4/human.m4 (gl_HUMAN): Assume locale.h and localeconv exist.
+
+2004-12-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ Changes imported from coreutils.
+ * lib/hard-locale.c: Assume <locale.h> exists.
+ Include "strdup.h".
+ (GLIBC_VERSION): New macro.
+ (hard_locale): Assume setlocale exists.
+ Rewrite to avoid #ifdef.
+ Use strdup rather than malloc + strcpy.
+ * lib/human.c: Assume <locale.h> exists.
+ (human_readable): Assume localeconv exists.
+
+2004-12-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/hard-locale (Depends-on): Add strdup.
+
+2004-12-01 Jakub Jelinek <jakub@redhat.com>
+
+ * lib/mktime.c (__mktime_internal): If SEC_REQUESTED != SEC,
+ convert T2, not T. (Imported from libc.)
+
+2004-11-30 Simon Josefsson <jas@extundo.com>
+
+ * modules/restrict (License): Change to LGPL.
+
+2004-11-30 Simon Josefsson <jas@extundo.com>
+
+ * m4/restrict.m4: Add copyright and copying conditions.
+
+2004-11-30 Simon Josefsson <jas@extundo.com>
+
+ * m4/base64.m4: New file.
+
+2004-11-30 Simon Josefsson <jas@extundo.com>
+
+ * MODULES.html.sh (Extra functions based on ANSI C 89): Add
+ base64.
+
+ * tests/test-base64.c: New file.
+
+ * modules/base64: New file.
+
+2004-11-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getcwd-path-max.m4 (gl_FUNC_GETCWD_PATH_MAX):
+ Define HAVE_PARTLY_WORKING_GETCWD if getcwd is partly working.
+
+ * m4/readutmp.m4 (gl_READUTMP): Don't check for sys/param.h.
+
+2004-11-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getcwd.c (is_ENAMETOOLONG): New macro.
+ (__getcwd.c): Don't restore errno; glibc doesn't.
+ [HAVE_PARTLY_WORKING_GETCWD && !defined AT_FDCWD]: Try system getcwd
+ first, falling back to our code only if its results look suspicious.
+ Ensure that the resulting buffer is only as large as necessary.
+
+ * lib/readutmp.c: Include readutmp.h first.
+ Include <errno.h>, since readutmp.h no longer does that.
+ * lib/readutmp.h: Don't include <errno.h>,
+ <sys/param.h>, <time.h>; not needed to establish interface.
+ (errno): Remove decl.
+ (HAVE_STRUCT_XTMP_UT_TYPE): Remove; no longer needed.
+ (UT_TYPE_EQ, UT_TYPE_NOT_DEFINED, UT_TYPE_BOOT_TIME,
+ UT_TYPE_USER_PROCESS, IS_USER_PROCESS): New macros.
+
+2004-11-28 Simon Josefsson <jas@extundo.com>
+
+ * lib/base64.h, base64.c: New file.
+
+2004-11-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getcwd.h: New file, which I forgot to check in on 2004-11-25.
+
+2004-11-26 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/getcwd (Files): Add lib/getcwd.h, m4/getcwd.m4.
+ (Depends-on): Remove pathmax, same. Add mempcpy.
+ (configure.ac): GL_FUNC_GETCWD_PATH_MAX -> gl_FUNC_GETCWD.
+ (Makefile.am): Append getcwd.h to lib_SOURCES.
+ (Include): Add getcwd.h.
+ (Maintainer): Change from Jim Meyering to "all, glibc",
+ since getdate now uses intended-for-glibc code.
+ * modules/xgetcwd (Files): Remove m4/getcwd.m4.
+ (Depends-on): Depend on getcwd. Do not depend on pathmax.
+
+2004-11-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix problems reported by Scott S. Tinsley for HP-UX 11.11 using
+ HP's ANSI C compiler.
+ * lib/fsusage.c (statvfs) [HAVE_SYS_STATVFS_H]: Remove decl.
+ Declaring int functions causes warnings on some modern systems and
+ shouldn't be needed to compile on ancient ones.
+ * lib/same.c (MIN) [defined MIN]: Don't define, since it's already
+ defined.
+
+ * lib/getcwd.c: Replace by a copy of glibc/sysdeps/posix/getcwd.c, but
+ with the following changes.
+ (__set_errno): Parenthesize properly.
+ Include <stdbool.h>.
+ (MIN, MAX, MATCHING_INO): New macros.
+ (__getcwd): Define with prototype, not K&R form.
+ Use heuristics to allocate default buffer on stack if possible.
+ If AT_FDCWD is defined, use openat and fstatat to avoid O(N**2)
+ behavior, and to avoid the PATH_MAX limit when computing
+ ../../../../...
+ Use MATCHING_INO to compare inode number to file.
+ Check for arithmetic overflow in size calculations.
+ Fix bug in reallocation of dot array that caused getcwd to fail
+ on directories nested deeper than 75.
+ Be more careful about saving errno on error.
+ Do not use realloc; use only free+malloc, as this is a bit
+ more flexible and avoids a needless copy operation.
+ Do not inspect st_dev and st_ino for symbolic links; POSIX
+ doesn't specify the latter.
+ Check for closedir errors.
+ Avoid needless casts.
+ Use "#ifdef weak_alias" around weak_alias, to be like other
+ glibc code.
+ The following changes to getcwd.c have effect only when used in
+ gnulib; they have no effect inside glibc proper.
+ (#pragma alloca) [defined _AIX && !defined __GNUC__]: Remove,
+ as alloca isn't used.
+ (alloca, __alloca): Likewise.
+ [!_LIBC]: Include "getcwd.h", "mempcpy.h".
+ Include <stddef.h>, <stdlib.h>, <string.h>, <limits.h>
+ unconditionally, as gnulib assumes C89 or better.
+ Do not include <sys/param.h>.
+ (errno) [!defined __GNU_LIBRARY__ && !defined STDC_HEADERS]: Remove
+ no-longer-necessary 'extern int errno' decl; gnulib assumes C89 or
+ better.
+ (NULL) [!defined NULL]: Remove; we assume C89 or better.
+ Include <dirent.h> in a way that is compatible with modern Autoconf.
+ (_D_ALLOC_NAMELEN, _D_EXACT_NAMLEN):
+ New macros, if not already defined.
+ Include <unistd.h> if _LIBC, not if __GNU_LIBRARY__.
+ Use "_LIBC", not "defined _LIBC", for consistency.
+ (HAVE_MEMPCPY): Remove; no longer needed now that gnulib has
+ a mempcpy module.
+ (__lstat, __closedir, __opendir, __readdir) [!_LIBC]: New macros.
+ (GETCWD_RETURN_TYPE): Remove. All uses replaced by char *.
+ * lib/xgetcwd.c: David MacKenzie's old code was removed, so give
+ credit only to Jim Meyering and adjust the copyright dates.
+ Do not include <limits.h>, <stdio.h>, <sys/types.h>,
+ <stdlib.h>, <unistd.h>, "pathmax.h".
+ Instead, include "xgetcwd.h" (first) and "getcwd.h".
+ (INITIAL_BUFFER_SIZE): Remove.
+ (xgetcwd): Rely on getcwd, since we now depend on a reliable one.
+
+2004-11-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getcwd-path-max.m4 (gl_FUNC_GETCWD_PATH_MAX): Renamed from
+ GL_FUNC_GETCWD_PATH_MAX for consistency. All uses changed.
+ Use the _ONCE methods, for efficiency.
+ Check for fcntl.h. In test program, include <errno.h>
+ and <fcntl.h> if available. Remove old K&R cruft from
+ test program. Check for common errors in GNU/Linux,
+ OpenBSD, and Solaris. Just set gl_cv_func_getcwd_path_max;
+ don't do AC_LIBOBJ, as that's getcwd.m4's job.
+ * m4/getcwd.m4 (gl_FUNC_GETCWD_NULL): Renamed from
+ AC_FUNC_GETCWD_NULL. All used changed. Change cache variable
+ name accordingly.
+ (gl_FUNC_GETCWD, gl_PREREQ_GETCWD): New macros. Revamp to
+ accommodate new getcwd.c.
+ * m4/jm-macros.m4 (gl_MACROS): Don't require GL_FUNC_GETCWD_PATH_MAX.
+ * m4/prereq.m4 (gl_PREREQ): Add gl_FUNC_MEMPCPY.
+ * m4/xgetcwd.m4 (gl_XGETCWD): Replace with gl_FUNC_GETCWD, since
+ that's all we need now.
+
+2004-11-23 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * m4/argp.m4 (gl_ARGP): Require gl_GETOPT_SUBSTITUTE unconditionally:
+ argp-parse.c depends on getopt internals, that means we should
+ always use our getopt, to be on the safe side.
+ * m4/getopt.m4 (gl_GETOPT): Check if GETOPT_H is already set, in
+ order not to spoil the result of an eventual previous invocation
+ of gl_GETOPT_SUBSTITUTE.
+
+2004-11-23 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * lib/getopt_.h: Re-addition of __getopt_argv_const caused
+ redefinition warnings. To avoid them, include the defines
+ in `#if !defined __need_getopt ... #endif'. The only place
+ where __getopt_argv_const is used is in definitions
+ of getopt_long and getopt_long_only below, which are as well
+ protected by `#ifndef __need_getopt'.
+ [defined __GETOPT_PREFIX && !defined __need_getopt]: Undef
+ __need_getopt after including <stdio.h> and <unistd.h> These
+ headers might have defined it.
+
+2004-11-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/utimens.m4 (gl_UTIMENS): Check for futimes function.
+
+2004-11-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/utimens.c (__attribute__, ATTRIBUTE_UNUSED): New macros.
+ (futimens): New function, which uses futimes if available.
+ (futimens, utimens): Support timespec==NULL, with same semantics
+ as utime and utimens.
+ * lib/utimens.h (futimens): New decl.
+
+2004-11-23 Jim Meyering <jim@meyering.net>
+
+ * lib/getopt_.h: Remove trailing blanks.
+
+2004-11-23 Jim Meyering <jim@meyering.net>
+
+ * lib/__fpending.c: Add comment.
+
+2004-11-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/canonicalize (Depends-on): Add xreadlink.
+ Problem reported by James Youngman.
+
+2004-11-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getopt_.h (__GETOPT_CONCAT, __GETOPT_XCONCAT, __GETOPT_ID):
+ New macros.
+ (getopt, getopt_long, getopt_long_only, optarg, opterr, optind,
+ optopt): Use them instead of invoking ## directly; otherwise, the
+ symbols will be __GETOPT_PREFIXgetopt rather than rpl_getopt.
+
+2004-11-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/strtok_r.c: Move comments from here...
+ * lib/strtok_r.h: ... to here.
+
+2004-11-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/calloc.m4 (_AC_FUNC_CALLOC_IF): Check for buggy calloc
+ implementations that mishandle size_t overflow.
+
+2004-11-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/realloc.c (rpl_realloc): Call 'free' if n==0, since realloc
+ might fail. Problem reported by Yoann Vandoorselaere.
+ * lib/calloc.c (rpl_calloc): Defend against buggy calloc
+ implementations that mishandle size_t overflow.
+
+2004-11-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/canon-host (Depends-on): Add strdup.
+
+2004-11-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/canon-host.m4 (gl_CANON_HOST): Check for getaddrinfo.
+
+2004-11-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/canon-host.c: Include "strdup.h".
+ (canon_host): Use getaddrinfo if available, so that IPv6 works.
+ Use strdup instead of malloc/strcpy to duplicate strings.
+
+ * lib/human.h (LONGEST_HUMAN_READABLE): Add 1 for space before unit.
+ (human_space_before_unit): New constant.
+ * lib/human.c (human_readable): Support it.
+
+ * lib/xgetcwd.c: Include <limits.h>, for PATH_MAX.
+ (xgetcwd): Set errno correctly when failing.
+ Work around Solaris 9 bug: getcwd sets errno==ERANGE even though
+ the failure is actually due to a PATH_MAX problem.
+
+ Further getopt changes to make it more likely that glibc will
+ buy the changes back.
+ * lib/getopt.c (POSIXLY_CORRECT): New constant.
+ (getopt): Use it, so to preserve glibc semantic
+ * lib/getopt1.c (getopt_long, getopt_long_only): Arg is char * const *
+ when compiling for libc.
+ * lib/getopt_.h (__getopt_argv_const): Bring it back.
+ (getopt_long, getopt_long_only): Use it.
+
+ * lib/getopt.c (_getopt_initialize, _getopt_internal_r,
+ _getopt_internal): New arg POSIXLY_CORRECT. All callers changed.
+ (getopt): Argv is now char * const *, as per standard.
+ (_getopt_internal_r, _getopt_internal): Argv is now char **,
+ not char *__getopt_argv_const *.
+ * lib/getopt1.c (getopt_long, _getopt_long_r, getopt_long_only,
+ _getopt_long_only_r): Likewise.
+ * lib/getopt_.h (getopt, getopt_long, geopt_long_only): Likewise.
+ * lib/getopt_int.h (_getopt_internal, _getopt_internal_r,
+ _getopt_long_r, _getopt_long_only_r): Likewise.
+ * lib/getopt_.h (__getopt_argv_const): Remove.
+ (getopt): Argv is now char * const *, as per standard.
+
+ * lib/getdate.y (tORDINAL): New token.
+ (day, relunit): Allow it for relative times.
+ (relative_time_table): Use tORDINAL for ordinals.
+
+2004-11-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/getdate.texi (General date syntax): "next" is 1, not 2.
+ Document that "second" isn't allowed as an ordinal number.
+
+2004-11-16 Jim Meyering <jim@meyering.net>
+
+ * modules/closeout (Depends-on): Add fpending.
+
+2004-11-15 Jim Meyering <jim@meyering.net>
+
+ * lib/closeout.c: Include "__fpending.h" once again.
+ Include <stdbool.h>.
+ (close_stdout): Don't fail just because stdout was closed initially,
+ since some programs don't write to stdout in the normal course of
+ operation (other than --version and --help), and we don't want this
+ function to make e.g. `touch file >&-' fail.
+ But do fail if it was closed and someone has tried to write to it.
+ E.g., `printf foo >&-' must fail.
+
+2004-11-13 Jim Meyering <jim@meyering.net>
+
+ * m4/jm-macros.m4: Do require gl_FUNC_FPENDING.
+
+2004-11-12 Simon Josefsson <jas@extundo.com>
+
+ * config/srclist.txt: Add strtok_r.c, glibc bought our changes, but a
+ small doc fix is still pending.
+
+2004-11-11 Simon Josefsson <jas@extundo.com>
+
+ * modules/strtok_r: New file.
+
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ strtok_r.
+
+2004-11-11 Simon Josefsson <jas@extundo.com>
+
+ * m4/strtok_r.m4: New file.
+
+ * m4/getopt.m4: Replace opterr.
+
+2004-11-11 Simon Josefsson <jas@extundo.com>
+
+ * lib/strtok_r.h, strtok_r.c: New file.
+
+2004-11-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getopt.m4 (gl_GETOPT_SUBSTITUTE): Define __GETOPT_PREFIX instead
+ of replacing opterr, getopt, etc. This should handle the
+ powerpc-apple-darwin5.5 problem recently noted by Simon Josefsson.
+
+2004-11-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getopt_.h (__getopt_argv_const): New macro, to be used so that
+ we can stop lying to compilers about the constness of argv when we
+ are compiled outside glibc.
+ (getopt, getopt_long, getopt_long_only): Use it.
+ * lib/getopt.c (_getopt_initialize, _getopt_internal_r,
+ _getopt_internal, getopt): Likewise.
+ * lib/getopt1.c (getopt_long, _getopt_long_r, getopt_long_only,
+ _getopt_long_only_r): Likewise.
+ * lib/getopt_int.h (_getopt_internal, _getopt_internal_r,
+ _getopt_long_r, _getopt_long_only_r): Likewise.
+
+ * lib/getopt_.h [defined __GETOPT_PREFIX && !defined __need_getopt]:
+ Include <stdlib.h> and <stdio.h>, and <unistd.h> if available.
+ Then rename getopt to __GETOPT_PREFIX##getopt, and so forth for
+ the other external symbols.
+ (getopt) [!defined __GNU_LIBRARY]: Use prototype, not old-style
+ declaration, since the above renaming now works around collisions.
+
+2004-11-11 Jim Meyering <jim@meyering.net>
+
+ * lib/linebreak.c: Remove trailing blanks.
+ * lib/alloca_.h: Likewise.
+ * lib/acosl.c: Likewise.
+ * lib/euidaccess.c: Likewise.
+ * lib/allocsa.h: Likewise.
+
+2004-11-10 Simon Josefsson <jas@extundo.com>
+
+ * m4/getaddrinfo.m4: New file.
+
+2004-11-10 Simon Josefsson <jas@extundo.com>
+
+ * lib/getaddrinfo.h, lib/getaddrinfo.c: New files.
+
+2004-11-10 Simon Josefsson <jas@extundo.com>
+
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ getaddrinfo.
+
+ * modules/getaddrinfo: New file.
+
+2004-11-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/prereq.m4 (gl_PREREQ): Require gt_FUNC_SETENV.
+
+2004-11-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mktime.c (SHR): New macro, which is a portable
+ substitute for >> that should work even on Crays.
+ (TIME_T_MIDPOINT, ydhms_diff, __mktime_internal): Use it.
+ Problem reported by Mark D. Baushke in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2004-11/msg00071.html>.
+ * lib/getdate.y (SHR): Likewise.
+ (tm_diff): Use it.
+ * lib/strftime.c (SHR): Likewise.
+ (tm_diff): Use it.
+ * lib/quotearg.c (struct quoting_options): Use unsigned int for
+ quote_these_too, so that right shifts are well defined. All uses
+ changed.
+
+2004-11-10 Jim Meyering <jim@meyering.net>
+
+ Ensure that no close failure goes unreported.
+ * lib/closeout.c (close_stdout): Always close stdout. I.e., don't
+ return early when it seems there's nothing to flush.
+ Don't include __fpending.h.
+
+2004-11-10 Jim Meyering <jim@meyering.net>
+
+ * modules/closeout (Depends-on): Remove fpending.
+
+2004-11-10 Jim Meyering <jim@meyering.net>
+
+ * m4/jm-macros.m4 (gl_MACROS): Don't require gl_FUNC_FPENDING.
+
+2004-11-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/strftime.m4 (_gl_STRFTIME_PREREQS): Remove. Move its body to
+ gl_FUNC_STRFTIME.
+ (gl_FUNC_STRFTIME): Use AC_CHECK_FUNCS_ONCE and AC_CHECK_HEADERS_ONCE
+ and AC_REQUIRE when possible, to avoid duplicate checks.
+ Check for <wchar.h>.
+
+2004-11-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/strftime.c (DO_MULTIBYTE): Check for wchar.h, too.
+
+2004-11-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/sockpfaf.m4: New file.
+
+2004-11-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/readlink.c: Include stddef.h, needed for size_t on Woe32.
+ Reported by Mark D. Baushke <mdb@cvshome.org>.
+
+2004-11-04 Bruno Haible <bruno@clisp.org>
+
+ 2004-09-11 Bruno Haible <bruno@clisp.org>
+ * allocsa.valgrind: New file.
+ 2004-02-06 Bruno Haible <bruno@clisp.org>
+ * allocsa.h (sa_alignof): Define differently with HP-UX cc, to
+ avoid a bug of this cc on HP-UX 10.20 dealing with enums.
+ Reported by Christopher Seip <chris.seip@hp.com>.
+
+2004-11-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/allocsa (Files): Add lib/allocsa.valgrind.
+ (Makefile.am): Distribute it.
+
+2004-11-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xreadlink.c (xreadlink): AIX and HP-UX readlink return -1
+ with errno == ERANGE if the buffer is too small.
+ Problem reported by Mark D. Baushke.
+
+2004-11-03 Albert Chin <china@thewrittenword.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/uint32_t.m4 (gl_AC_TYPE_UINT32_T): When determining uint32_t
+ equivalent, substitute $ac_type for equivalent type rather than
+ blindly using uint32_t *always* which won't work if uint32_t is not
+ available. Define _UINT32_T to work around typedef of uint32_t if
+ <sys/sched.h>, <pthread.h>, or <semaphore.h> used on Solaris
+ 2.5.1.
+
+2004-11-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/jm-macros.m4: Sync from coreutils.
+ (gl_MACROS): Check for mbrlen, for pathchk.
+ (gl_CHECK_ALL_TYPES): Require AC_TYPE_MBSTATE_T, for pathchk.
+
+2004-11-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xreadlink.c (MAXSIZE): New macro.
+ (xreadlink): Use it instead of SSIZE_MAX. Ensure initial buffer
+ size does not exceed MAXSIZE. Avoid cast.
+ As suggested by Mark D. Baushke in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2004-11/msg00009.html>,
+ if readlink fails with buffer size just under MAXSIZE, try again
+ with MAXSIZE.
+
+2004-11-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add mktime.c; glibc bought all our changes.
+
+2004-11-02 Derek R. Price <derek@ximbiot.com>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y [!TEST]: Include <stdio.h>, since we use sprintf now.
+ (get_date): Overparenthesize to avoid GCC warning.
+
+2004-11-02 Bruno Haible <bruno@clisp.org>
+
+ * m4/setenv.m4 (gt_FUNC_SETENV): Define VOID_UNSETENV if unsetenv()
+ returns void.
+
+2004-11-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/setenv.h (unsetenv): Define as a macro if the system's unsetenv()
+ function returns void.
+
+2004-11-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getpass.m4 (gl_PREREQ_GETPASS): Check for declarations of
+ fflush_unlocked, flockfile, funlockfile, funlockfile,
+ fputs_unlocked, putc_unlocked.
+
+2004-11-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getpass.c (fflush_unlocked, flockfile, funlockfile)
+ (funlockfile, fputs_unlocked, putc_unlocked): Don't define if
+ already declared.
+
+2004-10-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/getdate (Files): Add doc/getdate.texi.
+ (Depends-on): Add setenv, xalloc.
+
+2004-10-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y: Add support for TZ="foo" within a date string.
+ Fix some bugs near time_t boundaries. Reject dates with
+ out-of-range components, e.g., "Sept 31".
+ Include <stdlib.h>, "setenv.h", "xalloc.h".
+ (ISDIGIT_LOCALE): Remove; unused.
+ Note that the TZ and time functions used here are not reentrant.
+ (mktime_ok, get_tz): New functions.
+ (TZBUFSIZE): New constant.
+ (get_date): Parse leading TZ="foo". Reject out-of-range components;.
+ This requires that we sometimes generate our own TZ="XXX..." setting.
+
+2004-10-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/getdate.texi: New file, from coreutils with modifications for
+ the new TZ parsing.
+
+2004-10-27 Derek R. Price <derek@ximbiot.com>
+
+ * lib/mktime.c (not_equal_tm): Remove redundant check.
+
+2004-10-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/regex (lib_SOURCES): Add regex.c.
+ Reported by James Youngman in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2004-10/msg00199.html>.
+
+2004-10-24 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y: Use Bison 1.875 features, and some minor
+ code cleanups. This change does not affect semantics.
+ Don't include <stdlib.h>; no longer needed.
+ Don't include unlocked-io.h; only the "#if TEST" code uses
+ stdio, and performance isn't crucial there.
+ (PC, YYLEX_PARAM, YYPARSE_PARAM): Remove; replaced by
+ Bison 1.875 features as described below.
+ All uses of "PC." replaced by "pc->".
+ (YYSTYPE): Add a forward declaration.
+ (yylex, yyerror): Use full prototypes in forward decls.
+ Use "%pure-parser" rather than obsolescent "%pure_parser".
+ Use %parse-param and %lex-param instead of obsolescent
+ YYPARSE_PARAM and YYLEX_PARAM.
+ (meridian_table, month_and_day_table, time_units_table,
+ relative_time_table, time_zone_table, military_table,
+ lookup_zone, lookup_word, get_date):
+ Use NULL instead of 0 where appropriate.
+ (to_hour): Avoid abort (), to avoid a dependency on
+ stdlib.h.
+ (yyerror, yylex): Now accepts parser_control * arg.
+ (main) [TEST]: Use '\0' rather than 0 for char.
+
+2004-10-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getpagesize.m4 (gl_GETPAGESIZE): Check for <sys/param.h>.
+
+2004-10-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getpagesize.c (getpagesize): Don't assume <sys/param.h> exists.
+ It's now the caller's responsibility to handle the case where
+ !HAVE_GETPAGESIZE && !defined getpagesize.
+
+ * lib/mktime.c (leapyear): Arg is long int, not int.
+
+2004-10-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argp-fs-xinl.c, argp-xinl.c: Update from glibc.
+
+2004-10-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Fix typo: a $ was
+ missing. Problem reported by James Youngman.
+
+2004-10-16 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool: Fix comments. Fix parse problem.
+ (func_emit_lib_Makefile_am): Don't hard code a in libgl_a_SOURCES.
+
+2004-10-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/getopt.m4 (gl_GETOPT): Detect and reject the incompatible BSD
+ implementation of getopt_long. Problem reported by Alexander Taler in:
+ http://lists.gnu.org/archive/html/bug-gnulib/2004-10/msg00103.html
+
+2004-10-15 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Untabify. Initialize supplied_libname.
+ (func_usage): More homogenous output.
+ (func_modules_transitive_closure, func_modules_to_filelist,
+ func_emit_lib_Makefile_am): New functions.
+ (func_import): New function, extracted from big case statement. Use
+ func_get_license, func_modules_transitive_closure,
+ func_modules_to_filelist, func_emit_lib_Makefile_am. Initialize
+ opt_lgpl. Don't use test -a, as it's not portable.
+ (func_create_testdir): Use func_modules_transitive_closure,
+ func_modules_to_filelist, func_emit_lib_Makefile_am.
+
+2004-10-15 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_import): Let gl_INIT define LTALLOCA when needed.
+
+2004-10-15 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_emit_lib_Makefile_am): Add markers to separate
+ the portions belonging to each module.
+ Suggested by Derek Robert Price <derek@ximbiot.com>.
+
+2004-10-12 Simon Josefsson <jas@extundo.com>
+
+ * lib/getpass.c (fflush_unlocked, flockfile, funlockfile)
+ (fputs_unlocked, putc_unlocked) [!_LIBCS && !USE_UNLOCKED_IO]: Map
+ to real functions.
+
+2004-10-11 Yoann Vandoorselaere <yoann@prelude-ids.org>
+
+ * modules/vsnprintf: New file.
+
+2004-10-11 Yoann Vandoorselaere <yoann@prelude-ids.org>
+
+ * m4/vsnprintf.m4: New file.
+
+2004-10-11 Yoann Vandoorselaere <yoann@prelude-ids.org>
+
+ * lib/vsnprintf.h: New file.
+ * lib/vsnprintf.c: New file.
+
+2004-10-11 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (Support for systems lacking ISO C 99): Add
+ vsnprintf.
+
+2004-10-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclistvars.sh: Add GNUSTANDARDS (for eggert only).
+
+2004-10-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/snprintf.c (snprintf): Avoid a memory allocation if the result
+ fits into the provided buffer.
+
+2004-10-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/diacrit.c, diacrit.h: Add GPL notice.
+
+ * lib/atanl.c, logl.c: Add GPL notice, to match glibc's added LGPL
+ notice.
+ * lib/atanl.c (atanl): Keep the code as similar to glibc as possible.
+ * lib/logl.c (logl): Keep the code as similar to glibc as possible.
+ This avoids a potential constant-folding bug.
+
+2004-10-05 Bruno Haible <bruno@clisp.org>
+
+ * m4/strsep.m4 (gl_FUNC_STRSEP): Require AC_GNU_SOURCE. Don't check
+ for the declaration of strsep.
+
+2004-10-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/strsep.h: Don't declare strsep() if HAVE_STRSEP.
+
+2004-10-04 Simon Josefsson <jas@extundo.com>
+
+ * modules/memmem: New file.
+ * tests/test-memmem.c: New file.
+ * MODULES.html.sh (Extra functions based on ANSI C 89): Add memmem.
+
+2004-10-04 Simon Josefsson <jas@extundo.com>
+
+ * m4/memmem.m4: New file.
+
+2004-10-04 Simon Josefsson <jas@extundo.com>
+
+ * lib/memmem.h: New file.
+ * lib/memmem.c: New file, taken from glibc.
+
+2004-10-04 Simon Josefsson <jas@extundo.com>
+
+ * lib/error.c, md5.c, regex.c: Use '#if USE_UNLOCKED_IO' instead of
+ '#ifdef USE_UNLOCKED_IO'.
+
+2004-10-04 Simon Josefsson <jas@extundo.com>
+
+ * config/srclist.txt: Add memmem from glibc.
+
+2004-10-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/xalloc (Files, Makefile.am): Remove xstrdup.c.
+
+ * modules/argmatch, modules/argp, modules/closeout, modules/error,
+ modules/exclude, modules/getdate, modules/getline,
+ modules/getndelim2, modules/getpass, modules/getpass-gnu,
+ modules/getusershell, modules/linebuffer, modules/md5,
+ modules/mountlist, modules/posixtm, modules/readtokens,
+ modules/readutmp, modules/regex, modules/sha1,
+ modules/version-etc, modules/yesno:
+ Remove dependency on unlocked-io.
+
+2004-10-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/xalloc.m4 (gl_PREREQ_XSTRDUP): Remove. All uses removed.
+
+ * m4/unlocked-io.m4: Add copyright notice.
+ (gl_FUNC_GLIBC_UNLOCKED_IO): Define USE_UNLOCKED_IO.
+
+2004-10-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xalloc.h (xmemdup): Renamed from xclone. All uses changed.
+ * lib/xmalloc.c (xmemdup): Likewise.
+ * lib/xalloc.h (CCLONE, CLONE, NEW, XCALLOC, XMALLOC, XREALLOC,
+ XFREE): Remove these long-obsolescent macros.
+ * lib/xmalloc.c (xstrdup): Implementation moved here from xstrdup.c
+ * lib/xstrdup.c: Remove.
+
+ * lib/regex.c (re_comp): Cast gettext return value to char *,
+ Problem reported by Martin Neitzel via Mark D. Baushke.
+
+2004-10-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argmatch.c, closeout.c, error.c, exclude.c, getdate.y,
+ getndelim2.c, getpass.c, getusershell.c, linebuffer.c,
+ md5.c, mountlist.c, posixtm.c, readtokens.c, readutmp.c,
+ regex.c, sha1.c, version-etc.c, yesno.c:
+ Include "unlocked-io.h" only if USE_UNLOCKED_IO.
+ * lib/unlocked-io.h: Don't worry about USE_UNLOCKED_IO; that's now
+ the includer's responsibility.
+
+ Sync from coreutils.
+
+ * lib/modechange.c (mode_compile): Don't decrement a pointer that
+ points to the start of a string, as the C Standard says the
+ resulting behavior is undefined.
+
+ * lib/backupfile.h (enum backuptype): Rename none -> no_backups,
+ simple -> simple_backups, numbered_existing ->
+ numbered_existing_backups, numbered -> numbered_backups
+ to avoid shadowing problems. All uses changed.
+ * lib/argmatch.c (enum backuptype) [defined TEST]: Likewise.
+ * lib/backupfile.c (check_extension, numbered_backup):
+ Rename locals to avoid shadowing 'basename'.
+ * lib/backupfile.h (VALID_BACKUP_TYPE): Don't evaluate arg more than
+ once.
+
+ * lib/.cppi-disable: Add getopt_.h, getopt_int.h.
+ * lib/.cvsignore: Add getopt.h.
+
+2004-10-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/README: New file.
+ * gnulib-tool (func_all_modules, func_verify_module): modules/README is
+ not a module.
+
+2004-10-02 Jim Meyering <jim@meyering.net>
+
+ * lib/dirfd.h, getpagesize.h: Add copyright notice.
+
+2004-10-01 Yoann Vandoorselaere <yoann@prelude-ids.org>
+
+ * modules/strsep: New file.
+
+2004-10-01 Yoann Vandoorselaere <yoann@prelude-ids.org>
+
+ * m4/strsep.m4: New file.
+
+2004-10-01 Yoann Vandoorselaere <yoann@prelude-ids.org>
+
+ * lib/strsep.h: New file.
+ * lib/strsep.c: New file.
+
+2004-10-01 Simon Josefsson <jas@extundo.com>
+
+ * lib/snprintf.c (snprintf): Handle size==0.
+
+2004-10-01 Simon Josefsson <jas@extundo.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/snprintf.c: Include <stdarg.h>, <stdlib.h>, <string.h>.
+ (snprintf): Declare 'args'.
+
+2004-10-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/snprintf.c: Remove comments as to why each header is needed.
+
+2004-10-01 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh: Add strsep.
+
+2004-09-30 Simon Josefsson <jas@extundo.com>
+
+ * modules/snprintf: New file.
+
+2004-09-30 Simon Josefsson <jas@extundo.com>
+
+ * m4/snprintf.m4: New file.
+
+2004-09-30 Simon Josefsson <jas@extundo.com>
+
+ * lib/snprintf.h, lib/snprintf.c: New files.
+
+2004-09-30 Sergey Poznyakoff <gray@Mirddin.farlep.net>
+
+ * lib/argp-help.c (canon_doc_option): Fixed coredump if *name==NULL
+ (hol_entry_help): Never translate an empty string.
+ Do not translate option tag (opt->name) if OPTION_NO_TRANS is set
+ * lib/argp.h (OPTION_NO_TRANS): New option.
+
+2004-09-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/argp (Maintainer): Replace Simon Josefsson
+ by Sergey Poznyakoff.
+
+2004-09-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Comment-out argp/argp.h, until we get the argp
+ changes merged back into glibc.
+
+2004-09-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (Support for systems lacking ISO C 99): Add snprintf.
+
+2004-09-29 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * lib/xvasprintf.c: Include xalloc.h.
+ (xvasprintf): Use xalloc_die, not xmalloc_die.
+
+2004-09-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/alloca-opt: New file, derived from modules/alloca.
+ * modules/allocsa: Depend on alloca-opt instead of alloca.
+ * modules/setenv: Likewise.
+ * modules/vasnprintf: Likewise.
+ * MODULES.html.sh: Add alloca-opt.
+
+2004-09-28 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool: New parameter --lgpl, to asseert that modules are
+ LGPL, and to replace license template from GPL to LGPL.
+
+2004-09-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/dummy: Change license to LGPL.
+
+2004-09-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/dummy.c: Change copyright notice to FSF, and license to GPL.
+
+2004-09-24 Simon Josefsson <jas@extundo.com>
+
+ * modules/minmax (License): Change from GPL to LGPL.
+
+2004-09-23 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool (--import): Typo.
+
+2004-09-23 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool (--import): Make sure *.m4 end up in m4/ by default.
+
+2004-09-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/*: Add 'License' field.
+ * gnulib-tool: Accept --extract-license option.
+ (func_get_license): New function.
+
+2004-09-21 Bruno Haible <bruno@clisp.org>
+
+ * modules/vasnprintf (Files): Add m4/stdint_h.m4, m4/inttypes_h.m4.
+ Reported by Simon Josefsson.
+
+2004-09-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/inttostr (Files): Add m4/longlong.m4, since it uses
+ gl_AC_TYPE_LONG_LONG.
+
+2004-09-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Add getsubopt.c, since libc bought our changes.
+
+2004-09-18 Simon Josefsson <jas@extundo.com>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * gnulib-tool: Replace various ad-hoc automake/autoconf/aclocal
+ calls with autoreconf. Define GL_LIB.
+
+2004-09-14 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: unsync setenv.c, sigh.
+
+2004-09-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argp-pvh.c (argp_program_version_hook): Provide initial value.
+ Problem reported by Bruno Haible in:
+ http://lists.gnu.org/archive/html/bug-tar/2004-09/msg00023.html
+
+2004-09-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Comment out argp-pvh.c.
+
+2004-09-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/mempcpy.h: Wrap the entire include file inside #ifndef mempcpy,
+ in case some system header has #define'd it. Problem reported by
+ Soeren D. Schulze in
+ <http://lists.gnu.org/archive/html/bug-gnulib/2004-09/msg00017.html>.
+
+2004-09-09 Karl Berry <karl@gnu.org>
+
+ * regex.[ch]: delete from the root. These were supposed to be
+ synced with emacs cvs, but this has not happened for about
+ a year, and anyway nothing else uses emacs regex.[ch].
+ bug-gnulib mail from Jeff Bailey, 9 Sep 2004 15:49:24 -0700.
+ lib/regex[.ch] is untouched.
+
+2004-09-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/vasnprintf (Files): Add m4/eoverflow.m4.
+
+2004-09-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/eoverflow.m4: New file, taken from GNU libiconv eilseq.m4 with
+ modifications.
+ * m4/vasnprintf.m4 (gl_FUNC_VASNPRINTF): Require gl_EOVERFLOW.
+
+2004-09-08 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * modules/xvasprintf: New file.
+ * MODULES.html.sh (Extra functions based on ANSI C 89): Add vasprintf.
+
+2004-09-08 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * lib/xvasprintf.h: New file.
+ * lib/xvasprintf.c: New file.
+ * lib/xasprintf.c: New file.
+
+2004-09-08 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdint.m4: New file, taken from GNU clisp with modifications.
+
+2004-09-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Signal EOVERFLOW if the resulting
+ length is > INT_MAX.
+ * lib/vasprintf.c (vasprintf): Don't test for length > INT_MAX any
+ more.
+
+2004-09-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdint_.h: New file, taken from GNU clisp.
+
+2004-09-08 Bruno Haible <bruno@clisp.org>
+ Oskar Liljeblad <oskar@osk.mine.nu>
+
+ * modules/stdint: New file.
+ * MODULES.html.sh (Support for systems lacking ISO C 99): Add stdint.
+
+2004-08-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ Import from coreutils.
+ * lib/userspec.c: Don't use <alloca.h>, so that we don't use alloca on
+ strings on unbounded length. alloca's performance benefits aren't
+ that important here.
+ (V_STRDUP): Remove.
+ (parse_with_separator): New function, with most of the internals
+ of the old parse_user_spec. Allow user to omit both user and group,
+ for compatibility with FreeBSD.
+ Clone only the user name, not the entire spec.
+ Do not set *uid, *gid unless entirely successful.
+ Avoid memory leak in some failing cases.
+ Fix regression for USER.GROUP reported by Dmitry V. Levin in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2004-08/msg00102.html>
+ (parse_user_spec): Rewrite to use parse_with_separator.
+
+2004-08-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/userspec: Don't depend on alloca.
+
+2004-08-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/userspec.m4 (gl_USERSPEC): Don't require AC_FUNC_ALLOCA.
+
+2004-08-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh: Add xalloc-die, c-strtod, c-strtold, raise,
+ readtokens0, getcwd, fcntl-safer, canonicalize, cycle-check,
+ utimecmp, utimens, xnanosleep. Rename sha to sha1.
+
+2004-08-16 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool: Use sed instead of autoconf --trace, inspired by
+ libtoolize behaviour by "Gary V. Vaughan" <gary@gnu.org>.
+ Add --dry-run for --import.
+ Let user provided command line parameters override configure.ac
+ settings.
+
+2004-08-12 Simon Josefsson <jas@extundo.com>
+
+ * m4/getopt.m4 (gl_GETOPT_SUBSTITUTE): New macro,
+ as discussed with Paul Eggert in threads rooted at
+ <http://lists.gnu.org/archive/html/bug-gnulib/2004-06/msg00039.html>
+ and
+ <http://lists.gnu.org/archive/html/bug-gnulib/2004-07/msg00001.html>.
+ Before, the test was empty, and relied on ELIDE_CODE in source
+ code.)
+ (gl_PREREQ_GETOPT): New macro.
+ (gl_GETOPT): Use them.
+
+2004-08-12 Simon Josefsson <jas@extundo.com>
+
+ * lib/getopt.c, getopt1.c: Remove ELIDE_CODE hack.
+ * lib/getopt_.h: Renamed from getopt.h.
+
+2004-08-12 Simon Josefsson <jas@extundo.com>
+
+ * gnulib-tool: Add --source-base, --m4-base, --libtool options.
+ Change default library name from libfoo to libgnu.
+ Now, if you have a configure.ac that says:
+ gl_SOURCE_BASE(gl)
+ gl_M4_BASE(gl/m4)
+ gl_MODULES(error getopt etcetera)
+ gl_INIT
+ you can import all you need by running:
+ ../gnulib/gnulib-tool --import
+
+ * modules/getopt (Files): Rename getopt.h to getopt_.h.
+ (Makefile.am): Rewrite, use logic from argz.
+ (Include): Use <getopt.h> instead of "getopt.h".
+
+2004-08-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/argp (Files): Add m4/unlocked-io.m4.
+ (Depends-on): Add extensions.
+
+2004-08-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/argp.m4 (gl_ARGP): Do not check for argp.h or argp_parse; nobody
+ uses HAVE_ARGP_H or HAVE_ARGP_PARSE.
+ Require gl_FUNC_GLIBC_UNLOCKED_IO, gl_USE_SYSTEM_EXTENSIONS.
+ Check for program_invocation_name, program_invocation_short_name,
+ flockfile, funlockfile, features.h, _getopt_long_only_r.
+
+2004-08-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argp-help.c, argp-parse.c: Use "gettext.h" instead of
+ its complicated substitute.
+ * lib/argp-help.c: Include <errno.h>, for program_invocation_short_name
+ and program_invocation_name.
+ (__argp_basename) [!_LIBC]: Remove; the only use was
+ replaced by its body.
+ (__argp_short_program_name): Change condition from
+ !defined __argp_short_program_name to
+ ! (defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME),
+ to match argp-namefrob.h.
+ (__argp_failure): Don't assume strerror_r returns char *.
+ * lib/argp-parse.c (N_): Define unconditionally.
+ (argp_default_options): Fill out initializers with 0 to avoid
+ gcc warnings.
+
+2004-08-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Remove getopt.c, getopt.h (renamed to getopt_.h),
+ getopt1.c.
+
+2004-08-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils.
+
+ * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Check for wmemchr and wmemcpy.
+
+ * m4/obstack.m4 (gl_PREREQ_OBSTACK): Require
+ gl_AC_HEADER_INTTYPES_H, gl_AC_HEADER_STDINT_H, gl_AC_TYPE_UINTMAX_T.
+
+2004-08-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils.
+
+ * lib/fnmatch.c (WIDE_CHAR_SUPPORT): Don't set to 1 if missing
+ wmemchr or wmemcpy. Problem reported by Robert Dahlem
+ for Reliant Unix 5.43.
+
+ * lib/obstack.c: Include <inttypes.h> and <stdint.h> if available.
+ (union fooround): Use uintmax_t, not long int.
+ The rest is a merge from libc:
+ [defined _LIBC]: Include <shlib-compat.h>.
+ (_obstack) [defined _LIBC]: Remove after 2.3.4.
+
+ * lib/settime.c (settime): Recode to avoid warning with
+ Sun Forte C 6U2.
+
+ * lib/strverscmp.c: Convert to UTF-8.
+
+2004-08-11 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/obstack (Files): Add m4/inttypes_h.m4, m4/stdint_h.m4,
+ m4/uintmax_t.m4.
+
+2004-08-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/xalloc-die: New file.
+ * modules/xalloc: Remove dependencies on error, gettext, exitfail.
+
+ * modules/md5 (Files): Add m4/uint32_t.m4.
+ * modules/sha1: Renamed from modules/sha.
+ (Files):
+ Rename lib/sha.h to lib/sha1.h.
+ Rename lib/sha.c to lib/sha1.c.
+ Rename m4/sha.m4 to m4/sha1.m4.
+ (lib_SOURCES): Likewise.
+ (configure.ac): Rename gl_SHA to gl_SHA1.
+ (Include): sha.h -> sha1.h.
+
+2004-08-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/uint32_t.m4, m4/uintptr_t.m4: New files.
+ * m4/sha1.m4: Renamed from sha.m4.
+ (gl_SHA1): Renamed from gl_SHA. All uses changed.
+
+2004-08-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/obstack.h (obstack_empty_p):
+ Don't assume that chunk->contents is suitably aligned.
+ * lib/obstack.c (_obstack_begin, _obstack_begin_1, _obstack_newchunk):
+ Likewise. Problem reported by Benno in
+ <http://sources.redhat.com/ml/libc-alpha/2004-08/msg00055.html>.
+
+ * lib/chown.c (rpl_chown): Work even if the file is writeable but not
+ readable. This could be improved further but it'd take some work.
+
+2004-08-08 Simon Josefsson <jas@extundo.com>
+
+ * modules/xgethostname (Depends-on): Remove exit and error (not
+ used).
+
+ * modules/getpass-gnu: Add getpass.h.
+ (Depends-on): Add stdbool.
+ * modules/getpass: Add getpass.h.
+
+2004-08-08 Simon Josefsson <jas@extundo.com>
+
+ * m4/getpass.m4 (gl_FUNC_GETPASS, gl_FUNC_GETPASS_GNU):
+ Check getpass declaration.
+
+2004-08-08 Simon Josefsson <jas@extundo.com>
+
+ * lib/xgethostname.c: Don't include error.h (not used).
+
+ * lib/getpass.h: Add.
+ * lib/getpass.c: Include getpass.h first.
+
+2004-08-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xalloc-die.c: New file.
+ * lib/xalloc.h (xalloc_fail_func, xalloc_msg_memory_exhausted): Remove.
+ All uses removed.
+ * lib/xmalloc.c (xalloc_fail_func, xalloc_msg_memory_exhausted):
+ Likewise. Move inclusions of gettext.h, error.h, exitfail.h to
+ xalloc-die.c.
+ (_, N_, xalloc_die): Move to xalloc-die.c.
+ * lib/userspec.c (parse_user_spaec): Use xstrdup rather than strdup,
+ so that we needn't mess with xalloc_msg_memory_exhausted.
+
+ * lib/sha1.h: Renamed from sha.h.
+ (SHA1_H): Renamed from _SHA_H.
+ (sha1_ctx): Renamed from sha_ctx.
+ (sha1_init_ctx): Renamed from sha_init_ctx.
+ (sha1_process_block): Renamed from sha_process_block.
+ (sha1_process_bytes): Renamed from sha_process_bytes.
+ (sha1_finish_ctx): Renamed from sha_finish_ctx.
+ (sha1_read_ctx): Renamed from sha_read_ctx.
+ (sha1_stream): Renamed from sha_stream.
+ (sha1_buffer): Renamed from sha_buffer.
+ * lib/sha1.c: Likewise; renamed from sha.c.
+ Do not include <sys/types.h>.
+ Include <stddef.h> rather than <stdlib.h>.
+
+2004-08-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/pathname.h (FILE_SYSTEM_PREFIX_LEN): Renamed from
+ FILESYSTEM_PREFIX_LEN.
+ * lib/progreloc.c: Likewise.
+ * lib/concatpath.c (concatenated_pathname): Use FILE_SYSTEM_PREFIX_LEN.
+
+2004-08-06 Simon Josefsson <jas@extundo.com>
+
+ * modules/progname (Depends-on): Don't depend on stdbool.
+
+2004-08-06 Simon Josefsson <jas@extundo.com>
+
+ * modules/getsubopt: New file.
+ * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
+ getsubopt.
+
+2004-08-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ More merge from coreutils.
+
+ * m4/utimens.m4, m4/utimecmp.m4: New files.
+ * m4/backupfile.m4, euidacces.m4, acl.m4, afs.m4, calloc.m4, dirfd.m4,
+ fsusage.m4, jm-macros.m4, ls-mntd-fs.m4, md5.m4, mountlist.m4,
+ prereq.m4, sha.m4: Import changes from coreutils.
+
+2004-08-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ More merge from coreutils.
+ * modules/raise, modules/readtokens0, modules/utimens:
+ * modules/utimecmp, module/xnanosleep: New files.
+ * modules/strftime: Add lib/strftime.h.
+ Change include from <time.h> to "strftime.h".
+ * modules/yesno: Add lib/yesno.h.
+ * modules/backupfile: Remove lib/addext.c.
+ * modules/euidaccess: Add stat-macros.h.
+ * modules/canonicalize, modules/euidaccess,
+ modules/filemode, modules/lchown, modules/makepath,
+ modules/rmdir, modules/stat: Likewise.
+
+2004-08-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from tar.
+ * lib/argp-help.c (make_hol, hol_append): Don't assume that
+ SIZE_MAX is a valid preprocessor constant.
+ (__argp_basename): Change from "#ifndef _LIBC"
+ to "#ifndef __argp_short_program_name", so that
+ we don't compile these functions for tar.
+
+ More merges from coreutils.
+ * lib/raise.c, lib/readtokens0.h, lib/readtokens0.c, lib/strftime.h:
+ * lib/utimens.h, lib/utimens.c, lib/utimecmp.h, lib/utimecmp.c:
+ * lib/xnanosleep.h, lib/xnanosleep.c, lib/yesno.h: New files.
+ * lib/addext.c: Remove; no longer needed.
+ * lib/yesno.c, lib/argmatch.h, lib/argmatch.c, lib/backupfile.h,
+ lib/backupfile.c, lib/euidaccess.c, lib/filemode.c, lib/closeout.c,
+ lib/dup2.c, lib/exclude.c, lib/fileblocks.c, lib/filemode.c,
+ lib/fnmatch.c, lib/fnmtahc_loop.c, lib/fopen-safer.c, lib/fsusage.c,
+ lib/fsusage.h, lib/ftruncate.c, lib/full-write.c, lib/getdate.y,
+ lib/getloadavg.c, lib/getugroups.c, lib/hard-locale.c,
+ lib/hard-locale.h, lib/hash.c, lib/human.c, lib/human.h, lib/lchown.c,
+ lib/lchown.h, lib/makepath.c, lib/makepath.h, lib/md5.c, lib/md5.h,
+ lib/memchr.c, lib/memcoll.c, lib/memrchr.c, lib/modechange.c,
+ lib/modechange.h, lib/mountlist.c, lib/mountlist.h, lib/nanosleep.c,
+ lib/posixtm.c, lib/putenv.c, quotearg.c, lib/quotearg.h,
+ lib/readtokens.c, lib/readutmp.c, lib/readutmp.h, lib/rmdir.c,
+ lib/safe-read.c, lib/save-cwd.c, lib/savedir.c, lib/setenv.c,
+ lib/sig2str.c, lib/stat.c, lib/strtoimax.c, lib/strverscmp.c,
+ lib/userspec.c, lib/utime.c, lib/version-etc.c., lib/xgethostname.c,
+ lib/xmemcoll.c, lib/xreadlink.c, lib/xstrtod.c, lib/xstrtod.h,
+ lib/xstrtoimax.c, lib/xstrtol.c, lib/xstrtol.h, lib/xstrtoumax.c:
+ Import changes from coreutils.
+
+2004-08-05 Simon Josefsson <jas@extundo.com>
+
+ * m4/strdup.m4: Always run gl_PREREQ_STRDUP, since strdup.h need it.
+
+2004-08-05 Simon Josefsson <jas@extundo.com>
+
+ * m4/getsubopt.m4: New file.
+
+2004-08-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils.
+
+ * m4/c-strtod.m4, m4/canonicalize.m4, m4/fcntl-safer.m4:
+ * m4/getcwd-path-max.m4: New files.
+
+ * m4/dos.m4 (gl_AC_DOS): filesystem -> file system renaming.
+ FILESYSTEM_PREFIX_LEN ->
+ FILE_SYSTEM_PREFIX_LEN.
+ FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX ->
+ FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX.
+ FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR ->
+ FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR.
+
+ * m4/path-concat.m4 (gl_PATH_CONCAT): Don't require gl_AC_DOS, the
+ prerequisite modules now handle the DOS stuff.
+ Don't check for unistd.h.
+
+2004-08-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils.
+
+ * lib/.gdb-history: Remove; this doesn't belong here.
+
+ * lib/c-strtod.c, lib/c-strtod.h, lib/c-strtold.c, lib/cycle-check.c:
+ * lib/cycle-check.h, lib/dev-ino.h, lib/canonicalize.h:
+ * lib/canonicalize.c, lib/fcntl-safer.h, lib/fcntl-safer.c:
+ * lib/getcwd.c: New files.
+
+ * lib/dirname.h: Include <stdbool.h>.
+ (FILE_SYSTEM_PREFIX_LEN): Renamed from FILESYSTEM_PREFIX_LEN,
+ for consistency with POSIX terminology. All uses changed.
+ (IS_ABSOLUTE_FILE_NAME, IS_RELATIVE_FILE_NAME): New macros.
+ (strip_trailing_slashes): Use bool for booleans.
+ * lib/stripslash.c (strip_trailing_slashes): Likewise.
+
+ * lib/error.c: Work around bug in OpenBSD 3.4 sterror_r: it
+ sometimes returns a positive errno value even when it succeeds.
+ (print_errno_message) [!LIBC]: Fall back on strerror if
+ __strerror_r fails.
+
+ * lib/path-concat.c (mempcpy): Don't define if a system header defines
+ it. Don't include stdio.h, stdlib.h, unistd.h, strdup.h.
+ (longest_relative_suffix): New function.
+ (path_concat): Use it. Assume first argument is not NULL.
+ Port to DOS. Omit redundant separators.
+ Report an error instead of returning NULL.
+ Use mempcpy instead of memcpy.
+ (xpath_concat): Remove: not declared or used.
+
+ * lib/same.h: Include <stdbool.h>
+ (same_name): Return bool, not int.
+ * lib/same.c (same_name): Likewise.
+ (errno): Don't declare; we assume C89 or better now.
+
+ * lib/stat-macros (S_ISCTG, S_ISOFD, S_ISOFL): New macros,
+ if not already defined.
+
+ * lib/xgetcwd.c (errno): Don't declare; we assume C89 or better now.
+ * lib/dup-safer.c (errno): Likewise.
+
+2004-08-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils.
+ * modules/c-strtod, modules/c-strtold, modules/canonicalize:
+ * modules/cycle-check, modules/fcntl-safer, modules/getcwd: New files.
+ * modules/path-concat: Don't depend on strdup.
+
+2004-08-03 Simon Josefsson <jas@extundo.com>
+
+ * lib/strdup.h: Only use HAVE_DECL_STRDUP if defined.
+ * lib/progname.h: Don't include stdbool.h.
+
+2004-08-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/fatal: Remove, as the "fatal" module wasn't used or working.
+ * MODULES.html.sh (func_all_modules): Remove fatal.
+
+2004-08-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/fatal.m4: Remove, as the "fatal" module wasn't used or working.
+
+2004-08-03 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fatal.c, fatal.h: Remove as the "fatal" module wasn't used or
+ working.
+
+2004-08-02 Simon Josefsson <jas@extundo.com>
+
+ * lib/getsubopt.h: New file, with comments from Bruno Haible.
+ * lib/getsubopt.c: New file, from glibc, but slightly modified based on
+ suggestions from Paul Eggert <eggert@cs.ucla.edu>.
+
+2004-08-01 Simon Josefsson <jas@extundo.com>
+
+ * lib/xgetdomainname.c: Include stdlib.h, for free().
+
+2004-07-19 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (func_all_modules): Add dummy.
+
+2004-07-16 Simon Josefsson <jas@extundo.com>
+
+ * modules/dummy: New file.
+
+2004-07-16 Simon Josefsson <jas@extundo.com>
+
+ * lib/dummy.c: New file.
+
+2004-07-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/backupfile.h: Add extern "C" for C++.
+ * lib/closeout.h: Likewise.
+ * lib/copy-file.h: Likewise.
+ * lib/findprog.h: Likewise.
+ * lib/full-write.h: Likewise.
+ * lib/pathname.h: Likewise.
+ * lib/progname.h: Likewise.
+ * lib/stpcpy.h: Likewise.
+ * lib/stpncpy.h: Likewise.
+ * lib/strcase.h: Likewise.
+ * lib/strstr.h: Likewise.
+ * lib/xalloc.h: Likewise.
+
+ * lib/mbswidth.h: Add extern "C" for C++.
+ Reported by Albert Chin-A-Young <china@thewrittenword.com>.
+
+2004-07-13 Robert Millan <robertmh@gnu.org>
+
+ * m4/host-os.m4: s/KNetBSD/kNetBSD/g and s/KFreeBSD/kFreeBSD/g.
+
+2004-07-09 Simon Josefsson <jas@extundo.com>
+
+ * lib/getndelim2.c: Include stddef.h, for ptrdiff_t. (FreeBSD 4.9
+ failed without this.)
+
+2004-07-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/chown (Files): Add lib/fchown-stub.c, since
+ gl_PREREQ_CHOWN invokes AC_LIBOBJ(fchown-stub).
+
+2004-07-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/fchown-stub.c: New file.
+
+2004-06-24 Jim Meyering <jim@meyering.net>
+
+ * lib/obstack.h (obstack_base): Cast to (void *), per documentation.
+
+2004-06-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/argz: Omit "#include".
+
+ * MODULES.html.sh (func_all_modules): Add calloc, to match
+ 2004-06-01 addition of calloc module.
+
+2004-06-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/argz.m4: New file, which is autoupdated from libtool.
+
+2004-06-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argz.c, lib/argz_.h: New files, which are autoupdated from
+ libtool.
+
+2004-06-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist-update: Don't insist on "USA." before the
+ close-comment, as libtool omits the period and puts the */ on a
+ separate line.
+ * config/srclist.txt: Add argz.c, argz_.h, argz.m4.
+ * config/srclistvars.sh: Add LIBTOOL (for eggert only).
+
+2004-06-22 Gary V. Vaughan <gary@gnu.org>
+
+ * modules/argz: New file.
+ * MODULES.html.sh (func_all_modules): Add argz.
+
+2004-06-12 Jim Meyering <jim@meyering.net>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ * modules/hash (Files): Add lib/xalloc.h.
+ * modules/pipe (Depends-on): Add wait-process.
+ * modules/stat (Depends-on): Add xalloc.
+ * modules/userspec (Files): Add lib/userspec.h.
+ * modules/xstrto
+
+ Upgrade from gettext-0.13.
+ * modules/gettext (Files): Add m4/intmax.m4, m4/longdouble.m4,
+ m4/longlong.m4, m4/printf-posix.m4, m4/signed.m4, m4/size_max.m4,
+ m4/wchar_t.m4, m4/wint_t.m4, m4/xsize.m4.
+
+2004-06-10 Jim Meyering <jim@meyering.net>
+
+ * lib/calloc.c: New file.
+
+2004-06-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/getdate.y (yylex): Allow space between sign and number.
+ Problem reported by Dan Jacobson.
+
+2004-06-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from coreutils CVS.
+
+ * m4/backupfile.m4, dirname.m4, human.m4, inttypes.m4, longlong.m4,
+ makepath.m4, memchr.m4, memcmp.m4, mountlist.m4, path-concat.m4,
+ putenv.m4, quotearg.m4, readutmp.m4, strtoimax.m4, strtoll.m4,
+ strtoull.m4, strtoumax.m4, ulonglong.m4, vasnprintf.m4,
+ xstrtol.m4: Fix copyright date and/or serial number.
+
+ * m4/chown.m4 (gl_PREREQ_CHOWN): Check for fcntl.h.
+ See if we need an fchown replacement.
+ (gl_FUNC_CHOWN_FOLLOWS_SYMLINK): New macro.
+ (gl_FUNC_CHOWN): Require gl_FUNC_CHOWN_FOLLOWS_SYMLINK,
+ and use the replacement function if we detect either defect.
+
+ * m4/prereq.m4 (gl_PREREQ): Add gl_ALLOCSA, gl_CLOEXEC, gl_INTTOSTR,
+ gl_UTIMECMP.
+
+2004-06-01 Paul Eggert <eggert@cs.ucla.edu>
+ and Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils CVS.
+
+ * lib/stat-macros.h: New file, with contents from file-type.h
+ and coreutils' system.h.
+ * lib/file-type.c: Include "stat-macros.h".
+ * lib/file-type.h (file_type): Move all macro definitions to new file,
+ stat-macros.h.
+
+ * lib/chown.c (rpl_chown) [CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE]:
+ Wrap old code with this conditional.
+ [CHOWN_MODIFIES_SYMLINK]: Try to work around a chown
+ function that does not dereference symlinks.
+ * lib/lchown.c (lchown) [CHOWN_MODIFIES_SYMLINK]: Just call chown.
+
+ * lib/xreadlink.c: Include xreadlink.h first, to catch .h file
+ dependency problems.
+ (xreadlink): Accept new arg SIZE, for efficiency.
+ All decls and uses changed.
+ * lib/xreadlink.h: Include <stddef.h>, for size_t.
+
+ * lib/.cppi-disable: Add alloca_.h, allocsa.h, exit.h, getndelim2.h,
+ gettext.h, localcharset.h, strdup.h, strndup.h, strtoul.c, time_r.h.
+
+ * lib/.cvsignore: Add alloca.h, fnmatch.h, poll.h, stdbool.h,
+ sysexits.h.
+
+2004-06-01 Jim Meyering <jim@meyering.net>
+
+ * m4/calloc.m4: New file.
+
+2004-05-31 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/stdbool.m4 (AC_HEADER_STDBOOL): Detect _Bool bug in HP aC++/ANSI
+ C B3910B A.05.55 [Dec 04 2003]. Problem reported by Jim Meyering.
+ Also, fix a typo in a diagnostic.
+
+2004-05-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/xalloc.m4 (gl_PREREQ_XMALLOC): Do not require AC_FUNC_MALLOC
+ or AC_FUNC_REALLOC.
+
+2004-05-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/xmalloc.c (HAVE_MALLOC, HAVE_REALLOC): Do not require these
+ macros to be defined.
+ (xnmalloc_inline, xnrealloc_inline, xcalloc): Do not die if
+ the allocator returns NULL because the requested size is zero.
+
+2004-05-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/malloc/obstack.c (_obstack) [defined _LIBC]: Bring back this
+ var. Add comment explaining why libc still defines it. This
+ merges the following patch from glibc:
+ http://sources.redhat.com/ml/libc-alpha/2004-05/msg00157.html
+
+2004-05-20 Andreas Schwab <schwab@suse.de>
+
+ * m4/free.m4: Replace free if it not known to work, not the other
+ way round.
+
+2004-05-19 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/obstack.c (_obstack): Remove unused variable. It hasn't been
+ present in glibc since revision 1.1 of this file.
+ * lib/obstack.h (_obstack_free, obstack_1grow, obstack_1grow_fast,
+ obstack_alignment_mask, obstack_alloc, obstack_base,
+ obstack_blank, obstack_blank_fast, obstack_chunk_size,
+ obstack_copy, obstack_copy0, obstack_finish, obstack_grow,
+ obstack_grow0, obstack_init, obstack_int_grow,
+ obstack_int_grow_fast, obstack_make_room, obstack_memory_used,
+ obstack_next_free, obstack_object_size, obstack_ptr_grow,
+ obstack_ptr_grow_fast, obstack_room): Remove declarations of
+ nonexistent functions.
+
+2004-05-18 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: break link for vasnprintf.c.
+
+2004-05-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port obstack to the AS/400, where pointers are 16 bytes wide and
+ you cannot cast an integer to a valid pointer. This patch is
+ currently waiting to be integrated into glibc; see
+ <http://sources.redhat.com/ml/libc-alpha/2004-05/msg00073.html>.
+
+ * lib/obstack.h (__PTR_TO_INT, __INT_TO_PTR): Remove.
+ All uses of __INT_TO_PTR (PTR_TO_INT ...) replaced by __PTR_ALIGN.
+ (__BPTR_ALIGN, __PTR_ALIGN): New macros.
+ (struct obstack): temp member is now a union of a pointer and
+ an integer, instead of an integer. All integer uses changed.
+ This does not affect the physical layout of struct obstack,
+ except on hosts (like the AS/400) where the size or alignment of
+ void * is greater than that of ptrdiff_t.
+ (obstack_finish) [! (defined __GNUC__ && defined __STDC__ &&
+ __STDC__)]: Store temporary in pointer member of union, not
+ integer member.
+ * lib/obstack.c: Include <stddef.h>, for offsetof.
+ (struct fooalign): Remove; it doesn't need a name.
+ (union fooround): Change double to long double, and add void *.
+ (DEFAULT_ALIGNMENT): Use offsetof to compute.
+ (DEFAULT_ALIGNMENT, DEFAULT_ROUNDING): Now an enum constant,
+ not a macro. Hence the values are always int; so remove all
+ casts-to-int in uses.
+
+2004-05-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ * config/srclist.txt: Break link for argp-help.c and argp-parse.c until
+ we can get this patch merged into glibc.
+
+2004-05-17 Derek R. Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/argp: Depend on alloca.
+
+2004-05-17 Derek R. Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/argp-help.c, argp-parse.c: Assume <alloca.h> rather than
+ freecoding.
+
+2004-05-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF): Correctly handle the case of a
+ precision that consists of a '.' followed by an empty digit string.
+ Patch by Tor Lillqvist <tml@iki.fi>.
+
+2004-05-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/alloca.m4 (gl_FUNC_ALLOCA): Define HAVE_ALLOCA_H always,
+ for backward compatibility with older code. We need our own
+ alloca.h if _AIX is defined. Define HAVE_ALLOCA if we discover
+ it under some other name, and our alloca.h will define it.
+
+2004-05-16 Paul Eggert <eggert@cs.ucla.edu>
+ Derek Price <derek@ximbiot.com>
+
+ * lib/alloca.c: Include <alloca.h>, to get our interface.
+ * lib/alloca_.h: Use __alloca on AIX, so that we don't have to
+ include <alloca.h> first. Use C89 prototype for alloca; this
+ requires including <stddef.h> for size_t. Use extern "C" if C++.
+ Use #elif for simplicity, since we can assume C89 now.
+ Don't try to source the system alloca.h since it will not be found
+ and to prevent recursively including its replacement.
+ * lib/fnmatch.c: Include <alloca.h> instead of opencoding.
+ * lib/regex.c: Likewise.
+
+2004-05-16 Derek Price <derek@ximbiot.com>
+ Paul Eggert <eggert@cs.ucla.edu>
+
+ getline cleanup. This changes the getndelim2 API: both order of
+ arguments, and meaning of delim2 (now uses EOF, not 0, to indicate
+ no delimiter).
+
+ * lib/getline.c: Don't include stddef.h or stdio.h, since our
+ interface does that.
+ (getline): Always use getdelim, so that we don't have two
+ copies of this code.
+ * lib/getndelim2.c: Include <limits.h>, <inttypes.h>, <stdint.h>
+ if available.
+ (PTRDIFF_MAX, SIZE_MAX, SSIZE_MAX): Define if not defined.
+ (GETNDELIM2_MAXIMUM): New macro.
+ (getndelim2): Reorder arguments. delim==EOF now means no delimiter,
+ instead of the old practice of delim2==0. All callers changed.
+ Return -1 on overflow, instead of returning junk.
+ Do not set *linesize unless allocation succeeds.
+ * lib/getndelim2.h: Do not include stddef.h; no longer needed, now
+ that we include sys/types.h.
+ * lib/getnline.h: Likewise.
+ * lib/getndelim2.h (GETNLINE_NO_LIMIT): New macro.
+ (getndelim2): Reorder arguments.
+ * lib/getnline.c (getnline, getndelim):
+ Don't discard the NMAX argument.
+ (getnline): Invoke getndelim, to avoid code duplication.
+ * lib/getnline.h (GETNLINE_NO_LIMIT): New macro, used instead
+ of (size_t) -1 by callers of the getnline family.
+
+2004-05-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/gettime.m4 (gl_GETTIME): Require gl_TIMESPEC.
+ Check for gettimeofday.
+ * m4/settime.m4 (gl_SETTIME): Require gl_TIMESPEC.
+ Check for settimeofday, stime.
+
+2004-05-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/nanosleep.c (suspended): Change its type from int to
+ sig_atomic_t volatile.
+ (first_call): Make it private to rpl_nanosleep, and have it
+ be zero initially as that's a bit faster.
+ (my_usleep): Round up fractional times instead of truncating them,
+ as this is the usual meaning for 'sleep'.
+
+ * lib/gettime.c (gettime): Fall back on `time' if `gettimeofday'
+ doesn't work.
+ * lib/settime.c: Include <unistd.h>, for stime (on Solaris 8, anyway).
+ (ENOSYS): Define if not defined.
+ (settime): Fall back on stime if it exists and settimeofday fails.
+ But don't bother with fallbacks if a method fails with errno == EPERM.
+
+2004-05-11 Jim Meyering <jim@meyering.net>
+
+ Prior to this change, the save_cwd caller required read access to the
+ current directory on most systems (ones with the fchdir function).
+
+ * lib/save-cwd.c (save_cwd) [HAVE_FCHDIR]: If opening `.' read-only
+ fails, try write-only, and finally, resort to using xgetcwd.
+
+2004-05-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * lib/obstack.c, obstack.h: Import changes from libc.
+
+2004-04-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/findprog.c (find_in_path): Treat Cygwin like Windows, since it
+ also implicitly appends .exe to executables.
+ * lib/localcharset.c (ISSLASH): Treat Cygwin like Windows, since it now
+ accepts Windows pathnames.
+ * lib/pathname.h (ISSLASH, IS_PATH_WITH_DIR, FILESYSTEM_PREFIX_LEN):
+ Treat Cygwin like Windows, since it now accepts Windows pathnames.
+ * lib/progreloc.c (ISSLASH, IS_PATH_WITH_DIR, FILESYSTEM_PREFIX_LEN):
+ Treat Cygwin like Windows, since it now accepts Windows pathnames.
+ Reported by Derek Robert Price <derek@ximbiot.com>.
+
+2004-04-21 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (localcharset.c): break sync.
+
+2004-04-20 Paul Eggert <eggert@twinsun.com>
+
+ * m4/host-os.m4: Add a copyright notice.
+
+2004-04-20 Jim Meyering <jim@meyering.net>
+
+ Change UTILS_ to gl_ in AC_DEFINE'd names.
+ Change utils_- and jm_-prefixed variables, too.
+ * m4/mkdir-slash.m4 (gl_FUNC_MKDIR_TRAILING_SLASH): Renamed from
+ UTILS_FUNC_MKDIR_TRAILING_SLASH.
+ * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Renamed from UTILS_FUNC_MKSTEP.
+
+ * m4/dirfd.m4 (gl_FUNC_DIRFD): Rename from UTILS_FUNC_DIRFD.
+ Don't emit trailing blanks.
+ Also rename jm_-prefixed variables to have gl_ prefix.
+
+ * m4/host-os.m4 (gl_HOST_OS): Rename from UTILS_HOST_OS.
+ Also rename jm_-prefixed variables to have gl_ prefix.
+
+ * m4/jm-macros.m4: Reflect the renamings.
+ * m4/prereq.m4: Likewise.
+
+2004-04-20 Jim Meyering <jim@meyering.net>
+
+ * lib/getndelim2.c (getndelim2): Upon realloc failure, don't leak
+ memory.
+
+2004-04-20 Jim Meyering <jim@meyering.net>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c (get_charset_aliases) [!VMS && !WIN32]: Don't leak
+ memory when realloc fails.
+
+2004-04-19 Jim Meyering <jim@meyering.net>
+
+ * m4/readutmp.m4 (gl_PREREQ_READUTMP): Require gl_FUNC_FREE,
+ now that readutmp.c may call `free (0)'.
+
+2004-04-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbrtowc.m4: Change jm_ to gl_ in cache variables as well.
+ * m4/inttypes_h.m4: Likewise.
+ * m4/stdint_h.m4: Likewise.
+ * m4/intmax_t.m4: Likewise.
+ * m4/uintmax_t.m4: Likewise.
+
+2004-04-18 Jim Meyering <jim@meyering.net>
+
+ * m4/prereq.m4: Don't forbid jm_ prefix.
+
+ * m4/afs.m4, m4/allocsa.m4, m4/assert.m4, m4/backupfile.m4:
+ * m4/bison.m4, m4/check-decl.m4, m4/chown.m4, m4/d-ino.m4:
+ * m4/d-type.m4, m4/dirname.m4, m4/dos.m4, m4/error.m4, m4/fpending.m4:
+ * m4/fstypename.m4, m4/fsusage.m4, m4/ftruncate.m4, m4/getdate.m4:
+ * m4/getgroups.m4, m4/gettext.m4, m4/glibc21.m4, m4/group-member.m4:
+ * m4/human.m4, m4/intmax.m4, m4/intmax_t.m4, m4/inttostr.m4:
+ * m4/inttypes.m4, m4/inttypes_h.m4, m4/jm-macros.m4, m4/jm-winsz1.m4:
+ * m4/jm-winsz2.m4, m4/lchown.m4, m4/lib-check.m4, m4/link-follow.m4:
+ * m4/localcharset.m4, m4/longlong.m4, m4/ls-mntd-fs.m4, m4/lstat.m4:
+ * m4/makepath.m4, m4/mbrtowc.m4, m4/mbswidth.m4, m4/memchr.m4:
+ * m4/memcmp.m4, m4/mkdtemp.m4, m4/mkstemp.m4, m4/mountlist.m4:
+ * m4/nanosleep.m4, m4/path-concat.m4, m4/perl.m4, m4/prereq.m4:
+ * m4/putenv.m4, m4/quotearg.m4, m4/regex.m4, m4/stat.m4:
+ * m4/stdint_h.m4, m4/strftime.m4, m4/strtoimax.m4, m4/strtoll.m4:
+ * m4/strtoull.m4, m4/strtoumax.m4, m4/timespec.m4, m4/uintmax_t.m4:
+ * m4/ulonglong.m4, m4/unlink-busy.m4, m4/unlocked-io.m4, m4/uptime.m4,
+ * m4/utimbuf.m4, m4/utime.m4, m4/utimes-null.m4, m4/vasnprintf.m4:
+ * m4/xstrtoimax.m4, m4/xstrtol.m4, m4/xstrtoumax.m4:
+ Change jm_ to gl_ in AC_DEFINE'd names. Update all uses.
+
+2004-04-18 Jim Meyering <jim@meyering.net>
+
+ * lib/readutmp.c (read_utmp) [UTMP_NAME_FUNCTION]: Upon realloc
+ failure, don't leak memory and do call END_UTMP_ENT.
+
+2004-04-16 Jim Meyering <jim@meyering.net>
+
+ * m4/prereq.m4 (jm_PREREQ_STAT): Remove macro. It is specific to
+ coreutils' stat program.
+ (gl_PREREQ): Don't require jm_PREREQ_STAT.
+
+2004-04-11 Paul Eggert <eggert@twinsun.com>
+
+ * lib/inttostr.h: Include <limits.h> unconditionally, since we assume
+ C89.
+ (CHAR_BIT): Remove, since we assume C89.
+ Include <stdint.h> if available, as per current Autoconf CVS advice.
+
+2004-03-31 Jim Meyering <jim@meyering.net>
+
+ * m4/prereq.m4: Require AC_FUNC_MALLOC, not jm_FUNC_MALLOC.
+ Require AC_FUNC_REALLOC, not jm_FUNC_REALLOC.
+ * m4/xalloc.m4: Likewise.
+
+2004-03-30 Paul Eggert <eggert@twinsun.com>
+
+ Merge from coreutils.
+
+ * m4/inttostr.m4: New file.
+ * m4/getdate.m4 (gl_GETDATE): Remove time-related stuff.
+ Require AM_STDBOOL_H and gl_TIMESPEC instead.
+ Require gl_CLOCK_TIME.
+ * m4/clock_time.m4 (gl_CLOCK_TIME): Require AC_GNU_SOURCE.
+
+2004-03-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/cloexec.h, cloexec.c (set_cloexec_flag): Return int
+ not bool, to be more consistent with Unix conventions.
+ Suggested by Bruno Haible.
+
+ Merge from coreutils.
+
+ * lib/imaxtostr.c, lib/inttostr.c, lib/inttostr.h, lib/offtostr.c:
+ * lib/umaxtostr.c: New files.
+
+ * lib/getdate.h: Include stdbool.h, and timespec.h instead of
+ the usual <time.h> dance.
+ (get_date): Change signature to support fractional time stamps.
+ All callers changed.
+ * lib/getdate.y: Include "getdate.h" first, as we can now
+ assume C89 and don't need to worry about 'const'.
+ Similarly, include "unlocked-io.h" near start, not in middle.
+ Include <limits.h>.
+ (textint.value): Use long int rather than int.
+ (textint.digits): Use size_t rather than int.
+ (BILLION, LOG10_BILLION): New constants.
+ (parser_control): New member rel_ns. Members day_ordinal,
+ time_zone, month, day, hour, minutes, rel_year, rel_month,
+ rel_day, rel_hour, rel_minutes, rel_seconds
+ are now long int, not int. Member seconds is now struct timespec,
+ not int. New member timespec_seen. Members dates_seen, days_seen,
+ local_zones_seen, rels_seen, times_seen, zones_seen are now size_t,
+ not int.
+ (%union.intval): Now long int, not int.
+ New member timespec.
+ (tSDECIMAL_NUMBER, tUDECIMAL_NUMBER): New tokens.
+ (seconds, signed_seconds, unsigned_seconds): New nonterminals.
+ (spec): Now is a timespec or an item list.
+ (timespec, items): New nonterminals.
+ (time, rel, relunit, number, get_date):
+ Add support for fractional seconds.
+ (time): Fix bug: seconds weren't cleared in "00:00 +0000" syntax.
+ (gmtime, localtime, mktime): Remove decls; not needed with C89.
+ (to_hour): First arg is now long int, not int.
+ (to_year): Returns long int, not int.
+ Don't treat year -70 like 70.
+ (tm_diff): Returns long int, not int.
+ (lookup_word): Use bool instead of int when appropriate.
+ (yylex): Use size_t for count, not int.
+ Detect overflow when parsing large integer constants.
+ Add support for fractions.
+ (get_date): Make pointers 'const' if possible.
+ Use more-portable code to detect integer overflow.
+ (main) [TEST]: Adjust to above changes. Test for localtime failure.
+ Don't use ctime; it's not reliable if the year has >4 digits.
+
+ * lib/human.c (humblock): Inspect BLOCKSIZE if BLOCK_SIZE isn't set.
+ This is for compatibility with BSD.
+
+ * lib/timespec.h (ST_TIME_CMP_NS, ST_TIME_CMP): Define.
+ (ATIME_CMP, CTIME_CMP, MTIME_CMP, TIMESPEC_NS): Likewise.
+ From coreutils' system.h.
+
+ * lib/userspec.c: Don't include "posixver.h".
+ (parse_user_spec): Fall back on USER.GROUP parsing, regardless
+ of POSIX version, as POSIX 1003.1-2001 allows that behavior as a
+ compatible extension. Simplify code by removing a boolean int
+ that was always nonzero if a string was nonnull.
+
+2004-03-30 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+
+ Avoid a configure-time warning about sys/ucred.h on OSF V4.0.
+ * m4/ls-mntd-fs.m4: Test for sys/ucred.h separately, since
+ on some systems one must include <grp.h> before it.
+ Reported by Christian Krackowizer.
+
+2004-03-30 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+
+ * lib/mountlist.c [HAVE_SYS_UCRED_H]: Include grp.h before sys/ucred.h.
+
+ * lib/readtokens.c (readtoken): Don't leak 64 bytes when reading
+ an empty input stream.
+
+ * lib/readtokens.c: Include <stdbool.h>.
+ (readtoken): Use `size_t' rather than int/long.
+ All callers adjusted.
+ Use `bool' rather than `int' where appropriate.
+ Use memset rather than an explicit loop.
+ Use x2nrealloc rather than xrealloc.
+ Allow the use of `\0' as a delimiter.
+ (readtokens): Likewise.
+ * lib/readtokens.h (readtoken, readtokens): Update prototypes.
+
+2004-03-30 Jim Meyering <jim@meyering.net>
+
+ * m4/realloc.m4: Remove file, since now it does no more than
+ AC_REQUIRE([AC_FUNC_REALLOC]), and that can be done via
+ the `configure.ac' section of module/realloc.
+ * m4/malloc.m4: Likewise, but for AC_FUNC_MALLOC.
+
+2004-03-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/getloadavg.c (getloadavg): Don't assume setlocale returns
+ nonnull.
+
+2004-03-29 Paul Eggert <eggert@twinsun.com>
+
+ Merge changes to getloadavg.c from coreutils and Emacs.
+
+ * lib/getloadavg.c [!defined HAVE_SETLOCALE] (setlocale):
+ Define to an expression, not to the empty string.
+ Include cloexec.h and xalloc.h.
+ (getloadavg): Restore LC_NUMERIC locale after setting it temporarily.
+ Use set_cloexec_flag rather than rolling our own.
+ * lib/cloexec.c, lib/cloexec.h: New files.
+
+2004-03-29 Paul Eggert <eggert@twinsun.com>
+
+ * m4/cloexec.m4: New file.
+
+2004-03-18 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getopt.h: Sync with libc CVS.
+
+2004-03-18 Paul Eggert <eggert@twinsun.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/mbswidth.m4 (gl_MBSWIDTH): Also test whether <wchar.h> declares
+ mbswidth.
+
+2004-03-18 Paul Eggert <eggert@twinsun.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/mbswidth.h: Include <wchar.h> only if
+ HAVE_DECL_MBSWIDTH_IN_WCHAR_H, not on all platforms that have
+ <wchar.h>.
+ * lib/mbswidth.c: Include <stdio.h> and <time.h> before <wchar.h>.
+
+2004-03-09 Paul Eggert <eggert@twinsun.com>
+
+ * lib/argp-parse.c, getopt.c, getopt.h, getopt1.c:
+ Sync with libc CVS.
+ * lib/getopt_int.h: New file, also synced from libc.
+
+2004-03-09 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclistvars.sh: Add GNUWWWLICENSES for eggert.
+ * config/srclist.txt: Sync getopt with libc. Add getopt_int.h.
+ Bring back getopt.c, getopt.h, getopt1.c.
+
+2004-03-07 Paul Eggert <eggert@twinsun.com>
+
+ * m4/c-stack.m4 (gl_PREREQ_C_STACK): Renamed from jm_PREREQ_C_STACK.
+ All uses changed. Check for sa_sigaction member; this fixes
+ a bug first reported by Jason Andrade in
+ <http://mail.gnu.org/archive/html/bug-textutils/2003-03/msg00027.html>.
+
+2004-03-07 Paul Eggert <eggert@twinsun.com>
+
+ * lib/c-stack.c (SIGACTION_WORKS): New macro. Use it instead of long
+ '#if' expressions. Unlike the code it replaces, it does not
+ depend on (defined _SC_PAGESIZE). However, it does depend on
+ HAVE_STRUCT_SIGACTION_SA_SIGACTION; this last change fixes a bug
+ first reported by Jason Andrade in
+ <http://mail.gnu.org/archive/html/bug-textutils/2003-03/msg00027.html>.
+
+2004-02-25 Simon Josefsson <jas@extundo.com>
+
+ * m4/strdup.m4 (gl_PREREQ_STRDUP): Check whether strdup is declared.
+
+2004-02-25 Simon Josefsson <jas@extundo.com>
+
+ * lib/strdup.h: New file.
+ * lib/strdup.c: Include it.
+ * lib/path-concat.c: Include strdup.h. Drop strdup declaration.
+ * lib/userspec.c: Include strdup.h. Drop strdup declaration.
+
+2004-02-23 Karl Berry <karl@gnu.org>
+
+ * doc/maintain.texi, doc/standards.texi, doc/make-stds.texi: new files
+ (from fencepost.gnu.org:/gd/gnuorg).
+
+2004-02-23 Karl Berry <karl@gnu.org>
+
+ * config/srclistvars.sh (GNUORG) [karl]: redefine.
+ * config/srclist.txt: add maintain/standards documents.
+
+2004-02-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/xsize.m4 (gl_XSIZE): Require AC_C_INLINE.
+ Reported by Derek Robert Price <derek@ximbiot.com>.
+
+2004-02-16 Karl Berry <karl@gnu.org>
+
+ * config/mkinstalldirs, install-sh: update from automake.
+
+2004-02-06 Karl Berry <karl@gnu.org>
+
+ * m4/po.m4: update from gettext 0.14.1.
+
+2004-02-06 Karl Berry <karl@gnu.org>
+
+ * lib/config.charset: update from gettext 0.14.1.
+
+2004-02-05 Paul Eggert <eggert@twinsun.com>
+
+ Add comments and code, prompted by suggestions from Bruno Haible
+ for sh-quote.
+ * lib/quotearg.h (quotearg_alloc): New decl. Improve the comments
+ describing the enum quoting_style values.
+ * lib/quotearg.c (quotearg_alloc): New function.
+ (quotearg_buffer_restyled): Treat lone { and } as special.
+ Treat = as special. Work around bug with older shells
+ that "see" a '\' that is really the 2nd byte of a multibyte char.
+ Quote empty string with shell_quoting_style.
+
+2004-02-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/pipe.m4: New file, from GNU gettext.
+
+2004-02-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/pipe.h: New file, from GNU gettext.
+ * lib/pipe.c: New file, from GNU gettext.
+
+2004-01-27 Bruno Haible <bruno@clisp.org>
+
+ * m4/execute.m4: New file, from GNU gettext.
+
+2004-01-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/execute.h: New file, from GNU gettext.
+ * lib/execute.c: New file, from GNU gettext.
+ * lib/w32spawn.h: New file, from GNU gettext.
+
+2004-01-24 Paul Eggert <eggert@twinsun.com>
+
+ Merge from diffutils.
+
+ * lib/file-type.c (file_type): Add typed memory objects.
+ * lib/file-type.h (S_TYPEISTMO): New macro.
+
+ * lib/c-stack.h (c_stack_action): Remove argv argument.
+ * lib/c-stack.c (c_stack_action): Likewise. All uses changed.
+ (die): Don't calculate message unless segv_action returns.
+ (get_stack_location, min_address_from_argv, max_address_from_argv,
+ volatile stack_base, volatile_stack_size): Remove.
+ (segv_handler): If ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC, assume
+ that every segmentation violation is a stack overflow. (Ouch!)
+ See Debian bug 136249 (still outstanding) for more info about why
+ HAVE_XSI_STACK_OVERFLOW_HEURISTIC fails on Linux kernels.
+
+2004-01-24 Paul Eggert <eggert@twinsun.com>
+
+ Exit-status fix from coreutils.
+
+ Use exit_failure consistently in place of EXIT_FAILURE,
+ so that program exit statuses are consistent on failure.
+
+ * lib/argmatch.c (ARGMATCH_DIE) [! defined ARGMATCH_DIE]:
+ Include "exitfail.h", and use exit_failure rather than EXIT_FAILURE.
+ * lib/argmatch.h: Comment fix to match the above.
+ * lib/obstack.c (obstack_exit_failure) [!defined _LIBC]:
+ Now a macro referring to exit_failure, instead of a separate
+ variable. Include "exitfail.h" to get it.
+ * lib/xstrtol.h: Include "exitfail.h".
+ (STRTOL_FATAL_ERROR): Exit with status exit_failure, not 2.
+
+ * lib/long-options.c (parse_long_options): Use prototype
+ for usage function arg. Pass it EXIT_SUCCESS rather than 0,
+ for clarity.
+
+2004-01-21 Jim Meyering <jim@meyering.net>
+
+ * lib/mktime.c (__mktime_internal) [!_LIBC]: Define to mktime_internal
+ so as not to conflict with a different-sized __mktime_internal
+ function in GNU libc.
+ * lib/timegm.c (__mktime_internal) [!_LIBC]: Likewise.
+ Problem building statically-linked `ls' reported by Michael Brunnbauer.
+
+2004-01-20 Karl Berry <karl@gnu.org>
+
+ * config/config.guess: update from config.
+
+ * config/srclistvars.sh: GNUWWWLICENSES for karl.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ Safer stack allocation.
+ * lib/setenv.c: Include allocsa.h.
+ (alloca): Remove fallback definition.
+ (freea): Remove macro.
+ (__add_to_environ) [!_LIBC]: Use allocsa instead of alloca. Use freesa
+ instead of freea.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/eealloc.m4: New file, from GNU gettext.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/allocsa.m4: New file, from GNU gettext.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/xallocsa.h: New file, from GNU gettext.
+ * lib/xallocsa.c: New file, from GNU gettext.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.c: On Windows, include windows.h. Needed on mingw.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.c (wait_subprocess): Add ignore_sigpipe argument.
+ * lib/wait-process.c (wait_subprocess): Likewise. Handle SIGPIPE
+ specially.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.c (wait_process): Disable the 2003-10-31 waitid()
+ patch.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.c (cleanup_slaves): Use ANSI C declaration.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/eealloc.h: New file.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/binary-io.h: Avoid warnings on Cygwin.
+
+2004-01-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/allocsa.h: New file, from GNU gettext.
+ * lib/allocsa.c: New file, from GNU gettext.
+
+2004-01-18 Karl Berry <karl@gnu.org>
+
+ * doc/gpl.texi, doc/lgpl.texi: new files.
+
+2004-01-18 Karl Berry <karl@gnu.org>
+
+ * config/srclistvars.sh (GNUWWWLICENSES): new variable.
+ * config/srclist.txt ({fdl,gpl,lgpl}.text): get from there.
+
+2004-01-15 Paul Eggert <eggert@twinsun.com>
+
+ Merge from coreutils.
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Check for uintptr_t.
+ * m4/posixver.m4 (gl_POSIXVER): Require gl_DEFAULT_POSIX2_VERSION.
+ (gl_DEFAULT_POSIX2_VERSION): Move
+ the documentation from 'configure' into 'config.hin',
+ so that 'configure --help' isn't burdened by it and
+ we don't have to worry about its formatting there.
+ Reword the documentation so that it's more succinct
+ and can be run together into a single paragraph.
+ * m4/same.m4 (gl_SAME): Check for pathconf.
+
+2004-01-15 Paul Eggert <eggert@twinsun.com>
+
+ Merge from coreutils.
+
+ * lib/posixver.c: Include posixver.h.
+
+ * lib/same.c: Include <stdbool.h>, <limits.h>.
+ (_POSIX_NAME_MAX): Define if not defined.
+ (MIN): New macro.
+ (same_name): If file names are silently truncated, report
+ that the file names are the same if they are the same after
+ the silent truncation.
+
+ * lib/xstrtod.h (xstrtod): Accept an extra arg, specifying the
+ conversion function.
+ * lib/xstrtod.c (xstrtod): Likewise. All callers changed to
+ include c-strtod.h and use c_strtod. Don't include stdlib.h; no
+ longer needed.
+
+2004-01-15 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+
+ * m4/clock_time.m4 (gl_CLOCK_TIME): Don't set LIB_CLOCK_GETTIME
+ if no library is required.
+ * m4/jm-macros.m4: Don't require UTILS_SYS_OPEN_MAX.
+ * m4/jm-macros.m4 (jm_MACROS): Require gl_FUNC_FREE.
+ * m4/jm-macros.m4 (jm_MACROS): Require autoconf-2.58.
+ (AC_LANG_SOURCE): Remove definition, now that we require autoconf-2.58.
+ * m4/jm-macros.m4 (jm_MACROS): Don't require AC_FUNC_FTW.
+ * m4/lib-check.m4 (jm_LIB_CHECK): Do not set LIB_CRYPT to the
+ value, $ac_cv_search_crypt, if it's "none required".
+ * m4/posixver.m4 (gl_DEFAULT_POSIX2_VERSION): New macro.
+ * m4/prereq.m4 (jm_PREREQ): Require AC_FUNC_GETLOADAVG,
+ not gl_FUNC_GETLOADAVG.
+ * m4/prereq.m4 (jm_PREREQ): Require gl_READTOKENS, gl_MD5, gl_MAKEPATH,
+ gl_LONG_OPTIONS, and gl_IDCACHE, gl_GETUGROUPS.
+
+2004-01-15 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+
+ * lib/md5.h (rol) [__GNUC__ && __i386__]: Don't use `asm' code. These
+ days, gcc-3.x does better all by itself. Patch from Dean Gaudet:
+ http://mail.gnu.org/archive/html/bug-coreutils/2003-11/msg00144.html
+
+ * lib/posixver.c (DEFAULT_POSIX2_VERSION): Use definition of new,
+ optional configure-time default.
+
+ * lib/version-etc.c (version_etc_copyright): Update copyright date.
+
+ * lib/xreadlink.c (xreadlink): Correct outdated comment.
+
+2004-01-15 Alexandre Duret-Lutz <adl@gnu.org>
+
+ Merge from coreutils.
+
+ * m4/nanosleep.m4 (jm_FUNC_NANOSLEEP): Do not set LIB_NANOSLEEP to the
+ value, $ac_cv_search_nanosleep, if it's "none required".
+
+2004-01-14 Paul Eggert <eggert@twinsun.com>
+
+ * lib/fnmatch_loop.c (ALLOCA_LIMIT): Remove macro, which collided
+ with like-named macro in fnmatch.c.
+ (EXT): Use an internal constant instead.
+
+ Merge fnmatch patches from glibc.
+ * lib/fnmatch.c (mbsinit): Remove define.
+ Add libc_hidden_ver (__fnmatch, fnmatch).
+ * lib/fnmatch_loop.c (FCT): Cast to int32_t and UCHAR when appropriate.
+ Adjust to renaming of collseq_table_lookup to __collseq_table_lookup.
+
+2004-01-14 Karl Berry <karl@gnu.org>
+
+ * config/install-sh: update from automake.
+
+2004-01-13 Karl Berry <karl@gnu.org>
+
+ * config/install-sh: update from automake.
+
+2004-01-09 Karl Berry <karl@gnu.org>
+
+ * config/install-sh: update from automake.
+
+2004-01-05 Karl Berry <karl@gnu.org>
+
+ * config/config.{sub,guess}: update from config.
+
+2003-12-31 Karl Berry <karl@gnu.org>
+
+ * config/depcomp: update from automake.
+
+2003-12-14 Karl Berry <karl@gnu.org>
+
+ * lib/config.charset: update from gettext-runtime.
+
+2003-12-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getgroups.c (getgroups): xmalloc takes one argument, not two.
+ Bug reported by Alfred M. Szmidt.
+
+2003-12-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/gettext.m4: Upgrade from gettext-0.13.
+ * m4/po.m4: Upgrade from gettext-0.13.
+ * m4/size_max.m4 (gl_SIZE_MAX): Don't use the _ONCE macros here.
+ * m4/intmax.m4: New file, from gettext-0.13.
+ * m4/printf-posix.m4: New file, from gettext-0.13.
+
+2003-11-29 Karl Berry <karl@gnu.org>
+
+ * lib/argp-{help.c,parse.c,namefrob.h}, argp.h: update from libc.
+
+2003-11-25 Paul Eggert <eggert@twinsun.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/printf-parse.h: Don't include sys/types.h.
+ (ARG_NONE): New macro.
+ (char_directive): Change type of *arg_index fields to size_t.
+ * lib/printf-parse.c: Don't include sys/types.h.
+ (SSIZE_MAX): Remove macro.
+ (PRINTF_PARSE): Change the type of the arg_index variables to size_t.
+ Remove unnecessary overflow check.
+ * lib/vasnprintf.c (VASNPRINTF): Update for type change of *arg_index
+ fields.
+
+2003-11-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/vasnprintf (Files): Remove m4/ssize_t.m4.
+
+2003-11-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_PRINTF_PARSE): Don't require
+ gt_TYPE_SSIZE_T.
+
+2003-11-24 Paul Eggert <eggert@twinsun.com>
+
+ * modules/alloca: Remove dependency on xalloc.
+
+2003-11-24 Paul Eggert <eggert@twinsun.com>
+
+ * lib/alloca.c: Remove dependency on xalloc module.
+ (xalloc_die): Remove.
+ (memory_full) [!defined emacs]: New macro.
+ [!defined emacs]: Don't include xalloc.h.
+ (alloca): Invoke memory_full, not xalloc_die, if malloc fails or
+ address arithmetic overflows. Change datatypes a bit to avoid
+ unnecessary casts.
+
+2003-11-22 Jim Meyering <jim@meyering.net>
+
+ * lib/xmalloc.c (x2nrealloc_inline): Fix typos in comments:
+ s/size/size_t/.
+
+2003-11-21 Karl Berry <karl@gnu.org>
+
+ * config/config.{sub,guess}: update from config.
+
+2003-11-18 Karl Berry <karl@gnu.org>
+
+ * config/config.{sub,guess}: update from config.
+
+ * config/(printf-{parse,args}.[ch]): sync broken, sigh.
+
+2003-11-17 Paul Eggert <eggert@twinsun.com>
+
+ * README: Mention that S+T cannot overflow if S is the size of
+ an existing object and T is sufficiently small.
+
+2003-11-17 Jim Meyering <jim@meyering.net>
+
+ On systems without utime and without a utimes function capable of
+ dealing with a NULL struct utimbuf* argument, this utime replacement
+ could -- in unusual circumstances -- leak a file descriptor.
+ * lib/utime.c: Include <unistd.h> and <errno.h>.
+ (utime_null): Be sure to close `fd' and to preserve errno.
+ Reported by Geoff Collyer via Arnold Robbins.
+
+2003-11-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/vasnprintf (Files): Add m4/ssize_t.m4.
+ (Depends-on): Add xsize.
+
+2003-11-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_PRINTF_PARSE): Require gt_TYPE_SSIZE_T.
+
+2003-11-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (alloca): Remove fallback definition.
+ (freea): Remove definition.
+ (VASNPRINTF): Use alloca only for small sizes, say <= 4000 bytes.
+ Reported by Paul Eggert.
+
+2003-11-16 Paul Eggert <eggert@twinsun.com>
+ Bruno Haible <bruno@clisp.org>
+
+ Protect against address arithmetic overflow.
+ * lib/printf-args.h: Include stddef.h.
+ (arguments): Change type of field 'count' to size_t.
+ * lib/printf-args.c (printf_fetchargs): Use size_t instead of
+ 'unsigned int' where appropriate.
+ * lib/printf-parse.h: Include sys/types.h.
+ (char_directive): Change type of *arg_index fields to ssize_t.
+ (char_directives): Change type of fields 'count', max_*_length to
+ size_t.
+ * lib/printf-parse.c: Include sys/types.h and xsize.h.
+ (SSIZE_MAX): Define fallback value.
+ (PRINTF_PARSE): Use size_t instead of 'unsigned int' and ssize_t
+ instead of 'int' where appropriate. Check a_allocated, d_allocated
+ against overflow. Reject %m$ argument numbers > SSIZE_MAX + 1.
+ * lib/vasnprintf.c: Include xsize.h.
+ (VASNPRINTF): Use size_t instead of 'unsigned int' where appropriate.
+ Check alloca, malloc, realloc, ENSURE_ALLOCATION arguments against
+ overflow. Avoid wraparound when converting a width or precision from
+ decimal to binary.
+
+2003-11-16 Bruno Haible <bruno@clisp.org>
+
+ Update from GNU gettext.
+ * lib/printf-parse.c: Generalize to it can be compiled for wide
+ strings.
+ (PRINTF_PARSE, CHAR_T, DIRECTIVE, DIRECTIVES): New macros.
+ * lib/vasnprintf.c: Generalize to it can be compiled for wide strings.
+ (VASNPRINTF, CHAR_T, DIRECTIVE, DIRECTIVES, PRINTF_PARSE, USE_SNPRINTF,
+ SNPRINTF): New macros.
+ Don't include <alloca.h> if the file is used inside libintl.
+ (local_wcslen): New function, for Solaris 2.5.1.
+ (VASNPRINTF): Use it instead of wcslen.
+
+2003-11-16 Bruno Haible <bruno@clisp.org>
+
+ * lib/xsize.h (xmax): New function.
+ (xsum, xsum3, xsum4): Declare as "pure" functions.
+
+2003-11-12 Paul Eggert <eggert@twinsun.com>
+
+ * modules/xalloc (Files): Undo latest change, since xalloc.h
+ no longer needs SIZE_MAX or PTRDIFF_MAX.
+
+2003-11-12 Paul Eggert <eggert@twinsun.com>
+
+ * m4/xalloc.m4 (gl_PREREQ_XALLOC): Do not require gl_SIZE_MAX or
+ gl_PTRDIFF_MAX.
+
+2003-11-12 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xstrtol.c (__xstrtol): Remove "break" immediately after
+ "return", to pacify some unknown compiler. Problem reported
+ by Joerg Schilling.
+
+2003-11-12 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xalloc.h: Do not include <limits.h> or <stdint.h>.
+ (xalloc_oversized): Use sizeof (ptrdiff_t) and sizeof (size_t) for
+ the heuristic, rather than PTRDIFF_MAX and SIZE_MAX. This
+ heuristic is just as accurate as far as we know, and it removes a
+ dependency on size_max.m4 and ptrdiff_max.m4.
+
+2003-11-11 Bruno Haible <bruno@clisp.org>
+
+ * modules/xsize (Files): Add m4/size_max.m4.
+ * modules/xalloc (Files): Add m4/size_max.m4, m4/ptrdiff_max.m4.
+
+2003-11-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/size_max.m4: New file.
+ * m4/ptrdiff_max.m4: New file.
+ * m4/xsize,m4 (gl_XSIZE): Require gl_SIZE_MAX.
+ * m4/xalloc.m4 (gl_PREREQ_XALLOC): New macro.
+ (gl_XALLOC): Invoke it.
+
+2003-11-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/xsize.h (SIZE_MAX): Remove fallback definition.
+ * lib/xalloc.h: Include limits.h. Assume SIZE_MAX and PTRDIFF_MAX are
+ defined.
+
+2003-11-10 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xalloc.h (xalloc_oversized): [! (defined PTRDIFF_MAX &&
+ PTRDIFF_MAX < SIZE_MAX)]: Fix off-by-one error that would have
+ rejected some allocations of exactly SIZE_MAX - 2 bytes.
+ From Bruno Haible.
+ [defined PTRDIFF_MAX && PTRDIFF_MAX < SIZE_MAX]: Use SIZE_MAX,
+ not (size_t) -1, since it's defined here.
+
+2003-11-09 Karl Berry <karl@gnu.org>
+
+ * config/mkinstalldirs, depcomp, mdate-sh: update from automake.
+
+2003-11-06 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xalloc.h [HAVE_STDINT_H]: Include <stdint.h>.
+ (xalloc_oversized) [! (PTRDIFF_MAX < SIZE_MAX)]:
+ Reject sizes of exactly SIZE_MAX bytes.
+ * lib/xreadlink.c: Include "xalloc.h" before checking whether SIZE_MAX
+ is defined, since "xalloc.h" now defines SIZE_MAX on modern hosts.
+
+2003-11-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/xsize.h: Include limits.h, to avoid a possible collision with
+ SIZE_MAX defined in <limits.h> on Solaris.
+
+2003-11-04 Jim Meyering <jim@meyering.net>
+
+ * modules/sysexits: Use the `$(VAR)' notation for AC_SUBST'd
+ variable names, rather than @VAR@.
+ * modules/poll: Likewise.
+
+2003-11-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/xsize: New file.
+ * modules/linebreak: Depend on xsize.
+ * MODULES.html.sh (func_all_modules): Add xsize.
+
+2003-11-04 Bruno Haible <bruno@clisp.org>
+
+ * m4/xsize.m4: New file.
+
+2003-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/xsize.h: New file.
+ * lib/linebreak.c: Include xsize.h.
+ (mbs_possible_linebreaks, mbs_width_linebreaks): Check malloc()
+ argument for overflow.
+ Suggested by Paul Eggert.
+
+2003-11-03 Karl Berry <karl@gnu.org>
+
+ * config/config.{guess,sub}: update from config.
+
+2003-11-03 Jim Meyering <jim@meyering.net>
+
+ * modules/userspec (lib_SOURCES): Add userspec.h.
+ (Include): Add "userspec.h".
+ Improve description.
+
+2003-11-03 Jim Meyering <jim@meyering.net>
+
+ * lib/userspec.c: Include "userspec.h".
+ * lib/userspec.h: New file.
+
+2003-11-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/wait-process.m4 (gl_WAIT_PROCESS): Also check for waitid.
+
+2003-11-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.c (wait_process): Use waitid with WNOWAIT if
+ available, to avoid (extremely rare) race condition.
+ Suggested by Paul Eggert.
+
+2003-11-02 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (vasprintf.c): sync broken, sigh.
+
+2003-10-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/mountlist.h (struct mount_entry.me_type_malloced): New member.
+ * lib/mountlist.c (SIZE_MAX): Define if not defined already.
+ (read_filesystem_list): Set and use me_type_malloced.
+ Use "sizeof *me" rather than "sizeof (struct mount_entry)" (or
+ whatever the type happens to be), for brevity and consistency.
+ Check for size calculation overflow on Alphas running OSF/1.
+
+2003-10-31 Jim Meyering <jim@meyering.net>
+
+ * lib/hash.c: Include "xalloc.h" for use of xalloc_oversized.
+
+ * lib/linebuffer.c: Include <string.h> for declaration of memset.
+
+2003-10-30 Paul Eggert <eggert@twinsun.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/vasprintf.c: Include <limits.h>, <stdlib.h>.
+ (vasprintf): Fail if the resulting length doesn't fit in an 'int'.
+
+2003-10-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ * m4/host-os.m4 (UTILS_HOST_OS): Change netbsd*-gnu pattern back to
+ netbsd*-gnu*. Suggested by Robert Millan.
+
+2003-10-29 Paul Eggert <eggert@twinsun.com>
+
+ * modules/group-member: Depend on stdbool.
+
+2003-10-29 Paul Eggert <eggert@twinsun.com>
+
+ * m4/xalloc.m4 (gl_XALLOC): Undo previous change.
+
+2003-10-29 Paul Eggert <eggert@twinsun.com>
+
+ * m4/host-os.m4 (UTILS_HOST_OS): Resurrect netbsd*-gnu. Add comments
+ to it, and to knetbsd*-gnu and kfreebsd*-gnu. Remove the '*' from
+ after the 'gnu' in these cases. This fixes some bugs in the
+ previous change, and is based on suggestions by Robert Millan.
+
+2003-10-29 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xalloc.h (xalloc_oversized): Now a macro, not a function,
+ so that it works even if SIZE_MAX < N. Do not include <stdbool.h>;
+ no longer needed.
+ * lib/quotearg.c (quotearg_n_options): Use it.
+ * lib/group-member.c: Include <stdbool.h>.
+ (free_group_info): Arg is now const *; don't free arg.
+ (get_group_info): Now returns bool and accepts struct group_info *,
+ rather than returning a malloc'ed struct group_info *.
+ All uses changed. Check for overflow in internal size calculation.
+
+ * lib/getusershell.c (readname): Simplify the code by using x2nrealloc
+ rather than xmalloc/xrealloc.
+ * lib/linebuffer.c (initbuffer, readlinebuffer): Simplify the code by
+ using x2realloc rather than xmalloc/xrealloc. Also, fix a C
+ conformance bug: the old code used a pointer after freeing the
+ storage that it addressed.
+ * lib/hash.c (hash_initialize): Simplify the code by using
+ xalloc_oversized rather than doing it by hand.
+ * lib/getgroups.c (getgroups): Don't use xrealloc, since we don't need
+ the buffer preserved. Use free and xmalloc instead.
+ * lib/quotearg.c (quotearg_n_options): Likewise.
+ Use a simpler test for size overflow. Don't use xalloc_oversized
+ because unsigned int might be wider than size_t (!); this suggests
+ that we should switch from unsigned int to size_t for slot numbers.
+
+2003-10-28 Paul Eggert <eggert@twinsun.com>
+
+ * m4/host-os.m4 (UTILS_HOST_OS): Identify GNU/KFreeBSD and
+ GNU/KNetBSD. These implementations use glibc atop the FreeBSD and
+ NetBSD kernels. Requested by Richard Stallman.
+
+2003-10-27 Paul Eggert <eggert@twinsun.com>
+
+ * lib/exclude.c (new_exclude): Use xzalloc rather than xmalloc
+ to allocate the returned structure. Do not allocate a subarray,
+ as x2nrealloc will do that.
+ (add_exclude): Use x2nrealloc to reallocate ex->exclude,
+ instead of xnrealloc.
+ (add_exclude_file): Use x2realloc instead of malloc + xnrealloc.
+
+2003-10-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdbool_.h: Better support for BeOS.
+
+2003-10-26 Paul Eggert <eggert@twinsun.com>
+
+ * m4/xalloc.m4 (gl_XALLOC): Requore AC_C_INLINE, since xalloc.h
+ now uses inline.
+
+2003-10-26 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xalloc.h (xalloc_oversized): New static inline function, for
+ callers that want to do their own size-overflow checking. Include
+ <stdbool.h>, since xalloc_oversized returns bool.
+ * lib/xalloc.c (array_size_overflow): Remove. All callers changed
+ to use xalloc_oversized.
+
+ Add two functions x2realloc, x2nrealloc, for programs that grow
+ arrays dynamically by doubling their sizes.
+ * lib/xalloc.h (x2realloc, x2nrealloc): New decls.
+ * lib/xmalloc.c (x2nrealloc_inline, x2nrealloc, x2realloc):
+ New functions.
+
+ Port to C99 semantics for 'inline' of external functions.
+ Bug reported by Bruno Haible.
+ * lib/xmalloc.c (xnmalloc_inline): New static inline function,
+ with the old contents of xnmalloc.
+ (xnmalloc, xmalloc): Use it.
+ (xnrealloc_inline): New static inline function,
+ with the old contents of xnrealloc.
+ (xnrealloc, xrealloc): Use it.
+
+ * lib/alloc.c (alloca): xmalloc cannot return NULL, so don't test for
+ that.
+
+2003-10-26 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (COPYING.DOC): no longer available from
+ /gd/gnuorg; don't know where the ultimate source is.
+
+2003-10-25 Paul Eggert <eggert@twinsun.com>
+
+ Fix several address-calculation bugs in the hash modules,
+ plus some minor code cleanup.
+
+ * lib/hash.h: Include <stdbool.h>, for bool.
+ * lib/hash.c: Don't include <stdbool.h>, since hash.h does it now.
+ * lib/hash.h (Hash_hasher, hash_get_n_buckets, hash_get_n_buckets_used,
+ hash_get_n_entries, hash_get_max_bucket_length,
+ hash_get_entries, hash_do_for_each, hash_string, hash_initialize,
+ hash_rehash): Use size_t rather than unsigned.
+ * lib/hash.c (struct hash_table, hash_get_n_buckets,
+ hash_get_n_buckets_used, hash_get_n_entries,
+ hash_get_max_bucket_length, hash_table_ok, hash_print_statistics,
+ hash_get_entries, hash_do_for_each, hash_string, is_prime,
+ next_prime, hash_initialize, hash_rehash, hash_delete, hash_print):
+ Likewise.
+ (SIZE_MAX): Define if not defined.
+ (hash_get_max_bucket_length, hash_table_ok, hash_lookup,
+ hash_get_first, hash_get_next, hash_get_entries, hash_do_for_each,
+ hash_print):
+ Use const * when possible.
+ (hash_string): Use (unsigned char) *P rather than *(unsigned char *) P.
+ (check_tuning): Fix bug: if tuning parameters were very close to
+ 0 or 1, rounding errors could have caused subscript violations.
+ (hash_initialize, allocate_entry, hash_print): Remove unnecessary cast.
+ (hash_initialize): Add 'fail:' label
+ to free table and return NULL, and use it to simplify code.
+ Use calloc rather than clearing the storage ourself.
+ (hash_initialize, hash_rehash): Check for arithmetic overflow in
+ buffer size calculations.
+ * lib/hash-pjw.h (hash_pjw): Use size_t, not unsigned.
+ Include <stddef.h>, for size_t.
+ * lib/hash-pjw.c (hash_pjw): Likewise.
+ Switch to method described by Bruno Haible.
+ Include <limits.h>, for CHAR_BIT.
+ (SIZE_BITS): New macro.
+
+2003-10-23 Paul Eggert <eggert@twinsun.com>
+
+ * m4/getline.m4 (AM_FUNC_GETLINE):
+ Don't include getndelim2.o twice into LIBOBJS; this breaks on some
+ hosts. Problem reported by Derek Robert Price in
+ <http://mail.gnu.org/archive/html/bug-gnulib/2003-10/msg00092.html>.
+ This patch can be withdrawn after Autoconf 2.58 is required for gnulib.
+ * m4/getndelim2.m4 (gl_GETNDELIM2): Likewise.
+
+2003-10-21 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getndelim2.c (getndelim2): When size calculation overflows,
+ ceiling the allocation at NMAX bytes rather than silently
+ discarding input bytes before NMAX is reached. This makes
+ a difference only if NMAX exceeds SIZE_MAX / 2.
+
+ * lib/obstack.c: Merge from glibc.
+ [defined _LIBC]: Include <obstack.h>, not "obstack.h".
+ Add libc_hidden_def (_obstack_newchunk).
+ (_obstack_free) [! defined _LIBC]: Remove.
+ [defined _LIBC]: Make a strong alias from obstack_free, rather than
+ a clone of the function body.
+ (fputs) [defined _LIBC && defined USE_IN_LIBIO]: Remove.
+ [defined _LIBC && !defined USE_IN_LIBIO]: Include <libio/iolibio.h>.
+
+ * lib/obstack.h: Indenting cleanup, to make it easier to merge with
+ glibc.
+ (obstack_grow, obstack_grow0): Remove unnecessary parentheses around
+ arg to memcpy.
+
+ * lib/obstack.h (obstack_1grow_fast): Properly parenthesize arg.
+ (obstack_ptr_grow_fast, obstack_int_grow_fast):
+ Don't use lvalue casts, as GCC plans to remove support for them
+ in GCC 3.5. Reported by Joseph S. Myers. This bug
+ was also present in the non-GCC version, indicating that this
+ code had always been buggy and had never been widely used.
+ (obstack_1grow, obstack_ptr_grow, obstack_int_grow, obstack_blank):
+ Use the fast variant of each macro, rather than copying the
+ definiens of the fast variant; that way, we'll be more likely to
+ catch future bugs in the fast variants.
+
+2003-10-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/wait-process: New file.
+ * MODULES.html.sh (func_all_modules): Add wait-process.
+
+2003-10-20 Bruno Haible <bruno@clisp.org>
+
+ * m4/wait-process.m4: New file.
+
+2003-10-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/wait-process.h: New file, from GNU gettext.
+ * lib/wait-process.c: New file, from GNU gettext.
+
+2003-10-19 Jim Meyering <jim@meyering.net>
+
+ * lib/vasnprintf.c (vasnprintf): Work around losing snprintf on
+ HPUX 10.20.
+
+2003-10-18 Karl Berry <karl@gnu.org>
+
+ * config/config.guess: update from config.
+
+2003-10-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getgroups.c: Include <errno.h>, <stdlib.h>.
+ (getgroups): First arg is int, not size_t.
+ Don't let 'free' mangle errno.
+
+2003-10-16 Paul Eggert <eggert@twinsun.com>
+
+ * README: Mention that gnulib assumes that (foo *) NULL + 0 == NULL.
+
+2003-10-16 Karl Berry <karl@gnu.org>
+
+ * config/config.{guess,sub}: update from config.
+
+2003-10-16 Jim Meyering <jim@meyering.net>
+
+ * lib/xmalloc.c: Include <string.h>, for declarations of memset and
+ memcpy.
+
+2003-10-15 Paul Eggert <eggert@twinsun.com>
+
+ * lib/exclude.c: Do not include <inttypes.h> or <stdint.h>.
+ (SIZE_MAX): Remove.
+ (new_exclude, add_exclude_file): Initial size no longer needs to
+ be a power of 2.
+ (add_exclude, add_exclude_file): Use xnrealloc instead of rolling
+ our own address arithmetic overflow checking.
+
+ * lib/fnmatch.c (SIZE_MAX): Define if standard headers don't.
+ (fnmatch): Do not alloca more than 2000 wide characters;
+ instead, use malloc for large buffers.
+ Check for address arithmetic overflow, and return -1
+ with errno set to ENOMEM in that case.
+ * lib/fnmatch_loop.c (ALLOCA_LIMIT): New macro.
+ (NEW_PATTERN): Do not alloca more than 8000 bytes;
+ instead, return -1. Check for address arithmetic overflow.
+
+2003-10-14 Paul Eggert <eggert@twinsun.com>
+
+ Handle invalid suffixes and overflow independently, so that
+ callers can treat them independently as needed. Fix some bugs in
+ suffix handling, e.g., "100k@" was not diagnosed as an invalid
+ suffix for a human-readable blocksize. The major caller-visible
+ change is the addition of a new
+ LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW enum value, indicating
+ that both overflow and suffix chars were found.
+
+ * lib/human.c (humblock): Don't check separately for invalid suffix
+ char; that is xstrtoumax's job (now that its bug is fixed).
+ * lib/xstrtoimax.c (STRTOL_T_MINIMUM, STRTOL_T_MAXIMUM) [defined
+ INTMAX_MAX]: New macros.
+ * lib/xstrtol.c (STRTOL_T_MINIMUM, STRTOL_T_MAXIMUM, TYPE_MINIMUM,
+ TYPE_MAXIMUM): New macros.
+ (bkm_scale, bkm_scale_by_power): Return strtol_error, not int.
+ (bkm_scale, bkm_scale_by_power, __xstrtol): Return maximal values
+ if overflow occurs, as it's what __strtol does and it's more useful
+ in practice.
+ (__xstrtol): If __strtol reports some error other than ERANGE,
+ reflect it to the caller as LONGINT_INVALID. If it reports
+ ERANGE, continue the rest of parsing, and report LONGINT_OVERFLOW
+ | LONGINT_INVALID_SUFFIX_CHAR if both errors occur.
+ * lib/xstrtol.h (LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW): New enum
+ value.
+ (_STRTOL_ERROR): Handle it. Abort when given unknown error codes.
+ * lib/xstrtoul.c (STRTOL_T_MINIMUM, STRTOL_T_MAXIMUM): New macros.
+ * lib/xstrtoumax.c (STRTOL_T_MINIMUM, STRTOL_T_MAXIMUM)
+ [defined UINTMAX_MAX]: New macros.
+
+2003-10-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/fatal-signal: Add m4/sig_atomic_t.m4 to file list.
+
+2003-10-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/sig_atomic_t: New file, from GNU gettext.
+ * m4/fatal-signal.m4 (gl_FATAL_SIGNAL): Require gt_TYPE_SIG_ATOMIC_T.
+
+2003-10-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/fatal-signal.h: Improved comments. Suggested by Paul Eggert.
+ * lib/fatal-signal.c: Use sig_atomic_t. Suggested by Paul Eggert.
+ Also use volatile where needed.
+
+2003-10-12 Paul Eggert <eggert@twinsun.com>
+
+ * modules/xalloc: Do not depend on 'exit'. Depend on 'stdbool'.
+ Change maintainer from Bruno Haible to 'all'.
+
+2003-10-12 Paul Eggert <eggert@twinsun.com>
+
+ * m4/xalloc.m4 (gl_PREREQ_XMALLOC): Require AC_C_INLINE.
+
+2003-10-12 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xalloc.h (xnmalloc, xzalloc, xnrealloc, xclone): New decls.
+ (XMALLOC, XCALLOC, XREALLOC, XFREE, CCLONE, CLONE): Deprecate,
+ and define in terms of the other primitives.
+ * lib/xmalloc.c: Include stdbool.h; do not include exit.h.
+ (SIZE_MAX): Define if not already defined.
+ (array_size_overflow): New function.
+ (xalloc_die): Abort instead of exiting if 'error' returns.
+ (xnmalloc, xnrealloc, xzalloc, xclone): New functions.
+ (xmalloc, xrealloc): Use them.
+ (xcalloc): Check for address arithmetic overflow.
+ * lib/xstrdup.c (xstrdup): Use xclone, since memcpy should be
+ a bit faster than strcpy.
+
+2003-10-10 Simon Josefsson <jas@extundo.com>
+
+ * modules/argp (Depends-on): Add restrict and strcase.
+
+2003-10-10 Simon Josefsson <jas@extundo.com>
+
+ * m4/argp.m4: Add AC_C_INLINE.
+
+2003-10-08 Paul Eggert <eggert@twinsun.com>
+
+ Merge getpass from libc, plus a few fixes.
+
+ * lib/getpass.c (HAVE_STDIO_EXT) [_LIBC]: Define to 1.
+ Include <stdbool.h>.
+ Include <stdio_ext.h> if HAVE_STDIO_H, otherwise define
+ __fsetlocking to empty.
+ [_LIBC]: Do not include "getline.h" or "unlocked-io.h", but
+ do include <bits/libc-lock.h>.
+ Do not include <fcntl.h>; not needed.
+ [_LIBC]: Include <wchar.h>.
+ (NOTCANCEL_MODE): New macro.
+ (flockfile, funlockfile) [_LIBC]: New macros.
+ (__libc_cleanup_push, __libc_cleanup_pop, __getline, __tcgetattr)
+ [!_LIBC]: New macros.
+ (call_fclose): New function.
+ (getpass): Use it. Save tty stream separately; this simplifies the
+ code and makes it more reliable if stdin happens to equal stdout.
+ Invoke __fsetlocking on tty.
+ Handle thread cancellation if needed.
+ Namespace cleanup (use __tcgetattr, __getline).
+ Use bool for Booleans.
+ [USE_IN_LIBIO]: Handle wide streams.
+ [!_LIBC]: Unconditionally do the fseek, since we don't know what
+ stream might go where.
+
+ * lib/unlocked-io.h: Include <stdio.h>, so that the caller
+ doesn't have to include <stdio.h> before us.
+ (clearerr_unlocked, feof_unlocked, ferror_unlocked,
+ fflush_unlocked, fgets_unlocked, fputc_unlocked, fputs_unlocked,
+ fread_unlocked, fwrite_unlocked, getc_unlocked, getchar_unlocked,
+ putc_unlocked, putchar_unlocked): Define to the unlocked counterpart
+ if not declared, so that we can use getpass.c code from libc without
+ rewriting it.
+ (flockfile, ftrylockfile, funlockfile): New macros.
+
+2003-10-08 Paul Eggert <eggert@twinsun.com>
+
+ * modules/getpass: Depend on stdbool.
+
+2003-10-08 Paul Eggert <eggert@twinsun.com>
+
+ * m4/getpass.m4 (gl_PREREQ_GETPASS): Check for stdio_ext.h.
+
+2003-10-07 Karl Berry <karl@gnu.org>
+
+ * config/config.{guess,sub}: update from config.
+
+2003-10-06 Jim Meyering <jim@meyering.net>
+ Bruno Haible <bruno@clisp.org>
+
+ This lets translators provide better translations for the
+ "Written by ..." part of --version output.
+ * lib/version-etc.h: Include stdarg.h.
+ (version_etc_copyright): Declare as readonly.
+ (version_etc): Make this function variadic with a NULL-terminated list
+ of author name strings.
+ (version_etc_va): New declaration.
+ * lib/version-etc.c: Include stdarg.h, stdlib.h.
+ (version_etc_copyright): Declare as readonly.
+ (version_etc_va): New function. Provide a different translatable string
+ for each possible number of authors < 10. Abbreviate when there are 10
+ authors or more.
+ (version_etc): Make this function variadic. Call version_etc_va.
+ Suggestion from Gary V. Vaughan.
+
+ * lib/long-options.h (parse_long_options): Change prototype: the
+ authors string is moved to the end and becomes variadic.
+ * lib/long-options.c: Include stdarg.h.
+ (parse_long_options): Make this function variadic, too.
+ Call version_etc_va, not version_etc.
+
+2003-10-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/version-etc-2: Remove file.
+ * MODULES.html.sh (func_all_modules): Remove version-etc-2.
+
+2003-10-06 Bruno Haible <bruno@clisp.org>
+
+ * modules/fatal-signal: New file.
+ * MODULES.html.sh (func_all_modules): Add fatal-signal.
+
+2003-10-06 Bruno Haible <bruno@clisp.org>
+
+ * m4/fatal-signal.m4: New file.
+ * m4/signalblocking.m4: New file, from GNU gettext.
+
+2003-10-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/version-etc-2.h: Remove file.
+ * lib/version-etc-2.c: Remove file.
+
+2003-10-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/fatal-signal.h: New file, from GNU gettext.
+ * lib/fatal-signal.c: New file, from GNU gettext.
+
+2003-10-05 Paul Eggert <eggert@twinsun.com>
+
+ * README: Rework advice for preventing empty .o files.
+ Don't recommend ELIDE constructs. Recommend <stddef.h>,
+ not <sys/types.h>.
+
+2003-10-04 Karl Berry <karl@gnu.org>
+
+ * lib/argp*: update from libc.
+
+2003-10-04 Karl Berry <karl@gnu.org>
+
+ * config/config.{guess,sub}: update from config.
+
+2003-10-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/lchown (Include): Add lchown.h.
+ * modules/time_r (Include): Use "..." syntax.
+ * modules/xgetdomainname (Include): Add xgetdomainname.h.
+
+2003-10-01 Simon Josefsson <jas@extundo.com>
+
+ * MODULES.html.sh (func_all_modules): Move gethostname from section
+ 'based on' to section 'lacking' POSIX:2001.
+
+2003-10-01 Larry Jones <lawrence.jones@eds.com>
+
+ * lib/getpass.c (getpass): Use a no-op fseek when switching from input
+ to output mode on the same stream.
+
+2003-09-29 Paul Eggert <eggert@twinsun.com>
+
+ * lib/strftime.c (tm_diff) [! HAVE_TM_GMTOFF]:
+ Fix arg typo in previous patch.
+
+2003-09-28 Jim Meyering <jim@meyering.net>
+
+ * lib/error.c: Correct cpp indentation.
+
+2003-09-27 Paul Eggert <eggert@twinsun.com>
+
+ * modules/free: New file.
+
+2003-09-27 Paul Eggert <eggert@twinsun.com>
+
+ * m4/free.m4: New file.
+
+2003-09-27 Paul Eggert <eggert@twinsun.com>
+
+ * lib/minmax.h (MIN, MAX)
+ [__STDC__ && defined __GNUC__ && __GNUC__ >= 2]:
+ Omit the special code that used __typeof__, since we worry that
+ it could be more trouble than it's worth. See:
+ http://mail.gnu.org/archive/html/bug-gnulib/2003-01/msg00090.html
+ http://mail.gnu.org/archive/html/bug-gnulib/2003-01/msg00095.html
+
+ * lib/free.c: New file.
+
+2003-09-27 Oskar Liljeblad <oskar@osk.mine.nu>
+
+ Trivial fixes to Makefile.am parts of module listings.
+ * modules/strstr: Append strstr.h to lib_SOURCES.
+ * modules/strcase: Likewise, for strcase.h.
+
+2003-09-27 Karl Berry <karl@gnu.org>
+
+ * config/mkinstalldirs: update from automake.
+
+2003-09-26 Paul Eggert <eggert@twinsun.com>
+
+ * lib/error.c (SIZE_MAX) [!defined SIZE_MAX]: Define.
+ (error_tail): Do not loop, reallocating temporary buffer, since
+ the output cannot contain more wide characters than the input
+ contains bytes, the size must be big enough already. This avoids
+ one potential size overflow calculation. Check for size overflow
+ when calculating temporary buffer size. Free temporary buffer
+ when done, if it was allocated with malloc; this plugs a memory
+ leak. Remove casts from void * to pointers, that are no longer
+ needed now that we're assuming C89 or better.
+
+ Merge error changes from glibc.
+
+ * lib/error.c, error.h: Update copyright notice header to match glibc.
+ * lib/error.c [defined _LIBC]: Include <errno.h>, <bits/libc-lock.h>.
+ (error, error_at_line) [defined _LIBC && defined __libc_ptf_call]:
+ Disable cancellation while printing error.
+ * lib/error.h: Prepend __ to parameter names.
+
+2003-09-26 Jim Meyering <jim@meyering.net>
+
+ * lib/error.c (error_tail): Move some declarations
+ into inner scope where the local variables are used.
+
+2003-09-26 Bruno Haible <bruno@clisp.org>
+
+ * m4/stpncpy.m4 (gl_FUNC_STPNCPY): Add comments about the AIX
+ stpncpy().
+ Don't define stpncpy through config.h; it's now done through stpncpy.h.
+
+2003-09-26 Bruno Haible <bruno@clisp.org>
+
+ * lib/stpncpy.h (gnu_stpncpy): New declaration.
+ (stpncpy): Define as alias for gnu_stpncpy.
+ * lib/stpncpy.c [!_LIBC]: Define gnu_stpncpy, not stpncpy.
+
+2003-09-25 Simon Josefsson <jas@extundo.com>
+
+ * lib/xgetdomainname.h: New file.
+ * lib/xgetdomainname.c: New file.
+
+2003-09-25 Simon Josefsson <jas@extundo.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/getdomainname: New file.
+ * modules/xgetdomainname: New file.
+ * MODULES.html.sh (func_all_modules): Add getdomainname,
+ xgetdomainname.
+
+2003-09-25 Simon Josefsson <jas@extundo.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * m4/getdomainname.m4: New file.
+
+2003-09-25 Simon Josefsson <jas@extundo.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/getdomainname.h: New file.
+ * lib/getdomainname.c: New file.
+
+2003-09-25 Karl Berry <karl@gnu.org>
+
+ * lib/argp-fmtstream.c, argp-help.c: update from libc.
+
+2003-09-25 Karl Berry <karl@gnu.org>
+
+ * config/install-sh: update from automake.
+
+2003-09-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/version-etc-2: New file, from modules/version-etc with
+ modifications.
+ * MODULES.html.sh (func_all_modules): Add version-etc-2.
+
+2003-09-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/version-etc-2.h: New file, from version-etc.h with modifications.
+ * lib/version-etc-2.c: New file, from version-etc.c with modifications.
+
+2003-09-24 Simon Josefsson <jas@extundo.com>
+
+ * modules/xgethostname: Add xgethostname.h.
+
+2003-09-24 Paul Eggert <eggert@twinsun.com>
+
+ * lib/linebuffer.c (freebuffer): Don't free the argument, just
+ the buffer associated with the argument. Bug reported by
+ Simon Josefsson.
+
+2003-09-24 Paul Eggert <eggert@twinsun.com>
+
+ * README: Document assumptions that 'int' is at least 32 bits
+ wide, that integer arithmetic is 2's complement without overflow,
+ that there are no holes in integer values, that adding sizes of
+ two nonoverlapping objects can't overflow, and that all-bits-zero
+ yields scalar zero. Fix spelling and capitalization typos.
+
+2003-09-19 Karl Berry <karl@gnu.org>
+
+ * lib/argp.h: update from libc.
+
+2003-09-17 Paul Eggert <eggert@twinsun.com>
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Call AC_BEFORE first,
+ to avoid spurious warnings like "AC_RUN_IFELSE was called before
+ gl_USE_SYSTEM_EXTENSIONS" from autoreconf.
+
+2003-09-17 Paul Eggert <eggert@twinsun.com>
+
+ * gnulib-tool: Use "test -h", not "test -L", for portability
+ to Solaris 8 /bin/sh. (This bug is fixed in Solaris 9.)
+ (tags_regexp): Remove, since \| doesn't conform to POSIX.
+ (sed_extract_prog): Issue s commands one-by-one, rather than
+ using \| in one s command.
+
+2003-09-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/linebuffer.c (readlinebuffer): Return NULL immediately upon
+ input error, instead of returning NULL the next time we are called
+ (and therefore losing track of errno).
+
+2003-09-16 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Warn about duplicated
+ dependencies.
+
+2003-09-15 Paul Eggert <eggert@twinsun.com>
+
+ * modules/argmatch, modules/fatal, modules/obstack,
+ modules/xalloc, modules/xgethostname: Sort dependencies by
+ importance, not alphabetically.
+
+2003-09-15 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getndelim2.c (getndelim2): Don't trash errno when a read
+ fails, so that the caller gets the proper errno.
+
+ * lib/readutmp.c (read_utmp): Likewise.
+ Check for fstat error. Close stream and free storage
+ when failing.
+
+2003-09-14 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt (strdup.c): disable for c89 changes.
+
+2003-09-14 Jim Meyering <jim@meyering.net>
+
+ * lib/getloadavg.c: Correct cpp indentation.
+ * lib/strdup.c: Likewise.
+ * lib/vasnprintf.c: Likewise.
+
+2003-09-14 Bruno Haible <bruno@clisp.org>
+
+ * modules/fwriteerror: New file.
+ * MODULES.html.sh (func_all_modules): Add fwriteerror.
+
+2003-09-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/fwriteerror.h: New file.
+ * lib/fwriteerror.c: New file.
+
+2003-09-12 Paul Eggert <eggert@twinsun.com>
+
+ * modules/argmatch, modules/exitfail, modules/fatal, modules/obstack,
+ modules/xgethostname, modules/xalloc: Depend on exit.
+
+2003-09-12 Paul Eggert <eggert@twinsun.com>
+
+ * m4/error.m4: Require AC_FUNC_STRERROR_R rather than invoking it.
+
+ * m4/extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Require AC_AIX
+ and AC_MINIX, too, so that their extensions are available.
+
+ * m4/prereq.m4 (jm_PREREQ_ADDEXT): Remove. All uses removed.
+ This macro has been superseded by gl_BACKUPFILE.
+
+ More patches to assume C89 or better.
+
+ * m4/error.m4 (gl_ERROR): Don't check for vprintf.
+
+ * m4/check-decl.m4 (jm_CHECK_DECLS): Include <string.h>, <stdlib.h>
+ unconditionally.
+ * m4/closeout.m4 (gl_CLOSEOUT): Don't check for stdlib.h.
+ * m4/gettimeofday.m4 (AC_FUNC_GETTIMEOFDAY_CLOBBER):
+ Include <string.h>, <stdlib.h> unconditionally.
+ * m4/lstat.m4 (gl_PREREQ_LSTAT): Don't check for stdlib.h, free.
+ * m4/readdir.m4 (GL_FUNC_READDIR): Don't check for string.h.
+ * m4/readutmp.m4 (gl_PREREQ_READUTMP): Don't check for standard C
+ headers or for string.h.
+ * m4/strtoumax.m4 (gl_PREREQ_STRTOUMAX): Don't check for stdlib.h
+ or strtoul.
+
+ * m4/mkstemp.m4 (jm_PREREQ_TEMPNAME): Do not require standard C
+ headers.
+ * m4/strdup.m4 (gl_PREREQ_STRDUP): Likewise.
+ * m4/userspec.m4 (gl_USERSPEC): Likewise.
+ * m4/xalloc.m4 (gl_PREREQ_XMALLOC): Likewise.
+ * m4/xstrtod.m4 (gl_XSTRTOD): Likewise.
+ * m4/xstrtol.m4 (gl_PREREQ_XSTRTOL): Likewise.
+ * m4/strftime.m4 (_jm_STRFTIME_PREREQS): Don't check for limits.h,
+ memcpy, memset.
+ (jm_FUNC_GNU_STRFTIME): Don't require standard C headers.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Do not check for float.h.
+ * m4/strtoimax.m4 (gl_PREREQ_STRTOIMAX): Do not check for stdlib.h,
+ strtol.
+ * m4/strtol.m4 (gl_FUNC_STRTOL): Do not check for limits.h.
+ * m4/userspec.m4 (gl_USERSPEC): Do not check for string.h.
+ * m4/xstrtol.m4 (gl_PREREQ_XSTRTOL): Do not check for string.h, strtol,
+ strtoul.
+
+2003-09-12 Paul Eggert <eggert@twinsun.com>
+
+ * lib/argmatch.c, fatal.c, xgethostname.c, xmalloc.c: Include exit.h.
+ * lib/obstack.c [!defined _LIBC]: Likewise.
+ * lib/argmatch.c (EXIT_FAILURE): Remove; now done by exit.h
+ * lib/exitfail.c, fatal.c, xgethostname.c, xmalloc.c: Likewise.
+ * lib/exitfail.c: Don't include stdlib.h; no longer needed.
+
+ More changes to assume C89 or better.
+
+ * lib/error.c (error_tail): Assume vprintf.
+
+ * lib/argmatch.c (getenv): Remove decl.
+ * lib/progreloc.c (get_full_program_name): Define via prototype.
+ * lib/setenv.c (clearenv): Likewise.
+ * lib/stpncpy.c: Do not include <string.h> or <sys/types.h>; not
+ needed.
+ * lib/strdup.c: Include <stdlib.h>, <string.h> unconditionally.
+ (malloc, memcpy): Remove decls.
+ * lib/strftime.c (HAVE_LIMITS_H, STDC_HEADERS) [defined _LIBC]: Remove.
+ (HAVE_MEMCPY) [defined emacs && !defined HAVE_BCOPY]: Remove.
+ Include <limits.h>, <stddef.h>, <stdlib.h>, <string.h> unconditionally.
+ (memcpy): Remove macro.
+ (MEMCPY) [!defined COMPILE_WIDE]: Define to memcpy unconditionally.
+ (__P): Remove. All uses removed.
+ (PTR): Remove. All uses changed to void *.
+ (CHAR_BIT, NULL): Remove.
+ (spaces, zeros, memset_space, memset_zero)
+ [!defined memset && !defined HAVE_MEMSET && !defined _LIBC]:
+ Remove.
+ (LOCALE_PARAM, LOCALE_PARAM_DECL): Remove.
+ (memcpy_lowcase, memcpy_uppcase, tm_diff, iso_week_days):
+ Define with prototype.
+ Remove now-unnecessary prototype decl.
+ (extra_args_spec): Assume ANSI C. All uses changed.
+ (extra_args_spec_iso): Remove.
+ (my_strftime, emacs_strftimeu): Define via prototype.
+ * lib/strtod.c: Include <float.h>, <stdlib.h>, <string.h>
+ unconditionally.
+ (DBL_MAX, DBL_MIN, HUGE_VAL, NULL): Remove decls.
+ * lib/strtoimax.c: Include <stdlib.h> unconditionally.
+ (strtoul, strtol): Remove decls.
+ * lib/strtol.c (STDC_HEADERS, HAVE_LIMITS_H, NULL, ULONG_MAX,
+ LONG_MAX): Remove.
+ Include <limits.h>, <stddef.h>, <stdlib.h>, <string.h> unconditionally.
+ (LOCALE_PARAM_DECL): Remove. All uses changed to LOCALE_PARAM_PROTO.
+ (LOCALE_PARAM_PROTO): New macro.
+ (INTERNAL, INTERNAL1, WEAKNAME): Assume ANSI C, not K&R.
+ (INTERNAL (strtol), strtol): Define with a prototype.
+ (PARAMS): Remove. All uses removed.
+ * lib/tempname.c: Include <string.h> unconditionally.
+ * lib/userspec.c: Include <stdlib.h>, <string.h> unconditionally.
+ * lib/xgethostname.c (main): Define with a prototype.
+ * lib/xmalloc.c: Include "xalloc.h" first, to check interface.
+ Include <stdlib.h> unconditionally.
+ (calloc, malloc, realloc, free): Remove decls.
+ * lib/xstrtod.c: Include "xstrtod.h" first, to check interface.
+ Include <stdlib.h> unconditionally. Sort include file names.
+ (strtod): Remove.
+ (xstrtod): Define with a prototype.
+ * lib/xstrtol.c: Include <stdlib.h>, <string.h> unconditionally.
+ (strtol, strtoul): Remove decls.
+
+2003-09-11 Paul Eggert <eggert@twinsun.com>
+
+ More patches to assume C89 or better.
+ * m4/strndup.m4 (gl_PREREQ_STRNDUP): Remove STDC_HEADERS check.
+ * m4/strnlen.m4 (gl_PREREQ_STRNLEN): Don't check for memory.h,
+ string.h, memchr, STDC_HEADERS.
+
+2003-09-11 Paul Eggert <eggert@twinsun.com>
+
+ * lib/strndup.c: Don't include <stdio.h>, <sys/types.h>.
+ Include <stdlib.h>, <string.h> unconditionally.
+ Remove now-unnecessary cast to char *.
+ * lib/strnlen.c: Include <string.h> unconditionally.
+ * lib/yesno.c (yesno): Define with a prototype.
+
+2003-09-11 Bruno Haible <bruno@clisp.org>
+
+ * config/srclist.txt (setenv.c, unsetenv.c): Disable for the moment.
+
+2003-09-10 Jim Meyering <jim@meyering.net>
+
+ * lib/error.c: Correct indentation of cpp directives.
+
+2003-09-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/strcspn.m4 (gl_PREREQ_STRCSPN): Remove <string.h> check.
+ * m4/strpbrk.m4 (gl_PREREQ_STRPBRK): Remove <string.h> check.
+ * m4/strstr.m4 (gl_PREREQ_STRSTR): Remove <string.h> check.
+ * m4/unicodeio.m4 (gl_UNICODEIO): Remove <string.h> check.
+ * m4/setenv.m4 (gl_PREREQ_SETENV, gl_PREREQ_UNSETENV): Remove
+ <stdlib.h> and <string.h> checks.
+ * m4/xreadlink.m4 (gl_XREADLINK): Remove <stdlib.h> check.
+ * m4/yesno.m4 (gl_YESNO): Remove <stdlib.h> check.
+
+2003-09-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/strcspn.c: Include <string.h> unconditionally.
+ * lib/strpbrk.c: Include <string.h> unconditionally.
+ * lib/strstr.c: Include <string.h> unconditionally.
+ * lib/unicodeio.c: Include <string.h> unconditionally.
+ * lib/setenv.c: Include <stdlib.h> and <string.h> unconditionally.
+ * lib/unsetenv.c: Likewise.
+ * lib/xreadlink.c: Include <stdlib.h> unconditionally.
+ * lib/yesno.c: Include <stdlib.h> unconditionally.
+ (rpmatch): Add prototype.
+
+2003-09-09 Paul Eggert <eggert@twinsun.com>
+
+ More patches to assume C89 or better.
+ * m4/getcwd.m4 (AC_FUNC_GETCWD_NULL): Don't check for stdlib.h.
+ * m4/getopt.m4 (gl_GETOPT): Don't check for string.h.
+ * m4/getugroups.m4 (gl_GETUGROUPS): Do not check for standard C headers
+ or for string.h.
+ * m4/getusershell.m4 (gl_PREREQ_GETUSERSHELL): Do not check for
+ stdlib.h.
+ * m4/group-member.m4 (gl_PREREQ_GROUP_MEMBER): Do not require standard
+ C headers.
+ * m4/hard-locale.m4 (gl_HARD_LOCALE): Do not check for stdlib.h,
+ string.h.
+ * m4/hash.m4 (gl_HASH): Do not check for stdlib.h, malloc, free.
+ * m4/human.m4 (gl_HUMAN): Do not check for stdlib.h, string.h, getenv.
+ * m4/idcache.m4 (gl_IDCACHE): Do not check for standard C headers,
+ or for string.h.
+ * m4/long-options.m4 (gl_LONG_OPTIONS): Do not check for stdlib.h.
+ * m4/makepath.m4 (gl_MAKEPATH): Do not check for string.h or standard
+ C headers.
+ * m4/md5.m4 (gl_MD5): Don't check for limits.h, standard C headers,
+ memcpy.
+ * m4/sha.m4 (gl_SHA): Don't check for standard Cheaders, memcpy.
+ * m4/memchr.m4 (jm_PREREQ_MEMCHR): Don't check for limits.h, stdlib.h.
+ * m4/memcmp.m4 (gl_PREREQ_MEMCMP): Don't check for string.h.
+ * m4/memcoll.m4 (gl_MEMCOLL): Likewise.
+ * m4/memrchr.c (gl_PREREQ_MEMRCHR): Don't check for limits.h.
+ * m4/mkdir-slash.m4 (gl_PREREQ_MKDIR): Don't check for stdlib.h,
+ string.h, free.
+ * m4/mktime.m4 (gl_PREREQ_MKTIME): Don't check for standard C headers.
+ * m4/modechange.m4 (gl_MODECHANGE): Don't check for standard C headers.
+ * m4/mountlist.m4 (gl_PREREQ_MOUNTLIST_EXTRA): Don't check for standard
+ C headers, or for string.h.
+ * m4/obstack.m4 (gl_OBSTACK): Don't check for stddefe.h, string.h.
+ (gl_PREREQ_OBSTACK): Don't check for stdlib.h.
+ * m4/path-concat.m4 (gl_PATH_CONCAT): Don't check for standard C
+ headers, memory.h, stdlib.h, string.h, strings.h.
+ * m4/posixtm.m4 (gl_POSIXTM): Don't check for stdlib.h, string.h.
+ * m4/posixver.m4 (gl_POSIXVER): Don't check for getenv.
+ * m4/putenv.m4 (gl_PREREQ_PUTENV): Don't check for string.h, memcpy,
+ strchr.
+ * m4/readtokens.m4 (gl_READTOKENS): Don't check for standard C
+ headers, memory.h, string.h.
+ * m4/regex.m4 (jm_PREREQ_REGEX): Do not check for limits.h, string.h.
+ * m4/rename.m4 (gl_PREREQ_RENAME): Do not check for stdlib.h, string.h,
+ free.
+ * m4/rpmatch.m4 (gl_PREREQ_RPMATCH): Don't check for standard C
+ headers.
+ * m4/same.m4 (gl_SAME): Don't check for stdlib.h, string.h, free.
+ * m4/save-cwd.m4 (gl_SAVE_CWD): Don't check for standard C headers.
+ * m4/savedir.m4 (gl_SAVEDIR): Don't check for standard C headers.
+ * m4/strchrnul.m4 (gl_PREREQ_STRCHRNUL): Don't check for string.h.
+ * m4/xgetcwd.m4 (gl_XGETCWD): Don't check for stdlib.h.
+
+2003-09-09 Paul Eggert <eggert@twinsun.com>
+
+ More K&R removal.
+
+ * lib/acosl.c (main): Use a prototype.
+ * lib/asinl.c, cosl.c, expl.c, frexpl.c, ldexpl.c, sinl.c,
+ tanl.c: Likewise.
+
+ * lib/getloadavg.c (getloadavg, main): Define via prototypes.
+
+ * lib/getopt.h (struct option.name): Assume C89, and use 'const'.
+ (getopt, etopt_long, getopt_long_only, _getopt_internal)
+ [defined __GNU_LIBRARY__]: Assume C89, so we can always declare
+ with a prototype.
+ * lib/getopt.c (const): Remove macro.
+ Include <string.h> unconditionally.
+ (my_index): Remove; all uses changed to strchr.
+ (strlen): Remove decl.
+ (exchange): Remove forward decl; no longer needed.
+ (exchange, _getopt_initialize, _getopt_internal, getopt, main):
+ Define with prototype.
+ * lib/getopt1.c (const): Remove macro.
+ (getopt_long, getopt_long_only, main): Define with prototype.
+
+ * lib/getugroups.c: Include <string.h> unconditionally.
+
+ * lib/getusershell.c: Include <stdlib.h> unconditionally.
+ (getusershell, setusershell, endusershell, readname, main):
+ Define with prototypes.
+
+ * lib/group-member.c: Include group-member.h first.
+ Include <stdlib.h> unconditionally.
+
+ * lib/hard-locale.c: Include hard-locale.h first.
+ Include <stdlib.h>, <string.h> unconditionally.
+
+ * lib/hash.c (free, malloc): Remove decls.
+ Include <stdlib.h> unconditionally.
+
+ * lib/human.c: Include <stdlib.h>, <string.h> unconditionally.
+ (getenv): Do not declare.
+
+ * lib/idcache.c: Include <string.h> unconditionally.
+
+ * lib/long-options.c: Include long-options.h first, to test interface.
+ Include <stdlib.h> unconditionally.
+
+ * lib/makepath.c: Include makepath.h first, to test interface.
+ Include <stdlib.h> and <string.h> unconditionally.
+
+ * lib/linebuffer.c: Include <stdlib.h>.
+ (free): Remove decl.
+
+ * lib/malloc.c: Include <stdlib.h>, for malloc; don't bother with
+ stddef.h. rpl_malloc returns void *, not char *.
+ * lib/realloc.c (rpl_realloc): Likewise. Also, define with a
+ prototype.
+
+ * lib/md5.h: Include <limits.h> unconditionally.
+ (UINT_MAX_32_BITS): Don't worry about non-__STDC__ case.
+ (__P): Remove; all uses removed.
+ * lib/md5.c: Include "md5.h" first.
+ (md5_init_ctx, md5_read_ctx, md5_finish_ctx, md5_stream,
+ md5_buffer, md5_process_bytes, md5_process_block):
+ Define with prototypes.
+ * lib/sha.h (__P): Remove all uses. (It wasn't defined??)
+ * lib/sha.c: Include "sha.h" first.
+ Include <stdlib.h>, <string.h> unconditionally.
+
+ * lib/memchr.c (__ptr_t): Remove; all uses changed to void *.
+ * lib/memcmp.c (__ptr_t): Likewise.
+ * lib/memrchr.c (__ptr_t): Likewise.
+ * lib/memchr.c, memcmp.c, memcoll.c, memrchr.c:
+ Include <string.h> unconditionally.
+ * lib/memchr.c, memrchr.c: Include <limits.h> unconditionally.
+ * lib/memchr.c: Include <stdlib.h> unconditionally.
+ * lib/memchr.c (LONG_MAX): Remove.
+ * lib/memrchr.c (LONG_MAX): Likewise.
+ * lib/memchr.c (__memchr): Define via a prototype.
+ * lib/memrchr.c (__memrchr): Likewise.
+ * lib/memcmp.c (__P): Remove, and remove all uses.
+ (memcmp_bytes, memcmp_common_alignment, memcmp_not_common_alignment):
+ Remove forward decls; no longer needed.
+ * lib/memcpy.c, memmove.c, memset.c: Include <stddef.h>.
+ Use types required by C89 in prototype.
+
+ * lib/mkdir.c: Include <stdlib.h>, <string.h> unconditionally.
+ * lib/savedir.c: Likewise.
+ * lib/mkdir.c (free): Remove decl.
+ * lib/rmdir.c (rmdir): Define with a prototype.
+ * lib/savedir.c: Include savedir.h first, to test interface.
+
+ * lib/mktime.c (STDC_HEADERS): Remove.
+ Include <stdlib.h>, <string.h> unconditionally.
+
+ * lib/modechange.c: Include <stdlib.h> unconditionally.
+ (malloc): Remove decl.
+
+ * lib/mountlist.c: Include <stdlib.h>, <string.h> unconditionally.
+ (free): Remove decl.
+
+ * lib/obstack.h (PTR_INT_TYPE) [!defined __PTRDIFF_TYPE__]:
+ Define to ptrdiff_t, without bothering to check HAVE_STDDEF_H.
+ (This type really should be intptr_t, but that's a C99ism.)
+ (_obstack_memcpy): Remove: all uses changed to memcpy.
+ Include <string.h> unconditionally.
+ (struct obstack): Assume __STDC__ for types of members
+ chunkfun, freefun, extra_arg.
+ (_obstack_newchunk, _obstack_free, _obstack_begin, _obstack_begin_1,
+ _obstack_memory_used, obstack_alloc_failed_handler, obstack_init,
+ obstack_begin, obstack_specify_allocation,
+ obstack_specify_allocation_with_arg, obstack_chunkfun,
+ obstack_freefun, obstack_free) [! (defined __STDC__ && __STDC__)]:
+ Remove unprototyped decls and the macros that use them.
+ * lib/obstack.c (POINTER): Remove. All uses changed to void *.
+ (obstack_alloc_failed_handler, CALL_CHUNKFUN, CALL_FREEFUN,
+ _obstack_begin, _obstack_begin_1, _obstack_allocated_p)
+ (defined __STDC__ && __STDC__)]:
+ Remove nonprototyped code.
+ Include <stdlib.h> unconditionally.
+ (_obstack_begin, _obstack_begin_1, _obstack_newchunk,
+ _obstack_allocated_p, _obstack_free, obstack_free,
+ _obstack_memory_used, print_and_abort):
+ Define using prototypes.
+ (obstack_1grow, obstack_1grow_fast, obstack_alloc, obstack_base,
+ obstack_blank, obstack_blank_fast, obstack_copy, obstack_copy0,
+ obstack_finish, obstack_grow, obstack_grow0, obstack_make_room,
+ obstack_next_free, obstack_object_size, obstack_room) [0]:
+ Remove unused, unprototyped code.
+
+ * lib/path-concat.c: Include <stdlib.h>, <string.h> unconditionally.
+
+ * lib/physmem.c (physmem_total, physmem_available, main): Define
+ with prototypes.
+
+ * lib/posixtm.c: Include <stdlib.h>, <string.h> unconditionally.
+ (main): Define with a prototype.
+
+ * lib/posixver.c (getenv): Remove decl.
+
+ * lib/putenv.c (malloc): Returns void *, not char *.
+ Include <string.h> unconditionally.
+ (strchr, memcpy, NULL): Do not define.
+
+ * lib/readtokens.c: Include readtokens.h first, to test interface.
+ Include <stdlib.h>, <string.h> unconditionally.
+ (init_tokenbuffer): Define with a prototype.
+
+ * lib/regex.c (PARAMS): Remove. All uses removed.
+ All uses of _RE_ARGS removed, too.
+ Include <stddef.h>, <stdlib.h>, <string.h>, <limits.h>
+ unconditionally.
+ (bzero): Assume memset exists.
+ (memcmp, memcpy, NULL): Remove.
+ (SIGN_EXTEND_CHAR): Remove; all uses replaced by casts to signed
+ char, or assignments to local vars of type signed char.
+ (init_syntax_once, PREFIX(extract_number_and_incr),
+ PREFIX(print_partial_compiled_pattern),
+ PREFIX(print_compiled_pattern), PREFIX(print_double_string),
+ convert_mbs_to_wcs, print_fastmap, re_set_syntax,
+ PREFIX(regex_grow_registers), PREFIX(regex_compile),
+ PREFIX(store_op1), PREFIX(store_op2), PREFIX(insert_op1),
+ PREFIX(insert_op2), PREFIX(at_begline_loc_p),
+ PREFIX(at_endline_loc_p), group_in_compile_stack, insert_space,
+ wcs_compile_range, byte_compile_range, truncate_wchar,
+ PREFIX(re_compile_fastmap), re_compile_fastmap, re_set_registers,
+ re_search, re_search_2, PREFIX(re_search_2), re_match, re_match_2,
+ count_mbs_length, wcs_re_match_2_internal,
+ byte_re_match_2_internal, PREFIX(group_match_null_string_p),
+ PREFIX(alt_match_null_string_p),
+ PREFIX(common_op_match_null_string_p), PREFIX(bcmp_translate),
+ re_compile_pattern, re_comp, re_exec, regcomp, regexec, regerror,
+ regfree, PREFIX(extract_number)): Define with prototype. Remove
+ now-unnecessary declaration, if any.
+ (byte_compile_range, PREFIX(regex_compile), re_comp, re_exec,
+ regcomp, regexec):
+ Remove now-unnecessary casts among pointer types.
+ * lib/regex.h (_RE_ARGS): Remove. All uses removed.
+
+ * lib/rename.c: Include <stdlib.h>, <string.h> unconditionally.
+ (free): Remove decl.
+
+ * lib/rpmatch.c: Include <stdlib.h> unconditionally.
+
+ * lib/same.c: Include <stdlib.h>, <string.h> unconditionally.
+ (free): Remove decl.
+
+ * lib/save-cwd.c: Include <stdlib.h> unconditionally.
+ * lib/xgetcwd.c: Likewise.
+
+ * lib/stat.c: Include <stdlib.h>, <string.h> unconditionally.
+ (free): Remove decl.
+
+ * lib/strchrnul.c (strchrnul): Define with a prototype.
+ Fix bug: c_in was not converted to char before searching.
+
+ The following changes are not K&R related:
+
+ * lib/group-member.h: Include <sys/types.h>, so that this file is
+ self-contained.
+ * lib/makepath.h: Likewise.
+
+ * lib/getusershell.c (readname, default_index, line_size, readname):
+ Use size_t, not int, for sizes.
+ (readname): If the size overflows, report an error instead of
+ looping forever.
+
+2003-09-09 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist.txt: Do not get getopt.h, getopt1.c, or regex.h from
+ libc.
+
+2003-09-09 Paul Eggert <eggert@twinsun.com>
+
+ * README: New section: portability guidelines.
+
+2003-09-09 Derek Robert Price <derek@ximbiot.com>
+
+ * m4/getndelim2.m4 (gl_PREREQ_GETNDELIM2): Assume stdlib.h per the
+ C89 spec.
+
+2003-09-09 Derek Robert Price <derek@ximbiot.com>
+
+ * lib/getndelim2.c: Assume stdlib.h per the C89 spec.
+
+2003-09-08 Paul Eggert <eggert@twinsun.com>
+
+ Assume C89 or better; remove K&R cruft.
+ A few of these changes were first proposed by Derek Robert Price
+ in <http://mail.gnu.org/archive/html/bug-gnulib/2003-07/msg00105.html>.
+
+ * lib/addext.c: Include <string.h> unconditionally.
+ * lib/backupfile.c: Include <string.h>, <stdlib.h> unconditionally.
+ Don't declare getenv or malloc.
+
+ * lib/alloca.c: Include <string.h>, <stdlib.h> unconditionally.
+ (POINTER_TYPE, pointer): Remove; all uses changed to void *.
+ (NULL): Remove.
+ (find_stack_direction, alloca): Use prototypes.
+
+ * lib/atexit.c (atexit): Define using a prototype.
+
+ * lib/basename.c, dirname.c, stripslash.c:
+ Include <string.h> unconditionally.
+
+ * lib/bcopy.c: Include <stddef.h>.
+ (bcopy): Define with prototype, using 'const' and 'void' and 'size_t'.
+
+ * lib/canon-host.c: Include <stdlib.h>, <string.h> unconditionally.
+
+ * lib/error.h (error, error_at_line, error_print_progname)
+ [! (defined (__STDC__) && __STDC__)]: Remove decls.
+ * lib/error.c: Include error.h first, to check interface.
+ Include <stdarg.h>, <stdlib.h>, <string.h> unconditionally.
+ (VA_START): Remove; all uses changeed to va_start.
+ (exit, strerror): Remove decls.
+ (error_print_progname): Prototype uncondionally.
+ Don't include <errno.h>; no longer needed.
+ (private_strerror): Remove.
+ (error_tail): Always define.
+ (error, error_at_line): Assume C89 or better; always use prototypes.
+ * lib/fatal.c: Include "fatal.h" first, to test interface.
+ Include <stdarg.h>, <stdlib.h>, <string.h> unconditionally.
+ (VA_START): Remove; all uses changed to va_start.
+ [! (HAVE_VPRINTF || HAVE_DOPRNT || _LIBC)]: Remove support for
+ this case.
+ (exit): Remove decl.
+ (fatal): Prototype unconditionally. Assume va_start works.
+ Abort at end, to pacify gcc.
+
+ * lib/euidaccess.c (main): Define with a prototype.
+
+ * lib/exclude.c: Include <stdlib.h>, <string.h> unconditionally.
+
+ * lib/exitfail.c: Include <stdlib.h> unconditionally.
+
+ * lib/fnmatch_.h (__P): Remove. All uses changed to assume
+ prototypes.
+ * lib/fnmatch.c: Include fnmatch.h first, to test interface.
+ Include <string.h>, <stddef.h>, <stdlib.h> unconditionally.
+ (getenv): Remove decl.
+ (fnmatch): Define using a prototype.
+ * lib/fnmatch_loop.c (FCT): Remove forward decl; no longer needed.
+ (FCT): Define using a prototype.
+
+ * lib/getdate.y: Include <stdlib.h>, <string.h> unconditionally.
+
+ * lib/gethostname.c: Include <stddef.h>.
+ (gethostname): Define with prototype. Length is size_t, not int.
+
+2003-09-08 Paul Eggert <eggert@twinsun.com>
+
+ Assume C89 or better; remove K&R cruft.
+ * m4/alloca.m4 (gl_PREREQ_ALLOCA): Don't check for stdlib.h, string.h.
+ * m4/backupfile.m4 (gl_BACKUPFILE): Don't check for stdlib.h,
+ string.h, getenv, malloc.
+ * m4/dirname.m4 (gl_DIRNAME): Don't check for string.h or C standard
+ headers.
+ * m4/canon-host.m4 (gl_CANON_HOST): Don't check for string.h, stdlib.h.
+ * m4/error.m4 (jm_PREREQ_ERROR): Do not require STDC headers, and
+ do not check for strerror.
+ * m4/exclude.m4: Do not check for stdlib.h, string.h, strings.h.
+ * m4/exitfail.m4 (gl_EXITFAIL): Do not check for stdlib.h.
+ * m4/fatal.m4 (gl_FATAL): Do not require STDC headers, and
+ do not check for doprnt or vprintf.
+ * m4/fnmatch.m4 (gl_PREREQ_FNMATCH_EXTRA): Remove. All uses removed.
+ * m4/getdate.m4 (gl_GETDATE): Don't check for stdlib.h or string.h.
+
+2003-09-08 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getversion.c: Remove; was migrated to backupfile.c in 1997.
+ getversion.c should have been removed then, but was accidentally
+ preserved.
+
+ * lib/utime.c [!HAVE_UTIMES_NULL]: Include <sys/stat.h>, <fcntl.h>.
+ (utime_null): Fix typo: 'st' was sometimes called 'sb'.
+
+2003-09-08 Karl Berry <karl@gnu.org>
+
+ * config/config.sub, config.guess, srclistvars.sh: update from savannah
+ config, forget about prep.
+
+ * config/depcomp, missing: update from automake.
+
+2003-09-07 Paul Eggert <eggert@twinsun.com>
+
+ * modules/time_r: Depend on 'restrict'. Fix from Simon Josefsson in
+ <http://mail.gnu.org/archive/html/bug-gnulib/2003-09/msg00028.html>.
+
+2003-09-07 Paul Eggert <eggert@twinsun.com>
+
+ * lib/time_r.c (gmtime_r, localtime_r): Fix silly typo: missing arg to
+ copy_tm_result. Bug reported by Simon Josefsson in
+ <http://mail.gnu.org/archive/html/bug-gnulib/2003-09/msg00028.html>.
+
+2003-09-06 Paul Eggert <eggert@twinsun.com>
+
+ * m4/time_r.m4: New file.
+ * m4/mktime.m4 (gl_PREREQ_MKTIME): Remove check for limits.h.
+ * m4/timegm.m4 (gl_FUNC_TIMEGM): Assume that timegm is buggy if mktime
+ is. Check for timegm declaration.
+ (gl_PREREQ_TIMEGM): Require gl_FUNC_MKTIME.
+ Do not check for gmtime_r.
+ Replace mktime if __mktime_internal does not exist and if mktime
+ hasn't been replaced already.
+
+2003-09-06 Paul Eggert <eggert@twinsun.com>
+
+ * lib/time_r.c, lib/time_r.h: New files.
+
+ * lib/mktime.c (my_mktime_localtime_r): Remove; all uses changed to
+ __localtime_r.
+ (__localtime_r) [!defined _LIBC]: New macro. Include <time_r.h>.
+ (__mktime_internal) [!defined _LIBC]: Now extern, not static.
+
+ * lib/strftime.c (my_strftime_gmtime_r): Remove; all uses changed to
+ __gmtime_r.
+ (my_strftime_localtime_r): Remove; all uses changed to __localtime_r.
+ (__gtime_r, __localtime_r) [!HAVE_TM_GMTOFF]: New macros.
+ Include <time_r.h>.
+
+ * lib/timegm.c: Switch to glibc implementation, with the following
+ changes:
+ [defined HAVE_CONFIG_H]: Include <config.h>.
+ [!defined _LIBC]: Include "timegm.h" rather than <time.h>.
+ (__mktime_internal) [!defined _LIBC]: New decl.
+ (__gmtime_r) [!defined _LIBC]: New macro and function.
+ (timegm): Use a prototype, since gnulib assumes C89.
+ Do not bother declaring tmp to be const, as it's not really usefu.
+ * lib/timegm.h: Hoist "#include <time.h>" out of #ifdef.
+ (timegm): Declare only if HAVE_DECL_TIMEGM.
+
+2003-09-06 Paul Eggert <eggert@twinsun.com>
+
+ * MODULES.html.sh (func_all_modules): Add time_r.
+ * modules/time_r: New file.
+ * modules/mktime, modules/strftime, modules/timegm: Depend on time_r.
+ * modules/timegm: Depend on mktime. Change maintainer to "all, glibc".
+
+2003-09-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/human.c (human_readable): Fix bug that rounded 10501 to 10k.
+ Bug reported by Lute Kamstra in
+ <http://mail.gnu.org/archive/html/bug-gnulib/2003-09/msg00003.html>.
+
+ * lib/getdate.y (relative_time_table): Use tDAY_UNIT for "tomorrow",
+ "yesterday", "today", and "now" rather than tMINUTE_UNIT. Of
+ course with correspondingly smaller numbers for tomorrow and
+ yesterday. From Tadayoshi Funaba. Originally installed into
+ sh-utils on 1999-08-07, but the patch got lost (I guess during the
+ coreutils merge?).
+
+2003-08-31 Simon Josefsson <jas@extundo.com>
+
+ * modules/timegm: New file.
+ * MODULES.html.sh (func_all_modules): Add timegm.
+
+2003-08-31 Simon Josefsson <jas@extundo.com>
+
+ * m4/timegm.m4: New file.
+
+2003-08-31 Simon Josefsson <jas@extundo.com>
+
+ * lib/timegm.h: New file.
+ * lib/timegm.c: New file. Based on
+ wget-1.8.2/src/http.c:mktime_from_utc.
+
+2003-08-31 Karl Berry <karl@gnu.org>
+
+ * lib/argp.h: update from libc.
+
+2003-08-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Remove AC_DEFINE of fnmatch here.
+ This avoids havoc on compilers for which '#define fnmatch rpl_fnmatch'
+ followed by '#define fnmatch fnmatch_posix' gives an error.
+
+2003-08-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/binary-io.h: Undefine O_BINARY before defining it. This avoids a
+ warning on QNX, which defines O_BINARY to 000000.
+
+2003-08-27 Jim Meyering <jim@meyering.net>
+
+ * m4/mkstemp.m4: Require that the system mkstemp be able to create
+ 70 temporary files, not just 30. Tru64 V4.0F's mkstemp function
+ would fail after 32. Reported by Danny Levinson. Details here:
+ http://mail.gnu.org/archive/html/bug-coreutils/2003-08/msg00124.html
+
+2003-08-24 Bruno Haible <bruno@clisp.org>
+
+ * lib/binary-io.h: Include <stdio.h>, to avoid a compilation error when
+ MSVC7 <stdio.h> is included later.
+
+2003-08-22 Simon Josefsson <jas@extundo.com>
+
+ * modules/strndup (Makefile.am): Add strndup.h to lib_SOURCES.
+
+2003-08-20 Karl Berry <karl@gnu.org>
+
+ * m4/lib-ld.m4: serial 1003 from gettext, no changes besides serial.
+
+2003-08-20 Bruno Haible <bruno@clisp.org>
+
+ * modules/progname: New file.
+ * MODULES.html.sh (func_all_modules): Add progname.
+
+2003-08-20 Bruno Haible <bruno@clisp.org>
+
+ * lib/progname.h: New file, from GNU gettext.
+ * lib/progname.c: New file, from GNU gettext.
+ * lib/progreloc.c: New file, from GNU gettext.
+
+2003-08-19 Jim Meyering <jim@meyering.net>
+
+ * m4/lib-ld.m4: Revert yesterday's change, per Bruno's request here:
+ http://mail.gnu.org/archive/html/bug-gnulib/2003-08/msg00155.html
+
+2003-08-19 Bruno Haible <bruno@clisp.org>
+
+ * m4/xalloc.m4 (gl_PREREQ_XSTRDUP): Don't check for <string.h> any
+ more.
+
+2003-08-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/xstrdup.c: Assume <string.h> exists.
+
+2003-08-18 Paul Eggert <eggert@twinsun.com>
+
+ * modules/stdbool: Add BUILT_SOURCES. Prefer $@ to target name
+ in makefile rules.
+
+2003-08-18 Jim Meyering <jim@meyering.net>
+
+ * m4/getloadavg.m4: Use [\t ], not [ \t] (where \t is a literal TAB).
+ * m4/lib-ld.m4: Likewise.
+
+2003-08-18 Jim Meyering <jim@meyering.net>
+
+ * lib/setenv.h: Indent nested cpp directive.
+ * lib/vasnprintf.c: Remove trailing blanks.
+
+2003-08-17 Simon Josefsson <jas@extundo.com>
+
+ * modules/xstrndup: New file.
+ * MODULES.html.sh (func_all_modules): Add xstrndup.
+
+2003-08-17 Simon Josefsson <jas@extundo.com>
+
+ * modules/argp: Fix autoconf macro name. Add more dependencies.
+
+2003-08-17 Simon Josefsson <jas@extundo.com>
+
+ * m4/xstrndup.m4: New file.
+
+2003-08-17 Simon Josefsson <jas@extundo.com>
+
+ * m4/argp.m4: New file.
+
+2003-08-17 Simon Josefsson <jas@extundo.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/xstrndup.h: New file.
+ * lib/xstrndup.c: New file.
+
+2003-08-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/strndup (Files, Include): Add lib/strndup.h.
+
+2003-08-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/euidaccess (Files): Add lib/euidaccess.h.
+
+2003-08-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/strndup.h: New file.
+
+2003-08-17 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Handle gl_USE_SYSTEM_EXTENSIONS
+ like AC_GNU_SOURCE.
+ * modules/extensions (configure.ac): Comment out the invocation of
+ gl_USE_SYSTEM_EXTENSIONS.
+
+2003-08-16 Paul Eggert <eggert@twinsun.com>
+
+ Merges from coreutils, etc.
+ * m4/rpmatch.m4 (gl_PREREQ_RPMATCH): Insert ':' to prevent a syntax
+ error in gl_FUNC_MATCH. This fixes a bug I introduced on 2003-05-28.
+ * m4/readlink.m4 (gl_PREREQ_READLINK): Renamed from gl_PREREQ_READLINE,
+ fixing a typo.
+ * m4/host-os.m4 (UTILS_HOST_OS): Add GNU/NetBSD, GNU/FreeBSD.
+ * m4/hash.m4 (gl_HASH): Use AM_STDBOOL_H, not AC_HEADER_STDBOOL.
+
+2003-08-16 Paul Eggert <eggert@twinsun.com>
+
+ Document merge from coreutils.
+ * modules/alloca: Append $(ALLOCA_H) to BUILT_SOURCES.
+ * modules/fnmatch: Append $(FNMATCH_H) to BUILT_SOURCES.
+ * modules/utime: Add m4/utimes-null.m4.
+
+2003-08-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/regex.h, strdup.c, strtoll.c, strtoul.c: Do not normalize white
+ space, undoing this 2003-08-12 change:
+ <http://mail.gnu.org/archive/html/bug-gnulib/2003-08/msg00080.html>
+
+2003-08-16 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist.txt: Get regex.h, strdup.c, strtoll.c,
+ strtoul.c from libc, undoing this 2003-08-12 change:
+ <http://mail.gnu.org/archive/html/bug-gnulib/2003-08/msg00080.html>
+
+2003-08-16 Jim Meyering <jim@meyering.net>
+
+ Merges from coreutils.
+ * m4/readdir.m4 (GL_FUNC_READDIR): Change name to have GL_ (not jm_)
+ prefix. Adjust cache variables similarly. Create 500 rather than
+ just 300 files, to exercise bug on Darwin6.5, too.
+ * m4/perl.m4 (jm_PERL): Use $am_missing_run, not undefined
+ $missing_dir.
+ * m4/jm-winsz1.m4: Require AC_SYS_POSIX_TERMIOS, not
+ AM_SYS_POSIX_TERMIOS.
+ Reported by mkc@mathdogs.com.
+ Also change use of $am_cv_sys_posix_termios
+ to $ac_cv_sys_posix_termios. Reported by Andreas Schwab.
+ * m4/getgroups.m4 (jm_FUNC_GETGROUPS): Rewrite to use AC_FUNC_GETGROUPS
+ and (if needed) to call AC_LIBOBJ and to set GETGROUPS_LIB.
+ * m4/fsusage.m4 [__GLIBC__]: GNU libc's statvfs stats each mount point
+ in /proc/mounts until it finds one with matching device number. This
+ is unnecessary when the FILE argument *is* a mount point. No stat call
+ is necessary in that case. So, disable the statvfs-testing code on
+ systems with GNU libc. Reported by Andrei Gaponenko via Tim Waugh
+ as RedHat bug# 84846.
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Limit stack size
+ to 1MB, so as not to render systems with no stack size limit (e.g.,
+ linux-2.2.x) unusable. Suggestion and code from Bruno Haible.
+ Include <unistd.h>. On some systems,
+ it is required for the definition of _SC_PAGESIZE.
+
+2003-08-16 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+ * lib/xstrtoimax.c: #else #if -> #elif.
+ * lib/xstrtoumax.c: Likewise.
+
+2003-08-16 Jim Meyering <jim@meyering.net>
+
+ * m4/utimes.m4 (gl_FUNC_UTIMES): New file.
+ * m4/utimes.m4: Removed.
+ * m4/utimes-null.m4: Renamed from utimes.m4.
+
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Limit stack size
+ to 1MB, so as not to render systems with no stack size limit (e.g.,
+ linux-2.2.x) unusable. Suggestion and code from Bruno Haible.
+ Include <unistd.h>. On some systems,
+ it is required for the definition of _SC_PAGESIZE.
+
+2003-08-16 Jim Meyering <jim@meyering.net>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ Merges from coreutils, etc.
+
+ * m4/jm-macros.m4 (AC_LANG_SOURCE(C)): New macro, undefine, then define
+ using the latest version from cvs. This avoids problems with #line
+ directives using a vendor (Sun) compiler.
+ (jm_MACROS): Bump prerequisite from 2.52g to 2.57.
+ Don't set GETGROUPS_LIB here; now it's
+ done via getgroups.m4's wrapper function.
+ AC_SUBST OPTIONAL_BIN_PROGS, OPTIONAL_BIN_ZCRIPTS, and MAN here,
+ rather than just in sh-util/configure.in, so that the
+ now-shared-by-fileutils-and-textutils lib/Makefile.am are all the
+ same.
+ Use AC_CONFIG_LIBOBJ_DIR(lib) to tell the new
+ AC_FUNC_GETLOADAVG where to find getloadavg.c.
+ Require AC_FUNC_FTW, gt_INTTYPES_PRI, gl_CLOCK_TIME,
+ UTILS_SYS_OPEN_MAX, GL_FUNC_GETCWD_PATH_MAX, GL_FUNC_READDIR,
+ gl_FSUSAGE, gl_MOUNTLIST, AC_FUNC_CANONICALIZE_FILE_NAME.
+ Remove code that is now done by the newly-required macros.
+ Append $(EXEEXT) to DF_PROG.
+ AC_LIBOBJ fchdir-stub if fchdir doesn't exist; similarly for fchown.
+ Do not invoke or require the following here,
+ since prereq.m4 or some gnulib .m4 now does this for us:
+ gl_REGEX, UTILS_FUNC_MKDIR_TRAILING_SLASH, jm_BISON, gl_FUNC_MKTIME,
+ jm_FUNC_LSTAT, jm_FUNC_STAT, jm_FUNC_REALLOC, jm_FUNC_MALLOC,
+ jm_FUNC_NANOSLEEP, jm_FUNC_READDIR, jm_FUNC_MEMCMP,
+ jm_FUNC_GLIBC_UNLOCKED_IO, AC_FUNC_FNMATCH_GNU, jm_FUNC_PUTENV,
+ jm_AC_PREREQ_XSTRTOUMAX, jm_AC_PREREQ_XSTRTOIMAX,
+ AC_FUNC_ERROR_AT_LINE, jm_FUNC_GNU_STRFTIME, AC_FUNC_VPRINTF,
+ vb_FUNC_RENAME, UTILS_FUNC_MKSTEP, jm_FUNC_UTIME, AM_FUNC_GETLINE,
+ AC_FUNC_OBSTACK.
+ Do not replace the following functions, as this is now the job
+ of some gnulib .m4: strcasecmp, strncasecmp, dup2, gethostname,
+ getusershell, sig2str, strcspn, stpcpy, strstr, strtol, strtoul
+ strpbrk, euidaccess, memcmp, rmdir, rpmatch, strndup, strverscmp,
+ atexit getpass, strdup, getpagesize.
+ Replace 'raise'.
+ Do not check for the following functions, as this is now the job
+ of some gnulib .m4: bcopy, canonicalize_file_name, fchdir, ftime,
+ getcwd, getmntinfo, resolvepath. But check for sysctl, setreuid,
+ setregid.
+ (jm_CHECK_ALL_HEADERS): Do not check for fenv.h.
+ Check for sys/sysctl.h.
+ (jm_CHECK_ALL_TYPES): Do not require AC_STRUCT_TM, AC_STRUCT_TIMEZONE,
+ jm_CHECK_TYPE_STRUCT_TIMESPEC. Invoke gt_TYPE_SSIZE_T instead
+ of checking for ssize_t ourselves.
+
+ * m4/prereq.m4 (jm_PREREQ): Don't invoke macros; AC_REQUIRE them.
+ Require every macro that gnulib/modules/* suggests for us.
+ (jm_PREREQ_ADDEXT): New macro.
+ (jm_PREREQ_STAT): Check for 'struct statfs' on Ultrix 4.4.
+ Require jm_AC_TYPE_LONG_LONG instead of invoking it.
+
+ * m4/physmem.m4 (gl_SYS__SYSTEM_CONFIGURATION): New macro.
+ (gl_PHYSMEM): Use it.
+ Also check for `table' function.
+ Check for new headers and functions.
+ Add check for sys/sysmp.h.
+ With suggestions from Kaveh Ghazi.
+ Ignore headers that are present but cannot be compiled. This
+ avoids spurious warnings on Solaris 9 sparc with Forte Developer 7
+ C 5.4.
+
+2003-08-15 Paul Eggert <eggert@twinsun.com>
+
+ Document merge from coreutils.
+ * modules/userspec: Depend on posixver.
+ * modules/strftime: Depend on tzset.
+
+2003-08-15 Paul Eggert <eggert@twinsun.com>
+
+ * lib/config.charset, ref-add.sin, ref-del.sin: Use three spaces,
+ rather than tab, after '#' in shell-script copyright notices.
+ Suggested by Bruno Haible.
+
+2003-08-15 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist-update: Use three spaces, rather than tab, after '#'
+ in shell-script copyright notices. Suggested by Bruno Haible.
+ Remove unnecessary parenthesization in regular expression.
+
+2003-08-15 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+ * lib/xgethostname.c: Include <stdlib.h>.
+ (xghostname): Don't exit for anything other than memory-related
+ failure; just return NULL.
+ * lib/userspec.c: Include "posixver.h".
+ (parse_user_spec): Accept `.' as a separator only
+ in pre-POSIX-200112 mode.
+ * lib/strtoimax.c: Use #elif rather than #else #if.
+ * lib/strftime.c (my_strftime) [!_LIBC && HAVE_TZNAME && HAVE_TZSET]:
+ Remove function, now that we can rely on a working tzset function.
+ [!_LIBC]: Ensure that the required autoconf test has been run.
+ [!defined _NL_CURRENT && HAVE_STRFTIME]:
+ Use underlying_strftime for %r.
+ * lib/sha.c: Merge in some clean-up and optimization changes from
+ glibc.
+ * lib/sha.c (sha_stream) [BLOCKSIZE]: Move definition to top of file.
+ Ensure that it is a multiple of 64.
+ Rearrange loop exit tests so as to avoid performing an
+ additional fread after encountering an error or EOF.
+ * lib/realloc.c: Update copyright date.
+
+2003-08-15 Jim Meyering <jim@meyering.net>
+ and Paul Eggert <eggert@twinsun.com>
+
+ Merge from coreutils.
+ * lib/readutmp.h (HAVE_UTMPX_H): Undef if struct utmp has the ut_exit
+ member but strut utmpx does not. Needed for AIX 4.3.3.
+ (UT_EXIT_E_TERMINATION, UT_EXIT_E_EXIT): Define.
+
+2003-08-15 Jim Meyering <jim@meyering.net>
+ and Paul Eggert <eggert@cs.ucla.edu>
+
+ Merges from coreutils, etc.
+ * m4/strftime.m4 (_jm_STRFTIME_PREREQS):
+ Require gl_FUNC_TZSET_CLOBBER.
+ * m4/readutmp.m4 (gl_READUTMP): Check for ut_exit.ut_exit,
+ ut_exit.e_exit, ut_exit.ut_termination, and ut_exit.e_termination
+ members.
+
+2003-08-14 Paul Eggert <eggert@twinsun.com>
+
+ Help the merge from coreutils.
+ * m4/gettimeofday.m4 (gl_GETTIMEOFDAY_REPLACE_LOCALTIME): New macro.
+ (AC_FUNC_GETTIMEOFDAY_CLOBBER): Use it.
+ * m4/tzset.m4: Use it too.
+
+2003-08-14 Paul Eggert <eggert@twinsun.com>
+
+ * modules/tzset: New file.
+
+2003-08-14 Jim Meyering <jim@meyering.net>
+
+ Merges from coreutils.
+ * modules/fnmatch: Use the `$(FNMATCH_H)' notation for AC_REPLACED
+ variable names, rather than @FNMATCH_H@.
+ * modules/alloca: Likewise for $(ALLOCA_H).
+
+ * modules/fnmatch (fnmatch.h): Use `$@' in the commands, in place of
+ the three copies of the literal target, `fnmatch.h'.
+ * modules/alloca (alloca.h): Likewise.
+
+2003-08-14 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+ * m4/tzset.m4: New file.
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Move the
+ MOUNTED_VMOUNT test to precede the MOUNTED_GETMNTENT1 tests, since
+ otherwise, AIX 5.1 systems would end up using the latter.
+ MOUNTED_GETMNTENT1 support is inadequate on such systems: 1) detecting
+ whether a file system is remote doesn't work 2) the MOUNTED_VMOUNT
+ code reports the HOSTNAME:/MOUNT_POINT, while the MOUNTED_GETMNTENT1
+ code reports merely /MOUNT_POINT. Reported by Mike Jetzer.
+
+2003-08-14 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+ * lib/obstack.h: Whitespace changes.
+ * lib/mountlist.c: Remove anachronistic casts of xmalloc, xrealloc,
+ and xcalloc return values.
+ (read_filesystem_list) [MOUNTED_GETFSSTAT]:
+ Use MNT_NOWAIT, rather than MNT_WAIT. Otherwise, `df DIR' could
+ hang on OSF/1 5.1 for DIR on both local and remote file systems.
+ Reported by (and fix confirmed by) Nelson H. F. Beebe.
+ (read_filesystem_list) [MOUNTED_VMOUNT]: Detect any
+ error from mntctl.
+ Use mntctl's return value to drive the entry-processing loop, since
+ we can't rely on the value of the vmt_length member in the last
+ entry. On some systems doing so could result in exhausting
+ virtual memory. Based in part on a patch from Mike Jetzer.
+
+2003-08-14 Jim Meyering <jim@meyering.net>
+ and Paul Eggert <eggert@twinsun.com>
+
+ Merges from coreutils, plus other fixes.
+ * lib/physmem.c: Merge in portability changes from gcc/libiberty
+ to support AIX, IRIX, Tru64, and Windows. See the ChangeLog there
+ for credits and details. Thanks to Kaveh Ghazi for helping
+ to keep these files in sync.
+ (ARRAY_SIZE): Define it.
+ (physmem_total, physmem_available): Add comments. From Kaveh Ghazi.
+ * lib/memcasecmp.c: Remove unnecessary parentheses after 'defined'.
+ (memcasecmp): Don't assume size_t fits in unsigned int.
+ Remove casts and duplicate code.
+ * lib/md5.c: Include <string.h> and <stdlib.h> unconditionally.
+ (memcpy): Remove definition.
+ Merge in some clean-up and optimization changes from glibc.
+ [BLOCKSIZE]: Move definition to top of file.
+ Ensure that it is a multiple of 64.
+ Rearrange loop exit tests so as to avoid performing an
+ additional fread after encountering an error or EOF.
+ * lib/md5.h (md5_uintptr): Define.
+ * lib/makepath.c (CLEANUP_CWD): Report an error if we failed to
+ return to the initial working directory. Preserve errno
+ for caller.
+ * lib/idcache.c: Include "xalloc.h".
+ (xmalloc, xrealloc): Remove decls.
+ (getuser): Remove casts no longer required in C89.
+ * lib/human.c: Include stdio.h, for sprintf.
+ * lib/group-member.c: Include "xalloc.h".
+ (xmalloc, xrealloc): Remove decls.
+ (get_group_info): Remove casts no longer required in C89.
+ * lib/getusershell.c (readname): Remove casts no longer required in
+ C89.
+ * lib/gettimeofday.c (rpl_gmtime, rpl_tzset): New functions.
+ * lib/getline.c: Whitespace fix, from coreutils.
+
+2003-08-13 Paul Eggert <eggert@twinsun.com>
+
+ * m4/exclude.m4 (gl_EXCLUDE): Require AC_C_INLINE, AC_HEADER_STDC.
+ Check for isascii.
+
+ * m4/gettext.m4, iconv.m4, intdiv0.m4, inttypes-pri.m4, lib-link.m4,
+ lib-prefix.m4, longdouble.m4, po.m4, progtest.m4, signed.m4:
+ Undo previous (whitespace-only) change.
+
+2003-08-13 Paul Eggert <eggert@twinsun.com>
+
+ * lib/exclude.c: Include <ctype.h>
+ (IN_CTYPE_DOMAIN): New macro.
+ (is_space): New fn.
+ (add_exclude_file): If LINE_END is a space, ignore trailing spaces
+ and empty lines.
+
+ * lib/argp-help.c, argp-parse.c, config.charset, getopt.h:
+ Undo previous (whitespace-only) change.
+
+2003-08-13 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist-update: Change update back to the old behavior,
+ leaving whitespace alone. Use one 'sed' command rather than a
+ pipeline.
+ (fixlicense): Now a variable, not a function.
+ (remove_trailing_blanks): Remove.
+ (fixfile): Don't invoke unexpand or cat, or remove trailing blanks.
+ * config/config.guess, config.sub, install-sh, missing, texinfo.tex:
+ Undo previous (whitespace-only) change.
+
+2003-08-12 Paul Eggert <eggert@twinsun.com>
+
+ Merge from coreutils.
+ * modules/euidaccess: Add lib_SOURCES, include for new
+ file euidaccess.h
+
+2003-08-12 Paul Eggert <eggert@twinsun.com>
+
+ * m4/gettext.m4, iconv.m4, intdiv0.m4, inttypes-pri.m4, lib-link.m4,
+ lib-prefix.m4, longdouble.m4, po.m4, progtest.m4, signed.m4:
+ Normalize leading white space and remove trailing white space.
+
+ Merge from coreutils
+ * m4/euidaccess.m4 (gl_FUNC_EUIDACCESS): Check for euidaccess decl.
+
+ * m4/lib-ld.m4, lib-link.m4, lib-prefix.m4: Regenerate from gettext
+ 0.12.1. These files are now being upgraded automatically by
+ ../config/srclist-update.
+
+2003-08-12 Paul Eggert <eggert@twinsun.com>
+
+ * lib/argp-help.c, argp-parse.c, config.charset, getopt.h:
+ Normalize leading white space and remove trailing white space.
+ * lib/ref-add.sin, ref-del.sin: Use '#' before empty line in copyright
+ notice, as per ../config/srclist-update.
+
+ Merge from coreutils.
+ * lib/euidaccess.h: New file.
+ * lib/euidaccess.c: Include it.
+ * lib/.cppi-disable: Add printf-args.h, printf-parse.h, stdbool_.h,
+ vasnprintf.h, vasprintf.h. Remove strdup.c, gettext.h.
+ * lib/regex.h, strdup.c, strtoll.c, strtoul.c: Normalize white space.
+
+2003-08-12 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist-update: Add copyright notice.
+ (remove_id_lines, remove_trailing_blanks): New constants.
+ (fixfile): Use them to normalize spacing a bit in copied files.
+ * config/config.guess, config.sub, install-sh, missing, texinfo.tex:
+ Normalize leading white space and remove trailing white space.
+
+ * config/texinfo.tex: Sync with texinfo.
+
+ * config/srclist.txt: Don't get regex.h, strdup.c, strtoll.c,
+ strtoul.c from libc, to merge coreutils whitespace changes.
+
+ * config/srclist.txt: Get the following m4 files from gettext:
+ codeset.m4, gettext.m4, glibc21.m4, iconv.m4, intdiv0.m4,
+ inttypes-pri.m4, lcmessage.m4, lib-ld.m4, lib-link.m4, lib-prefix.m4,
+ longdouble.m4, nls.m4, po.m4, progtest.m4, signed.m4, wchar_t.m4,
+ wint_t.m4.
+
+2003-08-12 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: can't sync vasnprintf.c any more, changes have
+ been made.
+
+2003-08-11 Paul Eggert <eggert@twinsun.com>
+
+ * modules/gnu-source, m4/gnu-source.m4:
+ Remove; we're assuming Autoconf 2.54 or later now.
+ Suggested by Bruno Haible.
+ * MODULES.html.sh (func_all_modules): Remove gnu-source.
+
+2003-08-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF): Also check for wcslen.
+
+2003-08-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (local_wcslen): New function, for Solaris 2.5.1.
+ (vasnprintf): Use it instead of wcslen.
+
+2003-08-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdbool_.h (_Bool): Undo last change; instead use a negative enum
+ value to ensure that _Bool promotes to int. Use #define for _Bool when
+ using the Solaris C compiler. Adds comments suggested by Paul Eggert.
+
+2003-08-10 Karl Berry <karl@gnu.org>
+
+ * lib/regex.h: update from libc (whitespace fix).
+
+2003-08-09 Paul Eggert <eggert@twinsun.com>
+
+ Merge some files from coreutils. These changes were
+ originally made by Jim Meyering.
+ * lib/acl.c: Include <sys/types.h> before <sys/stat.h>;
+ many older Unixes require this.
+ * lib/alloca.c (alloca): Remove cast to argument of free;
+ no longer needed in C89.
+ * lib/alloca_.h, regex.h: Fix white space to match
+ what GNU indent does.
+
+2003-08-09 Paul Eggert <eggert@twinsun.com>
+
+ * m4/regex.m4 (jm_INCLUDED_REGEX): Change "\201" to "\371";
+ apparently Emacs's Unicode mode got confused before my 2003-08-05
+ checkin.
+
+2003-08-08 Paul Eggert <eggert@twinsun.com>
+
+ * m4/extensions.m4: New file.
+ * m4/timespec.m4 (jm_CHECK_TYPE_STRUCT_TIMESPEC):
+ Require gl_USE_SYSTEM_EXTENSIONS.
+ * m4/unlocked-io.m4 (jm_FUNC_GLIBC_UNLOCKED_IO):
+ Require gl_USE_SYSTEM_EXTENSIONS rather than AC_GNU_SOURCE.
+
+2003-08-08 Paul Eggert <eggert@twinsun.com>
+
+ * MODULES.html.sh (func_all_modules): Add extensions, gnu-source.
+ * modules/extensions, modules/gnu-source: New files.
+ * modules/timespec, modules/unlocked-io: Depend on extensions.
+
+2003-08-07 Paul Eggert <eggert@twinsun.com>
+
+ * modules/restrict: New file.
+ * MODULES.html.sh (func_all_modules): Add restrict.
+ * modules/regex: Depend on restrict.
+
+2003-08-07 Paul Eggert <eggert@twinsun.com>
+
+ * m4/restrict.m4: New file.
+ * m4/regex.m4 (jm_PREREQ_REGEX): Add gl_C_RESTRICT.
+
+2003-08-07 Bruno Haible <bruno@clisp.org>
+
+ * modules/getndelim2 (Makefile.am): Add the files to EXTRA_DIST, not
+ lib_SOURCES, because getndelim2.m4 now uses AC_LIBOBJ(getndelim2).
+
+2003-08-07 Bruno Haible <bruno@clisp.org>
+
+ * m4/getndelim2.m4 (gl_GETNDELIM2): Use AC_LIBOBJ(getndelim2). This
+ makes the module 'getndelim2' compatible with the module 'getline'.
+
+2003-08-05 Paul Eggert <eggert@twinsun.com>
+
+ * m4/regex.m4 (jm_INCLUDED_REGEX): Replace a single non-ASCII
+ byte with "\201" to avoid glitches when editing that source file
+ with multi-gnome-terminal.
+
+2003-08-05 Paul Eggert <eggert@twinsun.com>
+
+ * lib/bumpalloc.h: Remove.
+
+2003-08-05 Paul Eggert <eggert@twinsun.com>
+
+ * MODULES.html.sh (func_all_modules): Remove bumpalloc.
+ * modules/bumpalloc: Remove.
+
+2003-08-04 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getloadavg.c: Change copyright notice and spacing to conform to
+ GNU coding style.
+
+ Merge from coreutils.
+ * lib/error.c [!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is
+ 1. From glibc.
+ * lib/getdate.y (date): Also accept dates like May-23-2003; suggestion
+ from Karl Berry, implemented by Jim Meyering.
+ * lib/getgroups.c: Include "xalloc.h" instead of declaring xalloc fns;
+ from Dmitry V. Levin.
+ Remove anachronistic cast of xrealloc.
+ * lib/fnmatch_.h (__const): Remove. Use 'const'.
+ * lib/fnmatch_loop.c (NEW_PATTERN): Cast alloca return value to proper
+ type. Otherwise, it wouldn't compile with at least /bin/cc on
+ ymp-cray-unicos9.0.2.X.
+ Combine two mostly-identical uses of alloca into one.
+ Thanks to the Cray-Cyber project for access to a Cray Y-MP.
+
+2003-08-04 Dave Love <d.love@dl.ac.uk>
+
+ [From Emacs.]
+
+ * lib/getloadavg.c: Check `__unix' as well as `unix'. Use #ifdef, not
+ #if. Check HAVE_LIBKSTAT as well as LOAD_AVE_TYPE. Check
+ F_SETFD, not FD_SETFD. Use HAVE_STRUCT_NLIST_N_UN_N_NAME, not
+ obsolete NLIST_NAME_UNION.
+ [__GNU__]: Undef BSD and FSCALE.
+ [!NLIST_STRUCT]: Remove conditional definition of NLIST_STRUCT.
+
+2003-08-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/stdbool_.h (_Bool): Make it signed char, instead of
+ an enum type, so that it's guaranteed to promote to int. See:
+ <http://mail.gnu.org/archive/html/bug-gnulib/2003-07/msg00124.html>
+
+2003-08-03 Karl Berry <karl@gnu.org>
+
+ * config/depcomp: update from automake.
+
+2003-07-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/strerror.c: Include config.h, limits.h. Declare sprintf.
+ (strerror): Don't assume that a printable int fits in 14 bytes.
+
+2003-07-31 Bruno Haible <bruno@clisp.org>
+
+ * modules/getpass-gnu: New file.
+ * MODULES.html.sh (func_all_modules): Add getpass-gnu.
+
+2003-07-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/getpass.m4 (gl_FUNC_GETPASS_GNU): New macro.
+
+2003-07-24 Karl Berry <karl@gnu.org>
+
+ * config/missing: update from automake.
+
+2003-07-24 Derek Robert Price <derek@ximbiot.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/getline.h (getline, getdelim): Change return type to ssize_t.
+ * lib/getline.c (getline, getdelim): Likewise.
+ Remove _GNU_SOURCE define; now it's defined in config.h through
+ m4/getline.m4.
+
+2003-07-23 Karl Berry <karl@gnu.org>
+
+ * config/config.sub: update from prep.
+
+2003-07-22 Paul Eggert <eggert@twinsun.com>
+
+ * modules/xalloc (Depends-on): Add exitfail.
+ * modules/xmemcoll: Likewise.
+
+2003-07-22 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xalloc.h (XCALLOC, XREALLOC, CCLONE): Fix under- and
+ over-parenthesization in macros.
+
+ Sync with coreutils.
+
+ * lib/xalloc.h (XMALLOC, XCALLOC, XREALLOC): Remove casts not
+ required by C99.
+
+ Use `exit_failure' for xalloc and xmemcoll instead of their own
+ private exit-failure variables.
+ * lib/xalloc.h (xalloc_exit_failure): Remove.
+ * lib/xmalloc.c: Likewise. Include exitfail.h.
+ (xalloc_die): Use exit_failure instead of xalloc_exit_failure.
+ * lib/xmemcoll.h (xmemcoll_exit_failure): Remove.
+ * lib/xmemcoll.c: Likewise. Include exitfail.h.
+ (xmemcoll): Use exit_failure instead of xalloc_exit_failure.
+
+2003-07-20 Jim Meyering <jim@meyering.net>
+
+ * modules/closeout (Depends-on): Add exitfail.
+ Suggestion from Bruno Haible.
+
+2003-07-19 Karl Berry <karl@gnu.org>
+
+ * config/config.sub: update from prep.
+
+2003-07-18 Paul Eggert <eggert@twinsun.com>
+
+ * lib/closeout.h (close_stdout_set_status, close_stdout_status):
+ Remove.
+ * lib/closeout.c: Likewise. Include "closeout.h" right after config.h,
+ to test that it can stand by itself. Include "exitfail.h".
+ Clients should set exit_failure instead.
+ (EXIT_FAILURE): Remove; no longer needed. Do not include <stdlib.h>.
+
+2003-07-18 Bruno Haible <bruno@clisp.org>
+
+ * modules/getndelim2: New file.
+ * modules/getline: Share files with module getndelim2.
+ * modules/getnline: Depend on getndelim2 instead of sharing files with
+ it. Add getnline.c to lib_SOURCES.
+ * MODULES.html.sh (func_all_modules): Add getndelim2.
+
+2003-07-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/getndelim2.m4: New file.
+ * m4/getline.m4 (AM_FUNC_GETLINE): Add AC_LIBOBJ of getndelim2.c and
+ invoke gl_PREREQ_GETNDELIM2.
+ (gl_PREREQ_GETLINE): Drop AC_HEADER_STDC, now done by
+ gl_PREREQ_GETNDELIM2.
+ * m4/getnline.m4 (gl_GETNLINE): Drop AC_HEADER_STDC, now done by
+ gl_GETNDELIM2.
+
+2003-07-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/getndelim2.h: New file.
+ * lib/getndelim2.c: Make into a module of its own. Include config.h,
+ getndelim2.h.
+ (getndelim2): Make non-static. Change return type to ssize_t.
+ * lib/getline.h: Change argument names.
+ * lib/getline.c: Include getndelim2.h instead of getndelim2.c.
+ * lib/getnline.c: Include getndelim2.h.
+
+2003-07-18 Andreas Schwab <schwab@suse.de>
+
+ * lib/memcoll.c (memcoll) [!HAVE_STRCOLL]: Clear errno.
+
+2003-07-17 Karl Berry <karl@gnu.org>
+
+ * config/config.sub: update from prep.
+
+2003-07-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/getnline: New file.
+ * modules/getline: Add lib/getndelim2.c to source file list.
+ * MODULES.html.sh (func_all_modules): Add getnline.
+
+2003-07-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/getnline.m4: New file.
+
+2003-07-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/Makefile.am.in: Remove file.
+ * m4/Makefile.am: Remove file.
+ * m4/Makefile.in: Remove file.
+
+2003-07-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/getnline.h: New file.
+ * lib/getnline.c: New file.
+ * lib/getndelim2.c: New file, extracted from getline.c.
+ (getndelim2): Renamed from getdelim2, with added nmax argument.
+ * lib/getline.c: Include getndelim2.c.
+ (getdelim2): Moved out to getndelim2.c.
+ (getline, getdelim): Update.
+
+2003-07-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/Makefile.am: Remove file.
+ * lib/Makefile.in: Remove file.
+
+2003-07-17 Bruno Haible <bruno@clisp.org>
+
+ * configure.in: Remove file.
+ * Makefile.in: Remove file.
+
+2003-07-17 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh: Put the </BODY> right before </HTML>.
+
+2003-07-16 Karl Berry <karl@gnu.org>
+
+ * config/srclist-update: was running fixlicense twice, which caused
+ texinfo.tex to be nullified for some reason. Simplify,
+ $gplsrc is no longer needed as far as I can see?
+
+2003-07-16 Jim Meyering <jim@meyering.net>
+
+ * modules/save-cwd: Depend on xgetcwd. From Derek Price.
+
+2003-07-15 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist.txt: Get the following files from gettext-runtime/intl
+ instead: config.charset, localcharset.c, localcharset.h, ref-add.sin,
+ ref-del.sin. From Bruno Haible.
+ * config/srclist-update (fixfile): Change grep pattern again, since the
+ previous fix didn't work (there was another trailing $). Use
+ '[$]' to escape the $s.
+
+2003-07-15 Karl Berry <karl@gnu.org>
+
+ * lib/vasnprintf.c: update from gettext.
+
+2003-07-15 Karl Berry <karl@gnu.org>
+
+ * config/srclist-update (fixfile): Change grep pattern, since 'Id'
+ gets expanded when surrounded by '$'.
+
+2003-07-15 Jim Meyering <jim@meyering.net>
+
+ * modules/save-cwd: Don't depend on error. From Derek Price.
+
+2003-07-15 Jim Meyering <jim@meyering.net>
+
+ * lib/makepath.c (make_path): Enclose diagnostic in _(...).
+
+2003-07-14 Simon Josefsson <jas@extundo.com>
+
+ * modules/mempcpy: New file.
+ * MODULES.html.sh (func_all_modules): Add mempcpy.
+
+2003-07-14 Simon Josefsson <jas@extundo.com>
+
+ * m4/mempcpy.m4: New file.
+
+2003-07-14 Simon Josefsson <jas@extundo.com>
+
+ * lib/mempcpy.h: New file.
+ * lib/mempcpy.c: New file.
+
+2003-07-14 Paul Eggert <eggert@twinsun.com>
+
+ * modules/getdate, modules/posixtm: Depend on mktime.
+
+2003-07-14 Paul Eggert <eggert@twinsun.com>
+
+ * lib/ceill.c, expl.c, floorl.c, frexpl.c, ldexpl.c, mathl.h,
+ sincosl.c, sqrtl.c, trigl.c, trigl.h, poll.c, poll_.h, mkstemp.c,
+ unicodeio.c, unicodeio.h, unlocked-io.h:
+ Switch from LGPL to GPL.
+
+2003-07-14 Paul Eggert <eggert@twinsun.com>
+
+ * lib/asnprintf.c, asprintf.c, config.charset, gettext.h,
+ localcharset.c, localcharset.h, mkdtemp.c, printf-args.c,
+ printf-args.h, printf-parse.c, printf-parse.h, ref-add.sin,
+ ref-del.sin, setenv.c, unsetenv.c, vasnprintf.c, vasnprintf.h,
+ vasprintf.c, vasprintf.h: Regenerate. These files are now being
+ updated automatically by ../config/srclist-update. This changes
+ their license from LPGL to GPL.
+
+2003-07-14 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist.txt: Add tons more gettext files. $GETTEXT is now
+ assumed to refer to the root of the most recent stable gettext version.
+ * config/srclistvars.sh: Add defaults for eggert.
+ * config/srclist-update: Convert LGPL to GPL in shell scripts, too.
+ Match "This program" as well as "The program". This is needed
+ for gettext.
+
+2003-07-14 Jim Meyering <jim@meyering.net>
+
+ Don't emit diagnostics. Let callers do that.
+ * lib/save-cwd.c: Don't include "error.h".
+ (save_cwd): Don't call error. Ensure that errno is valid
+ when returning nonzero.
+
+ * lib/save-cwd.h (restore_cwd): Update prototype.
+ * lib/save-cwd.c (restore_cwd): Remove two parameters.
+ Simplify. Don't call error upon failure. Let callers do that.
+ (save_cwd): Mention that Irix 5.3 has the same problem as SunOS 4
+ when auditing is enabled. But don't bother updating the #if.
+
+2003-07-11 Alexandre Duret-Lutz <adl@gnu.org>
+
+ * lib/obstack.h (__INT_TO_PTR): Revert change of 2003-03-13;
+ it breaks C++ compilation.
+ [!__GNUC__ || !__STDC__] (obstack_finish): Cast result to void*.
+
+2003-07-10 Simon Josefsson <jas@extundo.com>
+
+ * modules/strchrnul (Makefile.am): Add strchrnul.h.
+
+2003-07-10 Jim Meyering <jim@meyering.net>
+
+ * m4/clock_time.m4: Remove trailing blank.
+ * m4/intmax_t.m4: Likewise.
+
+2003-07-10 Jim Meyering <jim@meyering.net>
+
+ * lib/vasnprintf.c: Remove trailing blanks.
+ Make cpp indentation consistent.
+
+2003-07-09 Paul Eggert <eggert@twinsun.com>
+
+ * lib/alloca_.h, euidaccess.c, getpass.c, memrchr.c, obstack.h,
+ posixver.c, strftime.c, strnlen.c, strverscmp.c:
+ Switch from LGPL to GPL.
+
+2003-07-09 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist.txt: Sort sublists. Add
+ $LIBCSRC/sysdeps/generic/strtoul.c. In comments, add more libc files
+ that differ from gnulib for one reason or another; we'd like this list
+ to be smaller but for now let's document what we have.
+
+2003-07-08 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist-update: Port to POSIX 1003.1-2001 hosts by avoiding
+ the use of GNU extensions. Change "x=`eval echo $x`" to the shorter
+ and sweeter "eval x=$x".
+ * config/srclist.txt: Get lib/argp* from glibc.
+
+2003-07-07 Paul Eggert <eggert@twinsun.com>
+
+ * lib/mktime.c: Fix some boundary cases and remove need for floating
+ point.
+
+ Issue a compile-time diagnostic if time_t is floating point, or if
+ two's complement arithmetic is not in effect, or if arithmetic
+ right shift does not propagate the sign. These assumptions were
+ all in the original code but they weren't checked.
+
+ (TIME_T_MIDPOINT, verify): New macros.
+ (__isleap): Remove; it has integer overflow problems.
+ (leapyear): New function, without those problems.
+ (ydhms_tm_diff): Remove; splitting into two parts.
+ (ydhms_diff): New function, containing the arithmetic part of
+ the old ydhms_tm_diff function. Issue a compile-time
+ diagnostic if we are not using C99 integer division.
+ Avoid casts when possible.
+ (guess_time_tm): New function, containing the checking part of
+ the old ydhms_tm_diff function. Return the new value, rather than
+ the difference between it and the old. Accept a new argument T
+ so that *T specifies the old value. Check for overflow in the result.
+
+ (__mktime_internal): Use a time_t offset, not a long int offset.
+ This undoes the 2003-06-04 change, which is no longer needed now
+ that we have better overflow checking.
+ (localtime_offset): Likewise.
+
+ (__mktime_internal): Avoid harmful overflow on hosts where time_t
+ and long are 64-bit but int is only 32-bit.
+ (ydhms_diff): Use long int to store year1 and yday1.
+ Issue a compile-time diagnostic if long int is not wide enough.
+
+ (__mktime_internal): Use long int to store adjusted year and yday.
+ Use plain C rather than preprocessor commands, if that doesn't
+ affect efficiency.
+ Check for overflow (and try to repair) after each probe
+ rather than checking only at the very end. This avoids some bugs
+ (e.g., southern hemisphere, behind GMT, and GMT offset at minimum time
+ does not equal GMT offset at maximum time).
+ Use integer to check for overflow rather than floating point; this
+ is more portable to non-IEEE hosts, and is a tad faster.
+ When we detect that we are oscillating between two values,
+ don't check whether tm_isdst has the requested value, since
+ we already know the answer. When tm_isdst has the wrong value,
+ use a different heuristic to find the right one, based on the
+ extreme values actually observed in practice in tz2003a,
+ rather than the (overly optimistic) "previous 3 calendar quarters".
+
+ (not_equal_tm, print_tm, check_result): Use "const T" rather than
+ "T const" to accommodate glibc style.
+ (check_result): Use less-confusing report format. "long" -> "long int.
+ (main): Likewise.
+ Don't loop if the iteration overflows time_t.
+ Allow a negative step in the iteration.
+
+2003-07-06 Karl Berry <karl@gnu.org>
+
+ * config/depcomp: update from automake.
+ * config/config.sub: update from prep.
+
+2003-07-03 Karl Berry <karl@gnu.org>
+
+ * config/config.guess: update from prep.
+
+2003-07-01 Paul Eggert <eggert@twinsun.com>
+
+ * m4/xreadlink.m4 (gl_XREADLINK): Don't check for sys/types.h, since
+ xreadlink.c now includes it unconditionally.
+
+2003-07-01 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xreadlink.c: Include <sys/types.h> unconditionally, instead of
+ having it depend on HAVE_SYS_TYPES_H.
+
+2003-07-01 Bruno Haible <bruno@clisp.org>
+
+ * m4/ssize_t.m4 (gt_TYPE_SSIZE_T): Don't include <unistd.h>.
+ <sys/types.h> should be sufficient.
+ Reported by Paul Eggert.
+
+2003-06-26 Karl Berry <karl@gnu.org>
+
+ * config/depcomp: update from automake.
+
+2003-06-26 Bruno Haible <bruno@clisp.org>
+
+ * modules/human: Depend on module stdbool.
+
+2003-06-25 Bruno Haible <bruno@clisp.org>
+
+ * modules/readlink: New file.
+ * modules/xreadlink: Depend on it.
+ * MODULES.html.sh (func_all_modules): Add readlink.
+
+2003-06-25 Bruno Haible <bruno@clisp.org>
+
+ * m4/readlink.m4: New file.
+
+2003-06-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/readlink.c: New file.
+
+2003-06-22 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: update mkinstalldirs from automake.
+ * config/mkinstalldirs: update.
+
+2003-06-22 Bruno Haible <bruno@clisp.org>
+
+ Portability to mingw32.
+ * m4/ssize_t.m4: New file, from GNU gettext.
+ * m4/safe-read.m4 (gl_PREREQ_SAFE_READ): Require gt_TYPE_SSIZE_T.
+ * m4/xreadlink.m4 (gl_XREADLINK): Require gt_TYPE_SSIZE_T.
+
+2003-06-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/safe-read: Add m4/ssize_t.m4.
+ * modules/xreadlink: Add m4/ssize_t.m4.
+
+2003-06-20 Bruno Haible <bruno@clisp.org>
+
+ Assume C89, so PARAMS isn't needed.
+ * lib/unicodeio.h (PARAMS): Remove.
+ * lib/unicodeio.c: Don't use PARAMS.
+
+2003-06-18 Karl Berry <karl@gnu.org>
+
+ * config/config.{guess,sub}: update from prep.
+
+2003-06-18 Jim Meyering <jim@meyering.net>
+
+ Merge changes from coreutils.
+ * lib/readutmp.c: Include <string.h> and <stdlib.h> unconditionally.
+ Remove explicit declarations of xmalloc and realloc.
+ Include xalloc.h.
+ (read_utmp): Remove anachronistic cast of xmalloc.
+
+2003-06-17 Paul Eggert <eggert@twinsun.com>
+
+ Assume C89, so PARAMS isn't needed.
+ * lib/backupfile.h (PARAMS): Remove. All uses removed.
+ * lib/closeout.h, lib/dirname.h, lib/filemode.h, lib/fsusage.h,
+ lib/getdate.h, lib/getline.h, lib/group-member.h, lib/hard-locale.h,
+ lib/hash.h, lib/linebuffer.h, lib/long-options.h, lib/makepath.h,
+ lib/memcasecmp.h, lib/memcoll.h, lib/modechange.h, lib/mountlist.h,
+ lib/path-concat.h, lib/physmem.h, lib/posixtm.h, lib/quote.h,
+ lib/readutmp.h, lib/same.h, lib/save-cwd.h, lib/savedir.h,
+ lib/stdio-safer.h, lib/strtoimax.c, lib/strverscmp.h,
+ lib/unistd-safer.h, lib/version-etc.h, lib/xalloc.h, lib/xreadlink.h,
+ lib/xstrtod.h, lib/xstrtol.h: Likewise.
+ * lib/filemode.h, lib/hard-locale.h, lib/memcoll.h, lib/modechange.h,
+ lib/physmem.h, lib/same.h, lib/strverscmp.h: Do not include config.h;
+ no longer needed. Anyway, config.h should always be included before any
+ other file.
+
+2003-06-11 Simon Josefsson <jas@extundo.com>
+
+ * modules/sysexits: New file.
+ * MODULES.html.sh (func_all_modules): Add sysexits.
+
+2003-06-11 Simon Josefsson <jas@extundo.com>
+
+ * lib/sysexit_.h: New file.
+
+2003-06-11 Derek Price <derek@ximbiot.com>
+
+ * lib/stat.c [LSTAT]: Compile/use slash_aware_lstat only if it is
+ necessary.
+
+2003-06-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/sysexits.m4: New file.
+
+2003-06-10 Simon Josefsson <jas@extundo.com>
+
+ * lib/argp.h: New file, from glibc.
+ * lib/argp-ba.c: New file, from glibc.
+ * lib/argp-eexst.c: New file, from glibc.
+ * lib/argp-fmtstream.c: New file, from glibc.
+ * lib/argp-fmtstream.h: New file, from glibc.
+ * lib/argp-fs-xinl.c: New file, from glibc.
+ * lib/argp-help.c: New file, from glibc.
+ * lib/argp-namefrob.h: New file, from glibc.
+ * lib/argp-parse.c: New file, from glibc.
+ * lib/argp-pv.c: New file, from glibc.
+ * lib/argp-pvh.c: New file, from glibc.
+ * lib/argp-xinl.c: New file, from glibc.
+
+2003-06-10 Simon Josefsson <jas@extundo.com>
+
+ * modules/strchrnul: New file.
+
+2003-06-10 Simon Josefsson <jas@extundo.com>
+
+ * modules/argp: New file.
+
+2003-06-10 Simon Josefsson <jas@extundo.com>
+
+ * m4/strchrnul.m4: New file.
+
+2003-06-10 Simon Josefsson <jas@extundo.com>
+
+ * lib/strchrnul.h: New file.
+ * lib/strchrnul.c: New file.
+
+2003-06-10 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (func_all_modules): Add strchrnul and argp.
+
+2003-06-07 Karl Berry <karl@gnu.org>
+
+ * config/config.{guess,sub}: update from prep.
+
+2003-06-07 Jim Meyering <jim@meyering.net>
+
+ * modules/strtod: Use $(...) notation, not @...@ for
+ AC_REPLACE'd variables.
+ * modules/localcharset: Likewise.
+
+2003-06-07 Jim Meyering <jim@meyering.net>
+
+ * lib/readtokens.h: Put `Free Software Foundation, Inc.'
+ in place of my name in the copyright comment.
+ Remove definition and uses of __P.
+
+ From coreutils.
+ * lib/stat.c: Don't declare xmalloc explicitly.
+ Instead, include "xalloc.h".
+ * lib/readtokens.c (readtokens): Remove anachronistic casts of xmalloc,
+ xrealloc, and xcalloc return values.
+ * lib/xgetcwd.c (xgetcwd): Include "xgetcwd.h".
+ Improve comment.
+ * lib/xgetcwd.h: Remove definition/uses of PARAMS.
+
+2003-06-07 Bruno Haible <bruno@clisp.org>
+
+ * modules/poll (Makefile.am): Use explicit creation rule for poll.h, to
+ avoid AC_CONFIG_LINKS.
+ * modules/fnmatch (Makefile.am): Use explicit creation rule for
+ fnmatch.h, to avoid AC_CONFIG_LINKS.
+ * modules/alloca (Makefile.am): Make creation of alloca.h Ctrl-C safe.
+
+2003-06-07 Bruno Haible <bruno@clisp.org>
+
+ * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH, gl_FUNC_FNMATCH_POSIX,
+ gl_FUNC_FNMATCH_GNU): Set FNMATCH_H instead of invoking
+ AC_CONFIG_LINKS. Needed to allow for a different name of the lib
+ directory.
+ * m4/poll.m4 (gl_FUNC_POLL): Set POLL_H instead of invoking
+ AC_CONFIG_LINKS. Needed to allow for a different name of the lib
+ directory.
+
+2003-06-06 Jim Meyering <jim@meyering.net>
+
+ Merge from coreutils.
+ * lib/same.c: (same_name): Declare *_basename locals to be `const'.
+ Consolidate declarations and initializations of *_base* locals.
+
+ Merge from coreutils.
+ This avoids a core dump on systems without GNU putenv,
+ when running `env -u SOME_ALREADY_UNSET_VARIABLE'.
+ * lib/putenv.c (__set_errno, LOCK, UNLOCK): Define.
+ (unsetenv): New static function, from GNU libc.
+ (rpl_putenv): Use it.
+
+ * lib/modechange.c: Remove trailing blanks.
+
+ Merge from coreutils.
+ * lib/fsusage.c: Remove declaration of statfs.
+ It conflicted with one from OSF/1 5.1 in <sys/mount.h>.
+
+ * lib/posixtm.c: Include <stdbool.h> unconditionally.
+
+2003-06-06 Jim Meyering <jim@meyering.net>
+
+ * lib/stdbool_.h: Renamed from stdbool.h.in.
+
+2003-06-06 Jim Meyering <jim@meyering.net>
+ Bruno Haible <bruno@clisp.org>
+
+ * modules/stdbool: Reflect renaming: stdbool.h.in -> stdbool_.h.
+ Adjust Makefile.am snippet not to redirect directly to target.
+ Use $(STDBOOL_H) notation, not @STDBOOL_H@ for AC_REPLACE'd variables.
+
+2003-06-05 Paul Eggert <eggert@twinsun.com>
+
+ * lib/mktime.c (__mktime_internal): When resolving a tm_isdst
+ mismatch, look in future quarters as well as past. This fixes a
+ bug when processing fall-backwards gaps immediately after a long
+ period of daylight-saving time.
+
+ * lib/mktime.c: Assume freestanding C89 or better.
+ (HAVE_LIMITS_H): Remove. Assume it's 1.
+ (__P): Remove; not used.
+ (CHAR_BIT, INT_MIN, INT_MAX): Remove; <limits.h> defines them.
+ (mktime, not_equal_tm, print_tm, check_result,
+ main): Use prototypes. Use const * where appropriate.
+ (main): Fix typo in testing code that uncovered by above changes.
+ (Local Variables): Remove -DHAVE_LIMITS_H from compile-command.
+
+2003-06-04 Paul Eggert <eggert@twinsun.com>
+
+ * m4/human.m4 (gl_HUMAN): Require AM_STDBOOL_H. Check for
+ locale.h, localeconv. This merges changes from coreutils.
+
+ * m4/mktime.m4 (AC_FUNC_MKTIME): New macro, taken from Autoconf CVS.
+ It can be removed after the next Autoconf is released.
+ * m4/exclude.m4 (gl_EXCLUDE): Don't check for sys/types.h; no loner
+ needed.
+
+2003-06-04 Paul Eggert <eggert@twinsun.com>
+
+ * lib/mktime.c: Fix Debian bug 177940
+ <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=177940>.
+ (localtime_offset): Now long int, not time_t, because we want it
+ to be guaranteed to be signed. All uses changed.
+ (__mktime_internal): If overflow would occur when adding offset,
+ don't add it.
+
+ Merge 'human' changes from coreutils. Rewrite to support
+ locale-specific notations like thousands separators.
+ * lib/human.c: Simplify authorship notice.
+ Include human.h immediately after config.h.
+ <sys/types.h>, <stdio.h>: Do not include; no longer needed.
+ <limits.h>: Do not include, since human.h does.
+ (SIZE_MAX, UINTMAX_MAX): New macros.
+ <strings.h>: Include if HAVE_STRINGS_H, not if !HAVE_STRING_H.
+ <locale.h>: Include if HAVE_LOCALE_H and HAVE_LOCALECONV.
+ (HUMAN_READABLE_SUFFIX_LENGTH_MAX): New macro.
+ (power_letter): Renamed from suffixes.
+ (generate_suffix_backwards): Remove.
+ (adjust_value): Now takes int style (because of human.h changes)
+ and long double value (for greater precision on some platforms).
+ (group_number): New function.
+ (human_readable): Use it. Use integer options, not enum.
+ Put the options before the sizes in the arg list.
+ Support all the new options.
+ The old human_readable function has been removed;
+ use inttostr.h instead.
+ (human_readable, default_block_size, humblock):
+ Use uintmax_t, not int, for block sizes.
+ (human_readable_inexact, block_size_types): Remove.
+ (block_size_opts): New constant.
+ (human_options): Renamed from human_block_size, with new signature
+ that allows block sizes up to UINTMAX_MAX. All callers changed.
+ * lib/human.h: Add copyright and authorship notice.
+ Include <limits.h> and <stdbool.h> unconditionally.
+ (PARAMS): Remove. All uses removed.
+ (LONGEST_HUMAN_READABLE): Add support for thousands separator.
+ (enum human_inexact_style): Remove tag; now a nameless enum.
+ (human_floor, human_ceiling, human_round_to_even): Now have
+ values 2, 0, 1 rather than -1, 1, 0.
+ (human_group_digits, human_suppress_point_zero, human_autoscale,
+ human_base_1024, human_SI, human_B): New constants.
+ (human_readable_inexact, human_block_size): Remove.
+ (human_readable): Size args are now uintmax_t, not int.
+ (human_options): New decl.
+
+ * lib/exclude.c: (new_exclude, add_exclude): Remove casts that are
+ unnecessary now that we assume C89 or better. This change
+ imported from coreutils.
+
+ * lib/mktime.c (__mktime_internal): Do not reject negative timestamps
+ arbitrarily. This is the same patch as 2003-05-28, but it got lost
+ in the 2003-05-30 sync from glibc.
+
+ .h files should stand alone, but we shouldn't include <sys/types.h>
+ if we can get away with just <stddef.h>.
+
+ * lib/__fpending.h, addext.c, backupfile.c, exclude.c, getline.c,
+ malloc.c, putenv.c, realloc.c, strcasecmp.c: Include <stddef.h>
+ rather than <sys/types.h>, as we merely need size_t.
+ * lib/dirname.h, memcoll.h, xalloc.h, xmemcoll.h: Include <stddef.h>,
+ to get size_t.
+ * lib/hash.h, linebuffer.h, readtokens.h, stdio-safer.h, version-etc.h:
+ Include <stdio.h>, to get FILE.
+ * lib/memcasecmp.c: Don't include <sys/types.h>, as we can assume
+ memcasecmp.h has included <stddef.h> and all we need is size_t.
+ * lib/memcoll.c: Include "memcoll.h", which gets us size_t and checks
+ our interface, instead of including <sys/types.h>
+
+2003-06-04 Paul Eggert <eggert@twinsun.com>
+
+ * config/srclist.txt ($LIBCSRC/time/mktime.c lib gpl): Comment out for
+ now, as glibc mktime is buggy on non-glibc systems.
+
+2003-06-03 Karl Berry <karl@gnu.org>
+
+ * config/config.sub: update from prep.
+
+2003-06-02 Paul Eggert <eggert@twinsun.com>
+
+ [from coreutils]
+ Fix some minor time-related bugs with POSIX time arguments.
+ Some valid time stamps were being rejected (notably -1, and
+ time stamps before 1900 on 64-bit hosts). And some invalid
+ time stamps were being accepted, e.g. September 31.
+
+ * lib/posixtm.h (posixtime): Return bool instead of time_t, so
+ that we can return (time_t) -1 successfully.
+ * lib/posixtm.c: Likewise.
+ [HAVE_STDBOOL_H]: Include <stdbool.h>.
+ (bool, false, true) [!HAVE_STDBOOL_H]: New type.
+ (t): Remove static var.
+ (year, posix_time_parse): Now takes struct tm * arg to modify, instead
+ of static var. All uses changed.
+ (year): Do not reject years before 1900; they can occur with
+ 64-bit time_t.
+ (posix_time_parse): Do not check for out-of-range components;
+ that is now the caller's responsibility, since our checks were
+ only approximations.
+ (posixtime): Use mktime to check for out-of-range components,
+ since it knows them exactly.
+ If mktime returns (time_t) -1, check whether an error actually occurred
+ by invoking localtime on -1.
+ (main) [TEST_POSIXTIME]: Check for input data errors, and report
+ posixtime failures better.
+ Improve the test data (in comments only).
+
+2003-06-02 Karl Berry <karl@gnu.org>
+
+ * config/mkinstalldirs (version): new variable.
+ (--version): new option.
+ (usage): improve message.
+
+2003-05-30 Karl Berry <karl@gnu.org>
+
+ * lib/mktime.c: update from libc.
+
+2003-05-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/gettext: Add files m4/nls.m4 and m4/po.m4.
+ * config/config.rpath: Upgrade to gettext-0.12.1.
+
+2003-05-30 Bruno Haible <bruno@clisp.org>
+
+ * m4/gettext.m4: Upgrade to gettext-0.12.1.
+ * m4/nls.m4: New file, from gettext-0.12.1.
+ * m4/po.m4: New file, from gettext-0.12.1.
+ * m4/progtest.m4: Upgrade to gettext-0.12.1.
+
+2003-05-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/config.charset: Upgrade to gettext-0.12.1 and libiconv-1.9.1.
+ * lib/localcharset.h: Likewise.
+ * lib/localcharset.c: Likewise.
+
+2003-05-29 Karl Berry <karl@gnu.org>
+
+ * config/config.rpath: update from gettext.
+
+2003-05-28 Paul Eggert <eggert@twinsun.com>
+
+ Assume the headers required for C89 freestanding compilers.
+ * m4/backupfile.m4 (gl_BACKUPFILE): Don't check for limits.h.
+ * m4/fsusage.m4 (gl_PREREQ_FSUSAGE_EXTRA): Likewise.
+ * m4/human.m4 (gl_HUMAN): Likewise.
+ * m4/pathmax.m4 (gl_PATHMAX): Likewise.
+ * m4/rpmatch.m4 (gl_FUNC_RPMATCH): Likewise.
+ * m4/userspec.m4 (gl_USERSPEC): Likewise.
+ * m4/xreadlink.m4 (gl_XREADLINK): Likewise.
+ * m4/xstrtol.m4 (gl_PREREQ_XSTRTOL): Likewise.
+ * m4/quote.m4 (gl_QUOTE): Don't check for stddef.h.
+
+2003-05-28 Paul Eggert <eggert@twinsun.com>
+
+ Assume the headers required for C89 freestanding compilers.
+ * lib/addext.c, lib/backupfile.c, lib/fsusage.c, lib/human.c,
+ lib/pathmax.h, lib/rpmatch.c, lib/userspec.c, lib/xreadlink.c,
+ lib/xstrtol.c: Include <limits.h> without checking for HAVE_LIMITS_H.
+ * lib/backupfile.c, lib/fsusage.c, lib/hash.c, lib/human.c,
+ lib/safe-read.c, lib/userspec.c, lib/xstrtol.c (CHAR_BIT): Don't
+ define, since <limits.h> is guaranteed to do that.
+ * lib/fatal.c: Include <stdarg.h> without checking for __STDC__.
+ * lib/exclude.c: Include <stdbool.h> unconditionally.
+ * lib/tempname.c: Include <stddef.h> unconditionally.
+ * lib/hash.c: Include <limits.h>, since we no longer define CHAR_BIT.
+ * lib/modechange.c, rpmatch.c (NULL): Don't define, since
+ <stddef.h> does that.
+ * lib/quote.c: Dont include <stddef.h> or <sys/types.h>; not needed.
+ * lib/safe-read.c (INT_MAX): Don't define, since <limits.h> does that.
+ * lib/safe-read.c (TYPE_MINIMUM, TYPE_MAXIMUM): Remove; no longer
+ needed.
+ * lib/xstrtol.c: Likewise.
+ * lib/safe-read.c: Remove TYPE_SIGNED; no longer needed.
+ * lib/savedir.c: Include <stddef.h> instead of defining NULL.
+
+ * lib/addext.c (addext): Use assignment rather than cast, to avoid
+ warnings on some platforms.
+
+ * lib/mktime.c (__mktime_internal): Do not reject negative timestamps
+ arbitrarily.
+
+2003-05-26 Jim Meyering <jim@meyering.net>
+
+ Merge in a change from coreutils:
+ * m4/dirfd.m4 (UTILS_FUNC_DIRFD): Test the cache variable, not one
+ that is guaranteed to be `no'. Use `no_such_member' to indicate
+ that condition, rather than `-1' which is slightly misleading.
+ Change the name of the cache variable to have the gl_ prefix.
+ Prompted by a patch from Richard Dawe for DJGPP.
+
+2003-05-24 Karl Berry <karl@gnu.org>
+
+ * config/config.guess: update from prep.
+
+2003-05-22 Karl Berry <karl@gnu.org>
+
+ * gnulib-tool (func_usage): =LIBRARY not =libRARY in help msg.
+
+2003-05-20 Karl Berry <karl@gnu.org>
+
+ * config/config.guess: update from prep.
+
+2003-05-18 Karl Berry <karl@gnu.org>
+
+ * config/srclistvars.sh (TEXMF): use TEXMFROOT instead, since TEXMF
+ might actually be set by the user.
+
+ * config/depcomp, install-sh, mdate-sh: update from automake.
+
+2003-05-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/dirfd.m4 (UTILS_FUNC_DIRFD): Fix a quoting bug leading to an
+ invalid expansion for AC_EGREP_CPP.
+ * m4/strtoimax.m4 (gl_FUNC_STRTOIMAX): Likewise.
+ * m4/strtoumax.m4 (gl_FUNC_STRTOUMAX): Likewise.
+ Suggested by Akim Demaille <akim@epita.fr> in
+ http://mail.gnu.org/archive/html/bug-autoconf/2003-05/threads.html
+
+2003-05-12 Jim Meyering <jim@meyering.net>
+
+ * lib/strftime.c (my_strftime): Let the `-' (no-pad) flag affect
+ the space-padded-by-default conversion specifiers, %e, %k, %l.
+
+2003-05-12 Bruno Haible <bruno@clisp.org>
+
+ * lib/linebreak.c (iconv_string_length): Don't return -1 just because
+ the string is longer than 4 KB.
+
+2003-05-11 Karl Berry <karl@gnu.org>
+
+ * config/config.{guess,sub}: update from prep.
+
+2003-05-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/error: Add m4/strerror_r.m4 to file list.
+
+2003-05-03 Bruno Haible <bruno@clisp.org>
+
+ Upgrade to Unicode-4.0.
+ * lib/linebreak.c (nonspacing_table_data): Change width of U+00AD,
+ U+0350..U+0357, U+035D..U+035F, U+0600..U+0603, U+0610..U+0615,
+ U+0656..U+0658, U+0A01, U+0AE2..U+0AE3, U+0CBC, U+17B4..U+17B5,
+ U+17DD, U+1920..U+1922, U+1927..U+192B, U+1932, U+1939..U+193B
+ from 1 to 0. Change width of U+0CBF, U+0CC6, U+180E from 0 to 1.
+ (uc_width): Change width of U+4DC0..U+4DFF from 2 to 1. Change width
+ of U+2A6D7..U+2F7FF, U+2FA1E..U+2FFFD, U+30000..U+3FFFD from 1 to 2.
+ Change width of U+E0100..U+E01EF from 1 to 0.
+
+2003-04-25 Jim Meyering <jim@meyering.net>
+
+ * lib/copy-file.c (copy_file_preserving): Declare buf_size to be
+ of type size_t, not int.
+
+2003-04-25 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-file.c: Include <stddef.h>, for size_t.
+
+2003-04-21 Paul Eggert <eggert@twinsun.com>
+
+ * m4/error.m4 (gl_ERROR): Do not put under dynamic conditions some
+ code which expansion is under static control. Patch imported from
+ Akim Demaille's patch to Bison; see
+ <http://mail.gnu.org/archive/html/bison-patches/2003-03/msg00057.html>.
+
+2003-04-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/error.m4 (jm_PREREQ_ERROR): Use AC_FUNC_VPRINTF.
+
+2003-04-11 Jim Meyering <jim@meyering.net>
+
+ Merge changes from Coreutils.
+
+ 2003-03-22 Jim Meyering <jim@meyering.net>
+
+ * lib/strftime.c (widen): Cast alloca return value to proper type.
+
+ 2003-01-19 Ulrich Drepper <drepper@redhat.com>
+
+ From GNU libc.
+ * lib/strftime.c (my_strftime): Handle very large width
+ specifications for numeric values correctly. Improve checks for
+ overflow.
+
+ 2003-01-19 Jim Meyering <jim@meyering.net>
+
+ * lib/strftime.c (widen) [COMPILE_WIDE]: Merge nearly-identical
+ definitions.
+ (nl_get_alt_digit) [! defined my_strftime]: Define.
+ (my_strftime) [_NL_CURRENT]: Merge nearly-identical uses of
+ _nl_get_alt_digit and _nl_get_walt_digit.
+
+ * lib/strftime.c (my_strftime): Merge in locale-related changes from
+ libc. These changes have no effect outside of _LIBC.
+
+2003-04-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/findprog: New file.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-04-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/findprog.m4: New file.
+ * m4/eaccess.m4: New file.
+
+2003-04-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/findprog.h: New file, from GNU gettext.
+ * lib/findprog.c: New file, from GNU gettext.
+
+2003-04-05 Jim Meyering <jim@meyering.net>
+
+ Merge changes from Coreutils.
+
+ * lib/exclude.h (PARAMS): Remove definition and uses.
+ * lib/exclude.c: Remove uses of `PARAMS'.
+
+ * lib/dirname.c [TEST_DIRNAME]: Update build instructions for test.
+ Add test-cases for DOS filenames. Declare program_name.
+ (main): Set up program_name. Patch by Rich Dawe.
+
+ * lib/mountlist.c (read_filesystem_list) [MOUNTED_VMOUNT]: Detect any
+ error from mntctl.
+ Use mntctl's return value to drive the entry-processing loop, since
+ we can't rely on the value of the vmt_length member in the last
+ entry. On some systems doing so could result in exhausting
+ virtual memory. Based in part on a patch from Mike Jetzer.
+
+2003-04-04 Bruno Haible <bruno@clisp.org>
+
+ * modules/linebreak: New file.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-04-04 Bruno Haible <bruno@clisp.org>
+
+ * m4/linebreak.m4: New file.
+
+2003-04-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/linebreak.h: New file, from GNU gettext.
+ * lib/linebreak.c: New file, from GNU gettext with slight
+ modifications.
+ * lib/lbrkprop.h: New file, from GNU gettext.
+
+2003-04-03 Bruno Haible <bruno@clisp.org>
+
+ * modules/utf8-ucs4: New file.
+ * modules/utf16-ucs4: New file.
+ * modules/ucs4-utf8: New file.
+ * modules/ucs4-utf16: New file.
+ * MODULES.html.sh (func_all_modules): Add them.
+
+2003-04-03 Bruno Haible <bruno@clisp.org>
+
+ * m4/utf-ucs4.m4: New file.
+ * m4/ucs4-utf.m4: New file.
+
+2003-04-03 Bruno Haible <bruno@clisp.org>
+
+ * lib/utf8-ucs4.h: New file, from GNU gettext.
+ * lib/utf16-ucs4.h: New file, from GNU gettext.
+ * lib/ucs4-utf8.h: New file, from GNU gettext.
+ * lib/ucs4-utf16.h: New file, from GNU gettext.
+
+2003-04-02 Bruno Haible <bruno@clisp.org>
+
+ * modules/binary-io: New file.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-04-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/binary-io.h: New file, from GNU gettext.
+
+2003-04-01 Bruno Haible <bruno@clisp.org>
+
+ * modules/pathname: New file.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-04-01 Bruno Haible <bruno@clisp.org>
+
+ * lib/pathname.h: New file, from GNU gettext.
+ * lib/concatpath.c: New file, from GNU gettext.
+
+2003-03-30 Bruno Haible <bruno@clisp.org>
+
+ * m4/copy-file.m4 (gl_COPY_FILE): Add check for chown().
+
+2003-03-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-file.c (copy_file_preserving): Don't set owner if the
+ function chown() doesn't exist.
+
+2003-03-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/copy-file: New file.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-03-28 Bruno Haible <bruno@clisp.org>
+
+ * m4/copy-file.m4: New file.
+
+2003-03-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/copy-file.h: New file, from GNU gettext.
+ * lib/copy-file.c: New file, from GNU gettext.
+
+2003-03-18 Jim Meyering <jim@meyering.net>
+
+ * lib/quote.c (quote_n): Fix typo in comment.
+
+2003-03-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/onceonly.m4: Use m4_defn instead of defn, for better error
+ checking.
+ * m4/onceonly_2_57.m4: Likewise.
+
+2003-03-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/onceonly.m4: Require autoconf 2.54 or newer.
+ (m4_quote): Remove macro.
+ * m4/onceonly_2_57.m4: Require autoconf 2.54 or newer.
+
+2003-03-14 Jim Meyering <jim@meyering.net>
+
+ Merge changes from Coreutils.
+ * lib/obstack.h (obstack_object_size): Declare temporary, __o,
+ to be const, in order to avoid warnings.
+ (obstack_room): Likewise.
+ (obstack_empty_p): Likewise.
+
+2003-03-14 Bruno Haible <bruno@clisp.org>
+
+ * m4/onceonly_2_57.m4 (AC_CHECK_HEADERS_ONCE, AC_CHECK_FUNCS_ONCE,
+ AC_CHECK_DECLS_ONCE): Quote AC_FOREACH variable-expansions properly.
+
+2003-03-13 Paul Eggert <eggert@twinsun.com>
+
+ Merge changes from Bison.
+ * lib/obstack.h: (__INT_TO_PTR) [__STDC__]: Cast result to
+ (void *) to avoid diagnostic with native c89 on SGI IRIX 6.5
+ when compiling Bison 1.875's `bitset bset = obstack_alloc
+ (bobstack, bytes);'. Problem reported by Nelson H. F. Beebe.
+ * lib/hash.c: Include <stdbool.h> unconditionally.
+
+2003-03-13 Paul Eggert <eggert@twinsun.com>
+
+ * m4/onceonly.m4 (m4_quote): New macro.
+ (AC_CHECK_HEADERS_ONCE, AC_CHECK_FUNCS_ONCE, AC_CHECK_DECLS_ONCE):
+ Quote AC_FOREACH variable-expansions properly.
+
+2003-03-13 Paul Eggert <eggert@twinsun.com>
+
+ * doc/COPYING.DOC, fdl.texi: Sync with latest FSF version.
+
+2003-03-09 Paul Eggert <eggert@twinsun.com>
+
+ * lib/argmatch.c (EXIT_FAILURE): Define if the system doesn't.
+ Reported by Bruce Becker; see:
+ http://mail.gnu.org/archive/html/bug-bison/2003-03/msg00017.html
+
+2003-03-03 Paul Eggert <eggert@twinsun.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/mbswidth.h: Include <wchar.h>. Needed for UnixWare 7.1.1.
+ Reported by John Hughes, see
+ http://mail.gnu.org/archive/html/bug-bison/2003-02/msg00030.html
+
+2003-02-20 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (func_all_modules): Add poll.
+
+2003-02-19 Paolo Bonzini <bonzini@gnu.org>
+
+ * modules/poll: New file.
+
+2003-02-19 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/poll_.h: New file.
+ * lib/poll.c: New file.
+
+2003-02-19 Paolo Bonzini <bonzini@gnu.org>
+
+ * m4/poll.m4: New file.
+
+2003-02-18 Paolo Bonzini <bonzini@gnu.org>
+
+ * modules/mathl: New file.
+
+2003-02-18 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/mathl.h: New file.
+ * lib/acosl.c: New file.
+ * lib/asinl.c: New file.
+ * lib/atanl.c: New file.
+ * lib/ceill.c: New file.
+ * lib/cosl.c: New file.
+ * lib/expl.c: New file.
+ * lib/floorl.c: New file.
+ * lib/frexpl.c: New file.
+ * lib/ldexpl.c: New file.
+ * lib/logl.c: New file.
+ * lib/sincosl.c: New file.
+ * lib/sinl.c: New file.
+ * lib/sqrtl.c: New file.
+ * lib/tanl.c: New file.
+ * lib/trigl.c: New file.
+ * lib/trigl.h: New file.
+
+2003-02-18 Paolo Bonzini <bonzini@gnu.org>
+
+ * m4/mathl.m4: New file.
+
+2003-02-18 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh (func_all_modules): Add mathl.
+
+2003-02-17 Bruno Haible <bruno@clisp.org>
+
+ * modules/mkdtemp: New module.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-02-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/mkdtemp.m4: New file, from GNU gettext with modifications.
+
+2003-02-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/mkdtemp.h: New file, from GNU gettext.
+ * lib/mkdtemp.c: New file, from GNU gettext.
+
+2003-02-02 Jim Meyering <jim@meyering.net>
+
+ * m4/regex.m4 (jm_INCLUDED_REGEX): Detect broken re_search in
+ e.g. glibc-2.2.93.
+
+2003-01-31 Bruno Haible <bruno@clisp.org>
+
+ * m4/rename.m4 (vb_FUNC_RENAME): Add a redirection from 'rename' to
+ 'rpl_rename'.
+ * m4/strnlen.m4 (gl_FUNC_STRNLEN): Add a redirection from 'strnlen' to
+ 'rpl_strnlen'.
+ * m4/strtod.m4 (gl_FUNC_STRTOD): Add a redirection from 'strtod' to
+ 'rpl_strtod'.
+ * m4/utime.m4 (jm_FUNC_UTIME): Add a redirection from 'utime' to
+ 'rpl_utime'.
+
+2003-01-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/rename.c: #undef rename before defining rpl_rename.
+ * lib/strnlen.c: #undef strnlen, define rpl_strnlen instead of strnlen.
+
+2003-01-30 Bruno Haible <bruno@clisp.org>
+
+ * modules/vasnprintf, modules/vasprintf: New modules.
+ * MODULES.html.sh (func_all_modules): Add them.
+
+2003-01-30 Bruno Haible <bruno@clisp.org>
+
+ * m4/signed.m4: New file, from GNU gettext.
+ * m4/longdouble.m4: New file, from GNU gettext.
+ * m4/wchar_t.m4: New file, from GNU gettext.
+ * m4/wint_t.m4: New file, from GNU gettext.
+ * m4/vasnprintf.m4: New file.
+ * m4/vasprintf.m4: New file.
+
+2003-01-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/printf-args.h: New file, from GNU gettext.
+ * lib/printf-args.c: New file, from GNU gettext.
+ * lib/printf-parse.h: New file, from GNU gettext.
+ * lib/printf-parse.c: New file, from GNU gettext.
+ * lib/vasnprintf.h: New file, from GNU gettext.
+ * lib/vasnprintf.c: New file, from GNU gettext.
+ * lib/asnprintf.c: New file, from GNU gettext.
+ * lib/vasprintf.h: New file, from GNU gettext with modifications.
+ * lib/vasprintf.c: New file, from GNU gettext.
+ * lib/asprintf.c: New file, from GNU gettext.
+
+2003-01-29 Bruno Haible <bruno@clisp.org>
+
+ * modules/stpncpy: New module.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-01-29 Bruno Haible <bruno@clisp.org>
+
+ * m4/stpncpy.m4: New file.
+
+2003-01-29 Bruno Haible <bruno@clisp.org>
+
+ * lib/stpncpy.h: New file, from GNU gettext with modifications.
+ * lib/stpncpy.c: New file, from GNU gettext with modifications.
+
+2003-01-28 Bruno Haible <bruno@clisp.org>
+
+ * modules/c-ctype: New module.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-01-28 Bruno Haible <bruno@clisp.org>
+
+ * lib/c-ctype.h: New file, from GNU gettext, with changes suggested by
+ Paul Eggert.
+ * lib/c-ctype.c: New file, from GNU gettext, with changes suggested by
+ Paul Eggert.
+
+2003-01-27 Bruno Haible <bruno@clisp.org>
+
+ * modules/xsetenv: New module.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-01-27 Bruno Haible <bruno@clisp.org>
+
+ * lib/xsetenv.h: New file, from GNU gettext.
+ * lib/xsetenv.c: New file, from GNU gettext.
+
+2003-01-23 Jim Meyering <jim@meyering.net>
+
+ * m4/dirfd.m4 (UTILS_FUNC_DIRFD): Correct typo: s/-1/no/ that kept this
+ from working on systems without dirfd (at least Irix and OSF1/Tru64).
+
+2003-01-23 Bruno Haible <bruno@clisp.org>
+
+ * modules/minmax: New module.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-01-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/minmax.h: New file, from GNU gettext, with comments from Paul
+ Eggert.
+
+2003-01-22 Bruno Haible <bruno@clisp.org>
+
+ * modules/exit: New module.
+ * MODULES.html.sh (func_all_modules): Add it.
+
+2003-01-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/exit.h: New file, from GNU gettext.
+
+2003-01-19 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool: Recognize option --extract-maintainer.
+ (func_get_maintainer): New function.
+ * modules/*: Add Maintainer entry.
+
+2003-01-16 Jim Meyering <jim@meyering.net>
+
+ * m4/regex.m4: The `regex' struct is both input and output.
+ Initialize it before each use. Patch by Tim Waugh.
+
+2003-01-16 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh: Add a table of contents. Add the module name as
+ leftmost column. Add hyperlinks.
+
+2003-01-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/md5.m4 (gl_MD5): Require AC_C_INLINE.
+
+2003-01-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/longlong.m4 (jm_AC_TYPE_LONG_LONG): Also test the LL suffix.
+ * m4/ulonglong.m4 (jm_AC_TYPE_UNSIGNED_LONG_LONG): Also test the ULL
+ suffix.
+
+2003-01-15 Bruno Haible <bruno@clisp.org>
+
+ * m4/alloca.m4 (gl_FUNC_ALLOCA): Invoke AC_EGREP_CPP prerequisites.
+
+2003-01-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/stpcpy.h (stpcpy): Use ANSI C function declarations.
+ * lib/strcase.h (strcasecmp, strncasecmp): Likewise.
+
+2003-01-14 Jim Meyering <jim@meyering.net>
+
+ * lib/same.c (same_name): Tweak a comment.
+
+2003-01-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/same.c (same_name): Reorder tests so as to avoid calling stat()
+ when a string comparison is sufficient.
+
+2003-01-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/readtokens.c (readtoken): Cast character to 'unsigned char', not
+ 'unsigned int'.
+
+2003-01-14 Bruno Haible <bruno@clisp.org>
+
+ * lib/hash-pjw.c: Add comment about low quality of this function.
+
+2003-01-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/stpcpy: Distribute lib/stpcpy.h.
+ * modules/setenv: Depend on alloca. Distribute lib/setenv.h.
+
+2003-01-13 Bruno Haible <bruno@clisp.org>
+
+ * modules/*: Add a description.
+ * modules/strpbrk: Fix Makefile.am snippet.
+ * modules/strtoimax: Fix dependencies.
+ * modules/strtoumax: Likewise.
+
+2003-01-13 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Substitute lib_OBJECTS.
+ * modules/alloca (Makefile.am): All object files depend on alloca.h.
+ * modules/stdbool (Makefile.am): All object files depend on stdbool.h.
+
+2003-01-13 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_create_testdir): Store config/* files in the main
+ directory.
+ * config.rpath: Move to ...
+ * config/config.rpath: ... here.
+ * modules/gettext: Contains config/config.rpath, not config.rpath.
+ * modules/iconv: Likewise.
+
+2003-01-12 Paul Eggert <eggert@twinsun.com>
+
+ Finish renaming getstr -> getdelim2 and readline -> readlinebuffer,
+ to avoid collisions with libcurses and libreadline.
+
+ * m4/getstr.m4: Remove.
+ * m4/getline.m4 (gl_PREREQ_GETLINE): Require AC_HEADER_STDC.
+
+2003-01-12 Paul Eggert <eggert@twinsun.com>
+
+ Finish renaming getstr -> getdelim2 and readline -> readlinebuffer,
+ to avoid collisions with libcurses and libreadline.
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Remove getstr.c, getstr.h.
+ * lib/getstr.h, getstr.c: Remove.
+ * lib/getline.c: Include "getline.h", to check interface.
+ Move body of old getstr.c here: this defines MIN_CHUNK and
+ declares getdelim2, which is renamed from getstr.
+ (getline, getdelim): Adjust to renaming of getstr -> getdelim2.
+
+ * lib/linebuffer.c (readlinebuffer): Renamed from readline.
+ All uses changed.
+ * lib/linebuffer.h: Likewise.
+ (readline): Remove backward-compatibility macro.
+
+2003-01-12 Paul Eggert <eggert@twinsun.com>
+
+ Finish renaming getstr -> getdelim2 and readline -> readlinebuffer,
+ to avoid collisions with libcurses and libreadline.
+ * getstr: Remove.
+ * MODULES.html.sh: Remove getstr.
+ * modules/getline: Depend on unlocked-io, not getstr.
+
+2003-01-12 Jim Meyering <jim@meyering.net>
+
+ * lib/makepath.c: Don't test HAVE_ERRNO_H. It's not necessary.
+
+2003-01-10 Bruno Haible <bruno@clisp.org>
+
+ * modules/alloca: Change Makefile.am requirements. Simplify Include
+ requirements. Add lib/alloca_.h to file list.
+
+2003-01-10 Bruno Haible <bruno@clisp.org>
+
+ * m4/alloca.m4 (gl_FUNC_ALLOCA): Also define ALLOCA_H.
+
+2003-01-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/alloca_.h: New file.
+ * lib/getdate.y: Unconditionally include alloca.h.
+ * lib/makepath.c: Likewise.
+ * lib/setenv.c: Likewise.
+ * lib/userspec.c: Likewise.
+
+2003-01-09 Karl Berry <karl@gnu.org>
+
+ * MODULES.html.sh: include `dirname $0` in PATH, to find
+ gnulib-tool.
+
+2003-01-09 Bruno Haible <bruno@clisp.org>
+
+ * modules/stdbool: Change configure.ac, Makefile.am requirements.
+ Simplify Include requirements. Add lib/stdbool.h.in to file list.
+
+2003-01-09 Bruno Haible <bruno@clisp.org>
+
+ * m4/stdbool.m4 (AM_STDBOOL_H): New macro.
+
+2003-01-09 Bruno Haible <bruno@clisp.org>
+
+ * lib/stdbool.h.in: New file.
+
+2003-01-09 Bruno Haible <bruno@clisp.org>
+
+ * gnulib-tool (func_all_modules): Ignore files ending in ~.
+ * MODULES.html.sh: Likewise.
+
+2003-01-08 Jim Meyering <jim@meyering.net>
+
+ * lib/full-write.c: Undefine and define-away `const' after inclusion
+ of errno.h, not before. Suggestion from Bruno Haible.
+
+2003-01-08 Bruno Haible <bruno@clisp.org>
+
+ * modules/full-read: Depend on full-write.
+
+2003-01-08 Bruno Haible <bruno@clisp.org>
+
+ * lib/safe-read.c: Include specification header first, to ensure its
+ selfcontainedness.
+ * lib/full-write.c: Likewise.
+
+2003-01-07 Jim Meyering <jim@meyering.net>
+
+ * lib/full-write.c: Rework so that it may serve to define full_read,
+ too.
+ * lib/full-read.c: Simply #define FULL_READ and include full-write.c.
+
+2003-01-07 Bruno Haible <bruno@clisp.org>
+
+ * lib/strtoimax.c: Include <stdint.h> as an alternative to
+ <inttypes.h>.
+ * lib/xstrtol.h: Likewise.
+ * lib/xstrtoimax.c: Likewise.
+ * lib/xstrtoumax.c: Likewise.
+ * lib/human.h: Likewise.
+
+ * lib/tempname.c: Include <inttypes.h> too. Avoids a compilation error
+ on systems that have <inttypes.h> but not <stdint.h>.
+
+2003-01-07 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.html.sh: Add copyright notice.
+ (missed_files): Omit CVS directory entries.
+ (func_module): Make it work with sed-3.02.
+ * MODULES.txt: Remove file.
+
+2003-01-06 Jim Meyering <jim@meyering.net>
+
+ * lib/version-etc.c: Update year in translatable copyright string.
+
+2003-01-03 Karl Berry <karl@gnu.org>
+
+ * config/config.{guess,sub}: update from prep.
+
+2003-01-02 Karl Berry <karl@gnu.org>
+
+ * doc/COPYING.DOC: belatedly updated to 1.2.
+
+2003-01-01 Karl Berry <karl@gnu.org>
+
+ * gnulib-tool (func_verify_module): report module name $module in
+ error message, not $1.
+ * gnulib-tool (create-testdir): don't complain if destdir couldn't
+ be created, only if it doesn't exist.
+ * gnulib-tool (last_checkin_date): don't expand the $Date here.
+
+2002-12-31 Paul Eggert <eggert@twinsun.com>
+
+ * m4/memcoll.m4 (gl_MEMCOLL): Require AC_FUNC_MEMCMP.
+
+2002-12-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/memcoll.c (memcoll): Fall back on a simple algorithm using
+ memcmp if strcoll doesn't work.
+
+2002-12-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/utime.c (utime_null): No need to call ftruncate if the file was
+ nonempty.
+
+2002-12-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/memcoll.c (STRCOLL): New macro.
+ (memcoll): Use it.
+
+2002-12-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.h: New file.
+ * lib/localcharset.c: Include it.
+ * lib/unicodeio.c: Likewise.
+
+2002-12-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/getstr.h (getstr): Define, to avoid clash with libcurses.
+ * lib/linebuffer.h (readline): Define, to avoid clash with libreadline.
+
+2002-12-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/getline.h: Include <stddef.h>, for size_t.
+
+ * lib/unicodeio.h: Include <stddef.h>, for size_t.
+ * lib/unicodeio.c: Don't include <stddef.h>.
+
+2002-12-31 Bruno Haible <bruno@clisp.org>
+
+ * lib/getdate.y (get_date): Test HAVE_STRUCT_TM_TM_ZONE, not
+ HAVE_TM_ZONE.
+
+2002-12-24 Karl Berry <karl@gnu.org>
+
+ * config/config.guess: update from prep.
+
+2002-12-24 Bruno Haible <bruno@clisp.org>
+
+ General infrasructure.
+ * m4/README: Rewritten.
+ * m4/onceonly.m4: New file.
+ * m4/onceonly_2_57.m4: New file.
+
+ Module atexit.
+ * m4/atexit.m4: New file.
+
+ Module strtod.
+ * m4/strtod.m4: New file.
+
+ Module strtol.
+ * m4/strtol.m4: New file.
+
+ Module strtoul.
+ * m4/strtoul.m4: New file.
+
+ Module memchr.
+ * m4/memchr.m4: New file.
+
+ Module memcmp.
+ * m4/memcmp.m4 (gl_PREREQ_MEMCMP): New macro.
+ (jm_FUNC_MEMCMP): Invoke it.
+
+ Module memcpy.
+ * m4/memcpy.m4: New file.
+
+ Module memmove.
+ * m4/memmove.m4: New file.
+
+ Module memset.
+ * m4/memset.m4: New file.
+
+ Module strcspn.
+ * m4/strcspn.m4: New file.
+
+ Module strpbrk.
+ * m4/strpbrk.m4: New file.
+
+ Module strstr.
+ * m4/strstr.m4: New file.
+
+ Module strerror.
+ * m4/strerror.m4: New file.
+
+ Module mktime.
+ * m4/mktime.m4: Renamed from jm-mktime.m4.
+ (gl_PREREQ_MKTIME): New macro.
+ (gl_FUNC_MKTIME): Renamed from jm_FUNC_MKTIME. Invoke gl_PREREQ_MKTIME.
+
+ Module malloc.
+ * m4/malloc.m4 (gl_PREREQ_MALLOC): New macro.
+ (jm_FUNC_MALLOC): Use AC_FUNC_MALLOC. Invoke gl_PREREQ_MALLOC.
+ Don't define HAVE_DONE_WORKING_MALLOC_CHECK, since nothing uses it.
+
+ Module realloc.
+ * m4/realloc.m4 (gl_PREREQ_REALLOC): New macro.
+ (jm_FUNC_REALLOC): Use AC_FUNC_REALLOC. Invoke gl_PREREQ_REALLOC.
+ Don't define HAVE_DONE_WORKING_REALLOC_CHECK, since nothing uses it.
+
+ Module strftime.
+ * m4/tm_gmtoff.m4: New file, extracted from strftime.m4.
+ * m4/strftime.m4 (_jm_STRFTIME_PREREQS): Use AC_FUNC_STRFTIME.
+ Don't test for bcopy (we are not emacs). Invoke AC_TYPE_MBSTATE_T and
+ gl_TM_GMTOFF.
+ (_jm_STRFTIME_PREREQS, jm_FUNC_GNU_STRFTIME): Use onceonly macros.
+
+ Module xalloc.
+ * m4/xalloc.m4: New file.
+
+ Module alloca.
+ * m4/alloca.m4: New file.
+
+ Module putenv.
+ * m4/putenv.m4 (gl_PREREQ_PUTENV): New macro.
+ (jm_FUNC_PUTENV): Invoke it.
+
+ Module setenv.
+ * m4/setenv.m4 (gt_FUNC_SETENV): New macro.
+ (gt_CHECK_VAR_DECL): Fix quoting error that led to infinite loop in m4
+ when invoked twice.
+ (gt_PREREQ_SETENV, gt_PREREQ_UNSETENV): New macros, replacing old
+ gt_FUNC_SETENV.
+
+ Module memrchr.
+ * m4/memrchr.m4: New file.
+
+ Module stpcpy.
+ * m4/stpcpy.m4: New file.
+
+ Module strcase.
+ * m4/strcase.m4: New file.
+
+ Module strdup.
+ * m4/strdup.m4: New file.
+
+ Module strnlen.
+ * m4/strnlen.m4: New file.
+
+ Module strndup.
+ * m4/strndup.m4: New file.
+
+ Module xstrtod.
+ * m4/xstrtod.m4: New file.
+
+ Module xstrtol.
+ * m4/xstrtol.m4: New file.
+
+ Module getdate.
+ * m4/getdate.m4: New file.
+
+ Module unlocked-io.
+ * m4/unlocked-io.m4: Renamed from jm-glibc-io.m4.
+ (jm_FUNC_GLIBC_UNLOCKED_IO): Invoke AC_GNU_SOURCE. Use onceonly macros.
+ * m4/jm-glibc-io.m4n: Remove file.
+
+ Module long-options.
+ * m4/long-options.m4: New file.
+
+ Module md5.
+ * m4/md5.m4: New file.
+
+ Module sha.
+ * m4/sha.m4: New file.
+
+ Module getstr.
+ * m4/getstr.m4: New file.
+
+ Module getline.
+ * m4/getline.m4 (gl_PREREQ_GETLINE): New macro.
+ (AM_FUNC_GETLINE): Invoke AC_GNU_SOURCE. Use <stdlib.h>, not
+ <sys/types.h>, for size_t. Use the function name gnu_getline, not
+ simply getline. Infoke gl_PREREQ_GETLINE.
+
+ Module obstack.
+ * m4/obstack.m4: New file.
+
+ Module hash.
+ * m4/hash.m4: New file.
+
+ Module readtokens.
+ * m4/readtokens.m4: New file.
+
+ Module strverscmp.
+ * m4/strverscmp.m4: New file.
+
+ Module stdbool.
+ * m4/stdbool.m4 (AC_HEADER_STDBOOL): Add test for _Bool. Needed for
+ OSF/1.
+
+ Module strtoll.
+ * m4/strtoll.m4: New file.
+
+ Module strtoull.
+ * m4/strtoull.m4: New file.
+
+ Module strtoimax.
+ * m4/strtoimax.m4: New file.
+
+ Module strtoumax.
+ * m4/strtoumax.m4: New file.
+
+ Module xstrtoimax.
+ * m4/xstrtoimax.m4 (jm_XSTRTOIMAX): Renamed from
+ jm_AC_PREREQ_XSTRTOIMAX.
+ Moved the strtol prerequisites to strtol.m4.
+ Moved the strtoll prerequisites to strtoll.m4.
+ Moved the strtoimax prerequisites to strtoimax.m4.
+
+ Module xstrtoumax.
+ * m4/xstrtoumax.m4 (jm_XSTRTOUMAX): Renamed from
+ jm_AC_PREREQ_XSTRTOUMAX.
+ Moved the strtoul prerequisites to strtoul.m4.
+ Moved the strtoull prerequisites to strtoull.m4.
+ Moved the strtoumax prerequisites to strtoumax.m4.
+
+ Module chown.
+ * m4/chown.m4 (gl_PREREQ_CHOWN): New macro.
+ (jm_FUNC_CHOWN): Use AC_FUNC_CHOWN. Invoke gl_PREREQ_CHOWN.
+
+ Module dup2.
+ * m4/dup2.m4: New file.
+
+ Module ftruncate.
+ * m4/ftruncate.m4 (gl_PREREQ_FTRUNCATE): New macro.
+ (jm_FUNC_FTRUNCATE): Use AC_REPLACE_FUNCS. Invoke gl_PREREQ_FTRUNCATE.
+
+ Module getgroups.
+ * m4/getgroups.m4 (gl_PREREQ_GETGROUPS): New macro.
+ (jm_FUNC_GETGROUPS): Use AC_FUNC_GETGROUPS. Invoke gl_PREREQ_GETGROUPS.
+
+ Module gettimeofday.
+ * m4/gettimeofday.m4 (gl_PREREQ_GETTIMEOFDAY): New macro.
+ (AC_FUNC_GETTIMEOFDAY_CLOBBER): Use onceonly macros. Invoke
+ gl_PREREQ_GETTIMEOFDAY.
+
+ Module mkdir.
+ * m4/mkdir-slash.m4 (gl_PREREQ_MKDIR): New macro.
+ (UTILS_FUNC_MKDIR_TRAILING_SLASH): Invoke gl_PREREQ_MKDIR.
+
+ Module mkstemp.
+ * m4/mkstemp.m4 (gl_PREREQ_MKSTEMP): New macro.
+ (jm_PREREQ_TEMPNAME): New macro, from prereq.m4. Also invoke
+ jm_AC_TYPE_UINTMAX_T.
+ (UTILS_FUNC_MKSTEMP): Invoke gl_PREREQ_MKSTEMP and jm_PREREQ_TEMPNAME.
+
+ Module stat.
+ * m4/stat.m4 (gl_PREREQ_STAT): New macro.
+ (jm_FUNC_STAT): Use AC_FUNC_STAT. Invoke gl_PREREQ_STAT.
+
+ Module lstat.
+ * m4/lstat.m4 (gl_PREREQ_LSTAT): New macro.
+ (jm_FUNC_LSTAT): Use AC_FUNC_LSTAT. Invoke gl_PREREQ_LSTAT.
+
+ Module timespec.
+ * m4/timespec.m4 (gl_TIMESPEC): New macro.
+ (jm_CHECK_TYPE_STRUCT_TIMESPEC): Add check for <sys/time.h>.
+ * m4/st_mtim.m4: Indentation.
+
+ Module nanosleep.
+ * m4/nanosleep.m4 (gl_PREREQ_NANOSLEEP): New macro.
+ (jm_FUNC_NANOSLEEP): Add check for <sys/time.h>. Invoke
+ gl_PREREQ_NANOSLEEP.
+
+ Module regex.
+ * m4/regex.m4 (jm_PREREQ_REGEX): New macro.
+ (jm_INCLUDED_REGEX): Invoke jm_PREREQ_REGEX.
+ (gl_REGEX): New macro.
+
+ Module rename.
+ * m4/rename.m4 (gl_PREREQ_RENAME): New macro.
+ (vb_FUNC_RENAME): Invoke gl_PREREQ_RENAME.
+
+ Module rmdir.
+ * m4/rmdir.m4: New file.
+
+ Module utime.
+ * m4/utimbuf.m4 (jm_CHECK_TYPE_STRUCT_UTIMBUF): Use onceonly macros.
+ * m4/utime.m4 (gl_PREREQ_UTIME): New macro.
+ (jm_FUNC_UTIME): Invoke gl_PREREQ_UTIME.
+
+ Module dirname.
+ * m4/dirname.m4: New file.
+
+ Module getopt.
+ * m4/getopt.m4: New file.
+
+ Module unistd-safer.
+ * m4/unistd-safer.m4: New file.
+
+ Module fnmatch.
+ * m4/fnmatch.m4 (_AC_FUNC_FNMATCH_IF): Include <stdlib.h>, for exit()
+ declaration.
+ (gl_PREREQ_FNMATCH_EXTRA): New macro.
+ (gl_FUNC_FNMATCH_POSIX): New macro.
+ (gl_FUNC_FNMATCH_GNU): Renamed from AC_FUNC_FNMATCH_GNU. Invoke
+ gl_PREREQ_FNMATCH_EXTRA. Use the function name gnu_fnmatch, not
+ simply fnmatch.
+
+ Module exclude.
+ * m4/exclude.m4: New file.
+
+ Module human.
+ * m4/human.m4: New file.
+
+ Module acl.
+ * m4/acl.m4: Nop.
+
+ Module backupfile.
+ * m4/backupfile.m4: New file.
+ * m4/d-ino.m4: Indentation.
+
+ Module fsusage.
+ * m4/fsusage.m4 (gl_FSUSAGE): New macro.
+ (jm_STATFS_TRUNCATES): New macro, from coreutils-4.5.4/configure.ac.
+ (gl_PREREQ_FSUSAGE_EXTRA): New macro.
+
+ Module dirfd.
+ * m4/dirfd.m4 (UTILS_FUNC_DIRFD): Invoke some AC_EGREP_CPP
+ requirements.
+
+ Module euidaccess.
+ * m4/euidaccess.m4: New file.
+
+ Module file-type.
+ * m4/file-type.m4: New file.
+
+ Module fileblocks.
+ * m4/fileblocks.m4: New file.
+
+ Module filemode.
+ * m4/filemode.m4: New file.
+
+ Module isdir.
+ * m4/isdir.m4: New file.
+
+ Module lchown.
+ * m4/lchown.m4 (gl_PREREQ_LCHOWN): New macro.
+ (jm_FUNC_LCHOWN): Invoke gl_PREREQ_LCHOWN.
+
+ Module makepath.
+ * m4/makepath.m4: New file.
+
+ Module modechange.
+ * m4/modechange.m4: New file.
+
+ Module mountlist.
+ * m4/mountlist.m4: New file.
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Use onceonly macros.
+ Indentation.
+
+ Module path-concat.
+ * m4/path-concat.m4: New file.
+
+ Module pathmax.
+ * m4/pathmax.m4: New file.
+
+ Module same.
+ * m4/same.m4: New file.
+
+ Module save-cwd.
+ * m4/save-cwd.m4: New file.
+
+ Module savedir.
+ * m4/savedir.m4: New file.
+
+ Module xgetcwd.
+ * m4/xgetcwd.m4: New file.
+ * m4/getcwd.m4 (AC_FUNC_GETCWD_NULL): Use onceonly macros.
+
+ Module xreadlink.
+ * m4/xreadlink.m4: New file.
+
+ Module safe-read.
+ * m4/safe-read.m4: New file.
+
+ Module safe-write.
+ * m4/safe-write.m4: New file.
+
+ Module closeout.
+ * m4/closeout.m4: New file.
+
+ Module stdio-safer.
+ * m4/stdio-safer.m4: New file.
+
+ Module getpass.
+ * m4/getpass.m4: New file.
+
+ Module getugroups.
+ * m4/getugroups.m4: New file.
+
+ Module group-member.
+ * m4/group-member.m4 (gl_PREREQ_GROUP_MEMBER): New macro.
+ (jm_FUNC_GROUP_MEMBER): Invoke AC_GNU_SOURCE, gl_PREREQ_GROUP_MEMBER.
+
+ Module idcache.
+ * m4/idcache.m4: New file.
+
+ Module userspec.
+ * m4/userspec.m4: New file.
+
+ Module gettime.
+ * m4/clock_time.m4: New file.
+ * m4/gettime.m4: New file.
+
+ Module settime.
+ * m4/settime.m4: New file.
+
+ Module posixtm.
+ * m4/posixtm.m4: New file.
+
+ Module gethostname.
+ * m4/gethostname.m4: New file.
+
+ Module canon-host.
+ * m4/canon-host.m4: New file.
+
+ Module gettext.
+ * m4/codeset.m4: New file, from gettext-0.11.5.
+ * m4/gettext.m4: New file, from gettext-0.11.5.
+ * m4/glibc21.m4: New file, from gettext-0.11.5.
+ * m4/iconv.m4: New file, from gettext-0.11.5.
+ * m4/intdiv0.m4: New file, from gettext-0.11.5.
+ * m4/inttypes-pri.m4: New file, from gettext-0.11.5.
+ * m4/inttypes.m4: New file, from gettext-0.11.5.
+ * m4/inttypes_h.m4: New file, from gettext-0.11.5 with modifications.
+ * m4/isc-posix.m4: New file, from gettext-0.11.5.
+ * m4/lcmessage.m4: New file, from gettext-0.11.5.
+ * m4/lib-ld.m4: New file, from gettext-0.11.5.
+ * m4/lib-link.m4: New file, from gettext-0.11.5.
+ * m4/lib-prefix.m4: New file, from gettext-0.11.5.
+ * m4/progtest.m4: New file, from gettext-0.11.5.
+ * m4/stdint_h.m4: New file, from gettext-0.11.5 with modifications.
+ * m4/uintmax_t.m4: New file, from gettext-0.11.5 with modifications.
+ * m4/ulonglong.m4: New file, from gettext-0.11.5 with modifications.
+
+ Module localcharset.
+ * m4/localcharset.m4: New file.
+
+ Module hard-locale.
+ * m4/hard-locale.m4: New file.
+
+ Module mbswidth.
+ * m4/mbswidth.m4 (gl_MBSWIDTH): Renamed from jm_PREREQ_MBSWIDTH. Use
+ onceonly macros.
+ * m4/mbrtowc.m4: Add comment.
+
+ Module memcasecmp.
+ * m4/memcasecmp.m4: New file.
+
+ Module memcoll.
+ * m4/memcoll.m4: New file.
+
+ Module unicodeio.
+ * m4/unicodeio.m4: New file.
+
+ Module rpmatch.
+ * m4/rpmatch.m4: New file.
+
+ Module yesno.
+ * m4/yesno.m4: New file.
+
+ Module exitfail.
+ * m4/exitfail.m4: New file.
+
+ Module c-stack.
+ * m4/c-stack.m4 (gl_C_STACK): New macro.
+ (jm_PREREQ_C_STACK): Check for <sys/time.h>. Use onceonly macros.
+
+ Module error.
+ * m4/error.m4 (gl_ERROR): New macro.
+ (jm_PREREQ_ERROR): Use onceonly macros.
+
+ Module fatal.
+ * m4/fatal.m4: New file.
+
+ Module getloadavg.
+ * m4/getloadavg.m4 (AC_FUNC_GETLOADAVG): Use onceonly macros.
+ (gl_FUNC_GETLOADAVG, gl_PREREQ_GETLOADAVG): New macros.
+
+ Module getpagesize.
+ * m4/getpagesize.m4: New file.
+
+ Module getusershell.
+ * m4/getusershell.m4: New file.
+
+ Module physmem.
+ * m4/physmem.m4: New file.
+
+ Module posixver.
+ * m4/posixver.m4: New file.
+
+ Module quotearg.
+ * m4/quotearg.m4: New file.
+
+ Module quote.
+ * m4/quote.m4: New file.
+
+ Module readutmp.
+ * m4/readutmp.m4: New file, based on jm_PREREQ_READUTMP from prereq.m4.
+
+ Module sig2str.
+ * m4/sig2str.m4: New file.
+
+ Other.
+ * m4/longlong.m4 (jm_AC_TYPE_UNSIGNED_LONG_LONG): Remove, moved to
+ ulonglong.m4.
+ * m4/intmax_t.m4: New file.
+ * m4/d-type.m4: Indentation.
+ * m4/jm-macros.m4: Update.
+ * m4/prereq.m4 (jm_PREREQ): Update.
+ (jm_PREREQ_ADDEXT): Remove, obsoleted by backupfile.m4.
+ (jm_PREREQ_CANON_HOST): Remove, obsoleted by canon-host.m4.
+ (jm_PREREQ_DIRNAME): Remove, obsoleted by dirname.m4.
+ (jm_PREREQ_EXCLUDE): Remove, obsoleted by exclude.m4.
+ (jm_PREREQ_GETPAGESIZE): Remove, obsoleted by getpagesize.m4.
+ (jm_PREREQ_HARD_LOCALE): Remove, obsoleted by hard-locale.m4.
+ (jm_PREREQ_HASH): Remove, obsoleted by hash.m4.
+ (jm_PREREQ_HUMAN): Remove, obsoleted by human.m4.
+ (jm_PREREQ_MEMCHR): Remove, obsoleted by memchr.m4.
+ (jm_PREREQ_PHYSMEM): Remove, obsoleted by physmem.m4.
+ (jm_PREREQ_POSIXVER): Remove, obsoleted by posixver.m4.
+ (jm_PREREQ_QUOTEARG): Remove, obsoleted by quotearg.m4.
+ (jm_PREREQ_READUTMP): Remove, obsoleted by readutmp.m4.
+ (jm_PREREQ_REGEX): Remove, obsoleted by regex.m4.
+ (jm_PREREQ_STRNLEN): Remove, obsoleted by strnlen.m4.
+ (jm_PREREQ_TEMPNAME): Remove, obsoleted by mkstemp.m4.
+ (jm_PREREQ_XGETCWD): Remove, obsoleted by xgetcwd.m4.
+ (jm_PREREQ_XREADLINK): Remove, obsoleted by xreadlink.m4.
+ * m4/readdir.m4 (jm_FUNC_READDIR): Use onceonly macros.
+
+2002-12-24 Bruno Haible <bruno@clisp.org>
+
+ * MODULES.txt: Update according to m4/ changes.
+
+ Module gettext.
+ * config.rpath: New file, from gettext-0.11.5.
+
+ * modules/*: New module descriptions.
+ * gnulib-tool: New file.
+ * MODULES.html.sh: New file.
+
+2002-12-21 Karl Berry <karl@gnu.org>
+
+ * doc/fdl.texi: update to version 1.2.
+
+2002-12-19 Karl Berry <karl@gnu.org>
+
+ * config/config.guess: update from prep.
+
+2002-12-18 Bruno Haible <bruno@clisp.org>
+
+ * m4/strftime.m4 (_jm_STRFTIME_PREREQS): Don't test for localtime_r.
+ * m4/jm-mktime.m4 (jm_FUNC_MKTIME): Likewise.
+
+2002-12-17 Bruno Haible <bruno@clisp.org>
+
+ * m4/mbswidth.m4 (jm_PREREQ_MBSWIDTH): Remove checks for limits.h,
+ stdlib.h, string.h.
+
+2002-12-17 Bruno Haible <bruno@clisp.org>
+
+ * lib/canon-host.c (strdup): Remove unused declaration.
+
+ * lib/fsusage.c: Include full_read.h.
+ (get_fs_usage): Use full_read instead of safe_read.
+
+ * lib/utime.c (utime_null): Use SAFE_READ_ERROR.
+
+2002-12-12 Karl Berry <karl@gnu.org>
+
+ * config/config.guess: update from prep.
+
+2002-12-11 Bruno Haible <bruno@clisp.org>
+
+ * m4/setenv.m4: New file, from gettext-0.11.5.
+
+2002-12-11 Bruno Haible <bruno@clisp.org>
+
+ * lib/setenv.h: Rewritten to cope with systems that have setenv() but
+ not unsetenv().
+ * lib/setenv.c, unsetenv.c: Taken from glibc-2.2.4 with the following
+ modifications:
+
+ 2002-12-11 Bruno Haible <bruno@clisp.org>
+
+ * setenv.c (alloca): Fall back to malloc.
+ (freea): New macro.
+ (setenv): Use freea() to free memory allocated with alloca().
+
+ 2002-11-13 Bruno Haible <bruno@clisp.org>
+
+ * setenv.c (compar_fn_t, __add_to_environ, setenv): Use ANSI C
+ function declarations.
+ * unsetenv.c (unsetenv): Likewise.
+
+ 2002-03-04 Bruno Haible <bruno@clisp.org>
+
+ Portability to AIX 4.3.3.
+ * unsetenv.c: New file, extracted from setenv.c.
+ * setenv.c: Move the unsetenv() function to unsetenv.c.
+
+ 2001-12-20 Bruno Haible <bruno@clisp.org>
+
+ * setenv.c (__add_to_environ): Don't call realloc(NULL,...),
+ use malloc instead. For SunOS 4.
+
+ 2001-12-11 Bruno Haible <bruno@clisp.org>
+
+ * setenv.c: Declare alloca.
+ (compar_fn_t): New typedef.
+ (KNOWN_VALUE, STORE_VALUE): Use it.
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add setenv.c, unsetenv.c,
+ setenv.h.
+
+2002-12-10 Paul Eggert <eggert@twinsun.com>
+
+ Port exclude.c and exclude.h to more non-GNU systems, e.g. Solaris 7.
+ * lib/exclude.h (EXCLUDE_ANCHORED, EXCLUDE_INCLUDE, EXCLUDE_WILDCARDS):
+ Choose values that are less likely to collide with system fnmatch
+ options.
+ * lib/exclude.c (FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
+ defined (e.g., a pure POSIX system).
+ (EXCLUDE_macros_do_not_collide_with_FNM_macros): Use FNM_PATHNAME
+ instead of FNM_FILE_NAME, for compatibility with pure POSIX sytems.
+
+2002-12-06 Paul Eggert <eggert@twinsun.com>
+
+ Undo the 2001-07-02 change for jm-glibc-io, as it was too much of
+ a pain in practice to deal with generated m4 files. This change
+ goes together with the 2002-12-04 unlocked-io.h change in ../lib.
+
+ * m4/Makefile.am.in (Makefile.am): Don't mention jm-glibc-io.m4n
+ and jm-glibc-io.m4, as they are no longer a special case.
+ * m4/jm-glibc-io.m4: Rename from jm-glibc-io.m4n, and remove the
+ kludge and the auto-generation stuff. Check only whether the
+ functions are declared, not whether they exist, since older hosts
+ that don't declare the functions can't use the optimization anyway.
+
+2002-12-06 Jim Meyering <jim@meyering.net>
+
+ * lib/error.c: Be consistent: change `#ifndef _LIBC' to `#if !_LIBC'.
+
+ Merge in changes from libc's misc/error.c, in preparation
+ for the merge of gnulib's changes back into libc.
+
+ * lib/error.c (_): Define only if not already defined.
+ Move definition to follow all #include directives.
+ Include unlocked-io.h only if !_LIBC.
+ [_LIBC]: Include <libio/libioP.h>.
+ [USE_IN_LIBIO]: Include <libio/iolibio.h>
+ (fflush): Tweak definition to use INTUSE.
+ (putc): Define.
+
+2002-12-05 Paul Eggert <eggert@twinsun.com>
+
+ * lib/alloca.c [defined emacs]: Include "lisp.h".
+ (xalloc_die) [defined emacs]: New macro.
+ (free) [defined emacs && defined EMACS_FREE]: Define to EMACS_FREE.
+ [! defined emacs]: Include <xalloc.h>.
+ (POINTER_TYPE) [!defined POINTER_TYPE]: New macro.
+ (pointer): Typedef to POINTER_TYPE *.
+ (malloc): Remove decl; we now always use xmalloc.
+ (alloca): Use old-style definition, since Emacs needs this.
+ Check for arithmetic overflow when computing combined size.
+
+2002-12-04 Paul Eggert <eggert@twinsun.com>
+
+ Do not generate unlocked-io.h automatically, since it's easier to
+ maintain it by hand.
+
+ * lib/unlocked-io.h: New file, from GNU diffutils,
+ but with proper copyright notice and attribution.
+ * lib/gen-uio: Remove.
+ * lib/Makefile.am: Add copyright notice.
+ (libfetish_a_SOURCES): Add unlocked-io.h.
+ (BUILT_SOURCES, all-local): Remove unlocked-io.h.
+ (DISTCLEANFILES, io_functions): Remove macros.
+ (EXTRA_DIST): Remove gen_uio.
+ (unlocked-io.h): Remove rule.
+
+2002-12-04 Jim Meyering <jim@meyering.net>
+
+ Reflect the fact that stat.c and lstat.c are no longer generated.
+ * lib/Makefile.am (BUILT_SOURCES): Remove stat.c and lstat.c.
+ (DISTCLEANFILES): Likewise.
+ (EXTRA_DIST): Likewise.
+ (all_local): Don't depend on stat.c or lstat.c.
+ (stat.c, lstat.c): Remove rules.
+ (EXTRA_DIST): Remove xstat.in.
+
+ * lib/xstat.in: Remove file. Contents moved into stat.c.
+ * lib/stat.c: New file. Contents mostly from xstat.in.
+ * lib/stat.c: Rework so that it may serve to define rpl_lstat, too.
+ * lib/lstat.c: New file. Simply #define LSTAT and include stat.c.
+
+ * lib/safe-read.c: Rework so that it may serve to define safe_write,
+ too.
+ * lib/safe-write.c: Simply #define SAFE_WRITE and include safe-read.c.
+
+2002-12-03 Jim Meyering <jim@meyering.net>
+
+ * lib/safe-read.c, safe-write.c: Change variable names and comments,
+ but not semantics, to minimize the differences between these two files.
+ (safe_read): Change comment to mention SAFE_READ_ERROR.
+
+ * lib/safe-read.c (IS_EINTR): Define.
+ (safe_read): Use IS_EINTR in place of in-function cpp directives.
+
+2002-12-02 Jim Meyering <jim@meyering.net>
+
+ * lib/safe-read.c (EINTR): Define.
+ (CHAR_BIT, TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM): Define.
+ (INT_MAX): Provide fallback.
+ (safe_read): Rewrite to iterate IFF the read fails with EINTR.
+
+ * lib/safe-read.h (SAFE_READ_ERROR): Define.
+
+2002-12-02 Bruno Haible <bruno@clisp.org>
+
+ * lib/safe-write.c (CHAR_BIT, TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM):
+ Define, taken from safe-read.c.
+ (INT_MAX): Provide fallback.
+ (safe_write): Rewrite to iterate IFF the write fails with EINTR.
+ * lib/safe-write.h (SAFE_WRITE_ERROR): Define.
+
+ * lib/safe-read.c (EINTR): Remove definition.
+ (safe_read): Don't use EINTR if it is absent.
+
+2002-12-01 Jim Meyering <jim@meyering.net>
+
+ * lib/safe-read.c: (safe_read): Also exit the loop when read returns
+ zero.
+ (CHAR_BIT, TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM, INT_MAX): Define.
+
+2002-11-27 Paul Eggert <eggert@twinsun.com>
+
+ * lib/hash.c (hash_lookup, hash_get_first, hash_get_next,
+ hash_find_entry, hash_rehash): Replace `if (limit <= value) abort ();'
+ with `if (! (value < limit)) abort ();', for readability.
+
+2002-11-26 Karl Berry <karl@gnu.org>
+
+ * lib/strdup.c: copy from libc again, with jim's ok.
+ * lib/.cppi-disable: re-add strdup.c
+
+2002-11-25 Karl Berry <karl@gnu.org>
+
+ * lib/strtoll.c: copy from libc, meaning we now #include <strtol.c>
+ instead of "strtol.c".
+
+2002-11-25 Karl Berry <karl@gnu.org>
+
+ * config/install-sh: update from automake for variable quoting, $0 in
+ error msgs, etc.
+
+ * config/srclist.txt ($LIBCSRC/time/mktime.c lib gpl): new entry.
+ * config/srclist.txt ($LIBCSRC/sysdeps/generic/strtoll.c lib gpl): new
+ entry.
+
+2002-11-25 Jim Meyering <jim@meyering.net>
+
+ * lib/mktime.c: Sync from libc, now that it has the latest fix.
+
+2002-11-24 Karl Berry <karl@gnu.org>
+
+ * lib/error.c, getopt.c, getopt.h, getopt1.c, obstack.c, regex.c,
+ regex.h, strdup.c, strtoll.c, tempname.c: change license to gpl.
+
+2002-11-24 Jim Meyering <jim@meyering.net>
+
+ Update from coreutils:
+
+ * lib/mktime.c: Merge in changes from libc.
+
+ Avoid a link-time failure on some Linux systems.
+ * lib/mktime.c (STATIC): Define to be empty (_LIBC) or `static'
+ (otherwise).
+ (__mon_yday): Declare with the STATIC attribute.
+ (__mktime_internal): Likewise.
+ Based on a report from Greg Schafer.
+
+2002-11-23 Jim Meyering <jim@meyering.net>
+
+ * lib/sig2str.c (str2signum, sig2str): Avoid a warning from gcc:
+ Use `unsigned', not `int', as type of index.
+
+ * lib/xstat.in [@BEGIN_LSTAT_ONLY@]: Include <string.h>.
+
+ * lib/fsusage.c: Remove unneeded parentheses around operands of
+ `defined'.
+
+2002-11-22 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.h: Allow multiple inclusion by surrounding with
+ "#ifndef QUOTEARG_H_". Include <stddef.h>, for size_t,
+ so that we can be included first.
+ (PARAMS): Remove; we now assume C89 or later. All uses removed.
+ * lib/quotearg.c: Include quotearg.h immediately after config.h.
+ No need to include stddef.h or sys/types.h any more.
+ Surround local include files with "", not "<>".
+ Assume HAVE_LIMITS_H unconditionally, as we assume C89.
+ Similarly, assume HAVE_C_BACKSLASH_A, CHAR_BIT, UCHAR_MAX, UINT_MAX,
+ HAVE_STDLIB_H, HAVE_STRING_H, STDC_HEADERS.
+ (HAVE_MBSINIT): Undef if !HAVE_MBRTOWC.
+ (mbsinit): Define to 1 if !defined mbsinit && !HAVE_MBSINIT.
+ (ISPRINT): Remove; no longer needed now that we assume C89.
+
+ (clone_quoting_options, quotearg_buffer, quotearg_n_options):
+ Preserve errno.
+
+ (quotearg_buffer_restyled, quotearg_n, quotearg_n_style,
+ quotearg_char): Use SIZE_MAX rather than
+ (size_t) -1 when we are talking about "infinity".
+
+ (quotearg_buffer_restyled): Fix bug when quoting trigraphs.
+
+2002-11-22 Paul Eggert <eggert@twinsun.com>
+
+ * lib/hash.c: Avoid use of <assert.h>, as the GNU Coding Standards
+ hint that one should use `if (! x) abort ();' rather than `assert
+ (x);', and anyway it's one less thing to worry about configuring.
+ (hash_lookup, hash_get_first, hash_get_next, hash_find_entry,
+ hash_rehash, hash_insert): Use abort rather than assert.
+
+2002-11-22 Bruno Haible <bruno@clisp.org>
+
+ * lib/safe-read.h: Assume C89. Add comments.
+ (safe_read): Change return type to size_t.
+ * lib/safe-read.c (safe_read): Change return type to size_t. Handle
+ byte counts > SSIZE_MAX correctly.
+ * lib/safe-write.h: New file.
+ * lib/safe-write.c: New file.
+ * lib/full-read.h: New file.
+ * lib/full-read.c: New file.
+ * lib/full-write.h: Assume C89. Add comments.
+ * lib/full-write.c: Include safe-write.h.
+ (full_write): Rewritten to use safe_write.
+ Suggested by Jim Meyering and Paul Eggert.
+
+2002-11-21 Jim Meyering <jim@meyering.net>
+
+ * lib/strdup.c (strdup): Tweak comment and initial #if/#include.
+
+ Merge in changes from the coreutils.
+
+ 2002-09-25 Paul Eggert <eggert@twinsun.com>
+ * lib/fsusage.c [! HAVE_INTTYPES_H && HAVE_STDINT_H] Include
+ <stdint.h>.
+ (UINTMAX_MAX) [!defined UINTMAX_MAX]: New macro.
+ (PROPAGATE_ALL_ONES): Work even if X is unsigned and narrower than
+ int. Work more efficiently if X is the same width as uintmax_t.
+ Do not compare X to -1, to avoid bogus compiler warning.
+ (get_fs_usage): (uintmax_t) -1 -> UINTMAX_MAX to avoid a cast.
+ Don't assume that f_frsize and f_bsize are the same type.
+
+ * lib/mountlist.c: #undef MNT_IGNORE before defining it, to avoid
+ warning on FreeBSD.
+
+ * lib/makepath.c (make_path): Restore umask *before* creating the final
+ component.
+ (make_path): Minor reformatting.
+
+ * lib/xmalloc.c: Adjust to work with new autoconf macros,
+ AC_FUNC_MALLOC and AC_FUNC_REALLOC: test #ifndef
+ HAVE_MALLOC/HAVE_REALLOC.
+
+ * lib/mountlist.h (ME_DUMMY): Don't count entries of type `auto' as
+ dummy ones. At least on GNU/Linux systems, `auto' means something
+ else.
+ From Michael Stone.
+
+2002-11-21 Bruno Haible <bruno@clisp.org>
+
+ Remove case insensitive option matching.
+ * lib/argmatch.h (argcasematch): Remove declaration.
+ (ARGCASEMATCH): Remove macro.
+ (__xargmatch_internal): Remove case_sensitive argument.
+ (XARGMATCH): Update.
+ (XARGCASEMATCH): Remove macro.
+ * lib/argmatch.c (argmatch): Renamed from __argmatch_internal. Remove
+ case_sensitive argument.
+ (argcasematch): Remove function.
+ (__xargmatch_internal): Remove case_sensitive argument.
+ (main): Use XARGMATCH instead of XARGCASEMATCH.
+
+ * lib/xmalloc.c: Change compile-time error message. Add comment about
+ required autoconf version.
+
+2002-11-20 Paul Eggert <eggert@twinsun.com>
+
+ Merge argmatch cleanups from Bison. Assume C89.
+
+ * lib/argmatch.c: Include config.h here, not in argmatch.h.
+ Include stdlib.h, for EXIT_FAILURE.
+ Always include <string.h>, since we assume C89.
+ (EXIT_FAILURE): Remove pre-C89 bug workaround.
+ * lib/argmatch.h: Do not include <config.h> or <sys/types.h>.
+ Include <stddef.h> instead, since it's all we need for size_t.
+ (PARAMS): Remove. All uses removed.
+ (ARRAY_CARDINALITY): Do not bother to #undef.
+ (ARRAY_CARDINALITY, ARGMATCH, ARGCASEMATCH, invalid_arg,
+ ARGMATCH_VALID, XARGMATCH, XARGCASEMATCH):
+ Remove unnecessary parentheses.
+ (ARGMATCH_VALID, XARGMATCH, XARGCASEMATCH):
+ Insert necessary parentheses.
+ (ARGMATCH_CONSTRAINT, ARGMATCH_VERIFY): New macros.
+ (ARGMATCH_ASSERT): Use ARGMATCH_CONSTRAINT.
+
+2002-11-19 Bruno Haible <bruno@clisp.org>
+
+ * lib/mbswidth.c: Include mbswidth.h right at the beginning.
+ * lib/mbswidth.h: Include <stddef.h>, for size_t.
+
+ * lib/mbswidth.h (PARAMS): Remove macro.
+ (mbswidth, mbsnwidth): Use ANSI C function declarations.
+ * lib/mbswidth.c (mbswidth, mbsnwidth): Likewise.
+
+ * lib/gcd.h (PARAMS): Remove macro.
+ (gcd): Use ANSI C function declarations.
+ * lib/gcd.c (gcd): Likewise.
+
+2002-11-15 Bruno Haible <bruno@clisp.org>
+
+ * lib/strcspn.c: Include <stddef.h>.
+ (strcspn): Use ANSI C function declaration. Change return type to
+ size_t. Use NULL.
+ * lib/strpbrk.c: Minimize diffs to glibc. Include <stddef.h>.
+ (strpbrk): Use NULL.
+ * lib/strpbrk.h (PARAMS): Remove macro.
+ (strpbrk): Use ANSI C function declaration.
+ * lib/strstr.c: Don't include <sys/types.h>.
+ * lib/strstr.h (PARAMS): Remove macro.
+ (strstr): Use ANSI C function declarations.
+
+2002-11-14 Karl Berry <karl@gnu.org>
+
+ * config/mkinstalldirs: `do' on separate line, instead of
+ `for var; do'.
+
+2002-11-06 Bruno Haible <bruno@clisp.org>
+
+ * lib/gcd.h (gcd): Change argument type to 'unsigned long'.
+ * lib/gcd.c (gcd): Likewise.
+
+2002-11-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/gcd.h: New file, from gettext-0.11.5.
+ * lib/gcd.c: New file, from gettext-0.11.5.
+
+2002-11-05 Bruno Haible <bruno@clisp.org>
+
+ * lib/error.c [!_LIBC]: Include gettext.h instead of <libintl.h>.
+ * lib/getopt.c [!_LIBC]: Include gettext.h instead of <libintl.h>.
+ * lib/obstack.c [!_LIBC]: Include gettext.h instead of <libintl.h>.
+ * lib/regex.c [!_LIBC]: Include gettext.h instead of <libintl.h>.
+
+ * lib/argmatch.c: Include gettext.h instead of <locale.h> and
+ <libintl.h>.
+ * lib/makepath.c: Include gettext.h instead of <locale.h> and
+ <libintl.h>.
+
+ * lib/closeout.c: Include gettext.h instead of <libintl.h>.
+ * lib/human.c: Include gettext.h instead of <libintl.h>.
+ * lib/quotearg.c: Include gettext.h instead of <libintl.h>.
+ * lib/rpmatch.c: Include gettext.h instead of <libintl.h>.
+ * lib/unicodeio.c: Include gettext.h instead of <libintl.h>.
+ * lib/userspec.c: Include gettext.h instead of <libintl.h>.
+ * lib/version-etc.c: Include gettext.h instead of <libintl.h>.
+ * lib/xmalloc.c: Include gettext.h instead of <libintl.h>.
+ (textdomain): Remove definition.
+ * lib/xmemcoll.c: Include gettext.h instead of <libintl.h>.
+
+ * lib/long-options.c: Remove include of <libintl.h> and definition of
+ _.
+ * lib/same.c: Remove include of <libintl.h> and definition of _.
+
+2002-11-04 Owen Taylor <otaylor@redhat.com>
+
+ * lib/config.charset: A few additions for Solaris.
+
+2002-11-04 Bruno Haible <haible@clisp.cons.org>
+
+ Make it possible to build libcharset with CC=gcc CFLAGS="-x c++".
+ * lib/localcharset.c (locale_charset): Declare as extern "C".
+
+2002-11-04 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/config.charset: msdos in uk_UA uses CP1125.
+
+2002-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/stpcpy.h: New file, from GNU gettext-0.11.5.
+ * lib/strcase.h: New file, from GNU gettext-0.11.5.
+ * lib/strpbrk.h: New file, from GNU gettext-0.11.5.
+ * lib/strstr.h: New file, from GNU gettext-0.11.5.
+ * lib/xgetcwd.h: New file, from GNU gettext-0.11.5.
+
+2002-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c (locale_charset): Don't return an empty string.
+
+2002-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/localcharset.c (get_charset_aliases): Add more Windows specific
+ aliases.
+
+2002-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/config.charset: Update for newest glibc. Add canonical names
+ ISO-8859-14, KOI8-T, TCVN5712-1, GEORGIAN-PS.
+
+2002-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/config.charset: Add support for NetBSD.
+
+2002-11-04 Bruno Haible <bruno@clisp.org>
+
+ * lib/config.charset [msdosdjgpp]: For Russian, use CP866.
+
+2002-11-01 Bruno Haible <bruno@clisp.org>
+
+ * configure.in: Add AC_CONFIG_AUX_DIR call.
+ (AC_OUTPUT): Add m4/Makefile, lib/Makefile. Remove doc/Makefile,
+ test/Makefile.
+ * Makefile.in (subdirs): Add m4, lib. Remove doc, test.
+
+2002-09-28 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: can't copy install-sh/mkinstalldirs from
+ installed automake until the next release, since changes have been
+ made.
+
+2002-09-25 Karl Berry <karl@gnu.org>
+
+ * lib/strdup.c: copy from libc/string (via ../config/srclist*).
+ * lib/getopt*: copy from libc/posix.
+ * lib/gettext.h: copy from gettext.
+ * lib/.cppi-disable: add strdup.c, gettext.h.
+
+2002-09-25 Karl Berry <karl@gnu.org>
+
+ * config/srclist.txt: enable gettext.h check.
+ * config/config.{guess,sub}: update from prep.
+ * config/depcomp, install-sh, mdate-sh, missing, mkinstalldirs: update
+ from automake 1.6.3.
+ See srclist*.
+
+2002-08-23 Stefan Monnier <monnier@cs.yale.edu>
+
+ * regex.c (PATFETCH): Remove the translating fetch.
+ (PATFETCH_RAW): Rename to PATFETCH.
+ (set_image_of_range): New fun.
+ (SET_RANGE_TABLE_WORK_AREA): Use it.
+ (regex_compile): Don't translate the pattern chars so eagerly.
+ Only do it when inserting an `exactn' bytecode or when handling
+ a char-range.
+ (mutually_exclusive_p): Avoid empty statement.
+
+2002-07-06 Jim Meyering <meyering@lucent.com>
+
+ * m4/README: Don't mention Makefile.am.in.
+ Outline how I've tested changes to .m4 files. Yep, it's a pain.
+
+2002-07-01 Jim Meyering <meyering@lucent.com>
+
+ * lib/c-stack.c: Include sys/time.h.
+ From Volker Borchert.
+
+2002-06-26 Paul Eggert <eggert@twinsun.com>
+
+ * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Check for btowc.
+
+2002-06-26 Paul Eggert <eggert@twinsun.com>
+
+ * lib/fnmatch.c, fnmatch_loop.c (WIDE_CHAR_SUPPORT):
+ New macro. Use it uniformly instead of
+ (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H).
+ It also uses HAVE_BTOWC, to fix a porting bug on Solaris 2.5.1
+ reported by Vin Shelton.
+
+2002-06-22 Paul Eggert <eggert@twinsun.com>
+
+ * lib/c-stack.h (segv_handler, c_stack_action) [! defined SA_SIGINFO]:
+ Do not assume SA_SIGINFO behavior.
+ Bug reported by Jim Meyering on NetBSD 1.5.2.
+
+2002-06-22 Jim Meyering <meyering@lucent.com>
+
+ * m4/c-stack.m4: New file, from diffutils-2.8.2.
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_C_STACK.
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Don't require AC__GNU_SOURCE,
+ now that configure.ac uses AC_GNU_SOURCE.
+ (jm_MACROS): Rename: jm_FUNC_FNMATCH to AC_FUNC_FNMATCH_GNU.
+ * m4/prereq.m4 (jm_PREREQ_EXCLUDE): Likewise, wrt jm_FUNC_FNMATCH.
+
+ Update to latest tools. Suggestions from Paul Eggert.
+ * m4/stdbool.m4: New file, from diffutils-2.8.2.
+ * m4/gnu-source.m4: Update from diffutils-2.8.2.
+ * m4/fnmatch.m4: Likewise.
+ * m4/prereq.m4: Change each use of AC_CHECK_HEADERS(stdbool.h)
+ to AC_HEADER_STDBOOL
+
+2002-06-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/fnmatch.c (ISASCII, ISPRINT): Undefine, to avoid warning about
+ redefinition due to Solaris 2.6's definition in /usr/include/sys/euc.h.
+
+2002-06-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/c-stack.c, lib/c-stack.h: New files, from diffutils-2.8.2.
+
+ * lib/exitfail.c, exitfail.h: Likewise.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add exitfail.c and exitfail.h.
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add fnmatch_.h in place
+ of fnmatch.h.
+ (EXTRA_DIST): Add fnmatch_loop.c.
+ (libfetish_a_SOURCES): Add c-stack.c and c-stack.h.
+
+ * lib/fnmatch_loop.c: New file, from diffutils-2.8.2.
+ * lib/fnmatch.c: Update from diffutils-2.8.2.
+ * lib/fnmatch_.h: New file. From diffutils-2.8.2.
+ * lib/fnmatch.h: Remove file.
+
+2002-06-21 Jim Meyering <meyering@lucent.com>
+
+ * m4/c-bs-a.m4: Add comment, from diffutils-2.8.2.
+ * m4/mbrtowc.m4: Likewise.
+
+ * m4/mbstate_t.m4: Update from diffutils-2.8.2.
+ * m4/mbswidth.m4: Reflect name change:
+ s/AC_MBSTATE_T/AC_TYPE_MBSTATE_T.
+ * m4/prereq.m4 (jm_PREREQ_QUOTEARG): Likewise.
+
+ * m4/lib-link.m4: Update from gettext-0.11.2.
+ * m4/gettext.m4: Likewise.
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_HEADERS): Check for hurd.h.
+ From Alfred M. Szmidt.
+
+2002-06-18 Paul Eggert <eggert@twinsun.com>
+
+ * lib/file-type.h: Report an error if neither S_ISREG nor
+ S_IFREG is defined, instead of using a test specific to glibc
+ 2.2. This should be safe, since POSIX requires S_ISREG and
+ Unix Version 7 had S_IFREG. We don't need to check for
+ <sys/types.h> since we don't use any symbols that it defines.
+
+2002-06-15 Richard Dawe <richdawe@bigfoot.com>
+
+ * lib/Makefile.am (lstat.c, stat.c, .sin.sed): Use t-$@, rather than
+ $@-t, so that each temporary file name is unique and valid in the first
+ 8 characters, for operation under DOS.
+
+2002-06-15 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Check for st_author.
+
+2002-06-15 Jim Meyering <meyering@lucent.com>
+
+ Work even with DJGPP 2.03, which lacks support for symlinks.
+ From Richard Dawe.
+ * lib/xstat.in (S_ISLNK): Define to 0 if neither S_ISLNK nor S_IFLNK
+ is defined.
+ * lib/lchown.c (S_ISLNK): Likewise.
+
+2002-06-15 Jim Meyering <meyering@lucent.com>
+
+ * lib/file-type.h (FILE_TYPE_H): Guard entire contents with #ifndef.
+ For GNU libc 2.2 and newer, ensure that <sys/types.h> and <sys/stat.h>
+ have been included before this file.
+
+2002-06-14 Jim Meyering <meyering@lucent.com>
+
+ * lib/file-type.h: Use the version from diffutils-2.8.2.
+ * lib/file-type.c: Likewise.
+
+2002-06-07 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_STAT): Check for sys/param.h and sys/mount.h.
+ They're needed at least for NetBSD 1.5.2.
+ ($statxfs_includes): Include those same headers.
+ ($statxfs_includes): Include sys/vfs.h if available.
+ ($statxfs_includes): Likewise for sys/statvfs.h.
+ Check for the following members in both structs statfs and statvfs:
+ f_basetype, f_type, f_fsid.__val, f_namemax, f_namelen.
+
+2002-06-01 Jim Meyering <meyering@lucent.com>
+
+ * m4/d-type.m4 (jm_CHECK_TYPE_STRUCT_DIRENT_D_TYPE): Rename macro:
+ s/D_TYPE_IN_DIRENT/HAVE_STRUCT_DIRENT_D_TYPE/.
+
+2002-05-28 Jim Meyering <meyering@lucent.com>
+
+ * m4/readdir.m4 (jm_FUNC_READDIR): Undefine `mkdir', not `rmdir'.
+ Reported by Volker Borchert.
+
+2002-05-27 Jim Meyering <meyering@lucent.com>
+
+ Fix a problem seen only on nonconforming systems whereby ls.c's
+ use of localtime, and then of gettimeofday would cause trouble:
+ the localtime call used to initialize rpl_gettimeofday's save
+ mechanism would clobber ls's current local time information so
+ that in any long listing the first file would always be listed
+ with date 1970-01-01. Analysis by Volker Borchert.
+
+ * lib/gettimeofday.c (localtime): Undefine.
+ (rpl_localtime): New function.
+
+2002-05-27 Jim Meyering <meyering@lucent.com>
+
+ * m4/gettimeofday.m4 (AC_FUNC_GETTIMEOFDAY_CLOBBER): Also replace
+ localtime.
+
+ * m4/readdir.m4 (jm_FUNC_READDIR): Undefine `rmdir' so we don't try to
+ use the replacement function; it wouldn't resolve at link time.
+ Reported by Volker Borchert.
+
+2002-05-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add file-type.c and
+ file-type.h.
+ * lib/file-type.h: New file.
+ * lib/file-type.c (file_type): New file/function. Extracted from
+ diffutils.
+
+2002-04-30 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_STAT.
+
+2002-04-29 Paul Eggert <eggert@twinsun.com>
+
+ * m4/prereq.m4 (jm_PREREQ_SIG2STR): Remove; all callers changed.
+
+2002-04-29 Paul Eggert <eggert@twinsun.com>
+
+ * m4/prereq.m4 (jm_PREREQ_HARD_LOCALE): Check for stdlib.h.
+ Do not check for alloca.h (no longer used) or stdbool.h (was never
+ used?). Add AM_C_PROTOTYPES since hard-locale.h uses it.
+
+2002-04-29 Paul Eggert <eggert@twinsun.com>
+
+ * lib/hard-locale.c: Upgrade to version used in GNU Diffutils 2.8.1.
+
+2002-04-29 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Remove use of AC_FUNC_STRNLEN.
+ * m4/prereq.m4: Add jm_PREREQ_STRNLEN.
+ Use AC_FUNC_STRNLEN here instead.
+
+ * m4/jm-macros.m4: Don't AC_REQUIRE([AC_PROG_CC_STDC]).
+ With autoconf-2.53a, it's part of AC_PROG_CC.
+
+2002-04-28 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Add AC_REPLACE_FUNCS(sig2str).
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_SIG2STR.
+
+2002-04-28 Paul Eggert <eggert@twinsun.com>
+
+ * lib/sig2str.h, lib/sig2str.c: New files.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add sig2str.h.
+
+2002-04-28 Paul Eggert <eggert@twinsun.com>
+
+ * lib/sig2str.h (SIGNUM_BOUND): Do not use WTERMSIG, to avoid
+ depending on <sys/wait.h> and WTERMSIG. Default to 64 instead
+ of 127, since 64 is the largest conceivable number for ancient
+ nonstandard hosts.
+ * lib/sig2str.c: Do not include <sys/wait.h>; no longer needed.
+
+2002-04-28 Jim Meyering <meyering@lucent.com>
+
+ * lib/sig2str.c (WTERMSIG): Remove definition (unused).
+
+2002-04-24 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_HARD_LOCALE): New macro.
+ (jm_PREREQ): Use it.
+
+ * m4/getloadavg.m4: Check for these headers: locale.h unistd.h
+ mach/mach.h fcntl.h.
+ Check for this function: setlocale.
+
+2002-04-24 Jim Meyering <meyering@lucent.com>
+
+ * lib/gettext.h: New file, from Gettext.
+ * lib/Makefile.am (INCLUDES): Remove -I../intl.
+ (libfetish_a_SOURCES): Add gettext.h.
+
+2002-04-16 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_READUTMP): Also check for these members:
+ ut_pid, ut_id, ut_exit.
+
+2002-04-16 Jim Meyering <meyering@lucent.com>
+
+ * lib/readutmp.h (UT_TYPE): Remove definition (now in who.c).
+ (HAVE_STRUCT_XTMP_UT_EXIT, HAVE_STRUCT_XTMP_UT_ID): Define.
+ (HAVE_STRUCT_XTMP_UT_PID, HAVE_STRUCT_XTMP_UT_TYPE): Define.
+
+2002-04-12 Jim Meyering <meyering@lucent.com>
+
+ * m4/ls-mntd-fs.m4 (checking for getmntinfo function...): Remove
+ now-bogus check for f_type in sys/mount.h. Instead, just test for the
+ existence of the getmntinfo function. Needed for Darwin 5.3.
+
+ * m4/dirfd.m4 (UTILS_FUNC_DIRFD): Also detect when dirfd is a macro.
+ This is necessary at least on Darwin 5.3.
+
+ * m4/jm-macros.m4: Don't AC_REPLACE(strnlen), now that we use
+ AC_FUNC_STRNLEN. Otherwise, we'd end up putting two copies of
+ strnlen.o in the library, and that makes some versions of ranlib
+ object.
+
+2002-04-12 Jim Meyering <meyering@lucent.com>
+
+ * lib/dirfd.h (dirfd): Elide prototype if dirfd is a macro.
+
+2002-04-09 Jim Meyering <meyering@lucent.com>
+
+ * m4/malloc.m4: (jm_FUNC_MALLOC): Change the `checking ...' message
+ to be more precise. Rather than saying we're checking whether the
+ function `works', say what we're testing.
+ * m4/realloc.m4 (jm_FUNC_REALLOC): Likewise.
+ Reported by Bruno Haible.
+
+2002-03-10 Jim Meyering <meyering@lucent.com>
+
+ * lib/makepath.c (make_path): Remove a comma from a diagnostic.
+ Suggestion from Santiago Vila.
+
+2002-03-08 Jim Meyering <meyering@lucent.com>
+
+ * lib/rename.c: Mention that this wrapper is needed also on
+ mips-dec-ultrix4.4 systems.
+
+2002-03-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/gettime.c (gettime): Test HAVE_CLOCK_GETTIME,
+ not HAVE_CLOCK_SETTIME.
+
+2002-02-27 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Do not replace stime; no longer used.
+ Check for clock_settime.
+
+2002-02-27 Paul Eggert <eggert@twinsun.com>
+
+ * lib/nanosleep.h: Rename to....
+ * lib/timespec.h: New name for nanosleep.h. All uses changed.
+
+ * lib/gettime.c: New file.
+ * lib/settime.c: New file.
+ * lib/stime.c: Remove.
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add gettime.c, settime.c,
+ timespec.h. Remove nanosleep.h.
+
+2002-02-25 Paul Eggert <eggert@twinsun.com>
+
+ * m4/acl.m4: New file.
+ * m4/jm-macros.m4 (jm_MACROS): Require AC_FUNC_ACL.
+ Do not check for acl or sys/acl.h, as AC_FUNC_ACL does that now.
+
+2002-02-25 Paul Eggert <eggert@twinsun.com>
+
+ * lib/acl.c, lib/acl.h: New files.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add acl.h, acl.c.
+
+2002-02-24 Jim Meyering <meyering@lucent.com>
+
+ * lib/strnlen.c (strnlen): Define-away/undef so that an inconsistent
+ prototype in string.h (on at least AIX4.3.2.0 w/gcc-2.95.3) doesn't
+ cause trouble. Reported by Nelson Beebe.
+
+2002-02-23 Paul Eggert <eggert@twinsun.com>
+
+ * lib/path-concat.c (xpath_concat): Reorder code to pacify
+ compilers that don't know that xalloc_die never returns.
+
+2002-02-20 Jim Meyering <meyering@lucent.com>
+
+ * lib/getdate.c: Regenerate using bison-1.33.
+
+2002-02-17 Jim Meyering <meyering@lucent.com>
+
+ * config/config.guess (main): Don't use `head -1'; it's no longer
+ portable. Use `sed 1q' instead.
+
+2002-02-16 gettextize <bug-gnu-gettext@gnu.org>
+
+ * m4/codeset.m4: Upgrade to gettext-0.11.
+ * m4/gettext.m4: Upgrade to gettext-0.11.
+ * m4/glibc21.m4: Upgrade to gettext-0.11.
+ * m4/iconv.m4: Upgrade to gettext-0.11.
+ * m4/isc-posix.m4: Upgrade to gettext-0.11.
+ * m4/lcmessage.m4: Upgrade to gettext-0.11.
+ * m4/lib-ld.m4: New file, from gettext-0.11.
+ * m4/lib-link.m4: New file, from gettext-0.11.
+ * m4/lib-prefix.m4: New file, from gettext-0.11.
+ * m4/progtest.m4: Upgrade to gettext-0.11.
+
+2002-02-15 Paul Eggert <eggert@twinsun.com>
+
+ * m4/prereq.m4 (jm_PREREQ_POSIXVER): New macro.
+ (jm_PREREQ): Use it.
+
+2002-02-15 Paul Eggert <eggert@twinsun.com>
+
+ * lib/posixver.c, lib/posixver.h: New files.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add them.
+
+2002-02-02 Paul Eggert <eggert@twinsun.com>
+ Bruno Haible <bruno@clisp.org>
+
+ * lib/unicodeio.h (print_unicode_char): Add exit_on_error argument.
+ (fwrite_success_callback): New declaration.
+ * lib/unicodeio.c (unicode_to_mb): New function, extracted from
+ print_unicode_char. Call failure callback instead of error.
+ (fwrite_success_callback): New function.
+ (exit_failure_callback): New function.
+ (fallback_failure_callback): New function.
+ (print_unicode_char): Call unicode_to_mb.
+
+2002-01-26 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Require autoconf-2.52g.
+ * m4/strnlen.m4: Remove file, now that it's part of autoconf.
+
+2002-01-26 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (getdate$U.o): Depend on unlocked-io.h.
+
+2002-01-22 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Require AC_FUNC_FSEEKO.
+
+2002-01-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (Makefile): Don't depend on $(BUILT_SOURCES).
+ Otherwise, some versions of automake would omit the rule that makes
+ Makefile from Makefile.in.
+
+2002-01-21 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xmemcoll.h, lib/xmemcoll.c: New files.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add them.
+ * lib/memcoll.c: Include errno.h, and declare errno if not defined.
+ (memcoll): Set errno to zero if there is no error.
+
+ * lib/quotearg.c (quotearg_buffer_restyled):
+ Fix bug with quoting buffers containing NUL when backslashing escapes.
+ This bug was exposed by the other changes in this patch.
+ (quotearg_n_options): New arg ARGSIZE.
+ All callers changed.
+ (quoting_options_from_style): New function.
+ (quotearg_n_style): Use it.
+ (quotearg_n_style_mem): New function.
+
+ * lib/quotearg.h (quotearg_n_style_mem): New function.
+
+2002-01-19 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Use AC_FUNC_STRNLEN.
+ Remove useless quotes: DF_PROG="df".
+ * m4/strnlen.m4: New file.
+
+2002-01-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/backupfile.c (ISDIGIT): Comment fix.
+ * lib/getdate.y (ISDIGIT): Likewise.
+ * lib/posixtm.c (ISDIGIT, year): Likewise.
+ * lib/strverscmp.c (ISDIGIT): Likewise.
+ * lib/userspec.c (ISDIGIT): Likewise.
+
+2002-01-16 Jim Meyering <meyering@lucent.com>
+
+ * lib/getdate.y: Add three semicolons, each just before a closing
+ brace. Bison (as of version 1.31) no longer papers over that mistake.
+
+2002-01-05 Jim Meyering <meyering@lucent.com>
+
+ * lib/version-etc.c (version_etc_copyright): Update copyright year.
+
+2001-12-19 Paul Eggert <eggert@twinsun.com>
+
+ * lib/closeout.c (close_stdout_status): If ferror (stdout), do
+ not silently exit merely because the output buffer happens to
+ have nothing pending.
+
+2001-12-18 Paul Eggert <eggert@twinsun.com>
+
+ See the big note in ../ChangeLog.
+ * lib/human.c (suffixes): Prefer K to k for 1024.
+ (generate_suffix_backwards): New function.
+ (human_readable_inexact): Use it.
+ * lib/xstrtol.c (__xstrtol): If there is no number but there
+ is a valid suffix, assume 1. "MB" now means decimal, "MiB" binary.
+ Accept 'K' as well as 'k'.
+
+2001-12-15 Jim Meyering <meyering@lucent.com>
+
+ * lib/regex.h (__restrict_arr): Update from libc.
+
+ * lib/mountlist.h (ME_REMOTE): Recognize file systems of type smbfs
+ as `remote' if the name starts with `//'. Suggested by Michael Stone.
+ (STREQ): Define.
+
+2001-12-14 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Check for iswspace.
+ Suggestion from Bruno Haible.
+
+2001-12-10 Jim Meyering <meyering@lucent.com>
+
+ * lib/linebuffer.c: Remove explicit declarations of xmalloc and
+ xrealloc, Instead, include "xalloc.h".
+ (initbuffer): Don't cast xmalloc return value to char*.
+ (readline): Reword comment.
+ Don't cast xrealloc return value to char*
+ Return NULL, not 0.
+
+2001-12-09 Jim Meyering <meyering@lucent.com>
+
+ * lib/modechange.c (mode_compile): Add cast to avoid pedantic warning
+ about `signed and unsigned type in conditional expression'.
+ * lib/posixtm.c (posix_time_parse): Likewise.
+
+ * lib/xreadlink.c (xreadlink): Add cast to avoid a pedantic warning.
+
+ * lib/readtokens.c (readtoken): Declare an index to be of type unsigned
+ to avoid a pedantic warning.
+
+ * lib/getstr.c: Don't include assert.h.
+ (getstr): Remove warning-evoking assertions.
+ Return -1 if offset parameter is out of bounds.
+ Change the type of a local from int to size_t.
+
+ * lib/strftime.c (my_strftime_localtime_r): Include this function
+ definition in the `#if ! HAVE_TM_GMTOFF' block.
+
+ * lib/xgethostname.c: Remove declarations of xmalloc and xrealloc.
+ Include xalloc.h instead.
+
+2001-12-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/tempname.c: Don't declare getenv, thus reverting the change of
+ 2001-11-18. It's no longer necessary, now that stdlib.h is always
+ included.
+
+ * lib/regex.c [!__BOUNDED_POINTERS__]: Define away __bounded,
+ __unbounded, and __ptrvalue. Reported by Uwe H. Steinfeld.
+
+2001-11-30 Akim Demaille <akim@epita.fr>
+
+ * lib/xstrdup.c: Include xalloc.h, so that xstrdup is declared
+ before being defined.
+
+2001-11-27 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.h (quotearg_n, quotearg_n_style):
+ First arg is int, not unsigned.
+ * lib/quotearg.c (quotearg_n, quotearg_n_style): Likewise.
+ (SIZE_MAX, UINT_MAX): New macros.
+ (quotearg_n_options): Abort if N is negative.
+ Avoid overflow check on hosts where size_t is 64 bits and int
+ is 32 bits, as overflow is impossible there.
+ Fix off-by-one typo that caused unnecessary reallocation.
+
+2001-11-27 Jim Meyering <meyering@lucent.com>
+
+ * lib/tempname.c: Merge with version from libc.
+ * lib/regex.c: Likewise.
+
+ * lib/tempname.c: Include stdlib.h unconditionally. On some old
+ systems for which STDC_HEADERS is 0, it was not included, resulting in
+ a warning about an integer-to-pointer conversion problem with getenv.
+ Reported by Volker Borchert.
+
+2001-11-26 Jim Meyering <meyering@lucent.com>
+
+ * lib/gtod.h: Remove file.
+ * lib/Makefile.am (libfetish_a_SOURCES): Remove gtod.h.
+ * lib/gettimeofday.c: Don't include gtod.h.
+ (GTOD_init): Remove function.
+ (rpl_gettimeofday): Do its job here instead, rather than aborting.
+ Suggestion from Volker Borchert.
+
+2001-11-23 Jim Meyering <meyering@lucent.com>
+
+ * lib/hash.h (struct hash_table): Don't define here. Merely declare
+ it.
+ * lib/hash.c (struct hash_table): Define it here instead.
+
+2001-11-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/hash.h: Bracket contents of file with #ifndef HASH_H_ ... #endif.
+
+2001-11-20 Jim Meyering <meyering@lucent.com>
+
+ * m4/mkstemp.m4 (UTILS_FUNC_MKSTEMP): Update comment to reflect that
+ SunOS 4.1.4 and Solaris 2.5.1 lose, too.
+
+2001-11-19 Jim Meyering <meyering@lucent.com>
+
+ * m4/mkstemp.m4 (UTILS_FUNC_MKSTEMP): Don't bother with a temporary
+ directory. Use "conftestXXXXXX" as the template.
+ Suggestion from Paul Eggert.
+
+ * m4/mkstemp.m4 (UTILS_FUNC_MKSTEMP): Close each descriptor
+ immediately, so the test doesn't mistakenly hit the max-open-files
+ limit.
+
+2001-11-18 Paul Eggert <eggert@twinsun.com>
+
+ * lib/tempname.c (TMP_MAX): Remove; no longer needed.
+ (TEMPORARIES): New macro.
+ (__gen_tempname): Use TEMPORARIES rather than TMP_MAX. This
+ removes an artificial limitation (e.g. HP-UX 10.20, where
+ TMP_MAX is 17576).
+
+2001-11-18 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_TEMPNAME): Check for declaration of getenv.
+
+2001-11-18 Jim Meyering <meyering@lucent.com>
+
+ * lib/tempname.c [!HAVE_DECL_GETENV]: Declare getenv to avoid warning
+ on SunOS 4.
+
+ * lib/Makefile.am (Makefile): Depend on $(BUILT_SOURCES), so those
+ files will be created before anything else.
+
+2001-11-17 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-winsz1.m4 (jm_WINSIZE_IN_PTEM): Do not define
+ WINSIZE_IN_PTEM if <termios.h> defines struct winsize.
+
+2001-11-17 Jim Meyering <meyering@lucent.com>
+
+ * m4/mkstemp.m4 (UTILS_FUNC_MKSTEMP): New file and macro.
+ Prompted by a report from Bob Proulx.
+
+ * m4/jm-macros.m4 (jm_MACROS): Don't test for mkstemp here.
+ Instead, require UTILS_FUNC_MKSTEMP.
+
+2001-11-17 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Remove code to set POW_LIBM.
+ Now, that's done as part of AC_FUNC_STRTOD.
+
+2001-11-17 Jim Meyering <meyering@lucent.com>
+
+ * lib/modechange.c (mode_adjust): Fix error introduced on 1999-04-26
+ that made e.g., `chmod a=,o=w,g=o F' cause F to be group readable
+ rather than group writable. Patch by Juan F. Codagnone.
+
+ * lib/readtokens.c: Remove explicit declarations of xmalloc and
+ xrealloc, Instead, include "xalloc.h".
+
+ * lib/mountlist.c: Include unlocked-io.h after all system headers.
+ Remove explicit declarations of xmalloc, xrealloc,
+ and xstrdup. Instead, include "xalloc.h".
+
+ * lib/argmatch.c, closeout.c, error.c, exclude.c: Include
+ unlocked-io.h.
+ * lib/fatal.c, getdate.y, getpass.c, getstr.c, getusershell.c:
+ Likewise.
+ * lib/mountlist.c, posixtm.c, readtokens.c, readutmp.c: Likewise.
+
+ * lib/regex.c, sha.c, version-etc.c, yesno.c: Likewise.
+ Reported by Padraig Brady.
+
+ * lib/mkstemp.c: #undef mkstemp.
+ Include config.h.
+ (rpl_mkstemp): Rename from mkstemp.
+ Protoize.
+
+2001-11-16 Jim Meyering <meyering@lucent.com>
+
+ * lib/physmem.c [HAVE_SYS_PSTAT_H]: Include <sys/pstat.h>.
+ (physmem_total) [HAVE_PSTAT_GETSTATIC]: If sysconf couldn't be used to
+ determine the amount of total physical memory, use pstat_getstatic.
+ HPUX-11 doesn't define _SC_PHYS_PAGES.
+ (physmem_available) [HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC]:
+ If sysconf couldn't be used to determine the amount of available
+ physical memory, use both pstat_getstatic and pstat_getdynamic.
+ Based on a patch from Bob Proulx.
+
+2001-11-10 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_PHYSMEM): New function.
+ (jm_PREREQ): Use it.
+
+2001-11-09 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Require autoconf-2.52f.
+ (AC_FUNC_ERROR_AT_LINE, AC_FUNC_OBSTACK, AC_FUNC_STRTOD):
+ Use these AC_-prefixed names, not the AM_-prefixed ones.
+
+ * m4/afs.m4 (jm_AFS): Quote the body. Patch by Akim Demaille.
+
+2001-11-05 Jim Meyering <meyering@lucent.com>
+
+ * lib/xstat.in (slash_aware_lstat): Correct a misleading comment.
+
+2001-11-04 Jim Meyering <meyering@lucent.com>
+
+ * m4/fpending.m4: Remove unused cruft that saved, set, and restored
+ $DEFS.
+
+2001-11-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-glibc-io.m4n (jm_FUNC_GLIBC_UNLOCKED_IO): Quote first arg
+ of AC_DEFUN.
+
+ * m4/dirfd.m4 (UTILS_FUNC_DIRFD): Rework so dirfd.c doesn't have to
+ know the name of the variable in the macro definition.
+
+2001-11-03 Jim Meyering <meyering@lucent.com>
+
+ * lib/argmatch.h (ARGMATCH_TO_ARGUMENT): Remove casts of first two args
+ in argmatch_to_argument call.
+
+ * lib/dirfd.c (dirfd): Reflect the fact that DIR_TO_FD now takes an
+ argument.
+
+ * lib/hash.c (hash_clear): Fix a bug that could lead to an infloop or
+ e.g., a fault due to an attempt to free a NULL pointer.
+
+2001-11-01 Jim Meyering <meyering@lucent.com>
+
+ * m4/dirfd.m4 (UTILS_FUNC_DIRFD): New macro.
+ * m4/jm-macros.m4 (jm_MACROS): Require UTILS_FUNC_DIRFD.
+
+2001-11-01 Jim Meyering <meyering@lucent.com>
+
+ * lib/dirfd.c, lib/dirfd.h: New files.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add dirfd.h.
+
+ * lib/hash.c (hash_print) [TESTING]: Clean up.
+
+2001-10-22 Paul Eggert <eggert@twinsun.com>
+
+ * lib/hard-locale.c (alloca): Define to __builtin_alloca if __GNUC__,
+ to avoid a warning if -Wall.
+
+2001-10-22 Jeff Bailey <jbailey@outpost.dnsalias.org>
+
+ * README: New file
+ * doc/*: Add COPYING, COPYING.LIB, COPYING.DOC, fdl.texi
+ (per RMS's instructions, this is now the canonical source)
+ * lgpl/, gpl/: New directories.
+
+2001-10-21 Paul Eggert <eggert@twinsun.com>
+
+ * lib/regex.c (uintptr_t): Remove macro and decl; it's config.h's job.
+
+2001-10-21 Jim Meyering <meyering@lucent.com>
+
+ * lib/obstack.c (_): Honor the setting of ENABLE_NLS. Otherwise,
+ this code would end up calling gettext even in packages built
+ with --disable-nls.
+ * lib/getopt.c (_): Likewise.
+ * lib/regex.c (_): Likewise.
+
+2001-10-20 Paul Eggert <eggert@twinsun.com>
+
+ * m4/error.m4 (jm_PREREQ_ERROR):
+ Do not invoke AC_CHECK_FUNCS with strerror_r, as
+ AC_FUNC_STRERROR_R does that.
+ Check for strerror declaration.
+
+ * m4/strerror_r.m4: Add copyright notice, as nontrivial m4 files
+ are supposed to have them these days.
+ (AC_FUNC_STRERROR_R): Always do char* test, so that it gets cached.
+ Merge changes from latest Autoconf CVS.
+ Rename ac_cv_func_strerror_r_works to ac_cv_func_strerror_r_char_p,
+ and rename HAVE_WORKING_STRERROR_R to STRERROR_R_CHAR_P, since
+ POSIX decided to standardize on the int flavor of strerror_r.
+
+2001-10-20 Paul Eggert <eggert@twinsun.com>
+
+ * lib/error.c (strerror_r): Do not declare unless !_LIBC.
+ Do not check for HAVE_DECL_STRERROR_R missing unless STRERROR_R_CHAR_P.
+ Use strerror_r that is only a macro, even if it is not a function.
+ (strerror): Check for HAVE_DECL_STRERROR before declaring.
+ (private_strerror): Use prototypes, not old-style function definition.
+ (print_errno_message): New function.
+ Support the POSIX 'int'-flavored strerror_r, as well as the traditional
+ char*-flavored one.
+ (error_tail, error, error_at_line): Use it.
+
+2001-10-11 Jim Meyering <meyering@lucent.com>
+
+ * lib/argmatch.c (argmatch_invalid): Use quotearg_n_style (0, ...
+ and quote_n (1, ... to avoid clobbering a buffer.
+
+2001-10-05 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am: (libfetish_a_SOURCES): Add hash-pjw.c and
+ hash-pjw.h.
+ * lib/hash-pjw.c: New file (factored out of fileutils' remove.c).
+ * lib/hash-pjw.h: New file.
+
+2001-09-30 Jim Meyering <meyering@lucent.com>
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): See if
+ `struct fsstat' has the `f_fstypename' member.
+ Use that to define FS_TYPE, which is now used to make
+ the getfsstat link test tighter.
+
+2001-09-30 Jim Meyering <meyering@lucent.com>
+
+ * lib/mountlist.c [MOUNTED_GETFSSTAT]:
+ Include <sys/ucred.h>, for Apple Darwin.
+ Include sys/mount.h and sys/fs_types.h only if available.
+ (FS_TYPE): Define.
+ (read_filesystem_list): Use FS_TYPE.
+
+2001-09-29 Paul Eggert <eggert@twinsun.com>
+
+ * lib/exclude.c (excluded_filename): 0 -> false, since it's
+ a boolean context.
+
+2001-09-29 Jim Meyering <meyering@lucent.com>
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS)
+ [one-argument getmntent function]): Include stdio.h before mntent.h.
+ SunOS 4.1.x needs it for the declaration of `FILE'.
+ Patch by Volker Borchert.
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS)
+ Check for these headers: sys/param.h sys/ucred.h sys/mount.h
+ sys/fs_types.h, and make the link-test for getfsstat guard #include
+ directives with appropriate #if HAVE_*_H tests so that we can
+ detect getfsstat on Apple Darwin1.3.7 systems.
+ Reported by Nelson Beebe.
+ Fix harmless typo in cache variable name: s/getsstat/getfsstat/.
+
+2001-09-28 Paul Eggert <eggert@twinsun.com>
+
+ Fix bug reported by Petter Reinholdtsen for HP-UX 10.20, which
+ #defines strtoimax. Also treat the other strto* functions
+ like strtoimax.
+
+ * m4/xstrtoimax.m4 (jm_AC_PREREQ_XSTRTOIMAX):
+ Check for strtoul and strtoumax,
+ as those declarations are made even in the signed case.
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX):
+ Likewise, for strtol and strtoimax.
+
+2001-09-28 Paul Eggert <eggert@twinsun.com>
+
+ Fix bug reported by Petter Reinholdtsen for HP-UX 10.20, which
+ #defines strtoimax. Also treat the other strto* functions
+ like strtoimax.
+
+ * lib/xstrtol.c (strtol): Do not declare if HAVE_DECL_STRTOL.
+ (strtoul): Do not declare if HAVE_DECL_STRTOUL.
+ (strtoimax, strtoumax): Do not declare if already defined as a macro.
+
+2001-09-26 Jim Meyering <meyering@lucent.com>
+
+ Most macros in unlocked-io.h had the wrong number of arguments.
+ * lib/gen-uio: New script.
+ (USE_UNLOCKED_IO): Define to 1 if not already defined.
+ * lib/unlocked-io.hin: Remove file.
+ * lib/Makefile.am (unlocked-io.h): Rewrite to use a separate script,
+ rather than trying to embed it here.
+ (EXTRA_DIST): Add gen-uio. Remove unlocked-io.hin
+ Reported by Padraig Brady.
+
+2001-09-25 Volker Borchert <bt@teknon.de>
+
+ * lib/gettimeofday.c (rpl_gettimeofday): Declare local variable
+ `result'.
+
+2001-09-24 Jim Meyering <meyering@lucent.com>
+
+ * m4/gettext.m4: Use the version from gettext-0.10.40, not CVS.
+
+2001-09-23 Jim Meyering <meyering@lucent.com>
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Add a compile-test
+ instead of the mere test for existence of mntent.h. The latter
+ would get a false-positive on AIX 3.4 systems.
+ In the outer getmntent if-block, don't die if neither of the getmntent
+ tests succeeds. Instead, just fall through and continue with the
+ remaining tests.
+
+2001-09-23 Jim Meyering <meyering@lucent.com>
+
+ * lib/mountlist.c: Remove useless parentheses in #if directives.
+ (MOUNTED) [!defined MOUNTED]: Define to _PATH_MOUNTED, for when
+ the deprecated MOUNTED symbol is no longer defined in mntent.h.
+
+2001-09-22 Jim Meyering <meyering@lucent.com>
+
+ * m4/gettext.m4: New file. From gettext.
+ * m4/lcmessage.m4: Sync with gettext -- this changes only comments.
+ * m4/progtest.m4: Likewise
+ * m4/isc-posix.m4: Decrement serial number to sync with gettext.
+ * m4/glibc21.m4: Likewise.
+
+ * m4/libintl.m4: Remove. No longer used.
+
+2001-09-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/localcharset.c: Update from latest gettext.
+ * lib/config.charset: Likewise.
+
+2001-09-20 Jim Meyering <meyering@lucent.com>
+
+ * m4/xstrtoimax.m4 (jm_AC_PREREQ_XSTRTOIMAX): Check for declaration of
+ strtoimax.
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX): Check for declaration of
+ strtoumax.
+
+2001-09-20 Jim Meyering <meyering@lucent.com>
+
+ * lib/xstrtol.c (strtoimax): Guard declaration with
+ `#if !HAVE_DECL_STRTOIMAX', rather than just `#ifndef strtoimax'.
+ The latter fails because some systems (at least rs6000-ibm-aix4.3.3.0)
+ have their own, conflicting declaration of strtoimax in sys/inttypes.h.
+ (strtoumax): Likewise, for completeness (it wasn't necessary).
+
+2001-09-17 Paul Eggert <eggert@twinsun.com>
+
+ * lib/strtoimax.c (HAVE_LONG_LONG):
+ Redefine to HAVE_UNSIGNED_LONG_LONG if unsigned.
+ (strtoimax): Use sizeof (long), not sizeof strtol (ptr, endptr, base),
+ to work around bug in IBM C compiler.
+
+2001-09-17 Jim Meyering <meyering@lucent.com>
+
+ * m4/chown.m4, fstypename.m4, getgroups.m4, gettimeofday.m4,
+ * m4/jm-mktime.m4, lstat.m4, malloc.m4, memcmp.m4, mkdir-slash.m4,
+ * m4/nanosleep.m4, putenv.m4, readdir.m4, realloc.m4, rename.m4,
+ * m4/st_dm_mode.m4, stat.m4, strerror_r.m4, timespec.m4, utimbuf.m4,
+ * m4/utimes.m4: Use AC_DEFINE rather than AC_DEFINE_UNQUOTED,
+ whenever the right hand side need not be expanded by the shell.
+
+2001-09-16 Paul Eggert <eggert@twinsun.com>
+
+ * m4/fnmatch.m4 (jm_FUNC_FNMATCH): Remove test for GNU C
+ library. It's not correct, as some older glibcs are buggy.
+ fnmatch wasn't fixed until glibc 2.2.
+
+ Use AC_DEFINE, not AC_DEFINE_UNQUOTED, as there's no
+ special shell magic here.
+
+2001-09-16 Jim Meyering <meyering@lucent.com>
+
+ * m4/mkdir-slash.m4 (UTILS_FUNC_MKDIR_TRAILING_SLASH): New file/macro.
+ * m4/jm-macros.m4: Require it.
+
+2001-09-16 Jim Meyering <meyering@lucent.com>
+
+ * lib/mkdir.c: New file.
+
+2001-09-15 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Check for help2man.
+
+2001-09-11 Jim Meyering <meyering@lucent.com>
+
+ * m4/host-os.m4 (UTILS_HOST_OS): New file/macro.
+ The body, by Paul Eggert, was moved here from configure.in.
+ * m4/jm-macros.m4: Require UTILS_HOST_OS.
+
+2001-09-04 Paul Eggert <eggert@twinsun.com>
+
+ * m4/prereq.m4 (jm_PREREQ_XREADLINK): New macro.
+ (jm_PREREQ): Use it.
+
+2001-09-04 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xreadlink.c (xreadlink): Omit size_t* arg. All uses changed.
+ Use ssize_t, not int, to store result of readlink.
+ Check for ssize_t overflow as well as size_t overflow,
+ as POSIX says the result of readlink is implementation-defined
+ when ssize_t overflows.
+ Remove unnecessary cast to char*.
+ Use free+malloc instead of realloc, as the storage doesn't need
+ to be preserved and it's clearer and can be more efficient that way.
+ (SIZE_MAX, SSIZE_MAX): New macros, if <limits.h> doesn't declare.
+ * lib/xreadlink.h (xreadlink): Update prototype.
+
+2001-09-04 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xgetcwd.c: Revert some of the previous change; intead,
+ fix the HAVE_GETCWD_NULL code to behave more like the
+ !HAVE_GETCWD_NULL code used to.
+
+ Include "xalloc.h".
+ (xgetcwd): Do not return NULL when memory is exhausted; instead,
+ invoke xalloc_die.
+
+2001-09-03 Paul Eggert <eggert@twinsun.com>
+
+ * m4/prereq.m4 (jm_PREREQ_XGETCWD): Check for limits.h and
+ sys/param.h, as pathmax.h includes them.
+
+2001-09-03 Paul Eggert <eggert@twinsun.com>
+
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_XGETCWD.
+ (jm_PREREQ_XGETCWD): New macro.
+
+ * m4/getcwd.m4: New file.
+
+2001-09-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xgetcwd.c: Fix the !HAVE_GETCWD_NULL code to behave more
+ like the HAVE_GETCWD_NULL code.
+ Include pathmax.h if not HAVE_GETCWD.
+ Do not include xalloc.h.
+ (INITIAL_BUFFER_SIZE): New symbol.
+ Do not use xmalloc / xrealloc, since the caller is responsible for
+ handling errors. Preserve errno around `free' during failure.
+ Do not overrun buffer when using getwd.
+
+2001-09-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xgetcwd.c (xgetcwd): Use HAVE_GETCWD_NULL, not (defined
+ __GLIBC__ && __GLIBC__ >= 2), to decide whether to use
+ getcwd (NULL, 0).
+
+2001-09-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/exclude.c (fnmatch_no_wildcards): Fix confusion between
+ usage of FNM_CASEFOLD and FNM_LEADING_DIR. The bug was
+ spotted by Jim Meyering.
+
+2001-09-03 Jim Meyering <meyering@lucent.com>
+
+ * lib/xreadlink.c (xreadlink): Preserve errno around `free' during
+ failure.
+
+2001-09-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/error.c: Update from GNU libc.
+
+2001-09-01 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Check for canonicalize_file_name.
+ Used by df.
+
+2001-09-01 Jim Meyering <meyering@lucent.com>
+
+ * lib/xreadlink.c: New file.
+ * lib/xreadlink.h: New file.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add xreadlink.c and
+ xreadlink.h.
+
+ * lib/regex.c (uintptr_t) [!_LIBC]: Define to private_uintptr_t, so it
+ doesn't conflict with sparc Solaris 7's definition in
+ /usr/include/sys/int_types.h.
+
+ * lib/exclude.c: Use `""', not `<>' to #include non-system header
+ files.
+ (fnmatch_no_wildcards): Rewrite not to use function names, strcasecmp
+ and strncasecmp as r-values. Unixware didn't have declarations.
+
+2001-08-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xstrtol.h: Add copyright notice.
+ (_DECLARE_XSTRTOL): Improve quality of diagnostic for
+ LONGINT_INVALID_SUFFIX_CHAR.
+
+2001-08-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xstrtol.c (strtoimax): New decl.
+
+2001-08-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xgetcwd.c: Don't include pathmax.h.
+ Include stdlib.h and unistd.h if available.
+ Include xalloc.h.
+ (xmalloc, xstrdup, free): Remove decls.
+ (xgetcwd): Don't assume sizes fit in unsigned.
+ Check for overflow when computing sizes.
+ Simplify reallocation code.
+
+2001-08-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/savedir.c (savedir): Remove size parameter, as POSIX says that
+ a directory's st_size can have an arbitrary value, so the old
+ usage could waste an arbitrary amount of memory. All uses
+ changed.
+ * lib/savedir.h: Update prototype.
+
+2001-08-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Remove strtoxmax.c.
+
+ * lib/strtoimax.c: Renamed from strtoxmax.c, removing the
+ old strtoimax.c.
+
+ Also, make the following further changes to make this file's
+ configuration more similar to that of strtol.c:
+ (UNSIGNED): Renamed from STRTOUXMAX_UNSIGNED. All uses changed.
+ (strtoumax, uintmax_t, strtoull, strtol): Remove.
+ (intmax_t, strtoimax, strtol, strtoll): New macros, if UNSIGNED.
+ (strtoimax): Renamed from strtoumax. All uses of unsigned values
+ changed to signed values.
+
+ And make the following changes as well:
+ Fix copyright notice, as 1999 was missing.
+ (verify): New macro.
+ (strtoimax): Check sizes at compile-time, not run-time.
+ Prefer strtol to strtoll if both work.
+ (main): Remove; it was not that useful and was a pain to maintain.
+
+ * lib/strtoumax.c: Include strtoimax.c, not strtouxmax.c.
+
+2001-08-31 Jim Meyering <meyering@lucent.com>
+
+ * lib/xgetcwd.c (xgetcwd): Reorganize to avoid some duplication.
+ Use an initial, malloc'd, buffer of length 128 rather than
+ a statically allocated one of length 1024.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ Simplify code, partly by assuming autoconf 2.52 semantics.
+
+ * m4/Makefile.am (EXTRA_DIST): Remove uintmax_t.m4.
+
+ * m4/inttypes.m4 (AC_PREREQ): Bump to 2.52.
+ (jm_AC_HEADER_INTTYPES_H): Remove; now done by autoconf in 2.52.
+ All uses removed.
+ (jm_AC_TYPE_INTMAX_T, jm_AC_TYPE_UINTMAX_T):
+ Move AC_REQUIRE to next-to-top level, to avoid confusion.
+ Use 2.52's AC_CHECK_TYPE instead of merely looking for the header.
+ * m4/prereq.m4 (jm_PREREQ_HUMAN): Don't require
+ jm_AC_HEADER_INTTYPES_H.
+ * m4/jm-macros.m4 (jm_MACROS): Likewise.
+
+ * m4/uintmax_t.m4: Remove, as it duplicates inttypes.m4.
+
+ * m4/xstrtoimax.m4 (jm_AC_PREREQ_XSTRTOIMAX):
+ Quote first arg of AC_DEFUN.
+ Require jm_AC_TYPE_UINTMAX_T and jm_AC_TYPE_UNSIGNED_LONG_LONG
+ since they are needed to parse the include file even if we need
+ only xstrtoimax. Simplify logic behind the args to AC_REPLACE.
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX): Likewise,
+ but with opposite signedness.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ Merge 'exclude' changes from tar 1.13.22.
+ This fixes one or two unlikely storage allocation overflow bugs,
+ but doesn't change user-visible behavior otherwise.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_EXCLUDE.
+ (jm_PREREQ_EXCLUDE): New macro.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c: BSD/OS 4.1 wchar.h requires FILE and struct
+ tm to be declared.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/hash.c: Remove '2001' from copyright notice.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/full-write.h: New file.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add full-write.h.
+ * lib/full-write.c: Correct credits, as cccp.c no longer
+ exists and anyway it was so heavily changed from the old cccp
+ code as to be unrecognizable. Include full-write.h.
+ (full_write) Return size_t, with short writes meaning failure.
+ All callers changed. This fixes a bug with large buffers
+ on 64-bit hosts.
+ * lib/utime.c: Include full-write.h.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/exclude.c (bool): Declare, perhaps by including stdbool.h.
+ (<sys/types.h>): Include only if HAVE_SYS_TYPES_H.
+ (<stdlib.h>, <string.h>, <strings.h>, <inttypes.h>, <stdint.h>):
+ Include if available.
+ (<xalloc.h>): Include
+ (SIZE_MAX): Define if <stdint.h> or <inttypes.h> doesn't.
+ (verify): New macro. Use it to verify that EXCLUDE macros do not
+ collide with FNM macros.
+ (struct patopts): New struct.
+ (struct exclude): Use it, as exclude patterns now come with options.
+ (new_exclude): Support above changes.
+ (new_exclude, add_exclude_file):
+ Initial size must now be a power of two to simplify overflow checking.
+ (free_exclude, fnmatch_no_wildcards): New function.
+ (excluded_filename): No longer requires options arg, as the options
+ are determined by add_exclude. Now returns bool, not int.
+ (excluded_filename, add_exclude):
+ Add support for the fancy new exclusion options.
+ (add_exclude, add_exclude_file): Now takes int options arg.
+ Check for arithmetic overflow when computing sizes.
+ (add_exclude_file): xrealloc might modify errno, so don't
+ realloc until after errno might be used.
+
+ * lib/exclude.h (EXCLUDE_ANCHORED, EXCLUDE_INCLUDE,EXCLUDE_WILDCARDS):
+ New macros.
+ (free_exclude): New decl.
+ (add_exclude, add_exclude_file): Now takes int options arg.
+ (excluded_filename): No longer requires options arg, as the options
+ are determined by add_exclude. Now returns bool, not int.
+
+2001-08-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/alloca.c (alloca): Arg is of type size_t, not unsigned.
+
+2001-08-27 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add strtoxmax.c
+
+ * lib/version-etc.c (N_): Remove definition.
+ Revert most of last change.
+ Instead, simply don't mark the `Copyright...' string for translation.
+ Based on advice from Paul Eggert.
+
+ * lib/strtoxmax.c: Tweak comment.
+
+2001-08-26 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Require jm_AC_PREREQ_XSTRTOIMAX.
+
+ * m4/xstrtoimax.m4: New file.
+ * m4/xstrtoumax.m4: Add comments explaining why we
+ AC_REPLACE_FUNCS(strtol).
+
+2001-08-26 Jim Meyering <meyering@lucent.com>
+
+ * lib/version-etc.c (version_etc_copyright_fmt): Replace literal year
+ of copyright with `%s' so translators don't get an untranslated
+ message in 2002.
+ (COPYRIGHT_YEAR): Define.
+ (version_etc): Use fprintf rather than fputs.
+ Suggestion from Ulrich Drepper.
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add xstrtoimax.c.
+
+ * lib/strtoll.c: New file, from GNU libc.
+ * lib/xstrtoimax.c: New file.
+
+ * lib/xstrtol.h: Add xstrtoimax.
+ * lib/strtoumax.c: New file. Simply include "strtoumax.c".
+ * lib/strtoimax.c: New file. Likewise, but first define
+ STRTOUXMAX_SIGNED.
+
+ * lib/strtoumax.c: Factor to work both for unsigned and signed types,
+ ...
+ * lib/strtoxmax.c: ... then renamed to this.
+
+2001-08-18 Paul Eggert <eggert@twinsun.com>
+
+ * m4/inttypes.m4: Add AC_PREREQ(2.13).
+ (jm_AC_HEADER_INTTYPES_H): Test for intmax_t, too.
+ (jm_AC_TYPE_INTMAX_T): New macro.
+ (jm_AC_TYPE_UINTMAX_T): Moved here from uintmax_t.m4.
+
+ * m4/longlong.m4 (jm_AC_TYPE_LONG_LONG): New macro.
+
+ * m4/longlong.m4: Renamed from ulonglong.m4.
+ * m4/inttypes.m4: Renamed from inttypes_h.m4.
+ * m4/uintmax_t.m4: Removed.
+
+2001-08-13 Paul Eggert <eggert@twinsun.com>
+
+ * lib/Makefile.am (unlocked-io.h): Do not append "_unlocked" twice.
+ Port to Solaris 8, where 'sed' requires a space after the 'r'
+ command, and where sh dislikes "$/". Clean up the spacing a bit.
+ Redirect output to $tmp just once.
+
+2001-08-12 Paul Eggert <eggert@sic.twinsun.com>
+
+ * lib/addext.c (<errno.h>): Include.
+ (errno): Declare if not defined.
+ (addext): Work correctly when pathconf returns -1 and leaves
+ errno alone because there is no limit. Also, work even if
+ pathconf returns a value greater than SIZE_MAX.
+
+2001-08-12 Jim Meyering <meyering@lucent.com>
+
+ * m4/afs.m4, assert.m4, bison.m4, check-decl.m4, chown.m4, d-ino.m4,
+ d-type.m4, dos.m4, error.m4, fnmatch.m4, fpending.m4, fstypename.m4,
+ fsusage.m4, ftruncate.m4, getgroups.m4, glibc.m4, gnu-source.m4,
+ group-member.m4, jm-glibc-io.m4, jm-macros.m4, jm-mktime.m4,
+ jm-winsz1.m4, jm-winsz2.m4, lchown.m4, lib-check.m4, libintl.m4,
+ link-follow.m4, ls-mntd-fs.m4, lstat.m4, malloc.m4, mbrtowc.m4,
+ mbstate_t.m4, mbswidth.m4, memcmp.m4, nanosleep.m4, perl.m4,
+ prereq.m4, putenv.m4, readdir.m4, realloc.m4, regex.m4, rename.m4,
+ rmdir-errno.m4, search-libs.m4, st_dm_mode.m4, st_mtim.m4, stat.m4,
+ strftime.m4, timespec.m4, unlink-busy.m4, uptime.m4, utimbuf.m4,
+ utime.m4, utimes.m4, xstrtoumax.m4:
+ Quote the first argument in each use of AC_DEFUN.
+
+2001-08-12 Jim Meyering <meyering@lucent.com>
+
+ * lib/xgetcwd.c (xgetcwd) [defined __GLIBC__ && __GLIBC__ >= 2]:
+ Simply `return getcwd (NULL, 0);'.
+ [! (defined __GLIBC__ && __GLIBC__ >= 2)]:
+ Use 1300 as initial value for length, not PATH_MAX.
+
+ * lib/pathmax.h: Clean up cpp syntax.
+
+2001-08-12 Jim Meyering <meyering@lucent.com>
+
+ * lib/gettimeofday.c: New file.
+ * lib/gtod.h: New file.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add gtod.h.
+
+2001-08-05 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Require autoconf-2.52.
+
+2001-08-04 Jim Meyering <meyering@lucent.com>
+
+ * lib/error.h (__attribute__): Remove `|| __STRICT_ANSI__' from #if
+ stmt, to get in sync with glibc.
+
+2001-08-03 Paul Eggert <eggert@twinsun.com>
+
+ The following changes are from gettext 0.10.39 as maintained by
+ Bruno Haible.
+
+ * lib/mbswidth.h (MBSW_REJECT_UNPRINTABLE, MBSW_REJECT_INVALID):
+ Renamed from MBSW_ACCEPT_UNPRINTABLE and MBSW_ACCEPT_INVALID
+ with inverted sense. All uses changed.
+
+ * lib/mbswidth.c: Don't include <limits.h>.
+ Include <stdlib.h> and <string.h> unconditionally.
+ (iswcntrl, mbsinit, ISCNTRL): New macros.
+ (mbsnwidth): Use K&R style function declarations.
+ Don't bother checking for MB_LEN_MAX == 1, since the compiler
+ can optimize it when MB_CUR_MAX == 1.
+ The width of control characters is zero, not 1.
+
+2001-08-03 Paul Eggert <eggert@twinsun.com>
+
+ The following changes are from gettext 0.10.39 as maintained by
+ Bruno Haible, except that getline.m4 continues to use AC_LIBOBJ.
+
+ * m4/codeset.m4: Upgrade to serial AM1.
+ (AM_LANGINFO_CODESET): Renamed from jm_LANGINFO_CODESET;
+ all uses changed. Quote first arg of AC_DEFUN.
+ (am_cv_langinfo_codeset): Renamed from jm_cv_langinfo_codeset.
+
+ * m4/iconv.m4: Upgrade to serial AM2.
+ (AM_ICONV): Renamed from jm_ICONV; all uses changed.
+ Add --with-libconv-prefix.
+ Quote first arg of AC_DEFUN. Add description for ICONV_CONST.
+ (am_cv_func_iconv): Renamed from jm_cv_func_iconv.
+ (am_cv_lib_iconv): Renamed from jm_cv_lib_iconv.
+ (am_cv_proto_iconv): Renamed from jm_cv_proto_iconv.
+ * m4/jm-macros.m4 (jm_MACROS): Reflect s/jm_/AM_/ renamings.
+
+ * m4/c-bs-a.m4 (AC_C_BACKSLASH_A): Quote first arg of AC_DEFUN.
+ * m4/getline.m4 (AM_FUNC_GETLINE): Likewise.
+ * m4/glibc21.m4 (jm_GLIBC21): Likewise.
+ * m4/inttypes_h.m4 (jm_AC_HEADER_INTTYPES_H): Likewise.
+ * m4/isc-posix.m4 (AC_ISC_POSIX): Likewise.
+ * m4/lcmessage.m4 (AM_LC_MESSAGES): Likewise.
+ * m4/progtest.m4 (AM_PATH_PROG_WITH_TEST): Likewise.
+ * m4/uintmax_t.m4 (jm_AC_TYPE_UINTMAX_T): Likewise.
+ * m4/ulonglong.m4 (jm_AC_TYPE_UNSIGNED_LONG_LONG): Likewise.
+
+ * m4/getline.m4 (AM_FUNC_GETLINE): Don't bother checking for
+ string.h any more.
+
+ * m4/progtest.m4 (AM_PATH_PROG_WITH_TEST): If not found, print "no",
+ not the default value.
+
+ 2001-06-25 Bruno Haible <haible@clisp.cons.org>
+ * m4/mbswidth.m4 (jm_PREREQ_MBSWIDTH): Don't require AM_C_PROTOTYPES.
+ Also check for mbsinit. Needed for SCO 3.2v5.0.2.
+ Also include <string.h>; this is where AIX 3.2.5 declares wcwidth.
+ Also check for iswcntrl, used for wcwidth fallback.
+ Use AC_TRY_COMPILE to emulate AC_CHECK_DECLS, for portability
+ to Autoconf 2.13.
+
+2001-08-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/mbrtowc.m4 (jm_FUNC_MBRTOWC): Use `#include', not `@%:@include',
+ as it was in the original. Reported by Paul Eggert.
+
+2001-07-16 Jim Meyering <meyering@lucent.com>
+
+ * m4/gettimeofday.m4: New file.
+ Prompted by a report from Bernhard Baehr.
+
+2001-07-15 Jim Meyering <meyering@lucent.com>
+
+ * m4/Makefile.am.in (Makefile.am): Remove most of the unlocked-io.h
+ stuff. Now it's in ../Makefile.cfg.
+
+2001-07-15 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (EXTRA_DIST): Add unlocked-io.hin.
+ (BUILT_SOURCES): Add unlocked-io.h.
+ (io_functions): Define.
+ (unlocked-io.h): New rule.
+ (DISTCLEANFILES): Add unlocked-io.h.
+ (all-local): Depend on unlocked-io.h, to ensure it is created.
+
+ * lib/unlocked-io.hin: New file
+
+ * lib/regex.c: Update from glibc.
+
+2001-07-05 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (noinst_HEADERS): Remove definition, per new automake
+ recommendation.
+ (libfetish_a_SOURCES): Put all .h files here instead.
+ Remove a thus-exposed (better checks in automake) duplicate and
+ two unnecessary .h files.
+
+2001-07-04 Jim Meyering <meyering@lucent.com>
+
+ * m4/Makefile.am.in (glibc-io.struct): New target. Rework the code
+ that generates jm-glibc-io.m4 so that it doesn't trigger any make
+ distcheck failure.
+
+2001-07-02 Jim Meyering <meyering@lucent.com>
+
+ The following changes were prompted by suggestions from Bruno Haible.
+
+ * m4/jm-glibc-io.m4n: New file, the template from which jm-glibc-io.m4
+ is now generated.
+ * m4/Makefile.am.in (Makefile.am): Include jm-glibc-io.m4n in emitted
+ definition of EXTRA_DIST.
+ (Makefile.am): Emit the dependency, `all-local: jm-glibc-io.m4' to
+ ensure that the generated file is created/updated whenever the list
+ of $(unlocked_functions) is changed.
+ (jm-glibc-io.m4): New rule.
+ (unlocked-io.h): New rule -- currently unused.
+
+2001-06-24 Jim Meyering <meyering@lucent.com>
+
+ * m4/regex.m4 (jm_INCLUDED_REGEX): Use a quadrigraph to represent an
+ unmatched right bracket, rather than kludging it with an extra,
+ falsely-matching quote in a comment. Patch by Akim Demaille.
+
+2001-06-11 Jim Meyering <meyering@lucent.com>
+
+ * lib/regex.c: Update from GNU libc.
+
+2001-05-27 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_READUTMP): Check for ut_type in struct utmpx.
+ Check for ut_type in struct utmp.
+
+2001-05-27 Jim Meyering <meyering@lucent.com>
+
+ * lib/readutmp.h (UT_TYPE): Define.
+
+2001-05-24 Jim Meyering <meyering@lucent.com>
+
+ * lib/argmatch.c: Include "quote.h".
+ (argmatch_invalid): Remove explicit `' quotes. Instead, use the
+ quote function. Reported by Göran Uddeborg.
+
+2001-05-22 Jim Meyering <meyering@lucent.com>
+
+ * m4/strftime.m4 (_jm_STRFTIME_PREREQS): Don't use AC_LIBOBJ(strftime),
+ now that we use the package-supplied version unconditionally.
+ (jm_FUNC_STRFTIME): Don't replace strftime, for the same reason.
+
+2001-05-21 Jim Meyering <meyering@lucent.com>
+
+ * m4/regex.m4: Change a couple backticks to single quotes to avoid
+ shell syntax errors.
+
+2001-05-21 Alexandre Duret-Lutz <duret_g@epita.fr>
+
+ * m4/dos.m4 (jm_AC_DOS): Check for _WIN32, __WIN32__, and __MSDOS__.
+
+2001-05-20 Paul Eggert <eggert@twinsun.com>
+
+ * m4/strftime.m4 (jm_FUNC_GNU_STRFTIME):
+ Don't bother to check library strftime, since
+ we'll be using our own my_strftime function anyway.
+ Define my_strftime instead of strftime.
+
+2001-05-20 Alexandre Duret-Lutz <duret_g@epita.fr>
+
+ * lib/dirname.c (dir_name): Compute append_dot using path, not newpath
+ which is not yet declared.
+
+2001-05-15 Jim Meyering <meyering@lucent.com>
+
+ * m4/regex.m4: Use proper quoting so brackets appear in the test
+ program.
+ Reported by, and with help from, Bruno Haible.
+
+2001-05-13 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (major_t, minor_t): Define to unsigned int if
+ undefined.
+
+2001-05-11 Paul Eggert <eggert@twinsun.com>
+
+ dirname code cleanup. base_name now behaves more compatibly
+ with POSIX basename when given file names that have trailing
+ slashes, and similarly for dir_name. Add new primitives
+ base_len and dir_len. Put the directory-name-related decls
+ into dirname.h.
+
+ * lib/addext.c (ISSLASH, base_name): Remove; now in dirname.h.
+ * lib/backupfile.c (base_name): Likewise.
+ * lib/basename.c (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Likewise.
+ * lib/dirname.c (FILESYSTEM_PREFIX_LEN, ISSLASH): Likewise.
+ * lib/makepath.c (strip_trailing_slashes): Likewise.
+ * lib/path-concat.c (DIRECTORY_SEPARATOR, FILESYSTEM_PREFIX_LEN,
+ ISSLASH): Likewise.
+ * lib/rename.c (strip_trailing_slashes): Likewise.
+ * lib/same.c (base_name): Likewise.
+ * lib/stripslash.c (ISSLASH): Likewise.
+
+ * lib/addext.c: Include <dirname.h> after size_t is defined.
+ * lib/backupfile.c: Likewise.
+
+ * lib/addext.c (addext): Use base_len to trim redundant
+ trailing slashes instead of doing it ourselves.
+ But do not trim the last slash if it is not redundant.
+
+ * lib/backupfile.c (find_backup_file_name,
+ max_backup_version): Use base_len instead of rolling it ourselves.
+ Handle the case of "" and (on DOS) "C:" correctly.
+
+ * lib/basename.c: Do not include <stdio.h>, <assert.h>; no longer
+ needed. Include <string.h>, <dirname.h>.
+ (base_name): Allow file names ending in slashes, other than names
+ that are all slashes. In this case, return the basename followed
+ by the slashes. This is more general, and can be used in places
+ where the original base_name purposely had an assertion failure.
+ (base_len): New function.
+
+ * lib/dirname.c: Include <string.h> instead of <stdlib.h>.
+ Do not include <assert.h>; no longer needed.
+ Include xalloc.h.
+ (memrchr): Remove decl.
+ (dir_name_r): Remove.
+ (dir_len): Renamed from dirlen. All callers changed.
+ Rewrite in terms of base_name, for simplicity and consistency.
+ (dir_name): Never return NULL. All callers changed.
+ Do not include <stdlib.h> in test program; no longer needed.
+ return 0; is fine for test program.
+
+ * lib/dirname.h (DIRECTORY_SEPARATOR, ISSLASH, FILESYSTEM_PREFIX_LEN):
+ New macros.
+ (base_name, base_len, dir_len, strip_trailing_slashes): New decls.
+
+ * lib/path-concat.c (path_concat): Use base_len to compute
+ base length, not strlen; this means we cannot rely on memcpy
+ to null-terminate.
+
+ * lib/same.c (STREQ): Remove.
+ (same_name): Handle the case where the basename ends in trailing '/'.
+
+ * lib/stripslash.c (strip_trailing_slashes): Return nonzero if
+ a slash was stripped. Do not strip the last slash after a
+ file system prefix.
+
+2001-05-11 Paul Eggert <eggert@twinsun.com>
+
+ * lib/Makefile.am (libfetish_a_SOURCES):
+ Add strftime.c, since we now compile it on all hosts.
+
+ * lib/strftime.c (my_strftime):
+ Define to nstrftime if emacs, but only if my_strftime is not defined.
+ (extra_args, extra_args_spec, extra_args_spec_iso): Rename from
+ ut_argument, ut_argument_spec, ut_argument_spec_iso, respectively.
+ Add one more extra argument: a nanoseconds value.
+ All uses changed.
+ (ns): New macro.
+ (my_strftime function): Add %N format.
+ (emacs_strftimeu): Renamed from emacs_strftime,
+ with extra ut argument.
+
+2001-05-09 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Do not check for fseeko; no longer used.
+
+2001-04-21 Jim Meyering <meyering@lucent.com>
+
+ * m4/rmdir-errno.m4: Write to a new file, so that a restrictive umask
+ doesn't interfere.
+
+2001-04-21 Alexandre Duret-Lutz <duret_g@epita.fr>
+
+ * m4/ftruncate.m4: Check for chsize.
+ Link with ftruncate.o unconditionally if ftruncate is missing.
+ This was required when cross-compiling to i586-mingw32msvc.
+
+2001-04-08 Jim Meyering <meyering@lucent.com>
+
+ * lib/getdate.y (get_date): Set tm_isdst to -1 to ensure that it is
+ recomputed; that's necessary when the offset spans a DST transition.
+ Patch by David J. MacKenzie. Reported by Hon-Yin Kok.
+
+2001-04-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/regex.h, regex.c: Update from GNU libc.
+
+2001-03-24 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Require autoconf-2.49d.
+
+2001-03-20 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/iconv.m4 (jm_ICONV): Recommend GNU libiconv.
+
+2001-03-19 Paul Eggert <eggert@twinsun.com>
+
+ * lib/version-etc.c (version_etc_copyright): Update to 2001.
+
+2001-03-17 Jim Meyering <meyering@lucent.com>
+
+ * m4/memcmp.m4 (jm_AC_FUNC_MEMCMP): Remove my copy of AC_FUNC_MEMCMP,
+ now that the version in autoconf is equivalent.
+ (jm_FUNC_MEMCMP): Adjust to use AC_FUNC_MEMCMP.
+
+ * m4/error.m4 (jm_PREREQ_ERROR): Invoke AC_FUNC_STRERROR_R.
+ Suggestion from Akim Demaille.
+
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_TEMPNAME.
+ (jm_PREREQ_TEMPNAME): New function.
+
+2001-03-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/tempname.c (uint64_t): Define to uintmax_t if
+ not defined, and if UINT64_MAX is not defined.
+ Required at least for Vax Ultrix4.3, which doesn't define uint64_t.
+ Reported by John David Anglin.
+
+2001-03-15 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/localcharset.c (locale_charset): Allow wildcard syntax. Also
+ resolve alias if codeset is empty.
+ * lib/config.charset (BeOS): Use wildcard syntax.
+
+2001-03-13 Jim Meyering <meyering@lucent.com>
+
+ * lib/path-concat.c (path_concat)
+ [FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX]: Don't insert a backslash when
+ concatenating e.g., `C:' and `foo'.
+ From Bruno Haible.
+
+2001-03-06 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/localcharset.c (locale_charset): Don't use
+ setlocale(LC_CTYPE,NULL). Don't return NULL.
+ * lib/unicodeio.c (print_unicode_char): Simplify accordingly.
+
+2001-03-06 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/config.charset: Update for FreeBSD 4.2 and OSF/1 5.1. Add
+ support for DOS/DJGPP.
+
+2001-03-01 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Use mkstemp replacement if the system
+ lacks mkstemp. Compile our own tempname.c if we compile our own
+ mkstemp.c, as mkstemp relies on tempname.
+
+2001-03-01 Jim Meyering <meyering@lucent.com>
+
+ * m4/dos.m4 (jm_AC_DOS): Remove extra backslashes, now that
+ AH_VERBATIM really does output its argument verbatim.
+
+2001-02-28 Paul Eggert <eggert@twinsun.com>
+
+ * lib/Makefile.am (libfetish_a_SOURCES):
+ Add dup-safer.c, fopen-safer.c.
+ (noinst_HEADERS): Add stdio-safer.h, unistd-safer.h.
+
+ * lib/dup-safer.c, lib/fopen-safer.c, lib/stdio-safer.h:
+ * lib/unistd-safer.h: New files.
+
+2001-02-25 Paul Eggert <eggert@twinsun.com>
+
+ The mkstemp replacement is taken from glibc 2.2.2, with some
+ portability fixes for use outside glibc, as follows:
+
+ * lib/tempname.c (struct_stat64): New macro.
+ (direxists, __gen_tempname): Use it.
+ This avoids a portability problem with Solaris 8.
+
+ * lib/tempname.c (<config.h>): Include if HAVE_CONFIG_H.
+ (<stddef.h>, <stdint.h>, <string.h>):
+ Include only if STDC_HEADERS || _LIBC.
+ (<fcntl.h>): Include only if HAVE_FCNTL_H || _LIBC.
+ (<unistd.h>): Include only if HAVE_UNISTD_H || _LIBC.
+ (<sys/time.h>): Include only if HAVE_SYS_TIME_H || _LIBC.
+ (__set_errno): Define this macro if <errno.h> doesn't.
+ (P_tmpdir, TMP_MAX, __GT_FILE, __GT_BIGFILE, __GT_DIR, __GT_NOCREATE):
+ Define these macros if <stdio.h> doesn't.
+ (S_ISDIR, S_IRUSR, S_IWUSR, S_IXUSR):
+ Define these macros if <sys/stat.h>
+ doesn't. Ignore <sys/stat.h> S_ISDIR if STAT_MACROS_BROKEN.
+ (stat64, __getpid, __gettimeofday, __mkdir, __open, __open64, lxstat64,
+ __xstat64): Define if not _LIBC.
+ (__secure_getenv): Define if ! (HAVE___SECURE_GETENV || _LIBC).
+ (__gen_tempname): Invoke gettimeofday only if
+ HAVE_GETTIMEOFDAY || _LIBC;
+ otherwise, fall back on plain "time".
+ Use macros like S_IRUSR | S_IWUSR rather than octal values like 0600.
+
+ * lib/mkstemp.c (__GT_FILE): Define to zero if not defined.
+
+ * lib/mkstemp.c, lib/tempname.c: New files, taken from glibc 2.2.2.
+
+2001-02-18 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_HEADERS): Check for sys/resource.h.
+
+2001-02-17 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbrtowc.m4: New file, defining jm_FUNC_MBRTOWC.
+ * m4/mbswidth.m4 (jm_PREREQ_MBSWIDTH):
+ Use jm_FUNC_MBRTOWC, not AC_CHECK_FUNCS(mbrtowc).
+ * m4/prereq.m4 (jm_PREREQ_QUOTEARG): Likewise.
+
+2001-02-17 Paul Eggert <eggert@twinsun.com>
+
+ * lib/mbswidth.c, quotearg.c (mbrtowc, mbsinit):
+ Remove workaround macros for hosts that have mbrtowc but not
+ mbstate_t, as we now insist on proper declarations for both
+ before using mbrtowc.
+
+2001-02-17 Jim Meyering <meyering@lucent.com>
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Don't check for
+ getmntent via AC_CHECK_FUNCS, since that would get a `no' and disrupt
+ further attempts by AC_FUNC_GETMNTENT to check with e.g., -lgen on
+ UnixWare 7.1.1.
+
+ * m4/mbrtowc.m4 (jm_FUNC_MBRTOWC): Adapt to use AC_CACHE_CHECK etc.,
+ rather than AC_CACHE_VAL.
+
+2001-02-17 Jim Meyering <meyering@lucent.com>
+
+ * lib/strtoul.c: Sync from GNU libc. Use double quotes, not <...>
+ around included file name.
+
+ * lib/strnlen.c (__strnlen): Merge in a change from GNU libc.
+
+ * lib/strftime.c: Update from GNU libc (the only changes were to
+ comments).
+
+2001-02-17 Jim Meyering <meyering@lucent.com>
+
+ * lib/regex.c: Update from libc.
+
+2001-02-17 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/mbswidth.h (mbswidth): Also define as macro, to avoid prototype
+ clash.
+
+2001-02-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/alloca.c (malloc): Undef before defining, since stdlib.h
+ may have defined it. Needed for Encore Umax-3.0.9.16b systems.
+ Reported by Mark Hounschell via Paul Eggert.
+
+2001-02-07 Jim Meyering <meyering@lucent.com>
+
+ * m4/regex.m4 (jm_INCLUDED_REGEX): Add a test for the latest bug.
+
+2001-02-05 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Require autoconf-2.14d (not yet released), because
+ it includes the patch required for `large file' support with at least
+ HP-UX's 10.20 /bin/cc.
+
+2001-02-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Restore prior use of
+ AS_IF, now that it works once again (mysteriously).
+ * m4/fsusage.m4 (jm_FILE_SYSTEM_USAGE): Likewise.
+
+2001-01-30 Jim Meyering <meyering@lucent.com>
+
+ Don't use filenames that are 8.3-equivalent to "conftest" on DOS.
+ * m4/chown.m4: Rename conftestchown to conftest.chown.
+ * m4/rename.m4: s/conftestdir/conftest.d1/ and
+ s/conftestdir2/conftest.d2/.
+ * m4/utimes.m4: s/conftestdata/conftest.data/
+ Inspired by Pavel Roskin's change in autoconf.
+
+2001-01-30 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/config.charset: Update for FreeBSD 4.2.
+
+2001-01-27 Jim Meyering <meyering@lucent.com>
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Open-code what was
+ a use of AS_IF.
+ * m4/fsusage.m4 (jm_FILE_SYSTEM_USAGE): Likewise.
+
+2001-01-26 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_QUOTEARG): Check for stddef.h, now that
+ quotearg.c includes it.
+
+2001-01-26 Jim Meyering <meyering@lucent.com>
+
+ * lib/quotearg.c: Include stddef.h.
+ * lib/quote.c: Include stddef.h.
+ Reported by Axel Kittenberger.
+
+ * lib/xmalloc.c [HAVE_DONE_WORKING_MALLOC_CHECK]: Enclose error-evoking
+ line in double quotes so that it evokes a better diagnostic.
+ [HAVE_DONE_WORKING_REALLOC_CHECK]: Likewise.
+ Reported by Axel Kittenberger.
+
+2001-01-24 Stefan Monnier <monnier@cs.yale.edu>
+
+ * regex.c (mutually_exclusive_p): Don't blindly handle `charset_not'
+ as if it was a `charset'.
+
+2001-01-21 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/iconv.m4 (jm_ICONV): Also check whether the iconv declaration
+ has const.
+
+2001-01-21 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/unicodeio.c (print_unicode_char): Cast the second iconv() arg,
+ to avoid a warning. Add back 'const' to inptr.
+
+2001-01-20 Jim Meyering <meyering@lucent.com>
+
+ Be sure that headers are checked before used in code compiled
+ for the type checks.
+ * m4/jm-macros.m4 (jm_MACROS): Remove all header checks.
+ In place of that, invoke jm_CHECK_ALL_TYPES.
+ (jm_CHECK_ALL_HEADERS): New functions with the above checks.
+ (jm_CHECK_ALL_TYPES): Require jm_CHECK_ALL_HEADERS.
+ Alan Iwi reported a build failure on an f300-fujitsu-uxpv4.1_ES;
+ The check for ssize_t was mistakenly run before the test for unistd.h.
+
+ The configure-time check for stdbool.h was missing.
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_HASH.
+ (jm_PREREQ_HASH): New function.
+
+2001-01-17 Jim Meyering <meyering@lucent.com>
+
+ * m4/fsusage.m4 (jm_FILE_SYSTEM_USAGE): Use AS_IF, not AS_IFELSE,
+ for autoconf-2.49c.
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Likewise.
+
+2001-01-16 Jim Meyering <meyering@lucent.com>
+
+ * lib/basename.c: Include <stdio.h>, needed by assert on SunOS 4.
+ From Bruno Haible.
+
+2001-01-14 Jim Meyering <meyering@lucent.com>
+
+ * m4/rename.m4: Use temporary directories named conftestdir{,2}, not
+ foo and bar. Create conftestdir/ in the script, not in the C code.
+ Remove directories in the script, not in the C code.
+ Remove conftestdir{,2} before trying to create the directory.
+ Make the entire configure script fail if the mkdir fails.
+
+2001-01-14 Jim Meyering <meyering@lucent.com>
+
+ * lib/rename.c: New file. From Volker Borchert.
+ Include stdlib.h, string.h or strings.h, and xalloc.h.
+ Use strip_trailing_slashes rather than open-coding it.
+
+2001-01-03 Paul Eggert <eggert@twinsun.com>
+
+ * lib/strftime.c: Sync with glibc time/strftime.c 1.81.
+
+2001-01-03 Jim Meyering <meyering@lucent.com>
+
+ * lib/unicodeio.c (print_unicode_char): Remove `const' from declaration
+ of local `inptr' to avoid warning with some system declarations of
+ iconv.
+
+2001-01-02 Volker Borchert <bt@teknon.de>
+
+ * m4/rename.m4: New file.
+ * m4/jm-macros.m4 (jm_MACROS): Require vb_FUNC_RENAME.
+
+2001-01-01 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_READUTMP): Include utmp.h (if available),
+ even on systems with utmpx.h. It's necessary for the declaration of
+ utmp's ut_user member. Reported by Andreas Jaeger.
+
+ * m4/check-decl.m4 (jm_CHECK_DECLS): Include grp.h and pwd.h if
+ available. They are required for the declarations of getgrgid and
+ getpwuid resp.
+ (_jm_DECL_HEADERS): Check for grp.h and pwd.h.
+ Reported by Andreas Jaeger.
+
+2001-01-01 Alexandre Duret-Lutz <duret_g@epita.fr>
+
+ * m4/libintl.m4 (AM_GNU_GETTEXT): Define MKINSTALLDIRS by
+ expanding the value of $ac_aux_dir, as in AM_MISSING_HAS_RUN,
+ so `make install' also works in VPATH builds.
+
+2000-12-31 Alexandre Duret-Lutz <duret_g@epita.fr>
+
+ * m4/libintl.m4 (AM_WITH_NLS): When using AC_CONFIG_AUX_DIR,
+ prepend $(top_srcdir) to the value of MKINSTALLDIRS so that it
+ can be used in subdirectories.
+
+2000-12-29 Paul Eggert <eggert@twinsun.com>
+
+ * lib/modechange.c: Do not assume that mode_t uses the
+ traditional octal encoding. E.g. "chmod 1 FOO" should set
+ the other-execute bit of FOO even if S_IXOTH != 1.
+
+ (SUID, SGID, SVTX, RUSR, WUSR, XUSR, RGRP, WGRP, XGRP, ROTH,
+ WOTH, XOTH, ALLM): New macros.
+ (S_ISUID, S_ISGID, S_ISVTX, S_IRUSR, S_IWUSR, S_IXUSR,
+ S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH):
+ Use them.
+ (S_ISGID): Fix typo; it was defaulting to the same value as S_ISUID.
+ (S_IRWXU, S_IRWXG, S_IRWXO): Specify defaults in terms of the above.
+ (mode_compile):
+ No need to use uintmax_t; unsigned long is long enough.
+ Don't bother to get suffix since we don't use it.
+
+2000-12-26 Jim Meyering <meyering@lucent.com>
+
+ * m4/dos.m4 (jm_AC_DOS): Rewrite (though it's still a stub) to work
+ better with autoheader.
+
+2000-12-24 Jim Meyering <meyering@lucent.com>
+
+ * lib/hash.c (is_prime): Return explicit boolean values.
+ (hash_get_first): Return NULL to appease Irix5.6's 89.
+ Reported by Nelson Beebe.
+
+2000-12-19 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/localcharset.c (locale_charset): Add support for Win32.
+
+2000-12-18 Paul Eggert <eggert@twinsun.com>
+
+ * lib/physmem.h, lib/physmem.c: New files.
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add physmem.c.
+ (noinst_HEADERS): Add physmem.h.
+
+ * lib/xstrtol.c (__xstrtol): Add undocumented suffixes 'g' and
+ 't' for compatibility with Solaris 8 sort.
+
+2000-12-18 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/config.charset: Add support for BeOS.
+
+2000-12-17 Jim Meyering <meyering@lucent.com>
+
+ * m4/dos.m4 (jm_AC_DOS): New file and macro.
+ * m4/jm-macros.m4 (jm_MACROS): Require jm_AC_DOS.
+
+2000-12-16 Jim Meyering <meyering@lucent.com>
+
+ This bug had a serious impact on chown: `chown N:M FILE' (for integer
+ N and M) would have treated it like `chown N:N FILE'.
+
+ * lib/userspec.c (parse_user_spec): Fix typo: s/u/g/.
+
+2000-12-16 Jim Meyering <meyering@lucent.com>
+
+ * lib/getusershell.c [!SHELLS_FILE && __DJGPP__]: Define
+ SHELLS_FILE to a file name that's useful on djgpp systems.
+ Include stdlib.h.
+ (ADDITIONAL_DEFAULT_SHELLS): Define.
+ (default_shells): Prepend ADDITIONAL_DEFAULT_SHELLS.
+ Based mostly on a patch from Prashant TR.
+
+2000-12-16 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/config.charset: Add ISO-8859-3, BIG5HKSCS, GB18030, JOHAB,
+ VISCII, CP874, CP949, CP950, CP1250, CP1253, CP1254, CP1255, CP1256,
+ CP1257 to the list of canonical encodings. Rename EUC-CN to GB2312.
+
+2000-12-08 Andreas Schwab <schwab@suse.de>
+
+ * lib/mbswidth.c (mbsnwidth): Don't loop endlessly when called with an
+ invalid mulitbyte sequence and with the MBSW_ACCEPT_INVALID flag set.
+
+2000-12-07 Jim Meyering <meyering@lucent.com>
+
+ * lib/stripslash.c (ISSLASH): Define.
+ (strip_trailing_slashes): Use ISSLASH rather than comparing against
+ `/'.
+ From Prashant TR.
+
+ * lib/dirname.c (FILESYSTEM_PREFIX_LEN): Define.
+ (dir_name_r): Declare this function as static.
+ [BACKSLASH_IS_PATH_SEPARATOR]: Fix a bug that'd
+ manifest itself on a name containing a mix of slashes and
+ backslashes.
+ Make this function work with names starting with a DOS-style
+ drive letter and colon prefix.
+ (dir_name): Append `.' if necessary.
+ Based mostly on patches from Prashant TR and Eli Zaretskii.
+
+ * lib/dirname.h (dir_name_r): Remove prototype.
+
+2000-12-06 Paul Eggert <eggert@twinsun.com>
+
+ * m4/off_t-format.m4: Remove this file.
+ * m4/jm-macros.m4 (jm_MACROS): Remove jm_SYS_OFF_T_PRINTF_FORMAT.
+
+2000-12-06 Jim Meyering <meyering@lucent.com>
+
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX): If we need the
+ replacement strtoull, we may well need the replacement strtoul, too.
+ Check for declarations of strtoul and strtoull.
+ Check for strtol. Mainly as a cue to cause automake to include
+ strtol.c -- that file is included by each of strtoul.c and strtoull.c.
+ Check for limits.h -- strtol.c needs it.
+
+2000-12-05 Jim Meyering <meyering@lucent.com>
+
+ * lib/dirname.c (dir_name_r): Add `const' in a few local declarations.
+
+2000-12-04 Jim Meyering <meyering@lucent.com>
+
+ * lib/path-concat.c: [!HAVE_DECL_MALLOC]: Declare malloc.
+ Also include memory.h, stdlib.h, unistd.h if appropriate.
+ Reported by Andreas Jaeger (conflicting declaration of malloc).
+
+2000-12-02 Jim Meyering <meyering@lucent.com>
+
+ * m4/off_t-format.m4 (OFF_T_PRINTF_FORMAT_STRING): New file/macro.
+ * m4/jm-macros.m4 (jm_MACROS): require it.
+
+2000-12-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/closeout.h: Make idempotent, to avoid some obscure warnings.
+
+2000-12-01 Paul Eggert <eggert@twinsun.com>
+
+ * lib/memrchr.c: Include <config.h> before any system include file.
+
+2000-11-30 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Check for stdint.h.
+
+2000-11-30 Jim Meyering <meyering@lucent.com>
+
+ * m4/getloadavg.m4: s/ifval/m4_ifval/ to accommodate new autoconf.
+
+2000-11-29 Paul Eggert <eggert@twinsun.com>
+
+ * lib/dirname.c (dir_name_r): Fix typo: int -> size_t.
+
+2000-11-26 Jim Meyering <meyering@lucent.com>
+
+ * lib/memcoll.c: Include sys/types.h. From Werner Almesberger.
+
+2000-11-22 Paul Eggert <eggert@twinsun.com>
+
+ * lib/strftime.c (my_strftime): Do not invoke mbrlen with a
+ size of (size_t) -1; it's not portable.
+
+2000-11-17 Jim Meyering <meyering@lucent.com>
+
+ * lib/strstr.c: Update from GNU libc.
+
+2000-11-17 Akim Demaille <akim@epita.fr>
+
+ * lib/obstack.h: Formatting changes.
+ (obstack_grow, obstack_grow0): Don't cast WHERE at all: that would
+ prevent type checking.
+ (obstack_ptr_grow, obstack_ptr_grow_fast): When assigning, don't
+ cast the value to (void *): assigning a `foo *' to a `void *'
+ variable is valid.
+ (obstack_int_grow, obstack_int_grow_fast): Don't cast AINT to int.
+
+2000-11-16 Jim Meyering <meyering@lucent.com>
+
+ * lib/strverscmp.c: Incorporate weak-alias-related changes from glibc.
+
+2000-11-11 Jim Meyering <meyering@lucent.com>
+
+ * lib/error.c: Add a couple #includes, merging from GNU libc version.
+
+2000-11-10 Jim Meyering <meyering@lucent.com>
+
+ * lib/obstack.h: Update from GNU libc.
+ * lib/obstack.c: Likewise.
+
+2000-11-08 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/jm-macros.m4 (jm_MACROS): Add test for wcrtomb.
+
+2000-11-06 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getusershell.c (setusershell): Use rewind rather than
+ fseek/fseeko, to avoid configuration hassles with fseeko.
+ Don't bother opening SHELLS_FILE if shellstream is NULL;
+ it's not necessary.
+
+2000-11-05 Jim Meyering <meyering@lucent.com>
+
+ * lib/makepath.h (make_dir): Declare.
+ * lib/makepath.c (make_dir): Remove `static' attribute.
+ Tweak a comment.
+
+2000-11-04 Jim Meyering <meyering@lucent.com>
+
+ * m4/regex.m4: Use the `m4_' prefix on `syscmd' and `m4_sysval'.
+
+2000-11-04 Alexandre Duret-Lutz <duret_g@epita.fr>
+
+ * lib/hash.c (hash_get_next): Fix a thinko: when ENTRY is the
+ last one in a bucket, advance to the next bucket.
+
+2000-11-02 Vesselin Atanasov <vesselin@bgnet.bg>
+
+ * lib/fnmatch.c: Do not comment out all the code if we are using
+ the GNU C library, because in some cases we are replacing buggy
+ code in the GNU C library itself.
+
+2000-10-30 Stefan Monnier <monnier@cs.yale.edu>
+
+ * regex.c (re_iswctype, re_wctype_to_bit): Fix braino.
+ (regex_compile): Catch bogus \(\1\).
+
+2000-10-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/fnmatch.c (FOLD): Do not assume that characters are unsigned.
+ (fnmatch): Fix some FNM_FILE_NAME and FNM_LEADING_DIR bugs,
+ e.g. fnmatch("d*/*1", "d/s/1", FNM_FILE_NAME) incorrectly yielded zero.
+
+2000-10-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/error.h, getline.h, modechange.h:
+ Remove "2000" from Copyright line, as the file hasn't been
+ changed this year other than in the copyright notice.
+
+ * lib/xalloc.h: Add "2000" to Copyright line, as this file
+ was changed this year.
+
+2000-10-29 Jim Meyering <meyering@lucent.com>
+
+ * m4/fsusage.m4: s/AC_SHELL_IFELSE/AS_IFELSE/ to match autoconf
+ renaming.
+ * m4/ls-mntd-fs.m4: Likewise
+
+2000-10-29 Jim Meyering <meyering@lucent.com>
+
+ * lib/xstat.in: Fix grammar in comment.
+
+2000-10-29 Greg Louis <glouis@dynamicro.on.ca>
+
+ * lib/regex.h (__restrict_arr): Move definition out of #ifndef block.
+ Required because egcs-2.91.66 (aka 1.1.2) defines __restrict, but
+ doesn't define __restrict_arr.
+
+2000-10-28 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_MEMCHR.
+ (jm_PREREQ_MEMCHR): New function.
+
+2000-10-28 Jim Meyering <meyering@lucent.com>
+
+ * lib/memchr.c: Update from libc.
+ Adjust for portability:
+ [HAVE_STDLIB_H]: Include stdlib.h.
+ [HAVE_BP_SYM_H || _LIBC]: Guard inclusion of bp-sym.h.
+ Undef __memchr, too.
+ [!weak_alias]: Define __memchr to memchr.
+
+ * lib/regex.c: Update from libc.
+ * lib/regex.h: Likewise.
+ * lib/getopt1.c: Likewise.
+ * lib/memcmp.c: Likewise.
+
+ * lib/getusershell.c (setusershell) [HAVE_FSEEKO]: Use fseeko.
+ Avoid using fseek, when possible -- it's broken by design.
+ Patch by Ulrich Drepper.
+
+2000-10-27 Stefan Monnier <monnier@cs.yale.edu>
+
+ * regex.c (POP_FAILURE_REG_OR_COUNT, re_match_2_internal)
+ (re_match_2_internal, re_match_2_internal, re_match_2_internal):
+ Giving in to popular pressure to shut up the compiler with casts.
+
+2000-10-26 Jim Meyering <meyering@lucent.com>
+
+ * lib/strftime.c: Update from libc.
+
+2000-10-25 Stefan Monnier <monnier@cs.yale.edu>
+
+ * regex.c: More `unsigned char' -> `re_char' changes.
+ Also change several `int' into `re_wchar_t'.
+ (PATTERN_STACK_EMPTY, PUSH_PATTERN_OP, POP_PATTERN_OP): Remove.
+ (PUSH_FAILURE_POINTER): Don't cast any more.
+ (POP_FAILURE_REG_OR_COUNT): Remove the cast that strips `const'.
+ We want GCC to complain, since this piece of code makes
+ re_match non-reentrant, which *should* be fixed.
+ (GET_BUFFER_SPACE): Use size_t rather than unsigned long.
+ (EXTEND_BUFFER): Use RETALLOC.
+ (SET_LIST_BIT): Don't cast.
+ (re_wchar_t): New type.
+ (re_iswctype, re_wctype_to_bit): Make it crystal clear to GCC
+ that those two functions will always properly return.
+ (IMMEDIATE_QUIT_CHECK): Cast to void.
+ (analyse_first): Use recursion rather than an explicit stack.
+ (re_compile_fastmap): Can't fail anymore.
+ (re_search_2): Don't check re_compile_fastmap for failure.
+ (PUSH_NUMBER): Renamed from PUSH_FAILURE_COUNT.
+ Now also sets the new value (passed in a new argument).
+ (re_match_2_internal): Use it.
+ Also, use a new var `reg' of type size_t when looping through regs
+ rather than reuse the inappropriate `mcnt'.
+
+2000-10-25 Jim Meyering <meyering@lucent.com>
+
+ * lib/obstack.c: Update from libc.
+
+2000-10-24 Kenichi Handa <handa@etl.go.jp>
+
+ * regex.c (regex_compile): Change the way of handling a range from
+ a char less than 256 to a char not less than 256.
+
+2000-10-24 Andrew Innes <andrewi@gnu.org>
+
+ * regex.c (IMMEDIATE_QUIT_CHECK): New macro, which does QUIT on
+ NT-Emacs only.
+ (re_match_2_internal): Use IMMEDIATE_QUIT_CHECK instead of QUIT,
+ so that re_search functions only quit when callers expect them to.
+
+2000-10-23 Jim Meyering <meyering@lucent.com>
+
+ * lib/hard-locale.c (hard_locale): Revert last change -- it was simply
+ wrong. That set_locale call must not have any side effects.
+ From Paul Eggert.
+
+2000-10-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/md5.c (md5_process_block) [OP]: Use `rol', not CYCLIC.
+ [CYCLIC]: Remove now-unused definition.
+
+ * lib/save-cwd.c (O_DIRECTORY): Define, if needed.
+ (save_cwd) [HAVE_FCHDIR]: Use O_DIRECTORY when opening ".".
+ Suggestion from Ulrich Drepper.
+
+2000-10-21 Jim Meyering <meyering@lucent.com>
+
+ * m4/check-decl.m4 (jm_CHECK_DECLS): Also check for memrchr.
+ * m4/prereq.m4 (jm_PREREQ_DIRNAME): New macro.
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Add memrchr.
+
+2000-10-21 Jim Meyering <meyering@lucent.com>
+
+ * lib/dirname.c (memrchr): Declare if necessary.
+ (dir_name): Remove the restriction that there be no
+ trailing slashes. Now, this code skips past them, effectively
+ ignoring them.
+ [TEST_DIRNAME] (main): New unit tests.
+
+ * lib/memrchr.c: New file from GNU libc.
+ Undef __memrchr, too.
+ [!weak_alias]: Define __memrchr to memrchr.
+ Guard weak_alias use with `#ifdef weak_alias'.
+
+2000-10-21 Jim Meyering <meyering@lucent.com>
+
+ * lib/dirname.c (dir_name_r): New function, factored out of dir_name.
+ (dir_name): Use dir_name_r.
+ * lib/dirname.h (dir_name_r): Declare it.
+
+2000-10-17 Jim Meyering <meyering@lucent.com>
+
+ * lib/quote.h (PARAMS): Define and use.
+ Reported by Akim Demaille.
+
+ * lib/getopt.c: Update from libc.
+
+2000-10-16 Jim Meyering <meyering@lucent.com>
+
+ * lib/hard-locale.c (hard_locale): Use "", not 0 as 2nd arg to
+ setlocale.
+ From Jan Fedak.
+
+2000-10-15 Stefan Monnier <monnier@cs.yale.edu>
+
+ * regex.c (WIDE_CHAR_SUPPORT): Define if _LIBC as well.
+
+2000-09-25 Jim Meyering <meyering@lucent.com>
+
+ * lib/md5.h (rol): Define (from GnuPG).
+
+ * lib/sha.c: Give credit (GnuPG) where due.
+ (M): Use rol rather than open-coding it.
+ Add a FIXME comment.
+
+2000-09-21 Jim Meyering <meyering@lucent.com>
+
+ * lib/userspec.c (parse_user_spec): Remove debugging printf I'd added.
+ Reported by Michael Stone.
+
+2000-09-20 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add sha.c.
+ (noinst_HEADERS): Add sha.h.
+ Based on code from Scott G. Miller and from GnuPG.
+
+2000-09-18 Jim Meyering <meyering@lucent.com>
+
+ * m4/getloadavg.m4 (AC_FUNC_GETLOADAVG): Restore the initial value of
+ LIBS. Otherwise, everyone ends up linking with -lelf for some
+ configurations.
+ Reported by Mike Stone.
+
+2000-09-15 Jim Meyering <meyering@lucent.com>
+
+ * lib/regex.c: Update from libc.
+
+2000-09-10 Jim Meyering <meyering@lucent.com>
+
+ * lib/getopt.c (_getopt_internal): Update from glibc.
+
+2000-09-09 Jim Meyering <meyering@lucent.com>
+
+ * lib/quotearg.c: Rename ISASCII to IN_CTYPE_DOMAIN, so people don't
+ think it should be used as a general replacement for isascii.
+ * lib/fnmatch.c: Likewise.
+ * lib/mbswidth.c: Likewise
+ * lib/regex.c: Likewise.
+
+ Don't use atoi.
+ * lib/userspec.c: Include sys/param.h and limits.h.
+ Include xstrtol.h.
+ (CHAR_BIT, TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM): Define.
+ (UID_T_MAX, GID_T_MAX, MAXUID, MAXGID): Define.
+ (parse_user_spec): Use xstrtoul, not atoi when converting numeric
+ UID, GID. Check range.
+
+2000-09-06 Jim Meyering <meyering@lucent.com>
+
+ * lib/getopt.c (_getopt_internal): Update from glibc.
+
+2000-08-30 Jim Meyering <meyering@lucent.com>
+
+ * lib/strftime.c: Merge in changes from GNU libc.
+
+2000-08-26 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Use jm_FUNC_FPENDING.
+ * m4/fpending.m4: New file.
+
+2000-08-26 Jim Meyering <meyering@lucent.com>
+
+ * lib/closeout.c: Include "__fpending.h".
+ (close_stdout_status): Return right away if there's nothing to flush.
+
+ * lib/Makefile.am (noinst_HEADERS): Add __fpending.h.
+ * lib/__fpending.c: New file.
+ * lib/__fpending.h: New file.
+
+2000-08-20 Jim Meyering <meyering@lucent.com>
+
+ * m4/check-decl.m4: Include utmp.h `#if HAVE_UTMP_H', rather than
+ `#if !HAVE_UTMPX_H'. The latter would lose on systems with neither
+ utmp.h nor utmpx.h. Reported by Eli Zaretskii.
+
+2000-08-11 J. David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ Improve fileutils installation on systems where running
+ programs (like install) can't be unlinked.
+ * m4/unlink-busy.m4 (jm_FUNC_UNLINK_BUSY_TEXT): New file/macro.
+ * m4/jm-macros.m4: Use jm_FUNC_UNLINK_BUSY_TEXT.
+
+2000-08-07 Paul Eggert <eggert@twinsun.com>
+
+ Standardize on "memory exhausted" instead of "Memory exhausted"
+ or "virtual memory exhausted".
+ * lib/obstack.c (print_and_abort): Use "memory exhausted", not
+ "virtual memory exhausted".
+ * lib/same.c (same_name): Invoke xalloc_die instead of printing
+ our own message.
+ * lib/userspec.c (parse_user_spec): Likewise.
+ * lib/bumpalloc.h: comment fix
+ * lib/same.c, userspec.c: Include xalloc.h.
+
+ * lib/xalloc.h (xalloc_msg_memory_exhausted): Now char const[],
+ not char *const and pointing to a constant array.
+ * lib/xmalloc.c (xalloc_msg_memory_exhausted): Likewise.
+ (xrealloc): Comment fix.
+
+ * lib/userspec.c (parse_user_spec):
+ Don't translate a message until just before returning,
+ to avoid unnecessary translation.
+
+2000-08-07 Jim Meyering <meyering@lucent.com>
+
+ * lib/addext.c, argmatch.c, argmatch.h, backupfile.h, bumpalloc.h,
+ chown.c, diacrit.h, dirname.h, dup2.c, exclude.h, fileblocks.c,
+ fnmatch.c, fnmatch.h, fsusage.c, fsusage.h, getdate.h,
+ getgroups.c, gethostname.c, getopt.h, group-member.c,
+ hard-locale.c, hash.h, isdir.c, lchown.c, linebuffer.c,
+ linebuffer.h, long-options.h, malloc.c, md5.c, md5.h, memchr.c,
+ memcmp.c, memcoll.c, memset.c, mktime.c, modechange.h, obstack.h,
+ pathmax.h, realloc.c, rmdir.c, safe-read.c, save-cwd.c, stime.c,
+ stpcpy.c, strcasecmp.c, strcspn.c, strdup.c, stripslash.c,
+ strstr.c, strtod.c, strtol.c, strtoul.c, strtoull.c, strtoumax.c,
+ utime.c, version-etc.h, xalloc.h, xstrdup.c, xstrtoumax.c,
+ yesno.c: Back out Copyright date changes for each file with no change
+ this year. This eases coordination with other programs using the same
+ source code modules. From Paul Eggert.
+
+2000-08-06 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbstate_t.m4 (AC_MBSTATE_T): Define mbstate_t to be int,
+ not char, for compatibility with glibc 2.1.3 strftime.c.
+
+2000-08-03 Greg McGary <greg@mcgary.org>
+
+ * lib/regex.c (SET_HIGH_BOUND, MOVE_BUFFER_POINTER,
+ ELSE_EXTEND_BUFFER_HIGH_BOUND): New macros.
+ (EXTEND_BUFFER): Use them.
+
+2000-08-01 Jim Meyering <meyering@lucent.com>
+
+ * lib/dirname.c (ISSLASH): Define.
+ (BACKSLASH_IS_PATH_SEPARATOR): Define.
+ (dir_name) [BACKSLASH_IS_PATH_SEPARATOR]: Handle the case in which
+ both `\' and `/' may be use as path separators.
+ Based on a patch from Prashant TR.
+
+2000-07-31 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (quotearg_n_options): Don't make the initial
+ slot vector a constant, since it might get modified.
+
+2000-07-31 Jim Meyering <meyering@lucent.com>
+
+ * lib/xmalloc.c: Use `virtual memory exhausted', not
+ `Memory exhausted'.
+ * lib/obstack.c (print_and_abort): Likewise.
+
+2000-07-30 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (quotearg_n_options): Preallocate a slot 0
+ buffer, so that the caller can always quote one small
+ component of a "memory exhausted" message in slot 0.
+ From a suggestion by Jim Meyering.
+
+2000-07-30 Jim Meyering <meyering@lucent.com>
+
+ * lib/makepath.c (make_path): Quote the other instance, too.
+
+ * lib/quotearg.c (N_STATIC_SLOTVECS): Define.
+ (STATIC_BUF_SIZE): Define.
+ (quotearg_n_options): Use only statically allocated storage when
+ N < N_STATIC_SLOTVECS and the length of the quoted result is smaller
+ than STATIC_BUF_SIZE.
+
+2000-07-29 Jim Meyering <meyering@lucent.com>
+
+ * lib/diacrit.c (diacrit_diac): Use __MSDOS__ in favor of MSDOS.
+ * lib/dirname.c (dir_name): Likewise.
+
+ * lib/basename.c (base_name): Use ISSLASH rather than comparing against
+ `/'.
+
+ * lib/dirname.c (dir_name) [MSDOS]: Declare `lim' to be const.
+ (dir_name): Assert that there are no trailing slashes.
+
+2000-07-29 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/mbswidth.h (mbswidth): Add a flags argument.
+ (mbswidth): New declaration.
+ (MBSW_ACCEPT_INVALID, MBSW_ACCEPT_UNPRINTABLE): New macros.
+ * lib/mbswidth.c (mbswidth): Add a flags argument.
+ (mbsnwidth): New function.
+
+2000-07-24 Jim Meyering <meyering@lucent.com>
+
+ * lib/mbswidth.c: Remove useless #else. From Bruno Haible.
+
+2000-07-23 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbswidth.m4 (jm_PREREQ_MBSWIDTH): Check for wcwidth declaration.
+
+2000-07-23 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c: Streamline by invoking multibyte code only if needed.
+ <wchar.h>: Include only if HAVE_MBRTOWC && 1 < MB_LEN_MAX.
+ (MB_CUR_MAX): Redefine to 1 if ! (HAVE_MBRTOWC && 1 < MB_LEN_MAX).
+ (quotearg_buffer_restyled): If a unibyte locale, don't bother to
+ invoke multibyte primitives.
+
+2000-07-23 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c:
+ Include <wchar.h> even if ! (HAVE_MBRTOWC && 1 < MB_LEN_MAX),
+ so that mbstate_t is always defined.
+
+ Do not inspect MB_LEN_MAX, since it's incorrectly defined to
+ be 1 in at least one GCC installation, and this configuration
+ error is likely to be common. Ignoring MB_LEN_MAX hurts
+ performance on hosts that have mbrtowc but have only unibyte
+ locales, but I assume these hosts are rare.
+
+2000-07-23 Paul Eggert <eggert@twinsun.com>
+
+ * lib/mbswidth.c (_XOPEN_SOURCE):
+ Don't define; this causes problems on Solaris 7.
+ (wcwidth) [!HAVE_DECL_WCWIDTH]: Declare.
+
+2000-07-23 Jim Meyering <meyering@lucent.com>
+
+ * m4/check-decl.m4 (jm_CHECK_DECLS): Check for declarations of these,
+ too: getgrgid, getpwuid, getuid.
+
+2000-07-23 Jim Meyering <meyering@lucent.com>
+
+ * lib/basename.c (base_name): Add an assertion.
+
+2000-07-23 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/quotearg.c: When the system forces us to redefine mbstate_t,
+ shadow its mbsinit function.
+
+2000-07-17 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/mbswidth.h: New file.
+ * lib/mbswidth.c: New file.
+ * lib/Makefile.am (libfetish_a_SOURCES): Add mbswidth.c.
+ (noinst_HEADERS): Add mbswidth.h.
+
+2000-07-17 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/config.charset: Add support for FreeBSD. Improve support for
+ HP-UX and IRIX 6.
+
+2000-07-16 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/mbswidth.m4: New file.
+ * m4/prereq.m4 (jm_PREREQ): Call jm_PREREQ_MBSWIDTH.
+
+2000-07-15 Jim Meyering <meyering@lucent.com>
+
+ * lib/makepath.c: Include quote.h.
+ (make_path): Convert "`%s'" in format strings to "%s", and wrap each
+ corresponding argument in a `quote (...)' call.
+ Give better diagnostics.
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add quote.c.
+ (noinst_HEADERS): Add quote.h.
+
+ * lib/quote.c (quote, quote_n): New file. Two functions taken verbatim
+ from tar's src/misc.c.
+ * lib/quote.h: New file. Prototypes for same.
+
+2000-07-14 Paul Eggert <eggert@twinsun.com>
+
+ From a suggestion by Bruno Haible.
+ * lib/quotearg.c (mbrtowc): Do not use HAVE_WCHAR_H in the definition.
+ Use defined mbstate_t, not HAVE_MBSTATE_T_OBJECT,
+ to decide whether to define the BeOS workaround macro;
+ this adjusts to the change to AC_MBSTATE_T.
+
+2000-07-14 Jim Meyering <meyering@lucent.com>
+
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX): Require
+ jm_AC_TYPE_UINTMAX_T.
+
+2000-07-13 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.h (enum quoting style): New enum clocale_quoting_style.
+
+ * lib/quotearg.c (quoting_style_args, quoting_style_vals,
+ quotearg_buffer_restyled): Add support for
+ clocale_quoting_style. Undo previous change to
+ locale_quoting_style behavior, and undo the "{LEFT QUOTATION MARK}"
+ and "{RIGHT QUOTATION MARK}" msgids.
+
+2000-07-10 Paul Eggert <eggert@twinsun.com>
+
+ From a suggestion by Bruno Haible.
+ * m4/mbstate_t.m4 (AC_MBSTATE_T):
+ Renamed from AC_MBSTATE_T_OBJECT. All uses changed.
+ Change from a two-part test, which defines both HAVE_MBSTATE_T_OBJECT
+ and mbstate_t, to a single-part test that simply defines mbstate_t.
+ * m4/prereq.m4 (jm_PREREQ_QUOTEARG):
+ s/AC_MBSTATE_T_OBJECT/AC_MBSTATE_T/.
+
+2000-07-10 Jim Meyering <meyering@lucent.com>
+
+ * m4/strerror_r.m4: Mirror the correction made in autoconf.
+
+ * m4/gnu-source.m4: Output to confdefs.h directly.
+ Suggestion from Akim Demaille.
+
+2000-07-09 Paul Eggert <eggert@twinsun.com>
+
+ The old behavior of quoting `like this' doesn't look good with
+ newer, ISO-style fonts. See:
+ http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+
+ Instead, quote "like this" by default. Let the translator
+ tailor the locale-specific quoting behavior by providing
+ translations for {LEFT QUOTATION MARK} and {RIGHT QUOTATION MARK}.
+
+ * lib/quotearg.c (N_): New macro.
+ (gettext_default): New function.
+ (quotearg_buffer_restyled): Use
+ gettext_default ("{LEFT QUOTATION MARK}", "\"") for left quote, and
+ gettext_default ("{RIGHT QUOTATION MARK}", "\"") for right quote.
+
+2000-07-09 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Add a test to see if -lm is required
+ to link seq. If so, set SEQ_LIBM to -lm. From Bruno Haible.
+
+ * m4/gnu-source.m4 (AC__GNU_SOURCE): New file/macro.
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Require it.
+
+2000-07-09 Jim Meyering <meyering@lucent.com>
+
+ * lib/Most files: Update copyright dates to include 2000.
+
+2000-07-08 Jim Meyering <meyering@lucent.com>
+
+ * lib/xgethostname.c (ENAMETOOLONG): Define to an unlikely value
+ if not defined.
+ (xgethostname): Remove now-unnecessary #ifdef.
+ Move declaration of `err' into loop where it's used.
+
+2000-07-05 Paul Eggert <eggert@twinsun.com>
+ and Bruno Haible <haible@clisp.cons.org>
+
+ * m4/mbstate_t.m4 (AC_MBSTATE_T_OBJECT): Test for mbstate_t
+ only if the test for an object-type mbstate_t fails. This
+ prevents us from mistakenly reporting that mbstate_t is a
+ system object type after we "#define mbstate_t int" to work
+ around its lack.
+
+2000-07-05 Paul Eggert <eggert@twinsun.com>
+ and Bruno Haible <haible@clisp.cons.org>
+
+ * lib/quotearg.c (mbrtowc): Declare returned type, since BeOS doesn't.
+
+2000-07-05 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/strerror_r.m4 (AC_FUNC_STRERROR_R): Pass a reasonably large buffer
+ to strerror_r.
+ Include <ctype.h> for use of isalpha.
+
+2000-07-05 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/xgethostname.c (xgethostname): Protect against the SunOS 5.5 bug
+ by allocating a larger buffer. Test the gethostname return value for
+ being >= 0, not == 0, for BeOS. Don't exhaust memory if gethostname
+ returns an error and ENAMETOOLONG isn't defined.
+
+2000-07-05 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/quotearg.c (struct quoting_options): Simplify quote_these_too
+ dimension.
+
+2000-07-04 Jim Meyering <meyering@lucent.com>
+
+ * m4/fsusage.m4 (jm_FILE_SYSTEM_USAGE): Use plain old `echo' instead
+ of the deprecated AC_CHECKING.
+
+2000-07-04 Jim Meyering <meyering@lucent.com>
+
+ * lib/strndup.c: [!HAVE_DECL_STRNLEN]: Declare strnlen.
+ Reported by Bruno Haible.
+
+2000-07-04 Jim Meyering <meyering@lucent.com>
+
+ * lib/quotearg.c: Make inclusion of <wchar.h> independent of whether
+ HAVE_MBRTOWC is set. Required at least for irix-5.6, which
+ lacks mbrtowc.
+
+2000-07-03 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbstate_t.m4 (AC_MBSTATE_T_OBJECT): Port to autoconf 2.13.
+ Add AC_CHECK_HEADERS(stdlib.h), since we use HAVE_STDLIB_H.
+
+2000-07-03 Paul Eggert <eggert@twinsun.com>
+ and Bruno Haible <haible@clisp.cons.org>
+
+ * lib/quotearg.c (mbrtowc):
+ Assign to *pwc, and return 1 only if result is nonzero.
+ (iswprint): Use ISPRINT when substituting our own mbrtowc.
+
+2000-07-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/check-decl.m4 (AC_CHECK_DECLS): Add strnlen.
+
+2000-07-03 Jim Meyering <meyering@lucent.com>
+
+ * lib/readutmp.h: [HAVE_UTMPX_H]: Include <utmp.h> if HAVE_UTMP_H.
+ This is necessary to get a definition of e.g., UTMP_FILE on
+ HP-UX 10.20.
+ From Bob Proulx.
+
+2000-07-02 Jim Meyering <meyering@lucent.com>
+
+ * m4/mbstate_t.m4: Also define mbstate_t, if necessary.
+
+ * m4/chown.m4: Replace each use of AC_SUBST(LIBOBJS)/LIBOBJS=... with
+ AC_LIBOBJ(function_name).
+ * m4/chown.m4: Likewise.
+ * m4/fnmatch.m4: Likewise.
+ * m4/ftruncate.m4: Likewise.
+ * m4/getgroups.m4: Likewise.
+ * m4/getline.m4: Likewise.
+ * m4/group-member.m4: Likewise.
+ * m4/jm-macros.m4: Likewise.
+ * m4/lstat.m4: Likewise.
+ * m4/malloc.m4: Likewise.
+ * m4/memcmp.m4: Likewise.
+ * m4/nanosleep.m4: Likewise.
+ * m4/putenv.m4: Likewise.
+ * m4/realloc.m4: Likewise.
+ * m4/regex.m4: Likewise.
+ * m4/stat.m4: Likewise.
+ * m4/strftime.m4: Likewise.
+
+2000-07-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/quotearg.c (mbstate_t): Don't define here.
+
+2000-07-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/nanosleep.c (SIGCONT): Define if not already defined.
+
+2000-07-01 Jim Meyering <meyering@lucent.com>
+
+ * m4/uptime.m4: Put double quotes around use of $cross_compiling.
+
+2000-07-01 Jim Meyering <meyering@lucent.com>
+
+ * m4/ls-mntd-fs.m4: Remove a `FIXME' comment and fix the associated
+ problem.
+
+2000-07-01 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Rename BeOS specific
+ macro from MOUNTED_NEXT_DEV to MOUNTED_FS_STAT_DEV.
+
+2000-07-01 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/mountlist.c: Use MOUNTED_FS_STAT_DEV instead of MOUNTED_NEXT_DEV,
+ per change in ../m4/ls-mntd-fs.m4.
+ (read_filesystem_list): Ignore symbolic links.
+
+2000-06-29 Jim Meyering <meyering@lucent.com>
+
+ * lib/same.c: Include <string.h> or <strings.h>, as appropriate,
+ for declaration of strcmp.
+
+ * lib/long-options.c: Include <stdlib.h>, for declaration of exit.
+
+ * lib/mountlist.c (fsp_to_string) [HAVE_F_FSTYPENAME_IN_STATFS]:
+ Avoid warning by casting result to `char *' to remove `const'.
+
+2000-06-28 Jim Meyering <meyering@lucent.com>
+
+ * m4/mbstate_t.m4: Use stdlib.h, not stdio.h. The latter is not
+ included by quotearg.c, for which we perform this test. From
+ Bruno Haible.
+
+2000-06-27 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/check-decl.m4 (_jm_DECL_HEADERS): Check for utmp.h as well.
+ * m4/prereq.m4 (jm_PREREQ_READUTMP): Likewise. If either <utmp.h> or
+ <utmpx.h> exists, put readutmp.o into LIBOBJS.
+
+2000-06-27 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Remove readutmp.c.
+
+2000-06-26 Paul Eggert <eggert@twinsun.com>
+
+ savedir now sets errno on failure and invokes xmalloc to get memory.
+ Fix a couple of other minor bugs while we're at it.
+
+ * lib/savedir.c (<unistd.h>): Do not include; there's no need.
+ (NAMLEN): Remove macro.
+ (malloc, realloc): Remove decls.
+ (stpcpy): Likewise.
+ ("xalloc.h"): Include.
+ (NAME_SIZE_DEFAULT): New macro.
+ (savedir): Use xmalloc / xrealloc to allocate memory.
+ Use NAME_SIZE_DEFAULT if name_size is negative or overflows to zero.
+ Skip "" directory entries.
+ Use strlen to calculate directory entry length, since the old method
+ is rarely used these days and isn't worth supporting.
+ Don't use a pointer after freeing it.
+ Check for integer overflow when calculating allocation size.
+ Use memcpy to copy entries, instead of stpcpy.
+ Set errno properly when returning NULL.
+ Check for readdir error.
+
+2000-06-26 Jim Meyering <meyering@lucent.com>
+
+ * lib/posixtm.c [HAVE_STDLIB_H]: Include stdlib.h, for decl of abort.
+
+2000-06-25 Jim Meyering <meyering@lucent.com>
+
+ * m4/mbstate_t.m4: Include stdio.h before wchar.h to work around
+ Linux header bug when _XOPEN_SOURCE is defined to 500.
+
+2000-06-25 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/unicodeio.c (print_unicode_char): Work around ansi2knr
+ deficiency.
+
+2000-06-25 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/getusershell.c (xmalloc, xrealloc): Remove functions.
+ Include xalloc.h.
+ Don't include <stdlib.h>. Don't declare malloc, realloc.
+
+2000-06-24 Jim Meyering <meyering@lucent.com>
+
+ * m4/strerror_r.m4: Revive this file -- to try out an experimental
+ version of AC_FUNC_STRERROR_R that may work even on BeOS, a system
+ for which strerror does return char*, but which lacks a conveniently
+ accessible declaration of the function. If the compile-test says
+ strerror_r doesn't work, then resort to a `run'-test that works on
+ BeOS and segfaults on DEC Unix.
+
+2000-06-24 Jim Meyering <meyering@lucent.com>
+
+ * lib/error.c [!HAVE_DECL_STRERROR_R]: Declare strerror_r.
+
+2000-06-23 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mbstate_t.m4: New file, defining AC_MBSTATE_T_OBJECT.
+ * m4/prereq.m4 (jm_PREREQ_QUOTEARG): Use it. Add check for iswprint.
+
+2000-06-23 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c: Include <wctype.h> after <wchar.h>, for Solaris 2.5.
+ (mbrtowc, mbstate_t): Define substitutes if
+ HAVE_MBRTOWC && HAVE_WCHAR_H && !HAVE_MBSTATE_T_OBJECT.
+ (iswprint): Define to 1 if !defined iswprint && !HAVE_ISWPRINT,
+ not if ! (HAVE_MBRTOWC && HAVE_WCHAR_H).
+
+2000-06-23 Jim Meyering <meyering@lucent.com>
+
+ * m4/afs.m4: Add missing AC_MSG_RESULT.
+ Reported by Bruno Haible.
+
+ * m4/fsusage.m4: s/AC_MSG_CHECKING/AC_CHECKING/.
+ Suggestion from Bruno Haible.
+
+2000-06-23 Jim Meyering <meyering@lucent.com>
+
+ * lib/getpass.c: New file, from Bruno Haible. Required for BeOS.
+
+2000-06-21 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Add getpass.
+
+2000-06-21 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Add getstr.c.
+ (noinst_HEADERS): Add getstr.h.
+
+ * lib/getline.c (getstr): Move into a separate file.
+ * lib/getstr.c (getstr): New file, extracted from getline.c, with
+ the following changes: new parameter, delim2; both delim[12]
+ parameters have type `int', not `char'. The latter would lose
+ with 8-bit delimiters.
+ * lib/getstr.h: New file.
+
+2000-06-21 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/xgetcwd.c (xgetcwd): If the required pathname length is smaller
+ than 1024, return a memory chunk of least possible size, instead
+ of size PATH_MAX + 2. In the loop, increment the size proportionally.
+ Use free/xmalloc instead of xrealloc to avoid copying for very long
+ paths.
+
+2000-06-21 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/path-concat.c (path_concat): Don't access dir[-1] if dir is
+ the empty string.
+
+2000-06-21 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/canon-host.c (canon_host): Use malloc and memcpy to copy an
+ address, not strdup. Include <stdlib.h> and don't declare free().
+
+2000-06-19 Jim Meyering <meyering@lucent.com>
+
+ * lib/getloadavg.c [HAVE_NLIST_H] (NLIST_STRUCT): Define.
+
+2000-06-18 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Remove mkdir.
+
+ * m4/link-follow.m4 (jm_AC_FUNC_LINK_FOLLOWS_SYMLINK): Change the
+ `checking whether...' message to be consistent with that of the
+ lstat test.
+
+2000-06-18 Jim Meyering <meyering@lucent.com>
+
+ * lib/mkdir.c: Remove file, due mainly to copyright incompatibility.
+ Besides, these days every porting target provides a mkdir function.
+
+ * lib/strnlen.c: Include memory.h, string.h, and/or strings.h as
+ needed. (this snippet comes from src/system.h).
+
+2000-06-16 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/glibc21.m4 (jm_GLIBC21): Define GLIBC21 for Makefiles, not for C.
+
+2000-06-15 Paul Eggert <eggert@twinsun.com>
+
+ * lib/human.c (adjust_value): New function.
+ (human_readable_inexact): Apply rounding style even when
+ printing approximate values.
+
+2000-06-14 Paul Eggert <eggert@twinsun.com>
+
+ * lib/human.c (human_readable_inexact): Allow an input block
+ size that is not a multiple of the output block size, and vice versa.
+ Reported by Piergiorgio Sartor.
+
+2000-06-14 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getdate.y (get_date): Apply relative times after time
+ zone indicator, not before. Reported by Todd A. Jacobs.
+
+2000-06-13 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (all-local): Depend on lstat.c and stat.c.
+
+ * lib/xstat.in [!HAVE_DECL_FREE]: Declare free in lstat.c.
+
+2000-06-12 Paul Eggert <eggert@twinsun.com>
+
+ * lib/xstat.in: Include <stdlib.h> in lstat, to declare "free".
+
+2000-06-12 Jim Meyering <meyering@lucent.com>
+
+ * m4/getloadavg.m4 (AM_FUNC_GETLOADAVG): Replace with
+ AC_FUNC_GETLOADAVG from autoconf, and tweak the latter to accept an
+ optional argument.
+ * m4/jm-macros.m4: s/AM_FUNC_GETLOADAVG/AC_FUNC_GETLOADAVG/, and supply
+ the optional argument, `lib'.
+
+2000-06-08 Jim Meyering <meyering@lucent.com>
+
+ * m4/largefile.m4: Remove file (now that it's part of autoconf).
+
+2000-06-04 Paul Eggert <eggert@twinsun.com>
+
+ Rewrite largefile configuration so that we don't need to run
+ getconf and don't need AC_CANONICAL_HOST. [I'm leaving the use of
+ AC_CANONICAL_HOST in configure.in -- jmm]
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE_FLAGS,
+ AC_SYS_LARGEFILE_SPACE_APPEND): Remove.
+ (AC_SYS_LARGEFILE_TEST_INCLUDES): New macro.
+ (AC_SYS_LARGEFILE_MACRO_VALUE): Change arguments from
+ CODE-TO-SET-DEFAULT to VALUE, INCLUDES, FUNCTION-BODY.
+ All uses changed.
+ Instead of inspecting the output of getconf, try to compile the
+ test program without and with the macro definition.
+ (AC_SYS_LARGEFILE): Do not require AC_CANONICAL_HOST or check
+ for getconf. Instead, check for the needed flags by compiling
+ test programs.
+
+2000-06-04 Paul Eggert <eggert@twinsun.com>
+
+ * lib/strnlen.c: Include <config.h> if HAVE_CONFIG_H.
+
+2000-06-04 Jim Meyering <meyering@lucent.com>
+
+ * lib/getugroups.c (getugroups): Cast -1 to gid_t, for systems like
+ SunOS 4.1.4 for which gid_t is an unsigned type.
+
+2000-06-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_HUMAN): Use []-quoted list in AC_CHECK_DECLS,
+ now that autoconf requires that.
+
+ * m4/jm-glibc-io.m4: Add a kludge to make autoheader emit the required
+ #undefs. E.g., #undef HAVE_DECL_FERROR_UNLOCKED.
+ Use []-quoted list in AC_CHECK_DECLS, now that autoconf requires that.
+
+2000-06-03 Jim Meyering <meyering@lucent.com>
+
+ * lib/strnlen.c [!HAVE_DECL_MEMCHR]: Declare memchr.
+
+2000-06-03 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/glibc21.m4: New file.
+ * m4/jm-macros.m4 (jm_MACROS): Call jm_GLIBC21.
+
+2000-06-03 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/Makefile.am (install-exec-local): On systems with glibc-2.1 or
+ newer, don't install charset.alias.
+ * lib/config.charset: Change the Linux/glibc rules so they become empty
+ on glibc-2.1 or newer.
+
+2000-06-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/mountlist.c: Back out last change. Instead, do this...
+ * lib/mountlist.c (read_filesystem_list) [MOUNTED_VMOUNT]: Set the
+ me_dummy member using the same `ignore'-testing code.
+ * lib/mountlist.h (ME_DUMMY): Add `autofs' to the list of ignored
+ fs_type strings.
+ From Mark D. Roth.
+
+2000-05-29 Jim Meyering <meyering@lucent.com>
+
+ * lib/mountlist.c (read_filesystem_list) [MOUNTED_VMOUNT]: Ignore
+ mounts with the `ignore' attribute. Based on a patch from
+ Mark D. Roth.
+
+2000-05-28 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK): Rename from
+ jm_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK.
+ * m4/stat.m4: Likewise.
+ * m4/lstat.m4: Likewise.
+ * m4/lstat-slash.m4: Remove file (absorbed into autoconf).
+
+ * m4/jm-macros.m4 (AC_FUNC_STRERROR_R): Rename from jm_FUNC_STRERROR_R.
+ * m4/strerror_r.m4: Remove file (absorbed into autoconf).
+
+2000-05-26 Jim Meyering <meyering@lucent.com>
+
+ * m4/uptime.m4: Use `$cross_compiling', not `$ac_cv_prog_cc_cross'.
+
+2000-05-24 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4: Use []-quoted list in AC_CHECK_MEMBERS, now that
+ autoconf requires that.
+ * m4/lib-check.m4: Likewise.
+ * m4/jm-macros.m4: Likewise.
+ * m4/strftime.m4: Likewise.
+
+ * m4/check-decl.m4 (jm_CHECK_DECLS): Use []-quoted list in
+ AC_CHECK_DECLS, now that autoconf requires that.
+
+2000-05-22 Jim Meyering <meyering@lucent.com>
+
+ * m4/stat.m4: Require jm_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK.
+ * m4/lstat.m4: Likewise.
+
+2000-05-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/makepath.c: Remove old, now-unnecessary `#ifdef __MSDOS__' block.
+
+2000-05-20 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_HUMAN): New macro.
+ (jm_PREREQ): Use it.
+
+2000-05-18 Jim Meyering <meyering@lucent.com>
+
+ * lib/hash.c (hash_rehash): Fix a nasty bug: copy the free entry list
+ back, too, since it may have been modified by allocate_entry.
+ (hash_delete): Rewrite to use neither the assignment operator
+ nor the comma operator in an if-expression.
+
+2000-05-15 Paul Eggert <eggert@twinsun.com>
+
+ * lib/closeout.c:
+ <sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
+ Remove; no longer needed.
+ "quotearg.h": Add include.
+ (file_name): Do not bother to explicitly initialize to NULL; it's less
+ efficient on some hosts.
+ (close_stdout_status): Remove test as to whether stdout was already
+ closed; it breaks for the case "echo x | sort >&-".
+ Quote file name colons.
+ Do not assume that _("write error") lacks format strings.
+
+2000-05-15 Jim Meyering <meyering@lucent.com>
+
+ * lib/version-etc.c (version_etc_copyright): Update the copyright
+ string used in all --version output.
+
+2000-05-14 Jim Meyering <meyering@lucent.com>
+
+ * lib/closeout.c (close_stdout_set_file_name): New function.
+ (close_stdout_status): Use new file-scoped global.
+ Return right away if fstat says the stdout file descriptor is invalid.
+ * lib/closeout.h (close_stdout_set_file_name): Declare.
+
+2000-05-10 Jim Meyering <meyering@lucent.com>
+
+ * lib/closeout.c [default_exit_status]: New file-scoped variable.
+ (close_stdout_set_status): New function.
+ * lib/closeout.h (close_stdout_set_status): Declare.
+
+2000-05-09 Jim Meyering <meyering@lucent.com>
+
+ * m4/gettext.m4: Rename this...
+ * m4/libintl.m4: ...to this.
+
+2000-05-08 Jim Meyering <meyering@lucent.com>
+
+ * lib/long-options.c: Don't include closeout.h.
+ (parse_long_options): Don't call close_stdout for --version.
+
+2000-05-06 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE): Define _XOPEN_SOURCE to
+ be 500, instead of _GNU_SOURCE to be 1, to work around glibc
+ 2.1.3 bug. This avoids a clash when files like regex.c define
+ _GNU_SOURCE.
+
+2000-05-06 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Add atexit.
+ (AC_REPLACE_FUNCS): Add strnlen.
+
+ * m4/rmdir-errno.m4 (fetish_FUNC_RMDIR_NOTEMPTY): New macro and file.
+ * m4/jm-macros.m4: Require fetish_FUNC_RMDIR_NOTEMPTY.
+
+ * m4/nanosleep.m4 (jm_FUNC_NANOSLEEP): Save and restore LIBS around
+ AC_SEARCH_LIBS call for nanosleep.
+ (LIB_NANOSLEEP): Set and AC_SUBST.
+
+2000-05-06 Jim Meyering <meyering@lucent.com>
+
+ * lib/strnlen.c: Undefine __strnlen and strnlen.
+ [!weak_alias]: Define __strnlen to strnlen.
+
+ * lib/atexit.c: New file, from libiberty.
+
+2000-05-06 Jim Meyering <meyering@lucent.com>
+
+ * lib/closeout.c (close_stdout_status): Also check for errors on the
+ stderr stream.
+
+2000-05-05 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Save and restore LIBS around
+ AC_SEARCH_LIBS call for clock_gettime.
+ (LIB_CLOCK_GETTIME): Set and AC_SUBST.
+
+ * m4/search-libs.m4: Update from autoconf.
+
+ su doesn't work on Solaris 2.6.
+ * m4/lib-check.m4: When checking for struct spwd.sp_pwdp, also include
+ <shadow.h>. Reported by Dragos Harabor.
+
+2000-05-05 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/localcharset.c (get_charset_aliases): Use malloc, realloc and
+ memcpy instead of xmalloc, xrealloc, path_concat.
+ (locale_charset): Treat empty environment variables as absent.
+ (DIRECTORY_SEPARATOR, ISSLASH): New macros.
+
+2000-05-04 Jim Meyering <meyering@lucent.com>
+
+ * lib/getopt.c: Update from glibc.
+ * lib/obstack.c: Likewise.
+ * lib/obstack.h: Likewise.
+ * lib/regex.c: Likewise. NB: K&R compiler support is dropped for this
+ file
+
+ * lib/regex.h: Likewise.
+ * lib/strndup.c: Likewise.
+ * lib/strnlen.c: New file, from glibc.
+
+2000-05-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/check-decl.m4 (AC_CHECK_DECLS): Add strndup.
+
+2000-05-02 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE): Define _GNU_SOURCE if
+ this is needed to make ftello visible (e.g. glibc 2.1.3). Use
+ compile-time test, rather than inspecting host and OS, to
+ decide whether to define _LARGEFILE_SOURCE.
+
+2000-05-01 Jim Meyering <meyering@lucent.com>
+
+ * m4/fsusage.m4: Use AC_MSG_CHECKING instead of obsolete AC_CHECKING.
+
+ * m4/ls-mntd-fs.m4 (jm_LIST_MOUNTED_FILESYSTEMS): Add BeOS support.
+ Based on a patch from Bruno Haible.
+
+2000-05-01 Jim Meyering <meyering@lucent.com>
+
+ * lib/full-write.c (full_write): Remove `FIXME' part of comment.
+
+2000-04-29 Jim Meyering <meyering@lucent.com>
+
+ * lib/path-concat.c: Declare strdup only if it's not defined.
+ * lib/canon-host.c: Likewise.
+
+2000-04-28 Jim Meyering <meyering@lucent.com>
+
+ * lib/rpmatch.c [HAVE_LIMITS_H]: Include limits.h before regex.h to
+ avoid redefinition warning on some systems (HPUX). Otherwise, regex.h
+ is included first, then limits.h is included by locale.h by libintl.h.
+ From John David Anglin.
+
+2000-04-25 Jim Meyering <meyering@lucent.com>
+
+ * lib/makepath.c (S_IRWXUGO): Define.
+ (make_path): Always perform explicit chmod if MODE specifies any
+ of the `special' permission bits. Prompted by a bug report against
+ install from Mate Wierdl and Joost van Baal.
+
+2000-04-18 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_GETPAGESIZE): New macro.
+ (jm_PREREQ): Use it.
+
+2000-04-18 Jim Meyering <meyering@lucent.com>
+
+ * lib/README: New file.
+
+ * lib/getpagesize.h [!getpagesize && HAVE_OS_H && B_PAGE_SIZE]: Define
+ getpagesize. For BeOS. Based on a patch from Bruno Haible.
+
+2000-04-17 Jim Meyering <meyering@lucent.com>
+
+ Get it right :-)
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES) [_GNU_SOURCE]: Emit the
+ actual #define via AH_VERBATIM. Don't need separate AC_DEFINE.
+ Suggestion from Akim Demaille.
+
+2000-04-17 Jim Meyering <meyering@lucent.com>
+
+ * lib/strftime.c (my_strftime) [strftime]: Declare strftime here, since
+ the definition of it to rpl_strftime also defined-away the system's
+ declaration.
+
+2000-04-15 Jim Meyering <meyering@lucent.com>
+
+ Use `C' to denote so-called `contiguous' files, the same way
+ that tar does.
+ * lib/filemode.c (S_ISCTG) [!S_ISCTG && S_IFCTG]: Define.
+ (ftypelet): Use S_ISCTG.
+ From Michael Deutschmann.
+
+2000-04-14 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES) [_GNU_SOURCE]: Use the one-arg
+ form of AC_DEFINE. Otherwise, the #ifndef in AH_VERBATIM gets
+ clobbered.
+
+2000-04-14 Jim Meyering <meyering@lucent.com>
+
+ * lib/strftime.c (my_strftime) [#ifdef strftime]: Declare strftime.
+
+2000-04-13 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES) [_GNU_SOURCE]: Use new
+ AH_VERBATIM to insert required #ifndef into config.h.in.
+ Suggestion from Akim Demaille.
+
+2000-04-12 Jim Meyering <meyering@lucent.com>
+
+ * m4/getloadavg.m4 (AM_FUNC_GETLOADAVG): Use AC_CHECK_HEADERS, not
+ `AC_CHECK_HEADER' to check for locale.h. Thanks to a report from
+ Christian Krackowizer.
+
+ More code moved from ../configure.in into (jm_CHECK_ALL_TYPES).
+ * m4/jm-macros.m4 (_GNU_SOURCE): Define.
+ (AC_SYS_LARGEFILE): Require.
+ (AM_C_PROTOTYPES): Require.
+
+2000-04-08 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (charset.alias): Use t-$@, not $@-t so the DOS 8.3
+ names don't conflict. Reported by Eli Zaretskii.
+
+2000-04-07 Jim Meyering <meyering@lucent.com>
+
+ * lib/putenv.c: Move inclusion of errno.h so it follows that of
+ sys/types.h, to work around system header problems on AIX 3.2.5.
+ From Bruno Haible.
+
+2000-04-07 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/unicodeio.c (print_unicode_char): Avoid triggering Solaris iconv
+ bug. Deal with the different error behavior of Irix iconv.
+
+2000-04-05 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE_FLAGS): Don't use -n32 on
+ IRIX if the installer said otherwise.
+
+2000-04-05 Jim Meyering <meyering@lucent.com>
+
+ Portability tweaks required for ultrix4.3.
+ * m4/check-decl.m4 [!HAVE_UTMPX_H] (headers): Include <utmp.h>.
+ (jm_CHECK_DECLS): Add getutent to the list of functions.
+ (_jm_DECL_HEADERS): Add utmpx.h.
+ From John David Anglin.
+
+ * m4/strftime.m4: Back out the 2000-04-02 change.
+ Instead of that change, simply undefine putenv in the test program.
+
+2000-04-05 Jim Meyering <meyering@lucent.com>
+
+ Portability tweaks required for ultrix4.3.
+ * lib/readutmp.h [HAVE_UTMPX_H && !HAVE_DECL_GETUTENT]: Declare
+ getutent.
+ * lib/readutmp.c: Include sys/types.h before sys/stat.h.
+ * lib/canon-host.c: Declare strdup.
+ * lib/path-concat.c: Likewise.
+ From John David Anglin.
+
+2000-04-04 Jim Meyering <meyering@lucent.com>
+
+ Be more DOS 8.3-friendly.
+ * lib/ref-add.sin: Renamed from ref-add.sed.in.
+ * lib/ref-del.sin: Renamed from ref-del.sed.in.
+ * lib/Makefile.am: Reflect renaming.
+ Reported by Eli Zaretskii.
+
+ Use a temporary file name that won't clash with `charset.alias'
+ in the DOS 8.3 name space.
+ * lib/Makefile.am (charset_tmp): Define.
+ (install-exec-local): Use $(charset_tmp) instead of $(charset_alias)-t.
+ (uninstall-local): Likewise.
+ Reported by Eli Zaretskii.
+
+2000-04-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/gettext.m4: Fix typo in comment.
+
+ * m4/codeset.m4 (AC_CHECK_HEADERS): Add langinfo.h (moved here from
+ textutils/configure.in). Suggestion from Paul Eggert.
+ (AC_CHECK_FUNCS): Add nl_langinfo. (also from textutils/configure.in)
+
+2000-04-02 Paul Eggert <eggert@twinsun.com>
+
+ * m4/strftime.m4 (jm_FUNC_GNU_STRFTIME): Set TZ environment
+ variable in the shell rather than using putenv, which isn't
+ portable. This avoids the configure-time inter-test dependency
+ on the potentially-renamed putenv function.
+
+2000-03-30 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Include <sys/stat.h>
+ before checking struct stat.st_blksize, so that
+ HAVE_STRUCT_STAT_ST_BLKSIZE is defined correctly.
+
+2000-03-29 Paul Eggert <eggert@twinsun.com>
+
+ * m4/strftime.m4 (_jm_STRFTIME_PREREQS): Check for strftime,
+ since strftime.c uses HAVE_STRFTIME to decide whether to use
+ the underlying strftime.
+
+2000-03-29 Paul Eggert <eggert@twinsun.com>
+
+ * lib/time/strftime.c (my_strftime): Make sure we call the system
+ strftime, not ourselves, when invoking the underlying strftime.
+
+2000-03-24 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (EXTRA_DIST): Add ref-add.sed.in and ref-del.sed.in.
+ (charset_alias): Define.
+ (install-exec-local): Factor out common code.
+ (uninstall-local): Split lines longer than 80.
+ (ref-add.sed, ref-del.sed): Remove rules... (do the following instead)
+ (SUFFIXES): Define.
+ (.sed.in.sed): New rule. Don't redirect directly to $@.
+ (CLEANFILES): Add ref-add.sed and ref-del.sed.
+
+2000-03-19 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/config.charset: Output a line containing "Packages using this
+ file".
+ * lib/ref-add.sed.in, lib/ref-del.sed.in: New files.
+ * lib/Makefile.am (install-exec-local, uninstall-local, ref-add.sed,
+ ref-del.sed): New rules.
+
+2000-03-17 Jim Meyering <meyering@lucent.com>
+
+ * lib/unicodeio.c (<string.h>): Include only #if HAVE_STRING_H.
+ Otherwise, include <strings.h>
+
+2000-03-17 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/unicodeio.c (utf8_wctomb): New function.
+ (print_unicode_char): Pass the Unicode character to iconv in UTF-8
+ format instead of in UCS-4 with platform dependent endianness.
+
+2000-03-10 Jim Meyering <meyering@lucent.com>
+
+ * m4/lib-check.m4: Look for getspnam in -lgen, too.
+ From Marco Franzen.
+
+2000-03-07 Paul Eggert <eggert@twinsun.com>
+
+ * lib/savedir.c (savedir): Work even if directory size is
+ negative; this can happen with some screwy NFS configurations.
+
+2000-03-06 Jim Meyering <meyering@lucent.com>
+
+ * lib/localcharset.c (get_charset_aliases): Don't try to free file_name
+ if it's NULL (because we ran out of memory). From Bruno Haible.
+
+2000-03-05 Jim Meyering <meyering@lucent.com>
+
+ * lib/localcharset.c ("path-concat.h"): Include.
+ (get_charset_aliases): Use path_concat instead of ANSI string
+ concatenation.
+
+ * lib/unicodeio.h (PARAMS): Define.
+ Use it to guard prototype.
+
+2000-03-04 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Require AC_C_VOLATILE,
+ for lib/localcharset.c.
+
+2000-03-04 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (install-exec-local): Create $(libdir) before
+ installing into it.
+ (uninstall-local): Uncomment this rule so `make distcheck' works
+ once again.
+
+ * lib/unicodeio.c (<errno.h>): Include it.
+ (errno): Declare if not defined.
+
+ * lib/localcharset.c: Add Bruno's comment justifying use of volatile.
+
+ * lib/config.charset: New version, incorporating remarks from a linux
+ i18n mailing list. From Bruno Haible.
+
+2000-03-04 Bruno Haible <haible@clisp.cons.org>
+
+ * m4/codeset.m4: New file.
+ * m4/iconv.m4: New file.
+ * m4/jm-macros.m4 (jm_MACROS): Call jm_LANGINFO_CODESET and jm_ICONV.
+
+2000-03-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/regex.m4: Make sure re_compile_pattern accepts patterns like `{1'.
+
+2000-03-02 Jim Meyering <meyering@lucent.com>
+
+ * m4/timespec.m4: Require AC_HEADER_TIME before the cache check so
+ the messages come out on separate lines.
+
+ * m4/jm-glibc-io.m4 (jm_FUNC_GLIBC_UNLOCKED_IO): Use AC_CHECK_DECLS,
+ rather than jm_CHECK_DECLARATIONS.
+ * m4/decl.m4: Remove now-unused file.
+
+ * m4/check-decl.m4 (AC_CHECK_DECLS): Add getlogin, ttyname, and
+ geteuid.
+
+2000-03-02 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (EXTRA_DIST): Add config.charset.
+
+2000-03-01 Jim Meyering <meyering@lucent.com>
+
+ * lib/localcharset.c: Guard some #includes with `#if HAVE_...'.
+ * lib/unicodeio.c: Likewise.
+
+2000-03-01 Bruno Haible <haible@clisp.cons.org>
+
+ * lib/config.charset: New file.
+ * lib/localcharset.c: New file.
+ * lib/unicodeio.h, lib/unicodeio.c: New files.
+ * lib/Makefile.am (DEFS): Add -DLIBDIR=...
+ (libfetish_a_SOURCES): Add localcharset.c and unicodeio.c.
+ (noinst_HEADERS): Add unicodeio.h.
+ (all-local, install-exec-local, charset.alias): New targets.
+
+2000-02-28 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (ALERT_CHAR): New macro.
+ (quotearg_buffer_restyled): Use it.
+
+2000-02-27 Jim Meyering <meyering@lucent.com>
+
+ * m4/check-decl.m4: Add getenv to the list.
+
+2000-02-27 Jim Meyering <meyering@lucent.com>
+
+ * lib/strtoumax.c: Fix typo in decl of strtoul: s/long long/long/.
+ Guard declaration of strtoull also with `&& HAVE_UNSIGNED_LONG_LONG'.
+
+ * lib/backupfile.c: Guard inclusion of stdlib.h with
+ `#if HAVE_STDLIB_H', not `#if STDC_HEADERS'.
+ Declare malloc if needed.
+
+ * lib/backupfile.c: Use `#if !HAVE_DECL...' instead of
+ `#ifndef HAVE_DECL..'
+ now that autoconf always defines the HAVE_DECL_ symbols.
+ * lib/human.c: Likewise.
+ * lib/same.c: Likewise.
+ * lib/strtoumax.c: Likewise.
+
+ * lib/backupfile.c: Arrange for cpp to fail if the configure-time
+ declaration check was not run.
+ * lib/hash.c: Likewise.
+ * lib/human.c: Likewise.
+ * lib/same.c: Likewise.
+ * lib/strtoumax.c: Likewise.
+
+ * lib/userspec.c (parse_user_spec): If there is no `:' but there is a
+ `.', then first look up the entire `.'-containing string as a login
+ name.
+
+2000-02-23 Jim Meyering <meyering@lucent.com>
+
+ * m4/check-decl.m4: Now that we have the new AC_CHECK_DECLS, use it
+ in place of my hack.
+
+2000-02-18 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getdate.y: Handle two-digit years with leading zeros correctly.
+ (textint): New typedef.
+ (parser_control): Member year changed from int to textint.
+ All uses changed.
+ (YYSTYPE): Removed; replaced by %union with int and textint members.
+ (tDAY, tDAY_UNIT, tDAYZONE, tHOUR_UNIT, tID, tLOCAL_ZONE, tMERIDIAN,
+ tMINUTE_UNIT, tMONTH, tMONTH_UNIT tSEC_UNIT, tSNUMBER, tUNUMBER,
+ tYEAR_UNIT, tZONE, o_merid): Now of type <intval>.
+ (tSNUMBER, tUNUMBER): Now of type <textintval>.
+ (date, number, to_year): Use width of number in digits, not its value,
+ to determine whether it's a 2-digit year, or a 2-digit time.
+ (yylex): Store number of digits of numeric tokens.
+ Reported by John Kendall.
+
+ (parser_control): Changed from struct parser_control to typedef (for
+ consistency). All uses changed.
+
+ (tID): Removed; not used.
+ (yylex): Return '?' for unknown identifiers, rather than (unused) tID.
+
+2000-02-14 Paul Eggert <eggert@twinsun.com>
+
+ * lib/getpagesize.h (getpagesize): Port to VMS for Alpha;
+ adapted from changes to grep getpagesize.h by Martin P.J. Zinser.
+
+2000-02-12 Jim Meyering <meyering@lucent.com>
+
+ * lib/userspec.c (ISDIGIT): Define it.
+ (isdigit): Remove definition.
+ (is_number): Use ISDIGIT, not isdigit.
+ <libintl.h>: Include.
+ (_ and N_): Define.
+ (parse_user_spec): Mark translatable strings.
+
+2000-02-10 Jim Meyering <meyering@lucent.com>
+
+ With these changes, nanosleep.[ch] are finally enough like the other
+ lib/* replacement files to compile on a few more losing systems.
+
+ * lib/nanosleep.h: Don't include config.h.
+ Remove prototype from declaration of nanosleep.
+ (PARAMS): Remove now-unneeded definition.
+ * lib/nanosleep.c: #undef nanosleep.
+ (rpl_nanosleep): Rename from nanosleep.
+
+2000-02-10 Jim Meyering <meyering@lucent.com>
+
+ * m4/nanosleep.m4 (jm_FUNC_NANOSLEEP): Rename replacement function from
+ gnu_nanosleep to rpl_nanosleep.
+
+2000-02-09 Jim Meyering <meyering@lucent.com>
+
+ * m4/lib-check.m4 (jm_LIB_CHECK): Fix typo: check for sp_pwdp in
+ struct spwd, rather than in struct passwd. Reported by Gaël Quéri.
+
+2000-02-08 Akim Demaille <akim@epita.fr>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE_FLAGS): Quote square brackets with
+ `[' and `]' and remove uses of `changequote'.
+ (AC_SYS_LARGEFILE_MACRO_VALUE): Likewise.
+ (AC_SYS_LARGEFILE): Likewise.
+ * m4/gettext.m4 (AM_GNU_GETTEXT): Likewise.
+ * m4/strftime.m4 (jm_FUNC_GNU_STRFTIME): Remove now-unnecessary use
+ of changequote.
+ * m4/regex.m4 (jm_INCLUDED_REGEX): Likewise.
+ * m4/readdir.m4 (jm_FUNC_READDIR): Likewise
+ * m4/memcmp.m4 (jm_AC_FUNC_MEMCMP): Likewise, and add `int' for main.
+ * m4/getloadavg.m4 (AM_FUNC_GETLOADAVG): Likewise.
+
+2000-02-05 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Require most macros.
+ Remove explicit use of AC_HEADER_TIME. It is required by
+ jm_CHECK_TYPE_STRUCT_TIMESPEC. Using AC_HEADER_TIME and
+ `AC_REQUIRE'ing jm_CHECK_TYPE_STRUCT_TIMESPEC provoked a but
+ in autoconf whereby the expansion of the latter ended up preceding
+ the expansion of its prerequisite, AC_HEADER_TIME.
+ Reported by Volker Borchert.
+
+2000-02-03 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_READUTMP): Check for utmpxname.
+
+2000-02-03 Jim Meyering <meyering@lucent.com>
+
+ * lib/readutmp.c (read_utmp): Guard with `#ifdef UTMP_NAME_FUNCTION',
+ rather than with `#if HAVE_UTMPNAME'.
+
+2000-02-02 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_ADDEXT): Fix typo that resulted in no
+ definition of HAVE_PATHCONF: s/AC_CHECK_FUNC/AC_CHECK_FUNCS/.
+ Reported by Eli Zaretskii.
+
+2000-02-01 Jim Meyering <meyering@lucent.com>
+
+ * lib/readutmp.h (UT_USER): Add parens. From Andreas Schwab.
+
+2000-01-31 Jim Meyering <meyering@lucent.com>
+
+ * m4/check-decl.m4 (jm_CHECK_DECLS): Add nanosleep to the list of
+ functions. Add the time.h and sys/time.h headers along with the
+ AC_REQUIRE'ment of AC_HEADER_TIME.
+
+2000-01-31 Jim Meyering <meyering@lucent.com>
+
+ * lib/nanosleep.h (nanosleep): Guard declaration with
+ `#if ! HAVE_DECL_NANOSLEEP'.
+ Without this, OFS gets a redeclaration error for rpl_nanosleep, due to
+ the declaration in that vendor's sys/timers.h.
+ Reported by Christian Krackowizer.
+
+ * lib/quotearg.c (ISASCII): Add #undef and move definition to follow
+ inclusion of wctype.h to work around Solaris 2.6 namespace pollution.
+ (ISPRINT): Likewise.
+ Reported by Tom Tromey.
+
+2000-01-30 Jim Meyering <meyering@lucent.com>
+
+ * m4/lib-check.m4: Clean up some kludgy old shadow password tests.
+
+ * m4/prereq.m4 (utmp_includes): Define.
+ Check for ut_user and ut_name members in both struct utmpx
+ and struct utmp.
+
+2000-01-30 Jim Meyering <meyering@lucent.com>
+
+ * lib/readutmp.c (extract_trimmed_name): Use UT_USER instead of
+ hard-coding uses of ->ut_name. The latter doesn't work with new Linux
+ header files where only utmpx.ut_user is declared.
+
+ * lib/readutmp.h (UT_USER): Define.
+
+2000-01-29 Jim Meyering <meyering@lucent.com>
+
+ * m4/lib-check.m4: New file containing library-related checks from
+ fileutils and sh-utils (textutils had none).
+
+2000-01-28 Jim Meyering <meyering@lucent.com>
+
+ * m4/perl.m4: Change format of warning message to look more like that
+ from the missing script. Suggestion from François Pinard.
+
+2000-01-25 Jim Meyering <meyering@lucent.com>
+
+ * m4/timespec.m4: Require AC_HEADER_TIME, and include sys/time.h as
+ well as time.h in the compile check.
+ * m4/nanosleep.m4: Require AC_HEADER_TIME rather than simply using it.
+ Fix typo in cross-compiling case: s/yes/no/.
+
+2000-01-23 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Move df-related tests here from
+ fileutils/configure.in
+
+ * m4/ls-mntd-fs.m4: s/list_mounted_fs/ac_list_mounted_fs/
+ (jm_LIST_MOUNTED_FILESYSTEMS): Take two parameters.
+
+ * m4/fsusage.m4: New file. Extracted from fileutils/configure.in.
+ s/space/ac_fsusage_space/.
+ (jm_FILE_SYSTEM_USAGE): Take two parameters.
+
+ * m4/ftruncate.m4: New file (derived from part of
+ fileutils/configure.in).
+ * m4/jm-macros.m4 (jm_FUNC_FTRUNCATE): AC_REQUIRE it.
+ (jm_CHECK_ALL_TYPES): Require AC_HEADER_MAJOR and AC_HEADER_DIRENT.
+
+ * m4/jm-macros.m4 (OPTIONAL_BIN_PROGS, OPTIONAL_BIN_ZCRIPTS, MAN):
+ AC_SUBST these here, rather than just in sh-util/configure.in, so
+ that the now-shared-by-fileutils-and-textutils lib/Makefile.am are
+ all the same.
+ (AM_FUNC_OBSTACK): Add (from fileutils/configure.in).
+ (AC_CHECK_FUNCS): Merge all checks from fileutils, textutils, sh-utils.
+ (AM_FUNC_STRTOD): Added (from textutils', sh-utils' configure.in).
+ (AC_SUBST(POW_LIBM)): Likewise.
+ (AC_SUBST(DF_PROG)): Moved from fileutils/configure.in.
+
+2000-01-23 Jim Meyering <meyering@lucent.com>
+
+ * lib/Makefile.am (libfetish_a_SOURCES): Remove explicit mention of
+ obstack.c.
+
+2000-01-22 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Call AC_PROG_CC_STDC just before AC_C_CONST.
+
+ * m4/prereq.m4 (jm_PREREQ_QUOTEARG): Add wctype.h.
+
+ * m4/jm-macros.m4 (AC_CHECK_HEADERS): Add checks from fileutils'
+ configure.in
+ (AC_CHECK_HEADERS): Likewise for sh-utils.
+ (AC_CHECK_HEADERS): Likewise for textutils.
+ Merge the three lists of headers.
+
+ * m4/prereq.m4 (jm_PREREQ_ADDEXT): New macro. Parts moved here
+ from fileutils' configure.in.
+
+ * m4/decl.m4: Remove kludgy `test -z $ac_...AC_CHECK_HEADERS(...)'
+ code. Moved tests into their own function (_jm_DECL_HEADERS) in
+ check-decl.m4.
+
+ * m4/check-decl.m4: Use #if rather than #ifdef.
+ Add HAVE_DECL_STRTOUL and HAVE_DECL_STRTOULL.
+ (jm_CHECK_DECLARATIONS): Add strtoul strtoull.
+ (_jm_DECL_HEADERS): Define new function.
+ (jm_CHECK_DECLARATIONS): Require it.
+
+2000-01-22 Jim Meyering <meyering@lucent.com>
+
+ * lib/strtoumax.c: [! HAVE_DECL_STRTOUL]: Declare strtoul.
+ [! HAVE_DECL_STRTOULL]: Declare strtoull.
+ Required for some AIX systems. Reported by Christian Krackowizer.
+ [TESTING] (main): New function.
+
+ 1997-10-17 Eli Zaretskii <eliz@is.elta.co.il>
+ * lib/dirname.c (dir_name): Support for DOS-style file names with drive
+ letters.
+
+ * lib/quotearg.c [HAVE_WCTYPE_H]: Include <wctype.h> for decl of
+ iswprint.
+
+ * lib/strverscmp.c (ISDIGIT): Define.
+ (strverscmp): Use ISDIGIT, not isdigit.
+
+2000-01-19 Jim Meyering <meyering@lucent.com>
+
+ * m4/nanosleep.m4 (jm_FUNC_NANOSLEEP): Include <sys/time.h>, too.
+ Use AC_HEADER_TIME. Volker Borchert reported that OpenBSD-2.3/sparc
+ defines `struct timespec' in <sys/time.h>
+
+ * m4/c-bs-a.m4: Remove uses of changequote altogether.
+ Thanks to Akim for explaining.
+
+2000-01-17 Paul Eggert <eggert@twinsun.com>
+
+ * lib/nanosleep.c (nanosleep):
+ Don't use SA_INTERRUPT to decide whether to call sigaction, as
+ POSIX.1 doesn't require SA_INTERRUPT and some systems
+ (e.g. Solaris 7) don't define it. Use SA_NOCLDSTOP instead;
+ it's been part of POSIX.1 since day 1 (in 1988).
+
+2000-01-17 Jim Meyering <meyering@lucent.com>
+
+ * lib/interlock: Remove unused file. Reported by François Pinard.
+
+2000-01-16 Paul Eggert <eggert@twinsun.com>
+
+ * lib/quotearg.c (quotearg_buffer_restyled): Do not quote
+ alert, backslash, formfeed, and vertical tab unnecessarily in
+ shell quoting style.
+
+2000-01-16 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4: Require jm_FUNC_GROUP_MEMBER, jm_FUNC_PUTENV,
+ AM_FUNC_ERROR_AT_LINE, jm_FUNC_GNU_STRFTIME, jm_FUNC_MKTIME,
+ jm_FUNC_GETGROUPS AC_FUNC_VPRINTF, AC_FUNC_ALLOCA,
+ AM_FUNC_GETLOADAVG, and jm_SYS_PROC_UPTIME.
+
+2000-01-16 Jim Meyering <meyering@lucent.com>
+
+ * m4/c-bs-a.m4: Use `changequote(<<,>>)', rather than `changequote(, )'
+ because the latter didn't work.
+
+2000-01-15 Jim Meyering <meyering@lucent.com>
+
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Add gethostname and getusershell.
+ (AC_REPLACE_FUNCS): Add memcpy and memset.
+ Add these, too: stime strcspn stpcpy strstr strtol strtoul.
+ Add strpbrk.
+ Add these: euidaccess memcmp mkdir rmdir rpmatch strndup strverscmp.
+
+2000-01-12 Jim Meyering <meyering@lucent.com>
+
+ * m4/prereq.m4 (jm_PREREQ_CANON_HOST): New macro.
+ (jm_PREREQ): Use it.
+ (jm_PREREQ_READUTMP): New macro.
+ (jm_PREREQ): Use it.
+
+2000-01-11 Paul Eggert <eggert@twinsun.com>
+
+ Quote multibyte characters correctly.
+ * m4/c-bs-a.m4: New file.
+ * m4/prereq.m4 (jm_PREREQ_QUOTEARG): New macro.
+ (jm_PREREQ): Use it.
+
+2000-01-11 Paul Eggert <eggert@twinsun.com>
+
+ * m4/uintmax_t.m4: Port to autoconf 2.13.
+
+2000-01-08 Jim Meyering <meyering@ascend.com>
+
+ * m4/strerror_r.m4 (jm_FUNC_STRERROR_R): New file/macro.
+ * m4/jm-macros.m4 (jm_FUNC_STRERROR_R): Require it.
+
+2000-01-04 Jim Meyering <meyering@ascend.com>
+
+ * m4/d-type.m4 (jm_CHECK_TYPE_STRUCT_DIRENT_D_TYPE): Rename from
+ jm_STRUCT_DIRENT_D_TYPE.
+ * m4/d-ino.m4 (jm_CHECK_TYPE_STRUCT_DIRENT_D_INO): Rename from
+ jm_STRUCT_DIRENT_D_INO.
+ * m4/utimbuf.m4 (jm_CHECK_TYPE_STRUCT_UTIMBUF): Rename from
+ jm_STRUCT_UTIMBUF.
+ * m4/jm-macros.m4: Reflect s/jm_STRUCT_/jm_CHECK_TYPE_STRUCT_/
+ renamings.
+ * m4/utime.m4: Likewise.
+
+ * m4/timespec.m4 (jm_CHECK_TYPE_STRUCT_TIMESPEC): New file, macro.
+ * m4/jm-macros.m4 (jm_CHECK_TYPE_STRUCT_TIMESPEC): Require it.
+
+2000-01-03 Paul Eggert <eggert@twinsun.com>
+
+ * m4/nanosleep.m4 (jm_FUNC_NANOSLEEP): Search for nanosleep in -lrt
+ (for Solaris 7) and in -lposix4 (for Solaris 2.5.1).
+
+2000-01-02 Jim Meyering <meyering@ascend.com>
+
+ * m4/search-libs.m4: Escape `$' in $3 of dnl comment. I no longer
+ remember if this is necessary.
+
+1999-12-26 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Use it here.
+ * m4/nanosleep.m4 (jm_FUNC_NANOSLEEP): New file/macro.
+
+1999-12-23 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Check for clock_gettime (moved from
+ fileutils/configure.in)
+ Check for gettimeofday.
+
+1999-12-20 Jim Meyering <meyering@ascend.com>
+
+ * m4/strftime.m4: Remove kludge, now that I'm using the fixed
+ autoconf-2.14a-1999-12-20.
+
+1999-12-19 Jim Meyering <meyering@ascend.com>
+
+ * m4/lstat-slash.m4: New file.
+ * m4/jm-macros.m4: Use the new macro:
+ jm_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK.
+
+1999-12-07 Jim Meyering <meyering@ascend.com>
+
+ * m4/perl.m4: Require that File::Compare be available, too.
+ Too many systems seem to lack it.
+
+ * m4/strftime.m4: Add checks for most of the cpp macros tested in
+ GNU's strftime.c. Prompted by a patch from Paul Eggert.
+
+1999-11-18 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE_FLAGS): Work around a
+ problem with the QNX 4.25 shell, which doesn't propagate exit
+ status of failed commands inside shell assignments.
+
+1999-11-17 Jim Meyering <meyering@ascend.com>
+
+ * m4/gettext.m4: Use new AC_CONFIG_LINKS in place of AC_LINK_FILES.
+
+1999-11-07 Jim Meyering <meyering@ascend.com>
+
+ * m4/getloadavg.m4: Add `, 1, [FIXME]' to each use of AC_DEFINE.
+
+1999-11-06 Jim Meyering <meyering@ascend.com>
+
+ * m4/link-follow.m4 (jm_AC_FUNC_LINK_FOLLOWS_SYMLINK): New file/macro.
+ * m4/jm-macros.m4 (jm_MACROS): Use it here.
+
+1999-11-05 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Move some tests from
+ configure.in of textutils, fileutils, and sh-utils into this one
+ (shared between those packages) file.
+ Use `AC_CHECK_MEMBERS((struct stat.st_blksize))' instead of deprecated
+ AC_STRUCT_ST_BLKSIZE.
+
+1999-11-03 Jim Meyering <meyering@ascend.com>
+
+ * m4/ssize_t.m4: Remove file. No longer needed since the new version
+ of AC_CHECK_TYPE checks includes unistd.h.
+ * m4/jm-macros.m4: Use straight `AC_CHECK_TYPE(ssize_t, int)'.
+ Suggestion from Akim Demaille.
+
+1999-10-30 Jim Meyering <meyering@ascend.com>
+
+ * m4/uintmax_t.m4: Require 2.14a. Remove backslash before backtick in
+ m4-quoted string.
+ * m4/ls-mntd-fs.m4: Likewise.
+ * m4/jm-macros.m4: Likewise. Also, use AC_TYPE_SSIZE_T instead
+ * m4/jm-winsz1.m4: Likewise.
+
+ * m4/const.m4: Remove file, since the fix made it into the experimental
+ version of autoconf.
+ * m4/mktime.m4: Likewise.
+
+ * m4/check-type.m4: Remove file, now that the latest version of
+ AC_CHECK_TYPE takes a third arg to specify additional #includes.
+
+ * m4/ssize_t.m4: New file, requires experimental version of autoconf.
+ * m4/jm-macros.m4: Use new AC_TYPE_SSIZE_T instead of my hacked
+ AC_CHECK_TYPE.
+
+1999-10-04 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Don't require autoconf-2.14.1.
+
+1999-09-22 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE_FLAGS): Work around GCC
+ 2.95.1 bug with HP-UX 10.20.
+
+1999-09-17 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Add strdup.
+ Paul Nevai reported a link failure on a NeXT CUBE with NeXTSTEP 3.3
+ due to missing strdup (against sh-utils-2.0).
+
+1999-08-29 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Require jm_BISON.
+ * m4/bison.m4: New file.
+
+1999-08-17 Paul Eggert <eggert@twinsun.com>
+
+ * m4/largefile.m4 (AC_SYS_LARGEFILE): Fix typo: missing comma
+ in value for _FILE_OFFSET_BITS, which broke ports to HP-UX 10.20.
+
+1999-08-05 Jim Meyering <meyering@ascend.com>
+
+ * m4/getline.m4: Rename test file from conftestdata to conftest.data
+ to avoid conflicts with `conftest' on 8+3 filesystems.
+ Suggestion from Eli Zaretskii.
+
+1999-08-04 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Move a 4-line block of code from the configure.in of
+ fileutils and sh-utils (textutils's getline test was inadequate).
+ (AM_FUNC_GETLINE): Run this test.
+ (AC_CHECK_FUNCS): Check for getdelim.
+ Reported by Bob Proulx.
+
+1999-08-02 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Add a comment.
+
+1999-08-01 Paul Eggert <eggert@twinsun.com>
+
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX): Check whether
+ <inttypes.h> defines strtoumax as a macro (and not as a
+ function).
+
+1999-08-01 Paul Eggert <eggert@twinsun.com>
+
+ * m4/ulonglong.m4 (jm_AC_TYPE_UNSIGNED_LONG_LONG): Make sure
+ that we can shift, multiply and divide unsigned long long
+ values; Ultrix cc can't do it.
+
+1999-08-01 Paul Eggert <eggert@twinsun.com>
+
+ * m4/mktime.m4: New file, which is a preview of what should appear
+ in the next public autoconf release.
+
+1999-08-01 Paul Eggert <eggert@twinsun.com>
+
+ * m4/lfs.m4: Remove this file.
+ * m4/largefile.m4: New file. It contains the old contents of
+ lfs.m4, except that all names with prefix AC_LFS have been
+ changed to use the prefix AC_SYS_LARGEFILE instead, to be
+ compatible with future autoconf versions. Also, some minor m4
+ quoting problems have been fixed.
+
+1999-08-01 Paul Eggert <eggert@twinsun.com>
+
+ * m4/gettext.m4 (AM_WITH_NLS): Remove unnecessary lines.
+ Fix typo: $nls_cv_header_intl was misspelled as $nsl_cv_header_intl.
+ (AM_GNU_GETTEXT): Fix problem with brackets and m4 quoting,
+ and simplify the shell code.
+
+1999-08-01 Jim Meyering <meyering@ascend.com>
+
+ * m4/mktime.m4 (AC_FUNC_MKTIME): Undefine to avoid syntax errors from
+ m4.
+
+1999-07-20 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Add memmove.
+
+1999-07-15 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4 (AC_CHECK_FUNCS): Check for getpagesize.
+
+1999-05-22 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Add memchr.
+
+1999-05-20 Jim Meyering <meyering@ascend.com>
+
+ * m4/search-libs.m4 [AC_SEARCH_LIBS]: Quote name in undefine.
+ Add a colon after each `then' in case $4 is empty.
+
+1999-05-16 Jim Meyering <meyering@ascend.com>
+
+ * m4/search-libs.m4: New file to override autoconf's AC_SEARCH_LIBS.
+
+1999-05-10 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-mktime.m4: Reflect renaming: AM_FUNC_MKTIME -> AC_FUNC_MKTIME.
+
+ * m4/jm-macros.m4: Require 2.14.1, since we use newly-renamed
+ AC_FUNC_MKTIME.
+
+1999-05-10 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * m4/jm-mktime.m4, putenv.m4: Fix typos in config.h comments.
+
+1999-05-04 Paul Eggert <eggert@twinsun.com>
+
+ * m4/lfs.m4 (AC_LFS): -n32, -o32, and -n64 should be in CFLAGS,
+ not CPPFLAGS, so that linking works correctly in IRIX.
+
+1999-04-30 Paul Eggert <eggert@twinsun.com>
+
+ * m4/jm-macros.m4 (AC_REPLACE_FUNCS): Add dup2.
+
+1999-04-20 Paul Eggert <eggert@twinsun.com>
+
+ * m4/uintmax_t.m4 (jm_AC_TYPE_UINTMAX_T): Move unsigned long
+ long check into new jm_AC_TYPE_UNSIGNED_LONG_LONG macro.
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): Require
+ jm_AC_TYPE_UNSIGNED_LONG_LONG.
+ * m4/ulonglong.m4 (jm_AC_TYPE_UNSIGNED_LONG_LONG): New file/macro.
+
+ * m4/lfs.m4: Port to AIX and HP-UX. Support cross-compilation.
+
+1999-04-20 Jim Meyering <meyering@ascend.com>
+
+ * m4/xstrtoumax.m4: Require jm_AC_TYPE_UNSIGNED_LONG_LONG.
+ AC_REPLACE xstroull if necessary. From Paul Eggert.
+ (AC_CHECK_FUNCS): Remove strtoull, strtoumax, strtouq.
+
+1999-04-18 Jim Meyering <meyering@ascend.com>
+
+ * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX): New file/macro.
+ * m4/jm-macros.m4: Use it.
+
+1999-04-06 Jim Meyering <meyering@ascend.com>
+
+ * m4/strftime.m4: Remove test for %f.
+
+1999-03-29 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4 (jm_CHECK_ALL_TYPES): New macro, contains the
+ superset of the AC_TYPE_* checks in the textutils, fileutils,
+ and sh-utils, plus AC_TYPE_PID_T. Paul Eggert suggested adding
+ AC_TYPE_PID_T.
+
+1999-03-28 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Define GNU_PACKAGE here.
+ Be sure to AC_SUBST it, once again, so that @GNU_PACKAGE@ is
+ replaced e.g., in the *.sh files of the sh-utils.
+
+1999-03-20 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: s/jm_WITH_REGEX/jm_INCLUDED_REGEX/.
+ * m4/regex.m4 (jm_INCLUDED_REGEX): Rename from jm_WITH_REGEX.
+ Don't depend on AM_GLIBC. Suggestions from Alain Magloire.
+
+1999-03-19 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-winsz1.m4 (jm_WINSIZE_IN_PTEM): New macro.
+
+1999-03-12 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Use AC_FUNC_SETVBUF_REVERSED.
+
+1999-03-07 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-glibc-io.m4: Use only those *_unlocked macros that are
+ declared.
+
+1999-02-17 Jim Meyering <meyering@ascend.com>
+
+ * m4/gettext.m4 (AM_GNU_GETTEXT): Do `changequote' around use of
+ brackets in macro definition. From Eli Zaretskii and Alain Magloire.
+
+1999-02-07 Jim Meyering <meyering@ascend.com>
+
+ * m4/group-member.m4: New file -- extracted from sh-utils'
+ configure.in.
+
+ 1999-02-05 Eli Zaretskii <eliz@is.elta.co.il>
+ * m4/gettext.m4: Support DOS-style d:/foo/bar absolute file names.
+
+1999-02-06 Jim Meyering <meyering@ascend.com>
+
+ * m4/chown.m4: Use `AC_SUBST(LIBOBJS)' since we set LIBOBJS.
+ * m4/fnmatch.m4: Likewise.
+ * m4/getgroups.m4: Likewise.
+ * m4/lstat.m4: Likewise.
+ * m4/malloc.m4: Likewise.
+ * m4/putenv.m4: Likewise.
+ * m4/realloc.m4: Likewise.
+ * m4/regex.m4: Likewise.
+ * m4/stat.m4: Likewise.
+ * m4/strftime.m4: Likewise.
+ Suggestion from Alain Magloire.
+
+ * m4/chown.m4: Use `.$ac_objext', not `.o'.
+ * m4/fnmatch.m4: Likewise.
+ * m4/getgroups.m4: Likewise.
+ * m4/getline.m4: Likewise.
+ * m4/lstat.m4: Likewise.
+ * m4/malloc.m4: Likewise.
+ * m4/memcmp.m4: Likewise.
+ * m4/putenv.m4: Likewise.
+ * m4/realloc.m4: Likewise.
+ * m4/regex.m4: Likewise.
+ * m4/stat.m4: Likewise.
+ * m4/strftime.m4: Likewise.
+ Suggestion from Alain Magloire.
+
+ * m4/jm-macros.m4: Actually invoke jm_WITH_REGEX now that it requires
+ an argument.
+
+ * m4/regex.m4: Add a run-time Test for proper operation of
+ re_compile_pattern.
+
+1999-01-31 Jim Meyering <meyering@ascend.com>
+
+ * m4/getloadavg.m4: Check for locale.h and the function, setlocale.
+
+1999-01-30 Jim Meyering <meyering@ascend.com>
+
+ * m4/check-type.m4: Use 3-arg form of AC_DEFINE.
+
+ * m4/jm-mktime.m4: Make this a wrapper around the official
+ AM_FUNC_MKTIME rather than my private copy, now that the official one
+ is up to date.
+ * m4/mktime.m4: Remove file.
+
+ * m4/getloadavg.m4: Use 3-arg form of AC_DEFINE.
+ * m4/uptime.m4: Likewise.
+ * m4/uintmax_t.m4: Likewise.
+
+1999-01-28 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Use jm_AFS.
+ * m4/afs.m4: New file (from fileutils' configure.in).
+
+ * m4/assert.m4: Use the 3-argument forms of AC_DEFINE* macros.
+ * m4/chown.m4: Likewise.
+ * m4/d-ino.m4: Likewise.
+ * m4/d-type.m4: Likewise.
+ * m4/fnmatch.m4: Likewise.
+ * m4/getgroups.m4: Likewise.
+ * m4/gettext.m4: Likewise.
+ * m4/jm-mktime.m4: Likewise.
+ * m4/jm-winsz2.m4: Likewise.
+ * m4/lcmessage.m4: Likewise.
+ * m4/ls-mntd-fs.m4: Likewise.
+ * m4/malloc.m4: Likewise.
+ * m4/memcmp.m4: Likewise.
+ * m4/putenv.m4: Likewise.
+ * m4/realloc.m4: Likewise.
+ * m4/st_mtim.m4: Likewise.
+ * m4/strftime.m4: Likewise.
+
+1999-01-16 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4 (ARGMATCH_DIE): Define.
+ (ARGMATCH_DIE_DECL): Define.
+
+1999-01-12 Jim Meyering <meyering@ascend.com>
+
+ * m4/Makefile.am.in: Rewrite to avoid using fmt.
+ Reported by Lars Hecking.
+
+1999-01-10 Jim Meyering <meyering@ascend.com>
+
+ * m4/fstypename.m4: Use the new 3-arg form of AC_DEFINE instead of my
+ gross kludge.
+ * m4/inttypes_h.m4: Likewise.
+ * m4/lstat.m4: Likewise.
+ * m4/malloc.m4: Likewise.
+ * m4/readdir.m4: Likewise.
+ * m4/realloc.m4: Likewise.
+ * m4/st_dm_mode.m4: Likewise.
+ * m4/stat.m4: Likewise.
+ * m4/utimbuf.m4: Likewise.
+ * m4/utimes.m4: Likewise.
+
+ * m4/check-decl.m4: Use the new 3-arg form of AC_DEFINE instead of the
+ AC_CHECK_FUNCS hack. Now, it's still a hack, but at least the
+ comments in config.h.in are meaningful.
+
+ * m4/jm-macros.m4: Require autoconf-2.13 here.
+
+ * m4/regex.m4: By default, don't use the included regex.c on systems
+ with glibc 2. Suggestion from Uli Drepper.
+
+1999-01-02 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Replace strcasecmp and strncasecmp.
+
+1998-12-18 Jim Meyering <meyering@ascend.com>
+
+ * m4/Makefile.am.in (Makefile.am): Simplify rule.
+ Based on a suggestion from Lars Hecking.
+
+1998-11-16 Paul Eggert <eggert@twinsun.com>
+
+ * m4/lfs.m4 (AC_LFS): Add support for HP-UX 10.20 and HP-UX 11.
+
+1998-11-16 Jim Meyering <meyering@ascend.com>
+
+ * m4/lfs.m4: Double-quote the `uname...` expression.
+
+1998-11-14 Jim Meyering <meyering@ascend.com>
+
+ * m4/lstat.m4: Correct comment. POSIX does not permit it to succeed.
+ * m4/stat.m4: Likewise.
+
+1998-11-03 Jim Meyering <meyering@ascend.com>
+
+ * m4/stat.m4: Rewrite to set HAVE_STAT_EMPTY_STRING_BUG.
+ * m4/lstat.m4: Rewrite to set HAVE_LSTAT_EMPTY_STRING_BUG.
+
+1998-10-18 Jim Meyering <meyering@ascend.com>
+
+ * m4/check-decl.m4 (jm_CHECK_DECL_LOCALTIME_R): Remove macro.
+
+1998-10-17 Jim Meyering <meyering@ascend.com>
+
+ * m4/decl.m4 (jm_CHECK_DECLARATION): Don't hard-code which headers to
+ include, though we still hard-code the `require'-like AC_CHECK_HEADERS
+ calls for those previously hard-coded headers. Instead, take a new
+ parameter.
+ (jm_CHECK_DECLARATIONS): Reflect interface change.
+ * m4/check-decl.m4 (jm_CHECK_DECLS): Likewise.
+ (jm_CHECK_DECL_LOCALTIME_R): New macro.
+
+ * m4/mktime.m4: Test for spring-forward gap before long-running test.
+
+1998-10-14 Jim Meyering <meyering@ascend.com>
+
+ * m4/mktime.m4: Use the more portable "TZ=PST8PDT,M4.1.0,M10.5.0"
+ instead of "TZ=America/Vancouver". From Paul Eggert.
+
+1998-10-11 Jim Meyering <meyering@ascend.com>
+
+ * m4/mktime.m4 (jm_AM_FUNC_MKTIME): New file and macro.
+ This adds a test for a recently added compatibility fix for mktime.c.
+ * m4/jm-mktime.m4: Require jm_AM_FUNC_MKTIME, not AM_FUNC_MKTIME.
+
+1998-09-27 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4 (jm_MACROS): Require jm_FUNC_FNMATCH.
+
+ * m4/fnmatch.m4 (jm_FUNC_FNMATCH): New file/macro. Extracted from
+ ../configure.in, including a change from Gordon Matzigkeit to allow
+ cross-compiling for the Hurd.
+
+ * m4/glibc.m4: New file/macro to test for the GNU C Library
+ versions 1 and 2. From Gordon Matzigkeit.
+ Indent.
+
+1998-09-21 Jim Meyering <meyering@ascend.com>
+
+ * m4/chown.m4: Declare locals: before, after. From Andries Brouwer.
+
+1998-08-18 Paul Eggert <eggert@twinsun.com>
+
+ Port nanosecond-resolution times to UnixWare 2.1.2 and
+ pedantic Solaris 2.6.
+
+ * m4/st_mtim.m4 (AC_STRUCT_ST_MTIM_NSEC): Renamed from
+ AC_STRUCT_ST_MTIM.
+ * m4/st_mtim.m4 (AC_STRUCT_ST_MTIM_NSEC):
+ Generate name of ns member, instead of just 1 or undef.
+ Allow for UnixWare 2.1.2 and Solaris 2.6 if in pedantic mode.
+
+1998-08-15 Jim Meyering <meyering@ascend.com>
+
+ * m4/ssize_t.m4 (jm_TYPE_SSIZE_T): Remove file.
+ * m4/check-type.m4: New file. Replacement for AC_CHECK_TYPE.
+ * m4/jm-macros.m4: Use the new AC_CHECK_TYPE(ssize_t, int)
+ instead of jm_TYPE_SSIZE_T.
+
+1998-08-12 Jim Meyering <meyering@ascend.com>
+
+ * m4/st_dm_mode.m4: New file. From Johan Danielsson.
+
+1998-08-02 Jim Meyering <meyering@ascend.com>
+
+ * m4/st_mtim.m4: Use hack to avoid having to put #undef HAVE_ST_MTIM
+ in acconfig.h manually.
+
+1998-07-31 Paul Eggert <eggert@twinsun.com>
+
+ * m4/st_mtim.m4: New file.
+
+1998-07-28 Jim Meyering <meyering@ascend.com>
+
+ * m4/utimes.m4: Undef stat.
+
+1998-07-25 Jim Meyering <meyering@ascend.com>
+
+ * m4/utime.m4 (jm_FUNC_UTIME): New file and macro.
+ * m4/utimes.m4 (jm_FUNC_UTIMES_NULL): New file and macro.
+
+1998-07-09 Manfred Hollstein <manfred@s-direktnet.de>
+
+ * m4/chown.m4 (jm_FUNC_CHOWN): Add a check to verify that the
+ uid and gid actually remain unchanged.
+
+1998-07-07 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-glibc-io.m4: Remove fclose_unlocked.
+
+1998-07-04 Jim Meyering <meyering@ascend.com>
+
+ * m4/regex.m4: Use syscmd, ifelse, and sysval. Mainly as an exercise
+ to prove that this macro can be used in packages without regex.c.
+
+1998-07-04 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m4/gettext.m4 (AM_WITH_NLS): Remove intl/libintl.h if <libintl.h>
+ is to be used.
+
+1998-07-03 Jim Meyering <meyering@ascend.com>
+
+ * m4/gettext.m4: Add -lintl if it's found to be necessary.
+
+ * m4/gettext.m4: New file -- from gettext-0.10.35.
+ * m4/lcmessage.m4: Likewise.
+ * m4/progtest.m4: Likewise.
+
+ * m4/regex.m4 (jm_WITH_REGEX): New file and macro.
+ * m4/jm-macros.m4: Require the new macro.
+
+1998-06-29 Jim Meyering <meyering@ascend.com>
+
+ * m4/fstypename.m4: Include sys/param.h. NetBSD 1.3.1 requires this
+ for the definition of NGROUPS (used in a system header included
+ by sys/mount.h).
+
+1998-06-28 Jim Meyering <meyering@ascend.com>
+
+ * m4/ls-mntd-fs.m4: New file.
+ * m4/fstypename.m4: New file.
+
+ * m4/jm-macros.m4: Require the new macro.
+ * m4/jm-glibc-io.m4: New file.
+
+1998-05-19 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-macros.m4: Add jm_FUNC_LCHOWN.
+ * m4/lchown.m4: New file.
+
+ * m4/Makefile.am.in: New file.
+ * m4/Makefile.am (Makefile.am): Depend on Makefile.am.in.
+
+1998-05-14 Jim Meyering <meyering@ascend.com>
+
+ * m4/Makefile.am (EXTRA_DIST): Add them.
+ * m4/jm-macros.m4: New file.
+ * m4/utimbuf.m4: New file.
+
+1998-05-12 Jim Meyering <meyering@ascend.com>
+
+ * m4/Makefile.am (EXTRA_DIST): Add isc-posix.m4.
+
+1998-05-11 Jim Meyering <meyering@ascend.com>
+
+ * m4/isc-posix.m4: New file.
+
+1998-05-10 Jim Meyering <meyering@ascend.com>
+
+ * m4/jm-mktime.m4: Use AM_FUNC_MKTIME, now that it's up to date.
+
+1998-05-09 Jim Meyering <meyering@ascend.com>
+
+ * m4/Makefile.am (EXTRA_DIST): Add ssize_t.m4.
+ (EXTRA_DIST): Remove mktime.m4, now that the new version is included
+ with automake.
+
+ * m4/ssize_t.m4: New file.
+ * m4/mktime.m4: Remove file -- the new automake has this now.
+
+1998-04-26 Jim Meyering <meyering@ascend.com>
+
+ * m4/assert.m4: New file.
+ * m4/Makefile.am (EXTRA_DIST): Add assert.m4.
+
+1998-04-05 Jim Meyering <meyering@ascend.com>
+
+ * m4/prereq.m4 (jm_PREREQ_REGEX): New macro.
+ (jm_PREREQ): Use it here.
+
+1998-03-23 Jim Meyering <meyering@eng.ascend.com>
+
+ * m4/inttypes_h.m4: Kludges so I don't have to add HAVE_INTTYPES_H
+ in acconfig.h.
+
+1998-03-15 Jim Meyering <meyering@eng.ascend.com>
+
+ * m4/prereq.m4: New file.
+ * m4/error.m4: New file.
+ * m4/Makefile.am (EXTRA_DIST): Add error.m4 and prereq.m4.
+
+1998-02-07 Jim Meyering <meyering@eng.ascend.com>
+
+ * m4/getline.m4: Don't set am_cv_func_working_getline before the
+ cache-check for the same variable -- that defeated the purpose of
+ the test; the test program was never run. This was a problem only
+ on systems with losing getline functions -- HP-UX 10.20 is one.
+ Reported by Bjorn Helgaas.
+
+1998-02-06 Jim Meyering <meyering@eng.ascend.com>
+
+ * m4/Makefile.am (EXTRA_DIST): Add perl.m4.
+
+1998-01-10 Jim Meyering <meyering@na-net.ornl.gov>
+
+ * m4/Makefile.am (EXTRA_DIST): Add const.m4.
+
+ * m4/const.m4: New file. Use an initializer in this declaration
+ typedef int charset[2]; const charset x;
+ Reported by Bob Glickstein.
+
+1997-12-21 Jim Meyering <meyering@na-net.ornl.gov>
+
+ * m4/chown.m4: Fix reversed types on -1 args to chown.
+ From Kaveh Ghazi.
+
+1997-12-14 Jim Meyering <meyering@na-net.ornl.gov>
+
+ * m4/check-decl.m4: s/DECLARATION_/DECL_/g.
+ Add lseek and memchr.
+
+ * m4/decl.m4: s/HAVE_DECLARATION_/HAVE_DECL_/g.
+ T.E.Dickey <dickey@clark.net> said that some older preprocessors
+ have a 20-character limit on names.
+
+1997-11-30 Jim Meyering <meyering@na-net.ornl.gov>
+
+ * m4/inttypes_h.m4: New file.
+ * m4/uintmax_t.m4: New file.
+ * m4/Makefile.am (EXTRA_DIST): Add inttypes_h.m4 and uintmax_t.m4.
+
+
+ -----
+
+ Local Variables:
+ coding: utf-8
+ End:
+
+ Copyright (C) 1997-2010 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without
+ modification, are permitted provided the copyright notice
+ and this notice are preserved.
diff --git a/gnulib/DEPENDENCIES b/gnulib/DEPENDENCIES
new file mode 100644
index 00000000..a8f9a9d0
--- /dev/null
+++ b/gnulib/DEPENDENCIES
@@ -0,0 +1,145 @@
+The following packages are needed by maintainers for using
+'gnulib-tool'. In general, Gnulib prefers the latest stable
+version of each package, but in some cases it also supports
+older versions; this caters to commonly-used software
+distributions that may lag behind the latest stable package.
+Support for older versions is not guaranteed, though, and
+the version numbers in the following list may be incremented
+at any time.
+
+* A C runtime, compiler, linker, etc.
+ + Mandatory. Using the platform's native 'cc' gives good portability
+ exposure, but you can also use GCC 2.95 or newer.
+ + GCC Homepage:
+ http://gcc.gnu.org/
+ + Download:
+ http://ftp.gnu.org/gnu/gcc/
+ ftp://ftp.gnu.org/gnu/gcc/
+
+* A 'make' utility.
+ + Mandatory. Using the platform's native 'make' gives good portability
+ exposure for in-tree builds, but VPATH builds require GNU Make 3.79.1 or
+ newer.
+ + GNU Make Homepage:
+ http://www.gnu.org/software/make/
+ + Download:
+ http://ftp.gnu.org/gnu/make/
+ ftp://ftp.gnu.org/gnu/make/
+
+* GNU M4 1.4.5 or newer.
+ + 1.4.5 or newer is mandatory, but 1.4.9 or newer is recommended.
+ + Homepage:
+ http://www.gnu.org/software/m4/
+ + Download:
+ http://ftp.gnu.org/gnu/m4/
+ ftp://ftp.gnu.org/gnu/m4/
+
+* Autoconf 2.59 or newer.
+ + Mandatory.
+ + Homepage:
+ http://www.gnu.org/software/autoconf/
+ + Download:
+ http://ftp.gnu.org/gnu/autoconf/
+ ftp://ftp.gnu.org/gnu/autoconf/
+
+* Automake 1.9.6 or newer.
+ + Mandatory.
+ + Homepage:
+ http://www.gnu.org/software/automake/
+ + Download:
+ http://ftp.gnu.org/gnu/automake/
+ ftp://ftp.gnu.org/gnu/automake/
+
+* A shell
+ + Mandatory. Using the platform's native 'sh' gives good portability
+ exposure, but you can also use Bash.
+ + Homepage:
+ http://www.gnu.org/software/bash/
+ + Download:
+ http://ftp.gnu.org/gnu/bash/
+ ftp://ftp.gnu.org/gnu/bash/
+
+* Core POSIX utilities, including:
+ [ basename cat chgrp chmod chown cp dd echo expand expr
+ false hostname install kill ln ls md5sum mkdir mkfifo
+ mknod mv printenv pwd rm rmdir sleep sort tee test touch
+ true uname
+ + Mandatory. Using the platform's native utilities gives good portability
+ exposure, but you can also use GNU coreutils.
+ + Homepage:
+ http://www.gnu.org/software/coreutils/
+ + Download:
+ http://ftp.gnu.org/gnu/coreutils/
+ ftp://ftp.gnu.org/gnu/coreutils/
+
+* The comparison utilities 'cmp' and 'diff'.
+ + Mandatory. Using the platform's native utilities gives good portability
+ exposure, but you can also use GNU diffutils.
+ + Homepage:
+ http://www.gnu.org/software/diffutils/
+ + Download:
+ http://ftp.gnu.org/gnu/diffutils/
+ ftp://ftp.gnu.org/gnu/diffutils/
+
+* Grep.
+ + Mandatory. Using the platform's native grep gives good portability
+ exposure, but you can also use GNU grep.
+ + Homepage:
+ http://www.gnu.org/software/grep/
+ + Download:
+ http://ftp.gnu.org/gnu/grep/
+ ftp://ftp.gnu.org/gnu/grep/
+
+* GNU gettext 0.16.1.
+ + Recommended.
+ Needed if you use modules that use internationalization (many do).
+ + Homepage:
+ http://www.gnu.org/software/gettext/
+ + Download:
+ http://ftp.gnu.org/gnu/gettext/
+ ftp://ftp.gnu.org/gnu/gettext/
+
+* Bison 2.0 or newer.
+ + Recommended.
+ Needed if you use the 'getdate' module.
+ + Homepage:
+ http://www.gnu.org/software/bison/
+ + Download:
+ http://ftp.gnu.org/gnu/bison/
+ ftp://ftp.gnu.org/gnu/bison/
+
+* GNU gperf 3.0.1 or newer.
+ + Recommended.
+ Needed if you use the 'iconv_open' module.
+ + Homepage:
+ http://www.gnu.org/software/gperf/
+ + Download:
+ http://ftp.gnu.org/gnu/gperf/
+ ftp://ftp.gnu.org/gnu/gperf/
+
+* Texinfo 4.6 or newer.
+ + Recommended.
+ Needed if you use modules that include documentation.
+ + Homepage:
+ http://www.gnu.org/software/texinfo/
+ + Download:
+ http://ftp.gnu.org/gnu/texinfo/
+ ftp://ftp.gnu.org/gnu/texinfo/
+
+* GNU sed.
+ + Recommended.
+ Needed on platforms where the vendor's 'sed' program is too buggy.
+ + Homepage:
+ http://www.gnu.org/software/sed/
+ + Download:
+ http://ftp.gnu.org/gnu/sed/
+ ftp://ftp.gnu.org/gnu/sed/
+
+* GNU libtool 1.5.22 or newer.
+ + Optional.
+ Needed if you want to invoke gnulib-tool with option --libtool.
+ + Homepage:
+ http://www.gnu.org/software/libtool/
+ + Download:
+ http://ftp.gnu.org/gnu/libtool/
+ ftp://ftp.gnu.org/gnu/libtool/
diff --git a/gnulib/MODULES.html.sh b/gnulib/MODULES.html.sh
new file mode 100755
index 00000000..4c8cefae
--- /dev/null
+++ b/gnulib/MODULES.html.sh
@@ -0,0 +1,3367 @@
+#!/bin/sh
+#
+# Copyright (C) 2002-2010 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/>.
+#
+
+# Usage: MODULES.html.sh [--git-urls] > MODULES.html
+
+# Extend the PATH so that gnulib-tool is found.
+PATH=`dirname "$0"`:$PATH; export PATH
+
+POSIX2001_URL='http://www.opengroup.org/susv3'
+POSIX2008_URL='http://www.opengroup.org/onlinepubs/9699919799'
+
+repo_url_prefix=
+repo_url_suffix=
+if test $# != 0; then
+ case "$1" in
+ --git-urls)
+ # Generate URLs to the official gnulib git repository.
+ repo_url_prefix='http://git.sv.gnu.org/gitweb/?p=gnulib.git;a=blob_plain;f='
+ repo_url_suffix=''
+ ;;
+ esac
+fi
+# For sed replacements: Escape the '&'.
+repo_url_suffix_repl=`echo "$repo_url_suffix" | sed -e 's,[&],\\\&,'`
+
+sed_lt='s,<,\&lt;,g'
+sed_gt='s,>,\&gt;,g'
+sed_escape_dot='s,\.,\\.,g'
+sed_escape_slash='s,/,\\/,g'
+trnl='\012'
+sed_alt1='s,$,\\|,'
+sed_alt2='s,^\\|,\\(,'
+sed_alt3='s,\\|\\|$,\\),'
+posix_headers=`echo '
+aio
+arpa/inet
+assert
+complex
+cpio
+ctype
+dirent
+dlfcn
+errno
+fcntl
+fenv
+float
+fmtmsg
+fnmatch
+ftw
+glob
+grp
+iconv
+inttypes
+iso646
+langinfo
+libgen
+limits
+locale
+math
+monetary
+mqueue
+ndbm
+net/if
+netdb
+netinet/in
+netinet/tcp
+nl_types
+poll
+pthread
+pwd
+regex
+sched
+search
+semaphore
+setjmp
+signal
+spawn
+stdarg
+stdbool
+stddef
+stdint
+stdio
+stdlib
+string
+strings
+stropts
+sys/ipc
+sys/mman
+sys/msg
+sys/resource
+sys/select
+sys/sem
+sys/shm
+sys/socket
+sys/stat
+sys/statvfs
+sys/time
+sys/times
+sys/types
+sys/uio
+sys/un
+sys/utsname
+sys/wait
+syslog
+tar
+termios
+tgmath
+time
+trace
+ulimit
+unistd
+utime
+utmpx
+wchar
+wctype
+wordexp
+' | sed -e "$sed_alt1" | tr -d "$trnl" | sed -e "$sed_alt2" -e "$sed_alt3"`
+posix2001_headers=`echo '
+sys/timeb
+ucontext
+' | sed -e "$sed_alt1" | tr -d "$trnl" | sed -e "$sed_alt2" -e "$sed_alt3"`
+posix_functions=`echo '
+FD_CLR
+FD_ISSET
+FD_SET
+FD_ZERO
+_Exit
+_exit
+_longjmp
+_setjmp
+_tolower
+_toupper
+a64l
+abort
+abs
+accept
+access
+acos
+acosf
+acosh
+acoshf
+acoshl
+acosl
+aio_cancel
+aio_error
+aio_fsync
+aio_read
+aio_return
+aio_suspend
+aio_write
+alarm
+alphasort
+asctime
+asctime_r
+asin
+asinf
+asinh
+asinhf
+asinhl
+asinl
+assert
+atan
+atan2
+atan2f
+atan2l
+atanf
+atanh
+atanhf
+atanhl
+atanl
+atexit
+atof
+atoi
+atol
+atoll
+basename
+bind
+bsearch
+btowc
+cabs
+cabsf
+cabsl
+cacos
+cacosf
+cacosh
+cacoshf
+cacoshl
+cacosl
+calloc
+carg
+cargf
+cargl
+casin
+casinf
+casinh
+casinhf
+casinhl
+casinl
+catan
+catanf
+catanh
+catanhf
+catanhl
+catanl
+catclose
+catgets
+catopen
+cbrt
+cbrtf
+cbrtl
+ccos
+ccosf
+ccosh
+ccoshf
+ccoshl
+ccosl
+ceil
+ceilf
+ceill
+cexp
+cexpf
+cexpl
+cfgetispeed
+cfgetospeed
+cfsetispeed
+cfsetospeed
+chdir
+chmod
+chown
+cimag
+cimagf
+cimagl
+clearerr
+clock
+clock_getcpuclockid
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clog
+clogf
+clogl
+close
+closedir
+closelog
+confstr
+conj
+conjf
+conjl
+connect
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+coshl
+cosl
+cpow
+cpowf
+cpowl
+cproj
+cprojf
+cprojl
+creal
+crealf
+creall
+creat
+crypt
+csin
+csinf
+csinh
+csinhf
+csinhl
+csinl
+csqrt
+csqrtf
+csqrtl
+ctan
+ctanf
+ctanh
+ctanhf
+ctanhl
+ctanl
+ctermid
+ctime
+ctime_r
+daylight
+dbm_clearerr
+dbm_close
+dbm_delete
+dbm_error
+dbm_fetch
+dbm_firstkey
+dbm_nextkey
+dbm_open
+dbm_store
+difftime
+dirfd
+dirname
+div
+dlclose
+dlerror
+dlopen
+dlsym
+dprintf
+drand48
+dup
+dup2
+duplocale
+encrypt
+endgrent
+endhostent
+endnetent
+endprotoent
+endpwent
+endservent
+endutxent
+environ
+erand48
+erf
+erfc
+erfcf
+erfcl
+erff
+erfl
+errno
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+exp
+exp2
+exp2f
+exp2l
+expf
+expl
+expm1
+expm1f
+expm1l
+fabs
+fabsf
+fabsl
+faccessat
+fattach
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdetach
+fdim
+fdimf
+fdiml
+fdopen
+fdopendir
+feclearexcept
+fegetenv
+fegetexceptflag
+fegetround
+feholdexcept
+feof
+feraiseexcept
+ferror
+fesetenv
+fesetexceptflag
+fesetround
+fetestexcept
+feupdateenv
+fexecve
+fflush
+ffs
+fgetc
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+floor
+floorf
+floorl
+fma
+fmaf
+fmal
+fmax
+fmaxf
+fmaxl
+fmemopen
+fmin
+fminf
+fminl
+fmod
+fmodf
+fmodl
+fmtmsg
+fnmatch
+fopen
+fork
+fpathconf
+fpclassify
+fprintf
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freelocale
+freopen
+frexp
+frexpf
+frexpl
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatvfs
+fsync
+ftell
+ftello
+ftok
+ftruncate
+ftrylockfile
+ftw
+funlockfile
+futimens
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdate
+getdate_err
+getdelim
+getegid
+getenv
+geteuid
+getgid
+getgrent
+getgrgid
+getgrgid_r
+getgrnam
+getgrnam_r
+getgroups
+gethostent
+gethostid
+gethostname
+getitimer
+getline
+getlogin
+getlogin_r
+getmsg
+getnameinfo
+getnetbyaddr
+getnetbyname
+getnetent
+getopt
+getpeername
+getpgid
+getpgrp
+getpid
+getpmsg
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getprotoent
+getpwent
+getpwnam
+getpwnam_r
+getpwuid
+getpwuid_r
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getsid
+getsockname
+getsockopt
+getsubopt
+gettimeofday
+getuid
+getutxent
+getutxid
+getutxline
+getwc
+getwchar
+glob
+globfree
+gmtime
+gmtime_r
+grantpt
+hcreate
+hdestroy
+hsearch
+htonl
+htons
+hypot
+hypotf
+hypotl
+iconv
+iconv_close
+iconv_open
+if_freenameindex
+if_indextoname
+if_nameindex
+if_nametoindex
+ilogb
+ilogbf
+ilogbl
+imaxabs
+imaxdiv
+inet_addr
+inet_ntoa
+inet_ntop
+inet_pton
+initstate
+insque
+ioctl
+isalnum
+isalnum_l
+isalpha
+isalpha_l
+isascii
+isastream
+isatty
+isblank
+isblank_l
+iscntrl
+iscntrl_l
+isdigit
+isdigit_l
+isfinite
+isgraph
+isgraph_l
+isgreater
+isgreaterequal
+isinf
+isless
+islessequal
+islessgreater
+islower
+islower_l
+isnan
+isnormal
+isprint
+isprint_l
+ispunct
+ispunct_l
+isspace
+isspace_l
+isunordered
+isupper
+isupper_l
+iswalnum
+iswalnum_l
+iswalpha
+iswalpha_l
+iswblank
+iswblank_l
+iswcntrl
+iswcntrl_l
+iswctype
+iswctype_l
+iswdigit
+iswdigit_l
+iswgraph
+iswgraph_l
+iswlower
+iswlower_l
+iswprint
+iswprint_l
+iswpunct
+iswpunct_l
+iswspace
+iswspace_l
+iswupper
+iswupper_l
+iswxdigit
+iswxdigit_l
+isxdigit
+isxdigit_l
+j0
+j1
+jn
+jrand48
+kill
+killpg
+l64a
+labs
+lchown
+lcong48
+ldexp
+ldexpf
+ldexpl
+ldiv
+lfind
+lgamma
+lgammaf
+lgammal
+link
+linkat
+lio_listio
+listen
+llabs
+lldiv
+llrint
+llrintf
+llrintl
+llround
+llroundf
+llroundl
+localeconv
+localtime
+localtime_r
+lockf
+log
+log10
+log10f
+log10l
+log1p
+log1pf
+log1pl
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+logl
+longjmp
+lrand48
+lrint
+lrintf
+lrintl
+lround
+lroundf
+lroundl
+lsearch
+lseek
+lstat
+malloc
+mblen
+mbrlen
+mbrtowc
+mbsinit
+mbsnrtowcs
+mbsrtowcs
+mbstowcs
+mbtowc
+memccpy
+memchr
+memcmp
+memcpy
+memmove
+memset
+mkdir
+mkdirat
+mkdtemp
+mkfifo
+mkfifoat
+mknod
+mknodat
+mkstemp
+mktime
+mlock
+mlockall
+mmap
+modf
+modff
+modfl
+mprotect
+mq_close
+mq_getattr
+mq_notify
+mq_open
+mq_receive
+mq_send
+mq_setattr
+mq_timedreceive
+mq_timedsend
+mq_unlink
+mrand48
+msgctl
+msgget
+msgrcv
+msgsnd
+msync
+munlock
+munlockall
+munmap
+nan
+nanf
+nanl
+nanosleep
+nearbyint
+nearbyintf
+nearbyintl
+newlocale
+nextafter
+nextafterf
+nextafterl
+nexttoward
+nexttowardf
+nexttowardl
+nftw
+nice
+nl_langinfo
+nl_langinfo_l
+nrand48
+ntohl
+ntohs
+open
+open_memstream
+open_wmemstream
+openat
+opendir
+openlog
+optarg
+opterr
+optind
+optopt
+pathconf
+pause
+pclose
+perror
+pipe
+poll
+popen
+posix_fadvise
+posix_fallocate
+posix_madvise
+posix_mem_offset
+posix_memalign
+posix_openpt
+posix_spawn
+posix_spawn_file_actions_addclose
+posix_spawn_file_actions_adddup2
+posix_spawn_file_actions_addopen
+posix_spawn_file_actions_destroy
+posix_spawn_file_actions_init
+posix_spawnattr_destroy
+posix_spawnattr_getflags
+posix_spawnattr_getpgroup
+posix_spawnattr_getschedparam
+posix_spawnattr_getschedpolicy
+posix_spawnattr_getsigdefault
+posix_spawnattr_getsigmask
+posix_spawnattr_init
+posix_spawnattr_setflags
+posix_spawnattr_setpgroup
+posix_spawnattr_setschedparam
+posix_spawnattr_setschedpolicy
+posix_spawnattr_setsigdefault
+posix_spawnattr_setsigmask
+posix_spawnp
+posix_trace_attr_destroy
+posix_trace_attr_getclockres
+posix_trace_attr_getcreatetime
+posix_trace_attr_getgenversion
+posix_trace_attr_getinherited
+posix_trace_attr_getlogfullpolicy
+posix_trace_attr_getlogsize
+posix_trace_attr_getmaxdatasize
+posix_trace_attr_getmaxsystemeventsize
+posix_trace_attr_getmaxusereventsize
+posix_trace_attr_getname
+posix_trace_attr_getstreamfullpolicy
+posix_trace_attr_getstreamsize
+posix_trace_attr_init
+posix_trace_attr_setinherited
+posix_trace_attr_setlogfullpolicy
+posix_trace_attr_setlogsize
+posix_trace_attr_setmaxdatasize
+posix_trace_attr_setname
+posix_trace_attr_setstreamfullpolicy
+posix_trace_attr_setstreamsize
+posix_trace_clear
+posix_trace_close
+posix_trace_create
+posix_trace_create_withlog
+posix_trace_event
+posix_trace_eventid_equal
+posix_trace_eventid_get_name
+posix_trace_eventid_open
+posix_trace_eventset_add
+posix_trace_eventset_del
+posix_trace_eventset_empty
+posix_trace_eventset_fill
+posix_trace_eventset_ismember
+posix_trace_eventtypelist_getnext_id
+posix_trace_eventtypelist_rewind
+posix_trace_flush
+posix_trace_get_attr
+posix_trace_get_filter
+posix_trace_get_status
+posix_trace_getnext_event
+posix_trace_open
+posix_trace_rewind
+posix_trace_set_filter
+posix_trace_shutdown
+posix_trace_start
+posix_trace_stop
+posix_trace_timedgetnext_event
+posix_trace_trid_eventid_open
+posix_trace_trygetnext_event
+posix_typed_mem_get_info
+posix_typed_mem_open
+pow
+powf
+powl
+pread
+printf
+pselect
+psiginfo
+psignal
+pthread_atfork
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getinheritsched
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setinheritsched
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstacksize
+pthread_barrier_destroy
+pthread_barrier_init
+pthread_barrier_wait
+pthread_barrierattr_destroy
+pthread_barrierattr_getpshared
+pthread_barrierattr_init
+pthread_barrierattr_setpshared
+pthread_cancel
+pthread_cleanup_pop
+pthread_cleanup_push
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getclock
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setclock
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getconcurrency
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_consistent
+pthread_mutex_destroy
+pthread_mutex_getprioceiling
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_setprioceiling
+pthread_mutex_timedlock
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getprioceiling
+pthread_mutexattr_getprotocol
+pthread_mutexattr_getpshared
+pthread_mutexattr_getrobust
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setprioceiling
+pthread_mutexattr_setprotocol
+pthread_mutexattr_setpshared
+pthread_mutexattr_setrobust
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setcancelstate
+pthread_setcanceltype
+pthread_setconcurrency
+pthread_setschedparam
+pthread_setschedprio
+pthread_setspecific
+pthread_sigmask
+pthread_spin_destroy
+pthread_spin_init
+pthread_spin_lock
+pthread_spin_trylock
+pthread_spin_unlock
+pthread_testcancel
+ptsname
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+putmsg
+putpmsg
+puts
+pututxline
+putwc
+putwchar
+pwrite
+qsort
+raise
+rand
+rand_r
+random
+read
+readdir
+readdir_r
+readlink
+readlinkat
+readv
+realloc
+realpath
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remainder
+remainderf
+remainderl
+remove
+remque
+remquo
+remquof
+remquol
+rename
+renameat
+rewind
+rewinddir
+rint
+rintf
+rintl
+rmdir
+round
+roundf
+roundl
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+seekdir
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+semctl
+semget
+semop
+send
+sendmsg
+sendto
+setbuf
+setegid
+setenv
+seteuid
+setgid
+setgrent
+sethostent
+setitimer
+setjmp
+setkey
+setlocale
+setlogmask
+setnetent
+setpgid
+setpgrp
+setpriority
+setprotoent
+setpwent
+setregid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+setstate
+setuid
+setutxent
+setvbuf
+shm_open
+shm_unlink
+shmat
+shmctl
+shmdt
+shmget
+shutdown
+sigaction
+sigaddset
+sigaltstack
+sigdelset
+sigemptyset
+sigfillset
+sighold
+sigignore
+siginterrupt
+sigismember
+siglongjmp
+signal
+signbit
+signgam
+sigpause
+sigpending
+sigprocmask
+sigqueue
+sigrelse
+sigset
+sigsetjmp
+sigsuspend
+sigtimedwait
+sigwait
+sigwaitinfo
+sin
+sinf
+sinh
+sinhf
+sinhl
+sinl
+sleep
+snprintf
+sockatmark
+socket
+socketpair
+sprintf
+sqrt
+sqrtf
+sqrtl
+srand
+srand48
+srandom
+sscanf
+stat
+statvfs
+stderr
+stdin
+stdout
+stpcpy
+stpncpy
+strcasecmp
+strcasecmp_l
+strcat
+strchr
+strcmp
+strcoll
+strcoll_l
+strcpy
+strcspn
+strdup
+strerror
+strerror_l
+strerror_r
+strfmon
+strfmon_l
+strftime
+strftime_l
+strlen
+strncasecmp
+strncasecmp_l
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strpbrk
+strptime
+strrchr
+strsignal
+strspn
+strstr
+strtod
+strtof
+strtoimax
+strtok
+strtok_r
+strtol
+strtold
+strtoll
+strtoul
+strtoull
+strtoumax
+strxfrm
+strxfrm_l
+swab
+swprintf
+swscanf
+symlink
+symlinkat
+sync
+sysconf
+syslog
+system
+tan
+tanf
+tanh
+tanhf
+tanhl
+tanl
+tcdrain
+tcflow
+tcflush
+tcgetattr
+tcgetpgrp
+tcgetsid
+tcsendbreak
+tcsetattr
+tcsetpgrp
+tdelete
+telldir
+tempnam
+tfind
+tgamma
+tgammaf
+tgammal
+time
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+timezone
+tmpfile
+tmpnam
+toascii
+tolower
+tolower_l
+toupper
+toupper_l
+towctrans
+towctrans_l
+towlower
+towlower_l
+towupper
+towupper_l
+trunc
+truncate
+truncf
+truncl
+tsearch
+ttyname
+ttyname_r
+twalk
+tzname
+tzset
+ulimit
+umask
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+uselocale
+utime
+utimensat
+utimes
+va_arg
+va_copy
+va_end
+va_start
+vdprintf
+vfprintf
+vfscanf
+vfwprintf
+vfwscanf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vswscanf
+vwprintf
+vwscanf
+wait
+waitid
+waitpid
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscasecmp_l
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscoll_l
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslen
+wcsncasecmp
+wcsncasecmp_l
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcsnrtombs
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstof
+wcstoimax
+wcstok
+wcstol
+wcstold
+wcstoll
+wcstombs
+wcstoul
+wcstoull
+wcstoumax
+wcswidth
+wcsxfrm
+wcsxfrm_l
+wctob
+wctomb
+wctrans
+wctrans_l
+wctype
+wctype_l
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wordexp
+wordfree
+wprintf
+write
+writev
+wscanf
+y0
+y1
+yn
+' | sed -e "$sed_alt1" | tr -d "$trnl" | sed -e "$sed_alt2" -e "$sed_alt3"`
+posix2001_functions=`echo '
+bcmp
+bcopy
+bsd_signal
+bzero
+ecvt
+fcvt
+ftime
+gcvt
+getcontext
+gethostbyaddr
+gethostbyname
+getwd
+h_errno
+index
+makecontext
+mktemp
+pread
+pthread_attr_getstackaddr
+pthread_attr_setstackaddr
+rindex
+scalb
+setcontext
+swapcontext
+ualarm
+usleep
+vfork
+wcswcs
+' | sed -e "$sed_alt1" | tr -d "$trnl" | sed -e "$sed_alt2" -e "$sed_alt3"`
+
+indent=""
+seen_modules=
+seen_files=
+
+# func_exit STATUS
+# exit with status
+func_exit ()
+{
+ (exit $1); exit $1
+}
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/MDXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/MD$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ func_exit 1
+ }
+}
+
+# func_append var value
+# appends the given value to the shell variable var.
+if ( foo=bar; foo+=baz && test "$foo" = barbaz ) >/dev/null 2>&1; then
+ # Use bash's += operator. It reduces complexity of appending repeatedly to
+ # a single variable from O(n^2) to O(n).
+ func_append ()
+ {
+ eval "$1+=\"\$2\""
+ }
+else
+ func_append ()
+ {
+ eval "$1=\"\$$1\$2\""
+ }
+fi
+
+# func_echo line
+# outputs line with indentation.
+func_echo ()
+{
+ echo "${indent}$*"
+}
+
+# func_indent
+# increases the indentation.
+func_indent ()
+{
+ indent="$indent "
+}
+
+# func_unindent
+# decreases the indentation.
+func_unindent ()
+{
+ indent=`echo "$indent" | sed -e 's/ $//'`
+}
+
+# func_begin tag [attribute...]
+# opens a HTML tag.
+func_begin ()
+{
+ func_echo "<$*>"
+ func_indent
+}
+
+# func_end tag
+# closes a HTML tag.
+func_end ()
+{
+ func_unindent
+ func_echo "</$1>"
+}
+
+# func_wrap tag [attribute...]
+# encloses $element in a HTML tag, without line breaks.
+func_wrap ()
+{
+ element="<$*>${element}</$1>"
+}
+
+# func_section_wrap sectiontag
+# encloses $element in a HTML tag referring to the given tag.
+func_section_wrap ()
+{
+ if test -n "$in_toc"; then
+ func_wrap A "HREF=\"#$1\""
+ else
+ func_wrap A "NAME=\"$1\""
+ fi
+}
+
+# func_begin_table
+func_begin_table ()
+{
+ func_begin TABLE
+ if test -z "$in_toc"; then
+ func_begin TR
+ func_echo "<TH ALIGN=LEFT>modules/"
+ func_echo "<TH ALIGN=LEFT>lib/"
+ func_echo "<TH ALIGN=LEFT>lib/"
+ func_echo "<TH ALIGN=LEFT>m4/"
+ func_echo "<TH ALIGN=LEFT>&nbsp;"
+ func_end TR
+ func_begin TR
+ func_echo "<TH ALIGN=LEFT>Module"
+ func_echo "<TH ALIGN=LEFT>Header"
+ func_echo "<TH ALIGN=LEFT>Implementation"
+ func_echo "<TH ALIGN=LEFT>Autoconf macro"
+ func_echo "<TH ALIGN=LEFT>Depends on"
+ func_end TR
+ fi
+}
+
+# func_module module
+func_module ()
+{
+ sed_remove_trailing_empty_line='${
+/^$/d
+}'
+
+ if test -n "$in_toc"; then
+
+ func_begin TR "WIDTH=\"100%\""
+
+ element='<A HREF="#module='$1'">'$1'</A>'
+ func_echo "<TD ALIGN=LEFT VALIGN=TOP WIDTH=\"20%\">$element"
+
+ # Rendering the description:
+ # - Change the symbol() syntax as suitable for documentation, removing the
+ # parentheses (as per GNU standards, section "GNU Manuals").
+ # - Flag the remaining symbol() constructs as errors.
+ # - Change 'xxx' to <CODE>xxx</CODE>.
+ element=`gnulib-tool --extract-description $1 \
+ | sed -e "$sed_lt" -e "$sed_gt" -e "$sed_remove_trailing_empty_line" \
+ -e 's,^, ,' -e 's,$, ,' \
+ -e 's,\([^a-zA-Z_]\)'"${posix_functions}"'() \(function\|macro\),\1<A HREF="'"$POSIX2008_URL"'/functions/\2.html">\2</A> \3,g' \
+ -e 's,\([^a-zA-Z_]\)'"${posix_functions}"' \(function\|macro\),\1<A HREF="'"$POSIX2008_URL"'/functions/\2.html">\2</A> \3,g' \
+ -e 's,\([^a-zA-Z_]\)'"${posix_functions}"'(),\1<A HREF="'"$POSIX2008_URL"'/functions/\2.html">\2</A> <SPAN STYLE="color:#FF0000;">what?? If you mean a function\, please say so.</SPAN>,g' \
+ -e 's,\([^a-zA-Z_]\)'"${posix2001_functions}"'() \(function\|macro\),\1<A HREF="'"$POSIX2001_URL"'xsh/\2.html">\2</A> \3,g' \
+ -e 's,\([^a-zA-Z_]\)'"${posix2001_functions}"' \(function\|macro\),\1<A HREF="'"$POSIX2001_URL"'xsh/\2.html">\2</A> \3,g' \
+ -e 's,\([^a-zA-Z_]\)'"${posix2001_functions}"'(),\1<A HREF="'"$POSIX2001_URL"'xsh/\2.html">\2</A> <SPAN STYLE="color:#FF0000;">what?? If you mean a function\, please say so.</SPAN>,g' \
+ -e 's,\([^a-zA-Z_]\)\([a-zA-Z_][a-zA-Z0-9_]*\)() \(function\|macro\),\1\2 \3,g' \
+ -e 's,\([^a-zA-Z_]\)\([a-zA-Z_][a-zA-Z0-9_]*\)(),\1\2 <SPAN STYLE="color:#FF0000;">what?? If you mean a function\, please say so.</SPAN>,g' \
+ -e 's, '"'"'\([a-zA-Z0-9_ -]*\)'"'"'\([^a-zA-Z0-9_]\), <CODE>\1</CODE>\2,g' \
+ -e 's,^ ,,' -e 's, $,,'`
+ func_echo "<TD ALIGN=LEFT VALIGN=TOP WIDTH=\"80%\">$element"
+
+ func_end TR
+
+ else
+
+ func_begin TR
+
+ element='<A NAME="module='$1'"></A><A HREF="'$repo_url_prefix'modules/'$1$repo_url_suffix'">'$1'</A>'
+ func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
+
+ includes=`gnulib-tool --extract-include-directive $1`
+ files=`gnulib-tool --extract-filelist $1 \
+ | grep -v '^m4/gnulib-common\.m4$'`
+ element=`echo "$includes" \
+ | sed -e "$sed_lt" -e "$sed_gt" -e "$sed_remove_trailing_empty_line" \
+ -e 's,^#include "\(.*\)"$,#include "<A HREF="'$repo_url_prefix'lib/\1'$repo_url_suffix_repl'">\1</A>",' \
+ -e 's,^#include &lt;'"${posix_headers}"'\.h&gt;$,#include \&lt;<A HREF="'"$POSIX2008_URL"'/basedefs/\1.h.html">\1.h</A>\&gt;,' \
+ -e 's,<A HREF="'"$POSIX2008_URL"'/basedefs/\([a-zA-Z0-9_]*\)/\([a-zA-Z0-9_]*\)\.h\.html">,<A HREF="'"$POSIX2008_URL"'/basedefs/\1_\2.h.html">,' \
+ -e 's,^#include &lt;'"${posix2001_headers}"'\.h&gt;$,#include \&lt;<A HREF="'"$POSIX2001_URL"'xbd/\1.h.html">\1.h</A>\&gt;,' \
+ -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
+ test -n "$element" || element='---'
+ func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
+
+ sed_choose_unconditional_nonstandard_include='s,^#include "\(.*\)"$,\1,p'
+ includefile=`echo "$includes" \
+ | sed -n -e "$sed_choose_unconditional_nonstandard_include" \
+ | sed -e "$sed_escape_dot" | tr -d "$trnl"`
+ sed_choose_lib_files='s,^lib/\(.*\)$,\1,p'
+ element=`echo "$files" \
+ | sed -e '/^$/d' \
+ | sed -n -e "$sed_choose_lib_files" \
+ | sed -e '\|^'"${includefile}"'$|d' \
+ -e 's,^\(.*\)$,<A HREF="'$repo_url_prefix'lib/\1'$repo_url_suffix_repl'">\1</A>,' \
+ -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
+ test -n "$element" || element='---'
+ func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
+
+ sed_choose_m4_files='s,^m4/\(.*\)$,\1,p'
+ element=`(echo "$files" \
+ | sed -e "$sed_remove_trailing_empty_line" \
+ | sed -n -e "$sed_choose_m4_files" \
+ | sed -e '/^onceonly/d' \
+ -e 's,^\(.*\)$,<A HREF="'$repo_url_prefix'm4/\1'$repo_url_suffix_repl'">\1</A>,'; \
+ gnulib-tool --extract-autoconf-snippet $1 \
+ | sed -e "$sed_remove_trailing_empty_line") \
+ | sed -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
+ test -n "$element" || element='---'
+ func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
+
+ element=`gnulib-tool --extract-dependencies $1 \
+ | sed -e "$sed_remove_trailing_empty_line" \
+ -e 's/$/<BR>/' | tr -d "$trnl" | sed -e 's/<BR>$//'`
+ test -n "$element" || element='---'
+ func_echo "<TD ALIGN=LEFT VALIGN=TOP>$element"
+
+ func_end TR
+
+ func_append seen_modules " $1"
+ func_append seen_files " $files"
+ fi
+}
+
+# func_end_table
+func_end_table ()
+{
+ func_end TABLE
+}
+
+# func_all_modules
+func_all_modules ()
+{
+ element="Support for obsolete systems lacking ANSI C 89"
+ func_section_wrap ansic_sup_obsolete
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module stdlib
+ func_module exit
+ func_module strtol
+ func_module strtoul
+ func_module memcmp
+ func_module memcpy
+ func_module memmove
+ func_module memset
+ func_module strcspn
+ func_module strpbrk
+ func_end_table
+
+ func_echo 'These modules are not listed among dependencies below, for simplicity.'
+ func_echo 'If your package requires portability to old, obsolete systems, you need to list these modules explicitly among the modules to import through gnulib-tool.'
+
+ element="Support for systems lacking ANSI C 89"
+ func_section_wrap ansic_sup
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module atexit
+ func_module strtod
+ func_module strerror
+ func_module mktime
+ func_end_table
+
+ element="Enhancements for ANSI C 89 functions"
+ func_section_wrap ansic_enh
+ func_wrap H2
+ func_echo "$element"
+
+ element="Diagnostics <assert.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_enh_assert_diagnostics
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module assert
+ func_module verify
+ func_end_table
+
+ element="Mathematics <math.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_enh_math
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module fpieee
+ func_end_table
+
+ element="Input/output <stdio.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_enh_stdio
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module fflush
+ func_module fseterr
+ func_module tmpfile
+ func_end_table
+
+ element="Memory management functions <stdlib.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_enh_stdlib_memory
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module calloc
+ func_module eealloc
+ func_module free
+ func_module malloc
+ func_module realloc
+ func_module pagealign_alloc
+ func_end_table
+
+ element="Sorting functions <stdlib.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_enh_stdlib_sorting
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module mpsort
+ func_end_table
+
+ element="Date and time <time.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_enh_time_datetime
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module fprintftime
+ func_module strftime
+ func_end_table
+
+ element="Extra functions based on ANSI C 89"
+ func_section_wrap ansic_ext
+ func_wrap H2
+ func_echo "$element"
+
+ element="Memory management functions <stdlib.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_stdlib_memory
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module xsize
+ func_module xalloc
+ func_module xalloc-die
+ func_module alloca
+ func_module alloca-opt
+ func_module malloca
+ func_module xmalloca
+ func_module xmemdup0
+ func_module safe-alloc
+ func_end_table
+
+ element="Integer arithmetic functions <stdlib.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_stdlib_arith
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module count-one-bits
+ func_module gcd
+ func_module minmax
+ func_end_table
+
+ element="Environment variables <stdlib.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_stdlib_env
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module putenv
+ func_module setenv
+ func_module unsetenv
+ func_module xsetenv
+ func_end_table
+
+ element="Character handling <ctype.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_ctype
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module c-ctype
+ func_end_table
+
+ element="String handling <string.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_string
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module bcopy
+ func_module memchr
+ func_module memchr2
+ func_module memmem
+ func_module memmem-simple
+ func_module mempcpy
+ func_module memrchr
+ func_module rawmemchr
+ func_module stpcpy
+ func_module stpncpy
+ func_module c-strcase
+ func_module strcase
+ func_module c-strcaseeq
+ func_module c-strcasestr
+ func_module strcasestr
+ func_module strcasestr-simple
+ func_module strchrnul
+ func_module streq
+ func_module strnlen
+ func_module strnlen1
+ func_module strndup
+ func_module strsep
+ func_module strstr
+ func_module strstr-simple
+ func_module c-strstr
+ func_module trim
+ func_module fstrcmp
+ func_module xstrndup
+ func_end_table
+
+ element="Mathematics <math.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_math
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module printf-frexp
+ func_end_table
+
+ element="Numeric conversion functions <stdlib.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_stdlib_conv
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module c-strtod
+ func_module c-strtold
+ func_module xstrtod
+ func_module xstrtol
+ func_module xstrtoll
+ func_module xstrtold
+ func_end_table
+
+ element="Date and time <time.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_time_datetime
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module getdate
+ func_module timegm
+ func_module tzset
+ func_end_table
+
+ element="Input/Output <stdio.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_stdio
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module unlocked-io
+ func_module fwriteerror
+ func_module vasnprintf
+ func_module vasprintf
+ func_module xprintf
+ func_module xvasprintf
+ func_end_table
+
+ element="Signal handling <signal.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_signal
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module fatal-signal
+ func_module raise
+ func_module strsignal
+ func_end_table
+
+ element="Command-line arguments"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_argv
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module argmatch
+ func_module argv-iter
+ func_module version-etc
+ func_module version-etc-fsf
+ func_module long-options
+ func_end_table
+
+ element="Container data structures"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_container
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module list
+ func_module array-list
+ func_module carray-list
+ func_module linked-list
+ func_module avltree-list
+ func_module rbtree-list
+ func_module linkedhash-list
+ func_module avltreehash-list
+ func_module rbtreehash-list
+ func_module sublist
+ func_module oset
+ func_module array-oset
+ func_module avltree-oset
+ func_module rbtree-oset
+ func_end_table
+
+ element="Cryptographic computations (low-level)"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_crypto
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module crypto/arcfour
+ func_module crypto/arctwo
+ func_module crypto/des
+ func_module crypto/hmac-md5
+ func_module crypto/hmac-sha1
+ func_module crypto/md2
+ func_module crypto/md4
+ func_module crypto/md5
+ func_module crypto/rijndael
+ func_module crypto/sha1
+ func_module crypto/sha256
+ func_module crypto/sha512
+ func_end_table
+
+ element="Cryptographic computations (high-level)"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_crypto2
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module crypto/gc
+ func_module crypto/gc-arcfour
+ func_module crypto/gc-arctwo
+ func_module crypto/gc-camellia
+ func_module crypto/gc-des
+ func_module crypto/gc-hmac-md5
+ func_module crypto/gc-hmac-sha1
+ func_module crypto/gc-md2
+ func_module crypto/gc-md4
+ func_module crypto/gc-md5
+ func_module crypto/gc-pbkdf2-sha1
+ func_module crypto/gc-random
+ func_module crypto/gc-rijndael
+ func_module crypto/gc-sha1
+ func_end_table
+
+ element="Compiler warning management"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_misc
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module ignore-value
+ func_end_table
+
+ element="Misc"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap ansic_ext_misc
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module base64
+ func_module check-version
+ func_module crc
+ func_module diacrit
+ func_module diffseq
+ func_module getline
+ func_module getdelim
+ func_module getnline
+ func_module getndelim2
+ func_module linebuffer
+ func_module memxor
+ func_module obstack
+ func_module obstack-printf
+ func_module obstack-printf-posix
+ func_module hash-pjw
+ func_module hash
+ func_module readline
+ func_module readtokens
+ func_module readtokens0
+ func_module strverscmp
+ func_module filevercmp
+ func_end_table
+
+ element="Support for systems lacking ISO C 99"
+ func_section_wrap isoc_sup
+ func_wrap H2
+ func_echo "$element"
+
+ element="Core language properties"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_core_properties
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module flexmember
+ func_module fpucw
+ func_module func
+ func_module inline
+ func_module longlong
+ func_module va-args
+ func_module vararrays
+ func_end_table
+
+ element="Sizes of integer types <limits.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_limits
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module size_max
+ func_end_table
+
+ element="Variable arguments <stdarg.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_stdarg
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module stdarg
+ func_end_table
+
+ element="Boolean type and values <stdbool.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_stdbool
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module stdbool
+ func_end_table
+
+ element="Basic types <stddef.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_stddef
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module stddef
+ func_end_table
+
+ element="Integer types and values <stdint.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_stdint
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module stdint
+ func_end_table
+
+ element="Input/output <stdio.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_stdio
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module stdio
+ func_module snprintf
+ func_module vsnprintf
+ func_end_table
+
+ element="Numeric conversion functions <stdlib.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_stdlib_conv
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module strtoll
+ func_module strtoull
+ func_end_table
+
+ element="Functions for greatest-width integer types <inttypes.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_inttypes
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module imaxabs
+ func_module imaxdiv
+ func_module inttypes
+ func_module strtoimax
+ func_module strtoumax
+ func_end_table
+
+ element="Extended multibyte and wide character utilities <wchar.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_wchar
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module wchar
+ func_module btowc
+ func_module wctob
+ func_module mbsinit
+ func_module mbrlen
+ func_module mbrtowc
+ func_module mbsrtowcs
+ func_module wcrtomb
+ func_module wcsrtombs
+ func_end_table
+
+ element="Wide character classification and mapping utilities <wctype.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_wctype
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module wctype
+ func_end_table
+
+ element="Characteristics of floating types <float.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_float
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module float
+ func_end_table
+
+ element="Mathematics <math.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_sup_math
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module ceil
+ func_module ceilf
+ func_module ceill
+ func_module floor
+ func_module floorf
+ func_module floorl
+ func_module frexp
+ func_module frexp-nolibm
+ func_module frexpl
+ func_module frexpl-nolibm
+ func_module isfinite
+ func_module isinf
+ func_module isnan
+ func_module isnanf
+ func_module isnanf-nolibm
+ func_module isnand
+ func_module isnand-nolibm
+ func_module isnanl
+ func_module isnanl-nolibm
+ func_module ldexpl
+ func_module math
+ func_module mathl
+ func_module round
+ func_module roundf
+ func_module roundl
+ func_module signbit
+ func_module trunc
+ func_module truncf
+ func_module truncl
+ func_end_table
+
+ element="Enhancements for ISO C 99 functions"
+ func_section_wrap isoc_enh
+ func_wrap H2
+ func_echo "$element"
+
+ element="Input/output <stdio.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_enh_stdio
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module printf-safe
+ func_end_table
+
+ element="Extra functions based on ISO C 99"
+ func_section_wrap isoc_ext
+ func_wrap H2
+ func_echo "$element"
+
+ element="Mathematics <math.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_ext_math
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module printf-frexpl
+ func_end_table
+
+ element="Numeric conversion functions <stdlib.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_ext_stdlib_conv
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module intprops
+ func_module inttostr
+ func_module xstrtoimax
+ func_module xstrtoumax
+ func_end_table
+
+ element="Extended multibyte and wide character utilities <wchar.h>"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap isoc_ext_wchar_mb
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module mbchar
+ func_module mbiter
+ func_module mbuiter
+ func_module mbfile
+ func_end_table
+
+ element="Support for obsolete systems lacking POSIX:2008"
+ func_section_wrap posix_sup_obsolete
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module strdup
+ func_end_table
+
+ func_echo 'These modules are not listed among dependencies below, for simplicity.'
+ func_echo 'If your package requires portability to old, obsolete systems, you need to list these modules explicitly among the modules to import through gnulib-tool.'
+
+ element="Support for systems lacking POSIX:2008"
+ func_section_wrap posix_sup
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module accept
+ func_module arpa_inet
+ func_module bind
+ func_module calloc-posix
+ func_module chown
+ func_module close
+ func_module connect
+ func_module dup2
+ func_module environ
+ func_module errno
+ func_module fchdir
+ func_module fclose
+ func_module fcntl-h
+ func_module flock
+ func_module fopen
+ func_module fprintf-posix
+ func_module freopen
+ func_module fseek
+ func_module fseeko
+ func_module fsync
+ func_module ftell
+ func_module ftello
+ func_module ftruncate
+ func_module futimens
+ func_module getaddrinfo
+ func_module getcwd
+ func_module getgroups
+ func_module gethostname
+ func_module getlogin_r
+ func_module getpeername
+ func_module getsockname
+ func_module getsockopt
+ func_module getsubopt
+ func_module gettimeofday
+ func_module hostent
+ func_module iconv_open
+ func_module inet_ntop
+ func_module inet_pton
+ func_module link
+ func_module linkat
+ func_module listen
+ func_module locale
+ func_module lseek
+ func_module lstat
+ func_module malloc-posix
+ func_module mbsnrtowcs
+ func_module mkdir
+ func_module mkdtemp
+ func_module mkfifo
+ func_module mknod
+ func_module mkstemp
+ func_module netdb
+ func_module netinet_in
+ func_module open
+ func_module perror
+ func_module poll
+ func_module popen
+ func_module posix_spawn
+ func_module posix_spawnattr_destroy
+ func_module posix_spawnattr_getflags
+ func_module posix_spawnattr_getpgroup
+ func_module posix_spawnattr_getschedparam
+ func_module posix_spawnattr_getschedpolicy
+ func_module posix_spawnattr_getsigdefault
+ func_module posix_spawnattr_getsigmask
+ func_module posix_spawnattr_init
+ func_module posix_spawnattr_setflags
+ func_module posix_spawnattr_setpgroup
+ func_module posix_spawnattr_setschedparam
+ func_module posix_spawnattr_setschedpolicy
+ func_module posix_spawnattr_setsigdefault
+ func_module posix_spawnattr_setsigmask
+ func_module posix_spawn_file_actions_addclose
+ func_module posix_spawn_file_actions_adddup2
+ func_module posix_spawn_file_actions_addopen
+ func_module posix_spawn_file_actions_destroy
+ func_module posix_spawn_file_actions_init
+ func_module posix_spawn-internal
+ func_module posix_spawnp
+ func_module printf-posix
+ func_module pthread
+ func_module readlink
+ func_module realloc-posix
+ func_module recv
+ func_module recvfrom
+ func_module remove
+ func_module sched
+ func_module select
+ func_module send
+ func_module sendto
+ func_module setsockopt
+ func_module shutdown
+ func_module signal
+ func_module sleep
+ func_module snprintf-posix
+ func_module socket
+ func_module spawn
+ func_module sprintf-posix
+ func_module stat
+ func_module strdup-posix
+ func_module string
+ func_module strings
+ func_module tempname
+ func_module time
+ func_module time_r
+ func_module times
+ func_module timespec
+ func_module nanosleep
+ func_module regex
+ func_module rename
+ func_module renameat
+ func_module rmdir
+ func_module search
+ func_module sigaction
+ func_module sigprocmask
+ func_module socklen
+ func_module ssize_t
+ func_module strptime
+ func_module strtok_r
+ func_module sys_select
+ func_module sys_socket
+ func_module sys_stat
+ func_module sys_time
+ func_module sys_times
+ func_module sys_wait
+ func_module tsearch
+ func_module unistd
+ func_module unlink
+ func_module utime
+ func_module utimensat
+ func_module vasnprintf-posix
+ func_module vasprintf-posix
+ func_module vfprintf-posix
+ func_module vprintf-posix
+ func_module vsnprintf-posix
+ func_module vsprintf-posix
+ func_module wcsnrtombs
+ func_module wcwidth
+ func_module write
+ func_end_table
+
+ element="Compatibility checks for POSIX:2008 functions"
+ func_section_wrap posix_compat
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module clock-time
+ func_module d-ino
+ func_module d-type
+ func_module link-follow
+ func_module rename-dest-slash
+ func_module rmdir-errno
+ func_module unlink-busy
+ func_module winsz-ioctl
+ func_module winsz-termios
+ func_end_table
+
+ element="Enhancements for POSIX:2008 functions"
+ func_section_wrap posix_enh
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module chdir-long
+ func_module dirent-safer
+ func_module dirname
+ func_module dirname-lgpl
+ func_module getopt
+ func_module iconv_open-utf
+ func_module unistd-safer
+ func_module fnmatch
+ func_module fnmatch-posix
+ func_module fnmatch-gnu
+ func_module glob
+ func_module exclude
+ func_end_table
+
+ element="Extra functions based on POSIX:2008"
+ func_section_wrap posix_ext
+ func_wrap H2
+ func_echo "$element"
+
+ element="Input/output"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_stdio
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module xprintf-posix
+ func_module xvasprintf-posix
+ func_end_table
+
+ element="Numeric conversion functions"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_conv
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module human
+ func_end_table
+
+ element="File system functions"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_filesys
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module acl
+ func_module areadlink
+ func_module areadlink-with-size
+ func_module areadlinkat
+ func_module areadlinkat-with-size
+ func_module backupfile
+ func_module canonicalize
+ func_module canonicalize-lgpl
+ func_module chdir-safer
+ func_module clean-temp
+ func_module copy-file
+ func_module fsusage
+ func_module dirfd
+ func_module double-slash-root
+ func_module euidaccess
+ func_module faccessat
+ func_module fdopendir
+ func_module fdutimensat
+ func_module file-type
+ func_module fileblocks
+ func_module filemode
+ func_module filename
+ func_module filenamecat
+ func_module filenamecat-lgpl
+ func_module fts
+ func_module fts-lgpl
+ func_module isdir
+ func_module lchmod
+ func_module lchown
+ func_module mkancesdirs
+ func_module mkfifoat
+ func_module mkdir-p
+ func_module mkostemp
+ func_module mkostemps
+ func_module mkstemps
+ func_module modechange
+ func_module mountlist
+ func_module openat
+ func_module openat-die
+ func_module pathmax
+ func_module read-file
+ func_module same
+ func_module save-cwd
+ func_module savedir
+ func_module savewd
+ func_module stat-macros
+ func_module stat-time
+ func_module symlink
+ func_module symlinkat
+ func_module tmpdir
+ func_module unlinkdir
+ func_module utimecmp
+ func_module utimens
+ func_module write-any-file
+ func_module xgetcwd
+ func_module xreadlink
+ func_module xreadlinkat
+ func_end_table
+
+ element="File system as inode set"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_inodeset
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module cycle-check
+ func_module dev-ino
+ func_module file-set
+ func_module hash-triple
+ func_module i-ring
+ func_module same-inode
+ func_end_table
+
+ element="File descriptor based Input/Output"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_filedesc
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module fcntl-safer
+ func_module openat-safer
+ func_module safe-read
+ func_module safe-write
+ func_module full-read
+ func_module full-write
+ func_module binary-io
+ func_module isapipe
+ func_end_table
+
+ element="File stream based Input/Output"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_filestream
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module close-stream
+ func_module closein
+ func_module closeout
+ func_module fbufmode
+ func_module fopen-safer
+ func_module fpending
+ func_module fpurge
+ func_module freadable
+ func_module freadahead
+ func_module freading
+ func_module freadptr
+ func_module freadseek
+ func_module freopen-safer
+ func_module fwritable
+ func_module fwriting
+ func_module getpass
+ func_module getpass-gnu
+ func_module popen-safer
+ func_module stdlib-safer
+ func_module tmpfile-safer
+ func_module xfreopen
+ func_end_table
+
+ element="Users and groups"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_uidgid
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module getugroups
+ func_module group-member
+ func_module idcache
+ func_module mgetgroups
+ func_module userspec
+ func_end_table
+
+ element="Date and time"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_datetime
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module gethrxtime
+ func_module gettime
+ func_module posixtm
+ func_module settime
+ func_module usleep
+ func_module xnanosleep
+ func_end_table
+
+ element="Networking functions"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_net
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module xgethostname
+ func_module canon-host
+ func_module sockets
+ func_end_table
+
+ element="Multithreading"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_thread
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module threadlib
+ func_module lock
+ func_module tls
+ func_module thread
+ func_module yield
+ func_module cond
+ func_module openmp
+ func_end_table
+
+ element="Signal handling"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_signal
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module c-stack
+ func_module libsigsegv
+ func_module sig2str
+ func_module sigpipe-die
+ func_end_table
+
+ element="Internationalization functions"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_i18n
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module gettext
+ func_module gettext-h
+ func_module propername
+ func_module iconv
+ func_module striconv
+ func_module xstriconv
+ func_module striconveh
+ func_module striconveha
+ func_module localcharset
+ func_module hard-locale
+ func_module localename
+ func_module mbslen
+ func_module mbsnlen
+ func_module mbschr
+ func_module mbsrchr
+ func_module mbsstr
+ func_module mbscasecmp
+ func_module mbsncasecmp
+ func_module mbspcasecmp
+ func_module mbscasestr
+ func_module mbscspn
+ func_module mbspbrk
+ func_module mbsspn
+ func_module mbssep
+ func_module mbstok_r
+ func_module mbswidth
+ func_module memcasecmp
+ func_module memcoll
+ func_module xmemcoll
+ func_module unicodeio
+ func_module rpmatch
+ func_module yesno
+ func_module bison-i18n
+ func_end_table
+
+ element="Unicode string functions"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_unicode
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module libunistring
+ func_module unitypes
+ func_module ucs4-utf8
+ func_module ucs4-utf16
+ func_module utf8-ucs4-unsafe
+ func_module utf16-ucs4-unsafe
+ func_module utf8-ucs4
+ func_module utf16-ucs4
+ func_module unistr/base
+ func_module unistr/u8-to-u16
+ func_module unistr/u8-to-u32
+ func_module unistr/u16-to-u8
+ func_module unistr/u16-to-u32
+ func_module unistr/u32-to-u8
+ func_module unistr/u32-to-u16
+ func_module unistr/u8-check
+ func_module unistr/u16-check
+ func_module unistr/u32-check
+ func_module unistr/u8-chr
+ func_module unistr/u16-chr
+ func_module unistr/u32-chr
+ func_module unistr/u8-cmp
+ func_module unistr/u16-cmp
+ func_module unistr/u32-cmp
+ func_module unistr/u8-cpy
+ func_module unistr/u16-cpy
+ func_module unistr/u32-cpy
+ func_module unistr/u8-cpy-alloc
+ func_module unistr/u16-cpy-alloc
+ func_module unistr/u32-cpy-alloc
+ func_module unistr/u8-endswith
+ func_module unistr/u16-endswith
+ func_module unistr/u32-endswith
+ func_module unistr/u8-mblen
+ func_module unistr/u16-mblen
+ func_module unistr/u32-mblen
+ func_module unistr/u8-mbsnlen
+ func_module unistr/u16-mbsnlen
+ func_module unistr/u32-mbsnlen
+ func_module unistr/u8-mbtouc-unsafe
+ func_module unistr/u16-mbtouc-unsafe
+ func_module unistr/u32-mbtouc-unsafe
+ func_module unistr/u8-mbtouc
+ func_module unistr/u16-mbtouc
+ func_module unistr/u32-mbtouc
+ func_module unistr/u8-mbtoucr
+ func_module unistr/u16-mbtoucr
+ func_module unistr/u32-mbtoucr
+ func_module unistr/u8-move
+ func_module unistr/u16-move
+ func_module unistr/u32-move
+ func_module unistr/u8-next
+ func_module unistr/u16-next
+ func_module unistr/u32-next
+ func_module unistr/u8-prev
+ func_module unistr/u16-prev
+ func_module unistr/u32-prev
+ func_module unistr/u8-set
+ func_module unistr/u16-set
+ func_module unistr/u32-set
+ func_module unistr/u8-startswith
+ func_module unistr/u16-startswith
+ func_module unistr/u32-startswith
+ func_module unistr/u8-stpcpy
+ func_module unistr/u16-stpcpy
+ func_module unistr/u32-stpcpy
+ func_module unistr/u8-stpncpy
+ func_module unistr/u16-stpncpy
+ func_module unistr/u32-stpncpy
+ func_module unistr/u8-strcat
+ func_module unistr/u16-strcat
+ func_module unistr/u32-strcat
+ func_module unistr/u8-strchr
+ func_module unistr/u16-strchr
+ func_module unistr/u32-strchr
+ func_module unistr/u8-strcmp
+ func_module unistr/u16-strcmp
+ func_module unistr/u32-strcmp
+ func_module unistr/u8-strcpy
+ func_module unistr/u16-strcpy
+ func_module unistr/u32-strcpy
+ func_module unistr/u8-strcspn
+ func_module unistr/u16-strcspn
+ func_module unistr/u32-strcspn
+ func_module unistr/u8-strdup
+ func_module unistr/u16-strdup
+ func_module unistr/u32-strdup
+ func_module unistr/u8-strlen
+ func_module unistr/u16-strlen
+ func_module unistr/u32-strlen
+ func_module unistr/u8-strmblen
+ func_module unistr/u16-strmblen
+ func_module unistr/u32-strmblen
+ func_module unistr/u8-strmbtouc
+ func_module unistr/u16-strmbtouc
+ func_module unistr/u32-strmbtouc
+ func_module unistr/u8-strncat
+ func_module unistr/u16-strncat
+ func_module unistr/u32-strncat
+ func_module unistr/u8-strncmp
+ func_module unistr/u16-strncmp
+ func_module unistr/u32-strncmp
+ func_module unistr/u8-strncpy
+ func_module unistr/u16-strncpy
+ func_module unistr/u32-strncpy
+ func_module unistr/u8-strnlen
+ func_module unistr/u16-strnlen
+ func_module unistr/u32-strnlen
+ func_module unistr/u8-strpbrk
+ func_module unistr/u16-strpbrk
+ func_module unistr/u32-strpbrk
+ func_module unistr/u8-strrchr
+ func_module unistr/u16-strrchr
+ func_module unistr/u32-strrchr
+ func_module unistr/u8-strspn
+ func_module unistr/u16-strspn
+ func_module unistr/u32-strspn
+ func_module unistr/u8-strstr
+ func_module unistr/u16-strstr
+ func_module unistr/u32-strstr
+ func_module unistr/u8-strtok
+ func_module unistr/u16-strtok
+ func_module unistr/u32-strtok
+ func_module unistr/u8-uctomb
+ func_module unistr/u16-uctomb
+ func_module unistr/u32-uctomb
+ func_module uniconv/base
+ func_module uniconv/u8-conv-from-enc
+ func_module uniconv/u16-conv-from-enc
+ func_module uniconv/u32-conv-from-enc
+ func_module uniconv/u8-conv-to-enc
+ func_module uniconv/u16-conv-to-enc
+ func_module uniconv/u32-conv-to-enc
+ func_module uniconv/u8-strconv-from-enc
+ func_module uniconv/u16-strconv-from-enc
+ func_module uniconv/u32-strconv-from-enc
+ func_module uniconv/u8-strconv-to-enc
+ func_module uniconv/u16-strconv-to-enc
+ func_module uniconv/u32-strconv-to-enc
+ func_module uniconv/u8-strconv-from-locale
+ func_module uniconv/u16-strconv-from-locale
+ func_module uniconv/u32-strconv-from-locale
+ func_module uniconv/u8-strconv-to-locale
+ func_module uniconv/u16-strconv-to-locale
+ func_module uniconv/u32-strconv-to-locale
+ func_module unistdio/base
+ func_module unistdio/u-printf-args
+ func_module unistdio/ulc-asnprintf
+ func_module unistdio/ulc-asprintf
+ func_module unistdio/ulc-fprintf
+ func_module unistdio/ulc-printf-parse
+ func_module unistdio/ulc-snprintf
+ func_module unistdio/ulc-sprintf
+ func_module unistdio/ulc-vasnprintf
+ func_module unistdio/ulc-vasprintf
+ func_module unistdio/ulc-vfprintf
+ func_module unistdio/ulc-vsnprintf
+ func_module unistdio/ulc-vsprintf
+ func_module unistdio/u8-asnprintf
+ func_module unistdio/u8-asprintf
+ func_module unistdio/u8-printf-parse
+ func_module unistdio/u8-snprintf
+ func_module unistdio/u8-sprintf
+ func_module unistdio/u8-vasnprintf
+ func_module unistdio/u8-vasprintf
+ func_module unistdio/u8-vsnprintf
+ func_module unistdio/u8-vsprintf
+ func_module unistdio/u8-u8-asnprintf
+ func_module unistdio/u8-u8-asprintf
+ func_module unistdio/u8-u8-snprintf
+ func_module unistdio/u8-u8-sprintf
+ func_module unistdio/u8-u8-vasnprintf
+ func_module unistdio/u8-u8-vasprintf
+ func_module unistdio/u8-u8-vsnprintf
+ func_module unistdio/u8-u8-vsprintf
+ func_module unistdio/u16-asnprintf
+ func_module unistdio/u16-asprintf
+ func_module unistdio/u16-printf-parse
+ func_module unistdio/u16-snprintf
+ func_module unistdio/u16-sprintf
+ func_module unistdio/u16-vasnprintf
+ func_module unistdio/u16-vasprintf
+ func_module unistdio/u16-vsnprintf
+ func_module unistdio/u16-vsprintf
+ func_module unistdio/u16-u16-asnprintf
+ func_module unistdio/u16-u16-asprintf
+ func_module unistdio/u16-u16-snprintf
+ func_module unistdio/u16-u16-sprintf
+ func_module unistdio/u16-u16-vasnprintf
+ func_module unistdio/u16-u16-vasprintf
+ func_module unistdio/u16-u16-vsnprintf
+ func_module unistdio/u16-u16-vsprintf
+ func_module unistdio/u32-asnprintf
+ func_module unistdio/u32-asprintf
+ func_module unistdio/u32-printf-parse
+ func_module unistdio/u32-snprintf
+ func_module unistdio/u32-sprintf
+ func_module unistdio/u32-vasnprintf
+ func_module unistdio/u32-vasprintf
+ func_module unistdio/u32-vsnprintf
+ func_module unistdio/u32-vsprintf
+ func_module unistdio/u32-u32-asnprintf
+ func_module unistdio/u32-u32-asprintf
+ func_module unistdio/u32-u32-snprintf
+ func_module unistdio/u32-u32-sprintf
+ func_module unistdio/u32-u32-vasnprintf
+ func_module unistdio/u32-u32-vasprintf
+ func_module unistdio/u32-u32-vsnprintf
+ func_module unistdio/u32-u32-vsprintf
+ func_module uniname/base
+ func_module uniname/uniname
+ func_module unictype/base
+ func_module unictype/bidicategory-byname
+ func_module unictype/bidicategory-name
+ func_module unictype/bidicategory-of
+ func_module unictype/bidicategory-test
+ func_module unictype/bidicategory-all
+ func_module unictype/block-list
+ func_module unictype/block-of
+ func_module unictype/block-test
+ func_module unictype/block-all
+ func_module unictype/category-C
+ func_module unictype/category-Cc
+ func_module unictype/category-Cf
+ func_module unictype/category-Cn
+ func_module unictype/category-Co
+ func_module unictype/category-Cs
+ func_module unictype/category-L
+ func_module unictype/category-Ll
+ func_module unictype/category-Lm
+ func_module unictype/category-Lo
+ func_module unictype/category-Lt
+ func_module unictype/category-Lu
+ func_module unictype/category-M
+ func_module unictype/category-Mc
+ func_module unictype/category-Me
+ func_module unictype/category-Mn
+ func_module unictype/category-N
+ func_module unictype/category-Nd
+ func_module unictype/category-Nl
+ func_module unictype/category-No
+ func_module unictype/category-P
+ func_module unictype/category-Pc
+ func_module unictype/category-Pd
+ func_module unictype/category-Pe
+ func_module unictype/category-Pf
+ func_module unictype/category-Pi
+ func_module unictype/category-Po
+ func_module unictype/category-Ps
+ func_module unictype/category-S
+ func_module unictype/category-Sc
+ func_module unictype/category-Sk
+ func_module unictype/category-Sm
+ func_module unictype/category-So
+ func_module unictype/category-Z
+ func_module unictype/category-Zl
+ func_module unictype/category-Zp
+ func_module unictype/category-Zs
+ func_module unictype/category-and
+ func_module unictype/category-and-not
+ func_module unictype/category-byname
+ func_module unictype/category-name
+ func_module unictype/category-none
+ func_module unictype/category-of
+ func_module unictype/category-or
+ func_module unictype/category-test
+ func_module unictype/category-test-withtable
+ func_module unictype/category-all
+ func_module unictype/combining-class
+ func_module unictype/ctype-alnum
+ func_module unictype/ctype-alpha
+ func_module unictype/ctype-blank
+ func_module unictype/ctype-cntrl
+ func_module unictype/ctype-digit
+ func_module unictype/ctype-graph
+ func_module unictype/ctype-lower
+ func_module unictype/ctype-print
+ func_module unictype/ctype-punct
+ func_module unictype/ctype-space
+ func_module unictype/ctype-upper
+ func_module unictype/ctype-xdigit
+ func_module unictype/decimal-digit
+ func_module unictype/digit
+ func_module unictype/mirror
+ func_module unictype/numeric
+ func_module unictype/property-alphabetic
+ func_module unictype/property-ascii-hex-digit
+ func_module unictype/property-bidi-arabic-digit
+ func_module unictype/property-bidi-arabic-right-to-left
+ func_module unictype/property-bidi-block-separator
+ func_module unictype/property-bidi-boundary-neutral
+ func_module unictype/property-bidi-common-separator
+ func_module unictype/property-bidi-control
+ func_module unictype/property-bidi-embedding-or-override
+ func_module unictype/property-bidi-eur-num-separator
+ func_module unictype/property-bidi-eur-num-terminator
+ func_module unictype/property-bidi-european-digit
+ func_module unictype/property-bidi-hebrew-right-to-left
+ func_module unictype/property-bidi-left-to-right
+ func_module unictype/property-bidi-non-spacing-mark
+ func_module unictype/property-bidi-other-neutral
+ func_module unictype/property-bidi-pdf
+ func_module unictype/property-bidi-segment-separator
+ func_module unictype/property-bidi-whitespace
+ func_module unictype/property-byname
+ func_module unictype/property-combining
+ func_module unictype/property-composite
+ func_module unictype/property-currency-symbol
+ func_module unictype/property-dash
+ func_module unictype/property-decimal-digit
+ func_module unictype/property-default-ignorable-code-point
+ func_module unictype/property-deprecated
+ func_module unictype/property-diacritic
+ func_module unictype/property-extender
+ func_module unictype/property-format-control
+ func_module unictype/property-grapheme-base
+ func_module unictype/property-grapheme-extend
+ func_module unictype/property-grapheme-link
+ func_module unictype/property-hex-digit
+ func_module unictype/property-hyphen
+ func_module unictype/property-id-continue
+ func_module unictype/property-id-start
+ func_module unictype/property-ideographic
+ func_module unictype/property-ids-binary-operator
+ func_module unictype/property-ids-trinary-operator
+ func_module unictype/property-ignorable-control
+ func_module unictype/property-iso-control
+ func_module unictype/property-join-control
+ func_module unictype/property-left-of-pair
+ func_module unictype/property-line-separator
+ func_module unictype/property-logical-order-exception
+ func_module unictype/property-lowercase
+ func_module unictype/property-math
+ func_module unictype/property-non-break
+ func_module unictype/property-not-a-character
+ func_module unictype/property-numeric
+ func_module unictype/property-other-alphabetic
+ func_module unictype/property-other-default-ignorable-code-point
+ func_module unictype/property-other-grapheme-extend
+ func_module unictype/property-other-id-continue
+ func_module unictype/property-other-id-start
+ func_module unictype/property-other-lowercase
+ func_module unictype/property-other-math
+ func_module unictype/property-other-uppercase
+ func_module unictype/property-paired-punctuation
+ func_module unictype/property-paragraph-separator
+ func_module unictype/property-pattern-syntax
+ func_module unictype/property-pattern-white-space
+ func_module unictype/property-private-use
+ func_module unictype/property-punctuation
+ func_module unictype/property-quotation-mark
+ func_module unictype/property-radical
+ func_module unictype/property-sentence-terminal
+ func_module unictype/property-soft-dotted
+ func_module unictype/property-space
+ func_module unictype/property-terminal-punctuation
+ func_module unictype/property-test
+ func_module unictype/property-titlecase
+ func_module unictype/property-unassigned-code-value
+ func_module unictype/property-unified-ideograph
+ func_module unictype/property-uppercase
+ func_module unictype/property-variation-selector
+ func_module unictype/property-white-space
+ func_module unictype/property-xid-continue
+ func_module unictype/property-xid-start
+ func_module unictype/property-zero-width
+ func_module unictype/property-all
+ func_module unictype/scripts
+ func_module unictype/scripts-all
+ func_module unictype/syntax-c-ident
+ func_module unictype/syntax-c-whitespace
+ func_module unictype/syntax-java-ident
+ func_module unictype/syntax-java-whitespace
+ func_module uniwidth/base
+ func_module uniwidth/u8-strwidth
+ func_module uniwidth/u8-width
+ func_module uniwidth/u16-strwidth
+ func_module uniwidth/u16-width
+ func_module uniwidth/u32-strwidth
+ func_module uniwidth/u32-width
+ func_module uniwidth/width
+ func_module unilbrk/base
+ func_module unilbrk/tables
+ func_module unilbrk/ulc-common
+ func_module unilbrk/u8-possible-linebreaks
+ func_module unilbrk/u16-possible-linebreaks
+ func_module unilbrk/u32-possible-linebreaks
+ func_module unilbrk/ulc-possible-linebreaks
+ func_module unilbrk/u8-width-linebreaks
+ func_module unilbrk/u16-width-linebreaks
+ func_module unilbrk/u32-width-linebreaks
+ func_module unilbrk/ulc-width-linebreaks
+ func_end_table
+
+ element="Executing programs"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_exec
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module cloexec
+ func_module findprog
+ func_module wait-process
+ func_module execute
+ func_module pipe
+ func_module sh-quote
+ func_end_table
+
+ element="Java"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_java
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module classpath
+ func_module javacomp-script
+ func_module javacomp
+ func_module javaexec-script
+ func_module javaexec
+ func_module javaversion
+ #func_module gcj
+ func_end_table
+
+ element="C#"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_csharp
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module csharpcomp-script
+ func_module csharpcomp
+ func_module csharpexec-script
+ func_module csharpexec
+ func_end_table
+
+ element="Misc"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_section_wrap posix_ext_misc
+ func_wrap H3
+ func_echo "$element"
+
+ func_begin_table
+ func_module argp
+ func_module argz
+ func_module bitrotate
+ func_module byteswap
+ func_module exitfail
+ func_module error
+ func_module extensions
+ func_module getdomainname
+ func_module xgetdomainname
+ func_module getloadavg
+ func_module getpagesize
+ func_module getusershell
+ func_module lib-symbol-visibility
+ func_module nproc
+ func_module physmem
+ func_module posixver
+ func_module progname
+ func_module quotearg
+ func_module quote
+ func_module readutmp
+ func_module random_r
+ func_module selinux-h
+ func_module selinux-at
+ func_module sysexits
+ func_module u64
+ func_module verror
+ func_end_table
+
+ element="Support for building libraries and executables"
+ func_section_wrap build_lib
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module absolute-header
+ func_module arg-nonnull
+ func_module config-h
+ func_module configmake
+ func_module dummy
+ func_module elisp-comp
+ func_module gperf
+ func_module havelib
+ func_module include_next
+ func_module ldd
+ func_module lib-ignore
+ func_module lib-msvc-compat
+ func_module lib-symbol-versions
+ func_module link-warning
+ func_module manywarnings
+ func_module no-c++
+ func_module relocatable-lib
+ func_module relocatable-lib-lgpl
+ func_module relocatable-prog
+ func_module relocatable-prog-wrapper
+ func_module relocatable-script
+ func_module warn-on-use
+ func_module warnings
+ func_end_table
+
+ element="Support for building documentation"
+ func_section_wrap build_doc
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module agpl-3.0
+ func_module fdl
+ func_module fdl-1.3
+ func_module gendocs
+ func_module gpl-2.0
+ func_module gpl-3.0
+ func_module lgpl-2.1
+ func_module pmccabe2html
+ func_module regexprops-generic
+ func_end_table
+
+ element="Support for maintaining and releasing projects"
+ func_section_wrap maintain
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module announce-gen
+ func_module autobuild
+ func_module do-release-commit-and-tag
+ func_module git-version-gen
+ func_module gitlog-to-changelog
+ func_module gnu-web-doc-update
+ func_module gnumakefile
+ func_module gnupload
+ func_module maintainer-makefile
+ func_module mktempd
+ func_module update-copyright
+ func_module useless-if-before-free
+ func_module vc-list-files
+ func_end_table
+
+ element="Misc"
+ func_section_wrap misc
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ func_module gnu-make
+ func_module host-os
+ func_module nocrash
+ func_module perl
+ func_module posix-shell
+ func_module uptime
+ func_end_table
+}
+
+
+func_tmpdir
+trap 'exit_status=$?
+ if test "$signal" != 0; then
+ echo "caught signal $signal" >&2
+ fi
+ rm -rf "$tmp"
+ exit $exit_status' 0
+for signal in 1 2 3 13 15; do
+ trap '{ signal='$signal'; func_exit 1; }' $signal
+done
+signal=0
+
+echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">'
+func_begin HTML
+
+func_begin HEAD
+
+element="Gnulib Module List"
+func_wrap TITLE
+func_echo "$element"
+
+modules=`gnulib-tool --list`
+modules=`for m in $modules; do printf "%s, " $m; done | sed -e 's/, $//'`
+func_echo '<META NAME="keywords" CONTENT="'"${modules}"'">'
+
+func_end HEAD
+
+func_begin BODY
+
+element="Gnulib Module List"
+func_wrap H1
+func_echo "$element"
+
+func_echo 'This is a list of the modules which make up gnulib, with dependencies.'
+
+in_toc=yes
+func_all_modules
+
+in_toc=
+func_all_modules
+
+
+gnulib-tool --list > "$tmp/all-modules"
+missed_modules=`for module in $seen_modules; do echo $module; done \
+ | LC_ALL=C sort -u \
+ | LC_ALL=C join -v 2 - "$tmp/all-modules"`
+
+if test -n "$missed_modules"; then
+
+ element="Unclassified modules - please update MODULES.html.sh"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_wrap H2
+ func_echo "$element"
+
+ func_begin_table
+ for module in $missed_modules; do
+ func_module $module
+ done
+ func_end_table
+
+fi
+
+{ find lib -type f -print; find m4 -type f -print; } | LC_ALL=C sort | sed -e '/\/\./d' -e /CVS/d -e /README/d -e /ChangeLog/d -e /Makefile/d -e /TODO/d -e '/tags$/d' -e '/TAGS$/d' -e '/~$/d' > "$tmp/all-files"
+missed_files=`for file in $seen_files; do echo $file; done \
+ | LC_ALL=C sort -u \
+ | LC_ALL=C join -v 2 - "$tmp/all-files"`
+
+if test -n "$missed_files"; then
+
+ element="Lone files - please create new modules containing them"
+ element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+ func_wrap H2
+ func_echo "$element"
+
+ func_echo '<PRE>'
+ echo "$missed_files" | sed -e 's,^\(.*\)$,<A HREF="'$repo_url_prefix'\1'$repo_url_suffix_repl'">\1</A>,'
+ echo '</PRE>'
+
+fi
+
+element="Future developments"
+element=`printf "%s" "$element" | sed -e "$sed_lt" -e "$sed_gt"`
+func_wrap H2
+func_echo "$element"
+
+func_echo 'Ideally a module could consist of:'
+func_begin UL
+func_echo '<LI>A header file: lib/<VAR>module</VAR>.h'
+func_echo '<LI>One or more implementation files: lib/<VAR>module</VAR>.c et al.'
+func_echo '<LI>One or more autoconf macro files: m4/<VAR>module</VAR>.m4 et al.'
+func_echo '<LI>A configure.ac fragment, Makefile.am fragment, dependency list: modules/<VAR>module</VAR>'
+func_echo '<LI>A testsuite: source files in tests/ and metainformation (a configure.ac fragment, Makefile.am fragment, dependency list) in modules/<VAR>module</VAR>-tests'
+func_echo '<LI>Some documentation'
+func_echo '<LI>A POT file and some PO files'
+func_end UL
+
+func_echo '<HR>'
+func_echo 'Generated from <CODE>MODULES.html.sh</CODE> on '`LC_ALL=C date +"%e %B %Y"`.
+
+func_end BODY
+
+func_end HTML
+
+rm -rf "$tmp"
+# Undo the effect of the previous 'trap' command.
+trap '' 0
+trap 'func_exit $?' 1 2 3 13 15
+
+exit 0
+
+# Local Variables:
+# indent-tabs-mode: nil
+# whitespace-check-buffer-indent: nil
+# End:
diff --git a/gnulib/NEWS b/gnulib/NEWS
new file mode 100644
index 00000000..72b2b58e
--- /dev/null
+++ b/gnulib/NEWS
@@ -0,0 +1,452 @@
+Important notes
+---------------
+
+User visible incompatible changes
+---------------------------------
+
+Date Modules Changes
+
+2009-12-13 sublist The module does not define functions any more that
+ call xalloc_die() in out-of-memory situations. Use
+ module 'xsublist' and include file "gl_xsublist.h"
+ instead.
+
+2009-12-13 list The module does not define functions any more that
+ call xalloc_die() in out-of-memory situations.
+ Use module 'xlist' and include file "gl_xlist.h"
+ instead.
+
+2009-12-13 oset The module does not define functions any more that
+ call xalloc_die() in out-of-memory situations.
+ Use module 'xoset' and include file "gl_xoset.h"
+ instead.
+
+2009-12-10 * Most source code files have been converted to
+ indentation by spaces (rather than tabs). Patches
+ of gnulib source code needs to be updated.
+
+2009-12-09 link-warning The Makefile rules that use $(LINK_WARNING_H) now
+ must contain an explicit dependency on
+ $(LINK_WARNING_H).
+
+2009-11-12 getgroups These functions now use a signature of gid_t,
+ getugroups rather than GETGROUPS_T. This probably has no
+ effect except on very old platforms.
+
+2009-11-04 tempname The gen_tempname function takes an additional
+ 'suffixlen' argument. You can safely pass 0.
+
+2009-11-04 nproc The num_processors function now takes an argument.
+
+2009-11-02 inet_pton The use of this module now requires linking with
+ $(INET_PTON_LIB).
+
+2009-11-02 inet_ntop The use of this module now requires linking with
+ $(INET_NTOP_LIB).
+
+2009-10-10 utimens The use of this module now requires linking with
+ $(LIB_CLOCK_GETTIME).
+
+2009-09-16 canonicalize-lgpl
+ The include file is changed from "canonicalize.h"
+ to <stdlib.h>.
+
+2009-09-04 link-follow The macro LINK_FOLLOWS_SYMLINK is now tri-state,
+ rather than only defined to 1.
+
+2009-09-03 openat The include files are standardized to POSIX 2008.
+ For openat, include <fcntl.h>; for
+ fchmodat, fstatat, and mkdirat, include
+ <sys/stat.h>; for fchownat and unlinkat,
+ include <unistd.h>. For all other
+ functions provided by this module,
+ continue to include "openat.h".
+
+2009-08-30 striconveh The functions mem_cd_iconveh and str_cd_iconveh
+ now take an 'iconveh_t *' argument instead of three
+ iconv_t arguments.
+
+2009-08-23 tempname The gen_tempname function takes an additional
+ 'flags' argument. You can safely pass 0.
+
+2009-08-12 getopt This module is deprecated. Please choose among
+ getopt-posix and getopt-gnu. getopt-gnu provides
+ "long options" and "options with optional
+ arguments", getopt-posix doesn't.
+
+2009-06-25 fpurge The include file is changed from "fpurge.h" to
+ <stdio.h>.
+
+2009-04-26 modules/uniconv/u8-conv-from-enc
+ modules/uniconv/u16-conv-from-enc
+ modules/uniconv/u32-conv-from-enc
+ The calling convention of the functions
+ u*_conv_from_encoding is changed.
+
+2009-04-26 modules/uniconv/u8-conv-to-enc
+ modules/uniconv/u16-conv-to-enc
+ modules/uniconv/u32-conv-to-enc
+ The calling convention of the functions
+ u*_conv_to_encoding is changed.
+
+2009-04-24 maintainer-makefile
+ The maint.mk file was copied from
+ coreutils, and the old
+ coverage/gettext/indent rules were
+ re-added. If you used 'make syntax-check'
+ this will add several new checks. If some
+ new check is annoying, add the name of the
+ checks to 'local-checks-to-skip' in your
+ cfg.mk.
+
+2009-04-01 visibility Renamed to lib-symbol-visibility.
+
+2009-04-01 ld-version-script Renamed to lib-symbol-versions.
+
+2009-03-20 close The substituted variable LIB_CLOSE is removed.
+
+2009-03-05 filevercmp Move hidden files up in ordering.
+
+2009-01-22 c-strtod This function no longer calls xalloc_die(). If
+ c-strtold you want to exit the program in case of out-of-
+ memory, the calling function needs to arrange
+ for it, like this:
+ errno = 0;
+ val = c_strtod (...);
+ if (val == 0 && errno == ENOMEM)
+ xalloc_die ();
+
+2009-01-17 relocatable-prog In the Makefile.am or Makefile.in, you now also
+ need to set RELOCATABLE_STRIP = :.
+
+2008-12-22 getaddrinfo When using this module, you now need to link with
+ canon-host $(GETADDRINFO_LIB).
+
+2008-12-21 mbiter The header files "mbiter.h", "mbuiter.h",
+ mbuiter "mbfile.h" can now be included without checking
+ mbfile HAVE_MBRTOWC. The macro HAVE_MBRTOWC will no
+ longer be defined by these modules in a year. If
+ you want to continue to use it, you need to invoke
+ AC_FUNC_MBRTOWC yourself.
+
+2008-11-11 warnings This module subsumes the file m4/warning.m4 which
+ was removed.
+
+2008-10-20 lstat The include file is changed from "lstat.h" to
+ <sys/stat.h>.
+
+2008-10-20 getaddrinfo The include file is changed from "getaddrinfo.h"
+ to <netdb.h>.
+
+2008-10-19 isnanf The include file is changed from "isnanf.h" to
+ <math.h>.
+ isnand The include file is changed from "isnand.h" to
+ <math.h>.
+ isnanl The include file is changed from "isnanl.h" to
+ <math.h>.
+
+2008-10-18 lchmod The include file is changed from "lchmod.h" to
+ <sys/stat.h>.
+
+2008-10-18 dirfd The include file is changed from "dirfd.h" to
+ <dirent.h>.
+
+2008-10-18 euidaccess The include file is changed from "euidaccess.h"
+ to <unistd.h>.
+
+2008-10-18 getdomainname The include file is changed from "getdomainname.h"
+ to <unistd.h>.
+
+2008-09-28 sockets When using this module, you now need to link with
+ $(LIBSOCKET).
+
+2008-09-24 sys_select The limitation on `select', introduced 2008-09-23,
+ was removed. sys_select now includes a select
+ wrapper for Winsock. The wrapper expects socket
+ and file descriptors to be compatible as arranged
+ by the sys_socket on MinGW.
+
+2008-09-23 sys_socket Under Windows (MinGW), the module now adds
+ wrappers around Winsock functions, so that
+ socket descriptors are now compatible with
+ file descriptors. In general, this change
+ will simply improve your code's portability
+ between POSIX platforms and Windows. In
+ particular, you will be able to use ioctl and
+ close instead of ioctlsocket and closesocket,
+ and test errno instead of WSAGetLastError ().
+ On the other hand, you have to audit your code to
+ remove usage of these Winsock-specific functions.
+
+ This change does not remove the need to call
+ the gl_sockets_startup function from the sockets
+ gnulib module. Also, for now select is disabled
+ when you include the sys_socket module; while
+ the functionality will be restored soon, for
+ efficiency it is suggested to use the poll system
+ poll system call and gnulib module instead.
+
+2008-09-13 EOVERFLOW The module is removed. Use module errno instead.
+
+2008-09-01 filename The module does not define the function
+ concatenated_filename any more. To get an
+ equivalent function, use function
+ xconcatenated_filename from module
+ 'xconcat-filename'.
+
+2008-08-31 havelib On Solaris, when searching for 64-bit mode
+ libraries the directory $prefix/lib is now ignored.
+ Instead the directory $prefix/lib/64 is searched.
+ You may need to create a symbolic link for
+ $prefix/lib/64 if you have 64-bit libraries
+ installed in $prefix/lib.
+
+2008-08-19 strverscmp The include file is changed from "strverscmp.h"
+ to <string.h>.
+
+2008-08-14 lock The include file is changed from "lock.h"
+ to "glthread/lock.h".
+ tls The include file is changed from "tls.h"
+ to "glthread/tls.h".
+
+2008-07-17 c-stack The module now requires the addition of
+ $(LIBCSTACK) or $(LTLIBCSTACK) in Makefile.am,
+ since it may depend on linking with libsigsegv.
+
+2008-07-07 isnanf-nolibm The include file is changed from "isnanf.h"
+ to "isnanf-nolibm.h".
+ isnand-nolibm The include file is changed from "isnand.h"
+ to "isnand-nolibm.h".
+
+2008-06-10 execute The execute function takes an additional termsigp
+ argument. Passing termsigp = NULL is ok.
+ wait-process The wait_subprocess function takes an additional
+ termsigp argument. Passing termsigp = NULL is ok.
+
+2008-05-10 linebreak The module is split into several modules unilbrk/*.
+ The include file is changed from "linebreak.h" to
+ "unilbrk.h". Two functions are renamed:
+ mbs_possible_linebreaks -> ulc_possible_linebreaks
+ mbs_width_linebreaks -> ulc_width_linebreaks
+
+2008-04-28 rpmatch The include file is now <stdlib.h>.
+
+2008-04-28 inet_ntop The include file is changed from "inet_ntop.h"
+ to <arpa/inet.h>.
+
+2008-04-28 inet_pton The include file is changed from "inet_pton.h"
+ to <arpa/inet.h>.
+
+2008-03-06 freadahead The return value's computation has changed. It
+ now increases by 1 after ungetc.
+
+2008-01-26 isnan-nolibm The module name is changed from isnan-nolibm to
+ isnand-nolibm. The include file is changed from
+ "isnan.h" to "isnand.h". The function that it
+ defines is changed from isnan() to isnand().
+
+2008-01-14 strcasestr This module now replaces worst-case inefficient
+ implementations; clients that use controlled
+ needles and thus do not care about worst-case
+ efficiency should use the new strcasestr-simple
+ module instead for smaller code size.
+
+2008-01-09 alloca-opt Now defines HAVE_ALLOCA_H only when the system
+ supplies an <alloca.h>. Gnulib-using code is now
+ expected to include <alloca.h> unconditionally.
+ Non-gnulib-using code can continue to include
+ <alloca.h> only if HAVE_ALLOCA_H is defined.
+
+2008-01-08 memmem This module now replaces worst-case inefficient
+ implementations; clients that use controlled
+ needles and thus do not care about worst-case
+ efficiency should use the new memmem-simple
+ module instead for smaller code size.
+
+2007-12-24 setenv The include file is changed from "setenv.h" to
+ <stdlib.h>. Also, the unsetenv function is no
+ longer declared in this module; use the 'unsetenv'
+ module if you need it.
+
+2007-12-03 getpagesize The include file is changed from "getpagesize.h"
+ to <unistd.h>.
+
+2007-12-03 strcase The include file is changed from <string.h> to
+ <strings.h>.
+
+2007-10-07 most modules The license for most modules has changed from
+ GPLv2+ to GPLv3+, and from LGPLv2+ to LGPLv3+.
+ A few modules are still under LGPLv2+; see the
+ module description for the applicable license.
+
+2007-09-01 linebreak "linebreak.h" no longer declares the functions
+ locale_charset, uc_width, u{8,16,32}_width. Use
+ "uniwidth.h" to get these functions declared.
+
+2007-08-28 areadlink-with-size
+ Renamed from mreadlink-with-size.
+ Function renamed: mreadlink_with_size ->
+ areadlink_with_size.
+
+2007-08-22 getdelim, getline
+ The include file is changed from "getdelim.h"
+ and "getline.h" to the POSIX 200x <stdio.h>.
+
+2007-08-18 idcache Now provides prototypes in "idcache.h".
+
+2007-08-10 xstrtol The STRTOL_FATAL_ERROR macro is removed.
+ Use the new xstrtol_fatal function instead.
+
+2007-08-04 human The function human_options no longer reports an
+ error to standard error; that is now the
+ caller's responsibility. It returns an
+ error code of type enum strtol_error
+ instead of the integer option value, and stores
+ the option value via a new int * argument.
+ xstrtol The first two arguments of STRTOL_FATAL_ERROR
+ are now an option name and option argument
+ instead of an option argument and a type string,
+ STRTOL_FAIL_WARN is removed.
+
+2007-07-14 gpl, lgpl New Texinfo versions with no sectioning commands.
+
+2007-07-10 version-etc Output now mentions GPLv3+, not GPLv2+. Use
+ gnulib-tool --local-dir to override this.
+
+2007-07-07 wcwidth The include file is changed from "wcwidth.h" to
+ <wchar.h>.
+
+2007-07-02 gpl, lgpl Renamed to gpl-2.0 and lgpl-2.1 respectively.
+ (There is also a new module gpl-3.0.)
+
+2007-06-16 lchown The include file is changed from "lchown.h" to
+ <unistd.h>.
+
+2007-06-09 xallocsa Renamed to xmalloca. The include file "xallocsa.h"
+ was remamed to "xmalloca.h". The function was
+ renamed:
+ xallocsa -> xmalloca
+
+2007-06-09 allocsa Renamed to malloca. The include file "allocsa.h"
+ was remamed to "malloca.h". The function-like
+ macros were renamed:
+ allocsa -> malloca
+ freesa -> freea
+
+2007-05-20 utimens Renamed futimens to gl_futimens, to avoid
+ conflict with the glibc-2.6-introduced function
+ that has a different signature.
+
+2007-05-01 sigprocmask The module now depends on signal, so replace
+ #include "sigprocmask.h"
+ with
+ #include <signal.h>
+
+2007-04-06 gettext The macro HAVE_LONG_DOUBLE is no longer set.
+ You can replace all its uses with 1, i.e. assume
+ 'long double' as a type exists.
+
+2007-04-01 arcfour Renamed to crypto/arcfour.
+ arctwo Renamed to crypto/arctwo.
+ des Renamed to crypto/des.
+ gc Renamed to crypto/gc.
+ gc-arcfour Renamed to crypto/gc-arcfour.
+ gc-arctwo Renamed to crypto/gc-arctwo.
+ gc-des Renamed to crypto/gc-des.
+ gc-hmac-md5 Renamed to crypto/gc-hmac-md5.
+ gc-hmac-sha1 Renamed to crypto/gc-hmac-sha1.
+ gc-md2 Renamed to crypto/gc-md2.
+ gc-md4 Renamed to crypto/gc-md4.
+ gc-md5 Renamed to crypto/gc-md5.
+ gc-pbkdf2-sha1 Renamed to crypto/gc-pbkdf2-sha1.
+ gc-random Renamed to crypto/gc-random.
+ gc-rijndael Renamed to crypto/gc-rijndael.
+ gc-sha1 Renamed to crypto/gc-sha1.
+ hmac-md5 Renamed to crypto/hmac-md5.
+ hmac-sha1 Renamed to crypto/hmac-sha1.
+ md2 Renamed to crypto/md2.
+ md4 Renamed to crypto/md4.
+ md5 Renamed to crypto/md5.
+ rijndael Renamed to crypto/rijndael.
+ sha1 Renamed to crypto/sha1.
+
+2007-03-27 vasprintf The module now depends on stdio, so replace
+ #include "vasprintf.h"
+ with
+ #include <stdio.h>
+
+2007-03-24 tsearch The include file is changed from "tsearch.h" to
+ <search.h>.
+
+2007-03-24 utf8-ucs4 The include file is changed from "utf8-ucs4.h"
+ to "unistr.h".
+ utf8-ucs4-unsafe The include file is changed from
+ "utf8-ucs4-unsafe.h" to "unistr.h".
+ utf16-ucs4 The include file is changed from "utf16-ucs4.h"
+ to "unistr.h".
+ utf16-ucs4-unsafe The include file is changed from
+ "utf16-ucs4-unsafe.h" to "unistr.h".
+ ucs4-utf8 The include file is changed from "ucs4-utf8.h"
+ to "unistr.h".
+ ucs4-utf16 The include file is changed from "ucs4-utf16.h"
+ to "unistr.h".
+
+2007-03-19 iconvme The module is removed. Use module striconv instead:
+ iconv_string -> str_iconv
+ iconv_alloc -> str_cd_iconv (with reversed
+ arguments)
+
+2007-03-15 list The functions gl_list_create_empty and
+ array-list gl_list_create now take an extra fourth argument.
+ carray-list You can pass NULL.
+ linked-list
+ linkedhash-list
+ avltree-list
+ rbtree-list
+ avltreehash-list
+ rbtreehash-list
+
+2007-03-15 oset The function gl_oset_create_empty now takes a
+ array-oset third argument. You can pass NULL.
+ avltree-oset
+ rbtree-oset
+
+2007-03-12 des The types and functions in lib/des.h have been
+ gc-des renamed:
+
+ des_ctx -> gl_des_ctx, tripledes_ctx -> gl_3des_ctx,
+ des_is_weak_key -> gl_des_is_weak_key,
+ des_setkey -> gl_des_setkey,
+ des_makekey -> gl_des_makekey,
+ des_ecb_crypt -> gl_des_ecb_crypt,
+ des_ecb_encrypt -> gl_des_ecb_encrypt,
+ des_ecb_decrypt -> gl_des_ecb_decrypt,
+ tripledes_set2keys -> gl_3des_set2keys,
+ tripledes_set3keys -> gl_3des_set3keys,
+ tripledes_makekey -> gl_3des_makekey,
+ tripledes_ecb_crypt -> gl_3des_ecb_crypt.
+
+ Also consider using the "gc-des" buffer instead of
+ using the "des" module directly.
+
+2007-02-28 xreadlink The module xreadlink was renamed to
+ xreadlink-with-size. The function was renamed:
+ xreadlink -> xreadlink_with_size.
+
+2007-02-18 exit The modules now depend on stdlib, so replace
+ mkdtemp #include "exit.h"
+ mkstemp #include "mkdtemp.h"
+ #include "mkstemp.h"
+ with
+ #include <stdlib.h>
+
+2007-01-26 strdup The module now depends on string, so replace
+ #include "strdup.h"
+ with
+ #include <string.h>
+
+# This is for Emacs.
+# Local Variables:
+# indent-tabs-mode: nil
+# whitespace-check-buffer-indent: nil
+# End:
diff --git a/gnulib/README b/gnulib/README
new file mode 100644
index 00000000..a00e2411
--- /dev/null
+++ b/gnulib/README
@@ -0,0 +1,334 @@
+Gnulib
+======
+
+While portability across operating systems is not one of GNU's primary
+goals, it has helped introduce many people to the GNU system, and is
+worthwhile when it can be achieved at a low cost. This collection helps
+lower that cost.
+
+Gnulib is intended to be the canonical source for most of the important
+"portability" and/or common files for GNU projects. These are files
+intended to be shared at the source level; Gnulib is not a typical
+library meant to be installed and linked against. Thus, unlike most
+projects, Gnulib does not normally generate a source tarball
+distribution; instead, developers grab modules directly from the
+source repository.
+
+The easiest, and recommended, way to do this is to use the gnulib-tool
+script. Since there is no installation procedure for Gnulib,
+gnulib-tool needs to be run directly in the directory that contains the
+Gnulib source code. You can do this either by specifying the absolute
+filename of gnulib-tool, or by using a symbolic link from a
+place inside your PATH to the gnulib-tool file of your preferred
+Gnulib checkout. For example:
+ $ ln -s $HOME/gnu/src/gnulib.git/gnulib-tool $HOME/bin/gnulib-tool
+
+The home page for Gnulib is http://www.gnu.org/software/gnulib.
+
+
+git and CVS
+===========
+
+Gnulib is available for anonymous checkout. In any Bourne-shell the
+following should work:
+ $ git clone git://git.sv.gnu.org/gnulib.git
+
+For a read-write checkout you need to have a login on savannah.gnu.org and be
+a member of the gnulib project at http://savannah.gnu.org/projects/gnulib .
+Then, instead of the URL
+ git://git.sv.gnu.org/gnulib
+use the URL
+ ssh://<user>@git.sv.gnu.org/srv/git/gnulib
+where <user> is your login name on savannah.gnu.org.
+
+git resources:
+ Overview: http://en.wikipedia.org/wiki/Git_(software)
+ Homepage: http://git.or.cz/
+ Download: http://www.kernel.org/pub/software/scm/git/
+ Tutorial: http://git.or.cz/course/
+ http://www.kernel.org/pub/software/scm/git/docs/tutorial.html
+ FAQ: http://git.or.cz/gitwiki/GitFaq
+
+When you use "git annotate" or "git blame" with gnulib, it's recommended that
+you use the "-w" option, in order to ignore massive whitespace changes that
+happened in 2009.
+
+CVS checkouts are also supported:
+ $ cvs -d :pserver:anonymous@pserver.git.sv.gnu.org:/gnulib.git co -d gnulib HEAD
+
+Gnulib is hosted on savannah.gnu.org. The project page is
+http://savannah.gnu.org/projects/gnulib.
+
+
+Keeping Up-to-date
+==================
+
+The best way to work with Gnulib is to check it out of git.
+Subscribing to the bug-gnulib@gnu.org mailing list will help you to
+plan when to update your local copy of Gnulib (which you use to
+maintain your software) from git. To synchronize, you can use "git pull",
+or "cvs update -dP" if you are still using CVS.
+
+Sometimes, using an updated version of Gnulib will require you to use
+newer versions of GNU Automake or Autoconf. You may find it helpful
+to join the autotools-announce mailing list to be advised of such
+changes.
+
+
+Contributing to Gnulib
+======================
+All software here is copyrighted by the Free Software Foundation - you need
+to have filled out an assignment form for a project that uses the
+module for that contribution to be accepted here.
+
+If you have a piece of code that you would like to contribute, please
+email bug-gnulib@gnu.org. You can review the archives, subscribe, etc.,
+via http://lists.gnu.org/mailman/listinfo/bug-gnulib.
+
+Generally we are looking for files that fulfill at least one of the
+following requirements:
+
+ * If your .c and .h files define functions that are broken or
+missing on some other system, we should be able to include it.
+
+ * If your functions remove arbitrary limits from existing
+functions (either under the same name, or as a slightly different
+name), we should be able to include it.
+
+If your functions define completely new but rarely used functionality,
+you should probably consider packaging it as a separate library.
+
+
+License
+-------
+Gnulib contains code both under GPL and LGPL. Because several packages
+that use Gnulib are GPL, the files state they are licensed under GPL.
+However, to support LGPL projects as well, you may use some of the
+files under LGPL. The "License:" information in the files under
+modules/ clarifies the real license that applies to the module source.
+
+Keep in mind that if you submit patches to files in Gnulib, you should
+license them under a compatible license, which means that sometimes
+the contribution will have to be LGPL, if the original file is
+available under LGPL via a "License: LGPL" information in the
+projects' modules/ file.
+
+
+Indent with spaces, not TABs
+----------------------------
+We use space-only indentation in nearly all files. This includes all
+*.h, *.c, *.y files, except for the regex module. Makefile and ChangeLog
+files are excluded, since TAB characters are part of their format.
+
+In order to tell your editor to produce space-only indentation, you
+can use these instructions.
+
+ * For Emacs: Add these lines to your Emacs initialization file
+ ($HOME/.emacs or similar):
+
+ ;; In gnulib, indent with spaces everywhere (not TABs).
+ ;; Exceptions: Makefile and ChangeLog modes.
+ (add-hook 'find-file-hook '(lambda ()
+ (if (and buffer-file-name
+ (string-match "/gnulib\\>" (buffer-file-name))
+ (not (string-equal mode-name "Change Log"))
+ (not (string-equal mode-name "Makefile")))
+ (setq indent-tabs-mode nil))))
+
+ * For vi (vim): Add these lines to your $HOME/.vimrc file:
+
+ " Don't use tabs for indentation. Spaces are nicer to work with.
+ set expandtab
+
+ For Makefile and ChangeLog files, compensate this by adding this to
+ your $HOME/.vim/after/indent/make.vim and
+ $HOME/.vim/after/indent/changelog.vim files:
+
+ " Use tabs for indentation, regardless of the global setting.
+ set noexpandtab
+
+ * For Eclipse: In the "Window|Preferences" dialog (or "Eclipse|Preferences"
+ dialog on MacOS),
+ 1. Under "General|Editors|Text Editors", select the "Insert spaces for tabs"
+ checkbox.
+ 2. Under "C/C++|Code Style", select a code style profile that has the
+ "Indentation|Tab policy" combobox set to "Spaces only", such as the
+ "GNU [built-in]" policy.
+
+If you use the GNU indent program, pass it the option '--no-tabs'.
+
+
+How to add a new module
+-----------------------
+* Add the header files and source files to lib/.
+* If the module needs configure-time checks, write an autoconf
+ macro for it in m4/<module>.m4. See m4/README for details.
+* Write a module description modules/<module>, based on modules/TEMPLATE.
+* If the module contributes a section to the end-user documentation,
+ put this documentation in doc/<module>.texi and add it to the "Files"
+ section of modules/<module>. Most modules don't do this; they have only
+ documentation for the programmer (= gnulib user). Such documentation
+ usually goes into the lib/ source files. It may also go into doc/;
+ but don't add it to the module description in this case.
+* Add the module to the list in MODULES.html.sh.
+
+You can test that a module builds correctly with:
+ $ ./gnulib-tool --create-testdir --dir=/tmp/testdir module1 ... moduleN
+ $ cd /tmp/testdir
+ $ ./configure && make
+
+Other things:
+* Check the license and copyright year of headers.
+* Check that the source code follows the GNU coding standards;
+ see <http://www.gnu.org/prep/standards>.
+* Add source files to config/srclist* if they are identical to upstream
+ and should be upgraded in gnulib whenever the upstream source changes.
+* Include header files in source files to verify the function prototypes.
+* Make sure a replacement function doesn't cause warnings or clashes on
+ systems that have the function.
+* Autoconf functions can use gl_* prefix. The AC_* prefix is for
+ autoconf internal functions.
+* Build files only if they are needed on a platform. Look at the
+ alloca and fnmatch modules for how to achieve this. If for some
+ reason you cannot do this, and you have a .c file that leads to an
+ empty .o file on some platforms (through some big #if around all the
+ code), then ensure that the compilation unit is not empty after
+ preprocessing. One way to do this is to #include <stddef.h> or
+ <stdio.h> before the big #if.
+
+
+Portability guidelines
+----------------------
+
+Gnulib code is intended to be portable to a wide variety of platforms,
+not just GNU platforms.
+
+Many Gnulib modules exist so that applications need not worry about
+undesirable variability in implementations. For example, an
+application that uses the 'malloc' module need not worry about (malloc
+(0)) returning NULL on some Standard C platforms; and 'time_r' users
+need not worry about localtime_r returning int (not char *) on some
+platforms that predate POSIX 1003.1-2001.
+
+Originally much of the Gnulib code was portable to ancient hosts like
+4.2BSD, but it is a maintenance hassle to maintain compatibility with
+unused hosts, so currently we assume at least a freestanding C89
+compiler, possibly operating with a C library that predates C89. The
+oldest environment currently ported to is probably SunOS 4 + GCC 1.x,
+though we haven't tested this exact combination. SunOS 4 last shipped
+on 1998-09-30, and Sun dropped support for it on 2003-10-01, so at
+some point we may start assuming a C89 library as well.
+
+Because we assume a freestanding C89 compiler, Gnulib code can include
+<float.h>, <limits.h>, <stdarg.h>, and <stddef.h> unconditionally. It
+can also include hosted headers like <errno.h> that were present in
+Unix Version 7 and are thus widely available. Similarly, many modules
+include <sys/types.h> even though it's not even in C99; that's OK
+since <sys/types.h> has been around nearly forever. <string.h> and
+<stdlib.h> were not in Unix Version 7, so they weren't universally
+available on ancient hosts, but they are both in SunOS 4 (the oldest
+platform still in relatively-common use) so Gnulib assumes them now.
+
+Even if the include files exist, they may not conform to C89.
+However, GCC has a "fixincludes" script that attempts to fix most
+C89-conformance problems. So Gnulib currently assumes include files
+largely conform to C89 or better. People still using ancient hosts
+should use fixincludes or fix their include files manually.
+
+Even if the include files conform to C89, the library itself may not.
+For example, SunOS 4's (free (NULL)) can dump core, so Gnulib code
+must avoid freeing a null pointer, even though C89 allows it.
+You can work around some of these problems by requiring the relevant
+modules, e.g., the Gnulib 'free' module supplies a conforming 'free'.
+
+The GNU coding standards allow one departure from strict C99: Gnulib
+code can assume that standard internal types like size_t are no wider
+than 'long'. POSIX 1003.1-2001 and the GNU coding standards both
+require 'int' to be at least 32 bits wide, so Gnulib code assumes this
+as well. Gnulib code makes the following additional assumptions:
+
+ * With one exception noted below, signed integer arithmetic is two's
+ complement, without runtime overflow checking. This is the
+ traditional behavior, and is supported by C99 implementations that
+ conform to ISO/IEC 10967-1 (LIA-1) and that define signed integer
+ types as being modulo.
+
+ The exception is signed loop indexes. Here, the behavior is
+ undefined if any signed expression derived from the loop index
+ overflows. For example, the following code contains two such
+ overflows (the "i++" and the "i + 1") and therefore has undefined
+ behavior:
+
+ int i;
+ for (i = INT_MAX - 10; i <= INT_MAX; i++)
+ if (i + 1 < 0)
+ {
+ report_overflow ();
+ break;
+ }
+
+ This exception is a concession to modern optimizing compilers,
+ which can turn the above loop into code that executes the loop body
+ 11 times, even though wraparound arithmetic would cause the loop to
+ iterate forever.
+
+ * There are no "holes" in integer values: all the bits of an integer
+ contribute to its value in the usual way.
+
+ * If two nonoverlapping objects have sizes S and T represented as
+ size_t values, then S + T cannot overflow. This assumption is true
+ for all practical hosts with flat address spaces, but it is not
+ always true for hosts with segmented address spaces.
+
+ * If an existing object has size S, and if T is sufficiently small
+ (e.g., 8 KiB), then S + T cannot overflow. Overflow in this case
+ would mean that the rest of your program fits into T bytes, which
+ can't happen in realistic flat-address-space hosts.
+
+ * Objects with all bits zero are treated as 0 or NULL. For example,
+ memset (A, 0, sizeof A) initializes an array A of pointers to NULL.
+
+ * Adding zero to a null pointer does not change the pointer.
+ For example, 0 + (char *) NULL == (char *) NULL.
+
+The above assumptions are not required by the C or POSIX standards but
+hold on all practical porting targets that we're familiar with. If
+you have a porting target where these assumptions are not true, we'd
+appreciate hearing of any fixes. We need fixes that do not increase
+runtime overhead on standard hosts and that are relatively easy to
+maintain.
+
+With the above caveats, Gnulib code should port without problem to new
+hosts, e.g., hosts conforming to C99 or to recent POSIX standards.
+Hence Gnulib code should avoid using constructs (e.g., undeclared
+functions return 'int') that do not conform to C99.
+
+
+High Quality
+============
+
+We develop and maintain a testsuite for Gnulib. The goal is to have a
+100% firm interface so that maintainers can feel free to update to the
+code in git at *any* time and know that their application will not
+break. This means that before any change can be committed to the
+repository, a test suite program must be produced that exposes the bug
+for regression testing. All experimental work should be done on
+branches to help promote this.
+
+
+-----
+Copyright 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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/>.
diff --git a/gnulib/build-aux/announce-gen b/gnulib/build-aux/announce-gen
new file mode 100755
index 00000000..7d70fd4b
--- /dev/null
+++ b/gnulib/build-aux/announce-gen
@@ -0,0 +1,500 @@
+eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
+ & eval 'exec perl -wS "$0" $argv:q'
+ if 0;
+# Generate a release announcement message.
+
+my $VERSION = '2009-11-20 13:36'; # UTC
+# The definition above must lie within the first 8 lines in order
+# for the Emacs time-stamp write hook (at end) to update it.
+# If you change this file with Emacs, please let the write hook
+# do its job. Otherwise, update this string manually.
+
+# Copyright (C) 2002-2010 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/>.
+
+# Written by Jim Meyering
+
+use strict;
+
+use Getopt::Long;
+use Digest::MD5;
+use Digest::SHA1;
+use POSIX qw(strftime);
+
+(my $ME = $0) =~ s|.*/||;
+
+my %valid_release_types = map {$_ => 1} qw (alpha beta stable);
+my @archive_suffixes = ('tar.gz', 'tar.bz2', 'tar.lzma', 'tar.xz');
+
+sub usage ($)
+{
+ my ($exit_code) = @_;
+ my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
+ if ($exit_code != 0)
+ {
+ print $STREAM "Try `$ME --help' for more information.\n";
+ }
+ else
+ {
+ my @types = sort keys %valid_release_types;
+ print $STREAM <<EOF;
+Usage: $ME [OPTIONS]
+Generate an announcement message.
+
+OPTIONS:
+
+These options must be specified:
+
+ --release-type=TYPE TYPE must be one of @types
+ --package-name=PACKAGE_NAME
+ --previous-version=VER
+ --current-version=VER
+ --gpg-key-id=ID The GnuPG ID of the key used to sign the tarballs
+ --url-directory=URL_DIR
+
+The following are optional:
+
+ --news=NEWS_FILE
+ --bootstrap-tools=TOOL_LIST a comma-separated list of tools, e.g.,
+ autoconf,automake,bison,gnulib
+ --gnulib-version=VERSION report VERSION as the gnulib version, where
+ VERSION is the result of running git describe
+ in the gnulib source directory.
+ required if gnulib is in TOOL_LIST.
+ --no-print-checksums do not emit MD5 or SHA1 checksums
+ --archive-suffix=SUF add SUF to the list of archive suffixes
+
+ --help display this help and exit
+ --version output version information and exit
+
+EOF
+ }
+ exit $exit_code;
+}
+
+
+=item C<%size> = C<sizes (@file)>
+
+Compute the sizes of the C<@file> and return them as a hash. Return
+C<undef> if one of the computation failed.
+
+=cut
+
+sub sizes (@)
+{
+ my (@file) = @_;
+
+ my $fail = 0;
+ my %res;
+ foreach my $f (@file)
+ {
+ my $cmd = "du --human $f";
+ my $t = `$cmd`;
+ # FIXME-someday: give a better diagnostic, a la $PROCESS_STATUS
+ $@
+ and (warn "$ME: command failed: `$cmd'\n"), $fail = 1;
+ chomp $t;
+ $t =~ s/^([\d.]+[MkK]).*/${1}B/;
+ $res{$f} = $t;
+ }
+ return $fail ? undef : %res;
+}
+
+=item C<print_locations ($title, \@url, \%size, @file)
+
+Print a section C<$title> dedicated to the list of <@file>, which
+sizes are stored in C<%size>, and which are available from the C<@url>.
+
+=cut
+
+sub print_locations ($\@\%@)
+{
+ my ($title, $url, $size, @file) = @_;
+ print "Here are the $title:\n";
+ foreach my $url (@{$url})
+ {
+ for my $file (@file)
+ {
+ print " $url/$file";
+ print " (", $$size{$file}, ")"
+ if exists $$size{$file};
+ print "\n";
+ }
+ }
+ print "\n";
+}
+
+=item C<print_checksums (@file)
+
+Print the MD5 and SHA1 signature section for each C<@file>.
+
+=cut
+
+sub print_checksums (@)
+{
+ my (@file) = @_;
+
+ print "Here are the MD5 and SHA1 checksums:\n";
+ print "\n";
+
+ foreach my $meth (qw (md5 sha1))
+ {
+ foreach my $f (@file)
+ {
+ open IN, '<', $f
+ or die "$ME: $f: cannot open for reading: $!\n";
+ binmode IN;
+ my $dig =
+ ($meth eq 'md5'
+ ? Digest::MD5->new->addfile(*IN)->hexdigest
+ : Digest::SHA1->new->addfile(*IN)->hexdigest);
+ close IN;
+ print "$dig $f\n";
+ }
+ }
+ print "\n";
+}
+
+=item C<print_news_deltas ($news_file, $prev_version, $curr_version)
+
+Print the section of the NEWS file C<$news_file> addressing changes
+between versions C<$prev_version> and C<$curr_version>.
+
+=cut
+
+sub print_news_deltas ($$$)
+{
+ my ($news_file, $prev_version, $curr_version) = @_;
+
+ print "\n$news_file\n\n";
+
+ # Print all lines from $news_file, starting with the first one
+ # that mentions $curr_version up to but not including
+ # the first occurrence of $prev_version.
+ my $in_items;
+
+ my $re_prefix = qr/(?:\* )?(?:Noteworthy c|Major c|C)(?i:hanges)/;
+
+ open NEWS, '<', $news_file
+ or die "$ME: $news_file: cannot open for reading: $!\n";
+ while (defined (my $line = <NEWS>))
+ {
+ if ( ! $in_items)
+ {
+ # Match lines like these:
+ # * Major changes in release 5.0.1:
+ # * Noteworthy changes in release 6.6 (2006-11-22) [stable]
+ $line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$curr_version\E(?:[^\d.]|$)/o
+ or next;
+ $in_items = 1;
+ print $line;
+ }
+ else
+ {
+ # This regexp must not match version numbers in NEWS items.
+ # For example, they might well say `introduced in 4.5.5',
+ # and we don't want that to match.
+ $line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$prev_version\E(?:[^\d.]|$)/o
+ and last;
+ print $line;
+ }
+ }
+ close NEWS;
+
+ $in_items
+ or die "$ME: $news_file: no matching lines for `$curr_version'\n";
+}
+
+sub print_changelog_deltas ($$)
+{
+ my ($package_name, $prev_version) = @_;
+
+ # Print new ChangeLog entries.
+
+ # First find all CVS-controlled ChangeLog files.
+ use File::Find;
+ my @changelog;
+ find ({wanted => sub {$_ eq 'ChangeLog' && -d 'CVS'
+ and push @changelog, $File::Find::name}},
+ '.');
+
+ # If there are no ChangeLog files, we're done.
+ @changelog
+ or return;
+ my %changelog = map {$_ => 1} @changelog;
+
+ # Reorder the list of files so that if there are ChangeLog
+ # files in the specified directories, they're listed first,
+ # in this order:
+ my @dir = qw ( . src lib m4 config doc );
+
+ # A typical @changelog array might look like this:
+ # ./ChangeLog
+ # ./po/ChangeLog
+ # ./m4/ChangeLog
+ # ./lib/ChangeLog
+ # ./doc/ChangeLog
+ # ./config/ChangeLog
+ my @reordered;
+ foreach my $d (@dir)
+ {
+ my $dot_slash = $d eq '.' ? $d : "./$d";
+ my $target = "$dot_slash/ChangeLog";
+ delete $changelog{$target}
+ and push @reordered, $target;
+ }
+
+ # Append any remaining ChangeLog files.
+ push @reordered, sort keys %changelog;
+
+ # Remove leading `./'.
+ @reordered = map { s!^\./!!; $_ } @reordered;
+
+ print "\nChangeLog entries:\n\n";
+ # print join ("\n", @reordered), "\n";
+
+ $prev_version =~ s/\./_/g;
+ my $prev_cvs_tag = "\U$package_name\E-$prev_version";
+
+ my $cmd = "cvs -n diff -u -r$prev_cvs_tag -rHEAD @reordered";
+ open DIFF, '-|', $cmd
+ or die "$ME: cannot run `$cmd': $!\n";
+ # Print two types of lines, making minor changes:
+ # Lines starting with `+++ ', e.g.,
+ # +++ ChangeLog 22 Feb 2003 16:52:51 -0000 1.247
+ # and those starting with `+'.
+ # Don't print the others.
+ my $prev_printed_line_empty = 1;
+ while (defined (my $line = <DIFF>))
+ {
+ if ($line =~ /^\+\+\+ /)
+ {
+ my $separator = "*"x70 ."\n";
+ $line =~ s///;
+ $line =~ s/\s.*//;
+ $prev_printed_line_empty
+ or print "\n";
+ print $separator, $line, $separator;
+ }
+ elsif ($line =~ /^\+/)
+ {
+ $line =~ s///;
+ print $line;
+ $prev_printed_line_empty = ($line =~ /^$/);
+ }
+ }
+ close DIFF;
+
+ # The exit code should be 1.
+ # Allow in case there are no modified ChangeLog entries.
+ $? == 256 || $? == 128
+ or warn "$ME: warning: `cmd' had unexpected exit code or signal ($?)\n";
+}
+
+sub get_tool_versions ($$)
+{
+ my ($tool_list, $gnulib_version) = @_;
+ @$tool_list
+ or return ();
+
+ my $fail;
+ my @tool_version_pair;
+ foreach my $t (@$tool_list)
+ {
+ if ($t eq 'gnulib')
+ {
+ push @tool_version_pair, ucfirst $t . ' ' . $gnulib_version;
+ next;
+ }
+ # Assume that the last "word" on the first line of
+ # `tool --version` output is the version string.
+ my ($first_line, undef) = split ("\n", `$t --version`);
+ if ($first_line =~ /.* (\d[\w.-]+)$/)
+ {
+ $t = ucfirst $t;
+ push @tool_version_pair, "$t $1";
+ }
+ else
+ {
+ defined $first_line
+ and $first_line = '';
+ warn "$ME: $t: unexpected --version output\n:$first_line";
+ $fail = 1;
+ }
+ }
+
+ $fail
+ and exit 1;
+
+ return @tool_version_pair;
+}
+
+{
+ # Neutralize the locale, so that, for instance, "du" does not
+ # issue "1,2" instead of "1.2", what confuses our regexps.
+ $ENV{LC_ALL} = "C";
+
+ my $release_type;
+ my $package_name;
+ my $prev_version;
+ my $curr_version;
+ my $gpg_key_id;
+ my @url_dir_list;
+ my @news_file;
+ my $bootstrap_tools;
+ my $gnulib_version;
+ my $print_checksums_p = 1;
+
+ GetOptions
+ (
+ 'release-type=s' => \$release_type,
+ 'package-name=s' => \$package_name,
+ 'previous-version=s' => \$prev_version,
+ 'current-version=s' => \$curr_version,
+ 'gpg-key-id=s' => \$gpg_key_id,
+ 'url-directory=s' => \@url_dir_list,
+ 'news=s' => \@news_file,
+ 'bootstrap-tools=s' => \$bootstrap_tools,
+ 'gnulib-version=s' => \$gnulib_version,
+ 'print-checksums!' => \$print_checksums_p,
+ 'archive-suffix=s' => \@archive_suffixes,
+
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ ) or usage 1;
+
+ my $fail = 0;
+ # Ensure that sure each required option is specified.
+ $release_type
+ or (warn "$ME: release type not specified\n"), $fail = 1;
+ $package_name
+ or (warn "$ME: package name not specified\n"), $fail = 1;
+ $prev_version
+ or (warn "$ME: previous version string not specified\n"), $fail = 1;
+ $curr_version
+ or (warn "$ME: current version string not specified\n"), $fail = 1;
+ $gpg_key_id
+ or (warn "$ME: GnuPG key ID not specified\n"), $fail = 1;
+ @url_dir_list
+ or (warn "$ME: URL directory name(s) not specified\n"), $fail = 1;
+
+ my @tool_list = split ',', $bootstrap_tools;
+
+ grep (/^gnulib$/, @tool_list) ^ defined $gnulib_version
+ and (warn "$ME: when specifying gnulib as a tool, you must also specify\n"
+ . "--gnulib-version=V, where V is the result of running git describe\n"
+ . "in the gnulib source directory.\n"), $fail = 1;
+
+ exists $valid_release_types{$release_type}
+ or (warn "$ME: `$release_type': invalid release type\n"), $fail = 1;
+
+ @ARGV
+ and (warn "$ME: too many arguments:\n", join ("\n", @ARGV), "\n"),
+ $fail = 1;
+ $fail
+ and usage 1;
+
+ my $my_distdir = "$package_name-$curr_version";
+
+ my $xd = "$package_name-$prev_version-$curr_version.xdelta";
+
+ my @candidates = map { "$my_distdir.$_" } @archive_suffixes;
+ my @tarballs = grep {-f $_} @candidates;
+
+ @tarballs
+ or die "$ME: none of " . join(', ', @candidates) . " were found\n";
+ my @sizable = @tarballs;
+ -f $xd
+ and push @sizable, $xd;
+ my %size = sizes (@sizable);
+ %size
+ or exit 1;
+
+ # The markup is escaped as <\# so that when this script is sent by
+ # mail (or part of a diff), Gnus is not triggered.
+ print <<EOF;
+
+Subject: $my_distdir released [$release_type]
+
+<\#secure method=pgpmime mode=sign>
+
+FIXME: put comments here
+
+EOF
+
+ print_locations ("compressed sources", @url_dir_list, %size, @tarballs);
+ -f $xd
+ and print_locations ("xdelta diffs (useful? if so, "
+ . "please tell bug-gnulib\@gnu.org)",
+ @url_dir_list, %size, $xd);
+ my @sig_files = map { "$_.sig" } @tarballs;
+ print_locations ("GPG detached signatures[*]", @url_dir_list, %size,
+ @sig_files);
+ if ($url_dir_list[0] =~ "gnu\.org")
+ {
+ print "To reduce load on the main server, use a mirror listed at:\n";
+ print " http://www.gnu.org/order/ftp.html\n\n";
+ }
+
+ $print_checksums_p
+ and print_checksums (@sizable);
+
+ print <<EOF;
+[*] You can use either of the above signature files to verify that
+the corresponding file (without the .sig suffix) is intact. First,
+be sure to download both the .sig file and the corresponding tarball.
+Then, run a command like this:
+
+ gpg --verify $tarballs[0].sig
+
+If that command fails because you don't have the required public key,
+then run this command to import it:
+
+ gpg --keyserver keys.gnupg.net --recv-keys $gpg_key_id
+
+and rerun the \`gpg --verify' command.
+EOF
+
+ my @tool_versions = get_tool_versions (\@tool_list, $gnulib_version);
+ @tool_versions
+ and print "\nThis release was bootstrapped with the following tools:",
+ join ('', map {"\n $_"} @tool_versions), "\n";
+
+ print_news_deltas ($_, $prev_version, $curr_version)
+ foreach @news_file;
+
+ $release_type eq 'stable'
+ or print_changelog_deltas ($package_name, $prev_version);
+
+ exit 0;
+}
+
+### Setup "GNU" style for perl-mode and cperl-mode.
+## Local Variables:
+## mode: perl
+## perl-indent-level: 2
+## perl-continued-statement-offset: 2
+## perl-continued-brace-offset: 0
+## perl-brace-offset: 0
+## perl-brace-imaginary-offset: 0
+## perl-label-offset: -2
+## perl-extra-newline-before-brace: t
+## perl-merge-trailing-else: nil
+## eval: (add-hook 'write-file-hooks 'time-stamp)
+## time-stamp-start: "my $VERSION = '"
+## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
+## time-stamp-time-zone: "UTC"
+## time-stamp-end: "'; # UTC"
+## End:
diff --git a/gnulib/build-aux/arg-nonnull.h b/gnulib/build-aux/arg-nonnull.h
new file mode 100644
index 00000000..3179fdd6
--- /dev/null
+++ b/gnulib/build-aux/arg-nonnull.h
@@ -0,0 +1,26 @@
+/* A C macro for declaring that specific arguments must not be NULL.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+ that the values passed as arguments n, ..., m must be non-NULL pointers.
+ n = 1 stands for the first argument, n = 2 for the second argument etc. */
+#ifndef _GL_ARG_NONNULL
+# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+# define _GL_ARG_NONNULL(params)
+# endif
+#endif
diff --git a/gnulib/build-aux/bootstrap b/gnulib/build-aux/bootstrap
new file mode 100755
index 00000000..365a3d92
--- /dev/null
+++ b/gnulib/build-aux/bootstrap
@@ -0,0 +1,853 @@
+#! /bin/sh
+# Print a version string.
+scriptversion=2010-02-24.17; # UTC
+
+# Bootstrap this package from checked-out sources.
+
+# Copyright (C) 2003-2010 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/>.
+
+# Originally written by Paul Eggert. The canonical version of this
+# script is maintained as build-aux/bootstrap in gnulib, however, to
+# be useful to your project, you should place a copy of it under
+# version control in the top-level directory of your project. The
+# intent is that all customization can be done with a bootstrap.conf
+# file also maintained in your version control; gnulib comes with a
+# template build-aux/bootstrap.conf to get you started.
+
+# Please report bugs or propose patches to bug-gnulib@gnu.org.
+
+nl='
+'
+
+# Ensure file names are sorted consistently across platforms.
+LC_ALL=C
+export LC_ALL
+
+local_gl_dir=gl
+
+# Temporary directory names.
+bt='._bootmp'
+bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
+bt2=${bt}2
+
+usage() {
+ cat <<EOF
+Usage: $0 [OPTION]...
+Bootstrap this package from the checked-out sources.
+
+Options:
+ --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
+ sources reside. Use this if you already
+ have gnulib sources on your machine, and
+ do not want to waste your bandwidth downloading
+ them again. Defaults to \$GNULIB_SRCDIR.
+ --copy Copy files instead of creating symbolic links.
+ --force Attempt to bootstrap even if the sources seem
+ not to have been checked out.
+ --skip-po Do not download po files.
+
+If the file $0.conf exists in the same directory as this script, its
+contents are read as shell variables to configure the bootstrap.
+
+For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
+are honored.
+
+Running without arguments will suffice in most cases.
+EOF
+}
+
+# Configuration.
+
+# Name of the Makefile.am
+gnulib_mk=gnulib.mk
+
+# List of gnulib modules needed.
+gnulib_modules=
+
+# Any gnulib files needed that are not in modules.
+gnulib_files=
+
+# A function to be called after everything else in this script.
+# Override it via your own definition in bootstrap.conf.
+bootstrap_epilogue() { :; }
+
+# The command to download all .po files for a specified domain into
+# a specified directory. Fill in the first %s is the domain name, and
+# the second with the destination directory. Use rsync's -L and -r
+# options because the latest/%s directory and the .po files within are
+# all symlinks.
+po_download_command_format=\
+"rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
+
+extract_package_name='
+ /^AC_INIT(/{
+ /.*,.*,.*, */{
+ s///
+ s/[][]//g
+ s/)$//
+ p
+ q
+ }
+ s/AC_INIT(\[*//
+ s/]*,.*//
+ s/^GNU //
+ y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ s/[^A-Za-z0-9_]/-/g
+ p
+ }
+'
+package=`sed -n "$extract_package_name" configure.ac` || exit
+gnulib_name=lib$package
+
+build_aux=build-aux
+source_base=lib
+m4_base=m4
+doc_base=doc
+tests_base=tests
+
+# Extra files from gnulib, which override files from other sources.
+gnulib_extra_files="
+ $build_aux/install-sh
+ $build_aux/missing
+ $build_aux/mdate-sh
+ $build_aux/texinfo.tex
+ $build_aux/depcomp
+ $build_aux/config.guess
+ $build_aux/config.sub
+ doc/INSTALL
+"
+
+# Additional gnulib-tool options to use. Use "\newline" to break lines.
+gnulib_tool_option_extras=
+
+# Other locale categories that need message catalogs.
+EXTRA_LOCALE_CATEGORIES=
+
+# Additional xgettext options to use. Use "\\\newline" to break lines.
+XGETTEXT_OPTIONS='\\\
+ --flag=_:1:pass-c-format\\\
+ --flag=N_:1:pass-c-format\\\
+ --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
+'
+
+# Package bug report address and copyright holder for gettext files
+COPYRIGHT_HOLDER='Free Software Foundation, Inc.'
+MSGID_BUGS_ADDRESS=bug-$package@gnu.org
+
+# Files we don't want to import.
+excluded_files=
+
+# File that should exist in the top directory of a checked out hierarchy,
+# but not in a distribution tarball.
+checkout_only_file=README-hacking
+
+# Whether to use copies instead of symlinks.
+copy=false
+
+# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
+# those files to be generated in directories like lib/, m4/, and po/.
+# Or set it to 'auto' to make this script select which to use based
+# on which version control system (if any) is used in the source directory.
+vc_ignore=auto
+
+# find_tool ENVVAR NAMES...
+# -------------------------
+# Search for a required program. Use the value of ENVVAR, if set,
+# otherwise find the first of the NAMES that can be run (i.e.,
+# supports --version). If found, set ENVVAR to the program name,
+# die otherwise.
+find_tool ()
+{
+ find_tool_envvar=$1
+ shift
+ find_tool_names=$@
+ eval "find_tool_res=\$$find_tool_envvar"
+ if test x"$find_tool_res" = x; then
+ for i
+ do
+ if ($i --version </dev/null) >/dev/null 2>&1; then
+ find_tool_res=$i
+ break
+ fi
+ done
+ else
+ find_tool_error_prefix="\$$find_tool_envvar: "
+ fi
+ if test x"$find_tool_res" = x; then
+ echo >&2 "$0: one of these is required: $find_tool_names"
+ exit 1
+ fi
+ ($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
+ echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version"
+ exit 1
+ }
+ eval "$find_tool_envvar=\$find_tool_res"
+ eval "export $find_tool_envvar"
+}
+
+# Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6.
+find_tool SHA1SUM sha1sum gsha1sum shasum
+
+# Override the default configuration, if necessary.
+# Make sure that bootstrap.conf is sourced from the current directory
+# if we were invoked as "sh bootstrap".
+case "$0" in
+ */*) test -r "$0.conf" && . "$0.conf" ;;
+ *) test -r "$0.conf" && . ./"$0.conf" ;;
+esac
+
+
+if test "$vc_ignore" = auto; then
+ vc_ignore=
+ test -d .git && vc_ignore=.gitignore
+ test -d CVS && vc_ignore="$vc_ignore .cvsignore"
+fi
+
+# Translate configuration into internal form.
+
+# Parse options.
+
+for option
+do
+ case $option in
+ --help)
+ usage
+ exit;;
+ --gnulib-srcdir=*)
+ GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
+ --skip-po)
+ SKIP_PO=t;;
+ --force)
+ checkout_only_file=;;
+ --copy)
+ copy=true;;
+ *)
+ echo >&2 "$0: $option: unknown option"
+ exit 1;;
+ esac
+done
+
+if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
+ echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
+ exit 1
+fi
+
+# If $STR is not already on a line by itself in $FILE, insert it,
+# sorting the new contents of the file and replacing $FILE with the result.
+insert_sorted_if_absent() {
+ file=$1
+ str=$2
+ test -f $file || touch $file
+ echo "$str" | sort -u - $file | cmp - $file > /dev/null \
+ || echo "$str" | sort -u - $file -o $file \
+ || exit 1
+}
+
+# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
+found_aux_dir=no
+grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
+ >/dev/null && found_aux_dir=yes
+grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
+ >/dev/null && found_aux_dir=yes
+if test $found_aux_dir = no; then
+ echo "$0: expected line not found in configure.ac. Add the following:" >&2
+ echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
+ exit 1
+fi
+
+# If $build_aux doesn't exist, create it now, otherwise some bits
+# below will malfunction. If creating it, also mark it as ignored.
+if test ! -d $build_aux; then
+ mkdir $build_aux
+ for dot_ig in x $vc_ignore; do
+ test $dot_ig = x && continue
+ insert_sorted_if_absent $dot_ig $build_aux
+ done
+fi
+
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+sort_ver() { # sort -V is not generally available
+ ver1="$1"
+ ver2="$2"
+
+ # split on '.' and compare each component
+ i=1
+ while : ; do
+ p1=$(echo "$ver1" | cut -d. -f$i)
+ p2=$(echo "$ver2" | cut -d. -f$i)
+ if [ ! "$p1" ]; then
+ echo "$1 $2"
+ break
+ elif [ ! "$p2" ]; then
+ echo "$2 $1"
+ break
+ elif [ ! "$p1" = "$p2" ]; then
+ if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
+ echo "$2 $1"
+ elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
+ echo "$1 $2"
+ else # numeric, then lexicographic comparison
+ lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
+ if [ "$lp" = "$p2" ]; then
+ echo "$1 $2"
+ else
+ echo "$2 $1"
+ fi
+ fi
+ break
+ fi
+ i=$(($i+1))
+ done
+}
+
+get_version() {
+ app=$1
+
+ $app --version >/dev/null 2>&1 || return 1
+
+ $app --version 2>&1 |
+ sed -n '# extract version within line
+ s/.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
+ t done
+
+ # extract version at start of line
+ s/^\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
+ t done
+
+ d
+
+ :done
+ #the following essentially does s/5.005/5.5/
+ s/\.0*\([1-9]\)/.\1/g
+ p
+ q'
+}
+
+check_versions() {
+ ret=0
+
+ while read app req_ver; do
+ # Honor $APP variables ($TAR, $AUTOCONF, etc.)
+ appvar=`echo $app | tr '[a-z]' '[A-Z]'`
+ test "$appvar" = TAR && appvar=AMTAR
+ eval "app=\${$appvar-$app}"
+ inst_ver=$(get_version $app)
+ if [ ! "$inst_ver" ]; then
+ echo "Error: '$app' not found" >&2
+ ret=1
+ elif [ ! "$req_ver" = "-" ]; then
+ latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
+ if [ ! "$latest_ver" = "$inst_ver" ]; then
+ echo "Error: '$app' version == $inst_ver is too old" >&2
+ echo " '$app' version >= $req_ver is required" >&2
+ ret=1
+ fi
+ fi
+ done
+
+ return $ret
+}
+
+print_versions() {
+ echo "Program Min_version"
+ echo "----------------------"
+ printf "$buildreq"
+ echo "----------------------"
+ # can't depend on column -t
+}
+
+if ! printf "$buildreq" | check_versions; then
+ test -f README-prereq &&
+ echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2
+ echo
+ print_versions
+ exit 1
+fi
+
+echo "$0: Bootstrapping from checked-out $package sources..."
+
+# See if we can use gnulib's git-merge-changelog merge driver.
+if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
+ if git config merge.merge-changelog.driver >/dev/null ; then
+ :
+ elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
+ echo "initializing git-merge-changelog driver"
+ git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
+ git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
+ else
+ echo "consider installing git-merge-changelog from gnulib"
+ fi
+fi
+
+
+cleanup_gnulib() {
+ status=$?
+ rm -fr "$gnulib_path"
+ exit $status
+}
+
+git_modules_config () {
+ test -f .gitmodules && git config --file .gitmodules "$@"
+}
+
+gnulib_path=`git_modules_config submodule.gnulib.path`
+
+# Get gnulib files.
+
+case ${GNULIB_SRCDIR--} in
+-)
+ if git_modules_config submodule.gnulib.url >/dev/null; then
+ echo "$0: getting gnulib files..."
+ git submodule init || exit $?
+ git submodule update || exit $?
+
+ elif [ ! -d "$gnulib_path" ]; then
+ echo "$0: getting gnulib files..."
+
+ trap cleanup_gnulib 1 2 13 15
+
+ git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow=
+ git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" ||
+ cleanup_gnulib
+
+ trap - 1 2 13 15
+ fi
+ GNULIB_SRCDIR=$gnulib_path
+ ;;
+*)
+ # Use GNULIB_SRCDIR as a reference.
+ if test -d "$GNULIB_SRCDIR"/.git && \
+ git_modules_config submodule.gnulib.url >/dev/null; then
+ echo "$0: getting gnulib files..."
+ if git submodule --help|grep reference > /dev/null; then
+ # Prefer the one-liner available in git 1.6.4 or newer.
+ git submodule update --init --reference "$GNULIB_SRCDIR" \
+ "$gnulib_path" || exit $?
+ else
+ # This fallback allows at least git 1.5.5.
+ if test -f "$gnulib_path"/gnulib-tool; then
+ # Since file already exists, assume submodule init already complete.
+ git submodule update || exit $?
+ else
+ # Older git can't clone into an empty directory.
+ rmdir "$gnulib_path" 2>/dev/null
+ git clone --reference "$GNULIB_SRCDIR" \
+ "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
+ && git submodule init && git submodule update \
+ || exit $?
+ fi
+ fi
+ GNULIB_SRCDIR=$gnulib_path
+ fi
+ ;;
+esac
+
+gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
+<$gnulib_tool || exit
+
+# Get translations.
+
+download_po_files() {
+ subdir=$1
+ domain=$2
+ echo "$0: getting translations into $subdir for $domain..."
+ cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
+ eval "$cmd"
+}
+
+# Download .po files to $po_dir/.reference and copy only the new
+# or modified ones into $po_dir. Also update $po_dir/LINGUAS.
+update_po_files() {
+ # Directory containing primary .po files.
+ # Overwrite them only when we're sure a .po file is new.
+ po_dir=$1
+ domain=$2
+
+ # Download *.po files into this dir.
+ # Usually contains *.s1 checksum files.
+ ref_po_dir="$po_dir/.reference"
+
+ test -d $ref_po_dir || mkdir $ref_po_dir || return
+ download_po_files $ref_po_dir $domain \
+ && ls "$ref_po_dir"/*.po 2>/dev/null |
+ sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
+
+ langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
+ test "$langs" = '*' && langs=x
+ for po in $langs; do
+ case $po in x) continue;; esac
+ new_po="$ref_po_dir/$po.po"
+ cksum_file="$ref_po_dir/$po.s1"
+ if ! test -f "$cksum_file" ||
+ ! test -f "$po_dir/$po.po" ||
+ ! $SHA1SUM -c --status "$cksum_file" \
+ < "$new_po" > /dev/null; then
+ echo "updated $po_dir/$po.po..."
+ cp "$new_po" "$po_dir/$po.po" \
+ && $SHA1SUM < "$new_po" > "$cksum_file"
+ fi
+ done
+}
+
+case $SKIP_PO in
+'')
+ if test -d po; then
+ update_po_files po $package || exit
+ fi
+
+ if test -d runtime-po; then
+ update_po_files runtime-po $package-runtime || exit
+ fi;;
+esac
+
+symlink_to_dir()
+{
+ src=$1/$2
+ dst=${3-$2}
+
+ test -f "$src" && {
+
+ # If the destination directory doesn't exist, create it.
+ # This is required at least for "lib/uniwidth/cjk.h".
+ dst_dir=`dirname "$dst"`
+ if ! test -d "$dst_dir"; then
+ mkdir -p "$dst_dir"
+
+ # If we've just created a directory like lib/uniwidth,
+ # tell version control system(s) it's ignorable.
+ # FIXME: for now, this does only one level
+ parent=`dirname "$dst_dir"`
+ for dot_ig in x $vc_ignore; do
+ test $dot_ig = x && continue
+ ig=$parent/$dot_ig
+ insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
+ done
+ fi
+
+ if $copy; then
+ {
+ test ! -h "$dst" || {
+ echo "$0: rm -f $dst" &&
+ rm -f "$dst"
+ }
+ } &&
+ test -f "$dst" &&
+ cmp -s "$src" "$dst" || {
+ echo "$0: cp -fp $src $dst" &&
+ cp -fp "$src" "$dst"
+ }
+ else
+ test -h "$dst" &&
+ src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
+ dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
+ test "$src_i" = "$dst_i" || {
+ dot_dots=
+ case $src in
+ /*) ;;
+ *)
+ case /$dst/ in
+ *//* | */../* | */./* | /*/*/*/*/*/)
+ echo >&2 "$0: invalid symlink calculation: $src -> $dst"
+ exit 1;;
+ /*/*/*/*/) dot_dots=../../../;;
+ /*/*/*/) dot_dots=../../;;
+ /*/*/) dot_dots=../;;
+ esac;;
+ esac
+
+ echo "$0: ln -fs $dot_dots$src $dst" &&
+ ln -fs "$dot_dots$src" "$dst"
+ }
+ fi
+ }
+}
+
+cp_mark_as_generated()
+{
+ cp_src=$1
+ cp_dst=$2
+
+ if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
+ symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
+ elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
+ symlink_to_dir $local_gl_dir "$cp_dst"
+ else
+ case $cp_dst in
+ *.[ch]) c1='/* '; c2=' */';;
+ *.texi) c1='@c '; c2= ;;
+ *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
+ *) c1= ; c2= ;;
+ esac
+
+ # If the destination directory doesn't exist, create it.
+ # This is required at least for "lib/uniwidth/cjk.h".
+ dst_dir=`dirname "$cp_dst"`
+ test -d "$dst_dir" || mkdir -p "$dst_dir"
+
+ if test -z "$c1"; then
+ cmp -s "$cp_src" "$cp_dst" || {
+ # Copy the file first to get proper permissions if it
+ # doesn't already exist. Then overwrite the copy.
+ echo "$0: cp -f $cp_src $cp_dst" &&
+ rm -f "$cp_dst" &&
+ cp "$cp_src" "$cp_dst-t" &&
+ sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
+ mv -f "$cp_dst-t" "$cp_dst"
+ }
+ else
+ # Copy the file first to get proper permissions if it
+ # doesn't already exist. Then overwrite the copy.
+ cp "$cp_src" "$cp_dst-t" &&
+ (
+ echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
+ echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
+ sed "s!$bt_regex/!!g" "$cp_src"
+ ) > $cp_dst-t &&
+ if cmp -s "$cp_dst-t" "$cp_dst"; then
+ rm -f "$cp_dst-t"
+ else
+ echo "$0: cp $cp_src $cp_dst # with edits" &&
+ mv -f "$cp_dst-t" "$cp_dst"
+ fi
+ fi
+ fi
+}
+
+version_controlled_file() {
+ dir=$1
+ file=$2
+ found=no
+ if test -d CVS; then
+ grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
+ grep '^/[^/]*/[0-9]' > /dev/null && found=yes
+ elif test -d .git; then
+ git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
+ elif test -d .svn; then
+ svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
+ else
+ echo "$0: no version control for $dir/$file?" >&2
+ fi
+ test $found = yes
+}
+
+slurp() {
+ for dir in . `(cd $1 && find * -type d -print)`; do
+ copied=
+ sep=
+ for file in `ls -a $1/$dir`; do
+ case $file in
+ .|..) continue;;
+ .*) continue;; # FIXME: should all file names starting with "." be ignored?
+ esac
+ test -d $1/$dir/$file && continue
+ for excluded_file in $excluded_files; do
+ test "$dir/$file" = "$excluded_file" && continue 2
+ done
+ if test $file = Makefile.am && test "X$gnulib_mk" != XMakefile.am; then
+ copied=$copied${sep}$gnulib_mk; sep=$nl
+ remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
+ sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || {
+ echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
+ rm -f $dir/$gnulib_mk &&
+ sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
+ }
+ elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
+ version_controlled_file $dir $file; then
+ echo "$0: $dir/$file overrides $1/$dir/$file"
+ else
+ copied=$copied$sep$file; sep=$nl
+ if test $file = gettext.m4; then
+ echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
+ rm -f $dir/$file
+ sed '
+ /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
+ AC_DEFUN([AM_INTL_SUBDIR], [])
+ /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
+ AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
+ $a\
+ AC_DEFUN([gl_LOCK_EARLY], [])
+ ' $1/$dir/$file >$dir/$file
+ else
+ cp_mark_as_generated $1/$dir/$file $dir/$file
+ fi
+ fi || exit
+ done
+
+ for dot_ig in x $vc_ignore; do
+ test $dot_ig = x && continue
+ ig=$dir/$dot_ig
+ if test -n "$copied"; then
+ insert_sorted_if_absent $ig "$copied"
+ # If an ignored file name ends with .in.h, then also add
+ # the name with just ".h". Many gnulib headers are generated,
+ # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
+ # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
+ f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
+ insert_sorted_if_absent $ig "$f"
+
+ # For files like sys_stat.in.h and sys_time.in.h, record as
+ # ignorable the directory we might eventually create: sys/.
+ f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
+ insert_sorted_if_absent $ig "$f"
+ fi
+ done
+ done
+}
+
+
+# Create boot temporary directories to import from gnulib and gettext.
+rm -fr $bt $bt2 &&
+mkdir $bt $bt2 || exit
+
+# Import from gnulib.
+
+gnulib_tool_options="\
+ --import\
+ --no-changelog\
+ --aux-dir $bt/$build_aux\
+ --doc-base $bt/$doc_base\
+ --lib $gnulib_name\
+ --m4-base $bt/$m4_base/\
+ --source-base $bt/$source_base/\
+ --tests-base $bt/$tests_base\
+ --local-dir $local_gl_dir\
+ $gnulib_tool_option_extras\
+"
+echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
+$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
+slurp $bt || exit
+
+for file in $gnulib_files; do
+ symlink_to_dir "$GNULIB_SRCDIR" $file || exit
+done
+
+
+# Import from gettext.
+with_gettext=yes
+grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
+ with_gettext=no
+
+if test $with_gettext = yes; then
+ echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
+ cp configure.ac $bt2 &&
+ (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
+ slurp $bt2 $bt || exit
+fi
+rm -fr $bt $bt2 || exit
+
+# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
+# gnulib-populated directories. Such .m4 files would cause aclocal to fail.
+# The following requires GNU find 4.2.3 or newer. Considering the usual
+# portability constraints of this script, that may seem a very demanding
+# requirement, but it should be ok. Ignore any failure, which is fine,
+# since this is only a convenience to help developers avoid the relatively
+# unusual case in which a symlinked-to .m4 file is git-removed from gnulib
+# between successive runs of this script.
+find "$m4_base" "$source_base" \
+ -depth \( -name '*.m4' -o -name '*.[ch]' \) \
+ -type l -xtype l -delete > /dev/null 2>&1
+
+# Reconfigure, getting other files.
+
+# Skip autoheader if it's not needed.
+grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
+ AUTOHEADER=true
+
+for command in \
+ libtool \
+ "${ACLOCAL-aclocal} --force -I m4" \
+ "${AUTOCONF-autoconf} --force" \
+ "${AUTOHEADER-autoheader} --force" \
+ "${AUTOMAKE-automake} --add-missing --copy --force-missing"
+do
+ if test "$command" = libtool; then
+ use_libtool=0
+ # We'd like to use grep -E, to see if any of LT_INIT,
+ # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
+ # but that's not portable enough (e.g., for Solaris).
+ grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
+ && use_libtool=1
+ grep '^[ ]*LT_INIT' configure.ac >/dev/null \
+ && use_libtool=1
+ test $use_libtool = 0 \
+ && continue
+ command="${LIBTOOLIZE-libtoolize} -c -f"
+ fi
+ echo "$0: $command ..."
+ $command || exit
+done
+
+
+# Get some extra files from gnulib, overriding existing files.
+for file in $gnulib_extra_files; do
+ case $file in
+ */INSTALL) dst=INSTALL;;
+ build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
+ *) dst=$file;;
+ esac
+ symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
+done
+
+if test $with_gettext = yes; then
+ # Create gettext configuration.
+ echo "$0: Creating po/Makevars from po/Makevars.template ..."
+ rm -f po/Makevars
+ sed '
+ /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
+ /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/
+ /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'|
+ /^XGETTEXT_OPTIONS *=/{
+ s/$/ \\/
+ a\
+ '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
+ }
+ ' po/Makevars.template >po/Makevars
+
+ if test -d runtime-po; then
+ # Similarly for runtime-po/Makevars, but not quite the same.
+ rm -f runtime-po/Makevars
+ sed '
+ /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
+ /^subdir *=.*/s/=.*/= runtime-po/
+ /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
+ /^XGETTEXT_OPTIONS *=/{
+ s/$/ \\/
+ a\
+ '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
+ }
+ ' <po/Makevars.template >runtime-po/Makevars
+
+ # Copy identical files from po to runtime-po.
+ (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
+ fi
+fi
+
+bootstrap_epilogue
+
+echo "$0: done. Now you can run './configure'."
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/bootstrap.conf b/gnulib/build-aux/bootstrap.conf
new file mode 100644
index 00000000..75cf6ff3
--- /dev/null
+++ b/gnulib/build-aux/bootstrap.conf
@@ -0,0 +1,59 @@
+# Bootstrap configuration.
+
+# Copyright (C) 2006, 2007, 2009, 2010 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/>.
+
+
+# gnulib modules used by this package.
+gnulib_modules="
+"
+
+# Additional xgettext options to use. Use "\\\newline" to break lines.
+XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
+ --from-code=UTF-8\\\
+ --flag=asprintf:2:c-format --flag=vasprintf:2:c-format\\\
+ --flag=asnprintf:3:c-format --flag=vasnprintf:3:c-format\\\
+ --flag=wrapf:1:c-format\\\
+'
+
+# If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]"
+# appears in configure.ac, exclude some unnecessary files.
+# Without grep's -E option (not portable enough, pre-configure),
+# the following test is ugly. Also, this depends on the existence
+# of configure.ac, not the obsolescent-named configure.in. But if
+# you're using this infrastructure, you should care about such things.
+
+gettext_external=0
+grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null &&
+ gettext_external=1
+grep '^[ ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null &&
+ gettext_external=1
+
+if test $gettext_external = 1; then
+ # Gettext supplies these files, but we don't need them since
+ # we don't have an intl subdirectory.
+ excluded_files='
+ m4/glibc2.m4
+ m4/intdiv0.m4
+ m4/lcmessage.m4
+ m4/lock.m4
+ m4/printf-posix.m4
+ m4/size_max.m4
+ m4/uintmax_t.m4
+ m4/ulonglong.m4
+ m4/visibility.m4
+ m4/xsize.m4
+ '
+fi
diff --git a/gnulib/build-aux/compile b/gnulib/build-aux/compile
new file mode 100755
index 00000000..c0096a7b
--- /dev/null
+++ b/gnulib/build-aux/compile
@@ -0,0 +1,143 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2009-10-06.20; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software
+# Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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 2, 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/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as `compile cc -o foo foo.c'.
+ # So we strip `-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no `-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # `.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/config.guess b/gnulib/build-aux/config.guess
new file mode 100755
index 00000000..c2246a4f
--- /dev/null
+++ b/gnulib/build-aux/config.guess
@@ -0,0 +1,1502 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+# Free Software Foundation, Inc.
+
+timestamp='2009-12-30'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner. Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ s390x:SunOS:*:*)
+ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ echo i386-pc-auroraux${UNAME_RELEASE}
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ eval $set_cc_for_build
+ SUN_ARCH="i386"
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH="x86_64"
+ fi
+ fi
+ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[456])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ authenticamd | genuineintel | EM64T)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ 8664:Windows_NT:*)
+ echo x86_64-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ arm*:Linux:*:*)
+ eval $set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ LIBC=gnu
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef ${UNAME_MACHINE}
+ #undef ${UNAME_MACHINE}el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=${UNAME_MACHINE}el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=${UNAME_MACHINE}
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ padre:Linux:*:*)
+ echo sparc-unknown-linux-gnu
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configury will decide that
+ # this is a cross-build.
+ echo i586-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ echo i586-pc-haiku
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ i386)
+ eval $set_cc_for_build
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ UNAME_PROCESSOR="x86_64"
+ fi
+ fi ;;
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+ i*86:AROS:*:*)
+ echo ${UNAME_MACHINE}-pc-aros
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/gnulib/build-aux/config.libpath b/gnulib/build-aux/config.libpath
new file mode 100755
index 00000000..a6a190be
--- /dev/null
+++ b/gnulib/build-aux/config.libpath
@@ -0,0 +1,154 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable at run time.
+#
+# Copyright 1996-2010 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2003
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# 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/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variable LD should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+shlibpath_var=
+case $host_os in
+ aix3*)
+ shlibpath_var=LIBPATH
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+ beos*)
+ shlibpath_var=LIBRARY_PATH
+ ;;
+ bsdi[45]*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+ darwin* | rhapsody*)
+ shlibpath_var=DYLD_LIBRARY_PATH
+ ;;
+ dgux*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ freebsd1*)
+ ;;
+ freebsd* | dragonfly*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ gnu*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case "$host_cpu" in
+ ia64* | hppa*64*) shlibpath_var=LD_LIBRARY_PATH ;;
+ *) shlibpath_var=SHLIB_PATH ;;
+ esac
+ ;;
+ interix[3-9]*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $host_os in
+ irix5* | nonstopux*)
+ shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 ") shlibsuff= ;;
+ *-n32|*"-n32 ") shlibsuff=N32 ;;
+ *-64|*"-64 ") shlibsuff=64 ;;
+ *) shlibsuff= ;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux* | k*bsd*-gnu)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ netbsd*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ newsos6)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ nto-qnx*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ openbsd*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ os2*)
+ shlibpath_var=LIBPATH
+ ;;
+ osf3* | osf4* | osf5*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ sunos4*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ sysv4 | sysv4.3*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ uts4*)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+esac
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+EOF
diff --git a/gnulib/build-aux/config.rpath b/gnulib/build-aux/config.rpath
new file mode 100755
index 00000000..17298f23
--- /dev/null
+++ b/gnulib/build-aux/config.rpath
@@ -0,0 +1,672 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2010 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This file 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.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ darwin*)
+ case $cc_basename in
+ xlc*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ newsos6)
+ ;;
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ ecc*)
+ wl='-Wl,'
+ ;;
+ icc* | ifort*)
+ wl='-Wl,'
+ ;;
+ lf95*)
+ wl='-Wl,'
+ ;;
+ pgcc | pgf77 | pgf90)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ wl='-Wl,'
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ wl='-Wl,'
+ ;;
+ unicos*)
+ wl='-Wl,'
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ case "$host_os" in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we cannot use
+ # them.
+ ld_shlibs=no
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ gnu* | linux* | k*bsd*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = no; then
+ hardcode_libdir_flag_spec=
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ hardcode_direct=no
+ if test "$GCC" = yes ; then
+ :
+ else
+ case $cc_basename in
+ xlc*)
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+ freebsd2.2*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ freebsd2*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd* | dragonfly*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+ hpux11*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ ;;
+ *)
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec= # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ library_names_spec='$libname.a'
+ ;;
+ aix[4-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ amigaos*)
+ library_names_spec='$libname.a'
+ ;;
+ beos*)
+ library_names_spec='$libname$shrext'
+ ;;
+ bsdi[45]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ shrext=.dll
+ library_names_spec='$libname.dll.a $libname.lib'
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ library_names_spec='$libname$shrext'
+ ;;
+ dgux*)
+ library_names_spec='$libname$shrext'
+ ;;
+ freebsd1*)
+ ;;
+ freebsd* | dragonfly*)
+ case "$host_os" in
+ freebsd[123]*)
+ library_names_spec='$libname$shrext$versuffix' ;;
+ *)
+ library_names_spec='$libname$shrext' ;;
+ esac
+ ;;
+ gnu*)
+ library_names_spec='$libname$shrext'
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $host_cpu in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ library_names_spec='$libname$shrext'
+ ;;
+ interix[3-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ library_names_spec='$libname$shrext'
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux* | k*bsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ knetbsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ netbsd*)
+ library_names_spec='$libname$shrext'
+ ;;
+ newsos6)
+ library_names_spec='$libname$shrext'
+ ;;
+ nto-qnx*)
+ library_names_spec='$libname$shrext'
+ ;;
+ openbsd*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ library_names_spec='$libname.a'
+ ;;
+ osf3* | osf4* | osf5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sunos4*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ sysv4 | sysv4.3*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv4*MP*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ library_names_spec='$libname$shrext'
+ ;;
+ uts4*)
+ library_names_spec='$libname$shrext'
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/gnulib/build-aux/config.sub b/gnulib/build-aux/config.sub
new file mode 100755
index 00000000..c2d12572
--- /dev/null
+++ b/gnulib/build-aux/config.sub
@@ -0,0 +1,1714 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+# Free Software Foundation, Inc.
+
+timestamp='2010-01-22'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ kopensolaris*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray | -microblaze)
+ os=
+ basic_machine=$1
+ ;;
+ -bluegene*)
+ os=-cnk
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | lm32 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | rx \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12 | picochip)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | lm32-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* | rx-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile-* | tilegx-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-* | z80-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ os=-aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ bluegene*)
+ basic_machine=powerpc-ibm
+ os=-cnk
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ os=-cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ microblaze)
+ basic_machine=microblaze-xilinx
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ # This must be matched before tile*.
+ tilegx*)
+ basic_machine=tilegx-unknown
+ os=-linux-gnu
+ ;;
+ tile*)
+ basic_machine=tile-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ z80-*-coff)
+ basic_machine=z80-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
+ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* | -aros* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* | -cegcc* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -dicos*)
+ os=-dicos
+ ;;
+ -nacl*)
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/gnulib/build-aux/csharpcomp.sh.in b/gnulib/build-aux/csharpcomp.sh.in
new file mode 100644
index 00000000..08d23034
--- /dev/null
+++ b/gnulib/build-aux/csharpcomp.sh.in
@@ -0,0 +1,158 @@
+#!/bin/sh
+# Compile a C# program.
+
+# Copyright (C) 2003-2006, 2009-2010 Free Software Foundation, Inc.
+# Written by Bruno Haible <bruno@clisp.org>, 2003.
+#
+# 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/>.
+
+# This uses the same choices as csharpcomp.c, but instead of relying on the
+# environment settings at run time, it uses the environment variables
+# present at configuration time.
+#
+# This is a separate shell script, because the various C# compilers have
+# different command line options.
+#
+# Usage: /bin/sh csharpcomp.sh [OPTION] SOURCE.cs ... RES.resource ...
+# Options:
+# -o PROGRAM.exe or -o LIBRARY.dll
+# set the output assembly name
+# -L DIRECTORY search for C# libraries also in DIRECTORY
+# -l LIBRARY reference the C# library LIBRARY.dll
+# -O optimize
+# -g generate debugging information
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d -q "$TMPDIR/gtXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gt$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ { (exit 1); exit 1; }
+ }
+}
+
+sed_quote_subst='s/\([|&;<>()$`"'"'"'*?[#~=% \\]\)/\\\1/g'
+options_cscc=
+options_mcs=
+options_csc="-nologo"
+sources=
+while test $# != 0; do
+ case "$1" in
+ -o)
+ case "$2" in
+ *.dll)
+ options_cscc="$options_cscc -shared"
+ options_mcs="$options_mcs -target:library"
+ options_csc="$options_csc -target:library"
+ ;;
+ *.exe)
+ options_csc="$options_csc -target:exe"
+ ;;
+ esac
+ options_cscc="$options_cscc -o "`echo "$2" | sed -e "$sed_quote_subst"`
+ options_mcs="$options_mcs -out:"`echo "$2" | sed -e "$sed_quote_subst"`
+ options_csc="$options_csc -out:"`echo "$2" | sed -e "$sed_quote_subst"`
+ shift
+ ;;
+ -L)
+ options_cscc="$options_cscc -L "`echo "$2" | sed -e "$sed_quote_subst"`
+ options_mcs="$options_mcs -lib:"`echo "$2" | sed -e "$sed_quote_subst"`
+ options_csc="$options_csc -lib:"`echo "$2" | sed -e "$sed_quote_subst"`
+ shift
+ ;;
+ -l)
+ options_cscc="$options_cscc -l "`echo "$2" | sed -e "$sed_quote_subst"`
+ options_mcs="$options_mcs -reference:"`echo "$2" | sed -e "$sed_quote_subst"`
+ options_csc="$options_csc -reference:"`echo "$2" | sed -e "$sed_quote_subst"`".dll"
+ shift
+ ;;
+ -O)
+ options_cscc="$options_cscc -O"
+ options_csc="$options_csc -optimize+"
+ ;;
+ -g)
+ options_cscc="$options_cscc -g"
+ options_mcs="$options_mcs -debug"
+ options_csc="$options_csc -debug+"
+ ;;
+ -*)
+ echo "csharpcomp: unknown option '$1'" 1>&2
+ exit 1
+ ;;
+ *.resources)
+ options_cscc="$options_cscc -fresources="`echo "$1" | sed -e "$sed_quote_subst"`
+ options_mcs="$options_mcs -resource:"`echo "$1" | sed -e "$sed_quote_subst"`
+ options_csc="$options_csc -resource:"`echo "$1" | sed -e "$sed_quote_subst"`
+ ;;
+ *.cs)
+ sources="$sources "`echo "$1" | sed -e "$sed_quote_subst"`
+ ;;
+ *)
+ echo "csharpcomp: unknown type of argument '$1'" 1>&2
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+if test -n "@HAVE_CSCC@"; then
+ test -z "$CSHARP_VERBOSE" || echo cscc $options_cscc $sources
+ exec cscc $options_cscc $sources
+else
+ if test -n "@HAVE_MCS@"; then
+ # mcs prints it errors and warnings to stdout, not stderr. Furthermore it
+ # adds a useless line "Compilation succeeded..." at the end. Correct both.
+ sed_drop_success_line='${
+/^Compilation succeeded/d
+}'
+ func_tmpdir
+ trap 'rm -rf "$tmp"' 1 2 3 15
+ test -z "$CSHARP_VERBOSE" || echo mcs $options_mcs $sources
+ mcs $options_mcs $sources > "$tmp"/mcs.err
+ result=$?
+ sed -e "$sed_drop_success_line" < "$tmp"/mcs.err >&2
+ rm -rf "$tmp"
+ exit $result
+ else
+ if test -n "@HAVE_CSC@"; then
+ test -z "$CSHARP_VERBOSE" || echo csc $options_csc $sources
+ exec csc $options_csc $sources
+ else
+ echo 'C# compiler not found, try installing pnet, then reconfigure' 1>&2
+ exit 1
+ fi
+ fi
+fi
diff --git a/gnulib/build-aux/csharpexec.sh.in b/gnulib/build-aux/csharpexec.sh.in
new file mode 100644
index 00000000..f4327255
--- /dev/null
+++ b/gnulib/build-aux/csharpexec.sh.in
@@ -0,0 +1,95 @@
+#!/bin/sh
+# Execute a C# program.
+
+# Copyright (C) 2003, 2005, 2009, 2010 Free Software Foundation, Inc.
+# Written by Bruno Haible <bruno@clisp.org>, 2003.
+#
+# 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/>.
+
+# This uses the same choices as csharpexec.c, but instead of relying on the
+# environment settings at run time, it uses the environment variables
+# present at configuration time.
+#
+# This is a separate shell script, because the various C# interpreters have
+# different command line options.
+#
+# Usage: /bin/sh csharpexec.sh [OPTION] program.exe [ARGUMENTS]
+# Options:
+# -L DIRECTORY search for C# libraries also in DIRECTORY
+
+sed_quote_subst='s/\([|&;<>()$`"'"'"'*?[#~=% \\]\)/\\\1/g'
+options_ilrun=
+libdirs_mono=
+prog=
+while test $# != 0; do
+ case "$1" in
+ -L)
+ options_ilrun="$options_ilrun -L "`echo "$2" | sed -e "$sed_quote_subst"`
+ libdirs_mono="${libdirs_mono:+$libdirs_mono@MONO_PATH_SEPARATOR@}$2"
+ shift
+ ;;
+ -*)
+ echo "csharpexec: unknown option '$1'" 1>&2
+ exit 1
+ ;;
+ *)
+ prog="$1"
+ break
+ ;;
+ esac
+ shift
+done
+if test -z "$prog"; then
+ echo "csharpexec: no program specified" 1>&2
+ exit 1
+fi
+case "$prog" in
+ *.exe) ;;
+ *)
+ echo "csharpexec: program is not a .exe" 1>&2
+ exit 1
+ ;;
+esac
+
+if test -n "@HAVE_ILRUN@"; then
+ test -z "$CSHARP_VERBOSE" || echo ilrun $options_ilrun "$@"
+ exec ilrun $options_ilrun "$@"
+else
+ if test -n "@HAVE_MONO@"; then
+ CONF_MONO_PATH='@MONO_PATH@'
+ if test -n "$libdirs_mono"; then
+ MONO_PATH="$libdirs_mono${CONF_MONO_PATH:+@MONO_PATH_SEPARATOR@$CONF_MONO_PATH}"
+ else
+ MONO_PATH="$CONF_MONO_PATH"
+ fi
+ export MONO_PATH
+ test -z "$CSHARP_VERBOSE" || echo mono "$@"
+ exec mono "$@"
+ else
+ if test -n "@HAVE_CLIX@"; then
+ CONF_CLIX_PATH='@CLIX_PATH@'
+ if test -n "$libdirs_mono"; then
+ @CLIX_PATH_VAR@="$libdirs_mono${CONF_CLIX_PATH:+@MONO_PATH_SEPARATOR@$CONF_CLIX_PATH}"
+ else
+ @CLIX_PATH_VAR@="$CONF_CLIX_PATH"
+ fi
+ export @CLIX_PATH_VAR@
+ test -z "$CSHARP_VERBOSE" || echo clix "$@"
+ exec clix "$@"
+ else
+ echo 'C# virtual machine not found, try installing pnet, then reconfigure' 1>&2
+ exit 1
+ fi
+ fi
+fi
diff --git a/gnulib/build-aux/depcomp b/gnulib/build-aux/depcomp
new file mode 100755
index 00000000..df8eea7e
--- /dev/null
+++ b/gnulib/build-aux/depcomp
@@ -0,0 +1,630 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 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 2, 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/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u="sed s,\\\\\\\\,/,g"
+ depmode=msvisualcpp
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am. Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+ for arg
+ do
+ case $arg in
+ -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+ *) set fnord "$@" "$arg" ;;
+ esac
+ shift # fnord
+ shift # $arg
+ done
+ "$@"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> "$depfile"
+ echo >> "$depfile"
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$base.u
+ tmpdepfile3=$dir.libs/$base.u
+ "$@" -Wc,-M
+ else
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$dir$base.u
+ tmpdepfile3=$dir$base.u
+ "$@" -M
+ fi
+ stat=$?
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp2)
+ # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+ # compilers, which have integrated preprocessors. The correct option
+ # to use with these is +Maked; it writes dependencies to a file named
+ # 'foo.d', which lands next to the object file, wherever that
+ # happens to be.
+ # Much of this is similar to the tru64 case; see comments there.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir.libs/$base.d
+ "$@" -Wc,+Maked
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ "$@" +Maked
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add `dependent.h:' lines.
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile" "$tmpdepfile2"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mechanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no eat=no
+ for arg
+ do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ if test $eat = yes; then
+ eat=no
+ continue
+ fi
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -arch)
+ eat=yes ;;
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix=`echo "$object" | sed 's/^.*\././'`
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E 2>/dev/null |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvcmsys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/do-release-commit-and-tag b/gnulib/build-aux/do-release-commit-and-tag
new file mode 100755
index 00000000..353c4601
--- /dev/null
+++ b/gnulib/build-aux/do-release-commit-and-tag
@@ -0,0 +1,139 @@
+#!/bin/sh
+# In a git/autoconf/automake-enabled project with a NEWS file and a version-
+# controlled .prev-version file, automate the procedure by which we record
+# the date, release-type and version string in the NEWS file. That commit
+# will serve to identify the release, so apply a signed tag to it as well.
+VERSION=2009-11-06.10 # UTC
+
+# Note: this is a bash script (could be zsh or dash)
+
+# Copyright (C) 2009, 2010 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/>.
+
+# Written by Jim Meyering
+
+ME=`basename "$0"`
+warn() { printf '%s: %s\n' "$ME" "$*" >&2; }
+die() { warn "$*"; exit 1; }
+
+help_version()
+{
+ case $1 in
+ --help) cat <<EOF
+Usage: $ME VERSION RELEASE_TYPE
+
+Run this script to perform the final pre-release NEWS update
+in which the date, release-type and version string are recorded.
+Commit that result with a log entry marking the release, and apply
+a signed tag. Run it from your project's the top-level directory.
+
+Requirements:
+- you use git for version-control
+- a NEWS file, with line 3 identical to this:
+* Noteworthy changes in release ?.? (????-??-??) [?]
+- a version-controlled .prev-version file
+
+Options:
+ --help print this help, then exit
+ --version print version number, then exit
+
+EXAMPLE:
+To update NEWS and tag the beta 8.1 release of coreutils, I would run this:
+
+ $ME 8.1 beta
+
+Report bugs and patches to <bug-gnulib@gnu.org>.
+EOF
+ exit ;;
+
+ --version)
+ year=`echo "$VERSION" | sed 's/[^0-9].*//'`
+ cat <<EOF
+$ME $VERSION
+Copyright (C) $year Free Software Foundation, Inc,
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+EOF
+ exit ;;
+
+ *) die "unrecognized option: $1";;
+ esac
+}
+
+case $# in
+ 1) help_version $1; exit 0;;
+ 2) ;;
+ *) warn "Usage: $ME VERSION TYPE"; exit 1;;
+esac
+
+ver=$1
+type=$2
+
+# Verify that $ver looks like a version number, and...
+echo "$ver"|grep -E '^[0-9][0-9.]*[0-9]$' > /dev/null \
+ || die "invalid version: $ver"
+prev_ver=$(cat .prev-version) \
+ || die 'failed to determine previous version number from .prev-version'
+
+# Verify that $ver is sensible (> .prev-version).
+case $(printf "$prev_ver\n$ver\n"|sort -V -u|tr '\n' ':') in
+ "$prev_ver:$ver:") ;;
+ *) die "invalid version: $ver";;
+esac
+
+case $type in
+ alpha|beta|stable) ;;
+ *) die "invalid release type: $type";;
+esac
+
+# Extract package name from Makefile.
+pkg=$(sed -n 's/^PACKAGE = \(.*\)/\1/p' Makefile) \
+ || die 'failed to determine package name from Makefile'
+
+# simple check: no question marks on line 3 of NEWS
+noteworthy='* Noteworthy changes in release'
+test "$(sed -n 3p NEWS)" = "$noteworthy ?.? (????-??-??) [?]" \
+ || die 'line 3 of NEWS looks fishy!'
+
+# No dirt allowed.
+case $(git diff-index --name-only HEAD) in
+ '') ;;
+ *) die 'this tree is dirty; commit your changes first';;
+esac
+
+# update NEWS to have today's date, plus desired version number and $type
+perl -MPOSIX -ni -e 'my $today = strftime "%F", localtime time;' \
+ -e 'my ($type, $ver) = qw('"$type $ver"');' \
+ -e 'my $pfx = "'"$noteworthy"'";' \
+ -e 'print $.==3 ? "$pfx $ver ($today) [$type]\n" : $_' \
+ NEWS || die 'failed to update NEWS'
+
+# Ensure the current branch name is "master":
+curr_br=$(git rev-parse --symbolic-full-name HEAD)
+test "$curr_br" = refs/heads/master || die not on master
+
+printf "version $ver\n\n* NEWS: Record release date.\n" \
+ | git commit -F - -a || die 'git commit failed'
+git tag -s -m "$pkg $ver" v$ver HEAD || die 'git tag failed'
+
+# Local variables:
+# indent-tabs-mode: nil
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "VERSION="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: " # UTC"
+# End:
diff --git a/gnulib/build-aux/elisp-comp b/gnulib/build-aux/elisp-comp
new file mode 100755
index 00000000..ecc6b150
--- /dev/null
+++ b/gnulib/build-aux/elisp-comp
@@ -0,0 +1,94 @@
+#!/bin/sh
+# Copyright (C) 1995, 2000, 2003, 2004, 2005, 2009, 2010 Free Software
+# Foundation, Inc.
+
+scriptversion=2010-02-06.18; # UTC
+
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1995.
+#
+# 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 2, 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/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+ '')
+ echo "$0: No files. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: elisp-comp [--help] [--version] FILES...
+
+This script byte-compiles all `.el' files listed as FILES using GNU
+Emacs, and put the resulting `.elc' files into the current directory,
+so disregarding the original directories used in `.el' arguments.
+
+This script manages in such a way that all Emacs LISP files to
+be compiled are made visible between themselves, in the event
+they require or load-library one another.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "elisp-comp $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test -z "$EMACS" || test "$EMACS" = "t"; then
+ # Value of "t" means we are running in a shell under Emacs.
+ # Just assume Emacs is called "emacs".
+ EMACS=emacs
+fi
+
+tempdir=elc.$$
+
+# Cleanup the temporary directory on exit.
+trap 'ret=$?; rm -rf "$tempdir" && exit $ret' 0
+do_exit='(exit $ret); exit $ret'
+trap "ret=129; $do_exit" 1
+trap "ret=130; $do_exit" 2
+trap "ret=141; $do_exit" 13
+trap "ret=143; $do_exit" 15
+
+mkdir $tempdir
+cp "$@" $tempdir
+
+(
+ cd $tempdir
+ echo "(setq load-path (cons nil load-path))" > script
+ $EMACS -batch -q -l script -f batch-byte-compile *.el || exit $?
+ mv *.elc ..
+) || exit $?
+
+(exit 0); exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/gendocs.sh b/gnulib/build-aux/gendocs.sh
new file mode 100755
index 00000000..67d5b52c
--- /dev/null
+++ b/gnulib/build-aux/gendocs.sh
@@ -0,0 +1,367 @@
+#!/bin/sh -e
+# gendocs.sh -- generate a GNU manual in many formats. This script is
+# mentioned in maintain.texi. See the help message below for usage details.
+
+scriptversion=2010-02-13.20
+
+# Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+# 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/>.
+#
+# Original author: Mohit Agarwal.
+# Send bug reports and any other correspondence to bug-texinfo@gnu.org.
+
+prog=`basename "$0"`
+srcdir=`pwd`
+
+scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh"
+templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template"
+
+: ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="}
+: ${MAKEINFO="makeinfo"}
+: ${TEXI2DVI="texi2dvi -t @finalout"}
+: ${DVIPS="dvips"}
+: ${DOCBOOK2HTML="docbook2html"}
+: ${DOCBOOK2PDF="docbook2pdf"}
+: ${DOCBOOK2PS="docbook2ps"}
+: ${DOCBOOK2TXT="docbook2txt"}
+: ${GENDOCS_TEMPLATE_DIR="."}
+: ${TEXI2HTML="texi2html"}
+unset CDPATH
+unset use_texi2html
+
+version="gendocs.sh $scriptversion
+
+Copyright 2009 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
+
+Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source.
+See the GNU Maintainers document for a more extensive discussion:
+ http://www.gnu.org/prep/maintain_toc.html
+
+Options:
+ -s SRCFILE read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi}
+ -o OUTDIR write files into OUTDIR, instead of manual/.
+ --email ADR use ADR as contact in generated web pages.
+ --docbook convert to DocBook too (xml, txt, html, pdf and ps).
+ --html ARG pass indicated ARG to makeinfo or texi2html for HTML targets.
+ --texi2html use texi2html to generate HTML targets.
+ --help display this help and exit successfully.
+ --version display version information and exit successfully.
+
+Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\"
+
+Typical sequence:
+ cd PACKAGESOURCE/doc
+ wget \"$scripturl\"
+ wget \"$templateurl\"
+ $prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\"
+
+Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR
+to override). Move all the new files into your web CVS tree, as
+explained in the Web Pages node of maintain.texi.
+
+Please use the --email ADDRESS option to specify your bug-reporting
+address in the generated HTML pages.
+
+MANUAL-TITLE is included as part of the HTML <title> of the overall
+manual/index.html file. It should include the name of the package being
+documented. manual/index.html is created by substitution from the file
+$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the
+generic template for your own purposes.)
+
+If you have several manuals, you'll need to run this script several
+times with different MANUAL values, specifying a different output
+directory with -o each time. Then write (by hand) an overall index.html
+with links to them all.
+
+If a manual's Texinfo sources are spread across several directories,
+first copy or symlink all Texinfo sources into a single directory.
+(Part of the script's work is to make a tar.gz of the sources.)
+
+You can set the environment variables MAKEINFO, TEXI2DVI, and DVIPS to
+control the programs that get executed, and GENDOCS_TEMPLATE_DIR to
+control where the gendocs_template file is looked for. (With --docbook,
+the environment variables DOCBOOK2HTML, DOCBOOK2PDF, DOCBOOK2PS, and
+DOCBOOK2TXT are also respected.)
+
+By default, makeinfo is run in the default (English) locale, since
+that's the language of most Texinfo manuals. If you happen to have a
+non-English manual and non-English web site, see the SETLANG setting
+in the source.
+
+Email bug reports or enhancement requests to bug-texinfo@gnu.org.
+"
+
+calcsize()
+{
+ size=`ls -ksl $1 | awk '{print $1}'`
+ echo $size
+}
+
+MANUAL_TITLE=
+PACKAGE=
+EMAIL=webmasters@gnu.org # please override with --email
+htmlarg=
+outdir=manual
+srcfile=
+
+while test $# -gt 0; do
+ case $1 in
+ --email) shift; EMAIL=$1;;
+ --help) echo "$usage"; exit 0;;
+ --version) echo "$version"; exit 0;;
+ -s) shift; srcfile=$1;;
+ -o) shift; outdir=$1;;
+ --docbook) docbook=yes;;
+ --html) shift; htmlarg=$1;;
+ --texi2html) use_texi2html=1;;
+ -*)
+ echo "$0: Unknown option \`$1'." >&2
+ echo "$0: Try \`--help' for more information." >&2
+ exit 1;;
+ *)
+ if test -z "$PACKAGE"; then
+ PACKAGE=$1
+ elif test -z "$MANUAL_TITLE"; then
+ MANUAL_TITLE=$1
+ else
+ echo "$0: extra non-option argument \`$1'." >&2
+ exit 1
+ fi;;
+ esac
+ shift
+done
+
+if test -n "$srcfile"; then
+ :
+elif test -s "$srcdir/$PACKAGE.texinfo"; then
+ srcfile=$srcdir/$PACKAGE.texinfo
+elif test -s "$srcdir/$PACKAGE.texi"; then
+ srcfile=$srcdir/$PACKAGE.texi
+elif test -s "$srcdir/$PACKAGE.txi"; then
+ srcfile=$srcdir/$PACKAGE.txi
+else
+ echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
+ exit 1
+fi
+
+if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
+ echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
+ echo "$0: it is available from $templateurl." >&2
+ exit 1
+fi
+
+case $outdir in
+ /*) dotdot_outdir="$outdir";;
+ *) dotdot_outdir="../$outdir";;
+esac
+
+echo Generating output formats for $srcfile
+
+cmd="$SETLANG $MAKEINFO -o $PACKAGE.info \"$srcfile\""
+echo "Generating info files... ($cmd)"
+eval "$cmd"
+mkdir -p $outdir/
+tar czf $outdir/$PACKAGE.info.tar.gz $PACKAGE.info*
+info_tgz_size=`calcsize $outdir/$PACKAGE.info.tar.gz`
+# do not mv the info files, there's no point in having them available
+# separately on the web.
+
+cmd="${TEXI2DVI} \"$srcfile\""
+echo "Generating dvi ... ($cmd)"
+eval "$cmd"
+
+# now, before we compress dvi:
+echo Generating postscript...
+${DVIPS} $PACKAGE -o
+gzip -f -9 $PACKAGE.ps
+ps_gz_size=`calcsize $PACKAGE.ps.gz`
+mv $PACKAGE.ps.gz $outdir/
+
+# compress/finish dvi:
+gzip -f -9 $PACKAGE.dvi
+dvi_gz_size=`calcsize $PACKAGE.dvi.gz`
+mv $PACKAGE.dvi.gz $outdir/
+
+cmd="${TEXI2DVI} --pdf \"$srcfile\""
+echo "Generating pdf ... ($cmd)"
+eval "$cmd"
+pdf_size=`calcsize $PACKAGE.pdf`
+mv $PACKAGE.pdf $outdir/
+
+cmd="$SETLANG $MAKEINFO -o $PACKAGE.txt --no-split --no-headers \"$srcfile\""
+echo "Generating ASCII... ($cmd)"
+eval "$cmd"
+ascii_size=`calcsize $PACKAGE.txt`
+gzip -f -9 -c $PACKAGE.txt >$outdir/$PACKAGE.txt.gz
+ascii_gz_size=`calcsize $outdir/$PACKAGE.txt.gz`
+mv $PACKAGE.txt $outdir/
+
+html_split()
+{
+ opt="--split=$1 $htmlarg --node-files"
+ cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $opt \"$srcfile\""
+ echo "Generating html by $1... ($cmd)"
+ eval "$cmd"
+ split_html_dir=$PACKAGE.html
+ (
+ cd ${split_html_dir} || exit 1
+ ln -sf ${PACKAGE}.html index.html
+ tar -czf $dotdot_outdir/${PACKAGE}.html_$1.tar.gz -- *.html
+ )
+ eval html_$1_tgz_size=`calcsize $outdir/${PACKAGE}.html_$1.tar.gz`
+ rm -f $outdir/html_$1/*.html
+ mkdir -p $outdir/html_$1/
+ mv ${split_html_dir}/*.html $outdir/html_$1/
+ rmdir ${split_html_dir}
+}
+
+if test -z "$use_texi2html"; then
+ opt="--no-split --html -o $PACKAGE.html $htmlarg"
+ cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
+ echo "Generating monolithic html... ($cmd)"
+ rm -rf $PACKAGE.html # in case a directory is left over
+ eval "$cmd"
+ html_mono_size=`calcsize $PACKAGE.html`
+ gzip -f -9 -c $PACKAGE.html >$outdir/$PACKAGE.html.gz
+ html_mono_gz_size=`calcsize $outdir/$PACKAGE.html.gz`
+ mv $PACKAGE.html $outdir/
+
+ cmd="$SETLANG $MAKEINFO --html -o $PACKAGE.html $htmlarg \"$srcfile\""
+ echo "Generating html by node... ($cmd)"
+ eval "$cmd"
+ split_html_dir=$PACKAGE.html
+ (
+ cd ${split_html_dir} || exit 1
+ tar -czf $dotdot_outdir/${PACKAGE}.html_node.tar.gz -- *.html
+ )
+ html_node_tgz_size=`calcsize $outdir/${PACKAGE}.html_node.tar.gz`
+ rm -f $outdir/html_node/*.html
+ mkdir -p $outdir/html_node/
+ mv ${split_html_dir}/*.html $outdir/html_node/
+ rmdir ${split_html_dir}
+else
+ cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $htmlarg \"$srcfile\""
+ echo "Generating monolithic html... ($cmd)"
+ rm -rf $PACKAGE.html # in case a directory is left over
+ eval "$cmd"
+ html_mono_size=`calcsize $PACKAGE.html`
+ gzip -f -9 -c $PACKAGE.html >$outdir/$PACKAGE.html.gz
+ html_mono_gz_size=`calcsize $outdir/$PACKAGE.html.gz`
+ mv $PACKAGE.html $outdir/
+
+ html_split node
+ html_split chapter
+ html_split section
+fi
+
+echo Making .tar.gz for sources...
+d=`dirname $srcfile`
+srcfiles=`ls $d/*.texinfo $d/*.texi $d/*.txi $d/*.eps 2>/dev/null` || true
+tar cvzfh $outdir/$PACKAGE.texi.tar.gz $srcfiles
+texi_tgz_size=`calcsize $outdir/$PACKAGE.texi.tar.gz`
+
+if test -n "$docbook"; then
+ cmd="$SETLANG $MAKEINFO -o - --docbook \"$srcfile\" > ${srcdir}/$PACKAGE-db.xml"
+ echo "Generating docbook XML... ($cmd)"
+ eval "$cmd"
+ docbook_xml_size=`calcsize $PACKAGE-db.xml`
+ gzip -f -9 -c $PACKAGE-db.xml >$outdir/$PACKAGE-db.xml.gz
+ docbook_xml_gz_size=`calcsize $outdir/$PACKAGE-db.xml.gz`
+ mv $PACKAGE-db.xml $outdir/
+
+ cmd="${DOCBOOK2HTML} -o $split_html_db_dir ${outdir}/$PACKAGE-db.xml"
+ echo "Generating docbook HTML... ($cmd)"
+ eval "$cmd"
+ split_html_db_dir=html_node_db
+ (
+ cd ${split_html_db_dir} || exit 1
+ tar -czf $dotdot_outdir/${PACKAGE}.html_node_db.tar.gz -- *.html
+ )
+ html_node_db_tgz_size=`calcsize $outdir/${PACKAGE}.html_node_db.tar.gz`
+ rm -f $outdir/html_node_db/*.html
+ mkdir -p $outdir/html_node_db
+ mv ${split_html_db_dir}/*.html $outdir/html_node_db/
+ rmdir ${split_html_db_dir}
+
+ cmd="${DOCBOOK2TXT} ${outdir}/$PACKAGE-db.xml"
+ echo "Generating docbook ASCII... ($cmd)"
+ eval "$cmd"
+ docbook_ascii_size=`calcsize $PACKAGE-db.txt`
+ mv $PACKAGE-db.txt $outdir/
+
+ cmd="${DOCBOOK2PS} ${outdir}/$PACKAGE-db.xml"
+ echo "Generating docbook PS... ($cmd)"
+ eval "$cmd"
+ gzip -f -9 -c $PACKAGE-db.ps >$outdir/$PACKAGE-db.ps.gz
+ docbook_ps_gz_size=`calcsize $outdir/$PACKAGE-db.ps.gz`
+ mv $PACKAGE-db.ps $outdir/
+
+ cmd="${DOCBOOK2PDF} ${outdir}/$PACKAGE-db.xml"
+ echo "Generating docbook PDF... ($cmd)"
+ eval "$cmd"
+ docbook_pdf_size=`calcsize $PACKAGE-db.pdf`
+ mv $PACKAGE-db.pdf $outdir/
+fi
+
+echo "Writing index file..."
+if test -z "$use_texi2html"; then
+ CONDS="/%%IF *HTML_SECTION%%/,/%%ENDIF *HTML_SECTION%%/d;\
+ /%%IF *HTML_CHAPTER%%/,/%%ENDIF *HTML_CHAPTER%%/d"
+else
+ CONDS="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d"
+fi
+curdate=`$SETLANG date '+%B %d, %Y'`
+sed \
+ -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
+ -e "s!%%EMAIL%%!$EMAIL!g" \
+ -e "s!%%PACKAGE%%!$PACKAGE!g" \
+ -e "s!%%DATE%%!$curdate!g" \
+ -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
+ -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
+ -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
+ -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \
+ -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \
+ -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
+ -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
+ -e "s!%%PDF_SIZE%%!$pdf_size!g" \
+ -e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \
+ -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
+ -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
+ -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
+ -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
+ -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
+ -e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \
+ -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
+ -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
+ -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
+ -e "s,%%SCRIPTURL%%,$scripturl,g" \
+ -e "s!%%SCRIPTNAME%%!$prog!g" \
+ -e "$CONDS" \
+$GENDOCS_TEMPLATE_DIR/gendocs_template >$outdir/index.html
+
+echo "Done, see $outdir/ subdirectory for new files."
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/gnulib/build-aux/git-version-gen b/gnulib/build-aux/git-version-gen
new file mode 100755
index 00000000..16da2a8f
--- /dev/null
+++ b/gnulib/build-aux/git-version-gen
@@ -0,0 +1,151 @@
+#!/bin/sh
+# Print a version string.
+scriptversion=2010-02-24.17; # UTC
+
+# Copyright (C) 2007-2010 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/>.
+
+# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
+# It may be run two ways:
+# - from a git repository in which the "git describe" command below
+# produces useful output (thus requiring at least one signed tag)
+# - from a non-git-repo directory containing a .tarball-version file, which
+# presumes this script is invoked like "./git-version-gen .tarball-version".
+
+# In order to use intra-version strings in your project, you will need two
+# separate generated version string files:
+#
+# .tarball-version - present only in a distribution tarball, and not in
+# a checked-out repository. Created with contents that were learned at
+# the last time autoconf was run, and used by git-version-gen. Must not
+# be present in either $(srcdir) or $(builddir) for git-version-gen to
+# give accurate answers during normal development with a checked out tree,
+# but must be present in a tarball when there is no version control system.
+# Therefore, it cannot be used in any dependencies. GNUmakefile has
+# hooks to force a reconfigure at distribution time to get the value
+# correct, without penalizing normal development with extra reconfigures.
+#
+# .version - present in a checked-out repository and in a distribution
+# tarball. Usable in dependencies, particularly for files that don't
+# want to depend on config.h but do want to track version changes.
+# Delete this file prior to any autoconf run where you want to rebuild
+# files to pick up a version string change; and leave it stale to
+# minimize rebuild time after unrelated changes to configure sources.
+#
+# It is probably wise to add these two files to .gitignore, so that you
+# don't accidentally commit either generated file.
+#
+# Use the following line in your configure.ac, so that $(VERSION) will
+# automatically be up-to-date each time configure is run (and note that
+# since configure.ac no longer includes a version string, Makefile rules
+# should not depend on configure.ac for version updates).
+#
+# AC_INIT([GNU project],
+# m4_esyscmd([build-aux/git-version-gen .tarball-version]),
+# [bug-project@example])
+#
+# Then use the following lines in your Makefile.am, so that .version
+# will be present for dependencies, and so that .tarball-version will
+# exist in distribution tarballs.
+#
+# BUILT_SOURCES = $(top_srcdir)/.version
+# $(top_srcdir)/.version:
+# echo $(VERSION) > $@-t && mv $@-t $@
+# dist-hook:
+# echo $(VERSION) > $(distdir)/.tarball-version
+
+case $# in
+ 1) ;;
+ *) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version"; exit 1;;
+esac
+
+tarball_version_file=$1
+nl='
+'
+
+# First see if there is a tarball-only version file.
+# then try "git describe", then default.
+if test -f $tarball_version_file
+then
+ v=`cat $tarball_version_file` || exit 1
+ case $v in
+ *$nl*) v= ;; # reject multi-line output
+ [0-9]*) ;;
+ *) v= ;;
+ esac
+ test -z "$v" \
+ && echo "$0: WARNING: $tarball_version_file seems to be damaged" 1>&2
+fi
+
+if test -n "$v"
+then
+ : # use $v
+elif test -d .git \
+ && v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \
+ || git describe --abbrev=4 HEAD 2>/dev/null` \
+ && case $v in
+ v[0-9]*) ;;
+ *) (exit 1) ;;
+ esac
+then
+ # Is this a new git that lists number of commits since the last
+ # tag or the previous older version that did not?
+ # Newer: v6.10-77-g0f8faeb
+ # Older: v6.10-g0f8faeb
+ case $v in
+ *-*-*) : git describe is okay three part flavor ;;
+ *-*)
+ : git describe is older two part flavor
+ # Recreate the number of commits and rewrite such that the
+ # result is the same as if we were using the newer version
+ # of git describe.
+ vtag=`echo "$v" | sed 's/-.*//'`
+ numcommits=`git rev-list "$vtag"..HEAD | wc -l`
+ v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
+ ;;
+ esac
+
+ # Change the first '-' to a '.', so version-comparing tools work properly.
+ # Remove the "g" in git describe's output string, to save a byte.
+ v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
+else
+ v=UNKNOWN
+fi
+
+v=`echo "$v" |sed 's/^v//'`
+
+# Don't declare a version "dirty" merely because a time stamp has changed.
+git status > /dev/null 2>&1
+
+dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty=
+case "$dirty" in
+ '') ;;
+ *) # Append the suffix only if there isn't one already.
+ case $v in
+ *-dirty) ;;
+ *) v="$v-dirty" ;;
+ esac ;;
+esac
+
+# Omit the trailing newline, so that m4_esyscmd can use the result directly.
+echo "$v" | tr -d '\012'
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/gitlog-to-changelog b/gnulib/build-aux/gitlog-to-changelog
new file mode 100755
index 00000000..7660af51
--- /dev/null
+++ b/gnulib/build-aux/gitlog-to-changelog
@@ -0,0 +1,191 @@
+eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
+ & eval 'exec perl -wS "$0" $argv:q'
+ if 0;
+# Convert git log output to ChangeLog format.
+
+my $VERSION = '2009-10-30 13:46'; # UTC
+# The definition above must lie within the first 8 lines in order
+# for the Emacs time-stamp write hook (at end) to update it.
+# If you change this file with Emacs, please let the write hook
+# do its job. Otherwise, update this string manually.
+
+# Copyright (C) 2008-2010 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/>.
+
+# Written by Jim Meyering
+
+use strict;
+use warnings;
+use Getopt::Long;
+use POSIX qw(strftime);
+
+(my $ME = $0) =~ s|.*/||;
+
+# use File::Coda; # http://meyering.net/code/Coda/
+END {
+ defined fileno STDOUT or return;
+ close STDOUT and return;
+ warn "$ME: failed to close standard output: $!\n";
+ $? ||= 1;
+}
+
+sub usage ($)
+{
+ my ($exit_code) = @_;
+ my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
+ if ($exit_code != 0)
+ {
+ print $STREAM "Try `$ME --help' for more information.\n";
+ }
+ else
+ {
+ print $STREAM <<EOF;
+Usage: $ME [OPTIONS] [ARGS]
+
+Convert git log output to ChangeLog format. If present, any ARGS
+are passed to "git log". To avoid ARGS being parsed as options to
+$ME, they may be preceded by '--'.
+
+OPTIONS:
+
+ --since=DATE convert only the logs since DATE;
+ the default is to convert all log entries.
+ --format=FMT set format string for commit subject and body;
+ see 'man git-log' for the list of format metacharacters;
+ the default is '%s%n%b%n'
+
+ --help display this help and exit
+ --version output version information and exit
+
+EXAMPLE:
+
+ $ME --since=2008-01-01 > ChangeLog
+ $ME -- -n 5 foo > last-5-commits-to-branch-foo
+
+EOF
+ }
+ exit $exit_code;
+}
+
+# If the string $S is a well-behaved file name, simply return it.
+# If it contains white space, quotes, etc., quote it, and return the new string.
+sub shell_quote($)
+{
+ my ($s) = @_;
+ if ($s =~ m![^\w+/.,-]!)
+ {
+ # Convert each single quote to '\''
+ $s =~ s/\'/\'\\\'\'/g;
+ # Then single quote the string.
+ $s = "'$s'";
+ }
+ return $s;
+}
+
+sub quoted_cmd(@)
+{
+ return join (' ', map {shell_quote $_} @_);
+}
+
+{
+ my $since_date = '1970-01-01 UTC';
+ my $format_string = '%s%n%b%n';
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ 'since=s' => \$since_date,
+ 'format=s' => \$format_string,
+ ) or usage 1;
+
+ my @cmd = (qw (git log --log-size), "--since=$since_date",
+ '--pretty=format:%ct %an <%ae>%n%n'.$format_string, @ARGV);
+ open PIPE, '-|', @cmd
+ or die ("$ME: failed to run `". quoted_cmd (@cmd) ."': $!\n"
+ . "(Is your Git too old? Version 1.5.1 or later is required.)\n");
+
+ my $prev_date_line = '';
+ while (1)
+ {
+ defined (my $in = <PIPE>)
+ or last;
+ $in =~ /^log size (\d+)$/
+ or die "$ME:$.: Invalid line (expected log size):\n$in";
+ my $log_nbytes = $1;
+
+ my $log;
+ my $n_read = read PIPE, $log, $log_nbytes;
+ $n_read == $log_nbytes
+ or die "$ME:$.: unexpected EOF\n";
+
+ my @line = split "\n", $log;
+ my $author_line = shift @line;
+ defined $author_line
+ or die "$ME:$.: unexpected EOF\n";
+ $author_line =~ /^(\d+) (.*>)$/
+ or die "$ME:$.: Invalid line "
+ . "(expected date/author/email):\n$author_line\n";
+
+ my $date_line = sprintf "%s $2\n", strftime ("%F", localtime ($1));
+ # If this line would be the same as the previous date/name/email
+ # line, then arrange not to print it.
+ if ($date_line ne $prev_date_line)
+ {
+ $prev_date_line eq ''
+ or print "\n";
+ print $date_line;
+ }
+ $prev_date_line = $date_line;
+
+ # Omit "Signed-off-by..." lines.
+ @line = grep !/^Signed-off-by: .*>$/, @line;
+
+ # If there were any lines
+ if (@line == 0)
+ {
+ warn "$ME: warning: empty commit message:\n $date_line\n";
+ }
+ else
+ {
+ # Remove leading and trailing blank lines.
+ while ($line[0] =~ /^\s*$/) { shift @line; }
+ while ($line[$#line] =~ /^\s*$/) { pop @line; }
+
+ # Prefix each non-empty line with a TAB.
+ @line = map { length $_ ? "\t$_" : '' } @line;
+
+ print "\n", join ("\n", @line), "\n";
+ }
+
+ defined ($in = <PIPE>)
+ or last;
+ $in ne "\n"
+ and die "$ME:$.: unexpected line:\n$in";
+ }
+
+ close PIPE
+ or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
+ # FIXME-someday: include $PROCESS_STATUS in the diagnostic
+}
+
+# Local Variables:
+# mode: perl
+# indent-tabs-mode: nil
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "my $VERSION = '"
+# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "'; # UTC"
+# End:
diff --git a/gnulib/build-aux/gnu-web-doc-update b/gnulib/build-aux/gnu-web-doc-update
new file mode 100755
index 00000000..2c1a0cc6
--- /dev/null
+++ b/gnulib/build-aux/gnu-web-doc-update
@@ -0,0 +1,115 @@
+#!/bin/sh
+# Run this after each non-alpha release, to update the web documentation at
+# http://www.gnu.org/software/$pkg/manual/
+# This script must be run from the top-level directory,
+# assumes you're using git for revision control,
+# and requires a .prev-version file as well as a Makefile,
+# from which it extracts the version number and package name, respectively.
+# Also, it assumes all documentation is in the doc/ sub-directory.
+
+VERSION=2009-07-21.16; # UTC
+
+# Copyright (C) 2009, 2010 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/>.
+
+# Requirements: everything required to bootstrap your package,
+# plus these: git, cvs, cvsu, rsync, mktemp
+
+ME=`basename "$0"`
+warn() { printf '%s: %s\n' "$ME" "$*" >&2; }
+die() { warn "$*"; exit 1; }
+
+help_version()
+{
+ case $1 in
+ --help) cat <<EOF
+Usage: $ME
+
+Run this script (no options or arguments) after each non-alpha release,
+to update the web documentation at http://www.gnu.org/software/\$pkg/manual/
+Run it from your project's the top-level directory.
+
+Options:
+ --help print this help, then exit
+ --version print version number, then exit
+
+Report bugs and patches to <bug-gnulib@gnu.org>.
+EOF
+ exit ;;
+
+ --version)
+ year=`echo "$VERSION" | sed 's/[^0-9].*//'`
+ cat <<EOF
+$ME $VERSION
+Copyright (C) $year Free Software Foundation, Inc,
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+EOF
+ exit ;;
+
+ *) die "unrecognized option: $1";;
+ esac
+}
+
+case $# in
+ 0) ;;
+ 1) help_version $1 ;;
+ *) die "$ME: too many options" ;;
+esac
+
+prev=.prev-version
+version=$(cat $prev) || die "$ME: no $prev file?"
+pkg=$(sed -n 's/^PACKAGE = \(.*\)/\1/p' Makefile) || die "$ME: no Makefile?"
+tmp_branch=web-doc-$version-$$
+
+cleanup()
+{
+ __st=$?;
+ rm -rf "$tmp"
+ git checkout master
+ git branch -d $tmp_branch
+ exit $__st
+}
+trap cleanup 0
+trap 'exit $?' 1 2 13 15
+
+# We must build using sources for which --version reports the
+# just-released version number, not some string like 7.6.18-20761.
+# That version string propagates into all documentation.
+git checkout -b $tmp_branch v$version
+./bootstrap && ./configure && make && make web-manual
+
+tmp=$(mktemp -d --tmpdir=. web-doc-update.XXXXXX) || exit 1
+( cd $tmp \
+ && cvs -d $USER@cvs.sv.gnu.org:/webcvs/$pkg co $pkg )
+rsync -avP doc/manual/ $tmp/$pkg/manual
+
+(
+ cd $tmp/$pkg/manual
+
+ # Add any new files:
+ cvsu --types='?'|sed s/..// | xargs --no-run-if-empty -- cvs add -ko
+
+ cvs ci -m $version
+)
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "VERSION="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/gnupload b/gnulib/build-aux/gnupload
new file mode 100755
index 00000000..d4450753
--- /dev/null
+++ b/gnulib/build-aux/gnupload
@@ -0,0 +1,413 @@
+#!/bin/sh
+# Sign files and upload them.
+
+scriptversion=2010-02-08.07; # UTC
+
+# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 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 2, 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/>.
+
+# Originally written by Alexandre Duret-Lutz <adl@gnu.org>.
+
+set -e
+
+GPG='gpg --batch --no-tty'
+conffile=.gnuploadrc
+to=
+dry_run=false
+symlink_files=
+delete_files=
+delete_symlinks=
+collect_var=
+dbg=
+
+usage="Usage: $0 [OPTION]... [CMD] FILE... [[CMD] FILE...]
+
+Sign all FILES, and process them at selected destinations according to CMD.
+<http://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html>
+explains further.
+
+Commands:
+ --delete delete FILES from destination
+ --symlink create symbolic links
+ --rmsymlink remove symbolic links
+ -- treat the remaining arguments as files to upload
+
+Options:
+ --help print this help text and exit
+ --to DEST specify one destination for FILES
+ (multiple --to options are allowed)
+ --user NAME sign with key NAME
+ --symlink-regex[=EXPR] use sed script EXPR to compute symbolic link names
+ --dry-run do nothing, show what would have been done
+ --version output version information and exit
+
+If --symlink-regex is given without EXPR, then the link target name
+is created by replacing the version information with \`-latest', e.g.:
+
+ foo-1.3.4.tar.gz -> foo-latest.tar.gz
+
+Recognized destinations are:
+ alpha.gnu.org:DIRECTORY
+ savannah.gnu.org:DIRECTORY
+ savannah.nongnu.org:DIRECTORY
+ ftp.gnu.org:DIRECTORY
+ build directive files and upload files by FTP
+ download.gnu.org.ua:{alpha|ftp}/DIRECTORY
+ build directive files and upload files by SFTP
+ [user@]host:DIRECTORY upload files with scp
+
+Options and commands are applied in order. If the file $conffile exists
+in the current working directory, its contents are prepended to the
+actual command line options. Use this to keep your defaults. Comments
+(#) and empty lines in $conffile are allowed.
+
+Examples:
+1. Upload foobar-1.0.tar.gz to ftp.gnu.org:
+ gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz
+
+2. Upload foobar-1.0.tar.gz and foobar-1.0.tar.xz to ftp.gnu.org:
+ gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz foobar-1.0.tar.xz
+
+3. Same as above, and also create symbolic links to foobar-latest.tar.*:
+ gnupload --to ftp.gnu.org:foobar \\
+ --symlink-regex \\
+ foobar-1.0.tar.gz foobar-1.0.tar.xz
+
+4. Upload foobar-0.9.90.tar.gz to two sites:
+ gnupload --to alpha.gnu.org:foobar \\
+ --to sources.redhat.com:~ftp/pub/foobar \\
+ foobar-0.9.90.tar.gz
+
+5. Delete oopsbar-0.9.91.tar.gz and upload foobar-0.9.91.tar.gz
+ (the -- terminates the list of files to delete):
+ gnupload --to alpha.gnu.org:foobar \\
+ --to sources.redhat.com:~ftp/pub/foobar \\
+ --delete oopsbar-0.9.91.tar.gz \\
+ -- foobar-0.9.91.tar.gz
+
+gnupload uses the ncftpput program to do the transfers; if you don't
+happen to have an ncftp package installed, the ncftpput-ftp script in
+the build-aux/ directory of the gnulib package
+(http://savannah.gnu.org/projects/gnulib) may serve as a replacement.
+
+Report bugs to <bug-automake@gnu.org>.
+Send patches to <automake-patches@gnu.org>."
+
+# Read local configuration file
+if test -r "$conffile"; then
+ echo "$0: Reading configuration file $conffile"
+ eval set x "`sed 's/#.*$//;/^$/d' \"$conffile\" | tr '\012\015' ' '` \"\$@\""
+ shift
+fi
+
+while test -n "$1"; do
+ case $1 in
+ -*)
+ collect_var=
+ case $1 in
+ --help)
+ echo "$usage"
+ exit $?
+ ;;
+ --to)
+ if test -z "$2"; then
+ echo "$0: Missing argument for --to" 1>&2
+ exit 1
+ else
+ to="$to $2"
+ shift
+ fi
+ ;;
+ --user)
+ if test -z "$2"; then
+ echo "$0: Missing argument for --user" 1>&2
+ exit 1
+ else
+ GPG="$GPG --local-user $2"
+ shift
+ fi
+ ;;
+ --delete)
+ collect_var=delete_files
+ ;;
+ --rmsymlink)
+ collect_var=delete_symlinks
+ ;;
+ --symlink-regex=*)
+ symlink_expr=`expr "$1" : '[^=]*=\(.*\)'`
+ ;;
+ --symlink-regex)
+ symlink_expr='s|-[0-9][0-9\.]*\(-[0-9][0-9]*\)\{0,1\}\.|-latest.|'
+ ;;
+ --symlink)
+ collect_var=symlink_files
+ ;;
+ --dry-run|-n)
+ dry_run=:
+ ;;
+ --version)
+ echo "gnupload $scriptversion"
+ exit $?
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*)
+ echo "$0: Unknown option \`$1', try \`$0 --help'" 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+ *)
+ if test -z "$collect_var"; then
+ break
+ else
+ eval "$collect_var=\"\$$collect_var $1\""
+ fi
+ ;;
+ esac
+ shift
+done
+
+dprint()
+{
+ echo "Running $*..."
+}
+
+if $dry_run; then
+ dbg=dprint
+fi
+
+if test -z "$to"; then
+ echo "$0: Missing destination sites" >&2
+ exit 1
+fi
+
+if test -n "$symlink_files"; then
+ x=`echo "$symlink_files" | sed 's/[^ ]//g;s/ //g'`
+ if test -n "$x"; then
+ echo "$0: Odd number of symlink arguments" >&2
+ exit 1
+ fi
+fi
+
+if test $# = 0; then
+ if test -z "${symlink_files}${delete_files}${delete_symlinks}"; then
+ echo "$0: No file to upload" 1>&2
+ exit 1
+ fi
+else
+ # Make sure all files exist. We don't want to ask
+ # for the passphrase if the script will fail.
+ for file
+ do
+ if test ! -f $file; then
+ echo "$0: Cannot find \`$file'" 1>&2
+ exit 1
+ elif test -n "$symlink_expr"; then
+ linkname=`echo $file | sed "$symlink_expr"`
+ if test -z "$linkname"; then
+ echo "$0: symlink expression produces empty results" >&2
+ exit 1
+ elif test "$linkname" = $file; then
+ echo "$0: symlink expression does not alter file name" >&2
+ exit 1
+ fi
+ fi
+ done
+fi
+
+# Make sure passphrase is not exported in the environment.
+unset passphrase
+
+# Reset PATH to be sure that echo is a built-in. We will later use
+# `echo $passphrase' to output the passphrase, so it is important that
+# it is a built-in (third-party programs tend to appear in `ps'
+# listings with their arguments...).
+# Remember this script runs with `set -e', so if echo is not built-in
+# it will exit now.
+PATH=/empty echo -n "Enter GPG passphrase: "
+stty -echo
+read -r passphrase
+stty echo
+echo
+
+if test $# -ne 0; then
+ for file
+ do
+ echo "Signing $file..."
+ rm -f $file.sig
+ echo "$passphrase" | $dbg $GPG --passphrase-fd 0 -ba -o $file.sig $file
+ done
+fi
+
+
+# mkdirective DESTDIR BASE FILE STMT
+# Arguments: See upload, below
+mkdirective ()
+{
+ stmt="$4"
+ if test -n "$3"; then
+ stmt="
+filename: $3$stmt"
+ fi
+
+ cat >${2}.directive<<EOF
+version: 1.1
+directory: $1
+comment: gnupload v. $scriptversion$stmt
+EOF
+ if $dry_run; then
+ echo "File ${2}.directive:"
+ cat ${2}.directive
+ echo "File ${2}.directive:" | sed 's/./-/g'
+ fi
+}
+
+mksymlink ()
+{
+ while test $# -ne 0
+ do
+ echo "symlink: $1 $2"
+ shift
+ shift
+ done
+}
+
+# upload DEST DESTDIR BASE FILE STMT FILES
+# Arguments:
+# DEST Destination site;
+# DESTDIR Destination directory;
+# BASE Base name for the directive file;
+# FILE Name of the file to distribute (may be empty);
+# STMT Additional statements for the directive file;
+# FILES List of files to upload.
+upload ()
+{
+ dest=$1
+ destdir=$2
+ base=$3
+ file=$4
+ stmt=$5
+ files=$6
+
+ rm -f $base.directive $base.directive.asc
+ case $dest in
+ alpha.gnu.org:*)
+ mkdirective "$destdir" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG --passphrase-fd 0 --clearsign $base.directive
+ $dbg ncftpput ftp-upload.gnu.org /incoming/alpha $files $base.directive.asc
+ ;;
+ ftp.gnu.org:*)
+ mkdirective "$destdir" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG --passphrase-fd 0 --clearsign $base.directive
+ $dbg ncftpput ftp-upload.gnu.org /incoming/ftp $files $base.directive.asc
+ ;;
+ savannah.gnu.org:*)
+ if test -z "$files"; then
+ echo "$0: warning: standalone directives not applicable for $dest" >&2
+ fi
+ $dbg ncftpput savannah.gnu.org /incoming/savannah/$destdir $files
+ ;;
+ savannah.nongnu.org:*)
+ if test -z "$files"; then
+ echo "$0: warning: standalone directives not applicable for $dest" >&2
+ fi
+ $dbg ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files
+ ;;
+ download.gnu.org.ua:alpha/*|download.gnu.org.ua:ftp/*)
+ destdir_p1=`echo "$destdir" | sed 's,^[^/]*/,,'`
+ destdir_topdir=`echo "$destdir" | sed 's,/.*,,'`
+ mkdirective "$destdir_p1" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG --passphrase-fd 0 --clearsign $base.directive
+ for f in $files $base.directive.asc
+ do
+ echo put $f
+ done | $dbg sftp -b - puszcza.gnu.org.ua:/incoming/$destdir_topdir
+ ;;
+ /*)
+ dest_host=`echo "$dest" | sed 's,:.*,,'`
+ mkdirective "$destdir" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG --passphrase-fd 0 --clearsign $base.directive
+ $dbg cp $files $base.directive.asc $dest_host
+ ;;
+ *)
+ if test -z "$files"; then
+ echo "$0: warning: standalone directives not applicable for $dest" >&2
+ fi
+ $dbg scp $files $dest
+ ;;
+ esac
+ rm -f $base.directive $base.directive.asc
+}
+
+#####
+# Process any standalone directives
+stmt=
+if test -n "$symlink_files"; then
+ stmt="$stmt
+`mksymlink $symlink_files`"
+fi
+
+for file in $delete_files
+do
+ stmt="$stmt
+archive: $file"
+done
+
+for file in $delete_symlinks
+do
+ stmt="$stmt
+rmsymlink: $file"
+done
+
+if test -n "$stmt"; then
+ for dest in $to
+ do
+ destdir=`echo $dest | sed 's/[^:]*://'`
+ upload "$dest" "$destdir" "`hostname`-$$" "" "$stmt"
+ done
+fi
+
+# Process actual uploads
+for dest in $to
+do
+ for file
+ do
+ echo "Uploading $file to $dest..."
+ stmt=
+ files="$file $file.sig"
+ destdir=`echo $dest | sed 's/[^:]*://'`
+ if test -n "$symlink_expr"; then
+ linkname=`echo $file | sed "$symlink_expr"`
+ stmt="$stmt
+symlink: $file $linkname
+symlink: $file.sig $linkname.sig"
+ fi
+ upload "$dest" "$destdir" "$file" "$file" "$stmt" "$files"
+ done
+done
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/install-reloc b/gnulib/build-aux/install-reloc
new file mode 100755
index 00000000..b5223a90
--- /dev/null
+++ b/gnulib/build-aux/install-reloc
@@ -0,0 +1,196 @@
+#!/bin/sh
+# install-reloc - install a program including a relocating wrapper
+# Copyright (C) 2003, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+# Written by Bruno Haible <bruno@clisp.org>, 2003.
+#
+# 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/>.
+
+# Usage:
+# install-reloc library_path_var library_path_value prefix destdir \
+# compile_command srcdir builddir config_h_dir exeext \
+# strip_command \
+# install_command... destprog
+# where
+# - library_path_var is the platform dependent runtime library path variable
+# - library_path_value is a colon separated list of directories that contain
+# the libraries at installation time (use this instead of -rpath)
+# - prefix is the base directory at installation time
+# - destdir is a string that is prepended to all file names at installation
+# time; it is already prepended to destprog but not to library_path_value
+# and prefix
+# - compile_command is a C compiler compilation and linking command
+# - srcdir is the directory where to find relocwrapper.c and its dependencies
+# - builddir is the directory where to find built dependencies (namely,
+# alloca.h and stdbool.h)
+# - config_h_dir is the directory where to find config.h
+# - exeext is platform dependent suffix of executables
+# - strip_command is the command for stripping executables, or : if no
+# stripping is desired
+# - install_command is the install command line, excluding the final destprog
+# - destprog is the destination program name
+# install-reloc renames destprog to destprog.bin and installs a relocating
+# wrapper in the place of destprog.
+
+progname=$0
+
+if test $# -eq 2; then
+ # Get arguments from environment variables.
+ library_path_var=$RELOC_LIBRARY_PATH_VAR
+ library_path_value=$RELOC_LIBRARY_PATH_VALUE
+ prefix=$RELOC_PREFIX
+ destdir=$RELOC_DESTDIR
+ compile_command=$RELOC_COMPILE_COMMAND
+ srcdir=$RELOC_SRCDIR
+ builddir=$RELOC_BUILDDIR
+ config_h_dir=$RELOC_CONFIG_H_DIR
+ exeext=$RELOC_EXEEXT
+ strip_prog=$RELOC_STRIP_PROG
+ install_prog=$RELOC_INSTALL_PROG # including the "-c" option
+else
+ if test $# -ge 11; then
+ # Get fixed position arguments.
+ library_path_var=$1
+ library_path_value=$2
+ prefix=$3
+ destdir=$4
+ shift
+ shift
+ shift
+ shift
+ compile_command=$1
+ srcdir=$2
+ builddir=$3
+ config_h_dir=$4
+ exeext=$5
+ shift
+ shift
+ shift
+ shift
+ shift
+ strip_prog=$1
+ shift
+ install_prog=$1 # maybe not including the "-c" option
+ shift
+ else
+ echo "Usage: $0 library_path_var library_path_value prefix destdir" \
+ "compile_command srcdir builddir config_h_dir exeext" \
+ "strip_command" \
+ "install_command... destprog" 1>&2
+ exit 1
+ fi
+fi
+
+# Get destprog, last argument.
+destprog=
+for arg
+do
+ destprog=$arg
+done
+# Remove trailing $exeext, if present.
+if test -n "$exeext"; then
+ sed_quote='s,\.,\\.,g'
+ sed_remove_exeext='s|'`echo "$exeext" | sed -e "$sed_quote"`'$||'
+ destprog=`echo "$destprog" | sed -e "$sed_remove_exeext"`
+fi
+
+# Outputs a command and runs it.
+func_verbose ()
+{
+ echo "$@"
+ "$@"
+}
+
+# Run install_command.
+func_verbose $install_prog "$@" || exit $?
+
+# Run strip_command.
+test "$strip_prog" = ':' || func_verbose "$strip_prog" "$destprog$exeext" || exit $?
+
+# If the platform doesn't support LD_LIBRARY_PATH or similar, we cannot build
+# a wrapper.
+test -n "$library_path_var" || exit 0
+
+libdirs=
+save_IFS="$IFS"; IFS=":"
+for dir in $library_path_value; do
+ IFS="$save_IFS"
+ if test -n "$dir"; then
+ case "$libdirs" in
+ *"\"$dir\""*) ;; # remove duplicate
+ *) libdirs="$libdirs\"$dir\"," ;;
+ esac
+ fi
+done
+IFS="$save_IFS"
+# If there are no library directories to add at runtime, we don't need a
+# wrapper.
+test -n "$libdirs" || exit 0
+
+# Determine installdir from destprog, removing a leading destdir if present.
+installdir=`echo "$destprog" | sed -e 's,/[^/]*$,,'`
+if test -n "$destdir"; then
+ sed_quote='s,\([|.\*^$[]\),\\\1,g'
+ sed_remove_destdir='s|^'`echo "$destdir" | sed -e "$sed_quote"`'||'
+ installdir=`echo "$installdir" | sed -e "$sed_remove_destdir"`
+fi
+
+# Compile wrapper.
+func_verbose $compile_command \
+ -I"$builddir" -I"$srcdir" -I"$config_h_dir" \
+ -DHAVE_CONFIG_H -DIN_RELOCWRAPPER -DNO_XMALLOC \
+ -D"INSTALLPREFIX=\"$prefix\"" -D"INSTALLDIR=\"$installdir\"" \
+ -D"LIBPATHVAR=\"$library_path_var\"" -D"LIBDIRS=$libdirs" \
+ -D"EXEEXT=\"$exeext\"" \
+ "$srcdir"/relocwrapper.c \
+ "$srcdir"/progname.c \
+ "$srcdir"/progreloc.c \
+ "$srcdir"/areadlink.c \
+ "$srcdir"/readlink.c \
+ "$srcdir"/canonicalize-lgpl.c \
+ "$srcdir"/malloca.c \
+ "$srcdir"/relocatable.c \
+ "$srcdir"/setenv.c \
+ "$srcdir"/strerror.c \
+ "$srcdir"/c-ctype.c \
+ -o "$destprog.wrapper$exeext"
+rc=$?
+# Clean up object files left over in the current directory by the native C
+# compilers on Solaris, HP-UX, OSF/1, IRIX.
+rm -f relocwrapper.o \
+ progname.o \
+ progreloc.o \
+ xreadlink.o \
+ areadlink.o \
+ canonicalize-lgpl.o \
+ malloca.o \
+ relocatable.o \
+ setenv.o \
+ strerror.o \
+ c-ctype.o
+test $rc = 0 || exit $?
+# Clean up debugging information left over by the native C compiler on MacOS X.
+rm -rf "$destprog.wrapper$exeext.dSYM"
+test $rc = 0 || exit $?
+
+# Strip wrapper.
+test "$strip_prog" = ':' || func_verbose "$strip_prog" "$destprog.wrapper$exeext" || exit $?
+
+# Rename $destprog.wrapper -> $destprog -> $destprog.bin.
+ln -f "$destprog$exeext" "$destprog.bin$exeext" \
+ || { rm -f "$destprog.bin$exeext" \
+ && cp -p "$destprog$exeext" "$destprog.bin$exeext"; } \
+ || exit 1
+mv "$destprog.wrapper$exeext" "$destprog$exeext" || exit 1
+
+exit 0
diff --git a/gnulib/build-aux/install-sh b/gnulib/build-aux/install-sh
new file mode 100755
index 00000000..3f83ce9b
--- /dev/null
+++ b/gnulib/build-aux/install-sh
@@ -0,0 +1,524 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2010-02-06.18; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" "" $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+ doit_exec=exec
+else
+ doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+ test "$posix_glob" != "?" || {
+ if (set -f) 2>/dev/null; then
+ posix_glob=
+ else
+ posix_glob=:
+ fi
+ }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *' '* | *'
+'* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -s) stripcmd=$stripprog;;
+
+ -t) dst_arg=$2
+ shift;;
+
+ -T) no_target_directory=true;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dst_arg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ # Prefer dirname, but fall back on a substitute if dirname fails.
+ dstdir=`
+ (dirname "$dst") 2>/dev/null ||
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$dst" : 'X\(//\)[^/]' \| \
+ X"$dst" : 'X\(//\)$' \| \
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+ echo X"$dst" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'
+ `
+
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writeable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ -*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ eval "$initialize_posix_glob"
+
+ oIFS=$IFS
+ IFS=/
+ $posix_glob set -f
+ set fnord $dstdir
+ shift
+ $posix_glob set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test -z "$d" && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+ eval "$initialize_posix_glob" &&
+ $posix_glob set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ $posix_glob set +f &&
+
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/javacomp.sh.in b/gnulib/build-aux/javacomp.sh.in
new file mode 100644
index 00000000..303a2715
--- /dev/null
+++ b/gnulib/build-aux/javacomp.sh.in
@@ -0,0 +1,75 @@
+#!/bin/sh
+# Compile a Java program.
+
+# Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+# Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+#
+# 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/>.
+
+# This uses the same choices as javacomp.c, but instead of relying on the
+# environment settings at run time, it uses the environment variables
+# present at configuration time.
+#
+# This is a separate shell script, because it must be able to unset JAVA_HOME
+# in some cases, which a simple shell command cannot do.
+#
+# The extra CLASSPATH must have been set prior to calling this script.
+# Options that can be passed are -O, -g and "-d DIRECTORY".
+
+CONF_JAVAC='@CONF_JAVAC@'
+CONF_CLASSPATH='@CLASSPATH@'
+if test -n "@HAVE_JAVAC_ENVVAR@"; then
+ # Combine given CLASSPATH and configured CLASSPATH.
+ if test -n "$CLASSPATH"; then
+ CLASSPATH="$CLASSPATH${CONF_CLASSPATH:+@CLASSPATH_SEPARATOR@$CONF_CLASSPATH}"
+ else
+ CLASSPATH="$CONF_CLASSPATH"
+ fi
+ export CLASSPATH
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVAC $@"
+ exec $CONF_JAVAC "$@"
+else
+ unset JAVA_HOME
+ if test -n "@HAVE_GCJ_C@"; then
+ # In this case, $CONF_JAVAC starts with "gcj -C".
+ CLASSPATH="$CLASSPATH"
+ export CLASSPATH
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVAC $@"
+ exec $CONF_JAVAC "$@"
+ else
+ if test -n "@HAVE_JAVAC@"; then
+ # In this case, $CONF_JAVAC starts with "javac".
+ CLASSPATH="$CLASSPATH"
+ export CLASSPATH
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVAC $@"
+ exec $CONF_JAVAC "$@"
+ else
+ if test -n "@HAVE_JIKES@"; then
+ # In this case, $CONF_JAVAC starts with "jikes".
+ # Combine given CLASSPATH and configured CLASSPATH.
+ if test -n "$CLASSPATH"; then
+ CLASSPATH="$CLASSPATH${CONF_CLASSPATH:+@CLASSPATH_SEPARATOR@$CONF_CLASSPATH}"
+ else
+ CLASSPATH="$CONF_CLASSPATH"
+ fi
+ export CLASSPATH
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVAC $@"
+ exec $CONF_JAVAC "$@"
+ else
+ echo 'Java compiler not found, try installing gcj or set $JAVAC, then reconfigure' 1>&2
+ exit 1
+ fi
+ fi
+ fi
+fi
diff --git a/gnulib/build-aux/javaexec.sh.in b/gnulib/build-aux/javaexec.sh.in
new file mode 100644
index 00000000..87c4a424
--- /dev/null
+++ b/gnulib/build-aux/javaexec.sh.in
@@ -0,0 +1,70 @@
+#!/bin/sh
+# Execute a Java program.
+
+# Copyright (C) 2001, 2006, 2009, 2010 Free Software Foundation, Inc.
+# Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+#
+# 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/>.
+
+# This uses the same choices as javaexec.c, but instead of relying on the
+# environment settings at run time, it uses the environment variables
+# present at configuration time.
+#
+# This is a separate shell script, because it must be able to unset JAVA_HOME
+# in some cases, which a simple shell command cannot do.
+#
+# The extra CLASSPATH must have been set prior to calling this script.
+
+CONF_JAVA='@CONF_JAVA@'
+CONF_CLASSPATH='@CLASSPATH@'
+if test -n "@HAVE_JAVA_ENVVAR@"; then
+ # Combine given CLASSPATH and configured CLASSPATH.
+ if test -n "$CLASSPATH"; then
+ CLASSPATH="$CLASSPATH${CONF_CLASSPATH:+@CLASSPATH_SEPARATOR@$CONF_CLASSPATH}"
+ else
+ CLASSPATH="$CONF_CLASSPATH"
+ fi
+ export CLASSPATH
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVA $@"
+ exec $CONF_JAVA "$@"
+else
+ unset JAVA_HOME
+ export CLASSPATH
+ if test -n "@HAVE_GIJ@"; then
+ # In this case, $CONF_JAVA is "gij".
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVA $@"
+ exec $CONF_JAVA "$@"
+ else
+ if test -n "@HAVE_JAVA@"; then
+ # In this case, $CONF_JAVA is "java".
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVA $@"
+ exec $CONF_JAVA "$@"
+ else
+ if test -n "@HAVE_JRE@"; then
+ # In this case, $CONF_JAVA is "jre".
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVA $@"
+ exec $CONF_JAVA "$@"
+ else
+ if test -n "@HAVE_JVIEW@"; then
+ # In this case, $CONF_JAVA is "jview".
+ test -z "$JAVA_VERBOSE" || echo "$CONF_JAVA $@"
+ exec $CONF_JAVA "$@"
+ else
+ echo 'Java virtual machine not found, try installing gij or set $JAVA, then reconfigure' 1>&2
+ exit 1
+ fi
+ fi
+ fi
+ fi
+fi
diff --git a/gnulib/build-aux/ldd.sh.in b/gnulib/build-aux/ldd.sh.in
new file mode 100644
index 00000000..e0e31f76
--- /dev/null
+++ b/gnulib/build-aux/ldd.sh.in
@@ -0,0 +1,22 @@
+#!/bin/sh
+# Determine the dynamically linked dependencies of a program.
+
+# Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+# Written by Bruno Haible <bruno@clisp.org>, 2006.
+#
+# 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/>.
+
+# Usage: ldd.sh program
+
+@LDDPROG@ "$1" @LDDPOSTPROC@
diff --git a/gnulib/build-aux/link-warning.h b/gnulib/build-aux/link-warning.h
new file mode 100644
index 00000000..4c1e32d5
--- /dev/null
+++ b/gnulib/build-aux/link-warning.h
@@ -0,0 +1,45 @@
+/* A C macro for emitting link time warnings.
+ Copyright (C) 1995, 1997, 2000, 2002-2003, 2007, 2009-2010 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* GL_LINK_WARNING("literal string") arranges to emit the literal string as
+ a linker warning on most glibc systems.
+ We use a linker warning rather than a preprocessor warning, because
+ #warning cannot be used inside macros. */
+#ifndef GL_LINK_WARNING
+ /* This works on platforms with GNU ld and ELF object format.
+ Testing __GLIBC__ is sufficient for asserting that GNU ld is in use.
+ Testing __ELF__ guarantees the ELF object format.
+ Testing __GNUC__ is necessary for the compound expression syntax. */
+# if defined __GLIBC__ && defined __ELF__ && defined __GNUC__
+# define GL_LINK_WARNING(message) \
+ GL_LINK_WARNING1 (__FILE__, __LINE__, message)
+# define GL_LINK_WARNING1(file, line, message) \
+ GL_LINK_WARNING2 (file, line, message) /* macroexpand file and line */
+# define GL_LINK_WARNING2(file, line, message) \
+ GL_LINK_WARNING3 (file ":" #line ": warning: " message)
+# define GL_LINK_WARNING3(message) \
+ ({ static const char warning[sizeof (message)] \
+ __attribute__ ((__unused__, \
+ __section__ (".gnu.warning"), \
+ __aligned__ (1))) \
+ = message "\n"; \
+ (void)0; \
+ })
+# else
+# define GL_LINK_WARNING(message) ((void) 0)
+# endif
+#endif
diff --git a/gnulib/build-aux/mdate-sh b/gnulib/build-aux/mdate-sh
new file mode 100755
index 00000000..c477512f
--- /dev/null
+++ b/gnulib/build-aux/mdate-sh
@@ -0,0 +1,206 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+
+scriptversion=2010-02-22.21; # UTC
+
+# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009, 2010
+# Free Software Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# 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 2, 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/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+ '')
+ echo "$0: No file. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: mdate-sh [--help] [--version] FILE
+
+Pretty-print the modification day of FILE, in the format:
+1 January 1970
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "mdate-sh $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+# GNU ls changes its time format in response to the TIME_STYLE
+# variable. Since we cannot assume `unset' works, revert this
+# variable to its documented default.
+if test "${TIME_STYLE+set}" = set; then
+ TIME_STYLE=posix-long-iso
+ export TIME_STYLE
+fi
+
+save_arg1=$1
+
+# Find out how to get the extended ls output of a file or directory.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+ ls_command='ls -L -l -d'
+else
+ ls_command='ls -l -d'
+fi
+# Avoid user/group names that might have spaces, when possible.
+if ls -n /dev/null 1>/dev/null 2>&1; then
+ ls_command="$ls_command -n"
+fi
+
+# A `ls -l' line looks as follows on OS/2.
+# drwxrwx--- 0 Aug 11 2001 foo
+# This differs from Unix, which adds ownership information.
+# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
+#
+# To find the date, we split the line on spaces and iterate on words
+# until we find a month. This cannot work with files whose owner is a
+# user named `Jan', or `Feb', etc. However, it's unlikely that `/'
+# will be owned by a user whose name is a month. So we first look at
+# the extended ls output of the root directory to decide how many
+# words should be skipped to get the date.
+
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+set x`$ls_command /`
+
+# Find which argument is the month.
+month=
+command=
+until test $month
+do
+ shift
+ # Add another shift to the command.
+ command="$command shift;"
+ case $1 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+ esac
+done
+
+# Get the extended ls output of the file or directory.
+set dummy x`eval "$ls_command \"\$save_arg1\""`
+
+# Remove all preceding arguments
+eval $command
+
+# Because of the dummy argument above, month is in $2.
+#
+# On a POSIX system, we should have
+#
+# $# = 5
+# $1 = file size
+# $2 = month
+# $3 = day
+# $4 = year or time
+# $5 = filename
+#
+# On Darwin 7.7.0 and 7.6.0, we have
+#
+# $# = 4
+# $1 = day
+# $2 = month
+# $3 = year or time
+# $4 = filename
+
+# Get the month.
+case $2 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+esac
+
+case $3 in
+ ???*) day=$1;;
+ *) day=$3; shift;;
+esac
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+ *:*) set `date`; eval year=\$$#
+ case $2 in
+ Jan) nummonthtod=1;;
+ Feb) nummonthtod=2;;
+ Mar) nummonthtod=3;;
+ Apr) nummonthtod=4;;
+ May) nummonthtod=5;;
+ Jun) nummonthtod=6;;
+ Jul) nummonthtod=7;;
+ Aug) nummonthtod=8;;
+ Sep) nummonthtod=9;;
+ Oct) nummonthtod=10;;
+ Nov) nummonthtod=11;;
+ Dec) nummonthtod=12;;
+ esac
+ # For the first six month of the year the time notation can also
+ # be used for files modified in the last year.
+ if (expr $nummonth \> $nummonthtod) > /dev/null;
+ then
+ year=`expr $year - 1`
+ fi;;
+ *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/missing b/gnulib/build-aux/missing
new file mode 100755
index 00000000..28055d2a
--- /dev/null
+++ b/gnulib/build-aux/missing
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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 2, 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/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ autom4te touch the output file, or create a stub one
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program). This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+ lex*|yacc*)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar*)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case $f in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te*)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison*|yacc*)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if test $# -ne 1; then
+ eval LASTARG="\${$#}"
+ case $LASTARG in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if test ! -f y.tab.h; then
+ echo >y.tab.h
+ fi
+ if test ! -f y.tab.c; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex*|flex*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if test $# -ne 1; then
+ eval LASTARG="\${$#}"
+ case $LASTARG in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if test ! -f lex.yy.c; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit $?
+ fi
+ ;;
+
+ makeinfo*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '
+ /^@setfilename/{
+ s/.* \([^ ]*\) *$/\1/
+ p
+ q
+ }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
+ touch $file
+ ;;
+
+ tar*)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case $firstarg in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case $firstarg in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/mkinstalldirs b/gnulib/build-aux/mkinstalldirs
new file mode 100755
index 00000000..4191a45d
--- /dev/null
+++ b/gnulib/build-aux/mkinstalldirs
@@ -0,0 +1,162 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2009-04-28.21; # UTC
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+IFS=" "" $nl"
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage"
+ exit $?
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --version)
+ echo "$0 $scriptversion"
+ exit $?
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error. This is a problem when calling mkinstalldirs
+# from a parallel make. We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+ '')
+ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ test -d ./-p && rmdir ./-p
+ test -d ./--version && rmdir ./--version
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+ test ! -d ./--version; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ else
+ # Clean up after NextStep and OpenStep mkdir.
+ for d in ./-m ./-p ./--version "./$dirmode";
+ do
+ test -d $d && rmdir $d
+ done
+ fi
+ ;;
+esac
+
+for file
+do
+ case $file in
+ /*) pathcomp=/ ;;
+ *) pathcomp= ;;
+ esac
+ oIFS=$IFS
+ IFS=/
+ set fnord $file
+ shift
+ IFS=$oIFS
+
+ for d
+ do
+ test "x$d" = x && continue
+
+ pathcomp=$pathcomp$d
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp=$pathcomp/
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/mktempd b/gnulib/build-aux/mktempd
new file mode 100755
index 00000000..bb3de302
--- /dev/null
+++ b/gnulib/build-aux/mktempd
@@ -0,0 +1,134 @@
+#!/bin/sh
+# Create a temporary directory, much like mktemp -d does.
+
+# Copyright (C) 2007-2010 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/>.
+
+# Written by Jim Meyering.
+
+# Usage: mktempd /tmp phoey.XXXXXXXXXX
+
+# First, try to use the mktemp program.
+# Failing that, we'll roll our own mktemp-like function:
+# - try to get random bytes from /dev/urandom
+# - failing that, generate output from a combination of quickly-varying
+# sources and gzip. Ignore non-varying gzip header, and extract
+# "random" bits from there.
+# - given those bits, map to file-name bytes using tr, and try to create
+# the desired directory.
+# - make only $MAX_TRIES attempts
+
+ME=`basename "$0"`
+die() { echo >&2 "$ME: $@"; exit 1; }
+
+MAX_TRIES=4
+
+rand_bytes()
+{
+ n=$1
+
+ chars=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
+
+ dev_rand=/dev/urandom
+ if test -r "$dev_rand"; then
+ # Note: 256-length($chars) == 194; 3 copies of $chars is 186 + 8 = 194.
+ dd ibs=$n count=1 if="$dev_rand" | tr -c $chars 01234567$chars$chars$chars
+ return
+ fi
+
+ cmds='date; date +%N; free; who -a; w; ps auxww; ps ef; netstat -n'
+ data=` (eval "$cmds") 2>&1 | gzip `
+
+ n_plus_50=`expr $n + 50`
+
+ # Ensure that $data has length at least 50+$n
+ while :; do
+ len=`echo "$data"|wc -c`
+ test $n_plus_50 -le $len && break;
+ data=` (echo "$data"; eval "$cmds") 2>&1 | gzip `
+ done
+
+ echo "$data" \
+ | dd bs=1 skip=50 count=$n 2>/dev/null \
+ | tr -c $chars 01234567$chars$chars$chars
+}
+
+mktempd()
+{
+ case $# in
+ 2);;
+ *) die "Usage: $ME DIR TEMPLATE";;
+ esac
+
+ destdir=$1
+ template=$2
+
+ # Disallow any trailing slash on specified destdir:
+ # it would subvert the post-mktemp "case"-based destdir test.
+ case $destdir in
+ /) ;;
+ */) die "invalid destination dir: remove trailing slash(es)";;
+ esac
+
+ case $template in
+ *XXXX) ;;
+ *) die "invalid template: $template (must have a suffix of at least 4 X's)";;
+ esac
+
+ fail=0
+
+ # First, try to use mktemp.
+ d=`env -u TMPDIR mktemp -d -t -p "$destdir" "$template" 2>/dev/null` \
+ || fail=1
+
+ # The resulting name must be in the specified directory.
+ case $d in "$destdir"*);; *) fail=1;; esac
+
+ # It must have created the directory.
+ test -d "$d" || fail=1
+
+ # It must have 0700 permissions. Handle sticky "S" bits.
+ perms=`ls -dgo "$d" 2>/dev/null|tr S -` || fail=1
+ case $perms in drwx------*) ;; *) fail=1;; esac
+
+ test $fail = 0 && {
+ echo "$d"
+ return
+ }
+
+ # If we reach this point, we'll have to create a directory manually.
+
+ # Get a copy of the template without its suffix of X's.
+ base_template=`echo "$template"|sed 's/XX*$//'`
+
+ # Calculate how many X's we've just removed.
+ template_length=`echo "$template" | wc -c`
+ nx=`echo "$base_template" | wc -c`
+ nx=`expr $template_length - $nx`
+
+ err=
+ i=1
+ while :; do
+ X=`rand_bytes $nx`
+ candidate_dir="$destdir/$base_template$X"
+ err=`mkdir -m 0700 "$candidate_dir" 2>&1` \
+ && { echo "$candidate_dir"; return; }
+ test $MAX_TRIES -le $i && break;
+ i=`expr $i + 1`
+ done
+ die "$err"
+}
+
+mktempd "$@"
diff --git a/gnulib/build-aux/move-if-change b/gnulib/build-aux/move-if-change
new file mode 100755
index 00000000..9215c897
--- /dev/null
+++ b/gnulib/build-aux/move-if-change
@@ -0,0 +1,77 @@
+#!/bin/sh
+# Like mv $1 $2, but if the files are the same, just delete $1.
+# Status is zero if successful, nonzero otherwise.
+
+VERSION='2007-09-28 23:10'; # UTC
+# The definition above must lie within the first 8 lines in order
+# for the Emacs time-stamp write hook (at end) to update it.
+# If you change this file with Emacs, please let the write hook
+# do its job. Otherwise, update this string manually.
+
+# Copyright (C) 2002-2007, 2009-2010 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/>.
+
+usage="usage: $0 SOURCE DEST"
+
+help="$usage
+ or: $0 OPTION
+If SOURCE is different than DEST, then move it to DEST; else remove SOURCE.
+
+ --help display this help and exit
+ --version output version information and exit
+
+Report bugs to <bug-gnulib@gnu.org>."
+
+version=`expr "$VERSION" : '\([^ ]*\)'`
+version="move-if-change (gnulib) $version
+Copyright (C) 2007 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law."
+
+
+for arg
+do
+ case $arg in
+ --help | --hel | --he | --h)
+ exec echo "$help" ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v)
+ exec echo "$version" ;;
+ --)
+ shift
+ break ;;
+ -*)
+ echo "$0: invalid option: $arg" >&2
+ exit 1 ;;
+ *)
+ break ;;
+ esac
+done
+
+test $# = 2 || { echo "$0: $usage" >&2; exit 1; }
+
+if test -r "$2" && cmp -s -- "$1" "$2"; then
+ rm -f -- "$1"
+else
+ mv -f -- "$1" "$2"
+fi
+
+## Local Variables:
+## eval: (add-hook 'write-file-hooks 'time-stamp)
+## time-stamp-start: "VERSION='"
+## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
+## time-stamp-time-zone: "UTC"
+## time-stamp-end: "'; # UTC"
+## End:
diff --git a/gnulib/build-aux/ncftpput-ftp b/gnulib/build-aux/ncftpput-ftp
new file mode 100755
index 00000000..263c9c32
--- /dev/null
+++ b/gnulib/build-aux/ncftpput-ftp
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# Copyright (C) 2008, 2009, 2010 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/>.
+#
+# Original author: Karl Berry.
+# Bug reports and correspondence to bug-gnulib@gnu.org.
+#
+# This is a minimal replacement for ncftpput using standard ftp.
+# It was written for use with the Automake gnupload script for machines
+# without ncftpput, e.g., rename it to ncftpput and put it in your PATH.
+#
+# The arguments are:
+# host dir file1 file2 ...
+
+host=$1; shift
+dir=$1; shift
+
+newline="
+"
+
+mputs=
+for f
+do
+ if test ! -s "$f"; then
+ echo "$0: $f not readable or empty, goodbye." >&2
+ exit 1
+ fi
+ target=`basename "$f"`
+ mputs="${mputs}put $f $target$newline"
+done
+
+if test "$dir" = .; then
+ dir=
+else
+ dir="cd $dir"
+fi
+
+ftp -i $host <<END_SESSION
+$dir
+bin
+verbose
+$mputs
+quit
+END_SESSION
diff --git a/gnulib/build-aux/pmccabe.css b/gnulib/build-aux/pmccabe.css
new file mode 100644
index 00000000..2d94c91c
--- /dev/null
+++ b/gnulib/build-aux/pmccabe.css
@@ -0,0 +1,227 @@
+body {
+
+ font-family: Helvetica, sans-serif;
+
+}
+
+.page_title {
+
+ font: 18pt Georgia, serif;
+/* font-size: 1.5em;
+ font-weight: bold; */
+ color: darkred;
+ border-bottom: 2px solid darkred;
+}
+
+.section_title {
+
+ font: 14pt Georgia, serif;
+ color: darkred;
+ border-bottom: 2px dashed darkred;
+}
+
+.report_timestamp {
+
+ color: darkred;
+ font-weight: bold;
+
+}
+
+.function_src {
+
+ text-align: left;
+ background: white;
+}
+
+.resume_table {
+
+}
+
+.resume_header_entry {
+
+ color: black;
+}
+
+.resume_number_entry {
+
+ color: darkred;
+ font-weight: bold;
+ text-align: right;
+}
+
+.ranges_table {
+
+ border-spacing: 0px;
+ border-bottom: solid 2px black;
+ border-top: solid 2px black;
+ border-left: solid 2px black;
+ border-right: solid 2px black;
+}
+
+.ranges_header_entry {
+
+ padding: 5px;
+ border-bottom: solid 1px black;
+ font-size: 1em;
+ font-weight: bold;
+ color: darkred;
+ text-align: left;
+}
+
+.ranges_entry {
+
+}
+
+.ranges_entry_simple {
+
+ background: #87ff75;
+
+}
+
+.ranges_entry_moderate {
+
+ background: #fffc60;
+
+}
+
+.ranges_entry_high {
+
+ background: #ff5a5d;
+
+}
+
+.ranges_entry_untestable {
+
+ background: #993300
+
+}
+
+
+.function_table {
+
+ border-spacing: 0px;
+ border-bottom: solid 2px black;
+ border-top: solid 2px black;
+ border-left: solid 2px black;
+ border-right: solid 2px black;
+}
+
+.function_table_caption {
+
+ font-size: 1.1em;
+ font-weight: bold;
+ color: black;
+ padding: 5px;
+}
+
+.function_table_header {
+
+}
+
+
+.function_table_header_entry {
+
+ padding: 5px;
+ border-bottom: solid 1px black;
+ font-size: 1em;
+ font-weight: bold;
+ color: darkred;
+ text-align: left;
+}
+
+.function_entry {
+
+
+}
+
+
+.function_entry_simple {
+
+ background: #87ff75;
+
+}
+
+.function_entry_moderate {
+
+ background: #fffc60;
+
+}
+
+.function_entry_high {
+
+ background: #ff5a5d;
+
+}
+
+.function_entry_untestable {
+
+ background: #993300
+
+}
+
+
+.function_entry_name {
+
+ font-size: 1em;
+ text-align: left;
+ font-weight: bold;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_cyclo {
+
+ font-size: 1em;
+ text-align: right;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_number {
+
+ font-size: 1em;
+ text-align: right;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_filename {
+
+ font-size: 1em;
+ text-align: left;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.sidemenu {
+
+ border: 1px black solid;
+ padding: 5px;
+
+}
+
+.sidemenuheader {
+
+ color: darkred;
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 1px dashed darkred;
+}
+
+.sidemenuentry {
+
+
+}
+
+.menu {
+
+}
+
diff --git a/gnulib/build-aux/pmccabe2html b/gnulib/build-aux/pmccabe2html
new file mode 100644
index 00000000..3f887adc
--- /dev/null
+++ b/gnulib/build-aux/pmccabe2html
@@ -0,0 +1,907 @@
+# pmccabe2html - AWK script to convert pmccabe output to html
+
+# Copyright (C) 2007, 2008, 2009, 2010 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/>.
+
+# Written by Jose E. Marchesi <jemarch@gnu.org>.
+# Adapted for gnulib by Simon Josefsson <simon@josefsson.org>.
+# Added support for C++ by Giuseppe Scrivano <gscrivano@gnu.org>.
+
+# Typical Invocation is from a Makefile.am:
+#
+# cyclo-$(PACKAGE).html:
+# $(PMCCABE) ${top_srcdir}/lib/*.[ch] \
+# | sort -nr \
+# | $(AWK) -f ${top_srcdir}/build-aux/pmccabe2html \
+# -v lang=html -v name="$(PACKAGE_NAME)" \
+# -v vcurl="http://git.savannah.gnu.org/gitweb/?p=$(PACKAGE).git;a=blob;f=%FILENAME%;hb=HEAD" \
+# -v url="http://www.gnu.org/software/$(PACKAGE)/" \
+# -v css=${top_srcdir}/build-aux/pmccabe.css \
+# > $@-tmp
+# mv $@-tmp $@
+#
+# The variables available are:
+# lang output language, either 'html' or 'wiki'
+# name project name
+# url link to project's home page
+# vcurl URL to version controlled source code browser,
+# a %FILENAME% in the string is replaced with the relative
+# source filename
+# css CSS stylesheet filename, included verbatim in HTML output
+# css_url link to CSS stylesheet, an URL
+
+# Prologue & configuration
+BEGIN {
+ section_global_stats_p = 1
+ section_function_cyclo_p = 1
+
+ # "html" or "wiki"
+ package_name = name
+ output_lang = lang
+
+ # General Options
+ cyclo_simple_max = 10
+ cyclo_moderate_max = 20
+ cyclo_high_max = 50
+ cut_dir = "/../"
+ source_file_link_tmpl = vcurl
+
+ # HTML options
+ if (url != "")
+ {
+ html_prolog = "<a href=\"" url "\">Back to " package_name " Homepage</a><br/><br/>"
+ }
+ html_epilog = "<hr color=\"black\" size=\"2\"/> \
+Copyright (c) 2007, 2008 Free Software Foundation, Inc."
+ html_doctype = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \
+\"http://www.w3.org/TR/html401/loose.dtd\">"
+ html_comment = "<!-- Generated by gnulib's pmccabe2html at " systime() " -->"
+ html_title = "Cyclomatic Complexity report for " package_name
+
+ # Wiki options
+ wiki_prolog = "{{Note|This page has been automatically generated}}"
+ wiki_epilog = ""
+
+ # Internal variables
+ nfuncs = 0;
+}
+
+# Functions
+
+function build_stats()
+{
+ # Maximum modified cyclo
+ for (fcn in mcyclo)
+ {
+ num_of_functions++
+ if (mcyclo[fcn] > max_mcyclo)
+ {
+ max_mcyclo = mcyclo[fcn]
+ }
+
+ if (mcyclo[fcn] > cyclo_high_max)
+ {
+ num_of_untestable_functions++
+ }
+ else if (mcyclo[fcn] > cyclo_moderate_max)
+ {
+ num_of_high_functions++
+ }
+ else if (mcyclo[fcn] > cyclo_simple_max)
+ {
+ num_of_moderate_functions++
+ }
+ else
+ {
+ num_of_simple_functions++
+ }
+ }
+}
+
+function html_fnc_table_complete (caption)
+{
+ html_fnc_table(caption, 1, 0, 1, 1, 1, 0, 1)
+}
+
+function html_fnc_table_abbrev (caption)
+{
+ html_fnc_table(caption, 1, 0, 1, 0, 1, 0, 0)
+}
+
+
+function html_fnc_table (caption,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ print "<table width=\"90%\" class=\"function_table\" cellpadding=\"0\" cellspacing=\"0\">"
+ if (caption != "")
+ {
+ print "<caption class=\"function_table_caption\">" caption "</caption>"
+ }
+ html_fnc_header(fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+ for (nfnc = 1; nfnc < nfuncs; nfnc++)
+ {
+ html_fnc(nfnc,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+ }
+ print "</table>"
+}
+
+function html_header ()
+{
+ print html_doctype
+ print "<html>"
+ print html_comment
+ print "<head>"
+ print "<title>" html_title "</title>"
+ print ""
+ print "<meta name=\"description\" content=\"" html_title "\">"
+ print "<meta name=\"keywords\" content=\"" html_title "\">"
+ print "<meta name=\"resource-type\" content=\"document\">"
+ print "<meta name=\"distribution\" content=\"global\">"
+ print "<meta name=\"Generator\" content=\"pmccabe2html\">"
+ print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
+ print "<script language=\"javascript\" type=\"text/javascript\">"
+ print "function show_hide(idCapa, idButton, fuerzaVisibilidad)\
+{\
+ var button = document.getElementById(idButton);\
+ var capa = document.getElementById(idCapa);\
+ if (capa)\
+ {\
+ if (fuerzaVisibilidad && fuerzaVisibilidad!=\"\") {\
+ if (fuerzaVisibilidad==\"visible\") capa.style.display=\"\";\
+ else capa.style.display=\"none\";\
+ }\
+ else\
+ {\
+ if (capa.style.display == \"none\") {\
+ capa.style.display = \"\";\
+ button.innerHTML = \"&uarr;\";\
+ } else {\
+ capa.style.display = \"none\";\
+ button.innerHTML = \"&darr;\"; \
+ }\
+ }\
+ }\
+}"
+ print "</script>"
+
+
+ if (css_url != "")
+ {
+ print "<link rel=\"stylesheet\" href=\"" css_url "\" type =\"text/css\" media=\"screen\"/>"
+ }
+ if (css != "")
+ {
+ print "<style type =\"text/css\" media=\"screen\">"
+ print "<!--"
+ while ((getline cssline < css) > 0)
+ {
+ print cssline
+ }
+ print "-->"
+ print "</style />"
+ close(css)
+ }
+ print "</head>"
+ print "<body lang=\"en\" bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000FF\" \
+vlink=\"#800080\" alink=\"#FF0000\">"
+}
+
+function html_footer ()
+{
+ print "</body>"
+ print "</html>"
+}
+
+function html_fnc_header (fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ print "<tr class=\"function_table_header\">"
+ if (fname_p)
+ {
+ # Function name
+ print "<td class=\"function_table_header_entry\">"
+ print ""
+ print "</td>"
+
+ print "<td class=\"function_table_header_entry\">"
+ print "Function Name"
+ print "</td>"
+ }
+ if (mcyclo_p)
+ {
+ # Modified cyclo
+ print "<td class=\"function_table_header_entry\">"
+ print "Modified Cyclo"
+ print "</td>"
+ }
+ if (cyclo_p)
+ {
+ # Cyclo
+ print "<td class=\"function_table_header_entry\">"
+ print "Cyclomatic"
+ print "<br/>"
+ print "Complexity"
+ print "</td>"
+ }
+ if (num_statements_p)
+ {
+ print "<td class=\"function_table_header_entry\">"
+ print "Number of"
+ print "<br/>"
+ print "Statements"
+ print "</td>"
+ }
+ if (num_lines_p)
+ {
+ print "<td class=\"function_table_header_entry\">"
+ print "Number of"
+ print "<br/>"
+ print "Lines"
+ print "</td>"
+ }
+ if (first_line_p)
+ {
+ print "<td class=\"function_table_header_entry\">"
+ print "First Line"
+ print "</td>"
+ }
+ if (file_p)
+ {
+ print "<td class=\"function_table_header_entry\">"
+ print "Source File"
+ print "</td>"
+
+ }
+ print "</tr>"
+}
+
+function html_fnc (nfun,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ fname = fnames[nfun]
+
+ # Function name
+ trclass = "function_entry_simple"
+ if (mcyclo[nfun] > cyclo_high_max)
+ {
+ trclass="function_entry_untestable"
+ }
+ else if (mcyclo[nfun] > cyclo_moderate_max)
+ {
+ trclass="function_entry_high"
+ }
+ else if (mcyclo[nfun] > cyclo_simple_max)
+ {
+ trclass="function_entry_moderate"
+ }
+
+ print "<tr class=\"" trclass "\">"
+ if (fname_p)
+ {
+ print "<td class=\"function_entry_filename\">"
+ if (file_p && mcyclo[nfun] > cyclo_simple_max)
+ {
+ print "<a href=\"javascript:void(0);\" title=\"show/hide function source\" onClick=\"javascript:show_hide('" fname "_src', '" fname "_button')\">\
+<span id=\"" fname "_button\">&darr;</span></a>"
+ }
+ else
+ {
+ print "&nbsp;"
+ }
+ print "</td>"
+
+ print "<td class=\"function_entry_name\">"
+ print fname
+ print "</td>"
+ }
+ if (mcyclo_p)
+ {
+ # Modified cyclo
+ print "<td class=\"function_entry_cyclo\">"
+ print mcyclo[nfun]
+ print "</td>"
+ }
+ if (cyclo_p)
+ {
+ # Cyclo
+ print "<td class=\"function_entry_cyclo\">"
+ print cyclo[nfun]
+ print "</td>"
+ }
+ if (num_statements_p)
+ {
+ # Number of statements
+ print "<td class=\"function_entry_number\">"
+ print num_statements[nfun]
+ print "</td>"
+ }
+ if (num_lines_p)
+ {
+ # Number of lines
+ print "<td class=\"function_entry_number\">"
+ print num_lines[nfun]
+ print "</td>"
+ }
+ if (first_line_p)
+ {
+ # First line
+ print "<td class=\"function_entry_number\">"
+ print first_line[nfun]
+ print "</td>"
+ }
+ if (file_p)
+ {
+ href = ""
+ if (source_file_link_tmpl != "")
+ {
+ # Get href target
+ href = source_file_link_tmpl
+ sub(/%FILENAME%/, file[nfun], href)
+ }
+
+ # Source file
+ print "<td class=\"function_entry_filename\">"
+ if (href != "")
+ {
+ print "<a href=\"" href "\">" file[nfun] "</a>"
+ }
+ else
+ {
+ print file[nfun]
+ }
+
+ print "</td>"
+
+
+ print "</tr>"
+
+ if (mcyclo[nfun] > cyclo_simple_max)
+ {
+ print "<tr>"
+
+ num_columns = 1;
+ if (fname_p) { num_columns++ }
+ if (mcyclo_p) { num_columns++ }
+ if (cyclo_p) { num_columns++ }
+ if (num_statements_p) { num_columns++ }
+ if (num_lines_p) { num_columns++ }
+ if (first_line_p) { num_columns++ }
+ if (file_p) { num_columns++ }
+
+ print "<td colspan=\"" num_columns "\" height=\"0\">"
+ print "<div id=\"" fname "_src\" class=\"function_src\" style=\"position: relative; display: none;\">"
+ print "<pre class=\"function_src\">"
+
+ while ((getline codeline < (fname nfun "_fn.txt")) > 0)
+ {
+ sub(/\\</, "&lt;", codeline)
+ sub(/\\>/, "&gt;", codeline)
+ sub(/&/, "&amp;", codeline)
+
+ print codeline
+ }
+ close(fname nfun "_fn.txt")
+ system("rm " fname nfun "_fn.txt")
+ print "</pre>"
+ print "</div>"
+ print "</td>"
+ print "</tr>"
+ }
+
+ }
+}
+
+function html_global_stats ()
+{
+ print "<div class=\"section_title\">Resume</div>"
+
+ print "<br/>"
+ print "<table class=\"resume_table\">"
+ # Total number of functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Total number of functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_functions
+ print "</td>"
+ print "</tr>"
+ # Number of simple functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Number of low risk functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_simple_functions
+ print "</td>"
+ print "</tr>"
+ # Number of moderate functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Number of moderate risk functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_moderate_functions
+ print "</td>"
+ print "</tr>"
+ # Number of high functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Number of high risk functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_high_functions
+ print "</td>"
+ print "</tr>"
+ # Number of untestable functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Number of untestable functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_untestable_functions
+ print "</td>"
+ print "</tr>"
+ print "</table>"
+ print "<br/>"
+}
+
+function html_function_cyclo ()
+{
+ print "<div class=\"section_title\">Details for all functions</div>"
+ print "<p>Used ranges:</p>"
+
+ print "<table class=\"ranges_table\">"
+ print "<tr>"
+ print "<td class=\"ranges_header_entry\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_header_entry\">"
+ print "Cyclomatic Complexity"
+ print "</td>"
+ print "<td class=\"ranges_header_entry\">"
+ print "Risk Evaluation"
+ print "</td>"
+ print "</tr>"
+ # Simple
+ print "<tr>"
+ print "<td class=\"ranges_entry_simple\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "0 - " cyclo_simple_max
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "Simple module, without much risk"
+ print "</td>"
+ print "</tr>"
+ # Moderate
+ print "<tr>"
+ print "<td class=\"ranges_entry_moderate\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print cyclo_simple_max + 1 " - " cyclo_moderate_max
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "More complex module, moderate risk"
+ print "</td>"
+ print "</tr>"
+ # High
+ print "<tr>"
+ print "<td class=\"ranges_entry_high\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print cyclo_moderate_max + 1 " - " cyclo_high_max
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "Complex module, high risk"
+ print "</td>"
+ print "</tr>"
+ # Untestable
+ print "<tr>"
+ print "<td class=\"ranges_entry_untestable\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "greater than " cyclo_high_max
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "Untestable module, very high risk"
+ print "</td>"
+ print "</tr>"
+ print "</table>"
+ print "<br/>"
+ html_fnc_table_complete("")
+}
+
+function wiki_global_stats ()
+{
+ print "{| class=\"cyclo_resume_table\""
+ # Total number of functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Total number of functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_functions
+ # Number of simple functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Number of low risk functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_simple_functions
+ # Number of moderate functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Number of moderate risk functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_moderate_functions
+ # Number of high functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Number of high risk functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_high_functions
+ # Number of untestable functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Number of untestable functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_untestable_functions
+ print "|}"
+}
+
+function wiki_function_cyclo ()
+{
+ print "==Details for all functions=="
+
+ print "Used ranges:"
+
+ print "{| class =\"cyclo_ranges_table\""
+ print "|-"
+ print "| class=\"cyclo_ranges_header_entry\" | "
+ print "| class=\"cyclo_ranges_header_entry\" | Cyclomatic Complexity"
+ print "| class=\"cyclo_ranges_header_entry\" | Risk Evaluation"
+ # Simple
+ print "|-"
+ print "| class=\"cyclo_ranges_entry_simple\" | "
+ print "| class=\"cyclo_ranges_entry\" | 0 - " cyclo_simple_max
+ print "| class=\"cyclo_ranges_entry\" | Simple module, without much risk"
+ # Moderate
+ print "|-"
+ print "| class=\"cyclo_ranges_entry_moderate\" | "
+ print "| class=\"cyclo_ranges_entry\" |" cyclo_simple_max + 1 " - " cyclo_moderate_max
+ print "| class=\"cyclo_ranges_entry\" | More complex module, moderate risk"
+ # High
+ print "|-"
+ print "| class=\"cyclo_ranges_entry_high\" | "
+ print "| class=\"cyclo_ranges_entry\" |" cyclo_moderate_max + 1 " - " cyclo_high_max
+ print "| class=\"cyclo_ranges_entry\" | Complex module, high risk"
+ # Untestable
+ print "|-"
+ print "| class=\"cyclo_ranges_entry_untestable\" | "
+ print "| class=\"cyclo_ranges_entry\" | greater than " cyclo_high_max
+ print "| class=\"cyclo_ranges_entry\" | Untestable module, very high risk"
+ print "|}"
+
+ print ""
+ print ""
+ wiki_fnc_table_complete("")
+}
+
+function wiki_fnc_table_complete (caption)
+{
+ wiki_fnc_table(caption, 1, 0, 1, 1, 1, 0, 1)
+}
+
+function wiki_fnc_table_abbrev (caption)
+{
+ wiki_fnc_table(caption, 1, 0, 0, 0, 0, 0, 0)
+}
+
+function wiki_fnc_table (caption,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ print "{| width=\"90%\" class=\"cyclo_function_table\" cellpadding=\"0\" cellspacing=\"0\">"
+ if (caption != "")
+ {
+ print "|+" caption
+ }
+ wiki_fnc_header(fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+ for (nfnc = 1; nfnc < nfuncs; nfnc++)
+ {
+ wiki_fnc(nfnc,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+ }
+ print "|}"
+}
+
+function wiki_fnc_header (fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ if (fname_p)
+ {
+ # Function name
+ print "! class=\"cyclo_function_table_header_entry\" | Function Name"
+ }
+ if (mcyclo_p)
+ {
+ # Modified cyclo
+ print "! class=\"cyclo_function_table_header_entry\" | Modified Cyclo"
+ }
+ if (cyclo_p)
+ {
+ # Cyclo
+ print "! class=\"cyclo_function_table_header_entry\" | Cyclomatic Complexity"
+ }
+ if (num_statements_p)
+ {
+ print "! class=\"cyclo_function_table_header_entry\" | Number of Statements"
+ }
+ if (num_lines_p)
+ {
+ print "! class=\"cyclo_function_table_header_entry\" | Number of Lines"
+ }
+ if (first_line_p)
+ {
+ print "! class=\"cyclo_function_table_header_entry\" | First Line"
+ }
+ if (file_p)
+ {
+ print "! class=\"cyclo_function_table_header_entry\" | Source File"
+ }
+}
+
+function wiki_fnc (nfnc,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ fname = fnames[nfnc]
+
+ # Function name
+ trclass = "cyclo_function_entry_simple"
+ if (mcyclo[nfnc] > cyclo_high_max)
+ {
+ trclass="cyclo_function_entry_untestable"
+ }
+ else if (mcyclo[nfnc] > cyclo_moderate_max)
+ {
+ trclass="cyclo_function_entry_high"
+ }
+ else if (mcyclo[nfnc] > cyclo_simple_max)
+ {
+ trclass="cyclo_function_entry_moderate"
+ }
+
+ print "|- class=\"" trclass "\""
+ if (fname_p)
+ {
+ print "| class=\"cyclo_function_entry_name\" |" fname
+ }
+ if (mcyclo_p)
+ {
+ # Modified cyclo
+ print "| class=\"cyclo_function_entry_cyclo\" |" mcyclo[nfnc]
+ }
+ if (cyclo_p)
+ {
+ # Cyclo
+ print "| class=\"cyclo_function_entry_cyclo\" |" cyclo[nfnc]
+ }
+ if (num_statements_p)
+ {
+ # Number of statements
+ print "| class=\"cyclo_function_entry_number\" |" num_statements[nfnc]
+ }
+ if (num_lines_p)
+ {
+ # Number of lines
+ print "| class=\"cyclo_function_entry_number\" |" num_lines[nfnc]
+ }
+ if (first_line_p)
+ {
+ # First line
+ print "| class=\"cyclo_function_entry_number\" |" first_line[nfnc]
+ }
+ if (file_p)
+ {
+ href = ""
+ if (source_file_link_tmpl != "")
+ {
+ # Get href target
+ href = source_file_link_tmpl
+ sub(/%FILENAME%/, file[nfnc], href)
+ }
+
+ # Source file
+ print "| class=\"cyclo_function_entry_filename\" |" \
+ ((href != "") ? "[" href " " file[nfnc] "]" : "[" file[nfnc] "]")
+ }
+}
+
+# Scan data from a line
+{
+ function_name = $7
+
+ nfuncs++;
+ fnames[nfuncs] = function_name
+ mcyclo[nfuncs] = $1
+ cyclo[nfuncs] = $2
+ num_statements[nfuncs] = $3
+ first_line[nfuncs] = $4
+ num_lines[nfuncs] = $5
+
+ # Build the filename from the file_spec ($6)
+ begin_util_path = index($6, cut_dir)
+ tmpfilename = substr($6, begin_util_path + length(cut_dir))
+ sub(/\([0-9]+\):/, "", tmpfilename)
+ file[nfuncs] = tmpfilename
+
+ if (mcyclo[nfuncs] > cyclo_simple_max)
+ {
+ # Extract function contents to a fn_txt file
+ filepath = $6
+
+ sub(/\([0-9]+\):/, "", filepath)
+ num_line = 0
+
+ while ((getline codeline < filepath) > 0)
+ {
+ num_line++;
+ if ((num_line >= first_line[nfuncs]) &&
+ (num_line < first_line[nfuncs] + num_lines[nfuncs]))
+ {
+ print codeline > (function_name nfuncs "_fn.txt")
+ }
+ }
+ close (function_name nfuncs "_fn.txt")
+ close(filepath)
+ }
+
+ # Initial values for statistics variables
+ num_of_functions = 0
+ max_mcyclo = 0
+ max_function_length = 0
+ num_of_simple_functions = 0
+ num_of_moderate_functions = 0
+ num_of_high_functions = 0
+ num_of_untestable_functions = 0
+}
+
+# Epilogue
+END {
+ # Print header (only for html)
+ if (output_lang == "html")
+ {
+ html_header()
+ }
+
+ # Print prolog
+ if ((output_lang == "html") &&
+ (html_prolog != ""))
+ {
+ print html_prolog
+ }
+ if ((output_lang == "wiki") &&
+ (wiki_prolog != ""))
+ {
+ print wiki_prolog
+ }
+
+ if (output_lang == "html")
+ {
+ print "<div class=\"page_title\">" package_name " Cyclomatic Complexity Report</div>"
+ print "<p>Report generated at: <span class=\"report_timestamp\">" strftime() "</div></p>"
+ }
+ if (output_lang == "wiki")
+ {
+ print "==" package_name " Cyclomatic Complexity Report=="
+ print "Report generated at: '''" strftime() "'''"
+ }
+
+ if (section_global_stats_p)
+ {
+ build_stats()
+
+ if (output_lang == "html")
+ {
+ html_global_stats()
+ }
+ if (output_lang == "wiki")
+ {
+ wiki_global_stats()
+ }
+ }
+ if (section_function_cyclo_p)
+ {
+ if (output_lang == "html")
+ {
+ html_function_cyclo()
+ }
+ if (output_lang == "wiki")
+ {
+ wiki_function_cyclo()
+ }
+ }
+
+ # Print epilog
+ if ((output_lang == "html") &&
+ (html_epilog != ""))
+ {
+ print html_epilog
+ }
+ if ((output_lang == "wiki") &&
+ (wiki_epilog != ""))
+ {
+ print wiki_epilog
+ }
+
+ # Print footer (html only)
+ if (output_lang == "html")
+ {
+ html_footer()
+ }
+}
+
+# End of pmccabe2html
diff --git a/gnulib/build-aux/po/Makefile.in.in b/gnulib/build-aux/po/Makefile.in.in
new file mode 100644
index 00000000..fecf500f
--- /dev/null
+++ b/gnulib/build-aux/po/Makefile.in.in
@@ -0,0 +1,429 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+#
+# Origin: gettext-0.17
+GETTEXT_MACRO_VERSION = 0.17
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @localedir@
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+GMSGFMT_ = @GMSGFMT@
+GMSGFMT_no = @GMSGFMT@
+GMSGFMT_yes = @GMSGFMT_015@
+GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
+MSGFMT_ = @MSGFMT@
+MSGFMT_no = @MSGFMT@
+MSGFMT_yes = @MSGFMT_015@
+MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
+XGETTEXT_ = @XGETTEXT@
+XGETTEXT_no = @XGETTEXT@
+XGETTEXT_yes = @XGETTEXT_015@
+XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+ @echo "$(MSGFMT) -c -o $@ $<"; \
+ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+ @lang=`echo $* | sed -e 's,.*/,,'`; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \
+ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+ sed -e '/^#/d' $< > t-$@
+ mv t-$@ $@
+
+
+all: check-macro-version all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# Ensure that the gettext macros and this Makefile.in.in are in sync.
+check-macro-version:
+ @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
+ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
+ exit 1; \
+ }
+
+# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
+# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
+# we don't want to bother translators with empty POT files). We assume that
+# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
+# In this case, stamp-po is a nop (i.e. a phony target).
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+ test ! -f $(srcdir)/$(DOMAIN).pot || \
+ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
+ @test ! -f $(srcdir)/$(DOMAIN).pot || { \
+ echo "touch stamp-po" && \
+ echo timestamp > stamp-poT && \
+ mv stamp-poT stamp-po; \
+ }
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+ if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \
+ package_gnu='GNU '; \
+ else \
+ package_gnu=''; \
+ fi; \
+ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
+ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
+ else \
+ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
+ fi; \
+ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ *) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --package-name="$${package_gnu}@PACKAGE@" \
+ --package-version='@VERSION@' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ esac
+ test ! -f $(DOMAIN).po || { \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+ else \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ else \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ }
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+ $(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(srcdir)/$(DOMAIN).pot
+ @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+ if test -f "$(srcdir)/$${lang}.po"; then \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
+ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \
+ else \
+ $(MAKE) $${lang}.po-create; \
+ fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ $(INSTALL_DATA) $(srcdir)/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ for file in Makevars; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+install-data-no: all
+install-data-yes: all
+ $(mkdir_p) $(DESTDIR)$(datadir)
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $(DESTDIR)$$dir; \
+ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+ fi; \
+ done; \
+ done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ : ; \
+ fi
+installdirs-data-no:
+installdirs-data-yes:
+ $(mkdir_p) $(DESTDIR)$(datadir)
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $(DESTDIR)$$dir; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ fi; \
+ done; \
+ done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+uninstall-data-no:
+uninstall-data-yes:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ done; \
+ done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+ rm -f remove-potcdate.sed
+ rm -f stamp-poT
+ rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+ $(MAKE) update-po
+ @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: stamp-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ dists="$$dists Makevars.template"; \
+ fi; \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ dists="$$dists $(DOMAIN).pot stamp-po"; \
+ fi; \
+ if test -f $(srcdir)/ChangeLog; then \
+ dists="$$dists ChangeLog"; \
+ fi; \
+ for i in 0 1 2 3 4 5 6 7 8 9; do \
+ if test -f $(srcdir)/ChangeLog.$$i; then \
+ dists="$$dists ChangeLog.$$i"; \
+ fi; \
+ done; \
+ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+ for file in $$dists; do \
+ if test -f $$file; then \
+ cp -p $$file $(distdir) || exit 1; \
+ else \
+ cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+ fi; \
+ done
+
+update-po: Makefile
+ $(MAKE) $(DOMAIN).pot-update
+ test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+ $(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+ @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+ exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+ @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+ cd $(srcdir); \
+ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \
+ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+ @:
+
+Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
+ cd $(top_builddir) \
+ && $(SHELL) ./config.status $(subdir)/$@.in po-directories
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gnulib/build-aux/reloc-ldflags b/gnulib/build-aux/reloc-ldflags
new file mode 100755
index 00000000..8676159e
--- /dev/null
+++ b/gnulib/build-aux/reloc-ldflags
@@ -0,0 +1,101 @@
+#! /bin/sh
+# Output a system dependent linker command for putting a relocatable library
+# search path into an executable.
+#
+# Copyright 2003, 2009, 2010 Free Software Foundation, Inc.
+# Written by Bruno Haible <bruno@clisp.org>, 2003.
+#
+# 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/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variable LD should be set by the caller.
+#
+# The second argument is a colon separated list of directories that contain
+# the libraries at installation time.
+#
+# The third argument is the directory into which the executable is going to be
+# installed.
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+library_path_value=$2
+
+installdir=$3
+
+# Verify that installdir is absolute.
+case "$installdir" in
+ /*) ;;
+ *)
+ echo "installdir is not absolute: $installdir" 1>&2
+ exit 1
+ ;;
+esac
+
+case "$host_os" in
+ linux*) # Supported since Linux 2.1 and glibc 2.1.
+ rpath=
+ save_IFS="$IFS"; IFS=":"
+ for dir in $library_path_value; do
+ IFS="$save_IFS"
+ case "$dir" in
+ /*)
+ # Make dir relative to installdir. (Works only if dir is absolute.)
+ idir="$installdir"
+ while true; do
+ dfirst=`echo "$dir" | sed -n -e 's,^//*\([^/]*\).*$,/\1,p'`
+ ifirst=`echo "$idir" | sed -n -e 's,^//*\([^/]*\).*$,/\1,p'`
+ if test -z "$dfirst" || test -z "$ifirst"; then
+ break
+ fi
+ if test "$dfirst" != "$ifirst"; then
+ break
+ fi
+ dir=`echo "$dir" | sed -e 's,^//*[^/]*,,'`
+ idir=`echo "$idir" | sed -e 's,^//*[^/]*,,'`
+ done
+ dir="\$ORIGIN"`echo "$idir" | sed -e 's,//*[^/]*,/..,g'`"$dir"
+ # Add dir to rpath.
+ rpath="${rpath}${rpath:+ }$dir"
+ ;;
+ *)
+ if test -n "$dir"; then
+ echo "libdir is not absolute: $dir" 1>&2
+ fi
+ ;;
+ esac
+ done
+ IFS="$save_IFS"
+ # Output it.
+ if test -n "$rpath"; then
+ echo "-Wl,-rpath,$rpath"
+ fi
+ ;;
+ *)
+ echo "relocation via rpath not supported on this system: $host" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/gnulib/build-aux/relocatable.sh.in b/gnulib/build-aux/relocatable.sh.in
new file mode 100644
index 00000000..16f98e6a
--- /dev/null
+++ b/gnulib/build-aux/relocatable.sh.in
@@ -0,0 +1,131 @@
+# The functions in this file provide support for relocatability of
+# shell scripts. They should be included near the beginning of each
+# shell script in a relocatable program, by adding @relocatable_sh@
+# and causing the script to be expanded with AC_CONFIG_FILES. A
+# small amount of additional code must be added and adapted to the
+# package by hand; see doc/relocatable-maint.texi (in Gnulib) for
+# details.
+#
+# Copyright (C) 2003, 2005-2007, 2009-2010 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/>.
+#
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gl$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ { (exit 1); exit 1; }
+ }
+}
+
+# Support for relocatability.
+func_find_curr_installdir ()
+{
+ # Determine curr_installdir, even taking into account symlinks.
+ curr_executable="$0"
+ case "$curr_executable" in
+ */* | *\\*) ;;
+ *) # Need to look in the PATH.
+ if test "${PATH_SEPARATOR+set}" != set; then
+ func_tmpdir
+ { echo "#! /bin/sh"; echo "exit 0"; } > "$tmp"/conf.sh
+ chmod +x "$tmp"/conf.sh
+ if (PATH="/nonexistent;$tmp"; conf.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -rf "$tmp"
+ fi
+ save_IFS="$IFS"; IFS="$PATH_SEPARATOR"
+ for dir in $PATH; do
+ IFS="$save_IFS"
+ test -z "$dir" && dir=.
+ for exec_ext in ''; do
+ if test -f "$dir/$curr_executable$exec_ext"; then
+ curr_executable="$dir/$curr_executable$exec_ext"
+ break 2
+ fi
+ done
+ done
+ IFS="$save_IFS"
+ ;;
+ esac
+ # Make absolute.
+ case "$curr_executable" in
+ /* | ?:/* | ?:\\*) ;;
+ *) curr_executable=`pwd`/"$curr_executable" ;;
+ esac
+ # Resolve symlinks.
+ sed_dirname='s,/[^/]*$,,'
+ sed_linkdest='s,^.* -> \(.*\),\1,p'
+ while : ; do
+ lsline=`LC_ALL=C ls -l "$curr_executable"`
+ case "$lsline" in
+ *" -> "*)
+ linkdest=`echo "$lsline" | sed -n -e "$sed_linkdest"`
+ case "$linkdest" in
+ /* | ?:/* | ?:\\*) curr_executable="$linkdest" ;;
+ *) curr_executable=`echo "$curr_executable" | sed -e "$sed_dirname"`/"$linkdest" ;;
+ esac ;;
+ *) break ;;
+ esac
+ done
+ curr_installdir=`echo "$curr_executable" | sed -e 's,/[^/]*$,,'`
+ # Canonicalize.
+ curr_installdir=`cd "$curr_installdir" && pwd`
+}
+func_find_prefixes ()
+{
+ # Compute the original/current installation prefixes by stripping the
+ # trailing directories off the original/current installation directories.
+ orig_installprefix="$orig_installdir"
+ curr_installprefix="$curr_installdir"
+ while true; do
+ orig_last=`echo "$orig_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
+ curr_last=`echo "$curr_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
+ if test -z "$orig_last" || test -z "$curr_last"; then
+ break
+ fi
+ if test "$orig_last" != "$curr_last"; then
+ break
+ fi
+ orig_installprefix=`echo "$orig_installprefix" | sed -e 's,/[^/]*$,,'`
+ curr_installprefix=`echo "$curr_installprefix" | sed -e 's,/[^/]*$,,'`
+ done
+}
diff --git a/gnulib/build-aux/texinfo.tex b/gnulib/build-aux/texinfo.tex
new file mode 100644
index 00000000..b6cc6d8b
--- /dev/null
+++ b/gnulib/build-aux/texinfo.tex
@@ -0,0 +1,9294 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2010-02-13.09}
+%
+% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+%
+% This texinfo.tex file 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 texinfo.tex file is distributed in the hope that 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/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexraggedright=\raggedright
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+\let\ptextop=\top
+{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
+
+% sometimes characters are active, so we need control sequences.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dashChar = `\-
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\lquoteChar= `\`
+\chardef\questChar = `\?
+\chardef\rquoteChar= `\'
+\chardef\semiChar = `\;
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+ ap-pen-dix bit-map bit-maps
+ data-base data-bases eshell fall-ing half-way long-est man-u-script
+ man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+ par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+ spell-ing spell-ings
+ stand-alone strong-est time-stamp time-stamps which-ever white-space
+ wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page. The solution is
+% described on page 260 of The TeXbook. It involves outputting two
+% marks for the sectioning macros, one before the section break, and
+% one after. I won't pretend I can describe this better than DEK...
+\def\domark{%
+ \toks0=\expandafter{\lastchapterdefs}%
+ \toks2=\expandafter{\lastsectiondefs}%
+ \toks4=\expandafter{\prevchapterdefs}%
+ \toks6=\expandafter{\prevsectiondefs}%
+ \toks8=\expandafter{\lastcolordefs}%
+ \mark{%
+ \the\toks0 \the\toks2
+ \noexpand\or \the\toks4 \the\toks6
+ \noexpand\else \the\toks8
+ }%
+}
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+ \ifcase0\topmark\fi
+ \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\topmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\lastchapterdefs{}
+\def\lastsectiondefs{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\lastcolordefs{}
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ % We don't want .vr (or whatever) entries like this:
+ % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+ % "\acronym" won't work when it's read back in;
+ % it needs to be
+ % {\code {{\tt \backslashcurfont }acronym}
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingyyy.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 24pt
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \indexdummies
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\argtorun{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+ \let\temp\finishparsearg
+ \else
+ \let\temp\argcheckspaces
+ \fi
+ % Put the space token in:
+ \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick. --kasal, 16nov03
+
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as environments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At run-time, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Environment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ out of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux/toc files.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
+ \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+ \kern-.15em
+ \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+ \def\temp{#1}%
+ \ifx\temp\onword \plainfrenchspacing
+ \else\ifx\temp\offword \plainnonfrenchspacing
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+ \fi\fi
+}
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include FILE -- \input text of FILE.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable % we want to expand any @value in FILE.
+ \turnoffactive % and allow special characters in the expansion
+ \indexnofonts % Allow `@@' and other weird things in file names.
+ \edef\temp{\noexpand\input #1 }%
+ %
+ % This trickery is to read FILE outside of a group, in case it makes
+ % definitions, etc.
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+ \catcode`\`=\other
+ \catcode`\'=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\next\centerH
+ \else
+ \let\next\centerV
+ \fi
+ \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+ {%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+ }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode`\_ = \active
+ \gdef\mathunderscore{%
+ \catcode`\_=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ % make the texinfo accent commands work in math mode
+ \let\"=\ddot
+ \let\'=\acute
+ \let\==\bar
+ \let\^=\hat
+ \let\`=\grave
+ \let\u=\breve
+ \let\v=\check
+ \let\~=\tilde
+ \let\dotaccent=\dot
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \catcode`' = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ \let' = \ptexquoteright
+ }
+}
+
+% Some math mode symbols.
+\def\bullet{$\ptexbullet$}
+\def\geq{\ifmmode \ge\else $\ge$\fi}
+\def\leq{\ifmmode \le\else $\le$\fi}
+\def\minus{\ifmmode -\else $-$\fi}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em. So do
+% whichever is larger.
+%
+\def\dots{%
+ \leavevmode
+ \setbox0=\hbox{...}% get width of three periods
+ \ifdim\wd0 > 1.5em
+ \dimen0 = \wd0
+ \else
+ \dimen0 = 1.5em
+ \fi
+ \hbox to \dimen0{%
+ \hskip 0pt plus.25fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ \openin 1 texinfo.cnf
+ \ifeof 1 \else \input texinfo.cnf \fi
+ \closein 1
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set). So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places. Thus, we have to
+% double any backslashes. Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e. Not good.
+% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's what we do).
+
+% double active backslashes.
+%
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslashdouble{%
+ @catcode`@\=@active
+ @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters. hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens, with minor
+% changes for Texinfo. It is included here under the GPL by permission
+% from the author, Heiko Oberdiek.
+%
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+%
+\def\HyPsdSubst#1#2#3{%
+ \def\HyPsdReplace##1#1##2\END{%
+ ##1%
+ \ifx\\##2\\%
+ \else
+ #2%
+ \HyReturnAfterFi{%
+ \HyPsdReplace##2\END
+ }%
+ \fi
+ }%
+ \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+ \xdef#1{#1}% redefine it as its expansion; the definition is simply
+ % \lastnode when called from \setref -> \pdfmkdest.
+ \HyPsdSubst{(}{\realbackslash(}{#1}%
+ \HyPsdSubst{)}{\realbackslash)}{#1}%
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found. (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+ %
+ % Color manipulation macros based on pdfcolor.tex,
+ % except using rgb instead of cmyk; the latter is said to render as a
+ % very dark gray on-screen and a very dark halftone in print, instead
+ % of actual black.
+ \def\rgbDarkRed{0.50 0.09 0.12}
+ \def\rgbBlack{0 0 0}
+ %
+ % k sets the color for filling (usual text, etc.);
+ % K sets the color for stroking (thin rules, e.g., normal _'s).
+ \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}}
+ %
+ % Set color, and create a mark which defines \thiscolor accordingly,
+ % so that \makeheadline knows which color to restore.
+ \def\setcolor#1{%
+ \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
+ \domark
+ \pdfsetcolor{#1}%
+ }
+ %
+ \def\maincolor{\rgbBlack}
+ \pdfsetcolor{\maincolor}
+ \edef\thiscolor{\maincolor}
+ \def\lastcolordefs{}
+ %
+ \def\makefootline{%
+ \baselineskip24pt
+ \line{\pdfsetcolor{\maincolor}\the\footline}%
+ }
+ %
+ \def\makeheadline{%
+ \vbox to 0pt{%
+ \vskip-22.5pt
+ \line{%
+ \vbox to8.5pt{}%
+ % Extract \thiscolor definition from the marks.
+ \getcolormarks
+ % Typeset the headline with \maincolor, then restore the color.
+ \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+ }%
+ \vss
+ }%
+ \nointerlineskip
+ }
+ %
+ %
+ \pdfcatalog{/PageMode /UseOutlines}
+ %
+ % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+ \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+ %
+ % pdftex (and the PDF format) support .png, .jpg, .pdf (among
+ % others). Let's try in that order.
+ \let\pdfimgext=\empty
+ \begingroup
+ \openin 1 #1.png \ifeof 1
+ \openin 1 #1.jpg \ifeof 1
+ \openin 1 #1.jpeg \ifeof 1
+ \openin 1 #1.JPG \ifeof 1
+ \openin 1 #1.pdf \ifeof 1
+ \openin 1 #1.PDF \ifeof 1
+ \errhelp = \nopdfimagehelp
+ \errmessage{Could not find image file #1 for pdf}%
+ \else \gdef\pdfimgext{PDF}%
+ \fi
+ \else \gdef\pdfimgext{pdf}%
+ \fi
+ \else \gdef\pdfimgext{JPG}%
+ \fi
+ \else \gdef\pdfimgext{jpeg}%
+ \fi
+ \else \gdef\pdfimgext{jpg}%
+ \fi
+ \else \gdef\pdfimgext{png}%
+ \fi
+ \closein 1
+ \endgroup
+ %
+ % without \immediate, ancient pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifdim \wd0 >0pt width \imagewidth \fi
+ \ifdim \wd2 >0pt height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.\pdfimgext
+ \else
+ {#1.\pdfimgext}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ %
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code, and characters
+ % such as \, aren't expanded when present in a section title.
+ \indexnofonts
+ \turnoffactive
+ \activebackslashdouble
+ \makevalueexpandable
+ \def\pdfdestname{#1}%
+ \backslashparens\pdfdestname
+ \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+ }}
+ %
+ % used to mark target names; must be expandable.
+ \def\pdfmkpgn#1{#1}
+ %
+ % by default, use a color that is dark enough to print on paper as
+ % nearly black, but still distinguishable for online viewing.
+ \def\urlcolor{\rgbDarkRed}
+ \def\linkcolor{\rgbDarkRed}
+ \def\endlink{\setcolor{\maincolor}\pdfendlink}
+ %
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text, which is what will be displayed in the
+ % outline by the pdf viewer. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node text,
+ % which might be empty if this toc entry had no corresponding node.
+ % #4 is the page number
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worth the trouble, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty
+ \def\pdfoutlinedest{#4}%
+ \else
+ % Doubled backslashes in the name.
+ {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+ \backslashparens\pdfoutlinedest}%
+ \fi
+ %
+ % Also double the backslashes in the display string.
+ {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+ \backslashparens\pdfoutlinetext}%
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \def\thischapnum{0}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \readdatafile{toc}%
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % xx to do this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Right
+ % now, I guess we'll just let the pdf reader have its way.
+ \indexnofonts
+ \setupdatafile
+ \catcode`\\=\active \otherbackslash
+ \input \tocreadfilename
+ \endgroup
+ }
+ %
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ % make a live url in pdf output.
+ \def\pdfurl#1{%
+ \begingroup
+ % it seems we really need yet another set of dummies; have not
+ % tried to figure out what each command should do in the context
+ % of @url. for now, just make @/ a no-op, that's the only one
+ % people have actually reported a problem with.
+ %
+ \normalturnoffactive
+ \def\@{@}%
+ \let\/=\empty
+ \makevalueexpandable
+ % do we want to go so far as to use \indexnofonts instead of just
+ % special-casing \var here?
+ \def\var##1{##1}%
+ %
+ \leavevmode\setcolor{\urlcolor}%
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \setcolor{\linkcolor}#1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ % non-pdf mode
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\setcolor = \gobble
+ \let\pdfsetcolor = \gobble
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Unfortunately, we have to override this for titles and the like, since
+% in those cases "rm" is bold. Sigh.
+\def\rmisbold{\rm\def\curfontstyle{bf}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\def\setleading#1{%
+ \dimen0 = #1\relax
+ \normalbaselineskip = \baselinefactor\dimen0
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% PDF CMaps. See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\undefined \else
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1IT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1TT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
+% empty to omit).
+\def\setfont#1#2#3#4#5{%
+ \font#1=\fontprefix#2#3 scaled #4
+ \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+% emacs-page end of cmaps
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt. This is the default in
+% Texinfo.
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+\def\sececsize{1440}
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+\def\ssececsize{1200}
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+\def\reducedecsize{1000}
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 11pt text font size definitions
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit. This is for the GNU
+% Press printing of the Emacs 22 manual. Maybe other manuals in the
+% future. Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+\def\chapecsize{1440}
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+\def\sececsize{1200}
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+\def\ssececsize{1000}
+
+% Reduced fonts for @acro in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+\def\reducedecsize{0900}
+
+% reduce space between paragraphs
+\divide\parskip by 2
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 10pt text font size definitions
+
+
+% We provide the user-level command
+% @fonttextsize 10
+% (or 11) to redefine the text font size. pt is assumed.
+%
+\def\xword{10}
+\def\xiword{11}
+%
+\parseargdef\fonttextsize{%
+ \def\textsizearg{#1}%
+ \wlog{doing @fonttextsize \textsizearg}%
+ %
+ % Set \globaldefs so that documents can use this inside @tex, since
+ % makeinfo 4.8 does not support it, but we need it nonetheless.
+ %
+ \begingroup \globaldefs=1
+ \ifx\textsizearg\xword \definetextfontsizex
+ \else \ifx\textsizearg\xiword \definetextfontsizexi
+ \else
+ \errhelp=\EMsimple
+ \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+ \fi\fi
+ \endgroup
+}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\curfontsize{text}%
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\curfontsize{title}%
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rmisbold #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \let\tenttsl=\chapttsl
+ \def\curfontsize{chap}%
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\curfontsize{sec}%
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\curfontsize{ssec}%
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\curfontsize{reduced}%
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\curfontsize{small}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\curfontsize{smaller}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+% Define these just so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+% --karl, 24jan03.
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+
+\message{markup,}
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will
+% define and register \INITMACRO to be called on markup style changes.
+% \INITMACRO can check \currentmarkupstyle for the innermost
+% style and the set of \ifmarkupSTYLE switches for all styles
+% currently in effect.
+\newif\ifmarkupvar
+\newif\ifmarkupsamp
+\newif\ifmarkupkey
+%\newif\ifmarkupfile % @file == @samp.
+%\newif\ifmarkupoption % @option == @samp.
+\newif\ifmarkupcode
+\newif\ifmarkupkbd
+%\newif\ifmarkupenv % @env == @code.
+%\newif\ifmarkupcommand % @command == @code.
+\newif\ifmarkuptex % @tex (and part of @math, for now).
+\newif\ifmarkupexample
+\newif\ifmarkupverb
+\newif\ifmarkupverbatim
+
+\let\currentmarkupstyle\empty
+
+\def\setupmarkupstyle#1{%
+ \csname markup#1true\endcsname
+ \def\currentmarkupstyle{#1}%
+ \markupstylesetup
+}
+
+\let\markupstylesetup\empty
+
+\def\defmarkupstylesetup#1{%
+ \expandafter\def\expandafter\markupstylesetup
+ \expandafter{\markupstylesetup #1}%
+ \def#1%
+}
+
+% Markup style setup for left and right quotes.
+\defmarkupstylesetup\markupsetuplq{%
+ \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname
+ \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
+}
+
+\defmarkupstylesetup\markupsetuprq{%
+ \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname
+ \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
+}
+
+{
+\catcode`\'=\active
+\catcode`\`=\active
+
+\gdef\markupsetuplqdefault{\let`\lq}
+\gdef\markupsetuprqdefault{\let'\rq}
+
+\gdef\markupsetcodequoteleft{\let`\codequoteleft}
+\gdef\markupsetcodequoteright{\let'\codequoteright}
+
+\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft}
+}
+
+\let\markupsetuplqcode \markupsetcodequoteleft
+\let\markupsetuprqcode \markupsetcodequoteright
+\let\markupsetuplqexample \markupsetcodequoteleft
+\let\markupsetuprqexample \markupsetcodequoteright
+\let\markupsetuplqverb \markupsetcodequoteleft
+\let\markupsetuprqverb \markupsetcodequoteright
+\let\markupsetuplqverbatim \markupsetcodequoteleft
+\let\markupsetuprqverbatim \markupsetcodequoteright
+
+\let\markupsetuplqsamp \markupsetnoligaturesquoteleft
+\let\markupsetuplqkbd \markupsetnoligaturesquoteleft
+
+% Allow an option to not replace quotes with a regular directed right
+% quote/apostrophe (char 0x27), but instead use the undirected quote
+% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it
+% the default, but it works for pasting with more pdf viewers (at least
+% evince), the lilypond developers report. xpdf does work with the
+% regular 0x27.
+%
+\def\codequoteright{%
+ \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+ \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+ '%
+ \else \char'15 \fi
+ \else \char'15 \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+ \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+ \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+ % [Knuth] pp. 380,381,391
+ % \relax disables Spanish ligatures ?` and !` of \tt font.
+ \relax`%
+ \else \char'22 \fi
+ \else \char'22 \fi
+}
+
+% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
+\def\noligaturesquoteleft{\relax\lq}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% @cite is like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}}
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @b, explicit bold. Also @strong.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\plainfrenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ \def\endofsentencespacefactor{1000}% for @. and friends
+ }
+ \def\plainnonfrenchspacing{%
+ \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+ \def\endofsentencespacefactor{3000}% for @. and friends
+ }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+% @t, explicit typewriter.
+\def\t#1{%
+ {\tt \rawbackslash \plainfrenchspacing #1}%
+ \null
+}
+
+% @samp.
+\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+
+% definition of @key that produces a lozenge. Doesn't adjust to text size.
+%\setfont\keyrm\rmshape{8}{1000}{OT1}
+%\font\keysy=cmsy9
+%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+% \vbox{\hrule\kern-0.4pt
+% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+% \kern-0.4pt\hrule}%
+% \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+
+% definition of @key with no lozenge. If the current font is already
+% monospace, don't change it; that way, we respect @kbdinputstyle. But
+% if it isn't monospace, then use \tt.
+%
+\def\key#1{{\setupmarkupstyle{key}%
+ \nohyphenation
+ \ifmonospace\else\tt\fi
+ #1}\null}
+
+% ctrl is no longer a Texinfo command.
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \plainfrenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active \catcode`\_=\active
+ \catcode`\'=\active \catcode`\`=\active
+ \global\let'=\rq \global\let`=\lq % default definitions
+ %
+ \global\def\code{\begingroup
+ \setupmarkupstyle{code}%
+ % The following should really be moved into \setupmarkupstyle handlers.
+ \catcode\dashChar=\active \catcode\underChar=\active
+ \ifallowcodebreaks
+ \let-\codedash
+ \let_\codeunder
+ \else
+ \let-\realdash
+ \let_\realunder
+ \fi
+ \codex
+ }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__. This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general. @allowcodebreaks provides a way to control this.
+%
+\newif\ifallowcodebreaks \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\keywordtrue
+ \allowcodebreakstrue
+ \else\ifx\txiarg\keywordfalse
+ \allowcodebreaksfalse
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+ \fi\fi
+}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}}
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\txiarg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\txiarg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct'.
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+ {\plainfrenchspacing #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+
+\message{glyphs,}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that. The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math. Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+ % We set the font at each command, rather than predefining it in
+ % \textfonts and the other font-switching commands, so that
+ % installations which never need the symbol don't have to have the
+ % font installed.
+ %
+ % There is only one designed size (nominal 10pt), so we always scale
+ % that to the current nominal size.
+ %
+ % By the way, simply using "at 1em" works for cmr10 and the like, but
+ % does not work for cmbx10 and other extended/shrunken fonts.
+ %
+ \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+ %
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+ \else
+ % regular:
+ \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+ \fi
+ \thiseurofont
+}
+
+% Glyphs from the EC fonts. We don't use \let for the aliases, because
+% sometimes we redefine the original macro, and the alias should reflect
+% the redefinition.
+%
+% Use LaTeX names for the Icelandic letters.
+\def\DH{{\ecfont \char"D0}} % Eth
+\def\dh{{\ecfont \char"F0}} % eth
+\def\TH{{\ecfont \char"DE}} % Thorn
+\def\th{{\ecfont \char"FE}} % thorn
+%
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+% This positioning is not perfect (see the ogonek LaTeX package), but
+% we have the precomposed glyphs for the most common cases. We put the
+% tests to use those glyphs in the single \ogonek macro so we have fewer
+% dummy definitions to worry about for index entries, etc.
+%
+% ogonek is also used with other letters in Lithuanian (IOU), but using
+% the precomposed glyphs for those is not so easy since they aren't in
+% the same EC font.
+\def\ogonek#1{{%
+ \def\temp{#1}%
+ \ifx\temp\macrocharA\Aogonek
+ \else\ifx\temp\macrochara\aogonek
+ \else\ifx\temp\macrocharE\Eogonek
+ \else\ifx\temp\macrochare\eogonek
+ \else
+ \ecfont \setbox0=\hbox{#1}%
+ \ifdim\ht0=1ex\accent"0C #1%
+ \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
+ \fi
+ \fi\fi\fi\fi
+ }%
+}
+\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
+\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
+\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
+\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
+%
+% Use the ec* fonts (cm-super in outline format) for non-CM glyphs.
+\def\ecfont{%
+ % We can't distinguish serif/sans and italic/slanted, but this
+ % is used for crude hacks anyway (like adding French and German
+ % quotes to documents typeset with CM, where we lose kerning), so
+ % hopefully nobody will notice/care.
+ \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+ \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
+ \else
+ % regular:
+ \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+ \fi
+ \thisecfont
+}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \leftline{\titlefonts\rmisbold #1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ \def\quotationauthor{#1}% printed in \Equotation.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\secfonts\rmisbold \leftline{#1}}%
+ \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -12pt
+ \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
+ \headingmarks{odd}{heading}{#1} }
+\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
+ \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+ \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+ \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. However, if
+ % what follows is an environment such as @example, there will be no
+ % \parskip glue; then the negative vskip we just inserted would
+ % cause the example and the item to crash together. So we use this
+ % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+ % \parskip glue after all. Section titles are handled this way also.
+ %
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablecheck{table}%
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablecheck{ftable}%
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+ \ifnum \the\catcode`\^^M=\active
+ \endgroup
+ \errmessage{This command won't work in this context; perhaps the problem is
+ that we are \inenvironment\thisenv}%
+ \def\next{\doignore{#1}}%
+ \else
+ \let\next\tablex
+ \fi
+ \next
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ %
+ % Try typesetting the item mark that if the document erroneously says
+ % something like @itemize @samp (intending @table), there's an error
+ % right away at the @itemize. It's not the best error message in the
+ % world, but it's better than leaving it to the @item. This means if
+ % the user wants an empty mark, they have to say @w{} not just @w.
+ \def\itemcontents{#1}%
+ \setbox0 = \hbox{\itemcontents}%
+ %
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ %
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ %
+ \vadjust{\penalty 1200}}% not good to break after first line of item.
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1. We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry. \everycr resets \everytab so we don't have to
+% undo it ourselves.
+\def\headitemfont{\b}% for people to use in the template row; not changeable
+\def\headitem{%
+ \checkenv\multitable
+ \crcr
+ \global\everytab={\bf}% can't use \headitemfont since the parsing differs
+ \the\everytab % for the first item
+}%
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we again encounter the problem the 1sp was intended to solve.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ % We use \def instead of \let so that if one of the multitable entries
+ % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+ % \endtemplate) expanding \doitemize.
+ \def\item{\crcr}%
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}%
+ \global\colcount=0 % Reset the column counter.
+ % Check for saved footnotes, etc.
+ \checkinserts
+ % Keeps underfull box messages off when table breaks over pages.
+ %\filbreak
+ % Maybe so, but it also creates really weird page breaks when the
+ % table breaks over pages. Wouldn't \vfil be better? Wait until the
+ % problem manifests itself, so it can be fixed for real --karl.
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+ \def\multistrut{\strut}% just use the standard line spacing
+ %
+ % Compute \multitablelinespace (if not defined by user) for use in
+ % \multitableparskip calculation. We used define \multistrut based on
+ % this, but (ironically) that caused the spacing to be off.
+ % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \obeylines
+ \catcode`\@ = \other
+ \catcode`\{ = \other
+ \catcode`\} = \other
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \spaceisspace
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1{%
+ % #1 contains the command name as a string, e.g., `ifinfo'.
+ %
+ % Define a command to find the next `@end #1'.
+ \long\def\doignoretext##1^^M@end #1{%
+ \doignoretextyyy##1^^M@#1\_STOP_}%
+ %
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+ %
+ % And now expand that command.
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+ % Ignore anything after the last `@end #1'; this matters in verbatim
+ % environments, where otherwise the newline after an ignored conditional
+ % would result in a blank line in the output.
+ \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\- = \active \catcode`\_ = \active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\realdash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \relax
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \escapechar = `\\ % use backslash in output files.
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ %
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % I don't entirely understand this, but when an index entry is
+ % generated from a macro call, the \endinput which \scanmacro inserts
+ % causes processing to be prematurely terminated. This is,
+ % apparently, because \indexsorttmp is fully expanded, and \endinput
+ % is an expandable command. The redefinition below makes \endinput
+ % disappear altogether for that purpose -- although logging shows that
+ % processing continues to some further point. On the other hand, it
+ % seems \endinput does not hurt in the printed index arg, since that
+ % is still getting written without apparent harm.
+ %
+ % Sample source (mac-idx3.tex, reported by Graham Percival to
+ % help-texinfo, 22may06):
+ % @macro funindex {WORD}
+ % @findex xyz
+ % @end macro
+ % ...
+ % @funindex commtest
+ %
+ % The above is not enough to reproduce the bug, but it gives the flavor.
+ %
+ % Sample whatsit resulting:
+ % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
+ %
+ % So:
+ \let\endinput = \empty
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux and toc files, @ is the escape character. So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files). When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % Do the redefinitions.
+ \commondummies
+ \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+ %
+ % \definedummyword defines \#1 as \string\#1\space, thus effectively
+ % preventing its expansion. This is used only for control% words,
+ % not control letters, because the \space would be incorrect for
+ % control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword ##1{\def##1{\string##1\space}}%
+ \def\definedummyletter##1{\def##1{\string##1}}%
+ \let\definedummyaccent\definedummyletter
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter\_%
+ %
+ % Non-English letters.
+ \definedummyword\AA
+ \definedummyword\AE
+ \definedummyword\DH
+ \definedummyword\L
+ \definedummyword\O
+ \definedummyword\OE
+ \definedummyword\TH
+ \definedummyword\aa
+ \definedummyword\ae
+ \definedummyword\dh
+ \definedummyword\exclamdown
+ \definedummyword\l
+ \definedummyword\o
+ \definedummyword\oe
+ \definedummyword\ordf
+ \definedummyword\ordm
+ \definedummyword\questiondown
+ \definedummyword\ss
+ \definedummyword\th
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword\bf
+ \definedummyword\gtr
+ \definedummyword\hat
+ \definedummyword\less
+ \definedummyword\sf
+ \definedummyword\sl
+ \definedummyword\tclose
+ \definedummyword\tt
+ %
+ \definedummyword\LaTeX
+ \definedummyword\TeX
+ %
+ % Assorted special characters.
+ \definedummyword\bullet
+ \definedummyword\comma
+ \definedummyword\copyright
+ \definedummyword\registeredsymbol
+ \definedummyword\dots
+ \definedummyword\enddots
+ \definedummyword\equiv
+ \definedummyword\error
+ \definedummyword\euro
+ \definedummyword\guillemetleft
+ \definedummyword\guillemetright
+ \definedummyword\guilsinglleft
+ \definedummyword\guilsinglright
+ \definedummyword\expansion
+ \definedummyword\minus
+ \definedummyword\ogonek
+ \definedummyword\pounds
+ \definedummyword\point
+ \definedummyword\print
+ \definedummyword\quotedblbase
+ \definedummyword\quotedblleft
+ \definedummyword\quotedblright
+ \definedummyword\quoteleft
+ \definedummyword\quoteright
+ \definedummyword\quotesinglbase
+ \definedummyword\result
+ \definedummyword\textdegree
+ %
+ % We want to disable all macros so that they are not expanded by \write.
+ \macrolist
+ %
+ \normalturnoffactive
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter\!%
+ \definedummyaccent\"%
+ \definedummyaccent\'%
+ \definedummyletter\*%
+ \definedummyaccent\,%
+ \definedummyletter\.%
+ \definedummyletter\/%
+ \definedummyletter\:%
+ \definedummyaccent\=%
+ \definedummyletter\?%
+ \definedummyaccent\^%
+ \definedummyaccent\`%
+ \definedummyaccent\~%
+ \definedummyword\u
+ \definedummyword\v
+ \definedummyword\H
+ \definedummyword\dotaccent
+ \definedummyword\ogonek
+ \definedummyword\ringaccent
+ \definedummyword\tieaccent
+ \definedummyword\ubaraccent
+ \definedummyword\udotaccent
+ \definedummyword\dotless
+ %
+ % Texinfo font commands.
+ \definedummyword\b
+ \definedummyword\i
+ \definedummyword\r
+ \definedummyword\sc
+ \definedummyword\t
+ %
+ % Commands that take arguments.
+ \definedummyword\acronym
+ \definedummyword\cite
+ \definedummyword\code
+ \definedummyword\command
+ \definedummyword\dfn
+ \definedummyword\email
+ \definedummyword\emph
+ \definedummyword\env
+ \definedummyword\file
+ \definedummyword\kbd
+ \definedummyword\key
+ \definedummyword\math
+ \definedummyword\option
+ \definedummyword\pxref
+ \definedummyword\ref
+ \definedummyword\samp
+ \definedummyword\strong
+ \definedummyword\tie
+ \definedummyword\uref
+ \definedummyword\url
+ \definedummyword\var
+ \definedummyword\verb
+ \definedummyword\w
+ \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ % Accent commands should become @asis.
+ \def\definedummyaccent##1{\let##1\asis}%
+ % We can just ignore other control letters.
+ \def\definedummyletter##1{\let##1\empty}%
+ % Hopefully, all control words can become @asis.
+ \let\definedummyword\definedummyaccent
+ %
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\DH{DZZ}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\TH{ZZZ}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\dh{dzz}%
+ \def\exclamdown{!}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ \def\o{o}%
+ \def\questiondown{?}%
+ \def\ss{ss}%
+ \def\th{zzz}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\bullet{bullet}%
+ \def\comma{,}%
+ \def\copyright{copyright}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\euro{euro}%
+ \def\expansion{==>}%
+ \def\guillemetleft{<<}%
+ \def\guillemetright{>>}%
+ \def\guilsinglleft{<}%
+ \def\guilsinglright{>}%
+ \def\minus{-}%
+ \def\point{.}%
+ \def\pounds{pounds}%
+ \def\print{-|}%
+ \def\quotedblbase{"}%
+ \def\quotedblleft{"}%
+ \def\quotedblright{"}%
+ \def\quoteleft{`}%
+ \def\quoteright{'}%
+ \def\quotesinglbase{,}%
+ \def\registeredsymbol{R}%
+ \def\result{=>}%
+ \def\textdegree{o}%
+ %
+ % We need to get rid of all macros, leaving only the arguments (if present).
+ % Of course this is not nearly correct, but it is the best we can do for now.
+ % makeinfo does not expand macros in the argument to @deffn, which ends up
+ % writing an index entry, and texindex isn't prepared for an index sort entry
+ % that starts with \.
+ %
+ % Since macro invocations are followed by braces, we can just redefine them
+ % to take a single TeX argument. The case of a macro invocation that
+ % goes to end-of-line is not handled.
+ %
+ \macrolist
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \safewhatsit\dosubindwrite
+ }%
+ \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero. The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip. \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip. The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{%
+\ifhmode
+ #1%
+\else
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \whatsitskip = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \whatsitpenalty = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\whatsitskip glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\whatsitskip
+ \fi
+ %
+ #1%
+ %
+ \ifx\lastskipmacro\zeroskipmacro
+ % If \lastskip was zero, perhaps the last item was a penalty, and
+ % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
+ % to re-insert the same penalty (values >10000 are used for various
+ % signals); since we just inserted a non-discardable item, any
+ % following glue (such as a \parskip) would be a breakpoint. For example:
+ %
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\whatsitskip
+ \fi
+\fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \plainfrenchspacing
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\backslashcurfont}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \nobreak
+ \vskip 0pt plus 3\baselineskip
+ \penalty 0
+ \vskip 0pt plus -3\baselineskip
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+% \def\entry#1#2{...
+% But this freezes the catcodes in the argument, and can cause problems to
+% @code, which sets - active. This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+% --kasal, 21nov03
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus1pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\doentry{%
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+ % #1 is the page number.
+ %
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \setbox\boxA = \hbox{#1}%
+ \ifdim\wd\boxA = 0pt
+ \ %
+ \else
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#1.%
+ \ \the\toksA
+ \else
+ \ #1%
+ \fi
+ \fi
+ \par
+ \endgroup
+}
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ % The following penalty ensures that the page builder is exercised
+ % _before_ we change the output routine. This is necessary in the
+ % following situation:
+ %
+ % The last section of the index consists only of a single entry.
+ % Before this section, \pagetotal is less than \pagegoal, so no
+ % break occurs before the last section starts. However, the last
+ % section, consisting of \initial and the single \entry, does not
+ % fit on the page and has to be broken off. Without the following
+ % penalty the page builder will not be exercised until \eject
+ % below, and by that time we'll already have changed the output
+ % routine to the \balancecolumns version, so the next-to-last
+ % double-column page will be processed with \balancecolumns, which
+ % is wrong: The two columns will go to the main vertical list, with
+ % the broken-off section in the recent contributions. As soon as
+ % the output routine finishes, TeX starts reconsidering the page
+ % break. The two columns and the broken-off section both fit on the
+ % page, because the two columns now take up only half of the page
+ % goal. When TeX sees \eject from below which follows the final
+ % section, it invokes the new output routine that we've set after
+ % \balancecolumns below; \onepageout will try to fit the two columns
+ % and the final section into the vbox of \pageheight (see
+ % \pagebody), causing an overfull box.
+ %
+ % Note that glue won't work here, because glue does not exercise the
+ % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+ \penalty0
+ %
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines these (using marks) as the number+name, number
+% and name of the chapter. Page headings and footings can use
+% these. @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+ % Compute the abs. sec. level:
+ \absseclevel=#2
+ \advance\absseclevel by \secbase
+ % Make sure \absseclevel doesn't fall outside the range:
+ \ifnum \absseclevel < 0
+ \absseclevel = 0
+ \else
+ \ifnum \absseclevel > 3
+ \absseclevel = 3
+ \fi
+ \fi
+ % The heading type:
+ \def\headtype{#1}%
+ \if \headtype U%
+ \ifnum \absseclevel < \unmlevel
+ \chardef\unmlevel = \absseclevel
+ \fi
+ \else
+ % Check for appendix sections:
+ \ifnum \absseclevel = 0
+ \edef\chapheadtype{\headtype}%
+ \else
+ \if \headtype A\if \chapheadtype N%
+ \errmessage{@appendix... within a non-appendix chapter}%
+ \fi\fi
+ \fi
+ % Check for numbered within unnumbered:
+ \ifnum \absseclevel > \unmlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unmlevel = 3
+ \fi
+ \fi
+ % Now print the heading:
+ \if \headtype U%
+ \ifcase\absseclevel
+ \unnumberedzzz{#3}%
+ \or \unnumberedseczzz{#3}%
+ \or \unnumberedsubseczzz{#3}%
+ \or \unnumberedsubsubseczzz{#3}%
+ \fi
+ \else
+ \if \headtype A%
+ \ifcase\absseclevel
+ \appendixzzz{#3}%
+ \or \appendixsectionzzz{#3}%
+ \or \appendixsubseczzz{#3}%
+ \or \appendixsubsubseczzz{#3}%
+ \fi
+ \else
+ \ifcase\absseclevel
+ \chapterzzz{#3}%
+ \or \seczzz{#3}%
+ \or \numberedsubseczzz{#3}%
+ \or \numberedsubsubseczzz{#3}%
+ \fi
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ % \putwordChapter can contain complex things in translations.
+ \toks0=\expandafter{\putwordChapter}%
+ \message{\the\toks0 \space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
+%
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ % \putwordAppendix can contain complex things in translations.
+ \toks0=\expandafter{\putwordAppendix}%
+ \message{\the\toks0 \space \appendixletter}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+ % Well, we could do the following in a group, but that would break
+ % an assumption that \chapmacro is called at the outermost level.
+ % Thus we are safer this way: --kasal, 24feb04
+ \let\centerparametersmaybe = \centerparameters
+ \unnmhead0{#1}%
+ \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\ptexraggedright
+ \rmisbold #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong. But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+ \chappager
+ \ifodd\pageno \else
+ \begingroup
+ \evenheadline={\hfil}\evenfootline={\hfil}%
+ \oddheadline={\hfil}\oddfootline={\hfil}%
+ \hbox to 0pt{}%
+ \chappager
+ \endgroup
+ \fi
+}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+ % Insert the first mark before the heading break (see notes for \domark).
+ \let\prevchapterdefs=\lastchapterdefs
+ \let\prevsectiondefs=\lastsectiondefs
+ \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+ \gdef\thissection{}}%
+ %
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+ \gdef\thischapter{\thischaptername}}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+ \gdef\thischapter{}}%
+ \else\ifx\temptype\Yappendixkeyword
+ \toks0={#1}%
+ \xdef\lastchapterdefs{%
+ \gdef\noexpand\thischaptername{\the\toks0}%
+ \gdef\noexpand\thischapternum{\appendixletter}%
+ % \noexpand\putwordAppendix avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
+ \noexpand\thischapternum:
+ \noexpand\thischaptername}%
+ }%
+ \else
+ \toks0={#1}%
+ \xdef\lastchapterdefs{%
+ \gdef\noexpand\thischaptername{\the\toks0}%
+ \gdef\noexpand\thischapternum{\the\chapno}%
+ % \noexpand\putwordChapter avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
+ \noexpand\thischapternum:
+ \noexpand\thischaptername}%
+ }%
+ \fi\fi\fi
+ %
+ % Output the mark. Pass it through \safewhatsit, to take care of
+ % the preceding space.
+ \safewhatsit\domark
+ %
+ % Insert the chapter heading break.
+ \pchapsepmacro
+ %
+ % Now the second mark, after the heading break. No break points
+ % between here and the heading.
+ \let\prevchapterdefs=\lastchapterdefs
+ \let\prevsectiondefs=\lastsectiondefs
+ \domark
+ %
+ {%
+ \chapfonts \rmisbold
+ %
+ % Have to define \lastsection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\lastsection{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \nobreak % Avoid page breaks at the interline glue.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\ptexraggedright
+ \rmisbold #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+ \global\let\chapmacro=\chfopen
+ \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rmisbold
+ %
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ % Insert first mark before the heading break (see notes for \domark).
+ \let\prevsectiondefs=\lastsectiondefs
+ \ifx\temptype\Ynothingkeyword
+ \ifx\sectionlevel\seckeyword
+ \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+ \gdef\thissection{\thissectionname}}%
+ \fi
+ \else\ifx\temptype\Yomitfromtockeyword
+ % Don't redefine \thissection.
+ \else\ifx\temptype\Yappendixkeyword
+ \ifx\sectionlevel\seckeyword
+ \toks0={#1}%
+ \xdef\lastsectiondefs{%
+ \gdef\noexpand\thissectionname{\the\toks0}%
+ \gdef\noexpand\thissectionnum{#4}%
+ % \noexpand\putwordSection avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thissection{\noexpand\putwordSection{}
+ \noexpand\thissectionnum:
+ \noexpand\thissectionname}%
+ }%
+ \fi
+ \else
+ \ifx\sectionlevel\seckeyword
+ \toks0={#1}%
+ \xdef\lastsectiondefs{%
+ \gdef\noexpand\thissectionname{\the\toks0}%
+ \gdef\noexpand\thissectionnum{#4}%
+ % \noexpand\putwordSection avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thissection{\noexpand\putwordSection{}
+ \noexpand\thissectionnum:
+ \noexpand\thissectionname}%
+ }%
+ \fi
+ \fi\fi\fi
+ %
+ % Go into vertical mode. Usually we'll already be there, but we
+ % don't want the following whatsit to end up in a preceding paragraph
+ % if the document didn't happen to have a blank line.
+ \par
+ %
+ % Output the mark. Pass it through \safewhatsit, to take care of
+ % the preceding space.
+ \safewhatsit\domark
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Now the second mark, after the heading break. No break points
+ % between here and the heading.
+ \let\prevsectiondefs=\lastsectiondefs
+ \domark
+ %
+ % Only insert the space after the number if we have a section number.
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\lastsection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \lastsection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\lastsection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\lastsection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chapmacro.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chapmacro.
+ \donoderef{#3}%
+ %
+ % Interline glue will be inserted when the vbox is completed.
+ % That glue will be a valid breakpoint for the page, since it'll be
+ % preceded by a whatsit (usually from the \donoderef, or from the
+ % \writetocentry if there was no node). We don't want to allow that
+ % break, since then the whatsits could end up on page n while the
+ % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000.
+ \nobreak
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This is purely so the last item on the list is a known \penalty >
+ % 10000. This is so \startdefun can avoid allowing breakpoints after
+ % section headings. Otherwise, it would insert a valid breakpoint between:
+ %
+ % @section sec-whatever
+ % @deffn def-whatever
+ \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ {\atdummies
+ \edef\temp{%
+ \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+ \temp
+ }%
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care. This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+ \catcode`\"=\active
+ \catcode`\$=\active
+ \catcode`\<=\active
+ \catcode`\>=\active
+ \catcode`\\=\active
+ \catcode`\^=\active
+ \catcode`\_=\active
+ \catcode`\|=\active
+ \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+ \setupdatafile
+ \activecatcodes
+ \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref. We always output on
+% \jobname.toc even if this is redefined.
+%
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \tocreadfilename\space
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \ifeof 1 \else
+ \pdfmakeoutlines
+ \fi
+ \closein 1
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \tocreadfilename\space
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \closein 1
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+ \setupmarkupstyle{tex}%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \catcode`\`=\other
+ \catcode`\'=\other
+ \escapechar=`\\
+ %
+ % ' is active in math mode (mathcode"8000). So reset it, and all our
+ % other math active characters (just in case), to plain's definitions.
+ \mathactive
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ \expandafter \let\csname top\endcsname=\ptextop % outer
+ \let\frenchspacing=\plainfrenchspacing
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing = t%
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\newdimen\nonfillparindent
+\def\nonfillstart{%
+ \aboveenvbreak
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ % Turn off paragraph indentation but redefine \indent to emulate
+ % the normal \indent.
+ \nonfillparindent=\parindent
+ \parindent = 0pt
+ \let\indent\nonfillindent
+ %
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+\begingroup
+\obeyspaces
+% We want to swallow spaces (but not other tokens) after the fake
+% @indent in our nonfill-environments, where spaces are normally
+% active and set to @tie, resulting in them not being ignored after
+% @indent.
+\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
+\gdef\nonfillindentcheck{%
+\ifx\temp %
+\expandafter\nonfillindentgobble%
+\else%
+\leavevmode\nonfillindentbox%
+\fi%
+}%
+\endgroup
+\def\nonfillindentgobble#1{\nonfillindent}
+\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ % end paragraph for sake of leading, in case document has no blank
+ % line. This is redundant with what happens in \aboveenvbreak, but
+ % we need to do it before changing the fonts, and it's inconvenient
+ % to change the fonts afterward.
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+ \makedispenv{#1}{#3}
+ \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+ \nonfillstart
+ \tt\setupmarkupstyle{example}%
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @raggedright does more-or-less normal line breaking but no right
+% justification. From plain.tex.
+\envdef\raggedright{%
+ \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax
+}
+\let\Eraggedright\par
+
+\envdef\raggedleft{%
+ \parindent=0pt \leftskip0pt plus2em
+ \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+ \hbadness=10000 % Last line will usually be underfull, so turn off
+ % badness reporting.
+}
+\let\Eraggedleft\par
+
+\envdef\raggedcenter{%
+ \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
+ \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+ \hbadness=10000 % Last line will usually be underfull, so turn off
+ % badness reporting.
+}
+\let\Eraggedcenter\par
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins. We keep \parskip nonzero in general, since
+% we're doing normal filling. So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\def\quotationstart{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \parsearg\quotationlabel
+}
+
+\envdef\quotation{%
+ \setnormaldispenv
+ \quotationstart
+}
+
+\envdef\smallquotation{%
+ \setsmalldispenv
+ \quotationstart
+}
+\let\Esmallquotation = \Equotation
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\undefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+ % Don't do the quotes -- if we do, @set txicodequoteundirected and
+ % @set txicodequotebacktick will not have effect on @verb and
+ % @verbatim, and ?` and !` ligatures won't get disabled.
+ %\do\`\do\'%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \setupmarkupstyle{verb}%
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+%
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \tabexpand
+ \setupmarkupstyle{verbatim}%
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \indexnofonts % Allow `@@' and other weird things in file names.
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+ \begingroup
+ \parindent = 0pt % paragraph indentation looks wrong on title page
+ \scanexp\copyingtext
+ \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \defunpenalty=10003 % Will keep this @deffn together with the
+ % following @def command, see below.
+ \else
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check specifically for penalty 10002, inserted
+ % by \printdefunline, instead of 10000, since the sectioning
+ % commands also insert a nobreak penalty, and we don't want to allow
+ % a break between a section heading and a defun.
+ %
+ % As a minor refinement, we avoid "club" headers by signalling
+ % with penalty of 10003 after the very first @deffn in the
+ % sequence (see above), and penalty of 10002 after any following
+ % @def command.
+ \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+ % First, check whether we are in the right environment:
+ \checkenv#1%
+ %
+ % As above, allow line break if we have multiple x headers in a row.
+ % It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty\defunpenalty % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remaining is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % How we'll format the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape.
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ % (plain.tex says that \dimen1 should be used only as global.)
+ \parshape 2 0in \dimen0 \defargsindent \dimen2
+ %
+ % Put the type name to the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% return value type
+ \ifx\temp\empty\else \tclose{\temp} \fi
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name. This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable. Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl),
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ %
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. Let's try @var for that.
+ \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+ \message{Warning: unbalanced parentheses in @def...}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \message{Warning: unbalanced square brackets in @def...}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\def\scanmacro#1{%
+ \begingroup
+ \newlinechar`\^^M
+ \let\xeatspaces\eatspaces
+ % Undo catcode changes of \startcontents and \doprintindex
+ % When called from @insertcopying or (short)caption, we need active
+ % backslash to get it printed correctly. Previously, we had
+ % \catcode`\\=\other instead. We'll see whether a problem appears
+ % with macro expansion. --kasal, 19aug04
+ \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+ % ... and \example
+ \spaceisspace
+ %
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ % I've verified that it is necessary both for e-TeX and for ordinary TeX
+ % --kasal, 29nov03
+ \scantokens{#1\endinput}%
+ \endgroup
+}
+
+\def\scanexp#1{%
+ \edef\temp{\noexpand\scanmacro{#1}}%
+ \temp
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+
+% List of all defined macros in the form
+% \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+ \toks0 = \expandafter{\macrolist\definedummyword#1}%
+ \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+% \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+ \expandafter\let
+ \csname#1\expandafter\endcsname
+ \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion. Must do this non-globally, to
+% confine the change to the current group.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\@=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+ \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
+}
+
+\def\scanargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+ \scanctxt
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ \addtomacrolist{\the\macname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\parseargdef\unmacro{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\definedummyword\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx #1\relax
+ % remove this
+ \else
+ \noexpand\definedummyword \noexpand#1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \addtomacrolist{#1}%
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references. The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross, , , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \lastsection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \atdummies % preserve commands, but don't expand them
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\lastsection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout
+ }%
+ \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual\unskip}%
+ \setbox0=\hbox{\printedrefname\unskip}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ {\indexnofonts
+ \turnoffactive
+ % This expands tokens, so do it after making catcode changes, so _
+ % etc. don't get their TeX definitions.
+ \getfilename{#4}%
+ %
+ % See comments at \activebackslashdouble.
+ {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+ \backslashparens\pdfxrefdest}%
+ %
+ \leavevmode
+ \startlink attr{/Border [0 0 0]}%
+ \ifnum\filenamelength>0
+ goto file{\the\filename.pdf} name{\pdfxrefdest}%
+ \else
+ goto name{\pdfmkpgn{\pdfxrefdest}}%
+ \fi
+ }%
+ \setcolor{\linkcolor}%
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd0 = 0pt
+ \refx{#1-snt}{}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % if the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd1 > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ {% The node name might contain 8-bit characters, which in our current
+ % implementation are changed to commands like @'e. Don't let these
+ % mess up the control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safexrefname{#1}%
+ }%
+ %
+ \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR\safexrefname\endcsname
+ % it was a float, and we have the (safe) float type in \iffloattype.
+ \expandafter\let\expandafter\floatlist
+ \csname floatlist\iffloattype\endcsname
+ %
+ % Is this the first time we've seen this float type?
+ \expandafter\ifx\floatlist\relax
+ \toks0 = {\do}% yes, so just \do
+ \else
+ % had it before, so preserve previous elements in list.
+ \toks0 = \expandafter{\floatlist\do}%
+ \fi
+ %
+ % Remember this xref in the control sequence \floatlistFLOATTYPE,
+ % for later use in \listoffloats.
+ \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+ {\safexrefname}}%
+ \fi
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readdatafile{aux}%
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\setupdatafile{%
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {%
+ \count1=128
+ \def\loop{%
+ \catcode\count1=\other
+ \advance\count1 by 1
+ \ifnum \count1<256 \loop \fi
+ }%
+ }%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+ \setupdatafile
+ \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarly, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\medskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \fi
+ %
+ % Leave vertical mode so that indentation from an enclosing
+ % environment such as @quotation is respected. On the other hand, if
+ % it's at the top level, we don't want the normal paragraph indentation.
+ \noindent
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \medskip \fi % space after the standalone image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc. We don't actually implement floating yet, we always include the
+% float "here". But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ \let\thiscaption=\empty
+ \let\thisshortcaption=\empty
+ %
+ % don't lose footnotes inside @float.
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \startsavinginserts
+ %
+ % We can't be used inside a paragraph.
+ \par
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \lastsection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\lastsection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+ %
+ % start with \parskip glue, I guess.
+ \vskip\parskip
+ %
+ % Don't suppress indentation if a float happens to start a section.
+ \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float Foo & @caption{Cap}: Foo: Cap
+% @float Foo & no caption: Foo
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\floatident = \empty
+ %
+ % In all cases, if we have a float type, it comes first.
+ \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+ %
+ % If we have an xref label, the number comes next.
+ \ifx\floatlabel\empty \else
+ \ifx\floattype\empty \else % if also had float type, need tie first.
+ \appendtomacro\floatident{\tie}%
+ \fi
+ % the number.
+ \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+ \fi
+ %
+ % Start the printed caption with what we've constructed in
+ % \floatident, but keep it separate; we need \floatident again.
+ \let\captionline = \floatident
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\floatident\empty \else
+ \appendtomacro\captionline{: }% had ident, so need a colon between
+ \fi
+ %
+ % caption text.
+ \appendtomacro\captionline{\scanexp\thiscaption}%
+ \fi
+ %
+ % If we have anything to print, print it, with space before.
+ % Eventually this needs to become an \insert.
+ \ifx\captionline\empty \else
+ \vskip.5\parskip
+ \captionline
+ %
+ % Space below caption.
+ \vskip\parskip
+ \fi
+ %
+ % If have an xref label, write the list of floats info. Do this
+ % after the caption, to avoid chance of it being a breakpoint.
+ \ifx\floatlabel\empty \else
+ % Write the text that goes in the lof to the aux file as
+ % \floatlabel-lof. Besides \floatident, we include the short
+ % caption if specified, else the full caption if specified, else nothing.
+ {%
+ \atdummies
+ %
+ % since we read the caption text in the macro world, where ^^M
+ % is turned into a normal character, we have to scan it back, so
+ % we don't write the literal three characters "^^M" into the aux file.
+ \scanexp{%
+ \xdef\noexpand\gtemp{%
+ \ifx\thisshortcaption\empty
+ \thiscaption
+ \else
+ \thisshortcaption
+ \fi
+ }%
+ }%
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ % place the captured inserts
+ %
+ % BEWARE: when the floats start floating, we have to issue warning
+ % whenever an insert appears inside a float which could possibly
+ % float. --kasal, 26may04
+ %
+ \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \lastsection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+ % Can't fully expand XR#1-lof because it can contain anything. Just
+ % pass the control sequence. On the other hand, XR#1-pg is just the
+ % page number, and we want to fully expand that so we can get a link
+ % in pdf output.
+ \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+ %
+ % use the same \entry macro we use to generate the TOC and index.
+ \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+ \writeentry
+}}
+
+
+\message{localization,}
+
+% For single-language documents, @documentlanguage is usually given very
+% early, just after @documentencoding. Single argument is the language
+% (de) or locale (de_DE) abbreviation.
+%
+{
+ \catcode`\_ = \active
+ \globaldefs=1
+\parseargdef\documentlanguage{\begingroup
+ \let_=\normalunderscore % normal _ character for filenames
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file by the name they passed if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \documentlanguagetrywithoutunderscore{#1_\finish}%
+ \else
+ \globaldefs = 1 % everything in the txi-LL files needs to persist
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup % end raw TeX
+\endgroup}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+%
+\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \globaldefs = 1 % everything in the txi-LL files needs to persist
+ \input txi-#1.tex
+ \fi
+ \closein 1
+}
+}% end of special _ catcode
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? Putting it in the current
+directory should work if nowhere else does.}
+
+% This macro is called from txi-??.tex files; the first argument is the
+% \language name to set (without the "\lang@" prefix), the second and
+% third args are \{left,right}hyphenmin.
+%
+% The language names to pass are determined when the format is built.
+% See the etex.log file created at that time, e.g.,
+% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
+%
+% With TeX Live 2008, etex now includes hyphenation patterns for all
+% available languages. This means we can support hyphenation in
+% Texinfo, at least to some extent. (This still doesn't solve the
+% accented characters problem.)
+%
+\catcode`@=11
+\def\txisetlanguage#1#2#3{%
+ % do not set the language if the name is undefined in the current TeX.
+ \expandafter\ifx\csname lang@#1\endcsname \relax
+ \message{no patterns for #1}%
+ \else
+ \global\language = \csname lang@#1\endcsname
+ \fi
+ % but there is no harm in adjusting the hyphenmin values regardless.
+ \global\lefthyphenmin = #2\relax
+ \global\righthyphenmin = #3\relax
+}
+
+% Helpers for encodings.
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \global\catcode\count255=#1\relax
+ \advance\count255 by 1
+ \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \catcode\count255=#1\relax
+ \advance\count255 by 1
+ \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\parseargdef\documentencoding{%
+ % Encoding being declared for the document.
+ \def\declaredencoding{\csname #1.enc\endcsname}%
+ %
+ % Supported encodings: names converted to tokens in order to be able
+ % to compare them with \ifx.
+ \def\ascii{\csname US-ASCII.enc\endcsname}%
+ \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+ \def\latone{\csname ISO-8859-1.enc\endcsname}%
+ \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+ \def\utfeight{\csname UTF-8.enc\endcsname}%
+ %
+ \ifx \declaredencoding \ascii
+ \asciichardefs
+ %
+ \else \ifx \declaredencoding \lattwo
+ \setnonasciicharscatcode\active
+ \lattwochardefs
+ %
+ \else \ifx \declaredencoding \latone
+ \setnonasciicharscatcode\active
+ \latonechardefs
+ %
+ \else \ifx \declaredencoding \latnine
+ \setnonasciicharscatcode\active
+ \latninechardefs
+ %
+ \else \ifx \declaredencoding \utfeight
+ \setnonasciicharscatcode\active
+ \utfeightchardefs
+ %
+ \else
+ \message{Unknown document encoding #1, ignoring.}%
+ %
+ \fi % utfeight
+ \fi % latnine
+ \fi % latone
+ \fi % lattwo
+ \fi % ascii
+}
+
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+ \gdef^^a0{~}
+ \gdef^^a1{\exclamdown}
+ \gdef^^a2{\missingcharmsg{CENT SIGN}}
+ \gdef^^a3{{\pounds}}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\missingcharmsg{YEN SIGN}}
+ \gdef^^a6{\missingcharmsg{BROKEN BAR}}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\copyright}
+ \gdef^^aa{\ordf}
+ \gdef^^ab{\guillemetleft}
+ \gdef^^ac{$\lnot$}
+ \gdef^^ad{\-}
+ \gdef^^ae{\registeredsymbol}
+ \gdef^^af{\={}}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{$\pm$}
+ \gdef^^b2{$^2$}
+ \gdef^^b3{$^3$}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{$\mu$}
+ \gdef^^b6{\P}
+ %
+ \gdef^^b7{$^.$}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{$^1$}
+ \gdef^^ba{\ordm}
+ %
+ \gdef^^bb{\guilletright}
+ \gdef^^bc{$1\over4$}
+ \gdef^^bd{$1\over2$}
+ \gdef^^be{$3\over4$}
+ \gdef^^bf{\questiondown}
+ %
+ \gdef^^c0{\`A}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\~A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\ringaccent A}
+ \gdef^^c6{\AE}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\`E}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\^E}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\`I}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\"I}
+ %
+ \gdef^^d0{\DH}
+ \gdef^^d1{\~N}
+ \gdef^^d2{\`O}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\~O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\O}
+ \gdef^^d9{\`U}
+ \gdef^^da{\'U}
+ \gdef^^db{\^U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\TH}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\`a}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\~a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\ringaccent a}
+ \gdef^^e6{\ae}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\`e}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\^e}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\`{\dotless i}}
+ \gdef^^ed{\'{\dotless i}}
+ \gdef^^ee{\^{\dotless i}}
+ \gdef^^ef{\"{\dotless i}}
+ %
+ \gdef^^f0{\dh}
+ \gdef^^f1{\~n}
+ \gdef^^f2{\`o}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\~o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\o}
+ \gdef^^f9{\`u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\^u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\th}
+ \gdef^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+ % Encoding is almost identical to Latin1.
+ \latonechardefs
+ %
+ \gdef^^a4{\euro}
+ \gdef^^a6{\v S}
+ \gdef^^a8{\v s}
+ \gdef^^b4{\v Z}
+ \gdef^^b8{\v z}
+ \gdef^^bc{\OE}
+ \gdef^^bd{\oe}
+ \gdef^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+ \gdef^^a0{~}
+ \gdef^^a1{\ogonek{A}}
+ \gdef^^a2{\u{}}
+ \gdef^^a3{\L}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\v L}
+ \gdef^^a6{\'S}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\v S}
+ \gdef^^aa{\cedilla S}
+ \gdef^^ab{\v T}
+ \gdef^^ac{\'Z}
+ \gdef^^ad{\-}
+ \gdef^^ae{\v Z}
+ \gdef^^af{\dotaccent Z}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{\ogonek{a}}
+ \gdef^^b2{\ogonek{ }}
+ \gdef^^b3{\l}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{\v l}
+ \gdef^^b6{\'s}
+ \gdef^^b7{\v{}}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{\v s}
+ \gdef^^ba{\cedilla s}
+ \gdef^^bb{\v t}
+ \gdef^^bc{\'z}
+ \gdef^^bd{\H{}}
+ \gdef^^be{\v z}
+ \gdef^^bf{\dotaccent z}
+ %
+ \gdef^^c0{\'R}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\u A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\'L}
+ \gdef^^c6{\'C}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\v C}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\ogonek{E}}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\v E}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\v D}
+ %
+ \gdef^^d0{\DH}
+ \gdef^^d1{\'N}
+ \gdef^^d2{\v N}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\H O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\v R}
+ \gdef^^d9{\ringaccent U}
+ \gdef^^da{\'U}
+ \gdef^^db{\H U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\cedilla T}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\'r}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\u a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\'l}
+ \gdef^^e6{\'c}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\v c}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\ogonek{e}}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\v e}
+ \gdef^^ed{\'\i}
+ \gdef^^ee{\^\i}
+ \gdef^^ef{\v d}
+ %
+ \gdef^^f0{\dh}
+ \gdef^^f1{\'n}
+ \gdef^^f2{\v n}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\H o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\v r}
+ \gdef^^f9{\ringaccent u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\H u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\cedilla t}
+ \gdef^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions. It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+ \ifx #1\relax
+ \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+ \else
+ \expandafter #1%
+ \fi
+}
+
+\begingroup
+ \catcode`\~13
+ \catcode`\"12
+
+ \def\UTFviiiLoop{%
+ \global\catcode\countUTFx\active
+ \uccode`\~\countUTFx
+ \uppercase\expandafter{\UTFviiiTmp}%
+ \advance\countUTFx by 1
+ \ifnum\countUTFx < \countUTFy
+ \expandafter\UTFviiiLoop
+ \fi}
+
+ \countUTFx = "C2
+ \countUTFy = "E0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "E0
+ \countUTFy = "F0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "F0
+ \countUTFy = "F4
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiFourOctets\string~}}
+ \UTFviiiLoop
+\endgroup
+
+\begingroup
+ \catcode`\"=12
+ \catcode`\<=12
+ \catcode`\.=12
+ \catcode`\,=12
+ \catcode`\;=12
+ \catcode`\!=12
+ \catcode`\~=13
+
+ \gdef\DeclareUnicodeCharacter#1#2{%
+ \countUTFz = "#1\relax
+ \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
+ \begingroup
+ \parseXMLCharref
+ \def\UTFviiiTwoOctets##1##2{%
+ \csname u8:##1\string ##2\endcsname}%
+ \def\UTFviiiThreeOctets##1##2##3{%
+ \csname u8:##1\string ##2\string ##3\endcsname}%
+ \def\UTFviiiFourOctets##1##2##3##4{%
+ \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter
+ \gdef\UTFviiiTmp{#2}%
+ \endgroup}
+
+ \gdef\parseXMLCharref{%
+ \ifnum\countUTFz < "A0\relax
+ \errhelp = \EMsimple
+ \errmessage{Cannot define Unicode char value < 00A0}%
+ \else\ifnum\countUTFz < "800\relax
+ \parseUTFviiiA,%
+ \parseUTFviiiB C\UTFviiiTwoOctets.,%
+ \else\ifnum\countUTFz < "10000\relax
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+ \else
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiA!%
+ \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+ \fi\fi\fi
+ }
+
+ \gdef\parseUTFviiiA#1{%
+ \countUTFx = \countUTFz
+ \divide\countUTFz by 64
+ \countUTFy = \countUTFz
+ \multiply\countUTFz by 64
+ \advance\countUTFx by -\countUTFz
+ \advance\countUTFx by 128
+ \uccode `#1\countUTFx
+ \countUTFz = \countUTFy}
+
+ \gdef\parseUTFviiiB#1#2#3#4{%
+ \advance\countUTFz by "#10\relax
+ \uccode `#3\countUTFz
+ \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+\def\utfeightchardefs{%
+ \DeclareUnicodeCharacter{00A0}{\tie}
+ \DeclareUnicodeCharacter{00A1}{\exclamdown}
+ \DeclareUnicodeCharacter{00A3}{\pounds}
+ \DeclareUnicodeCharacter{00A8}{\"{ }}
+ \DeclareUnicodeCharacter{00A9}{\copyright}
+ \DeclareUnicodeCharacter{00AA}{\ordf}
+ \DeclareUnicodeCharacter{00AB}{\guillemetleft}
+ \DeclareUnicodeCharacter{00AD}{\-}
+ \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
+ \DeclareUnicodeCharacter{00AF}{\={ }}
+
+ \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
+ \DeclareUnicodeCharacter{00B4}{\'{ }}
+ \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
+ \DeclareUnicodeCharacter{00BA}{\ordm}
+ \DeclareUnicodeCharacter{00BB}{\guillemetright}
+ \DeclareUnicodeCharacter{00BF}{\questiondown}
+
+ \DeclareUnicodeCharacter{00C0}{\`A}
+ \DeclareUnicodeCharacter{00C1}{\'A}
+ \DeclareUnicodeCharacter{00C2}{\^A}
+ \DeclareUnicodeCharacter{00C3}{\~A}
+ \DeclareUnicodeCharacter{00C4}{\"A}
+ \DeclareUnicodeCharacter{00C5}{\AA}
+ \DeclareUnicodeCharacter{00C6}{\AE}
+ \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
+ \DeclareUnicodeCharacter{00C8}{\`E}
+ \DeclareUnicodeCharacter{00C9}{\'E}
+ \DeclareUnicodeCharacter{00CA}{\^E}
+ \DeclareUnicodeCharacter{00CB}{\"E}
+ \DeclareUnicodeCharacter{00CC}{\`I}
+ \DeclareUnicodeCharacter{00CD}{\'I}
+ \DeclareUnicodeCharacter{00CE}{\^I}
+ \DeclareUnicodeCharacter{00CF}{\"I}
+
+ \DeclareUnicodeCharacter{00D0}{\DH}
+ \DeclareUnicodeCharacter{00D1}{\~N}
+ \DeclareUnicodeCharacter{00D2}{\`O}
+ \DeclareUnicodeCharacter{00D3}{\'O}
+ \DeclareUnicodeCharacter{00D4}{\^O}
+ \DeclareUnicodeCharacter{00D5}{\~O}
+ \DeclareUnicodeCharacter{00D6}{\"O}
+ \DeclareUnicodeCharacter{00D8}{\O}
+ \DeclareUnicodeCharacter{00D9}{\`U}
+ \DeclareUnicodeCharacter{00DA}{\'U}
+ \DeclareUnicodeCharacter{00DB}{\^U}
+ \DeclareUnicodeCharacter{00DC}{\"U}
+ \DeclareUnicodeCharacter{00DD}{\'Y}
+ \DeclareUnicodeCharacter{00DE}{\TH}
+ \DeclareUnicodeCharacter{00DF}{\ss}
+
+ \DeclareUnicodeCharacter{00E0}{\`a}
+ \DeclareUnicodeCharacter{00E1}{\'a}
+ \DeclareUnicodeCharacter{00E2}{\^a}
+ \DeclareUnicodeCharacter{00E3}{\~a}
+ \DeclareUnicodeCharacter{00E4}{\"a}
+ \DeclareUnicodeCharacter{00E5}{\aa}
+ \DeclareUnicodeCharacter{00E6}{\ae}
+ \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
+ \DeclareUnicodeCharacter{00E8}{\`e}
+ \DeclareUnicodeCharacter{00E9}{\'e}
+ \DeclareUnicodeCharacter{00EA}{\^e}
+ \DeclareUnicodeCharacter{00EB}{\"e}
+ \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
+ \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{00F0}{\dh}
+ \DeclareUnicodeCharacter{00F1}{\~n}
+ \DeclareUnicodeCharacter{00F2}{\`o}
+ \DeclareUnicodeCharacter{00F3}{\'o}
+ \DeclareUnicodeCharacter{00F4}{\^o}
+ \DeclareUnicodeCharacter{00F5}{\~o}
+ \DeclareUnicodeCharacter{00F6}{\"o}
+ \DeclareUnicodeCharacter{00F8}{\o}
+ \DeclareUnicodeCharacter{00F9}{\`u}
+ \DeclareUnicodeCharacter{00FA}{\'u}
+ \DeclareUnicodeCharacter{00FB}{\^u}
+ \DeclareUnicodeCharacter{00FC}{\"u}
+ \DeclareUnicodeCharacter{00FD}{\'y}
+ \DeclareUnicodeCharacter{00FE}{\th}
+ \DeclareUnicodeCharacter{00FF}{\"y}
+
+ \DeclareUnicodeCharacter{0100}{\=A}
+ \DeclareUnicodeCharacter{0101}{\=a}
+ \DeclareUnicodeCharacter{0102}{\u{A}}
+ \DeclareUnicodeCharacter{0103}{\u{a}}
+ \DeclareUnicodeCharacter{0104}{\ogonek{A}}
+ \DeclareUnicodeCharacter{0105}{\ogonek{a}}
+ \DeclareUnicodeCharacter{0106}{\'C}
+ \DeclareUnicodeCharacter{0107}{\'c}
+ \DeclareUnicodeCharacter{0108}{\^C}
+ \DeclareUnicodeCharacter{0109}{\^c}
+ \DeclareUnicodeCharacter{0118}{\ogonek{E}}
+ \DeclareUnicodeCharacter{0119}{\ogonek{e}}
+ \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
+ \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
+ \DeclareUnicodeCharacter{010C}{\v{C}}
+ \DeclareUnicodeCharacter{010D}{\v{c}}
+ \DeclareUnicodeCharacter{010E}{\v{D}}
+
+ \DeclareUnicodeCharacter{0112}{\=E}
+ \DeclareUnicodeCharacter{0113}{\=e}
+ \DeclareUnicodeCharacter{0114}{\u{E}}
+ \DeclareUnicodeCharacter{0115}{\u{e}}
+ \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
+ \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
+ \DeclareUnicodeCharacter{011A}{\v{E}}
+ \DeclareUnicodeCharacter{011B}{\v{e}}
+ \DeclareUnicodeCharacter{011C}{\^G}
+ \DeclareUnicodeCharacter{011D}{\^g}
+ \DeclareUnicodeCharacter{011E}{\u{G}}
+ \DeclareUnicodeCharacter{011F}{\u{g}}
+
+ \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
+ \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
+ \DeclareUnicodeCharacter{0124}{\^H}
+ \DeclareUnicodeCharacter{0125}{\^h}
+ \DeclareUnicodeCharacter{0128}{\~I}
+ \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
+ \DeclareUnicodeCharacter{012A}{\=I}
+ \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
+ \DeclareUnicodeCharacter{012C}{\u{I}}
+ \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
+ \DeclareUnicodeCharacter{0131}{\dotless{i}}
+ \DeclareUnicodeCharacter{0132}{IJ}
+ \DeclareUnicodeCharacter{0133}{ij}
+ \DeclareUnicodeCharacter{0134}{\^J}
+ \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
+ \DeclareUnicodeCharacter{0139}{\'L}
+ \DeclareUnicodeCharacter{013A}{\'l}
+
+ \DeclareUnicodeCharacter{0141}{\L}
+ \DeclareUnicodeCharacter{0142}{\l}
+ \DeclareUnicodeCharacter{0143}{\'N}
+ \DeclareUnicodeCharacter{0144}{\'n}
+ \DeclareUnicodeCharacter{0147}{\v{N}}
+ \DeclareUnicodeCharacter{0148}{\v{n}}
+ \DeclareUnicodeCharacter{014C}{\=O}
+ \DeclareUnicodeCharacter{014D}{\=o}
+ \DeclareUnicodeCharacter{014E}{\u{O}}
+ \DeclareUnicodeCharacter{014F}{\u{o}}
+
+ \DeclareUnicodeCharacter{0150}{\H{O}}
+ \DeclareUnicodeCharacter{0151}{\H{o}}
+ \DeclareUnicodeCharacter{0152}{\OE}
+ \DeclareUnicodeCharacter{0153}{\oe}
+ \DeclareUnicodeCharacter{0154}{\'R}
+ \DeclareUnicodeCharacter{0155}{\'r}
+ \DeclareUnicodeCharacter{0158}{\v{R}}
+ \DeclareUnicodeCharacter{0159}{\v{r}}
+ \DeclareUnicodeCharacter{015A}{\'S}
+ \DeclareUnicodeCharacter{015B}{\'s}
+ \DeclareUnicodeCharacter{015C}{\^S}
+ \DeclareUnicodeCharacter{015D}{\^s}
+ \DeclareUnicodeCharacter{015E}{\cedilla{S}}
+ \DeclareUnicodeCharacter{015F}{\cedilla{s}}
+
+ \DeclareUnicodeCharacter{0160}{\v{S}}
+ \DeclareUnicodeCharacter{0161}{\v{s}}
+ \DeclareUnicodeCharacter{0162}{\cedilla{t}}
+ \DeclareUnicodeCharacter{0163}{\cedilla{T}}
+ \DeclareUnicodeCharacter{0164}{\v{T}}
+
+ \DeclareUnicodeCharacter{0168}{\~U}
+ \DeclareUnicodeCharacter{0169}{\~u}
+ \DeclareUnicodeCharacter{016A}{\=U}
+ \DeclareUnicodeCharacter{016B}{\=u}
+ \DeclareUnicodeCharacter{016C}{\u{U}}
+ \DeclareUnicodeCharacter{016D}{\u{u}}
+ \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
+ \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
+
+ \DeclareUnicodeCharacter{0170}{\H{U}}
+ \DeclareUnicodeCharacter{0171}{\H{u}}
+ \DeclareUnicodeCharacter{0174}{\^W}
+ \DeclareUnicodeCharacter{0175}{\^w}
+ \DeclareUnicodeCharacter{0176}{\^Y}
+ \DeclareUnicodeCharacter{0177}{\^y}
+ \DeclareUnicodeCharacter{0178}{\"Y}
+ \DeclareUnicodeCharacter{0179}{\'Z}
+ \DeclareUnicodeCharacter{017A}{\'z}
+ \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
+ \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
+ \DeclareUnicodeCharacter{017D}{\v{Z}}
+ \DeclareUnicodeCharacter{017E}{\v{z}}
+
+ \DeclareUnicodeCharacter{01C4}{D\v{Z}}
+ \DeclareUnicodeCharacter{01C5}{D\v{z}}
+ \DeclareUnicodeCharacter{01C6}{d\v{z}}
+ \DeclareUnicodeCharacter{01C7}{LJ}
+ \DeclareUnicodeCharacter{01C8}{Lj}
+ \DeclareUnicodeCharacter{01C9}{lj}
+ \DeclareUnicodeCharacter{01CA}{NJ}
+ \DeclareUnicodeCharacter{01CB}{Nj}
+ \DeclareUnicodeCharacter{01CC}{nj}
+ \DeclareUnicodeCharacter{01CD}{\v{A}}
+ \DeclareUnicodeCharacter{01CE}{\v{a}}
+ \DeclareUnicodeCharacter{01CF}{\v{I}}
+
+ \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
+ \DeclareUnicodeCharacter{01D1}{\v{O}}
+ \DeclareUnicodeCharacter{01D2}{\v{o}}
+ \DeclareUnicodeCharacter{01D3}{\v{U}}
+ \DeclareUnicodeCharacter{01D4}{\v{u}}
+
+ \DeclareUnicodeCharacter{01E2}{\={\AE}}
+ \DeclareUnicodeCharacter{01E3}{\={\ae}}
+ \DeclareUnicodeCharacter{01E6}{\v{G}}
+ \DeclareUnicodeCharacter{01E7}{\v{g}}
+ \DeclareUnicodeCharacter{01E8}{\v{K}}
+ \DeclareUnicodeCharacter{01E9}{\v{k}}
+
+ \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
+ \DeclareUnicodeCharacter{01F1}{DZ}
+ \DeclareUnicodeCharacter{01F2}{Dz}
+ \DeclareUnicodeCharacter{01F3}{dz}
+ \DeclareUnicodeCharacter{01F4}{\'G}
+ \DeclareUnicodeCharacter{01F5}{\'g}
+ \DeclareUnicodeCharacter{01F8}{\`N}
+ \DeclareUnicodeCharacter{01F9}{\`n}
+ \DeclareUnicodeCharacter{01FC}{\'{\AE}}
+ \DeclareUnicodeCharacter{01FD}{\'{\ae}}
+ \DeclareUnicodeCharacter{01FE}{\'{\O}}
+ \DeclareUnicodeCharacter{01FF}{\'{\o}}
+
+ \DeclareUnicodeCharacter{021E}{\v{H}}
+ \DeclareUnicodeCharacter{021F}{\v{h}}
+
+ \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
+ \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
+ \DeclareUnicodeCharacter{0228}{\cedilla{E}}
+ \DeclareUnicodeCharacter{0229}{\cedilla{e}}
+ \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
+ \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
+
+ \DeclareUnicodeCharacter{0232}{\=Y}
+ \DeclareUnicodeCharacter{0233}{\=y}
+ \DeclareUnicodeCharacter{0237}{\dotless{j}}
+
+ \DeclareUnicodeCharacter{02DB}{\ogonek{ }}
+
+ \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
+ \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
+ \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
+ \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
+ \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
+ \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
+ \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
+ \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
+ \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
+ \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
+ \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
+ \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
+
+ \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
+ \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
+
+ \DeclareUnicodeCharacter{1E20}{\=G}
+ \DeclareUnicodeCharacter{1E21}{\=g}
+ \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
+ \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
+ \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
+ \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
+ \DeclareUnicodeCharacter{1E26}{\"H}
+ \DeclareUnicodeCharacter{1E27}{\"h}
+
+ \DeclareUnicodeCharacter{1E30}{\'K}
+ \DeclareUnicodeCharacter{1E31}{\'k}
+ \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
+ \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
+ \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
+ \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
+ \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
+ \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
+ \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
+ \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
+ \DeclareUnicodeCharacter{1E3E}{\'M}
+ \DeclareUnicodeCharacter{1E3F}{\'m}
+
+ \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
+ \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
+ \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
+ \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
+ \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
+ \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
+ \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
+ \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
+ \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
+ \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
+
+ \DeclareUnicodeCharacter{1E54}{\'P}
+ \DeclareUnicodeCharacter{1E55}{\'p}
+ \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
+ \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
+ \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
+ \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
+ \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
+ \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
+ \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
+ \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
+
+ \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
+ \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
+ \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
+ \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
+ \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
+ \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
+ \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
+ \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
+ \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
+ \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
+
+ \DeclareUnicodeCharacter{1E7C}{\~V}
+ \DeclareUnicodeCharacter{1E7D}{\~v}
+ \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
+ \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
+
+ \DeclareUnicodeCharacter{1E80}{\`W}
+ \DeclareUnicodeCharacter{1E81}{\`w}
+ \DeclareUnicodeCharacter{1E82}{\'W}
+ \DeclareUnicodeCharacter{1E83}{\'w}
+ \DeclareUnicodeCharacter{1E84}{\"W}
+ \DeclareUnicodeCharacter{1E85}{\"w}
+ \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
+ \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
+ \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
+ \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
+ \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
+ \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
+ \DeclareUnicodeCharacter{1E8C}{\"X}
+ \DeclareUnicodeCharacter{1E8D}{\"x}
+ \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
+ \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
+
+ \DeclareUnicodeCharacter{1E90}{\^Z}
+ \DeclareUnicodeCharacter{1E91}{\^z}
+ \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
+ \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
+ \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
+ \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
+ \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
+ \DeclareUnicodeCharacter{1E97}{\"t}
+ \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
+ \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
+
+ \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
+ \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
+
+ \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
+ \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
+ \DeclareUnicodeCharacter{1EBC}{\~E}
+ \DeclareUnicodeCharacter{1EBD}{\~e}
+
+ \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
+ \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
+ \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
+ \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
+
+ \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
+ \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
+
+ \DeclareUnicodeCharacter{1EF2}{\`Y}
+ \DeclareUnicodeCharacter{1EF3}{\`y}
+ \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
+
+ \DeclareUnicodeCharacter{1EF8}{\~Y}
+ \DeclareUnicodeCharacter{1EF9}{\~y}
+
+ \DeclareUnicodeCharacter{2013}{--}
+ \DeclareUnicodeCharacter{2014}{---}
+ \DeclareUnicodeCharacter{2018}{\quoteleft}
+ \DeclareUnicodeCharacter{2019}{\quoteright}
+ \DeclareUnicodeCharacter{201A}{\quotesinglbase}
+ \DeclareUnicodeCharacter{201C}{\quotedblleft}
+ \DeclareUnicodeCharacter{201D}{\quotedblright}
+ \DeclareUnicodeCharacter{201E}{\quotedblbase}
+ \DeclareUnicodeCharacter{2022}{\bullet}
+ \DeclareUnicodeCharacter{2026}{\dots}
+ \DeclareUnicodeCharacter{2039}{\guilsinglleft}
+ \DeclareUnicodeCharacter{203A}{\guilsinglright}
+ \DeclareUnicodeCharacter{20AC}{\euro}
+
+ \DeclareUnicodeCharacter{2192}{\expansion}
+ \DeclareUnicodeCharacter{21D2}{\result}
+
+ \DeclareUnicodeCharacter{2212}{\minus}
+ \DeclareUnicodeCharacter{2217}{\point}
+ \DeclareUnicodeCharacter{2261}{\equiv}
+}% end of \utfeightchardefs
+
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+ \relax
+}
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ % if we don't reset these, they will remain at "1 true in" of
+ % whatever layout pdftex was dumped with.
+ \pdfhorigin = 1 true in
+ \pdfvorigin = 1 true in
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{607.2pt}{6in}% that's 46 lines
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {-.2in}{0in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+ \parskip = 1.5pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.4in}{4.8in}%
+ {-.2in}{-.4in}%
+ {0pt}{14pt}%
+ {9in}{6in}%
+ %
+ \lispnarrowing = 0.25in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{673.2pt}{160mm}% that's 51 lines
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1\relax
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% DEL is a comment character, in case @c does not suffice.
+\catcode`\^^? = 14
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+ \normalturnoffactive
+ \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active
+@def@normalbackslash{{@tt@backslashcurfont}}
+% On startup, @fixbackslash assigns:
+% @let \ = @normalbackslash
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+@def@normalturnoffactive{%
+ @let\=@normalbackslash
+ @let"=@normaldoublequote
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+ @markupsetuplqdefault
+ @markupsetuprqdefault
+ @unsepspaces
+}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\' in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+@c Finally, make ` and ' active, so that txicodequoteundirected and
+@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we
+@c don't make ` and ' active, @code will not get them as active chars.
+@c Do this last of all since we use ` in the previous @catcode assignments.
+@catcode`@'=@active
+@catcode`@`=@active
+@markupsetuplqdefault
+@markupsetuprqdefault
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/gnulib/build-aux/unused-parameter.h b/gnulib/build-aux/unused-parameter.h
new file mode 100644
index 00000000..d0fe655c
--- /dev/null
+++ b/gnulib/build-aux/unused-parameter.h
@@ -0,0 +1,36 @@
+/* A C macro for declaring that specific function parameters are not used.
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* _GL_UNUSED_PARAMETER is a marker that can be appended to function parameter
+ declarations for parameters that are not used. This helps to reduce
+ warnings, such as from GCC -Wunused-parameter. The syntax is as follows:
+ type param _GL_UNUSED_PARAMETER
+ or more generally
+ param_decl _GL_UNUSED_PARAMETER
+ For example:
+ int param _GL_UNUSED_PARAMETER
+ int *(*param)(void) _GL_UNUSED_PARAMETER
+ Other possible, but obscure and discouraged syntaxes:
+ int _GL_UNUSED_PARAMETER *(*param)(void)
+ _GL_UNUSED_PARAMETER int *(*param)(void)
+ */
+#ifndef _GL_UNUSED_PARAMETER
+# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_UNUSED_PARAMETER __attribute__ ((__unused__))
+# else
+# define _GL_UNUSED_PARAMETER
+# endif
+#endif
diff --git a/gnulib/build-aux/update-copyright b/gnulib/build-aux/update-copyright
new file mode 100755
index 00000000..28ff4418
--- /dev/null
+++ b/gnulib/build-aux/update-copyright
@@ -0,0 +1,266 @@
+eval '(exit $?0)' && eval 'exec perl -wS -0777 -pi "$0" ${1+"$@"}'
+ & eval 'exec perl -wS -0777 -pi "$0" $argv:q'
+ if 0;
+# Update an FSF copyright year list to include the current year.
+
+my $VERSION = '2009-12-28.11:09'; # UTC
+
+# Copyright (C) 2009-2010 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, 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/>.
+
+# Written by Jim Meyering and Joel E. Denny
+
+# The arguments to this script should be names of files that contain FSF
+# copyright statements to be updated. For example, you might wish to
+# use the update-copyright target rule in maint.mk from gnulib's
+# maintainer-makefile module.
+#
+# Iff an FSF copyright statement is recognized in a file and the final
+# year is not the current year, then the statement is updated for the
+# new year and it is reformatted to:
+#
+# 1. Fit within 72 columns.
+# 2. Convert 2-digit years to 4-digit years by prepending "19".
+# 3. Expand copyright year intervals. (See "Environment variables"
+# below.)
+#
+# A warning is printed for every file for which no FSF copyright
+# statement is recognized.
+#
+# Each file's FSF copyright statement must be formated correctly in
+# order to be recognized. For example, each of these is fine:
+#
+# Copyright @copyright{} 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+#
+# # Copyright (C) 1990-2005, 2007-2009 Free Software
+# # Foundation, Inc.
+#
+# /*
+# * Copyright &copy; 90,2005,2007-2009
+# * Free Software Foundation, Inc.
+# */
+#
+# However, the following format is not recognized because the line
+# prefix changes after the first line:
+#
+# ## Copyright (C) 1990-2005, 2007-2009 Free Software
+# # Foundation, Inc.
+#
+# The following copyright statement is not recognized because the
+# copyright holder is not the FSF:
+#
+# Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+#
+# However, any correctly formatted FSF copyright statement following
+# either of the previous two copyright statements would be recognized.
+#
+# The exact conditions that a file's FSF copyright statement must meet
+# to be recognized are:
+#
+# 1. It is the first FSF copyright statement that meets all of the
+# following conditions. Subsequent FSF copyright statements are
+# ignored.
+# 2. Its format is "Copyright (C)", then a list of copyright years,
+# and then the name of the copyright holder, which is "Free
+# Software Foundation, Inc.".
+# 3. The "(C)" takes one of the following forms or is omitted
+# entirely:
+#
+# A. (C)
+# B. (c)
+# C. @copyright{}
+# D. &copy;
+#
+# 4. The "Copyright" appears at the beginning of a line except that it
+# may be prefixed by any sequence (e.g., a comment) of no more than
+# 5 characters.
+# 5. Iff such a prefix is present, the same prefix appears at the
+# beginning of each remaining line within the FSF copyright
+# statement. There is one exception in order to support C-style
+# comments: if the first line's prefix contains nothing but
+# whitespace surrounding a "/*", then the prefix for all subsequent
+# lines is the same as the first line's prefix except with each of
+# "/" and possibly "*" replaced by a " ". The replacement of "*"
+# by " " is consistent throughout all subsequent lines.
+# 6. Blank lines, even if preceded by the prefix, do not appear
+# within the FSF copyright statement.
+# 7. Each copyright year is 2 or 4 digits, and years are separated by
+# commas or dashes. Whitespace may appear after commas.
+#
+# Environment variables:
+#
+# 1. If UPDATE_COPYRIGHT_FORCE=1, a recognized FSF copyright statement
+# is reformatted even if it does not need updating for the new
+# year. If unset or set to 0, only updated FSF copyright
+# statements are reformatted.
+# 2. If UPDATE_COPYRIGHT_USE_INTERVALS=1, every series of consecutive
+# copyright years (such as 90, 1991, 1992-2007, 2008) in a
+# reformatted FSF copyright statement is collapsed to a single
+# interval (such as 1990-2008). If unset or set to 0, all existing
+# copyright year intervals in a reformatted FSF copyright statement
+# are expanded instead.
+# 3. For testing purposes, you can set the assumed current year in
+# UPDATE_COPYRIGHT_YEAR.
+# 4. The default maximum line length for a copyright line is 72.
+# Set UPDATE_COPYRIGHT_MAX_LINE_LENGTH to use a different length.
+
+use strict;
+use warnings;
+
+my $copyright_re = 'Copyright';
+my $circle_c_re = '(?:\([cC]\)|@copyright{}|&copy;)';
+my $holder = 'Free Software Foundation, Inc.';
+my $prefix_max = 5;
+my $margin = $ENV{UPDATE_COPYRIGHT_MAX_LINE_LENGTH};
+!$margin || $margin !~ m/^\d+$/
+ and $margin = 72;
+
+my $tab_width = 8;
+
+my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR};
+if (!$this_year || $this_year !~ m/^\d{4}$/)
+ {
+ my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ());
+ $this_year = $year + 1900;
+ }
+
+# Unless the file consistently uses "\r\n" as the EOL, use "\n" instead.
+my $eol = /(?:^|[^\r])\n/ ? "\n" : "\r\n";
+
+my $leading;
+my $prefix;
+my $ws_re;
+my $stmt_re;
+while (/(^|\n)(.{0,$prefix_max})$copyright_re/g)
+ {
+ $leading = "$1$2";
+ $prefix = $2;
+ if ($prefix =~ /^(\s*\/)\*(\s*)$/)
+ {
+ $prefix =~ s,/, ,;
+ my $prefix_ws = $prefix;
+ $prefix_ws =~ s/\*/ /; # Only whitespace.
+ if (/\G(?:[^*\n]|\*[^\/\n])*\*?\n$prefix_ws/)
+ {
+ $prefix = $prefix_ws;
+ }
+ }
+ $ws_re = '[ \t\r\f]'; # \s without \n
+ $ws_re =
+ "(?:$ws_re*(?:$ws_re|\\n" . quotemeta($prefix) . ")$ws_re*)";
+ my $holder_re = $holder;
+ $holder_re =~ s/\s/$ws_re/g;
+ my $stmt_remainder_re =
+ "(?:$ws_re$circle_c_re)?"
+ . "$ws_re(?:(?:\\d\\d)?\\d\\d(?:,$ws_re?|-))*"
+ . "((?:\\d\\d)?\\d\\d)$ws_re$holder_re";
+ if (/\G$stmt_remainder_re/)
+ {
+ $stmt_re =
+ quotemeta($leading) . "($copyright_re$stmt_remainder_re)";
+ last;
+ }
+ }
+if (defined $stmt_re)
+ {
+ /$stmt_re/ or die; # Should never die.
+ my $stmt = $1;
+ my $final_year_orig = $2;
+
+ # Handle two-digit year numbers like "98" and "99".
+ my $final_year = $final_year_orig;
+ $final_year <= 99
+ and $final_year += 1900;
+
+ if ($final_year != $this_year)
+ {
+ # Update the year.
+ $stmt =~ s/$final_year_orig/$final_year, $this_year/;
+ }
+ if ($final_year != $this_year || $ENV{'UPDATE_COPYRIGHT_FORCE'})
+ {
+ # Normalize all whitespace including newline-prefix sequences.
+ $stmt =~ s/$ws_re/ /g;
+
+ # Put spaces after commas.
+ $stmt =~ s/, ?/, /g;
+
+ # Convert 2-digit to 4-digit years.
+ $stmt =~ s/(\b\d\d\b)/19$1/g;
+
+ # Make the use of intervals consistent.
+ if (!$ENV{UPDATE_COPYRIGHT_USE_INTERVALS})
+ {
+ $stmt =~ s/(\d{4})-(\d{4})/join(', ', $1..$2)/eg;
+ }
+ else
+ {
+ $stmt =~
+ s/
+ (\d{4})
+ (?:
+ (,\ |-)
+ ((??{
+ if ($2 eq '-') { '\d{4}'; }
+ elsif (!$3) { $1 + 1; }
+ else { $3 + 1; }
+ }))
+ )+
+ /$1-$3/gx;
+ }
+
+ # Format within margin.
+ my $stmt_wrapped;
+ my $text_margin = $margin - length($prefix);
+ if ($prefix =~ /^(\t+)/)
+ {
+ $text_margin -= length($1) * ($tab_width - 1);
+ }
+ while (length $stmt)
+ {
+ if (($stmt =~ s/^(.{1,$text_margin})(?: |$)//)
+ || ($stmt =~ s/^([\S]+)(?: |$)//))
+ {
+ my $line = $1;
+ $stmt_wrapped .= $stmt_wrapped ? "$eol$prefix" : $leading;
+ $stmt_wrapped .= $line;
+ }
+ else
+ {
+ # Should be unreachable, but we don't want an infinite
+ # loop if it can be reached.
+ die;
+ }
+ }
+
+ # Replace the old copyright statement.
+ s/$stmt_re/$stmt_wrapped/;
+ }
+ }
+else
+ {
+ print STDERR "$ARGV: warning: FSF copyright statement not found\n";
+ }
+
+# Local variables:
+# mode: perl
+# indent-tabs-mode: nil
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "my $VERSION = '"
+# time-stamp-format: "%:y-%02m-%02d.%02H:%02M"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "'; # UTC"
+# End:
diff --git a/gnulib/build-aux/useless-if-before-free b/gnulib/build-aux/useless-if-before-free
new file mode 100755
index 00000000..6aa7d396
--- /dev/null
+++ b/gnulib/build-aux/useless-if-before-free
@@ -0,0 +1,209 @@
+eval '(exit $?0)' && eval 'exec perl -wST "$0" ${1+"$@"}'
+ & eval 'exec perl -wST "$0" $argv:q'
+ if 0;
+# Detect instances of "if (p) free (p);".
+# Likewise for "if (p != NULL) free (p);". And with braces.
+# Also detect "if (NULL != p) free (p);".
+# And with 0 in place of NULL.
+
+my $VERSION = '2009-04-16 15:57'; # UTC
+# The definition above must lie within the first 8 lines in order
+# for the Emacs time-stamp write hook (at end) to update it.
+# If you change this file with Emacs, please let the write hook
+# do its job. Otherwise, update this string manually.
+
+# Copyright (C) 2008-2010 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/>.
+
+# Written by Jim Meyering
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+(my $ME = $0) =~ s|.*/||;
+
+# use File::Coda; # http://meyering.net/code/Coda/
+END {
+ defined fileno STDOUT or return;
+ close STDOUT and return;
+ warn "$ME: failed to close standard output: $!\n";
+ $? ||= 1;
+}
+
+sub usage ($)
+{
+ my ($exit_code) = @_;
+ my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
+ if ($exit_code != 0)
+ {
+ print $STREAM "Try `$ME --help' for more information.\n";
+ }
+ else
+ {
+ print $STREAM <<EOF;
+Usage: $ME [OPTIONS] FILE...
+
+Detect any instance in FILE of a useless "if" test before a free call, e.g.,
+"if (p) free (p);". Any such test may be safely removed without affecting
+the semantics of the C code in FILE. Use --name=FOO --name=BAR to also
+detect free-like functions named FOO and BAR.
+
+OPTIONS:
+
+ --list print only the name of each matching FILE (\0-terminated)
+ --name=N add name N to the list of \`free\'-like functions to detect;
+ may be repeated
+
+ --help display this help and exit
+ --version output version information and exit
+
+Exit status:
+
+ 0 one or more matches
+ 1 no match
+ 2 an error
+
+EXAMPLE:
+
+For example, this command prints all removable "if" tests before "free"
+and "kfree" calls in the linux kernel sources:
+
+ git ls-files -z |xargs -0 $ME --name=kfree
+
+EOF
+ }
+ exit $exit_code;
+}
+
+sub is_NULL ($)
+{
+ my ($expr) = @_;
+ return ($expr eq 'NULL' || $expr eq '0');
+}
+
+{
+ sub EXIT_MATCH {0}
+ sub EXIT_NO_MATCH {1}
+ sub EXIT_ERROR {2}
+ my $err = EXIT_NO_MATCH;
+
+ my $list;
+ my @name = qw(free);
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ list => \$list,
+ 'name=s@' => \@name,
+ ) or usage 1;
+
+ # Make sure we have the right number of non-option arguments.
+ # Always tell the user why we fail.
+ @ARGV < 1
+ and (warn "$ME: missing FILE argument\n"), usage EXIT_ERROR;
+
+ my $or = join '|', @name;
+ my $regexp = qr/(?:$or)/;
+
+ # Set the input record separator.
+ # Note: this makes it impractical to print line numbers.
+ $/ = '"';
+
+ my $found_match = 0;
+ FILE:
+ foreach my $file (@ARGV)
+ {
+ open FH, '<', $file
+ or (warn "$ME: can't open `$file' for reading: $!\n"),
+ $err = EXIT_ERROR, next;
+ while (defined (my $line = <FH>))
+ {
+ while ($line =~
+ /\b(if\s*\(\s*([^)]+?)(?:\s*!=\s*([^)]+?))?\s*\)
+ # 1 2 3
+ (?: \s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)|
+ \s*\{\s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;\s*\}))/sxg)
+ {
+ my $all = $1;
+ my ($lhs, $rhs) = ($2, $3);
+ my ($free_opnd, $braced_free_opnd) = ($4, $5);
+ my $non_NULL;
+ if (!defined $rhs) { $non_NULL = $lhs }
+ elsif (is_NULL $rhs) { $non_NULL = $lhs }
+ elsif (is_NULL $lhs) { $non_NULL = $rhs }
+ else { next }
+
+ # Compare the non-NULL part of the "if" expression and the
+ # free'd expression, without regard to white space.
+ $non_NULL =~ tr/ \t//d;
+ my $e2 = defined $free_opnd ? $free_opnd : $braced_free_opnd;
+ $e2 =~ tr/ \t//d;
+ if ($non_NULL eq $e2)
+ {
+ $found_match = 1;
+ $list
+ and (print "$file\0"), next FILE;
+ print "$file: $all\n";
+ }
+ }
+ }
+ }
+ continue
+ {
+ close FH;
+ }
+
+ $found_match && $err == EXIT_NO_MATCH
+ and $err = EXIT_MATCH;
+
+ exit $err;
+}
+
+my $foo = <<'EOF';
+# The above is to *find* them.
+# This adjusts them, removing the unnecessary "if (p)" part.
+
+# FIXME: do something like this as an option (doesn't do braces):
+free=xfree
+git grep -l -z "$free *(" \
+ | xargs -0 useless-if-before-free -l --name="$free" \
+ | xargs -0 perl -0x3b -pi -e \
+ 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s+('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\))/$2/s'
+
+# Use the following to remove redundant uses of kfree inside braces.
+# Note that -0777 puts perl in slurp-whole-file mode;
+# but we have plenty of memory, these days...
+free=kfree
+git grep -l -z "$free *(" \
+ | xargs -0 useless-if-before-free -l --name="$free" \
+ | xargs -0 perl -0777 -pi -e \
+ 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s*\{\s*('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\);)\s*\}[^\n]*$/$2/gms'
+
+Be careful that the result of the above transformation is valid.
+If the matched string is followed by "else", then obviously, it won't be.
+
+When modifying files, refuse to process anything other than a regular file.
+EOF
+
+## Local Variables:
+## mode: perl
+## indent-tabs-mode: nil
+## eval: (add-hook 'write-file-hooks 'time-stamp)
+## time-stamp-start: "my $VERSION = '"
+## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
+## time-stamp-time-zone: "UTC"
+## time-stamp-end: "'; # UTC"
+## End:
diff --git a/gnulib/build-aux/vc-list-files b/gnulib/build-aux/vc-list-files
new file mode 100755
index 00000000..b9f2fbd8
--- /dev/null
+++ b/gnulib/build-aux/vc-list-files
@@ -0,0 +1,116 @@
+#!/bin/sh
+# List version-controlled file names.
+
+# Print a version string.
+scriptversion=2010-02-21.13; # UTC
+
+# Copyright (C) 2006-2010 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/>.
+
+
+# List the specified version-controlled files.
+# With no argument, list them all. With a single DIRECTORY argument,
+# list the version-controlled files in that directory.
+
+# If there's an argument, it must be a single, "."-relative directory name.
+# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/
+
+postprocess=
+case $1 in
+ --help) cat <<EOF
+Usage: $0 [-C SRCDIR] [DIR]
+
+Output a list of version-controlled files in DIR (default .), relative to
+SRCDIR (default .). SRCDIR must be the top directory of a checkout.
+
+Options:
+ --help print this help, then exit
+ --version print version number, then exit
+ -C SRCDIR change directory to SRCDIR before generating list
+
+Report bugs and patches to <bug-gnulib@gnu.org>.
+EOF
+ exit ;;
+
+ --version)
+ year=`echo "$scriptversion" | sed 's/[^0-9].*//'`
+ cat <<EOF
+vc-list-files $scriptversion
+Copyright (C) $year Free Software Foundation, Inc,
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+EOF
+ exit ;;
+
+ -C)
+ test "$2" = . || postprocess="| sed 's|^|$2/|'"
+ cd "$2" || exit 1
+ shift; shift ;;
+esac
+
+dir=
+case $# in
+ 0) ;;
+ 1) dir=$1 ;;
+ *) echo "$0: too many arguments" 1>&2
+ echo "Usage: $0 [-C srcdir] [DIR]" 1>&2; exit 1;;
+esac
+
+test "x$dir" = x && dir=.
+
+if test -d .git; then
+ test "x$dir" = x. \
+ && dir= sed_esc= \
+ || { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; }
+ # Ignore git symlinks - either they point into the tree, in which case
+ # we don't need to visit the target twice, or they point somewhere
+ # else (often into a submodule), in which case the content does not
+ # belong to this package.
+ eval exec git ls-tree -r 'HEAD:"$dir"' \
+ \| sed -n '"s/^100[^ ]*./$sed_esc/p"' $postprocess
+elif test -d .hg; then
+ eval exec hg locate '"$dir/*"' $postprocess
+elif test -d .bzr; then
+ test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
+ eval exec bzr ls -R --versioned '"$dir"' $postprocess
+elif test -d CVS; then
+ test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
+ if test -x build-aux/cvsu; then
+ eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess
+ elif (cvsu --help) >/dev/null 2>&1; then
+ eval cvsu --find --types=AFGM '"$dir"' $postprocess
+ else
+ eval awk -F/ \''{ \
+ if (!$1 && $3 !~ /^-/) { \
+ f=FILENAME; \
+ if (f ~ /CVS\/Entries$/) \
+ f = substr(f, 1, length(f)-11); \
+ print f $2; \
+ }}'\'' \
+ `find "$dir" -name Entries -print` /dev/null' $postprocess
+ fi
+else
+ echo "$0: Failed to determine type of version control used in `pwd`" 1>&2
+ exit 1
+fi
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gnulib/build-aux/warn-on-use.h b/gnulib/build-aux/warn-on-use.h
new file mode 100644
index 00000000..3d93a9e9
--- /dev/null
+++ b/gnulib/build-aux/warn-on-use.h
@@ -0,0 +1,75 @@
+/* A C macro for emitting warnings if a function is used.
+ Copyright (C) 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* _GL_WARN_ON_USE(function, "literal string") issues a declaration
+ for FUNCTION which will then trigger a compiler warning containing
+ the text of "literal string" anywhere that function is called, if
+ supported by the compiler. If the compiler does not support this
+ feature, the macro expands to an unused extern declaration.
+
+ This macro is useful for marking a function as a potential
+ portability trap, with the intent that "literal string" include
+ instructions on the replacement function that should be used
+ instead. However, one of the reasons that a function is a
+ portability trap is if it has the wrong signature. Declaring
+ FUNCTION with a different signature in C is a compilation error, so
+ this macro must use the same type as any existing declaration so
+ that programs that avoid the problematic FUNCTION do not fail to
+ compile merely because they included a header that poisoned the
+ function. But this implies that _GL_WARN_ON_USE is only safe to
+ use if FUNCTION is known to already have a declaration. Use of
+ this macro implies that there must not be any other macro hiding
+ the declaration of FUNCTION; but undefining FUNCTION first is part
+ of the poisoning process anyway (although for symbols that are
+ provided only via a macro, the result is a compilation error rather
+ than a warning containing "literal string"). Also note that in
+ C++, it is only safe to use if FUNCTION has no overloads.
+
+ For an example, it is possible to poison 'getline' by:
+ - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+ [getline]) in configure.ac, which potentially defines
+ HAVE_RAW_DECL_GETLINE
+ - adding this code to a header that wraps the system <stdio.h>:
+ #undef getline
+ #if HAVE_RAW_DECL_GETLINE
+ _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+ "not universally present; use the gnulib module getline");
+ #endif
+
+ It is not possible to directly poison global variables. But it is
+ possible to write a wrapper accessor function, and poison that
+ (less common usage, like &environ, will cause a compilation error
+ rather than issue the nice warning, but the end result of informing
+ the developer about their portability problem is still achieved):
+ #if HAVE_RAW_DECL_ENVIRON
+ static inline char ***rpl_environ (void) { return &environ; }
+ _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+ # undef environ
+ # define environ (*rpl_environ ())
+ #endif
+ */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later. */
+# define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+
+# else /* Unsupported. */
+# define _GL_WARN_ON_USE(function, message) \
+extern int _gl_warn_on_use
+# endif
+#endif
diff --git a/gnulib/build-aux/x-to-1.in b/gnulib/build-aux/x-to-1.in
new file mode 100644
index 00000000..cd3688d3
--- /dev/null
+++ b/gnulib/build-aux/x-to-1.in
@@ -0,0 +1,62 @@
+#! /bin/sh
+#
+# Copyright (C) 2001, 2003, 2006, 2009, 2010 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/>.
+#
+
+# This program creates a program's manual from the .x skeleton and its --help
+# output.
+# The .x skeleton is a file containing manual page text that is not part of the
+# --help output. It is passed to help2man via its --include option. Its format
+# is described in the help2man documentation.
+
+update=
+while true; do
+ case "$1" in
+ --update) update=yes; shift;;
+ *) break;;
+ esac
+done
+
+if test $# != 5; then
+ echo "Usage: x-to-1 [OPTIONS] PERL HELP2MAN executable program.x program.1" 1>&2
+ exit 1
+fi
+PERL="$1"
+HELP2MAN="$2"
+executable="$3"
+aux="$4"
+output="$5"
+
+progname=`basename $aux .x`
+case "$PERL" in *"/missing perl") perlok=no;; *) perlok=yes;; esac
+if test @CROSS_COMPILING@ = no && test -f $executable && test $perlok = yes; then
+ echo "Updating man page $output"
+ echo "$HELP2MAN --include=$aux $executable > $output"
+ rm -f t-$progname.1
+ $HELP2MAN --include=$aux $executable > t-$progname.1 || exit 1
+ if test -n "$update"; then
+ # In --update mode, don't overwrite the output if nothing would change.
+ if cmp t-$progname.1 $output >/dev/null 2>&1; then
+ rm -f t-$progname.1
+ else
+ mv t-$progname.1 $output
+ fi
+ else
+ mv t-$progname.1 $output
+ fi
+else
+ echo "WARNING: The man page $output cannot be updated yet."
+fi
diff --git a/gnulib/check-module b/gnulib/check-module
new file mode 100755
index 00000000..af42b1e4
--- /dev/null
+++ b/gnulib/check-module
@@ -0,0 +1,303 @@
+#!/usr/bin/perl -w
+# Check a gnulib module.
+
+# Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+# This file is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# 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/>.
+
+
+# Read a module description file and derive the set of files
+# included directly by any .c or .h file listed in the `Files:' section.
+# Take the union of all such sets for any dependent modules.
+# Then, compare that set with the set derived from the names
+# listed in the various Files: sections.
+
+# This script makes no attempt to diagnose invalid or empty
+# module-description files.
+
+# Written by Jim Meyering
+
+# FIXME:
+# for each .m4 file listed in the Files: section(s)
+# parse it for AC_LIBSOURCES directives, and accumulate the set
+# of files `required' via all AC_LIBSOURCES.
+# If this set is not empty, ensure that it contains
+# the same (.c and .h only?) files as are listed in the Files: sections.
+
+use strict;
+use Getopt::Long;
+use File::Basename;
+#use Coda;
+
+my $COPYRIGHT_NOTICE = "Copyright (C) 2006 Free Software Foundation, Inc.\n".
+"This is free software. You may redistribute copies of it under the terms of\n".
+"the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n".
+"There is NO WARRANTY, to the extent permitted by law.\n";
+
+(my $VERSION = '$Revision: 1.8 $ ') =~ tr/[0-9].//cd;
+(my $ME = $0) =~ s|.*/||;
+
+use constant ST_INIT => 1;
+use constant ST_FILES => 2;
+use constant ST_DEPENDENTS => 3;
+
+# Parse a module file (returning list of Files: names and
+# list of dependent-modules.
+# my ($file, $dep) = parse_module_file $module_file;
+sub parse_module_file ($)
+{
+ my ($module_file) = @_;
+
+ open FH, '<', $module_file
+ or die "$ME: can't open `$module_file' for reading: $!\n";
+
+ my %file_set;
+ my %dep_set;
+
+ my $state = ST_INIT;
+ while (defined (my $line = <FH>))
+ {
+ if ($state eq ST_INIT)
+ {
+ if ($line =~ /^Files:$/)
+ {
+ $state = ST_FILES;
+ }
+ elsif ($line =~ /^Depends-on:$/)
+ {
+ $state = ST_DEPENDENTS;
+ }
+ }
+ else
+ {
+ chomp $line;
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+ if ( ! $line)
+ {
+ $state = ST_INIT;
+ next;
+ }
+
+ if ($state eq ST_FILES)
+ {
+ $file_set{$line} = 1;
+ }
+ elsif ($state eq ST_DEPENDENTS)
+ {
+ $dep_set{$line} = 1;
+ (my $base = $module_file) =~ s,.*/,,;
+ $line eq $base
+ and die "$ME: module $module_file depends on itself\n";
+ }
+ }
+ }
+ close FH;
+
+ # my @t = sort keys %file_set;
+ # print "files: @t\n";
+ # my @u = sort keys %dep_set;
+ # print "dependents: @u\n";
+
+ return (\%file_set, \%dep_set);
+}
+
+# Extract the set of files required for this module, including
+# those required via dependent modules.
+
+# Files:
+# lib/stat.c
+# m4/stat.m4
+# lib/foo.h
+#
+# Depends-on:
+# some-other-module
+
+sub usage ($)
+{
+ my ($exit_code) = @_;
+ my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
+ if ($exit_code != 0)
+ {
+ print $STREAM "Try `$ME --help' for more information.\n";
+ }
+ else
+ {
+ print $STREAM <<EOF;
+Usage: $ME [OPTIONS] FILE...
+
+Read a module description file and derive the set of files
+included directly by any .c or .h file listed in the `Files:' section.
+Take the union of all such sets for any dependent modules.
+Then, compare that set with the set derived from the names
+listed in the various Files: sections.
+
+OPTIONS:
+
+ --help display this help and exit
+ --version output version information and exit
+
+EOF
+ }
+ exit $exit_code;
+}
+
+sub find_included_lib_files ($)
+{
+ my ($file) = @_;
+
+ # Special cases...
+ my %special_non_dup = ( 'fnmatch_loop.c' => 1,
+ 'regex.c' => 1, 'at-func.c' => 1,
+ 'vasnprintf.c' => 1
+ );
+ my %dup_include_ok;
+ $dup_include_ok{'vasnprintf.c'}{'isnand-nolibm.h'} = 1;
+ $dup_include_ok{'vasnprintf.c'}{'isnanl-nolibm.h'} = 1;
+ $dup_include_ok{'vasnprintf.c'}{'fpucw.h'} = 1;
+ $dup_include_ok{'gen-uni-tables.c'}{'3level.h'} = 1;
+ $dup_include_ok{'csharpexec.c'}{'classpath.c'} = 1;
+ $dup_include_ok{'csharpexec.c'}{'classpath.h'} = 1;
+
+ my %inc;
+ open FH, '<', $file
+ or die "$ME: can't open `$file' for reading: $!\n";
+
+ while (defined (my $line = <FH>))
+ {
+ # Ignore test-driver code at end of file.
+ $line =~ m!^\#if(def)? TEST_!
+ and last;
+
+ $line =~ m!^\s*\#\s*include\s+"!
+ or next;
+ $line =~ s///;
+ chomp $line;
+ $line =~ s/".*//;
+ exists $inc{$line} && ! exists $special_non_dup{$line}
+ && ! exists $dup_include_ok{basename $file}{$line}
+ and warn "$ME: $file: duplicate inclusion of $line\n";
+
+ $inc{$line} = 1;
+ }
+ close FH;
+
+ return \%inc;
+}
+
+my %exempt_header =
+ (
+ # Exempt headers like unlocked-io.h that are `#include'd
+ # but not necessarily used.
+ 'unlocked-io.h' => 1,
+
+ # Give gettext.h a free pass only when included from lib/error.c,
+ # since we've made that exception solely to make the error
+ # module easier to use -- at RMS's request.
+ 'lib/error.c:gettext.h' => 1,
+
+ # The full-read module shares code with the full-write module.
+ 'lib/full-write.c:full-read.h' => 1,
+
+ # The safe-write module shares code with the safe-read module.
+ 'lib/safe-read.c:safe-write.h' => 1,
+
+ # The use of obstack.h in the hash module is conditional, off by default.
+ 'lib/hash.c:obstack.h' => 1,
+
+ # C files in the gc module have conditional includes.
+ 'lib/gc-gnulib.c:des.h' => 1,
+ 'lib/gc-gnulib.c:arcfour.h' => 1,
+ 'lib/gc-gnulib.c:arctwo.h' => 1,
+ 'lib/gc-gnulib.c:md2.h' => 1,
+ 'lib/gc-gnulib.c:md4.h' => 1,
+ 'lib/gc-gnulib.c:md5.h' => 1,
+ 'lib/gc-gnulib.c:rijndael.h' => 1,
+ 'lib/gc-gnulib.c:sha1.h' => 1,
+ 'lib/gc-gnulib.c:rijndael-api-fst.h' => 1,
+ 'lib/gc-gnulib.c:hmac.h' => 1,
+ 'lib/gc-libgcrypt.c:md2.h' => 1,
+
+ # The fts-lgpl module doesn't actually use fts-cycle.c and unistd-safer.h.
+ 'lib/fts.c:fts-cycle.c' => 1,
+ 'lib/fts.c:unistd-safer.h' => 1,
+ );
+
+sub check_module ($)
+{
+ my @m = @_;
+
+ my %file;
+ my %module_all_files;
+ my %dep;
+ my %seen_module;
+
+ while (@m)
+ {
+ my $m = pop @m;
+ # warn "M: $m\n";
+ exists $seen_module{$m}
+ and next;
+ $seen_module{$m} = 1;
+ my ($file, $dep) = parse_module_file $m;
+ push @m, keys %$dep;
+ foreach my $f (keys %$file)
+ {
+ $module_all_files{$f} = 1;
+ }
+ }
+
+ my @t = sort keys %module_all_files;
+ # warn "ALL files: @t\n";
+
+ # Derive from %module_all_files (by parsing the .c and .h files therein),
+ # the list of all #include'd files that reside in lib/.
+ foreach my $f (keys %module_all_files)
+ {
+ $f =~ /\.[ch]$/
+ or next;
+ # FIXME: this is too naive
+ my $inc = find_included_lib_files "../$f";
+ foreach my $i (sort keys %$inc)
+ {
+ my $lib_file = "lib/$i";
+ exists $exempt_header{"$f:$i"}
+ || exists $exempt_header{$i}
+ and next;
+ !exists $module_all_files{$lib_file} && -f "../lib/$i"
+ and warn "$f: $i is `#include'd, but not "
+ . "listed in module's Files: section\n";
+ }
+ #my @t = sort keys %$inc;
+ #print "** $f: @t\n";
+ }
+}
+
+{
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n$COPYRIGHT_NOTICE"; exit },
+ ) or usage 1;
+
+ @ARGV < 1
+ and (warn "$ME: missing FILE argument\n"), usage 1;
+
+ foreach my $module (@ARGV)
+ {
+ check_module $module;
+ }
+
+ exit 0;
+}
diff --git a/gnulib/config/argz.mk b/gnulib/config/argz.mk
new file mode 100644
index 00000000..fa84ca89
--- /dev/null
+++ b/gnulib/config/argz.mk
@@ -0,0 +1,64 @@
+# Generate argz.c and argz.in.h from glibc sources.
+
+glibc_dir = ../glibc
+glibc_dir = /mirror/d/glibc
+
+argz_names = \
+ append addsep ctsep insert next stringify count \
+ extract create delete replace
+argz_files = $(patsubst %, $(glibc_dir)/string/argz-%.c, $(argz_names))
+
+define print-header
+ printf '%s\n' \
+"/* Functions for dealing with '\0' separated arg vectors." \
+" Copyright (C) 1995-1998, 2000-2002, 2006, 2009-2010 Free Software
+" Foundation, Inc."\
+" This file is part of the GNU C Library." \
+"" \
+" 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 2, 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, write to the Free Software Foundation," \
+" Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */"\
+"" \
+"#include <config.h>" \
+"" \
+"#include <argz.h>" \
+"#include <errno.h>" \
+"#include <stdlib.h>" \
+"#include <string.h>"
+endef
+
+targets = argz.c argz.in.h
+
+all: $(targets)
+
+argz.c: $(argz_files)
+ ($(print-header); \
+ for i in $^; do \
+ perl -pe 's/__(argz_|st|mem)/$$1/g' $$i \
+ | perl -0x0 -pe 's,/\*(.|\n)+?\*/\n,,' \
+ | grep -vE '^(#include|INTDEF|weak_alias|libc_hidden_def)'; \
+ done) > $@-t && mv $@-t $@
+
+argz.in.h: $(glibc_dir)/string/argz.h
+ perl -pe 's/__(restrict|const|st|mem)/$$1/g;' \
+ -e 's/\s*__THROW//;' \
+ -e 's/\s*__attribute_pure__//;' \
+ $< \
+ | perl -ne \
+ '/^(#include <features\.h>|__(?:BEGIN|END)_DECLS)/ or print' \
+ | perl -0x3b -pe 's/extern \S+ \*?__argz_(.|\n)*?\)\n*;//' \
+ | perl -pe 's/__(argz_next)/$$1/g;' \
+ > $@-t && mv $@-t $@
+
+clean:
+ rm -f $(targets)
diff --git a/gnulib/config/srclist-update b/gnulib/config/srclist-update
new file mode 100755
index 00000000..9b3ddabc
--- /dev/null
+++ b/gnulib/config/srclist-update
@@ -0,0 +1,136 @@
+#!/bin/sh
+# $Id: srclist-update,v 1.19 2007-03-30 23:44:27 karl Exp $
+#
+# Check for files in directory $1 being up to date, according to the
+# list on stdin. Don't actually make any changes, just show the diffs.
+#
+# Copyright (C) 2002, 2003, 2005, 2007, 2008, 2009, 2010 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/>.
+
+# Originally written by Karl Berry.
+
+
+if test -n "$1"; then
+ cd "$1" || exit 1
+fi
+
+verbose=false
+#chicken="echo (would)"
+
+: ${TMPDIR=/tmp}
+dsttmp=$TMPDIR/srclist.dst
+
+# Source `dirname $0`/srclistvars.sh first, if it exists.
+mydir=`dirname $0`
+test -r $mydir/srclistvars.sh && . $mydir/srclistvars.sh
+
+
+#
+# sed command to fix the license to be GPL.
+fixlicense='
+ /^[[:space:]]*#[[:space:]]*Th[ei][ s].* is free software/,/^[[:space:]]*#.*USA\./c\
+# 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/>.
+
+ /Th[ei][ s].* is free software/,/\*\//c\
+ 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/>. */
+'
+
+# sed command to remove lines containing $Id lines.
+# Quote the $ so that CVS does not expand it in this script.
+remove_id_lines='/[$]Id:.*[$]/d'
+
+# $1 is input file, $2 is output.
+# Remove $Id lines, since they'll differ between source locations.
+# If $options contains "gpl", change the license to be the standard
+# GPL. We use this for libc files, et al.
+#
+fixfile() \
+{
+ sed_command="$remove_id_lines"
+
+ case " $options " in
+ *' gpl '*)
+ sed_command="$sed_command; $fixlicense";;
+ esac
+
+ sed "$sed_command" $1 >$2
+}
+
+
+#
+cat | while read src dst options; do
+ #echo "src=$src, dst=$dst, options=$options" >&2
+ case $src:$dst in
+ *: ) continue;; # skip lines without second element
+ '#'* ) continue;; # skip comment-only lines
+ esac
+
+ # Expand variables and make sure we have an input file.
+ eval src=$src
+ if test ! -r $src; then
+ echo "$0: cannot read $src" >&2
+ continue
+ fi
+
+ # Ignore subdirs in src dir. E.g., if input spec is
+ # src/subdir/foo.c dst
+ # then write destination file dst/foo.c.
+ eval dst=$dst
+ test -d $dst && dst=$dst/`basename $src`
+
+ # Fix files in both src and dst, for the sake
+ # of a clean comparison.
+ srctmp=$TMPDIR/`basename $src`
+ fixfile $src $srctmp
+ test -r $dst && fixfile $dst $dsttmp
+
+ # if src was executable, make dst executable, to placate git.
+ test -x $src && chmod a+x $dst
+
+ if test ! -e $dst; then
+ echo "## $srctmp $dst # new"
+ $chicken cp -p $srctmp $dst
+ elif cmp -s $srctmp $dsttmp; then
+ $verbose && echo "## $srctmp $dst # unchanged"
+ else
+ echo "## $srctmp $dst # changes"
+ diff -C 2 $dst $srctmp
+ fi
+done
+
+rm -f $dsttmp
diff --git a/gnulib/config/srclist.txt b/gnulib/config/srclist.txt
new file mode 100644
index 00000000..f46158b6
--- /dev/null
+++ b/gnulib/config/srclist.txt
@@ -0,0 +1,255 @@
+# $Id: srclist.txt,v 1.152 2007-06-21 18:41:50 karl Exp $
+# Files for which we are not the source. See ./srclistvars.sh for the
+# variable definitions.
+
+$GNUCONFIG/config.guess build-aux
+$GNUCONFIG/config.sub build-aux
+#
+$AUTOMAKE/lib/compile build-aux
+$AUTOMAKE/lib/depcomp build-aux
+$AUTOMAKE/lib/elisp-comp build-aux
+$AUTOMAKE/lib/gnupload build-aux
+$AUTOMAKE/lib/install-sh build-aux
+$AUTOMAKE/lib/mdate-sh build-aux
+$AUTOMAKE/lib/missing build-aux
+$AUTOMAKE/lib/mkinstalldirs build-aux
+#
+$TEXINFOSRC/doc/texinfo.tex build-aux
+$TEXINFOSRC/util/gendocs.sh build-aux
+$TEXINFOSRC/util/gendocs_template doc
+$TEXINFOSRC/util/gendocs_template_min doc
+#
+# we generate INSTALL from this via a rule in doc/Makefile.
+$AUTOCONF/doc/install.texi doc
+#
+$GNUSTANDARDS/maintain.texi doc
+$GNUSTANDARDS/standards.texi doc
+$GNUSTANDARDS/make-stds.texi doc
+$GNUSTANDARDS/gnu-oids.texi doc
+$GNUSTANDARDS/fdl.texi doc
+#
+$GNUWWWLICENSES/lgpl-3.0.txt doc/COPYING.LESSERv3
+$GNUWWWLICENSES/old-licenses/lgpl-2.1.txt doc/COPYING.LESSERv2
+$GNUWWWLICENSES/gpl-3.0.txt doc/COPYINGv3
+$GNUWWWLICENSES/old-licenses/gpl-2.0.txt doc/COPYINGv2
+$GNUWWWLICENSES/old-licenses/lgpl-2.1.texi doc
+$GNUWWWLICENSES/old-licenses/gpl-2.0.texi doc
+$GNUWWWLICENSES/old-licenses/fdl-1.2.texi doc
+$GNUWWWLICENSES/agpl-3.0.texi doc
+$GNUWWWLICENSES/fdl-1.3.texi doc
+$GNUWWWLICENSES/fdl-1.3.texi doc/fdl.texi
+$GNUWWWLICENSES/gpl-3.0.texi doc
+$GNUWWWLICENSES/lgpl-3.0.texi doc
+#
+# The official forms for contributors to fill out, mentioned in maintain.
+$GNUORG/conditions.text doc/Copyright
+$GNUORG/Copyright/request-assign.changes doc/Copyright
+$GNUORG/Copyright/request-assign.future doc/Copyright
+$GNUORG/Copyright/request-assign.program doc/Copyright
+$GNUORG/Copyright/request-disclaim.changes doc/Copyright
+$GNUORG/assign.manual doc/Copyright
+$GNUORG/assign.changes.manual doc/Copyright
+$GNUORG/assign.future.manual doc/Copyright
+$GNUORG/assign.translation.manual doc/Copyright
+$GNUORG/disclaim.manual doc/Copyright
+$GNUORG/disclaim.changes.manual doc/Copyright
+$GNUORG/disclaim.program doc/Copyright
+
+# new argp not in glibc yet --13feb06.
+#$LIBCSRC/argp/argp-ba.c lib gpl
+#$LIBCSRC/argp/argp-eexst.c lib gpl
+#$LIBCSRC/argp/argp-fmtstream.c lib gpl
+#$LIBCSRC/argp/argp-fmtstream.h lib gpl
+#$LIBCSRC/argp/argp-fs-xinl.c lib gpl
+#$LIBCSRC/argp/argp-help.c lib gpl
+#$LIBCSRC/argp/argp-namefrob.h lib gpl
+#$LIBCSRC/argp/argp-parse.c lib gpl
+#$LIBCSRC/argp/argp-pv.c lib gpl
+#$LIBCSRC/argp/argp-pvh.c lib gpl
+#$LIBCSRC/argp/argp-xinl.c lib gpl
+#$LIBCSRC/argp/argp.h lib gpl
+#$LIBCSRC/stdlib/getsubopt.c lib gpl
+#$LIBCSRC/posix/getopt.c lib gpl
+#$LIBCSRC/posix/getopt.h lib gpl (getopt.in.h in gnulib)
+#$LIBCSRC/posix/getopt1.c lib gpl
+#$LIBCSRC/posix/getopt_int.h lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1293
+#$LIBCSRC/libidn/iconvme.h lib gpl
+#$LIBCSRC/libidn/iconvme.c lib gpl
+
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1057
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1217
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1220
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1223
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1224
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1237
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1240
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1241
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1273
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1278
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1280
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1281
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1282
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1285
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1291
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1302
+#$LIBCSRC/posix/regcomp.c lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1238
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1245
+#$LIBCSRC/posix/regex.c lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1201
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1207
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1222
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1232
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1236
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1240
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1281
+#$LIBCSRC/posix/regex.h lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1215
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1218
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1220
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1226
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1231
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1237
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1241
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1248
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1281
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1282
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1284
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1285
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1286
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1287
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1291
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1302
+#$LIBCSRC/posix/regex_internal.c lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1054
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1221
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1237
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1241
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1245
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1248
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1273
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1278
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1281
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1285
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1291
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1302
+#$LIBCSRC/posix/regex_internal.h lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1216
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1220
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1225
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1227
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1231
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1237
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1241
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1245
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1278
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1279
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1280
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1281
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1282
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1284
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1285
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1302
+#$LIBCSRC/posix/regexec.c lib gpl
+#
+# c89 changes $LIBCSRC/string/strdup.c lib gpl
+#tab changes $LIBCSRC/stdlib/strtoll.c lib gpl
+$LIBCSRC/stdlib/strtoul.c lib gpl
+# (no more strtok_r.h) $LIBCSRC/string/strtok_r.c lib gpl
+# (gnulib needs config.h?) $LIBCSRC/string/memmem.c lib gpl
+#$LIBCSRC/time/mktime.c lib gpl
+
+#
+# http://sourceware.org/bugzilla/show_bug.cgi?id=1439
+#$LIBCSRC/crypt/md5.c lib gpl
+#$LIBCSRC/crypt/md5.h lib gpl
+# These are close, but ...
+#$LIBCSRC/locale/programs/xmalloc.c lib gpl
+#$LIBCSRC/locale/programs/xstrdup.c lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=321
+#$LIBCSRC/malloc/obstack.c lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=321
+#$LIBCSRC/malloc/obstack.h lib gpl
+#$LIBCSRC/misc/error.c lib gpl
+#$LIBCSRC/misc/error.h lib gpl
+#$LIBCSRC/misc/getpass.c lib gpl
+#$LIBCSRC/misc/mkstemp.c lib gpl
+#$LIBCSRC/posix/fnmatch.c lib gpl
+#$LIBCSRC/posix/fnmatch.h lib gpl (fnmatch.in.h in gnulib)
+#$LIBCSRC/posix/fnmatch_loop.c lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1060
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1062
+#$LIBCSRC/posix/glob.c lib gpl
+#
+# http://sources.redhat.com/bugzilla/show_bug.cgi?id=1060
+#$LIBCSRC/posix/glob.h lib gpl (glob-libc.h in gnulib)
+#
+#$LIBCSRC/stdlib/putenv.c lib gpl
+#$LIBCSRC/stdlib/random_r.c lib gpl
+#$LIBCSRC/stdlib/rpmatch.c lib gpl
+#$LIBCSRC/stdlib/strtol.c lib gpl
+#$LIBCSRC/string/strndup.c lib gpl
+#$LIBCSRC/string/strverscmp.c lib gpl
+#
+#$LIBCSRC/string/memchr.c lib gpl
+#$LIBCSRC/string/memcmp.c lib gpl
+#$LIBCSRC/string/memrchr.c lib gpl
+#$LIBCSRC/string/stpcpy.c lib gpl
+#$LIBCSRC/string/stpncpy.c lib gpl
+#$LIBCSRC/string/strcspn.c lib gpl
+#$LIBCSRC/string/strpbrk.c lib gpl
+#$LIBCSRC/string/strstr.c lib gpl
+#$LIBCSRC/sysdeps/posix/dup2.c lib gpl
+#$LIBCSRC/sysdeps/posix/euidaccess.c lib gpl
+#$LIBCSRC/sysdeps/posix/tempname.c lib gpl
+#$LIBCSRC/sysdeps/unix/bsd/poll.c lib gpl
+#$LIBCSRC/sysdeps/unix/dirfd.c lib gpl
+#$LIBCSRC/sysdeps/unix/rmdir.c lib gpl
+#$LIBCSRC/time/strftime.c lib gpl
+# These are close, but we are using the gettext versions.
+#$LIBCSRC/misc/mkdtemp.c lib gpl
+#$LIBCSRC/stdlib/setenv.c lib gpl (setenv.c, unsetenv.c)
+#
+# These implementations are quite different.
+#$LIBCSRC/io/lstat.c lib gpl
+#$LIBCSRC/libio/__fpending.c lib gpl
+#$LIBCSRC/malloc/malloc.c lib gpl
+#$LIBCSRC/misc/dirname.c lib gpl
+#$LIBCSRC/misc/getusershell.c lib gpl
+#$LIBCSRC/stdio-common/getline.c lib gpl
+#$LIBCSRC/stdlib/atexit.c lib gpl
+#$LIBCSRC/stdlib/exit.h lib gpl
+#$LIBCSRC/stdlib/strtod.c lib gpl
+#$LIBCSRC/stdlib/strtoimax.c lib gpl
+#$LIBCSRC/stdlib/strtoull.c lib gpl
+#$LIBCSRC/stdlib/strtoumax.c lib gpl
+#$LIBCSRC/string/basename.c lib gpl
+#$LIBCSRC/string/bcopy.c lib gpl
+#$LIBCSRC/string/memcpy.c lib gpl
+#$LIBCSRC/string/memmove.c lib gpl
+#$LIBCSRC/string/memset.c lib gpl
+#$LIBCSRC/string/strcasecmp.c lib gpl
+#$LIBCSRC/string/strchrnul.c lib gpl
+#$LIBCSRC/string/strerror.c lib gpl
+#$LIBCSRC/string/strnlen.c lib gpl
+#$LIBCSRC/sysdeps/posix/gettimeofday.c lib gpl
+#$LIBCSRC/sysdeps/posix/rename.c lib gpl
+#$LIBCSRC/sysdeps/unix/mkdir.c lib gpl
+#$LIBCSRC/sysdeps/unix/sysv/gethostname.c lib gpl
+#$LIBCSRC/sysdeps/unix/utime.c lib gpl
+
+# Now derived from concatenation of separate .c files in glibc.
+# See argz.mk for details.
+#$LIBTOOL/libltdl/argz.c lib gpl
+#$LIBTOOL/libltdl/argz_.h lib gpl
+#$LIBTOOL/libltdl/m4/argz.m4 m4
diff --git a/gnulib/config/srclistvars.sh b/gnulib/config/srclistvars.sh
new file mode 100644
index 00000000..e3f34dbe
--- /dev/null
+++ b/gnulib/config/srclistvars.sh
@@ -0,0 +1,53 @@
+# $Id: srclistvars.sh,v 1.28 2006-08-22 19:38:57 eggert Exp $
+# Variables for srclist-update and srclist.txt.
+# Will change for each user.
+
+# Copyright (C) 2002, 2003, 2004 2005, 2006, 2008
+# Free Software Foundation, Inc.
+
+# This file is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# 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/>.
+
+case $LOGNAME in
+jas | eggert)
+ : ${AUTOCONF=../autoconf}
+ : ${AUTOMAKE=../automake}
+ : ${GETTEXT=../gettext}
+ : ${GNUCONFIG=../config}
+ : ${GNUORG=../gnuorg}
+ : ${GNUWWWLICENSES=$GNUORG}
+ : ${GNUSTANDARDS=../gnustandards}
+ : ${LIBTOOL=../libtool}
+ : ${LIBCSRC=../libc}
+ : ${TEXINFOSRC=../texinfo}
+ ;;
+
+karl)
+ : ${ACLOCAL=/usr/local/gnu/share/aclocal}
+ : ${GNUBIN=/usr/local/gnu/bin}
+ : ${GNUWWWLICENSES=$HOME/gnu/www/www/licenses}
+ : ${TEXMFROOT=/usr/local/texmf/texmf-dist}
+ : ${AUTOCONF=../autoconf}
+ : ${AUTOMAKE=../automake}
+ : ${EMACSSRC=../etrunk}
+ : ${GETTEXT=../gettext}
+ : ${GNUCONFIG=../config}
+ : ${GNUORG=$HOME/gnu/gnuorg}
+ : ${GNULIBSRC=../gnulib}
+ : ${GNUSTANDARDS=../gnustandards}
+ : ${LIBCSRC=../libc}
+ : ${LIBTOOL=../libtool}
+ : ${TEXINFOSRC=../texinfo}
+ ;;
+
+esac
diff --git a/gnulib/doc/.cvsignore b/gnulib/doc/.cvsignore
new file mode 100644
index 00000000..9f0bf0d8
--- /dev/null
+++ b/gnulib/doc/.cvsignore
@@ -0,0 +1,4 @@
+gnulib.??
+gnulib.???
+gnulib.info
+gnulib.html
diff --git a/gnulib/doc/.gitignore b/gnulib/doc/.gitignore
new file mode 100644
index 00000000..305af77c
--- /dev/null
+++ b/gnulib/doc/.gitignore
@@ -0,0 +1,17 @@
+gnulib.aux
+gnulib.cp
+gnulib.cps
+gnulib.fn
+gnulib.ky
+gnulib.log
+gnulib.pg
+gnulib.toc
+gnulib.tp
+gnulib.vr
+gnulib.vrs
+gnulib.info
+gnulib.info-1
+gnulib.info-2
+gnulib.info-3
+gnulib.html
+updated-stamp
diff --git a/gnulib/doc/COPYING.LESSERv2 b/gnulib/doc/COPYING.LESSERv2
new file mode 100644
index 00000000..602bfc94
--- /dev/null
+++ b/gnulib/doc/COPYING.LESSERv2
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. 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 not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the 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
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey 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 library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/gnulib/doc/COPYING.LESSERv3 b/gnulib/doc/COPYING.LESSERv3
new file mode 100644
index 00000000..cca7fc27
--- /dev/null
+++ b/gnulib/doc/COPYING.LESSERv3
@@ -0,0 +1,165 @@
+ 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.
diff --git a/gnulib/doc/COPYINGv2 b/gnulib/doc/COPYINGv2
new file mode 100644
index 00000000..d511905c
--- /dev/null
+++ b/gnulib/doc/COPYINGv2
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+ 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
+convey 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 2 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, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This 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.
diff --git a/gnulib/doc/COPYINGv3 b/gnulib/doc/COPYINGv3
new file mode 100644
index 00000000..94a9ed02
--- /dev/null
+++ b/gnulib/doc/COPYINGv3
@@ -0,0 +1,674 @@
+ 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>.
diff --git a/gnulib/doc/Copyright/assign.changes.manual b/gnulib/doc/Copyright/assign.changes.manual
new file mode 100644
index 00000000..79ace3ac
--- /dev/null
+++ b/gnulib/doc/Copyright/assign.changes.manual
@@ -0,0 +1,128 @@
+The way to assign copyright to the Foundation is to sign an assignment
+contract. This is what legally makes the FSF the copyright holder so
+that we can register the copyright on the new version.
+I'm assuming that you wrote these changes yourself;
+if other people wrote parts, we may need papers from them.
+
+If you are employed to do writing (even at a university), or have
+made an agreement with your employer or school saying it owns text
+you write, then you and we need a signed piece of paper from your
+employer disclaiming rights to your changes.
+
+The disclaimer should be signed by a vice president or general manager
+of the company. If you can't get at them, anyone else authorized to
+license manuals produced there will do. Here is a sample wording:
+
+ Digital Stimulation Corporation hereby disclaims all copyright
+ interest in the changes and enhancements made by Hugh Heffner to the
+ manual "The Seduction Manual", also including any future revisions
+ of these changes and enhancements. We do not consider them as a work
+ made for hire for us.
+
+ <signature of Ty Coon>, 1 April 1987
+ Ty Coon, President of Vice, Digital Stimulation Corp.
+
+IMPORTANT: When you talk to your employer, *no matter what
+instructions they have given you*, don't fail to show them the sample
+disclaimer above, or a disclaimer with the details filled in for your
+specific case. Companies are usually willing to sign a disclaimer
+without any fuss. If you make your request less specific, you may
+open Pandora's box and cause a long and unnecessary delay.
+
+Below is the assignment contract that we usually use. You would need
+to print it out, sign it, and snail it to:
+
+Richard Stallman
+77 Mass Ave rm 32-381
+Cambridge MA 02139
+USA
+
+Snail a copy of the employer's disclaimer as well.
+
+Please send me email about what you decide to do. If you have any
+questions, or would like something to be changed, ask rms@ai.mit.edu via email.
+ ASSIGNMENT
+
+ For good and valuable consideration, receipt of which I acknowledge, I,
+NAME OF PERSON, hereby transfer to the Free Software Foundation, Inc. (the
+"Foundation") my entire right, title, and interest (including all rights
+under copyright) in my changes and enhancements to the manual "NAME OF
+MANUAL", subject to the conditions below. These changes and enhancements
+are herein called the "Work". The work hereby assigned shall also include
+any future revisions of these changes and enhancements hereafter made by me.
+
+ Upon thirty days' prior written notice, the Foundation agrees to
+grant me non-exclusive rights to use the Work (i.e. my changes and
+enhancements, not the manual which I enhanced) as I see fit; (and the
+Foundation's rights shall otherwise continue unchanged).
+
+ For the purposes of this contract, a work "based on the Work" means
+any work that in whole or in part incorporates or is derived from all or
+part of the Work.
+
+ The Foundation promises that all distribution of the Work, or of any
+work "based on the Work", that takes place under the control of the
+Foundation or its assignees, shall be on terms that explicitly and
+perpetually permit anyone possessing a copy of the work to which the terms
+apply, and possessing accurate notice of these terms, to redistribute
+copies of the work to anyone on the same terms. These terms shall not
+restrict which members of the public copies may be distributed to. These
+terms shall not require a member of the public to pay any royalty to the
+Foundation or to anyone else for any permitted use of the work they apply
+to, or to communicate with the Foundation or its agents in any way either
+when redistribution is performed or on any other occasion.
+
+ The Foundation promises to give or send me, upon reasonable prior notice
+and payment of a fee no more than twenty times the cost of the necessary
+materials and postage, a copy of any or all of the works "based on the
+Work" that it offers to the public or that it has offered within the
+past six months, or that it distributed for the first time within the past
+six months. My request shall detail whether I wish to receive all
+such works or specific works. My choice of works to request may affect the
+cost and therefore the fee.
+
+ I hereby represent and warrant that I am the sole copyright holder for the
+Work and that I have the right and power to enter into this contract. I
+hereby indemnify and hold harmless the Foundation, its officers, employees,
+and agents against any and all claims, actions or damages (including
+attorney's reasonable fees) asserted by or paid to any party on account of a
+breach or alleged breach of the foregoing warranty. I make no other express
+or implied warranty (including without limitation, in this disclaimer of
+warranty, any warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE).
+
+Agreed: [signature] Date:
+
+
+ACCEPTED: FREE SOFTWARE FOUNDATION - Thanks for contributing to the GNU
+project!
+
+Richard M. Stallman, President
+
+Please do not delete the control-l character before this line.
+Please print this as a separate page.
+
+Please email a copy of the information on this page to
+fsf-records@gnu.org, if you can, so that our clerk doesn't have
+to type it in. Use your full name as the subject line.
+
+Otherwise, please write down the answers and snail this with
+your assignment.
+
+[For the copyright registration, what country are you a citizen of?]
+
+
+[What year were you born?]
+
+
+[What is your email address?]
+
+
+[Please write your snail address here, so we can snail a copy back to you.]
+
+
+
+
+
+
+[Which files have you changed so far, and which new files have you written
+so far?]
diff --git a/gnulib/doc/Copyright/assign.future.manual b/gnulib/doc/Copyright/assign.future.manual
new file mode 100644
index 00000000..3f7e92ee
--- /dev/null
+++ b/gnulib/doc/Copyright/assign.future.manual
@@ -0,0 +1,129 @@
+The way to assign copyright to the Foundation is to sign an assignment
+contract. This is what legally makes the FSF the copyright holder so
+that we can register the copyright on the new version.
+I'm assuming that you wrote these changes yourself;
+if other people wrote parts, we may need papers from them.
+
+If you are employed to do writing (even at a university), or have
+made an agreement with your employer or school saying it owns text
+you write, then you and we need a signed piece of paper from your
+employer disclaiming rights to your changes.
+
+The disclaimer should be signed by a vice president or general manager
+of the company. If you can't get at them, anyone else authorized to
+license manuals produced there will do. Here is a sample wording:
+
+ Digital Stimulation Corporation hereby disclaims all copyright
+ interest in the changes and enhancements made by Hugh Heffner to the
+ manual "The Seduction Manual", including both those he has already
+ made and those he will make in the future. We do not consider them
+ as works made for hire for us.
+
+ <signature of Ty Coon>, 1 April 1987
+ Ty Coon, President of Vice, Digital Stimulation Corp.
+
+IMPORTANT: When you talk to your employer, *no matter what
+instructions they have given you*, don't fail to show them the sample
+disclaimer above, or a disclaimer with the details filled in for your
+specific case. Companies are usually willing to sign a disclaimer
+without any fuss. If you make your request less specific, you may
+open Pandora's box and cause a long and unnecessary delay.
+
+Below is the assignment contract that we usually use. You would need
+to print it out, sign it, and snail it to:
+
+Richard Stallman
+77 Mass Ave rm 32-381
+Cambridge MA 02139
+USA
+
+Snail a copy of the employer's disclaimer as well.
+
+Please send me email about what you decide to do. If you have any
+questions, or would like something to be changed, ask rms@ai.mit.edu via email.
+ ASSIGNMENT
+
+ For good and valuable consideration, receipt of which I acknowledge, I,
+NAME OF PERSON, hereby transfer to the Free Software Foundation, Inc. (the
+"Foundation") my entire right, title, and interest (including all rights
+under copyright) in my changes and enhancements to the manual "NAME OF
+MANUAL", including those I have already made and those I shall make in the
+future, subject to the conditions below. These changes and enhancements
+are herein called the "Work".
+
+ Upon thirty days' prior written notice, the Foundation agrees to
+grant me non-exclusive rights to use the Work (i.e. my changes and
+enhancements, not the manual which I enhanced) as I see fit; (and the
+Foundation's rights shall otherwise continue unchanged).
+
+ For the purposes of this contract, a work "based on the Work" means
+any work that in whole or in part incorporates or is derived from all or
+part of the Work.
+
+ The Foundation promises that all distribution of the Work, or of any
+work "based on the Work", that takes place under the control of the
+Foundation or its assignees, shall be on terms that explicitly and
+perpetually permit anyone possessing a copy of the work to which the terms
+apply, and possessing accurate notice of these terms, to redistribute
+copies of the work to anyone on the same terms. These terms shall not
+restrict which members of the public copies may be distributed to. These
+terms shall not require a member of the public to pay any royalty to the
+Foundation or to anyone else for any permitted use of the work they apply
+to, or to communicate with the Foundation or its agents in any way either
+when redistribution is performed or on any other occasion.
+
+ The Foundation promises to give or send me, upon reasonable prior notice
+and payment of a fee no more than twenty times the cost of the necessary
+materials and postage, a copy of any or all of the works "based on the
+Work" that it offers to the public or that it has offered within the
+past six months, or that it distributed for the first time within the past
+six months. My request shall detail whether I wish to receive all
+such works or specific works. My choice of works to request may affect the
+cost and therefore the fee.
+
+ I hereby represent and warrant that I am the sole copyright holder for the
+Work and that I have the right and power to enter into this contract. I
+hereby indemnify and hold harmless the Foundation, its officers, employees,
+and agents against any and all claims, actions or damages (including
+attorney's reasonable fees) asserted by or paid to any party on account of a
+breach or alleged breach of the foregoing warranty. I make no other express
+or implied warranty (including without limitation, in this disclaimer of
+warranty, any warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE).
+
+Agreed: [signature] Date:
+
+
+For the Free Software Foundation,
+
+ACCEPTED: FREE SOFTWARE FOUNDATION - Thanks for contributing to the GNU project!
+
+Richard M. Stallman, President
+
+Please do not delete the control-l character before this line.
+Please print this as a separate page.
+
+Please email a copy of the information on this page to
+fsf-records@gnu.org, if you can, so that our clerk doesn't have
+to type it in. Use your full name as the subject line.
+
+Otherwise, please write down the answers and snail this with
+your assignment.
+
+[For the copyright registration, what country are you a citizen of?]
+
+
+[What year were you born?]
+
+
+[What is your email address?]
+
+
+[Please write your snail address here, so we can snail a copy back to you.]
+
+
+
+
+
+
+[Which files have you changed so far, and which new files have you written
+so far?]
diff --git a/gnulib/doc/Copyright/assign.manual b/gnulib/doc/Copyright/assign.manual
new file mode 100644
index 00000000..c566d777
--- /dev/null
+++ b/gnulib/doc/Copyright/assign.manual
@@ -0,0 +1,117 @@
+The way to assign copyright on this manual to the Foundation is to
+sign an assignment contract.
+
+In addition, if you have made an agreement with an employer or school
+to give them rights to such work, or if it might be considered part of
+your job, then you and we need a signed piece of paper from your
+employer or school, disclaiming rights to the manual.
+
+The disclaimer should be signed by a vice president or general manager
+of the company. If you can't get at them, anyone else authorized to
+license works produced there will do. Here is a sample wording:
+
+ Digital Stimulation Corporation hereby disclaims all copyright interest
+ in the manual, "The Automatic Manual", written by Mr. Write, including
+ both the present version of the manual and his/her future changes and
+ enhancements to it. We do not consider it or them as a work made
+ for hire for us.
+
+ <signature of Ty Coon>, 1 April 1987
+ Ty Coon, President of Vice, Digital Stimulation Corp.
+
+IMPORTANT: When you talk to your employer, *no matter what
+instructions they have given you*, don't fail to show them the sample
+disclaimer above. Companies are usually willing to sign a disclaimer
+without any fuss. If you vary the request, or make it less specific,
+you are liable to open a Pandora's Box and cause a long and
+unnecessary delay.
+
+Below is the assignment contract that we usually use. You would need
+to print it out, sign it, and snail it to me:
+
+Richard Stallman
+77 Mass Ave rm 32-381
+Cambridge MA 02139
+USA
+
+Snail me a copy of the employer's disclaimer as well.
+
+Please send me email about what you decide to do. If you have any
+questions, or would like something to be changed, ask me via email.
+ ASSIGNMENT
+
+ For $1 and other good and valuable consideration, receipt of which I
+acknowledge, I, NAME OF PERSON, hereby transfer to the Free Software
+Foundation, Inc. (the "Foundation") my entire right, title, and interest
+(including all rights under copyright) in my manual "NAME OF MANUAL" (the
+"Work"), subject to the conditions below. The work hereby assigned shall
+further include any future changes and/or enhancements hereafter made by me.
+
+ Upon thirty days' prior written notice, the Foundation agrees to grant me
+non-exclusive rights to use the Work as I see fit; (and the Foundation's
+rights shall otherwise continue unchanged).
+
+ For the purposes of this contract, a work "based on the Work" means any
+work that in whole or in part incorporates or is derived from all or part of
+the Work.
+
+ The Foundation promises that all distribution of the Work, or of any
+work "based on the Work", that takes place under the control of the
+Foundation or its agents or assignees, shall be on terms that explicitly and
+perpetually permit anyone possessing a copy of the work to which the terms
+apply, and possessing accurate notice of these terms, to redistribute copies
+of the work to anyone on the same terms. These terms shall not restrict which
+members of the public copies may be distributed to. These terms shall not
+require a member of the public to pay any royalty to the Foundation or to
+anyone else for any permitted use of the work they apply to, or to communicate
+with the Foundation or its agents in any way either when redistribution is
+performed or on any other occasion.
+
+ The Foundation promises that any work "based on the Work" which is
+a program, and which is offered to the public by the Foundation or its
+agents or assignees, shall be offered in the form of machine-readable
+source code, in addition to any other forms of the Foundation's
+choosing. However, the Foundation is free to choose at its
+convenience the media of distribution for machine-readable source
+code.
+
+ The Foundation promises to give or send me, upon reasonable prior notice
+and payment of a fee no more than twenty times the cost of the necessary
+materials and postage, a copy of any or all of the works "based on the
+Work" that it offers to the public or that it has offered within the past
+six months, or that it distributed for the first time within the past six
+months. For works that are programs, the machine-readable source code shall
+be included. My request shall detail whether I wish to receive all such works
+or specific works. My choice of works to request may affect the cost and
+therefore the fee.
+
+ I hereby represent and warrant that I am the sole copyright holder for the
+Work and that I have the right and power to enter into this contract. I
+hereby indemnify and hold harmless the Foundation, its officers, employees,
+and agents against any and all claims, actions or damages (including
+attorney's reasonable fees) asserted by or paid to any party on account of a
+breach or alleged breach of the foregoing warranty. I make no other express
+or implied warranty (including without limitation, in this disclaimer of
+warranty, any warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE).
+
+Agreed: [signature and date]
+
+
+
+ACCEPTED: FREE SOFTWARE FOUNDATION - Thanks for contributing to the GNU project!
+
+Richard M. Stallman, President
+
+Please write down the answers to these questions, and snail this page
+with your assignment.
+
+[For the copyright registration, what country are you a citizen of?]
+
+
+[What year were you born?]
+
+
+[What is your email address?]
+
+
+[Please write your snail address here, so we can snail a copy back to you.]
diff --git a/gnulib/doc/Copyright/assign.translation.manual b/gnulib/doc/Copyright/assign.translation.manual
new file mode 100644
index 00000000..7077bc24
--- /dev/null
+++ b/gnulib/doc/Copyright/assign.translation.manual
@@ -0,0 +1,107 @@
+The way to assign copyright to the Foundation is to sign an assignment
+contract. This is what legally makes the FSF the copyright holder so that
+we can register the copyright on the new version. I'm assuming that you
+did all the translating yourself; if other people wrote parts, we may need
+papers from them as well.
+
+If you are employed to do writing (even at a university), or have
+made an agreement with your employer or school saying it owns text
+you write, then you and we need a signed piece of paper from your
+employer disclaiming rights to your changes.
+
+The disclaimer should be signed by a vice president or general manager
+of the company. If you can't get at them, anyone else authorized to
+license manuals written there will do. Here is a sample wording:
+
+ Digital Stimulation Corporation hereby disclaims all copyright
+ interest in Hugh Heffner's translation of "The Seduction Manual",
+ also including any future revisions he makes to this translation.
+ We do not consider it or them as a work made for hire for us.
+
+ <signature of Ty Coon>, 1 April 1987
+ Ty Coon, President of Vice, Digital Stimulation Corp.
+
+IMPORTANT: When you talk to your employer, *no matter what
+instructions they have given you*, don't fail to show them the sample
+disclaimer above, or a disclaimer with the details filled in for your
+specific case. Companies are usually willing to sign a disclaimer
+without any fuss. If you make your request less specific, you may
+open Pandora's box and cause a long and unnecessary delay.
+
+Below is the assignment contract that we usually use. You would need
+to print it out, sign it, and snail it to:
+
+Richard Stallman
+545 Tech Sq rm 425
+Cambridge, MA 02139
+USA
+
+Snail a copy of the employer's disclaimer as well.
+
+Please send me email about what you decide to do. If you have any
+questions, or would like something to be changed, ask rms@ai.mit.edu via email.
+ ASSIGNMENT
+
+ For good and valuable consideration, receipt of which I acknowledge, I,
+NAME OF PERSON, hereby transfer to the Free Software Foundation, Inc. (the
+"Foundation") my entire right, title, and interest (including all rights
+under copyright) in my translation of the manual "NAME OF MANUAL", subject
+to the conditions below. This translation is herein called the "Work".
+The work hereby assigned shall also include any future revisions of this
+translation hereafter made by me.
+
+ For the purposes of this contract, a work "based on the Work" means
+any work that in whole or in part incorporates or is derived from all or
+part of the Work.
+
+ The Foundation promises that all distribution of the Work, or of any
+work "based on the Work", that takes place under the control of the
+Foundation or its assignees, shall be on terms that explicitly and
+perpetually permit anyone possessing a copy of the work to which the terms
+apply, and possessing accurate notice of these terms, to redistribute
+copies of the work to anyone on the same terms. These terms shall not
+restrict which members of the public copies may be distributed to. These
+terms shall not require a member of the public to pay any royalty to the
+Foundation or to anyone else for any permitted use of the work they apply
+to, or to communicate with the Foundation or its agents in any way either
+when redistribution is performed or on any other occasion.
+
+ The Foundation promises to give or send me, upon reasonable prior notice
+and payment of a fee no more than twenty times the cost of the necessary
+materials and postage, a copy of any or all of the works "based on the
+Work" that it offers to the public or that it has offered within the
+past six months, or that it distributed for the first time within the past
+six months. My request shall detail whether I wish to receive all
+such works or specific works. My choice of works to request may affect the
+cost and therefore the fee.
+
+ I hereby represent and warrant that I am the sole copyright holder for the
+Work and that I have the right and power to enter into this contract. I
+hereby indemnify and hold harmless the Foundation, its officers, employees,
+and agents against any and all claims, actions or damages (including
+attorney's reasonable fees) asserted by or paid to any party on account of a
+breach or alleged breach of the foregoing warranty. I make no other express
+or implied warranty (including without limitation, in this disclaimer of
+warranty, any warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE).
+
+Agreed: [signature] Date:
+
+
+For the Free Software Foundation,
+Richard Stallman, President:
+
+Please do not delete the control-l character before this line.
+Please print this as a separate page.
+
+[For the copyright registration, what country are you a citizen of?
+What year were you born? Please write the information here; sending
+it separately (eg. in a message) makes extra clerical work for us.]
+
+
+
+[What is your email address?]
+
+
+[Please write your snail address here, so we can snail a copy back to you.]
+
+
diff --git a/gnulib/doc/Copyright/conditions.text b/gnulib/doc/Copyright/conditions.text
new file mode 100644
index 00000000..6e19adf0
--- /dev/null
+++ b/gnulib/doc/Copyright/conditions.text
@@ -0,0 +1,136 @@
+Legal Issues about Contributing Code to GNU last updated 8 Feb 2009
+
+Project GNU has to be careful to obey copyright laws, even though
+these laws are wrong when they stop people from sharing generally
+useful published information such as software, because we are in the
+public eye. We also use copyright to defend users' freedom, by means
+of copyleft (though this does not excuse copyright law for helping
+to make software proprietary).
+
+This means that if you want to contribute software to GNU, you have to
+do something to give us legal permission to use it. There are three
+ways this can be done:
+
+* Assign the copyright to the Free Software Foundation.
+This allows the FSF to act to stop violations of the GPL.
+
+* Keep the copyright and release the program yourself under the GNU
+GPL. (This alternative too impractical for contributions to a
+preexisting FSF-copyrighted GNU program.)
+
+* Put the code in the public domain. Then there is nothing to stop
+hoarding of modified versions, but we can still use the program in GNU.
+
+Most of these alternatives require a signed piece of paper to make it
+happen.
+
+* Assigning copyright.
+
+Assigning the copyright means signing a contract that makes the Free
+Software Foundation the "owner" of the program according to the law.
+As the copyright holder, the Foundation can sue anyone who tries to
+distribute the program as a proprietary product. We are willing to
+keep your name on the program as the author for as long as the program
+remains recognizably distinct. ("Owner" is in quotes to show that we
+don't really believe in this kind of ownership.)
+
+The assignment contract commits the foundation to setting distribution
+terms that permit free redistribution.
+
+Often we don't want to do the work of starting to distribute a program
+right away. There are many things which we will need in order to have
+a complete system but which aren't really useful until the rest of the
+system is done. But signing the assignment does not stop you from
+distributing the program yourself--as long as you do so under the GNU
+terms. You don't have to wait for us to start distributing. You can
+start distributing as soon as you attach our standard copyleft to the
+files. (Ask for our advice on how to do this.)
+
+The assignment contract we normally use has a clause that permits you
+to use your code in proprietary programs, on 30 days' notice. (The 30
+days' notice is there because, through a legal technicality, it would
+improve our position in a suit against a hoarder.) Although we
+believe that proprietary software is wrong, we include this clause
+because it would serve no purpose to ask you to promise not to do it.
+You're giving us a gift in the first place.
+
+You don't need to invoke this clause in order to distribute copies as
+free software under the GNU GPL, since everyone is allowed to do that.
+
+* Releasing it yourself.
+
+You can release a program yourself under copyleft distribution terms
+such as the GNU GPL. (In order to accept the program as GNU software,
+we would have to be happy with your choice of terms.) This does not
+require a contract between you and the FSF, but we would appreciate
+having a signed piece of paper to confirm your decision.
+
+If someone violates your terms--for example, if someone gets a copy
+from us, and uses it as a basis for a proprietary product in violation
+of the terms--we cannot sue him. You would have to sue, or he gets
+away with it.
+
+* Public domain.
+
+If you put the program in the public domain, we prefer to have a signed
+piece of paper--a disclaimer of rights--from you confirming this. If the
+program is not very important, we can do without one; the worst that could
+happen is that we might some day be forced to stop using it.
+
+The law says that anyone can copyright a modified version of the public
+domain work. (This doesn't restrict the original, which remains in the
+public domain; only the changes are copyrighted.) If we make extensive
+changes, we will probably do this and add our usual copyleft. If we make
+small changes, we will leave the version we distribute in the public
+domain.
+
+* What about your employer?
+
+If you are employed to do programming, or have made an agreement with your
+employer that says it owns programs you write, we need a signed piece of
+paper from your employer disclaiming rights to the program. It should be
+signed by a vice president or general manager of the company. If you
+can't get at them, it is almost as good to find someone who signs licenses
+for software that is purchased. Here is a sample wording:
+
+ Digital Stimulation Corporation hereby disclaims all copyright interest
+ in the program "seduce.el" (a program to direct assemblers to make passes
+ at compilers under GNU Emacs) written by Hugh Heffner.
+
+ <signature of Ty Coon>, 1 April 1987
+ Ty Coon, President of Vice, Digital Stimulation Corp.
+
+The description of what the program does is just to make it clearer
+what the disclaimer covers.
+
+If what you did was change an existing program, it should say this:
+
+ ...in the changes and enhancements made by Hugh Heffner to the
+ program "seduce.el".
+
+* Did anyone else contribute?
+
+If someone else contributed more than a few lines here or there to the
+program, then that person too is an author, and that person too needs to
+sign papers just as you do. So may that person's employer. However, if
+his contribution is just a fraction of the whole work, it is satisfactory
+if he disclaims his own rights, even if you are assigning yours. (If just
+the minor contributors' work goes in the public domain, that doesn't leave
+much of a loophole for hoarders.)
+
+If you incorporated packages which you found floating around as "public
+domain", we might still want to track down their authors, to get
+disclaimers to reassure us that they really are in the public domain. So
+keep track of what these packages are and who wrote them.
+
+* A reminder:
+
+In working on a project for GNU, DO NOT study and follow any Unix
+sources or other non-free software that might have any bearing on the
+project. Don't refer to them at all, unless you are forced to for
+non-GNU reasons.
+
+It is not considered a serious problem if you have read Unix sources
+or other non-free source code in the past for other purposes, provided
+you don't copy anything in particular from them. However, referring
+to them while you do the work could cause us legal problems later.
diff --git a/gnulib/doc/Copyright/disclaim.changes.manual b/gnulib/doc/Copyright/disclaim.changes.manual
new file mode 100644
index 00000000..6afddc7c
--- /dev/null
+++ b/gnulib/doc/Copyright/disclaim.changes.manual
@@ -0,0 +1,62 @@
+I'd like to ask you to sign a disclaimer for your changes,
+thus putting them in the public domain. (For small to medium changes
+such as this, that is just as good for us as assigning copyright.)
+I'm assuming that you wrote these changes yourself;
+if other people wrote parts, we may need papers from them.
+
+ I, <name of person>, hereby disclaim all copyright interest in my
+ changes and enhancements to the manual <manual>.
+
+ I affirm that I have no other intellectual property interest that
+ would undermine this release. I represent that these changes and
+ enhancements are my own and not a copy of someone else's work.
+
+ <signature and date>
+
+*Don't forget to include the date.*
+Spell out the month name--don't use a number for the month. Dates
+using a number for the month are ambiguous; 2/8/95 means one thing in
+the US and another in Europe.
+
+If your job includes writing manuals (even at a university), or have
+made an agreement with your employer or school saying it owns manuals
+you write, then we also need a signed disclaimer from your employer or
+school.
+
+This disclaimer should be signed by a vice president or general
+manager of the company. If you can't get at them, anyone else
+authorized to license a manual produced there will do. Here is a
+sample wording:
+
+ Digital Stimulation Corporation hereby disclaims all copyright
+ interest in the changes and enhancements made by Hugh Heffner to the
+ manual "The Seduction Manual". We do not consider them as a work
+ made for hire for us.
+
+ Digital Stimulation Corporation affirms that it has no other
+ intellectual property interest that would undermine this release.
+
+ <signature of Ty Coon>, 1 April 1987
+ Ty Coon, President of Vice, Digital Stimulation Corp.
+
+If your employer says they do have an intellectual property claim that
+could conflict with releasing your changes, then please put me in
+touch with a suitable representative of the company, so that we can
+negotiate what to do about it.
+
+IMPORTANT: When you talk to your employer, *no matter what
+instructions they have given you*, don't fail to show them the sample
+disclaimer above, or a disclaimer with the details filled in for your
+specific case. Companies are usually willing to sign a disclaimer
+without any fuss. If you make your request less specific, you may
+open Pandora's box and cause a long and unnecessary delay.
+
+Please snail the signed disclaimers to:
+
+Attn: Disclaimer Clerk
+Free Software Foundation
+59 Temple Place, Suite 330
+Boston, MA 02111-1307
+USA
+
+Please print your email address on the printed disclaimer.
diff --git a/gnulib/doc/Copyright/disclaim.manual b/gnulib/doc/Copyright/disclaim.manual
new file mode 100644
index 00000000..2e42892d
--- /dev/null
+++ b/gnulib/doc/Copyright/disclaim.manual
@@ -0,0 +1,63 @@
+I'd like to ask you to sign a disclaimer for the manual, thus putting
+it in the public domain. (For a small manual such as this, it's not
+worth our trying to assert a copyleft.)
+
+ I, <name of person>, hereby disclaim all copyright interest in my
+ manual <manual> which does <one-line desription>.
+
+ I affirm that I have no other intellectual property interest
+ that would undermine this release, and will do nothing to undermine
+ it in the future. I represent that the work is my own and not
+ a copy of someone else's work.
+
+ <signature and date>
+
+*Don't forget to include the date.*
+Spell out the month name--don't use a number for the month. Dates
+using a number for the month are ambiguous; 2/8/95 means one thing in
+the US and another in Europe.
+
+If you are employed to do writing (even at a university), or have made
+an agreement with your employer or school saying it owns what you
+write, then we also need a signed disclaimer from your employer or
+school.
+
+This disclaimer should be signed by a vice president or general
+manager of the company. If you can't get at them, anyone else
+authorized to license software produced there will do. Here is a
+sample wording:
+
+ Digital Stimulation Corporation hereby disclaims all copyright interest
+ in the manual "seduce.tex" written by Hugh Heffner, including both the
+ present version of the program and his/her future changes and
+ enhancements to it. We do not consider it or them as a work made
+ for hire for us.
+
+ Digital Stimulation Corporation affirms that it has no other
+ intellectual property interest that would undermine this release,
+ and will do nothing to undermine it in the future.
+
+ <signature of Ty Coon>, 1 April 1987
+ Ty Coon, President of Vice, Digital Stimulation Corp.
+
+If your employer says they do have an intellectual property claim that
+could conflict with the use of the manual, then please put me in touch
+with a suitable representative of the company, so that we can
+negotiate what to do about it.
+
+IMPORTANT: When you talk to your employer, *no matter what
+instructions they have given you*, don't fail to show them the sample
+disclaimer above, or a disclaimer with the details filled in for your
+specific case. Companies are usually willing to sign a disclaimer
+without any fuss. If you make your request less specific, you may
+open Pandora's box and cause a long and unnecessary delay.
+
+Please snail the signed disclaimers to:
+
+Attn: Disclaimer Clerk
+Free Software Foundation
+59 Temple Place, Suite 330
+Boston, MA 02111-1307
+USA
+
+Please print your email address on the printed disclaimer.
diff --git a/gnulib/doc/Copyright/disclaim.program b/gnulib/doc/Copyright/disclaim.program
new file mode 100644
index 00000000..1f8c1cc3
--- /dev/null
+++ b/gnulib/doc/Copyright/disclaim.program
@@ -0,0 +1,65 @@
+I'd like to ask you to sign a disclaimer for the program, thus putting
+it in the public domain. (For a small program such as this, it's not
+worth our trying to assert a copyleft.)
+
+ I, <name of person>, hereby disclaim all copyright interest in my
+ program <program> which does <one-line desription>.
+
+ I affirm that I have no other intellectual property interest
+ that would undermine this release, and will do nothing to undermine
+ it in the future. I represent that the work is my own and not
+ a copy of someone else's work.
+
+ <signature and date>
+
+*Don't forget to include the date.*
+Spell out the month name--don't use a number for the month. Dates
+using a number for the month are ambiguous; 2/8/95 means one thing in
+the US and another in Europe.
+
+If you are employed to do programming (even at a university), or have
+made an agreement with your employer or school saying it owns programs
+you write, then we also need a signed disclaimer from your employer
+or school.
+
+This disclaimer should be signed by a vice president or general
+manager of the company. If you can't get at them, anyone else
+authorized to license software produced there will do. Here is a
+sample wording:
+
+ Digital Stimulation Corporation hereby disclaims all copyright interest
+ in the program "seduce" (a program to direct assemblers to make passes at
+ compilers under GNU Emacs) written by Hugh Heffner, including both the
+ present version of the program and his/her future changes and
+ enhancements to it. We do not consider it or them as a work made
+ for hire for us.
+
+
+ Digital Stimulation Corporation affirms that it has no other
+ intellectual property interest that would undermine this release,
+ and will do nothing to undermine it in the future.
+
+ <signature of Ty Coon>, 1 April 1987
+ Ty Coon, President of Vice, Digital Stimulation Corp.
+
+If your employer says they do have an intellectual property claim that
+could conflict with the use of the program, then please put me in
+touch with a suitable representative of the company, so that we can
+negotiate what to do about it.
+
+IMPORTANT: When you talk to your employer, *no matter what
+instructions they have given you*, don't fail to show them the sample
+disclaimer above, or a disclaimer with the details filled in for your
+specific case. Companies are usually willing to sign a disclaimer
+without any fuss. If you make your request less specific, you may
+open Pandora's box and cause a long and unnecessary delay.
+
+Please snail the signed disclaimers to:
+
+Attn: Disclaimer Clerk
+Free Software Foundation
+59 Temple Place, Suite 330
+Boston, MA 02111-1307
+USA
+
+Please print your email address on the printed disclaimer.
diff --git a/gnulib/doc/Copyright/request-assign.changes b/gnulib/doc/Copyright/request-assign.changes
new file mode 100644
index 00000000..a430efff
--- /dev/null
+++ b/gnulib/doc/Copyright/request-assign.changes
@@ -0,0 +1,38 @@
+Please email the following information to assign@gnu.org, and we will
+send you the assignment form that covers the changes you have already
+written. That form will cover subsequent corrections to those
+changes, but it will not cover other unrelated future changes to the
+same program.
+
+Please use your full legal name (in ASCII characters) as the subject line of the message.
+---------------------------------------------------------------------
+REQUEST: SEND FORM FOR CHANGES ALREADY MADE
+
+[What is the name of the program or package you're contributing to?]
+
+
+[Did you copy any files or text written by someone else in these changes?
+Even if that material is free software, we need to know about it.]
+
+
+[Do you have an employer who might have a basis to claim to own
+your changes? Do you attend a school which might make such a claim?]
+
+
+[For the copyright registration, what country are you a citizen of?]
+
+
+[What year were you born?]
+
+
+[Please write your email address here.]
+
+
+[Please write your postal address here.]
+
+
+
+
+
+[Which files have you changed so far, and which new files have you written
+so far?]
diff --git a/gnulib/doc/Copyright/request-assign.future b/gnulib/doc/Copyright/request-assign.future
new file mode 100644
index 00000000..f04ccd68
--- /dev/null
+++ b/gnulib/doc/Copyright/request-assign.future
@@ -0,0 +1,42 @@
+Please email the following information to assign@gnu.org, and we
+will send you the assignment form for your past and future changes.
+
+Please use your full legal name (in ASCII characters) as the subject
+line of the message.
+----------------------------------------------------------------------
+REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES
+
+[What is the name of the program or package you're contributing to?]
+
+
+[Did you copy any files or text written by someone else in these changes?
+Even if that material is free software, we need to know about it.]
+
+
+[Do you have an employer who might have a basis to claim to own
+your changes? Do you attend a school which might make such a claim?]
+
+
+[For the copyright registration, what country are you a citizen of?]
+
+
+[What year were you born?]
+
+
+[Please write your email address here.]
+
+
+[Please write your postal address here.]
+
+
+
+
+
+[Which files have you changed so far, and which new files have you written
+so far?]
+
+
+
+
+
+
diff --git a/gnulib/doc/Copyright/request-assign.program b/gnulib/doc/Copyright/request-assign.program
new file mode 100644
index 00000000..fa8aa6c1
--- /dev/null
+++ b/gnulib/doc/Copyright/request-assign.program
@@ -0,0 +1,32 @@
+Please email the following information to fsf-records@gnu.org, and we
+will send you the assignment form that covers your program.
+
+Please use your full legal name (in ASCII characters) as the subject
+line of the message.
+
+
+[What is the name of the program or package you're contributing?]
+
+
+[Will this become part of a larger GNU package? If so, what package?]
+
+
+[Did you copy any files or text written by someone else into the
+program? Even if that material is free software, we need to know
+about it.]
+
+
+[Do you have an employer who might have a basis to claim to own
+your changes? Do you attend a school which might make such a claim?]
+
+
+[What country are you a citizen of?]
+
+
+[What year were you born?]
+
+
+[Please write your email address here.]
+
+
+[Please write your postal address here.]
diff --git a/gnulib/doc/Copyright/request-disclaim.changes b/gnulib/doc/Copyright/request-disclaim.changes
new file mode 100644
index 00000000..400c67f4
--- /dev/null
+++ b/gnulib/doc/Copyright/request-disclaim.changes
@@ -0,0 +1,47 @@
+Please email the following information to assign@gnu.org, and we will
+send you the disclaimer form for your changes. This form is preferred
+when your changes are small, they do not add any nontrivial new
+files, and you are finished making them (aside perhaps from small bug
+fixes).
+
+If you would like to make further contributions to the same package,
+and you would like to avoid the need to sign more papers when you
+contribute them, you have another option: to sign a copyright
+assignment covering your future changes. If that is what you want to
+do, please tell the maintainer you would prefer to sign an assignment
+of past and future changes.
+
+
+Please use your full legal name (in ASCII characters) as the subject
+line of the message.
+-----------------------------------------------------------------------
+REQUEST: SEND DISCLAIMER FORM
+
+[What is the name of the program or package you're contributing to?]
+
+
+[Did you copy any files or text written by someone else in these changes?
+Even if that material is free software, we need to know about it.]
+
+
+[Do you have an employer who might have a basis to claim to own
+your changes?]
+
+
+[Please write your email address here.]
+
+
+[Please write your snail address here.]
+
+
+
+
+
+[Please list the files involved, or give a brief description of the changes
+being disclaimed.]
+
+
+
+
+
+
diff --git a/gnulib/doc/INSTALL b/gnulib/doc/INSTALL
new file mode 100644
index 00000000..81fd332c
--- /dev/null
+++ b/gnulib/doc/INSTALL
@@ -0,0 +1,365 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package. Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system.
+
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the `make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type `make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior `make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type `make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like `make install' and `make uninstall' work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'. This
+is known as a "VPATH" build.
+
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'. Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the `DESTDIR' variable. For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names. The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of `make' will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+ On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/gnulib/doc/INSTALL.ISO b/gnulib/doc/INSTALL.ISO
new file mode 100644
index 00000000..9f3c8086
--- /dev/null
+++ b/gnulib/doc/INSTALL.ISO
@@ -0,0 +1,365 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands './configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the 'README' file for
+instructions specific to this package. Some packages provide this
+'INSTALL' file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The 'configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a 'Makefile' in each directory of the package.
+It may also create one or more '.h' files containing system-dependent
+definitions. Finally, it creates a shell script 'config.status' that
+you can run in the future to recreate the current configuration, and a
+file 'config.log' containing compiler output (useful mainly for
+debugging 'configure').
+
+ It can also use an optional file (typically called 'config.cache'
+and enabled with '--cache-file=config.cache' or simply '-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how 'configure' could check whether to do them, and mail
+diffs or instructions to the address given in the 'README' so they can
+be considered for the next release. If you are using the cache, and at
+some point 'config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file 'configure.ac' (or 'configure.in') is used to create
+'configure' by a program called 'autoconf'. You need 'configure.ac' if
+you want to change it or regenerate 'configure' using a newer version
+of 'autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. 'cd' to the directory containing the package's source code and type
+ './configure' to configure the package for your system.
+
+ Running 'configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type 'make' to compile the package.
+
+ 3. Optionally, type 'make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type 'make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the 'make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type 'make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior 'make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing 'make clean'. To also remove the
+ files that 'configure' created (so you can compile the package for
+ a different kind of computer), type 'make distclean'. There is
+ also a 'make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type 'make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like 'make install' and 'make uninstall' work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the 'configure' script does not know about. Run './configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give 'configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU 'make'. 'cd' to the
+directory where you want the object files and executables to go and run
+the 'configure' script. 'configure' automatically checks for the
+source code in the directory that 'configure' is in and in '..'. This
+is known as a "VPATH" build.
+
+ With a non-GNU 'make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use 'make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple '-arch' options to the
+compiler but only a single '-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the 'lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, 'make install' installs the package's commands under
+'/usr/local/bin', include files under '/usr/local/include', etc. You
+can specify an installation prefix other than '/usr/local' by giving
+'configure' the option '--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like '--bindir=DIR' to specify different values for particular
+kinds of files. Run 'configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of '${prefix}', so that
+specifying just '--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to 'configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+'make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+'${prefix}'. Any directories that were specified during 'configure',
+but not in terms of '${prefix}', must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the 'DESTDIR' variable. For
+example, 'make install DESTDIR=/alternate/directory' will prepend
+'/alternate/directory' before all installation names. The approach of
+'DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of '${prefix}'
+at 'configure' time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving 'configure' the
+option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
+
+ Some packages pay attention to '--enable-FEATURE' options to
+'configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to '--with-PACKAGE' options, where PACKAGE
+is something like 'gnu-as' or 'x' (for the X Window System). The
+'README' should mention any '--enable-' and '--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, 'configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the 'configure' options '--x-includes=DIR' and
+'--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of 'make' will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with 'make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with 'make V=0'.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its '<wchar.h>' header file. The option '-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put '/usr/ucb' early in your 'PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in '/usr/bin'. So, if you need '/usr/ucb'
+in your 'PATH', put it _after_ '/usr/bin'.
+
+ On Haiku, software installed for all users goes in '/boot/common',
+not '/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features 'configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, 'configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+'--build=TYPE' option. TYPE can either be a short name for the system
+type, such as 'sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file 'config.sub' for the possible values of each field. If
+'config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option '--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with '--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for 'configure' scripts to share,
+you can create a site shell script called 'config.site' that gives
+default values for variables like 'CC', 'cache_file', and 'prefix'.
+'configure' looks for 'PREFIX/share/config.site' if it exists, then
+'PREFIX/etc/config.site' if it exists. Or, you can set the
+'CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all 'configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to 'configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the 'configure' command line, using 'VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified 'gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for 'CONFIG_SHELL' due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+'configure' Invocation
+======================
+
+ 'configure' recognizes the following options to control how it
+operates.
+
+'--help'
+'-h'
+ Print a summary of all of the options to 'configure', and exit.
+
+'--help=short'
+'--help=recursive'
+ Print a summary of the options unique to this package's
+ 'configure', and exit. The 'short' variant lists options used
+ only in the top level, while the 'recursive' variant lists options
+ also present in any nested packages.
+
+'--version'
+'-V'
+ Print the version of Autoconf used to generate the 'configure'
+ script, and exit.
+
+'--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally 'config.cache'. FILE defaults to '/dev/null' to
+ disable caching.
+
+'--config-cache'
+'-C'
+ Alias for '--cache-file=config.cache'.
+
+'--quiet'
+'--silent'
+'-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to '/dev/null' (any error
+ messages will still be shown).
+
+'--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ 'configure' can determine that directory automatically.
+
+'--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+'--no-create'
+'-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+'configure' also accepts some other, not widely useful, options. Run
+'configure --help' for more details.
+
diff --git a/gnulib/doc/INSTALL.UTF-8 b/gnulib/doc/INSTALL.UTF-8
new file mode 100644
index 00000000..0ef6ab7e
--- /dev/null
+++ b/gnulib/doc/INSTALL.UTF-8
@@ -0,0 +1,365 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands ‘./configure; make; make install’ should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the ‘README’ file for
+instructions specific to this package. Some packages provide this
+‘INSTALL’ file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The ‘configure’ shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a ‘Makefile’ in each directory of the package.
+It may also create one or more ‘.h’ files containing system-dependent
+definitions. Finally, it creates a shell script ‘config.status’ that
+you can run in the future to recreate the current configuration, and a
+file ‘config.log’ containing compiler output (useful mainly for
+debugging ‘configure’).
+
+ It can also use an optional file (typically called ‘config.cache’
+and enabled with ‘--cache-file=config.cache’ or simply ‘-C’) that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how ‘configure’ could check whether to do them, and mail
+diffs or instructions to the address given in the ‘README’ so they can
+be considered for the next release. If you are using the cache, and at
+some point ‘config.cache’ contains results you don't want to keep, you
+may remove or edit it.
+
+ The file ‘configure.ac’ (or ‘configure.in’) is used to create
+‘configure’ by a program called ‘autoconf’. You need ‘configure.ac’ if
+you want to change it or regenerate ‘configure’ using a newer version
+of ‘autoconf’.
+
+ The simplest way to compile this package is:
+
+ 1. ‘cd’ to the directory containing the package's source code and type
+ ‘./configure’ to configure the package for your system.
+
+ Running ‘configure’ might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type ‘make’ to compile the package.
+
+ 3. Optionally, type ‘make check’ to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type ‘make install’ to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the ‘make install’ phase executed with root
+ privileges.
+
+ 5. Optionally, type ‘make installcheck’ to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior ‘make install’ required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing ‘make clean’. To also remove the
+ files that ‘configure’ created (so you can compile the package for
+ a different kind of computer), type ‘make distclean’. There is
+ also a ‘make maintainer-clean’ target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type ‘make uninstall’ to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like ‘make install’ and ‘make uninstall’ work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the ‘configure’ script does not know about. Run ‘./configure --help’
+for details on some of the pertinent environment variables.
+
+ You can give ‘configure’ initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU ‘make’. ‘cd’ to the
+directory where you want the object files and executables to go and run
+the ‘configure’ script. ‘configure’ automatically checks for the
+source code in the directory that ‘configure’ is in and in ‘..’. This
+is known as a "VPATH" build.
+
+ With a non-GNU ‘make’, it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use ‘make distclean’ before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple ‘-arch’ options to the
+compiler but only a single ‘-arch’ option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the ‘lipo’ tool if you have problems.
+
+Installation Names
+==================
+
+ By default, ‘make install’ installs the package's commands under
+‘/usr/local/bin’, include files under ‘/usr/local/include’, etc. You
+can specify an installation prefix other than ‘/usr/local’ by giving
+‘configure’ the option ‘--prefix=PREFIX’, where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option ‘--exec-prefix=PREFIX’ to ‘configure’, the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like ‘--bindir=DIR’ to specify different values for particular
+kinds of files. Run ‘configure --help’ for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of ‘${prefix}’, so that
+specifying just ‘--prefix’ will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to ‘configure’; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+‘make install’ command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+‘${prefix}’. Any directories that were specified during ‘configure’,
+but not in terms of ‘${prefix}’, must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the ‘DESTDIR’ variable. For
+example, ‘make install DESTDIR=/alternate/directory’ will prepend
+‘/alternate/directory’ before all installation names. The approach of
+‘DESTDIR’ overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of ‘${prefix}’
+at ‘configure’ time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving ‘configure’ the
+option ‘--program-prefix=PREFIX’ or ‘--program-suffix=SUFFIX’.
+
+ Some packages pay attention to ‘--enable-FEATURE’ options to
+‘configure’, where FEATURE indicates an optional part of the package.
+They may also pay attention to ‘--with-PACKAGE’ options, where PACKAGE
+is something like ‘gnu-as’ or ‘x’ (for the X Window System). The
+‘README’ should mention any ‘--enable-’ and ‘--with-’ options that the
+package recognizes.
+
+ For packages that use the X Window System, ‘configure’ can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the ‘configure’ options ‘--x-includes=DIR’ and
+‘--x-libraries=DIR’ to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of ‘make’ will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with ‘make V=1’; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with ‘make V=0’.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its ‘<wchar.h>’ header file. The option ‘-nodtk’ can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put ‘/usr/ucb’ early in your ‘PATH’. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in ‘/usr/bin’. So, if you need ‘/usr/ucb’
+in your ‘PATH’, put it _after_ ‘/usr/bin’.
+
+ On Haiku, software installed for all users goes in ‘/boot/common’,
+not ‘/usr/local’. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features ‘configure’ cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, ‘configure’ can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+‘--build=TYPE’ option. TYPE can either be a short name for the system
+type, such as ‘sun4’, or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file ‘config.sub’ for the possible values of each field. If
+‘config.sub’ isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option ‘--target=TYPE’ to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with ‘--host=TYPE’.
+
+Sharing Defaults
+================
+
+ If you want to set default values for ‘configure’ scripts to share,
+you can create a site shell script called ‘config.site’ that gives
+default values for variables like ‘CC’, ‘cache_file’, and ‘prefix’.
+‘configure’ looks for ‘PREFIX/share/config.site’ if it exists, then
+‘PREFIX/etc/config.site’ if it exists. Or, you can set the
+‘CONFIG_SITE’ environment variable to the location of the site script.
+A warning: not all ‘configure’ scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to ‘configure’. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the ‘configure’ command line, using ‘VAR=value’. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified ‘gcc’ to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for ‘CONFIG_SHELL’ due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+‘configure’ Invocation
+======================
+
+ ‘configure’ recognizes the following options to control how it
+operates.
+
+‘--help’
+‘-h’
+ Print a summary of all of the options to ‘configure’, and exit.
+
+‘--help=short’
+‘--help=recursive’
+ Print a summary of the options unique to this package's
+ ‘configure’, and exit. The ‘short’ variant lists options used
+ only in the top level, while the ‘recursive’ variant lists options
+ also present in any nested packages.
+
+‘--version’
+‘-V’
+ Print the version of Autoconf used to generate the ‘configure’
+ script, and exit.
+
+‘--cache-file=FILE’
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally ‘config.cache’. FILE defaults to ‘/dev/null’ to
+ disable caching.
+
+‘--config-cache’
+‘-C’
+ Alias for ‘--cache-file=config.cache’.
+
+‘--quiet’
+‘--silent’
+‘-q’
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to ‘/dev/null’ (any error
+ messages will still be shown).
+
+‘--srcdir=DIR’
+ Look for the package's source code in directory DIR. Usually
+ ‘configure’ can determine that directory automatically.
+
+‘--prefix=DIR’
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+‘--no-create’
+‘-n’
+ Run the configure checks, but stop before creating any output
+ files.
+
+‘configure’ also accepts some other, not widely useful, options. Run
+‘configure --help’ for more details.
+
diff --git a/gnulib/doc/README b/gnulib/doc/README
new file mode 100644
index 00000000..ed632c09
--- /dev/null
+++ b/gnulib/doc/README
@@ -0,0 +1,46 @@
+Misc notes
+----------
+
+regexprops-generic.texi is generated via a utility in findutils.
+
+How to update gnulib manual on www.gnu.org
+------------------------------------------
+
+1) You need a non-anonymous checkout of the web pages directory.
+
+ $ cvs -d :ext:jas@cvs.savannah.gnu.org:/web/gnulib \
+ checkout gnulib
+
+2) Get familiar with the instructions for web page maintainers.
+ http://www.gnu.org/server/standards/readme_index.html
+ http://www.gnu.org/server/standards/README.software.html
+ especially the note about symlinks.
+
+3) Assuming GNULIB_CHECKOUT refers to a checkout of the gnulib dir,
+ and GNULIB_WWW_CHECKOUT refers to the other directory created above (1),
+ do
+
+ GNULIB_WWW_CHECKOUT=`cd $GNULIB_WWW_CHECKOUT && pwd`
+ cd $GNULIB_CHECKOUT/doc
+ make updated-stamp
+ ../build-aux/gendocs.sh -o "$GNULIB_WWW_CHECKOUT/manual" \
+ gnulib "The GNU Portability Library"
+ cd $GNULIB_WWW_CHECKOUT
+
+ Verify that the result looks sane.
+
+4) Commit the modified and the new files.
+
+5) Find the files which have not been overwritten (because they belonged
+ to sections that have been removed or renamed):
+
+ $ cd manual/html_node
+ $ ls -lt
+
+ Remove these files and commit their removal to CVS.
+ For each of these files, add a line to the file .symlinks. This will
+ ensure that hyperlinks to the removed files will redirect to the entire
+ manual; this is better than a 404 error.
+
+There is a problem with 'index.html' being written twice (once for POSIX
+function 'index', once for the table of contents); you can ignore this issue.
diff --git a/gnulib/doc/acl-cygwin.txt b/gnulib/doc/acl-cygwin.txt
new file mode 100644
index 00000000..e3007f51
--- /dev/null
+++ b/gnulib/doc/acl-cygwin.txt
@@ -0,0 +1,138 @@
+$ getfacl --help
+Usage: getfacl [-adn] FILE [FILE2...]
+Display file and directory access control lists (ACLs).
+
+ -a, --all display the filename, the owner, the group, and
+ the ACL of the file
+ -d, --dir display the filename, the owner, the group, and
+ the default ACL of the directory, if it exists
+ -h, --help output usage information and exit
+ -n, --noname display user and group IDs instead of names
+ -v, --version output version information and exit
+
+When multiple files are specified on the command line, a blank
+line separates the ACLs for each file.
+For each argument that is a regular file, special file or
+directory, getfacl displays the owner, the group, and the ACL.
+For directories getfacl displays additionally the default ACL.
+
+With no options specified, getfacl displays the filename, the
+owner, the group, and both the ACL and the default ACL, if it
+exists.
+
+The format for ACL output is as follows:
+ # file: filename
+ # owner: name or uid
+ # group: name or uid
+ user::perm
+ user:name or uid:perm
+ group::perm
+ group:name or gid:perm
+ mask:perm
+ other:perm
+ default:user::perm
+ default:user:name or uid:perm
+ default:group::perm
+ default:group:name or gid:perm
+ default:mask:perm
+ default:other:perm
+
+
+
+$ setfacl --help
+Usage: setfacl [-r] (-f ACL_FILE | -s acl_entries) FILE...
+ setfacl [-r] ([-d acl_entries] [-m acl_entries]) FILE...
+Modify file and directory access control lists (ACLs)
+
+ -d, --delete delete one or more specified ACL entries
+ -f, --file set ACL entries for FILE to ACL entries read
+ from a ACL_FILE
+ -m, --modify modify one or more specified ACL entries
+ -r, --replace replace mask entry with maximum permissions
+ needed for the file group class
+ -s, --substitute substitute specified ACL entries for the
+ ACL of FILE
+ -h, --help output usage information and exit
+ -v, --version output version information and exit
+
+At least one of (-d, -f, -m, -s) must be specified
+
+ Acl_entries are one or more comma-separated ACL entries
+ from the following list:
+
+ u[ser]::perm
+ u[ser]:uid:perm
+ g[roup]::perm
+ g[roup]:gid:perm
+ m[ask]:perm
+ o[ther]:perm
+
+ Default entries are like the above with the additional
+ default identifier. For example:
+
+ d[efault]:u[ser]:uid:perm
+
+ 'perm' is either a 3-char permissions string in the form
+ "rwx" with the character - for no permission
+ or it is the octal representation of the permissions, a
+ value from 0 (equivalent to "---") to 7 ("rwx").
+ 'uid' is a user name or a numerical uid.
+ 'gid' is a group name or a numerical gid.
+
+
+For each file given as parameter, setfacl will either replace its
+complete ACL (-s, -f), or it will add, modify, or delete ACL
+entries.
+
+The following options are supported:
+
+-d Delete one or more specified entries from the file's ACL.
+ The owner, group and others entries must not be deleted.
+ Acl_entries to be deleted should be specified without
+ permissions, as in the following list:
+
+ u[ser]:uid
+ g[roup]:gid
+ d[efault]:u[ser]:uid
+ d[efault]:g[roup]:gid
+ d[efault]:m[ask]:
+ d[efault]:o[ther]:
+
+-f Take the Acl_entries from ACL_FILE one per line. Whitespace
+ characters are ignored, and the character "#" may be used
+ to start a comment. The special filename "-" indicates
+ reading from stdin.
+ Required entries are
+ - One user entry for the owner of the file.
+ - One group entry for the group of the file.
+ - One other entry.
+ If additional user and group entries are given:
+ - A mask entry for the file group class of the file.
+ - No duplicate user or group entries with the same uid/gid.
+ If it is a directory:
+ - One default user entry for the owner of the file.
+ - One default group entry for the group of the file.
+ - One default mask entry for the file group class.
+ - One default other entry.
+
+-m Add or modify one or more specified ACL entries.
+ Acl_entries is a comma-separated list of entries from the
+ same list as above.
+
+-r Causes the permissions specified in the mask entry to be
+ ignored and replaced by the maximum permissions needed for
+ the file group class.
+
+-s Like -f, but substitute the file's ACL with Acl_entries
+ specified in a comma-separated list on the command line.
+
+While the -d and -m options may be used in the same command, the
+-f and -s options may be used only exclusively.
+
+Directories may contain default ACL entries. Files created
+in a directory that contains default ACL entries will have
+permissions according to the combination of the current umask,
+the explicit permissions requested and the default ACL entries
+Note: Under Cygwin, the default ACL entries are not taken into
+account currently.
+
diff --git a/gnulib/doc/acl-resources.txt b/gnulib/doc/acl-resources.txt
new file mode 100644
index 00000000..6af161f1
--- /dev/null
+++ b/gnulib/doc/acl-resources.txt
@@ -0,0 +1,460 @@
+General introduction:
+ http://www.suse.de/~agruen/acl/linux-acls/online/
+
+
+POSIX ACLs
+
+Documents from POSIX.1e (headers & functions) and POSIX.2c (utilities):
+ http://wt.xpilot.org/publications/posix.1e/download.html
+
+
+Linux ACLs
+
+Introduction:
+ http://www.suse.de/~agruen/acl/linux-acls/online/
+Hands-on tutorial:
+ http://www.vanemery.com/Linux/ACL/linux-acl.html
+
+Manual pages:
+ http://www.linuxmanpages.com/
+Includes:
+ <sys/acl.h>
+ <acl/libacl.h>
+Library:
+ -lacl
+Functions:
+ acl_add_perm
+ acl_calc_mask
+ acl_check
+ acl_clear_perms
+ acl_cmp
+ acl_copy_entry
+ acl_copy_ext
+ acl_copy_int
+ acl_create_entry
+ acl_delete_def_file
+ acl_delete_entry
+ acl_delete_perm
+ acl_dup
+ acl_entries
+ acl_equiv_mode
+ acl_error
+ acl_extended_fd
+ acl_extended_file
+ acl_free
+ acl_from_mode
+ acl_from_text
+ acl_get_entry
+ acl_get_fd
+ acl_get_file
+ acl_get_perm
+ acl_get_permset
+ acl_get_qualifier
+ acl_get_tag_type
+ acl_init
+ acl_set_fd
+ acl_set_file
+ acl_set_permset
+ acl_set_qualifier
+ acl_set_tag_type
+ acl_size
+ acl_to_any_text
+ acl_to_text
+ acl_valid
+Utilities:
+ getfacl
+ setfacl
+
+
+Solaris ACLs
+
+Introductions:
+ http://www.softpanorama.org/Solaris/ACL/index.shtml
+ http://www.cs.duke.edu/csl/faqs/solaris-acls.php
+Manual pages:
+ http://docs.sun.com/app/docs/doc/816-5167/acl-2?l=en&a=view
+ http://docs.sun.com/app/docs/doc/816-5165/getfacl-1?l=en&a=view
+ http://docs.sun.com/app/docs/doc/816-5165/setfacl-1?l=en&a=view
+ http://docs.sun.com/app/docs/doc/816-5167/pathconf-2?l=en&a=view
+Includes:
+ <sys/acl.h>
+Library:
+ -lsec
+Functions:
+ acl
+ facl
+Functions in libsec:
+ aclcheck
+ aclfrommode
+ aclfromtext
+ aclsort
+ acltomode
+ acltotext
+Additionally in Solaris 10 patch 118833-17 (<sys/acl.h> version 1.15):
+ acl_t type
+ ACL_NO_TRIVIAL macro
+ ACE_OTHER macro replaced with ACE_EVERYONE macro
+ ACE_OWNER, ACE_GROUP changed their values(!)
+ ALLOW, DENY macros removed(!)
+ acl_check
+ acl_free
+ acl_fromtext
+ acl_get
+ acl_set
+ acl_strip
+ acl_totext
+ acl_trivial
+ facl_get
+ facl_set
+Utilities:
+ getfacl
+ setfacl
+ chmod
+
+
+FreeBSD ACLs
+
+Introduction:
+ http://www.freebsd.org/doc/en/books/handbook/fs-acl.html
+ http://www.onlamp.com/pub/a/bsd/2005/09/22/FreeBSD_Basics.html
+Manual pages:
+ http://www.freebsd.org/cgi/man.cgi
+ http://www.freebsd.org/cgi/man.cgi?query=acl&apropos=0&sektion=0&manpath=FreeBSD+7.0-RELEASE&format=html
+Includes:
+ <sys/acl.h>
+Library:
+ none needed
+Functions:
+ acl_add_perm
+ acl_calc_mask
+ acl_clear_perms
+ acl_copy_entry
+ acl_copy_ext
+ acl_copy_int
+ acl_create_entry
+ acl_delete_entry
+ acl_delete_fd_np
+ acl_delete_file_np
+ acl_delete_link_np
+ acl_delete_def_file
+ acl_delete_def_link_np
+ acl_delete_perm
+ acl_dup
+ acl_free
+ acl_from_text
+ acl_get
+ acl_get_entry
+ acl_get_fd
+ acl_get_fd_np
+ acl_get_file
+ acl_get_link_np
+ acl_get_perm_np
+ acl_get_permset
+ acl_get_qualifier
+ acl_get_tag_type
+ acl_init
+ acl_set
+ acl_set_fd
+ acl_set_fd_np
+ acl_set_file
+ acl_set_link_np
+ acl_set_permset
+ acl_set_qualifier
+ acl_set_tag_type
+ acl_size
+ acl_to_text
+ acl_valid
+ acl_valid_fd_np
+ acl_valid_file_np
+ acl_valid_link_np
+Utilities:
+ getfacl
+ setfacl
+
+
+NetBSD ACLs
+
+Not available.
+
+
+OpenBSD ACLs
+
+Not available.
+
+
+MacOS X ACLs
+
+Manual pages:
+ http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/acl.3.html
+Includes:
+ <sys/acl.h>
+Library:
+ none needed
+Functions:
+ acl_add_flag_np
+ acl_add_perm
+ acl_calc_mask
+ acl_clear_flags_np
+ acl_clear_perms
+ acl_copy_entry
+ acl_copy_ext
+ acl_copy_ext_native
+ acl_copy_int
+ acl_copy_int_native
+ acl_create_entry
+ acl_create_entry_np
+ acl_delete_def_file
+ acl_delete_fd_np (undeclared?)
+ acl_delete_file_np (undeclared?)
+ acl_delete_flag_np
+ acl_delete_link_np (undeclared?)
+ acl_delete_entry
+ acl_delete_perm
+ acl_dup
+ acl_free
+ acl_from_text
+ acl_get_entry
+ acl_get_fd
+ acl_get_fd_np
+ acl_get_file
+ acl_get_flag_np
+ acl_get_flagset_np
+ acl_get_link_np
+ acl_get_perm_np
+ acl_get_permset
+ acl_get_qualifier
+ acl_get_tag_type
+ acl_init
+ acl_set_fd
+ acl_set_fd_np
+ acl_set_file
+ acl_set_flagset_np
+ acl_set_link_np
+ acl_set_permset
+ acl_set_qualifier
+ acl_set_tag_type
+ acl_size
+ acl_to_text
+ acl_valid
+ acl_valid_fd_np
+ acl_valid_file_np
+ acl_valid_link_np
+Utilities:
+ chmod
+
+
+HP-UX ACLs
+
+Manual pages:
+ http://docs.hp.com/en/B2355-60105/acl.2.html
+ http://docs.hp.com/en/B2355-60105/lsacl.1.html
+ http://docs.hp.com/en/B2355-60105/chacl.1.html
+ http://docs.hp.com/en/B2355-60105/getacl.1.html
+Includes:
+ <acl.h> or <sys/acl.h>, optionally <aclv.h>
+Library:
+ none needed
+Functions:
+ getacl
+ fgetacl
+ fsetacl
+ setacl
+Functions only declared in <aclv.h>:
+ acl
+Utilities:
+ lsacl
+ chacl
+ getacl
+ setacl
+ chmod
+
+
+IRIX ACLs
+
+Manual pages:
+ http://techpubs.sgi.com/library/tpl/cgi-bin/browse.cgi?cmd=search&db=man&srch=acl&coll=0650&range=0,133
+ http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=0650&db=man&fname=/usr/share/catman/p_man/cat4/acl.z
+Includes:
+ <sys/acl.h>
+Library:
+ none needed
+Functions:
+ acl_add_perm
+ acl_calc_mask
+ acl_clear_perms
+ acl_copy_entry
+ acl_copy_ext
+ acl_copy_int
+ acl_create_entry
+ acl_delete_def_file
+ acl_delete_entry
+ acl_delete_perm
+ acl_dup
+ acl_free
+ acl_from_text
+ acl_get_entry
+ acl_get_fd
+ acl_get_file
+ acl_get_permset
+ acl_get_qualifier
+ acl_get_tag_type
+ acl_init
+ acl_set_fd
+ acl_set_file
+ acl_set_permset
+ acl_set_qualifier
+ acl_set_tag_type
+ acl_size
+ acl_to_short_text
+ acl_to_text
+ acl_valid
+Utilities:
+ chacl
+
+
+Tru64 ACLs
+
+Manual pages:
+ http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V51_HTML/MAN/MAN4/0083____.HTM
+Includes:
+ <sys/acl.h>
+Library:
+ -lpacl
+Functions:
+ acl_add_perm
+ acl_clear_perm
+ acl_copy_entry
+ acl_copy_ext
+ acl_copy_int
+ acl_create_entry
+ acl_delete_def_fd
+ acl_delete_def_file
+ acl_delete_entry
+ acl_delete_perm
+ acl_dup
+ acl_first_entry
+ acl_free
+ acl_free_qualifier
+ acl_free_text
+ acl_from_text
+ acl_get_entry
+ acl_get_fd
+ acl_get_file
+ acl_get_permset
+ acl_get_qualifier
+ acl_get_tag_type
+ acl_init
+ acl_set_fd
+ acl_set_file
+ acl_set_permset
+ acl_set_qualifier
+ acl_set_tag_type
+ acl_size
+ acl_to_text
+ acl_valid
+Unportable functions:
+ acl_add_entry
+ acl_delete_access_fd
+ acl_delete_access_file
+ acl_delete_def_dir_fd
+ acl_delete_def_dir_file
+ acl_ext_to_text
+ acl_find_entry
+ acl_get
+ acl_mod_perm
+ acl_set
+ acl_to_fmt_text
+ allocate_acl_entry
+ convert_to_er
+ isaclprop
+Utilities:
+ getacl
+ setacl
+
+
+AIX ACLs
+
+Documentation:
+ http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.security/doc/security/access_control_list.htm
+Introduction:
+ http://www1.uni-hamburg.de/RRZ/Software/AIX/ACL.htm
+Includes:
+ <acl.h> or <sys/acl.h>
+ <sys/access.h>
+Library:
+ none needed
+Functions:
+ acl_chg
+ acl_fchg
+ acl_fget
+ acl_fput
+ acl_fset
+ acl_get
+ acl_put
+ acl_set
+ chacl
+ fchacl
+ fstatacl
+ statacl
+Function in AIX 5.3:
+ aclx_convert
+ aclx_fget
+ aclx_fput
+ aclx_get
+ aclx_gettypeinfo
+ aclx_gettypes
+ aclx_print
+ aclx_printStr
+ aclx_put
+ aclx_scan
+ aclx_scanStr
+Utilities:
+ aclget
+ aclput
+ acledit
+
+
+Cygwin ACLs
+
+Documentation:
+ http://www.cygwin.com/cygwin-ug-net/ntsec.html#ntsec-aclfuncs
+ acl-cygwin.txt
+Includes:
+ <sys/acl.h>
+Library:
+ none needed
+Functions:
+ acl
+ aclcheck
+ aclfrommode
+ aclfrompbits
+ aclfromtext
+ aclsort
+ acltomode
+ acltopbits
+ acltotext
+ facl
+ lacl
+Utilities:
+ getfacl
+ setfacl
+
+
+Win32 ACLs
+
+Introduction:
+ http://setacl.sourceforge.net/html/doc-basics.html
+Manual pages:
+ http://msdn.microsoft.com/en-us/library/aa374872(VS.85).aspx
+ http://msdn.microsoft.com/en-us/library/aa446659(VS.85).aspx
+ http://msdn.microsoft.com/en-us/library/aa374931(VS.85).aspx
+ http://en.wikipedia.org/wiki/Cacls
+Library:
+ ?
+Functions:
+ GetAclInformation
+ SetAclInformation
+ ...
+Utilities:
+ cacls
+
diff --git a/gnulib/doc/agpl-3.0.texi b/gnulib/doc/agpl-3.0.texi
new file mode 100644
index 00000000..e6ee662e
--- /dev/null
+++ b/gnulib/doc/agpl-3.0.texi
@@ -0,0 +1,698 @@
+@c The GNU Affero General Public License.
+@center Version 3, 19 November 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 Affero General Public License is a free, copyleft license
+for software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+The licenses for most software and other practical works are
+designed to take away your freedom to share and change the works. By
+contrast, our General Public Licenses are 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.
+
+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.
+
+Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+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 Affero 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 Remote Network Interaction; Use with the GNU General Public License.
+
+Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users interacting
+with it remotely through a computer network (if your version supports such
+interaction) an opportunity to receive the Corresponding Source of your
+version by providing access to the Corresponding Source from a network
+server at no charge, through some standard or customary means of
+facilitating copying of software. This Corresponding Source shall include
+the Corresponding Source for any work covered by version 3 of the GNU
+General Public License that is incorporated pursuant to the following
+paragraph.
+
+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 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 work with which it is combined
+will remain governed by version 3 of the GNU General Public License.
+
+@item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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
+Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero 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 your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a ``Source'' link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+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 AGPL, see
+@url{http://www.gnu.org/licenses/}.
diff --git a/gnulib/doc/alloca-opt.texi b/gnulib/doc/alloca-opt.texi
new file mode 100644
index 00000000..874c3442
--- /dev/null
+++ b/gnulib/doc/alloca-opt.texi
@@ -0,0 +1,41 @@
+@c Documentation of gnulib module 'alloca-opt'.
+
+@c Copyright (C) 2004, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The alloca-opt module provides for a function @code{alloca} which allocates
+memory on the stack, where the system allows it. A memory block allocated with
+@code{alloca} exists only until the function that calls @code{alloca} returns
+or exits abruptly.
+
+There are a few systems where this is not possible: HP-UX systems, and some
+other platforms when the C++ compiler is used. On these platforms the
+alloca-opt module provides no replacement, just a preprocessor macro
+HAVE_ALLOCA.
+
+The user can @code{#include <alloca.h>} on all platforms, and use
+@code{alloca} on those platforms where the preprocessor macro HAVE_ALLOCA
+evaluates to true. If HAVE_ALLOCA is false, the code should use a heap-based
+memory allocation based on @code{malloc} or - in C++ - @code{new}. Note that
+the @code{#include <alloca.h>} must be the first one after the
+autoconf-generated @file{config.h}, for AIX 3 compatibility. Thanks to IBM for
+this nice restriction!
+
+Note that GCC 3.1 and 3.2 can @emph{inline} functions that call @code{alloca}.
+When this happens, the memory blocks allocated with @code{alloca} will not be
+freed until @emph{the end of the calling function}. If this calling function
+runs a loop calling the function that uses @code{alloca}, the program easily
+gets a stack overflow and crashes. To protect against this compiler behaviour,
+you can mark the function that uses @code{alloca} with the following attribute:
+
+@smallexample
+#ifdef __GNUC__
+__attribute__ ((__noinline__))
+#endif
+@end smallexample
diff --git a/gnulib/doc/alloca.texi b/gnulib/doc/alloca.texi
new file mode 100644
index 00000000..c2a4bba7
--- /dev/null
+++ b/gnulib/doc/alloca.texi
@@ -0,0 +1,43 @@
+@c Documentation of gnulib module 'alloca'.
+
+@c Copyright (C) 2004, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The alloca module provides for a function @code{alloca} which allocates
+memory on the stack, where the system allows it. A memory block allocated with
+@code{alloca} exists only until the function that calls @code{alloca} returns
+or exits abruptly.
+
+There are a few systems where this is not possible: HP-UX systems, and some
+other platforms when the C++ compiler is used. On these platforms the alloca
+module provides a @code{malloc} based emulation. This emulation will not free a
+memory block immediately when the calling function returns, but rather will
+wait until the next @code{alloca} call from a function with the same or a
+shorter stack length. Thus, in some cases, a few memory blocks will be kept
+although they are not needed any more.
+
+The user can @code{#include <alloca.h>} and use @code{alloca} on all platforms.
+Note that the @code{#include <alloca.h>} must be the first one after the
+autoconf-generated @file{config.h}, for AIX 3 compatibility. Thanks to IBM for
+this nice restriction!
+
+Note that GCC 3.1 and 3.2 can @emph{inline} functions that call @code{alloca}.
+When this happens, the memory blocks allocated with @code{alloca} will not be
+freed until @emph{the end of the calling function}. If this calling function
+runs a loop calling the function that uses @code{alloca}, the program easily
+gets a stack overflow and crashes. To protect against this compiler behaviour,
+you can mark the function that uses @code{alloca} with the following attribute:
+
+@smallexample
+#ifdef __GNUC__
+__attribute__ ((__noinline__))
+#endif
+@end smallexample
+
+An alternative to this module is the @samp{alloca-opt} module.
diff --git a/gnulib/doc/c-ctype.texi b/gnulib/doc/c-ctype.texi
new file mode 100644
index 00000000..d3ee34e7
--- /dev/null
+++ b/gnulib/doc/c-ctype.texi
@@ -0,0 +1,47 @@
+@c Documentation of gnulib module 'c-ctype'.
+
+@c Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{c-ctype} module contains functions operating on single-byte
+characters, like the functions in @code{<ctype.h>}, that operate as if the
+locale encoding was ASCII. (The "C" locale on many systems has the locale
+encoding "ASCII".)
+
+The functions are:
+@smallexample
+extern bool c_isascii (int c);
+
+extern bool c_isalnum (int c);
+extern bool c_isalpha (int c);
+extern bool c_isblank (int c);
+extern bool c_iscntrl (int c);
+extern bool c_isdigit (int c);
+extern bool c_islower (int c);
+extern bool c_isgraph (int c);
+extern bool c_isprint (int c);
+extern bool c_ispunct (int c);
+extern bool c_isspace (int c);
+extern bool c_isupper (int c);
+extern bool c_isxdigit (int c);
+
+extern int c_tolower (int c);
+extern int c_toupper (int c);
+@end smallexample
+
+These functions assign properties only to ASCII characters.
+
+The @var{c} argument can be a @code{char} or @code{unsigned char} value,
+whereas the corresponding functions in @code{<ctype.h>} take an argument
+that is actually an @code{unsigned char} value.
+
+The @code{c_is*} functions return @samp{bool}, where the corresponding
+functions in @code{<ctype.h>} return @samp{int} for historical reasons.
+
+Note: The @code{<ctype.h>} functions support only unibyte locales.
diff --git a/gnulib/doc/c-strcase.texi b/gnulib/doc/c-strcase.texi
new file mode 100644
index 00000000..df1d9276
--- /dev/null
+++ b/gnulib/doc/c-strcase.texi
@@ -0,0 +1,29 @@
+@c Documentation of gnulib module 'c-strcase'.
+
+@c Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{c-strcase} module contains case-insensitive string comparison
+functions operating on single-byte character strings, like the functions in
+@code{<strings.h>}, that operate as if the locale encoding was ASCII.
+(The "C" locale on many systems has the locale encoding "ASCII".)
+
+The functions are:
+@smallexample
+extern int c_strcasecmp (const char *s1, const char *s2);
+extern int c_strncasecmp (const char *s1, const char *s2, size_t n);
+@end smallexample
+
+For case conversion here, only ASCII characters are considered to be
+upper case or lower case.
+
+Note: The functions @code{strcasecmp}, @code{strncasecmp} from
+@code{<strings.h>} support only unibyte locales; for multibyte locales,
+you need the functions @code{mbscasecmp}, @code{mbsncasecmp},
+@code{mbspcasecmp}.
diff --git a/gnulib/doc/c-strcaseeq.texi b/gnulib/doc/c-strcaseeq.texi
new file mode 100644
index 00000000..d6c47c2e
--- /dev/null
+++ b/gnulib/doc/c-strcaseeq.texi
@@ -0,0 +1,28 @@
+@c Documentation of gnulib module 'c-strcaseeq'.
+
+@c Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{c-strcaseeq} module contains an optimized case-insensitive
+string comparison function operating on single-byte character strings, that
+operate as if the locale encoding was ASCII.
+(The "C" locale on many systems has the locale encoding "ASCII".)
+
+The functions is actually implemented as a macro:
+@smallexample
+extern int STRCASEEQ (const char *s1, const char *s2,
+ int s20, int s21, int s22, int s23, int s24, int s25,
+ int s26, int s27, int s28);
+@end smallexample
+
+@var{s2} should be a short literal ASCII string, and @var{s20}, @var{s21}, ...
+the individual characters of @var{s2}.
+
+For case conversion here, only ASCII characters are considered to be
+upper case or lower case.
diff --git a/gnulib/doc/c-strcasestr.texi b/gnulib/doc/c-strcasestr.texi
new file mode 100644
index 00000000..4521eab0
--- /dev/null
+++ b/gnulib/doc/c-strcasestr.texi
@@ -0,0 +1,27 @@
+@c Documentation of gnulib module 'c-strcasestr'.
+
+@c Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{c-strcasestr} module contains a case-insensitive string search
+function operating on single-byte character strings, that operate as if the
+locale encoding was ASCII.
+(The "C" locale on many systems has the locale encoding "ASCII".)
+
+The function is:
+@smallexample
+extern char *c_strcasestr (const char *haystack, const char *needle);
+@end smallexample
+
+For case conversion here, only ASCII characters are considered to be
+upper case or lower case.
+
+Note: The function @code{strcasestr} from @code{<string.h>} supports only
+unibyte locales; for multibyte locales, you need the function
+@code{mbscasestr}.
diff --git a/gnulib/doc/c-strstr.texi b/gnulib/doc/c-strstr.texi
new file mode 100644
index 00000000..6ce5779b
--- /dev/null
+++ b/gnulib/doc/c-strstr.texi
@@ -0,0 +1,24 @@
+@c Documentation of gnulib module 'c-strstr'.
+
+@c Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{c-strstr} module contains a substring search function operating
+on single-byte character strings, that operate as if the locale encoding
+was ASCII.
+(The "C" locale on many systems has the locale encoding "ASCII".)
+
+The function is:
+@smallexample
+extern char *c_strstr (const char *haystack, const char *needle);
+@end smallexample
+
+Note: The function @code{strstr} from @code{<string.h>} supports only
+unibyte locales; for multibyte locales, you need the function
+@code{mbsstr}.
diff --git a/gnulib/doc/c-strtod.texi b/gnulib/doc/c-strtod.texi
new file mode 100644
index 00000000..d6f1ad83
--- /dev/null
+++ b/gnulib/doc/c-strtod.texi
@@ -0,0 +1,27 @@
+@c Documentation of gnulib module 'c-strtod'.
+
+@c Copyright (C) 2008-2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{c-strtod} module contains a string to number (@samp{double})
+conversion function operating on single-byte character strings, that operates
+as if the locale encoding was ASCII.
+(The "C" locale on many systems has the locale encoding "ASCII".)
+
+The function is:
+@smallexample
+extern double c_strtod (const char *string, char **endp);
+@end smallexample
+
+In particular, only a period @samp{.} is accepted as decimal point, even
+when the current locale's notion of decimal point is a comma @samp{,},
+and no characters outside the basic character set are accepted.
+
+On platforms without @code{strtod_l}, this function is not safe for use in
+multi-threaded applications since it calls @code{setlocale}.
diff --git a/gnulib/doc/c-strtold.texi b/gnulib/doc/c-strtold.texi
new file mode 100644
index 00000000..6decbc73
--- /dev/null
+++ b/gnulib/doc/c-strtold.texi
@@ -0,0 +1,23 @@
+@c Documentation of gnulib module 'c-strtold'.
+
+@c Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{c-strtold} module contains a string to number (@samp{long double})
+conversion function operating on single-byte character strings, that operates
+as if the locale encoding was ASCII.
+(The "C" locale on many systems has the locale encoding "ASCII".)
+
+The function is:
+@smallexample
+extern long double c_strtold (const char *string, char **endp);
+@end smallexample
+
+In particular, only a period @samp{.} is accepted as decimal point, even
+when the current locale's notion of decimal point is a comma @samp{,}.
diff --git a/gnulib/doc/ctime.texi b/gnulib/doc/ctime.texi
new file mode 100644
index 00000000..f8b417b8
--- /dev/null
+++ b/gnulib/doc/ctime.texi
@@ -0,0 +1,30 @@
+@node ctime
+@section ctime
+@findex ctime
+
+@c Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{ctime} function need not be reentrant, and consequently is
+not required to be thread safe. Implementations of @code{ctime}
+typically write the time stamp into static buffer. If two threads
+call @code{ctime} at roughly the same time, you might end up with the
+wrong date in one of the threads, or some undefined string. There is
+a re-entrant interface @code{ctime_r}, that take a pre-allocated
+buffer and length of the buffer, and return @code{NULL} on errors.
+The input buffer should be at least 26 bytes in size. The output
+string is locale-independent. However, years can have more than 4
+digits if @code{time_t} is sufficiently wide, so the length of the
+required output buffer is not easy to determine. Increasing the
+buffer size when @code{ctime_r} return @code{NULL} is not necessarily
+sufficient. The @code{NULL} return value could mean some other error
+condition, which will not go away by increasing the buffer size.
+
+A more flexible function is @code{strftime}. However, note that it is
+locale dependent.
diff --git a/gnulib/doc/error.texi b/gnulib/doc/error.texi
new file mode 100644
index 00000000..296f6d4a
--- /dev/null
+++ b/gnulib/doc/error.texi
@@ -0,0 +1,26 @@
+@node error and progname
+@section error and progname
+@findex error
+@findex progname
+@vindex program_name
+
+@c Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{error} function uses the @code{program_name} variable, but
+does not depend on the @code{progname} module. Why? Because
+@code{error} is released under the LGPL, whereas @code{progname} is
+GPL. RMS does not want additional baggage accompanying the
+@code{error} module, so an LGPL user must provide their own
+replacement @code{program_name}, and a GPL user should manually
+specify using the @code{progname} module.
+
+Additionally, using the @code{progname} module is not something that
+can be done implicitly. It requires that every @code{main} function
+be modified to set @code{program_name} as one of its first actions.
diff --git a/gnulib/doc/fdl-1.2.texi b/gnulib/doc/fdl-1.2.texi
new file mode 100644
index 00000000..96ce74ea
--- /dev/null
+++ b/gnulib/doc/fdl-1.2.texi
@@ -0,0 +1,451 @@
+@c The GNU Free Documentation License.
+@center Version 1.2, November 2002
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+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.
+
+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 for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@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.
+@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.2
+ 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/gnulib/doc/fdl-1.3.texi b/gnulib/doc/fdl-1.3.texi
new file mode 100644
index 00000000..8805f1a4
--- /dev/null
+++ b/gnulib/doc/fdl-1.3.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/gnulib/doc/fdl.texi b/gnulib/doc/fdl.texi
new file mode 100644
index 00000000..8805f1a4
--- /dev/null
+++ b/gnulib/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/gnulib/doc/func.texi b/gnulib/doc/func.texi
new file mode 100644
index 00000000..7225ca62
--- /dev/null
+++ b/gnulib/doc/func.texi
@@ -0,0 +1,20 @@
+@node func
+@section func
+
+The @code{func} module makes sure that you can use the predefined
+identifier @code{__func__} as defined by C99 in your code.
+
+A small example is:
+
+@smallexample
+#include <config.h>
+#include <stdio.h> /* for printf */
+
+int main (void)
+@{
+ printf ("%s: hello world\n", __func__);
+@}
+@end smallexample
+
+Note that @code{sizeof} cannot be applied to @code{__func__}: On SunPRO C
+compiler, @code{sizeof __func__} evaluates to 0.
diff --git a/gnulib/doc/gcd.texi b/gnulib/doc/gcd.texi
new file mode 100644
index 00000000..52bd5ecd
--- /dev/null
+++ b/gnulib/doc/gcd.texi
@@ -0,0 +1,54 @@
+@node gcd
+@section gcd: greatest common divisor
+@findex gcd
+
+@c Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{gcd} function returns the greatest common divisor of two numbers
+@code{a > 0} and @code{b > 0}. It is the caller's responsibility to ensure
+that the arguments are non-zero.
+
+If you need a gcd function for an integer type larger than
+@samp{unsigned long}, you can include the @file{gcd.c} implementation file
+with parametrization. The parameters are:
+
+@itemize @bullet
+@item WORD_T
+Define this to the unsigned integer type that you need this function for.
+
+@item GCD
+Define this to the name of the function to be created.
+@end itemize
+
+The created function has the prototype
+@smallexample
+WORD_T GCD (WORD_T a, WORD_T b);
+@end smallexample
+
+If you need the least common multiple of two numbers, it can be computed
+like this: @code{lcm(a,b) = (a / gcd(a,b)) * b} or
+@code{lcm(a,b) = a * (b / gcd(a,b))}.
+Avoid the formula @code{lcm(a,b) = (a * b) / gcd(a,b)} because - although
+mathematically correct - it can yield a wrong result, due to integer overflow.
+
+In some applications it is useful to have a function taking the gcd of two
+signed numbers. In this case, the gcd function result is usually normalized
+to be non-negative (so that two gcd results can be compared in magnitude
+or compared against 1, etc.). Note that in this case the prototype of the
+function has to be
+@smallexample
+unsigned long gcd (long a, long b);
+@end smallexample
+and not
+@smallexample
+long gcd (long a, long b);
+@end smallexample
+because @code{gcd(LONG_MIN,LONG_MIN) = -LONG_MIN = LONG_MAX + 1} does not
+fit into a signed @samp{long}.
diff --git a/gnulib/doc/gendocs_template b/gnulib/doc/gendocs_template
new file mode 100644
index 00000000..ee6a5c56
--- /dev/null
+++ b/gnulib/doc/gendocs_template
@@ -0,0 +1,96 @@
+<!--#include virtual="/server/header.html" -->
+<title>%%TITLE%% - GNU Project - Free Software Foundation (FSF)</title>
+<!--#include virtual="/server/banner.html" -->
+<h2>%%TITLE%%</h2>
+
+<!-- This document is in XML, and xhtml 1.0 -->
+<!-- Please make sure to properly nest your tags -->
+<!-- and ensure that your final document validates -->
+<!-- consistent with W3C xhtml 1.0 and CSS standards -->
+<!-- See validator.w3.org -->
+
+<address>Free Software Foundation</address>
+<address>last updated %%DATE%%</address>
+
+<p>This manual (%%PACKAGE%%) is available in the following formats:</p>
+
+<ul>
+<li><a href="%%PACKAGE%%.html">HTML
+ (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
+<li><a href="html_node/index.html">HTML</a> - with one web page per
+ node.</li>
+%%IF HTML_SECTION%%
+<li><a href="html_section/index.html">HTML</a> - with one web page per
+ section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
+<li><a href="html_chapter/index.html">HTML</a> - with one web page per
+ chapter.</li>
+%%ENDIF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.html.gz">HTML compressed
+ (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+ one web page.</li>
+<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
+ (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per node.</li>
+%%IF HTML_SECTION%%
+<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
+ (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
+ (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per chapter.</li>
+%%ENDIF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.info.tar.gz">Info document
+ (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
+<li><a href="%%PACKAGE%%.txt">ASCII text
+ (%%ASCII_SIZE%%K bytes)</a>.</li>
+<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
+ (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
+ (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.ps.gz">PostScript file
+ (%%PS_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.pdf">PDF file
+ (%%PDF_SIZE%%K bytes)</a>.</li>
+<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
+ (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
+</ul>
+
+<p>You can <a href="http://shop.fsf.org/">buy printed copies of
+some manuals</a> (among other items) from the Free Software Foundation;
+this helps support FSF activities.</p>
+
+<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
+script</a>.)</p>
+
+<!-- If needed, change the copyright block at the bottom. In general, -->
+<!-- all pages on the GNU web server should have the section about -->
+<!-- verbatim copying. Please do NOT remove this without talking -->
+<!-- with the webmasters first. -->
+<!-- Please make sure the copyright date is consistent with the document -->
+<!-- and that it is like this "2001, 2002" not this "2001-2002." -->
+</div><!-- for id="content", starts in the include above -->
+<!--#include virtual="/server/footer.html" -->
+<div id="footer">
+
+<p>
+Please send FSF &amp; GNU inquiries to
+<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.
+There are also <a href="/contact/">other ways to contact</a>
+the FSF.<br />
+Please send broken links and other corrections or suggestions to
+<a href="mailto:%%EMAIL%%">&lt;%%EMAIL%%&gt;</a>.
+</p>
+
+<p>Copyright &copy; 2009 Free Software Foundation, Inc.</p>
+
+<p>Verbatim copying and distribution of this entire article is
+permitted in any medium, provided this notice is preserved.</p>
+
+</div>
+</div>
+</body>
+</html>
diff --git a/gnulib/doc/gendocs_template_min b/gnulib/doc/gendocs_template_min
new file mode 100644
index 00000000..58b8944a
--- /dev/null
+++ b/gnulib/doc/gendocs_template_min
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+<title>%%TITLE%% - GNU Project - Free Software Foundation (FSF)</title>
+<meta http-equiv="content-type" content='text/html; charset=utf-8' />
+<link rel="stylesheet" type="text/css" href="/gnu.css" />
+<link rev="made" href="webmasters@gnu.org" />
+</head>
+
+<!-- This document is in XML, and xhtml 1.0 -->
+<!-- Please make sure to properly nest your tags -->
+<!-- and ensure that your final document validates -->
+<!-- consistent with W3C xhtml 1.0 and CSS standards -->
+<!-- See validator.w3.org -->
+
+<body>
+
+<h3>%%TITLE%%</h3>
+
+<address>Free Software Foundation</address>
+<address>last updated %%DATE%%</address>
+<p>
+<a href="/graphics/gnu-head.jpg">
+ <img src="/graphics/gnu-head-sm.jpg"
+ alt=" [image of the head of a GNU] " width="129" height="122"/>
+</a>
+</p>
+<hr />
+
+<p>This manual (%%PACKAGE%%) is available in the following formats:</p>
+
+<ul>
+<li><a href="%%PACKAGE%%.html">HTML
+ (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
+<li><a href="html_node/index.html">HTML</a> - with one web page per
+ node.</li>
+%%IF HTML_SECTION%%
+<li><a href="html_section/index.html">HTML</a> - with one web page per
+ section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
+<li><a href="html_chapter/index.html">HTML</a> - with one web page per
+ chapter.</li>
+%%ENDIF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.html.gz">HTML compressed
+ (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+ one web page.</li>
+<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
+ (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per node.</li>
+%%IF HTML_SECTION%%
+<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
+ (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
+ (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per chapter.</li>
+%%ENDIF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.info.tar.gz">Info document
+ (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
+<li><a href="%%PACKAGE%%.txt">ASCII text
+ (%%ASCII_SIZE%%K bytes)</a>.</li>
+<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
+ (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
+ (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.ps.gz">PostScript file
+ (%%PS_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.pdf">PDF file
+ (%%PDF_SIZE%%K bytes)</a>.</li>
+<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
+ (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
+</ul>
+
+<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
+script</a>.)</p>
+
+<div class="copyright">
+<p>
+Please send FSF &amp; GNU inquiries to
+<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.
+There are also <a href="/contact/">other ways to contact</a>
+the FSF.<br />
+Please send broken links and other corrections (or suggestions) to
+<a href="mailto:%%EMAIL%%">&lt;%%EMAIL%%&gt;</a>.
+</p>
+
+<p>Copyright &copy; 2009 Free Software Foundation, Inc.</p>
+
+<p>Verbatim copying and distribution of this entire article is
+permitted in any medium, provided this notice is preserved.</p>
+
+</div>
+
+</body>
+</html>
diff --git a/gnulib/doc/getdate.texi b/gnulib/doc/getdate.texi
new file mode 100644
index 00000000..48e8b683
--- /dev/null
+++ b/gnulib/doc/getdate.texi
@@ -0,0 +1,556 @@
+@c GNU date syntax documentation
+
+@c Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+@c 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+@node Date input formats
+@chapter Date input formats
+
+@cindex date input formats
+@findex get_date
+
+First, a quote:
+
+@quotation
+Our units of temporal measurement, from seconds on up to months, are so
+complicated, asymmetrical and disjunctive so as to make coherent mental
+reckoning in time all but impossible. Indeed, had some tyrannical god
+contrived to enslave our minds to time, to make it all but impossible
+for us to escape subjection to sodden routines and unpleasant surprises,
+he could hardly have done better than handing down our present system.
+It is like a set of trapezoidal building blocks, with no vertical or
+horizontal surfaces, like a language in which the simplest thought
+demands ornate constructions, useless particles and lengthy
+circumlocutions. Unlike the more successful patterns of language and
+science, which enable us to face experience boldly or at least
+level-headedly, our system of temporal calculation silently and
+persistently encourages our terror of time.
+
+@dots{} It is as though architects had to measure length in feet, width
+in meters and height in ells; as though basic instruction manuals
+demanded a knowledge of five different languages. It is no wonder then
+that we often look into our own immediate past or future, last Tuesday
+or a week from Sunday, with feelings of helpless confusion. @dots{}
+
+--- Robert Grudin, @cite{Time and the Art of Living}.
+@end quotation
+
+This section describes the textual date representations that @sc{gnu}
+programs accept. These are the strings you, as a user, can supply as
+arguments to the various programs. The C interface (via the
+@code{get_date} function) is not described here.
+
+@menu
+* General date syntax:: Common rules.
+* Calendar date items:: 19 Dec 1994.
+* Time of day items:: 9:20pm.
+* Time zone items:: @sc{est}, @sc{pdt}, @sc{gmt}.
+* Day of week items:: Monday and others.
+* Relative items in date strings:: next tuesday, 2 years ago.
+* Pure numbers in date strings:: 19931219, 1440.
+* Seconds since the Epoch:: @@1078100502.
+* Specifying time zone rules:: TZ="America/New_York", TZ="UTC0".
+* Authors of get_date:: Bellovin, Eggert, Salz, Berets, et al.
+@end menu
+
+
+@node General date syntax
+@section General date syntax
+
+@cindex general date syntax
+
+@cindex items in date strings
+A @dfn{date} is a string, possibly empty, containing many items
+separated by whitespace. The whitespace may be omitted when no
+ambiguity arises. The empty string means the beginning of today (i.e.,
+midnight). Order of the items is immaterial. A date string may contain
+many flavors of items:
+
+@itemize @bullet
+@item calendar date items
+@item time of day items
+@item time zone items
+@item day of the week items
+@item relative items
+@item pure numbers.
+@end itemize
+
+@noindent We describe each of these item types in turn, below.
+
+@cindex numbers, written-out
+@cindex ordinal numbers
+@findex first @r{in date strings}
+@findex next @r{in date strings}
+@findex last @r{in date strings}
+A few ordinal numbers may be written out in words in some contexts. This is
+most useful for specifying day of the week items or relative items (see
+below). Among the most commonly used ordinal numbers, the word
+@samp{last} stands for @math{-1}, @samp{this} stands for 0, and
+@samp{first} and @samp{next} both stand for 1. Because the word
+@samp{second} stands for the unit of time there is no way to write the
+ordinal number 2, but for convenience @samp{third} stands for 3,
+@samp{fourth} for 4, @samp{fifth} for 5,
+@samp{sixth} for 6, @samp{seventh} for 7, @samp{eighth} for 8,
+@samp{ninth} for 9, @samp{tenth} for 10, @samp{eleventh} for 11 and
+@samp{twelfth} for 12.
+
+@cindex months, written-out
+When a month is written this way, it is still considered to be written
+numerically, instead of being ``spelled in full''; this changes the
+allowed strings.
+
+@cindex language, in dates
+In the current implementation, only English is supported for words and
+abbreviations like @samp{AM}, @samp{DST}, @samp{EST}, @samp{first},
+@samp{January}, @samp{Sunday}, @samp{tomorrow}, and @samp{year}.
+
+@cindex language, in dates
+@cindex time zone item
+The output of the @command{date} command
+is not always acceptable as a date string,
+not only because of the language problem, but also because there is no
+standard meaning for time zone items like @samp{IST}. When using
+@command{date} to generate a date string intended to be parsed later,
+specify a date format that is independent of language and that does not
+use time zone items other than @samp{UTC} and @samp{Z}. Here are some
+ways to do this:
+
+@example
+$ LC_ALL=C TZ=UTC0 date
+Mon Mar 1 00:21:42 UTC 2004
+$ TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ'
+2004-03-01 00:21:42Z
+$ date --iso-8601=ns | tr T ' ' # --iso-8601 is a GNU extension.
+2004-02-29 16:21:42,692722128-0800
+$ date --rfc-2822 # a GNU extension
+Sun, 29 Feb 2004 16:21:42 -0800
+$ date +'%Y-%m-%d %H:%M:%S %z' # %z is a GNU extension.
+2004-02-29 16:21:42 -0800
+$ date +'@@%s.%N' # %s and %N are GNU extensions.
+@@1078100502.692722128
+@end example
+
+@cindex case, ignored in dates
+@cindex comments, in dates
+Alphabetic case is completely ignored in dates. Comments may be introduced
+between round parentheses, as long as included parentheses are properly
+nested. Hyphens not followed by a digit are currently ignored. Leading
+zeros on numbers are ignored.
+
+Invalid dates like @samp{2005-02-29} or times like @samp{24:00} are
+rejected. In the typical case of a host that does not support leap
+seconds, a time like @samp{23:59:60} is rejected even if it
+corresponds to a valid leap second.
+
+
+@node Calendar date items
+@section Calendar date items
+
+@cindex calendar date item
+
+A @dfn{calendar date item} specifies a day of the year. It is
+specified differently, depending on whether the month is specified
+numerically or literally. All these strings specify the same calendar date:
+
+@example
+1972-09-24 # @sc{iso} 8601.
+72-9-24 # Assume 19xx for 69 through 99,
+ # 20xx for 00 through 68.
+72-09-24 # Leading zeros are ignored.
+9/24/72 # Common U.S. writing.
+24 September 1972
+24 Sept 72 # September has a special abbreviation.
+24 Sep 72 # Three-letter abbreviations always allowed.
+Sep 24, 1972
+24-sep-72
+24sep72
+@end example
+
+The year can also be omitted. In this case, the last specified year is
+used, or the current year if none. For example:
+
+@example
+9/24
+sep 24
+@end example
+
+Here are the rules.
+
+@cindex @sc{iso} 8601 date format
+@cindex date format, @sc{iso} 8601
+For numeric months, the @sc{iso} 8601 format
+@samp{@var{year}-@var{month}-@var{day}} is allowed, where @var{year} is
+any positive number, @var{month} is a number between 01 and 12, and
+@var{day} is a number between 01 and 31. A leading zero must be present
+if a number is less than ten. If @var{year} is 68 or smaller, then 2000
+is added to it; otherwise, if @var{year} is less than 100,
+then 1900 is added to it. The construct
+@samp{@var{month}/@var{day}/@var{year}}, popular in the United States,
+is accepted. Also @samp{@var{month}/@var{day}}, omitting the year.
+
+@cindex month names in date strings
+@cindex abbreviations for months
+Literal months may be spelled out in full: @samp{January},
+@samp{February}, @samp{March}, @samp{April}, @samp{May}, @samp{June},
+@samp{July}, @samp{August}, @samp{September}, @samp{October},
+@samp{November} or @samp{December}. Literal months may be abbreviated
+to their first three letters, possibly followed by an abbreviating dot.
+It is also permitted to write @samp{Sept} instead of @samp{September}.
+
+When months are written literally, the calendar date may be given as any
+of the following:
+
+@example
+@var{day} @var{month} @var{year}
+@var{day} @var{month}
+@var{month} @var{day} @var{year}
+@var{day}-@var{month}-@var{year}
+@end example
+
+Or, omitting the year:
+
+@example
+@var{month} @var{day}
+@end example
+
+
+@node Time of day items
+@section Time of day items
+
+@cindex time of day item
+
+A @dfn{time of day item} in date strings specifies the time on a given
+day. Here are some examples, all of which represent the same time:
+
+@example
+20:02:00.000000
+20:02
+8:02pm
+20:02-0500 # In @sc{est} (U.S. Eastern Standard Time).
+@end example
+
+More generally, the time of day may be given as
+@samp{@var{hour}:@var{minute}:@var{second}}, where @var{hour} is
+a number between 0 and 23, @var{minute} is a number between 0 and
+59, and @var{second} is a number between 0 and 59 possibly followed by
+@samp{.} or @samp{,} and a fraction containing one or more digits.
+Alternatively,
+@samp{:@var{second}} can be omitted, in which case it is taken to
+be zero. On the rare hosts that support leap seconds, @var{second}
+may be 60.
+
+@findex am @r{in date strings}
+@findex pm @r{in date strings}
+@findex midnight @r{in date strings}
+@findex noon @r{in date strings}
+If the time is followed by @samp{am} or @samp{pm} (or @samp{a.m.}
+or @samp{p.m.}), @var{hour} is restricted to run from 1 to 12, and
+@samp{:@var{minute}} may be omitted (taken to be zero). @samp{am}
+indicates the first half of the day, @samp{pm} indicates the second
+half of the day. In this notation, 12 is the predecessor of 1:
+midnight is @samp{12am} while noon is @samp{12pm}.
+(This is the zero-oriented interpretation of @samp{12am} and @samp{12pm},
+as opposed to the old tradition derived from Latin
+which uses @samp{12m} for noon and @samp{12pm} for midnight.)
+
+@cindex time zone correction
+@cindex minutes, time zone correction by
+The time may alternatively be followed by a time zone correction,
+expressed as @samp{@var{s}@var{hh}@var{mm}}, where @var{s} is @samp{+}
+or @samp{-}, @var{hh} is a number of zone hours and @var{mm} is a number
+of zone minutes.
+The zone minutes term, @var{mm}, may be omitted, in which case
+the one- or two-digit correction is interpreted as a number of hours.
+You can also separate @var{hh} from @var{mm} with a colon.
+When a time zone correction is given this way, it
+forces interpretation of the time relative to
+Coordinated Universal Time (@sc{utc}), overriding any previous
+specification for the time zone or the local time zone. For example,
+@samp{+0530} and @samp{+05:30} both stand for the time zone 5.5 hours
+ahead of @sc{utc} (e.g., India).
+This is the best way to
+specify a time zone correction by fractional parts of an hour.
+The maximum zone correction is 24 hours.
+
+Either @samp{am}/@samp{pm} or a time zone correction may be specified,
+but not both.
+
+
+@node Time zone items
+@section Time zone items
+
+@cindex time zone item
+
+A @dfn{time zone item} specifies an international time zone, indicated
+by a small set of letters, e.g., @samp{UTC} or @samp{Z}
+for Coordinated Universal
+Time. Any included periods are ignored. By following a
+non-daylight-saving time zone by the string @samp{DST} in a separate
+word (that is, separated by some white space), the corresponding
+daylight saving time zone may be specified.
+Alternatively, a non-daylight-saving time zone can be followed by a
+time zone correction, to add the two values. This is normally done
+only for @samp{UTC}; for example, @samp{UTC+05:30} is equivalent to
+@samp{+05:30}.
+
+Time zone items other than @samp{UTC} and @samp{Z}
+are obsolescent and are not recommended, because they
+are ambiguous; for example, @samp{EST} has a different meaning in
+Australia than in the United States. Instead, it's better to use
+unambiguous numeric time zone corrections like @samp{-0500}, as
+described in the previous section.
+
+If neither a time zone item nor a time zone correction is supplied,
+time stamps are interpreted using the rules of the default time zone
+(@pxref{Specifying time zone rules}).
+
+
+@node Day of week items
+@section Day of week items
+
+@cindex day of week item
+
+The explicit mention of a day of the week will forward the date
+(only if necessary) to reach that day of the week in the future.
+
+Days of the week may be spelled out in full: @samp{Sunday},
+@samp{Monday}, @samp{Tuesday}, @samp{Wednesday}, @samp{Thursday},
+@samp{Friday} or @samp{Saturday}. Days may be abbreviated to their
+first three letters, optionally followed by a period. The special
+abbreviations @samp{Tues} for @samp{Tuesday}, @samp{Wednes} for
+@samp{Wednesday} and @samp{Thur} or @samp{Thurs} for @samp{Thursday} are
+also allowed.
+
+@findex next @var{day}
+@findex last @var{day}
+A number may precede a day of the week item to move forward
+supplementary weeks. It is best used in expression like @samp{third
+monday}. In this context, @samp{last @var{day}} or @samp{next
+@var{day}} is also acceptable; they move one week before or after
+the day that @var{day} by itself would represent.
+
+A comma following a day of the week item is ignored.
+
+
+@node Relative items in date strings
+@section Relative items in date strings
+
+@cindex relative items in date strings
+@cindex displacement of dates
+
+@dfn{Relative items} adjust a date (or the current date if none) forward
+or backward. The effects of relative items accumulate. Here are some
+examples:
+
+@example
+1 year
+1 year ago
+3 years
+2 days
+@end example
+
+@findex year @r{in date strings}
+@findex month @r{in date strings}
+@findex fortnight @r{in date strings}
+@findex week @r{in date strings}
+@findex day @r{in date strings}
+@findex hour @r{in date strings}
+@findex minute @r{in date strings}
+The unit of time displacement may be selected by the string @samp{year}
+or @samp{month} for moving by whole years or months. These are fuzzy
+units, as years and months are not all of equal duration. More precise
+units are @samp{fortnight} which is worth 14 days, @samp{week} worth 7
+days, @samp{day} worth 24 hours, @samp{hour} worth 60 minutes,
+@samp{minute} or @samp{min} worth 60 seconds, and @samp{second} or
+@samp{sec} worth one second. An @samp{s} suffix on these units is
+accepted and ignored.
+
+@findex ago @r{in date strings}
+The unit of time may be preceded by a multiplier, given as an optionally
+signed number. Unsigned numbers are taken as positively signed. No
+number at all implies 1 for a multiplier. Following a relative item by
+the string @samp{ago} is equivalent to preceding the unit by a
+multiplier with value @math{-1}.
+
+@findex day @r{in date strings}
+@findex tomorrow @r{in date strings}
+@findex yesterday @r{in date strings}
+The string @samp{tomorrow} is worth one day in the future (equivalent
+to @samp{day}), the string @samp{yesterday} is worth
+one day in the past (equivalent to @samp{day ago}).
+
+@findex now @r{in date strings}
+@findex today @r{in date strings}
+@findex this @r{in date strings}
+The strings @samp{now} or @samp{today} are relative items corresponding
+to zero-valued time displacement, these strings come from the fact
+a zero-valued time displacement represents the current time when not
+otherwise changed by previous items. They may be used to stress other
+items, like in @samp{12:00 today}. The string @samp{this} also has
+the meaning of a zero-valued time displacement, but is preferred in
+date strings like @samp{this thursday}.
+
+When a relative item causes the resulting date to cross a boundary
+where the clocks were adjusted, typically for daylight saving time,
+the resulting date and time are adjusted accordingly.
+
+The fuzz in units can cause problems with relative items. For
+example, @samp{2003-07-31 -1 month} might evaluate to 2003-07-01,
+because 2003-06-31 is an invalid date. To determine the previous
+month more reliably, you can ask for the month before the 15th of the
+current month. For example:
+
+@example
+$ date -R
+Thu, 31 Jul 2003 13:02:39 -0700
+$ date --date='-1 month' +'Last month was %B?'
+Last month was July?
+$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
+Last month was June!
+@end example
+
+Also, take care when manipulating dates around clock changes such as
+daylight saving leaps. In a few cases these have added or subtracted
+as much as 24 hours from the clock, so it is often wise to adopt
+universal time by setting the @env{TZ} environment variable to
+@samp{UTC0} before embarking on calendrical calculations.
+
+@node Pure numbers in date strings
+@section Pure numbers in date strings
+
+@cindex pure numbers in date strings
+
+The precise interpretation of a pure decimal number depends
+on the context in the date string.
+
+If the decimal number is of the form @var{yyyy}@var{mm}@var{dd} and no
+other calendar date item (@pxref{Calendar date items}) appears before it
+in the date string, then @var{yyyy} is read as the year, @var{mm} as the
+month number and @var{dd} as the day of the month, for the specified
+calendar date.
+
+If the decimal number is of the form @var{hh}@var{mm} and no other time
+of day item appears before it in the date string, then @var{hh} is read
+as the hour of the day and @var{mm} as the minute of the hour, for the
+specified time of day. @var{mm} can also be omitted.
+
+If both a calendar date and a time of day appear to the left of a number
+in the date string, but no relative item, then the number overrides the
+year.
+
+
+@node Seconds since the Epoch
+@section Seconds since the Epoch
+
+If you precede a number with @samp{@@}, it represents an internal time
+stamp as a count of seconds. The number can contain an internal
+decimal point (either @samp{.} or @samp{,}); any excess precision not
+supported by the internal representation is truncated toward minus
+infinity. Such a number cannot be combined with any other date
+item, as it specifies a complete time stamp.
+
+@cindex beginning of time, for @acronym{POSIX}
+@cindex epoch, for @acronym{POSIX}
+Internally, computer times are represented as a count of seconds since
+an epoch---a well-defined point of time. On @acronym{GNU} and
+@acronym{POSIX} systems, the epoch is 1970-01-01 00:00:00 @sc{utc}, so
+@samp{@@0} represents this time, @samp{@@1} represents 1970-01-01
+00:00:01 @sc{utc}, and so forth. @acronym{GNU} and most other
+@acronym{POSIX}-compliant systems support such times as an extension
+to @acronym{POSIX}, using negative counts, so that @samp{@@-1}
+represents 1969-12-31 23:59:59 @sc{utc}.
+
+Traditional Unix systems count seconds with 32-bit two's-complement
+integers and can represent times from 1901-12-13 20:45:52 through
+2038-01-19 03:14:07 @sc{utc}. More modern systems use 64-bit counts
+of seconds with nanosecond subcounts, and can represent all the times
+in the known lifetime of the universe to a resolution of 1 nanosecond.
+
+On most hosts, these counts ignore the presence of leap seconds.
+For example, on most hosts @samp{@@915148799} represents 1998-12-31
+23:59:59 @sc{utc}, @samp{@@915148800} represents 1999-01-01 00:00:00
+@sc{utc}, and there is no way to represent the intervening leap second
+1998-12-31 23:59:60 @sc{utc}.
+
+@node Specifying time zone rules
+@section Specifying time zone rules
+
+@vindex TZ
+Normally, dates are interpreted using the rules of the current time
+zone, which in turn are specified by the @env{TZ} environment
+variable, or by a system default if @env{TZ} is not set. To specify a
+different set of default time zone rules that apply just to one date,
+start the date with a string of the form @samp{TZ="@var{rule}"}. The
+two quote characters (@samp{"}) must be present in the date, and any
+quotes or backslashes within @var{rule} must be escaped by a
+backslash.
+
+For example, with the @acronym{GNU} @command{date} command you can
+answer the question ``What time is it in New York when a Paris clock
+shows 6:30am on October 31, 2004?'' by using a date beginning with
+@samp{TZ="Europe/Paris"} as shown in the following shell transcript:
+
+@example
+$ export TZ="America/New_York"
+$ date --date='TZ="Europe/Paris" 2004-10-31 06:30'
+Sun Oct 31 01:30:00 EDT 2004
+@end example
+
+In this example, the @option{--date} operand begins with its own
+@env{TZ} setting, so the rest of that operand is processed according
+to @samp{Europe/Paris} rules, treating the string @samp{2004-10-31
+06:30} as if it were in Paris. However, since the output of the
+@command{date} command is processed according to the overall time zone
+rules, it uses New York time. (Paris was normally six hours ahead of
+New York in 2004, but this example refers to a brief Halloween period
+when the gap was five hours.)
+
+A @env{TZ} value is a rule that typically names a location in the
+@uref{http://www.twinsun.com/tz/tz-link.htm, @samp{tz} database}.
+A recent catalog of location names appears in the
+@uref{http://twiki.org/cgi-bin/xtra/tzdate, TWiki Date and Time
+Gateway}. A few non-@acronym{GNU} hosts require a colon before a
+location name in a @env{TZ} setting, e.g.,
+@samp{TZ=":America/New_York"}.
+
+The @samp{tz} database includes a wide variety of locations ranging
+from @samp{Arctic/Longyearbyen} to @samp{Antarctica/South_Pole}, but
+if you are at sea and have your own private time zone, or if you are
+using a non-@acronym{GNU} host that does not support the @samp{tz}
+database, you may need to use a @acronym{POSIX} rule instead. Simple
+@acronym{POSIX} rules like @samp{UTC0} specify a time zone without
+daylight saving time; other rules can specify simple daylight saving
+regimes. @xref{TZ Variable,, Specifying the Time Zone with @code{TZ},
+libc, The GNU C Library}.
+
+@node Authors of get_date
+@section Authors of @code{get_date}
+
+@cindex authors of @code{get_date}
+
+@cindex Bellovin, Steven M.
+@cindex Salz, Rich
+@cindex Berets, Jim
+@cindex MacKenzie, David
+@cindex Meyering, Jim
+@cindex Eggert, Paul
+@code{get_date} was originally implemented by Steven M. Bellovin
+(@email{smb@@research.att.com}) while at the University of North Carolina
+at Chapel Hill. The code was later tweaked by a couple of people on
+Usenet, then completely overhauled by Rich $alz (@email{rsalz@@bbn.com})
+and Jim Berets (@email{jberets@@bbn.com}) in August, 1990. Various
+revisions for the @sc{gnu} system were made by David MacKenzie, Jim Meyering,
+Paul Eggert and others.
+
+@cindex Pinard, F.
+@cindex Berry, K.
+This chapter was originally produced by Fran@,{c}ois Pinard
+(@email{pinard@@iro.umontreal.ca}) from the @file{getdate.y} source code,
+and then edited by K.@: Berry (@email{kb@@cs.umb.edu}).
diff --git a/gnulib/doc/glibc-functions/accept4.texi b/gnulib/doc/glibc-functions/accept4.texi
new file mode 100644
index 00000000..f88ab0ad
--- /dev/null
+++ b/gnulib/doc/glibc-functions/accept4.texi
@@ -0,0 +1,16 @@
+@node accept4
+@subsection @code{accept4}
+@findex accept4
+
+Gnulib module: accept4
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/acct.texi b/gnulib/doc/glibc-functions/acct.texi
new file mode 100644
index 00000000..64cc8cc6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/acct.texi
@@ -0,0 +1,16 @@
+@node acct
+@subsection @code{acct}
+@findex acct
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/addmntent.texi b/gnulib/doc/glibc-functions/addmntent.texi
new file mode 100644
index 00000000..94c046af
--- /dev/null
+++ b/gnulib/doc/glibc-functions/addmntent.texi
@@ -0,0 +1,16 @@
+@node addmntent
+@subsection @code{addmntent}
+@findex addmntent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/addseverity.texi b/gnulib/doc/glibc-functions/addseverity.texi
new file mode 100644
index 00000000..38106052
--- /dev/null
+++ b/gnulib/doc/glibc-functions/addseverity.texi
@@ -0,0 +1,16 @@
+@node addseverity
+@subsection @code{addseverity}
+@findex addseverity
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/adjtime.texi b/gnulib/doc/glibc-functions/adjtime.texi
new file mode 100644
index 00000000..e7bccd1e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/adjtime.texi
@@ -0,0 +1,16 @@
+@node adjtime
+@subsection @code{adjtime}
+@findex adjtime
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/adjtimex.texi b/gnulib/doc/glibc-functions/adjtimex.texi
new file mode 100644
index 00000000..233f75e6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/adjtimex.texi
@@ -0,0 +1,16 @@
+@node adjtimex
+@subsection @code{adjtimex}
+@findex adjtimex
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/advance.texi b/gnulib/doc/glibc-functions/advance.texi
new file mode 100644
index 00000000..a476e486
--- /dev/null
+++ b/gnulib/doc/glibc-functions/advance.texi
@@ -0,0 +1,16 @@
+@node advance
+@subsection @code{advance}
+@findex advance
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/aio_init.texi b/gnulib/doc/glibc-functions/aio_init.texi
new file mode 100644
index 00000000..a6814ff7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/aio_init.texi
@@ -0,0 +1,16 @@
+@node aio_init
+@subsection @code{aio_init}
+@findex aio_init
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_err_exit_status.texi b/gnulib/doc/glibc-functions/argp_err_exit_status.texi
new file mode 100644
index 00000000..4d05b524
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_err_exit_status.texi
@@ -0,0 +1,16 @@
+@node argp_err_exit_status
+@subsection @code{argp_err_exit_status}
+@findex argp_err_exit_status
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_error.texi b/gnulib/doc/glibc-functions/argp_error.texi
new file mode 100644
index 00000000..26f65652
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_error.texi
@@ -0,0 +1,16 @@
+@node argp_error
+@subsection @code{argp_error}
+@findex argp_error
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_failure.texi b/gnulib/doc/glibc-functions/argp_failure.texi
new file mode 100644
index 00000000..937ffb8e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_failure.texi
@@ -0,0 +1,16 @@
+@node argp_failure
+@subsection @code{argp_failure}
+@findex argp_failure
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_help.texi b/gnulib/doc/glibc-functions/argp_help.texi
new file mode 100644
index 00000000..3f249285
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_help.texi
@@ -0,0 +1,16 @@
+@node argp_help
+@subsection @code{argp_help}
+@findex argp_help
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_parse.texi b/gnulib/doc/glibc-functions/argp_parse.texi
new file mode 100644
index 00000000..98aa72a0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_parse.texi
@@ -0,0 +1,16 @@
+@node argp_parse
+@subsection @code{argp_parse}
+@findex argp_parse
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_program_bug_address.texi b/gnulib/doc/glibc-functions/argp_program_bug_address.texi
new file mode 100644
index 00000000..088c423d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_program_bug_address.texi
@@ -0,0 +1,16 @@
+@node argp_program_bug_address
+@subsection @code{argp_program_bug_address}
+@findex argp_program_bug_address
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_program_version.texi b/gnulib/doc/glibc-functions/argp_program_version.texi
new file mode 100644
index 00000000..62c8a5d9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_program_version.texi
@@ -0,0 +1,16 @@
+@node argp_program_version
+@subsection @code{argp_program_version}
+@findex argp_program_version
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_program_version_hook.texi b/gnulib/doc/glibc-functions/argp_program_version_hook.texi
new file mode 100644
index 00000000..98e3a8ce
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_program_version_hook.texi
@@ -0,0 +1,16 @@
+@node argp_program_version_hook
+@subsection @code{argp_program_version_hook}
+@findex argp_program_version_hook
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_state_help.texi b/gnulib/doc/glibc-functions/argp_state_help.texi
new file mode 100644
index 00000000..2e399839
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_state_help.texi
@@ -0,0 +1,16 @@
+@node argp_state_help
+@subsection @code{argp_state_help}
+@findex argp_state_help
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argp_usage.texi b/gnulib/doc/glibc-functions/argp_usage.texi
new file mode 100644
index 00000000..6715de6a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argp_usage.texi
@@ -0,0 +1,16 @@
+@node argp_usage
+@subsection @code{argp_usage}
+@findex argp_usage
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_add.texi b/gnulib/doc/glibc-functions/argz_add.texi
new file mode 100644
index 00000000..3e59dc11
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_add.texi
@@ -0,0 +1,21 @@
+@node argz_add
+@subsection @code{argz_add}
+@findex argz_add
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_add_sep.texi b/gnulib/doc/glibc-functions/argz_add_sep.texi
new file mode 100644
index 00000000..6875f174
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_add_sep.texi
@@ -0,0 +1,21 @@
+@node argz_add_sep
+@subsection @code{argz_add_sep}
+@findex argz_add_sep
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_append.texi b/gnulib/doc/glibc-functions/argz_append.texi
new file mode 100644
index 00000000..ededbd55
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_append.texi
@@ -0,0 +1,21 @@
+@node argz_append
+@subsection @code{argz_append}
+@findex argz_append
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_count.texi b/gnulib/doc/glibc-functions/argz_count.texi
new file mode 100644
index 00000000..95a8030a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_count.texi
@@ -0,0 +1,21 @@
+@node argz_count
+@subsection @code{argz_count}
+@findex argz_count
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_create.texi b/gnulib/doc/glibc-functions/argz_create.texi
new file mode 100644
index 00000000..4fc1c6be
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_create.texi
@@ -0,0 +1,21 @@
+@node argz_create
+@subsection @code{argz_create}
+@findex argz_create
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_create_sep.texi b/gnulib/doc/glibc-functions/argz_create_sep.texi
new file mode 100644
index 00000000..2bbf496d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_create_sep.texi
@@ -0,0 +1,21 @@
+@node argz_create_sep
+@subsection @code{argz_create_sep}
+@findex argz_create_sep
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_delete.texi b/gnulib/doc/glibc-functions/argz_delete.texi
new file mode 100644
index 00000000..ffd48d69
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_delete.texi
@@ -0,0 +1,21 @@
+@node argz_delete
+@subsection @code{argz_delete}
+@findex argz_delete
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_extract.texi b/gnulib/doc/glibc-functions/argz_extract.texi
new file mode 100644
index 00000000..b71615d0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_extract.texi
@@ -0,0 +1,21 @@
+@node argz_extract
+@subsection @code{argz_extract}
+@findex argz_extract
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_insert.texi b/gnulib/doc/glibc-functions/argz_insert.texi
new file mode 100644
index 00000000..1c76e9cd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_insert.texi
@@ -0,0 +1,21 @@
+@node argz_insert
+@subsection @code{argz_insert}
+@findex argz_insert
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_next.texi b/gnulib/doc/glibc-functions/argz_next.texi
new file mode 100644
index 00000000..f5f6fe01
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_next.texi
@@ -0,0 +1,21 @@
+@node argz_next
+@subsection @code{argz_next}
+@findex argz_next
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_replace.texi b/gnulib/doc/glibc-functions/argz_replace.texi
new file mode 100644
index 00000000..95074d47
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_replace.texi
@@ -0,0 +1,21 @@
+@node argz_replace
+@subsection @code{argz_replace}
+@findex argz_replace
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/argz_stringify.texi b/gnulib/doc/glibc-functions/argz_stringify.texi
new file mode 100644
index 00000000..bec13132
--- /dev/null
+++ b/gnulib/doc/glibc-functions/argz_stringify.texi
@@ -0,0 +1,21 @@
+@node argz_stringify
+@subsection @code{argz_stringify}
+@findex argz_stringify
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+
+@item
+This function is broken on some platforms:
+Cygwin 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/asprintf.texi b/gnulib/doc/glibc-functions/asprintf.texi
new file mode 100644
index 00000000..16b6a973
--- /dev/null
+++ b/gnulib/doc/glibc-functions/asprintf.texi
@@ -0,0 +1,16 @@
+@node asprintf
+@subsection @code{asprintf}
+@findex asprintf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/authdes_create.texi b/gnulib/doc/glibc-functions/authdes_create.texi
new file mode 100644
index 00000000..d65c0cfa
--- /dev/null
+++ b/gnulib/doc/glibc-functions/authdes_create.texi
@@ -0,0 +1,16 @@
+@node authdes_create
+@subsection @code{authdes_create}
+@findex authdes_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/authdes_getucred.texi b/gnulib/doc/glibc-functions/authdes_getucred.texi
new file mode 100644
index 00000000..d8a32cec
--- /dev/null
+++ b/gnulib/doc/glibc-functions/authdes_getucred.texi
@@ -0,0 +1,16 @@
+@node authdes_getucred
+@subsection @code{authdes_getucred}
+@findex authdes_getucred
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/authdes_pk_create.texi b/gnulib/doc/glibc-functions/authdes_pk_create.texi
new file mode 100644
index 00000000..a1e4d6ec
--- /dev/null
+++ b/gnulib/doc/glibc-functions/authdes_pk_create.texi
@@ -0,0 +1,16 @@
+@node authdes_pk_create
+@subsection @code{authdes_pk_create}
+@findex authdes_pk_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/authnone_create.texi b/gnulib/doc/glibc-functions/authnone_create.texi
new file mode 100644
index 00000000..ef81c529
--- /dev/null
+++ b/gnulib/doc/glibc-functions/authnone_create.texi
@@ -0,0 +1,16 @@
+@node authnone_create
+@subsection @code{authnone_create}
+@findex authnone_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/authunix_create.texi b/gnulib/doc/glibc-functions/authunix_create.texi
new file mode 100644
index 00000000..3b7981f7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/authunix_create.texi
@@ -0,0 +1,16 @@
+@node authunix_create
+@subsection @code{authunix_create}
+@findex authunix_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/authunix_create_default.texi b/gnulib/doc/glibc-functions/authunix_create_default.texi
new file mode 100644
index 00000000..658bc57f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/authunix_create_default.texi
@@ -0,0 +1,16 @@
+@node authunix_create_default
+@subsection @code{authunix_create_default}
+@findex authunix_create_default
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/backtrace.texi b/gnulib/doc/glibc-functions/backtrace.texi
new file mode 100644
index 00000000..d9ea59c4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/backtrace.texi
@@ -0,0 +1,16 @@
+@node backtrace
+@subsection @code{backtrace}
+@findex backtrace
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/backtrace_symbols.texi b/gnulib/doc/glibc-functions/backtrace_symbols.texi
new file mode 100644
index 00000000..30c4ae6f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/backtrace_symbols.texi
@@ -0,0 +1,16 @@
+@node backtrace_symbols
+@subsection @code{backtrace_symbols}
+@findex backtrace_symbols
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/backtrace_symbols_fd.texi b/gnulib/doc/glibc-functions/backtrace_symbols_fd.texi
new file mode 100644
index 00000000..f94deb47
--- /dev/null
+++ b/gnulib/doc/glibc-functions/backtrace_symbols_fd.texi
@@ -0,0 +1,16 @@
+@node backtrace_symbols_fd
+@subsection @code{backtrace_symbols_fd}
+@findex backtrace_symbols_fd
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/bdflush.texi b/gnulib/doc/glibc-functions/bdflush.texi
new file mode 100644
index 00000000..0454fd5b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/bdflush.texi
@@ -0,0 +1,16 @@
+@node bdflush
+@subsection @code{bdflush}
+@findex bdflush
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/bind_textdomain_codeset.texi b/gnulib/doc/glibc-functions/bind_textdomain_codeset.texi
new file mode 100644
index 00000000..a69054a8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/bind_textdomain_codeset.texi
@@ -0,0 +1,16 @@
+@node bind_textdomain_codeset
+@subsection @code{bind_textdomain_codeset}
+@findex bind_textdomain_codeset
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/bindresvport.texi b/gnulib/doc/glibc-functions/bindresvport.texi
new file mode 100644
index 00000000..33d1b912
--- /dev/null
+++ b/gnulib/doc/glibc-functions/bindresvport.texi
@@ -0,0 +1,16 @@
+@node bindresvport
+@subsection @code{bindresvport}
+@findex bindresvport
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Cygwin 1.5.x, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/bindtextdomain.texi b/gnulib/doc/glibc-functions/bindtextdomain.texi
new file mode 100644
index 00000000..c1b2330a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/bindtextdomain.texi
@@ -0,0 +1,16 @@
+@node bindtextdomain
+@subsection @code{bindtextdomain}
+@findex bindtextdomain
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/brk.texi b/gnulib/doc/glibc-functions/brk.texi
new file mode 100644
index 00000000..f7293903
--- /dev/null
+++ b/gnulib/doc/glibc-functions/brk.texi
@@ -0,0 +1,16 @@
+@node brk
+@subsection @code{brk}
+@findex brk
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/bswap_16.texi b/gnulib/doc/glibc-functions/bswap_16.texi
new file mode 100644
index 00000000..2da4a79d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/bswap_16.texi
@@ -0,0 +1,16 @@
+@node bswap_16
+@subsection @code{bswap_16}
+@findex bswap_16
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/bswap_32.texi b/gnulib/doc/glibc-functions/bswap_32.texi
new file mode 100644
index 00000000..d1d6b212
--- /dev/null
+++ b/gnulib/doc/glibc-functions/bswap_32.texi
@@ -0,0 +1,16 @@
+@node bswap_32
+@subsection @code{bswap_32}
+@findex bswap_32
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/bswap_64.texi b/gnulib/doc/glibc-functions/bswap_64.texi
new file mode 100644
index 00000000..0089ae07
--- /dev/null
+++ b/gnulib/doc/glibc-functions/bswap_64.texi
@@ -0,0 +1,16 @@
+@node bswap_64
+@subsection @code{bswap_64}
+@findex bswap_64
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/callrpc.texi b/gnulib/doc/glibc-functions/callrpc.texi
new file mode 100644
index 00000000..7a766950
--- /dev/null
+++ b/gnulib/doc/glibc-functions/callrpc.texi
@@ -0,0 +1,16 @@
+@node callrpc
+@subsection @code{callrpc}
+@findex callrpc
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/canonicalize_file_name.texi b/gnulib/doc/glibc-functions/canonicalize_file_name.texi
new file mode 100644
index 00000000..91ccaa77
--- /dev/null
+++ b/gnulib/doc/glibc-functions/canonicalize_file_name.texi
@@ -0,0 +1,21 @@
+@node canonicalize_file_name
+@subsection @code{canonicalize_file_name}
+@findex canonicalize_file_name
+
+Gnulib module: canonicalize-lgpl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@item
+This function fails to detect trailing slashes on non-directories on
+some platforms:
+glibc 2.3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/capget.texi b/gnulib/doc/glibc-functions/capget.texi
new file mode 100644
index 00000000..b9c802df
--- /dev/null
+++ b/gnulib/doc/glibc-functions/capget.texi
@@ -0,0 +1,16 @@
+@node capget
+@subsection @code{capget}
+@findex capget
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/capset.texi b/gnulib/doc/glibc-functions/capset.texi
new file mode 100644
index 00000000..de95e23e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/capset.texi
@@ -0,0 +1,16 @@
+@node capset
+@subsection @code{capset}
+@findex capset
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/cbc_crypt.texi b/gnulib/doc/glibc-functions/cbc_crypt.texi
new file mode 100644
index 00000000..7ac56044
--- /dev/null
+++ b/gnulib/doc/glibc-functions/cbc_crypt.texi
@@ -0,0 +1,16 @@
+@node cbc_crypt
+@subsection @code{cbc_crypt}
+@findex cbc_crypt
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/cfmakeraw.texi b/gnulib/doc/glibc-functions/cfmakeraw.texi
new file mode 100644
index 00000000..d3638f46
--- /dev/null
+++ b/gnulib/doc/glibc-functions/cfmakeraw.texi
@@ -0,0 +1,16 @@
+@node cfmakeraw
+@subsection @code{cfmakeraw}
+@findex cfmakeraw
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/cfree.texi b/gnulib/doc/glibc-functions/cfree.texi
new file mode 100644
index 00000000..68295e24
--- /dev/null
+++ b/gnulib/doc/glibc-functions/cfree.texi
@@ -0,0 +1,16 @@
+@node cfree
+@subsection @code{cfree}
+@findex cfree
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/cfsetspeed.texi b/gnulib/doc/glibc-functions/cfsetspeed.texi
new file mode 100644
index 00000000..1663e3e8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/cfsetspeed.texi
@@ -0,0 +1,16 @@
+@node cfsetspeed
+@subsection @code{cfsetspeed}
+@findex cfsetspeed
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/chroot.texi b/gnulib/doc/glibc-functions/chroot.texi
new file mode 100644
index 00000000..a4eae1c5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/chroot.texi
@@ -0,0 +1,16 @@
+@node chroot
+@subsection @code{chroot}
+@findex chroot
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clearenv.texi b/gnulib/doc/glibc-functions/clearenv.texi
new file mode 100644
index 00000000..0cb7c3ca
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clearenv.texi
@@ -0,0 +1,16 @@
+@node clearenv
+@subsection @code{clearenv}
+@findex clearenv
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clearerr_unlocked.texi b/gnulib/doc/glibc-functions/clearerr_unlocked.texi
new file mode 100644
index 00000000..7116e61c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clearerr_unlocked.texi
@@ -0,0 +1,16 @@
+@node clearerr_unlocked
+@subsection @code{clearerr_unlocked}
+@findex clearerr_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnt_broadcast.texi b/gnulib/doc/glibc-functions/clnt_broadcast.texi
new file mode 100644
index 00000000..ded7a781
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnt_broadcast.texi
@@ -0,0 +1,16 @@
+@node clnt_broadcast
+@subsection @code{clnt_broadcast}
+@findex clnt_broadcast
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnt_create.texi b/gnulib/doc/glibc-functions/clnt_create.texi
new file mode 100644
index 00000000..9c433535
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnt_create.texi
@@ -0,0 +1,16 @@
+@node clnt_create
+@subsection @code{clnt_create}
+@findex clnt_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnt_pcreateerror.texi b/gnulib/doc/glibc-functions/clnt_pcreateerror.texi
new file mode 100644
index 00000000..0356f660
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnt_pcreateerror.texi
@@ -0,0 +1,16 @@
+@node clnt_pcreateerror
+@subsection @code{clnt_pcreateerror}
+@findex clnt_pcreateerror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnt_perrno.texi b/gnulib/doc/glibc-functions/clnt_perrno.texi
new file mode 100644
index 00000000..8807a3ad
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnt_perrno.texi
@@ -0,0 +1,16 @@
+@node clnt_perrno
+@subsection @code{clnt_perrno}
+@findex clnt_perrno
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnt_perror.texi b/gnulib/doc/glibc-functions/clnt_perror.texi
new file mode 100644
index 00000000..0878a09a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnt_perror.texi
@@ -0,0 +1,16 @@
+@node clnt_perror
+@subsection @code{clnt_perror}
+@findex clnt_perror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnt_spcreateerror.texi b/gnulib/doc/glibc-functions/clnt_spcreateerror.texi
new file mode 100644
index 00000000..b27c9aab
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnt_spcreateerror.texi
@@ -0,0 +1,16 @@
+@node clnt_spcreateerror
+@subsection @code{clnt_spcreateerror}
+@findex clnt_spcreateerror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnt_sperrno.texi b/gnulib/doc/glibc-functions/clnt_sperrno.texi
new file mode 100644
index 00000000..428f4589
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnt_sperrno.texi
@@ -0,0 +1,16 @@
+@node clnt_sperrno
+@subsection @code{clnt_sperrno}
+@findex clnt_sperrno
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnt_sperror.texi b/gnulib/doc/glibc-functions/clnt_sperror.texi
new file mode 100644
index 00000000..658ea1eb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnt_sperror.texi
@@ -0,0 +1,16 @@
+@node clnt_sperror
+@subsection @code{clnt_sperror}
+@findex clnt_sperror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clntraw_create.texi b/gnulib/doc/glibc-functions/clntraw_create.texi
new file mode 100644
index 00000000..0958497a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clntraw_create.texi
@@ -0,0 +1,16 @@
+@node clntraw_create
+@subsection @code{clntraw_create}
+@findex clntraw_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clnttcp_create.texi b/gnulib/doc/glibc-functions/clnttcp_create.texi
new file mode 100644
index 00000000..9a252aca
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clnttcp_create.texi
@@ -0,0 +1,16 @@
+@node clnttcp_create
+@subsection @code{clnttcp_create}
+@findex clnttcp_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clntudp_bufcreate.texi b/gnulib/doc/glibc-functions/clntudp_bufcreate.texi
new file mode 100644
index 00000000..ffb617c0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clntudp_bufcreate.texi
@@ -0,0 +1,16 @@
+@node clntudp_bufcreate
+@subsection @code{clntudp_bufcreate}
+@findex clntudp_bufcreate
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clntudp_create.texi b/gnulib/doc/glibc-functions/clntudp_create.texi
new file mode 100644
index 00000000..6c2e2b53
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clntudp_create.texi
@@ -0,0 +1,16 @@
+@node clntudp_create
+@subsection @code{clntudp_create}
+@findex clntudp_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clntunix_create.texi b/gnulib/doc/glibc-functions/clntunix_create.texi
new file mode 100644
index 00000000..66cb14ff
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clntunix_create.texi
@@ -0,0 +1,16 @@
+@node clntunix_create
+@subsection @code{clntunix_create}
+@findex clntunix_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clog10.texi b/gnulib/doc/glibc-functions/clog10.texi
new file mode 100644
index 00000000..e921a017
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clog10.texi
@@ -0,0 +1,16 @@
+@node clog10
+@subsection @code{clog10}
+@findex clog10
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clog10f.texi b/gnulib/doc/glibc-functions/clog10f.texi
new file mode 100644
index 00000000..a93e871d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clog10f.texi
@@ -0,0 +1,16 @@
+@node clog10f
+@subsection @code{clog10f}
+@findex clog10f
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clog10l.texi b/gnulib/doc/glibc-functions/clog10l.texi
new file mode 100644
index 00000000..23d09032
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clog10l.texi
@@ -0,0 +1,16 @@
+@node clog10l
+@subsection @code{clog10l}
+@findex clog10l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/clone.texi b/gnulib/doc/glibc-functions/clone.texi
new file mode 100644
index 00000000..3881868d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/clone.texi
@@ -0,0 +1,16 @@
+@node clone
+@subsection @code{clone}
+@findex clone
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/crypt_r.texi b/gnulib/doc/glibc-functions/crypt_r.texi
new file mode 100644
index 00000000..dcb20d3e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/crypt_r.texi
@@ -0,0 +1,16 @@
+@node crypt_r
+@subsection @code{crypt_r}
+@findex crypt_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/cuserid.texi b/gnulib/doc/glibc-functions/cuserid.texi
new file mode 100644
index 00000000..8e8473fa
--- /dev/null
+++ b/gnulib/doc/glibc-functions/cuserid.texi
@@ -0,0 +1,16 @@
+@node cuserid
+@subsection @code{cuserid}
+@findex cuserid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/daemon.texi b/gnulib/doc/glibc-functions/daemon.texi
new file mode 100644
index 00000000..78bdb37d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/daemon.texi
@@ -0,0 +1,16 @@
+@node daemon
+@subsection @code{daemon}
+@findex daemon
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dcgettext.texi b/gnulib/doc/glibc-functions/dcgettext.texi
new file mode 100644
index 00000000..3d14dbac
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dcgettext.texi
@@ -0,0 +1,16 @@
+@node dcgettext
+@subsection @code{dcgettext}
+@findex dcgettext
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dcngettext.texi b/gnulib/doc/glibc-functions/dcngettext.texi
new file mode 100644
index 00000000..56cfb496
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dcngettext.texi
@@ -0,0 +1,16 @@
+@node dcngettext
+@subsection @code{dcngettext}
+@findex dcngettext
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/des_setparity.texi b/gnulib/doc/glibc-functions/des_setparity.texi
new file mode 100644
index 00000000..331f6411
--- /dev/null
+++ b/gnulib/doc/glibc-functions/des_setparity.texi
@@ -0,0 +1,16 @@
+@node des_setparity
+@subsection @code{des_setparity}
+@findex des_setparity
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dgettext.texi b/gnulib/doc/glibc-functions/dgettext.texi
new file mode 100644
index 00000000..cfff0121
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dgettext.texi
@@ -0,0 +1,16 @@
+@node dgettext
+@subsection @code{dgettext}
+@findex dgettext
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dl_iterate_phdr.texi b/gnulib/doc/glibc-functions/dl_iterate_phdr.texi
new file mode 100644
index 00000000..90ca043f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dl_iterate_phdr.texi
@@ -0,0 +1,16 @@
+@node dl_iterate_phdr
+@subsection @code{dl_iterate_phdr}
+@findex dl_iterate_phdr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dladdr.texi b/gnulib/doc/glibc-functions/dladdr.texi
new file mode 100644
index 00000000..45c1c554
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dladdr.texi
@@ -0,0 +1,16 @@
+@node dladdr
+@subsection @code{dladdr}
+@findex dladdr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dladdr1.texi b/gnulib/doc/glibc-functions/dladdr1.texi
new file mode 100644
index 00000000..bf470f55
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dladdr1.texi
@@ -0,0 +1,16 @@
+@node dladdr1
+@subsection @code{dladdr1}
+@findex dladdr1
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dlinfo.texi b/gnulib/doc/glibc-functions/dlinfo.texi
new file mode 100644
index 00000000..089ed313
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dlinfo.texi
@@ -0,0 +1,16 @@
+@node dlinfo
+@subsection @code{dlinfo}
+@findex dlinfo
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dlmopen.texi b/gnulib/doc/glibc-functions/dlmopen.texi
new file mode 100644
index 00000000..d72c50c6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dlmopen.texi
@@ -0,0 +1,16 @@
+@node dlmopen
+@subsection @code{dlmopen}
+@findex dlmopen
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dlvsym.texi b/gnulib/doc/glibc-functions/dlvsym.texi
new file mode 100644
index 00000000..ba0550a0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dlvsym.texi
@@ -0,0 +1,16 @@
+@node dlvsym
+@subsection @code{dlvsym}
+@findex dlvsym
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dn_expand.texi b/gnulib/doc/glibc-functions/dn_expand.texi
new file mode 100644
index 00000000..aad43a17
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dn_expand.texi
@@ -0,0 +1,16 @@
+@node dn_expand
+@subsection @code{dn_expand}
+@findex dn_expand
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dngettext.texi b/gnulib/doc/glibc-functions/dngettext.texi
new file mode 100644
index 00000000..047228fe
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dngettext.texi
@@ -0,0 +1,16 @@
+@node dngettext
+@subsection @code{dngettext}
+@findex dngettext
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/drand48_r.texi b/gnulib/doc/glibc-functions/drand48_r.texi
new file mode 100644
index 00000000..5ff02167
--- /dev/null
+++ b/gnulib/doc/glibc-functions/drand48_r.texi
@@ -0,0 +1,16 @@
+@node drand48_r
+@subsection @code{drand48_r}
+@findex drand48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/drem.texi b/gnulib/doc/glibc-functions/drem.texi
new file mode 100644
index 00000000..31215442
--- /dev/null
+++ b/gnulib/doc/glibc-functions/drem.texi
@@ -0,0 +1,16 @@
+@node drem
+@subsection @code{drem}
+@findex drem
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 10, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dremf.texi b/gnulib/doc/glibc-functions/dremf.texi
new file mode 100644
index 00000000..1cb49d5f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dremf.texi
@@ -0,0 +1,16 @@
+@node dremf
+@subsection @code{dremf}
+@findex dremf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dreml.texi b/gnulib/doc/glibc-functions/dreml.texi
new file mode 100644
index 00000000..d9314dcd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dreml.texi
@@ -0,0 +1,16 @@
+@node dreml
+@subsection @code{dreml}
+@findex dreml
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dup3.texi b/gnulib/doc/glibc-functions/dup3.texi
new file mode 100644
index 00000000..c48d76f0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dup3.texi
@@ -0,0 +1,16 @@
+@node dup3
+@subsection @code{dup3}
+@findex dup3
+
+Gnulib module: dup3
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/dysize.texi b/gnulib/doc/glibc-functions/dysize.texi
new file mode 100644
index 00000000..a3489938
--- /dev/null
+++ b/gnulib/doc/glibc-functions/dysize.texi
@@ -0,0 +1,16 @@
+@node dysize
+@subsection @code{dysize}
+@findex dysize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ecb_crypt.texi b/gnulib/doc/glibc-functions/ecb_crypt.texi
new file mode 100644
index 00000000..3ccceef8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ecb_crypt.texi
@@ -0,0 +1,16 @@
+@node ecb_crypt
+@subsection @code{ecb_crypt}
+@findex ecb_crypt
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ecvt_r.texi b/gnulib/doc/glibc-functions/ecvt_r.texi
new file mode 100644
index 00000000..578dc6be
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ecvt_r.texi
@@ -0,0 +1,16 @@
+@node ecvt_r
+@subsection @code{ecvt_r}
+@findex ecvt_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/encrypt_r.texi b/gnulib/doc/glibc-functions/encrypt_r.texi
new file mode 100644
index 00000000..7a9a0317
--- /dev/null
+++ b/gnulib/doc/glibc-functions/encrypt_r.texi
@@ -0,0 +1,16 @@
+@node encrypt_r
+@subsection @code{encrypt_r}
+@findex encrypt_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endaliasent.texi b/gnulib/doc/glibc-functions/endaliasent.texi
new file mode 100644
index 00000000..4fbe400b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endaliasent.texi
@@ -0,0 +1,16 @@
+@node endaliasent
+@subsection @code{endaliasent}
+@findex endaliasent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endfsent.texi b/gnulib/doc/glibc-functions/endfsent.texi
new file mode 100644
index 00000000..5d09c1f0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endfsent.texi
@@ -0,0 +1,16 @@
+@node endfsent
+@subsection @code{endfsent}
+@findex endfsent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endmntent.texi b/gnulib/doc/glibc-functions/endmntent.texi
new file mode 100644
index 00000000..01bc565b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endmntent.texi
@@ -0,0 +1,16 @@
+@node endmntent
+@subsection @code{endmntent}
+@findex endmntent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endnetgrent.texi b/gnulib/doc/glibc-functions/endnetgrent.texi
new file mode 100644
index 00000000..51defc26
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endnetgrent.texi
@@ -0,0 +1,16 @@
+@node endnetgrent
+@subsection @code{endnetgrent}
+@findex endnetgrent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endrpcent.texi b/gnulib/doc/glibc-functions/endrpcent.texi
new file mode 100644
index 00000000..2fab60c7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endrpcent.texi
@@ -0,0 +1,16 @@
+@node endrpcent
+@subsection @code{endrpcent}
+@findex endrpcent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endspent.texi b/gnulib/doc/glibc-functions/endspent.texi
new file mode 100644
index 00000000..e2558536
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endspent.texi
@@ -0,0 +1,16 @@
+@node endspent
+@subsection @code{endspent}
+@findex endspent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endttyent.texi b/gnulib/doc/glibc-functions/endttyent.texi
new file mode 100644
index 00000000..2cbe772f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endttyent.texi
@@ -0,0 +1,16 @@
+@node endttyent
+@subsection @code{endttyent}
+@findex endttyent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endusershell.texi b/gnulib/doc/glibc-functions/endusershell.texi
new file mode 100644
index 00000000..5f7f788e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endusershell.texi
@@ -0,0 +1,16 @@
+@node endusershell
+@subsection @code{endusershell}
+@findex endusershell
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/endutent.texi b/gnulib/doc/glibc-functions/endutent.texi
new file mode 100644
index 00000000..ab58bdc0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/endutent.texi
@@ -0,0 +1,16 @@
+@node endutent
+@subsection @code{endutent}
+@findex endutent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/envz_add.texi b/gnulib/doc/glibc-functions/envz_add.texi
new file mode 100644
index 00000000..a7f00f81
--- /dev/null
+++ b/gnulib/doc/glibc-functions/envz_add.texi
@@ -0,0 +1,16 @@
+@node envz_add
+@subsection @code{envz_add}
+@findex envz_add
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/envz_entry.texi b/gnulib/doc/glibc-functions/envz_entry.texi
new file mode 100644
index 00000000..5e7ba4b7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/envz_entry.texi
@@ -0,0 +1,16 @@
+@node envz_entry
+@subsection @code{envz_entry}
+@findex envz_entry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/envz_get.texi b/gnulib/doc/glibc-functions/envz_get.texi
new file mode 100644
index 00000000..95c56e0b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/envz_get.texi
@@ -0,0 +1,16 @@
+@node envz_get
+@subsection @code{envz_get}
+@findex envz_get
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/envz_merge.texi b/gnulib/doc/glibc-functions/envz_merge.texi
new file mode 100644
index 00000000..862dff68
--- /dev/null
+++ b/gnulib/doc/glibc-functions/envz_merge.texi
@@ -0,0 +1,16 @@
+@node envz_merge
+@subsection @code{envz_merge}
+@findex envz_merge
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/envz_remove.texi b/gnulib/doc/glibc-functions/envz_remove.texi
new file mode 100644
index 00000000..62cbc4fe
--- /dev/null
+++ b/gnulib/doc/glibc-functions/envz_remove.texi
@@ -0,0 +1,16 @@
+@node envz_remove
+@subsection @code{envz_remove}
+@findex envz_remove
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/envz_strip.texi b/gnulib/doc/glibc-functions/envz_strip.texi
new file mode 100644
index 00000000..88d043b1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/envz_strip.texi
@@ -0,0 +1,16 @@
+@node envz_strip
+@subsection @code{envz_strip}
+@findex envz_strip
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/epoll_create.texi b/gnulib/doc/glibc-functions/epoll_create.texi
new file mode 100644
index 00000000..91f27d43
--- /dev/null
+++ b/gnulib/doc/glibc-functions/epoll_create.texi
@@ -0,0 +1,16 @@
+@node epoll_create
+@subsection @code{epoll_create}
+@findex epoll_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/epoll_ctl.texi b/gnulib/doc/glibc-functions/epoll_ctl.texi
new file mode 100644
index 00000000..dc62806e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/epoll_ctl.texi
@@ -0,0 +1,16 @@
+@node epoll_ctl
+@subsection @code{epoll_ctl}
+@findex epoll_ctl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/epoll_wait.texi b/gnulib/doc/glibc-functions/epoll_wait.texi
new file mode 100644
index 00000000..93ddf45b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/epoll_wait.texi
@@ -0,0 +1,16 @@
+@node epoll_wait
+@subsection @code{epoll_wait}
+@findex epoll_wait
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/erand48_r.texi b/gnulib/doc/glibc-functions/erand48_r.texi
new file mode 100644
index 00000000..852c0948
--- /dev/null
+++ b/gnulib/doc/glibc-functions/erand48_r.texi
@@ -0,0 +1,16 @@
+@node erand48_r
+@subsection @code{erand48_r}
+@findex erand48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/err.texi b/gnulib/doc/glibc-functions/err.texi
new file mode 100644
index 00000000..436268c3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/err.texi
@@ -0,0 +1,16 @@
+@node err
+@subsection @code{err}
+@findex err
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/error.texi b/gnulib/doc/glibc-functions/error.texi
new file mode 100644
index 00000000..bff51c32
--- /dev/null
+++ b/gnulib/doc/glibc-functions/error.texi
@@ -0,0 +1,16 @@
+@node error
+@subsection @code{error}
+@findex error
+
+Gnulib module: error
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/error_at_line.texi b/gnulib/doc/glibc-functions/error_at_line.texi
new file mode 100644
index 00000000..0186f701
--- /dev/null
+++ b/gnulib/doc/glibc-functions/error_at_line.texi
@@ -0,0 +1,16 @@
+@node error_at_line
+@subsection @code{error_at_line}
+@findex error_at_line
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/error_message_count.texi b/gnulib/doc/glibc-functions/error_message_count.texi
new file mode 100644
index 00000000..4d9a6f8c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/error_message_count.texi
@@ -0,0 +1,16 @@
+@node error_message_count
+@subsection @code{error_message_count}
+@findex error_message_count
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/error_one_per_line.texi b/gnulib/doc/glibc-functions/error_one_per_line.texi
new file mode 100644
index 00000000..dbebc095
--- /dev/null
+++ b/gnulib/doc/glibc-functions/error_one_per_line.texi
@@ -0,0 +1,16 @@
+@node error_one_per_line
+@subsection @code{error_one_per_line}
+@findex error_one_per_line
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/error_print_progname.texi b/gnulib/doc/glibc-functions/error_print_progname.texi
new file mode 100644
index 00000000..a0f6929d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/error_print_progname.texi
@@ -0,0 +1,16 @@
+@node error_print_progname
+@subsection @code{error_print_progname}
+@findex error_print_progname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/errx.texi b/gnulib/doc/glibc-functions/errx.texi
new file mode 100644
index 00000000..78255c61
--- /dev/null
+++ b/gnulib/doc/glibc-functions/errx.texi
@@ -0,0 +1,16 @@
+@node errx
+@subsection @code{errx}
+@findex errx
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ether_aton.texi b/gnulib/doc/glibc-functions/ether_aton.texi
new file mode 100644
index 00000000..b8e29d91
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ether_aton.texi
@@ -0,0 +1,16 @@
+@node ether_aton
+@subsection @code{ether_aton}
+@findex ether_aton
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ether_aton_r.texi b/gnulib/doc/glibc-functions/ether_aton_r.texi
new file mode 100644
index 00000000..cb6e5fc5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ether_aton_r.texi
@@ -0,0 +1,16 @@
+@node ether_aton_r
+@subsection @code{ether_aton_r}
+@findex ether_aton_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ether_hostton.texi b/gnulib/doc/glibc-functions/ether_hostton.texi
new file mode 100644
index 00000000..d66039a6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ether_hostton.texi
@@ -0,0 +1,16 @@
+@node ether_hostton
+@subsection @code{ether_hostton}
+@findex ether_hostton
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ether_line.texi b/gnulib/doc/glibc-functions/ether_line.texi
new file mode 100644
index 00000000..1906c3ba
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ether_line.texi
@@ -0,0 +1,16 @@
+@node ether_line
+@subsection @code{ether_line}
+@findex ether_line
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ether_ntoa.texi b/gnulib/doc/glibc-functions/ether_ntoa.texi
new file mode 100644
index 00000000..b839348b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ether_ntoa.texi
@@ -0,0 +1,16 @@
+@node ether_ntoa
+@subsection @code{ether_ntoa}
+@findex ether_ntoa
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ether_ntoa_r.texi b/gnulib/doc/glibc-functions/ether_ntoa_r.texi
new file mode 100644
index 00000000..03b77d19
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ether_ntoa_r.texi
@@ -0,0 +1,16 @@
+@node ether_ntoa_r
+@subsection @code{ether_ntoa_r}
+@findex ether_ntoa_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ether_ntohost.texi b/gnulib/doc/glibc-functions/ether_ntohost.texi
new file mode 100644
index 00000000..254a833c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ether_ntohost.texi
@@ -0,0 +1,16 @@
+@node ether_ntohost
+@subsection @code{ether_ntohost}
+@findex ether_ntohost
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/euidaccess.texi b/gnulib/doc/glibc-functions/euidaccess.texi
new file mode 100644
index 00000000..5e393917
--- /dev/null
+++ b/gnulib/doc/glibc-functions/euidaccess.texi
@@ -0,0 +1,17 @@
+@node euidaccess
+@subsection @code{euidaccess}
+@findex euidaccess
+
+Gnulib module: euidaccess
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/execvpe.texi b/gnulib/doc/glibc-functions/execvpe.texi
new file mode 100644
index 00000000..867f70a9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/execvpe.texi
@@ -0,0 +1,18 @@
+@node execvpe
+@subsection @code{execvpe}
+@findex execvpe
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+glibc 2.9, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw,
+Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/exp10.texi b/gnulib/doc/glibc-functions/exp10.texi
new file mode 100644
index 00000000..a118a7a1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/exp10.texi
@@ -0,0 +1,17 @@
+@node exp10
+@subsection @code{exp10}
+@findex exp10
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/exp10f.texi b/gnulib/doc/glibc-functions/exp10f.texi
new file mode 100644
index 00000000..150abb90
--- /dev/null
+++ b/gnulib/doc/glibc-functions/exp10f.texi
@@ -0,0 +1,17 @@
+@node exp10f
+@subsection @code{exp10f}
+@findex exp10f
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/exp10l.texi b/gnulib/doc/glibc-functions/exp10l.texi
new file mode 100644
index 00000000..3cacd346
--- /dev/null
+++ b/gnulib/doc/glibc-functions/exp10l.texi
@@ -0,0 +1,16 @@
+@node exp10l
+@subsection @code{exp10l}
+@findex exp10l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fallocate.texi b/gnulib/doc/glibc-functions/fallocate.texi
new file mode 100644
index 00000000..c7d2f529
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fallocate.texi
@@ -0,0 +1,16 @@
+@node fallocate
+@subsection @code{fallocate}
+@findex fallocate
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on older glibc versions and all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fcloseall.texi b/gnulib/doc/glibc-functions/fcloseall.texi
new file mode 100644
index 00000000..07fca3cc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fcloseall.texi
@@ -0,0 +1,16 @@
+@node fcloseall
+@subsection @code{fcloseall}
+@findex fcloseall
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fcvt_r.texi b/gnulib/doc/glibc-functions/fcvt_r.texi
new file mode 100644
index 00000000..0a9c802e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fcvt_r.texi
@@ -0,0 +1,16 @@
+@node fcvt_r
+@subsection @code{fcvt_r}
+@findex fcvt_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fedisableexcept.texi b/gnulib/doc/glibc-functions/fedisableexcept.texi
new file mode 100644
index 00000000..42339044
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fedisableexcept.texi
@@ -0,0 +1,16 @@
+@node fedisableexcept
+@subsection @code{fedisableexcept}
+@findex fedisableexcept
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/feenableexcept.texi b/gnulib/doc/glibc-functions/feenableexcept.texi
new file mode 100644
index 00000000..5e9da1fb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/feenableexcept.texi
@@ -0,0 +1,16 @@
+@node feenableexcept
+@subsection @code{feenableexcept}
+@findex feenableexcept
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fegetexcept.texi b/gnulib/doc/glibc-functions/fegetexcept.texi
new file mode 100644
index 00000000..9a828c5b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fegetexcept.texi
@@ -0,0 +1,16 @@
+@node fegetexcept
+@subsection @code{fegetexcept}
+@findex fegetexcept
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/feof_unlocked.texi b/gnulib/doc/glibc-functions/feof_unlocked.texi
new file mode 100644
index 00000000..8e502e6a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/feof_unlocked.texi
@@ -0,0 +1,16 @@
+@node feof_unlocked
+@subsection @code{feof_unlocked}
+@findex feof_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ferror_unlocked.texi b/gnulib/doc/glibc-functions/ferror_unlocked.texi
new file mode 100644
index 00000000..1cf2f0eb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ferror_unlocked.texi
@@ -0,0 +1,16 @@
+@node ferror_unlocked
+@subsection @code{ferror_unlocked}
+@findex ferror_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fflush_unlocked.texi b/gnulib/doc/glibc-functions/fflush_unlocked.texi
new file mode 100644
index 00000000..39714ca2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fflush_unlocked.texi
@@ -0,0 +1,16 @@
+@node fflush_unlocked
+@subsection @code{fflush_unlocked}
+@findex fflush_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ffsl.texi b/gnulib/doc/glibc-functions/ffsl.texi
new file mode 100644
index 00000000..70c3036c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ffsl.texi
@@ -0,0 +1,16 @@
+@node ffsl
+@subsection @code{ffsl}
+@findex ffsl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ffsll.texi b/gnulib/doc/glibc-functions/ffsll.texi
new file mode 100644
index 00000000..3a3da4f0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ffsll.texi
@@ -0,0 +1,16 @@
+@node ffsll
+@subsection @code{ffsll}
+@findex ffsll
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetc_unlocked.texi b/gnulib/doc/glibc-functions/fgetc_unlocked.texi
new file mode 100644
index 00000000..348b79b4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetc_unlocked.texi
@@ -0,0 +1,16 @@
+@node fgetc_unlocked
+@subsection @code{fgetc_unlocked}
+@findex fgetc_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetfilecon.texi b/gnulib/doc/glibc-functions/fgetfilecon.texi
new file mode 100644
index 00000000..b2cf7e89
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetfilecon.texi
@@ -0,0 +1,5 @@
+@node fgetfilecon
+@subsection @code{fgetfilecon}
+@findex fgetfilecon
+
+@getfileconDesc{fgetfilecon}
diff --git a/gnulib/doc/glibc-functions/fgetgrent.texi b/gnulib/doc/glibc-functions/fgetgrent.texi
new file mode 100644
index 00000000..8117a573
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetgrent.texi
@@ -0,0 +1,16 @@
+@node fgetgrent
+@subsection @code{fgetgrent}
+@findex fgetgrent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetgrent_r.texi b/gnulib/doc/glibc-functions/fgetgrent_r.texi
new file mode 100644
index 00000000..795dcfb0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetgrent_r.texi
@@ -0,0 +1,16 @@
+@node fgetgrent_r
+@subsection @code{fgetgrent_r}
+@findex fgetgrent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetpwent.texi b/gnulib/doc/glibc-functions/fgetpwent.texi
new file mode 100644
index 00000000..0680f8c0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetpwent.texi
@@ -0,0 +1,16 @@
+@node fgetpwent
+@subsection @code{fgetpwent}
+@findex fgetpwent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetpwent_r.texi b/gnulib/doc/glibc-functions/fgetpwent_r.texi
new file mode 100644
index 00000000..75917784
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetpwent_r.texi
@@ -0,0 +1,16 @@
+@node fgetpwent_r
+@subsection @code{fgetpwent_r}
+@findex fgetpwent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgets_unlocked.texi b/gnulib/doc/glibc-functions/fgets_unlocked.texi
new file mode 100644
index 00000000..d63caaff
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgets_unlocked.texi
@@ -0,0 +1,16 @@
+@node fgets_unlocked
+@subsection @code{fgets_unlocked}
+@findex fgets_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetspent.texi b/gnulib/doc/glibc-functions/fgetspent.texi
new file mode 100644
index 00000000..cd561a2b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetspent.texi
@@ -0,0 +1,16 @@
+@node fgetspent
+@subsection @code{fgetspent}
+@findex fgetspent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetspent_r.texi b/gnulib/doc/glibc-functions/fgetspent_r.texi
new file mode 100644
index 00000000..992580c7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetspent_r.texi
@@ -0,0 +1,16 @@
+@node fgetspent_r
+@subsection @code{fgetspent_r}
+@findex fgetspent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 5.3, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetwc_unlocked.texi b/gnulib/doc/glibc-functions/fgetwc_unlocked.texi
new file mode 100644
index 00000000..6ad8cb6a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetwc_unlocked.texi
@@ -0,0 +1,19 @@
+@node fgetwc_unlocked
+@subsection @code{fgetwc_unlocked}
+@findex fgetwc_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetws_unlocked.texi b/gnulib/doc/glibc-functions/fgetws_unlocked.texi
new file mode 100644
index 00000000..505015bf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetws_unlocked.texi
@@ -0,0 +1,19 @@
+@node fgetws_unlocked
+@subsection @code{fgetws_unlocked}
+@findex fgetws_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fgetxattr.texi b/gnulib/doc/glibc-functions/fgetxattr.texi
new file mode 100644
index 00000000..ec1d580c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fgetxattr.texi
@@ -0,0 +1,17 @@
+@node fgetxattr
+@subsection @code{fgetxattr}
+@findex fgetxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fileno_unlocked.texi b/gnulib/doc/glibc-functions/fileno_unlocked.texi
new file mode 100644
index 00000000..952dd3d3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fileno_unlocked.texi
@@ -0,0 +1,16 @@
+@node fileno_unlocked
+@subsection @code{fileno_unlocked}
+@findex fileno_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/finite.texi b/gnulib/doc/glibc-functions/finite.texi
new file mode 100644
index 00000000..19cc0822
--- /dev/null
+++ b/gnulib/doc/glibc-functions/finite.texi
@@ -0,0 +1,16 @@
+@node finite
+@subsection @code{finite}
+@findex finite
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/finitef.texi b/gnulib/doc/glibc-functions/finitef.texi
new file mode 100644
index 00000000..9b926742
--- /dev/null
+++ b/gnulib/doc/glibc-functions/finitef.texi
@@ -0,0 +1,16 @@
+@node finitef
+@subsection @code{finitef}
+@findex finitef
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/finitel.texi b/gnulib/doc/glibc-functions/finitel.texi
new file mode 100644
index 00000000..ab4222d9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/finitel.texi
@@ -0,0 +1,16 @@
+@node finitel
+@subsection @code{finitel}
+@findex finitel
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/flistxattr.texi b/gnulib/doc/glibc-functions/flistxattr.texi
new file mode 100644
index 00000000..39ba5d5e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/flistxattr.texi
@@ -0,0 +1,17 @@
+@node flistxattr
+@subsection @code{flistxattr}
+@findex flistxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/flock.texi b/gnulib/doc/glibc-functions/flock.texi
new file mode 100644
index 00000000..23878cf6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/flock.texi
@@ -0,0 +1,19 @@
+@node flock
+@subsection @code{flock}
+@findex flock
+
+Gnulib module: flock
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, Solaris 10, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fopencookie.texi b/gnulib/doc/glibc-functions/fopencookie.texi
new file mode 100644
index 00000000..6e73ecaf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fopencookie.texi
@@ -0,0 +1,17 @@
+@node fopencookie
+@subsection @code{fopencookie}
+@findex fopencookie
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/forkpty.texi b/gnulib/doc/glibc-functions/forkpty.texi
new file mode 100644
index 00000000..7701a382
--- /dev/null
+++ b/gnulib/doc/glibc-functions/forkpty.texi
@@ -0,0 +1,25 @@
+@node forkpty
+@subsection @code{forkpty}
+@findex forkpty
+
+Gnulib module: pty
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+One some systems (at least including Cygwin, Interix, OSF/1 4 and 5,
+and Mac OS X) linking with @code{-lutil} is not required.
+@item
+On glibc, OpenBSD, NetBSD and FreeBSD linking with @code{-lutil} is
+required.
+@item
+The function is declared in pty.h on Cygwin, Interix, OSF/1 4 and 5,
+and glibc. It is declared in util.h on Mac OS X, OpenBSD and NetBSD.
+It is declared in libutil.h on FreeBSD.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+On some systems (at least including Solaris and HP-UX) the function is
+missing.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fputc_unlocked.texi b/gnulib/doc/glibc-functions/fputc_unlocked.texi
new file mode 100644
index 00000000..087c3609
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fputc_unlocked.texi
@@ -0,0 +1,16 @@
+@node fputc_unlocked
+@subsection @code{fputc_unlocked}
+@findex fputc_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fputs_unlocked.texi b/gnulib/doc/glibc-functions/fputs_unlocked.texi
new file mode 100644
index 00000000..a052dbc7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fputs_unlocked.texi
@@ -0,0 +1,16 @@
+@node fputs_unlocked
+@subsection @code{fputs_unlocked}
+@findex fputs_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fputwc_unlocked.texi b/gnulib/doc/glibc-functions/fputwc_unlocked.texi
new file mode 100644
index 00000000..91476d4c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fputwc_unlocked.texi
@@ -0,0 +1,19 @@
+@node fputwc_unlocked
+@subsection @code{fputwc_unlocked}
+@findex fputwc_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fputws_unlocked.texi b/gnulib/doc/glibc-functions/fputws_unlocked.texi
new file mode 100644
index 00000000..3016f9fd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fputws_unlocked.texi
@@ -0,0 +1,19 @@
+@node fputws_unlocked
+@subsection @code{fputws_unlocked}
+@findex fputws_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fread_unlocked.texi b/gnulib/doc/glibc-functions/fread_unlocked.texi
new file mode 100644
index 00000000..3122d522
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fread_unlocked.texi
@@ -0,0 +1,16 @@
+@node fread_unlocked
+@subsection @code{fread_unlocked}
+@findex fread_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/freeifaddrs.texi b/gnulib/doc/glibc-functions/freeifaddrs.texi
new file mode 100644
index 00000000..fc7d9939
--- /dev/null
+++ b/gnulib/doc/glibc-functions/freeifaddrs.texi
@@ -0,0 +1,16 @@
+@node freeifaddrs
+@subsection @code{freeifaddrs}
+@findex freeifaddrs
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fremovexattr.texi b/gnulib/doc/glibc-functions/fremovexattr.texi
new file mode 100644
index 00000000..92de0964
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fremovexattr.texi
@@ -0,0 +1,17 @@
+@node fremovexattr
+@subsection @code{fremovexattr}
+@findex fremovexattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fsetxattr.texi b/gnulib/doc/glibc-functions/fsetxattr.texi
new file mode 100644
index 00000000..af3af3a6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fsetxattr.texi
@@ -0,0 +1,17 @@
+@node fsetxattr
+@subsection @code{fsetxattr}
+@findex fsetxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fstatfs.texi b/gnulib/doc/glibc-functions/fstatfs.texi
new file mode 100644
index 00000000..6c4c50d2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fstatfs.texi
@@ -0,0 +1,16 @@
+@node fstatfs
+@subsection @code{fstatfs}
+@findex fstatfs
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fts_children.texi b/gnulib/doc/glibc-functions/fts_children.texi
new file mode 100644
index 00000000..80665e7a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fts_children.texi
@@ -0,0 +1,16 @@
+@node fts_children
+@subsection @code{fts_children}
+@findex fts_children
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fts_close.texi b/gnulib/doc/glibc-functions/fts_close.texi
new file mode 100644
index 00000000..0031fc1d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fts_close.texi
@@ -0,0 +1,16 @@
+@node fts_close
+@subsection @code{fts_close}
+@findex fts_close
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fts_open.texi b/gnulib/doc/glibc-functions/fts_open.texi
new file mode 100644
index 00000000..32386ab7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fts_open.texi
@@ -0,0 +1,16 @@
+@node fts_open
+@subsection @code{fts_open}
+@findex fts_open
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fts_read.texi b/gnulib/doc/glibc-functions/fts_read.texi
new file mode 100644
index 00000000..e2e1a4a9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fts_read.texi
@@ -0,0 +1,16 @@
+@node fts_read
+@subsection @code{fts_read}
+@findex fts_read
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fts_set.texi b/gnulib/doc/glibc-functions/fts_set.texi
new file mode 100644
index 00000000..66ce0830
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fts_set.texi
@@ -0,0 +1,16 @@
+@node fts_set
+@subsection @code{fts_set}
+@findex fts_set
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/futimes.texi b/gnulib/doc/glibc-functions/futimes.texi
new file mode 100644
index 00000000..0df4706b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/futimes.texi
@@ -0,0 +1,20 @@
+@node futimes
+@subsection @code{futimes}
+@findex futimes
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix
+3.5, BeOS.
+@item
+This function cannot set full timestamp resolution. Use
+@code{futimens(fd,times)} instead.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/futimesat.texi b/gnulib/doc/glibc-functions/futimesat.texi
new file mode 100644
index 00000000..109e4122
--- /dev/null
+++ b/gnulib/doc/glibc-functions/futimesat.texi
@@ -0,0 +1,25 @@
+@node futimesat
+@subsection @code{futimesat}
+@findex futimesat
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 8, Cygwin 1.5.x, mingw,
+Interix 3.5, BeOS.
+@item
+On some platforms, this function mis-handles trailing slash:
+Solaris 9.
+@item
+This function cannot set full timestamp resolution. Use
+@code{file ? utimensat(fd,file,times,0) : futimens(fd,times)}, or the
+gnulib module fdutimensat, instead.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/fwrite_unlocked.texi b/gnulib/doc/glibc-functions/fwrite_unlocked.texi
new file mode 100644
index 00000000..c5f7b07f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/fwrite_unlocked.texi
@@ -0,0 +1,16 @@
+@node fwrite_unlocked
+@subsection @code{fwrite_unlocked}
+@findex fwrite_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gamma.texi b/gnulib/doc/glibc-functions/gamma.texi
new file mode 100644
index 00000000..cf54318b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gamma.texi
@@ -0,0 +1,16 @@
+@node gamma
+@subsection @code{gamma}
+@findex gamma
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gammaf.texi b/gnulib/doc/glibc-functions/gammaf.texi
new file mode 100644
index 00000000..4e51f57a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gammaf.texi
@@ -0,0 +1,16 @@
+@node gammaf
+@subsection @code{gammaf}
+@findex gammaf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gammal.texi b/gnulib/doc/glibc-functions/gammal.texi
new file mode 100644
index 00000000..72d52529
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gammal.texi
@@ -0,0 +1,16 @@
+@node gammal
+@subsection @code{gammal}
+@findex gammal
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/get_avphys_pages.texi b/gnulib/doc/glibc-functions/get_avphys_pages.texi
new file mode 100644
index 00000000..14b2e80b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/get_avphys_pages.texi
@@ -0,0 +1,16 @@
+@node get_avphys_pages
+@subsection @code{get_avphys_pages}
+@findex get_avphys_pages
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/get_current_dir_name.texi b/gnulib/doc/glibc-functions/get_current_dir_name.texi
new file mode 100644
index 00000000..15e64b73
--- /dev/null
+++ b/gnulib/doc/glibc-functions/get_current_dir_name.texi
@@ -0,0 +1,16 @@
+@node get_current_dir_name
+@subsection @code{get_current_dir_name}
+@findex get_current_dir_name
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/get_myaddress.texi b/gnulib/doc/glibc-functions/get_myaddress.texi
new file mode 100644
index 00000000..c8455804
--- /dev/null
+++ b/gnulib/doc/glibc-functions/get_myaddress.texi
@@ -0,0 +1,16 @@
+@node get_myaddress
+@subsection @code{get_myaddress}
+@findex get_myaddress
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/get_nprocs.texi b/gnulib/doc/glibc-functions/get_nprocs.texi
new file mode 100644
index 00000000..4981b32e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/get_nprocs.texi
@@ -0,0 +1,16 @@
+@node get_nprocs
+@subsection @code{get_nprocs}
+@findex get_nprocs
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/get_nprocs_conf.texi b/gnulib/doc/glibc-functions/get_nprocs_conf.texi
new file mode 100644
index 00000000..351169cf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/get_nprocs_conf.texi
@@ -0,0 +1,16 @@
+@node get_nprocs_conf
+@subsection @code{get_nprocs_conf}
+@findex get_nprocs_conf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/get_phys_pages.texi b/gnulib/doc/glibc-functions/get_phys_pages.texi
new file mode 100644
index 00000000..8e490640
--- /dev/null
+++ b/gnulib/doc/glibc-functions/get_phys_pages.texi
@@ -0,0 +1,16 @@
+@node get_phys_pages
+@subsection @code{get_phys_pages}
+@findex get_phys_pages
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getaliasbyname.texi b/gnulib/doc/glibc-functions/getaliasbyname.texi
new file mode 100644
index 00000000..e0eb2dbe
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getaliasbyname.texi
@@ -0,0 +1,16 @@
+@node getaliasbyname
+@subsection @code{getaliasbyname}
+@findex getaliasbyname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getaliasbyname_r.texi b/gnulib/doc/glibc-functions/getaliasbyname_r.texi
new file mode 100644
index 00000000..4080a809
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getaliasbyname_r.texi
@@ -0,0 +1,16 @@
+@node getaliasbyname_r
+@subsection @code{getaliasbyname_r}
+@findex getaliasbyname_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getaliasent.texi b/gnulib/doc/glibc-functions/getaliasent.texi
new file mode 100644
index 00000000..0bd91290
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getaliasent.texi
@@ -0,0 +1,16 @@
+@node getaliasent
+@subsection @code{getaliasent}
+@findex getaliasent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getaliasent_r.texi b/gnulib/doc/glibc-functions/getaliasent_r.texi
new file mode 100644
index 00000000..83c57d33
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getaliasent_r.texi
@@ -0,0 +1,16 @@
+@node getaliasent_r
+@subsection @code{getaliasent_r}
+@findex getaliasent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getdate_r.texi b/gnulib/doc/glibc-functions/getdate_r.texi
new file mode 100644
index 00000000..5ca0d247
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getdate_r.texi
@@ -0,0 +1,16 @@
+@node getdate_r
+@subsection @code{getdate_r}
+@findex getdate_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getdirentries.texi b/gnulib/doc/glibc-functions/getdirentries.texi
new file mode 100644
index 00000000..5cf797dd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getdirentries.texi
@@ -0,0 +1,16 @@
+@node getdirentries
+@subsection @code{getdirentries}
+@findex getdirentries
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getdomainname.texi b/gnulib/doc/glibc-functions/getdomainname.texi
new file mode 100644
index 00000000..e4952298
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getdomainname.texi
@@ -0,0 +1,16 @@
+@node getdomainname
+@subsection @code{getdomainname}
+@findex getdomainname
+
+Gnulib module: getdomainname
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getdtablesize.texi b/gnulib/doc/glibc-functions/getdtablesize.texi
new file mode 100644
index 00000000..26776df6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getdtablesize.texi
@@ -0,0 +1,16 @@
+@node getdtablesize
+@subsection @code{getdtablesize}
+@findex getdtablesize
+
+Gnulib module: getdtablesize
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getfilecon-desc.texi b/gnulib/doc/glibc-functions/getfilecon-desc.texi
new file mode 100644
index 00000000..fb661a7f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getfilecon-desc.texi
@@ -0,0 +1,27 @@
+@macro getfileconDesc{fn}
+Gnulib module: selinux-h
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+On those platforms, this module provides a stub that always sets
+@code{errno} to @code{ENOTSUP} and returns @samp{-1}.
+@item
+On systems with SELinux support, this module provides a wrapper for the
+@code{\fn\} function that insulates the caller from API-nonconforming behavior.
+Without this wrapper, @code{\fn\} can return @samp{0} and set
+the @code{context} pointer to NULL, and in another scenario can return
+@samp{10} and set the @code{context} pointer to @samp{unlabeled}.
+This wrapper returns @samp{-1} in each case and sets @code{errno} to
+@code{ENOTSUP} and @code{ENODATA} respectively.
+While the conditions that can provoke such behavior are rare, the
+average caller does not handle them because the possibility of such
+behavior is not documented.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+@end macro
diff --git a/gnulib/doc/glibc-functions/getfilecon.texi b/gnulib/doc/glibc-functions/getfilecon.texi
new file mode 100644
index 00000000..d7afcb90
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getfilecon.texi
@@ -0,0 +1,5 @@
+@node getfilecon
+@subsection @code{getfilecon}
+@findex getfilecon
+
+@getfileconDesc{getfilecon}
diff --git a/gnulib/doc/glibc-functions/getfsent.texi b/gnulib/doc/glibc-functions/getfsent.texi
new file mode 100644
index 00000000..180fe3ef
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getfsent.texi
@@ -0,0 +1,16 @@
+@node getfsent
+@subsection @code{getfsent}
+@findex getfsent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getfsfile.texi b/gnulib/doc/glibc-functions/getfsfile.texi
new file mode 100644
index 00000000..eae908a7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getfsfile.texi
@@ -0,0 +1,16 @@
+@node getfsfile
+@subsection @code{getfsfile}
+@findex getfsfile
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getfsspec.texi b/gnulib/doc/glibc-functions/getfsspec.texi
new file mode 100644
index 00000000..3ff60f7c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getfsspec.texi
@@ -0,0 +1,16 @@
+@node getfsspec
+@subsection @code{getfsspec}
+@findex getfsspec
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getgrent_r.texi b/gnulib/doc/glibc-functions/getgrent_r.texi
new file mode 100644
index 00000000..9f3952f0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getgrent_r.texi
@@ -0,0 +1,16 @@
+@node getgrent_r
+@subsection @code{getgrent_r}
+@findex getgrent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getgrouplist.texi b/gnulib/doc/glibc-functions/getgrouplist.texi
new file mode 100644
index 00000000..057eb32c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getgrouplist.texi
@@ -0,0 +1,16 @@
+@node getgrouplist
+@subsection @code{getgrouplist}
+@findex getgrouplist
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gethostbyaddr_r.texi b/gnulib/doc/glibc-functions/gethostbyaddr_r.texi
new file mode 100644
index 00000000..7377b977
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gethostbyaddr_r.texi
@@ -0,0 +1,16 @@
+@node gethostbyaddr_r
+@subsection @code{gethostbyaddr_r}
+@findex gethostbyaddr_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gethostbyname2.texi b/gnulib/doc/glibc-functions/gethostbyname2.texi
new file mode 100644
index 00000000..281d962d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gethostbyname2.texi
@@ -0,0 +1,16 @@
+@node gethostbyname2
+@subsection @code{gethostbyname2}
+@findex gethostbyname2
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gethostbyname2_r.texi b/gnulib/doc/glibc-functions/gethostbyname2_r.texi
new file mode 100644
index 00000000..71317359
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gethostbyname2_r.texi
@@ -0,0 +1,16 @@
+@node gethostbyname2_r
+@subsection @code{gethostbyname2_r}
+@findex gethostbyname2_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gethostbyname_r.texi b/gnulib/doc/glibc-functions/gethostbyname_r.texi
new file mode 100644
index 00000000..c562afb2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gethostbyname_r.texi
@@ -0,0 +1,16 @@
+@node gethostbyname_r
+@subsection @code{gethostbyname_r}
+@findex gethostbyname_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gethostent_r.texi b/gnulib/doc/glibc-functions/gethostent_r.texi
new file mode 100644
index 00000000..b824066d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gethostent_r.texi
@@ -0,0 +1,16 @@
+@node gethostent_r
+@subsection @code{gethostent_r}
+@findex gethostent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getifaddrs.texi b/gnulib/doc/glibc-functions/getifaddrs.texi
new file mode 100644
index 00000000..1626f747
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getifaddrs.texi
@@ -0,0 +1,16 @@
+@node getifaddrs
+@subsection @code{getifaddrs}
+@findex getifaddrs
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getipv4sourcefilter.texi b/gnulib/doc/glibc-functions/getipv4sourcefilter.texi
new file mode 100644
index 00000000..b9f56fbc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getipv4sourcefilter.texi
@@ -0,0 +1,16 @@
+@node getipv4sourcefilter
+@subsection @code{getipv4sourcefilter}
+@findex getipv4sourcefilter
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getloadavg.texi b/gnulib/doc/glibc-functions/getloadavg.texi
new file mode 100644
index 00000000..67455c5a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getloadavg.texi
@@ -0,0 +1,16 @@
+@node getloadavg
+@subsection @code{getloadavg}
+@findex getloadavg
+
+Gnulib module: getloadavg
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getmntent.texi b/gnulib/doc/glibc-functions/getmntent.texi
new file mode 100644
index 00000000..0d215434
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getmntent.texi
@@ -0,0 +1,16 @@
+@node getmntent
+@subsection @code{getmntent}
+@findex getmntent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, OSF/1 5.1, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getmntent_r.texi b/gnulib/doc/glibc-functions/getmntent_r.texi
new file mode 100644
index 00000000..c5059872
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getmntent_r.texi
@@ -0,0 +1,16 @@
+@node getmntent_r
+@subsection @code{getmntent_r}
+@findex getmntent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getnetbyaddr_r.texi b/gnulib/doc/glibc-functions/getnetbyaddr_r.texi
new file mode 100644
index 00000000..e95de063
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getnetbyaddr_r.texi
@@ -0,0 +1,16 @@
+@node getnetbyaddr_r
+@subsection @code{getnetbyaddr_r}
+@findex getnetbyaddr_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getnetbyname_r.texi b/gnulib/doc/glibc-functions/getnetbyname_r.texi
new file mode 100644
index 00000000..6b594685
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getnetbyname_r.texi
@@ -0,0 +1,16 @@
+@node getnetbyname_r
+@subsection @code{getnetbyname_r}
+@findex getnetbyname_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getnetent_r.texi b/gnulib/doc/glibc-functions/getnetent_r.texi
new file mode 100644
index 00000000..7467664e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getnetent_r.texi
@@ -0,0 +1,16 @@
+@node getnetent_r
+@subsection @code{getnetent_r}
+@findex getnetent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getnetgrent.texi b/gnulib/doc/glibc-functions/getnetgrent.texi
new file mode 100644
index 00000000..689baa38
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getnetgrent.texi
@@ -0,0 +1,16 @@
+@node getnetgrent
+@subsection @code{getnetgrent}
+@findex getnetgrent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getnetgrent_r.texi b/gnulib/doc/glibc-functions/getnetgrent_r.texi
new file mode 100644
index 00000000..5cb8cb12
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getnetgrent_r.texi
@@ -0,0 +1,16 @@
+@node getnetgrent_r
+@subsection @code{getnetgrent_r}
+@findex getnetgrent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getnetname.texi b/gnulib/doc/glibc-functions/getnetname.texi
new file mode 100644
index 00000000..83587112
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getnetname.texi
@@ -0,0 +1,16 @@
+@node getnetname
+@subsection @code{getnetname}
+@findex getnetname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getopt_long.texi b/gnulib/doc/glibc-functions/getopt_long.texi
new file mode 100644
index 00000000..0472514b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getopt_long.texi
@@ -0,0 +1,39 @@
+@node getopt_long
+@subsection @code{getopt_long}
+@findex getopt_long
+
+Gnulib module: getopt-gnu
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The function @code{getopt_long} does not support the @samp{+} flag in
+the options string on some platforms:
+MacOS X 10.5, AIX 5.2, OSF/1 5.1, Solaris 10.
+@item
+The function @code{getopt_long} does not obey the @samp{-} flag in the
+options string when @env{POSIXLY_CORRECT} is set on some platforms:
+Cygwin 1.7.0.
+@item
+Some implementations fail to reset state, including re-checking
+@env{POSIXLY_CORRECT}, when @code{optind} is set to @samp{0}:
+NetBSD, Cygwin 1.7.0.
+@item
+The function @code{getopt_long} does not support options with optional
+arguments on some platforms:
+MacOS X 10.5, OpenBSD 4.0, AIX 5.2, IRIX 6.5, Solaris 10, Cygwin 1.5.x.
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The glibc extension of using @samp{W;} in the optstring argument to
+allow @code{-W foo} to behave synonymously with @code{--foo} is not
+very reliable, even in glibc.
+@item
+Mixing a leading @samp{-} or @samp{+} with a leading @samp{:} in the
+optstring argument has inconsistent effects across platforms.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getopt_long_only.texi b/gnulib/doc/glibc-functions/getopt_long_only.texi
new file mode 100644
index 00000000..13edfb42
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getopt_long_only.texi
@@ -0,0 +1,44 @@
+@node getopt_long_only
+@subsection @code{getopt_long_only}
+@findex getopt_long_only
+
+Gnulib module: getopt-gnu
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The function @code{getopt_long_only} does not support the @samp{+}
+flag in the options string on some platforms:
+MacOS X 10.5, AIX 5.2, OSF/1 5.1, Solaris 10.
+@item
+The function @code{getopt_long_only} does not obey the @samp{-} flag
+in the options string when @env{POSIXLY_CORRECT} is set on some platforms:
+Cygwin 1.7.0.
+@item
+Some implementations fail to reset state, including re-checking
+@env{POSIXLY_CORRECT}, when @code{optind} is set to @samp{0}:
+NetBSD, Cygwin 1.7.0.
+@item
+The function @code{getopt_long_only} does not support options with
+optional arguments on some platforms:
+MacOS X 10.5, OpenBSD 4.0, AIX 5.2, Solaris 10, Cygwin 1.5.x.
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5,
+OSF/1 5.1, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The glibc extension of using @samp{W;} in the optstring argument to
+allow @code{-W foo} to behave synonymously with @code{--foo} is not
+very reliable.
+@item
+Some implementations return success instead of reporting an ambiguity
+if user's option is a prefix of two long options with the same flag:
+FreeBSD.
+@item
+Mixing a leading @samp{-} or @samp{+} with a leading @samp{:} in the
+optstring argument has inconsistent effects across platforms.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getpagesize.texi b/gnulib/doc/glibc-functions/getpagesize.texi
new file mode 100644
index 00000000..2e8c9b67
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getpagesize.texi
@@ -0,0 +1,19 @@
+@node getpagesize
+@subsection @code{getpagesize}
+@findex getpagesize
+
+Gnulib module: getpagesize
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@item
+This function is broken on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getpass.texi b/gnulib/doc/glibc-functions/getpass.texi
new file mode 100644
index 00000000..50d7a2f6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getpass.texi
@@ -0,0 +1,24 @@
+@node getpass
+@subsection @code{getpass}
+@findex getpass
+
+Gnulib module: getpass or getpass-gnu
+
+Portability problems fixed by either Gnulib module @code{getpass} or @code{getpass-gnu}:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{getpass-gnu}:
+@itemize
+@item
+The returned password is truncated to PASS_MAX characters on some platforms:
+MacOS X 10.5 (128), FreeBSD 6.2 (128), NetBSD 3.0 (128), OpenBSD 4.0 (128), AIX 5.1 (32), HP-UX 11 (8), IRIX 6.5 (32), OSF/1 5.1 (80), Solaris 10 (8, even less than PASS_MAX), Cygwin (128).
+The gnulib implementation returns the password untruncated.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getprotobyname_r.texi b/gnulib/doc/glibc-functions/getprotobyname_r.texi
new file mode 100644
index 00000000..df370d77
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getprotobyname_r.texi
@@ -0,0 +1,16 @@
+@node getprotobyname_r
+@subsection @code{getprotobyname_r}
+@findex getprotobyname_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getprotobynumber_r.texi b/gnulib/doc/glibc-functions/getprotobynumber_r.texi
new file mode 100644
index 00000000..3649a88d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getprotobynumber_r.texi
@@ -0,0 +1,16 @@
+@node getprotobynumber_r
+@subsection @code{getprotobynumber_r}
+@findex getprotobynumber_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getprotoent_r.texi b/gnulib/doc/glibc-functions/getprotoent_r.texi
new file mode 100644
index 00000000..d44ad915
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getprotoent_r.texi
@@ -0,0 +1,16 @@
+@node getprotoent_r
+@subsection @code{getprotoent_r}
+@findex getprotoent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getpt.texi b/gnulib/doc/glibc-functions/getpt.texi
new file mode 100644
index 00000000..d68b2db8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getpt.texi
@@ -0,0 +1,16 @@
+@node getpt
+@subsection @code{getpt}
+@findex getpt
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getpublickey.texi b/gnulib/doc/glibc-functions/getpublickey.texi
new file mode 100644
index 00000000..35d6fe92
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getpublickey.texi
@@ -0,0 +1,16 @@
+@node getpublickey
+@subsection @code{getpublickey}
+@findex getpublickey
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getpw.texi b/gnulib/doc/glibc-functions/getpw.texi
new file mode 100644
index 00000000..9106a78e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getpw.texi
@@ -0,0 +1,16 @@
+@node getpw
+@subsection @code{getpw}
+@findex getpw
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getpwent_r.texi b/gnulib/doc/glibc-functions/getpwent_r.texi
new file mode 100644
index 00000000..12727a56
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getpwent_r.texi
@@ -0,0 +1,16 @@
+@node getpwent_r
+@subsection @code{getpwent_r}
+@findex getpwent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getresgid.texi b/gnulib/doc/glibc-functions/getresgid.texi
new file mode 100644
index 00000000..6a53d520
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getresgid.texi
@@ -0,0 +1,16 @@
+@node getresgid
+@subsection @code{getresgid}
+@findex getresgid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getresuid.texi b/gnulib/doc/glibc-functions/getresuid.texi
new file mode 100644
index 00000000..5fe2ca87
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getresuid.texi
@@ -0,0 +1,16 @@
+@node getresuid
+@subsection @code{getresuid}
+@findex getresuid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getrpcbyname.texi b/gnulib/doc/glibc-functions/getrpcbyname.texi
new file mode 100644
index 00000000..d1e4be1e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getrpcbyname.texi
@@ -0,0 +1,16 @@
+@node getrpcbyname
+@subsection @code{getrpcbyname}
+@findex getrpcbyname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getrpcbyname_r.texi b/gnulib/doc/glibc-functions/getrpcbyname_r.texi
new file mode 100644
index 00000000..c4895534
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getrpcbyname_r.texi
@@ -0,0 +1,16 @@
+@node getrpcbyname_r
+@subsection @code{getrpcbyname_r}
+@findex getrpcbyname_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getrpcbynumber.texi b/gnulib/doc/glibc-functions/getrpcbynumber.texi
new file mode 100644
index 00000000..04cfa71b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getrpcbynumber.texi
@@ -0,0 +1,16 @@
+@node getrpcbynumber
+@subsection @code{getrpcbynumber}
+@findex getrpcbynumber
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getrpcbynumber_r.texi b/gnulib/doc/glibc-functions/getrpcbynumber_r.texi
new file mode 100644
index 00000000..5844dfb0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getrpcbynumber_r.texi
@@ -0,0 +1,16 @@
+@node getrpcbynumber_r
+@subsection @code{getrpcbynumber_r}
+@findex getrpcbynumber_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getrpcent.texi b/gnulib/doc/glibc-functions/getrpcent.texi
new file mode 100644
index 00000000..277212ae
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getrpcent.texi
@@ -0,0 +1,16 @@
+@node getrpcent
+@subsection @code{getrpcent}
+@findex getrpcent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getrpcent_r.texi b/gnulib/doc/glibc-functions/getrpcent_r.texi
new file mode 100644
index 00000000..7abe3419
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getrpcent_r.texi
@@ -0,0 +1,16 @@
+@node getrpcent_r
+@subsection @code{getrpcent_r}
+@findex getrpcent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 5.3, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getrpcport.texi b/gnulib/doc/glibc-functions/getrpcport.texi
new file mode 100644
index 00000000..9f095b31
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getrpcport.texi
@@ -0,0 +1,16 @@
+@node getrpcport
+@subsection @code{getrpcport}
+@findex getrpcport
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getsecretkey.texi b/gnulib/doc/glibc-functions/getsecretkey.texi
new file mode 100644
index 00000000..bc6ac168
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getsecretkey.texi
@@ -0,0 +1,16 @@
+@node getsecretkey
+@subsection @code{getsecretkey}
+@findex getsecretkey
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getservbyname_r.texi b/gnulib/doc/glibc-functions/getservbyname_r.texi
new file mode 100644
index 00000000..9007f392
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getservbyname_r.texi
@@ -0,0 +1,16 @@
+@node getservbyname_r
+@subsection @code{getservbyname_r}
+@findex getservbyname_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getservbyport_r.texi b/gnulib/doc/glibc-functions/getservbyport_r.texi
new file mode 100644
index 00000000..d568b0d2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getservbyport_r.texi
@@ -0,0 +1,16 @@
+@node getservbyport_r
+@subsection @code{getservbyport_r}
+@findex getservbyport_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getservent_r.texi b/gnulib/doc/glibc-functions/getservent_r.texi
new file mode 100644
index 00000000..c78b8f63
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getservent_r.texi
@@ -0,0 +1,16 @@
+@node getservent_r
+@subsection @code{getservent_r}
+@findex getservent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getsourcefilter.texi b/gnulib/doc/glibc-functions/getsourcefilter.texi
new file mode 100644
index 00000000..74488a5a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getsourcefilter.texi
@@ -0,0 +1,16 @@
+@node getsourcefilter
+@subsection @code{getsourcefilter}
+@findex getsourcefilter
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getspent.texi b/gnulib/doc/glibc-functions/getspent.texi
new file mode 100644
index 00000000..b67d9d2f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getspent.texi
@@ -0,0 +1,16 @@
+@node getspent
+@subsection @code{getspent}
+@findex getspent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getspent_r.texi b/gnulib/doc/glibc-functions/getspent_r.texi
new file mode 100644
index 00000000..629cd308
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getspent_r.texi
@@ -0,0 +1,16 @@
+@node getspent_r
+@subsection @code{getspent_r}
+@findex getspent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 5.3, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getspnam.texi b/gnulib/doc/glibc-functions/getspnam.texi
new file mode 100644
index 00000000..b1a0a08c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getspnam.texi
@@ -0,0 +1,16 @@
+@node getspnam
+@subsection @code{getspnam}
+@findex getspnam
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getspnam_r.texi b/gnulib/doc/glibc-functions/getspnam_r.texi
new file mode 100644
index 00000000..874e6368
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getspnam_r.texi
@@ -0,0 +1,16 @@
+@node getspnam_r
+@subsection @code{getspnam_r}
+@findex getspnam_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 5.3, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gettext.texi b/gnulib/doc/glibc-functions/gettext.texi
new file mode 100644
index 00000000..4e300ae3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gettext.texi
@@ -0,0 +1,16 @@
+@node gettext
+@subsection @code{gettext}
+@findex gettext
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getttyent.texi b/gnulib/doc/glibc-functions/getttyent.texi
new file mode 100644
index 00000000..f53d3274
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getttyent.texi
@@ -0,0 +1,16 @@
+@node getttyent
+@subsection @code{getttyent}
+@findex getttyent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getttynam.texi b/gnulib/doc/glibc-functions/getttynam.texi
new file mode 100644
index 00000000..bc32f184
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getttynam.texi
@@ -0,0 +1,16 @@
+@node getttynam
+@subsection @code{getttynam}
+@findex getttynam
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getusershell.texi b/gnulib/doc/glibc-functions/getusershell.texi
new file mode 100644
index 00000000..45c652c1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getusershell.texi
@@ -0,0 +1,16 @@
+@node getusershell
+@subsection @code{getusershell}
+@findex getusershell
+
+Gnulib module: getusershell
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getutent.texi b/gnulib/doc/glibc-functions/getutent.texi
new file mode 100644
index 00000000..f463b5c6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getutent.texi
@@ -0,0 +1,16 @@
+@node getutent
+@subsection @code{getutent}
+@findex getutent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getutent_r.texi b/gnulib/doc/glibc-functions/getutent_r.texi
new file mode 100644
index 00000000..f954615d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getutent_r.texi
@@ -0,0 +1,16 @@
+@node getutent_r
+@subsection @code{getutent_r}
+@findex getutent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getutid.texi b/gnulib/doc/glibc-functions/getutid.texi
new file mode 100644
index 00000000..5f5a43f6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getutid.texi
@@ -0,0 +1,16 @@
+@node getutid
+@subsection @code{getutid}
+@findex getutid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getutid_r.texi b/gnulib/doc/glibc-functions/getutid_r.texi
new file mode 100644
index 00000000..a50c6c3c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getutid_r.texi
@@ -0,0 +1,16 @@
+@node getutid_r
+@subsection @code{getutid_r}
+@findex getutid_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getutline.texi b/gnulib/doc/glibc-functions/getutline.texi
new file mode 100644
index 00000000..ea30e622
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getutline.texi
@@ -0,0 +1,16 @@
+@node getutline
+@subsection @code{getutline}
+@findex getutline
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getutline_r.texi b/gnulib/doc/glibc-functions/getutline_r.texi
new file mode 100644
index 00000000..041830f5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getutline_r.texi
@@ -0,0 +1,16 @@
+@node getutline_r
+@subsection @code{getutline_r}
+@findex getutline_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getutmp.texi b/gnulib/doc/glibc-functions/getutmp.texi
new file mode 100644
index 00000000..2f99c5c9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getutmp.texi
@@ -0,0 +1,16 @@
+@node getutmp
+@subsection @code{getutmp}
+@findex getutmp
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getutmpx.texi b/gnulib/doc/glibc-functions/getutmpx.texi
new file mode 100644
index 00000000..dca1a4c9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getutmpx.texi
@@ -0,0 +1,16 @@
+@node getutmpx
+@subsection @code{getutmpx}
+@findex getutmpx
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getw.texi b/gnulib/doc/glibc-functions/getw.texi
new file mode 100644
index 00000000..32b932d4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getw.texi
@@ -0,0 +1,16 @@
+@node getw
+@subsection @code{getw}
+@findex getw
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getwc_unlocked.texi b/gnulib/doc/glibc-functions/getwc_unlocked.texi
new file mode 100644
index 00000000..9b879272
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getwc_unlocked.texi
@@ -0,0 +1,19 @@
+@node getwc_unlocked
+@subsection @code{getwc_unlocked}
+@findex getwc_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getwchar_unlocked.texi b/gnulib/doc/glibc-functions/getwchar_unlocked.texi
new file mode 100644
index 00000000..2d9dde23
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getwchar_unlocked.texi
@@ -0,0 +1,19 @@
+@node getwchar_unlocked
+@subsection @code{getwchar_unlocked}
+@findex getwchar_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/getxattr.texi b/gnulib/doc/glibc-functions/getxattr.texi
new file mode 100644
index 00000000..f9d12ab7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/getxattr.texi
@@ -0,0 +1,17 @@
+@node getxattr
+@subsection @code{getxattr}
+@findex getxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/glob_pattern_p.texi b/gnulib/doc/glibc-functions/glob_pattern_p.texi
new file mode 100644
index 00000000..c504361b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/glob_pattern_p.texi
@@ -0,0 +1,17 @@
+@node glob_pattern_p
+@subsection @code{glob_pattern_p}
+@findex glob_pattern_p
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on most non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gnu_dev_major.texi b/gnulib/doc/glibc-functions/gnu_dev_major.texi
new file mode 100644
index 00000000..0e72d50a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gnu_dev_major.texi
@@ -0,0 +1,16 @@
+@node gnu_dev_major
+@subsection @code{gnu_dev_major}
+@findex gnu_dev_major
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gnu_dev_makedev.texi b/gnulib/doc/glibc-functions/gnu_dev_makedev.texi
new file mode 100644
index 00000000..de659279
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gnu_dev_makedev.texi
@@ -0,0 +1,16 @@
+@node gnu_dev_makedev
+@subsection @code{gnu_dev_makedev}
+@findex gnu_dev_makedev
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gnu_dev_minor.texi b/gnulib/doc/glibc-functions/gnu_dev_minor.texi
new file mode 100644
index 00000000..0b79afb1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gnu_dev_minor.texi
@@ -0,0 +1,16 @@
+@node gnu_dev_minor
+@subsection @code{gnu_dev_minor}
+@findex gnu_dev_minor
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gnu_get_libc_release.texi b/gnulib/doc/glibc-functions/gnu_get_libc_release.texi
new file mode 100644
index 00000000..9a8da876
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gnu_get_libc_release.texi
@@ -0,0 +1,16 @@
+@node gnu_get_libc_release
+@subsection @code{gnu_get_libc_release}
+@findex gnu_get_libc_release
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gnu_get_libc_version.texi b/gnulib/doc/glibc-functions/gnu_get_libc_version.texi
new file mode 100644
index 00000000..93a003a1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gnu_get_libc_version.texi
@@ -0,0 +1,16 @@
+@node gnu_get_libc_version
+@subsection @code{gnu_get_libc_version}
+@findex gnu_get_libc_version
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/group_member.texi b/gnulib/doc/glibc-functions/group_member.texi
new file mode 100644
index 00000000..7596b5ca
--- /dev/null
+++ b/gnulib/doc/glibc-functions/group_member.texi
@@ -0,0 +1,16 @@
+@node group_member
+@subsection @code{group_member}
+@findex group_member
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/gsignal.texi b/gnulib/doc/glibc-functions/gsignal.texi
new file mode 100644
index 00000000..15bbc5b0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/gsignal.texi
@@ -0,0 +1,16 @@
+@node gsignal
+@subsection @code{gsignal}
+@findex gsignal
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/hasmntopt.texi b/gnulib/doc/glibc-functions/hasmntopt.texi
new file mode 100644
index 00000000..48e1c660
--- /dev/null
+++ b/gnulib/doc/glibc-functions/hasmntopt.texi
@@ -0,0 +1,16 @@
+@node hasmntopt
+@subsection @code{hasmntopt}
+@findex hasmntopt
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, OSF/1 5.1, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/hcreate_r.texi b/gnulib/doc/glibc-functions/hcreate_r.texi
new file mode 100644
index 00000000..677d7d1e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/hcreate_r.texi
@@ -0,0 +1,16 @@
+@node hcreate_r
+@subsection @code{hcreate_r}
+@findex hcreate_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/hdestroy_r.texi b/gnulib/doc/glibc-functions/hdestroy_r.texi
new file mode 100644
index 00000000..e6702110
--- /dev/null
+++ b/gnulib/doc/glibc-functions/hdestroy_r.texi
@@ -0,0 +1,16 @@
+@node hdestroy_r
+@subsection @code{hdestroy_r}
+@findex hdestroy_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/herror.texi b/gnulib/doc/glibc-functions/herror.texi
new file mode 100644
index 00000000..f24f6e49
--- /dev/null
+++ b/gnulib/doc/glibc-functions/herror.texi
@@ -0,0 +1,16 @@
+@node herror
+@subsection @code{herror}
+@findex herror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/host2netname.texi b/gnulib/doc/glibc-functions/host2netname.texi
new file mode 100644
index 00000000..c91ea40d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/host2netname.texi
@@ -0,0 +1,16 @@
+@node host2netname
+@subsection @code{host2netname}
+@findex host2netname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/hsearch_r.texi b/gnulib/doc/glibc-functions/hsearch_r.texi
new file mode 100644
index 00000000..d63b20e4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/hsearch_r.texi
@@ -0,0 +1,16 @@
+@node hsearch_r
+@subsection @code{hsearch_r}
+@findex hsearch_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/hstrerror.texi b/gnulib/doc/glibc-functions/hstrerror.texi
new file mode 100644
index 00000000..d4e7d3de
--- /dev/null
+++ b/gnulib/doc/glibc-functions/hstrerror.texi
@@ -0,0 +1,16 @@
+@node hstrerror
+@subsection @code{hstrerror}
+@findex hstrerror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/in6addr_any.texi b/gnulib/doc/glibc-functions/in6addr_any.texi
new file mode 100644
index 00000000..c452c2b3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/in6addr_any.texi
@@ -0,0 +1,16 @@
+@node in6addr_any
+@subsection @code{in6addr_any}
+@findex in6addr_any
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This constant is missing on some platforms:
+MacOS X 10.3, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/in6addr_loopback.texi b/gnulib/doc/glibc-functions/in6addr_loopback.texi
new file mode 100644
index 00000000..334d8483
--- /dev/null
+++ b/gnulib/doc/glibc-functions/in6addr_loopback.texi
@@ -0,0 +1,16 @@
+@node in6addr_loopback
+@subsection @code{in6addr_loopback}
+@findex in6addr_loopback
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This constant is missing on some platforms:
+MacOS X 10.3, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet6_option_alloc.texi b/gnulib/doc/glibc-functions/inet6_option_alloc.texi
new file mode 100644
index 00000000..e821c1d6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet6_option_alloc.texi
@@ -0,0 +1,16 @@
+@node inet6_option_alloc
+@subsection @code{inet6_option_alloc}
+@findex inet6_option_alloc
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet6_option_append.texi b/gnulib/doc/glibc-functions/inet6_option_append.texi
new file mode 100644
index 00000000..6b11c673
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet6_option_append.texi
@@ -0,0 +1,16 @@
+@node inet6_option_append
+@subsection @code{inet6_option_append}
+@findex inet6_option_append
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet6_option_find.texi b/gnulib/doc/glibc-functions/inet6_option_find.texi
new file mode 100644
index 00000000..92873b3d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet6_option_find.texi
@@ -0,0 +1,16 @@
+@node inet6_option_find
+@subsection @code{inet6_option_find}
+@findex inet6_option_find
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet6_option_init.texi b/gnulib/doc/glibc-functions/inet6_option_init.texi
new file mode 100644
index 00000000..dc674e49
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet6_option_init.texi
@@ -0,0 +1,16 @@
+@node inet6_option_init
+@subsection @code{inet6_option_init}
+@findex inet6_option_init
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet6_option_next.texi b/gnulib/doc/glibc-functions/inet6_option_next.texi
new file mode 100644
index 00000000..97504427
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet6_option_next.texi
@@ -0,0 +1,16 @@
+@node inet6_option_next
+@subsection @code{inet6_option_next}
+@findex inet6_option_next
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet6_option_space.texi b/gnulib/doc/glibc-functions/inet6_option_space.texi
new file mode 100644
index 00000000..1ed8ea9b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet6_option_space.texi
@@ -0,0 +1,16 @@
+@node inet6_option_space
+@subsection @code{inet6_option_space}
+@findex inet6_option_space
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_aton.texi b/gnulib/doc/glibc-functions/inet_aton.texi
new file mode 100644
index 00000000..3de3144a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_aton.texi
@@ -0,0 +1,16 @@
+@node inet_aton
+@subsection @code{inet_aton}
+@findex inet_aton
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_lnaof.texi b/gnulib/doc/glibc-functions/inet_lnaof.texi
new file mode 100644
index 00000000..9326bf44
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_lnaof.texi
@@ -0,0 +1,16 @@
+@node inet_lnaof
+@subsection @code{inet_lnaof}
+@findex inet_lnaof
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_makeaddr.texi b/gnulib/doc/glibc-functions/inet_makeaddr.texi
new file mode 100644
index 00000000..27e268b5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_makeaddr.texi
@@ -0,0 +1,16 @@
+@node inet_makeaddr
+@subsection @code{inet_makeaddr}
+@findex inet_makeaddr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_net_ntop.texi b/gnulib/doc/glibc-functions/inet_net_ntop.texi
new file mode 100644
index 00000000..8c4b89cb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_net_ntop.texi
@@ -0,0 +1,16 @@
+@node inet_net_ntop
+@subsection @code{inet_net_ntop}
+@findex inet_net_ntop
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_net_pton.texi b/gnulib/doc/glibc-functions/inet_net_pton.texi
new file mode 100644
index 00000000..79a4ff46
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_net_pton.texi
@@ -0,0 +1,16 @@
+@node inet_net_pton
+@subsection @code{inet_net_pton}
+@findex inet_net_pton
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_neta.texi b/gnulib/doc/glibc-functions/inet_neta.texi
new file mode 100644
index 00000000..7fb8aea0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_neta.texi
@@ -0,0 +1,16 @@
+@node inet_neta
+@subsection @code{inet_neta}
+@findex inet_neta
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_netof.texi b/gnulib/doc/glibc-functions/inet_netof.texi
new file mode 100644
index 00000000..10a2e7d6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_netof.texi
@@ -0,0 +1,16 @@
+@node inet_netof
+@subsection @code{inet_netof}
+@findex inet_netof
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_network.texi b/gnulib/doc/glibc-functions/inet_network.texi
new file mode 100644
index 00000000..cd7d7189
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_network.texi
@@ -0,0 +1,16 @@
+@node inet_network
+@subsection @code{inet_network}
+@findex inet_network
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_nsap_addr.texi b/gnulib/doc/glibc-functions/inet_nsap_addr.texi
new file mode 100644
index 00000000..f6bebaef
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_nsap_addr.texi
@@ -0,0 +1,16 @@
+@node inet_nsap_addr
+@subsection @code{inet_nsap_addr}
+@findex inet_nsap_addr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/inet_nsap_ntoa.texi b/gnulib/doc/glibc-functions/inet_nsap_ntoa.texi
new file mode 100644
index 00000000..3e8c6eb6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/inet_nsap_ntoa.texi
@@ -0,0 +1,16 @@
+@node inet_nsap_ntoa
+@subsection @code{inet_nsap_ntoa}
+@findex inet_nsap_ntoa
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/initgroups.texi b/gnulib/doc/glibc-functions/initgroups.texi
new file mode 100644
index 00000000..0bbed3cc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/initgroups.texi
@@ -0,0 +1,16 @@
+@node initgroups
+@subsection @code{initgroups}
+@findex initgroups
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/initstate_r.texi b/gnulib/doc/glibc-functions/initstate_r.texi
new file mode 100644
index 00000000..238d5dd0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/initstate_r.texi
@@ -0,0 +1,16 @@
+@node initstate_r
+@subsection @code{initstate_r}
+@findex initstate_r
+
+Gnulib module: random_r
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/innetgr.texi b/gnulib/doc/glibc-functions/innetgr.texi
new file mode 100644
index 00000000..a3fcfbd8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/innetgr.texi
@@ -0,0 +1,16 @@
+@node innetgr
+@subsection @code{innetgr}
+@findex innetgr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ioperm.texi b/gnulib/doc/glibc-functions/ioperm.texi
new file mode 100644
index 00000000..2631bc9d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ioperm.texi
@@ -0,0 +1,16 @@
+@node ioperm
+@subsection @code{ioperm}
+@findex ioperm
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/iopl.texi b/gnulib/doc/glibc-functions/iopl.texi
new file mode 100644
index 00000000..fabb4466
--- /dev/null
+++ b/gnulib/doc/glibc-functions/iopl.texi
@@ -0,0 +1,16 @@
+@node iopl
+@subsection @code{iopl}
+@findex iopl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/isctype.texi b/gnulib/doc/glibc-functions/isctype.texi
new file mode 100644
index 00000000..4c9b7031
--- /dev/null
+++ b/gnulib/doc/glibc-functions/isctype.texi
@@ -0,0 +1,16 @@
+@node isctype
+@subsection @code{isctype}
+@findex isctype
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/isfdtype.texi b/gnulib/doc/glibc-functions/isfdtype.texi
new file mode 100644
index 00000000..f1279bdb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/isfdtype.texi
@@ -0,0 +1,16 @@
+@node isfdtype
+@subsection @code{isfdtype}
+@findex isfdtype
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/isinff.texi b/gnulib/doc/glibc-functions/isinff.texi
new file mode 100644
index 00000000..3d43630b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/isinff.texi
@@ -0,0 +1,16 @@
+@node isinff
+@subsection @code{isinff}
+@findex isinff
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/isinfl.texi b/gnulib/doc/glibc-functions/isinfl.texi
new file mode 100644
index 00000000..1055f289
--- /dev/null
+++ b/gnulib/doc/glibc-functions/isinfl.texi
@@ -0,0 +1,16 @@
+@node isinfl
+@subsection @code{isinfl}
+@findex isinfl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/isnanf.texi b/gnulib/doc/glibc-functions/isnanf.texi
new file mode 100644
index 00000000..e679fa7d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/isnanf.texi
@@ -0,0 +1,16 @@
+@node isnanf
+@subsection @code{isnanf}
+@findex isnanf
+
+Gnulib module: isnanf
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/isnanl.texi b/gnulib/doc/glibc-functions/isnanl.texi
new file mode 100644
index 00000000..4cb7b3b2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/isnanl.texi
@@ -0,0 +1,16 @@
+@node isnanl
+@subsection @code{isnanl}
+@findex isnanl
+
+Gnulib module: isnanl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/j0f.texi b/gnulib/doc/glibc-functions/j0f.texi
new file mode 100644
index 00000000..f1dbb35a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/j0f.texi
@@ -0,0 +1,16 @@
+@node j0f
+@subsection @code{j0f}
+@findex j0f
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/j0l.texi b/gnulib/doc/glibc-functions/j0l.texi
new file mode 100644
index 00000000..00e4d5ef
--- /dev/null
+++ b/gnulib/doc/glibc-functions/j0l.texi
@@ -0,0 +1,16 @@
+@node j0l
+@subsection @code{j0l}
+@findex j0l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/j1f.texi b/gnulib/doc/glibc-functions/j1f.texi
new file mode 100644
index 00000000..da67d7a9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/j1f.texi
@@ -0,0 +1,16 @@
+@node j1f
+@subsection @code{j1f}
+@findex j1f
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/j1l.texi b/gnulib/doc/glibc-functions/j1l.texi
new file mode 100644
index 00000000..bf39659e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/j1l.texi
@@ -0,0 +1,16 @@
+@node j1l
+@subsection @code{j1l}
+@findex j1l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/jnf.texi b/gnulib/doc/glibc-functions/jnf.texi
new file mode 100644
index 00000000..8a607f5a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/jnf.texi
@@ -0,0 +1,16 @@
+@node jnf
+@subsection @code{jnf}
+@findex jnf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/jnl.texi b/gnulib/doc/glibc-functions/jnl.texi
new file mode 100644
index 00000000..c424944f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/jnl.texi
@@ -0,0 +1,16 @@
+@node jnl
+@subsection @code{jnl}
+@findex jnl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/jrand48_r.texi b/gnulib/doc/glibc-functions/jrand48_r.texi
new file mode 100644
index 00000000..76111c9e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/jrand48_r.texi
@@ -0,0 +1,16 @@
+@node jrand48_r
+@subsection @code{jrand48_r}
+@findex jrand48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/key_decryptsession.texi b/gnulib/doc/glibc-functions/key_decryptsession.texi
new file mode 100644
index 00000000..e8679fcf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/key_decryptsession.texi
@@ -0,0 +1,16 @@
+@node key_decryptsession
+@subsection @code{key_decryptsession}
+@findex key_decryptsession
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/key_decryptsession_pk.texi b/gnulib/doc/glibc-functions/key_decryptsession_pk.texi
new file mode 100644
index 00000000..fcb0f85b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/key_decryptsession_pk.texi
@@ -0,0 +1,16 @@
+@node key_decryptsession_pk
+@subsection @code{key_decryptsession_pk}
+@findex key_decryptsession_pk
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/key_encryptsession.texi b/gnulib/doc/glibc-functions/key_encryptsession.texi
new file mode 100644
index 00000000..f733c51f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/key_encryptsession.texi
@@ -0,0 +1,16 @@
+@node key_encryptsession
+@subsection @code{key_encryptsession}
+@findex key_encryptsession
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/key_encryptsession_pk.texi b/gnulib/doc/glibc-functions/key_encryptsession_pk.texi
new file mode 100644
index 00000000..5641871a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/key_encryptsession_pk.texi
@@ -0,0 +1,16 @@
+@node key_encryptsession_pk
+@subsection @code{key_encryptsession_pk}
+@findex key_encryptsession_pk
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/key_gendes.texi b/gnulib/doc/glibc-functions/key_gendes.texi
new file mode 100644
index 00000000..847597e8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/key_gendes.texi
@@ -0,0 +1,16 @@
+@node key_gendes
+@subsection @code{key_gendes}
+@findex key_gendes
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/key_get_conv.texi b/gnulib/doc/glibc-functions/key_get_conv.texi
new file mode 100644
index 00000000..36a33e7c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/key_get_conv.texi
@@ -0,0 +1,16 @@
+@node key_get_conv
+@subsection @code{key_get_conv}
+@findex key_get_conv
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/key_secretkey_is_set.texi b/gnulib/doc/glibc-functions/key_secretkey_is_set.texi
new file mode 100644
index 00000000..a3290584
--- /dev/null
+++ b/gnulib/doc/glibc-functions/key_secretkey_is_set.texi
@@ -0,0 +1,16 @@
+@node key_secretkey_is_set
+@subsection @code{key_secretkey_is_set}
+@findex key_secretkey_is_set
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/key_setsecret.texi b/gnulib/doc/glibc-functions/key_setsecret.texi
new file mode 100644
index 00000000..da4c87e1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/key_setsecret.texi
@@ -0,0 +1,16 @@
+@node key_setsecret
+@subsection @code{key_setsecret}
+@findex key_setsecret
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/klogctl.texi b/gnulib/doc/glibc-functions/klogctl.texi
new file mode 100644
index 00000000..f345f289
--- /dev/null
+++ b/gnulib/doc/glibc-functions/klogctl.texi
@@ -0,0 +1,16 @@
+@node klogctl
+@subsection @code{klogctl}
+@findex klogctl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lchmod.texi b/gnulib/doc/glibc-functions/lchmod.texi
new file mode 100644
index 00000000..abced718
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lchmod.texi
@@ -0,0 +1,16 @@
+@node lchmod
+@subsection @code{lchmod}
+@findex lchmod
+
+Gnulib module: lchmod
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lckpwdf.texi b/gnulib/doc/glibc-functions/lckpwdf.texi
new file mode 100644
index 00000000..bc27bae2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lckpwdf.texi
@@ -0,0 +1,16 @@
+@node lckpwdf
+@subsection @code{lckpwdf}
+@findex lckpwdf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lcong48_r.texi b/gnulib/doc/glibc-functions/lcong48_r.texi
new file mode 100644
index 00000000..dd6e0e9b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lcong48_r.texi
@@ -0,0 +1,16 @@
+@node lcong48_r
+@subsection @code{lcong48_r}
+@findex lcong48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lgamma_r.texi b/gnulib/doc/glibc-functions/lgamma_r.texi
new file mode 100644
index 00000000..293df2bd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lgamma_r.texi
@@ -0,0 +1,16 @@
+@node lgamma_r
+@subsection @code{lgamma_r}
+@findex lgamma_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, OSF/1 5.1, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lgammaf_r.texi b/gnulib/doc/glibc-functions/lgammaf_r.texi
new file mode 100644
index 00000000..8285c182
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lgammaf_r.texi
@@ -0,0 +1,16 @@
+@node lgammaf_r
+@subsection @code{lgammaf_r}
+@findex lgammaf_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lgammal_r.texi b/gnulib/doc/glibc-functions/lgammal_r.texi
new file mode 100644
index 00000000..a26413d2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lgammal_r.texi
@@ -0,0 +1,16 @@
+@node lgammal_r
+@subsection @code{lgammal_r}
+@findex lgammal_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lgetfilecon.texi b/gnulib/doc/glibc-functions/lgetfilecon.texi
new file mode 100644
index 00000000..7de1bb28
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lgetfilecon.texi
@@ -0,0 +1,5 @@
+@node lgetfilecon
+@subsection @code{lgetfilecon}
+@findex lgetfilecon
+
+@getfileconDesc{lgetfilecon}
diff --git a/gnulib/doc/glibc-functions/lgetxattr.texi b/gnulib/doc/glibc-functions/lgetxattr.texi
new file mode 100644
index 00000000..4159ede6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lgetxattr.texi
@@ -0,0 +1,17 @@
+@node lgetxattr
+@subsection @code{lgetxattr}
+@findex lgetxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/listxattr.texi b/gnulib/doc/glibc-functions/listxattr.texi
new file mode 100644
index 00000000..0c4f2037
--- /dev/null
+++ b/gnulib/doc/glibc-functions/listxattr.texi
@@ -0,0 +1,17 @@
+@node listxattr
+@subsection @code{listxattr}
+@findex listxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/llistxattr.texi b/gnulib/doc/glibc-functions/llistxattr.texi
new file mode 100644
index 00000000..326eefa2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/llistxattr.texi
@@ -0,0 +1,17 @@
+@node llistxattr
+@subsection @code{llistxattr}
+@findex llistxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/loc1.texi b/gnulib/doc/glibc-functions/loc1.texi
new file mode 100644
index 00000000..159d87f6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/loc1.texi
@@ -0,0 +1,16 @@
+@node loc1
+@subsection @code{loc1}
+@findex loc1
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/loc2.texi b/gnulib/doc/glibc-functions/loc2.texi
new file mode 100644
index 00000000..9deeda2d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/loc2.texi
@@ -0,0 +1,16 @@
+@node loc2
+@subsection @code{loc2}
+@findex loc2
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/locs.texi b/gnulib/doc/glibc-functions/locs.texi
new file mode 100644
index 00000000..4eff4679
--- /dev/null
+++ b/gnulib/doc/glibc-functions/locs.texi
@@ -0,0 +1,16 @@
+@node locs
+@subsection @code{locs}
+@findex locs
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lrand48_r.texi b/gnulib/doc/glibc-functions/lrand48_r.texi
new file mode 100644
index 00000000..eaccfd8e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lrand48_r.texi
@@ -0,0 +1,16 @@
+@node lrand48_r
+@subsection @code{lrand48_r}
+@findex lrand48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lremovexattr.texi b/gnulib/doc/glibc-functions/lremovexattr.texi
new file mode 100644
index 00000000..7d894885
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lremovexattr.texi
@@ -0,0 +1,17 @@
+@node lremovexattr
+@subsection @code{lremovexattr}
+@findex lremovexattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lsetxattr.texi b/gnulib/doc/glibc-functions/lsetxattr.texi
new file mode 100644
index 00000000..b747ccff
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lsetxattr.texi
@@ -0,0 +1,17 @@
+@node lsetxattr
+@subsection @code{lsetxattr}
+@findex lsetxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/lutimes.texi b/gnulib/doc/glibc-functions/lutimes.texi
new file mode 100644
index 00000000..2371c512
--- /dev/null
+++ b/gnulib/doc/glibc-functions/lutimes.texi
@@ -0,0 +1,26 @@
+@node lutimes
+@subsection @code{lutimes}
+@findex lutimes
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 10, mingw, Interix 3.5, BeOS.
+@item
+This function cannot set full timestamp resolution. Use
+@code{utimensat(AT_FDCWD,file,times,AT_SYMLINK_NOFOLLOW)}, or the
+gnulib module utimens, instead.
+@item
+The mere act of using @code{lstat} modifies the access time of
+symlinks on some platforms, so @code{lutimes} can only effectively
+change modification time:
+Cygwin.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/madvise.texi b/gnulib/doc/glibc-functions/madvise.texi
new file mode 100644
index 00000000..b57f780f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/madvise.texi
@@ -0,0 +1,16 @@
+@node madvise
+@subsection @code{madvise}
+@findex madvise
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mallinfo.texi b/gnulib/doc/glibc-functions/mallinfo.texi
new file mode 100644
index 00000000..3fc86bda
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mallinfo.texi
@@ -0,0 +1,16 @@
+@node mallinfo
+@subsection @code{mallinfo}
+@findex mallinfo
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/malloc_get_state.texi b/gnulib/doc/glibc-functions/malloc_get_state.texi
new file mode 100644
index 00000000..dc9379ad
--- /dev/null
+++ b/gnulib/doc/glibc-functions/malloc_get_state.texi
@@ -0,0 +1,16 @@
+@node malloc_get_state
+@subsection @code{malloc_get_state}
+@findex malloc_get_state
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/malloc_set_state.texi b/gnulib/doc/glibc-functions/malloc_set_state.texi
new file mode 100644
index 00000000..4b460eef
--- /dev/null
+++ b/gnulib/doc/glibc-functions/malloc_set_state.texi
@@ -0,0 +1,16 @@
+@node malloc_set_state
+@subsection @code{malloc_set_state}
+@findex malloc_set_state
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/malloc_stats.texi b/gnulib/doc/glibc-functions/malloc_stats.texi
new file mode 100644
index 00000000..c2e71953
--- /dev/null
+++ b/gnulib/doc/glibc-functions/malloc_stats.texi
@@ -0,0 +1,16 @@
+@node malloc_stats
+@subsection @code{malloc_stats}
+@findex malloc_stats
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/malloc_trim.texi b/gnulib/doc/glibc-functions/malloc_trim.texi
new file mode 100644
index 00000000..03f24a3f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/malloc_trim.texi
@@ -0,0 +1,16 @@
+@node malloc_trim
+@subsection @code{malloc_trim}
+@findex malloc_trim
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/malloc_usable_size.texi b/gnulib/doc/glibc-functions/malloc_usable_size.texi
new file mode 100644
index 00000000..5127ff1d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/malloc_usable_size.texi
@@ -0,0 +1,16 @@
+@node malloc_usable_size
+@subsection @code{malloc_usable_size}
+@findex malloc_usable_size
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mallopt.texi b/gnulib/doc/glibc-functions/mallopt.texi
new file mode 100644
index 00000000..06818511
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mallopt.texi
@@ -0,0 +1,16 @@
+@node mallopt
+@subsection @code{mallopt}
+@findex mallopt
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/matherr.texi b/gnulib/doc/glibc-functions/matherr.texi
new file mode 100644
index 00000000..cece204b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/matherr.texi
@@ -0,0 +1,16 @@
+@node matherr
+@subsection @code{matherr}
+@findex matherr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, AIX 5.1, HP-UX 11, OSF/1 5.1, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mcheck.texi b/gnulib/doc/glibc-functions/mcheck.texi
new file mode 100644
index 00000000..51550eaf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mcheck.texi
@@ -0,0 +1,16 @@
+@node mcheck
+@subsection @code{mcheck}
+@findex mcheck
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mcheck_check_all.texi b/gnulib/doc/glibc-functions/mcheck_check_all.texi
new file mode 100644
index 00000000..caf5ae8c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mcheck_check_all.texi
@@ -0,0 +1,16 @@
+@node mcheck_check_all
+@subsection @code{mcheck_check_all}
+@findex mcheck_check_all
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mcheck_pedantic.texi b/gnulib/doc/glibc-functions/mcheck_pedantic.texi
new file mode 100644
index 00000000..4800159b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mcheck_pedantic.texi
@@ -0,0 +1,16 @@
+@node mcheck_pedantic
+@subsection @code{mcheck_pedantic}
+@findex mcheck_pedantic
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/memalign.texi b/gnulib/doc/glibc-functions/memalign.texi
new file mode 100644
index 00000000..bf4f361b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/memalign.texi
@@ -0,0 +1,16 @@
+@node memalign
+@subsection @code{memalign}
+@findex memalign
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/memfrob.texi b/gnulib/doc/glibc-functions/memfrob.texi
new file mode 100644
index 00000000..1b60cc8a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/memfrob.texi
@@ -0,0 +1,16 @@
+@node memfrob
+@subsection @code{memfrob}
+@findex memfrob
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/memmem.texi b/gnulib/doc/glibc-functions/memmem.texi
new file mode 100644
index 00000000..c7e3d739
--- /dev/null
+++ b/gnulib/doc/glibc-functions/memmem.texi
@@ -0,0 +1,32 @@
+@node memmem
+@subsection @code{memmem}
+@findex memmem
+
+Gnulib module: memmem or memmem-simple
+
+Portability problems fixed by either Gnulib module @code{memmem-simple}
+or @code{memmem}:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 4.0, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@item
+This function has reversed arguments on some older platforms:
+Linux libc 5.0.9
+@end itemize
+
+Portability problems fixed by Gnulib module @code{memmem}:
+@itemize
+@item
+This function returns incorrect values in some cases, such as when
+given an empty needle:
+glibc <= 2.0, Cygwin 1.5.x.
+@item
+This function has quadratic instead of linear worst-case complexity on some
+platforms:
+glibc 2.8, FreeBSD 6.2, NetBSD 3.0, AIX 5.1, Cygwin 1.5.x.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mempcpy.texi b/gnulib/doc/glibc-functions/mempcpy.texi
new file mode 100644
index 00000000..ebfc31d5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mempcpy.texi
@@ -0,0 +1,16 @@
+@node mempcpy
+@subsection @code{mempcpy}
+@findex mempcpy
+
+Gnulib module: mempcpy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/memrchr.texi b/gnulib/doc/glibc-functions/memrchr.texi
new file mode 100644
index 00000000..703d00c3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/memrchr.texi
@@ -0,0 +1,16 @@
+@node memrchr
+@subsection @code{memrchr}
+@findex memrchr
+
+Gnulib module: memrchr
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mincore.texi b/gnulib/doc/glibc-functions/mincore.texi
new file mode 100644
index 00000000..1efd8195
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mincore.texi
@@ -0,0 +1,16 @@
+@node mincore
+@subsection @code{mincore}
+@findex mincore
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mkostemp.texi b/gnulib/doc/glibc-functions/mkostemp.texi
new file mode 100644
index 00000000..6acede75
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mkostemp.texi
@@ -0,0 +1,16 @@
+@node mkostemp
+@subsection @code{mkostemp}
+@findex mkostemp
+
+Gnulib module: mkostemp
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mkostemps.texi b/gnulib/doc/glibc-functions/mkostemps.texi
new file mode 100644
index 00000000..eacb7f35
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mkostemps.texi
@@ -0,0 +1,16 @@
+@node mkostemps
+@subsection @code{mkostemps}
+@findex mkostemps
+
+Gnulib module: mkostemps
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+glibc 2.10, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mkstemps.texi b/gnulib/doc/glibc-functions/mkstemps.texi
new file mode 100644
index 00000000..a321a498
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mkstemps.texi
@@ -0,0 +1,17 @@
+@node mkstemps
+@subsection @code{mkstemps}
+@findex mkstemps
+
+Gnulib module: mkstemps
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+glibc 2.10, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin
+1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/monstartup.texi b/gnulib/doc/glibc-functions/monstartup.texi
new file mode 100644
index 00000000..4b395aa5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/monstartup.texi
@@ -0,0 +1,16 @@
+@node monstartup
+@subsection @code{monstartup}
+@findex monstartup
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mount.texi b/gnulib/doc/glibc-functions/mount.texi
new file mode 100644
index 00000000..f1fbd5fb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mount.texi
@@ -0,0 +1,16 @@
+@node mount
+@subsection @code{mount}
+@findex mount
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mprobe.texi b/gnulib/doc/glibc-functions/mprobe.texi
new file mode 100644
index 00000000..df348d27
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mprobe.texi
@@ -0,0 +1,16 @@
+@node mprobe
+@subsection @code{mprobe}
+@findex mprobe
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mrand48_r.texi b/gnulib/doc/glibc-functions/mrand48_r.texi
new file mode 100644
index 00000000..33e23f51
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mrand48_r.texi
@@ -0,0 +1,16 @@
+@node mrand48_r
+@subsection @code{mrand48_r}
+@findex mrand48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mremap.texi b/gnulib/doc/glibc-functions/mremap.texi
new file mode 100644
index 00000000..3a0dca00
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mremap.texi
@@ -0,0 +1,16 @@
+@node mremap
+@subsection @code{mremap}
+@findex mremap
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/mtrace.texi b/gnulib/doc/glibc-functions/mtrace.texi
new file mode 100644
index 00000000..fb91af49
--- /dev/null
+++ b/gnulib/doc/glibc-functions/mtrace.texi
@@ -0,0 +1,16 @@
+@node mtrace
+@subsection @code{mtrace}
+@findex mtrace
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/muntrace.texi b/gnulib/doc/glibc-functions/muntrace.texi
new file mode 100644
index 00000000..3cd9d57e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/muntrace.texi
@@ -0,0 +1,16 @@
+@node muntrace
+@subsection @code{muntrace}
+@findex muntrace
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/netname2host.texi b/gnulib/doc/glibc-functions/netname2host.texi
new file mode 100644
index 00000000..c550c712
--- /dev/null
+++ b/gnulib/doc/glibc-functions/netname2host.texi
@@ -0,0 +1,16 @@
+@node netname2host
+@subsection @code{netname2host}
+@findex netname2host
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/netname2user.texi b/gnulib/doc/glibc-functions/netname2user.texi
new file mode 100644
index 00000000..4ca2221b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/netname2user.texi
@@ -0,0 +1,16 @@
+@node netname2user
+@subsection @code{netname2user}
+@findex netname2user
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ngettext.texi b/gnulib/doc/glibc-functions/ngettext.texi
new file mode 100644
index 00000000..5069c804
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ngettext.texi
@@ -0,0 +1,16 @@
+@node ngettext
+@subsection @code{ngettext}
+@findex ngettext
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_add.texi b/gnulib/doc/glibc-functions/nis_add.texi
new file mode 100644
index 00000000..dfe2c201
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_add.texi
@@ -0,0 +1,16 @@
+@node nis_add
+@subsection @code{nis_add}
+@findex nis_add
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_add_entry.texi b/gnulib/doc/glibc-functions/nis_add_entry.texi
new file mode 100644
index 00000000..3d97854a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_add_entry.texi
@@ -0,0 +1,16 @@
+@node nis_add_entry
+@subsection @code{nis_add_entry}
+@findex nis_add_entry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_addmember.texi b/gnulib/doc/glibc-functions/nis_addmember.texi
new file mode 100644
index 00000000..e481aa1e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_addmember.texi
@@ -0,0 +1,16 @@
+@node nis_addmember
+@subsection @code{nis_addmember}
+@findex nis_addmember
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_checkpoint.texi b/gnulib/doc/glibc-functions/nis_checkpoint.texi
new file mode 100644
index 00000000..81eebd07
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_checkpoint.texi
@@ -0,0 +1,16 @@
+@node nis_checkpoint
+@subsection @code{nis_checkpoint}
+@findex nis_checkpoint
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_clone_object.texi b/gnulib/doc/glibc-functions/nis_clone_object.texi
new file mode 100644
index 00000000..c4a8e913
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_clone_object.texi
@@ -0,0 +1,16 @@
+@node nis_clone_object
+@subsection @code{nis_clone_object}
+@findex nis_clone_object
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_creategroup.texi b/gnulib/doc/glibc-functions/nis_creategroup.texi
new file mode 100644
index 00000000..38e7d597
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_creategroup.texi
@@ -0,0 +1,16 @@
+@node nis_creategroup
+@subsection @code{nis_creategroup}
+@findex nis_creategroup
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_destroy_object.texi b/gnulib/doc/glibc-functions/nis_destroy_object.texi
new file mode 100644
index 00000000..f07625a2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_destroy_object.texi
@@ -0,0 +1,16 @@
+@node nis_destroy_object
+@subsection @code{nis_destroy_object}
+@findex nis_destroy_object
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_destroygroup.texi b/gnulib/doc/glibc-functions/nis_destroygroup.texi
new file mode 100644
index 00000000..ca3f33d4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_destroygroup.texi
@@ -0,0 +1,16 @@
+@node nis_destroygroup
+@subsection @code{nis_destroygroup}
+@findex nis_destroygroup
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_dir_cmp.texi b/gnulib/doc/glibc-functions/nis_dir_cmp.texi
new file mode 100644
index 00000000..5b28a353
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_dir_cmp.texi
@@ -0,0 +1,16 @@
+@node nis_dir_cmp
+@subsection @code{nis_dir_cmp}
+@findex nis_dir_cmp
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_domain_of.texi b/gnulib/doc/glibc-functions/nis_domain_of.texi
new file mode 100644
index 00000000..56e8e75c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_domain_of.texi
@@ -0,0 +1,16 @@
+@node nis_domain_of
+@subsection @code{nis_domain_of}
+@findex nis_domain_of
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_domain_of_r.texi b/gnulib/doc/glibc-functions/nis_domain_of_r.texi
new file mode 100644
index 00000000..650805e8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_domain_of_r.texi
@@ -0,0 +1,16 @@
+@node nis_domain_of_r
+@subsection @code{nis_domain_of_r}
+@findex nis_domain_of_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_first_entry.texi b/gnulib/doc/glibc-functions/nis_first_entry.texi
new file mode 100644
index 00000000..b0a10874
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_first_entry.texi
@@ -0,0 +1,16 @@
+@node nis_first_entry
+@subsection @code{nis_first_entry}
+@findex nis_first_entry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_freenames.texi b/gnulib/doc/glibc-functions/nis_freenames.texi
new file mode 100644
index 00000000..fbf8ad96
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_freenames.texi
@@ -0,0 +1,16 @@
+@node nis_freenames
+@subsection @code{nis_freenames}
+@findex nis_freenames
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_freeresult.texi b/gnulib/doc/glibc-functions/nis_freeresult.texi
new file mode 100644
index 00000000..692f5c4d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_freeresult.texi
@@ -0,0 +1,16 @@
+@node nis_freeresult
+@subsection @code{nis_freeresult}
+@findex nis_freeresult
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_freeservlist.texi b/gnulib/doc/glibc-functions/nis_freeservlist.texi
new file mode 100644
index 00000000..ed7f7884
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_freeservlist.texi
@@ -0,0 +1,16 @@
+@node nis_freeservlist
+@subsection @code{nis_freeservlist}
+@findex nis_freeservlist
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_freetags.texi b/gnulib/doc/glibc-functions/nis_freetags.texi
new file mode 100644
index 00000000..b23ebd74
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_freetags.texi
@@ -0,0 +1,16 @@
+@node nis_freetags
+@subsection @code{nis_freetags}
+@findex nis_freetags
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_getnames.texi b/gnulib/doc/glibc-functions/nis_getnames.texi
new file mode 100644
index 00000000..6e2e4caf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_getnames.texi
@@ -0,0 +1,16 @@
+@node nis_getnames
+@subsection @code{nis_getnames}
+@findex nis_getnames
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_getservlist.texi b/gnulib/doc/glibc-functions/nis_getservlist.texi
new file mode 100644
index 00000000..691d0836
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_getservlist.texi
@@ -0,0 +1,16 @@
+@node nis_getservlist
+@subsection @code{nis_getservlist}
+@findex nis_getservlist
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_ismember.texi b/gnulib/doc/glibc-functions/nis_ismember.texi
new file mode 100644
index 00000000..32785d17
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_ismember.texi
@@ -0,0 +1,16 @@
+@node nis_ismember
+@subsection @code{nis_ismember}
+@findex nis_ismember
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_leaf_of.texi b/gnulib/doc/glibc-functions/nis_leaf_of.texi
new file mode 100644
index 00000000..92b1a9d4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_leaf_of.texi
@@ -0,0 +1,16 @@
+@node nis_leaf_of
+@subsection @code{nis_leaf_of}
+@findex nis_leaf_of
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_leaf_of_r.texi b/gnulib/doc/glibc-functions/nis_leaf_of_r.texi
new file mode 100644
index 00000000..bb76169a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_leaf_of_r.texi
@@ -0,0 +1,16 @@
+@node nis_leaf_of_r
+@subsection @code{nis_leaf_of_r}
+@findex nis_leaf_of_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_lerror.texi b/gnulib/doc/glibc-functions/nis_lerror.texi
new file mode 100644
index 00000000..14050227
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_lerror.texi
@@ -0,0 +1,16 @@
+@node nis_lerror
+@subsection @code{nis_lerror}
+@findex nis_lerror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_list.texi b/gnulib/doc/glibc-functions/nis_list.texi
new file mode 100644
index 00000000..c6499c20
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_list.texi
@@ -0,0 +1,16 @@
+@node nis_list
+@subsection @code{nis_list}
+@findex nis_list
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_local_directory.texi b/gnulib/doc/glibc-functions/nis_local_directory.texi
new file mode 100644
index 00000000..87d12160
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_local_directory.texi
@@ -0,0 +1,16 @@
+@node nis_local_directory
+@subsection @code{nis_local_directory}
+@findex nis_local_directory
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_local_group.texi b/gnulib/doc/glibc-functions/nis_local_group.texi
new file mode 100644
index 00000000..e23c3fbc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_local_group.texi
@@ -0,0 +1,16 @@
+@node nis_local_group
+@subsection @code{nis_local_group}
+@findex nis_local_group
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_local_host.texi b/gnulib/doc/glibc-functions/nis_local_host.texi
new file mode 100644
index 00000000..bda469ad
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_local_host.texi
@@ -0,0 +1,16 @@
+@node nis_local_host
+@subsection @code{nis_local_host}
+@findex nis_local_host
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_local_principal.texi b/gnulib/doc/glibc-functions/nis_local_principal.texi
new file mode 100644
index 00000000..7b2817ee
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_local_principal.texi
@@ -0,0 +1,16 @@
+@node nis_local_principal
+@subsection @code{nis_local_principal}
+@findex nis_local_principal
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_lookup.texi b/gnulib/doc/glibc-functions/nis_lookup.texi
new file mode 100644
index 00000000..8bad8db5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_lookup.texi
@@ -0,0 +1,16 @@
+@node nis_lookup
+@subsection @code{nis_lookup}
+@findex nis_lookup
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_mkdir.texi b/gnulib/doc/glibc-functions/nis_mkdir.texi
new file mode 100644
index 00000000..1c02b7d8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_mkdir.texi
@@ -0,0 +1,16 @@
+@node nis_mkdir
+@subsection @code{nis_mkdir}
+@findex nis_mkdir
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_modify.texi b/gnulib/doc/glibc-functions/nis_modify.texi
new file mode 100644
index 00000000..d6dcd0b7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_modify.texi
@@ -0,0 +1,16 @@
+@node nis_modify
+@subsection @code{nis_modify}
+@findex nis_modify
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_modify_entry.texi b/gnulib/doc/glibc-functions/nis_modify_entry.texi
new file mode 100644
index 00000000..fa2ecd4f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_modify_entry.texi
@@ -0,0 +1,16 @@
+@node nis_modify_entry
+@subsection @code{nis_modify_entry}
+@findex nis_modify_entry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_name_of.texi b/gnulib/doc/glibc-functions/nis_name_of.texi
new file mode 100644
index 00000000..b042a5f3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_name_of.texi
@@ -0,0 +1,16 @@
+@node nis_name_of
+@subsection @code{nis_name_of}
+@findex nis_name_of
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_name_of_r.texi b/gnulib/doc/glibc-functions/nis_name_of_r.texi
new file mode 100644
index 00000000..8281936d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_name_of_r.texi
@@ -0,0 +1,16 @@
+@node nis_name_of_r
+@subsection @code{nis_name_of_r}
+@findex nis_name_of_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_next_entry.texi b/gnulib/doc/glibc-functions/nis_next_entry.texi
new file mode 100644
index 00000000..1783383c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_next_entry.texi
@@ -0,0 +1,16 @@
+@node nis_next_entry
+@subsection @code{nis_next_entry}
+@findex nis_next_entry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_perror.texi b/gnulib/doc/glibc-functions/nis_perror.texi
new file mode 100644
index 00000000..0bc51512
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_perror.texi
@@ -0,0 +1,16 @@
+@node nis_perror
+@subsection @code{nis_perror}
+@findex nis_perror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_ping.texi b/gnulib/doc/glibc-functions/nis_ping.texi
new file mode 100644
index 00000000..5f1f668d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_ping.texi
@@ -0,0 +1,16 @@
+@node nis_ping
+@subsection @code{nis_ping}
+@findex nis_ping
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_directory.texi b/gnulib/doc/glibc-functions/nis_print_directory.texi
new file mode 100644
index 00000000..d6147573
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_directory.texi
@@ -0,0 +1,16 @@
+@node nis_print_directory
+@subsection @code{nis_print_directory}
+@findex nis_print_directory
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_entry.texi b/gnulib/doc/glibc-functions/nis_print_entry.texi
new file mode 100644
index 00000000..1c3e6a5e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_entry.texi
@@ -0,0 +1,16 @@
+@node nis_print_entry
+@subsection @code{nis_print_entry}
+@findex nis_print_entry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_group.texi b/gnulib/doc/glibc-functions/nis_print_group.texi
new file mode 100644
index 00000000..08360256
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_group.texi
@@ -0,0 +1,16 @@
+@node nis_print_group
+@subsection @code{nis_print_group}
+@findex nis_print_group
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_group_entry.texi b/gnulib/doc/glibc-functions/nis_print_group_entry.texi
new file mode 100644
index 00000000..62d0bdea
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_group_entry.texi
@@ -0,0 +1,16 @@
+@node nis_print_group_entry
+@subsection @code{nis_print_group_entry}
+@findex nis_print_group_entry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_link.texi b/gnulib/doc/glibc-functions/nis_print_link.texi
new file mode 100644
index 00000000..4fa97e15
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_link.texi
@@ -0,0 +1,16 @@
+@node nis_print_link
+@subsection @code{nis_print_link}
+@findex nis_print_link
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_object.texi b/gnulib/doc/glibc-functions/nis_print_object.texi
new file mode 100644
index 00000000..c456cf1f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_object.texi
@@ -0,0 +1,16 @@
+@node nis_print_object
+@subsection @code{nis_print_object}
+@findex nis_print_object
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_result.texi b/gnulib/doc/glibc-functions/nis_print_result.texi
new file mode 100644
index 00000000..dcd5a590
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_result.texi
@@ -0,0 +1,16 @@
+@node nis_print_result
+@subsection @code{nis_print_result}
+@findex nis_print_result
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_rights.texi b/gnulib/doc/glibc-functions/nis_print_rights.texi
new file mode 100644
index 00000000..d073094d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_rights.texi
@@ -0,0 +1,16 @@
+@node nis_print_rights
+@subsection @code{nis_print_rights}
+@findex nis_print_rights
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_print_table.texi b/gnulib/doc/glibc-functions/nis_print_table.texi
new file mode 100644
index 00000000..307af0d1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_print_table.texi
@@ -0,0 +1,16 @@
+@node nis_print_table
+@subsection @code{nis_print_table}
+@findex nis_print_table
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_remove.texi b/gnulib/doc/glibc-functions/nis_remove.texi
new file mode 100644
index 00000000..15cc6759
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_remove.texi
@@ -0,0 +1,16 @@
+@node nis_remove
+@subsection @code{nis_remove}
+@findex nis_remove
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_remove_entry.texi b/gnulib/doc/glibc-functions/nis_remove_entry.texi
new file mode 100644
index 00000000..e1a0b5e7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_remove_entry.texi
@@ -0,0 +1,16 @@
+@node nis_remove_entry
+@subsection @code{nis_remove_entry}
+@findex nis_remove_entry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_removemember.texi b/gnulib/doc/glibc-functions/nis_removemember.texi
new file mode 100644
index 00000000..4b900c4a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_removemember.texi
@@ -0,0 +1,16 @@
+@node nis_removemember
+@subsection @code{nis_removemember}
+@findex nis_removemember
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_rmdir.texi b/gnulib/doc/glibc-functions/nis_rmdir.texi
new file mode 100644
index 00000000..d22cceb5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_rmdir.texi
@@ -0,0 +1,16 @@
+@node nis_rmdir
+@subsection @code{nis_rmdir}
+@findex nis_rmdir
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_servstate.texi b/gnulib/doc/glibc-functions/nis_servstate.texi
new file mode 100644
index 00000000..ce4bc656
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_servstate.texi
@@ -0,0 +1,16 @@
+@node nis_servstate
+@subsection @code{nis_servstate}
+@findex nis_servstate
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_sperrno.texi b/gnulib/doc/glibc-functions/nis_sperrno.texi
new file mode 100644
index 00000000..950a2eba
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_sperrno.texi
@@ -0,0 +1,16 @@
+@node nis_sperrno
+@subsection @code{nis_sperrno}
+@findex nis_sperrno
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_sperror.texi b/gnulib/doc/glibc-functions/nis_sperror.texi
new file mode 100644
index 00000000..1cac8fa8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_sperror.texi
@@ -0,0 +1,16 @@
+@node nis_sperror
+@subsection @code{nis_sperror}
+@findex nis_sperror
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_sperror_r.texi b/gnulib/doc/glibc-functions/nis_sperror_r.texi
new file mode 100644
index 00000000..27e3a139
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_sperror_r.texi
@@ -0,0 +1,16 @@
+@node nis_sperror_r
+@subsection @code{nis_sperror_r}
+@findex nis_sperror_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_stats.texi b/gnulib/doc/glibc-functions/nis_stats.texi
new file mode 100644
index 00000000..5c718639
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_stats.texi
@@ -0,0 +1,16 @@
+@node nis_stats
+@subsection @code{nis_stats}
+@findex nis_stats
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nis_verifygroup.texi b/gnulib/doc/glibc-functions/nis_verifygroup.texi
new file mode 100644
index 00000000..93232a4f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nis_verifygroup.texi
@@ -0,0 +1,16 @@
+@node nis_verifygroup
+@subsection @code{nis_verifygroup}
+@findex nis_verifygroup
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/nrand48_r.texi b/gnulib/doc/glibc-functions/nrand48_r.texi
new file mode 100644
index 00000000..7e8c5abd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/nrand48_r.texi
@@ -0,0 +1,16 @@
+@node nrand48_r
+@subsection @code{nrand48_r}
+@findex nrand48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ntp_adjtime.texi b/gnulib/doc/glibc-functions/ntp_adjtime.texi
new file mode 100644
index 00000000..e83ce8b6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ntp_adjtime.texi
@@ -0,0 +1,16 @@
+@node ntp_adjtime
+@subsection @code{ntp_adjtime}
+@findex ntp_adjtime
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ntp_gettime.texi b/gnulib/doc/glibc-functions/ntp_gettime.texi
new file mode 100644
index 00000000..fe63bc16
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ntp_gettime.texi
@@ -0,0 +1,16 @@
+@node ntp_gettime
+@subsection @code{ntp_gettime}
+@findex ntp_gettime
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/obstack_alloc_failed_handler.texi b/gnulib/doc/glibc-functions/obstack_alloc_failed_handler.texi
new file mode 100644
index 00000000..4d818eaf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/obstack_alloc_failed_handler.texi
@@ -0,0 +1,16 @@
+@node obstack_alloc_failed_handler
+@subsection @code{obstack_alloc_failed_handler}
+@findex obstack_alloc_failed_handler
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/obstack_exit_failure.texi b/gnulib/doc/glibc-functions/obstack_exit_failure.texi
new file mode 100644
index 00000000..4d393e00
--- /dev/null
+++ b/gnulib/doc/glibc-functions/obstack_exit_failure.texi
@@ -0,0 +1,16 @@
+@node obstack_exit_failure
+@subsection @code{obstack_exit_failure}
+@findex obstack_exit_failure
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/obstack_free.texi b/gnulib/doc/glibc-functions/obstack_free.texi
new file mode 100644
index 00000000..fa2f3d41
--- /dev/null
+++ b/gnulib/doc/glibc-functions/obstack_free.texi
@@ -0,0 +1,16 @@
+@node obstack_free
+@subsection @code{obstack_free}
+@findex obstack_free
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/obstack_printf.texi b/gnulib/doc/glibc-functions/obstack_printf.texi
new file mode 100644
index 00000000..f5b2d39f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/obstack_printf.texi
@@ -0,0 +1,73 @@
+@node obstack_printf
+@subsection @code{obstack_printf}
+@findex obstack_printf
+
+Gnulib module: obstack-printf or obstack-printf-posix
+
+Portability problems fixed by either Gnulib module
+@code{obstack-printf} or @code{obstack-printf-posix}:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{ostack-printf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@item
+This function does not fully support the @samp{n} directive on some platforms:
+HP-UX 11, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/obstack_vprintf.texi b/gnulib/doc/glibc-functions/obstack_vprintf.texi
new file mode 100644
index 00000000..4c000d1f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/obstack_vprintf.texi
@@ -0,0 +1,73 @@
+@node obstack_vprintf
+@subsection @code{obstack_vprintf}
+@findex obstack_vprintf
+
+Gnulib module: obstack-printf or obstack-printf-posix
+
+Portability problems fixed by either Gnulib module
+@code{obstack-printf} or @code{obstack-printf-posix}:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{ostack-printf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@item
+This function does not fully support the @samp{n} directive on some platforms:
+HP-UX 11, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/on_exit.texi b/gnulib/doc/glibc-functions/on_exit.texi
new file mode 100644
index 00000000..d16f5fbb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/on_exit.texi
@@ -0,0 +1,16 @@
+@node on_exit
+@subsection @code{on_exit}
+@findex on_exit
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/openpty.texi b/gnulib/doc/glibc-functions/openpty.texi
new file mode 100644
index 00000000..83975a96
--- /dev/null
+++ b/gnulib/doc/glibc-functions/openpty.texi
@@ -0,0 +1,26 @@
+@node openpty
+@subsection @code{openpty}
+@findex openpty
+
+Gnulib module: pty
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+One some systems (at least including Cygwin, Interix, OSF/1 4 and 5,
+and Mac OS X) linking with @code{-lutil} is not required.
+@item
+On glibc, OpenBSD, NetBSD and FreeBSD linking with @code{-lutil} is
+required.
+@item
+The function is declared in pty.h on Cygwin, Interix, OSF/1 4 and 5,
+and glibc. It is declared in util.h on Mac OS X, OpenBSD and NetBSD.
+It is declared in libutil.h on FreeBSD.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some systems (at least including Solaris and HP-UX) the function is
+missing.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/parse_printf_format.texi b/gnulib/doc/glibc-functions/parse_printf_format.texi
new file mode 100644
index 00000000..a72c6e10
--- /dev/null
+++ b/gnulib/doc/glibc-functions/parse_printf_format.texi
@@ -0,0 +1,16 @@
+@node parse_printf_format
+@subsection @code{parse_printf_format}
+@findex parse_printf_format
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/personality.texi b/gnulib/doc/glibc-functions/personality.texi
new file mode 100644
index 00000000..8bf9de2f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/personality.texi
@@ -0,0 +1,16 @@
+@node personality
+@subsection @code{personality}
+@findex personality
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pipe2.texi b/gnulib/doc/glibc-functions/pipe2.texi
new file mode 100644
index 00000000..989245cf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pipe2.texi
@@ -0,0 +1,16 @@
+@node pipe2
+@subsection @code{pipe2}
+@findex pipe2
+
+Gnulib module: pipe2
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pmap_getmaps.texi b/gnulib/doc/glibc-functions/pmap_getmaps.texi
new file mode 100644
index 00000000..a7d9446b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pmap_getmaps.texi
@@ -0,0 +1,16 @@
+@node pmap_getmaps
+@subsection @code{pmap_getmaps}
+@findex pmap_getmaps
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pmap_getport.texi b/gnulib/doc/glibc-functions/pmap_getport.texi
new file mode 100644
index 00000000..a3f32e37
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pmap_getport.texi
@@ -0,0 +1,16 @@
+@node pmap_getport
+@subsection @code{pmap_getport}
+@findex pmap_getport
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pmap_rmtcall.texi b/gnulib/doc/glibc-functions/pmap_rmtcall.texi
new file mode 100644
index 00000000..7178fbf4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pmap_rmtcall.texi
@@ -0,0 +1,16 @@
+@node pmap_rmtcall
+@subsection @code{pmap_rmtcall}
+@findex pmap_rmtcall
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pmap_set.texi b/gnulib/doc/glibc-functions/pmap_set.texi
new file mode 100644
index 00000000..f60b7a84
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pmap_set.texi
@@ -0,0 +1,16 @@
+@node pmap_set
+@subsection @code{pmap_set}
+@findex pmap_set
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pmap_unset.texi b/gnulib/doc/glibc-functions/pmap_unset.texi
new file mode 100644
index 00000000..0c887aab
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pmap_unset.texi
@@ -0,0 +1,16 @@
+@node pmap_unset
+@subsection @code{pmap_unset}
+@findex pmap_unset
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pow10.texi b/gnulib/doc/glibc-functions/pow10.texi
new file mode 100644
index 00000000..9712b4c9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pow10.texi
@@ -0,0 +1,17 @@
+@node pow10
+@subsection @code{pow10}
+@findex pow10
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pow10f.texi b/gnulib/doc/glibc-functions/pow10f.texi
new file mode 100644
index 00000000..eb7586bd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pow10f.texi
@@ -0,0 +1,17 @@
+@node pow10f
+@subsection @code{pow10f}
+@findex pow10f
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pow10l.texi b/gnulib/doc/glibc-functions/pow10l.texi
new file mode 100644
index 00000000..5bad8b3c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pow10l.texi
@@ -0,0 +1,16 @@
+@node pow10l
+@subsection @code{pow10l}
+@findex pow10l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/prctl.texi b/gnulib/doc/glibc-functions/prctl.texi
new file mode 100644
index 00000000..20dcbffe
--- /dev/null
+++ b/gnulib/doc/glibc-functions/prctl.texi
@@ -0,0 +1,16 @@
+@node prctl
+@subsection @code{prctl}
+@findex prctl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/printf_size.texi b/gnulib/doc/glibc-functions/printf_size.texi
new file mode 100644
index 00000000..e211614a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/printf_size.texi
@@ -0,0 +1,16 @@
+@node printf_size
+@subsection @code{printf_size}
+@findex printf_size
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/printf_size_info.texi b/gnulib/doc/glibc-functions/printf_size_info.texi
new file mode 100644
index 00000000..3c14b4cc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/printf_size_info.texi
@@ -0,0 +1,16 @@
+@node printf_size_info
+@subsection @code{printf_size_info}
+@findex printf_size_info
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/profil.texi b/gnulib/doc/glibc-functions/profil.texi
new file mode 100644
index 00000000..5b042a55
--- /dev/null
+++ b/gnulib/doc/glibc-functions/profil.texi
@@ -0,0 +1,16 @@
+@node profil
+@subsection @code{profil}
+@findex profil
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/program_invocation_name.texi b/gnulib/doc/glibc-functions/program_invocation_name.texi
new file mode 100644
index 00000000..20a3c175
--- /dev/null
+++ b/gnulib/doc/glibc-functions/program_invocation_name.texi
@@ -0,0 +1,16 @@
+@node program_invocation_name
+@subsection @code{program_invocation_name}
+@findex program_invocation_name
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/program_invocation_short_name.texi b/gnulib/doc/glibc-functions/program_invocation_short_name.texi
new file mode 100644
index 00000000..db57b071
--- /dev/null
+++ b/gnulib/doc/glibc-functions/program_invocation_short_name.texi
@@ -0,0 +1,16 @@
+@node program_invocation_short_name
+@subsection @code{program_invocation_short_name}
+@findex program_invocation_short_name
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pthread_getattr_np.texi b/gnulib/doc/glibc-functions/pthread_getattr_np.texi
new file mode 100644
index 00000000..8cab611c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pthread_getattr_np.texi
@@ -0,0 +1,16 @@
+@node pthread_getattr_np
+@subsection @code{pthread_getattr_np}
+@findex pthread_getattr_np
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pthread_kill_other_threads_np.texi b/gnulib/doc/glibc-functions/pthread_kill_other_threads_np.texi
new file mode 100644
index 00000000..56d0a702
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pthread_kill_other_threads_np.texi
@@ -0,0 +1,16 @@
+@node pthread_kill_other_threads_np
+@subsection @code{pthread_kill_other_threads_np}
+@findex pthread_kill_other_threads_np
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pthread_rwlockattr_getkind_np.texi b/gnulib/doc/glibc-functions/pthread_rwlockattr_getkind_np.texi
new file mode 100644
index 00000000..c21c00b0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pthread_rwlockattr_getkind_np.texi
@@ -0,0 +1,16 @@
+@node pthread_rwlockattr_getkind_np
+@subsection @code{pthread_rwlockattr_getkind_np}
+@findex pthread_rwlockattr_getkind_np
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pthread_rwlockattr_setkind_np.texi b/gnulib/doc/glibc-functions/pthread_rwlockattr_setkind_np.texi
new file mode 100644
index 00000000..11e44db5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pthread_rwlockattr_setkind_np.texi
@@ -0,0 +1,16 @@
+@node pthread_rwlockattr_setkind_np
+@subsection @code{pthread_rwlockattr_setkind_np}
+@findex pthread_rwlockattr_setkind_np
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pthread_yield.texi b/gnulib/doc/glibc-functions/pthread_yield.texi
new file mode 100644
index 00000000..ffc8a741
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pthread_yield.texi
@@ -0,0 +1,16 @@
+@node pthread_yield
+@subsection @code{pthread_yield}
+@findex pthread_yield
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ptrace.texi b/gnulib/doc/glibc-functions/ptrace.texi
new file mode 100644
index 00000000..adab8a2b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ptrace.texi
@@ -0,0 +1,16 @@
+@node ptrace
+@subsection @code{ptrace}
+@findex ptrace
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ptsname_r.texi b/gnulib/doc/glibc-functions/ptsname_r.texi
new file mode 100644
index 00000000..1ff3998b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ptsname_r.texi
@@ -0,0 +1,16 @@
+@node ptsname_r
+@subsection @code{ptsname_r}
+@findex ptsname_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/putgrent.texi b/gnulib/doc/glibc-functions/putgrent.texi
new file mode 100644
index 00000000..93c7cde5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/putgrent.texi
@@ -0,0 +1,16 @@
+@node putgrent
+@subsection @code{putgrent}
+@findex putgrent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/putpwent.texi b/gnulib/doc/glibc-functions/putpwent.texi
new file mode 100644
index 00000000..112b5d35
--- /dev/null
+++ b/gnulib/doc/glibc-functions/putpwent.texi
@@ -0,0 +1,16 @@
+@node putpwent
+@subsection @code{putpwent}
+@findex putpwent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/putspent.texi b/gnulib/doc/glibc-functions/putspent.texi
new file mode 100644
index 00000000..687cc14c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/putspent.texi
@@ -0,0 +1,16 @@
+@node putspent
+@subsection @code{putspent}
+@findex putspent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pututline.texi b/gnulib/doc/glibc-functions/pututline.texi
new file mode 100644
index 00000000..8c429914
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pututline.texi
@@ -0,0 +1,16 @@
+@node pututline
+@subsection @code{pututline}
+@findex pututline
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/putw.texi b/gnulib/doc/glibc-functions/putw.texi
new file mode 100644
index 00000000..f51f768b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/putw.texi
@@ -0,0 +1,16 @@
+@node putw
+@subsection @code{putw}
+@findex putw
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/putwc_unlocked.texi b/gnulib/doc/glibc-functions/putwc_unlocked.texi
new file mode 100644
index 00000000..9e4eb836
--- /dev/null
+++ b/gnulib/doc/glibc-functions/putwc_unlocked.texi
@@ -0,0 +1,19 @@
+@node putwc_unlocked
+@subsection @code{putwc_unlocked}
+@findex putwc_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/putwchar_unlocked.texi b/gnulib/doc/glibc-functions/putwchar_unlocked.texi
new file mode 100644
index 00000000..7ef50310
--- /dev/null
+++ b/gnulib/doc/glibc-functions/putwchar_unlocked.texi
@@ -0,0 +1,19 @@
+@node putwchar_unlocked
+@subsection @code{putwchar_unlocked}
+@findex putwchar_unlocked
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/pvalloc.texi b/gnulib/doc/glibc-functions/pvalloc.texi
new file mode 100644
index 00000000..78ee5151
--- /dev/null
+++ b/gnulib/doc/glibc-functions/pvalloc.texi
@@ -0,0 +1,16 @@
+@node pvalloc
+@subsection @code{pvalloc}
+@findex pvalloc
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/qecvt.texi b/gnulib/doc/glibc-functions/qecvt.texi
new file mode 100644
index 00000000..8af03a62
--- /dev/null
+++ b/gnulib/doc/glibc-functions/qecvt.texi
@@ -0,0 +1,16 @@
+@node qecvt
+@subsection @code{qecvt}
+@findex qecvt
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/qecvt_r.texi b/gnulib/doc/glibc-functions/qecvt_r.texi
new file mode 100644
index 00000000..d45f44ce
--- /dev/null
+++ b/gnulib/doc/glibc-functions/qecvt_r.texi
@@ -0,0 +1,16 @@
+@node qecvt_r
+@subsection @code{qecvt_r}
+@findex qecvt_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/qfcvt.texi b/gnulib/doc/glibc-functions/qfcvt.texi
new file mode 100644
index 00000000..a1d5e87e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/qfcvt.texi
@@ -0,0 +1,16 @@
+@node qfcvt
+@subsection @code{qfcvt}
+@findex qfcvt
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/qfcvt_r.texi b/gnulib/doc/glibc-functions/qfcvt_r.texi
new file mode 100644
index 00000000..a0a5340e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/qfcvt_r.texi
@@ -0,0 +1,16 @@
+@node qfcvt_r
+@subsection @code{qfcvt_r}
+@findex qfcvt_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/qgcvt.texi b/gnulib/doc/glibc-functions/qgcvt.texi
new file mode 100644
index 00000000..98de1cbc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/qgcvt.texi
@@ -0,0 +1,16 @@
+@node qgcvt
+@subsection @code{qgcvt}
+@findex qgcvt
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/quotactl.texi b/gnulib/doc/glibc-functions/quotactl.texi
new file mode 100644
index 00000000..b349b79f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/quotactl.texi
@@ -0,0 +1,16 @@
+@node quotactl
+@subsection @code{quotactl}
+@findex quotactl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/random_r.texi b/gnulib/doc/glibc-functions/random_r.texi
new file mode 100644
index 00000000..be20c040
--- /dev/null
+++ b/gnulib/doc/glibc-functions/random_r.texi
@@ -0,0 +1,16 @@
+@node random_r
+@subsection @code{random_r}
+@findex random_r
+
+Gnulib module: random_r
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rawmemchr.texi b/gnulib/doc/glibc-functions/rawmemchr.texi
new file mode 100644
index 00000000..478231fb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rawmemchr.texi
@@ -0,0 +1,16 @@
+@node rawmemchr
+@subsection @code{rawmemchr}
+@findex rawmemchr
+
+Gnulib module: rawmemchr
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rcmd.texi b/gnulib/doc/glibc-functions/rcmd.texi
new file mode 100644
index 00000000..be80f527
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rcmd.texi
@@ -0,0 +1,16 @@
+@node rcmd
+@subsection @code{rcmd}
+@findex rcmd
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rcmd_af.texi b/gnulib/doc/glibc-functions/rcmd_af.texi
new file mode 100644
index 00000000..b57e94b7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rcmd_af.texi
@@ -0,0 +1,16 @@
+@node rcmd_af
+@subsection @code{rcmd_af}
+@findex rcmd_af
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_comp.texi b/gnulib/doc/glibc-functions/re_comp.texi
new file mode 100644
index 00000000..00b7eab4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_comp.texi
@@ -0,0 +1,16 @@
+@node re_comp
+@subsection @code{re_comp}
+@findex re_comp
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_compile_fastmap.texi b/gnulib/doc/glibc-functions/re_compile_fastmap.texi
new file mode 100644
index 00000000..7589deac
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_compile_fastmap.texi
@@ -0,0 +1,16 @@
+@node re_compile_fastmap
+@subsection @code{re_compile_fastmap}
+@findex re_compile_fastmap
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_compile_pattern.texi b/gnulib/doc/glibc-functions/re_compile_pattern.texi
new file mode 100644
index 00000000..aab72eb2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_compile_pattern.texi
@@ -0,0 +1,16 @@
+@node re_compile_pattern
+@subsection @code{re_compile_pattern}
+@findex re_compile_pattern
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_exec.texi b/gnulib/doc/glibc-functions/re_exec.texi
new file mode 100644
index 00000000..050bf7bd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_exec.texi
@@ -0,0 +1,16 @@
+@node re_exec
+@subsection @code{re_exec}
+@findex re_exec
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_match.texi b/gnulib/doc/glibc-functions/re_match.texi
new file mode 100644
index 00000000..e27e6c28
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_match.texi
@@ -0,0 +1,16 @@
+@node re_match
+@subsection @code{re_match}
+@findex re_match
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_match_2.texi b/gnulib/doc/glibc-functions/re_match_2.texi
new file mode 100644
index 00000000..8ca6769f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_match_2.texi
@@ -0,0 +1,16 @@
+@node re_match_2
+@subsection @code{re_match_2}
+@findex re_match_2
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_search.texi b/gnulib/doc/glibc-functions/re_search.texi
new file mode 100644
index 00000000..8696455f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_search.texi
@@ -0,0 +1,16 @@
+@node re_search
+@subsection @code{re_search}
+@findex re_search
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_search_2.texi b/gnulib/doc/glibc-functions/re_search_2.texi
new file mode 100644
index 00000000..9bab820b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_search_2.texi
@@ -0,0 +1,16 @@
+@node re_search_2
+@subsection @code{re_search_2}
+@findex re_search_2
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_set_registers.texi b/gnulib/doc/glibc-functions/re_set_registers.texi
new file mode 100644
index 00000000..ff2c0638
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_set_registers.texi
@@ -0,0 +1,16 @@
+@node re_set_registers
+@subsection @code{re_set_registers}
+@findex re_set_registers
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_set_syntax.texi b/gnulib/doc/glibc-functions/re_set_syntax.texi
new file mode 100644
index 00000000..c29b5a22
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_set_syntax.texi
@@ -0,0 +1,16 @@
+@node re_set_syntax
+@subsection @code{re_set_syntax}
+@findex re_set_syntax
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/re_syntax_options.texi b/gnulib/doc/glibc-functions/re_syntax_options.texi
new file mode 100644
index 00000000..100a1fbf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/re_syntax_options.texi
@@ -0,0 +1,16 @@
+@node re_syntax_options
+@subsection @code{re_syntax_options}
+@findex re_syntax_options
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/readahead.texi b/gnulib/doc/glibc-functions/readahead.texi
new file mode 100644
index 00000000..ad639b76
--- /dev/null
+++ b/gnulib/doc/glibc-functions/readahead.texi
@@ -0,0 +1,16 @@
+@node readahead
+@subsection @code{readahead}
+@findex readahead
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/reboot.texi b/gnulib/doc/glibc-functions/reboot.texi
new file mode 100644
index 00000000..111e6823
--- /dev/null
+++ b/gnulib/doc/glibc-functions/reboot.texi
@@ -0,0 +1,16 @@
+@node reboot
+@subsection @code{reboot}
+@findex reboot
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/register_printf_function.texi b/gnulib/doc/glibc-functions/register_printf_function.texi
new file mode 100644
index 00000000..21c1033a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/register_printf_function.texi
@@ -0,0 +1,16 @@
+@node register_printf_function
+@subsection @code{register_printf_function}
+@findex register_printf_function
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/remap_file_pages.texi b/gnulib/doc/glibc-functions/remap_file_pages.texi
new file mode 100644
index 00000000..31d1dae0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/remap_file_pages.texi
@@ -0,0 +1,16 @@
+@node remap_file_pages
+@subsection @code{remap_file_pages}
+@findex remap_file_pages
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/removexattr.texi b/gnulib/doc/glibc-functions/removexattr.texi
new file mode 100644
index 00000000..ab8c6be5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/removexattr.texi
@@ -0,0 +1,17 @@
+@node removexattr
+@subsection @code{removexattr}
+@findex removexattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/res_init.texi b/gnulib/doc/glibc-functions/res_init.texi
new file mode 100644
index 00000000..6a1bf896
--- /dev/null
+++ b/gnulib/doc/glibc-functions/res_init.texi
@@ -0,0 +1,16 @@
+@node res_init
+@subsection @code{res_init}
+@findex res_init
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/res_mkquery.texi b/gnulib/doc/glibc-functions/res_mkquery.texi
new file mode 100644
index 00000000..980e5b0f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/res_mkquery.texi
@@ -0,0 +1,16 @@
+@node res_mkquery
+@subsection @code{res_mkquery}
+@findex res_mkquery
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/res_query.texi b/gnulib/doc/glibc-functions/res_query.texi
new file mode 100644
index 00000000..8133d145
--- /dev/null
+++ b/gnulib/doc/glibc-functions/res_query.texi
@@ -0,0 +1,16 @@
+@node res_query
+@subsection @code{res_query}
+@findex res_query
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/res_querydomain.texi b/gnulib/doc/glibc-functions/res_querydomain.texi
new file mode 100644
index 00000000..0184d19f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/res_querydomain.texi
@@ -0,0 +1,16 @@
+@node res_querydomain
+@subsection @code{res_querydomain}
+@findex res_querydomain
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/res_search.texi b/gnulib/doc/glibc-functions/res_search.texi
new file mode 100644
index 00000000..b17f6cf4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/res_search.texi
@@ -0,0 +1,16 @@
+@node res_search
+@subsection @code{res_search}
+@findex res_search
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/revoke.texi b/gnulib/doc/glibc-functions/revoke.texi
new file mode 100644
index 00000000..5fcd8a21
--- /dev/null
+++ b/gnulib/doc/glibc-functions/revoke.texi
@@ -0,0 +1,16 @@
+@node revoke
+@subsection @code{revoke}
+@findex revoke
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rexec.texi b/gnulib/doc/glibc-functions/rexec.texi
new file mode 100644
index 00000000..fe30aa4c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rexec.texi
@@ -0,0 +1,16 @@
+@node rexec
+@subsection @code{rexec}
+@findex rexec
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rexec_af.texi b/gnulib/doc/glibc-functions/rexec_af.texi
new file mode 100644
index 00000000..9d37ac6c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rexec_af.texi
@@ -0,0 +1,16 @@
+@node rexec_af
+@subsection @code{rexec_af}
+@findex rexec_af
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rpc_createerr.texi b/gnulib/doc/glibc-functions/rpc_createerr.texi
new file mode 100644
index 00000000..ccd1b224
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rpc_createerr.texi
@@ -0,0 +1,16 @@
+@node rpc_createerr
+@subsection @code{rpc_createerr}
+@findex rpc_createerr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rpmatch.texi b/gnulib/doc/glibc-functions/rpmatch.texi
new file mode 100644
index 00000000..bac18094
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rpmatch.texi
@@ -0,0 +1,16 @@
+@node rpmatch
+@subsection @code{rpmatch}
+@findex rpmatch
+
+Gnulib module: rpmatch
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rresvport.texi b/gnulib/doc/glibc-functions/rresvport.texi
new file mode 100644
index 00000000..cee720cb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rresvport.texi
@@ -0,0 +1,16 @@
+@node rresvport
+@subsection @code{rresvport}
+@findex rresvport
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rresvport_af.texi b/gnulib/doc/glibc-functions/rresvport_af.texi
new file mode 100644
index 00000000..7d7a537c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rresvport_af.texi
@@ -0,0 +1,16 @@
+@node rresvport_af
+@subsection @code{rresvport_af}
+@findex rresvport_af
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/rtime.texi b/gnulib/doc/glibc-functions/rtime.texi
new file mode 100644
index 00000000..9e40bdf3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/rtime.texi
@@ -0,0 +1,16 @@
+@node rtime
+@subsection @code{rtime}
+@findex rtime
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ruserok.texi b/gnulib/doc/glibc-functions/ruserok.texi
new file mode 100644
index 00000000..34b6efa0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ruserok.texi
@@ -0,0 +1,16 @@
+@node ruserok
+@subsection @code{ruserok}
+@findex ruserok
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ruserok_af.texi b/gnulib/doc/glibc-functions/ruserok_af.texi
new file mode 100644
index 00000000..849ab53a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ruserok_af.texi
@@ -0,0 +1,16 @@
+@node ruserok_af
+@subsection @code{ruserok_af}
+@findex ruserok_af
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sbrk.texi b/gnulib/doc/glibc-functions/sbrk.texi
new file mode 100644
index 00000000..c97d8854
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sbrk.texi
@@ -0,0 +1,16 @@
+@node sbrk
+@subsection @code{sbrk}
+@findex sbrk
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/scalbf.texi b/gnulib/doc/glibc-functions/scalbf.texi
new file mode 100644
index 00000000..50216b05
--- /dev/null
+++ b/gnulib/doc/glibc-functions/scalbf.texi
@@ -0,0 +1,16 @@
+@node scalbf
+@subsection @code{scalbf}
+@findex scalbf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/scalbl.texi b/gnulib/doc/glibc-functions/scalbl.texi
new file mode 100644
index 00000000..c45a8074
--- /dev/null
+++ b/gnulib/doc/glibc-functions/scalbl.texi
@@ -0,0 +1,16 @@
+@node scalbl
+@subsection @code{scalbl}
+@findex scalbl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sched_getaffinity.texi b/gnulib/doc/glibc-functions/sched_getaffinity.texi
new file mode 100644
index 00000000..55f8e3d6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sched_getaffinity.texi
@@ -0,0 +1,16 @@
+@node sched_getaffinity
+@subsection @code{sched_getaffinity}
+@findex sched_getaffinity
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sched_setaffinity.texi b/gnulib/doc/glibc-functions/sched_setaffinity.texi
new file mode 100644
index 00000000..4446326e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sched_setaffinity.texi
@@ -0,0 +1,16 @@
+@node sched_setaffinity
+@subsection @code{sched_setaffinity}
+@findex sched_setaffinity
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/seed48_r.texi b/gnulib/doc/glibc-functions/seed48_r.texi
new file mode 100644
index 00000000..7aea3051
--- /dev/null
+++ b/gnulib/doc/glibc-functions/seed48_r.texi
@@ -0,0 +1,16 @@
+@node seed48_r
+@subsection @code{seed48_r}
+@findex seed48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/semtimedop.texi b/gnulib/doc/glibc-functions/semtimedop.texi
new file mode 100644
index 00000000..c74588f0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/semtimedop.texi
@@ -0,0 +1,16 @@
+@node semtimedop
+@subsection @code{semtimedop}
+@findex semtimedop
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sendfile.texi b/gnulib/doc/glibc-functions/sendfile.texi
new file mode 100644
index 00000000..57719dba
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sendfile.texi
@@ -0,0 +1,16 @@
+@node sendfile
+@subsection @code{sendfile}
+@findex sendfile
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setaliasent.texi b/gnulib/doc/glibc-functions/setaliasent.texi
new file mode 100644
index 00000000..a4da0402
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setaliasent.texi
@@ -0,0 +1,16 @@
+@node setaliasent
+@subsection @code{setaliasent}
+@findex setaliasent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setbuffer.texi b/gnulib/doc/glibc-functions/setbuffer.texi
new file mode 100644
index 00000000..bff0a01e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setbuffer.texi
@@ -0,0 +1,16 @@
+@node setbuffer
+@subsection @code{setbuffer}
+@findex setbuffer
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setdomainname.texi b/gnulib/doc/glibc-functions/setdomainname.texi
new file mode 100644
index 00000000..96cf7a60
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setdomainname.texi
@@ -0,0 +1,16 @@
+@node setdomainname
+@subsection @code{setdomainname}
+@findex setdomainname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setfsent.texi b/gnulib/doc/glibc-functions/setfsent.texi
new file mode 100644
index 00000000..d252fddf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setfsent.texi
@@ -0,0 +1,16 @@
+@node setfsent
+@subsection @code{setfsent}
+@findex setfsent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setfsgid.texi b/gnulib/doc/glibc-functions/setfsgid.texi
new file mode 100644
index 00000000..36f20abe
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setfsgid.texi
@@ -0,0 +1,16 @@
+@node setfsgid
+@subsection @code{setfsgid}
+@findex setfsgid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setfsuid.texi b/gnulib/doc/glibc-functions/setfsuid.texi
new file mode 100644
index 00000000..58359c2d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setfsuid.texi
@@ -0,0 +1,16 @@
+@node setfsuid
+@subsection @code{setfsuid}
+@findex setfsuid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setgroups.texi b/gnulib/doc/glibc-functions/setgroups.texi
new file mode 100644
index 00000000..bcbd8415
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setgroups.texi
@@ -0,0 +1,22 @@
+@node setgroups
+@subsection @code{setgroups}
+@findex setgroups
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, mingw, Interix 3.5, BeOS.
+@item
+On very old systems, this function operated on an array of @samp{int},
+even though that was a different size than an array of @samp{gid_t};
+you can use autoconf's AC_TYPE_GETGROUPS to set @code{GETGROUPS_T} to
+the appropriate size (since @code{getgroups} and @code{setgroups}
+share the same bug).
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sethostid.texi b/gnulib/doc/glibc-functions/sethostid.texi
new file mode 100644
index 00000000..f0458246
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sethostid.texi
@@ -0,0 +1,16 @@
+@node sethostid
+@subsection @code{sethostid}
+@findex sethostid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sethostname.texi b/gnulib/doc/glibc-functions/sethostname.texi
new file mode 100644
index 00000000..e51b1e40
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sethostname.texi
@@ -0,0 +1,16 @@
+@node sethostname
+@subsection @code{sethostname}
+@findex sethostname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setipv4sourcefilter.texi b/gnulib/doc/glibc-functions/setipv4sourcefilter.texi
new file mode 100644
index 00000000..8b05c1cd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setipv4sourcefilter.texi
@@ -0,0 +1,16 @@
+@node setipv4sourcefilter
+@subsection @code{setipv4sourcefilter}
+@findex setipv4sourcefilter
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setkey_r.texi b/gnulib/doc/glibc-functions/setkey_r.texi
new file mode 100644
index 00000000..cf383395
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setkey_r.texi
@@ -0,0 +1,16 @@
+@node setkey_r
+@subsection @code{setkey_r}
+@findex setkey_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setlinebuf.texi b/gnulib/doc/glibc-functions/setlinebuf.texi
new file mode 100644
index 00000000..e91fbeeb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setlinebuf.texi
@@ -0,0 +1,16 @@
+@node setlinebuf
+@subsection @code{setlinebuf}
+@findex setlinebuf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setlogin.texi b/gnulib/doc/glibc-functions/setlogin.texi
new file mode 100644
index 00000000..5aaab67b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setlogin.texi
@@ -0,0 +1,16 @@
+@node setlogin
+@subsection @code{setlogin}
+@findex setlogin
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setmntent.texi b/gnulib/doc/glibc-functions/setmntent.texi
new file mode 100644
index 00000000..31fb2dc6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setmntent.texi
@@ -0,0 +1,16 @@
+@node setmntent
+@subsection @code{setmntent}
+@findex setmntent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setnetgrent.texi b/gnulib/doc/glibc-functions/setnetgrent.texi
new file mode 100644
index 00000000..00522d5c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setnetgrent.texi
@@ -0,0 +1,16 @@
+@node setnetgrent
+@subsection @code{setnetgrent}
+@findex setnetgrent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setresgid.texi b/gnulib/doc/glibc-functions/setresgid.texi
new file mode 100644
index 00000000..93e85264
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setresgid.texi
@@ -0,0 +1,16 @@
+@node setresgid
+@subsection @code{setresgid}
+@findex setresgid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setresuid.texi b/gnulib/doc/glibc-functions/setresuid.texi
new file mode 100644
index 00000000..8dbc11ca
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setresuid.texi
@@ -0,0 +1,16 @@
+@node setresuid
+@subsection @code{setresuid}
+@findex setresuid
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setrpcent.texi b/gnulib/doc/glibc-functions/setrpcent.texi
new file mode 100644
index 00000000..99e96f89
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setrpcent.texi
@@ -0,0 +1,16 @@
+@node setrpcent
+@subsection @code{setrpcent}
+@findex setrpcent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setsourcefilter.texi b/gnulib/doc/glibc-functions/setsourcefilter.texi
new file mode 100644
index 00000000..aecb4734
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setsourcefilter.texi
@@ -0,0 +1,16 @@
+@node setsourcefilter
+@subsection @code{setsourcefilter}
+@findex setsourcefilter
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setspent.texi b/gnulib/doc/glibc-functions/setspent.texi
new file mode 100644
index 00000000..24423bb1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setspent.texi
@@ -0,0 +1,16 @@
+@node setspent
+@subsection @code{setspent}
+@findex setspent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setstate_r.texi b/gnulib/doc/glibc-functions/setstate_r.texi
new file mode 100644
index 00000000..631e125a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setstate_r.texi
@@ -0,0 +1,16 @@
+@node setstate_r
+@subsection @code{setstate_r}
+@findex setstate_r
+
+Gnulib module: random_r
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/settimeofday.texi b/gnulib/doc/glibc-functions/settimeofday.texi
new file mode 100644
index 00000000..f78f6c8f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/settimeofday.texi
@@ -0,0 +1,16 @@
+@node settimeofday
+@subsection @code{settimeofday}
+@findex settimeofday
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setttyent.texi b/gnulib/doc/glibc-functions/setttyent.texi
new file mode 100644
index 00000000..c6c04e68
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setttyent.texi
@@ -0,0 +1,16 @@
+@node setttyent
+@subsection @code{setttyent}
+@findex setttyent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setusershell.texi b/gnulib/doc/glibc-functions/setusershell.texi
new file mode 100644
index 00000000..2978bfee
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setusershell.texi
@@ -0,0 +1,16 @@
+@node setusershell
+@subsection @code{setusershell}
+@findex setusershell
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setutent.texi b/gnulib/doc/glibc-functions/setutent.texi
new file mode 100644
index 00000000..00c069c0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setutent.texi
@@ -0,0 +1,16 @@
+@node setutent
+@subsection @code{setutent}
+@findex setutent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/setxattr.texi b/gnulib/doc/glibc-functions/setxattr.texi
new file mode 100644
index 00000000..09a66aba
--- /dev/null
+++ b/gnulib/doc/glibc-functions/setxattr.texi
@@ -0,0 +1,17 @@
+@node setxattr
+@subsection @code{setxattr}
+@findex setxattr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sgetspent.texi b/gnulib/doc/glibc-functions/sgetspent.texi
new file mode 100644
index 00000000..45b1dbda
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sgetspent.texi
@@ -0,0 +1,16 @@
+@node sgetspent
+@subsection @code{sgetspent}
+@findex sgetspent
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sgetspent_r.texi b/gnulib/doc/glibc-functions/sgetspent_r.texi
new file mode 100644
index 00000000..815bd51d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sgetspent_r.texi
@@ -0,0 +1,16 @@
+@node sgetspent_r
+@subsection @code{sgetspent_r}
+@findex sgetspent_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sigandset.texi b/gnulib/doc/glibc-functions/sigandset.texi
new file mode 100644
index 00000000..c76c3fd4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sigandset.texi
@@ -0,0 +1,16 @@
+@node sigandset
+@subsection @code{sigandset}
+@findex sigandset
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sigblock.texi b/gnulib/doc/glibc-functions/sigblock.texi
new file mode 100644
index 00000000..e198d23a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sigblock.texi
@@ -0,0 +1,16 @@
+@node sigblock
+@subsection @code{sigblock}
+@findex sigblock
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/siggetmask.texi b/gnulib/doc/glibc-functions/siggetmask.texi
new file mode 100644
index 00000000..586c0f12
--- /dev/null
+++ b/gnulib/doc/glibc-functions/siggetmask.texi
@@ -0,0 +1,16 @@
+@node siggetmask
+@subsection @code{siggetmask}
+@findex siggetmask
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sigisemptyset.texi b/gnulib/doc/glibc-functions/sigisemptyset.texi
new file mode 100644
index 00000000..b1268f17
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sigisemptyset.texi
@@ -0,0 +1,16 @@
+@node sigisemptyset
+@subsection @code{sigisemptyset}
+@findex sigisemptyset
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/significand.texi b/gnulib/doc/glibc-functions/significand.texi
new file mode 100644
index 00000000..38b66afb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/significand.texi
@@ -0,0 +1,16 @@
+@node significand
+@subsection @code{significand}
+@findex significand
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/significandf.texi b/gnulib/doc/glibc-functions/significandf.texi
new file mode 100644
index 00000000..c4ce6fca
--- /dev/null
+++ b/gnulib/doc/glibc-functions/significandf.texi
@@ -0,0 +1,16 @@
+@node significandf
+@subsection @code{significandf}
+@findex significandf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/significandl.texi b/gnulib/doc/glibc-functions/significandl.texi
new file mode 100644
index 00000000..9ab37d00
--- /dev/null
+++ b/gnulib/doc/glibc-functions/significandl.texi
@@ -0,0 +1,16 @@
+@node significandl
+@subsection @code{significandl}
+@findex significandl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sigorset.texi b/gnulib/doc/glibc-functions/sigorset.texi
new file mode 100644
index 00000000..2a880a0e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sigorset.texi
@@ -0,0 +1,16 @@
+@node sigorset
+@subsection @code{sigorset}
+@findex sigorset
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sigreturn.texi b/gnulib/doc/glibc-functions/sigreturn.texi
new file mode 100644
index 00000000..3e5dfb48
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sigreturn.texi
@@ -0,0 +1,16 @@
+@node sigreturn
+@subsection @code{sigreturn}
+@findex sigreturn
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sigsetmask.texi b/gnulib/doc/glibc-functions/sigsetmask.texi
new file mode 100644
index 00000000..6d9a4742
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sigsetmask.texi
@@ -0,0 +1,16 @@
+@node sigsetmask
+@subsection @code{sigsetmask}
+@findex sigsetmask
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sigstack.texi b/gnulib/doc/glibc-functions/sigstack.texi
new file mode 100644
index 00000000..daa209fb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sigstack.texi
@@ -0,0 +1,16 @@
+@node sigstack
+@subsection @code{sigstack}
+@findex sigstack
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sigvec.texi b/gnulib/doc/glibc-functions/sigvec.texi
new file mode 100644
index 00000000..78efbce0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sigvec.texi
@@ -0,0 +1,16 @@
+@node sigvec
+@subsection @code{sigvec}
+@findex sigvec
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sincos.texi b/gnulib/doc/glibc-functions/sincos.texi
new file mode 100644
index 00000000..8ac168de
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sincos.texi
@@ -0,0 +1,16 @@
+@node sincos
+@subsection @code{sincos}
+@findex sincos
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sincosf.texi b/gnulib/doc/glibc-functions/sincosf.texi
new file mode 100644
index 00000000..a2dc751e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sincosf.texi
@@ -0,0 +1,16 @@
+@node sincosf
+@subsection @code{sincosf}
+@findex sincosf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sincosl.texi b/gnulib/doc/glibc-functions/sincosl.texi
new file mode 100644
index 00000000..e11c11f1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sincosl.texi
@@ -0,0 +1,16 @@
+@node sincosl
+@subsection @code{sincosl}
+@findex sincosl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sprofil.texi b/gnulib/doc/glibc-functions/sprofil.texi
new file mode 100644
index 00000000..8a087d41
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sprofil.texi
@@ -0,0 +1,16 @@
+@node sprofil
+@subsection @code{sprofil}
+@findex sprofil
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/srand48_r.texi b/gnulib/doc/glibc-functions/srand48_r.texi
new file mode 100644
index 00000000..27703a0d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/srand48_r.texi
@@ -0,0 +1,16 @@
+@node srand48_r
+@subsection @code{srand48_r}
+@findex srand48_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/srandom_r.texi b/gnulib/doc/glibc-functions/srandom_r.texi
new file mode 100644
index 00000000..0af243f9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/srandom_r.texi
@@ -0,0 +1,16 @@
+@node srandom_r
+@subsection @code{srandom_r}
+@findex srandom_r
+
+Gnulib module: random_r
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ssignal.texi b/gnulib/doc/glibc-functions/ssignal.texi
new file mode 100644
index 00000000..d4a70651
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ssignal.texi
@@ -0,0 +1,16 @@
+@node ssignal
+@subsection @code{ssignal}
+@findex ssignal
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/statfs.texi b/gnulib/doc/glibc-functions/statfs.texi
new file mode 100644
index 00000000..b2182b10
--- /dev/null
+++ b/gnulib/doc/glibc-functions/statfs.texi
@@ -0,0 +1,16 @@
+@node statfs
+@subsection @code{statfs}
+@findex statfs
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/step.texi b/gnulib/doc/glibc-functions/step.texi
new file mode 100644
index 00000000..53549a43
--- /dev/null
+++ b/gnulib/doc/glibc-functions/step.texi
@@ -0,0 +1,16 @@
+@node step
+@subsection @code{step}
+@findex step
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/stime.texi b/gnulib/doc/glibc-functions/stime.texi
new file mode 100644
index 00000000..6780dab9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/stime.texi
@@ -0,0 +1,16 @@
+@node stime
+@subsection @code{stime}
+@findex stime
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strcasestr.texi b/gnulib/doc/glibc-functions/strcasestr.texi
new file mode 100644
index 00000000..7ce39f42
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strcasestr.texi
@@ -0,0 +1,30 @@
+@node strcasestr
+@subsection @code{strcasestr}
+@findex strcasestr
+
+Gnulib module: strcasestr or strcasestr-simple
+
+Portability problems fixed by either Gnulib module @code{strcasestr-simple}
+or @code{strcasestr}:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x,
+mingw, BeOS.
+
+@item
+This function can trigger memchr bugs on some platforms:
+glibc 2.10.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{strcasestr}:
+@itemize
+@item
+This function has quadratic instead of linear worst-case complexity on some
+platforms:
+glibc 2.8, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strchrnul.texi b/gnulib/doc/glibc-functions/strchrnul.texi
new file mode 100644
index 00000000..f9f55fbe
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strchrnul.texi
@@ -0,0 +1,16 @@
+@node strchrnul
+@subsection @code{strchrnul}
+@findex strchrnul
+
+Gnulib module: strchrnul
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strfry.texi b/gnulib/doc/glibc-functions/strfry.texi
new file mode 100644
index 00000000..7390e5cb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strfry.texi
@@ -0,0 +1,16 @@
+@node strfry
+@subsection @code{strfry}
+@findex strfry
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strptime_l.texi b/gnulib/doc/glibc-functions/strptime_l.texi
new file mode 100644
index 00000000..d022257c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strptime_l.texi
@@ -0,0 +1,16 @@
+@node strptime_l
+@subsection @code{strptime_l}
+@findex strptime_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strsep.texi b/gnulib/doc/glibc-functions/strsep.texi
new file mode 100644
index 00000000..e49ae5dd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strsep.texi
@@ -0,0 +1,16 @@
+@node strsep
+@subsection @code{strsep}
+@findex strsep
+
+Gnulib module: strsep
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtod_l.texi b/gnulib/doc/glibc-functions/strtod_l.texi
new file mode 100644
index 00000000..c3d5507d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtod_l.texi
@@ -0,0 +1,16 @@
+@node strtod_l
+@subsection @code{strtod_l}
+@findex strtod_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtof_l.texi b/gnulib/doc/glibc-functions/strtof_l.texi
new file mode 100644
index 00000000..00e74c40
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtof_l.texi
@@ -0,0 +1,16 @@
+@node strtof_l
+@subsection @code{strtof_l}
+@findex strtof_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtol_l.texi b/gnulib/doc/glibc-functions/strtol_l.texi
new file mode 100644
index 00000000..010a13ac
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtol_l.texi
@@ -0,0 +1,16 @@
+@node strtol_l
+@subsection @code{strtol_l}
+@findex strtol_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtold_l.texi b/gnulib/doc/glibc-functions/strtold_l.texi
new file mode 100644
index 00000000..233bbd27
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtold_l.texi
@@ -0,0 +1,16 @@
+@node strtold_l
+@subsection @code{strtold_l}
+@findex strtold_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtoll_l.texi b/gnulib/doc/glibc-functions/strtoll_l.texi
new file mode 100644
index 00000000..04f98971
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtoll_l.texi
@@ -0,0 +1,16 @@
+@node strtoll_l
+@subsection @code{strtoll_l}
+@findex strtoll_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtoq.texi b/gnulib/doc/glibc-functions/strtoq.texi
new file mode 100644
index 00000000..57b3abad
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtoq.texi
@@ -0,0 +1,16 @@
+@node strtoq
+@subsection @code{strtoq}
+@findex strtoq
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtoul_l.texi b/gnulib/doc/glibc-functions/strtoul_l.texi
new file mode 100644
index 00000000..c32c0ce9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtoul_l.texi
@@ -0,0 +1,16 @@
+@node strtoul_l
+@subsection @code{strtoul_l}
+@findex strtoul_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtoull_l.texi b/gnulib/doc/glibc-functions/strtoull_l.texi
new file mode 100644
index 00000000..9417b14a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtoull_l.texi
@@ -0,0 +1,16 @@
+@node strtoull_l
+@subsection @code{strtoull_l}
+@findex strtoull_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strtouq.texi b/gnulib/doc/glibc-functions/strtouq.texi
new file mode 100644
index 00000000..30011954
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strtouq.texi
@@ -0,0 +1,16 @@
+@node strtouq
+@subsection @code{strtouq}
+@findex strtouq
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/strverscmp.texi b/gnulib/doc/glibc-functions/strverscmp.texi
new file mode 100644
index 00000000..bcdf2429
--- /dev/null
+++ b/gnulib/doc/glibc-functions/strverscmp.texi
@@ -0,0 +1,16 @@
+@node strverscmp
+@subsection @code{strverscmp}
+@findex strverscmp
+
+Gnulib module: strverscmp
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_exit.texi b/gnulib/doc/glibc-functions/svc_exit.texi
new file mode 100644
index 00000000..f8f38783
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_exit.texi
@@ -0,0 +1,16 @@
+@node svc_exit
+@subsection @code{svc_exit}
+@findex svc_exit
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_fdset.texi b/gnulib/doc/glibc-functions/svc_fdset.texi
new file mode 100644
index 00000000..460bb0a3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_fdset.texi
@@ -0,0 +1,16 @@
+@node svc_fdset
+@subsection @code{svc_fdset}
+@findex svc_fdset
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_getreq.texi b/gnulib/doc/glibc-functions/svc_getreq.texi
new file mode 100644
index 00000000..eba1517a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_getreq.texi
@@ -0,0 +1,16 @@
+@node svc_getreq
+@subsection @code{svc_getreq}
+@findex svc_getreq
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_getreq_common.texi b/gnulib/doc/glibc-functions/svc_getreq_common.texi
new file mode 100644
index 00000000..6ef70d37
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_getreq_common.texi
@@ -0,0 +1,16 @@
+@node svc_getreq_common
+@subsection @code{svc_getreq_common}
+@findex svc_getreq_common
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_getreq_poll.texi b/gnulib/doc/glibc-functions/svc_getreq_poll.texi
new file mode 100644
index 00000000..fac1c58b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_getreq_poll.texi
@@ -0,0 +1,16 @@
+@node svc_getreq_poll
+@subsection @code{svc_getreq_poll}
+@findex svc_getreq_poll
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_getreqset.texi b/gnulib/doc/glibc-functions/svc_getreqset.texi
new file mode 100644
index 00000000..9df3d4dc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_getreqset.texi
@@ -0,0 +1,16 @@
+@node svc_getreqset
+@subsection @code{svc_getreqset}
+@findex svc_getreqset
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_max_pollfd.texi b/gnulib/doc/glibc-functions/svc_max_pollfd.texi
new file mode 100644
index 00000000..ab9643c5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_max_pollfd.texi
@@ -0,0 +1,16 @@
+@node svc_max_pollfd
+@subsection @code{svc_max_pollfd}
+@findex svc_max_pollfd
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_pollfd.texi b/gnulib/doc/glibc-functions/svc_pollfd.texi
new file mode 100644
index 00000000..d3a951cc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_pollfd.texi
@@ -0,0 +1,16 @@
+@node svc_pollfd
+@subsection @code{svc_pollfd}
+@findex svc_pollfd
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_register.texi b/gnulib/doc/glibc-functions/svc_register.texi
new file mode 100644
index 00000000..ca147381
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_register.texi
@@ -0,0 +1,16 @@
+@node svc_register
+@subsection @code{svc_register}
+@findex svc_register
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_run.texi b/gnulib/doc/glibc-functions/svc_run.texi
new file mode 100644
index 00000000..4b7e4b3c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_run.texi
@@ -0,0 +1,16 @@
+@node svc_run
+@subsection @code{svc_run}
+@findex svc_run
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_sendreply.texi b/gnulib/doc/glibc-functions/svc_sendreply.texi
new file mode 100644
index 00000000..21b323e4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_sendreply.texi
@@ -0,0 +1,16 @@
+@node svc_sendreply
+@subsection @code{svc_sendreply}
+@findex svc_sendreply
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svc_unregister.texi b/gnulib/doc/glibc-functions/svc_unregister.texi
new file mode 100644
index 00000000..c9823a26
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svc_unregister.texi
@@ -0,0 +1,16 @@
+@node svc_unregister
+@subsection @code{svc_unregister}
+@findex svc_unregister
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcerr_auth.texi b/gnulib/doc/glibc-functions/svcerr_auth.texi
new file mode 100644
index 00000000..4ba2c7cf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcerr_auth.texi
@@ -0,0 +1,16 @@
+@node svcerr_auth
+@subsection @code{svcerr_auth}
+@findex svcerr_auth
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcerr_decode.texi b/gnulib/doc/glibc-functions/svcerr_decode.texi
new file mode 100644
index 00000000..52b7aa48
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcerr_decode.texi
@@ -0,0 +1,16 @@
+@node svcerr_decode
+@subsection @code{svcerr_decode}
+@findex svcerr_decode
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcerr_noproc.texi b/gnulib/doc/glibc-functions/svcerr_noproc.texi
new file mode 100644
index 00000000..604ba241
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcerr_noproc.texi
@@ -0,0 +1,16 @@
+@node svcerr_noproc
+@subsection @code{svcerr_noproc}
+@findex svcerr_noproc
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcerr_noprog.texi b/gnulib/doc/glibc-functions/svcerr_noprog.texi
new file mode 100644
index 00000000..62ae6d08
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcerr_noprog.texi
@@ -0,0 +1,16 @@
+@node svcerr_noprog
+@subsection @code{svcerr_noprog}
+@findex svcerr_noprog
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcerr_progvers.texi b/gnulib/doc/glibc-functions/svcerr_progvers.texi
new file mode 100644
index 00000000..1c480d1b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcerr_progvers.texi
@@ -0,0 +1,16 @@
+@node svcerr_progvers
+@subsection @code{svcerr_progvers}
+@findex svcerr_progvers
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcerr_systemerr.texi b/gnulib/doc/glibc-functions/svcerr_systemerr.texi
new file mode 100644
index 00000000..4e31007b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcerr_systemerr.texi
@@ -0,0 +1,16 @@
+@node svcerr_systemerr
+@subsection @code{svcerr_systemerr}
+@findex svcerr_systemerr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcerr_weakauth.texi b/gnulib/doc/glibc-functions/svcerr_weakauth.texi
new file mode 100644
index 00000000..fef140f7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcerr_weakauth.texi
@@ -0,0 +1,16 @@
+@node svcerr_weakauth
+@subsection @code{svcerr_weakauth}
+@findex svcerr_weakauth
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcraw_create.texi b/gnulib/doc/glibc-functions/svcraw_create.texi
new file mode 100644
index 00000000..d7c5a6e1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcraw_create.texi
@@ -0,0 +1,16 @@
+@node svcraw_create
+@subsection @code{svcraw_create}
+@findex svcraw_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svctcp_create.texi b/gnulib/doc/glibc-functions/svctcp_create.texi
new file mode 100644
index 00000000..10533c7b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svctcp_create.texi
@@ -0,0 +1,16 @@
+@node svctcp_create
+@subsection @code{svctcp_create}
+@findex svctcp_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcudp_bufcreate.texi b/gnulib/doc/glibc-functions/svcudp_bufcreate.texi
new file mode 100644
index 00000000..cdbb22c2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcudp_bufcreate.texi
@@ -0,0 +1,16 @@
+@node svcudp_bufcreate
+@subsection @code{svcudp_bufcreate}
+@findex svcudp_bufcreate
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcudp_create.texi b/gnulib/doc/glibc-functions/svcudp_create.texi
new file mode 100644
index 00000000..360a36e7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcudp_create.texi
@@ -0,0 +1,16 @@
+@node svcudp_create
+@subsection @code{svcudp_create}
+@findex svcudp_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/svcunix_create.texi b/gnulib/doc/glibc-functions/svcunix_create.texi
new file mode 100644
index 00000000..7dbcf00b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/svcunix_create.texi
@@ -0,0 +1,16 @@
+@node svcunix_create
+@subsection @code{svcunix_create}
+@findex svcunix_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/swapoff.texi b/gnulib/doc/glibc-functions/swapoff.texi
new file mode 100644
index 00000000..6f310e51
--- /dev/null
+++ b/gnulib/doc/glibc-functions/swapoff.texi
@@ -0,0 +1,16 @@
+@node swapoff
+@subsection @code{swapoff}
+@findex swapoff
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/swapon.texi b/gnulib/doc/glibc-functions/swapon.texi
new file mode 100644
index 00000000..243dd7ed
--- /dev/null
+++ b/gnulib/doc/glibc-functions/swapon.texi
@@ -0,0 +1,16 @@
+@node swapon
+@subsection @code{swapon}
+@findex swapon
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, AIX 5.1, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sys_errlist.texi b/gnulib/doc/glibc-functions/sys_errlist.texi
new file mode 100644
index 00000000..9405d903
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sys_errlist.texi
@@ -0,0 +1,16 @@
+@node sys_errlist
+@subsection @code{sys_errlist}
+@findex sys_errlist
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sys_nerr.texi b/gnulib/doc/glibc-functions/sys_nerr.texi
new file mode 100644
index 00000000..f2c21640
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sys_nerr.texi
@@ -0,0 +1,16 @@
+@node sys_nerr
+@subsection @code{sys_nerr}
+@findex sys_nerr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sys_siglist.texi b/gnulib/doc/glibc-functions/sys_siglist.texi
new file mode 100644
index 00000000..ffbe50b3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sys_siglist.texi
@@ -0,0 +1,16 @@
+@node sys_siglist
+@subsection @code{sys_siglist}
+@findex sys_siglist
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This constant is missing on some platforms:
+MacOS X 10.3, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/syscall.texi b/gnulib/doc/glibc-functions/syscall.texi
new file mode 100644
index 00000000..b2abba3b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/syscall.texi
@@ -0,0 +1,16 @@
+@node syscall
+@subsection @code{syscall}
+@findex syscall
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sysctl.texi b/gnulib/doc/glibc-functions/sysctl.texi
new file mode 100644
index 00000000..65db296f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sysctl.texi
@@ -0,0 +1,16 @@
+@node sysctl
+@subsection @code{sysctl}
+@findex sysctl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 5.3, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sysinfo.texi b/gnulib/doc/glibc-functions/sysinfo.texi
new file mode 100644
index 00000000..fa2bea55
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sysinfo.texi
@@ -0,0 +1,16 @@
+@node sysinfo
+@subsection @code{sysinfo}
+@findex sysinfo
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/sysv_signal.texi b/gnulib/doc/glibc-functions/sysv_signal.texi
new file mode 100644
index 00000000..9989a18b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/sysv_signal.texi
@@ -0,0 +1,16 @@
+@node sysv_signal
+@subsection @code{sysv_signal}
+@findex sysv_signal
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/tdestroy.texi b/gnulib/doc/glibc-functions/tdestroy.texi
new file mode 100644
index 00000000..1d38aac0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/tdestroy.texi
@@ -0,0 +1,16 @@
+@node tdestroy
+@subsection @code{tdestroy}
+@findex tdestroy
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/textdomain.texi b/gnulib/doc/glibc-functions/textdomain.texi
new file mode 100644
index 00000000..936f1fdc
--- /dev/null
+++ b/gnulib/doc/glibc-functions/textdomain.texi
@@ -0,0 +1,16 @@
+@node textdomain
+@subsection @code{textdomain}
+@findex textdomain
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/timegm.texi b/gnulib/doc/glibc-functions/timegm.texi
new file mode 100644
index 00000000..679cdb07
--- /dev/null
+++ b/gnulib/doc/glibc-functions/timegm.texi
@@ -0,0 +1,16 @@
+@node timegm
+@subsection @code{timegm}
+@findex timegm
+
+Gnulib module: timegm
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/timelocal.texi b/gnulib/doc/glibc-functions/timelocal.texi
new file mode 100644
index 00000000..30ab7d19
--- /dev/null
+++ b/gnulib/doc/glibc-functions/timelocal.texi
@@ -0,0 +1,16 @@
+@node timelocal
+@subsection @code{timelocal}
+@findex timelocal
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/tmpnam_r.texi b/gnulib/doc/glibc-functions/tmpnam_r.texi
new file mode 100644
index 00000000..2269bbe5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/tmpnam_r.texi
@@ -0,0 +1,16 @@
+@node tmpnam_r
+@subsection @code{tmpnam_r}
+@findex tmpnam_r
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ttyslot.texi b/gnulib/doc/glibc-functions/ttyslot.texi
new file mode 100644
index 00000000..3b125ca6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ttyslot.texi
@@ -0,0 +1,16 @@
+@node ttyslot
+@subsection @code{ttyslot}
+@findex ttyslot
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ulckpwdf.texi b/gnulib/doc/glibc-functions/ulckpwdf.texi
new file mode 100644
index 00000000..20bf08c6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ulckpwdf.texi
@@ -0,0 +1,16 @@
+@node ulckpwdf
+@subsection @code{ulckpwdf}
+@findex ulckpwdf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/umount.texi b/gnulib/doc/glibc-functions/umount.texi
new file mode 100644
index 00000000..3273cee8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/umount.texi
@@ -0,0 +1,16 @@
+@node umount
+@subsection @code{umount}
+@findex umount
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/umount2.texi b/gnulib/doc/glibc-functions/umount2.texi
new file mode 100644
index 00000000..da8a9193
--- /dev/null
+++ b/gnulib/doc/glibc-functions/umount2.texi
@@ -0,0 +1,16 @@
+@node umount2
+@subsection @code{umount2}
+@findex umount2
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/updwtmp.texi b/gnulib/doc/glibc-functions/updwtmp.texi
new file mode 100644
index 00000000..834b7011
--- /dev/null
+++ b/gnulib/doc/glibc-functions/updwtmp.texi
@@ -0,0 +1,16 @@
+@node updwtmp
+@subsection @code{updwtmp}
+@findex updwtmp
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, OSF/1 5.1, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/updwtmpx.texi b/gnulib/doc/glibc-functions/updwtmpx.texi
new file mode 100644
index 00000000..d6b4ec67
--- /dev/null
+++ b/gnulib/doc/glibc-functions/updwtmpx.texi
@@ -0,0 +1,17 @@
+@node updwtmpx
+@subsection @code{updwtmpx}
+@findex updwtmpx
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1,
+Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/user2netname.texi b/gnulib/doc/glibc-functions/user2netname.texi
new file mode 100644
index 00000000..64cb702f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/user2netname.texi
@@ -0,0 +1,16 @@
+@node user2netname
+@subsection @code{user2netname}
+@findex user2netname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ustat.texi b/gnulib/doc/glibc-functions/ustat.texi
new file mode 100644
index 00000000..ec3bf989
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ustat.texi
@@ -0,0 +1,16 @@
+@node ustat
+@subsection @code{ustat}
+@findex ustat
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/utmpname.texi b/gnulib/doc/glibc-functions/utmpname.texi
new file mode 100644
index 00000000..c30d6ff8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/utmpname.texi
@@ -0,0 +1,16 @@
+@node utmpname
+@subsection @code{utmpname}
+@findex utmpname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/utmpxname.texi b/gnulib/doc/glibc-functions/utmpxname.texi
new file mode 100644
index 00000000..13e0f83f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/utmpxname.texi
@@ -0,0 +1,16 @@
+@node utmpxname
+@subsection @code{utmpxname}
+@findex utmpxname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/valloc.texi b/gnulib/doc/glibc-functions/valloc.texi
new file mode 100644
index 00000000..079b53c9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/valloc.texi
@@ -0,0 +1,16 @@
+@node valloc
+@subsection @code{valloc}
+@findex valloc
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/vasprintf.texi b/gnulib/doc/glibc-functions/vasprintf.texi
new file mode 100644
index 00000000..9462ea63
--- /dev/null
+++ b/gnulib/doc/glibc-functions/vasprintf.texi
@@ -0,0 +1,16 @@
+@node vasprintf
+@subsection @code{vasprintf}
+@findex vasprintf
+
+Gnulib module: vasprintf
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-functions/verr.texi b/gnulib/doc/glibc-functions/verr.texi
new file mode 100644
index 00000000..29d62ea9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/verr.texi
@@ -0,0 +1,16 @@
+@node verr
+@subsection @code{verr}
+@findex verr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/verrx.texi b/gnulib/doc/glibc-functions/verrx.texi
new file mode 100644
index 00000000..8720ba57
--- /dev/null
+++ b/gnulib/doc/glibc-functions/verrx.texi
@@ -0,0 +1,16 @@
+@node verrx
+@subsection @code{verrx}
+@findex verrx
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/versionsort.texi b/gnulib/doc/glibc-functions/versionsort.texi
new file mode 100644
index 00000000..e4324943
--- /dev/null
+++ b/gnulib/doc/glibc-functions/versionsort.texi
@@ -0,0 +1,16 @@
+@node versionsort
+@subsection @code{versionsort}
+@findex versionsort
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/vhangup.texi b/gnulib/doc/glibc-functions/vhangup.texi
new file mode 100644
index 00000000..65198131
--- /dev/null
+++ b/gnulib/doc/glibc-functions/vhangup.texi
@@ -0,0 +1,16 @@
+@node vhangup
+@subsection @code{vhangup}
+@findex vhangup
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, OSF/1 5.1, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/vlimit.texi b/gnulib/doc/glibc-functions/vlimit.texi
new file mode 100644
index 00000000..d8ae2bc2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/vlimit.texi
@@ -0,0 +1,16 @@
+@node vlimit
+@subsection @code{vlimit}
+@findex vlimit
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/vm86.texi b/gnulib/doc/glibc-functions/vm86.texi
new file mode 100644
index 00000000..a43110f6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/vm86.texi
@@ -0,0 +1,16 @@
+@node vm86
+@subsection @code{vm86}
+@findex vm86
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/vsyslog.texi b/gnulib/doc/glibc-functions/vsyslog.texi
new file mode 100644
index 00000000..f73c7a1a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/vsyslog.texi
@@ -0,0 +1,16 @@
+@node vsyslog
+@subsection @code{vsyslog}
+@findex vsyslog
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, OSF/1 5.1, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/vtimes.texi b/gnulib/doc/glibc-functions/vtimes.texi
new file mode 100644
index 00000000..d9d916d3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/vtimes.texi
@@ -0,0 +1,16 @@
+@node vtimes
+@subsection @code{vtimes}
+@findex vtimes
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/vwarn.texi b/gnulib/doc/glibc-functions/vwarn.texi
new file mode 100644
index 00000000..0ffc761f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/vwarn.texi
@@ -0,0 +1,16 @@
+@node vwarn
+@subsection @code{vwarn}
+@findex vwarn
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/vwarnx.texi b/gnulib/doc/glibc-functions/vwarnx.texi
new file mode 100644
index 00000000..8561c6d2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/vwarnx.texi
@@ -0,0 +1,16 @@
+@node vwarnx
+@subsection @code{vwarnx}
+@findex vwarnx
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wait3.texi b/gnulib/doc/glibc-functions/wait3.texi
new file mode 100644
index 00000000..f3bde6ce
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wait3.texi
@@ -0,0 +1,16 @@
+@node wait3
+@subsection @code{wait3}
+@findex wait3
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wait4.texi b/gnulib/doc/glibc-functions/wait4.texi
new file mode 100644
index 00000000..2783022e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wait4.texi
@@ -0,0 +1,16 @@
+@node wait4
+@subsection @code{wait4}
+@findex wait4
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, HP-UX 11, IRIX 6.5, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/warn.texi b/gnulib/doc/glibc-functions/warn.texi
new file mode 100644
index 00000000..93266b1e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/warn.texi
@@ -0,0 +1,16 @@
+@node warn
+@subsection @code{warn}
+@findex warn
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/warnx.texi b/gnulib/doc/glibc-functions/warnx.texi
new file mode 100644
index 00000000..441f7ea0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/warnx.texi
@@ -0,0 +1,16 @@
+@node warnx
+@subsection @code{warnx}
+@findex warnx
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcschrnul.texi b/gnulib/doc/glibc-functions/wcschrnul.texi
new file mode 100644
index 00000000..908cd2d3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcschrnul.texi
@@ -0,0 +1,19 @@
+@node wcschrnul
+@subsection @code{wcschrnul}
+@findex wcschrnul
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcsftime_l.texi b/gnulib/doc/glibc-functions/wcsftime_l.texi
new file mode 100644
index 00000000..557651da
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcsftime_l.texi
@@ -0,0 +1,19 @@
+@node wcsftime_l
+@subsection @code{wcsftime_l}
+@findex wcsftime_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstod_l.texi b/gnulib/doc/glibc-functions/wcstod_l.texi
new file mode 100644
index 00000000..a938fbc4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstod_l.texi
@@ -0,0 +1,19 @@
+@node wcstod_l
+@subsection @code{wcstod_l}
+@findex wcstod_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstof_l.texi b/gnulib/doc/glibc-functions/wcstof_l.texi
new file mode 100644
index 00000000..09eb9056
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstof_l.texi
@@ -0,0 +1,19 @@
+@node wcstof_l
+@subsection @code{wcstof_l}
+@findex wcstof_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstol_l.texi b/gnulib/doc/glibc-functions/wcstol_l.texi
new file mode 100644
index 00000000..f123a98d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstol_l.texi
@@ -0,0 +1,19 @@
+@node wcstol_l
+@subsection @code{wcstol_l}
+@findex wcstol_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstold_l.texi b/gnulib/doc/glibc-functions/wcstold_l.texi
new file mode 100644
index 00000000..da240f12
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstold_l.texi
@@ -0,0 +1,19 @@
+@node wcstold_l
+@subsection @code{wcstold_l}
+@findex wcstold_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstoll_l.texi b/gnulib/doc/glibc-functions/wcstoll_l.texi
new file mode 100644
index 00000000..86736f31
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstoll_l.texi
@@ -0,0 +1,19 @@
+@node wcstoll_l
+@subsection @code{wcstoll_l}
+@findex wcstoll_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstoq.texi b/gnulib/doc/glibc-functions/wcstoq.texi
new file mode 100644
index 00000000..cb5cbe21
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstoq.texi
@@ -0,0 +1,19 @@
+@node wcstoq
+@subsection @code{wcstoq}
+@findex wcstoq
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstoul_l.texi b/gnulib/doc/glibc-functions/wcstoul_l.texi
new file mode 100644
index 00000000..7c7e9214
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstoul_l.texi
@@ -0,0 +1,19 @@
+@node wcstoul_l
+@subsection @code{wcstoul_l}
+@findex wcstoul_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstoull_l.texi b/gnulib/doc/glibc-functions/wcstoull_l.texi
new file mode 100644
index 00000000..aec551cb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstoull_l.texi
@@ -0,0 +1,19 @@
+@node wcstoull_l
+@subsection @code{wcstoull_l}
+@findex wcstoull_l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wcstouq.texi b/gnulib/doc/glibc-functions/wcstouq.texi
new file mode 100644
index 00000000..9ae3f1a9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wcstouq.texi
@@ -0,0 +1,19 @@
+@node wcstouq
+@subsection @code{wcstouq}
+@findex wcstouq
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/wmempcpy.texi b/gnulib/doc/glibc-functions/wmempcpy.texi
new file mode 100644
index 00000000..6d76ccb1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/wmempcpy.texi
@@ -0,0 +1,19 @@
+@node wmempcpy
+@subsection @code{wmempcpy}
+@findex wmempcpy
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_array.texi b/gnulib/doc/glibc-functions/xdr_array.texi
new file mode 100644
index 00000000..c94bfea2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_array.texi
@@ -0,0 +1,16 @@
+@node xdr_array
+@subsection @code{xdr_array}
+@findex xdr_array
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_authunix_parms.texi b/gnulib/doc/glibc-functions/xdr_authunix_parms.texi
new file mode 100644
index 00000000..7d368c26
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_authunix_parms.texi
@@ -0,0 +1,16 @@
+@node xdr_authunix_parms
+@subsection @code{xdr_authunix_parms}
+@findex xdr_authunix_parms
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_bool.texi b/gnulib/doc/glibc-functions/xdr_bool.texi
new file mode 100644
index 00000000..714b2ed7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_bool.texi
@@ -0,0 +1,16 @@
+@node xdr_bool
+@subsection @code{xdr_bool}
+@findex xdr_bool
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_bytes.texi b/gnulib/doc/glibc-functions/xdr_bytes.texi
new file mode 100644
index 00000000..9dcfab07
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_bytes.texi
@@ -0,0 +1,16 @@
+@node xdr_bytes
+@subsection @code{xdr_bytes}
+@findex xdr_bytes
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_callhdr.texi b/gnulib/doc/glibc-functions/xdr_callhdr.texi
new file mode 100644
index 00000000..c8a10f6e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_callhdr.texi
@@ -0,0 +1,16 @@
+@node xdr_callhdr
+@subsection @code{xdr_callhdr}
+@findex xdr_callhdr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_callmsg.texi b/gnulib/doc/glibc-functions/xdr_callmsg.texi
new file mode 100644
index 00000000..68fe40b7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_callmsg.texi
@@ -0,0 +1,16 @@
+@node xdr_callmsg
+@subsection @code{xdr_callmsg}
+@findex xdr_callmsg
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_cback_data.texi b/gnulib/doc/glibc-functions/xdr_cback_data.texi
new file mode 100644
index 00000000..3f57d28e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_cback_data.texi
@@ -0,0 +1,16 @@
+@node xdr_cback_data
+@subsection @code{xdr_cback_data}
+@findex xdr_cback_data
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_char.texi b/gnulib/doc/glibc-functions/xdr_char.texi
new file mode 100644
index 00000000..fd30ae60
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_char.texi
@@ -0,0 +1,16 @@
+@node xdr_char
+@subsection @code{xdr_char}
+@findex xdr_char
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_cryptkeyarg.texi b/gnulib/doc/glibc-functions/xdr_cryptkeyarg.texi
new file mode 100644
index 00000000..bc3d68a6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_cryptkeyarg.texi
@@ -0,0 +1,16 @@
+@node xdr_cryptkeyarg
+@subsection @code{xdr_cryptkeyarg}
+@findex xdr_cryptkeyarg
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_cryptkeyarg2.texi b/gnulib/doc/glibc-functions/xdr_cryptkeyarg2.texi
new file mode 100644
index 00000000..38f74e05
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_cryptkeyarg2.texi
@@ -0,0 +1,16 @@
+@node xdr_cryptkeyarg2
+@subsection @code{xdr_cryptkeyarg2}
+@findex xdr_cryptkeyarg2
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_cryptkeyres.texi b/gnulib/doc/glibc-functions/xdr_cryptkeyres.texi
new file mode 100644
index 00000000..5b56bd8c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_cryptkeyres.texi
@@ -0,0 +1,16 @@
+@node xdr_cryptkeyres
+@subsection @code{xdr_cryptkeyres}
+@findex xdr_cryptkeyres
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_des_block.texi b/gnulib/doc/glibc-functions/xdr_des_block.texi
new file mode 100644
index 00000000..d8862dbf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_des_block.texi
@@ -0,0 +1,16 @@
+@node xdr_des_block
+@subsection @code{xdr_des_block}
+@findex xdr_des_block
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_domainname.texi b/gnulib/doc/glibc-functions/xdr_domainname.texi
new file mode 100644
index 00000000..8f9e18c9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_domainname.texi
@@ -0,0 +1,16 @@
+@node xdr_domainname
+@subsection @code{xdr_domainname}
+@findex xdr_domainname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_double.texi b/gnulib/doc/glibc-functions/xdr_double.texi
new file mode 100644
index 00000000..ff31c630
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_double.texi
@@ -0,0 +1,16 @@
+@node xdr_double
+@subsection @code{xdr_double}
+@findex xdr_double
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_enum.texi b/gnulib/doc/glibc-functions/xdr_enum.texi
new file mode 100644
index 00000000..1f27a063
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_enum.texi
@@ -0,0 +1,16 @@
+@node xdr_enum
+@subsection @code{xdr_enum}
+@findex xdr_enum
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_float.texi b/gnulib/doc/glibc-functions/xdr_float.texi
new file mode 100644
index 00000000..7c8efe22
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_float.texi
@@ -0,0 +1,16 @@
+@node xdr_float
+@subsection @code{xdr_float}
+@findex xdr_float
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_free.texi b/gnulib/doc/glibc-functions/xdr_free.texi
new file mode 100644
index 00000000..705ba756
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_free.texi
@@ -0,0 +1,16 @@
+@node xdr_free
+@subsection @code{xdr_free}
+@findex xdr_free
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_getcredres.texi b/gnulib/doc/glibc-functions/xdr_getcredres.texi
new file mode 100644
index 00000000..4217a417
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_getcredres.texi
@@ -0,0 +1,16 @@
+@node xdr_getcredres
+@subsection @code{xdr_getcredres}
+@findex xdr_getcredres
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_hyper.texi b/gnulib/doc/glibc-functions/xdr_hyper.texi
new file mode 100644
index 00000000..8b94cd6c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_hyper.texi
@@ -0,0 +1,16 @@
+@node xdr_hyper
+@subsection @code{xdr_hyper}
+@findex xdr_hyper
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_int.texi b/gnulib/doc/glibc-functions/xdr_int.texi
new file mode 100644
index 00000000..f18032a9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_int.texi
@@ -0,0 +1,16 @@
+@node xdr_int
+@subsection @code{xdr_int}
+@findex xdr_int
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_int16_t.texi b/gnulib/doc/glibc-functions/xdr_int16_t.texi
new file mode 100644
index 00000000..fb63a354
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_int16_t.texi
@@ -0,0 +1,16 @@
+@node xdr_int16_t
+@subsection @code{xdr_int16_t}
+@findex xdr_int16_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_int32_t.texi b/gnulib/doc/glibc-functions/xdr_int32_t.texi
new file mode 100644
index 00000000..a7d9665a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_int32_t.texi
@@ -0,0 +1,16 @@
+@node xdr_int32_t
+@subsection @code{xdr_int32_t}
+@findex xdr_int32_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_int64_t.texi b/gnulib/doc/glibc-functions/xdr_int64_t.texi
new file mode 100644
index 00000000..77448dce
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_int64_t.texi
@@ -0,0 +1,16 @@
+@node xdr_int64_t
+@subsection @code{xdr_int64_t}
+@findex xdr_int64_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_int8_t.texi b/gnulib/doc/glibc-functions/xdr_int8_t.texi
new file mode 100644
index 00000000..a2ae2fc7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_int8_t.texi
@@ -0,0 +1,16 @@
+@node xdr_int8_t
+@subsection @code{xdr_int8_t}
+@findex xdr_int8_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_key_netstarg.texi b/gnulib/doc/glibc-functions/xdr_key_netstarg.texi
new file mode 100644
index 00000000..c1948b5b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_key_netstarg.texi
@@ -0,0 +1,16 @@
+@node xdr_key_netstarg
+@subsection @code{xdr_key_netstarg}
+@findex xdr_key_netstarg
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_key_netstres.texi b/gnulib/doc/glibc-functions/xdr_key_netstres.texi
new file mode 100644
index 00000000..59d5ef00
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_key_netstres.texi
@@ -0,0 +1,16 @@
+@node xdr_key_netstres
+@subsection @code{xdr_key_netstres}
+@findex xdr_key_netstres
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_keybuf.texi b/gnulib/doc/glibc-functions/xdr_keybuf.texi
new file mode 100644
index 00000000..c07f7f84
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_keybuf.texi
@@ -0,0 +1,16 @@
+@node xdr_keybuf
+@subsection @code{xdr_keybuf}
+@findex xdr_keybuf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_keydat.texi b/gnulib/doc/glibc-functions/xdr_keydat.texi
new file mode 100644
index 00000000..ddf40b16
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_keydat.texi
@@ -0,0 +1,16 @@
+@node xdr_keydat
+@subsection @code{xdr_keydat}
+@findex xdr_keydat
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_keystatus.texi b/gnulib/doc/glibc-functions/xdr_keystatus.texi
new file mode 100644
index 00000000..5235d704
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_keystatus.texi
@@ -0,0 +1,16 @@
+@node xdr_keystatus
+@subsection @code{xdr_keystatus}
+@findex xdr_keystatus
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_long.texi b/gnulib/doc/glibc-functions/xdr_long.texi
new file mode 100644
index 00000000..863beb98
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_long.texi
@@ -0,0 +1,16 @@
+@node xdr_long
+@subsection @code{xdr_long}
+@findex xdr_long
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_longlong_t.texi b/gnulib/doc/glibc-functions/xdr_longlong_t.texi
new file mode 100644
index 00000000..89e59aad
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_longlong_t.texi
@@ -0,0 +1,16 @@
+@node xdr_longlong_t
+@subsection @code{xdr_longlong_t}
+@findex xdr_longlong_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_mapname.texi b/gnulib/doc/glibc-functions/xdr_mapname.texi
new file mode 100644
index 00000000..543d152d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_mapname.texi
@@ -0,0 +1,16 @@
+@node xdr_mapname
+@subsection @code{xdr_mapname}
+@findex xdr_mapname
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_netnamestr.texi b/gnulib/doc/glibc-functions/xdr_netnamestr.texi
new file mode 100644
index 00000000..17c83e74
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_netnamestr.texi
@@ -0,0 +1,16 @@
+@node xdr_netnamestr
+@subsection @code{xdr_netnamestr}
+@findex xdr_netnamestr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_netobj.texi b/gnulib/doc/glibc-functions/xdr_netobj.texi
new file mode 100644
index 00000000..285d89c5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_netobj.texi
@@ -0,0 +1,16 @@
+@node xdr_netobj
+@subsection @code{xdr_netobj}
+@findex xdr_netobj
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_obj_p.texi b/gnulib/doc/glibc-functions/xdr_obj_p.texi
new file mode 100644
index 00000000..0aaf976e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_obj_p.texi
@@ -0,0 +1,16 @@
+@node xdr_obj_p
+@subsection @code{xdr_obj_p}
+@findex xdr_obj_p
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_opaque.texi b/gnulib/doc/glibc-functions/xdr_opaque.texi
new file mode 100644
index 00000000..7c7dfb08
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_opaque.texi
@@ -0,0 +1,16 @@
+@node xdr_opaque
+@subsection @code{xdr_opaque}
+@findex xdr_opaque
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_opaque_auth.texi b/gnulib/doc/glibc-functions/xdr_opaque_auth.texi
new file mode 100644
index 00000000..f54c2155
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_opaque_auth.texi
@@ -0,0 +1,16 @@
+@node xdr_opaque_auth
+@subsection @code{xdr_opaque_auth}
+@findex xdr_opaque_auth
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_peername.texi b/gnulib/doc/glibc-functions/xdr_peername.texi
new file mode 100644
index 00000000..bf7e315e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_peername.texi
@@ -0,0 +1,16 @@
+@node xdr_peername
+@subsection @code{xdr_peername}
+@findex xdr_peername
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_pmap.texi b/gnulib/doc/glibc-functions/xdr_pmap.texi
new file mode 100644
index 00000000..42856f12
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_pmap.texi
@@ -0,0 +1,16 @@
+@node xdr_pmap
+@subsection @code{xdr_pmap}
+@findex xdr_pmap
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_pmaplist.texi b/gnulib/doc/glibc-functions/xdr_pmaplist.texi
new file mode 100644
index 00000000..3ef99212
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_pmaplist.texi
@@ -0,0 +1,16 @@
+@node xdr_pmaplist
+@subsection @code{xdr_pmaplist}
+@findex xdr_pmaplist
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_pointer.texi b/gnulib/doc/glibc-functions/xdr_pointer.texi
new file mode 100644
index 00000000..e2c06281
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_pointer.texi
@@ -0,0 +1,16 @@
+@node xdr_pointer
+@subsection @code{xdr_pointer}
+@findex xdr_pointer
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_quad_t.texi b/gnulib/doc/glibc-functions/xdr_quad_t.texi
new file mode 100644
index 00000000..16c392f9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_quad_t.texi
@@ -0,0 +1,16 @@
+@node xdr_quad_t
+@subsection @code{xdr_quad_t}
+@findex xdr_quad_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_reference.texi b/gnulib/doc/glibc-functions/xdr_reference.texi
new file mode 100644
index 00000000..4a9451cb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_reference.texi
@@ -0,0 +1,16 @@
+@node xdr_reference
+@subsection @code{xdr_reference}
+@findex xdr_reference
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_replymsg.texi b/gnulib/doc/glibc-functions/xdr_replymsg.texi
new file mode 100644
index 00000000..c6960e9b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_replymsg.texi
@@ -0,0 +1,16 @@
+@node xdr_replymsg
+@subsection @code{xdr_replymsg}
+@findex xdr_replymsg
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_rmtcall_args.texi b/gnulib/doc/glibc-functions/xdr_rmtcall_args.texi
new file mode 100644
index 00000000..a8358e73
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_rmtcall_args.texi
@@ -0,0 +1,16 @@
+@node xdr_rmtcall_args
+@subsection @code{xdr_rmtcall_args}
+@findex xdr_rmtcall_args
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_rmtcallres.texi b/gnulib/doc/glibc-functions/xdr_rmtcallres.texi
new file mode 100644
index 00000000..274547e9
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_rmtcallres.texi
@@ -0,0 +1,16 @@
+@node xdr_rmtcallres
+@subsection @code{xdr_rmtcallres}
+@findex xdr_rmtcallres
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_short.texi b/gnulib/doc/glibc-functions/xdr_short.texi
new file mode 100644
index 00000000..5ec9b5f5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_short.texi
@@ -0,0 +1,16 @@
+@node xdr_short
+@subsection @code{xdr_short}
+@findex xdr_short
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_sizeof.texi b/gnulib/doc/glibc-functions/xdr_sizeof.texi
new file mode 100644
index 00000000..7d9fbe90
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_sizeof.texi
@@ -0,0 +1,16 @@
+@node xdr_sizeof
+@subsection @code{xdr_sizeof}
+@findex xdr_sizeof
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_string.texi b/gnulib/doc/glibc-functions/xdr_string.texi
new file mode 100644
index 00000000..484a1870
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_string.texi
@@ -0,0 +1,16 @@
+@node xdr_string
+@subsection @code{xdr_string}
+@findex xdr_string
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_u_char.texi b/gnulib/doc/glibc-functions/xdr_u_char.texi
new file mode 100644
index 00000000..52fbe958
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_u_char.texi
@@ -0,0 +1,16 @@
+@node xdr_u_char
+@subsection @code{xdr_u_char}
+@findex xdr_u_char
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_u_hyper.texi b/gnulib/doc/glibc-functions/xdr_u_hyper.texi
new file mode 100644
index 00000000..4fa2722b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_u_hyper.texi
@@ -0,0 +1,16 @@
+@node xdr_u_hyper
+@subsection @code{xdr_u_hyper}
+@findex xdr_u_hyper
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, IRIX 5.3, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_u_int.texi b/gnulib/doc/glibc-functions/xdr_u_int.texi
new file mode 100644
index 00000000..7b50785f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_u_int.texi
@@ -0,0 +1,16 @@
+@node xdr_u_int
+@subsection @code{xdr_u_int}
+@findex xdr_u_int
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_u_long.texi b/gnulib/doc/glibc-functions/xdr_u_long.texi
new file mode 100644
index 00000000..3709082d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_u_long.texi
@@ -0,0 +1,16 @@
+@node xdr_u_long
+@subsection @code{xdr_u_long}
+@findex xdr_u_long
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_u_longlong_t.texi b/gnulib/doc/glibc-functions/xdr_u_longlong_t.texi
new file mode 100644
index 00000000..03a431ff
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_u_longlong_t.texi
@@ -0,0 +1,16 @@
+@node xdr_u_longlong_t
+@subsection @code{xdr_u_longlong_t}
+@findex xdr_u_longlong_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_u_quad_t.texi b/gnulib/doc/glibc-functions/xdr_u_quad_t.texi
new file mode 100644
index 00000000..cc89a289
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_u_quad_t.texi
@@ -0,0 +1,16 @@
+@node xdr_u_quad_t
+@subsection @code{xdr_u_quad_t}
+@findex xdr_u_quad_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_u_short.texi b/gnulib/doc/glibc-functions/xdr_u_short.texi
new file mode 100644
index 00000000..9e3acbd5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_u_short.texi
@@ -0,0 +1,16 @@
+@node xdr_u_short
+@subsection @code{xdr_u_short}
+@findex xdr_u_short
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_uint16_t.texi b/gnulib/doc/glibc-functions/xdr_uint16_t.texi
new file mode 100644
index 00000000..487974de
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_uint16_t.texi
@@ -0,0 +1,16 @@
+@node xdr_uint16_t
+@subsection @code{xdr_uint16_t}
+@findex xdr_uint16_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_uint32_t.texi b/gnulib/doc/glibc-functions/xdr_uint32_t.texi
new file mode 100644
index 00000000..cb9cc1fe
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_uint32_t.texi
@@ -0,0 +1,16 @@
+@node xdr_uint32_t
+@subsection @code{xdr_uint32_t}
+@findex xdr_uint32_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_uint64_t.texi b/gnulib/doc/glibc-functions/xdr_uint64_t.texi
new file mode 100644
index 00000000..552be106
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_uint64_t.texi
@@ -0,0 +1,16 @@
+@node xdr_uint64_t
+@subsection @code{xdr_uint64_t}
+@findex xdr_uint64_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_uint8_t.texi b/gnulib/doc/glibc-functions/xdr_uint8_t.texi
new file mode 100644
index 00000000..a4b73337
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_uint8_t.texi
@@ -0,0 +1,16 @@
+@node xdr_uint8_t
+@subsection @code{xdr_uint8_t}
+@findex xdr_uint8_t
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_union.texi b/gnulib/doc/glibc-functions/xdr_union.texi
new file mode 100644
index 00000000..0d8b461b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_union.texi
@@ -0,0 +1,16 @@
+@node xdr_union
+@subsection @code{xdr_union}
+@findex xdr_union
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_unixcred.texi b/gnulib/doc/glibc-functions/xdr_unixcred.texi
new file mode 100644
index 00000000..ec56c4c0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_unixcred.texi
@@ -0,0 +1,16 @@
+@node xdr_unixcred
+@subsection @code{xdr_unixcred}
+@findex xdr_unixcred
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_valdat.texi b/gnulib/doc/glibc-functions/xdr_valdat.texi
new file mode 100644
index 00000000..34fc2b41
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_valdat.texi
@@ -0,0 +1,16 @@
+@node xdr_valdat
+@subsection @code{xdr_valdat}
+@findex xdr_valdat
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_vector.texi b/gnulib/doc/glibc-functions/xdr_vector.texi
new file mode 100644
index 00000000..1d49c556
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_vector.texi
@@ -0,0 +1,16 @@
+@node xdr_vector
+@subsection @code{xdr_vector}
+@findex xdr_vector
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_void.texi b/gnulib/doc/glibc-functions/xdr_void.texi
new file mode 100644
index 00000000..9f391076
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_void.texi
@@ -0,0 +1,16 @@
+@node xdr_void
+@subsection @code{xdr_void}
+@findex xdr_void
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_wrapstring.texi b/gnulib/doc/glibc-functions/xdr_wrapstring.texi
new file mode 100644
index 00000000..28eb949f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_wrapstring.texi
@@ -0,0 +1,16 @@
+@node xdr_wrapstring
+@subsection @code{xdr_wrapstring}
+@findex xdr_wrapstring
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_yp_buf.texi b/gnulib/doc/glibc-functions/xdr_yp_buf.texi
new file mode 100644
index 00000000..1e5b5850
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_yp_buf.texi
@@ -0,0 +1,16 @@
+@node xdr_yp_buf
+@subsection @code{xdr_yp_buf}
+@findex xdr_yp_buf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypall.texi b/gnulib/doc/glibc-functions/xdr_ypall.texi
new file mode 100644
index 00000000..c58255f7
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypall.texi
@@ -0,0 +1,16 @@
+@node xdr_ypall
+@subsection @code{xdr_ypall}
+@findex xdr_ypall
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypbind_binding.texi b/gnulib/doc/glibc-functions/xdr_ypbind_binding.texi
new file mode 100644
index 00000000..a8dc96eb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypbind_binding.texi
@@ -0,0 +1,16 @@
+@node xdr_ypbind_binding
+@subsection @code{xdr_ypbind_binding}
+@findex xdr_ypbind_binding
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypbind_resp.texi b/gnulib/doc/glibc-functions/xdr_ypbind_resp.texi
new file mode 100644
index 00000000..435bbcb2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypbind_resp.texi
@@ -0,0 +1,16 @@
+@node xdr_ypbind_resp
+@subsection @code{xdr_ypbind_resp}
+@findex xdr_ypbind_resp
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypbind_resptype.texi b/gnulib/doc/glibc-functions/xdr_ypbind_resptype.texi
new file mode 100644
index 00000000..39ef6827
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypbind_resptype.texi
@@ -0,0 +1,16 @@
+@node xdr_ypbind_resptype
+@subsection @code{xdr_ypbind_resptype}
+@findex xdr_ypbind_resptype
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypbind_setdom.texi b/gnulib/doc/glibc-functions/xdr_ypbind_setdom.texi
new file mode 100644
index 00000000..e689efdb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypbind_setdom.texi
@@ -0,0 +1,16 @@
+@node xdr_ypbind_setdom
+@subsection @code{xdr_ypbind_setdom}
+@findex xdr_ypbind_setdom
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypdelete_args.texi b/gnulib/doc/glibc-functions/xdr_ypdelete_args.texi
new file mode 100644
index 00000000..6d0d45ae
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypdelete_args.texi
@@ -0,0 +1,16 @@
+@node xdr_ypdelete_args
+@subsection @code{xdr_ypdelete_args}
+@findex xdr_ypdelete_args
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypmap_parms.texi b/gnulib/doc/glibc-functions/xdr_ypmap_parms.texi
new file mode 100644
index 00000000..f4ddb37f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypmap_parms.texi
@@ -0,0 +1,16 @@
+@node xdr_ypmap_parms
+@subsection @code{xdr_ypmap_parms}
+@findex xdr_ypmap_parms
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypmaplist.texi b/gnulib/doc/glibc-functions/xdr_ypmaplist.texi
new file mode 100644
index 00000000..a148e7c3
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypmaplist.texi
@@ -0,0 +1,16 @@
+@node xdr_ypmaplist
+@subsection @code{xdr_ypmaplist}
+@findex xdr_ypmaplist
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_yppush_status.texi b/gnulib/doc/glibc-functions/xdr_yppush_status.texi
new file mode 100644
index 00000000..129c1ad6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_yppush_status.texi
@@ -0,0 +1,16 @@
+@node xdr_yppush_status
+@subsection @code{xdr_yppush_status}
+@findex xdr_yppush_status
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_yppushresp_xfr.texi b/gnulib/doc/glibc-functions/xdr_yppushresp_xfr.texi
new file mode 100644
index 00000000..3a369d0c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_yppushresp_xfr.texi
@@ -0,0 +1,16 @@
+@node xdr_yppushresp_xfr
+@subsection @code{xdr_yppushresp_xfr}
+@findex xdr_yppushresp_xfr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypreq_key.texi b/gnulib/doc/glibc-functions/xdr_ypreq_key.texi
new file mode 100644
index 00000000..a5b3a47a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypreq_key.texi
@@ -0,0 +1,16 @@
+@node xdr_ypreq_key
+@subsection @code{xdr_ypreq_key}
+@findex xdr_ypreq_key
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypreq_nokey.texi b/gnulib/doc/glibc-functions/xdr_ypreq_nokey.texi
new file mode 100644
index 00000000..52891e0f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypreq_nokey.texi
@@ -0,0 +1,16 @@
+@node xdr_ypreq_nokey
+@subsection @code{xdr_ypreq_nokey}
+@findex xdr_ypreq_nokey
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypreq_xfr.texi b/gnulib/doc/glibc-functions/xdr_ypreq_xfr.texi
new file mode 100644
index 00000000..73c66a3c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypreq_xfr.texi
@@ -0,0 +1,16 @@
+@node xdr_ypreq_xfr
+@subsection @code{xdr_ypreq_xfr}
+@findex xdr_ypreq_xfr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypresp_all.texi b/gnulib/doc/glibc-functions/xdr_ypresp_all.texi
new file mode 100644
index 00000000..542d6776
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypresp_all.texi
@@ -0,0 +1,16 @@
+@node xdr_ypresp_all
+@subsection @code{xdr_ypresp_all}
+@findex xdr_ypresp_all
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypresp_key_val.texi b/gnulib/doc/glibc-functions/xdr_ypresp_key_val.texi
new file mode 100644
index 00000000..3d4a22da
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypresp_key_val.texi
@@ -0,0 +1,16 @@
+@node xdr_ypresp_key_val
+@subsection @code{xdr_ypresp_key_val}
+@findex xdr_ypresp_key_val
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypresp_maplist.texi b/gnulib/doc/glibc-functions/xdr_ypresp_maplist.texi
new file mode 100644
index 00000000..b15bbbdd
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypresp_maplist.texi
@@ -0,0 +1,16 @@
+@node xdr_ypresp_maplist
+@subsection @code{xdr_ypresp_maplist}
+@findex xdr_ypresp_maplist
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypresp_master.texi b/gnulib/doc/glibc-functions/xdr_ypresp_master.texi
new file mode 100644
index 00000000..63f84d65
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypresp_master.texi
@@ -0,0 +1,16 @@
+@node xdr_ypresp_master
+@subsection @code{xdr_ypresp_master}
+@findex xdr_ypresp_master
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypresp_order.texi b/gnulib/doc/glibc-functions/xdr_ypresp_order.texi
new file mode 100644
index 00000000..e40e47e2
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypresp_order.texi
@@ -0,0 +1,16 @@
+@node xdr_ypresp_order
+@subsection @code{xdr_ypresp_order}
+@findex xdr_ypresp_order
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypresp_val.texi b/gnulib/doc/glibc-functions/xdr_ypresp_val.texi
new file mode 100644
index 00000000..5f7c365a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypresp_val.texi
@@ -0,0 +1,16 @@
+@node xdr_ypresp_val
+@subsection @code{xdr_ypresp_val}
+@findex xdr_ypresp_val
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypresp_xfr.texi b/gnulib/doc/glibc-functions/xdr_ypresp_xfr.texi
new file mode 100644
index 00000000..225710fe
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypresp_xfr.texi
@@ -0,0 +1,16 @@
+@node xdr_ypresp_xfr
+@subsection @code{xdr_ypresp_xfr}
+@findex xdr_ypresp_xfr
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypstat.texi b/gnulib/doc/glibc-functions/xdr_ypstat.texi
new file mode 100644
index 00000000..e4f899e1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypstat.texi
@@ -0,0 +1,16 @@
+@node xdr_ypstat
+@subsection @code{xdr_ypstat}
+@findex xdr_ypstat
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypupdate_args.texi b/gnulib/doc/glibc-functions/xdr_ypupdate_args.texi
new file mode 100644
index 00000000..83a9dc46
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypupdate_args.texi
@@ -0,0 +1,16 @@
+@node xdr_ypupdate_args
+@subsection @code{xdr_ypupdate_args}
+@findex xdr_ypupdate_args
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdr_ypxfrstat.texi b/gnulib/doc/glibc-functions/xdr_ypxfrstat.texi
new file mode 100644
index 00000000..4525ad1e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdr_ypxfrstat.texi
@@ -0,0 +1,16 @@
+@node xdr_ypxfrstat
+@subsection @code{xdr_ypxfrstat}
+@findex xdr_ypxfrstat
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdrmem_create.texi b/gnulib/doc/glibc-functions/xdrmem_create.texi
new file mode 100644
index 00000000..106ddf9f
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdrmem_create.texi
@@ -0,0 +1,16 @@
+@node xdrmem_create
+@subsection @code{xdrmem_create}
+@findex xdrmem_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdrrec_create.texi b/gnulib/doc/glibc-functions/xdrrec_create.texi
new file mode 100644
index 00000000..d02b1d9b
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdrrec_create.texi
@@ -0,0 +1,16 @@
+@node xdrrec_create
+@subsection @code{xdrrec_create}
+@findex xdrrec_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdrrec_endofrecord.texi b/gnulib/doc/glibc-functions/xdrrec_endofrecord.texi
new file mode 100644
index 00000000..b2a027e1
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdrrec_endofrecord.texi
@@ -0,0 +1,16 @@
+@node xdrrec_endofrecord
+@subsection @code{xdrrec_endofrecord}
+@findex xdrrec_endofrecord
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdrrec_eof.texi b/gnulib/doc/glibc-functions/xdrrec_eof.texi
new file mode 100644
index 00000000..65b186cf
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdrrec_eof.texi
@@ -0,0 +1,16 @@
+@node xdrrec_eof
+@subsection @code{xdrrec_eof}
+@findex xdrrec_eof
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdrrec_skiprecord.texi b/gnulib/doc/glibc-functions/xdrrec_skiprecord.texi
new file mode 100644
index 00000000..9d6636ba
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdrrec_skiprecord.texi
@@ -0,0 +1,16 @@
+@node xdrrec_skiprecord
+@subsection @code{xdrrec_skiprecord}
+@findex xdrrec_skiprecord
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xdrstdio_create.texi b/gnulib/doc/glibc-functions/xdrstdio_create.texi
new file mode 100644
index 00000000..01ce39d5
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xdrstdio_create.texi
@@ -0,0 +1,16 @@
+@node xdrstdio_create
+@subsection @code{xdrstdio_create}
+@findex xdrstdio_create
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xprt_register.texi b/gnulib/doc/glibc-functions/xprt_register.texi
new file mode 100644
index 00000000..6275c966
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xprt_register.texi
@@ -0,0 +1,16 @@
+@node xprt_register
+@subsection @code{xprt_register}
+@findex xprt_register
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/xprt_unregister.texi b/gnulib/doc/glibc-functions/xprt_unregister.texi
new file mode 100644
index 00000000..19417168
--- /dev/null
+++ b/gnulib/doc/glibc-functions/xprt_unregister.texi
@@ -0,0 +1,16 @@
+@node xprt_unregister
+@subsection @code{xprt_unregister}
+@findex xprt_unregister
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/y0f.texi b/gnulib/doc/glibc-functions/y0f.texi
new file mode 100644
index 00000000..90f61d5d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/y0f.texi
@@ -0,0 +1,16 @@
+@node y0f
+@subsection @code{y0f}
+@findex y0f
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/y0l.texi b/gnulib/doc/glibc-functions/y0l.texi
new file mode 100644
index 00000000..7132d02c
--- /dev/null
+++ b/gnulib/doc/glibc-functions/y0l.texi
@@ -0,0 +1,16 @@
+@node y0l
+@subsection @code{y0l}
+@findex y0l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/y1f.texi b/gnulib/doc/glibc-functions/y1f.texi
new file mode 100644
index 00000000..bd8deceb
--- /dev/null
+++ b/gnulib/doc/glibc-functions/y1f.texi
@@ -0,0 +1,16 @@
+@node y1f
+@subsection @code{y1f}
+@findex y1f
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/y1l.texi b/gnulib/doc/glibc-functions/y1l.texi
new file mode 100644
index 00000000..bb597980
--- /dev/null
+++ b/gnulib/doc/glibc-functions/y1l.texi
@@ -0,0 +1,16 @@
+@node y1l
+@subsection @code{y1l}
+@findex y1l
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ynf.texi b/gnulib/doc/glibc-functions/ynf.texi
new file mode 100644
index 00000000..638203e8
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ynf.texi
@@ -0,0 +1,16 @@
+@node ynf
+@subsection @code{ynf}
+@findex ynf
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11, IRIX 6.5, mingw.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ynl.texi b/gnulib/doc/glibc-functions/ynl.texi
new file mode 100644
index 00000000..aaa3ac40
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ynl.texi
@@ -0,0 +1,16 @@
+@node ynl
+@subsection @code{ynl}
+@findex ynl
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_all.texi b/gnulib/doc/glibc-functions/yp_all.texi
new file mode 100644
index 00000000..605f77ab
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_all.texi
@@ -0,0 +1,16 @@
+@node yp_all
+@subsection @code{yp_all}
+@findex yp_all
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_bind.texi b/gnulib/doc/glibc-functions/yp_bind.texi
new file mode 100644
index 00000000..bcdd3c49
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_bind.texi
@@ -0,0 +1,16 @@
+@node yp_bind
+@subsection @code{yp_bind}
+@findex yp_bind
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_first.texi b/gnulib/doc/glibc-functions/yp_first.texi
new file mode 100644
index 00000000..5fd01806
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_first.texi
@@ -0,0 +1,16 @@
+@node yp_first
+@subsection @code{yp_first}
+@findex yp_first
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_get_default_domain.texi b/gnulib/doc/glibc-functions/yp_get_default_domain.texi
new file mode 100644
index 00000000..38a17914
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_get_default_domain.texi
@@ -0,0 +1,16 @@
+@node yp_get_default_domain
+@subsection @code{yp_get_default_domain}
+@findex yp_get_default_domain
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_master.texi b/gnulib/doc/glibc-functions/yp_master.texi
new file mode 100644
index 00000000..7830fb6a
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_master.texi
@@ -0,0 +1,16 @@
+@node yp_master
+@subsection @code{yp_master}
+@findex yp_master
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_match.texi b/gnulib/doc/glibc-functions/yp_match.texi
new file mode 100644
index 00000000..18f80eec
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_match.texi
@@ -0,0 +1,16 @@
+@node yp_match
+@subsection @code{yp_match}
+@findex yp_match
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_next.texi b/gnulib/doc/glibc-functions/yp_next.texi
new file mode 100644
index 00000000..1a46e6b6
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_next.texi
@@ -0,0 +1,16 @@
+@node yp_next
+@subsection @code{yp_next}
+@findex yp_next
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_order.texi b/gnulib/doc/glibc-functions/yp_order.texi
new file mode 100644
index 00000000..bd9e1e71
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_order.texi
@@ -0,0 +1,16 @@
+@node yp_order
+@subsection @code{yp_order}
+@findex yp_order
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_unbind.texi b/gnulib/doc/glibc-functions/yp_unbind.texi
new file mode 100644
index 00000000..f018dcc0
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_unbind.texi
@@ -0,0 +1,16 @@
+@node yp_unbind
+@subsection @code{yp_unbind}
+@findex yp_unbind
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yp_update.texi b/gnulib/doc/glibc-functions/yp_update.texi
new file mode 100644
index 00000000..afb4d9f4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yp_update.texi
@@ -0,0 +1,16 @@
+@node yp_update
+@subsection @code{yp_update}
+@findex yp_update
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ypbinderr_string.texi b/gnulib/doc/glibc-functions/ypbinderr_string.texi
new file mode 100644
index 00000000..caf90b8d
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ypbinderr_string.texi
@@ -0,0 +1,16 @@
+@node ypbinderr_string
+@subsection @code{ypbinderr_string}
+@findex ypbinderr_string
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/yperr_string.texi b/gnulib/doc/glibc-functions/yperr_string.texi
new file mode 100644
index 00000000..83b7eba4
--- /dev/null
+++ b/gnulib/doc/glibc-functions/yperr_string.texi
@@ -0,0 +1,16 @@
+@node yperr_string
+@subsection @code{yperr_string}
+@findex yperr_string
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-functions/ypprot_err.texi b/gnulib/doc/glibc-functions/ypprot_err.texi
new file mode 100644
index 00000000..09de491e
--- /dev/null
+++ b/gnulib/doc/glibc-functions/ypprot_err.texi
@@ -0,0 +1,16 @@
+@node ypprot_err
+@subsection @code{ypprot_err}
+@findex ypprot_err
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/a.out.texi b/gnulib/doc/glibc-headers/a.out.texi
new file mode 100644
index 00000000..c4cdc927
--- /dev/null
+++ b/gnulib/doc/glibc-headers/a.out.texi
@@ -0,0 +1,22 @@
+@node a.out.h
+@section @file{a.out.h}
+
+Describes the structure of executables (and object files?) in the old
+@code{a.out} format.
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, Solaris 10, mingw, Interix 3.5, BeOS.
+@item
+This header file is useless because most executables and object files are
+in ELF format on some platforms:
+glibc 2.3.6, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/aliases.texi b/gnulib/doc/glibc-headers/aliases.texi
new file mode 100644
index 00000000..48d86ac8
--- /dev/null
+++ b/gnulib/doc/glibc-headers/aliases.texi
@@ -0,0 +1,26 @@
+@node aliases.h
+@section @file{aliases.h}
+
+Defines the type @code{struct aliasent} and declares the functions
+@code{setaliasent}, @code{endaliasent},
+@code{getaliasent}, @code{getaliasent_r},
+@code{getaliasbyname}, @code{getaliasbyname_r}.
+
+Documentation:
+@itemize
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/setaliasent.3.html,,man setaliasent}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/alloca.texi b/gnulib/doc/glibc-headers/alloca.texi
new file mode 100644
index 00000000..c23248be
--- /dev/null
+++ b/gnulib/doc/glibc-headers/alloca.texi
@@ -0,0 +1,30 @@
+@node alloca.h
+@section @file{alloca.h}
+
+Declares the @code{alloca} function of function-like macro.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Variable Size Automatic,,Automatic Storage with Variable Size,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Variable-Size-Automatic.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/alloca.3.html,,man alloca}.
+@end itemize
+
+Gnulib module: alloca
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/ar.texi b/gnulib/doc/glibc-headers/ar.texi
new file mode 100644
index 00000000..5b353c5d
--- /dev/null
+++ b/gnulib/doc/glibc-headers/ar.texi
@@ -0,0 +1,19 @@
+@node ar.h
+@section @file{ar.h}
+
+Describes the structure of files produced by the @samp{ar} program.
+Defines the type @code{struct ar_hdr} and the macros @code{ARMAG},
+@code{SARMAG}, @code{ARFMAG}.
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/argp.texi b/gnulib/doc/glibc-headers/argp.texi
new file mode 100644
index 00000000..5c983b76
--- /dev/null
+++ b/gnulib/doc/glibc-headers/argp.texi
@@ -0,0 +1,26 @@
+@node argp.h
+@section @file{argp.h}
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Argp,,Parsing Program Options with Argp,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Argp.html}.
+@end ifnotinfo
+@end itemize
+
+Gnulib module: argp
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/argz.texi b/gnulib/doc/glibc-headers/argz.texi
new file mode 100644
index 00000000..3720e04d
--- /dev/null
+++ b/gnulib/doc/glibc-headers/argz.texi
@@ -0,0 +1,31 @@
+@node argz.h
+@section @file{argz.h}
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Argz Functions,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Argz-Functions.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/argz.3.html,,man argz}.
+@end itemize
+
+Gnulib module: argz
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@item
+The argz functions do not work on some platforms:
+Cygwin.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/byteswap.texi b/gnulib/doc/glibc-headers/byteswap.texi
new file mode 100644
index 00000000..d85a8f3c
--- /dev/null
+++ b/gnulib/doc/glibc-headers/byteswap.texi
@@ -0,0 +1,18 @@
+@node byteswap.h
+@section @file{byteswap.h}
+
+Defines the functions or function-like macros @code{bswap_16}, @code{bswap_32},
+@code{bswap_64}.
+
+Gnulib module: byteswap
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/crypt.texi b/gnulib/doc/glibc-headers/crypt.texi
new file mode 100644
index 00000000..0ea31139
--- /dev/null
+++ b/gnulib/doc/glibc-headers/crypt.texi
@@ -0,0 +1,44 @@
+@node crypt.h
+@section @file{crypt.h}
+
+Defines the type @code{struct crypt_data} and declares the functions
+@code{crypt}, @code{crypt_r},
+@code{setkey}, @code{setkey_r},
+@code{encrypt}, @code{encrypt_r}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{crypt,,Encrypting Passwords,libc},
+@ref{DES Encryption,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/crypt.html},
+@url{http://www.gnu.org/software/libc/manual/html_node/DES-Encryption.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/crypt.3.html,,man crypt},
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/encrypt.3.html,,man encrypt}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, mingw, Interix 3.5, BeOS.
+@item
+The functions @code{crypt}, @code{setkey}, @code{encrypt} are missing on some
+platforms:
+HP-UX 11, OSF/1 5.1.
+@item
+The type @code{struct crypt_data} and the functions @code{crypt_r},
+@code{setkey_r}, @code{encrypt_r} are missing on some platforms:
+IRIX 6.5, Solaris 10, Cygwin.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/endian.texi b/gnulib/doc/glibc-headers/endian.texi
new file mode 100644
index 00000000..28dd8733
--- /dev/null
+++ b/gnulib/doc/glibc-headers/endian.texi
@@ -0,0 +1,19 @@
+@node endian.h
+@section @file{endian.h}
+
+Describe's the platform's endianness (byte ordering of words stored in memory).
+Defines the macros @code{BYTE_ORDER}, @code{LITTLE_ENDIAN}, @code{BIG_ENDIAN},
+@code{PDP_ENDIAN}.
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/envz.texi b/gnulib/doc/glibc-headers/envz.texi
new file mode 100644
index 00000000..c0679780
--- /dev/null
+++ b/gnulib/doc/glibc-headers/envz.texi
@@ -0,0 +1,28 @@
+@node envz.h
+@section @file{envz.h}
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Envz Functions,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Envz-Functions.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/envz.3.html,,man envz}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/err.texi b/gnulib/doc/glibc-headers/err.texi
new file mode 100644
index 00000000..a4235ce9
--- /dev/null
+++ b/gnulib/doc/glibc-headers/err.texi
@@ -0,0 +1,32 @@
+@node err.h
+@section @file{err.h}
+
+Declares the functions
+@code{warn}, @code{vwarn}, @code{warnx}, @code{vwarnx},
+@code{err}, @code{verr}, @code{errx}, @code{verrx}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Error Messages,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Error-Messages.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/err.3.html,,man err}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/error.texi b/gnulib/doc/glibc-headers/error.texi
new file mode 100644
index 00000000..7a437974
--- /dev/null
+++ b/gnulib/doc/glibc-headers/error.texi
@@ -0,0 +1,32 @@
+@node error.h
+@section @file{error.h}
+
+Declares the functions @code{error}, @code{error_at_line} and the variables
+@code{error_print_progname}, @code{error_message_count},
+@code{error_one_per_line}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Error Messages,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Error-Messages.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/error.3.html,,man error}.
+@end itemize
+
+Gnulib module: error
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/execinfo.texi b/gnulib/doc/glibc-headers/execinfo.texi
new file mode 100644
index 00000000..a2e722bd
--- /dev/null
+++ b/gnulib/doc/glibc-headers/execinfo.texi
@@ -0,0 +1,31 @@
+@node execinfo.h
+@section @file{execinfo.h}
+
+Declares the functions @code{backtrace}, @code{backtrace_symbols},
+@code{backtrace_symbols_fd}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Backtraces,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Backtraces.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/backtrace.3.html,,man backtrace}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/fpu_control.texi b/gnulib/doc/glibc-headers/fpu_control.texi
new file mode 100644
index 00000000..6187d5f2
--- /dev/null
+++ b/gnulib/doc/glibc-headers/fpu_control.texi
@@ -0,0 +1,19 @@
+@node fpu_control.h
+@section @file{fpu_control.h}
+
+Handling of the FPU control word. Defines the @code{fpu_control_t} type,
+declares the @code{__fpu_control} variable, and defines the @code{_FPU_GETCW},
+@code{_FPU_SETCW} macros.
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/fstab.texi b/gnulib/doc/glibc-headers/fstab.texi
new file mode 100644
index 00000000..426ff609
--- /dev/null
+++ b/gnulib/doc/glibc-headers/fstab.texi
@@ -0,0 +1,36 @@
+@node fstab.h
+@section @file{fstab.h}
+
+Defines the type @code{struct fstab}, the macros @code{FSTAB_*},
+@code{_PATH_FSTAB}, and declares the functions
+@code{setfsent}, @code{endfsent},
+@code{getfsent}, @code{getfsspec}, @code{getfsfile}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{fstab,,The `fstab' file,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/fstab.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/setfsent.3.html,,man setfsent}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+The macro @code{_PATH_FSTAB} is missing on some platforms:
+AIX 5.1, HP-UX 11.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/fts.texi b/gnulib/doc/glibc-headers/fts.texi
new file mode 100644
index 00000000..2190de8d
--- /dev/null
+++ b/gnulib/doc/glibc-headers/fts.texi
@@ -0,0 +1,25 @@
+@node fts.h
+@section @file{fts.h}
+
+Defines the types @code{FTS}, @code{FTSENT} and the macros @code{FTS_*},
+and declares the functions @code{fts_open}, @code{fts_read},
+@code{fts_children}, @code{fts_set}, @code{fts_close}.
+
+Documentation:
+@itemize
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/fts.3.html,,man fts}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/getopt.texi b/gnulib/doc/glibc-headers/getopt.texi
new file mode 100644
index 00000000..eb14f8b8
--- /dev/null
+++ b/gnulib/doc/glibc-headers/getopt.texi
@@ -0,0 +1,45 @@
+@node getopt.h
+@section @file{getopt.h}
+
+Defines the type @code{struct option} and declares the variables
+@code{optarg}, @code{optind}, @code{opterr}, @code{optopt}
+and the functions @code{getopt}, @code{getopt_long}, @code{getopt_long_only}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Getopt,,Parsing program options using `getopt',libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Getopt.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/getopt.3.html,,man getopt}.
+@end itemize
+
+Gnulib module: getopt-gnu
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+AIX 5.1, HP-UX 11, Interix 3.5.
+@item
+The function @code{getopt_long} is missing on some platforms:
+IRIX 6.5, OSF/1 5.1, Solaris 9.
+@item
+The function @code{getopt_long_only} is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw.
+@item
+The method to reset options is incompatible on some platforms:
+FreeBSD 6.0, NetBSD 3.0(?), OpenBSD 3.8, Cygwin 1.5.x, mingw.
+@item
+The function @code{getopt} does not handle a leading @samp{+} character in
+the options string on some platforms:
+Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/ieee754.texi b/gnulib/doc/glibc-headers/ieee754.texi
new file mode 100644
index 00000000..1132f945
--- /dev/null
+++ b/gnulib/doc/glibc-headers/ieee754.texi
@@ -0,0 +1,18 @@
+@node ieee754.h
+@section @file{ieee754.h}
+
+Defines the types @code{union ieee754_float}, @code{union ieee754_double},
+@code{union ieee854_long_double}.
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/ifaddrs.texi b/gnulib/doc/glibc-headers/ifaddrs.texi
new file mode 100644
index 00000000..7856ce88
--- /dev/null
+++ b/gnulib/doc/glibc-headers/ifaddrs.texi
@@ -0,0 +1,24 @@
+@node ifaddrs.h
+@section @file{ifaddrs.h}
+
+Defines the type @code{struct ifaddrs} and declares the functions
+@code{getifaddrs}, @code{freeifaddrs}.
+
+Documentation:
+@itemize
+@item
+@url{http://ecos.sourceware.org/docs-latest/ref/net-common-tcpip-manpages-getifaddrs.html}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/libintl.texi b/gnulib/doc/glibc-headers/libintl.texi
new file mode 100644
index 00000000..e4b12635
--- /dev/null
+++ b/gnulib/doc/glibc-headers/libintl.texi
@@ -0,0 +1,43 @@
+@node libintl.h
+@section @file{libintl.h}
+
+Defines the macros @code{__USE_GNU_GETTEXT},
+@code{__GNU_GETTEXT_SUPPORTED_REVISION}, and declares the functions
+@code{gettext}, @code{dgettext}, @code{dcgettext},
+@code{ngettext}, @code{dngettext}, @code{dcngettext},
+@code{textdomain}, @code{bindtextdomain}, @code{bind_textdomain_codeset}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Message catalogs with gettext,,The `gettext' family of functions,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Message-catalogs-with-gettext.html},
+@end ifnotinfo
+@item
+@ifinfo
+@ref{gettext,,,gettext},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/gettext/manual/html_node/gettext.html}.
+@end ifnotinfo
+@end itemize
+
+Gnulib module: gettext
+
+Portability problems fixed by Gnulib, if GNU gettext is installed:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw, Interix 3.5, BeOS.
+@item
+The functions cannot deal with GNU .mo files with system-dependent strings
+(of major version 1 or of minor version 1) on some non-glibc platforms:
+NetBSD 3.0, Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/mcheck.texi b/gnulib/doc/glibc-headers/mcheck.texi
new file mode 100644
index 00000000..28e0581f
--- /dev/null
+++ b/gnulib/doc/glibc-headers/mcheck.texi
@@ -0,0 +1,30 @@
+@node mcheck.h
+@section @file{mcheck.h}
+
+Defines the type @code{enum mcheck_status} and declares the functions
+@code{mcheck}, @code{mcheck_pedantic}, @code{mcheck_check_all}, @code{mprobe},
+@code{mtrace}, @code{muntrace}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Heap Consistency Checking,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html}.
+@end ifnotinfo
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/mntent.texi b/gnulib/doc/glibc-headers/mntent.texi
new file mode 100644
index 00000000..0067a2da
--- /dev/null
+++ b/gnulib/doc/glibc-headers/mntent.texi
@@ -0,0 +1,38 @@
+@node mntent.h
+@section @file{mntent.h}
+
+Defines the type @code{struct mntent} and the macros @code{MNTTAB},
+@code{MOUNTED}, @code{MNTTYPE_*}, @code{MNTOPT_*}, and declares the functions
+@code{setmntent}, @code{getmntent}, @code{getmntent_r}, @code{addmntent},
+@code{endmntent}, @code{hasmntopt}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{mtab,,The `mtab' file,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/mtab.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/setmntent.3.html,,man setmntent}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@item
+The function @code{getmntent_r} is missing on all non-glibc platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Cygwin.
+@end itemize
+
+Gnulib module @code{mountlist} provides a higher-level abstraction.
diff --git a/gnulib/doc/glibc-headers/obstack.texi b/gnulib/doc/glibc-headers/obstack.texi
new file mode 100644
index 00000000..72562679
--- /dev/null
+++ b/gnulib/doc/glibc-headers/obstack.texi
@@ -0,0 +1,26 @@
+@node obstack.h
+@section @file{obstack.h}
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Obstacks,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Obstacks.html}.
+@end ifnotinfo
+@end itemize
+
+Gnulib module: obstack
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/paths.texi b/gnulib/doc/glibc-headers/paths.texi
new file mode 100644
index 00000000..ce5a0cc0
--- /dev/null
+++ b/gnulib/doc/glibc-headers/paths.texi
@@ -0,0 +1,19 @@
+@node paths.h
+@section @file{paths.h}
+
+Defines the macros @code{_PATH_*}.
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+HP-UX 11, Solaris 10, mingw, BeOS.
+@item
+The set of @code{_PATH_*} macros is platform dependent.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/printf.texi b/gnulib/doc/glibc-headers/printf.texi
new file mode 100644
index 00000000..74f9b60a
--- /dev/null
+++ b/gnulib/doc/glibc-headers/printf.texi
@@ -0,0 +1,32 @@
+@node printf.h
+@section @file{printf.h}
+
+Defines the type @code{struct printf_info} and the macros and enum values
+@code{PA_*}, and declares the functions
+@code{printf_function}, @code{printf_arginfo_function},
+@code{register_printf_function}, @code{parse_printf_format},
+@code{printf_size}, @code{printf_size_info}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Parsing a Template String,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Parsing-a-Template-String.html}.
+@end ifnotinfo
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/pty.texi b/gnulib/doc/glibc-headers/pty.texi
new file mode 100644
index 00000000..4e6884b9
--- /dev/null
+++ b/gnulib/doc/glibc-headers/pty.texi
@@ -0,0 +1,35 @@
+@node pty.h
+@section @file{pty.h}
+
+Declares the functions @code{openpty} and @code{forkpty}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{Pseudo-Terminal Pairs,,Opening a Pseudo-Terminal Pair,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/Pseudo_002dTerminal-Pairs.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/openpty.3.html,,man openpty}.
+@end itemize
+
+Gnulib module: pty
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms that declare the
+@code{forkpty} and @code{openpty} functions in @code{util.h} or
+@code{libutil.h} instead: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0,
+OpenBSD 3.8.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/resolv.texi b/gnulib/doc/glibc-headers/resolv.texi
new file mode 100644
index 00000000..d97958dd
--- /dev/null
+++ b/gnulib/doc/glibc-headers/resolv.texi
@@ -0,0 +1,34 @@
+@node resolv.h
+@section @file{resolv.h}
+
+Defines the types @code{res_sendhookact}, @code{res_send_qhook},
+@code{res_send_rhook}, @code{res_state}, @code{struct res_sym} and the
+macros @code{_PATH_RESCONF}, @code{RES_*}, and declares the functions
+@code{fp_nquery}, @code{fp_query},
+@code{hostalias},
+@code{p_query},
+@code{res_close}, @code{res_init}, @code{res_isourserver},
+@code{res_mkquery}, @code{res_query}, @code{res_querydomain},
+@code{res_search}, @code{res_send}.
+
+Documentation:
+@itemize
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/res_init.3.html,,man res_init}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@item
+The functions are missing on some platforms:
+HP-UX 11.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/shadow.texi b/gnulib/doc/glibc-headers/shadow.texi
new file mode 100644
index 00000000..886f6cda
--- /dev/null
+++ b/gnulib/doc/glibc-headers/shadow.texi
@@ -0,0 +1,39 @@
+@node shadow.h
+@section @file{shadow.h}
+
+Defines the type @code{struct spwd} and declares the functions
+@code{setspent}, @code{endspent},
+@code{getspent}, @code{getspent_r},
+@code{getspnam}, @code{getspnam_r},
+@code{sgetspent}, @code{sgetspent_r},
+@code{fgetspent}, @code{fgetspent_r},
+@code{putspent},
+@code{lckpwdf}, @code{ulckpwdf}.
+
+Documentation:
+@itemize
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/setspent.3.html,,man setspent}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+The functions @code{getspent_r}, @code{getspnam_r}, @code{sgetspent_r},
+@code{fgetspent}, @code{fgetspent_r}, @code{putspent} are missing on some
+platforms:
+HP-UX 11.
+@item
+The functions @code{sgetspent}, @code{sgetspent_r} are missing on some
+platforms:
+IRIX 6.5, Solaris 10.
+@end itemize
diff --git a/gnulib/doc/glibc-headers/sys_ioctl.texi b/gnulib/doc/glibc-headers/sys_ioctl.texi
new file mode 100644
index 00000000..4d615dc6
--- /dev/null
+++ b/gnulib/doc/glibc-headers/sys_ioctl.texi
@@ -0,0 +1,33 @@
+@node sys/ioctl.h
+@section @file{sys/ioctl.h}
+
+Declares the function @code{ioctl}.
+
+Documentation:
+@itemize
+@item
+@ifinfo
+@ref{IOCTLs,,,libc},
+@end ifinfo
+@ifnotinfo
+@url{http://www.gnu.org/software/libc/manual/html_node/IOCTLs.html},
+@end ifnotinfo
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man2/ioctl.2.html,,man ioctl}.
+@end itemize
+
+Gnulib module: sys_ioctl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@item
+This header file does not declare the @code{ioctl} function on some platforms:
+AIX 5.1, Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/sysexits.texi b/gnulib/doc/glibc-headers/sysexits.texi
new file mode 100644
index 00000000..3db771a5
--- /dev/null
+++ b/gnulib/doc/glibc-headers/sysexits.texi
@@ -0,0 +1,20 @@
+@node sysexits.h
+@section @file{sysexits.h}
+
+Defines the @code{EX_*} macros, including @code{EX_OK}.
+
+Gnulib module: sysexits
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@item
+The macro @code{EX_CONFIG} is missing on some platforms:
+HP-UX 11.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/glibc-headers/ttyent.texi b/gnulib/doc/glibc-headers/ttyent.texi
new file mode 100644
index 00000000..d7b65365
--- /dev/null
+++ b/gnulib/doc/glibc-headers/ttyent.texi
@@ -0,0 +1,24 @@
+@node ttyent.h
+@section @file{ttyent.h}
+
+Defines the type @code{struct ttyent} and declares the functions
+@code{setttyent}, @code{endttyent}, @code{getttyent}, @code{getttynam}.
+
+Documentation:
+@itemize
+@item
+@uref{http://www.kernel.org/doc/man-pages/online/pages/man3/setttyent.3.html,,man setttyent}.
+@end itemize
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+HP-UX 11, IRIX 6.5, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/gnu-oids.texi b/gnulib/doc/gnu-oids.texi
new file mode 100644
index 00000000..46cfd622
--- /dev/null
+++ b/gnulib/doc/gnu-oids.texi
@@ -0,0 +1,50 @@
+@c This table of OID's is included in the GNU Coding Standards.
+@c
+@c Copyright 2008, 2009 Free Software Foundation, Inc.
+@c
+@c Copying and distribution of this file, with or without modification,
+@c are permitted in any medium without royalty provided the copyright
+@c notice and this notice are preserved.
+@c
+@c When adding new OIDs, please add them also to
+@c http://www.alvestrand.no/objectid/ (except it gets an internal
+@c server error, so never mind)
+@c (Our page is http://www.alvestrand.no/objectid/1.3.6.1.4.1.11591.html.)
+
+1.3.6.1.4.1.11591 GNU
+
+1.3.6.1.4.1.11591.1 GNU Radius
+
+1.3.6.1.4.1.11591.2 GnuPG
+ 1.3.6.1.4.1.11591.2.1 notation
+ 1.3.6.1.4.1.11591.2.1.1 pkaAddress
+
+1.3.6.1.4.1.11591.3 GNU Radar
+
+1.3.6.1.4.1.11591.4 GNU GSS
+
+@c Added 2008-10-24 on request from Sergey Poznyakoff <gray@gnu.org.ua>
+1.3.6.1.4.1.11591.5 GNU Mailutils
+
+@c Added 2009-03-03 on request from Simon Josefsson <simon@josefsson.org>
+1.3.6.1.4.1.11591.5 GNU Shishi
+
+1.3.6.1.4.1.11591.12 digestAlgorithm
+ 1.3.6.1.4.1.11591.12.2 TIGER/192
+ 1.3.6.1.4.1.11591.13 encryptionAlgorithm
+ 1.3.6.1.4.1.11591.13.2 Serpent
+ 1.3.6.1.4.1.11591.13.2.1 Serpent-128-ECB
+ 1.3.6.1.4.1.11591.13.2.2 Serpent-128-CBC
+ 1.3.6.1.4.1.11591.13.2.3 Serpent-128-OFB
+ 1.3.6.1.4.1.11591.13.2.4 Serpent-128-CFB
+ 1.3.6.1.4.1.11591.13.2.21 Serpent-192-ECB
+ 1.3.6.1.4.1.11591.13.2.22 Serpent-192-CBC
+ 1.3.6.1.4.1.11591.13.2.23 Serpent-192-OFB
+ 1.3.6.1.4.1.11591.13.2.24 Serpent-192-CFB
+ 1.3.6.1.4.1.11591.13.2.41 Serpent-256-ECB
+ 1.3.6.1.4.1.11591.13.2.42 Serpent-256-CBC
+ 1.3.6.1.4.1.11591.13.2.43 Serpent-256-OFB
+ 1.3.6.1.4.1.11591.13.2.44 Serpent-256-CFB
+ 1.3.6.1.4.1.11591.14 CRC algorithms
+ 1.3.6.1.4.1.11591.14.1 CRC 32
+
diff --git a/gnulib/doc/gnulib-intro.texi b/gnulib/doc/gnulib-intro.texi
new file mode 100644
index 00000000..09ac675e
--- /dev/null
+++ b/gnulib/doc/gnulib-intro.texi
@@ -0,0 +1,337 @@
+@node Benefits
+@section Benefits of using Gnulib
+
+Gnulib is useful to enhance various aspects of a package:
+
+@itemize @bullet
+@item
+Portability: With Gnulib, a package maintainer can program against the
+POSIX and GNU libc APIs and nevertheless expect good portability to
+platforms that don't implement POSIX.
+
+@item
+Maintainability: When a package uses modules from Gnulib instead of code
+written specifically for that package, the maintainer has less code to
+maintain.
+
+@item
+Security: Gnulib provides functions that are immune against vulnerabilities
+that plague the uses of the corresponding commonplace functions. For
+example, @code{asprintf}, @code{canonicalize_file_name} are not affected
+by buffer sizing problems that affect @code{sprintf}, @code{realpath}.
+@code{openat} does not have the race conditions that @code{open} has. Etc.
+
+@item
+Reliability: Gnulib provides functions that combine a call to a system
+function with a check of the result. Examples are @code{xalloc},
+@code{xprintf}, @code{xstrtod}, @code{xgetcwd}.
+
+@item
+Structure: Gnulib offers a way to structure code into modules, typically
+one include file, one source code file, and one autoconf macro for each
+functionality. Modularity helps maintainability.
+@end itemize
+
+@node Library vs Reusable Code
+@section Library vs. Reusable Code
+
+Classical libraries are installed as binary object code. Gnulib is
+different: It is used as a source code library. Each package that uses
+Gnulib thus ships with part of the Gnulib source code. The used portion
+of Gnulib is tailored to the package: A build tool, called
+@code{gnulib-tool}, is provided that copies a tailored subset of Gnulib
+into the package.
+
+@node Portability and Application Code
+@section Portability and Application Code
+
+One of the goals of Gnulib is to make portable programming easy, on
+the basis of the standards relevant for GNU (and Unix). The objective
+behind that is to avoid a fragmentation of the user community into
+disjoint user communities according to the operating system, and
+instead allow synergies between users on different operating systems.
+
+Another goal of Gnulib is to provide application code that can be shared
+between several applications. Some people wonder: "What? glibc doesn't
+have a function to copy a file?" Indeed, the scope of a system's libc is
+to implement the relevant standards (ISO C99, POSIX:2001) and to provide
+access functions to the kernel's system calls, and little more.
+
+There is no clear borderline between both areas.
+
+For example, Gnulib has a facility for generating the name of backup
+files. While this task is entirely at the application level --- no
+standard specifies an API for it --- the na@"{@dotless{i}}ve code has
+some portability problems because on some platforms the length of file
+name components is limited to 30 characters or so. Gnulib handles
+that.
+
+Similarly, Gnulib has a facility for executing a command in a
+subprocess. It is at the same time a portability enhancement (it
+works on GNU, Unix, and Windows, compared to the classical
+@code{fork}/@code{exec} idiom which is not portable to Windows), as well
+as an application aid: it takes care of redirecting stdin and/or
+stdout if desired, and emits an error message if the subprocess
+failed.
+
+@node Modules
+@section Modules
+
+Gnulib is divided into modules. Every module implements a single
+facility. Modules can depend on other modules.
+
+A module consists of a number of files and a module description. The
+files are copied by @code{gnulib-tool} into the package that will use it,
+usually verbatim, without changes. Source code files (.h, .c files)
+reside in the @file{lib/} subdirectory. Autoconf macro files reside in
+the @file{m4/} subdirectory. Build scripts reside in the
+@file{build-aux/} subdirectory.
+
+The module description contains the list of files --- @code{gnulib-tool}
+copies these files. It contains the module's
+dependencies --- @code{gnulib-tool} installs them as well. It also
+contains the autoconf macro invocation (usually a single line or
+nothing at all) --- @code{gnulib-tool} ensures this is invoked from the
+package's @file{configure.ac} file. And also a @file{Makefile.am}
+snippet --- @code{gnulib-tool} collects these into a @file{Makefile.am}
+for the tailored Gnulib part. The module description and include file
+specification are for documentation purposes; they are combined into
+@file{MODULES.html}.
+
+The module system serves two purposes:
+
+@enumerate
+@item
+It ensures consistency of the used autoconf macros and @file{Makefile.am}
+rules with the source code. For example, source code which uses the
+@code{getopt_long} function --- this is a common way to implement parsing
+of command line options in a way that complies with the GNU standards ---
+needs the source code (@file{lib/getopt.c} and others), the autoconf macro
+which detects whether the system's libc already has this function (in
+@file{m4/getopt.m4}), and a few @file{Makefile.am} lines that create the
+substitute @file{getopt.h} if not. These three pieces belong together.
+They cannot be used without each other. The module description and
+@code{gnulib-tool} ensure that they are copied altogether into the
+destination package.
+
+@item
+It allows for scalability. It is well-known since the inception of the
+MODULA-2 language around 1978 that dissection into modules with
+dependencies allows for building large sets of code in a maintainable way.
+The maintainability comes from the facts that:
+
+@itemize @bullet
+@item
+Every module has a single purpose; you don't worry about other parts of
+the program while creating, reading or modifying the code of a module.
+
+@item
+The code you have to read in order to understand a module is limited to
+the source of the module and the .h files of the modules listed as
+dependencies. It is for this reason also that we recommend to put the
+comments describing the functions exported by a module into its .h file.
+@end itemize
+
+In other words, the module is the elementary unit of code in Gnulib,
+comparable to a class in object-oriented languages like Java or C#.
+@end enumerate
+
+The module system is the basis of @code{gnulib-tool}. When
+@code{gnulib-tool} copies a part of Gnulib into a package, it first
+compiles a module list, starting with the requested modules and adding all
+the dependencies, and then collects the files, @file{configure.ac}
+snippets and @file{Makefile.am} snippets.
+
+@node Various Kinds of Modules
+@section Various Kinds of Modules
+
+There are modules of various kinds in Gnulib. For a complete list of the
+modules, see in @file{MODULES.html}.
+
+@subsection Support for ISO C or POSIX functions.
+
+When a function is not implemented by a system, the Gnulib module provides
+an implementation under the same name. Examples are the @samp{snprintf}
+and @samp{readlink} modules.
+
+Similarly, when a function is not correctly implemented by a system,
+Gnulib provides a replacement. For functions, we use the pattern
+
+@smallexample
+#if !HAVE_WORKING_FOO
+# define foo rpl_foo
+#endif
+@end smallexample
+
+@noindent
+and implement the @code{foo} function under the name @code{rpl_foo}. This
+renaming is needed to avoid conflicts at compile time (in case the system
+header files declare @code{foo}) and at link/run time (because the code
+making use of @code{foo} could end up residing in a shared library, and
+the executable program using this library could be defining @code{foo}
+itself).
+
+For header files, such as @code{stdbool.h} or @code{stdint.h}, we provide
+the substitute only if the system doesn't provide a correct one. The
+template of this replacement is distributed in a slightly different name,
+with an added underscore, so that on systems which do provide a correct
+header file the system's one is used.
+
+@subsection Enhancements of ISO C or POSIX functions
+
+These are sometimes POSIX functions with GNU extensions also found in
+glibc --- examples: @samp{getopt}, @samp{fnmatch} --- and often new
+APIs --- for example, for all functions that allocate memory in one way
+or the other, we have variants which also include the error checking
+against the out-of-memory condition.
+
+@subsection Portable general use facilities
+
+Examples are a module for copying a file --- the portability problems
+relate to the copying of the file's modification time, access rights,
+and extended attributes --- or a module for extracting the tail
+component of a file name --- here the portability to Woe32 requires a
+different API than the classical POSIX @code{basename} function.
+
+@subsection Reusable application code
+
+Examples are an error reporting function, a module that allows output of
+numbers with K/M/G suffixes, or cryptographic facilities.
+
+@subsection Object oriented classes
+
+Examples are data structures like @samp{list}, or abstract output stream
+classes that work around the fact that an application cannot implement an
+stdio @code{FILE} with its logic. Here, while staying in C, we use
+implementation techniques like tables of function pointers, known from the
+C++ language or from the Linux kernel.
+
+@subsection Interfaces to external libraries
+
+Examples are the @samp{iconv} module, which interfaces to the
+@code{iconv} facility, regardless whether it is contained in libc or in
+an external @code{libiconv}. Or the @samp{readline} module, which
+interfaces to the GNU readline library.
+
+@subsection Build / maintenance infrastructure
+
+An example is the @samp{maintainer-makefile} module, which provides extra
+Makefile tags for maintaining a package.
+
+@node Collaborative Development
+@section Collaborative Development
+
+Gnulib is maintained collaboratively. The mailing list is
+@code{<bug-gnulib at gnu dot org>}. Be warned that some people on the
+list may be very active at some times and unresponsive at other times.
+
+Every module has one or more maintainers. While issues are discussed
+collaboratively on the list, the maintainer of a module nevertheless has
+a veto right regarding changes in his module.
+
+All patches should be posted the list, regardless whether they are
+proposed patches or whether they are committed immediately by the
+maintainer of the particular module. The purpose is not only to inform
+the other users of the module, but mainly to allow peer review. It is not
+uncommon that several people contribute comments or spot bugs after a
+patch was proposed.
+
+Conversely, if you are using Gnulib, and a patch is posted that affects
+one of the modules that your package uses, you have an interest in
+proofreading the patch.
+
+@node Copyright
+@section Copyright
+
+Most modules are under the GPL. Some, mostly modules which can
+reasonably be used in libraries, are under LGPL. The source files
+always say "GPL", but the real license specification is in the module
+description file. If the module description file says "GPL", it means
+"GPLv3+" (GPLv3 or newer, at the licensee's choice); if it says "LGPL",
+it means "LGPLv3+" (LGPLv3 or newer, at the licensee's choice).
+
+More precisely, the license specification in the module description
+file applies to the files in @file{lib/} and @file{build-aux/}. Different
+licenses apply to files in special directories:
+
+@table @file
+@item modules/
+Module description files are under this copyright:
+
+@quotation
+Copyright @copyright{} 200X-200Y Free Software Foundation, Inc.@*
+Copying and distribution of this file, with or without modification,
+in any medium, are permitted without royalty provided the copyright
+notice and this notice are preserved.
+@end quotation
+
+@item m4/
+Autoconf macro files are under this copyright:
+
+@quotation
+Copyright @copyright{} 200X-200Y Free Software Foundation, Inc.@*
+This file 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.
+@end quotation
+
+@item tests/
+If a license statement is not present in a test module, the test files are
+under GPL. Even if the corresponding source module is under LGPL, this is
+not a problem, since compiled tests are not installed by ``make install''.
+
+@item doc/
+Documentation files are under this copyright:
+
+@quotation
+Copyright @copyright{} 2004-200Y Free Software Foundation, Inc.@*
+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 quotation
+@end table
+
+If you want to use some Gnulib modules under LGPL, you can do so by
+passing the option @samp{--lgpl} to @code{gnulib-tool}. This will
+replace the GPL header with an LGPL header while copying the source
+files to your package. Similarly, if you want some Gnulib modules
+under LGPLv2+ (Lesser GPL version 2.1 or newer), you can do so by
+passing the option @samp{--lgpl=2} to @code{gnulib-tool}.
+
+Keep in mind that when you submit patches to files in Gnulib, you should
+license them under a compatible license. This means that sometimes the
+contribution will have to be LGPL, if the original file is available
+under LGPL. You can find out about it by looking for a "License: LGPL"
+information in the corresponding module description.
+
+@node Steady Development
+@section Steady Development
+
+Gnulib modules are continually adapted, to match new practices, to be
+consistent with newly added modules, or simply as a response to build
+failure reports. We don't make releases, but instead recommend to use the
+newest version of Gnulib from the Git repository, except in periods of major
+changes. The source tree can also be fetched from a read-only CVS that
+mirrors the Git repository.
+
+@node Openness
+@section Openness
+
+Gnulib is open in the sense that we gladly accept contributions if they
+are generally useful, well engineered, and if the contributors have signed
+the obligatory papers with the FSF.
+
+The module system is open in the sense that a package using Gnulib can
+@enumerate
+@item
+locally patch or override files in Gnulib,
+@item
+locally add modules that are treated like Gnulib modules by
+@code{gnulib-tool}.
+@end enumerate
+
+This is achieved by the @samp{--local-dir} option of @code{gnulib-tool}.
+
diff --git a/gnulib/doc/gnulib-tool.texi b/gnulib/doc/gnulib-tool.texi
new file mode 100644
index 00000000..39081801
--- /dev/null
+++ b/gnulib/doc/gnulib-tool.texi
@@ -0,0 +1,623 @@
+@node Invoking gnulib-tool
+@chapter Invoking gnulib-tool
+
+@c Copyright (C) 2005-2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+@pindex gnulib-tool
+@cindex invoking @command{gnulib-tool}
+
+The @command{gnulib-tool} command is the recommended way to import
+Gnulib modules. It is possible to borrow Gnulib modules in a package
+without using @command{gnulib-tool}, relying only on the
+meta-information stored in the @file{modules/*} files, but with a
+growing number of modules this becomes tedious. @command{gnulib-tool}
+simplifies the management of source files, @file{Makefile.am}s and
+@file{configure.ac} in packages incorporating Gnulib modules.
+
+@file{gnulib-tool} is not installed in a standard directory that is
+contained in the @code{PATH} variable. It needs to be run directly in
+the directory that contains the Gnulib source code. You can do this
+either by specifying the absolute filename of @file{gnulib-tool}, or
+you can also use a symbolic link from a place inside your @code{PATH}
+to the @file{gnulib-tool} file of your preferred and most up-to-date
+Gnulib checkout, like this:
+@smallexample
+$ ln -s $HOME/gnu/src/gnulib.git/gnulib-tool $HOME/bin/gnulib-tool
+@end smallexample
+
+Run @samp{gnulib-tool --help} for information. To get familiar with
+@command{gnulib-tool} without affecting your sources, you can also try
+some commands with the option @samp{--dry-run}; then
+@code{gnulib-tool} will only report which actions it would perform in
+a real run without changing anything.
+
+@menu
+* Which modules?:: Determining the needed set of Gnulib modules
+* Initial import:: First import of Gnulib modules.
+* Modified imports:: Changing the import specification.
+* Simple update:: Tracking Gnulib development.
+* Source changes:: Impact of Gnulib on your source files.
+* gettextize and autopoint:: Caveat: @code{gettextize} and @code{autopoint} users!
+* Localization:: Handling Gnulib's own message translations.
+* VCS Issues:: Integration with Version Control Systems.
+* Unit tests:: Bundling the unit tests of the Gnulib modules.
+@end menu
+
+
+@node Which modules?
+@section Finding modules
+@cindex Finding modules
+
+There are three ways of finding the names of Gnulib modules that you can use
+in your package:
+
+@itemize
+@item
+You have the complete module list, sorted according to categories, in
+@url{http://www.gnu.org/software/gnulib/MODULES.html}.
+
+@item
+If you are looking for a particular POSIX header or function replacement,
+look in the chapters @ref{Header File Substitutes} and
+@ref{Function Substitutes}. For headers and functions that are provided by
+Glibc but not standardized by POSIX, look in the chapters
+@ref{Glibc Header File Substitutes} and @ref{Glibc Function Substitutes}.
+
+@item
+If you have already found the source file in Gnulib and are looking for the
+module that contains this source file, you can use the command
+@samp{gnulib-tool --find @var{filename}}.
+@end itemize
+
+
+@node Initial import
+@section Initial import
+@cindex initial import
+
+Gnulib assumes that your project uses Autoconf. When using Gnulib, you
+will need to have Autoconf and Automake among your build tools. Note that
+while the use of Automake in your project's top level directory is an
+easy way to fulfil the Makefile conventions of the GNU coding standards,
+Gnulib does not require it. But when you use Gnulib, Automake will be
+used at least in a subdirectory of your project.
+
+Invoking @samp{gnulib-tool --import} will copy source files, create a
+@file{Makefile.am} to build them, generate a file @file{gnulib-comp.m4} with
+Autoconf M4 macro declarations used by @file{configure.ac}, and generate
+a file @file{gnulib-cache.m4} containing the cached specification of how
+Gnulib is used.
+
+Our example will be a library that uses Autoconf, Automake and
+Libtool. It calls @code{strdup}, and you wish to use gnulib to make
+the package portable to C89 and C99 (which don't have @code{strdup}).
+
+@example
+~/src/libfoo$ gnulib-tool --import strdup
+Module list with included dependencies:
+ absolute-header
+ extensions
+ strdup
+ string
+File list:
+ lib/dummy.c
+ lib/strdup.c
+ lib/string.in.h
+ m4/absolute-header.m4
+ m4/extensions.m4
+ m4/gnulib-common.m4
+ m4/strdup.m4
+ m4/string_h.m4
+Creating directory ./lib
+Creating directory ./m4
+Copying file lib/dummy.c
+Copying file lib/strdup.c
+Copying file lib/string.in.h
+Copying file m4/absolute-header.m4
+Copying file m4/extensions.m4
+Copying file m4/gnulib-common.m4
+Copying file m4/gnulib-tool.m4
+Copying file m4/strdup.m4
+Copying file m4/string_h.m4
+Creating lib/Makefile.am
+Creating m4/gnulib-cache.m4
+Creating m4/gnulib-comp.m4
+Finished.
+
+You may need to add #include directives for the following .h files.
+ #include <string.h>
+
+Don't forget to
+ - add "lib/Makefile" to AC_CONFIG_FILES in ./configure.ac,
+ - mention "lib" in SUBDIRS in Makefile.am,
+ - mention "-I m4" in ACLOCAL_AMFLAGS in Makefile.am,
+ - invoke gl_EARLY in ./configure.ac, right after AC_PROG_CC,
+ - invoke gl_INIT in ./configure.ac.
+~/src/libfoo$
+@end example
+
+By default, the source code is copied into @file{lib/} and the M4
+macros in @file{m4/}. You can override these paths by using
+@code{--source-base=DIRECTORY} and @code{--m4-base=DIRECTORY}. Some
+modules also provide other files necessary for building. These files
+are copied into the directory specified by @samp{AC_CONFIG_AUX_DIR} in
+@file{configure.ac} or by the @code{--aux-dir=DIRECTORY} option. If
+neither is specified, the current directory is assumed.
+
+@code{gnulib-tool} can make symbolic links instead of copying the
+source files. The option to specify for this is @samp{--symlink}, or
+@samp{-s} for short. This can be useful to save a few kilobytes of disk
+space. But it is likely to introduce bugs when @code{gnulib} is updated;
+it is more reliable to use @samp{gnulib-tool --update} (see below)
+to update to newer versions of @code{gnulib}. Furthermore it requires
+extra effort to create self-contained tarballs, and it may disturb some
+mechanism the maintainer applies to the sources. For these reasons,
+this option is generally discouraged.
+
+@code{gnulib-tool} will overwrite any pre-existing files, in
+particular @file{Makefile.am}. Unfortunately, separating the
+generated @file{Makefile.am} content (for building the gnulib library)
+into a separate file, say @file{gnulib.mk}, that could be included
+by your handwritten @file{Makefile.am} is not possible, due to how
+variable assignments are handled by Automake.
+
+Consequently, it is a good idea to choose directories that are not
+already used by your projects, to separate gnulib imported files from
+your own files. This approach is also useful if you want to avoid
+conflicts between other tools (e.g., @code{gettextize} that also copy
+M4 files into your package. Simon Josefsson successfully uses a source
+base of @file{gl/}, and a M4 base of @file{gl/m4/}, in several
+packages.
+
+After the @samp{--import} option on the command line comes the list of
+Gnulib modules that you want to incorporate in your package. The names
+of the modules coincide with the filenames in Gnulib's @file{modules/}
+directory.
+
+Some Gnulib modules depend on other Gnulib modules. @code{gnulib-tool}
+will automatically add the needed modules as well; you need not list
+them explicitly. @code{gnulib-tool} will also memorize which dependent
+modules it has added, so that when someday a dependency is dropped, the
+implicitly added module is dropped as well (unless you have explicitly
+requested that module).
+
+If you want to cut a dependency, i.e., not add a module although one of
+your requested modules depends on it, you may use the option
+@samp{--avoid=@var{module}} to do so. Multiple uses of this option are
+possible. Of course, you will then need to implement the same interface
+as the removed module.
+
+A few manual steps are required to finish the initial import.
+@code{gnulib-tool} printed a summary of these steps.
+
+First, you must ensure Autoconf can find the macro definitions in
+@file{gnulib-comp.m4}. Use the @code{ACLOCAL_AMFLAGS} specifier in
+your top-level @file{Makefile.am} file, as in:
+
+@example
+ACLOCAL_AMFLAGS = -I m4
+@end example
+
+You are now ready to call the M4 macros in @code{gnulib-comp.m4} from
+@file{configure.ac}. The macro @code{gl_EARLY} must be called as soon
+as possible after verifying that the C compiler is working.
+Typically, this is immediately after @code{AC_PROG_CC}, as in:
+
+@example
+...
+AC_PROG_CC
+gl_EARLY
+...
+@end example
+
+The core part of the gnulib checks are done by the macro
+@code{gl_INIT}. Place it further down in the file, typically where
+you normally check for header files or functions. It must come after
+other checks which may affect the compiler invocation, such as
+@code{AC_MINIX}. For example:
+
+@example
+...
+# For gnulib.
+gl_INIT
+...
+@end example
+
+@code{gl_INIT} will in turn call the macros related with the
+gnulib functions, be it specific gnulib macros, like @code{gl_FUNC_ALLOCA}
+or autoconf or automake macros like @code{AC_FUNC_ALLOCA} or
+@code{AM_FUNC_GETLINE}. So there is no need to call those macros yourself
+when you use the corresponding gnulib modules.
+
+You must also make sure that the gnulib library is built. Add the
+@code{Makefile} in the gnulib source base directory to
+@code{AC_CONFIG_FILES}, as in:
+
+@example
+AC_CONFIG_FILES(... lib/Makefile ...)
+@end example
+
+You must also make sure that @code{make} will recurse into the gnulib
+directory. To achieve this, add the gnulib source base directory to a
+@code{SUBDIRS} Makefile.am statement, as in:
+
+@example
+SUBDIRS = lib
+@end example
+
+or if you, more likely, already have a few entries in @code{SUBDIRS},
+you can add something like:
+
+@example
+SUBDIRS += lib
+@end example
+
+Finally, you have to add compiler and linker flags in the appropriate
+source directories, so that you can make use of the gnulib library.
+Since some modules (@samp{getopt}, for example) may copy files into
+the build directory, @file{top_builddir/lib} is needed as well
+as @file{top_srcdir/lib}. For example:
+
+@example
+...
+AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib
+...
+LDADD = lib/libgnu.a
+...
+@end example
+
+Don't forget to @code{#include} the various header files. In this
+example, you would need to make sure that @samp{#include <string.h>}
+is evaluated when compiling all source code files, that want to make
+use of @code{strdup}.
+
+In the usual case where Autoconf is creating a @file{config.h} file,
+you should include @file{config.h} first, before any other include
+file. That way, for example, if @file{config.h} defines
+@samp{restrict} to be the empty string on a pre-C99 host, or a macro
+like @samp{_FILE_OFFSET_BITS} that affects the layout of data
+structures, the definition is consistent for all include files.
+Also, on some platforms macros like @samp{_FILE_OFFSET_BITS} and
+@samp{_GNU_SOURCE} may be ineffective, or may have only a limited
+effect, if defined after the first system header file is included.
+
+Finally, note that you can not use @code{AC_LIBOBJ} or
+@code{AC_REPLACE_FUNCS} in your @file{configure.ac} and expect the
+resulting object files to be automatically added to @file{lib/libgnu.a}.
+This is because your @code{AC_LIBOBJ} and @code{AC_REPLACE_FUNCS} invocations
+from @file{configure.ac} augment a variable @code{@@LIBOBJS@@} (and/or
+@code{@@LTLIBOBJS@@} if using Libtool), whereas @file{lib/libgnu.a}
+is built from the contents of a different variable, usually
+@code{@@gl_LIBOBJS@@} (or @code{@@gl_LTLIBOBJS@@} if using Libtool).
+
+
+@node Modified imports
+@section Modified imports
+
+You can at any moment decide to use Gnulib differently than the last time.
+
+If you only want to use more Gnulib modules, simply invoke
+@command{gnulib-tool --import @var{new-modules}}. @code{gnulib-tool}
+remembers which modules were used last time. The list of modules that
+you pass after @samp{--import} is @emph{added} to the previous list of
+modules.
+
+For most changes, such as added or removed modules, or even different
+choices of @samp{--lib}, @samp{--source-base} or @samp{--aux-dir}, there
+are two ways to perform the change.
+
+The standard way is to modify manually the file @file{gnulib-cache.m4}
+in the M4 macros directory, then launch @samp{gnulib-tool --import}.
+
+The other way is to call @command{gnulib-tool} again, with the changed
+command-line options. Note that this doesn't let you remove modules,
+because as you just learned, the list of modules is always cumulated.
+Also this way is often impractical, because you don't remember the way
+you invoked @code{gnulib-tool} last time.
+
+The only change for which this doesn't work is a change of the
+@samp{--m4-base} directory. Because, when you pass a different value of
+@samp{--m4-base}, @code{gnulib-tool} will not find the previous
+@file{gnulib-cache.m4} file any more... A possible solution is to manually
+copy the @file{gnulib-cache.m4} into the new M4 macro directory.
+
+In the @file{gnulib-cache.m4}, the macros have the following meaning:
+@table @code
+@item gl_MODULES
+The argument is a space separated list of the requested modules, not including
+dependencies.
+
+@item gl_AVOID
+The argument is a space separated list of modules that should not be used,
+even if they occur as dependencies. Corresponds to the @samp{--avoid}
+command line argument.
+
+@item gl_SOURCE_BASE
+The argument is the relative file name of the directory containing the gnulib
+source files (mostly *.c and *.h files). Corresponds to the
+@samp{--source-base} command line argument.
+
+@item gl_M4_BASE
+The argument is the relative file name of the directory containing the gnulib
+M4 macros (*.m4 files). Corresponds to the @samp{--m4-base} command line
+argument.
+
+@item gl_TESTS_BASE
+The argument is the relative file name of the directory containing the gnulib
+unit test files. Corresponds to the @samp{--tests-base} command line argument.
+
+@item gl_LIB
+The argument is the name of the library to be created. Corresponds to the
+@samp{--lib} command line argument.
+
+@item gl_LGPL
+The presence of this macro without arguments corresponds to the @samp{--lgpl}
+command line argument. The presence of this macro with an argument (whose
+value must be 2 or 3) corresponds to the @samp{--lgpl=@var{arg}} command line
+argument.
+
+@item gl_LIBTOOL
+The presence of this macro corresponds to the @samp{--libtool} command line
+argument and to the absence of the @samp{--no-libtool} command line argument.
+It takes no arguments.
+
+@item gl_MACRO_PREFIX
+The argument is the prefix to use for macros in the @file{gnulib-comp.m4}
+file. Corresponds to the @samp{--macro-prefix} command line argument.
+@end table
+
+
+@node Simple update
+@section Simple update
+
+When you want to update to a more recent version of Gnulib, without
+changing the list of modules or other parameters, a simple call
+does it:
+
+@smallexample
+$ gnulib-tool --import
+@end smallexample
+
+@noindent
+This will create, update or remove files, as needed.
+
+Note: From time to time, changes are made in Gnulib that are not backward
+compatible. When updating to a more recent Gnulib, you should consult
+Gnulib's @file{NEWS} file to check whether the incompatible changes affect
+your project.
+
+
+@node Source changes
+@section Changing your sources for use with Gnulib
+
+Gnulib contains some header file overrides. This means that when building
+on systems with deficient header files in @file{/usr/include/}, it may create
+files named @file{string.h}, @file{stdlib.h}, @file{stdint.h} or similar in
+the build directory. In the other source directories of your package you
+will usually pass @samp{-I} options to the compiler, so that these Gnulib
+substitutes are visible and take precedence over the files in
+@file{/usr/include/}.
+
+These Gnulib substitute header files rely on @file{<config.h>} being
+already included. Furthermore @file{<config.h>} must be the first include
+in every compilation unit. This means that to @emph{all your source files}
+and likely also to @emph{all your tests source files} you need to add an
+@samp{#include <config.h>} at the top. Which source files are affected?
+Exactly those whose compilation includes a @samp{-I} option that refers to
+the Gnulib library directory.
+
+This is annoying, but inevitable: On many systems, @file{<config.h>} is
+used to set system dependent flags (such as @code{_GNU_SOURCE} on GNU systems),
+and these flags have no effect after any system header file has been included.
+
+
+@node gettextize and autopoint
+@section Caveat: @code{gettextize} and @code{autopoint} users
+
+@cindex gettextize, caveat
+@cindex autopoint, caveat
+The programs @code{gettextize} and @code{autopoint}, part of
+GNU @code{gettext}, import or update the internationalization infrastructure.
+Some of this infrastructure, namely ca.@: 20 autoconf macro files and the
+@file{config.rpath} file, is also contained in Gnulib and may be imported
+by @code{gnulib-tool}. The use of @code{gettextize} or @code{autopoint}
+will therefore overwrite some of the files that @code{gnulib-tool} has
+imported, and vice versa.
+
+Avoiding to use @code{gettextize} (manually, as package maintainer) or
+@code{autopoint} (as part of a script like @code{autoreconf} or
+@code{autogen.sh}) is not the solution: These programs also import the
+infrastructure in the @file{po/} and optionally in the @file{intl/} directory.
+
+The copies of the conflicting files in Gnulib are more up-to-date than
+the copies brought in by @code{gettextize} and @code{autopoint}. When a
+new @code{gettext} release is made, the copies of the files in Gnulib will
+be updated immediately.
+
+The solution is therefore:
+
+@enumerate
+@item
+When you run @code{gettextize}, always use the @code{gettextize} from the
+matching GNU gettext release. For the most recent Gnulib checkout, this is
+the newest release found on @url{http://ftp.gnu.org/gnu/gettext/}. For an
+older Gnulib snapshot, it is the release that was the most recent release
+at the time the Gnulib snapshot was taken. Then, after @code{gettextize},
+invoke @code{gnulib-tool}.
+
+@item
+When a script of yours run @code{autopoint}, invoke @code{gnulib-tool}
+afterwards.
+
+@item
+If you get an error message like
+@code{*** error: gettext infrastructure mismatch:
+using a Makefile.in.in from gettext version ...
+but the autoconf macros are from gettext version ...},
+it means that a new GNU gettext release was made, and its autoconf macros
+were integrated into Gnulib and now mismatch the @file{po/} infrastructure.
+In this case, fetch and install the new GNU gettext release and run
+@code{gettextize} followed by @code{gnulib-tool}.
+@end enumerate
+
+
+@node Localization
+@section Handling Gnulib's own message translations
+
+Gnulib provides some functions that emit translatable messages using GNU
+@code{gettext}. The @samp{gnulib} domain at the
+@url{http://translationproject.org/, Translation Project} collects
+translations of these messages, which you should incorporate into your
+own programs.
+
+There are two basic ways to achieve this. The first, and older, method
+is to list all the source files you use from Gnulib in your own
+@file{po/POTFILES.in} file. This will cause all the relevant
+translatable strings to be included in your POT file. When you send
+this POT file to the Translation Project, translators will normally fill
+in the translations of the Gnulib strings from their ``translation
+memory'', and send you back updated PO files.
+
+However, this process is error-prone: you might forget to list some
+source files, or the translator might not be using a translation memory
+and provide a different translation than another translator, or the
+translation might not be kept in sync between Gnulib and your package.
+It is also slow and causes substantial extra work, because a human
+translator must be in the loop for each language and you will need to
+incorporate their work on request.
+
+For these reasons, a new method was designed and is now recommended. If
+you pass the @code{--po-base=@var{directory}} and @code{--po-domain=@var{domain}}
+options to @code{gnulib-tool}, then @code{gnulib-tool} will create a
+separate directory with its own @file{POTFILES.in}, and fetch current
+translations directly from the Translation Project (using
+@command{rsync} or @command{wget}, whichever is available).
+The POT file in this directory will be called
+@file{@var{domain}-gnulib.pot}, depending on the @var{domain} you gave to the
+@code{--po-domain} option (typically the same as the package name).
+This causes these translations to reside in a separate message domain,
+so that they do not clash either with the translations for the main part
+of your package nor with those of other packages on the system that use
+possibly different versions of Gnulib.
+When you use these options, the functions in Gnulib are built
+in such a way that they will always use this domain regardless of the
+default domain set by @code{textdomain}.
+
+In order to use this method, you must -- in each program that might use
+Gnulib code -- add an extra line to the part of the program that
+initializes locale-dependent behavior. Where you would normally write
+something like:
+
+@example
+@group
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+@end group
+@end example
+
+@noindent
+you should add an additional @code{bindtextdomain} call to inform
+gettext of where the MO files for the extra message domain may be found:
+
+@example
+@group
+ bindtextdomain (PACKAGE "-gnulib", LOCALEDIR);
+@end group
+@end example
+
+(This example assumes that the @var{domain} that you specified
+to @code{gnulib-tool} is the same as the value of the @code{PACKAGE}
+preprocessor macro.)
+
+Since you do not change the @code{textdomain} call, the default message
+domain for your program remains the same and your own use of @code{gettext}
+functions will not be affected.
+
+
+@node VCS Issues
+@section Issues with Version Control Systems
+
+If a project stores its source files in a version control system (VCS),
+such as CVS, SVN, or Git, one needs to decide which files to commit.
+
+All files created by @code{gnulib-tool}, except @file{gnulib-cache.m4},
+should be treated like generated source files, like for example a
+@file{parser.c} file is generated from @file{parser.y}.
+
+@itemize
+
+@item
+In projects which commit all source files, whether generated or not, into
+their VCS, the @code{gnulib-tool} generated files should all be committed.
+In this case, you also pass the option @samp{--no-vc-files} to
+@code{gnulib-tool}.
+
+Gnulib also contains files generated by @command{make} (and removed by
+@code{make clean}), using information determined by @command{configure}.
+They should not be checked into the VCS, but instead added to
+@file{.gitignore} or @file{.cvsignore}.
+When you have a Gnulib source file of the form @file{lib/foo.in.h}, the
+corresponding @file{lib/foo.h} is such a file.
+
+@item
+In projects which customarily omit from their VCS all files that are generated
+from other source files, all these files and directories would not be
+added into the VCS. The only file that must be added to the VCS is
+@file{gnulib-cache.m4} in the M4 macros directory. Also, the script for
+restoring files not in the VCS, customarily called @file{autogen.sh} or
+@file{bootstrap.sh}, will typically contain the statement for restoring
+the omitted files:
+
+@smallexample
+$ gnulib-tool --update
+@end smallexample
+
+The @samp{--update} option operates much like the @samp{--import} option,
+but it does not offer the possibility to change the way Gnulib is used.
+Also it does not report in the ChangeLogs the files that it had to add
+because they were missing.
+
+@end itemize
+
+
+@node Unit tests
+@section Bundling the unit tests of the Gnulib modules
+
+You can bundle the unit tests of the Gnulib modules together with your
+package, through the @samp{--with-tests} option. Together with
+@samp{--with-tests}, you also specify the directory for these tests
+through the @samp{--tests-base} option. Of course, you need to add this
+directory to the @code{SUBDIRS} variable in the @code{Makefile.am} of
+the parent directory.
+
+The advantage of having the unit tests bundled is that when your program
+has a problem on a particular platform, running the unit tests may help
+determine quickly if the problem is on Gnulib's side or on your package's
+side. Also, it helps verifying Gnulib's portability, of course.
+
+The unit tests will be compiled and run when the user runs @samp{make check}.
+When the user runs only @samp{make}, the unit tests will not be compiled.
+
+In the @code{SUBDIRS} variable, it is useful to put the Gnulib tests directory
+after the directory containing the other tests, not before:
+
+@smallexample
+SUBDIRS = gnulib-lib src man tests gnulib-tests
+@end smallexample
+
+@noindent
+This will ensure that on platforms where there are test failures in either
+directory, users will see and report the failures from the tests of your
+program.
+
+Note: In packages which use more than one invocation of @code{gnulib-tool}
+in the scope of the same @code{configure.ac}, you cannot use
+@samp{--with-tests}. You will have to use a separate @code{configure.ac}
+in this case.
diff --git a/gnulib/doc/gnulib.texi b/gnulib/doc/gnulib.texi
new file mode 100644
index 00000000..0a846919
--- /dev/null
+++ b/gnulib/doc/gnulib.texi
@@ -0,0 +1,6388 @@
+\input texinfo @c -*-texinfo-*-
+@comment %**start of header
+@setfilename gnulib.info
+@settitle GNU Gnulib
+@syncodeindex fn cp
+@syncodeindex pg cp
+@ifclear texi2html
+@firstparagraphindent insert
+@end ifclear
+@comment %**end of header
+
+@comment Defines the UPDATED variable.
+@include updated-stamp
+
+@copying
+This manual is for GNU Gnulib (updated @value{UPDATED}),
+which is a library of common routines intended to be shared at the
+source level.
+
+Copyright @copyright{} 2004-2010 Free Software Foundation, Inc.
+
+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 copying
+
+@dircategory Software development
+@direntry
+* Gnulib: (gnulib). Source files to share among distributions.
+@end direntry
+
+@titlepage
+@title GNU Gnulib
+@subtitle updated @value{UPDATED}
+@author @email{bug-gnulib@@gnu.org}
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Gnulib
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Introduction::
+* Invoking gnulib-tool::
+* Writing modules::
+* Miscellaneous Notes::
+* POSIX Substitutes Library:: Building as a separate substitutes library.
+* Header File Substitutes:: Overriding system headers.
+* Function Substitutes:: Replacing system functions.
+* Legacy Function Substitutes:: Replacing system functions.
+* Glibc Header File Substitutes:: Overriding system headers.
+* Glibc Function Substitutes:: Replacing system functions.
+* Particular Modules:: Documentation of individual modules.
+* GNU Free Documentation License:: Copying and sharing this manual.
+* Index::
+@end menu
+
+@c This is used at the beginning of four chapters.
+@macro nosuchmodulenote{thing}
+The notation ``Gnulib module: ---'' means that Gnulib does not provide a
+module providing a substitute for the \thing\. When the list
+``Portability problems not fixed by Gnulib'' is empty, such a module is
+not needed: No portability problems are known. Otherwise, it indicates
+that such a module would be useful but is not available: No one so far
+found this \thing\ important enough to contribute a substitute for it.
+If you need this particular \thing\, you may write to
+@w{@code{<bug-gnulib at gnu dot org>}}.
+@end macro
+
+
+@node Introduction
+@chapter Introduction
+
+Gnulib is a source code library. It provides basic functionalities to
+programs and libraries. Currently (as of October 2006) more than 30
+packages make use of Gnulib.
+
+Resources:
+
+@itemize
+@item Gnulib is hosted at Savannah:
+ @url{http://savannah.gnu.org/projects/gnulib}. Get the sources
+ through Git or CVS from there.
+@item The Gnulib home page:
+ @url{http://www.gnu.org/software/gnulib/}.
+@end itemize
+
+@menu
+* Benefits::
+* Library vs Reusable Code::
+* Portability and Application Code::
+* Modules::
+* Various Kinds of Modules::
+* Collaborative Development::
+* Copyright::
+* Steady Development::
+* Openness::
+@end menu
+
+@include gnulib-intro.texi
+
+
+@include gnulib-tool.texi
+
+
+@node Writing modules
+@chapter Writing modules
+
+This chapter explains how to write modules of your own, either for your own
+package (to be used with gnulib-tool's @samp{--local-dir} option), or for
+inclusion in gnulib proper.
+
+The guidelines in this chapter do not necessarily need to be followed for
+using @code{gnulib-tool}. They merely represent a set of good practices.
+Following them will result in a good structure of your modules and in
+consistency with gnulib.
+
+@menu
+* Source code files::
+* Header files::
+* Implementation files::
+* Specification::
+* Module description::
+* Autoconf macros::
+* Unit test modules::
+* Incompatible changes::
+@end menu
+
+
+@node Source code files
+@section Source code files
+
+Every API (C functions or variables) provided should be declared in a header
+file (.h file) and implemented in one or more implementation files (.c files).
+The separation has the effect that users of your module need to read only
+the contents of the .h file and the module description in order to understand
+what the module is about and how to use it - not the entire implementation.
+Furthermore, users of your module don't need to repeat the declarations of
+the functions in their code, and are likely to receive notification through
+compiler errors if you make incompatible changes to the API (like, adding a
+parameter or changing the return type of a function).
+
+
+@node Header files
+@section Header files
+
+The .h file should declare the C functions and variables that the module
+provides.
+
+The .h file should be stand-alone. That is, it does not require other .h files
+to be included before. Rather, it includes all necessary .h files by itself.
+
+@cindex double inclusion of header files
+@cindex header file include protection
+It is a tradition to use CPP tricks to avoid parsing the same header
+file more than once, which might cause warnings. The trick is to wrap
+the content of the header file (say, @file{foo.h}) in a block, as in:
+
+@example
+#ifndef FOO_H
+# define FOO_H
+...
+body of header file goes here
+...
+#endif /* FOO_H */
+@end example
+
+Whether to use @code{FOO_H} or @code{_FOO_H} is a matter of taste and
+style. The C89 and C99 standards reserve all identifiers that begin with an
+underscore and either an uppercase letter or another underscore, for
+any use. Thus, in theory, an application might not safely assume that
+@code{_FOO_H} has not already been defined by a library. On the other
+hand, using @code{FOO_H} will likely lead the higher risk of
+collisions with other symbols (e.g., @code{KEY_H}, @code{XK_H}, @code{BPF_H},
+which are CPP macro constants, or @code{COFF_LONG_H}, which is a CPP
+macro function). Your preference may depend on whether you consider
+the header file under discussion as part of the application (which has
+its own namespace for CPP symbols) or a supporting library (that
+shouldn't interfere with the application's CPP symbol namespace).
+
+@cindex C++ header files
+@cindex Header files and C++
+Adapting C header files for use in C++ applications can use another
+CPP trick, as in:
+
+@example
+# ifdef __cplusplus
+extern "C"
+@{
+# endif
+...
+body of header file goes here
+...
+# ifdef __cplusplus
+@}
+# endif
+@end example
+
+The idea here is that @code{__cplusplus} is defined only by C++
+implementations, which will wrap the header file in an @samp{extern "C"}
+block. Again, whether to use this trick is a matter of taste and
+style. While the above can be seen as harmless, it could be argued
+that the header file is written in C, and any C++ application using it
+should explicitly use the @samp{extern "C"} block itself. Your
+preference might depend on whether you consider the API exported by
+your header file as something available for C programs only, or for C
+and C++ programs alike.
+
+Note that putting a @code{#include} in an @code{extern "C" @{ ... @}}
+block yields a syntax error in C++ mode on some platforms (e.g., glibc
+systems with g++ v3.3 to v4.2, AIX, OSF/1, IRIX). For this reason, it
+is recommended to place the @code{#include} before the @code{extern
+"C"} block.
+
+@node Implementation files
+@section Implementation files
+
+The .c file or files implement the functions and variables declared in the
+.h file.
+
+@subheading Include ordering
+
+Every implementation file must start with @samp{#include <config.h>}.
+This is necessary for activating the preprocessor macros that are defined
+on behalf of the Autoconf macros. Some of these preprocessor macros,
+such as @code{_GNU_SOURCE}, would have no effect if defined after a system
+header file has already been included.
+
+Then comes the @samp{#include "..."} specifying the header file that is
+being implemented. Putting this right after @samp{#include <config.h>}
+has the effect that it verifies that the header file is self-contained.
+
+Then come the system and application headers. It is customary to put all the
+system headers before all application headers, so as to minimize the risk
+that a preprocessor macro defined in an application header confuses the system
+headers on some platforms.
+
+In summary:
+
+@itemize
+@item
+First comes #include <config.h>.
+@item
+Second comes the #include "..." specifying the module being implemented.
+@item
+Then come all the #include <...> of system or system-replacement headers,
+in arbitrary order.
+@item
+Then come all the #include "..." of gnulib and application headers, in
+arbitrary order.
+@end itemize
+
+
+@node Specification
+@section Specification
+
+The specification of a function should answer at least the following
+questions:
+@itemize
+@item
+What is the purpose of the function?
+@item
+What are the arguments?
+@item
+What is the return value?
+@item
+What happens in case of failure? (Exit? A specific return value? Errno set?)
+@item
+Memory allocation policy: If pointers to memory are returned, are they freshly
+allocated and supposed to be freed by the caller?
+@end itemize
+
+@cindex specification
+@cindex comments describing functions
+@cindex describing functions, locating
+Where to put the specification describing exported functions? Three practices
+are used in gnulib:
+
+@itemize
+@item
+The specification can be as comments in the header file, just above the
+function declaration.
+@item
+The specification can be as comments in the implementation file, just above
+the function definition.
+@item
+The specification can be in texinfo format, so that it gets included in the
+gnulib manual.
+@end itemize
+
+In any case, the specification should appear in just one place, unless you can
+ensure that the multiple copies will always remain identical.
+
+The advantage of putting it in the header file is that the user only has to
+read the include file normally never needs to peek into the implementation
+file(s).
+
+The advantage of putting it in the implementation file is that when reviewing
+or changing the implementation, you have both elements side by side.
+
+The advantage of texinfo formatted documentation is that it is easily
+published in HTML or Info format.
+
+Currently (as of 2010), half of gnulib uses the first practice, nearly half
+of gnulib uses the second practice, and a small minority uses the texinfo
+practice.
+
+
+@node Module description
+@section Module description
+
+For the module description, you can start from an existing module's
+description, or from a blank one: @file{module/TEMPLATE} for a normal module,
+or @file{module/TEMPLATE-TESTS} for a unit test module. Some more fields
+are possible but rarely used. Use @file{module/TEMPLATE-EXTENDED} if you
+want to use one of them.
+
+Module descriptions have the following fields. Absent fields are equivalent
+to fields with empty contents.
+
+@table @asis
+@item Description
+This field should contain a concise description of the module's functionality.
+One sentence is enough. For example, if it defines a single function
+@samp{frob}, the description can be @samp{frob() function: frobnication.}
+Gnulib's documentation generator will automatically convert the first part
+to a hyperlink when it has this form.
+
+@item Status
+This field is either empty/absent, or contains the word @samp{obsolete}. In
+the latter case, @command{gnulib-tool} will, unless the option
+@code{--with-obsolete} is given, omit it when it used as a dependency. It is
+good practice to also notify the user about an obsolete module. This is done
+by putting into the @samp{Notice} section (see below) text like
+@samp{This module is obsolete.}
+
+@item Notice
+This field contains text that @command{gnulib-tool} will show to the user
+when the module is used. This can be a status indicator like
+@samp{This module is obsolete.} or additional advice. Do not abuse this
+field.
+
+@item Applicability
+This field is either empty/absent, or contains the word @samp{all}. It
+describes to which @code{Makefile.am} the module is applied. By default,
+a normal module is applied to @code{@var{source_base}/Makefile.am}
+(normally @code{lib/Makefile.am}), whereas a module ending in @code{-tests}
+is applied to @code{@var{tests_base}/Makefile.am} (normally
+@code{tests/Makefile.am}). If this field is @samp{all}, it is applied to
+both @code{Makefile.am}s. This is useful for modules which provide
+Makefile.am macros rather than compiled source code.
+
+@item Files
+This field contains a newline separated list of the files that are part of
+the module. @code{gnulib-tool} copies these files into the package that
+uses the module.
+
+This list is typically ordered by importance: First comes the header file,
+then the implementation files, then other files.
+
+It is possible to have the same file mentioned in multiple modules. That is,
+if the maintainers of that module agree on the purpose and future of said
+file.
+
+@item Depends-on
+This field contains a newline separated list of the modules that are required
+for the proper working of this module. @code{gnulib-tool} includes each
+required module automatically, unless it is specified with option
+@code{--avoid} or it is marked as obsolete and the option
+@code{--with-obsolete} is not given.
+
+A test modules @code{foo-tests} implicity depends on the corresponding non-test
+module @code{foo}. @code{foo} implicitly depends on @code{foo-tests} if the
+latter exists and if the option @code{--with-tests} has been given.
+
+Tests modules can depend on non-tests modules. Non-tests modules should not
+depend on tests modules. (Recall that tests modules are built in a separate
+directory.)
+
+@item configure.ac-early
+This field contains @file{configure.ac} stuff (Autoconf macro invocations and
+shell statements) that are logically placed early in the @file{configure.ac}
+file: right after the @code{AC_PROG_CC} invocation. This section is adequate
+for statements that modify @code{CPPFLAGS}, as these can affect the results of
+other Autoconf macros.
+
+@item configure.ac
+This field contains @file{configure.ac} stuff (Autoconf macro invocations and
+shell statements).
+
+It is forbidden to add items to the @code{CPPFLAGS} variable here, other than
+temporarily, as these could affect the results of other Autoconf macros.
+
+We avoid adding items to the @code{LIBS} variable, other than temporarily.
+Instead, the module can export an Autoconf-substituted variable that contains
+link options. The user of the module can then decide to which executables
+to apply which link options. Recall that a package can build executables of
+different kinds and purposes; having all executables link against all
+libraries is inappropriate.
+
+If the statements in this section grow larger than a couple of lines, we
+recommend moving them to a @code{.m4} file of their own.
+
+@item Makefile.am
+This field contains @code{Makefile.am} statements. Variables like
+@code{lib_SOURCES} are transformed to match the name of the library
+being built in that directory. For example, @code{lib_SOURCES} may become
+@code{libgnu_a_SOURCES} (for a plain library) or @code{libgnu_la_SOURCES}
+(for a libtool library). Therefore, the normal way of having an
+implementation file @code{lib/foo.c} compiled unconditionally is to write
+@smallexample
+lib_SOURCES += foo.c
+@end smallexample
+
+@item Include
+This field contains the preprocessor statements that users of the module
+need to add to their source code files. Typically it's a single include
+statement. A shorthand is allowed: You don't need to write the word
+``#include'', just the name of the include file in the way it will appear
+in an include statement. Example:
+@smallexample
+"foo.h"
+@end smallexample
+
+@item Link
+This field contains the set of libraries that are needed when linking
+libraries or executables that use this module. Often this will be
+written as a reference to a Makefile variable. Please write them
+one per line, so that @command{gnulib-tool} can remove duplicates
+when presenting a summary to the user.
+Example:
+@smallexample
+$(POW_LIBM)
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+@end smallexample
+
+@item License
+This field specifies the license that governs the source code parts of
+this module. See @ref{Copyright} for details.
+
+@item Maintainer
+This field specifies the persons who have a definitive say about proposed
+changes to this module. You don't need to mention email addresses here:
+they can be inferred from the @code{ChangeLog} file.
+
+Please put at least one person here. We don't like unmaintained modules.
+@end table
+
+
+@node Autoconf macros
+@section Autoconf macros
+
+For a module @code{foo}, an Autoconf macro file @file{m4/foo.m4} is typically
+created when the Autoconf macro invocations for the module are longer than
+one or two lines.
+
+The name of the main entry point into this Autoconf macro file is typically
+@code{gl_FOO}. For modules outside Gnulib that are not likely to be moved
+into Gnulib, please use a prefix specific to your package: @code{gt_} for
+GNU gettext, @code{cu_} for GNU coreutils, etc.
+
+For modules that define a function @code{foo}, the entry point is called
+@code{gl_FUNC_FOO} instead of @code{gl_FOO}. For modules that provide a
+header file with multiple functions, say @code{foo.h}, the entry point is
+called @code{gl_FOO_H} or @code{gl_HEADER_FOO_H}. This convention is useful
+because sometimes a header and a function name coincide (for example,
+@code{fcntl} and @code{fcntl.h}).
+
+For modules that provide a replacement, it is useful to split the Autoconf
+macro into two macro definitions: one that detects whether the replacement
+is needed and requests the replacement using @code{AC_LIBOBJ} (this is the
+entry point, say @code{gl_FUNC_FOO}), and one that arranges for the macros
+needed by the replacement code @code{lib/foo.c} (typically called
+@code{gl_PREREQ_FOO}). The reason of this separation is
+@enumerate
+@item
+to make it easy to update the Autoconf macros when you have modified the
+source code file: after changing @code{lib/foo.c}, all you have to review
+is the @code{Depends-on} section of the module description and the
+@code{gl_PREREQ_FOO} macro in the Autoconf macro file.
+@item
+The Autoconf macros are often large enough that splitting them eases
+maintenance.
+@end enumerate
+
+
+@node Unit test modules
+@section Unit test modules
+
+A unit test that is a simple C program usually has a module description as
+simple as this:
+
+@smallexample
+Files:
+tests/test-foo.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-foo
+check_PROGRAMS += test-foo
+@end smallexample
+
+The test program @file{tests/test-foo.c} often has the following structure:
+
+@itemize
+@item
+First comes the obligatory @samp{#include <config.h>}.
+
+@item
+Second comes the include of the header file that declares the API being tested.
+Including it here verifies that said header file is self-contained.
+
+@item
+Then come other includes. In particular, the file @file{macros.h} is often
+used here. It contains a convenient @code{ASSERT} macro.
+@end itemize
+
+The body of the test, then, contains many @code{ASSERT} invocations. When
+a test fails, the @code{ASSERT} macro prints the line number of the failing
+statement, thus giving you as a developer a idea which part of the test
+failed, even when you don't have access to the machine where the test failed
+and the reporting user cannot run a debugger.
+
+Sometimes it is convenient to write part of the test as a shell script.
+(For example, in areas related to process control or interprocess
+communication, or when different locales should be tried.) In these cases,
+the typical module description is like this:
+
+@smallexample
+Files:
+tests/test-foo.sh
+tests/test-foo.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-foo.sh
+TESTS_ENVIRONMENT += FOO_BAR='@@FOO_BAR@@'
+check_PROGRAMS += test-foo
+@end smallexample
+
+Here, the @code{TESTS_ENVIRONMENT} variable can be used to pass values
+determined by @code{configure} or by the @code{Makefile} to the shell
+script, as environment variables. The values of @code{EXEEXT} and of
+@code{srcdir}, from Autoconf and Automake, are already provided as
+environment variables, through an initial value of @code{TESTS_ENVIRONMENT}
+that @code{gnulib-tool} puts in place.
+
+Regardless of the specific form of the unit test, the following guidelines
+should be respected:
+
+@itemize
+@item
+A test indicates success by exiting with exit code 0. It should normally
+not produce output in this case. (Output to temporary files that are
+cleaned up at the end of the test are possible, of course.)
+@item
+A test indicates failure by exiting with an exit code different from 0 and 77,
+typically 1. It is useful to print a message about the failure in this case.
+The @code{ASSERT} macro already does so.
+@item
+A test indicates "skip", that is, that most of its interesting functionality
+could not be performed, through a return code of 77. A test should also
+print a message to stdout or stderr about the reason for skipping.
+For example:
+@smallexample
+ fputs ("Skipping test: multithreading not enabled\n", stderr);
+ return 77;
+@end smallexample
+Such a message helps detecting bugs in the autoconf macros: A simple message
+@samp{SKIP: test-foo} does not sufficiently catch the attention of the user.
+@end itemize
+
+
+@node Incompatible changes
+@section Incompatible changes
+
+Incompatible changes to Gnulib modules should be mentioned in Gnulib's
+@file{NEWS} file. Incompatible changes here mean that existing source code
+may not compile or work any more.
+
+We don't mean changes in the binary interface (ABI), since
+@enumerate
+@item
+Gnulib code is used in source-code form.
+@item
+The user who distributes libraries that contain Gnulib code is supposed to
+bump the version number in the way described in the Libtool documentation
+before every release.
+@end enumerate
+
+
+@node Miscellaneous Notes
+@chapter Miscellaneous Notes
+
+@menu
+* Out of memory handling::
+* Obsolete modules::
+* Library version handling::
+* Windows sockets::
+* Libtool and Windows::
+* License Texinfo sources::
+* Build robot for gnulib::
+@end menu
+
+
+@node Out of memory handling
+@section Out of memory handling
+
+@cindex Out of Memory handling
+@cindex Memory allocation failure
+The GSS API does not have a standard error code for the out of memory
+error condition. Instead of adding a non-standard error code, this
+library has chosen to adopt a different strategy. Out of memory
+handling happens in rare situations, but performing the out of memory
+error handling after almost all API function invocations pollute your
+source code and might make it harder to spot more serious problems.
+The strategy chosen improves code readability and robustness.
+
+@cindex Aborting execution
+For most applications, aborting the application with an error message
+when the out of memory situation occurs is the best that can be wished
+for. This is how the library behaves by default.
+
+@vindex xalloc_fail_func
+However, we realize that some applications may not want to have the
+GSS library abort execution in any situation. The GSS library supports
+a hook to let the application regain control and perform its own
+cleanups when an out of memory situation has occurred. The application
+can define a function (having a @code{void} prototype, i.e., no return
+value and no parameters) and set the library variable
+@code{xalloc_fail_func} to that function. The variable should be
+declared as follows.
+
+@example
+extern void (*xalloc_fail_func) (void);
+@end example
+
+The GSS library will invoke this function if an out of memory error
+occurs. Note that after this the GSS library is in an undefined
+state, so you must unload or restart the application to continue call
+GSS library functions. The hook is only intended to allow the
+application to log the situation in a special way. Of course, care
+must be taken to not allocate more memory, as that will likely also
+fail.
+
+
+@node Obsolete modules
+@section Obsolete modules
+
+@cindex Obsolete modules
+Modules can be marked obsolete. This means that the problems they fix
+don't occur any more on the platforms that are reasonable porting targets
+now. @code{gnulib-tool} warns when obsolete modules are mentioned on the
+command line, and by default ignores dependencies from modules to obsolete
+modules. When you pass the option @code{--with-obsolete} to
+@code{gnulib-tool}, dependencies to obsolete modules will be included,
+however, unless blocked through an @code{--avoid} option. This option
+is useful if your package should be portable even to very old platforms.
+
+In order to mark a module obsolete, you need to add this to the module
+description:
+
+@example
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+@end example
+
+
+@node Library version handling
+@section Library version handling
+
+The module @samp{check-version} can be useful when your gnulib
+application is a system library. You will typically wrap the call to
+the @code{check_version} function through a library API, your library
+header file may contain:
+
+@example
+#define STRINGPREP_VERSION "0.5.18"
+...
+ extern const char *stringprep_check_version (const char *req_version);
+@end example
+
+To avoid ELF symbol collisions with other libraries that use the
+@samp{check-version} module, add to @file{config.h} through a
+AC_DEFINE something like:
+
+@example
+AC_DEFINE(check_version, stringprep_check_version,
+ [Rename check_version.])
+@end example
+
+The @code{stringprep_check_version} function will thus be implemented
+by the @code{check_version} module.
+
+There are two uses of the interface. The first is a way to provide
+for applications to find out the version number of the library it
+uses. The application may contain diagnostic code such as:
+
+@example
+ printf ("Stringprep version: header %s library %s",
+ STRINGPREP_VERSION,
+ stringprep_check_version (NULL));
+@end example
+
+Separating the library and header file version can be useful when
+searching for version mismatch related problems.
+
+The second uses is as a rudimentary test of proper library version, by
+making sure the application get a library version that is the same, or
+newer, than the header file used when building the application. This
+doesn't catch all problems, libraries may change backwards incompatibly
+in later versions, but enable applications to require a certain
+minimum version before it may proceed.
+
+Typical uses look like:
+
+@example
+ /* Check version of libgcrypt. */
+ if (!gcry_check_version (GCRYPT_VERSION))
+ die ("version mismatch\n");
+@end example
+
+
+@node Windows sockets
+@section Windows sockets
+
+There are several issues when building applications that should work
+under Windows. The most problematic part is for applications that use
+sockets.
+
+Hopefully, we can add helpful notes to this section that will help you
+port your application to Windows using gnulib.
+
+@subsection Getaddrinfo and WINVER
+
+This was written for the getaddrinfo module, but may be applicable to
+other functions too.
+
+The getaddrinfo function exists in ws2tcpip.h and -lws2_32 on Windows
+XP. The function declaration is present if @code{WINVER >= 0x0501}.
+Windows 2000 does not have getaddrinfo in its @file{WS2_32.DLL}.
+
+Thus, if you want to assume Windows XP or later, you can add
+AC_DEFINE(WINVER, 0x0501) to avoid compiling to (partial) getaddrinfo
+implementation.
+
+If you want to support Windows 2000, don't do anything. The
+replacement function will open @file{WS2_32.DLL} during run-time to
+see if there is a getaddrinfo function available, and use it when
+available.
+
+@node Libtool and Windows
+@section Libtool and Windows
+
+If you want it to be possible to cross-compile your program to MinGW
+and you use Libtool, you need to put:
+
+@example
+AC_LIBTOOL_WIN32_DLL
+@end example
+
+in your @file{configure.ac}. This sets the correct names for the
+@code{OBJDUMP}, @code{DLLTOOL}, and @code{AS} tools for the build.
+
+If you are building a library, you will also need to pass
+@code{-no-undefined} to make sure Libtool produces a DLL for your
+library. From a @file{Makefile.am}:
+
+@example
+libgsasl_la_LDFLAGS += -no-undefined
+@end example
+
+
+@node License Texinfo sources
+@section License Texinfo sources
+
+Gnulib provides copies of the GNU GPL, GNU LGPL, and GNU FDL licenses
+in Texinfo form. (The master location is
+@url{http://www.gnu.org/licenses/}). These Texinfo documents do not
+have any node names and structures built into them; for your manual,
+you should @code{@@include} them in an appropriate @code{@@node}.
+
+The conventional name for the GPL node is @samp{Copying} and for the FDL
+@samp{GNU Free Documentation License}. The LGPL doesn't seem to have
+a conventional node name.
+
+Of course the license texts themselves should not be changed at all.
+
+
+@node Build robot for gnulib
+@section Build robot for gnulib
+
+To simplify testing on a wide set of platforms, gnulib is built on
+many platforms every day and the results are uploaded to:
+
+@url{http://autobuild.josefsson.org/gnulib/}
+
+If you wish to help the gnulib development effort with build logs for
+your favorite platform, you may perform these steps:
+
+@enumerate
+
+@item Create gnulib directory
+
+On a machine with recent automake, autoconf, m4 installed and with a
+gnulib git or cvs checkout (typically a Linux machine), use
+
+@example
+gnulib-tool --create-megatestdir --with-tests --dir=...
+@end example
+
+Note: The created directory uses ca. 512 MB on disk.
+
+@item Transfer gnulib directory
+
+Transfer this directory to a build machine (HP-UX, Cygwin, or
+whatever). Often it is easier to transfer one file, and this can be
+achieved by running, inside the directory the following commands:
+
+@example
+./configure
+make dist
+@end example
+
+And then transferring the @file{dummy-0.tar.gz} file.
+
+@item Build modules
+
+On the build machine, run ./do-autobuild (or "nohup ./do-autobuild").
+It creates a directory 'logs/' with a log file for each module.
+
+@item Submit build logs
+
+Submit each log file to Simon's site, either through a
+
+@example
+mail `echo gnulib__at__autobuild.josefsson.org | sed -e s/__at__/@@/`
+@end example
+
+or through netcat
+
+@example
+autobuild-submit logs/*
+@end example
+
+@end enumerate
+
+@node POSIX Substitutes Library
+@chapter Building the ISO C and POSIX Substitutes
+
+This section shows a radically different way to use Gnulib.
+
+You can extract the ISO C / POSIX substitutes part of gnulib by running
+the command
+@smallexample
+gnulib-tool --create-testdir --source-base=lib \
+ --dir=/tmp/posixlib `posix-modules`
+@end smallexample
+
+@noindent
+The command @samp{posix-modules} is found in the same directory as
+@code{gnulib-tool}.
+
+The resulting directory can be built on a particular platform,
+independently of the program being ported. Then you can configure and
+build any program, by setting @code{CPPFLAGS} and @code{LDFLAGS} at
+configure time accordingly: set @code{CPPFLAGS="-I.../posixlib/lib"}, plus
+any essential type definitions and flags that you find in
+@code{.../posixlib/config.h}, and set
+@code{LDFLAGS=".../posixlib/lib/libgnu.a"}.
+
+This way of using Gnulib is useful when you don't want to modify the program's
+source code, or when the program uses a mix between C and C++ sources
+(requiring separate builds of the @code{posixlib} for the C compiler and
+for the C++ compiler).
+
+@node Header File Substitutes
+@chapter ISO C and POSIX Header File Substitutes
+
+This chapter describes which header files specified by ISO C or POSIX are
+substituted by Gnulib, which portability pitfalls are fixed by Gnulib, and
+which (known) portability problems are not worked around by Gnulib.
+
+@nosuchmodulenote header file
+
+@menu
+* aio.h::
+* arpa/inet.h::
+* assert.h::
+* complex.h::
+* cpio.h::
+* ctype.h::
+* dirent.h::
+* dlfcn.h::
+* errno.h::
+* fcntl.h::
+* fenv.h::
+* float.h::
+* fmtmsg.h::
+* fnmatch.h::
+* ftw.h::
+* glob.h::
+* grp.h::
+* iconv.h::
+* inttypes.h::
+* iso646.h::
+* langinfo.h::
+* libgen.h::
+* limits.h::
+* locale.h::
+* math.h::
+* monetary.h::
+* mqueue.h::
+* ndbm.h::
+* net/if.h::
+* netdb.h::
+* netinet/in.h::
+* netinet/tcp.h::
+* nl_types.h::
+* poll.h::
+* pthread.h::
+* pwd.h::
+* regex.h::
+* sched.h::
+* search.h::
+* semaphore.h::
+* setjmp.h::
+* signal.h::
+* spawn.h::
+* stdarg.h::
+* stdbool.h::
+* stddef.h::
+* stdint.h::
+* stdio.h::
+* stdlib.h::
+* string.h::
+* strings.h::
+* stropts.h::
+* sys/ipc.h::
+* sys/mman.h::
+* sys/msg.h::
+* sys/resource.h::
+* sys/select.h::
+* sys/sem.h::
+* sys/shm.h::
+* sys/socket.h::
+* sys/stat.h::
+* sys/statvfs.h::
+* sys/time.h::
+* sys/timeb.h::
+* sys/times.h::
+* sys/types.h::
+* sys/uio.h::
+* sys/un.h::
+* sys/utsname.h::
+* sys/wait.h::
+* syslog.h::
+* tar.h::
+* termios.h::
+* tgmath.h::
+* time.h::
+* trace.h::
+* ucontext.h::
+* ulimit.h::
+* unistd.h::
+* utime.h::
+* utmpx.h::
+* wchar.h::
+* wctype.h::
+* wordexp.h::
+@end menu
+
+@include posix-headers/aio.texi
+@include posix-headers/arpa_inet.texi
+@include posix-headers/assert.texi
+@include posix-headers/complex.texi
+@include posix-headers/cpio.texi
+@include posix-headers/ctype.texi
+@include posix-headers/dirent.texi
+@include posix-headers/dlfcn.texi
+@include posix-headers/errno.texi
+@include posix-headers/fcntl.texi
+@include posix-headers/fenv.texi
+@include posix-headers/float.texi
+@include posix-headers/fmtmsg.texi
+@include posix-headers/fnmatch.texi
+@include posix-headers/ftw.texi
+@include posix-headers/glob.texi
+@include posix-headers/grp.texi
+@include posix-headers/iconv.texi
+@include posix-headers/inttypes.texi
+@include posix-headers/iso646.texi
+@include posix-headers/langinfo.texi
+@include posix-headers/libgen.texi
+@include posix-headers/limits.texi
+@include posix-headers/locale.texi
+@include posix-headers/math.texi
+@include posix-headers/monetary.texi
+@include posix-headers/mqueue.texi
+@include posix-headers/ndbm.texi
+@include posix-headers/net_if.texi
+@include posix-headers/netdb.texi
+@include posix-headers/netinet_in.texi
+@include posix-headers/netinet_tcp.texi
+@include posix-headers/nl_types.texi
+@include posix-headers/poll.texi
+@include posix-headers/pthread.texi
+@include posix-headers/pwd.texi
+@include posix-headers/regex.texi
+@include posix-headers/sched.texi
+@include posix-headers/search.texi
+@include posix-headers/semaphore.texi
+@include posix-headers/setjmp.texi
+@include posix-headers/signal.texi
+@include posix-headers/spawn.texi
+@include posix-headers/stdarg.texi
+@include posix-headers/stdbool.texi
+@include posix-headers/stddef.texi
+@include posix-headers/stdint.texi
+@include posix-headers/stdio.texi
+@include posix-headers/stdlib.texi
+@include posix-headers/string.texi
+@include posix-headers/strings.texi
+@include posix-headers/stropts.texi
+@include posix-headers/sys_ipc.texi
+@include posix-headers/sys_mman.texi
+@include posix-headers/sys_msg.texi
+@include posix-headers/sys_resource.texi
+@include posix-headers/sys_select.texi
+@include posix-headers/sys_sem.texi
+@include posix-headers/sys_shm.texi
+@include posix-headers/sys_socket.texi
+@include posix-headers/sys_stat.texi
+@include posix-headers/sys_statvfs.texi
+@include posix-headers/sys_time.texi
+@include posix-headers/sys_timeb.texi
+@include posix-headers/sys_times.texi
+@include posix-headers/sys_types.texi
+@include posix-headers/sys_uio.texi
+@include posix-headers/sys_un.texi
+@include posix-headers/sys_utsname.texi
+@include posix-headers/sys_wait.texi
+@include posix-headers/syslog.texi
+@include posix-headers/tar.texi
+@include posix-headers/termios.texi
+@include posix-headers/tgmath.texi
+@include posix-headers/time.texi
+@include posix-headers/trace.texi
+@include posix-headers/ucontext.texi
+@include posix-headers/ulimit.texi
+@include posix-headers/unistd.texi
+@include posix-headers/utime.texi
+@include posix-headers/utmpx.texi
+@include posix-headers/wchar.texi
+@include posix-headers/wctype.texi
+@include posix-headers/wordexp.texi
+
+@node Function Substitutes
+@chapter ISO C and POSIX Function Substitutes
+
+This chapter describes which functions and function-like macros specified by
+ISO C or POSIX are substituted by Gnulib, which portability pitfalls are
+fixed by Gnulib, and which (known) portability problems are not worked around
+by Gnulib.
+
+@nosuchmodulenote function
+
+@menu
+* FD_CLR::
+* FD_ISSET::
+* FD_SET::
+* FD_ZERO::
+* _Exit::
+* _exit::
+* _longjmp::
+* _setjmp::
+* _tolower::
+* _toupper::
+* a64l::
+* abort::
+* abs::
+* accept::
+* access::
+* acos::
+* acosf::
+* acosh::
+* acoshf::
+* acoshl::
+* acosl::
+* aio_cancel::
+* aio_error::
+* aio_fsync::
+* aio_read::
+* aio_return::
+* aio_suspend::
+* aio_write::
+* alarm::
+* alphasort::
+* asctime::
+* asctime_r::
+* asin::
+* asinf::
+* asinh::
+* asinhf::
+* asinhl::
+* asinl::
+* assert::
+* atan::
+* atan2::
+* atan2f::
+* atan2l::
+* atanf::
+* atanh::
+* atanhf::
+* atanhl::
+* atanl::
+* atexit::
+* atof::
+* atoi::
+* atol::
+* atoll::
+* basename::
+* bind::
+* bsearch::
+* btowc::
+* cabs::
+* cabsf::
+* cabsl::
+* cacos::
+* cacosf::
+* cacosh::
+* cacoshf::
+* cacoshl::
+* cacosl::
+* calloc::
+* carg::
+* cargf::
+* cargl::
+* casin::
+* casinf::
+* casinh::
+* casinhf::
+* casinhl::
+* casinl::
+* catan::
+* catanf::
+* catanh::
+* catanhf::
+* catanhl::
+* catanl::
+* catclose::
+* catgets::
+* catopen::
+* cbrt::
+* cbrtf::
+* cbrtl::
+* ccos::
+* ccosf::
+* ccosh::
+* ccoshf::
+* ccoshl::
+* ccosl::
+* ceil::
+* ceilf::
+* ceill::
+* cexp::
+* cexpf::
+* cexpl::
+* cfgetispeed::
+* cfgetospeed::
+* cfsetispeed::
+* cfsetospeed::
+* chdir::
+* chmod::
+* chown::
+* cimag::
+* cimagf::
+* cimagl::
+* clearerr::
+* clock::
+* clock_getcpuclockid::
+* clock_getres::
+* clock_gettime::
+* clock_nanosleep::
+* clock_settime::
+* clog::
+* clogf::
+* clogl::
+* close::
+* closedir::
+* closelog::
+* confstr::
+* conj::
+* conjf::
+* conjl::
+* connect::
+* copysign::
+* copysignf::
+* copysignl::
+* cos::
+* cosf::
+* cosh::
+* coshf::
+* coshl::
+* cosl::
+* cpow::
+* cpowf::
+* cpowl::
+* cproj::
+* cprojf::
+* cprojl::
+* creal::
+* crealf::
+* creall::
+* creat::
+* crypt::
+* csin::
+* csinf::
+* csinh::
+* csinhf::
+* csinhl::
+* csinl::
+* csqrt::
+* csqrtf::
+* csqrtl::
+* ctan::
+* ctanf::
+* ctanh::
+* ctanhf::
+* ctanhl::
+* ctanl::
+* ctermid::
+* ctime::
+* ctime_r::
+* daylight::
+* dbm_clearerr::
+* dbm_close::
+* dbm_delete::
+* dbm_error::
+* dbm_fetch::
+* dbm_firstkey::
+* dbm_nextkey::
+* dbm_open::
+* dbm_store::
+* difftime::
+* dirfd::
+* dirname::
+* div::
+* dlclose::
+* dlerror::
+* dlopen::
+* dlsym::
+* dprintf::
+* drand48::
+* dup::
+* dup2::
+* duplocale::
+* encrypt::
+* endgrent::
+* endhostent::
+* endnetent::
+* endprotoent::
+* endpwent::
+* endservent::
+* endutxent::
+* environ::
+* erand48::
+* erf::
+* erfc::
+* erfcf::
+* erfcl::
+* erff::
+* erfl::
+* errno::
+* execl::
+* execle::
+* execlp::
+* execv::
+* execve::
+* execvp::
+* exit::
+* exp::
+* exp2::
+* exp2f::
+* exp2l::
+* expf::
+* expl::
+* expm1::
+* expm1f::
+* expm1l::
+* fabs::
+* fabsf::
+* fabsl::
+* faccessat::
+* fattach::
+* fchdir::
+* fchmod::
+* fchmodat::
+* fchown::
+* fchownat::
+* fclose::
+* fcntl::
+* fdatasync::
+* fdetach::
+* fdim::
+* fdimf::
+* fdiml::
+* fdopen::
+* fdopendir::
+* feclearexcept::
+* fegetenv::
+* fegetexceptflag::
+* fegetround::
+* feholdexcept::
+* feof::
+* feraiseexcept::
+* ferror::
+* fesetenv::
+* fesetexceptflag::
+* fesetround::
+* fetestexcept::
+* feupdateenv::
+* fexecve::
+* fflush::
+* ffs::
+* fgetc::
+* fgetpos::
+* fgets::
+* fgetwc::
+* fgetws::
+* fileno::
+* flockfile::
+* floor::
+* floorf::
+* floorl::
+* fma::
+* fmaf::
+* fmal::
+* fmax::
+* fmaxf::
+* fmaxl::
+* fmemopen::
+* fmin::
+* fminf::
+* fminl::
+* fmod::
+* fmodf::
+* fmodl::
+* fmtmsg::
+* fnmatch::
+* fopen::
+* fork::
+* fpathconf::
+* fpclassify::
+* fprintf::
+* fputc::
+* fputs::
+* fputwc::
+* fputws::
+* fread::
+* free::
+* freeaddrinfo::
+* freelocale::
+* freopen::
+* frexp::
+* frexpf::
+* frexpl::
+* fscanf::
+* fseek::
+* fseeko::
+* fsetpos::
+* fstat::
+* fstatat::
+* fstatvfs::
+* fsync::
+* ftell::
+* ftello::
+* ftok::
+* ftruncate::
+* ftrylockfile::
+* ftw::
+* funlockfile::
+* futimens::
+* fwide::
+* fwprintf::
+* fwrite::
+* fwscanf::
+* gai_strerror::
+* getaddrinfo::
+* getc::
+* getc_unlocked::
+* getchar::
+* getchar_unlocked::
+* getcwd::
+* getdate::
+* getdate_err::
+* getdelim::
+* getegid::
+* getenv::
+* geteuid::
+* getgid::
+* getgrent::
+* getgrgid::
+* getgrgid_r::
+* getgrnam::
+* getgrnam_r::
+* getgroups::
+* gethostent::
+* gethostid::
+* gethostname::
+* getitimer::
+* getline::
+* getlogin::
+* getlogin_r::
+* getmsg::
+* getnameinfo::
+* getnetbyaddr::
+* getnetbyname::
+* getnetent::
+* getopt::
+* getpeername::
+* getpgid::
+* getpgrp::
+* getpid::
+* getpmsg::
+* getppid::
+* getpriority::
+* getprotobyname::
+* getprotobynumber::
+* getprotoent::
+* getpwent::
+* getpwnam::
+* getpwnam_r::
+* getpwuid::
+* getpwuid_r::
+* getrlimit::
+* getrusage::
+* gets::
+* getservbyname::
+* getservbyport::
+* getservent::
+* getsid::
+* getsockname::
+* getsockopt::
+* getsubopt::
+* gettimeofday::
+* getuid::
+* getutxent::
+* getutxid::
+* getutxline::
+* getwc::
+* getwchar::
+* glob::
+* globfree::
+* gmtime::
+* gmtime_r::
+* grantpt::
+* hcreate::
+* hdestroy::
+* hsearch::
+* htonl::
+* htons::
+* hypot::
+* hypotf::
+* hypotl::
+* iconv::
+* iconv_close::
+* iconv_open::
+* if_freenameindex::
+* if_indextoname::
+* if_nameindex::
+* if_nametoindex::
+* ilogb::
+* ilogbf::
+* ilogbl::
+* imaxabs::
+* imaxdiv::
+* inet_addr::
+* inet_ntoa::
+* inet_ntop::
+* inet_pton::
+* initstate::
+* insque::
+* ioctl::
+* isalnum::
+* isalnum_l::
+* isalpha::
+* isalpha_l::
+* isascii::
+* isastream::
+* isatty::
+* isblank::
+* isblank_l::
+* iscntrl::
+* iscntrl_l::
+* isdigit::
+* isdigit_l::
+* isfinite::
+* isgraph::
+* isgraph_l::
+* isgreater::
+* isgreaterequal::
+* isinf::
+* isless::
+* islessequal::
+* islessgreater::
+* islower::
+* islower_l::
+* isnan::
+* isnormal::
+* isprint::
+* isprint_l::
+* ispunct::
+* ispunct_l::
+* isspace::
+* isspace_l::
+* isunordered::
+* isupper::
+* isupper_l::
+* iswalnum::
+* iswalnum_l::
+* iswalpha::
+* iswalpha_l::
+* iswblank::
+* iswblank_l::
+* iswcntrl::
+* iswcntrl_l::
+* iswctype::
+* iswctype_l::
+* iswdigit::
+* iswdigit_l::
+* iswgraph::
+* iswgraph_l::
+* iswlower::
+* iswlower_l::
+* iswprint::
+* iswprint_l::
+* iswpunct::
+* iswpunct_l::
+* iswspace::
+* iswspace_l::
+* iswupper::
+* iswupper_l::
+* iswxdigit::
+* iswxdigit_l::
+* isxdigit::
+* isxdigit_l::
+* j0::
+* j1::
+* jn::
+* jrand48::
+* kill::
+* killpg::
+* l64a::
+* labs::
+* lchown::
+* lcong48::
+* ldexp::
+* ldexpf::
+* ldexpl::
+* ldiv::
+* lfind::
+* lgamma::
+* lgammaf::
+* lgammal::
+* link::
+* linkat::
+* lio_listio::
+* listen::
+* llabs::
+* lldiv::
+* llrint::
+* llrintf::
+* llrintl::
+* llround::
+* llroundf::
+* llroundl::
+* localeconv::
+* localtime::
+* localtime_r::
+* lockf::
+* log::
+* log10::
+* log10f::
+* log10l::
+* log1p::
+* log1pf::
+* log1pl::
+* log2::
+* log2f::
+* log2l::
+* logb::
+* logbf::
+* logbl::
+* logf::
+* logl::
+* longjmp::
+* lrand48::
+* lrint::
+* lrintf::
+* lrintl::
+* lround::
+* lroundf::
+* lroundl::
+* lsearch::
+* lseek::
+* lstat::
+* malloc::
+* mblen::
+* mbrlen::
+* mbrtowc::
+* mbsinit::
+* mbsnrtowcs::
+* mbsrtowcs::
+* mbstowcs::
+* mbtowc::
+* memccpy::
+* memchr::
+* memcmp::
+* memcpy::
+* memmove::
+* memset::
+* mkdir::
+* mkdirat::
+* mkdtemp::
+* mkfifo::
+* mkfifoat::
+* mknod::
+* mknodat::
+* mkstemp::
+* mktime::
+* mlock::
+* mlockall::
+* mmap::
+* modf::
+* modff::
+* modfl::
+* mprotect::
+* mq_close::
+* mq_getattr::
+* mq_notify::
+* mq_open::
+* mq_receive::
+* mq_send::
+* mq_setattr::
+* mq_timedreceive::
+* mq_timedsend::
+* mq_unlink::
+* mrand48::
+* msgctl::
+* msgget::
+* msgrcv::
+* msgsnd::
+* msync::
+* munlock::
+* munlockall::
+* munmap::
+* nan::
+* nanf::
+* nanl::
+* nanosleep::
+* nearbyint::
+* nearbyintf::
+* nearbyintl::
+* newlocale::
+* nextafter::
+* nextafterf::
+* nextafterl::
+* nexttoward::
+* nexttowardf::
+* nexttowardl::
+* nftw::
+* nice::
+* nl_langinfo::
+* nl_langinfo_l::
+* nrand48::
+* ntohl::
+* ntohs::
+* open::
+* openat::
+* opendir::
+* openlog::
+* open_memstream::
+* open_wmemstream::
+* optarg::
+* opterr::
+* optind::
+* optopt::
+* pathconf::
+* pause::
+* pclose::
+* perror::
+* pipe::
+* poll::
+* popen::
+* posix_fadvise::
+* posix_fallocate::
+* posix_madvise::
+* posix_mem_offset::
+* posix_memalign::
+* posix_openpt::
+* posix_spawn::
+* posix_spawn_file_actions_addclose::
+* posix_spawn_file_actions_adddup2::
+* posix_spawn_file_actions_addopen::
+* posix_spawn_file_actions_destroy::
+* posix_spawn_file_actions_init::
+* posix_spawnattr_destroy::
+* posix_spawnattr_getflags::
+* posix_spawnattr_getpgroup::
+* posix_spawnattr_getschedparam::
+* posix_spawnattr_getschedpolicy::
+* posix_spawnattr_getsigdefault::
+* posix_spawnattr_getsigmask::
+* posix_spawnattr_init::
+* posix_spawnattr_setflags::
+* posix_spawnattr_setpgroup::
+* posix_spawnattr_setschedparam::
+* posix_spawnattr_setschedpolicy::
+* posix_spawnattr_setsigdefault::
+* posix_spawnattr_setsigmask::
+* posix_spawnp::
+* posix_trace_attr_destroy::
+* posix_trace_attr_getclockres::
+* posix_trace_attr_getcreatetime::
+* posix_trace_attr_getgenversion::
+* posix_trace_attr_getinherited::
+* posix_trace_attr_getlogfullpolicy::
+* posix_trace_attr_getlogsize::
+* posix_trace_attr_getmaxdatasize::
+* posix_trace_attr_getmaxsystemeventsize::
+* posix_trace_attr_getmaxusereventsize::
+* posix_trace_attr_getname::
+* posix_trace_attr_getstreamfullpolicy::
+* posix_trace_attr_getstreamsize::
+* posix_trace_attr_init::
+* posix_trace_attr_setinherited::
+* posix_trace_attr_setlogfullpolicy::
+* posix_trace_attr_setlogsize::
+* posix_trace_attr_setmaxdatasize::
+* posix_trace_attr_setname::
+* posix_trace_attr_setstreamfullpolicy::
+* posix_trace_attr_setstreamsize::
+* posix_trace_clear::
+* posix_trace_close::
+* posix_trace_create::
+* posix_trace_create_withlog::
+* posix_trace_event::
+* posix_trace_eventid_equal::
+* posix_trace_eventid_get_name::
+* posix_trace_eventid_open::
+* posix_trace_eventset_add::
+* posix_trace_eventset_del::
+* posix_trace_eventset_empty::
+* posix_trace_eventset_fill::
+* posix_trace_eventset_ismember::
+* posix_trace_eventtypelist_getnext_id::
+* posix_trace_eventtypelist_rewind::
+* posix_trace_flush::
+* posix_trace_get_attr::
+* posix_trace_get_filter::
+* posix_trace_get_status::
+* posix_trace_getnext_event::
+* posix_trace_open::
+* posix_trace_rewind::
+* posix_trace_set_filter::
+* posix_trace_shutdown::
+* posix_trace_start::
+* posix_trace_stop::
+* posix_trace_timedgetnext_event::
+* posix_trace_trid_eventid_open::
+* posix_trace_trygetnext_event::
+* posix_typed_mem_get_info::
+* posix_typed_mem_open::
+* pow::
+* powf::
+* powl::
+* pread::
+* printf::
+* pselect::
+* psiginfo::
+* psignal::
+* pthread_atfork::
+* pthread_attr_destroy::
+* pthread_attr_getdetachstate::
+* pthread_attr_getguardsize::
+* pthread_attr_getinheritsched::
+* pthread_attr_getschedparam::
+* pthread_attr_getschedpolicy::
+* pthread_attr_getscope::
+* pthread_attr_getstack::
+* pthread_attr_getstacksize::
+* pthread_attr_init::
+* pthread_attr_setdetachstate::
+* pthread_attr_setguardsize::
+* pthread_attr_setinheritsched::
+* pthread_attr_setschedparam::
+* pthread_attr_setschedpolicy::
+* pthread_attr_setscope::
+* pthread_attr_setstack::
+* pthread_attr_setstacksize::
+* pthread_barrier_destroy::
+* pthread_barrier_init::
+* pthread_barrier_wait::
+* pthread_barrierattr_destroy::
+* pthread_barrierattr_getpshared::
+* pthread_barrierattr_init::
+* pthread_barrierattr_setpshared::
+* pthread_cancel::
+* pthread_cleanup_pop::
+* pthread_cleanup_push::
+* pthread_cond_broadcast::
+* pthread_cond_destroy::
+* pthread_cond_init::
+* pthread_cond_signal::
+* pthread_cond_timedwait::
+* pthread_cond_wait::
+* pthread_condattr_destroy::
+* pthread_condattr_getclock::
+* pthread_condattr_getpshared::
+* pthread_condattr_init::
+* pthread_condattr_setclock::
+* pthread_condattr_setpshared::
+* pthread_create::
+* pthread_detach::
+* pthread_equal::
+* pthread_exit::
+* pthread_getconcurrency::
+* pthread_getcpuclockid::
+* pthread_getschedparam::
+* pthread_getspecific::
+* pthread_join::
+* pthread_key_create::
+* pthread_key_delete::
+* pthread_kill::
+* pthread_mutex_consistent::
+* pthread_mutex_destroy::
+* pthread_mutex_getprioceiling::
+* pthread_mutex_init::
+* pthread_mutex_lock::
+* pthread_mutex_setprioceiling::
+* pthread_mutex_timedlock::
+* pthread_mutex_trylock::
+* pthread_mutex_unlock::
+* pthread_mutexattr_destroy::
+* pthread_mutexattr_getprioceiling::
+* pthread_mutexattr_getprotocol::
+* pthread_mutexattr_getpshared::
+* pthread_mutexattr_getrobust::
+* pthread_mutexattr_gettype::
+* pthread_mutexattr_init::
+* pthread_mutexattr_setprioceiling::
+* pthread_mutexattr_setprotocol::
+* pthread_mutexattr_setpshared::
+* pthread_mutexattr_setrobust::
+* pthread_mutexattr_settype::
+* pthread_once::
+* pthread_rwlock_destroy::
+* pthread_rwlock_init::
+* pthread_rwlock_rdlock::
+* pthread_rwlock_timedrdlock::
+* pthread_rwlock_timedwrlock::
+* pthread_rwlock_tryrdlock::
+* pthread_rwlock_trywrlock::
+* pthread_rwlock_unlock::
+* pthread_rwlock_wrlock::
+* pthread_rwlockattr_destroy::
+* pthread_rwlockattr_getpshared::
+* pthread_rwlockattr_init::
+* pthread_rwlockattr_setpshared::
+* pthread_self::
+* pthread_setcancelstate::
+* pthread_setcanceltype::
+* pthread_setconcurrency::
+* pthread_setschedparam::
+* pthread_setschedprio::
+* pthread_setspecific::
+* pthread_sigmask::
+* pthread_spin_destroy::
+* pthread_spin_init::
+* pthread_spin_lock::
+* pthread_spin_trylock::
+* pthread_spin_unlock::
+* pthread_testcancel::
+* ptsname::
+* putc::
+* putc_unlocked::
+* putchar::
+* putchar_unlocked::
+* putenv::
+* putmsg::
+* putpmsg::
+* puts::
+* pututxline::
+* putwc::
+* putwchar::
+* pwrite::
+* qsort::
+* raise::
+* rand::
+* rand_r::
+* random::
+* read::
+* readdir::
+* readdir_r::
+* readlink::
+* readlinkat::
+* readv::
+* realloc::
+* realpath::
+* recv::
+* recvfrom::
+* recvmsg::
+* regcomp::
+* regerror::
+* regexec::
+* regfree::
+* remainder::
+* remainderf::
+* remainderl::
+* remove::
+* remque::
+* remquo::
+* remquof::
+* remquol::
+* rename::
+* renameat::
+* rewind::
+* rewinddir::
+* rint::
+* rintf::
+* rintl::
+* rmdir::
+* round::
+* roundf::
+* roundl::
+* scalbln::
+* scalblnf::
+* scalblnl::
+* scalbn::
+* scalbnf::
+* scalbnl::
+* scandir::
+* scanf::
+* sched_get_priority_max::
+* sched_get_priority_min::
+* sched_getparam::
+* sched_getscheduler::
+* sched_rr_get_interval::
+* sched_setparam::
+* sched_setscheduler::
+* sched_yield::
+* seed48::
+* seekdir::
+* select::
+* sem_close::
+* sem_destroy::
+* sem_getvalue::
+* sem_init::
+* sem_open::
+* sem_post::
+* sem_timedwait::
+* sem_trywait::
+* sem_unlink::
+* sem_wait::
+* semctl::
+* semget::
+* semop::
+* send::
+* sendmsg::
+* sendto::
+* setbuf::
+* setegid::
+* setenv::
+* seteuid::
+* setgid::
+* setgrent::
+* sethostent::
+* setitimer::
+* setjmp::
+* setkey::
+* setlocale::
+* setlogmask::
+* setnetent::
+* setpgid::
+* setpgrp::
+* setpriority::
+* setprotoent::
+* setpwent::
+* setregid::
+* setreuid::
+* setrlimit::
+* setservent::
+* setsid::
+* setsockopt::
+* setstate::
+* setuid::
+* setutxent::
+* setvbuf::
+* shm_open::
+* shm_unlink::
+* shmat::
+* shmctl::
+* shmdt::
+* shmget::
+* shutdown::
+* sigaction::
+* sigaddset::
+* sigaltstack::
+* sigdelset::
+* sigemptyset::
+* sigfillset::
+* sighold::
+* sigignore::
+* siginterrupt::
+* sigismember::
+* siglongjmp::
+* signal::
+* signbit::
+* signgam::
+* sigpause::
+* sigpending::
+* sigprocmask::
+* sigqueue::
+* sigrelse::
+* sigset::
+* sigsetjmp::
+* sigsuspend::
+* sigtimedwait::
+* sigwait::
+* sigwaitinfo::
+* sin::
+* sinf::
+* sinh::
+* sinhf::
+* sinhl::
+* sinl::
+* sleep::
+* snprintf::
+* sockatmark::
+* socket::
+* socketpair::
+* sprintf::
+* sqrt::
+* sqrtf::
+* sqrtl::
+* srand::
+* srand48::
+* srandom::
+* sscanf::
+* stat::
+* statvfs::
+* stderr::
+* stdin::
+* stdout::
+* stpcpy::
+* stpncpy::
+* strcasecmp::
+* strcasecmp_l::
+* strcat::
+* strchr::
+* strcmp::
+* strcoll::
+* strcoll_l::
+* strcpy::
+* strcspn::
+* strdup::
+* strerror::
+* strerror_l::
+* strerror_r::
+* strfmon::
+* strfmon_l::
+* strftime::
+* strftime_l::
+* strlen::
+* strncasecmp::
+* strncasecmp_l::
+* strncat::
+* strncmp::
+* strncpy::
+* strndup::
+* strnlen::
+* strpbrk::
+* strptime::
+* strrchr::
+* strsignal::
+* strspn::
+* strstr::
+* strtod::
+* strtof::
+* strtoimax::
+* strtok::
+* strtok_r::
+* strtol::
+* strtold::
+* strtoll::
+* strtoul::
+* strtoull::
+* strtoumax::
+* strxfrm::
+* strxfrm_l::
+* swab::
+* swprintf::
+* swscanf::
+* symlink::
+* symlinkat::
+* sync::
+* sysconf::
+* syslog::
+* system::
+* tan::
+* tanf::
+* tanh::
+* tanhf::
+* tanhl::
+* tanl::
+* tcdrain::
+* tcflow::
+* tcflush::
+* tcgetattr::
+* tcgetpgrp::
+* tcgetsid::
+* tcsendbreak::
+* tcsetattr::
+* tcsetpgrp::
+* tdelete::
+* telldir::
+* tempnam::
+* tfind::
+* tgamma::
+* tgammaf::
+* tgammal::
+* time::
+* timer_create::
+* timer_delete::
+* timer_getoverrun::
+* timer_gettime::
+* timer_settime::
+* times::
+* timezone::
+* tmpfile::
+* tmpnam::
+* toascii::
+* tolower::
+* tolower_l::
+* toupper::
+* toupper_l::
+* towctrans::
+* towctrans_l::
+* towlower::
+* towlower_l::
+* towupper::
+* towupper_l::
+* trunc::
+* truncate::
+* truncf::
+* truncl::
+* tsearch::
+* ttyname::
+* ttyname_r::
+* twalk::
+* tzname::
+* tzset::
+* ulimit::
+* umask::
+* uname::
+* ungetc::
+* ungetwc::
+* unlink::
+* unlinkat::
+* unlockpt::
+* unsetenv::
+* uselocale::
+* utime::
+* utimensat::
+* utimes::
+* va_arg::
+* va_copy::
+* va_end::
+* va_start::
+* vdprintf::
+* vfprintf::
+* vfscanf::
+* vfwprintf::
+* vfwscanf::
+* vprintf::
+* vscanf::
+* vsnprintf::
+* vsprintf::
+* vsscanf::
+* vswprintf::
+* vswscanf::
+* vwprintf::
+* vwscanf::
+* wait::
+* waitid::
+* waitpid::
+* wcpcpy::
+* wcpncpy::
+* wcrtomb::
+* wcscasecmp::
+* wcscasecmp_l::
+* wcscat::
+* wcschr::
+* wcscmp::
+* wcscoll::
+* wcscoll_l::
+* wcscpy::
+* wcscspn::
+* wcsdup::
+* wcsftime::
+* wcslen::
+* wcsncasecmp::
+* wcsncasecmp_l::
+* wcsncat::
+* wcsncmp::
+* wcsncpy::
+* wcsnlen::
+* wcsnrtombs::
+* wcspbrk::
+* wcsrchr::
+* wcsrtombs::
+* wcsspn::
+* wcsstr::
+* wcstod::
+* wcstof::
+* wcstoimax::
+* wcstok::
+* wcstol::
+* wcstold::
+* wcstoll::
+* wcstombs::
+* wcstoul::
+* wcstoull::
+* wcstoumax::
+* wcswidth::
+* wcsxfrm::
+* wcsxfrm_l::
+* wctob::
+* wctomb::
+* wctrans::
+* wctrans_l::
+* wctype::
+* wctype_l::
+* wcwidth::
+* wmemchr::
+* wmemcmp::
+* wmemcpy::
+* wmemmove::
+* wmemset::
+* wordexp::
+* wordfree::
+* wprintf::
+* write::
+* writev::
+* wscanf::
+* y0::
+* y1::
+* yn::
+@end menu
+
+@include posix-functions/FD_CLR.texi
+@include posix-functions/FD_ISSET.texi
+@include posix-functions/FD_SET.texi
+@include posix-functions/FD_ZERO.texi
+@include posix-functions/_Exit_C99.texi
+@include posix-functions/_exit.texi
+@include posix-functions/_longjmp.texi
+@include posix-functions/_setjmp.texi
+@include posix-functions/_tolower.texi
+@include posix-functions/_toupper.texi
+@include posix-functions/a64l.texi
+@include posix-functions/abort.texi
+@include posix-functions/abs.texi
+@include posix-functions/accept.texi
+@include posix-functions/access.texi
+@include posix-functions/acos.texi
+@include posix-functions/acosf.texi
+@include posix-functions/acosh.texi
+@include posix-functions/acoshf.texi
+@include posix-functions/acoshl.texi
+@include posix-functions/acosl.texi
+@include posix-functions/aio_cancel.texi
+@include posix-functions/aio_error.texi
+@include posix-functions/aio_fsync.texi
+@include posix-functions/aio_read.texi
+@include posix-functions/aio_return.texi
+@include posix-functions/aio_suspend.texi
+@include posix-functions/aio_write.texi
+@include posix-functions/alarm.texi
+@include posix-functions/alphasort.texi
+@include posix-functions/asctime.texi
+@include posix-functions/asctime_r.texi
+@include posix-functions/asin.texi
+@include posix-functions/asinf.texi
+@include posix-functions/asinh.texi
+@include posix-functions/asinhf.texi
+@include posix-functions/asinhl.texi
+@include posix-functions/asinl.texi
+@include posix-functions/assert.texi
+@include posix-functions/atan.texi
+@include posix-functions/atan2.texi
+@include posix-functions/atan2f.texi
+@include posix-functions/atan2l.texi
+@include posix-functions/atanf.texi
+@include posix-functions/atanh.texi
+@include posix-functions/atanhf.texi
+@include posix-functions/atanhl.texi
+@include posix-functions/atanl.texi
+@include posix-functions/atexit.texi
+@include posix-functions/atof.texi
+@include posix-functions/atoi.texi
+@include posix-functions/atol.texi
+@include posix-functions/atoll.texi
+@include posix-functions/basename.texi
+@include posix-functions/bind.texi
+@include posix-functions/bsearch.texi
+@include posix-functions/btowc.texi
+@include posix-functions/cabs.texi
+@include posix-functions/cabsf.texi
+@include posix-functions/cabsl.texi
+@include posix-functions/cacos.texi
+@include posix-functions/cacosf.texi
+@include posix-functions/cacosh.texi
+@include posix-functions/cacoshf.texi
+@include posix-functions/cacoshl.texi
+@include posix-functions/cacosl.texi
+@include posix-functions/calloc.texi
+@include posix-functions/carg.texi
+@include posix-functions/cargf.texi
+@include posix-functions/cargl.texi
+@include posix-functions/casin.texi
+@include posix-functions/casinf.texi
+@include posix-functions/casinh.texi
+@include posix-functions/casinhf.texi
+@include posix-functions/casinhl.texi
+@include posix-functions/casinl.texi
+@include posix-functions/catan.texi
+@include posix-functions/catanf.texi
+@include posix-functions/catanh.texi
+@include posix-functions/catanhf.texi
+@include posix-functions/catanhl.texi
+@include posix-functions/catanl.texi
+@include posix-functions/catclose.texi
+@include posix-functions/catgets.texi
+@include posix-functions/catopen.texi
+@include posix-functions/cbrt.texi
+@include posix-functions/cbrtf.texi
+@include posix-functions/cbrtl.texi
+@include posix-functions/ccos.texi
+@include posix-functions/ccosf.texi
+@include posix-functions/ccosh.texi
+@include posix-functions/ccoshf.texi
+@include posix-functions/ccoshl.texi
+@include posix-functions/ccosl.texi
+@include posix-functions/ceil.texi
+@include posix-functions/ceilf.texi
+@include posix-functions/ceill.texi
+@include posix-functions/cexp.texi
+@include posix-functions/cexpf.texi
+@include posix-functions/cexpl.texi
+@include posix-functions/cfgetispeed.texi
+@include posix-functions/cfgetospeed.texi
+@include posix-functions/cfsetispeed.texi
+@include posix-functions/cfsetospeed.texi
+@include posix-functions/chdir.texi
+@include posix-functions/chmod.texi
+@include posix-functions/chown.texi
+@include posix-functions/cimag.texi
+@include posix-functions/cimagf.texi
+@include posix-functions/cimagl.texi
+@include posix-functions/clearerr.texi
+@include posix-functions/clock.texi
+@include posix-functions/clock_getcpuclockid.texi
+@include posix-functions/clock_getres.texi
+@include posix-functions/clock_gettime.texi
+@include posix-functions/clock_nanosleep.texi
+@include posix-functions/clock_settime.texi
+@include posix-functions/clog.texi
+@include posix-functions/clogf.texi
+@include posix-functions/clogl.texi
+@include posix-functions/close.texi
+@include posix-functions/closedir.texi
+@include posix-functions/closelog.texi
+@include posix-functions/confstr.texi
+@include posix-functions/conj.texi
+@include posix-functions/conjf.texi
+@include posix-functions/conjl.texi
+@include posix-functions/connect.texi
+@include posix-functions/copysign.texi
+@include posix-functions/copysignf.texi
+@include posix-functions/copysignl.texi
+@include posix-functions/cos.texi
+@include posix-functions/cosf.texi
+@include posix-functions/cosh.texi
+@include posix-functions/coshf.texi
+@include posix-functions/coshl.texi
+@include posix-functions/cosl.texi
+@include posix-functions/cpow.texi
+@include posix-functions/cpowf.texi
+@include posix-functions/cpowl.texi
+@include posix-functions/cproj.texi
+@include posix-functions/cprojf.texi
+@include posix-functions/cprojl.texi
+@include posix-functions/creal.texi
+@include posix-functions/crealf.texi
+@include posix-functions/creall.texi
+@include posix-functions/creat.texi
+@include posix-functions/crypt.texi
+@include posix-functions/csin.texi
+@include posix-functions/csinf.texi
+@include posix-functions/csinh.texi
+@include posix-functions/csinhf.texi
+@include posix-functions/csinhl.texi
+@include posix-functions/csinl.texi
+@include posix-functions/csqrt.texi
+@include posix-functions/csqrtf.texi
+@include posix-functions/csqrtl.texi
+@include posix-functions/ctan.texi
+@include posix-functions/ctanf.texi
+@include posix-functions/ctanh.texi
+@include posix-functions/ctanhf.texi
+@include posix-functions/ctanhl.texi
+@include posix-functions/ctanl.texi
+@include posix-functions/ctermid.texi
+@include posix-functions/ctime.texi
+@include posix-functions/ctime_r.texi
+@include posix-functions/daylight.texi
+@include posix-functions/dbm_clearerr.texi
+@include posix-functions/dbm_close.texi
+@include posix-functions/dbm_delete.texi
+@include posix-functions/dbm_error.texi
+@include posix-functions/dbm_fetch.texi
+@include posix-functions/dbm_firstkey.texi
+@include posix-functions/dbm_nextkey.texi
+@include posix-functions/dbm_open.texi
+@include posix-functions/dbm_store.texi
+@include posix-functions/difftime.texi
+@include posix-functions/dirfd.texi
+@include posix-functions/dirname.texi
+@include posix-functions/div.texi
+@include posix-functions/dlclose.texi
+@include posix-functions/dlerror.texi
+@include posix-functions/dlopen.texi
+@include posix-functions/dlsym.texi
+@include posix-functions/dprintf.texi
+@include posix-functions/drand48.texi
+@include posix-functions/dup.texi
+@include posix-functions/dup2.texi
+@include posix-functions/duplocale.texi
+@include posix-functions/encrypt.texi
+@include posix-functions/endgrent.texi
+@include posix-functions/endhostent.texi
+@include posix-functions/endnetent.texi
+@include posix-functions/endprotoent.texi
+@include posix-functions/endpwent.texi
+@include posix-functions/endservent.texi
+@include posix-functions/endutxent.texi
+@include posix-functions/environ.texi
+@include posix-functions/erand48.texi
+@include posix-functions/erf.texi
+@include posix-functions/erfc.texi
+@include posix-functions/erfcf.texi
+@include posix-functions/erfcl.texi
+@include posix-functions/erff.texi
+@include posix-functions/erfl.texi
+@include posix-functions/errno.texi
+@include posix-functions/execl.texi
+@include posix-functions/execle.texi
+@include posix-functions/execlp.texi
+@include posix-functions/execv.texi
+@include posix-functions/execve.texi
+@include posix-functions/execvp.texi
+@include posix-functions/exit.texi
+@include posix-functions/exp.texi
+@include posix-functions/exp2.texi
+@include posix-functions/exp2f.texi
+@include posix-functions/exp2l.texi
+@include posix-functions/expf.texi
+@include posix-functions/expl.texi
+@include posix-functions/expm1.texi
+@include posix-functions/expm1f.texi
+@include posix-functions/expm1l.texi
+@include posix-functions/fabs.texi
+@include posix-functions/fabsf.texi
+@include posix-functions/fabsl.texi
+@include posix-functions/faccessat.texi
+@include posix-functions/fattach.texi
+@include posix-functions/fchdir.texi
+@include posix-functions/fchmod.texi
+@include posix-functions/fchmodat.texi
+@include posix-functions/fchown.texi
+@include posix-functions/fchownat.texi
+@include posix-functions/fclose.texi
+@include posix-functions/fcntl.texi
+@include posix-functions/fdatasync.texi
+@include posix-functions/fdetach.texi
+@include posix-functions/fdim.texi
+@include posix-functions/fdimf.texi
+@include posix-functions/fdiml.texi
+@include posix-functions/fdopen.texi
+@include posix-functions/fdopendir.texi
+@include posix-functions/feclearexcept.texi
+@include posix-functions/fegetenv.texi
+@include posix-functions/fegetexceptflag.texi
+@include posix-functions/fegetround.texi
+@include posix-functions/feholdexcept.texi
+@include posix-functions/feof.texi
+@include posix-functions/feraiseexcept.texi
+@include posix-functions/ferror.texi
+@include posix-functions/fesetenv.texi
+@include posix-functions/fesetexceptflag.texi
+@include posix-functions/fesetround.texi
+@include posix-functions/fetestexcept.texi
+@include posix-functions/feupdateenv.texi
+@include posix-functions/fexecve.texi
+@include posix-functions/fflush.texi
+@include posix-functions/ffs.texi
+@include posix-functions/fgetc.texi
+@include posix-functions/fgetpos.texi
+@include posix-functions/fgets.texi
+@include posix-functions/fgetwc.texi
+@include posix-functions/fgetws.texi
+@include posix-functions/fileno.texi
+@include posix-functions/flockfile.texi
+@include posix-functions/floor.texi
+@include posix-functions/floorf.texi
+@include posix-functions/floorl.texi
+@include posix-functions/fma.texi
+@include posix-functions/fmaf.texi
+@include posix-functions/fmal.texi
+@include posix-functions/fmax.texi
+@include posix-functions/fmaxf.texi
+@include posix-functions/fmaxl.texi
+@include posix-functions/fmemopen.texi
+@include posix-functions/fmin.texi
+@include posix-functions/fminf.texi
+@include posix-functions/fminl.texi
+@include posix-functions/fmod.texi
+@include posix-functions/fmodf.texi
+@include posix-functions/fmodl.texi
+@include posix-functions/fmtmsg.texi
+@include posix-functions/fnmatch.texi
+@include posix-functions/fopen.texi
+@include posix-functions/fork.texi
+@include posix-functions/fpathconf.texi
+@include posix-functions/fpclassify.texi
+@include posix-functions/fprintf.texi
+@include posix-functions/fputc.texi
+@include posix-functions/fputs.texi
+@include posix-functions/fputwc.texi
+@include posix-functions/fputws.texi
+@include posix-functions/fread.texi
+@include posix-functions/free.texi
+@include posix-functions/freeaddrinfo.texi
+@include posix-functions/freelocale.texi
+@include posix-functions/freopen.texi
+@include posix-functions/frexp.texi
+@include posix-functions/frexpf.texi
+@include posix-functions/frexpl.texi
+@include posix-functions/fscanf.texi
+@include posix-functions/fseek.texi
+@include posix-functions/fseeko.texi
+@include posix-functions/fsetpos.texi
+@include posix-functions/fstat.texi
+@include posix-functions/fstatat.texi
+@include posix-functions/fstatvfs.texi
+@include posix-functions/fsync.texi
+@include posix-functions/ftell.texi
+@include posix-functions/ftello.texi
+@include posix-functions/ftok.texi
+@include posix-functions/ftruncate.texi
+@include posix-functions/ftrylockfile.texi
+@include posix-functions/ftw.texi
+@include posix-functions/funlockfile.texi
+@include posix-functions/futimens.texi
+@include posix-functions/fwide.texi
+@include posix-functions/fwprintf.texi
+@include posix-functions/fwrite.texi
+@include posix-functions/fwscanf.texi
+@include posix-functions/gai_strerror.texi
+@include posix-functions/getaddrinfo.texi
+@include posix-functions/getc.texi
+@include posix-functions/getc_unlocked.texi
+@include posix-functions/getchar.texi
+@include posix-functions/getchar_unlocked.texi
+@include posix-functions/getcwd.texi
+@include posix-functions/getdate.texi
+@include posix-functions/getdate_err.texi
+@include posix-functions/getdelim.texi
+@include posix-functions/getegid.texi
+@include posix-functions/getenv.texi
+@include posix-functions/geteuid.texi
+@include posix-functions/getgid.texi
+@include posix-functions/getgrent.texi
+@include posix-functions/getgrgid.texi
+@include posix-functions/getgrgid_r.texi
+@include posix-functions/getgrnam.texi
+@include posix-functions/getgrnam_r.texi
+@include posix-functions/getgroups.texi
+@include posix-functions/gethostent.texi
+@include posix-functions/gethostid.texi
+@include posix-functions/gethostname.texi
+@include posix-functions/getitimer.texi
+@include posix-functions/getline.texi
+@include posix-functions/getlogin.texi
+@include posix-functions/getlogin_r.texi
+@include posix-functions/getmsg.texi
+@include posix-functions/getnameinfo.texi
+@include posix-functions/getnetbyaddr.texi
+@include posix-functions/getnetbyname.texi
+@include posix-functions/getnetent.texi
+@include posix-functions/getopt.texi
+@include posix-functions/getpeername.texi
+@include posix-functions/getpgid.texi
+@include posix-functions/getpgrp.texi
+@include posix-functions/getpid.texi
+@include posix-functions/getpmsg.texi
+@include posix-functions/getppid.texi
+@include posix-functions/getpriority.texi
+@include posix-functions/getprotobyname.texi
+@include posix-functions/getprotobynumber.texi
+@include posix-functions/getprotoent.texi
+@include posix-functions/getpwent.texi
+@include posix-functions/getpwnam.texi
+@include posix-functions/getpwnam_r.texi
+@include posix-functions/getpwuid.texi
+@include posix-functions/getpwuid_r.texi
+@include posix-functions/getrlimit.texi
+@include posix-functions/getrusage.texi
+@include posix-functions/gets.texi
+@include posix-functions/getservbyname.texi
+@include posix-functions/getservbyport.texi
+@include posix-functions/getservent.texi
+@include posix-functions/getsid.texi
+@include posix-functions/getsockname.texi
+@include posix-functions/getsockopt.texi
+@include posix-functions/getsubopt.texi
+@include posix-functions/gettimeofday.texi
+@include posix-functions/getuid.texi
+@include posix-functions/getutxent.texi
+@include posix-functions/getutxid.texi
+@include posix-functions/getutxline.texi
+@include posix-functions/getwc.texi
+@include posix-functions/getwchar.texi
+@include posix-functions/glob.texi
+@include posix-functions/globfree.texi
+@include posix-functions/gmtime.texi
+@include posix-functions/gmtime_r.texi
+@include posix-functions/grantpt.texi
+@include posix-functions/hcreate.texi
+@include posix-functions/hdestroy.texi
+@include posix-functions/hsearch.texi
+@include posix-functions/htonl.texi
+@include posix-functions/htons.texi
+@include posix-functions/hypot.texi
+@include posix-functions/hypotf.texi
+@include posix-functions/hypotl.texi
+@include posix-functions/iconv.texi
+@include posix-functions/iconv_close.texi
+@include posix-functions/iconv_open.texi
+@include posix-functions/if_freenameindex.texi
+@include posix-functions/if_indextoname.texi
+@include posix-functions/if_nameindex.texi
+@include posix-functions/if_nametoindex.texi
+@include posix-functions/ilogb.texi
+@include posix-functions/ilogbf.texi
+@include posix-functions/ilogbl.texi
+@include posix-functions/imaxabs.texi
+@include posix-functions/imaxdiv.texi
+@include posix-functions/inet_addr.texi
+@include posix-functions/inet_ntoa.texi
+@include posix-functions/inet_ntop.texi
+@include posix-functions/inet_pton.texi
+@include posix-functions/initstate.texi
+@include posix-functions/insque.texi
+@include posix-functions/ioctl.texi
+@include posix-functions/isalnum.texi
+@include posix-functions/isalnum_l.texi
+@include posix-functions/isalpha.texi
+@include posix-functions/isalpha_l.texi
+@include posix-functions/isascii.texi
+@include posix-functions/isastream.texi
+@include posix-functions/isatty.texi
+@include posix-functions/isblank.texi
+@include posix-functions/isblank_l.texi
+@include posix-functions/iscntrl.texi
+@include posix-functions/iscntrl_l.texi
+@include posix-functions/isdigit.texi
+@include posix-functions/isdigit_l.texi
+@include posix-functions/isfinite.texi
+@include posix-functions/isgraph.texi
+@include posix-functions/isgraph_l.texi
+@include posix-functions/isgreater.texi
+@include posix-functions/isgreaterequal.texi
+@include posix-functions/isinf.texi
+@include posix-functions/isless.texi
+@include posix-functions/islessequal.texi
+@include posix-functions/islessgreater.texi
+@include posix-functions/islower.texi
+@include posix-functions/islower_l.texi
+@include posix-functions/isnan.texi
+@include posix-functions/isnormal.texi
+@include posix-functions/isprint.texi
+@include posix-functions/isprint_l.texi
+@include posix-functions/ispunct.texi
+@include posix-functions/ispunct_l.texi
+@include posix-functions/isspace.texi
+@include posix-functions/isspace_l.texi
+@include posix-functions/isunordered.texi
+@include posix-functions/isupper.texi
+@include posix-functions/isupper_l.texi
+@include posix-functions/iswalnum.texi
+@include posix-functions/iswalnum_l.texi
+@include posix-functions/iswalpha.texi
+@include posix-functions/iswalpha_l.texi
+@include posix-functions/iswblank.texi
+@include posix-functions/iswblank_l.texi
+@include posix-functions/iswcntrl.texi
+@include posix-functions/iswcntrl_l.texi
+@include posix-functions/iswctype.texi
+@include posix-functions/iswctype_l.texi
+@include posix-functions/iswdigit.texi
+@include posix-functions/iswdigit_l.texi
+@include posix-functions/iswgraph.texi
+@include posix-functions/iswgraph_l.texi
+@include posix-functions/iswlower.texi
+@include posix-functions/iswlower_l.texi
+@include posix-functions/iswprint.texi
+@include posix-functions/iswprint_l.texi
+@include posix-functions/iswpunct.texi
+@include posix-functions/iswpunct_l.texi
+@include posix-functions/iswspace.texi
+@include posix-functions/iswspace_l.texi
+@include posix-functions/iswupper.texi
+@include posix-functions/iswupper_l.texi
+@include posix-functions/iswxdigit.texi
+@include posix-functions/iswxdigit_l.texi
+@include posix-functions/isxdigit.texi
+@include posix-functions/isxdigit_l.texi
+@include posix-functions/j0.texi
+@include posix-functions/j1.texi
+@include posix-functions/jn.texi
+@include posix-functions/jrand48.texi
+@include posix-functions/kill.texi
+@include posix-functions/killpg.texi
+@include posix-functions/l64a.texi
+@include posix-functions/labs.texi
+@include posix-functions/lchown.texi
+@include posix-functions/lcong48.texi
+@include posix-functions/ldexp.texi
+@include posix-functions/ldexpf.texi
+@include posix-functions/ldexpl.texi
+@include posix-functions/ldiv.texi
+@include posix-functions/lfind.texi
+@include posix-functions/lgamma.texi
+@include posix-functions/lgammaf.texi
+@include posix-functions/lgammal.texi
+@include posix-functions/link.texi
+@include posix-functions/linkat.texi
+@include posix-functions/lio_listio.texi
+@include posix-functions/listen.texi
+@include posix-functions/llabs.texi
+@include posix-functions/lldiv.texi
+@include posix-functions/llrint.texi
+@include posix-functions/llrintf.texi
+@include posix-functions/llrintl.texi
+@include posix-functions/llround.texi
+@include posix-functions/llroundf.texi
+@include posix-functions/llroundl.texi
+@include posix-functions/localeconv.texi
+@include posix-functions/localtime.texi
+@include posix-functions/localtime_r.texi
+@include posix-functions/lockf.texi
+@include posix-functions/log.texi
+@include posix-functions/log10.texi
+@include posix-functions/log10f.texi
+@include posix-functions/log10l.texi
+@include posix-functions/log1p.texi
+@include posix-functions/log1pf.texi
+@include posix-functions/log1pl.texi
+@include posix-functions/log2.texi
+@include posix-functions/log2f.texi
+@include posix-functions/log2l.texi
+@include posix-functions/logb.texi
+@include posix-functions/logbf.texi
+@include posix-functions/logbl.texi
+@include posix-functions/logf.texi
+@include posix-functions/logl.texi
+@include posix-functions/longjmp.texi
+@include posix-functions/lrand48.texi
+@include posix-functions/lrint.texi
+@include posix-functions/lrintf.texi
+@include posix-functions/lrintl.texi
+@include posix-functions/lround.texi
+@include posix-functions/lroundf.texi
+@include posix-functions/lroundl.texi
+@include posix-functions/lsearch.texi
+@include posix-functions/lseek.texi
+@include posix-functions/lstat.texi
+@include posix-functions/malloc.texi
+@include posix-functions/mblen.texi
+@include posix-functions/mbrlen.texi
+@include posix-functions/mbrtowc.texi
+@include posix-functions/mbsinit.texi
+@include posix-functions/mbsnrtowcs.texi
+@include posix-functions/mbsrtowcs.texi
+@include posix-functions/mbstowcs.texi
+@include posix-functions/mbtowc.texi
+@include posix-functions/memccpy.texi
+@include posix-functions/memchr.texi
+@include posix-functions/memcmp.texi
+@include posix-functions/memcpy.texi
+@include posix-functions/memmove.texi
+@include posix-functions/memset.texi
+@include posix-functions/mkdir.texi
+@include posix-functions/mkdirat.texi
+@include posix-functions/mkdtemp.texi
+@include posix-functions/mkfifo.texi
+@include posix-functions/mkfifoat.texi
+@include posix-functions/mknod.texi
+@include posix-functions/mknodat.texi
+@include posix-functions/mkstemp.texi
+@include posix-functions/mktime.texi
+@include posix-functions/mlock.texi
+@include posix-functions/mlockall.texi
+@include posix-functions/mmap.texi
+@include posix-functions/modf.texi
+@include posix-functions/modff.texi
+@include posix-functions/modfl.texi
+@include posix-functions/mprotect.texi
+@include posix-functions/mq_close.texi
+@include posix-functions/mq_getattr.texi
+@include posix-functions/mq_notify.texi
+@include posix-functions/mq_open.texi
+@include posix-functions/mq_receive.texi
+@include posix-functions/mq_send.texi
+@include posix-functions/mq_setattr.texi
+@include posix-functions/mq_timedreceive.texi
+@include posix-functions/mq_timedsend.texi
+@include posix-functions/mq_unlink.texi
+@include posix-functions/mrand48.texi
+@include posix-functions/msgctl.texi
+@include posix-functions/msgget.texi
+@include posix-functions/msgrcv.texi
+@include posix-functions/msgsnd.texi
+@include posix-functions/msync.texi
+@include posix-functions/munlock.texi
+@include posix-functions/munlockall.texi
+@include posix-functions/munmap.texi
+@include posix-functions/nan.texi
+@include posix-functions/nanf.texi
+@include posix-functions/nanl.texi
+@include posix-functions/nanosleep.texi
+@include posix-functions/nearbyint.texi
+@include posix-functions/nearbyintf.texi
+@include posix-functions/nearbyintl.texi
+@include posix-functions/newlocale.texi
+@include posix-functions/nextafter.texi
+@include posix-functions/nextafterf.texi
+@include posix-functions/nextafterl.texi
+@include posix-functions/nexttoward.texi
+@include posix-functions/nexttowardf.texi
+@include posix-functions/nexttowardl.texi
+@include posix-functions/nftw.texi
+@include posix-functions/nice.texi
+@include posix-functions/nl_langinfo.texi
+@include posix-functions/nl_langinfo_l.texi
+@include posix-functions/nrand48.texi
+@include posix-functions/ntohl.texi
+@include posix-functions/ntohs.texi
+@include posix-functions/open.texi
+@include posix-functions/openat.texi
+@include posix-functions/opendir.texi
+@include posix-functions/openlog.texi
+@include posix-functions/open_memstream.texi
+@include posix-functions/open_wmemstream.texi
+@include posix-functions/optarg.texi
+@include posix-functions/opterr.texi
+@include posix-functions/optind.texi
+@include posix-functions/optopt.texi
+@include posix-functions/pathconf.texi
+@include posix-functions/pause.texi
+@include posix-functions/pclose.texi
+@include posix-functions/perror.texi
+@include posix-functions/pipe.texi
+@include posix-functions/poll.texi
+@include posix-functions/popen.texi
+@include posix-functions/posix_fadvise.texi
+@include posix-functions/posix_fallocate.texi
+@include posix-functions/posix_madvise.texi
+@include posix-functions/posix_mem_offset.texi
+@include posix-functions/posix_memalign.texi
+@include posix-functions/posix_openpt.texi
+@include posix-functions/posix_spawn.texi
+@include posix-functions/posix_spawn_file_actions_addclose.texi
+@include posix-functions/posix_spawn_file_actions_adddup2.texi
+@include posix-functions/posix_spawn_file_actions_addopen.texi
+@include posix-functions/posix_spawn_file_actions_destroy.texi
+@include posix-functions/posix_spawn_file_actions_init.texi
+@include posix-functions/posix_spawnattr_destroy.texi
+@include posix-functions/posix_spawnattr_getflags.texi
+@include posix-functions/posix_spawnattr_getpgroup.texi
+@include posix-functions/posix_spawnattr_getschedparam.texi
+@include posix-functions/posix_spawnattr_getschedpolicy.texi
+@include posix-functions/posix_spawnattr_getsigdefault.texi
+@include posix-functions/posix_spawnattr_getsigmask.texi
+@include posix-functions/posix_spawnattr_init.texi
+@include posix-functions/posix_spawnattr_setflags.texi
+@include posix-functions/posix_spawnattr_setpgroup.texi
+@include posix-functions/posix_spawnattr_setschedparam.texi
+@include posix-functions/posix_spawnattr_setschedpolicy.texi
+@include posix-functions/posix_spawnattr_setsigdefault.texi
+@include posix-functions/posix_spawnattr_setsigmask.texi
+@include posix-functions/posix_spawnp.texi
+@include posix-functions/posix_trace_attr_destroy.texi
+@include posix-functions/posix_trace_attr_getclockres.texi
+@include posix-functions/posix_trace_attr_getcreatetime.texi
+@include posix-functions/posix_trace_attr_getgenversion.texi
+@include posix-functions/posix_trace_attr_getinherited.texi
+@include posix-functions/posix_trace_attr_getlogfullpolicy.texi
+@include posix-functions/posix_trace_attr_getlogsize.texi
+@include posix-functions/posix_trace_attr_getmaxdatasize.texi
+@include posix-functions/posix_trace_attr_getmaxsystemeventsize.texi
+@include posix-functions/posix_trace_attr_getmaxusereventsize.texi
+@include posix-functions/posix_trace_attr_getname.texi
+@include posix-functions/posix_trace_attr_getstreamfullpolicy.texi
+@include posix-functions/posix_trace_attr_getstreamsize.texi
+@include posix-functions/posix_trace_attr_init.texi
+@include posix-functions/posix_trace_attr_setinherited.texi
+@include posix-functions/posix_trace_attr_setlogfullpolicy.texi
+@include posix-functions/posix_trace_attr_setlogsize.texi
+@include posix-functions/posix_trace_attr_setmaxdatasize.texi
+@include posix-functions/posix_trace_attr_setname.texi
+@include posix-functions/posix_trace_attr_setstreamfullpolicy.texi
+@include posix-functions/posix_trace_attr_setstreamsize.texi
+@include posix-functions/posix_trace_clear.texi
+@include posix-functions/posix_trace_close.texi
+@include posix-functions/posix_trace_create.texi
+@include posix-functions/posix_trace_create_withlog.texi
+@include posix-functions/posix_trace_event.texi
+@include posix-functions/posix_trace_eventid_equal.texi
+@include posix-functions/posix_trace_eventid_get_name.texi
+@include posix-functions/posix_trace_eventid_open.texi
+@include posix-functions/posix_trace_eventset_add.texi
+@include posix-functions/posix_trace_eventset_del.texi
+@include posix-functions/posix_trace_eventset_empty.texi
+@include posix-functions/posix_trace_eventset_fill.texi
+@include posix-functions/posix_trace_eventset_ismember.texi
+@include posix-functions/posix_trace_eventtypelist_getnext_id.texi
+@include posix-functions/posix_trace_eventtypelist_rewind.texi
+@include posix-functions/posix_trace_flush.texi
+@include posix-functions/posix_trace_get_attr.texi
+@include posix-functions/posix_trace_get_filter.texi
+@include posix-functions/posix_trace_get_status.texi
+@include posix-functions/posix_trace_getnext_event.texi
+@include posix-functions/posix_trace_open.texi
+@include posix-functions/posix_trace_rewind.texi
+@include posix-functions/posix_trace_set_filter.texi
+@include posix-functions/posix_trace_shutdown.texi
+@include posix-functions/posix_trace_start.texi
+@include posix-functions/posix_trace_stop.texi
+@include posix-functions/posix_trace_timedgetnext_event.texi
+@include posix-functions/posix_trace_trid_eventid_open.texi
+@include posix-functions/posix_trace_trygetnext_event.texi
+@include posix-functions/posix_typed_mem_get_info.texi
+@include posix-functions/posix_typed_mem_open.texi
+@include posix-functions/pow.texi
+@include posix-functions/powf.texi
+@include posix-functions/powl.texi
+@include posix-functions/pread.texi
+@include posix-functions/printf.texi
+@include posix-functions/pselect.texi
+@include posix-functions/psiginfo.texi
+@include posix-functions/psignal.texi
+@include posix-functions/pthread_atfork.texi
+@include posix-functions/pthread_attr_destroy.texi
+@include posix-functions/pthread_attr_getdetachstate.texi
+@include posix-functions/pthread_attr_getguardsize.texi
+@include posix-functions/pthread_attr_getinheritsched.texi
+@include posix-functions/pthread_attr_getschedparam.texi
+@include posix-functions/pthread_attr_getschedpolicy.texi
+@include posix-functions/pthread_attr_getscope.texi
+@include posix-functions/pthread_attr_getstack.texi
+@include posix-functions/pthread_attr_getstacksize.texi
+@include posix-functions/pthread_attr_init.texi
+@include posix-functions/pthread_attr_setdetachstate.texi
+@include posix-functions/pthread_attr_setguardsize.texi
+@include posix-functions/pthread_attr_setinheritsched.texi
+@include posix-functions/pthread_attr_setschedparam.texi
+@include posix-functions/pthread_attr_setschedpolicy.texi
+@include posix-functions/pthread_attr_setscope.texi
+@include posix-functions/pthread_attr_setstack.texi
+@include posix-functions/pthread_attr_setstacksize.texi
+@include posix-functions/pthread_barrier_destroy.texi
+@include posix-functions/pthread_barrier_init.texi
+@include posix-functions/pthread_barrier_wait.texi
+@include posix-functions/pthread_barrierattr_destroy.texi
+@include posix-functions/pthread_barrierattr_getpshared.texi
+@include posix-functions/pthread_barrierattr_init.texi
+@include posix-functions/pthread_barrierattr_setpshared.texi
+@include posix-functions/pthread_cancel.texi
+@include posix-functions/pthread_cleanup_pop.texi
+@include posix-functions/pthread_cleanup_push.texi
+@include posix-functions/pthread_cond_broadcast.texi
+@include posix-functions/pthread_cond_destroy.texi
+@include posix-functions/pthread_cond_init.texi
+@include posix-functions/pthread_cond_signal.texi
+@include posix-functions/pthread_cond_timedwait.texi
+@include posix-functions/pthread_cond_wait.texi
+@include posix-functions/pthread_condattr_destroy.texi
+@include posix-functions/pthread_condattr_getclock.texi
+@include posix-functions/pthread_condattr_getpshared.texi
+@include posix-functions/pthread_condattr_init.texi
+@include posix-functions/pthread_condattr_setclock.texi
+@include posix-functions/pthread_condattr_setpshared.texi
+@include posix-functions/pthread_create.texi
+@include posix-functions/pthread_detach.texi
+@include posix-functions/pthread_equal.texi
+@include posix-functions/pthread_exit.texi
+@include posix-functions/pthread_getconcurrency.texi
+@include posix-functions/pthread_getcpuclockid.texi
+@include posix-functions/pthread_getschedparam.texi
+@include posix-functions/pthread_getspecific.texi
+@include posix-functions/pthread_join.texi
+@include posix-functions/pthread_key_create.texi
+@include posix-functions/pthread_key_delete.texi
+@include posix-functions/pthread_kill.texi
+@include posix-functions/pthread_mutex_consistent.texi
+@include posix-functions/pthread_mutex_destroy.texi
+@include posix-functions/pthread_mutex_getprioceiling.texi
+@include posix-functions/pthread_mutex_init.texi
+@include posix-functions/pthread_mutex_lock.texi
+@include posix-functions/pthread_mutex_setprioceiling.texi
+@include posix-functions/pthread_mutex_timedlock.texi
+@include posix-functions/pthread_mutex_trylock.texi
+@include posix-functions/pthread_mutex_unlock.texi
+@include posix-functions/pthread_mutexattr_destroy.texi
+@include posix-functions/pthread_mutexattr_getprioceiling.texi
+@include posix-functions/pthread_mutexattr_getprotocol.texi
+@include posix-functions/pthread_mutexattr_getpshared.texi
+@include posix-functions/pthread_mutexattr_getrobust.texi
+@include posix-functions/pthread_mutexattr_gettype.texi
+@include posix-functions/pthread_mutexattr_init.texi
+@include posix-functions/pthread_mutexattr_setprioceiling.texi
+@include posix-functions/pthread_mutexattr_setprotocol.texi
+@include posix-functions/pthread_mutexattr_setpshared.texi
+@include posix-functions/pthread_mutexattr_setrobust.texi
+@include posix-functions/pthread_mutexattr_settype.texi
+@include posix-functions/pthread_once.texi
+@include posix-functions/pthread_rwlock_destroy.texi
+@include posix-functions/pthread_rwlock_init.texi
+@include posix-functions/pthread_rwlock_rdlock.texi
+@include posix-functions/pthread_rwlock_timedrdlock.texi
+@include posix-functions/pthread_rwlock_timedwrlock.texi
+@include posix-functions/pthread_rwlock_tryrdlock.texi
+@include posix-functions/pthread_rwlock_trywrlock.texi
+@include posix-functions/pthread_rwlock_unlock.texi
+@include posix-functions/pthread_rwlock_wrlock.texi
+@include posix-functions/pthread_rwlockattr_destroy.texi
+@include posix-functions/pthread_rwlockattr_getpshared.texi
+@include posix-functions/pthread_rwlockattr_init.texi
+@include posix-functions/pthread_rwlockattr_setpshared.texi
+@include posix-functions/pthread_self.texi
+@include posix-functions/pthread_setcancelstate.texi
+@include posix-functions/pthread_setcanceltype.texi
+@include posix-functions/pthread_setconcurrency.texi
+@include posix-functions/pthread_setschedparam.texi
+@include posix-functions/pthread_setschedprio.texi
+@include posix-functions/pthread_setspecific.texi
+@include posix-functions/pthread_sigmask.texi
+@include posix-functions/pthread_spin_destroy.texi
+@include posix-functions/pthread_spin_init.texi
+@include posix-functions/pthread_spin_lock.texi
+@include posix-functions/pthread_spin_trylock.texi
+@include posix-functions/pthread_spin_unlock.texi
+@include posix-functions/pthread_testcancel.texi
+@include posix-functions/ptsname.texi
+@include posix-functions/putc.texi
+@include posix-functions/putc_unlocked.texi
+@include posix-functions/putchar.texi
+@include posix-functions/putchar_unlocked.texi
+@include posix-functions/putenv.texi
+@include posix-functions/putmsg.texi
+@include posix-functions/putpmsg.texi
+@include posix-functions/puts.texi
+@include posix-functions/pututxline.texi
+@include posix-functions/putwc.texi
+@include posix-functions/putwchar.texi
+@include posix-functions/pwrite.texi
+@include posix-functions/qsort.texi
+@include posix-functions/raise.texi
+@include posix-functions/rand.texi
+@include posix-functions/rand_r.texi
+@include posix-functions/random.texi
+@include posix-functions/read.texi
+@include posix-functions/readdir.texi
+@include posix-functions/readdir_r.texi
+@include posix-functions/readlink.texi
+@include posix-functions/readlinkat.texi
+@include posix-functions/readv.texi
+@include posix-functions/realloc.texi
+@include posix-functions/realpath.texi
+@include posix-functions/recv.texi
+@include posix-functions/recvfrom.texi
+@include posix-functions/recvmsg.texi
+@include posix-functions/regcomp.texi
+@include posix-functions/regerror.texi
+@include posix-functions/regexec.texi
+@include posix-functions/regfree.texi
+@include posix-functions/remainder.texi
+@include posix-functions/remainderf.texi
+@include posix-functions/remainderl.texi
+@include posix-functions/remove.texi
+@include posix-functions/remque.texi
+@include posix-functions/remquo.texi
+@include posix-functions/remquof.texi
+@include posix-functions/remquol.texi
+@include posix-functions/rename.texi
+@include posix-functions/renameat.texi
+@include posix-functions/rewind.texi
+@include posix-functions/rewinddir.texi
+@include posix-functions/rint.texi
+@include posix-functions/rintf.texi
+@include posix-functions/rintl.texi
+@include posix-functions/rmdir.texi
+@include posix-functions/round.texi
+@include posix-functions/roundf.texi
+@include posix-functions/roundl.texi
+@include posix-functions/scalbln.texi
+@include posix-functions/scalblnf.texi
+@include posix-functions/scalblnl.texi
+@include posix-functions/scalbn.texi
+@include posix-functions/scalbnf.texi
+@include posix-functions/scalbnl.texi
+@include posix-functions/scandir.texi
+@include posix-functions/scanf.texi
+@include posix-functions/sched_get_priority_max.texi
+@include posix-functions/sched_get_priority_min.texi
+@include posix-functions/sched_getparam.texi
+@include posix-functions/sched_getscheduler.texi
+@include posix-functions/sched_rr_get_interval.texi
+@include posix-functions/sched_setparam.texi
+@include posix-functions/sched_setscheduler.texi
+@include posix-functions/sched_yield.texi
+@include posix-functions/seed48.texi
+@include posix-functions/seekdir.texi
+@include posix-functions/select.texi
+@include posix-functions/sem_close.texi
+@include posix-functions/sem_destroy.texi
+@include posix-functions/sem_getvalue.texi
+@include posix-functions/sem_init.texi
+@include posix-functions/sem_open.texi
+@include posix-functions/sem_post.texi
+@include posix-functions/sem_timedwait.texi
+@include posix-functions/sem_trywait.texi
+@include posix-functions/sem_unlink.texi
+@include posix-functions/sem_wait.texi
+@include posix-functions/semctl.texi
+@include posix-functions/semget.texi
+@include posix-functions/semop.texi
+@include posix-functions/send.texi
+@include posix-functions/sendmsg.texi
+@include posix-functions/sendto.texi
+@include posix-functions/setbuf.texi
+@include posix-functions/setegid.texi
+@include posix-functions/setenv.texi
+@include posix-functions/seteuid.texi
+@include posix-functions/setgid.texi
+@include posix-functions/setgrent.texi
+@include posix-functions/sethostent.texi
+@include posix-functions/setitimer.texi
+@include posix-functions/setjmp.texi
+@include posix-functions/setkey.texi
+@include posix-functions/setlocale.texi
+@include posix-functions/setlogmask.texi
+@include posix-functions/setnetent.texi
+@include posix-functions/setpgid.texi
+@include posix-functions/setpgrp.texi
+@include posix-functions/setpriority.texi
+@include posix-functions/setprotoent.texi
+@include posix-functions/setpwent.texi
+@include posix-functions/setregid.texi
+@include posix-functions/setreuid.texi
+@include posix-functions/setrlimit.texi
+@include posix-functions/setservent.texi
+@include posix-functions/setsid.texi
+@include posix-functions/setsockopt.texi
+@include posix-functions/setstate.texi
+@include posix-functions/setuid.texi
+@include posix-functions/setutxent.texi
+@include posix-functions/setvbuf.texi
+@include posix-functions/shm_open.texi
+@include posix-functions/shm_unlink.texi
+@include posix-functions/shmat.texi
+@include posix-functions/shmctl.texi
+@include posix-functions/shmdt.texi
+@include posix-functions/shmget.texi
+@include posix-functions/shutdown.texi
+@include posix-functions/sigaction.texi
+@include posix-functions/sigaddset.texi
+@include posix-functions/sigaltstack.texi
+@include posix-functions/sigdelset.texi
+@include posix-functions/sigemptyset.texi
+@include posix-functions/sigfillset.texi
+@include posix-functions/sighold.texi
+@include posix-functions/sigignore.texi
+@include posix-functions/siginterrupt.texi
+@include posix-functions/sigismember.texi
+@include posix-functions/siglongjmp.texi
+@include posix-functions/signal.texi
+@include posix-functions/signbit.texi
+@include posix-functions/signgam.texi
+@include posix-functions/sigpause.texi
+@include posix-functions/sigpending.texi
+@include posix-functions/sigprocmask.texi
+@include posix-functions/sigqueue.texi
+@include posix-functions/sigrelse.texi
+@include posix-functions/sigset.texi
+@include posix-functions/sigsetjmp.texi
+@include posix-functions/sigsuspend.texi
+@include posix-functions/sigtimedwait.texi
+@include posix-functions/sigwait.texi
+@include posix-functions/sigwaitinfo.texi
+@include posix-functions/sin.texi
+@include posix-functions/sinf.texi
+@include posix-functions/sinh.texi
+@include posix-functions/sinhf.texi
+@include posix-functions/sinhl.texi
+@include posix-functions/sinl.texi
+@include posix-functions/sleep.texi
+@include posix-functions/snprintf.texi
+@include posix-functions/sockatmark.texi
+@include posix-functions/socket.texi
+@include posix-functions/socketpair.texi
+@include posix-functions/sprintf.texi
+@include posix-functions/sqrt.texi
+@include posix-functions/sqrtf.texi
+@include posix-functions/sqrtl.texi
+@include posix-functions/srand.texi
+@include posix-functions/srand48.texi
+@include posix-functions/srandom.texi
+@include posix-functions/sscanf.texi
+@include posix-functions/stat.texi
+@include posix-functions/statvfs.texi
+@include posix-functions/stderr.texi
+@include posix-functions/stdin.texi
+@include posix-functions/stdout.texi
+@include posix-functions/stpcpy.texi
+@include posix-functions/stpncpy.texi
+@include posix-functions/strcasecmp.texi
+@include posix-functions/strcasecmp_l.texi
+@include posix-functions/strcat.texi
+@include posix-functions/strchr.texi
+@include posix-functions/strcmp.texi
+@include posix-functions/strcoll.texi
+@include posix-functions/strcoll_l.texi
+@include posix-functions/strcpy.texi
+@include posix-functions/strcspn.texi
+@include posix-functions/strdup.texi
+@include posix-functions/strerror.texi
+@include posix-functions/strerror_l.texi
+@include posix-functions/strerror_r.texi
+@include posix-functions/strfmon.texi
+@include posix-functions/strfmon_l.texi
+@include posix-functions/strftime.texi
+@include posix-functions/strftime_l.texi
+@include posix-functions/strlen.texi
+@include posix-functions/strncasecmp.texi
+@include posix-functions/strncasecmp_l.texi
+@include posix-functions/strncat.texi
+@include posix-functions/strncmp.texi
+@include posix-functions/strncpy.texi
+@include posix-functions/strndup.texi
+@include posix-functions/strnlen.texi
+@include posix-functions/strpbrk.texi
+@include posix-functions/strptime.texi
+@include posix-functions/strrchr.texi
+@include posix-functions/strsignal.texi
+@include posix-functions/strspn.texi
+@include posix-functions/strstr.texi
+@include posix-functions/strtod.texi
+@include posix-functions/strtof.texi
+@include posix-functions/strtoimax.texi
+@include posix-functions/strtok.texi
+@include posix-functions/strtok_r.texi
+@include posix-functions/strtol.texi
+@include posix-functions/strtold.texi
+@include posix-functions/strtoll.texi
+@include posix-functions/strtoul.texi
+@include posix-functions/strtoull.texi
+@include posix-functions/strtoumax.texi
+@include posix-functions/strxfrm.texi
+@include posix-functions/strxfrm_l.texi
+@include posix-functions/swab.texi
+@include posix-functions/swprintf.texi
+@include posix-functions/swscanf.texi
+@include posix-functions/symlink.texi
+@include posix-functions/symlinkat.texi
+@include posix-functions/sync.texi
+@include posix-functions/sysconf.texi
+@include posix-functions/syslog.texi
+@include posix-functions/system.texi
+@include posix-functions/tan.texi
+@include posix-functions/tanf.texi
+@include posix-functions/tanh.texi
+@include posix-functions/tanhf.texi
+@include posix-functions/tanhl.texi
+@include posix-functions/tanl.texi
+@include posix-functions/tcdrain.texi
+@include posix-functions/tcflow.texi
+@include posix-functions/tcflush.texi
+@include posix-functions/tcgetattr.texi
+@include posix-functions/tcgetpgrp.texi
+@include posix-functions/tcgetsid.texi
+@include posix-functions/tcsendbreak.texi
+@include posix-functions/tcsetattr.texi
+@include posix-functions/tcsetpgrp.texi
+@include posix-functions/tdelete.texi
+@include posix-functions/telldir.texi
+@include posix-functions/tempnam.texi
+@include posix-functions/tfind.texi
+@include posix-functions/tgamma.texi
+@include posix-functions/tgammaf.texi
+@include posix-functions/tgammal.texi
+@include posix-functions/time.texi
+@include posix-functions/timer_create.texi
+@include posix-functions/timer_delete.texi
+@include posix-functions/timer_getoverrun.texi
+@include posix-functions/timer_gettime.texi
+@include posix-functions/timer_settime.texi
+@include posix-functions/times.texi
+@include posix-functions/timezone.texi
+@include posix-functions/tmpfile.texi
+@include posix-functions/tmpnam.texi
+@include posix-functions/toascii.texi
+@include posix-functions/tolower.texi
+@include posix-functions/tolower_l.texi
+@include posix-functions/toupper.texi
+@include posix-functions/toupper_l.texi
+@include posix-functions/towctrans.texi
+@include posix-functions/towctrans_l.texi
+@include posix-functions/towlower.texi
+@include posix-functions/towlower_l.texi
+@include posix-functions/towupper.texi
+@include posix-functions/towupper_l.texi
+@include posix-functions/trunc.texi
+@include posix-functions/truncate.texi
+@include posix-functions/truncf.texi
+@include posix-functions/truncl.texi
+@include posix-functions/tsearch.texi
+@include posix-functions/ttyname.texi
+@include posix-functions/ttyname_r.texi
+@include posix-functions/twalk.texi
+@include posix-functions/tzname.texi
+@include posix-functions/tzset.texi
+@include posix-functions/ulimit.texi
+@include posix-functions/umask.texi
+@include posix-functions/uname.texi
+@include posix-functions/ungetc.texi
+@include posix-functions/ungetwc.texi
+@include posix-functions/unlink.texi
+@include posix-functions/unlinkat.texi
+@include posix-functions/unlockpt.texi
+@include posix-functions/unsetenv.texi
+@include posix-functions/uselocale.texi
+@include posix-functions/utime.texi
+@include posix-functions/utimensat.texi
+@include posix-functions/utimes.texi
+@include posix-functions/va_arg.texi
+@include posix-functions/va_copy.texi
+@include posix-functions/va_end.texi
+@include posix-functions/va_start.texi
+@include posix-functions/vdprintf.texi
+@include posix-functions/vfprintf.texi
+@include posix-functions/vfscanf.texi
+@include posix-functions/vfwprintf.texi
+@include posix-functions/vfwscanf.texi
+@include posix-functions/vprintf.texi
+@include posix-functions/vscanf.texi
+@include posix-functions/vsnprintf.texi
+@include posix-functions/vsprintf.texi
+@include posix-functions/vsscanf.texi
+@include posix-functions/vswprintf.texi
+@include posix-functions/vswscanf.texi
+@include posix-functions/vwprintf.texi
+@include posix-functions/vwscanf.texi
+@include posix-functions/wait.texi
+@include posix-functions/waitid.texi
+@include posix-functions/waitpid.texi
+@include posix-functions/wcpcpy.texi
+@include posix-functions/wcpncpy.texi
+@include posix-functions/wcrtomb.texi
+@include posix-functions/wcscasecmp.texi
+@include posix-functions/wcscasecmp_l.texi
+@include posix-functions/wcscat.texi
+@include posix-functions/wcschr.texi
+@include posix-functions/wcscmp.texi
+@include posix-functions/wcscoll.texi
+@include posix-functions/wcscoll_l.texi
+@include posix-functions/wcscpy.texi
+@include posix-functions/wcscspn.texi
+@include posix-functions/wcsdup.texi
+@include posix-functions/wcsftime.texi
+@include posix-functions/wcslen.texi
+@include posix-functions/wcsncasecmp.texi
+@include posix-functions/wcsncasecmp_l.texi
+@include posix-functions/wcsncat.texi
+@include posix-functions/wcsncmp.texi
+@include posix-functions/wcsncpy.texi
+@include posix-functions/wcsnlen.texi
+@include posix-functions/wcsnrtombs.texi
+@include posix-functions/wcspbrk.texi
+@include posix-functions/wcsrchr.texi
+@include posix-functions/wcsrtombs.texi
+@include posix-functions/wcsspn.texi
+@include posix-functions/wcsstr.texi
+@include posix-functions/wcstod.texi
+@include posix-functions/wcstof.texi
+@include posix-functions/wcstoimax.texi
+@include posix-functions/wcstok.texi
+@include posix-functions/wcstol.texi
+@include posix-functions/wcstold.texi
+@include posix-functions/wcstoll.texi
+@include posix-functions/wcstombs.texi
+@include posix-functions/wcstoul.texi
+@include posix-functions/wcstoull.texi
+@include posix-functions/wcstoumax.texi
+@include posix-functions/wcswidth.texi
+@include posix-functions/wcsxfrm.texi
+@include posix-functions/wcsxfrm_l.texi
+@include posix-functions/wctob.texi
+@include posix-functions/wctomb.texi
+@include posix-functions/wctrans.texi
+@include posix-functions/wctrans_l.texi
+@include posix-functions/wctype.texi
+@include posix-functions/wctype_l.texi
+@include posix-functions/wcwidth.texi
+@include posix-functions/wmemchr.texi
+@include posix-functions/wmemcmp.texi
+@include posix-functions/wmemcpy.texi
+@include posix-functions/wmemmove.texi
+@include posix-functions/wmemset.texi
+@include posix-functions/wordexp.texi
+@include posix-functions/wordfree.texi
+@include posix-functions/wprintf.texi
+@include posix-functions/write.texi
+@include posix-functions/writev.texi
+@include posix-functions/wscanf.texi
+@include posix-functions/y0.texi
+@include posix-functions/y1.texi
+@include posix-functions/yn.texi
+
+@node Legacy Function Substitutes
+@chapter Past POSIX Function Substitutes
+
+This chapter describes which functions and function-like macros specified by
+older versions of POSIX (POSIX:2001) are substituted by Gnulib, which
+portability pitfalls are fixed by Gnulib, and which (known) portability
+problems are not worked around by Gnulib.
+
+@nosuchmodulenote function
+
+@menu
+* bcmp::
+* bcopy::
+* bsd_signal::
+* bzero::
+* ecvt::
+* fcvt::
+* ftime::
+* gcvt::
+* getcontext::
+* gethostbyaddr::
+* gethostbyname::
+* getwd::
+* h_errno::
+* index::
+* makecontext::
+* mktemp::
+* pthread_attr_getstackaddr::
+* pthread_attr_setstackaddr::
+* rindex::
+* scalb::
+* setcontext::
+* swapcontext::
+* ualarm::
+* usleep::
+* vfork::
+* wcswcs::
+@end menu
+
+@include pastposix-functions/bcmp.texi
+@include pastposix-functions/bcopy.texi
+@include pastposix-functions/bsd_signal.texi
+@include pastposix-functions/bzero.texi
+@include pastposix-functions/ecvt.texi
+@include pastposix-functions/fcvt.texi
+@include pastposix-functions/ftime.texi
+@include pastposix-functions/gcvt.texi
+@include pastposix-functions/getcontext.texi
+@include pastposix-functions/gethostbyaddr.texi
+@include pastposix-functions/gethostbyname.texi
+@include pastposix-functions/getwd.texi
+@include pastposix-functions/h_errno.texi
+@include pastposix-functions/index.texi
+@include pastposix-functions/makecontext.texi
+@include pastposix-functions/mktemp.texi
+@include pastposix-functions/pthread_attr_getstackaddr.texi
+@include pastposix-functions/pthread_attr_setstackaddr.texi
+@include pastposix-functions/rindex.texi
+@include pastposix-functions/scalb.texi
+@include pastposix-functions/setcontext.texi
+@include pastposix-functions/swapcontext.texi
+@include pastposix-functions/ualarm.texi
+@include pastposix-functions/usleep.texi
+@include pastposix-functions/vfork.texi
+@include pastposix-functions/wcswcs.texi
+
+@node Glibc Header File Substitutes
+@chapter Glibc Header File Substitutes
+
+This chapter describes which header files contained in GNU libc but not
+specified by ISO C or POSIX are substituted by Gnulib, which portability
+pitfalls are fixed by Gnulib, and which (known) portability problems are
+not worked around by Gnulib.
+
+@nosuchmodulenote header file
+
+@menu
+* a.out.h::
+* aliases.h::
+* alloca.h::
+* ar.h::
+* argp.h::
+* argz.h::
+* byteswap.h::
+* crypt.h::
+* endian.h::
+* envz.h::
+* err.h::
+* error.h::
+* execinfo.h::
+* fpu_control.h::
+* fstab.h::
+* fts.h::
+* getopt.h::
+* ieee754.h::
+* ifaddrs.h::
+* libintl.h::
+* mcheck.h::
+* mntent.h::
+* obstack.h::
+* paths.h::
+* printf.h::
+* pty.h::
+* resolv.h::
+* shadow.h::
+* sys/ioctl.h::
+* sysexits.h::
+* ttyent.h::
+@end menu
+
+@include glibc-headers/a.out.texi
+@include glibc-headers/aliases.texi
+@include glibc-headers/alloca.texi
+@include glibc-headers/ar.texi
+@include glibc-headers/argp.texi
+@include glibc-headers/argz.texi
+@include glibc-headers/byteswap.texi
+@include glibc-headers/crypt.texi
+@include glibc-headers/endian.texi
+@include glibc-headers/envz.texi
+@include glibc-headers/err.texi
+@include glibc-headers/error.texi
+@include glibc-headers/execinfo.texi
+@include glibc-headers/fpu_control.texi
+@include glibc-headers/fstab.texi
+@include glibc-headers/fts.texi
+@include glibc-headers/getopt.texi
+@include glibc-headers/ieee754.texi
+@include glibc-headers/ifaddrs.texi
+@include glibc-headers/libintl.texi
+@include glibc-headers/mcheck.texi
+@include glibc-headers/mntent.texi
+@include glibc-headers/obstack.texi
+@include glibc-headers/paths.texi
+@include glibc-headers/printf.texi
+@include glibc-headers/pty.texi
+@include glibc-headers/resolv.texi
+@include glibc-headers/shadow.texi
+@include glibc-headers/sys_ioctl.texi
+@include glibc-headers/sysexits.texi
+@include glibc-headers/ttyent.texi
+
+@node Glibc Function Substitutes
+@chapter Glibc Function Substitutes
+
+This chapter describes which functions and function-like macros
+provided as extensions by at least GNU libc are also supported by Gnulib,
+which portability pitfalls are fixed by Gnulib, and which (known)
+portability problems are not worked around by Gnulib.
+
+@nosuchmodulenote function
+
+This list of functions is sorted according to the header that declares them.
+
+@menu
+* Glibc aio.h::
+* Glibc aliases.h::
+* Glibc argp.h::
+* Glibc argz.h::
+* Glibc arpa/inet.h::
+* Glibc byteswap.h::
+* Glibc complex.h::
+* Glibc crypt.h::
+* Glibc ctype.h::
+* Glibc dirent.h::
+* Glibc dlfcn.h::
+* Glibc envz.h::
+* Glibc err.h::
+* Glibc errno.h::
+* Glibc error.h::
+* Glibc execinfo.h::
+* Glibc fcntl.h::
+* Glibc fenv.h::
+* Glibc fmtmsg.h::
+* Glibc fstab.h::
+* Glibc fts.h::
+* Glibc getopt.h::
+* Glibc glob.h::
+* Glibc gnu/libc-version.h::
+* Glibc grp.h::
+* Glibc ifaddrs.h::
+* Glibc libintl.h::
+* Glibc link.h::
+* Glibc malloc.h::
+* Glibc math.h::
+* Glibc mcheck.h::
+* Glibc mntent.h::
+* Glibc netdb.h::
+* Glibc netinet/ether.h::
+* Glibc netinet/in.h::
+* Glibc obstack.h::
+* Glibc printf.h::
+* Glibc pthread.h::
+* Glibc pty.h::
+* Glibc pwd.h::
+* Glibc regex.h::
+* Glibc regexp.h::
+* Glibc resolv.h::
+* Glibc rpc/auth.h::
+* Glibc rpc/auth_des.h::
+* Glibc rpc/auth_unix.h::
+* Glibc rpc/clnt.h::
+* Glibc rpc/des_crypt.h::
+* Glibc rpc/key_prot.h::
+* Glibc rpc/netdb.h::
+* Glibc rpc/pmap_clnt.h::
+* Glibc rpc/pmap_prot.h::
+* Glibc rpc/pmap_rmt.h::
+* Glibc rpc/rpc_msg.h::
+* Glibc rpc/svc.h::
+* Glibc rpc/xdr.h::
+* Glibc rpcsvc/nislib.h::
+* Glibc rpcsvc/nis_callback.h::
+* Glibc rpcsvc/yp.h::
+* Glibc rpcsvc/yp_prot.h::
+* Glibc rpcsvc/ypclnt.h::
+* Glibc rpcsvc/ypupd.h::
+* Glibc sched.h::
+* Glibc search.h::
+* Glibc selinux/selinux.h::
+* Glibc shadow.h::
+* Glibc signal.h::
+* Glibc stdio.h::
+* Glibc stdlib.h::
+* Glibc string.h::
+* Glibc sys/capability.h::
+* Glibc sys/epoll.h::
+* Glibc sys/file.h::
+* Glibc sys/fsuid.h::
+* Glibc sys/gmon.h::
+* Glibc sys/io.h and sys/perm.h::
+* Glibc sys/kdaemon.h::
+* Glibc sys/klog.h::
+* Glibc sys/mman.h::
+* Glibc sys/mount.h::
+* Glibc sys/personality.h::
+* Glibc sys/prctl.h::
+* Glibc sys/profil.h::
+* Glibc sys/ptrace.h::
+* Glibc sys/quota.h::
+* Glibc sys/reboot.h::
+* Glibc sys/sem.h::
+* Glibc sys/sendfile.h::
+* Glibc sys/socket.h::
+* Glibc sys/stat.h::
+* Glibc sys/statfs.h::
+* Glibc sys/swap.h::
+* Glibc sys/sysctl.h::
+* Glibc sys/sysinfo.h::
+* Glibc sys/syslog.h::
+* Glibc sys/sysmacros.h::
+* Glibc sys/time.h::
+* Glibc sys/timex.h::
+* Glibc sys/ustat.h::
+* Glibc sys/vlimit.h::
+* Glibc sys/vm86.h::
+* Glibc sys/vtimes.h::
+* Glibc sys/wait.h::
+* Glibc sys/xattr.h::
+* Glibc termios.h::
+* Glibc time.h::
+* Glibc ttyent.h::
+* Glibc unistd.h::
+* Glibc utmp.h::
+* Glibc utmpx.h::
+* Glibc wchar.h::
+@end menu
+
+@c @node Glibc a.out.h
+@c @section Glibc @code{<a.out.h>}
+
+@node Glibc aio.h
+@section Glibc Extensions to @code{<aio.h>}
+
+@menu
+* aio_init::
+@end menu
+
+@include glibc-functions/aio_init.texi
+
+@node Glibc aliases.h
+@section Glibc @code{<aliases.h>}
+
+@menu
+* endaliasent::
+* getaliasbyname::
+* getaliasbyname_r::
+* getaliasent::
+* getaliasent_r::
+* setaliasent::
+@end menu
+
+@include glibc-functions/endaliasent.texi
+@include glibc-functions/getaliasbyname.texi
+@include glibc-functions/getaliasbyname_r.texi
+@include glibc-functions/getaliasent.texi
+@include glibc-functions/getaliasent_r.texi
+@include glibc-functions/setaliasent.texi
+
+@c @node Glibc alloca.h
+@c @section Glibc @code{<alloca.h>}
+
+@c @node Glibc ar.h
+@c @section Glibc @code{<ar.h>}
+
+@node Glibc argp.h
+@section Glibc @code{<argp.h>}
+
+@menu
+* argp_err_exit_status::
+* argp_error::
+* argp_failure::
+* argp_help::
+* argp_parse::
+* argp_program_bug_address::
+* argp_program_version::
+* argp_program_version_hook::
+* argp_state_help::
+* argp_usage::
+@end menu
+
+@include glibc-functions/argp_err_exit_status.texi
+@include glibc-functions/argp_error.texi
+@include glibc-functions/argp_failure.texi
+@include glibc-functions/argp_help.texi
+@include glibc-functions/argp_parse.texi
+@include glibc-functions/argp_program_bug_address.texi
+@include glibc-functions/argp_program_version.texi
+@include glibc-functions/argp_program_version_hook.texi
+@include glibc-functions/argp_state_help.texi
+@include glibc-functions/argp_usage.texi
+
+@node Glibc argz.h
+@section Glibc @code{<argz.h>}
+
+@menu
+* argz_add::
+* argz_add_sep::
+* argz_append::
+* argz_count::
+* argz_create::
+* argz_create_sep::
+* argz_delete::
+* argz_extract::
+* argz_insert::
+* argz_next::
+* argz_replace::
+* argz_stringify::
+@end menu
+
+@include glibc-functions/argz_add.texi
+@include glibc-functions/argz_add_sep.texi
+@include glibc-functions/argz_append.texi
+@include glibc-functions/argz_count.texi
+@include glibc-functions/argz_create.texi
+@include glibc-functions/argz_create_sep.texi
+@include glibc-functions/argz_delete.texi
+@include glibc-functions/argz_extract.texi
+@include glibc-functions/argz_insert.texi
+@include glibc-functions/argz_next.texi
+@include glibc-functions/argz_replace.texi
+@include glibc-functions/argz_stringify.texi
+
+@node Glibc arpa/inet.h
+@section Glibc Extensions to @code{<arpa/inet.h>}
+
+@menu
+* inet_aton::
+* inet_lnaof::
+* inet_makeaddr::
+* inet_net_ntop::
+* inet_net_pton::
+* inet_neta::
+* inet_netof::
+* inet_network::
+* inet_nsap_addr::
+* inet_nsap_ntoa::
+@end menu
+
+@include glibc-functions/inet_aton.texi
+@include glibc-functions/inet_lnaof.texi
+@include glibc-functions/inet_makeaddr.texi
+@include glibc-functions/inet_net_ntop.texi
+@include glibc-functions/inet_net_pton.texi
+@include glibc-functions/inet_neta.texi
+@include glibc-functions/inet_netof.texi
+@include glibc-functions/inet_network.texi
+@include glibc-functions/inet_nsap_addr.texi
+@include glibc-functions/inet_nsap_ntoa.texi
+
+@c @node Glibc assert.h
+@c @section Glibc Extensions to @code{<assert.h>}
+
+@node Glibc byteswap.h
+@section Glibc @code{<byteswap.h>}
+
+@menu
+* bswap_16::
+* bswap_32::
+* bswap_64::
+@end menu
+
+@include glibc-functions/bswap_16.texi
+@include glibc-functions/bswap_32.texi
+@include glibc-functions/bswap_64.texi
+
+@node Glibc complex.h
+@section Glibc Extensions to @code{<complex.h>}
+
+@menu
+* clog10::
+* clog10f::
+* clog10l::
+@end menu
+
+@include glibc-functions/clog10.texi
+@include glibc-functions/clog10f.texi
+@include glibc-functions/clog10l.texi
+
+@c @node Glibc cpio.h
+@c @section Glibc Extensions to @code{<cpio.h>}
+
+@node Glibc crypt.h
+@section Glibc @code{<crypt.h>}
+
+@menu
+* crypt_r::
+* encrypt_r::
+* setkey_r::
+@end menu
+
+@include glibc-functions/crypt_r.texi
+@include glibc-functions/encrypt_r.texi
+@include glibc-functions/setkey_r.texi
+
+@node Glibc ctype.h
+@section Glibc Extensions to @code{<ctype.h>}
+
+@menu
+* isctype::
+@end menu
+
+@include glibc-functions/isctype.texi
+
+@node Glibc dirent.h
+@section Glibc Extensions to @code{<dirent.h>}
+
+@menu
+* getdirentries::
+* versionsort::
+@end menu
+
+@include glibc-functions/getdirentries.texi
+@include glibc-functions/versionsort.texi
+
+@node Glibc dlfcn.h
+@section Glibc Extensions to @code{<dlfcn.h>}
+
+@menu
+* dladdr::
+* dladdr1::
+* dlinfo::
+* dlmopen::
+* dlvsym::
+@end menu
+
+@include glibc-functions/dladdr.texi
+@include glibc-functions/dladdr1.texi
+@include glibc-functions/dlinfo.texi
+@include glibc-functions/dlmopen.texi
+@include glibc-functions/dlvsym.texi
+
+@c @node Glibc endian.h
+@c @section Glibc @code{<endian.h>}
+
+@node Glibc envz.h
+@section Glibc @code{<envz.h>}
+
+@menu
+* envz_add::
+* envz_entry::
+* envz_get::
+* envz_merge::
+* envz_remove::
+* envz_strip::
+@end menu
+
+@include glibc-functions/envz_add.texi
+@include glibc-functions/envz_entry.texi
+@include glibc-functions/envz_get.texi
+@include glibc-functions/envz_merge.texi
+@include glibc-functions/envz_remove.texi
+@include glibc-functions/envz_strip.texi
+
+@node Glibc err.h
+@section Glibc @code{<err.h>}
+
+@menu
+* err::
+* errx::
+* verr::
+* verrx::
+* vwarn::
+* vwarnx::
+* warn::
+* warnx::
+@end menu
+
+@include glibc-functions/err.texi
+@include glibc-functions/errx.texi
+@include glibc-functions/verr.texi
+@include glibc-functions/verrx.texi
+@include glibc-functions/vwarn.texi
+@include glibc-functions/vwarnx.texi
+@include glibc-functions/warn.texi
+@include glibc-functions/warnx.texi
+
+@node Glibc errno.h
+@section Glibc Extensions to @code{<errno.h>}
+
+@menu
+* program_invocation_name::
+* program_invocation_short_name::
+@end menu
+
+@include glibc-functions/program_invocation_name.texi
+@include glibc-functions/program_invocation_short_name.texi
+
+@node Glibc error.h
+@section Glibc @code{<error.h>}
+
+@menu
+* error::
+* error_at_line::
+* error_message_count::
+* error_one_per_line::
+* error_print_progname::
+@end menu
+
+@include glibc-functions/error.texi
+@include glibc-functions/error_at_line.texi
+@include glibc-functions/error_message_count.texi
+@include glibc-functions/error_one_per_line.texi
+@include glibc-functions/error_print_progname.texi
+
+@node Glibc execinfo.h
+@section Glibc @code{<execinfo.h>}
+
+@menu
+* backtrace::
+* backtrace_symbols::
+* backtrace_symbols_fd::
+@end menu
+
+@include glibc-functions/backtrace.texi
+@include glibc-functions/backtrace_symbols.texi
+@include glibc-functions/backtrace_symbols_fd.texi
+
+@node Glibc fcntl.h
+@section Glibc Extensions to @code{<fcntl.h>}
+
+@menu
+* fallocate::
+* readahead::
+@end menu
+
+@include glibc-functions/fallocate.texi
+@include glibc-functions/readahead.texi
+
+@node Glibc fenv.h
+@section Glibc Extensions to @code{<fenv.h>}
+
+@menu
+* fedisableexcept::
+* feenableexcept::
+* fegetexcept::
+@end menu
+
+@include glibc-functions/fedisableexcept.texi
+@include glibc-functions/feenableexcept.texi
+@include glibc-functions/fegetexcept.texi
+
+@c @node Glibc float.h
+@c @section Glibc Extensions to @code{<float.h>}
+
+@node Glibc fmtmsg.h
+@section Glibc Extensions to @code{<fmtmsg.h>}
+
+@menu
+* addseverity::
+@end menu
+
+@include glibc-functions/addseverity.texi
+
+@c @node Glibc fnmatch.h
+@c @section Glibc Extensions to @code{<fnmatch.h>}
+
+@c @node Glibc fpu_control.h
+@c @section Glibc @code{<fpu_control.h>}
+
+@node Glibc fstab.h
+@section Glibc @code{<fstab.h>}
+
+@menu
+* endfsent::
+* getfsent::
+* getfsfile::
+* getfsspec::
+* setfsent::
+@end menu
+
+@include glibc-functions/endfsent.texi
+@include glibc-functions/getfsent.texi
+@include glibc-functions/getfsfile.texi
+@include glibc-functions/getfsspec.texi
+@include glibc-functions/setfsent.texi
+
+@node Glibc fts.h
+@section Glibc @code{<fts.h>}
+
+@menu
+* fts_children::
+* fts_close::
+* fts_open::
+* fts_read::
+* fts_set::
+@end menu
+
+@include glibc-functions/fts_children.texi
+@include glibc-functions/fts_close.texi
+@include glibc-functions/fts_open.texi
+@include glibc-functions/fts_read.texi
+@include glibc-functions/fts_set.texi
+
+@c @node Glibc ftw.h
+@c @section Glibc Extensions to @code{<ftw.h>}
+
+@node Glibc getopt.h
+@section Glibc @code{<getopt.h>}
+
+@menu
+* getopt_long::
+* getopt_long_only::
+@end menu
+
+@include glibc-functions/getopt_long.texi
+@include glibc-functions/getopt_long_only.texi
+
+@node Glibc glob.h
+@section Glibc Extensions to @code{<glob.h>}
+
+@menu
+* glob_pattern_p::
+@end menu
+
+@include glibc-functions/glob_pattern_p.texi
+
+@node Glibc gnu/libc-version.h
+@section Glibc Extensions to @code{<gnu/libc-version.h>}
+
+@menu
+* gnu_get_libc_release::
+* gnu_get_libc_version::
+@end menu
+
+@include glibc-functions/gnu_get_libc_release.texi
+@include glibc-functions/gnu_get_libc_version.texi
+
+@node Glibc grp.h
+@section Glibc Extensions to @code{<grp.h>}
+
+@menu
+* fgetgrent::
+* fgetgrent_r::
+* getgrent_r::
+* getgrouplist::
+* initgroups::
+* putgrent::
+* setgroups::
+@end menu
+
+@include glibc-functions/fgetgrent.texi
+@include glibc-functions/fgetgrent_r.texi
+@include glibc-functions/getgrent_r.texi
+@include glibc-functions/getgrouplist.texi
+@include glibc-functions/initgroups.texi
+@include glibc-functions/putgrent.texi
+@include glibc-functions/setgroups.texi
+
+@c @node Glibc iconv.h
+@c @section Glibc Extensions to @code{<iconv.h>}
+
+@c @node Glibc ieee754.h
+@c @section Glibc @code{<ieee754.h>}
+
+@node Glibc ifaddrs.h
+@section Glibc @code{<ifaddrs.h>}
+
+@menu
+* getifaddrs::
+* freeifaddrs::
+@end menu
+
+@include glibc-functions/getifaddrs.texi
+@include glibc-functions/freeifaddrs.texi
+
+@c @node Glibc inttypes.h
+@c @section Glibc Extensions to @code{<inttypes.h>}
+
+@c @node Glibc iso646.h
+@c @section Glibc Extensions to @code{<iso646.h>}
+
+@c @node Glibc langinfo.h
+@c @section Glibc Extensions to @code{<langinfo.h>}
+
+@c @node Glibc libgen.h
+@c @section Glibc Extensions to @code{<libgen.h>}
+
+@node Glibc libintl.h
+@section Glibc @code{<libintl.h>}
+
+@menu
+* bind_textdomain_codeset::
+* bindtextdomain::
+* dcgettext::
+* dcngettext::
+* dgettext::
+* dngettext::
+* gettext::
+* ngettext::
+* textdomain::
+@end menu
+
+@include glibc-functions/bind_textdomain_codeset.texi
+@include glibc-functions/bindtextdomain.texi
+@include glibc-functions/dcgettext.texi
+@include glibc-functions/dcngettext.texi
+@include glibc-functions/dgettext.texi
+@include glibc-functions/dngettext.texi
+@include glibc-functions/gettext.texi
+@include glibc-functions/ngettext.texi
+@include glibc-functions/textdomain.texi
+
+@c @node Glibc limits.h
+@c @section Glibc Extensions to @code{<limits.h>}
+
+@node Glibc link.h
+@section Glibc @code{<link.h>}
+
+@menu
+* dl_iterate_phdr::
+@end menu
+
+@include glibc-functions/dl_iterate_phdr.texi
+
+@c @node Glibc locale.h
+@c @section Glibc Extensions to @code{<locale.h>}
+
+@node Glibc malloc.h
+@section Glibc @code{<malloc.h>}
+
+@menu
+* mallinfo::
+* malloc_get_state::
+* malloc_set_state::
+* malloc_stats::
+* malloc_trim::
+* malloc_usable_size::
+* mallopt::
+* memalign::
+* pvalloc::
+@end menu
+
+@include glibc-functions/mallinfo.texi
+@include glibc-functions/malloc_get_state.texi
+@include glibc-functions/malloc_set_state.texi
+@include glibc-functions/malloc_stats.texi
+@include glibc-functions/malloc_trim.texi
+@include glibc-functions/malloc_usable_size.texi
+@include glibc-functions/mallopt.texi
+@include glibc-functions/memalign.texi
+@include glibc-functions/pvalloc.texi
+
+@node Glibc math.h
+@section Glibc Extensions to @code{<math.h>}
+
+@menu
+* drem::
+* dremf::
+* dreml::
+* exp10::
+* exp10f::
+* exp10l::
+* finite::
+* finitef::
+* finitel::
+* gamma::
+* gammaf::
+* gammal::
+* isinff::
+* isinfl::
+* isnanf::
+* isnanl::
+* j0f::
+* j0l::
+* j1f::
+* j1l::
+* jnf::
+* jnl::
+* lgamma_r::
+* lgammaf_r::
+* lgammal_r::
+* matherr::
+* pow10::
+* pow10f::
+* pow10l::
+* scalbf::
+* scalbl::
+* significand::
+* significandf::
+* significandl::
+* sincos::
+* sincosf::
+* sincosl::
+* y0f::
+* y0l::
+* y1f::
+* y1l::
+* ynf::
+* ynl::
+@end menu
+
+@include glibc-functions/drem.texi
+@include glibc-functions/dremf.texi
+@include glibc-functions/dreml.texi
+@include glibc-functions/exp10.texi
+@include glibc-functions/exp10f.texi
+@include glibc-functions/exp10l.texi
+@include glibc-functions/finite.texi
+@include glibc-functions/finitef.texi
+@include glibc-functions/finitel.texi
+@include glibc-functions/gamma.texi
+@include glibc-functions/gammaf.texi
+@include glibc-functions/gammal.texi
+@include glibc-functions/isinff.texi
+@include glibc-functions/isinfl.texi
+@include glibc-functions/isnanf.texi
+@include glibc-functions/isnanl.texi
+@include glibc-functions/j0f.texi
+@include glibc-functions/j0l.texi
+@include glibc-functions/j1f.texi
+@include glibc-functions/j1l.texi
+@include glibc-functions/jnf.texi
+@include glibc-functions/jnl.texi
+@include glibc-functions/lgamma_r.texi
+@include glibc-functions/lgammaf_r.texi
+@include glibc-functions/lgammal_r.texi
+@include glibc-functions/matherr.texi
+@include glibc-functions/pow10.texi
+@include glibc-functions/pow10f.texi
+@include glibc-functions/pow10l.texi
+@include glibc-functions/scalbf.texi
+@include glibc-functions/scalbl.texi
+@include glibc-functions/significand.texi
+@include glibc-functions/significandf.texi
+@include glibc-functions/significandl.texi
+@include glibc-functions/sincos.texi
+@include glibc-functions/sincosf.texi
+@include glibc-functions/sincosl.texi
+@include glibc-functions/y0f.texi
+@include glibc-functions/y0l.texi
+@include glibc-functions/y1f.texi
+@include glibc-functions/y1l.texi
+@include glibc-functions/ynf.texi
+@include glibc-functions/ynl.texi
+
+@node Glibc mcheck.h
+@section Glibc @code{<mcheck.h>}
+
+@menu
+* mcheck::
+* mcheck_check_all::
+* mcheck_pedantic::
+* mprobe::
+* mtrace::
+* muntrace::
+@end menu
+
+@include glibc-functions/mcheck.texi
+@include glibc-functions/mcheck_check_all.texi
+@include glibc-functions/mcheck_pedantic.texi
+@include glibc-functions/mprobe.texi
+@include glibc-functions/mtrace.texi
+@include glibc-functions/muntrace.texi
+
+@c @node Glibc monetary.h
+@c @section Glibc Extensions to @code{<monetary.h>}
+
+@node Glibc mntent.h
+@section Glibc @code{<mntent.h>}
+
+@menu
+* addmntent::
+* endmntent::
+* getmntent::
+* getmntent_r::
+* hasmntopt::
+* setmntent::
+@end menu
+
+@include glibc-functions/addmntent.texi
+@include glibc-functions/endmntent.texi
+@include glibc-functions/getmntent.texi
+@include glibc-functions/getmntent_r.texi
+@include glibc-functions/hasmntopt.texi
+@include glibc-functions/setmntent.texi
+
+@c @node Glibc mqueue.h
+@c @section Glibc Extensions to @code{<mqueue.h>}
+
+@c @node Glibc ndbm.h
+@c @section Glibc Extensions to @code{<ndbm.h>}
+
+@node Glibc netdb.h
+@section Glibc Extensions to @code{<netdb.h>}
+
+@menu
+* endnetgrent::
+* gethostbyaddr_r::
+* gethostbyname2::
+* gethostbyname2_r::
+* gethostbyname_r::
+* gethostent_r::
+* getnetbyaddr_r::
+* getnetbyname_r::
+* getnetent_r::
+* getnetgrent::
+* getnetgrent_r::
+* getprotobyname_r::
+* getprotobynumber_r::
+* getprotoent_r::
+* getservbyname_r::
+* getservbyport_r::
+* getservent_r::
+* herror::
+* hstrerror::
+* innetgr::
+* rcmd::
+* rcmd_af::
+* rexec::
+* rexec_af::
+* rresvport::
+* rresvport_af::
+* ruserok::
+* ruserok_af::
+* setnetgrent::
+@end menu
+
+@include glibc-functions/endnetgrent.texi
+@include glibc-functions/gethostbyaddr_r.texi
+@include glibc-functions/gethostbyname2.texi
+@include glibc-functions/gethostbyname2_r.texi
+@include glibc-functions/gethostbyname_r.texi
+@include glibc-functions/gethostent_r.texi
+@include glibc-functions/getnetbyaddr_r.texi
+@include glibc-functions/getnetbyname_r.texi
+@include glibc-functions/getnetent_r.texi
+@include glibc-functions/getnetgrent.texi
+@include glibc-functions/getnetgrent_r.texi
+@include glibc-functions/getprotobyname_r.texi
+@include glibc-functions/getprotobynumber_r.texi
+@include glibc-functions/getprotoent_r.texi
+@include glibc-functions/getservbyname_r.texi
+@include glibc-functions/getservbyport_r.texi
+@include glibc-functions/getservent_r.texi
+@include glibc-functions/herror.texi
+@include glibc-functions/hstrerror.texi
+@include glibc-functions/innetgr.texi
+@include glibc-functions/rcmd.texi
+@include glibc-functions/rcmd_af.texi
+@include glibc-functions/rexec.texi
+@include glibc-functions/rexec_af.texi
+@include glibc-functions/rresvport.texi
+@include glibc-functions/rresvport_af.texi
+@include glibc-functions/ruserok.texi
+@include glibc-functions/ruserok_af.texi
+@include glibc-functions/setnetgrent.texi
+
+@node Glibc netinet/ether.h
+@section Glibc @code{<netinet/ether.h>}
+
+@menu
+* ether_aton::
+* ether_aton_r::
+* ether_hostton::
+* ether_line::
+* ether_ntoa::
+* ether_ntoa_r::
+* ether_ntohost::
+@end menu
+
+@include glibc-functions/ether_aton.texi
+@include glibc-functions/ether_aton_r.texi
+@include glibc-functions/ether_hostton.texi
+@include glibc-functions/ether_line.texi
+@include glibc-functions/ether_ntoa.texi
+@include glibc-functions/ether_ntoa_r.texi
+@include glibc-functions/ether_ntohost.texi
+
+@node Glibc netinet/in.h
+@section Glibc Extensions to @code{<netinet/in.h>}
+
+@menu
+* bindresvport::
+* getipv4sourcefilter::
+* getsourcefilter::
+* in6addr_any::
+* in6addr_loopback::
+* inet6_option_alloc::
+* inet6_option_append::
+* inet6_option_find::
+* inet6_option_init::
+* inet6_option_next::
+* inet6_option_space::
+* setipv4sourcefilter::
+* setsourcefilter::
+@end menu
+
+@include glibc-functions/bindresvport.texi
+@include glibc-functions/getipv4sourcefilter.texi
+@include glibc-functions/getsourcefilter.texi
+@include glibc-functions/in6addr_any.texi
+@include glibc-functions/in6addr_loopback.texi
+@include glibc-functions/inet6_option_alloc.texi
+@include glibc-functions/inet6_option_append.texi
+@include glibc-functions/inet6_option_find.texi
+@include glibc-functions/inet6_option_init.texi
+@include glibc-functions/inet6_option_next.texi
+@include glibc-functions/inet6_option_space.texi
+@include glibc-functions/setipv4sourcefilter.texi
+@include glibc-functions/setsourcefilter.texi
+
+@c @node Glibc nl_types.h
+@c @section Glibc Extensions to @code{<nl_types.h>}
+
+@node Glibc obstack.h
+@section Glibc @code{<obstack.h>}
+
+@menu
+* obstack_alloc_failed_handler::
+* obstack_exit_failure::
+* obstack_free::
+* obstack_printf::
+* obstack_vprintf::
+@end menu
+
+@include glibc-functions/obstack_alloc_failed_handler.texi
+@include glibc-functions/obstack_exit_failure.texi
+@include glibc-functions/obstack_free.texi
+@include glibc-functions/obstack_printf.texi
+@include glibc-functions/obstack_vprintf.texi
+
+@c @node Glibc paths.h
+@c @section Glibc @code{<paths.h>}
+
+@c @node Glibc poll.h
+@c @section Glibc Extensions to @code{<poll.h>}
+
+@node Glibc printf.h
+@section Glibc @code{<printf.h>}
+
+@menu
+* parse_printf_format::
+* printf_size::
+* printf_size_info::
+* register_printf_function::
+@end menu
+
+@include glibc-functions/parse_printf_format.texi
+@include glibc-functions/printf_size.texi
+@include glibc-functions/printf_size_info.texi
+@include glibc-functions/register_printf_function.texi
+
+@node Glibc pthread.h
+@section Glibc Extensions to @code{<pthread.h>}
+
+@menu
+* pthread_getattr_np::
+* pthread_kill_other_threads_np::
+* pthread_rwlockattr_getkind_np::
+* pthread_rwlockattr_setkind_np::
+* pthread_yield::
+@end menu
+
+@include glibc-functions/pthread_getattr_np.texi
+@include glibc-functions/pthread_kill_other_threads_np.texi
+@include glibc-functions/pthread_rwlockattr_getkind_np.texi
+@include glibc-functions/pthread_rwlockattr_setkind_np.texi
+@include glibc-functions/pthread_yield.texi
+
+@node Glibc pty.h
+@section Glibc @code{<pty.h>}
+
+@menu
+* forkpty::
+* openpty::
+@end menu
+
+@include glibc-functions/forkpty.texi
+@include glibc-functions/openpty.texi
+
+@node Glibc pwd.h
+@section Glibc Extensions to @code{<pwd.h>}
+
+@menu
+* fgetpwent::
+* fgetpwent_r::
+* getpw::
+* getpwent_r::
+* putpwent::
+@end menu
+
+@include glibc-functions/fgetpwent.texi
+@include glibc-functions/fgetpwent_r.texi
+@include glibc-functions/getpw.texi
+@include glibc-functions/getpwent_r.texi
+@include glibc-functions/putpwent.texi
+
+@node Glibc regex.h
+@section Glibc Extensions to @code{<regex.h>}
+
+@menu
+* re_comp::
+* re_compile_fastmap::
+* re_compile_pattern::
+* re_exec::
+* re_match::
+* re_match_2::
+* re_search::
+* re_search_2::
+* re_set_registers::
+* re_set_syntax::
+* re_syntax_options::
+@end menu
+
+@include glibc-functions/re_comp.texi
+@include glibc-functions/re_compile_fastmap.texi
+@include glibc-functions/re_compile_pattern.texi
+@include glibc-functions/re_exec.texi
+@include glibc-functions/re_match.texi
+@include glibc-functions/re_match_2.texi
+@include glibc-functions/re_search.texi
+@include glibc-functions/re_search_2.texi
+@include glibc-functions/re_set_registers.texi
+@include glibc-functions/re_set_syntax.texi
+@include glibc-functions/re_syntax_options.texi
+
+@node Glibc regexp.h
+@section Glibc @code{<regexp.h>}
+
+@menu
+* advance::
+* loc1::
+* loc2::
+* locs::
+* step::
+@end menu
+
+@include glibc-functions/advance.texi
+@include glibc-functions/loc1.texi
+@include glibc-functions/loc2.texi
+@include glibc-functions/locs.texi
+@include glibc-functions/step.texi
+
+@node Glibc resolv.h
+@section Glibc @code{<resolv.h>}
+
+@menu
+* dn_expand::
+* res_init::
+* res_mkquery::
+* res_query::
+* res_querydomain::
+* res_search::
+@end menu
+
+@include glibc-functions/dn_expand.texi
+@include glibc-functions/res_init.texi
+@include glibc-functions/res_mkquery.texi
+@include glibc-functions/res_query.texi
+@include glibc-functions/res_querydomain.texi
+@include glibc-functions/res_search.texi
+
+@node Glibc rpc/auth.h
+@section Glibc @code{<rpc/auth.h>}
+
+@menu
+* authdes_create::
+* authdes_pk_create::
+* authnone_create::
+* authunix_create::
+* authunix_create_default::
+* getnetname::
+* host2netname::
+* key_decryptsession::
+* key_decryptsession_pk::
+* key_encryptsession::
+* key_encryptsession_pk::
+* key_gendes::
+* key_get_conv::
+* key_secretkey_is_set::
+* key_setsecret::
+* netname2host::
+* netname2user::
+* user2netname::
+* xdr_des_block::
+* xdr_opaque_auth::
+@end menu
+
+@include glibc-functions/authdes_create.texi
+@include glibc-functions/authdes_pk_create.texi
+@include glibc-functions/authnone_create.texi
+@include glibc-functions/authunix_create.texi
+@include glibc-functions/authunix_create_default.texi
+@include glibc-functions/getnetname.texi
+@include glibc-functions/host2netname.texi
+@include glibc-functions/key_decryptsession.texi
+@include glibc-functions/key_decryptsession_pk.texi
+@include glibc-functions/key_encryptsession.texi
+@include glibc-functions/key_encryptsession_pk.texi
+@include glibc-functions/key_gendes.texi
+@include glibc-functions/key_get_conv.texi
+@include glibc-functions/key_secretkey_is_set.texi
+@include glibc-functions/key_setsecret.texi
+@include glibc-functions/netname2host.texi
+@include glibc-functions/netname2user.texi
+@include glibc-functions/user2netname.texi
+@include glibc-functions/xdr_des_block.texi
+@include glibc-functions/xdr_opaque_auth.texi
+
+@node Glibc rpc/auth_des.h
+@section Glibc @code{<rpc/auth_des.h>}
+
+@menu
+* authdes_getucred::
+* getpublickey::
+* getsecretkey::
+* rtime::
+@end menu
+
+@include glibc-functions/authdes_getucred.texi
+@include glibc-functions/getpublickey.texi
+@include glibc-functions/getsecretkey.texi
+@include glibc-functions/rtime.texi
+
+@node Glibc rpc/auth_unix.h
+@section Glibc @code{<rpc/auth_unix.h>}
+
+@menu
+* xdr_authunix_parms::
+@end menu
+
+@include glibc-functions/xdr_authunix_parms.texi
+
+@node Glibc rpc/clnt.h
+@section Glibc @code{<rpc/clnt.h>}
+
+@menu
+* callrpc::
+* clnt_create::
+* clnt_pcreateerror::
+* clnt_perrno::
+* clnt_perror::
+* clnt_spcreateerror::
+* clnt_sperrno::
+* clnt_sperror::
+* clntraw_create::
+* clnttcp_create::
+* clntudp_bufcreate::
+* clntudp_create::
+* clntunix_create::
+* get_myaddress::
+* getrpcport::
+* rpc_createerr::
+@end menu
+
+@include glibc-functions/callrpc.texi
+@include glibc-functions/clnt_create.texi
+@include glibc-functions/clnt_pcreateerror.texi
+@include glibc-functions/clnt_perrno.texi
+@include glibc-functions/clnt_perror.texi
+@include glibc-functions/clnt_spcreateerror.texi
+@include glibc-functions/clnt_sperrno.texi
+@include glibc-functions/clnt_sperror.texi
+@include glibc-functions/clntraw_create.texi
+@include glibc-functions/clnttcp_create.texi
+@include glibc-functions/clntudp_bufcreate.texi
+@include glibc-functions/clntudp_create.texi
+@include glibc-functions/clntunix_create.texi
+@include glibc-functions/get_myaddress.texi
+@include glibc-functions/getrpcport.texi
+@include glibc-functions/rpc_createerr.texi
+
+@node Glibc rpc/des_crypt.h
+@section Glibc @code{<rpc/des_crypt.h>}
+
+@menu
+* cbc_crypt::
+* des_setparity::
+* ecb_crypt::
+@end menu
+
+@include glibc-functions/cbc_crypt.texi
+@include glibc-functions/des_setparity.texi
+@include glibc-functions/ecb_crypt.texi
+
+@node Glibc rpc/key_prot.h
+@section Glibc @code{<rpc/key_prot.h>}
+
+@menu
+* xdr_cryptkeyarg::
+* xdr_cryptkeyarg2::
+* xdr_cryptkeyres::
+* xdr_getcredres::
+* xdr_key_netstarg::
+* xdr_key_netstres::
+* xdr_keybuf::
+* xdr_keystatus::
+* xdr_netnamestr::
+* xdr_unixcred::
+@end menu
+
+@include glibc-functions/xdr_cryptkeyarg.texi
+@include glibc-functions/xdr_cryptkeyarg2.texi
+@include glibc-functions/xdr_cryptkeyres.texi
+@include glibc-functions/xdr_getcredres.texi
+@include glibc-functions/xdr_key_netstarg.texi
+@include glibc-functions/xdr_key_netstres.texi
+@include glibc-functions/xdr_keybuf.texi
+@include glibc-functions/xdr_keystatus.texi
+@include glibc-functions/xdr_netnamestr.texi
+@include glibc-functions/xdr_unixcred.texi
+
+@node Glibc rpc/netdb.h
+@section Glibc @code{<rpc/netdb.h>}
+
+@menu
+* endrpcent::
+* getrpcbyname::
+* getrpcbyname_r::
+* getrpcbynumber::
+* getrpcbynumber_r::
+* getrpcent::
+* getrpcent_r::
+* setrpcent::
+@end menu
+
+@include glibc-functions/endrpcent.texi
+@include glibc-functions/getrpcbyname.texi
+@include glibc-functions/getrpcbyname_r.texi
+@include glibc-functions/getrpcbynumber.texi
+@include glibc-functions/getrpcbynumber_r.texi
+@include glibc-functions/getrpcent.texi
+@include glibc-functions/getrpcent_r.texi
+@include glibc-functions/setrpcent.texi
+
+@node Glibc rpc/pmap_clnt.h
+@section Glibc @code{<rpc/pmap_clnt.h>}
+
+@menu
+* clnt_broadcast::
+* pmap_getmaps::
+* pmap_getport::
+* pmap_rmtcall::
+* pmap_set::
+* pmap_unset::
+@end menu
+
+@include glibc-functions/clnt_broadcast.texi
+@include glibc-functions/pmap_getmaps.texi
+@include glibc-functions/pmap_getport.texi
+@include glibc-functions/pmap_rmtcall.texi
+@include glibc-functions/pmap_set.texi
+@include glibc-functions/pmap_unset.texi
+
+@node Glibc rpc/pmap_prot.h
+@section Glibc @code{<rpc/pmap_prot.h>}
+
+@menu
+* xdr_pmap::
+* xdr_pmaplist::
+@end menu
+
+@include glibc-functions/xdr_pmap.texi
+@include glibc-functions/xdr_pmaplist.texi
+
+@node Glibc rpc/pmap_rmt.h
+@section Glibc @code{<rpc/pmap_rmt.h>}
+
+@menu
+* xdr_rmtcall_args::
+* xdr_rmtcallres::
+@end menu
+
+@include glibc-functions/xdr_rmtcall_args.texi
+@include glibc-functions/xdr_rmtcallres.texi
+
+@node Glibc rpc/rpc_msg.h
+@section Glibc @code{<rpc/rpc_msg.h>}
+
+@menu
+* xdr_callhdr::
+* xdr_callmsg::
+* xdr_replymsg::
+@end menu
+
+@include glibc-functions/xdr_callhdr.texi
+@include glibc-functions/xdr_callmsg.texi
+@include glibc-functions/xdr_replymsg.texi
+
+@node Glibc rpc/svc.h
+@section Glibc @code{<rpc/svc.h>}
+
+@menu
+* svc_exit::
+* svc_fdset::
+* svc_getreq::
+* svc_getreq_common::
+* svc_getreq_poll::
+* svc_getreqset::
+* svc_max_pollfd::
+* svc_pollfd::
+* svc_register::
+* svc_run::
+* svc_sendreply::
+* svc_unregister::
+* svcerr_auth::
+* svcerr_decode::
+* svcerr_noproc::
+* svcerr_noprog::
+* svcerr_progvers::
+* svcerr_systemerr::
+* svcerr_weakauth::
+* svcraw_create::
+* svctcp_create::
+* svcudp_bufcreate::
+* svcudp_create::
+* svcunix_create::
+* xprt_register::
+* xprt_unregister::
+@end menu
+
+@include glibc-functions/svc_exit.texi
+@include glibc-functions/svc_fdset.texi
+@include glibc-functions/svc_getreq.texi
+@include glibc-functions/svc_getreq_common.texi
+@include glibc-functions/svc_getreq_poll.texi
+@include glibc-functions/svc_getreqset.texi
+@include glibc-functions/svc_max_pollfd.texi
+@include glibc-functions/svc_pollfd.texi
+@include glibc-functions/svc_register.texi
+@include glibc-functions/svc_run.texi
+@include glibc-functions/svc_sendreply.texi
+@include glibc-functions/svc_unregister.texi
+@include glibc-functions/svcerr_auth.texi
+@include glibc-functions/svcerr_decode.texi
+@include glibc-functions/svcerr_noproc.texi
+@include glibc-functions/svcerr_noprog.texi
+@include glibc-functions/svcerr_progvers.texi
+@include glibc-functions/svcerr_systemerr.texi
+@include glibc-functions/svcerr_weakauth.texi
+@include glibc-functions/svcraw_create.texi
+@include glibc-functions/svctcp_create.texi
+@include glibc-functions/svcudp_bufcreate.texi
+@include glibc-functions/svcudp_create.texi
+@include glibc-functions/svcunix_create.texi
+@include glibc-functions/xprt_register.texi
+@include glibc-functions/xprt_unregister.texi
+
+@node Glibc rpc/xdr.h
+@section Glibc @code{<rpc/xdr.h>}
+
+@menu
+* xdr_array::
+* xdr_bool::
+* xdr_bytes::
+* xdr_char::
+* xdr_double::
+* xdr_enum::
+* xdr_float::
+* xdr_free::
+* xdr_hyper::
+* xdr_int::
+* xdr_int16_t::
+* xdr_int32_t::
+* xdr_int64_t::
+* xdr_int8_t::
+* xdr_long::
+* xdr_longlong_t::
+* xdr_netobj::
+* xdr_opaque::
+* xdr_pointer::
+* xdr_quad_t::
+* xdr_reference::
+* xdr_short::
+* xdr_sizeof::
+* xdr_string::
+* xdr_u_char::
+* xdr_u_hyper::
+* xdr_u_int::
+* xdr_u_long::
+* xdr_u_longlong_t::
+* xdr_u_quad_t::
+* xdr_u_short::
+* xdr_uint16_t::
+* xdr_uint32_t::
+* xdr_uint64_t::
+* xdr_uint8_t::
+* xdr_union::
+* xdr_vector::
+* xdr_void::
+* xdr_wrapstring::
+* xdrmem_create::
+* xdrrec_create::
+* xdrrec_endofrecord::
+* xdrrec_eof::
+* xdrrec_skiprecord::
+* xdrstdio_create::
+@end menu
+
+@include glibc-functions/xdr_array.texi
+@include glibc-functions/xdr_bool.texi
+@include glibc-functions/xdr_bytes.texi
+@include glibc-functions/xdr_char.texi
+@include glibc-functions/xdr_double.texi
+@include glibc-functions/xdr_enum.texi
+@include glibc-functions/xdr_float.texi
+@include glibc-functions/xdr_free.texi
+@include glibc-functions/xdr_hyper.texi
+@include glibc-functions/xdr_int.texi
+@include glibc-functions/xdr_int16_t.texi
+@include glibc-functions/xdr_int32_t.texi
+@include glibc-functions/xdr_int64_t.texi
+@include glibc-functions/xdr_int8_t.texi
+@include glibc-functions/xdr_long.texi
+@include glibc-functions/xdr_longlong_t.texi
+@include glibc-functions/xdr_netobj.texi
+@include glibc-functions/xdr_opaque.texi
+@include glibc-functions/xdr_pointer.texi
+@include glibc-functions/xdr_quad_t.texi
+@include glibc-functions/xdr_reference.texi
+@include glibc-functions/xdr_short.texi
+@include glibc-functions/xdr_sizeof.texi
+@include glibc-functions/xdr_string.texi
+@include glibc-functions/xdr_u_char.texi
+@include glibc-functions/xdr_u_hyper.texi
+@include glibc-functions/xdr_u_int.texi
+@include glibc-functions/xdr_u_long.texi
+@include glibc-functions/xdr_u_longlong_t.texi
+@include glibc-functions/xdr_u_quad_t.texi
+@include glibc-functions/xdr_u_short.texi
+@include glibc-functions/xdr_uint16_t.texi
+@include glibc-functions/xdr_uint32_t.texi
+@include glibc-functions/xdr_uint64_t.texi
+@include glibc-functions/xdr_uint8_t.texi
+@include glibc-functions/xdr_union.texi
+@include glibc-functions/xdr_vector.texi
+@include glibc-functions/xdr_void.texi
+@include glibc-functions/xdr_wrapstring.texi
+@include glibc-functions/xdrmem_create.texi
+@include glibc-functions/xdrrec_create.texi
+@include glibc-functions/xdrrec_endofrecord.texi
+@include glibc-functions/xdrrec_eof.texi
+@include glibc-functions/xdrrec_skiprecord.texi
+@include glibc-functions/xdrstdio_create.texi
+
+@node Glibc rpcsvc/nislib.h
+@section Glibc @code{<rpcsvc/nislib.h>}
+
+@menu
+* nis_add::
+* nis_add_entry::
+* nis_addmember::
+* nis_checkpoint::
+* nis_clone_object::
+* nis_creategroup::
+* nis_destroy_object::
+* nis_destroygroup::
+* nis_dir_cmp::
+* nis_domain_of::
+* nis_domain_of_r::
+* nis_first_entry::
+* nis_freenames::
+* nis_freeresult::
+* nis_freeservlist::
+* nis_freetags::
+* nis_getnames::
+* nis_getservlist::
+* nis_ismember::
+* nis_leaf_of::
+* nis_leaf_of_r::
+* nis_lerror::
+* nis_list::
+* nis_local_directory::
+* nis_local_group::
+* nis_local_host::
+* nis_local_principal::
+* nis_lookup::
+* nis_mkdir::
+* nis_modify::
+* nis_modify_entry::
+* nis_name_of::
+* nis_name_of_r::
+* nis_next_entry::
+* nis_perror::
+* nis_ping::
+* nis_print_directory::
+* nis_print_entry::
+* nis_print_group::
+* nis_print_group_entry::
+* nis_print_link::
+* nis_print_object::
+* nis_print_result::
+* nis_print_rights::
+* nis_print_table::
+* nis_remove::
+* nis_remove_entry::
+* nis_removemember::
+* nis_rmdir::
+* nis_servstate::
+* nis_sperrno::
+* nis_sperror::
+* nis_sperror_r::
+* nis_stats::
+* nis_verifygroup::
+@end menu
+
+@include glibc-functions/nis_add.texi
+@include glibc-functions/nis_add_entry.texi
+@include glibc-functions/nis_addmember.texi
+@include glibc-functions/nis_checkpoint.texi
+@include glibc-functions/nis_clone_object.texi
+@include glibc-functions/nis_creategroup.texi
+@include glibc-functions/nis_destroy_object.texi
+@include glibc-functions/nis_destroygroup.texi
+@include glibc-functions/nis_dir_cmp.texi
+@include glibc-functions/nis_domain_of.texi
+@include glibc-functions/nis_domain_of_r.texi
+@include glibc-functions/nis_first_entry.texi
+@include glibc-functions/nis_freenames.texi
+@include glibc-functions/nis_freeresult.texi
+@include glibc-functions/nis_freeservlist.texi
+@include glibc-functions/nis_freetags.texi
+@include glibc-functions/nis_getnames.texi
+@include glibc-functions/nis_getservlist.texi
+@include glibc-functions/nis_ismember.texi
+@include glibc-functions/nis_leaf_of.texi
+@include glibc-functions/nis_leaf_of_r.texi
+@include glibc-functions/nis_lerror.texi
+@include glibc-functions/nis_list.texi
+@include glibc-functions/nis_local_directory.texi
+@include glibc-functions/nis_local_group.texi
+@include glibc-functions/nis_local_host.texi
+@include glibc-functions/nis_local_principal.texi
+@include glibc-functions/nis_lookup.texi
+@include glibc-functions/nis_mkdir.texi
+@include glibc-functions/nis_modify.texi
+@include glibc-functions/nis_modify_entry.texi
+@include glibc-functions/nis_name_of.texi
+@include glibc-functions/nis_name_of_r.texi
+@include glibc-functions/nis_next_entry.texi
+@include glibc-functions/nis_perror.texi
+@include glibc-functions/nis_ping.texi
+@include glibc-functions/nis_print_directory.texi
+@include glibc-functions/nis_print_entry.texi
+@include glibc-functions/nis_print_group.texi
+@include glibc-functions/nis_print_group_entry.texi
+@include glibc-functions/nis_print_link.texi
+@include glibc-functions/nis_print_object.texi
+@include glibc-functions/nis_print_result.texi
+@include glibc-functions/nis_print_rights.texi
+@include glibc-functions/nis_print_table.texi
+@include glibc-functions/nis_remove.texi
+@include glibc-functions/nis_remove_entry.texi
+@include glibc-functions/nis_removemember.texi
+@include glibc-functions/nis_rmdir.texi
+@include glibc-functions/nis_servstate.texi
+@include glibc-functions/nis_sperrno.texi
+@include glibc-functions/nis_sperror.texi
+@include glibc-functions/nis_sperror_r.texi
+@include glibc-functions/nis_stats.texi
+@include glibc-functions/nis_verifygroup.texi
+
+@node Glibc rpcsvc/nis_callback.h
+@section Glibc @code{<rpcsvc/nis_callback.h>}
+
+@menu
+* xdr_cback_data::
+* xdr_obj_p::
+@end menu
+
+@include glibc-functions/xdr_cback_data.texi
+@include glibc-functions/xdr_obj_p.texi
+
+@node Glibc rpcsvc/yp.h
+@section Glibc @code{<rpcsvc/yp.h>}
+
+@menu
+* xdr_domainname::
+* xdr_keydat::
+* xdr_mapname::
+* xdr_peername::
+* xdr_valdat::
+* xdr_ypbind_binding::
+* xdr_ypbind_resp::
+* xdr_ypbind_resptype::
+* xdr_ypbind_setdom::
+* xdr_ypmap_parms::
+* xdr_ypmaplist::
+* xdr_yppush_status::
+* xdr_yppushresp_xfr::
+* xdr_ypreq_key::
+* xdr_ypreq_nokey::
+* xdr_ypreq_xfr::
+* xdr_ypresp_all::
+* xdr_ypresp_key_val::
+* xdr_ypresp_maplist::
+* xdr_ypresp_master::
+* xdr_ypresp_order::
+* xdr_ypresp_val::
+* xdr_ypresp_xfr::
+* xdr_ypstat::
+* xdr_ypxfrstat::
+@end menu
+
+@include glibc-functions/xdr_domainname.texi
+@include glibc-functions/xdr_keydat.texi
+@include glibc-functions/xdr_mapname.texi
+@include glibc-functions/xdr_peername.texi
+@include glibc-functions/xdr_valdat.texi
+@include glibc-functions/xdr_ypbind_binding.texi
+@include glibc-functions/xdr_ypbind_resp.texi
+@include glibc-functions/xdr_ypbind_resptype.texi
+@include glibc-functions/xdr_ypbind_setdom.texi
+@include glibc-functions/xdr_ypmap_parms.texi
+@include glibc-functions/xdr_ypmaplist.texi
+@include glibc-functions/xdr_yppush_status.texi
+@include glibc-functions/xdr_yppushresp_xfr.texi
+@include glibc-functions/xdr_ypreq_key.texi
+@include glibc-functions/xdr_ypreq_nokey.texi
+@include glibc-functions/xdr_ypreq_xfr.texi
+@include glibc-functions/xdr_ypresp_all.texi
+@include glibc-functions/xdr_ypresp_key_val.texi
+@include glibc-functions/xdr_ypresp_maplist.texi
+@include glibc-functions/xdr_ypresp_master.texi
+@include glibc-functions/xdr_ypresp_order.texi
+@include glibc-functions/xdr_ypresp_val.texi
+@include glibc-functions/xdr_ypresp_xfr.texi
+@include glibc-functions/xdr_ypstat.texi
+@include glibc-functions/xdr_ypxfrstat.texi
+
+@node Glibc rpcsvc/yp_prot.h
+@section Glibc @code{<rpcsvc/yp_prot.h>}
+
+@menu
+* xdr_ypall::
+@end menu
+
+@include glibc-functions/xdr_ypall.texi
+
+@node Glibc rpcsvc/ypclnt.h
+@section Glibc @code{<rpcsvc/ypclnt.h>}
+
+@menu
+* yp_all::
+* yp_bind::
+* yp_first::
+* yp_get_default_domain::
+* yp_master::
+* yp_match::
+* yp_next::
+* yp_order::
+* yp_unbind::
+* yp_update::
+* ypbinderr_string::
+* yperr_string::
+* ypprot_err::
+@end menu
+
+@include glibc-functions/yp_all.texi
+@include glibc-functions/yp_bind.texi
+@include glibc-functions/yp_first.texi
+@include glibc-functions/yp_get_default_domain.texi
+@include glibc-functions/yp_master.texi
+@include glibc-functions/yp_match.texi
+@include glibc-functions/yp_next.texi
+@include glibc-functions/yp_order.texi
+@include glibc-functions/yp_unbind.texi
+@include glibc-functions/yp_update.texi
+@include glibc-functions/ypbinderr_string.texi
+@include glibc-functions/yperr_string.texi
+@include glibc-functions/ypprot_err.texi
+
+@node Glibc rpcsvc/ypupd.h
+@section Glibc @code{<rpcsvc/ypupd.h>}
+
+@menu
+* xdr_yp_buf::
+* xdr_ypdelete_args::
+* xdr_ypupdate_args::
+@end menu
+
+@include glibc-functions/xdr_yp_buf.texi
+@include glibc-functions/xdr_ypdelete_args.texi
+@include glibc-functions/xdr_ypupdate_args.texi
+
+@node Glibc sched.h
+@section Glibc Extensions to @code{<sched.h>}
+
+@menu
+* clone::
+* sched_getaffinity::
+* sched_setaffinity::
+@end menu
+
+@include glibc-functions/clone.texi
+@include glibc-functions/sched_getaffinity.texi
+@include glibc-functions/sched_setaffinity.texi
+
+@node Glibc search.h
+@section Glibc Extensions to @code{<search.h>}
+
+@menu
+* hcreate_r::
+* hdestroy_r::
+* hsearch_r::
+* tdestroy::
+@end menu
+
+@include glibc-functions/hcreate_r.texi
+@include glibc-functions/hdestroy_r.texi
+@include glibc-functions/hsearch_r.texi
+@include glibc-functions/tdestroy.texi
+
+@node Glibc selinux/selinux.h
+@section Glibc Extensions to @code{<selinux/selinux.h>}
+
+@menu
+* fgetfilecon::
+* getfilecon::
+* lgetfilecon::
+@end menu
+
+@include glibc-functions/getfilecon-desc.texi
+@include glibc-functions/fgetfilecon.texi
+@include glibc-functions/getfilecon.texi
+@include glibc-functions/lgetfilecon.texi
+
+@c @node Glibc semaphore.h
+@c @section Glibc Extensions to @code{<semaphore.h>}
+
+@c @node Glibc setjmp.h
+@c @section Glibc Extensions to @code{<setjmp.h>}
+
+@node Glibc shadow.h
+@section Glibc @code{<shadow.h>}
+
+@menu
+* endspent::
+* fgetspent::
+* fgetspent_r::
+* getspent::
+* getspent_r::
+* getspnam::
+* getspnam_r::
+* lckpwdf::
+* putspent::
+* setspent::
+* sgetspent::
+* sgetspent_r::
+* ulckpwdf::
+@end menu
+
+@include glibc-functions/endspent.texi
+@include glibc-functions/fgetspent.texi
+@include glibc-functions/fgetspent_r.texi
+@include glibc-functions/getspent.texi
+@include glibc-functions/getspent_r.texi
+@include glibc-functions/getspnam.texi
+@include glibc-functions/getspnam_r.texi
+@include glibc-functions/lckpwdf.texi
+@include glibc-functions/putspent.texi
+@include glibc-functions/setspent.texi
+@include glibc-functions/sgetspent.texi
+@include glibc-functions/sgetspent_r.texi
+@include glibc-functions/ulckpwdf.texi
+
+@node Glibc signal.h
+@section Glibc Extensions to @code{<signal.h>}
+
+@menu
+* gsignal::
+* sigandset::
+* sigblock::
+* siggetmask::
+* sigisemptyset::
+* sigorset::
+* sigreturn::
+* sigsetmask::
+* sigstack::
+* sigvec::
+* ssignal::
+* sys_siglist::
+* sysv_signal::
+@end menu
+
+@include glibc-functions/gsignal.texi
+@include glibc-functions/sigandset.texi
+@include glibc-functions/sigblock.texi
+@include glibc-functions/siggetmask.texi
+@include glibc-functions/sigisemptyset.texi
+@include glibc-functions/sigorset.texi
+@include glibc-functions/sigreturn.texi
+@include glibc-functions/sigsetmask.texi
+@include glibc-functions/sigstack.texi
+@include glibc-functions/sigvec.texi
+@include glibc-functions/ssignal.texi
+@include glibc-functions/sys_siglist.texi
+@include glibc-functions/sysv_signal.texi
+
+@c @node Glibc spawn.h
+@c @section Glibc Extensions to @code{<spawn.h>}
+
+@c @node Glibc stdarg.h
+@c @section Glibc Extensions to @code{<stdarg.h>}
+
+@c @node Glibc stdbool.h
+@c @section Glibc Extensions to @code{<stdbool.h>}
+
+@c @node Glibc stddef.h
+@c @section Glibc Extensions to @code{<stddef.h>}
+
+@c @node Glibc stdint.h
+@c @section Glibc Extensions to @code{<stdint.h>}
+
+@node Glibc stdio.h
+@section Glibc Extensions to @code{<stdio.h>}
+
+@menu
+* asprintf::
+* cuserid::
+* clearerr_unlocked::
+* fcloseall::
+* feof_unlocked::
+* ferror_unlocked::
+* fflush_unlocked::
+* fgetc_unlocked::
+* fgets_unlocked::
+* fileno_unlocked::
+* fopencookie::
+* fputc_unlocked::
+* fputs_unlocked::
+* fread_unlocked::
+* fwrite_unlocked::
+* getw::
+* putw::
+* setbuffer::
+* setlinebuf::
+* sys_errlist::
+* sys_nerr::
+* tmpnam_r::
+* vasprintf::
+@end menu
+
+@include glibc-functions/asprintf.texi
+@include glibc-functions/cuserid.texi
+@include glibc-functions/clearerr_unlocked.texi
+@include glibc-functions/fcloseall.texi
+@include glibc-functions/feof_unlocked.texi
+@include glibc-functions/ferror_unlocked.texi
+@include glibc-functions/fflush_unlocked.texi
+@include glibc-functions/fgetc_unlocked.texi
+@include glibc-functions/fgets_unlocked.texi
+@include glibc-functions/fileno_unlocked.texi
+@include glibc-functions/fopencookie.texi
+@include glibc-functions/fputc_unlocked.texi
+@include glibc-functions/fputs_unlocked.texi
+@include glibc-functions/fread_unlocked.texi
+@include glibc-functions/fwrite_unlocked.texi
+@include glibc-functions/getw.texi
+@include glibc-functions/putw.texi
+@include glibc-functions/setbuffer.texi
+@include glibc-functions/setlinebuf.texi
+@include glibc-functions/sys_errlist.texi
+@include glibc-functions/sys_nerr.texi
+@include glibc-functions/tmpnam_r.texi
+@include glibc-functions/vasprintf.texi
+
+@node Glibc stdlib.h
+@section Glibc Extensions to @code{<stdlib.h>}
+
+@menu
+* canonicalize_file_name::
+* cfree::
+* clearenv::
+* drand48_r::
+* ecvt_r::
+* erand48_r::
+* fcvt_r::
+* getloadavg::
+* getpt::
+* initstate_r::
+* jrand48_r::
+* lcong48_r::
+* lrand48_r::
+* mkostemp::
+* mkostemps::
+* mrand48_r::
+* mkstemps::
+* nrand48_r::
+* on_exit::
+* ptsname_r::
+* qecvt::
+* qecvt_r::
+* qfcvt::
+* qfcvt_r::
+* qgcvt::
+* random_r::
+* rpmatch::
+* seed48_r::
+* setstate_r::
+* srand48_r::
+* srandom_r::
+* strtod_l::
+* strtof_l::
+* strtol_l::
+* strtold_l::
+* strtoll_l::
+* strtoq::
+* strtoul_l::
+* strtoull_l::
+* strtouq::
+* valloc::
+@end menu
+
+@include glibc-functions/canonicalize_file_name.texi
+@include glibc-functions/cfree.texi
+@include glibc-functions/clearenv.texi
+@include glibc-functions/drand48_r.texi
+@include glibc-functions/ecvt_r.texi
+@include glibc-functions/erand48_r.texi
+@include glibc-functions/fcvt_r.texi
+@include glibc-functions/getloadavg.texi
+@include glibc-functions/getpt.texi
+@include glibc-functions/initstate_r.texi
+@include glibc-functions/jrand48_r.texi
+@include glibc-functions/lcong48_r.texi
+@include glibc-functions/lrand48_r.texi
+@include glibc-functions/mkostemp.texi
+@include glibc-functions/mkostemps.texi
+@include glibc-functions/mrand48_r.texi
+@include glibc-functions/mkstemps.texi
+@include glibc-functions/nrand48_r.texi
+@include glibc-functions/on_exit.texi
+@include glibc-functions/ptsname_r.texi
+@include glibc-functions/qecvt.texi
+@include glibc-functions/qecvt_r.texi
+@include glibc-functions/qfcvt.texi
+@include glibc-functions/qfcvt_r.texi
+@include glibc-functions/qgcvt.texi
+@include glibc-functions/random_r.texi
+@include glibc-functions/rpmatch.texi
+@include glibc-functions/seed48_r.texi
+@include glibc-functions/setstate_r.texi
+@include glibc-functions/srand48_r.texi
+@include glibc-functions/srandom_r.texi
+@include glibc-functions/strtod_l.texi
+@include glibc-functions/strtof_l.texi
+@include glibc-functions/strtol_l.texi
+@include glibc-functions/strtold_l.texi
+@include glibc-functions/strtoll_l.texi
+@include glibc-functions/strtoq.texi
+@include glibc-functions/strtoul_l.texi
+@include glibc-functions/strtoull_l.texi
+@include glibc-functions/strtouq.texi
+@include glibc-functions/valloc.texi
+
+@node Glibc string.h
+@section Glibc Extensions to @code{<string.h>}
+
+@menu
+* ffsl::
+* ffsll::
+* memfrob::
+* memmem::
+* mempcpy::
+* memrchr::
+* rawmemchr::
+* strcasestr::
+* strchrnul::
+* strfry::
+* strsep::
+* strverscmp::
+@end menu
+
+@include glibc-functions/ffsl.texi
+@include glibc-functions/ffsll.texi
+@include glibc-functions/memfrob.texi
+@include glibc-functions/memmem.texi
+@include glibc-functions/mempcpy.texi
+@include glibc-functions/memrchr.texi
+@include glibc-functions/rawmemchr.texi
+@include glibc-functions/strcasestr.texi
+@include glibc-functions/strchrnul.texi
+@include glibc-functions/strfry.texi
+@include glibc-functions/strsep.texi
+@include glibc-functions/strverscmp.texi
+
+@c @node Glibc strings.h
+@c @section Glibc Extensions to @code{<strings.h>}
+
+@c @node Glibc stropts.h
+@c @section Glibc Extensions to @code{<stropts.h>}
+
+@node Glibc sys/capability.h
+@section Glibc @code{<sys/capability.h>}
+
+@menu
+* capget::
+* capset::
+@end menu
+
+@include glibc-functions/capget.texi
+@include glibc-functions/capset.texi
+
+@node Glibc sys/epoll.h
+@section Glibc @code{<sys/epoll.h>}
+
+@menu
+* epoll_create::
+* epoll_ctl::
+* epoll_wait::
+@end menu
+
+@include glibc-functions/epoll_create.texi
+@include glibc-functions/epoll_ctl.texi
+@include glibc-functions/epoll_wait.texi
+
+@node Glibc sys/file.h
+@section Glibc @code{<sys/file.h>}
+
+@menu
+* flock::
+@end menu
+
+@include glibc-functions/flock.texi
+
+@node Glibc sys/fsuid.h
+@section Glibc @code{<sys/fsuid.h>}
+
+@menu
+* setfsgid::
+* setfsuid::
+@end menu
+
+@include glibc-functions/setfsgid.texi
+@include glibc-functions/setfsuid.texi
+
+@node Glibc sys/gmon.h
+@section Glibc @code{<sys/gmon.h>}
+
+@menu
+* monstartup::
+@end menu
+
+@include glibc-functions/monstartup.texi
+
+@node Glibc sys/io.h and sys/perm.h
+@section Glibc @code{<sys/io.h>}, @code{<sys/perm.h>}
+
+@menu
+* ioperm::
+* iopl::
+@end menu
+
+@include glibc-functions/ioperm.texi
+@include glibc-functions/iopl.texi
+
+@c @node Glibc sys/ioctl.h
+@c @section Glibc @code{<sys/ioctl.h>}
+
+@c @node Glibc sys/ipc.h
+@c @section Glibc Extensions to @code{<sys/ipc.h>}
+
+@node Glibc sys/kdaemon.h
+@section Glibc @code{<sys/kdaemon.h>}
+
+@menu
+* bdflush::
+@end menu
+
+@include glibc-functions/bdflush.texi
+
+@node Glibc sys/klog.h
+@section Glibc @code{<sys/klog.h>}
+
+@menu
+* klogctl::
+@end menu
+
+@include glibc-functions/klogctl.texi
+
+@node Glibc sys/mman.h
+@section Glibc Extensions to @code{<sys/mman.h>}
+
+@menu
+* madvise::
+* mincore::
+* mremap::
+* remap_file_pages::
+@end menu
+
+@include glibc-functions/madvise.texi
+@include glibc-functions/mincore.texi
+@include glibc-functions/mremap.texi
+@include glibc-functions/remap_file_pages.texi
+
+@node Glibc sys/mount.h
+@section Glibc @code{<sys/mount.h>}
+
+@menu
+* mount::
+* umount::
+* umount2::
+@end menu
+
+@include glibc-functions/mount.texi
+@include glibc-functions/umount.texi
+@include glibc-functions/umount2.texi
+
+@c @node Glibc sys/msg.h
+@c @section Glibc Extensions to @code{<sys/msg.h>}
+
+@node Glibc sys/personality.h
+@section Glibc @code{<sys/personality.h>}
+
+@menu
+* personality::
+@end menu
+
+@include glibc-functions/personality.texi
+
+@node Glibc sys/prctl.h
+@section Glibc @code{<sys/prctl.h>}
+
+@menu
+* prctl::
+@end menu
+
+@include glibc-functions/prctl.texi
+
+@node Glibc sys/profil.h
+@section Glibc @code{<sys/profil.h>}
+
+@menu
+* sprofil::
+@end menu
+
+@include glibc-functions/sprofil.texi
+
+@node Glibc sys/ptrace.h
+@section Glibc @code{<sys/ptrace.h>}
+
+@menu
+* ptrace::
+@end menu
+
+@include glibc-functions/ptrace.texi
+
+@node Glibc sys/quota.h
+@section Glibc @code{<sys/quota.h>}
+
+@menu
+* quotactl::
+@end menu
+
+@include glibc-functions/quotactl.texi
+
+@node Glibc sys/reboot.h
+@section Glibc @code{<sys/reboot.h>}
+
+@menu
+* reboot::
+@end menu
+
+@include glibc-functions/reboot.texi
+
+@c @node Glibc sys/resource.h
+@c @section Glibc Extensions to @code{<sys/resource.h>}
+
+@c @node Glibc sys/select.h
+@c @section Glibc Extensions to @code{<sys/select.h>}
+
+@node Glibc sys/sem.h
+@section Glibc Extensions to @code{<sys/sem.h>}
+
+@menu
+* semtimedop::
+@end menu
+
+@include glibc-functions/semtimedop.texi
+
+@node Glibc sys/sendfile.h
+@section Glibc @code{<sys/sendfile.h>}
+
+@menu
+* sendfile::
+@end menu
+
+@include glibc-functions/sendfile.texi
+
+@c @node Glibc sys/shm.h
+@c @section Glibc Extensions to @code{<sys/shm.h>}
+
+@node Glibc sys/socket.h
+@section Glibc Extensions to @code{<sys/socket.h>}
+
+@menu
+* accept4::
+* isfdtype::
+@end menu
+
+@include glibc-functions/accept4.texi
+@include glibc-functions/isfdtype.texi
+
+@node Glibc sys/stat.h
+@section Glibc Extensions to @code{<sys/stat.h>}
+
+@menu
+* lchmod::
+@end menu
+
+@include glibc-functions/lchmod.texi
+
+@node Glibc sys/statfs.h
+@section Glibc @code{<sys/statfs.h>}
+
+@menu
+* fstatfs::
+* statfs::
+@end menu
+
+@include glibc-functions/fstatfs.texi
+@include glibc-functions/statfs.texi
+
+@c @node Glibc sys/statvfs.h
+@c @section Glibc Extensions to @code{<sys/statvfs.h>}
+
+@node Glibc sys/swap.h
+@section Glibc @code{<sys/swap.h>}
+
+@menu
+* swapoff::
+* swapon::
+@end menu
+
+@include glibc-functions/swapoff.texi
+@include glibc-functions/swapon.texi
+
+@node Glibc sys/sysctl.h
+@section Glibc @code{<sys/sysctl.h>}
+
+@menu
+* sysctl::
+@end menu
+
+@include glibc-functions/sysctl.texi
+
+@node Glibc sys/sysinfo.h
+@section Glibc @code{<sys/sysinfo.h>}
+
+@menu
+* get_avphys_pages::
+* get_nprocs::
+* get_nprocs_conf::
+* get_phys_pages::
+* sysinfo::
+@end menu
+
+@include glibc-functions/get_avphys_pages.texi
+@include glibc-functions/get_nprocs.texi
+@include glibc-functions/get_nprocs_conf.texi
+@include glibc-functions/get_phys_pages.texi
+@include glibc-functions/sysinfo.texi
+
+@node Glibc sys/syslog.h
+@section Glibc @code{<sys/syslog.h>}
+
+@menu
+* vsyslog::
+@end menu
+
+@include glibc-functions/vsyslog.texi
+
+@node Glibc sys/sysmacros.h
+@section Glibc @code{<sys/sysmacros.h>}
+
+@menu
+* gnu_dev_major::
+* gnu_dev_makedev::
+* gnu_dev_minor::
+@end menu
+
+@include glibc-functions/gnu_dev_major.texi
+@include glibc-functions/gnu_dev_makedev.texi
+@include glibc-functions/gnu_dev_minor.texi
+
+@node Glibc sys/time.h
+@section Glibc Extensions to @code{<sys/time.h>}
+
+@menu
+* adjtime::
+* futimes::
+* futimesat::
+* lutimes::
+* settimeofday::
+@end menu
+
+@include glibc-functions/adjtime.texi
+@include glibc-functions/futimes.texi
+@include glibc-functions/futimesat.texi
+@include glibc-functions/lutimes.texi
+@include glibc-functions/settimeofday.texi
+
+@c @node Glibc sys/timeb.h
+@c @section Glibc Extensions to @code{<sys/timeb.h>}
+
+@c @node Glibc sys/times.h
+@c @section Glibc Extensions to @code{<sys/times.h>}
+
+@node Glibc sys/timex.h
+@section Glibc @code{<sys/timex.h>}
+
+@menu
+* adjtimex::
+* ntp_adjtime::
+* ntp_gettime::
+@end menu
+
+@include glibc-functions/adjtimex.texi
+@include glibc-functions/ntp_adjtime.texi
+@include glibc-functions/ntp_gettime.texi
+
+@c @node Glibc sys/types.h
+@c @section Glibc Extensions to @code{<sys/types.h>}
+
+@c @node Glibc sys/uio.h
+@c @section Glibc Extensions to @code{<sys/uio.h>}
+
+@c @node Glibc sys/un.h
+@c @section Glibc Extensions to @code{<sys/un.h>}
+
+@node Glibc sys/ustat.h
+@section Glibc @code{<sys/ustat.h>}
+
+@menu
+* ustat::
+@end menu
+
+@include glibc-functions/ustat.texi
+
+@c @node Glibc sys/utsname.h
+@c @section Glibc Extensions to @code{<sys/utsname.h>}
+
+@node Glibc sys/vlimit.h
+@section Glibc @code{<sys/vlimit.h>}
+
+@menu
+* vlimit::
+@end menu
+
+@include glibc-functions/vlimit.texi
+
+@node Glibc sys/vm86.h
+@section Glibc @code{<sys/vm86.h>}
+
+@menu
+* vm86::
+@end menu
+
+@include glibc-functions/vm86.texi
+
+@node Glibc sys/vtimes.h
+@section Glibc @code{<sys/vtimes.h>}
+
+@menu
+* vtimes::
+@end menu
+
+@include glibc-functions/vtimes.texi
+
+@node Glibc sys/wait.h
+@section Glibc Extensions to @code{<sys/wait.h>}
+
+@menu
+* wait3::
+* wait4::
+@end menu
+
+@include glibc-functions/wait3.texi
+@include glibc-functions/wait4.texi
+
+@node Glibc sys/xattr.h
+@section Glibc @code{<sys/xattr.h>}
+
+@menu
+* fgetxattr::
+* flistxattr::
+* fremovexattr::
+* fsetxattr::
+* getxattr::
+* lgetxattr::
+* listxattr::
+* llistxattr::
+* lremovexattr::
+* lsetxattr::
+* removexattr::
+* setxattr::
+@end menu
+
+@include glibc-functions/fgetxattr.texi
+@include glibc-functions/flistxattr.texi
+@include glibc-functions/fremovexattr.texi
+@include glibc-functions/fsetxattr.texi
+@include glibc-functions/getxattr.texi
+@include glibc-functions/lgetxattr.texi
+@include glibc-functions/listxattr.texi
+@include glibc-functions/llistxattr.texi
+@include glibc-functions/lremovexattr.texi
+@include glibc-functions/lsetxattr.texi
+@include glibc-functions/removexattr.texi
+@include glibc-functions/setxattr.texi
+
+@c @node Glibc sysexits.h
+@c @section Glibc @code{<sysexits.h>}
+
+@c @node Glibc syslog.h
+@c @section Glibc Extensions to @code{<syslog.h>}
+
+@c @node Glibc tar.h
+@c @section Glibc Extensions to @code{<tar.h>}
+
+@node Glibc termios.h
+@section Glibc Extensions to @code{<termios.h>}
+
+@menu
+* cfmakeraw::
+* cfsetspeed::
+@end menu
+
+@include glibc-functions/cfmakeraw.texi
+@include glibc-functions/cfsetspeed.texi
+
+@c @node Glibc tgmath.h
+@c @section Glibc Extensions to @code{<tgmath.h>}
+
+@node Glibc time.h
+@section Glibc Extensions to @code{<time.h>}
+
+@menu
+* dysize::
+* getdate_r::
+* stime::
+* strptime_l::
+* timegm::
+* timelocal::
+@end menu
+
+@include glibc-functions/dysize.texi
+@include glibc-functions/getdate_r.texi
+@include glibc-functions/stime.texi
+@include glibc-functions/strptime_l.texi
+@include glibc-functions/timegm.texi
+@include glibc-functions/timelocal.texi
+
+@c @node Glibc trace.h
+@c @section Glibc Extensions to @code{<trace.h>}
+
+@node Glibc ttyent.h
+@section Glibc @code{<ttyent.h>}
+
+@menu
+* endttyent::
+* getttyent::
+* getttynam::
+* setttyent::
+@end menu
+
+@include glibc-functions/endttyent.texi
+@include glibc-functions/getttyent.texi
+@include glibc-functions/getttynam.texi
+@include glibc-functions/setttyent.texi
+
+@c @node Glibc ucontext.h
+@c @section Glibc Extensions to @code{<ucontext.h>}
+
+@c @node Glibc ulimit.h
+@c @section Glibc Extensions to @code{<ulimit.h>}
+
+@node Glibc unistd.h
+@section Glibc Extensions to @code{<unistd.h>}
+
+@menu
+* acct::
+* brk::
+* chroot::
+* daemon::
+* dup3::
+* endusershell::
+* euidaccess::
+* execvpe::
+* get_current_dir_name::
+* getdomainname::
+* getdtablesize::
+* getpagesize::
+* getpass::
+* getresgid::
+* getresuid::
+* getusershell::
+* group_member::
+* pipe2::
+* profil::
+* revoke::
+* sbrk::
+* setlogin::
+* setdomainname::
+* sethostid::
+* sethostname::
+* setresgid::
+* setresuid::
+* setusershell::
+* syscall::
+* ttyslot::
+* vhangup::
+@end menu
+
+@include glibc-functions/acct.texi
+@include glibc-functions/brk.texi
+@include glibc-functions/chroot.texi
+@include glibc-functions/daemon.texi
+@include glibc-functions/dup3.texi
+@include glibc-functions/endusershell.texi
+@include glibc-functions/euidaccess.texi
+@include glibc-functions/execvpe.texi
+@include glibc-functions/get_current_dir_name.texi
+@include glibc-functions/getdomainname.texi
+@include glibc-functions/getdtablesize.texi
+@include glibc-functions/getpagesize.texi
+@include glibc-functions/getpass.texi
+@include glibc-functions/getresgid.texi
+@include glibc-functions/getresuid.texi
+@include glibc-functions/getusershell.texi
+@include glibc-functions/group_member.texi
+@include glibc-functions/pipe2.texi
+@include glibc-functions/profil.texi
+@include glibc-functions/revoke.texi
+@include glibc-functions/sbrk.texi
+@include glibc-functions/setlogin.texi
+@include glibc-functions/setdomainname.texi
+@include glibc-functions/sethostid.texi
+@include glibc-functions/sethostname.texi
+@include glibc-functions/setresgid.texi
+@include glibc-functions/setresuid.texi
+@include glibc-functions/setusershell.texi
+@include glibc-functions/syscall.texi
+@include glibc-functions/ttyslot.texi
+@include glibc-functions/vhangup.texi
+
+@c @node Glibc utime.h
+@c @section Glibc Extensions to @code{<utime.h>}
+
+@node Glibc utmp.h
+@section Glibc @code{<utmp.h>}
+
+@menu
+* endutent::
+* getutent::
+* getutent_r::
+* getutid::
+* getutid_r::
+* getutline::
+* getutline_r::
+* pututline::
+* setutent::
+* updwtmp::
+* utmpname::
+@end menu
+
+@include glibc-functions/endutent.texi
+@include glibc-functions/getutent.texi
+@include glibc-functions/getutent_r.texi
+@include glibc-functions/getutid.texi
+@include glibc-functions/getutid_r.texi
+@include glibc-functions/getutline.texi
+@include glibc-functions/getutline_r.texi
+@include glibc-functions/pututline.texi
+@include glibc-functions/setutent.texi
+@include glibc-functions/updwtmp.texi
+@include glibc-functions/utmpname.texi
+
+@node Glibc utmpx.h
+@section Glibc Extensions to @code{<utmpx.h>}
+
+@menu
+* getutmp::
+* getutmpx::
+* updwtmpx::
+* utmpxname::
+@end menu
+
+@include glibc-functions/getutmp.texi
+@include glibc-functions/getutmpx.texi
+@include glibc-functions/updwtmpx.texi
+@include glibc-functions/utmpxname.texi
+
+@node Glibc wchar.h
+@section Glibc Extensions to @code{<wchar.h>}
+
+@menu
+* fgetwc_unlocked::
+* fgetws_unlocked::
+* fputwc_unlocked::
+* fputws_unlocked::
+* getwc_unlocked::
+* getwchar_unlocked::
+* putwc_unlocked::
+* putwchar_unlocked::
+* wcschrnul::
+* wcsftime_l::
+* wcstod_l::
+* wcstof_l::
+* wcstol_l::
+* wcstold_l::
+* wcstoll_l::
+* wcstoq::
+* wcstoul_l::
+* wcstoull_l::
+* wcstouq::
+* wmempcpy::
+@end menu
+
+@include glibc-functions/fgetwc_unlocked.texi
+@include glibc-functions/fgetws_unlocked.texi
+@include glibc-functions/fputwc_unlocked.texi
+@include glibc-functions/fputws_unlocked.texi
+@include glibc-functions/getwc_unlocked.texi
+@include glibc-functions/getwchar_unlocked.texi
+@include glibc-functions/putwc_unlocked.texi
+@include glibc-functions/putwchar_unlocked.texi
+@include glibc-functions/wcschrnul.texi
+@include glibc-functions/wcsftime_l.texi
+@include glibc-functions/wcstod_l.texi
+@include glibc-functions/wcstof_l.texi
+@include glibc-functions/wcstol_l.texi
+@include glibc-functions/wcstold_l.texi
+@include glibc-functions/wcstoll_l.texi
+@include glibc-functions/wcstoq.texi
+@include glibc-functions/wcstoul_l.texi
+@include glibc-functions/wcstoull_l.texi
+@include glibc-functions/wcstouq.texi
+@include glibc-functions/wmempcpy.texi
+
+@c @node Glibc wctype.h
+@c @section Glibc Extensions to @code{<wctype.h>}
+
+@c @node Glibc wordexp.h
+@c @section Glibc Extensions to @code{<wordexp.h>}
+
+@node Particular Modules
+@chapter Particular Modules
+
+@menu
+* alloca::
+* alloca-opt::
+* Safe Allocation Macros::
+* String Functions in C Locale::
+* Quoting::
+* error and progname::
+* gcd::
+* Regular expressions::
+* Searching for Libraries::
+* Exported Symbols of Shared Libraries::
+* LD Version Scripts::
+* Visual Studio Compatibility::
+* Supporting Relocation::
+* func::
+* warnings::
+* manywarnings::
+@end menu
+
+@node alloca
+@section alloca
+@findex alloca
+@include alloca.texi
+
+@node alloca-opt
+@section alloca-opt
+@findex alloca
+@include alloca-opt.texi
+
+@include safe-alloc.texi
+
+@node String Functions in C Locale
+@section Character and String Functions in C Locale
+
+The functions in this section are similar to the generic string functions
+from the standard C library, except that
+@itemize
+@item
+They behave as if the locale was set to the "C" locale, even when the
+locale is different, and/or
+@item
+They are specially optimized for the case where all characters are plain
+ASCII characters.
+@end itemize
+
+@menu
+* c-ctype::
+* c-strcase::
+* c-strcaseeq::
+* c-strcasestr::
+* c-strstr::
+* c-strtod::
+* c-strtold::
+@end menu
+
+@node c-ctype
+@subsection c-ctype
+@include c-ctype.texi
+
+@node c-strcase
+@subsection c-strcase
+@include c-strcase.texi
+
+@node c-strcaseeq
+@subsection c-strcaseeq
+@include c-strcaseeq.texi
+
+@node c-strcasestr
+@subsection c-strcasestr
+@include c-strcasestr.texi
+
+@node c-strstr
+@subsection c-strstr
+@include c-strstr.texi
+
+@node c-strtod
+@subsection c-strtod
+@include c-strtod.texi
+
+@node c-strtold
+@subsection c-strtold
+@include c-strtold.texi
+
+@include quote.texi
+
+@include error.texi
+
+@include gcd.texi
+
+@node Regular expressions
+@section Regular expressions
+
+Gnulib supports many different types of regular expressions; although
+the underlying features are the same or identical, the syntax used
+varies. The descriptions given here for the different types are
+generated automatically.
+
+@include regexprops-generic.texi
+
+@include havelib.texi
+
+@include lib-symbol-visibility.texi
+
+@include ld-version-script.texi
+
+@include ld-output-def.texi
+
+@include relocatable-maint.texi
+
+@include func.texi
+
+@include warnings.texi
+
+@include manywarnings.texi
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@include fdl-1.3.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/gnulib/doc/gpl-2.0.texi b/gnulib/doc/gpl-2.0.texi
new file mode 100644
index 00000000..38aa9182
--- /dev/null
+++ b/gnulib/doc/gpl-2.0.texi
@@ -0,0 +1,389 @@
+@c The GNU General Public License.
+@center Version 2, June 1991
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@heading Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software---to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+@heading TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+@enumerate 0
+@item
+This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The ``Program'', below,
+refers to any such program or work, and a ``work based on the Program''
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term ``modification''.) Each licensee is addressed as ``you''.
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+@item
+You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+@item
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+@enumerate a
+@item
+You must cause the modified files to carry prominent notices
+stating that you changed the files and the date of any change.
+
+@item
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+@item
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License. (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+@end enumerate
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+@item
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+@enumerate a
+@item
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+@item
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+@item
+Accompany it with the information you received as to the offer
+to distribute corresponding source code. (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+@end enumerate
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+@item
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+@item
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+@item
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+@item
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+@item
+The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and ``any
+later version'', you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+@item
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+@iftex
+@heading NO WARRANTY
+@end iftex
+@ifinfo
+@center NO WARRANTY
+
+@end ifinfo
+
+@item
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+@end enumerate
+
+@iftex
+@heading END OF TERMS AND CONDITIONS
+@end iftex
+@ifinfo
+@center END OF TERMS AND CONDITIONS
+
+@end ifinfo
+
+@page
+@heading Appendix: 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
+convey 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{yyyy} @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 2 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, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+@smallexample
+Gnomovision version 69, Copyright (C) @var{year} @var{name of author}
+Gnomovision 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.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than @samp{show w} and
+@samp{show c}; they could even be mouse-clicks or menu items---whatever
+suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary. Here is a sample; alter the names:
+
+@example
+Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+`Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+@var{signature of Ty Coon}, 1 April 1989
+Ty Coon, President of Vice
+@end example
+
+This 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.
diff --git a/gnulib/doc/gpl-3.0.texi b/gnulib/doc/gpl-3.0.texi
new file mode 100644
index 00000000..97a17e19
--- /dev/null
+++ b/gnulib/doc/gpl-3.0.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/gnulib/doc/havelib.texi b/gnulib/doc/havelib.texi
new file mode 100644
index 00000000..b2a9841a
--- /dev/null
+++ b/gnulib/doc/havelib.texi
@@ -0,0 +1,207 @@
+@node Searching for Libraries
+@section Searching for Libraries
+
+The following macros check for the presence or location of certain C, C++, or
+Fortran library archive files.
+
+@unnumberedsubsec Simple Library Tests
+
+The macros @code{AC_CHECK_LIB}, @code{AC_SEARCH_LIBS} from GNU Autoconf check
+for the presence of certain C, C++, or Fortran library archive files.
+The libraries are looked up in the default linker path -- a system dependent
+list of directories, that usually contains the @file{/usr/lib} directory --
+ and those directories given by @code{-L} options in the @code{LDFLAGS}
+variable.
+
+@unnumberedsubsec Locating Libraries
+
+The following macros, defined in the Gnulib module @code{havelib}, search for
+the location of certain C, C++, or Fortran library archive files and make the
+found location available to the compilation process and to further Autoconf
+tests.
+
+@deffn Macro @code{AC_LIB_LINKFLAGS(@var{name}, [@var{dependencies}])}
+
+Searches for @code{lib<@var{name}>} and the libraries corresponding to
+explicit and implicit dependencies. Sets and AC_SUBSTs the
+@code{LIB<@var{NAME}>} and @code{LTLIB<@var{NAME}>} variables (with
+@code{<@var{NAME}>} in upper case) and augments the @code{CPPFLAGS} variable
+by @code{-I} options.
+
+This macro should be used when @code{lib<@var{name}>} is expected to be found.
+@end deffn
+
+@deffn Macro @code{AC_LIB_HAVE_LINKFLAGS(@var{name}, [@var{dependencies}], [@var{includes}], [@var{testcode}], [@var{missing-message}])}
+
+Searches for @code{lib<@var{name}>} and the libraries corresponding to
+explicit and implicit dependencies, together with the specified include files
+and the ability to compile and link the specified @var{testcode}. The
+@var{missing-message} defaults to @code{no} and may contain additional hints
+for the user. If found, it sets and AC_SUBSTs @code{HAVE_LIB<@var{NAME}>=yes}
+and the @code{LIB<@var{NAME}>} and @code{LTLIB<@var{NAME}>} variables (with
+@code{<@var{NAME}>} in upper case) and augments the @code{CPPFLAGS} variable
+by @code{-I} options, and #defines @code{HAVE_LIB<@var{NAME}>} to 1.
+Otherwise, it sets and AC_SUBSTs @code{HAVE_LIB<@var{NAME}>=no} and
+@code{LIB<@var{NAME}>} and @code{LTLIB<@var{NAME}>} to empty.
+@end deffn
+
+These macros assume that when a library is installed in
+@code{@var{some_directory}/lib}, its include files are installed in
+@code{@var{some_directory}/include}.
+
+The complexities that @code{AC_LIB_LINKFLAGS} and @code{AC_LIB_HAVE_LINKFLAGS}
+deal with are the following:
+
+@itemize @bullet
+@item
+The library is not necessarily already in the search path (@code{CPPFLAGS} for
+the include file search path, @code{LDFLAGS} for the library search path).
+The macro provides a @samp{--with-lib<@var{name}>} option. The user of the
+@samp{configure} script can use this option to indicate the location of the
+library and its include files. If not provided, the @code{--prefix} directory
+is searched as well.
+
+@item
+The library 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{LIB<@var{NAME}>} variable. This works on most systems.
+It can also be inhibited: The user of @samp{configure} can use the
+@code{--disable-rpath} option to force an installation that doesn't contain
+hardcoded library search paths but instead may require the use of an
+environment variable like @code{LD_LIBRARY_PATH}.
+@end itemize
+
+The macros also set a variable @code{LTLIB<@var{NAME}>}, that should be used
+when linking with libtool. Both @code{LTLIB<@var{NAME}>} and
+@code{LIB<@var{NAME}>} contain essentially the same option, but where
+@code{LIB<@var{NAME}>} contains platform dependent flags like
+@samp{-Wl,-rpath}, @code{LTLIB<@var{NAME}>} contains platform independent
+flags like @samp{-R}.
+
+@unnumberedsubsubsec Example of using @code{AC_LIB_LINKFLAGS}
+
+Suppose you want to use @code{libz}, the compression library.
+
+@enumerate
+@item
+In configure.ac you add the line
+
+@smallexample
+ AC_CONFIG_AUX_DIR([build-aux])
+ AC_LIB_LINKFLAGS([z])
+@end smallexample
+
+@noindent
+Note that since the @code{AC_LIB_LINKFLAGS} invocation modifies the CPPFLAGS,
+it should precede all tests that check for header files, declarations,
+structures or types.
+
+@item
+To the package's @file{build-aux} directory you add the file
+@file{config.rpath}, also part of the Gnulib @code{havelib} module.
+(@code{gnulib-tool} will usually do this for you automatically.)
+
+@item
+In @code{Makefile.in} you add @code{@@LIBZ@@} to the link command line of
+your program. Or, if you are using Automake, you add @code{$(LIBZ)} to the
+@code{LDADD} variable that corresponds to your program.
+@end enumerate
+
+@unnumberedsubsubsec Dependencies
+
+The dependencies list is a space separated list of library names that
+@code{lib@var{name}} is known to depend upon. Example: If @code{libfooy}
+depends on @code{libfoox}, and @code{libfooz} depends on @code{libfoox} and
+@code{libfooy}, you can write:
+
+@smallexample
+AC_LIB_LINKFLAGS([foox])
+AC_LIB_LINKFLAGS([fooy], [foox])
+AC_LIB_LINKFLAGS([fooz], [foox fooy])
+@end smallexample
+
+@noindent
+Explicit dependencies are necessary if you cannot assume that a @code{.la}
+file, created by libtool, is installed. If you can assume that
+@code{libfooy.la} is installed by libtool (and has not been omitted by the
+ package distributor!), you can omit the explicit dependency and just write
+
+@smallexample
+AC_LIB_LINKFLAGS([fooy])
+@end smallexample
+
+@noindent
+This way, you don't need to know in advance which libraries the needed
+library depends upon.
+
+@unnumberedsubsubsec Static vs. shared
+
+The macros find the libraries regardless whether they are installed as
+shared or static libraries.
+
+@unnumberedsubsubsec @code{CPPFLAGS} vs. @code{LDFLAGS}
+
+The macros determine the directories that should be added to the compiler
+preprocessor's search path and to the linker's search path. For the
+compiler preprocessor, @code{-I} options with the necessary directories are
+added to the @code{CPPFLAGS} variable, for use by the whole package. For
+the linker, appropriate options are added to the @code{LIB<@var{NAME}>} and
+@code{LTLIB<@var{NAME}>} variables, for use during linking by those programs
+and libraries that need the dependency on @code{lib<@var{name}>}. You need
+to use the value of @code{LIB<@var{NAME}>} or @code{LTLIB<@var{NAME}>} in the
+Makefiles. @code{LTLIB<@var{NAME}>} is for use with libtool, whereas
+@code{LIB<@var{NAME}>} is for when libtool is not involved in linking.
+
+The macros do not check whether the include files and the library found
+match. If you want to verify this at configure time, one technique is
+to have a version number in the include files and a version number in the
+library, like this:
+@smallexample
+ #define LIB@var{NAME}_VERSION 10203
+ extern int lib@var{name}_version; /* initialized to LIB@var{NAME}_VERSION */
+@end smallexample
+@noindent
+and use a test like
+@smallexample
+ AC_TRY_RUN([int main () @{ return lib@var{name}_version != LIB@var{NAME}_VERSION; @}])
+@end smallexample
+
+@unnumberedsubsubsec Bi-arch systems
+
+A bi-arch system is one where
+@itemize
+@item
+the processor has a 32-bit execution mode and a 64-bit execution mode
+(for example, x86_64, ia64, sparc64, powerpc64), and
+@item
+32-bit mode libraries and executables and 64-bit mode libraries are both
+installed, and
+@item
+32-bit mode libraries and object files cannot be mixed with 64-bit mode
+ones.
+@end itemize
+
+On several types of such systems, for historical reasons, the 32-bit libraries
+are installed in @file{@var{prefix}/lib}, whereas the 64-bit libraries are
+installed in
+@itemize
+@item
+@file{@var{prefix}/lib64} on many glibc systems,
+@item
+@file{@var{prefix}/lib/64} on Solaris systems.
+@end itemize
+
+On such systems, in 64-bit mode, @command{configure} will search for the
+libraries in @file{@var{prefix}/lib64} or @file{@var{prefix}/lib/64},
+respectively, not in @file{@var{prefix}/lib}. A user can adhere to these
+system-wide conventions by using the @samp{--libdir} option when installing
+packages. When a user has already installed packages in 64-bit mode using
+the GNU default @samp{--libdir=@var{prefix}/lib}, he can make this directory
+adhere to the system-wide convention by placing a symbolic link:
+@table @asis
+@item On glibc systems:
+@code{ln -s lib @var{prefix}/lib64}
+@item On Solaris systems:
+@code{ln -s . @var{prefix}/lib/64}
+@end table
diff --git a/gnulib/doc/inet_ntoa.texi b/gnulib/doc/inet_ntoa.texi
new file mode 100644
index 00000000..5f0e2991
--- /dev/null
+++ b/gnulib/doc/inet_ntoa.texi
@@ -0,0 +1,22 @@
+@node inet_ntoa
+@section inet_ntoa
+@findex inet_ntoa
+
+@c Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{inet_ntoa} function need not be reentrant, and consequently
+is not required to be thread safe. Implementations of
+@code{inet_ntoa} typically write the time stamp into static buffer.
+If two threads call @code{inet_ntoa} at roughly the same time, you
+might end up with the wrong date in one of the threads, or some
+undefined string. Further, @code{inet_ntoa} is specific for
+@acronym{IPv4} addresses.
+
+A protocol independent function is @code{inet_ntop}.
diff --git a/gnulib/doc/install.texi b/gnulib/doc/install.texi
new file mode 100644
index 00000000..6dd4a571
--- /dev/null
+++ b/gnulib/doc/install.texi
@@ -0,0 +1,433 @@
+@c This file is included by autoconf.texi and is used to produce
+@c the INSTALL file.
+
+@ifclear autoconf
+@firstparagraphindent insert
+
+@unnumbered Installation Instructions
+
+Copyright @copyright{} 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004,
+2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification, are
+permitted in any medium without royalty provided the copyright notice
+and this notice are preserved. This file is offered as-is, without
+warranty of any kind.
+
+@end ifclear
+
+@node Basic Installation
+@section Basic Installation
+
+Briefly, the shell commands @samp{./configure; make; make install}
+should configure, build, and install this package. The following
+more-detailed instructions are generic; see the @file{README} file for
+instructions specific to this package.
+@ifclear autoconf
+Some packages provide this @file{INSTALL} file but do not implement all
+of the features documented below. The lack of an optional feature in a
+given package is not necessarily a bug.
+@end ifclear
+More recommendations for @acronym{GNU} packages can be found in
+@ref{Makefile Conventions, , Makefile Conventions, standards,
+@acronym{GNU} Coding Standards}.
+
+The @command{configure} shell script attempts to guess correct values
+for various system-dependent variables used during compilation. It uses
+those values to create a @file{Makefile} in each directory of the
+package. It may also create one or more @file{.h} files containing
+system-dependent definitions. Finally, it creates a shell script
+@file{config.status} that you can run in the future to recreate the
+current configuration, and a file @file{config.log} containing compiler
+output (useful mainly for debugging @command{configure}).
+
+It can also use an optional file (typically called @file{config.cache}
+and enabled with @option{--cache-file=config.cache} or simply
+@option{-C}) that saves the results of its tests to speed up
+reconfiguring. Caching is disabled by default to prevent problems with
+accidental use of stale cache files.
+
+If you need to do unusual things to compile the package, please try to
+figure out how @command{configure} could check whether to do them, and
+mail diffs or instructions to the address given in the @file{README} so
+they can be considered for the next release. If you are using the
+cache, and at some point @file{config.cache} contains results you don't
+want to keep, you may remove or edit it.
+
+The file @file{configure.ac} (or @file{configure.in}) is used to create
+@file{configure} by a program called @command{autoconf}. You need
+@file{configure.ac} if you want to change it or regenerate
+@file{configure} using a newer version of @command{autoconf}.
+
+The simplest way to compile this package is:
+
+@enumerate
+@item
+@command{cd} to the directory containing the package's source code and type
+@samp{./configure} to configure the package for your system.
+
+Running @command{configure} might take a while. While running, it prints some
+messages telling which features it is checking for.
+
+@item
+Type @samp{make} to compile the package.
+
+@item
+Optionally, type @samp{make check} to run any self-tests that come with
+the package, generally using the just-built uninstalled binaries.
+
+@item
+Type @samp{make install} to install the programs and any data files and
+documentation. When installing into a prefix owned by root, it is
+recommended that the package be configured and built as a regular user,
+and only the @samp{make install} phase executed with root privileges.
+
+@item
+Optionally, type @samp{make installcheck} to repeat any self-tests, but
+this time using the binaries in their final installed location. This
+target does not install anything. Running this target as a regular
+user, particularly if the prior @samp{make install} required root
+privileges, verifies that the installation completed correctly.
+
+@item
+You can remove the program binaries and object files from the source
+code directory by typing @samp{make clean}. To also remove the files
+that @command{configure} created (so you can compile the package for a
+different kind of computer), type @samp{make distclean}. There is also
+a @samp{make maintainer-clean} target, but that is intended mainly for
+the package's developers. If you use it, you may have to get all sorts
+of other programs in order to regenerate files that came with the
+distribution.
+
+@item
+Often, you can also type @samp{make uninstall} to remove the installed
+files again. In practice, not all packages have tested that
+uninstallation works correctly, even though it is required by the
+@acronym{GNU} Coding Standards.
+
+@item
+Some packages, particularly those that use Automake, provide @samp{make
+distcheck}, which can by used by developers to test that all other
+targets like @samp{make install} and @samp{make uninstall} work
+correctly. This target is generally not run by end users.
+@end enumerate
+
+@node Compilers and Options
+@section Compilers and Options
+
+Some systems require unusual options for compilation or linking that the
+@command{configure} script does not know about. Run @samp{./configure
+--help} for details on some of the pertinent environment variables.
+
+You can give @command{configure} initial values for configuration
+parameters by setting variables in the command line or in the environment.
+Here is an example:
+
+@example
+./configure CC=c99 CFLAGS=-g LIBS=-lposix
+@end example
+
+@xref{Defining Variables}, for more details.
+
+
+@node Multiple Architectures
+@section Compiling For Multiple Architectures
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use @acronym{GNU} @command{make}.
+@command{cd} to the directory where you want the object files and
+executables to go and run the @command{configure} script.
+@command{configure} automatically checks for the source code in the
+directory that @command{configure} is in and in @file{..}. This is
+known as a @dfn{VPATH} build.
+
+With a non-@acronym{GNU} @command{make},
+it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use @samp{make distclean}
+before reconfiguring for another architecture.
+
+On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types---known as @dfn{fat} or
+@dfn{universal} binaries---by specifying multiple @option{-arch} options
+to the compiler but only a single @option{-arch} option to the
+preprocessor. Like this:
+
+@example
+./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+@end example
+
+This is not guaranteed to produce working output in all cases, you may
+have to build one architecture at a time and combine the results
+using the @command{lipo} tool if you have problems.
+
+@node Installation Names
+@section Installation Names
+
+By default, @samp{make install} installs the package's commands under
+@file{/usr/local/bin}, include files under @file{/usr/local/include}, etc.
+You can specify an
+installation prefix other than @file{/usr/local} by giving
+@command{configure} the option @option{--prefix=@var{prefix}}, where
+@var{prefix} must be an absolute file name.
+
+You can specify separate installation prefixes for architecture-specific
+files and architecture-independent files. If you pass the option
+@option{--exec-prefix=@var{prefix}} to @command{configure}, the
+package uses @var{prefix} as the prefix for installing programs and
+libraries. Documentation and other data files still use the
+regular prefix.
+
+In addition, if you use an unusual directory layout you can give options
+like @option{--bindir=@var{dir}} to specify different values for
+particular kinds of files. Run @samp{configure --help} for a list of
+the directories you can set and what kinds of files go in them. In
+general, the default for these options is expressed in terms of
+@samp{$@{prefix@}}, so that specifying just @option{--prefix} will
+affect all of the other directory specifications that were not
+explicitly provided.
+
+The most portable way to affect installation locations is to pass the
+correct locations to @command{configure}; however, many packages provide
+one or both of the following shortcuts of passing variable assignments
+to the @samp{make install} command line to change installation locations
+without having to reconfigure or recompile.
+
+The first method involves providing an override variable for each
+affected directory. For example, @samp{make install
+prefix=/alternate/directory} will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+@samp{$@{prefix@}}. Any directories that were specified during
+@command{configure}, but not in terms of @samp{$@{prefix@}}, must each be
+overridden at install time for the entire
+installation to be relocated. The approach of makefile variable
+overrides for each directory variable is required by the @acronym{GNU}
+Coding Standards, and ideally causes no recompilation. However, some
+platforms have known limitations with the semantics of shared libraries
+that end up requiring recompilation when using this method, particularly
+noticeable in packages that use @acronym{GNU} Libtool.
+
+The second method involves providing the @samp{DESTDIR} variable. For
+example, @samp{make install DESTDIR=/alternate/directory} will prepend
+@samp{/alternate/directory} before all installation names. The approach
+of @samp{DESTDIR} overrides is not required by the @acronym{GNU} Coding
+Standards, and does not work on platforms that have drive letters. On
+the other hand, it does better at avoiding recompilation issues, and
+works well even when some directory options were not specified in terms
+of @samp{$@{prefix@}} at @command{configure} time.
+
+@node Optional Features
+@section Optional Features
+
+If the package supports it, you can cause programs to be installed with
+an extra prefix or suffix on their names by giving @command{configure}
+the option @option{--program-prefix=@var{PREFIX}} or
+@option{--program-suffix=@var{SUFFIX}}.
+
+Some packages pay attention to @option{--enable-@var{feature}} options
+to @command{configure}, where @var{feature} indicates an optional part
+of the package. They may also pay attention to
+@option{--with-@var{package}} options, where @var{package} is something
+like @samp{gnu-as} or @samp{x} (for the X Window System). The
+@file{README} should mention any @option{--enable-} and @option{--with-}
+options that the package recognizes.
+
+For packages that use the X Window System, @command{configure} can
+usually find the X include and library files automatically, but if it
+doesn't, you can use the @command{configure} options
+@option{--x-includes=@var{dir}} and @option{--x-libraries=@var{dir}} to
+specify their locations.
+
+Some packages offer the ability to configure how verbose the execution
+of @command{make} will be. For these packages, running
+@samp{./configure --enable-silent-rules} sets the default to minimal
+output, which can be overridden with @code{make V=1}; while running
+@samp{./configure --disable-silent-rules} sets the default to verbose,
+which can be overridden with @code{make V=0}.
+
+@node Particular Systems
+@section Particular systems
+
+On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is
+not installed, it is recommended to use the following options in order to
+use an ANSI C compiler:
+
+@example
+./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+@end example
+
+@noindent
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+On OSF/1 a.k.a.@: Tru64, some versions of the default C compiler cannot
+parse its @code{<wchar.h>} header file. The option @option{-nodtk} can be
+used as a workaround. If GNU CC is not installed, it is therefore
+recommended to try
+
+@example
+./configure CC="cc"
+@end example
+
+@noindent
+and if that doesn't work, try
+
+@example
+./configure CC="cc -nodtk"
+@end example
+
+On Solaris, don't put @code{/usr/ucb} early in your @env{PATH}. This
+directory contains several dysfunctional programs; working variants
+of these programs are available in @code{/usr/bin}. So, if you need
+@code{/usr/ucb} in your @env{PATH}, put it @emph{after} @code{/usr/bin}.
+
+On Haiku, software installed for all users goes in @file{/boot/common},
+not @file{/usr/local}. It is recommended to use the following options:
+
+@example
+./configure --prefix=/boot/common
+@end example
+
+@node System Type
+@section Specifying the System Type
+
+There may be some features @command{configure} cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+@emph{same} architectures, @command{configure} can figure that out, but
+if it prints a message saying it cannot guess the machine type, give it
+the @option{--build=@var{type}} option. @var{type} can either be a
+short name for the system type, such as @samp{sun4}, or a canonical name
+which has the form:
+
+@example
+@var{cpu}-@var{company}-@var{system}
+@end example
+
+@noindent
+where @var{system} can have one of these forms:
+
+@example
+@var{os}
+@var{kernel}-@var{os}
+@end example
+
+See the file @file{config.sub} for the possible values of each field.
+If @file{config.sub} isn't included in this package, then this package
+doesn't need to know the machine type.
+
+If you are @emph{building} compiler tools for cross-compiling, you
+should use the option @option{--target=@var{type}} to select the type of
+system they will produce code for.
+
+If you want to @emph{use} a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+@dfn{host} platform (i.e., that on which the generated programs will
+eventually be run) with @option{--host=@var{type}}.
+
+@node Sharing Defaults
+@section Sharing Defaults
+
+If you want to set default values for @command{configure} scripts to
+share, you can create a site shell script called @file{config.site} that
+gives default values for variables like @code{CC}, @code{cache_file},
+and @code{prefix}. @command{configure} looks for
+@file{@var{prefix}/share/config.site} if it exists, then
+@file{@var{prefix}/etc/config.site} if it exists. Or, you can set the
+@code{CONFIG_SITE} environment variable to the location of the site
+script. A warning: not all @command{configure} scripts look for a site
+script.
+
+@node Defining Variables
+@section Defining Variables
+
+Variables not defined in a site shell script can be set in the
+environment passed to @command{configure}. However, some packages may
+run configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the @command{configure} command line, using @samp{VAR=value}.
+For example:
+
+@example
+./configure CC=/usr/local2/bin/gcc
+@end example
+
+@noindent
+causes the specified @command{gcc} to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+@noindent
+Unfortunately, this technique does not work for @env{CONFIG_SHELL} due
+to an Autoconf bug. Until the bug is fixed you can use this
+workaround:
+
+@example
+CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+@end example
+
+@node configure Invocation
+@section @command{configure} Invocation
+
+@command{configure} recognizes the following options to control how it
+operates.
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of all of the options to @command{configure}, and exit.
+
+@item --help=short
+@itemx --help=recursive
+Print a summary of the options unique to this package's
+@command{configure}, and exit. The @code{short} variant lists options
+used only in the top level, while the @code{recursive} variant lists
+options also present in any nested packages.
+
+@item --version
+@itemx -V
+Print the version of Autoconf used to generate the @command{configure}
+script, and exit.
+
+@item --cache-file=@var{file}
+@cindex Cache, enabling
+Enable the cache: use and save the results of the tests in @var{file},
+traditionally @file{config.cache}. @var{file} defaults to
+@file{/dev/null} to disable caching.
+
+@item --config-cache
+@itemx -C
+Alias for @option{--cache-file=config.cache}.
+
+@item --quiet
+@itemx --silent
+@itemx -q
+Do not print messages saying which checks are being made. To suppress
+all normal output, redirect it to @file{/dev/null} (any error messages
+will still be shown).
+
+@item --srcdir=@var{dir}
+Look for the package's source code in directory @var{dir}. Usually
+@command{configure} can determine that directory automatically.
+
+@item --prefix=@var{dir}
+Use @var{dir} as the installation prefix. @ref{Installation Names}
+for more details, including other options available for fine-tuning
+the installation locations.
+
+@item --no-create
+@itemx -n
+Run the configure checks, but stop before creating any output files.
+@end table
+
+@noindent
+@command{configure} also accepts some other, not widely useful, options.
+Run @samp{configure --help} for more details.
+
+@c Local Variables:
+@c fill-column: 72
+@c ispell-local-dictionary: "american"
+@c indent-tabs-mode: nil
+@c whitespace-check-buffer-indent: nil
+@c End:
diff --git a/gnulib/doc/ld-output-def.texi b/gnulib/doc/ld-output-def.texi
new file mode 100644
index 00000000..526ccb04
--- /dev/null
+++ b/gnulib/doc/ld-output-def.texi
@@ -0,0 +1,68 @@
+@node Visual Studio Compatibility
+@section Visual Studio Compatibility
+@cindex DEF files
+@cindex LD DEF files
+
+The @code{lib-msvc-compat} module detects whether the linker supports
+@code{--output-def} when building a library. That parameter is used
+to generate a DEF file for a shared library (DLL). DEF files are
+useful for developers that use Visual Studio to develop programs that
+links to your library. See the GNU LD manual for more information.
+
+There are other ways to create a DEF file, but we believe they are all
+sub-optimal to using @code{--output-def} during the build process.
+The variants we have considered include:
+
+@itemize @bullet
+@item Use DUMPBIN /EXPORTS.
+This is explained in @url{http://support.microsoft.com/kb/131313/en-us}.
+The tool does not generate DEF files directly, so its output needs to
+be post processed manually:
+@smallexample
+$ @{ echo EXPORTS; \
+ dumpbin /EXPORTS libfoo-0.dll | tail -n+20 | awk '@{ print $4 @}'; \
+ @} > libfoo-0.def
+$ lib /def:libfoo-0.def
+@end smallexample
+
+@item Use IMPDEF.
+There is a tool called IMPDEF
+(@url{http://sei.pku.edu.cn/~caodg/course/c/reference/win32/tools/dlltool.html})
+that can generate DEF files. However, it is not part of a standard
+Visual Studio installation. Further, it is documented as being an
+unreliable process.
+
+@item Use DLLTOOL.
+The dlltool is part of the MinGW suite, and thus not part of a
+standard Visual Studio installation. The documentation for the IMPDEF
+tool claims that DLLTOOL is the wrong tool for this job. Finally,
+DLLTOOL does not generate DEF files directly, so it requires
+post-processing of the output.
+
+@end itemize
+
+If you are using libtool to build your shared library, here is how to
+use this module. Import @code{lib-msvc-compat} to your project, and
+then add the following lines to the @code{Makefile.am} that builds the
+library:
+
+@smallexample
+if HAVE_LD_OUTPUT_DEF
+libfoo_la_LDFLAGS += -Wl,--output-def,libfoo-$(DLL_VERSION).def
+defexecdir = $(bindir)
+defexec_DATA = libfoo-$(DLL_VERSION).def
+DISTCLEANFILES += $(defexec_DATA)
+endif
+@end smallexample
+
+The @code{DLL_VERSION} variable needs to be defined. It should be the
+shared library version number used in the DLL filename. For Windows
+targets you compute this value from the values you pass to Libtool's
+@code{-version-info}. Assuming you have variables @code{LT_CURRENT}
+and @code{LT_AGE} defined for the @code{CURRENT} and @code{AGE}
+libtool version integers, you compute @code{DLL_VERSION} as follows:
+
+@smallexample
+DLL_VERSION=`expr $@{LT_CURRENT@} - $@{LT_AGE@}`
+AC_SUBST(DLL_VERSION)
+@end smallexample
diff --git a/gnulib/doc/ld-version-script.texi b/gnulib/doc/ld-version-script.texi
new file mode 100644
index 00000000..e1feff5f
--- /dev/null
+++ b/gnulib/doc/ld-version-script.texi
@@ -0,0 +1,77 @@
+i@node LD Version Scripts
+@section LD Version Scripts
+
+The @code{lib-symbol-versions} module can be used to add shared
+library versioning support. Currently, only GNU LD and the Solaris
+linker supports this.
+
+Version scripts provides information that can be used by GNU/Linux
+distribution packaging tools. For example, Debian has a tool
+@code{dpkg-shlibdeps} that can determine the minimal required version
+of each dependency (by looking at the symbol list) and stuff the
+information into the Debian specific packaging files.
+
+For more information and other uses of version scripts, see Ulrich
+Drepper's paper @url{http://people.redhat.com/drepper/dsohowto.pdf}
+
+You use the module by importing it to your library, and then add the
+following lines to the @code{Makefile.am} that builds the library:
+
+@smallexample
+if HAVE_LD_VERSION_SCRIPT
+libfoo_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libfoo.map
+endif
+@end smallexample
+
+The version script file format is documented in the GNU LD manual, but
+a small example would be:
+
+@smallexample
+LIBFOO_1.0 @{
+ global:
+ libfoo_init; libfoo_doit; libfoo_done;
+
+ local:
+ *;
+@};
+@end smallexample
+
+If you target platforms that do not support linker scripts (i.e., all
+platforms that doesn't use GNU LD) you may want to consider a more
+portable but less powerful alternative: libtool
+@code{-export-symbols}. It will hide internal symbols from your
+library, but will not add ELF versioning symbols. Your usage would
+then be something like:
+
+@smallexample
+if HAVE_LD_VERSION_SCRIPT
+libfoo_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libfoo.map
+else
+libfoo_la_LDFLAGS += -export-symbols $(srcdir)/libfoo.sym
+endif
+@end smallexample
+
+See the Libtool manual for the file syntax, but a small example would
+be:
+
+@smallexample
+libfoo_init
+libfoo_doit
+libfoo_done
+@end smallexample
+
+To avoid the need for a @code{*.sym} file if your symbols are easily
+expressed using a regular expression, you may use
+@code{-export-symbols-regex}:
+
+@smallexample
+if HAVE_LD_VERSION_SCRIPT
+libfoo_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libfoo.map
+else
+libfoo_la_LDFLAGS += -export-symbols-regex '^libfoo_.*'
+endif
+@end smallexample
+
+For more discussions about symbol visibility, rather than shared
+library versioning, see the @code{visibility} module
+(@pxref{Exported Symbols of Shared Libraries}).
diff --git a/gnulib/doc/lgpl-2.1.texi b/gnulib/doc/lgpl-2.1.texi
new file mode 100644
index 00000000..a2ba64bf
--- /dev/null
+++ b/gnulib/doc/lgpl-2.1.texi
@@ -0,0 +1,561 @@
+@c The GNU Lesser General Public License.
+@center Version 2.1, February 1999
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+as the successor of the GNU Library Public License, version 2, hence the
+version number 2.1.]
+@end display
+
+@subheading Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software---to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software---typically libraries---of the Free
+Software Foundation and other authors who decide to use it. You can use
+it too, but we suggest you first think carefully about whether this
+license or the ordinary General Public License is the better strategy to
+use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of it
+in new free programs; and that you are informed that you can do these
+things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the @dfn{Lesser} General Public License because it
+does @emph{Less} to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+``work based on the library'' and a ``work that uses the library''. The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+@subheading TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+@enumerate 0
+@item
+This License Agreement applies to any software library or other program
+which contains a notice placed by the copyright holder or other
+authorized party saying it may be distributed under the terms of this
+Lesser General Public License (also called ``this License''). Each
+licensee is addressed as ``you''.
+
+ A ``library'' means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The ``Library'', below, refers to any such software library or work
+which has been distributed under these terms. A ``work based on the
+Library'' means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term ``modification''.)
+
+ ``Source code'' for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+@item
+You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+@item
+You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+@enumerate a
+@item
+The modified work must itself be a software library.
+
+@item
+You must cause the files modified to carry prominent notices
+stating that you changed the files and the date of any change.
+
+@item
+You must cause the whole of the work to be licensed at no
+charge to all third parties under the terms of this License.
+
+@item
+If a facility in the modified Library refers to a function or a
+table of data to be supplied by an application program that uses
+the facility, other than as an argument passed when the facility
+is invoked, then you must make a good faith effort to ensure that,
+in the event an application does not supply such function or
+table, the facility still operates, and performs whatever part of
+its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has
+a purpose that is entirely well-defined independent of the
+application. Therefore, Subsection 2d requires that any
+application-supplied function or table used by this function must
+be optional: if the application does not supply it, the square
+root function must still compute square roots.)
+@end enumerate
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+@item
+You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+@item
+You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+@item
+A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a ``work that uses the Library''. Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a ``work that uses the Library'' with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a ``work that uses the
+library''. The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a ``work that uses the Library'' uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+@item
+As an exception to the Sections above, you may also combine or
+link a ``work that uses the Library'' with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+@enumerate a
+@item
+Accompany the work with the complete corresponding
+machine-readable source code for the Library including whatever
+changes were used in the work (which must be distributed under
+Sections 1 and 2 above); and, if the work is an executable linked
+with the Library, with the complete machine-readable ``work that
+uses the Library'', as object code and/or source code, so that the
+user can modify the Library and then relink to produce a modified
+executable containing the modified Library. (It is understood
+that the user who changes the contents of definitions files in the
+Library will not necessarily be able to recompile the application
+to use the modified definitions.)
+
+@item
+Use a suitable shared library mechanism for linking with the Library. A
+suitable mechanism is one that (1) uses at run time a copy of the
+library already present on the user's computer system, rather than
+copying library functions into the executable, and (2) will operate
+properly with a modified version of the library, if the user installs
+one, as long as the modified version is interface-compatible with the
+version that the work was made with.
+
+@item
+Accompany the work with a written offer, valid for at
+least three years, to give the same user the materials
+specified in Subsection 6a, above, for a charge no more
+than the cost of performing this distribution.
+
+@item
+If distribution of the work is made by offering access to copy
+from a designated place, offer equivalent access to copy the above
+specified materials from the same place.
+
+@item
+Verify that the user has already received a copy of these
+materials or that you have already sent this user a copy.
+@end enumerate
+
+ For an executable, the required form of the ``work that uses the
+Library'' must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies the
+executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+@item
+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 not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+@enumerate a
+@item
+Accompany the combined library with a copy of the same work
+based on the Library, uncombined with any other library
+facilities. This must be distributed under the terms of the
+Sections above.
+
+@item
+Give prominent notice with the combined library of the fact
+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
+You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+@item
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+@item
+Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+@item
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+@item
+If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+@item
+The Free Software Foundation may publish revised and/or new
+versions of the 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
+specifies a version number of this License which applies to it and
+``any later version'', you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+@item
+If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+@iftex
+@heading NO WARRANTY
+@end iftex
+@ifinfo
+@center NO WARRANTY
+
+@end ifinfo
+
+@item
+BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY ``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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+@item
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+@end enumerate
+
+@iftex
+@heading END OF TERMS AND CONDITIONS
+@end iftex
+@ifinfo
+@center END OF TERMS AND CONDITIONS
+
+@end ifinfo
+
+@page
+@subheading How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey 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 library's name and an idea of what it does.}
+Copyright (C) @var{year} @var{name of author}
+
+This library is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at
+your option) any later version.
+
+This library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+USA.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the library, if
+necessary. Here is a sample; alter the names:
+
+@smallexample
+Yoyodyne, Inc., hereby disclaims all copyright interest in the library
+`Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+@var{signature of Ty Coon}, 1 April 1990
+Ty Coon, President of Vice
+@end smallexample
+
+That's all there is to it!
diff --git a/gnulib/doc/lgpl-3.0.texi b/gnulib/doc/lgpl-3.0.texi
new file mode 100644
index 00000000..c29a6fb4
--- /dev/null
+++ b/gnulib/doc/lgpl-3.0.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/gnulib/doc/lib-symbol-visibility.texi b/gnulib/doc/lib-symbol-visibility.texi
new file mode 100644
index 00000000..cbffaa83
--- /dev/null
+++ b/gnulib/doc/lib-symbol-visibility.texi
@@ -0,0 +1,160 @@
+@node Exported Symbols of Shared Libraries
+@section Controlling the Exported Symbols of Shared Libraries
+
+@c Documentation of gnulib module 'lib-symbol-visibility'.
+
+@c Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+The @code{lib-symbol-visibility} module allows precise control of the
+symbols exported by a shared library. This is useful because
+
+@itemize @bullet
+@item
+It prevents abuse of undocumented APIs of your library. Symbols that
+are not exported from the library cannot be used. This eliminates the
+problem that when the maintainer of the library changes internals of the
+library, maintainers of other projects cry ``breakage''. Instead, these
+maintainers are forced to negotiate the desired API from the maintainer
+of the library.
+
+@item
+It reduces the risk of symbol collision between your library and other
+libraries. For example, the symbol @samp{readline} is defined in several
+libraries, most of which don't have the same semantics and the same calling
+convention as the GNU readline library.
+
+@item
+It reduces the startup time of programs linked to the library. This is
+because the dynamic loader has less symbols to process.
+
+@item
+It allows the compiler to generate better code. Within a shared library,
+a call to a function that is a global symbol costs a ``call'' instruction
+to a code location in the so-called PLT (procedure linkage table) which
+contains a ``jump'' instruction to the actual function's code. (This is
+needed so that the function can be overridden, for example by a function
+with the same name in the executable or in a shared library interposed
+with @code{LD_PRELOAD}.) Whereas a call to a function for which the compiler
+can assume that it is in the same shared library is just a direct ``call''
+instructions. Similarly for variables: A reference to a global variable
+fetches a pointer in the so-called GOT (global offset table); this is a
+pointer to the variable's memory. So the code to access it is two memory
+load instructions. Whereas for a variable which is known to reside in the
+same shared library, it is just a direct memory access: one memory load
+instruction.
+@end itemize
+
+There are traditionally three ways to specify the exported symbols of a
+shared library.
+
+@itemize @bullet
+@item
+The programmer specifies the list of symbols to be exported when the
+shared library is created. Usually a command-line option is passed
+to the linker, with the name of a file containing the symbols.
+
+The upside of this approach is flexibility: it allows the same code to
+be used in different libraries with different export lists. The downsides
+are: 1. it's a lot of maintenance overhead when the symbol list is platform
+dependent, 2. it doesn't work well with C++, due to name mangling.
+
+@item
+The programmer specifies a ``hidden'' attribute for every variable and
+function that shall not be exported.
+
+The drawbacks of this approach are: Symbols are still exported from
+the library by default. It's a lot of maintenance work to mark every non-
+exported variable and function. But usually the exported API is quite small,
+compared to the internal API of the library. And it's the wrong paradigm:
+It doesn't force thinking when introducing new exported API.
+
+@item
+The programmer specifies a ``hidden'' attribute for all files that make up
+the shared library, and an ``exported'' attribute for those symbols in these
+files that shall be exported.
+
+This is perfect: It burdens the maintainer only for exported API, not
+for library-internal API. And it keeps the annotations in the source code.
+@end itemize
+
+GNU libtool's @option{-export-symbols} option implements the first approach.
+
+This gnulib module implements the third approach. For this it relies on
+GNU GCC 4.0 or newer, namely on its @samp{-fvisibility=hidden} command-line
+option and the ``visibility'' attribute. (The ``visibility'' attribute
+was already supported in GCC 3.4, but without the command line option,
+introduced in GCC 4.0, the third approach could not be used.)
+
+More explanations on this subject can be found in
+@url{http://gcc.gnu.org/wiki/Visibility} - which contains more details
+on the GCC features and additional advice for C++ libraries - and in
+Ulrich Drepper's paper @url{http://people.redhat.com/drepper/dsohowto.pdf}
+- which also explains other tricks for reducing the startup time impact
+of shared libraries.
+
+The gnulib autoconf macro @code{gl_VISIBILITY} tests for GCC 4.0 or newer.
+It defines a Makefile variable @code{@@CFLAG_VISIBILITY@@} containing
+@samp{-fvisibility=hidden} or nothing. It also defines as a C macro and
+as a substituted variable: @@HAVE_VISIBILITY@@. Its value is 1 when symbol
+visibility control is supported, and 0 otherwise.
+
+To use this module in a library, say libfoo, you will do these steps:
+
+@enumerate
+@item
+Add @code{@@CFLAG_VISIBILITY@@} or (in a Makefile.am)
+@code{$(CFLAG_VISIBILITY)} to the CFLAGS for the compilation of the sources
+that make up the library.
+
+@item
+Add a C macro definition, say @samp{-DBUILDING_LIBFOO}, to the CPPFLAGS
+for the compilation of the sources that make up the library.
+
+@item
+Define a macro specific to your library like this.
+@smallexample
+#if BUILDING_LIBFOO && HAVE_VISIBILITY
+#define LIBFOO_DLL_EXPORTED __attribute__((__visibility__("default")))
+#else
+#define LIBFOO_DLL_EXPORTED
+#endif
+@end smallexample
+This macro should be enabled in all public header files of your library.
+
+@item
+Annotate all variable, function and class declarations in all public header
+files of your library with @samp{LIBFOO_DLL_EXPORTED}. This annotation
+can occur at different locations: between the @samp{extern} and the
+type or return type, or just before the entity being declared, or after
+the entire declarator. My preference is to put it right after @samp{extern},
+so that the declarations in the header files remain halfway readable.
+@end enumerate
+
+Note that the precise control of the exported symbols will not work with
+other compilers than GCC >= 4.0, and will not work on systems where the
+assembler or linker lack the support of ``hidden'' visibility. Therefore,
+it's good if, in order to reduce the risk of collisions with symbols in
+other libraries, you continue to use a prefix specific to your library
+for all non-static variables and functions and for all C++ classes in
+your library.
+
+Note about other compilers: MSVC support can be added easily, by extending
+the definition of the macro mentioned above, to something like this:
+@smallexample
+#if BUILDING_LIBFOO && HAVE_VISIBILITY
+#define LIBFOO_DLL_EXPORTED __attribute__((__visibility__("default")))
+#elif BUILDING_LIBFOO && defined _MSC_VER
+#define LIBFOO_DLL_EXPORTED __declspec(dllexport)
+#elif defined _MSC_VER
+#define LIBFOO_DLL_EXPORTED __declspec(dllimport)
+#else
+#define LIBFOO_DLL_EXPORTED
+#endif
+@end smallexample
diff --git a/gnulib/doc/maintain.texi b/gnulib/doc/maintain.texi
new file mode 100644
index 00000000..3e264ef5
--- /dev/null
+++ b/gnulib/doc/maintain.texi
@@ -0,0 +1,2079 @@
+\input texinfo.tex @c -*-texinfo-*-
+@c %**start of header
+@setfilename maintain.info
+@settitle Information for Maintainers of GNU Software
+@c For double-sided printing, uncomment:
+@c @setchapternewpage odd
+@c This date is automagically updated when you save this file:
+@set lastupdate January 27, 2010
+@c %**end of header
+
+@dircategory GNU organization
+@direntry
+* Maintaining: (maintain). Maintaining GNU software.
+@end direntry
+
+@setchapternewpage off
+
+@c Put everything in one index (arbitrarily chosen to be the concept index).
+@syncodeindex fn cp
+@syncodeindex pg cp
+
+@copying
+Information for maintainers of GNU software, last updated @value{lastupdate}.
+
+Copyright @copyright{} 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+Foundation, Inc.
+
+@quotation
+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, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+@end quotation
+@end copying
+
+@titlepage
+@title Information for Maintainers of GNU Software
+@author Richard Stallman
+@author last updated @value{lastupdate}
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top Version
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Preface::
+* Stepping Down::
+* Recruiting Developers::
+* Legal Matters::
+* Clean Ups::
+* Platforms::
+* Mail::
+* Old Versions::
+* Distributions::
+* Web Pages::
+* Ethical and Philosophical Consideration::
+* Terminology::
+* Hosting::
+* Free Software Directory::
+* Using the Proofreaders List::
+* GNU Free Documentation License::
+* Index::
+@end menu
+
+
+@node Preface
+@chapter About This Document
+
+This file contains guidelines and advice for someone who is the
+maintainer of a GNU program on behalf of the GNU Project. Everyone is
+entitled to change and redistribute GNU software; you need not pay
+attention to this file to get permission. But if you want to maintain a
+version for widespread distribution, we suggest you follow these
+guidelines. If you would like to be a GNU maintainer, then it is
+essential to follow these guidelines.
+
+In addition to this document, please read and follow the GNU Coding
+Standards (@pxref{Top, , Contents, standards, GNU Coding Standards}).
+
+@cindex @code{gnustandards-commit@@gnu.org} mailing list
+If you want to receive diffs for every change to these GNU documents,
+join the mailing list @code{gnustandards-commit@@gnu.org}, via the web
+interface at
+@url{http://lists.gnu.org/mailman/listinfo/gnustandards-commit}.
+Archives are also available there.
+
+@cindex @code{maintainers@@gnu.org} email address
+Please send corrections or suggestions for this document to
+@email{bug-standards@@gnu.org}. If you make a suggestion, please
+include a suggested new wording for it, to help us consider the
+suggestion efficiently. We prefer a context diff to the
+@file{maintain.texi} file, but if you don't have that file, you can
+make a context diff for some other version of this document, or
+propose it in any way that makes it clear.
+
+@cindex @code{mentors@@gnu.org} mailing list
+If you have general questions or encounter a situation where it isn't
+clear what to do, you can ask @email{mentors@@gnu.org}, which is a
+list of a few experienced GNU contributors who have offered to answer
+questions for new maintainers.
+
+The directory @file{/gd/gnuorg} mentioned throughout this document is
+found on the GNU file server, currently @code{fencepost.gnu.org}; if
+you are the maintainer of a GNU package, you should have an account
+there. See @url{http://www.gnu.org/software/README.accounts.html} if
+you don't have one. (You can also ask for accounts for people who
+help you a large amount in working on the package.)
+
+If on occasion you find that any GNU computer systems
+(@code{fencepost.gnu.org}, @code{ftp.gnu.org},
+@code{savannah.gnu.org}, or others) seem to be down, you can check the
+current status at @url{http://identi.ca/group/fsfstatus}. Most likely
+the problem, if it is at the FSF end, is already being worked on.
+
+@cindex Piercy, Marge
+This document uses the gender-neutral third-person pronouns ``person'',
+``per'', ``pers'' and ``perself'' which were promoted, and perhaps
+invented, by Marge Piercy in @cite{Woman on the Edge of Time}. They are
+used just like ``she'', ``her'', ``hers'' and ``herself'', except that
+they apply equally to males and females. For example, ``Person placed
+per new program under the GNU GPL, to let the public benefit from per
+work, and to enable per to feel person has done the right thing.''
+
+This release of the GNU Maintenance Instructions was last updated
+@value{lastupdate}.
+
+
+@node Stepping Down
+@chapter Stepping Down
+
+With good fortune, you will continue maintaining your package for many
+decades. But sometimes for various reasons maintainers decide to step
+down.
+
+If you're the official maintainer of a GNU package and you decide to
+step down, please inform the GNU Project (@email{maintainers@@gnu.org}).
+We need to know that the package no longer has a maintainer, so we can
+look for and appoint a new maintainer.
+
+If you have an idea for who should take over, please tell
+@email{maintainers@@gnu.org} your suggestion. The appointment of a new
+maintainer needs the GNU Project's confirmation, but your judgment that
+a person is capable of doing the job will carry a lot of weight.
+
+As your final act as maintainer, it would be helpful to set up the
+package under @code{savannah.gnu.org} if it is not there already
+(@pxref{Old Versions}). This will make it much easier for the new
+maintainer to pick up where you left off and will ensure that the
+source tree is not misplaced if it takes us a while to find a new
+maintainer.
+
+
+@node Recruiting Developers
+@chapter Recruiting Developers
+
+Unless your package is a fairly small, you probably won't do all the
+work on it yourself. Most maintainers recruit other developers to help.
+
+Sometimes people will offer to help. Some of them will be capable,
+while others will not. It's up to you to determine who provides useful
+help, and encourage those people to participate more.
+
+Some of the people who offer to help will support the GNU Project, while
+others may be interested for other reasons. Some will support the goals
+of the Free Software Movement, but some may not. They are all welcome
+to help with the work---we don't ask people's views or motivations
+before they contribute to GNU packages.
+
+As a consequence, you cannot expect all contributors to support the GNU
+Project, or to have a concern for its policies and standards. So part
+of your job as maintainer is to exercise your authority on these points
+when they arise. No matter how much of the work other people do, you
+are in charge of what goes in the release. When a crucial point arises,
+you should calmly state your decision and stick to it.
+
+Sometimes a package has several co-maintainers who share the role of
+maintainer. Unlike developers who help, co-maintainers have actually
+been appointed jointly as the maintainers of the package, and they carry
+out the maintainer's functions together. If you would like to propose
+some of your developers as co-maintainers, please contact
+@email{maintainers@@gnu.org}.
+
+We're happy to acknowledge all major contributors to GNU packages on
+the @url{http://www.gnu.org/people/people.html} web page. Please send
+an entry for yourself to @email{webmasters@@gnu.org}, and feel free to
+suggest it to other significant developers on your package.
+
+
+@node Legal Matters
+@chapter Legal Matters
+@cindex legal matters
+
+This chapter describes procedures you should follow for legal reasons
+as you maintain the program, to avoid legal difficulties.
+
+@menu
+* Copyright Papers::
+* Legally Significant::
+* Recording Contributors::
+* Copying from Other Packages::
+* Copyright Notices::
+* License Notices::
+* External Libraries::
+@end menu
+
+@node Copyright Papers
+@section Copyright Papers
+@cindex copyright papers
+
+If you maintain an FSF-copyrighted package
+certain legal procedures are required when incorporating legally significant
+changes written by other people. This ensures that the FSF has the
+legal right to distribute the package, and the standing to defend its
+GPL-covered status in court if necessary.
+
+@strong{Before} incorporating significant changes, make sure that the
+person who wrote the changes has signed copyright papers and that the
+Free Software Foundation has received and signed them. We may also need
+an employer's disclaimer from the person's employer.
+
+@cindex data base of GNU copyright assignments
+To check whether papers have been received, look in
+@file{/gd/gnuorg/copyright.list}. If you can't look there directly,
+@email{fsf-records@@gnu.org} can check for you. Our clerk can also
+check for papers that are waiting to be entered and inform you when
+expected papers arrive.
+
+@cindex @file{/gd/gnuorg} directory
+@c This paragraph intentionally duplicates information given
+@c near the beginning of the file--to make sure people don't miss it.
+The directory @file{/gd/gnuorg} is found on the GNU machines,
+currently @code{fencepost.gnu.org}; if you are the maintainer of a GNU
+package, you should have an account on them. Contact
+@email{accounts@@gnu.org} if you don't have one. (You can also ask
+for accounts for people who help you a large amount in working on the
+package.)
+
+In order for the contributor to know person should sign papers, you need
+to ask per for the necessary papers. If you don't know per well, and you
+don't know that person is used to our ways of handling copyright papers,
+then it might be a good idea to raise the subject with a message like
+this:
+
+@quotation
+Would you be willing to assign the copyright to the Free Software
+Foundation, so that we could install it in @var{program}?
+@end quotation
+
+@noindent
+or
+
+@quotation
+Would you be willing to sign a copyright disclaimer to put this change
+in the public domain, so that we can install it in @var{program}?
+@end quotation
+
+If the contributor wants more information, you can send per
+@file{/gd/gnuorg/conditions.text}, which explains per options (assign
+vs.@: disclaim) and their consequences.
+
+Once the conversation is under way and the contributor is ready for
+more details, you should send one of the templates that are found in
+the directory @file{/gd/gnuorg/Copyright/}; they are also available
+from the @file{doc/Copyright/} directory of the @code{gnulib} project
+at @url{http://savannah.gnu.org/projects/gnulib}. This section
+explains which templates you should use in which circumstances.
+@strong{Please don't use any of the templates except for those listed
+here, and please don't change the wording.}
+
+Once the conversation is under way, you can send the contributor the
+precise wording and instructions by email. Before you do this, make
+sure to get the current version of the template you will use! We change
+these templates occasionally---don't keep using an old version.
+
+For large changes, ask the contributor for an assignment. Send per a
+copy of the file @file{request-assign.changes}. (Like all the
+@samp{request-} files, it is in @file{/gd/gnuorg/Copyright} and in
+@code{gnulib}.)
+
+For medium to small changes, request a personal disclaimer by sending
+per the file @file{request-disclaim.changes}.
+
+If the contributor is likely to keep making changes, person might want
+to sign an assignment for all per future changes to the program. So it
+is useful to offer per that alternative. If person wants to do it that
+way, send per the @file{request-assign.future}.
+
+When you send a @file{request-} file, you don't need to fill in anything
+before sending it. Just send the file verbatim to the contributor. The
+file gives per instructions for how to ask the FSF to mail per the
+papers to sign. The @file{request-} file also raises the issue of
+getting an employer's disclaimer from the contributor's employer.
+
+When the contributor emails the form to the FSF, the FSF sends per
+papers to sign. If person signs them right away, the whole process
+takes about two weeks--mostly waiting for letters to go back and
+forth.
+
+For less common cases, we have template files you should send to the
+contributor. Be sure to fill in the name of the person and the name
+of the program in these templates, where it says @samp{NAME OF PERSON}
+and @samp{NAME OF PROGRAM}, before sending; otherwise person might
+sign without noticing them, and the papers would be useless. Note
+that in some templates there is more than one place to put the name of
+the program or the name of the person; be sure to change all of them.
+All the templates raise the issue of an employer's disclaimer as well.
+
+@cindex legal papers for changes in manuals
+You do not need to ask for separate papers for a manual that is
+distributed only in the software package it describes. But if we
+sometimes distribute the manual separately (for instance, if we publish
+it as a book), then we need separate legal papers for changes in the
+manual. For smaller changes, use
+@file{disclaim.changes.manual}; for larger ones, use
+@file{assign.changes.manual}. To cover both past and future
+changes to a manual, you can use @file{assign.future.manual}.
+For a translation of a manual, use @file{assign.translation.manual}.
+
+For translations of program strings (as used by GNU Gettext, for
+example; @pxref{Internationalization,,,standards,GNU Coding
+Standards}), use @file{disclaim.translation}. If you make use of the
+Translation Project (@url{http://translationproject.org}) facilities,
+please check with the TP coordinators that they have sent the
+contributor the papers; if they haven't, then you should send the
+papers. In any case, you should wait for the confirmation from the
+FSF that the signed papers have been received and accepted before
+integrating the new contributor's material, as usual.
+
+If a contributor is reluctant to sign an assignment for a large change,
+and is willing to sign a disclaimer instead, that is acceptable, so you
+should offer this alternative if it helps you reach agreement. We
+prefer an assignment for a larger change, so that we can enforce the GNU
+GPL for the new text, but a disclaimer is enough to let us use the text.
+
+If you maintain a collection of programs, occasionally someone will
+contribute an entire separate program or manual that should be added to
+the collection. Then you can use the files
+@file{request-assign.program}, @file{disclaim.program},
+@file{assign.manual}, and @file{disclaim.manual}. We very much prefer
+an assignment for a new separate program or manual, unless it is quite
+small, but a disclaimer is acceptable if the contributor insists on
+handling the matter that way.
+
+If a contributor wants the FSF to publish only a pseudonym, that is
+ok. The contributor should say this, and state the desired pseudonym,
+when answering the @file{request-} form. The actual legal papers will
+use the real name, but the FSF will publish only the pseudonym. When
+using one of the other forms, fill in the real name but ask the
+contributor to discuss the use of a pseudonym with
+@email{assign@@gnu.org} before sending back the signed form.
+
+@strong{Although there are other templates besides the ones listed here,
+they are for special circumstances; please do not use them without
+getting advice from @email{assign@@gnu.org}.}
+
+If you are not sure what to do, then please ask @email{assign@@gnu.org} for
+advice; if the contributor asks you questions about the meaning and
+consequences of the legal papers, and you don't know the answers, you
+can forward them to @email{assign@@gnu.org} and we will answer.
+
+@strong{Please do not try changing the wording of a template yourself.
+If you think a change is needed, please talk with @email{assign@@gnu.org},
+and we will work with a lawyer to decide what to do.}
+
+@node Legally Significant
+@section Legally Significant Changes
+
+If a person contributes more than around 15 lines of code and/or text
+that is legally significant for copyright purposes, we
+need copyright papers for that contribution, as described above.
+
+A change of just a few lines (less than 15 or so) is not legally
+significant for copyright. A regular series of repeated changes, such
+as renaming a symbol, is not legally significant even if the symbol
+has to be renamed in many places. Keep in mind, however, that a
+series of minor changes by the same person can add up to a significant
+contribution. What counts is the total contribution of the person; it
+is irrelevant which parts of it were contributed when.
+
+Copyright does not cover ideas. If someone contributes ideas but no
+text, these ideas may be morally significant as contributions, and
+worth giving credit for, but they are not significant for copyright
+purposes. Likewise, bug reports do not count for copyright purposes.
+
+When giving credit to people whose contributions are not legally
+significant for copyright purposes, be careful to make that fact
+clear. The credit should clearly say they did not contribute
+significant code or text.
+
+When people's contributions are not legally significant because they
+did not write code, do this by stating clearly what their contribution
+was. For instance, you could write this:
+
+@example
+/*
+ * Ideas by:
+ * Richard Mlynarik <mly@@adoc.xerox.com> (1997)
+ * Masatake Yamato <masata-y@@is.aist-nara.ac.jp> (1999)
+ */
+@end example
+
+@noindent
+@code{Ideas by:} makes it clear that Mlynarik and Yamato here
+contributed only ideas, not code. Without the @code{Ideas by:} note,
+several years from now we would find it hard to be sure whether they
+had contributed code, and we might have to track them down and ask
+them.
+
+When you record a small patch in a change log file, first search for
+previous changes by the same person, and see if per past
+contributions, plus the new one, add up to something legally
+significant. If so, you should get copyright papers for all per
+changes before you install the new change.
+
+If that is not so, you can install the small patch. Write @samp{(tiny
+change)} after the patch author's name, like this:
+
+@example
+2002-11-04 Robert Fenk <Robert.Fenk@@gmx.de> (tiny change)
+@end example
+
+@node Recording Contributors
+@section Recording Contributors
+@cindex recording contributors
+
+@strong{Keep correct records of which portions were written by whom.}
+This is very important. These records should say which files or
+parts of files were written by each person, and which files or
+parts of files were revised by each person. This should include
+installation scripts as well as manuals and documentation
+files---everything.
+
+These records don't need to be as detailed as a change log. They
+don't need to distinguish work done at different times, only different
+people. They don't need describe changes in more detail than which
+files or parts of a file were changed. And they don't need to say
+anything about the function or purpose of a file or change--the
+Register of Copyrights doesn't care what the text does, just who wrote
+or contributed to which parts.
+
+The list should also mention if certain files distributed in the same
+package are really a separate program.
+
+Only the contributions that are legally significant for copyright
+purposes (@pxref{Legally Significant}) need to be listed. Small
+contributions, bug reports, ideas, etc., can be omitted.
+
+For example, this would describe an early version of GAS:
+
+@display
+Dean Elsner first version of all files except gdb-lines.c and m68k.c.
+Jay Fenlason entire files gdb-lines.c and m68k.c, most of app.c,
+ plus extensive changes in messages.c, input-file.c, write.c
+ and revisions elsewhere.
+
+Note: GAS is distributed with the files obstack.c and obstack.h, but
+they are considered a separate package, not part of GAS proper.
+@end display
+
+@cindex @file{AUTHORS} file
+Please keep these records in a file named @file{AUTHORS} in the source
+directory for the program itself.
+
+You can use the change log as the basis for these records, if you
+wish. Just make sure to record the correct author for each change
+(the person who wrote the change, @emph{not} the person who installed
+it), and add @samp{(tiny change)} for those changes that are too
+trivial to matter for copyright purposes. Later on you can update the
+@file{AUTHORS} file from the change log. This can even be done
+automatically, if you are careful about the formatting of the change
+log entries.
+
+@node Copying from Other Packages
+@section Copying from Other Packages
+
+When you copy legally significant code from another free software
+package with a GPL-compatible license, you should look in the
+package's records to find out the authors of the part you are copying,
+and list them as the contributors of the code that you copied. If all
+you did was copy it, not write it, then for copyright purposes you are
+@emph{not} one of the contributors of @emph{this} code.
+
+Especially when code has been released into the public domain, authors
+sometimes fail to write a license statement in each file. In this
+case, please first be sure that all the authors of the code have
+disclaimed copyright interest. Then, when copying the new files into
+your project, add a brief note at the beginning of the files recording
+the authors, the public domain status, and anything else relevant.
+
+On the other hand, when merging some public domain code into an
+existing file covered by the GPL (or LGPL or other free software
+license), there is no reason to indicate the pieces which are public
+domain. The notice saying that the whole file is under the GPL (or
+other license) is legally sufficient.
+
+Using code that is released under a GPL-compatible free license,
+rather than being in the public domain, may require preserving
+copyright notices or other steps. Of course, you should do what is
+needed.
+
+If you are maintaining an FSF-copyrighted package, please verify we
+have papers for the code you are copying, @emph{before} copying it.
+If you are copying from another FSF-copyrighted package, then we
+presumably have papers for that package's own code, but you must check
+whether the code you are copying is part of an external library; if
+that is the case, we don't have papers for it, so you should not copy
+it. It can't hurt in any case to double-check with the developer of
+that package.
+
+When you are copying code for which we do not already have papers, you
+need to get papers for it. It may be difficult to get the papers if
+the code was not written as a contribution to your package, but that
+doesn't mean it is ok to do without them. If you cannot get papers
+for the code, you can only use it as an external library
+(@pxref{External Libraries}).
+
+
+@node Copyright Notices
+@section Copyright Notices
+@cindex copyright notices in program files
+
+You should maintain a proper copyright notice and a license
+notice in each nontrivial file in the package. (Any file more than ten
+lines long is nontrivial for this purpose.) This includes header files
+and interface definitions for
+building or running the program, documentation files, and any supporting
+files. If a file has been explicitly placed in the public domain, then
+instead of a copyright notice, it should have a notice saying explicitly
+that it is in the public domain.
+
+Even image files and sound files should contain copyright notices and
+license notices, if their format permits. Some formats do not have
+room for textual annotations; for these files, state the copyright and
+copying permissions in a @file{README} file in the same directory.
+
+Change log files should have a copyright notice and license notice at
+the end, since new material is added at the beginning but the end
+remains the end.
+
+When a file is automatically generated from some other file in the
+distribution, it is useful for the automatic procedure to copy the
+copyright notice and permission notice of the file it is generated
+from, if possible. Alternatively, put a notice at the beginning saying
+which file it is generated from.
+
+A copyright notice looks like this:
+
+@example
+Copyright (C) @var{year1}, @var{year2}, @var{year3} @var{copyright-holder}
+@end example
+
+The word @samp{Copyright} must always be in English, by international
+convention.
+
+The @var{copyright-holder} may be the Free Software Foundation, Inc., or
+someone else; you should know who is the copyright holder for your
+package.
+
+Replace the @samp{(C)} with a C-in-a-circle symbol if it is available.
+For example, use @samp{@@copyright@{@}} in a Texinfo file. However,
+stick with parenthesized @samp{C} unless you know that C-in-a-circle
+will work. For example, a program's standard @option{--version}
+message should use parenthesized @samp{C} by default, though message
+translations may use C-in-a-circle in locales where that symbol is
+known to work. Alternatively, the @samp{(C)} or C-in-a-circle can be
+omitted entirely; the word @samp{Copyright} suffices.
+
+To update the list of year numbers, add each year in which you have
+made nontrivial changes to the package. (Here we assume you're using
+a publicly accessible revision control server, so that every revision
+installed is also immediately and automatically published.) When you
+add the new year, it is not required to keep track of which files have
+seen significant changes in the new year and which have not. It is
+recommended and simpler to add the new year to all files in the
+package, and be done with it for the rest of the year.
+
+Don't delete old year numbers, though; they are significant since they
+indicate when older versions might theoretically go into the public
+domain, if the movie companies don't continue buying laws to further
+extend copyright. If you copy a file into the package from some other
+program, keep the copyright years that come with the file.
+
+Do not abbreviate the year list using a range; for instance, do not
+write @samp{1996--1998}; instead, write @samp{1996, 1997, 1998}.
+
+For files which are regularly copied from another project (such as
+@samp{gnulib}), leave the copyright notice as it is in the original.
+
+The copyright statement may be split across multiple lines, both in
+source files and in any generated output. This often happens for
+files with a long history, having many different years of
+publication.
+
+For an FSF-copyrighted package, if you have followed the procedures to
+obtain legal papers, each file should have just one copyright holder:
+the Free Software Foundation, Inc. You should edit the file's
+copyright notice to list that name and only that name.
+
+But if contributors are not all assigning their copyrights to a single
+copyright holder, it can easily happen that one file has several
+copyright holders. Each contributor of nontrivial text is a copyright
+holder.
+
+In that case, you should always include a copyright notice in the name
+of main copyright holder of the file. You can also include copyright
+notices for other copyright holders as well, and this is a good idea
+for those who have contributed a large amount and for those who
+specifically ask for notices in their names. (Sometimes the license
+on code that you copy in may require preserving certain copyright
+notices.) But you don't have to include a notice for everyone who
+contributed to the file (which would be rather inconvenient).
+
+Sometimes a program has an overall copyright notice that refers to the
+whole program. It might be in the @file{README} file, or it might be
+displayed when the program starts up. This copyright notice should
+mention the year of completion of the most recent major version; it
+can mention years of completion of previous major versions, but that
+is optional.
+
+
+@node License Notices
+@section License Notices
+@cindex license notices in program files
+
+Every nontrivial file needs a license notice as well as the copyright
+notice. (Without a license notice giving permission to copy and
+change the file, the file is non-free.)
+
+The package itself should contain a full copy of GPL in plain text
+(conventionally in a file named @file{COPYING}) and the GNU Free
+Documentation License (included within your documentation, so there is
+no need for a separate plain text version). If the package contains
+any files distributed under the Lesser GPL, it should contain a full
+copy of its plain text version also (conventionally in a file named
+@file{COPYING.LESSER}).
+
+If you have questions about license issues for your GNU package,
+please write @email{licensing@@gnu.org}.
+
+@menu
+* Source: Canonical License Sources.
+* Code: License Notices for Code.
+* Documentation: License Notices for Documentation.
+* Other: License Notices for Other Files.
+@end menu
+
+
+@node Canonical License Sources
+@subsection Canonical License Sources
+
+You can get the official versions of these files from several places.
+You can use whichever is the most convenient for you.
+
+@itemize @bullet
+@item
+@uref{http://www.gnu.org/licenses/}.
+
+@item
+The @code{gnulib} project on @code{savannah.gnu.org}, which you
+can access via anonymous Git or CVS. See
+@uref{http://savannah.gnu.org/projects/gnulib}.
+
+@end itemize
+
+The official Texinfo sources for the licenses are also available in
+those same places, so you can include them in your documentation. A
+GFDL-covered manual should include the GFDL in this way. @xref{GNU
+Sample Texts,,,texinfo,Texinfo}, for a full example in a Texinfo
+manual.
+
+
+@node License Notices for Code
+@subsection License Notices for Code
+
+Typically the license notice for program files (including build scripts,
+configure files and makefiles) should cite the GPL, like this:
+
+@quotation
+This file is part of GNU @var{program}.
+
+GNU @var{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.
+
+GNU @var{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 quotation
+
+But in a small program which is just a few files, you can use
+this instead:
+
+@quotation
+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 quotation
+
+
+@node License Notices for Documentation
+@subsection License Notices for Documentation
+
+Documentation files should have license notices also. Manuals should
+use the GNU Free Documentation License. Following is an example of the
+license notice to use after the copyright line(s) using all the
+features of the GFDL.
+
+@smallexample
+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 the
+Invariant Sections being ``GNU General Public License'', with the
+Front-Cover Texts being ``A GNU Manual'', and with the Back-Cover Texts
+as in (a) below. A copy of the license is included in the section
+entitled ``GNU Free Documentation License''.
+
+(a) The FSF's Back-Cover Text is: ``You have the freedom to
+copy and modify this GNU manual. Buying copies from the FSF
+supports it in developing GNU and promoting software freedom.''
+@end smallexample
+
+If the FSF does not publish this manual on paper, then omit the last
+sentence in (a) that talks about copies from GNU Press. If the FSF is
+not the copyright holder, then replace @samp{FSF} with the appropriate
+name.
+
+Please adjust the list of invariant sections as appropriate for your
+manual. If there are none, then say ``with no Invariant Sections''.
+If your manual is not published by the FSF, and under 400 pages, you
+can omit both cover texts.
+
+@xref{GNU Sample Texts,,,texinfo,Texinfo}, for a full example in a
+Texinfo manual, and see
+@url{http://www.gnu.org/licenses/fdl-howto.html} for more advice about
+how to use the GNU FDL.
+
+If the manual is over 400 pages, or if the FSF thinks it might be a
+good choice for publishing on paper, then please include the GNU GPL,
+as in the notice above. Please also include our standard invariant
+section which explains the importance of free documentation. Write to
+@email{assign@@gnu.org} to get a copy of this section.
+
+When you distribute several manuals together in one software package,
+their on-line forms can share a single copy of the GFDL (see
+section@tie{}6). However, the printed (@samp{.dvi}, @samp{.pdf},
+@dots{}) forms should each contain a copy of the GFDL, unless they are
+set up to be printed and published only together. Therefore, it is
+usually simplest to include the GFDL in each manual.
+
+
+@node License Notices for Other Files
+@subsection License Notices for Other Files
+
+Small supporting files, short manuals (under 300 lines long) and rough
+documentation (@file{README} files, @file{INSTALL} files, etc.)@: can
+use a simple all-permissive license like this one:
+
+@smallexample
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without any warranty.
+@end smallexample
+
+Older versions of this license did not have the second sentence with
+the express warranty disclaimer. There is no urgent need to update
+existing files, but new files should use the new text.
+
+If your package distributes Autoconf macros that are intended to be
+used (hence distributed) by third-party packages under possibly
+incompatible licenses, you may also use the above all-permissive
+license for these macros.
+
+
+@node External Libraries
+@section External Libraries
+
+When maintaining an FSF-copyrighted GNU package, you may occasionally
+want to use a general-purpose free software module which offers a
+useful functionality, as a ``library'' facility (though the module is
+not always packaged technically as a library).
+
+In a case like this, it would be unreasonable to ask the author of that
+module to assign the copyright to the FSF. After all, person did not
+write it specifically as a contribution to your package, so it would be
+impertinent to ask per, out of the blue, ``Please give the FSF your
+copyright.''
+
+So the thing to do in this case is to make your program use the module,
+but not consider it a part of your program. There are two reasonable
+methods of doing this:
+
+@enumerate
+@item
+Assume the module is already installed on the system, and use it when
+linking your program. This is only reasonable if the module really has
+the form of a library.
+
+@item
+Include the module in your package, putting the source in a separate
+subdirectory whose @file{README} file says, ``This is not part of the
+GNU FOO program, but is used with GNU FOO.'' Then set up your makefiles
+to build this module and link it into the executable.
+
+For this method, it is not necessary to treat the module as a library
+and make a @samp{.a} file from it. You can link with the @samp{.o}
+files directly in the usual manner.
+@end enumerate
+
+Both of these methods create an irregularity, and our lawyers have told
+us to minimize the amount of such irregularity. So consider using these
+methods only for general-purpose modules that were written for other
+programs and released separately for general use. For anything that was
+written as a contribution to your package, please get papers signed.
+
+
+@node Clean Ups
+@chapter Cleaning Up Changes
+@cindex contributions, accepting
+@cindex quality of changes suggested by others
+
+Don't feel obligated to include every change that someone asks you to
+include. You must judge which changes are improvements---partly based
+on what you think the users will like, and partly based on your own
+judgment of what is better. If you think a change is not good, you
+should reject it.
+
+If someone sends you changes which are useful, but written in an ugly
+way or hard to understand and maintain in the future, don't hesitate to
+ask per to clean up their changes before you merge them. Since the
+amount of work we can do is limited, the more we convince others to help
+us work efficiently, the faster GNU will advance.
+
+If the contributor will not or can not make the changes clean enough,
+then it is legitimate to say ``I can't install this in its present form;
+I can only do so if you clean it up.'' Invite per to distribute per
+changes another way, or to find other people to make them clean enough
+for you to install and maintain.
+
+The only reason to do these cleanups yourself is if (1) it is easy, less
+work than telling the author what to clean up, or (2) the change is an
+important one, important enough to be worth the work of cleaning it up.
+
+The GNU Coding Standards are a good thing to send people when you ask
+them to clean up changes (@pxref{Top, , Contents, standards, GNU Coding
+Standards}). The Emacs Lisp manual contains an appendix that gives
+coding standards for Emacs Lisp programs; it is good to urge Lisp authors to
+read it (@pxref{Tips, , Tips and Conventions, elisp, The GNU Emacs Lisp
+Reference Manual}).
+
+
+@node Platforms
+@chapter Platforms to Support
+
+Most GNU packages run on a wide range of platforms. These platforms are
+not equally important.
+
+The most important platforms for a GNU package to support are GNU and
+GNU/Linux. Developing the GNU operating system is the whole point of
+the GNU Project; a GNU package exists to make the whole GNU system more
+powerful. So please keep that goal in mind and let it shape your work.
+For instance, every new feature you add should work on GNU, and
+GNU/Linux if possible too. If a new feature only runs on GNU and
+GNU/Linux, it could still be acceptable. However, a feature that runs
+only on other systems and not on GNU or GNU/Linux makes no sense in a
+GNU package.
+
+You will naturally want to keep the program running on all the platforms
+it supports. But you personally will not have access to most of these
+platforms--so how should you do it?
+
+Don't worry about trying to get access to all of these platforms. Even
+if you did have access to all the platforms, it would be inefficient for
+you to test the program on each platform yourself. Instead, you should
+test the program on a few platforms, including GNU or GNU/Linux, and let
+the users test it on the other platforms. You can do this through a
+pretest phase before the real release; when there is no reason to expect
+problems, in a package that is mostly portable, you can just make a
+release and let the users tell you if anything unportable was
+introduced.
+
+It is important to test the program personally on GNU or GNU/Linux,
+because these are the most important platforms for a GNU package. If
+you don't have access to one of these platforms, please ask
+@email{maintainers@@gnu.org} to help you out.
+
+Supporting other platforms is optional---we do it when that seems like
+a good idea, but we don't consider it obligatory. If the users don't
+take care of a certain platform, you may have to desupport it unless
+and until users come forward to help. Conversely, if a user offers
+changes to support an additional platform, you will probably want to
+install them, but you don't have to. If you feel the changes are
+complex and ugly, if you think that they will increase the burden of
+future maintenance, you can and should reject them. This includes
+both free or mainly-free platforms such as OpenBSD, FreeBSD, and
+NetBSD, and non-free platforms such as Windows.
+
+
+@node Mail
+@chapter Dealing With Mail
+@cindex bug reports
+
+@cindex email, for receiving bug reports
+@cindex mailing list for bug reports
+Once a program is in use, you will get bug reports for it. Most GNU
+programs have their own special lists for sending bug reports. The
+advertised bug-reporting email address should always be
+@samp{bug-@var{program}@@gnu.org}, to help show users that the program
+is a GNU package, but it is ok to set up that list to forward to another
+site for further forwarding. The package distribution should state the
+name of the bug-reporting list in a prominent place, and ask users to
+help us by reporting bugs there.
+
+We also have a catch-all list, @email{bug-gnu-utils@@gnu.org}, which is
+used for all GNU programs that don't have their own specific lists. But
+nowadays we want to give each program its own bug-reporting list and
+move away from using @email{bug-gnu-utils}.
+
+If you wish, you can also have mailing lists such as
+@samp{info-@var{program}} for announcements (@pxref{Announcements}),
+@samp{help-@var{program}} for general help and discussion (see below),
+or any others you find useful.
+
+By far the easiest way to create mailing lists is through
+@code{savannah.gnu.org}. Once you register your program, you can do
+this yourself through the `Mailing Lists' menu, without needing
+intervention by anyone else. Furthermore, lists created through
+Savannah will have a reasonable default configuration for antispam
+purposes (see below).
+
+If you are the maintainer of a GNU package, you should have an account
+on the GNU servers; contact
+@url{http://www.gnu.org/software/README.accounts.html} if you don't
+have one. (You can also ask for accounts for people who help you a
+large amount in working on the package.) With this account, you can
+edit @file{/com/mailer/aliases} to create a new unmanaged list or add
+yourself to an existing unmanaged list. A comment near the beginning
+of that file explains how to create a Mailman-managed mailing list.
+
+But if you don't want to learn how to do those things, you can
+alternatively ask @email{alias-file@@gnu.org} to add you to the
+bug-reporting list for your program. To set up a new list, contact
+@email{new-mailing-list@@gnu.org}. You can subscribe to a list managed
+by Mailman by sending mail to the corresponding @samp{-request} address.
+
+You should moderate postings from non-subscribed addresses on your
+mailing lists, to prevent propagation of unwanted messages (``spam'')
+to subscribers and to the list archives. For lists controlled by
+Mailman, you can do this by setting @code{Privacy Options - Sender
+Filter - generic_nonmember_action} to @code{Hold}, and then
+periodically (daily is best) reviewing the held messages, accepting
+the real ones and discarding the junk.
+
+@cindex responding to bug reports
+When you receive bug reports, keep in mind that bug reports are crucial
+for your work. If you don't know about problems, you cannot fix them.
+So always thank each person who sends a bug report.
+
+You don't have an obligation to give more response than that, though.
+The main purpose of bug reports is to help you contribute to the
+community by improving the next version of the program. Many of the
+people who report bugs don't realize this---they think that the point is
+for you to help them individually. Some will ask you to focus on that
+@emph{instead of} on making the program better. If you comply with
+their wishes, you will have been distracted from the job of maintaining
+the program.
+
+For example, people sometimes report a bug in a vague (and therefore
+useless) way, and when you ask for more information, they say, ``I just
+wanted to see if you already knew the solution'' (in which case the bug
+report would do nothing to help improve the program). When this
+happens, you should explain to them the real purpose of bug reports. (A
+canned explanation will make this more efficient.)
+
+When people ask you to put your time into helping them use the program,
+it may seem ``helpful'' to do what they ask. But it is much @emph{less}
+helpful than improving the program, which is the maintainer's real job.
+
+By all means help individual users when you feel like it, if you feel
+you have the time available. But be careful to limit the amount of time
+you spend doing this---don't let it eat away the time you need to
+maintain the program! Know how to say no; when you are pressed for
+time, just ``thanks for the bug report---I will fix it'' is enough
+response.
+
+Some GNU packages, such as Emacs and GCC, come with advice about how to
+make bug reports useful. If you want to copy and adapt that, it could
+be a very useful thing to do.
+
+
+@node Old Versions
+@chapter Recording Old Versions
+@cindex version control
+
+It is very important to keep backup files of all source files of GNU.
+You can do this using a source control system (such as RCS, CVS, Git,
+@dots{}) if you like. The easiest way to use RCS or CVS is via the
+Version Control library in Emacs (@pxref{VC Concepts,, Concepts of
+Version Control, emacs, The GNU Emacs Manual}).
+
+The history of previous revisions and log entries is very important for
+future maintainers of the package, so even if you do not make it
+publicly accessible, be careful not to put anything in the repository or
+change log that you would not want to hand over to another maintainer
+some day.
+
+@cindex @code{savannah-hackers@@gnu.org}
+The GNU Project provides a server that GNU software packages can use
+for source control and other package needs: @code{savannah.gnu.org}.
+You don't have to use this repository, but if you plan to allow public
+read-only access to your development sources, it is convenient for
+people to be able to find various GNU packages in a central place.
+Savannah is managed by @email{savannah-hackers@@gnu.org}.
+
+All GNU maintainers are strongly encouraged to take advantage of
+Savannah, as sharing such a central point can serve to foster a sense
+of community among GNU developers and help in keeping up with project
+management.
+
+@cindex @code{savannah-announce@@gnu.org} mailing list
+If you do use Savannah, it is a good idea to subscribe to the
+@email{savannah-announce@@gnu.org} mailing list
+(@url{http://lists.gnu.org/mailman/listinfo/savannah-announce}). This
+is a very low-volume list to keep Savannah users informed of system
+upgrades, problems, and the like.
+
+
+@node Distributions
+@chapter Distributions
+
+It is important to follow the GNU conventions when making GNU software
+distributions.
+
+@menu
+* Distribution tar Files::
+* Distribution Patches::
+* Distribution on ftp.gnu.org::
+* Test Releases::
+* Automated FTP Uploads::
+* Announcements::
+@end menu
+
+@node Distribution tar Files
+@section Distribution tar Files
+@cindex distribution, tar files
+
+The tar file for version @var{m}.@var{n} of program @code{foo} should be
+named @file{foo-@var{m}.@var{n}.tar}. It should unpack into a
+subdirectory named @file{foo-@var{m}.@var{n}}. Tar files should not
+unpack into files in the current directory, because this is inconvenient
+if the user happens to unpack into a directory with other files in it.
+
+Here is how the @file{Makefile} for Bison creates the tar file.
+This method is good for other programs.
+
+@example
+dist: bison.info
+ echo bison-`sed -e '/version_string/!d' \
+ -e 's/[^0-9.]*\([0-9.]*\).*/\1/' -e q version.c` > .fname
+ -rm -rf `cat .fname`
+ mkdir `cat .fname`
+ dst=`cat .fname`; for f in $(DISTFILES); do \
+ ln $(srcdir)/$$f $$dst/$$f || @{ echo copying $$f; \
+ cp -p $(srcdir)/$$f $$dst/$$f ; @} \
+ done
+ tar --gzip -chf `cat .fname`.tar.gz `cat .fname`
+ -rm -rf `cat .fname` .fname
+@end example
+
+Source files that are symbolic links to other file systems cannot be
+installed in the temporary directory using @code{ln}, so use @code{cp}
+if @code{ln} fails.
+
+@pindex automake
+Using Automake is a good way to take care of writing the @code{dist}
+target.
+
+@node Distribution Patches
+@section Distribution Patches
+@cindex patches, against previous releases
+
+If the program is large, it is useful to make a set of diffs for each
+release, against the previous important release.
+
+At the front of the set of diffs, put a short explanation of which
+version this is for and which previous version it is relative to.
+Also explain what else people need to do to update the sources
+properly (for example, delete or rename certain files before
+installing the diffs).
+
+The purpose of having diffs is that they are small. To keep them
+small, exclude files that the user can easily update. For example,
+exclude info files, DVI files, tags tables, output files of Bison or
+Flex. In Emacs diffs, we exclude compiled Lisp files, leaving it up
+to the installer to recompile the patched sources.
+
+When you make the diffs, each version should be in a directory suitably
+named---for example, @file{gcc-2.3.2} and @file{gcc-2.3.3}. This way,
+it will be very clear from the diffs themselves which version is which.
+
+@pindex diff
+@pindex patch
+@cindex time stamp in diffs
+If you use GNU @code{diff} to make the patch, use the options
+@samp{-rc2P}. That will put any new files into the output as ``entirely
+different.'' Also, the patch's context diff headers should have dates
+and times in Universal Time using traditional Unix format, so that patch
+recipients can use GNU @code{patch}'s @samp{-Z} option. For example,
+you could use the following Bourne shell command to create the patch:
+
+@example
+LC_ALL=C TZ=UTC0 diff -rc2P gcc-2.3.2 gcc-2.3.3 | \
+gzip -9 >gcc-2.3.2-2.3.3.patch.gz
+@end example
+
+If the distribution has subdirectories in it, then the diffs probably
+include some files in the subdirectories. To help users install such
+patches reliably, give them precise directions for how to run patch.
+For example, say this:
+
+@display
+To apply these patches, cd to the main directory of the program
+and then use `patch -p1'. `-p1' avoids guesswork in choosing
+which subdirectory to find each file in.
+@end display
+
+It's wise to test your patch by applying it to a copy of the old
+version, and checking that the result exactly matches the new version.
+
+@node Distribution on ftp.gnu.org
+@section Distribution on @code{ftp.gnu.org}
+@cindex GNU ftp site
+@cindex @code{ftp.gnu.org}, the GNU ftp site
+
+GNU packages are distributed through directory @file{/gnu} on
+@code{ftp.gnu.org}. Each package should have a subdirectory
+named after the package, and all the distribution files for the package
+should go in that subdirectory.
+
+@c If you have an interest in seeing the monthly download logs from the FTP
+@c site at @code{ftp.gnu.org} for your program, that is something that
+@c @email{ftp-upload@@gnu.org} can set up for you. Please contact them if
+@c you are interested.
+
+@xref{Automated FTP Uploads}, for procedural details of putting new
+versions on @code{ftp.gnu.org}.
+
+@node Test Releases
+@section Test Releases
+@cindex test releases
+@cindex beta releases
+@cindex pretest releases
+
+@cindex @code{alpha.gnu.org}, ftp site for test releases
+When you release a greatly changed new major version of a program, you
+might want to do so as a pretest. This means that you make a tar file,
+but send it only to a group of volunteers that you have recruited. (Use
+a suitable GNU mailing list/newsgroup to recruit them.)
+
+We normally use the FTP server @code{alpha.gnu.org} for pretests and
+prerelease versions. @xref{Automated FTP Uploads}, for procedural details
+of putting new versions on @code{alpha.gnu.org}.
+
+Once a program gets to be widely used and people expect it to work
+solidly, it is a good idea to do pretest releases before each ``real''
+release.
+
+There are two ways of handling version numbers for pretest versions.
+One method is to treat them as versions preceding the release you are going
+to make.
+
+In this method, if you are about to release version 4.6 but you want
+to do a pretest first, call it 4.5.90. If you need a second pretest,
+call it 4.5.91, and so on. If you are really unlucky and ten pretests
+are not enough, after 4.5.99 you could advance to 4.5.990 and so on.
+(You could also use 4.5.100, but 990 has the advantage of sorting in
+the right order.)
+
+The other method is to attach a date to the release number that is
+coming. For a pretest for version 4.6, made on Dec 10, 2002, this
+would be 4.6.20021210. A second pretest made the same day could be
+4.6.20021210.1.
+
+For development snapshots that are not formal pretests, using just
+the date without the version numbers is ok too.
+
+One thing that you should never do is to release a pretest with the same
+version number as the planned real release. Many people will look only
+at the version number (in the tar file name, in the directory name that
+it unpacks into, or wherever they can find it) to determine whether a
+tar file is the latest version. People might look at the test release
+in this way and mistake it for the real release. Therefore, always
+change the number when you release changed code.
+
+
+@node Automated FTP Uploads
+@section Automated FTP Uploads
+
+@cindex ftp uploads, automated
+In order to upload new releases to @code{ftp.gnu.org} or
+@code{alpha.gnu.org}, you first need to register the necessary
+information. Then, you can perform uploads yourself, with no
+intervention needed by the system administrators.
+
+The general idea is that releases should be crytographically signed
+before they are made publicly available.
+
+@menu
+* Automated Upload Registration::
+* Automated Upload Procedure::
+* FTP Upload Directive File - v1.1::
+* FTP Upload Directive File - v1.0::
+@end menu
+
+
+@node Automated Upload Registration
+@subsection Automated Upload Registration
+
+@cindex registration for uploads
+@cindex uploads, registration for
+
+Here is how to register your information so you can perform uploads
+for your GNU package:
+
+@enumerate
+
+@item
+Create an account for yourself at @url{http://savannah.gnu.org}, if
+you don't already have one. By the way, this is also needed to
+maintain the web pages at @url{www.gnu.org} for your project
+(@pxref{Web Pages}).
+
+@item
+In the @samp{My Account Conf} page on @code{savannah}, upload the GPG
+key you will use to sign your packages.
+
+You can create a key with the command @code{gpg --gen-key}. It is
+good to also send your key to the GPG public key server: @code{gpg
+--keyserver keys.gnupg.net --send-keys @var{keyid}}, where @var{keyid}
+is the eight hex digits reported by @code{gpg --list-public-keys} on
+the @code{pub} line before the date. For full information about GPG,
+see @url{http://www.gnu.org/software/gpg})
+
+@item
+Compose a message with the following items in some @var{msgfile}.
+Then GPG-sign it by running @code{gpg --clearsign @var{msgfile}}, and
+finally email the resulting @file{@var{msgfile}.asc}), to
+@email{ftp-upload@@gnu.org}.
+
+@enumerate
+@item
+Name of package(s) that you are the maintainer for, and your
+preferred email address.
+
+@item
+An ASCII armored copy of your GnuPG key, as an attachment. (@samp{gpg
+--export -a @var{your_key_id} >mykey.asc} should give you this.)
+
+@item
+A list of names and preferred email addresses of other individuals you
+authorize to make releases for which packages, if any (in the case that you
+don't make all releases yourself).
+
+@item
+ASCII armored copies of GnuPG keys for any individuals listed in (3).
+@end enumerate
+@end enumerate
+
+The administrators will acknowledge your message when they have added
+the proper GPG keys as authorized to upload files for the
+corresponding packages.
+
+The upload system will email receipts to the given email addresses
+when an upload is made, either successfully or unsuccessfully.
+
+
+@node Automated Upload Procedure
+@subsection Automated Upload Procedure
+
+@cindex uploads
+
+Once you have registered your information as described in the previous
+section, you will be able to do ftp uploads for yourself using the
+following procedure.
+
+For each upload destined for @code{ftp.gnu.org} or
+@code{alpha.gnu.org}, three files (a @dfn{triplet}) need to be
+uploaded via ftp to the host @code{ftp-upload.gnu.org}.
+
+@enumerate
+@item
+The file to be distributed; for example, @file{foo.tar.gz}.
+
+@item
+Detached GPG binary signature file for (1); for example,
+@file{foo.tar.gz.sig}. Make this with @samp{gpg -b foo.tar.gz}.
+
+
+@item
+A clearsigned @dfn{directive file}; for example,
+@file{foo.tar.gz.directive.asc}. Make this by preparing the plain
+text file @file{foo.tar.gz.directive} and then run @samp{gpg
+--clearsign foo.tar.gz.directive}. @xref{FTP Upload Directive File -
+v1.1}, for the contents of the directive file.
+@end enumerate
+
+The names of the files are important. The signature file must have the
+same name as the file to be distributed, with an additional
+@file{.sig} extension. The directive file must have the same name as
+the file to be distributed, with an additional @file{.directive.asc}
+extension. If you do not follow this naming convention, the upload
+@emph{will not be processed}.
+
+Since v1.1 of the upload script, it is also possible to upload a
+clearsigned directive file on its own (no accompanying @file{.sig} or
+any other file) to perform certain operations on the server.
+@xref{FTP Upload Directive File - v1.1}, for more information.
+
+Upload the file(s) via anonymous ftp to @code{ftp-upload.gnu.org}. If
+the upload is destined for @code{ftp.gnu.org}, place the file(s) in
+the @file{/incoming/ftp} directory. If the upload is destined for
+@code{alpha.gnu.org}, place the file(s) in the @file{/incoming/alpha}
+directory.
+
+Uploads are processed every five minutes. Uploads that are in
+progress while the upload processing script is running are handled
+properly, so do not worry about the timing of your upload. Uploaded
+files that belong to an incomplete triplet are deleted automatically
+after 24 hours.
+
+Your designated upload email addresses (@pxref{Automated Upload Registration})
+are sent a message if there are any problems processing an upload for your
+package. You also receive a message when your upload has been successfully
+processed.
+
+One automated way to create and transfer the necessary files is to use
+the @code{gnupload} script, which is available from the
+@file{build-aux/} directory of the @code{gnulib} project at
+@url{http://savannah.gnu.org/projects/gnulib}. @code{gnupload} can
+also remove uploaded files. Run @code{gnupload --help} for a
+description and examples.
+
+@code{gnupload} uses the @code{ncftpput} program to do the actual
+transfers; if you don't happen to have the @code{ncftp} package
+installed, the @code{ncftpput-ftp} script in the @file{build-aux/}
+directory of @code{gnulib} serves as a replacement which uses plain
+command line @code{ftp}.
+
+If you have difficulties with an upload, email
+@email{ftp-upload@@gnu.org}.
+
+
+@node FTP Upload Directive File - v1.1
+@subsection FTP Upload Directive File - v1.1
+
+The directive file name must end in @file{directive.asc}.
+
+When part of a triplet, the directive file must always contain the
+directives @code{version}, @code{directory} and @code{filename}, as
+described. In addition, a 'comment' directive is allowed.
+
+The @code{version} directive must always have the value @samp{1.1}.
+
+The @code{directory} directive specifies the final destination
+directory where the uploaded file and its @file{.sig} companion are to
+be placed.
+
+The @code{filename} directive must contain the name of the file to be
+distributed (item@tie{}(1) above).
+
+For example, as part of an uploaded triplet, a
+@file{foo.tar.gz.directive.asc} file might contain these lines (before
+being gpg clearsigned):
+
+@example
+version: 1.1
+directory: bar/v1
+filename: foo.tar.gz
+comment: hello world!
+@end example
+
+This directory line indicates that @file{foo.tar.gz} and
+@file{foo.tar.gz.sig} are part of package @code{bar}. If you uploaded
+this triplet to @file{/incoming/ftp} and the system positively
+authenticates the signatures, the files @file{foo.tar.gz} and
+@file{foo.tar.gz.sig} will be placed in the directory
+@file{gnu/bar/v1} of the @code{ftp.gnu.org} site.
+
+The directive file can be used to create currently non-existent
+directory trees, as long as they are under the package directory for
+your package (in the example above, that is @code{bar}).
+
+If you upload a file that already exists in the FTP directory, the
+original will simply be archived and replaced with the new upload.
+
+@subheading Standalone directives
+
+When uploaded by itself, the directive file must contain one or more
+of the directives @code{symlink}, @code{rmsymlink} or @code{archive},
+in addition to the obligatory @code{directory} and @code{version}
+directives. A @code{filename} directive is not allowed, and a
+@code{comment} directive remains optional.
+
+If you use more than one directive, the directives are executed in the
+sequence they are specified in. If a directive results in an error,
+further execution of the upload is aborted.
+
+Removing a symbolic link (with @code{rmsymlink}) which does not exist
+results in an error. However, attempting to create a symbolic link
+that already exists (with @code{symlink}) is not an error. In this
+case @code{symlink} behaves like the command @command{ln -s -f}: any
+existing symlink is removed before creating the link. (But an
+existing regular file or directory is not removed.)
+
+Here are a few examples. The first removes a symlink:
+
+@example
+version: 1.1
+directory: bar/v1
+rmsymlink: foo-latest.tgz
+comment: remove a symlink
+@end example
+
+@noindent
+Archive an old file, taking it offline:
+
+@example
+version: 1.1
+directory: bar/v1
+archive: foo-1.1.tar.gz
+comment: archive an old file; it will not be available through FTP anymore
+@end example
+
+@noindent
+Archive an old directory (with all contents), taking it offline:
+
+@example
+version: 1.1
+directory: bar/v1
+archive: foo
+comment: archive an old directory; it will not be available through FTP anymore
+@end example
+
+@noindent
+Create a new symlink:
+
+@example
+version: 1.1
+directory: bar/v1
+symlink: foo-1.2.tar.gz foo-latest.tgz
+comment: create a new symlink
+@end example
+
+@noindent
+Do everything at once:
+
+@example
+version: 1.1
+directory: bar/v1
+rmsymlink: foo-latest.tgz
+symlink: foo-1.2.tar.gz foo-latest.tgz
+archive: foo-1.1.tar.gz
+comment: now do everything at once
+@end example
+
+
+@node FTP Upload Directive File - v1.0
+@subsection FTP Upload Directive File - v1.0
+
+@dfn{As of June 2006, the upload script is running in compatibility
+mode, allowing uploads with either version@tie{}1.1 or
+version@tie{}1.0 of the directive file syntax. Support for v1.0
+uploads will be phased out by the end of 2006, so please upgrade
+to@tie{}v1.1.}
+
+The directive file should contain one line, excluding the clearsigned
+data GPG that inserts, which specifies the final destination directory
+where items (1) and (2) are to be placed.
+
+For example, the @file{foo.tar.gz.directive.asc} file might contain the
+single line:
+
+@example
+directory: bar/v1
+@end example
+
+This directory line indicates that @file{foo.tar.gz} and
+@file{foo.tar.gz.sig} are part of package @code{bar}. If you were to
+upload the triplet to @file{/incoming/ftp}, and the system can
+positively authenticate the signatures, then the files
+@file{foo.tar.gz} and @file{foo.tar.gz.sig} will be placed in the
+directory @file{gnu/bar/v1} of the @code{ftp.gnu.org} site.
+
+The directive file can be used to create currently non-existent
+directory trees, as long as they are under the package directory for
+your package (in the example above, that is @code{bar}).
+
+
+@node Announcements
+@section Announcing Releases
+@cindex announcements
+
+@cindex @code{info-gnu} mailing list
+When you have a new release, please make an announcement. For
+official new releases, including those made just to fix bugs, we
+strongly recommend using the (moderated) general GNU announcements
+list, @email{info-gnu@@gnu.org}. Doing so makes it easier for users
+and developers to find the latest GNU releases. On the other hand,
+please do not announce test releases on @code{info-gnu} unless it's a
+highly unusual situation.
+
+@cindex @url{http://planet.gnu.org}
+@cindex Savannah, news area
+Please also post release announcements in the news section of your
+Savannah project site. It is fine to also write news entries for test
+releases and any other newsworthy events. The news feeds from all GNU
+projects at savannah are aggregated at @url{http://planet.gnu.org}
+(GNU Planet). You can also post items directly, or arrange for feeds
+from other locations; see contact information on the GNU Planet web
+page.
+
+@cindex announcement mailing list, project-specific
+You can maintain your own mailing list (typically
+@email{info-@var{program}@@gnu.org}) for announcements as well if you
+like. For your own list, of course you decide as you see fit what
+events are worth announcing. (@xref{Mail}, for more suggestions on
+handling mail for your package.)
+
+@cindex contents of announcements
+When writing an announcement, please include the following:
+
+@itemize @bullet
+@item
+A very brief description (a few sentences at most) of the general
+purpose of your package.
+
+@item
+Your package's web page (normally
+@indicateurl{http://www.gnu.org/software/@var{package}/}).
+
+@item
+Your package's download location (normally
+@indicateurl{http://ftp.gnu.org/gnu/@var{package}/}). It is also
+useful to mention the FTP mirror list at
+@url{http://www.gnu.org/order/ftp.html}, and that
+@url{http://ftpmirror.gnu.org/@var{package/}} will automatically
+redirect to a nearby mirror.
+
+@item
+The NEWS (@pxref{NEWS File,,, standards, GNU Coding Standards}) for
+the present release.
+@end itemize
+
+
+@node Web Pages
+@chapter Web Pages
+@cindex web pages
+
+Please write web pages about your package for installation on
+@code{www.gnu.org}. They should follow our usual standards for web
+pages (see @url{http://www.gnu.org/server/fsf-html-style-sheet.html}).
+The overall goals are to support a wide variety of browsers, to focus
+on information rather than flashy eye candy, and to keep the site
+simple and uniform.
+
+Some GNU packages have just simple web pages, but the more information
+you provide, the better. So please write as much as you usefully can,
+and put all of it on @code{www.gnu.org}. However, pages that access
+databases (including mail logs and bug tracking) are an exception; set
+them up on whatever site is convenient for you, and make the pages on
+@code{www.gnu.org} link to that site.
+
+@menu
+* Hosting for Web Pages::
+* Freedom for Web Pages::
+* Manuals on Web Pages::
+* CVS Keywords in Web Pages::
+@end menu
+
+@node Hosting for Web Pages
+@section Hosting for Web Pages
+
+The best way to maintain the web pages for your project is to register
+the project on @code{savannah.gnu.org}. Then you can edit the pages
+using CVS, using the separate ``web repository'' available on
+Savannah, which corresponds to
+@indicateurl{http://www.gnu.org/software/@var{package}/}. You can
+keep your source files there too (using any of a variety of version
+control systems), but you can use @code{savannah.gnu.org} only for
+your gnu.org web pages if you wish; simply register a ``web-only''
+project.
+
+If you don't want to use that method, please talk with
+@email{webmasters@@gnu.org} about other possible methods. For
+instance, you can mail them pages to install, if necessary. But that
+is more work for them, so please use Savannah if you can.
+
+If you use Savannah, you can use a special @file{.symlinks} file in
+order to create symbolic links, which are not supported in CVS. For
+details, see
+@url{http://www.gnu.org/server/standards/README.webmastering.html#symlinks}.
+
+
+@node Freedom for Web Pages
+@section Freedom for Web Pages
+
+If you use a site other than @code{www.gnu.org}, please make sure that
+the site runs on free software alone. (It is ok if the site uses
+unreleased custom software, since that is free in a trivial sense:
+there's only one user and it has the four freedoms.) If the web site
+for a GNU package runs on non-free software, the public will see this,
+and it will have the effect of granting legitimacy to the non-free
+program.
+
+If you use multiple sites, they should all follow that criterion.
+Please don't link to a site that is about your package, which the
+public might perceive as connected with it and reflecting the position
+of its developers, unless it follows that criterion.
+
+Historically, web pages for GNU packages did not include GIF images,
+because of patent problems (@pxref{Ethical and Philosophical
+Consideration}). Although the GIF patents expired in 2006, using GIF
+images is still not recommended, as the PNG and JPEG formats are
+generally superior. See @url{http://www.gnu.org/philosophy/gif.html}.
+
+
+@node Manuals on Web Pages
+@section Manuals on Web Pages
+
+The web pages for the package should include its manuals, in HTML,
+DVI, Info, PostScript, PDF, plain ASCII, and Texinfo format (source).
+All of these can be generated automatically from the Texinfo source
+using Makeinfo and other programs.
+
+When there is only one manual, put it in a subdirectory called
+@file{manual}; the file @file{manual/index.html} should have a link to
+the manual in each of its forms.
+
+If the package has more than one manual, put each one in a
+subdirectory of @file{manual}, set up @file{index.html} in each
+subdirectory to link to that manual in all its forms, and make
+@file{manual/index.html} link to each manual through its subdirectory.
+
+See the section below for details on a script to make the job of
+creating all these different formats and index pages easier.
+
+We would like to include links to all GNU manuals on the page
+@url{http://www.gnu.org/manual}, so if yours isn't listed, please send
+mail to @code{webmasters@@gnu.org} telling them the name of your
+package and asking them to edit @url{http://www.gnu.org/manual}, and
+they will do so based on the contents of your @file{manual} directory.
+
+@menu
+* Invoking gendocs.sh::
+@end menu
+
+
+@node Invoking gendocs.sh
+@subsection Invoking @command{gendocs.sh}
+@pindex gendocs.sh
+@cindex generating documentation output
+
+The script @command{gendocs.sh} eases the task of generating the
+Texinfo documentation output for your web pages
+section above. It has a companion template file, used as the basis
+for the HTML index pages. Both are available from the Texinfo CVS
+sources:
+
+@smallformat
+@uref{http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs.sh}
+@uref{http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template}
+@end smallformat
+
+There is also a minimalistic template, available from:
+
+@smallformat
+@uref{http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template_min}
+@end smallformat
+
+Invoke the script like this, in the directory containing the Texinfo
+source:
+
+@smallexample
+gendocs.sh --email @var{yourbuglist} @var{yourmanual} "GNU @var{yourmanual} manual"
+@end smallexample
+
+@noindent where @var{yourmanual} is the short name for your package
+and @var{yourbuglist} is the email address for bug reports (typically
+@code{bug-@var{package}@@gnu.org}). The script processes the file
+@file{@var{yourmanual}.texinfo} (or @file{.texi} or @file{.txi}). For
+example:
+
+@smallexample
+cd .../emacs/man
+# download gendocs.sh and gendocs_template
+gendocs.sh --email bug-gnu-emacs@@gnu.org emacs "GNU Emacs manual"
+@end smallexample
+
+@command{gendocs.sh} creates a subdirectory @file{manual/} containing
+the manual generated in all the standard output formats: Info, HTML,
+DVI, and so on, as well as the Texinfo source. You then need to move
+all those files, retaining the subdirectories, into the web pages for
+your package.
+
+You can specify the option @option{-o @var{outdir}} to override the
+name @file{manual}. Any previous contents of @var{outdir} will be deleted.
+
+The second argument, with the description, is included as part of the
+HTML @code{<title>} of the overall @file{manual/index.html} file. It
+should include the name of the package being documented, as shown.
+@file{manual/index.html} is created by substitution from the file
+@file{gendocs_template}. (Feel free to modify the generic template
+for your own purposes.)
+
+If you have several manuals, you'll need to run this script several
+times with different arguments, specifying a different output
+directory with @option{-o} each time, and moving all the output to
+your web page. Then write (by hand) an overall index.html with links
+to them all. For example:
+
+@smallexample
+cd .../texinfo/doc
+gendocs.sh --email bug-texinfo@@gnu.org -o texinfo texinfo "GNU Texinfo manual"
+gendocs.sh --email bug-texinfo@@gnu.org -o info info "GNU Info manual"
+gendocs.sh --email bug-texinfo@@gnu.org -o info-stnd info-stnd "GNU info-stnd manual"
+@end smallexample
+
+By default, the script uses @command{makeinfo} for generating
+@acronym{HTML} output. If you prefer to use @command{texi2html}, use
+the @option{--texi2html} command line option, e.g.:
+
+@smallexample
+gendocs --texi2html -o texinfo texinfo "GNU Texinfo manual"
+@end smallexample
+
+The template files will automatically produce entries for additional
+HTML output generated by @command{texi2html} (i.e., split by sections
+and chapters).
+
+You can set the environment variables @env{MAKEINFO}, @env{TEXI2DVI},
+@env{TEXI2HTML} and @env{DVIPS} to control the programs that get
+executed, and @env{GENDOCS_TEMPLATE_DIR} to control where the
+@file{gendocs_template} file is found.
+
+As usual, run @samp{gendocs.sh --help} for a description of all the
+options, environment variables, and more information.
+
+Please email bug reports, enhancement requests, or other
+correspondence to @email{bug-texinfo@@gnu.org}.
+
+
+@node CVS Keywords in Web Pages
+@section CVS Keywords in Web Pages
+@cindex CVS keywords in web pages
+@cindex RCS keywords in web pages
+@cindex $ keywords in web pages
+@cindex web pages, and CVS keywords
+
+Since @code{www.gnu.org} works through CVS, CVS keywords in your
+manual, such as @code{@w{$}Log$}, need special treatment (even if you
+don't happen to maintain your manual in CVS).
+
+If these keywords end up in the generated output as literal strings,
+they will be expanded. The most robust way to handle this is to turn
+off keyword expansion for such generated files. For existing files,
+this is done with:
+
+@example
+cvs admin -ko @var{file1} @var{file2} ...
+@end example
+
+@noindent
+For new files:
+
+@example
+cvs add -ko @var{file1} @var{file2} ...
+@end example
+
+@xref{Keyword substitution,,,cvs,Version Management with CVS}.
+
+In Texinfo source, the recommended way to literally specify a
+``dollar'' keyword is:
+
+@example
+@@w@{$@}Log$
+@end example
+
+The @code{@@w} prevents keyword expansion in the Texinfo source
+itself. Also, @code{makeinfo} notices the @code{@@w} and generates
+output avoiding the literal keyword string.
+
+
+@node Ethical and Philosophical Consideration
+@chapter Ethical and Philosophical Consideration
+@cindex ethics
+@cindex philosophy
+
+The GNU project takes a strong stand for software freedom. Many
+times, this means you'll need to avoid certain technologies when their
+use would conflict with our long-term goals.
+
+Software patents threaten the advancement of free software and freedom
+to program. There are so many software patents in the US that any
+large program probably implements hundreds of patented techniques,
+unknown to the program's developers. It would be futile and
+self-defeating to try to find and avoid all these patents. But there
+are some patents which we know are likely to be used to threaten free
+software, so we make an effort to avoid the patented techniques. If
+you are concerned about the danger of a patent and would like advice,
+write to @email{maintainers@@gnu.org}, and we will try to help you get
+advice from a lawyer.
+
+Sometimes the GNU project takes a strong stand against a particular
+patented technology in order to encourage society to reject it.
+
+For example, the MP3 audio format is covered by a software patent in
+the USA and some other countries. A patent holder has threatened
+lawsuits against the developers of free programs (these are not GNU
+programs) to produce and play MP3, and some GNU/Linux distributors are
+afraid to include them. Development of the programs continues, but we
+campaign for the rejection of MP3 format in favor of Ogg Vorbis format.
+
+A GNU package should not recommend use of any non-free program, nor
+should it require a non-free program (such as a non-free compiler or
+IDE) to build. Thus, a GNU package cannot be written in a programming
+language that does not have a free software implementation. Now that
+GNU/Linux systems are widely available, all GNU packages should
+provide full functionality on a 100% free GNU/Linux system, and should
+not require any non-free software to build or function.
+The GNU Coding Standards say a lot more about this issue.
+
+A GNU package should not refer the user to any non-free documentation
+for free software. The need for free documentation to come with free
+software is now a major focus of the GNU project; to show that we are
+serious about the need for free documentation, we must not contradict
+our position by recommending use of documentation that isn't free.
+
+Finally, new issues concerning the ethics of software freedom come up
+frequently. We ask that GNU maintainers, at least on matters that
+pertain specifically to their package, stand with the rest of the GNU
+project when such issues come up.
+
+
+@node Terminology
+@chapter Terminology Issues
+@cindex terminology
+
+This chapter explains a couple of issues of terminology which are
+important for correcting two widespread and important misunderstandings
+about GNU.
+
+@menu
+* Free Software and Open Source::
+* GNU and Linux::
+@end menu
+
+@node Free Software and Open Source
+@section Free Software and Open Source
+@cindex free software
+@cindex open source
+@cindex movements, Free Software and Open Source
+
+The terms ``free software'' and ``open source'' are the slogans of two
+different movements which differ in their basic philosophy. The Free
+Software Movement is idealistic, and raises issues of freedom, ethics,
+principle and what makes for a good society. The Open Source Movement,
+founded in 1998, studiously avoids such questions. For more explanation,
+see @url{http://www.gnu.org/philosophy/open-source-misses-the-point.html}.
+
+The GNU Project is aligned with the Free Software Movement. This
+doesn't mean that all GNU contributors and maintainers have to agree;
+your views on these issues are up to you, and you're entitled to express
+them when speaking for yourself.
+
+However, due to the much greater publicity that the Open Source
+Movement receives, the GNU Project needs to overcome a widespread
+mistaken impression that GNU is @emph{and always was} an activity of
+the Open Source Movement. For this reason, please use the term ``free
+software'', not ``open source'', in GNU software releases, GNU
+documentation, and announcements and articles that you publish in your
+role as the maintainer of a GNU package. A reference to the URL given
+above, to explain the difference, is a useful thing to include as
+well.
+
+@node GNU and Linux
+@section GNU and Linux
+@cindex Linux
+@cindex GNU/Linux
+
+The GNU Project was formed to develop a free Unix-like operating system,
+GNU. The existence of this system is our major accomplishment.
+However, the widely used version of the GNU system, in which Linux is
+used as the kernel, is often called simply ``Linux''. As a result, most
+users don't know about the GNU Project's major accomplishment---or more
+precisely, they know about it, but don't realize it is the GNU Project's
+accomplishment and reason for existence. Even people who believe they
+know the real history often believe that the goal of GNU was to develop
+``tools'' or ``utilities.''
+
+To correct this confusion, we have made a years-long effort to
+distinguish between Linux, the kernel that Linus Torvalds wrote, and
+GNU/Linux, the operating system that is the combination of GNU and
+Linux. The resulting increased awareness of what the GNU Project has
+already done helps every activity of the GNU Project recruit more
+support and contributors.
+
+Please make this distinction consistently in GNU software releases, GNU
+documentation, and announcements and articles that you publish in your
+role as the maintainer of a GNU package. If you want to explain the
+terminology and its reasons, you can refer to the URL
+@url{http://www.gnu.org/gnu/linux-and-gnu.html}.
+
+To contrast the GNU system properly with respect to GNU/Linux, you can
+call it ``GNU/Hurd'' or ``the GNU/Hurd system.'' However, when that
+contrast is not specifically the focus, please call it just ``GNU'' or
+``the GNU system.''
+
+When referring to the collection of servers that is the higher level
+of the GNU kernel, please call it ``the Hurd'' or ``the GNU Hurd.''
+Note that this uses a space, not a slash.
+
+
+@node Hosting
+@chapter Hosting
+@cindex CVS repository
+@cindex repository
+@cindex source repository
+@cindex version control system
+@cindex FTP site
+@cindex hosting
+
+We recommend using @code{savannah.gnu.org} for the source code
+repository for your package, and, even more so, using
+@code{ftp.gnu.org} as the standard distribution site. Doing so makes
+it easier for developers and users to find the latest GNU releases.
+@xref{Old Versions}, for more information about Savannah.
+
+However, it is ok to use other machines if you wish. If you use a
+company's machine to hold the repository for your program, or as its
+ftp site, please put this statement in a prominent place on the site,
+so as to prevent people from getting the wrong idea about the
+relationship between the package and the company:
+
+@smallexample
+The programs <list of them> hosted here are free software packages
+of the GNU Project, not products of <company name>. We call them
+"free software" because you are free to copy and redistribute them,
+following the rules stated in the license of each package. For more
+information, see http://www.gnu.org/philosophy/free-sw.html.
+
+If you are looking for service or support for GNU software, see
+http://www.gnu.org/help/gethelp.html for suggestions of where to ask.
+
+If you would like to contribute to the development of one of these
+packages, contact the package maintainer or the bug-reporting address
+of the package (which should be listed in the package itself), or look
+on www.gnu.org for more information on how to contribute.
+@end smallexample
+
+
+@node Free Software Directory
+@chapter Free Software Directory
+@cindex Free Software Directory
+@cindex Directory, Free Software
+
+The Free Software Directory aims to be a complete list of free
+software packages, within certain criteria. Every GNU package should
+be listed there, so please see
+@url{http://www.gnu.org/help/directory.html#adding-entries} for
+information on how to write an entry for your package. Contact
+@email{bug-directory@@gnu.org} with any questions or suggestions for
+the Free Software Directory.
+
+
+@node Using the Proofreaders List
+@chapter Using the Proofreaders List
+@cindex proofreading
+
+If you want help finding errors in documentation,
+or help improving the quality of writing,
+or if you are not a native speaker of English
+and want help producing good English documentation,
+you can use the GNU proofreaders mailing list:
+@email{proofreaders@@gnu.org}.
+
+But be careful when you use the list,
+because there are over 200 people on it.
+If you simply ask everyone on the list to read your work,
+there will probably be tremendous duplication of effort
+by the proofreaders,
+and you will probably get the same errors reported 100 times.
+This must be avoided.
+
+Also, the people on the list do not want to get
+a large amount of mail from it.
+So do not ever ask people on the list to send mail to the list!
+
+Here are a few methods that seem reasonable to use:
+
+@itemize @bullet
+@item
+For something small, mail it to the list,
+and ask people to pick a random number from 1 to 20,
+and read it if the number comes out as 10.
+This way, assuming 50% response, some 5 people will read the piece.
+
+@item
+For a larger work, divide your work into around 20 equal-sized parts,
+tell people where to get it,
+and ask each person to pick randomly which part to read.
+
+Be sure to specify the random choice procedure;
+otherwise people will probably use a mental procedure
+that is not really random,
+such as ``pick a part near the middle'',
+and you will not get even coverage.
+
+You can either divide up the work physically, into 20 separate files,
+or describe a virtual division, such as by sections
+(if your work has approximately 20 sections).
+If you do the latter, be sure to be precise about it---for example,
+do you want the material before the first section heading
+to count as a section, or not?
+
+@item
+For a job needing special skills, send an explanation of it,
+and ask people to send you mail if they volunteer for the job.
+When you get enough volunteers, send another message to the list saying
+``I have enough volunteers, no more please.''
+@end itemize
+
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@cindex FDL, GNU Free Documentation License
+@include fdl.texi
+
+
+@node Index
+@unnumbered Index
+@printindex cp
+
+@bye
+
+Local variables:
+eval: (add-hook 'write-file-hooks 'time-stamp)
+time-stamp-start: "@set lastupdate "
+time-stamp-start: "@set lastupdate "
+time-stamp-end: "$"
+time-stamp-format: "%:b %:d, %:y"
+compile-command: "make -C work.m"
+End:
diff --git a/gnulib/doc/make-stds.texi b/gnulib/doc/make-stds.texi
new file mode 100644
index 00000000..c8e0d638
--- /dev/null
+++ b/gnulib/doc/make-stds.texi
@@ -0,0 +1,1156 @@
+@comment This file is included by both standards.texi and make.texinfo.
+@comment It was broken out of standards.texi on 1/6/93 by roland.
+
+@node Makefile Conventions
+@chapter Makefile Conventions
+@cindex makefile, conventions for
+@cindex conventions for makefiles
+@cindex standards for makefiles
+
+@c Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
+@c 2004, 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
+@c
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3
+@c or any later version published by the Free Software Foundation;
+@c with no Invariant Sections, with no
+@c Front-Cover Texts, and with no Back-Cover Texts.
+@c A copy of the license is included in the section entitled ``GNU
+@c Free Documentation License''.
+
+This
+@ifinfo
+node
+@end ifinfo
+@iftex
+@ifset CODESTD
+section
+@end ifset
+@ifclear CODESTD
+chapter
+@end ifclear
+@end iftex
+describes conventions for writing the Makefiles for GNU programs.
+Using Automake will help you write a Makefile that follows these
+conventions. For more information on portable Makefiles, see
+@sc{posix} and @ref{Portable Make, Portable Make Programming,, autoconf,
+Autoconf}.
+
+
+@menu
+* Makefile Basics:: General conventions for Makefiles.
+* Utilities in Makefiles:: Utilities to be used in Makefiles.
+* Command Variables:: Variables for specifying commands.
+* DESTDIR:: Supporting staged installs.
+* Directory Variables:: Variables for installation directories.
+* Standard Targets:: Standard targets for users.
+* Install Command Categories:: Three categories of commands in the `install'
+ rule: normal, pre-install and post-install.
+@end menu
+
+@node Makefile Basics
+@section General Conventions for Makefiles
+
+Every Makefile should contain this line:
+
+@example
+SHELL = /bin/sh
+@end example
+
+@noindent
+to avoid trouble on systems where the @code{SHELL} variable might be
+inherited from the environment. (This is never a problem with GNU
+@code{make}.)
+
+Different @code{make} programs have incompatible suffix lists and
+implicit rules, and this sometimes creates confusion or misbehavior. So
+it is a good idea to set the suffix list explicitly using only the
+suffixes you need in the particular Makefile, like this:
+
+@example
+.SUFFIXES:
+.SUFFIXES: .c .o
+@end example
+
+@noindent
+The first line clears out the suffix list, the second introduces all
+suffixes which may be subject to implicit rules in this Makefile.
+
+Don't assume that @file{.} is in the path for command execution. When
+you need to run programs that are a part of your package during the
+make, please make sure that it uses @file{./} if the program is built as
+part of the make or @file{$(srcdir)/} if the file is an unchanging part
+of the source code. Without one of these prefixes, the current search
+path is used.
+
+The distinction between @file{./} (the @dfn{build directory}) and
+@file{$(srcdir)/} (the @dfn{source directory}) is important because
+users can build in a separate directory using the @samp{--srcdir} option
+to @file{configure}. A rule of the form:
+
+@smallexample
+foo.1 : foo.man sedscript
+ sed -f sedscript foo.man > foo.1
+@end smallexample
+
+@noindent
+will fail when the build directory is not the source directory, because
+@file{foo.man} and @file{sedscript} are in the source directory.
+
+When using GNU @code{make}, relying on @samp{VPATH} to find the source
+file will work in the case where there is a single dependency file,
+since the @code{make} automatic variable @samp{$<} will represent the
+source file wherever it is. (Many versions of @code{make} set @samp{$<}
+only in implicit rules.) A Makefile target like
+
+@smallexample
+foo.o : bar.c
+ $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o
+@end smallexample
+
+@noindent
+should instead be written as
+
+@smallexample
+foo.o : bar.c
+ $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@@
+@end smallexample
+
+@noindent
+in order to allow @samp{VPATH} to work correctly. When the target has
+multiple dependencies, using an explicit @samp{$(srcdir)} is the easiest
+way to make the rule work well. For example, the target above for
+@file{foo.1} is best written as:
+
+@smallexample
+foo.1 : foo.man sedscript
+ sed -f $(srcdir)/sedscript $(srcdir)/foo.man > $@@
+@end smallexample
+
+GNU distributions usually contain some files which are not source
+files---for example, Info files, and the output from Autoconf, Automake,
+Bison or Flex. Since these files normally appear in the source
+directory, they should always appear in the source directory, not in the
+build directory. So Makefile rules to update them should put the
+updated files in the source directory.
+
+However, if a file does not appear in the distribution, then the
+Makefile should not put it in the source directory, because building a
+program in ordinary circumstances should not modify the source directory
+in any way.
+
+Try to make the build and installation targets, at least (and all their
+subtargets) work correctly with a parallel @code{make}.
+
+@node Utilities in Makefiles
+@section Utilities in Makefiles
+
+Write the Makefile commands (and any shell scripts, such as
+@code{configure}) to run under @code{sh} (both the traditional Bourne
+shell and the @sc{posix} shell), not @code{csh}. Don't use any
+special features of @code{ksh} or @code{bash}, or @sc{posix} features
+not widely supported in traditional Bourne @code{sh}.
+
+The @code{configure} script and the Makefile rules for building and
+installation should not use any utilities directly except these:
+
+@c dd find
+@c gunzip gzip md5sum
+@c mkfifo mknod tee uname
+
+@example
+awk cat cmp cp diff echo egrep expr false grep install-info
+ln ls mkdir mv pwd rm rmdir sed sleep sort tar test touch tr true
+@end example
+
+Compression programs such as @code{gzip} can be used in the
+@code{dist} rule.
+
+Generally, stick to the widely-supported (usually
+@sc{posix}-specified) options and features of these programs. For
+example, don't use @samp{mkdir -p}, convenient as it may be, because a
+few systems don't support it at all and with others, it is not safe
+for parallel execution. For a list of known incompatibilities, see
+@ref{Portable Shell, Portable Shell Programming,, autoconf, Autoconf}.
+
+
+It is a good idea to avoid creating symbolic links in makefiles, since a
+few file systems don't support them.
+
+The Makefile rules for building and installation can also use compilers
+and related programs, but should do so via @code{make} variables so that the
+user can substitute alternatives. Here are some of the programs we
+mean:
+
+@example
+ar bison cc flex install ld ldconfig lex
+make makeinfo ranlib texi2dvi yacc
+@end example
+
+Use the following @code{make} variables to run those programs:
+
+@example
+$(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX)
+$(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC)
+@end example
+
+When you use @code{ranlib} or @code{ldconfig}, you should make sure
+nothing bad happens if the system does not have the program in question.
+Arrange to ignore an error from that command, and print a message before
+the command to tell the user that failure of this command does not mean
+a problem. (The Autoconf @samp{AC_PROG_RANLIB} macro can help with
+this.)
+
+If you use symbolic links, you should implement a fallback for systems
+that don't have symbolic links.
+
+Additional utilities that can be used via Make variables are:
+
+@example
+chgrp chmod chown mknod
+@end example
+
+It is ok to use other utilities in Makefile portions (or scripts)
+intended only for particular systems where you know those utilities
+exist.
+
+@node Command Variables
+@section Variables for Specifying Commands
+
+Makefiles should provide variables for overriding certain commands, options,
+and so on.
+
+In particular, you should run most utility programs via variables.
+Thus, if you use Bison, have a variable named @code{BISON} whose default
+value is set with @samp{BISON = bison}, and refer to it with
+@code{$(BISON)} whenever you need to use Bison.
+
+File management utilities such as @code{ln}, @code{rm}, @code{mv}, and
+so on, need not be referred to through variables in this way, since users
+don't need to replace them with other programs.
+
+Each program-name variable should come with an options variable that is
+used to supply options to the program. Append @samp{FLAGS} to the
+program-name variable name to get the options variable name---for
+example, @code{BISONFLAGS}. (The names @code{CFLAGS} for the C
+compiler, @code{YFLAGS} for yacc, and @code{LFLAGS} for lex, are
+exceptions to this rule, but we keep them because they are standard.)
+Use @code{CPPFLAGS} in any compilation command that runs the
+preprocessor, and use @code{LDFLAGS} in any compilation command that
+does linking as well as in any direct use of @code{ld}.
+
+If there are C compiler options that @emph{must} be used for proper
+compilation of certain files, do not include them in @code{CFLAGS}.
+Users expect to be able to specify @code{CFLAGS} freely themselves.
+Instead, arrange to pass the necessary options to the C compiler
+independently of @code{CFLAGS}, by writing them explicitly in the
+compilation commands or by defining an implicit rule, like this:
+
+@smallexample
+CFLAGS = -g
+ALL_CFLAGS = -I. $(CFLAGS)
+.c.o:
+ $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
+@end smallexample
+
+Do include the @samp{-g} option in @code{CFLAGS}, because that is not
+@emph{required} for proper compilation. You can consider it a default
+that is only recommended. If the package is set up so that it is
+compiled with GCC by default, then you might as well include @samp{-O}
+in the default value of @code{CFLAGS} as well.
+
+Put @code{CFLAGS} last in the compilation command, after other variables
+containing compiler options, so the user can use @code{CFLAGS} to
+override the others.
+
+@code{CFLAGS} should be used in every invocation of the C compiler,
+both those which do compilation and those which do linking.
+
+Every Makefile should define the variable @code{INSTALL}, which is the
+basic command for installing a file into the system.
+
+Every Makefile should also define the variables @code{INSTALL_PROGRAM}
+and @code{INSTALL_DATA}. (The default for @code{INSTALL_PROGRAM} should
+be @code{$(INSTALL)}; the default for @code{INSTALL_DATA} should be
+@code{$@{INSTALL@} -m 644}.) Then it should use those variables as the
+commands for actual installation, for executables and non-executables
+respectively. Minimal use of these variables is as follows:
+
+@example
+$(INSTALL_PROGRAM) foo $(bindir)/foo
+$(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a
+@end example
+
+However, it is preferable to support a @code{DESTDIR} prefix on the
+target files, as explained in the next section.
+
+It is acceptable, but not required, to install multiple files in one
+command, with the final argument being a directory, as in:
+
+@example
+$(INSTALL_PROGRAM) foo bar baz $(bindir)
+@end example
+
+
+@node DESTDIR
+@section @code{DESTDIR}: Support for Staged Installs
+
+@vindex DESTDIR
+@cindex staged installs
+@cindex installations, staged
+
+@code{DESTDIR} is a variable prepended to each installed target file,
+like this:
+
+@example
+$(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo
+$(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a
+@end example
+
+The @code{DESTDIR} variable is specified by the user on the @code{make}
+command line as an absolute file name. For example:
+
+@example
+make DESTDIR=/tmp/stage install
+@end example
+
+@noindent
+@code{DESTDIR} should be supported only in the @code{install*} and
+@code{uninstall*} targets, as those are the only targets where it is
+useful.
+
+If your installation step would normally install
+@file{/usr/local/bin/foo} and @file{/usr/local/lib/libfoo.a}, then an
+installation invoked as in the example above would install
+@file{/tmp/stage/usr/local/bin/foo} and
+@file{/tmp/stage/usr/local/lib/libfoo.a} instead.
+
+Prepending the variable @code{DESTDIR} to each target in this way
+provides for @dfn{staged installs}, where the installed files are not
+placed directly into their expected location but are instead copied
+into a temporary location (@code{DESTDIR}). However, installed files
+maintain their relative directory structure and any embedded file names
+will not be modified.
+
+You should not set the value of @code{DESTDIR} in your @file{Makefile}
+at all; then the files are installed into their expected locations by
+default. Also, specifying @code{DESTDIR} should not change the
+operation of the software in any way, so its value should not be
+included in any file contents.
+
+@code{DESTDIR} support is commonly used in package creation. It is
+also helpful to users who want to understand what a given package will
+install where, and to allow users who don't normally have permissions
+to install into protected areas to build and install before gaining
+those permissions. Finally, it can be useful with tools such as
+@code{stow}, where code is installed in one place but made to appear
+to be installed somewhere else using symbolic links or special mount
+operations. So, we strongly recommend GNU packages support
+@code{DESTDIR}, though it is not an absolute requirement.
+
+
+@node Directory Variables
+@section Variables for Installation Directories
+
+Installation directories should always be named by variables, so it is
+easy to install in a nonstandard place. The standard names for these
+variables and the values they should have in GNU packages are
+described below. They are based on a standard file system layout;
+variants of it are used in GNU/Linux and other modern operating
+systems.
+
+Installers are expected to override these values when calling
+@command{make} (e.g., @kbd{make prefix=/usr install} or
+@command{configure} (e.g., @kbd{configure --prefix=/usr}). GNU
+packages should not try to guess which value should be appropriate for
+these variables on the system they are being installed onto: use the
+default settings specified here so that all GNU packages behave
+identically, allowing the installer to achieve any desired layout.
+
+@cindex directories, creating installation
+@cindex installation directories, creating
+All installation directories, and their parent directories, should be
+created (if necessary) before they are installed into.
+
+These first two variables set the root for the installation. All the
+other installation directories should be subdirectories of one of
+these two, and nothing should be directly installed into these two
+directories.
+
+@table @code
+@item prefix
+@vindex prefix
+A prefix used in constructing the default values of the variables listed
+below. The default value of @code{prefix} should be @file{/usr/local}.
+When building the complete GNU system, the prefix will be empty and
+@file{/usr} will be a symbolic link to @file{/}.
+(If you are using Autoconf, write it as @samp{@@prefix@@}.)
+
+Running @samp{make install} with a different value of @code{prefix} from
+the one used to build the program should @emph{not} recompile the
+program.
+
+@item exec_prefix
+@vindex exec_prefix
+A prefix used in constructing the default values of some of the
+variables listed below. The default value of @code{exec_prefix} should
+be @code{$(prefix)}.
+(If you are using Autoconf, write it as @samp{@@exec_prefix@@}.)
+
+Generally, @code{$(exec_prefix)} is used for directories that contain
+machine-specific files (such as executables and subroutine libraries),
+while @code{$(prefix)} is used directly for other directories.
+
+Running @samp{make install} with a different value of @code{exec_prefix}
+from the one used to build the program should @emph{not} recompile the
+program.
+@end table
+
+Executable programs are installed in one of the following directories.
+
+@table @code
+@item bindir
+@vindex bindir
+The directory for installing executable programs that users can run.
+This should normally be @file{/usr/local/bin}, but write it as
+@file{$(exec_prefix)/bin}.
+(If you are using Autoconf, write it as @samp{@@bindir@@}.)
+
+@item sbindir
+@vindex sbindir
+The directory for installing executable programs that can be run from
+the shell, but are only generally useful to system administrators. This
+should normally be @file{/usr/local/sbin}, but write it as
+@file{$(exec_prefix)/sbin}.
+(If you are using Autoconf, write it as @samp{@@sbindir@@}.)
+
+@item libexecdir
+@vindex libexecdir
+@comment This paragraph adjusted to avoid overfull hbox --roland 5jul94
+The directory for installing executable programs to be run by other
+programs rather than by users. This directory should normally be
+@file{/usr/local/libexec}, but write it as @file{$(exec_prefix)/libexec}.
+(If you are using Autoconf, write it as @samp{@@libexecdir@@}.)
+
+The definition of @samp{libexecdir} is the same for all packages, so
+you should install your data in a subdirectory thereof. Most packages
+install their data under @file{$(libexecdir)/@var{package-name}/},
+possibly within additional subdirectories thereof, such as
+@file{$(libexecdir)/@var{package-name}/@var{machine}/@var{version}}.
+@end table
+
+Data files used by the program during its execution are divided into
+categories in two ways.
+
+@itemize @bullet
+@item
+Some files are normally modified by programs; others are never normally
+modified (though users may edit some of these).
+
+@item
+Some files are architecture-independent and can be shared by all
+machines at a site; some are architecture-dependent and can be shared
+only by machines of the same kind and operating system; others may never
+be shared between two machines.
+@end itemize
+
+This makes for six different possibilities. However, we want to
+discourage the use of architecture-dependent files, aside from object
+files and libraries. It is much cleaner to make other data files
+architecture-independent, and it is generally not hard.
+
+Here are the variables Makefiles should use to specify directories
+to put these various kinds of files in:
+
+@table @samp
+@item datarootdir
+The root of the directory tree for read-only architecture-independent
+data files. This should normally be @file{/usr/local/share}, but
+write it as @file{$(prefix)/share}. (If you are using Autoconf, write
+it as @samp{@@datarootdir@@}.) @samp{datadir}'s default value is
+based on this variable; so are @samp{infodir}, @samp{mandir}, and
+others.
+
+@item datadir
+The directory for installing idiosyncratic read-only
+architecture-independent data files for this program. This is usually
+the same place as @samp{datarootdir}, but we use the two separate
+variables so that you can move these program-specific files without
+altering the location for Info files, man pages, etc.
+
+This should normally be @file{/usr/local/share}, but write it as
+@file{$(datarootdir)}. (If you are using Autoconf, write it as
+@samp{@@datadir@@}.)
+
+The definition of @samp{datadir} is the same for all packages, so you
+should install your data in a subdirectory thereof. Most packages
+install their data under @file{$(datadir)/@var{package-name}/}.
+
+@item sysconfdir
+The directory for installing read-only data files that pertain to a
+single machine--that is to say, files for configuring a host. Mailer
+and network configuration files, @file{/etc/passwd}, and so forth belong
+here. All the files in this directory should be ordinary ASCII text
+files. This directory should normally be @file{/usr/local/etc}, but
+write it as @file{$(prefix)/etc}.
+(If you are using Autoconf, write it as @samp{@@sysconfdir@@}.)
+
+Do not install executables here in this directory (they probably belong
+in @file{$(libexecdir)} or @file{$(sbindir)}). Also do not install
+files that are modified in the normal course of their use (programs
+whose purpose is to change the configuration of the system excluded).
+Those probably belong in @file{$(localstatedir)}.
+
+@item sharedstatedir
+The directory for installing architecture-independent data files which
+the programs modify while they run. This should normally be
+@file{/usr/local/com}, but write it as @file{$(prefix)/com}.
+(If you are using Autoconf, write it as @samp{@@sharedstatedir@@}.)
+
+@item localstatedir
+The directory for installing data files which the programs modify while
+they run, and that pertain to one specific machine. Users should never
+need to modify files in this directory to configure the package's
+operation; put such configuration information in separate files that go
+in @file{$(datadir)} or @file{$(sysconfdir)}. @file{$(localstatedir)}
+should normally be @file{/usr/local/var}, but write it as
+@file{$(prefix)/var}.
+(If you are using Autoconf, write it as @samp{@@localstatedir@@}.)
+@end table
+
+These variables specify the directory for installing certain specific
+types of files, if your program has them. Every GNU package should
+have Info files, so every program needs @samp{infodir}, but not all
+need @samp{libdir} or @samp{lispdir}.
+
+@table @samp
+@item includedir
+@c rewritten to avoid overfull hbox --roland
+The directory for installing header files to be included by user
+programs with the C @samp{#include} preprocessor directive. This
+should normally be @file{/usr/local/include}, but write it as
+@file{$(prefix)/include}.
+(If you are using Autoconf, write it as @samp{@@includedir@@}.)
+
+Most compilers other than GCC do not look for header files in directory
+@file{/usr/local/include}. So installing the header files this way is
+only useful with GCC. Sometimes this is not a problem because some
+libraries are only really intended to work with GCC. But some libraries
+are intended to work with other compilers. They should install their
+header files in two places, one specified by @code{includedir} and one
+specified by @code{oldincludedir}.
+
+@item oldincludedir
+The directory for installing @samp{#include} header files for use with
+compilers other than GCC. This should normally be @file{/usr/include}.
+(If you are using Autoconf, you can write it as @samp{@@oldincludedir@@}.)
+
+The Makefile commands should check whether the value of
+@code{oldincludedir} is empty. If it is, they should not try to use
+it; they should cancel the second installation of the header files.
+
+A package should not replace an existing header in this directory unless
+the header came from the same package. Thus, if your Foo package
+provides a header file @file{foo.h}, then it should install the header
+file in the @code{oldincludedir} directory if either (1) there is no
+@file{foo.h} there or (2) the @file{foo.h} that exists came from the Foo
+package.
+
+To tell whether @file{foo.h} came from the Foo package, put a magic
+string in the file---part of a comment---and @code{grep} for that string.
+
+@item docdir
+The directory for installing documentation files (other than Info) for
+this package. By default, it should be
+@file{/usr/local/share/doc/@var{yourpkg}}, but it should be written as
+@file{$(datarootdir)/doc/@var{yourpkg}}. (If you are using Autoconf,
+write it as @samp{@@docdir@@}.) The @var{yourpkg} subdirectory, which
+may include a version number, prevents collisions among files with
+common names, such as @file{README}.
+
+@item infodir
+The directory for installing the Info files for this package. By
+default, it should be @file{/usr/local/share/info}, but it should be
+written as @file{$(datarootdir)/info}. (If you are using Autoconf,
+write it as @samp{@@infodir@@}.) @code{infodir} is separate from
+@code{docdir} for compatibility with existing practice.
+
+@item htmldir
+@itemx dvidir
+@itemx pdfdir
+@itemx psdir
+Directories for installing documentation files in the particular
+format. They should all be set to @code{$(docdir)} by default. (If
+you are using Autoconf, write them as @samp{@@htmldir@@},
+@samp{@@dvidir@@}, etc.) Packages which supply several translations
+of their documentation should install them in
+@samp{$(htmldir)/}@var{ll}, @samp{$(pdfdir)/}@var{ll}, etc. where
+@var{ll} is a locale abbreviation such as @samp{en} or @samp{pt_BR}.
+
+@item libdir
+The directory for object files and libraries of object code. Do not
+install executables here, they probably ought to go in @file{$(libexecdir)}
+instead. The value of @code{libdir} should normally be
+@file{/usr/local/lib}, but write it as @file{$(exec_prefix)/lib}.
+(If you are using Autoconf, write it as @samp{@@libdir@@}.)
+
+@item lispdir
+The directory for installing any Emacs Lisp files in this package. By
+default, it should be @file{/usr/local/share/emacs/site-lisp}, but it
+should be written as @file{$(datarootdir)/emacs/site-lisp}.
+
+If you are using Autoconf, write the default as @samp{@@lispdir@@}.
+In order to make @samp{@@lispdir@@} work, you need the following lines
+in your @file{configure.in} file:
+
+@example
+lispdir='$@{datarootdir@}/emacs/site-lisp'
+AC_SUBST(lispdir)
+@end example
+
+@item localedir
+The directory for installing locale-specific message catalogs for this
+package. By default, it should be @file{/usr/local/share/locale}, but
+it should be written as @file{$(datarootdir)/locale}. (If you are
+using Autoconf, write it as @samp{@@localedir@@}.) This directory
+usually has a subdirectory per locale.
+@end table
+
+Unix-style man pages are installed in one of the following:
+
+@table @samp
+@item mandir
+The top-level directory for installing the man pages (if any) for this
+package. It will normally be @file{/usr/local/share/man}, but you
+should write it as @file{$(datarootdir)/man}. (If you are using
+Autoconf, write it as @samp{@@mandir@@}.)
+
+@item man1dir
+The directory for installing section 1 man pages. Write it as
+@file{$(mandir)/man1}.
+@item man2dir
+The directory for installing section 2 man pages. Write it as
+@file{$(mandir)/man2}
+@item @dots{}
+
+@strong{Don't make the primary documentation for any GNU software be a
+man page. Write a manual in Texinfo instead. Man pages are just for
+the sake of people running GNU software on Unix, which is a secondary
+application only.}
+
+@item manext
+The file name extension for the installed man page. This should contain
+a period followed by the appropriate digit; it should normally be @samp{.1}.
+
+@item man1ext
+The file name extension for installed section 1 man pages.
+@item man2ext
+The file name extension for installed section 2 man pages.
+@item @dots{}
+Use these names instead of @samp{manext} if the package needs to install man
+pages in more than one section of the manual.
+@end table
+
+And finally, you should set the following variable:
+
+@table @samp
+@item srcdir
+The directory for the sources being compiled. The value of this
+variable is normally inserted by the @code{configure} shell script.
+(If you are using Autoconf, use @samp{srcdir = @@srcdir@@}.)
+@end table
+
+For example:
+
+@smallexample
+@c I have changed some of the comments here slightly to fix an overfull
+@c hbox, so the make manual can format correctly. --roland
+# Common prefix for installation directories.
+# NOTE: This directory must exist when you start the install.
+prefix = /usr/local
+datarootdir = $(prefix)/share
+datadir = $(datarootdir)
+exec_prefix = $(prefix)
+# Where to put the executable for the command `gcc'.
+bindir = $(exec_prefix)/bin
+# Where to put the directories used by the compiler.
+libexecdir = $(exec_prefix)/libexec
+# Where to put the Info files.
+infodir = $(datarootdir)/info
+@end smallexample
+
+If your program installs a large number of files into one of the
+standard user-specified directories, it might be useful to group them
+into a subdirectory particular to that program. If you do this, you
+should write the @code{install} rule to create these subdirectories.
+
+Do not expect the user to include the subdirectory name in the value of
+any of the variables listed above. The idea of having a uniform set of
+variable names for installation directories is to enable the user to
+specify the exact same values for several different GNU packages. In
+order for this to be useful, all the packages must be designed so that
+they will work sensibly when the user does so.
+
+At times, not all of these variables may be implemented in the current
+release of Autoconf and/or Automake; but as of Autoconf@tie{}2.60, we
+believe all of them are. When any are missing, the descriptions here
+serve as specifications for what Autoconf will implement. As a
+programmer, you can either use a development version of Autoconf or
+avoid using these variables until a stable release is made which
+supports them.
+
+
+@node Standard Targets
+@section Standard Targets for Users
+
+All GNU programs should have the following targets in their Makefiles:
+
+@table @samp
+@item all
+Compile the entire program. This should be the default target. This
+target need not rebuild any documentation files; Info files should
+normally be included in the distribution, and DVI (and other
+documentation format) files should be made only when explicitly asked
+for.
+
+By default, the Make rules should compile and link with @samp{-g}, so
+that executable programs have debugging symbols. Users who don't mind
+being helpless can strip the executables later if they wish.
+
+@item install
+Compile the program and copy the executables, libraries, and so on to
+the file names where they should reside for actual use. If there is a
+simple test to verify that a program is properly installed, this target
+should run that test.
+
+Do not strip executables when installing them. Devil-may-care users can
+use the @code{install-strip} target to do that.
+
+If possible, write the @code{install} target rule so that it does not
+modify anything in the directory where the program was built, provided
+@samp{make all} has just been done. This is convenient for building the
+program under one user name and installing it under another.
+
+The commands should create all the directories in which files are to be
+installed, if they don't already exist. This includes the directories
+specified as the values of the variables @code{prefix} and
+@code{exec_prefix}, as well as all subdirectories that are needed.
+One way to do this is by means of an @code{installdirs} target
+as described below.
+
+Use @samp{-} before any command for installing a man page, so that
+@code{make} will ignore any errors. This is in case there are systems
+that don't have the Unix man page documentation system installed.
+
+The way to install Info files is to copy them into @file{$(infodir)}
+with @code{$(INSTALL_DATA)} (@pxref{Command Variables}), and then run
+the @code{install-info} program if it is present. @code{install-info}
+is a program that edits the Info @file{dir} file to add or update the
+menu entry for the given Info file; it is part of the Texinfo package.
+
+Here is a sample rule to install an Info file that also tries to
+handle some additional situations, such as @code{install-info} not
+being present.
+
+@comment This example has been carefully formatted for the Make manual.
+@comment Please do not reformat it without talking to bug-make@gnu.org.
+@smallexample
+do-install-info: foo.info installdirs
+ $(NORMAL_INSTALL)
+# Prefer an info file in . to one in srcdir.
+ if test -f foo.info; then d=.; \
+ else d="$(srcdir)"; fi; \
+ $(INSTALL_DATA) $$d/foo.info \
+ "$(DESTDIR)$(infodir)/foo.info"
+# Run install-info only if it exists.
+# Use `if' instead of just prepending `-' to the
+# line so we notice real errors from install-info.
+# Use `$(SHELL) -c' because some shells do not
+# fail gracefully when there is an unknown command.
+ $(POST_INSTALL)
+ if $(SHELL) -c 'install-info --version' \
+ >/dev/null 2>&1; then \
+ install-info --dir-file="$(DESTDIR)$(infodir)/dir" \
+ "$(DESTDIR)$(infodir)/foo.info"; \
+ else true; fi
+@end smallexample
+
+When writing the @code{install} target, you must classify all the
+commands into three categories: normal ones, @dfn{pre-installation}
+commands and @dfn{post-installation} commands. @xref{Install Command
+Categories}.
+
+@item install-html
+@itemx install-dvi
+@itemx install-pdf
+@itemx install-ps
+These targets install documentation in formats other than Info;
+they're intended to be called explicitly by the person installing the
+package, if that format is desired. GNU prefers Info files, so these
+must be installed by the @code{install} target.
+
+When you have many documentation files to install, we recommend that
+you avoid collisions and clutter by arranging for these targets to
+install in subdirectories of the appropriate installation directory,
+such as @code{htmldir}. As one example, if your package has multiple
+manuals, and you wish to install HTML documentation with many files
+(such as the ``split'' mode output by @code{makeinfo --html}), you'll
+certainly want to use subdirectories, or two nodes with the same name
+in different manuals will overwrite each other.
+
+Please make these @code{install-@var{format}} targets invoke the
+commands for the @var{format} target, for example, by making
+@var{format} a dependency.
+
+@item uninstall
+Delete all the installed files---the copies that the @samp{install}
+and @samp{install-*} targets create.
+
+This rule should not modify the directories where compilation is done,
+only the directories where files are installed.
+
+The uninstallation commands are divided into three categories, just like
+the installation commands. @xref{Install Command Categories}.
+
+@item install-strip
+Like @code{install}, but strip the executable files while installing
+them. In simple cases, this target can use the @code{install} target in
+a simple way:
+
+@smallexample
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
+ install
+@end smallexample
+
+But if the package installs scripts as well as real executables, the
+@code{install-strip} target can't just refer to the @code{install}
+target; it has to strip the executables but not the scripts.
+
+@code{install-strip} should not strip the executables in the build
+directory which are being copied for installation. It should only strip
+the copies that are installed.
+
+Normally we do not recommend stripping an executable unless you are sure
+the program has no bugs. However, it can be reasonable to install a
+stripped executable for actual execution while saving the unstripped
+executable elsewhere in case there is a bug.
+
+@comment The gratuitous blank line here is to make the table look better
+@comment in the printed Make manual. Please leave it in.
+@item clean
+
+Delete all files in the current directory that are normally created by
+building the program. Also delete files in other directories if they
+are created by this makefile. However, don't delete the files that
+record the configuration. Also preserve files that could be made by
+building, but normally aren't because the distribution comes with
+them. There is no need to delete parent directories that were created
+with @samp{mkdir -p}, since they could have existed anyway.
+
+Delete @file{.dvi} files here if they are not part of the distribution.
+
+@item distclean
+Delete all files in the current directory (or created by this
+makefile) that are created by configuring or building the program. If
+you have unpacked the source and built the program without creating
+any other files, @samp{make distclean} should leave only the files
+that were in the distribution. However, there is no need to delete
+parent directories that were created with @samp{mkdir -p}, since they
+could have existed anyway.
+
+@item mostlyclean
+Like @samp{clean}, but may refrain from deleting a few files that people
+normally don't want to recompile. For example, the @samp{mostlyclean}
+target for GCC does not delete @file{libgcc.a}, because recompiling it
+is rarely necessary and takes a lot of time.
+
+@item maintainer-clean
+Delete almost everything that can be reconstructed with this Makefile.
+This typically includes everything deleted by @code{distclean}, plus
+more: C source files produced by Bison, tags tables, Info files, and
+so on.
+
+The reason we say ``almost everything'' is that running the command
+@samp{make maintainer-clean} should not delete @file{configure} even
+if @file{configure} can be remade using a rule in the Makefile. More
+generally, @samp{make maintainer-clean} should not delete anything
+that needs to exist in order to run @file{configure} and then begin to
+build the program. Also, there is no need to delete parent
+directories that were created with @samp{mkdir -p}, since they could
+have existed anyway. These are the only exceptions;
+@code{maintainer-clean} should delete everything else that can be
+rebuilt.
+
+The @samp{maintainer-clean} target is intended to be used by a maintainer of
+the package, not by ordinary users. You may need special tools to
+reconstruct some of the files that @samp{make maintainer-clean} deletes.
+Since these files are normally included in the distribution, we don't
+take care to make them easy to reconstruct. If you find you need to
+unpack the full distribution again, don't blame us.
+
+To help make users aware of this, the commands for the special
+@code{maintainer-clean} target should start with these two:
+
+@smallexample
+@@echo 'This command is intended for maintainers to use; it'
+@@echo 'deletes files that may need special tools to rebuild.'
+@end smallexample
+
+@item TAGS
+Update a tags table for this program.
+@c ADR: how?
+
+@item info
+Generate any Info files needed. The best way to write the rules is as
+follows:
+
+@smallexample
+info: foo.info
+
+foo.info: foo.texi chap1.texi chap2.texi
+ $(MAKEINFO) $(srcdir)/foo.texi
+@end smallexample
+
+@noindent
+You must define the variable @code{MAKEINFO} in the Makefile. It should
+run the @code{makeinfo} program, which is part of the Texinfo
+distribution.
+
+Normally a GNU distribution comes with Info files, and that means the
+Info files are present in the source directory. Therefore, the Make
+rule for an info file should update it in the source directory. When
+users build the package, ordinarily Make will not update the Info files
+because they will already be up to date.
+
+@item dvi
+@itemx html
+@itemx pdf
+@itemx ps
+Generate documentation files in the given format. These targets
+should always exist, but any or all can be a no-op if the given output
+format cannot be generated. These targets should not be dependencies
+of the @code{all} target; the user must manually invoke them.
+
+Here's an example rule for generating DVI files from Texinfo:
+
+@smallexample
+dvi: foo.dvi
+
+foo.dvi: foo.texi chap1.texi chap2.texi
+ $(TEXI2DVI) $(srcdir)/foo.texi
+@end smallexample
+
+@noindent
+You must define the variable @code{TEXI2DVI} in the Makefile. It should
+run the program @code{texi2dvi}, which is part of the Texinfo
+distribution.@footnote{@code{texi2dvi} uses @TeX{} to do the real work
+of formatting. @TeX{} is not distributed with Texinfo.} Alternatively,
+write just the dependencies, and allow GNU @code{make} to provide the command.
+
+Here's another example, this one for generating HTML from Texinfo:
+
+@smallexample
+html: foo.html
+
+foo.html: foo.texi chap1.texi chap2.texi
+ $(TEXI2HTML) $(srcdir)/foo.texi
+@end smallexample
+
+@noindent
+Again, you would define the variable @code{TEXI2HTML} in the Makefile;
+for example, it might run @code{makeinfo --no-split --html}
+(@command{makeinfo} is part of the Texinfo distribution).
+
+@item dist
+Create a distribution tar file for this program. The tar file should be
+set up so that the file names in the tar file start with a subdirectory
+name which is the name of the package it is a distribution for. This
+name can include the version number.
+
+For example, the distribution tar file of GCC version 1.40 unpacks into
+a subdirectory named @file{gcc-1.40}.
+
+The easiest way to do this is to create a subdirectory appropriately
+named, use @code{ln} or @code{cp} to install the proper files in it, and
+then @code{tar} that subdirectory.
+
+Compress the tar file with @code{gzip}. For example, the actual
+distribution file for GCC version 1.40 is called @file{gcc-1.40.tar.gz}.
+It is ok to support other free compression formats as well.
+
+The @code{dist} target should explicitly depend on all non-source files
+that are in the distribution, to make sure they are up to date in the
+distribution.
+@ifset CODESTD
+@xref{Releases, , Making Releases}.
+@end ifset
+@ifclear CODESTD
+@xref{Releases, , Making Releases, standards, GNU Coding Standards}.
+@end ifclear
+
+@item check
+Perform self-tests (if any). The user must build the program before
+running the tests, but need not install the program; you should write
+the self-tests so that they work when the program is built but not
+installed.
+@end table
+
+The following targets are suggested as conventional names, for programs
+in which they are useful.
+
+@table @code
+@item installcheck
+Perform installation tests (if any). The user must build and install
+the program before running the tests. You should not assume that
+@file{$(bindir)} is in the search path.
+
+@item installdirs
+It's useful to add a target named @samp{installdirs} to create the
+directories where files are installed, and their parent directories.
+There is a script called @file{mkinstalldirs} which is convenient for
+this; you can find it in the Gnulib package.
+You can use a rule like this:
+
+@comment This has been carefully formatted to look decent in the Make manual.
+@comment Please be sure not to make it extend any further to the right.--roland
+@smallexample
+# Make sure all installation directories (e.g. $(bindir))
+# actually exist by making them if necessary.
+installdirs: mkinstalldirs
+ $(srcdir)/mkinstalldirs $(bindir) $(datadir) \
+ $(libdir) $(infodir) \
+ $(mandir)
+@end smallexample
+
+@noindent
+or, if you wish to support @env{DESTDIR} (strongly encouraged),
+
+@smallexample
+# Make sure all installation directories (e.g. $(bindir))
+# actually exist by making them if necessary.
+installdirs: mkinstalldirs
+ $(srcdir)/mkinstalldirs \
+ $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \
+ $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \
+ $(DESTDIR)$(mandir)
+@end smallexample
+
+This rule should not modify the directories where compilation is done.
+It should do nothing but create installation directories.
+@end table
+
+@node Install Command Categories
+@section Install Command Categories
+
+@cindex pre-installation commands
+@cindex post-installation commands
+When writing the @code{install} target, you must classify all the
+commands into three categories: normal ones, @dfn{pre-installation}
+commands and @dfn{post-installation} commands.
+
+Normal commands move files into their proper places, and set their
+modes. They may not alter any files except the ones that come entirely
+from the package they belong to.
+
+Pre-installation and post-installation commands may alter other files;
+in particular, they can edit global configuration files or data bases.
+
+Pre-installation commands are typically executed before the normal
+commands, and post-installation commands are typically run after the
+normal commands.
+
+The most common use for a post-installation command is to run
+@code{install-info}. This cannot be done with a normal command, since
+it alters a file (the Info directory) which does not come entirely and
+solely from the package being installed. It is a post-installation
+command because it needs to be done after the normal command which
+installs the package's Info files.
+
+Most programs don't need any pre-installation commands, but we have the
+feature just in case it is needed.
+
+To classify the commands in the @code{install} rule into these three
+categories, insert @dfn{category lines} among them. A category line
+specifies the category for the commands that follow.
+
+A category line consists of a tab and a reference to a special Make
+variable, plus an optional comment at the end. There are three
+variables you can use, one for each category; the variable name
+specifies the category. Category lines are no-ops in ordinary execution
+because these three Make variables are normally undefined (and you
+@emph{should not} define them in the makefile).
+
+Here are the three possible category lines, each with a comment that
+explains what it means:
+
+@smallexample
+ $(PRE_INSTALL) # @r{Pre-install commands follow.}
+ $(POST_INSTALL) # @r{Post-install commands follow.}
+ $(NORMAL_INSTALL) # @r{Normal commands follow.}
+@end smallexample
+
+If you don't use a category line at the beginning of the @code{install}
+rule, all the commands are classified as normal until the first category
+line. If you don't use any category lines, all the commands are
+classified as normal.
+
+These are the category lines for @code{uninstall}:
+
+@smallexample
+ $(PRE_UNINSTALL) # @r{Pre-uninstall commands follow.}
+ $(POST_UNINSTALL) # @r{Post-uninstall commands follow.}
+ $(NORMAL_UNINSTALL) # @r{Normal commands follow.}
+@end smallexample
+
+Typically, a pre-uninstall command would be used for deleting entries
+from the Info directory.
+
+If the @code{install} or @code{uninstall} target has any dependencies
+which act as subroutines of installation, then you should start
+@emph{each} dependency's commands with a category line, and start the
+main target's commands with a category line also. This way, you can
+ensure that each command is placed in the right category regardless of
+which of the dependencies actually run.
+
+Pre-installation and post-installation commands should not run any
+programs except for these:
+
+@example
+[ basename bash cat chgrp chmod chown cmp cp dd diff echo
+egrep expand expr false fgrep find getopt grep gunzip gzip
+hostname install install-info kill ldconfig ln ls md5sum
+mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee
+test touch true uname xargs yes
+@end example
+
+@cindex binary packages
+The reason for distinguishing the commands in this way is for the sake
+of making binary packages. Typically a binary package contains all the
+executables and other files that need to be installed, and has its own
+method of installing them---so it does not need to run the normal
+installation commands. But installing the binary package does need to
+execute the pre-installation and post-installation commands.
+
+Programs to build binary packages work by extracting the
+pre-installation and post-installation commands. Here is one way of
+extracting the pre-installation commands (the @option{-s} option to
+@command{make} is needed to silence messages about entering
+subdirectories):
+
+@smallexample
+make -s -n install -o all \
+ PRE_INSTALL=pre-install \
+ POST_INSTALL=post-install \
+ NORMAL_INSTALL=normal-install \
+ | gawk -f pre-install.awk
+@end smallexample
+
+@noindent
+where the file @file{pre-install.awk} could contain this:
+
+@smallexample
+$0 ~ /^(normal-install|post-install)[ \t]*$/ @{on = 0@}
+on @{print $0@}
+$0 ~ /^pre-install[ \t]*$/ @{on = 1@}
+@end smallexample
diff --git a/gnulib/doc/manywarnings.texi b/gnulib/doc/manywarnings.texi
new file mode 100644
index 00000000..d3edf1fb
--- /dev/null
+++ b/gnulib/doc/manywarnings.texi
@@ -0,0 +1,48 @@
+@node manywarnings
+@section manywarnings
+
+The @code{manywarnings} module allows you to enable as many GCC warnings as
+possible for your package. The purpose is to protect against introducing new
+code that triggers warnings that weren't already triggered by the existing code
+base.
+
+An example use of the module is as follows:
+
+@smallexample
+gl_MANYWARN_ALL_GCC([warnings])
+# Set up the list of the pointless, undesired warnings.
+nw=
+nw="$nw -Wsystem-headers" # Don't let system headers trigger warnings
+nw="$nw -Wundef" # All compiler preprocessors support #if UNDEF
+nw="$nw -Wtraditional" # All compilers nowadays support ANSI C
+nw="$nw -Wconversion" # These warnings usually don't point to mistakes.
+nw="$nw -Wsign-conversion" # Likewise.
+# Enable all GCC warnings not in this list.
+gl_MANYWARN_COMPLEMENT[warnings], [$warnings], [$nw])
+for w in $warnings; do
+ gl_WARN_ADD([$w])
+done
+@end smallexample
+
+This module is meant to be used by developers who are not very experienced
+regarding the various GCC warning options. In the beginning you will set the
+list of undesired warnings (@samp{nw} in the example above) to empty, and
+compile the package with all possible warnings enabled. The GCC option
+@code{-fdiagnostics-show-option}, available in GCC 4.1 or newer, helps
+understanding which warnings originated from which option. Then you will
+go through the list of warnings. You will likely deactivate warnings that
+occur often and don't point to mistakes in the code, by adding them to the
+@samp{nw} variable, then reconfiguring and recompiling. When warnings point
+to real mistakes and bugs in the code, you will of course not disable
+them.
+
+There are also many GCC warning options which usually don't point to mistakes
+in the code; these warnings enforce a certain programming style. It is a
+project management decision whether you want your code to follow any of these
+styles. Note that some of these programming styles are conflicting. You
+cannot have them all; you have to choose among them.
+
+When a new version of GCC is released, you can add the new warning options
+that it introduces into the @code{gl_MANYWARN_ALL_GCC} macro (and submit your
+modification to the Gnulib maintainers :-)), and enjoy the benefits of the
+new warnings, while adding the undesired ones to the @samp{nw} variable.
diff --git a/gnulib/doc/pastposix-functions/bcmp.texi b/gnulib/doc/pastposix-functions/bcmp.texi
new file mode 100644
index 00000000..52ec4a64
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/bcmp.texi
@@ -0,0 +1,21 @@
+@node bcmp
+@section @code{bcmp}
+@findex bcmp
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/bcmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{memcmp}
+instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/bcopy.texi b/gnulib/doc/pastposix-functions/bcopy.texi
new file mode 100644
index 00000000..2893b482
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/bcopy.texi
@@ -0,0 +1,21 @@
+@node bcopy
+@section @code{bcopy}
+@findex bcopy
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/bcopy.html}
+
+Gnulib module: bcopy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{memcpy}
+or @code{memmove} instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/bsd_signal.texi b/gnulib/doc/pastposix-functions/bsd_signal.texi
new file mode 100644
index 00000000..48e60ea6
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/bsd_signal.texi
@@ -0,0 +1,18 @@
+@node bsd_signal
+@section @code{bsd_signal}
+@findex bsd_signal
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/bsd_signal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, IRIX 5.3, Solaris 2.5.1, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/bzero.texi b/gnulib/doc/pastposix-functions/bzero.texi
new file mode 100644
index 00000000..418c98f5
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/bzero.texi
@@ -0,0 +1,21 @@
+@node bzero
+@section @code{bzero}
+@findex bzero
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/bzero.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{memset}
+instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/ecvt.texi b/gnulib/doc/pastposix-functions/ecvt.texi
new file mode 100644
index 00000000..c6935989
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/ecvt.texi
@@ -0,0 +1,21 @@
+@node ecvt
+@section @code{ecvt}
+@findex ecvt
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/ecvt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{sprintf}
+instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/fcvt.texi b/gnulib/doc/pastposix-functions/fcvt.texi
new file mode 100644
index 00000000..eab4c0e6
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/fcvt.texi
@@ -0,0 +1,21 @@
+@node fcvt
+@section @code{fcvt}
+@findex fcvt
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/fcvt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{sprintf}
+instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/ftime.texi b/gnulib/doc/pastposix-functions/ftime.texi
new file mode 100644
index 00000000..fc702a90
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/ftime.texi
@@ -0,0 +1,22 @@
+@node ftime
+@section @code{ftime}
+@findex ftime
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/ftime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris 2.4.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{gettimeofday}
+or @code{clock_gettime} instead, and use @code{ftime} only as a fallback for
+portability to Windows platforms.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/gcvt.texi b/gnulib/doc/pastposix-functions/gcvt.texi
new file mode 100644
index 00000000..35e86fab
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/gcvt.texi
@@ -0,0 +1,21 @@
+@node gcvt
+@section @code{gcvt}
+@findex gcvt
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/gcvt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{sprintf}
+instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/getcontext.texi b/gnulib/doc/pastposix-functions/getcontext.texi
new file mode 100644
index 00000000..8502fb88
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/getcontext.texi
@@ -0,0 +1,18 @@
+@node getcontext
+@section @code{getcontext}
+@findex getcontext
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/getcontext.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/gethostbyaddr.texi b/gnulib/doc/pastposix-functions/gethostbyaddr.texi
new file mode 100644
index 00000000..2f69066e
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/gethostbyaddr.texi
@@ -0,0 +1,18 @@
+@node gethostbyaddr
+@section @code{gethostbyaddr}
+@findex gethostbyaddr
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/gethostbyaddr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/gethostbyname.texi b/gnulib/doc/pastposix-functions/gethostbyname.texi
new file mode 100644
index 00000000..be2df639
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/gethostbyname.texi
@@ -0,0 +1,18 @@
+@node gethostbyname
+@section @code{gethostbyname}
+@findex gethostbyname
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/gethostbyname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/getwd.texi b/gnulib/doc/pastposix-functions/getwd.texi
new file mode 100644
index 00000000..170a6e39
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/getwd.texi
@@ -0,0 +1,23 @@
+@node getwd
+@section @code{getwd}
+@findex getwd
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/getwd.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@item
+The size of the buffer required for this function is not a compile-time
+constant. Also, the function truncates a result that would be larger than
+the minimum buffer size. For these reasons, this function is marked as
+``legacy'' in POSIX. Better use the @code{getcwd} function instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/h_errno.texi b/gnulib/doc/pastposix-functions/h_errno.texi
new file mode 100644
index 00000000..d488a81c
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/h_errno.texi
@@ -0,0 +1,18 @@
+@node h_errno
+@section @code{h_errno}
+@findex h_errno
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/h_errno.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/index.texi b/gnulib/doc/pastposix-functions/index.texi
new file mode 100644
index 00000000..e28514a8
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/index.texi
@@ -0,0 +1,21 @@
+@node index
+@section @code{index}
+@findex index
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/index.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{strchr}
+instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/makecontext.texi b/gnulib/doc/pastposix-functions/makecontext.texi
new file mode 100644
index 00000000..aaee6fca
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/makecontext.texi
@@ -0,0 +1,18 @@
+@node makecontext
+@section @code{makecontext}
+@findex makecontext
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/makecontext.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/mktemp.texi b/gnulib/doc/pastposix-functions/mktemp.texi
new file mode 100644
index 00000000..206957ac
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/mktemp.texi
@@ -0,0 +1,19 @@
+@node mktemp
+@section @code{mktemp}
+@findex mktemp
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/mktemp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is not appropriate for creating temporary files. (It has
+security risks.) Therefore it is marked as ``legacy'' in POSIX. Better use
+@code{mkstemp} instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/pthread_attr_getstackaddr.texi b/gnulib/doc/pastposix-functions/pthread_attr_getstackaddr.texi
new file mode 100644
index 00000000..5e04bfdb
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/pthread_attr_getstackaddr.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getstackaddr
+@section @code{pthread_attr_getstackaddr}
+@findex pthread_attr_getstackaddr
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/pthread_attr_getstackaddr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/pthread_attr_setstackaddr.texi b/gnulib/doc/pastposix-functions/pthread_attr_setstackaddr.texi
new file mode 100644
index 00000000..90cfb34c
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/pthread_attr_setstackaddr.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setstackaddr
+@section @code{pthread_attr_setstackaddr}
+@findex pthread_attr_setstackaddr
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/pthread_attr_setstackaddr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/rindex.texi b/gnulib/doc/pastposix-functions/rindex.texi
new file mode 100644
index 00000000..b68d89d8
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/rindex.texi
@@ -0,0 +1,21 @@
+@node rindex
+@section @code{rindex}
+@findex rindex
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/rindex.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{strrchr}
+instead.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/scalb.texi b/gnulib/doc/pastposix-functions/scalb.texi
new file mode 100644
index 00000000..5f6dbd1e
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/scalb.texi
@@ -0,0 +1,15 @@
+@node scalb
+@section @code{scalb}
+@findex scalb
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/scalb.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/setcontext.texi b/gnulib/doc/pastposix-functions/setcontext.texi
new file mode 100644
index 00000000..bc3ac019
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/setcontext.texi
@@ -0,0 +1,22 @@
+@node setcontext
+@section @code{setcontext}
+@findex setcontext
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/setcontext.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+The effects of this call are system and compiler optimization dependent,
+since it restores the contents of register-allocated variables but not
+the contents of stack-allocated variables.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/swapcontext.texi b/gnulib/doc/pastposix-functions/swapcontext.texi
new file mode 100644
index 00000000..ba20a767
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/swapcontext.texi
@@ -0,0 +1,18 @@
+@node swapcontext
+@section @code{swapcontext}
+@findex swapcontext
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/swapcontext.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/ualarm.texi b/gnulib/doc/pastposix-functions/ualarm.texi
new file mode 100644
index 00000000..dcfbe3eb
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/ualarm.texi
@@ -0,0 +1,18 @@
+@node ualarm
+@section @code{ualarm}
+@findex ualarm
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/ualarm.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/usleep.texi b/gnulib/doc/pastposix-functions/usleep.texi
new file mode 100644
index 00000000..8ca0da9e
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/usleep.texi
@@ -0,0 +1,28 @@
+@node usleep
+@section @code{usleep}
+@findex usleep
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/usleep.html}
+
+Gnulib module: usleep
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On some systems, @code{usleep} rejects attempts to sleep longer than 1
+second, as allowed by POSIX:
+mingw.
+@item
+This function is missing on some platforms. However, the replacement
+is designed to be lightweight, and may round to the neareset second;
+use @code{select} or @code{nanosleep} if better resolution is needed:
+IRIX 5.3, Solaris 2.4, older mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+According to POSIX, the @code{usleep} function may interfere with the program's
+use of the @code{SIGALRM} signal. On Linux, it doesn't; on other platforms,
+it may.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/vfork.texi b/gnulib/doc/pastposix-functions/vfork.texi
new file mode 100644
index 00000000..66ebd08b
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/vfork.texi
@@ -0,0 +1,18 @@
+@node vfork
+@section @code{vfork}
+@findex vfork
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/vfork.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/pastposix-functions/wcswcs.texi b/gnulib/doc/pastposix-functions/wcswcs.texi
new file mode 100644
index 00000000..d34432e2
--- /dev/null
+++ b/gnulib/doc/pastposix-functions/wcswcs.texi
@@ -0,0 +1,24 @@
+@node wcswcs
+@section @code{wcswcs}
+@findex wcswcs
+
+POSIX specification: @url{http://www.opengroup.org/susv3xsh/wcswcs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, IRIX 5.3, Solaris 2.5.1, Cygwin, mingw, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@item
+This function is marked as ``legacy'' in POSIX. Better use @code{wcsstr}
+instead.
+@end itemize
diff --git a/gnulib/doc/posix-functions/FD_CLR.texi b/gnulib/doc/posix-functions/FD_CLR.texi
new file mode 100644
index 00000000..93a8a7fd
--- /dev/null
+++ b/gnulib/doc/posix-functions/FD_CLR.texi
@@ -0,0 +1,15 @@
+@node FD_CLR
+@section @code{FD_CLR}
+@findex FD_CLR
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/FD_CLR.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/FD_ISSET.texi b/gnulib/doc/posix-functions/FD_ISSET.texi
new file mode 100644
index 00000000..a3a180a9
--- /dev/null
+++ b/gnulib/doc/posix-functions/FD_ISSET.texi
@@ -0,0 +1,15 @@
+@node FD_ISSET
+@section @code{FD_ISSET}
+@findex FD_ISSET
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/FD_ISSET.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/FD_SET.texi b/gnulib/doc/posix-functions/FD_SET.texi
new file mode 100644
index 00000000..044ff1a0
--- /dev/null
+++ b/gnulib/doc/posix-functions/FD_SET.texi
@@ -0,0 +1,15 @@
+@node FD_SET
+@section @code{FD_SET}
+@findex FD_SET
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/FD_SET.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/FD_ZERO.texi b/gnulib/doc/posix-functions/FD_ZERO.texi
new file mode 100644
index 00000000..5d4e1510
--- /dev/null
+++ b/gnulib/doc/posix-functions/FD_ZERO.texi
@@ -0,0 +1,15 @@
+@node FD_ZERO
+@section @code{FD_ZERO}
+@findex FD_ZERO
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/FD_ZERO.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/_Exit_C99.texi b/gnulib/doc/posix-functions/_Exit_C99.texi
new file mode 100644
index 00000000..65576203
--- /dev/null
+++ b/gnulib/doc/posix-functions/_Exit_C99.texi
@@ -0,0 +1,21 @@
+@node _Exit
+@section @code{_Exit}
+@findex _Exit
+@c This file would ideally be called _Exit.texi, but then it would collide
+@c with _exit.texi on case-insensitive file systems (MacOS X HFS+ and Woe32
+@c file systems).
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/_Exit.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/_exit.texi b/gnulib/doc/posix-functions/_exit.texi
new file mode 100644
index 00000000..24c8f2fe
--- /dev/null
+++ b/gnulib/doc/posix-functions/_exit.texi
@@ -0,0 +1,15 @@
+@node _exit
+@section @code{_exit}
+@findex _exit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/_exit.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/_longjmp.texi b/gnulib/doc/posix-functions/_longjmp.texi
new file mode 100644
index 00000000..d8d88acc
--- /dev/null
+++ b/gnulib/doc/posix-functions/_longjmp.texi
@@ -0,0 +1,24 @@
+@node _longjmp
+@section @code{_longjmp}
+@findex _longjmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/_longjmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.5.1, mingw.
+@end itemize
+
+Note: A future revision of POSIX later than the 2008/2009 one may drop the
+functions @code{_setjmp} and @code{_longjmp}. Still, in 2008, on all
+systems which have @code{_setjmp}, it is the fastest way to save the
+registers but not the signal mask (up to 30 times faster than @code{setjmp}
+on some systems).
diff --git a/gnulib/doc/posix-functions/_setjmp.texi b/gnulib/doc/posix-functions/_setjmp.texi
new file mode 100644
index 00000000..cc29ef0e
--- /dev/null
+++ b/gnulib/doc/posix-functions/_setjmp.texi
@@ -0,0 +1,24 @@
+@node _setjmp
+@section @code{_setjmp}
+@findex _setjmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/_setjmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.5.1.
+@end itemize
+
+Note: A future revision of POSIX later than the 2008/2009 one may drop the
+functions @code{_setjmp} and @code{_longjmp}. Still, in 2008, on all
+systems which have @code{_setjmp}, it is the fastest way to save the
+registers but not the signal mask (up to 30 times faster than @code{setjmp}
+on some systems).
diff --git a/gnulib/doc/posix-functions/_tolower.texi b/gnulib/doc/posix-functions/_tolower.texi
new file mode 100644
index 00000000..7a4fcbf3
--- /dev/null
+++ b/gnulib/doc/posix-functions/_tolower.texi
@@ -0,0 +1,18 @@
+@node _tolower
+@section @code{_tolower}
+@findex _tolower
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/_tolower.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3.
+@end itemize
diff --git a/gnulib/doc/posix-functions/_toupper.texi b/gnulib/doc/posix-functions/_toupper.texi
new file mode 100644
index 00000000..91d8ed2c
--- /dev/null
+++ b/gnulib/doc/posix-functions/_toupper.texi
@@ -0,0 +1,18 @@
+@node _toupper
+@section @code{_toupper}
+@findex _toupper
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/_toupper.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3.
+@end itemize
diff --git a/gnulib/doc/posix-functions/a64l.texi b/gnulib/doc/posix-functions/a64l.texi
new file mode 100644
index 00000000..dc23939b
--- /dev/null
+++ b/gnulib/doc/posix-functions/a64l.texi
@@ -0,0 +1,20 @@
+@node a64l
+@section @code{a64l}
+@findex a64l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/a64l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, mingw, BeOS.
+@item
+This function was not correctly implemented in glibc versions before 2.2.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/abort.texi b/gnulib/doc/posix-functions/abort.texi
new file mode 100644
index 00000000..14209a00
--- /dev/null
+++ b/gnulib/doc/posix-functions/abort.texi
@@ -0,0 +1,24 @@
+@node abort
+@section @code{abort}
+@findex abort
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/abort.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some platforms mistakenly close all stdio streams prior to raising
+SIGABRT:
+Cygwin 1.5.x.
+
+@item
+Some platforms always print a message to stderr, even if a SIGABRT handler
+uses longjmp to resume execution at a safe point:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/abs.texi b/gnulib/doc/posix-functions/abs.texi
new file mode 100644
index 00000000..16f01af2
--- /dev/null
+++ b/gnulib/doc/posix-functions/abs.texi
@@ -0,0 +1,15 @@
+@node abs
+@section @code{abs}
+@findex abs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/abs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/accept.texi b/gnulib/doc/posix-functions/accept.texi
new file mode 100644
index 00000000..2debe34c
--- /dev/null
+++ b/gnulib/doc/posix-functions/accept.texi
@@ -0,0 +1,31 @@
+@node accept
+@section @code{accept}
+@findex accept
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html}
+
+Gnulib module: accept
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), the descriptors returned by
+the @code{accept} function can not be used in calls to @code{read},
+@code{write}, and @code{close}; you have to use @code{recv}, @code{send},
+@code{closesocket} in these cases instead.
+@item
+On Windows platforms (excluding Cygwin), error codes for @code{accept}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On BeOS, the descriptors returned by the @code{accept} function can not be used
+in calls to @code{read}, @code{write}, and @code{close}; you have to use
+@code{recv}, @code{send}, @code{closesocket} in these cases instead.
+@item
+Some platforms don't have a @code{socklen_t} type; in this case this function's
+third argument type is @samp{int *}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/access.texi b/gnulib/doc/posix-functions/access.texi
new file mode 100644
index 00000000..8da410d0
--- /dev/null
+++ b/gnulib/doc/posix-functions/access.texi
@@ -0,0 +1,23 @@
+@node access
+@section @code{access}
+@findex access
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/access.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function uses the effective id instead of the real id on some
+platforms:
+Cygwin 1.5.x.
+@item
+There is an inherent race between calling this function and performing
+some action based on the results; you should think twice before
+trusting this function in a set-uid or set-gid program.
+@end itemize
diff --git a/gnulib/doc/posix-functions/acos.texi b/gnulib/doc/posix-functions/acos.texi
new file mode 100644
index 00000000..e4b9f9c7
--- /dev/null
+++ b/gnulib/doc/posix-functions/acos.texi
@@ -0,0 +1,15 @@
+@node acos
+@section @code{acos}
+@findex acos
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/acos.html}
+
+Gnulib module: acos
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/acosf.texi b/gnulib/doc/posix-functions/acosf.texi
new file mode 100644
index 00000000..9069822e
--- /dev/null
+++ b/gnulib/doc/posix-functions/acosf.texi
@@ -0,0 +1,18 @@
+@node acosf
+@section @code{acosf}
+@findex acosf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/acosf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/acosh.texi b/gnulib/doc/posix-functions/acosh.texi
new file mode 100644
index 00000000..bb92aac4
--- /dev/null
+++ b/gnulib/doc/posix-functions/acosh.texi
@@ -0,0 +1,18 @@
+@node acosh
+@section @code{acosh}
+@findex acosh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/acosh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/acoshf.texi b/gnulib/doc/posix-functions/acoshf.texi
new file mode 100644
index 00000000..d8d88222
--- /dev/null
+++ b/gnulib/doc/posix-functions/acoshf.texi
@@ -0,0 +1,18 @@
+@node acoshf
+@section @code{acoshf}
+@findex acoshf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/acoshf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/acoshl.texi b/gnulib/doc/posix-functions/acoshl.texi
new file mode 100644
index 00000000..73c0c158
--- /dev/null
+++ b/gnulib/doc/posix-functions/acoshl.texi
@@ -0,0 +1,18 @@
+@node acoshl
+@section @code{acoshl}
+@findex acoshl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/acoshl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/acosl.texi b/gnulib/doc/posix-functions/acosl.texi
new file mode 100644
index 00000000..99e4f78c
--- /dev/null
+++ b/gnulib/doc/posix-functions/acosl.texi
@@ -0,0 +1,21 @@
+@node acosl
+@section @code{acosl}
+@findex acosl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/acosl.html}
+
+Gnulib module: acosl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/aio_cancel.texi b/gnulib/doc/posix-functions/aio_cancel.texi
new file mode 100644
index 00000000..a45bc140
--- /dev/null
+++ b/gnulib/doc/posix-functions/aio_cancel.texi
@@ -0,0 +1,18 @@
+@node aio_cancel
+@section @code{aio_cancel}
+@findex aio_cancel
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/aio_cancel.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, OSF/1 5.1, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/aio_error.texi b/gnulib/doc/posix-functions/aio_error.texi
new file mode 100644
index 00000000..40f866c8
--- /dev/null
+++ b/gnulib/doc/posix-functions/aio_error.texi
@@ -0,0 +1,18 @@
+@node aio_error
+@section @code{aio_error}
+@findex aio_error
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/aio_error.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, OSF/1 5.1, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/aio_fsync.texi b/gnulib/doc/posix-functions/aio_fsync.texi
new file mode 100644
index 00000000..ae8a4409
--- /dev/null
+++ b/gnulib/doc/posix-functions/aio_fsync.texi
@@ -0,0 +1,18 @@
+@node aio_fsync
+@section @code{aio_fsync}
+@findex aio_fsync
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/aio_fsync.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, OSF/1 5.1, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/aio_read.texi b/gnulib/doc/posix-functions/aio_read.texi
new file mode 100644
index 00000000..1db2dd1d
--- /dev/null
+++ b/gnulib/doc/posix-functions/aio_read.texi
@@ -0,0 +1,18 @@
+@node aio_read
+@section @code{aio_read}
+@findex aio_read
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/aio_read.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, OSF/1 5.1, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/aio_return.texi b/gnulib/doc/posix-functions/aio_return.texi
new file mode 100644
index 00000000..f6961565
--- /dev/null
+++ b/gnulib/doc/posix-functions/aio_return.texi
@@ -0,0 +1,18 @@
+@node aio_return
+@section @code{aio_return}
+@findex aio_return
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/aio_return.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, OSF/1 5.1, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/aio_suspend.texi b/gnulib/doc/posix-functions/aio_suspend.texi
new file mode 100644
index 00000000..1a9a8961
--- /dev/null
+++ b/gnulib/doc/posix-functions/aio_suspend.texi
@@ -0,0 +1,18 @@
+@node aio_suspend
+@section @code{aio_suspend}
+@findex aio_suspend
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/aio_suspend.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, OSF/1 5.1, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/aio_write.texi b/gnulib/doc/posix-functions/aio_write.texi
new file mode 100644
index 00000000..4da4eca2
--- /dev/null
+++ b/gnulib/doc/posix-functions/aio_write.texi
@@ -0,0 +1,18 @@
+@node aio_write
+@section @code{aio_write}
+@findex aio_write
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/aio_write.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, OSF/1 5.1, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/alarm.texi b/gnulib/doc/posix-functions/alarm.texi
new file mode 100644
index 00000000..b72e9618
--- /dev/null
+++ b/gnulib/doc/posix-functions/alarm.texi
@@ -0,0 +1,18 @@
+@node alarm
+@section @code{alarm}
+@findex alarm
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/alarm.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/alphasort.texi b/gnulib/doc/posix-functions/alphasort.texi
new file mode 100644
index 00000000..ba7f5cb3
--- /dev/null
+++ b/gnulib/doc/posix-functions/alphasort.texi
@@ -0,0 +1,24 @@
+@node alphasort
+@section @code{alphasort}
+@findex alphasort
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/alphasort.html}
+
+Gnulib module: alphasort
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 9, mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The parameters of this function are declared as @code{const void *} on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Interix 3.5.
+@item
+The parameters of this function are declared as @code{void *} on some platforms:
+AIX 5.1.
+@end itemize
diff --git a/gnulib/doc/posix-functions/asctime.texi b/gnulib/doc/posix-functions/asctime.texi
new file mode 100644
index 00000000..9fa63af9
--- /dev/null
+++ b/gnulib/doc/posix-functions/asctime.texi
@@ -0,0 +1,17 @@
+@node asctime
+@section @code{asctime}
+@findex asctime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/asctime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function may overflow its internal buffer if an invalid year is passed.
+@end itemize
diff --git a/gnulib/doc/posix-functions/asctime_r.texi b/gnulib/doc/posix-functions/asctime_r.texi
new file mode 100644
index 00000000..57026013
--- /dev/null
+++ b/gnulib/doc/posix-functions/asctime_r.texi
@@ -0,0 +1,21 @@
+@node asctime_r
+@section @code{asctime_r}
+@findex asctime_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/asctime_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+This function may put more than 26 bytes into the argument buffer if an
+invalid year is passed.
+@end itemize
diff --git a/gnulib/doc/posix-functions/asin.texi b/gnulib/doc/posix-functions/asin.texi
new file mode 100644
index 00000000..cca5091b
--- /dev/null
+++ b/gnulib/doc/posix-functions/asin.texi
@@ -0,0 +1,15 @@
+@node asin
+@section @code{asin}
+@findex asin
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/asin.html}
+
+Gnulib module: asin
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/asinf.texi b/gnulib/doc/posix-functions/asinf.texi
new file mode 100644
index 00000000..4f8d0043
--- /dev/null
+++ b/gnulib/doc/posix-functions/asinf.texi
@@ -0,0 +1,18 @@
+@node asinf
+@section @code{asinf}
+@findex asinf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/asinf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/asinh.texi b/gnulib/doc/posix-functions/asinh.texi
new file mode 100644
index 00000000..dafb3c3a
--- /dev/null
+++ b/gnulib/doc/posix-functions/asinh.texi
@@ -0,0 +1,18 @@
+@node asinh
+@section @code{asinh}
+@findex asinh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/asinh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/asinhf.texi b/gnulib/doc/posix-functions/asinhf.texi
new file mode 100644
index 00000000..f0db03d9
--- /dev/null
+++ b/gnulib/doc/posix-functions/asinhf.texi
@@ -0,0 +1,18 @@
+@node asinhf
+@section @code{asinhf}
+@findex asinhf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/asinhf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/asinhl.texi b/gnulib/doc/posix-functions/asinhl.texi
new file mode 100644
index 00000000..6bd448ef
--- /dev/null
+++ b/gnulib/doc/posix-functions/asinhl.texi
@@ -0,0 +1,18 @@
+@node asinhl
+@section @code{asinhl}
+@findex asinhl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/asinhl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/asinl.texi b/gnulib/doc/posix-functions/asinl.texi
new file mode 100644
index 00000000..c3044508
--- /dev/null
+++ b/gnulib/doc/posix-functions/asinl.texi
@@ -0,0 +1,21 @@
+@node asinl
+@section @code{asinl}
+@findex asinl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/asinl.html}
+
+Gnulib module: asinl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/assert.texi b/gnulib/doc/posix-functions/assert.texi
new file mode 100644
index 00000000..498b43d6
--- /dev/null
+++ b/gnulib/doc/posix-functions/assert.texi
@@ -0,0 +1,18 @@
+@node assert
+@section @code{assert}
+@findex assert
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/assert.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Extension: Gnulib offers a module @samp{assert} that allows the installer to
+disable assertions through a @samp{configure} option: @samp{--disable-assert}.
diff --git a/gnulib/doc/posix-functions/atan.texi b/gnulib/doc/posix-functions/atan.texi
new file mode 100644
index 00000000..21cfd07b
--- /dev/null
+++ b/gnulib/doc/posix-functions/atan.texi
@@ -0,0 +1,15 @@
+@node atan
+@section @code{atan}
+@findex atan
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atan.html}
+
+Gnulib module: atan
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/atan2.texi b/gnulib/doc/posix-functions/atan2.texi
new file mode 100644
index 00000000..d584801b
--- /dev/null
+++ b/gnulib/doc/posix-functions/atan2.texi
@@ -0,0 +1,15 @@
+@node atan2
+@section @code{atan2}
+@findex atan2
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atan2.html}
+
+Gnulib module: atan2
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/atan2f.texi b/gnulib/doc/posix-functions/atan2f.texi
new file mode 100644
index 00000000..b4a29aac
--- /dev/null
+++ b/gnulib/doc/posix-functions/atan2f.texi
@@ -0,0 +1,18 @@
+@node atan2f
+@section @code{atan2f}
+@findex atan2f
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atan2f.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/atan2l.texi b/gnulib/doc/posix-functions/atan2l.texi
new file mode 100644
index 00000000..823589bc
--- /dev/null
+++ b/gnulib/doc/posix-functions/atan2l.texi
@@ -0,0 +1,18 @@
+@node atan2l
+@section @code{atan2l}
+@findex atan2l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atan2l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/atanf.texi b/gnulib/doc/posix-functions/atanf.texi
new file mode 100644
index 00000000..e4de03f4
--- /dev/null
+++ b/gnulib/doc/posix-functions/atanf.texi
@@ -0,0 +1,18 @@
+@node atanf
+@section @code{atanf}
+@findex atanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/atanh.texi b/gnulib/doc/posix-functions/atanh.texi
new file mode 100644
index 00000000..bbe68d84
--- /dev/null
+++ b/gnulib/doc/posix-functions/atanh.texi
@@ -0,0 +1,18 @@
+@node atanh
+@section @code{atanh}
+@findex atanh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atanh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/atanhf.texi b/gnulib/doc/posix-functions/atanhf.texi
new file mode 100644
index 00000000..de3f4bb8
--- /dev/null
+++ b/gnulib/doc/posix-functions/atanhf.texi
@@ -0,0 +1,18 @@
+@node atanhf
+@section @code{atanhf}
+@findex atanhf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atanhf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/atanhl.texi b/gnulib/doc/posix-functions/atanhl.texi
new file mode 100644
index 00000000..ff0b3840
--- /dev/null
+++ b/gnulib/doc/posix-functions/atanhl.texi
@@ -0,0 +1,18 @@
+@node atanhl
+@section @code{atanhl}
+@findex atanhl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atanhl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/atanl.texi b/gnulib/doc/posix-functions/atanl.texi
new file mode 100644
index 00000000..971c5be6
--- /dev/null
+++ b/gnulib/doc/posix-functions/atanl.texi
@@ -0,0 +1,21 @@
+@node atanl
+@section @code{atanl}
+@findex atanl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atanl.html}
+
+Gnulib module: atanl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/atexit.texi b/gnulib/doc/posix-functions/atexit.texi
new file mode 100644
index 00000000..1b2e59a0
--- /dev/null
+++ b/gnulib/doc/posix-functions/atexit.texi
@@ -0,0 +1,17 @@
+@node atexit
+@section @code{atexit}
+@findex atexit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atexit.html}
+
+Gnulib module: atexit
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/atof.texi b/gnulib/doc/posix-functions/atof.texi
new file mode 100644
index 00000000..d34256e2
--- /dev/null
+++ b/gnulib/doc/posix-functions/atof.texi
@@ -0,0 +1,50 @@
+@node atof
+@section @code{atof}
+@findex atof
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atof.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function mis-parses strings with leading @samp{+} on some old platforms:
+Old versions of Linux.
+
+@item
+This function returns a positive value for negative underflow on some
+platforms:
+glibc 2.4, Mingw, Cygwin.
+
+@item
+This function fails to do a valid parse of @samp{-0x} on some
+platforms:
+glibc 2.4, Cygwin < 1.5.25-11.
+
+@item
+This function fails to parse Infinities and plain NaNs on some platforms:
+Solaris 8, Mingw, OpenBSD 4.0.
+
+@item
+This function fails to parse NaN() on some platforms:
+Solaris 8, Mingw, OpenBSD 4.0, Cygwin < 1.5.25-11.
+
+@item
+This function fails to parse NaN(n-char-sequence) on some platforms:
+Solaris 8, Mingw, OpenBSD 4.0.
+
+@item
+This function fails to parse C99 hexadecimal floating point on some
+platforms:
+Solaris 8, Mingw, OpenBSD 4.0.
+
+@item
+This function fails to correctly parse very long strings on some
+platforms:
+Mingw, Cygwin.
+@end itemize
diff --git a/gnulib/doc/posix-functions/atoi.texi b/gnulib/doc/posix-functions/atoi.texi
new file mode 100644
index 00000000..3a2827f1
--- /dev/null
+++ b/gnulib/doc/posix-functions/atoi.texi
@@ -0,0 +1,15 @@
+@node atoi
+@section @code{atoi}
+@findex atoi
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atoi.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/atol.texi b/gnulib/doc/posix-functions/atol.texi
new file mode 100644
index 00000000..97365b42
--- /dev/null
+++ b/gnulib/doc/posix-functions/atol.texi
@@ -0,0 +1,15 @@
+@node atol
+@section @code{atol}
+@findex atol
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atol.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/atoll.texi b/gnulib/doc/posix-functions/atoll.texi
new file mode 100644
index 00000000..af610e00
--- /dev/null
+++ b/gnulib/doc/posix-functions/atoll.texi
@@ -0,0 +1,18 @@
+@node atoll
+@section @code{atoll}
+@findex atoll
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/atoll.html}
+
+Gnulib module: atoll
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, OSF/1 5.1, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/basename.texi b/gnulib/doc/posix-functions/basename.texi
new file mode 100644
index 00000000..5c786960
--- /dev/null
+++ b/gnulib/doc/posix-functions/basename.texi
@@ -0,0 +1,24 @@
+@node basename
+@section @code{basename}
+@findex basename
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/basename.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, Solaris 2.5.1, mingw, BeOS.
+@item
+glibc has two different functions @code{basename}: the POSIX version and
+the GNU version.
+@item
+@code{basename} assumes file names in POSIX syntax; it does not work with file
+names in Windows syntax.
+@end itemize
diff --git a/gnulib/doc/posix-functions/bind.texi b/gnulib/doc/posix-functions/bind.texi
new file mode 100644
index 00000000..3c7a3838
--- /dev/null
+++ b/gnulib/doc/posix-functions/bind.texi
@@ -0,0 +1,19 @@
+@node bind
+@section @code{bind}
+@findex bind
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/bind.html}
+
+Gnulib module: bind
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for @code{bind}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/bsearch.texi b/gnulib/doc/posix-functions/bsearch.texi
new file mode 100644
index 00000000..86c52f03
--- /dev/null
+++ b/gnulib/doc/posix-functions/bsearch.texi
@@ -0,0 +1,15 @@
+@node bsearch
+@section @code{bsearch}
+@findex bsearch
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/bsearch.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/btowc.texi b/gnulib/doc/posix-functions/btowc.texi
new file mode 100644
index 00000000..b58fa848
--- /dev/null
+++ b/gnulib/doc/posix-functions/btowc.texi
@@ -0,0 +1,24 @@
+@node btowc
+@section @code{btowc}
+@findex btowc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/btowc.html}
+
+Gnulib module: btowc
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 5.3, Solaris 2.6, mingw, Interix 3.5.
+@item
+This function does not return WEOF for an EOF argument on some platforms:
+IRIX 6.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cabs.texi b/gnulib/doc/posix-functions/cabs.texi
new file mode 100644
index 00000000..b5283a63
--- /dev/null
+++ b/gnulib/doc/posix-functions/cabs.texi
@@ -0,0 +1,18 @@
+@node cabs
+@section @code{cabs}
+@findex cabs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cabs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cabsf.texi b/gnulib/doc/posix-functions/cabsf.texi
new file mode 100644
index 00000000..d6596ecc
--- /dev/null
+++ b/gnulib/doc/posix-functions/cabsf.texi
@@ -0,0 +1,18 @@
+@node cabsf
+@section @code{cabsf}
+@findex cabsf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cabsf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, Solaris 9, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cabsl.texi b/gnulib/doc/posix-functions/cabsl.texi
new file mode 100644
index 00000000..120ef3a9
--- /dev/null
+++ b/gnulib/doc/posix-functions/cabsl.texi
@@ -0,0 +1,18 @@
+@node cabsl
+@section @code{cabsl}
+@findex cabsl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cabsl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cacos.texi b/gnulib/doc/posix-functions/cacos.texi
new file mode 100644
index 00000000..17a41a52
--- /dev/null
+++ b/gnulib/doc/posix-functions/cacos.texi
@@ -0,0 +1,18 @@
+@node cacos
+@section @code{cacos}
+@findex cacos
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cacos.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cacosf.texi b/gnulib/doc/posix-functions/cacosf.texi
new file mode 100644
index 00000000..e6bfe1bb
--- /dev/null
+++ b/gnulib/doc/posix-functions/cacosf.texi
@@ -0,0 +1,18 @@
+@node cacosf
+@section @code{cacosf}
+@findex cacosf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cacosf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cacosh.texi b/gnulib/doc/posix-functions/cacosh.texi
new file mode 100644
index 00000000..509d8bbf
--- /dev/null
+++ b/gnulib/doc/posix-functions/cacosh.texi
@@ -0,0 +1,18 @@
+@node cacosh
+@section @code{cacosh}
+@findex cacosh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cacosh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cacoshf.texi b/gnulib/doc/posix-functions/cacoshf.texi
new file mode 100644
index 00000000..69a8638d
--- /dev/null
+++ b/gnulib/doc/posix-functions/cacoshf.texi
@@ -0,0 +1,18 @@
+@node cacoshf
+@section @code{cacoshf}
+@findex cacoshf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cacoshf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cacoshl.texi b/gnulib/doc/posix-functions/cacoshl.texi
new file mode 100644
index 00000000..eaf8b722
--- /dev/null
+++ b/gnulib/doc/posix-functions/cacoshl.texi
@@ -0,0 +1,18 @@
+@node cacoshl
+@section @code{cacoshl}
+@findex cacoshl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cacoshl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cacosl.texi b/gnulib/doc/posix-functions/cacosl.texi
new file mode 100644
index 00000000..16bc4910
--- /dev/null
+++ b/gnulib/doc/posix-functions/cacosl.texi
@@ -0,0 +1,18 @@
+@node cacosl
+@section @code{cacosl}
+@findex cacosl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cacosl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/calloc.texi b/gnulib/doc/posix-functions/calloc.texi
new file mode 100644
index 00000000..312936c8
--- /dev/null
+++ b/gnulib/doc/posix-functions/calloc.texi
@@ -0,0 +1,22 @@
+@node calloc
+@section @code{calloc}
+@findex calloc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/calloc.html}
+
+Gnulib module: calloc-posix
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Upon failure, the function does not set @code{errno} to @code{ENOMEM} on
+some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Extension: Gnulib provides a module @samp{calloc} that substitutes a
+@code{calloc} implementation that behaves more like the glibc implementation.
diff --git a/gnulib/doc/posix-functions/carg.texi b/gnulib/doc/posix-functions/carg.texi
new file mode 100644
index 00000000..72a367d5
--- /dev/null
+++ b/gnulib/doc/posix-functions/carg.texi
@@ -0,0 +1,18 @@
+@node carg
+@section @code{carg}
+@findex carg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/carg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cargf.texi b/gnulib/doc/posix-functions/cargf.texi
new file mode 100644
index 00000000..226a66aa
--- /dev/null
+++ b/gnulib/doc/posix-functions/cargf.texi
@@ -0,0 +1,18 @@
+@node cargf
+@section @code{cargf}
+@findex cargf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cargf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw., Interix 3.5
+@end itemize
diff --git a/gnulib/doc/posix-functions/cargl.texi b/gnulib/doc/posix-functions/cargl.texi
new file mode 100644
index 00000000..d697bd64
--- /dev/null
+++ b/gnulib/doc/posix-functions/cargl.texi
@@ -0,0 +1,18 @@
+@node cargl
+@section @code{cargl}
+@findex cargl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cargl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/casin.texi b/gnulib/doc/posix-functions/casin.texi
new file mode 100644
index 00000000..bb590df9
--- /dev/null
+++ b/gnulib/doc/posix-functions/casin.texi
@@ -0,0 +1,18 @@
+@node casin
+@section @code{casin}
+@findex casin
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/casin.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/casinf.texi b/gnulib/doc/posix-functions/casinf.texi
new file mode 100644
index 00000000..0680cae2
--- /dev/null
+++ b/gnulib/doc/posix-functions/casinf.texi
@@ -0,0 +1,18 @@
+@node casinf
+@section @code{casinf}
+@findex casinf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/casinf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/casinh.texi b/gnulib/doc/posix-functions/casinh.texi
new file mode 100644
index 00000000..f73a4eb0
--- /dev/null
+++ b/gnulib/doc/posix-functions/casinh.texi
@@ -0,0 +1,18 @@
+@node casinh
+@section @code{casinh}
+@findex casinh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/casinh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/casinhf.texi b/gnulib/doc/posix-functions/casinhf.texi
new file mode 100644
index 00000000..e8762cae
--- /dev/null
+++ b/gnulib/doc/posix-functions/casinhf.texi
@@ -0,0 +1,18 @@
+@node casinhf
+@section @code{casinhf}
+@findex casinhf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/casinhf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/casinhl.texi b/gnulib/doc/posix-functions/casinhl.texi
new file mode 100644
index 00000000..13658fb4
--- /dev/null
+++ b/gnulib/doc/posix-functions/casinhl.texi
@@ -0,0 +1,18 @@
+@node casinhl
+@section @code{casinhl}
+@findex casinhl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/casinhl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/casinl.texi b/gnulib/doc/posix-functions/casinl.texi
new file mode 100644
index 00000000..32bdfee4
--- /dev/null
+++ b/gnulib/doc/posix-functions/casinl.texi
@@ -0,0 +1,18 @@
+@node casinl
+@section @code{casinl}
+@findex casinl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/casinl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catan.texi b/gnulib/doc/posix-functions/catan.texi
new file mode 100644
index 00000000..72afac09
--- /dev/null
+++ b/gnulib/doc/posix-functions/catan.texi
@@ -0,0 +1,18 @@
+@node catan
+@section @code{catan}
+@findex catan
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catan.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catanf.texi b/gnulib/doc/posix-functions/catanf.texi
new file mode 100644
index 00000000..7a8c4e0c
--- /dev/null
+++ b/gnulib/doc/posix-functions/catanf.texi
@@ -0,0 +1,18 @@
+@node catanf
+@section @code{catanf}
+@findex catanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catanh.texi b/gnulib/doc/posix-functions/catanh.texi
new file mode 100644
index 00000000..0d38f6e9
--- /dev/null
+++ b/gnulib/doc/posix-functions/catanh.texi
@@ -0,0 +1,18 @@
+@node catanh
+@section @code{catanh}
+@findex catanh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catanh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catanhf.texi b/gnulib/doc/posix-functions/catanhf.texi
new file mode 100644
index 00000000..c2bfc493
--- /dev/null
+++ b/gnulib/doc/posix-functions/catanhf.texi
@@ -0,0 +1,18 @@
+@node catanhf
+@section @code{catanhf}
+@findex catanhf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catanhf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catanhl.texi b/gnulib/doc/posix-functions/catanhl.texi
new file mode 100644
index 00000000..8c04cf40
--- /dev/null
+++ b/gnulib/doc/posix-functions/catanhl.texi
@@ -0,0 +1,18 @@
+@node catanhl
+@section @code{catanhl}
+@findex catanhl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catanhl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catanl.texi b/gnulib/doc/posix-functions/catanl.texi
new file mode 100644
index 00000000..3e78868f
--- /dev/null
+++ b/gnulib/doc/posix-functions/catanl.texi
@@ -0,0 +1,18 @@
+@node catanl
+@section @code{catanl}
+@findex catanl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catanl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catclose.texi b/gnulib/doc/posix-functions/catclose.texi
new file mode 100644
index 00000000..ad3117d3
--- /dev/null
+++ b/gnulib/doc/posix-functions/catclose.texi
@@ -0,0 +1,18 @@
+@node catclose
+@section @code{catclose}
+@findex catclose
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catclose.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catgets.texi b/gnulib/doc/posix-functions/catgets.texi
new file mode 100644
index 00000000..15224696
--- /dev/null
+++ b/gnulib/doc/posix-functions/catgets.texi
@@ -0,0 +1,18 @@
+@node catgets
+@section @code{catgets}
+@findex catgets
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catgets.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/catopen.texi b/gnulib/doc/posix-functions/catopen.texi
new file mode 100644
index 00000000..fe140eaa
--- /dev/null
+++ b/gnulib/doc/posix-functions/catopen.texi
@@ -0,0 +1,18 @@
+@node catopen
+@section @code{catopen}
+@findex catopen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/catopen.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cbrt.texi b/gnulib/doc/posix-functions/cbrt.texi
new file mode 100644
index 00000000..2e3a6a1a
--- /dev/null
+++ b/gnulib/doc/posix-functions/cbrt.texi
@@ -0,0 +1,15 @@
+@node cbrt
+@section @code{cbrt}
+@findex cbrt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cbrt.html}
+
+Gnulib module: cbrt
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/cbrtf.texi b/gnulib/doc/posix-functions/cbrtf.texi
new file mode 100644
index 00000000..68a633f2
--- /dev/null
+++ b/gnulib/doc/posix-functions/cbrtf.texi
@@ -0,0 +1,18 @@
+@node cbrtf
+@section @code{cbrtf}
+@findex cbrtf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cbrtf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cbrtl.texi b/gnulib/doc/posix-functions/cbrtl.texi
new file mode 100644
index 00000000..64d1b4f0
--- /dev/null
+++ b/gnulib/doc/posix-functions/cbrtl.texi
@@ -0,0 +1,18 @@
+@node cbrtl
+@section @code{cbrtl}
+@findex cbrtl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cbrtl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ccos.texi b/gnulib/doc/posix-functions/ccos.texi
new file mode 100644
index 00000000..0b5fe56d
--- /dev/null
+++ b/gnulib/doc/posix-functions/ccos.texi
@@ -0,0 +1,18 @@
+@node ccos
+@section @code{ccos}
+@findex ccos
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ccos.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ccosf.texi b/gnulib/doc/posix-functions/ccosf.texi
new file mode 100644
index 00000000..314de76f
--- /dev/null
+++ b/gnulib/doc/posix-functions/ccosf.texi
@@ -0,0 +1,18 @@
+@node ccosf
+@section @code{ccosf}
+@findex ccosf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ccosf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ccosh.texi b/gnulib/doc/posix-functions/ccosh.texi
new file mode 100644
index 00000000..57ae931d
--- /dev/null
+++ b/gnulib/doc/posix-functions/ccosh.texi
@@ -0,0 +1,18 @@
+@node ccosh
+@section @code{ccosh}
+@findex ccosh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ccosh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ccoshf.texi b/gnulib/doc/posix-functions/ccoshf.texi
new file mode 100644
index 00000000..e8abdb71
--- /dev/null
+++ b/gnulib/doc/posix-functions/ccoshf.texi
@@ -0,0 +1,18 @@
+@node ccoshf
+@section @code{ccoshf}
+@findex ccoshf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ccoshf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ccoshl.texi b/gnulib/doc/posix-functions/ccoshl.texi
new file mode 100644
index 00000000..2bff3698
--- /dev/null
+++ b/gnulib/doc/posix-functions/ccoshl.texi
@@ -0,0 +1,18 @@
+@node ccoshl
+@section @code{ccoshl}
+@findex ccoshl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ccoshl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ccosl.texi b/gnulib/doc/posix-functions/ccosl.texi
new file mode 100644
index 00000000..103c2fff
--- /dev/null
+++ b/gnulib/doc/posix-functions/ccosl.texi
@@ -0,0 +1,18 @@
+@node ccosl
+@section @code{ccosl}
+@findex ccosl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ccosl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ceil.texi b/gnulib/doc/posix-functions/ceil.texi
new file mode 100644
index 00000000..57cd221f
--- /dev/null
+++ b/gnulib/doc/posix-functions/ceil.texi
@@ -0,0 +1,15 @@
+@node ceil
+@section @code{ceil}
+@findex ceil
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ceil.html}
+
+Gnulib module: ceil
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ceilf.texi b/gnulib/doc/posix-functions/ceilf.texi
new file mode 100644
index 00000000..059459e2
--- /dev/null
+++ b/gnulib/doc/posix-functions/ceilf.texi
@@ -0,0 +1,18 @@
+@node ceilf
+@section @code{ceilf}
+@findex ceilf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ceilf.html}
+
+Gnulib module: ceilf
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, Solaris 9.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ceill.texi b/gnulib/doc/posix-functions/ceill.texi
new file mode 100644
index 00000000..ec380a75
--- /dev/null
+++ b/gnulib/doc/posix-functions/ceill.texi
@@ -0,0 +1,18 @@
+@node ceill
+@section @code{ceill}
+@findex ceill
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ceill.html}
+
+Gnulib module: ceill
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/cexp.texi b/gnulib/doc/posix-functions/cexp.texi
new file mode 100644
index 00000000..e2c76189
--- /dev/null
+++ b/gnulib/doc/posix-functions/cexp.texi
@@ -0,0 +1,18 @@
+@node cexp
+@section @code{cexp}
+@findex cexp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cexp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cexpf.texi b/gnulib/doc/posix-functions/cexpf.texi
new file mode 100644
index 00000000..a4245ed7
--- /dev/null
+++ b/gnulib/doc/posix-functions/cexpf.texi
@@ -0,0 +1,18 @@
+@node cexpf
+@section @code{cexpf}
+@findex cexpf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cexpf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cexpl.texi b/gnulib/doc/posix-functions/cexpl.texi
new file mode 100644
index 00000000..52325769
--- /dev/null
+++ b/gnulib/doc/posix-functions/cexpl.texi
@@ -0,0 +1,18 @@
+@node cexpl
+@section @code{cexpl}
+@findex cexpl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cexpl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cfgetispeed.texi b/gnulib/doc/posix-functions/cfgetispeed.texi
new file mode 100644
index 00000000..2f0534dd
--- /dev/null
+++ b/gnulib/doc/posix-functions/cfgetispeed.texi
@@ -0,0 +1,18 @@
+@node cfgetispeed
+@section @code{cfgetispeed}
+@findex cfgetispeed
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cfgetispeed.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cfgetospeed.texi b/gnulib/doc/posix-functions/cfgetospeed.texi
new file mode 100644
index 00000000..9cd1fa2c
--- /dev/null
+++ b/gnulib/doc/posix-functions/cfgetospeed.texi
@@ -0,0 +1,18 @@
+@node cfgetospeed
+@section @code{cfgetospeed}
+@findex cfgetospeed
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cfgetospeed.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cfsetispeed.texi b/gnulib/doc/posix-functions/cfsetispeed.texi
new file mode 100644
index 00000000..d6964b93
--- /dev/null
+++ b/gnulib/doc/posix-functions/cfsetispeed.texi
@@ -0,0 +1,18 @@
+@node cfsetispeed
+@section @code{cfsetispeed}
+@findex cfsetispeed
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cfsetispeed.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cfsetospeed.texi b/gnulib/doc/posix-functions/cfsetospeed.texi
new file mode 100644
index 00000000..f9720846
--- /dev/null
+++ b/gnulib/doc/posix-functions/cfsetospeed.texi
@@ -0,0 +1,18 @@
+@node cfsetospeed
+@section @code{cfsetospeed}
+@findex cfsetospeed
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cfsetospeed.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/chdir.texi b/gnulib/doc/posix-functions/chdir.texi
new file mode 100644
index 00000000..4d01f9db
--- /dev/null
+++ b/gnulib/doc/posix-functions/chdir.texi
@@ -0,0 +1,15 @@
+@node chdir
+@section @code{chdir}
+@findex chdir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/chdir.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/chmod.texi b/gnulib/doc/posix-functions/chmod.texi
new file mode 100644
index 00000000..cb42490f
--- /dev/null
+++ b/gnulib/doc/posix-functions/chmod.texi
@@ -0,0 +1,15 @@
+@node chmod
+@section @code{chmod}
+@findex chmod
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/chmod.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/chown.texi b/gnulib/doc/posix-functions/chown.texi
new file mode 100644
index 00000000..88e25cd2
--- /dev/null
+++ b/gnulib/doc/posix-functions/chown.texi
@@ -0,0 +1,34 @@
+@node chown
+@section @code{chown}
+@findex chown
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/chown.html}
+
+Gnulib module: chown
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some platforms fail to detect trailing slash on non-directories, as in
+@code{chown("link-to-file/",uid,gid)}:
+FreeBSD 7.2, Solaris 9.
+@item
+Some platforms fail to update the change time when at least one
+argument was not -1, but no ownership changes resulted:
+OpenBSD 4.0.
+@item
+When passed an argument of -1, some implementations really set the owner
+user/group id of the file to this value, rather than leaving that id of the
+file alone.
+@item
+When applied to a symbolic link, some implementations don't dereference
+the symlink, i.e.@: they behave like @code{lchown}.
+@item
+This function is missing on some platforms; however, the replacement
+always fails with @code{ENOSYS}:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/cimag.texi b/gnulib/doc/posix-functions/cimag.texi
new file mode 100644
index 00000000..37b4a542
--- /dev/null
+++ b/gnulib/doc/posix-functions/cimag.texi
@@ -0,0 +1,18 @@
+@node cimag
+@section @code{cimag}
+@findex cimag
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cimag.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cimagf.texi b/gnulib/doc/posix-functions/cimagf.texi
new file mode 100644
index 00000000..28adc17a
--- /dev/null
+++ b/gnulib/doc/posix-functions/cimagf.texi
@@ -0,0 +1,18 @@
+@node cimagf
+@section @code{cimagf}
+@findex cimagf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cimagf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cimagl.texi b/gnulib/doc/posix-functions/cimagl.texi
new file mode 100644
index 00000000..03b7cbb1
--- /dev/null
+++ b/gnulib/doc/posix-functions/cimagl.texi
@@ -0,0 +1,18 @@
+@node cimagl
+@section @code{cimagl}
+@findex cimagl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cimagl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/clearerr.texi b/gnulib/doc/posix-functions/clearerr.texi
new file mode 100644
index 00000000..88c41daf
--- /dev/null
+++ b/gnulib/doc/posix-functions/clearerr.texi
@@ -0,0 +1,15 @@
+@node clearerr
+@section @code{clearerr}
+@findex clearerr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clearerr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/clock.texi b/gnulib/doc/posix-functions/clock.texi
new file mode 100644
index 00000000..9d7ecee7
--- /dev/null
+++ b/gnulib/doc/posix-functions/clock.texi
@@ -0,0 +1,15 @@
+@node clock
+@section @code{clock}
+@findex clock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/clock_getcpuclockid.texi b/gnulib/doc/posix-functions/clock_getcpuclockid.texi
new file mode 100644
index 00000000..4afa1e44
--- /dev/null
+++ b/gnulib/doc/posix-functions/clock_getcpuclockid.texi
@@ -0,0 +1,18 @@
+@node clock_getcpuclockid
+@section @code{clock_getcpuclockid}
+@findex clock_getcpuclockid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clock_getcpuclockid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/clock_getres.texi b/gnulib/doc/posix-functions/clock_getres.texi
new file mode 100644
index 00000000..0d8806f6
--- /dev/null
+++ b/gnulib/doc/posix-functions/clock_getres.texi
@@ -0,0 +1,18 @@
+@node clock_getres
+@section @code{clock_getres}
+@findex clock_getres
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/clock_gettime.texi b/gnulib/doc/posix-functions/clock_gettime.texi
new file mode 100644
index 00000000..6f2c4874
--- /dev/null
+++ b/gnulib/doc/posix-functions/clock_gettime.texi
@@ -0,0 +1,18 @@
+@node clock_gettime
+@section @code{clock_gettime}
+@findex clock_gettime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clock_gettime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/clock_nanosleep.texi b/gnulib/doc/posix-functions/clock_nanosleep.texi
new file mode 100644
index 00000000..d04dcb23
--- /dev/null
+++ b/gnulib/doc/posix-functions/clock_nanosleep.texi
@@ -0,0 +1,18 @@
+@node clock_nanosleep
+@section @code{clock_nanosleep}
+@findex clock_nanosleep
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/clock_settime.texi b/gnulib/doc/posix-functions/clock_settime.texi
new file mode 100644
index 00000000..53ce662d
--- /dev/null
+++ b/gnulib/doc/posix-functions/clock_settime.texi
@@ -0,0 +1,18 @@
+@node clock_settime
+@section @code{clock_settime}
+@findex clock_settime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clock_settime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, IRIX 5.3, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/clog.texi b/gnulib/doc/posix-functions/clog.texi
new file mode 100644
index 00000000..4c70c3cd
--- /dev/null
+++ b/gnulib/doc/posix-functions/clog.texi
@@ -0,0 +1,18 @@
+@node clog
+@section @code{clog}
+@findex clog
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clog.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/clogf.texi b/gnulib/doc/posix-functions/clogf.texi
new file mode 100644
index 00000000..c2e01625
--- /dev/null
+++ b/gnulib/doc/posix-functions/clogf.texi
@@ -0,0 +1,18 @@
+@node clogf
+@section @code{clogf}
+@findex clogf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clogf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/clogl.texi b/gnulib/doc/posix-functions/clogl.texi
new file mode 100644
index 00000000..155e27c2
--- /dev/null
+++ b/gnulib/doc/posix-functions/clogl.texi
@@ -0,0 +1,18 @@
+@node clogl
+@section @code{clogl}
+@findex clogl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/clogl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/close.texi b/gnulib/doc/posix-functions/close.texi
new file mode 100644
index 00000000..e9b44c55
--- /dev/null
+++ b/gnulib/doc/posix-functions/close.texi
@@ -0,0 +1,23 @@
+@node close
+@section @code{close}
+@findex close
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/close.html}
+
+Gnulib module: close
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), @code{socket} and @code{accept}
+do not return file descriptors that can be closed by @code{close}.
+Instead, @code{closesocket} must be used.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On BeOS, @code{socket} and @code{accept} do not return file descriptors
+that can be closed by @code{close}. Instead, @code{closesocket} must be
+used.
+@end itemize
diff --git a/gnulib/doc/posix-functions/closedir.texi b/gnulib/doc/posix-functions/closedir.texi
new file mode 100644
index 00000000..65216afa
--- /dev/null
+++ b/gnulib/doc/posix-functions/closedir.texi
@@ -0,0 +1,15 @@
+@node closedir
+@section @code{closedir}
+@findex closedir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/closedir.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/closelog.texi b/gnulib/doc/posix-functions/closelog.texi
new file mode 100644
index 00000000..56c34c9a
--- /dev/null
+++ b/gnulib/doc/posix-functions/closelog.texi
@@ -0,0 +1,18 @@
+@node closelog
+@section @code{closelog}
+@findex closelog
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/closelog.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/confstr.texi b/gnulib/doc/posix-functions/confstr.texi
new file mode 100644
index 00000000..14c33077
--- /dev/null
+++ b/gnulib/doc/posix-functions/confstr.texi
@@ -0,0 +1,18 @@
+@node confstr
+@section @code{confstr}
+@findex confstr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/confstr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Cygwin 1.5.x, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/conj.texi b/gnulib/doc/posix-functions/conj.texi
new file mode 100644
index 00000000..872d46f8
--- /dev/null
+++ b/gnulib/doc/posix-functions/conj.texi
@@ -0,0 +1,18 @@
+@node conj
+@section @code{conj}
+@findex conj
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/conj.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/conjf.texi b/gnulib/doc/posix-functions/conjf.texi
new file mode 100644
index 00000000..cdb044f4
--- /dev/null
+++ b/gnulib/doc/posix-functions/conjf.texi
@@ -0,0 +1,18 @@
+@node conjf
+@section @code{conjf}
+@findex conjf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/conjf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/conjl.texi b/gnulib/doc/posix-functions/conjl.texi
new file mode 100644
index 00000000..31b2972f
--- /dev/null
+++ b/gnulib/doc/posix-functions/conjl.texi
@@ -0,0 +1,18 @@
+@node conjl
+@section @code{conjl}
+@findex conjl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/conjl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/connect.texi b/gnulib/doc/posix-functions/connect.texi
new file mode 100644
index 00000000..bbc8b646
--- /dev/null
+++ b/gnulib/doc/posix-functions/connect.texi
@@ -0,0 +1,19 @@
+@node connect
+@section @code{connect}
+@findex connect
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html}
+
+Gnulib module: connect
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for
+@code{connect} are not placed in @code{errno}, and
+@code{WSAGetLastError} must be used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/copysign.texi b/gnulib/doc/posix-functions/copysign.texi
new file mode 100644
index 00000000..dd8ebc21
--- /dev/null
+++ b/gnulib/doc/posix-functions/copysign.texi
@@ -0,0 +1,15 @@
+@node copysign
+@section @code{copysign}
+@findex copysign
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/copysign.html}
+
+Gnulib module: copysign
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/copysignf.texi b/gnulib/doc/posix-functions/copysignf.texi
new file mode 100644
index 00000000..dfcdabf6
--- /dev/null
+++ b/gnulib/doc/posix-functions/copysignf.texi
@@ -0,0 +1,18 @@
+@node copysignf
+@section @code{copysignf}
+@findex copysignf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/copysignf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/copysignl.texi b/gnulib/doc/posix-functions/copysignl.texi
new file mode 100644
index 00000000..7966fc15
--- /dev/null
+++ b/gnulib/doc/posix-functions/copysignl.texi
@@ -0,0 +1,18 @@
+@node copysignl
+@section @code{copysignl}
+@findex copysignl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/copysignl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cos.texi b/gnulib/doc/posix-functions/cos.texi
new file mode 100644
index 00000000..f161e184
--- /dev/null
+++ b/gnulib/doc/posix-functions/cos.texi
@@ -0,0 +1,15 @@
+@node cos
+@section @code{cos}
+@findex cos
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cos.html}
+
+Gnulib module: cos
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/cosf.texi b/gnulib/doc/posix-functions/cosf.texi
new file mode 100644
index 00000000..6b540322
--- /dev/null
+++ b/gnulib/doc/posix-functions/cosf.texi
@@ -0,0 +1,18 @@
+@node cosf
+@section @code{cosf}
+@findex cosf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cosf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cosh.texi b/gnulib/doc/posix-functions/cosh.texi
new file mode 100644
index 00000000..d4653a12
--- /dev/null
+++ b/gnulib/doc/posix-functions/cosh.texi
@@ -0,0 +1,15 @@
+@node cosh
+@section @code{cosh}
+@findex cosh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cosh.html}
+
+Gnulib module: cosh
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/coshf.texi b/gnulib/doc/posix-functions/coshf.texi
new file mode 100644
index 00000000..ef57b789
--- /dev/null
+++ b/gnulib/doc/posix-functions/coshf.texi
@@ -0,0 +1,18 @@
+@node coshf
+@section @code{coshf}
+@findex coshf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/coshf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/coshl.texi b/gnulib/doc/posix-functions/coshl.texi
new file mode 100644
index 00000000..d993e1af
--- /dev/null
+++ b/gnulib/doc/posix-functions/coshl.texi
@@ -0,0 +1,18 @@
+@node coshl
+@section @code{coshl}
+@findex coshl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/coshl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cosl.texi b/gnulib/doc/posix-functions/cosl.texi
new file mode 100644
index 00000000..d46bbb3a
--- /dev/null
+++ b/gnulib/doc/posix-functions/cosl.texi
@@ -0,0 +1,21 @@
+@node cosl
+@section @code{cosl}
+@findex cosl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cosl.html}
+
+Gnulib module: cosl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/cpow.texi b/gnulib/doc/posix-functions/cpow.texi
new file mode 100644
index 00000000..d2782475
--- /dev/null
+++ b/gnulib/doc/posix-functions/cpow.texi
@@ -0,0 +1,18 @@
+@node cpow
+@section @code{cpow}
+@findex cpow
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cpow.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cpowf.texi b/gnulib/doc/posix-functions/cpowf.texi
new file mode 100644
index 00000000..59cb7348
--- /dev/null
+++ b/gnulib/doc/posix-functions/cpowf.texi
@@ -0,0 +1,18 @@
+@node cpowf
+@section @code{cpowf}
+@findex cpowf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cpowf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cpowl.texi b/gnulib/doc/posix-functions/cpowl.texi
new file mode 100644
index 00000000..048af47a
--- /dev/null
+++ b/gnulib/doc/posix-functions/cpowl.texi
@@ -0,0 +1,18 @@
+@node cpowl
+@section @code{cpowl}
+@findex cpowl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cpowl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cproj.texi b/gnulib/doc/posix-functions/cproj.texi
new file mode 100644
index 00000000..b1c220ad
--- /dev/null
+++ b/gnulib/doc/posix-functions/cproj.texi
@@ -0,0 +1,20 @@
+@node cproj
+@section @code{cproj}
+@findex cproj
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cproj.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@item
+The glibc implementation is or was broken.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cprojf.texi b/gnulib/doc/posix-functions/cprojf.texi
new file mode 100644
index 00000000..4f56f331
--- /dev/null
+++ b/gnulib/doc/posix-functions/cprojf.texi
@@ -0,0 +1,20 @@
+@node cprojf
+@section @code{cprojf}
+@findex cprojf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cprojf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@item
+The glibc implementation is or was broken.
+@end itemize
diff --git a/gnulib/doc/posix-functions/cprojl.texi b/gnulib/doc/posix-functions/cprojl.texi
new file mode 100644
index 00000000..c991f60c
--- /dev/null
+++ b/gnulib/doc/posix-functions/cprojl.texi
@@ -0,0 +1,20 @@
+@node cprojl
+@section @code{cprojl}
+@findex cprojl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/cprojl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+The glibc implementation is or was broken.
+@end itemize
diff --git a/gnulib/doc/posix-functions/creal.texi b/gnulib/doc/posix-functions/creal.texi
new file mode 100644
index 00000000..563dfece
--- /dev/null
+++ b/gnulib/doc/posix-functions/creal.texi
@@ -0,0 +1,18 @@
+@node creal
+@section @code{creal}
+@findex creal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/creal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/crealf.texi b/gnulib/doc/posix-functions/crealf.texi
new file mode 100644
index 00000000..1947de57
--- /dev/null
+++ b/gnulib/doc/posix-functions/crealf.texi
@@ -0,0 +1,18 @@
+@node crealf
+@section @code{crealf}
+@findex crealf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/crealf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/creall.texi b/gnulib/doc/posix-functions/creall.texi
new file mode 100644
index 00000000..3e21e903
--- /dev/null
+++ b/gnulib/doc/posix-functions/creall.texi
@@ -0,0 +1,18 @@
+@node creall
+@section @code{creall}
+@findex creall
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/creall.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/creat.texi b/gnulib/doc/posix-functions/creat.texi
new file mode 100644
index 00000000..634b46ec
--- /dev/null
+++ b/gnulib/doc/posix-functions/creat.texi
@@ -0,0 +1,23 @@
+@node creat
+@section @code{creat}
+@findex creat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/creat.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows, this function returns a file handle in @code{O_TEXT} mode. If you
+need a file handle in @code{O_BINARY} mode, you need to use the function
+@code{open} instead.
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{creat} may not work
+correctly to create files larger than 2 GB. The fix is to use the
+@code{AC_SYS_LARGEFILE} macro.
+@end itemize
diff --git a/gnulib/doc/posix-functions/crypt.texi b/gnulib/doc/posix-functions/crypt.texi
new file mode 100644
index 00000000..996ea952
--- /dev/null
+++ b/gnulib/doc/posix-functions/crypt.texi
@@ -0,0 +1,18 @@
+@node crypt
+@section @code{crypt}
+@findex crypt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/crypt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, Cygwin, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csin.texi b/gnulib/doc/posix-functions/csin.texi
new file mode 100644
index 00000000..a29d5c49
--- /dev/null
+++ b/gnulib/doc/posix-functions/csin.texi
@@ -0,0 +1,18 @@
+@node csin
+@section @code{csin}
+@findex csin
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csin.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csinf.texi b/gnulib/doc/posix-functions/csinf.texi
new file mode 100644
index 00000000..c4fed653
--- /dev/null
+++ b/gnulib/doc/posix-functions/csinf.texi
@@ -0,0 +1,18 @@
+@node csinf
+@section @code{csinf}
+@findex csinf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csinf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csinh.texi b/gnulib/doc/posix-functions/csinh.texi
new file mode 100644
index 00000000..ae15b664
--- /dev/null
+++ b/gnulib/doc/posix-functions/csinh.texi
@@ -0,0 +1,18 @@
+@node csinh
+@section @code{csinh}
+@findex csinh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csinh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csinhf.texi b/gnulib/doc/posix-functions/csinhf.texi
new file mode 100644
index 00000000..7c2becf4
--- /dev/null
+++ b/gnulib/doc/posix-functions/csinhf.texi
@@ -0,0 +1,18 @@
+@node csinhf
+@section @code{csinhf}
+@findex csinhf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csinhf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csinhl.texi b/gnulib/doc/posix-functions/csinhl.texi
new file mode 100644
index 00000000..cddfa3db
--- /dev/null
+++ b/gnulib/doc/posix-functions/csinhl.texi
@@ -0,0 +1,18 @@
+@node csinhl
+@section @code{csinhl}
+@findex csinhl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csinhl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csinl.texi b/gnulib/doc/posix-functions/csinl.texi
new file mode 100644
index 00000000..a2c1c141
--- /dev/null
+++ b/gnulib/doc/posix-functions/csinl.texi
@@ -0,0 +1,18 @@
+@node csinl
+@section @code{csinl}
+@findex csinl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csinl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csqrt.texi b/gnulib/doc/posix-functions/csqrt.texi
new file mode 100644
index 00000000..f804da0b
--- /dev/null
+++ b/gnulib/doc/posix-functions/csqrt.texi
@@ -0,0 +1,18 @@
+@node csqrt
+@section @code{csqrt}
+@findex csqrt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csqrt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csqrtf.texi b/gnulib/doc/posix-functions/csqrtf.texi
new file mode 100644
index 00000000..9054696e
--- /dev/null
+++ b/gnulib/doc/posix-functions/csqrtf.texi
@@ -0,0 +1,18 @@
+@node csqrtf
+@section @code{csqrtf}
+@findex csqrtf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csqrtf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/csqrtl.texi b/gnulib/doc/posix-functions/csqrtl.texi
new file mode 100644
index 00000000..84692c6c
--- /dev/null
+++ b/gnulib/doc/posix-functions/csqrtl.texi
@@ -0,0 +1,18 @@
+@node csqrtl
+@section @code{csqrtl}
+@findex csqrtl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/csqrtl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ctan.texi b/gnulib/doc/posix-functions/ctan.texi
new file mode 100644
index 00000000..7e2b0a7a
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctan.texi
@@ -0,0 +1,18 @@
+@node ctan
+@section @code{ctan}
+@findex ctan
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctan.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ctanf.texi b/gnulib/doc/posix-functions/ctanf.texi
new file mode 100644
index 00000000..e6bdc04a
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctanf.texi
@@ -0,0 +1,18 @@
+@node ctanf
+@section @code{ctanf}
+@findex ctanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ctanh.texi b/gnulib/doc/posix-functions/ctanh.texi
new file mode 100644
index 00000000..ee22bf26
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctanh.texi
@@ -0,0 +1,18 @@
+@node ctanh
+@section @code{ctanh}
+@findex ctanh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctanh.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ctanhf.texi b/gnulib/doc/posix-functions/ctanhf.texi
new file mode 100644
index 00000000..05bc6aab
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctanhf.texi
@@ -0,0 +1,18 @@
+@node ctanhf
+@section @code{ctanhf}
+@findex ctanhf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctanhf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ctanhl.texi b/gnulib/doc/posix-functions/ctanhl.texi
new file mode 100644
index 00000000..4d80f8f3
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctanhl.texi
@@ -0,0 +1,18 @@
+@node ctanhl
+@section @code{ctanhl}
+@findex ctanhl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctanhl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ctanl.texi b/gnulib/doc/posix-functions/ctanl.texi
new file mode 100644
index 00000000..0ab878e5
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctanl.texi
@@ -0,0 +1,18 @@
+@node ctanl
+@section @code{ctanl}
+@findex ctanl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctanl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ctermid.texi b/gnulib/doc/posix-functions/ctermid.texi
new file mode 100644
index 00000000..36550acc
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctermid.texi
@@ -0,0 +1,18 @@
+@node ctermid
+@section @code{ctermid}
+@findex ctermid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctermid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ctime.texi b/gnulib/doc/posix-functions/ctime.texi
new file mode 100644
index 00000000..7127674a
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctime.texi
@@ -0,0 +1,27 @@
+@node ctime
+@section @code{ctime}
+@findex ctime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function may overflow its internal buffer if an invalid year is passed.
+@item
+The @code{ctime} function need not be reentrant, and consequently is
+not required to be thread safe. Implementations of @code{ctime}
+typically write the time stamp into static buffer. If two threads
+call @code{ctime} at roughly the same time, you might end up with the
+wrong date in one of the threads, or some undefined string. There is
+a re-entrant interface @code{ctime_r}.
+@end itemize
+
+A more flexible function is @code{strftime}. However, note that it is
+locale dependent.
diff --git a/gnulib/doc/posix-functions/ctime_r.texi b/gnulib/doc/posix-functions/ctime_r.texi
new file mode 100644
index 00000000..58641f63
--- /dev/null
+++ b/gnulib/doc/posix-functions/ctime_r.texi
@@ -0,0 +1,34 @@
+@node ctime_r
+@section @code{ctime_r}
+@findex ctime_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ctime_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+This function may put more than 26 bytes into the argument buffer if an
+invalid year is passed.
+@end itemize
+
+@code{ctime_r} takes a pre-allocated buffer and length of the buffer,
+and returns @code{NULL} on errors.
+The input buffer should be at least 26 bytes in size. The output
+string is locale-independent. However, years can have more than 4
+digits if @code{time_t} is sufficiently wide, so the length of the
+required output buffer is not easy to determine. Increasing the
+buffer size when @code{ctime_r} returns @code{NULL} is not necessarily
+sufficient. The @code{NULL} return value could mean some other error
+condition, which will not go away by increasing the buffer size.
+
+A more flexible function is @code{strftime}. However, note that it is
+locale dependent.
diff --git a/gnulib/doc/posix-functions/daylight.texi b/gnulib/doc/posix-functions/daylight.texi
new file mode 100644
index 00000000..49206771
--- /dev/null
+++ b/gnulib/doc/posix-functions/daylight.texi
@@ -0,0 +1,21 @@
+@node daylight
+@section @code{daylight}
+@findex daylight
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/daylight.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1.
+@item
+The address of this variable is not a compile-time constant on some platforms:
+Cygwin, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_clearerr.texi b/gnulib/doc/posix-functions/dbm_clearerr.texi
new file mode 100644
index 00000000..f4049659
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_clearerr.texi
@@ -0,0 +1,18 @@
+@node dbm_clearerr
+@section @code{dbm_clearerr}
+@findex dbm_clearerr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_clearerr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, HP-UX 11, IRIX 5.3, OSF/1 5.1, Solaris 2.5.1, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_close.texi b/gnulib/doc/posix-functions/dbm_close.texi
new file mode 100644
index 00000000..11067536
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_close.texi
@@ -0,0 +1,18 @@
+@node dbm_close
+@section @code{dbm_close}
+@findex dbm_close
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_close.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_delete.texi b/gnulib/doc/posix-functions/dbm_delete.texi
new file mode 100644
index 00000000..b73a6b7a
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_delete.texi
@@ -0,0 +1,18 @@
+@node dbm_delete
+@section @code{dbm_delete}
+@findex dbm_delete
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_delete.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_error.texi b/gnulib/doc/posix-functions/dbm_error.texi
new file mode 100644
index 00000000..ff20b3a2
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_error.texi
@@ -0,0 +1,18 @@
+@node dbm_error
+@section @code{dbm_error}
+@findex dbm_error
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_error.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, HP-UX 11, IRIX 5.3, OSF/1 4.0, Solaris 2.5.1, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_fetch.texi b/gnulib/doc/posix-functions/dbm_fetch.texi
new file mode 100644
index 00000000..13be89c8
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_fetch.texi
@@ -0,0 +1,18 @@
+@node dbm_fetch
+@section @code{dbm_fetch}
+@findex dbm_fetch
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_fetch.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_firstkey.texi b/gnulib/doc/posix-functions/dbm_firstkey.texi
new file mode 100644
index 00000000..7a902c3f
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_firstkey.texi
@@ -0,0 +1,18 @@
+@node dbm_firstkey
+@section @code{dbm_firstkey}
+@findex dbm_firstkey
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_firstkey.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_nextkey.texi b/gnulib/doc/posix-functions/dbm_nextkey.texi
new file mode 100644
index 00000000..0b45a5d3
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_nextkey.texi
@@ -0,0 +1,18 @@
+@node dbm_nextkey
+@section @code{dbm_nextkey}
+@findex dbm_nextkey
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_nextkey.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_open.texi b/gnulib/doc/posix-functions/dbm_open.texi
new file mode 100644
index 00000000..9f1cdcf6
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_open.texi
@@ -0,0 +1,18 @@
+@node dbm_open
+@section @code{dbm_open}
+@findex dbm_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_open.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dbm_store.texi b/gnulib/doc/posix-functions/dbm_store.texi
new file mode 100644
index 00000000..f496f8f1
--- /dev/null
+++ b/gnulib/doc/posix-functions/dbm_store.texi
@@ -0,0 +1,18 @@
+@node dbm_store
+@section @code{dbm_store}
+@findex dbm_store
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dbm_store.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/difftime.texi b/gnulib/doc/posix-functions/difftime.texi
new file mode 100644
index 00000000..e0995eef
--- /dev/null
+++ b/gnulib/doc/posix-functions/difftime.texi
@@ -0,0 +1,15 @@
+@node difftime
+@section @code{difftime}
+@findex difftime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/difftime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/dirfd.texi b/gnulib/doc/posix-functions/dirfd.texi
new file mode 100644
index 00000000..d79c2dbb
--- /dev/null
+++ b/gnulib/doc/posix-functions/dirfd.texi
@@ -0,0 +1,25 @@
+@node dirfd
+@section @code{dirfd}
+@findex dirfd
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dirfd.html}
+
+Gnulib module: dirfd
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, OSF/1 5.1, Solaris 10, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function always fails on some platforms:
+mingw.
+@end itemize
+
+With the @code{dirfd} module, this functions always sets @code{errno} when it
+fails. (POSIX does not require that @code{dirfd} sets @code{errno} when it
+fails.)
diff --git a/gnulib/doc/posix-functions/dirname.texi b/gnulib/doc/posix-functions/dirname.texi
new file mode 100644
index 00000000..9829d8c1
--- /dev/null
+++ b/gnulib/doc/posix-functions/dirname.texi
@@ -0,0 +1,24 @@
+@node dirname
+@section @code{dirname}
+@findex dirname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dirname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 6.5, Solaris 2.5.1, mingw, BeOS.
+@item
+@code{dirname} assumes file names in POSIX syntax; it does not work with file
+names in Windows syntax.
+@end itemize
+
+The Gnulib module @code{dirname} provides similar API that also works with
+Windows file names.
diff --git a/gnulib/doc/posix-functions/div.texi b/gnulib/doc/posix-functions/div.texi
new file mode 100644
index 00000000..4679278a
--- /dev/null
+++ b/gnulib/doc/posix-functions/div.texi
@@ -0,0 +1,15 @@
+@node div
+@section @code{div}
+@findex div
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/div.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/dlclose.texi b/gnulib/doc/posix-functions/dlclose.texi
new file mode 100644
index 00000000..84bd93b3
--- /dev/null
+++ b/gnulib/doc/posix-functions/dlclose.texi
@@ -0,0 +1,18 @@
+@node dlclose
+@section @code{dlclose}
+@findex dlclose
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dlclose.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dlerror.texi b/gnulib/doc/posix-functions/dlerror.texi
new file mode 100644
index 00000000..5a506608
--- /dev/null
+++ b/gnulib/doc/posix-functions/dlerror.texi
@@ -0,0 +1,18 @@
+@node dlerror
+@section @code{dlerror}
+@findex dlerror
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dlerror.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dlopen.texi b/gnulib/doc/posix-functions/dlopen.texi
new file mode 100644
index 00000000..573fc47d
--- /dev/null
+++ b/gnulib/doc/posix-functions/dlopen.texi
@@ -0,0 +1,21 @@
+@node dlopen
+@section @code{dlopen}
+@findex dlopen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dlopen.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@item
+If the file name argument is not absolute, the file is searched for. The
+search algorithm is system specific.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dlsym.texi b/gnulib/doc/posix-functions/dlsym.texi
new file mode 100644
index 00000000..a5db07c5
--- /dev/null
+++ b/gnulib/doc/posix-functions/dlsym.texi
@@ -0,0 +1,21 @@
+@node dlsym
+@section @code{dlsym}
+@findex dlsym
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dlsym.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@item
+The visibility of symbols loaded in dependent shared libraries or present
+in the main executable is system dependent.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dprintf.texi b/gnulib/doc/posix-functions/dprintf.texi
new file mode 100644
index 00000000..a0f30770
--- /dev/null
+++ b/gnulib/doc/posix-functions/dprintf.texi
@@ -0,0 +1,27 @@
+@node dprintf
+@section @code{dprintf}
+@findex dprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dprintf.html}
+
+Gnulib module: dprintf or dprintf-posix
+
+Portability problems fixed by either Gnulib module @code{dprintf} or @code{dprintf-posix}:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{dprintf-posix}:
+@itemize
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/drand48.texi b/gnulib/doc/posix-functions/drand48.texi
new file mode 100644
index 00000000..02cbcb68
--- /dev/null
+++ b/gnulib/doc/posix-functions/drand48.texi
@@ -0,0 +1,18 @@
+@node drand48
+@section @code{drand48}
+@findex drand48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/drand48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/dup.texi b/gnulib/doc/posix-functions/dup.texi
new file mode 100644
index 00000000..d8fd95b6
--- /dev/null
+++ b/gnulib/doc/posix-functions/dup.texi
@@ -0,0 +1,15 @@
+@node dup
+@section @code{dup}
+@findex dup
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dup.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/dup2.texi b/gnulib/doc/posix-functions/dup2.texi
new file mode 100644
index 00000000..febbd53c
--- /dev/null
+++ b/gnulib/doc/posix-functions/dup2.texi
@@ -0,0 +1,39 @@
+@node dup2
+@section @code{dup2}
+@findex dup2
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/dup2.html}
+
+Gnulib module: dup2
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function always returns 0 for success on some platforms:
+mingw.
+
+@item
+This function can hang when duplicating an fd to itself on some platforms:
+mingw.
+
+@item
+This function returns 0 for @code{dup2 (1, 1)} on some platforms:
+Cygwin 1.5.x.
+
+@item
+This function may return @code{-EBADF} instead of @code{-1} on some platforms:
+Linux releases between July 2008 and May 2009 (versions 2.6.27 to 2.6.29).
+
+@item
+This function returns @code{EMFILE} instead of @code{EBADF} for
+extremely large targets, which interferes with using
+@code{dup2(fd,fd)==fd)} as the minimal @code{EBADF} filter:
+FreeBSD 6.1, Cygwin 1.5.
+
+@item
+This function is missing on some older platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/duplocale.texi b/gnulib/doc/posix-functions/duplocale.texi
new file mode 100644
index 00000000..65f05555
--- /dev/null
+++ b/gnulib/doc/posix-functions/duplocale.texi
@@ -0,0 +1,21 @@
+@node duplocale
+@section @code{duplocale}
+@findex duplocale
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/duplocale.html}
+
+Gnulib module: duplocale
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The argument @code{LC_GLOBAL_LOCALE} is not supported on some platforms:
+glibc 2.11.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/encrypt.texi b/gnulib/doc/posix-functions/encrypt.texi
new file mode 100644
index 00000000..dc1d7e41
--- /dev/null
+++ b/gnulib/doc/posix-functions/encrypt.texi
@@ -0,0 +1,18 @@
+@node encrypt
+@section @code{encrypt}
+@findex encrypt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/encrypt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/endgrent.texi b/gnulib/doc/posix-functions/endgrent.texi
new file mode 100644
index 00000000..2e9b3d46
--- /dev/null
+++ b/gnulib/doc/posix-functions/endgrent.texi
@@ -0,0 +1,18 @@
+@node endgrent
+@section @code{endgrent}
+@findex endgrent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/endgrent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/endhostent.texi b/gnulib/doc/posix-functions/endhostent.texi
new file mode 100644
index 00000000..7e0d3675
--- /dev/null
+++ b/gnulib/doc/posix-functions/endhostent.texi
@@ -0,0 +1,18 @@
+@node endhostent
+@section @code{endhostent}
+@findex endhostent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/endhostent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/endnetent.texi b/gnulib/doc/posix-functions/endnetent.texi
new file mode 100644
index 00000000..a14ad57a
--- /dev/null
+++ b/gnulib/doc/posix-functions/endnetent.texi
@@ -0,0 +1,18 @@
+@node endnetent
+@section @code{endnetent}
+@findex endnetent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/endnetent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/endprotoent.texi b/gnulib/doc/posix-functions/endprotoent.texi
new file mode 100644
index 00000000..b89a1888
--- /dev/null
+++ b/gnulib/doc/posix-functions/endprotoent.texi
@@ -0,0 +1,18 @@
+@node endprotoent
+@section @code{endprotoent}
+@findex endprotoent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/endprotoent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/endpwent.texi b/gnulib/doc/posix-functions/endpwent.texi
new file mode 100644
index 00000000..442ef5fd
--- /dev/null
+++ b/gnulib/doc/posix-functions/endpwent.texi
@@ -0,0 +1,18 @@
+@node endpwent
+@section @code{endpwent}
+@findex endpwent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/endpwent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/endservent.texi b/gnulib/doc/posix-functions/endservent.texi
new file mode 100644
index 00000000..970a9e62
--- /dev/null
+++ b/gnulib/doc/posix-functions/endservent.texi
@@ -0,0 +1,18 @@
+@node endservent
+@section @code{endservent}
+@findex endservent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/endservent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/endutxent.texi b/gnulib/doc/posix-functions/endutxent.texi
new file mode 100644
index 00000000..28b9d0b1
--- /dev/null
+++ b/gnulib/doc/posix-functions/endutxent.texi
@@ -0,0 +1,18 @@
+@node endutxent
+@section @code{endutxent}
+@findex endutxent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/endutxent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/environ.texi b/gnulib/doc/posix-functions/environ.texi
new file mode 100644
index 00000000..aebe8ebe
--- /dev/null
+++ b/gnulib/doc/posix-functions/environ.texi
@@ -0,0 +1,34 @@
+@node environ
+@section @code{environ}
+@findex environ
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/environ.html}
+
+Gnulib module: environ
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+POSIX does not require this variable to be declared, and it is indeed not
+declared on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Solaris 10.
+@item
+On MacOS X 10, this variable is not declared. Up to MacOS X 10.4, one can use
+@smallexample
+extern char **environ;
+@end smallexample
+to get the variable declared. This does not work any more, however, in
+shared libraries on MacOS X 10.5. Here is a workaround: Instead, one can use
+@smallexample
+#include <crt_externs.h>
+#define environ (*_NSGetEnviron())
+@end smallexample
+This works at all versions of MacOS X.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The address of this variable is not a compile-time constant on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/erand48.texi b/gnulib/doc/posix-functions/erand48.texi
new file mode 100644
index 00000000..c34911c1
--- /dev/null
+++ b/gnulib/doc/posix-functions/erand48.texi
@@ -0,0 +1,18 @@
+@node erand48
+@section @code{erand48}
+@findex erand48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/erand48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/erf.texi b/gnulib/doc/posix-functions/erf.texi
new file mode 100644
index 00000000..861ee64a
--- /dev/null
+++ b/gnulib/doc/posix-functions/erf.texi
@@ -0,0 +1,15 @@
+@node erf
+@section @code{erf}
+@findex erf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/erf.html}
+
+Gnulib module: erf
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/erfc.texi b/gnulib/doc/posix-functions/erfc.texi
new file mode 100644
index 00000000..7076cb87
--- /dev/null
+++ b/gnulib/doc/posix-functions/erfc.texi
@@ -0,0 +1,15 @@
+@node erfc
+@section @code{erfc}
+@findex erfc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/erfc.html}
+
+Gnulib module: erfc
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/erfcf.texi b/gnulib/doc/posix-functions/erfcf.texi
new file mode 100644
index 00000000..606360ed
--- /dev/null
+++ b/gnulib/doc/posix-functions/erfcf.texi
@@ -0,0 +1,18 @@
+@node erfcf
+@section @code{erfcf}
+@findex erfcf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/erfcf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/erfcl.texi b/gnulib/doc/posix-functions/erfcl.texi
new file mode 100644
index 00000000..6b4918de
--- /dev/null
+++ b/gnulib/doc/posix-functions/erfcl.texi
@@ -0,0 +1,18 @@
+@node erfcl
+@section @code{erfcl}
+@findex erfcl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/erfcl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/erff.texi b/gnulib/doc/posix-functions/erff.texi
new file mode 100644
index 00000000..38491e69
--- /dev/null
+++ b/gnulib/doc/posix-functions/erff.texi
@@ -0,0 +1,18 @@
+@node erff
+@section @code{erff}
+@findex erff
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/erff.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/erfl.texi b/gnulib/doc/posix-functions/erfl.texi
new file mode 100644
index 00000000..dfb1e67e
--- /dev/null
+++ b/gnulib/doc/posix-functions/erfl.texi
@@ -0,0 +1,18 @@
+@node erfl
+@section @code{erfl}
+@findex erfl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/erfl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/errno.texi b/gnulib/doc/posix-functions/errno.texi
new file mode 100644
index 00000000..db104610
--- /dev/null
+++ b/gnulib/doc/posix-functions/errno.texi
@@ -0,0 +1,18 @@
+@node errno
+@section @code{errno}
+@findex errno
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/errno.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows, the socket functions don't set @code{errno}; their error code is
+available through @code{WSAGetLastError()} instead.
+@end itemize
diff --git a/gnulib/doc/posix-functions/execl.texi b/gnulib/doc/posix-functions/execl.texi
new file mode 100644
index 00000000..05b6244c
--- /dev/null
+++ b/gnulib/doc/posix-functions/execl.texi
@@ -0,0 +1,18 @@
+@node execl
+@section @code{execl}
+@findex execl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/execl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some platforms, a script without executable permission is still run:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/execle.texi b/gnulib/doc/posix-functions/execle.texi
new file mode 100644
index 00000000..a7d5cf90
--- /dev/null
+++ b/gnulib/doc/posix-functions/execle.texi
@@ -0,0 +1,18 @@
+@node execle
+@section @code{execle}
+@findex execle
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/execle.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some platforms, a script without executable permission is still run:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/execlp.texi b/gnulib/doc/posix-functions/execlp.texi
new file mode 100644
index 00000000..b14b7bb8
--- /dev/null
+++ b/gnulib/doc/posix-functions/execlp.texi
@@ -0,0 +1,18 @@
+@node execlp
+@section @code{execlp}
+@findex execlp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/execlp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some platforms, a script without executable permission is still run:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/execv.texi b/gnulib/doc/posix-functions/execv.texi
new file mode 100644
index 00000000..c45583f1
--- /dev/null
+++ b/gnulib/doc/posix-functions/execv.texi
@@ -0,0 +1,18 @@
+@node execv
+@section @code{execv}
+@findex execv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/execv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some platforms, a script without executable permission is still run:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/execve.texi b/gnulib/doc/posix-functions/execve.texi
new file mode 100644
index 00000000..a78f656b
--- /dev/null
+++ b/gnulib/doc/posix-functions/execve.texi
@@ -0,0 +1,18 @@
+@node execve
+@section @code{execve}
+@findex execve
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/execve.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some platforms, a script without executable permission is still run:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/execvp.texi b/gnulib/doc/posix-functions/execvp.texi
new file mode 100644
index 00000000..bbac6b99
--- /dev/null
+++ b/gnulib/doc/posix-functions/execvp.texi
@@ -0,0 +1,18 @@
+@node execvp
+@section @code{execvp}
+@findex execvp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/execvp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some platforms, a script without executable permission is still run:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/exit.texi b/gnulib/doc/posix-functions/exit.texi
new file mode 100644
index 00000000..74d13aef
--- /dev/null
+++ b/gnulib/doc/posix-functions/exit.texi
@@ -0,0 +1,18 @@
+@node exit
+@section @code{exit}
+@findex exit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/exit.html}
+
+Gnulib module: exit
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some problems with the macros @code{EXIT_SUCCESS} and @code{EXIT_FAILURE},
+see @ref{stdlib.h}.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/exp.texi b/gnulib/doc/posix-functions/exp.texi
new file mode 100644
index 00000000..4eed5013
--- /dev/null
+++ b/gnulib/doc/posix-functions/exp.texi
@@ -0,0 +1,15 @@
+@node exp
+@section @code{exp}
+@findex exp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/exp.html}
+
+Gnulib module: exp
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/exp2.texi b/gnulib/doc/posix-functions/exp2.texi
new file mode 100644
index 00000000..1552b537
--- /dev/null
+++ b/gnulib/doc/posix-functions/exp2.texi
@@ -0,0 +1,18 @@
+@node exp2
+@section @code{exp2}
+@findex exp2
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/exp2.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/exp2f.texi b/gnulib/doc/posix-functions/exp2f.texi
new file mode 100644
index 00000000..5f857c33
--- /dev/null
+++ b/gnulib/doc/posix-functions/exp2f.texi
@@ -0,0 +1,18 @@
+@node exp2f
+@section @code{exp2f}
+@findex exp2f
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/exp2f.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/exp2l.texi b/gnulib/doc/posix-functions/exp2l.texi
new file mode 100644
index 00000000..13b17b9e
--- /dev/null
+++ b/gnulib/doc/posix-functions/exp2l.texi
@@ -0,0 +1,18 @@
+@node exp2l
+@section @code{exp2l}
+@findex exp2l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/exp2l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/expf.texi b/gnulib/doc/posix-functions/expf.texi
new file mode 100644
index 00000000..04969917
--- /dev/null
+++ b/gnulib/doc/posix-functions/expf.texi
@@ -0,0 +1,18 @@
+@node expf
+@section @code{expf}
+@findex expf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/expf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/expl.texi b/gnulib/doc/posix-functions/expl.texi
new file mode 100644
index 00000000..23b7bbf9
--- /dev/null
+++ b/gnulib/doc/posix-functions/expl.texi
@@ -0,0 +1,21 @@
+@node expl
+@section @code{expl}
+@findex expl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/expl.html}
+
+Gnulib module: expl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/expm1.texi b/gnulib/doc/posix-functions/expm1.texi
new file mode 100644
index 00000000..647a8df8
--- /dev/null
+++ b/gnulib/doc/posix-functions/expm1.texi
@@ -0,0 +1,18 @@
+@node expm1
+@section @code{expm1}
+@findex expm1
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/expm1.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/expm1f.texi b/gnulib/doc/posix-functions/expm1f.texi
new file mode 100644
index 00000000..1d7076ae
--- /dev/null
+++ b/gnulib/doc/posix-functions/expm1f.texi
@@ -0,0 +1,18 @@
+@node expm1f
+@section @code{expm1f}
+@findex expm1f
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/expm1f.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, Solaris 9, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/expm1l.texi b/gnulib/doc/posix-functions/expm1l.texi
new file mode 100644
index 00000000..f1d4fd31
--- /dev/null
+++ b/gnulib/doc/posix-functions/expm1l.texi
@@ -0,0 +1,18 @@
+@node expm1l
+@section @code{expm1l}
+@findex expm1l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/expm1l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fabs.texi b/gnulib/doc/posix-functions/fabs.texi
new file mode 100644
index 00000000..77ea5617
--- /dev/null
+++ b/gnulib/doc/posix-functions/fabs.texi
@@ -0,0 +1,15 @@
+@node fabs
+@section @code{fabs}
+@findex fabs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fabs.html}
+
+Gnulib module: fabs
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fabsf.texi b/gnulib/doc/posix-functions/fabsf.texi
new file mode 100644
index 00000000..780b47cc
--- /dev/null
+++ b/gnulib/doc/posix-functions/fabsf.texi
@@ -0,0 +1,18 @@
+@node fabsf
+@section @code{fabsf}
+@findex fabsf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fabsf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fabsl.texi b/gnulib/doc/posix-functions/fabsl.texi
new file mode 100644
index 00000000..d7c0288b
--- /dev/null
+++ b/gnulib/doc/posix-functions/fabsl.texi
@@ -0,0 +1,18 @@
+@node fabsl
+@section @code{fabsl}
+@findex fabsl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fabsl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/faccessat.texi b/gnulib/doc/posix-functions/faccessat.texi
new file mode 100644
index 00000000..f1d7be09
--- /dev/null
+++ b/gnulib/doc/posix-functions/faccessat.texi
@@ -0,0 +1,26 @@
+@node faccessat
+@section @code{faccessat}
+@findex faccessat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/faccessat.html}
+
+Gnulib module: faccessat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw,
+Interix 3.5, BeOS.
+However, the replacement does not always take into account ACLs. Also,
+it is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+There is an inherent race between calling this function and performing
+some action based on the results; you should think twice before
+trusting this function in a set-uid or set-gid program.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fattach.texi b/gnulib/doc/posix-functions/fattach.texi
new file mode 100644
index 00000000..4f7171f6
--- /dev/null
+++ b/gnulib/doc/posix-functions/fattach.texi
@@ -0,0 +1,18 @@
+@node fattach
+@section @code{fattach}
+@findex fattach
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fattach.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fchdir.texi b/gnulib/doc/posix-functions/fchdir.texi
new file mode 100644
index 00000000..06e99d81
--- /dev/null
+++ b/gnulib/doc/posix-functions/fchdir.texi
@@ -0,0 +1,19 @@
+@node fchdir
+@section @code{fchdir}
+@findex fchdir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fchdir.html}
+
+Gnulib module: fchdir
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Tandem/NSK, mingw, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fchmod.texi b/gnulib/doc/posix-functions/fchmod.texi
new file mode 100644
index 00000000..f0bbf55c
--- /dev/null
+++ b/gnulib/doc/posix-functions/fchmod.texi
@@ -0,0 +1,18 @@
+@node fchmod
+@section @code{fchmod}
+@findex fchmod
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fchmod.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fchmodat.texi b/gnulib/doc/posix-functions/fchmodat.texi
new file mode 100644
index 00000000..3808f935
--- /dev/null
+++ b/gnulib/doc/posix-functions/fchmodat.texi
@@ -0,0 +1,27 @@
+@node fchmodat
+@section @code{fchmodat}
+@findex fchmodat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fchmodat.html}
+
+Gnulib module: openat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some platforms do not allow changing the access bits on symbolic
+links. POSIX states that @code{fchmodat(@dots{},AT_SYMLINK_NOFOLLOW)}
+may fail with @code{EOPNOTSUPP} when called on a symlink, but some
+platforms, as well as the gnulib replacement, fail for any use of
+AT_SYMLINK_NOFOLLOW even if the target was not a symlink:
+glibc, Cygwin.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fchown.texi b/gnulib/doc/posix-functions/fchown.texi
new file mode 100644
index 00000000..ec38b595
--- /dev/null
+++ b/gnulib/doc/posix-functions/fchown.texi
@@ -0,0 +1,18 @@
+@node fchown
+@section @code{fchown}
+@findex fchown
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fchown.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fchownat.texi b/gnulib/doc/posix-functions/fchownat.texi
new file mode 100644
index 00000000..6285750a
--- /dev/null
+++ b/gnulib/doc/posix-functions/fchownat.texi
@@ -0,0 +1,31 @@
+@node fchownat
+@section @code{fchownat}
+@findex fchownat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fchownat.html}
+
+Gnulib module: openat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some platforms fail to detect trailing slash on non-directories, as in
+@code{fchown(dir,"link-to-file/",uid,gid,flag)}:
+Solaris 9.
+@item
+Some platforms mistakenly dereference symlinks when using
+@code{AT_SYMLINK_NOFOLLOW}:
+Linux kernel 2.6.17.
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and
+is not multithread-safe. Also, the replacement may fail to change
+symlinks if @code{lchown} is unsupported, or fail altogether if
+@code{chown} is unsupported.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fclose.texi b/gnulib/doc/posix-functions/fclose.texi
new file mode 100644
index 00000000..dfd6adc0
--- /dev/null
+++ b/gnulib/doc/posix-functions/fclose.texi
@@ -0,0 +1,22 @@
+@node fclose
+@section @code{fclose}
+@findex fclose
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fclose.html}
+
+Gnulib module: fclose
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), @code{socket} and @code{accept}
+followed by @code{fdopen} do not return streams that can be closed by
+@code{fclose}.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fcntl.texi b/gnulib/doc/posix-functions/fcntl.texi
new file mode 100644
index 00000000..2a41ad1d
--- /dev/null
+++ b/gnulib/doc/posix-functions/fcntl.texi
@@ -0,0 +1,36 @@
+@node fcntl
+@section @code{fcntl}
+@findex fcntl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fcntl.html}
+
+Gnulib module: fcntl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function does not support @code{F_DUPFD_CLOEXEC} on some
+platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.7.1, mingw, Interix 3.5,
+BeOS.
+Note that the gnulib replacement code is functional but not atomic.
+
+@item
+The @code{F_DUPFD} action of this function does not reject
+out-of-range targets properly on some platforms:
+Cygwin 1.5.x.
+
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The replacement function does not support @code{F_SETFD},
+@code{F_GETFL}, @code{F_SETFL}, @code{F_GETOWN}, @code{F_SETOWN},
+@code{F_GETLK}, @code{F_SETLK}, and @code{F_SETLKW} on some platforms:
+mingw
+@end itemize
diff --git a/gnulib/doc/posix-functions/fdatasync.texi b/gnulib/doc/posix-functions/fdatasync.texi
new file mode 100644
index 00000000..dae34a9f
--- /dev/null
+++ b/gnulib/doc/posix-functions/fdatasync.texi
@@ -0,0 +1,18 @@
+@node fdatasync
+@section @code{fdatasync}
+@findex fdatasync
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fdetach.texi b/gnulib/doc/posix-functions/fdetach.texi
new file mode 100644
index 00000000..8e5529e5
--- /dev/null
+++ b/gnulib/doc/posix-functions/fdetach.texi
@@ -0,0 +1,18 @@
+@node fdetach
+@section @code{fdetach}
+@findex fdetach
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fdetach.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fdim.texi b/gnulib/doc/posix-functions/fdim.texi
new file mode 100644
index 00000000..5fd98580
--- /dev/null
+++ b/gnulib/doc/posix-functions/fdim.texi
@@ -0,0 +1,18 @@
+@node fdim
+@section @code{fdim}
+@findex fdim
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fdim.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fdimf.texi b/gnulib/doc/posix-functions/fdimf.texi
new file mode 100644
index 00000000..8c962c55
--- /dev/null
+++ b/gnulib/doc/posix-functions/fdimf.texi
@@ -0,0 +1,18 @@
+@node fdimf
+@section @code{fdimf}
+@findex fdimf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fdimf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fdiml.texi b/gnulib/doc/posix-functions/fdiml.texi
new file mode 100644
index 00000000..d9e7d645
--- /dev/null
+++ b/gnulib/doc/posix-functions/fdiml.texi
@@ -0,0 +1,18 @@
+@node fdiml
+@section @code{fdiml}
+@findex fdiml
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fdiml.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fdopen.texi b/gnulib/doc/posix-functions/fdopen.texi
new file mode 100644
index 00000000..470867c1
--- /dev/null
+++ b/gnulib/doc/posix-functions/fdopen.texi
@@ -0,0 +1,18 @@
+@node fdopen
+@section @code{fdopen}
+@findex fdopen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fdopen.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fdopendir.texi b/gnulib/doc/posix-functions/fdopendir.texi
new file mode 100644
index 00000000..fae7bb75
--- /dev/null
+++ b/gnulib/doc/posix-functions/fdopendir.texi
@@ -0,0 +1,27 @@
+@node fdopendir
+@section @code{fdopendir}
+@findex fdopendir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fdopendir.html}
+
+Gnulib module: fdopendir
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and
+is not multithread-safe. Also, the replacement does not guarantee
+that @samp{dirfd(fdopendir(n))==n} (dirfd might fail, or return a
+different file descriptor than n).
+@item
+This function does not reject non-directory file descriptors on some
+platforms:
+GNU/Hurd.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/feclearexcept.texi b/gnulib/doc/posix-functions/feclearexcept.texi
new file mode 100644
index 00000000..07f4cce6
--- /dev/null
+++ b/gnulib/doc/posix-functions/feclearexcept.texi
@@ -0,0 +1,18 @@
+@node feclearexcept
+@section @code{feclearexcept}
+@findex feclearexcept
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/feclearexcept.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fegetenv.texi b/gnulib/doc/posix-functions/fegetenv.texi
new file mode 100644
index 00000000..f6ce06bf
--- /dev/null
+++ b/gnulib/doc/posix-functions/fegetenv.texi
@@ -0,0 +1,18 @@
+@node fegetenv
+@section @code{fegetenv}
+@findex fegetenv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fegetenv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fegetexceptflag.texi b/gnulib/doc/posix-functions/fegetexceptflag.texi
new file mode 100644
index 00000000..7ece9ad3
--- /dev/null
+++ b/gnulib/doc/posix-functions/fegetexceptflag.texi
@@ -0,0 +1,18 @@
+@node fegetexceptflag
+@section @code{fegetexceptflag}
+@findex fegetexceptflag
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fegetexceptflag.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fegetround.texi b/gnulib/doc/posix-functions/fegetround.texi
new file mode 100644
index 00000000..1de7e9d0
--- /dev/null
+++ b/gnulib/doc/posix-functions/fegetround.texi
@@ -0,0 +1,18 @@
+@node fegetround
+@section @code{fegetround}
+@findex fegetround
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fegetround.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/feholdexcept.texi b/gnulib/doc/posix-functions/feholdexcept.texi
new file mode 100644
index 00000000..98a9ebf8
--- /dev/null
+++ b/gnulib/doc/posix-functions/feholdexcept.texi
@@ -0,0 +1,18 @@
+@node feholdexcept
+@section @code{feholdexcept}
+@findex feholdexcept
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/feholdexcept.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/feof.texi b/gnulib/doc/posix-functions/feof.texi
new file mode 100644
index 00000000..b9e82b57
--- /dev/null
+++ b/gnulib/doc/posix-functions/feof.texi
@@ -0,0 +1,15 @@
+@node feof
+@section @code{feof}
+@findex feof
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/feof.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/feraiseexcept.texi b/gnulib/doc/posix-functions/feraiseexcept.texi
new file mode 100644
index 00000000..41f609f2
--- /dev/null
+++ b/gnulib/doc/posix-functions/feraiseexcept.texi
@@ -0,0 +1,18 @@
+@node feraiseexcept
+@section @code{feraiseexcept}
+@findex feraiseexcept
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/feraiseexcept.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ferror.texi b/gnulib/doc/posix-functions/ferror.texi
new file mode 100644
index 00000000..8ddfcc1c
--- /dev/null
+++ b/gnulib/doc/posix-functions/ferror.texi
@@ -0,0 +1,15 @@
+@node ferror
+@section @code{ferror}
+@findex ferror
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ferror.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fesetenv.texi b/gnulib/doc/posix-functions/fesetenv.texi
new file mode 100644
index 00000000..3b01a754
--- /dev/null
+++ b/gnulib/doc/posix-functions/fesetenv.texi
@@ -0,0 +1,18 @@
+@node fesetenv
+@section @code{fesetenv}
+@findex fesetenv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fesetenv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fesetexceptflag.texi b/gnulib/doc/posix-functions/fesetexceptflag.texi
new file mode 100644
index 00000000..14acf40a
--- /dev/null
+++ b/gnulib/doc/posix-functions/fesetexceptflag.texi
@@ -0,0 +1,18 @@
+@node fesetexceptflag
+@section @code{fesetexceptflag}
+@findex fesetexceptflag
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fesetexceptflag.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fesetround.texi b/gnulib/doc/posix-functions/fesetround.texi
new file mode 100644
index 00000000..9f34f3d6
--- /dev/null
+++ b/gnulib/doc/posix-functions/fesetround.texi
@@ -0,0 +1,18 @@
+@node fesetround
+@section @code{fesetround}
+@findex fesetround
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fesetround.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fetestexcept.texi b/gnulib/doc/posix-functions/fetestexcept.texi
new file mode 100644
index 00000000..47b61ea9
--- /dev/null
+++ b/gnulib/doc/posix-functions/fetestexcept.texi
@@ -0,0 +1,18 @@
+@node fetestexcept
+@section @code{fetestexcept}
+@findex fetestexcept
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fetestexcept.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/feupdateenv.texi b/gnulib/doc/posix-functions/feupdateenv.texi
new file mode 100644
index 00000000..880bbd1c
--- /dev/null
+++ b/gnulib/doc/posix-functions/feupdateenv.texi
@@ -0,0 +1,18 @@
+@node feupdateenv
+@section @code{feupdateenv}
+@findex feupdateenv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/feupdateenv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fexecve.texi b/gnulib/doc/posix-functions/fexecve.texi
new file mode 100644
index 00000000..099fb952
--- /dev/null
+++ b/gnulib/doc/posix-functions/fexecve.texi
@@ -0,0 +1,19 @@
+@node fexecve
+@section @code{fexecve}
+@findex fexecve
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fexecve.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fflush.texi b/gnulib/doc/posix-functions/fflush.texi
new file mode 100644
index 00000000..f5267c91
--- /dev/null
+++ b/gnulib/doc/posix-functions/fflush.texi
@@ -0,0 +1,37 @@
+@node fflush
+@section @code{fflush}
+@findex fflush
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fflush.html}
+
+Gnulib module: fflush
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+@code{fflush} followed by @code{fseek} or @code{fseeko}, applied to an input
+stream, should have the effect of positioning the underlying file descriptor.
+It doesn't do this on some platforms.
+@item
+@code{fflush} on an input stream changes the position of the stream to the
+end of the previous buffer, on some platforms: mingw.
+@item
+@code{fflush} on an input stream right after @code{ungetc} does not discard
+the @code{ungetc} buffer, on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin 1.5.25-10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+@code{fflush}, @code{ftell}, @code{ftello}, @code{fgetpos} behave incorrectly
+on input streams that are opened in @code{O_TEXT} mode and whose contents
+contains Unix line terminators (LF), on some platforms: mingw.
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+@code{fflush} on an input stream right after @code{ungetc} does not discard
+the @code{ungetc} buffer, on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ffs.texi b/gnulib/doc/posix-functions/ffs.texi
new file mode 100644
index 00000000..1a756dd5
--- /dev/null
+++ b/gnulib/doc/posix-functions/ffs.texi
@@ -0,0 +1,18 @@
+@node ffs
+@section @code{ffs}
+@findex ffs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ffs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fgetc.texi b/gnulib/doc/posix-functions/fgetc.texi
new file mode 100644
index 00000000..42967191
--- /dev/null
+++ b/gnulib/doc/posix-functions/fgetc.texi
@@ -0,0 +1,18 @@
+@node fgetc
+@section @code{fgetc}
+@findex fgetc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fgetc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fgetpos.texi b/gnulib/doc/posix-functions/fgetpos.texi
new file mode 100644
index 00000000..06ecafd5
--- /dev/null
+++ b/gnulib/doc/posix-functions/fgetpos.texi
@@ -0,0 +1,23 @@
+@node fgetpos
+@section @code{fgetpos}
+@findex fgetpos
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fgetpos.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+@code{fflush}, @code{ftell}, @code{ftello}, @code{fgetpos} behave incorrectly
+on input streams that are opened in @code{O_TEXT} mode and whose contents
+contains Unix line terminators (LF), on some platforms: mingw.
+@item
+On platforms where @code{off_t} is a 64-bit type, but @code{fseeko} is
+not present, stream operations on files larger than 2 GB silently do
+the wrong thing. This affects BSD/OS, which is mostly obsolete.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fgets.texi b/gnulib/doc/posix-functions/fgets.texi
new file mode 100644
index 00000000..a099bc2d
--- /dev/null
+++ b/gnulib/doc/posix-functions/fgets.texi
@@ -0,0 +1,18 @@
+@node fgets
+@section @code{fgets}
+@findex fgets
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fgets.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fgetwc.texi b/gnulib/doc/posix-functions/fgetwc.texi
new file mode 100644
index 00000000..9399225f
--- /dev/null
+++ b/gnulib/doc/posix-functions/fgetwc.texi
@@ -0,0 +1,21 @@
+@node fgetwc
+@section @code{fgetwc}
+@findex fgetwc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fgetwc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fgetws.texi b/gnulib/doc/posix-functions/fgetws.texi
new file mode 100644
index 00000000..648057b6
--- /dev/null
+++ b/gnulib/doc/posix-functions/fgetws.texi
@@ -0,0 +1,21 @@
+@node fgetws
+@section @code{fgetws}
+@findex fgetws
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fgetws.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fileno.texi b/gnulib/doc/posix-functions/fileno.texi
new file mode 100644
index 00000000..24a203a2
--- /dev/null
+++ b/gnulib/doc/posix-functions/fileno.texi
@@ -0,0 +1,15 @@
+@node fileno
+@section @code{fileno}
+@findex fileno
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fileno.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/flockfile.texi b/gnulib/doc/posix-functions/flockfile.texi
new file mode 100644
index 00000000..d4158e3e
--- /dev/null
+++ b/gnulib/doc/posix-functions/flockfile.texi
@@ -0,0 +1,18 @@
+@node flockfile
+@section @code{flockfile}
+@findex flockfile
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/flockfile.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/floor.texi b/gnulib/doc/posix-functions/floor.texi
new file mode 100644
index 00000000..ae124839
--- /dev/null
+++ b/gnulib/doc/posix-functions/floor.texi
@@ -0,0 +1,15 @@
+@node floor
+@section @code{floor}
+@findex floor
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/floor.html}
+
+Gnulib module: floor
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/floorf.texi b/gnulib/doc/posix-functions/floorf.texi
new file mode 100644
index 00000000..8a6f590d
--- /dev/null
+++ b/gnulib/doc/posix-functions/floorf.texi
@@ -0,0 +1,18 @@
+@node floorf
+@section @code{floorf}
+@findex floorf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/floorf.html}
+
+Gnulib module: floorf
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, Solaris 9.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/floorl.texi b/gnulib/doc/posix-functions/floorl.texi
new file mode 100644
index 00000000..7307d39a
--- /dev/null
+++ b/gnulib/doc/posix-functions/floorl.texi
@@ -0,0 +1,18 @@
+@node floorl
+@section @code{floorl}
+@findex floorl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/floorl.html}
+
+Gnulib module: floorl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fma.texi b/gnulib/doc/posix-functions/fma.texi
new file mode 100644
index 00000000..8fa6c21b
--- /dev/null
+++ b/gnulib/doc/posix-functions/fma.texi
@@ -0,0 +1,18 @@
+@node fma
+@section @code{fma}
+@findex fma
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fma.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmaf.texi b/gnulib/doc/posix-functions/fmaf.texi
new file mode 100644
index 00000000..28529115
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmaf.texi
@@ -0,0 +1,18 @@
+@node fmaf
+@section @code{fmaf}
+@findex fmaf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmaf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmal.texi b/gnulib/doc/posix-functions/fmal.texi
new file mode 100644
index 00000000..83729208
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmal.texi
@@ -0,0 +1,18 @@
+@node fmal
+@section @code{fmal}
+@findex fmal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmax.texi b/gnulib/doc/posix-functions/fmax.texi
new file mode 100644
index 00000000..47c9d098
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmax.texi
@@ -0,0 +1,18 @@
+@node fmax
+@section @code{fmax}
+@findex fmax
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmax.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmaxf.texi b/gnulib/doc/posix-functions/fmaxf.texi
new file mode 100644
index 00000000..a96f9225
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmaxf.texi
@@ -0,0 +1,18 @@
+@node fmaxf
+@section @code{fmaxf}
+@findex fmaxf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmaxf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmaxl.texi b/gnulib/doc/posix-functions/fmaxl.texi
new file mode 100644
index 00000000..7d4cf2d3
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmaxl.texi
@@ -0,0 +1,18 @@
+@node fmaxl
+@section @code{fmaxl}
+@findex fmaxl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmaxl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmemopen.texi b/gnulib/doc/posix-functions/fmemopen.texi
new file mode 100644
index 00000000..7994278e
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmemopen.texi
@@ -0,0 +1,19 @@
+@node fmemopen
+@section @code{fmemopen}
+@findex fmemopen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmemopen.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmin.texi b/gnulib/doc/posix-functions/fmin.texi
new file mode 100644
index 00000000..6142ae66
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmin.texi
@@ -0,0 +1,18 @@
+@node fmin
+@section @code{fmin}
+@findex fmin
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmin.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fminf.texi b/gnulib/doc/posix-functions/fminf.texi
new file mode 100644
index 00000000..836b9bcb
--- /dev/null
+++ b/gnulib/doc/posix-functions/fminf.texi
@@ -0,0 +1,18 @@
+@node fminf
+@section @code{fminf}
+@findex fminf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fminf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fminl.texi b/gnulib/doc/posix-functions/fminl.texi
new file mode 100644
index 00000000..81917f47
--- /dev/null
+++ b/gnulib/doc/posix-functions/fminl.texi
@@ -0,0 +1,18 @@
+@node fminl
+@section @code{fminl}
+@findex fminl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fminl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmod.texi b/gnulib/doc/posix-functions/fmod.texi
new file mode 100644
index 00000000..9cfa5629
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmod.texi
@@ -0,0 +1,15 @@
+@node fmod
+@section @code{fmod}
+@findex fmod
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmod.html}
+
+Gnulib module: fmod
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmodf.texi b/gnulib/doc/posix-functions/fmodf.texi
new file mode 100644
index 00000000..d099d957
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmodf.texi
@@ -0,0 +1,18 @@
+@node fmodf
+@section @code{fmodf}
+@findex fmodf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmodf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmodl.texi b/gnulib/doc/posix-functions/fmodl.texi
new file mode 100644
index 00000000..12630b22
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmodl.texi
@@ -0,0 +1,18 @@
+@node fmodl
+@section @code{fmodl}
+@findex fmodl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmodl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fmtmsg.texi b/gnulib/doc/posix-functions/fmtmsg.texi
new file mode 100644
index 00000000..6afa3f28
--- /dev/null
+++ b/gnulib/doc/posix-functions/fmtmsg.texi
@@ -0,0 +1,18 @@
+@node fmtmsg
+@section @code{fmtmsg}
+@findex fmtmsg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fmtmsg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fnmatch.texi b/gnulib/doc/posix-functions/fnmatch.texi
new file mode 100644
index 00000000..c242d174
--- /dev/null
+++ b/gnulib/doc/posix-functions/fnmatch.texi
@@ -0,0 +1,20 @@
+@node fnmatch
+@section @code{fnmatch}
+@findex fnmatch
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fnmatch.html}
+
+Gnulib module: fnmatch or fnmatch-gnu
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, mingw.
+@item
+This function is broken in some versions of Solaris and glibc.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fopen.texi b/gnulib/doc/posix-functions/fopen.texi
new file mode 100644
index 00000000..4c9ec229
--- /dev/null
+++ b/gnulib/doc/posix-functions/fopen.texi
@@ -0,0 +1,36 @@
+@node fopen
+@section @code{fopen}
+@findex fopen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fopen.html}
+
+Gnulib module: fopen
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function does not fail when the file name argument ends in a slash
+and (without the slash) names a nonexistent file or a file that is not a
+directory, on some platforms:
+HP-UX 11.00, Solaris 9, Irix 5.3.
+@item
+On Windows platforms (excluding Cygwin), this function does usually not
+recognize the @file{/dev/null} filename.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+On Windows, this function returns a file stream in ``text'' mode by default;
+this means that it translates @code{'\n'} to CR/LF by default. Use the
+@code{"b"} flag if you need reliable binary I/O.
+@item
+On Windows platforms (excluding Cygwin), this function fails to open
+directories for reading. Such streams have implementation-defined
+semantics on other platforms. To avoid directory streams with a
+consistent error message, use @code{fstat} after @code{open} and
+@code{fdopen}, rather than @code{fopen} and @code{fileno}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fork.texi b/gnulib/doc/posix-functions/fork.texi
new file mode 100644
index 00000000..06873b06
--- /dev/null
+++ b/gnulib/doc/posix-functions/fork.texi
@@ -0,0 +1,27 @@
+@node fork
+@section @code{fork}
+@findex fork
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fork.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+On some platforms, @code{fork} followed by a call of the @code{exec} family
+(@code{execl}, @code{execlp}, @code{execle}, @code{execv}, @code{execvp},
+or @code{execve}) is less efficient than @code{vfork} followed by the same
+call. @code{vfork} is a variant of @code{fork} that has been introduced to
+optimize the @code{fork}/@code{exec} pattern.
+@item
+On Windows platforms (excluding Cygwin), this function is not implemented; use
+@code{spawnvp} instead.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fpathconf.texi b/gnulib/doc/posix-functions/fpathconf.texi
new file mode 100644
index 00000000..b164cb8d
--- /dev/null
+++ b/gnulib/doc/posix-functions/fpathconf.texi
@@ -0,0 +1,18 @@
+@node fpathconf
+@section @code{fpathconf}
+@findex fpathconf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fpathconf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fpclassify.texi b/gnulib/doc/posix-functions/fpclassify.texi
new file mode 100644
index 00000000..6d76d324
--- /dev/null
+++ b/gnulib/doc/posix-functions/fpclassify.texi
@@ -0,0 +1,18 @@
+@node fpclassify
+@section @code{fpclassify}
+@findex fpclassify
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fpclassify.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fprintf.texi b/gnulib/doc/posix-functions/fprintf.texi
new file mode 100644
index 00000000..89f58777
--- /dev/null
+++ b/gnulib/doc/posix-functions/fprintf.texi
@@ -0,0 +1,72 @@
+@node fprintf
+@section @code{fprintf}
+@findex fprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fprintf.html}
+
+Gnulib module: fprintf-posix or stdio, sigpipe
+
+Portability problems fixed by Gnulib module @code{fprintf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{stdio} or @code{fprintf-posix}, together with module @code{sigpipe}:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fputc.texi b/gnulib/doc/posix-functions/fputc.texi
new file mode 100644
index 00000000..3748a3e4
--- /dev/null
+++ b/gnulib/doc/posix-functions/fputc.texi
@@ -0,0 +1,22 @@
+@node fputc
+@section @code{fputc}
+@findex fputc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fputc.html}
+
+Gnulib module: stdio, sigpipe
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fputs.texi b/gnulib/doc/posix-functions/fputs.texi
new file mode 100644
index 00000000..feac2e63
--- /dev/null
+++ b/gnulib/doc/posix-functions/fputs.texi
@@ -0,0 +1,22 @@
+@node fputs
+@section @code{fputs}
+@findex fputs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fputs.html}
+
+Gnulib module: stdio, sigpipe
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fputwc.texi b/gnulib/doc/posix-functions/fputwc.texi
new file mode 100644
index 00000000..6f61f42e
--- /dev/null
+++ b/gnulib/doc/posix-functions/fputwc.texi
@@ -0,0 +1,21 @@
+@node fputwc
+@section @code{fputwc}
+@findex fputwc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fputwc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fputws.texi b/gnulib/doc/posix-functions/fputws.texi
new file mode 100644
index 00000000..76dcae63
--- /dev/null
+++ b/gnulib/doc/posix-functions/fputws.texi
@@ -0,0 +1,21 @@
+@node fputws
+@section @code{fputws}
+@findex fputws
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fputws.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fread.texi b/gnulib/doc/posix-functions/fread.texi
new file mode 100644
index 00000000..6cd10866
--- /dev/null
+++ b/gnulib/doc/posix-functions/fread.texi
@@ -0,0 +1,18 @@
+@node fread
+@section @code{fread}
+@findex fread
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fread.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/free.texi b/gnulib/doc/posix-functions/free.texi
new file mode 100644
index 00000000..2ef3ddaa
--- /dev/null
+++ b/gnulib/doc/posix-functions/free.texi
@@ -0,0 +1,20 @@
+@node free
+@section @code{free}
+@findex free
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/free.html}
+
+Gnulib module: free
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On old platforms such as SunOS4, @code{free (NULL)} fails.
+However, since all such systems are so old as to no longer
+be considered ``reasonable portability targets,''
+this module is no longer useful.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/freeaddrinfo.texi b/gnulib/doc/posix-functions/freeaddrinfo.texi
new file mode 100644
index 00000000..a317a07c
--- /dev/null
+++ b/gnulib/doc/posix-functions/freeaddrinfo.texi
@@ -0,0 +1,18 @@
+@node freeaddrinfo
+@section @code{freeaddrinfo}
+@findex freeaddrinfo
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html}
+
+Gnulib module: getaddrinfo
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 7, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/freelocale.texi b/gnulib/doc/posix-functions/freelocale.texi
new file mode 100644
index 00000000..5dd69d78
--- /dev/null
+++ b/gnulib/doc/posix-functions/freelocale.texi
@@ -0,0 +1,18 @@
+@node freelocale
+@section @code{freelocale}
+@findex freelocale
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/freelocale.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/freopen.texi b/gnulib/doc/posix-functions/freopen.texi
new file mode 100644
index 00000000..c8b60c2d
--- /dev/null
+++ b/gnulib/doc/posix-functions/freopen.texi
@@ -0,0 +1,31 @@
+@node freopen
+@section @code{freopen}
+@findex freopen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/freopen.html}
+
+Gnulib module: freopen
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does usually not
+recognize the @file{/dev/null} filename.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+This function does not fail when the file name argument ends in a slash
+and (without the slash) names a nonexistent file or a file that is not a
+directory, on some platforms:
+HP-UX 11.00, Solaris 9, Irix 5.3.
+@item
+Applications should not assume that @code{fileno(f)} will be the same
+before and after a call to @code{freopen(name,mode,f)}. However, the
+module freopen-safer can at least protect @code{stdin}, @code{stdout},
+and @code{stderr}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/frexp.texi b/gnulib/doc/posix-functions/frexp.texi
new file mode 100644
index 00000000..8a3adeb1
--- /dev/null
+++ b/gnulib/doc/posix-functions/frexp.texi
@@ -0,0 +1,24 @@
+@node frexp
+@section @code{frexp}
+@findex frexp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/frexp.html}
+
+Gnulib module: frexp
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function does not work on denormalized numbers on some platforms:
+NetBSD 3.0.
+@item
+This function does not work on negative zero on some platforms:
+NetBSD 4.99.
+@item
+This function does not work on infinite numbers on some platforms:
+IRIX 6.5, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/frexpf.texi b/gnulib/doc/posix-functions/frexpf.texi
new file mode 100644
index 00000000..3ba19b37
--- /dev/null
+++ b/gnulib/doc/posix-functions/frexpf.texi
@@ -0,0 +1,18 @@
+@node frexpf
+@section @code{frexpf}
+@findex frexpf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/frexpf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/frexpl.texi b/gnulib/doc/posix-functions/frexpl.texi
new file mode 100644
index 00000000..38cee7b1
--- /dev/null
+++ b/gnulib/doc/posix-functions/frexpl.texi
@@ -0,0 +1,27 @@
+@node frexpl
+@section @code{frexpl}
+@findex frexpl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/frexpl.html}
+
+Gnulib module: frexpl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5.
+@item
+This function does not work on finite numbers on some platforms:
+MacOS X 10.4/PowerPC, AIX 5.1, BeOS.
+@item
+This function does not work on denormalized numbers on some platforms:
+MacOS X 10.5/i386.
+@item
+This function does not work on infinite numbers on some platforms:
+IRIX 6.5, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fscanf.texi b/gnulib/doc/posix-functions/fscanf.texi
new file mode 100644
index 00000000..2f62afa0
--- /dev/null
+++ b/gnulib/doc/posix-functions/fscanf.texi
@@ -0,0 +1,21 @@
+@node fscanf
+@section @code{fscanf}
+@findex fscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+On Windows, this function doesn't support the @code{hh}, @code{ll}, @code{j},
+@code{t}, @code{z} size specifiers.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fseek.texi b/gnulib/doc/posix-functions/fseek.texi
new file mode 100644
index 00000000..cf9b8d11
--- /dev/null
+++ b/gnulib/doc/posix-functions/fseek.texi
@@ -0,0 +1,24 @@
+@node fseek
+@section @code{fseek}
+@findex fseek
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fseek.html}
+
+Gnulib module: fseek
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function mistakenly succeeds on pipes on some platforms: mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+On platforms where @code{long} is a 32-bit type, @code{fseek} does not work
+correctly with files larger than 2 GB. The fix is to use @code{fseeko}
+instead and to invoke the @code{AC_SYS_LARGEFILE} macro.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fseeko.texi b/gnulib/doc/posix-functions/fseeko.texi
new file mode 100644
index 00000000..9a8a9f21
--- /dev/null
+++ b/gnulib/doc/posix-functions/fseeko.texi
@@ -0,0 +1,31 @@
+@node fseeko
+@section @code{fseeko}
+@findex fseeko
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fseeko.html}
+
+Gnulib module: fseeko
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, OSF/1 4.0, Solaris 2.5.1, mingw.
+@item
+The declaration of @code{fseeko} in @code{<stdio.h>} is not enabled by default
+on some platforms: glibc 2.3.6.
+@item
+This function fails on seekable stdin, stdout, and stderr: cygwin <= 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{fseeko} does not work
+correctly with files larger than 2 GB. The fix is to use the
+@code{AC_SYS_LARGEFILE} macro.
+@item
+On platforms where @code{off_t} is a 64-bit type, but @code{fseeko} is
+not present, stream operations on files larger than 2 GB silently do
+the wrong thing. This affects BSD/OS, which is mostly obsolete.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fsetpos.texi b/gnulib/doc/posix-functions/fsetpos.texi
new file mode 100644
index 00000000..d4ec5b3c
--- /dev/null
+++ b/gnulib/doc/posix-functions/fsetpos.texi
@@ -0,0 +1,15 @@
+@node fsetpos
+@section @code{fsetpos}
+@findex fsetpos
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fsetpos.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/fstat.texi b/gnulib/doc/posix-functions/fstat.texi
new file mode 100644
index 00000000..a6e95be7
--- /dev/null
+++ b/gnulib/doc/posix-functions/fstat.texi
@@ -0,0 +1,23 @@
+@node fstat
+@section @code{fstat}
+@findex fstat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fstat.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{stat} may not correctly
+report the size of files or block devices larger than 2 GB. The fix is to
+use the @code{AC_SYS_LARGEFILE} macro.
+@item
+On Cygwin, @code{fstat} applied to the file descriptors 0 and 1, returns
+different @code{st_ino} values, even if standard input and standard output
+are not redirected and refer to the same terminal.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fstatat.texi b/gnulib/doc/posix-functions/fstatat.texi
new file mode 100644
index 00000000..6a3827bd
--- /dev/null
+++ b/gnulib/doc/posix-functions/fstatat.texi
@@ -0,0 +1,38 @@
+@node fstatat
+@section @code{fstatat}
+@findex fstatat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fstatat.html}
+
+Gnulib module: openat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@item
+On some platforms, @code{fstatat(fd,"file/",buf,flag)} succeeds instead of
+failing with @code{ENOTDIR}.
+Solaris 9.
+@item
+For symlinks, when the argument ends in a slash, some platforms don't
+dereference the argument:
+Solaris 9.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{fstatat} may
+not correctly report the size of files or block devices larger than 2
+GB. The fix is to use the @code{AC_SYS_LARGEFILE} macro.
+@item
+On Windows platforms (excluding Cygwin), @code{st_ino} is always 0.
+@item
+On some file systems, @code{st_size} contains bogus information for
+symlinks; use the gnulib module areadlink-with-size for a better way
+to get symlink contents.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fstatvfs.texi b/gnulib/doc/posix-functions/fstatvfs.texi
new file mode 100644
index 00000000..963accf1
--- /dev/null
+++ b/gnulib/doc/posix-functions/fstatvfs.texi
@@ -0,0 +1,18 @@
+@node fstatvfs
+@section @code{fstatvfs}
+@findex fstatvfs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fstatvfs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fsync.texi b/gnulib/doc/posix-functions/fsync.texi
new file mode 100644
index 00000000..cbfeb44e
--- /dev/null
+++ b/gnulib/doc/posix-functions/fsync.texi
@@ -0,0 +1,18 @@
+@node fsync
+@section @code{fsync}
+@findex fsync
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fsync.html}
+
+Gnulib module: fsync
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ftell.texi b/gnulib/doc/posix-functions/ftell.texi
new file mode 100644
index 00000000..aaa65f99
--- /dev/null
+++ b/gnulib/doc/posix-functions/ftell.texi
@@ -0,0 +1,29 @@
+@node ftell
+@section @code{ftell}
+@findex ftell
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ftell.html}
+
+Gnulib module: ftell
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function mistakenly succeeds on pipes on some platforms: mingw.
+@item
+This function produces incorrect results immediately after @code{fseek} on some
+platforms:
+HP-UX 11.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+@code{fflush}, @code{ftell}, @code{ftello}, @code{fgetpos} behave incorrectly
+on input streams that are opened in @code{O_TEXT} mode and whose contents
+contains Unix line terminators (LF), on some platforms: mingw.
+@item
+On platforms where @code{long} is a 32-bit type, @code{ftell} does not work
+correctly with files larger than 2 GB. The fix is to use @code{ftello}
+instead and to invoke the @code{AC_SYS_LARGEFILE} macro.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ftello.texi b/gnulib/doc/posix-functions/ftello.texi
new file mode 100644
index 00000000..46ce4333
--- /dev/null
+++ b/gnulib/doc/posix-functions/ftello.texi
@@ -0,0 +1,39 @@
+@node ftello
+@section @code{ftello}
+@findex ftello
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ftello.html}
+
+Gnulib module: ftello
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, OSF/1 4.0, Solaris 2.5.1, mingw.
+@item
+The declaration of @code{ftello} in @code{<stdio.h>} is not enabled by default
+on some platforms: glibc 2.3.6.
+@item
+This function produces incorrect results immediately after @code{fseek} on some
+platforms:
+HP-UX 11.
+@item
+This function fails on seekable stdin, stdout, and stderr: cygwin <= 1.5.24.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{ftello} does not work
+correctly with files larger than 2 GB. The fix is to use the
+@code{AC_SYS_LARGEFILE} macro.
+@item
+@code{fflush}, @code{ftell}, @code{ftello}, @code{fgetpos} behave incorrectly
+on input streams that are opened in @code{O_TEXT} mode and whose contents
+contains Unix line terminators (LF), on some platforms: mingw.
+@item
+On platforms where @code{off_t} is a 64-bit type, but @code{fseeko} is
+not present, stream operations on files larger than 2 GB silently do
+the wrong thing. This affects BSD/OS, which is mostly obsolete.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ftok.texi b/gnulib/doc/posix-functions/ftok.texi
new file mode 100644
index 00000000..8f6aba63
--- /dev/null
+++ b/gnulib/doc/posix-functions/ftok.texi
@@ -0,0 +1,18 @@
+@node ftok
+@section @code{ftok}
+@findex ftok
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ftok.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ftruncate.texi b/gnulib/doc/posix-functions/ftruncate.texi
new file mode 100644
index 00000000..a9025054
--- /dev/null
+++ b/gnulib/doc/posix-functions/ftruncate.texi
@@ -0,0 +1,18 @@
+@node ftruncate
+@section @code{ftruncate}
+@findex ftruncate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ftrylockfile.texi b/gnulib/doc/posix-functions/ftrylockfile.texi
new file mode 100644
index 00000000..8ed32b48
--- /dev/null
+++ b/gnulib/doc/posix-functions/ftrylockfile.texi
@@ -0,0 +1,18 @@
+@node ftrylockfile
+@section @code{ftrylockfile}
+@findex ftrylockfile
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ftrylockfile.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ftw.texi b/gnulib/doc/posix-functions/ftw.texi
new file mode 100644
index 00000000..b6cb2a4d
--- /dev/null
+++ b/gnulib/doc/posix-functions/ftw.texi
@@ -0,0 +1,18 @@
+@node ftw
+@section @code{ftw}
+@findex ftw
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ftw.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/funlockfile.texi b/gnulib/doc/posix-functions/funlockfile.texi
new file mode 100644
index 00000000..ae70363c
--- /dev/null
+++ b/gnulib/doc/posix-functions/funlockfile.texi
@@ -0,0 +1,18 @@
+@node funlockfile
+@section @code{funlockfile}
+@findex funlockfile
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/funlockfile.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/futimens.texi b/gnulib/doc/posix-functions/futimens.texi
new file mode 100644
index 00000000..ce71bf4d
--- /dev/null
+++ b/gnulib/doc/posix-functions/futimens.texi
@@ -0,0 +1,44 @@
+@node futimens
+@section @code{futimens}
+@findex futimens
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/futimens.html}
+
+Gnulib module: futimens
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw,
+Interix 3.5, BeOS.
+However, the replacement function may end up truncating timestamps to
+less resolution than supported by the file system.
+@item
+This function returns a bogus value instead of failing with
+@code{ENOSYS} on some platforms:
+Linux kernel 2.6.21.
+@item
+When using @code{UTIME_OMIT} or @code{UTIME_NOW}, some systems require
+the @code{tv_sec} argument to be 0, and don't necessarily handle all
+file permissions in the manner required by POSIX:
+Linux kernel 2.6.25.
+@item
+When using @code{UTIME_OMIT} for the modification time, but specifying
+an access time, some systems fail to update the change time:
+Linux kernel 2.6.32.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some platforms lack the ability to change the timestamps of a file
+descriptor, so the replacement can fail with @code{ENOSYS}; the gnulib
+module @samp{utimens} provides a more reliable interface @code{fdutimens}.
+@item
+The mere act of using @code{stat} modifies the access time of
+directories on some platforms, so @code{utimensat} can only
+effectively change directory modification time:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fwide.texi b/gnulib/doc/posix-functions/fwide.texi
new file mode 100644
index 00000000..351c88c1
--- /dev/null
+++ b/gnulib/doc/posix-functions/fwide.texi
@@ -0,0 +1,24 @@
+@node fwide
+@section @code{fwide}
+@findex fwide
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fwide.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@item
+@code{fwide} is not guaranteed to be able to change a file stream's mode
+to a different mode than the current one.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fwprintf.texi b/gnulib/doc/posix-functions/fwprintf.texi
new file mode 100644
index 00000000..bef5316c
--- /dev/null
+++ b/gnulib/doc/posix-functions/fwprintf.texi
@@ -0,0 +1,21 @@
+@node fwprintf
+@section @code{fwprintf}
+@findex fwprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fwprintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fwrite.texi b/gnulib/doc/posix-functions/fwrite.texi
new file mode 100644
index 00000000..b846a61f
--- /dev/null
+++ b/gnulib/doc/posix-functions/fwrite.texi
@@ -0,0 +1,22 @@
+@node fwrite
+@section @code{fwrite}
+@findex fwrite
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fwrite.html}
+
+Gnulib module: stdio, sigpipe
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/fwscanf.texi b/gnulib/doc/posix-functions/fwscanf.texi
new file mode 100644
index 00000000..fa88fa00
--- /dev/null
+++ b/gnulib/doc/posix-functions/fwscanf.texi
@@ -0,0 +1,21 @@
+@node fwscanf
+@section @code{fwscanf}
+@findex fwscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/fwscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/gai_strerror.texi b/gnulib/doc/posix-functions/gai_strerror.texi
new file mode 100644
index 00000000..b1232f13
--- /dev/null
+++ b/gnulib/doc/posix-functions/gai_strerror.texi
@@ -0,0 +1,18 @@
+@node gai_strerror
+@section @code{gai_strerror}
+@findex gai_strerror
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/gai_strerror.html}
+
+Gnulib module: getaddrinfo
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 7, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/getaddrinfo.texi b/gnulib/doc/posix-functions/getaddrinfo.texi
new file mode 100644
index 00000000..cfa434d0
--- /dev/null
+++ b/gnulib/doc/posix-functions/getaddrinfo.texi
@@ -0,0 +1,21 @@
+@node getaddrinfo
+@section @code{getaddrinfo}
+@findex getaddrinfo
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html}
+
+Gnulib module: getaddrinfo
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 7, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows, this function is declared in @code{<ws2tcpip.h>} rather than in
+@code{<netdb.h>}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getc.texi b/gnulib/doc/posix-functions/getc.texi
new file mode 100644
index 00000000..b9da2859
--- /dev/null
+++ b/gnulib/doc/posix-functions/getc.texi
@@ -0,0 +1,18 @@
+@node getc
+@section @code{getc}
+@findex getc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getc_unlocked.texi b/gnulib/doc/posix-functions/getc_unlocked.texi
new file mode 100644
index 00000000..ac6727d6
--- /dev/null
+++ b/gnulib/doc/posix-functions/getc_unlocked.texi
@@ -0,0 +1,18 @@
+@node getc_unlocked
+@section @code{getc_unlocked}
+@findex getc_unlocked
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getc_unlocked.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getchar.texi b/gnulib/doc/posix-functions/getchar.texi
new file mode 100644
index 00000000..5bc841d9
--- /dev/null
+++ b/gnulib/doc/posix-functions/getchar.texi
@@ -0,0 +1,18 @@
+@node getchar
+@section @code{getchar}
+@findex getchar
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getchar.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getchar_unlocked.texi b/gnulib/doc/posix-functions/getchar_unlocked.texi
new file mode 100644
index 00000000..240c8a9a
--- /dev/null
+++ b/gnulib/doc/posix-functions/getchar_unlocked.texi
@@ -0,0 +1,18 @@
+@node getchar_unlocked
+@section @code{getchar_unlocked}
+@findex getchar_unlocked
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getchar_unlocked.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getcwd.texi b/gnulib/doc/posix-functions/getcwd.texi
new file mode 100644
index 00000000..2ee94b93
--- /dev/null
+++ b/gnulib/doc/posix-functions/getcwd.texi
@@ -0,0 +1,23 @@
+@node getcwd
+@section @code{getcwd}
+@findex getcwd
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getcwd.html}
+
+Gnulib module: getcwd
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some older platforms.
+@item
+On glibc platforms, @code{getcwd (NULL, n)} allocates memory for the result.
+On other platforms, this call is not allowed.
+@item
+This function does not handle long file names (greater than @code{PATH_MAX})
+correctly on some platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/getdate.texi b/gnulib/doc/posix-functions/getdate.texi
new file mode 100644
index 00000000..5775e3a4
--- /dev/null
+++ b/gnulib/doc/posix-functions/getdate.texi
@@ -0,0 +1,21 @@
+@node getdate
+@section @code{getdate}
+@findex getdate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getdate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, BeOS.
+@end itemize
+
+Gnulib provides a module @code{getdate} that contains a function @code{get_date}
+that has similar functionality as the @code{getdate} function.
diff --git a/gnulib/doc/posix-functions/getdate_err.texi b/gnulib/doc/posix-functions/getdate_err.texi
new file mode 100644
index 00000000..3e15bc0a
--- /dev/null
+++ b/gnulib/doc/posix-functions/getdate_err.texi
@@ -0,0 +1,18 @@
+@node getdate_err
+@section @code{getdate_err}
+@findex getdate_err
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getdate_err.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getdelim.texi b/gnulib/doc/posix-functions/getdelim.texi
new file mode 100644
index 00000000..d9c696c9
--- /dev/null
+++ b/gnulib/doc/posix-functions/getdelim.texi
@@ -0,0 +1,25 @@
+@node getdelim
+@section @code{getdelim}
+@findex getdelim
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getdelim.html}
+
+Gnulib module: getdelim
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5.
+@item
+This function is missing a declaration on some platforms:
+BeOS.
+@item
+This function crashes when passed a pointer to a NULL buffer together with a
+pointer to a non-zero buffer size on some platforms:
+FreeBSD 8.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/getegid.texi b/gnulib/doc/posix-functions/getegid.texi
new file mode 100644
index 00000000..1532b82f
--- /dev/null
+++ b/gnulib/doc/posix-functions/getegid.texi
@@ -0,0 +1,18 @@
+@node getegid
+@section @code{getegid}
+@findex getegid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getegid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getenv.texi b/gnulib/doc/posix-functions/getenv.texi
new file mode 100644
index 00000000..e736b78c
--- /dev/null
+++ b/gnulib/doc/posix-functions/getenv.texi
@@ -0,0 +1,15 @@
+@node getenv
+@section @code{getenv}
+@findex getenv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getenv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/geteuid.texi b/gnulib/doc/posix-functions/geteuid.texi
new file mode 100644
index 00000000..be913649
--- /dev/null
+++ b/gnulib/doc/posix-functions/geteuid.texi
@@ -0,0 +1,18 @@
+@node geteuid
+@section @code{geteuid}
+@findex geteuid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/geteuid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getgid.texi b/gnulib/doc/posix-functions/getgid.texi
new file mode 100644
index 00000000..3081a818
--- /dev/null
+++ b/gnulib/doc/posix-functions/getgid.texi
@@ -0,0 +1,18 @@
+@node getgid
+@section @code{getgid}
+@findex getgid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getgid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getgrent.texi b/gnulib/doc/posix-functions/getgrent.texi
new file mode 100644
index 00000000..e387a719
--- /dev/null
+++ b/gnulib/doc/posix-functions/getgrent.texi
@@ -0,0 +1,18 @@
+@node getgrent
+@section @code{getgrent}
+@findex getgrent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getgrent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getgrgid.texi b/gnulib/doc/posix-functions/getgrgid.texi
new file mode 100644
index 00000000..6106665b
--- /dev/null
+++ b/gnulib/doc/posix-functions/getgrgid.texi
@@ -0,0 +1,18 @@
+@node getgrgid
+@section @code{getgrgid}
+@findex getgrgid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getgrgid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getgrgid_r.texi b/gnulib/doc/posix-functions/getgrgid_r.texi
new file mode 100644
index 00000000..46b5505d
--- /dev/null
+++ b/gnulib/doc/posix-functions/getgrgid_r.texi
@@ -0,0 +1,18 @@
+@node getgrgid_r
+@section @code{getgrgid_r}
+@findex getgrgid_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getgrgid_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getgrnam.texi b/gnulib/doc/posix-functions/getgrnam.texi
new file mode 100644
index 00000000..63905c5c
--- /dev/null
+++ b/gnulib/doc/posix-functions/getgrnam.texi
@@ -0,0 +1,18 @@
+@node getgrnam
+@section @code{getgrnam}
+@findex getgrnam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getgrnam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getgrnam_r.texi b/gnulib/doc/posix-functions/getgrnam_r.texi
new file mode 100644
index 00000000..c40b33ed
--- /dev/null
+++ b/gnulib/doc/posix-functions/getgrnam_r.texi
@@ -0,0 +1,18 @@
+@node getgrnam_r
+@section @code{getgrnam_r}
+@findex getgrnam_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getgrnam_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getgroups.texi b/gnulib/doc/posix-functions/getgroups.texi
new file mode 100644
index 00000000..0e838f77
--- /dev/null
+++ b/gnulib/doc/posix-functions/getgroups.texi
@@ -0,0 +1,34 @@
+@node getgroups
+@section @code{getgroups}
+@findex getgroups
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getgroups.html}
+
+Gnulib module: getgroups
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+On some platforms, this function fails to reject a negative count,
+even though that is less than the size that would be returned:
+FreeBSD 7.2.
+@item
+On Ultrix 4.3, @code{getgroups (0, NULL)} always fails. See macro
+@samp{AC_FUNC_GETGROUPS}.
+@item
+On very old systems, this function operated on an array of @samp{int},
+even though that was a different size than an array of @samp{gid_t}.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+It is unspecified whether the effective group id will be included in
+the returned list, nor whether the list will be sorted in any
+particular order. For that matter, some platforms include the
+effective group id twice, if it is also a member of the current
+supplemental group ids.
+@end itemize
diff --git a/gnulib/doc/posix-functions/gethostent.texi b/gnulib/doc/posix-functions/gethostent.texi
new file mode 100644
index 00000000..13016c8f
--- /dev/null
+++ b/gnulib/doc/posix-functions/gethostent.texi
@@ -0,0 +1,18 @@
+@node gethostent
+@section @code{gethostent}
+@findex gethostent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/gethostent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/gethostid.texi b/gnulib/doc/posix-functions/gethostid.texi
new file mode 100644
index 00000000..fe08fa6f
--- /dev/null
+++ b/gnulib/doc/posix-functions/gethostid.texi
@@ -0,0 +1,18 @@
+@node gethostid
+@section @code{gethostid}
+@findex gethostid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/gethostid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/gethostname.texi b/gnulib/doc/posix-functions/gethostname.texi
new file mode 100644
index 00000000..69e38386
--- /dev/null
+++ b/gnulib/doc/posix-functions/gethostname.texi
@@ -0,0 +1,21 @@
+@node gethostname
+@section @code{gethostname}
+@findex gethostname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/gethostname.html}
+
+Gnulib module: gethostname
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On mingw, this function has a prototype that differs from that
+specified by POSIX, and it is defined only in the ws2_32 library.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+If the given buffer is too small for the host name, some implementations
+fail with @code{EINVAL}, instead of returning a truncated host name.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getitimer.texi b/gnulib/doc/posix-functions/getitimer.texi
new file mode 100644
index 00000000..f4627f1c
--- /dev/null
+++ b/gnulib/doc/posix-functions/getitimer.texi
@@ -0,0 +1,18 @@
+@node getitimer
+@section @code{getitimer}
+@findex getitimer
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getitimer.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getline.texi b/gnulib/doc/posix-functions/getline.texi
new file mode 100644
index 00000000..e00f6b0c
--- /dev/null
+++ b/gnulib/doc/posix-functions/getline.texi
@@ -0,0 +1,28 @@
+@node getline
+@section @code{getline}
+@findex getline
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getline.html}
+
+Gnulib module: getline
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5.
+@item
+This function is missing a declaration on some platforms:
+BeOS.
+@item
+Some platforms provide a function by this name but with the wrong
+signature, for example in -linet.
+@item
+This function crashes when passed a pointer to a NULL buffer together with a
+pointer to a non-zero buffer size on some platforms:
+FreeBSD 8.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/getlogin.texi b/gnulib/doc/posix-functions/getlogin.texi
new file mode 100644
index 00000000..b7aebeda
--- /dev/null
+++ b/gnulib/doc/posix-functions/getlogin.texi
@@ -0,0 +1,18 @@
+@node getlogin
+@section @code{getlogin}
+@findex getlogin
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getlogin.html}
+
+Gnulib module: getlogin
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/getlogin_r.texi b/gnulib/doc/posix-functions/getlogin_r.texi
new file mode 100644
index 00000000..c8aef765
--- /dev/null
+++ b/gnulib/doc/posix-functions/getlogin_r.texi
@@ -0,0 +1,18 @@
+@node getlogin_r
+@section @code{getlogin_r}
+@findex getlogin_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getlogin_r.html}
+
+Gnulib module: getlogin_r
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/getmsg.texi b/gnulib/doc/posix-functions/getmsg.texi
new file mode 100644
index 00000000..f1604e17
--- /dev/null
+++ b/gnulib/doc/posix-functions/getmsg.texi
@@ -0,0 +1,18 @@
+@node getmsg
+@section @code{getmsg}
+@findex getmsg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getmsg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getnameinfo.texi b/gnulib/doc/posix-functions/getnameinfo.texi
new file mode 100644
index 00000000..84473bd1
--- /dev/null
+++ b/gnulib/doc/posix-functions/getnameinfo.texi
@@ -0,0 +1,18 @@
+@node getnameinfo
+@section @code{getnameinfo}
+@findex getnameinfo
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html}
+
+Gnulib module: getaddrinfo
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 7, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/getnetbyaddr.texi b/gnulib/doc/posix-functions/getnetbyaddr.texi
new file mode 100644
index 00000000..475ee09b
--- /dev/null
+++ b/gnulib/doc/posix-functions/getnetbyaddr.texi
@@ -0,0 +1,18 @@
+@node getnetbyaddr
+@section @code{getnetbyaddr}
+@findex getnetbyaddr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getnetbyaddr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getnetbyname.texi b/gnulib/doc/posix-functions/getnetbyname.texi
new file mode 100644
index 00000000..d26d4d8f
--- /dev/null
+++ b/gnulib/doc/posix-functions/getnetbyname.texi
@@ -0,0 +1,18 @@
+@node getnetbyname
+@section @code{getnetbyname}
+@findex getnetbyname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getnetbyname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getnetent.texi b/gnulib/doc/posix-functions/getnetent.texi
new file mode 100644
index 00000000..e646f6a4
--- /dev/null
+++ b/gnulib/doc/posix-functions/getnetent.texi
@@ -0,0 +1,18 @@
+@node getnetent
+@section @code{getnetent}
+@findex getnetent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getnetent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getopt.texi b/gnulib/doc/posix-functions/getopt.texi
new file mode 100644
index 00000000..822dbb3e
--- /dev/null
+++ b/gnulib/doc/posix-functions/getopt.texi
@@ -0,0 +1,63 @@
+@node getopt
+@section @code{getopt}
+@findex getopt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getopt.html}
+
+Gnulib module: getopt-posix or getopt-gnu
+
+The module @code{getopt-gnu} has support for ``long options'' and for
+``options that take optional arguments''. Compared to the API defined by POSIX,
+it adds a header file @code{<getopt.h>} and a function @code{getopt_long}.
+
+Portability problems fixed by either Gnulib module @code{getopt-posix} or @code{getopt-gnu}:
+@itemize
+@item
+The @code{getopt} function keeps some internal state that cannot be explicitly
+reset on some platforms:
+mingw.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{getopt-gnu}:
+@itemize
+@item
+The function @code{getopt} does not support the @samp{+} flag in the options
+string on some platforms:
+MacOS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10.
+@item
+The function @code{getopt} does not obey the @samp{-} flag in the options
+string when @env{POSIXLY_CORRECT} is set on some platforms:
+Cygwin 1.7.0.
+@item
+The function @code{getopt} does not support options with optional arguments
+on some platforms:
+MacOS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 10, Cygwin 1.5.x.
+@item
+The function @code{getopt_long} is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Interix 3.5.
+@item
+The function @code{getopt_long_only} is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, AIX 5.1, HP-UX 11, IRIX 6.5,
+OSF/1 5.1, Solaris 9, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The default behavior of the glibc implementation of @code{getopt} allows
+mixing option and non-option arguments on the command line in any order.
+Other implementations, such as the one in Cygwin, enforce strict POSIX
+compliance: they require that the option arguments precede the non-option
+arguments. This is something to watch out in your program's
+testsuite.
+@item
+The glibc implementation allows a complete reset of the environment,
+including re-checking for @env{POSIXLY_CORRECT}, by setting
+@code{optind} to 0. Other implementations provide @code{optreset},
+causing a reset by setting it non-zero, although it does not
+necessarily re-read @env{POSIXLY_CORRECT}.
+@item
+Mixing a leading @samp{-} or @samp{+} with a leading @samp{:} in the
+optstring argument has inconsistent effects across platforms.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpeername.texi b/gnulib/doc/posix-functions/getpeername.texi
new file mode 100644
index 00000000..af84e084
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpeername.texi
@@ -0,0 +1,22 @@
+@node getpeername
+@section @code{getpeername}
+@findex getpeername
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpeername.html}
+
+Gnulib module: getpeername
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for
+@code{getpeername} are not placed in @code{errno}, and
+@code{WSAGetLastError} must be used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some platforms don't have a @code{socklen_t} type; in this case this function's
+third argument type is @samp{int *}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpgid.texi b/gnulib/doc/posix-functions/getpgid.texi
new file mode 100644
index 00000000..c48dfc92
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpgid.texi
@@ -0,0 +1,18 @@
+@node getpgid
+@section @code{getpgid}
+@findex getpgid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpgid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpgrp.texi b/gnulib/doc/posix-functions/getpgrp.texi
new file mode 100644
index 00000000..85d5aeda
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpgrp.texi
@@ -0,0 +1,18 @@
+@node getpgrp
+@section @code{getpgrp}
+@findex getpgrp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpgrp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpid.texi b/gnulib/doc/posix-functions/getpid.texi
new file mode 100644
index 00000000..b5728fe5
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpid.texi
@@ -0,0 +1,15 @@
+@node getpid
+@section @code{getpid}
+@findex getpid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpmsg.texi b/gnulib/doc/posix-functions/getpmsg.texi
new file mode 100644
index 00000000..0dfc65e6
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpmsg.texi
@@ -0,0 +1,18 @@
+@node getpmsg
+@section @code{getpmsg}
+@findex getpmsg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpmsg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getppid.texi b/gnulib/doc/posix-functions/getppid.texi
new file mode 100644
index 00000000..bbe2c383
--- /dev/null
+++ b/gnulib/doc/posix-functions/getppid.texi
@@ -0,0 +1,18 @@
+@node getppid
+@section @code{getppid}
+@findex getppid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getppid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpriority.texi b/gnulib/doc/posix-functions/getpriority.texi
new file mode 100644
index 00000000..90da513b
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpriority.texi
@@ -0,0 +1,18 @@
+@node getpriority
+@section @code{getpriority}
+@findex getpriority
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpriority.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getprotobyname.texi b/gnulib/doc/posix-functions/getprotobyname.texi
new file mode 100644
index 00000000..ca61ce83
--- /dev/null
+++ b/gnulib/doc/posix-functions/getprotobyname.texi
@@ -0,0 +1,18 @@
+@node getprotobyname
+@section @code{getprotobyname}
+@findex getprotobyname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getprotobyname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getprotobynumber.texi b/gnulib/doc/posix-functions/getprotobynumber.texi
new file mode 100644
index 00000000..48cfa437
--- /dev/null
+++ b/gnulib/doc/posix-functions/getprotobynumber.texi
@@ -0,0 +1,18 @@
+@node getprotobynumber
+@section @code{getprotobynumber}
+@findex getprotobynumber
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getprotobynumber.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getprotoent.texi b/gnulib/doc/posix-functions/getprotoent.texi
new file mode 100644
index 00000000..3bf24af6
--- /dev/null
+++ b/gnulib/doc/posix-functions/getprotoent.texi
@@ -0,0 +1,18 @@
+@node getprotoent
+@section @code{getprotoent}
+@findex getprotoent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getprotoent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpwent.texi b/gnulib/doc/posix-functions/getpwent.texi
new file mode 100644
index 00000000..7e1a1658
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpwent.texi
@@ -0,0 +1,18 @@
+@node getpwent
+@section @code{getpwent}
+@findex getpwent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpwent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpwnam.texi b/gnulib/doc/posix-functions/getpwnam.texi
new file mode 100644
index 00000000..32512970
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpwnam.texi
@@ -0,0 +1,18 @@
+@node getpwnam
+@section @code{getpwnam}
+@findex getpwnam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpwnam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpwnam_r.texi b/gnulib/doc/posix-functions/getpwnam_r.texi
new file mode 100644
index 00000000..a3598b60
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpwnam_r.texi
@@ -0,0 +1,18 @@
+@node getpwnam_r
+@section @code{getpwnam_r}
+@findex getpwnam_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpwnam_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpwuid.texi b/gnulib/doc/posix-functions/getpwuid.texi
new file mode 100644
index 00000000..fc2ca4a9
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpwuid.texi
@@ -0,0 +1,18 @@
+@node getpwuid
+@section @code{getpwuid}
+@findex getpwuid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpwuid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getpwuid_r.texi b/gnulib/doc/posix-functions/getpwuid_r.texi
new file mode 100644
index 00000000..8d608a9e
--- /dev/null
+++ b/gnulib/doc/posix-functions/getpwuid_r.texi
@@ -0,0 +1,18 @@
+@node getpwuid_r
+@section @code{getpwuid_r}
+@findex getpwuid_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getpwuid_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getrlimit.texi b/gnulib/doc/posix-functions/getrlimit.texi
new file mode 100644
index 00000000..add8e705
--- /dev/null
+++ b/gnulib/doc/posix-functions/getrlimit.texi
@@ -0,0 +1,18 @@
+@node getrlimit
+@section @code{getrlimit}
+@findex getrlimit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getrlimit.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getrusage.texi b/gnulib/doc/posix-functions/getrusage.texi
new file mode 100644
index 00000000..08705c6c
--- /dev/null
+++ b/gnulib/doc/posix-functions/getrusage.texi
@@ -0,0 +1,21 @@
+@node getrusage
+@section @code{getrusage}
+@findex getrusage
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getrusage.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@item
+Many platforms don't fill in all the fields of @code{struct rusage} with
+meaningful values.
+@end itemize
diff --git a/gnulib/doc/posix-functions/gets.texi b/gnulib/doc/posix-functions/gets.texi
new file mode 100644
index 00000000..1f4573bd
--- /dev/null
+++ b/gnulib/doc/posix-functions/gets.texi
@@ -0,0 +1,20 @@
+@node gets
+@section @code{gets}
+@findex gets
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/gets.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function should never be used, because it can overflow any given buffer.
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getservbyname.texi b/gnulib/doc/posix-functions/getservbyname.texi
new file mode 100644
index 00000000..d2293258
--- /dev/null
+++ b/gnulib/doc/posix-functions/getservbyname.texi
@@ -0,0 +1,18 @@
+@node getservbyname
+@section @code{getservbyname}
+@findex getservbyname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getservbyname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getservbyport.texi b/gnulib/doc/posix-functions/getservbyport.texi
new file mode 100644
index 00000000..a880fe26
--- /dev/null
+++ b/gnulib/doc/posix-functions/getservbyport.texi
@@ -0,0 +1,18 @@
+@node getservbyport
+@section @code{getservbyport}
+@findex getservbyport
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getservbyport.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getservent.texi b/gnulib/doc/posix-functions/getservent.texi
new file mode 100644
index 00000000..cf40a2d4
--- /dev/null
+++ b/gnulib/doc/posix-functions/getservent.texi
@@ -0,0 +1,18 @@
+@node getservent
+@section @code{getservent}
+@findex getservent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getservent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getsid.texi b/gnulib/doc/posix-functions/getsid.texi
new file mode 100644
index 00000000..0db8cdac
--- /dev/null
+++ b/gnulib/doc/posix-functions/getsid.texi
@@ -0,0 +1,18 @@
+@node getsid
+@section @code{getsid}
+@findex getsid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getsid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getsockname.texi b/gnulib/doc/posix-functions/getsockname.texi
new file mode 100644
index 00000000..7a888c48
--- /dev/null
+++ b/gnulib/doc/posix-functions/getsockname.texi
@@ -0,0 +1,22 @@
+@node getsockname
+@section @code{getsockname}
+@findex getsockname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html}
+
+Gnulib module: getsockname
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for
+@code{getsockname} are not placed in @code{errno}, and
+@code{WSAGetLastError} must be used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some platforms don't have a @code{socklen_t} type; in this case this function's
+third argument type is @samp{int *}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getsockopt.texi b/gnulib/doc/posix-functions/getsockopt.texi
new file mode 100644
index 00000000..3695fc1c
--- /dev/null
+++ b/gnulib/doc/posix-functions/getsockopt.texi
@@ -0,0 +1,30 @@
+@node getsockopt
+@section @code{getsockopt}
+@findex getsockopt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html}
+
+Gnulib module: getsockopt
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for
+@code{getsockopt} are not placed in @code{errno}, and
+@code{WSAGetLastError} must be used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@item
+Some platforms don't have a @code{socklen_t} type; in this case this function's
+fifth argument type is @samp{int *}.
+@item
+Many socket options are not available on all platforms.
+@item
+BeOS has the @code{setsockopt} function, but not the @code{getsockopt}
+function.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getsubopt.texi b/gnulib/doc/posix-functions/getsubopt.texi
new file mode 100644
index 00000000..a5ce0fd7
--- /dev/null
+++ b/gnulib/doc/posix-functions/getsubopt.texi
@@ -0,0 +1,22 @@
+@node getsubopt
+@section @code{getsubopt}
+@findex getsubopt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getsubopt.html}
+
+Gnulib module: getsubopt
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is declared in @code{unistd.h} instead of
+@code{stdlib.h} on some platforms:
+Cygwin 1.7.1.
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/gettimeofday.texi b/gnulib/doc/posix-functions/gettimeofday.texi
new file mode 100644
index 00000000..fda59a3e
--- /dev/null
+++ b/gnulib/doc/posix-functions/gettimeofday.texi
@@ -0,0 +1,37 @@
+@node gettimeofday
+@section @code{gettimeofday}
+@findex gettimeofday
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/gettimeofday.html}
+
+Gnulib module: gettimeofday
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+This function is declared with a nonstandard function prototype (only one
+argument, or ``...'' after the first argument) on some platforms.
+@item
+On some platforms, the second argument has type @code{struct
+timezone*} rather than @code{void *}, making it an error to redeclare
+the function with the POSIX signature:
+glibc.
+However, rather than penalize these systems with a replacement
+function, gnulib defines @code{GETTIMEOFDAY_TIMEZONE} to the
+appropriate type for use in avoiding a compiler warning if assigning
+@code{gettimeofday} to a function pointer.
+@item
+On some platforms, @code{gettimeofday} clobbers the buffer in which
+@code{localtime} returns its result:
+MacOS X 10.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Behavior is non-portable if the second argument to @code{gettimeofday}
+is not @code{NULL}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getuid.texi b/gnulib/doc/posix-functions/getuid.texi
new file mode 100644
index 00000000..d52198ab
--- /dev/null
+++ b/gnulib/doc/posix-functions/getuid.texi
@@ -0,0 +1,18 @@
+@node getuid
+@section @code{getuid}
+@findex getuid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getuid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getutxent.texi b/gnulib/doc/posix-functions/getutxent.texi
new file mode 100644
index 00000000..bcb5ac03
--- /dev/null
+++ b/gnulib/doc/posix-functions/getutxent.texi
@@ -0,0 +1,18 @@
+@node getutxent
+@section @code{getutxent}
+@findex getutxent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getutxent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getutxid.texi b/gnulib/doc/posix-functions/getutxid.texi
new file mode 100644
index 00000000..6d8cf9a8
--- /dev/null
+++ b/gnulib/doc/posix-functions/getutxid.texi
@@ -0,0 +1,18 @@
+@node getutxid
+@section @code{getutxid}
+@findex getutxid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getutxid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getutxline.texi b/gnulib/doc/posix-functions/getutxline.texi
new file mode 100644
index 00000000..f93569f0
--- /dev/null
+++ b/gnulib/doc/posix-functions/getutxline.texi
@@ -0,0 +1,18 @@
+@node getutxline
+@section @code{getutxline}
+@findex getutxline
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getutxline.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getwc.texi b/gnulib/doc/posix-functions/getwc.texi
new file mode 100644
index 00000000..7a2e9e85
--- /dev/null
+++ b/gnulib/doc/posix-functions/getwc.texi
@@ -0,0 +1,21 @@
+@node getwc
+@section @code{getwc}
+@findex getwc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getwc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/getwchar.texi b/gnulib/doc/posix-functions/getwchar.texi
new file mode 100644
index 00000000..ab050f06
--- /dev/null
+++ b/gnulib/doc/posix-functions/getwchar.texi
@@ -0,0 +1,21 @@
+@node getwchar
+@section @code{getwchar}
+@findex getwchar
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/getwchar.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/glob.texi b/gnulib/doc/posix-functions/glob.texi
new file mode 100644
index 00000000..3f734893
--- /dev/null
+++ b/gnulib/doc/posix-functions/glob.texi
@@ -0,0 +1,23 @@
+@node glob
+@section @code{glob}
+@findex glob
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/glob.html}
+
+Gnulib module: glob
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, mingw, BeOS.
+@item
+This function may list symbolic links to nonexistent files among the results,
+on some platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some platforms may store additional flags in the @code{gl_flags} field.
+@end itemize
diff --git a/gnulib/doc/posix-functions/globfree.texi b/gnulib/doc/posix-functions/globfree.texi
new file mode 100644
index 00000000..b8ddecb7
--- /dev/null
+++ b/gnulib/doc/posix-functions/globfree.texi
@@ -0,0 +1,18 @@
+@node globfree
+@section @code{globfree}
+@findex globfree
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/globfree.html}
+
+Gnulib module: glob
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/gmtime.texi b/gnulib/doc/posix-functions/gmtime.texi
new file mode 100644
index 00000000..3c605013
--- /dev/null
+++ b/gnulib/doc/posix-functions/gmtime.texi
@@ -0,0 +1,15 @@
+@node gmtime
+@section @code{gmtime}
+@findex gmtime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/gmtime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/gmtime_r.texi b/gnulib/doc/posix-functions/gmtime_r.texi
new file mode 100644
index 00000000..18578007
--- /dev/null
+++ b/gnulib/doc/posix-functions/gmtime_r.texi
@@ -0,0 +1,21 @@
+@node gmtime_r
+@section @code{gmtime_r}
+@findex gmtime_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/gmtime_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+Some platforms define a function of this name that is incompatible to POSIX:
+HP-UX 10.
+@end itemize
diff --git a/gnulib/doc/posix-functions/google-ranking.txt b/gnulib/doc/posix-functions/google-ranking.txt
new file mode 100644
index 00000000..eaf46396
--- /dev/null
+++ b/gnulib/doc/posix-functions/google-ranking.txt
@@ -0,0 +1,1114 @@
+free 2420000
+write 1570000
+time 768000
+strlen 702000
+index 697000
+printf 690000
+fprintf 641000
+errno 616000
+strcmp 604000
+malloc 574000
+memset 556000
+sprintf 550000
+read 547000
+remove 527000
+strcpy 510000
+exit 491000
+system 459000
+memcpy 455000
+wait 388000
+close 334000
+fclose 328000
+assert 327000
+atoi 316000
+fopen 315000
+select 312000
+strncpy 309000
+signal 306000
+strncmp 304000
+times 300000
+strchr 294000
+log 259000
+access 255000
+socket 244000
+open 227000
+stat 220000
+fgets 212000
+link 206000
+fflush 202000
+strcat 201000
+connect 198000
+fcntl 195000
+snprintf 185000
+send 182000
+random 172000
+strdup 171000
+accept 169000
+abort 159000
+memcmp 156000
+strerror 154000
+sscanf 153000
+stdin 149000
+strcasecmp 146000
+exp 145000
+realloc 144000
+va_start 141000
+gets 139000
+ioctl 136000
+strstr 133000
+isspace 133000
+getenv 131000
+strrchr 129000
+isdigit 125000
+va_end 122000
+clock 120000
+sleep 119000
+getopt 119000
+perror 111000
+unlink 110000
+pipe 110000
+kill 110000
+calloc 108000
+fputs 107000
+getpid 97500
+memmove 96000
+bzero 92400
+fwrite 90600
+sync 89900
+sqrt 88800
+round 87800
+optarg 85900
+strtol 83200
+poll 82900
+htons 82500
+syslog 82300
+nice 81800
+strncasecmp 81500
+fabs 76600
+mmap 76400
+toupper 75300
+abs 73500
+ntohs 73100
+qsort 72600
+fork 72500
+puts 70100
+tolower 69400
+fseek 67500
+bcopy 66400
+gettimeofday 66300
+shutdown 65900
+fread 65900
+rename 64900
+strtok 60600
+fileno 60400
+truncate 60100
+getuid 60100
+FD_ZERO 59900
+fputc 58600
+htonl 58300
+FD_SET 56900
+feof 55300
+ntohl 53200
+fstat 52300
+atof 52200
+floor 51800
+chdir 51500
+gethostbyname 51200
+isalpha 50400
+va_arg 49200
+localtime 49000
+putchar 48900
+remainder 48800
+sin 48700
+alarm 48600
+recv 48100
+inet_ntoa 47500
+getc 46900
+ferror 46900
+waitpid 46600
+ctime 46400
+putc 46200
+usleep 45800
+setjmp 45700
+mkdir 45500
+fscanf 43900
+cos 43700
+lseek 43600
+FD_ISSET 43100
+closedir 42900
+ftell 42400
+readdir 42100
+bind 41800
+vfprintf 41500
+dup 41400
+dup2 41300
+y1 41200
+isprint 41200
+strtoul 40900
+setsockopt 40900
+isalnum 39800
+vsprintf 39300
+opendir 39300
+gethostname 39000
+strftime 38800
+rand 38200
+atexit 37700
+vsnprintf 36400
+raise 36000
+isupper 35900
+strncat 35600
+crypt 35400
+fgetc 35100
+basename 34800
+fdopen 34700
+setlocale 34500
+umask 34400
+listen 33900
+symlink 32900
+chmod 32800
+getcwd 32200
+pow 31800
+pthread_mutex_unlock 31700
+getpwuid 31600
+geteuid 31300
+setuid 30100
+lstat 29600
+inet_addr 29500
+pthread_mutex_lock 29300
+popen 29100
+dirname 29100
+srand 29000
+isatty 29000
+ceil 28900
+atol 28600
+getpwnam 28300
+environ 28300
+pthread_create 27600
+pclose 27200
+islower 27200
+longjmp 26500
+_exit 26100
+timezone 25900
+div 25800
+sendto 24900
+getsockname 24600
+gmtime 24300
+readlink 24200
+sigemptyset 23100
+recvfrom 23000
+sigaction 22400
+putenv 22100
+strtod 21900
+munmap 21800
+strpbrk 21700
+utime 21500
+uname 21500
+chown 21400
+scanf 21300
+mktime 20900
+rmdir 19800
+ungetc 19600
+setenv 19400
+ftruncate 19400
+atan2 19300
+glob 18900
+setgid 18600
+setsid 18500
+gethostbyaddr 18500
+getgid 18300
+execvp 18300
+memchr 17800
+openlog 17700
+sysconf 17500
+log10 17400
+sigaddset 17000
+strspn 16800
+isxdigit 16800
+getpeername 16300
+pthread_mutex_init 16200
+tcgetattr 16100
+j1 15600
+getchar 15400
+dlopen 15300
+setvbuf 15000
+creat 15000
+srandom 14800
+freopen 14600
+execl 14300
+y0 13900
+execv 13800
+regcomp 13600
+setbuf 13400
+regexec 13300
+pthread_join 12800
+mktemp 12800
+labs 12800
+vprintf 12700
+vfork 12600
+getgrnam 12600
+tcsetattr 12500
+sigprocmask 12400
+trunc 12300
+tmpfile 12000
+dlsym 11900
+atan 11800
+mkstemp 11600
+h_errno 11300
+FD_CLR 11300
+acos 11100
+seteuid 10800
+inet_ntop 10800
+getegid 10800
+iscntrl 10700
+getaddrinfo 10700
+fchmod 10700
+rindex 10600
+pthread_self 10600
+writev 10200
+pthread_exit 10100
+getppid 10100
+tan 10000
+ftime 10000
+clearerr 10000
+asctime 10000
+setrlimit 9000
+pthread_mutex_destroy 9000
+pthread_cond_wait 9000
+isgraph 9000
+getwd 9000
+getrlimit 9000
+getlogin 9000
+execlp 9000
+dlerror 9000
+ctan 9000
+bsearch 9000
+ttyname 8000
+tmpnam 8000
+strcspn 8000
+shmget 8000
+setitimer 8000
+regfree 8000
+nanosleep 8000
+ispunct 8000
+inet_pton 8000
+fmod 8000
+dlclose 8000
+asin 8000
+unsetenv 7000
+strtok_r 7000
+shmat 7000
+rint 7000
+regerror 7000
+pthread_cond_signal 7000
+pthread_cond_init 7000
+localtime_r 7000
+getgrgid 7000
+freeaddrinfo 7000
+fnmatch 7000
+fchown 7000
+difftime 7000
+wcslen 6000
+tempnam 6000
+srand48 6000
+realpath 6000
+modf 6000
+daylight 6000
+closelog 6000
+tanh 5000
+sinh 5000
+shmdt 5000
+shmctl 5000
+pthread_cond_destroy 5000
+pthread_cancel 5000
+mkfifo 5000
+ldexp 5000
+getnameinfo 5000
+gai_strerror 5000
+cosh 5000
+strtoull 4000
+strtoll 4000
+sigsuspend 4000
+pthread_sigmask 4000
+pthread_detach 4000
+pthread_cond_broadcast 4000
+lrand48 4000
+logf 4000
+fsetpos 4000
+frexp 4000
+fgetpos 4000
+drand48 4000
+cfsetospeed 4000
+cfsetispeed 4000
+ulimit 3000
+swab 3000
+strptime 3000
+sigset 3000
+semop 3000
+sem_wait 3000
+pthread_setspecific 3000
+pthread_mutex_trylock 3000
+pthread_key_create 3000
+pthread_getspecific 3000
+pthread_cond_timedwait 3000
+nan 3000
+mlock 3000
+mbstowcs 3000
+ldiv 3000
+iconv_open 3000
+exp2 3000
+wcstombs 2000
+tcflush 2000
+sqrtf 2000
+setkey 2000
+semget 2000
+semctl 2000
+sem_post 2000
+sem_init 2000
+sem_destroy 2000
+pthread_once 2000
+pthread_cleanup_push 2000
+powf 2000
+msgsnd 2000
+msgrcv 2000
+msgget 2000
+msgctl 2000
+getdate 2000
+fmin 2000
+fmax 2000
+execle 2000
+erfc 2000
+cosf 2000
+conj 2000
+clock_gettime 2000
+cbrt 2000
+atanh 2000
+asinh 2000
+acosh 2000
+lgamma 1000
+ftok 1000
+pause 900
+endpwent 900
+wcscmp 800
+setpgid 800
+sendmsg 800
+pthread_mutexattr_init 800
+pthread_equal 800
+pthread_attr_destroy 800
+isnan 800
+isblank 800
+isascii 800
+hypot 800
+getpwent 800
+getgrent 800
+wcscpy 700
+vsscanf 700
+tzset 700
+toascii 700
+tcdrain 700
+socketpair 700
+sigsetjmp 700
+siglongjmp 700
+sigismember 700
+setpwent 700
+setpgrp 700
+sched_yield 700
+rewinddir 700
+rewind 700
+remque 700
+pthread_setschedparam 700
+pthread_setcancelstate 700
+pthread_mutexattr_settype 700
+pthread_attr_setstacksize 700
+pthread_attr_setdetachstate 700
+pthread_attr_init 700
+lchown 700
+iconv_close 700
+gmtime_r 700
+globfree 700
+getsockopt 700
+getservbyport 700
+getservbyname 700
+getrusage 700
+getpgrp 700
+getgroups 700
+fchdir 700
+execve 700
+endgrent 700
+cexp 700
+bcmp 700
+wcsncpy 600
+wcschr 600
+wcscat 600
+va_copy 600
+tzname 600
+tcsetpgrp 600
+strerror_r 600
+sigwait 600
+sigfillset 600
+sigdelset 600
+setreuid 600
+setgrent 600
+setegid 600
+seekdir 600
+sched_setscheduler 600
+sched_get_priority_max 600
+recvmsg 600
+putmsg 600
+pthread_setcanceltype 600
+pthread_rwlock_init 600
+pthread_kill 600
+pthread_cleanup_pop 600
+pthread_attr_setscope 600
+pthread_attr_setschedparam 600
+nl_langinfo 600
+mknod 600
+memccpy 600
+mbtowc 600
+mbrtowc 600
+log2 600
+log1p 600
+lockf 600
+killpg 600
+insque 600
+if_nametoindex 600
+getprotobynumber 600
+getprotobyname 600
+getpgid 600
+getitimer 600
+fsync 600
+fseeko 600
+floorf 600
+fabsf 600
+expf 600
+dbm_store 600
+dbm_open 600
+dbm_fetch 600
+dbm_close 600
+copysign 600
+cfgetospeed 600
+atoll 600
+wprintf 500
+wcwidth 500
+wctype 500
+wctomb 500
+vfscanf 500
+unlockpt 500
+towupper 500
+towlower 500
+telldir 500
+tcsendbreak 500
+tcgetpgrp 500
+swprintf 500
+strxfrm 500
+strcoll 500
+statvfs 500
+sigpause 500
+siginterrupt 500
+sigignore 500
+setregid 500
+setpriority 500
+setlogmask 500
+readv 500
+readdir_r 500
+pwrite 500
+ptsname 500
+pthread_testcancel 500
+pthread_rwlock_unlock 500
+pthread_mutexattr_destroy 500
+pthread_attr_setschedpolicy 500
+pathconf 500
+munlock 500
+msync 500
+mprotect 500
+mblen 500
+logb 500
+localeconv 500
+iswspace 500
+isfinite 500
+iconv 500
+hsearch 500
+grantpt 500
+getpwuid_r 500
+getpwnam_r 500
+getmsg 500
+gethostid 500
+fdatasync 500
+expm1 500
+encrypt 500
+cabs 500
+atan2f 500
+_tolower 500
+_setjmp 500
+wcsstr 400
+wcsncmp 400
+wcrtomb 400
+vscanf 400
+ualarm 400
+tsearch 400
+strtof 400
+sqrtl 400
+sigrelse 400
+sigpending 400
+signbit 400
+sighold 400
+sigaltstack 400
+sem_trywait 400
+sched_getparam 400
+pthread_rwlock_wrlock 400
+pthread_rwlock_rdlock 400
+pthread_key_delete 400
+pthread_getschedparam 400
+pthread_attr_getstacksize 400
+munlockall 400
+mrand48 400
+mlockall 400
+mbrlen 400
+logl 400
+log10f 400
+iswprint 400
+iswdigit 400
+iswalnum 400
+if_indextoname 400
+hcreate 400
+getsid 400
+getprotoent 400
+getpriority 400
+getnetbyname 400
+getnetbyaddr 400
+gcvt 400
+fwprintf 400
+funlockfile 400
+fpathconf 400
+flockfile 400
+fcvt 400
+fabsl 400
+endservent 400
+endhostent 400
+ecvt 400
+dbm_nextkey 400
+dbm_firstkey 400
+cosl 400
+cfgetispeed 400
+ceilf 400
+asctime_r 400
+acosf 400
+_toupper 400
+_longjmp 400
+wcstol 300
+wcsspn 300
+wcsrchr 300
+wcspbrk 300
+wcsncat 300
+wcscoll 300
+waitid 300
+vswprintf 300
+utimes 300
+twalk 300
+timer_create 300
+tanl 300
+sinhf 300
+sigtimedwait 300
+shm_open 300
+setstate 300
+setprotoent 300
+setcontext 300
+sem_open 300
+sem_getvalue 300
+sched_setparam 300
+sched_rr_get_interval 300
+sched_getscheduler 300
+scalbn 300
+scalb 300
+putc_unlocked 300
+pthread_rwlock_destroy 300
+pthread_condattr_init 300
+pthread_attr_setinheritsched 300
+pthread_attr_getschedparam 300
+pthread_atfork 300
+powl 300
+posix_memalign 300
+nrand48 300
+nextafter 300
+mbsrtowcs 300
+lrintf 300
+lrint 300
+iswxdigit 300
+iswupper 300
+iswlower 300
+iswctype 300
+iswcntrl 300
+iswalpha 300
+isinf 300
+initstate 300
+ilogb 300
+hypotf 300
+getservent 300
+getnetent 300
+getcontext 300
+getc_unlocked 300
+ftello 300
+frexpl 300
+fmodf 300
+floorl 300
+expl 300
+erand48 300
+endprotoent 300
+endnetent 300
+dbm_delete 300
+ctermid 300
+csqrt 300
+coshf 300
+confstr 300
+clock_getres 300
+cimag 300
+catclose 300
+aio_write 300
+aio_read 300
+wscanf 200
+wmemset 200
+wmemmove 200
+wmemcpy 200
+wmemcmp 200
+wmemchr 200
+wctob 200
+wcsxfrm 200
+wcswidth 200
+wcstoul 200
+wcstok 200
+wcstod 200
+wcsrtombs 200
+wcsftime 200
+wcscspn 200
+vwprintf 200
+vfwprintf 200
+ungetwc 200
+ttyname_r 200
+truncf 200
+timer_settime 200
+timer_getoverrun 200
+timer_delete 200
+tgamma 200
+tdelete 200
+tcflow 200
+tanhl 200
+tanhf 200
+tanf 200
+swscanf 200
+strtoumax 200
+strtold 200
+strtoimax 200
+sinhl 200
+sigwaitinfo 200
+sigqueue 200
+shm_unlink 200
+setutxent 200
+setservent 200
+setnetent 200
+sem_unlink 200
+sem_close 200
+seed48 200
+roundf 200
+putwchar 200
+putwc 200
+pututxline 200
+putpmsg 200
+putchar_unlocked 200
+pthread_setconcurrency 200
+pthread_rwlock_trywrlock 200
+pthread_rwlock_tryrdlock 200
+pthread_mutexattr_setpshared 200
+pthread_condattr_setpshared 200
+pthread_condattr_destroy 200
+pthread_attr_setstackaddr 200
+pthread_attr_getstackaddr 200
+pthread_attr_getscope 200
+pthread_attr_getschedpolicy 200
+pthread_attr_getinheritsched 200
+pthread_attr_getdetachstate 200
+pselect 200
+nftw 200
+mq_unlink 200
+mq_send 200
+mq_receive 200
+mq_open 200
+modfl 200
+modff 200
+mbsinit 200
+makecontext 200
+lround 200
+log10l 200
+lldiv 200
+llabs 200
+lfind 200
+ldexpl 200
+ldexpf 200
+lcong48 200
+l64a 200
+jrand48 200
+iswpunct 200
+iswgraph 200
+isnormal 200
+isastream 200
+if_nameindex 200
+if_freenameindex 200
+hypotl 200
+hdestroy 200
+getwc 200
+getsubopt 200
+getpmsg 200
+getlogin_r 200
+gethostent 200
+getgrnam_r 200
+getgrgid_r 200
+getchar_unlocked 200
+fstatvfs 200
+frexpf 200
+fputws 200
+fputwc 200
+fpclassify 200
+fmodl 200
+fma 200
+fgetws 200
+fgetwc 200
+fdim 200
+fattach 200
+erff 200
+endutxent 200
+dbm_error 200
+ctime_r 200
+csinh 200
+csin 200
+cpow 200
+coshl 200
+copysignf 200
+clock_settime 200
+ceill 200
+ccosh 200
+ccos 200
+catgets 200
+btowc 200
+atanl 200
+atanf 200
+atan2l 200
+aio_return 200
+acosl 200
+acoshf 200
+a64l 200
+_Exit 200
+wordfree 100
+wordexp 100
+wctrans 100
+wcswcs 100
+wcstoumax 100
+wcstoull 100
+wcstoll 100
+wcstold 100
+wcstoimax 100
+wcstof 100
+vwscanf 100
+vswscanf 100
+vfwscanf 100
+towctrans 100
+tfind 100
+tcgetsid 100
+swapcontext 100
+strfmon 100
+sockatmark 100
+sinl 100
+sinf 100
+sethostent 100
+sem_timedwait 100
+scalbnl 100
+scalbnf 100
+scalblnf 100
+scalbln 100
+remquol 100
+remquof 100
+remquo 100
+rand_r 100
+pthread_spin_unlock 100
+pthread_spin_trylock 100
+pthread_spin_lock 100
+pthread_spin_init 100
+pthread_spin_destroy 100
+pthread_rwlockattr_setpshared 100
+pthread_rwlockattr_init 100
+pthread_rwlockattr_getpshared 100
+pthread_rwlockattr_destroy 100
+pthread_rwlock_timedwrlock 100
+pthread_rwlock_timedrdlock 100
+pthread_mutexattr_setprotocol 100
+pthread_mutexattr_setprioceiling 100
+pthread_mutexattr_gettype 100
+pthread_mutexattr_getpshared 100
+pthread_mutexattr_getprotocol 100
+pthread_mutexattr_getprioceiling 100
+pthread_mutex_timedlock 100
+pthread_mutex_setprioceiling 100
+pthread_mutex_getprioceiling 100
+pthread_getconcurrency 100
+pthread_condattr_getpshared 100
+pthread_barrierattr_setpshared 100
+pthread_barrierattr_init 100
+pthread_barrierattr_getpshared 100
+pthread_barrierattr_destroy 100
+pthread_barrier_wait 100
+pthread_barrier_init 100
+pthread_barrier_destroy 100
+pthread_attr_setstack 100
+pthread_attr_setguardsize 100
+pthread_attr_getstack 100
+pthread_attr_getguardsize 100
+pread 100
+posix_fadvise 100
+nexttowardl 100
+nexttoward 100
+nextafterl 100
+nextafterf 100
+nearbyintl 100
+nearbyintf 100
+nearbyint 100
+nanl 100
+nanf 100
+mq_timedsend 100
+mq_timedreceive 100
+mq_setattr 100
+mq_notify 100
+mq_getattr 100
+mq_close 100
+lsearch 100
+lroundl 100
+lroundf 100
+lrintl 100
+logbl 100
+logbf 100
+log2l 100
+log2f 100
+log1pl 100
+log1pf 100
+llroundf 100
+llround 100
+llrintl 100
+llrintf 100
+llrint 100
+lio_listio 100
+lgammal 100
+lgammaf 100
+iswblank 100
+isunordered 100
+isless 100
+isgreater 100
+imaxdiv 100
+imaxabs 100
+ilogbl 100
+ilogbf 100
+getwchar 100
+getutxline 100
+getutxid 100
+getutxent 100
+fwscanf 100
+fwide 100
+ftrylockfile 100
+fmtmsg 100
+fminl 100
+fminf 100
+fmaxl 100
+fmaxf 100
+fmal 100
+fmaf 100
+ffs 100
+feupdateenv 100
+fetestexcept 100
+fesetround 100
+fesetexceptflag 100
+fesetenv 100
+feraiseexcept 100
+feholdexcept 100
+fegetround 100
+fegetexceptflag 100
+fegetenv 100
+feclearexcept 100
+fdiml 100
+expm1l 100
+expm1f 100
+exp2l 100
+exp2f 100
+erfcl 100
+erfcf 100
+erf 100
+dbm_clearerr 100
+ctanh 100
+csqrtf 100
+cproj 100
+cpowf 100
+copysignl 100
+conjl 100
+clogf 100
+clog 100
+clock_nanosleep 100
+cimagl 100
+cimagf 100
+cbrtl 100
+cbrtf 100
+catopen 100
+catanh 100
+casinh 100
+carg 100
+cacosh 100
+cacos 100
+cabsl 100
+cabsf 100
+bsd_signal 100
+atanhl 100
+atanhf 100
+asinl 100
+asinhl 100
+asinhf 100
+asinf 100
+aio_suspend 100
+aio_fsync 100
+aio_error 100
+aio_cancel 100
+acoshl 100
+yn 50
+tgammal 50
+tgammaf 50
+scalblnl 50
+rintf 50
+remainderl 50
+remainderf 50
+pthread_getcpuclockid 50
+pthread_condattr_setclock 50
+pthread_condattr_getclock 50
+posix_spawn 50
+posix_openpt 50
+posix_madvise 50
+posix_fallocate 50
+nexttowardf 50
+llroundl 50
+islessgreater 50
+islessequal 50
+isgreaterequal 50
+fdimf 50
+erfl 50
+ctanl 50
+ctanhl 50
+ctanhf 50
+ctanf 50
+csqrtl 50
+csinl 50
+csinhl 50
+csinhf 50
+csinf 50
+crealf 50
+creal 50
+cprojl 50
+cprojf 50
+cpowl 50
+conjf 50
+clogl 50
+clock_getcpuclockid 50
+cexpl 50
+cexpf 50
+ccosl 50
+ccoshl 50
+ccoshf 50
+ccosf 50
+catanl 50
+catanhl 50
+catanhf 50
+catanf 50
+casinhl 50
+casinhf 50
+casin 50
+cargl 50
+cargf 50
+cacosl 50
+cacoshl 50
+cacoshf 50
+cacosf 50
+pthread_setschedprio 20
+j0 20
+fdetach 20
+casinl 20
+truncl 0
+roundl 0
+rintl 0
+posix_typed_mem_open 0
+posix_typed_mem_get_info 0
+posix_trace_trygetnext_event 0
+posix_trace_trid_eventid_open 0
+posix_trace_timedgetnext_event 0
+posix_trace_stop 0
+posix_trace_start 0
+posix_trace_shutdown 0
+posix_trace_set_filter 0
+posix_trace_rewind 0
+posix_trace_open 0
+posix_trace_getnext_event 0
+posix_trace_get_status 0
+posix_trace_get_filter 0
+posix_trace_get_attr 0
+posix_trace_flush 0
+posix_trace_eventtypelist_rewind 0
+posix_trace_eventtypelist_getnext_id 0
+posix_trace_eventset_ismember 0
+posix_trace_eventset_fill 0
+posix_trace_eventset_empty 0
+posix_trace_eventset_del 0
+posix_trace_eventset_add 0
+posix_trace_eventid_open 0
+posix_trace_eventid_get_name 0
+posix_trace_eventid_equal 0
+posix_trace_event 0
+posix_trace_create_withlog 0
+posix_trace_create 0
+posix_trace_close 0
+posix_trace_clear 0
+posix_trace_attr_setstreamsize 0
+posix_trace_attr_setstreamfullpolicy 0
+posix_trace_attr_setname 0
+posix_trace_attr_setmaxdatasize 0
+posix_trace_attr_setlogsize 0
+posix_trace_attr_setlogfullpolicy 0
+posix_trace_attr_setinherited 0
+posix_trace_attr_init 0
+posix_trace_attr_getstreamsize 0
+posix_trace_attr_getstreamfullpolicy 0
+posix_trace_attr_getname 0
+posix_trace_attr_getmaxusereventsize 0
+posix_trace_attr_getmaxsystemeventsize 0
+posix_trace_attr_getmaxdatasize 0
+posix_trace_attr_getlogsize 0
+posix_trace_attr_getlogfullpolicy 0
+posix_trace_attr_getinherited 0
+posix_trace_attr_getgenversion 0
+posix_trace_attr_getcreatetime 0
+posix_trace_attr_getclockres 0
+posix_trace_attr_destroy 0
+posix_spawnp 0
+posix_spawnattr_setsigmask 0
+posix_spawnattr_setsigdefault 0
+posix_spawnattr_setschedpolicy 0
+posix_spawnattr_setschedparam 0
+posix_spawnattr_setpgroup 0
+posix_spawnattr_setflags 0
+posix_spawnattr_init 0
+posix_spawnattr_getsigmask 0
+posix_spawnattr_getsigdefault 0
+posix_spawnattr_getschedpolicy 0
+posix_spawnattr_getschedparam 0
+posix_spawnattr_getpgroup 0
+posix_spawnattr_getflags 0
+posix_spawnattr_destroy 0
+posix_spawn_file_actions_init 0
+posix_spawn_file_actions_destroy 0
+posix_spawn_file_actions_addopen 0
+posix_spawn_file_actions_adddup2 0
+posix_spawn_file_actions_addclose 0
+posix_mem_offset 0
+jn 0
+ftw 0
+creall 0
+catan 0
+casinf 0
diff --git a/gnulib/doc/posix-functions/grantpt.texi b/gnulib/doc/posix-functions/grantpt.texi
new file mode 100644
index 00000000..ff2a706f
--- /dev/null
+++ b/gnulib/doc/posix-functions/grantpt.texi
@@ -0,0 +1,18 @@
+@node grantpt
+@section @code{grantpt}
+@findex grantpt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/grantpt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/hcreate.texi b/gnulib/doc/posix-functions/hcreate.texi
new file mode 100644
index 00000000..395389fd
--- /dev/null
+++ b/gnulib/doc/posix-functions/hcreate.texi
@@ -0,0 +1,18 @@
+@node hcreate
+@section @code{hcreate}
+@findex hcreate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/hcreate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/hdestroy.texi b/gnulib/doc/posix-functions/hdestroy.texi
new file mode 100644
index 00000000..69dd471f
--- /dev/null
+++ b/gnulib/doc/posix-functions/hdestroy.texi
@@ -0,0 +1,18 @@
+@node hdestroy
+@section @code{hdestroy}
+@findex hdestroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/hdestroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/hsearch.texi b/gnulib/doc/posix-functions/hsearch.texi
new file mode 100644
index 00000000..978c5187
--- /dev/null
+++ b/gnulib/doc/posix-functions/hsearch.texi
@@ -0,0 +1,18 @@
+@node hsearch
+@section @code{hsearch}
+@findex hsearch
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/hsearch.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/htonl.texi b/gnulib/doc/posix-functions/htonl.texi
new file mode 100644
index 00000000..a0152b83
--- /dev/null
+++ b/gnulib/doc/posix-functions/htonl.texi
@@ -0,0 +1,18 @@
+@node htonl
+@section @code{htonl}
+@findex htonl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/htons.texi b/gnulib/doc/posix-functions/htons.texi
new file mode 100644
index 00000000..fdc1398a
--- /dev/null
+++ b/gnulib/doc/posix-functions/htons.texi
@@ -0,0 +1,18 @@
+@node htons
+@section @code{htons}
+@findex htons
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/htons.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/hypot.texi b/gnulib/doc/posix-functions/hypot.texi
new file mode 100644
index 00000000..bff9a6c2
--- /dev/null
+++ b/gnulib/doc/posix-functions/hypot.texi
@@ -0,0 +1,15 @@
+@node hypot
+@section @code{hypot}
+@findex hypot
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/hypot.html}
+
+Gnulib module: hypot
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/hypotf.texi b/gnulib/doc/posix-functions/hypotf.texi
new file mode 100644
index 00000000..d12e868d
--- /dev/null
+++ b/gnulib/doc/posix-functions/hypotf.texi
@@ -0,0 +1,18 @@
+@node hypotf
+@section @code{hypotf}
+@findex hypotf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/hypotf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/hypotl.texi b/gnulib/doc/posix-functions/hypotl.texi
new file mode 100644
index 00000000..2f8f89e4
--- /dev/null
+++ b/gnulib/doc/posix-functions/hypotl.texi
@@ -0,0 +1,18 @@
+@node hypotl
+@section @code{hypotl}
+@findex hypotl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/hypotl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iconv.texi b/gnulib/doc/posix-functions/iconv.texi
new file mode 100644
index 00000000..5811c3df
--- /dev/null
+++ b/gnulib/doc/posix-functions/iconv.texi
@@ -0,0 +1,34 @@
+@node iconv
+@section @code{iconv}
+@findex iconv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iconv.html}
+
+Gnulib module: iconv
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+GNU libiconv is not found if installed in @file{$PREFIX/lib}.
+@item
+Failures are not distinguishable from successful returns on some platforms:
+AIX 5.1, Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, IRIX 5.3, Cygwin, mingw, BeOS,
+when GNU libiconv is not installed.
+@item
+This function was not correctly implemented in glibc versions before 2.2.
+@item
+When @code{iconv} encounters an input character that is valid but that can
+not be converted to the output character set, glibc's and GNU libiconv's
+@code{iconv} stop the conversion. Some other implementations put an
+implementation-defined character into the output buffer. ---
+Gnulib provides higher-level facilities @code{striconv} and @code{striconveh}
+(wrappers around @code{iconv}) that deal with conversion errors in a platform
+independent way.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iconv_close.texi b/gnulib/doc/posix-functions/iconv_close.texi
new file mode 100644
index 00000000..42b0004f
--- /dev/null
+++ b/gnulib/doc/posix-functions/iconv_close.texi
@@ -0,0 +1,21 @@
+@node iconv_close
+@section @code{iconv_close}
+@findex iconv_close
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iconv_close.html}
+
+Gnulib module: iconv
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+GNU libiconv is not found if installed in @file{$PREFIX/lib}.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, IRIX 5.3, Cygwin, mingw, BeOS,
+when GNU libiconv is not installed.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iconv_open.texi b/gnulib/doc/posix-functions/iconv_open.texi
new file mode 100644
index 00000000..8e44b1a5
--- /dev/null
+++ b/gnulib/doc/posix-functions/iconv_open.texi
@@ -0,0 +1,48 @@
+@node iconv_open
+@section @code{iconv_open}
+@findex iconv_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iconv_open.html}
+
+Gnulib module: iconv, iconv_open, iconv_open-utf
+
+Portability problems fixed by either Gnulib module @code{iconv} or @code{iconv_open}:
+@itemize
+@item
+GNU libiconv is not found if installed in @file{$PREFIX/lib}.
+@item
+No converter from EUC-JP to UTF-8 is provided on some platforms:
+HP-UX 11.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{iconv_open}:
+@itemize
+@item
+This function recognizes only non-standard aliases for many encodings (not
+the IANA registered encoding names) on many platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{iconv_open-utf}:
+@itemize
+@item
+This function does not support the encodings UTF-16BE, UTF-16LE, UTF-32BE,
+UTF-32LE on many platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 8.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, IRIX 5.3, Cygwin, mingw, BeOS,
+when GNU libiconv is not installed.
+@item
+For some encodings A and B, this function cannot convert directly from A to B,
+although an indirect conversion from A through UTF-8 to B is possible. This
+occurs on some platforms: Solaris 10. --- Gnulib provides a higher-level
+facility @code{striconveh} (a wrapper around @code{iconv}) that deals with
+this problem.
+@item
+The set of supported encodings and conversions is system dependent.
+@end itemize
diff --git a/gnulib/doc/posix-functions/if_freenameindex.texi b/gnulib/doc/posix-functions/if_freenameindex.texi
new file mode 100644
index 00000000..9ae5ebc8
--- /dev/null
+++ b/gnulib/doc/posix-functions/if_freenameindex.texi
@@ -0,0 +1,18 @@
+@node if_freenameindex
+@section @code{if_freenameindex}
+@findex if_freenameindex
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/if_freenameindex.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 7, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/if_indextoname.texi b/gnulib/doc/posix-functions/if_indextoname.texi
new file mode 100644
index 00000000..d0037341
--- /dev/null
+++ b/gnulib/doc/posix-functions/if_indextoname.texi
@@ -0,0 +1,18 @@
+@node if_indextoname
+@section @code{if_indextoname}
+@findex if_indextoname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/if_indextoname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 7, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/if_nameindex.texi b/gnulib/doc/posix-functions/if_nameindex.texi
new file mode 100644
index 00000000..d3e730be
--- /dev/null
+++ b/gnulib/doc/posix-functions/if_nameindex.texi
@@ -0,0 +1,18 @@
+@node if_nameindex
+@section @code{if_nameindex}
+@findex if_nameindex
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/if_nameindex.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 7, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/if_nametoindex.texi b/gnulib/doc/posix-functions/if_nametoindex.texi
new file mode 100644
index 00000000..e54ce5fe
--- /dev/null
+++ b/gnulib/doc/posix-functions/if_nametoindex.texi
@@ -0,0 +1,18 @@
+@node if_nametoindex
+@section @code{if_nametoindex}
+@findex if_nametoindex
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/if_nametoindex.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 7, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ilogb.texi b/gnulib/doc/posix-functions/ilogb.texi
new file mode 100644
index 00000000..14317f88
--- /dev/null
+++ b/gnulib/doc/posix-functions/ilogb.texi
@@ -0,0 +1,18 @@
+@node ilogb
+@section @code{ilogb}
+@findex ilogb
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ilogb.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ilogbf.texi b/gnulib/doc/posix-functions/ilogbf.texi
new file mode 100644
index 00000000..29e17226
--- /dev/null
+++ b/gnulib/doc/posix-functions/ilogbf.texi
@@ -0,0 +1,18 @@
+@node ilogbf
+@section @code{ilogbf}
+@findex ilogbf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ilogbf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ilogbl.texi b/gnulib/doc/posix-functions/ilogbl.texi
new file mode 100644
index 00000000..1feb201d
--- /dev/null
+++ b/gnulib/doc/posix-functions/ilogbl.texi
@@ -0,0 +1,18 @@
+@node ilogbl
+@section @code{ilogbl}
+@findex ilogbl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ilogbl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/imaxabs.texi b/gnulib/doc/posix-functions/imaxabs.texi
new file mode 100644
index 00000000..6caa6ede
--- /dev/null
+++ b/gnulib/doc/posix-functions/imaxabs.texi
@@ -0,0 +1,18 @@
+@node imaxabs
+@section @code{imaxabs}
+@findex imaxabs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/imaxabs.html}
+
+Gnulib module: imaxabs
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/imaxdiv.texi b/gnulib/doc/posix-functions/imaxdiv.texi
new file mode 100644
index 00000000..18fcbe20
--- /dev/null
+++ b/gnulib/doc/posix-functions/imaxdiv.texi
@@ -0,0 +1,18 @@
+@node imaxdiv
+@section @code{imaxdiv}
+@findex imaxdiv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/imaxdiv.html}
+
+Gnulib module: imaxdiv
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/inet_addr.texi b/gnulib/doc/posix-functions/inet_addr.texi
new file mode 100644
index 00000000..aedddfe4
--- /dev/null
+++ b/gnulib/doc/posix-functions/inet_addr.texi
@@ -0,0 +1,21 @@
+@node inet_addr
+@section @code{inet_addr}
+@findex inet_addr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/inet_addr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+On some old platforms, this function returns a @samp{struct in_addr} rather
+than a scalar type such as @samp{unsigned int} or @samp{unsigned long}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/inet_ntoa.texi b/gnulib/doc/posix-functions/inet_ntoa.texi
new file mode 100644
index 00000000..66790b69
--- /dev/null
+++ b/gnulib/doc/posix-functions/inet_ntoa.texi
@@ -0,0 +1,28 @@
+@node inet_ntoa
+@section @code{inet_ntoa}
+@findex inet_ntoa
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/inet_ntoa.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+The @code{inet_ntoa} function need not be reentrant, and consequently
+is not required to be thread safe. Implementations of
+@code{inet_ntoa} typically write the time stamp into static buffer.
+If two threads call @code{inet_ntoa} at roughly the same time, you
+might end up with the wrong date in one of the threads, or some
+undefined string.
+@end itemize
+
+Note: @code{inet_ntoa} is specific for @acronym{IPv4} addresses.
+A protocol independent function is @code{inet_ntop}.
diff --git a/gnulib/doc/posix-functions/inet_ntop.texi b/gnulib/doc/posix-functions/inet_ntop.texi
new file mode 100644
index 00000000..371223f8
--- /dev/null
+++ b/gnulib/doc/posix-functions/inet_ntop.texi
@@ -0,0 +1,18 @@
+@node inet_ntop
+@section @code{inet_ntop}
+@findex inet_ntop
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/inet_ntop.html}
+
+Gnulib module: inet_ntop
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, OSF/1 4.0, Solaris 2.5.1, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/inet_pton.texi b/gnulib/doc/posix-functions/inet_pton.texi
new file mode 100644
index 00000000..5dbdff1e
--- /dev/null
+++ b/gnulib/doc/posix-functions/inet_pton.texi
@@ -0,0 +1,18 @@
+@node inet_pton
+@section @code{inet_pton}
+@findex inet_pton
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/inet_pton.html}
+
+Gnulib module: inet_pton
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, OSF/1 4.0, Solaris 2.5.1, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/initstate.texi b/gnulib/doc/posix-functions/initstate.texi
new file mode 100644
index 00000000..a2c094fe
--- /dev/null
+++ b/gnulib/doc/posix-functions/initstate.texi
@@ -0,0 +1,18 @@
+@node initstate
+@section @code{initstate}
+@findex initstate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/initstate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/insque.texi b/gnulib/doc/posix-functions/insque.texi
new file mode 100644
index 00000000..30518867
--- /dev/null
+++ b/gnulib/doc/posix-functions/insque.texi
@@ -0,0 +1,18 @@
+@node insque
+@section @code{insque}
+@findex insque
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/insque.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ioctl.texi b/gnulib/doc/posix-functions/ioctl.texi
new file mode 100644
index 00000000..893cee14
--- /dev/null
+++ b/gnulib/doc/posix-functions/ioctl.texi
@@ -0,0 +1,21 @@
+@node ioctl
+@section @code{ioctl}
+@findex ioctl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ioctl.html}
+
+Gnulib module: ioctl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), @code{ioctl} is called
+@code{ioctlsocket}, and error codes for this function are not placed in
+@code{errno}, and @code{WSAGetLastError} must be used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Most @code{ioctl} requests are platform and hardware specific.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isalnum.texi b/gnulib/doc/posix-functions/isalnum.texi
new file mode 100644
index 00000000..313c58e4
--- /dev/null
+++ b/gnulib/doc/posix-functions/isalnum.texi
@@ -0,0 +1,40 @@
+@node isalnum
+@section @code{isalnum}
+@findex isalnum
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isalnum.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isalnum
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswalnum
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isalnum
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_alnum
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-alnum}.
+@end table
diff --git a/gnulib/doc/posix-functions/isalnum_l.texi b/gnulib/doc/posix-functions/isalnum_l.texi
new file mode 100644
index 00000000..fa76cbd5
--- /dev/null
+++ b/gnulib/doc/posix-functions/isalnum_l.texi
@@ -0,0 +1,18 @@
+@node isalnum_l
+@section @code{isalnum_l}
+@findex isalnum_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isalnum_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isalpha.texi b/gnulib/doc/posix-functions/isalpha.texi
new file mode 100644
index 00000000..6d0a58a8
--- /dev/null
+++ b/gnulib/doc/posix-functions/isalpha.texi
@@ -0,0 +1,40 @@
+@node isalpha
+@section @code{isalpha}
+@findex isalpha
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isalpha.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isalpha
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswalpha
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isalpha
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_alpha
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-alpha}.
+@end table
diff --git a/gnulib/doc/posix-functions/isalpha_l.texi b/gnulib/doc/posix-functions/isalpha_l.texi
new file mode 100644
index 00000000..01405c01
--- /dev/null
+++ b/gnulib/doc/posix-functions/isalpha_l.texi
@@ -0,0 +1,18 @@
+@node isalpha_l
+@section @code{isalpha_l}
+@findex isalpha_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isalpha_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isascii.texi b/gnulib/doc/posix-functions/isascii.texi
new file mode 100644
index 00000000..d4ab2c22
--- /dev/null
+++ b/gnulib/doc/posix-functions/isascii.texi
@@ -0,0 +1,30 @@
+@node isascii
+@section @code{isascii}
+@findex isascii
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isascii.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but requires special
+handling for the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are two alternative APIs:
+
+@table @code
+@item c_isascii
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item mb_isascii
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+@end table
diff --git a/gnulib/doc/posix-functions/isastream.texi b/gnulib/doc/posix-functions/isastream.texi
new file mode 100644
index 00000000..d7daa0af
--- /dev/null
+++ b/gnulib/doc/posix-functions/isastream.texi
@@ -0,0 +1,18 @@
+@node isastream
+@section @code{isastream}
+@findex isastream
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isastream.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isatty.texi b/gnulib/doc/posix-functions/isatty.texi
new file mode 100644
index 00000000..12ea8060
--- /dev/null
+++ b/gnulib/doc/posix-functions/isatty.texi
@@ -0,0 +1,18 @@
+@node isatty
+@section @code{isatty}
+@findex isatty
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isatty.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows, @code{isatty} also returns true for character devices such as
+@file{NUL}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isblank.texi b/gnulib/doc/posix-functions/isblank.texi
new file mode 100644
index 00000000..626bc7db
--- /dev/null
+++ b/gnulib/doc/posix-functions/isblank.texi
@@ -0,0 +1,43 @@
+@node isblank
+@section @code{isblank}
+@findex isblank
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isblank.html}
+
+Gnulib module: isblank
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isblank
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswblank
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isblank
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_blank
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-blank}.
+@end table
diff --git a/gnulib/doc/posix-functions/isblank_l.texi b/gnulib/doc/posix-functions/isblank_l.texi
new file mode 100644
index 00000000..911407a4
--- /dev/null
+++ b/gnulib/doc/posix-functions/isblank_l.texi
@@ -0,0 +1,18 @@
+@node isblank_l
+@section @code{isblank_l}
+@findex isblank_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isblank_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iscntrl.texi b/gnulib/doc/posix-functions/iscntrl.texi
new file mode 100644
index 00000000..b01d3e32
--- /dev/null
+++ b/gnulib/doc/posix-functions/iscntrl.texi
@@ -0,0 +1,40 @@
+@node iscntrl
+@section @code{iscntrl}
+@findex iscntrl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iscntrl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_iscntrl
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswcntrl
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_iscntrl
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_cntrl
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-cntrl}.
+@end table
diff --git a/gnulib/doc/posix-functions/iscntrl_l.texi b/gnulib/doc/posix-functions/iscntrl_l.texi
new file mode 100644
index 00000000..769fc789
--- /dev/null
+++ b/gnulib/doc/posix-functions/iscntrl_l.texi
@@ -0,0 +1,18 @@
+@node iscntrl_l
+@section @code{iscntrl_l}
+@findex iscntrl_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iscntrl_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isdigit.texi b/gnulib/doc/posix-functions/isdigit.texi
new file mode 100644
index 00000000..51fcc4bd
--- /dev/null
+++ b/gnulib/doc/posix-functions/isdigit.texi
@@ -0,0 +1,40 @@
+@node isdigit
+@section @code{isdigit}
+@findex isdigit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isdigit.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isdigit
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswdigit
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isdigit
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_digit
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-digit}.
+@end table
diff --git a/gnulib/doc/posix-functions/isdigit_l.texi b/gnulib/doc/posix-functions/isdigit_l.texi
new file mode 100644
index 00000000..70bc9bf5
--- /dev/null
+++ b/gnulib/doc/posix-functions/isdigit_l.texi
@@ -0,0 +1,18 @@
+@node isdigit_l
+@section @code{isdigit_l}
+@findex isdigit_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isdigit_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isfinite.texi b/gnulib/doc/posix-functions/isfinite.texi
new file mode 100644
index 00000000..3dc474bb
--- /dev/null
+++ b/gnulib/doc/posix-functions/isfinite.texi
@@ -0,0 +1,31 @@
+@node isfinite
+@section @code{isfinite}
+@findex isfinite
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isfinite.html}
+
+Gnulib module: isfinite
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This macro is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5.
+@item
+This macro incorrectly yields true for some @samp{double} arguments, on some
+platforms:
+Linux/ia64 (signalling NaNs).
+@item
+This macro incorrectly yields true for some @samp{long double} arguments, on
+some platforms:
+x86 (pseudo-zeroes, unnormalized numbers, pseudo-denormals),
+x86_64 (pseudo-denormals),
+ia64 (pseudo-NaN, pseudo-Infinity, pseudo-zeroes, unnormalized numbers, pseudo-denormals).
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+It is implementation-dependent whether @code{isfinite} raises an
+exception given a signaling NaN operand.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isgraph.texi b/gnulib/doc/posix-functions/isgraph.texi
new file mode 100644
index 00000000..8832580b
--- /dev/null
+++ b/gnulib/doc/posix-functions/isgraph.texi
@@ -0,0 +1,40 @@
+@node isgraph
+@section @code{isgraph}
+@findex isgraph
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isgraph.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isgraph
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswgraph
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isgraph
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_graph
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-graph}.
+@end table
diff --git a/gnulib/doc/posix-functions/isgraph_l.texi b/gnulib/doc/posix-functions/isgraph_l.texi
new file mode 100644
index 00000000..de788f9a
--- /dev/null
+++ b/gnulib/doc/posix-functions/isgraph_l.texi
@@ -0,0 +1,18 @@
+@node isgraph_l
+@section @code{isgraph_l}
+@findex isgraph_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isgraph_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isgreater.texi b/gnulib/doc/posix-functions/isgreater.texi
new file mode 100644
index 00000000..f4520db3
--- /dev/null
+++ b/gnulib/doc/posix-functions/isgreater.texi
@@ -0,0 +1,18 @@
+@node isgreater
+@section @code{isgreater}
+@findex isgreater
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isgreater.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isgreaterequal.texi b/gnulib/doc/posix-functions/isgreaterequal.texi
new file mode 100644
index 00000000..066fad27
--- /dev/null
+++ b/gnulib/doc/posix-functions/isgreaterequal.texi
@@ -0,0 +1,18 @@
+@node isgreaterequal
+@section @code{isgreaterequal}
+@findex isgreaterequal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isgreaterequal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isinf.texi b/gnulib/doc/posix-functions/isinf.texi
new file mode 100644
index 00000000..0d0944e8
--- /dev/null
+++ b/gnulib/doc/posix-functions/isinf.texi
@@ -0,0 +1,18 @@
+@node isinf
+@section @code{isinf}
+@findex isinf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isinf.html}
+
+Gnulib module: isinf
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This macro is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, OSF/1 5.1, Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/isless.texi b/gnulib/doc/posix-functions/isless.texi
new file mode 100644
index 00000000..d2f8c94f
--- /dev/null
+++ b/gnulib/doc/posix-functions/isless.texi
@@ -0,0 +1,18 @@
+@node isless
+@section @code{isless}
+@findex isless
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isless.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/islessequal.texi b/gnulib/doc/posix-functions/islessequal.texi
new file mode 100644
index 00000000..2f771c1c
--- /dev/null
+++ b/gnulib/doc/posix-functions/islessequal.texi
@@ -0,0 +1,18 @@
+@node islessequal
+@section @code{islessequal}
+@findex islessequal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/islessequal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/islessgreater.texi b/gnulib/doc/posix-functions/islessgreater.texi
new file mode 100644
index 00000000..3394074d
--- /dev/null
+++ b/gnulib/doc/posix-functions/islessgreater.texi
@@ -0,0 +1,18 @@
+@node islessgreater
+@section @code{islessgreater}
+@findex islessgreater
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/islessgreater.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/islower.texi b/gnulib/doc/posix-functions/islower.texi
new file mode 100644
index 00000000..bfd34719
--- /dev/null
+++ b/gnulib/doc/posix-functions/islower.texi
@@ -0,0 +1,40 @@
+@node islower
+@section @code{islower}
+@findex islower
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/islower.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_islower
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswlower
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_islower
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_lower
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-lower}.
+@end table
diff --git a/gnulib/doc/posix-functions/islower_l.texi b/gnulib/doc/posix-functions/islower_l.texi
new file mode 100644
index 00000000..bc3b6083
--- /dev/null
+++ b/gnulib/doc/posix-functions/islower_l.texi
@@ -0,0 +1,18 @@
+@node islower_l
+@section @code{islower_l}
+@findex islower_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/islower_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isnan.texi b/gnulib/doc/posix-functions/isnan.texi
new file mode 100644
index 00000000..c835853f
--- /dev/null
+++ b/gnulib/doc/posix-functions/isnan.texi
@@ -0,0 +1,29 @@
+@node isnan
+@section @code{isnan}
+@findex isnan
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isnan.html}
+
+Gnulib module: isnan
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+@code{isnan} was introduced with C99 and is thus commonly not present
+on pre-C99 systems.
+@item
+On IRIX 6.5 with @code{cc}, @code{isnan} does not recognize some NaNs.
+@item
+On NetBSD/i386 and glibc/ia64, @code{isnan} does not recognize some
+forms of NaNs, such as pseudo-NaNs, pseudo-Infinities, and
+unnormalized numbers.
+@item
+On i686 and @var{x}86-64, @code{__builtin_isnanl} (and thus
+@code{isnan} implementations based on it) in GCC 4.0 and later does
+not recognize pseudo-denormals as NaNs, and similarly for
+pseudo-zeroes, unnormalized numbers, and pseudo-denormals on ia64.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/isnormal.texi b/gnulib/doc/posix-functions/isnormal.texi
new file mode 100644
index 00000000..106a4144
--- /dev/null
+++ b/gnulib/doc/posix-functions/isnormal.texi
@@ -0,0 +1,18 @@
+@node isnormal
+@section @code{isnormal}
+@findex isnormal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isnormal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isprint.texi b/gnulib/doc/posix-functions/isprint.texi
new file mode 100644
index 00000000..69537192
--- /dev/null
+++ b/gnulib/doc/posix-functions/isprint.texi
@@ -0,0 +1,40 @@
+@node isprint
+@section @code{isprint}
+@findex isprint
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isprint.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isprint
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswprint
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isprint
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_print
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-print}.
+@end table
diff --git a/gnulib/doc/posix-functions/isprint_l.texi b/gnulib/doc/posix-functions/isprint_l.texi
new file mode 100644
index 00000000..e1326d45
--- /dev/null
+++ b/gnulib/doc/posix-functions/isprint_l.texi
@@ -0,0 +1,18 @@
+@node isprint_l
+@section @code{isprint_l}
+@findex isprint_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isprint_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ispunct.texi b/gnulib/doc/posix-functions/ispunct.texi
new file mode 100644
index 00000000..da9a23b2
--- /dev/null
+++ b/gnulib/doc/posix-functions/ispunct.texi
@@ -0,0 +1,40 @@
+@node ispunct
+@section @code{ispunct}
+@findex ispunct
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ispunct.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_ispunct
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswpunct
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_ispunct
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_punct
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-punct}.
+@end table
diff --git a/gnulib/doc/posix-functions/ispunct_l.texi b/gnulib/doc/posix-functions/ispunct_l.texi
new file mode 100644
index 00000000..0f7d7cce
--- /dev/null
+++ b/gnulib/doc/posix-functions/ispunct_l.texi
@@ -0,0 +1,18 @@
+@node ispunct_l
+@section @code{ispunct_l}
+@findex ispunct_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ispunct_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isspace.texi b/gnulib/doc/posix-functions/isspace.texi
new file mode 100644
index 00000000..a4cc3f30
--- /dev/null
+++ b/gnulib/doc/posix-functions/isspace.texi
@@ -0,0 +1,40 @@
+@node isspace
+@section @code{isspace}
+@findex isspace
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isspace.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isspace
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswspace
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isspace
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_space
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-space}.
+@end table
diff --git a/gnulib/doc/posix-functions/isspace_l.texi b/gnulib/doc/posix-functions/isspace_l.texi
new file mode 100644
index 00000000..2f73df43
--- /dev/null
+++ b/gnulib/doc/posix-functions/isspace_l.texi
@@ -0,0 +1,18 @@
+@node isspace_l
+@section @code{isspace_l}
+@findex isspace_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isspace_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isunordered.texi b/gnulib/doc/posix-functions/isunordered.texi
new file mode 100644
index 00000000..b10724ad
--- /dev/null
+++ b/gnulib/doc/posix-functions/isunordered.texi
@@ -0,0 +1,18 @@
+@node isunordered
+@section @code{isunordered}
+@findex isunordered
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isunordered.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isupper.texi b/gnulib/doc/posix-functions/isupper.texi
new file mode 100644
index 00000000..f629f137
--- /dev/null
+++ b/gnulib/doc/posix-functions/isupper.texi
@@ -0,0 +1,40 @@
+@node isupper
+@section @code{isupper}
+@findex isupper
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isupper.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isupper
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswupper
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isupper
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_upper
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-upper}.
+@end table
diff --git a/gnulib/doc/posix-functions/isupper_l.texi b/gnulib/doc/posix-functions/isupper_l.texi
new file mode 100644
index 00000000..fb150101
--- /dev/null
+++ b/gnulib/doc/posix-functions/isupper_l.texi
@@ -0,0 +1,18 @@
+@node isupper_l
+@section @code{isupper_l}
+@findex isupper_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isupper_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswalnum.texi b/gnulib/doc/posix-functions/iswalnum.texi
new file mode 100644
index 00000000..a90adb94
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswalnum.texi
@@ -0,0 +1,24 @@
+@node iswalnum
+@section @code{iswalnum}
+@findex iswalnum
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswalnum.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswalnum_l.texi b/gnulib/doc/posix-functions/iswalnum_l.texi
new file mode 100644
index 00000000..0b3f5d5b
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswalnum_l.texi
@@ -0,0 +1,21 @@
+@node iswalnum_l
+@section @code{iswalnum_l}
+@findex iswalnum_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswalnum_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswalpha.texi b/gnulib/doc/posix-functions/iswalpha.texi
new file mode 100644
index 00000000..197fbf3b
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswalpha.texi
@@ -0,0 +1,24 @@
+@node iswalpha
+@section @code{iswalpha}
+@findex iswalpha
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswalpha.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswalpha_l.texi b/gnulib/doc/posix-functions/iswalpha_l.texi
new file mode 100644
index 00000000..d8540c38
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswalpha_l.texi
@@ -0,0 +1,21 @@
+@node iswalpha_l
+@section @code{iswalpha_l}
+@findex iswalpha_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswalpha_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswblank.texi b/gnulib/doc/posix-functions/iswblank.texi
new file mode 100644
index 00000000..e8ea1bea
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswblank.texi
@@ -0,0 +1,24 @@
+@node iswblank
+@section @code{iswblank}
+@findex iswblank
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswblank.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswblank_l.texi b/gnulib/doc/posix-functions/iswblank_l.texi
new file mode 100644
index 00000000..2761e99b
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswblank_l.texi
@@ -0,0 +1,21 @@
+@node iswblank_l
+@section @code{iswblank_l}
+@findex iswblank_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswblank_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswcntrl.texi b/gnulib/doc/posix-functions/iswcntrl.texi
new file mode 100644
index 00000000..ed4a8fef
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswcntrl.texi
@@ -0,0 +1,24 @@
+@node iswcntrl
+@section @code{iswcntrl}
+@findex iswcntrl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswcntrl.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswcntrl_l.texi b/gnulib/doc/posix-functions/iswcntrl_l.texi
new file mode 100644
index 00000000..961c2fb7
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswcntrl_l.texi
@@ -0,0 +1,21 @@
+@node iswcntrl_l
+@section @code{iswcntrl_l}
+@findex iswcntrl_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswcntrl_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswctype.texi b/gnulib/doc/posix-functions/iswctype.texi
new file mode 100644
index 00000000..156a26f5
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswctype.texi
@@ -0,0 +1,21 @@
+@node iswctype
+@section @code{iswctype}
+@findex iswctype
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswctype.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswctype_l.texi b/gnulib/doc/posix-functions/iswctype_l.texi
new file mode 100644
index 00000000..1e12bb07
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswctype_l.texi
@@ -0,0 +1,21 @@
+@node iswctype_l
+@section @code{iswctype_l}
+@findex iswctype_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswctype_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswdigit.texi b/gnulib/doc/posix-functions/iswdigit.texi
new file mode 100644
index 00000000..8dccb42c
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswdigit.texi
@@ -0,0 +1,24 @@
+@node iswdigit
+@section @code{iswdigit}
+@findex iswdigit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswdigit.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswdigit_l.texi b/gnulib/doc/posix-functions/iswdigit_l.texi
new file mode 100644
index 00000000..62f70622
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswdigit_l.texi
@@ -0,0 +1,21 @@
+@node iswdigit_l
+@section @code{iswdigit_l}
+@findex iswdigit_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswdigit_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswgraph.texi b/gnulib/doc/posix-functions/iswgraph.texi
new file mode 100644
index 00000000..f7dfb669
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswgraph.texi
@@ -0,0 +1,24 @@
+@node iswgraph
+@section @code{iswgraph}
+@findex iswgraph
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswgraph.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswgraph_l.texi b/gnulib/doc/posix-functions/iswgraph_l.texi
new file mode 100644
index 00000000..289091a4
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswgraph_l.texi
@@ -0,0 +1,21 @@
+@node iswgraph_l
+@section @code{iswgraph_l}
+@findex iswgraph_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswgraph_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswlower.texi b/gnulib/doc/posix-functions/iswlower.texi
new file mode 100644
index 00000000..910b1180
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswlower.texi
@@ -0,0 +1,24 @@
+@node iswlower
+@section @code{iswlower}
+@findex iswlower
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswlower.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswlower_l.texi b/gnulib/doc/posix-functions/iswlower_l.texi
new file mode 100644
index 00000000..dbb35739
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswlower_l.texi
@@ -0,0 +1,21 @@
+@node iswlower_l
+@section @code{iswlower_l}
+@findex iswlower_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswlower_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswprint.texi b/gnulib/doc/posix-functions/iswprint.texi
new file mode 100644
index 00000000..50d58e3b
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswprint.texi
@@ -0,0 +1,24 @@
+@node iswprint
+@section @code{iswprint}
+@findex iswprint
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswprint.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswprint_l.texi b/gnulib/doc/posix-functions/iswprint_l.texi
new file mode 100644
index 00000000..f2db1ae3
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswprint_l.texi
@@ -0,0 +1,21 @@
+@node iswprint_l
+@section @code{iswprint_l}
+@findex iswprint_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswprint_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswpunct.texi b/gnulib/doc/posix-functions/iswpunct.texi
new file mode 100644
index 00000000..899dfc56
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswpunct.texi
@@ -0,0 +1,24 @@
+@node iswpunct
+@section @code{iswpunct}
+@findex iswpunct
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswpunct.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswpunct_l.texi b/gnulib/doc/posix-functions/iswpunct_l.texi
new file mode 100644
index 00000000..d0f19318
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswpunct_l.texi
@@ -0,0 +1,21 @@
+@node iswpunct_l
+@section @code{iswpunct_l}
+@findex iswpunct_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswpunct_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswspace.texi b/gnulib/doc/posix-functions/iswspace.texi
new file mode 100644
index 00000000..fb89382f
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswspace.texi
@@ -0,0 +1,24 @@
+@node iswspace
+@section @code{iswspace}
+@findex iswspace
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswspace.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswspace_l.texi b/gnulib/doc/posix-functions/iswspace_l.texi
new file mode 100644
index 00000000..3bd70e79
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswspace_l.texi
@@ -0,0 +1,21 @@
+@node iswspace_l
+@section @code{iswspace_l}
+@findex iswspace_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswspace_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswupper.texi b/gnulib/doc/posix-functions/iswupper.texi
new file mode 100644
index 00000000..ee3588e0
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswupper.texi
@@ -0,0 +1,24 @@
+@node iswupper
+@section @code{iswupper}
+@findex iswupper
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswupper.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswupper_l.texi b/gnulib/doc/posix-functions/iswupper_l.texi
new file mode 100644
index 00000000..a94e67c9
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswupper_l.texi
@@ -0,0 +1,21 @@
+@node iswupper_l
+@section @code{iswupper_l}
+@findex iswupper_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswupper_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswxdigit.texi b/gnulib/doc/posix-functions/iswxdigit.texi
new file mode 100644
index 00000000..acdb2f0c
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswxdigit.texi
@@ -0,0 +1,24 @@
+@node iswxdigit
+@section @code{iswxdigit}
+@findex iswxdigit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswxdigit.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns 0 for all possible arguments on some platforms:
+Linux libc5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/iswxdigit_l.texi b/gnulib/doc/posix-functions/iswxdigit_l.texi
new file mode 100644
index 00000000..611768e5
--- /dev/null
+++ b/gnulib/doc/posix-functions/iswxdigit_l.texi
@@ -0,0 +1,21 @@
+@node iswxdigit_l
+@section @code{iswxdigit_l}
+@findex iswxdigit_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/iswxdigit_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/isxdigit.texi b/gnulib/doc/posix-functions/isxdigit.texi
new file mode 100644
index 00000000..cc6133c8
--- /dev/null
+++ b/gnulib/doc/posix-functions/isxdigit.texi
@@ -0,0 +1,40 @@
+@node isxdigit
+@section @code{isxdigit}
+@findex isxdigit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isxdigit.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Note: This function's behaviour depends on the locale, but does not support
+the multibyte characters that occur in strings in locales with
+@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
+There are four alternative APIs:
+
+@table @code
+@item c_isxdigit
+This function operates in a locale independent way and returns true only for
+ASCII characters. It is provided by the Gnulib module @samp{c-ctype}.
+
+@item iswxdigit
+This function operates in a locale dependent way, on wide characters. In
+order to use it, you first have to convert from multibyte to wide characters,
+using the @code{mbrtowc} function. It is provided by the Gnulib module
+@samp{wctype}.
+
+@item mb_isxdigit
+This function operates in a locale dependent way, on multibyte characters.
+It is provided by the Gnulib module @samp{mbchar}.
+
+@item uc_is_xdigit
+This function operates in a locale independent way, on Unicode characters.
+It is provided by the Gnulib module @samp{unictype/ctype-xdigit}.
+@end table
diff --git a/gnulib/doc/posix-functions/isxdigit_l.texi b/gnulib/doc/posix-functions/isxdigit_l.texi
new file mode 100644
index 00000000..f485d7f0
--- /dev/null
+++ b/gnulib/doc/posix-functions/isxdigit_l.texi
@@ -0,0 +1,18 @@
+@node isxdigit_l
+@section @code{isxdigit_l}
+@findex isxdigit_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isxdigit_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/j0.texi b/gnulib/doc/posix-functions/j0.texi
new file mode 100644
index 00000000..e0ed5bc1
--- /dev/null
+++ b/gnulib/doc/posix-functions/j0.texi
@@ -0,0 +1,15 @@
+@node j0
+@section @code{j0}
+@findex j0
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/j0.html}
+
+Gnulib module: j0
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/j1.texi b/gnulib/doc/posix-functions/j1.texi
new file mode 100644
index 00000000..b906998a
--- /dev/null
+++ b/gnulib/doc/posix-functions/j1.texi
@@ -0,0 +1,15 @@
+@node j1
+@section @code{j1}
+@findex j1
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/j1.html}
+
+Gnulib module: j1
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/jn.texi b/gnulib/doc/posix-functions/jn.texi
new file mode 100644
index 00000000..58b26ae1
--- /dev/null
+++ b/gnulib/doc/posix-functions/jn.texi
@@ -0,0 +1,15 @@
+@node jn
+@section @code{jn}
+@findex jn
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/jn.html}
+
+Gnulib module: jn
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/jrand48.texi b/gnulib/doc/posix-functions/jrand48.texi
new file mode 100644
index 00000000..9a1688e2
--- /dev/null
+++ b/gnulib/doc/posix-functions/jrand48.texi
@@ -0,0 +1,18 @@
+@node jrand48
+@section @code{jrand48}
+@findex jrand48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/jrand48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/kill.texi b/gnulib/doc/posix-functions/kill.texi
new file mode 100644
index 00000000..69b0c56c
--- /dev/null
+++ b/gnulib/doc/posix-functions/kill.texi
@@ -0,0 +1,18 @@
+@node kill
+@section @code{kill}
+@findex kill
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/kill.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/killpg.texi b/gnulib/doc/posix-functions/killpg.texi
new file mode 100644
index 00000000..60f71c88
--- /dev/null
+++ b/gnulib/doc/posix-functions/killpg.texi
@@ -0,0 +1,18 @@
+@node killpg
+@section @code{killpg}
+@findex killpg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/killpg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/l64a.texi b/gnulib/doc/posix-functions/l64a.texi
new file mode 100644
index 00000000..58a44be9
--- /dev/null
+++ b/gnulib/doc/posix-functions/l64a.texi
@@ -0,0 +1,20 @@
+@node l64a
+@section @code{l64a}
+@findex l64a
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/l64a.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, mingw, BeOS.
+@item
+This function was not correctly implemented in glibc versions before 2.2.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/labs.texi b/gnulib/doc/posix-functions/labs.texi
new file mode 100644
index 00000000..e293d9d0
--- /dev/null
+++ b/gnulib/doc/posix-functions/labs.texi
@@ -0,0 +1,15 @@
+@node labs
+@section @code{labs}
+@findex labs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/labs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/lchown.texi b/gnulib/doc/posix-functions/lchown.texi
new file mode 100644
index 00000000..595a05ce
--- /dev/null
+++ b/gnulib/doc/posix-functions/lchown.texi
@@ -0,0 +1,29 @@
+@node lchown
+@section @code{lchown}
+@findex lchown
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lchown.html}
+
+Gnulib module: lchown
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some platforms fail to detect trailing slash on non-directories, as in
+@code{lchown("link-to-file/",uid,gid)}:
+FreeBSD 7.2, Solaris 9.
+@item
+Some platforms fail to update the change time when at least one
+argument was not -1, but no ownership changes resulted. However,
+without @code{lchmod}, the replacement only fixes this for non-symlinks:
+OpenBSD 4.0.
+@item
+This function is missing on some platforms; however, the replacement
+fails on symlinks if @code{chown} is supported, and fails altogether
+with @code{ENOSYS} otherwise:
+MacOS X 10.3, mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/lcong48.texi b/gnulib/doc/posix-functions/lcong48.texi
new file mode 100644
index 00000000..0516cfa5
--- /dev/null
+++ b/gnulib/doc/posix-functions/lcong48.texi
@@ -0,0 +1,18 @@
+@node lcong48
+@section @code{lcong48}
+@findex lcong48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lcong48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ldexp.texi b/gnulib/doc/posix-functions/ldexp.texi
new file mode 100644
index 00000000..ac1bffc4
--- /dev/null
+++ b/gnulib/doc/posix-functions/ldexp.texi
@@ -0,0 +1,15 @@
+@node ldexp
+@section @code{ldexp}
+@findex ldexp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ldexp.html}
+
+Gnulib module: ldexp
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ldexpf.texi b/gnulib/doc/posix-functions/ldexpf.texi
new file mode 100644
index 00000000..48195c06
--- /dev/null
+++ b/gnulib/doc/posix-functions/ldexpf.texi
@@ -0,0 +1,18 @@
+@node ldexpf
+@section @code{ldexpf}
+@findex ldexpf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ldexpf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ldexpl.texi b/gnulib/doc/posix-functions/ldexpl.texi
new file mode 100644
index 00000000..48b2f731
--- /dev/null
+++ b/gnulib/doc/posix-functions/ldexpl.texi
@@ -0,0 +1,24 @@
+@node ldexpl
+@section @code{ldexpl}
+@findex ldexpl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ldexpl.html}
+
+Gnulib module: ldexpl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5.
+@item
+This function has no prototype in @code{<math.h>} on some platforms:
+MacOS X.
+@item
+This function does not work on finite numbers on some platforms:
+AIX 5.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ldiv.texi b/gnulib/doc/posix-functions/ldiv.texi
new file mode 100644
index 00000000..521279cd
--- /dev/null
+++ b/gnulib/doc/posix-functions/ldiv.texi
@@ -0,0 +1,15 @@
+@node ldiv
+@section @code{ldiv}
+@findex ldiv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ldiv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/lfind.texi b/gnulib/doc/posix-functions/lfind.texi
new file mode 100644
index 00000000..c88f042f
--- /dev/null
+++ b/gnulib/doc/posix-functions/lfind.texi
@@ -0,0 +1,18 @@
+@node lfind
+@section @code{lfind}
+@findex lfind
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lfind.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lgamma.texi b/gnulib/doc/posix-functions/lgamma.texi
new file mode 100644
index 00000000..3ac4fd24
--- /dev/null
+++ b/gnulib/doc/posix-functions/lgamma.texi
@@ -0,0 +1,15 @@
+@node lgamma
+@section @code{lgamma}
+@findex lgamma
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lgamma.html}
+
+Gnulib module: lgamma
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/lgammaf.texi b/gnulib/doc/posix-functions/lgammaf.texi
new file mode 100644
index 00000000..fb43c3f5
--- /dev/null
+++ b/gnulib/doc/posix-functions/lgammaf.texi
@@ -0,0 +1,18 @@
+@node lgammaf
+@section @code{lgammaf}
+@findex lgammaf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lgammaf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lgammal.texi b/gnulib/doc/posix-functions/lgammal.texi
new file mode 100644
index 00000000..fd8a17e1
--- /dev/null
+++ b/gnulib/doc/posix-functions/lgammal.texi
@@ -0,0 +1,18 @@
+@node lgammal
+@section @code{lgammal}
+@findex lgammal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lgammal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/link.texi b/gnulib/doc/posix-functions/link.texi
new file mode 100644
index 00000000..6279fe83
--- /dev/null
+++ b/gnulib/doc/posix-functions/link.texi
@@ -0,0 +1,26 @@
+@node link
+@section @code{link}
+@findex link
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/link.html}
+
+Gnulib module: link
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+This function fails to reject trailing slashes on non-directories on
+some platforms:
+FreeBSD 7.2, Solaris, Cygwin 1.5.x.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+When the first argument is a symlink, some platforms create a
+hard-link to what the symlink referenced, rather than to the symlink
+itself. Use @samp{linkat} to force a particular behavior.
+@end itemize
diff --git a/gnulib/doc/posix-functions/linkat.texi b/gnulib/doc/posix-functions/linkat.texi
new file mode 100644
index 00000000..1fe5434e
--- /dev/null
+++ b/gnulib/doc/posix-functions/linkat.texi
@@ -0,0 +1,20 @@
+@node linkat
+@section @code{linkat}
+@findex linkat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/linkat.html}
+
+Gnulib module: linkat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/lio_listio.texi b/gnulib/doc/posix-functions/lio_listio.texi
new file mode 100644
index 00000000..5d918fdc
--- /dev/null
+++ b/gnulib/doc/posix-functions/lio_listio.texi
@@ -0,0 +1,18 @@
+@node lio_listio
+@section @code{lio_listio}
+@findex lio_listio
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lio_listio.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, OSF/1 5.1, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/listen.texi b/gnulib/doc/posix-functions/listen.texi
new file mode 100644
index 00000000..8aaf4480
--- /dev/null
+++ b/gnulib/doc/posix-functions/listen.texi
@@ -0,0 +1,19 @@
+@node listen
+@section @code{listen}
+@findex listen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/listen.html}
+
+Gnulib module: listen
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for @code{listen}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/llabs.texi b/gnulib/doc/posix-functions/llabs.texi
new file mode 100644
index 00000000..23585027
--- /dev/null
+++ b/gnulib/doc/posix-functions/llabs.texi
@@ -0,0 +1,18 @@
+@node llabs
+@section @code{llabs}
+@findex llabs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/llabs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 5.1, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lldiv.texi b/gnulib/doc/posix-functions/lldiv.texi
new file mode 100644
index 00000000..3abe6be2
--- /dev/null
+++ b/gnulib/doc/posix-functions/lldiv.texi
@@ -0,0 +1,18 @@
+@node lldiv
+@section @code{lldiv}
+@findex lldiv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lldiv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, HP-UX 11, OSF/1 5.1, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/llrint.texi b/gnulib/doc/posix-functions/llrint.texi
new file mode 100644
index 00000000..815f32d7
--- /dev/null
+++ b/gnulib/doc/posix-functions/llrint.texi
@@ -0,0 +1,19 @@
+@node llrint
+@section @code{llrint}
+@findex llrint
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/llrint.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9,
+Cygwin 1.5.x, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/llrintf.texi b/gnulib/doc/posix-functions/llrintf.texi
new file mode 100644
index 00000000..aeb54d78
--- /dev/null
+++ b/gnulib/doc/posix-functions/llrintf.texi
@@ -0,0 +1,19 @@
+@node llrintf
+@section @code{llrintf}
+@findex llrintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/llrintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0,
+Solaris 9, Cygwin 1.5.x, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/llrintl.texi b/gnulib/doc/posix-functions/llrintl.texi
new file mode 100644
index 00000000..b18c2202
--- /dev/null
+++ b/gnulib/doc/posix-functions/llrintl.texi
@@ -0,0 +1,19 @@
+@node llrintl
+@section @code{llrintl}
+@findex llrintl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/llrintl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5,
+OSF/1 4.0, Solaris 9, Cygwin 1.5.x, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/llround.texi b/gnulib/doc/posix-functions/llround.texi
new file mode 100644
index 00000000..825dbbf3
--- /dev/null
+++ b/gnulib/doc/posix-functions/llround.texi
@@ -0,0 +1,18 @@
+@node llround
+@section @code{llround}
+@findex llround
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/llround.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/llroundf.texi b/gnulib/doc/posix-functions/llroundf.texi
new file mode 100644
index 00000000..9c8e2cdc
--- /dev/null
+++ b/gnulib/doc/posix-functions/llroundf.texi
@@ -0,0 +1,18 @@
+@node llroundf
+@section @code{llroundf}
+@findex llroundf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/llroundf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/llroundl.texi b/gnulib/doc/posix-functions/llroundl.texi
new file mode 100644
index 00000000..1c1cdd09
--- /dev/null
+++ b/gnulib/doc/posix-functions/llroundl.texi
@@ -0,0 +1,18 @@
+@node llroundl
+@section @code{llroundl}
+@findex llroundl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/llroundl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/localeconv.texi b/gnulib/doc/posix-functions/localeconv.texi
new file mode 100644
index 00000000..21258fbe
--- /dev/null
+++ b/gnulib/doc/posix-functions/localeconv.texi
@@ -0,0 +1,15 @@
+@node localeconv
+@section @code{localeconv}
+@findex localeconv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/localeconv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/localtime.texi b/gnulib/doc/posix-functions/localtime.texi
new file mode 100644
index 00000000..ce975796
--- /dev/null
+++ b/gnulib/doc/posix-functions/localtime.texi
@@ -0,0 +1,15 @@
+@node localtime
+@section @code{localtime}
+@findex localtime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/localtime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/localtime_r.texi b/gnulib/doc/posix-functions/localtime_r.texi
new file mode 100644
index 00000000..ea14ea8b
--- /dev/null
+++ b/gnulib/doc/posix-functions/localtime_r.texi
@@ -0,0 +1,21 @@
+@node localtime_r
+@section @code{localtime_r}
+@findex localtime_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/localtime_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+Some platforms define a function of this name that is incompatible to POSIX:
+HP-UX 10.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lockf.texi b/gnulib/doc/posix-functions/lockf.texi
new file mode 100644
index 00000000..4ad6ca16
--- /dev/null
+++ b/gnulib/doc/posix-functions/lockf.texi
@@ -0,0 +1,18 @@
+@node lockf
+@section @code{lockf}
+@findex lockf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lockf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/log.texi b/gnulib/doc/posix-functions/log.texi
new file mode 100644
index 00000000..001e3474
--- /dev/null
+++ b/gnulib/doc/posix-functions/log.texi
@@ -0,0 +1,15 @@
+@node log
+@section @code{log}
+@findex log
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log.html}
+
+Gnulib module: log
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/log10.texi b/gnulib/doc/posix-functions/log10.texi
new file mode 100644
index 00000000..90e3e8de
--- /dev/null
+++ b/gnulib/doc/posix-functions/log10.texi
@@ -0,0 +1,15 @@
+@node log10
+@section @code{log10}
+@findex log10
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log10.html}
+
+Gnulib module: log10
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/log10f.texi b/gnulib/doc/posix-functions/log10f.texi
new file mode 100644
index 00000000..dc93b2b5
--- /dev/null
+++ b/gnulib/doc/posix-functions/log10f.texi
@@ -0,0 +1,18 @@
+@node log10f
+@section @code{log10f}
+@findex log10f
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log10f.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/log10l.texi b/gnulib/doc/posix-functions/log10l.texi
new file mode 100644
index 00000000..2846b398
--- /dev/null
+++ b/gnulib/doc/posix-functions/log10l.texi
@@ -0,0 +1,18 @@
+@node log10l
+@section @code{log10l}
+@findex log10l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log10l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/log1p.texi b/gnulib/doc/posix-functions/log1p.texi
new file mode 100644
index 00000000..d195e855
--- /dev/null
+++ b/gnulib/doc/posix-functions/log1p.texi
@@ -0,0 +1,15 @@
+@node log1p
+@section @code{log1p}
+@findex log1p
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log1p.html}
+
+Gnulib module: log1p
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/log1pf.texi b/gnulib/doc/posix-functions/log1pf.texi
new file mode 100644
index 00000000..ebc644a5
--- /dev/null
+++ b/gnulib/doc/posix-functions/log1pf.texi
@@ -0,0 +1,18 @@
+@node log1pf
+@section @code{log1pf}
+@findex log1pf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log1pf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/log1pl.texi b/gnulib/doc/posix-functions/log1pl.texi
new file mode 100644
index 00000000..4fac85d7
--- /dev/null
+++ b/gnulib/doc/posix-functions/log1pl.texi
@@ -0,0 +1,18 @@
+@node log1pl
+@section @code{log1pl}
+@findex log1pl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log1pl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/log2.texi b/gnulib/doc/posix-functions/log2.texi
new file mode 100644
index 00000000..f0676c68
--- /dev/null
+++ b/gnulib/doc/posix-functions/log2.texi
@@ -0,0 +1,22 @@
+@node log2
+@section @code{log2}
+@findex log2
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log2.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5,
+Solaris 9, Interix 3.5.
+@item
+This function is only provided as a macro on some platforms:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/log2f.texi b/gnulib/doc/posix-functions/log2f.texi
new file mode 100644
index 00000000..4583a17f
--- /dev/null
+++ b/gnulib/doc/posix-functions/log2f.texi
@@ -0,0 +1,22 @@
+@node log2f
+@section @code{log2f}
+@findex log2f
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log2f.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, Solaris 9,
+Interix 3.5.
+@item
+This function is only provided as a macro on some platforms:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/log2l.texi b/gnulib/doc/posix-functions/log2l.texi
new file mode 100644
index 00000000..c1b9c7c4
--- /dev/null
+++ b/gnulib/doc/posix-functions/log2l.texi
@@ -0,0 +1,18 @@
+@node log2l
+@section @code{log2l}
+@findex log2l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/log2l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/logb.texi b/gnulib/doc/posix-functions/logb.texi
new file mode 100644
index 00000000..7cbd9986
--- /dev/null
+++ b/gnulib/doc/posix-functions/logb.texi
@@ -0,0 +1,15 @@
+@node logb
+@section @code{logb}
+@findex logb
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/logb.html}
+
+Gnulib module: logb
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/logbf.texi b/gnulib/doc/posix-functions/logbf.texi
new file mode 100644
index 00000000..550d5120
--- /dev/null
+++ b/gnulib/doc/posix-functions/logbf.texi
@@ -0,0 +1,18 @@
+@node logbf
+@section @code{logbf}
+@findex logbf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/logbf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/logbl.texi b/gnulib/doc/posix-functions/logbl.texi
new file mode 100644
index 00000000..5253ffb1
--- /dev/null
+++ b/gnulib/doc/posix-functions/logbl.texi
@@ -0,0 +1,18 @@
+@node logbl
+@section @code{logbl}
+@findex logbl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/logbl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/logf.texi b/gnulib/doc/posix-functions/logf.texi
new file mode 100644
index 00000000..09170d44
--- /dev/null
+++ b/gnulib/doc/posix-functions/logf.texi
@@ -0,0 +1,18 @@
+@node logf
+@section @code{logf}
+@findex logf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/logf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/logl.texi b/gnulib/doc/posix-functions/logl.texi
new file mode 100644
index 00000000..3df7d970
--- /dev/null
+++ b/gnulib/doc/posix-functions/logl.texi
@@ -0,0 +1,21 @@
+@node logl
+@section @code{logl}
+@findex logl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/logl.html}
+
+Gnulib module: logl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/longjmp.texi b/gnulib/doc/posix-functions/longjmp.texi
new file mode 100644
index 00000000..0cdeb0b6
--- /dev/null
+++ b/gnulib/doc/posix-functions/longjmp.texi
@@ -0,0 +1,24 @@
+@node longjmp
+@section @code{longjmp}
+@findex longjmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/longjmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The effects of this call are system and compiler optimization dependent,
+since it restores the contents of register-allocated variables but not
+the contents of stack-allocated variables.
+@item
+When longjumping out of a signal handler that was being executed on an
+alternate stack (installed through @code{sigaltstack}), on FreeBSD, NetBSD,
+OpenBSD, you need to clear the @code{SS_ONSTACK} flag in the @code{stack_t}
+structure managed by the kernel.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lrand48.texi b/gnulib/doc/posix-functions/lrand48.texi
new file mode 100644
index 00000000..341a8f83
--- /dev/null
+++ b/gnulib/doc/posix-functions/lrand48.texi
@@ -0,0 +1,18 @@
+@node lrand48
+@section @code{lrand48}
+@findex lrand48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lrand48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lrint.texi b/gnulib/doc/posix-functions/lrint.texi
new file mode 100644
index 00000000..52231008
--- /dev/null
+++ b/gnulib/doc/posix-functions/lrint.texi
@@ -0,0 +1,18 @@
+@node lrint
+@section @code{lrint}
+@findex lrint
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lrint.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lrintf.texi b/gnulib/doc/posix-functions/lrintf.texi
new file mode 100644
index 00000000..b21f47c7
--- /dev/null
+++ b/gnulib/doc/posix-functions/lrintf.texi
@@ -0,0 +1,18 @@
+@node lrintf
+@section @code{lrintf}
+@findex lrintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lrintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lrintl.texi b/gnulib/doc/posix-functions/lrintl.texi
new file mode 100644
index 00000000..cc440382
--- /dev/null
+++ b/gnulib/doc/posix-functions/lrintl.texi
@@ -0,0 +1,19 @@
+@node lrintl
+@section @code{lrintl}
+@findex lrintl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lrintl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5,
+OSF/1 4.0, Solaris 9, Cygwin 1.5.x, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lround.texi b/gnulib/doc/posix-functions/lround.texi
new file mode 100644
index 00000000..dc22fe37
--- /dev/null
+++ b/gnulib/doc/posix-functions/lround.texi
@@ -0,0 +1,18 @@
+@node lround
+@section @code{lround}
+@findex lround
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lround.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lroundf.texi b/gnulib/doc/posix-functions/lroundf.texi
new file mode 100644
index 00000000..80937055
--- /dev/null
+++ b/gnulib/doc/posix-functions/lroundf.texi
@@ -0,0 +1,18 @@
+@node lroundf
+@section @code{lroundf}
+@findex lroundf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lroundf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lroundl.texi b/gnulib/doc/posix-functions/lroundl.texi
new file mode 100644
index 00000000..a7d36caf
--- /dev/null
+++ b/gnulib/doc/posix-functions/lroundl.texi
@@ -0,0 +1,18 @@
+@node lroundl
+@section @code{lroundl}
+@findex lroundl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lroundl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lsearch.texi b/gnulib/doc/posix-functions/lsearch.texi
new file mode 100644
index 00000000..d1394122
--- /dev/null
+++ b/gnulib/doc/posix-functions/lsearch.texi
@@ -0,0 +1,18 @@
+@node lsearch
+@section @code{lsearch}
+@findex lsearch
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lsearch.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lseek.texi b/gnulib/doc/posix-functions/lseek.texi
new file mode 100644
index 00000000..68237b4d
--- /dev/null
+++ b/gnulib/doc/posix-functions/lseek.texi
@@ -0,0 +1,35 @@
+@node lseek
+@section @code{lseek}
+@findex lseek
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lseek.html}
+
+Gnulib module: lseek
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function mistakenly succeeds on pipes on some platforms: mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+POSIX does not specify which file descriptors support seeking and which don't.
+In practice, regular files and block devices support seeking, and ttys, pipes,
+and most character devices don't support it.
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{lseek} does not work
+correctly with files larger than 2 GB. The fix is to use the
+@code{AC_SYS_LARGEFILE} macro.
+@item
+When the third argument is invalid, POSIX says that @code{lseek} should set
+@code{errno} to @code{EINVAL} and return -1, but in this situation a
+@code{SIGSYS} signal is raised on some platforms:
+IRIX 6.5.
+@item
+When the @code{lseek} function fails, POSIX says that the file offset remains
+unchanged. But on some platforms, attempting to set a negative file offset
+fails and sets the file offset to 0:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/lstat.texi b/gnulib/doc/posix-functions/lstat.texi
new file mode 100644
index 00000000..39d2dcef
--- /dev/null
+++ b/gnulib/doc/posix-functions/lstat.texi
@@ -0,0 +1,42 @@
+@node lstat
+@section @code{lstat}
+@findex lstat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/lstat.html}
+
+Gnulib module: lstat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+For symlinks, when the argument ends in a slash, some platforms don't
+dereference the argument:
+Solaris 9.
+@item
+On some platforms, @code{lstat("file/",buf)} succeeds instead of
+failing with @code{ENOTDIR}.
+Solaris 9.
+@item
+On Windows platforms (excluding Cygwin), symlinks are not supported, so
+@code{lstat} does not exist.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{lstat} may not
+correctly report the size of files or block devices larger than 2 GB. The fix
+is to use the @code{AC_SYS_LARGEFILE} macro.
+@item
+On Windows platforms (excluding Cygwin), @code{st_ino} is always 0.
+@item
+Because of the definition of @code{struct stat}, it is not possible to
+portably replace @code{stat} via an object-like macro. Therefore,
+expressions such as @code{(islnk ? lstat : stat) (name, buf)} are not
+portable, and should instead be written @code{islnk ? lstat (name,
+buf) : stat (name, buf)}.
+@item
+On some file systems, @code{st_size} contains bogus information for
+symlinks; use the gnulib module areadlink-with-size for a better way
+to get symlink contents.
+@end itemize
diff --git a/gnulib/doc/posix-functions/malloc.texi b/gnulib/doc/posix-functions/malloc.texi
new file mode 100644
index 00000000..bd2a8cf5
--- /dev/null
+++ b/gnulib/doc/posix-functions/malloc.texi
@@ -0,0 +1,25 @@
+@node malloc
+@section @code{malloc}
+@findex malloc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/malloc.html}
+
+Gnulib module: malloc-posix
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Upon failure, the function does not set @code{errno} to @code{ENOMEM} on
+some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@code{malloc (0)} always returns a NULL pointer on some platforms:
+AIX 5.1, OSF/1 5.1.
+@end itemize
+
+Extension: Gnulib provides a module @samp{malloc} that substitutes a
+@code{malloc} implementation that behaves more like the glibc implementation,
+regarding the result of @code{malloc (0)}.
diff --git a/gnulib/doc/posix-functions/mblen.texi b/gnulib/doc/posix-functions/mblen.texi
new file mode 100644
index 00000000..161a360d
--- /dev/null
+++ b/gnulib/doc/posix-functions/mblen.texi
@@ -0,0 +1,15 @@
+@node mblen
+@section @code{mblen}
+@findex mblen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mblen.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mbrlen.texi b/gnulib/doc/posix-functions/mbrlen.texi
new file mode 100644
index 00000000..7e413581
--- /dev/null
+++ b/gnulib/doc/posix-functions/mbrlen.texi
@@ -0,0 +1,30 @@
+@node mbrlen
+@section @code{mbrlen}
+@findex mbrlen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mbrlen.html}
+
+Gnulib module: mbrlen
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, mingw, Interix 3.5.
+@item
+This function does not put the state into non-initial state when parsing an
+incomplete multibyte character on some platforms:
+AIX 5.1, OSF/1 5.1.
+@item
+This function returns the total number of bytes that make up the multibyte
+character, not the number of bytes that were needed to complete the multibyte
+character, on some platforms:
+HP-UX 11.11, Solaris 10.
+@item
+This function may not return 0 when parsing the NUL character on some platforms:
+Solaris 9.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mbrtowc.texi b/gnulib/doc/posix-functions/mbrtowc.texi
new file mode 100644
index 00000000..8e19b36e
--- /dev/null
+++ b/gnulib/doc/posix-functions/mbrtowc.texi
@@ -0,0 +1,41 @@
+@node mbrtowc
+@section @code{mbrtowc}
+@findex mbrtowc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mbrtowc.html}
+
+Gnulib module: mbrtowc
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, mingw, Interix 3.5.
+@item
+This function does not put the state into non-initial state when parsing an
+incomplete multibyte character on some platforms:
+AIX 5.1, OSF/1 5.1.
+@item
+This function does not produce correct results in the zh_CN.GB18030 locale on
+some platforms:
+Solaris 8.
+@item
+This function does not ignore the @code{pwc} argument if the string argument is
+NULL on some platforms:
+OSF/1 5.1.
+@item
+This function returns the total number of bytes that make up the multibyte
+character, not the number of bytes that were needed to complete the multibyte
+character, on some platforms:
+HP-UX 11.11, Solaris 10.
+@item
+This function may not return 0 when parsing the NUL character on some platforms:
+Solaris 9.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mbsinit.texi b/gnulib/doc/posix-functions/mbsinit.texi
new file mode 100644
index 00000000..140f26b6
--- /dev/null
+++ b/gnulib/doc/posix-functions/mbsinit.texi
@@ -0,0 +1,18 @@
+@node mbsinit
+@section @code{mbsinit}
+@findex mbsinit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mbsinit.html}
+
+Gnulib module: mbsinit
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mbsnrtowcs.texi b/gnulib/doc/posix-functions/mbsnrtowcs.texi
new file mode 100644
index 00000000..cc74b819
--- /dev/null
+++ b/gnulib/doc/posix-functions/mbsnrtowcs.texi
@@ -0,0 +1,28 @@
+@node mbsnrtowcs
+@section @code{mbsnrtowcs}
+@findex mbsnrtowcs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mbsnrtowcs.html}
+
+Gnulib module: mbsnrtowcs
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@item
+The specification is not clear about whether this function should update the
+conversion state when the first argument (the destination pointer) is NULL.
+The glibc, MacOS X, FreeBSD implementations do update the state in this case.
+For portability, when passing a NULL destination argument, it is best to pass
+a pointer to a temporary copy of the conversion state.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mbsrtowcs.texi b/gnulib/doc/posix-functions/mbsrtowcs.texi
new file mode 100644
index 00000000..bc4e9147
--- /dev/null
+++ b/gnulib/doc/posix-functions/mbsrtowcs.texi
@@ -0,0 +1,31 @@
+@node mbsrtowcs
+@section @code{mbsrtowcs}
+@findex mbsrtowcs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mbsrtowcs.html}
+
+Gnulib module: mbsrtowcs
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, mingw, Interix 3.5.
+@item
+This function does not work on some platforms:
+HP-UX 11, Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@item
+The specification is not clear about whether this function should update the
+conversion state when the first argument (the destination pointer) is NULL.
+The glibc implementation does not update the state in this case; the MacOS X
+and FreeBSD implementations do.
+For portability, when passing a NULL destination argument, it is best to pass
+a pointer to a temporary copy of the conversion state.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mbstowcs.texi b/gnulib/doc/posix-functions/mbstowcs.texi
new file mode 100644
index 00000000..00e0cacd
--- /dev/null
+++ b/gnulib/doc/posix-functions/mbstowcs.texi
@@ -0,0 +1,18 @@
+@node mbstowcs
+@section @code{mbstowcs}
+@findex mbstowcs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mbstowcs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mbtowc.texi b/gnulib/doc/posix-functions/mbtowc.texi
new file mode 100644
index 00000000..a99f5294
--- /dev/null
+++ b/gnulib/doc/posix-functions/mbtowc.texi
@@ -0,0 +1,21 @@
+@node mbtowc
+@section @code{mbtowc}
+@findex mbtowc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mbtowc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function accumulates hidden state on some platforms:
+glibc 2.8 (see @url{http://sourceware.org/bugzilla/show_bug.cgi?id=9674}).
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/memccpy.texi b/gnulib/doc/posix-functions/memccpy.texi
new file mode 100644
index 00000000..0eb8e039
--- /dev/null
+++ b/gnulib/doc/posix-functions/memccpy.texi
@@ -0,0 +1,18 @@
+@node memccpy
+@section @code{memccpy}
+@findex memccpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/memccpy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/memchr.texi b/gnulib/doc/posix-functions/memchr.texi
new file mode 100644
index 00000000..4a793de5
--- /dev/null
+++ b/gnulib/doc/posix-functions/memchr.texi
@@ -0,0 +1,21 @@
+@node memchr
+@section @code{memchr}
+@findex memchr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/memchr.html}
+
+Gnulib module: memchr
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some older platforms.
+
+@item
+This function dereferences too much memory on some platforms:
+glibc 2.10 on x86_64, IA-64, Alpha.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/memcmp.texi b/gnulib/doc/posix-functions/memcmp.texi
new file mode 100644
index 00000000..e556914b
--- /dev/null
+++ b/gnulib/doc/posix-functions/memcmp.texi
@@ -0,0 +1,24 @@
+@node memcmp
+@section @code{memcmp}
+@findex memcmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/memcmp.html}
+
+Gnulib module: memcmp
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some older platforms.
+@item
+This function does not work on 8-bit data on some older platforms:
+SunOS 4.1.3.
+@item
+This function fails when comparing 16 bytes or more and with at least one
+buffer not starting on a 4-byte boundary on some older platforms:
+NeXTstep/x86.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/memcpy.texi b/gnulib/doc/posix-functions/memcpy.texi
new file mode 100644
index 00000000..5a88b290
--- /dev/null
+++ b/gnulib/doc/posix-functions/memcpy.texi
@@ -0,0 +1,17 @@
+@node memcpy
+@section @code{memcpy}
+@findex memcpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/memcpy.html}
+
+Gnulib module: memcpy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some older platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/memmove.texi b/gnulib/doc/posix-functions/memmove.texi
new file mode 100644
index 00000000..3ddfb5ec
--- /dev/null
+++ b/gnulib/doc/posix-functions/memmove.texi
@@ -0,0 +1,17 @@
+@node memmove
+@section @code{memmove}
+@findex memmove
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/memmove.html}
+
+Gnulib module: memmove
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some older platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/memset.texi b/gnulib/doc/posix-functions/memset.texi
new file mode 100644
index 00000000..3bb256a9
--- /dev/null
+++ b/gnulib/doc/posix-functions/memset.texi
@@ -0,0 +1,17 @@
+@node memset
+@section @code{memset}
+@findex memset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/memset.html}
+
+Gnulib module: memset
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some older platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mkdir.texi b/gnulib/doc/posix-functions/mkdir.texi
new file mode 100644
index 00000000..69b67a52
--- /dev/null
+++ b/gnulib/doc/posix-functions/mkdir.texi
@@ -0,0 +1,32 @@
+@node mkdir
+@section @code{mkdir}
+@findex mkdir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mkdir.html}
+
+Gnulib module: mkdir
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+When the argument ends in a slash, the function call fails on some platforms.
+@item
+This function mistakenly succeeds on @samp{mkdir("d/./",mode)} on
+some platforms:
+Cygwin 1.5.x, mingw.
+@item
+On Windows platforms (excluding Cygwin), this function is called @code{_mkdir}
+and takes only one argument. The fix (without Gnulib) is to define a macro
+like this:
+@smallexample
+#define mkdir ((int (*)()) _mkdir)
+@end smallexample
+or
+@smallexample
+#define mkdir(path,mode) _mkdir (path)
+@end smallexample
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mkdirat.texi b/gnulib/doc/posix-functions/mkdirat.texi
new file mode 100644
index 00000000..adfc7aa2
--- /dev/null
+++ b/gnulib/doc/posix-functions/mkdirat.texi
@@ -0,0 +1,20 @@
+@node mkdirat
+@section @code{mkdirat}
+@findex mkdirat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mkdirat.html}
+
+Gnulib module: openat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mkdtemp.texi b/gnulib/doc/posix-functions/mkdtemp.texi
new file mode 100644
index 00000000..5322078d
--- /dev/null
+++ b/gnulib/doc/posix-functions/mkdtemp.texi
@@ -0,0 +1,18 @@
+@node mkdtemp
+@section @code{mkdtemp}
+@findex mkdtemp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mkdtemp.html}
+
+Gnulib module: mkdtemp
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mkfifo.texi b/gnulib/doc/posix-functions/mkfifo.texi
new file mode 100644
index 00000000..ea872b1b
--- /dev/null
+++ b/gnulib/doc/posix-functions/mkfifo.texi
@@ -0,0 +1,22 @@
+@node mkfifo
+@section @code{mkfifo}
+@findex mkfifo
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mkfifo.html}
+
+Gnulib module: mkfifo
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function mishandles trailing slash on some platforms:
+FreeBSD 7.2, Solaris 9.
+@item
+This function is missing on some platforms; however, the replacement
+always fails with @code{ENOSYS}:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mkfifoat.texi b/gnulib/doc/posix-functions/mkfifoat.texi
new file mode 100644
index 00000000..2cd9f6f1
--- /dev/null
+++ b/gnulib/doc/posix-functions/mkfifoat.texi
@@ -0,0 +1,25 @@
+@node mkfifoat
+@section @code{mkfifoat}
+@findex mkfifoat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mkfifoat.html}
+
+Gnulib module: mkfifoat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw,
+Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The gnulib replacement function always fails with @samp{ENOSYS} on
+some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mknod.texi b/gnulib/doc/posix-functions/mknod.texi
new file mode 100644
index 00000000..99105eab
--- /dev/null
+++ b/gnulib/doc/posix-functions/mknod.texi
@@ -0,0 +1,29 @@
+@node mknod
+@section @code{mknod}
+@findex mknod
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mknod.html}
+
+Gnulib module: mknod
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function requires super-user privileges to create a fifo:
+FreeBSD 7.2, OpenBSD 3.8.
+@item
+This function mishandles trailing slash on some platforms:
+FreeBSD 7.2, Solaris 9.
+@item
+This function is missing on some platforms; however, the replacement
+always fails with @code{ENOSYS}:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Use of this function for anything except fifos is not portable,
+generally requiring super-user privileges and knowledge of supported
+device numbers.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mknodat.texi b/gnulib/doc/posix-functions/mknodat.texi
new file mode 100644
index 00000000..6a6ed3fd
--- /dev/null
+++ b/gnulib/doc/posix-functions/mknodat.texi
@@ -0,0 +1,25 @@
+@node mknodat
+@section @code{mknodat}
+@findex mknodat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mknodat.html}
+
+Gnulib module: mkfifoat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw,
+Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The gnulib replacement function always fails with @samp{ENOSYS} on
+some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mkstemp.texi b/gnulib/doc/posix-functions/mkstemp.texi
new file mode 100644
index 00000000..3b686fea
--- /dev/null
+++ b/gnulib/doc/posix-functions/mkstemp.texi
@@ -0,0 +1,26 @@
+@node mkstemp
+@section @code{mkstemp}
+@findex mkstemp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mkstemp.html}
+
+Gnulib module: mkstemp
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+On some platforms (HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a silly
+limit that it can create no more than 26 files from a given template. On
+OSF/1 4.0f, it can create only 32 files per process.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On platforms other than glibc 2.0.7 or newer, @code{mkstemp} can create a
+world or group writable or readable file, if you haven't set the process
+umask to 077. This is a security risk.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mktime.texi b/gnulib/doc/posix-functions/mktime.texi
new file mode 100644
index 00000000..c1511e39
--- /dev/null
+++ b/gnulib/doc/posix-functions/mktime.texi
@@ -0,0 +1,19 @@
+@node mktime
+@section @code{mktime}
+@findex mktime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mktime.html}
+
+Gnulib module: mktime
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+@code{mktime} may go into an endless loop on some platforms.
+@item
+@code{mktime} may occasionally return wrong results on some platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/mlock.texi b/gnulib/doc/posix-functions/mlock.texi
new file mode 100644
index 00000000..ff9fd00a
--- /dev/null
+++ b/gnulib/doc/posix-functions/mlock.texi
@@ -0,0 +1,18 @@
+@node mlock
+@section @code{mlock}
+@findex mlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OSF/1 4.0, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mlockall.texi b/gnulib/doc/posix-functions/mlockall.texi
new file mode 100644
index 00000000..d570248a
--- /dev/null
+++ b/gnulib/doc/posix-functions/mlockall.texi
@@ -0,0 +1,18 @@
+@node mlockall
+@section @code{mlockall}
+@findex mlockall
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mlockall.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OSF/1 4.0, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mmap.texi b/gnulib/doc/posix-functions/mmap.texi
new file mode 100644
index 00000000..3e100c1e
--- /dev/null
+++ b/gnulib/doc/posix-functions/mmap.texi
@@ -0,0 +1,29 @@
+@node mmap
+@section @code{mmap}
+@findex mmap
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mmap.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+To get anonymous memory, on some platforms, you can use the flags
+@code{MAP_ANONYMOUS | MAP_PRIVATE} and @code{-1} instead of a file descriptor;
+on others you have to use a read-only file descriptor of @file{/dev/zero}.
+@item
+On HP-UX, passing a non-NULL first argument, as a hint for the address (even
+without @code{MAP_FIXED}, often causes @code{mmap} to fail. Better pass NULL
+in this case.
+@item
+On HP-UX, @code{MAP_FIXED} basically never works. On other platforms, it depends
+on the circumstances whether memory can be returned at a given address.
+@end itemize
diff --git a/gnulib/doc/posix-functions/modf.texi b/gnulib/doc/posix-functions/modf.texi
new file mode 100644
index 00000000..6524a60b
--- /dev/null
+++ b/gnulib/doc/posix-functions/modf.texi
@@ -0,0 +1,15 @@
+@node modf
+@section @code{modf}
+@findex modf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/modf.html}
+
+Gnulib module: modf
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/modff.texi b/gnulib/doc/posix-functions/modff.texi
new file mode 100644
index 00000000..503df2b2
--- /dev/null
+++ b/gnulib/doc/posix-functions/modff.texi
@@ -0,0 +1,18 @@
+@node modff
+@section @code{modff}
+@findex modff
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/modff.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, HP-UX 11.
+@end itemize
diff --git a/gnulib/doc/posix-functions/modfl.texi b/gnulib/doc/posix-functions/modfl.texi
new file mode 100644
index 00000000..4fefa420
--- /dev/null
+++ b/gnulib/doc/posix-functions/modfl.texi
@@ -0,0 +1,18 @@
+@node modfl
+@section @code{modfl}
+@findex modfl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/modfl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mprotect.texi b/gnulib/doc/posix-functions/mprotect.texi
new file mode 100644
index 00000000..218926d1
--- /dev/null
+++ b/gnulib/doc/posix-functions/mprotect.texi
@@ -0,0 +1,24 @@
+@node mprotect
+@section @code{mprotect}
+@findex mprotect
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mprotect.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+This function does not set @code{errno} on some platforms:
+mingw.
+@item
+On AIX, it is not possible to use @code{mprotect} on memory regions allocated
+with @code{malloc}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_close.texi b/gnulib/doc/posix-functions/mq_close.texi
new file mode 100644
index 00000000..9c7d6314
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_close.texi
@@ -0,0 +1,19 @@
+@node mq_close
+@section @code{mq_close}
+@findex mq_close
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_close.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris
+2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_getattr.texi b/gnulib/doc/posix-functions/mq_getattr.texi
new file mode 100644
index 00000000..295f3a45
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_getattr.texi
@@ -0,0 +1,19 @@
+@node mq_getattr
+@section @code{mq_getattr}
+@findex mq_getattr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_getattr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris
+2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_notify.texi b/gnulib/doc/posix-functions/mq_notify.texi
new file mode 100644
index 00000000..b07f68ad
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_notify.texi
@@ -0,0 +1,19 @@
+@node mq_notify
+@section @code{mq_notify}
+@findex mq_notify
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_notify.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris
+2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_open.texi b/gnulib/doc/posix-functions/mq_open.texi
new file mode 100644
index 00000000..66f4240f
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_open.texi
@@ -0,0 +1,19 @@
+@node mq_open
+@section @code{mq_open}
+@findex mq_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_open.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris
+2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_receive.texi b/gnulib/doc/posix-functions/mq_receive.texi
new file mode 100644
index 00000000..392b4dcd
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_receive.texi
@@ -0,0 +1,19 @@
+@node mq_receive
+@section @code{mq_receive}
+@findex mq_receive
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_receive.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris
+2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_send.texi b/gnulib/doc/posix-functions/mq_send.texi
new file mode 100644
index 00000000..cc0d3576
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_send.texi
@@ -0,0 +1,19 @@
+@node mq_send
+@section @code{mq_send}
+@findex mq_send
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_send.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris
+2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_setattr.texi b/gnulib/doc/posix-functions/mq_setattr.texi
new file mode 100644
index 00000000..cc411375
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_setattr.texi
@@ -0,0 +1,19 @@
+@node mq_setattr
+@section @code{mq_setattr}
+@findex mq_setattr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_setattr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris
+2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_timedreceive.texi b/gnulib/doc/posix-functions/mq_timedreceive.texi
new file mode 100644
index 00000000..9f028e91
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_timedreceive.texi
@@ -0,0 +1,19 @@
+@node mq_timedreceive
+@section @code{mq_timedreceive}
+@findex mq_timedreceive
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_timedreceive.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_timedsend.texi b/gnulib/doc/posix-functions/mq_timedsend.texi
new file mode 100644
index 00000000..2e3954c2
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_timedsend.texi
@@ -0,0 +1,19 @@
+@node mq_timedsend
+@section @code{mq_timedsend}
+@findex mq_timedsend
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_timedsend.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mq_unlink.texi b/gnulib/doc/posix-functions/mq_unlink.texi
new file mode 100644
index 00000000..aa13407e
--- /dev/null
+++ b/gnulib/doc/posix-functions/mq_unlink.texi
@@ -0,0 +1,19 @@
+@node mq_unlink
+@section @code{mq_unlink}
+@findex mq_unlink
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mq_unlink.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris
+2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/mrand48.texi b/gnulib/doc/posix-functions/mrand48.texi
new file mode 100644
index 00000000..2f092d54
--- /dev/null
+++ b/gnulib/doc/posix-functions/mrand48.texi
@@ -0,0 +1,18 @@
+@node mrand48
+@section @code{mrand48}
+@findex mrand48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/mrand48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/msgctl.texi b/gnulib/doc/posix-functions/msgctl.texi
new file mode 100644
index 00000000..65ae32f2
--- /dev/null
+++ b/gnulib/doc/posix-functions/msgctl.texi
@@ -0,0 +1,18 @@
+@node msgctl
+@section @code{msgctl}
+@findex msgctl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/msgctl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/msgget.texi b/gnulib/doc/posix-functions/msgget.texi
new file mode 100644
index 00000000..8013a719
--- /dev/null
+++ b/gnulib/doc/posix-functions/msgget.texi
@@ -0,0 +1,18 @@
+@node msgget
+@section @code{msgget}
+@findex msgget
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/msgget.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/msgrcv.texi b/gnulib/doc/posix-functions/msgrcv.texi
new file mode 100644
index 00000000..bbecd7c5
--- /dev/null
+++ b/gnulib/doc/posix-functions/msgrcv.texi
@@ -0,0 +1,18 @@
+@node msgrcv
+@section @code{msgrcv}
+@findex msgrcv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/msgrcv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/msgsnd.texi b/gnulib/doc/posix-functions/msgsnd.texi
new file mode 100644
index 00000000..64b92236
--- /dev/null
+++ b/gnulib/doc/posix-functions/msgsnd.texi
@@ -0,0 +1,18 @@
+@node msgsnd
+@section @code{msgsnd}
+@findex msgsnd
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/msgsnd.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/msync.texi b/gnulib/doc/posix-functions/msync.texi
new file mode 100644
index 00000000..e50700ac
--- /dev/null
+++ b/gnulib/doc/posix-functions/msync.texi
@@ -0,0 +1,20 @@
+@node msync
+@section @code{msync}
+@findex msync
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/msync.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+On NetBSD, @code{msync} takes only two arguments.
+@end itemize
diff --git a/gnulib/doc/posix-functions/munlock.texi b/gnulib/doc/posix-functions/munlock.texi
new file mode 100644
index 00000000..19b81a36
--- /dev/null
+++ b/gnulib/doc/posix-functions/munlock.texi
@@ -0,0 +1,18 @@
+@node munlock
+@section @code{munlock}
+@findex munlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/munlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OSF/1 4.0, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/munlockall.texi b/gnulib/doc/posix-functions/munlockall.texi
new file mode 100644
index 00000000..45ab4b75
--- /dev/null
+++ b/gnulib/doc/posix-functions/munlockall.texi
@@ -0,0 +1,18 @@
+@node munlockall
+@section @code{munlockall}
+@findex munlockall
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/munlockall.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OSF/1 4.0, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/munmap.texi b/gnulib/doc/posix-functions/munmap.texi
new file mode 100644
index 00000000..247752f8
--- /dev/null
+++ b/gnulib/doc/posix-functions/munmap.texi
@@ -0,0 +1,18 @@
+@node munmap
+@section @code{munmap}
+@findex munmap
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/munmap.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nan.texi b/gnulib/doc/posix-functions/nan.texi
new file mode 100644
index 00000000..3a591aea
--- /dev/null
+++ b/gnulib/doc/posix-functions/nan.texi
@@ -0,0 +1,18 @@
+@node nan
+@section @code{nan}
+@findex nan
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nan.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nanf.texi b/gnulib/doc/posix-functions/nanf.texi
new file mode 100644
index 00000000..40d5ed3f
--- /dev/null
+++ b/gnulib/doc/posix-functions/nanf.texi
@@ -0,0 +1,18 @@
+@node nanf
+@section @code{nanf}
+@findex nanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nanl.texi b/gnulib/doc/posix-functions/nanl.texi
new file mode 100644
index 00000000..9c879e09
--- /dev/null
+++ b/gnulib/doc/posix-functions/nanl.texi
@@ -0,0 +1,18 @@
+@node nanl
+@section @code{nanl}
+@findex nanl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nanl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nanosleep.texi b/gnulib/doc/posix-functions/nanosleep.texi
new file mode 100644
index 00000000..f4f0b565
--- /dev/null
+++ b/gnulib/doc/posix-functions/nanosleep.texi
@@ -0,0 +1,29 @@
+@node nanosleep
+@section @code{nanosleep}
+@findex nanosleep
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html}
+
+Gnulib module: nanosleep
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, Interix 3.5, BeOS.
+@item
+This function reports failure when called with small arguments such as 1 ns
+on some platforms:
+AIX 4.3.2.
+@item
+This function mishandles large arguments when interrupted by a signal on some
+platforms:
+Linux 64-bit, Solaris 64-bit.
+@item
+This function cannot sleep longer than 49.7 days on some platforms:
+Cygwin 1.5.x.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/nearbyint.texi b/gnulib/doc/posix-functions/nearbyint.texi
new file mode 100644
index 00000000..5cf71e63
--- /dev/null
+++ b/gnulib/doc/posix-functions/nearbyint.texi
@@ -0,0 +1,18 @@
+@node nearbyint
+@section @code{nearbyint}
+@findex nearbyint
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nearbyint.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nearbyintf.texi b/gnulib/doc/posix-functions/nearbyintf.texi
new file mode 100644
index 00000000..886788c4
--- /dev/null
+++ b/gnulib/doc/posix-functions/nearbyintf.texi
@@ -0,0 +1,18 @@
+@node nearbyintf
+@section @code{nearbyintf}
+@findex nearbyintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nearbyintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nearbyintl.texi b/gnulib/doc/posix-functions/nearbyintl.texi
new file mode 100644
index 00000000..2da9076d
--- /dev/null
+++ b/gnulib/doc/posix-functions/nearbyintl.texi
@@ -0,0 +1,18 @@
+@node nearbyintl
+@section @code{nearbyintl}
+@findex nearbyintl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nearbyintl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/newlocale.texi b/gnulib/doc/posix-functions/newlocale.texi
new file mode 100644
index 00000000..fb21aff5
--- /dev/null
+++ b/gnulib/doc/posix-functions/newlocale.texi
@@ -0,0 +1,18 @@
+@node newlocale
+@section @code{newlocale}
+@findex newlocale
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/newlocale.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nextafter.texi b/gnulib/doc/posix-functions/nextafter.texi
new file mode 100644
index 00000000..c7bed98e
--- /dev/null
+++ b/gnulib/doc/posix-functions/nextafter.texi
@@ -0,0 +1,15 @@
+@node nextafter
+@section @code{nextafter}
+@findex nextafter
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nextafter.html}
+
+Gnulib module: nextafter
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/nextafterf.texi b/gnulib/doc/posix-functions/nextafterf.texi
new file mode 100644
index 00000000..5148da73
--- /dev/null
+++ b/gnulib/doc/posix-functions/nextafterf.texi
@@ -0,0 +1,18 @@
+@node nextafterf
+@section @code{nextafterf}
+@findex nextafterf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nextafterf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, AIX 5.1, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nextafterl.texi b/gnulib/doc/posix-functions/nextafterl.texi
new file mode 100644
index 00000000..3770814f
--- /dev/null
+++ b/gnulib/doc/posix-functions/nextafterl.texi
@@ -0,0 +1,18 @@
+@node nextafterl
+@section @code{nextafterl}
+@findex nextafterl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nextafterl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nexttoward.texi b/gnulib/doc/posix-functions/nexttoward.texi
new file mode 100644
index 00000000..95c0a2ec
--- /dev/null
+++ b/gnulib/doc/posix-functions/nexttoward.texi
@@ -0,0 +1,18 @@
+@node nexttoward
+@section @code{nexttoward}
+@findex nexttoward
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nexttoward.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nexttowardf.texi b/gnulib/doc/posix-functions/nexttowardf.texi
new file mode 100644
index 00000000..224083d4
--- /dev/null
+++ b/gnulib/doc/posix-functions/nexttowardf.texi
@@ -0,0 +1,18 @@
+@node nexttowardf
+@section @code{nexttowardf}
+@findex nexttowardf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nexttowardf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nexttowardl.texi b/gnulib/doc/posix-functions/nexttowardl.texi
new file mode 100644
index 00000000..eadeff52
--- /dev/null
+++ b/gnulib/doc/posix-functions/nexttowardl.texi
@@ -0,0 +1,18 @@
+@node nexttowardl
+@section @code{nexttowardl}
+@findex nexttowardl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nexttowardl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nftw.texi b/gnulib/doc/posix-functions/nftw.texi
new file mode 100644
index 00000000..7542fdc5
--- /dev/null
+++ b/gnulib/doc/posix-functions/nftw.texi
@@ -0,0 +1,18 @@
+@node nftw
+@section @code{nftw}
+@findex nftw
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nftw.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nice.texi b/gnulib/doc/posix-functions/nice.texi
new file mode 100644
index 00000000..77edafd1
--- /dev/null
+++ b/gnulib/doc/posix-functions/nice.texi
@@ -0,0 +1,20 @@
+@node nice
+@section @code{nice}
+@findex nice
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nice.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+In glibc before glibc 2.2.4, @code{nice} returned 0 upon success.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nl_langinfo.texi b/gnulib/doc/posix-functions/nl_langinfo.texi
new file mode 100644
index 00000000..0850a8a9
--- /dev/null
+++ b/gnulib/doc/posix-functions/nl_langinfo.texi
@@ -0,0 +1,31 @@
+@node nl_langinfo
+@section @code{nl_langinfo}
+@findex nl_langinfo
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nl_langinfo.html}
+
+Gnulib module: nl_langinfo
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+The constant @code{CODESET} is not supported on some platforms:
+glibc 2.0.6, OpenBSD 3.8.
+@item
+The constants @code{ERA}, @code{ERA_D_FMT}, @code{ERA_D_T_FMT},
+@code{ERA_T_FMT}, @code{ALT_DIGITS} are not supported on some platforms:
+OpenBSD 3.8.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Cygwin 1.5.x, which doesn't have locales, @code{nl_langinfo(CODESET)} always
+returns @code{"US-ASCII"}.
+
+@item
+On Cygwin 1.7.0, only the charset portion of a locale designation is honored.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nl_langinfo_l.texi b/gnulib/doc/posix-functions/nl_langinfo_l.texi
new file mode 100644
index 00000000..80928c4a
--- /dev/null
+++ b/gnulib/doc/posix-functions/nl_langinfo_l.texi
@@ -0,0 +1,18 @@
+@node nl_langinfo_l
+@section @code{nl_langinfo_l}
+@findex nl_langinfo_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nl_langinfo_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/nrand48.texi b/gnulib/doc/posix-functions/nrand48.texi
new file mode 100644
index 00000000..6c0566f8
--- /dev/null
+++ b/gnulib/doc/posix-functions/nrand48.texi
@@ -0,0 +1,18 @@
+@node nrand48
+@section @code{nrand48}
+@findex nrand48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/nrand48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ntohl.texi b/gnulib/doc/posix-functions/ntohl.texi
new file mode 100644
index 00000000..53ccb9ae
--- /dev/null
+++ b/gnulib/doc/posix-functions/ntohl.texi
@@ -0,0 +1,18 @@
+@node ntohl
+@section @code{ntohl}
+@findex ntohl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ntohl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ntohs.texi b/gnulib/doc/posix-functions/ntohs.texi
new file mode 100644
index 00000000..cf0dd0c6
--- /dev/null
+++ b/gnulib/doc/posix-functions/ntohs.texi
@@ -0,0 +1,18 @@
+@node ntohs
+@section @code{ntohs}
+@findex ntohs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ntohs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/open.texi b/gnulib/doc/posix-functions/open.texi
new file mode 100644
index 00000000..933a2461
--- /dev/null
+++ b/gnulib/doc/posix-functions/open.texi
@@ -0,0 +1,38 @@
+@node open
+@section @code{open}
+@findex open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/open.html}
+
+Gnulib module: open, fchdir
+
+Portability problems fixed by the Gnulib module open:
+@itemize
+@item
+This function does not fail when the file name argument ends in a slash
+and (without the slash) names a nonexistent file or a file that is not a
+directory, on some platforms:
+FreeBSD 7.2, HP-UX 11.00, Solaris 9, Irix 5.3.
+@item
+On Windows platforms (excluding Cygwin), this function does usually not
+recognize the @file{/dev/null} filename.
+@end itemize
+
+Portability problems fixed by the Gnulib module fchdir:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function fails to open a
+read-only descriptor for directories.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows, this function returns a file handle in @code{O_TEXT} mode by
+default; this means that it translates '\n' to CR/LF by default. Use the
+@code{O_BINARY} flag if you need reliable binary I/O.
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{open} may not work
+correctly with files larger than 2 GB. The fix is to use the
+@code{AC_SYS_LARGEFILE} macro.
+@end itemize
diff --git a/gnulib/doc/posix-functions/open_memstream.texi b/gnulib/doc/posix-functions/open_memstream.texi
new file mode 100644
index 00000000..ccee96dd
--- /dev/null
+++ b/gnulib/doc/posix-functions/open_memstream.texi
@@ -0,0 +1,19 @@
+@node open_memstream
+@section @code{open_memstream}
+@findex open_memstream
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/open_wmemstream.texi b/gnulib/doc/posix-functions/open_wmemstream.texi
new file mode 100644
index 00000000..cb00fe4f
--- /dev/null
+++ b/gnulib/doc/posix-functions/open_wmemstream.texi
@@ -0,0 +1,22 @@
+@node open_wmemstream
+@section @code{open_wmemstream}
+@findex open_wmemstream
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/open_wmemstream.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/openat.texi b/gnulib/doc/posix-functions/openat.texi
new file mode 100644
index 00000000..2bfe6116
--- /dev/null
+++ b/gnulib/doc/posix-functions/openat.texi
@@ -0,0 +1,25 @@
+@node openat
+@section @code{openat}
+@findex openat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/openat.html}
+
+Gnulib module: openat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@item
+This function does not fail when the file name argument ends in a slash
+and (without the slash) names a nonexistent file or a file that is not a
+directory, on some platforms:
+Solaris 9.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/opendir.texi b/gnulib/doc/posix-functions/opendir.texi
new file mode 100644
index 00000000..2370c87b
--- /dev/null
+++ b/gnulib/doc/posix-functions/opendir.texi
@@ -0,0 +1,15 @@
+@node opendir
+@section @code{opendir}
+@findex opendir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/opendir.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/openlog.texi b/gnulib/doc/posix-functions/openlog.texi
new file mode 100644
index 00000000..c71e4c6c
--- /dev/null
+++ b/gnulib/doc/posix-functions/openlog.texi
@@ -0,0 +1,18 @@
+@node openlog
+@section @code{openlog}
+@findex openlog
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/openlog.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/optarg.texi b/gnulib/doc/posix-functions/optarg.texi
new file mode 100644
index 00000000..26c7666c
--- /dev/null
+++ b/gnulib/doc/posix-functions/optarg.texi
@@ -0,0 +1,18 @@
+@node optarg
+@section @code{optarg}
+@findex optarg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/optarg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, IRIX 6.5, OSF/1 5.1.
+@end itemize
diff --git a/gnulib/doc/posix-functions/opterr.texi b/gnulib/doc/posix-functions/opterr.texi
new file mode 100644
index 00000000..9dcf45fc
--- /dev/null
+++ b/gnulib/doc/posix-functions/opterr.texi
@@ -0,0 +1,18 @@
+@node opterr
+@section @code{opterr}
+@findex opterr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/opterr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+IRIX 6.5, OSF/1 5.1.
+@end itemize
diff --git a/gnulib/doc/posix-functions/optind.texi b/gnulib/doc/posix-functions/optind.texi
new file mode 100644
index 00000000..66cf3c47
--- /dev/null
+++ b/gnulib/doc/posix-functions/optind.texi
@@ -0,0 +1,18 @@
+@node optind
+@section @code{optind}
+@findex optind
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/optind.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+IRIX 6.5, OSF/1 5.1.
+@end itemize
diff --git a/gnulib/doc/posix-functions/optopt.texi b/gnulib/doc/posix-functions/optopt.texi
new file mode 100644
index 00000000..a9624c31
--- /dev/null
+++ b/gnulib/doc/posix-functions/optopt.texi
@@ -0,0 +1,18 @@
+@node optopt
+@section @code{optopt}
+@findex optopt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/optopt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, IRIX 6.5, OSF/1 5.1.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pathconf.texi b/gnulib/doc/posix-functions/pathconf.texi
new file mode 100644
index 00000000..f8132275
--- /dev/null
+++ b/gnulib/doc/posix-functions/pathconf.texi
@@ -0,0 +1,18 @@
+@node pathconf
+@section @code{pathconf}
+@findex pathconf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pathconf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pause.texi b/gnulib/doc/posix-functions/pause.texi
new file mode 100644
index 00000000..9cd26498
--- /dev/null
+++ b/gnulib/doc/posix-functions/pause.texi
@@ -0,0 +1,18 @@
+@node pause
+@section @code{pause}
+@findex pause
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pause.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pclose.texi b/gnulib/doc/posix-functions/pclose.texi
new file mode 100644
index 00000000..f5b9158b
--- /dev/null
+++ b/gnulib/doc/posix-functions/pclose.texi
@@ -0,0 +1,15 @@
+@node pclose
+@section @code{pclose}
+@findex pclose
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pclose.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/perror.texi b/gnulib/doc/posix-functions/perror.texi
new file mode 100644
index 00000000..6046691d
--- /dev/null
+++ b/gnulib/doc/posix-functions/perror.texi
@@ -0,0 +1,19 @@
+@node perror
+@section @code{perror}
+@findex perror
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/perror.html}
+
+Gnulib module: perror
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function does not support the error values that are specified by POSIX
+but not defined by the system, on some platforms:
+OpenBSD 4.0, OSF/1 5.1, Cygwin 1.5.x, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/pipe.texi b/gnulib/doc/posix-functions/pipe.texi
new file mode 100644
index 00000000..37462de7
--- /dev/null
+++ b/gnulib/doc/posix-functions/pipe.texi
@@ -0,0 +1,18 @@
+@node pipe
+@section @code{pipe}
+@findex pipe
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pipe.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/poll.texi b/gnulib/doc/posix-functions/poll.texi
new file mode 100644
index 00000000..2cbe5a8b
--- /dev/null
+++ b/gnulib/doc/posix-functions/poll.texi
@@ -0,0 +1,22 @@
+@node poll
+@section @code{poll}
+@findex poll
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/poll.html}
+
+Gnulib module: poll
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+This function doesn't work on special files like @file{/dev/null} and ttys like
+@file{/dev/tty} on some platforms:
+MacOS X 10.4.0, AIX 5.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/popen.texi b/gnulib/doc/posix-functions/popen.texi
new file mode 100644
index 00000000..414e573f
--- /dev/null
+++ b/gnulib/doc/posix-functions/popen.texi
@@ -0,0 +1,24 @@
+@node popen
+@section @code{popen}
+@findex popen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/popen.html}
+
+Gnulib module: popen
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some platforms start the child with closed stdin or stdout if the
+standard descriptors were closed in the parent:
+Cygwin 1.5.x.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some platforms mistakenly set the close-on-exec bit, then if it is
+cleared by the application, the platform then leaks file descriptors
+from earlier @code{popen} calls into subsequent @code{popen} children:
+Cygwin 1.5.x.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_fadvise.texi b/gnulib/doc/posix-functions/posix_fadvise.texi
new file mode 100644
index 00000000..333c0383
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_fadvise.texi
@@ -0,0 +1,19 @@
+@node posix_fadvise
+@section @code{posix_fadvise}
+@findex posix_fadvise
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fadvise.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_fallocate.texi b/gnulib/doc/posix-functions/posix_fallocate.texi
new file mode 100644
index 00000000..844f7aa9
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_fallocate.texi
@@ -0,0 +1,19 @@
+@node posix_fallocate
+@section @code{posix_fallocate}
+@findex posix_fallocate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_madvise.texi b/gnulib/doc/posix-functions/posix_madvise.texi
new file mode 100644
index 00000000..68be2958
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_madvise.texi
@@ -0,0 +1,19 @@
+@node posix_madvise
+@section @code{posix_madvise}
+@findex posix_madvise
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_madvise.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_mem_offset.texi b/gnulib/doc/posix-functions/posix_mem_offset.texi
new file mode 100644
index 00000000..7f452556
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_mem_offset.texi
@@ -0,0 +1,18 @@
+@node posix_mem_offset
+@section @code{posix_mem_offset}
+@findex posix_mem_offset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_mem_offset.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_memalign.texi b/gnulib/doc/posix-functions/posix_memalign.texi
new file mode 100644
index 00000000..167247fa
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_memalign.texi
@@ -0,0 +1,19 @@
+@node posix_memalign
+@section @code{posix_memalign}
+@findex posix_memalign
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_memalign.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_openpt.texi b/gnulib/doc/posix-functions/posix_openpt.texi
new file mode 100644
index 00000000..ea74484a
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_openpt.texi
@@ -0,0 +1,19 @@
+@node posix_openpt
+@section @code{posix_openpt}
+@findex posix_openpt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_openpt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 9, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawn.texi b/gnulib/doc/posix-functions/posix_spawn.texi
new file mode 100644
index 00000000..8f355561
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawn.texi
@@ -0,0 +1,25 @@
+@node posix_spawn
+@section @code{posix_spawn}
+@findex posix_spawn
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawn.html}
+
+Gnulib module: posix_spawn
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+When this function fails, it causes the stdio buffer contents to be output
+twice on some platforms:
+AIX 6.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function does not work on some platforms:
+AIX 6.1 (under particular circumstances), mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawn_file_actions_addclose.texi b/gnulib/doc/posix-functions/posix_spawn_file_actions_addclose.texi
new file mode 100644
index 00000000..6b36bc0e
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawn_file_actions_addclose.texi
@@ -0,0 +1,18 @@
+@node posix_spawn_file_actions_addclose
+@section @code{posix_spawn_file_actions_addclose}
+@findex posix_spawn_file_actions_addclose
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_addclose.html}
+
+Gnulib module: posix_spawn_file_actions_addclose
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawn_file_actions_adddup2.texi b/gnulib/doc/posix-functions/posix_spawn_file_actions_adddup2.texi
new file mode 100644
index 00000000..1e272f8f
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawn_file_actions_adddup2.texi
@@ -0,0 +1,18 @@
+@node posix_spawn_file_actions_adddup2
+@section @code{posix_spawn_file_actions_adddup2}
+@findex posix_spawn_file_actions_adddup2
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_adddup2.html}
+
+Gnulib module: posix_spawn_file_actions_adddup2
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawn_file_actions_addopen.texi b/gnulib/doc/posix-functions/posix_spawn_file_actions_addopen.texi
new file mode 100644
index 00000000..03d4ea58
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawn_file_actions_addopen.texi
@@ -0,0 +1,18 @@
+@node posix_spawn_file_actions_addopen
+@section @code{posix_spawn_file_actions_addopen}
+@findex posix_spawn_file_actions_addopen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_addopen.html}
+
+Gnulib module: posix_spawn_file_actions_addopen
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawn_file_actions_destroy.texi b/gnulib/doc/posix-functions/posix_spawn_file_actions_destroy.texi
new file mode 100644
index 00000000..d58f60d7
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawn_file_actions_destroy.texi
@@ -0,0 +1,18 @@
+@node posix_spawn_file_actions_destroy
+@section @code{posix_spawn_file_actions_destroy}
+@findex posix_spawn_file_actions_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_destroy.html}
+
+Gnulib module: posix_spawn_file_actions_destroy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawn_file_actions_init.texi b/gnulib/doc/posix-functions/posix_spawn_file_actions_init.texi
new file mode 100644
index 00000000..d4907912
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawn_file_actions_init.texi
@@ -0,0 +1,18 @@
+@node posix_spawn_file_actions_init
+@section @code{posix_spawn_file_actions_init}
+@findex posix_spawn_file_actions_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_init.html}
+
+Gnulib module: posix_spawn_file_actions_init
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_destroy.texi b/gnulib/doc/posix-functions/posix_spawnattr_destroy.texi
new file mode 100644
index 00000000..03aa63c9
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_destroy.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_destroy
+@section @code{posix_spawnattr_destroy}
+@findex posix_spawnattr_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_destroy.html}
+
+Gnulib module: posix_spawnattr_destroy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_getflags.texi b/gnulib/doc/posix-functions/posix_spawnattr_getflags.texi
new file mode 100644
index 00000000..a511c243
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_getflags.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_getflags
+@section @code{posix_spawnattr_getflags}
+@findex posix_spawnattr_getflags
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getflags.html}
+
+Gnulib module: posix_spawnattr_getflags
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_getpgroup.texi b/gnulib/doc/posix-functions/posix_spawnattr_getpgroup.texi
new file mode 100644
index 00000000..07eb5995
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_getpgroup.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_getpgroup
+@section @code{posix_spawnattr_getpgroup}
+@findex posix_spawnattr_getpgroup
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getpgroup.html}
+
+Gnulib module: posix_spawnattr_getpgroup
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_getschedparam.texi b/gnulib/doc/posix-functions/posix_spawnattr_getschedparam.texi
new file mode 100644
index 00000000..86e145bd
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_getschedparam.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_getschedparam
+@section @code{posix_spawnattr_getschedparam}
+@findex posix_spawnattr_getschedparam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getschedparam.html}
+
+Gnulib module: posix_spawnattr_getschedparam
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_getschedpolicy.texi b/gnulib/doc/posix-functions/posix_spawnattr_getschedpolicy.texi
new file mode 100644
index 00000000..4a64b40f
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_getschedpolicy.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_getschedpolicy
+@section @code{posix_spawnattr_getschedpolicy}
+@findex posix_spawnattr_getschedpolicy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getschedpolicy.html}
+
+Gnulib module: posix_spawnattr_getschedpolicy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_getsigdefault.texi b/gnulib/doc/posix-functions/posix_spawnattr_getsigdefault.texi
new file mode 100644
index 00000000..3d43e74e
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_getsigdefault.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_getsigdefault
+@section @code{posix_spawnattr_getsigdefault}
+@findex posix_spawnattr_getsigdefault
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getsigdefault.html}
+
+Gnulib module: posix_spawnattr_getsigdefault
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_getsigmask.texi b/gnulib/doc/posix-functions/posix_spawnattr_getsigmask.texi
new file mode 100644
index 00000000..5c9a5cdb
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_getsigmask.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_getsigmask
+@section @code{posix_spawnattr_getsigmask}
+@findex posix_spawnattr_getsigmask
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getsigmask.html}
+
+Gnulib module: posix_spawnattr_getsigmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_init.texi b/gnulib/doc/posix-functions/posix_spawnattr_init.texi
new file mode 100644
index 00000000..23a0892f
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_init.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_init
+@section @code{posix_spawnattr_init}
+@findex posix_spawnattr_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_init.html}
+
+Gnulib module: posix_spawnattr_init
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_setflags.texi b/gnulib/doc/posix-functions/posix_spawnattr_setflags.texi
new file mode 100644
index 00000000..6e02ce4f
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_setflags.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_setflags
+@section @code{posix_spawnattr_setflags}
+@findex posix_spawnattr_setflags
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setflags.html}
+
+Gnulib module: posix_spawnattr_setflags
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_setpgroup.texi b/gnulib/doc/posix-functions/posix_spawnattr_setpgroup.texi
new file mode 100644
index 00000000..0ea7ddda
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_setpgroup.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_setpgroup
+@section @code{posix_spawnattr_setpgroup}
+@findex posix_spawnattr_setpgroup
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setpgroup.html}
+
+Gnulib module: posix_spawnattr_setpgroup
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_setschedparam.texi b/gnulib/doc/posix-functions/posix_spawnattr_setschedparam.texi
new file mode 100644
index 00000000..263c240d
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_setschedparam.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_setschedparam
+@section @code{posix_spawnattr_setschedparam}
+@findex posix_spawnattr_setschedparam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setschedparam.html}
+
+Gnulib module: posix_spawnattr_setschedparam
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_setschedpolicy.texi b/gnulib/doc/posix-functions/posix_spawnattr_setschedpolicy.texi
new file mode 100644
index 00000000..1320e7e6
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_setschedpolicy.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_setschedpolicy
+@section @code{posix_spawnattr_setschedpolicy}
+@findex posix_spawnattr_setschedpolicy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setschedpolicy.html}
+
+Gnulib module: posix_spawnattr_setschedpolicy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_setsigdefault.texi b/gnulib/doc/posix-functions/posix_spawnattr_setsigdefault.texi
new file mode 100644
index 00000000..4421183a
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_setsigdefault.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_setsigdefault
+@section @code{posix_spawnattr_setsigdefault}
+@findex posix_spawnattr_setsigdefault
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setsigdefault.html}
+
+Gnulib module: posix_spawnattr_setsigdefault
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnattr_setsigmask.texi b/gnulib/doc/posix-functions/posix_spawnattr_setsigmask.texi
new file mode 100644
index 00000000..377bc5cc
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnattr_setsigmask.texi
@@ -0,0 +1,18 @@
+@node posix_spawnattr_setsigmask
+@section @code{posix_spawnattr_setsigmask}
+@findex posix_spawnattr_setsigmask
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setsigmask.html}
+
+Gnulib module: posix_spawnattr_setsigmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_spawnp.texi b/gnulib/doc/posix-functions/posix_spawnp.texi
new file mode 100644
index 00000000..5882b6d1
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_spawnp.texi
@@ -0,0 +1,25 @@
+@node posix_spawnp
+@section @code{posix_spawnp}
+@findex posix_spawnp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawnp.html}
+
+Gnulib module: posix_spawnp
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+When this function fails, it causes the stdio buffer contents to be output
+twice on some platforms:
+AIX 6.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function does not work on some platforms:
+AIX 6.1 (under particular circumstances), mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_destroy.texi b/gnulib/doc/posix-functions/posix_trace_attr_destroy.texi
new file mode 100644
index 00000000..c0f3914b
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_destroy.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_destroy
+@section @code{posix_trace_attr_destroy}
+@findex posix_trace_attr_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getclockres.texi b/gnulib/doc/posix-functions/posix_trace_attr_getclockres.texi
new file mode 100644
index 00000000..71dd32a5
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getclockres.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getclockres
+@section @code{posix_trace_attr_getclockres}
+@findex posix_trace_attr_getclockres
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getclockres.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getcreatetime.texi b/gnulib/doc/posix-functions/posix_trace_attr_getcreatetime.texi
new file mode 100644
index 00000000..7f083d3a
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getcreatetime.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getcreatetime
+@section @code{posix_trace_attr_getcreatetime}
+@findex posix_trace_attr_getcreatetime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getcreatetime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getgenversion.texi b/gnulib/doc/posix-functions/posix_trace_attr_getgenversion.texi
new file mode 100644
index 00000000..52ea3ed4
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getgenversion.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getgenversion
+@section @code{posix_trace_attr_getgenversion}
+@findex posix_trace_attr_getgenversion
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getgenversion.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getinherited.texi b/gnulib/doc/posix-functions/posix_trace_attr_getinherited.texi
new file mode 100644
index 00000000..4033947a
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getinherited.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getinherited
+@section @code{posix_trace_attr_getinherited}
+@findex posix_trace_attr_getinherited
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getinherited.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getlogfullpolicy.texi b/gnulib/doc/posix-functions/posix_trace_attr_getlogfullpolicy.texi
new file mode 100644
index 00000000..52e1cf81
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getlogfullpolicy.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getlogfullpolicy
+@section @code{posix_trace_attr_getlogfullpolicy}
+@findex posix_trace_attr_getlogfullpolicy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getlogfullpolicy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getlogsize.texi b/gnulib/doc/posix-functions/posix_trace_attr_getlogsize.texi
new file mode 100644
index 00000000..a5b15f24
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getlogsize.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getlogsize
+@section @code{posix_trace_attr_getlogsize}
+@findex posix_trace_attr_getlogsize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getlogsize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getmaxdatasize.texi b/gnulib/doc/posix-functions/posix_trace_attr_getmaxdatasize.texi
new file mode 100644
index 00000000..eaa69f4e
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getmaxdatasize.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getmaxdatasize
+@section @code{posix_trace_attr_getmaxdatasize}
+@findex posix_trace_attr_getmaxdatasize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getmaxdatasize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getmaxsystemeventsize.texi b/gnulib/doc/posix-functions/posix_trace_attr_getmaxsystemeventsize.texi
new file mode 100644
index 00000000..456d9084
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getmaxsystemeventsize.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getmaxsystemeventsize
+@section @code{posix_trace_attr_getmaxsystemeventsize}
+@findex posix_trace_attr_getmaxsystemeventsize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getmaxsystemeventsize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getmaxusereventsize.texi b/gnulib/doc/posix-functions/posix_trace_attr_getmaxusereventsize.texi
new file mode 100644
index 00000000..f7ca19f3
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getmaxusereventsize.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getmaxusereventsize
+@section @code{posix_trace_attr_getmaxusereventsize}
+@findex posix_trace_attr_getmaxusereventsize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getmaxusereventsize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getname.texi b/gnulib/doc/posix-functions/posix_trace_attr_getname.texi
new file mode 100644
index 00000000..b147f769
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getname.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getname
+@section @code{posix_trace_attr_getname}
+@findex posix_trace_attr_getname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getstreamfullpolicy.texi b/gnulib/doc/posix-functions/posix_trace_attr_getstreamfullpolicy.texi
new file mode 100644
index 00000000..8bf55451
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getstreamfullpolicy.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getstreamfullpolicy
+@section @code{posix_trace_attr_getstreamfullpolicy}
+@findex posix_trace_attr_getstreamfullpolicy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getstreamfullpolicy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_getstreamsize.texi b/gnulib/doc/posix-functions/posix_trace_attr_getstreamsize.texi
new file mode 100644
index 00000000..d873dc1e
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_getstreamsize.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_getstreamsize
+@section @code{posix_trace_attr_getstreamsize}
+@findex posix_trace_attr_getstreamsize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getstreamsize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_init.texi b/gnulib/doc/posix-functions/posix_trace_attr_init.texi
new file mode 100644
index 00000000..3a42419a
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_init.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_init
+@section @code{posix_trace_attr_init}
+@findex posix_trace_attr_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_setinherited.texi b/gnulib/doc/posix-functions/posix_trace_attr_setinherited.texi
new file mode 100644
index 00000000..0db431c9
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_setinherited.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_setinherited
+@section @code{posix_trace_attr_setinherited}
+@findex posix_trace_attr_setinherited
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setinherited.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_setlogfullpolicy.texi b/gnulib/doc/posix-functions/posix_trace_attr_setlogfullpolicy.texi
new file mode 100644
index 00000000..376ea547
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_setlogfullpolicy.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_setlogfullpolicy
+@section @code{posix_trace_attr_setlogfullpolicy}
+@findex posix_trace_attr_setlogfullpolicy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setlogfullpolicy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_setlogsize.texi b/gnulib/doc/posix-functions/posix_trace_attr_setlogsize.texi
new file mode 100644
index 00000000..ed08b4ed
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_setlogsize.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_setlogsize
+@section @code{posix_trace_attr_setlogsize}
+@findex posix_trace_attr_setlogsize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setlogsize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_setmaxdatasize.texi b/gnulib/doc/posix-functions/posix_trace_attr_setmaxdatasize.texi
new file mode 100644
index 00000000..5e1fc7b1
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_setmaxdatasize.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_setmaxdatasize
+@section @code{posix_trace_attr_setmaxdatasize}
+@findex posix_trace_attr_setmaxdatasize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setmaxdatasize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_setname.texi b/gnulib/doc/posix-functions/posix_trace_attr_setname.texi
new file mode 100644
index 00000000..b95026ea
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_setname.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_setname
+@section @code{posix_trace_attr_setname}
+@findex posix_trace_attr_setname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_setstreamfullpolicy.texi b/gnulib/doc/posix-functions/posix_trace_attr_setstreamfullpolicy.texi
new file mode 100644
index 00000000..830b1681
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_setstreamfullpolicy.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_setstreamfullpolicy
+@section @code{posix_trace_attr_setstreamfullpolicy}
+@findex posix_trace_attr_setstreamfullpolicy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setstreamfullpolicy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_attr_setstreamsize.texi b/gnulib/doc/posix-functions/posix_trace_attr_setstreamsize.texi
new file mode 100644
index 00000000..9900268e
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_attr_setstreamsize.texi
@@ -0,0 +1,18 @@
+@node posix_trace_attr_setstreamsize
+@section @code{posix_trace_attr_setstreamsize}
+@findex posix_trace_attr_setstreamsize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setstreamsize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_clear.texi b/gnulib/doc/posix-functions/posix_trace_clear.texi
new file mode 100644
index 00000000..1e4d97aa
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_clear.texi
@@ -0,0 +1,18 @@
+@node posix_trace_clear
+@section @code{posix_trace_clear}
+@findex posix_trace_clear
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_clear.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_close.texi b/gnulib/doc/posix-functions/posix_trace_close.texi
new file mode 100644
index 00000000..62424900
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_close.texi
@@ -0,0 +1,18 @@
+@node posix_trace_close
+@section @code{posix_trace_close}
+@findex posix_trace_close
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_close.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_create.texi b/gnulib/doc/posix-functions/posix_trace_create.texi
new file mode 100644
index 00000000..7e09737e
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_create.texi
@@ -0,0 +1,18 @@
+@node posix_trace_create
+@section @code{posix_trace_create}
+@findex posix_trace_create
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_create.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_create_withlog.texi b/gnulib/doc/posix-functions/posix_trace_create_withlog.texi
new file mode 100644
index 00000000..47694dc5
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_create_withlog.texi
@@ -0,0 +1,18 @@
+@node posix_trace_create_withlog
+@section @code{posix_trace_create_withlog}
+@findex posix_trace_create_withlog
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_create_withlog.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_event.texi b/gnulib/doc/posix-functions/posix_trace_event.texi
new file mode 100644
index 00000000..1f5fa1ce
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_event.texi
@@ -0,0 +1,18 @@
+@node posix_trace_event
+@section @code{posix_trace_event}
+@findex posix_trace_event
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_event.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventid_equal.texi b/gnulib/doc/posix-functions/posix_trace_eventid_equal.texi
new file mode 100644
index 00000000..80355613
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventid_equal.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventid_equal
+@section @code{posix_trace_eventid_equal}
+@findex posix_trace_eventid_equal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventid_equal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventid_get_name.texi b/gnulib/doc/posix-functions/posix_trace_eventid_get_name.texi
new file mode 100644
index 00000000..125cb641
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventid_get_name.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventid_get_name
+@section @code{posix_trace_eventid_get_name}
+@findex posix_trace_eventid_get_name
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventid_get_name.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventid_open.texi b/gnulib/doc/posix-functions/posix_trace_eventid_open.texi
new file mode 100644
index 00000000..67da0196
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventid_open.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventid_open
+@section @code{posix_trace_eventid_open}
+@findex posix_trace_eventid_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventid_open.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventset_add.texi b/gnulib/doc/posix-functions/posix_trace_eventset_add.texi
new file mode 100644
index 00000000..8810f06f
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventset_add.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventset_add
+@section @code{posix_trace_eventset_add}
+@findex posix_trace_eventset_add
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_add.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventset_del.texi b/gnulib/doc/posix-functions/posix_trace_eventset_del.texi
new file mode 100644
index 00000000..77456f41
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventset_del.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventset_del
+@section @code{posix_trace_eventset_del}
+@findex posix_trace_eventset_del
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_del.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventset_empty.texi b/gnulib/doc/posix-functions/posix_trace_eventset_empty.texi
new file mode 100644
index 00000000..315301e8
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventset_empty.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventset_empty
+@section @code{posix_trace_eventset_empty}
+@findex posix_trace_eventset_empty
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_empty.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventset_fill.texi b/gnulib/doc/posix-functions/posix_trace_eventset_fill.texi
new file mode 100644
index 00000000..524968f7
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventset_fill.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventset_fill
+@section @code{posix_trace_eventset_fill}
+@findex posix_trace_eventset_fill
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_fill.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventset_ismember.texi b/gnulib/doc/posix-functions/posix_trace_eventset_ismember.texi
new file mode 100644
index 00000000..eebaf527
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventset_ismember.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventset_ismember
+@section @code{posix_trace_eventset_ismember}
+@findex posix_trace_eventset_ismember
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_ismember.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventtypelist_getnext_id.texi b/gnulib/doc/posix-functions/posix_trace_eventtypelist_getnext_id.texi
new file mode 100644
index 00000000..b72e76d4
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventtypelist_getnext_id.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventtypelist_getnext_id
+@section @code{posix_trace_eventtypelist_getnext_id}
+@findex posix_trace_eventtypelist_getnext_id
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventtypelist_getnext_id.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_eventtypelist_rewind.texi b/gnulib/doc/posix-functions/posix_trace_eventtypelist_rewind.texi
new file mode 100644
index 00000000..5869e070
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_eventtypelist_rewind.texi
@@ -0,0 +1,18 @@
+@node posix_trace_eventtypelist_rewind
+@section @code{posix_trace_eventtypelist_rewind}
+@findex posix_trace_eventtypelist_rewind
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventtypelist_rewind.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_flush.texi b/gnulib/doc/posix-functions/posix_trace_flush.texi
new file mode 100644
index 00000000..353a9ba6
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_flush.texi
@@ -0,0 +1,18 @@
+@node posix_trace_flush
+@section @code{posix_trace_flush}
+@findex posix_trace_flush
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_flush.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_get_attr.texi b/gnulib/doc/posix-functions/posix_trace_get_attr.texi
new file mode 100644
index 00000000..2b7648ac
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_get_attr.texi
@@ -0,0 +1,18 @@
+@node posix_trace_get_attr
+@section @code{posix_trace_get_attr}
+@findex posix_trace_get_attr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_get_attr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_get_filter.texi b/gnulib/doc/posix-functions/posix_trace_get_filter.texi
new file mode 100644
index 00000000..ca294a7d
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_get_filter.texi
@@ -0,0 +1,18 @@
+@node posix_trace_get_filter
+@section @code{posix_trace_get_filter}
+@findex posix_trace_get_filter
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_get_filter.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_get_status.texi b/gnulib/doc/posix-functions/posix_trace_get_status.texi
new file mode 100644
index 00000000..8bbb5fd7
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_get_status.texi
@@ -0,0 +1,18 @@
+@node posix_trace_get_status
+@section @code{posix_trace_get_status}
+@findex posix_trace_get_status
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_get_status.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_getnext_event.texi b/gnulib/doc/posix-functions/posix_trace_getnext_event.texi
new file mode 100644
index 00000000..45071bbb
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_getnext_event.texi
@@ -0,0 +1,18 @@
+@node posix_trace_getnext_event
+@section @code{posix_trace_getnext_event}
+@findex posix_trace_getnext_event
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_getnext_event.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_open.texi b/gnulib/doc/posix-functions/posix_trace_open.texi
new file mode 100644
index 00000000..0a11af46
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_open.texi
@@ -0,0 +1,18 @@
+@node posix_trace_open
+@section @code{posix_trace_open}
+@findex posix_trace_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_open.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_rewind.texi b/gnulib/doc/posix-functions/posix_trace_rewind.texi
new file mode 100644
index 00000000..aef67460
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_rewind.texi
@@ -0,0 +1,18 @@
+@node posix_trace_rewind
+@section @code{posix_trace_rewind}
+@findex posix_trace_rewind
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_rewind.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_set_filter.texi b/gnulib/doc/posix-functions/posix_trace_set_filter.texi
new file mode 100644
index 00000000..33b4ffe6
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_set_filter.texi
@@ -0,0 +1,18 @@
+@node posix_trace_set_filter
+@section @code{posix_trace_set_filter}
+@findex posix_trace_set_filter
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_set_filter.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_shutdown.texi b/gnulib/doc/posix-functions/posix_trace_shutdown.texi
new file mode 100644
index 00000000..dd3f6748
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_shutdown.texi
@@ -0,0 +1,18 @@
+@node posix_trace_shutdown
+@section @code{posix_trace_shutdown}
+@findex posix_trace_shutdown
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_shutdown.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_start.texi b/gnulib/doc/posix-functions/posix_trace_start.texi
new file mode 100644
index 00000000..0573d71f
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_start.texi
@@ -0,0 +1,18 @@
+@node posix_trace_start
+@section @code{posix_trace_start}
+@findex posix_trace_start
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_start.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_stop.texi b/gnulib/doc/posix-functions/posix_trace_stop.texi
new file mode 100644
index 00000000..5f8fd4c5
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_stop.texi
@@ -0,0 +1,18 @@
+@node posix_trace_stop
+@section @code{posix_trace_stop}
+@findex posix_trace_stop
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_stop.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_timedgetnext_event.texi b/gnulib/doc/posix-functions/posix_trace_timedgetnext_event.texi
new file mode 100644
index 00000000..b099ff80
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_timedgetnext_event.texi
@@ -0,0 +1,18 @@
+@node posix_trace_timedgetnext_event
+@section @code{posix_trace_timedgetnext_event}
+@findex posix_trace_timedgetnext_event
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_timedgetnext_event.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_trid_eventid_open.texi b/gnulib/doc/posix-functions/posix_trace_trid_eventid_open.texi
new file mode 100644
index 00000000..f931a3c2
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_trid_eventid_open.texi
@@ -0,0 +1,18 @@
+@node posix_trace_trid_eventid_open
+@section @code{posix_trace_trid_eventid_open}
+@findex posix_trace_trid_eventid_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_trid_eventid_open.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_trace_trygetnext_event.texi b/gnulib/doc/posix-functions/posix_trace_trygetnext_event.texi
new file mode 100644
index 00000000..ca253d65
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_trace_trygetnext_event.texi
@@ -0,0 +1,18 @@
+@node posix_trace_trygetnext_event
+@section @code{posix_trace_trygetnext_event}
+@findex posix_trace_trygetnext_event
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_trace_trygetnext_event.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_typed_mem_get_info.texi b/gnulib/doc/posix-functions/posix_typed_mem_get_info.texi
new file mode 100644
index 00000000..ed358b5e
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_typed_mem_get_info.texi
@@ -0,0 +1,18 @@
+@node posix_typed_mem_get_info
+@section @code{posix_typed_mem_get_info}
+@findex posix_typed_mem_get_info
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_typed_mem_get_info.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/posix_typed_mem_open.texi b/gnulib/doc/posix-functions/posix_typed_mem_open.texi
new file mode 100644
index 00000000..21db6b88
--- /dev/null
+++ b/gnulib/doc/posix-functions/posix_typed_mem_open.texi
@@ -0,0 +1,18 @@
+@node posix_typed_mem_open
+@section @code{posix_typed_mem_open}
+@findex posix_typed_mem_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/posix_typed_mem_open.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pow.texi b/gnulib/doc/posix-functions/pow.texi
new file mode 100644
index 00000000..1fd5184b
--- /dev/null
+++ b/gnulib/doc/posix-functions/pow.texi
@@ -0,0 +1,15 @@
+@node pow
+@section @code{pow}
+@findex pow
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pow.html}
+
+Gnulib module: pow
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/powf.texi b/gnulib/doc/posix-functions/powf.texi
new file mode 100644
index 00000000..7db9c103
--- /dev/null
+++ b/gnulib/doc/posix-functions/powf.texi
@@ -0,0 +1,18 @@
+@node powf
+@section @code{powf}
+@findex powf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/powf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/powl.texi b/gnulib/doc/posix-functions/powl.texi
new file mode 100644
index 00000000..73e33e8e
--- /dev/null
+++ b/gnulib/doc/posix-functions/powl.texi
@@ -0,0 +1,18 @@
+@node powl
+@section @code{powl}
+@findex powl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/powl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pread.texi b/gnulib/doc/posix-functions/pread.texi
new file mode 100644
index 00000000..a11e36ea
--- /dev/null
+++ b/gnulib/doc/posix-functions/pread.texi
@@ -0,0 +1,18 @@
+@node pread
+@section @code{pread}
+@findex pread
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pread.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/printf.texi b/gnulib/doc/posix-functions/printf.texi
new file mode 100644
index 00000000..1548dd39
--- /dev/null
+++ b/gnulib/doc/posix-functions/printf.texi
@@ -0,0 +1,72 @@
+@node printf
+@section @code{printf}
+@findex printf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/printf.html}
+
+Gnulib module: printf-posix or stdio, sigpipe
+
+Portability problems fixed by Gnulib module @code{printf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{stdio} or @code{printf-posix}, together with module @code{sigpipe}:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/pselect.texi b/gnulib/doc/posix-functions/pselect.texi
new file mode 100644
index 00000000..83ba1e45
--- /dev/null
+++ b/gnulib/doc/posix-functions/pselect.texi
@@ -0,0 +1,18 @@
+@node pselect
+@section @code{pselect}
+@findex pselect
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pselect.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/psiginfo.texi b/gnulib/doc/posix-functions/psiginfo.texi
new file mode 100644
index 00000000..4c4d2d88
--- /dev/null
+++ b/gnulib/doc/posix-functions/psiginfo.texi
@@ -0,0 +1,18 @@
+@node psiginfo
+@section @code{psiginfo}
+@findex psiginfo
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/psiginfo.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/psignal.texi b/gnulib/doc/posix-functions/psignal.texi
new file mode 100644
index 00000000..7bb7ec45
--- /dev/null
+++ b/gnulib/doc/posix-functions/psignal.texi
@@ -0,0 +1,18 @@
+@node psignal
+@section @code{psignal}
+@findex psignal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/psignal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_atfork.texi b/gnulib/doc/posix-functions/pthread_atfork.texi
new file mode 100644
index 00000000..081904b1
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_atfork.texi
@@ -0,0 +1,18 @@
+@node pthread_atfork
+@section @code{pthread_atfork}
+@findex pthread_atfork
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_atfork.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_destroy.texi b/gnulib/doc/posix-functions/pthread_attr_destroy.texi
new file mode 100644
index 00000000..4b84f9c1
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_destroy
+@section @code{pthread_attr_destroy}
+@findex pthread_attr_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_getdetachstate.texi b/gnulib/doc/posix-functions/pthread_attr_getdetachstate.texi
new file mode 100644
index 00000000..52436f37
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_getdetachstate.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getdetachstate
+@section @code{pthread_attr_getdetachstate}
+@findex pthread_attr_getdetachstate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getdetachstate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_getguardsize.texi b/gnulib/doc/posix-functions/pthread_attr_getguardsize.texi
new file mode 100644
index 00000000..14daa436
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_getguardsize.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getguardsize
+@section @code{pthread_attr_getguardsize}
+@findex pthread_attr_getguardsize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getguardsize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, HP-UX 11, OSF/1 4.0, Solaris 2.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_getinheritsched.texi b/gnulib/doc/posix-functions/pthread_attr_getinheritsched.texi
new file mode 100644
index 00000000..64548e7a
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_getinheritsched.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getinheritsched
+@section @code{pthread_attr_getinheritsched}
+@findex pthread_attr_getinheritsched
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getinheritsched.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_getschedparam.texi b/gnulib/doc/posix-functions/pthread_attr_getschedparam.texi
new file mode 100644
index 00000000..a570eb27
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_getschedparam.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getschedparam
+@section @code{pthread_attr_getschedparam}
+@findex pthread_attr_getschedparam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getschedparam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_getschedpolicy.texi b/gnulib/doc/posix-functions/pthread_attr_getschedpolicy.texi
new file mode 100644
index 00000000..098b7bb5
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_getschedpolicy.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getschedpolicy
+@section @code{pthread_attr_getschedpolicy}
+@findex pthread_attr_getschedpolicy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getschedpolicy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_getscope.texi b/gnulib/doc/posix-functions/pthread_attr_getscope.texi
new file mode 100644
index 00000000..d35d9106
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_getscope.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getscope
+@section @code{pthread_attr_getscope}
+@findex pthread_attr_getscope
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getscope.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_getstack.texi b/gnulib/doc/posix-functions/pthread_attr_getstack.texi
new file mode 100644
index 00000000..47e33dc3
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_getstack.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getstack
+@section @code{pthread_attr_getstack}
+@findex pthread_attr_getstack
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getstack.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_getstacksize.texi b/gnulib/doc/posix-functions/pthread_attr_getstacksize.texi
new file mode 100644
index 00000000..b89a8f8f
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_getstacksize.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_getstacksize
+@section @code{pthread_attr_getstacksize}
+@findex pthread_attr_getstacksize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getstacksize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_init.texi b/gnulib/doc/posix-functions/pthread_attr_init.texi
new file mode 100644
index 00000000..ccddbe18
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_init.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_init
+@section @code{pthread_attr_init}
+@findex pthread_attr_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_setdetachstate.texi b/gnulib/doc/posix-functions/pthread_attr_setdetachstate.texi
new file mode 100644
index 00000000..6b8e1044
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_setdetachstate.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setdetachstate
+@section @code{pthread_attr_setdetachstate}
+@findex pthread_attr_setdetachstate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setdetachstate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_setguardsize.texi b/gnulib/doc/posix-functions/pthread_attr_setguardsize.texi
new file mode 100644
index 00000000..813f56fb
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_setguardsize.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setguardsize
+@section @code{pthread_attr_setguardsize}
+@findex pthread_attr_setguardsize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setguardsize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, HP-UX 11, OSF/1 4.0, Solaris 2.6, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_setinheritsched.texi b/gnulib/doc/posix-functions/pthread_attr_setinheritsched.texi
new file mode 100644
index 00000000..11080623
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_setinheritsched.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setinheritsched
+@section @code{pthread_attr_setinheritsched}
+@findex pthread_attr_setinheritsched
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setinheritsched.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_setschedparam.texi b/gnulib/doc/posix-functions/pthread_attr_setschedparam.texi
new file mode 100644
index 00000000..3d354d92
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_setschedparam.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setschedparam
+@section @code{pthread_attr_setschedparam}
+@findex pthread_attr_setschedparam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setschedparam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_setschedpolicy.texi b/gnulib/doc/posix-functions/pthread_attr_setschedpolicy.texi
new file mode 100644
index 00000000..2b45eb94
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_setschedpolicy.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setschedpolicy
+@section @code{pthread_attr_setschedpolicy}
+@findex pthread_attr_setschedpolicy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setschedpolicy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_setscope.texi b/gnulib/doc/posix-functions/pthread_attr_setscope.texi
new file mode 100644
index 00000000..59d95c3e
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_setscope.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setscope
+@section @code{pthread_attr_setscope}
+@findex pthread_attr_setscope
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setscope.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_setstack.texi b/gnulib/doc/posix-functions/pthread_attr_setstack.texi
new file mode 100644
index 00000000..9dbce70e
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_setstack.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setstack
+@section @code{pthread_attr_setstack}
+@findex pthread_attr_setstack
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setstack.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_attr_setstacksize.texi b/gnulib/doc/posix-functions/pthread_attr_setstacksize.texi
new file mode 100644
index 00000000..9cd3c395
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_attr_setstacksize.texi
@@ -0,0 +1,18 @@
+@node pthread_attr_setstacksize
+@section @code{pthread_attr_setstacksize}
+@findex pthread_attr_setstacksize
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setstacksize.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_barrier_destroy.texi b/gnulib/doc/posix-functions/pthread_barrier_destroy.texi
new file mode 100644
index 00000000..5788a4f6
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_barrier_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_barrier_destroy
+@section @code{pthread_barrier_destroy}
+@findex pthread_barrier_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_barrier_init.texi b/gnulib/doc/posix-functions/pthread_barrier_init.texi
new file mode 100644
index 00000000..dfd28e47
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_barrier_init.texi
@@ -0,0 +1,18 @@
+@node pthread_barrier_init
+@section @code{pthread_barrier_init}
+@findex pthread_barrier_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_barrier_wait.texi b/gnulib/doc/posix-functions/pthread_barrier_wait.texi
new file mode 100644
index 00000000..77195a04
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_barrier_wait.texi
@@ -0,0 +1,18 @@
+@node pthread_barrier_wait
+@section @code{pthread_barrier_wait}
+@findex pthread_barrier_wait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_wait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_barrierattr_destroy.texi b/gnulib/doc/posix-functions/pthread_barrierattr_destroy.texi
new file mode 100644
index 00000000..9c5b5976
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_barrierattr_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_barrierattr_destroy
+@section @code{pthread_barrierattr_destroy}
+@findex pthread_barrierattr_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_barrierattr_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_barrierattr_getpshared.texi b/gnulib/doc/posix-functions/pthread_barrierattr_getpshared.texi
new file mode 100644
index 00000000..95694a61
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_barrierattr_getpshared.texi
@@ -0,0 +1,18 @@
+@node pthread_barrierattr_getpshared
+@section @code{pthread_barrierattr_getpshared}
+@findex pthread_barrierattr_getpshared
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_barrierattr_getpshared.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_barrierattr_init.texi b/gnulib/doc/posix-functions/pthread_barrierattr_init.texi
new file mode 100644
index 00000000..3667ca04
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_barrierattr_init.texi
@@ -0,0 +1,18 @@
+@node pthread_barrierattr_init
+@section @code{pthread_barrierattr_init}
+@findex pthread_barrierattr_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_barrierattr_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_barrierattr_setpshared.texi b/gnulib/doc/posix-functions/pthread_barrierattr_setpshared.texi
new file mode 100644
index 00000000..daf02c5a
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_barrierattr_setpshared.texi
@@ -0,0 +1,18 @@
+@node pthread_barrierattr_setpshared
+@section @code{pthread_barrierattr_setpshared}
+@findex pthread_barrierattr_setpshared
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_barrierattr_setpshared.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cancel.texi b/gnulib/doc/posix-functions/pthread_cancel.texi
new file mode 100644
index 00000000..8958640a
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cancel.texi
@@ -0,0 +1,18 @@
+@node pthread_cancel
+@section @code{pthread_cancel}
+@findex pthread_cancel
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cancel.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cleanup_pop.texi b/gnulib/doc/posix-functions/pthread_cleanup_pop.texi
new file mode 100644
index 00000000..0df717d1
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cleanup_pop.texi
@@ -0,0 +1,18 @@
+@node pthread_cleanup_pop
+@section @code{pthread_cleanup_pop}
+@findex pthread_cleanup_pop
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cleanup_pop.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, NetBSD 3.0, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cleanup_push.texi b/gnulib/doc/posix-functions/pthread_cleanup_push.texi
new file mode 100644
index 00000000..c58aa371
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cleanup_push.texi
@@ -0,0 +1,18 @@
+@node pthread_cleanup_push
+@section @code{pthread_cleanup_push}
+@findex pthread_cleanup_push
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cleanup_push.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, NetBSD 3.0, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cond_broadcast.texi b/gnulib/doc/posix-functions/pthread_cond_broadcast.texi
new file mode 100644
index 00000000..af07edc9
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cond_broadcast.texi
@@ -0,0 +1,18 @@
+@node pthread_cond_broadcast
+@section @code{pthread_cond_broadcast}
+@findex pthread_cond_broadcast
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_broadcast.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cond_destroy.texi b/gnulib/doc/posix-functions/pthread_cond_destroy.texi
new file mode 100644
index 00000000..87a9c8df
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cond_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_cond_destroy
+@section @code{pthread_cond_destroy}
+@findex pthread_cond_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cond_init.texi b/gnulib/doc/posix-functions/pthread_cond_init.texi
new file mode 100644
index 00000000..4c4a496a
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cond_init.texi
@@ -0,0 +1,18 @@
+@node pthread_cond_init
+@section @code{pthread_cond_init}
+@findex pthread_cond_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cond_signal.texi b/gnulib/doc/posix-functions/pthread_cond_signal.texi
new file mode 100644
index 00000000..5d2252db
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cond_signal.texi
@@ -0,0 +1,18 @@
+@node pthread_cond_signal
+@section @code{pthread_cond_signal}
+@findex pthread_cond_signal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_signal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cond_timedwait.texi b/gnulib/doc/posix-functions/pthread_cond_timedwait.texi
new file mode 100644
index 00000000..a6584e5b
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cond_timedwait.texi
@@ -0,0 +1,18 @@
+@node pthread_cond_timedwait
+@section @code{pthread_cond_timedwait}
+@findex pthread_cond_timedwait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_timedwait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_cond_wait.texi b/gnulib/doc/posix-functions/pthread_cond_wait.texi
new file mode 100644
index 00000000..5c391c77
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_cond_wait.texi
@@ -0,0 +1,18 @@
+@node pthread_cond_wait
+@section @code{pthread_cond_wait}
+@findex pthread_cond_wait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_wait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_condattr_destroy.texi b/gnulib/doc/posix-functions/pthread_condattr_destroy.texi
new file mode 100644
index 00000000..3ad68922
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_condattr_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_condattr_destroy
+@section @code{pthread_condattr_destroy}
+@findex pthread_condattr_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_condattr_getclock.texi b/gnulib/doc/posix-functions/pthread_condattr_getclock.texi
new file mode 100644
index 00000000..bb1205c9
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_condattr_getclock.texi
@@ -0,0 +1,18 @@
+@node pthread_condattr_getclock
+@section @code{pthread_condattr_getclock}
+@findex pthread_condattr_getclock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_getclock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_condattr_getpshared.texi b/gnulib/doc/posix-functions/pthread_condattr_getpshared.texi
new file mode 100644
index 00000000..d4721fa1
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_condattr_getpshared.texi
@@ -0,0 +1,18 @@
+@node pthread_condattr_getpshared
+@section @code{pthread_condattr_getpshared}
+@findex pthread_condattr_getpshared
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_getpshared.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_condattr_init.texi b/gnulib/doc/posix-functions/pthread_condattr_init.texi
new file mode 100644
index 00000000..efdcea95
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_condattr_init.texi
@@ -0,0 +1,18 @@
+@node pthread_condattr_init
+@section @code{pthread_condattr_init}
+@findex pthread_condattr_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_condattr_setclock.texi b/gnulib/doc/posix-functions/pthread_condattr_setclock.texi
new file mode 100644
index 00000000..0e5244c6
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_condattr_setclock.texi
@@ -0,0 +1,18 @@
+@node pthread_condattr_setclock
+@section @code{pthread_condattr_setclock}
+@findex pthread_condattr_setclock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_setclock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_condattr_setpshared.texi b/gnulib/doc/posix-functions/pthread_condattr_setpshared.texi
new file mode 100644
index 00000000..c25fdb58
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_condattr_setpshared.texi
@@ -0,0 +1,18 @@
+@node pthread_condattr_setpshared
+@section @code{pthread_condattr_setpshared}
+@findex pthread_condattr_setpshared
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_setpshared.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_create.texi b/gnulib/doc/posix-functions/pthread_create.texi
new file mode 100644
index 00000000..3e37cae4
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_create.texi
@@ -0,0 +1,23 @@
+@node pthread_create
+@section @code{pthread_create}
+@findex pthread_create
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_create.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@item
+On Linux/glibc platforms before the advent of NPTL, signals could only be
+sent to one particular thread. In POSIX, signals are sent to the entire
+process and executed by any thread of the process that happens to have the
+particular signal currently unblocked.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_detach.texi b/gnulib/doc/posix-functions/pthread_detach.texi
new file mode 100644
index 00000000..2ec8ffb8
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_detach.texi
@@ -0,0 +1,18 @@
+@node pthread_detach
+@section @code{pthread_detach}
+@findex pthread_detach
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_detach.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_equal.texi b/gnulib/doc/posix-functions/pthread_equal.texi
new file mode 100644
index 00000000..16f600ad
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_equal.texi
@@ -0,0 +1,18 @@
+@node pthread_equal
+@section @code{pthread_equal}
+@findex pthread_equal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_equal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_exit.texi b/gnulib/doc/posix-functions/pthread_exit.texi
new file mode 100644
index 00000000..e63c264d
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_exit.texi
@@ -0,0 +1,18 @@
+@node pthread_exit
+@section @code{pthread_exit}
+@findex pthread_exit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_exit.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_getconcurrency.texi b/gnulib/doc/posix-functions/pthread_getconcurrency.texi
new file mode 100644
index 00000000..e5a0cda9
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_getconcurrency.texi
@@ -0,0 +1,18 @@
+@node pthread_getconcurrency
+@section @code{pthread_getconcurrency}
+@findex pthread_getconcurrency
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_getconcurrency.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, HP-UX 11, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_getcpuclockid.texi b/gnulib/doc/posix-functions/pthread_getcpuclockid.texi
new file mode 100644
index 00000000..04745d78
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_getcpuclockid.texi
@@ -0,0 +1,18 @@
+@node pthread_getcpuclockid
+@section @code{pthread_getcpuclockid}
+@findex pthread_getcpuclockid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_getcpuclockid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_getschedparam.texi b/gnulib/doc/posix-functions/pthread_getschedparam.texi
new file mode 100644
index 00000000..aeab8383
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_getschedparam.texi
@@ -0,0 +1,18 @@
+@node pthread_getschedparam
+@section @code{pthread_getschedparam}
+@findex pthread_getschedparam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_getschedparam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_getspecific.texi b/gnulib/doc/posix-functions/pthread_getspecific.texi
new file mode 100644
index 00000000..dc3ca4df
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_getspecific.texi
@@ -0,0 +1,18 @@
+@node pthread_getspecific
+@section @code{pthread_getspecific}
+@findex pthread_getspecific
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_getspecific.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_join.texi b/gnulib/doc/posix-functions/pthread_join.texi
new file mode 100644
index 00000000..99258a2a
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_join.texi
@@ -0,0 +1,18 @@
+@node pthread_join
+@section @code{pthread_join}
+@findex pthread_join
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_key_create.texi b/gnulib/doc/posix-functions/pthread_key_create.texi
new file mode 100644
index 00000000..1559640e
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_key_create.texi
@@ -0,0 +1,18 @@
+@node pthread_key_create
+@section @code{pthread_key_create}
+@findex pthread_key_create
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_key_create.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_key_delete.texi b/gnulib/doc/posix-functions/pthread_key_delete.texi
new file mode 100644
index 00000000..0e43b3cf
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_key_delete.texi
@@ -0,0 +1,18 @@
+@node pthread_key_delete
+@section @code{pthread_key_delete}
+@findex pthread_key_delete
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_key_delete.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_kill.texi b/gnulib/doc/posix-functions/pthread_kill.texi
new file mode 100644
index 00000000..e5f15c4f
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_kill.texi
@@ -0,0 +1,18 @@
+@node pthread_kill
+@section @code{pthread_kill}
+@findex pthread_kill
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_kill.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_consistent.texi b/gnulib/doc/posix-functions/pthread_mutex_consistent.texi
new file mode 100644
index 00000000..95068bac
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_consistent.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_consistent
+@section @code{pthread_mutex_consistent}
+@findex pthread_mutex_consistent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_consistent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_destroy.texi b/gnulib/doc/posix-functions/pthread_mutex_destroy.texi
new file mode 100644
index 00000000..486652fc
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_destroy
+@section @code{pthread_mutex_destroy}
+@findex pthread_mutex_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_getprioceiling.texi b/gnulib/doc/posix-functions/pthread_mutex_getprioceiling.texi
new file mode 100644
index 00000000..41de49a1
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_getprioceiling.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_getprioceiling
+@section @code{pthread_mutex_getprioceiling}
+@findex pthread_mutex_getprioceiling
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_getprioceiling.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, NetBSD 3.0, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_init.texi b/gnulib/doc/posix-functions/pthread_mutex_init.texi
new file mode 100644
index 00000000..736126be
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_init.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_init
+@section @code{pthread_mutex_init}
+@findex pthread_mutex_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_lock.texi b/gnulib/doc/posix-functions/pthread_mutex_lock.texi
new file mode 100644
index 00000000..a28cdabe
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_lock.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_lock
+@section @code{pthread_mutex_lock}
+@findex pthread_mutex_lock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_setprioceiling.texi b/gnulib/doc/posix-functions/pthread_mutex_setprioceiling.texi
new file mode 100644
index 00000000..f89af39c
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_setprioceiling.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_setprioceiling
+@section @code{pthread_mutex_setprioceiling}
+@findex pthread_mutex_setprioceiling
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_setprioceiling.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, NetBSD 3.0, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_timedlock.texi b/gnulib/doc/posix-functions/pthread_mutex_timedlock.texi
new file mode 100644
index 00000000..d18190ed
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_timedlock.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_timedlock
+@section @code{pthread_mutex_timedlock}
+@findex pthread_mutex_timedlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_timedlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_trylock.texi b/gnulib/doc/posix-functions/pthread_mutex_trylock.texi
new file mode 100644
index 00000000..2bb34400
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_trylock.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_trylock
+@section @code{pthread_mutex_trylock}
+@findex pthread_mutex_trylock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_trylock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutex_unlock.texi b/gnulib/doc/posix-functions/pthread_mutex_unlock.texi
new file mode 100644
index 00000000..49311f57
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutex_unlock.texi
@@ -0,0 +1,18 @@
+@node pthread_mutex_unlock
+@section @code{pthread_mutex_unlock}
+@findex pthread_mutex_unlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_unlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_destroy.texi b/gnulib/doc/posix-functions/pthread_mutexattr_destroy.texi
new file mode 100644
index 00000000..17571f43
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_destroy
+@section @code{pthread_mutexattr_destroy}
+@findex pthread_mutexattr_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_getprioceiling.texi b/gnulib/doc/posix-functions/pthread_mutexattr_getprioceiling.texi
new file mode 100644
index 00000000..9b46a3b8
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_getprioceiling.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_getprioceiling
+@section @code{pthread_mutexattr_getprioceiling}
+@findex pthread_mutexattr_getprioceiling
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprioceiling.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, NetBSD 3.0, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_getprotocol.texi b/gnulib/doc/posix-functions/pthread_mutexattr_getprotocol.texi
new file mode 100644
index 00000000..9a58329e
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_getprotocol.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_getprotocol
+@section @code{pthread_mutexattr_getprotocol}
+@findex pthread_mutexattr_getprotocol
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, NetBSD 3.0, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_getpshared.texi b/gnulib/doc/posix-functions/pthread_mutexattr_getpshared.texi
new file mode 100644
index 00000000..82aa0c1f
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_getpshared.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_getpshared
+@section @code{pthread_mutexattr_getpshared}
+@findex pthread_mutexattr_getpshared
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getpshared.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_getrobust.texi b/gnulib/doc/posix-functions/pthread_mutexattr_getrobust.texi
new file mode 100644
index 00000000..ea37eb78
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_getrobust.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_getrobust
+@section @code{pthread_mutexattr_getrobust}
+@findex pthread_mutexattr_getrobust
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getrobust.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_gettype.texi b/gnulib/doc/posix-functions/pthread_mutexattr_gettype.texi
new file mode 100644
index 00000000..2d4c4f5c
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_gettype.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_gettype
+@section @code{pthread_mutexattr_gettype}
+@findex pthread_mutexattr_gettype
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_gettype.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_init.texi b/gnulib/doc/posix-functions/pthread_mutexattr_init.texi
new file mode 100644
index 00000000..c6851e01
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_init.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_init
+@section @code{pthread_mutexattr_init}
+@findex pthread_mutexattr_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_setprioceiling.texi b/gnulib/doc/posix-functions/pthread_mutexattr_setprioceiling.texi
new file mode 100644
index 00000000..9c7389db
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_setprioceiling.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_setprioceiling
+@section @code{pthread_mutexattr_setprioceiling}
+@findex pthread_mutexattr_setprioceiling
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setprioceiling.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, NetBSD 3.0, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_setprotocol.texi b/gnulib/doc/posix-functions/pthread_mutexattr_setprotocol.texi
new file mode 100644
index 00000000..02771974
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_setprotocol.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_setprotocol
+@section @code{pthread_mutexattr_setprotocol}
+@findex pthread_mutexattr_setprotocol
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setprotocol.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, NetBSD 3.0, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_setpshared.texi b/gnulib/doc/posix-functions/pthread_mutexattr_setpshared.texi
new file mode 100644
index 00000000..3d9af343
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_setpshared.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_setpshared
+@section @code{pthread_mutexattr_setpshared}
+@findex pthread_mutexattr_setpshared
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, OSF/1 4.0, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_setrobust.texi b/gnulib/doc/posix-functions/pthread_mutexattr_setrobust.texi
new file mode 100644
index 00000000..a40c37e4
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_setrobust.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_setrobust
+@section @code{pthread_mutexattr_setrobust}
+@findex pthread_mutexattr_setrobust
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setrobust.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_mutexattr_settype.texi b/gnulib/doc/posix-functions/pthread_mutexattr_settype.texi
new file mode 100644
index 00000000..4783220a
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_mutexattr_settype.texi
@@ -0,0 +1,18 @@
+@node pthread_mutexattr_settype
+@section @code{pthread_mutexattr_settype}
+@findex pthread_mutexattr_settype
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_settype.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_once.texi b/gnulib/doc/posix-functions/pthread_once.texi
new file mode 100644
index 00000000..3c10c7b0
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_once.texi
@@ -0,0 +1,18 @@
+@node pthread_once
+@section @code{pthread_once}
+@findex pthread_once
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_once.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_destroy.texi b/gnulib/doc/posix-functions/pthread_rwlock_destroy.texi
new file mode 100644
index 00000000..94f7431f
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_destroy
+@section @code{pthread_rwlock_destroy}
+@findex pthread_rwlock_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_init.texi b/gnulib/doc/posix-functions/pthread_rwlock_init.texi
new file mode 100644
index 00000000..3dde175a
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_init.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_init
+@section @code{pthread_rwlock_init}
+@findex pthread_rwlock_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_rdlock.texi b/gnulib/doc/posix-functions/pthread_rwlock_rdlock.texi
new file mode 100644
index 00000000..e9bd85fe
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_rdlock.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_rdlock
+@section @code{pthread_rwlock_rdlock}
+@findex pthread_rwlock_rdlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_rdlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_timedrdlock.texi b/gnulib/doc/posix-functions/pthread_rwlock_timedrdlock.texi
new file mode 100644
index 00000000..287e2e44
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_timedrdlock.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_timedrdlock
+@section @code{pthread_rwlock_timedrdlock}
+@findex pthread_rwlock_timedrdlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_timedrdlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_timedwrlock.texi b/gnulib/doc/posix-functions/pthread_rwlock_timedwrlock.texi
new file mode 100644
index 00000000..7c71ad19
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_timedwrlock.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_timedwrlock
+@section @code{pthread_rwlock_timedwrlock}
+@findex pthread_rwlock_timedwrlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_timedwrlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_tryrdlock.texi b/gnulib/doc/posix-functions/pthread_rwlock_tryrdlock.texi
new file mode 100644
index 00000000..fdf6f6b1
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_tryrdlock.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_tryrdlock
+@section @code{pthread_rwlock_tryrdlock}
+@findex pthread_rwlock_tryrdlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_tryrdlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_trywrlock.texi b/gnulib/doc/posix-functions/pthread_rwlock_trywrlock.texi
new file mode 100644
index 00000000..fc4f882c
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_trywrlock.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_trywrlock
+@section @code{pthread_rwlock_trywrlock}
+@findex pthread_rwlock_trywrlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_trywrlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_unlock.texi b/gnulib/doc/posix-functions/pthread_rwlock_unlock.texi
new file mode 100644
index 00000000..512939a1
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_unlock.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_unlock
+@section @code{pthread_rwlock_unlock}
+@findex pthread_rwlock_unlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_unlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlock_wrlock.texi b/gnulib/doc/posix-functions/pthread_rwlock_wrlock.texi
new file mode 100644
index 00000000..7257ddc3
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlock_wrlock.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlock_wrlock
+@section @code{pthread_rwlock_wrlock}
+@findex pthread_rwlock_wrlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_wrlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlockattr_destroy.texi b/gnulib/doc/posix-functions/pthread_rwlockattr_destroy.texi
new file mode 100644
index 00000000..48570387
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlockattr_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlockattr_destroy
+@section @code{pthread_rwlockattr_destroy}
+@findex pthread_rwlockattr_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlockattr_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlockattr_getpshared.texi b/gnulib/doc/posix-functions/pthread_rwlockattr_getpshared.texi
new file mode 100644
index 00000000..d523d560
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlockattr_getpshared.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlockattr_getpshared
+@section @code{pthread_rwlockattr_getpshared}
+@findex pthread_rwlockattr_getpshared
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlockattr_getpshared.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlockattr_init.texi b/gnulib/doc/posix-functions/pthread_rwlockattr_init.texi
new file mode 100644
index 00000000..a0033d01
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlockattr_init.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlockattr_init
+@section @code{pthread_rwlockattr_init}
+@findex pthread_rwlockattr_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlockattr_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_rwlockattr_setpshared.texi b/gnulib/doc/posix-functions/pthread_rwlockattr_setpshared.texi
new file mode 100644
index 00000000..991eb9e6
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_rwlockattr_setpshared.texi
@@ -0,0 +1,18 @@
+@node pthread_rwlockattr_setpshared
+@section @code{pthread_rwlockattr_setpshared}
+@findex pthread_rwlockattr_setpshared
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlockattr_setpshared.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, HP-UX 11, OSF/1 4.0, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_self.texi b/gnulib/doc/posix-functions/pthread_self.texi
new file mode 100644
index 00000000..fc390f61
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_self.texi
@@ -0,0 +1,18 @@
+@node pthread_self
+@section @code{pthread_self}
+@findex pthread_self
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_self.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_setcancelstate.texi b/gnulib/doc/posix-functions/pthread_setcancelstate.texi
new file mode 100644
index 00000000..1d92c026
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_setcancelstate.texi
@@ -0,0 +1,18 @@
+@node pthread_setcancelstate
+@section @code{pthread_setcancelstate}
+@findex pthread_setcancelstate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_setcancelstate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_setcanceltype.texi b/gnulib/doc/posix-functions/pthread_setcanceltype.texi
new file mode 100644
index 00000000..0775b658
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_setcanceltype.texi
@@ -0,0 +1,18 @@
+@node pthread_setcanceltype
+@section @code{pthread_setcanceltype}
+@findex pthread_setcanceltype
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_setcanceltype.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_setconcurrency.texi b/gnulib/doc/posix-functions/pthread_setconcurrency.texi
new file mode 100644
index 00000000..57b25821
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_setconcurrency.texi
@@ -0,0 +1,18 @@
+@node pthread_setconcurrency
+@section @code{pthread_setconcurrency}
+@findex pthread_setconcurrency
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_setconcurrency.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, HP-UX 11, Solaris 2.6, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_setschedparam.texi b/gnulib/doc/posix-functions/pthread_setschedparam.texi
new file mode 100644
index 00000000..c4da954b
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_setschedparam.texi
@@ -0,0 +1,18 @@
+@node pthread_setschedparam
+@section @code{pthread_setschedparam}
+@findex pthread_setschedparam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_setschedparam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_setschedprio.texi b/gnulib/doc/posix-functions/pthread_setschedprio.texi
new file mode 100644
index 00000000..370dc708
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_setschedprio.texi
@@ -0,0 +1,18 @@
+@node pthread_setschedprio
+@section @code{pthread_setschedprio}
+@findex pthread_setschedprio
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_setschedprio.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_setspecific.texi b/gnulib/doc/posix-functions/pthread_setspecific.texi
new file mode 100644
index 00000000..fad5e436
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_setspecific.texi
@@ -0,0 +1,18 @@
+@node pthread_setspecific
+@section @code{pthread_setspecific}
+@findex pthread_setspecific
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_setspecific.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_sigmask.texi b/gnulib/doc/posix-functions/pthread_sigmask.texi
new file mode 100644
index 00000000..bf9e5f98
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_sigmask.texi
@@ -0,0 +1,18 @@
+@node pthread_sigmask
+@section @code{pthread_sigmask}
+@findex pthread_sigmask
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_sigmask.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_spin_destroy.texi b/gnulib/doc/posix-functions/pthread_spin_destroy.texi
new file mode 100644
index 00000000..778e436b
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_spin_destroy.texi
@@ -0,0 +1,18 @@
+@node pthread_spin_destroy
+@section @code{pthread_spin_destroy}
+@findex pthread_spin_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_spin_init.texi b/gnulib/doc/posix-functions/pthread_spin_init.texi
new file mode 100644
index 00000000..94bd30c7
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_spin_init.texi
@@ -0,0 +1,18 @@
+@node pthread_spin_init
+@section @code{pthread_spin_init}
+@findex pthread_spin_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_spin_lock.texi b/gnulib/doc/posix-functions/pthread_spin_lock.texi
new file mode 100644
index 00000000..701ce8c5
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_spin_lock.texi
@@ -0,0 +1,18 @@
+@node pthread_spin_lock
+@section @code{pthread_spin_lock}
+@findex pthread_spin_lock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_lock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_spin_trylock.texi b/gnulib/doc/posix-functions/pthread_spin_trylock.texi
new file mode 100644
index 00000000..c2d2911d
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_spin_trylock.texi
@@ -0,0 +1,18 @@
+@node pthread_spin_trylock
+@section @code{pthread_spin_trylock}
+@findex pthread_spin_trylock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_trylock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_spin_unlock.texi b/gnulib/doc/posix-functions/pthread_spin_unlock.texi
new file mode 100644
index 00000000..fadc875c
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_spin_unlock.texi
@@ -0,0 +1,18 @@
+@node pthread_spin_unlock
+@section @code{pthread_spin_unlock}
+@findex pthread_spin_unlock
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_unlock.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pthread_testcancel.texi b/gnulib/doc/posix-functions/pthread_testcancel.texi
new file mode 100644
index 00000000..4d947fe4
--- /dev/null
+++ b/gnulib/doc/posix-functions/pthread_testcancel.texi
@@ -0,0 +1,18 @@
+@node pthread_testcancel
+@section @code{pthread_testcancel}
+@findex pthread_testcancel
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_testcancel.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ptsname.texi b/gnulib/doc/posix-functions/ptsname.texi
new file mode 100644
index 00000000..54f1ec33
--- /dev/null
+++ b/gnulib/doc/posix-functions/ptsname.texi
@@ -0,0 +1,18 @@
+@node ptsname
+@section @code{ptsname}
+@findex ptsname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ptsname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/putc.texi b/gnulib/doc/posix-functions/putc.texi
new file mode 100644
index 00000000..07c9f098
--- /dev/null
+++ b/gnulib/doc/posix-functions/putc.texi
@@ -0,0 +1,22 @@
+@node putc
+@section @code{putc}
+@findex putc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putc.html}
+
+Gnulib module: stdio, sigpipe
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/putc_unlocked.texi b/gnulib/doc/posix-functions/putc_unlocked.texi
new file mode 100644
index 00000000..114f5451
--- /dev/null
+++ b/gnulib/doc/posix-functions/putc_unlocked.texi
@@ -0,0 +1,18 @@
+@node putc_unlocked
+@section @code{putc_unlocked}
+@findex putc_unlocked
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putc_unlocked.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/putchar.texi b/gnulib/doc/posix-functions/putchar.texi
new file mode 100644
index 00000000..e010ae25
--- /dev/null
+++ b/gnulib/doc/posix-functions/putchar.texi
@@ -0,0 +1,22 @@
+@node putchar
+@section @code{putchar}
+@findex putchar
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putchar.html}
+
+Gnulib module: stdio, sigpipe
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/putchar_unlocked.texi b/gnulib/doc/posix-functions/putchar_unlocked.texi
new file mode 100644
index 00000000..82b3d6e6
--- /dev/null
+++ b/gnulib/doc/posix-functions/putchar_unlocked.texi
@@ -0,0 +1,18 @@
+@node putchar_unlocked
+@section @code{putchar_unlocked}
+@findex putchar_unlocked
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putchar_unlocked.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/putenv.texi b/gnulib/doc/posix-functions/putenv.texi
new file mode 100644
index 00000000..20265ddb
--- /dev/null
+++ b/gnulib/doc/posix-functions/putenv.texi
@@ -0,0 +1,19 @@
+@node putenv
+@section @code{putenv}
+@findex putenv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putenv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Extension: Gnulib provides a module @samp{putenv} that substitutes a
+@code{putenv} implementation that can also be used to remove environment
+variables.
diff --git a/gnulib/doc/posix-functions/putmsg.texi b/gnulib/doc/posix-functions/putmsg.texi
new file mode 100644
index 00000000..5498d280
--- /dev/null
+++ b/gnulib/doc/posix-functions/putmsg.texi
@@ -0,0 +1,18 @@
+@node putmsg
+@section @code{putmsg}
+@findex putmsg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putmsg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/putpmsg.texi b/gnulib/doc/posix-functions/putpmsg.texi
new file mode 100644
index 00000000..68ea9e47
--- /dev/null
+++ b/gnulib/doc/posix-functions/putpmsg.texi
@@ -0,0 +1,18 @@
+@node putpmsg
+@section @code{putpmsg}
+@findex putpmsg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putpmsg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/puts.texi b/gnulib/doc/posix-functions/puts.texi
new file mode 100644
index 00000000..60de4f9d
--- /dev/null
+++ b/gnulib/doc/posix-functions/puts.texi
@@ -0,0 +1,22 @@
+@node puts
+@section @code{puts}
+@findex puts
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/puts.html}
+
+Gnulib module: stdio, sigpipe
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pututxline.texi b/gnulib/doc/posix-functions/pututxline.texi
new file mode 100644
index 00000000..edb4c816
--- /dev/null
+++ b/gnulib/doc/posix-functions/pututxline.texi
@@ -0,0 +1,18 @@
+@node pututxline
+@section @code{pututxline}
+@findex pututxline
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pututxline.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/putwc.texi b/gnulib/doc/posix-functions/putwc.texi
new file mode 100644
index 00000000..0277d180
--- /dev/null
+++ b/gnulib/doc/posix-functions/putwc.texi
@@ -0,0 +1,21 @@
+@node putwc
+@section @code{putwc}
+@findex putwc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putwc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/putwchar.texi b/gnulib/doc/posix-functions/putwchar.texi
new file mode 100644
index 00000000..335b5d8e
--- /dev/null
+++ b/gnulib/doc/posix-functions/putwchar.texi
@@ -0,0 +1,21 @@
+@node putwchar
+@section @code{putwchar}
+@findex putwchar
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/putwchar.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/pwrite.texi b/gnulib/doc/posix-functions/pwrite.texi
new file mode 100644
index 00000000..d1645030
--- /dev/null
+++ b/gnulib/doc/posix-functions/pwrite.texi
@@ -0,0 +1,18 @@
+@node pwrite
+@section @code{pwrite}
+@findex pwrite
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/pwrite.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/qsort.texi b/gnulib/doc/posix-functions/qsort.texi
new file mode 100644
index 00000000..0013b8da
--- /dev/null
+++ b/gnulib/doc/posix-functions/qsort.texi
@@ -0,0 +1,15 @@
+@node qsort
+@section @code{qsort}
+@findex qsort
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/qsort.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/raise.texi b/gnulib/doc/posix-functions/raise.texi
new file mode 100644
index 00000000..29fc8c0a
--- /dev/null
+++ b/gnulib/doc/posix-functions/raise.texi
@@ -0,0 +1,17 @@
+@node raise
+@section @code{raise}
+@findex raise
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/raise.html}
+
+Gnulib module: raise
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/rand.texi b/gnulib/doc/posix-functions/rand.texi
new file mode 100644
index 00000000..0c0add50
--- /dev/null
+++ b/gnulib/doc/posix-functions/rand.texi
@@ -0,0 +1,15 @@
+@node rand
+@section @code{rand}
+@findex rand
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rand.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/rand_r.texi b/gnulib/doc/posix-functions/rand_r.texi
new file mode 100644
index 00000000..9fee6caf
--- /dev/null
+++ b/gnulib/doc/posix-functions/rand_r.texi
@@ -0,0 +1,18 @@
+@node rand_r
+@section @code{rand_r}
+@findex rand_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rand_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/random.texi b/gnulib/doc/posix-functions/random.texi
new file mode 100644
index 00000000..c64e0ad3
--- /dev/null
+++ b/gnulib/doc/posix-functions/random.texi
@@ -0,0 +1,18 @@
+@node random
+@section @code{random}
+@findex random
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/random.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/read.texi b/gnulib/doc/posix-functions/read.texi
new file mode 100644
index 00000000..e78764da
--- /dev/null
+++ b/gnulib/doc/posix-functions/read.texi
@@ -0,0 +1,15 @@
+@node read
+@section @code{read}
+@findex read
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/read.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/readdir.texi b/gnulib/doc/posix-functions/readdir.texi
new file mode 100644
index 00000000..b2186a43
--- /dev/null
+++ b/gnulib/doc/posix-functions/readdir.texi
@@ -0,0 +1,15 @@
+@node readdir
+@section @code{readdir}
+@findex readdir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/readdir.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/readdir_r.texi b/gnulib/doc/posix-functions/readdir_r.texi
new file mode 100644
index 00000000..f7c51d6f
--- /dev/null
+++ b/gnulib/doc/posix-functions/readdir_r.texi
@@ -0,0 +1,18 @@
+@node readdir_r
+@section @code{readdir_r}
+@findex readdir_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/readdir_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/readlink.texi b/gnulib/doc/posix-functions/readlink.texi
new file mode 100644
index 00000000..de898fba
--- /dev/null
+++ b/gnulib/doc/posix-functions/readlink.texi
@@ -0,0 +1,42 @@
+@node readlink
+@section @code{readlink}
+@findex readlink
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/readlink.html}
+
+Gnulib module: readlink
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some platforms mistakenly succeed on @code{readlink("link/",buf,len)}:
+FreeBSD 7.2, Solaris 9.
+@item
+On some platforms, @code{readlink} returns @code{int} instead of
+@code{ssize_t}:
+FreeBSD 6.0, OpenBSD 3.8, Cygwin 1.5.x.
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+When @code{readlink} is called on a directory: In the case of NFS mounted
+directories, Cygwin sets @code{errno} to @code{ENOENT} or @code{EIO} instead of
+@code{EINVAL}. To avoid this problem, check for a directory before calling
+@code{readlink}.
+@item
+When @code{readlink} is called on a file that is not a symbolic link:
+Irix may set @code{errno} to @code{ENXIO} instead of @code{EINVAL}. Cygwin
+may set errno to @code{EACCES} instead of @code{EINVAL}.
+@item
+Symlink contents do not always have a trailing null byte, and there is
+no indication if symlink contents were truncated if the return value
+matches the length. Furthermore, AIX 5.1 and HP-UX 11 set
+@code{errno} to @code{ERANGE} rather than returning truncated
+contents, and Linux sets @code{errno} to @code{EINVAL} if the
+requested length is zero. Use the gnulib module areadlink for
+improved ability to read symlink contents.
+@end itemize
diff --git a/gnulib/doc/posix-functions/readlinkat.texi b/gnulib/doc/posix-functions/readlinkat.texi
new file mode 100644
index 00000000..4cef7436
--- /dev/null
+++ b/gnulib/doc/posix-functions/readlinkat.texi
@@ -0,0 +1,40 @@
+@node readlinkat
+@section @code{readlinkat}
+@findex readlinkat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/readlinkat.html}
+
+Gnulib module: readlinkat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function always fails on platforms that don't support symlinks:
+mingw
+@item
+When @code{readlink} is called on a directory: In the case of NFS mounted
+directories, Cygwin sets @code{errno} to @code{ENOENT} or @code{EIO} instead of
+@code{EINVAL}. To avoid this problem, check for a directory before calling
+@code{readlink}.
+@item
+When @code{readlink} is called on a file that is not a symbolic link:
+Irix may set @code{errno} to @code{ENXIO} instead of @code{EINVAL}. Cygwin
+may set errno to @code{EACCES} instead of @code{EINVAL}.
+@item
+Symlink contents do not always have a trailing null byte, and there is
+no indication if symlink contents were truncated if the return value
+matches the length. Furthermore, AIX 5.1 and HP-UX 11 set
+@code{errno} to @code{ERANGE} rather than returning truncated
+contents, and Linux sets @code{errno} to @code{EINVAL} if the
+requested length is zero. Use the gnulib module areadlink for
+improved ability to read symlink contents.
+@end itemize
diff --git a/gnulib/doc/posix-functions/readv.texi b/gnulib/doc/posix-functions/readv.texi
new file mode 100644
index 00000000..44d713e6
--- /dev/null
+++ b/gnulib/doc/posix-functions/readv.texi
@@ -0,0 +1,18 @@
+@node readv
+@section @code{readv}
+@findex readv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/readv.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/realloc.texi b/gnulib/doc/posix-functions/realloc.texi
new file mode 100644
index 00000000..c5519f14
--- /dev/null
+++ b/gnulib/doc/posix-functions/realloc.texi
@@ -0,0 +1,22 @@
+@node realloc
+@section @code{realloc}
+@findex realloc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/realloc.html}
+
+Gnulib module: realloc-posix
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Upon failure, the function does not set @code{errno} to @code{ENOMEM} on
+some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
+
+Extension: Gnulib provides a module @samp{realloc} that substitutes a
+@code{realloc} implementation that behaves more like the glibc implementation.
diff --git a/gnulib/doc/posix-functions/realpath.texi b/gnulib/doc/posix-functions/realpath.texi
new file mode 100644
index 00000000..5f7495be
--- /dev/null
+++ b/gnulib/doc/posix-functions/realpath.texi
@@ -0,0 +1,38 @@
+@node realpath
+@section @code{realpath}
+@findex realpath
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/realpath.html}
+
+Gnulib module: canonicalize-lgpl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+This function does not allow for a NULL @samp{resolved} parameter on
+some platforms:
+Solaris.
+@item
+This function does not always return an absolute path on some
+platforms:
+Solaris.
+@item
+This function fails to detect trailing slashes on non-directories on
+some platforms:
+glibc 2.3.5.
+@item
+This function fails to recognize non-directories followed @samp{..} on
+some platforms:
+cygwin.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function does not allow to determine the required size of output buffer;
+the use of a non-NULL @samp{resolved} buffer is non-portable, since
+PATH_MAX --- if it is defined --- is nothing more than a guess.
+@end itemize
diff --git a/gnulib/doc/posix-functions/recv.texi b/gnulib/doc/posix-functions/recv.texi
new file mode 100644
index 00000000..061ff450
--- /dev/null
+++ b/gnulib/doc/posix-functions/recv.texi
@@ -0,0 +1,19 @@
+@node recv
+@section @code{recv}
+@findex recv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/recv.html}
+
+Gnulib module: recv
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for @code{recv}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/recvfrom.texi b/gnulib/doc/posix-functions/recvfrom.texi
new file mode 100644
index 00000000..7f8214ff
--- /dev/null
+++ b/gnulib/doc/posix-functions/recvfrom.texi
@@ -0,0 +1,22 @@
+@node recvfrom
+@section @code{recvfrom}
+@findex recvfrom
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html}
+
+Gnulib module: recvfrom
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for
+@code{recvfrom} are not placed in @code{errno}, and
+@code{WSAGetLastError} must be used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some platforms don't have a @code{socklen_t} type; in this case this function's
+sixth argument type is @samp{int *}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/recvmsg.texi b/gnulib/doc/posix-functions/recvmsg.texi
new file mode 100644
index 00000000..e3ce68e0
--- /dev/null
+++ b/gnulib/doc/posix-functions/recvmsg.texi
@@ -0,0 +1,18 @@
+@node recvmsg
+@section @code{recvmsg}
+@findex recvmsg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/regcomp.texi b/gnulib/doc/posix-functions/regcomp.texi
new file mode 100644
index 00000000..5c64038f
--- /dev/null
+++ b/gnulib/doc/posix-functions/regcomp.texi
@@ -0,0 +1,20 @@
+@node regcomp
+@section @code{regcomp}
+@findex regcomp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/regcomp.html}
+
+Gnulib module: regex
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+Many regular expression implementations have bugs.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/regerror.texi b/gnulib/doc/posix-functions/regerror.texi
new file mode 100644
index 00000000..e3210808
--- /dev/null
+++ b/gnulib/doc/posix-functions/regerror.texi
@@ -0,0 +1,18 @@
+@node regerror
+@section @code{regerror}
+@findex regerror
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/regerror.html}
+
+Gnulib module: regex
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/regexec.texi b/gnulib/doc/posix-functions/regexec.texi
new file mode 100644
index 00000000..46870039
--- /dev/null
+++ b/gnulib/doc/posix-functions/regexec.texi
@@ -0,0 +1,20 @@
+@node regexec
+@section @code{regexec}
+@findex regexec
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/regexec.html}
+
+Gnulib module: regex
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+Many regular expression implementations have bugs.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/regfree.texi b/gnulib/doc/posix-functions/regfree.texi
new file mode 100644
index 00000000..cd5e6358
--- /dev/null
+++ b/gnulib/doc/posix-functions/regfree.texi
@@ -0,0 +1,18 @@
+@node regfree
+@section @code{regfree}
+@findex regfree
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/regfree.html}
+
+Gnulib module: regex
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/remainder.texi b/gnulib/doc/posix-functions/remainder.texi
new file mode 100644
index 00000000..1eab409b
--- /dev/null
+++ b/gnulib/doc/posix-functions/remainder.texi
@@ -0,0 +1,15 @@
+@node remainder
+@section @code{remainder}
+@findex remainder
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/remainder.html}
+
+Gnulib module: remainder
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/remainderf.texi b/gnulib/doc/posix-functions/remainderf.texi
new file mode 100644
index 00000000..6b39028a
--- /dev/null
+++ b/gnulib/doc/posix-functions/remainderf.texi
@@ -0,0 +1,18 @@
+@node remainderf
+@section @code{remainderf}
+@findex remainderf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/remainderf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/remainderl.texi b/gnulib/doc/posix-functions/remainderl.texi
new file mode 100644
index 00000000..48abdf84
--- /dev/null
+++ b/gnulib/doc/posix-functions/remainderl.texi
@@ -0,0 +1,18 @@
+@node remainderl
+@section @code{remainderl}
+@findex remainderl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/remainderl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/remove.texi b/gnulib/doc/posix-functions/remove.texi
new file mode 100644
index 00000000..83a8955c
--- /dev/null
+++ b/gnulib/doc/posix-functions/remove.texi
@@ -0,0 +1,26 @@
+@node remove
+@section @code{remove}
+@findex remove
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/remove.html}
+
+Gnulib module: remove
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function fails to reject trailing slashes on non-directories on
+some platforms:
+FreeBSD 7.2, Solaris 9.
+@item
+This function mistakenly removes a directory with
+@code{remove("dir/./")} on some platforms:
+Cygwin 1.5.x.
+@item
+This function does not remove empty directories on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/remque.texi b/gnulib/doc/posix-functions/remque.texi
new file mode 100644
index 00000000..00427319
--- /dev/null
+++ b/gnulib/doc/posix-functions/remque.texi
@@ -0,0 +1,18 @@
+@node remque
+@section @code{remque}
+@findex remque
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/remque.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/remquo.texi b/gnulib/doc/posix-functions/remquo.texi
new file mode 100644
index 00000000..28c980f8
--- /dev/null
+++ b/gnulib/doc/posix-functions/remquo.texi
@@ -0,0 +1,18 @@
+@node remquo
+@section @code{remquo}
+@findex remquo
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/remquo.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/remquof.texi b/gnulib/doc/posix-functions/remquof.texi
new file mode 100644
index 00000000..31384d1f
--- /dev/null
+++ b/gnulib/doc/posix-functions/remquof.texi
@@ -0,0 +1,18 @@
+@node remquof
+@section @code{remquof}
+@findex remquof
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/remquof.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/remquol.texi b/gnulib/doc/posix-functions/remquol.texi
new file mode 100644
index 00000000..c85ffc40
--- /dev/null
+++ b/gnulib/doc/posix-functions/remquol.texi
@@ -0,0 +1,18 @@
+@node remquol
+@section @code{remquol}
+@findex remquol
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/remquol.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/rename.texi b/gnulib/doc/posix-functions/rename.texi
new file mode 100644
index 00000000..cd11a6de
--- /dev/null
+++ b/gnulib/doc/posix-functions/rename.texi
@@ -0,0 +1,66 @@
+@node rename
+@section @code{rename}
+@findex rename
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rename.html}
+
+Gnulib module: rename
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function does not allow trailing slashes when creating a
+destination directory, as in @code{rename("dir","new/")}:
+NetBSD 1.6.
+@item
+This function does not reject trailing slashes on the destination for
+non-directories on some platforms, as in @code{rename("file","new/")}:
+Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not reject trailing slashes on symlinks to
+non-directories on some platforms, as in
+@code{rename("link-to-file/","f")}:
+FreeBSD 7.2.
+@item
+This function ignores trailing slashes on symlinks on some platforms,
+such that @code{rename("link/","new")} corrupts @file{link}:
+Solaris 9.
+@item
+This function incorrectly reduces the link count when comparing two
+spellings of a hard link on some platforms:
+NetBSD 1.6, Cygwin 1.5.x.
+@item
+This function will not always replace an existing destination on some
+platforms:
+Cygwin 1.5.x, mingw.
+However, the replacement is not atomic for directories, and may end up
+losing the empty destination if the source could not be renamed.
+@item
+This function mistakenly allows names ending in @samp{.} or @samp{..}
+on some platforms:
+Cygwin 1.5.x, mingw.
+@item
+This function does not reject attempts to rename existing directories
+and non-directories onto one another on some platforms:
+Cygwin 1.5.x, mingw.
+@item
+This function does not allow trailing slashes on source directories on
+older platforms, as in @samp{rename("dir/","new")}:
+SunOS 4.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+POSIX requires that @code{rename("symlink-to-dir/","dir2")} rename
+@file{dir} and leave @file{symlink-to-dir} dangling; likewise, it
+requires that @code{rename("dir","dangling/")} rename @file{dir} so
+that @file{dangling} is no longer a dangling symlink. This behavior
+is counter-intuitive, so on some systems, @code{rename} fails with
+@code{ENOTDIR} if either argument is a symlink with a trailing slash:
+glibc, OpenBSD, Cygwin 1.7.
+@item
+This function will not rename a source that is currently opened
+by any process:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/renameat.texi b/gnulib/doc/posix-functions/renameat.texi
new file mode 100644
index 00000000..ff08b09b
--- /dev/null
+++ b/gnulib/doc/posix-functions/renameat.texi
@@ -0,0 +1,41 @@
+@node renameat
+@section @code{renameat}
+@findex renameat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/renameat.html}
+
+Gnulib module: renameat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function does not reject trailing slashes on non-directories on
+some platforms, as in @code{renameat(fd,"file",fd,"new/")}:
+Solaris 10.
+@item
+This function ignores trailing slashes on symlinks on some platforms,
+such that @code{renameat(fd,"link/",fd,"new")} corrupts @file{link}:
+Solaris 9.
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 8, Cygwin 1.5.x, mingw,
+Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+POSIX requires that @code{renameat(fd,"symlink-to-dir/",fd,"dir2")} rename
+@file{dir} and leave @file{symlink-to-dir} dangling; likewise, it
+requires that @code{renameat(fd,"dir",fd,"dangling/")} rename @file{dir} so
+that @file{dangling} is no longer a dangling symlink. This behavior
+is counter-intuitive, so on some systems, @code{renameat} fails with
+@code{ENOTDIR} if either argument is a symlink with a trailing slash:
+glibc, OpenBSD, Cygwin 1.7.
+@item
+This function will not rename a source that is currently opened
+by any process:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/rewind.texi b/gnulib/doc/posix-functions/rewind.texi
new file mode 100644
index 00000000..3e0af888
--- /dev/null
+++ b/gnulib/doc/posix-functions/rewind.texi
@@ -0,0 +1,18 @@
+@node rewind
+@section @code{rewind}
+@findex rewind
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rewind.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/rewinddir.texi b/gnulib/doc/posix-functions/rewinddir.texi
new file mode 100644
index 00000000..0ef34db2
--- /dev/null
+++ b/gnulib/doc/posix-functions/rewinddir.texi
@@ -0,0 +1,15 @@
+@node rewinddir
+@section @code{rewinddir}
+@findex rewinddir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rewinddir.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/rint.texi b/gnulib/doc/posix-functions/rint.texi
new file mode 100644
index 00000000..12ab1d15
--- /dev/null
+++ b/gnulib/doc/posix-functions/rint.texi
@@ -0,0 +1,15 @@
+@node rint
+@section @code{rint}
+@findex rint
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rint.html}
+
+Gnulib module: rint
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/rintf.texi b/gnulib/doc/posix-functions/rintf.texi
new file mode 100644
index 00000000..da7f9fad
--- /dev/null
+++ b/gnulib/doc/posix-functions/rintf.texi
@@ -0,0 +1,18 @@
+@node rintf
+@section @code{rintf}
+@findex rintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/rintl.texi b/gnulib/doc/posix-functions/rintl.texi
new file mode 100644
index 00000000..34b5093e
--- /dev/null
+++ b/gnulib/doc/posix-functions/rintl.texi
@@ -0,0 +1,19 @@
+@node rintl
+@section @code{rintl}
+@findex rintl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rintl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5,
+Solaris 9, Cygwin 1.5.x, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/rmdir.texi b/gnulib/doc/posix-functions/rmdir.texi
new file mode 100644
index 00000000..aca8b8b6
--- /dev/null
+++ b/gnulib/doc/posix-functions/rmdir.texi
@@ -0,0 +1,33 @@
+@node rmdir
+@section @code{rmdir}
+@findex rmdir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/rmdir.html}
+
+Gnulib module: rmdir
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function mistakenly removes a directory with
+@code{rmdir("dir/./")} on some platforms:
+Cygwin 1.5.x.
+@item
+This function fails with @code{EINVAL} instead of the expected
+@code{ENOTDIR} for @code{rmdir("file/")} on some platforms:
+mingw.
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+When @code{rmdir} fails because the specified directory is not empty, the
+@code{errno} value is system dependent.
+@item
+POSIX requires that @code{rmdir("link-to-empty/")} remove @file{empty}
+and leave @file{link-to-empty} as a dangling symlink. This is
+counter-intuitive, so some systems fail with @code{ENOTDIR} instead:
+glibc
+@end itemize
diff --git a/gnulib/doc/posix-functions/round.texi b/gnulib/doc/posix-functions/round.texi
new file mode 100644
index 00000000..a2dde673
--- /dev/null
+++ b/gnulib/doc/posix-functions/round.texi
@@ -0,0 +1,21 @@
+@node round
+@section @code{round}
+@findex round
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/round.html}
+
+Gnulib module: round
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@item
+This functions returns a wrong result for x = 1/2 - 2^-54 on some platforms:
+NetBSD 3.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/roundf.texi b/gnulib/doc/posix-functions/roundf.texi
new file mode 100644
index 00000000..bdfd0808
--- /dev/null
+++ b/gnulib/doc/posix-functions/roundf.texi
@@ -0,0 +1,21 @@
+@node roundf
+@section @code{roundf}
+@findex roundf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/roundf.html}
+
+Gnulib module: roundf
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@item
+This functions returns a wrong result for x = 1/2 - 2^-25 on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/roundl.texi b/gnulib/doc/posix-functions/roundl.texi
new file mode 100644
index 00000000..5a299388
--- /dev/null
+++ b/gnulib/doc/posix-functions/roundl.texi
@@ -0,0 +1,18 @@
+@node roundl
+@section @code{roundl}
+@findex roundl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/roundl.html}
+
+Gnulib module: roundl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/scalbln.texi b/gnulib/doc/posix-functions/scalbln.texi
new file mode 100644
index 00000000..c450ed0d
--- /dev/null
+++ b/gnulib/doc/posix-functions/scalbln.texi
@@ -0,0 +1,18 @@
+@node scalbln
+@section @code{scalbln}
+@findex scalbln
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/scalbln.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/scalblnf.texi b/gnulib/doc/posix-functions/scalblnf.texi
new file mode 100644
index 00000000..e806501b
--- /dev/null
+++ b/gnulib/doc/posix-functions/scalblnf.texi
@@ -0,0 +1,18 @@
+@node scalblnf
+@section @code{scalblnf}
+@findex scalblnf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/scalblnf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/scalblnl.texi b/gnulib/doc/posix-functions/scalblnl.texi
new file mode 100644
index 00000000..9f59bab3
--- /dev/null
+++ b/gnulib/doc/posix-functions/scalblnl.texi
@@ -0,0 +1,18 @@
+@node scalblnl
+@section @code{scalblnl}
+@findex scalblnl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/scalblnl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/scalbn.texi b/gnulib/doc/posix-functions/scalbn.texi
new file mode 100644
index 00000000..9097f0a5
--- /dev/null
+++ b/gnulib/doc/posix-functions/scalbn.texi
@@ -0,0 +1,18 @@
+@node scalbn
+@section @code{scalbn}
+@findex scalbn
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/scalbn.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, IRIX 6.5, OSF/1 4.0.
+@end itemize
diff --git a/gnulib/doc/posix-functions/scalbnf.texi b/gnulib/doc/posix-functions/scalbnf.texi
new file mode 100644
index 00000000..972e06e0
--- /dev/null
+++ b/gnulib/doc/posix-functions/scalbnf.texi
@@ -0,0 +1,18 @@
+@node scalbnf
+@section @code{scalbnf}
+@findex scalbnf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/scalbnf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/scalbnl.texi b/gnulib/doc/posix-functions/scalbnl.texi
new file mode 100644
index 00000000..70cfbc45
--- /dev/null
+++ b/gnulib/doc/posix-functions/scalbnl.texi
@@ -0,0 +1,18 @@
+@node scalbnl
+@section @code{scalbnl}
+@findex scalbnl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/scalbnl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/scandir.texi b/gnulib/doc/posix-functions/scandir.texi
new file mode 100644
index 00000000..ca37bcbd
--- /dev/null
+++ b/gnulib/doc/posix-functions/scandir.texi
@@ -0,0 +1,24 @@
+@node scandir
+@section @code{scandir}
+@findex scandir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/scandir.html}
+
+Gnulib module: scandir
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 9, mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The fourth parameter of this function is declared as @code{int (*) (const void *, const void *)} on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Interix 3.5.
+@item
+The fourth parameter of this function is declared as @code{int (*) (void *, void *)} on some platforms:
+AIX 5.1.
+@end itemize
diff --git a/gnulib/doc/posix-functions/scanf.texi b/gnulib/doc/posix-functions/scanf.texi
new file mode 100644
index 00000000..d6bd7af6
--- /dev/null
+++ b/gnulib/doc/posix-functions/scanf.texi
@@ -0,0 +1,21 @@
+@node scanf
+@section @code{scanf}
+@findex scanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/scanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+On Windows, this function doesn't support the @code{hh}, @code{ll}, @code{j},
+@code{t}, @code{z} size specifiers.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sched_get_priority_max.texi b/gnulib/doc/posix-functions/sched_get_priority_max.texi
new file mode 100644
index 00000000..1f574454
--- /dev/null
+++ b/gnulib/doc/posix-functions/sched_get_priority_max.texi
@@ -0,0 +1,18 @@
+@node sched_get_priority_max
+@section @code{sched_get_priority_max}
+@findex sched_get_priority_max
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sched_get_priority_max.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sched_get_priority_min.texi b/gnulib/doc/posix-functions/sched_get_priority_min.texi
new file mode 100644
index 00000000..cfef8527
--- /dev/null
+++ b/gnulib/doc/posix-functions/sched_get_priority_min.texi
@@ -0,0 +1,18 @@
+@node sched_get_priority_min
+@section @code{sched_get_priority_min}
+@findex sched_get_priority_min
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sched_get_priority_min.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, HP-UX 11, IRIX 5.3, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sched_getparam.texi b/gnulib/doc/posix-functions/sched_getparam.texi
new file mode 100644
index 00000000..e36ea4a0
--- /dev/null
+++ b/gnulib/doc/posix-functions/sched_getparam.texi
@@ -0,0 +1,18 @@
+@node sched_getparam
+@section @code{sched_getparam}
+@findex sched_getparam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sched_getparam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sched_getscheduler.texi b/gnulib/doc/posix-functions/sched_getscheduler.texi
new file mode 100644
index 00000000..7f548dbc
--- /dev/null
+++ b/gnulib/doc/posix-functions/sched_getscheduler.texi
@@ -0,0 +1,18 @@
+@node sched_getscheduler
+@section @code{sched_getscheduler}
+@findex sched_getscheduler
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sched_getscheduler.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sched_rr_get_interval.texi b/gnulib/doc/posix-functions/sched_rr_get_interval.texi
new file mode 100644
index 00000000..a9fe0b5a
--- /dev/null
+++ b/gnulib/doc/posix-functions/sched_rr_get_interval.texi
@@ -0,0 +1,18 @@
+@node sched_rr_get_interval
+@section @code{sched_rr_get_interval}
+@findex sched_rr_get_interval
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sched_rr_get_interval.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, HP-UX 11, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sched_setparam.texi b/gnulib/doc/posix-functions/sched_setparam.texi
new file mode 100644
index 00000000..a76ed0ce
--- /dev/null
+++ b/gnulib/doc/posix-functions/sched_setparam.texi
@@ -0,0 +1,18 @@
+@node sched_setparam
+@section @code{sched_setparam}
+@findex sched_setparam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sched_setparam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sched_setscheduler.texi b/gnulib/doc/posix-functions/sched_setscheduler.texi
new file mode 100644
index 00000000..7aead9d9
--- /dev/null
+++ b/gnulib/doc/posix-functions/sched_setscheduler.texi
@@ -0,0 +1,18 @@
+@node sched_setscheduler
+@section @code{sched_setscheduler}
+@findex sched_setscheduler
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sched_setscheduler.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sched_yield.texi b/gnulib/doc/posix-functions/sched_yield.texi
new file mode 100644
index 00000000..9d9d14cc
--- /dev/null
+++ b/gnulib/doc/posix-functions/sched_yield.texi
@@ -0,0 +1,18 @@
+@node sched_yield
+@section @code{sched_yield}
+@findex sched_yield
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sched_yield.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/seed48.texi b/gnulib/doc/posix-functions/seed48.texi
new file mode 100644
index 00000000..93a5ad2a
--- /dev/null
+++ b/gnulib/doc/posix-functions/seed48.texi
@@ -0,0 +1,18 @@
+@node seed48
+@section @code{seed48}
+@findex seed48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/seed48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/seekdir.texi b/gnulib/doc/posix-functions/seekdir.texi
new file mode 100644
index 00000000..f8944c74
--- /dev/null
+++ b/gnulib/doc/posix-functions/seekdir.texi
@@ -0,0 +1,18 @@
+@node seekdir
+@section @code{seekdir}
+@findex seekdir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/seekdir.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/select.texi b/gnulib/doc/posix-functions/select.texi
new file mode 100644
index 00000000..0b52c27c
--- /dev/null
+++ b/gnulib/doc/posix-functions/select.texi
@@ -0,0 +1,40 @@
+@node select
+@section @code{select}
+@findex select
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/select.html}
+
+Gnulib module: select
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), @code{select} can only be
+called on descriptors created by the @code{socket} function, not on regular
+file descriptors.
+@item
+On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
+placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+@item
+This function fails when the @code{nfds} argument is 0 on some platforms:
+Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+When you call @code{select} with a timeout, some implementations modify the
+timeout parameter so that upon return from the function, it contains the
+amount of time not slept. Other implementations leave the timeout parameter
+unmodified.
+@item
+On BeOS, @code{select} can only be called on descriptors created by the
+@code{socket} function, not on regular file descriptors.
+@item
+On Solaris 2.6 and older, @code{select} applied to a file descriptor opened
+for reading and associated with @code{/dev/null} hangs, waiting for input,
+when instead it should return immediately.
+@item
+On Linux, when some file descriptor refers to a regular file, @code{select}
+may fail, setting @code{errno} to @code{EBADF}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_close.texi b/gnulib/doc/posix-functions/sem_close.texi
new file mode 100644
index 00000000..aae4568f
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_close.texi
@@ -0,0 +1,18 @@
+@node sem_close
+@section @code{sem_close}
+@findex sem_close
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_close.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_destroy.texi b/gnulib/doc/posix-functions/sem_destroy.texi
new file mode 100644
index 00000000..62050719
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_destroy.texi
@@ -0,0 +1,18 @@
+@node sem_destroy
+@section @code{sem_destroy}
+@findex sem_destroy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_destroy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_getvalue.texi b/gnulib/doc/posix-functions/sem_getvalue.texi
new file mode 100644
index 00000000..965e2d37
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_getvalue.texi
@@ -0,0 +1,18 @@
+@node sem_getvalue
+@section @code{sem_getvalue}
+@findex sem_getvalue
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_getvalue.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_init.texi b/gnulib/doc/posix-functions/sem_init.texi
new file mode 100644
index 00000000..6cfdafa5
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_init.texi
@@ -0,0 +1,18 @@
+@node sem_init
+@section @code{sem_init}
+@findex sem_init
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_init.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_open.texi b/gnulib/doc/posix-functions/sem_open.texi
new file mode 100644
index 00000000..c78772d9
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_open.texi
@@ -0,0 +1,18 @@
+@node sem_open
+@section @code{sem_open}
+@findex sem_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_open.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_post.texi b/gnulib/doc/posix-functions/sem_post.texi
new file mode 100644
index 00000000..660a626d
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_post.texi
@@ -0,0 +1,18 @@
+@node sem_post
+@section @code{sem_post}
+@findex sem_post
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_post.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_timedwait.texi b/gnulib/doc/posix-functions/sem_timedwait.texi
new file mode 100644
index 00000000..62609056
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_timedwait.texi
@@ -0,0 +1,18 @@
+@node sem_timedwait
+@section @code{sem_timedwait}
+@findex sem_timedwait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_timedwait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_trywait.texi b/gnulib/doc/posix-functions/sem_trywait.texi
new file mode 100644
index 00000000..99193580
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_trywait.texi
@@ -0,0 +1,18 @@
+@node sem_trywait
+@section @code{sem_trywait}
+@findex sem_trywait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_trywait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_unlink.texi b/gnulib/doc/posix-functions/sem_unlink.texi
new file mode 100644
index 00000000..b8139040
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_unlink.texi
@@ -0,0 +1,18 @@
+@node sem_unlink
+@section @code{sem_unlink}
+@findex sem_unlink
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_unlink.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, Cygwin 1.5.x, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sem_wait.texi b/gnulib/doc/posix-functions/sem_wait.texi
new file mode 100644
index 00000000..4c6301f0
--- /dev/null
+++ b/gnulib/doc/posix-functions/sem_wait.texi
@@ -0,0 +1,18 @@
+@node sem_wait
+@section @code{sem_wait}
+@findex sem_wait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sem_wait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/semctl.texi b/gnulib/doc/posix-functions/semctl.texi
new file mode 100644
index 00000000..455e0260
--- /dev/null
+++ b/gnulib/doc/posix-functions/semctl.texi
@@ -0,0 +1,18 @@
+@node semctl
+@section @code{semctl}
+@findex semctl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/semctl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/semget.texi b/gnulib/doc/posix-functions/semget.texi
new file mode 100644
index 00000000..56b1fcbb
--- /dev/null
+++ b/gnulib/doc/posix-functions/semget.texi
@@ -0,0 +1,18 @@
+@node semget
+@section @code{semget}
+@findex semget
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/semget.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/semop.texi b/gnulib/doc/posix-functions/semop.texi
new file mode 100644
index 00000000..e5cb2a12
--- /dev/null
+++ b/gnulib/doc/posix-functions/semop.texi
@@ -0,0 +1,18 @@
+@node semop
+@section @code{semop}
+@findex semop
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/semop.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/send.texi b/gnulib/doc/posix-functions/send.texi
new file mode 100644
index 00000000..87384af3
--- /dev/null
+++ b/gnulib/doc/posix-functions/send.texi
@@ -0,0 +1,19 @@
+@node send
+@section @code{send}
+@findex send
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/send.html}
+
+Gnulib module: send
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for @code{send}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sendmsg.texi b/gnulib/doc/posix-functions/sendmsg.texi
new file mode 100644
index 00000000..e7b82924
--- /dev/null
+++ b/gnulib/doc/posix-functions/sendmsg.texi
@@ -0,0 +1,18 @@
+@node sendmsg
+@section @code{sendmsg}
+@findex sendmsg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sendto.texi b/gnulib/doc/posix-functions/sendto.texi
new file mode 100644
index 00000000..4ff9b0cd
--- /dev/null
+++ b/gnulib/doc/posix-functions/sendto.texi
@@ -0,0 +1,19 @@
+@node sendto
+@section @code{sendto}
+@findex sendto
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sendto.html}
+
+Gnulib module: sendto
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for @code{sendto}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/setbuf.texi b/gnulib/doc/posix-functions/setbuf.texi
new file mode 100644
index 00000000..7bce9c50
--- /dev/null
+++ b/gnulib/doc/posix-functions/setbuf.texi
@@ -0,0 +1,15 @@
+@node setbuf
+@section @code{setbuf}
+@findex setbuf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setbuf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/setegid.texi b/gnulib/doc/posix-functions/setegid.texi
new file mode 100644
index 00000000..7ccbeef2
--- /dev/null
+++ b/gnulib/doc/posix-functions/setegid.texi
@@ -0,0 +1,18 @@
+@node setegid
+@section @code{setegid}
+@findex setegid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setegid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setenv.texi b/gnulib/doc/posix-functions/setenv.texi
new file mode 100644
index 00000000..279ae14a
--- /dev/null
+++ b/gnulib/doc/posix-functions/setenv.texi
@@ -0,0 +1,30 @@
+@node setenv
+@section @code{setenv}
+@findex setenv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setenv.html}
+
+Gnulib module: setenv
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, HP-UX 11, IRIX 6.5, Solaris 9, mingw, BeOS.
+@item
+On some platforms, this function does not fail with @samp{EINVAL} when
+passed an empty string or a string containing @samp{=}:
+FreeBSD 6.0, NetBSD 1.6, OpenBSD 3.8, Cygwin 1.5.x.
+@item
+On some platforms, this function removes a leading @samp{=} from the
+value argument:
+Cygwin 1.5.x.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Older versions of POSIX required that @code{setenv(NULL,"",0)} gracefully
+fail with @code{EINVAL}, but not all implementations guarantee this,
+and the requirement was removed.
+@end itemize
diff --git a/gnulib/doc/posix-functions/seteuid.texi b/gnulib/doc/posix-functions/seteuid.texi
new file mode 100644
index 00000000..bff045f4
--- /dev/null
+++ b/gnulib/doc/posix-functions/seteuid.texi
@@ -0,0 +1,18 @@
+@node seteuid
+@section @code{seteuid}
+@findex seteuid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/seteuid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setgid.texi b/gnulib/doc/posix-functions/setgid.texi
new file mode 100644
index 00000000..74a2a7e2
--- /dev/null
+++ b/gnulib/doc/posix-functions/setgid.texi
@@ -0,0 +1,18 @@
+@node setgid
+@section @code{setgid}
+@findex setgid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setgid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setgrent.texi b/gnulib/doc/posix-functions/setgrent.texi
new file mode 100644
index 00000000..165683a8
--- /dev/null
+++ b/gnulib/doc/posix-functions/setgrent.texi
@@ -0,0 +1,18 @@
+@node setgrent
+@section @code{setgrent}
+@findex setgrent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setgrent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sethostent.texi b/gnulib/doc/posix-functions/sethostent.texi
new file mode 100644
index 00000000..d350ec72
--- /dev/null
+++ b/gnulib/doc/posix-functions/sethostent.texi
@@ -0,0 +1,18 @@
+@node sethostent
+@section @code{sethostent}
+@findex sethostent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sethostent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setitimer.texi b/gnulib/doc/posix-functions/setitimer.texi
new file mode 100644
index 00000000..9204719e
--- /dev/null
+++ b/gnulib/doc/posix-functions/setitimer.texi
@@ -0,0 +1,18 @@
+@node setitimer
+@section @code{setitimer}
+@findex setitimer
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setitimer.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setjmp.texi b/gnulib/doc/posix-functions/setjmp.texi
new file mode 100644
index 00000000..596b7d21
--- /dev/null
+++ b/gnulib/doc/posix-functions/setjmp.texi
@@ -0,0 +1,23 @@
+@node setjmp
+@section @code{setjmp}
+@findex setjmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setjmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+POSIX does not specify whether @code{setjmp} saves the signal mask in the
+@code{jmp_buf}. It does on BSD platforms, and on glibc platforms when
+@code{_BSD_SOURCE} is defined; in this case @code{setjmp} behaves like
+@code{sigsetjmp(.,1)}, and functions @code{_setjmp} and @code{_longjmp} are
+available that don't save or restore the signal mask. On System V platforms
+(excluding HP-UX), and on glibc platforms by default, @code{setjmp} doesn't
+save the signal mask.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setkey.texi b/gnulib/doc/posix-functions/setkey.texi
new file mode 100644
index 00000000..5b5056e5
--- /dev/null
+++ b/gnulib/doc/posix-functions/setkey.texi
@@ -0,0 +1,18 @@
+@node setkey
+@section @code{setkey}
+@findex setkey
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setkey.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setlocale.texi b/gnulib/doc/posix-functions/setlocale.texi
new file mode 100644
index 00000000..6806f0b4
--- /dev/null
+++ b/gnulib/doc/posix-functions/setlocale.texi
@@ -0,0 +1,21 @@
+@node setlocale
+@section @code{setlocale}
+@findex setlocale
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setlocale.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Cygwin 1.5.x, which doesn't have locales,
+@code{setlocale(LC_ALL,NULL)} always returns @code{"C"}.
+
+@item
+On Cygwin 1.7.0, only the charset portion of a locale designation is honored.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setlogmask.texi b/gnulib/doc/posix-functions/setlogmask.texi
new file mode 100644
index 00000000..2ba799fd
--- /dev/null
+++ b/gnulib/doc/posix-functions/setlogmask.texi
@@ -0,0 +1,18 @@
+@node setlogmask
+@section @code{setlogmask}
+@findex setlogmask
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setlogmask.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setnetent.texi b/gnulib/doc/posix-functions/setnetent.texi
new file mode 100644
index 00000000..e55d1f35
--- /dev/null
+++ b/gnulib/doc/posix-functions/setnetent.texi
@@ -0,0 +1,18 @@
+@node setnetent
+@section @code{setnetent}
+@findex setnetent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setnetent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setpgid.texi b/gnulib/doc/posix-functions/setpgid.texi
new file mode 100644
index 00000000..4b03633f
--- /dev/null
+++ b/gnulib/doc/posix-functions/setpgid.texi
@@ -0,0 +1,18 @@
+@node setpgid
+@section @code{setpgid}
+@findex setpgid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setpgid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setpgrp.texi b/gnulib/doc/posix-functions/setpgrp.texi
new file mode 100644
index 00000000..fed8909d
--- /dev/null
+++ b/gnulib/doc/posix-functions/setpgrp.texi
@@ -0,0 +1,18 @@
+@node setpgrp
+@section @code{setpgrp}
+@findex setpgrp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setpgrp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setpriority.texi b/gnulib/doc/posix-functions/setpriority.texi
new file mode 100644
index 00000000..9e33b808
--- /dev/null
+++ b/gnulib/doc/posix-functions/setpriority.texi
@@ -0,0 +1,18 @@
+@node setpriority
+@section @code{setpriority}
+@findex setpriority
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setpriority.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setprotoent.texi b/gnulib/doc/posix-functions/setprotoent.texi
new file mode 100644
index 00000000..d939a490
--- /dev/null
+++ b/gnulib/doc/posix-functions/setprotoent.texi
@@ -0,0 +1,18 @@
+@node setprotoent
+@section @code{setprotoent}
+@findex setprotoent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setprotoent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setpwent.texi b/gnulib/doc/posix-functions/setpwent.texi
new file mode 100644
index 00000000..dd351f71
--- /dev/null
+++ b/gnulib/doc/posix-functions/setpwent.texi
@@ -0,0 +1,18 @@
+@node setpwent
+@section @code{setpwent}
+@findex setpwent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setpwent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setregid.texi b/gnulib/doc/posix-functions/setregid.texi
new file mode 100644
index 00000000..a5dadedf
--- /dev/null
+++ b/gnulib/doc/posix-functions/setregid.texi
@@ -0,0 +1,18 @@
+@node setregid
+@section @code{setregid}
+@findex setregid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setregid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setreuid.texi b/gnulib/doc/posix-functions/setreuid.texi
new file mode 100644
index 00000000..a286d219
--- /dev/null
+++ b/gnulib/doc/posix-functions/setreuid.texi
@@ -0,0 +1,18 @@
+@node setreuid
+@section @code{setreuid}
+@findex setreuid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setreuid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setrlimit.texi b/gnulib/doc/posix-functions/setrlimit.texi
new file mode 100644
index 00000000..4f2fff87
--- /dev/null
+++ b/gnulib/doc/posix-functions/setrlimit.texi
@@ -0,0 +1,18 @@
+@node setrlimit
+@section @code{setrlimit}
+@findex setrlimit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setrlimit.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setservent.texi b/gnulib/doc/posix-functions/setservent.texi
new file mode 100644
index 00000000..01e62fed
--- /dev/null
+++ b/gnulib/doc/posix-functions/setservent.texi
@@ -0,0 +1,18 @@
+@node setservent
+@section @code{setservent}
+@findex setservent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setservent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setsid.texi b/gnulib/doc/posix-functions/setsid.texi
new file mode 100644
index 00000000..83a75ad9
--- /dev/null
+++ b/gnulib/doc/posix-functions/setsid.texi
@@ -0,0 +1,18 @@
+@node setsid
+@section @code{setsid}
+@findex setsid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setsid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setsockopt.texi b/gnulib/doc/posix-functions/setsockopt.texi
new file mode 100644
index 00000000..9609f0d0
--- /dev/null
+++ b/gnulib/doc/posix-functions/setsockopt.texi
@@ -0,0 +1,21 @@
+@node setsockopt
+@section @code{setsockopt}
+@findex setsockopt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html}
+
+Gnulib module: setsockopt
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for
+@code{setsockopt} are not placed in @code{errno}, and
+@code{WSAGetLastError} must be used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Many socket options are not available on all platforms.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setstate.texi b/gnulib/doc/posix-functions/setstate.texi
new file mode 100644
index 00000000..854bd94b
--- /dev/null
+++ b/gnulib/doc/posix-functions/setstate.texi
@@ -0,0 +1,18 @@
+@node setstate
+@section @code{setstate}
+@findex setstate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setstate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setuid.texi b/gnulib/doc/posix-functions/setuid.texi
new file mode 100644
index 00000000..e226e369
--- /dev/null
+++ b/gnulib/doc/posix-functions/setuid.texi
@@ -0,0 +1,18 @@
+@node setuid
+@section @code{setuid}
+@findex setuid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setuid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setutxent.texi b/gnulib/doc/posix-functions/setutxent.texi
new file mode 100644
index 00000000..a508d30f
--- /dev/null
+++ b/gnulib/doc/posix-functions/setutxent.texi
@@ -0,0 +1,18 @@
+@node setutxent
+@section @code{setutxent}
+@findex setutxent
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setutxent.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/setvbuf.texi b/gnulib/doc/posix-functions/setvbuf.texi
new file mode 100644
index 00000000..e0dce878
--- /dev/null
+++ b/gnulib/doc/posix-functions/setvbuf.texi
@@ -0,0 +1,18 @@
+@node setvbuf
+@section @code{setvbuf}
+@findex setvbuf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/setvbuf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/shm_open.texi b/gnulib/doc/posix-functions/shm_open.texi
new file mode 100644
index 00000000..c4ae26ef
--- /dev/null
+++ b/gnulib/doc/posix-functions/shm_open.texi
@@ -0,0 +1,18 @@
+@node shm_open
+@section @code{shm_open}
+@findex shm_open
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/shm_open.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris 2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/shm_unlink.texi b/gnulib/doc/posix-functions/shm_unlink.texi
new file mode 100644
index 00000000..c4f088f7
--- /dev/null
+++ b/gnulib/doc/posix-functions/shm_unlink.texi
@@ -0,0 +1,18 @@
+@node shm_unlink
+@section @code{shm_unlink}
+@findex shm_unlink
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/shm_unlink.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Solaris 2.4, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/shmat.texi b/gnulib/doc/posix-functions/shmat.texi
new file mode 100644
index 00000000..ebcb5096
--- /dev/null
+++ b/gnulib/doc/posix-functions/shmat.texi
@@ -0,0 +1,26 @@
+@node shmat
+@section @code{shmat}
+@findex shmat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/shmat.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+Attempts to @code{shmat} into a previously malloc-ed region fail on SunOS 4,
+with @code{errno} set to @code{EINVAL}, even if there is an @code{munmap} call
+in between.
+@item
+On Linux, the flag @code{SHM_REMAP} is needed in order to force @code{shmat}
+to replace existing memory mappings in the specify address range. On other
+platforms, it is not needed.
+@end itemize
diff --git a/gnulib/doc/posix-functions/shmctl.texi b/gnulib/doc/posix-functions/shmctl.texi
new file mode 100644
index 00000000..b7804dc1
--- /dev/null
+++ b/gnulib/doc/posix-functions/shmctl.texi
@@ -0,0 +1,18 @@
+@node shmctl
+@section @code{shmctl}
+@findex shmctl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/shmctl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/shmdt.texi b/gnulib/doc/posix-functions/shmdt.texi
new file mode 100644
index 00000000..07c4fd1d
--- /dev/null
+++ b/gnulib/doc/posix-functions/shmdt.texi
@@ -0,0 +1,18 @@
+@node shmdt
+@section @code{shmdt}
+@findex shmdt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/shmdt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/shmget.texi b/gnulib/doc/posix-functions/shmget.texi
new file mode 100644
index 00000000..f67f43f5
--- /dev/null
+++ b/gnulib/doc/posix-functions/shmget.texi
@@ -0,0 +1,21 @@
+@node shmget
+@section @code{shmget}
+@findex shmget
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/shmget.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+On many platforms (not Linux), SHMMAX is so small that it is unusable for
+reasonable applications, and/or @code{shmget} requires superuser privileges.
+@end itemize
diff --git a/gnulib/doc/posix-functions/shutdown.texi b/gnulib/doc/posix-functions/shutdown.texi
new file mode 100644
index 00000000..9012bb10
--- /dev/null
+++ b/gnulib/doc/posix-functions/shutdown.texi
@@ -0,0 +1,19 @@
+@node shutdown
+@section @code{shutdown}
+@findex shutdown
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/shutdown.html}
+
+Gnulib module: shutdown
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), error codes for
+@code{shutdown} are not placed in @code{errno}, and
+@code{WSAGetLastError} must be used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigaction.texi b/gnulib/doc/posix-functions/sigaction.texi
new file mode 100644
index 00000000..48261bae
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigaction.texi
@@ -0,0 +1,58 @@
+@node sigaction
+@section @code{sigaction}
+@findex sigaction
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigaction.html}
+
+Gnulib module: sigaction
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+POSIX recommends that when specifying SA_RESETHAND, SA_NODEFER must
+also be specified.
+
+@item
+Support for SA_ONSTACK is missing on some platforms:
+mingw, cygwin.
+
+@item
+Support for SA_SIGINFO is missing on some platforms:
+mingw, Interix 3.5.
+
+@item
+Support for SIGCHLD, and thus for SA_NOCLDSTOP and SA_NOCLDWAIT, is
+missing on some platforms:
+mingw.
+
+@item
+Support for SA_RESTART is missing on some platforms:
+mingw.
+
+@item
+In spite of having SA_SIGACTION, struct sigaction lacks the
+sa_sigaction member on some platforms:
+Irix 5.3.
+
+@item
+The symbolic value @code{SIG_IGN} for the @code{SIGCHLD} signal is equivalent
+to a signal handler
+@smallexample
+void handle_child (int sigchld)
+@{
+ while (waitpid (-1, NULL, WNOHANG) > 0)
+ ;
+@}
+@end smallexample
+except that @code{SIG_IGN} for @code{SIGCHLD} has the effect that the children
+execution times are not accounted in the @code{times} function.
+On some platforms (BSD? SystemV? Linux?), you need to use the @code{sigaction}
+flag @code{SA_NOCLDWAIT} in order to obtain this behavior.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigaddset.texi b/gnulib/doc/posix-functions/sigaddset.texi
new file mode 100644
index 00000000..bc729df3
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigaddset.texi
@@ -0,0 +1,18 @@
+@node sigaddset
+@section @code{sigaddset}
+@findex sigaddset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigaddset.html}
+
+Gnulib module: sigprocmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigaltstack.texi b/gnulib/doc/posix-functions/sigaltstack.texi
new file mode 100644
index 00000000..2ad7995b
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigaltstack.texi
@@ -0,0 +1,26 @@
+@node sigaltstack
+@section @code{sigaltstack}
+@findex sigaltstack
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigaltstack.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Cygwin, mingw, Interix 3.5, BeOS.
+@item
+@code{sigaltstack} doesn't work on HP-UX 11/IA-64 and OpenBSD
+3.6/Sparc64.
+@item
+This function interprets the @code{ss_sp} member of @code{stack_t} as
+the upper bound instead of the lower bound of the alternate stack on
+some platforms:
+Irix 6.5
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigdelset.texi b/gnulib/doc/posix-functions/sigdelset.texi
new file mode 100644
index 00000000..a408788d
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigdelset.texi
@@ -0,0 +1,18 @@
+@node sigdelset
+@section @code{sigdelset}
+@findex sigdelset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigdelset.html}
+
+Gnulib module: sigprocmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigemptyset.texi b/gnulib/doc/posix-functions/sigemptyset.texi
new file mode 100644
index 00000000..aa9722bc
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigemptyset.texi
@@ -0,0 +1,18 @@
+@node sigemptyset
+@section @code{sigemptyset}
+@findex sigemptyset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html}
+
+Gnulib module: sigprocmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigfillset.texi b/gnulib/doc/posix-functions/sigfillset.texi
new file mode 100644
index 00000000..c3c0725c
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigfillset.texi
@@ -0,0 +1,18 @@
+@node sigfillset
+@section @code{sigfillset}
+@findex sigfillset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigfillset.html}
+
+Gnulib module: sigprocmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sighold.texi b/gnulib/doc/posix-functions/sighold.texi
new file mode 100644
index 00000000..dfab6d0c
--- /dev/null
+++ b/gnulib/doc/posix-functions/sighold.texi
@@ -0,0 +1,18 @@
+@node sighold
+@section @code{sighold}
+@findex sighold
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sighold.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigignore.texi b/gnulib/doc/posix-functions/sigignore.texi
new file mode 100644
index 00000000..581141c3
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigignore.texi
@@ -0,0 +1,18 @@
+@node sigignore
+@section @code{sigignore}
+@findex sigignore
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigignore.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, Cygwin 1.5.x, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/siginterrupt.texi b/gnulib/doc/posix-functions/siginterrupt.texi
new file mode 100644
index 00000000..cd021a35
--- /dev/null
+++ b/gnulib/doc/posix-functions/siginterrupt.texi
@@ -0,0 +1,21 @@
+@node siginterrupt
+@section @code{siginterrupt}
+@findex siginterrupt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/siginterrupt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Note: POSIX recommends using @code{sigaction} with SA_RESTART instead of
+@code{siginterrupt (sig, 0)}.
diff --git a/gnulib/doc/posix-functions/sigismember.texi b/gnulib/doc/posix-functions/sigismember.texi
new file mode 100644
index 00000000..a21a96fd
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigismember.texi
@@ -0,0 +1,18 @@
+@node sigismember
+@section @code{sigismember}
+@findex sigismember
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigismember.html}
+
+Gnulib module: sigprocmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/siglongjmp.texi b/gnulib/doc/posix-functions/siglongjmp.texi
new file mode 100644
index 00000000..1bf42c08
--- /dev/null
+++ b/gnulib/doc/posix-functions/siglongjmp.texi
@@ -0,0 +1,22 @@
+@node siglongjmp
+@section @code{siglongjmp}
+@findex siglongjmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/siglongjmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+
+@item
+This is only provided as a macro on some platforms:
+Cygwin.
+@end itemize
diff --git a/gnulib/doc/posix-functions/signal.texi b/gnulib/doc/posix-functions/signal.texi
new file mode 100644
index 00000000..4c3ba6ca
--- /dev/null
+++ b/gnulib/doc/posix-functions/signal.texi
@@ -0,0 +1,25 @@
+@node signal
+@section @code{signal}
+@findex signal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/signal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On System V platforms, when the signal is triggered, the kernel uninstalls the
+handler (i.e.@: resets the signal's action to SIG_DFL) before invoking the
+handler. This opens the door to race conditions: undesired things happen
+if the signal is triggered twice and the signal handler was not quick enough
+reinstalling itself as a handler. On BSD platforms and glibc platforms, on the
+other hand, when the signal is triggered, the kernel blocks the signal
+before invoking the handler. This is saner, but POSIX still allows either
+behavior. To avoid this problem, use @code{sigaction} instead of
+@code{signal}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/signbit.texi b/gnulib/doc/posix-functions/signbit.texi
new file mode 100644
index 00000000..f80651c8
--- /dev/null
+++ b/gnulib/doc/posix-functions/signbit.texi
@@ -0,0 +1,18 @@
+@node signbit
+@section @code{signbit}
+@findex signbit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/signbit.html}
+
+Gnulib module: signbit
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 10, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/signgam.texi b/gnulib/doc/posix-functions/signgam.texi
new file mode 100644
index 00000000..1e3531ff
--- /dev/null
+++ b/gnulib/doc/posix-functions/signgam.texi
@@ -0,0 +1,18 @@
+@node signgam
+@section @code{signgam}
+@findex signgam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/signgam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+MacOS X 10.3, AIX 5.1, IRIX 6.5, OSF/1 5.1, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigpause.texi b/gnulib/doc/posix-functions/sigpause.texi
new file mode 100644
index 00000000..fcc1bf72
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigpause.texi
@@ -0,0 +1,18 @@
+@node sigpause
+@section @code{sigpause}
+@findex sigpause
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigpause.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigpending.texi b/gnulib/doc/posix-functions/sigpending.texi
new file mode 100644
index 00000000..c4acf67c
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigpending.texi
@@ -0,0 +1,18 @@
+@node sigpending
+@section @code{sigpending}
+@findex sigpending
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigpending.html}
+
+Gnulib module: sigprocmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigprocmask.texi b/gnulib/doc/posix-functions/sigprocmask.texi
new file mode 100644
index 00000000..ec9cab15
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigprocmask.texi
@@ -0,0 +1,18 @@
+@node sigprocmask
+@section @code{sigprocmask}
+@findex sigprocmask
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html}
+
+Gnulib module: sigprocmask
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigqueue.texi b/gnulib/doc/posix-functions/sigqueue.texi
new file mode 100644
index 00000000..b6d72581
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigqueue.texi
@@ -0,0 +1,18 @@
+@node sigqueue
+@section @code{sigqueue}
+@findex sigqueue
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigqueue.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigrelse.texi b/gnulib/doc/posix-functions/sigrelse.texi
new file mode 100644
index 00000000..7a0cdb71
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigrelse.texi
@@ -0,0 +1,18 @@
+@node sigrelse
+@section @code{sigrelse}
+@findex sigrelse
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigrelse.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigset.texi b/gnulib/doc/posix-functions/sigset.texi
new file mode 100644
index 00000000..a07aab61
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigset.texi
@@ -0,0 +1,18 @@
+@node sigset
+@section @code{sigset}
+@findex sigset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigset.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, Cygwin 1.5.x, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigsetjmp.texi b/gnulib/doc/posix-functions/sigsetjmp.texi
new file mode 100644
index 00000000..336587b0
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigsetjmp.texi
@@ -0,0 +1,18 @@
+@node sigsetjmp
+@section @code{sigsetjmp}
+@findex sigsetjmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigsetjmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigsuspend.texi b/gnulib/doc/posix-functions/sigsuspend.texi
new file mode 100644
index 00000000..f14e9fae
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigsuspend.texi
@@ -0,0 +1,18 @@
+@node sigsuspend
+@section @code{sigsuspend}
+@findex sigsuspend
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigsuspend.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigtimedwait.texi b/gnulib/doc/posix-functions/sigtimedwait.texi
new file mode 100644
index 00000000..6381ad9c
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigtimedwait.texi
@@ -0,0 +1,21 @@
+@node sigtimedwait
+@section @code{sigtimedwait}
+@findex sigtimedwait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigtimedwait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+Linux implements the meaning of NULL timeout by doing what @code{sigwaitinfo}
+does; other platforms may not do the same.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigwait.texi b/gnulib/doc/posix-functions/sigwait.texi
new file mode 100644
index 00000000..65ccfff8
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigwait.texi
@@ -0,0 +1,23 @@
+@node sigwait
+@section @code{sigwait}
+@findex sigwait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigwait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+On Linux/glibc platforms before the advent of NPTL, signals could only be
+sent to one particular thread. In POSIX, signals are sent to the entire
+process and executed by any thread of the process that happens to have the
+particular signal currently unblocked.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sigwaitinfo.texi b/gnulib/doc/posix-functions/sigwaitinfo.texi
new file mode 100644
index 00000000..29d49b91
--- /dev/null
+++ b/gnulib/doc/posix-functions/sigwaitinfo.texi
@@ -0,0 +1,18 @@
+@node sigwaitinfo
+@section @code{sigwaitinfo}
+@findex sigwaitinfo
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sigwaitinfo.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sin.texi b/gnulib/doc/posix-functions/sin.texi
new file mode 100644
index 00000000..28071ccf
--- /dev/null
+++ b/gnulib/doc/posix-functions/sin.texi
@@ -0,0 +1,15 @@
+@node sin
+@section @code{sin}
+@findex sin
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sin.html}
+
+Gnulib module: sin
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sinf.texi b/gnulib/doc/posix-functions/sinf.texi
new file mode 100644
index 00000000..fa38c176
--- /dev/null
+++ b/gnulib/doc/posix-functions/sinf.texi
@@ -0,0 +1,18 @@
+@node sinf
+@section @code{sinf}
+@findex sinf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sinf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sinh.texi b/gnulib/doc/posix-functions/sinh.texi
new file mode 100644
index 00000000..09fa8f9e
--- /dev/null
+++ b/gnulib/doc/posix-functions/sinh.texi
@@ -0,0 +1,15 @@
+@node sinh
+@section @code{sinh}
+@findex sinh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sinh.html}
+
+Gnulib module: sinh
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sinhf.texi b/gnulib/doc/posix-functions/sinhf.texi
new file mode 100644
index 00000000..20faaa4c
--- /dev/null
+++ b/gnulib/doc/posix-functions/sinhf.texi
@@ -0,0 +1,18 @@
+@node sinhf
+@section @code{sinhf}
+@findex sinhf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sinhf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sinhl.texi b/gnulib/doc/posix-functions/sinhl.texi
new file mode 100644
index 00000000..101f3580
--- /dev/null
+++ b/gnulib/doc/posix-functions/sinhl.texi
@@ -0,0 +1,18 @@
+@node sinhl
+@section @code{sinhl}
+@findex sinhl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sinhl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sinl.texi b/gnulib/doc/posix-functions/sinl.texi
new file mode 100644
index 00000000..30751c21
--- /dev/null
+++ b/gnulib/doc/posix-functions/sinl.texi
@@ -0,0 +1,21 @@
+@node sinl
+@section @code{sinl}
+@findex sinl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sinl.html}
+
+Gnulib module: sinl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sleep.texi b/gnulib/doc/posix-functions/sleep.texi
new file mode 100644
index 00000000..6df86938
--- /dev/null
+++ b/gnulib/doc/posix-functions/sleep.texi
@@ -0,0 +1,29 @@
+@node sleep
+@section @code{sleep}
+@findex sleep
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sleep.html}
+
+Gnulib module: sleep
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw (2005 or newer).
+@item
+This function takes milliseconds as argument and returns @code{void} on some
+platforms:
+mingw (2005 and older).
+@item
+This function cannot sleep longer than 49.7 days on some platforms:
+Cygwin 1.5.x.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+According to POSIX, the @code{sleep} function may interfere with the program's
+use of the @code{SIGALRM} signal. On Linux, it doesn't; on other platforms,
+it may.
+@end itemize
diff --git a/gnulib/doc/posix-functions/snprintf.texi b/gnulib/doc/posix-functions/snprintf.texi
new file mode 100644
index 00000000..00558430
--- /dev/null
+++ b/gnulib/doc/posix-functions/snprintf.texi
@@ -0,0 +1,92 @@
+@node snprintf
+@section @code{snprintf}
+@findex snprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/snprintf.html}
+
+Gnulib module: snprintf or snprintf-posix
+
+Portability problems fixed by either Gnulib module @code{snprintf} or @code{snprintf-posix}:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, OSF/1 4.0, Solaris 2.5.1.
+@item
+This function overwrites memory even when a size argument of 1 is passed on some
+platforms:
+Linux libc5.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{snprintf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@item
+This function does not truncate the result as specified in C99 on some platforms:
+mingw.
+@item
+This function does not return a byte count as specified in C99 on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw.
+@item
+This function does not fully support the @samp{n} directive on some platforms:
+HP-UX 11, mingw.
+@item
+This function overwrites memory when a size = 1 argument is passed on some
+platforms:
+BeOS.
+@item
+This function overwrites memory even when a zero size argument is passed on some
+platforms:
+OSF/1 5.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sockatmark.texi b/gnulib/doc/posix-functions/sockatmark.texi
new file mode 100644
index 00000000..0596834b
--- /dev/null
+++ b/gnulib/doc/posix-functions/sockatmark.texi
@@ -0,0 +1,18 @@
+@node sockatmark
+@section @code{sockatmark}
+@findex sockatmark
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sockatmark.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/socket.texi b/gnulib/doc/posix-functions/socket.texi
new file mode 100644
index 00000000..32aae91b
--- /dev/null
+++ b/gnulib/doc/posix-functions/socket.texi
@@ -0,0 +1,28 @@
+@node socket
+@section @code{socket}
+@findex socket
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html}
+
+Gnulib module: socket
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), the descriptors returned by
+the @code{socket} function can not be used in calls to @code{read},
+@code{write}, and @code{close}; you have to use @code{recv}, @code{send},
+@code{closesocket} in these cases instead.
+@item
+On Windows platforms (excluding Cygwin), error codes for @code{socket}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On BeOS, the descriptors returned by the @code{socket} function can not be used
+in calls to @code{read}, @code{write}, and @code{close}; you have to use
+@code{recv}, @code{send}, @code{closesocket} in these cases instead.
+@end itemize
diff --git a/gnulib/doc/posix-functions/socketpair.texi b/gnulib/doc/posix-functions/socketpair.texi
new file mode 100644
index 00000000..d58871d6
--- /dev/null
+++ b/gnulib/doc/posix-functions/socketpair.texi
@@ -0,0 +1,18 @@
+@node socketpair
+@section @code{socketpair}
+@findex socketpair
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/socketpair.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sprintf.texi b/gnulib/doc/posix-functions/sprintf.texi
new file mode 100644
index 00000000..39538242
--- /dev/null
+++ b/gnulib/doc/posix-functions/sprintf.texi
@@ -0,0 +1,64 @@
+@node sprintf
+@section @code{sprintf}
+@findex sprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sprintf.html}
+
+Gnulib module: sprintf-posix
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/sqrt.texi b/gnulib/doc/posix-functions/sqrt.texi
new file mode 100644
index 00000000..70ac1c50
--- /dev/null
+++ b/gnulib/doc/posix-functions/sqrt.texi
@@ -0,0 +1,18 @@
+@node sqrt
+@section @code{sqrt}
+@findex sqrt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sqrt.html}
+
+Gnulib module: sqrt
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sqrtf.texi b/gnulib/doc/posix-functions/sqrtf.texi
new file mode 100644
index 00000000..fa50c77f
--- /dev/null
+++ b/gnulib/doc/posix-functions/sqrtf.texi
@@ -0,0 +1,18 @@
+@node sqrtf
+@section @code{sqrtf}
+@findex sqrtf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sqrtf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sqrtl.texi b/gnulib/doc/posix-functions/sqrtl.texi
new file mode 100644
index 00000000..c91fa082
--- /dev/null
+++ b/gnulib/doc/posix-functions/sqrtl.texi
@@ -0,0 +1,21 @@
+@node sqrtl
+@section @code{sqrtl}
+@findex sqrtl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sqrtl.html}
+
+Gnulib module: sqrtl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/srand.texi b/gnulib/doc/posix-functions/srand.texi
new file mode 100644
index 00000000..8dbc0e60
--- /dev/null
+++ b/gnulib/doc/posix-functions/srand.texi
@@ -0,0 +1,15 @@
+@node srand
+@section @code{srand}
+@findex srand
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/srand.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/srand48.texi b/gnulib/doc/posix-functions/srand48.texi
new file mode 100644
index 00000000..551ced8b
--- /dev/null
+++ b/gnulib/doc/posix-functions/srand48.texi
@@ -0,0 +1,18 @@
+@node srand48
+@section @code{srand48}
+@findex srand48
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/srand48.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/srandom.texi b/gnulib/doc/posix-functions/srandom.texi
new file mode 100644
index 00000000..7eda461e
--- /dev/null
+++ b/gnulib/doc/posix-functions/srandom.texi
@@ -0,0 +1,18 @@
+@node srandom
+@section @code{srandom}
+@findex srandom
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/srandom.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 2.4, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sscanf.texi b/gnulib/doc/posix-functions/sscanf.texi
new file mode 100644
index 00000000..49ec1b99
--- /dev/null
+++ b/gnulib/doc/posix-functions/sscanf.texi
@@ -0,0 +1,21 @@
+@node sscanf
+@section @code{sscanf}
+@findex sscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+On Windows, this function doesn't support the @code{hh}, @code{ll}, @code{j},
+@code{t}, @code{z} size specifiers.
+@end itemize
diff --git a/gnulib/doc/posix-functions/stat.texi b/gnulib/doc/posix-functions/stat.texi
new file mode 100644
index 00000000..ef09740e
--- /dev/null
+++ b/gnulib/doc/posix-functions/stat.texi
@@ -0,0 +1,38 @@
+@node stat
+@section @code{stat}
+@findex stat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/stat.html}
+
+Gnulib module: stat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On some platforms, @code{stat("link-to-file/",buf)} succeeds instead
+of failing with @code{ENOTDIR}.
+FreeBSD 7.2, Solaris 9.
+@item
+On some platforms, @code{stat(".",buf)} and @code{stat("./",buf)} give
+different results:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On platforms where @code{off_t} is a 32-bit type, @code{stat} may not correctly
+report the size of files or block devices larger than 2 GB. The fix is to
+use the @code{AC_SYS_LARGEFILE} macro.
+@item
+Cygwin's @code{stat} function sometimes sets @code{errno} to @code{EACCES} when
+@code{ENOENT} would be more appropriate.
+@item
+On Windows platforms (excluding Cygwin), @code{st_ino} is always 0.
+@item
+Because of the definition of @code{struct stat}, it is not possible to
+portably replace @code{stat} via an object-like macro. Therefore,
+expressions such as @code{(islnk ? lstat : stat) (name, buf)} are not
+portable, and should instead be written @code{islnk ? lstat (name,
+buf) : stat (name, buf)}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/statvfs.texi b/gnulib/doc/posix-functions/statvfs.texi
new file mode 100644
index 00000000..f32383cd
--- /dev/null
+++ b/gnulib/doc/posix-functions/statvfs.texi
@@ -0,0 +1,18 @@
+@node statvfs
+@section @code{statvfs}
+@findex statvfs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/statvfs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/stderr.texi b/gnulib/doc/posix-functions/stderr.texi
new file mode 100644
index 00000000..7b8c17ff
--- /dev/null
+++ b/gnulib/doc/posix-functions/stderr.texi
@@ -0,0 +1,27 @@
+@node stderr
+@section @code{stderr}
+@findex stderr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/stderr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+stderr is created in 32-bit mode instead of 64-bit mode: Cygwin 1.5.x.
+One workaround is to use freopen(NULL, ``r+'', stderr) on Cygwin 1.5.21
+or newer. Another is to use the gnulib ftello module and do
+ftello(stderr).
+@item
+POSIX states that a setuid application can guarantee that fd 2 is
+open, but some systems guarantee this even for non-setuid programs.
+If an application is executed with fd 2 closed, use of @code{stderr}
+can affect an unrelated file that happened to be assigned to fd 2.
+The gnulib *-safer modules may be used to guarantee that fd 2 stays
+reserved for @code{stderr}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/stdin.texi b/gnulib/doc/posix-functions/stdin.texi
new file mode 100644
index 00000000..02835420
--- /dev/null
+++ b/gnulib/doc/posix-functions/stdin.texi
@@ -0,0 +1,27 @@
+@node stdin
+@section @code{stdin}
+@findex stdin
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/stdin.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+stdin is created in 32-bit mode instead of 64-bit mode: Cygwin 1.5.x.
+One workaround is to use freopen(NULL, ``r'', stdin) on Cygwin 1.5.21
+or newer. Another is to use the gnulib ftello module and do
+ftello(stdin).
+@item
+POSIX states that a setuid application can guarantee that fd 0 is
+open, but some systems guarantee this even for non-setuid programs.
+If an application is executed with fd 0 closed, use of @code{stdin}
+can affect an unrelated file that happened to be assigned to fd 0.
+The gnulib *-safer modules may be used to guarantee that fd 0 stays
+reserved for @code{stdin}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/stdout.texi b/gnulib/doc/posix-functions/stdout.texi
new file mode 100644
index 00000000..23a0e96f
--- /dev/null
+++ b/gnulib/doc/posix-functions/stdout.texi
@@ -0,0 +1,27 @@
+@node stdout
+@section @code{stdout}
+@findex stdout
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/stdout.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+stdout is created in 32-bit mode instead of 64-bit mode: Cygwin 1.5.x.
+One workaround is to use freopen(NULL, ``w'', stdout) on Cygwin 1.5.21
+or newer. Another is to use the gnulib ftello module and do
+ftello(stdout).
+@item
+POSIX states that a setuid application can guarantee that fd 1 is
+open, but some systems guarantee this even for non-setuid programs.
+If an application is executed with fd 1 closed, use of @code{stdout}
+can affect an unrelated file that happened to be assigned to fd 1.
+The gnulib *-safer modules may be used to guarantee that fd 1 stays
+reserved for @code{stdout}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/stpcpy.texi b/gnulib/doc/posix-functions/stpcpy.texi
new file mode 100644
index 00000000..a8c10503
--- /dev/null
+++ b/gnulib/doc/posix-functions/stpcpy.texi
@@ -0,0 +1,19 @@
+@node stpcpy
+@section @code{stpcpy}
+@findex stpcpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/stpcpy.html}
+
+Gnulib module: stpcpy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/stpncpy.texi b/gnulib/doc/posix-functions/stpncpy.texi
new file mode 100644
index 00000000..0a34af7c
--- /dev/null
+++ b/gnulib/doc/posix-functions/stpncpy.texi
@@ -0,0 +1,22 @@
+@node stpncpy
+@section @code{stpncpy}
+@findex stpncpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/stpncpy.html}
+
+Gnulib module: stpncpy
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@item
+This function has an incompatible return value on some platforms:
+AIX 5.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strcasecmp.texi b/gnulib/doc/posix-functions/strcasecmp.texi
new file mode 100644
index 00000000..342112ca
--- /dev/null
+++ b/gnulib/doc/posix-functions/strcasecmp.texi
@@ -0,0 +1,21 @@
+@node strcasecmp
+@section @code{strcasecmp}
+@findex strcasecmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html}
+
+Gnulib module: strcase
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in multibyte locales.
+Gnulib provides an alternative function @code{mbscasecmp} that does a case
+insensitive comparison of character strings and that works in all locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strcasecmp_l.texi b/gnulib/doc/posix-functions/strcasecmp_l.texi
new file mode 100644
index 00000000..5efcfeff
--- /dev/null
+++ b/gnulib/doc/posix-functions/strcasecmp_l.texi
@@ -0,0 +1,18 @@
+@node strcasecmp_l
+@section @code{strcasecmp_l}
+@findex strcasecmp_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strcasecmp_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strcat.texi b/gnulib/doc/posix-functions/strcat.texi
new file mode 100644
index 00000000..e66e395b
--- /dev/null
+++ b/gnulib/doc/posix-functions/strcat.texi
@@ -0,0 +1,15 @@
+@node strcat
+@section @code{strcat}
+@findex strcat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strcat.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strchr.texi b/gnulib/doc/posix-functions/strchr.texi
new file mode 100644
index 00000000..dcdbdfa9
--- /dev/null
+++ b/gnulib/doc/posix-functions/strchr.texi
@@ -0,0 +1,19 @@
+@node strchr
+@section @code{strchr}
+@findex strchr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strchr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in some multibyte
+locales. Gnulib provides an alternative function @code{mbschr} that works on
+character strings in all locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strcmp.texi b/gnulib/doc/posix-functions/strcmp.texi
new file mode 100644
index 00000000..0a38d41c
--- /dev/null
+++ b/gnulib/doc/posix-functions/strcmp.texi
@@ -0,0 +1,15 @@
+@node strcmp
+@section @code{strcmp}
+@findex strcmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strcmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strcoll.texi b/gnulib/doc/posix-functions/strcoll.texi
new file mode 100644
index 00000000..0e7520a9
--- /dev/null
+++ b/gnulib/doc/posix-functions/strcoll.texi
@@ -0,0 +1,15 @@
+@node strcoll
+@section @code{strcoll}
+@findex strcoll
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strcoll.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strcoll_l.texi b/gnulib/doc/posix-functions/strcoll_l.texi
new file mode 100644
index 00000000..082e7438
--- /dev/null
+++ b/gnulib/doc/posix-functions/strcoll_l.texi
@@ -0,0 +1,18 @@
+@node strcoll_l
+@section @code{strcoll_l}
+@findex strcoll_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strcoll_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strcpy.texi b/gnulib/doc/posix-functions/strcpy.texi
new file mode 100644
index 00000000..9b072553
--- /dev/null
+++ b/gnulib/doc/posix-functions/strcpy.texi
@@ -0,0 +1,15 @@
+@node strcpy
+@section @code{strcpy}
+@findex strcpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strcpy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strcspn.texi b/gnulib/doc/posix-functions/strcspn.texi
new file mode 100644
index 00000000..dd6c51d5
--- /dev/null
+++ b/gnulib/doc/posix-functions/strcspn.texi
@@ -0,0 +1,21 @@
+@node strcspn
+@section @code{strcspn}
+@findex strcspn
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strcspn.html}
+
+Gnulib module: strcspn
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in multibyte locales.
+Gnulib provides an alternative function @code{mbscspn} that works on character
+strings in all locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strdup.texi b/gnulib/doc/posix-functions/strdup.texi
new file mode 100644
index 00000000..dba13dfb
--- /dev/null
+++ b/gnulib/doc/posix-functions/strdup.texi
@@ -0,0 +1,27 @@
+@node strdup
+@section @code{strdup}
+@findex strdup
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strdup.html}
+
+Gnulib module: strdup or strdup-posix
+
+Portability problems fixed by either Gnulib module @code{strdup} or @code{strdup-posix}:
+@itemize
+@item
+This function is missing on some old platforms.
+@item
+This function has no prototype in @code{<string.h>} on some old platforms.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{strdup-posix}:
+@itemize
+@item
+Upon failure, the function does not set @code{errno} to @code{ENOMEM} on
+some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strerror.texi b/gnulib/doc/posix-functions/strerror.texi
new file mode 100644
index 00000000..d2e5d5c3
--- /dev/null
+++ b/gnulib/doc/posix-functions/strerror.texi
@@ -0,0 +1,25 @@
+@node strerror
+@section @code{strerror}
+@findex strerror
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strerror.html}
+
+Gnulib module: strerror
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@item
+This function does not support the error values that are specified by POSIX
+but not defined by the system, on some platforms:
+OpenBSD 4.0, OSF/1 5.1, Cygwin 1.5.x, mingw.
+@item
+This function fails to return a string for out-of-range integers on
+some platforms:
+Solaris 8.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strerror_l.texi b/gnulib/doc/posix-functions/strerror_l.texi
new file mode 100644
index 00000000..92372120
--- /dev/null
+++ b/gnulib/doc/posix-functions/strerror_l.texi
@@ -0,0 +1,18 @@
+@node strerror_l
+@section @code{strerror_l}
+@findex strerror_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strerror_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strerror_r.texi b/gnulib/doc/posix-functions/strerror_r.texi
new file mode 100644
index 00000000..81076717
--- /dev/null
+++ b/gnulib/doc/posix-functions/strerror_r.texi
@@ -0,0 +1,27 @@
+@node strerror_r
+@section @code{strerror_r}
+@findex strerror_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strerror_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, HP-UX 11, IRIX 6.5, Solaris 9, mingw.
+@item
+glibc has an incompatible version of this function. The POSIX compliant code
+@smallexample
+char *s = (strerror_r (err, buf, buflen) == 0 ? buf : NULL);
+@end smallexample
+is essentially equivalent to this code using the glibc function:
+@smallexample
+char *s = strerror_r (err, buf, buflen);
+@end smallexample
+@end itemize
diff --git a/gnulib/doc/posix-functions/strfmon.texi b/gnulib/doc/posix-functions/strfmon.texi
new file mode 100644
index 00000000..69dcfecc
--- /dev/null
+++ b/gnulib/doc/posix-functions/strfmon.texi
@@ -0,0 +1,18 @@
+@node strfmon
+@section @code{strfmon}
+@findex strfmon
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strfmon.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, IRIX 5.3, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strfmon_l.texi b/gnulib/doc/posix-functions/strfmon_l.texi
new file mode 100644
index 00000000..f4a2ffe0
--- /dev/null
+++ b/gnulib/doc/posix-functions/strfmon_l.texi
@@ -0,0 +1,18 @@
+@node strfmon_l
+@section @code{strfmon_l}
+@findex strfmon_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strfmon_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strftime.texi b/gnulib/doc/posix-functions/strftime.texi
new file mode 100644
index 00000000..54c4352f
--- /dev/null
+++ b/gnulib/doc/posix-functions/strftime.texi
@@ -0,0 +1,22 @@
+@node strftime
+@section @code{strftime}
+@findex strftime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strftime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The Windows C runtime library (which is used by MinGW) does not
+support the %e specifier (and possibly the other more recent SUS
+specifiers too, i.e., %C, %D, %h, %n, %r, %R, %t, and %T).
+@end itemize
+
+Extension: Gnulib offers a module @samp{strftime} that provides an
+@code{nstrftime} function with various GNU extensions.
diff --git a/gnulib/doc/posix-functions/strftime_l.texi b/gnulib/doc/posix-functions/strftime_l.texi
new file mode 100644
index 00000000..0769de9d
--- /dev/null
+++ b/gnulib/doc/posix-functions/strftime_l.texi
@@ -0,0 +1,18 @@
+@node strftime_l
+@section @code{strftime_l}
+@findex strftime_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strftime_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strlen.texi b/gnulib/doc/posix-functions/strlen.texi
new file mode 100644
index 00000000..ed6c1877
--- /dev/null
+++ b/gnulib/doc/posix-functions/strlen.texi
@@ -0,0 +1,15 @@
+@node strlen
+@section @code{strlen}
+@findex strlen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strlen.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strncasecmp.texi b/gnulib/doc/posix-functions/strncasecmp.texi
new file mode 100644
index 00000000..b46ff243
--- /dev/null
+++ b/gnulib/doc/posix-functions/strncasecmp.texi
@@ -0,0 +1,22 @@
+@node strncasecmp
+@section @code{strncasecmp}
+@findex strncasecmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strncasecmp.html}
+
+Gnulib module: strcase
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in multibyte locales.
+Gnulib provides alternative functions @code{mbsncasecmp} and @code{mbspcasecmp}
+that do a case insensitive comparison of character strings and that work in all
+locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strncasecmp_l.texi b/gnulib/doc/posix-functions/strncasecmp_l.texi
new file mode 100644
index 00000000..06ae264c
--- /dev/null
+++ b/gnulib/doc/posix-functions/strncasecmp_l.texi
@@ -0,0 +1,18 @@
+@node strncasecmp_l
+@section @code{strncasecmp_l}
+@findex strncasecmp_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strncasecmp_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strncat.texi b/gnulib/doc/posix-functions/strncat.texi
new file mode 100644
index 00000000..29375dad
--- /dev/null
+++ b/gnulib/doc/posix-functions/strncat.texi
@@ -0,0 +1,15 @@
+@node strncat
+@section @code{strncat}
+@findex strncat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strncat.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strncmp.texi b/gnulib/doc/posix-functions/strncmp.texi
new file mode 100644
index 00000000..e6ed0fcd
--- /dev/null
+++ b/gnulib/doc/posix-functions/strncmp.texi
@@ -0,0 +1,15 @@
+@node strncmp
+@section @code{strncmp}
+@findex strncmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strncmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strncpy.texi b/gnulib/doc/posix-functions/strncpy.texi
new file mode 100644
index 00000000..f99f9216
--- /dev/null
+++ b/gnulib/doc/posix-functions/strncpy.texi
@@ -0,0 +1,15 @@
+@node strncpy
+@section @code{strncpy}
+@findex strncpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strncpy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strndup.texi b/gnulib/doc/posix-functions/strndup.texi
new file mode 100644
index 00000000..e243d2de
--- /dev/null
+++ b/gnulib/doc/posix-functions/strndup.texi
@@ -0,0 +1,21 @@
+@node strndup
+@section @code{strndup}
+@findex strndup
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strndup.html}
+
+Gnulib module: strndup
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5, BeOS.
+@item
+This function does not NUL-terminate the result on some platforms:
+AIX 5.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strnlen.texi b/gnulib/doc/posix-functions/strnlen.texi
new file mode 100644
index 00000000..abed883b
--- /dev/null
+++ b/gnulib/doc/posix-functions/strnlen.texi
@@ -0,0 +1,21 @@
+@node strnlen
+@section @code{strnlen}
+@findex strnlen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strnlen.html}
+
+Gnulib module: strnlen
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw, Interix 3.5.
+@item
+This function is buggy on some platforms:
+AIX 4.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strpbrk.texi b/gnulib/doc/posix-functions/strpbrk.texi
new file mode 100644
index 00000000..60f7a061
--- /dev/null
+++ b/gnulib/doc/posix-functions/strpbrk.texi
@@ -0,0 +1,21 @@
+@node strpbrk
+@section @code{strpbrk}
+@findex strpbrk
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strpbrk.html}
+
+Gnulib module: strpbrk
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in multibyte locales.
+Gnulib provides an alternative function @code{mbspbrk} that works on character
+strings in all locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strptime.texi b/gnulib/doc/posix-functions/strptime.texi
new file mode 100644
index 00000000..f1464cc7
--- /dev/null
+++ b/gnulib/doc/posix-functions/strptime.texi
@@ -0,0 +1,18 @@
+@node strptime
+@section @code{strptime}
+@findex strptime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strptime.html}
+
+Gnulib module: strptime
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strrchr.texi b/gnulib/doc/posix-functions/strrchr.texi
new file mode 100644
index 00000000..c80c0506
--- /dev/null
+++ b/gnulib/doc/posix-functions/strrchr.texi
@@ -0,0 +1,19 @@
+@node strrchr
+@section @code{strrchr}
+@findex strrchr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strrchr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in some multibyte
+locales. Gnulib provides an alternative function @code{mbsrchr} that works
+on character strings in all locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strsignal.texi b/gnulib/doc/posix-functions/strsignal.texi
new file mode 100644
index 00000000..d2aabb1c
--- /dev/null
+++ b/gnulib/doc/posix-functions/strsignal.texi
@@ -0,0 +1,26 @@
+@node strsignal
+@section @code{strsignal}
+@findex strsignal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strsignal.html}
+
+Gnulib module: strsignal
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw.
+
+@item
+This function does not return a string for out-of-range numbers on
+some platforms:
+Solaris, AIX 5.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+This function returns @code{const char *} instead of @code{char *} on
+some platforms:
+cygwin 1.5.25.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strspn.texi b/gnulib/doc/posix-functions/strspn.texi
new file mode 100644
index 00000000..0611a4fa
--- /dev/null
+++ b/gnulib/doc/posix-functions/strspn.texi
@@ -0,0 +1,19 @@
+@node strspn
+@section @code{strspn}
+@findex strspn
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strspn.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in multibyte locales.
+Gnulib provides an alternative function @code{mbsspn} that works on character
+strings in all locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strstr.texi b/gnulib/doc/posix-functions/strstr.texi
new file mode 100644
index 00000000..f92ba1b6
--- /dev/null
+++ b/gnulib/doc/posix-functions/strstr.texi
@@ -0,0 +1,32 @@
+@node strstr
+@section @code{strstr}
+@findex strstr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strstr.html}
+
+Gnulib module: strstr or strstr-simple
+
+Portability problems fixed by either Gnulib module @code{strstr-simple}
+or @code{strstr}:
+@itemize
+@item
+This function can trigger memchr bugs on some platforms:
+glibc 2.10.
+@end itemize
+
+Portability problems fixed by Gnulib @code{strstr}:
+@itemize
+@item
+This function has quadratic instead of linear worst-case complexity on some
+platforms:
+glibc 2.8, MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in most multibyte
+locales. Gnulib provides an alternative function @code{mbsstr} that works
+on character strings in all locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtod.texi b/gnulib/doc/posix-functions/strtod.texi
new file mode 100644
index 00000000..6a488768
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtod.texi
@@ -0,0 +1,83 @@
+@node strtod
+@section @code{strtod}
+@findex strtod
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtod.html}
+
+Gnulib module: strtod
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+
+@item
+This function mis-parses strings with leading @samp{+} on some old platforms:
+Old versions of Linux.
+
+@item
+This function returns a wrong end pointer on some old platforms.
+
+@item
+This function consumes whitespace even when there is nothing that should
+be parsed on some platforms:
+IRIX 6.5, OSF/1 5.1.
+
+@item
+This function allows whitespace between @samp{e} and the exponent on
+some platforms:
+HP-UX 11.11, IRIX 6.5, OSF/1 4.0.
+
+@item
+This function returns the wrong end pointer for @samp{-0x} on some
+platforms:
+glibc 2.4, MacOS X 10.3, FreeBSD 6.2, Cygwin < 1.5.25-11.
+
+@item
+This function returns +0.0 (not -0.0) for @samp{-0} on some platforms:
+IRIX 6.5, OSF/1 4.0.
+
+@item
+This function fails to parse Infinities and plain NaNs on some platforms:
+OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw.
+
+@item
+This function fails to parse @samp{NaN()} on some platforms:
+glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Cygwin < 1.5.25-11, mingw.
+
+@item
+This function fails to parse @samp{NaN(@var{n-char-sequence})} on some
+platforms:
+OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw.
+
+@item
+This function parses @samp{NaN(@var{n-char-sequence})}, but returns
+the wrong end pointer on some platforms:
+glibc-2.4, AIX 5.1.
+
+@item
+This function fails to parse C99 hexadecimal floating point on some
+platforms:
+NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function returns +0.0 (not -0.0) for negative underflow on some
+platforms:
+glibc 2.7, Cygwin 1.5.x, mingw.
+
+@item
+This function cannot distinguish between ``nan'' and ``-nan'' on some
+platforms:
+glibc 2.7, IRIX 6.5, OSF/1 5.1, mingw.
+
+@item
+This function fails to correctly parse very long strings on some
+platforms:
+MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Cygwin, mingw.
+
+@item
+The replacement function does not always return correctly rounded results.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtof.texi b/gnulib/doc/posix-functions/strtof.texi
new file mode 100644
index 00000000..b120b9e7
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtof.texi
@@ -0,0 +1,18 @@
+@node strtof
+@section @code{strtof}
+@findex strtof
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtof.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtoimax.texi b/gnulib/doc/posix-functions/strtoimax.texi
new file mode 100644
index 00000000..6715e627
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtoimax.texi
@@ -0,0 +1,18 @@
+@node strtoimax
+@section @code{strtoimax}
+@findex strtoimax
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtoimax.html}
+
+Gnulib module: strtoimax
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, AIX 4.3.2, IRIX 6.5, OSF/1 5.1, Solaris 9, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtok.texi b/gnulib/doc/posix-functions/strtok.texi
new file mode 100644
index 00000000..601cc523
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtok.texi
@@ -0,0 +1,15 @@
+@node strtok
+@section @code{strtok}
+@findex strtok
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtok.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtok_r.texi b/gnulib/doc/posix-functions/strtok_r.texi
new file mode 100644
index 00000000..2490572c
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtok_r.texi
@@ -0,0 +1,26 @@
+@node strtok_r
+@section @code{strtok_r}
+@findex strtok_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtok_r.html}
+
+Gnulib module: strtok_r
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+This function crashes when invoked from code compiled with optimization enabled
+on some platforms:
+glibc 2.7.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function cannot work correctly on character strings in multibyte locales.
+Gnulib provides an alternative function @code{mbstok_r} that works on character
+strings in all locales.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtol.texi b/gnulib/doc/posix-functions/strtol.texi
new file mode 100644
index 00000000..bf4e0170
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtol.texi
@@ -0,0 +1,17 @@
+@node strtol
+@section @code{strtol}
+@findex strtol
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtol.html}
+
+Gnulib module: strtol
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtold.texi b/gnulib/doc/posix-functions/strtold.texi
new file mode 100644
index 00000000..e5664e76
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtold.texi
@@ -0,0 +1,18 @@
+@node strtold
+@section @code{strtold}
+@findex strtold
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtold.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtoll.texi b/gnulib/doc/posix-functions/strtoll.texi
new file mode 100644
index 00000000..dec0d89d
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtoll.texi
@@ -0,0 +1,18 @@
+@node strtoll
+@section @code{strtoll}
+@findex strtoll
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtoll.html}
+
+Gnulib module: strtoll
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 5.1, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtoul.texi b/gnulib/doc/posix-functions/strtoul.texi
new file mode 100644
index 00000000..46342a09
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtoul.texi
@@ -0,0 +1,17 @@
+@node strtoul
+@section @code{strtoul}
+@findex strtoul
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtoul.html}
+
+Gnulib module: strtoul
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some old platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtoull.texi b/gnulib/doc/posix-functions/strtoull.texi
new file mode 100644
index 00000000..d5c7025b
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtoull.texi
@@ -0,0 +1,18 @@
+@node strtoull
+@section @code{strtoull}
+@findex strtoull
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtoull.html}
+
+Gnulib module: strtoull
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, OSF/1 5.1, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strtoumax.texi b/gnulib/doc/posix-functions/strtoumax.texi
new file mode 100644
index 00000000..adf0b21c
--- /dev/null
+++ b/gnulib/doc/posix-functions/strtoumax.texi
@@ -0,0 +1,18 @@
+@node strtoumax
+@section @code{strtoumax}
+@findex strtoumax
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strtoumax.html}
+
+Gnulib module: strtoumax
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 9, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strxfrm.texi b/gnulib/doc/posix-functions/strxfrm.texi
new file mode 100644
index 00000000..02586ee9
--- /dev/null
+++ b/gnulib/doc/posix-functions/strxfrm.texi
@@ -0,0 +1,15 @@
+@node strxfrm
+@section @code{strxfrm}
+@findex strxfrm
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strxfrm.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/strxfrm_l.texi b/gnulib/doc/posix-functions/strxfrm_l.texi
new file mode 100644
index 00000000..3fc6617d
--- /dev/null
+++ b/gnulib/doc/posix-functions/strxfrm_l.texi
@@ -0,0 +1,18 @@
+@node strxfrm_l
+@section @code{strxfrm_l}
+@findex strxfrm_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strxfrm_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/swab.texi b/gnulib/doc/posix-functions/swab.texi
new file mode 100644
index 00000000..034e639d
--- /dev/null
+++ b/gnulib/doc/posix-functions/swab.texi
@@ -0,0 +1,18 @@
+@node swab
+@section @code{swab}
+@findex swab
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/swab.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/swprintf.texi b/gnulib/doc/posix-functions/swprintf.texi
new file mode 100644
index 00000000..ffd4c93c
--- /dev/null
+++ b/gnulib/doc/posix-functions/swprintf.texi
@@ -0,0 +1,23 @@
+@node swprintf
+@section @code{swprintf}
+@findex swprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/swprintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@item
+On Windows, this function does not take a buffer size as second argument.
+@end itemize
diff --git a/gnulib/doc/posix-functions/swscanf.texi b/gnulib/doc/posix-functions/swscanf.texi
new file mode 100644
index 00000000..0a9a6295
--- /dev/null
+++ b/gnulib/doc/posix-functions/swscanf.texi
@@ -0,0 +1,21 @@
+@node swscanf
+@section @code{swscanf}
+@findex swscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/swscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/symlink.texi b/gnulib/doc/posix-functions/symlink.texi
new file mode 100644
index 00000000..b3d740f7
--- /dev/null
+++ b/gnulib/doc/posix-functions/symlink.texi
@@ -0,0 +1,25 @@
+@node symlink
+@section @code{symlink}
+@findex symlink
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/symlink.html}
+
+Gnulib module: symlink
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On some systems, @code{symlink(value,"name/")} mistakenly creates a
+symlink:
+FreeBSD 7.2, Solaris 9
+@item
+This function is missing on some platforms; however, the replacement
+always fails with @code{EPERM}:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some file systems do not support symbolic links.
+@end itemize
diff --git a/gnulib/doc/posix-functions/symlinkat.texi b/gnulib/doc/posix-functions/symlinkat.texi
new file mode 100644
index 00000000..32760a41
--- /dev/null
+++ b/gnulib/doc/posix-functions/symlinkat.texi
@@ -0,0 +1,28 @@
+@node symlinkat
+@section @code{symlinkat}
+@findex symlinkat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/symlinkat.html}
+
+Gnulib module: symlinkat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@item
+Some platforms declare this function in @code{stdio.h} instead of
+@code{unistd.h}:
+Cygwin 1.7.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function always fails with @samp{ENOSYS} on platforms that don't
+support symlinks:
+mingw
+@end itemize
diff --git a/gnulib/doc/posix-functions/sync.texi b/gnulib/doc/posix-functions/sync.texi
new file mode 100644
index 00000000..90835cf6
--- /dev/null
+++ b/gnulib/doc/posix-functions/sync.texi
@@ -0,0 +1,18 @@
+@node sync
+@section @code{sync}
+@findex sync
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sync.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/sysconf.texi b/gnulib/doc/posix-functions/sysconf.texi
new file mode 100644
index 00000000..b5110c1f
--- /dev/null
+++ b/gnulib/doc/posix-functions/sysconf.texi
@@ -0,0 +1,18 @@
+@node sysconf
+@section @code{sysconf}
+@findex sysconf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/sysconf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/syslog.texi b/gnulib/doc/posix-functions/syslog.texi
new file mode 100644
index 00000000..a7f31fff
--- /dev/null
+++ b/gnulib/doc/posix-functions/syslog.texi
@@ -0,0 +1,18 @@
+@node syslog
+@section @code{syslog}
+@findex syslog
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/syslog.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/system.texi b/gnulib/doc/posix-functions/system.texi
new file mode 100644
index 00000000..4665b07d
--- /dev/null
+++ b/gnulib/doc/posix-functions/system.texi
@@ -0,0 +1,20 @@
+@node system
+@section @code{system}
+@findex system
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/system.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), the command processor used by the
+@code{system} function is @file{cmd.exe}, not @file{/bin/sh}. Accordingly,
+the rules for quoting shell arguments containing spaces, quote or other special
+characters are different.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tan.texi b/gnulib/doc/posix-functions/tan.texi
new file mode 100644
index 00000000..be55a251
--- /dev/null
+++ b/gnulib/doc/posix-functions/tan.texi
@@ -0,0 +1,15 @@
+@node tan
+@section @code{tan}
+@findex tan
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tan.html}
+
+Gnulib module: tan
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/tanf.texi b/gnulib/doc/posix-functions/tanf.texi
new file mode 100644
index 00000000..3752dcab
--- /dev/null
+++ b/gnulib/doc/posix-functions/tanf.texi
@@ -0,0 +1,18 @@
+@node tanf
+@section @code{tanf}
+@findex tanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tanh.texi b/gnulib/doc/posix-functions/tanh.texi
new file mode 100644
index 00000000..71c27f7e
--- /dev/null
+++ b/gnulib/doc/posix-functions/tanh.texi
@@ -0,0 +1,15 @@
+@node tanh
+@section @code{tanh}
+@findex tanh
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tanh.html}
+
+Gnulib module: tanh
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/tanhf.texi b/gnulib/doc/posix-functions/tanhf.texi
new file mode 100644
index 00000000..a78b6740
--- /dev/null
+++ b/gnulib/doc/posix-functions/tanhf.texi
@@ -0,0 +1,18 @@
+@node tanhf
+@section @code{tanhf}
+@findex tanhf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tanhf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, Solaris 9.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tanhl.texi b/gnulib/doc/posix-functions/tanhl.texi
new file mode 100644
index 00000000..c3984e46
--- /dev/null
+++ b/gnulib/doc/posix-functions/tanhl.texi
@@ -0,0 +1,18 @@
+@node tanhl
+@section @code{tanhl}
+@findex tanhl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tanhl.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tanl.texi b/gnulib/doc/posix-functions/tanl.texi
new file mode 100644
index 00000000..109a598f
--- /dev/null
+++ b/gnulib/doc/posix-functions/tanl.texi
@@ -0,0 +1,21 @@
+@node tanl
+@section @code{tanl}
+@findex tanl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tanl.html}
+
+Gnulib module: tanl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function is not declared on some platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcdrain.texi b/gnulib/doc/posix-functions/tcdrain.texi
new file mode 100644
index 00000000..d319cd56
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcdrain.texi
@@ -0,0 +1,22 @@
+@node tcdrain
+@section @code{tcdrain}
+@findex tcdrain
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcdrain.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+On some platforms, @code{tcdrain} on a non-tty fails with @code{errno} set to
+@code{EINVAL} or, on MacOS X, also @code{EOPNOTSUPP} or @code{ENODEV}, rather
+than @code{ENOTTY}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcflow.texi b/gnulib/doc/posix-functions/tcflow.texi
new file mode 100644
index 00000000..e41f2fcd
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcflow.texi
@@ -0,0 +1,18 @@
+@node tcflow
+@section @code{tcflow}
+@findex tcflow
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcflow.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcflush.texi b/gnulib/doc/posix-functions/tcflush.texi
new file mode 100644
index 00000000..20c2b8ee
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcflush.texi
@@ -0,0 +1,25 @@
+@node tcflush
+@section @code{tcflush}
+@findex tcflush
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcflush.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@item
+On some platforms, @code{tcflush} of @code{TCIFLUSH} on a non-tty fails with
+errno set to @code{EINVAL} rather than @code{ENOTTY}.
+@item
+On some platforms, @code{tcflush} of @code{TCOFLUSH} on a non-tty fails with
+errno set to @code{EINVAL} or, on IRIX, also @code{ENOSYS}, or, on MacOS X,
+also @code{EOPNOTSUPP} or @code{ENODEV}, rather than @code{ENOTTY}.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcgetattr.texi b/gnulib/doc/posix-functions/tcgetattr.texi
new file mode 100644
index 00000000..eba6bad9
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcgetattr.texi
@@ -0,0 +1,18 @@
+@node tcgetattr
+@section @code{tcgetattr}
+@findex tcgetattr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcgetattr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcgetpgrp.texi b/gnulib/doc/posix-functions/tcgetpgrp.texi
new file mode 100644
index 00000000..ba4c7e5a
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcgetpgrp.texi
@@ -0,0 +1,18 @@
+@node tcgetpgrp
+@section @code{tcgetpgrp}
+@findex tcgetpgrp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcgetpgrp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcgetsid.texi b/gnulib/doc/posix-functions/tcgetsid.texi
new file mode 100644
index 00000000..c481ada8
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcgetsid.texi
@@ -0,0 +1,18 @@
+@node tcgetsid
+@section @code{tcgetsid}
+@findex tcgetsid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcgetsid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcsendbreak.texi b/gnulib/doc/posix-functions/tcsendbreak.texi
new file mode 100644
index 00000000..ffed6607
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcsendbreak.texi
@@ -0,0 +1,18 @@
+@node tcsendbreak
+@section @code{tcsendbreak}
+@findex tcsendbreak
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcsendbreak.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcsetattr.texi b/gnulib/doc/posix-functions/tcsetattr.texi
new file mode 100644
index 00000000..4379b36f
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcsetattr.texi
@@ -0,0 +1,18 @@
+@node tcsetattr
+@section @code{tcsetattr}
+@findex tcsetattr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcsetattr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tcsetpgrp.texi b/gnulib/doc/posix-functions/tcsetpgrp.texi
new file mode 100644
index 00000000..309e1496
--- /dev/null
+++ b/gnulib/doc/posix-functions/tcsetpgrp.texi
@@ -0,0 +1,18 @@
+@node tcsetpgrp
+@section @code{tcsetpgrp}
+@findex tcsetpgrp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tcsetpgrp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tdelete.texi b/gnulib/doc/posix-functions/tdelete.texi
new file mode 100644
index 00000000..7ea98dcd
--- /dev/null
+++ b/gnulib/doc/posix-functions/tdelete.texi
@@ -0,0 +1,22 @@
+@node tdelete
+@section @code{tdelete}
+@findex tdelete
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tdelete.html}
+
+Gnulib module: tsearch
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@item
+@code{tdelete} returns @code{NULL} when removing the last element of a tree
+on some platforms:
+OpenBSD 4.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/telldir.texi b/gnulib/doc/posix-functions/telldir.texi
new file mode 100644
index 00000000..3645e5c1
--- /dev/null
+++ b/gnulib/doc/posix-functions/telldir.texi
@@ -0,0 +1,18 @@
+@node telldir
+@section @code{telldir}
+@findex telldir
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/telldir.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tempnam.texi b/gnulib/doc/posix-functions/tempnam.texi
new file mode 100644
index 00000000..078925c5
--- /dev/null
+++ b/gnulib/doc/posix-functions/tempnam.texi
@@ -0,0 +1,18 @@
+@node tempnam
+@section @code{tempnam}
+@findex tempnam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tempnam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is not appropriate for creating temporary files. (It has
+security risks.) Better use @code{mkstemp} instead.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tfind.texi b/gnulib/doc/posix-functions/tfind.texi
new file mode 100644
index 00000000..52900bbf
--- /dev/null
+++ b/gnulib/doc/posix-functions/tfind.texi
@@ -0,0 +1,18 @@
+@node tfind
+@section @code{tfind}
+@findex tfind
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tfind.html}
+
+Gnulib module: tsearch
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/tgamma.texi b/gnulib/doc/posix-functions/tgamma.texi
new file mode 100644
index 00000000..7324c148
--- /dev/null
+++ b/gnulib/doc/posix-functions/tgamma.texi
@@ -0,0 +1,18 @@
+@node tgamma
+@section @code{tgamma}
+@findex tgamma
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tgamma.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tgammaf.texi b/gnulib/doc/posix-functions/tgammaf.texi
new file mode 100644
index 00000000..d13886d5
--- /dev/null
+++ b/gnulib/doc/posix-functions/tgammaf.texi
@@ -0,0 +1,18 @@
+@node tgammaf
+@section @code{tgammaf}
+@findex tgammaf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tgammaf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tgammal.texi b/gnulib/doc/posix-functions/tgammal.texi
new file mode 100644
index 00000000..46314468
--- /dev/null
+++ b/gnulib/doc/posix-functions/tgammal.texi
@@ -0,0 +1,18 @@
+@node tgammal
+@section @code{tgammal}
+@findex tgammal
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tgammal.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/time.texi b/gnulib/doc/posix-functions/time.texi
new file mode 100644
index 00000000..f297d02b
--- /dev/null
+++ b/gnulib/doc/posix-functions/time.texi
@@ -0,0 +1,15 @@
+@node time
+@section @code{time}
+@findex time
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/time.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/timer_create.texi b/gnulib/doc/posix-functions/timer_create.texi
new file mode 100644
index 00000000..4218567d
--- /dev/null
+++ b/gnulib/doc/posix-functions/timer_create.texi
@@ -0,0 +1,18 @@
+@node timer_create
+@section @code{timer_create}
+@findex timer_create
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/timer_create.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/timer_delete.texi b/gnulib/doc/posix-functions/timer_delete.texi
new file mode 100644
index 00000000..4d2ee82e
--- /dev/null
+++ b/gnulib/doc/posix-functions/timer_delete.texi
@@ -0,0 +1,18 @@
+@node timer_delete
+@section @code{timer_delete}
+@findex timer_delete
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/timer_delete.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/timer_getoverrun.texi b/gnulib/doc/posix-functions/timer_getoverrun.texi
new file mode 100644
index 00000000..516eb49a
--- /dev/null
+++ b/gnulib/doc/posix-functions/timer_getoverrun.texi
@@ -0,0 +1,18 @@
+@node timer_getoverrun
+@section @code{timer_getoverrun}
+@findex timer_getoverrun
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/timer_getoverrun.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, IRIX 5.3, Solaris 2.4, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/timer_gettime.texi b/gnulib/doc/posix-functions/timer_gettime.texi
new file mode 100644
index 00000000..db16442f
--- /dev/null
+++ b/gnulib/doc/posix-functions/timer_gettime.texi
@@ -0,0 +1,18 @@
+@node timer_gettime
+@section @code{timer_gettime}
+@findex timer_gettime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/timer_gettime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, IRIX 5.3, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/timer_settime.texi b/gnulib/doc/posix-functions/timer_settime.texi
new file mode 100644
index 00000000..7667323a
--- /dev/null
+++ b/gnulib/doc/posix-functions/timer_settime.texi
@@ -0,0 +1,18 @@
+@node timer_settime
+@section @code{timer_settime}
+@findex timer_settime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/timer_settime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, IRIX 5.3, Solaris 2.4, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/times.texi b/gnulib/doc/posix-functions/times.texi
new file mode 100644
index 00000000..1a0c6e3f
--- /dev/null
+++ b/gnulib/doc/posix-functions/times.texi
@@ -0,0 +1,22 @@
+@node times
+@section @code{times}
+@findex times
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/times.html}
+
+Gnulib module: times
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+There is no function on Windows to measure consumed process child
+times, thus the @code{tms_cutime} and @code{tms_cstime} will always be
+0 when the module is used.
+@end itemize
diff --git a/gnulib/doc/posix-functions/timezone.texi b/gnulib/doc/posix-functions/timezone.texi
new file mode 100644
index 00000000..6c563320
--- /dev/null
+++ b/gnulib/doc/posix-functions/timezone.texi
@@ -0,0 +1,21 @@
+@node timezone
+@section @code{timezone}
+@findex timezone
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/timezone.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+IRIX 6.5, OSF/1 5.1, mingw.
+@item
+The address of this variable is not a compile-time constant on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tmpfile.texi b/gnulib/doc/posix-functions/tmpfile.texi
new file mode 100644
index 00000000..83eed220
--- /dev/null
+++ b/gnulib/doc/posix-functions/tmpfile.texi
@@ -0,0 +1,18 @@
+@node tmpfile
+@section @code{tmpfile}
+@findex tmpfile
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tmpfile.html}
+
+Gnulib module: tmpfile
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function often fails for trivial reasons on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/tmpnam.texi b/gnulib/doc/posix-functions/tmpnam.texi
new file mode 100644
index 00000000..40a842e3
--- /dev/null
+++ b/gnulib/doc/posix-functions/tmpnam.texi
@@ -0,0 +1,18 @@
+@node tmpnam
+@section @code{tmpnam}
+@findex tmpnam
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tmpnam.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is not appropriate for creating temporary files. (It has
+security risks.) Better use @code{mkstemp} instead.
+@end itemize
diff --git a/gnulib/doc/posix-functions/toascii.texi b/gnulib/doc/posix-functions/toascii.texi
new file mode 100644
index 00000000..7bc47dde
--- /dev/null
+++ b/gnulib/doc/posix-functions/toascii.texi
@@ -0,0 +1,15 @@
+@node toascii
+@section @code{toascii}
+@findex toascii
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/toascii.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/tolower.texi b/gnulib/doc/posix-functions/tolower.texi
new file mode 100644
index 00000000..994ca333
--- /dev/null
+++ b/gnulib/doc/posix-functions/tolower.texi
@@ -0,0 +1,18 @@
+@node tolower
+@section @code{tolower}
+@findex tolower
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tolower.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tolower_l.texi b/gnulib/doc/posix-functions/tolower_l.texi
new file mode 100644
index 00000000..ba84a559
--- /dev/null
+++ b/gnulib/doc/posix-functions/tolower_l.texi
@@ -0,0 +1,18 @@
+@node tolower_l
+@section @code{tolower_l}
+@findex tolower_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tolower_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/toupper.texi b/gnulib/doc/posix-functions/toupper.texi
new file mode 100644
index 00000000..cbe34abb
--- /dev/null
+++ b/gnulib/doc/posix-functions/toupper.texi
@@ -0,0 +1,18 @@
+@node toupper
+@section @code{toupper}
+@findex toupper
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/toupper.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/toupper_l.texi b/gnulib/doc/posix-functions/toupper_l.texi
new file mode 100644
index 00000000..797c28a2
--- /dev/null
+++ b/gnulib/doc/posix-functions/toupper_l.texi
@@ -0,0 +1,18 @@
+@node toupper_l
+@section @code{toupper_l}
+@findex toupper_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/toupper_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/towctrans.texi b/gnulib/doc/posix-functions/towctrans.texi
new file mode 100644
index 00000000..ffda8cd7
--- /dev/null
+++ b/gnulib/doc/posix-functions/towctrans.texi
@@ -0,0 +1,21 @@
+@node towctrans
+@section @code{towctrans}
+@findex towctrans
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/towctrans.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.5.1, mingw, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/towctrans_l.texi b/gnulib/doc/posix-functions/towctrans_l.texi
new file mode 100644
index 00000000..2f9cccac
--- /dev/null
+++ b/gnulib/doc/posix-functions/towctrans_l.texi
@@ -0,0 +1,21 @@
+@node towctrans_l
+@section @code{towctrans_l}
+@findex towctrans_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/towctrans_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/towlower.texi b/gnulib/doc/posix-functions/towlower.texi
new file mode 100644
index 00000000..18b6eda0
--- /dev/null
+++ b/gnulib/doc/posix-functions/towlower.texi
@@ -0,0 +1,25 @@
+@node towlower
+@section @code{towlower}
+@findex towlower
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/towlower.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns values of which the upper 16 bits are incorrect
+on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/towlower_l.texi b/gnulib/doc/posix-functions/towlower_l.texi
new file mode 100644
index 00000000..dd1118b7
--- /dev/null
+++ b/gnulib/doc/posix-functions/towlower_l.texi
@@ -0,0 +1,21 @@
+@node towlower_l
+@section @code{towlower_l}
+@findex towlower_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/towlower_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/towupper.texi b/gnulib/doc/posix-functions/towupper.texi
new file mode 100644
index 00000000..d63469b1
--- /dev/null
+++ b/gnulib/doc/posix-functions/towupper.texi
@@ -0,0 +1,25 @@
+@node towupper
+@section @code{towupper}
+@findex towupper
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/towupper.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+This function returns values of which the upper 16 bits are incorrect
+on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/towupper_l.texi b/gnulib/doc/posix-functions/towupper_l.texi
new file mode 100644
index 00000000..7d060107
--- /dev/null
+++ b/gnulib/doc/posix-functions/towupper_l.texi
@@ -0,0 +1,21 @@
+@node towupper_l
+@section @code{towupper_l}
+@findex towupper_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/towupper_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/trunc.texi b/gnulib/doc/posix-functions/trunc.texi
new file mode 100644
index 00000000..d695a073
--- /dev/null
+++ b/gnulib/doc/posix-functions/trunc.texi
@@ -0,0 +1,18 @@
+@node trunc
+@section @code{trunc}
+@findex trunc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/trunc.html}
+
+Gnulib module: trunc
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, Solaris 9, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/truncate.texi b/gnulib/doc/posix-functions/truncate.texi
new file mode 100644
index 00000000..bf6faa22
--- /dev/null
+++ b/gnulib/doc/posix-functions/truncate.texi
@@ -0,0 +1,18 @@
+@node truncate
+@section @code{truncate}
+@findex truncate
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/truncate.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/truncf.texi b/gnulib/doc/posix-functions/truncf.texi
new file mode 100644
index 00000000..32f4dffb
--- /dev/null
+++ b/gnulib/doc/posix-functions/truncf.texi
@@ -0,0 +1,18 @@
+@node truncf
+@section @code{truncf}
+@findex truncf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/truncf.html}
+
+Gnulib module: truncf
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, Solaris 9, Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/truncl.texi b/gnulib/doc/posix-functions/truncl.texi
new file mode 100644
index 00000000..fbf06aaf
--- /dev/null
+++ b/gnulib/doc/posix-functions/truncl.texi
@@ -0,0 +1,21 @@
+@node truncl
+@section @code{truncl}
+@findex truncl
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/truncl.html}
+
+Gnulib module: truncl
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+This function crashes on some platforms:
+OSF/1 4.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/tsearch.texi b/gnulib/doc/posix-functions/tsearch.texi
new file mode 100644
index 00000000..9ab045d1
--- /dev/null
+++ b/gnulib/doc/posix-functions/tsearch.texi
@@ -0,0 +1,18 @@
+@node tsearch
+@section @code{tsearch}
+@findex tsearch
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tsearch.html}
+
+Gnulib module: tsearch
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ttyname.texi b/gnulib/doc/posix-functions/ttyname.texi
new file mode 100644
index 00000000..e16e7764
--- /dev/null
+++ b/gnulib/doc/posix-functions/ttyname.texi
@@ -0,0 +1,18 @@
+@node ttyname
+@section @code{ttyname}
+@findex ttyname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ttyname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ttyname_r.texi b/gnulib/doc/posix-functions/ttyname_r.texi
new file mode 100644
index 00000000..16425ba5
--- /dev/null
+++ b/gnulib/doc/posix-functions/ttyname_r.texi
@@ -0,0 +1,18 @@
+@node ttyname_r
+@section @code{ttyname_r}
+@findex ttyname_r
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ttyname_r.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/twalk.texi b/gnulib/doc/posix-functions/twalk.texi
new file mode 100644
index 00000000..8b34ece7
--- /dev/null
+++ b/gnulib/doc/posix-functions/twalk.texi
@@ -0,0 +1,18 @@
+@node twalk
+@section @code{twalk}
+@findex twalk
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/twalk.html}
+
+Gnulib module: tsearch
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/tzname.texi b/gnulib/doc/posix-functions/tzname.texi
new file mode 100644
index 00000000..9452a938
--- /dev/null
+++ b/gnulib/doc/posix-functions/tzname.texi
@@ -0,0 +1,21 @@
+@node tzname
+@section @code{tzname}
+@findex tzname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tzname.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This variable is missing on some platforms:
+IRIX 6.5, OSF/1 5.1, mingw.
+@item
+The address of this variable is not a compile-time constant on some platforms:
+Cygwin, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/tzset.texi b/gnulib/doc/posix-functions/tzset.texi
new file mode 100644
index 00000000..6bc97615
--- /dev/null
+++ b/gnulib/doc/posix-functions/tzset.texi
@@ -0,0 +1,19 @@
+@node tzset
+@section @code{tzset}
+@findex tzset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/tzset.html}
+
+Gnulib module: tzset
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function clobbers the buffer used by the localtime function on some
+platforms:
+Solaris 2.6.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ulimit.texi b/gnulib/doc/posix-functions/ulimit.texi
new file mode 100644
index 00000000..51ed7381
--- /dev/null
+++ b/gnulib/doc/posix-functions/ulimit.texi
@@ -0,0 +1,18 @@
+@node ulimit
+@section @code{ulimit}
+@findex ulimit
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ulimit.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/umask.texi b/gnulib/doc/posix-functions/umask.texi
new file mode 100644
index 00000000..84a1298e
--- /dev/null
+++ b/gnulib/doc/posix-functions/umask.texi
@@ -0,0 +1,15 @@
+@node umask
+@section @code{umask}
+@findex umask
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/umask.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/uname.texi b/gnulib/doc/posix-functions/uname.texi
new file mode 100644
index 00000000..f17c7445
--- /dev/null
+++ b/gnulib/doc/posix-functions/uname.texi
@@ -0,0 +1,18 @@
+@node uname
+@section @code{uname}
+@findex uname
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/uname.html}
+
+Gnulib module: uname
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/ungetc.texi b/gnulib/doc/posix-functions/ungetc.texi
new file mode 100644
index 00000000..89b0435d
--- /dev/null
+++ b/gnulib/doc/posix-functions/ungetc.texi
@@ -0,0 +1,18 @@
+@node ungetc
+@section @code{ungetc}
+@findex ungetc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ungetc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@end itemize
diff --git a/gnulib/doc/posix-functions/ungetwc.texi b/gnulib/doc/posix-functions/ungetwc.texi
new file mode 100644
index 00000000..95b650f4
--- /dev/null
+++ b/gnulib/doc/posix-functions/ungetwc.texi
@@ -0,0 +1,21 @@
+@node ungetwc
+@section @code{ungetwc}
+@findex ungetwc
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/ungetwc.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/unlink.texi b/gnulib/doc/posix-functions/unlink.texi
new file mode 100644
index 00000000..42b9e817
--- /dev/null
+++ b/gnulib/doc/posix-functions/unlink.texi
@@ -0,0 +1,33 @@
+@node unlink
+@section @code{unlink}
+@findex unlink
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/unlink.html}
+
+Gnulib module: unlink
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some systems mistakenly succeed on @code{unlink("link-to-file/")}:
+GNU/Hurd, FreeBSD 7.2, Solaris 9.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Some systems allow a superuser to unlink directories, even though this
+can cause file system corruption. The error given if a process is not
+permitted to unlink directories varies across implementations; it is
+not always the POSIX value of @code{EPERM}. Meanwhile, if a process
+has the ability to unlink directories, POSIX requires that
+@code{unlink("symlink-to-dir/")} remove @file{dir} and leave
+@file{symlink-to-dir} dangling; this behavior is counter-intuitive.
+The gnulib module unlinkdir can help determine whether code must be
+cautious of unlinking directories.
+@item
+Removing an open file is non-portable: On Unix this allows the programs that
+have the file already open to continue working with it; the file's storage
+is only freed when the no process has the file open any more. On Windows,
+the attempt to remove an open file fails.
+@end itemize
diff --git a/gnulib/doc/posix-functions/unlinkat.texi b/gnulib/doc/posix-functions/unlinkat.texi
new file mode 100644
index 00000000..cf334098
--- /dev/null
+++ b/gnulib/doc/posix-functions/unlinkat.texi
@@ -0,0 +1,51 @@
+@node unlinkat
+@section @code{unlinkat}
+@findex unlinkat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/unlinkat.html}
+
+Gnulib module: openat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+But the replacement function is not safe to be used in libraries and is not multithread-safe.
+@item
+Some systems mistakenly succeed on @code{unlinkat(fd,"file/",flag)}:
+GNU/Hurd, Solaris 9.
+@item
+Some platforms declare this function in @code{fcntl.h} instead of
+@code{unistd.h}:
+Cygwin 1.7.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+When @code{unlinkat(fd,name,AT_REMOVEDIR)} fails because the specified
+directory is not empty, the @code{errno} value is system dependent.
+@item
+POSIX requires that @code{unlinkdir(fd,"link-to-empty/",AT_REMOVEDIR)}
+remove @file{empty} and leave @file{link-to-empty} as a dangling
+symlink. This is counter-intuitive, so some systems fail with
+@code{ENOTDIR} instead:
+glibc
+@item
+Some systems allow a superuser to unlink directories, even though this
+can cause file system corruption. The error given if a process is not
+permitted to unlink directories varies across implementations; it is
+not always the POSIX value of @code{EPERM}. Meanwhile, if a process
+has the ability to unlink directories, POSIX requires that
+@code{unlinkat(fd,"symlink-to-dir/",0)} remove @file{dir} and leave
+@file{symlink-to-dir} dangling; this behavior is counter-intuitive.
+The gnulib module unlinkdir can help determine whether code must be
+cautious of unlinking directories.
+@item
+Removing an open file is non-portable: On Unix this allows the programs that
+have the file already open to continue working with it; the file's storage
+is only freed when the no process has the file open any more. On Windows,
+the attempt to remove an open file fails.
+@end itemize
diff --git a/gnulib/doc/posix-functions/unlockpt.texi b/gnulib/doc/posix-functions/unlockpt.texi
new file mode 100644
index 00000000..4007ae97
--- /dev/null
+++ b/gnulib/doc/posix-functions/unlockpt.texi
@@ -0,0 +1,18 @@
+@node unlockpt
+@section @code{unlockpt}
+@findex unlockpt
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/unlockpt.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/unsetenv.texi b/gnulib/doc/posix-functions/unsetenv.texi
new file mode 100644
index 00000000..80b17048
--- /dev/null
+++ b/gnulib/doc/posix-functions/unsetenv.texi
@@ -0,0 +1,34 @@
+@node unsetenv
+@section @code{unsetenv}
+@findex unsetenv
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/unsetenv.html}
+
+Gnulib module: setenv
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, mingw, BeOS.
+@item
+This function has the return type @samp{void} instead of @samp{int} on some
+platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 1.6, OpenBSD 3.8, OSF/1 5.1.
+@item
+On some platforms, this function does not fail with @samp{EINVAL} when
+passed an empty string or a string containing @samp{=}:
+FreeBSD 6.0, NetBSD 1.6, OpenBSD 3.8.
+@item
+This function removes only the first value association for the given
+environment variable, not all of them, on some platforms:
+Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Older versions of POSIX required that @code{unsetenv(NULL)} gracefully
+fail with @code{EINVAL}, but not all implementations guarantee this,
+and the requirement was removed.
+@end itemize
diff --git a/gnulib/doc/posix-functions/uselocale.texi b/gnulib/doc/posix-functions/uselocale.texi
new file mode 100644
index 00000000..43da8a3a
--- /dev/null
+++ b/gnulib/doc/posix-functions/uselocale.texi
@@ -0,0 +1,18 @@
+@node uselocale
+@section @code{uselocale}
+@findex uselocale
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/uselocale.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/utime.texi b/gnulib/doc/posix-functions/utime.texi
new file mode 100644
index 00000000..f50af81e
--- /dev/null
+++ b/gnulib/doc/posix-functions/utime.texi
@@ -0,0 +1,30 @@
+@node utime
+@section @code{utime}
+@findex utime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/utime.html}
+
+Gnulib module: utime
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+On some old platforms (Sequent), @code{utime (file, NULL)} fails to set the
+file's timestamp to the current time.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some platforms, this function mis-handles trailing slash:
+Solaris 9.
+@item
+This function cannot set full timestamp resolution. Use
+@code{utimensat(AT_FDCWD,file,times,0)}, or the gnulib module utimens,
+instead.
+@item
+On some platforms, the prototype for @code{utime} omits @code{const}
+for the second argument. Fortunately, the argument is not modified,
+so it is safe to cast away const:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/utimensat.texi b/gnulib/doc/posix-functions/utimensat.texi
new file mode 100644
index 00000000..85fc218f
--- /dev/null
+++ b/gnulib/doc/posix-functions/utimensat.texi
@@ -0,0 +1,57 @@
+@node utimensat
+@section @code{utimensat}
+@findex utimensat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/utimensat.html}
+
+Gnulib module: utimensat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw,
+Interix 3.5, BeOS.
+However, the replacement function may end up truncating timestamps to
+less resolution than supported by the file system. Furthermore, the
+replacement function is not safe to be used in libraries and is not
+multithread-safe.
+@item
+This function returns a bogus value instead of failing with
+@code{ENOSYS} on some platforms:
+Linux kernel 2.6.21.
+@item
+This function fails with @code{ENOSYS} if passed the flag
+@code{AT_SYMLINK_NOFOLLOW} on a regular file:
+Linux kernel 2.6.22.
+@item
+When using @code{UTIME_OMIT} or @code{UTIME_NOW}, some systems require
+the @code{tv_sec} argument to be 0, and don't necessarily handle all
+file permissions in the manner required by POSIX:
+Linux kernel 2.6.25.
+@item
+When using @code{UTIME_OMIT} for the modification time, but specifying
+an access time, some systems fail to update the change time:
+Linux kernel 2.6.32.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On some platforms, timestamps of symbolic links cannot be modified, so
+the replacement fails with @code{ENOSYS} if passed the flag
+@code{AT_SYMLINK_NOFOLLOW} on a symlink.
+@item
+The mere act of using @code{lstat} modifies the access time of
+symlinks on some platforms, so @code{utimensat} with
+@code{AT_SYMLINK_NOFOLLOW} can only effectively change modification time:
+Cygwin.
+@item
+The mere act of using @code{stat} modifies the access time of
+directories on some platforms, so @code{utimensat} can only
+effectively change directory modification time:
+Cygwin 1.5.x.
+@end itemize
+
+The gnulib module fdutimensat provides a similar interface.
diff --git a/gnulib/doc/posix-functions/utimes.texi b/gnulib/doc/posix-functions/utimes.texi
new file mode 100644
index 00000000..cfd8fd31
--- /dev/null
+++ b/gnulib/doc/posix-functions/utimes.texi
@@ -0,0 +1,34 @@
+@node utimes
+@section @code{utimes}
+@findex utimes
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/utimes.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@item
+On some platforms, this function mis-handles trailing slash:
+FreeBSD 7.2, Solaris 9.
+@item
+This function cannot set full timestamp resolution. In particular,
+some platforms incorrectly round rather than truncate. Use
+@code{utimensat(AT_FDCWD,file,times,0)}, or the gnulib module utimens,
+instead.
+@item
+On some platforms, @code{utimes (file, NULL)} fails to set the
+file's timestamp to the current time:
+glibc 2.3.3.
+@item
+On some platforms, @code{utimes} failed on read-only files when
+@code{utime} worked fine.
+glibc 2.2.5.
+@end itemize
diff --git a/gnulib/doc/posix-functions/va_arg.texi b/gnulib/doc/posix-functions/va_arg.texi
new file mode 100644
index 00000000..5331f531
--- /dev/null
+++ b/gnulib/doc/posix-functions/va_arg.texi
@@ -0,0 +1,39 @@
+@node va_arg
+@section @code{va_arg}
+@findex va_arg
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/va_arg.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+The second argument of @code{va_arg} must be a type that is invariant under
+the ``default argument promotions'' (ISO C 99 6.5.2.2 paragraph 6). This
+means that the following are not valid here:
+@table @asis
+@item @samp{float}
+Use @samp{double} instead.
+@item @samp{bool}
+Use @samp{int} instead.
+@item Integer types smaller than @samp{int}.
+Use @samp{int} or @samp{unsigned int} instead.
+@end table
+
+This is a portability problem because you don't know the width of some
+abstract types like @code{uid_t}, @code{gid_t}, @code{mode_t}. So, instead of
+@smallexample
+mode = va_arg (ap, mode_t);
+@end smallexample
+you have to write
+@smallexample
+mode = (sizeof (mode_t) < sizeof (int)
+ ? va_arg (ap, int)
+ : va_arg (ap, mode_t));
+@end smallexample
+@end itemize
diff --git a/gnulib/doc/posix-functions/va_copy.texi b/gnulib/doc/posix-functions/va_copy.texi
new file mode 100644
index 00000000..71b7e584
--- /dev/null
+++ b/gnulib/doc/posix-functions/va_copy.texi
@@ -0,0 +1,18 @@
+@node va_copy
+@section @code{va_copy}
+@findex va_copy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/va_copy.html}
+
+Gnulib module: stdarg
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This macro is missing on some platforms:
+AIX 5.1 with cc or xlc, HP-UX 11 with cc, IRIX 6.5 with cc, OSF/1 5.1 with cc.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/va_end.texi b/gnulib/doc/posix-functions/va_end.texi
new file mode 100644
index 00000000..1913a49e
--- /dev/null
+++ b/gnulib/doc/posix-functions/va_end.texi
@@ -0,0 +1,15 @@
+@node va_end
+@section @code{va_end}
+@findex va_end
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/va_end.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/va_start.texi b/gnulib/doc/posix-functions/va_start.texi
new file mode 100644
index 00000000..bbb95cba
--- /dev/null
+++ b/gnulib/doc/posix-functions/va_start.texi
@@ -0,0 +1,15 @@
+@node va_start
+@section @code{va_start}
+@findex va_start
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/va_start.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/vdprintf.texi b/gnulib/doc/posix-functions/vdprintf.texi
new file mode 100644
index 00000000..f084c26f
--- /dev/null
+++ b/gnulib/doc/posix-functions/vdprintf.texi
@@ -0,0 +1,45 @@
+@node vdprintf
+@section @code{vdprintf}
+@findex vdprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vdprintf.html}
+
+Gnulib module: vdprintf or vdprintf-posix
+
+Portability problems fixed by either Gnulib module @code{vdprintf} or @code{vdprintf-posix}:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{vdprintf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+BeOS.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+BeOS.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+BeOS.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/vfprintf.texi b/gnulib/doc/posix-functions/vfprintf.texi
new file mode 100644
index 00000000..f902b848
--- /dev/null
+++ b/gnulib/doc/posix-functions/vfprintf.texi
@@ -0,0 +1,72 @@
+@node vfprintf
+@section @code{vfprintf}
+@findex vfprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vfprintf.html}
+
+Gnulib module: vfprintf-posix or stdio, sigpipe
+
+Portability problems fixed by Gnulib module @code{vfprintf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{stdio} or @code{vfprintf-posix}, together with module @code{sigpipe}:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/vfscanf.texi b/gnulib/doc/posix-functions/vfscanf.texi
new file mode 100644
index 00000000..17b843e3
--- /dev/null
+++ b/gnulib/doc/posix-functions/vfscanf.texi
@@ -0,0 +1,24 @@
+@node vfscanf
+@section @code{vfscanf}
+@findex vfscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vfscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, OSF/1 5.1, Solaris 8, Interix 3.5.
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+On Windows, this function doesn't support the @code{hh}, @code{ll}, @code{j},
+@code{t}, @code{z} size specifiers.
+@end itemize
diff --git a/gnulib/doc/posix-functions/vfwprintf.texi b/gnulib/doc/posix-functions/vfwprintf.texi
new file mode 100644
index 00000000..ca32a7ab
--- /dev/null
+++ b/gnulib/doc/posix-functions/vfwprintf.texi
@@ -0,0 +1,21 @@
+@node vfwprintf
+@section @code{vfwprintf}
+@findex vfwprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vfwprintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/vfwscanf.texi b/gnulib/doc/posix-functions/vfwscanf.texi
new file mode 100644
index 00000000..b856327d
--- /dev/null
+++ b/gnulib/doc/posix-functions/vfwscanf.texi
@@ -0,0 +1,22 @@
+@node vfwscanf
+@section @code{vfwscanf}
+@findex vfwscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vfwscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 8, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/vprintf.texi b/gnulib/doc/posix-functions/vprintf.texi
new file mode 100644
index 00000000..c118f3c0
--- /dev/null
+++ b/gnulib/doc/posix-functions/vprintf.texi
@@ -0,0 +1,72 @@
+@node vprintf
+@section @code{vprintf}
+@findex vprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vprintf.html}
+
+Gnulib module: vprintf-posix or stdio, sigpipe
+
+Portability problems fixed by Gnulib module @code{vprintf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{stdio} or @code{vprintf-posix}, together with module @code{sigpipe}:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails, instead of
+obeying the current @code{SIGPIPE} handler, on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/vscanf.texi b/gnulib/doc/posix-functions/vscanf.texi
new file mode 100644
index 00000000..25dd7be0
--- /dev/null
+++ b/gnulib/doc/posix-functions/vscanf.texi
@@ -0,0 +1,24 @@
+@node vscanf
+@section @code{vscanf}
+@findex vscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+AIX 4.3.2, IRIX 6.5, OSF/1 5.1, Solaris 8.
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+On Windows, these functions don't support the @code{hh}, @code{ll}, @code{j},
+@code{t}, @code{z} size specifiers.
+@end itemize
diff --git a/gnulib/doc/posix-functions/vsnprintf.texi b/gnulib/doc/posix-functions/vsnprintf.texi
new file mode 100644
index 00000000..19f8773d
--- /dev/null
+++ b/gnulib/doc/posix-functions/vsnprintf.texi
@@ -0,0 +1,92 @@
+@node vsnprintf
+@section @code{vsnprintf}
+@findex vsnprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vsnprintf.html}
+
+Gnulib module: vsnprintf or vsnprintf-posix
+
+Portability problems fixed by either Gnulib module @code{vsnprintf} or @code{vsnprintf-posix}:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, OSF/1 4.0, Solaris 2.5.1.
+@item
+This function overwrites memory even when a size argument of 1 is passed on some
+platforms:
+Linux libc5.
+@end itemize
+
+Portability problems fixed by Gnulib module @code{vsnprintf-posix}:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@item
+This function does not truncate the result as specified in C99 on some platforms:
+mingw.
+@item
+This function does not return a byte count as specified in C99 on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw.
+@item
+This function does not fully support the @samp{n} directive on some platforms:
+HP-UX 11, mingw.
+@item
+This function overwrites memory when a size = 1 argument is passed on some
+platforms:
+BeOS.
+@item
+This function overwrites memory even when a zero size argument is passed on some
+platforms:
+HP-UX 11, OSF/1 5.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/vsprintf.texi b/gnulib/doc/posix-functions/vsprintf.texi
new file mode 100644
index 00000000..e0a479d3
--- /dev/null
+++ b/gnulib/doc/posix-functions/vsprintf.texi
@@ -0,0 +1,64 @@
+@node vsprintf
+@section @code{vsprintf}
+@findex vsprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vsprintf.html}
+
+Gnulib module: vsprintf-posix
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function does not support size specifiers as in C99 (@code{hh}, @code{ll},
+@code{j}, @code{t}, @code{z}) on some platforms:
+AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.24, mingw, BeOS.
+@item
+printf of @samp{long double} numbers is unsupported on some platforms:
+mingw, BeOS.
+@item
+printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an
+incorrect result on some platforms:
+AIX 5.2, OSF/1 5.1, Solaris 10, mingw.
+@item
+This function does not support the @samp{a} and @samp{A} directives on some
+platforms:
+glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{F} directive on some platforms:
+NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+Cygwin 1.5.x, mingw, BeOS.
+@item
+This function does not support the @samp{ls} directive on some platforms:
+OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Haiku.
+@item
+This function does not support precisions in the @samp{ls} directive correctly
+on some platforms:
+Solaris 10.
+@item
+This function does not support format directives that access arguments in an
+arbitrary order, such as @code{"%2$s"}, on some platforms:
+NetBSD 3.0, mingw, BeOS.
+@item
+This function doesn't support the @code{'} flag on some platforms:
+NetBSD 3.0, Cygwin 1.5.24, mingw.
+@item
+This function behaves incorrectly when a @samp{-} flag and a negative width
+are specified together, on some platforms:
+HP-UX 10.20.
+@item
+printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded
+with zeroes) on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+This function does not support precisions larger than 512 or 1024 in integer,
+floating-point and pointer output on some platforms:
+mingw, BeOS.
+@item
+This function can crash in out-of-memory conditions on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/vsscanf.texi b/gnulib/doc/posix-functions/vsscanf.texi
new file mode 100644
index 00000000..ed0f7fd2
--- /dev/null
+++ b/gnulib/doc/posix-functions/vsscanf.texi
@@ -0,0 +1,24 @@
+@node vsscanf
+@section @code{vsscanf}
+@findex vsscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vsscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+Solaris 8.
+@item
+On Windows platforms (excluding Cygwin), this function does not set @code{errno}
+upon failure.
+@item
+On Windows, these functions don't support the @code{hh}, @code{ll}, @code{j},
+@code{t}, @code{z} size specifiers.
+@end itemize
diff --git a/gnulib/doc/posix-functions/vswprintf.texi b/gnulib/doc/posix-functions/vswprintf.texi
new file mode 100644
index 00000000..0cd4fd2a
--- /dev/null
+++ b/gnulib/doc/posix-functions/vswprintf.texi
@@ -0,0 +1,23 @@
+@node vswprintf
+@section @code{vswprintf}
+@findex vswprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vswprintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@item
+On Windows, this function does not take a buffer size as second argument.
+@end itemize
diff --git a/gnulib/doc/posix-functions/vswscanf.texi b/gnulib/doc/posix-functions/vswscanf.texi
new file mode 100644
index 00000000..425cdcf5
--- /dev/null
+++ b/gnulib/doc/posix-functions/vswscanf.texi
@@ -0,0 +1,22 @@
+@node vswscanf
+@section @code{vswscanf}
+@findex vswscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vswscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 8, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/vwprintf.texi b/gnulib/doc/posix-functions/vwprintf.texi
new file mode 100644
index 00000000..29dda755
--- /dev/null
+++ b/gnulib/doc/posix-functions/vwprintf.texi
@@ -0,0 +1,25 @@
+@node vwprintf
+@section @code{vwprintf}
+@findex vwprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vwprintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x,
+Interix 3.5, BeOS, Cygwin 1.7.
+@item
+This function exists, but does not support wide arguments on some
+platforms: Cygwin 1.5.x.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/vwscanf.texi b/gnulib/doc/posix-functions/vwscanf.texi
new file mode 100644
index 00000000..5e44f08e
--- /dev/null
+++ b/gnulib/doc/posix-functions/vwscanf.texi
@@ -0,0 +1,22 @@
+@node vwscanf
+@section @code{vwscanf}
+@findex vwscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/vwscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 8, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wait.texi b/gnulib/doc/posix-functions/wait.texi
new file mode 100644
index 00000000..33d8f984
--- /dev/null
+++ b/gnulib/doc/posix-functions/wait.texi
@@ -0,0 +1,18 @@
+@node wait
+@section @code{wait}
+@findex wait
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wait.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/waitid.texi b/gnulib/doc/posix-functions/waitid.texi
new file mode 100644
index 00000000..cbcfc67f
--- /dev/null
+++ b/gnulib/doc/posix-functions/waitid.texi
@@ -0,0 +1,21 @@
+@node waitid
+@section @code{waitid}
+@findex waitid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/waitid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+As of 2005, no system is known on which @code{waitid} with flag @code{WNOWAIT}
+works correctly.
+@end itemize
diff --git a/gnulib/doc/posix-functions/waitpid.texi b/gnulib/doc/posix-functions/waitpid.texi
new file mode 100644
index 00000000..86ec4725
--- /dev/null
+++ b/gnulib/doc/posix-functions/waitpid.texi
@@ -0,0 +1,18 @@
+@node waitpid
+@section @code{waitpid}
+@findex waitpid
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/waitpid.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcpcpy.texi b/gnulib/doc/posix-functions/wcpcpy.texi
new file mode 100644
index 00000000..c285f283
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcpcpy.texi
@@ -0,0 +1,22 @@
+@node wcpcpy
+@section @code{wcpcpy}
+@findex wcpcpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcpcpy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcpncpy.texi b/gnulib/doc/posix-functions/wcpncpy.texi
new file mode 100644
index 00000000..2020af8c
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcpncpy.texi
@@ -0,0 +1,22 @@
+@node wcpncpy
+@section @code{wcpncpy}
+@findex wcpncpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcpncpy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcrtomb.texi b/gnulib/doc/posix-functions/wcrtomb.texi
new file mode 100644
index 00000000..d985cf79
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcrtomb.texi
@@ -0,0 +1,24 @@
+@node wcrtomb
+@section @code{wcrtomb}
+@findex wcrtomb
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcrtomb.html}
+
+Gnulib module: wcrtomb
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, mingw, Interix 3.5.
+@item
+This function returns 0 when the first argument is NULL in some locales on some platforms:
+AIX 4.3, OSF/1 5.1, Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcscasecmp.texi b/gnulib/doc/posix-functions/wcscasecmp.texi
new file mode 100644
index 00000000..456f9284
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcscasecmp.texi
@@ -0,0 +1,22 @@
+@node wcscasecmp
+@section @code{wcscasecmp}
+@findex wcscasecmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscasecmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcscasecmp_l.texi b/gnulib/doc/posix-functions/wcscasecmp_l.texi
new file mode 100644
index 00000000..37f4ed74
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcscasecmp_l.texi
@@ -0,0 +1,21 @@
+@node wcscasecmp_l
+@section @code{wcscasecmp_l}
+@findex wcscasecmp_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscasecmp_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcscat.texi b/gnulib/doc/posix-functions/wcscat.texi
new file mode 100644
index 00000000..6a3188bf
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcscat.texi
@@ -0,0 +1,21 @@
+@node wcscat
+@section @code{wcscat}
+@findex wcscat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscat.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcschr.texi b/gnulib/doc/posix-functions/wcschr.texi
new file mode 100644
index 00000000..a823dfa4
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcschr.texi
@@ -0,0 +1,21 @@
+@node wcschr
+@section @code{wcschr}
+@findex wcschr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcschr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcscmp.texi b/gnulib/doc/posix-functions/wcscmp.texi
new file mode 100644
index 00000000..8161645a
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcscmp.texi
@@ -0,0 +1,21 @@
+@node wcscmp
+@section @code{wcscmp}
+@findex wcscmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcscoll.texi b/gnulib/doc/posix-functions/wcscoll.texi
new file mode 100644
index 00000000..c1af0073
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcscoll.texi
@@ -0,0 +1,21 @@
+@node wcscoll
+@section @code{wcscoll}
+@findex wcscoll
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscoll.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcscoll_l.texi b/gnulib/doc/posix-functions/wcscoll_l.texi
new file mode 100644
index 00000000..250f1fae
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcscoll_l.texi
@@ -0,0 +1,21 @@
+@node wcscoll_l
+@section @code{wcscoll_l}
+@findex wcscoll_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscoll_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcscpy.texi b/gnulib/doc/posix-functions/wcscpy.texi
new file mode 100644
index 00000000..d529e918
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcscpy.texi
@@ -0,0 +1,21 @@
+@node wcscpy
+@section @code{wcscpy}
+@findex wcscpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscpy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcscspn.texi b/gnulib/doc/posix-functions/wcscspn.texi
new file mode 100644
index 00000000..56ddda52
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcscspn.texi
@@ -0,0 +1,21 @@
+@node wcscspn
+@section @code{wcscspn}
+@findex wcscspn
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscspn.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsdup.texi b/gnulib/doc/posix-functions/wcsdup.texi
new file mode 100644
index 00000000..bccc544f
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsdup.texi
@@ -0,0 +1,22 @@
+@node wcsdup
+@section @code{wcsdup}
+@findex wcsdup
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsdup.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsftime.texi b/gnulib/doc/posix-functions/wcsftime.texi
new file mode 100644
index 00000000..994cb77a
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsftime.texi
@@ -0,0 +1,21 @@
+@node wcsftime
+@section @code{wcsftime}
+@findex wcsftime
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsftime.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcslen.texi b/gnulib/doc/posix-functions/wcslen.texi
new file mode 100644
index 00000000..d679ee8b
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcslen.texi
@@ -0,0 +1,21 @@
+@node wcslen
+@section @code{wcslen}
+@findex wcslen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcslen.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsncasecmp.texi b/gnulib/doc/posix-functions/wcsncasecmp.texi
new file mode 100644
index 00000000..b077c912
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsncasecmp.texi
@@ -0,0 +1,22 @@
+@node wcsncasecmp
+@section @code{wcsncasecmp}
+@findex wcsncasecmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsncasecmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsncasecmp_l.texi b/gnulib/doc/posix-functions/wcsncasecmp_l.texi
new file mode 100644
index 00000000..55108f60
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsncasecmp_l.texi
@@ -0,0 +1,21 @@
+@node wcsncasecmp_l
+@section @code{wcsncasecmp_l}
+@findex wcsncasecmp_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsncasecmp_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on all non-glibc platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsncat.texi b/gnulib/doc/posix-functions/wcsncat.texi
new file mode 100644
index 00000000..236dc6cb
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsncat.texi
@@ -0,0 +1,21 @@
+@node wcsncat
+@section @code{wcsncat}
+@findex wcsncat
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsncat.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsncmp.texi b/gnulib/doc/posix-functions/wcsncmp.texi
new file mode 100644
index 00000000..7d606c0d
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsncmp.texi
@@ -0,0 +1,21 @@
+@node wcsncmp
+@section @code{wcsncmp}
+@findex wcsncmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsncmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsncpy.texi b/gnulib/doc/posix-functions/wcsncpy.texi
new file mode 100644
index 00000000..b23d2c77
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsncpy.texi
@@ -0,0 +1,21 @@
+@node wcsncpy
+@section @code{wcsncpy}
+@findex wcsncpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsncpy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsnlen.texi b/gnulib/doc/posix-functions/wcsnlen.texi
new file mode 100644
index 00000000..f633d64e
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsnlen.texi
@@ -0,0 +1,22 @@
+@node wcsnlen
+@section @code{wcsnlen}
+@findex wcsnlen
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsnlen.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsnrtombs.texi b/gnulib/doc/posix-functions/wcsnrtombs.texi
new file mode 100644
index 00000000..625fac41
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsnrtombs.texi
@@ -0,0 +1,22 @@
+@node wcsnrtombs
+@section @code{wcsnrtombs}
+@findex wcsnrtombs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsnrtombs.html}
+
+Gnulib module: wcsnrtombs
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX
+11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcspbrk.texi b/gnulib/doc/posix-functions/wcspbrk.texi
new file mode 100644
index 00000000..9464beda
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcspbrk.texi
@@ -0,0 +1,21 @@
+@node wcspbrk
+@section @code{wcspbrk}
+@findex wcspbrk
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcspbrk.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsrchr.texi b/gnulib/doc/posix-functions/wcsrchr.texi
new file mode 100644
index 00000000..95e295c2
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsrchr.texi
@@ -0,0 +1,21 @@
+@node wcsrchr
+@section @code{wcsrchr}
+@findex wcsrchr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsrchr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsrtombs.texi b/gnulib/doc/posix-functions/wcsrtombs.texi
new file mode 100644
index 00000000..7a100cef
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsrtombs.texi
@@ -0,0 +1,27 @@
+@node wcsrtombs
+@section @code{wcsrtombs}
+@findex wcsrtombs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsrtombs.html}
+
+Gnulib module: wcsrtombs
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, mingw, Interix 3.5.
+@item
+This function may set the source pointer to NULL before NUL terminating the destination string on some platforms:
+OSF/1 5.1.
+@item
+This function updates the source pointer also if the destination argument is NULL on some platforms:
+HP-UX 11, OSF/1 5.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsspn.texi b/gnulib/doc/posix-functions/wcsspn.texi
new file mode 100644
index 00000000..bf6aeb29
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsspn.texi
@@ -0,0 +1,21 @@
+@node wcsspn
+@section @code{wcsspn}
+@findex wcsspn
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsspn.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsstr.texi b/gnulib/doc/posix-functions/wcsstr.texi
new file mode 100644
index 00000000..fab4008a
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsstr.texi
@@ -0,0 +1,21 @@
+@node wcsstr
+@section @code{wcsstr}
+@findex wcsstr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsstr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 5.3, Solaris 2.6.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstod.texi b/gnulib/doc/posix-functions/wcstod.texi
new file mode 100644
index 00000000..f7dea788
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstod.texi
@@ -0,0 +1,21 @@
+@node wcstod
+@section @code{wcstod}
+@findex wcstod
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstod.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstof.texi b/gnulib/doc/posix-functions/wcstof.texi
new file mode 100644
index 00000000..3a7bf1b0
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstof.texi
@@ -0,0 +1,22 @@
+@node wcstof
+@section @code{wcstof}
+@findex wcstof
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstof.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1,
+Solaris 9, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstoimax.texi b/gnulib/doc/posix-functions/wcstoimax.texi
new file mode 100644
index 00000000..d0f1e1ce
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstoimax.texi
@@ -0,0 +1,22 @@
+@node wcstoimax
+@section @code{wcstoimax}
+@findex wcstoimax
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstoimax.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin
+1.5.x, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstok.texi b/gnulib/doc/posix-functions/wcstok.texi
new file mode 100644
index 00000000..92fb5e53
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstok.texi
@@ -0,0 +1,21 @@
+@node wcstok
+@section @code{wcstok}
+@findex wcstok
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstok.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstol.texi b/gnulib/doc/posix-functions/wcstol.texi
new file mode 100644
index 00000000..5ef716e5
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstol.texi
@@ -0,0 +1,21 @@
+@node wcstol
+@section @code{wcstol}
+@findex wcstol
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstol.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstold.texi b/gnulib/doc/posix-functions/wcstold.texi
new file mode 100644
index 00000000..d57ed528
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstold.texi
@@ -0,0 +1,21 @@
+@node wcstold
+@section @code{wcstold}
+@findex wcstold
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstold.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstoll.texi b/gnulib/doc/posix-functions/wcstoll.texi
new file mode 100644
index 00000000..f4c4caac
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstoll.texi
@@ -0,0 +1,21 @@
+@node wcstoll
+@section @code{wcstoll}
+@findex wcstoll
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstoll.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, OSF/1 5.1, Solaris 9, Cygwin 1.5.x, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstombs.texi b/gnulib/doc/posix-functions/wcstombs.texi
new file mode 100644
index 00000000..c65d55d1
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstombs.texi
@@ -0,0 +1,18 @@
+@node wcstombs
+@section @code{wcstombs}
+@findex wcstombs
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstombs.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstoul.texi b/gnulib/doc/posix-functions/wcstoul.texi
new file mode 100644
index 00000000..f5ac380b
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstoul.texi
@@ -0,0 +1,21 @@
+@node wcstoul
+@section @code{wcstoul}
+@findex wcstoul
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstoul.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstoull.texi b/gnulib/doc/posix-functions/wcstoull.texi
new file mode 100644
index 00000000..ea3814d9
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstoull.texi
@@ -0,0 +1,21 @@
+@node wcstoull
+@section @code{wcstoull}
+@findex wcstoull
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstoull.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11, IRIX 5.3, OSF/1 5.1, Solaris 9, Cygwin 1.5.x, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcstoumax.texi b/gnulib/doc/posix-functions/wcstoumax.texi
new file mode 100644
index 00000000..8e2f7db8
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcstoumax.texi
@@ -0,0 +1,22 @@
+@node wcstoumax
+@section @code{wcstoumax}
+@findex wcstoumax
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstoumax.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin
+1.5.x, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcswidth.texi b/gnulib/doc/posix-functions/wcswidth.texi
new file mode 100644
index 00000000..7972f996
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcswidth.texi
@@ -0,0 +1,21 @@
+@node wcswidth
+@section @code{wcswidth}
+@findex wcswidth
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcswidth.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+OpenBSD 3.8, IRIX 5.3, Solaris 2.5.1, mingw, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsxfrm.texi b/gnulib/doc/posix-functions/wcsxfrm.texi
new file mode 100644
index 00000000..97829c26
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsxfrm.texi
@@ -0,0 +1,21 @@
+@node wcsxfrm
+@section @code{wcsxfrm}
+@findex wcsxfrm
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsxfrm.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcsxfrm_l.texi b/gnulib/doc/posix-functions/wcsxfrm_l.texi
new file mode 100644
index 00000000..a6447116
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcsxfrm_l.texi
@@ -0,0 +1,21 @@
+@node wcsxfrm_l
+@section @code{wcsxfrm_l}
+@findex wcsxfrm_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcsxfrm_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wctob.texi b/gnulib/doc/posix-functions/wctob.texi
new file mode 100644
index 00000000..ea99ddd0
--- /dev/null
+++ b/gnulib/doc/posix-functions/wctob.texi
@@ -0,0 +1,27 @@
+@node wctob
+@section @code{wctob}
+@findex wctob
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wctob.html}
+
+Gnulib module: wctob
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 5.3, Solaris 2.6, mingw, Interix 3.5.
+@item
+This function does not work on some platforms:
+Solaris 9.
+@item
+This function is missing a declaration on some platforms:
+IRIX 6.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wctomb.texi b/gnulib/doc/posix-functions/wctomb.texi
new file mode 100644
index 00000000..880dbfbb
--- /dev/null
+++ b/gnulib/doc/posix-functions/wctomb.texi
@@ -0,0 +1,18 @@
+@node wctomb
+@section @code{wctomb}
+@findex wctomb
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wctomb.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wctrans.texi b/gnulib/doc/posix-functions/wctrans.texi
new file mode 100644
index 00000000..dc28dfeb
--- /dev/null
+++ b/gnulib/doc/posix-functions/wctrans.texi
@@ -0,0 +1,21 @@
+@node wctrans
+@section @code{wctrans}
+@findex wctrans
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wctrans.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.5.1, mingw, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wctrans_l.texi b/gnulib/doc/posix-functions/wctrans_l.texi
new file mode 100644
index 00000000..f218695c
--- /dev/null
+++ b/gnulib/doc/posix-functions/wctrans_l.texi
@@ -0,0 +1,21 @@
+@node wctrans_l
+@section @code{wctrans_l}
+@findex wctrans_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wctrans_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wctype.texi b/gnulib/doc/posix-functions/wctype.texi
new file mode 100644
index 00000000..f921a905
--- /dev/null
+++ b/gnulib/doc/posix-functions/wctype.texi
@@ -0,0 +1,21 @@
+@node wctype
+@section @code{wctype}
+@findex wctype
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wctype.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, mingw.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wctype_l.texi b/gnulib/doc/posix-functions/wctype_l.texi
new file mode 100644
index 00000000..59861ee9
--- /dev/null
+++ b/gnulib/doc/posix-functions/wctype_l.texi
@@ -0,0 +1,21 @@
+@node wctype_l
+@section @code{wctype_l}
+@findex wctype_l
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wctype_l.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wcwidth.texi b/gnulib/doc/posix-functions/wcwidth.texi
new file mode 100644
index 00000000..1bf58b75
--- /dev/null
+++ b/gnulib/doc/posix-functions/wcwidth.texi
@@ -0,0 +1,25 @@
+@node wcwidth
+@section @code{wcwidth}
+@findex wcwidth
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcwidth.html}
+
+Gnulib module: wcwidth
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, mingw, BeOS.
+@item
+This function handles combining characters in UTF-8 locales incorrectly on some
+platforms:
+MacOS X 10.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wmemchr.texi b/gnulib/doc/posix-functions/wmemchr.texi
new file mode 100644
index 00000000..32a3baf2
--- /dev/null
+++ b/gnulib/doc/posix-functions/wmemchr.texi
@@ -0,0 +1,21 @@
+@node wmemchr
+@section @code{wmemchr}
+@findex wmemchr
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wmemchr.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wmemcmp.texi b/gnulib/doc/posix-functions/wmemcmp.texi
new file mode 100644
index 00000000..b133eeec
--- /dev/null
+++ b/gnulib/doc/posix-functions/wmemcmp.texi
@@ -0,0 +1,21 @@
+@node wmemcmp
+@section @code{wmemcmp}
+@findex wmemcmp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wmemcmp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wmemcpy.texi b/gnulib/doc/posix-functions/wmemcpy.texi
new file mode 100644
index 00000000..96ac46d0
--- /dev/null
+++ b/gnulib/doc/posix-functions/wmemcpy.texi
@@ -0,0 +1,21 @@
+@node wmemcpy
+@section @code{wmemcpy}
+@findex wmemcpy
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wmemcpy.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wmemmove.texi b/gnulib/doc/posix-functions/wmemmove.texi
new file mode 100644
index 00000000..6114d320
--- /dev/null
+++ b/gnulib/doc/posix-functions/wmemmove.texi
@@ -0,0 +1,21 @@
+@node wmemmove
+@section @code{wmemmove}
+@findex wmemmove
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wmemmove.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wmemset.texi b/gnulib/doc/posix-functions/wmemset.texi
new file mode 100644
index 00000000..b6266eac
--- /dev/null
+++ b/gnulib/doc/posix-functions/wmemset.texi
@@ -0,0 +1,21 @@
+@node wmemset
+@section @code{wmemset}
+@findex wmemset
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wmemset.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix 3.5.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wordexp.texi b/gnulib/doc/posix-functions/wordexp.texi
new file mode 100644
index 00000000..67539eaf
--- /dev/null
+++ b/gnulib/doc/posix-functions/wordexp.texi
@@ -0,0 +1,18 @@
+@node wordexp
+@section @code{wordexp}
+@findex wordexp
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wordexp.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, IRIX 5.3, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wordfree.texi b/gnulib/doc/posix-functions/wordfree.texi
new file mode 100644
index 00000000..af46fa47
--- /dev/null
+++ b/gnulib/doc/posix-functions/wordfree.texi
@@ -0,0 +1,18 @@
+@node wordfree
+@section @code{wordfree}
+@findex wordfree
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wordfree.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, IRIX 5.3, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wprintf.texi b/gnulib/doc/posix-functions/wprintf.texi
new file mode 100644
index 00000000..e1f3ccf0
--- /dev/null
+++ b/gnulib/doc/posix-functions/wprintf.texi
@@ -0,0 +1,25 @@
+@node wprintf
+@section @code{wprintf}
+@findex wprintf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wprintf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix
+3.5, BeOS.
+@item
+This function exists, but does not support wide arguments on some
+platforms: Cygwin 1.5.x.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/write.texi b/gnulib/doc/posix-functions/write.texi
new file mode 100644
index 00000000..d45ecff8
--- /dev/null
+++ b/gnulib/doc/posix-functions/write.texi
@@ -0,0 +1,20 @@
+@node write
+@section @code{write}
+@findex write
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/write.html}
+
+Gnulib module: write, sigpipe
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+When writing to a pipe with no readers, this function fails with error
+@code{EINVAL}, instead of obeying the current @code{SIGPIPE} handler, on
+some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/writev.texi b/gnulib/doc/posix-functions/writev.texi
new file mode 100644
index 00000000..98166705
--- /dev/null
+++ b/gnulib/doc/posix-functions/writev.texi
@@ -0,0 +1,18 @@
+@node writev
+@section @code{writev}
+@findex writev
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/writev.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-functions/wscanf.texi b/gnulib/doc/posix-functions/wscanf.texi
new file mode 100644
index 00000000..6b16b9ec
--- /dev/null
+++ b/gnulib/doc/posix-functions/wscanf.texi
@@ -0,0 +1,21 @@
+@node wscanf
+@section @code{wscanf}
+@findex wscanf
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wscanf.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This function is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, HP-UX 11.00, IRIX 6.5, Solaris 2.6, Cygwin 1.5.x, Interix 3.5, BeOS.
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
+accommodate all Unicode characters.
+@end itemize
diff --git a/gnulib/doc/posix-functions/y0.texi b/gnulib/doc/posix-functions/y0.texi
new file mode 100644
index 00000000..1b215025
--- /dev/null
+++ b/gnulib/doc/posix-functions/y0.texi
@@ -0,0 +1,15 @@
+@node y0
+@section @code{y0}
+@findex y0
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/y0.html}
+
+Gnulib module: y0
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/y1.texi b/gnulib/doc/posix-functions/y1.texi
new file mode 100644
index 00000000..6e703a05
--- /dev/null
+++ b/gnulib/doc/posix-functions/y1.texi
@@ -0,0 +1,15 @@
+@node y1
+@section @code{y1}
+@findex y1
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/y1.html}
+
+Gnulib module: y1
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-functions/yn.texi b/gnulib/doc/posix-functions/yn.texi
new file mode 100644
index 00000000..fef9d5de
--- /dev/null
+++ b/gnulib/doc/posix-functions/yn.texi
@@ -0,0 +1,15 @@
+@node yn
+@section @code{yn}
+@findex yn
+
+POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/yn.html}
+
+Gnulib module: yn
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/aio.texi b/gnulib/doc/posix-headers/aio.texi
new file mode 100644
index 00000000..9d0ae2d8
--- /dev/null
+++ b/gnulib/doc/posix-headers/aio.texi
@@ -0,0 +1,17 @@
+@node aio.h
+@section @file{aio.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/aio.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/arpa_inet.texi b/gnulib/doc/posix-headers/arpa_inet.texi
new file mode 100644
index 00000000..195c4dcd
--- /dev/null
+++ b/gnulib/doc/posix-headers/arpa_inet.texi
@@ -0,0 +1,16 @@
+@node arpa/inet.h
+@section @file{arpa/inet.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/arpa/inet.h.html}
+
+Gnulib module: arpa_inet
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms: mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/assert.texi b/gnulib/doc/posix-headers/assert.texi
new file mode 100644
index 00000000..4652958c
--- /dev/null
+++ b/gnulib/doc/posix-headers/assert.texi
@@ -0,0 +1,14 @@
+@node assert.h
+@section @file{assert.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/assert.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/complex.texi b/gnulib/doc/posix-headers/complex.texi
new file mode 100644
index 00000000..2ab76ab6
--- /dev/null
+++ b/gnulib/doc/posix-headers/complex.texi
@@ -0,0 +1,18 @@
+@node complex.h
+@section @file{complex.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/complex.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Cygwin, mingw,
+Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/cpio.texi b/gnulib/doc/posix-headers/cpio.texi
new file mode 100644
index 00000000..de57e6c9
--- /dev/null
+++ b/gnulib/doc/posix-headers/cpio.texi
@@ -0,0 +1,17 @@
+@node cpio.h
+@section @file{cpio.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/cpio.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/ctype.texi b/gnulib/doc/posix-headers/ctype.texi
new file mode 100644
index 00000000..643bf379
--- /dev/null
+++ b/gnulib/doc/posix-headers/ctype.texi
@@ -0,0 +1,14 @@
+@node ctype.h
+@section @file{ctype.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/ctype.h.html}
+
+Gnulib module: ctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/dirent.texi b/gnulib/doc/posix-headers/dirent.texi
new file mode 100644
index 00000000..439947a2
--- /dev/null
+++ b/gnulib/doc/posix-headers/dirent.texi
@@ -0,0 +1,17 @@
+@node dirent.h
+@section @file{dirent.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/dirent.h.html}
+
+Gnulib module: dirent
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The type @code{ino_t} is missing on some platforms:
+glibc 2.8 and others.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/dlfcn.texi b/gnulib/doc/posix-headers/dlfcn.texi
new file mode 100644
index 00000000..d1f20c64
--- /dev/null
+++ b/gnulib/doc/posix-headers/dlfcn.texi
@@ -0,0 +1,17 @@
+@node dlfcn.h
+@section @file{dlfcn.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/dlfcn.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/errno.texi b/gnulib/doc/posix-headers/errno.texi
new file mode 100644
index 00000000..e0a98e3c
--- /dev/null
+++ b/gnulib/doc/posix-headers/errno.texi
@@ -0,0 +1,38 @@
+@node errno.h
+@section @file{errno.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/errno.h.html}
+
+Gnulib module: errno
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The macros @code{EOVERFLOW}, @code{ENOLINK}, @code{EMULTIHOP} are not defined
+on some platforms:
+OpenBSD 4.0, OSF/1 5.1, mingw.
+@item
+The macro @code{ECANCELED} is not defined on some platforms:
+OpenBSD 4.0, Cygwin, mingw.
+@item
+The macros @code{ENOMSG}, @code{EIDRM}, @code{EPROTO}, @code{EBADMSG},
+@code{ENOTSUP} are not defined on some platforms:
+OpenBSD 4.0, mingw.
+@item
+The macro @code{ESTALE} is not defined on some platforms:
+mingw, Interix 3.5.
+@item
+The macros @code{EWOULDBLOCK}, @code{ETXTBSY}, @code{ELOOP}, @code{ENOTSOCK},
+@code{EDESTADDRREQ}, @code{EMSGSIZE}, @code{EPROTOTYPE}, @code{ENOPROTOOPT},
+@code{EPROTONOSUPPORT}, @code{EOPNOTSUPP}, @code{EAFNOSUPPORT},
+@code{EADDRINUSE}, @code{EADDRNOTAVAIL}, @code{ENETDOWN}, @code{ENETUNREACH},
+@code{ENETRESET}, @code{ECONNABORTED}, @code{ECONNRESET}, @code{ENOBUFS},
+@code{EISCONN}, @code{ENOTCONN}, @code{ETIMEDOUT}, @code{ECONNREFUSED},
+@code{EHOSTUNREACH}, @code{EALREADY}, @code{EINPROGRESS}, @code{EDQUOT} are
+not defined on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/fcntl.texi b/gnulib/doc/posix-headers/fcntl.texi
new file mode 100644
index 00000000..97cd12a2
--- /dev/null
+++ b/gnulib/doc/posix-headers/fcntl.texi
@@ -0,0 +1,70 @@
+@node fcntl.h
+@section @file{fcntl.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/fcntl.h.html}
+
+Gnulib module: fcntl-h
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+@samp{O_NOCTTY}, @samp{O_DSYNC}, @samp{O_NONBLOCK}, @samp{O_RSYNC},
+@samp{O_SYNC}, @samp{O_DIRECTORY}, @samp{O_NOFOLLOW}, and
+@samp{O_TTY_INIT} are not defined on some platforms.
+
+@item
+@samp{O_BINARY}, @samp{O_TEXT} (not specified by POSIX, but essential for
+portability to Woe32 platforms) are defined on some platforms but not on
+others.
+
+@item
+@samp{O_DIRECT}, @samp{O_NDELAY}, @samp{O_NOATIME},
+and @samp{O_NOLINKS} (not specified by POSIX) are defined
+on some platforms but not on others.
+
+@item
+@samp{FD_CLOEXEC}, @samp{F_DUPFD}, and @samp{F_GETFD} are not defined
+on some platforms:
+mingw.
+
+@item
+@samp{F_DUPFD_CLOEXEC} is not defined on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.7.1, mingw, Interix 3.5,
+BeOS.
+
+@item
+@samp{AT_FDCWD}, @samp{AT_EACCESS}, @samp{AT_SYMLINK_NOFOLLOW},
+@samp{AT_SYMLINK_FOLLOW}, and @samp{AT_REMOVEDIR}
+are not defined on many platforms:
+glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 8, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+
+@item
+@samp{AT_FDCWD} is defined with a value too large for an @code{int} on some
+platforms:
+Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+@samp{O_CLOEXEC} is not defined on some platforms. The gnulib
+replacement is not atomic on these platforms.
+
+@item
+@samp{O_SEARCH} and @samp{O_EXEC} are not defined
+on some platforms.
+
+@item
+@samp{F_SETFD}, @samp{F_GETFL}, @samp{F_SETFL}, @samp{F_GETLK},
+@samp{F_SETLK}, @samp{F_SETLOKW}, @samp{F_GETOWN}, and @samp{F_SETOWN}
+are not defined on some platforms:
+mingw.
+
+@item
+@samp{POSIX_FADV_DONTNEED}, @samp{POSIX_FADV_NOREUSE},
+@samp{POSIX_FADV_NORMAL}, @samp{POSIX_FADV_RANDOM},
+@samp{POSIX_FADV_SEQUENTIAL}, and @samp{POSIX_FADV_WILLNEED} are not
+defined on some platforms.
+@end itemize
diff --git a/gnulib/doc/posix-headers/fenv.texi b/gnulib/doc/posix-headers/fenv.texi
new file mode 100644
index 00000000..e76a584f
--- /dev/null
+++ b/gnulib/doc/posix-headers/fenv.texi
@@ -0,0 +1,18 @@
+@node fenv.h
+@section @file{fenv.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/fenv.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, IRIX 6.5, OSF/1 5.1, Cygwin,
+Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/float.texi b/gnulib/doc/posix-headers/float.texi
new file mode 100644
index 00000000..79985607
--- /dev/null
+++ b/gnulib/doc/posix-headers/float.texi
@@ -0,0 +1,19 @@
+@node float.h
+@section @file{float.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/float.h.html}
+
+Gnulib module: float
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The values of @code{LDBL_*} macros are incorrect on some platforms:
+On OpenBSD 4.0 and BeOS, they are the same as the values of the
+@code{DBL_*} macros, although @samp{long double} is a larger type than
+@samp{double}.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/fmtmsg.texi b/gnulib/doc/posix-headers/fmtmsg.texi
new file mode 100644
index 00000000..6d7f793a
--- /dev/null
+++ b/gnulib/doc/posix-headers/fmtmsg.texi
@@ -0,0 +1,17 @@
+@node fmtmsg.h
+@section @file{fmtmsg.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/fmtmsg.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/fnmatch.texi b/gnulib/doc/posix-headers/fnmatch.texi
new file mode 100644
index 00000000..8875025f
--- /dev/null
+++ b/gnulib/doc/posix-headers/fnmatch.texi
@@ -0,0 +1,17 @@
+@node fnmatch.h
+@section @file{fnmatch.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/fnmatch.h.html}
+
+Gnulib module: fnmatch-posix or fnmatch-gnu
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/ftw.texi b/gnulib/doc/posix-headers/ftw.texi
new file mode 100644
index 00000000..3ce3160e
--- /dev/null
+++ b/gnulib/doc/posix-headers/ftw.texi
@@ -0,0 +1,17 @@
+@node ftw.h
+@section @file{ftw.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/ftw.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/glob.texi b/gnulib/doc/posix-headers/glob.texi
new file mode 100644
index 00000000..ec561092
--- /dev/null
+++ b/gnulib/doc/posix-headers/glob.texi
@@ -0,0 +1,17 @@
+@node glob.h
+@section @file{glob.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/glob.h.html}
+
+Gnulib module: glob
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/google-ranking.txt b/gnulib/doc/posix-headers/google-ranking.txt
new file mode 100644
index 00000000..fc2b0396
--- /dev/null
+++ b/gnulib/doc/posix-headers/google-ranking.txt
@@ -0,0 +1,84 @@
+<stdio.h> 678000
+<string.h> 589000
+<stdlib.h> 548000
+<unistd.h> 448000
+<sys/types.h> 319000
+<netdb.h> 700
+<sys/wait.h> 600
+<sys/timeb.h> 600
+<sys/resource.h> 600
+<stdarg.h> 600
+<signal.h> 600
+<regex.h> 600
+<netinet/in.h> 600
+<limits.h> 600
+<libgen.h> 600
+<arpa/inet.h> 600
+<wchar.h> 500
+<termios.h> 500
+<sys/un.h> 500
+<sys/uio.h> 500
+<sys/times.h> 500
+<sys/time.h> 500
+<sys/socket.h> 500
+<sys/sem.h> 500
+<sys/select.h> 500
+<stdint.h> 500
+<stdbool.h> 500
+<setjmp.h> 500
+<sched.h> 500
+<pwd.h> 500
+<pthread.h> 500
+<netinet/tcp.h> 500
+<math.h> 500
+<locale.h> 500
+<iconv.h> 500
+<float.h> 500
+<fcntl.h> 500
+<dlfcn.h> 500
+<dirent.h> 500
+<assert.h> 500
+<wctype.h> 400
+<time.h> 400
+<syslog.h> 400
+<sys/utsname.h> 400
+<sys/statvfs.h> 400
+<sys/stat.h> 400
+<sys/shm.h> 400
+<sys/ipc.h> 400
+<stropts.h> 400
+<strings.h> 400
+<semaphore.h> 400
+<search.h> 400
+<poll.h> 400
+<net/if.h> 400
+<ndbm.h> 400
+<langinfo.h> 400
+<inttypes.h> 400
+<grp.h> 400
+<glob.h> 400
+<fnmatch.h> 400
+<errno.h> 400
+<ctype.h> 400
+<utmpx.h> 300
+<utime.h> 300
+<ucontext.h> 300
+<sys/msg.h> 300
+<sys/mman.h> 300
+<stddef.h> 300
+<nl_types.h> 300
+<complex.h> 300
+<ftw.h> 200
+<fenv.h> 200
+<wordexp.h> 100
+<ulimit.h> 100
+<trace.h> 100
+<mqueue.h> 100
+<aio.h> 100
+<tgmath.h> 50
+<tar.h> 50
+<spawn.h> 50
+<monetary.h> 50
+<iso646.h> 50
+<fmtmsg.h> 50
+<cpio.h> 50
diff --git a/gnulib/doc/posix-headers/grp.texi b/gnulib/doc/posix-headers/grp.texi
new file mode 100644
index 00000000..923f2fbd
--- /dev/null
+++ b/gnulib/doc/posix-headers/grp.texi
@@ -0,0 +1,17 @@
+@node grp.h
+@section @file{grp.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/grp.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-headers/iconv.texi b/gnulib/doc/posix-headers/iconv.texi
new file mode 100644
index 00000000..4cd753d0
--- /dev/null
+++ b/gnulib/doc/posix-headers/iconv.texi
@@ -0,0 +1,21 @@
+@node iconv.h
+@section @file{iconv.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/iconv.h.html}
+
+Gnulib module: iconv
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The <iconv.h> from GNU libiconv is not found if installed in
+@file{$PREFIX/include}.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS,
+when GNU libiconv is not installed.
+@end itemize
diff --git a/gnulib/doc/posix-headers/inttypes.texi b/gnulib/doc/posix-headers/inttypes.texi
new file mode 100644
index 00000000..cecf6153
--- /dev/null
+++ b/gnulib/doc/posix-headers/inttypes.texi
@@ -0,0 +1,29 @@
+@node inttypes.h
+@section @file{inttypes.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/inttypes.h.html}
+
+Gnulib module: inttypes
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+OSF/1 4.0, Interix 3.5.
+@item
+This header file is very incomplete on some platforms.
+@item
+The PRI* macros are defined to non-string values on AIX 4.3.3.
+@item
+The declarations of @code{imaxabs} and @code{imaxdiv} are missing on some
+platforms:
+NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, BeOS.
+@item
+The declarations of @code{strtoimax} and @code{strtoumax} are missing on some
+platforms:
+OpenBSD 3.8, AIX 4.3.2, AIX 5.1 (missing only @code{strtoumax}), OSF/1 5.1.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/iso646.texi b/gnulib/doc/posix-headers/iso646.texi
new file mode 100644
index 00000000..12b7fec7
--- /dev/null
+++ b/gnulib/doc/posix-headers/iso646.texi
@@ -0,0 +1,17 @@
+@node iso646.h
+@section @file{iso646.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/iso646.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+HP-UX 11, IRIX 6.5, OSF/1 4.0, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/langinfo.texi b/gnulib/doc/posix-headers/langinfo.texi
new file mode 100644
index 00000000..05fa9da8
--- /dev/null
+++ b/gnulib/doc/posix-headers/langinfo.texi
@@ -0,0 +1,24 @@
+@node langinfo.h
+@section @file{langinfo.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/langinfo.h.html}
+
+Gnulib module: langinfo
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@item
+The constant @code{CODESET} is not defined on some platforms:
+glibc 2.0.6, OpenBSD 3.8.
+@item
+The constants @code{ERA}, @code{ERA_D_FMT}, @code{ERA_D_T_FMT},
+@code{ERA_T_FMT}, @code{ALT_DIGITS} are not defined on some platforms:
+OpenBSD 3.8.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/libgen.texi b/gnulib/doc/posix-headers/libgen.texi
new file mode 100644
index 00000000..4a293dc3
--- /dev/null
+++ b/gnulib/doc/posix-headers/libgen.texi
@@ -0,0 +1,17 @@
+@node libgen.h
+@section @file{libgen.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/libgen.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/limits.texi b/gnulib/doc/posix-headers/limits.texi
new file mode 100644
index 00000000..f7e280fb
--- /dev/null
+++ b/gnulib/doc/posix-headers/limits.texi
@@ -0,0 +1,17 @@
+@node limits.h
+@section @file{limits.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/limits.h.html}
+
+Gnulib module: gethostname
+
+Portability problems fixed by Gnulib:
+@itemize
+The @code{HOST_NAME_MAX} macro is not defined on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/locale.texi b/gnulib/doc/posix-headers/locale.texi
new file mode 100644
index 00000000..8f927770
--- /dev/null
+++ b/gnulib/doc/posix-headers/locale.texi
@@ -0,0 +1,26 @@
+@node locale.h
+@section @file{locale.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/locale.h.html}
+
+Gnulib module: locale
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The definition of @samp{LC_MESSAGES} is missing on some platforms:
+mingw.
+
+@item
+The @code{locale_t} type is not defined on some platforms:
+glibc 2.11, MacOS X 10.5.
+
+@item
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
+expressions:
+NetBSD 5.0
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/math.texi b/gnulib/doc/posix-headers/math.texi
new file mode 100644
index 00000000..a0fa6aaf
--- /dev/null
+++ b/gnulib/doc/posix-headers/math.texi
@@ -0,0 +1,30 @@
+@node math.h
+@section @file{math.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/math.h.html}
+
+Gnulib module: math
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The macro @code{NAN} is not defined on some platforms:
+OpenBSD 4.0, AIX 5.1, IRIX 6.5, OSF/1 5.1.
+
+@item
+The macro @code{NAN} is not exposed outside of C99 compilation on some
+platforms:
+glibc.
+
+@item
+The macros @code{NAN} and @code{HUGE_VAL} expand to a function address
+rather than a floating point constant on some platforms:
+Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+@code{NAN} is not a compile time constant with some compilers:
+OSF/1 with Compaq (ex-DEC) C 6.4.
+@end itemize
diff --git a/gnulib/doc/posix-headers/monetary.texi b/gnulib/doc/posix-headers/monetary.texi
new file mode 100644
index 00000000..c195cb29
--- /dev/null
+++ b/gnulib/doc/posix-headers/monetary.texi
@@ -0,0 +1,17 @@
+@node monetary.h
+@section @file{monetary.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/monetary.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/mqueue.texi b/gnulib/doc/posix-headers/mqueue.texi
new file mode 100644
index 00000000..f702814e
--- /dev/null
+++ b/gnulib/doc/posix-headers/mqueue.texi
@@ -0,0 +1,18 @@
+@node mqueue.h
+@section @file{mqueue.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/mqueue.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, Interix 3.5,
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/ndbm.texi b/gnulib/doc/posix-headers/ndbm.texi
new file mode 100644
index 00000000..1fa234f5
--- /dev/null
+++ b/gnulib/doc/posix-headers/ndbm.texi
@@ -0,0 +1,17 @@
+@node ndbm.h
+@section @file{ndbm.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/ndbm.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/net_if.texi b/gnulib/doc/posix-headers/net_if.texi
new file mode 100644
index 00000000..a026b832
--- /dev/null
+++ b/gnulib/doc/posix-headers/net_if.texi
@@ -0,0 +1,17 @@
+@node net/if.h
+@section @file{net/if.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/net/if.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/netdb.texi b/gnulib/doc/posix-headers/netdb.texi
new file mode 100644
index 00000000..533424c4
--- /dev/null
+++ b/gnulib/doc/posix-headers/netdb.texi
@@ -0,0 +1,26 @@
+@node netdb.h
+@section @file{netdb.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/netdb.h.html}
+
+Gnulib module: netdb
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+
+@item
+This header file is incomplete on some platforms:
+Cygwin 1.5.x, Haiku.
+
+@item
+This header file does not define @code{AI_ALL}, @code{AI_V4MAPPED},
+@code{AI_ADDRCONFIG} on some platforms:
+NetBSD 5.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/netinet_in.texi b/gnulib/doc/posix-headers/netinet_in.texi
new file mode 100644
index 00000000..756d4a58
--- /dev/null
+++ b/gnulib/doc/posix-headers/netinet_in.texi
@@ -0,0 +1,20 @@
+@node netinet/in.h
+@section @file{netinet/in.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/netinet/in.h.html}
+
+Gnulib module: netinet_in
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@item
+This header file is not self-contained on some platforms: it requires
+@code{<sys/types.h>} to be included first.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/netinet_tcp.texi b/gnulib/doc/posix-headers/netinet_tcp.texi
new file mode 100644
index 00000000..7a1eb7d4
--- /dev/null
+++ b/gnulib/doc/posix-headers/netinet_tcp.texi
@@ -0,0 +1,17 @@
+@node netinet/tcp.h
+@section @file{netinet/tcp.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/netinet/tcp.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/nl_types.texi b/gnulib/doc/posix-headers/nl_types.texi
new file mode 100644
index 00000000..a09b04c6
--- /dev/null
+++ b/gnulib/doc/posix-headers/nl_types.texi
@@ -0,0 +1,18 @@
+@node nl_types.h
+@section @file{nl_types.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/nl/types.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/poll.texi b/gnulib/doc/posix-headers/poll.texi
new file mode 100644
index 00000000..dd88ff38
--- /dev/null
+++ b/gnulib/doc/posix-headers/poll.texi
@@ -0,0 +1,17 @@
+@node poll.h
+@section @file{poll.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/poll.h.html}
+
+Gnulib module: poll
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/pthread.texi b/gnulib/doc/posix-headers/pthread.texi
new file mode 100644
index 00000000..facab7a8
--- /dev/null
+++ b/gnulib/doc/posix-headers/pthread.texi
@@ -0,0 +1,17 @@
+@node pthread.h
+@section @file{pthread.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/pthread.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/pwd.texi b/gnulib/doc/posix-headers/pwd.texi
new file mode 100644
index 00000000..5fb1b629
--- /dev/null
+++ b/gnulib/doc/posix-headers/pwd.texi
@@ -0,0 +1,17 @@
+@node pwd.h
+@section @file{pwd.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/pwd.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-headers/regex.texi b/gnulib/doc/posix-headers/regex.texi
new file mode 100644
index 00000000..656ab1ed
--- /dev/null
+++ b/gnulib/doc/posix-headers/regex.texi
@@ -0,0 +1,20 @@
+@node regex.h
+@section @file{regex.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/regex.h.html}
+
+Gnulib module: regex
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is not self-contained on some platforms: it requires
+@code{<sys/types.h>} to be included first.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sched.texi b/gnulib/doc/posix-headers/sched.texi
new file mode 100644
index 00000000..6994105d
--- /dev/null
+++ b/gnulib/doc/posix-headers/sched.texi
@@ -0,0 +1,24 @@
+@node sched.h
+@section @file{sched.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sched.h.html}
+
+Gnulib module: sched
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@item
+@code{struct sched_param} is not defined on some platforms:
+Haiku.
+@item
+@code{SCHED_FIFO}, @code{SCHED_RR}, @code{SCHED_OTHER} are not defined on
+some platforms:
+Haiku.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/search.texi b/gnulib/doc/posix-headers/search.texi
new file mode 100644
index 00000000..a6bba09a
--- /dev/null
+++ b/gnulib/doc/posix-headers/search.texi
@@ -0,0 +1,17 @@
+@node search.h
+@section @file{search.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/search.h.html}
+
+Gnulib module: search
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/semaphore.texi b/gnulib/doc/posix-headers/semaphore.texi
new file mode 100644
index 00000000..8dbde752
--- /dev/null
+++ b/gnulib/doc/posix-headers/semaphore.texi
@@ -0,0 +1,17 @@
+@node semaphore.h
+@section @file{semaphore.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/semaphore.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/setjmp.texi b/gnulib/doc/posix-headers/setjmp.texi
new file mode 100644
index 00000000..c7a45b24
--- /dev/null
+++ b/gnulib/doc/posix-headers/setjmp.texi
@@ -0,0 +1,14 @@
+@node setjmp.h
+@section @file{setjmp.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/setjmp.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/signal.texi b/gnulib/doc/posix-headers/signal.texi
new file mode 100644
index 00000000..05be64b2
--- /dev/null
+++ b/gnulib/doc/posix-headers/signal.texi
@@ -0,0 +1,38 @@
+@node signal.h
+@section @file{signal.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/signal.h.html}
+
+Gnulib module: signal
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+@code{volatile sig_atomic_t} is rejected by older compilers on some
+platforms:
+AIX.
+@item
+@code{sigset_t} is only declared in <sys/types.h> on some platforms:
+mingw.
+@item
+@code{struct sigaction} and @code{siginfo_t} are missing on some
+platforms:
+mingw.
+@item
+@code{struct sigaction} lacks the @code{sa_sigaction} member on some
+platforms:
+Irix 5.3, Interix 3.5.
+@item
+The signal @code{SIGPIPE} is not defined on some platforms:
+mingw.
+@item
+The macro @code{SA_NODEFER} is not defined on some platforms:
+Interix 3.5.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+Many signals are not defined on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-headers/spawn.texi b/gnulib/doc/posix-headers/spawn.texi
new file mode 100644
index 00000000..b60d8a49
--- /dev/null
+++ b/gnulib/doc/posix-headers/spawn.texi
@@ -0,0 +1,18 @@
+@node spawn.h
+@section @file{spawn.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/spawn.h.html}
+
+Gnulib module: spawn
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/stdarg.texi b/gnulib/doc/posix-headers/stdarg.texi
new file mode 100644
index 00000000..d5f80fc0
--- /dev/null
+++ b/gnulib/doc/posix-headers/stdarg.texi
@@ -0,0 +1,17 @@
+@node stdarg.h
+@section @file{stdarg.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/stdarg.h.html}
+
+Gnulib module: stdarg
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some compilers (e.g., AIX 5.3 cc) need to be in c99 mode for the builtin
+@code{va_copy} to work.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/stdbool.texi b/gnulib/doc/posix-headers/stdbool.texi
new file mode 100644
index 00000000..94dca84c
--- /dev/null
+++ b/gnulib/doc/posix-headers/stdbool.texi
@@ -0,0 +1,30 @@
+@node stdbool.h
+@section @file{stdbool.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/stdbool.h.html}
+
+Gnulib module: stdbool
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1.
+@item
+Some compilers have bugs relating to @samp{bool}.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+@code{<stdbool.h>} must be #included before @samp{_Bool} can be used.
+@item
+You cannot assume that @code{_Bool} is a typedef; it might be a macro.
+@item
+Bit-fields of type @samp{bool} are not supported. Portable code
+should use @samp{unsigned int foo : 1;} rather than @samp{bool foo : 1;}.
+@item
+Casts and automatic conversions to @samp{bool} don't test against the
+zero value or the null pointer, as they should. Such casts should only
+be used if the casted value is known to be equal to 0 or 1.
+@end itemize
diff --git a/gnulib/doc/posix-headers/stddef.texi b/gnulib/doc/posix-headers/stddef.texi
new file mode 100644
index 00000000..92ff294c
--- /dev/null
+++ b/gnulib/doc/posix-headers/stddef.texi
@@ -0,0 +1,21 @@
+@node stddef.h
+@section @file{stddef.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/stddef.h.html}
+
+Gnulib module: stddef
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some old platforms fail to provide @code{wchar_t}.
+
+@item
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
+expressions:
+NetBSD 5.0
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/stdint.texi b/gnulib/doc/posix-headers/stdint.texi
new file mode 100644
index 00000000..d927de27
--- /dev/null
+++ b/gnulib/doc/posix-headers/stdint.texi
@@ -0,0 +1,62 @@
+@node stdint.h
+@section @file{stdint.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/stdint.h.html}
+
+Gnulib module: stdint
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Interix 3.5, BeOS.
+@item
+This header file is very incomplete on some platforms.
+@item
+The values of @code{SIG_ATOMIC_MIN} and @code{SIG_ATOMIC_MAX} are incorrect
+on some platforms:
+FreeBSD 6.2 / ia64.
+@item
+The value of @code{WINT_MAX} is incorrect on some platforms:
+mingw.
+@item
+The values of @code{INT8_MAX}, @code{UINT8_MAX} etc. are not usable in
+preprocessor expressions on some platforms:
+HP-UX 11.23.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+@code{@{uint,int@}_fast@{8,16,32,64@}_t} may not correspond to the fastest
+types available on the system.
+@item
+Macros are used instead of typedefs.
+@item
+Some C preprocessors mishandle constants that do not fit in @code{long int}.
+For example, as of 2007, Sun C mishandles @code{#if LLONG_MIN < 0} on
+a platform with 32-bit @code{long int} and 64-bit @code{long long int}.
+Some older preprocessors mishandle constants ending in @code{LL}.
+To work around these problems, compute the value of expressions like
+@code{LONG_MAX < LLONG_MAX} at @code{configure}-time rather than at
+@code{#if}-time.
+@end itemize
+
+The stdint.h module uses @code{#include_next}. If you wish to install
+the generated stdint.h file under another name, typically in order to
+be able to use some of the types defined by stdint.h in your public
+header file, you could use the following Makefile.am-snippet:
+
+@example
+
+BUILT_SOURCES += idn-int.h
+DISTCLEANFILES += idn-int.h
+nodist_include_HEADERS += idn-int.h
+
+idn-int.h:
+ if test -n "$(STDINT_H)"; then \
+ sed -e s/include_next/include/ gl/stdint.h > idn-int.h; \
+ else \
+ echo '#include <stdint.h>' > idn-int.h; \
+ fi
+@end example
diff --git a/gnulib/doc/posix-headers/stdio.texi b/gnulib/doc/posix-headers/stdio.texi
new file mode 100644
index 00000000..ee094f39
--- /dev/null
+++ b/gnulib/doc/posix-headers/stdio.texi
@@ -0,0 +1,27 @@
+@node stdio.h
+@section @file{stdio.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/stdio.h.html}
+
+Gnulib module: stdio
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The type @code{off_t} is missing on some platforms:
+glibc 2.8 and others.
+@item
+The type @code{ssize_t} is missing on some platforms:
+glibc 2.8, MacOS X 10.5, Solaris 10, and others.
+@item
+The type @code{va_list} is missing on some platforms:
+glibc 2.8, OpenBSD 4.0, Solaris 10, and others.
+@item
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
+expressions:
+NetBSD 5.0
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/stdlib.texi b/gnulib/doc/posix-headers/stdlib.texi
new file mode 100644
index 00000000..6ca0c4b2
--- /dev/null
+++ b/gnulib/doc/posix-headers/stdlib.texi
@@ -0,0 +1,24 @@
+@node stdlib.h
+@section @file{stdlib.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/stdlib.h.html}
+
+Gnulib module: stdlib
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+The macros @code{EXIT_SUCCESS} and @code{EXIT_FAILURE} are not defined on
+some platforms.
+@item
+The macro @code{EXIT_FAILURE} is incorrectly defined on Tandem/NSK.
+
+@item
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
+expressions:
+NetBSD 5.0
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/string.texi b/gnulib/doc/posix-headers/string.texi
new file mode 100644
index 00000000..56a5dfce
--- /dev/null
+++ b/gnulib/doc/posix-headers/string.texi
@@ -0,0 +1,18 @@
+@node string.h
+@section @file{string.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/string.h.html}
+
+Gnulib module: string
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
+expressions:
+NetBSD 5.0
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/strings.texi b/gnulib/doc/posix-headers/strings.texi
new file mode 100644
index 00000000..eeaeae43
--- /dev/null
+++ b/gnulib/doc/posix-headers/strings.texi
@@ -0,0 +1,17 @@
+@node strings.h
+@section @file{strings.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/strings.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file defines symbols, such as @samp{index}, often used for
+variables, making debugging harder.
+@end itemize
diff --git a/gnulib/doc/posix-headers/stropts.texi b/gnulib/doc/posix-headers/stropts.texi
new file mode 100644
index 00000000..9c66165d
--- /dev/null
+++ b/gnulib/doc/posix-headers/stropts.texi
@@ -0,0 +1,17 @@
+@node stropts.h
+@section @file{stropts.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/stropts.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_ipc.texi b/gnulib/doc/posix-headers/sys_ipc.texi
new file mode 100644
index 00000000..81e4f67e
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_ipc.texi
@@ -0,0 +1,17 @@
+@node sys/ipc.h
+@section @file{sys/ipc.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/ipc.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_mman.texi b/gnulib/doc/posix-headers/sys_mman.texi
new file mode 100644
index 00000000..c5a8aa94
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_mman.texi
@@ -0,0 +1,17 @@
+@node sys/mman.h
+@section @file{sys/mman.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/mman.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_msg.texi b/gnulib/doc/posix-headers/sys_msg.texi
new file mode 100644
index 00000000..5d8a7b6e
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_msg.texi
@@ -0,0 +1,17 @@
+@node sys/msg.h
+@section @file{sys/msg.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/msg.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_resource.texi b/gnulib/doc/posix-headers/sys_resource.texi
new file mode 100644
index 00000000..8c24e3a5
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_resource.texi
@@ -0,0 +1,22 @@
+@node sys/resource.h
+@section @file{sys/resource.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/resource.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+
+@item
+On some platforms, this header file requires that <sys/types.h> and
+<sys/time.h> already be included:
+FreeBSD 5.0.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_select.texi b/gnulib/doc/posix-headers/sys_select.texi
new file mode 100644
index 00000000..90360657
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_select.texi
@@ -0,0 +1,27 @@
+@node sys/select.h
+@section @file{sys/select.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/select.h.html}
+
+Gnulib module: sys_select
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+HP-UX 11, mingw, BeOS.
+@item
+This header file is not self-contained on some platforms: it requires
+@code{<sys/types.h>} to be included first.
+@item
+This header file does not define @code{struct timeval} on some platforms:
+OSF/1 4.0.
+@item
+This header file is not self-contained --- it requires @code{<string.h>}
+before @code{FD_ZERO} can be used --- on some platforms:
+Solaris 10.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_sem.texi b/gnulib/doc/posix-headers/sys_sem.texi
new file mode 100644
index 00000000..038798f5
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_sem.texi
@@ -0,0 +1,17 @@
+@node sys/sem.h
+@section @file{sys/sem.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/sem.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_shm.texi b/gnulib/doc/posix-headers/sys_shm.texi
new file mode 100644
index 00000000..39477cd9
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_shm.texi
@@ -0,0 +1,17 @@
+@node sys/shm.h
+@section @file{sys/shm.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/shm.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_socket.texi b/gnulib/doc/posix-headers/sys_socket.texi
new file mode 100644
index 00000000..4680fa2f
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_socket.texi
@@ -0,0 +1,25 @@
+@node sys/socket.h
+@section @file{sys/socket.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/socket.h.html}
+
+Gnulib module: sys_socket
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@item
+This header file is not self-contained on some platforms: it requires
+@code{<sys/types.h>} to be included first.
+@item
+This header file is lacking the @code{SHUT_RD}, @code{SHUT_WR},
+@code{SHUT_RDWR} macros on some platforms, despite having the @code{shutdown}
+functions:
+emx+gcc.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_stat.texi b/gnulib/doc/posix-headers/sys_stat.texi
new file mode 100644
index 00000000..6cfbe3d6
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_stat.texi
@@ -0,0 +1,31 @@
+@node sys/stat.h
+@section @file{sys/stat.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/stat.h.html}
+
+Gnulib module: sys_stat
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+Some macros, such as @code{S_IFMT}, are missing on some platforms.
+@item
+The macros @code{S_ISBLK}, @code{S_ISCHR}, @code{S_ISDIR}, @code{S_ISFIFO},
+@code{S_ISLNK}, @code{S_ISREG}, @code{S_ISSOCK} are broken on some platforms.
+@item
+Some platforms define macros, such as @code{S_ISDOOR}, that are not defined
+on other platforms.
+@item
+The functions @code{lstat} and @code{mkdir} are not declared on mingw.
+@item
+The macros @code{UTIME_NOW} and @code{UTIME_OMIT} are missing on some
+platforms.
+@item
+On some platforms, @code{struct stat} does not include @code{st_atim},
+@code{st_mtim}, or @code{st_ctim} members. Use the gnulib module
+@samp{stat-time} for accessors to portably get at subsecond resolution.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_statvfs.texi b/gnulib/doc/posix-headers/sys_statvfs.texi
new file mode 100644
index 00000000..8c4bffc3
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_statvfs.texi
@@ -0,0 +1,17 @@
+@node sys/statvfs.h
+@section @file{sys/statvfs.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/statvfs.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, mingw.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_time.texi b/gnulib/doc/posix-headers/sys_time.texi
new file mode 100644
index 00000000..1b0e0f4d
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_time.texi
@@ -0,0 +1,18 @@
+@node sys/time.h
+@section @file{sys/time.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/time.h.html}
+
+Gnulib module: sys_time
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms.
+@item
+@samp{struct timeval} is not defined on some platforms.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_timeb.texi b/gnulib/doc/posix-headers/sys_timeb.texi
new file mode 100644
index 00000000..f1a457e2
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_timeb.texi
@@ -0,0 +1,14 @@
+@node sys/timeb.h
+@section @file{sys/timeb.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/timeb.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_times.texi b/gnulib/doc/posix-headers/sys_times.texi
new file mode 100644
index 00000000..140f71ef
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_times.texi
@@ -0,0 +1,17 @@
+@node sys/times.h
+@section @file{sys/times.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/times.h.html}
+
+Gnulib module: sys_times
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_types.texi b/gnulib/doc/posix-headers/sys_types.texi
new file mode 100644
index 00000000..6bbff9d4
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_types.texi
@@ -0,0 +1,14 @@
+@node sys/types.h
+@section @file{sys/types.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/types.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_uio.texi b/gnulib/doc/posix-headers/sys_uio.texi
new file mode 100644
index 00000000..2529550f
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_uio.texi
@@ -0,0 +1,17 @@
+@node sys/uio.h
+@section @file{sys/uio.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/uio.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_un.texi b/gnulib/doc/posix-headers/sys_un.texi
new file mode 100644
index 00000000..764f48e5
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_un.texi
@@ -0,0 +1,17 @@
+@node sys/un.h
+@section @file{sys/un.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/un.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_utsname.texi b/gnulib/doc/posix-headers/sys_utsname.texi
new file mode 100644
index 00000000..538100b5
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_utsname.texi
@@ -0,0 +1,17 @@
+@node sys/utsname.h
+@section @file{sys/utsname.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/utsname.h.html}
+
+Gnulib module: sys_utsname
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/sys_wait.texi b/gnulib/doc/posix-headers/sys_wait.texi
new file mode 100644
index 00000000..b404c120
--- /dev/null
+++ b/gnulib/doc/posix-headers/sys_wait.texi
@@ -0,0 +1,17 @@
+@node sys/wait.h
+@section @file{sys/wait.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/sys/wait.h.html}
+
+Gnulib module: sys_wait
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/syslog.texi b/gnulib/doc/posix-headers/syslog.texi
new file mode 100644
index 00000000..9f4cb858
--- /dev/null
+++ b/gnulib/doc/posix-headers/syslog.texi
@@ -0,0 +1,17 @@
+@node syslog.h
+@section @file{syslog.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/syslog.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/tar.texi b/gnulib/doc/posix-headers/tar.texi
new file mode 100644
index 00000000..5c11eb42
--- /dev/null
+++ b/gnulib/doc/posix-headers/tar.texi
@@ -0,0 +1,17 @@
+@node tar.h
+@section @file{tar.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/tar.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/termios.texi b/gnulib/doc/posix-headers/termios.texi
new file mode 100644
index 00000000..c1b56314
--- /dev/null
+++ b/gnulib/doc/posix-headers/termios.texi
@@ -0,0 +1,17 @@
+@node termios.h
+@section @file{termios.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/termios.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+mingw.
+@end itemize
diff --git a/gnulib/doc/posix-headers/tgmath.texi b/gnulib/doc/posix-headers/tgmath.texi
new file mode 100644
index 00000000..3c0a19b7
--- /dev/null
+++ b/gnulib/doc/posix-headers/tgmath.texi
@@ -0,0 +1,18 @@
+@node tgmath.h
+@section @file{tgmath.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/tgmath.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 5.2.1, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/time.texi b/gnulib/doc/posix-headers/time.texi
new file mode 100644
index 00000000..7974cea2
--- /dev/null
+++ b/gnulib/doc/posix-headers/time.texi
@@ -0,0 +1,21 @@
+@node time.h
+@section @file{time.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/time.h.html}
+
+Gnulib module: time
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+@samp{struct timespec} is not defined on some platforms.
+
+@item
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
+expressions:
+NetBSD 5.0
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/trace.texi b/gnulib/doc/posix-headers/trace.texi
new file mode 100644
index 00000000..f0817d2d
--- /dev/null
+++ b/gnulib/doc/posix-headers/trace.texi
@@ -0,0 +1,18 @@
+@node trace.h
+@section @file{trace.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/trace.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
+IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/ucontext.texi b/gnulib/doc/posix-headers/ucontext.texi
new file mode 100644
index 00000000..6855f22f
--- /dev/null
+++ b/gnulib/doc/posix-headers/ucontext.texi
@@ -0,0 +1,17 @@
+@node ucontext.h
+@section @file{ucontext.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/ucontext.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+OpenBSD 3.8, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/ulimit.texi b/gnulib/doc/posix-headers/ulimit.texi
new file mode 100644
index 00000000..a5fdb607
--- /dev/null
+++ b/gnulib/doc/posix-headers/ulimit.texi
@@ -0,0 +1,17 @@
+@node ulimit.h
+@section @file{ulimit.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/ulimit.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+OpenBSD 3.8, Cygwin, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/unistd.texi b/gnulib/doc/posix-headers/unistd.texi
new file mode 100644
index 00000000..d550143e
--- /dev/null
+++ b/gnulib/doc/posix-headers/unistd.texi
@@ -0,0 +1,30 @@
+@node unistd.h
+@section @file{unistd.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/unistd.h.html}
+
+Gnulib module: unistd
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms: msvc.
+@item
+The SEEK_* macros are not defined in this file on some platforms:
+mingw.
+@item
+The *_FILENO macros are not defined in this file on some platforms:
+OS/2 EMX, mingw.
+@item
+The @code{_exit} function is not declared in this file on some platforms:
+mingw.
+
+@item
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
+expressions:
+NetBSD 5.0
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/utime.texi b/gnulib/doc/posix-headers/utime.texi
new file mode 100644
index 00000000..603ee5e7
--- /dev/null
+++ b/gnulib/doc/posix-headers/utime.texi
@@ -0,0 +1,17 @@
+@node utime.h
+@section @file{utime.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/utime.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms. Use @code{<sys/utime.h>}
+if @code{<utime.h>} is missing.
+@end itemize
diff --git a/gnulib/doc/posix-headers/utmpx.texi b/gnulib/doc/posix-headers/utmpx.texi
new file mode 100644
index 00000000..13bbd4e1
--- /dev/null
+++ b/gnulib/doc/posix-headers/utmpx.texi
@@ -0,0 +1,17 @@
+@node utmpx.h
+@section @file{utmpx.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/utmpx.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, FreeBSD 6.0, OpenBSD 3.8, mingw, BeOS.
+@end itemize
diff --git a/gnulib/doc/posix-headers/wchar.texi b/gnulib/doc/posix-headers/wchar.texi
new file mode 100644
index 00000000..3a34a2f9
--- /dev/null
+++ b/gnulib/doc/posix-headers/wchar.texi
@@ -0,0 +1,33 @@
+@node wchar.h
+@section @file{wchar.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/wchar.h.html}
+
+Gnulib module: wchar
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file cannot be included on some platforms:
+Linux uClibc built without wide character support.
+@item
+This header file is not self-contained on some platforms:
+OSF/1 with Desktop Toolkit C, BSD/OS 4.0.1.
+@item
+The type @code{wint_t} and macro @code{WEOF} are missing on some platforms:
+IRIX 5.3.
+
+@item
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
+expressions:
+NetBSD 5.0
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file leads to link errors and endless recursions or endless loops
+on some platforms:
+glibc version 2.5 or older, together with gcc version 4.3 or newer and the
+option @samp{-std=c99} or @samp{-std=gnu99}.
+@end itemize
diff --git a/gnulib/doc/posix-headers/wctype.texi b/gnulib/doc/posix-headers/wctype.texi
new file mode 100644
index 00000000..d3438e48
--- /dev/null
+++ b/gnulib/doc/posix-headers/wctype.texi
@@ -0,0 +1,29 @@
+@node wctype.h
+@section @file{wctype.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/wctype.h.html}
+
+Gnulib module: wctype
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+HP-UX 11.00, BeOS.
+@item
+This header file is not self-contained on some platforms:
+Solaris 2.5, OSF/1 with Desktop Toolkit C, BSD/OS 4.0.1.
+@item
+The type @code{wint_t} and macro @code{WEOF} are missing on some platforms:
+IRIX 5.3.
+@item
+The functions @code{isw*} are missing on some platforms:
+FreeBSD 4.11.
+@item
+The functions @code{isw*} are actually defined as macros that don't work,
+on IRIX 5.3.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/gnulib/doc/posix-headers/wordexp.texi b/gnulib/doc/posix-headers/wordexp.texi
new file mode 100644
index 00000000..891c5d92
--- /dev/null
+++ b/gnulib/doc/posix-headers/wordexp.texi
@@ -0,0 +1,17 @@
+@node wordexp.h
+@section @file{wordexp.h}
+
+POSIX specification: @url{http://www.opengroup.org/susv3xbd/wordexp.h.html}
+
+Gnulib module: ---
+
+Portability problems fixed by Gnulib:
+@itemize
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@item
+This header file is missing on some platforms:
+MacOS X 10.3, OpenBSD 3.8, Cygwin 1.5.x, mingw, Interix 3.5, BeOS.
+@end itemize
diff --git a/gnulib/doc/quote.texi b/gnulib/doc/quote.texi
new file mode 100644
index 00000000..a35a9abf
--- /dev/null
+++ b/gnulib/doc/quote.texi
@@ -0,0 +1,44 @@
+@node Quoting
+@section Quoting
+
+@c Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+@cindex Quoting
+@findex quote
+@findex quotearg
+
+Gnulib provides @samp{quote} and @samp{quotearg} modules to help with
+quoting text, such as file names, in messages to the user. Here's an
+example of using @samp{quote}:
+
+@example
+#include <quote.h>
+ ...
+ error (0, errno, _("cannot change owner of %s"), quote (fname));
+@end example
+
+This differs from
+
+@example
+ error (0, errno, _("cannot change owner of `%s'"), fname);
+@end example
+
+@noindent in that @code{quote} escapes unusual characters in
+@code{fname}, e.g., @samp{'} and control characters like @samp{\n}.
+
+@findex quote_n
+However, a caveat: @code{quote} reuses the storage that it returns.
+Hence if you need more than one thing quoted at the same time, you
+need to use @code{quote_n}.
+
+@findex quotearg_alloc
+Also, the quote module is not suited for multithreaded applications.
+In that case, you have to use @code{quotearg_alloc}, defined in the
+@samp{quotearg} module, which is decidedly less convenient.
diff --git a/gnulib/doc/regexprops-generic.texi b/gnulib/doc/regexprops-generic.texi
new file mode 100644
index 00000000..bdbf0730
--- /dev/null
+++ b/gnulib/doc/regexprops-generic.texi
@@ -0,0 +1,715 @@
+@c Copyright (C) 1994, 1996, 1998, 2000, 2001, 2003, 2004, 2005, 2006, 2007,
+@c 2009, 2010 Free Software Foundation, Inc.
+@c
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+@c this regular expression description is for: generic
+
+@menu
+* awk regular expression syntax::
+* egrep regular expression syntax::
+* ed regular expression syntax::
+* emacs regular expression syntax::
+* gnu-awk regular expression syntax::
+* grep regular expression syntax::
+* posix-awk regular expression syntax::
+* posix-basic regular expression syntax::
+* posix-egrep regular expression syntax::
+* posix-extended regular expression syntax::
+* posix-minimal-basic regular expression syntax::
+* sed regular expression syntax::
+@end menu
+
+@node awk regular expression syntax
+@subsection @samp{awk} regular expression syntax
+
+
+The character @samp{.} matches any single character except the null character.
+
+
+@table @samp
+
+@item +
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item ?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item \+
+matches a @samp{+}
+@item \?
+matches a @samp{?}.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are invalid. Within square brackets, @samp{\} can be used to quote the following character. Character classes are not supported, so for example you would need to use @samp{[0-9]} instead of @samp{[[:digit:]]}.
+
+GNU extensions are not supported and so @samp{\w}, @samp{\W}, @samp{\<}, @samp{\>}, @samp{\b}, @samp{\B}, @samp{\`}, and @samp{\'} match @samp{w}, @samp{W}, @samp{<}, @samp{>}, @samp{b}, @samp{B}, @samp{`}, and @samp{'} respectively.
+
+Grouping is performed with parentheses @samp{()}. An unmatched @samp{)} matches just itself. A backslash followed by a digit matches that digit.
+
+The alternation operator is @samp{|}.
+
+The characters @samp{^} and @samp{$} always represent the beginning and end of a string respectively, except within square brackets. Within brackets, @samp{^} can be used to invert the membership of the character class being specified.
+
+@samp{*}, @samp{+} and @samp{?} are special at any point in a regular expression except:
+@enumerate
+
+@item At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{(}
+@item After the alternation operator @samp{|}
+
+@end enumerate
+
+
+
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node egrep regular expression syntax
+@subsection @samp{egrep} regular expression syntax
+
+
+The character @samp{.} matches any single character except newline.
+
+
+@table @samp
+
+@item +
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item ?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item \+
+matches a @samp{+}
+@item \?
+matches a @samp{?}.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are ignored. Within square brackets, @samp{\} is taken literally. Character classes are supported; for example @samp{[[:digit:]]} will match a single decimal digit. Non-matching lists @samp{[^@dots{}]} do not ever match newline.
+
+GNU extensions are supported:
+@enumerate
+
+@item @samp{\w} matches a character within a word
+
+@item @samp{\W} matches a character which is not within a word
+
+@item @samp{\<} matches the beginning of a word
+
+@item @samp{\>} matches the end of a word
+
+@item @samp{\b} matches a word boundary
+
+@item @samp{\B} matches characters which are not a word boundary
+
+@item @samp{\`} matches the beginning of the whole input
+
+@item @samp{\'} matches the end of the whole input
+
+@end enumerate
+
+
+Grouping is performed with parentheses @samp{()}. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{(}.
+
+The alternation operator is @samp{|}.
+
+The characters @samp{^} and @samp{$} always represent the beginning and end of a string respectively, except within square brackets. Within brackets, @samp{^} can be used to invert the membership of the character class being specified.
+
+The characters @samp{*}, @samp{+} and @samp{?} are special anywhere in a regular expression.
+
+
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node ed regular expression syntax
+@subsection @samp{ed} regular expression syntax
+
+
+The character @samp{.} matches any single character except the null character.
+
+
+@table @samp
+
+@item \+
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item \?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item + and ?
+match themselves.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are invalid. Within square brackets, @samp{\} is taken literally. Character classes are supported; for example @samp{[[:digit:]]} will match a single decimal digit.
+
+GNU extensions are supported:
+@enumerate
+
+@item @samp{\w} matches a character within a word
+
+@item @samp{\W} matches a character which is not within a word
+
+@item @samp{\<} matches the beginning of a word
+
+@item @samp{\>} matches the end of a word
+
+@item @samp{\b} matches a word boundary
+
+@item @samp{\B} matches characters which are not a word boundary
+
+@item @samp{\`} matches the beginning of the whole input
+
+@item @samp{\'} matches the end of the whole input
+
+@end enumerate
+
+
+Grouping is performed with backslashes followed by parentheses @samp{\(}, @samp{\)}. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{\(}.
+
+The alternation operator is @samp{\|}.
+
+The character @samp{^} only represents the beginning of a string when it appears:
+@enumerate
+
+@item
+At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{\(}
+
+@item After the alternation operator @samp{\|}
+
+@end enumerate
+
+
+The character @samp{$} only represents the end of a string when it appears:
+@enumerate
+
+@item At the end of a regular expression
+
+@item Before a close-group, signified by
+@samp{\)}
+@item Before the alternation operator @samp{\|}
+
+@end enumerate
+
+
+@samp{\*}, @samp{\+} and @samp{\?} are special at any point in a regular expression except:
+@enumerate
+
+@item At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{\(}
+@item After the alternation operator @samp{\|}
+
+@end enumerate
+
+
+Intervals are specified by @samp{\@{} and @samp{\@}}. Invalid intervals such as @samp{a\@{1z} are not accepted.
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node emacs regular expression syntax
+@subsection @samp{emacs} regular expression syntax
+
+
+The character @samp{.} matches any single character except newline.
+
+
+@table @samp
+
+@item +
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item ?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item \+
+matches a @samp{+}
+@item \?
+matches a @samp{?}.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are ignored. Within square brackets, @samp{\} is taken literally. Character classes are not supported, so for example you would need to use @samp{[0-9]} instead of @samp{[[:digit:]]}.
+
+GNU extensions are supported:
+@enumerate
+
+@item @samp{\w} matches a character within a word
+
+@item @samp{\W} matches a character which is not within a word
+
+@item @samp{\<} matches the beginning of a word
+
+@item @samp{\>} matches the end of a word
+
+@item @samp{\b} matches a word boundary
+
+@item @samp{\B} matches characters which are not a word boundary
+
+@item @samp{\`} matches the beginning of the whole input
+
+@item @samp{\'} matches the end of the whole input
+
+@end enumerate
+
+
+Grouping is performed with backslashes followed by parentheses @samp{\(}, @samp{\)}. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{\(}.
+
+The alternation operator is @samp{\|}.
+
+The character @samp{^} only represents the beginning of a string when it appears:
+@enumerate
+
+@item
+At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{\(}
+
+@item After the alternation operator @samp{\|}
+
+@end enumerate
+
+
+The character @samp{$} only represents the end of a string when it appears:
+@enumerate
+
+@item At the end of a regular expression
+
+@item Before a close-group, signified by
+@samp{\)}
+@item Before the alternation operator @samp{\|}
+
+@end enumerate
+
+
+@samp{*}, @samp{+} and @samp{?} are special at any point in a regular expression except:
+@enumerate
+
+@item At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{\(}
+@item After the alternation operator @samp{\|}
+
+@end enumerate
+
+
+
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node gnu-awk regular expression syntax
+@subsection @samp{gnu-awk} regular expression syntax
+
+
+The character @samp{.} matches any single character.
+
+
+@table @samp
+
+@item +
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item ?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item \+
+matches a @samp{+}
+@item \?
+matches a @samp{?}.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are invalid. Within square brackets, @samp{\} can be used to quote the following character. Character classes are supported; for example @samp{[[:digit:]]} will match a single decimal digit.
+
+GNU extensions are supported:
+@enumerate
+
+@item @samp{\w} matches a character within a word
+
+@item @samp{\W} matches a character which is not within a word
+
+@item @samp{\<} matches the beginning of a word
+
+@item @samp{\>} matches the end of a word
+
+@item @samp{\b} matches a word boundary
+
+@item @samp{\B} matches characters which are not a word boundary
+
+@item @samp{\`} matches the beginning of the whole input
+
+@item @samp{\'} matches the end of the whole input
+
+@end enumerate
+
+
+Grouping is performed with parentheses @samp{()}. An unmatched @samp{)} matches just itself. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{(}.
+
+The alternation operator is @samp{|}.
+
+The characters @samp{^} and @samp{$} always represent the beginning and end of a string respectively, except within square brackets. Within brackets, @samp{^} can be used to invert the membership of the character class being specified.
+
+@samp{*}, @samp{+} and @samp{?} are special at any point in a regular expression except:
+@enumerate
+
+@item At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{(}
+@item After the alternation operator @samp{|}
+
+@end enumerate
+
+
+
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node grep regular expression syntax
+@subsection @samp{grep} regular expression syntax
+
+
+The character @samp{.} matches any single character except newline.
+
+
+@table @samp
+
+@item \+
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item \?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item + and ?
+match themselves.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are ignored. Within square brackets, @samp{\} is taken literally. Character classes are supported; for example @samp{[[:digit:]]} will match a single decimal digit. Non-matching lists @samp{[^@dots{}]} do not ever match newline.
+
+GNU extensions are supported:
+@enumerate
+
+@item @samp{\w} matches a character within a word
+
+@item @samp{\W} matches a character which is not within a word
+
+@item @samp{\<} matches the beginning of a word
+
+@item @samp{\>} matches the end of a word
+
+@item @samp{\b} matches a word boundary
+
+@item @samp{\B} matches characters which are not a word boundary
+
+@item @samp{\`} matches the beginning of the whole input
+
+@item @samp{\'} matches the end of the whole input
+
+@end enumerate
+
+
+Grouping is performed with backslashes followed by parentheses @samp{\(}, @samp{\)}. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{\(}.
+
+The alternation operator is @samp{\|}.
+
+The character @samp{^} only represents the beginning of a string when it appears:
+@enumerate
+
+@item
+At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{\(}
+
+@item After a newline
+
+@item After the alternation operator @samp{\|}
+
+@end enumerate
+
+
+The character @samp{$} only represents the end of a string when it appears:
+@enumerate
+
+@item At the end of a regular expression
+
+@item Before a close-group, signified by
+@samp{\)}
+@item Before a newline
+
+@item Before the alternation operator @samp{\|}
+
+@end enumerate
+
+
+@samp{\*}, @samp{\+} and @samp{\?} are special at any point in a regular expression except:
+@enumerate
+
+@item At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{\(}
+@item After a newline
+
+@item After the alternation operator @samp{\|}
+
+@end enumerate
+
+
+Intervals are specified by @samp{\@{} and @samp{\@}}. Invalid intervals such as @samp{a\@{1z} are not accepted.
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node posix-awk regular expression syntax
+@subsection @samp{posix-awk} regular expression syntax
+
+
+The character @samp{.} matches any single character except the null character.
+
+
+@table @samp
+
+@item +
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item ?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item \+
+matches a @samp{+}
+@item \?
+matches a @samp{?}.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are invalid. Within square brackets, @samp{\} can be used to quote the following character. Character classes are supported; for example @samp{[[:digit:]]} will match a single decimal digit.
+
+GNU extensions are not supported and so @samp{\w}, @samp{\W}, @samp{\<}, @samp{\>}, @samp{\b}, @samp{\B}, @samp{\`}, and @samp{\'} match @samp{w}, @samp{W}, @samp{<}, @samp{>}, @samp{b}, @samp{B}, @samp{`}, and @samp{'} respectively.
+
+Grouping is performed with parentheses @samp{()}. An unmatched @samp{)} matches just itself. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{(}.
+
+The alternation operator is @samp{|}.
+
+The characters @samp{^} and @samp{$} always represent the beginning and end of a string respectively, except within square brackets. Within brackets, @samp{^} can be used to invert the membership of the character class being specified.
+
+@samp{*}, @samp{+} and @samp{?} are special at any point in a regular expression except the following places, where they are not allowed:
+@enumerate
+
+@item At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{(}
+@item After the alternation operator @samp{|}
+
+@end enumerate
+
+
+Intervals are specified by @samp{@{} and @samp{@}}. Invalid intervals such as @samp{a@{1z} are not accepted.
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node posix-basic regular expression syntax
+@subsection @samp{posix-basic} regular expression syntax
+This is a synonym for ed.
+@node posix-egrep regular expression syntax
+@subsection @samp{posix-egrep} regular expression syntax
+
+
+The character @samp{.} matches any single character except newline.
+
+
+@table @samp
+
+@item +
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item ?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item \+
+matches a @samp{+}
+@item \?
+matches a @samp{?}.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are ignored. Within square brackets, @samp{\} is taken literally. Character classes are supported; for example @samp{[[:digit:]]} will match a single decimal digit. Non-matching lists @samp{[^@dots{}]} do not ever match newline.
+
+GNU extensions are supported:
+@enumerate
+
+@item @samp{\w} matches a character within a word
+
+@item @samp{\W} matches a character which is not within a word
+
+@item @samp{\<} matches the beginning of a word
+
+@item @samp{\>} matches the end of a word
+
+@item @samp{\b} matches a word boundary
+
+@item @samp{\B} matches characters which are not a word boundary
+
+@item @samp{\`} matches the beginning of the whole input
+
+@item @samp{\'} matches the end of the whole input
+
+@end enumerate
+
+
+Grouping is performed with parentheses @samp{()}. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{(}.
+
+The alternation operator is @samp{|}.
+
+The characters @samp{^} and @samp{$} always represent the beginning and end of a string respectively, except within square brackets. Within brackets, @samp{^} can be used to invert the membership of the character class being specified.
+
+The characters @samp{*}, @samp{+} and @samp{?} are special anywhere in a regular expression.
+
+Intervals are specified by @samp{@{} and @samp{@}}. Invalid intervals are treated as literals, for example @samp{a@{1} is treated as @samp{a\@{1}
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node posix-extended regular expression syntax
+@subsection @samp{posix-extended} regular expression syntax
+
+
+The character @samp{.} matches any single character except the null character.
+
+
+@table @samp
+
+@item +
+indicates that the regular expression should match one or more occurrences of the previous atom or regexp.
+@item ?
+indicates that the regular expression should match zero or one occurrence of the previous atom or regexp.
+@item \+
+matches a @samp{+}
+@item \?
+matches a @samp{?}.
+@end table
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are invalid. Within square brackets, @samp{\} is taken literally. Character classes are supported; for example @samp{[[:digit:]]} will match a single decimal digit.
+
+GNU extensions are supported:
+@enumerate
+
+@item @samp{\w} matches a character within a word
+
+@item @samp{\W} matches a character which is not within a word
+
+@item @samp{\<} matches the beginning of a word
+
+@item @samp{\>} matches the end of a word
+
+@item @samp{\b} matches a word boundary
+
+@item @samp{\B} matches characters which are not a word boundary
+
+@item @samp{\`} matches the beginning of the whole input
+
+@item @samp{\'} matches the end of the whole input
+
+@end enumerate
+
+
+Grouping is performed with parentheses @samp{()}. An unmatched @samp{)} matches just itself. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{(}.
+
+The alternation operator is @samp{|}.
+
+The characters @samp{^} and @samp{$} always represent the beginning and end of a string respectively, except within square brackets. Within brackets, @samp{^} can be used to invert the membership of the character class being specified.
+
+@samp{*}, @samp{+} and @samp{?} are special at any point in a regular expression except the following places, where they are not allowed:
+@enumerate
+
+@item At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{(}
+@item After the alternation operator @samp{|}
+
+@end enumerate
+
+
+Intervals are specified by @samp{@{} and @samp{@}}. Invalid intervals such as @samp{a@{1z} are not accepted.
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node posix-minimal-basic regular expression syntax
+@subsection @samp{posix-minimal-basic} regular expression syntax
+
+
+The character @samp{.} matches any single character except the null character.
+
+
+
+Bracket expressions are used to match ranges of characters. Bracket expressions where the range is backward, for example @samp{[z-a]}, are invalid. Within square brackets, @samp{\} is taken literally. Character classes are supported; for example @samp{[[:digit:]]} will match a single decimal digit.
+
+GNU extensions are supported:
+@enumerate
+
+@item @samp{\w} matches a character within a word
+
+@item @samp{\W} matches a character which is not within a word
+
+@item @samp{\<} matches the beginning of a word
+
+@item @samp{\>} matches the end of a word
+
+@item @samp{\b} matches a word boundary
+
+@item @samp{\B} matches characters which are not a word boundary
+
+@item @samp{\`} matches the beginning of the whole input
+
+@item @samp{\'} matches the end of the whole input
+
+@end enumerate
+
+
+Grouping is performed with backslashes followed by parentheses @samp{\(}, @samp{\)}. A backslash followed by a digit acts as a back-reference and matches the same thing as the previous grouped expression indicated by that number. For example @samp{\2} matches the second group expression. The order of group expressions is determined by the position of their opening parenthesis @samp{\(}.
+
+
+
+The character @samp{^} only represents the beginning of a string when it appears:
+@enumerate
+
+@item
+At the beginning of a regular expression
+
+@item After an open-group, signified by
+@samp{\(}
+
+@end enumerate
+
+
+The character @samp{$} only represents the end of a string when it appears:
+@enumerate
+
+@item At the end of a regular expression
+
+@item Before a close-group, signified by
+@samp{\)}
+@end enumerate
+
+
+
+
+Intervals are specified by @samp{\@{} and @samp{\@}}. Invalid intervals such as @samp{a\@{1z} are not accepted.
+
+The longest possible match is returned; this applies to the regular expression as a whole and (subject to this constraint) to subexpressions within groups.
+
+
+@node sed regular expression syntax
+@subsection @samp{sed} regular expression syntax
+This is a synonym for ed. \ No newline at end of file
diff --git a/gnulib/doc/relocatable-maint.texi b/gnulib/doc/relocatable-maint.texi
new file mode 100644
index 00000000..7c24b282
--- /dev/null
+++ b/gnulib/doc/relocatable-maint.texi
@@ -0,0 +1,147 @@
+@node Supporting Relocation
+@section Supporting Relocation
+
+It has been a pain for many users of GNU packages for a long time that
+packages are not relocatable. It means a user cannot copy a program,
+installed by another user on the same machine, to his home directory,
+and have it work correctly (including i18n). So many users need to go
+through @code{configure; make; make install} with all its
+dependencies, options, and hurdles.
+
+Red Hat, Debian, and similar package systems solve the ``ease of
+installation'' problem, but they hardwire path names, usually to
+@file{/usr} or @file{/usr/local}. This means that users need root
+privileges to install a binary package, and prevents installing two
+different versions of the same binary package.
+
+A relocatable program can be moved or copied to a different location
+on the file system. It is possible to make symlinks to the installed
+and moved programs, and invoke them through the symlink. It is
+possible to do the same thing with a hard link @emph{only} if the hard
+link file is in the same directory as the real program.
+
+The @code{relocatable-prog} module aims to ease the process of making a
+GNU program relocatable. It helps overcome two obstacles. First, it aids
+with relocating the hard-coded references to absolute file names that
+GNU programs often contain. These references must be fixed up at
+runtime if a program is to be successfully relocated. The
+@code{relocatable-prog} module provides a function @code{relocate} that
+does this job.
+
+Second, the loader must be able to find shared libraries linked to
+relocatable executables or referenced by other shared libraries linked
+to relocatable executables. The @code{relocatable-prog} module helps out
+here in a platform-specific way:
+
+@itemize
+@item
+On GNU/Linux, it adds a linker option (@option{-rpath}) that causes
+the dynamic linker to search for libraries in a directory relative to
+the location of the invoked executable.
+
+@item
+On other Unix systems, it installs a wrapper executable. The wrapper
+sets the environment variable that controls shared library searching
+(usually @env{LD_LIBRARY_PATH}) and then invokes the real executable.
+
+This approach does not always work. On OpenBSD and OpenServer,
+prereleases of Libtool 1.5 put absolute file names of libraries in
+executables, which prevents searching any other locations.
+
+@item
+On Windows, the executable's own directory is searched for libraries,
+so installing shared libraries into the executable's directory is
+sufficient.
+@end itemize
+
+You can make your program relocatable by following these steps:
+
+@enumerate
+@item
+Import the @code{relocatable-prog} module.
+
+@item
+In every program, add to @code{main} as the first statement (even
+before setting the locale or doing anything related to libintl):
+
+@example
+set_program_name (argv[0]);
+@end example
+
+The prototype for this function is in @file{progname.h}.
+
+@item
+Everywhere where you use a constant pathname from installation-time,
+wrap it in @code{relocate} so it gets translated to the run-time situation.
+Example:
+
+@example
+bindtextdomain (PACKAGE, LOCALEDIR);
+@end example
+
+@noindent
+becomes:
+
+@example
+bindtextdomain (PACKAGE, relocate (LOCALEDIR));
+@end example
+
+The prototype for this function is in @file{relocatable.h}.
+
+@item
+If your package installs shell scripts, also import the
+@code{relocatable-script} module. Then, near the beginning of each
+shell script that your package installs, add the following:
+
+@example
+@@relocatable_sh@@
+if test "@@RELOCATABLE@@" = yes; then
+ exec_prefix="@@exec_prefix@@"
+ bindir="@@bindir@@"
+ orig_installdir="$bindir" # see Makefile.am's *_SCRIPTS variables
+ func_find_curr_installdir # determine curr_installdir
+ func_find_prefixes
+ # Relocate the directory variables that we use.
+ gettext_dir=`
+ echo "$gettext_dir/" \
+ | sed -e "s%^$@{orig_installprefix@}/%$@{curr_installprefix@}/%" \
+ | sed -e 's,/$,,'`
+fi
+@end example
+
+You must adapt the definition of @code{orig_installdir}, depending on
+where the script gets installed. Also, at the end, instead of
+@code{gettext_dir}, transform those variables that you need.
+
+@item
+In your @file{Makefile.am}, for every program @command{foo} that gets
+installed in, say, @file{$(bindir)}, you add:
+
+@example
+foo_CPPFLAGS = -DINSTALLDIR=\"$(bindir)\"
+if RELOCATABLE_VIA_LD
+foo_LDFLAGS = `$(RELOCATABLE_LDFLAGS) $(bindir)`
+endif
+@end example
+
+@item
+You may also need to add a couple of variable assignments to your
+@file{configure.ac}.
+
+If your package (or any package you rely on, e.g.@: gettext-runtime)
+will be relocated together with a set of installed shared libraries,
+then set @var{RELOCATABLE_LIBRARY_PATH} to a colon-separated list
+of those libraries' directories, e.g.
+@example
+RELOCATABLE_LIBRARY_PATH='$(libdir)'
+@end example
+
+If your @file{config.h} is not in @file{$(top_builddir)}, then set
+@var{RELOCATABLE_CONFIG_H_DIR} to its directory, e.g.
+@example
+RELOCATABLE_CONFIG_H_DIR='$(top_builddir)/src'
+@end example
+@end enumerate
+
+Set @var{RELOCATABLE_STRIP} to @code{:}. This is needed so that
+@samp{make install} installs executables without stripping them.
diff --git a/gnulib/doc/relocatable.texi b/gnulib/doc/relocatable.texi
new file mode 100644
index 00000000..fca0ea5b
--- /dev/null
+++ b/gnulib/doc/relocatable.texi
@@ -0,0 +1,62 @@
+@node Enabling Relocatability
+@section Enabling Relocatability
+
+It has been a pain for many users of GNU packages for a long time that
+packages are not relocatable. It means a user cannot copy a program,
+installed by another user on the same machine, to his home directory,
+and have it work correctly (including i18n). So many users need to go
+through @code{configure; make; make install} with all its
+dependencies, options, and hurdles.
+
+Red Hat, Debian, and similar package systems solve the ``ease of
+installation'' problem, but they hardwire path names, usually to
+@file{/usr} or @file{/usr/local}. This means that users need root
+privileges to install a binary package, and prevents installing two
+different versions of the same binary package.
+
+A relocatable program can be moved or copied to a different location
+on the file system. It is possible to make symlinks to the installed
+and moved programs, and invoke them through the symlink. It is
+possible to do the same thing with a hard link @emph{only} if the hard
+link file is in the same directory as the real program.
+
+To configure a program to be relocatable, add
+@option{--enable-relocatable} to the @command{configure} command line.
+
+On some OSes the executables remember the location of shared libraries
+and prefer them over any other search path. Therefore, such an
+executable will look for its shared libraries first in the original
+installation directory and only then in the current installation
+directory. Thus, for reliability, it is best to also give a
+@option{--prefix} option pointing to a directory that does not exist
+now and which never will be created, e.g.@:
+@option{--prefix=/nonexistent}. You may use
+@code{DESTDIR=@var{dest-dir}} on the @command{make} command line to
+avoid installing into that directory.
+
+We do not recommend using a prefix writable by unprivileged users
+(e.g.@: @file{/tmp/inst$$}) because such a directory can be recreated
+by an unprivileged user after the original directory has been removed.
+We also do not recommend prefixes that might be behind an automounter
+(e.g.@: @file{$HOME/inst$$}) because of the performance impact of
+directory searching.
+
+Here's a sample installation run that takes into account all these
+recommendations:
+
+@example
+./configure --enable-relocatable --prefix=/nonexistent
+make
+make install DESTDIR=/tmp/inst$$
+@end example
+
+Installation with @option{--enable-relocatable} will not work for
+setuid or setgid executables, because such executables search only
+system library paths for security reasons. Also, installation with
+@option{--enable-relocatable} might not work on OpenBSD, when the
+package contains shared libraries and libtool versions 1.5.xx are used.
+
+The runtime penalty and size penalty are negligible on GNU/Linux (just
+one system call more when an executable is launched), and small on
+other systems (the wrapper program just sets an environment variable
+and executes the real program).
diff --git a/gnulib/doc/safe-alloc.texi b/gnulib/doc/safe-alloc.texi
new file mode 100644
index 00000000..9b7de06a
--- /dev/null
+++ b/gnulib/doc/safe-alloc.texi
@@ -0,0 +1,83 @@
+@node Safe Allocation Macros
+@section Safe Allocation Macros
+
+The standard C library malloc/realloc/calloc/free APIs are prone to a
+number of common coding errors. The @code{safe-alloc} module provides
+macros that make it easier to avoid many of them. It still uses the
+standard C allocation functions behind the scenes.
+
+Some of the memory allocation mistakes that are commonly made are
+
+@itemize @bullet
+@item
+passing the incorrect number of bytes to @code{malloc}, especially
+when allocating an array,
+@item
+fail to check the return value of @code{malloc} and @code{realloc} for
+errors,
+@item
+forget to fully initialize memory just allocated with @code{malloc},
+@item
+duplicate calls to @code{free} by forgetting to set the pointer
+variable to @code{NULL},
+@item
+leaking memory in calls to @code{realloc} when that call fails.
+@end itemize
+
+The @code{safe-alloc} module addresses these problems in the following way:
+
+@itemize @bullet
+@item
+It defines macros that wrap around the standard C allocation
+functions. That makes it possible to use the compiler's knowledge of
+the size of objects for allocation; it also allows setting pointers
+passed in as arguments when appropriate.
+@item
+It uses return values only for a success/failure error condition flag,
+and annotates them with GCC's @code{__warn_unused_result__} attribute.
+@item
+It uses @code{calloc} instead of @code{malloc}.
+@end itemize
+
+@defmac {int} ALLOC (ptr)
+@findex ALLOC
+Allocate @code{sizeof(*ptr)} bytes of memory and store the address of
+allocated memory in @code{ptr}. Fill the newly allocated memory with
+zeros.
+
+Returns -1 on failure, 0 on success.
+@end defmac
+
+@defmac {int} ALLOC_N (ptr, count)
+@findex ALLOC_N
+Allocate an array of @code{count} elements, each @code{sizeof(*ptr)}
+bytes long, and store the address of allocated memory in
+@code{ptr}. Fill the newly allocated memory with zeros.
+
+Returns -1 on failure, 0 on success.
+@end defmac
+
+@defmac {int} ALLOC_N_UNINITIALIZED (ptr, count)
+@findex ALLOC_N_UNINITIALIZED
+Allocate an array of @code{count} elements, each @code{sizeof(*ptr)}
+bytes long, and store the address of allocated memory in
+@code{ptr}. The allocated memory is not initialized.
+
+Returns -1 on failure, 0 on success.
+@end defmac
+
+@defmac {int} REALLOC_N (ptr, count)
+@findex REALLOC_N
+Reallocate the memory pointed to by @code{ptr} to be big enough to hold
+at least @code{count} elements, each @code{sizeof(*ptr)} bytes long,
+and store the address of allocated memory in @code{ptr}. If
+reallocation fails, the @code{ptr} variable is not modified.
+
+Returns -1 on failure, 0 on success.
+@end defmac
+
+@defmac {void} FREE (ptr)
+@findex FREE
+Free the memory stored in @code{ptr} and set @code{ptr} to
+@code{NULL}.
+@end defmac
diff --git a/gnulib/doc/solaris-versions b/gnulib/doc/solaris-versions
new file mode 100644
index 00000000..bc5bc55a
--- /dev/null
+++ b/gnulib/doc/solaris-versions
@@ -0,0 +1,60 @@
+Sun seems to care about Solaris versus SunOS branding...
+
+Here is a mapping table that maps the `uname -sr` values to Sun's marketing
+names.
+
+ SunOS 1.x == SunOS 1.x
+ SunOS 2.x == SunOS 2.x
+ SunOS 3.x == SunOS 3.x
+ SunOS 4.0 == SunOS 4.0
+ SunOS 4.0.x == SunOS 4.0.x
+
+Starting with 4.1.1B of SunOS we have the 'Solaris 1.0' release.
+
+ SunOS 4.1.1B == Solaris 1.0
+ SunOS 4.1.1.1 == " "
+ SunOS 4.1.1_U1 == " "
+ SunOS 4.1.2 == Solaris 1.0.1
+ SunOS 4.1.3 == Solaris 1.1A
+ SunOS 4.1.3B == Solaris 1.1B
+ SunOS 4.1.3C == Solaris 1.1C
+ SunOS 4.1.3_U1 == Solaris 1.1.1
+ SunOS 4.1.3_U1B == Solaris 1.1.1B
+ SunOS 4.1.4 == Solaris 1.1.2
+
+The SunOS 5.x uname output maps to the Solaris 2.x numbers thru 2.6
+
+ SunOS 5.0 == Solaris 2.0
+ SunOS 5.1 == Solaris 2.1
+ SunOS 5.2 == Solaris 2.2
+ SunOS 5.3 == Solaris 2.3
+ SunOS 5.4 == Solaris 2.4
+ SunOS 5.5 == Solaris 2.5
+ SunOS 5.5.1 == Solaris 2.5.1
+ SunOS 5.6 == Solaris 2.6
+
+After SunOS 5.6, they started numbering based on the second digit
+
+ SunOS 5.7 == Solaris 7
+ SunOS 5.8 == Solaris 8
+ SunOS 5.9 == Solaris 9
+ SunOS 5.10 == Solaris 10
+
+The next version will be SunOS 5.11, but as of 2006-08-14 it is not
+known whether it will also be called "Solaris 11".
+
+The common terminology is to use the name "SunOS ..." to designate SunOS 2.x,
+3.x, 4.x, and "Solaris ..." to designate SunOS 5.x.
+
+Most of these operating systems are obsolete. As of 2006-07-24 only
+SunOS 5.7 and later are supported by Sun and are therefore of
+practical porting concern for GNU applications. For the current list, see
+<http://www.sun.com/service/eosl/solaris/solaris_vintage_eol_5.2005.xml>.
+
+-----
+
+Copyright (C) 2003, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
diff --git a/gnulib/doc/standards.texi b/gnulib/doc/standards.texi
new file mode 100644
index 00000000..b550bd02
--- /dev/null
+++ b/gnulib/doc/standards.texi
@@ -0,0 +1,4226 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename standards.info
+@settitle GNU Coding Standards
+@c This date is automagically updated when you save this file:
+@set lastupdate February 17, 2010
+@c %**end of header
+
+@dircategory GNU organization
+@direntry
+* Standards: (standards). GNU coding standards.
+@end direntry
+
+@c @setchapternewpage odd
+@setchapternewpage off
+
+@c Put everything in one index (arbitrarily chosen to be the concept index).
+@syncodeindex fn cp
+@syncodeindex ky cp
+@syncodeindex pg cp
+@syncodeindex vr cp
+
+@c This is used by a cross ref in make-stds.texi
+@set CODESTD 1
+
+@copying
+The GNU coding standards, last updated @value{lastupdate}.
+
+Copyright @copyright{} 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+Foundation, Inc.
+
+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, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+@end copying
+
+@titlepage
+@title GNU Coding Standards
+@author Richard Stallman, et al.
+@author last updated @value{lastupdate}
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top, Preface, (dir), (dir)
+@top Version
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Preface:: About the GNU Coding Standards.
+* Legal Issues:: Keeping free software free.
+* Design Advice:: General program design.
+* Program Behavior:: Program behavior for all programs
+* Writing C:: Making the best use of C.
+* Documentation:: Documenting programs.
+* Managing Releases:: The release process.
+* References:: Mentioning non-free software or documentation.
+* GNU Free Documentation License:: Copying and sharing this manual.
+* Index::
+
+@end menu
+
+@node Preface
+@chapter About the GNU Coding Standards
+
+The GNU Coding Standards were written by Richard Stallman and other GNU
+Project volunteers. Their purpose is to make the GNU system clean,
+consistent, and easy to install. This document can also be read as a
+guide to writing portable, robust and reliable programs. It focuses on
+programs written in C, but many of the rules and principles are useful
+even if you write in another programming language. The rules often
+state reasons for writing in a certain way.
+
+@cindex where to obtain @code{standards.texi}
+@cindex downloading this manual
+If you did not obtain this file directly from the GNU project and
+recently, please check for a newer version. You can get the GNU
+Coding Standards from the GNU web server in many
+different formats, including the Texinfo source, PDF, HTML, DVI, plain
+text, and more, at: @uref{http://www.gnu.org/prep/standards/}.
+
+If you are maintaining an official GNU package, in addition to this
+document, please read and follow the GNU maintainer information
+(@pxref{Top, , Contents, maintain, Information for Maintainers of GNU
+Software}).
+
+@cindex @code{gnustandards-commit@@gnu.org} mailing list
+If you want to receive diffs for every change to these GNU documents,
+join the mailing list @code{gnustandards-commit@@gnu.org}, via the web
+interface at
+@url{http://lists.gnu.org/mailman/listinfo/gnustandards-commit}.
+Archives are also available there.
+
+Corrections or suggestions for this document should be sent to
+@email{bug-standards@@gnu.org}. If you make a suggestion, please include a
+suggested new wording for it; our time is limited. We prefer a context
+diff to the @file{standards.texi} or @file{make-stds.texi} files, but if
+you don't have those files, please mail your suggestion anyway.
+
+These standards cover the minimum of what is important when writing a
+GNU package. Likely, the need for additional standards will come up.
+Sometimes, you might suggest that such standards be added to this
+document. If you think your standards would be generally useful, please
+do suggest them.
+
+You should also set standards for your package on many questions not
+addressed or not firmly specified here. The most important point is to
+be self-consistent---try to stick to the conventions you pick, and try
+to document them as much as possible. That way, your program will be
+more maintainable by others.
+
+The GNU Hello program serves as an example of how to follow the GNU
+coding standards for a trivial program.
+@uref{http://www.gnu.org/software/hello/hello.html}.
+
+This release of the GNU Coding Standards was last updated
+@value{lastupdate}.
+
+
+@node Legal Issues
+@chapter Keeping Free Software Free
+@cindex legal aspects
+
+This chapter discusses how you can make sure that GNU software
+avoids legal difficulties, and other related issues.
+
+@menu
+* Reading Non-Free Code:: Referring to proprietary programs.
+* Contributions:: Accepting contributions.
+* Trademarks:: How we deal with trademark issues.
+@end menu
+
+@node Reading Non-Free Code
+@section Referring to Proprietary Programs
+@cindex proprietary programs
+@cindex avoiding proprietary code
+
+Don't in any circumstances refer to Unix source code for or during
+your work on GNU! (Or to any other proprietary programs.)
+
+If you have a vague recollection of the internals of a Unix program,
+this does not absolutely mean you can't write an imitation of it, but
+do try to organize the imitation internally along different lines,
+because this is likely to make the details of the Unix version
+irrelevant and dissimilar to your results.
+
+For example, Unix utilities were generally optimized to minimize
+memory use; if you go for speed instead, your program will be very
+different. You could keep the entire input file in memory and scan it
+there instead of using stdio. Use a smarter algorithm discovered more
+recently than the Unix program. Eliminate use of temporary files. Do
+it in one pass instead of two (we did this in the assembler).
+
+Or, on the contrary, emphasize simplicity instead of speed. For some
+applications, the speed of today's computers makes simpler algorithms
+adequate.
+
+Or go for generality. For example, Unix programs often have static
+tables or fixed-size strings, which make for arbitrary limits; use
+dynamic allocation instead. Make sure your program handles NULs and
+other funny characters in the input files. Add a programming language
+for extensibility and write part of the program in that language.
+
+Or turn some parts of the program into independently usable libraries.
+Or use a simple garbage collector instead of tracking precisely when
+to free memory, or use a new GNU facility such as obstacks.
+
+@node Contributions
+@section Accepting Contributions
+@cindex legal papers
+@cindex accepting contributions
+
+If the program you are working on is copyrighted by the Free Software
+Foundation, then when someone else sends you a piece of code to add to
+the program, we need legal papers to use it---just as we asked you to
+sign papers initially. @emph{Each} person who makes a nontrivial
+contribution to a program must sign some sort of legal papers in order
+for us to have clear title to the program; the main author alone is not
+enough.
+
+So, before adding in any contributions from other people, please tell
+us, so we can arrange to get the papers. Then wait until we tell you
+that we have received the signed papers, before you actually use the
+contribution.
+
+This applies both before you release the program and afterward. If
+you receive diffs to fix a bug, and they make significant changes, we
+need legal papers for that change.
+
+This also applies to comments and documentation files. For copyright
+law, comments and code are just text. Copyright applies to all kinds of
+text, so we need legal papers for all kinds.
+
+We know it is frustrating to ask for legal papers; it's frustrating for
+us as well. But if you don't wait, you are going out on a limb---for
+example, what if the contributor's employer won't sign a disclaimer?
+You might have to take that code out again!
+
+You don't need papers for changes of a few lines here or there, since
+they are not significant for copyright purposes. Also, you don't need
+papers if all you get from the suggestion is some ideas, not actual code
+which you use. For example, if someone sent you one implementation, but
+you write a different implementation of the same idea, you don't need to
+get papers.
+
+The very worst thing is if you forget to tell us about the other
+contributor. We could be very embarrassed in court some day as a
+result.
+
+We have more detailed advice for maintainers of programs; if you have
+reached the stage of actually maintaining a program for GNU (whether
+released or not), please ask us for a copy. It is also available
+online for your perusal: @uref{http://www.gnu.org/prep/maintain/}.
+
+@node Trademarks
+@section Trademarks
+@cindex trademarks
+
+Please do not include any trademark acknowledgements in GNU software
+packages or documentation.
+
+Trademark acknowledgements are the statements that such-and-such is a
+trademark of so-and-so. The GNU Project has no objection to the basic
+idea of trademarks, but these acknowledgements feel like kowtowing,
+and there is no legal requirement for them, so we don't use them.
+
+What is legally required, as regards other people's trademarks, is to
+avoid using them in ways which a reader might reasonably understand as
+naming or labeling our own programs or activities. For example, since
+``Objective C'' is (or at least was) a trademark, we made sure to say
+that we provide a ``compiler for the Objective C language'' rather
+than an ``Objective C compiler''. The latter would have been meant as
+a shorter way of saying the former, but it does not explicitly state
+the relationship, so it could be misinterpreted as using ``Objective
+C'' as a label for the compiler rather than for the language.
+
+Please don't use ``win'' as an abbreviation for Microsoft Windows in
+GNU software or documentation. In hacker terminology, calling
+something a ``win'' is a form of praise. If you wish to praise
+Microsoft Windows when speaking on your own, by all means do so, but
+not in GNU software. Usually we write the name ``Windows'' in full,
+but when brevity is very important (as in file names and sometimes
+symbol names), we abbreviate it to ``w''. For instance, the files and
+functions in Emacs that deal with Windows start with @samp{w32}.
+
+@node Design Advice
+@chapter General Program Design
+@cindex program design
+
+This chapter discusses some of the issues you should take into
+account when designing your program.
+
+@c Standard or ANSI C
+@c
+@c In 1989 the American National Standards Institute (ANSI) standardized
+@c C as standard X3.159-1989. In December of that year the
+@c International Standards Organization ISO adopted the ANSI C standard
+@c making minor changes. In 1990 ANSI then re-adopted ISO standard
+@c C. This version of C is known as either ANSI C or Standard C.
+
+@c A major revision of the C Standard appeared in 1999.
+
+@menu
+* Source Language:: Which languages to use.
+* Compatibility:: Compatibility with other implementations.
+* Using Extensions:: Using non-standard features.
+* Standard C:: Using standard C features.
+* Conditional Compilation:: Compiling code only if a conditional is true.
+@end menu
+
+@node Source Language
+@section Which Languages to Use
+@cindex programming languages
+
+When you want to use a language that gets compiled and runs at high
+speed, the best language to use is C. Using another language is like
+using a non-standard feature: it will cause trouble for users. Even if
+GCC supports the other language, users may find it inconvenient to have
+to install the compiler for that other language in order to build your
+program. For example, if you write your program in C++, people will
+have to install the GNU C++ compiler in order to compile your program.
+
+C has one other advantage over C++ and other compiled languages: more
+people know C, so more people will find it easy to read and modify the
+program if it is written in C.
+
+So in general it is much better to use C, rather than the
+comparable alternatives.
+
+But there are two exceptions to that conclusion:
+
+@itemize @bullet
+@item
+It is no problem to use another language to write a tool specifically
+intended for use with that language. That is because the only people
+who want to build the tool will be those who have installed the other
+language anyway.
+
+@item
+If an application is of interest only to a narrow part of the community,
+then the question of which language it is written in has less effect on
+other people, so you may as well please yourself.
+@end itemize
+
+Many programs are designed to be extensible: they include an interpreter
+for a language that is higher level than C. Often much of the program
+is written in that language, too. The Emacs editor pioneered this
+technique.
+
+@cindex Guile
+@cindex GNOME and Guile
+The standard extensibility interpreter for GNU software is Guile
+(@uref{http://www.gnu.org/@/software/@/guile/}), which implements the
+language Scheme (an especially clean and simple dialect of Lisp).
+Guile also includes bindings for GTK+/GNOME, making it practical to
+write modern GUI functionality within Guile. We don't reject programs
+written in other ``scripting languages'' such as Perl and Python, but
+using Guile is very important for the overall consistency of the GNU
+system.
+
+
+@node Compatibility
+@section Compatibility with Other Implementations
+@cindex compatibility with C and @sc{posix} standards
+@cindex @sc{posix} compatibility
+
+With occasional exceptions, utility programs and libraries for GNU
+should be upward compatible with those in Berkeley Unix, and upward
+compatible with Standard C if Standard C specifies their
+behavior, and upward compatible with @sc{posix} if @sc{posix} specifies
+their behavior.
+
+When these standards conflict, it is useful to offer compatibility
+modes for each of them.
+
+@cindex options for compatibility
+Standard C and @sc{posix} prohibit many kinds of extensions. Feel
+free to make the extensions anyway, and include a @samp{--ansi},
+@samp{--posix}, or @samp{--compatible} option to turn them off.
+However, if the extension has a significant chance of breaking any real
+programs or scripts, then it is not really upward compatible. So you
+should try to redesign its interface to make it upward compatible.
+
+@cindex @code{POSIXLY_CORRECT}, environment variable
+Many GNU programs suppress extensions that conflict with @sc{posix} if the
+environment variable @code{POSIXLY_CORRECT} is defined (even if it is
+defined with a null value). Please make your program recognize this
+variable if appropriate.
+
+When a feature is used only by users (not by programs or command
+files), and it is done poorly in Unix, feel free to replace it
+completely with something totally different and better. (For example,
+@code{vi} is replaced with Emacs.) But it is nice to offer a compatible
+feature as well. (There is a free @code{vi} clone, so we offer it.)
+
+Additional useful features are welcome regardless of whether
+there is any precedent for them.
+
+@node Using Extensions
+@section Using Non-standard Features
+@cindex non-standard extensions
+
+Many GNU facilities that already exist support a number of convenient
+extensions over the comparable Unix facilities. Whether to use these
+extensions in implementing your program is a difficult question.
+
+On the one hand, using the extensions can make a cleaner program.
+On the other hand, people will not be able to build the program
+unless the other GNU tools are available. This might cause the
+program to work on fewer kinds of machines.
+
+With some extensions, it might be easy to provide both alternatives.
+For example, you can define functions with a ``keyword'' @code{INLINE}
+and define that as a macro to expand into either @code{inline} or
+nothing, depending on the compiler.
+
+In general, perhaps it is best not to use the extensions if you can
+straightforwardly do without them, but to use the extensions if they
+are a big improvement.
+
+An exception to this rule are the large, established programs (such as
+Emacs) which run on a great variety of systems. Using GNU extensions in
+such programs would make many users unhappy, so we don't do that.
+
+Another exception is for programs that are used as part of compilation:
+anything that must be compiled with other compilers in order to
+bootstrap the GNU compilation facilities. If these require the GNU
+compiler, then no one can compile them without having them installed
+already. That would be extremely troublesome in certain cases.
+
+@node Standard C
+@section Standard C and Pre-Standard C
+@cindex @sc{ansi} C standard
+
+1989 Standard C is widespread enough now that it is ok to use its
+features in new programs. There is one exception: do not ever use the
+``trigraph'' feature of Standard C.
+
+1999 Standard C is not widespread yet, so please do not require its
+features in programs. It is ok to use its features if they are present.
+
+However, it is easy to support pre-standard compilers in most programs,
+so if you know how to do that, feel free. If a program you are
+maintaining has such support, you should try to keep it working.
+
+@cindex function prototypes
+To support pre-standard C, instead of writing function definitions in
+standard prototype form,
+
+@example
+int
+foo (int x, int y)
+@dots{}
+@end example
+
+@noindent
+write the definition in pre-standard style like this,
+
+@example
+int
+foo (x, y)
+ int x, y;
+@dots{}
+@end example
+
+@noindent
+and use a separate declaration to specify the argument prototype:
+
+@example
+int foo (int, int);
+@end example
+
+You need such a declaration anyway, in a header file, to get the benefit
+of prototypes in all the files where the function is called. And once
+you have the declaration, you normally lose nothing by writing the
+function definition in the pre-standard style.
+
+This technique does not work for integer types narrower than @code{int}.
+If you think of an argument as being of a type narrower than @code{int},
+declare it as @code{int} instead.
+
+There are a few special cases where this technique is hard to use. For
+example, if a function argument needs to hold the system type
+@code{dev_t}, you run into trouble, because @code{dev_t} is shorter than
+@code{int} on some machines; but you cannot use @code{int} instead,
+because @code{dev_t} is wider than @code{int} on some machines. There
+is no type you can safely use on all machines in a non-standard
+definition. The only way to support non-standard C and pass such an
+argument is to check the width of @code{dev_t} using Autoconf and choose
+the argument type accordingly. This may not be worth the trouble.
+
+In order to support pre-standard compilers that do not recognize
+prototypes, you may want to use a preprocessor macro like this:
+
+@example
+/* Declare the prototype for a general external function. */
+#if defined (__STDC__) || defined (WINDOWSNT)
+#define P_(proto) proto
+#else
+#define P_(proto) ()
+#endif
+@end example
+
+@node Conditional Compilation
+@section Conditional Compilation
+
+When supporting configuration options already known when building your
+program we prefer using @code{if (... )} over conditional compilation,
+as in the former case the compiler is able to perform more extensive
+checking of all possible code paths.
+
+For example, please write
+
+@smallexample
+ if (HAS_FOO)
+ ...
+ else
+ ...
+@end smallexample
+
+@noindent
+instead of:
+
+@smallexample
+ #ifdef HAS_FOO
+ ...
+ #else
+ ...
+ #endif
+@end smallexample
+
+A modern compiler such as GCC will generate exactly the same code in
+both cases, and we have been using similar techniques with good success
+in several projects. Of course, the former method assumes that
+@code{HAS_FOO} is defined as either 0 or 1.
+
+While this is not a silver bullet solving all portability problems,
+and is not always appropriate, following this policy would have saved
+GCC developers many hours, or even days, per year.
+
+In the case of function-like macros like @code{REVERSIBLE_CC_MODE} in
+GCC which cannot be simply used in @code{if (...)} statements, there is
+an easy workaround. Simply introduce another macro
+@code{HAS_REVERSIBLE_CC_MODE} as in the following example:
+
+@smallexample
+ #ifdef REVERSIBLE_CC_MODE
+ #define HAS_REVERSIBLE_CC_MODE 1
+ #else
+ #define HAS_REVERSIBLE_CC_MODE 0
+ #endif
+@end smallexample
+
+@node Program Behavior
+@chapter Program Behavior for All Programs
+
+This chapter describes conventions for writing robust
+software. It also describes general standards for error messages, the
+command line interface, and how libraries should behave.
+
+@menu
+* Non-GNU Standards:: We consider standards such as POSIX;
+ we don't "obey" them.
+* Semantics:: Writing robust programs.
+* Libraries:: Library behavior.
+* Errors:: Formatting error messages.
+* User Interfaces:: Standards about interfaces generally.
+* Graphical Interfaces:: Standards for graphical interfaces.
+* Command-Line Interfaces:: Standards for command line interfaces.
+* Option Table:: Table of long options.
+* OID Allocations:: Table of OID slots for GNU.
+* Memory Usage:: When and how to care about memory needs.
+* File Usage:: Which files to use, and where.
+@end menu
+
+@node Non-GNU Standards
+@section Non-GNU Standards
+
+The GNU Project regards standards published by other organizations as
+suggestions, not orders. We consider those standards, but we do not
+``obey'' them. In developing a GNU program, you should implement
+an outside standard's specifications when that makes the GNU system
+better overall in an objective sense. When it doesn't, you shouldn't.
+
+In most cases, following published standards is convenient for
+users---it means that their programs or scripts will work more
+portably. For instance, GCC implements nearly all the features of
+Standard C as specified by that standard. C program developers would
+be unhappy if it did not. And GNU utilities mostly follow
+specifications of POSIX.2; shell script writers and users would be
+unhappy if our programs were incompatible.
+
+But we do not follow either of these specifications rigidly, and there
+are specific points on which we decided not to follow them, so as to
+make the GNU system better for users.
+
+For instance, Standard C says that nearly all extensions to C are
+prohibited. How silly! GCC implements many extensions, some of which
+were later adopted as part of the standard. If you want these
+constructs to give an error message as ``required'' by the standard,
+you must specify @samp{--pedantic}, which was implemented only so that
+we can say ``GCC is a 100% implementation of the standard,'' not
+because there is any reason to actually use it.
+
+POSIX.2 specifies that @samp{df} and @samp{du} must output sizes by
+default in units of 512 bytes. What users want is units of 1k, so
+that is what we do by default. If you want the ridiculous behavior
+``required'' by POSIX, you must set the environment variable
+@samp{POSIXLY_CORRECT} (which was originally going to be named
+@samp{POSIX_ME_HARDER}).
+
+GNU utilities also depart from the letter of the POSIX.2 specification
+when they support long-named command-line options, and intermixing
+options with ordinary arguments. This minor incompatibility with
+POSIX is never a problem in practice, and it is very useful.
+
+In particular, don't reject a new feature, or remove an old one,
+merely because a standard says it is ``forbidden'' or ``deprecated.''
+
+@node Semantics
+@section Writing Robust Programs
+
+@cindex arbitrary limits on data
+Avoid arbitrary limits on the length or number of @emph{any} data
+structure, including file names, lines, files, and symbols, by allocating
+all data structures dynamically. In most Unix utilities, ``long lines
+are silently truncated''. This is not acceptable in a GNU utility.
+
+@cindex @code{NUL} characters
+Utilities reading files should not drop NUL characters, or any other
+nonprinting characters @emph{including those with codes above 0177}.
+The only sensible exceptions would be utilities specifically intended
+for interface to certain types of terminals or printers
+that can't handle those characters.
+Whenever possible, try to make programs work properly with
+sequences of bytes that represent multibyte characters, using encodings
+such as UTF-8 and others.
+
+@cindex error messages
+Check every system call for an error return, unless you know you wish to
+ignore errors. Include the system error text (from @code{perror} or
+equivalent) in @emph{every} error message resulting from a failing
+system call, as well as the name of the file if any and the name of the
+utility. Just ``cannot open foo.c'' or ``stat failed'' is not
+sufficient.
+
+@cindex @code{malloc} return value
+@cindex memory allocation failure
+Check every call to @code{malloc} or @code{realloc} to see if it
+returned zero. Check @code{realloc} even if you are making the block
+smaller; in a system that rounds block sizes to a power of 2,
+@code{realloc} may get a different block if you ask for less space.
+
+In Unix, @code{realloc} can destroy the storage block if it returns
+zero. GNU @code{realloc} does not have this bug: if it fails, the
+original block is unchanged. Feel free to assume the bug is fixed. If
+you wish to run your program on Unix, and wish to avoid lossage in this
+case, you can use the GNU @code{malloc}.
+
+You must expect @code{free} to alter the contents of the block that was
+freed. Anything you want to fetch from the block, you must fetch before
+calling @code{free}.
+
+If @code{malloc} fails in a noninteractive program, make that a fatal
+error. In an interactive program (one that reads commands from the
+user), it is better to abort the command and return to the command
+reader loop. This allows the user to kill other processes to free up
+virtual memory, and then try the command again.
+
+@cindex command-line arguments, decoding
+Use @code{getopt_long} to decode arguments, unless the argument syntax
+makes this unreasonable.
+
+When static storage is to be written in during program execution, use
+explicit C code to initialize it. Reserve C initialized declarations
+for data that will not be changed.
+@c ADR: why?
+
+Try to avoid low-level interfaces to obscure Unix data structures (such
+as file directories, utmp, or the layout of kernel memory), since these
+are less likely to work compatibly. If you need to find all the files
+in a directory, use @code{readdir} or some other high-level interface.
+These are supported compatibly by GNU.
+
+@cindex signal handling
+The preferred signal handling facilities are the BSD variant of
+@code{signal}, and the @sc{posix} @code{sigaction} function; the
+alternative USG @code{signal} interface is an inferior design.
+
+Nowadays, using the @sc{posix} signal functions may be the easiest way
+to make a program portable. If you use @code{signal}, then on GNU/Linux
+systems running GNU libc version 1, you should include
+@file{bsd/signal.h} instead of @file{signal.h}, so as to get BSD
+behavior. It is up to you whether to support systems where
+@code{signal} has only the USG behavior, or give up on them.
+
+@cindex impossible conditions
+In error checks that detect ``impossible'' conditions, just abort.
+There is usually no point in printing any message. These checks
+indicate the existence of bugs. Whoever wants to fix the bugs will have
+to read the source code and run a debugger. So explain the problem with
+comments in the source. The relevant data will be in variables, which
+are easy to examine with the debugger, so there is no point moving them
+elsewhere.
+
+Do not use a count of errors as the exit status for a program.
+@emph{That does not work}, because exit status values are limited to 8
+bits (0 through 255). A single run of the program might have 256
+errors; if you try to return 256 as the exit status, the parent process
+will see 0 as the status, and it will appear that the program succeeded.
+
+@cindex temporary files
+@cindex @code{TMPDIR} environment variable
+If you make temporary files, check the @code{TMPDIR} environment
+variable; if that variable is defined, use the specified directory
+instead of @file{/tmp}.
+
+In addition, be aware that there is a possible security problem when
+creating temporary files in world-writable directories. In C, you can
+avoid this problem by creating temporary files in this manner:
+
+@example
+fd = open (filename, O_WRONLY | O_CREAT | O_EXCL, 0600);
+@end example
+
+@noindent
+or by using the @code{mkstemps} function from libiberty.
+
+In bash, use @code{set -C} to avoid this problem.
+
+@node Libraries
+@section Library Behavior
+@cindex libraries
+
+Try to make library functions reentrant. If they need to do dynamic
+storage allocation, at least try to avoid any nonreentrancy aside from
+that of @code{malloc} itself.
+
+Here are certain name conventions for libraries, to avoid name
+conflicts.
+
+Choose a name prefix for the library, more than two characters long.
+All external function and variable names should start with this
+prefix. In addition, there should only be one of these in any given
+library member. This usually means putting each one in a separate
+source file.
+
+An exception can be made when two external symbols are always used
+together, so that no reasonable program could use one without the
+other; then they can both go in the same file.
+
+External symbols that are not documented entry points for the user
+should have names beginning with @samp{_}. The @samp{_} should be
+followed by the chosen name prefix for the library, to prevent
+collisions with other libraries. These can go in the same files with
+user entry points if you like.
+
+Static functions and variables can be used as you like and need not
+fit any naming convention.
+
+@node Errors
+@section Formatting Error Messages
+@cindex formatting error messages
+@cindex error messages, formatting
+
+Error messages from compilers should look like this:
+
+@example
+@var{source-file-name}:@var{lineno}: @var{message}
+@end example
+
+@noindent
+If you want to mention the column number, use one of these formats:
+
+@example
+@var{source-file-name}:@var{lineno}:@var{column}: @var{message}
+@var{source-file-name}:@var{lineno}.@var{column}: @var{message}
+
+@end example
+
+@noindent
+Line numbers should start from 1 at the beginning of the file, and
+column numbers should start from 1 at the beginning of the line. (Both
+of these conventions are chosen for compatibility.) Calculate column
+numbers assuming that space and all ASCII printing characters have
+equal width, and assuming tab stops every 8 columns.
+
+The error message can also give both the starting and ending positions
+of the erroneous text. There are several formats so that you can
+avoid redundant information such as a duplicate line number.
+Here are the possible formats:
+
+@example
+@var{source-file-name}:@var{lineno-1}.@var{column-1}-@var{lineno-2}.@var{column-2}: @var{message}
+@var{source-file-name}:@var{lineno-1}.@var{column-1}-@var{column-2}: @var{message}
+@var{source-file-name}:@var{lineno-1}-@var{lineno-2}: @var{message}
+@end example
+
+@noindent
+When an error is spread over several files, you can use this format:
+
+@example
+@var{file-1}:@var{lineno-1}.@var{column-1}-@var{file-2}:@var{lineno-2}.@var{column-2}: @var{message}
+@end example
+
+Error messages from other noninteractive programs should look like this:
+
+@example
+@var{program}:@var{source-file-name}:@var{lineno}: @var{message}
+@end example
+
+@noindent
+when there is an appropriate source file, or like this:
+
+@example
+@var{program}: @var{message}
+@end example
+
+@noindent
+when there is no relevant source file.
+
+If you want to mention the column number, use this format:
+
+@example
+@var{program}:@var{source-file-name}:@var{lineno}:@var{column}: @var{message}
+@end example
+
+In an interactive program (one that is reading commands from a
+terminal), it is better not to include the program name in an error
+message. The place to indicate which program is running is in the
+prompt or with the screen layout. (When the same program runs with
+input from a source other than a terminal, it is not interactive and
+would do best to print error messages using the noninteractive style.)
+
+The string @var{message} should not begin with a capital letter when
+it follows a program name and/or file name, because that isn't the
+beginning of a sentence. (The sentence conceptually starts at the
+beginning of the line.) Also, it should not end with a period.
+
+Error messages from interactive programs, and other messages such as
+usage messages, should start with a capital letter. But they should not
+end with a period.
+
+@node User Interfaces
+@section Standards for Interfaces Generally
+
+@cindex program name and its behavior
+@cindex behavior, dependent on program's name
+Please don't make the behavior of a utility depend on the name used
+to invoke it. It is useful sometimes to make a link to a utility
+with a different name, and that should not change what it does.
+
+Instead, use a run time option or a compilation switch or both
+to select among the alternate behaviors.
+
+@cindex output device and program's behavior
+Likewise, please don't make the behavior of the program depend on the
+type of output device it is used with. Device independence is an
+important principle of the system's design; do not compromise it merely
+to save someone from typing an option now and then. (Variation in error
+message syntax when using a terminal is ok, because that is a side issue
+that people do not depend on.)
+
+If you think one behavior is most useful when the output is to a
+terminal, and another is most useful when the output is a file or a
+pipe, then it is usually best to make the default behavior the one that
+is useful with output to a terminal, and have an option for the other
+behavior.
+
+Compatibility requires certain programs to depend on the type of output
+device. It would be disastrous if @code{ls} or @code{sh} did not do so
+in the way all users expect. In some of these cases, we supplement the
+program with a preferred alternate version that does not depend on the
+output device type. For example, we provide a @code{dir} program much
+like @code{ls} except that its default output format is always
+multi-column format.
+
+
+@node Graphical Interfaces
+@section Standards for Graphical Interfaces
+@cindex graphical user interface
+
+@cindex gtk+
+When you write a program that provides a graphical user interface,
+please make it work with X Windows and the GTK+ toolkit unless the
+functionality specifically requires some alternative (for example,
+``displaying jpeg images while in console mode'').
+
+In addition, please provide a command-line interface to control the
+functionality. (In many cases, the graphical user interface can be a
+separate program which invokes the command-line program.) This is
+so that the same jobs can be done from scripts.
+
+@cindex corba
+@cindex gnome
+Please also consider providing a CORBA interface (for use from GNOME), a
+library interface (for use from C), and perhaps a keyboard-driven
+console interface (for use by users from console mode). Once you are
+doing the work to provide the functionality and the graphical interface,
+these won't be much extra work.
+
+
+@node Command-Line Interfaces
+@section Standards for Command Line Interfaces
+@cindex command-line interface
+
+@findex getopt
+It is a good idea to follow the @sc{posix} guidelines for the
+command-line options of a program. The easiest way to do this is to use
+@code{getopt} to parse them. Note that the GNU version of @code{getopt}
+will normally permit options anywhere among the arguments unless the
+special argument @samp{--} is used. This is not what @sc{posix}
+specifies; it is a GNU extension.
+
+@cindex long-named options
+Please define long-named options that are equivalent to the
+single-letter Unix-style options. We hope to make GNU more user
+friendly this way. This is easy to do with the GNU function
+@code{getopt_long}.
+
+One of the advantages of long-named options is that they can be
+consistent from program to program. For example, users should be able
+to expect the ``verbose'' option of any GNU program which has one, to be
+spelled precisely @samp{--verbose}. To achieve this uniformity, look at
+the table of common long-option names when you choose the option names
+for your program (@pxref{Option Table}).
+
+It is usually a good idea for file names given as ordinary arguments to
+be input files only; any output files would be specified using options
+(preferably @samp{-o} or @samp{--output}). Even if you allow an output
+file name as an ordinary argument for compatibility, try to provide an
+option as another way to specify it. This will lead to more consistency
+among GNU utilities, and fewer idiosyncrasies for users to remember.
+
+@cindex standard command-line options
+@cindex options, standard command-line
+@cindex CGI programs, standard options for
+@cindex PATH_INFO, specifying standard options as
+All programs should support two standard options: @samp{--version}
+and @samp{--help}. CGI programs should accept these as command-line
+options, and also if given as the @env{PATH_INFO}; for instance,
+visiting @url{http://example.org/p.cgi/--help} in a browser should
+output the same information as invoking @samp{p.cgi --help} from the
+command line.
+
+@menu
+* --version:: The standard output for --version.
+* --help:: The standard output for --help.
+@end menu
+
+@node --version
+@subsection @option{--version}
+
+@cindex @samp{--version} output
+
+The standard @code{--version} option should direct the program to
+print information about its name, version, origin and legal status,
+all on standard output, and then exit successfully. Other options and
+arguments should be ignored once this is seen, and the program should
+not perform its normal function.
+
+@cindex canonical name of a program
+@cindex program's canonical name
+The first line is meant to be easy for a program to parse; the version
+number proper starts after the last space. In addition, it contains
+the canonical name for this program, in this format:
+
+@example
+GNU Emacs 19.30
+@end example
+
+@noindent
+The program's name should be a constant string; @emph{don't} compute it
+from @code{argv[0]}. The idea is to state the standard or canonical
+name for the program, not its file name. There are other ways to find
+out the precise file name where a command is found in @code{PATH}.
+
+If the program is a subsidiary part of a larger package, mention the
+package name in parentheses, like this:
+
+@example
+emacsserver (GNU Emacs) 19.30
+@end example
+
+@noindent
+If the package has a version number which is different from this
+program's version number, you can mention the package version number
+just before the close-parenthesis.
+
+If you @emph{need} to mention the version numbers of libraries which
+are distributed separately from the package which contains this program,
+you can do so by printing an additional line of version info for each
+library you want to mention. Use the same format for these lines as for
+the first line.
+
+Please do not mention all of the libraries that the program uses ``just
+for completeness''---that would produce a lot of unhelpful clutter.
+Please mention library version numbers only if you find in practice that
+they are very important to you in debugging.
+
+The following line, after the version number line or lines, should be a
+copyright notice. If more than one copyright notice is called for, put
+each on a separate line.
+
+Next should follow a line stating the license, preferably using one of
+abbrevations below, and a brief statement that the program is free
+software, and that users are free to copy and change it. Also mention
+that there is no warranty, to the extent permitted by law. See
+recommended wording below.
+
+It is ok to finish the output with a list of the major authors of the
+program, as a way of giving credit.
+
+Here's an example of output that follows these rules:
+
+@smallexample
+GNU hello 2.3
+Copyright (C) 2007 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+@end smallexample
+
+You should adapt this to your program, of course, filling in the proper
+year, copyright holder, name of program, and the references to
+distribution terms, and changing the rest of the wording as necessary.
+
+This copyright notice only needs to mention the most recent year in
+which changes were made---there's no need to list the years for previous
+versions' changes. You don't have to mention the name of the program in
+these notices, if that is inconvenient, since it appeared in the first
+line. (The rules are different for copyright notices in source files;
+@pxref{Copyright Notices,,,maintain,Information for GNU Maintainers}.)
+
+Translations of the above lines must preserve the validity of the
+copyright notices (@pxref{Internationalization}). If the translation's
+character set supports it, the @samp{(C)} should be replaced with the
+copyright symbol, as follows:
+
+@ifinfo
+(the official copyright symbol, which is the letter C in a circle);
+@end ifinfo
+@ifnotinfo
+@copyright{}
+@end ifnotinfo
+
+Write the word ``Copyright'' exactly like that, in English. Do not
+translate it into another language. International treaties recognize
+the English word ``Copyright''; translations into other languages do not
+have legal significance.
+
+Finally, here is the table of our suggested license abbreviations.
+Any abbreviation can be followed by @samp{v@var{version}[+]}, meaning
+that particular version, or later versions with the @samp{+}, as shown
+above.
+
+In the case of exceptions for extra permissions with the GPL, we use
+@samp{/} for a separator; the version number can follow the license
+abbreviation as usual, as in the examples below.
+
+@table @asis
+@item GPL
+GNU General Public License, @url{http://www.gnu.org/@/licenses/@/gpl.html}.
+
+@item LGPL
+GNU Lesser General Public License, @url{http://www.gnu.org/@/licenses/@/lgpl.html}.
+
+@item GPL/Guile
+GNU GPL with the exception for Guile; for example, GPLv3+/Guile means
+the GNU GPL version 3 or later, with the extra exception for Guile.
+
+@item GPL/Ada
+GNU GPL with the exception for Ada.
+
+@item Apache
+The Apache Software Foundation license,
+@url{http://www.apache.org/@/licenses}.
+
+@item Artistic
+The Artistic license used for Perl, @url{http://www.perlfoundation.org/@/legal}.
+
+@item Expat
+The Expat license, @url{http://www.jclark.com/@/xml/@/copying.txt}.
+
+@item MPL
+The Mozilla Public License, @url{http://www.mozilla.org/@/MPL/}.
+
+@item OBSD
+The original (4-clause) BSD license, incompatible with the GNU GPL
+@url{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#6}.
+
+@item PHP
+The license used for PHP, @url{http://www.php.net/@/license/}.
+
+@item public domain
+The non-license that is being in the public domain,
+@url{http://www.gnu.org/@/licenses/@/license-list.html#PublicDomain}.
+
+@item Python
+The license for Python, @url{http://www.python.org/@/2.0.1/@/license.html}.
+
+@item RBSD
+The revised (3-clause) BSD, compatible with the GNU GPL,
+@url{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#5}.
+
+@item X11
+The simple non-copyleft license used for most versions of the X Window
+system, @url{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#3}.
+
+@item Zlib
+The license for Zlib, @url{http://www.gzip.org/@/zlib/@/zlib_license.html}.
+
+@end table
+
+More information about these licenses and many more are on the GNU
+licensing web pages,
+@url{http://www.gnu.org/@/licenses/@/license-list.html}.
+
+
+@node --help
+@subsection @option{--help}
+
+@cindex @samp{--help} output
+
+The standard @code{--help} option should output brief documentation
+for how to invoke the program, on standard output, then exit
+successfully. Other options and arguments should be ignored once this
+is seen, and the program should not perform its normal function.
+
+@cindex address for bug reports
+@cindex bug reports
+Near the end of the @samp{--help} option's output, please place lines
+giving the email address for bug reports, the package's home page
+(normally @indicateurl{http://www.gnu.org/software/@var{pkg}}, and the
+general page for help using GNU programs. The format should be like this:
+
+@example
+Report bugs to: @var{mailing-address}
+@var{pkg} home page: <http://www.gnu.org/software/@var{pkg}/>
+General help using GNU software: <http://www.gnu.org/gethelp/>
+@end example
+
+It is ok to mention other appropriate mailing lists and web pages.
+
+
+@node Option Table
+@section Table of Long Options
+@cindex long option names
+@cindex table of long options
+
+Here is a table of long options used by GNU programs. It is surely
+incomplete, but we aim to list all the options that a new program might
+want to be compatible with. If you use names not already in the table,
+please send @email{bug-standards@@gnu.org} a list of them, with their
+meanings, so we can update the table.
+
+@c Please leave newlines between items in this table; it's much easier
+@c to update when it isn't completely squashed together and unreadable.
+@c When there is more than one short option for a long option name, put
+@c a semicolon between the lists of the programs that use them, not a
+@c period. --friedman
+
+@table @samp
+@item after-date
+@samp{-N} in @code{tar}.
+
+@item all
+@samp{-a} in @code{du}, @code{ls}, @code{nm}, @code{stty}, @code{uname},
+and @code{unexpand}.
+
+@item all-text
+@samp{-a} in @code{diff}.
+
+@item almost-all
+@samp{-A} in @code{ls}.
+
+@item append
+@samp{-a} in @code{etags}, @code{tee}, @code{time};
+@samp{-r} in @code{tar}.
+
+@item archive
+@samp{-a} in @code{cp}.
+
+@item archive-name
+@samp{-n} in @code{shar}.
+
+@item arglength
+@samp{-l} in @code{m4}.
+
+@item ascii
+@samp{-a} in @code{diff}.
+
+@item assign
+@samp{-v} in @code{gawk}.
+
+@item assume-new
+@samp{-W} in @code{make}.
+
+@item assume-old
+@samp{-o} in @code{make}.
+
+@item auto-check
+@samp{-a} in @code{recode}.
+
+@item auto-pager
+@samp{-a} in @code{wdiff}.
+
+@item auto-reference
+@samp{-A} in @code{ptx}.
+
+@item avoid-wraps
+@samp{-n} in @code{wdiff}.
+
+@item background
+For server programs, run in the background.
+
+@item backward-search
+@samp{-B} in @code{ctags}.
+
+@item basename
+@samp{-f} in @code{shar}.
+
+@item batch
+Used in GDB.
+
+@item baud
+Used in GDB.
+
+@item before
+@samp{-b} in @code{tac}.
+
+@item binary
+@samp{-b} in @code{cpio} and @code{diff}.
+
+@item bits-per-code
+@samp{-b} in @code{shar}.
+
+@item block-size
+Used in @code{cpio} and @code{tar}.
+
+@item blocks
+@samp{-b} in @code{head} and @code{tail}.
+
+@item break-file
+@samp{-b} in @code{ptx}.
+
+@item brief
+Used in various programs to make output shorter.
+
+@item bytes
+@samp{-c} in @code{head}, @code{split}, and @code{tail}.
+
+@item c@t{++}
+@samp{-C} in @code{etags}.
+
+@item catenate
+@samp{-A} in @code{tar}.
+
+@item cd
+Used in various programs to specify the directory to use.
+
+@item changes
+@samp{-c} in @code{chgrp} and @code{chown}.
+
+@item classify
+@samp{-F} in @code{ls}.
+
+@item colons
+@samp{-c} in @code{recode}.
+
+@item command
+@samp{-c} in @code{su};
+@samp{-x} in GDB.
+
+@item compare
+@samp{-d} in @code{tar}.
+
+@item compat
+Used in @code{gawk}.
+
+@item compress
+@samp{-Z} in @code{tar} and @code{shar}.
+
+@item concatenate
+@samp{-A} in @code{tar}.
+
+@item confirmation
+@samp{-w} in @code{tar}.
+
+@item context
+Used in @code{diff}.
+
+@item copyleft
+@samp{-W copyleft} in @code{gawk}.
+
+@item copyright
+@samp{-C} in @code{ptx}, @code{recode}, and @code{wdiff};
+@samp{-W copyright} in @code{gawk}.
+
+@item core
+Used in GDB.
+
+@item count
+@samp{-q} in @code{who}.
+
+@item count-links
+@samp{-l} in @code{du}.
+
+@item create
+Used in @code{tar} and @code{cpio}.
+
+@item cut-mark
+@samp{-c} in @code{shar}.
+
+@item cxref
+@samp{-x} in @code{ctags}.
+
+@item date
+@samp{-d} in @code{touch}.
+
+@item debug
+@samp{-d} in @code{make} and @code{m4};
+@samp{-t} in Bison.
+
+@item define
+@samp{-D} in @code{m4}.
+
+@item defines
+@samp{-d} in Bison and @code{ctags}.
+
+@item delete
+@samp{-D} in @code{tar}.
+
+@item dereference
+@samp{-L} in @code{chgrp}, @code{chown}, @code{cpio}, @code{du},
+@code{ls}, and @code{tar}.
+
+@item dereference-args
+@samp{-D} in @code{du}.
+
+@item device
+Specify an I/O device (special file name).
+
+@item diacritics
+@samp{-d} in @code{recode}.
+
+@item dictionary-order
+@samp{-d} in @code{look}.
+
+@item diff
+@samp{-d} in @code{tar}.
+
+@item digits
+@samp{-n} in @code{csplit}.
+
+@item directory
+Specify the directory to use, in various programs. In @code{ls}, it
+means to show directories themselves rather than their contents. In
+@code{rm} and @code{ln}, it means to not treat links to directories
+specially.
+
+@item discard-all
+@samp{-x} in @code{strip}.
+
+@item discard-locals
+@samp{-X} in @code{strip}.
+
+@item dry-run
+@samp{-n} in @code{make}.
+
+@item ed
+@samp{-e} in @code{diff}.
+
+@item elide-empty-files
+@samp{-z} in @code{csplit}.
+
+@item end-delete
+@samp{-x} in @code{wdiff}.
+
+@item end-insert
+@samp{-z} in @code{wdiff}.
+
+@item entire-new-file
+@samp{-N} in @code{diff}.
+
+@item environment-overrides
+@samp{-e} in @code{make}.
+
+@item eof
+@samp{-e} in @code{xargs}.
+
+@item epoch
+Used in GDB.
+
+@item error-limit
+Used in @code{makeinfo}.
+
+@item error-output
+@samp{-o} in @code{m4}.
+
+@item escape
+@samp{-b} in @code{ls}.
+
+@item exclude-from
+@samp{-X} in @code{tar}.
+
+@item exec
+Used in GDB.
+
+@item exit
+@samp{-x} in @code{xargs}.
+
+@item exit-0
+@samp{-e} in @code{unshar}.
+
+@item expand-tabs
+@samp{-t} in @code{diff}.
+
+@item expression
+@samp{-e} in @code{sed}.
+
+@item extern-only
+@samp{-g} in @code{nm}.
+
+@item extract
+@samp{-i} in @code{cpio};
+@samp{-x} in @code{tar}.
+
+@item faces
+@samp{-f} in @code{finger}.
+
+@item fast
+@samp{-f} in @code{su}.
+
+@item fatal-warnings
+@samp{-E} in @code{m4}.
+
+@item file
+@samp{-f} in @code{gawk}, @code{info}, @code{make}, @code{mt},
+@code{sed}, and @code{tar}.
+
+@item field-separator
+@samp{-F} in @code{gawk}.
+
+@item file-prefix
+@samp{-b} in Bison.
+
+@item file-type
+@samp{-F} in @code{ls}.
+
+@item files-from
+@samp{-T} in @code{tar}.
+
+@item fill-column
+Used in @code{makeinfo}.
+
+@item flag-truncation
+@samp{-F} in @code{ptx}.
+
+@item fixed-output-files
+@samp{-y} in Bison.
+
+@item follow
+@samp{-f} in @code{tail}.
+
+@item footnote-style
+Used in @code{makeinfo}.
+
+@item force
+@samp{-f} in @code{cp}, @code{ln}, @code{mv}, and @code{rm}.
+
+@item force-prefix
+@samp{-F} in @code{shar}.
+
+@item foreground
+For server programs, run in the foreground;
+in other words, don't do anything special to run the server
+in the background.
+
+@item format
+Used in @code{ls}, @code{time}, and @code{ptx}.
+
+@item freeze-state
+@samp{-F} in @code{m4}.
+
+@item fullname
+Used in GDB.
+
+@item gap-size
+@samp{-g} in @code{ptx}.
+
+@item get
+@samp{-x} in @code{tar}.
+
+@item graphic
+@samp{-i} in @code{ul}.
+
+@item graphics
+@samp{-g} in @code{recode}.
+
+@item group
+@samp{-g} in @code{install}.
+
+@item gzip
+@samp{-z} in @code{tar} and @code{shar}.
+
+@item hashsize
+@samp{-H} in @code{m4}.
+
+@item header
+@samp{-h} in @code{objdump} and @code{recode}
+
+@item heading
+@samp{-H} in @code{who}.
+
+@item help
+Used to ask for brief usage information.
+
+@item here-delimiter
+@samp{-d} in @code{shar}.
+
+@item hide-control-chars
+@samp{-q} in @code{ls}.
+
+@item html
+In @code{makeinfo}, output HTML.
+
+@item idle
+@samp{-u} in @code{who}.
+
+@item ifdef
+@samp{-D} in @code{diff}.
+
+@item ignore
+@samp{-I} in @code{ls};
+@samp{-x} in @code{recode}.
+
+@item ignore-all-space
+@samp{-w} in @code{diff}.
+
+@item ignore-backups
+@samp{-B} in @code{ls}.
+
+@item ignore-blank-lines
+@samp{-B} in @code{diff}.
+
+@item ignore-case
+@samp{-f} in @code{look} and @code{ptx};
+@samp{-i} in @code{diff} and @code{wdiff}.
+
+@item ignore-errors
+@samp{-i} in @code{make}.
+
+@item ignore-file
+@samp{-i} in @code{ptx}.
+
+@item ignore-indentation
+@samp{-I} in @code{etags}.
+
+@item ignore-init-file
+@samp{-f} in Oleo.
+
+@item ignore-interrupts
+@samp{-i} in @code{tee}.
+
+@item ignore-matching-lines
+@samp{-I} in @code{diff}.
+
+@item ignore-space-change
+@samp{-b} in @code{diff}.
+
+@item ignore-zeros
+@samp{-i} in @code{tar}.
+
+@item include
+@samp{-i} in @code{etags};
+@samp{-I} in @code{m4}.
+
+@item include-dir
+@samp{-I} in @code{make}.
+
+@item incremental
+@samp{-G} in @code{tar}.
+
+@item info
+@samp{-i}, @samp{-l}, and @samp{-m} in Finger.
+
+@item init-file
+In some programs, specify the name of the file to read as the user's
+init file.
+
+@item initial
+@samp{-i} in @code{expand}.
+
+@item initial-tab
+@samp{-T} in @code{diff}.
+
+@item inode
+@samp{-i} in @code{ls}.
+
+@item interactive
+@samp{-i} in @code{cp}, @code{ln}, @code{mv}, @code{rm};
+@samp{-e} in @code{m4};
+@samp{-p} in @code{xargs};
+@samp{-w} in @code{tar}.
+
+@item intermix-type
+@samp{-p} in @code{shar}.
+
+@item iso-8601
+Used in @code{date}
+
+@item jobs
+@samp{-j} in @code{make}.
+
+@item just-print
+@samp{-n} in @code{make}.
+
+@item keep-going
+@samp{-k} in @code{make}.
+
+@item keep-files
+@samp{-k} in @code{csplit}.
+
+@item kilobytes
+@samp{-k} in @code{du} and @code{ls}.
+
+@item language
+@samp{-l} in @code{etags}.
+
+@item less-mode
+@samp{-l} in @code{wdiff}.
+
+@item level-for-gzip
+@samp{-g} in @code{shar}.
+
+@item line-bytes
+@samp{-C} in @code{split}.
+
+@item lines
+Used in @code{split}, @code{head}, and @code{tail}.
+
+@item link
+@samp{-l} in @code{cpio}.
+
+@item lint
+@itemx lint-old
+Used in @code{gawk}.
+
+@item list
+@samp{-t} in @code{cpio};
+@samp{-l} in @code{recode}.
+
+@item list
+@samp{-t} in @code{tar}.
+
+@item literal
+@samp{-N} in @code{ls}.
+
+@item load-average
+@samp{-l} in @code{make}.
+
+@item login
+Used in @code{su}.
+
+@item machine
+Used in @code{uname}.
+
+@item macro-name
+@samp{-M} in @code{ptx}.
+
+@item mail
+@samp{-m} in @code{hello} and @code{uname}.
+
+@item make-directories
+@samp{-d} in @code{cpio}.
+
+@item makefile
+@samp{-f} in @code{make}.
+
+@item mapped
+Used in GDB.
+
+@item max-args
+@samp{-n} in @code{xargs}.
+
+@item max-chars
+@samp{-n} in @code{xargs}.
+
+@item max-lines
+@samp{-l} in @code{xargs}.
+
+@item max-load
+@samp{-l} in @code{make}.
+
+@item max-procs
+@samp{-P} in @code{xargs}.
+
+@item mesg
+@samp{-T} in @code{who}.
+
+@item message
+@samp{-T} in @code{who}.
+
+@item minimal
+@samp{-d} in @code{diff}.
+
+@item mixed-uuencode
+@samp{-M} in @code{shar}.
+
+@item mode
+@samp{-m} in @code{install}, @code{mkdir}, and @code{mkfifo}.
+
+@item modification-time
+@samp{-m} in @code{tar}.
+
+@item multi-volume
+@samp{-M} in @code{tar}.
+
+@item name-prefix
+@samp{-a} in Bison.
+
+@item nesting-limit
+@samp{-L} in @code{m4}.
+
+@item net-headers
+@samp{-a} in @code{shar}.
+
+@item new-file
+@samp{-W} in @code{make}.
+
+@item no-builtin-rules
+@samp{-r} in @code{make}.
+
+@item no-character-count
+@samp{-w} in @code{shar}.
+
+@item no-check-existing
+@samp{-x} in @code{shar}.
+
+@item no-common
+@samp{-3} in @code{wdiff}.
+
+@item no-create
+@samp{-c} in @code{touch}.
+
+@item no-defines
+@samp{-D} in @code{etags}.
+
+@item no-deleted
+@samp{-1} in @code{wdiff}.
+
+@item no-dereference
+@samp{-d} in @code{cp}.
+
+@item no-inserted
+@samp{-2} in @code{wdiff}.
+
+@item no-keep-going
+@samp{-S} in @code{make}.
+
+@item no-lines
+@samp{-l} in Bison.
+
+@item no-piping
+@samp{-P} in @code{shar}.
+
+@item no-prof
+@samp{-e} in @code{gprof}.
+
+@item no-regex
+@samp{-R} in @code{etags}.
+
+@item no-sort
+@samp{-p} in @code{nm}.
+
+@item no-splash
+Don't print a startup splash screen.
+
+@item no-split
+Used in @code{makeinfo}.
+
+@item no-static
+@samp{-a} in @code{gprof}.
+
+@item no-time
+@samp{-E} in @code{gprof}.
+
+@item no-timestamp
+@samp{-m} in @code{shar}.
+
+@item no-validate
+Used in @code{makeinfo}.
+
+@item no-wait
+Used in @code{emacsclient}.
+
+@item no-warn
+Used in various programs to inhibit warnings.
+
+@item node
+@samp{-n} in @code{info}.
+
+@item nodename
+@samp{-n} in @code{uname}.
+
+@item nonmatching
+@samp{-f} in @code{cpio}.
+
+@item nstuff
+@samp{-n} in @code{objdump}.
+
+@item null
+@samp{-0} in @code{xargs}.
+
+@item number
+@samp{-n} in @code{cat}.
+
+@item number-nonblank
+@samp{-b} in @code{cat}.
+
+@item numeric-sort
+@samp{-n} in @code{nm}.
+
+@item numeric-uid-gid
+@samp{-n} in @code{cpio} and @code{ls}.
+
+@item nx
+Used in GDB.
+
+@item old-archive
+@samp{-o} in @code{tar}.
+
+@item old-file
+@samp{-o} in @code{make}.
+
+@item one-file-system
+@samp{-l} in @code{tar}, @code{cp}, and @code{du}.
+
+@item only-file
+@samp{-o} in @code{ptx}.
+
+@item only-prof
+@samp{-f} in @code{gprof}.
+
+@item only-time
+@samp{-F} in @code{gprof}.
+
+@item options
+@samp{-o} in @code{getopt}, @code{fdlist}, @code{fdmount},
+@code{fdmountd}, and @code{fdumount}.
+
+@item output
+In various programs, specify the output file name.
+
+@item output-prefix
+@samp{-o} in @code{shar}.
+
+@item override
+@samp{-o} in @code{rm}.
+
+@item overwrite
+@samp{-c} in @code{unshar}.
+
+@item owner
+@samp{-o} in @code{install}.
+
+@item paginate
+@samp{-l} in @code{diff}.
+
+@item paragraph-indent
+Used in @code{makeinfo}.
+
+@item parents
+@samp{-p} in @code{mkdir} and @code{rmdir}.
+
+@item pass-all
+@samp{-p} in @code{ul}.
+
+@item pass-through
+@samp{-p} in @code{cpio}.
+
+@item port
+@samp{-P} in @code{finger}.
+
+@item portability
+@samp{-c} in @code{cpio} and @code{tar}.
+
+@item posix
+Used in @code{gawk}.
+
+@item prefix-builtins
+@samp{-P} in @code{m4}.
+
+@item prefix
+@samp{-f} in @code{csplit}.
+
+@item preserve
+Used in @code{tar} and @code{cp}.
+
+@item preserve-environment
+@samp{-p} in @code{su}.
+
+@item preserve-modification-time
+@samp{-m} in @code{cpio}.
+
+@item preserve-order
+@samp{-s} in @code{tar}.
+
+@item preserve-permissions
+@samp{-p} in @code{tar}.
+
+@item print
+@samp{-l} in @code{diff}.
+
+@item print-chars
+@samp{-L} in @code{cmp}.
+
+@item print-data-base
+@samp{-p} in @code{make}.
+
+@item print-directory
+@samp{-w} in @code{make}.
+
+@item print-file-name
+@samp{-o} in @code{nm}.
+
+@item print-symdefs
+@samp{-s} in @code{nm}.
+
+@item printer
+@samp{-p} in @code{wdiff}.
+
+@item prompt
+@samp{-p} in @code{ed}.
+
+@item proxy
+Specify an HTTP proxy.
+
+@item query-user
+@samp{-X} in @code{shar}.
+
+@item question
+@samp{-q} in @code{make}.
+
+@item quiet
+Used in many programs to inhibit the usual output. Every
+program accepting @samp{--quiet} should accept @samp{--silent} as a
+synonym.
+
+@item quiet-unshar
+@samp{-Q} in @code{shar}
+
+@item quote-name
+@samp{-Q} in @code{ls}.
+
+@item rcs
+@samp{-n} in @code{diff}.
+
+@item re-interval
+Used in @code{gawk}.
+
+@item read-full-blocks
+@samp{-B} in @code{tar}.
+
+@item readnow
+Used in GDB.
+
+@item recon
+@samp{-n} in @code{make}.
+
+@item record-number
+@samp{-R} in @code{tar}.
+
+@item recursive
+Used in @code{chgrp}, @code{chown}, @code{cp}, @code{ls}, @code{diff},
+and @code{rm}.
+
+@item reference
+@samp{-r} in @code{touch}.
+
+@item references
+@samp{-r} in @code{ptx}.
+
+@item regex
+@samp{-r} in @code{tac} and @code{etags}.
+
+@item release
+@samp{-r} in @code{uname}.
+
+@item reload-state
+@samp{-R} in @code{m4}.
+
+@item relocation
+@samp{-r} in @code{objdump}.
+
+@item rename
+@samp{-r} in @code{cpio}.
+
+@item replace
+@samp{-i} in @code{xargs}.
+
+@item report-identical-files
+@samp{-s} in @code{diff}.
+
+@item reset-access-time
+@samp{-a} in @code{cpio}.
+
+@item reverse
+@samp{-r} in @code{ls} and @code{nm}.
+
+@item reversed-ed
+@samp{-f} in @code{diff}.
+
+@item right-side-defs
+@samp{-R} in @code{ptx}.
+
+@item same-order
+@samp{-s} in @code{tar}.
+
+@item same-permissions
+@samp{-p} in @code{tar}.
+
+@item save
+@samp{-g} in @code{stty}.
+
+@item se
+Used in GDB.
+
+@item sentence-regexp
+@samp{-S} in @code{ptx}.
+
+@item separate-dirs
+@samp{-S} in @code{du}.
+
+@item separator
+@samp{-s} in @code{tac}.
+
+@item sequence
+Used by @code{recode} to chose files or pipes for sequencing passes.
+
+@item shell
+@samp{-s} in @code{su}.
+
+@item show-all
+@samp{-A} in @code{cat}.
+
+@item show-c-function
+@samp{-p} in @code{diff}.
+
+@item show-ends
+@samp{-E} in @code{cat}.
+
+@item show-function-line
+@samp{-F} in @code{diff}.
+
+@item show-tabs
+@samp{-T} in @code{cat}.
+
+@item silent
+Used in many programs to inhibit the usual output.
+Every program accepting
+@samp{--silent} should accept @samp{--quiet} as a synonym.
+
+@item size
+@samp{-s} in @code{ls}.
+
+@item socket
+Specify a file descriptor for a network server to use for its socket,
+instead of opening and binding a new socket. This provides a way to
+run, in a non-privileged process, a server that normally needs a
+reserved port number.
+
+@item sort
+Used in @code{ls}.
+
+@item source
+@samp{-W source} in @code{gawk}.
+
+@item sparse
+@samp{-S} in @code{tar}.
+
+@item speed-large-files
+@samp{-H} in @code{diff}.
+
+@item split-at
+@samp{-E} in @code{unshar}.
+
+@item split-size-limit
+@samp{-L} in @code{shar}.
+
+@item squeeze-blank
+@samp{-s} in @code{cat}.
+
+@item start-delete
+@samp{-w} in @code{wdiff}.
+
+@item start-insert
+@samp{-y} in @code{wdiff}.
+
+@item starting-file
+Used in @code{tar} and @code{diff} to specify which file within
+a directory to start processing with.
+
+@item statistics
+@samp{-s} in @code{wdiff}.
+
+@item stdin-file-list
+@samp{-S} in @code{shar}.
+
+@item stop
+@samp{-S} in @code{make}.
+
+@item strict
+@samp{-s} in @code{recode}.
+
+@item strip
+@samp{-s} in @code{install}.
+
+@item strip-all
+@samp{-s} in @code{strip}.
+
+@item strip-debug
+@samp{-S} in @code{strip}.
+
+@item submitter
+@samp{-s} in @code{shar}.
+
+@item suffix
+@samp{-S} in @code{cp}, @code{ln}, @code{mv}.
+
+@item suffix-format
+@samp{-b} in @code{csplit}.
+
+@item sum
+@samp{-s} in @code{gprof}.
+
+@item summarize
+@samp{-s} in @code{du}.
+
+@item symbolic
+@samp{-s} in @code{ln}.
+
+@item symbols
+Used in GDB and @code{objdump}.
+
+@item synclines
+@samp{-s} in @code{m4}.
+
+@item sysname
+@samp{-s} in @code{uname}.
+
+@item tabs
+@samp{-t} in @code{expand} and @code{unexpand}.
+
+@item tabsize
+@samp{-T} in @code{ls}.
+
+@item terminal
+@samp{-T} in @code{tput} and @code{ul}.
+@samp{-t} in @code{wdiff}.
+
+@item text
+@samp{-a} in @code{diff}.
+
+@item text-files
+@samp{-T} in @code{shar}.
+
+@item time
+Used in @code{ls} and @code{touch}.
+
+@item timeout
+Specify how long to wait before giving up on some operation.
+
+@item to-stdout
+@samp{-O} in @code{tar}.
+
+@item total
+@samp{-c} in @code{du}.
+
+@item touch
+@samp{-t} in @code{make}, @code{ranlib}, and @code{recode}.
+
+@item trace
+@samp{-t} in @code{m4}.
+
+@item traditional
+@samp{-t} in @code{hello};
+@samp{-W traditional} in @code{gawk};
+@samp{-G} in @code{ed}, @code{m4}, and @code{ptx}.
+
+@item tty
+Used in GDB.
+
+@item typedefs
+@samp{-t} in @code{ctags}.
+
+@item typedefs-and-c++
+@samp{-T} in @code{ctags}.
+
+@item typeset-mode
+@samp{-t} in @code{ptx}.
+
+@item uncompress
+@samp{-z} in @code{tar}.
+
+@item unconditional
+@samp{-u} in @code{cpio}.
+
+@item undefine
+@samp{-U} in @code{m4}.
+
+@item undefined-only
+@samp{-u} in @code{nm}.
+
+@item update
+@samp{-u} in @code{cp}, @code{ctags}, @code{mv}, @code{tar}.
+
+@item usage
+Used in @code{gawk}; same as @samp{--help}.
+
+@item uuencode
+@samp{-B} in @code{shar}.
+
+@item vanilla-operation
+@samp{-V} in @code{shar}.
+
+@item verbose
+Print more information about progress. Many programs support this.
+
+@item verify
+@samp{-W} in @code{tar}.
+
+@item version
+Print the version number.
+
+@item version-control
+@samp{-V} in @code{cp}, @code{ln}, @code{mv}.
+
+@item vgrind
+@samp{-v} in @code{ctags}.
+
+@item volume
+@samp{-V} in @code{tar}.
+
+@item what-if
+@samp{-W} in @code{make}.
+
+@item whole-size-limit
+@samp{-l} in @code{shar}.
+
+@item width
+@samp{-w} in @code{ls} and @code{ptx}.
+
+@item word-regexp
+@samp{-W} in @code{ptx}.
+
+@item writable
+@samp{-T} in @code{who}.
+
+@item zeros
+@samp{-z} in @code{gprof}.
+@end table
+
+@node OID Allocations
+@section OID Allocations
+@cindex OID allocations for GNU
+@cindex SNMP
+@cindex LDAP
+@cindex X.509
+
+The OID (object identifier) 1.3.6.1.4.1.11591 has been assigned to the
+GNU Project (thanks to Werner Koch). These are used for SNMP, LDAP,
+X.509 certificates, and so on. The web site
+@url{http://www.alvestrand.no/objectid} has a (voluntary) listing of
+many OID assignments.
+
+If you need a new slot for your GNU package, write
+@email{maintainers@@gnu.org}. Here is a list of arcs currently
+assigned:
+
+@example
+@include gnu-oids.texi
+@end example
+
+
+@node Memory Usage
+@section Memory Usage
+@cindex memory usage
+
+If a program typically uses just a few meg of memory, don't bother making any
+effort to reduce memory usage. For example, if it is impractical for
+other reasons to operate on files more than a few meg long, it is
+reasonable to read entire input files into memory to operate on them.
+
+However, for programs such as @code{cat} or @code{tail}, that can
+usefully operate on very large files, it is important to avoid using a
+technique that would artificially limit the size of files it can handle.
+If a program works by lines and could be applied to arbitrary
+user-supplied input files, it should keep only a line in memory, because
+this is not very hard and users will want to be able to operate on input
+files that are bigger than will fit in memory all at once.
+
+If your program creates complicated data structures, just make them in
+memory and give a fatal error if @code{malloc} returns zero.
+
+@node File Usage
+@section File Usage
+@cindex file usage
+
+Programs should be prepared to operate when @file{/usr} and @file{/etc}
+are read-only file systems. Thus, if the program manages log files,
+lock files, backup files, score files, or any other files which are
+modified for internal purposes, these files should not be stored in
+@file{/usr} or @file{/etc}.
+
+There are two exceptions. @file{/etc} is used to store system
+configuration information; it is reasonable for a program to modify
+files in @file{/etc} when its job is to update the system configuration.
+Also, if the user explicitly asks to modify one file in a directory, it
+is reasonable for the program to store other files in the same
+directory.
+
+@node Writing C
+@chapter Making The Best Use of C
+
+This chapter provides advice on how best to use the C language
+when writing GNU software.
+
+@menu
+* Formatting:: Formatting your source code.
+* Comments:: Commenting your work.
+* Syntactic Conventions:: Clean use of C constructs.
+* Names:: Naming variables, functions, and files.
+* System Portability:: Portability among different operating systems.
+* CPU Portability:: Supporting the range of CPU types.
+* System Functions:: Portability and ``standard'' library functions.
+* Internationalization:: Techniques for internationalization.
+* Character Set:: Use ASCII by default.
+* Quote Characters:: Use `...' in the C locale.
+* Mmap:: How you can safely use @code{mmap}.
+@end menu
+
+@node Formatting
+@section Formatting Your Source Code
+@cindex formatting source code
+
+@cindex open brace
+@cindex braces, in C source
+It is important to put the open-brace that starts the body of a C
+function in column one, so that they will start a defun. Several
+tools look for open-braces in column one to find the beginnings of C
+functions. These tools will not work on code not formatted that way.
+
+Avoid putting open-brace, open-parenthesis or open-bracket in column
+one when they are inside a function, so that they won't start a defun.
+The open-brace that starts a @code{struct} body can go in column one
+if you find it useful to treat that definition as a defun.
+
+It is also important for function definitions to start the name of the
+function in column one. This helps people to search for function
+definitions, and may also help certain tools recognize them. Thus,
+using Standard C syntax, the format is this:
+
+@example
+static char *
+concat (char *s1, char *s2)
+@{
+ @dots{}
+@}
+@end example
+
+@noindent
+or, if you want to use traditional C syntax, format the definition like
+this:
+
+@example
+static char *
+concat (s1, s2) /* Name starts in column one here */
+ char *s1, *s2;
+@{ /* Open brace in column one here */
+ @dots{}
+@}
+@end example
+
+In Standard C, if the arguments don't fit nicely on one line,
+split it like this:
+
+@example
+int
+lots_of_args (int an_integer, long a_long, short a_short,
+ double a_double, float a_float)
+@dots{}
+@end example
+
+The rest of this section gives our recommendations for other aspects of
+C formatting style, which is also the default style of the @code{indent}
+program in version 1.2 and newer. It corresponds to the options
+
+@smallexample
+-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2
+-ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -psl -nsc -nsob
+@end smallexample
+
+We don't think of these recommendations as requirements, because it
+causes no problems for users if two different programs have different
+formatting styles.
+
+But whatever style you use, please use it consistently, since a mixture
+of styles within one program tends to look ugly. If you are
+contributing changes to an existing program, please follow the style of
+that program.
+
+For the body of the function, our recommended style looks like this:
+
+@example
+if (x < foo (y, z))
+ haha = bar[4] + 5;
+else
+ @{
+ while (z)
+ @{
+ haha += foo (z, z);
+ z--;
+ @}
+ return ++x + bar ();
+ @}
+@end example
+
+@cindex spaces before open-paren
+We find it easier to read a program when it has spaces before the
+open-parentheses and after the commas. Especially after the commas.
+
+When you split an expression into multiple lines, split it
+before an operator, not after one. Here is the right way:
+
+@cindex expressions, splitting
+@example
+if (foo_this_is_long && bar > win (x, y, z)
+ && remaining_condition)
+@end example
+
+Try to avoid having two operators of different precedence at the same
+level of indentation. For example, don't write this:
+
+@example
+mode = (inmode[j] == VOIDmode
+ || GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])
+ ? outmode[j] : inmode[j]);
+@end example
+
+Instead, use extra parentheses so that the indentation shows the nesting:
+
+@example
+mode = ((inmode[j] == VOIDmode
+ || (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])))
+ ? outmode[j] : inmode[j]);
+@end example
+
+Insert extra parentheses so that Emacs will indent the code properly.
+For example, the following indentation looks nice if you do it by hand,
+
+@example
+v = rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+ + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000;
+@end example
+
+@noindent
+but Emacs would alter it. Adding a set of parentheses produces
+something that looks equally nice, and which Emacs will preserve:
+
+@example
+v = (rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+ + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000);
+@end example
+
+Format do-while statements like this:
+
+@example
+do
+ @{
+ a = foo (a);
+ @}
+while (a > 0);
+@end example
+
+@cindex formfeed
+@cindex control-L
+Please use formfeed characters (control-L) to divide the program into
+pages at logical places (but not within a function). It does not matter
+just how long the pages are, since they do not have to fit on a printed
+page. The formfeeds should appear alone on lines by themselves.
+
+@node Comments
+@section Commenting Your Work
+@cindex commenting
+
+Every program should start with a comment saying briefly what it is for.
+Example: @samp{fmt - filter for simple filling of text}. This comment
+should be at the top of the source file containing the @samp{main}
+function of the program.
+
+Also, please write a brief comment at the start of each source file,
+with the file name and a line or two about the overall purpose of the
+file.
+
+Please write the comments in a GNU program in English, because English
+is the one language that nearly all programmers in all countries can
+read. If you do not write English well, please write comments in
+English as well as you can, then ask other people to help rewrite them.
+If you can't write comments in English, please find someone to work with
+you and translate your comments into English.
+
+Please put a comment on each function saying what the function does,
+what sorts of arguments it gets, and what the possible values of
+arguments mean and are used for. It is not necessary to duplicate in
+words the meaning of the C argument declarations, if a C type is being
+used in its customary fashion. If there is anything nonstandard about
+its use (such as an argument of type @code{char *} which is really the
+address of the second character of a string, not the first), or any
+possible values that would not work the way one would expect (such as,
+that strings containing newlines are not guaranteed to work), be sure
+to say so.
+
+Also explain the significance of the return value, if there is one.
+
+Please put two spaces after the end of a sentence in your comments, so
+that the Emacs sentence commands will work. Also, please write
+complete sentences and capitalize the first word. If a lower-case
+identifier comes at the beginning of a sentence, don't capitalize it!
+Changing the spelling makes it a different identifier. If you don't
+like starting a sentence with a lower case letter, write the sentence
+differently (e.g., ``The identifier lower-case is @dots{}'').
+
+The comment on a function is much clearer if you use the argument
+names to speak about the argument values. The variable name itself
+should be lower case, but write it in upper case when you are speaking
+about the value rather than the variable itself. Thus, ``the inode
+number NODE_NUM'' rather than ``an inode''.
+
+There is usually no purpose in restating the name of the function in
+the comment before it, because the reader can see that for himself.
+There might be an exception when the comment is so long that the function
+itself would be off the bottom of the screen.
+
+There should be a comment on each static variable as well, like this:
+
+@example
+/* Nonzero means truncate lines in the display;
+ zero means continue them. */
+int truncate_lines;
+@end example
+
+@cindex conditionals, comments for
+@cindex @code{#endif}, commenting
+Every @samp{#endif} should have a comment, except in the case of short
+conditionals (just a few lines) that are not nested. The comment should
+state the condition of the conditional that is ending, @emph{including
+its sense}. @samp{#else} should have a comment describing the condition
+@emph{and sense} of the code that follows. For example:
+
+@example
+@group
+#ifdef foo
+ @dots{}
+#else /* not foo */
+ @dots{}
+#endif /* not foo */
+@end group
+@group
+#ifdef foo
+ @dots{}
+#endif /* foo */
+@end group
+@end example
+
+@noindent
+but, by contrast, write the comments this way for a @samp{#ifndef}:
+
+@example
+@group
+#ifndef foo
+ @dots{}
+#else /* foo */
+ @dots{}
+#endif /* foo */
+@end group
+@group
+#ifndef foo
+ @dots{}
+#endif /* not foo */
+@end group
+@end example
+
+@node Syntactic Conventions
+@section Clean Use of C Constructs
+@cindex syntactic conventions
+
+@cindex implicit @code{int}
+@cindex function argument, declaring
+Please explicitly declare the types of all objects. For example, you
+should explicitly declare all arguments to functions, and you should
+declare functions to return @code{int} rather than omitting the
+@code{int}.
+
+@cindex compiler warnings
+@cindex @samp{-Wall} compiler option
+Some programmers like to use the GCC @samp{-Wall} option, and change the
+code whenever it issues a warning. If you want to do this, then do.
+Other programmers prefer not to use @samp{-Wall}, because it gives
+warnings for valid and legitimate code which they do not want to change.
+If you want to do this, then do. The compiler should be your servant,
+not your master.
+
+Declarations of external functions and functions to appear later in the
+source file should all go in one place near the beginning of the file
+(somewhere before the first function definition in the file), or else
+should go in a header file. Don't put @code{extern} declarations inside
+functions.
+
+@cindex temporary variables
+It used to be common practice to use the same local variables (with
+names like @code{tem}) over and over for different values within one
+function. Instead of doing this, it is better to declare a separate local
+variable for each distinct purpose, and give it a name which is
+meaningful. This not only makes programs easier to understand, it also
+facilitates optimization by good compilers. You can also move the
+declaration of each local variable into the smallest scope that includes
+all its uses. This makes the program even cleaner.
+
+Don't use local variables or parameters that shadow global identifiers.
+
+@cindex multiple variables in a line
+Don't declare multiple variables in one declaration that spans lines.
+Start a new declaration on each line, instead. For example, instead
+of this:
+
+@example
+@group
+int foo,
+ bar;
+@end group
+@end example
+
+@noindent
+write either this:
+
+@example
+int foo, bar;
+@end example
+
+@noindent
+or this:
+
+@example
+int foo;
+int bar;
+@end example
+
+@noindent
+(If they are global variables, each should have a comment preceding it
+anyway.)
+
+When you have an @code{if}-@code{else} statement nested in another
+@code{if} statement, always put braces around the @code{if}-@code{else}.
+Thus, never write like this:
+
+@example
+if (foo)
+ if (bar)
+ win ();
+ else
+ lose ();
+@end example
+
+@noindent
+always like this:
+
+@example
+if (foo)
+ @{
+ if (bar)
+ win ();
+ else
+ lose ();
+ @}
+@end example
+
+If you have an @code{if} statement nested inside of an @code{else}
+statement, either write @code{else if} on one line, like this,
+
+@example
+if (foo)
+ @dots{}
+else if (bar)
+ @dots{}
+@end example
+
+@noindent
+with its @code{then}-part indented like the preceding @code{then}-part,
+or write the nested @code{if} within braces like this:
+
+@example
+if (foo)
+ @dots{}
+else
+ @{
+ if (bar)
+ @dots{}
+ @}
+@end example
+
+Don't declare both a structure tag and variables or typedefs in the
+same declaration. Instead, declare the structure tag separately
+and then use it to declare the variables or typedefs.
+
+Try to avoid assignments inside @code{if}-conditions (assignments
+inside @code{while}-conditions are ok). For example, don't write
+this:
+
+@example
+if ((foo = (char *) malloc (sizeof *foo)) == 0)
+ fatal ("virtual memory exhausted");
+@end example
+
+@noindent
+instead, write this:
+
+@example
+foo = (char *) malloc (sizeof *foo);
+if (foo == 0)
+ fatal ("virtual memory exhausted");
+@end example
+
+@pindex lint
+Don't make the program ugly to placate @code{lint}. Please don't insert any
+casts to @code{void}. Zero without a cast is perfectly fine as a null
+pointer constant, except when calling a varargs function.
+
+@node Names
+@section Naming Variables, Functions, and Files
+
+@cindex names of variables, functions, and files
+The names of global variables and functions in a program serve as
+comments of a sort. So don't choose terse names---instead, look for
+names that give useful information about the meaning of the variable or
+function. In a GNU program, names should be English, like other
+comments.
+
+Local variable names can be shorter, because they are used only within
+one context, where (presumably) comments explain their purpose.
+
+Try to limit your use of abbreviations in symbol names. It is ok to
+make a few abbreviations, explain what they mean, and then use them
+frequently, but don't use lots of obscure abbreviations.
+
+Please use underscores to separate words in a name, so that the Emacs
+word commands can be useful within them. Stick to lower case; reserve
+upper case for macros and @code{enum} constants, and for name-prefixes
+that follow a uniform convention.
+
+For example, you should use names like @code{ignore_space_change_flag};
+don't use names like @code{iCantReadThis}.
+
+Variables that indicate whether command-line options have been
+specified should be named after the meaning of the option, not after
+the option-letter. A comment should state both the exact meaning of
+the option and its letter. For example,
+
+@example
+@group
+/* Ignore changes in horizontal whitespace (-b). */
+int ignore_space_change_flag;
+@end group
+@end example
+
+When you want to define names with constant integer values, use
+@code{enum} rather than @samp{#define}. GDB knows about enumeration
+constants.
+
+@cindex file-name limitations
+@pindex doschk
+You might want to make sure that none of the file names would conflict
+if the files were loaded onto an MS-DOS file system which shortens the
+names. You can use the program @code{doschk} to test for this.
+
+Some GNU programs were designed to limit themselves to file names of 14
+characters or less, to avoid file name conflicts if they are read into
+older System V systems. Please preserve this feature in the existing
+GNU programs that have it, but there is no need to do this in new GNU
+programs. @code{doschk} also reports file names longer than 14
+characters.
+
+@node System Portability
+@section Portability between System Types
+@cindex portability, between system types
+
+In the Unix world, ``portability'' refers to porting to different Unix
+versions. For a GNU program, this kind of portability is desirable, but
+not paramount.
+
+The primary purpose of GNU software is to run on top of the GNU kernel,
+compiled with the GNU C compiler, on various types of @sc{cpu}. So the
+kinds of portability that are absolutely necessary are quite limited.
+But it is important to support Linux-based GNU systems, since they
+are the form of GNU that is popular.
+
+Beyond that, it is good to support the other free operating systems
+(*BSD), and it is nice to support other Unix-like systems if you want
+to. Supporting a variety of Unix-like systems is desirable, although
+not paramount. It is usually not too hard, so you may as well do it.
+But you don't have to consider it an obligation, if it does turn out to
+be hard.
+
+@pindex autoconf
+The easiest way to achieve portability to most Unix-like systems is to
+use Autoconf. It's unlikely that your program needs to know more
+information about the host platform than Autoconf can provide, simply
+because most of the programs that need such knowledge have already been
+written.
+
+Avoid using the format of semi-internal data bases (e.g., directories)
+when there is a higher-level alternative (@code{readdir}).
+
+@cindex non-@sc{posix} systems, and portability
+As for systems that are not like Unix, such as MSDOS, Windows, VMS, MVS,
+and older Macintosh systems, supporting them is often a lot of work.
+When that is the case, it is better to spend your time adding features
+that will be useful on GNU and GNU/Linux, rather than on supporting
+other incompatible systems.
+
+If you do support Windows, please do not abbreviate it as ``win''. In
+hacker terminology, calling something a ``win'' is a form of praise.
+You're free to praise Microsoft Windows on your own if you want, but
+please don't do this in GNU packages. Instead of abbreviating
+``Windows'' to ``win'', you can write it in full or abbreviate it to
+``woe'' or ``w''. In GNU Emacs, for instance, we use @samp{w32} in
+file names of Windows-specific files, but the macro for Windows
+conditionals is called @code{WINDOWSNT}.
+
+It is a good idea to define the ``feature test macro''
+@code{_GNU_SOURCE} when compiling your C files. When you compile on GNU
+or GNU/Linux, this will enable the declarations of GNU library extension
+functions, and that will usually give you a compiler error message if
+you define the same function names in some other way in your program.
+(You don't have to actually @emph{use} these functions, if you prefer
+to make the program more portable to other systems.)
+
+But whether or not you use these GNU extensions, you should avoid
+using their names for any other meanings. Doing so would make it hard
+to move your code into other GNU programs.
+
+@node CPU Portability
+@section Portability between @sc{cpu}s
+
+@cindex data types, and portability
+@cindex portability, and data types
+Even GNU systems will differ because of differences among @sc{cpu}
+types---for example, difference in byte ordering and alignment
+requirements. It is absolutely essential to handle these differences.
+However, don't make any effort to cater to the possibility that an
+@code{int} will be less than 32 bits. We don't support 16-bit machines
+in GNU.
+
+Similarly, don't make any effort to cater to the possibility that
+@code{long} will be smaller than predefined types like @code{size_t}.
+For example, the following code is ok:
+
+@example
+printf ("size = %lu\n", (unsigned long) sizeof array);
+printf ("diff = %ld\n", (long) (pointer2 - pointer1));
+@end example
+
+1989 Standard C requires this to work, and we know of only one
+counterexample: 64-bit programs on Microsoft Windows. We will
+leave it to those who want to port GNU programs to that environment
+to figure out how to do it.
+
+Predefined file-size types like @code{off_t} are an exception: they are
+longer than @code{long} on many platforms, so code like the above won't
+work with them. One way to print an @code{off_t} value portably is to
+print its digits yourself, one by one.
+
+Don't assume that the address of an @code{int} object is also the
+address of its least-significant byte. This is false on big-endian
+machines. Thus, don't make the following mistake:
+
+@example
+int c;
+@dots{}
+while ((c = getchar ()) != EOF)
+ write (file_descriptor, &c, 1);
+@end example
+
+@noindent Instead, use @code{unsigned char} as follows. (The @code{unsigned}
+is for portability to unusual systems where @code{char} is signed and
+where there is integer overflow checking.)
+
+@example
+int c;
+while ((c = getchar ()) != EOF)
+ @{
+ unsigned char u = c;
+ write (file_descriptor, &u, 1);
+ @}
+@end example
+
+It used to be ok to not worry about the difference between pointers
+and integers when passing arguments to functions. However, on most
+modern 64-bit machines pointers are wider than @code{int}.
+Conversely, integer types like @code{long long int} and @code{off_t}
+are wider than pointers on most modern 32-bit machines. Hence it's
+often better nowadays to use prototypes to define functions whose
+argument types are not trivial.
+
+In particular, if functions accept varying argument counts or types
+they should be declared using prototypes containing @samp{...} and
+defined using @file{stdarg.h}. For an example of this, please see the
+@uref{http://www.gnu.org/software/gnulib/, Gnulib} error module, which
+declares and defines the following function:
+
+@example
+/* Print a message with `fprintf (stderr, FORMAT, ...)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
+
+void error (int status, int errnum, const char *format, ...);
+@end example
+
+A simple way to use the Gnulib error module is to obtain the two
+source files @file{error.c} and @file{error.h} from the Gnulib library
+source code repository at
+@uref{http://git.savannah.gnu.org/@/gitweb/@/?p=gnulib.git}.
+Here's a sample use:
+
+@example
+#include "error.h"
+#include <errno.h>
+#include <stdio.h>
+
+char *program_name = "myprogram";
+
+FILE *
+xfopen (char const *name)
+@{
+ FILE *fp = fopen (name, "r");
+ if (! fp)
+ error (1, errno, "cannot read %s", name);
+ return fp;
+@}
+@end example
+
+@cindex casting pointers to integers
+Avoid casting pointers to integers if you can. Such casts greatly
+reduce portability, and in most programs they are easy to avoid. In the
+cases where casting pointers to integers is essential---such as, a Lisp
+interpreter which stores type information as well as an address in one
+word---you'll have to make explicit provisions to handle different word
+sizes. You will also need to make provision for systems in which the
+normal range of addresses you can get from @code{malloc} starts far away
+from zero.
+
+@node System Functions
+@section Calling System Functions
+@cindex library functions, and portability
+@cindex portability, and library functions
+
+C implementations differ substantially. Standard C reduces but does
+not eliminate the incompatibilities; meanwhile, many GNU packages still
+support pre-standard compilers because this is not hard to do. This
+chapter gives recommendations for how to use the more-or-less standard C
+library functions to avoid unnecessary loss of portability.
+
+@itemize @bullet
+@item
+Don't use the return value of @code{sprintf}. It returns the number of
+characters written on some systems, but not on all systems.
+
+@item
+Be aware that @code{vfprintf} is not always available.
+
+@item
+@code{main} should be declared to return type @code{int}. It should
+terminate either by calling @code{exit} or by returning the integer
+status code; make sure it cannot ever return an undefined value.
+
+@cindex declaration for system functions
+@item
+Don't declare system functions explicitly.
+
+Almost any declaration for a system function is wrong on some system.
+To minimize conflicts, leave it to the system header files to declare
+system functions. If the headers don't declare a function, let it
+remain undeclared.
+
+While it may seem unclean to use a function without declaring it, in
+practice this works fine for most system library functions on the
+systems where this really happens; thus, the disadvantage is only
+theoretical. By contrast, actual declarations have frequently caused
+actual conflicts.
+
+@item
+If you must declare a system function, don't specify the argument types.
+Use an old-style declaration, not a Standard C prototype. The more you
+specify about the function, the more likely a conflict.
+
+@item
+In particular, don't unconditionally declare @code{malloc} or
+@code{realloc}.
+
+Most GNU programs use those functions just once, in functions
+conventionally named @code{xmalloc} and @code{xrealloc}. These
+functions call @code{malloc} and @code{realloc}, respectively, and
+check the results.
+
+Because @code{xmalloc} and @code{xrealloc} are defined in your program,
+you can declare them in other files without any risk of type conflict.
+
+On most systems, @code{int} is the same length as a pointer; thus, the
+calls to @code{malloc} and @code{realloc} work fine. For the few
+exceptional systems (mostly 64-bit machines), you can use
+@strong{conditionalized} declarations of @code{malloc} and
+@code{realloc}---or put these declarations in configuration files
+specific to those systems.
+
+@cindex string library functions
+@item
+The string functions require special treatment. Some Unix systems have
+a header file @file{string.h}; others have @file{strings.h}. Neither
+file name is portable. There are two things you can do: use Autoconf to
+figure out which file to include, or don't include either file.
+
+@item
+If you don't include either strings file, you can't get declarations for
+the string functions from the header file in the usual way.
+
+That causes less of a problem than you might think. The newer standard
+string functions should be avoided anyway because many systems still
+don't support them. The string functions you can use are these:
+
+@example
+strcpy strncpy strcat strncat
+strlen strcmp strncmp
+strchr strrchr
+@end example
+
+The copy and concatenate functions work fine without a declaration as
+long as you don't use their values. Using their values without a
+declaration fails on systems where the width of a pointer differs from
+the width of @code{int}, and perhaps in other cases. It is trivial to
+avoid using their values, so do that.
+
+The compare functions and @code{strlen} work fine without a declaration
+on most systems, possibly all the ones that GNU software runs on.
+You may find it necessary to declare them @strong{conditionally} on a
+few systems.
+
+The search functions must be declared to return @code{char *}. Luckily,
+there is no variation in the data type they return. But there is
+variation in their names. Some systems give these functions the names
+@code{index} and @code{rindex}; other systems use the names
+@code{strchr} and @code{strrchr}. Some systems support both pairs of
+names, but neither pair works on all systems.
+
+You should pick a single pair of names and use it throughout your
+program. (Nowadays, it is better to choose @code{strchr} and
+@code{strrchr} for new programs, since those are the standard
+names.) Declare both of those names as functions returning @code{char
+*}. On systems which don't support those names, define them as macros
+in terms of the other pair. For example, here is what to put at the
+beginning of your file (or in a header) if you want to use the names
+@code{strchr} and @code{strrchr} throughout:
+
+@example
+#ifndef HAVE_STRCHR
+#define strchr index
+#endif
+#ifndef HAVE_STRRCHR
+#define strrchr rindex
+#endif
+
+char *strchr ();
+char *strrchr ();
+@end example
+@end itemize
+
+Here we assume that @code{HAVE_STRCHR} and @code{HAVE_STRRCHR} are
+macros defined in systems where the corresponding functions exist.
+One way to get them properly defined is to use Autoconf.
+
+@node Internationalization
+@section Internationalization
+@cindex internationalization
+
+@pindex gettext
+GNU has a library called GNU gettext that makes it easy to translate the
+messages in a program into various languages. You should use this
+library in every program. Use English for the messages as they appear
+in the program, and let gettext provide the way to translate them into
+other languages.
+
+Using GNU gettext involves putting a call to the @code{gettext} macro
+around each string that might need translation---like this:
+
+@example
+printf (gettext ("Processing file `%s'..."));
+@end example
+
+@noindent
+This permits GNU gettext to replace the string @code{"Processing file
+`%s'..."} with a translated version.
+
+Once a program uses gettext, please make a point of writing calls to
+@code{gettext} when you add new strings that call for translation.
+
+Using GNU gettext in a package involves specifying a @dfn{text domain
+name} for the package. The text domain name is used to separate the
+translations for this package from the translations for other packages.
+Normally, the text domain name should be the same as the name of the
+package---for example, @samp{coreutils} for the GNU core utilities.
+
+@cindex message text, and internationalization
+To enable gettext to work well, avoid writing code that makes
+assumptions about the structure of words or sentences. When you want
+the precise text of a sentence to vary depending on the data, use two or
+more alternative string constants each containing a complete sentences,
+rather than inserting conditionalized words or phrases into a single
+sentence framework.
+
+Here is an example of what not to do:
+
+@smallexample
+printf ("%s is full", capacity > 5000000 ? "disk" : "floppy disk");
+@end smallexample
+
+If you apply gettext to all strings, like this,
+
+@smallexample
+printf (gettext ("%s is full"),
+ capacity > 5000000 ? gettext ("disk") : gettext ("floppy disk"));
+@end smallexample
+
+@noindent
+the translator will hardly know that "disk" and "floppy disk" are meant to
+be substituted in the other string. Worse, in some languages (like French)
+the construction will not work: the translation of the word "full" depends
+on the gender of the first part of the sentence; it happens to be not the
+same for "disk" as for "floppy disk".
+
+Complete sentences can be translated without problems:
+
+@example
+printf (capacity > 5000000 ? gettext ("disk is full")
+ : gettext ("floppy disk is full"));
+@end example
+
+A similar problem appears at the level of sentence structure with this
+code:
+
+@example
+printf ("# Implicit rule search has%s been done.\n",
+ f->tried_implicit ? "" : " not");
+@end example
+
+@noindent
+Adding @code{gettext} calls to this code cannot give correct results for
+all languages, because negation in some languages requires adding words
+at more than one place in the sentence. By contrast, adding
+@code{gettext} calls does the job straightforwardly if the code starts
+out like this:
+
+@example
+printf (f->tried_implicit
+ ? "# Implicit rule search has been done.\n",
+ : "# Implicit rule search has not been done.\n");
+@end example
+
+Another example is this one:
+
+@example
+printf ("%d file%s processed", nfiles,
+ nfiles != 1 ? "s" : "");
+@end example
+
+@noindent
+The problem with this example is that it assumes that plurals are made
+by adding `s'. If you apply gettext to the format string, like this,
+
+@example
+printf (gettext ("%d file%s processed"), nfiles,
+ nfiles != 1 ? "s" : "");
+@end example
+
+@noindent
+the message can use different words, but it will still be forced to use
+`s' for the plural. Here is a better way, with gettext being applied to
+the two strings independently:
+
+@example
+printf ((nfiles != 1 ? gettext ("%d files processed")
+ : gettext ("%d file processed")),
+ nfiles);
+@end example
+
+@noindent
+But this still doesn't work for languages like Polish, which has three
+plural forms: one for nfiles == 1, one for nfiles == 2, 3, 4, 22, 23, 24, ...
+and one for the rest. The GNU @code{ngettext} function solves this problem:
+
+@example
+printf (ngettext ("%d files processed", "%d file processed", nfiles),
+ nfiles);
+@end example
+
+
+@node Character Set
+@section Character Set
+@cindex character set
+@cindex encodings
+@cindex ASCII characters
+@cindex non-ASCII characters
+
+Sticking to the ASCII character set (plain text, 7-bit characters) is
+preferred in GNU source code comments, text documents, and other
+contexts, unless there is good reason to do something else because of
+the application domain. For example, if source code deals with the
+French Revolutionary calendar, it is OK if its literal strings contain
+accented characters in month names like ``Flor@'eal''. Also, it is OK
+to use non-ASCII characters to represent proper names of contributors in
+change logs (@pxref{Change Logs}).
+
+If you need to use non-ASCII characters, you should normally stick with
+one encoding, as one cannot in general mix encodings reliably.
+
+
+@node Quote Characters
+@section Quote Characters
+@cindex quote characters
+@cindex locale-specific quote characters
+@cindex left quote
+@cindex grave accent
+
+In the C locale, GNU programs should stick to plain ASCII for quotation
+characters in messages to users: preferably 0x60 (@samp{`}) for left
+quotes and 0x27 (@samp{'}) for right quotes. It is ok, but not
+required, to use locale-specific quotes in other locales.
+
+The @uref{http://www.gnu.org/software/gnulib/, Gnulib} @code{quote} and
+@code{quotearg} modules provide a reasonably straightforward way to
+support locale-specific quote characters, as well as taking care of
+other issues, such as quoting a filename that itself contains a quote
+character. See the Gnulib documentation for usage details.
+
+In any case, the documentation for your program should clearly specify
+how it does quoting, if different than the preferred method of @samp{`}
+and @samp{'}. This is especially important if the output of your
+program is ever likely to be parsed by another program.
+
+Quotation characters are a difficult area in the computing world at
+this time: there are no true left or right quote characters in Latin1;
+the @samp{`} character we use was standardized there as a grave
+accent. Moreover, Latin1 is still not universally usable.
+
+Unicode contains the unambiguous quote characters required, and its
+common encoding UTF-8 is upward compatible with Latin1. However,
+Unicode and UTF-8 are not universally well-supported, either.
+
+This may change over the next few years, and then we will revisit
+this.
+
+
+@node Mmap
+@section Mmap
+@findex mmap
+
+Don't assume that @code{mmap} either works on all files or fails
+for all files. It may work on some files and fail on others.
+
+The proper way to use @code{mmap} is to try it on the specific file for
+which you want to use it---and if @code{mmap} doesn't work, fall back on
+doing the job in another way using @code{read} and @code{write}.
+
+The reason this precaution is needed is that the GNU kernel (the HURD)
+provides a user-extensible file system, in which there can be many
+different kinds of ``ordinary files.'' Many of them support
+@code{mmap}, but some do not. It is important to make programs handle
+all these kinds of files.
+
+@node Documentation
+@chapter Documenting Programs
+@cindex documentation
+
+A GNU program should ideally come with full free documentation, adequate
+for both reference and tutorial purposes. If the package can be
+programmed or extended, the documentation should cover programming or
+extending it, as well as just using it.
+
+@menu
+* GNU Manuals:: Writing proper manuals.
+* Doc Strings and Manuals:: Compiling doc strings doesn't make a manual.
+* Manual Structure Details:: Specific structure conventions.
+* License for Manuals:: Writing the distribution terms for a manual.
+* Manual Credits:: Giving credit to documentation contributors.
+* Printed Manuals:: Mentioning the printed manual.
+* NEWS File:: NEWS files supplement manuals.
+* Change Logs:: Recording changes.
+* Man Pages:: Man pages are secondary.
+* Reading other Manuals:: How far you can go in learning
+ from other manuals.
+@end menu
+
+@node GNU Manuals
+@section GNU Manuals
+
+The preferred document format for the GNU system is the Texinfo
+formatting language. Every GNU package should (ideally) have
+documentation in Texinfo both for reference and for learners. Texinfo
+makes it possible to produce a good quality formatted book, using
+@TeX{}, and to generate an Info file. It is also possible to generate
+HTML output from Texinfo source. See the Texinfo manual, either the
+hardcopy, or the on-line version available through @code{info} or the
+Emacs Info subsystem (@kbd{C-h i}).
+
+Nowadays some other formats such as Docbook and Sgmltexi can be
+converted automatically into Texinfo. It is ok to produce the Texinfo
+documentation by conversion this way, as long as it gives good results.
+
+Make sure your manual is clear to a reader who knows nothing about the
+topic and reads it straight through. This means covering basic topics
+at the beginning, and advanced topics only later. This also means
+defining every specialized term when it is first used.
+
+Programmers tend to carry over the structure of the program as the
+structure for its documentation. But this structure is not
+necessarily good for explaining how to use the program; it may be
+irrelevant and confusing for a user.
+
+Instead, the right way to structure documentation is according to the
+concepts and questions that a user will have in mind when reading it.
+This principle applies at every level, from the lowest (ordering
+sentences in a paragraph) to the highest (ordering of chapter topics
+within the manual). Sometimes this structure of ideas matches the
+structure of the implementation of the software being documented---but
+often they are different. An important part of learning to write good
+documentation is to learn to notice when you have unthinkingly
+structured the documentation like the implementation, stop yourself,
+and look for better alternatives.
+
+For example, each program in the GNU system probably ought to be
+documented in one manual; but this does not mean each program should
+have its own manual. That would be following the structure of the
+implementation, rather than the structure that helps the user
+understand.
+
+Instead, each manual should cover a coherent @emph{topic}. For example,
+instead of a manual for @code{diff} and a manual for @code{diff3}, we
+have one manual for ``comparison of files'' which covers both of those
+programs, as well as @code{cmp}. By documenting these programs
+together, we can make the whole subject clearer.
+
+The manual which discusses a program should certainly document all of
+the program's command-line options and all of its commands. It should
+give examples of their use. But don't organize the manual as a list
+of features. Instead, organize it logically, by subtopics. Address
+the questions that a user will ask when thinking about the job that
+the program does. Don't just tell the reader what each feature can
+do---say what jobs it is good for, and show how to use it for those
+jobs. Explain what is recommended usage, and what kinds of usage
+users should avoid.
+
+In general, a GNU manual should serve both as tutorial and reference.
+It should be set up for convenient access to each topic through Info,
+and for reading straight through (appendixes aside). A GNU manual
+should give a good introduction to a beginner reading through from the
+start, and should also provide all the details that hackers want.
+The Bison manual is a good example of this---please take a look at it
+to see what we mean.
+
+That is not as hard as it first sounds. Arrange each chapter as a
+logical breakdown of its topic, but order the sections, and write their
+text, so that reading the chapter straight through makes sense. Do
+likewise when structuring the book into chapters, and when structuring a
+section into paragraphs. The watchword is, @emph{at each point, address
+the most fundamental and important issue raised by the preceding text.}
+
+If necessary, add extra chapters at the beginning of the manual which
+are purely tutorial and cover the basics of the subject. These provide
+the framework for a beginner to understand the rest of the manual. The
+Bison manual provides a good example of how to do this.
+
+To serve as a reference, a manual should have an Index that list all the
+functions, variables, options, and important concepts that are part of
+the program. One combined Index should do for a short manual, but
+sometimes for a complex package it is better to use multiple indices.
+The Texinfo manual includes advice on preparing good index entries, see
+@ref{Index Entries, , Making Index Entries, texinfo, GNU Texinfo}, and
+see @ref{Indexing Commands, , Defining the Entries of an
+Index, texinfo, GNU Texinfo}.
+
+Don't use Unix man pages as a model for how to write GNU documentation;
+most of them are terse, badly structured, and give inadequate
+explanation of the underlying concepts. (There are, of course, some
+exceptions.) Also, Unix man pages use a particular format which is
+different from what we use in GNU manuals.
+
+Please include an email address in the manual for where to report
+bugs @emph{in the text of the manual}.
+
+Please do not use the term ``pathname'' that is used in Unix
+documentation; use ``file name'' (two words) instead. We use the term
+``path'' only for search paths, which are lists of directory names.
+
+Please do not use the term ``illegal'' to refer to erroneous input to
+a computer program. Please use ``invalid'' for this, and reserve the
+term ``illegal'' for activities prohibited by law.
+
+Please do not write @samp{()} after a function name just to indicate
+it is a function. @code{foo ()} is not a function, it is a function
+call with no arguments.
+
+@node Doc Strings and Manuals
+@section Doc Strings and Manuals
+
+Some programming systems, such as Emacs, provide a documentation string
+for each function, command or variable. You may be tempted to write a
+reference manual by compiling the documentation strings and writing a
+little additional text to go around them---but you must not do it. That
+approach is a fundamental mistake. The text of well-written
+documentation strings will be entirely wrong for a manual.
+
+A documentation string needs to stand alone---when it appears on the
+screen, there will be no other text to introduce or explain it.
+Meanwhile, it can be rather informal in style.
+
+The text describing a function or variable in a manual must not stand
+alone; it appears in the context of a section or subsection. Other text
+at the beginning of the section should explain some of the concepts, and
+should often make some general points that apply to several functions or
+variables. The previous descriptions of functions and variables in the
+section will also have given information about the topic. A description
+written to stand alone would repeat some of that information; this
+redundancy looks bad. Meanwhile, the informality that is acceptable in
+a documentation string is totally unacceptable in a manual.
+
+The only good way to use documentation strings in writing a good manual
+is to use them as a source of information for writing good text.
+
+@node Manual Structure Details
+@section Manual Structure Details
+@cindex manual structure
+
+The title page of the manual should state the version of the programs or
+packages documented in the manual. The Top node of the manual should
+also contain this information. If the manual is changing more
+frequently than or independent of the program, also state a version
+number for the manual in both of these places.
+
+Each program documented in the manual should have a node named
+@samp{@var{program} Invocation} or @samp{Invoking @var{program}}. This
+node (together with its subnodes, if any) should describe the program's
+command line arguments and how to run it (the sort of information people
+would look for in a man page). Start with an @samp{@@example}
+containing a template for all the options and arguments that the program
+uses.
+
+Alternatively, put a menu item in some menu whose item name fits one of
+the above patterns. This identifies the node which that item points to
+as the node for this purpose, regardless of the node's actual name.
+
+The @samp{--usage} feature of the Info reader looks for such a node
+or menu item in order to find the relevant text, so it is essential
+for every Texinfo file to have one.
+
+If one manual describes several programs, it should have such a node for
+each program described in the manual.
+
+@node License for Manuals
+@section License for Manuals
+@cindex license for manuals
+
+Please use the GNU Free Documentation License for all GNU manuals that
+are more than a few pages long. Likewise for a collection of short
+documents---you only need one copy of the GNU FDL for the whole
+collection. For a single short document, you can use a very permissive
+non-copyleft license, to avoid taking up space with a long license.
+
+See @uref{http://www.gnu.org/copyleft/fdl-howto.html} for more explanation
+of how to employ the GFDL.
+
+Note that it is not obligatory to include a copy of the GNU GPL or GNU
+LGPL in a manual whose license is neither the GPL nor the LGPL. It can
+be a good idea to include the program's license in a large manual; in a
+short manual, whose size would be increased considerably by including
+the program's license, it is probably better not to include it.
+
+@node Manual Credits
+@section Manual Credits
+@cindex credits for manuals
+
+Please credit the principal human writers of the manual as the authors,
+on the title page of the manual. If a company sponsored the work, thank
+the company in a suitable place in the manual, but do not cite the
+company as an author.
+
+@node Printed Manuals
+@section Printed Manuals
+
+The FSF publishes some GNU manuals in printed form. To encourage sales
+of these manuals, the on-line versions of the manual should mention at
+the very start that the printed manual is available and should point at
+information for getting it---for instance, with a link to the page
+@url{http://www.gnu.org/order/order.html}. This should not be included
+in the printed manual, though, because there it is redundant.
+
+It is also useful to explain in the on-line forms of the manual how the
+user can print out the manual from the sources.
+
+@node NEWS File
+@section The NEWS File
+@cindex @file{NEWS} file
+
+In addition to its manual, the package should have a file named
+@file{NEWS} which contains a list of user-visible changes worth
+mentioning. In each new release, add items to the front of the file and
+identify the version they pertain to. Don't discard old items; leave
+them in the file after the newer items. This way, a user upgrading from
+any previous version can see what is new.
+
+If the @file{NEWS} file gets very long, move some of the older items
+into a file named @file{ONEWS} and put a note at the end referring the
+user to that file.
+
+@node Change Logs
+@section Change Logs
+@cindex change logs
+
+Keep a change log to describe all the changes made to program source
+files. The purpose of this is so that people investigating bugs in the
+future will know about the changes that might have introduced the bug.
+Often a new bug can be found by looking at what was recently changed.
+More importantly, change logs can help you eliminate conceptual
+inconsistencies between different parts of a program, by giving you a
+history of how the conflicting concepts arose and who they came from.
+
+@menu
+* Change Log Concepts::
+* Style of Change Logs::
+* Simple Changes::
+* Conditional Changes::
+* Indicating the Part Changed::
+@end menu
+
+@node Change Log Concepts
+@subsection Change Log Concepts
+
+You can think of the change log as a conceptual ``undo list'' which
+explains how earlier versions were different from the current version.
+People can see the current version; they don't need the change log
+to tell them what is in it. What they want from a change log is a
+clear explanation of how the earlier version differed.
+
+The change log file is normally called @file{ChangeLog} and covers an
+entire directory. Each directory can have its own change log, or a
+directory can use the change log of its parent directory---it's up to
+you.
+
+Another alternative is to record change log information with a version
+control system such as RCS or CVS. This can be converted automatically
+to a @file{ChangeLog} file using @code{rcs2log}; in Emacs, the command
+@kbd{C-x v a} (@code{vc-update-change-log}) does the job.
+
+There's no need to describe the full purpose of the changes or how
+they work together. However, sometimes it is useful to write one line
+to describe the overall purpose of a change or a batch of changes. If
+you think that a change calls for explanation, you're probably right.
+Please do explain it---but please put the full explanation in comments
+in the code, where people will see it whenever they see the code. For
+example, ``New function'' is enough for the change log when you add a
+function, because there should be a comment before the function
+definition to explain what it does.
+
+In the past, we recommended not mentioning changes in non-software
+files (manuals, help files, etc.) in change logs. However, we've been
+advised that it is a good idea to include them, for the sake of
+copyright records.
+
+The easiest way to add an entry to @file{ChangeLog} is with the Emacs
+command @kbd{M-x add-change-log-entry}. An entry should have an
+asterisk, the name of the changed file, and then in parentheses the name
+of the changed functions, variables or whatever, followed by a colon.
+Then describe the changes you made to that function or variable.
+
+@node Style of Change Logs
+@subsection Style of Change Logs
+@cindex change logs, style
+
+Here are some simple examples of change log entries, starting with the
+header line that says who made the change and when it was installed,
+followed by descriptions of specific changes. (These examples are
+drawn from Emacs and GCC.)
+
+@example
+1998-08-17 Richard Stallman <rms@@gnu.org>
+
+* register.el (insert-register): Return nil.
+(jump-to-register): Likewise.
+
+* sort.el (sort-subr): Return nil.
+
+* tex-mode.el (tex-bibtex-file, tex-file, tex-region):
+Restart the tex shell if process is gone or stopped.
+(tex-shell-running): New function.
+
+* expr.c (store_one_arg): Round size up for move_block_to_reg.
+(expand_call): Round up when emitting USE insns.
+* stmt.c (assign_parms): Round size up for move_block_from_reg.
+@end example
+
+It's important to name the changed function or variable in full. Don't
+abbreviate function or variable names, and don't combine them.
+Subsequent maintainers will often search for a function name to find all
+the change log entries that pertain to it; if you abbreviate the name,
+they won't find it when they search.
+
+For example, some people are tempted to abbreviate groups of function
+names by writing @samp{* register.el (@{insert,jump-to@}-register)};
+this is not a good idea, since searching for @code{jump-to-register} or
+@code{insert-register} would not find that entry.
+
+Separate unrelated change log entries with blank lines. When two
+entries represent parts of the same change, so that they work together,
+then don't put blank lines between them. Then you can omit the file
+name and the asterisk when successive entries are in the same file.
+
+Break long lists of function names by closing continued lines with
+@samp{)}, rather than @samp{,}, and opening the continuation with
+@samp{(} as in this example:
+
+@example
+* keyboard.c (menu_bar_items, tool_bar_items)
+(Fexecute_extended_command): Deal with `keymap' property.
+@end example
+
+When you install someone else's changes, put the contributor's name in
+the change log entry rather than in the text of the entry. In other
+words, write this:
+
+@example
+2002-07-14 John Doe <jdoe@@gnu.org>
+
+ * sewing.c: Make it sew.
+@end example
+
+@noindent
+rather than this:
+
+@example
+2002-07-14 Usual Maintainer <usual@@gnu.org>
+
+ * sewing.c: Make it sew. Patch by jdoe@@gnu.org.
+@end example
+
+As for the date, that should be the date you applied the change.
+
+@node Simple Changes
+@subsection Simple Changes
+
+Certain simple kinds of changes don't need much detail in the change
+log.
+
+When you change the calling sequence of a function in a simple fashion,
+and you change all the callers of the function to use the new calling
+sequence, there is no need to make individual entries for all the
+callers that you changed. Just write in the entry for the function
+being called, ``All callers changed''---like this:
+
+@example
+* keyboard.c (Fcommand_execute): New arg SPECIAL.
+All callers changed.
+@end example
+
+When you change just comments or doc strings, it is enough to write an
+entry for the file, without mentioning the functions. Just ``Doc
+fixes'' is enough for the change log.
+
+There's no technical need to make change log entries for documentation
+files. This is because documentation is not susceptible to bugs that
+are hard to fix. Documentation does not consist of parts that must
+interact in a precisely engineered fashion. To correct an error, you
+need not know the history of the erroneous passage; it is enough to
+compare what the documentation says with the way the program actually
+works.
+
+However, you should keep change logs for documentation files when the
+project gets copyright assignments from its contributors, so as to
+make the records of authorship more accurate.
+
+@node Conditional Changes
+@subsection Conditional Changes
+@cindex conditional changes, and change logs
+@cindex change logs, conditional changes
+
+C programs often contain compile-time @code{#if} conditionals. Many
+changes are conditional; sometimes you add a new definition which is
+entirely contained in a conditional. It is very useful to indicate in
+the change log the conditions for which the change applies.
+
+Our convention for indicating conditional changes is to use square
+brackets around the name of the condition.
+
+Here is a simple example, describing a change which is conditional but
+does not have a function or entity name associated with it:
+
+@example
+* xterm.c [SOLARIS2]: Include string.h.
+@end example
+
+Here is an entry describing a new definition which is entirely
+conditional. This new definition for the macro @code{FRAME_WINDOW_P} is
+used only when @code{HAVE_X_WINDOWS} is defined:
+
+@example
+* frame.h [HAVE_X_WINDOWS] (FRAME_WINDOW_P): Macro defined.
+@end example
+
+Here is an entry for a change within the function @code{init_display},
+whose definition as a whole is unconditional, but the changes themselves
+are contained in a @samp{#ifdef HAVE_LIBNCURSES} conditional:
+
+@example
+* dispnew.c (init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
+@end example
+
+Here is an entry for a change that takes affect only when
+a certain macro is @emph{not} defined:
+
+@example
+(gethostname) [!HAVE_SOCKETS]: Replace with winsock version.
+@end example
+
+@node Indicating the Part Changed
+@subsection Indicating the Part Changed
+
+Indicate the part of a function which changed by using angle brackets
+enclosing an indication of what the changed part does. Here is an entry
+for a change in the part of the function @code{sh-while-getopts} that
+deals with @code{sh} commands:
+
+@example
+* progmodes/sh-script.el (sh-while-getopts) <sh>: Handle case that
+user-specified option string is empty.
+@end example
+
+
+@node Man Pages
+@section Man Pages
+@cindex man pages
+
+In the GNU project, man pages are secondary. It is not necessary or
+expected for every GNU program to have a man page, but some of them do.
+It's your choice whether to include a man page in your program.
+
+When you make this decision, consider that supporting a man page
+requires continual effort each time the program is changed. The time
+you spend on the man page is time taken away from more useful work.
+
+For a simple program which changes little, updating the man page may be
+a small job. Then there is little reason not to include a man page, if
+you have one.
+
+For a large program that changes a great deal, updating a man page may
+be a substantial burden. If a user offers to donate a man page, you may
+find this gift costly to accept. It may be better to refuse the man
+page unless the same person agrees to take full responsibility for
+maintaining it---so that you can wash your hands of it entirely. If
+this volunteer later ceases to do the job, then don't feel obliged to
+pick it up yourself; it may be better to withdraw the man page from the
+distribution until someone else agrees to update it.
+
+When a program changes only a little, you may feel that the
+discrepancies are small enough that the man page remains useful without
+updating. If so, put a prominent note near the beginning of the man
+page explaining that you don't maintain it and that the Texinfo manual
+is more authoritative. The note should say how to access the Texinfo
+documentation.
+
+Be sure that man pages include a copyright statement and free license.
+The simple all-permissive license is appropriate for simple man pages
+(@pxref{License Notices for Other Files,,,maintain,Information for GNU
+Maintainers}).
+
+For long man pages, with enough explanation and documentation that
+they can be considered true manuals, use the GFDL (@pxref{License for
+Manuals}).
+
+Finally, the GNU help2man program
+(@uref{http://www.gnu.org/software/help2man/}) is one way to automate
+generation of a man page, in this case from @option{--help} output.
+This is sufficient in many cases.
+
+@node Reading other Manuals
+@section Reading other Manuals
+
+There may be non-free books or documentation files that describe the
+program you are documenting.
+
+It is ok to use these documents for reference, just as the author of a
+new algebra textbook can read other books on algebra. A large portion
+of any non-fiction book consists of facts, in this case facts about how
+a certain program works, and these facts are necessarily the same for
+everyone who writes about the subject. But be careful not to copy your
+outline structure, wording, tables or examples from preexisting non-free
+documentation. Copying from free documentation may be ok; please check
+with the FSF about the individual case.
+
+@node Managing Releases
+@chapter The Release Process
+@cindex releasing
+
+Making a release is more than just bundling up your source files in a
+tar file and putting it up for FTP. You should set up your software so
+that it can be configured to run on a variety of systems. Your Makefile
+should conform to the GNU standards described below, and your directory
+layout should also conform to the standards discussed below. Doing so
+makes it easy to include your package into the larger framework of
+all GNU software.
+
+@menu
+* Configuration:: How configuration of GNU packages should work.
+* Makefile Conventions:: Makefile conventions.
+* Releases:: Making releases
+@end menu
+
+@node Configuration
+@section How Configuration Should Work
+@cindex program configuration
+
+@pindex configure
+Each GNU distribution should come with a shell script named
+@code{configure}. This script is given arguments which describe the
+kind of machine and system you want to compile the program for.
+The @code{configure} script must record the configuration options so
+that they affect compilation.
+
+The description here is the specification of the interface for the
+@code{configure} script in GNU packages. Many packages implement it
+using GNU Autoconf (@pxref{Top,, Introduction, autoconf, Autoconf})
+and/or GNU Automake (@pxref{Top,, Introduction, automake, Automake}),
+but you do not have to use these tools. You can implement it any way
+you like; for instance, by making @code{configure} be a wrapper around
+a completely different configuration system.
+
+Another way for the @code{configure} script to operate is to make a
+link from a standard name such as @file{config.h} to the proper
+configuration file for the chosen system. If you use this technique,
+the distribution should @emph{not} contain a file named
+@file{config.h}. This is so that people won't be able to build the
+program without configuring it first.
+
+Another thing that @code{configure} can do is to edit the Makefile. If
+you do this, the distribution should @emph{not} contain a file named
+@file{Makefile}. Instead, it should include a file @file{Makefile.in} which
+contains the input used for editing. Once again, this is so that people
+won't be able to build the program without configuring it first.
+
+If @code{configure} does write the @file{Makefile}, then @file{Makefile}
+should have a target named @file{Makefile} which causes @code{configure}
+to be rerun, setting up the same configuration that was set up last
+time. The files that @code{configure} reads should be listed as
+dependencies of @file{Makefile}.
+
+All the files which are output from the @code{configure} script should
+have comments at the beginning explaining that they were generated
+automatically using @code{configure}. This is so that users won't think
+of trying to edit them by hand.
+
+The @code{configure} script should write a file named @file{config.status}
+which describes which configuration options were specified when the
+program was last configured. This file should be a shell script which,
+if run, will recreate the same configuration.
+
+The @code{configure} script should accept an option of the form
+@samp{--srcdir=@var{dirname}} to specify the directory where sources are found
+(if it is not the current directory). This makes it possible to build
+the program in a separate directory, so that the actual source directory
+is not modified.
+
+If the user does not specify @samp{--srcdir}, then @code{configure} should
+check both @file{.} and @file{..} to see if it can find the sources. If
+it finds the sources in one of these places, it should use them from
+there. Otherwise, it should report that it cannot find the sources, and
+should exit with nonzero status.
+
+Usually the easy way to support @samp{--srcdir} is by editing a
+definition of @code{VPATH} into the Makefile. Some rules may need to
+refer explicitly to the specified source directory. To make this
+possible, @code{configure} can add to the Makefile a variable named
+@code{srcdir} whose value is precisely the specified directory.
+
+In addition, the @samp{configure} script should take options
+corresponding to most of the standard directory variables
+(@pxref{Directory Variables}). Here is the list:
+
+@example
+--prefix --exec-prefix --bindir --sbindir --libexecdir --sysconfdir
+--sharedstatedir --localstatedir --libdir --includedir --oldincludedir
+--datarootdir --datadir --infodir --localedir --mandir --docdir
+--htmldir --dvidir --pdfdir --psdir
+@end example
+
+The @code{configure} script should also take an argument which specifies the
+type of system to build the program for. This argument should look like
+this:
+
+@example
+@var{cpu}-@var{company}-@var{system}
+@end example
+
+For example, an Athlon-based GNU/Linux system might be
+@samp{i686-pc-linux-gnu}.
+
+The @code{configure} script needs to be able to decode all plausible
+alternatives for how to describe a machine. Thus,
+@samp{athlon-pc-gnu/linux} would be a valid alias. There is a shell
+script called
+@uref{http://git.savannah.gnu.org/@/gitweb/@/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD,
+@file{config.sub}} that you can use as a subroutine to validate system
+types and canonicalize aliases.
+
+The @code{configure} script should also take the option
+@option{--build=@var{buildtype}}, which should be equivalent to a
+plain @var{buildtype} argument. For example, @samp{configure
+--build=i686-pc-linux-gnu} is equivalent to @samp{configure
+i686-pc-linux-gnu}. When the build type is not specified by an option
+or argument, the @code{configure} script should normally guess it using
+the shell script
+@uref{http://git.savannah.gnu.org/@/gitweb/@/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD,
+@file{config.guess}}.
+
+@cindex optional features, configure-time
+Other options are permitted to specify in more detail the software
+or hardware present on the machine, to include or exclude optional parts
+of the package, or to adjust the name of some tools or arguments to them:
+
+@table @samp
+@item --enable-@var{feature}@r{[}=@var{parameter}@r{]}
+Configure the package to build and install an optional user-level
+facility called @var{feature}. This allows users to choose which
+optional features to include. Giving an optional @var{parameter} of
+@samp{no} should omit @var{feature}, if it is built by default.
+
+No @samp{--enable} option should @strong{ever} cause one feature to
+replace another. No @samp{--enable} option should ever substitute one
+useful behavior for another useful behavior. The only proper use for
+@samp{--enable} is for questions of whether to build part of the program
+or exclude it.
+
+@item --with-@var{package}
+@c @r{[}=@var{parameter}@r{]}
+The package @var{package} will be installed, so configure this package
+to work with @var{package}.
+
+@c Giving an optional @var{parameter} of
+@c @samp{no} should omit @var{package}, if it is used by default.
+
+Possible values of @var{package} include
+@samp{gnu-as} (or @samp{gas}), @samp{gnu-ld}, @samp{gnu-libc},
+@samp{gdb},
+@samp{x},
+and
+@samp{x-toolkit}.
+
+Do not use a @samp{--with} option to specify the file name to use to
+find certain files. That is outside the scope of what @samp{--with}
+options are for.
+
+@item @var{variable}=@var{value}
+Set the value of the variable @var{variable} to @var{value}. This is
+used to override the default values of commands or arguments in the
+build process. For example, the user could issue @samp{configure
+CFLAGS=-g CXXFLAGS=-g} to build with debugging information and without
+the default optimization.
+
+Specifying variables as arguments to @code{configure}, like this:
+@example
+./configure CC=gcc
+@end example
+is preferable to setting them in environment variables:
+@example
+CC=gcc ./configure
+@end example
+as it helps to recreate the same configuration later with
+@file{config.status}. However, both methods should be supported.
+@end table
+
+All @code{configure} scripts should accept all of the ``detail''
+options and the variable settings, whether or not they make any
+difference to the particular package at hand. In particular, they
+should accept any option that starts with @samp{--with-} or
+@samp{--enable-}. This is so users will be able to configure an
+entire GNU source tree at once with a single set of options.
+
+You will note that the categories @samp{--with-} and @samp{--enable-}
+are narrow: they @strong{do not} provide a place for any sort of option
+you might think of. That is deliberate. We want to limit the possible
+configuration options in GNU software. We do not want GNU programs to
+have idiosyncratic configuration options.
+
+Packages that perform part of the compilation process may support
+cross-compilation. In such a case, the host and target machines for the
+program may be different.
+
+The @code{configure} script should normally treat the specified type of
+system as both the host and the target, thus producing a program which
+works for the same type of machine that it runs on.
+
+To compile a program to run on a host type that differs from the build
+type, use the configure option @option{--host=@var{hosttype}}, where
+@var{hosttype} uses the same syntax as @var{buildtype}. The host type
+normally defaults to the build type.
+
+To configure a cross-compiler, cross-assembler, or what have you, you
+should specify a target different from the host, using the configure
+option @samp{--target=@var{targettype}}. The syntax for
+@var{targettype} is the same as for the host type. So the command would
+look like this:
+
+@example
+./configure --host=@var{hosttype} --target=@var{targettype}
+@end example
+
+The target type normally defaults to the host type.
+Programs for which cross-operation is not meaningful need not accept the
+@samp{--target} option, because configuring an entire operating system for
+cross-operation is not a meaningful operation.
+
+Some programs have ways of configuring themselves automatically. If
+your program is set up to do this, your @code{configure} script can simply
+ignore most of its arguments.
+
+@comment The makefile standards are in a separate file that is also
+@comment included by make.texinfo. Done by roland@gnu.ai.mit.edu on 1/6/93.
+@comment For this document, turn chapters into sections, etc.
+@lowersections
+@include make-stds.texi
+@raisesections
+
+@node Releases
+@section Making Releases
+@cindex packaging
+
+You should identify each release with a pair of version numbers, a
+major version and a minor. We have no objection to using more than
+two numbers, but it is very unlikely that you really need them.
+
+Package the distribution of @code{Foo version 69.96} up in a gzipped tar
+file with the name @file{foo-69.96.tar.gz}. It should unpack into a
+subdirectory named @file{foo-69.96}.
+
+Building and installing the program should never modify any of the files
+contained in the distribution. This means that all the files that form
+part of the program in any way must be classified into @dfn{source
+files} and @dfn{non-source files}. Source files are written by humans
+and never changed automatically; non-source files are produced from
+source files by programs under the control of the Makefile.
+
+@cindex @file{README} file
+The distribution should contain a file named @file{README} which gives
+the name of the package, and a general description of what it does. It
+is also good to explain the purpose of each of the first-level
+subdirectories in the package, if there are any. The @file{README} file
+should either state the version number of the package, or refer to where
+in the package it can be found.
+
+The @file{README} file should refer to the file @file{INSTALL}, which
+should contain an explanation of the installation procedure.
+
+The @file{README} file should also refer to the file which contains the
+copying conditions. The GNU GPL, if used, should be in a file called
+@file{COPYING}. If the GNU LGPL is used, it should be in a file called
+@file{COPYING.LESSER}.
+
+Naturally, all the source files must be in the distribution. It is okay
+to include non-source files in the distribution, provided they are
+up-to-date and machine-independent, so that building the distribution
+normally will never modify them. We commonly include non-source files
+produced by Bison, @code{lex}, @TeX{}, and @code{makeinfo}; this helps avoid
+unnecessary dependencies between our distributions, so that users can
+install whichever packages they want to install.
+
+Non-source files that might actually be modified by building and
+installing the program should @strong{never} be included in the
+distribution. So if you do distribute non-source files, always make
+sure they are up to date when you make a new distribution.
+
+Make sure that all the files in the distribution are world-readable, and
+that directories are world-readable and world-searchable (octal mode 755).
+We used to recommend that all directories in the distribution also be
+world-writable (octal mode 777), because ancient versions of @code{tar}
+would otherwise not cope when extracting the archive as an unprivileged
+user. That can easily lead to security issues when creating the archive,
+however, so now we recommend against that.
+
+Don't include any symbolic links in the distribution itself. If the tar
+file contains symbolic links, then people cannot even unpack it on
+systems that don't support symbolic links. Also, don't use multiple
+names for one file in different directories, because certain file
+systems cannot handle this and that prevents unpacking the
+distribution.
+
+Try to make sure that all the file names will be unique on MS-DOS. A
+name on MS-DOS consists of up to 8 characters, optionally followed by a
+period and up to three characters. MS-DOS will truncate extra
+characters both before and after the period. Thus,
+@file{foobarhacker.c} and @file{foobarhacker.o} are not ambiguous; they
+are truncated to @file{foobarha.c} and @file{foobarha.o}, which are
+distinct.
+
+@cindex @file{texinfo.tex}, in a distribution
+Include in your distribution a copy of the @file{texinfo.tex} you used
+to test print any @file{*.texinfo} or @file{*.texi} files.
+
+Likewise, if your program uses small GNU software packages like regex,
+getopt, obstack, or termcap, include them in the distribution file.
+Leaving them out would make the distribution file a little smaller at
+the expense of possible inconvenience to a user who doesn't know what
+other files to get.
+
+@node References
+@chapter References to Non-Free Software and Documentation
+@cindex references to non-free material
+
+A GNU program should not recommend, promote, or grant legitimacy to
+the use of any non-free program. Proprietary software is a social and
+ethical problem, and our aim is to put an end to that problem. We
+can't stop some people from writing proprietary programs, or stop
+other people from using them, but we can and should refuse to
+advertise them to new potential customers, or to give the public the
+idea that their existence is ethical.
+
+The GNU definition of free software is found on the GNU web site at
+@url{http://www.gnu.org/@/philosophy/@/free-sw.html}, and the definition
+of free documentation is found at
+@url{http://www.gnu.org/@/philosophy/@/free-doc.html}. The terms ``free''
+and ``non-free'', used in this document, refer to those definitions.
+
+A list of important licenses and whether they qualify as free is in
+@url{http://www.gnu.org/@/licenses/@/license-list.html}. If it is not
+clear whether a license qualifies as free, please ask the GNU Project
+by writing to @email{licensing@@gnu.org}. We will answer, and if the
+license is an important one, we will add it to the list.
+
+When a non-free program or system is well known, you can mention it in
+passing---that is harmless, since users who might want to use it
+probably already know about it. For instance, it is fine to explain
+how to build your package on top of some widely used non-free
+operating system, or how to use it together with some widely used
+non-free program.
+
+However, you should give only the necessary information to help those
+who already use the non-free program to use your program with
+it---don't give, or refer to, any further information about the
+proprietary program, and don't imply that the proprietary program
+enhances your program, or that its existence is in any way a good
+thing. The goal should be that people already using the proprietary
+program will get the advice they need about how to use your free
+program with it, while people who don't already use the proprietary
+program will not see anything likely to lead them to take an interest
+in it.
+
+If a non-free program or system is obscure in your program's domain,
+your program should not mention or support it at all, since doing so
+would tend to popularize the non-free program more than it popularizes
+your program. (You cannot hope to find many additional users for your
+program among the users of Foobar, if the existence of Foobar is not
+generally known among people who might want to use your program.)
+
+Sometimes a program is free software in itself but depends on a
+non-free platform in order to run. For instance, many Java programs
+depend on some non-free Java libraries. To recommend or promote such
+a program is to promote the other programs it needs. This is why we
+are careful about listing Java programs in the Free Software
+Directory: we don't want to promote the non-free Java libraries.
+
+We hope this particular problem with Java will be gone by and by, as
+we replace the remaining non-free standard Java libraries with free
+software, but the general principle will remain the same: don't
+recommend, promote or legitimize programs that depend on non-free
+software to run.
+
+Some free programs strongly encourage the use of non-free software. A
+typical example is @command{mplayer}. It is free software in itself,
+and the free code can handle some kinds of files. However,
+@command{mplayer} recommends use of non-free codecs for other kinds of
+files, and users that install @command{mplayer} are very likely to
+install those codecs along with it. To recommend @command{mplayer}
+is, in effect, to promote use of the non-free codecs.
+
+Thus, you should not recommend programs that strongly encourage the
+use of non-free software. This is why we do not list
+@command{mplayer} in the Free Software Directory.
+
+A GNU package should not refer the user to any non-free documentation
+for free software. Free documentation that can be included in free
+operating systems is essential for completing the GNU system, or any
+free operating system, so encouraging it is a priority; to recommend
+use of documentation that we are not allowed to include undermines the
+impetus for the community to produce documentation that we can
+include. So GNU packages should never recommend non-free
+documentation.
+
+By contrast, it is ok to refer to journal articles and textbooks in
+the comments of a program for explanation of how it functions, even
+though they are non-free. This is because we don't include such
+things in the GNU system even they are free---they are outside the
+scope of what a software distribution needs to include.
+
+Referring to a web site that describes or recommends a non-free
+program is promoting that program, so please do not make links (or
+mention by name) web sites that contain such material. This policy is
+relevant particularly for the web pages for a GNU package.
+
+Following links from nearly any web site can lead eventually to
+non-free software; this is inherent in the nature of the web. So it
+makes no sense to criticize a site for having such links. As long as
+the site does not itself recommend a non-free program, there is no
+need to consider the question of the sites that it links to for other
+reasons.
+
+Thus, for example, you should not refer to AT&T's web site if that
+recommends AT&T's non-free software packages; you should not refer to
+a site that links to AT&T's site presenting it as a place to get some
+non-free program, because that link recommends and legitimizes the
+non-free program. However, that a site contains a link to AT&T's web
+site for some other purpose (such as long-distance telephone service)
+is not an objection against it.
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@cindex FDL, GNU Free Documentation License
+@include fdl.texi
+
+@node Index
+@unnumbered Index
+@printindex cp
+
+@bye
+
+Local variables:
+eval: (add-hook 'write-file-hooks 'time-stamp)
+time-stamp-start: "@set lastupdate "
+time-stamp-end: "$"
+time-stamp-format: "%:b %:d, %:y"
+compile-command: "cd work.s && make"
+End:
diff --git a/gnulib/doc/verify.texi b/gnulib/doc/verify.texi
new file mode 100644
index 00000000..98e77f81
--- /dev/null
+++ b/gnulib/doc/verify.texi
@@ -0,0 +1,82 @@
+@c GNU verify module documentation
+
+@c Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3
+@c or any later version published by the Free Software Foundation;
+@c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+@c Texts. A copy of the license is included in the ``GNU Free
+@c Documentation License'' file as part of this distribution.
+
+@node Compile-time Assertions
+@section Compile-time Assertions
+
+@cindex assertion
+@findex verify
+@findex verify_true
+
+The @samp{verify} module supports compile-time tests, as opposed to
+the standard @file{assert.h} header which supports only runtime tests.
+Since the tests occur at compile-time, they are more reliable, and
+they require no runtime overhead.
+
+This module provides a header file @file{verify.h} that defines two
+macros: @code{verify (@var{EXPRESSION})} and @code{verify_true
+(@var{EXPRESSION})}. Both accept an integer constant expression
+argument and verify that it is nonzero. If not, a compile-time error
+results.
+
+@code{verify (@var{EXPRESSION});} is a declaration; it can occur
+outside of functions. In contrast, @code{verify_true
+(@var{EXPRESSION})} is an integer constant expression that always
+evaluates to 1; it can be used in macros that expand to
+expressions.
+
+@var{EXPRESSION} should be an integer constant expression in the sense
+of the C standard. Its leaf operands should be integer, enumeration,
+or character constants; or @code{sizeof} expressions that return
+constants; or floating constants that are the immediate operands of
+casts. Outside a @code{sizeof} subexpression, @var{EXPRESSION} should
+not contain any assignments, function calls, comma operators, casts to
+non-integer types, or subexpressions whose values are outside the
+representable ranges for their types. If @var{EXPRESSION} is not an
+integer constant expression, then a compiler might reject a usage like
+@samp{verify (@var{EXPRESSION});} even when @var{EXPRESSION} is
+nonzero.
+
+Here are some example uses.
+
+@example
+#include <verify.h>
+
+#include <limits.h>
+#include <time.h>
+
+/* Verify that time_t is an integer type. */
+verify ((time_t) 1.5 == 1);
+
+/* Verify that time_t is at least as wide as int. */
+verify (INT_MIN == (time_t) INT_MIN);
+verify (INT_MAX == (time_t) INT_MAX);
+
+/* Verify that time_t is signed. */
+verify ((time_t) -1 < 0);
+
+/* Verify that time_t uses two's complement representation. */
+verify (~ (time_t) -1 == 0);
+
+/* Return the maximum value of the integer type T,
+ verifying that T is an unsigned integer type. */
+#define MAX_UNSIGNED_VAL_WITH_COMMA(t) \
+ (verify_true (0 < (T) -1), (T) -1)
+
+/* Same as MAX_UNSIGNED_VAL_WITH_COMMA,
+ but expand to an integer constant expression,
+ which cannot contain a comma operator.
+ The cast to (T) is outside the conditional expression
+ so that the result is of type T
+ even when T is narrower than unsigned int. */
+#define MAX_UNSIGNED_VAL(t) ((T) \
+ ((T) (verify_true (0 < (T) -1) ? -1 : 0))
+@end example
diff --git a/gnulib/doc/warnings.texi b/gnulib/doc/warnings.texi
new file mode 100644
index 00000000..ce4920c8
--- /dev/null
+++ b/gnulib/doc/warnings.texi
@@ -0,0 +1,58 @@
+@node warnings
+@section warnings
+
+The @code{warnings} module allows to regularly build a package with more
+GCC warnings than the default warnings emitted by GCC.
+
+It provides the following functionality:
+
+@itemize @bullet
+@item
+You can select some warning options, such as @samp{-Wall}, to be enabled
+whenever building with a GCC version that supports these options. The
+user can choose to override these warning options by providing the
+opposite options in the @code{CFLAGS} variable at configuration time.
+
+@item
+You can make these warnings apply to selected directories only. In
+projects where subprojects are maintained by different people, or where
+parts of the source code are imported from external sources -- for example
+from gnulib --, it is useful to apply different warning options to
+different directories.
+
+@item
+It allows to use @samp{-Werror} at @samp{make distcheck} time, to verify
+that on the maintainer's system, no warnings remain. (Note that use of
+@samp{-Werror} in @code{CFLAGS} does not work in general, because it may
+break autoconfiguration.)
+@end itemize
+
+To use this module, you need the following:
+
+@enumerate
+@item
+In @file{configure.ac}, use for example
+@smallexample
+gl_WARN_ADD([-Wall], [WARN_CFLAGS])
+gl_WARN_ADD([-Wpointer-arith], [WARN_CFLAGS])
+@end smallexample
+
+@item
+In the directories which shall use @code{WARN_CFLAGS}, use it in the
+definition of @code{AM_CFLAGS}, like this:
+@smallexample
+AM_CFLAGS = $(WARN_CFLAGS)
+@end smallexample
+
+Note that the @code{AM_CFLAGS} is used in combination with @code{CFLAGS}
+and before @code{CFLAGS} in build rules emitted by Automake. This allows
+the user to provide @code{CFLAGS} that override the @code{WARN_CFLAGS}.
+@end enumerate
+
+Note that it is a bad idea to use @samp{gl_WARN_ADD([-Werror])}. The
+warnings emitted by GCC depend, to some extent, on the contents of the
+system header files, on the size and signedness of built-in types, etc.
+Use of @samp{-Werror} would cause frustration to all users on platforms
+that the maintainer has not tested before the release. It is better if
+maintainers use @samp{-Werror} only for themselves (for example, during
+@samp{make distcheck}, as mentioned above).
diff --git a/gnulib/gnulib-tool b/gnulib/gnulib-tool
new file mode 100755
index 00000000..259bb744
--- /dev/null
+++ b/gnulib/gnulib-tool
@@ -0,0 +1,5441 @@
+#! /bin/sh
+#
+# Copyright (C) 2002-2010 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/>.
+#
+
+# This program is meant for authors or maintainers which want to import
+# modules from gnulib into their packages.
+
+progname=$0
+package=gnulib
+nl='
+'
+IFS=" "" $nl"
+
+# You can set AUTOCONFPATH to empty if autoconf 2.57 is already in your PATH.
+AUTOCONFPATH=
+#case $USER in
+# bruno )
+# AUTOCONFBINDIR=/packages/gnu-inst-autoconf/2.57/bin
+# AUTOCONFPATH="eval env PATH=${AUTOCONFBINDIR}:\$PATH "
+# ;;
+#esac
+
+# You can set AUTOMAKEPATH to empty if automake 1.9.x is already in your PATH.
+AUTOMAKEPATH=
+
+# You can set GETTEXTPATH to empty if autopoint 0.15 is already in your PATH.
+GETTEXTPATH=
+
+# If you didn't set AUTOCONFPATH and AUTOMAKEPATH, you can also set the
+# variables AUTOCONF, AUTOHEADER, ACLOCAL, AUTOMAKE, AUTORECONF individually.
+if test -z "${AUTOCONF}" || test -n "${AUTOCONFPATH}"; then
+ AUTOCONF="${AUTOCONFPATH}autoconf"
+fi
+if test -z "${AUTOHEADER}" || test -n "${AUTOCONFPATH}"; then
+ AUTOHEADER="${AUTOCONFPATH}autoheader"
+fi
+if test -z "${ACLOCAL}" || test -n "${AUTOMAKEPATH}"; then
+ ACLOCAL="${AUTOMAKEPATH}aclocal"
+fi
+if test -z "${AUTOMAKE}" || test -n "${AUTOMAKEPATH}"; then
+ AUTOMAKE="${AUTOMAKEPATH}automake"
+fi
+if test -z "${AUTORECONF}" || test -n "${AUTOCONFPATH}"; then
+ AUTORECONF="${AUTOCONFPATH}autoreconf"
+fi
+
+# If you didn't set GETTEXTPATH, you can also set the variable AUTOPOINT.
+if test -z "${AUTOPOINT}" || test -n "${GETTEXTPATH}"; then
+ AUTOPOINT="${GETTEXTPATH}autopoint"
+fi
+
+# You can set MAKE.
+if test -z "${MAKE}"; then
+ MAKE=make
+fi
+
+# When using GNU sed, turn off as many GNU extensions as possible,
+# to minimize the risk of accidentally using non-portable features.
+# However, do this only for gnulib-tool itself, not for the code that
+# gnulib-tool generates, since we don't want "sed --posix" to leak
+# into makefiles. And do it only for sed versions 4.2 or newer,
+# because "sed --posix" is buggy in GNU sed 4.1.5, see
+# <http://lists.gnu.org/archive/html/bug-gnulib/2009-02/msg00225.html>.
+if (alias) > /dev/null 2>&1 \
+ && echo | sed --posix -e d >/dev/null 2>&1 \
+ && case `sed --version | sed -e 's/^[^0-9]*//' -e 1q` in \
+ [1-3]* | 4.[01]*) false;; \
+ *) true;; \
+ esac \
+ ; then
+ # Define sed as an alias.
+ # It is not always possible to use aliases. Aliases are guaranteed to work
+ # if the executing shell is bash and either it is invoked as /bin/sh or
+ # is a version >= 2.0, supporting shopt. This is the common case.
+ # Two other approaches (use of a variable $sed or of a function func_sed
+ # instead of an alias) require massive, fragile code changes.
+ # An other approach (use of function sed) requires `which sed` - but
+ # 'which' is hard to emulate, due to missing "test -x" on some platforms.
+ if test -n "$BASH_VERSION"; then
+ shopt -s expand_aliases >/dev/null 2>&1
+ fi
+ alias sed='sed --posix'
+fi
+
+# sed_noop is a sed expression that does nothing.
+# An empty expression does not work with the native 'sed' on AIX 6.1.
+sed_noop='s,x,x,'
+
+# sed_comments is true or false, depending whether 'sed' supports comments.
+# (The GNU autoconf doc says that sed comments are not portable, but does
+# not say which 'sed' versions are affected.)
+if echo fo | sed -e 's/f/g/
+# s/o/u/
+s/o/e/' 2>/dev/null | grep ge > /dev/null; then
+ sed_comments=true
+else
+ sed_comments=false
+fi
+
+# func_usage
+# outputs to stdout the --help usage message.
+func_usage ()
+{
+ echo "\
+Usage: gnulib-tool --list
+ gnulib-tool --find filename
+ gnulib-tool --import [module1 ... moduleN]
+ gnulib-tool --update
+ gnulib-tool --create-testdir --dir=directory [module1 ... moduleN]
+ gnulib-tool --create-megatestdir --dir=directory [module1 ... moduleN]
+ gnulib-tool --test --dir=directory module1 ... moduleN
+ gnulib-tool --megatest --dir=directory [module1 ... moduleN]
+ gnulib-tool --extract-description module
+ gnulib-tool --extract-status module
+ gnulib-tool --extract-notice module
+ gnulib-tool --extract-applicability module
+ gnulib-tool --extract-filelist module
+ gnulib-tool --extract-dependencies module
+ gnulib-tool --extract-autoconf-snippet module
+ gnulib-tool --extract-automake-snippet module
+ gnulib-tool --extract-include-directive module
+ gnulib-tool --extract-link-directive module
+ gnulib-tool --extract-license module
+ gnulib-tool --extract-maintainer module
+ gnulib-tool --extract-tests-module module
+ gnulib-tool --copy-file file [destination]
+
+Operation modes:
+ --list print the available module names
+ --find find the modules which contain the specified file
+ --import import the given modules into the current package;
+ if no modules are specified, update the current
+ package from the current gnulib
+ --update update the current package, restore files omitted
+ from CVS
+ --create-testdir create a scratch package with the given modules
+ --create-megatestdir create a mega scratch package with the given modules
+ one by one and all together
+ --test test the combination of the given modules
+ (recommended to use CC=\"gcc -Wall\" here)
+ --megatest test the given modules one by one and all together
+ (recommended to use CC=\"gcc -Wall\" here)
+ --extract-description extract the description
+ --extract-status extract the status (obsolete or not)
+ --extract-notice extract the notice or banner
+ --extract-filelist extract the list of files
+ --extract-dependencies extract the dependencies
+ --extract-autoconf-snippet extract the snippet for configure.ac
+ --extract-automake-snippet extract the snippet for library makefile
+ --extract-include-directive extract the #include directive
+ --extract-link-directive extract the linker directive
+ --extract-license report the license terms of the source files
+ under lib/
+ --extract-maintainer report the maintainer(s) inside gnulib
+ --extract-tests-module report the unit test module, if it exists
+ --copy-file copy a file that is not part of any module
+
+General options:
+ --dir=DIRECTORY Specify the target directory.
+ For --import, this specifies where your
+ configure.ac can be found. Defaults to current
+ directory.
+ --local-dir=DIRECTORY Specify a local override directory where to look
+ up files before looking in gnulib's directory.
+ --cache-modules Enable module caching optimization.
+ --no-cache-modules Disable module caching optimization.
+ --verbose Increase verbosity. May be repeated.
+ --quiet Decrease verbosity. May be repeated.
+
+Options for --import:
+ --lib=LIBRARY Specify the library name. Defaults to 'libgnu'.
+ --source-base=DIRECTORY
+ Directory relative to --dir where source code is
+ placed (default \"lib\").
+ --m4-base=DIRECTORY Directory relative to --dir where *.m4 macros are
+ placed (default \"m4\").
+ --po-base=DIRECTORY Directory relative to --dir where *.po files are
+ placed (default \"po\").
+ --doc-base=DIRECTORY Directory relative to --dir where doc files are
+ placed (default \"doc\").
+ --tests-base=DIRECTORY
+ Directory relative to --dir where unit tests are
+ placed (default \"tests\").
+ --aux-dir=DIRECTORY Directory relative to --dir where auxiliary build
+ tools are placed (default \"build-aux\").
+ --with-tests Include unit tests for the included modules.
+ --with-obsolete Include obsolete modules when they occur among the
+ dependencies. By default, dependencies to obsolete
+ modules are ignored.
+ --avoid=MODULE Avoid including the given MODULE. Useful if you
+ have code that provides equivalent functionality.
+ This option can be repeated.
+ --lgpl[=2|=3] Abort if modules aren't available under the LGPL.
+ Also modify license template from GPL to LGPL.
+ The version number of the LGPL can be specified;
+ the default is currently LGPLv3.
+ --makefile-name=NAME Name of makefile in automake syntax in the
+ source-base and tests-base directories
+ (default \"Makefile.am\").
+ --libtool Use libtool rules.
+ --no-libtool Don't use libtool rules.
+ --macro-prefix=PREFIX Specify the prefix of the macros 'gl_EARLY' and
+ 'gl_INIT'. Default is 'gl'.
+ --po-domain=NAME Specify the prefix of the i18n domain. Usually use
+ the package name. A suffix '-gnulib' is appended.
+ --vc-files Update version control related files.
+ --no-vc-files Don't update version control related files
+ (.gitignore and/or .cvsignore).
+ --no-changelog Don't update or create ChangeLog files.
+
+Options for --import and --update:
+ --dry-run For --import, only print what would have been done.
+ -s, --symbolic, --symlink Make symbolic links instead of copying files.
+ --local-symlink Make symbolic links instead of copying files, only
+ for files from the local override directory.
+ -S, --more-symlinks Make symbolic links instead of copying files, and
+ don't replace copyright notices.
+
+Report bugs to <bug-gnulib@gnu.org>."
+}
+
+# func_version
+# outputs to stdout the --version message.
+func_version ()
+{
+ func_gnulib_dir
+ if test -d "$gnulib_dir"/.git \
+ && (git --version) >/dev/null 2>/dev/null \
+ && (date --version) >/dev/null 2>/dev/null; then
+ # gnulib checked out from git.
+ sed_extract_first_date='/^Date/{
+s/^Date:[ ]*//p
+q
+}'
+ date=`cd "$gnulib_dir" && git log ChangeLog | sed -n -e "$sed_extract_first_date"`
+ # Turn "Fri Mar 21 07:16:51 2008 -0600" into "Mar 21 2008 07:16:51 -0600".
+ sed_year_before_time='s/^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) /\1 \2 \4 \3 /'
+ date=`echo "$date" | sed -e "$sed_year_before_time"`
+ # Use GNU date to compute the time in GMT.
+ date=`date -d "$date" -u +"%Y-%m-%d %H:%M:%S"`
+ version=' '`cd "$gnulib_dir" && ./build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
+ else
+ if test -d "$gnulib_dir"/CVS \
+ && (cvs --version) >/dev/null 2>/dev/null; then
+ # gnulib checked out from CVS.
+ sed_extract_first_date='/^date: /{
+s/^date: \([0-9][0-9][0-9][0-9]\).\([0-9][0-9]\).\([0-9][0-9]\) \([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1-\2-\3 \4/p
+q
+}'
+ date=`cd "$gnulib_dir" && cvs log -N ChangeLog 2>/dev/null | sed -n -e "$sed_extract_first_date"`
+ else
+ # gnulib copy without versioning information.
+ date=`sed -e 's/ .*//;q' "$gnulib_dir"/ChangeLog`
+ fi
+ version=
+ fi
+ year=`"$gnulib_dir"/build-aux/mdate-sh "$self_abspathname" | sed -e 's,^.* ,,'`
+ echo "\
+gnulib-tool (GNU $package $date)$version
+Copyright (C) $year Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by" "Bruno Haible" "and" "Simon Josefsson"
+}
+
+# func_emit_copyright_notice
+# outputs to stdout a header for a generated file.
+func_emit_copyright_notice ()
+{
+ sed -n -e '/Copyright/ {
+ p
+ q
+ }' < "$self_abspathname"
+ echo "#"
+ echo "# This file is free software, distributed under the terms of the GNU"
+ echo "# General Public License. As a special exception to the GNU General"
+ echo "# Public License, this file may be distributed as part of a program"
+ echo "# that contains a configuration script generated by Autoconf, under"
+ echo "# the same distribution terms as the rest of that program."
+ echo "#"
+ echo "# Generated by gnulib-tool."
+}
+
+# func_exit STATUS
+# exits with a given status.
+# This function needs to be used, rather than 'exit', when a 'trap' handler is
+# in effect that refers to $?.
+func_exit ()
+{
+ (exit $1); exit $1
+}
+
+# func_gnulib_dir
+# locates the directory where the gnulib repository lives
+# Input:
+# - progname name of this program
+# Sets variables
+# - self_abspathname absolute pathname of gnulib-tool
+# - gnulib_dir absolute pathname of gnulib repository
+func_gnulib_dir ()
+{
+ case "$progname" in
+ /*) self_abspathname="$progname" ;;
+ */*) self_abspathname=`pwd`/"$progname" ;;
+ *)
+ # Look in $PATH.
+ # Iterate through the elements of $PATH.
+ # We use IFS=: instead of
+ # for d in `echo ":$PATH:" | sed -e 's/:::*/:.:/g' | sed -e 's/:/ /g'`
+ # because the latter does not work when some PATH element contains spaces.
+ # We use a canonicalized $pathx instead of $PATH, because empty PATH
+ # elements are by definition equivalent to '.', however field splitting
+ # according to IFS=: loses empty fields in many shells:
+ # - /bin/sh on OSF/1 and Solaris loses all empty fields (at the
+ # beginning, at the end, and in the middle),
+ # - /bin/sh on IRIX and /bin/ksh on IRIX and OSF/1 lose empty fields
+ # at the beginning and at the end,
+ # - GNU bash, /bin/sh on AIX and HP-UX, and /bin/ksh on AIX, HP-UX,
+ # Solaris lose empty fields at the end.
+ # The 'case' statement is an optimization, to avoid evaluating the
+ # explicit canonicalization command when $PATH contains no empty fields.
+ self_abspathname=
+ if test "${PATH_SEPARATOR+set}" != set; then
+ func_tmpdir
+ { echo "#! /bin/sh"; echo "exit 0"; } > "$tmp"/conf.sh
+ chmod +x "$tmp"/conf.sh
+ if (PATH="/nonexistent;$tmp"; conf.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -rf "$tmp"
+ fi
+ if test "$PATH_SEPARATOR" = ";"; then
+ # On Windows, programs are searched in "." before $PATH.
+ pathx=".;$PATH"
+ else
+ # On Unix, we have to convert empty PATH elements to ".".
+ pathx="$PATH"
+ case :$PATH: in
+ *::*)
+ pathx=`echo ":$PATH:" | sed -e 's/:::*/:.:/g' -e 's/^://' -e 's/:\$//'`
+ ;;
+ esac
+ fi
+ save_IFS="$IFS"
+ IFS="$PATH_SEPARATOR"
+ for d in $pathx; do
+ IFS="$save_IFS"
+ test -z "$d" && d=.
+ if test -x "$d/$progname" && test ! -d "$d/$progname"; then
+ self_abspathname="$d/$progname"
+ break
+ fi
+ done
+ IFS="$save_IFS"
+ if test -z "$self_abspathname"; then
+ func_fatal_error "could not locate the gnulib-tool program - how did you invoke it?"
+ fi
+ ;;
+ esac
+ while test -h "$self_abspathname"; do
+ # Resolve symbolic link.
+ linkval=`func_readlink "$self_abspathname"`
+ test -n "$linkval" || break
+ case "$linkval" in
+ /* ) self_abspathname="$linkval" ;;
+ * ) self_abspathname=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`/"$linkval" ;;
+ esac
+ done
+ gnulib_dir=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`
+}
+
+# func_tmpdir
+# creates a temporary directory.
+# Input:
+# - progname name of this program
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gl$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$progname: cannot create a temporary directory in $TMPDIR" >&2
+ func_exit 1
+ }
+}
+
+# func_append var value
+# appends the given value to the shell variable var.
+if ( foo=bar; foo+=baz && test "$foo" = barbaz ) >/dev/null 2>&1; then
+ # Use bash's += operator. It reduces complexity of appending repeatedly to
+ # a single variable from O(n^2) to O(n).
+ func_append ()
+ {
+ eval "$1+=\"\$2\""
+ }
+ fast_func_append=true
+else
+ func_append ()
+ {
+ eval "$1=\"\$$1\$2\""
+ }
+ fast_func_append=false
+fi
+
+# func_remove_prefix var prefix
+# removes the given prefix from the value of the shell variable var.
+# var should be the name of a shell variable.
+# Its value should not contain a newline and not start or end with whitespace.
+# prefix should not contain the characters "$`\{}[]^|.
+if ( foo=bar; eval 'test "${foo#b}" = ar' ) >/dev/null 2>&1; then
+ func_remove_prefix ()
+ {
+ eval "$1=\${$1#\$2}"
+ }
+ fast_func_remove_prefix=true
+else
+ func_remove_prefix ()
+ {
+ eval "value=\"\$$1\""
+ prefix="$2"
+ case "$prefix" in
+ *.*)
+ sed_escape_dots='s/\([.]\)/\\\1/g'
+ prefix=`echo "$prefix" | sed -e "$sed_escape_dots"`
+ ;;
+ esac
+ value=`echo "$value" | sed -e "s|^${prefix}||"`
+ eval "$1=\"\$value\""
+ }
+ fast_func_remove_prefix=false
+fi
+
+# func_remove_suffix var suffix
+# removes the given suffix from the value of the shell variable var.
+# var should be the name of a shell variable.
+# Its value should not contain a newline and not start or end with whitespace.
+# suffix should not contain the characters "$`\{}[]^|.
+if ( foo=bar; eval 'test "${foo%r}" = ba' ) >/dev/null 2>&1; then
+ func_remove_suffix ()
+ {
+ eval "$1=\${$1%\$2}"
+ }
+ fast_func_remove_suffix=true
+else
+ func_remove_suffix ()
+ {
+ eval "value=\"\$$1\""
+ suffix="$2"
+ case "$suffix" in
+ *.*)
+ sed_escape_dots='s/\([.]\)/\\\1/g'
+ suffix=`echo "$suffix" | sed -e "$sed_escape_dots"`
+ ;;
+ esac
+ value=`echo "$value" | sed -e "s|${suffix}\$||"`
+ eval "$1=\"\$value\""
+ }
+ fast_func_remove_suffix=false
+fi
+
+# func_fatal_error message
+# outputs to stderr a fatal error message, and terminates the program.
+# Input:
+# - progname name of this program
+func_fatal_error ()
+{
+ echo "$progname: *** $1" 1>&2
+ echo "$progname: *** Stop." 1>&2
+ func_exit 1
+}
+
+# func_warning message
+# Outputs to stderr a warning message,
+func_warning ()
+{
+ echo "gnulib-tool: warning: $1" 1>&2
+}
+
+# func_readlink SYMLINK
+# outputs the target of the given symlink.
+if (type -p readlink) > /dev/null 2>&1; then
+ func_readlink ()
+ {
+ # Use the readlink program from GNU coreutils.
+ readlink "$1"
+ }
+else
+ func_readlink ()
+ {
+ # Use two sed invocations. A single sed -n -e 's,^.* -> \(.*\)$,\1,p'
+ # would do the wrong thing if the link target contains " -> ".
+ LC_ALL=C ls -l "$1" | sed -e 's, -> ,#%%#,' | sed -n -e 's,^.*#%%#\(.*\)$,\1,p'
+ }
+fi
+
+# func_relativize DIR1 DIR2
+# computes a relative pathname RELDIR such that DIR1/RELDIR = DIR2.
+# Input:
+# - DIR1 relative pathname, relative to the current directory
+# - DIR2 relative pathname, relative to the current directory
+# Output:
+# - reldir relative pathname of DIR2, relative to DIR1
+func_relativize ()
+{
+ dir0=`pwd`
+ dir1="$1"
+ dir2="$2"
+ sed_first='s,^\([^/]*\)/.*$,\1,'
+ sed_rest='s,^[^/]*/*,,'
+ sed_last='s,^.*/\([^/]*\)$,\1,'
+ sed_butlast='s,/*[^/]*$,,'
+ while test -n "$dir1"; do
+ first=`echo "$dir1" | sed -e "$sed_first"`
+ if test "$first" != "."; then
+ if test "$first" = ".."; then
+ dir2=`echo "$dir0" | sed -e "$sed_last"`/"$dir2"
+ dir0=`echo "$dir0" | sed -e "$sed_butlast"`
+ else
+ first2=`echo "$dir2" | sed -e "$sed_first"`
+ if test "$first2" = "$first"; then
+ dir2=`echo "$dir2" | sed -e "$sed_rest"`
+ else
+ dir2="../$dir2"
+ fi
+ dir0="$dir0"/"$first"
+ fi
+ fi
+ dir1=`echo "$dir1" | sed -e "$sed_rest"`
+ done
+ reldir="$dir2"
+}
+
+# func_relconcat DIR1 DIR2
+# computes a relative pathname DIR1/DIR2, with obvious simplifications.
+# Input:
+# - DIR1 relative pathname, relative to the current directory
+# - DIR2 relative pathname, relative to DIR1
+# Output:
+# - relconcat DIR1/DIR2, relative to the current directory
+func_relconcat ()
+{
+ dir1="$1"
+ dir2="$2"
+ sed_first='s,^\([^/]*\)/.*$,\1,'
+ sed_rest='s,^[^/]*/*,,'
+ sed_last='s,^.*/\([^/]*\)$,\1,'
+ sed_butlast='s,/*[^/]*$,,'
+ while true; do
+ first=`echo "$dir2" | sed -e "$sed_first"`
+ if test "$first" = "."; then
+ dir2=`echo "$dir2" | sed -e "$sed_rest"`
+ if test -z "$dir2"; then
+ relconcat="$dir1"
+ break
+ fi
+ else
+ last=`echo "$dir1" | sed -e "$sed_last"`
+ while test "$last" = "."; do
+ dir1=`echo "$dir1" | sed -e "$sed_butlast"`
+ last=`echo "$dir1" | sed -e "$sed_last"`
+ done
+ if test -z "$dir1"; then
+ relconcat="$dir2"
+ break
+ fi
+ if test "$first" = ".."; then
+ if test "$last" = ".."; then
+ relconcat="$dir1/$dir2"
+ break
+ fi
+ dir1=`echo "$dir1" | sed -e "$sed_butlast"`
+ dir2=`echo "$dir2" | sed -e "$sed_rest"`
+ if test -z "$dir1"; then
+ relconcat="$dir2"
+ break
+ fi
+ if test -z "$dir2"; then
+ relconcat="$dir1"
+ break
+ fi
+ else
+ relconcat="$dir1/$dir2"
+ break
+ fi
+ fi
+ done
+}
+
+# func_ln SRC DEST
+# Like ln -s, except that SRC is given relative to the current directory (or
+# absolute), not given relative to the directory of DEST.
+func_ln ()
+{
+ case "$1" in
+ /*)
+ ln -s "$1" "$2" ;;
+ *) # SRC is relative.
+ case "$2" in
+ /*)
+ ln -s "`pwd`/$1" "$2" ;;
+ *) # DEST is relative too.
+ ln_destdir=`echo "$2" | sed -e 's,[^/]*$,,'`
+ test -n "$ln_destdir" || ln_destdir="."
+ func_relativize "$ln_destdir" "$1"
+ ln -s "$reldir" "$2"
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_ln_if_changed SRC DEST
+# Like func_ln, but avoids munging timestamps if the link is correct.
+func_ln_if_changed ()
+{
+ if test $# -ne 2; then
+ echo "usage: func_ln_if_changed SRC DEST" >&2
+ fi
+ ln_target=`func_readlink "$2"`
+ if test -h "$2" && test "$1" = "$ln_target"; then
+ :
+ else
+ rm -f "$2"
+ func_ln "$1" "$2"
+ fi
+}
+
+# Ensure an 'echo' command that
+# 1. does not interpret backslashes and
+# 2. does not print an error message "broken pipe" when writing into a pipe
+# with no writers.
+#
+# Test cases for problem 1:
+# echo '\n' | wc -l prints 1 when OK, 2 when KO
+# echo '\t' | grep t > /dev/null has return code 0 when OK, 1 when KO
+# Test cases for problem 2:
+# echo hi | true frequently prints
+# "bash: echo: write error: Broken pipe"
+# to standard error in bash 3.2.
+#
+# Problem 1 is a weird heritage from SVR4. BSD got it right (except that
+# BSD echo interprets '-n' as an option, which is also not desirable).
+# Nowadays the problem occurs in 4 situations:
+# - in bash, when the shell option xpg_echo is set (bash >= 2.04)
+# or when it was built with --enable-usg-echo-default (bash >= 2.0)
+# or when it was built with DEFAULT_ECHO_TO_USG (bash < 2.0),
+# - in zsh, when sh-emulation is not set,
+# - in ksh (e.g. AIX /bin/sh and Solaris /usr/xpg4/bin/sh are ksh instances,
+# and HP-UX /bin/sh and IRIX /bin/sh behave similarly),
+# - in Solaris /bin/sh and OSF/1 /bin/sh.
+# We try the following workarounds:
+# - for all: respawn using $CONFIG_SHELL if that is set and works.
+# - for bash >= 2.04: unset the shell option xpg_echo.
+# - for bash >= 2.0: define echo to a function that uses the printf built-in.
+# - for bash < 2.0: define echo to a function that uses cat of a here document.
+# - for zsh: turn sh-emulation on.
+# - for ksh: alias echo to 'print -r'.
+# - for ksh: alias echo to a function that uses cat of a here document.
+# - for Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh and rely on
+# the ksh workaround.
+# - otherwise: respawn using /bin/sh and rely on the workarounds.
+# When respawning, we pass --no-reexec as first argument, so as to avoid
+# turning this script into a fork bomb in unlucky situations.
+#
+# Problem 2 is specific to bash 3.2 and affects the 'echo' built-in, but not
+# the 'printf' built-in. See
+# <http://lists.gnu.org/archive/html/bug-bash/2008-12/msg00050.html>
+# <http://lists.gnu.org/archive/html/bug-gnulib/2010-02/msg00154.html>
+# The workaround is: define echo to a function that uses the printf built-in.
+have_echo=
+if echo '\t' | grep t > /dev/null; then
+ have_echo=yes # Lucky!
+fi
+# Try the workarounds.
+# Respawn using $CONFIG_SHELL if that is set and works.
+if test -z "$have_echo" \
+ && test "X$1" != "X--no-reexec" \
+ && test -n "$CONFIG_SHELL" \
+ && test -f "$CONFIG_SHELL" \
+ && $CONFIG_SHELL -c "echo '\\t' | grep t > /dev/null"; then
+ exec $CONFIG_SHELL "$0" --no-reexec "$@"
+ exit 127
+fi
+# For bash >= 2.04: unset the shell option xpg_echo.
+if test -z "$have_echo" \
+ && test -n "$BASH_VERSION" \
+ && (shopt -o xpg_echo; echo '\t' | grep t > /dev/null) 2>/dev/null; then
+ shopt -o xpg_echo
+ have_echo=yes
+fi
+# For bash >= 2.0: define echo to a function that uses the printf built-in.
+# For bash < 2.0: define echo to a function that uses cat of a here document.
+# (There is no win in using 'printf' over 'cat' if it is not a shell built-in.)
+# Also handle problem 2, specific to bash 3.2, here.
+if { test -z "$have_echo" \
+ || case "$BASH_VERSION" in 3.2*) true;; *) false;; esac; \
+ } \
+ && test -n "$BASH_VERSION"; then \
+ if type printf 2>/dev/null | grep / > /dev/null; then
+ # 'printf' is not a shell built-in.
+echo ()
+{
+cat <<EOF
+$*
+EOF
+}
+ else
+ # 'printf' is a shell built-in.
+echo ()
+{
+ printf '%s\n' "$*"
+}
+ fi
+ if echo '\t' | grep t > /dev/null; then
+ have_echo=yes
+ fi
+fi
+# For zsh: turn sh-emulation on.
+if test -z "$have_echo" \
+ && test -n "$ZSH_VERSION" \
+ && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+fi
+# For ksh: alias echo to 'print -r'.
+if test -z "$have_echo" \
+ && (type print) >/dev/null 2>&1; then
+ # A 'print' command exists.
+ if type print 2>/dev/null | grep / > /dev/null; then
+ :
+ else
+ # 'print' is a shell built-in.
+ if (print -r '\told' | grep told > /dev/null) 2>/dev/null; then
+ # 'print' is the ksh shell built-in.
+ alias echo='print -r'
+ fi
+ fi
+fi
+if test -z "$have_echo" \
+ && echo '\t' | grep t > /dev/null; then
+ have_echo=yes
+fi
+# For ksh: alias echo to a function that uses cat of a here document.
+# The ksh manual page says:
+# "Aliasing is performed when scripts are read, not while they are executed.
+# Therefore, for an alias to take effect, the alias definition command has
+# to be executed before the command which references the alias is read."
+# Because of this, we have to play strange tricks with have_echo, to ensure
+# that the top-level statement containing the test starts after the 'alias'
+# command.
+if test -z "$have_echo"; then
+bsd_echo ()
+{
+cat <<EOF
+$*
+EOF
+}
+alias echo=bsd_echo 2>/dev/null
+fi
+if test -z "$have_echo" \
+ && echo '\t' | grep t > /dev/null; then
+ have_echo=yes
+fi
+if test -z "$have_echo"; then
+ unalias echo 2>/dev/null
+fi
+# For Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh.
+if test -z "$have_echo" \
+ && test "X$1" != "X--no-reexec" \
+ && test -f /bin/ksh; then
+ exec /bin/ksh "$0" --no-reexec "$@"
+ exit 127
+fi
+# Otherwise: respawn using /bin/sh.
+if test -z "$have_echo" \
+ && test "X$1" != "X--no-reexec" \
+ && test -f /bin/sh; then
+ exec /bin/sh "$0" --no-reexec "$@"
+ exit 127
+fi
+if test -z "$have_echo"; then
+ func_fatal_error "Shell does not support 'echo' correctly. Please install GNU bash and set the environment variable CONFIG_SHELL to point to it."
+fi
+if echo '\t' | grep t > /dev/null; then
+ : # Works fine now.
+else
+ func_fatal_error "Shell does not support 'echo' correctly. Workaround does not work. Please report this as a bug to bug-gnulib@gnu.org."
+fi
+if test "X$1" = "X--no-reexec"; then
+ shift
+fi
+
+# Command-line option processing.
+# Removes the OPTIONS from the arguments. Sets the variables:
+# - mode list or import or create-testdir or create-megatestdir
+# - destdir from --dir
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - verbose integer, default 0, inc/decremented by --verbose/--quiet
+# - libname, supplied_libname from --lib
+# - sourcebase from --source-base
+# - m4base from --m4-base
+# - pobase from --po-base
+# - docbase from --doc-base
+# - testsbase from --tests-base
+# - auxdir from --aux-dir
+# - inctests true if --with-tests was given, blank otherwise
+# - incobsolete true if --with-obsolete was given, blank otherwise
+# - avoidlist list of modules to avoid, from --avoid
+# - lgpl yes or a number if --lgpl was given, blank otherwise
+# - makefile_name from --makefile-name
+# - libtool true if --libtool was given, false if --no-libtool was
+# given, blank otherwise
+# - macro_prefix from --macro-prefix
+# - po_domain from --po-domain
+# - vc_files true if --vc-files was given, false if --no-vc-files was
+# given, blank otherwise
+# - autoconf_minversion minimum supported autoconf version
+# - do_changelog false if --no-changelog was given, : otherwise
+# - doit : if actions shall be executed, false if only to be printed
+# - symbolic true if --symlink or --more-symlinks was given, blank
+# otherwise
+# - lsymbolic true if --local-symlink was given, blank otherwise
+# - do_copyrights blank if --more-symlinks was given, true otherwise
+{
+ mode=
+ destdir=
+ local_gnulib_dir=
+ modcache=true
+ verbose=0
+ libname=libgnu
+ supplied_libname=
+ sourcebase=
+ m4base=
+ pobase=
+ docbase=
+ testsbase=
+ auxdir=
+ inctests=
+ incobsolete=
+ avoidlist=
+ lgpl=
+ makefile_name=
+ libtool=
+ macro_prefix=
+ po_domain=
+ vc_files=
+ do_changelog=:
+ doit=:
+ symbolic=
+ lsymbolic=
+ do_copyrights=true
+
+ supplied_opts="$@"
+
+ while test $# -gt 0; do
+ case "$1" in
+ --list | --lis )
+ mode=list
+ shift ;;
+ --find | --fin | --fi | --f )
+ mode=find
+ shift ;;
+ --import | --impor | --impo | --imp | --im | --i )
+ mode=import
+ shift ;;
+ --update | --updat | --upda | --upd | --up | --u )
+ mode=update
+ shift ;;
+ --create-testdir | --create-testdi | --create-testd | --create-test | --create-tes | --create-te | --create-t )
+ mode=create-testdir
+ shift ;;
+ --create-megatestdir | --create-megatestdi | --create-megatestd | --create-megatest | --create-megates | --create-megate | --create-megat | --create-mega | --create-meg | --create-me | --create-m )
+ mode=create-megatestdir
+ shift ;;
+ --test | --tes | --te | --t )
+ mode=test
+ shift ;;
+ --megatest | --megates | --megate | --megat | --mega | --meg | --me | --m )
+ mode=megatest
+ shift ;;
+ --extract-* )
+ mode=`echo "X$1" | sed -e 's/^X--//'`
+ shift ;;
+ --copy-file | --copy-fil | --copy-fi | --copy-f | --copy- | --copy | --cop | --co )
+ mode=copy-file
+ shift ;;
+ --dir )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --dir"
+ fi
+ destdir=$1
+ shift ;;
+ --dir=* )
+ destdir=`echo "X$1" | sed -e 's/^X--dir=//'`
+ shift ;;
+ --local-dir )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --local-dir"
+ fi
+ local_gnulib_dir=$1
+ shift ;;
+ --local-dir=* )
+ local_gnulib_dir=`echo "X$1" | sed -e 's/^X--local-dir=//'`
+ shift ;;
+ --cache-modules | --cache-module | --cache-modul | --cache-modu | --cache-mod | --cache-mo | --cache-m | --cache- | --cache | --cach | --cac | --ca )
+ modcache=true
+ shift ;;
+ --no-cache-modules | --no-cache-module | --no-cache-modul | --no-cache-modu | --no-cache-mod | --no-cache-mo | --no-cache-m | --no-cache- | --no-cache | --no-cach | --no-cac | --no-ca )
+ modcache=false
+ shift ;;
+ --verbose | --verbos | --verbo | --verb )
+ verbose=`expr $verbose + 1`
+ shift ;;
+ --quiet | --quie | --qui | --qu | --q )
+ verbose=`expr $verbose - 1`
+ shift ;;
+ --lib )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --lib"
+ fi
+ libname=$1
+ supplied_libname=true
+ shift ;;
+ --lib=* )
+ libname=`echo "X$1" | sed -e 's/^X--lib=//'`
+ supplied_libname=true
+ shift ;;
+ --source-base )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --source-base"
+ fi
+ sourcebase=$1
+ shift ;;
+ --source-base=* )
+ sourcebase=`echo "X$1" | sed -e 's/^X--source-base=//'`
+ shift ;;
+ --m4-base )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --m4-base"
+ fi
+ m4base=$1
+ shift ;;
+ --m4-base=* )
+ m4base=`echo "X$1" | sed -e 's/^X--m4-base=//'`
+ shift ;;
+ --po-base )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --po-base"
+ fi
+ pobase=$1
+ shift ;;
+ --po-base=* )
+ pobase=`echo "X$1" | sed -e 's/^X--po-base=//'`
+ shift ;;
+ --doc-base )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --doc-base"
+ fi
+ docbase=$1
+ shift ;;
+ --doc-base=* )
+ docbase=`echo "X$1" | sed -e 's/^X--doc-base=//'`
+ shift ;;
+ --tests-base )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --tests-base"
+ fi
+ testsbase=$1
+ shift ;;
+ --tests-base=* )
+ testsbase=`echo "X$1" | sed -e 's/^X--tests-base=//'`
+ shift ;;
+ --aux-dir )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --aux-dir"
+ fi
+ auxdir=$1
+ shift ;;
+ --aux-dir=* )
+ auxdir=`echo "X$1" | sed -e 's/^X--aux-dir=//'`
+ shift ;;
+ --with-tests )
+ inctests=true
+ shift ;;
+ --with-obsolete )
+ incobsolete=true
+ shift ;;
+ --avoid )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --avoid"
+ fi
+ func_append avoidlist " $1"
+ shift ;;
+ --avoid=* )
+ arg=`echo "X$1" | sed -e 's/^X--avoid=//'`
+ func_append avoidlist " $arg"
+ shift ;;
+ --lgpl )
+ lgpl=yes
+ shift ;;
+ --lgpl=* )
+ arg=`echo "X$1" | sed -e 's/^X--lgpl=//'`
+ case "$arg" in
+ 2 | 3) ;;
+ *) func_fatal_error "invalid LGPL version number for --lgpl" ;;
+ esac
+ lgpl=$arg
+ shift ;;
+ --makefile-name )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --makefile-name"
+ fi
+ makefile_name="$1"
+ shift ;;
+ --makefile-name=* )
+ makefile_name=`echo "X$1" | sed -e 's/^X--makefile-name=//'`
+ shift ;;
+ --libtool )
+ libtool=true
+ shift ;;
+ --no-libtool )
+ libtool=false
+ shift ;;
+ --macro-prefix )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --macro-prefix"
+ fi
+ macro_prefix="$1"
+ shift ;;
+ --macro-prefix=* )
+ macro_prefix=`echo "X$1" | sed -e 's/^X--macro-prefix=//'`
+ shift ;;
+ --po-domain )
+ shift
+ if test $# = 0; then
+ func_fatal_error "missing argument for --po-domain"
+ fi
+ po_domain="$1"
+ shift ;;
+ --po-domain=* )
+ po_domain=`echo "X$1" | sed -e 's/^X--po-domain=//'`
+ shift ;;
+ --vc-files )
+ vc_files=true
+ shift ;;
+ --no-vc-files )
+ vc_files=false
+ shift ;;
+ --no-changelog | --no-changelo | --no-changel | --no-change | --no-chang | --no-chan | --no-cha | --no-ch )
+ do_changelog=false
+ shift ;;
+ --dry-run )
+ doit=false
+ shift ;;
+ -s | --symbolic | --symboli | --symbol | --symbo | --symb | --symlink | --symlin | --symli | --syml | --sym | --sy )
+ symbolic=true
+ shift ;;
+ --local-symlink | --local-symlin | --local-symli | --local-syml | --local-sym | --local-sy | --local-s )
+ lsymbolic=true
+ shift ;;
+ -S | --more-symlinks | --more-symlink | --more-symlin | --more-symli | --more-syml | --more-sym | --more-sy | --more-s | --more- | --more | --mor | --mo )
+ symbolic=true
+ do_copyrights=
+ shift ;;
+ --help | --hel | --he | --h )
+ func_usage
+ func_exit $? ;;
+ --version | --versio | --versi | --vers )
+ func_version
+ func_exit $? ;;
+ -- )
+ # Stop option processing
+ shift
+ break ;;
+ -* )
+ echo "gnulib-tool: unknown option $1" 1>&2
+ echo "Try 'gnulib-tool --help' for more information." 1>&2
+ func_exit 1 ;;
+ * )
+ break ;;
+ esac
+ done
+
+ if test "$mode" = update; then
+ if test $# != 0; then
+ echo "gnulib-tool: too many arguments in 'update' mode" 1>&2
+ echo "Try 'gnulib-tool --help' for more information." 1>&2
+ echo "If you really want to modify the gnulib configuration of your project," 1>&2
+ echo "you need to use 'gnulib --import' - at your own risk!" 1>&2
+ func_exit 1
+ fi
+ if test -n "$local_gnulib_dir" || test -n "$supplied_libname" \
+ || test -n "$sourcebase" || test -n "$m4base" || test -n "$pobase" \
+ || test -n "$docbase" || test -n "$testsbase" || test -n "$auxdir" \
+ || test -n "$inctests" || test -n "$incobsolete" \
+ || test -n "$avoidlist" || test -n "$lgpl" || test -n "$makefile_name" \
+ || test -n "$macro_prefix" || test -n "$po_domain" \
+ || test -n "$vc_files"; then
+ echo "gnulib-tool: invalid options for 'update' mode" 1>&2
+ echo "Try 'gnulib-tool --help' for more information." 1>&2
+ echo "If you really want to modify the gnulib configuration of your project," 1>&2
+ echo "you need to use 'gnulib --import' - at your own risk!" 1>&2
+ func_exit 1
+ fi
+ do_changelog=false
+ fi
+ if test -n "$pobase" && test -z "$po_domain"; then
+ echo "gnulib-tool: together with --po-base, you need to specify --po-domain" 1>&2
+ echo "Try 'gnulib-tool --help' for more information." 1>&2
+ func_exit 1
+ fi
+ if test -z "$pobase" && test -n "$po_domain"; then
+ func_warning "--po-domain has no effect without a --po-base option"
+ fi
+
+ # Determine the minimum supported autoconf version from the project's
+ # configure.ac.
+ DEFAULT_AUTOCONF_MINVERSION="2.59"
+ autoconf_minversion=
+ configure_ac=
+ if { test "$mode" = import || test "$mode" = update; } && test -n "$destdir"; then
+ if test -f "$destdir"/configure.ac; then
+ configure_ac="$destdir/configure.ac"
+ else
+ if test -f "$destdir"/configure.in; then
+ configure_ac="$destdir/configure.in"
+ fi
+ fi
+ else
+ if test -f configure.ac; then
+ configure_ac="configure.ac"
+ else
+ if test -f configure.in; then
+ configure_ac="configure.in"
+ fi
+ fi
+ fi
+ if test -n "$configure_ac"; then
+ # Use sed, not autoconf --trace, to look for the AC_PREREQ invocation,
+ # because when some m4 files are omitted from a CVS repository,
+ # "autoconf --trace=AC_PREREQ" fails with an error message like this:
+ # m4: aclocal.m4:851: Cannot open m4/absolute-header.m4: No such file or directory
+ # autom4te: m4 failed with exit status: 1
+ prereqs=
+ my_sed_traces='
+ s,#.*$,,
+ s,^dnl .*$,,
+ s, dnl .*$,,
+ /AC_PREREQ/ {
+ s,^.*AC_PREREQ([[ ]*\([^])]*\).*$,\1,p
+ }'
+ prereqs=`sed -n -e "$my_sed_traces" < "$configure_ac"`
+ if test -n "$prereqs"; then
+ autoconf_minversion=`
+ for version in $prereqs; do echo $version; done |
+ LC_ALL=C sort -nru | sed -e 1q
+ `
+ fi
+ fi
+ if test -z "$autoconf_minversion"; then
+ autoconf_minversion=$DEFAULT_AUTOCONF_MINVERSION
+ fi
+ case "$autoconf_minversion" in
+ 1.* | 2.[0-4]* | 2.5[0-8]*)
+ func_fatal_error "minimum supported autoconf version is 2.59. Try adding AC_PREREQ([$DEFAULT_AUTOCONF_MINVERSION]) to your configure.ac." ;;
+ esac
+
+ # Remove trailing slashes from the directory names. This is necessary for
+ # m4base (to avoid an error in func_import) and optional for the others.
+ sed_trimtrailingslashes='s,\([^/]\)//*$,\1,'
+ case "$local_gnulib_dir" in
+ */ ) local_gnulib_dir=`echo "$local_gnulib_dir" | sed -e "$sed_trimtrailingslashes"` ;;
+ esac
+ case "$sourcebase" in
+ */ ) sourcebase=`echo "$sourcebase" | sed -e "$sed_trimtrailingslashes"` ;;
+ esac
+ case "$m4base" in
+ */ ) m4base=`echo "$m4base" | sed -e "$sed_trimtrailingslashes"` ;;
+ esac
+ case "$pobase" in
+ */ ) pobase=`echo "$pobase" | sed -e "$sed_trimtrailingslashes"` ;;
+ esac
+ case "$docbase" in
+ */ ) docbase=`echo "$docbase" | sed -e "$sed_trimtrailingslashes"` ;;
+ esac
+ case "$testsbase" in
+ */ ) testsbase=`echo "$testsbase" | sed -e "$sed_trimtrailingslashes"` ;;
+ esac
+ case "$auxdir" in
+ */ ) auxdir=`echo "$auxdir" | sed -e "$sed_trimtrailingslashes"` ;;
+ esac
+}
+
+func_gnulib_dir
+func_tmpdir
+trap 'exit_status=$?
+ if test "$signal" != 0; then
+ echo "caught signal $signal" >&2
+ fi
+ rm -rf "$tmp"
+ exit $exit_status' 0
+for signal in 1 2 3 13 15; do
+ trap '{ signal='$signal'; func_exit 1; }' $signal
+done
+signal=0
+
+# func_lookup_file file
+# looks up a file in $local_gnulib_dir or $gnulib_dir, or combines it through
+# 'patch'.
+# Input:
+# - local_gnulib_dir from --local-dir
+# Output:
+# - lookedup_file name of the merged (combined) file
+# - lookedup_tmp true if it is located in the tmp directory, blank otherwise
+func_lookup_file ()
+{
+ lkfile="$1"
+ if test -n "$local_gnulib_dir" && test -f "$local_gnulib_dir/$lkfile"; then
+ lookedup_file="$local_gnulib_dir/$lkfile"
+ lookedup_tmp=
+ else
+ if test -f "$gnulib_dir/$lkfile"; then
+ if test -n "$local_gnulib_dir" && test -f "$local_gnulib_dir/$lkfile.diff"; then
+ lkbase=`echo "$lkfile" | sed -e 's,^.*/,,'`
+ rm -f "$tmp/$lkbase"
+ cp "$gnulib_dir/$lkfile" "$tmp/$lkbase"
+ patch -s "$tmp/$lkbase" < "$local_gnulib_dir/$lkfile.diff" \
+ || func_fatal_error "patch file $local_gnulib_dir/$lkfile.diff didn't apply cleanly"
+ lookedup_file="$tmp/$lkbase"
+ lookedup_tmp=true
+ else
+ lookedup_file="$gnulib_dir/$lkfile"
+ lookedup_tmp=
+ fi
+ else
+ func_fatal_error "file $gnulib_dir/$lkfile not found"
+ fi
+ fi
+}
+
+# func_sanitize_modulelist
+# receives a list of possible module names on standard input, one per line.
+# It removes those which are just file names unrelated to modules, and outputs
+# the resulting list to standard output, one per line.
+func_sanitize_modulelist ()
+{
+ sed -e '/^CVS\//d' -e '/\/CVS\//d' \
+ -e '/^ChangeLog$/d' -e '/\/ChangeLog$/d' \
+ -e '/^COPYING$/d' -e '/\/COPYING$/d' \
+ -e '/^README$/d' -e '/\/README$/d' \
+ -e '/^TEMPLATE$/d' \
+ -e '/^TEMPLATE-EXTENDED$/d' \
+ -e '/^TEMPLATE-TESTS$/d' \
+ -e '/^\..*/d' \
+ -e '/~$/d'
+}
+
+# func_all_modules
+# Input:
+# - local_gnulib_dir from --local-dir
+func_all_modules ()
+{
+ # Filter out metainformation files like README, which are not modules.
+ # Filter out unit test modules; they can be retrieved through
+ # --extract-tests-module if desired.
+ {
+ (cd "$gnulib_dir" && find modules -type f -print | sed -e 's,^modules/,,')
+ if test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules"; then
+ (cd "$local_gnulib_dir" && find modules -type f -print | sed -e 's,^modules/,,' -e 's,\.diff$,,')
+ fi
+ } \
+ | func_sanitize_modulelist \
+ | sed -e '/-tests$/d' \
+ | LC_ALL=C sort -u
+}
+
+# func_verify_module
+# verifies a module name
+# Input:
+# - local_gnulib_dir from --local-dir
+# - module module name argument
+func_verify_module ()
+{
+ if { test -f "$gnulib_dir/modules/$module" \
+ || { test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules" \
+ && test -f "$local_gnulib_dir/modules/$module"; }; } \
+ && test "CVS" != "$module" \
+ && test "ChangeLog" != "$module" \
+ && test "COPYING" != "$module" \
+ && test "README" != "$module" \
+ && test "TEMPLATE" != "$module" \
+ && test "TEMPLATE-EXTENDED" != "$module" \
+ && test "TEMPLATE-TESTS" != "$module"; then
+ # OK, $module is a correct module name.
+ # Verify that building the module description with 'patch' succeeds.
+ func_lookup_file "modules/$module"
+ else
+ func_warning "module $module doesn't exist"
+ module=
+ fi
+}
+
+# func_verify_nontests_module
+# verifies a module name, excluding tests modules
+# Input:
+# - local_gnulib_dir from --local-dir
+# - module module name argument
+func_verify_nontests_module ()
+{
+ case "$module" in
+ *-tests ) module= ;;
+ * ) func_verify_module ;;
+ esac
+}
+
+# func_verify_tests_module
+# verifies a module name, considering only tests modules
+# Input:
+# - local_gnulib_dir from --local-dir
+# - module module name argument
+func_verify_tests_module ()
+{
+ case "$module" in
+ *-tests ) func_verify_module ;;
+ * ) module= ;;
+ esac
+}
+
+# Suffix of a sed expression that extracts a particular field from a
+# module description.
+# A field starts with a line that contains a keyword, such as 'Description',
+# followed by a colon and optional whitespace. All following lines, up to
+# the next field (or end of file if there is none) form the contents of the
+# field.
+# An absent field is equivalent to a field with empty contents.
+# NOTE: Keep this in sync with sed_extract_cache_prog below!
+sed_extract_prog=':[ ]*$/ {
+ :a
+ n
+ s/^Description:[ ]*$//
+ s/^Status:[ ]*$//
+ s/^Notice:[ ]*$//
+ s/^Applicability:[ ]*$//
+ s/^Files:[ ]*$//
+ s/^Depends-on:[ ]*$//
+ s/^configure\.ac-early:[ ]*$//
+ s/^configure\.ac:[ ]*$//
+ s/^Makefile\.am:[ ]*$//
+ s/^Include:[ ]*$//
+ s/^Link:[ ]*$//
+ s/^License:[ ]*$//
+ s/^Maintainer:[ ]*$//
+ tb
+ p
+ ba
+ :b
+}'
+
+# Piece of a sed expression that converts a field header line to a shell
+# variable name,
+# NOTE: Keep this in sync with sed_extract_prog above!
+sed_extract_field_header='
+ s/^Description:[ ]*$/description/
+ s/^Status:[ ]*$/status/
+ s/^Notice:[ ]*$/notice/
+ s/^Applicability:[ ]*$/applicability/
+ s/^Files:[ ]*$/files/
+ s/^Depends-on:[ ]*$/dependson/
+ s/^configure\.ac-early:[ ]*$/configureac_early/
+ s/^configure\.ac:[ ]*$/configureac/
+ s/^Makefile\.am:[ ]*$/makefile/
+ s/^Include:[ ]*$/include/
+ s/^Link:[ ]*$/link/
+ s/^License:[ ]*$/license/
+ s/^Maintainer:[ ]*$/maintainer/'
+
+if $modcache; then
+
+ # Note: The 'eval' silences stderr output in dash.
+ if declare -A x 2>/dev/null && { x[f/2]='foo'; x[f/3]='bar'; eval test '${x[f/2]}' = foo; }; then
+ # Zsh 4 and Bash 4 have associative arrays.
+ have_associative=true
+ else
+ # For other shells, use 'eval' with computed shell variable names.
+ have_associative=false
+ fi
+
+ if $have_associative; then
+
+ # Declare the associative arrays.
+ declare -A modcache_cached
+ sed_to_declare_statement='s|^.*/\([a-zA-Z0-9_]*\)/$|declare -A modcache_\1|p'
+ declare_script=`echo "$sed_extract_field_header" | sed -n -e "$sed_to_declare_statement"`
+ eval "$declare_script"
+
+ else
+
+ # func_cache_var module
+ # computes the cache variable name corresponding to $module.
+ # Note: This computation can map different module names to the same
+ # cachevar (such as 'foo-bar', 'foo_bar', or 'foo/bar'); the caller has
+ # to protect against this case.
+ # Output:
+ # - cachevar a shell variable name
+ if (f=foo; eval echo '${f//o/e}') < /dev/null 2>/dev/null | grep fee >/dev/null; then
+ # Bash 2.0 and newer, ksh, and zsh support the syntax
+ # ${param//pattern/replacement}
+ # as a shorthand for
+ # `echo "$param" | sed -e "s/pattern/replacement/g"`.
+ # Note: The 'eval' above silences stderr output in dash.
+ func_cache_var ()
+ {
+ cachevar=c_${1//[!a-zA-Z0-9_]/_}
+ }
+ else
+ func_cache_var ()
+ {
+ case $1 in
+ *[!a-zA-Z0-9_]*)
+ cachevar=c_`echo "$1" | LC_ALL=C sed -e 's/[^a-zA-Z0-9_]/_/g'` ;;
+ *)
+ cachevar=c_$1 ;;
+ esac
+ }
+ fi
+
+ fi
+
+ # func_init_sed_convert_to_cache_statements
+ # Input:
+ # - modcachevar_assignment
+ # Output:
+ # - sed_convert_to_cache_statements
+ func_init_sed_convert_to_cache_statements ()
+ {
+ # 'sed' script that turns a module description into shell script
+ # assignments, suitable to be eval'ed. All active characters are escaped.
+ # This script turns
+ # Description:
+ # Some module's description
+ #
+ # Files:
+ # lib/file.h
+ # into:
+ # modcache_description[$1]=\
+ # 'Some module'"'"'s description
+ # '
+ # modcache_files[$1]=\
+ # 'lib/file.h'
+ # or:
+ # c_MODULE_description_set=set; c_MODULE_description=\
+ # 'Some module'"'"'s description
+ # '
+ # c_MODULE_files_set=set; c_MODULE_files=\
+ # 'lib/file.h'
+ # The script consists of two parts:
+ # 1) Ignore the lines before the first field header.
+ # 2) A loop, treating non-field-header lines by escaping single quotes
+ # and adding a closing quote in the last line,
+ sed_convert_to_cache_statements="
+ :llla
+ # Here we have not yet seen a field header.
+
+ # See if the current line contains a field header.
+ t llla1
+ :llla1
+ ${sed_extract_field_header}
+ t lllb
+
+ # No field header. Ignore the line.
+
+ # Read the next line. Upon EOF, just exit.
+ n
+ b llla
+
+ :lllb
+ # The current line contains a field header.
+
+ # Turn it into the beginning of an assignment.
+ s/^\\(.*\\)\$/${modcachevar_assignment}\\\\/
+
+ # Move it to the hold space. Don't print it yet,
+ # because we want no assignment if the field is empty.
+ h
+
+ # Read the next line.
+ # Upon EOF, the field was empty. Print no assignment. Just exit.
+ n
+
+ # See if the current line contains a field header.
+ t lllb1
+ :lllb1
+ ${sed_extract_field_header}
+ # If it is, the previous field was empty. Print no assignment.
+ t lllb
+
+ # Not a field header.
+
+ # Print the previous line, held in the hold space.
+ x
+ p
+ x
+
+ # Transform single quotes.
+ s/'/'\"'\"'/g
+
+ # Prepend a single quote.
+ s/^/'/
+
+ :lllc
+
+ # Move it to the hold space.
+ h
+
+ # Read the next line.
+ # Upon EOF, branch.
+ \${
+ b llle
+ }
+ n
+
+ # See if the current line contains a field header.
+ t lllc1
+ :lllc1
+ ${sed_extract_field_header}
+ t llld
+
+ # Print the previous line, held in the hold space.
+ x
+ p
+ x
+
+ # Transform single quotes.
+ s/'/'\"'\"'/g
+
+ b lllc
+
+ :llld
+ # A field header.
+ # Print the previous line, held in the hold space, with a single quote
+ # to end the assignment.
+ x
+ s/\$/'/
+ p
+ x
+
+ b lllb
+
+ :llle
+ # EOF seen.
+ # Print the previous line, held in the hold space, with a single quote
+ # to end the assignment.
+ x
+ s/\$/'/
+ p
+ # Exit.
+ n
+ "
+ if ! $sed_comments; then
+ # Remove comments.
+ sed_convert_to_cache_statements=`echo "$sed_convert_to_cache_statements" \
+ | sed -e 's/^ *//' -e 's/^#.*//'`
+ fi
+ }
+
+ if $have_associative; then
+ # sed_convert_to_cache_statements does not depend on the module.
+ modcachevar_assignment='modcache_\1[$1]='
+ func_init_sed_convert_to_cache_statements
+ fi
+
+ # func_cache_lookup_module module
+ #
+ # looks up a module, like 'func_lookup_file modules/$module', and stores all
+ # of its relevant data in a cache in the memory of the processing shell. If
+ # already cached, it does not look it up again, thus saving file access time.
+ # Parameters:
+ # - module non-empty string
+ # Output if $have_associative:
+ # - modcache_cached[$module] set to yes
+ # - modcache_description[$module] ==
+ # - modcache_status[$module] \ set to the field's value, minus the
+ # - ... / final newline,
+ # - modcache_maintainer[$module] == or unset if the field's value is empty
+ # Output if ! $have_associative:
+ # - cachevar a shell variable name
+ # - ${cachevar}_cached set to $module
+ # - ${cachevar}_description ==
+ # - ${cachevar}_status \ set to the field's value, minus the
+ # - ... / final newline,
+ # - ${cachevar}_maintainer == or unset if the field's value is empty
+ # - ${cachevar}_description_set ==
+ # - ${cachevar}_status_set \ set to non-empty if the field's value
+ # - ... / is non-empty,
+ # - ${cachevar}_maintainer_set == or unset if the field's value is empty
+ func_cache_lookup_module ()
+ {
+ if $have_associative; then
+ cached=${modcache_cached[$1]}
+ else
+ func_cache_var "$1"
+ eval "cached=\"\$${cachevar}_cached\""
+ fi
+ if test -z "$cached"; then
+ # Not found in cache. Look it up on the file system.
+ func_lookup_file "modules/$1"
+ if $have_associative; then
+ modcache_cached[$1]=yes
+ else
+ eval "${cachevar}_cached=\"\$1\""
+ fi
+ if ! $have_associative; then
+ # sed_convert_to_cache_statements depends on the module.
+ modcachevar_assignment="${cachevar}"'_\1_set=set; '"${cachevar}"'_\1='
+ func_init_sed_convert_to_cache_statements
+ fi
+ cache_statements=`LC_ALL=C sed -n -e "$sed_convert_to_cache_statements" < "$lookedup_file"`
+ eval "$cache_statements"
+ else
+ if ! $have_associative; then
+ if test "$1" != "$cached"; then
+ func_fatal_error "cache variable collision between $1 and $cached"
+ fi
+ fi
+ fi
+ }
+
+fi
+
+# func_get_description module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_description ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Description$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_description[$1]+set}"; then
+ echo "${modcache_description[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_description_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_description\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
+# func_get_status module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_status ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Status$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_status[$1]+set}"; then
+ echo "${modcache_status[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_status_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_status\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
+# func_get_notice module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_notice ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Notice$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_notice[$1]+set}"; then
+ echo "${modcache_notice[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_notice_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_notice\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
+# func_get_applicability module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# The expected result (on stdout) is either 'main', or 'tests', or 'all'.
+func_get_applicability ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ my_applicability=`sed -n -e "/^Applicability$sed_extract_prog" < "$lookedup_file"`
+ else
+ func_cache_lookup_module "$1"
+ # Get the field's value, without the final newline.
+ if $have_associative; then
+ my_applicability="${modcache_applicability[$1]}"
+ else
+ eval "my_applicability=\"\$${cachevar}_applicability\""
+ fi
+ fi
+ if test -n "$my_applicability"; then
+ echo $my_applicability
+ else
+ # The default is 'main' or 'tests', depending on the module's name.
+ case $1 in
+ *-tests) echo "tests";;
+ *) echo "main";;
+ esac
+ fi
+}
+
+# func_get_filelist module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_filelist ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Files$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_files[$1]+set}"; then
+ echo "${modcache_files[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_files_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_files\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+ echo m4/00gnulib.m4
+ echo m4/gnulib-common.m4
+ case "$autoconf_minversion" in
+ 2.59)
+ echo m4/onceonly.m4
+ ;;
+ esac
+}
+
+# func_filter_filelist outputvar separator filelist prefix suffix removed_prefix removed_suffix [added_prefix [added_suffix]]
+# stores in outputvar the filtered and processed filelist. Filtering: Only the
+# elements starting with prefix and ending with suffix are considered.
+# Processing: removed_prefix and removed_suffix are removed from each element,
+# added_prefix and added_suffix are added to each element.
+# prefix, suffix should not contain shell-special characters.
+# removed_prefix, removed_suffix should not contain the characters "$`\{}[]^|.
+# added_prefix, added_suffix should not contain the characters \|&.
+func_filter_filelist ()
+{
+ if test "$2" != "$nl" \
+ || { $fast_func_append \
+ && { test -z "$6" || $fast_func_remove_prefix; } \
+ && { test -z "$7" || $fast_func_remove_suffix; }; \
+ }; then
+ ffflist=
+ for fff in $3; do
+ # Do not quote possibly-empty parameters in case patterns,
+ # AIX and HP-UX ksh won't match them if they are empty.
+ case "$fff" in
+ $4*$5)
+ if test -n "$6"; then
+ func_remove_prefix fff "$6"
+ fi
+ if test -n "$7"; then
+ func_remove_suffix fff "$7"
+ fi
+ fff="$8${fff}$9"
+ if test -z "$ffflist"; then
+ ffflist="${fff}"
+ else
+ func_append ffflist "$2${fff}"
+ fi
+ ;;
+ esac
+ done
+ else
+ sed_fff_filter="s|^$6\(.*\)$7\$|$8\\1$9|"
+ ffflist=`for fff in $3; do
+ case "$fff" in
+ $4*$5) echo "$fff" ;;
+ esac
+ done | sed -e "$sed_fff_filter"`
+ fi
+ eval "$1=\"\$ffflist\""
+}
+
+# func_get_dependencies module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_dependencies ()
+{
+ # ${module}-tests always implicitly depends on ${module}.
+ case "$1" in
+ *-tests)
+ fgd1="$1"
+ func_remove_suffix fgd1 '-tests'
+ echo "$fgd1"
+ ;;
+ esac
+ # Then the explicit dependencies listed in the module description.
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Depends-on$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_dependson[$1]+set}"; then
+ echo "${modcache_dependson[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_dependson_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_dependson\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
+# func_get_autoconf_early_snippet module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_autoconf_early_snippet ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^configure\.ac-early$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_configureac_early[$1]+set}"; then
+ echo "${modcache_configureac_early[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_configureac_early_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_configureac_early\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
+# func_get_autoconf_snippet module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_autoconf_snippet ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^configure\.ac$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_configureac[$1]+set}"; then
+ echo "${modcache_configureac[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_configureac_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_configureac\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
+# func_get_automake_snippet module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_automake_snippet ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_makefile[$1]+set}"; then
+ echo "${modcache_makefile[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_makefile_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_makefile\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+ case "$1" in
+ *-tests)
+ # *-tests module live in tests/, not lib/.
+ # Synthesize an EXTRA_DIST augmentation.
+ all_files=`func_get_filelist $1`
+ func_filter_filelist tests_files " " "$all_files" 'tests/' '' 'tests/' ''
+ extra_files="$tests_files"
+ if test -n "$extra_files"; then
+ echo "EXTRA_DIST +=" $extra_files
+ echo
+ fi
+ ;;
+ *)
+ # Synthesize an EXTRA_DIST augmentation.
+ sed_combine_lines='/\\$/{
+ :a
+ N
+ s/\\\n/ /
+ s/\\$/\\/
+ ta
+ }'
+ sed_extract_mentioned_files='s/^lib_SOURCES[ ]*+=[ ]*//p'
+ already_mentioned_files=` \
+ { if ! $modcache; then
+ sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file"
+ else
+ if $have_associative; then
+ if test -n "${modcache_makefile[$1]+set}"; then
+ echo "${modcache_makefile[$1]}"
+ fi
+ else
+ eval 'field_set="$'"${cachevar}"'_makefile_set"'
+ if test -n "$field_set"; then
+ eval 'field_value="$'"${cachevar}"'_makefile"'
+ echo "${field_value}"
+ fi
+ fi
+ fi
+ } \
+ | sed -e "$sed_combine_lines" \
+ | sed -n -e "$sed_extract_mentioned_files" | sed -e 's/#.*//'`
+ all_files=`func_get_filelist $1`
+ func_filter_filelist lib_files "$nl" "$all_files" 'lib/' '' 'lib/' ''
+ # Remove $already_mentioned_files from $lib_files.
+ echo "$lib_files" | LC_ALL=C sort -u > "$tmp"/lib-files
+ extra_files=`for f in $already_mentioned_files; do echo $f; done \
+ | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/lib-files`
+ if test -n "$extra_files"; then
+ echo "EXTRA_DIST +=" $extra_files
+ echo
+ fi
+ # Synthesize also an EXTRA_lib_SOURCES augmentation.
+ # This is necessary so that automake can generate the right list of
+ # dependency rules.
+ # A possible approach would be to use autom4te --trace of the redefined
+ # AC_LIBOBJ and AC_REPLACE_FUNCS macros when creating the Makefile.am
+ # (use autom4te --trace, not just grep, so that AC_LIBOBJ invocations
+ # inside autoconf's built-in macros are not missed).
+ # But it's simpler and more robust to do it here, based on the file list.
+ # If some .c file exists and is not used with AC_LIBOBJ - for example,
+ # a .c file is preprocessed into another .c file for BUILT_SOURCES -,
+ # automake will generate a useless dependency; this is harmless.
+ case "$1" in
+ relocatable-prog-wrapper) ;;
+ *)
+ func_filter_filelist extra_files "$nl" "$extra_files" '' '.c' '' ''
+ if test -n "$extra_files"; then
+ echo "EXTRA_lib_SOURCES +=" $extra_files
+ echo
+ fi
+ ;;
+ esac
+ # Synthesize an EXTRA_DIST augmentation also for the files in build-aux/.
+ func_filter_filelist buildaux_files "$nl" "$all_files" 'build-aux/' '' 'build-aux/' ''
+ if test -n "$buildaux_files"; then
+ sed_prepend_auxdir='s,^,$(top_srcdir)/'"$auxdir"'/,'
+ echo "EXTRA_DIST += "`echo "$buildaux_files" | sed -e "$sed_prepend_auxdir"`
+ echo
+ fi
+ # Synthesize an EXTRA_DIST augmentation also for the files from top/.
+ func_filter_filelist top_files "$nl" "$all_files" 'top/' '' 'top/' ''
+ if test -n "$top_files"; then
+ sed_prepend_topdir='s,^,$(top_srcdir)/,'
+ echo "EXTRA_DIST += "`echo "$top_files" | sed -e "$sed_prepend_topdir"`
+ echo
+ fi
+ ;;
+ esac
+}
+
+# func_get_include_directive module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_include_directive ()
+{
+ {
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Include$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_include[$1]+set}"; then
+ echo "${modcache_include[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_include_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_include\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+ } | sed -e 's/^\(["<]\)/#include \1/'
+}
+
+# func_get_link_directive module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_link_directive ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Link$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_link[$1]+set}"; then
+ echo "${modcache_link[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_link_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_link\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
+# func_get_license module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_license ()
+{
+ {
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^License$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_license[$1]+set}"; then
+ echo "${modcache_license[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_license_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_license\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+ # The default is GPL.
+ echo "GPL"
+ } | sed -e 's,^ *$,,' | sed -e 1q
+}
+
+# func_get_maintainer module
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+func_get_maintainer ()
+{
+ if ! $modcache; then
+ func_lookup_file "modules/$1"
+ sed -n -e "/^Maintainer$sed_extract_prog" < "$lookedup_file"
+ else
+ func_cache_lookup_module "$1"
+ # Output the field's value, including the final newline (if any).
+ if $have_associative; then
+ if test -n "${modcache_maintainer[$1]+set}"; then
+ echo "${modcache_maintainer[$1]}"
+ fi
+ else
+ eval "field_set=\"\$${cachevar}_maintainer_set\""
+ if test -n "$field_set"; then
+ eval "field_value=\"\$${cachevar}_maintainer\""
+ echo "${field_value}"
+ fi
+ fi
+ fi
+}
+
+# func_get_tests_module module
+# Input:
+# - local_gnulib_dir from --local-dir
+func_get_tests_module ()
+{
+ # The naming convention for tests modules is hardwired: ${module}-tests.
+ if test -f "$gnulib_dir/modules/$1"-tests \
+ || { test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules" \
+ && test -f "$local_gnulib_dir/modules/$1"-tests; }; then
+ echo "$1"-tests
+ fi
+}
+
+# func_acceptable module
+# tests whether a module is acceptable.
+# Input:
+# - avoidlist list of modules to avoid
+func_acceptable ()
+{
+ for avoid in $avoidlist; do
+ if test "$avoid" = "$1"; then
+ return 1
+ fi
+ done
+ return 0
+}
+
+# func_modules_transitive_closure
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - modules list of specified modules
+# - inctests true if tests should be included, blank otherwise
+# - incobsolete true if obsolete modules among dependencies should be
+# included, blank otherwise
+# - avoidlist list of modules to avoid
+# - tmp pathname of a temporary directory
+# Output:
+# - modules list of modules, including dependencies
+func_modules_transitive_closure ()
+{
+ # In order to process every module only once (for speed), process an "input
+ # list" of modules, producing an "output list" of modules. During each round,
+ # more modules can be queued in the input list. Once a module on the input
+ # list has been processed, it is added to the "handled list", so we can avoid
+ # to process it again.
+ handledmodules=
+ inmodules="$modules"
+ outmodules=
+ while test -n "$inmodules"; do
+ inmodules_this_round="$inmodules"
+ inmodules= # Accumulator, queue for next round
+ for module in $inmodules_this_round; do
+ func_verify_module
+ if test -n "$module"; then
+ if func_acceptable $module; then
+ func_append outmodules " $module"
+ deps=`func_get_dependencies $module`
+ # Duplicate dependencies are harmless, but Jim wants a warning.
+ duplicated_deps=`echo "$deps" | LC_ALL=C sort | LC_ALL=C uniq -d`
+ if test -n "$duplicated_deps"; then
+ func_warning "module $module has duplicated dependencies: "`echo $duplicated_deps`
+ fi
+ for dep in $deps; do
+ if test -n "$incobsolete" \
+ || { status=`func_get_status $dep`; test "$status" != obsolete; }; then
+ func_append inmodules " $dep"
+ fi
+ done
+ if test -n "$inctests"; then
+ testsmodule=`func_get_tests_module $module`
+ if test -n "$testsmodule"; then
+ func_append inmodules " $testsmodule"
+ fi
+ fi
+ fi
+ fi
+ done
+ handledmodules=`for m in $handledmodules $inmodules_this_round; do echo $m; done | LC_ALL=C sort -u`
+ # Remove $handledmodules from $inmodules.
+ for m in $inmodules; do echo $m; done | LC_ALL=C sort -u > "$tmp"/queued-modules
+ inmodules=`echo "$handledmodules" | LC_ALL=C join -v 2 - "$tmp"/queued-modules`
+ done
+ modules=`for m in $outmodules; do echo $m; done | LC_ALL=C sort -u`
+ rm -f "$tmp"/queued-modules
+}
+
+# func_modules_add_dummy
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - modules list of modules, including dependencies
+# Output:
+# - modules list of modules, including 'dummy' if needed
+func_modules_add_dummy ()
+{
+ # Determine whether any module provides a lib_SOURCES augmentation.
+ have_lib_SOURCES=
+ sed_remove_backslash_newline=':a
+/\\$/{
+s/\\$//
+N
+s/\n//
+ba
+}'
+ for module in $modules; do
+ func_verify_nontests_module
+ if test -n "$module"; then
+ # Extract the value of "lib_SOURCES += ...".
+ for file in `func_get_automake_snippet "$module" | sed -e "$sed_remove_backslash_newline" | sed -n -e 's,^lib_SOURCES[ ]*+=\([^#]*\).*$,\1,p'`; do
+ # Ignore .h files since they are not compiled.
+ case "$file" in
+ *.h) ;;
+ *)
+ have_lib_SOURCES=yes
+ break 2
+ ;;
+ esac
+ done
+ fi
+ done
+ # Add the dummy module, to make sure the library will be non-empty.
+ if test -z "$have_lib_SOURCES"; then
+ if func_acceptable "dummy"; then
+ func_append modules " dummy"
+ fi
+ fi
+}
+
+# func_modules_notice
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - verbose integer, default 0, inc/decremented by --verbose/--quiet
+# - modules list of modules, including dependencies
+func_modules_notice ()
+{
+ if test $verbose -ge -1; then
+ for module in $modules; do
+ func_verify_module
+ if test -n "$module"; then
+ msg=`func_get_notice $module`
+ if test -n "$msg"; then
+ echo "Notice from module $module:"
+ echo "$msg" | sed -e 's/^/ /'
+ fi
+ fi
+ done
+ fi
+}
+
+# func_modules_to_filelist
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - modules list of modules, including dependencies
+# Output:
+# - files list of files
+func_modules_to_filelist ()
+{
+ files=
+ for module in $modules; do
+ func_verify_module
+ if test -n "$module"; then
+ fs=`func_get_filelist $module`
+ func_append files " $fs"
+ fi
+ done
+ files=`for f in $files; do echo $f; done | LC_ALL=C sort -u`
+}
+
+# func_execute_command command [args...]
+# Executes a command.
+# Uses also the variables
+# - verbose integer, default 0, inc/decremented by --verbose/--quiet
+func_execute_command ()
+{
+ if test $verbose -ge 0; then
+ echo "executing $*"
+ "$@"
+ else
+ # Commands like automake produce output to stderr even when they succeed.
+ # Turn this output off if the command succeeds.
+ "$@" > "$tmp"/cmdout 2>&1
+ cmdret=$?
+ if test $cmdret = 0; then
+ rm -f "$tmp"/cmdout
+ else
+ echo "executing $*"
+ cat "$tmp"/cmdout 1>&2
+ rm -f "$tmp"/cmdout
+ (exit $cmdret)
+ fi
+ fi
+}
+
+# func_dest_tmpfilename file
+# determines the name of a temporary file (file is relative to destdir).
+# Input:
+# - destdir target directory
+# - doit : if actions shall be executed, false if only to be printed
+# - tmp pathname of a temporary directory
+# Sets variable:
+# - tmpfile absolute filename of the temporary file
+func_dest_tmpfilename ()
+{
+ if $doit; then
+ # Put the new contents of $file in a file in the same directory (needed
+ # to guarantee that an 'mv' to "$destdir/$file" works).
+ tmpfile="$destdir/$1.tmp"
+ else
+ # Put the new contents of $file in a file in a temporary directory
+ # (because the directory of "$file" might not exist).
+ tmpfile="$tmp"/`basename "$1"`.tmp
+ fi
+}
+
+# func_add_file
+# copies a file from gnulib into the destination directory. The destination
+# is known to not exist.
+# Input:
+# - destdir target directory
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - f the original file name
+# - lookedup_file name of the merged (combined) file
+# - lookedup_tmp true if it is located in the tmp directory, blank otherwise
+# - g the rewritten file name
+# - tmpfile absolute filename of the temporary file
+# - doit : if actions shall be executed, false if only to be printed
+# - symbolic true if files should be symlinked, copied otherwise
+# - lsymbolic true if files from local_gnulib_dir should be symlinked,
+# copied otherwise
+func_add_file ()
+{
+ if $doit; then
+ echo "Copying file $g"
+ if { test -n "$symbolic" \
+ || { test -n "$lsymbolic" \
+ && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
+ && test -z "$lookedup_tmp" \
+ && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+ func_ln_if_changed "$lookedup_file" "$destdir/$g"
+ else
+ mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
+ fi
+ else
+ echo "Copy file $g"
+ fi
+}
+
+# func_update_file
+# copies a file from gnulib into the destination directory. The destination
+# is known to exist.
+# Input:
+# - destdir target directory
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - f the original file name
+# - lookedup_file name of the merged (combined) file
+# - lookedup_tmp true if it is located in the tmp directory, blank otherwise
+# - g the rewritten file name
+# - tmpfile absolute filename of the temporary file
+# - doit : if actions shall be executed, false if only to be printed
+# - symbolic true if files should be symlinked, copied otherwise
+# - lsymbolic true if files from local_gnulib_dir should be symlinked,
+# copied otherwise
+# - already_present nonempty if the file should already exist, empty otherwise
+func_update_file ()
+{
+ if cmp "$destdir/$g" "$tmpfile" > /dev/null; then
+ : # The file has not changed.
+ else
+ # Replace the file.
+ if $doit; then
+ if test -n "$already_present"; then
+ echo "Updating file $g (backup in ${g}~)"
+ else
+ echo "Replacing file $g (non-gnulib code backed up in ${g}~) !!"
+ fi
+ mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
+ if { test -n "$symbolic" \
+ || { test -n "$lsymbolic" \
+ && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \
+ && test -z "$lookedup_tmp" \
+ && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+ func_ln_if_changed "$lookedup_file" "$destdir/$g"
+ else
+ mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
+ fi
+ else
+ if test -n "$already_present"; then
+ echo "Update file $g (backup in ${g}~)"
+ else
+ echo "Replace file $g (non-gnulib code backed up in ${g}~) !!"
+ fi
+ fi
+ fi
+}
+
+# func_emit_lib_Makefile_am
+# emits the contents of library makefile to standard output.
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - modules list of modules, including dependencies
+# - libname library name
+# - pobase directory relative to destdir where to place *.po files
+# - auxdir directory relative to destdir where to place build aux files
+# - makefile_name from --makefile-name
+# - libtool true if libtool will be used, false or blank otherwise
+# - macro_prefix prefix of gl_LIBOBJS macros to use
+# - po_domain prefix of i18n domain to use (without -gnulib suffix)
+# - actioncmd (optional) command that will reproduce this invocation
+# - for_test true if creating a package for testing, false otherwise
+# - destfile filename relative to destdir of makefile being generated
+# Input/Output:
+# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val}
+# list of edits to be done to Makefile.am variables
+# Output:
+# - uses_subdirs nonempty if object files in subdirs exist
+func_emit_lib_Makefile_am ()
+{
+ # When creating an includable Makefile.am snippet, augment variables with
+ # += instead of assigning them.
+ if test -n "$makefile_name"; then
+ assign='+='
+ else
+ assign='='
+ fi
+ if test "$libtool" = true; then
+ libext=la
+ perhapsLT=LT
+ sed_eliminate_LDFLAGS="$sed_noop"
+ else
+ libext=a
+ perhapsLT=
+ sed_eliminate_LDFLAGS='/^lib_LDFLAGS[ ]*+=/d'
+ fi
+ if $for_test; then
+ # When creating a package for testing: Attempt to provoke failures,
+ # especially link errors, already during "make" rather than during
+ # "make check", because "make check" is not possible in a cross-compiling
+ # situation. Turn check_PROGRAMS into noinst_PROGRAMS.
+ sed_transform_check_PROGRAMS='s,check_PROGRAMS,noinst_PROGRAMS,g'
+ else
+ sed_transform_check_PROGRAMS="$sed_noop"
+ fi
+ echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
+ echo "## Process this file with automake to produce Makefile.in."
+ func_emit_copyright_notice
+ if test -n "$actioncmd"; then
+ # The maximum line length (excluding the terminating newline) of any file
+ # that is to be preprocessed by config.status is 3070. config.status uses
+ # awk, and the HP-UX 11.00 awk fails if a line has length >= 3071;
+ # similarly, the IRIX 6.5 awk fails if a line has length >= 3072.
+ len=`echo "$actioncmd" | wc -c`
+ if test -n "$len" && test "$len" -le 3000; then
+ echo "# Reproduce by: $actioncmd"
+ fi
+ fi
+ echo
+ uses_subdirs=
+ {
+ for module in $modules; do
+ func_verify_nontests_module
+ if test -n "$module"; then
+ {
+ func_get_automake_snippet "$module" |
+ sed -e 's,lib_LIBRARIES,lib%_LIBRARIES,g' \
+ -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \
+ -e "$sed_eliminate_LDFLAGS" \
+ -e 's,lib_\([A-Z][A-Z]*\),'"${libname}_${libext}"'_\1,g' \
+ -e 's,lib%_LIBRARIES,lib_LIBRARIES,g' \
+ -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g' \
+ -e "$sed_transform_check_PROGRAMS"
+ if test "$module" = 'alloca'; then
+ echo "${libname}_${libext}_LIBADD += @${perhapsLT}ALLOCA@"
+ echo "${libname}_${libext}_DEPENDENCIES += @${perhapsLT}ALLOCA@"
+ fi
+ } > "$tmp"/amsnippet
+ # Skip the contents if it's entirely empty.
+ if grep '[^ ]' "$tmp"/amsnippet > /dev/null ; then
+ echo "## begin gnulib module $module"
+ echo
+ cat "$tmp"/amsnippet
+ echo "## end gnulib module $module"
+ echo
+ fi
+ rm -f "$tmp"/amsnippet
+ # Test whether there are some source files in subdirectories.
+ for f in `func_get_filelist "$module"`; do
+ case $f in
+ lib/*/*.c)
+ uses_subdirs=yes
+ break
+ ;;
+ esac
+ done
+ fi
+ done
+ } > "$tmp"/allsnippets
+ if test -z "$makefile_name"; then
+ # If there are source files in subdirectories, prevent collision of the
+ # object files (example: hash.c and libxml/hash.c).
+ subdir_options=
+ if test -n "$uses_subdirs"; then
+ subdir_options=' subdir-objects'
+ fi
+ echo "AUTOMAKE_OPTIONS = 1.5 gnits${subdir_options}"
+ fi
+ echo
+ if test -z "$makefile_name"; then
+ echo "SUBDIRS ="
+ echo "noinst_HEADERS ="
+ echo "noinst_LIBRARIES ="
+ echo "noinst_LTLIBRARIES ="
+ # Automake versions < 1.9b create an empty pkgdatadir at installation time
+ # if you specify pkgdata_DATA to empty. This is a workaround.
+ if grep '^pkgdata_DATA *+=' "$tmp"/allsnippets > /dev/null; then
+ echo "pkgdata_DATA ="
+ fi
+ echo "EXTRA_DIST ="
+ echo "BUILT_SOURCES ="
+ echo "SUFFIXES ="
+ fi
+ echo "MOSTLYCLEANFILES $assign core *.stackdump"
+ if test -z "$makefile_name"; then
+ echo "MOSTLYCLEANDIRS ="
+ echo "CLEANFILES ="
+ echo "DISTCLEANFILES ="
+ echo "MAINTAINERCLEANFILES ="
+ fi
+ # Execute edits that apply to the Makefile.am being generated.
+ edit=0
+ while test $edit != $makefile_am_edits; do
+ edit=`expr $edit + 1`
+ eval dir=\"\$makefile_am_edit${edit}_dir\"
+ eval var=\"\$makefile_am_edit${edit}_var\"
+ eval val=\"\$makefile_am_edit${edit}_val\"
+ if test -n "$var"; then
+ if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then
+ echo "${var} += ${val}"
+ eval "makefile_am_edit${edit}_var="
+ fi
+ fi
+ done
+ if test -z "$makefile_name"; then
+ echo
+ echo "AM_CPPFLAGS ="
+ echo "AM_CFLAGS ="
+ fi
+ echo
+ if LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" "$tmp"/allsnippets > /dev/null \
+ || { test -n "$makefile_name" \
+ && test -f "$sourcebase/Makefile.am" \
+ && LC_ALL=C grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *+\{0,1\}= *$libname\\.$libext\$" "$sourcebase/Makefile.am" > /dev/null; \
+ }; then
+ # One of the snippets or the user's Makefile.am already specifies an
+ # installation location for the library. Don't confuse automake by saying
+ # it should not be installed.
+ :
+ else
+ # By default, the generated library should not be installed.
+ echo "noinst_${perhapsLT}LIBRARIES += $libname.$libext"
+ fi
+ echo
+ echo "${libname}_${libext}_SOURCES ="
+ # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However,
+ # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@.
+ echo "${libname}_${libext}_LIBADD = \$(${macro_prefix}_${perhapsLT}LIBOBJS)"
+ echo "${libname}_${libext}_DEPENDENCIES = \$(${macro_prefix}_${perhapsLT}LIBOBJS)"
+ echo "EXTRA_${libname}_${libext}_SOURCES ="
+ if test "$libtool" = true; then
+ echo "${libname}_${libext}_LDFLAGS = \$(AM_LDFLAGS)"
+ fi
+ echo
+ if test -n "$pobase"; then
+ echo "AM_CPPFLAGS += -DDEFAULT_TEXT_DOMAIN=\\\"${po_domain}-gnulib\\\""
+ echo
+ fi
+ cat "$tmp"/allsnippets \
+ | sed -e 's|\$(top_srcdir)/build-aux/|$(top_srcdir)/'"$auxdir"'/|g'
+ echo
+ echo "mostlyclean-local: mostlyclean-generic"
+ echo " @for dir in '' \$(MOSTLYCLEANDIRS); do \\"
+ echo " if test -n \"\$\$dir\" && test -d \$\$dir; then \\"
+ echo " echo \"rmdir \$\$dir\"; rmdir \$\$dir; \\"
+ echo " fi; \\"
+ echo " done; \\"
+ echo " :"
+ rm -f "$tmp"/allsnippets
+}
+
+# func_emit_po_Makevars
+# emits the contents of po/ makefile parameterization to standard output.
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - sourcebase directory relative to destdir where to place source code
+# - pobase directory relative to destdir where to place *.po files
+# - po_domain prefix of i18n domain to use (without -gnulib suffix)
+func_emit_po_Makevars ()
+{
+ echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
+ func_emit_copyright_notice
+ echo
+ echo "# Usually the message domain is the same as the package name."
+ echo "# But here it has a '-gnulib' suffix."
+ echo "DOMAIN = ${po_domain}-gnulib"
+ echo
+ echo "# These two variables depend on the location of this directory."
+ echo "subdir = ${pobase}"
+ echo "top_builddir = "`echo "$pobase" | sed -e 's,//*,/,g' -e 's,[^/][^/]*,..,g'`
+ echo
+ cat <<\EOF
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = \
+ --keyword=_ --flag=_:1:pass-c-format \
+ --keyword=N_ --flag=N_:1:pass-c-format \
+ --keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."' \
+ --keyword='proper_name_utf8:1,"This is a proper name. See the gettext manual, section Names."' \
+ --flag=error:3:c-format --flag=error_at_line:5:c-format
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file. gnulib is copyrighted by the FSF.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+# in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+# understood.
+# - Strings which make invalid assumptions about notation of date, time or
+# money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = bug-gnulib@gnu.org
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used. It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context. Possible values are "yes" and "no". Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = no
+EOF
+}
+
+# func_emit_po_POTFILES_in
+# emits the file list to be passed to xgettext to standard output.
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - sourcebase directory relative to destdir where to place source code
+# - files list of new files
+func_emit_po_POTFILES_in ()
+{
+ echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
+ func_emit_copyright_notice
+ echo
+ echo "# List of files which contain translatable strings."
+ echo "$files" | sed -n -e "s,^lib/,$sourcebase/,p"
+}
+
+# func_emit_tests_Makefile_am
+# emits the contents of tests makefile to standard output.
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - modules list of modules, including dependencies
+# - libname library name
+# - auxdir directory relative to destdir where to place build aux files
+# - makefile_name from --makefile-name
+# - libtool true if libtool will be used, false or blank otherwise
+# - sourcebase relative directory containing lib source code
+# - m4base relative directory containing autoconf macros
+# - testsbase relative directory containing unit test code
+# - macro_prefix prefix of gl_LIBOBJS macros to use
+# - for_test true if creating a package for testing, false otherwise
+# - use_libtests true if a libtests.a should be built, false otherwise
+# - destfile filename relative to destdir of makefile being generated
+# Input/Output:
+# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val}
+# list of edits to be done to Makefile.am variables
+# Output:
+# - uses_subdirs nonempty if object files in subdirs exist
+func_emit_tests_Makefile_am ()
+{
+ if test "$libtool" = true; then
+ libext=la
+ sed_eliminate_LDFLAGS="$sed_noop"
+ else
+ libext=a
+ sed_eliminate_LDFLAGS='/^lib_LDFLAGS[ ]*+=/d'
+ fi
+ if $for_test; then
+ # When creating a package for testing: Attempt to provoke failures,
+ # especially link errors, already during "make" rather than during
+ # "make check", because "make check" is not possible in a cross-compiling
+ # situation. Turn check_PROGRAMS into noinst_PROGRAMS.
+ sed_transform_check_PROGRAMS='s,check_PROGRAMS,noinst_PROGRAMS,g'
+ else
+ sed_transform_check_PROGRAMS="$sed_noop"
+ fi
+ testsbase_inverse=`echo "$testsbase" | sed -e 's,/$,,' | sed -e 's,[^/][^/]*,..,g'`
+ echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
+ echo "## Process this file with automake to produce Makefile.in."
+ func_emit_copyright_notice
+ echo
+ uses_subdirs=
+ {
+ for module in $modules; do
+ if $for_test; then
+ func_verify_tests_module
+ else
+ func_verify_module
+ fi
+ if test -n "$module"; then
+ {
+ func_get_automake_snippet "$module" |
+ sed -e 's,lib_LIBRARIES,lib%_LIBRARIES,g' \
+ -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \
+ -e "$sed_eliminate_LDFLAGS" \
+ -e 's,lib_\([A-Z][A-Z]*\),libtests_a_\1,g' \
+ -e 's,lib%_LIBRARIES,lib_LIBRARIES,g' \
+ -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g' \
+ -e "$sed_transform_check_PROGRAMS"
+ if $use_libtests && test "$module" = 'alloca'; then
+ echo "libtests_a_LIBADD += @${perhapsLT}ALLOCA@"
+ echo "libtests_a_DEPENDENCIES += @${perhapsLT}ALLOCA@"
+ fi
+ } > "$tmp"/amsnippet
+ # Skip the contents if it's entirely empty.
+ if grep '[^ ]' "$tmp"/amsnippet > /dev/null ; then
+ echo "## begin gnulib module $module"
+ echo
+ cat "$tmp"/amsnippet
+ echo "## end gnulib module $module"
+ echo
+ fi
+ rm -f "$tmp"/amsnippet
+ # Test whether there are some source files in subdirectories.
+ for f in `func_get_filelist "$module"`; do
+ case $f in
+ lib/*/*.c | tests/*/*.c)
+ uses_subdirs=yes
+ break
+ ;;
+ esac
+ done
+ fi
+ done
+ } > "$tmp"/allsnippets
+ # Generate dependencies here, since it eases the debugging of test failures.
+ # If there are source files in subdirectories, prevent collision of the
+ # object files (example: hash.c and libxml/hash.c).
+ subdir_options=
+ if test -n "$uses_subdirs"; then
+ subdir_options=' subdir-objects'
+ fi
+ echo "AUTOMAKE_OPTIONS = 1.5 foreign${subdir_options}"
+ echo
+ if $for_test; then
+ echo "ACLOCAL_AMFLAGS = -I ${testsbase_inverse}/${m4base}"
+ echo
+ fi
+ # Nothing is being added to SUBDIRS; nevertheless the existence of this
+ # variable is needed to avoid an error from automake:
+ # "AM_GNU_GETTEXT used but SUBDIRS not defined"
+ echo "SUBDIRS ="
+ echo "TESTS ="
+ echo "XFAIL_TESTS ="
+ echo "TESTS_ENVIRONMENT ="
+ echo "noinst_PROGRAMS ="
+ if ! $for_test; then
+ echo "check_PROGRAMS ="
+ fi
+ echo "noinst_HEADERS ="
+ echo "noinst_LIBRARIES ="
+ if $use_libtests; then
+ if $for_test; then
+ echo "noinst_LIBRARIES += libtests.a"
+ else
+ echo "check_LIBRARIES = libtests.a"
+ fi
+ fi
+ # Automake versions < 1.9b create an empty pkgdatadir at installation time
+ # if you specify pkgdata_DATA to empty. This is a workaround.
+ if grep '^pkgdata_DATA *+=' "$tmp"/allsnippets > /dev/null; then
+ echo "pkgdata_DATA ="
+ fi
+ echo "EXTRA_DIST ="
+ echo "BUILT_SOURCES ="
+ echo "SUFFIXES ="
+ echo "MOSTLYCLEANFILES = core *.stackdump"
+ echo "MOSTLYCLEANDIRS ="
+ echo "CLEANFILES ="
+ echo "DISTCLEANFILES ="
+ echo "MAINTAINERCLEANFILES ="
+ # Execute edits that apply to the Makefile.am being generated.
+ edit=0
+ while test $edit != $makefile_am_edits; do
+ edit=`expr $edit + 1`
+ eval dir=\"\$makefile_am_edit${edit}_dir\"
+ eval var=\"\$makefile_am_edit${edit}_var\"
+ eval val=\"\$makefile_am_edit${edit}_val\"
+ if test -n "$var"; then
+ if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then
+ echo "${var} += ${val}"
+ eval "makefile_am_edit${edit}_var="
+ fi
+ fi
+ done
+ echo
+ echo "AM_CPPFLAGS = \\"
+ echo " -I. -I\$(srcdir) \\"
+ echo " -I${testsbase_inverse} -I\$(srcdir)/${testsbase_inverse} \\"
+ echo " -I${testsbase_inverse}/${sourcebase-lib} -I\$(srcdir)/${testsbase_inverse}/${sourcebase-lib}"
+ echo
+ local_ldadd_before=''
+ local_ldadd_after=''
+ if $use_libtests; then
+ # All test programs need to be linked with libtests.a.
+ # It needs to be passed to the linker before ${libname}.${libext}, since
+ # the tests-related modules depend on the main modules.
+ # It also needs to be passed to the linker after ${libname}.${libext}
+ # because the latter might contain incomplete modules (such as the 'error'
+ # module whose dependency to 'progname' is voluntarily omitted).
+ # The LIBTESTS_LIBDEPS can be passed to the linker once or twice, it does
+ # not matter.
+ local_ldadd_before=' libtests.a'
+ local_ldadd_after=' libtests.a $(LIBTESTS_LIBDEPS)'
+ fi
+ echo "LDADD =${local_ldadd_before} ${testsbase_inverse}/${sourcebase-lib}/${libname}.${libext}${local_ldadd_after}"
+ echo
+ if $use_libtests; then
+ echo "libtests_a_SOURCES ="
+ # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However,
+ # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@.
+ echo "libtests_a_LIBADD = \$(${macro_prefix}tests_LIBOBJS)"
+ echo "libtests_a_DEPENDENCIES = \$(${macro_prefix}tests_LIBOBJS)"
+ echo "EXTRA_libtests_a_SOURCES ="
+ # The circular dependency in LDADD requires this.
+ echo "AM_LIBTOOLFLAGS = --preserve-dup-deps"
+ echo
+ fi
+ # Many test scripts use ${EXEEXT} or ${srcdir}.
+ # EXEEXT is defined by AC_PROG_CC through autoconf.
+ # srcdir is defined by autoconf and automake.
+ echo "TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' srcdir='\$(srcdir)'"
+ echo
+ cat "$tmp"/allsnippets \
+ | sed -e 's|\$(top_srcdir)/build-aux/|$(top_srcdir)/'"$auxdir"'/|g'
+ echo "# Clean up after Solaris cc."
+ echo "clean-local:"
+ echo " rm -rf SunWS_cache"
+ echo
+ echo "mostlyclean-local: mostlyclean-generic"
+ echo " @for dir in '' \$(MOSTLYCLEANDIRS); do \\"
+ echo " if test -n \"\$\$dir\" && test -d \$\$dir; then \\"
+ echo " echo \"rmdir \$\$dir\"; rmdir \$\$dir; \\"
+ echo " fi; \\"
+ echo " done; \\"
+ echo " :"
+ rm -f "$tmp"/allsnippets
+}
+
+# func_emit_initmacro_start macro_prefix
+# emits the first few statements of the gl_INIT macro to standard output.
+# - macro_prefix prefix of gl_EARLY, gl_INIT macros to use
+func_emit_initmacro_start ()
+{
+ macro_prefix_arg="$1"
+ # Overriding AC_LIBOBJ and AC_REPLACE_FUNCS has the effect of storing
+ # platform-dependent object files in ${macro_prefix_arg}_LIBOBJS instead of
+ # LIBOBJS. The purpose is to allow several gnulib instantiations under
+ # a single configure.ac file. (AC_CONFIG_LIBOBJ_DIR does not allow this
+ # flexibility.)
+ # Furthermore it avoids an automake error like this when a Makefile.am
+ # that uses pieces of gnulib also uses $(LIBOBJ):
+ # automatically discovered file `error.c' should not be explicitly mentioned
+ echo " m4_pushdef([AC_LIBOBJ], m4_defn([${macro_prefix_arg}_LIBOBJ]))"
+ echo " m4_pushdef([AC_REPLACE_FUNCS], m4_defn([${macro_prefix_arg}_REPLACE_FUNCS]))"
+ # Overriding AC_LIBSOURCES has the same purpose of avoiding the automake
+ # error when a Makefile.am that uses pieces of gnulib also uses $(LIBOBJ):
+ # automatically discovered file `error.c' should not be explicitly mentioned
+ # We let automake know about the files to be distributed through the
+ # EXTRA_lib_SOURCES variable.
+ echo " m4_pushdef([AC_LIBSOURCES], m4_defn([${macro_prefix_arg}_LIBSOURCES]))"
+ # Create data variables for checking the presence of files that are mentioned
+ # as AC_LIBSOURCES arguments. These are m4 variables, not shell variables,
+ # because we want the check to happen when the configure file is created,
+ # not when it is run. ${macro_prefix_arg}_LIBSOURCES_LIST is the list of
+ # files to check for. ${macro_prefix_arg}_LIBSOURCES_DIR is the subdirectory
+ # in which to expect them.
+ echo " m4_pushdef([${macro_prefix_arg}_LIBSOURCES_LIST], [])"
+ echo " m4_pushdef([${macro_prefix_arg}_LIBSOURCES_DIR], [])"
+ echo " gl_COMMON"
+}
+
+# func_emit_initmacro_end macro_prefix
+# emits the last few statements of the gl_INIT macro to standard output.
+# - macro_prefix prefix of gl_EARLY, gl_INIT macros to use
+func_emit_initmacro_end ()
+{
+ macro_prefix_arg="$1"
+ # Check the presence of files that are mentioned as AC_LIBSOURCES arguments.
+ # The check is performed only when autoconf is run from the directory where
+ # the configure.ac resides; if it is run from a different directory, the
+ # check is skipped.
+ echo " m4_ifval(${macro_prefix_arg}_LIBSOURCES_LIST, ["
+ echo " m4_syscmd([test ! -d ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[ ||"
+ echo " for gl_file in ]${macro_prefix_arg}_LIBSOURCES_LIST[ ; do"
+ echo " if test ! -r ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[/\$gl_file ; then"
+ echo " echo \"missing file ]m4_defn([${macro_prefix_arg}_LIBSOURCES_DIR])[/\$gl_file\" >&2"
+ echo " exit 1"
+ echo " fi"
+ echo " done])dnl"
+ echo " m4_if(m4_sysval, [0], [],"
+ echo " [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])"
+ echo " ])"
+ echo " m4_popdef([${macro_prefix_arg}_LIBSOURCES_DIR])"
+ echo " m4_popdef([${macro_prefix_arg}_LIBSOURCES_LIST])"
+ echo " m4_popdef([AC_LIBSOURCES])"
+ echo " m4_popdef([AC_REPLACE_FUNCS])"
+ echo " m4_popdef([AC_LIBOBJ])"
+ echo " AC_CONFIG_COMMANDS_PRE(["
+ echo " ${macro_prefix_arg}_libobjs="
+ echo " ${macro_prefix_arg}_ltlibobjs="
+ echo " if test -n \"\$${macro_prefix_arg}_LIBOBJS\"; then"
+ echo " # Remove the extension."
+ echo " sed_drop_objext='s/\\.o\$//;s/\\.obj\$//'"
+ echo " for i in \`for i in \$${macro_prefix_arg}_LIBOBJS; do echo \"\$i\"; done | sed -e \"\$sed_drop_objext\" | sort | uniq\`; do"
+ echo " ${macro_prefix_arg}_libobjs=\"\$${macro_prefix_arg}_libobjs \$i.\$ac_objext\""
+ echo " ${macro_prefix_arg}_ltlibobjs=\"\$${macro_prefix_arg}_ltlibobjs \$i.lo\""
+ echo " done"
+ echo " fi"
+ echo " AC_SUBST([${macro_prefix_arg}_LIBOBJS], [\$${macro_prefix_arg}_libobjs])"
+ echo " AC_SUBST([${macro_prefix_arg}_LTLIBOBJS], [\$${macro_prefix_arg}_ltlibobjs])"
+ echo " ])"
+}
+
+# func_emit_initmacro_done macro_prefix sourcebase
+# emits a few statements after the gl_INIT macro to standard output.
+# - macro_prefix prefix of gl_EARLY, gl_INIT macros to use
+# - sourcebase directory relative to destdir where to place source code
+func_emit_initmacro_done ()
+{
+ macro_prefix_arg="$1"
+ sourcebase_arg="$2"
+ echo
+ echo "# Like AC_LIBOBJ, except that the module name goes"
+ echo "# into ${macro_prefix_arg}_LIBOBJS instead of into LIBOBJS."
+ echo "AC_DEFUN([${macro_prefix_arg}_LIBOBJ], ["
+ echo " AS_LITERAL_IF([\$1], [${macro_prefix_arg}_LIBSOURCES([\$1.c])])dnl"
+ echo " ${macro_prefix_arg}_LIBOBJS=\"\$${macro_prefix_arg}_LIBOBJS \$1.\$ac_objext\""
+ echo "])"
+ echo
+ echo "# Like AC_REPLACE_FUNCS, except that the module name goes"
+ echo "# into ${macro_prefix_arg}_LIBOBJS instead of into LIBOBJS."
+ echo "AC_DEFUN([${macro_prefix_arg}_REPLACE_FUNCS], ["
+ echo " m4_foreach_w([gl_NAME], [\$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl"
+ echo " AC_CHECK_FUNCS([\$1], , [${macro_prefix_arg}_LIBOBJ(\$ac_func)])"
+ echo "])"
+ echo
+ echo "# Like AC_LIBSOURCES, except the directory where the source file is"
+ echo "# expected is derived from the gnulib-tool parameterization,"
+ echo "# and alloca is special cased (for the alloca-opt module)."
+ echo "# We could also entirely rely on EXTRA_lib..._SOURCES."
+ echo "AC_DEFUN([${macro_prefix_arg}_LIBSOURCES], ["
+ echo " m4_foreach([_gl_NAME], [\$1], ["
+ echo " m4_if(_gl_NAME, [alloca.c], [], ["
+ echo " m4_define([${macro_prefix_arg}_LIBSOURCES_DIR], [$sourcebase_arg])"
+ echo " m4_append([${macro_prefix_arg}_LIBSOURCES_LIST], _gl_NAME, [ ])"
+ echo " ])"
+ echo " ])"
+ echo "])"
+}
+
+# func_import modules
+# Uses also the variables
+# - destdir target directory
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - verbose integer, default 0, inc/decremented by --verbose/--quiet
+# - libname library name
+# - sourcebase directory relative to destdir where to place source code
+# - m4base directory relative to destdir where to place *.m4 macros
+# - pobase directory relative to destdir where to place *.po files
+# - docbase directory relative to destdir where to place doc files
+# - testsbase directory relative to destdir where to place unit test code
+# - auxdir directory relative to destdir where to place build aux files
+# - inctests true if --with-tests was given, blank otherwise
+# - incobsolete true if --with-obsolete was given, blank otherwise
+# - avoidlist list of modules to avoid, from --avoid
+# - lgpl yes or a number if library's license shall be LGPL,
+# blank otherwise
+# - makefile_name from --makefile-name
+# - libtool true if --libtool was given, false if --no-libtool was
+# given, blank otherwise
+# - guessed_libtool true if the configure.ac file uses libtool, false otherwise
+# - macro_prefix prefix of gl_EARLY, gl_INIT macros to use
+# - po_domain prefix of i18n domain to use (without -gnulib suffix)
+# - vc_files true if --vc-files was given, false if --no-vc-files was
+# given, blank otherwise
+# - autoconf_minversion minimum supported autoconf version
+# - doit : if actions shall be executed, false if only to be printed
+# - symbolic true if files should be symlinked, copied otherwise
+# - lsymbolic true if files from local_gnulib_dir should be symlinked,
+# copied otherwise
+# - do_copyrights true if copyright notices in files should be replaced,
+# blank otherwise
+func_import ()
+{
+ # Get the cached settings.
+ cached_local_gnulib_dir=
+ cached_specified_modules=
+ cached_incobsolete=
+ cached_avoidlist=
+ cached_sourcebase=
+ cached_m4base=
+ cached_pobase=
+ cached_docbase=
+ cached_testsbase=
+ cached_inctests=
+ cached_libname=
+ cached_lgpl=
+ cached_makefile_name=
+ cached_libtool=
+ cached_macro_prefix=
+ cached_po_domain=
+ cached_vc_files=
+ cached_files=
+ if test -f "$destdir"/$m4base/gnulib-cache.m4; then
+ cached_libtool=false
+ my_sed_traces='
+ s,#.*$,,
+ s,^dnl .*$,,
+ s, dnl .*$,,
+ /gl_LOCAL_DIR(/ {
+ s,^.*gl_LOCAL_DIR([[ ]*\([^]"$`\\)]*\).*$,cached_local_gnulib_dir="\1",p
+ }
+ /gl_MODULES(/ {
+ ta
+ :a
+ s/)/)/
+ tb
+ N
+ ba
+ :b
+ s,^.*gl_MODULES([[ ]*\([^]"$`\\)]*\).*$,cached_specified_modules="\1",p
+ }
+ /gl_WITH_OBSOLETE/ {
+ s,^.*$,cached_incobsolete=true,p
+ }
+ /gl_AVOID(/ {
+ s,^.*gl_AVOID([[ ]*\([^]"$`\\)]*\).*$,cached_avoidlist="\1",p
+ }
+ /gl_SOURCE_BASE(/ {
+ s,^.*gl_SOURCE_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_sourcebase="\1",p
+ }
+ /gl_M4_BASE(/ {
+ s,^.*gl_M4_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_m4base="\1",p
+ }
+ /gl_PO_BASE(/ {
+ s,^.*gl_PO_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_pobase="\1",p
+ }
+ /gl_DOC_BASE(/ {
+ s,^.*gl_DOC_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_docbase="\1",p
+ }
+ /gl_TESTS_BASE(/ {
+ s,^.*gl_TESTS_BASE([[ ]*\([^]"$`\\)]*\).*$,cached_testsbase="\1",p
+ }
+ /gl_WITH_TESTS/ {
+ s,^.*$,cached_inctests=true,p
+ }
+ /gl_LIB(/ {
+ s,^.*gl_LIB([[ ]*\([^]"$`\\)]*\).*$,cached_libname="\1",p
+ }
+ /gl_LGPL(/ {
+ s,^.*gl_LGPL([[ ]*\([^]"$`\\)]*\).*$,cached_lgpl="\1",p
+ }
+ /gl_LGPL/ {
+ s,^.*$,cached_lgpl=yes,p
+ }
+ /gl_MAKEFILE_NAME(/ {
+ s,^.*gl_MAKEFILE_NAME([[ ]*\([^]"$`\\)]*\).*$,cached_makefile_name="\1",p
+ }
+ /gl_LIBTOOL/ {
+ s,^.*$,cached_libtool=true,p
+ }
+ /gl_MACRO_PREFIX(/ {
+ s,^.*gl_MACRO_PREFIX([[ ]*\([^]"$`\\)]*\).*$,cached_macro_prefix="\1",p
+ }
+ /gl_PO_DOMAIN(/ {
+ s,^.*gl_PO_DOMAIN([[ ]*\([^]"$`\\)]*\).*$,cached_po_domain="\1",p
+ }
+ /gl_VC_FILES(/ {
+ s,^.*gl_VC_FILES([[ ]*\([^]"$`\\)]*\).*$,cached_vc_files="\1",p
+ }'
+ eval `sed -n -e "$my_sed_traces" < "$destdir"/$m4base/gnulib-cache.m4`
+ if test -f "$destdir"/$m4base/gnulib-comp.m4; then
+ my_sed_traces='
+ s,#.*$,,
+ s,^dnl .*$,,
+ s, dnl .*$,,
+ /AC_DEFUN(\['"${cached_macro_prefix}"'_FILE_LIST\], \[/ {
+ s,^.*$,cached_files=",p
+ n
+ ta
+ :a
+ s,^\]).*$,",
+ tb
+ s,["$`\\],,g
+ p
+ n
+ ba
+ :b
+ p
+ }'
+ eval `sed -n -e "$my_sed_traces" < "$destdir"/$m4base/gnulib-comp.m4`
+ fi
+ fi
+
+ # Merge the cached settings with the specified ones.
+ # The m4base must be the same as expected from the pathname.
+ if test -n "$cached_m4base" && test "$cached_m4base" != "$m4base"; then
+ func_fatal_error "$m4base/gnulib-cache.m4 is expected to contain gl_M4_BASE([$m4base])"
+ fi
+ # The local_gnulib_dir defaults to the cached one. Recall that the cached one
+ # is relative to $destdir, whereas the one we use is relative to . or absolute.
+ if test -z "$local_gnulib_dir"; then
+ if test -n "$cached_local_gnulib_dir"; then
+ case "$destdir" in
+ /*)
+ local_gnulib_dir="$destdir/$cached_local_gnulib_dir" ;;
+ *)
+ case "$cached_local_gnulib_dir" in
+ /*)
+ local_gnulib_dir="$destdir/$cached_local_gnulib_dir" ;;
+ *)
+ func_relconcat "$destdir" "$cached_local_gnulib_dir"
+ local_gnulib_dir="$relconcat" ;;
+ esac ;;
+ esac
+ fi
+ fi
+ # Append the cached and the specified module names. So that
+ # "gnulib-tool --import foo" means to add the module foo.
+ specified_modules="$cached_specified_modules $1"
+ # Included obsolete modules among the dependencies if specified either way.
+ if test -z "$incobsolete"; then
+ incobsolete="$cached_incobsolete"
+ fi
+ # Append the cached and the specified avoidlist. This is probably better
+ # than dropping the cached one when --avoid is specified at least once.
+ avoidlist=`for m in $cached_avoidlist $avoidlist; do echo $m; done | LC_ALL=C sort -u`
+ avoidlist=`echo $avoidlist`
+
+ # The sourcebase defaults to the cached one.
+ if test -z "$sourcebase"; then
+ sourcebase="$cached_sourcebase"
+ if test -z "$sourcebase"; then
+ func_fatal_error "missing --source-base option"
+ fi
+ fi
+ # The pobase defaults to the cached one.
+ if test -z "$pobase"; then
+ pobase="$cached_pobase"
+ fi
+ # The docbase defaults to the cached one.
+ if test -z "$docbase"; then
+ docbase="$cached_docbase"
+ if test -z "$docbase"; then
+ func_fatal_error "missing --doc-base option. --doc-base has been introduced on 2006-07-11; if your last invocation of 'gnulib-tool --import' is before that date, you need to run 'gnulib-tool --import' once, with a --doc-base option."
+ fi
+ fi
+ # The testsbase defaults to the cached one.
+ if test -z "$testsbase"; then
+ testsbase="$cached_testsbase"
+ if test -z "$testsbase"; then
+ func_fatal_error "missing --tests-base option"
+ fi
+ fi
+ # Require the tests if specified either way.
+ if test -z "$inctests"; then
+ inctests="$cached_inctests"
+ fi
+ # The libname defaults to the cached one.
+ if test -z "$supplied_libname"; then
+ libname="$cached_libname"
+ if test -z "$libname"; then
+ func_fatal_error "missing --lib option"
+ fi
+ fi
+ # Require LGPL if specified either way.
+ if test -z "$lgpl"; then
+ lgpl="$cached_lgpl"
+ fi
+ # The makefile_name defaults to the cached one.
+ if test -z "$makefile_name"; then
+ makefile_name="$cached_makefile_name"
+ fi
+ # Use libtool if specified either way, or if guessed.
+ if test -z "$libtool"; then
+ if test -n "$cached_m4base"; then
+ libtool="$cached_libtool"
+ else
+ libtool="$guessed_libtool"
+ fi
+ fi
+ # The macro_prefix defaults to the cached one.
+ if test -z "$macro_prefix"; then
+ macro_prefix="$cached_macro_prefix"
+ if test -z "$macro_prefix"; then
+ func_fatal_error "missing --macro-prefix option"
+ fi
+ fi
+ # The po_domain defaults to the cached one.
+ if test -z "$po_domain"; then
+ po_domain="$cached_po_domain"
+ fi
+ # The vc_files defaults to the cached one.
+ if test -z "$vc_files"; then
+ vc_files="$cached_vc_files"
+ fi
+
+ # Canonicalize the list of specified modules.
+ specified_modules=`for m in $specified_modules; do echo $m; done | LC_ALL=C sort -u`
+
+ # Determine final module list.
+ modules="$specified_modules"
+ func_modules_transitive_closure
+ if test $verbose -ge 0; then
+ echo "Module list with included dependencies:"
+ echo "$modules" | sed -e 's/^/ /'
+ fi
+ final_modules="$modules"
+
+ # Determine main module list and tests-related module list separately.
+ # The main module list is the transitive closure of the specified modules,
+ # ignoring tests modules. Its lib/* sources go into $sourcebase/. If --lgpl
+ # is specified, it will consist only of LGPLed source.
+ # The tests-related module list is the transitive closure of the specified
+ # modules, including tests modules, minus the main module list excluding
+ # modules of applicability 'all'. Its lib/* sources (brought in through
+ # dependencies of *-tests modules) go into $testsbase/. It may contain GPLed
+ # source, even if --lgpl is specified.
+ # Determine main module list.
+ saved_inctests="$inctests"
+ inctests=""
+ modules="$specified_modules"
+ func_modules_transitive_closure
+ main_modules="$modules"
+ inctests="$saved_inctests"
+ if test $verbose -ge 1; then
+ echo "Main module list:"
+ echo "$main_modules" | sed -e 's/^/ /'
+ fi
+ # Determine tests-related module list.
+ echo "$final_modules" | LC_ALL=C sort -u > "$tmp"/final-modules
+ testsrelated_modules=`for module in $main_modules; do
+ if test \`func_get_applicability $module\` = main; then
+ echo $module
+ fi
+ done \
+ | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/final-modules`
+ if test $verbose -ge 1; then
+ echo "Tests-related module list:"
+ echo "$testsrelated_modules" | sed -e 's/^/ /'
+ fi
+
+ # Add the dummy module to the main module list if needed.
+ modules="$main_modules"
+ func_modules_add_dummy
+ main_modules="$modules"
+
+ # Determine whether a $testsbase/libtests.a is needed.
+ use_libtests=false
+ for module in $testsrelated_modules; do
+ func_verify_nontests_module
+ if test -n "$module"; then
+ all_files=`func_get_filelist $module`
+ # Test whether some file in $all_files lies in lib/.
+ for f in $all_files; do
+ case $f in
+ lib/*)
+ use_libtests=true
+ break 2
+ ;;
+ esac
+ done
+ fi
+ done
+
+ # Add the dummy module to the tests-related module list if needed.
+ if $use_libtests; then
+ modules="$testsrelated_modules"
+ func_modules_add_dummy
+ testsrelated_modules="$modules"
+ fi
+
+ # If --lgpl, verify that the licenses of modules are compatible.
+ if test -n "$lgpl"; then
+ license_incompatibilities=
+ for module in $main_modules; do
+ license=`func_get_license $module`
+ case $license in
+ 'GPLed build tool') ;;
+ 'public domain' | 'unlimited' | 'unmodifiable license text') ;;
+ *)
+ case "$lgpl" in
+ yes | 3)
+ case $license in
+ LGPL | LGPLv2+ | LGPLv3+) ;;
+ *) func_append license_incompatibilities "$module $license$nl" ;;
+ esac
+ ;;
+ 2)
+ case $license in
+ LGPLv2+) ;;
+ *) func_append license_incompatibilities "$module $license$nl" ;;
+ esac
+ ;;
+ *) func_fatal_error "invalid value lgpl=$lgpl" ;;
+ esac
+ ;;
+ esac
+ done
+ if test -n "$license_incompatibilities"; then
+ # Format the license incompatibilities as a table.
+ sed_expand_column1_width50_indent17='s,^\([^ ]*\) ,\1 ,
+s,^\(.................................................[^ ]*\) *, \1 ,'
+ license_incompatibilities=`echo "$license_incompatibilities" | sed -e "$sed_expand_column1_width50_indent17"`
+ func_fatal_error "incompatible license on modules:$nl$license_incompatibilities"
+ fi
+ fi
+
+ # Show banner notice of every module.
+ modules="$main_modules"
+ func_modules_notice
+
+ # Determine script to apply to imported library files.
+ sed_transform_lib_file=
+ for module in $main_modules; do
+ if test $module = config-h; then
+ # Assume config.h exists, and that -DHAVE_CONFIG_H is omitted.
+ sed_transform_lib_file=$sed_transform_lib_file'
+ s/^#ifdef[ ]*HAVE_CONFIG_H[ ]*$/#if 1/
+ '
+ break
+ fi
+ done
+ sed_transform_main_lib_file="$sed_transform_lib_file"
+ if test -n "$do_copyrights"; then
+ if test -n "$lgpl"; then
+ # Update license.
+ case "$lgpl" in
+ yes | 3)
+ sed_transform_main_lib_file=$sed_transform_main_lib_file'
+ s/GNU General/GNU Lesser General/g
+ '
+ ;;
+ 2)
+ sed_transform_main_lib_file=$sed_transform_main_lib_file'
+ s/GNU General/GNU Lesser General/g
+ s/version [23]\([ ,]\)/version 2.1\1/g
+ '
+ ;;
+ *) func_fatal_error "invalid value lgpl=$lgpl" ;;
+ esac
+ else
+ # Update license.
+ sed_transform_main_lib_file=$sed_transform_main_lib_file'
+ s/GNU Lesser General/GNU General/g
+ s/GNU Library General/GNU General/g
+ s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g
+ '
+ fi
+ fi
+
+ # Determine script to apply to auxiliary files that go into $auxdir/.
+ sed_transform_build_aux_file=
+ if test -n "$do_copyrights"; then
+ # Update license.
+ sed_transform_build_aux_file=$sed_transform_build_aux_file'
+ s/GNU Lesser General/GNU General/g
+ s/GNU Library General/GNU General/g
+ s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g
+ '
+ fi
+
+ # Determine script to apply to library files that go into $testsbase/.
+ sed_transform_testsrelated_lib_file="$sed_transform_lib_file"
+ if test -n "$do_copyrights"; then
+ # Update license.
+ sed_transform_testsrelated_lib_file=$sed_transform_testsrelated_lib_file'
+ s/GNU Lesser General/GNU General/g
+ s/GNU Library General/GNU General/g
+ s/version 2\(.1\)\{0,1\}\([ ,]\)/version 3\2/g
+ '
+ fi
+
+ # Determine the final file lists.
+ # They must be computed separately, because files in lib/* go into
+ # $sourcebase/ if they are in the main file list but into $testsbase/
+ # if they are in the tests-related file list. Furthermore lib/dummy.c
+ # can be in both.
+ # Determine final main file list.
+ modules="$main_modules"
+ func_modules_to_filelist
+ main_files="$files"
+ # Determine final tests-related file list.
+ modules="$testsrelated_modules"
+ func_modules_to_filelist
+ testsrelated_files=`echo "$files" | sed -e 's,^lib/,tests=lib/,'`
+ # Merge both file lists.
+ sed_remove_empty_lines='/^$/d'
+ files=`{ echo "$main_files"; echo "$testsrelated_files"; } | sed -e "$sed_remove_empty_lines" | LC_ALL=C sort -u`
+ if test $verbose -ge 0; then
+ echo "File list:"
+ sed_prettyprint_files='s,^tests=lib/\(.*\)$,lib/\1 -> tests/\1,'
+ echo "$files" | sed -e "$sed_prettyprint_files" -e 's/^/ /'
+ fi
+
+ test -n "$files" \
+ || func_fatal_error "refusing to do nothing"
+
+ # Add m4/gnulib-tool.m4 to the file list. It is not part of any module.
+ new_files="$files m4/gnulib-tool.m4"
+ old_files="$cached_files"
+ if test -f "$destdir"/$m4base/gnulib-tool.m4; then
+ func_append old_files " m4/gnulib-tool.m4"
+ fi
+
+ rewritten='%REWRITTEN%'
+ sed_rewrite_old_files="\
+ s,^build-aux/,$rewritten$auxdir/,
+ s,^doc/,$rewritten$cached_docbase/,
+ s,^lib/,$rewritten$cached_sourcebase/,
+ s,^m4/,$rewritten$cached_m4base/,
+ s,^tests/,$rewritten$cached_testsbase/,
+ s,^tests=lib/,$rewritten$cached_testsbase/,
+ s,^top/,$rewritten,
+ s,^$rewritten,,"
+ sed_rewrite_new_files="\
+ s,^build-aux/,$rewritten$auxdir/,
+ s,^doc/,$rewritten$docbase/,
+ s,^lib/,$rewritten$sourcebase/,
+ s,^m4/,$rewritten$m4base/,
+ s,^tests/,$rewritten$testsbase/,
+ s,^tests=lib/,$rewritten$testsbase/,
+ s,^top/,$rewritten,
+ s,^$rewritten,,"
+
+ # Create directories.
+ { echo "$sourcebase"
+ echo "$m4base"
+ if test -n "$pobase"; then
+ echo "$pobase"
+ fi
+ docfiles=`echo "$files" | sed -n -e 's,^doc/,,p'`
+ if test -n "$docfiles"; then
+ echo "$docbase"
+ fi
+ if test -n "$inctests"; then
+ echo "$testsbase"
+ fi
+ echo "$auxdir"
+ for f in $files; do echo $f; done \
+ | sed -e "$sed_rewrite_new_files" \
+ | sed -n -e 's,^\(.*\)/[^/]*,\1,p' \
+ | LC_ALL=C sort -u
+ } > "$tmp"/dirs
+ { # Rearrange file descriptors. Needed because "while ... done < ..."
+ # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+ exec 5<&0 < "$tmp"/dirs
+ while read d; do
+ if test ! -d "$destdir/$d"; then
+ if $doit; then
+ echo "Creating directory $destdir/$d"
+ mkdir -p "$destdir/$d" || func_fatal_error "failed"
+ else
+ echo "Create directory $destdir/$d"
+ fi
+ fi
+ done
+ exec 0<&5 5<&-
+ }
+
+ # Copy files or make symbolic links. Remove obsolete files.
+ added_files=''
+ removed_files=''
+ delimiter=' '
+ # Construct a table with 2 columns: rewritten-file-name original-file-name,
+ # representing the files according to the last gnulib-tool invocation.
+ for f in $old_files; do echo $f; done \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_old_files" \
+ | LC_ALL=C sort \
+ > "$tmp"/old-files
+ # Construct a table with 2 columns: rewritten-file-name original-file-name,
+ # representing the files after this gnulib-tool invocation.
+ for f in $new_files; do echo $f; done \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_new_files" \
+ | LC_ALL=C sort \
+ > "$tmp"/new-files
+ # First the files that are in old-files, but not in new-files:
+ sed_take_first_column='s,'"$delimiter"'.*,,'
+ for g in `LC_ALL=C join -t"$delimiter" -v1 "$tmp"/old-files "$tmp"/new-files | sed -e "$sed_take_first_column"`; do
+ # Remove the file. Do nothing if the user already removed it.
+ if test -f "$destdir/$g" || test -h "$destdir/$g"; then
+ if $doit; then
+ echo "Removing file $g (backup in ${g}~)"
+ mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
+ else
+ echo "Remove file $g (backup in ${g}~)"
+ fi
+ func_append removed_files "$g$nl"
+ fi
+ done
+ # func_add_or_update handles a file that ought to be present afterwards.
+ # Uses parameters
+ # - f the original file name
+ # - g the rewritten file name
+ # - already_present nonempty if the file should already exist, empty
+ # otherwise
+ func_add_or_update ()
+ {
+ of="$f"
+ case "$f" in
+ tests=lib/*) f=`echo "$f" | sed -e 's,^tests=lib/,lib/,'` ;;
+ esac
+ func_dest_tmpfilename "$g"
+ func_lookup_file "$f"
+ cp "$lookedup_file" "$tmpfile" || func_fatal_error "failed"
+ if test -n "$sed_transform_main_lib_file"; then
+ case "$of" in
+ lib/*)
+ sed -e "$sed_transform_main_lib_file" \
+ < "$lookedup_file" > "$tmpfile" || func_fatal_error "failed"
+ ;;
+ esac
+ fi
+ if test -n "$sed_transform_build_aux_file"; then
+ case "$of" in
+ build-aux/*)
+ sed -e "$sed_transform_build_aux_file" \
+ < "$lookedup_file" > "$tmpfile" || func_fatal_error "failed"
+ ;;
+ esac
+ fi
+ if test -n "$sed_transform_testsrelated_lib_file"; then
+ case "$of" in
+ tests=lib/*)
+ sed -e "$sed_transform_testsrelated_lib_file" \
+ < "$lookedup_file" > "$tmpfile" || func_fatal_error "failed"
+ ;;
+ esac
+ fi
+ if test -f "$destdir/$g"; then
+ # The file already exists.
+ func_update_file
+ else
+ # Install the file.
+ # Don't protest if the file should be there but isn't: it happens
+ # frequently that developers don't put autogenerated files into CVS.
+ func_add_file
+ func_append added_files "$g$nl"
+ fi
+ rm -f "$tmpfile"
+ }
+ # Then the files that are in new-files, but not in old-files:
+ sed_take_last_column='s,^.*'"$delimiter"',,'
+ already_present=
+ LC_ALL=C join -t"$delimiter" -v2 "$tmp"/old-files "$tmp"/new-files \
+ | sed -e "$sed_take_last_column" \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_new_files" > "$tmp"/added-files
+ { # Rearrange file descriptors. Needed because "while ... done < ..."
+ # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+ exec 5<&0 < "$tmp"/added-files
+ while read g f; do
+ func_add_or_update
+ done
+ exec 0<&5 5<&-
+ }
+ # Then the files that are in new-files and in old-files:
+ already_present=true
+ LC_ALL=C join -t"$delimiter" "$tmp"/old-files "$tmp"/new-files \
+ | sed -e "$sed_take_last_column" \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_new_files" > "$tmp"/kept-files
+ { # Rearrange file descriptors. Needed because "while ... done < ..."
+ # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+ exec 5<&0 < "$tmp"/kept-files
+ while read g f; do
+ func_add_or_update
+ done
+ exec 0<&5 5<&-
+ }
+
+ # Command-line invocation printed in a comment in generated gnulib-cache.m4.
+ actioncmd="gnulib-tool --import"
+ func_append actioncmd " --dir=$destdir"
+ if test -n "$local_gnulib_dir"; then
+ func_append actioncmd " --local-dir=$local_gnulib_dir"
+ fi
+ func_append actioncmd " --lib=$libname"
+ func_append actioncmd " --source-base=$sourcebase"
+ func_append actioncmd " --m4-base=$m4base"
+ if test -n "$pobase"; then
+ func_append actioncmd " --po-base=$pobase"
+ fi
+ func_append actioncmd " --doc-base=$docbase"
+ func_append actioncmd " --tests-base=$testsbase"
+ func_append actioncmd " --aux-dir=$auxdir"
+ if test -n "$inctests"; then
+ func_append actioncmd " --with-tests"
+ fi
+ if test -n "$incobsolete"; then
+ func_append actioncmd " --with-obsolete"
+ fi
+ for module in $avoidlist; do
+ func_append actioncmd " --avoid=$module"
+ done
+ if test -n "$lgpl"; then
+ if test "$lgpl" = yes; then
+ func_append actioncmd " --lgpl"
+ else
+ func_append actioncmd " --lgpl=$lgpl"
+ fi
+ fi
+ if test -n "$makefile_name"; then
+ func_append actioncmd " --makefile-name=$makefile_name"
+ fi
+ if test "$libtool" = true; then
+ func_append actioncmd " --libtool"
+ else
+ func_append actioncmd " --no-libtool"
+ fi
+ func_append actioncmd " --macro-prefix=$macro_prefix"
+ if test -n "$po_domain"; then
+ func_append actioncmd " --po-domain=$po_domain"
+ fi
+ if test -n "$vc_files"; then
+ if test "$vc_files" = true; then
+ func_append actioncmd " --vc-files"
+ else
+ func_append actioncmd " --no-vc-files"
+ fi
+ fi
+ func_append actioncmd " `echo $specified_modules`"
+
+ # Default the makefile name to Makefile.am.
+ if test -n "$makefile_name"; then
+ makefile_am=$makefile_name
+ else
+ makefile_am=Makefile.am
+ fi
+
+ # Create normal Makefile.ams.
+ for_test=false
+
+ # Setup list of Makefile.am edits that are to be performed afterwards.
+ # Some of these edits apply to files that we will generate; others are
+ # under the responsibility of the developer.
+ makefile_am_edits=0
+ # func_note_Makefile_am_edit dir var value
+ # remembers that ${dir}Makefile.am needs to be edited to that ${var} mentions
+ # ${value}.
+ func_note_Makefile_am_edit ()
+ {
+ makefile_am_edits=`expr $makefile_am_edits + 1`
+ eval makefile_am_edit${makefile_am_edits}_dir=\"\$1\"
+ eval makefile_am_edit${makefile_am_edits}_var=\"\$2\"
+ eval makefile_am_edit${makefile_am_edits}_val=\"\$3\"
+ }
+ if test "$makefile_am" = Makefile.am; then
+ sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'`
+ sourcebase_base=`basename "$sourcebase"`
+ func_note_Makefile_am_edit "$sourcebase_dir" SUBDIRS "$sourcebase_base"
+ fi
+ if test -n "$pobase"; then
+ pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'`
+ pobase_base=`basename "$pobase"`
+ func_note_Makefile_am_edit "$pobase_dir" SUBDIRS "$pobase_base"
+ fi
+ if test -n "$inctests"; then
+ if test "$makefile_am" = Makefile.am; then
+ testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'`
+ testsbase_base=`basename "$testsbase"`
+ func_note_Makefile_am_edit "$testsbase_dir" SUBDIRS "$testsbase_base"
+ fi
+ fi
+ func_note_Makefile_am_edit "" ACLOCAL_AMFLAGS "-I ${m4base}"
+ {
+ # Find the first parent directory of $m4base that contains or will contain
+ # a Makefile.am.
+ sed_last='s,^.*/\([^/][^/]*\)//*$,\1/,
+s,//*$,/,'
+ sed_butlast='s,[^/][^/]*//*$,,'
+ dir1="${m4base}/"; dir2=""
+ while test -n "$dir1" \
+ && ! { test -f "${destdir}/${dir1}Makefile.am" \
+ || test "${dir1}Makefile.am" = "$sourcebase/$makefile_am" \
+ || test "./${dir1}Makefile.am" = "$sourcebase/$makefile_am" \
+ || { test -n "$inctests" \
+ && { test "${dir1}Makefile.am" = "$testsbase/$makefile_am" \
+ || test "./${dir1}Makefile.am" = "$testsbase/$makefile_am"; }; }; }; do
+ dir2=`echo "$dir1" | sed -e "$sed_last"`"$dir2"
+ dir1=`echo "$dir1" | sed -e "$sed_butlast"`
+ done
+ func_note_Makefile_am_edit "$dir1" EXTRA_DIST "${dir2}gnulib-cache.m4"
+ }
+
+ # Create library makefile.
+ func_dest_tmpfilename $sourcebase/$makefile_am
+ destfile="$sourcebase/$makefile_am"
+ modules="$main_modules"
+ func_emit_lib_Makefile_am > "$tmpfile"
+ if test -f "$destdir"/$sourcebase/$makefile_am; then
+ if cmp "$destdir"/$sourcebase/$makefile_am "$tmpfile" > /dev/null; then
+ rm -f "$tmpfile"
+ else
+ if $doit; then
+ echo "Updating $sourcebase/$makefile_am (backup in $sourcebase/$makefile_am~)"
+ mv -f "$destdir"/$sourcebase/$makefile_am "$destdir"/$sourcebase/$makefile_am~
+ mv -f "$tmpfile" "$destdir"/$sourcebase/$makefile_am
+ else
+ echo "Update $sourcebase/$makefile_am (backup in $sourcebase/$makefile_am~)"
+ rm -f "$tmpfile"
+ fi
+ fi
+ else
+ if $doit; then
+ echo "Creating $sourcebase/$makefile_am"
+ mv -f "$tmpfile" "$destdir"/$sourcebase/$makefile_am
+ else
+ echo "Create $sourcebase/$makefile_am"
+ rm -f "$tmpfile"
+ fi
+ func_append added_files "$sourcebase/$makefile_am$nl"
+ fi
+
+ # Create po/ directory.
+ if test -n "$pobase"; then
+ # Create po makefile and auxiliary files.
+ for file in Makefile.in.in remove-potcdate.sin; do
+ func_dest_tmpfilename $pobase/$file
+ func_lookup_file build-aux/po/$file
+ cat "$lookedup_file" > "$tmpfile"
+ if test -f "$destdir"/$pobase/$file; then
+ if cmp "$destdir"/$pobase/$file "$tmpfile" > /dev/null; then
+ rm -f "$tmpfile"
+ else
+ if $doit; then
+ echo "Updating $pobase/$file (backup in $pobase/$file~)"
+ mv -f "$destdir"/$pobase/$file "$destdir"/$pobase/$file~
+ mv -f "$tmpfile" "$destdir"/$pobase/$file
+ else
+ echo "Update $pobase/$file (backup in $pobase/$file~)"
+ rm -f "$tmpfile"
+ fi
+ fi
+ else
+ if $doit; then
+ echo "Creating $pobase/$file"
+ mv -f "$tmpfile" "$destdir"/$pobase/$file
+ else
+ echo "Create $pobase/$file"
+ rm -f "$tmpfile"
+ fi
+ func_append added_files "$pobase/$file$nl"
+ fi
+ done
+ # Create po makefile parameterization, part 1.
+ func_dest_tmpfilename $pobase/Makevars
+ func_emit_po_Makevars > "$tmpfile"
+ if test -f "$destdir"/$pobase/Makevars; then
+ if cmp "$destdir"/$pobase/Makevars "$tmpfile" > /dev/null; then
+ rm -f "$tmpfile"
+ else
+ if $doit; then
+ echo "Updating $pobase/Makevars (backup in $pobase/Makevars~)"
+ mv -f "$destdir"/$pobase/Makevars "$destdir"/$pobase/Makevars~
+ mv -f "$tmpfile" "$destdir"/$pobase/Makevars
+ else
+ echo "Update $pobase/Makevars (backup in $pobase/Makevars~)"
+ rm -f "$tmpfile"
+ fi
+ fi
+ else
+ if $doit; then
+ echo "Creating $pobase/Makevars"
+ mv -f "$tmpfile" "$destdir"/$pobase/Makevars
+ else
+ echo "Create $pobase/Makevars"
+ rm -f "$tmpfile"
+ fi
+ func_append added_files "$pobase/Makevars$nl"
+ fi
+ # Create po makefile parameterization, part 2.
+ func_dest_tmpfilename $pobase/POTFILES.in
+ func_emit_po_POTFILES_in > "$tmpfile"
+ if test -f "$destdir"/$pobase/POTFILES.in; then
+ if cmp "$destdir"/$pobase/POTFILES.in "$tmpfile" > /dev/null; then
+ rm -f "$tmpfile"
+ else
+ if $doit; then
+ echo "Updating $pobase/POTFILES.in (backup in $pobase/POTFILES.in~)"
+ mv -f "$destdir"/$pobase/POTFILES.in "$destdir"/$pobase/POTFILES.in~
+ mv -f "$tmpfile" "$destdir"/$pobase/POTFILES.in
+ else
+ echo "Update $pobase/POTFILES.in (backup in $pobase/POTFILES.in~)"
+ rm -f "$tmpfile"
+ fi
+ fi
+ else
+ if $doit; then
+ echo "Creating $pobase/POTFILES.in"
+ mv -f "$tmpfile" "$destdir"/$pobase/POTFILES.in
+ else
+ echo "Create $pobase/POTFILES.in"
+ rm -f "$tmpfile"
+ fi
+ func_append added_files "$pobase/POTFILES.in$nl"
+ fi
+ # Fetch PO files.
+ TP_URL="http://translationproject.org/latest/"
+ TP_RSYNC_URI="translationproject.org::tp/latest/"
+ if $doit; then
+ echo "Fetching gnulib PO files from $TP_URL"
+ (cd "$destdir"/$pobase \
+ && { # Prefer rsync over wget if it is available, since it consumes
+ # less network bandwidth, due to compression.
+ if type rsync 2>/dev/null | grep / > /dev/null; then
+ rsync -Lrtz "${TP_RSYNC_URI}gnulib/" .
+ else
+ wget --quiet -r -l1 -nd -np -A.po "${TP_URL}gnulib"
+ fi
+ }
+ )
+ else
+ echo "Fetch gnulib PO files from $TP_URL"
+ fi
+ # Create po/LINGUAS.
+ if $doit; then
+ func_dest_tmpfilename $pobase/LINGUAS
+ (cd "$destdir"/$pobase \
+ && { echo '# Set of available languages.'
+ LC_ALL=C ls -1 *.po | sed -e 's,\.po$,,'
+ }
+ ) > "$tmpfile"
+ if test -f "$destdir"/$pobase/LINGUAS; then
+ if cmp "$destdir"/$pobase/LINGUAS "$tmpfile" > /dev/null; then
+ rm -f "$tmpfile"
+ else
+ echo "Updating $pobase/LINGUAS (backup in $pobase/LINGUAS~)"
+ mv -f "$destdir"/$pobase/LINGUAS "$destdir"/$pobase/LINGUAS~
+ mv -f "$tmpfile" "$destdir"/$pobase/LINGUAS
+ fi
+ else
+ echo "Creating $pobase/LINGUAS"
+ mv -f "$tmpfile" "$destdir"/$pobase/LINGUAS
+ func_append added_files "$pobase/LINGUAS$nl"
+ fi
+ else
+ if test -f "$destdir"/$pobase/LINGUAS; then
+ echo "Update $pobase/LINGUAS (backup in $pobase/LINGUAS~)"
+ else
+ echo "Create $pobase/LINGUAS"
+ fi
+ fi
+ fi
+
+ # Create m4/gnulib-cache.m4.
+ func_dest_tmpfilename $m4base/gnulib-cache.m4
+ (
+ func_emit_copyright_notice
+ echo "#"
+ echo "# This file represents the specification of how gnulib-tool is used."
+ echo "# It acts as a cache: It is written and read by gnulib-tool."
+ echo "# In projects using CVS, this file is meant to be stored in CVS,"
+ echo "# like the configure.ac and various Makefile.am files."
+ echo
+ echo
+ echo "# Specification in the form of a command-line invocation:"
+ echo "# $actioncmd"
+ echo
+ echo "# Specification in the form of a few gnulib-tool.m4 macro invocations:"
+ # Store the local_gnulib_dir relative to destdir.
+ case "$local_gnulib_dir" in
+ "" | /*)
+ relative_local_gnulib_dir="$local_gnulib_dir" ;;
+ * )
+ case "$destdir" in
+ /*) relative_local_gnulib_dir="$local_gnulib_dir" ;;
+ *)
+ # destdir, local_gnulib_dir are both relative.
+ func_relativize "$destdir" "$local_gnulib_dir"
+ relative_local_gnulib_dir="$reldir" ;;
+ esac ;;
+ esac
+ echo "gl_LOCAL_DIR([$relative_local_gnulib_dir])"
+ echo "gl_MODULES(["
+ echo "$specified_modules" | sed -e 's/^/ /g'
+ echo "])"
+ test -z "$incobsolete" || echo "gl_WITH_OBSOLETE"
+ echo "gl_AVOID([$avoidlist])"
+ echo "gl_SOURCE_BASE([$sourcebase])"
+ echo "gl_M4_BASE([$m4base])"
+ echo "gl_PO_BASE([$pobase])"
+ echo "gl_DOC_BASE([$docbase])"
+ echo "gl_TESTS_BASE([$testsbase])"
+ test -z "$inctests" || echo "gl_WITH_TESTS"
+ echo "gl_LIB([$libname])"
+ if test -n "$lgpl"; then
+ if test "$lgpl" = yes; then
+ echo "gl_LGPL"
+ else
+ echo "gl_LGPL([$lgpl])"
+ fi
+ fi
+ echo "gl_MAKEFILE_NAME([$makefile_name])"
+ if test "$libtool" = true; then
+ echo "gl_LIBTOOL"
+ fi
+ echo "gl_MACRO_PREFIX([$macro_prefix])"
+ echo "gl_PO_DOMAIN([$po_domain])"
+ if test -n "$vc_files"; then
+ echo "gl_VC_FILES([$vc_files])"
+ fi
+ ) > "$tmpfile"
+ if test -f "$destdir"/$m4base/gnulib-cache.m4; then
+ if cmp "$destdir"/$m4base/gnulib-cache.m4 "$tmpfile" > /dev/null; then
+ rm -f "$tmpfile"
+ else
+ if $doit; then
+ echo "Updating $m4base/gnulib-cache.m4 (backup in $m4base/gnulib-cache.m4~)"
+ mv -f "$destdir"/$m4base/gnulib-cache.m4 "$destdir"/$m4base/gnulib-cache.m4~
+ mv -f "$tmpfile" "$destdir"/$m4base/gnulib-cache.m4
+ else
+ echo "Update $m4base/gnulib-cache.m4 (backup in $m4base/gnulib-cache.m4~)"
+ if false; then
+ cat "$tmpfile"
+ echo
+ echo "# gnulib-cache.m4 ends here"
+ fi
+ rm -f "$tmpfile"
+ fi
+ fi
+ else
+ if $doit; then
+ echo "Creating $m4base/gnulib-cache.m4"
+ mv -f "$tmpfile" "$destdir"/$m4base/gnulib-cache.m4
+ else
+ echo "Create $m4base/gnulib-cache.m4"
+ cat "$tmpfile"
+ rm -f "$tmpfile"
+ fi
+ fi
+
+ # Create m4/gnulib-comp.m4.
+ func_dest_tmpfilename $m4base/gnulib-comp.m4
+ (
+ echo "# DO NOT EDIT! GENERATED AUTOMATICALLY!"
+ func_emit_copyright_notice
+ echo "#"
+ echo "# This file represents the compiled summary of the specification in"
+ echo "# gnulib-cache.m4. It lists the computed macro invocations that need"
+ echo "# to be invoked from configure.ac."
+ echo "# In projects using CVS, this file can be treated like other built files."
+ echo
+ echo
+ echo "# This macro should be invoked from $configure_ac, in the section"
+ echo "# \"Checks for programs\", right after AC_PROG_CC, and certainly before"
+ echo "# any checks for libraries, header files, types and library functions."
+ echo "AC_DEFUN([${macro_prefix}_EARLY],"
+ echo "["
+ echo " m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace"
+ echo " m4_pattern_allow([^gl_ES\$])dnl a valid locale name"
+ echo " m4_pattern_allow([^gl_LIBOBJS\$])dnl a variable"
+ echo " m4_pattern_allow([^gl_LTLIBOBJS\$])dnl a variable"
+ echo " AC_REQUIRE([AC_PROG_RANLIB])"
+ if test -n "$uses_subdirs"; then
+ echo " AC_REQUIRE([AM_PROG_CC_C_O])"
+ fi
+ for module in $final_modules; do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_autoconf_early_snippet "$module"
+ fi
+ done \
+ | sed -e '/^$/d;' -e 's/^/ /'
+ echo "])"
+ echo
+ echo "# This macro should be invoked from $configure_ac, in the section"
+ echo "# \"Check for header files, types and library functions\"."
+ echo "AC_DEFUN([${macro_prefix}_INIT],"
+ echo "["
+ if test "$libtool" = true; then
+ echo " AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
+ echo " gl_cond_libtool=true"
+ else
+ echo " AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
+ echo " gl_cond_libtool=false"
+ echo " gl_libdeps="
+ echo " gl_ltlibdeps="
+ fi
+ if test "$auxdir" != "build-aux"; then
+ sed_replace_build_aux='
+ :a
+ /AC_CONFIG_FILES(.*:build-aux\/.*)/{
+ s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:'"$auxdir"'/\2)|
+ ba
+ }'
+ else
+ sed_replace_build_aux="$sed_noop"
+ fi
+ func_emit_initmacro_start $macro_prefix
+ echo " gl_source_base='$sourcebase'"
+ for module in $main_modules; do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_autoconf_snippet "$module" \
+ | sed -e '/^$/d;' -e 's/^/ /' \
+ -e 's/AM_GNU_GETTEXT(\[external\])/dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac./' \
+ -e "$sed_replace_build_aux"
+ if test "$module" = 'alloca' && test "$libtool" = true; then
+ echo 'changequote(,)dnl'
+ echo 'LTALLOCA=`echo "$ALLOCA" | sed -e '"'"'s/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'"'"'`'
+ echo 'changequote([, ])dnl'
+ echo 'AC_SUBST([LTALLOCA])'
+ fi
+ fi
+ done
+ func_emit_initmacro_end $macro_prefix
+ echo " gltests_libdeps="
+ echo " gltests_ltlibdeps="
+ func_emit_initmacro_start ${macro_prefix}tests
+ echo " gl_source_base='$testsbase'"
+ for module in $testsrelated_modules; do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_autoconf_snippet "$module" \
+ | sed -e '/^$/d;' -e 's/^/ /' \
+ -e 's/AM_GNU_GETTEXT(\[external\])/dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac./' \
+ -e "$sed_replace_build_aux" \
+ -e 's/\$gl_cond_libtool/false/g' \
+ -e 's/gl_libdeps/gltests_libdeps/g' \
+ -e 's/gl_ltlibdeps/gltests_ltlibdeps/g'
+ fi
+ done
+ func_emit_initmacro_end ${macro_prefix}tests
+ # _LIBDEPS and _LTLIBDEPS variables are not needed if this library is
+ # created using libtool, because libtool already handles the dependencies.
+ if test "$libtool" != true; then
+ libname_upper=`echo "$libname" | LC_ALL=C tr 'a-z-' 'A-Z_'`
+ echo " ${libname_upper}_LIBDEPS=\"\$gl_libdeps\""
+ echo " AC_SUBST([${libname_upper}_LIBDEPS])"
+ echo " ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
+ echo " AC_SUBST([${libname_upper}_LTLIBDEPS])"
+ fi
+ if $use_libtests; then
+ echo " LIBTESTS_LIBDEPS=\"\$gltests_libdeps\""
+ echo " AC_SUBST([LIBTESTS_LIBDEPS])"
+ fi
+ echo "])"
+ func_emit_initmacro_done $macro_prefix $sourcebase
+ func_emit_initmacro_done ${macro_prefix}tests $testsbase
+ echo
+ echo "# This macro records the list of files which have been installed by"
+ echo "# gnulib-tool and may be removed by future gnulib-tool invocations."
+ echo "AC_DEFUN([${macro_prefix}_FILE_LIST], ["
+ echo "$files" | sed -e 's,^, ,'
+ echo "])"
+ ) > "$tmpfile"
+ if test -f "$destdir"/$m4base/gnulib-comp.m4; then
+ if cmp "$destdir"/$m4base/gnulib-comp.m4 "$tmpfile" > /dev/null; then
+ rm -f "$tmpfile"
+ else
+ if $doit; then
+ echo "Updating $m4base/gnulib-comp.m4 (backup in $m4base/gnulib-comp.m4~)"
+ mv -f "$destdir"/$m4base/gnulib-comp.m4 "$destdir"/$m4base/gnulib-comp.m4~
+ mv -f "$tmpfile" "$destdir"/$m4base/gnulib-comp.m4
+ else
+ echo "Update $m4base/gnulib-comp.m4 (backup in $m4base/gnulib-comp.m4~)"
+ if false; then
+ cat "$tmpfile"
+ echo
+ echo "# gnulib-comp.m4 ends here"
+ fi
+ rm -f "$tmpfile"
+ fi
+ fi
+ else
+ if $doit; then
+ echo "Creating $m4base/gnulib-comp.m4"
+ mv -f "$tmpfile" "$destdir"/$m4base/gnulib-comp.m4
+ else
+ echo "Create $m4base/gnulib-comp.m4"
+ cat "$tmpfile"
+ rm -f "$tmpfile"
+ fi
+ fi
+
+ if test -n "$inctests"; then
+ # Create tests makefile.
+ func_dest_tmpfilename $testsbase/$makefile_am
+ destfile="$testsbase/$makefile_am"
+ modules="$testsrelated_modules"
+ func_emit_tests_Makefile_am > "$tmpfile"
+ if test -f "$destdir"/$testsbase/$makefile_am; then
+ if cmp "$destdir"/$testsbase/$makefile_am "$tmpfile" > /dev/null; then
+ rm -f "$tmpfile"
+ else
+ if $doit; then
+ echo "Updating $testsbase/$makefile_am (backup in $testsbase/$makefile_am~)"
+ mv -f "$destdir"/$testsbase/$makefile_am "$destdir"/$testsbase/$makefile_am~
+ mv -f "$tmpfile" "$destdir"/$testsbase/$makefile_am
+ else
+ echo "Update $testsbase/$makefile_am (backup in $testsbase/$makefile_am~)"
+ rm -f "$tmpfile"
+ fi
+ fi
+ else
+ if $doit; then
+ echo "Creating $testsbase/$makefile_am"
+ mv -f "$tmpfile" "$destdir"/$testsbase/$makefile_am
+ else
+ echo "Create $testsbase/$makefile_am"
+ rm -f "$tmpfile"
+ fi
+ func_append added_files "$testsbase/$makefile_am$nl"
+ fi
+ fi
+
+ if test "$vc_files" != false; then
+ # Update the .cvsignore and .gitignore files.
+ { echo "$added_files" | sed -e '/^$/d' -e 's,\([^/]*\)$,|A|\1,'
+ echo "$removed_files" | sed -e '/^$/d' -e 's,\([^/]*\)$,|R|\1,'
+ # Treat gnulib-comp.m4 like an added file, even if it already existed.
+ echo "$m4base/|A|gnulib-comp.m4"
+ } | LC_ALL=C sort -t'|' -k1,1 > "$tmp"/fileset-changes
+ { # Rearrange file descriptors. Needed because "while ... done < ..."
+ # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+ exec 5<&0 < "$tmp"/fileset-changes
+ func_update_ignorelist ()
+ {
+ ignore="$1"
+ if test "$ignore" = .gitignore; then
+ # In a .gitignore file, "foo" applies to the current directory and all
+ # subdirectories, whereas "/foo" applies to the current directory only.
+ anchor='/'
+ escaped_anchor='\/'
+ doubly_escaped_anchor='\\/'
+ else
+ anchor=''
+ escaped_anchor=''
+ doubly_escaped_anchor=''
+ fi
+ if test -f "$destdir/$dir$ignore"; then
+ if test -n "$dir_added" || test -n "$dir_removed"; then
+ sed -e "s|^$anchor||" < "$destdir/$dir$ignore" | LC_ALL=C sort > "$tmp"/ignore
+ (echo "$dir_added" | sed -e '/^$/d' | LC_ALL=C sort -u \
+ | LC_ALL=C join -v 1 - "$tmp"/ignore > "$tmp"/ignore-added
+ echo "$dir_removed" | sed -e '/^$/d' | LC_ALL=C sort -u \
+ | LC_ALL=C join -v 1 - "$tmp"/ignore > "$tmp"/ignore-removed
+ )
+ if test -s "$tmp"/ignore-added || test -s "$tmp"/ignore-removed; then
+ if $doit; then
+ echo "Updating $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
+ mv -f "$destdir/$dir$ignore" "$destdir/$dir$ignore"~
+ { sed -e 's,/,\\/,g' -e 's,^,/^,' -e 's,$,\$/d,' < "$tmp"/ignore-removed
+ if test -n "$anchor"; then sed -e 's,/,\\/,g' -e "s,^,/^${doubly_escaped_anchor}," -e 's,$,$/d,' < "$tmp"/ignore-removed; fi
+ } > "$tmp"/sed-ignore-removed
+ { cat "$destdir/$dir$ignore"~
+ sed -e "s|^|$anchor|" < "$tmp"/ignore-added
+ } | sed -f "$tmp"/sed-ignore-removed \
+ > "$destdir/$dir$ignore"
+ else
+ echo "Update $destdir/$dir$ignore (backup in $destdir/$dir${ignore}~)"
+ fi
+ fi
+ fi
+ else
+ if test -n "$dir_added"; then
+ if $doit; then
+ echo "Creating $destdir/$dir$ignore"
+ {
+ if test "$ignore" = .cvsignore; then
+ echo ".deps"
+ # Automake generates Makefile rules that create .dirstamp files.
+ echo ".dirstamp"
+ fi
+ echo "$dir_added" | sed -e '/^$/d' -e "s|^|$anchor|" | LC_ALL=C sort -u
+ } > "$destdir/$dir$ignore"
+ else
+ echo "Create $destdir/$dir$ignore"
+ fi
+ fi
+ fi
+ }
+ func_done_dir ()
+ {
+ dir="$1"
+ dir_added="$2"
+ dir_removed="$3"
+ if test -d "$destdir/CVS" || test -d "$destdir/${dir}CVS" || test -f "$destdir/${dir}.cvsignore"; then
+ func_update_ignorelist .cvsignore
+ fi
+ if test -d "$destdir/.git" || test -f "$destdir/${dir}.gitignore"; then
+ func_update_ignorelist .gitignore
+ fi
+ }
+ last_dir=
+ last_dir_added=
+ last_dir_removed=
+ while read line; do
+ # Why not ''read next_dir op file'' ? Because the dir column can be empty.
+ next_dir=`echo "$line" | sed -e 's,|.*,,'`
+ op=`echo "$line" | sed -e 's,^[^|]*|\([^|]*\)|.*$,\1,'`
+ file=`echo "$line" | sed -e 's,^[^|]*|[^|]*|,,'`
+ if test "$next_dir" != "$last_dir"; then
+ func_done_dir "$last_dir" "$last_dir_added" "$last_dir_removed"
+ last_dir="$next_dir"
+ last_dir_added=
+ last_dir_removed=
+ fi
+ case $op in
+ A) func_append last_dir_added "$file$nl";;
+ R) func_append last_dir_removed "$file$nl";;
+ esac
+ done
+ func_done_dir "$last_dir" "$last_dir_added" "$last_dir_removed"
+ exec 0<&5 5<&-
+ }
+ fi
+
+ echo "Finished."
+ echo
+ echo "You may need to add #include directives for the following .h files."
+ # Intersect $specified_modules and $main_modules
+ # (since $specified_modules is not necessarily of subset of $main_modules
+ # - some may have been skipped through --avoid, and since the elements of
+ # $main_modules but not in $specified_modules can go away without explicit
+ # notice - through changes in the module dependencies).
+ echo "$specified_modules" > "$tmp"/modules1 # a sorted list, one module per line
+ echo "$main_modules" > "$tmp"/modules2 # also a sorted list, one module per line
+ # First the #include <...> directives without #ifs, sorted for convenience,
+ # then the #include "..." directives without #ifs, sorted for convenience,
+ # then the #include directives that are surrounded by #ifs. Not sorted.
+ for module in `LC_ALL=C join "$tmp"/modules1 "$tmp"/modules2`; do
+ include_directive=`func_get_include_directive "$module"`
+ case "$nl$include_directive" in
+ *"$nl#if"*)
+ echo "$include_directive" 1>&5
+ ;;
+ *)
+ echo "$include_directive" | grep -v 'include "' 1>&6
+ echo "$include_directive" | grep 'include "' 1>&7
+ ;;
+ esac
+ done 5> "$tmp"/include-if 6> "$tmp"/include-angles 7> "$tmp"/include-quotes
+ (
+ LC_ALL=C sort -u "$tmp"/include-angles
+ LC_ALL=C sort -u "$tmp"/include-quotes
+ cat "$tmp"/include-if
+ ) | sed -e '/^$/d' -e 's/^/ /'
+ rm -f "$tmp"/include-angles "$tmp"/include-quotes "$tmp"/include-if
+
+ for module in $main_modules; do
+ func_get_link_directive "$module"
+ done \
+ | LC_ALL=C sort -u | sed -e '/^$/d' -e 's/^/ /' > "$tmp"/link
+ if test `wc -l < "$tmp"/link` != 0; then
+ echo
+ echo "You may need to use the following Makefile variables when linking."
+ echo "Use them in <program>_LDADD when linking a program, or"
+ echo "in <library>_a_LDFLAGS or <library>_la_LDFLAGS when linking a library."
+ cat "$tmp"/link
+ fi
+ rm -f "$tmp"/link
+
+ echo
+ echo "Don't forget to"
+ if test "$makefile_am" = Makefile.am; then
+ echo " - add \"$sourcebase/Makefile\" to AC_CONFIG_FILES in $configure_ac,"
+ else
+ echo " - \"include $makefile_name\" from within \"$sourcebase/Makefile.am\","
+ fi
+ if test -n "$pobase"; then
+ echo " - add \"$pobase/Makefile.in\" to AC_CONFIG_FILES in $configure_ac,"
+ fi
+ if test -n "$inctests"; then
+ if test "$makefile_am" = Makefile.am; then
+ echo " - add \"$testsbase/Makefile\" to AC_CONFIG_FILES in $configure_ac,"
+ else
+ echo " - \"include $makefile_name\" from within \"$testsbase/Makefile.am\","
+ fi
+ fi
+ edit=0
+ while test $edit != $makefile_am_edits; do
+ edit=`expr $edit + 1`
+ eval dir=\"\$makefile_am_edit${edit}_dir\"
+ eval var=\"\$makefile_am_edit${edit}_var\"
+ eval val=\"\$makefile_am_edit${edit}_val\"
+ if test -n "$var"; then
+ echo " - mention \"${val}\" in ${var} in ${dir}Makefile.am,"
+ fi
+ done
+ echo " - invoke ${macro_prefix}_EARLY in $configure_ac, right after AC_PROG_CC,"
+ echo " - invoke ${macro_prefix}_INIT in $configure_ac."
+}
+
+# func_create_testdir testdir modules
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - auxdir directory relative to destdir where to place build aux files
+func_create_testdir ()
+{
+ testdir="$1"
+ modules="$2"
+ if test -z "$modules"; then
+ # All modules together.
+ # Except config-h, which breaks all modules which use HAVE_CONFIG_H.
+ # Except ftruncate, mountlist, which abort the configuration on mingw. FIXME.
+ modules=`func_all_modules`
+ modules=`for m in $modules; do case $m in config-h | ftruncate | mountlist) ;; *) echo $m;; esac; done`
+ fi
+ modules=`for m in $modules; do echo $m; done | LC_ALL=C sort -u`
+
+ # Check that the license of every module is consistent with the license of
+ # its dependencies.
+ saved_modules="$modules"
+ saved_inctests="$inctests"
+ # When computing transitive closures, don't consider $module to depend on
+ # $module-tests. Need this becauses tests are implicitly GPL and may depend
+ # on GPL modules - therefore we don't want a warning in this case.
+ inctests=""
+ for requested_module in $saved_modules; do
+ requested_license=`func_get_license "$requested_module"`
+ if test "$requested_license" != GPL; then
+ # Here we use func_modules_transitive_closure, not just
+ # func_get_dependencies, so that we also detect weird situations like
+ # an LGPL module which depends on a GPLed build tool module which depends
+ # on a GPL module.
+ modules="$requested_module"
+ func_modules_transitive_closure
+ for module in $modules; do
+ license=`func_get_license "$module"`
+ case "$license" in
+ 'GPLed build tool') ;;
+ 'public domain' | 'unlimited' | 'unmodifiable license text') ;;
+ *)
+ case "$requested_license" in
+ GPLv2+)
+ case "$license" in
+ GPLv2+ | LGPLv2+) ;;
+ *) func_warning "module $requested_module depends on a module with an incompatible license: $module" ;;
+ esac
+ ;;
+ LGPL)
+ case "$license" in
+ LGPL | LGPLv2+) ;;
+ *) func_warning "module $requested_module depends on a module with an incompatible license: $module" ;;
+ esac
+ ;;
+ LGPLv2+)
+ case "$license" in
+ LGPLv2+) ;;
+ *) func_warning "module $requested_module depends on a module with an incompatible license: $module" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ fi
+ done
+ modules="$saved_modules"
+ inctests="$saved_inctests"
+
+ # Subdirectory names.
+ sourcebase=gllib
+ m4base=glm4
+ pobase=
+ docbase=gldoc
+ testsbase=gltests
+ macro_prefix=gl
+ po_domain=
+ vc_files=
+
+ # Determine final module list.
+ func_modules_transitive_closure
+ if test $verbose -ge 0; then
+ echo "Module list with included dependencies:"
+ echo "$modules" | sed -e 's/^/ /'
+ fi
+
+ # Add the dummy module if needed.
+ func_modules_add_dummy
+
+ # Show banner notice of every module.
+ func_modules_notice
+
+ # Determine final file list.
+ func_modules_to_filelist
+ if test $verbose -ge 0; then
+ echo "File list:"
+ echo "$files" | sed -e 's/^/ /'
+ fi
+
+ rewritten='%REWRITTEN%'
+ sed_rewrite_files="\
+ s,^build-aux/,$rewritten$auxdir/,
+ s,^doc/,$rewritten$docbase/,
+ s,^lib/,$rewritten$sourcebase/,
+ s,^m4/,$rewritten$m4base/,
+ s,^tests/,$rewritten$testsbase/,
+ s,^top/,$rewritten,
+ s,^$rewritten,,"
+
+ # Create directories.
+ for f in $files; do echo $f; done \
+ | sed -e "$sed_rewrite_files" \
+ | sed -n -e 's,^\(.*\)/[^/]*,\1,p' \
+ | LC_ALL=C sort -u \
+ > "$tmp"/dirs
+ { # Rearrange file descriptors. Needed because "while ... done < ..."
+ # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+ exec 5<&0 < "$tmp"/dirs
+ while read d; do
+ mkdir -p "$testdir/$d"
+ done
+ exec 0<&5 5<&-
+ }
+
+ # Copy files or make symbolic links.
+ delimiter=' '
+ for f in $files; do echo $f; done \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_files" \
+ | LC_ALL=C sort \
+ > "$tmp"/files
+ { # Rearrange file descriptors. Needed because "while ... done < ..."
+ # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+ exec 5<&0 < "$tmp"/files
+ while read g f; do
+ func_lookup_file "$f"
+ if test -n "$lookedup_tmp"; then
+ cp -p "$lookedup_file" "$testdir/$g"
+ else
+ ln "$lookedup_file" "$testdir/$g" 2>/dev/null ||
+ if { test -n "$symbolic" \
+ || { test -n "$lsymbolic" \
+ && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; }; then
+ func_ln "$lookedup_file" "$testdir/$g"
+ else
+ cp -p "$lookedup_file" "$testdir/$g"
+ fi
+ fi
+ done
+ exec 0<&5 5<&-
+ }
+
+ # Create Makefile.ams that are for testing.
+ for_test=true
+
+ # No special edits are needed.
+ makefile_am_edits=0
+
+ # Create $sourcebase/Makefile.am.
+ mkdir -p "$testdir/$sourcebase"
+ destfile="$sourcebase/Makefile.am"
+ func_emit_lib_Makefile_am > "$testdir/$sourcebase/Makefile.am"
+ any_uses_subdirs="$uses_subdirs"
+
+ # Create $m4base/Makefile.am.
+ mkdir -p "$testdir/$m4base"
+ (echo "## Process this file with automake to produce Makefile.in."
+ echo
+ echo "EXTRA_DIST ="
+ for f in $files; do
+ case "$f" in
+ m4/* )
+ echo "EXTRA_DIST += "`echo "$f" | sed -e 's,^m4/,,'` ;;
+ esac
+ done
+ ) > "$testdir/$m4base/Makefile.am"
+
+ subdirs="$sourcebase $m4base"
+ subdirs_with_configure_ac=""
+
+ if false && test -f "$testdir"/$m4base/gettext.m4; then
+ # Avoid stupid error message from automake:
+ # "AM_GNU_GETTEXT used but `po' not in SUBDIRS"
+ mkdir -p "$testdir/po"
+ (echo "## Process this file with automake to produce Makefile.in."
+ ) > "$testdir/po/Makefile.am"
+ func_append subdirs " po"
+ fi
+
+ if test -n "$inctests"; then
+ test -d "$testdir/$testsbase" || mkdir "$testdir/$testsbase"
+ # Viewed from the $testsbase subdirectory, $auxdir is different.
+ saved_auxdir="$auxdir"
+ auxdir=`echo "$testsbase/" | sed -e 's%[^/][^/]*//*%../%g'`"$auxdir"
+ # Create $testsbase/Makefile.am.
+ use_libtests=false
+ destfile="$testsbase/Makefile.am"
+ func_emit_tests_Makefile_am > "$testdir/$testsbase/Makefile.am"
+ any_uses_subdirs="$any_uses_subdirs$uses_subdirs"
+ # Create $testsbase/configure.ac.
+ (echo "# Process this file with autoconf to produce a configure script."
+ echo "AC_INIT([dummy], [0])"
+ echo "AC_CONFIG_AUX_DIR([$auxdir])"
+ echo "AM_INIT_AUTOMAKE"
+ echo
+ echo "AC_CONFIG_HEADERS([config.h])"
+ echo
+ echo "AC_PROG_CC"
+ echo "AC_PROG_INSTALL"
+ echo "AC_PROG_MAKE_SET"
+ echo "AC_PROG_RANLIB"
+ echo
+ if test -n "$uses_subdirs"; then
+ echo "AM_PROG_CC_C_O"
+ echo
+ fi
+ for module in $modules; do
+ func_verify_module
+ if test -n "$module"; then
+ case $module in
+ gnumakefile | maintainer-makefile)
+ # These modules are meant to be used only in the top-level directory.
+ ;;
+ *)
+ func_get_autoconf_early_snippet "$module"
+ ;;
+ esac
+ fi
+ done \
+ | sed -e '/^$/d;' -e 's/AC_REQUIRE(\[\([^()]*\)\])/\1/'
+ if test "$libtool" = true; then
+ echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
+ echo "gl_cond_libtool=true"
+ else
+ echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
+ echo "gl_cond_libtool=false"
+ echo "gl_libdeps="
+ echo "gl_ltlibdeps="
+ fi
+ # Wrap the set of autoconf snippets into an autoconf macro that is then
+ # invoked. This is needed because autoconf does not support AC_REQUIRE
+ # at the top level:
+ # error: AC_REQUIRE(gt_CSHARPCOMP): cannot be used outside of an AC_DEFUN'd macro
+ # but we want the AC_REQUIRE to have its normal meaning (provide one
+ # expansion of the required macro before the current point, and only one
+ # expansion total).
+ echo "AC_DEFUN([gl_INIT], ["
+ sed_replace_build_aux='
+ :a
+ /AC_CONFIG_FILES(.*:build-aux\/.*)/{
+ s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:'"$auxdir"'/\2)|
+ ba
+ }'
+ func_emit_initmacro_start $macro_prefix
+ # We don't have explicit ordering constraints between the various
+ # autoconf snippets. It's cleanest to put those of the library before
+ # those of the tests.
+ echo "gl_source_base='../$sourcebase'"
+ for module in $modules; do
+ func_verify_nontests_module
+ if test -n "$module"; then
+ case $module in
+ gnumakefile | maintainer-makefile)
+ # These modules are meant to be used only in the top-level directory.
+ ;;
+ *)
+ func_get_autoconf_snippet "$module" \
+ | sed -e "$sed_replace_build_aux"
+ ;;
+ esac
+ fi
+ done
+ echo "gl_source_base='.'"
+ for module in $modules; do
+ func_verify_tests_module
+ if test -n "$module"; then
+ func_get_autoconf_snippet "$module" \
+ | sed -e "$sed_replace_build_aux"
+ fi
+ done
+ func_emit_initmacro_end $macro_prefix
+ # _LIBDEPS and _LTLIBDEPS variables are not needed if this library is
+ # created using libtool, because libtool already handles the dependencies.
+ if test "$libtool" != true; then
+ libname_upper=`echo "$libname" | LC_ALL=C tr 'a-z-' 'A-Z_'`
+ echo " ${libname_upper}_LIBDEPS=\"\$gl_libdeps\""
+ echo " AC_SUBST([${libname_upper}_LIBDEPS])"
+ echo " ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
+ echo " AC_SUBST([${libname_upper}_LTLIBDEPS])"
+ fi
+ echo "])"
+ func_emit_initmacro_done $macro_prefix $sourcebase # FIXME use $sourcebase or $testsbase?
+ echo
+ echo "gl_INIT"
+ echo
+ # Usually $testsbase/config.h will be a superset of config.h. Verify this
+ # by "merging" config.h into $testsbase/config.h; look out for gcc warnings.
+ echo "AH_TOP([#include \"../config.h\"])"
+ echo
+ echo "AC_CONFIG_FILES([Makefile])"
+ echo "AC_OUTPUT"
+ ) > "$testdir/$testsbase/configure.ac"
+ auxdir="$saved_auxdir"
+ func_append subdirs " $testsbase"
+ subdirs_with_configure_ac="$subdirs_with_configure_ac $testsbase"
+ fi
+
+ # Create Makefile.am.
+ (echo "## Process this file with automake to produce Makefile.in."
+ echo
+ echo "AUTOMAKE_OPTIONS = 1.5 foreign"
+ echo
+ echo "SUBDIRS = $subdirs"
+ echo
+ echo "ACLOCAL_AMFLAGS = -I $m4base"
+ ) > "$testdir/Makefile.am"
+
+ # Create configure.ac.
+ (echo "# Process this file with autoconf to produce a configure script."
+ echo "AC_INIT([dummy], [0])"
+ if test "$auxdir" != "."; then
+ echo "AC_CONFIG_AUX_DIR([$auxdir])"
+ fi
+ echo "AM_INIT_AUTOMAKE"
+ echo
+ echo "AC_CONFIG_HEADERS([config.h])"
+ echo
+ echo "AC_PROG_CC"
+ echo "AC_PROG_INSTALL"
+ echo "AC_PROG_MAKE_SET"
+ echo
+ echo "# For autobuild."
+ echo "AC_CANONICAL_BUILD"
+ echo "AC_CANONICAL_HOST"
+ echo
+ echo "m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace"
+ echo "m4_pattern_allow([^gl_ES\$])dnl a valid locale name"
+ echo "m4_pattern_allow([^gl_LIBOBJS\$])dnl a variable"
+ echo "m4_pattern_allow([^gl_LTLIBOBJS\$])dnl a variable"
+ echo
+ echo "AC_PROG_RANLIB"
+ echo
+ if test -n "$any_uses_subdirs"; then
+ echo "AM_PROG_CC_C_O"
+ echo
+ fi
+ for module in $modules; do
+ func_verify_nontests_module
+ if test -n "$module"; then
+ func_get_autoconf_early_snippet "$module"
+ fi
+ done \
+ | sed -e '/^$/d;' -e 's/AC_REQUIRE(\[\([^()]*\)\])/\1/'
+ if test "$libtool" = true; then
+ echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [true])"
+ echo "gl_cond_libtool=true"
+ else
+ echo "AM_CONDITIONAL([GL_COND_LIBTOOL], [false])"
+ echo "gl_cond_libtool=false"
+ echo "gl_libdeps="
+ echo "gl_ltlibdeps="
+ fi
+ # Wrap the set of autoconf snippets into an autoconf macro that is then
+ # invoked. This is needed because autoconf does not support AC_REQUIRE
+ # at the top level:
+ # error: AC_REQUIRE(gt_CSHARPCOMP): cannot be used outside of an AC_DEFUN'd macro
+ # but we want the AC_REQUIRE to have its normal meaning (provide one
+ # expansion of the required macro before the current point, and only one
+ # expansion total).
+ echo "AC_DEFUN([gl_INIT], ["
+ if test "$auxdir" != "build-aux"; then
+ sed_replace_build_aux='
+ :a
+ /AC_CONFIG_FILES(.*:build-aux\/.*)/{
+ s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:'"$auxdir"'/\2)|
+ ba
+ }'
+ else
+ sed_replace_build_aux="$sed_noop"
+ fi
+ func_emit_initmacro_start $macro_prefix
+ echo "gl_source_base='$sourcebase'"
+ for module in $modules; do
+ func_verify_nontests_module
+ if test -n "$module"; then
+ func_get_autoconf_snippet "$module" \
+ | sed -e "$sed_replace_build_aux"
+ fi
+ done
+ func_emit_initmacro_end $macro_prefix
+ # _LIBDEPS and _LTLIBDEPS variables are not needed if this library is
+ # created using libtool, because libtool already handles the dependencies.
+ if test "$libtool" != true; then
+ libname_upper=`echo "$libname" | LC_ALL=C tr 'a-z-' 'A-Z_'`
+ echo " ${libname_upper}_LIBDEPS=\"\$gl_libdeps\""
+ echo " AC_SUBST([${libname_upper}_LIBDEPS])"
+ echo " ${libname_upper}_LTLIBDEPS=\"\$gl_ltlibdeps\""
+ echo " AC_SUBST([${libname_upper}_LTLIBDEPS])"
+ fi
+ echo "])"
+ func_emit_initmacro_done $macro_prefix $sourcebase
+ echo
+ echo "gl_INIT"
+ echo
+ if test -n "$subdirs_with_configure_ac"; then
+ echo "AC_CONFIG_SUBDIRS(["`echo $subdirs_with_configure_ac`"])"
+ fi
+ makefiles="Makefile"
+ for d in $subdirs; do
+ # For subdirs that have a configure.ac by their own, it's the subdir's
+ # configure.ac which creates the subdir's Makefile.am, not this one.
+ case " $subdirs_with_configure_ac " in
+ *" $d "*) ;;
+ *) func_append makefiles " $d/Makefile" ;;
+ esac
+ done
+ echo "AC_CONFIG_FILES([$makefiles])"
+ echo "AC_OUTPUT"
+ ) > "$testdir/configure.ac"
+
+ # Create autogenerated files.
+ (cd "$testdir"
+ # Do not use "${AUTORECONF} --force --install", because it may invoke
+ # autopoint, which brings in older versions of some of our .m4 files.
+ if test -f $m4base/gettext.m4; then
+ func_execute_command ${AUTOPOINT} --force || func_exit 1
+ for f in $m4base/*.m4~; do
+ if test -f $f; then
+ mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1
+ fi
+ done
+ fi
+ func_execute_command ${ACLOCAL} -I $m4base || func_exit 1
+ if ! test -d build-aux; then
+ func_execute_command mkdir build-aux || func_exit 1
+ fi
+ func_execute_command ${AUTOCONF} || func_exit 1
+ func_execute_command ${AUTOHEADER} || func_exit 1
+ func_execute_command ${AUTOMAKE} --add-missing --copy || func_exit 1
+ ) || func_exit 1
+ if test -n "$inctests"; then
+ # Create autogenerated files.
+ (cd "$testdir/$testsbase" || func_exit 1
+ # Do not use "${AUTORECONF} --force --install", because it may invoke
+ # autopoint, which brings in older versions of some of our .m4 files.
+ if test -f ../$m4base/gettext.m4; then
+ func_execute_command ${AUTOPOINT} --force || func_exit 1
+ for f in ../$m4base/*.m4~; do
+ if test -f $f; then
+ mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1
+ fi
+ done
+ fi
+ func_execute_command ${ACLOCAL} -I ../$m4base || func_exit 1
+ if ! test -d ../build-aux; then
+ func_execute_command mkdir ../build-aux
+ fi
+ func_execute_command ${AUTOCONF} || func_exit 1
+ func_execute_command ${AUTOHEADER} || func_exit 1
+ func_execute_command ${AUTOMAKE} --add-missing --copy || func_exit 1
+ ) || func_exit 1
+ fi
+ # Need to run configure and make once, to create built files that are to be
+ # distributed (such as getdate.c).
+ # Extract the value of "CLEANFILES += ..." and "MOSTLYCLEANFILES += ...".
+ cleaned_files=`sed -e "$sed_remove_backslash_newline" < "$testdir/$sourcebase/Makefile.am" \
+ | sed -n -e 's,^CLEANFILES[ ]*+=\([^#]*\).*$,\1,p' -e 's,^MOSTLYCLEANFILES[ ]*+=\([^#]*\).*$,\1,p'`
+ cleaned_files=`for file in $cleaned_files; do echo " $file "; done`
+ # Extract the value of "BUILT_SOURCES += ...". Remove variable references
+ # such $(FOO_H) because they don't refer to distributed files.
+ sed_remove_make_variables='s,[$]([A-Za-z0-9_]*),,g'
+ built_sources=`sed -e "$sed_remove_backslash_newline" < "$testdir/$sourcebase/Makefile.am" \
+ | sed -n -e 's,^BUILT_SOURCES[ ]*+=\([^#]*\).*$,\1,p' \
+ | sed -e "$sed_remove_make_variables"`
+ distributed_built_sources=`for file in $built_sources; do
+ case "$cleaned_files" in
+ *" "$file" "*) ;;
+ *) echo $file ;;
+ esac;
+ done`
+ if test -n "$distributed_built_sources"; then
+ (cd "$testdir"
+ ./configure || func_exit 1
+ cd "$sourcebase"
+ echo 'built_sources: $(BUILT_SOURCES)' >> Makefile
+ $MAKE built_sources || func_exit 1
+ cd ..
+ $MAKE distclean || func_exit 1
+ ) || func_exit 1
+ fi
+}
+
+# func_create_megatestdir megatestdir allmodules
+# Input:
+# - local_gnulib_dir from --local-dir
+# - modcache true or false, from --cache-modules/--no-cache-modules
+# - auxdir directory relative to destdir where to place build aux files
+func_create_megatestdir ()
+{
+ megatestdir="$1"
+ allmodules="$2"
+ if test -z "$allmodules"; then
+ allmodules=`func_all_modules`
+ fi
+
+ megasubdirs=
+ # First, all modules one by one.
+ for onemodule in $allmodules; do
+ func_create_testdir "$megatestdir/$onemodule" $onemodule
+ func_append megasubdirs "$onemodule "
+ done
+ # Then, all modules all together.
+ # Except config-h, which breaks all modules which use HAVE_CONFIG_H.
+ allmodules=`for m in $allmodules; do if test $m != config-h; then echo $m; fi; done`
+ func_create_testdir "$megatestdir/ALL" "$allmodules"
+ func_append megasubdirs "ALL"
+
+ # Create autobuild.
+ cvsdate=`if test -f "$gnulib_dir/CVS/Entries"; then \
+ vc_witness="$gnulib_dir/CVS/Entries"; \
+ else \
+ vc_witness="$gnulib_dir/.git/refs/heads/master"; \
+ fi; \
+ sh "$gnulib_dir/build-aux/mdate-sh" "$vc_witness" \
+ | sed -e 's,January,01,' -e 's,Jan,01,' \
+ -e 's,February,02,' -e 's,Feb,02,' \
+ -e 's,March,03,' -e 's,Mar,03,' \
+ -e 's,April,04,' -e 's,Apr,04,' \
+ -e 's,May,05,' \
+ -e 's,June,06,' -e 's,Jun,06,' \
+ -e 's,July,07,' -e 's,Jul,07,' \
+ -e 's,August,08,' -e 's,Aug,08,' \
+ -e 's,September,09,' -e 's,Sep,09,' \
+ -e 's,October,10,' -e 's,Oct,10,' \
+ -e 's,November,11,' -e 's,Nov,11,' \
+ -e 's,December,12,' -e 's,Dec,12,' \
+ -e 's,^,00,' -e 's,^[0-9]*\([0-9][0-9] \),\1,' \
+ -e 's,^\([0-9]*\) \([0-9]*\) \([0-9]*\),\3\2\1,'`
+ (echo '#!/bin/sh'
+ echo "CVSDATE=$cvsdate"
+ echo ": \${MAKE=make}"
+ echo "test -d logs || mkdir logs"
+ echo "for module in $megasubdirs; do"
+ echo " echo \"Working on module \$module...\""
+ echo " safemodule=\`echo \$module | sed -e 's|/|-|g'\`"
+ echo " (echo \"To: gnulib@autobuild.josefsson.org\""
+ echo " echo"
+ echo " set -x"
+ echo " : autobuild project... \$module"
+ echo " : autobuild revision... cvs-\$CVSDATE-000000"
+ echo " : autobuild timestamp... \`date \"+%Y%m%d-%H%M%S\"\`"
+ echo " : autobuild hostname... \`hostname\`"
+ echo " cd \$module && ./configure \$CONFIGURE_OPTIONS && \$MAKE && \$MAKE check && \$MAKE distclean"
+ echo " echo rc=\$?"
+ echo " ) 2>&1 | { if test -n \"\$AUTOBUILD_SUBST\"; then sed -e \"\$AUTOBUILD_SUBST\"; else cat; fi; } > logs/\$safemodule"
+ echo "done"
+ ) > "$megatestdir/do-autobuild"
+ chmod a+x "$megatestdir/do-autobuild"
+
+ # Create Makefile.am.
+ (echo "## Process this file with automake to produce Makefile.in."
+ echo
+ echo "AUTOMAKE_OPTIONS = 1.5 foreign"
+ echo
+ echo "SUBDIRS = $megasubdirs"
+ echo
+ echo "EXTRA_DIST = do-autobuild"
+ ) > "$megatestdir/Makefile.am"
+
+ # Create configure.ac.
+ (echo "# Process this file with autoconf to produce a configure script."
+ echo "AC_INIT([dummy], [0])"
+ if test "$auxdir" != "."; then
+ echo "AC_CONFIG_AUX_DIR([$auxdir])"
+ fi
+ echo "AM_INIT_AUTOMAKE"
+ echo
+ echo "AC_PROG_MAKE_SET"
+ echo
+ echo "AC_CONFIG_SUBDIRS([$megasubdirs])"
+ echo "AC_CONFIG_FILES([Makefile])"
+ echo "AC_OUTPUT"
+ ) > "$megatestdir/configure.ac"
+
+ # Create autogenerated files.
+ (cd "$megatestdir"
+ # Do not use "${AUTORECONF} --install", because autoreconf operates
+ # recursively, but the subdirectories are already finished, therefore
+ # calling autoreconf here would only waste lots of CPU time.
+ func_execute_command ${ACLOCAL} || func_exit 1
+ func_execute_command mkdir build-aux
+ func_execute_command ${AUTOCONF} || func_exit 1
+ func_execute_command ${AUTOMAKE} --add-missing --copy || func_exit 1
+ ) || func_exit 1
+}
+
+case $mode in
+ "" )
+ func_fatal_error "no mode specified" ;;
+
+ list )
+ func_all_modules
+ ;;
+
+ find )
+ # sed expression that converts a literal to a basic regular expression.
+ # Needs to handle . [ \ * ^ $.
+ sed_literal_to_basic_regex='s/\\/\\\\/g
+s/\[/\\[/g
+s/\^/\\^/g
+s/\([.*$]\)/[\1]/g'
+ for filename
+ do
+ if test -f "$gnulib_dir/$filename" \
+ || { test -n "$local_gnulib_dir" && test -f "$local_gnulib_dir/$filename"; }; then
+ filename_anywhere_regex=`echo "$filename" | sed -e "$sed_literal_to_basic_regex"`
+ filename_line_regex='^'"$filename_anywhere_regex"'$'
+ module_candidates=`
+ {
+ (cd "$gnulib_dir" && find modules -type f -print | xargs -n 100 grep -l "$filename_line_regex" /dev/null | sed -e 's,^modules/,,')
+ if test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules"; then
+ (cd "$local_gnulib_dir" && find modules -type f -print | xargs -n 100 grep -l "$filename_anywhere_regex" /dev/null | sed -e 's,^modules/,,' -e 's,\.diff$,,')
+ fi
+ } \
+ | func_sanitize_modulelist \
+ | LC_ALL=C sort -u
+ `
+ for module in $module_candidates; do
+ if func_get_filelist $module | grep "$filename_line_regex" > /dev/null; then
+ echo $module
+ fi
+ done
+ else
+ func_warning "file $filename does not exist"
+ fi
+ done
+ ;;
+
+ import | update )
+
+ # Where to import.
+ if test -z "$destdir"; then
+ destdir=.
+ fi
+ test -d "$destdir" \
+ || func_fatal_error "destination directory does not exist: $destdir"
+
+ # Prefer configure.ac to configure.in.
+ if test -f "$destdir"/configure.ac; then
+ configure_ac="$destdir/configure.ac"
+ else
+ if test -f "$destdir"/configure.in; then
+ configure_ac="$destdir/configure.in"
+ else
+ func_fatal_error "cannot find $destdir/configure.ac - make sure you run gnulib-tool from within your package's directory"
+ fi
+ fi
+
+ # Analyze configure.ac.
+ guessed_auxdir="."
+ guessed_libtool=false
+ my_sed_traces='
+ s,#.*$,,
+ s,^dnl .*$,,
+ s, dnl .*$,,
+ /AC_CONFIG_AUX_DIR/ {
+ s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^]"$`\\)]*\).*$,guessed_auxdir="\1",p
+ }
+ /A[CM]_PROG_LIBTOOL/ {
+ s,^.*$,guessed_libtool=true,p
+ }'
+ eval `sed -n -e "$my_sed_traces" < "$configure_ac"`
+
+ if test -z "$auxdir"; then
+ auxdir="$guessed_auxdir"
+ fi
+
+ # Determine where to apply func_import.
+ if test -n "$m4base"; then
+ # Apply func_import to a particular gnulib directory.
+ # Any number of additional modules can be given.
+ if test ! -f "$destdir/$m4base"/gnulib-cache.m4; then
+ # First use of gnulib in the given m4base.
+ test -n "$supplied_libname" || supplied_libname=true
+ test -n "$sourcebase" || sourcebase="lib"
+ test -n "$docbase" || docbase="doc"
+ test -n "$testsbase" || testsbase="tests"
+ test -n "$macro_prefix" || macro_prefix="gl"
+ fi
+ func_import "$*"
+ else
+ # Apply func_import to all gnulib directories.
+ # To get this list of directories, look at Makefile.am. (Not at
+ # configure, because it may be omitted from CVS. Also, don't run
+ # "find $destdir -name gnulib-cache.m4", as it might be too expensive.)
+ m4dirs=
+ m4dirs_count=0
+ if test -f "$destdir"/Makefile.am; then
+ aclocal_amflags=`sed -n -e 's/^ACLOCAL_AMFLAGS[ ]*=\(.*\)$/\1/p' "$destdir"/Makefile.am`
+ m4dir_is_next=
+ for arg in $aclocal_amflags; do
+ if test -n "$m4dir_is_next"; then
+ # Ignore absolute directory pathnames, like /usr/local/share/aclocal.
+ case "$arg" in
+ /*) ;;
+ *)
+ if test -f "$destdir/$arg"/gnulib-cache.m4; then
+ func_append m4dirs " $arg"
+ m4dirs_count=`expr $m4dirs_count + 1`
+ fi
+ ;;
+ esac
+ m4dir_is_next=
+ else
+ if test "X$arg" = "X-I"; then
+ m4dir_is_next=yes
+ else
+ m4dir_is_next=
+ fi
+ fi
+ done
+ else
+ # No Makefile.am! Oh well. Look at the last generated aclocal.m4.
+ if test -f "$destdir"/aclocal.m4; then
+ sedexpr1='s,^m4_include(\[\(.*\)])$,\1,p'
+ sedexpr2='s,^[^/]*$,.,'
+ sedexpr3='s,/[^/]*$,,'
+ m4dirs=`sed -n -e "$sedexpr1" aclocal.m4 | sed -e "$sedexpr2" -e "$sedexpr3" | LC_ALL=C sort -u`
+ m4dirs_count=`printf %s "$m4dirs" | wc -l`
+ fi
+ fi
+ if test $m4dirs_count = 0; then
+ # First use of gnulib in a package.
+ # Any number of additional modules can be given.
+ test -n "$supplied_libname" || supplied_libname=true
+ test -n "$sourcebase" || sourcebase="lib"
+ m4base="m4"
+ test -n "$docbase" || docbase="doc"
+ test -n "$testsbase" || testsbase="tests"
+ test -n "$macro_prefix" || macro_prefix="gl"
+ func_import "$*"
+ else
+ if test $m4dirs_count = 1; then
+ # There's only one use of gnulib here. Assume the user means it.
+ # Any number of additional modules can be given.
+ for m4base in $m4dirs; do
+ func_import "$*"
+ done
+ else
+ # Ambiguous - guess what the user meant.
+ if test $# = 0; then
+ # No further arguments. Guess the user wants to update all of them.
+ for m4base in $m4dirs; do
+ # Perform func_import in a subshell, so that variable values
+ # such as
+ # local_gnulib_dir, incobsolete, avoidlist, sourcebase, m4base,
+ # pobase, docbase, testsbase, inctests, libname, lgpl,
+ # makefile_name, libtool, macro_prefix, po_domain, vc_files
+ # don't propagate from one directory to another.
+ (func_import) || func_exit 1
+ done
+ else
+ # Really ambiguous.
+ func_fatal_error "Ambiguity: to which directory should the modules be added? Please specify at least --m4-base=..."
+ fi
+ fi
+ fi
+ fi
+ ;;
+
+ create-testdir )
+ if test -z "$destdir"; then
+ func_fatal_error "please specify --dir option"
+ fi
+ mkdir "$destdir"
+ test -d "$destdir" \
+ || func_fatal_error "could not create destination directory"
+ test -n "$auxdir" || auxdir="build-aux"
+ func_create_testdir "$destdir" "$*"
+ ;;
+
+ create-megatestdir )
+ if test -z "$destdir"; then
+ func_fatal_error "please specify --dir option"
+ fi
+ mkdir "$destdir" || func_fatal_error "could not create destination directory"
+ test -n "$auxdir" || auxdir="build-aux"
+ func_create_megatestdir "$destdir" "$*"
+ ;;
+
+ test )
+ test -n "$destdir" || destdir=testdir$$
+ mkdir "$destdir" || func_fatal_error "could not create destination directory"
+ test -n "$auxdir" || auxdir="build-aux"
+ func_create_testdir "$destdir" "$*"
+ cd "$destdir"
+ mkdir build
+ cd build
+ ../configure || func_exit 1
+ $MAKE || func_exit 1
+ $MAKE check || func_exit 1
+ $MAKE distclean || func_exit 1
+ remaining=`find . -type f -print`
+ if test -n "$remaining"; then
+ echo "Remaining files:" $remaining 1>&2
+ echo "gnulib-tool: *** Stop." 1>&2
+ func_exit 1
+ fi
+ cd ..
+ cd ..
+ rm -rf "$destdir"
+ ;;
+
+ megatest )
+ test -n "$destdir" || destdir=testdir$$
+ mkdir "$destdir" || func_fatal_error "could not create destination directory"
+ test -n "$auxdir" || auxdir="build-aux"
+ func_create_megatestdir "$destdir" "$*"
+ cd "$destdir"
+ mkdir build
+ cd build
+ ../configure
+ $MAKE
+ $MAKE check
+ $MAKE distclean
+ remaining=`find . -type f -print`
+ if test -n "$remaining"; then
+ echo "Remaining files:" $remaining 1>&2
+ echo "gnulib-tool: *** Stop." 1>&2
+ func_exit 1
+ fi
+ cd ..
+ cd ..
+ rm -rf "$destdir"
+ ;;
+
+ extract-description )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_description "$module"
+ fi
+ done
+ ;;
+
+ extract-status )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_status "$module"
+ fi
+ done
+ ;;
+
+ extract-notice )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_notice "$module"
+ fi
+ done
+ ;;
+
+ extract-applicability )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_applicability "$module"
+ fi
+ done
+ ;;
+
+ extract-filelist )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_filelist "$module"
+ fi
+ done
+ ;;
+
+ extract-dependencies )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_dependencies "$module"
+ fi
+ done
+ ;;
+
+ extract-autoconf-snippet )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_autoconf_snippet "$module"
+ fi
+ done
+ ;;
+
+ extract-automake-snippet )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_automake_snippet "$module"
+ fi
+ done
+ ;;
+
+ extract-include-directive )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_include_directive "$module"
+ fi
+ done
+ ;;
+
+ extract-link-directive )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_link_directive "$module"
+ fi
+ done
+ ;;
+
+ extract-license )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_license "$module"
+ fi
+ done
+ ;;
+
+ extract-maintainer )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_maintainer "$module"
+ fi
+ done
+ ;;
+
+ extract-tests-module )
+ for module
+ do
+ func_verify_module
+ if test -n "$module"; then
+ func_get_tests_module "$module"
+ fi
+ done
+ ;;
+
+ copy-file )
+ # Verify the number of arguments.
+ if test $# -lt 1 || test $# -gt 2; then
+ func_fatal_error "invalid number of arguments for --$mode"
+ fi
+
+ # The first argument is the file to be copied.
+ f="$1"
+ # Verify the file exists.
+ func_lookup_file "$f"
+
+ # The second argument is the destination; either a directory ot a file.
+ # It defaults to the current directory.
+ dest="$2"
+ test -n "$dest" || dest='.'
+ test -n "$sourcebase" || sourcebase="lib"
+ test -n "$m4base" || m4base="m4"
+ test -n "$docbase" || docbase="doc"
+ test -n "$testsbase" || testsbase="tests"
+ test -n "$auxdir" || auxdir="build-aux"
+ rewritten='%REWRITTEN%'
+ sed_rewrite_files="\
+ s,^build-aux/,$rewritten$auxdir/,
+ s,^doc/,$rewritten$docbase/,
+ s,^lib/,$rewritten$sourcebase/,
+ s,^m4/,$rewritten$m4base/,
+ s,^tests/,$rewritten$testsbase/,
+ s,^top/,$rewritten,
+ s,^$rewritten,,"
+ if test -d "$dest"; then
+ destdir="$dest"
+ g=`echo "$f" | sed -e "$sed_rewrite_files"`
+ else
+ destdir=`dirname "$dest"`
+ g=`basename "$dest"`
+ fi
+
+ # Create the directory for destfile.
+ d=`dirname "$destdir/$g"`
+ if $doit; then
+ if test -n "$d" && test ! -d "$d"; then
+ mkdir -p "$d" || func_fatal_error "failed"
+ fi
+ fi
+ # Copy the file.
+ func_dest_tmpfilename "$g"
+ cp "$lookedup_file" "$tmpfile" || func_fatal_error "failed"
+ already_present=true
+ if test -f "$destdir/$g"; then
+ # The file already exists.
+ func_update_file
+ else
+ # Install the file.
+ # Don't protest if the file should be there but isn't: it happens
+ # frequently that developers don't put autogenerated files into CVS.
+ func_add_file
+ fi
+ rm -f "$tmpfile"
+ ;;
+
+ * )
+ func_fatal_error "unknown operation mode --$mode" ;;
+esac
+
+rm -rf "$tmp"
+# Undo the effect of the previous 'trap' command. Some shellology:
+# We cannot use "trap - 0 1 2 3 13 15", because Solaris sh would attempt to
+# execute the command "-". "trap '' ..." is fine only for signal 0 (= normal
+# exit); for the others we need to call 'exit' explicitly. The value of $? is
+# 128 + signal number and is set before the trap-registered command is run.
+trap '' 0
+trap 'func_exit $?' 1 2 3 13 15
+
+exit 0
+
+# Local Variables:
+# indent-tabs-mode: nil
+# whitespace-check-buffer-indent: nil
+# End:
diff --git a/gnulib/lib/.cppi-disable b/gnulib/lib/.cppi-disable
new file mode 100644
index 00000000..29c43f92
--- /dev/null
+++ b/gnulib/lib/.cppi-disable
@@ -0,0 +1,41 @@
+alloca.in.h
+error.h
+exit.h
+fnmatch.in.h
+fts.c
+fts_.h
+getaddrinfo.h
+getdelim.h
+getline.h
+getndelim2.h
+getopt.c
+getopt.h
+getopt1.c
+getopt.in.h
+getopt_int.h
+getpagesize.h
+getpass.c
+gettext.h
+localcharset.h
+malloca.h
+mbchar.h
+mbuiter.h
+md5.h
+obstack.h
+printf-args.h
+printf-parse.h
+regcomp.c
+regex.c
+regex.h
+regex_internal.c
+regex_internal.h
+stat-time.h
+stdbool.in.h
+stdint.in.h
+strnlen1.h
+strtoul.c
+sys_socket.in.h
+time_r.h
+utimecmp.h
+vasnprintf.h
+vasprintf.h
diff --git a/gnulib/lib/.cvsignore b/gnulib/lib/.cvsignore
new file mode 100644
index 00000000..f2e60079
--- /dev/null
+++ b/gnulib/lib/.cvsignore
@@ -0,0 +1,20 @@
+.deps
+Makefile
+alloca.h
+charset.alias
+fnmatch.h
+fts.h
+getdate.c
+getdate.tab.c
+getopt.h
+lstat.c
+poll.h
+ref-add.sed
+ref-del.sed
+search.h
+stat.c
+stdbool.h
+stdint.h
+sysexit.h
+t-fpending
+unlocked-io.h
diff --git a/gnulib/lib/README b/gnulib/lib/README
new file mode 100644
index 00000000..100b99d8
--- /dev/null
+++ b/gnulib/lib/README
@@ -0,0 +1,3 @@
+The files in this directory are used in many GNU packages,
+including coreutils, diffutils, and tar.
+The autoconf tests required for these files are in ../m4.
diff --git a/gnulib/lib/accept.c b/gnulib/lib/accept.c
new file mode 100644
index 00000000..8a3079f5
--- /dev/null
+++ b/gnulib/lib/accept.c
@@ -0,0 +1,42 @@
+/* accept.c --- wrappers for Windows accept function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef accept
+
+int
+rpl_accept (int fd, struct sockaddr *addr, int *addrlen)
+{
+ SOCKET fh = accept (FD_TO_SOCKET (fd), addr, addrlen);
+ if (fh == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ return SOCKET_TO_FD (fh);
+}
diff --git a/gnulib/lib/accept4.c b/gnulib/lib/accept4.c
new file mode 100644
index 00000000..9e89d2a3
--- /dev/null
+++ b/gnulib/lib/accept4.c
@@ -0,0 +1,128 @@
+/* Accept a connection on a socket, with specific opening flags.
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/socket.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include "binary-io.h"
+
+#ifndef SOCK_CLOEXEC
+# define SOCK_CLOEXEC 0
+#endif
+
+int
+accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)
+{
+ int fd;
+
+#if HAVE_ACCEPT4
+# undef accept4
+ /* Try the system call first, if it exists. (We may be running with a glibc
+ that has the function but with an older kernel that lacks it.) */
+ {
+ /* Cache the information whether the system call really exists. */
+ static int have_accept4_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_accept4_really >= 0)
+ {
+ int result = accept4 (sockfd, addr, addrlen, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_accept4_really = 1;
+ return result;
+ }
+ have_accept4_really = -1;
+ }
+ }
+#endif
+
+ /* Check the supported flags. */
+ if ((flags & ~(SOCK_CLOEXEC | O_TEXT | O_BINARY)) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ fd = accept (sockfd, addr, addrlen);
+ if (fd < 0)
+ return -1;
+
+#if SOCK_CLOEXEC
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+ if (flags & SOCK_CLOEXEC)
+ {
+ HANDLE curr_process = GetCurrentProcess ();
+ HANDLE old_handle = (HANDLE) _get_osfhandle (fd);
+ HANDLE new_handle;
+ int nfd;
+
+ if (!DuplicateHandle (curr_process, /* SourceProcessHandle */
+ old_handle, /* SourceHandle */
+ curr_process, /* TargetProcessHandle */
+ (PHANDLE) &new_handle, /* TargetHandle */
+ (DWORD) 0, /* DesiredAccess */
+ FALSE, /* InheritHandle */
+ DUPLICATE_SAME_ACCESS)) /* Options */
+ {
+ close (fd);
+ errno = EBADF; /* arbitrary */
+ return -1;
+ }
+
+ /* Closing fd before allocating the new fd ensures that the new fd will
+ have the minimum possible value. */
+ close (fd);
+ nfd = _open_osfhandle ((long) new_handle,
+ O_NOINHERIT | (flags & (O_TEXT | O_BINARY)));
+ if (nfd < 0)
+ {
+ CloseHandle (new_handle);
+ return -1;
+ }
+ return nfd;
+ }
+# else
+/* Unix API. */
+ if (flags & SOCK_CLOEXEC)
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd, F_GETFD, 0)) < 0
+ || fcntl (fd, F_SETFD, fcntl_flags | FD_CLOEXEC) == -1)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+# endif
+#endif
+
+#if O_BINARY
+ if (flags & O_BINARY)
+ setmode (fd, O_BINARY);
+ else if (flags & O_TEXT)
+ setmode (fd, O_TEXT);
+#endif
+
+ return fd;
+}
diff --git a/gnulib/lib/acl-internal.h b/gnulib/lib/acl-internal.h
new file mode 100644
index 00000000..676e57ab
--- /dev/null
+++ b/gnulib/lib/acl-internal.h
@@ -0,0 +1,220 @@
+/* Internal implementation of access control lists.
+
+ Copyright (C) 2002-2003, 2005-2010 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/>.
+
+ Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
+
+#include "acl.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+/* All systems define the ACL related API in <sys/acl.h>. */
+#if HAVE_SYS_ACL_H
+# include <sys/acl.h>
+#endif
+#if defined HAVE_ACL && ! defined GETACLCNT && defined ACL_CNT
+# define GETACLCNT ACL_CNT
+#endif
+
+/* On Linux, additional ACL related API is available in <acl/libacl.h>. */
+#ifdef HAVE_ACL_LIBACL_H
+# include <acl/libacl.h>
+#endif
+
+#include "error.h"
+#include "quote.h"
+
+#include <errno.h>
+#ifndef ENOSYS
+# define ENOSYS (-1)
+#endif
+#ifndef ENOTSUP
+# define ENOTSUP (-1)
+#endif
+
+#ifndef HAVE_FCHMOD
+# define HAVE_FCHMOD false
+# define fchmod(fd, mode) (-1)
+#endif
+
+
+#if USE_ACL
+
+# if HAVE_ACL_GET_FILE
+/* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
+/* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+
+# ifndef MIN_ACL_ENTRIES
+# define MIN_ACL_ENTRIES 4
+# endif
+
+/* POSIX 1003.1e (draft 17) */
+# ifdef HAVE_ACL_GET_FD
+/* Most platforms have a 1-argument acl_get_fd, only OSF/1 has a 2-argument
+ macro(!). */
+# if HAVE_ACL_FREE_TEXT /* OSF/1 */
+static inline acl_t
+rpl_acl_get_fd (int fd)
+{
+ return acl_get_fd (fd, ACL_TYPE_ACCESS);
+}
+# undef acl_get_fd
+# define acl_get_fd rpl_acl_get_fd
+# endif
+# else
+# define HAVE_ACL_GET_FD false
+# undef acl_get_fd
+# define acl_get_fd(fd) (NULL)
+# endif
+
+/* POSIX 1003.1e (draft 17) */
+# ifdef HAVE_ACL_SET_FD
+/* Most platforms have a 2-argument acl_set_fd, only OSF/1 has a 3-argument
+ macro(!). */
+# if HAVE_ACL_FREE_TEXT /* OSF/1 */
+static inline int
+rpl_acl_set_fd (int fd, acl_t acl)
+{
+ return acl_set_fd (fd, ACL_TYPE_ACCESS, acl);
+}
+# undef acl_set_fd
+# define acl_set_fd rpl_acl_set_fd
+# endif
+# else
+# define HAVE_ACL_SET_FD false
+# undef acl_set_fd
+# define acl_set_fd(fd, acl) (-1)
+# endif
+
+/* POSIX 1003.1e (draft 13) */
+# if ! HAVE_ACL_FREE_TEXT
+# define acl_free_text(buf) acl_free (buf)
+# endif
+
+/* Linux-specific */
+# ifndef HAVE_ACL_EXTENDED_FILE
+# define HAVE_ACL_EXTENDED_FILE false
+# define acl_extended_file(name) (-1)
+# endif
+
+/* Linux-specific */
+# ifndef HAVE_ACL_FROM_MODE
+# define HAVE_ACL_FROM_MODE false
+# define acl_from_mode(mode) (NULL)
+# endif
+
+/* Set to 1 if a file's mode is implicit by the ACL.
+ Set to 0 if a file's mode is stored independently from the ACL. */
+# if HAVE_ACL_COPY_EXT_NATIVE && HAVE_ACL_CREATE_ENTRY_NP /* MacOS X */
+# define MODE_INSIDE_ACL 0
+# else
+# define MODE_INSIDE_ACL 1
+# endif
+
+# if defined __APPLE__ && defined __MACH__ /* MacOS X */
+# define ACL_NOT_WELL_SUPPORTED(Err) \
+ ((Err) == ENOTSUP || (Err) == ENOSYS || (Err) == EINVAL || (Err) == EBUSY || (Err) == ENOENT)
+# elif defined EOPNOTSUPP /* Tru64 NFS */
+# define ACL_NOT_WELL_SUPPORTED(Err) \
+ ((Err) == ENOTSUP || (Err) == ENOSYS || (Err) == EINVAL || (Err) == EBUSY || (Err) == EOPNOTSUPP)
+# else
+# define ACL_NOT_WELL_SUPPORTED(Err) \
+ ((Err) == ENOTSUP || (Err) == ENOSYS || (Err) == EINVAL || (Err) == EBUSY)
+# endif
+
+/* Return the number of entries in ACL.
+ Return -1 and set errno upon failure to determine it. */
+/* Define a replacement for acl_entries if needed. (Only Linux has it.) */
+# if !HAVE_ACL_ENTRIES
+# define acl_entries rpl_acl_entries
+extern int acl_entries (acl_t);
+# endif
+
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+/* ACL is an ACL, from a file, stored as type ACL_TYPE_EXTENDED.
+ Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial. */
+extern int acl_extended_nontrivial (acl_t);
+# else
+/* ACL is an ACL, from a file, stored as type ACL_TYPE_ACCESS.
+ Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode.
+ Return -1 and set errno upon failure to determine it. */
+extern int acl_access_nontrivial (acl_t);
+# endif
+
+# elif HAVE_ACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
+
+/* Set to 1 if a file's mode is implicit by the ACL.
+ Set to 0 if a file's mode is stored independently from the ACL. */
+# if defined __CYGWIN__ /* Cygwin */
+# define MODE_INSIDE_ACL 0
+# else /* Solaris */
+# define MODE_INSIDE_ACL 1
+# endif
+
+# if !defined ACL_NO_TRIVIAL /* Solaris <= 10, Cygwin */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_nontrivial (int count, aclent_t *entries);
+
+# ifdef ACE_GETACL /* Solaris 10 */
+
+/* Test an ACL retrieved with ACE_GETACL.
+ Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_ace_nontrivial (int count, ace_t *entries);
+
+/* Definitions for when the built executable is executed on Solaris 10
+ (newer version) or Solaris 11. */
+/* For a_type. */
+# define ACE_ACCESS_ALLOWED_ACE_TYPE 0 /* replaces ALLOW */
+# define ACE_ACCESS_DENIED_ACE_TYPE 1 /* replaces DENY */
+/* For a_flags. */
+# define NEW_ACE_OWNER 0x1000
+# define NEW_ACE_GROUP 0x2000
+# define NEW_ACE_IDENTIFIER_GROUP 0x0040
+# define ACE_EVERYONE 0x4000
+/* For a_access_mask. */
+# define NEW_ACE_READ_DATA 0x001 /* corresponds to 'r' */
+# define NEW_ACE_WRITE_DATA 0x002 /* corresponds to 'w' */
+# define NEW_ACE_EXECUTE 0x004 /* corresponds to 'x' */
+
+# endif
+
+# endif
+
+# elif HAVE_GETACL /* HP-UX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb);
+
+# elif HAVE_ACLX_GET && 0 /* AIX */
+
+/* TODO */
+
+# elif HAVE_STATACL /* older AIX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_nontrivial (struct acl *a);
+
+# endif
+
+#endif
diff --git a/gnulib/lib/acl.h b/gnulib/lib/acl.h
new file mode 100644
index 00000000..f0d9e83a
--- /dev/null
+++ b/gnulib/lib/acl.h
@@ -0,0 +1,27 @@
+/* acl.c - access control lists
+
+ Copyright (C) 2002, 2008-2010 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/>.
+
+ Written by Paul Eggert. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int file_has_acl (char const *, struct stat const *);
+int copy_acl (char const *, int, char const *, int, mode_t);
+int set_acl (char const *, int, mode_t);
+int qset_acl (char const *, int, mode_t);
+int chmod_or_fchmod (char const *, int, mode_t);
diff --git a/gnulib/lib/acl_entries.c b/gnulib/lib/acl_entries.c
new file mode 100644
index 00000000..baf3aab3
--- /dev/null
+++ b/gnulib/lib/acl_entries.c
@@ -0,0 +1,75 @@
+/* Return the number of entries in an ACL.
+
+ Copyright (C) 2002-2003, 2005-2010 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/>.
+
+ Written by Paul Eggert and Andreas Gruenbacher. */
+
+#include <config.h>
+
+#include "acl-internal.h"
+
+/* This file assumes POSIX-draft like ACLs
+ (Linux, FreeBSD, MacOS X, IRIX, Tru64). */
+
+/* Return the number of entries in ACL.
+ Return -1 and set errno upon failure to determine it. */
+
+int
+acl_entries (acl_t acl)
+{
+ int count = 0;
+
+ if (acl != NULL)
+ {
+#if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD, MacOS X */
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+ /* acl_get_entry returns 0 when it successfully fetches an entry,
+ and -1/EINVAL at the end. */
+ acl_entry_t ace;
+ int got_one;
+
+ for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
+ got_one >= 0;
+ got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
+ count++;
+# else /* Linux, FreeBSD */
+ /* acl_get_entry returns 1 when it successfully fetches an entry,
+ and 0 at the end. */
+ acl_entry_t ace;
+ int got_one;
+
+ for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
+ got_one > 0;
+ got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
+ count++;
+ if (got_one < 0)
+ return -1;
+# endif
+#else /* IRIX, Tru64 */
+# if HAVE_ACL_TO_SHORT_TEXT /* IRIX */
+ /* Don't use acl_get_entry: it is undocumented. */
+ count = acl->acl_cnt;
+# endif
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+ /* Don't use acl_get_entry: it takes only one argument and does not
+ work. */
+ count = acl->acl_num;
+# endif
+#endif
+ }
+
+ return count;
+}
diff --git a/gnulib/lib/acosl.c b/gnulib/lib/acosl.c
new file mode 100644
index 00000000..109104ac
--- /dev/null
+++ b/gnulib/lib/acosl.c
@@ -0,0 +1,226 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+/*
+ Long double expansions contributed by
+ Stephen L. Moshier <moshier@na-net.ornl.gov>
+*/
+
+/* asin(x)
+ * Method :
+ * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
+ * we approximate asin(x) on [0,0.5] by
+ * asin(x) = x + x*x^2*R(x^2)
+ * Between .5 and .625 the approximation is
+ * asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
+ * For x in [0.625,1]
+ * asin(x) = pi/2-2*asin(sqrt((1-x)/2))
+ *
+ * Special cases:
+ * if x is NaN, return x itself;
+ * if |x|>1, return NaN with invalid signal.
+ *
+ */
+
+
+static const long double
+ one = 1.0L,
+ huge = 1.0e+4932L,
+ pi = 3.1415926535897932384626433832795028841972L,
+ pio2_hi = 1.5707963267948966192313216916397514420986L,
+ pio2_lo = 4.3359050650618905123985220130216759843812E-35L,
+ pio4_hi = 7.8539816339744830961566084581987569936977E-1L,
+
+ /* coefficient for R(x^2) */
+
+ /* asin(x) = x + x^3 pS(x^2) / qS(x^2)
+ 0 <= x <= 0.5
+ peak relative error 1.9e-35 */
+ pS0 = -8.358099012470680544198472400254596543711E2L,
+ pS1 = 3.674973957689619490312782828051860366493E3L,
+ pS2 = -6.730729094812979665807581609853656623219E3L,
+ pS3 = 6.643843795209060298375552684423454077633E3L,
+ pS4 = -3.817341990928606692235481812252049415993E3L,
+ pS5 = 1.284635388402653715636722822195716476156E3L,
+ pS6 = -2.410736125231549204856567737329112037867E2L,
+ pS7 = 2.219191969382402856557594215833622156220E1L,
+ pS8 = -7.249056260830627156600112195061001036533E-1L,
+ pS9 = 1.055923570937755300061509030361395604448E-3L,
+
+ qS0 = -5.014859407482408326519083440151745519205E3L,
+ qS1 = 2.430653047950480068881028451580393430537E4L,
+ qS2 = -4.997904737193653607449250593976069726962E4L,
+ qS3 = 5.675712336110456923807959930107347511086E4L,
+ qS4 = -3.881523118339661268482937768522572588022E4L,
+ qS5 = 1.634202194895541569749717032234510811216E4L,
+ qS6 = -4.151452662440709301601820849901296953752E3L,
+ qS7 = 5.956050864057192019085175976175695342168E2L,
+ qS8 = -4.175375777334867025769346564600396877176E1L,
+ /* 1.000000000000000000000000000000000000000E0 */
+
+ /* asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
+ -0.0625 <= x <= 0.0625
+ peak relative error 3.3e-35 */
+ rS0 = -5.619049346208901520945464704848780243887E0L,
+ rS1 = 4.460504162777731472539175700169871920352E1L,
+ rS2 = -1.317669505315409261479577040530751477488E2L,
+ rS3 = 1.626532582423661989632442410808596009227E2L,
+ rS4 = -3.144806644195158614904369445440583873264E1L,
+ rS5 = -9.806674443470740708765165604769099559553E1L,
+ rS6 = 5.708468492052010816555762842394927806920E1L,
+ rS7 = 1.396540499232262112248553357962639431922E1L,
+ rS8 = -1.126243289311910363001762058295832610344E1L,
+ rS9 = -4.956179821329901954211277873774472383512E-1L,
+ rS10 = 3.313227657082367169241333738391762525780E-1L,
+
+ sS0 = -4.645814742084009935700221277307007679325E0L,
+ sS1 = 3.879074822457694323970438316317961918430E1L,
+ sS2 = -1.221986588013474694623973554726201001066E2L,
+ sS3 = 1.658821150347718105012079876756201905822E2L,
+ sS4 = -4.804379630977558197953176474426239748977E1L,
+ sS5 = -1.004296417397316948114344573811562952793E2L,
+ sS6 = 7.530281592861320234941101403870010111138E1L,
+ sS7 = 1.270735595411673647119592092304357226607E1L,
+ sS8 = -1.815144839646376500705105967064792930282E1L,
+ sS9 = -7.821597334910963922204235247786840828217E-2L,
+ /* 1.000000000000000000000000000000000000000E0 */
+
+ asinr5625 = 5.9740641664535021430381036628424864397707E-1L;
+
+
+long double
+acosl (long double x)
+{
+ long double t, p, q;
+
+ if (x < 0.0L)
+ {
+ t = pi - acosl(-x);
+ if (huge + x > one) /* return with inexact */
+ return t;
+ }
+
+ if (x >= 1.0L) /* |x|>= 1 */
+ {
+ if (x == 1.0L)
+ return 0.0L; /* return zero */
+
+ return (x - x) / (x - x); /* asin(|x|>1) is NaN */
+ }
+
+ else if (x < 0.5L) /* |x| < 0.5 */
+ {
+ if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2**-57 */
+ /* acos(0)=+-pi/2 with inexact */
+ return x * pio2_hi + x * pio2_lo;
+
+ t = x * x;
+ p = (((((((((pS9 * t
+ + pS8) * t
+ + pS7) * t
+ + pS6) * t
+ + pS5) * t
+ + pS4) * t
+ + pS3) * t
+ + pS2) * t
+ + pS1) * t
+ + pS0) * t;
+
+ q = (((((((( t
+ + qS8) * t
+ + qS7) * t
+ + qS6) * t
+ + qS5) * t
+ + qS4) * t
+ + qS3) * t
+ + qS2) * t
+ + qS1) * t
+ + qS0;
+
+ return pio2_hi - (x + x * (p / q) - pio2_lo);
+ }
+
+ else if (x < 0.625) /* 0.625 */
+ {
+ t = x - 0.5625;
+ p = ((((((((((rS10 * t
+ + rS9) * t
+ + rS8) * t
+ + rS7) * t
+ + rS6) * t
+ + rS5) * t
+ + rS4) * t
+ + rS3) * t
+ + rS2) * t
+ + rS1) * t
+ + rS0) * t;
+
+ q = ((((((((( t
+ + sS9) * t
+ + sS8) * t
+ + sS7) * t
+ + sS6) * t
+ + sS5) * t
+ + sS4) * t
+ + sS3) * t
+ + sS2) * t
+ + sS1) * t
+ + sS0;
+
+ return (pio2_hi - asinr5625) - (p / q - pio2_lo);
+ }
+ else
+ return 2 * asinl(sqrtl((1-x)/2));
+}
+
+#if 0
+int
+main (void)
+{
+ printf ("%.18Lg %.18Lg\n",
+ acosl(1.0L),
+ 1.5707963267948966192313216916397514420984L -
+ 1.5707963267948966192313216916397514420984L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl(0.7071067811865475244008443621048490392848L),
+ 1.5707963267948966192313216916397514420984L -
+ 0.7853981633974483096156608458198757210492L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl(0.5L),
+ 1.5707963267948966192313216916397514420984L -
+ 0.5235987755982988730771072305465838140328L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl(0.3090169943749474241022934171828190588600L),
+ 1.5707963267948966192313216916397514420984L -
+ 0.3141592653589793238462643383279502884196L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl(-1.0L),
+ 1.5707963267948966192313216916397514420984L -
+ -1.5707963267948966192313216916397514420984L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl(-0.7071067811865475244008443621048490392848L),
+ 1.5707963267948966192313216916397514420984L -
+ -0.7853981633974483096156608458198757210492L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl(-0.5L),
+ 1.5707963267948966192313216916397514420984L -
+ -0.5235987755982988730771072305465838140328L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl(-0.3090169943749474241022934171828190588600L),
+ 1.5707963267948966192313216916397514420984L -
+ -0.3141592653589793238462643383279502884196L);
+}
+#endif
diff --git a/gnulib/lib/alignof.h b/gnulib/lib/alignof.h
new file mode 100644
index 00000000..953badce
--- /dev/null
+++ b/gnulib/lib/alignof.h
@@ -0,0 +1,53 @@
+/* Determine alignment of types.
+ Copyright (C) 2003-2004, 2006, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _ALIGNOF_H
+#define _ALIGNOF_H
+
+#include <stddef.h>
+
+/* Determine the alignment of a structure slot (field) of a given type,
+ at compile time. Note that the result depends on the ABI.
+ Note: The result cannot be used as a value for an 'enum' constant,
+ due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */
+#if defined __cplusplus
+ template <class type> struct alignof_helper { char __slot1; type __slot2; };
+# define alignof_slot(type) offsetof (alignof_helper<type>, __slot2)
+#else
+# define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, __slot2)
+#endif
+
+/* Determine the good alignment of a object of the given type at compile time.
+ Note that this is not necessarily the same as alignof_slot(type).
+ For example, with GNU C on x86 platforms: alignof_type(double) = 8, but
+ - when -malign-double is not specified: alignof_slot(double) = 4,
+ - when -malign-double is specified: alignof_slot(double) = 8.
+ Note: The result cannot be used as a value for an 'enum' constant,
+ due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */
+#if defined __GNUC__
+# define alignof_type __alignof__
+#else
+# define alignof_type alignof_slot
+#endif
+
+/* alignof is an alias for alignof_slot semantics, since that's what most
+ callers need.
+ Note: The result cannot be used as a value for an 'enum' constant,
+ due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */
+#define alignof alignof_slot
+
+#endif /* _ALIGNOF_H */
diff --git a/gnulib/lib/alloca.c b/gnulib/lib/alloca.c
new file mode 100644
index 00000000..b652765f
--- /dev/null
+++ b/gnulib/lib/alloca.c
@@ -0,0 +1,489 @@
+/* alloca.c -- allocate automatically reclaimed memory
+ (Mostly) portable public-domain implementation -- D A Gwyn
+
+ This implementation of the PWB library alloca function,
+ which is used to allocate space off the run-time stack so
+ that it is automatically reclaimed upon procedure exit,
+ was inspired by discussions with J. Q. Johnson of Cornell.
+ J.Otto Tennant <jot@cray.com> contributed the Cray support.
+
+ There are some preprocessor constants that can
+ be defined when compiling for your specific system, for
+ improved efficiency; however, the defaults should be okay.
+
+ The general concept of this implementation is to keep
+ track of all alloca-allocated blocks, and reclaim any
+ that are found to be deeper in the stack than the current
+ invocation. This heuristic does not reclaim storage as
+ soon as it becomes invalid, but it will do so eventually.
+
+ As a special case, alloca(0) reclaims storage without
+ allocating any. It is a good idea to use alloca(0) in
+ your main control loop, etc. to force garbage collection. */
+
+#include <config.h>
+
+#include <alloca.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef emacs
+# include "lisp.h"
+# include "blockinput.h"
+# ifdef EMACS_FREE
+# undef free
+# define free EMACS_FREE
+# endif
+#else
+# define memory_full() abort ()
+#endif
+
+/* If compiling with GCC 2, this file's not needed. */
+#if !defined (__GNUC__) || __GNUC__ < 2
+
+/* If someone has defined alloca as a macro,
+ there must be some other way alloca is supposed to work. */
+# ifndef alloca
+
+# ifdef emacs
+# ifdef static
+/* actually, only want this if static is defined as ""
+ -- this is for usg, in which emacs must undefine static
+ in order to make unexec workable
+ */
+# ifndef STACK_DIRECTION
+you
+lose
+-- must know STACK_DIRECTION at compile-time
+/* Using #error here is not wise since this file should work for
+ old and obscure compilers. */
+# endif /* STACK_DIRECTION undefined */
+# endif /* static */
+# endif /* emacs */
+
+/* If your stack is a linked list of frames, you have to
+ provide an "address metric" ADDRESS_FUNCTION macro. */
+
+# if defined (CRAY) && defined (CRAY_STACKSEG_END)
+long i00afunc ();
+# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
+# else
+# define ADDRESS_FUNCTION(arg) &(arg)
+# endif
+
+/* Define STACK_DIRECTION if you know the direction of stack
+ growth for your system; otherwise it will be automatically
+ deduced at run-time.
+
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+
+# ifndef STACK_DIRECTION
+# define STACK_DIRECTION 0 /* Direction unknown. */
+# endif
+
+# if STACK_DIRECTION != 0
+
+# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
+
+# else /* STACK_DIRECTION == 0; need run-time code. */
+
+static int stack_dir; /* 1 or -1 once known. */
+# define STACK_DIR stack_dir
+
+static void
+find_stack_direction (void)
+{
+ static char *addr = NULL; /* Address of first `dummy', once known. */
+ auto char dummy; /* To get stack address. */
+
+ if (addr == NULL)
+ { /* Initial entry. */
+ addr = ADDRESS_FUNCTION (dummy);
+
+ find_stack_direction (); /* Recurse once. */
+ }
+ else
+ {
+ /* Second entry. */
+ if (ADDRESS_FUNCTION (dummy) > addr)
+ stack_dir = 1; /* Stack grew upward. */
+ else
+ stack_dir = -1; /* Stack grew downward. */
+ }
+}
+
+# endif /* STACK_DIRECTION == 0 */
+
+/* An "alloca header" is used to:
+ (a) chain together all alloca'ed blocks;
+ (b) keep track of stack depth.
+
+ It is very important that sizeof(header) agree with malloc
+ alignment chunk size. The following default should work okay. */
+
+# ifndef ALIGN_SIZE
+# define ALIGN_SIZE sizeof(double)
+# endif
+
+typedef union hdr
+{
+ char align[ALIGN_SIZE]; /* To force sizeof(header). */
+ struct
+ {
+ union hdr *next; /* For chaining headers. */
+ char *deep; /* For stack depth measure. */
+ } h;
+} header;
+
+static header *last_alloca_header = NULL; /* -> last alloca header. */
+
+/* Return a pointer to at least SIZE bytes of storage,
+ which will be automatically reclaimed upon exit from
+ the procedure that called alloca. Originally, this space
+ was supposed to be taken from the current stack frame of the
+ caller, but that method cannot be made to work for some
+ implementations of C, for example under Gould's UTX/32. */
+
+void *
+alloca (size_t size)
+{
+ auto char probe; /* Probes stack depth: */
+ register char *depth = ADDRESS_FUNCTION (probe);
+
+# if STACK_DIRECTION == 0
+ if (STACK_DIR == 0) /* Unknown growth direction. */
+ find_stack_direction ();
+# endif
+
+ /* Reclaim garbage, defined as all alloca'd storage that
+ was allocated from deeper in the stack than currently. */
+
+ {
+ register header *hp; /* Traverses linked list. */
+
+# ifdef emacs
+ BLOCK_INPUT;
+# endif
+
+ for (hp = last_alloca_header; hp != NULL;)
+ if ((STACK_DIR > 0 && hp->h.deep > depth)
+ || (STACK_DIR < 0 && hp->h.deep < depth))
+ {
+ register header *np = hp->h.next;
+
+ free (hp); /* Collect garbage. */
+
+ hp = np; /* -> next header. */
+ }
+ else
+ break; /* Rest are not deeper. */
+
+ last_alloca_header = hp; /* -> last valid storage. */
+
+# ifdef emacs
+ UNBLOCK_INPUT;
+# endif
+ }
+
+ if (size == 0)
+ return NULL; /* No allocation required. */
+
+ /* Allocate combined header + user data storage. */
+
+ {
+ /* Address of header. */
+ register header *new;
+
+ size_t combined_size = sizeof (header) + size;
+ if (combined_size < sizeof (header))
+ memory_full ();
+
+ new = malloc (combined_size);
+
+ if (! new)
+ memory_full ();
+
+ new->h.next = last_alloca_header;
+ new->h.deep = depth;
+
+ last_alloca_header = new;
+
+ /* User storage begins just after header. */
+
+ return (void *) (new + 1);
+ }
+}
+
+# if defined (CRAY) && defined (CRAY_STACKSEG_END)
+
+# ifdef DEBUG_I00AFUNC
+# include <stdio.h>
+# endif
+
+# ifndef CRAY_STACK
+# define CRAY_STACK
+# ifndef CRAY2
+/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
+struct stack_control_header
+ {
+ long shgrow:32; /* Number of times stack has grown. */
+ long shaseg:32; /* Size of increments to stack. */
+ long shhwm:32; /* High water mark of stack. */
+ long shsize:32; /* Current size of stack (all segments). */
+ };
+
+/* The stack segment linkage control information occurs at
+ the high-address end of a stack segment. (The stack
+ grows from low addresses to high addresses.) The initial
+ part of the stack segment linkage control information is
+ 0200 (octal) words. This provides for register storage
+ for the routine which overflows the stack. */
+
+struct stack_segment_linkage
+ {
+ long ss[0200]; /* 0200 overflow words. */
+ long sssize:32; /* Number of words in this segment. */
+ long ssbase:32; /* Offset to stack base. */
+ long:32;
+ long sspseg:32; /* Offset to linkage control of previous
+ segment of stack. */
+ long:32;
+ long sstcpt:32; /* Pointer to task common address block. */
+ long sscsnm; /* Private control structure number for
+ microtasking. */
+ long ssusr1; /* Reserved for user. */
+ long ssusr2; /* Reserved for user. */
+ long sstpid; /* Process ID for pid based multi-tasking. */
+ long ssgvup; /* Pointer to multitasking thread giveup. */
+ long sscray[7]; /* Reserved for Cray Research. */
+ long ssa0;
+ long ssa1;
+ long ssa2;
+ long ssa3;
+ long ssa4;
+ long ssa5;
+ long ssa6;
+ long ssa7;
+ long sss0;
+ long sss1;
+ long sss2;
+ long sss3;
+ long sss4;
+ long sss5;
+ long sss6;
+ long sss7;
+ };
+
+# else /* CRAY2 */
+/* The following structure defines the vector of words
+ returned by the STKSTAT library routine. */
+struct stk_stat
+ {
+ long now; /* Current total stack size. */
+ long maxc; /* Amount of contiguous space which would
+ be required to satisfy the maximum
+ stack demand to date. */
+ long high_water; /* Stack high-water mark. */
+ long overflows; /* Number of stack overflow ($STKOFEN) calls. */
+ long hits; /* Number of internal buffer hits. */
+ long extends; /* Number of block extensions. */
+ long stko_mallocs; /* Block allocations by $STKOFEN. */
+ long underflows; /* Number of stack underflow calls ($STKRETN). */
+ long stko_free; /* Number of deallocations by $STKRETN. */
+ long stkm_free; /* Number of deallocations by $STKMRET. */
+ long segments; /* Current number of stack segments. */
+ long maxs; /* Maximum number of stack segments so far. */
+ long pad_size; /* Stack pad size. */
+ long current_address; /* Current stack segment address. */
+ long current_size; /* Current stack segment size. This
+ number is actually corrupted by STKSTAT to
+ include the fifteen word trailer area. */
+ long initial_address; /* Address of initial segment. */
+ long initial_size; /* Size of initial segment. */
+ };
+
+/* The following structure describes the data structure which trails
+ any stack segment. I think that the description in 'asdef' is
+ out of date. I only describe the parts that I am sure about. */
+
+struct stk_trailer
+ {
+ long this_address; /* Address of this block. */
+ long this_size; /* Size of this block (does not include
+ this trailer). */
+ long unknown2;
+ long unknown3;
+ long link; /* Address of trailer block of previous
+ segment. */
+ long unknown5;
+ long unknown6;
+ long unknown7;
+ long unknown8;
+ long unknown9;
+ long unknown10;
+ long unknown11;
+ long unknown12;
+ long unknown13;
+ long unknown14;
+ };
+
+# endif /* CRAY2 */
+# endif /* not CRAY_STACK */
+
+# ifdef CRAY2
+/* Determine a "stack measure" for an arbitrary ADDRESS.
+ I doubt that "lint" will like this much. */
+
+static long
+i00afunc (long *address)
+{
+ struct stk_stat status;
+ struct stk_trailer *trailer;
+ long *block, size;
+ long result = 0;
+
+ /* We want to iterate through all of the segments. The first
+ step is to get the stack status structure. We could do this
+ more quickly and more directly, perhaps, by referencing the
+ $LM00 common block, but I know that this works. */
+
+ STKSTAT (&status);
+
+ /* Set up the iteration. */
+
+ trailer = (struct stk_trailer *) (status.current_address
+ + status.current_size
+ - 15);
+
+ /* There must be at least one stack segment. Therefore it is
+ a fatal error if "trailer" is null. */
+
+ if (trailer == 0)
+ abort ();
+
+ /* Discard segments that do not contain our argument address. */
+
+ while (trailer != 0)
+ {
+ block = (long *) trailer->this_address;
+ size = trailer->this_size;
+ if (block == 0 || size == 0)
+ abort ();
+ trailer = (struct stk_trailer *) trailer->link;
+ if ((block <= address) && (address < (block + size)))
+ break;
+ }
+
+ /* Set the result to the offset in this segment and add the sizes
+ of all predecessor segments. */
+
+ result = address - block;
+
+ if (trailer == 0)
+ {
+ return result;
+ }
+
+ do
+ {
+ if (trailer->this_size <= 0)
+ abort ();
+ result += trailer->this_size;
+ trailer = (struct stk_trailer *) trailer->link;
+ }
+ while (trailer != 0);
+
+ /* We are done. Note that if you present a bogus address (one
+ not in any segment), you will get a different number back, formed
+ from subtracting the address of the first block. This is probably
+ not what you want. */
+
+ return (result);
+}
+
+# else /* not CRAY2 */
+/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
+ Determine the number of the cell within the stack,
+ given the address of the cell. The purpose of this
+ routine is to linearize, in some sense, stack addresses
+ for alloca. */
+
+static long
+i00afunc (long address)
+{
+ long stkl = 0;
+
+ long size, pseg, this_segment, stack;
+ long result = 0;
+
+ struct stack_segment_linkage *ssptr;
+
+ /* Register B67 contains the address of the end of the
+ current stack segment. If you (as a subprogram) store
+ your registers on the stack and find that you are past
+ the contents of B67, you have overflowed the segment.
+
+ B67 also points to the stack segment linkage control
+ area, which is what we are really interested in. */
+
+ stkl = CRAY_STACKSEG_END ();
+ ssptr = (struct stack_segment_linkage *) stkl;
+
+ /* If one subtracts 'size' from the end of the segment,
+ one has the address of the first word of the segment.
+
+ If this is not the first segment, 'pseg' will be
+ nonzero. */
+
+ pseg = ssptr->sspseg;
+ size = ssptr->sssize;
+
+ this_segment = stkl - size;
+
+ /* It is possible that calling this routine itself caused
+ a stack overflow. Discard stack segments which do not
+ contain the target address. */
+
+ while (!(this_segment <= address && address <= stkl))
+ {
+# ifdef DEBUG_I00AFUNC
+ fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
+# endif
+ if (pseg == 0)
+ break;
+ stkl = stkl - pseg;
+ ssptr = (struct stack_segment_linkage *) stkl;
+ size = ssptr->sssize;
+ pseg = ssptr->sspseg;
+ this_segment = stkl - size;
+ }
+
+ result = address - this_segment;
+
+ /* If you subtract pseg from the current end of the stack,
+ you get the address of the previous stack segment's end.
+ This seems a little convoluted to me, but I'll bet you save
+ a cycle somewhere. */
+
+ while (pseg != 0)
+ {
+# ifdef DEBUG_I00AFUNC
+ fprintf (stderr, "%011o %011o\n", pseg, size);
+# endif
+ stkl = stkl - pseg;
+ ssptr = (struct stack_segment_linkage *) stkl;
+ size = ssptr->sssize;
+ pseg = ssptr->sspseg;
+ result += size;
+ }
+ return (result);
+}
+
+# endif /* not CRAY2 */
+# endif /* CRAY */
+
+# endif /* no alloca */
+#endif /* not GCC version 2 */
diff --git a/gnulib/lib/alloca.in.h b/gnulib/lib/alloca.in.h
new file mode 100644
index 00000000..107534e9
--- /dev/null
+++ b/gnulib/lib/alloca.in.h
@@ -0,0 +1,56 @@
+/* Memory allocation on the stack.
+
+ Copyright (C) 1995, 1999, 2001-2004, 2006-2010 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 2, 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
+ means there is a real alloca function. */
+#ifndef _GL_ALLOCA_H
+#define _GL_ALLOCA_H
+
+/* alloca (N) returns a pointer to N bytes of memory
+ allocated on the stack, which will last until the function returns.
+ Use of alloca should be avoided:
+ - inside arguments of function calls - undefined behaviour,
+ - in inline functions - the allocation may actually last until the
+ calling function returns,
+ - for huge N (say, N >= 65536) - you never know how large (or small)
+ the stack is, and when the stack cannot fulfill the memory allocation
+ request, the program just crashes.
+ */
+
+#ifndef alloca
+# ifdef __GNUC__
+# define alloca __builtin_alloca
+# elif defined _AIX
+# define alloca __alloca
+# elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# elif defined __DECC && defined __VMS
+# define alloca __ALLOCA
+# else
+# include <stddef.h>
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+# endif
+#endif
+
+#endif /* _GL_ALLOCA_H */
diff --git a/gnulib/lib/alphasort.c b/gnulib/lib/alphasort.c
new file mode 100644
index 00000000..7b6f3fbf
--- /dev/null
+++ b/gnulib/lib/alphasort.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1992, 1997, 1998, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include <string.h>
+
+int
+alphasort (const struct dirent **a, const struct dirent **b)
+{
+ return strcoll ((*a)->d_name, (*b)->d_name);
+}
diff --git a/gnulib/lib/arcfour.c b/gnulib/lib/arcfour.c
new file mode 100644
index 00000000..c19f4758
--- /dev/null
+++ b/gnulib/lib/arcfour.c
@@ -0,0 +1,78 @@
+/* arcfour.c --- The arcfour stream cipher
+ * Copyright (C) 2000, 2001, 2002, 2003, 2005, 2006, 2009, 2010 Free Software
+ * Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */
+
+/*
+ * For a description of the algorithm, see:
+ * Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
+ * ISBN 0-471-11709-9. Pages 397 ff.
+ */
+
+#include <config.h>
+
+#include "arcfour.h"
+
+void
+arcfour_stream (arcfour_context * context, const char *inbuf, char *outbuf,
+ size_t length)
+{
+ uint8_t i = context->idx_i;
+ uint8_t j = context->idx_j;
+ char *sbox = context->sbox;
+
+ for (; length > 0; length--)
+ {
+ char t;
+
+ i++;
+ j += sbox[i];
+ t = sbox[i];
+ sbox[i] = sbox[j];
+ sbox[j] = t;
+ *outbuf++ = (*inbuf++
+ ^ sbox[(0U + sbox[i] + sbox[j]) % ARCFOUR_SBOX_SIZE]);
+ }
+
+ context->idx_i = i;
+ context->idx_j = j;
+}
+
+void
+arcfour_setkey (arcfour_context * context, const char *key, size_t keylen)
+{
+ size_t i, j, k;
+ char *sbox = context->sbox;
+
+ context->idx_i = context->idx_j = 0;
+ for (i = 0; i < ARCFOUR_SBOX_SIZE; i++)
+ sbox[i] = i;
+ for (i = j = k = 0; i < ARCFOUR_SBOX_SIZE; i++)
+ {
+ char t;
+ j = (j + sbox[i] + key[k]) % ARCFOUR_SBOX_SIZE;
+ t = sbox[i];
+ sbox[i] = sbox[j];
+ sbox[j] = t;
+ if (++k == keylen)
+ k = 0;
+ }
+}
diff --git a/gnulib/lib/arcfour.h b/gnulib/lib/arcfour.h
new file mode 100644
index 00000000..80d510ac
--- /dev/null
+++ b/gnulib/lib/arcfour.h
@@ -0,0 +1,51 @@
+/* arcfour.h --- The arcfour stream cipher
+ * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2009, 2010 Free Software
+ * Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */
+
+#ifndef ARCFOUR_H
+# define ARCFOUR_H
+
+# include <stddef.h>
+# include <stdint.h>
+
+#define ARCFOUR_SBOX_SIZE 256
+
+typedef struct
+{
+ char sbox[ARCFOUR_SBOX_SIZE];
+ uint8_t idx_i, idx_j;
+} arcfour_context;
+
+/* Apply ARCFOUR stream to INBUF placing the result in OUTBUF, both of
+ LENGTH size. CONTEXT must be initialized with arcfour_setkey
+ before this function is called. */
+extern void
+arcfour_stream (arcfour_context * context,
+ const char *inbuf, char *outbuf, size_t length);
+
+/* Initialize CONTEXT using encryption KEY of KEYLEN bytes. KEY
+ should be 40 bits (5 bytes) or longer. The KEY cannot be zero
+ length. */
+extern void
+arcfour_setkey (arcfour_context * context, const char *key, size_t keylen);
+
+#endif /* ARCFOUR_H */
diff --git a/gnulib/lib/arctwo.c b/gnulib/lib/arctwo.c
new file mode 100644
index 00000000..27b7c1bd
--- /dev/null
+++ b/gnulib/lib/arctwo.c
@@ -0,0 +1,229 @@
+/* arctwo.c --- The RC2 cipher as described in RFC 2268.
+ * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Free Software
+ * Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+/* Code from GnuTLS/Libgcrypt adapted for gnulib by Simon Josefsson. */
+
+/* This implementation was written by Nikos Mavroyanopoulos for GNUTLS
+ * as a Libgcrypt module (gnutls/lib/x509/rc2.c) and later adapted for
+ * direct use by Libgcrypt by Werner Koch. This implementation is
+ * only useful for pkcs#12 decryption.
+ *
+ * The implementation here is based on Peter Gutmann's RRC.2 paper.
+ */
+
+#include <config.h>
+
+#include "arctwo.h"
+
+#include "bitrotate.h"
+
+static const uint8_t arctwo_sbox[] = {
+ 217, 120, 249, 196, 25, 221, 181, 237,
+ 40, 233, 253, 121, 74, 160, 216, 157,
+ 198, 126, 55, 131, 43, 118, 83, 142,
+ 98, 76, 100, 136, 68, 139, 251, 162,
+ 23, 154, 89, 245, 135, 179, 79, 19,
+ 97, 69, 109, 141, 9, 129, 125, 50,
+ 189, 143, 64, 235, 134, 183, 123, 11,
+ 240, 149, 33, 34, 92, 107, 78, 130,
+ 84, 214, 101, 147, 206, 96, 178, 28,
+ 115, 86, 192, 20, 167, 140, 241, 220,
+ 18, 117, 202, 31, 59, 190, 228, 209,
+ 66, 61, 212, 48, 163, 60, 182, 38,
+ 111, 191, 14, 218, 70, 105, 7, 87,
+ 39, 242, 29, 155, 188, 148, 67, 3,
+ 248, 17, 199, 246, 144, 239, 62, 231,
+ 6, 195, 213, 47, 200, 102, 30, 215,
+ 8, 232, 234, 222, 128, 82, 238, 247,
+ 132, 170, 114, 172, 53, 77, 106, 42,
+ 150, 26, 210, 113, 90, 21, 73, 116,
+ 75, 159, 208, 94, 4, 24, 164, 236,
+ 194, 224, 65, 110, 15, 81, 203, 204,
+ 36, 145, 175, 80, 161, 244, 112, 57,
+ 153, 124, 58, 133, 35, 184, 180, 122,
+ 252, 2, 54, 91, 37, 85, 151, 49,
+ 45, 93, 250, 152, 227, 138, 146, 174,
+ 5, 223, 41, 16, 103, 108, 186, 201,
+ 211, 0, 230, 207, 225, 158, 168, 44,
+ 99, 22, 1, 63, 88, 226, 137, 169,
+ 13, 56, 52, 27, 171, 51, 255, 176,
+ 187, 72, 12, 95, 185, 177, 205, 46,
+ 197, 243, 219, 71, 229, 165, 156, 119,
+ 10, 166, 32, 104, 254, 127, 193, 173
+};
+
+/* C89 compliant way to cast 'char' to 'unsigned char'. */
+static inline unsigned char
+to_uchar (char ch)
+{
+ return ch;
+}
+
+void
+arctwo_encrypt (arctwo_context *context, const char *inbuf,
+ char *outbuf, size_t length)
+{
+ for (; length >= ARCTWO_BLOCK_SIZE; length -= ARCTWO_BLOCK_SIZE,
+ inbuf += ARCTWO_BLOCK_SIZE, outbuf += ARCTWO_BLOCK_SIZE)
+ {
+ size_t i, j;
+ uint16_t word0 = 0, word1 = 0, word2 = 0, word3 = 0;
+
+ word0 = (word0 << 8) | to_uchar (inbuf[1]);
+ word0 = (word0 << 8) | to_uchar (inbuf[0]);
+ word1 = (word1 << 8) | to_uchar (inbuf[3]);
+ word1 = (word1 << 8) | to_uchar (inbuf[2]);
+ word2 = (word2 << 8) | to_uchar (inbuf[5]);
+ word2 = (word2 << 8) | to_uchar (inbuf[4]);
+ word3 = (word3 << 8) | to_uchar (inbuf[7]);
+ word3 = (word3 << 8) | to_uchar (inbuf[6]);
+
+ for (i = 0; i < 16; i++)
+ {
+ j = i * 4;
+ /* For some reason I cannot combine those steps. */
+ word0 += (word1 & ~word3) + (word2 & word3) + context->S[j];
+ word0 = rotl16 (word0, 1);
+
+ word1 += (word2 & ~word0) + (word3 & word0) + context->S[j + 1];
+ word1 = rotl16 (word1, 2);
+
+ word2 += (word3 & ~word1) + (word0 & word1) + context->S[j + 2];
+ word2 = rotl16 (word2, 3);
+
+ word3 += (word0 & ~word2) + (word1 & word2) + context->S[j + 3];
+ word3 = rotl16 (word3, 5);
+
+ if (i == 4 || i == 10)
+ {
+ word0 += context->S[word3 & 63];
+ word1 += context->S[word0 & 63];
+ word2 += context->S[word1 & 63];
+ word3 += context->S[word2 & 63];
+ }
+ }
+
+ outbuf[0] = word0 & 255;
+ outbuf[1] = word0 >> 8;
+ outbuf[2] = word1 & 255;
+ outbuf[3] = word1 >> 8;
+ outbuf[4] = word2 & 255;
+ outbuf[5] = word2 >> 8;
+ outbuf[6] = word3 & 255;
+ outbuf[7] = word3 >> 8;
+ }
+}
+
+void
+arctwo_decrypt (arctwo_context *context, const char *inbuf,
+ char *outbuf, size_t length)
+{
+ for (; length >= ARCTWO_BLOCK_SIZE; length -= ARCTWO_BLOCK_SIZE,
+ inbuf += ARCTWO_BLOCK_SIZE, outbuf += ARCTWO_BLOCK_SIZE)
+ {
+ size_t i, j;
+ uint16_t word0 = 0, word1 = 0, word2 = 0, word3 = 0;
+
+ word0 = (word0 << 8) | to_uchar (inbuf[1]);
+ word0 = (word0 << 8) | to_uchar (inbuf[0]);
+ word1 = (word1 << 8) | to_uchar (inbuf[3]);
+ word1 = (word1 << 8) | to_uchar (inbuf[2]);
+ word2 = (word2 << 8) | to_uchar (inbuf[5]);
+ word2 = (word2 << 8) | to_uchar (inbuf[4]);
+ word3 = (word3 << 8) | to_uchar (inbuf[7]);
+ word3 = (word3 << 8) | to_uchar (inbuf[6]);
+
+ for (i = 16; i > 0; i--)
+ {
+ j = (i - 1) * 4;
+
+ word3 = rotr16 (word3, 5);
+ word3 -= (word0 & ~word2) + (word1 & word2) + context->S[j + 3];
+
+ word2 = rotr16 (word2, 3);
+ word2 -= (word3 & ~word1) + (word0 & word1) + context->S[j + 2];
+
+ word1 = rotr16 (word1, 2);
+ word1 -= (word2 & ~word0) + (word3 & word0) + context->S[j + 1];
+
+ word0 = rotr16 (word0, 1);
+ word0 -= (word1 & ~word3) + (word2 & word3) + context->S[j];
+
+ if (i == 6 || i == 12)
+ {
+ word3 = word3 - context->S[word2 & 63];
+ word2 = word2 - context->S[word1 & 63];
+ word1 = word1 - context->S[word0 & 63];
+ word0 = word0 - context->S[word3 & 63];
+ }
+ }
+
+ outbuf[0] = word0 & 255;
+ outbuf[1] = word0 >> 8;
+ outbuf[2] = word1 & 255;
+ outbuf[3] = word1 >> 8;
+ outbuf[4] = word2 & 255;
+ outbuf[5] = word2 >> 8;
+ outbuf[6] = word3 & 255;
+ outbuf[7] = word3 >> 8;
+ }
+}
+
+void
+arctwo_setkey_ekb (arctwo_context *context,
+ size_t keylen, const char *key, size_t effective_keylen)
+{
+ size_t i;
+ uint8_t *S, x;
+
+ if (keylen < 40 / 8 || effective_keylen > 1024)
+ return;
+
+ S = (uint8_t *) context->S;
+
+ for (i = 0; i < keylen; i++)
+ S[i] = (uint8_t) key[i];
+
+ for (i = keylen; i < 128; i++)
+ S[i] = arctwo_sbox[(S[i - keylen] + S[i - 1]) & 255];
+
+ S[0] = arctwo_sbox[S[0]];
+
+ /* Phase 2 - reduce effective key size to "bits". This was not
+ * discussed in Gutmann's paper. I've copied that from the public
+ * domain code posted in sci.crypt. */
+ if (effective_keylen)
+ {
+ size_t len = (effective_keylen + 7) >> 3;
+ i = 128 - len;
+ x = arctwo_sbox[S[i] & (255 >> (7 & -effective_keylen))];
+ S[i] = x;
+
+ while (i--)
+ {
+ x = arctwo_sbox[x ^ S[i + len]];
+ S[i] = x;
+ }
+ }
+
+ /* Make the expanded key, endian independent. */
+ for (i = 0; i < 64; i++)
+ context->S[i] = ((uint16_t) S[i * 2] | (((uint16_t) S[i * 2 + 1]) << 8));
+}
diff --git a/gnulib/lib/arctwo.h b/gnulib/lib/arctwo.h
new file mode 100644
index 00000000..d35c117c
--- /dev/null
+++ b/gnulib/lib/arctwo.h
@@ -0,0 +1,64 @@
+/* arctwo.h --- The arctwo block cipher
+ * Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009, 2010 Free Software
+ * Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */
+
+#ifndef ARCTWO_H
+# define ARCTWO_H
+
+# include <stddef.h>
+# include <stdint.h>
+
+typedef struct
+{
+ uint16_t S[64];
+} arctwo_context;
+
+#define ARCTWO_BLOCK_SIZE 8
+
+/* Initialize CONTEXT using KEY of KEYLEN length. If
+ EFFECTIVE_KEYLEN, truncate the key (using a special algorithm) to
+ only be of EFFECTIVE_KEYLEN bits. Normally, you use
+ EFFECTIVE_KEYLEN of 0, but see RFC 2268 for more information. */
+void
+arctwo_setkey_ekb (arctwo_context *context,
+ size_t keylen, const char *key, size_t effective_keylen);
+
+#define arctwo_setkey(context,keylen,key) \
+ arctwo_setkey_ekb (context, keylen, key, 8 * (keylen))
+
+/* Encrypt INBUF of size LENGTH into OUTBUF. LENGTH must be a
+ multiple of ARCTWO_BLOCK_SIZE. CONTEXT hold the encryption key,
+ and must have been initialized with arctwo_setkey or
+ arctwo_setkey_ekb. */
+extern void
+arctwo_encrypt (arctwo_context *context, const char *inbuf,
+ char *outbuf, size_t length);
+
+/* Decrypt INBUF of size LENGTH into OUTBUF. LENGTH must be a
+ multiple of ARCTWO_BLOCK_SIZE. CONTEXT hold the decryption key,
+ and must have been initialized with arctwo_setkey or
+ arctwo_setkey_ekb. */
+extern void
+arctwo_decrypt (arctwo_context *context, const char *inbuf,
+ char *outbuf, size_t length);
+
+#endif /* ARCTWO_H */
diff --git a/gnulib/lib/areadlink-with-size.c b/gnulib/lib/areadlink-with-size.c
new file mode 100644
index 00000000..9616ee04
--- /dev/null
+++ b/gnulib/lib/areadlink-with-size.c
@@ -0,0 +1,104 @@
+/* readlink wrapper to return the link name in malloc'd storage.
+ Unlike xreadlink and xreadlink_with_size, don't ever call exit.
+
+ Copyright (C) 2001, 2003-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <jim@meyering.net> */
+
+#include <config.h>
+
+#include "areadlink.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+/* SYMLINK_MAX is used only for an initial memory-allocation sanity
+ check, so it's OK to guess too small on hosts where there is no
+ arbitrary limit to symbolic link length. */
+#ifndef SYMLINK_MAX
+# define SYMLINK_MAX 1024
+#endif
+
+#define MAXSIZE (SIZE_MAX < SSIZE_MAX ? SIZE_MAX : SSIZE_MAX)
+
+/* Call readlink to get the symbolic link value of FILE.
+ SIZE is a hint as to how long the link is expected to be;
+ typically it is taken from st_size. It need not be correct.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlink fails, malloc fails, or if the link value is longer
+ than SSIZE_MAX, return NULL (caller may use errno to diagnose). */
+
+char *
+areadlink_with_size (char const *file, size_t size)
+{
+ /* Some buggy file systems report garbage in st_size. Defend
+ against them by ignoring outlandish st_size values in the initial
+ memory allocation. */
+ size_t symlink_max = SYMLINK_MAX;
+ size_t INITIAL_LIMIT_BOUND = 8 * 1024;
+ size_t initial_limit = (symlink_max < INITIAL_LIMIT_BOUND
+ ? symlink_max + 1
+ : INITIAL_LIMIT_BOUND);
+
+ /* The initial buffer size for the link value. */
+ size_t buf_size = size < initial_limit ? size + 1 : initial_limit;
+
+ while (1)
+ {
+ ssize_t r;
+ size_t link_length;
+ char *buffer = malloc (buf_size);
+
+ if (buffer == NULL)
+ return NULL;
+ r = readlink (file, buffer, buf_size);
+ link_length = r;
+
+ /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+ with errno == ERANGE if the buffer is too small. */
+ if (r < 0 && errno != ERANGE)
+ {
+ int saved_errno = errno;
+ free (buffer);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (link_length < buf_size)
+ {
+ buffer[link_length] = 0;
+ return buffer;
+ }
+
+ free (buffer);
+ if (buf_size <= MAXSIZE / 2)
+ buf_size *= 2;
+ else if (buf_size < MAXSIZE)
+ buf_size = MAXSIZE;
+ else
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+}
diff --git a/gnulib/lib/areadlink.c b/gnulib/lib/areadlink.c
new file mode 100644
index 00000000..b0db4200
--- /dev/null
+++ b/gnulib/lib/areadlink.c
@@ -0,0 +1,119 @@
+/* areadlink.c -- readlink wrapper to return the link name in malloc'd storage
+ Unlike xreadlink and xreadlink_with_size, don't ever call exit.
+
+ Copyright (C) 2001, 2003-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>
+ and Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "areadlink.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+/* The initial buffer size for the link value. A power of 2
+ detects arithmetic overflow earlier, but is not required. */
+enum {
+ INITIAL_BUF_SIZE = 1024
+};
+
+/* Call readlink to get the symbolic link value of FILENAME.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlink fails, return NULL and set errno.
+ If realloc fails, or if the link value is longer than SIZE_MAX :-),
+ return NULL and set errno to ENOMEM. */
+
+char *
+areadlink (char const *filename)
+{
+ /* Allocate the initial buffer on the stack. This way, in the common
+ case of a symlink of small size, we get away with a single small malloc()
+ instead of a big malloc() followed by a shrinking realloc(). */
+ char initial_buf[INITIAL_BUF_SIZE];
+
+ char *buffer = initial_buf;
+ size_t buf_size = sizeof initial_buf;
+
+ while (1)
+ {
+ /* Attempt to read the link into the current buffer. */
+ ssize_t link_length = readlink (filename, buffer, buf_size);
+
+ /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+ with errno == ERANGE if the buffer is too small. */
+ if (link_length < 0 && errno != ERANGE)
+ {
+ if (buffer != initial_buf)
+ {
+ int saved_errno = errno;
+ free (buffer);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if ((size_t) link_length < buf_size)
+ {
+ buffer[link_length++] = '\0';
+
+ /* Return it in a chunk of memory as small as possible. */
+ if (buffer == initial_buf)
+ {
+ buffer = (char *) malloc (link_length);
+ if (buffer == NULL)
+ /* errno is ENOMEM. */
+ return NULL;
+ memcpy (buffer, initial_buf, link_length);
+ }
+ else
+ {
+ /* Shrink buffer before returning it. */
+ if ((size_t) link_length < buf_size)
+ {
+ char *smaller_buffer = (char *) realloc (buffer, link_length);
+
+ if (smaller_buffer != NULL)
+ buffer = smaller_buffer;
+ }
+ }
+ return buffer;
+ }
+
+ if (buffer != initial_buf)
+ free (buffer);
+ buf_size *= 2;
+ if (SSIZE_MAX < buf_size || (SIZE_MAX / 2 < SSIZE_MAX && buf_size == 0))
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ buffer = (char *) malloc (buf_size);
+ if (buffer == NULL)
+ /* errno is ENOMEM. */
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/areadlink.h b/gnulib/lib/areadlink.h
new file mode 100644
index 00000000..476559b9
--- /dev/null
+++ b/gnulib/lib/areadlink.h
@@ -0,0 +1,33 @@
+/* Read symbolic links without size limitation.
+
+ Copyright (C) 2001, 2003-2004, 2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <jim@meyering.net> */
+
+#include <stddef.h>
+
+extern char *areadlink (char const *filename);
+extern char *areadlink_with_size (char const *filename, size_t size_hint);
+
+#if GNULIB_AREADLINKAT
+extern char *areadlinkat (int fd, char const *filename);
+#endif
+
+#if GNULIB_AREADLINKAT_WITH_SIZE
+extern char *areadlinkat_with_size (int fd, char const *filename,
+ size_t size_hint);
+#endif
diff --git a/gnulib/lib/areadlinkat-with-size.c b/gnulib/lib/areadlinkat-with-size.c
new file mode 100644
index 00000000..e890ed40
--- /dev/null
+++ b/gnulib/lib/areadlinkat-with-size.c
@@ -0,0 +1,132 @@
+/* readlinkat wrapper to return the link name in malloc'd storage.
+ Unlike xreadlinkat, only call exit on failure to change directory.
+
+ Copyright (C) 2001, 2003-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>
+ and Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+#include "areadlink.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#if HAVE_READLINKAT
+
+# ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+# endif
+
+/* SYMLINK_MAX is used only for an initial memory-allocation sanity
+ check, so it's OK to guess too small on hosts where there is no
+ arbitrary limit to symbolic link length. */
+# ifndef SYMLINK_MAX
+# define SYMLINK_MAX 1024
+# endif
+
+# define MAXSIZE (SIZE_MAX < SSIZE_MAX ? SIZE_MAX : SSIZE_MAX)
+
+/* Call readlinkat to get the symbolic link value of FILE, relative to FD.
+ SIZE is a hint as to how long the link is expected to be;
+ typically it is taken from st_size. It need not be correct.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlinkat fails, malloc fails, or if the link value is longer
+ than SSIZE_MAX, return NULL (caller may use errno to diagnose).
+ However, failure to change directory during readlinkat will issue
+ a diagnostic and exit. */
+
+char *
+areadlinkat_with_size (int fd, char const *file, size_t size)
+{
+ /* Some buggy file systems report garbage in st_size. Defend
+ against them by ignoring outlandish st_size values in the initial
+ memory allocation. */
+ size_t symlink_max = SYMLINK_MAX;
+ size_t INITIAL_LIMIT_BOUND = 8 * 1024;
+ size_t initial_limit = (symlink_max < INITIAL_LIMIT_BOUND
+ ? symlink_max + 1
+ : INITIAL_LIMIT_BOUND);
+
+ /* The initial buffer size for the link value. */
+ size_t buf_size = size < initial_limit ? size + 1 : initial_limit;
+
+ while (1)
+ {
+ ssize_t r;
+ size_t link_length;
+ char *buffer = malloc (buf_size);
+
+ if (buffer == NULL)
+ return NULL;
+ r = readlinkat (fd, file, buffer, buf_size);
+ link_length = r;
+
+ /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+ with errno == ERANGE if the buffer is too small. */
+ if (r < 0 && errno != ERANGE)
+ {
+ int saved_errno = errno;
+ free (buffer);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (link_length < buf_size)
+ {
+ buffer[link_length] = 0;
+ return buffer;
+ }
+
+ free (buffer);
+ if (buf_size <= MAXSIZE / 2)
+ buf_size *= 2;
+ else if (buf_size < MAXSIZE)
+ buf_size = MAXSIZE;
+ else
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+}
+
+#else /* !HAVE_READLINKAT */
+
+
+/* It is more efficient to change directories only once and call
+ areadlink_with_size, rather than repeatedly call the replacement
+ readlinkat. */
+
+# define AT_FUNC_NAME areadlinkat_with_size
+# define AT_FUNC_F1 areadlink_with_size
+# define AT_FUNC_POST_FILE_PARAM_DECLS , size_t size
+# define AT_FUNC_POST_FILE_ARGS , size
+# define AT_FUNC_RESULT char *
+# define AT_FUNC_FAIL NULL
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+# undef AT_FUNC_RESULT
+# undef AT_FUNC_FAIL
+
+#endif /* !HAVE_READLINKAT */
diff --git a/gnulib/lib/areadlinkat.c b/gnulib/lib/areadlinkat.c
new file mode 100644
index 00000000..74c75724
--- /dev/null
+++ b/gnulib/lib/areadlinkat.c
@@ -0,0 +1,145 @@
+/* areadlinkat.c -- readlinkat wrapper to return malloc'd link name
+ Unlike xreadlinkat, only call exit on failure to change directory.
+
+ Copyright (C) 2001, 2003-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>,
+ and Bruno Haible <bruno@clisp.org>,
+ and Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "areadlink.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+#if HAVE_READLINKAT
+
+/* The initial buffer size for the link value. A power of 2
+ detects arithmetic overflow earlier, but is not required. */
+enum {
+ INITIAL_BUF_SIZE = 1024
+};
+
+/* Call readlinkat to get the symbolic link value of FILENAME relative to FD.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlinkat fails, return NULL and set errno (although failure to
+ change directory will issue a diagnostic and exit).
+ If realloc fails, or if the link value is longer than SIZE_MAX :-),
+ return NULL and set errno to ENOMEM. */
+
+char *
+areadlinkat (int fd, char const *filename)
+{
+ /* Allocate the initial buffer on the stack. This way, in the common
+ case of a symlink of small size, we get away with a single small malloc()
+ instead of a big malloc() followed by a shrinking realloc(). */
+ char initial_buf[INITIAL_BUF_SIZE];
+
+ char *buffer = initial_buf;
+ size_t buf_size = sizeof initial_buf;
+
+ while (1)
+ {
+ /* Attempt to read the link into the current buffer. */
+ ssize_t link_length = readlinkat (fd, filename, buffer, buf_size);
+
+ /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+ with errno == ERANGE if the buffer is too small. */
+ if (link_length < 0 && errno != ERANGE)
+ {
+ if (buffer != initial_buf)
+ {
+ int saved_errno = errno;
+ free (buffer);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if ((size_t) link_length < buf_size)
+ {
+ buffer[link_length++] = '\0';
+
+ /* Return it in a chunk of memory as small as possible. */
+ if (buffer == initial_buf)
+ {
+ buffer = (char *) malloc (link_length);
+ if (buffer == NULL)
+ /* errno is ENOMEM. */
+ return NULL;
+ memcpy (buffer, initial_buf, link_length);
+ }
+ else
+ {
+ /* Shrink buffer before returning it. */
+ if ((size_t) link_length < buf_size)
+ {
+ char *smaller_buffer = (char *) realloc (buffer, link_length);
+
+ if (smaller_buffer != NULL)
+ buffer = smaller_buffer;
+ }
+ }
+ return buffer;
+ }
+
+ if (buffer != initial_buf)
+ free (buffer);
+ buf_size *= 2;
+ if (SSIZE_MAX < buf_size || (SIZE_MAX / 2 < SSIZE_MAX && buf_size == 0))
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ buffer = (char *) malloc (buf_size);
+ if (buffer == NULL)
+ /* errno is ENOMEM. */
+ return NULL;
+ }
+}
+
+#else /* !HAVE_READLINKAT */
+
+/* It is more efficient to change directories only once and call
+ areadlink, rather than repeatedly call the replacement
+ readlinkat. */
+
+# define AT_FUNC_NAME areadlinkat
+# define AT_FUNC_F1 areadlink
+# define AT_FUNC_POST_FILE_PARAM_DECLS /* empty */
+# define AT_FUNC_POST_FILE_ARGS /* empty */
+# define AT_FUNC_RESULT char *
+# define AT_FUNC_FAIL NULL
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+# undef AT_FUNC_RESULT
+# undef AT_FUNC_FAIL
+
+#endif /* !HAVE_READLINKAT */
diff --git a/gnulib/lib/argmatch.c b/gnulib/lib/argmatch.c
new file mode 100644
index 00000000..d1bffe0d
--- /dev/null
+++ b/gnulib/lib/argmatch.c
@@ -0,0 +1,277 @@
+/* argmatch.c -- find a match for a string in an array
+
+ Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+ 2009, 2010 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/>. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu>
+ Modified by Akim Demaille <demaille@inf.enst.fr> */
+
+#include <config.h>
+
+/* Specification. */
+#include "argmatch.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "error.h"
+#include "quotearg.h"
+#include "quote.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* When reporting an invalid argument, show nonprinting characters
+ by using the quoting style ARGMATCH_QUOTING_STYLE. Do not use
+ literal_quoting_style. */
+#ifndef ARGMATCH_QUOTING_STYLE
+# define ARGMATCH_QUOTING_STYLE locale_quoting_style
+#endif
+
+/* Non failing version of argmatch call this function after failing. */
+#ifndef ARGMATCH_DIE
+# include "exitfail.h"
+# define ARGMATCH_DIE exit (exit_failure)
+#endif
+
+#ifdef ARGMATCH_DIE_DECL
+ARGMATCH_DIE_DECL;
+#endif
+
+static void
+__argmatch_die (void)
+{
+ ARGMATCH_DIE;
+}
+
+/* Used by XARGMATCH and XARGCASEMATCH. See description in argmatch.h.
+ Default to __argmatch_die, but allow caller to change this at run-time. */
+argmatch_exit_fn argmatch_die = __argmatch_die;
+
+
+/* If ARG is an unambiguous match for an element of the
+ NULL-terminated array ARGLIST, return the index in ARGLIST
+ of the matched element, else -1 if it does not match any element
+ or -2 if it is ambiguous (is a prefix of more than one element).
+
+ If VALLIST is none null, use it to resolve ambiguities limited to
+ synonyms, i.e., for
+ "yes", "yop" -> 0
+ "no", "nope" -> 1
+ "y" is a valid argument, for `0', and "n" for `1'. */
+
+ptrdiff_t
+argmatch (const char *arg, const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i; /* Temporary index in ARGLIST. */
+ size_t arglen; /* Length of ARG. */
+ ptrdiff_t matchind = -1; /* Index of first nonexact match. */
+ bool ambiguous = false; /* If true, multiple nonexact match(es). */
+
+ arglen = strlen (arg);
+
+ /* Test all elements for either exact match or abbreviated matches. */
+ for (i = 0; arglist[i]; i++)
+ {
+ if (!strncmp (arglist[i], arg, arglen))
+ {
+ if (strlen (arglist[i]) == arglen)
+ /* Exact match found. */
+ return i;
+ else if (matchind == -1)
+ /* First nonexact match found. */
+ matchind = i;
+ else
+ {
+ /* Second nonexact match found. */
+ if (vallist == NULL
+ || memcmp (vallist + valsize * matchind,
+ vallist + valsize * i, valsize))
+ {
+ /* There is a real ambiguity, or we could not
+ disambiguate. */
+ ambiguous = true;
+ }
+ }
+ }
+ }
+ if (ambiguous)
+ return -2;
+ else
+ return matchind;
+}
+
+/* Error reporting for argmatch.
+ CONTEXT is a description of the type of entity that was being matched.
+ VALUE is the invalid value that was given.
+ PROBLEM is the return value from argmatch. */
+
+void
+argmatch_invalid (const char *context, const char *value, ptrdiff_t problem)
+{
+ char const *format = (problem == -1
+ ? _("invalid argument %s for %s")
+ : _("ambiguous argument %s for %s"));
+
+ error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value),
+ quote_n (1, context));
+}
+
+/* List the valid arguments for argmatch.
+ ARGLIST is the same as in argmatch.
+ VALLIST is a pointer to an array of values.
+ VALSIZE is the size of the elements of VALLIST */
+void
+argmatch_valid (const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i;
+ const char *last_val = NULL;
+
+ /* We try to put synonyms on the same line. The assumption is that
+ synonyms follow each other */
+ fprintf (stderr, _("Valid arguments are:"));
+ for (i = 0; arglist[i]; i++)
+ if ((i == 0)
+ || memcmp (last_val, vallist + valsize * i, valsize))
+ {
+ fprintf (stderr, "\n - `%s'", arglist[i]);
+ last_val = vallist + valsize * i;
+ }
+ else
+ {
+ fprintf (stderr, ", `%s'", arglist[i]);
+ }
+ putc ('\n', stderr);
+}
+
+/* Never failing versions of the previous functions.
+
+ CONTEXT is the context for which argmatch is called (e.g.,
+ "--version-control", or "$VERSION_CONTROL" etc.). Upon failure,
+ calls the (supposed never to return) function EXIT_FN. */
+
+ptrdiff_t
+__xargmatch_internal (const char *context,
+ const char *arg, const char *const *arglist,
+ const char *vallist, size_t valsize,
+ argmatch_exit_fn exit_fn)
+{
+ ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);
+ if (res >= 0)
+ /* Success. */
+ return res;
+
+ /* We failed. Explain why. */
+ argmatch_invalid (context, arg, res);
+ argmatch_valid (arglist, vallist, valsize);
+ (*exit_fn) ();
+
+ return -1; /* To please the compilers. */
+}
+
+/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and
+ return the first corresponding argument in ARGLIST */
+const char *
+argmatch_to_argument (const char *value,
+ const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i;
+
+ for (i = 0; arglist[i]; i++)
+ if (!memcmp (value, vallist + valsize * i, valsize))
+ return arglist[i];
+ return NULL;
+}
+
+#ifdef TEST
+/*
+ * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu>
+ */
+char *program_name;
+
+/* When to make backup files. */
+enum backup_type
+{
+ /* Never make backups. */
+ no_backups,
+
+ /* Make simple backups of every file. */
+ simple_backups,
+
+ /* Make numbered backups of files that already have numbered backups,
+ and simple backups of the others. */
+ numbered_existing_backups,
+
+ /* Make numbered backups of every file. */
+ numbered_backups
+};
+
+/* Two tables describing arguments (keys) and their corresponding
+ values */
+static const char *const backup_args[] =
+{
+ "no", "none", "off",
+ "simple", "never",
+ "existing", "nil",
+ "numbered", "t",
+ 0
+};
+
+static const enum backup_type backup_vals[] =
+{
+ no_backups, no_backups, no_backups,
+ simple_backups, simple_backups,
+ numbered_existing_backups, numbered_existing_backups,
+ numbered_backups, numbered_backups
+};
+
+int
+main (int argc, const char *const *argv)
+{
+ const char *cp;
+ enum backup_type backup_type = no_backups;
+
+ program_name = (char *) argv[0];
+
+ if (argc > 2)
+ {
+ fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name);
+ exit (1);
+ }
+
+ if ((cp = getenv ("VERSION_CONTROL")))
+ backup_type = XARGMATCH ("$VERSION_CONTROL", cp,
+ backup_args, backup_vals);
+
+ if (argc == 2)
+ backup_type = XARGMATCH (program_name, argv[1],
+ backup_args, backup_vals);
+
+ printf ("The version control is `%s'\n",
+ ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));
+
+ return 0;
+}
+#endif
diff --git a/gnulib/lib/argmatch.h b/gnulib/lib/argmatch.h
new file mode 100644
index 00000000..08d555bf
--- /dev/null
+++ b/gnulib/lib/argmatch.h
@@ -0,0 +1,102 @@
+/* argmatch.h -- definitions and prototypes for argmatch.c
+
+ Copyright (C) 1990, 1998, 1999, 2001, 2002, 2004, 2005, 2009, 2010 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/>. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu>
+ Modified by Akim Demaille <demaille@inf.enst.fr> */
+
+#ifndef ARGMATCH_H_
+# define ARGMATCH_H_ 1
+
+# include <stddef.h>
+
+# include "verify.h"
+
+# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
+
+/* Assert there are as many real arguments as there are values
+ (argument list ends with a NULL guard). */
+
+# define ARGMATCH_VERIFY(Arglist, Vallist) \
+ verify (ARRAY_CARDINALITY (Arglist) == ARRAY_CARDINALITY (Vallist) + 1)
+
+/* Return the index of the element of ARGLIST (NULL terminated) that
+ matches with ARG. If VALLIST is not NULL, then use it to resolve
+ false ambiguities (i.e., different matches of ARG but corresponding
+ to the same values in VALLIST). */
+
+ptrdiff_t argmatch (char const *arg, char const *const *arglist,
+ char const *vallist, size_t valsize);
+
+# define ARGMATCH(Arg, Arglist, Vallist) \
+ argmatch (Arg, Arglist, (char const *) (Vallist), sizeof *(Vallist))
+
+/* xargmatch calls this function when it fails. This function should not
+ return. By default, this is a function that calls ARGMATCH_DIE which
+ in turn defaults to `exit (exit_failure)'. */
+typedef void (*argmatch_exit_fn) (void);
+extern argmatch_exit_fn argmatch_die;
+
+/* Report on stderr why argmatch failed. Report correct values. */
+
+void argmatch_invalid (char const *context, char const *value,
+ ptrdiff_t problem);
+
+/* Left for compatibility with the old name invalid_arg */
+
+# define invalid_arg(Context, Value, Problem) \
+ argmatch_invalid (Context, Value, Problem)
+
+
+
+/* Report on stderr the list of possible arguments. */
+
+void argmatch_valid (char const *const *arglist,
+ char const *vallist, size_t valsize);
+
+# define ARGMATCH_VALID(Arglist, Vallist) \
+ argmatch_valid (Arglist, (char const *) (Vallist), sizeof *(Vallist))
+
+
+
+/* Same as argmatch, but upon failure, reports a explanation on the
+ failure, and exits using the function EXIT_FN. */
+
+ptrdiff_t __xargmatch_internal (char const *context,
+ char const *arg, char const *const *arglist,
+ char const *vallist, size_t valsize,
+ argmatch_exit_fn exit_fn);
+
+/* Programmer friendly interface to __xargmatch_internal. */
+
+# define XARGMATCH(Context, Arg, Arglist, Vallist) \
+ ((Vallist) [__xargmatch_internal (Context, Arg, Arglist, \
+ (char const *) (Vallist), \
+ sizeof *(Vallist), \
+ argmatch_die)])
+
+/* Convert a value into a corresponding argument. */
+
+char const *argmatch_to_argument (char const *value,
+ char const *const *arglist,
+ char const *vallist, size_t valsize);
+
+# define ARGMATCH_TO_ARGUMENT(Value, Arglist, Vallist) \
+ argmatch_to_argument (Value, Arglist, \
+ (char const *) (Vallist), sizeof *(Vallist))
+
+#endif /* ARGMATCH_H_ */
diff --git a/gnulib/lib/argp-ba.c b/gnulib/lib/argp-ba.c
new file mode 100644
index 00000000..95feabb8
--- /dev/null
+++ b/gnulib/lib/argp-ba.c
@@ -0,0 +1,34 @@
+/* Default definition for ARGP_PROGRAM_BUG_ADDRESS.
+ Copyright (C) 1996, 1997, 1999, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+/* If set by the user program, it should point to string that is the
+ bug-reporting address for the program. It will be printed by argp_help if
+ the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help
+ messages), embedded in a sentence that says something like `Report bugs to
+ ADDR.'. */
+const char *argp_program_bug_address
+/* This variable should be zero-initialized. On most systems, putting it into
+ BSS is sufficient. Not so on MacOS X 10.3 and 10.4, see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ = (const char *) 0
+#endif
+ ;
diff --git a/gnulib/lib/argp-eexst.c b/gnulib/lib/argp-eexst.c
new file mode 100644
index 00000000..115a8cd5
--- /dev/null
+++ b/gnulib/lib/argp-eexst.c
@@ -0,0 +1,30 @@
+/* Default definition for ARGP_ERR_EXIT_STATUS
+ Copyright (C) 1997, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sysexits.h>
+
+#include "argp.h"
+
+/* The exit status that argp will use when exiting due to a parsing error.
+ If not defined or set by the user program, this defaults to EX_USAGE from
+ <sysexits.h>. */
+error_t argp_err_exit_status = EX_USAGE;
diff --git a/gnulib/lib/argp-fmtstream.c b/gnulib/lib/argp-fmtstream.c
new file mode 100644
index 00000000..70bbebc2
--- /dev/null
+++ b/gnulib/lib/argp-fmtstream.c
@@ -0,0 +1,435 @@
+/* Word-wrapping and line-truncating streams
+ Copyright (C) 1997-1999, 2001-2003, 2005, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+/* This package emulates glibc `line_wrap_stream' semantics for systems that
+ don't have that. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#include "argp-fmtstream.h"
+#include "argp-namefrob.h"
+
+#ifndef ARGP_FMTSTREAM_USE_LINEWRAP
+
+#ifndef isblank
+#define isblank(ch) ((ch)==' ' || (ch)=='\t')
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+# include <libio/libioP.h>
+# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)
+#endif
+
+#define INIT_BUF_SIZE 200
+#define PRINTF_SIZE_GUESS 150
+
+/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
+ written on it with LMARGIN spaces and limits them to RMARGIN columns
+ total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
+ replacing the whitespace before them with a newline and WMARGIN spaces.
+ Otherwise, chars beyond RMARGIN are simply dropped until a newline.
+ Returns NULL if there was an error. */
+argp_fmtstream_t
+__argp_make_fmtstream (FILE *stream,
+ size_t lmargin, size_t rmargin, ssize_t wmargin)
+{
+ argp_fmtstream_t fs;
+
+ fs = (struct argp_fmtstream *) malloc (sizeof (struct argp_fmtstream));
+ if (fs != NULL)
+ {
+ fs->stream = stream;
+
+ fs->lmargin = lmargin;
+ fs->rmargin = rmargin;
+ fs->wmargin = wmargin;
+ fs->point_col = 0;
+ fs->point_offs = 0;
+
+ fs->buf = (char *) malloc (INIT_BUF_SIZE);
+ if (! fs->buf)
+ {
+ free (fs);
+ fs = 0;
+ }
+ else
+ {
+ fs->p = fs->buf;
+ fs->end = fs->buf + INIT_BUF_SIZE;
+ }
+ }
+
+ return fs;
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_make_fmtstream, argp_make_fmtstream)
+#endif
+#endif
+
+/* Flush FS to its stream, and free it (but don't close the stream). */
+void
+__argp_fmtstream_free (argp_fmtstream_t fs)
+{
+ __argp_fmtstream_update (fs);
+ if (fs->p > fs->buf)
+ {
+#ifdef USE_IN_LIBIO
+ __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
+#else
+ fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
+#endif
+ }
+ free (fs->buf);
+ free (fs);
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_fmtstream_free, argp_fmtstream_free)
+#endif
+#endif
+
+/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the
+ end of its buffer. This code is mostly from glibc stdio/linewrap.c. */
+void
+__argp_fmtstream_update (argp_fmtstream_t fs)
+{
+ char *buf, *nl;
+ size_t len;
+
+ /* Scan the buffer for newlines. */
+ buf = fs->buf + fs->point_offs;
+ while (buf < fs->p)
+ {
+ size_t r;
+
+ if (fs->point_col == 0 && fs->lmargin != 0)
+ {
+ /* We are starting a new line. Print spaces to the left margin. */
+ const size_t pad = fs->lmargin;
+ if (fs->p + pad < fs->end)
+ {
+ /* We can fit in them in the buffer by moving the
+ buffer text up and filling in the beginning. */
+ memmove (buf + pad, buf, fs->p - buf);
+ fs->p += pad; /* Compensate for bigger buffer. */
+ memset (buf, ' ', pad); /* Fill in the spaces. */
+ buf += pad; /* Don't bother searching them. */
+ }
+ else
+ {
+ /* No buffer space for spaces. Must flush. */
+ size_t i;
+ for (i = 0; i < pad; i++)
+ {
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (fs->stream, 0) > 0)
+ putwc_unlocked (L' ', fs->stream);
+ else
+#endif
+ putc_unlocked (' ', fs->stream);
+ }
+ }
+ fs->point_col = pad;
+ }
+
+ len = fs->p - buf;
+ nl = memchr (buf, '\n', len);
+
+ if (fs->point_col < 0)
+ fs->point_col = 0;
+
+ if (!nl)
+ {
+ /* The buffer ends in a partial line. */
+
+ if (fs->point_col + len < fs->rmargin)
+ {
+ /* The remaining buffer text is a partial line and fits
+ within the maximum line width. Advance point for the
+ characters to be written and stop scanning. */
+ fs->point_col += len;
+ break;
+ }
+ else
+ /* Set the end-of-line pointer for the code below to
+ the end of the buffer. */
+ nl = fs->p;
+ }
+ else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin)
+ {
+ /* The buffer contains a full line that fits within the maximum
+ line width. Reset point and scan the next line. */
+ fs->point_col = 0;
+ buf = nl + 1;
+ continue;
+ }
+
+ /* This line is too long. */
+ r = fs->rmargin - 1;
+
+ if (fs->wmargin < 0)
+ {
+ /* Truncate the line by overwriting the excess with the
+ newline and anything after it in the buffer. */
+ if (nl < fs->p)
+ {
+ memmove (buf + (r - fs->point_col), nl, fs->p - nl);
+ fs->p -= buf + (r - fs->point_col) - nl;
+ /* Reset point for the next line and start scanning it. */
+ fs->point_col = 0;
+ buf += r + 1; /* Skip full line plus \n. */
+ }
+ else
+ {
+ /* The buffer ends with a partial line that is beyond the
+ maximum line width. Advance point for the characters
+ written, and discard those past the max from the buffer. */
+ fs->point_col += len;
+ fs->p -= fs->point_col - r;
+ break;
+ }
+ }
+ else
+ {
+ /* Do word wrap. Go to the column just past the maximum line
+ width and scan back for the beginning of the word there.
+ Then insert a line break. */
+
+ char *p, *nextline;
+ int i;
+
+ p = buf + (r + 1 - fs->point_col);
+ while (p >= buf && !isblank ((unsigned char) *p))
+ --p;
+ nextline = p + 1; /* This will begin the next line. */
+
+ if (nextline > buf)
+ {
+ /* Swallow separating blanks. */
+ if (p >= buf)
+ do
+ --p;
+ while (p >= buf && isblank ((unsigned char) *p));
+ nl = p + 1; /* The newline will replace the first blank. */
+ }
+ else
+ {
+ /* A single word that is greater than the maximum line width.
+ Oh well. Put it on an overlong line by itself. */
+ p = buf + (r + 1 - fs->point_col);
+ /* Find the end of the long word. */
+ if (p < nl)
+ do
+ ++p;
+ while (p < nl && !isblank ((unsigned char) *p));
+ if (p == nl)
+ {
+ /* It already ends a line. No fussing required. */
+ fs->point_col = 0;
+ buf = nl + 1;
+ continue;
+ }
+ /* We will move the newline to replace the first blank. */
+ nl = p;
+ /* Swallow separating blanks. */
+ do
+ ++p;
+ while (isblank ((unsigned char) *p));
+ /* The next line will start here. */
+ nextline = p;
+ }
+
+ /* Note: There are a bunch of tests below for
+ NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall
+ at the end of the buffer, and NEXTLINE is in fact empty (and so
+ we need not be careful to maintain its contents). */
+
+ if ((nextline == buf + len + 1
+ ? fs->end - nl < fs->wmargin + 1
+ : nextline - (nl + 1) < fs->wmargin)
+ && fs->p > nextline)
+ {
+ /* The margin needs more blanks than we removed. */
+ if (fs->end - fs->p > fs->wmargin + 1)
+ /* Make some space for them. */
+ {
+ size_t mv = fs->p - nextline;
+ memmove (nl + 1 + fs->wmargin, nextline, mv);
+ nextline = nl + 1 + fs->wmargin;
+ len = nextline + mv - buf;
+ *nl++ = '\n';
+ }
+ else
+ /* Output the first line so we can use the space. */
+ {
+#ifdef _LIBC
+ __fxprintf (fs->stream, "%.*s\n",
+ (int) (nl - fs->buf), fs->buf);
+#else
+ if (nl > fs->buf)
+ fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream);
+ putc_unlocked ('\n', fs->stream);
+#endif
+
+ len += buf - fs->buf;
+ nl = buf = fs->buf;
+ }
+ }
+ else
+ /* We can fit the newline and blanks in before
+ the next word. */
+ *nl++ = '\n';
+
+ if (nextline - nl >= fs->wmargin
+ || (nextline == buf + len + 1 && fs->end - nextline >= fs->wmargin))
+ /* Add blanks up to the wrap margin column. */
+ for (i = 0; i < fs->wmargin; ++i)
+ *nl++ = ' ';
+ else
+ for (i = 0; i < fs->wmargin; ++i)
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (fs->stream, 0) > 0)
+ putwc_unlocked (L' ', fs->stream);
+ else
+#endif
+ putc_unlocked (' ', fs->stream);
+
+ /* Copy the tail of the original buffer into the current buffer
+ position. */
+ if (nl < nextline)
+ memmove (nl, nextline, buf + len - nextline);
+ len -= nextline - buf;
+
+ /* Continue the scan on the remaining lines in the buffer. */
+ buf = nl;
+
+ /* Restore bufp to include all the remaining text. */
+ fs->p = nl + len;
+
+ /* Reset the counter of what has been output this line. If wmargin
+ is 0, we want to avoid the lmargin getting added, so we set
+ point_col to a magic value of -1 in that case. */
+ fs->point_col = fs->wmargin ? fs->wmargin : -1;
+ }
+ }
+
+ /* Remember that we've scanned as far as the end of the buffer. */
+ fs->point_offs = fs->p - fs->buf;
+}
+
+/* Ensure that FS has space for AMOUNT more bytes in its buffer, either by
+ growing the buffer, or by flushing it. True is returned iff we succeed. */
+int
+__argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount)
+{
+ if ((size_t) (fs->end - fs->p) < amount)
+ {
+ ssize_t wrote;
+
+ /* Flush FS's buffer. */
+ __argp_fmtstream_update (fs);
+
+#ifdef _LIBC
+ __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
+ wrote = fs->p - fs->buf;
+#else
+ wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
+#endif
+ if (wrote == fs->p - fs->buf)
+ {
+ fs->p = fs->buf;
+ fs->point_offs = 0;
+ }
+ else
+ {
+ fs->p -= wrote;
+ fs->point_offs -= wrote;
+ memmove (fs->buf, fs->buf + wrote, fs->p - fs->buf);
+ return 0;
+ }
+
+ if ((size_t) (fs->end - fs->buf) < amount)
+ /* Gotta grow the buffer. */
+ {
+ size_t old_size = fs->end - fs->buf;
+ size_t new_size = old_size + amount;
+ char *new_buf;
+
+ if (new_size < old_size || ! (new_buf = realloc (fs->buf, new_size)))
+ {
+ __set_errno (ENOMEM);
+ return 0;
+ }
+
+ fs->buf = new_buf;
+ fs->end = new_buf + new_size;
+ fs->p = fs->buf;
+ }
+ }
+
+ return 1;
+}
+
+ssize_t
+__argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...)
+{
+ int out;
+ size_t avail;
+ size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */
+
+ do
+ {
+ va_list args;
+
+ if (! __argp_fmtstream_ensure (fs, size_guess))
+ return -1;
+
+ va_start (args, fmt);
+ avail = fs->end - fs->p;
+ out = __vsnprintf (fs->p, avail, fmt, args);
+ va_end (args);
+ if ((size_t) out >= avail)
+ size_guess = out + 1;
+ }
+ while ((size_t) out >= avail);
+
+ fs->p += out;
+
+ return out;
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf)
+#endif
+#endif
+
+#endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */
diff --git a/gnulib/lib/argp-fmtstream.h b/gnulib/lib/argp-fmtstream.h
new file mode 100644
index 00000000..b913d1b2
--- /dev/null
+++ b/gnulib/lib/argp-fmtstream.h
@@ -0,0 +1,354 @@
+/* Word-wrapping and line-truncating streams.
+ Copyright (C) 1997, 2006-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+/* This package emulates glibc `line_wrap_stream' semantics for systems that
+ don't have that. If the system does have it, it is just a wrapper for
+ that. This header file is only used internally while compiling argp, and
+ shouldn't be installed. */
+
+#ifndef _ARGP_FMTSTREAM_H
+#define _ARGP_FMTSTREAM_H
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifndef __attribute__
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable __attribute__ only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(Spec) /* empty */
+# endif
+#endif
+
+#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \
+ || (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H))
+/* line_wrap_stream is available, so use that. */
+#define ARGP_FMTSTREAM_USE_LINEWRAP
+#endif
+
+#ifdef ARGP_FMTSTREAM_USE_LINEWRAP
+/* Just be a simple wrapper for line_wrap_stream; the semantics are
+ *slightly* different, as line_wrap_stream doesn't actually make a new
+ object, it just modifies the given stream (reversibly) to do
+ line-wrapping. Since we control who uses this code, it doesn't matter. */
+
+#include <linewrap.h>
+
+typedef FILE *argp_fmtstream_t;
+
+#define argp_make_fmtstream line_wrap_stream
+#define __argp_make_fmtstream line_wrap_stream
+#define argp_fmtstream_free line_unwrap_stream
+#define __argp_fmtstream_free line_unwrap_stream
+
+#define __argp_fmtstream_putc(fs,ch) putc(ch,fs)
+#define argp_fmtstream_putc(fs,ch) putc(ch,fs)
+#define __argp_fmtstream_puts(fs,str) fputs(str,fs)
+#define argp_fmtstream_puts(fs,str) fputs(str,fs)
+#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
+#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
+#define __argp_fmtstream_printf fprintf
+#define argp_fmtstream_printf fprintf
+
+#define __argp_fmtstream_lmargin line_wrap_lmargin
+#define argp_fmtstream_lmargin line_wrap_lmargin
+#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin
+#define argp_fmtstream_set_lmargin line_wrap_set_lmargin
+#define __argp_fmtstream_rmargin line_wrap_rmargin
+#define argp_fmtstream_rmargin line_wrap_rmargin
+#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin
+#define argp_fmtstream_set_rmargin line_wrap_set_rmargin
+#define __argp_fmtstream_wmargin line_wrap_wmargin
+#define argp_fmtstream_wmargin line_wrap_wmargin
+#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin
+#define argp_fmtstream_set_wmargin line_wrap_set_wmargin
+#define __argp_fmtstream_point line_wrap_point
+#define argp_fmtstream_point line_wrap_point
+
+#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */
+/* Guess we have to define our own version. */
+
+struct argp_fmtstream
+{
+ FILE *stream; /* The stream we're outputting to. */
+
+ size_t lmargin, rmargin; /* Left and right margins. */
+ ssize_t wmargin; /* Margin to wrap to, or -1 to truncate. */
+
+ /* Point in buffer to which we've processed for wrapping, but not output. */
+ size_t point_offs;
+ /* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin. */
+ ssize_t point_col;
+
+ char *buf; /* Output buffer. */
+ char *p; /* Current end of text in BUF. */
+ char *end; /* Absolute end of BUF. */
+};
+
+typedef struct argp_fmtstream *argp_fmtstream_t;
+
+/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
+ written on it with LMARGIN spaces and limits them to RMARGIN columns
+ total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
+ replacing the whitespace before them with a newline and WMARGIN spaces.
+ Otherwise, chars beyond RMARGIN are simply dropped until a newline.
+ Returns NULL if there was an error. */
+extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream,
+ size_t __lmargin,
+ size_t __rmargin,
+ ssize_t __wmargin);
+extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream,
+ size_t __lmargin,
+ size_t __rmargin,
+ ssize_t __wmargin);
+
+/* Flush __FS to its stream, and free it (but don't close the stream). */
+extern void __argp_fmtstream_free (argp_fmtstream_t __fs);
+extern void argp_fmtstream_free (argp_fmtstream_t __fs);
+
+extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
+ const char *__fmt, ...)
+ __attribute__ ((__format__ (printf, 2, 3)));
+extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,
+ const char *__fmt, ...)
+ __attribute__ ((__format__ (printf, 2, 3)));
+
+#if _LIBC || !defined __OPTIMIZE__
+extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
+extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
+
+extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str);
+extern int argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str);
+
+extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len);
+extern size_t argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len);
+#endif
+
+/* Access macros for various bits of state. */
+#define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin)
+#define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin)
+#define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin)
+#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
+#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
+#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
+
+#if _LIBC || !defined __OPTIMIZE__
+/* Set __FS's left margin to LMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
+ size_t __lmargin);
+extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
+ size_t __lmargin);
+
+/* Set __FS's right margin to __RMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
+ size_t __rmargin);
+extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
+ size_t __rmargin);
+
+/* Set __FS's wrap margin to __WMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
+ size_t __wmargin);
+extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
+ size_t __wmargin);
+
+/* Return the column number of the current output point in __FS. */
+extern size_t argp_fmtstream_point (argp_fmtstream_t __fs);
+extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs);
+#endif
+
+/* Internal routines. */
+extern void _argp_fmtstream_update (argp_fmtstream_t __fs);
+extern void __argp_fmtstream_update (argp_fmtstream_t __fs);
+extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
+extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
+
+#ifdef __OPTIMIZE__
+/* Inline versions of above routines. */
+
+#if !_LIBC
+#define __argp_fmtstream_putc argp_fmtstream_putc
+#define __argp_fmtstream_puts argp_fmtstream_puts
+#define __argp_fmtstream_write argp_fmtstream_write
+#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
+#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
+#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
+#define __argp_fmtstream_point argp_fmtstream_point
+#define __argp_fmtstream_update _argp_fmtstream_update
+#define __argp_fmtstream_ensure _argp_fmtstream_ensure
+#endif
+
+#ifndef ARGP_FS_EI
+# ifdef __GNUC__
+ /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+ inline semantics, unless -fgnu89-inline is used. It defines a macro
+ __GNUC_STDC_INLINE__ to indicate this situation or a macro
+ __GNUC_GNU_INLINE__ to indicate the opposite situation.
+
+ GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+ semantics but warns, unless -fgnu89-inline is used:
+ warning: C99 inline functions are not supported; using GNU89
+ warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+ It defines a macro __GNUC_GNU_INLINE__ to indicate this situation.
+
+ Whereas Apple GCC 4.0.1 build 5479 without -std=c99 or -std=gnu99
+ implements the GNU C inline semantics and defines the macro
+ __GNUC_GNU_INLINE__, but it does not warn and does not support
+ __attribute__ ((__gnu_inline__)).
+
+ All in all, these are the possible combinations. For every compiler,
+ we need to choose ARGP_FS_EI so that the corresponding table cell
+ contains an "ok".
+
+ \ ARGP_FS_EI inline extern extern
+ \ inline inline
+ CC \ __attribute__
+ ((gnu_inline))
+
+ gcc 4.3.0 error ok ok
+ gcc 4.3.0 -std=gnu99 -fgnu89-inline error ok ok
+ gcc 4.3.0 -std=gnu99 ok error ok
+
+ gcc 4.2.2 error ok ok
+ gcc 4.2.2 -std=gnu99 -fgnu89-inline error ok ok
+ gcc 4.2.2 -std=gnu99 error warning ok
+
+ gcc 4.1.2 error ok warning
+ gcc 4.1.2 -std=gnu99 error ok warning
+
+ Apple gcc 4.0.1 error ok warning
+ Apple gcc 4.0.1 -std=gnu99 ok error warning
+ */
+# if defined __GNUC_STDC_INLINE__
+# define ARGP_FS_EI inline
+# elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)
+# define ARGP_FS_EI extern inline __attribute__ ((__gnu_inline__))
+# else
+# define ARGP_FS_EI extern inline
+# endif
+# else
+ /* With other compilers, assume the ISO C99 meaning of 'inline', if
+ the compiler supports 'inline' at all. */
+# define ARGP_FS_EI inline
+# endif
+#endif
+
+ARGP_FS_EI size_t
+__argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len)
+{
+ if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len))
+ {
+ memcpy (__fs->p, __str, __len);
+ __fs->p += __len;
+ return __len;
+ }
+ else
+ return 0;
+}
+
+ARGP_FS_EI int
+__argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str)
+{
+ size_t __len = strlen (__str);
+ if (__len)
+ {
+ size_t __wrote = __argp_fmtstream_write (__fs, __str, __len);
+ return __wrote == __len ? 0 : -1;
+ }
+ else
+ return 0;
+}
+
+ARGP_FS_EI int
+__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch)
+{
+ if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1))
+ return *__fs->p++ = __ch;
+ else
+ return EOF;
+}
+
+/* Set __FS's left margin to __LMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->lmargin;
+ __fs->lmargin = __lmargin;
+ return __old;
+}
+
+/* Set __FS's right margin to __RMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->rmargin;
+ __fs->rmargin = __rmargin;
+ return __old;
+}
+
+/* Set FS's wrap margin to __WMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->wmargin;
+ __fs->wmargin = __wmargin;
+ return __old;
+}
+
+/* Return the column number of the current output point in __FS. */
+ARGP_FS_EI size_t
+__argp_fmtstream_point (argp_fmtstream_t __fs)
+{
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ return __fs->point_col >= 0 ? __fs->point_col : 0;
+}
+
+#if !_LIBC
+#undef __argp_fmtstream_putc
+#undef __argp_fmtstream_puts
+#undef __argp_fmtstream_write
+#undef __argp_fmtstream_set_lmargin
+#undef __argp_fmtstream_set_rmargin
+#undef __argp_fmtstream_set_wmargin
+#undef __argp_fmtstream_point
+#undef __argp_fmtstream_update
+#undef __argp_fmtstream_ensure
+#endif
+
+#endif /* __OPTIMIZE__ */
+
+#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */
+
+#endif /* argp-fmtstream.h */
diff --git a/gnulib/lib/argp-fs-xinl.c b/gnulib/lib/argp-fs-xinl.c
new file mode 100644
index 00000000..2c683f91
--- /dev/null
+++ b/gnulib/lib/argp-fs-xinl.c
@@ -0,0 +1,42 @@
+/* Real definitions for extern inline functions in argp-fmtstream.h
+ Copyright (C) 1997, 2003, 2004, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define ARGP_FS_EI
+#undef __OPTIMIZE__
+#define __OPTIMIZE__ 1
+#include "argp-fmtstream.h"
+
+#if 0
+/* Not exported. */
+/* Add weak aliases. */
+#if _LIBC - 0 && !defined (ARGP_FMTSTREAM_USE_LINEWRAP) && defined (weak_alias)
+
+weak_alias (__argp_fmtstream_putc, argp_fmtstream_putc)
+weak_alias (__argp_fmtstream_puts, argp_fmtstream_puts)
+weak_alias (__argp_fmtstream_write, argp_fmtstream_write)
+weak_alias (__argp_fmtstream_set_lmargin, argp_fmtstream_set_lmargin)
+weak_alias (__argp_fmtstream_set_rmargin, argp_fmtstream_set_rmargin)
+weak_alias (__argp_fmtstream_set_wmargin, argp_fmtstream_set_wmargin)
+weak_alias (__argp_fmtstream_point, argp_fmtstream_point)
+
+#endif
+#endif
diff --git a/gnulib/lib/argp-help.c b/gnulib/lib/argp-help.c
new file mode 100644
index 00000000..8f96c63b
--- /dev/null
+++ b/gnulib/lib/argp-help.c
@@ -0,0 +1,1951 @@
+/* Hierarchial argument parsing help output
+ Copyright (C) 1995-2005, 2007, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <alloca.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <limits.h>
+#ifdef USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+# undef dgettext
+# define dgettext(domain, msgid) \
+ INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
+#else
+# include "gettext.h"
+#endif
+
+#include "argp.h"
+#include "argp-fmtstream.h"
+#include "argp-namefrob.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* User-selectable (using an environment variable) formatting parameters.
+
+ These may be specified in an environment variable called `ARGP_HELP_FMT',
+ with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2
+ Where VALn must be a positive integer. The list of variables is in the
+ UPARAM_NAMES vector, below. */
+
+/* Default parameters. */
+#define DUP_ARGS 0 /* True if option argument can be duplicated. */
+#define DUP_ARGS_NOTE 1 /* True to print a note about duplicate args. */
+#define SHORT_OPT_COL 2 /* column in which short options start */
+#define LONG_OPT_COL 6 /* column in which long options start */
+#define DOC_OPT_COL 2 /* column in which doc options start */
+#define OPT_DOC_COL 29 /* column in which option text starts */
+#define HEADER_COL 1 /* column in which group headers are printed */
+#define USAGE_INDENT 12 /* indentation of wrapped usage lines */
+#define RMARGIN 79 /* right margin used for wrapping */
+
+/* User-selectable (using an environment variable) formatting parameters.
+ They must all be of type `int' for the parsing code to work. */
+struct uparams
+{
+ /* If true, arguments for an option are shown with both short and long
+ options, even when a given option has both, e.g. `-x ARG, --longx=ARG'.
+ If false, then if an option has both, the argument is only shown with
+ the long one, e.g., `-x, --longx=ARG', and a message indicating that
+ this really means both is printed below the options. */
+ int dup_args;
+
+ /* This is true if when DUP_ARGS is false, and some duplicate arguments have
+ been suppressed, an explanatory message should be printed. */
+ int dup_args_note;
+
+ /* Various output columns. */
+ int short_opt_col; /* column in which short options start */
+ int long_opt_col; /* column in which long options start */
+ int doc_opt_col; /* column in which doc options start */
+ int opt_doc_col; /* column in which option text starts */
+ int header_col; /* column in which group headers are printed */
+ int usage_indent; /* indentation of wrapped usage lines */
+ int rmargin; /* right margin used for wrapping */
+
+ int valid; /* True when the values in here are valid. */
+};
+
+/* This is a global variable, as user options are only ever read once. */
+static struct uparams uparams = {
+ DUP_ARGS, DUP_ARGS_NOTE,
+ SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL,
+ USAGE_INDENT, RMARGIN,
+ 0
+};
+
+/* A particular uparam, and what the user name is. */
+struct uparam_name
+{
+ const char *name; /* User name. */
+ int is_bool; /* Whether it's `boolean'. */
+ size_t uparams_offs; /* Location of the (int) field in UPARAMS. */
+};
+
+/* The name-field mappings we know about. */
+static const struct uparam_name uparam_names[] =
+{
+ { "dup-args", 1, offsetof (struct uparams, dup_args) },
+ { "dup-args-note", 1, offsetof (struct uparams, dup_args_note) },
+ { "short-opt-col", 0, offsetof (struct uparams, short_opt_col) },
+ { "long-opt-col", 0, offsetof (struct uparams, long_opt_col) },
+ { "doc-opt-col", 0, offsetof (struct uparams, doc_opt_col) },
+ { "opt-doc-col", 0, offsetof (struct uparams, opt_doc_col) },
+ { "header-col", 0, offsetof (struct uparams, header_col) },
+ { "usage-indent", 0, offsetof (struct uparams, usage_indent) },
+ { "rmargin", 0, offsetof (struct uparams, rmargin) },
+ { 0 }
+};
+
+static void
+validate_uparams (const struct argp_state *state, struct uparams *upptr)
+{
+ const struct uparam_name *up;
+
+ for (up = uparam_names; up->name; up++)
+ {
+ if (up->is_bool
+ || up->uparams_offs == offsetof (struct uparams, rmargin))
+ continue;
+ if (*(int *)((char *)upptr + up->uparams_offs) >= upptr->rmargin)
+ {
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+ARGP_HELP_FMT: %s value is less than or equal to %s"),
+ "rmargin", up->name);
+ return;
+ }
+ }
+ uparams = *upptr;
+ uparams.valid = 1;
+}
+
+/* Read user options from the environment, and fill in UPARAMS appropiately. */
+static void
+fill_in_uparams (const struct argp_state *state)
+{
+ const char *var = getenv ("ARGP_HELP_FMT");
+ struct uparams new_params = uparams;
+
+#define SKIPWS(p) do { while (isspace ((unsigned char) *p)) p++; } while (0);
+
+ if (var)
+ {
+ /* Parse var. */
+ while (*var)
+ {
+ SKIPWS (var);
+
+ if (isalpha ((unsigned char) *var))
+ {
+ size_t var_len;
+ const struct uparam_name *un;
+ int unspec = 0, val = 0;
+ const char *arg = var;
+
+ while (isalnum ((unsigned char) *arg) || *arg == '-' || *arg == '_')
+ arg++;
+ var_len = arg - var;
+
+ SKIPWS (arg);
+
+ if (*arg == '\0' || *arg == ',')
+ unspec = 1;
+ else if (*arg == '=')
+ {
+ arg++;
+ SKIPWS (arg);
+ }
+
+ if (unspec)
+ {
+ if (var[0] == 'n' && var[1] == 'o' && var[2] == '-')
+ {
+ val = 0;
+ var += 3;
+ var_len -= 3;
+ }
+ else
+ val = 1;
+ }
+ else if (isdigit ((unsigned char) *arg))
+ {
+ val = atoi (arg);
+ while (isdigit ((unsigned char) *arg))
+ arg++;
+ SKIPWS (arg);
+ }
+
+ for (un = uparam_names; un->name; un++)
+ if (strlen (un->name) == var_len
+ && strncmp (var, un->name, var_len) == 0)
+ {
+ if (unspec && !un->is_bool)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+%.*s: ARGP_HELP_FMT parameter requires a value"),
+ (int) var_len, var);
+ else if (val < 0)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+%.*s: ARGP_HELP_FMT parameter must be positive"),
+ (int) var_len, var);
+ else
+ *(int *)((char *)&new_params + un->uparams_offs) = val;
+ break;
+ }
+ if (! un->name)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain, "\
+%.*s: Unknown ARGP_HELP_FMT parameter"),
+ (int) var_len, var);
+
+ var = arg;
+ if (*var == ',')
+ var++;
+ }
+ else if (*var)
+ {
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "Garbage in ARGP_HELP_FMT: %s"), var);
+ break;
+ }
+ }
+ validate_uparams (state, &new_params);
+ }
+}
+
+/* Returns true if OPT hasn't been marked invisible. Visibility only affects
+ whether OPT is displayed or used in sorting, not option shadowing. */
+#define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN))
+
+/* Returns true if OPT is an alias for an earlier option. */
+#define oalias(opt) ((opt)->flags & OPTION_ALIAS)
+
+/* Returns true if OPT is an documentation-only entry. */
+#define odoc(opt) ((opt)->flags & OPTION_DOC)
+
+/* Returns true if OPT should not be translated */
+#define onotrans(opt) ((opt)->flags & OPTION_NO_TRANS)
+
+/* Returns true if OPT is the end-of-list marker for a list of options. */
+#define oend(opt) __option_is_end (opt)
+
+/* Returns true if OPT has a short option. */
+#define oshort(opt) __option_is_short (opt)
+
+/*
+ The help format for a particular option is like:
+
+ -xARG, -yARG, --long1=ARG, --long2=ARG Documentation...
+
+ Where ARG will be omitted if there's no argument, for this option, or
+ will be surrounded by "[" and "]" appropiately if the argument is
+ optional. The documentation string is word-wrapped appropiately, and if
+ the list of options is long enough, it will be started on a separate line.
+ If there are no short options for a given option, the first long option is
+ indented slighly in a way that's supposed to make most long options appear
+ to be in a separate column.
+
+ For example, the following output (from ps):
+
+ -p PID, --pid=PID List the process PID
+ --pgrp=PGRP List processes in the process group PGRP
+ -P, -x, --no-parent Include processes without parents
+ -Q, --all-fields Don't elide unusable fields (normally if there's
+ some reason ps can't print a field for any
+ process, it's removed from the output entirely)
+ -r, --reverse, --gratuitously-long-reverse-option
+ Reverse the order of any sort
+ --session[=SID] Add the processes from the session SID (which
+ defaults to the sid of the current process)
+
+ Here are some more options:
+ -f ZOT, --foonly=ZOT Glork a foonly
+ -z, --zaza Snit a zar
+
+ -?, --help Give this help list
+ --usage Give a short usage message
+ -V, --version Print program version
+
+ The struct argp_option array for the above could look like:
+
+ {
+ {"pid", 'p', "PID", 0, "List the process PID"},
+ {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"},
+ {"no-parent", 'P', 0, 0, "Include processes without parents"},
+ {0, 'x', 0, OPTION_ALIAS},
+ {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally"
+ " if there's some reason ps can't"
+ " print a field for any process, it's"
+ " removed from the output entirely)" },
+ {"reverse", 'r', 0, 0, "Reverse the order of any sort"},
+ {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS},
+ {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL,
+ "Add the processes from the session"
+ " SID (which defaults to the sid of"
+ " the current process)" },
+
+ {0,0,0,0, "Here are some more options:"},
+ {"foonly", 'f', "ZOT", 0, "Glork a foonly"},
+ {"zaza", 'z', 0, 0, "Snit a zar"},
+
+ {0}
+ }
+
+ Note that the last three options are automatically supplied by argp_parse,
+ unless you tell it not to with ARGP_NO_HELP.
+
+*/
+
+/* Returns true if CH occurs between BEG and END. */
+static int
+find_char (char ch, char *beg, char *end)
+{
+ while (beg < end)
+ if (*beg == ch)
+ return 1;
+ else
+ beg++;
+ return 0;
+}
+
+struct hol_cluster; /* fwd decl */
+
+struct hol_entry
+{
+ /* First option. */
+ const struct argp_option *opt;
+ /* Number of options (including aliases). */
+ unsigned num;
+
+ /* A pointers into the HOL's short_options field, to the first short option
+ letter for this entry. The order of the characters following this point
+ corresponds to the order of options pointed to by OPT, and there are at
+ most NUM. A short option recorded in a option following OPT is only
+ valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's
+ probably been shadowed by some other entry). */
+ char *short_options;
+
+ /* Entries are sorted by their group first, in the order:
+ 1, 2, ..., n, 0, -m, ..., -2, -1
+ and then alphabetically within each group. The default is 0. */
+ int group;
+
+ /* The cluster of options this entry belongs to, or 0 if none. */
+ struct hol_cluster *cluster;
+
+ /* The argp from which this option came. */
+ const struct argp *argp;
+
+ /* Position in the array */
+ unsigned ord;
+};
+
+/* A cluster of entries to reflect the argp tree structure. */
+struct hol_cluster
+{
+ /* A descriptive header printed before options in this cluster. */
+ const char *header;
+
+ /* Used to order clusters within the same group with the same parent,
+ according to the order in which they occurred in the parent argp's child
+ list. */
+ int index;
+
+ /* How to sort this cluster with respect to options and other clusters at the
+ same depth (clusters always follow options in the same group). */
+ int group;
+
+ /* The cluster to which this cluster belongs, or 0 if it's at the base
+ level. */
+ struct hol_cluster *parent;
+
+ /* The argp from which this cluster is (eventually) derived. */
+ const struct argp *argp;
+
+ /* The distance this cluster is from the root. */
+ int depth;
+
+ /* Clusters in a given hol are kept in a linked list, to make freeing them
+ possible. */
+ struct hol_cluster *next;
+};
+
+/* A list of options for help. */
+struct hol
+{
+ /* An array of hol_entry's. */
+ struct hol_entry *entries;
+ /* The number of entries in this hol. If this field is zero, the others
+ are undefined. */
+ unsigned num_entries;
+
+ /* A string containing all short options in this HOL. Each entry contains
+ pointers into this string, so the order can't be messed with blindly. */
+ char *short_options;
+
+ /* Clusters of entries in this hol. */
+ struct hol_cluster *clusters;
+};
+
+/* Create a struct hol from the options in ARGP. CLUSTER is the
+ hol_cluster in which these entries occur, or 0, if at the root. */
+static struct hol *
+make_hol (const struct argp *argp, struct hol_cluster *cluster)
+{
+ char *so;
+ const struct argp_option *o;
+ const struct argp_option *opts = argp->options;
+ struct hol_entry *entry;
+ unsigned num_short_options = 0;
+ struct hol *hol = malloc (sizeof (struct hol));
+
+ assert (hol);
+
+ hol->num_entries = 0;
+ hol->clusters = 0;
+
+ if (opts)
+ {
+ int cur_group = 0;
+
+ /* The first option must not be an alias. */
+ assert (! oalias (opts));
+
+ /* Calculate the space needed. */
+ for (o = opts; ! oend (o); o++)
+ {
+ if (! oalias (o))
+ hol->num_entries++;
+ if (oshort (o))
+ num_short_options++; /* This is an upper bound. */
+ }
+
+ hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries);
+ hol->short_options = malloc (num_short_options + 1);
+
+ assert (hol->entries && hol->short_options);
+ if (SIZE_MAX <= UINT_MAX)
+ assert (hol->num_entries <= SIZE_MAX / sizeof (struct hol_entry));
+
+ /* Fill in the entries. */
+ so = hol->short_options;
+ for (o = opts, entry = hol->entries; ! oend (o); entry++)
+ {
+ entry->opt = o;
+ entry->num = 0;
+ entry->short_options = so;
+ entry->group = cur_group =
+ o->group
+ ? o->group
+ : ((!o->name && !o->key)
+ ? cur_group + 1
+ : cur_group);
+ entry->cluster = cluster;
+ entry->argp = argp;
+
+ do
+ {
+ entry->num++;
+ if (oshort (o) && ! find_char (o->key, hol->short_options, so))
+ /* O has a valid short option which hasn't already been used.*/
+ *so++ = o->key;
+ o++;
+ }
+ while (! oend (o) && oalias (o));
+ }
+ *so = '\0'; /* null terminated so we can find the length */
+ }
+
+ return hol;
+}
+
+/* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the
+ associated argp child list entry), INDEX, and PARENT, and return a pointer
+ to it. ARGP is the argp that this cluster results from. */
+static struct hol_cluster *
+hol_add_cluster (struct hol *hol, int group, const char *header, int index,
+ struct hol_cluster *parent, const struct argp *argp)
+{
+ struct hol_cluster *cl = malloc (sizeof (struct hol_cluster));
+ if (cl)
+ {
+ cl->group = group;
+ cl->header = header;
+
+ cl->index = index;
+ cl->parent = parent;
+ cl->argp = argp;
+ cl->depth = parent ? parent->depth + 1 : 0;
+
+ cl->next = hol->clusters;
+ hol->clusters = cl;
+ }
+ return cl;
+}
+
+/* Free HOL and any resources it uses. */
+static void
+hol_free (struct hol *hol)
+{
+ struct hol_cluster *cl = hol->clusters;
+
+ while (cl)
+ {
+ struct hol_cluster *next = cl->next;
+ free (cl);
+ cl = next;
+ }
+
+ if (hol->num_entries > 0)
+ {
+ free (hol->entries);
+ free (hol->short_options);
+ }
+
+ free (hol);
+}
+
+static int
+hol_entry_short_iterate (const struct hol_entry *entry,
+ int (*func)(const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie),
+ const char *domain, void *cookie)
+{
+ unsigned nopts;
+ int val = 0;
+ const struct argp_option *opt, *real = entry->opt;
+ char *so = entry->short_options;
+
+ for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
+ if (oshort (opt) && *so == opt->key)
+ {
+ if (!oalias (opt))
+ real = opt;
+ if (ovisible (opt))
+ val = (*func)(opt, real, domain, cookie);
+ so++;
+ }
+
+ return val;
+}
+
+static inline int
+__attribute__ ((always_inline))
+hol_entry_long_iterate (const struct hol_entry *entry,
+ int (*func)(const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie),
+ const char *domain, void *cookie)
+{
+ unsigned nopts;
+ int val = 0;
+ const struct argp_option *opt, *real = entry->opt;
+
+ for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
+ if (opt->name)
+ {
+ if (!oalias (opt))
+ real = opt;
+ if (ovisible (opt))
+ val = (*func)(opt, real, domain, cookie);
+ }
+
+ return val;
+}
+
+/* Iterator that returns true for the first short option. */
+static int
+until_short (const struct argp_option *opt, const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ return oshort (opt) ? opt->key : 0;
+}
+
+/* Returns the first valid short option in ENTRY, or 0 if there is none. */
+static char
+hol_entry_first_short (const struct hol_entry *entry)
+{
+ return hol_entry_short_iterate (entry, until_short,
+ entry->argp->argp_domain, 0);
+}
+
+/* Returns the first valid long option in ENTRY, or 0 if there is none. */
+static const char *
+hol_entry_first_long (const struct hol_entry *entry)
+{
+ const struct argp_option *opt;
+ unsigned num;
+ for (opt = entry->opt, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ return opt->name;
+ return 0;
+}
+
+/* Returns the entry in HOL with the long option name NAME, or 0 if there is
+ none. */
+static struct hol_entry *
+hol_find_entry (struct hol *hol, const char *name)
+{
+ struct hol_entry *entry = hol->entries;
+ unsigned num_entries = hol->num_entries;
+
+ while (num_entries-- > 0)
+ {
+ const struct argp_option *opt = entry->opt;
+ unsigned num_opts = entry->num;
+
+ while (num_opts-- > 0)
+ if (opt->name && ovisible (opt) && strcmp (opt->name, name) == 0)
+ return entry;
+ else
+ opt++;
+
+ entry++;
+ }
+
+ return 0;
+}
+
+/* If an entry with the long option NAME occurs in HOL, set it's special
+ sort position to GROUP. */
+static void
+hol_set_group (struct hol *hol, const char *name, int group)
+{
+ struct hol_entry *entry = hol_find_entry (hol, name);
+ if (entry)
+ entry->group = group;
+}
+
+/* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1.
+ EQ is what to return if GROUP1 and GROUP2 are the same. */
+static int
+group_cmp (int group1, int group2, int eq)
+{
+ if (group1 == group2)
+ return eq;
+ else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0))
+ return group1 - group2;
+ else
+ return group2 - group1;
+}
+
+/* Compare clusters CL1 & CL2 by the order that they should appear in
+ output. */
+static int
+hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2)
+{
+ /* If one cluster is deeper than the other, use its ancestor at the same
+ level, so that finding the common ancestor is straightforward.
+
+ clN->depth > 0 means that clN->parent != NULL (see hol_add_cluster) */
+ while (cl1->depth > cl2->depth)
+ cl1 = cl1->parent;
+ while (cl2->depth > cl1->depth)
+ cl2 = cl2->parent;
+
+ /* Now reduce both clusters to their ancestors at the point where both have
+ a common parent; these can be directly compared. */
+ while (cl1->parent != cl2->parent)
+ cl1 = cl1->parent, cl2 = cl2->parent;
+
+ return group_cmp (cl1->group, cl2->group, cl2->index - cl1->index);
+}
+
+/* Return the ancestor of CL that's just below the root (i.e., has a parent
+ of 0). */
+static struct hol_cluster *
+hol_cluster_base (struct hol_cluster *cl)
+{
+ while (cl->parent)
+ cl = cl->parent;
+ return cl;
+}
+
+/* Return true if CL1 is a child of CL2. */
+static int
+hol_cluster_is_child (const struct hol_cluster *cl1,
+ const struct hol_cluster *cl2)
+{
+ while (cl1 && cl1 != cl2)
+ cl1 = cl1->parent;
+ return cl1 == cl2;
+}
+
+/* Given the name of a OPTION_DOC option, modifies NAME to start at the tail
+ that should be used for comparisons, and returns true iff it should be
+ treated as a non-option. */
+static int
+canon_doc_option (const char **name)
+{
+ int non_opt;
+
+ if (!*name)
+ non_opt = 1;
+ else
+ {
+ /* Skip initial whitespace. */
+ while (isspace ((unsigned char) **name))
+ (*name)++;
+ /* Decide whether this looks like an option (leading `-') or not. */
+ non_opt = (**name != '-');
+ /* Skip until part of name used for sorting. */
+ while (**name && !isalnum ((unsigned char) **name))
+ (*name)++;
+ }
+ return non_opt;
+}
+
+#define HOL_ENTRY_PTRCMP(a,b) ((a)->ord < (b)->ord ? -1 : 1)
+
+/* Order ENTRY1 & ENTRY2 by the order which they should appear in a help
+ listing. */
+static int
+hol_entry_cmp (const struct hol_entry *entry1,
+ const struct hol_entry *entry2)
+{
+ /* The group numbers by which the entries should be ordered; if either is
+ in a cluster, then this is just the group within the cluster. */
+ int group1 = entry1->group, group2 = entry2->group;
+ int rc;
+
+ if (entry1->cluster != entry2->cluster)
+ {
+ /* The entries are not within the same cluster, so we can't compare them
+ directly, we have to use the appropiate clustering level too. */
+ if (! entry1->cluster)
+ /* ENTRY1 is at the `base level', not in a cluster, so we have to
+ compare it's group number with that of the base cluster in which
+ ENTRY2 resides. Note that if they're in the same group, the
+ clustered option always comes laster. */
+ return group_cmp (group1, hol_cluster_base (entry2->cluster)->group, -1);
+ else if (! entry2->cluster)
+ /* Likewise, but ENTRY2's not in a cluster. */
+ return group_cmp (hol_cluster_base (entry1->cluster)->group, group2, 1);
+ else
+ /* Both entries are in clusters, we can just compare the clusters. */
+ return (rc = hol_cluster_cmp (entry1->cluster, entry2->cluster)) ?
+ rc : HOL_ENTRY_PTRCMP(entry1, entry2);
+ }
+ else if (group1 == group2)
+ /* The entries are both in the same cluster and group, so compare them
+ alphabetically. */
+ {
+ int short1 = hol_entry_first_short (entry1);
+ int short2 = hol_entry_first_short (entry2);
+ int doc1 = odoc (entry1->opt);
+ int doc2 = odoc (entry2->opt);
+ const char *long1 = hol_entry_first_long (entry1);
+ const char *long2 = hol_entry_first_long (entry2);
+
+ if (doc1)
+ doc1 = canon_doc_option (&long1);
+ if (doc2)
+ doc2 = canon_doc_option (&long2);
+
+ if (doc1 != doc2)
+ /* `documentation' options always follow normal options (or
+ documentation options that *look* like normal options). */
+ return doc1 - doc2;
+ else if (!short1 && !short2 && long1 && long2)
+ /* Only long options. */
+ return (rc = __strcasecmp (long1, long2)) ?
+ rc : HOL_ENTRY_PTRCMP(entry1, entry2);
+ else
+ /* Compare short/short, long/short, short/long, using the first
+ character of long options. Entries without *any* valid
+ options (such as options with OPTION_HIDDEN set) will be put
+ first, but as they're not displayed, it doesn't matter where
+ they are. */
+ {
+ unsigned char first1 = short1 ? short1 : long1 ? *long1 : 0;
+ unsigned char first2 = short2 ? short2 : long2 ? *long2 : 0;
+ /* Use tolower, not _tolower, since only the former is
+ guaranteed to work on something already lower case. */
+ int lower_cmp = tolower (first1) - tolower (first2);
+ /* Compare ignoring case, except when the options are both the
+ same letter, in which case lower-case always comes first. */
+ return lower_cmp ? lower_cmp :
+ (rc = first2 - first1) ?
+ rc : HOL_ENTRY_PTRCMP(entry1, entry2);
+ }
+ }
+ else
+ /* Within the same cluster, but not the same group, so just compare
+ groups. */
+ return group_cmp (group1, group2, HOL_ENTRY_PTRCMP(entry1, entry2));
+}
+
+/* Version of hol_entry_cmp with correct signature for qsort. */
+static int
+hol_entry_qcmp (const void *entry1_v, const void *entry2_v)
+{
+ return hol_entry_cmp (entry1_v, entry2_v);
+}
+
+/* Sort HOL by group and alphabetically by option name (with short options
+ taking precedence over long). Since the sorting is for display purposes
+ only, the shadowing of options isn't effected. */
+static void
+hol_sort (struct hol *hol)
+{
+ if (hol->num_entries > 0)
+ {
+ unsigned i;
+ struct hol_entry *e;
+ for (i = 0, e = hol->entries; i < hol->num_entries; i++, e++)
+ e->ord = i;
+ qsort (hol->entries, hol->num_entries, sizeof (struct hol_entry),
+ hol_entry_qcmp);
+ }
+}
+
+/* Append MORE to HOL, destroying MORE in the process. Options in HOL shadow
+ any in MORE with the same name. */
+static void
+hol_append (struct hol *hol, struct hol *more)
+{
+ struct hol_cluster **cl_end = &hol->clusters;
+
+ /* Steal MORE's cluster list, and add it to the end of HOL's. */
+ while (*cl_end)
+ cl_end = &(*cl_end)->next;
+ *cl_end = more->clusters;
+ more->clusters = 0;
+
+ /* Merge entries. */
+ if (more->num_entries > 0)
+ {
+ if (hol->num_entries == 0)
+ {
+ hol->num_entries = more->num_entries;
+ hol->entries = more->entries;
+ hol->short_options = more->short_options;
+ more->num_entries = 0; /* Mark MORE's fields as invalid. */
+ }
+ else
+ /* Append the entries in MORE to those in HOL, taking care to only add
+ non-shadowed SHORT_OPTIONS values. */
+ {
+ unsigned left;
+ char *so, *more_so;
+ struct hol_entry *e;
+ unsigned num_entries = hol->num_entries + more->num_entries;
+ struct hol_entry *entries =
+ malloc (num_entries * sizeof (struct hol_entry));
+ unsigned hol_so_len = strlen (hol->short_options);
+ char *short_options =
+ malloc (hol_so_len + strlen (more->short_options) + 1);
+
+ assert (entries && short_options);
+ if (SIZE_MAX <= UINT_MAX)
+ assert (num_entries <= SIZE_MAX / sizeof (struct hol_entry));
+
+ __mempcpy (__mempcpy (entries, hol->entries,
+ hol->num_entries * sizeof (struct hol_entry)),
+ more->entries,
+ more->num_entries * sizeof (struct hol_entry));
+
+ __mempcpy (short_options, hol->short_options, hol_so_len);
+
+ /* Fix up the short options pointers from HOL. */
+ for (e = entries, left = hol->num_entries; left > 0; e++, left--)
+ e->short_options += (short_options - hol->short_options);
+
+ /* Now add the short options from MORE, fixing up its entries
+ too. */
+ so = short_options + hol_so_len;
+ more_so = more->short_options;
+ for (left = more->num_entries; left > 0; e++, left--)
+ {
+ int opts_left;
+ const struct argp_option *opt;
+
+ e->short_options = so;
+
+ for (opts_left = e->num, opt = e->opt; opts_left; opt++, opts_left--)
+ {
+ int ch = *more_so;
+ if (oshort (opt) && ch == opt->key)
+ /* The next short option in MORE_SO, CH, is from OPT. */
+ {
+ if (! find_char (ch, short_options,
+ short_options + hol_so_len))
+ /* The short option CH isn't shadowed by HOL's options,
+ so add it to the sum. */
+ *so++ = ch;
+ more_so++;
+ }
+ }
+ }
+
+ *so = '\0';
+
+ free (hol->entries);
+ free (hol->short_options);
+
+ hol->entries = entries;
+ hol->num_entries = num_entries;
+ hol->short_options = short_options;
+ }
+ }
+
+ hol_free (more);
+}
+
+/* Inserts enough spaces to make sure STREAM is at column COL. */
+static void
+indent_to (argp_fmtstream_t stream, unsigned col)
+{
+ int needed = col - __argp_fmtstream_point (stream);
+ while (needed-- > 0)
+ __argp_fmtstream_putc (stream, ' ');
+}
+
+/* Output to STREAM either a space, or a newline if there isn't room for at
+ least ENSURE characters before the right margin. */
+static void
+space (argp_fmtstream_t stream, size_t ensure)
+{
+ if (__argp_fmtstream_point (stream) + ensure
+ >= __argp_fmtstream_rmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+ else
+ __argp_fmtstream_putc (stream, ' ');
+}
+
+/* If the option REAL has an argument, we print it in using the printf
+ format REQ_FMT or OPT_FMT depending on whether it's a required or
+ optional argument. */
+static void
+arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt,
+ const char *domain, argp_fmtstream_t stream)
+{
+ if (real->arg)
+ {
+ if (real->flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, opt_fmt,
+ dgettext (domain, real->arg));
+ else
+ __argp_fmtstream_printf (stream, req_fmt,
+ dgettext (domain, real->arg));
+ }
+}
+
+/* Helper functions for hol_entry_help. */
+
+/* State used during the execution of hol_help. */
+struct hol_help_state
+{
+ /* PREV_ENTRY should contain the previous entry printed, or 0. */
+ struct hol_entry *prev_entry;
+
+ /* If an entry is in a different group from the previous one, and SEP_GROUPS
+ is true, then a blank line will be printed before any output. */
+ int sep_groups;
+
+ /* True if a duplicate option argument was suppressed (only ever set if
+ UPARAMS.dup_args is false). */
+ int suppressed_dup_arg;
+};
+
+/* Some state used while printing a help entry (used to communicate with
+ helper functions). See the doc for hol_entry_help for more info, as most
+ of the fields are copied from its arguments. */
+struct pentry_state
+{
+ const struct hol_entry *entry;
+ argp_fmtstream_t stream;
+ struct hol_help_state *hhstate;
+
+ /* True if nothing's been printed so far. */
+ int first;
+
+ /* If non-zero, the state that was used to print this help. */
+ const struct argp_state *state;
+};
+
+/* If a user doc filter should be applied to DOC, do so. */
+static const char *
+filter_doc (const char *doc, int key, const struct argp *argp,
+ const struct argp_state *state)
+{
+ if (argp->help_filter)
+ /* We must apply a user filter to this output. */
+ {
+ void *input = __argp_input (argp, state);
+ return (*argp->help_filter) (key, doc, input);
+ }
+ else
+ /* No filter. */
+ return doc;
+}
+
+/* Prints STR as a header line, with the margin lines set appropiately, and
+ notes the fact that groups should be separated with a blank line. ARGP is
+ the argp that should dictate any user doc filtering to take place. Note
+ that the previous wrap margin isn't restored, but the left margin is reset
+ to 0. */
+static void
+print_header (const char *str, const struct argp *argp,
+ struct pentry_state *pest)
+{
+ const char *tstr = dgettext (argp->argp_domain, str);
+ const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state);
+
+ if (fstr)
+ {
+ if (*fstr)
+ {
+ if (pest->hhstate->prev_entry)
+ /* Precede with a blank line. */
+ __argp_fmtstream_putc (pest->stream, '\n');
+ indent_to (pest->stream, uparams.header_col);
+ __argp_fmtstream_set_lmargin (pest->stream, uparams.header_col);
+ __argp_fmtstream_set_wmargin (pest->stream, uparams.header_col);
+ __argp_fmtstream_puts (pest->stream, fstr);
+ __argp_fmtstream_set_lmargin (pest->stream, 0);
+ __argp_fmtstream_putc (pest->stream, '\n');
+ }
+
+ pest->hhstate->sep_groups = 1; /* Separate subsequent groups. */
+ }
+
+ if (fstr != tstr)
+ free ((char *) fstr);
+}
+
+/* Inserts a comma if this isn't the first item on the line, and then makes
+ sure we're at least to column COL. If this *is* the first item on a line,
+ prints any pending whitespace/headers that should precede this line. Also
+ clears FIRST. */
+static void
+comma (unsigned col, struct pentry_state *pest)
+{
+ if (pest->first)
+ {
+ const struct hol_entry *pe = pest->hhstate->prev_entry;
+ const struct hol_cluster *cl = pest->entry->cluster;
+
+ if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group)
+ __argp_fmtstream_putc (pest->stream, '\n');
+
+ if (cl && cl->header && *cl->header
+ && (!pe
+ || (pe->cluster != cl
+ && !hol_cluster_is_child (pe->cluster, cl))))
+ /* If we're changing clusters, then this must be the start of the
+ ENTRY's cluster unless that is an ancestor of the previous one
+ (in which case we had just popped into a sub-cluster for a bit).
+ If so, then print the cluster's header line. */
+ {
+ int old_wm = __argp_fmtstream_wmargin (pest->stream);
+ print_header (cl->header, cl->argp, pest);
+ __argp_fmtstream_set_wmargin (pest->stream, old_wm);
+ }
+
+ pest->first = 0;
+ }
+ else
+ __argp_fmtstream_puts (pest->stream, ", ");
+
+ indent_to (pest->stream, col);
+}
+
+/* Print help for ENTRY to STREAM. */
+static void
+hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
+ argp_fmtstream_t stream, struct hol_help_state *hhstate)
+{
+ unsigned num;
+ const struct argp_option *real = entry->opt, *opt;
+ char *so = entry->short_options;
+ int have_long_opt = 0; /* We have any long options. */
+ /* Saved margins. */
+ int old_lm = __argp_fmtstream_set_lmargin (stream, 0);
+ int old_wm = __argp_fmtstream_wmargin (stream);
+ /* PEST is a state block holding some of our variables that we'd like to
+ share with helper functions. */
+ struct pentry_state pest;
+
+ pest.entry = entry;
+ pest.stream = stream;
+ pest.hhstate = hhstate;
+ pest.first = 1;
+ pest.state = state;
+
+ if (! odoc (real))
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ {
+ have_long_opt = 1;
+ break;
+ }
+
+ /* First emit short options. */
+ __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (oshort (opt) && opt->key == *so)
+ /* OPT has a valid (non shadowed) short option. */
+ {
+ if (ovisible (opt))
+ {
+ comma (uparams.short_opt_col, &pest);
+ __argp_fmtstream_putc (stream, '-');
+ __argp_fmtstream_putc (stream, *so);
+ if (!have_long_opt || uparams.dup_args)
+ arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream);
+ else if (real->arg)
+ hhstate->suppressed_dup_arg = 1;
+ }
+ so++;
+ }
+
+ /* Now, long options. */
+ if (odoc (real))
+ /* A `documentation' option. */
+ {
+ __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col);
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && *opt->name && ovisible (opt))
+ {
+ comma (uparams.doc_opt_col, &pest);
+ /* Calling dgettext here isn't quite right, since sorting will
+ have been done on the original; but documentation options
+ should be pretty rare anyway... */
+ __argp_fmtstream_puts (stream,
+ onotrans (opt) ?
+ opt->name :
+ dgettext (state->root_argp->argp_domain,
+ opt->name));
+ }
+ }
+ else
+ /* A real long option. */
+ {
+ int first_long_opt = 1;
+
+ __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col);
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ {
+ comma (uparams.long_opt_col, &pest);
+ __argp_fmtstream_printf (stream, "--%s", opt->name);
+ if (first_long_opt || uparams.dup_args)
+ arg (real, "=%s", "[=%s]", state->root_argp->argp_domain,
+ stream);
+ else if (real->arg)
+ hhstate->suppressed_dup_arg = 1;
+ }
+ }
+
+ /* Next, documentation strings. */
+ __argp_fmtstream_set_lmargin (stream, 0);
+
+ if (pest.first)
+ {
+ /* Didn't print any switches, what's up? */
+ if (!oshort (real) && !real->name)
+ /* This is a group header, print it nicely. */
+ print_header (real->doc, entry->argp, &pest);
+ else
+ /* Just a totally shadowed option or null header; print nothing. */
+ goto cleanup; /* Just return, after cleaning up. */
+ }
+ else
+ {
+ const char *tstr = real->doc ? dgettext (state->root_argp->argp_domain,
+ real->doc) : 0;
+ const char *fstr = filter_doc (tstr, real->key, entry->argp, state);
+ if (fstr && *fstr)
+ {
+ unsigned int col = __argp_fmtstream_point (stream);
+
+ __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col);
+ __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col);
+
+ if (col > (unsigned int) (uparams.opt_doc_col + 3))
+ __argp_fmtstream_putc (stream, '\n');
+ else if (col >= (unsigned int) uparams.opt_doc_col)
+ __argp_fmtstream_puts (stream, " ");
+ else
+ indent_to (stream, uparams.opt_doc_col);
+
+ __argp_fmtstream_puts (stream, fstr);
+ }
+ if (fstr && fstr != tstr)
+ free ((char *) fstr);
+
+ /* Reset the left margin. */
+ __argp_fmtstream_set_lmargin (stream, 0);
+ __argp_fmtstream_putc (stream, '\n');
+ }
+
+ hhstate->prev_entry = entry;
+
+cleanup:
+ __argp_fmtstream_set_lmargin (stream, old_lm);
+ __argp_fmtstream_set_wmargin (stream, old_wm);
+}
+
+/* Output a long help message about the options in HOL to STREAM. */
+static void
+hol_help (struct hol *hol, const struct argp_state *state,
+ argp_fmtstream_t stream)
+{
+ unsigned num;
+ struct hol_entry *entry;
+ struct hol_help_state hhstate = { 0, 0, 0 };
+
+ for (entry = hol->entries, num = hol->num_entries; num > 0; entry++, num--)
+ hol_entry_help (entry, state, stream, &hhstate);
+
+ if (hhstate.suppressed_dup_arg && uparams.dup_args_note)
+ {
+ const char *tstr = dgettext (state->root_argp->argp_domain, "\
+Mandatory or optional arguments to long options are also mandatory or \
+optional for any corresponding short options.");
+ const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE,
+ state ? state->root_argp : 0, state);
+ if (fstr && *fstr)
+ {
+ __argp_fmtstream_putc (stream, '\n');
+ __argp_fmtstream_puts (stream, fstr);
+ __argp_fmtstream_putc (stream, '\n');
+ }
+ if (fstr && fstr != tstr)
+ free ((char *) fstr);
+ }
+}
+
+/* Helper functions for hol_usage. */
+
+/* If OPT is a short option without an arg, append its key to the string
+ pointer pointer to by COOKIE, and advance the pointer. */
+static int
+add_argless_short_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ char **snao_end = cookie;
+ if (!(opt->arg || real->arg)
+ && !((opt->flags | real->flags) & OPTION_NO_USAGE))
+ *(*snao_end)++ = opt->key;
+ return 0;
+}
+
+/* If OPT is a short option with an arg, output a usage entry for it to the
+ stream pointed at by COOKIE. */
+static int
+usage_argful_short_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ argp_fmtstream_t stream = cookie;
+ const char *arg = opt->arg;
+ int flags = opt->flags | real->flags;
+
+ if (! arg)
+ arg = real->arg;
+
+ if (arg && !(flags & OPTION_NO_USAGE))
+ {
+ arg = dgettext (domain, arg);
+
+ if (flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg);
+ else
+ {
+ /* Manually do line wrapping so that it (probably) won't
+ get wrapped at the embedded space. */
+ space (stream, 6 + strlen (arg));
+ __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg);
+ }
+ }
+
+ return 0;
+}
+
+/* Output a usage entry for the long option opt to the stream pointed at by
+ COOKIE. */
+static int
+usage_long_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ argp_fmtstream_t stream = cookie;
+ const char *arg = opt->arg;
+ int flags = opt->flags | real->flags;
+
+ if (! arg)
+ arg = real->arg;
+
+ if (! (flags & OPTION_NO_USAGE) && !odoc (opt))
+ {
+ if (arg)
+ {
+ arg = dgettext (domain, arg);
+ if (flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg);
+ else
+ __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg);
+ }
+ else
+ __argp_fmtstream_printf (stream, " [--%s]", opt->name);
+ }
+
+ return 0;
+}
+
+/* Print a short usage description for the arguments in HOL to STREAM. */
+static void
+hol_usage (struct hol *hol, argp_fmtstream_t stream)
+{
+ if (hol->num_entries > 0)
+ {
+ unsigned nentries;
+ struct hol_entry *entry;
+ char *short_no_arg_opts = alloca (strlen (hol->short_options) + 1);
+ char *snao_end = short_no_arg_opts;
+
+ /* First we put a list of short options without arguments. */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_short_iterate (entry, add_argless_short_opt,
+ entry->argp->argp_domain, &snao_end);
+ if (snao_end > short_no_arg_opts)
+ {
+ *snao_end++ = 0;
+ __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts);
+ }
+
+ /* Now a list of short options *with* arguments. */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_short_iterate (entry, usage_argful_short_opt,
+ entry->argp->argp_domain, stream);
+
+ /* Finally, a list of long options (whew!). */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_long_iterate (entry, usage_long_opt,
+ entry->argp->argp_domain, stream);
+ }
+}
+
+/* Make a HOL containing all levels of options in ARGP. CLUSTER is the
+ cluster in which ARGP's entries should be clustered, or 0. */
+static struct hol *
+argp_hol (const struct argp *argp, struct hol_cluster *cluster)
+{
+ const struct argp_child *child = argp->children;
+ struct hol *hol = make_hol (argp, cluster);
+ if (child)
+ while (child->argp)
+ {
+ struct hol_cluster *child_cluster =
+ ((child->group || child->header)
+ /* Put CHILD->argp within its own cluster. */
+ ? hol_add_cluster (hol, child->group, child->header,
+ child - argp->children, cluster, argp)
+ /* Just merge it into the parent's cluster. */
+ : cluster);
+ hol_append (hol, argp_hol (child->argp, child_cluster)) ;
+ child++;
+ }
+ return hol;
+}
+
+/* Calculate how many different levels with alternative args strings exist in
+ ARGP. */
+static size_t
+argp_args_levels (const struct argp *argp)
+{
+ size_t levels = 0;
+ const struct argp_child *child = argp->children;
+
+ if (argp->args_doc && strchr (argp->args_doc, '\n'))
+ levels++;
+
+ if (child)
+ while (child->argp)
+ levels += argp_args_levels ((child++)->argp);
+
+ return levels;
+}
+
+/* Print all the non-option args documented in ARGP to STREAM. Any output is
+ preceded by a space. LEVELS is a pointer to a byte vector the length
+ returned by argp_args_levels; it should be initialized to zero, and
+ updated by this routine for the next call if ADVANCE is true. True is
+ returned as long as there are more patterns to output. */
+static int
+argp_args_usage (const struct argp *argp, const struct argp_state *state,
+ char **levels, int advance, argp_fmtstream_t stream)
+{
+ char *our_level = *levels;
+ int multiple = 0;
+ const struct argp_child *child = argp->children;
+ const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0;
+ const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state);
+
+ if (fdoc)
+ {
+ const char *cp = fdoc;
+ nl = __strchrnul (cp, '\n');
+ if (*nl != '\0')
+ /* This is a `multi-level' args doc; advance to the correct position
+ as determined by our state in LEVELS, and update LEVELS. */
+ {
+ int i;
+ multiple = 1;
+ for (i = 0; i < *our_level; i++)
+ cp = nl + 1, nl = __strchrnul (cp, '\n');
+ (*levels)++;
+ }
+
+ /* Manually do line wrapping so that it (probably) won't get wrapped at
+ any embedded spaces. */
+ space (stream, 1 + nl - cp);
+
+ __argp_fmtstream_write (stream, cp, nl - cp);
+ }
+ if (fdoc && fdoc != tdoc)
+ free ((char *)fdoc); /* Free user's modified doc string. */
+
+ if (child)
+ while (child->argp)
+ advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream);
+
+ if (advance && multiple)
+ {
+ /* Need to increment our level. */
+ if (*nl)
+ /* There's more we can do here. */
+ {
+ (*our_level)++;
+ advance = 0; /* Our parent shouldn't advance also. */
+ }
+ else if (*our_level > 0)
+ /* We had multiple levels, but used them up; reset to zero. */
+ *our_level = 0;
+ }
+
+ return !advance;
+}
+
+/* Print the documentation for ARGP to STREAM; if POST is false, then
+ everything preceeding a `\v' character in the documentation strings (or
+ the whole string, for those with none) is printed, otherwise, everything
+ following the `\v' character (nothing for strings without). Each separate
+ bit of documentation is separated a blank line, and if PRE_BLANK is true,
+ then the first is as well. If FIRST_ONLY is true, only the first
+ occurrence is output. Returns true if anything was output. */
+static int
+argp_doc (const struct argp *argp, const struct argp_state *state,
+ int post, int pre_blank, int first_only,
+ argp_fmtstream_t stream)
+{
+ const char *text;
+ const char *inp_text;
+ size_t inp_text_len = 0;
+ const char *trans_text;
+ void *input = 0;
+ int anything = 0;
+ const struct argp_child *child = argp->children;
+
+ if (argp->doc)
+ {
+ char *vt = strchr (argp->doc, '\v');
+ if (vt)
+ {
+ if (post)
+ inp_text = vt + 1;
+ else
+ {
+ inp_text_len = vt - argp->doc;
+ inp_text = __strndup (argp->doc, inp_text_len);
+ }
+ }
+ else
+ inp_text = post ? 0 : argp->doc;
+ trans_text = inp_text ? dgettext (argp->argp_domain, inp_text) : NULL;
+ }
+ else
+ trans_text = inp_text = 0;
+
+ if (argp->help_filter)
+ /* We have to filter the doc strings. */
+ {
+ input = __argp_input (argp, state);
+ text =
+ (*argp->help_filter) (post
+ ? ARGP_KEY_HELP_POST_DOC
+ : ARGP_KEY_HELP_PRE_DOC,
+ trans_text, input);
+ }
+ else
+ text = (const char *) trans_text;
+
+ if (text)
+ {
+ if (pre_blank)
+ __argp_fmtstream_putc (stream, '\n');
+
+ __argp_fmtstream_puts (stream, text);
+
+ if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+
+ anything = 1;
+ }
+
+ if (text && text != trans_text)
+ free ((char *) text); /* Free TEXT returned from the help filter. */
+
+ if (inp_text && inp_text_len)
+ free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */
+
+ if (post && argp->help_filter)
+ /* Now see if we have to output a ARGP_KEY_HELP_EXTRA text. */
+ {
+ text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input);
+ if (text)
+ {
+ if (anything || pre_blank)
+ __argp_fmtstream_putc (stream, '\n');
+ __argp_fmtstream_puts (stream, text);
+ free ((char *) text);
+ if (__argp_fmtstream_point (stream)
+ > __argp_fmtstream_lmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+ anything = 1;
+ }
+ }
+
+ if (child)
+ while (child->argp && !(first_only && anything))
+ anything |=
+ argp_doc ((child++)->argp, state,
+ post, anything || pre_blank, first_only,
+ stream);
+
+ return anything;
+}
+
+/* Output a usage message for ARGP to STREAM. If called from
+ argp_state_help, STATE is the relevent parsing state. FLAGS are from the
+ set ARGP_HELP_*. NAME is what to use wherever a `program name' is
+ needed. */
+static void
+_help (const struct argp *argp, const struct argp_state *state, FILE *stream,
+ unsigned flags, char *name)
+{
+ int anything = 0; /* Whether we've output anything. */
+ struct hol *hol = 0;
+ argp_fmtstream_t fs;
+
+ if (! stream)
+ return;
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+ if (! uparams.valid)
+ fill_in_uparams (state);
+
+ fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0);
+ if (! fs)
+ {
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+ return;
+ }
+
+ if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG))
+ {
+ hol = argp_hol (argp, 0);
+
+ /* If present, these options always come last. */
+ hol_set_group (hol, "help", -1);
+ hol_set_group (hol, "version", -1);
+
+ hol_sort (hol);
+ }
+
+ if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE))
+ /* Print a short `Usage:' message. */
+ {
+ int first_pattern = 1, more_patterns;
+ size_t num_pattern_levels = argp_args_levels (argp);
+ char *pattern_levels = alloca (num_pattern_levels);
+
+ memset (pattern_levels, 0, num_pattern_levels);
+
+ do
+ {
+ int old_lm;
+ int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent);
+ char *levels = pattern_levels;
+
+ if (first_pattern)
+ __argp_fmtstream_printf (fs, "%s %s",
+ dgettext (argp->argp_domain, "Usage:"),
+ name);
+ else
+ __argp_fmtstream_printf (fs, "%s %s",
+ dgettext (argp->argp_domain, " or: "),
+ name);
+
+ /* We set the lmargin as well as the wmargin, because hol_usage
+ manually wraps options with newline to avoid annoying breaks. */
+ old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent);
+
+ if (flags & ARGP_HELP_SHORT_USAGE)
+ /* Just show where the options go. */
+ {
+ if (hol->num_entries > 0)
+ __argp_fmtstream_puts (fs, dgettext (argp->argp_domain,
+ " [OPTION...]"));
+ }
+ else
+ /* Actually print the options. */
+ {
+ hol_usage (hol, fs);
+ flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once. */
+ }
+
+ more_patterns = argp_args_usage (argp, state, &levels, 1, fs);
+
+ __argp_fmtstream_set_wmargin (fs, old_wm);
+ __argp_fmtstream_set_lmargin (fs, old_lm);
+
+ __argp_fmtstream_putc (fs, '\n');
+ anything = 1;
+
+ first_pattern = 0;
+ }
+ while (more_patterns);
+ }
+
+ if (flags & ARGP_HELP_PRE_DOC)
+ anything |= argp_doc (argp, state, 0, 0, 1, fs);
+
+ if (flags & ARGP_HELP_SEE)
+ {
+ __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\
+Try `%s --help' or `%s --usage' for more information.\n"),
+ name, name);
+ anything = 1;
+ }
+
+ if (flags & ARGP_HELP_LONG)
+ /* Print a long, detailed help message. */
+ {
+ /* Print info about all the options. */
+ if (hol->num_entries > 0)
+ {
+ if (anything)
+ __argp_fmtstream_putc (fs, '\n');
+ hol_help (hol, state, fs);
+ anything = 1;
+ }
+ }
+
+ if (flags & ARGP_HELP_POST_DOC)
+ /* Print any documentation strings at the end. */
+ anything |= argp_doc (argp, state, 1, anything, 0, fs);
+
+ if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address)
+ {
+ if (anything)
+ __argp_fmtstream_putc (fs, '\n');
+ __argp_fmtstream_printf (fs, dgettext (argp->argp_domain,
+ "Report bugs to %s.\n"),
+ argp_program_bug_address);
+ anything = 1;
+ }
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+
+ if (hol)
+ hol_free (hol);
+
+ __argp_fmtstream_free (fs);
+}
+
+/* Output a usage message for ARGP to STREAM. FLAGS are from the set
+ ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */
+void __argp_help (const struct argp *argp, FILE *stream,
+ unsigned flags, char *name)
+{
+ struct argp_state state;
+ memset (&state, 0, sizeof state);
+ state.root_argp = argp;
+ _help (argp, &state, stream, flags, name);
+}
+#ifdef weak_alias
+weak_alias (__argp_help, argp_help)
+#endif
+
+#if ! (defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME)
+char *
+__argp_short_program_name (void)
+{
+# if HAVE_DECL_PROGRAM_INVOCATION_NAME
+ return __argp_base_name (program_invocation_name);
+# else
+ /* FIXME: What now? Miles suggests that it is better to use NULL,
+ but currently the value is passed on directly to fputs_unlocked,
+ so that requires more changes. */
+# if __GNUC__
+# warning No reasonable value to return
+# endif /* __GNUC__ */
+ return "";
+# endif
+}
+#endif
+
+/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
+ from the set ARGP_HELP_*. */
+void
+__argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)
+{
+ if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream)
+ {
+ if (state && (state->flags & ARGP_LONG_ONLY))
+ flags |= ARGP_HELP_LONG_ONLY;
+
+ _help (state ? state->root_argp : 0, state, stream, flags,
+ state ? state->name : __argp_short_program_name ());
+
+ if (!state || ! (state->flags & ARGP_NO_EXIT))
+ {
+ if (flags & ARGP_HELP_EXIT_ERR)
+ exit (argp_err_exit_status);
+ if (flags & ARGP_HELP_EXIT_OK)
+ exit (0);
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_state_help, argp_state_help)
+#endif
+
+/* If appropriate, print the printf string FMT and following args, preceded
+ by the program name and `:', to stderr, and followed by a `Try ... --help'
+ message, then exit (1). */
+void
+__argp_error (const struct argp_state *state, const char *fmt, ...)
+{
+ if (!state || !(state->flags & ARGP_NO_ERRS))
+ {
+ FILE *stream = state ? state->err_stream : stderr;
+
+ if (stream)
+ {
+ va_list ap;
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+ va_start (ap, fmt);
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ {
+ char *buf;
+
+ if (__asprintf (&buf, fmt, ap) < 0)
+ buf = NULL;
+
+ __fwprintf (stream, L"%s: %s\n",
+ state ? state->name : __argp_short_program_name (),
+ buf);
+
+ free (buf);
+ }
+ else
+#endif
+ {
+ fputs_unlocked (state
+ ? state->name : __argp_short_program_name (),
+ stream);
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+
+ vfprintf (stream, fmt, ap);
+
+ putc_unlocked ('\n', stream);
+ }
+
+ __argp_state_help (state, stream, ARGP_HELP_STD_ERR);
+
+ va_end (ap);
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_error, argp_error)
+#endif
+
+/* Similar to the standard gnu error-reporting function error(), but will
+ respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
+ to STATE->err_stream. This is useful for argument parsing code that is
+ shared between program startup (when exiting is desired) and runtime
+ option parsing (when typically an error code is returned instead). The
+ difference between this function and argp_error is that the latter is for
+ *parsing errors*, and the former is for other problems that occur during
+ parsing but don't reflect a (syntactic) problem with the input. */
+void
+__argp_failure (const struct argp_state *state, int status, int errnum,
+ const char *fmt, ...)
+{
+ if (!state || !(state->flags & ARGP_NO_ERRS))
+ {
+ FILE *stream = state ? state->err_stream : stderr;
+
+ if (stream)
+ {
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ __fwprintf (stream, L"%s",
+ state ? state->name : __argp_short_program_name ());
+ else
+#endif
+ fputs_unlocked (state
+ ? state->name : __argp_short_program_name (),
+ stream);
+
+ if (fmt)
+ {
+ va_list ap;
+
+ va_start (ap, fmt);
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ {
+ char *buf;
+
+ if (__asprintf (&buf, fmt, ap) < 0)
+ buf = NULL;
+
+ __fwprintf (stream, L": %s", buf);
+
+ free (buf);
+ }
+ else
+#endif
+ {
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+
+ vfprintf (stream, fmt, ap);
+ }
+
+ va_end (ap);
+ }
+
+ if (errnum)
+ {
+ char buf[200];
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ __fwprintf (stream, L": %s",
+ __strerror_r (errnum, buf, sizeof (buf)));
+ else
+#endif
+ {
+ char const *s = NULL;
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+#if _LIBC || (HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P)
+ s = __strerror_r (errnum, buf, sizeof buf);
+#elif HAVE_DECL_STRERROR_R
+ if (__strerror_r (errnum, buf, sizeof buf) == 0)
+ s = buf;
+#endif
+#if !_LIBC
+ if (! s && ! (s = strerror (errnum)))
+ s = dgettext (state->root_argp->argp_domain,
+ "Unknown system error");
+#endif
+ fputs (s, stream);
+ }
+ }
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ putwc_unlocked (L'\n', stream);
+ else
+#endif
+ putc_unlocked ('\n', stream);
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+
+ if (status && (!state || !(state->flags & ARGP_NO_EXIT)))
+ exit (status);
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_failure, argp_failure)
+#endif
diff --git a/gnulib/lib/argp-namefrob.h b/gnulib/lib/argp-namefrob.h
new file mode 100644
index 00000000..38a35f1c
--- /dev/null
+++ b/gnulib/lib/argp-namefrob.h
@@ -0,0 +1,157 @@
+/* Name frobnication for compiling argp outside of glibc
+ Copyright (C) 1997, 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+#if !_LIBC
+/* This code is written for inclusion in gnu-libc, and uses names in the
+ namespace reserved for libc. If we're not compiling in libc, define those
+ names to be the normal ones instead. */
+
+/* argp-parse functions */
+#undef __argp_parse
+#define __argp_parse argp_parse
+#undef __option_is_end
+#define __option_is_end _option_is_end
+#undef __option_is_short
+#define __option_is_short _option_is_short
+#undef __argp_input
+#define __argp_input _argp_input
+
+/* argp-help functions */
+#undef __argp_help
+#define __argp_help argp_help
+#undef __argp_error
+#define __argp_error argp_error
+#undef __argp_failure
+#define __argp_failure argp_failure
+#undef __argp_state_help
+#define __argp_state_help argp_state_help
+#undef __argp_usage
+#define __argp_usage argp_usage
+
+/* argp-fmtstream functions */
+#undef __argp_make_fmtstream
+#define __argp_make_fmtstream argp_make_fmtstream
+#undef __argp_fmtstream_free
+#define __argp_fmtstream_free argp_fmtstream_free
+#undef __argp_fmtstream_putc
+#define __argp_fmtstream_putc argp_fmtstream_putc
+#undef __argp_fmtstream_puts
+#define __argp_fmtstream_puts argp_fmtstream_puts
+#undef __argp_fmtstream_write
+#define __argp_fmtstream_write argp_fmtstream_write
+#undef __argp_fmtstream_printf
+#define __argp_fmtstream_printf argp_fmtstream_printf
+#undef __argp_fmtstream_set_lmargin
+#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
+#undef __argp_fmtstream_set_rmargin
+#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
+#undef __argp_fmtstream_set_wmargin
+#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
+#undef __argp_fmtstream_point
+#define __argp_fmtstream_point argp_fmtstream_point
+#undef __argp_fmtstream_update
+#define __argp_fmtstream_update _argp_fmtstream_update
+#undef __argp_fmtstream_ensure
+#define __argp_fmtstream_ensure _argp_fmtstream_ensure
+#undef __argp_fmtstream_lmargin
+#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
+#undef __argp_fmtstream_rmargin
+#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
+#undef __argp_fmtstream_wmargin
+#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
+
+/* normal libc functions we call */
+#undef __flockfile
+#define __flockfile flockfile
+#undef __funlockfile
+#define __funlockfile funlockfile
+#undef __mempcpy
+#define __mempcpy mempcpy
+#undef __sleep
+#define __sleep sleep
+#undef __strcasecmp
+#define __strcasecmp strcasecmp
+#undef __strchrnul
+#define __strchrnul strchrnul
+#undef __strerror_r
+#define __strerror_r strerror_r
+#undef __strndup
+#define __strndup strndup
+#undef __vsnprintf
+#define __vsnprintf vsnprintf
+
+#if defined(HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED
+# define clearerr_unlocked(x) clearerr (x)
+#endif
+#if defined(HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED
+# define feof_unlocked(x) feof (x)
+# endif
+#if defined(HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED
+# define ferror_unlocked(x) ferror (x)
+# endif
+#if defined(HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED
+# define fflush_unlocked(x) fflush (x)
+# endif
+#if defined(HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED
+# define fgets_unlocked(x,y,z) fgets (x,y,z)
+# endif
+#if defined(HAVE_DECL_FPUTC_UNLOCKED) && !HAVE_DECL_FPUTC_UNLOCKED
+# define fputc_unlocked(x,y) fputc (x,y)
+# endif
+#if defined(HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED
+# define fputs_unlocked(x,y) fputs (x,y)
+# endif
+#if defined(HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED
+# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
+# endif
+#if defined(HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED
+# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
+# endif
+#if defined(HAVE_DECL_GETC_UNLOCKED) && !HAVE_DECL_GETC_UNLOCKED
+# define getc_unlocked(x) getc (x)
+# endif
+#if defined(HAVE_DECL_GETCHAR_UNLOCKED) && !HAVE_DECL_GETCHAR_UNLOCKED
+# define getchar_unlocked() getchar ()
+# endif
+#if defined(HAVE_DECL_PUTC_UNLOCKED) && !HAVE_DECL_PUTC_UNLOCKED
+# define putc_unlocked(x,y) putc (x,y)
+# endif
+#if defined(HAVE_DECL_PUTCHAR_UNLOCKED) && !HAVE_DECL_PUTCHAR_UNLOCKED
+# define putchar_unlocked(x) putchar (x)
+# endif
+
+#endif /* !_LIBC */
+
+#ifndef __set_errno
+#define __set_errno(e) (errno = (e))
+#endif
+
+#if defined GNULIB_ARGP_DISABLE_DIRNAME
+# define __argp_base_name(arg) arg
+#elif defined GNULIB_ARGP_EXTERN_BASENAME
+extern char *__argp_base_name(const char *arg);
+#else
+# include "dirname.h"
+# define __argp_base_name last_component
+#endif
+
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+# define __argp_short_program_name() (program_invocation_short_name)
+#else
+extern char *__argp_short_program_name (void);
+#endif
diff --git a/gnulib/lib/argp-parse.c b/gnulib/lib/argp-parse.c
new file mode 100644
index 00000000..a1cbf884
--- /dev/null
+++ b/gnulib/lib/argp-parse.c
@@ -0,0 +1,952 @@
+/* Hierarchial argument parsing, layered over getopt
+ Copyright (C) 1995-2000, 2002-2004, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <alloca.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+#include <getopt.h>
+#include <getopt_int.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+# undef dgettext
+# define dgettext(domain, msgid) \
+ INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
+#else
+# include "gettext.h"
+#endif
+#define N_(msgid) msgid
+
+#include "argp.h"
+#include "argp-namefrob.h"
+
+#define alignof(type) offsetof (struct { char c; type x; }, x)
+#define alignto(n, d) ((((n) + (d) - 1) / (d)) * (d))
+
+/* Getopt return values. */
+#define KEY_END (-1) /* The end of the options. */
+#define KEY_ARG 1 /* A non-option argument. */
+#define KEY_ERR '?' /* An error parsing the options. */
+
+/* The meta-argument used to prevent any further arguments being interpreted
+ as options. */
+#define QUOTE "--"
+
+/* The number of bits we steal in a long-option value for our own use. */
+#define GROUP_BITS CHAR_BIT
+
+/* The number of bits available for the user value. */
+#define USER_BITS ((sizeof ((struct option *)0)->val * CHAR_BIT) - GROUP_BITS)
+#define USER_MASK ((1 << USER_BITS) - 1)
+
+/* EZ alias for ARGP_ERR_UNKNOWN. */
+#define EBADKEY ARGP_ERR_UNKNOWN
+
+/* Default options. */
+
+/* When argp is given the --HANG switch, _ARGP_HANG is set and argp will sleep
+ for one second intervals, decrementing _ARGP_HANG until it's zero. Thus
+ you can force the program to continue by attaching a debugger and setting
+ it to 0 yourself. */
+static volatile int _argp_hang;
+
+#define OPT_PROGNAME -2
+#define OPT_USAGE -3
+#define OPT_HANG -4
+
+static const struct argp_option argp_default_options[] =
+{
+ {"help", '?', 0, 0, N_("give this help list"), -1},
+ {"usage", OPT_USAGE, 0, 0, N_("give a short usage message"), 0},
+ {"program-name",OPT_PROGNAME,N_("NAME"), OPTION_HIDDEN, N_("set the program name"), 0},
+ {"HANG", OPT_HANG, N_("SECS"), OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
+ N_("hang for SECS seconds (default 3600)"), 0},
+ {NULL, 0, 0, 0, NULL, 0}
+};
+
+static error_t
+argp_default_parser (int key, char *arg, struct argp_state *state)
+{
+ switch (key)
+ {
+ case '?':
+ __argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP);
+ break;
+ case OPT_USAGE:
+ __argp_state_help (state, state->out_stream,
+ ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK);
+ break;
+
+ case OPT_PROGNAME: /* Set the program name. */
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_NAME
+ program_invocation_name = arg;
+#endif
+ /* [Note that some systems only have PROGRAM_INVOCATION_SHORT_NAME (aka
+ __PROGNAME), in which case, PROGRAM_INVOCATION_NAME is just defined
+ to be that, so we have to be a bit careful here.] */
+
+ /* Update what we use for messages. */
+ state->name = __argp_base_name (arg);
+
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ program_invocation_short_name = state->name;
+#endif
+
+ if ((state->flags & (ARGP_PARSE_ARGV0 | ARGP_NO_ERRS))
+ == ARGP_PARSE_ARGV0)
+ /* Update what getopt uses too. */
+ state->argv[0] = arg;
+
+ break;
+
+ case OPT_HANG:
+ _argp_hang = atoi (arg ? arg : "3600");
+ while (_argp_hang-- > 0)
+ __sleep (1);
+ break;
+
+ default:
+ return EBADKEY;
+ }
+ return 0;
+}
+
+static const struct argp argp_default_argp =
+ {argp_default_options, &argp_default_parser, NULL, NULL, NULL, NULL, "libc"};
+
+
+static const struct argp_option argp_version_options[] =
+{
+ {"version", 'V', 0, 0, N_("print program version"), -1},
+ {NULL, 0, 0, 0, NULL, 0}
+};
+
+static error_t
+argp_version_parser (int key, char *arg, struct argp_state *state)
+{
+ switch (key)
+ {
+ case 'V':
+ if (argp_program_version_hook)
+ (*argp_program_version_hook) (state->out_stream, state);
+ else if (argp_program_version)
+ fprintf (state->out_stream, "%s\n", argp_program_version);
+ else
+ __argp_error (state, dgettext (state->root_argp->argp_domain,
+ "(PROGRAM ERROR) No version known!?"));
+ if (! (state->flags & ARGP_NO_EXIT))
+ exit (0);
+ break;
+ default:
+ return EBADKEY;
+ }
+ return 0;
+}
+
+static const struct argp argp_version_argp =
+ {argp_version_options, &argp_version_parser, NULL, NULL, NULL, NULL, "libc"};
+
+/* Returns the offset into the getopt long options array LONG_OPTIONS of a
+ long option with called NAME, or -1 if none is found. Passing NULL as
+ NAME will return the number of options. */
+static int
+find_long_option (struct option *long_options, const char *name)
+{
+ struct option *l = long_options;
+ while (l->name != NULL)
+ if (name != NULL && strcmp (l->name, name) == 0)
+ return l - long_options;
+ else
+ l++;
+ if (name == NULL)
+ return l - long_options;
+ else
+ return -1;
+}
+
+
+/* The state of a `group' during parsing. Each group corresponds to a
+ particular argp structure from the tree of such descending from the top
+ level argp passed to argp_parse. */
+struct group
+{
+ /* This group's parsing function. */
+ argp_parser_t parser;
+
+ /* Which argp this group is from. */
+ const struct argp *argp;
+
+ /* Points to the point in SHORT_OPTS corresponding to the end of the short
+ options for this group. We use it to determine from which group a
+ particular short options is from. */
+ char *short_end;
+
+ /* The number of non-option args sucessfully handled by this parser. */
+ unsigned args_processed;
+
+ /* This group's parser's parent's group. */
+ struct group *parent;
+ unsigned parent_index; /* And the our position in the parent. */
+
+ /* These fields are swapped into and out of the state structure when
+ calling this group's parser. */
+ void *input, **child_inputs;
+ void *hook;
+};
+
+/* Call GROUP's parser with KEY and ARG, swapping any group-specific info
+ from STATE before calling, and back into state afterwards. If GROUP has
+ no parser, EBADKEY is returned. */
+static error_t
+group_parse (struct group *group, struct argp_state *state, int key, char *arg)
+{
+ if (group->parser)
+ {
+ error_t err;
+ state->hook = group->hook;
+ state->input = group->input;
+ state->child_inputs = group->child_inputs;
+ state->arg_num = group->args_processed;
+ err = (*group->parser)(key, arg, state);
+ group->hook = state->hook;
+ return err;
+ }
+ else
+ return EBADKEY;
+}
+
+struct parser
+{
+ const struct argp *argp;
+
+ /* SHORT_OPTS is the getopt short options string for the union of all the
+ groups of options. */
+ char *short_opts;
+ /* LONG_OPTS is the array of getop long option structures for the union of
+ all the groups of options. */
+ struct option *long_opts;
+ /* OPT_DATA is the getopt data used for the re-entrant getopt. */
+ struct _getopt_data opt_data;
+
+ /* States of the various parsing groups. */
+ struct group *groups;
+ /* The end of the GROUPS array. */
+ struct group *egroup;
+ /* An vector containing storage for the CHILD_INPUTS field in all groups. */
+ void **child_inputs;
+
+ /* True if we think using getopt is still useful; if false, then
+ remaining arguments are just passed verbatim with ARGP_KEY_ARG. This is
+ cleared whenever getopt returns KEY_END, but may be set again if the user
+ moves the next argument pointer backwards. */
+ int try_getopt;
+
+ /* State block supplied to parsing routines. */
+ struct argp_state state;
+
+ /* Memory used by this parser. */
+ void *storage;
+};
+
+/* The next usable entries in the various parser tables being filled in by
+ convert_options. */
+struct parser_convert_state
+{
+ struct parser *parser;
+ char *short_end;
+ struct option *long_end;
+ void **child_inputs_end;
+};
+
+/* Converts all options in ARGP (which is put in GROUP) and ancestors
+ into getopt options stored in SHORT_OPTS and LONG_OPTS; SHORT_END and
+ CVT->LONG_END are the points at which new options are added. Returns the
+ next unused group entry. CVT holds state used during the conversion. */
+static struct group *
+convert_options (const struct argp *argp,
+ struct group *parent, unsigned parent_index,
+ struct group *group, struct parser_convert_state *cvt)
+{
+ /* REAL is the most recent non-alias value of OPT. */
+ const struct argp_option *real = argp->options;
+ const struct argp_child *children = argp->children;
+
+ if (real || argp->parser)
+ {
+ const struct argp_option *opt;
+
+ if (real)
+ for (opt = real; !__option_is_end (opt); opt++)
+ {
+ if (! (opt->flags & OPTION_ALIAS))
+ /* OPT isn't an alias, so we can use values from it. */
+ real = opt;
+
+ if (! (real->flags & OPTION_DOC))
+ /* A real option (not just documentation). */
+ {
+ if (__option_is_short (opt))
+ /* OPT can be used as a short option. */
+ {
+ *cvt->short_end++ = opt->key;
+ if (real->arg)
+ {
+ *cvt->short_end++ = ':';
+ if (real->flags & OPTION_ARG_OPTIONAL)
+ *cvt->short_end++ = ':';
+ }
+ *cvt->short_end = '\0'; /* keep 0 terminated */
+ }
+
+ if (opt->name
+ && find_long_option (cvt->parser->long_opts, opt->name) < 0)
+ /* OPT can be used as a long option. */
+ {
+ cvt->long_end->name = opt->name;
+ cvt->long_end->has_arg =
+ (real->arg
+ ? (real->flags & OPTION_ARG_OPTIONAL
+ ? optional_argument
+ : required_argument)
+ : no_argument);
+ cvt->long_end->flag = 0;
+ /* we add a disambiguating code to all the user's
+ values (which is removed before we actually call
+ the function to parse the value); this means that
+ the user loses use of the high 8 bits in all his
+ values (the sign of the lower bits is preserved
+ however)... */
+ cvt->long_end->val =
+ ((opt->key ? opt->key : real->key) & USER_MASK)
+ + (((group - cvt->parser->groups) + 1) << USER_BITS);
+
+ /* Keep the LONG_OPTS list terminated. */
+ (++cvt->long_end)->name = NULL;
+ }
+ }
+ }
+
+ group->parser = argp->parser;
+ group->argp = argp;
+ group->short_end = cvt->short_end;
+ group->args_processed = 0;
+ group->parent = parent;
+ group->parent_index = parent_index;
+ group->input = 0;
+ group->hook = 0;
+ group->child_inputs = 0;
+
+ if (children)
+ /* Assign GROUP's CHILD_INPUTS field some space from
+ CVT->child_inputs_end.*/
+ {
+ unsigned num_children = 0;
+ while (children[num_children].argp)
+ num_children++;
+ group->child_inputs = cvt->child_inputs_end;
+ cvt->child_inputs_end += num_children;
+ }
+
+ parent = group++;
+ }
+ else
+ parent = 0;
+
+ if (children)
+ {
+ unsigned index = 0;
+ while (children->argp)
+ group =
+ convert_options (children++->argp, parent, index++, group, cvt);
+ }
+
+ return group;
+}
+
+/* Find the merged set of getopt options, with keys appropiately prefixed. */
+static void
+parser_convert (struct parser *parser, const struct argp *argp, int flags)
+{
+ struct parser_convert_state cvt;
+
+ cvt.parser = parser;
+ cvt.short_end = parser->short_opts;
+ cvt.long_end = parser->long_opts;
+ cvt.child_inputs_end = parser->child_inputs;
+
+ if (flags & ARGP_IN_ORDER)
+ *cvt.short_end++ = '-';
+ else if (flags & ARGP_NO_ARGS)
+ *cvt.short_end++ = '+';
+ *cvt.short_end = '\0';
+
+ cvt.long_end->name = NULL;
+
+ parser->argp = argp;
+
+ if (argp)
+ parser->egroup = convert_options (argp, 0, 0, parser->groups, &cvt);
+ else
+ parser->egroup = parser->groups; /* No parsers at all! */
+}
+
+/* Lengths of various parser fields which we will allocated. */
+struct parser_sizes
+{
+ size_t short_len; /* Getopt short options string. */
+ size_t long_len; /* Getopt long options vector. */
+ size_t num_groups; /* Group structures we allocate. */
+ size_t num_child_inputs; /* Child input slots. */
+};
+
+/* For ARGP, increments the NUM_GROUPS field in SZS by the total number of
+ argp structures descended from it, and the SHORT_LEN & LONG_LEN fields by
+ the maximum lengths of the resulting merged getopt short options string and
+ long-options array, respectively. */
+static void
+calc_sizes (const struct argp *argp, struct parser_sizes *szs)
+{
+ const struct argp_child *child = argp->children;
+ const struct argp_option *opt = argp->options;
+
+ if (opt || argp->parser)
+ {
+ szs->num_groups++;
+ if (opt)
+ {
+ int num_opts = 0;
+ while (!__option_is_end (opt++))
+ num_opts++;
+ szs->short_len += num_opts * 3; /* opt + up to 2 `:'s */
+ szs->long_len += num_opts;
+ }
+ }
+
+ if (child)
+ while (child->argp)
+ {
+ calc_sizes ((child++)->argp, szs);
+ szs->num_child_inputs++;
+ }
+}
+
+/* Initializes PARSER to parse ARGP in a manner described by FLAGS. */
+static error_t
+parser_init (struct parser *parser, const struct argp *argp,
+ int argc, char **argv, int flags, void *input)
+{
+ error_t err = 0;
+ struct group *group;
+ struct parser_sizes szs;
+ struct _getopt_data opt_data = _GETOPT_DATA_INITIALIZER;
+ char *storage;
+ size_t glen, gsum;
+ size_t clen, csum;
+ size_t llen, lsum;
+ size_t slen, ssum;
+
+ szs.short_len = (flags & ARGP_NO_ARGS) ? 0 : 1;
+ szs.long_len = 0;
+ szs.num_groups = 0;
+ szs.num_child_inputs = 0;
+
+ if (argp)
+ calc_sizes (argp, &szs);
+
+ /* Lengths of the various bits of storage used by PARSER. */
+ glen = (szs.num_groups + 1) * sizeof (struct group);
+ clen = szs.num_child_inputs * sizeof (void *);
+ llen = (szs.long_len + 1) * sizeof (struct option);
+ slen = szs.short_len + 1;
+
+ /* Sums of previous lengths, properly aligned. There's no need to
+ align gsum, since struct group is aligned at least as strictly as
+ void * (since it contains a void * member). And there's no need
+ to align lsum, since struct option is aligned at least as
+ strictly as char. */
+ gsum = glen;
+ csum = alignto (gsum + clen, alignof (struct option));
+ lsum = csum + llen;
+ ssum = lsum + slen;
+
+ parser->storage = malloc (ssum);
+ if (! parser->storage)
+ return ENOMEM;
+
+ storage = parser->storage;
+ parser->groups = parser->storage;
+ parser->child_inputs = (void **) (storage + gsum);
+ parser->long_opts = (struct option *) (storage + csum);
+ parser->short_opts = storage + lsum;
+ parser->opt_data = opt_data;
+
+ memset (parser->child_inputs, 0, clen);
+ parser_convert (parser, argp, flags);
+
+ memset (&parser->state, 0, sizeof (struct argp_state));
+ parser->state.root_argp = parser->argp;
+ parser->state.argc = argc;
+ parser->state.argv = argv;
+ parser->state.flags = flags;
+ parser->state.err_stream = stderr;
+ parser->state.out_stream = stdout;
+ parser->state.next = 0; /* Tell getopt to initialize. */
+ parser->state.pstate = parser;
+
+ parser->try_getopt = 1;
+
+ /* Call each parser for the first time, giving it a chance to propagate
+ values to child parsers. */
+ if (parser->groups < parser->egroup)
+ parser->groups->input = input;
+ for (group = parser->groups;
+ group < parser->egroup && (!err || err == EBADKEY);
+ group++)
+ {
+ if (group->parent)
+ /* If a child parser, get the initial input value from the parent. */
+ group->input = group->parent->child_inputs[group->parent_index];
+
+ if (!group->parser
+ && group->argp->children && group->argp->children->argp)
+ /* For the special case where no parsing function is supplied for an
+ argp, propagate its input to its first child, if any (this just
+ makes very simple wrapper argps more convenient). */
+ group->child_inputs[0] = group->input;
+
+ err = group_parse (group, &parser->state, ARGP_KEY_INIT, 0);
+ }
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+
+ if (err)
+ return err;
+
+ if (parser->state.flags & ARGP_NO_ERRS)
+ {
+ parser->opt_data.opterr = 0;
+ if (parser->state.flags & ARGP_PARSE_ARGV0)
+ /* getopt always skips ARGV[0], so we have to fake it out. As long
+ as OPTERR is 0, then it shouldn't actually try to access it. */
+ parser->state.argv--, parser->state.argc++;
+ }
+ else
+ parser->opt_data.opterr = 1; /* Print error messages. */
+
+ if (parser->state.argv == argv && argv[0])
+ /* There's an argv[0]; use it for messages. */
+ parser->state.name = __argp_base_name (argv[0]);
+ else
+ parser->state.name = __argp_short_program_name ();
+
+ return 0;
+}
+
+/* Free any storage consumed by PARSER (but not PARSER itself). */
+static error_t
+parser_finalize (struct parser *parser,
+ error_t err, int arg_ebadkey, int *end_index)
+{
+ struct group *group;
+
+ if (err == EBADKEY && arg_ebadkey)
+ /* Suppress errors generated by unparsed arguments. */
+ err = 0;
+
+ if (! err)
+ {
+ if (parser->state.next == parser->state.argc)
+ /* We successfully parsed all arguments! Call all the parsers again,
+ just a few more times... */
+ {
+ for (group = parser->groups;
+ group < parser->egroup && (!err || err==EBADKEY);
+ group++)
+ if (group->args_processed == 0)
+ err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
+ for (group = parser->egroup - 1;
+ group >= parser->groups && (!err || err==EBADKEY);
+ group--)
+ err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
+
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+
+ /* Tell the user that all arguments are parsed. */
+ if (end_index)
+ *end_index = parser->state.next;
+ }
+ else if (end_index)
+ /* Return any remaining arguments to the user. */
+ *end_index = parser->state.next;
+ else
+ /* No way to return the remaining arguments, they must be bogus. */
+ {
+ if (!(parser->state.flags & ARGP_NO_ERRS)
+ && parser->state.err_stream)
+ fprintf (parser->state.err_stream,
+ dgettext (parser->argp->argp_domain,
+ "%s: Too many arguments\n"),
+ parser->state.name);
+ err = EBADKEY;
+ }
+ }
+
+ /* Okay, we're all done, with either an error or success; call the parsers
+ to indicate which one. */
+
+ if (err)
+ {
+ /* Maybe print an error message. */
+ if (err == EBADKEY)
+ /* An appropriate message describing what the error was should have
+ been printed earlier. */
+ __argp_state_help (&parser->state, parser->state.err_stream,
+ ARGP_HELP_STD_ERR);
+
+ /* Since we didn't exit, give each parser an error indication. */
+ for (group = parser->groups; group < parser->egroup; group++)
+ group_parse (group, &parser->state, ARGP_KEY_ERROR, 0);
+ }
+ else
+ /* Notify parsers of success, and propagate back values from parsers. */
+ {
+ /* We pass over the groups in reverse order so that child groups are
+ given a chance to do there processing before passing back a value to
+ the parent. */
+ for (group = parser->egroup - 1
+ ; group >= parser->groups && (!err || err == EBADKEY)
+ ; group--)
+ err = group_parse (group, &parser->state, ARGP_KEY_SUCCESS, 0);
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+ }
+
+ /* Call parsers once more, to do any final cleanup. Errors are ignored. */
+ for (group = parser->egroup - 1; group >= parser->groups; group--)
+ group_parse (group, &parser->state, ARGP_KEY_FINI, 0);
+
+ if (err == EBADKEY)
+ err = EINVAL;
+
+ free (parser->storage);
+
+ return err;
+}
+
+/* Call the user parsers to parse the non-option argument VAL, at the current
+ position, returning any error. The state NEXT pointer is assumed to have
+ been adjusted (by getopt) to point after this argument; this function will
+ adjust it correctly to reflect however many args actually end up being
+ consumed. */
+static error_t
+parser_parse_arg (struct parser *parser, char *val)
+{
+ /* Save the starting value of NEXT, first adjusting it so that the arg
+ we're parsing is again the front of the arg vector. */
+ int index = --parser->state.next;
+ error_t err = EBADKEY;
+ struct group *group;
+ int key = 0; /* Which of ARGP_KEY_ARG[S] we used. */
+
+ /* Try to parse the argument in each parser. */
+ for (group = parser->groups
+ ; group < parser->egroup && err == EBADKEY
+ ; group++)
+ {
+ parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */
+ key = ARGP_KEY_ARG;
+ err = group_parse (group, &parser->state, key, val);
+
+ if (err == EBADKEY)
+ /* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */
+ {
+ parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */
+ key = ARGP_KEY_ARGS;
+ err = group_parse (group, &parser->state, key, 0);
+ }
+ }
+
+ if (! err)
+ {
+ if (key == ARGP_KEY_ARGS)
+ /* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't
+ changed by the user, *all* arguments should be considered
+ consumed. */
+ parser->state.next = parser->state.argc;
+
+ if (parser->state.next > index)
+ /* Remember that we successfully processed a non-option
+ argument -- but only if the user hasn't gotten tricky and set
+ the clock back. */
+ (--group)->args_processed += (parser->state.next - index);
+ else
+ /* The user wants to reparse some args, give getopt another try. */
+ parser->try_getopt = 1;
+ }
+
+ return err;
+}
+
+/* Call the user parsers to parse the option OPT, with argument VAL, at the
+ current position, returning any error. */
+static error_t
+parser_parse_opt (struct parser *parser, int opt, char *val)
+{
+ /* The group key encoded in the high bits; 0 for short opts or
+ group_number + 1 for long opts. */
+ int group_key = opt >> USER_BITS;
+ error_t err = EBADKEY;
+
+ if (group_key == 0)
+ /* A short option. By comparing OPT's position in SHORT_OPTS to the
+ various starting positions in each group's SHORT_END field, we can
+ determine which group OPT came from. */
+ {
+ struct group *group;
+ char *short_index = strchr (parser->short_opts, opt);
+
+ if (short_index)
+ for (group = parser->groups; group < parser->egroup; group++)
+ if (group->short_end > short_index)
+ {
+ err = group_parse (group, &parser->state, opt,
+ parser->opt_data.optarg);
+ break;
+ }
+ }
+ else
+ /* A long option. We use shifts instead of masking for extracting
+ the user value in order to preserve the sign. */
+ err =
+ group_parse (&parser->groups[group_key - 1], &parser->state,
+ (opt << GROUP_BITS) >> GROUP_BITS,
+ parser->opt_data.optarg);
+
+ if (err == EBADKEY)
+ /* At least currently, an option not recognized is an error in the
+ parser, because we pre-compute which parser is supposed to deal
+ with each option. */
+ {
+ static const char bad_key_err[] =
+ N_("(PROGRAM ERROR) Option should have been recognized!?");
+ if (group_key == 0)
+ __argp_error (&parser->state, "-%c: %s", opt,
+ dgettext (parser->argp->argp_domain, bad_key_err));
+ else
+ {
+ struct option *long_opt = parser->long_opts;
+ while (long_opt->val != opt && long_opt->name)
+ long_opt++;
+ __argp_error (&parser->state, "--%s: %s",
+ long_opt->name ? long_opt->name : "???",
+ dgettext (parser->argp->argp_domain, bad_key_err));
+ }
+ }
+
+ return err;
+}
+
+/* Parse the next argument in PARSER (as indicated by PARSER->state.next).
+ Any error from the parsers is returned, and *ARGP_EBADKEY indicates
+ whether a value of EBADKEY is due to an unrecognized argument (which is
+ generally not fatal). */
+static error_t
+parser_parse_next (struct parser *parser, int *arg_ebadkey)
+{
+ int opt;
+ error_t err = 0;
+
+ if (parser->state.quoted && parser->state.next < parser->state.quoted)
+ /* The next argument pointer has been moved to before the quoted
+ region, so pretend we never saw the quoting `--', and give getopt
+ another chance. If the user hasn't removed it, getopt will just
+ process it again. */
+ parser->state.quoted = 0;
+
+ if (parser->try_getopt && !parser->state.quoted)
+ /* Give getopt a chance to parse this. */
+ {
+ /* Put it back in OPTIND for getopt. */
+ parser->opt_data.optind = parser->state.next;
+ /* Distinguish KEY_ERR from a real option. */
+ parser->opt_data.optopt = KEY_END;
+ if (parser->state.flags & ARGP_LONG_ONLY)
+ opt = _getopt_long_only_r (parser->state.argc, parser->state.argv,
+ parser->short_opts, parser->long_opts, 0,
+ &parser->opt_data);
+ else
+ opt = _getopt_long_r (parser->state.argc, parser->state.argv,
+ parser->short_opts, parser->long_opts, 0,
+ &parser->opt_data);
+ /* And see what getopt did. */
+ parser->state.next = parser->opt_data.optind;
+
+ if (opt == KEY_END)
+ /* Getopt says there are no more options, so stop using
+ getopt; we'll continue if necessary on our own. */
+ {
+ parser->try_getopt = 0;
+ if (parser->state.next > 1
+ && strcmp (parser->state.argv[parser->state.next - 1], QUOTE)
+ == 0)
+ /* Not only is this the end of the options, but it's a
+ `quoted' region, which may have args that *look* like
+ options, so we definitely shouldn't try to use getopt past
+ here, whatever happens. */
+ parser->state.quoted = parser->state.next;
+ }
+ else if (opt == KEY_ERR && parser->opt_data.optopt != KEY_END)
+ /* KEY_ERR can have the same value as a valid user short
+ option, but in the case of a real error, getopt sets OPTOPT
+ to the offending character, which can never be KEY_END. */
+ {
+ *arg_ebadkey = 0;
+ return EBADKEY;
+ }
+ }
+ else
+ opt = KEY_END;
+
+ if (opt == KEY_END)
+ {
+ /* We're past what getopt considers the options. */
+ if (parser->state.next >= parser->state.argc
+ || (parser->state.flags & ARGP_NO_ARGS))
+ /* Indicate that we're done. */
+ {
+ *arg_ebadkey = 1;
+ return EBADKEY;
+ }
+ else
+ /* A non-option arg; simulate what getopt might have done. */
+ {
+ opt = KEY_ARG;
+ parser->opt_data.optarg = parser->state.argv[parser->state.next++];
+ }
+ }
+
+ if (opt == KEY_ARG)
+ /* A non-option argument; try each parser in turn. */
+ err = parser_parse_arg (parser, parser->opt_data.optarg);
+ else
+ err = parser_parse_opt (parser, opt, parser->opt_data.optarg);
+
+ if (err == EBADKEY)
+ *arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
+
+ return err;
+}
+
+/* Parse the options strings in ARGC & ARGV according to the argp in ARGP.
+ FLAGS is one of the ARGP_ flags above. If END_INDEX is non-NULL, the
+ index in ARGV of the first unparsed option is returned in it. If an
+ unknown option is present, EINVAL is returned; if some parser routine
+ returned a non-zero value, it is returned; otherwise 0 is returned. */
+error_t
+__argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags,
+ int *end_index, void *input)
+{
+ error_t err;
+ struct parser parser;
+
+ /* If true, then err == EBADKEY is a result of a non-option argument failing
+ to be parsed (which in some cases isn't actually an error). */
+ int arg_ebadkey = 0;
+
+#ifndef _LIBC
+ if (!(flags & ARGP_PARSE_ARGV0))
+ {
+#ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
+ if (!program_invocation_name)
+ program_invocation_name = argv[0];
+#endif
+#ifdef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ if (!program_invocation_short_name)
+ program_invocation_short_name = __argp_base_name (argv[0]);
+#endif
+ }
+#endif
+
+ if (! (flags & ARGP_NO_HELP))
+ /* Add our own options. */
+ {
+ struct argp_child *child = alloca (4 * sizeof (struct argp_child));
+ struct argp *top_argp = alloca (sizeof (struct argp));
+
+ /* TOP_ARGP has no options, it just serves to group the user & default
+ argps. */
+ memset (top_argp, 0, sizeof (*top_argp));
+ top_argp->children = child;
+
+ memset (child, 0, 4 * sizeof (struct argp_child));
+
+ if (argp)
+ (child++)->argp = argp;
+ (child++)->argp = &argp_default_argp;
+ if (argp_program_version || argp_program_version_hook)
+ (child++)->argp = &argp_version_argp;
+ child->argp = 0;
+
+ argp = top_argp;
+ }
+
+ /* Construct a parser for these arguments. */
+ err = parser_init (&parser, argp, argc, argv, flags, input);
+
+ if (! err)
+ /* Parse! */
+ {
+ while (! err)
+ err = parser_parse_next (&parser, &arg_ebadkey);
+ err = parser_finalize (&parser, err, arg_ebadkey, end_index);
+ }
+
+ return err;
+}
+#ifdef weak_alias
+weak_alias (__argp_parse, argp_parse)
+#endif
+
+/* Return the input field for ARGP in the parser corresponding to STATE; used
+ by the help routines. */
+void *
+__argp_input (const struct argp *argp, const struct argp_state *state)
+{
+ if (state)
+ {
+ struct group *group;
+ struct parser *parser = state->pstate;
+
+ for (group = parser->groups; group < parser->egroup; group++)
+ if (group->argp == argp)
+ return group->input;
+ }
+
+ return 0;
+}
+#ifdef weak_alias
+weak_alias (__argp_input, _argp_input)
+#endif
diff --git a/gnulib/lib/argp-pin.c b/gnulib/lib/argp-pin.c
new file mode 100644
index 00000000..eda4d958
--- /dev/null
+++ b/gnulib/lib/argp-pin.c
@@ -0,0 +1,27 @@
+/* Full and short program names for argp module
+ Copyright (C) 2005, 2009, 2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME
+char *program_invocation_short_name = 0;
+#endif
+#ifndef HAVE_PROGRAM_INVOCATION_NAME
+char *program_invocation_name = 0;
+#endif
+
diff --git a/gnulib/lib/argp-pv.c b/gnulib/lib/argp-pv.c
new file mode 100644
index 00000000..e3227d32
--- /dev/null
+++ b/gnulib/lib/argp-pv.c
@@ -0,0 +1,34 @@
+/* Default definition for ARGP_PROGRAM_VERSION.
+ Copyright (C) 1996, 1997, 1999, 2006, 2009, 2010 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+/* If set by the user program to a non-zero value, then a default option
+ --version is added (unless the ARGP_NO_HELP flag is used), which will
+ print this string followed by a newline and exit (unless the
+ ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
+const char *argp_program_version
+/* This variable should be zero-initialized. On most systems, putting it into
+ BSS is sufficient. Not so on MacOS X 10.3 and 10.4, see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ = (const char *) 0
+#endif
+ ;
diff --git a/gnulib/lib/argp-pvh.c b/gnulib/lib/argp-pvh.c
new file mode 100644
index 00000000..fb98fc21
--- /dev/null
+++ b/gnulib/lib/argp-pvh.c
@@ -0,0 +1,31 @@
+/* Default definition for ARGP_PROGRAM_VERSION_HOOK.
+ Copyright (C) 1996, 1997, 1999, 2004, 2009, 2010 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "argp.h"
+
+/* If set by the user program to a non-zero value, then a default option
+ --version is added (unless the ARGP_NO_HELP flag is used), which calls
+ this function with a stream to print the version to and a pointer to the
+ current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
+ used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
+void (*argp_program_version_hook) (FILE *stream, struct argp_state *state) = NULL;
diff --git a/gnulib/lib/argp-version-etc.c b/gnulib/lib/argp-version-etc.c
new file mode 100644
index 00000000..f500a8f5
--- /dev/null
+++ b/gnulib/lib/argp-version-etc.c
@@ -0,0 +1,38 @@
+/* Version hook for Argp.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+#include <version-etc.h>
+#include <argp.h>
+#include <argp-version-etc.h>
+
+static const char *program_canonical_name;
+static const char * const *program_authors;
+
+static void
+version_etc_hook (FILE *stream, struct argp_state *state)
+{
+ version_etc_ar (stream, program_canonical_name, PACKAGE_NAME, VERSION,
+ program_authors);
+}
+
+void
+argp_version_setup (const char *name, const char * const *authors)
+{
+ argp_program_version_hook = version_etc_hook;
+ program_canonical_name = name;
+ program_authors = authors;
+}
diff --git a/gnulib/lib/argp-version-etc.h b/gnulib/lib/argp-version-etc.h
new file mode 100644
index 00000000..7c12c018
--- /dev/null
+++ b/gnulib/lib/argp-version-etc.h
@@ -0,0 +1,40 @@
+/* Version hook for Argp.
+ Copyright (C) 2009, 2010 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/>. */
+
+#ifndef _ARGP_VERSION_ETC_H
+#define _ARGP_VERSION_ETC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Setup standard display of the version information for the `--version'
+ option. NAME is the canonical program name, and AUTHORS is a NULL-
+ terminated array of author names. At least one author name must be
+ given.
+
+ If NAME is NULL, the package name (as given by the PACKAGE macro)
+ is asumed to be the name of the program.
+
+ This function is intended to be called before argp_parse().
+*/
+extern void argp_version_setup (const char *name, const char * const *authors);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ARGP_VERSION_ETC_H */
diff --git a/gnulib/lib/argp-xinl.c b/gnulib/lib/argp-xinl.c
new file mode 100644
index 00000000..6e7e20bb
--- /dev/null
+++ b/gnulib/lib/argp-xinl.c
@@ -0,0 +1,42 @@
+/* Real definitions for extern inline functions in argp.h
+ Copyright (C) 1997, 1998, 2004, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined _LIBC || defined HAVE_FEATURES_H
+# include <features.h>
+#endif
+
+#ifndef __USE_EXTERN_INLINES
+# define __USE_EXTERN_INLINES 1
+#endif
+#define ARGP_EI
+#undef __OPTIMIZE__
+#define __OPTIMIZE__ 1
+#include "argp.h"
+
+/* Add weak aliases. */
+#if _LIBC - 0 && defined (weak_alias)
+
+weak_alias (__argp_usage, argp_usage)
+weak_alias (__option_is_short, _option_is_short)
+weak_alias (__option_is_end, _option_is_end)
+
+#endif
diff --git a/gnulib/lib/argp.h b/gnulib/lib/argp.h
new file mode 100644
index 00000000..3667224a
--- /dev/null
+++ b/gnulib/lib/argp.h
@@ -0,0 +1,645 @@
+/* Hierarchial argument parsing, layered over getopt.
+ Copyright (C) 1995-1999, 2003-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ 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/>. */
+
+#ifndef _ARGP_H
+#define _ARGP_H
+
+#include <stdio.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <limits.h>
+
+#define __need_error_t
+#include <errno.h>
+
+#ifndef __THROW
+# define __THROW
+#endif
+#ifndef __NTH
+# define __NTH(fct) fct __THROW
+#endif
+
+#ifndef __attribute__
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable __attribute__ only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(Spec) /* empty */
+# endif
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words. */
+#ifndef __restrict
+# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
+# if 199901L <= __STDC_VERSION__
+# define __restrict restrict
+# else
+# define __restrict
+# endif
+# endif
+#endif
+
+#ifndef __error_t_defined
+typedef int error_t;
+# define __error_t_defined
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A description of a particular option. A pointer to an array of
+ these is passed in the OPTIONS field of an argp structure. Each option
+ entry can correspond to one long option and/or one short option; more
+ names for the same option can be added by following an entry in an option
+ array with options having the OPTION_ALIAS flag set. */
+struct argp_option
+{
+ /* The long option name. For more than one name for the same option, you
+ can use following options with the OPTION_ALIAS flag set. */
+ const char *name;
+
+ /* What key is returned for this option. If > 0 and printable, then it's
+ also accepted as a short option. */
+ int key;
+
+ /* If non-NULL, this is the name of the argument associated with this
+ option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */
+ const char *arg;
+
+ /* OPTION_ flags. */
+ int flags;
+
+ /* The doc string for this option. If both NAME and KEY are 0, This string
+ will be printed outdented from the normal option column, making it
+ useful as a group header (it will be the first thing printed in its
+ group); in this usage, it's conventional to end the string with a `:'.
+
+ Write the initial value as N_("TEXT") if you want xgettext to collect
+ it into a POT file. */
+ const char *doc;
+
+ /* The group this option is in. In a long help message, options are sorted
+ alphabetically within each group, and the groups presented in the order
+ 0, 1, 2, ..., n, -m, ..., -2, -1. Every entry in an options array with
+ if this field 0 will inherit the group number of the previous entry, or
+ zero if it's the first one, unless its a group header (NAME and KEY both
+ 0), in which case, the previous entry + 1 is the default. Automagic
+ options such as --help are put into group -1. */
+ int group;
+};
+
+/* The argument associated with this option is optional. */
+#define OPTION_ARG_OPTIONAL 0x1
+
+/* This option isn't displayed in any help messages. */
+#define OPTION_HIDDEN 0x2
+
+/* This option is an alias for the closest previous non-alias option. This
+ means that it will be displayed in the same help entry, and will inherit
+ fields other than NAME and KEY from the aliased option. */
+#define OPTION_ALIAS 0x4
+
+/* This option isn't actually an option (and so should be ignored by the
+ actual option parser), but rather an arbitrary piece of documentation that
+ should be displayed in much the same manner as the options. If this flag
+ is set, then the option NAME field is displayed unmodified (e.g., no `--'
+ prefix is added) at the left-margin (where a *short* option would normally
+ be displayed), and the documentation string in the normal place. The NAME
+ field will be translated using gettext, unless OPTION_NO_TRANS is set (see
+ below). For purposes of sorting, any leading whitespace and punctuation is
+ ignored, except that if the first non-whitespace character is not `-', this
+ entry is displayed after all options (and OPTION_DOC entries with a leading
+ `-') in the same group. */
+#define OPTION_DOC 0x8
+
+/* This option shouldn't be included in `long' usage messages (but is still
+ included in help messages). This is mainly intended for options that are
+ completely documented in an argp's ARGS_DOC field, in which case including
+ the option in the generic usage list would be redundant. For instance,
+ if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to
+ distinguish these two cases, -x should probably be marked
+ OPTION_NO_USAGE. */
+#define OPTION_NO_USAGE 0x10
+
+/* Valid only in conjunction with OPTION_DOC. This option disables translation
+ of option name. */
+#define OPTION_NO_TRANS 0x20
+
+
+struct argp; /* fwd declare this type */
+struct argp_state; /* " */
+struct argp_child; /* " */
+
+/* The type of a pointer to an argp parsing function. */
+typedef error_t (*argp_parser_t) (int key, char *arg,
+ struct argp_state *state);
+
+/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such
+ returns will simply be ignored. For user keys, this error will be turned
+ into EINVAL (if the call to argp_parse is such that errors are propagated
+ back to the user instead of exiting); returning EINVAL itself would result
+ in an immediate stop to parsing in *all* cases. */
+#define ARGP_ERR_UNKNOWN E2BIG /* Hurd should never need E2BIG. XXX */
+
+/* Special values for the KEY argument to an argument parsing function.
+ ARGP_ERR_UNKNOWN should be returned if they aren't understood.
+
+ The sequence of keys to a parsing function is either (where each
+ uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key):
+
+ INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all
+ or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed
+ or INIT (opt | ARG)... SUCCESS -- Some non-option arg unrecognized
+
+ The third case is where every parser returned ARGP_KEY_UNKNOWN for an
+ argument, in which case parsing stops at that argument (returning the
+ unparsed arguments to the caller of argp_parse if requested, or stopping
+ with an error message if not).
+
+ If an error occurs (either detected by argp, or because the parsing
+ function returned an error value), then the parser is called with
+ ARGP_KEY_ERROR, and no further calls are made. */
+
+/* This is not an option at all, but rather a command line argument. If a
+ parser receiving this key returns success, the fact is recorded, and the
+ ARGP_KEY_NO_ARGS case won't be used. HOWEVER, if while processing the
+ argument, a parser function decrements the NEXT field of the state it's
+ passed, the option won't be considered processed; this is to allow you to
+ actually modify the argument (perhaps into an option), and have it
+ processed again. */
+#define ARGP_KEY_ARG 0
+/* There are remaining arguments not parsed by any parser, which may be found
+ starting at (STATE->argv + STATE->next). If success is returned, but
+ STATE->next left untouched, it's assumed that all arguments were consume,
+ otherwise, the parser should adjust STATE->next to reflect any arguments
+ consumed. */
+#define ARGP_KEY_ARGS 0x1000006
+/* There are no more command line arguments at all. */
+#define ARGP_KEY_END 0x1000001
+/* Because it's common to want to do some special processing if there aren't
+ any non-option args, user parsers are called with this key if they didn't
+ successfully process any non-option arguments. Called just before
+ ARGP_KEY_END (where more general validity checks on previously parsed
+ arguments can take place). */
+#define ARGP_KEY_NO_ARGS 0x1000002
+/* Passed in before any parsing is done. Afterwards, the values of each
+ element of the CHILD_INPUT field, if any, in the state structure is
+ copied to each child's state to be the initial value of the INPUT field. */
+#define ARGP_KEY_INIT 0x1000003
+/* Use after all other keys, including SUCCESS & END. */
+#define ARGP_KEY_FINI 0x1000007
+/* Passed in when parsing has successfully been completed (even if there are
+ still arguments remaining). */
+#define ARGP_KEY_SUCCESS 0x1000004
+/* Passed in if an error occurs. */
+#define ARGP_KEY_ERROR 0x1000005
+
+/* An argp structure contains a set of options declarations, a function to
+ deal with parsing one, documentation string, a possible vector of child
+ argp's, and perhaps a function to filter help output. When actually
+ parsing options, getopt is called with the union of all the argp
+ structures chained together through their CHILD pointers, with conflicts
+ being resolved in favor of the first occurrence in the chain. */
+struct argp
+{
+ /* An array of argp_option structures, terminated by an entry with both
+ NAME and KEY having a value of 0. */
+ const struct argp_option *options;
+
+ /* What to do with an option from this structure. KEY is the key
+ associated with the option, and ARG is any associated argument (NULL if
+ none was supplied). If KEY isn't understood, ARGP_ERR_UNKNOWN should be
+ returned. If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then
+ parsing is stopped immediately, and that value is returned from
+ argp_parse(). For special (non-user-supplied) values of KEY, see the
+ ARGP_KEY_ definitions below. */
+ argp_parser_t parser;
+
+ /* A string describing what other arguments are wanted by this program. It
+ is only used by argp_usage to print the `Usage:' message. If it
+ contains newlines, the strings separated by them are considered
+ alternative usage patterns, and printed on separate lines (lines after
+ the first are prefix by ` or: ' instead of `Usage:'). */
+ const char *args_doc;
+
+ /* If non-NULL, a string containing extra text to be printed before and
+ after the options in a long help message (separated by a vertical tab
+ `\v' character).
+ Write the initial value as N_("BEFORE-TEXT") "\v" N_("AFTER-TEXT") if
+ you want xgettext to collect the two pieces of text into a POT file. */
+ const char *doc;
+
+ /* A vector of argp_children structures, terminated by a member with a 0
+ argp field, pointing to child argps should be parsed with this one. Any
+ conflicts are resolved in favor of this argp, or early argps in the
+ CHILDREN list. This field is useful if you use libraries that supply
+ their own argp structure, which you want to use in conjunction with your
+ own. */
+ const struct argp_child *children;
+
+ /* If non-zero, this should be a function to filter the output of help
+ messages. KEY is either a key from an option, in which case TEXT is
+ that option's help text, or a special key from the ARGP_KEY_HELP_
+ defines, below, describing which other help text TEXT is. The function
+ should return either TEXT, if it should be used as-is, a replacement
+ string, which should be malloced, and will be freed by argp, or NULL,
+ meaning `print nothing'. The value for TEXT is *after* any translation
+ has been done, so if any of the replacement text also needs translation,
+ that should be done by the filter function. INPUT is either the input
+ supplied to argp_parse, or NULL, if argp_help was called directly. */
+ char *(*help_filter) (int __key, const char *__text, void *__input);
+
+ /* If non-zero the strings used in the argp library are translated using
+ the domain described by this string. Otherwise the currently installed
+ default domain is used. */
+ const char *argp_domain;
+};
+
+/* Possible KEY arguments to a help filter function. */
+#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceeding options. */
+#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */
+#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */
+#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation;
+ TEXT is NULL for this key. */
+/* Explanatory note emitted when duplicate option arguments have been
+ suppressed. */
+#define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005
+#define ARGP_KEY_HELP_ARGS_DOC 0x2000006 /* Argument doc string. */
+
+/* When an argp has a non-zero CHILDREN field, it should point to a vector of
+ argp_child structures, each of which describes a subsidiary argp. */
+struct argp_child
+{
+ /* The child parser. */
+ const struct argp *argp;
+
+ /* Flags for this child. */
+ int flags;
+
+ /* If non-zero, an optional header to be printed in help output before the
+ child options. As a side-effect, a non-zero value forces the child
+ options to be grouped together; to achieve this effect without actually
+ printing a header string, use a value of "". */
+ const char *header;
+
+ /* Where to group the child options relative to the other (`consolidated')
+ options in the parent argp; the values are the same as the GROUP field
+ in argp_option structs, but all child-groupings follow parent options at
+ a particular group level. If both this field and HEADER are zero, then
+ they aren't grouped at all, but rather merged with the parent options
+ (merging the child's grouping levels with the parents). */
+ int group;
+};
+
+/* Parsing state. This is provided to parsing functions called by argp,
+ which may examine and, as noted, modify fields. */
+struct argp_state
+{
+ /* The top level ARGP being parsed. */
+ const struct argp *root_argp;
+
+ /* The argument vector being parsed. May be modified. */
+ int argc;
+ char **argv;
+
+ /* The index in ARGV of the next arg that to be parsed. May be modified. */
+ int next;
+
+ /* The flags supplied to argp_parse. May be modified. */
+ unsigned flags;
+
+ /* While calling a parsing function with a key of ARGP_KEY_ARG, this is the
+ number of the current arg, starting at zero, and incremented after each
+ such call returns. At all other times, this is the number of such
+ arguments that have been processed. */
+ unsigned arg_num;
+
+ /* If non-zero, the index in ARGV of the first argument following a special
+ `--' argument (which prevents anything following being interpreted as an
+ option). Only set once argument parsing has proceeded past this point. */
+ int quoted;
+
+ /* An arbitrary pointer passed in from the user. */
+ void *input;
+ /* Values to pass to child parsers. This vector will be the same length as
+ the number of children for the current parser. */
+ void **child_inputs;
+
+ /* For the parser's use. Initialized to 0. */
+ void *hook;
+
+ /* The name used when printing messages. This is initialized to ARGV[0],
+ or PROGRAM_INVOCATION_NAME if that is unavailable. */
+ char *name;
+
+ /* Streams used when argp prints something. */
+ FILE *err_stream; /* For errors; initialized to stderr. */
+ FILE *out_stream; /* For information; initialized to stdout. */
+
+ void *pstate; /* Private, for use by argp. */
+};
+
+/* Flags for argp_parse (note that the defaults are those that are
+ convenient for program command line parsing): */
+
+/* Don't ignore the first element of ARGV. Normally (and always unless
+ ARGP_NO_ERRS is set) the first element of the argument vector is
+ skipped for option parsing purposes, as it corresponds to the program name
+ in a command line. */
+#define ARGP_PARSE_ARGV0 0x01
+
+/* Don't print error messages for unknown options to stderr; unless this flag
+ is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program
+ name in the error messages. This flag implies ARGP_NO_EXIT (on the
+ assumption that silent exiting upon errors is bad behaviour). */
+#define ARGP_NO_ERRS 0x02
+
+/* Don't parse any non-option args. Normally non-option args are parsed by
+ calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg
+ as the value. Since it's impossible to know which parse function wants to
+ handle it, each one is called in turn, until one returns 0 or an error
+ other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the
+ argp_parse returns prematurely (but with a return value of 0). If all
+ args have been parsed without error, all parsing functions are called one
+ last time with a key of ARGP_KEY_END. This flag needn't normally be set,
+ as the normal behavior is to stop parsing as soon as some argument can't
+ be handled. */
+#define ARGP_NO_ARGS 0x04
+
+/* Parse options and arguments in the same order they occur on the command
+ line -- normally they're rearranged so that all options come first. */
+#define ARGP_IN_ORDER 0x08
+
+/* Don't provide the standard long option --help, which causes usage and
+ option help information to be output to stdout, and exit (0) called. */
+#define ARGP_NO_HELP 0x10
+
+/* Don't exit on errors (they may still result in error messages). */
+#define ARGP_NO_EXIT 0x20
+
+/* Use the gnu getopt `long-only' rules for parsing arguments. */
+#define ARGP_LONG_ONLY 0x40
+
+/* Turns off any message-printing/exiting options. */
+#define ARGP_SILENT (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP)
+
+/* Parse the options strings in ARGC & ARGV according to the options in ARGP.
+ FLAGS is one of the ARGP_ flags above. If ARG_INDEX is non-NULL, the
+ index in ARGV of the first unparsed option is returned in it. If an
+ unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser
+ routine returned a non-zero value, it is returned; otherwise 0 is
+ returned. This function may also call exit unless the ARGP_NO_HELP flag
+ is set. INPUT is a pointer to a value to be passed in to the parser. */
+extern error_t argp_parse (const struct argp *__restrict __argp,
+ int /*argc*/, char **__restrict /*argv*/,
+ unsigned __flags, int *__restrict __arg_index,
+ void *__restrict __input);
+extern error_t __argp_parse (const struct argp *__restrict __argp,
+ int /*argc*/, char **__restrict /*argv*/,
+ unsigned __flags, int *__restrict __arg_index,
+ void *__restrict __input);
+
+/* Global variables. */
+
+/* GNULIB makes sure both program_invocation_name and
+ program_invocation_short_name are available */
+#ifdef GNULIB_PROGRAM_INVOCATION_NAME
+extern char *program_invocation_name;
+# undef HAVE_DECL_PROGRAM_INVOCATION_NAME
+# define HAVE_DECL_PROGRAM_INVOCATION_NAME 1
+#endif
+
+#ifdef GNULIB_PROGRAM_INVOCATION_SHORT_NAME
+extern char *program_invocation_short_name;
+# undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+# define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1
+#endif
+
+/* If defined or set by the user program to a non-zero value, then a default
+ option --version is added (unless the ARGP_NO_HELP flag is used), which
+ will print this string followed by a newline and exit (unless the
+ ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
+extern const char *argp_program_version;
+
+/* If defined or set by the user program to a non-zero value, then a default
+ option --version is added (unless the ARGP_NO_HELP flag is used), which
+ calls this function with a stream to print the version to and a pointer to
+ the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
+ used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
+extern void (*argp_program_version_hook) (FILE *__restrict __stream,
+ struct argp_state *__restrict
+ __state);
+
+/* If defined or set by the user program, it should point to string that is
+ the bug-reporting address for the program. It will be printed by
+ argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various
+ standard help messages), embedded in a sentence that says something like
+ `Report bugs to ADDR.'. */
+extern const char *argp_program_bug_address;
+
+/* The exit status that argp will use when exiting due to a parsing error.
+ If not defined or set by the user program, this defaults to EX_USAGE from
+ <sysexits.h>. */
+extern error_t argp_err_exit_status;
+
+/* Flags for argp_help. */
+#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */
+#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */
+#define ARGP_HELP_SEE 0x04 /* a `Try ... for more help' message. */
+#define ARGP_HELP_LONG 0x08 /* a long help message. */
+#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */
+#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */
+#define ARGP_HELP_DOC (ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)
+#define ARGP_HELP_BUG_ADDR 0x40 /* bug report address */
+#define ARGP_HELP_LONG_ONLY 0x80 /* modify output appropriately to
+ reflect ARGP_LONG_ONLY mode. */
+
+/* These ARGP_HELP flags are only understood by argp_state_help. */
+#define ARGP_HELP_EXIT_ERR 0x100 /* Call exit(1) instead of returning. */
+#define ARGP_HELP_EXIT_OK 0x200 /* Call exit(0) instead of returning. */
+
+/* The standard thing to do after a program command line parsing error, if an
+ error message has already been printed. */
+#define ARGP_HELP_STD_ERR \
+ (ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
+/* The standard thing to do after a program command line parsing error, if no
+ more specific error message has been printed. */
+#define ARGP_HELP_STD_USAGE \
+ (ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
+/* The standard thing to do in response to a --help option. */
+#define ARGP_HELP_STD_HELP \
+ (ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \
+ | ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR)
+
+/* Output a usage message for ARGP to STREAM. FLAGS are from the set
+ ARGP_HELP_*. */
+extern void argp_help (const struct argp *__restrict __argp,
+ FILE *__restrict __stream,
+ unsigned __flags, char *__restrict __name);
+extern void __argp_help (const struct argp *__restrict __argp,
+ FILE *__restrict __stream, unsigned __flags,
+ char *__name);
+
+/* The following routines are intended to be called from within an argp
+ parsing routine (thus taking an argp_state structure as the first
+ argument). They may or may not print an error message and exit, depending
+ on the flags in STATE -- in any case, the caller should be prepared for
+ them *not* to exit, and should return an appropiate error after calling
+ them. [argp_usage & argp_error should probably be called argp_state_...,
+ but they're used often enough that they should be short] */
+
+/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
+ from the set ARGP_HELP_*. */
+extern void argp_state_help (const struct argp_state *__restrict __state,
+ FILE *__restrict __stream,
+ unsigned int __flags);
+extern void __argp_state_help (const struct argp_state *__restrict __state,
+ FILE *__restrict __stream,
+ unsigned int __flags);
+
+#if _LIBC || !defined __USE_EXTERN_INLINES
+/* Possibly output the standard usage message for ARGP to stderr and exit. */
+extern void argp_usage (const struct argp_state *__state);
+extern void __argp_usage (const struct argp_state *__state);
+#endif
+
+/* If appropriate, print the printf string FMT and following args, preceded
+ by the program name and `:', to stderr, and followed by a `Try ... --help'
+ message, then exit (1). */
+extern void argp_error (const struct argp_state *__restrict __state,
+ const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+extern void __argp_error (const struct argp_state *__restrict __state,
+ const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+
+/* Similar to the standard gnu error-reporting function error(), but will
+ respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
+ to STATE->err_stream. This is useful for argument parsing code that is
+ shared between program startup (when exiting is desired) and runtime
+ option parsing (when typically an error code is returned instead). The
+ difference between this function and argp_error is that the latter is for
+ *parsing errors*, and the former is for other problems that occur during
+ parsing but don't reflect a (syntactic) problem with the input. */
+extern void argp_failure (const struct argp_state *__restrict __state,
+ int __status, int __errnum,
+ const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 4, 5)));
+extern void __argp_failure (const struct argp_state *__restrict __state,
+ int __status, int __errnum,
+ const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 4, 5)));
+
+#if _LIBC || !defined __USE_EXTERN_INLINES
+/* Returns true if the option OPT is a valid short option. */
+extern int _option_is_short (const struct argp_option *__opt) __THROW;
+extern int __option_is_short (const struct argp_option *__opt) __THROW;
+
+/* Returns true if the option OPT is in fact the last (unused) entry in an
+ options array. */
+extern int _option_is_end (const struct argp_option *__opt) __THROW;
+extern int __option_is_end (const struct argp_option *__opt) __THROW;
+#endif
+
+/* Return the input field for ARGP in the parser corresponding to STATE; used
+ by the help routines. */
+extern void *_argp_input (const struct argp *__restrict __argp,
+ const struct argp_state *__restrict __state)
+ __THROW;
+extern void *__argp_input (const struct argp *__restrict __argp,
+ const struct argp_state *__restrict __state)
+ __THROW;
+
+#ifdef __USE_EXTERN_INLINES
+
+# if !_LIBC
+# define __argp_usage argp_usage
+# define __argp_state_help argp_state_help
+# define __option_is_short _option_is_short
+# define __option_is_end _option_is_end
+# endif
+
+# ifndef ARGP_EI
+# ifdef __GNUC__
+ /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+ inline semantics, unless -fgnu89-inline is used. It defines a macro
+ __GNUC_STDC_INLINE__ to indicate this situation or a macro
+ __GNUC_GNU_INLINE__ to indicate the opposite situation.
+ GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+ semantics but warns, unless -fgnu89-inline is used:
+ warning: C99 inline functions are not supported; using GNU89
+ warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+ It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */
+# if defined __GNUC_STDC_INLINE__
+# define ARGP_EI __inline__
+# elif defined __GNUC_GNU_INLINE__
+# define ARGP_EI extern __inline__ __attribute__ ((__gnu_inline__))
+# else
+# define ARGP_EI extern __inline__
+# endif
+# else
+ /* With other compilers, assume the ISO C99 meaning of 'inline', if
+ the compiler supports 'inline' at all. */
+# define ARGP_EI inline
+# endif
+# endif
+
+ARGP_EI void
+__argp_usage (const struct argp_state *__state)
+{
+ __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE);
+}
+
+ARGP_EI int
+__NTH (__option_is_short (const struct argp_option *__opt))
+{
+ if (__opt->flags & OPTION_DOC)
+ return 0;
+ else
+ {
+ int __key = __opt->key;
+ return __key > 0 && __key <= UCHAR_MAX && isprint (__key);
+ }
+}
+
+ARGP_EI int
+__NTH (__option_is_end (const struct argp_option *__opt))
+{
+ return !__opt->key && !__opt->name && !__opt->doc && !__opt->group;
+}
+
+# if !_LIBC
+# undef __argp_usage
+# undef __argp_state_help
+# undef __option_is_short
+# undef __option_is_end
+# endif
+#endif /* Use extern inlines. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* argp.h */
diff --git a/gnulib/lib/argv-iter.c b/gnulib/lib/argv-iter.c
new file mode 100644
index 00000000..c65a3cc4
--- /dev/null
+++ b/gnulib/lib/argv-iter.c
@@ -0,0 +1,111 @@
+/* Iterate over arguments from argv or --files0-from=FILE
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+#include "argv-iter.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+struct argv_iterator
+{
+ /* Test FP to determine whether in read-mode or argv-mode. */
+ /* file-mode: fp records position */
+ FILE *fp;
+ size_t item_idx;
+ char *tok;
+ size_t buf_len;
+
+ /* argv-mode: record just argv and current pointer */
+ char **arg_list;
+ char **p;
+};
+
+struct argv_iterator *
+argv_iter_init_argv (char **argv)
+{
+ struct argv_iterator *ai = malloc (sizeof *ai);
+ if (!ai)
+ return NULL;
+ ai->fp = NULL;
+ ai->arg_list = argv;
+ ai->p = argv;
+ return ai;
+}
+
+/* Initialize to read from the stream, FP.
+ The input is expected to contain a list of NUL-delimited tokens. */
+struct argv_iterator *
+argv_iter_init_stream (FILE *fp)
+{
+ struct argv_iterator *ai = malloc (sizeof *ai);
+ if (!ai)
+ return NULL;
+ ai->fp = fp;
+ ai->tok = NULL;
+ ai->buf_len = 0;
+
+ ai->item_idx = 0;
+ ai->arg_list = NULL;
+ return ai;
+}
+
+char *
+argv_iter (struct argv_iterator *ai, enum argv_iter_err *err)
+{
+ if (ai->fp)
+ {
+ ssize_t len = getdelim (&ai->tok, &ai->buf_len, '\0', ai->fp);
+ if (len < 0)
+ {
+ *err = feof (ai->fp) ? AI_ERR_EOF : AI_ERR_READ;
+ return NULL;
+ }
+
+ *err = AI_ERR_OK;
+ ai->item_idx++;
+ return ai->tok;
+ }
+ else
+ {
+ if (*(ai->p) == NULL)
+ {
+ *err = AI_ERR_EOF;
+ return NULL;
+ }
+ else
+ {
+ *err = AI_ERR_OK;
+ return *(ai->p++);
+ }
+ }
+}
+
+size_t
+argv_iter_n_args (struct argv_iterator const *ai)
+{
+ return ai->fp ? ai->item_idx : ai->p - ai->arg_list;
+}
+
+void
+argv_iter_free (struct argv_iterator *ai)
+{
+ if (ai->fp)
+ free (ai->tok);
+ free (ai);
+}
diff --git a/gnulib/lib/argv-iter.h b/gnulib/lib/argv-iter.h
new file mode 100644
index 00000000..685faa21
--- /dev/null
+++ b/gnulib/lib/argv-iter.h
@@ -0,0 +1,43 @@
+/* Iterate over arguments from argv or --files0-from=FILE
+ Copyright (C) 2008-2010 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/>. */
+
+#include <stdio.h>
+#include <stdbool.h>
+
+/* Definition of _GL_ARG_NONNULL. */
+#include "arg-nonnull.h"
+
+struct argv_iterator;
+enum argv_iter_err;
+
+enum argv_iter_err
+{
+ AI_ERR_OK = 1,
+ AI_ERR_EOF,
+ AI_ERR_MEM,
+ AI_ERR_READ
+};
+
+struct argv_iterator *argv_iter_init_argv (char **argv)
+ _GL_ARG_NONNULL ((1));
+struct argv_iterator *argv_iter_init_stream (FILE *fp)
+ _GL_ARG_NONNULL ((1));
+char *argv_iter (struct argv_iterator *, enum argv_iter_err *)
+ _GL_ARG_NONNULL ((1, 2));
+size_t argv_iter_n_args (struct argv_iterator const *)
+ _GL_ARG_NONNULL ((1));
+void argv_iter_free (struct argv_iterator *)
+ _GL_ARG_NONNULL ((1));
diff --git a/gnulib/lib/argz.c b/gnulib/lib/argz.c
new file mode 100644
index 00000000..485bf977
--- /dev/null
+++ b/gnulib/lib/argz.c
@@ -0,0 +1,407 @@
+/* Functions for dealing with '\0' separated arg vectors.
+ Copyright (C) 1995-1998, 2000-2002, 2006, 2008-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <argz.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+/* Add BUF, of length BUF_LEN to the argz vector in ARGZ & ARGZ_LEN. */
+error_t
+argz_append (char **argz, size_t *argz_len, const char *buf, size_t buf_len)
+{
+ size_t new_argz_len = *argz_len + buf_len;
+ char *new_argz = realloc (*argz, new_argz_len);
+ if (new_argz)
+ {
+ memcpy (new_argz + *argz_len, buf, buf_len);
+ *argz = new_argz;
+ *argz_len = new_argz_len;
+ return 0;
+ }
+ else
+ return ENOMEM;
+}
+
+/* Add STR to the argz vector in ARGZ & ARGZ_LEN. This should be moved into
+ argz.c in libshouldbelibc. */
+error_t
+argz_add (char **argz, size_t *argz_len, const char *str)
+{
+ return argz_append (argz, argz_len, str, strlen (str) + 1);
+}
+
+
+
+error_t
+argz_add_sep (char **argz, size_t *argz_len, const char *string, int delim)
+{
+ size_t nlen = strlen (string) + 1;
+
+ if (nlen > 1)
+ {
+ const char *rp;
+ char *wp;
+
+ *argz = (char *) realloc (*argz, *argz_len + nlen);
+ if (*argz == NULL)
+ return ENOMEM;
+
+ wp = *argz + *argz_len;
+ rp = string;
+ do
+ if (*rp == delim)
+ {
+ if (wp > *argz && wp[-1] != '\0')
+ *wp++ = '\0';
+ else
+ --nlen;
+ }
+ else
+ *wp++ = *rp;
+ while (*rp++ != '\0');
+
+ *argz_len += nlen;
+ }
+
+ return 0;
+}
+
+
+
+error_t
+argz_create_sep (const char *string, int delim, char **argz, size_t *len)
+{
+ size_t nlen = strlen (string) + 1;
+
+ if (nlen > 1)
+ {
+ const char *rp;
+ char *wp;
+
+ *argz = (char *) malloc (nlen);
+ if (*argz == NULL)
+ return ENOMEM;
+
+ rp = string;
+ wp = *argz;
+ do
+ if (*rp == delim)
+ {
+ if (wp > *argz && wp[-1] != '\0')
+ *wp++ = '\0';
+ else
+ --nlen;
+ }
+ else
+ *wp++ = *rp;
+ while (*rp++ != '\0');
+
+ if (nlen == 0)
+ {
+ free (*argz);
+ *argz = NULL;
+ *len = 0;
+ }
+
+ *len = nlen;
+ }
+ else
+ {
+ *argz = NULL;
+ *len = 0;
+ }
+
+ return 0;
+}
+
+
+/* Insert ENTRY into ARGZ & ARGZ_LEN before BEFORE, which should be an
+ existing entry in ARGZ; if BEFORE is NULL, ENTRY is appended to the end.
+ Since ARGZ's first entry is the same as ARGZ, argz_insert (ARGZ, ARGZ_LEN,
+ ARGZ, ENTRY) will insert ENTRY at the beginning of ARGZ. If BEFORE is not
+ in ARGZ, EINVAL is returned, else if memory can't be allocated for the new
+ ARGZ, ENOMEM is returned, else 0. */
+error_t
+argz_insert (char **argz, size_t *argz_len, char *before, const char *entry)
+{
+ if (! before)
+ return argz_add (argz, argz_len, entry);
+
+ if (before < *argz || before >= *argz + *argz_len)
+ return EINVAL;
+
+ if (before > *argz)
+ /* Make sure before is actually the beginning of an entry. */
+ while (before[-1])
+ before--;
+
+ {
+ size_t after_before = *argz_len - (before - *argz);
+ size_t entry_len = strlen (entry) + 1;
+ size_t new_argz_len = *argz_len + entry_len;
+ char *new_argz = realloc (*argz, new_argz_len);
+
+ if (new_argz)
+ {
+ before = new_argz + (before - *argz);
+ memmove (before + entry_len, before, after_before);
+ memmove (before, entry, entry_len);
+ *argz = new_argz;
+ *argz_len = new_argz_len;
+ return 0;
+ }
+ else
+ return ENOMEM;
+ }
+}
+
+
+char *
+argz_next (const char *argz, size_t argz_len, const char *entry)
+{
+ if (entry)
+ {
+ if (entry < argz + argz_len)
+ entry = strchr (entry, '\0') + 1;
+
+ return entry >= argz + argz_len ? NULL : (char *) entry;
+ }
+ else
+ if (argz_len > 0)
+ return (char *) argz;
+ else
+ return NULL;
+}
+
+
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+ except the last into the character SEP. */
+void
+argz_stringify (char *argz, size_t len, int sep)
+{
+ if (len > 0)
+ while (1)
+ {
+ size_t part_len = strnlen (argz, len);
+ argz += part_len;
+ len -= part_len;
+ if (len-- <= 1) /* includes final '\0' we want to stop at */
+ break;
+ *argz++ = sep;
+ }
+}
+
+
+/* Returns the number of strings in ARGZ. */
+size_t
+argz_count (const char *argz, size_t len)
+{
+ size_t count = 0;
+ while (len > 0)
+ {
+ size_t part_len = strlen(argz);
+ argz += part_len + 1;
+ len -= part_len + 1;
+ count++;
+ }
+ return count;
+}
+
+
+/* Puts pointers to each string in ARGZ, plus a terminating 0 element, into
+ ARGV, which must be large enough to hold them all. */
+void
+argz_extract (const char *argz, size_t len, char **argv)
+{
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ *argv++ = (char *) argz;
+ argz += part_len + 1;
+ len -= part_len + 1;
+ }
+ *argv = 0;
+}
+
+
+/* Make a '\0' separated arg vector from a unix argv vector, returning it in
+ ARGZ, and the total length in LEN. If a memory allocation error occurs,
+ ENOMEM is returned, otherwise 0. */
+error_t
+argz_create (char *const argv[], char **argz, size_t *len)
+{
+ int argc;
+ size_t tlen = 0;
+ char *const *ap;
+ char *p;
+
+ for (argc = 0; argv[argc] != NULL; ++argc)
+ tlen += strlen (argv[argc]) + 1;
+
+ if (tlen == 0)
+ *argz = NULL;
+ else
+ {
+ *argz = malloc (tlen);
+ if (*argz == NULL)
+ return ENOMEM;
+
+ for (p = *argz, ap = argv; *ap; ++ap, ++p)
+ p = stpcpy (p, *ap);
+ }
+ *len = tlen;
+
+ return 0;
+}
+
+
+/* Delete ENTRY from ARGZ & ARGZ_LEN, if any. */
+void
+argz_delete (char **argz, size_t *argz_len, char *entry)
+{
+ if (entry)
+ /* Get rid of the old value for NAME. */
+ {
+ size_t entry_len = strlen (entry) + 1;
+ *argz_len -= entry_len;
+ memmove (entry, entry + entry_len, *argz_len - (entry - *argz));
+ if (*argz_len == 0)
+ {
+ free (*argz);
+ *argz = 0;
+ }
+ }
+}
+
+
+/* Append BUF, of length BUF_LEN to *TO, of length *TO_LEN, reallocating and
+ updating *TO & *TO_LEN appropriately. If an allocation error occurs,
+ *TO's old value is freed, and *TO is set to 0. */
+static void
+str_append (char **to, size_t *to_len, const char *buf, const size_t buf_len)
+{
+ size_t new_len = *to_len + buf_len;
+ char *new_to = realloc (*to, new_len + 1);
+
+ if (new_to)
+ {
+ *((char *) mempcpy (new_to + *to_len, buf, buf_len)) = '\0';
+ *to = new_to;
+ *to_len = new_len;
+ }
+ else
+ {
+ free (*to);
+ *to = 0;
+ }
+}
+
+/* Replace any occurrences of the string STR in ARGZ with WITH, reallocating
+ ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
+ incremented by number of replacements performed. */
+error_t
+argz_replace (char **argz, size_t *argz_len, const char *str, const char *with,
+ unsigned *replace_count)
+{
+ error_t err = 0;
+
+ if (str && *str)
+ {
+ char *arg = 0;
+ char *src = *argz;
+ size_t src_len = *argz_len;
+ char *dst = 0;
+ size_t dst_len = 0;
+ int delayed_copy = 1; /* True while we've avoided copying anything. */
+ size_t str_len = strlen (str), with_len = strlen (with);
+
+ while (!err && (arg = argz_next (src, src_len, arg)))
+ {
+ char *match = strstr (arg, str);
+ if (match)
+ {
+ char *from = match + str_len;
+ size_t to_len = match - arg;
+ char *to = strndup (arg, to_len);
+
+ while (to && from)
+ {
+ str_append (&to, &to_len, with, with_len);
+ if (to)
+ {
+ match = strstr (from, str);
+ if (match)
+ {
+ str_append (&to, &to_len, from, match - from);
+ from = match + str_len;
+ }
+ else
+ {
+ str_append (&to, &to_len, from, strlen (from));
+ from = 0;
+ }
+ }
+ }
+
+ if (to)
+ {
+ if (delayed_copy)
+ /* We avoided copying SRC to DST until we found a match;
+ now that we've done so, copy everything from the start
+ of SRC. */
+ {
+ if (arg > src)
+ err = argz_append (&dst, &dst_len, src, (arg - src));
+ delayed_copy = 0;
+ }
+ if (! err)
+ err = argz_add (&dst, &dst_len, to);
+ free (to);
+ }
+ else
+ err = ENOMEM;
+
+ if (replace_count)
+ (*replace_count)++;
+ }
+ else if (! delayed_copy)
+ err = argz_add (&dst, &dst_len, arg);
+ }
+
+ if (! err)
+ {
+ if (! delayed_copy)
+ /* We never found any instances of str. */
+ {
+ free (src);
+ *argz = dst;
+ *argz_len = dst_len;
+ }
+ }
+ else if (dst_len > 0)
+ free (dst);
+ }
+
+ return err;
+}
diff --git a/gnulib/lib/argz.in.h b/gnulib/lib/argz.in.h
new file mode 100644
index 00000000..ae042397
--- /dev/null
+++ b/gnulib/lib/argz.in.h
@@ -0,0 +1,160 @@
+/* Routines for dealing with '\0' separated arg vectors.
+ Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2004, 2007, 2009, 2010
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _ARGZ_H
+#define _ARGZ_H 1
+
+
+#define __need_error_t
+#include <errno.h>
+#include <string.h> /* Need size_t, and strchr is called below. */
+
+#ifndef const
+# define const const
+#endif
+
+#ifndef __error_t_defined
+typedef int error_t;
+#endif
+
+
+
+/* Make a '\0' separated arg vector from a unix argv vector, returning it in
+ ARGZ, and the total length in LEN. If a memory allocation error occurs,
+ ENOMEM is returned, otherwise 0. The result can be destroyed using free. */
+
+extern error_t argz_create (char *const __argv[], char **restrict __argz,
+ size_t *restrict __len);
+
+/* Make a '\0' separated arg vector from a SEP separated list in
+ STRING, returning it in ARGZ, and the total length in LEN. If a
+ memory allocation error occurs, ENOMEM is returned, otherwise 0.
+ The result can be destroyed using free. */
+
+extern error_t argz_create_sep (const char *restrict string,
+ int __sep, char **restrict __argz,
+ size_t *restrict __len);
+
+/* Returns the number of strings in ARGZ. */
+
+extern size_t argz_count (const char *__argz, size_t __len)
+;
+
+/* Puts pointers to each string in ARGZ into ARGV, which must be large enough
+ to hold them all. */
+
+extern void argz_extract (const char *restrict __argz, size_t __len,
+ char **restrict __argv);
+
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+ except the last into the character SEP. */
+
+extern void argz_stringify (char *__argz, size_t __len, int __sep);
+
+/* Append BUF, of length BUF_LEN to the argz vector in ARGZ & ARGZ_LEN. */
+
+extern error_t argz_append (char **restrict __argz,
+ size_t *restrict __argz_len,
+ const char *restrict __buf, size_t __buf_len)
+;
+
+/* Append STR to the argz vector in ARGZ & ARGZ_LEN. */
+
+extern error_t argz_add (char **restrict __argz,
+ size_t *restrict __argz_len,
+ const char *restrict str);
+
+/* Append SEP separated list in STRING to the argz vector in ARGZ &
+ ARGZ_LEN. */
+
+extern error_t argz_add_sep (char **restrict __argz,
+ size_t *restrict __argz_len,
+ const char *restrict string, int __delim)
+;
+
+/* Delete ENTRY from ARGZ & ARGZ_LEN, if it appears there. */
+
+extern void argz_delete (char **restrict __argz,
+ size_t *restrict __argz_len,
+ char *restrict __entry);
+
+/* Insert ENTRY into ARGZ & ARGZ_LEN before BEFORE, which should be an
+ existing entry in ARGZ; if BEFORE is NULL, ENTRY is appended to the end.
+ Since ARGZ's first entry is the same as ARGZ, argz_insert (ARGZ, ARGZ_LEN,
+ ARGZ, ENTRY) will insert ENTRY at the beginning of ARGZ. If BEFORE is not
+ in ARGZ, EINVAL is returned, else if memory can't be allocated for the new
+ ARGZ, ENOMEM is returned, else 0. */
+
+extern error_t argz_insert (char **restrict __argz,
+ size_t *restrict __argz_len,
+ char *restrict __before,
+ const char *restrict __entry);
+
+/* Replace any occurrences of the string STR in ARGZ with WITH, reallocating
+ ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
+ incremented by number of replacements performed. */
+
+extern error_t argz_replace (char **restrict __argz,
+ size_t *restrict __argz_len,
+ const char *restrict str,
+ const char *restrict __with,
+ unsigned int *restrict __replace_count);
+
+/* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there
+ are no more. If entry is NULL, then the first entry is returned. This
+ behavior allows two convenient iteration styles:
+
+ char *entry = 0;
+ while ((entry = argz_next (argz, argz_len, entry)))
+ ...;
+
+ or
+
+ char *entry;
+ for (entry = argz; entry; entry = argz_next (argz, argz_len, entry))
+ ...;
+*/
+
+extern char *argz_next (const char *restrict __argz, size_t __argz_len,
+ const char *restrict __entry);
+
+#ifdef __USE_EXTERN_INLINES
+__extern_inline char *
+__NTH (argz_next (const char *__argz, size_t __argz_len,
+ const char *__entry))
+{
+ if (__entry)
+ {
+ if (__entry < __argz + __argz_len)
+ __entry = strchr (__entry, '\0') + 1;
+
+ return __entry >= __argz + __argz_len ? (char *) NULL : (char *) __entry;
+ }
+ else
+ return __argz_len > 0 ? (char *) __argz : 0;
+}
+__extern_inline char *
+__NTH (argz_next (const char *__argz, size_t __argz_len,
+ const char *__entry))
+{
+ return argz_next (__argz, __argz_len, __entry);
+}
+#endif /* Use extern inlines. */
+
+
+#endif /* argz.h */
diff --git a/gnulib/lib/arpa_inet.in.h b/gnulib/lib/arpa_inet.in.h
new file mode 100644
index 00000000..a1206918
--- /dev/null
+++ b/gnulib/lib/arpa_inet.in.h
@@ -0,0 +1,97 @@
+/* A GNU-like <arpa/inet.h>.
+
+ Copyright (C) 2005-2006, 2008-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_ARPA_INET_H
+
+/* Gnulib's sys/socket.h is responsible for pulling in winsock2.h etc
+ under MinGW.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <sys/socket.h>
+#endif
+
+#if @HAVE_ARPA_INET_H@
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_ARPA_INET_H@
+
+#endif
+
+#ifndef _GL_ARPA_INET_H
+#define _GL_ARPA_INET_H
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_INET_NTOP@
+# if !@HAVE_DECL_INET_NTOP@
+/* Converts an internet address from internal format to a printable,
+ presentable format.
+ AF is an internet address family, such as AF_INET or AF_INET6.
+ SRC points to a 'struct in_addr' (for AF_INET) or 'struct in6_addr'
+ (for AF_INET6).
+ DST points to a buffer having room for CNT bytes.
+ The printable representation of the address (in numeric form, not
+ surrounded by [...], no reverse DNS is done) is placed in DST, and
+ DST is returned. If an error occurs, the return value is NULL and
+ errno is set. If CNT bytes are not sufficient to hold the result,
+ the return value is NULL and errno is set to ENOSPC. A good value
+ for CNT is 46.
+
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/inet_ntop.html>. */
+extern const char *inet_ntop (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+ _GL_ARG_NONNULL ((2, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef inet_ntop
+# if HAVE_RAW_DECL_INET_NTOP
+_GL_WARN_ON_USE (inet_ntop, "inet_ntop is unportable - "
+ "use gnulib module inet_ntop for portability");
+# endif
+#endif
+
+#if @GNULIB_INET_PTON@
+# if !@HAVE_DECL_INET_PTON@
+extern int inet_pton (int af, const char *restrict src, void *restrict dst)
+ _GL_ARG_NONNULL ((2, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef inet_pton
+# if HAVE_RAW_DECL_INET_PTON
+_GL_WARN_ON_USE (inet_pton, "inet_pton is unportable - "
+ "use gnulib module inet_pton for portability");
+# endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_ARPA_INET_H */
+#endif /* _GL_ARPA_INET_H */
diff --git a/gnulib/lib/array-mergesort.h b/gnulib/lib/array-mergesort.h
new file mode 100644
index 00000000..61bf7280
--- /dev/null
+++ b/gnulib/lib/array-mergesort.h
@@ -0,0 +1,274 @@
+/* Stable-sorting of an array using mergesort.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This file implements stable sorting of an array, using the mergesort
+ algorithm.
+ Worst-case running time for an array of length N is O(N log N).
+ Unlike the mpsort module, the algorithm here attempts to minimize not
+ only the number of comparisons, but also the number of copying operations.
+
+ Before including this file, you need to define
+ ELEMENT The type of every array element.
+ COMPARE A two-argument macro that takes two 'const ELEMENT *'
+ pointers and returns a negative, zero, or positive 'int'
+ value if the element pointed to by the first argument is,
+ respectively, less, equal, or greater than the element
+ pointed to by the second argument.
+ STATIC The storage class of the functions being defined.
+ Before including this file, you also need to include:
+ #include <stddef.h>
+ */
+
+/* Merge the sorted arrays src1[0..n1-1] and src2[0..n2-1] into
+ dst[0..n1+n2-1]. In case of ambiguity, put the elements of src1
+ before the elements of src2.
+ n1 and n2 must be > 0.
+ The arrays src1 and src2 must not overlap the dst array, except that
+ src1 may be dst[n2..n1+n2-1], or src2 may be dst[n1..n1+n2-1]. */
+static void
+merge (const ELEMENT *src1, size_t n1,
+ const ELEMENT *src2, size_t n2,
+ ELEMENT *dst)
+{
+ for (;;) /* while (n1 > 0 && n2 > 0) */
+ {
+ if (COMPARE (src1, src2) <= 0)
+ {
+ *dst++ = *src1++;
+ n1--;
+ if (n1 == 0)
+ break;
+ }
+ else
+ {
+ *dst++ = *src2++;
+ n2--;
+ if (n2 == 0)
+ break;
+ }
+ }
+ /* Here n1 == 0 || n2 == 0 but also n1 > 0 || n2 > 0. */
+ if (n1 > 0)
+ {
+ if (dst != src1)
+ do
+ {
+ *dst++ = *src1++;
+ n1--;
+ }
+ while (n1 > 0);
+ }
+ else /* n2 > 0 */
+ {
+ if (dst != src2)
+ do
+ {
+ *dst++ = *src2++;
+ n2--;
+ }
+ while (n2 > 0);
+ }
+}
+
+/* Sort src[0..n-1] into dst[0..n-1], using tmp[0..n/2-1] as temporary
+ (scratch) storage.
+ The arrays src, dst, tmp must not overlap. */
+STATIC void
+merge_sort_fromto (const ELEMENT *src, ELEMENT *dst, size_t n, ELEMENT *tmp)
+{
+ switch (n)
+ {
+ case 0:
+ return;
+ case 1:
+ /* Nothing to do. */
+ dst[0] = src[0];
+ return;
+ case 2:
+ /* Trivial case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ /* src[0] <= src[1] */
+ dst[0] = src[0];
+ dst[1] = src[1];
+ }
+ else
+ {
+ dst[0] = src[1];
+ dst[1] = src[0];
+ }
+ break;
+ case 3:
+ /* Simple case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[0] <= src[1] <= src[2] */
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ }
+ else if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[0] <= src[2] < src[1] */
+ dst[0] = src[0];
+ dst[1] = src[2];
+ dst[2] = src[1];
+ }
+ else
+ {
+ /* src[2] < src[0] <= src[1] */
+ dst[0] = src[2];
+ dst[1] = src[0];
+ dst[2] = src[1];
+ }
+ }
+ else
+ {
+ if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[1] < src[0] <= src[2] */
+ dst[0] = src[1];
+ dst[1] = src[0];
+ dst[2] = src[2];
+ }
+ else if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[1] <= src[2] < src[0] */
+ dst[0] = src[1];
+ dst[1] = src[2];
+ dst[2] = src[0];
+ }
+ else
+ {
+ /* src[2] < src[1] < src[0] */
+ dst[0] = src[2];
+ dst[1] = src[1];
+ dst[2] = src[0];
+ }
+ }
+ break;
+ default:
+ {
+ size_t n1 = n / 2;
+ size_t n2 = (n + 1) / 2;
+ /* Note: n1 + n2 = n, n1 <= n2. */
+ /* Sort src[n1..n-1] into dst[n1..n-1], scratching tmp[0..n2/2-1]. */
+ merge_sort_fromto (src + n1, dst + n1, n2, tmp);
+ /* Sort src[0..n1-1] into tmp[0..n1-1], scratching dst[0..n1-1]. */
+ merge_sort_fromto (src, tmp, n1, dst);
+ /* Merge the two half results. */
+ merge (tmp, n1, dst + n1, n2, dst);
+ }
+ break;
+ }
+}
+
+/* Sort src[0..n-1], using tmp[0..n-1] as temporary (scratch) storage.
+ The arrays src, tmp must not overlap. */
+STATIC void
+merge_sort_inplace (ELEMENT *src, size_t n, ELEMENT *tmp)
+{
+ switch (n)
+ {
+ case 0:
+ case 1:
+ /* Nothing to do. */
+ return;
+ case 2:
+ /* Trivial case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ /* src[0] <= src[1] */
+ }
+ else
+ {
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = t;
+ }
+ break;
+ case 3:
+ /* Simple case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[0] <= src[1] <= src[2] */
+ }
+ else if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[0] <= src[2] < src[1] */
+ ELEMENT t = src[1];
+ src[1] = src[2];
+ src[2] = t;
+ }
+ else
+ {
+ /* src[2] < src[0] <= src[1] */
+ ELEMENT t = src[0];
+ src[0] = src[2];
+ src[2] = src[1];
+ src[1] = t;
+ }
+ }
+ else
+ {
+ if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[1] < src[0] <= src[2] */
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = t;
+ }
+ else if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[1] <= src[2] < src[0] */
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = src[2];
+ src[2] = t;
+ }
+ else
+ {
+ /* src[2] < src[1] < src[0] */
+ ELEMENT t = src[0];
+ src[0] = src[2];
+ src[2] = t;
+ }
+ }
+ break;
+ default:
+ {
+ size_t n1 = n / 2;
+ size_t n2 = (n + 1) / 2;
+ /* Note: n1 + n2 = n, n1 <= n2. */
+ /* Sort src[n1..n-1], scratching tmp[0..n2-1]. */
+ merge_sort_inplace (src + n1, n2, tmp);
+ /* Sort src[0..n1-1] into tmp[0..n1-1], scratching tmp[n1..2*n1-1]. */
+ merge_sort_fromto (src, tmp, n1, tmp + n1);
+ /* Merge the two half results. */
+ merge (tmp, n1, src + n1, n2, src);
+ }
+ break;
+ }
+}
+
+#undef ELEMENT
+#undef COMPARE
+#undef STATIC
diff --git a/gnulib/lib/asinl.c b/gnulib/lib/asinl.c
new file mode 100644
index 00000000..5dee0cbc
--- /dev/null
+++ b/gnulib/lib/asinl.c
@@ -0,0 +1,220 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+/*
+ Long double expansions contributed by
+ Stephen L. Moshier <moshier@na-net.ornl.gov>
+*/
+
+/* asin(x)
+ * Method :
+ * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
+ * we approximate asin(x) on [0,0.5] by
+ * asin(x) = x + x*x^2*R(x^2)
+ * Between .5 and .625 the approximation is
+ * asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
+ * For x in [0.625,1]
+ * asin(x) = pi/2-2*asin(sqrt((1-x)/2))
+ *
+ * Special cases:
+ * if x is NaN, return x itself;
+ * if |x|>1, return NaN with invalid signal.
+ *
+ */
+
+
+static const long double
+ one = 1.0L,
+ huge = 1.0e+4932L,
+ pio2_hi = 1.5707963267948966192313216916397514420986L,
+ pio2_lo = 4.3359050650618905123985220130216759843812E-35L,
+ pio4_hi = 7.8539816339744830961566084581987569936977E-1L,
+
+ /* coefficient for R(x^2) */
+
+ /* asin(x) = x + x^3 pS(x^2) / qS(x^2)
+ 0 <= x <= 0.5
+ peak relative error 1.9e-35 */
+ pS0 = -8.358099012470680544198472400254596543711E2L,
+ pS1 = 3.674973957689619490312782828051860366493E3L,
+ pS2 = -6.730729094812979665807581609853656623219E3L,
+ pS3 = 6.643843795209060298375552684423454077633E3L,
+ pS4 = -3.817341990928606692235481812252049415993E3L,
+ pS5 = 1.284635388402653715636722822195716476156E3L,
+ pS6 = -2.410736125231549204856567737329112037867E2L,
+ pS7 = 2.219191969382402856557594215833622156220E1L,
+ pS8 = -7.249056260830627156600112195061001036533E-1L,
+ pS9 = 1.055923570937755300061509030361395604448E-3L,
+
+ qS0 = -5.014859407482408326519083440151745519205E3L,
+ qS1 = 2.430653047950480068881028451580393430537E4L,
+ qS2 = -4.997904737193653607449250593976069726962E4L,
+ qS3 = 5.675712336110456923807959930107347511086E4L,
+ qS4 = -3.881523118339661268482937768522572588022E4L,
+ qS5 = 1.634202194895541569749717032234510811216E4L,
+ qS6 = -4.151452662440709301601820849901296953752E3L,
+ qS7 = 5.956050864057192019085175976175695342168E2L,
+ qS8 = -4.175375777334867025769346564600396877176E1L,
+ /* 1.000000000000000000000000000000000000000E0 */
+
+ /* asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
+ -0.0625 <= x <= 0.0625
+ peak relative error 3.3e-35 */
+ rS0 = -5.619049346208901520945464704848780243887E0L,
+ rS1 = 4.460504162777731472539175700169871920352E1L,
+ rS2 = -1.317669505315409261479577040530751477488E2L,
+ rS3 = 1.626532582423661989632442410808596009227E2L,
+ rS4 = -3.144806644195158614904369445440583873264E1L,
+ rS5 = -9.806674443470740708765165604769099559553E1L,
+ rS6 = 5.708468492052010816555762842394927806920E1L,
+ rS7 = 1.396540499232262112248553357962639431922E1L,
+ rS8 = -1.126243289311910363001762058295832610344E1L,
+ rS9 = -4.956179821329901954211277873774472383512E-1L,
+ rS10 = 3.313227657082367169241333738391762525780E-1L,
+
+ sS0 = -4.645814742084009935700221277307007679325E0L,
+ sS1 = 3.879074822457694323970438316317961918430E1L,
+ sS2 = -1.221986588013474694623973554726201001066E2L,
+ sS3 = 1.658821150347718105012079876756201905822E2L,
+ sS4 = -4.804379630977558197953176474426239748977E1L,
+ sS5 = -1.004296417397316948114344573811562952793E2L,
+ sS6 = 7.530281592861320234941101403870010111138E1L,
+ sS7 = 1.270735595411673647119592092304357226607E1L,
+ sS8 = -1.815144839646376500705105967064792930282E1L,
+ sS9 = -7.821597334910963922204235247786840828217E-2L,
+ /* 1.000000000000000000000000000000000000000E0 */
+
+ asinr5625 = 5.9740641664535021430381036628424864397707E-1L;
+
+
+long double
+asinl (long double x)
+{
+ long double y, t, p, q;
+ int sign;
+
+ sign = 1;
+ y = x;
+ if (x < 0.0L)
+ {
+ sign = -1;
+ y = -x;
+ }
+
+ if (y >= 1.0L) /* |x|>= 1 */
+ {
+ if (y == 1.0L)
+ /* asin(1)=+-pi/2 with inexact */
+ return x * pio2_hi + x * pio2_lo;
+
+ return (x - x) / (x - x); /* asin(|x|>1) is NaN */
+ }
+ else if (y < 0.5L) /* |x| < 0.5 */
+ {
+ if (y < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2**-57 */
+ if (huge + y > one)
+ return y; /* return x with inexact if x!=0 */
+
+ t = x * x;
+ p = (((((((((pS9 * t
+ + pS8) * t
+ + pS7) * t
+ + pS6) * t
+ + pS5) * t
+ + pS4) * t
+ + pS3) * t
+ + pS2) * t
+ + pS1) * t
+ + pS0) * t;
+
+ q = (((((((( t
+ + qS8) * t
+ + qS7) * t
+ + qS6) * t
+ + qS5) * t
+ + qS4) * t
+ + qS3) * t
+ + qS2) * t
+ + qS1) * t
+ + qS0;
+
+ return x + x * (p / q);
+ }
+
+ else if (y < 0.625) /* 0.625 */
+ {
+ t = y - 0.5625;
+ p = ((((((((((rS10 * t
+ + rS9) * t
+ + rS8) * t
+ + rS7) * t
+ + rS6) * t
+ + rS5) * t
+ + rS4) * t
+ + rS3) * t
+ + rS2) * t
+ + rS1) * t
+ + rS0) * t;
+
+ q = ((((((((( t
+ + sS9) * t
+ + sS8) * t
+ + sS7) * t
+ + sS6) * t
+ + sS5) * t
+ + sS4) * t
+ + sS3) * t
+ + sS2) * t
+ + sS1) * t
+ + sS0;
+ t = asinr5625 + p / q;
+ }
+ else
+ t = pio2_hi + pio2_lo - 2 * asinl(sqrtl((1-y)/2));
+
+ return t * sign;
+}
+
+#if 0
+int
+main (void)
+{
+ printf ("%.18Lg %.18Lg\n",
+ asinl(1.0L),
+ 1.5707963267948966192313216916397514420984L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl(0.7071067811865475244008443621048490392848L),
+ 0.7853981633974483096156608458198757210492L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl(0.5L),
+ 0.5235987755982988730771072305465838140328L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl(0.3090169943749474241022934171828190588600L),
+ 0.3141592653589793238462643383279502884196L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl(-1.0L),
+ -1.5707963267948966192313216916397514420984L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl(-0.7071067811865475244008443621048490392848L),
+ -0.7853981633974483096156608458198757210492L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl(-0.5L),
+ -0.5235987755982988730771072305465838140328L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl(-0.3090169943749474241022934171828190588600L),
+ -0.3141592653589793238462643383279502884196L);
+}
+#endif
diff --git a/gnulib/lib/asnprintf.c b/gnulib/lib/asnprintf.c
new file mode 100644
index 00000000..10ef82a5
--- /dev/null
+++ b/gnulib/lib/asnprintf.c
@@ -0,0 +1,35 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "vasnprintf.h"
+
+#include <stdarg.h>
+
+char *
+asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *result;
+
+ va_start (args, format);
+ result = vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/asprintf.c b/gnulib/lib/asprintf.c
new file mode 100644
index 00000000..0c1ba2cc
--- /dev/null
+++ b/gnulib/lib/asprintf.c
@@ -0,0 +1,40 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef IN_LIBASPRINTF
+# include "vasprintf.h"
+#else
+# include <stdio.h>
+#endif
+
+#include <stdarg.h>
+
+int
+asprintf (char **resultp, const char *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = vasprintf (resultp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/at-func.c b/gnulib/lib/at-func.c
new file mode 100644
index 00000000..ea456edf
--- /dev/null
+++ b/gnulib/lib/at-func.c
@@ -0,0 +1,131 @@
+/* Define an at-style functions like fstatat, unlinkat, fchownat, etc.
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "openat.h"
+#include "openat-priv.h"
+#include "save-cwd.h"
+
+#ifdef AT_FUNC_USE_F1_COND
+# define CALL_FUNC(F) \
+ (flag == AT_FUNC_USE_F1_COND \
+ ? AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS) \
+ : AT_FUNC_F2 (F AT_FUNC_POST_FILE_ARGS))
+# define VALIDATE_FLAG(F) \
+ if (flag & ~AT_FUNC_USE_F1_COND) \
+ { \
+ errno = EINVAL; \
+ return FUNC_FAIL; \
+ }
+#else
+# define CALL_FUNC(F) (AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS))
+# define VALIDATE_FLAG(F) /* empty */
+#endif
+
+#ifdef AT_FUNC_RESULT
+# define FUNC_RESULT AT_FUNC_RESULT
+#else
+# define FUNC_RESULT int
+#endif
+
+#ifdef AT_FUNC_FAIL
+# define FUNC_FAIL AT_FUNC_FAIL
+#else
+# define FUNC_FAIL -1
+#endif
+
+/* Call AT_FUNC_F1 to operate on FILE, which is in the directory
+ open on descriptor FD. If AT_FUNC_USE_F1_COND is defined to a value,
+ AT_FUNC_POST_FILE_PARAM_DECLS must inlude a parameter named flag;
+ call AT_FUNC_F2 if FLAG is 0 or fail if FLAG contains more bits than
+ AT_FUNC_USE_F1_COND. Return int and fail with -1 unless AT_FUNC_RESULT
+ or AT_FUNC_FAIL are defined. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then AT_FUNC_F?/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+FUNC_RESULT
+AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
+{
+ /* Be careful to choose names unlikely to conflict with
+ AT_FUNC_POST_FILE_PARAM_DECLS. */
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ FUNC_RESULT err;
+
+ VALIDATE_FLAG (flag);
+
+ if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+ return CALL_FUNC (file);
+
+ {
+ char proc_buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (proc_buf, fd, file);
+ if (proc_file)
+ {
+ FUNC_RESULT proc_result = CALL_FUNC (proc_file);
+ int proc_errno = errno;
+ if (proc_file != proc_buf)
+ free (proc_file);
+ /* If the syscall succeeds, or if it fails with an unexpected
+ errno value, then return right away. Otherwise, fall through
+ and resort to using save_cwd/restore_cwd. */
+ if (FUNC_FAIL != proc_result)
+ return proc_result;
+ if (! EXPECTED_ERRNO (proc_errno))
+ {
+ errno = proc_errno;
+ return proc_result;
+ }
+ }
+ }
+
+ if (save_cwd (&saved_cwd) != 0)
+ openat_save_fail (errno);
+ if (0 <= fd && fd == saved_cwd.desc)
+ {
+ /* If saving the working directory collides with the user's
+ requested fd, then the user's fd must have been closed to
+ begin with. */
+ free_cwd (&saved_cwd);
+ errno = EBADF;
+ return FUNC_FAIL;
+ }
+
+ if (fchdir (fd) != 0)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return FUNC_FAIL;
+ }
+
+ err = CALL_FUNC (file);
+ saved_errno = (err == FUNC_FAIL ? errno : 0);
+
+ if (restore_cwd (&saved_cwd) != 0)
+ openat_restore_fail (errno);
+
+ free_cwd (&saved_cwd);
+
+ if (saved_errno)
+ errno = saved_errno;
+ return err;
+}
+#undef CALL_FUNC
+#undef FUNC_RESULT
+#undef FUNC_FAIL
diff --git a/gnulib/lib/at-func2.c b/gnulib/lib/at-func2.c
new file mode 100644
index 00000000..f19d2ed4
--- /dev/null
+++ b/gnulib/lib/at-func2.c
@@ -0,0 +1,282 @@
+/* Define an at-style functions like linkat or renameat.
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering and Eric Blake */
+
+#include <config.h>
+
+#include "openat-priv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "filenamecat.h"
+#include "openat.h"
+#include "same-inode.h"
+#include "save-cwd.h"
+
+/* Call FUNC to operate on a pair of files, where FILE1 is relative to FD1,
+ and FILE2 is relative to FD2. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ FUNC, restore_cwd (up to two times). If either the save_cwd or the
+ restore_cwd fails, then give a diagnostic and exit nonzero. */
+int
+at_func2 (int fd1, char const *file1,
+ int fd2, char const *file2,
+ int (*func) (char const *file1, char const *file2))
+{
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ int err;
+ char *file1_alt;
+ char *file2_alt;
+ struct stat st1;
+ struct stat st2;
+
+ /* There are 16 possible scenarios, based on whether an fd is
+ AT_FDCWD or real, and whether a file is absolute or relative:
+
+ fd1 file1 fd2 file2 action
+ 0 cwd abs cwd abs direct call
+ 1 cwd abs cwd rel direct call
+ 2 cwd abs fd abs direct call
+ 3 cwd abs fd rel chdir to fd2
+ 4 cwd rel cwd abs direct call
+ 5 cwd rel cwd rel direct call
+ 6 cwd rel fd abs direct call
+ 7 cwd rel fd rel convert file1 to abs, then case 3
+ 8 fd abs cwd abs direct call
+ 9 fd abs cwd rel direct call
+ 10 fd abs fd abs direct call
+ 11 fd abs fd rel chdir to fd2
+ 12 fd rel cwd abs chdir to fd1
+ 13 fd rel cwd rel convert file2 to abs, then case 12
+ 14 fd rel fd abs chdir to fd1
+ 15a fd1 rel fd1 rel chdir to fd1
+ 15b fd1 rel fd2 rel chdir to fd1, then case 7
+
+ Try some optimizations to reduce fd to AT_FDCWD, or to at least
+ avoid converting an absolute name or doing a double chdir. */
+
+ if ((fd1 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file1))
+ && (fd2 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file2)))
+ return func (file1, file2); /* Case 0-2, 4-6, 8-10. */
+
+ /* If /proc/self/fd works, we don't need any stat or chdir. */
+ {
+ char proc_buf1[OPENAT_BUFFER_SIZE];
+ char *proc_file1 = ((fd1 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file1))
+ ? (char *) file1
+ : openat_proc_name (proc_buf1, fd1, file1));
+ if (proc_file1)
+ {
+ char proc_buf2[OPENAT_BUFFER_SIZE];
+ char *proc_file2 = ((fd2 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file2))
+ ? (char *) file2
+ : openat_proc_name (proc_buf2, fd2, file2));
+ if (proc_file2)
+ {
+ int proc_result = func (proc_file1, proc_file2);
+ int proc_errno = errno;
+ if (proc_file1 != proc_buf1 && proc_file1 != file1)
+ free (proc_file1);
+ if (proc_file2 != proc_buf2 && proc_file2 != file2)
+ free (proc_file2);
+ /* If the syscall succeeds, or if it fails with an unexpected
+ errno value, then return right away. Otherwise, fall through
+ and resort to using save_cwd/restore_cwd. */
+ if (0 <= proc_result)
+ return proc_result;
+ if (! EXPECTED_ERRNO (proc_errno))
+ {
+ errno = proc_errno;
+ return proc_result;
+ }
+ }
+ else if (proc_file1 != proc_buf1 && proc_file1 != file1)
+ free (proc_file1);
+ }
+ }
+
+ /* Cases 3, 7, 11-15 remain. Time to normalize directory fds, if
+ possible. */
+ if (IS_ABSOLUTE_FILE_NAME (file1))
+ fd1 = AT_FDCWD; /* Case 11 reduced to 3. */
+ else if (IS_ABSOLUTE_FILE_NAME (file2))
+ fd2 = AT_FDCWD; /* Case 14 reduced to 12. */
+
+ /* Cases 3, 7, 12, 13, 15 remain. */
+
+ if (fd1 == AT_FDCWD) /* Cases 3, 7. */
+ {
+ if (stat (".", &st1) == -1 || fstat (fd2, &st2) == -1)
+ return -1;
+ if (!S_ISDIR (st2.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (SAME_INODE (st1, st2)) /* Reduced to cases 1, 5. */
+ return func (file1, file2);
+ }
+ else if (fd2 == AT_FDCWD) /* Cases 12, 13. */
+ {
+ if (stat (".", &st2) == -1 || fstat (fd1, &st1) == -1)
+ return -1;
+ if (!S_ISDIR (st1.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (SAME_INODE (st1, st2)) /* Reduced to cases 4, 5. */
+ return func (file1, file2);
+ }
+ else if (fd1 != fd2) /* Case 15b. */
+ {
+ if (fstat (fd1, &st1) == -1 || fstat (fd2, &st2) == -1)
+ return -1;
+ if (!S_ISDIR (st1.st_mode) || !S_ISDIR (st2.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (SAME_INODE (st1, st2)) /* Reduced to case 15a. */
+ {
+ fd2 = fd1;
+ if (stat (".", &st1) == 0 && SAME_INODE (st1, st2))
+ return func (file1, file2); /* Further reduced to case 5. */
+ }
+ }
+ else /* Case 15a. */
+ {
+ if (fstat (fd1, &st1) == -1)
+ return -1;
+ if (!S_ISDIR (st1.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (stat (".", &st2) == 0 && SAME_INODE (st1, st2))
+ return func (file1, file2); /* Reduced to case 5. */
+ }
+
+ /* Cases 3, 7, 12, 13, 15a, 15b remain. With all reductions in
+ place, it is time to start changing directories. */
+
+ if (save_cwd (&saved_cwd) != 0)
+ openat_save_fail (errno);
+
+ if (fd1 != AT_FDCWD && fd2 != AT_FDCWD && fd1 != fd2) /* Case 15b. */
+ {
+ if (fchdir (fd1) != 0)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ fd1 = AT_FDCWD; /* Reduced to case 7. */
+ }
+
+ /* Cases 3, 7, 12, 13, 15a remain. Convert one relative name to
+ absolute, if necessary. */
+
+ file1_alt = (char *) file1;
+ file2_alt = (char *) file2;
+
+ if (fd1 == AT_FDCWD && !IS_ABSOLUTE_FILE_NAME (file1)) /* Case 7. */
+ {
+ /* It would be nicer to use:
+ file1_alt = file_name_concat (xgetcwd (), file1, NULL);
+ but libraries should not call xalloc_die. */
+ char *cwd = getcwd (NULL, 0);
+ if (!cwd)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ file1_alt = mfile_name_concat (cwd, file1, NULL);
+ if (!file1_alt)
+ {
+ saved_errno = errno;
+ free (cwd);
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ free (cwd); /* Reduced to case 3. */
+ }
+ else if (fd2 == AT_FDCWD && !IS_ABSOLUTE_FILE_NAME (file2)) /* Case 13. */
+ {
+ char *cwd = getcwd (NULL, 0);
+ if (!cwd)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ file2_alt = mfile_name_concat (cwd, file2, NULL);
+ if (!file2_alt)
+ {
+ saved_errno = errno;
+ free (cwd);
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ free (cwd); /* Reduced to case 12. */
+ }
+
+ /* Cases 3, 12, 15a remain. Change to the correct directory. */
+ if (fchdir (fd1 == AT_FDCWD ? fd2 : fd1) != 0)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ if (file1 != file1_alt)
+ free (file1_alt);
+ else if (file2 != file2_alt)
+ free (file2_alt);
+ errno = saved_errno;
+ return -1;
+ }
+
+ /* Finally safe to perform the user's function, then clean up. */
+
+ err = func (file1_alt, file2_alt);
+ saved_errno = (err < 0 ? errno : 0);
+
+ if (file1 != file1_alt)
+ free (file1_alt);
+ else if (file2 != file2_alt)
+ free (file2_alt);
+
+ if (restore_cwd (&saved_cwd) != 0)
+ openat_restore_fail (errno);
+
+ free_cwd (&saved_cwd);
+
+ if (saved_errno)
+ errno = saved_errno;
+ return err;
+}
+#undef CALL_FUNC
+#undef FUNC_RESULT
diff --git a/gnulib/lib/atanl.c b/gnulib/lib/atanl.c
new file mode 100644
index 00000000..22a882d4
--- /dev/null
+++ b/gnulib/lib/atanl.c
@@ -0,0 +1,224 @@
+/* Copyright 2001 by Stephen L. Moshier <moshier@na-net.ornl.gov>
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+/* s_atanl.c
+ *
+ * Inverse circular tangent for 128-bit long double precision
+ * (arctangent)
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, atanl();
+ *
+ * y = atanl( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns radian angle between -pi/2 and +pi/2 whose tangent is x.
+ *
+ * The function uses a rational approximation of the form
+ * t + t^3 P(t^2)/Q(t^2), optimized for |t| < 0.09375.
+ *
+ * The argument is reduced using the identity
+ * arctan x - arctan u = arctan ((x-u)/(1 + ux))
+ * and an 83-entry lookup table for arctan u, with u = 0, 1/8, ..., 10.25.
+ * Use of the table improves the execution speed of the routine.
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE -19, 19 4e5 1.7e-34 5.4e-35
+ *
+ *
+ * WARNING:
+ *
+ * This program uses integer operations on bit fields of floating-point
+ * numbers. It does not work with data structures other than the
+ * structure assumed.
+ *
+ */
+
+/* arctan(k/8), k = 0, ..., 82 */
+static const long double atantbl[84] = {
+ 0.0000000000000000000000000000000000000000E0L,
+ 1.2435499454676143503135484916387102557317E-1L, /* arctan(0.125) */
+ 2.4497866312686415417208248121127581091414E-1L,
+ 3.5877067027057222039592006392646049977698E-1L,
+ 4.6364760900080611621425623146121440202854E-1L,
+ 5.5859931534356243597150821640166127034645E-1L,
+ 6.4350110879328438680280922871732263804151E-1L,
+ 7.1882999962162450541701415152590465395142E-1L,
+ 7.8539816339744830961566084581987572104929E-1L,
+ 8.4415398611317100251784414827164750652594E-1L,
+ 8.9605538457134395617480071802993782702458E-1L,
+ 9.4200004037946366473793717053459358607166E-1L,
+ 9.8279372324732906798571061101466601449688E-1L,
+ 1.0191413442663497346383429170230636487744E0L,
+ 1.0516502125483736674598673120862998296302E0L,
+ 1.0808390005411683108871567292171998202703E0L,
+ 1.1071487177940905030170654601785370400700E0L,
+ 1.1309537439791604464709335155363278047493E0L,
+ 1.1525719972156675180401498626127513797495E0L,
+ 1.1722738811284763866005949441337046149712E0L,
+ 1.1902899496825317329277337748293183376012E0L,
+ 1.2068173702852525303955115800565576303133E0L,
+ 1.2220253232109896370417417439225704908830E0L,
+ 1.2360594894780819419094519711090786987027E0L,
+ 1.2490457723982544258299170772810901230778E0L,
+ 1.2610933822524404193139408812473357720101E0L,
+ 1.2722973952087173412961937498224804940684E0L,
+ 1.2827408797442707473628852511364955306249E0L,
+ 1.2924966677897852679030914214070816845853E0L,
+ 1.3016288340091961438047858503666855921414E0L,
+ 1.3101939350475556342564376891719053122733E0L,
+ 1.3182420510168370498593302023271362531155E0L,
+ 1.3258176636680324650592392104284756311844E0L,
+ 1.3329603993374458675538498697331558093700E0L,
+ 1.3397056595989995393283037525895557411039E0L,
+ 1.3460851583802539310489409282517796256512E0L,
+ 1.3521273809209546571891479413898128509842E0L,
+ 1.3578579772154994751124898859640585287459E0L,
+ 1.3633001003596939542892985278250991189943E0L,
+ 1.3684746984165928776366381936948529556191E0L,
+ 1.3734007669450158608612719264449611486510E0L,
+ 1.3780955681325110444536609641291551522494E0L,
+ 1.3825748214901258580599674177685685125566E0L,
+ 1.3868528702577214543289381097042486034883E0L,
+ 1.3909428270024183486427686943836432060856E0L,
+ 1.3948567013423687823948122092044222644895E0L,
+ 1.3986055122719575950126700816114282335732E0L,
+ 1.4021993871854670105330304794336492676944E0L,
+ 1.4056476493802697809521934019958079881002E0L,
+ 1.4089588955564736949699075250792569287156E0L,
+ 1.4121410646084952153676136718584891599630E0L,
+ 1.4152014988178669079462550975833894394929E0L,
+ 1.4181469983996314594038603039700989523716E0L,
+ 1.4209838702219992566633046424614466661176E0L,
+ 1.4237179714064941189018190466107297503086E0L,
+ 1.4263547484202526397918060597281265695725E0L,
+ 1.4288992721907326964184700745371983590908E0L,
+ 1.4313562697035588982240194668401779312122E0L,
+ 1.4337301524847089866404719096698873648610E0L,
+ 1.4360250423171655234964275337155008780675E0L,
+ 1.4382447944982225979614042479354815855386E0L,
+ 1.4403930189057632173997301031392126865694E0L,
+ 1.4424730991091018200252920599377292525125E0L,
+ 1.4444882097316563655148453598508037025938E0L,
+ 1.4464413322481351841999668424758804165254E0L,
+ 1.4483352693775551917970437843145232637695E0L,
+ 1.4501726582147939000905940595923466567576E0L,
+ 1.4519559822271314199339700039142990228105E0L,
+ 1.4536875822280323362423034480994649820285E0L,
+ 1.4553696664279718992423082296859928222270E0L,
+ 1.4570043196511885530074841089245667532358E0L,
+ 1.4585935117976422128825857356750737658039E0L,
+ 1.4601391056210009726721818194296893361233E0L,
+ 1.4616428638860188872060496086383008594310E0L,
+ 1.4631064559620759326975975316301202111560E0L,
+ 1.4645314639038178118428450961503371619177E0L,
+ 1.4659193880646627234129855241049975398470E0L,
+ 1.4672716522843522691530527207287398276197E0L,
+ 1.4685896086876430842559640450619880951144E0L,
+ 1.4698745421276027686510391411132998919794E0L,
+ 1.4711276743037345918528755717617308518553E0L,
+ 1.4723501675822635384916444186631899205983E0L,
+ 1.4735431285433308455179928682541563973416E0L, /* arctan(10.25) */
+ 1.5707963267948966192313216916397514420986E0L /* pi/2 */
+};
+
+
+/* arctan t = t + t^3 p(t^2) / q(t^2)
+ |t| <= 0.09375
+ peak relative error 5.3e-37 */
+
+static const long double
+ p0 = -4.283708356338736809269381409828726405572E1L,
+ p1 = -8.636132499244548540964557273544599863825E1L,
+ p2 = -5.713554848244551350855604111031839613216E1L,
+ p3 = -1.371405711877433266573835355036413750118E1L,
+ p4 = -8.638214309119210906997318946650189640184E-1L,
+ q0 = 1.285112506901621042780814422948906537959E2L,
+ q1 = 3.361907253914337187957855834229672347089E2L,
+ q2 = 3.180448303864130128268191635189365331680E2L,
+ q3 = 1.307244136980865800160844625025280344686E2L,
+ q4 = 2.173623741810414221251136181221172551416E1L;
+ /* q5 = 1.000000000000000000000000000000000000000E0 */
+
+
+long double
+atanl (long double x)
+{
+ int k, sign;
+ long double t, u, p, q;
+
+ /* Check for zero or NaN. */
+ if (isnanl (x) || x == 0.0)
+ return x + x;
+
+ sign = x < 0.0;
+
+ if (x + x == x)
+ {
+ /* Infinity. */
+ if (sign)
+ return -atantbl[83];
+ else
+ return atantbl[83];
+ }
+
+ if (sign)
+ x = -x;
+
+ if (x >= 10.25)
+ {
+ k = 83;
+ t = -1.0/x;
+ }
+ else
+ {
+ /* Index of nearest table element.
+ Roundoff to integer is asymmetrical to avoid cancellation when t < 0
+ (cf. fdlibm). */
+ k = 8.0 * x + 0.25;
+ u = 0.125 * k;
+ /* Small arctan argument. */
+ t = (x - u) / (1.0 + x * u);
+ }
+
+ /* Arctan of small argument t. */
+ u = t * t;
+ p = ((((p4 * u) + p3) * u + p2) * u + p1) * u + p0;
+ q = ((((u + q4) * u + q3) * u + q2) * u + q1) * u + q0;
+ u = t * u * p / q + t;
+
+ /* arctan x = arctan u + arctan t */
+ u = atantbl[k] + u;
+ if (sign)
+ return (-u);
+ else
+ return u;
+}
diff --git a/gnulib/lib/atexit.c b/gnulib/lib/atexit.c
new file mode 100644
index 00000000..5ef33e57
--- /dev/null
+++ b/gnulib/lib/atexit.c
@@ -0,0 +1,13 @@
+/* Wrapper to implement ANSI C's atexit using SunOS's on_exit. */
+/* This function is in the public domain. --Mike Stump. */
+
+#include <config.h>
+
+int
+atexit (void (*f) (void))
+{
+ /* If the system doesn't provide a definition for atexit, use on_exit
+ if the system provides that. */
+ on_exit (f, 0);
+ return 0;
+}
diff --git a/gnulib/lib/atoll.c b/gnulib/lib/atoll.c
new file mode 100644
index 00000000..961be8c7
--- /dev/null
+++ b/gnulib/lib/atoll.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 1991, 1997, 1998, 2008, 2009, 2010 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdlib.h>
+
+#if _LIBC
+# undef atoll
+#endif
+
+
+/* Convert a string to a long long int. */
+long long int
+atoll (const char *nptr)
+{
+ return strtoll (nptr, (char **) NULL, 10);
+}
diff --git a/gnulib/lib/backupfile.c b/gnulib/lib/backupfile.c
new file mode 100644
index 00000000..7a70f403
--- /dev/null
+++ b/gnulib/lib/backupfile.c
@@ -0,0 +1,355 @@
+/* backupfile.c -- make Emacs style backup file names
+
+ Copyright (C) 1990-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert and David MacKenzie.
+ Some algorithms adapted from GNU Emacs. */
+
+#include <config.h>
+
+#include "backupfile.h"
+
+#include "argmatch.h"
+#include "dirname.h"
+#include "xalloc.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <limits.h>
+
+#include <unistd.h>
+
+#include "dirent--.h"
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
+#endif
+#if D_INO_IN_DIRENT
+# define REAL_DIR_ENTRY(dp) ((dp)->d_ino != 0)
+#else
+# define REAL_DIR_ENTRY(dp) 1
+#endif
+
+#if ! (HAVE_PATHCONF && defined _PC_NAME_MAX)
+# define pathconf(file, option) (errno = -1)
+#endif
+
+#ifndef _POSIX_NAME_MAX
+# define _POSIX_NAME_MAX 14
+#endif
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#if defined _XOPEN_NAME_MAX
+# define NAME_MAX_MINIMUM _XOPEN_NAME_MAX
+#else
+# define NAME_MAX_MINIMUM _POSIX_NAME_MAX
+#endif
+
+#ifndef HAVE_DOS_FILE_NAMES
+# define HAVE_DOS_FILE_NAMES 0
+#endif
+#ifndef HAVE_LONG_FILE_NAMES
+# define HAVE_LONG_FILE_NAMES 0
+#endif
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ ISDIGIT unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* The extension added to file names to produce a simple (as opposed
+ to numbered) backup file name. */
+char const *simple_backup_suffix = "~";
+
+
+/* If FILE (which was of length FILELEN before an extension was
+ appended to it) is too long, replace the extension with the single
+ char E. If the result is still too long, remove the char just
+ before E. */
+
+static void
+check_extension (char *file, size_t filelen, char e)
+{
+ char *base = last_component (file);
+ size_t baselen = base_len (base);
+ size_t baselen_max = HAVE_LONG_FILE_NAMES ? 255 : NAME_MAX_MINIMUM;
+
+ if (HAVE_DOS_FILE_NAMES || NAME_MAX_MINIMUM < baselen)
+ {
+ /* The new base name is long enough to require a pathconf check. */
+ long name_max;
+
+ /* Temporarily modify the buffer into its parent directory name,
+ invoke pathconf on the directory, and then restore the buffer. */
+ char tmp[sizeof "."];
+ memcpy (tmp, base, sizeof ".");
+ strcpy (base, ".");
+ errno = 0;
+ name_max = pathconf (file, _PC_NAME_MAX);
+ if (0 <= name_max || errno == 0)
+ {
+ long size = baselen_max = name_max;
+ if (name_max != size)
+ baselen_max = SIZE_MAX;
+ }
+ memcpy (base, tmp, sizeof ".");
+ }
+
+ if (HAVE_DOS_FILE_NAMES && baselen_max <= 12)
+ {
+ /* Live within DOS's 8.3 limit. */
+ char *dot = strchr (base, '.');
+ if (!dot)
+ baselen_max = 8;
+ else
+ {
+ char const *second_dot = strchr (dot + 1, '.');
+ baselen_max = (second_dot
+ ? second_dot - base
+ : dot + 1 - base + 3);
+ }
+ }
+
+ if (baselen_max < baselen)
+ {
+ baselen = file + filelen - base;
+ if (baselen_max <= baselen)
+ baselen = baselen_max - 1;
+ base[baselen] = e;
+ base[baselen + 1] = '\0';
+ }
+}
+
+/* Returned values for NUMBERED_BACKUP. */
+
+enum numbered_backup_result
+ {
+ /* The new backup name is the same length as an existing backup
+ name, so it's valid for that directory. */
+ BACKUP_IS_SAME_LENGTH,
+
+ /* Some backup names already exist, but the returned name is longer
+ than any of them, and its length should be checked. */
+ BACKUP_IS_LONGER,
+
+ /* There are no existing backup names. The new name's length
+ should be checked. */
+ BACKUP_IS_NEW
+ };
+
+/* *BUFFER contains a file name. Store into *BUFFER the next backup
+ name for the named file, with a version number greater than all the
+ existing numbered backups. Reallocate *BUFFER as necessary; its
+ initial allocated size is BUFFER_SIZE, which must be at least 4
+ bytes longer than the file name to make room for the initially
+ appended ".~1". FILELEN is the length of the original file name.
+ The returned value indicates what kind of backup was found. If an
+ I/O or other read error occurs, use the highest backup number that
+ was found. */
+
+static enum numbered_backup_result
+numbered_backup (char **buffer, size_t buffer_size, size_t filelen)
+{
+ enum numbered_backup_result result = BACKUP_IS_NEW;
+ DIR *dirp;
+ struct dirent *dp;
+ char *buf = *buffer;
+ size_t versionlenmax = 1;
+ char *base = last_component (buf);
+ size_t base_offset = base - buf;
+ size_t baselen = base_len (base);
+
+ /* Temporarily modify the buffer into its parent directory name,
+ open the directory, and then restore the buffer. */
+ char tmp[sizeof "."];
+ memcpy (tmp, base, sizeof ".");
+ strcpy (base, ".");
+ dirp = opendir (buf);
+ memcpy (base, tmp, sizeof ".");
+ strcpy (base + baselen, ".~1~");
+
+ if (!dirp)
+ return result;
+
+ while ((dp = readdir (dirp)) != NULL)
+ {
+ char const *p;
+ char *q;
+ bool all_9s;
+ size_t versionlen;
+ size_t new_buflen;
+
+ if (! REAL_DIR_ENTRY (dp) || _D_EXACT_NAMLEN (dp) < baselen + 4)
+ continue;
+
+ if (memcmp (buf + base_offset, dp->d_name, baselen + 2) != 0)
+ continue;
+
+ p = dp->d_name + baselen + 2;
+
+ /* Check whether this file has a version number and if so,
+ whether it is larger. Use string operations rather than
+ integer arithmetic, to avoid problems with integer overflow. */
+
+ if (! ('1' <= *p && *p <= '9'))
+ continue;
+ all_9s = (*p == '9');
+ for (versionlen = 1; ISDIGIT (p[versionlen]); versionlen++)
+ all_9s &= (p[versionlen] == '9');
+
+ if (! (p[versionlen] == '~' && !p[versionlen + 1]
+ && (versionlenmax < versionlen
+ || (versionlenmax == versionlen
+ && memcmp (buf + filelen + 2, p, versionlen) <= 0))))
+ continue;
+
+ /* This directory has the largest version number seen so far.
+ Append this highest numbered extension to the file name,
+ prepending '0' to the number if it is all 9s. */
+
+ versionlenmax = all_9s + versionlen;
+ result = (all_9s ? BACKUP_IS_LONGER : BACKUP_IS_SAME_LENGTH);
+ new_buflen = filelen + 2 + versionlenmax + 1;
+ if (buffer_size <= new_buflen)
+ {
+ buf = xnrealloc (buf, 2, new_buflen);
+ buffer_size = new_buflen * 2;
+ }
+ q = buf + filelen;
+ *q++ = '.';
+ *q++ = '~';
+ *q = '0';
+ q += all_9s;
+ memcpy (q, p, versionlen + 2);
+
+ /* Add 1 to the version number. */
+
+ q += versionlen;
+ while (*--q == '9')
+ *q = '0';
+ ++*q;
+ }
+
+ closedir (dirp);
+ *buffer = buf;
+ return result;
+}
+
+/* Return the name of the new backup file for the existing file FILE,
+ allocated with malloc. Report an error and fail if out of memory.
+ Do not call this function if backup_type == no_backups. */
+
+char *
+find_backup_file_name (char const *file, enum backup_type backup_type)
+{
+ size_t filelen = strlen (file);
+ char *s;
+ size_t ssize;
+ bool simple = true;
+
+ /* Allow room for simple or ".~N~" backups. The guess must be at
+ least sizeof ".~1~", but otherwise will be adjusted as needed. */
+ size_t simple_backup_suffix_size = strlen (simple_backup_suffix) + 1;
+ size_t backup_suffix_size_guess = simple_backup_suffix_size;
+ enum { GUESS = sizeof ".~12345~" };
+ if (backup_suffix_size_guess < GUESS)
+ backup_suffix_size_guess = GUESS;
+
+ ssize = filelen + backup_suffix_size_guess + 1;
+ s = xmalloc (ssize);
+ memcpy (s, file, filelen + 1);
+
+ if (backup_type != simple_backups)
+ switch (numbered_backup (&s, ssize, filelen))
+ {
+ case BACKUP_IS_SAME_LENGTH:
+ return s;
+
+ case BACKUP_IS_LONGER:
+ simple = false;
+ break;
+
+ case BACKUP_IS_NEW:
+ simple = (backup_type == numbered_existing_backups);
+ break;
+ }
+
+ if (simple)
+ memcpy (s + filelen, simple_backup_suffix, simple_backup_suffix_size);
+ check_extension (s, filelen, '~');
+ return s;
+}
+
+static char const * const backup_args[] =
+{
+ /* In a series of synonyms, present the most meaningful first, so
+ that argmatch_valid be more readable. */
+ "none", "off",
+ "simple", "never",
+ "existing", "nil",
+ "numbered", "t",
+ NULL
+};
+
+static const enum backup_type backup_types[] =
+{
+ no_backups, no_backups,
+ simple_backups, simple_backups,
+ numbered_existing_backups, numbered_existing_backups,
+ numbered_backups, numbered_backups
+};
+
+/* Ensure that these two vectors have the same number of elements,
+ not counting the final NULL in the first one. */
+ARGMATCH_VERIFY (backup_args, backup_types);
+
+/* Return the type of backup specified by VERSION.
+ If VERSION is NULL or the empty string, return numbered_existing_backups.
+ If VERSION is invalid or ambiguous, fail with a diagnostic appropriate
+ for the specified CONTEXT. Unambiguous abbreviations are accepted. */
+
+enum backup_type
+get_version (char const *context, char const *version)
+{
+ if (version == 0 || *version == 0)
+ return numbered_existing_backups;
+ else
+ return XARGMATCH (context, version, backup_args, backup_types);
+}
+
+
+/* Return the type of backup specified by VERSION.
+ If VERSION is NULL, use the value of the envvar VERSION_CONTROL.
+ If the specified string is invalid or ambiguous, fail with a diagnostic
+ appropriate for the specified CONTEXT.
+ Unambiguous abbreviations are accepted. */
+
+enum backup_type
+xget_version (char const *context, char const *version)
+{
+ if (version && *version)
+ return get_version (context, version);
+ else
+ return get_version ("$VERSION_CONTROL", getenv ("VERSION_CONTROL"));
+}
diff --git a/gnulib/lib/backupfile.h b/gnulib/lib/backupfile.h
new file mode 100644
index 00000000..e2af28ad
--- /dev/null
+++ b/gnulib/lib/backupfile.h
@@ -0,0 +1,59 @@
+/* backupfile.h -- declarations for making Emacs style backup file names
+
+ Copyright (C) 1990-1992, 1997-1999, 2003-2004, 2009-2010 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/>. */
+
+#ifndef BACKUPFILE_H_
+# define BACKUPFILE_H_
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+/* When to make backup files. */
+enum backup_type
+{
+ /* Never make backups. */
+ no_backups,
+
+ /* Make simple backups of every file. */
+ simple_backups,
+
+ /* Make numbered backups of files that already have numbered backups,
+ and simple backups of the others. */
+ numbered_existing_backups,
+
+ /* Make numbered backups of every file. */
+ numbered_backups
+};
+
+# define VALID_BACKUP_TYPE(Type) \
+ ((unsigned int) (Type) <= numbered_backups)
+
+extern char const *simple_backup_suffix;
+
+char *find_backup_file_name (char const *, enum backup_type);
+enum backup_type get_version (char const *context, char const *arg);
+enum backup_type xget_version (char const *context, char const *arg);
+void addext (char *, char const *, int);
+
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* ! BACKUPFILE_H_ */
diff --git a/gnulib/lib/base64.c b/gnulib/lib/base64.c
new file mode 100644
index 00000000..4939ce74
--- /dev/null
+++ b/gnulib/lib/base64.c
@@ -0,0 +1,576 @@
+/* base64.c -- Encode binary data using printable characters.
+ Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. Partially adapted from GNU MailUtils
+ * (mailbox/filter_trans.c, as of 2004-11-28). Improved by review
+ * from Paul Eggert, Bruno Haible, and Stepan Kasal.
+ *
+ * See also RFC 3548 <http://www.ietf.org/rfc/rfc3548.txt>.
+ *
+ * Be careful with error checking. Here is how you would typically
+ * use these functions:
+ *
+ * bool ok = base64_decode_alloc (in, inlen, &out, &outlen);
+ * if (!ok)
+ * FAIL: input was not valid base64
+ * if (out == NULL)
+ * FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN
+ *
+ * size_t outlen = base64_encode_alloc (in, inlen, &out);
+ * if (out == NULL && outlen == 0 && inlen != 0)
+ * FAIL: input too long
+ * if (out == NULL)
+ * FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN.
+ *
+ */
+
+#include <config.h>
+
+/* Get prototype. */
+#include "base64.h"
+
+/* Get malloc. */
+#include <stdlib.h>
+
+/* Get UCHAR_MAX. */
+#include <limits.h>
+
+#include <string.h>
+
+/* C89 compliant way to cast 'char' to 'unsigned char'. */
+static inline unsigned char
+to_uchar (char ch)
+{
+ return ch;
+}
+
+/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN.
+ If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as
+ possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero
+ terminate the output buffer. */
+void
+base64_encode (const char *restrict in, size_t inlen,
+ char *restrict out, size_t outlen)
+{
+ static const char b64str[64] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+ while (inlen && outlen)
+ {
+ *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f];
+ if (!--outlen)
+ break;
+ *out++ = b64str[((to_uchar (in[0]) << 4)
+ + (--inlen ? to_uchar (in[1]) >> 4 : 0))
+ & 0x3f];
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b64str[((to_uchar (in[1]) << 2)
+ + (--inlen ? to_uchar (in[2]) >> 6 : 0))
+ & 0x3f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '=';
+ if (!--outlen)
+ break;
+ if (inlen)
+ inlen--;
+ if (inlen)
+ in += 3;
+ }
+
+ if (outlen)
+ *out = '\0';
+}
+
+/* Allocate a buffer and store zero terminated base64 encoded data
+ from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e.,
+ the length of the encoded data, excluding the terminating zero. On
+ return, the OUT variable will hold a pointer to newly allocated
+ memory that must be deallocated by the caller. If output string
+ length would overflow, 0 is returned and OUT is set to NULL. If
+ memory allocation failed, OUT is set to NULL, and the return value
+ indicates length of the requested memory block, i.e.,
+ BASE64_LENGTH(inlen) + 1. */
+size_t
+base64_encode_alloc (const char *in, size_t inlen, char **out)
+{
+ size_t outlen = 1 + BASE64_LENGTH (inlen);
+
+ /* Check for overflow in outlen computation.
+ *
+ * If there is no overflow, outlen >= inlen.
+ *
+ * If the operation (inlen + 2) overflows then it yields at most +1, so
+ * outlen is 0.
+ *
+ * If the multiplication overflows, we lose at least half of the
+ * correct value, so the result is < ((inlen + 2) / 3) * 2, which is
+ * less than (inlen + 2) * 0.66667, which is less than inlen as soon as
+ * (inlen > 4).
+ */
+ if (inlen > outlen)
+ {
+ *out = NULL;
+ return 0;
+ }
+
+ *out = malloc (outlen);
+ if (!*out)
+ return outlen;
+
+ base64_encode (in, inlen, *out, outlen);
+
+ return outlen - 1;
+}
+
+/* With this approach this file works independent of the charset used
+ (think EBCDIC). However, it does assume that the characters in the
+ Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255. POSIX
+ 1003.1-2001 require that char and unsigned char are 8-bit
+ quantities, though, taking care of that problem. But this may be a
+ potential problem on non-POSIX C99 platforms.
+
+ IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_"
+ as the formal parameter rather than "x". */
+#define B64(_) \
+ ((_) == 'A' ? 0 \
+ : (_) == 'B' ? 1 \
+ : (_) == 'C' ? 2 \
+ : (_) == 'D' ? 3 \
+ : (_) == 'E' ? 4 \
+ : (_) == 'F' ? 5 \
+ : (_) == 'G' ? 6 \
+ : (_) == 'H' ? 7 \
+ : (_) == 'I' ? 8 \
+ : (_) == 'J' ? 9 \
+ : (_) == 'K' ? 10 \
+ : (_) == 'L' ? 11 \
+ : (_) == 'M' ? 12 \
+ : (_) == 'N' ? 13 \
+ : (_) == 'O' ? 14 \
+ : (_) == 'P' ? 15 \
+ : (_) == 'Q' ? 16 \
+ : (_) == 'R' ? 17 \
+ : (_) == 'S' ? 18 \
+ : (_) == 'T' ? 19 \
+ : (_) == 'U' ? 20 \
+ : (_) == 'V' ? 21 \
+ : (_) == 'W' ? 22 \
+ : (_) == 'X' ? 23 \
+ : (_) == 'Y' ? 24 \
+ : (_) == 'Z' ? 25 \
+ : (_) == 'a' ? 26 \
+ : (_) == 'b' ? 27 \
+ : (_) == 'c' ? 28 \
+ : (_) == 'd' ? 29 \
+ : (_) == 'e' ? 30 \
+ : (_) == 'f' ? 31 \
+ : (_) == 'g' ? 32 \
+ : (_) == 'h' ? 33 \
+ : (_) == 'i' ? 34 \
+ : (_) == 'j' ? 35 \
+ : (_) == 'k' ? 36 \
+ : (_) == 'l' ? 37 \
+ : (_) == 'm' ? 38 \
+ : (_) == 'n' ? 39 \
+ : (_) == 'o' ? 40 \
+ : (_) == 'p' ? 41 \
+ : (_) == 'q' ? 42 \
+ : (_) == 'r' ? 43 \
+ : (_) == 's' ? 44 \
+ : (_) == 't' ? 45 \
+ : (_) == 'u' ? 46 \
+ : (_) == 'v' ? 47 \
+ : (_) == 'w' ? 48 \
+ : (_) == 'x' ? 49 \
+ : (_) == 'y' ? 50 \
+ : (_) == 'z' ? 51 \
+ : (_) == '0' ? 52 \
+ : (_) == '1' ? 53 \
+ : (_) == '2' ? 54 \
+ : (_) == '3' ? 55 \
+ : (_) == '4' ? 56 \
+ : (_) == '5' ? 57 \
+ : (_) == '6' ? 58 \
+ : (_) == '7' ? 59 \
+ : (_) == '8' ? 60 \
+ : (_) == '9' ? 61 \
+ : (_) == '+' ? 62 \
+ : (_) == '/' ? 63 \
+ : -1)
+
+static const signed char b64[0x100] = {
+ B64 (0), B64 (1), B64 (2), B64 (3),
+ B64 (4), B64 (5), B64 (6), B64 (7),
+ B64 (8), B64 (9), B64 (10), B64 (11),
+ B64 (12), B64 (13), B64 (14), B64 (15),
+ B64 (16), B64 (17), B64 (18), B64 (19),
+ B64 (20), B64 (21), B64 (22), B64 (23),
+ B64 (24), B64 (25), B64 (26), B64 (27),
+ B64 (28), B64 (29), B64 (30), B64 (31),
+ B64 (32), B64 (33), B64 (34), B64 (35),
+ B64 (36), B64 (37), B64 (38), B64 (39),
+ B64 (40), B64 (41), B64 (42), B64 (43),
+ B64 (44), B64 (45), B64 (46), B64 (47),
+ B64 (48), B64 (49), B64 (50), B64 (51),
+ B64 (52), B64 (53), B64 (54), B64 (55),
+ B64 (56), B64 (57), B64 (58), B64 (59),
+ B64 (60), B64 (61), B64 (62), B64 (63),
+ B64 (64), B64 (65), B64 (66), B64 (67),
+ B64 (68), B64 (69), B64 (70), B64 (71),
+ B64 (72), B64 (73), B64 (74), B64 (75),
+ B64 (76), B64 (77), B64 (78), B64 (79),
+ B64 (80), B64 (81), B64 (82), B64 (83),
+ B64 (84), B64 (85), B64 (86), B64 (87),
+ B64 (88), B64 (89), B64 (90), B64 (91),
+ B64 (92), B64 (93), B64 (94), B64 (95),
+ B64 (96), B64 (97), B64 (98), B64 (99),
+ B64 (100), B64 (101), B64 (102), B64 (103),
+ B64 (104), B64 (105), B64 (106), B64 (107),
+ B64 (108), B64 (109), B64 (110), B64 (111),
+ B64 (112), B64 (113), B64 (114), B64 (115),
+ B64 (116), B64 (117), B64 (118), B64 (119),
+ B64 (120), B64 (121), B64 (122), B64 (123),
+ B64 (124), B64 (125), B64 (126), B64 (127),
+ B64 (128), B64 (129), B64 (130), B64 (131),
+ B64 (132), B64 (133), B64 (134), B64 (135),
+ B64 (136), B64 (137), B64 (138), B64 (139),
+ B64 (140), B64 (141), B64 (142), B64 (143),
+ B64 (144), B64 (145), B64 (146), B64 (147),
+ B64 (148), B64 (149), B64 (150), B64 (151),
+ B64 (152), B64 (153), B64 (154), B64 (155),
+ B64 (156), B64 (157), B64 (158), B64 (159),
+ B64 (160), B64 (161), B64 (162), B64 (163),
+ B64 (164), B64 (165), B64 (166), B64 (167),
+ B64 (168), B64 (169), B64 (170), B64 (171),
+ B64 (172), B64 (173), B64 (174), B64 (175),
+ B64 (176), B64 (177), B64 (178), B64 (179),
+ B64 (180), B64 (181), B64 (182), B64 (183),
+ B64 (184), B64 (185), B64 (186), B64 (187),
+ B64 (188), B64 (189), B64 (190), B64 (191),
+ B64 (192), B64 (193), B64 (194), B64 (195),
+ B64 (196), B64 (197), B64 (198), B64 (199),
+ B64 (200), B64 (201), B64 (202), B64 (203),
+ B64 (204), B64 (205), B64 (206), B64 (207),
+ B64 (208), B64 (209), B64 (210), B64 (211),
+ B64 (212), B64 (213), B64 (214), B64 (215),
+ B64 (216), B64 (217), B64 (218), B64 (219),
+ B64 (220), B64 (221), B64 (222), B64 (223),
+ B64 (224), B64 (225), B64 (226), B64 (227),
+ B64 (228), B64 (229), B64 (230), B64 (231),
+ B64 (232), B64 (233), B64 (234), B64 (235),
+ B64 (236), B64 (237), B64 (238), B64 (239),
+ B64 (240), B64 (241), B64 (242), B64 (243),
+ B64 (244), B64 (245), B64 (246), B64 (247),
+ B64 (248), B64 (249), B64 (250), B64 (251),
+ B64 (252), B64 (253), B64 (254), B64 (255)
+};
+
+#if UCHAR_MAX == 255
+# define uchar_in_range(c) true
+#else
+# define uchar_in_range(c) ((c) <= 255)
+#endif
+
+/* Return true if CH is a character from the Base64 alphabet, and
+ false otherwise. Note that '=' is padding and not considered to be
+ part of the alphabet. */
+bool
+isbase64 (char ch)
+{
+ return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)];
+}
+
+/* Initialize decode-context buffer, CTX. */
+void
+base64_decode_ctx_init (struct base64_decode_context *ctx)
+{
+ ctx->i = 0;
+}
+
+/* If CTX->i is 0 or 4, there are four or more bytes in [*IN..IN_END), and
+ none of those four is a newline, then return *IN. Otherwise, copy up to
+ 4 - CTX->i non-newline bytes from that range into CTX->buf, starting at
+ index CTX->i and setting CTX->i to reflect the number of bytes copied,
+ and return CTX->buf. In either case, advance *IN to point to the byte
+ after the last one processed, and set *N_NON_NEWLINE to the number of
+ verified non-newline bytes accessible through the returned pointer. */
+static inline char *
+get_4 (struct base64_decode_context *ctx,
+ char const *restrict *in, char const *restrict in_end,
+ size_t *n_non_newline)
+{
+ if (ctx->i == 4)
+ ctx->i = 0;
+
+ if (ctx->i == 0)
+ {
+ char const *t = *in;
+ if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL)
+ {
+ /* This is the common case: no newline. */
+ *in += 4;
+ *n_non_newline = 4;
+ return (char *) t;
+ }
+ }
+
+ {
+ /* Copy non-newline bytes into BUF. */
+ char const *p = *in;
+ while (p < in_end)
+ {
+ char c = *p++;
+ if (c != '\n')
+ {
+ ctx->buf[ctx->i++] = c;
+ if (ctx->i == 4)
+ break;
+ }
+ }
+
+ *in = p;
+ *n_non_newline = ctx->i;
+ return ctx->buf;
+ }
+}
+
+#define return_false \
+ do \
+ { \
+ *outp = out; \
+ return false; \
+ } \
+ while (false)
+
+/* Decode up to four bytes of base64-encoded data, IN, of length INLEN
+ into the output buffer, *OUT, of size *OUTLEN bytes. Return true if
+ decoding is successful, false otherwise. If *OUTLEN is too small,
+ as many bytes as possible are written to *OUT. On return, advance
+ *OUT to point to the byte after the last one written, and decrement
+ *OUTLEN to reflect the number of bytes remaining in *OUT. */
+static inline bool
+decode_4 (char const *restrict in, size_t inlen,
+ char *restrict *outp, size_t *outleft)
+{
+ char *out = *outp;
+ if (inlen < 2)
+ return false;
+
+ if (!isbase64 (in[0]) || !isbase64 (in[1]))
+ return false;
+
+ if (*outleft)
+ {
+ *out++ = ((b64[to_uchar (in[0])] << 2)
+ | (b64[to_uchar (in[1])] >> 4));
+ --*outleft;
+ }
+
+ if (inlen == 2)
+ return_false;
+
+ if (in[2] == '=')
+ {
+ if (inlen != 4)
+ return_false;
+
+ if (in[3] != '=')
+ return_false;
+ }
+ else
+ {
+ if (!isbase64 (in[2]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0)
+ | (b64[to_uchar (in[2])] >> 2));
+ --*outleft;
+ }
+
+ if (inlen == 3)
+ return_false;
+
+ if (in[3] == '=')
+ {
+ if (inlen != 4)
+ return_false;
+ }
+ else
+ {
+ if (!isbase64 (in[3]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0)
+ | b64[to_uchar (in[3])]);
+ --*outleft;
+ }
+ }
+ }
+
+ *outp = out;
+ return true;
+}
+
+/* Decode base64-encoded input array IN of length INLEN to output array
+ OUT that can hold *OUTLEN bytes. The input data may be interspersed
+ with newlines. Return true if decoding was successful, i.e. if the
+ input was valid base64 data, false otherwise. If *OUTLEN is too
+ small, as many bytes as possible will be written to OUT. On return,
+ *OUTLEN holds the length of decoded bytes in OUT. Note that as soon
+ as any non-alphabet, non-newline character is encountered, decoding
+ is stopped and false is returned. If INLEN is zero, then process
+ only whatever data is stored in CTX.
+
+ Initially, CTX must have been initialized via base64_decode_ctx_init.
+ Subsequent calls to this function must reuse whatever state is recorded
+ in that buffer. It is necessary for when a quadruple of base64 input
+ bytes spans two input buffers.
+
+ If CTX is NULL then newlines are treated as garbage and the input
+ buffer is processed as a unit. */
+
+bool
+base64_decode_ctx (struct base64_decode_context *ctx,
+ const char *restrict in, size_t inlen,
+ char *restrict out, size_t *outlen)
+{
+ size_t outleft = *outlen;
+ bool ignore_newlines = ctx != NULL;
+ bool flush_ctx = false;
+ unsigned int ctx_i = 0;
+
+ if (ignore_newlines)
+ {
+ ctx_i = ctx->i;
+ flush_ctx = inlen == 0;
+ }
+
+
+ while (true)
+ {
+ size_t outleft_save = outleft;
+ if (ctx_i == 0 && !flush_ctx)
+ {
+ while (true)
+ {
+ /* Save a copy of outleft, in case we need to re-parse this
+ block of four bytes. */
+ outleft_save = outleft;
+ if (!decode_4 (in, inlen, &out, &outleft))
+ break;
+
+ in += 4;
+ inlen -= 4;
+ }
+ }
+
+ if (inlen == 0 && !flush_ctx)
+ break;
+
+ /* Handle the common case of 72-byte wrapped lines.
+ This also handles any other multiple-of-4-byte wrapping. */
+ if (inlen && *in == '\n' && ignore_newlines)
+ {
+ ++in;
+ --inlen;
+ continue;
+ }
+
+ /* Restore OUT and OUTLEFT. */
+ out -= outleft_save - outleft;
+ outleft = outleft_save;
+
+ {
+ char const *in_end = in + inlen;
+ char const *non_nl;
+
+ if (ignore_newlines)
+ non_nl = get_4 (ctx, &in, in_end, &inlen);
+ else
+ non_nl = in; /* Might have nl in this case. */
+
+ /* If the input is empty or consists solely of newlines (0 non-newlines),
+ then we're done. Likewise if there are fewer than 4 bytes when not
+ flushing context and not treating newlines as garbage. */
+ if (inlen == 0 || (inlen < 4 && !flush_ctx && ignore_newlines))
+ {
+ inlen = 0;
+ break;
+ }
+ if (!decode_4 (non_nl, inlen, &out, &outleft))
+ break;
+
+ inlen = in_end - in;
+ }
+ }
+
+ *outlen -= outleft;
+
+ return inlen == 0;
+}
+
+/* Allocate an output buffer in *OUT, and decode the base64 encoded
+ data stored in IN of size INLEN to the *OUT buffer. On return, the
+ size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL,
+ if the caller is not interested in the decoded length. *OUT may be
+ NULL to indicate an out of memory error, in which case *OUTLEN
+ contains the size of the memory block needed. The function returns
+ true on successful decoding and memory allocation errors. (Use the
+ *OUT and *OUTLEN parameters to differentiate between successful
+ decoding and memory error.) The function returns false if the
+ input was invalid, in which case *OUT is NULL and *OUTLEN is
+ undefined. */
+bool
+base64_decode_alloc_ctx (struct base64_decode_context *ctx,
+ const char *in, size_t inlen, char **out,
+ size_t *outlen)
+{
+ /* This may allocate a few bytes too many, depending on input,
+ but it's not worth the extra CPU time to compute the exact size.
+ The exact size is 3 * inlen / 4, minus 1 if the input ends
+ with "=" and minus another 1 if the input ends with "==".
+ Dividing before multiplying avoids the possibility of overflow. */
+ size_t needlen = 3 * (inlen / 4) + 2;
+
+ *out = malloc (needlen);
+ if (!*out)
+ return true;
+
+ if (!base64_decode_ctx (ctx, in, inlen, *out, &needlen))
+ {
+ free (*out);
+ *out = NULL;
+ return false;
+ }
+
+ if (outlen)
+ *outlen = needlen;
+
+ return true;
+}
diff --git a/gnulib/lib/base64.h b/gnulib/lib/base64.h
new file mode 100644
index 00000000..c9e0e1f4
--- /dev/null
+++ b/gnulib/lib/base64.h
@@ -0,0 +1,61 @@
+/* base64.h -- Encode binary data using printable characters.
+ Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef BASE64_H
+# define BASE64_H
+
+/* Get size_t. */
+# include <stddef.h>
+
+/* Get bool. */
+# include <stdbool.h>
+
+/* This uses that the expression (n+(k-1))/k means the smallest
+ integer >= n/k, i.e., the ceiling of n/k. */
+# define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4)
+
+struct base64_decode_context
+{
+ unsigned int i;
+ char buf[4];
+};
+
+extern bool isbase64 (char ch);
+
+extern void base64_encode (const char *restrict in, size_t inlen,
+ char *restrict out, size_t outlen);
+
+extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out);
+
+extern void base64_decode_ctx_init (struct base64_decode_context *ctx);
+
+extern bool base64_decode_ctx (struct base64_decode_context *ctx,
+ const char *restrict in, size_t inlen,
+ char *restrict out, size_t *outlen);
+
+extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx,
+ const char *in, size_t inlen,
+ char **out, size_t *outlen);
+
+#define base64_decode(in, inlen, out, outlen) \
+ base64_decode_ctx (NULL, in, inlen, out, outlen)
+
+#define base64_decode_alloc(in, inlen, out, outlen) \
+ base64_decode_alloc_ctx (NULL, in, inlen, out, outlen)
+
+#endif /* BASE64_H */
diff --git a/gnulib/lib/basename-lgpl.c b/gnulib/lib/basename-lgpl.c
new file mode 100644
index 00000000..a35ff01c
--- /dev/null
+++ b/gnulib/lib/basename-lgpl.c
@@ -0,0 +1,75 @@
+/* basename.c -- return the last element in a file name
+
+ Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <string.h>
+
+/* Return the address of the last file name component of NAME. If
+ NAME has no relative file name components because it is a file
+ system root, return the empty string. */
+
+char *
+last_component (char const *name)
+{
+ char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
+ char const *p;
+ bool saw_slash = false;
+
+ while (ISSLASH (*base))
+ base++;
+
+ for (p = base; *p; p++)
+ {
+ if (ISSLASH (*p))
+ saw_slash = true;
+ else if (saw_slash)
+ {
+ base = p;
+ saw_slash = false;
+ }
+ }
+
+ return (char *) base;
+}
+
+/* Return the length of the basename NAME. Typically NAME is the
+ value returned by base_name or last_component. Act like strlen
+ (NAME), except omit all trailing slashes. */
+
+size_t
+base_len (char const *name)
+{
+ size_t len;
+ size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
+
+ for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--)
+ continue;
+
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1
+ && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2])
+ return 2;
+
+ if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len
+ && len == prefix_len && ISSLASH (name[prefix_len]))
+ return prefix_len + 1;
+
+ return len;
+}
diff --git a/gnulib/lib/basename.c b/gnulib/lib/basename.c
new file mode 100644
index 00000000..24da93ac
--- /dev/null
+++ b/gnulib/lib/basename.c
@@ -0,0 +1,58 @@
+/* basename.c -- return the last element in a file name
+
+ Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <string.h>
+#include "xalloc.h"
+#include "xstrndup.h"
+
+char *
+base_name (char const *name)
+{
+ char const *base = last_component (name);
+ size_t length;
+
+ /* If there is no last component, then name is a file system root or the
+ empty string. */
+ if (! *base)
+ return xstrndup (name, base_len (name));
+
+ /* Collapse a sequence of trailing slashes into one. */
+ length = base_len (base);
+ if (ISSLASH (base[length]))
+ length++;
+
+ /* On systems with drive letters, `a/b:c' must return `./b:c' rather
+ than `b:c' to avoid confusion with a drive letter. On systems
+ with pure POSIX semantics, this is not an issue. */
+ if (FILE_SYSTEM_PREFIX_LEN (base))
+ {
+ char *p = xmalloc (length + 3);
+ p[0] = '.';
+ p[1] = '/';
+ memcpy (p + 2, base, length);
+ p[length + 2] = '\0';
+ return p;
+ }
+
+ /* Finally, copy the basename. */
+ return xstrndup (base, length);
+}
diff --git a/gnulib/lib/bcopy.c b/gnulib/lib/bcopy.c
new file mode 100644
index 00000000..50a09f87
--- /dev/null
+++ b/gnulib/lib/bcopy.c
@@ -0,0 +1,21 @@
+/* bcopy.c -- copy memory.
+ Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate.
+ In the public domain.
+ By David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <stddef.h>
+
+void
+bcopy (void const *source0, void *dest0, size_t length)
+{
+ char const *source = source0;
+ char *dest = dest0;
+ if (source < dest)
+ /* Moving from low mem to hi mem; start at end. */
+ for (source += length, dest += length; length; --length)
+ *--dest = *--source;
+ else if (source != dest)
+ /* Moving from hi mem to low mem; start at beginning. */
+ for (; length; --length)
+ *dest++ = *source++;
+}
diff --git a/gnulib/lib/binary-io.h b/gnulib/lib/binary-io.h
new file mode 100644
index 00000000..5451fd48
--- /dev/null
+++ b/gnulib/lib/binary-io.h
@@ -0,0 +1,66 @@
+/* Binary mode I/O.
+ Copyright (C) 2001, 2003, 2005, 2008, 2009, 2010 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/>. */
+
+#ifndef _BINARY_H
+#define _BINARY_H
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is usually declared in <fcntl.h>. */
+#include <fcntl.h>
+
+/* The MSVC7 <stdio.h> doesn't like to be included after '#define fileno ...',
+ so we include it here first. */
+#include <stdio.h>
+
+#if !defined O_BINARY && defined _O_BINARY
+ /* For MSC-compatible compilers. */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+#if defined __BEOS__ || defined __HAIKU__
+ /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+
+/* SET_BINARY (fd);
+ changes the file descriptor fd to perform binary I/O. */
+#if O_BINARY
+# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__
+# include <io.h> /* declares setmode() */
+# else
+# define setmode _setmode
+# undef fileno
+# define fileno _fileno
+# endif
+# ifdef __DJGPP__
+# include <unistd.h> /* declares isatty() */
+ /* Avoid putting stdin/stdout in binary mode if it is connected to
+ the console, because that would make it impossible for the user
+ to interrupt the program through Ctrl-C or Ctrl-Break. */
+# define SET_BINARY(fd) ((void) (!isatty (fd) ? (setmode (fd, O_BINARY), 0) : 0))
+# else
+# define SET_BINARY(fd) ((void) setmode (fd, O_BINARY))
+# endif
+#else
+ /* On reasonable systems, binary I/O is the default. */
+# undef O_BINARY
+# define O_BINARY 0
+# define SET_BINARY(fd) /* do nothing */ ((void) 0)
+#endif
+
+#endif /* _BINARY_H */
diff --git a/gnulib/lib/bind.c b/gnulib/lib/bind.c
new file mode 100644
index 00000000..fe88d03d
--- /dev/null
+++ b/gnulib/lib/bind.c
@@ -0,0 +1,40 @@
+/* bind.c --- wrappers for Windows bind function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef bind
+
+int
+rpl_bind (int fd, struct sockaddr *sockaddr, int len)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = bind (sock, sockaddr, len);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/bitrotate.h b/gnulib/lib/bitrotate.h
new file mode 100644
index 00000000..80e6ef50
--- /dev/null
+++ b/gnulib/lib/bitrotate.h
@@ -0,0 +1,126 @@
+/* bitrotate.h - Rotate bits in integers
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#ifndef _GL_BITROTATE_H
+#define _GL_BITROTATE_H
+
+#include <limits.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+#ifdef UINT64_MAX
+/* Given an unsigned 64-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ 63 inclusive. */
+static inline uint64_t
+rotl64 (uint64_t x, int n)
+{
+ return ((x << n) | (x >> (64 - n))) & UINT64_MAX;
+}
+
+/* Given an unsigned 64-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ 63 inclusive.*/
+static inline uint64_t
+rotr64 (uint64_t x, int n)
+{
+ return ((x >> n) | (x << (64 - n))) & UINT64_MAX;
+}
+#endif
+
+/* Given an unsigned 32-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ 31 inclusive. */
+static inline uint32_t
+rotl32 (uint32_t x, int n)
+{
+ return ((x << n) | (x >> (32 - n))) & UINT32_MAX;
+}
+
+/* Given an unsigned 32-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ 31 inclusive.*/
+static inline uint32_t
+rotr32 (uint32_t x, int n)
+{
+ return ((x >> n) | (x << (32 - n))) & UINT32_MAX;
+}
+
+/* Given a size_t argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ (CHAR_BIT * sizeof (size_t) - 1) inclusive. */
+static inline size_t
+rotl_sz (size_t x, int n)
+{
+ return ((x << n) | (x >> ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX;
+}
+
+/* Given a size_t argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ (CHAR_BIT * sizeof (size_t) - 1) inclusive. */
+static inline size_t
+rotr_sz (size_t x, int n)
+{
+ return ((x >> n) | (x << ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX;
+}
+
+/* Given an unsigned 16-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 to
+ 15 inclusive, but on most relevant targets N can also be 0 and 16
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+static inline uint16_t
+rotl16 (uint16_t x, int n)
+{
+ return ((x << n) | (x >> (16 - n))) & UINT16_MAX;
+}
+
+/* Given an unsigned 16-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be in 1 to 15
+ inclusive, but on most relevant targets N can also be 0 and 16
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+static inline uint16_t
+rotr16 (uint16_t x, int n)
+{
+ return ((x >> n) | (x << (16 - n))) & UINT16_MAX;
+}
+
+/* Given an unsigned 8-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 to 7
+ inclusive, but on most relevant targets N can also be 0 and 8
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+static inline uint8_t
+rotl8 (uint8_t x, int n)
+{
+ return ((x << n) | (x >> (8 - n))) & UINT8_MAX;
+}
+
+/* Given an unsigned 8-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be in 1 to 7
+ inclusive, but on most relevant targets N can also be 0 and 8
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+static inline uint8_t
+rotr8 (uint8_t x, int n)
+{
+ return ((x >> n) | (x << (8 - n))) & UINT8_MAX;
+}
+
+#endif /* _GL_BITROTATE_H */
diff --git a/gnulib/lib/btowc.c b/gnulib/lib/btowc.c
new file mode 100644
index 00000000..a46f1b24
--- /dev/null
+++ b/gnulib/lib/btowc.c
@@ -0,0 +1,38 @@
+/* Convert unibyte character to wide character.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <stdio.h>
+
+wint_t
+btowc (int c)
+{
+ if (c != EOF)
+ {
+ char buf[1];
+ wchar_t wc;
+
+ buf[0] = c;
+ if (mbtowc (&wc, buf, 1) >= 0)
+ return wc;
+ }
+ return WEOF;
+}
diff --git a/gnulib/lib/byteswap.in.h b/gnulib/lib/byteswap.in.h
new file mode 100644
index 00000000..3b929622
--- /dev/null
+++ b/gnulib/lib/byteswap.in.h
@@ -0,0 +1,44 @@
+/* byteswap.h - Byte swapping
+ Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+ Written by Oskar Liljeblad <oskar@osk.mine.nu>, 2005.
+
+ 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/>. */
+
+#ifndef _GL_BYTESWAP_H
+#define _GL_BYTESWAP_H
+
+/* Given an unsigned 16-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_16(x) ((((x) & 0x00FF) << 8) | \
+ (((x) & 0xFF00) >> 8))
+
+/* Given an unsigned 32-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_32(x) ((((x) & 0x000000FF) << 24) | \
+ (((x) & 0x0000FF00) << 8) | \
+ (((x) & 0x00FF0000) >> 8) | \
+ (((x) & 0xFF000000) >> 24))
+
+/* Given an unsigned 64-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_64(x) ((((x) & 0x00000000000000FFULL) << 56) | \
+ (((x) & 0x000000000000FF00ULL) << 40) | \
+ (((x) & 0x0000000000FF0000ULL) << 24) | \
+ (((x) & 0x00000000FF000000ULL) << 8) | \
+ (((x) & 0x000000FF00000000ULL) >> 8) | \
+ (((x) & 0x0000FF0000000000ULL) >> 24) | \
+ (((x) & 0x00FF000000000000ULL) >> 40) | \
+ (((x) & 0xFF00000000000000ULL) >> 56))
+
+#endif /* _GL_BYTESWAP_H */
diff --git a/gnulib/lib/c-ctype.c b/gnulib/lib/c-ctype.c
new file mode 100644
index 00000000..43dba866
--- /dev/null
+++ b/gnulib/lib/c-ctype.c
@@ -0,0 +1,396 @@
+/* Character handling in C locale.
+
+ Copyright 2000-2003, 2006, 2009-2010 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 2 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, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#define NO_C_CTYPE_MACROS
+#include "c-ctype.h"
+
+/* The function isascii is not locale dependent. Its use in EBCDIC is
+ questionable. */
+bool
+c_isascii (int c)
+{
+ return (c >= 0x00 && c <= 0x7f);
+}
+
+bool
+c_isalnum (int c)
+{
+#if C_CTYPE_CONSECUTIVE_DIGITS \
+ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+ return ((c >= '0' && c <= '9')
+ || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z'));
+#else
+ return ((c >= '0' && c <= '9')
+ || (c >= 'A' && c <= 'Z')
+ || (c >= 'a' && c <= 'z'));
+#endif
+#else
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isalpha (int c)
+{
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+ return ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z');
+#else
+ return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
+#endif
+#else
+ switch (c)
+ {
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isblank (int c)
+{
+ return (c == ' ' || c == '\t');
+}
+
+bool
+c_iscntrl (int c)
+{
+#if C_CTYPE_ASCII
+ return ((c & ~0x1f) == 0 || c == 0x7f);
+#else
+ switch (c)
+ {
+ case ' ': case '!': case '"': case '#': case '$': case '%':
+ case '&': case '\'': case '(': case ')': case '*': case '+':
+ case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>': case '?':
+ case '@':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case '[': case '\\': case ']': case '^': case '_': case '`':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ case '{': case '|': case '}': case '~':
+ return 0;
+ default:
+ return 1;
+ }
+#endif
+}
+
+bool
+c_isdigit (int c)
+{
+#if C_CTYPE_CONSECUTIVE_DIGITS
+ return (c >= '0' && c <= '9');
+#else
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_islower (int c)
+{
+#if C_CTYPE_CONSECUTIVE_LOWERCASE
+ return (c >= 'a' && c <= 'z');
+#else
+ switch (c)
+ {
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isgraph (int c)
+{
+#if C_CTYPE_ASCII
+ return (c >= '!' && c <= '~');
+#else
+ switch (c)
+ {
+ case '!': case '"': case '#': case '$': case '%': case '&':
+ case '\'': case '(': case ')': case '*': case '+': case ',':
+ case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>': case '?':
+ case '@':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case '[': case '\\': case ']': case '^': case '_': case '`':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isprint (int c)
+{
+#if C_CTYPE_ASCII
+ return (c >= ' ' && c <= '~');
+#else
+ switch (c)
+ {
+ case ' ': case '!': case '"': case '#': case '$': case '%':
+ case '&': case '\'': case '(': case ')': case '*': case '+':
+ case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>': case '?':
+ case '@':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case '[': case '\\': case ']': case '^': case '_': case '`':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_ispunct (int c)
+{
+#if C_CTYPE_ASCII
+ return ((c >= '!' && c <= '~')
+ && !((c >= '0' && c <= '9')
+ || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z')));
+#else
+ switch (c)
+ {
+ case '!': case '"': case '#': case '$': case '%': case '&':
+ case '\'': case '(': case ')': case '*': case '+': case ',':
+ case '-': case '.': case '/':
+ case ':': case ';': case '<': case '=': case '>': case '?':
+ case '@':
+ case '[': case '\\': case ']': case '^': case '_': case '`':
+ case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isspace (int c)
+{
+ return (c == ' ' || c == '\t'
+ || c == '\n' || c == '\v' || c == '\f' || c == '\r');
+}
+
+bool
+c_isupper (int c)
+{
+#if C_CTYPE_CONSECUTIVE_UPPERCASE
+ return (c >= 'A' && c <= 'Z');
+#else
+ switch (c)
+ {
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isxdigit (int c)
+{
+#if C_CTYPE_CONSECUTIVE_DIGITS \
+ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+ return ((c >= '0' && c <= '9')
+ || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'F'));
+#else
+ return ((c >= '0' && c <= '9')
+ || (c >= 'A' && c <= 'F')
+ || (c >= 'a' && c <= 'f'));
+#endif
+#else
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+int
+c_tolower (int c)
+{
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+ return (c >= 'A' && c <= 'Z' ? c - 'A' + 'a' : c);
+#else
+ switch (c)
+ {
+ case 'A': return 'a';
+ case 'B': return 'b';
+ case 'C': return 'c';
+ case 'D': return 'd';
+ case 'E': return 'e';
+ case 'F': return 'f';
+ case 'G': return 'g';
+ case 'H': return 'h';
+ case 'I': return 'i';
+ case 'J': return 'j';
+ case 'K': return 'k';
+ case 'L': return 'l';
+ case 'M': return 'm';
+ case 'N': return 'n';
+ case 'O': return 'o';
+ case 'P': return 'p';
+ case 'Q': return 'q';
+ case 'R': return 'r';
+ case 'S': return 's';
+ case 'T': return 't';
+ case 'U': return 'u';
+ case 'V': return 'v';
+ case 'W': return 'w';
+ case 'X': return 'x';
+ case 'Y': return 'y';
+ case 'Z': return 'z';
+ default: return c;
+ }
+#endif
+}
+
+int
+c_toupper (int c)
+{
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+ return (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c);
+#else
+ switch (c)
+ {
+ case 'a': return 'A';
+ case 'b': return 'B';
+ case 'c': return 'C';
+ case 'd': return 'D';
+ case 'e': return 'E';
+ case 'f': return 'F';
+ case 'g': return 'G';
+ case 'h': return 'H';
+ case 'i': return 'I';
+ case 'j': return 'J';
+ case 'k': return 'K';
+ case 'l': return 'L';
+ case 'm': return 'M';
+ case 'n': return 'N';
+ case 'o': return 'O';
+ case 'p': return 'P';
+ case 'q': return 'Q';
+ case 'r': return 'R';
+ case 's': return 'S';
+ case 't': return 'T';
+ case 'u': return 'U';
+ case 'v': return 'V';
+ case 'w': return 'W';
+ case 'x': return 'X';
+ case 'y': return 'Y';
+ case 'z': return 'Z';
+ default: return c;
+ }
+#endif
+}
diff --git a/gnulib/lib/c-ctype.h b/gnulib/lib/c-ctype.h
new file mode 100644
index 00000000..6404fd40
--- /dev/null
+++ b/gnulib/lib/c-ctype.h
@@ -0,0 +1,295 @@
+/* Character handling in C locale.
+
+ These functions work like the corresponding functions in <ctype.h>,
+ except that they have the C (POSIX) locale hardwired, whereas the
+ <ctype.h> functions' behaviour depends on the current locale set via
+ setlocale.
+
+ Copyright (C) 2000-2003, 2006, 2008-2010 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 2 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, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef C_CTYPE_H
+#define C_CTYPE_H
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* The functions defined in this file assume the "C" locale and a character
+ set without diacritics (ASCII-US or EBCDIC-US or something like that).
+ Even if the "C" locale on a particular system is an extension of the ASCII
+ character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
+ is ISO-8859-1), the functions in this file recognize only the ASCII
+ characters. */
+
+
+/* Check whether the ASCII optimizations apply. */
+
+/* ANSI C89 (and ISO C99 5.2.1.3 too) already guarantees that
+ '0', '1', ..., '9' have consecutive integer values. */
+#define C_CTYPE_CONSECUTIVE_DIGITS 1
+
+#if ('A' <= 'Z') \
+ && ('A' + 1 == 'B') && ('B' + 1 == 'C') && ('C' + 1 == 'D') \
+ && ('D' + 1 == 'E') && ('E' + 1 == 'F') && ('F' + 1 == 'G') \
+ && ('G' + 1 == 'H') && ('H' + 1 == 'I') && ('I' + 1 == 'J') \
+ && ('J' + 1 == 'K') && ('K' + 1 == 'L') && ('L' + 1 == 'M') \
+ && ('M' + 1 == 'N') && ('N' + 1 == 'O') && ('O' + 1 == 'P') \
+ && ('P' + 1 == 'Q') && ('Q' + 1 == 'R') && ('R' + 1 == 'S') \
+ && ('S' + 1 == 'T') && ('T' + 1 == 'U') && ('U' + 1 == 'V') \
+ && ('V' + 1 == 'W') && ('W' + 1 == 'X') && ('X' + 1 == 'Y') \
+ && ('Y' + 1 == 'Z')
+#define C_CTYPE_CONSECUTIVE_UPPERCASE 1
+#endif
+
+#if ('a' <= 'z') \
+ && ('a' + 1 == 'b') && ('b' + 1 == 'c') && ('c' + 1 == 'd') \
+ && ('d' + 1 == 'e') && ('e' + 1 == 'f') && ('f' + 1 == 'g') \
+ && ('g' + 1 == 'h') && ('h' + 1 == 'i') && ('i' + 1 == 'j') \
+ && ('j' + 1 == 'k') && ('k' + 1 == 'l') && ('l' + 1 == 'm') \
+ && ('m' + 1 == 'n') && ('n' + 1 == 'o') && ('o' + 1 == 'p') \
+ && ('p' + 1 == 'q') && ('q' + 1 == 'r') && ('r' + 1 == 's') \
+ && ('s' + 1 == 't') && ('t' + 1 == 'u') && ('u' + 1 == 'v') \
+ && ('v' + 1 == 'w') && ('w' + 1 == 'x') && ('x' + 1 == 'y') \
+ && ('y' + 1 == 'z')
+#define C_CTYPE_CONSECUTIVE_LOWERCASE 1
+#endif
+
+#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
+/* The character set is ASCII or one of its variants or extensions, not EBCDIC.
+ Testing the value of '\n' and '\r' is not relevant. */
+#define C_CTYPE_ASCII 1
+#endif
+
+
+/* Function declarations. */
+
+/* Unlike the functions in <ctype.h>, which require an argument in the range
+ of the 'unsigned char' type, the functions here operate on values that are
+ in the 'unsigned char' range or in the 'char' range. In other words,
+ when you have a 'char' value, you need to cast it before using it as
+ argument to a <ctype.h> function:
+
+ const char *s = ...;
+ if (isalpha ((unsigned char) *s)) ...
+
+ but you don't need to cast it for the functions defined in this file:
+
+ const char *s = ...;
+ if (c_isalpha (*s)) ...
+ */
+
+extern bool c_isascii (int c); /* not locale dependent */
+
+extern bool c_isalnum (int c);
+extern bool c_isalpha (int c);
+extern bool c_isblank (int c);
+extern bool c_iscntrl (int c);
+extern bool c_isdigit (int c);
+extern bool c_islower (int c);
+extern bool c_isgraph (int c);
+extern bool c_isprint (int c);
+extern bool c_ispunct (int c);
+extern bool c_isspace (int c);
+extern bool c_isupper (int c);
+extern bool c_isxdigit (int c);
+
+extern int c_tolower (int c);
+extern int c_toupper (int c);
+
+
+#if defined __GNUC__ && defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ && !defined NO_C_CTYPE_MACROS
+
+/* ASCII optimizations. */
+
+#undef c_isascii
+#define c_isascii(c) \
+ ({ int __c = (c); \
+ (__c >= 0x00 && __c <= 0x7f); \
+ })
+
+#if C_CTYPE_CONSECUTIVE_DIGITS \
+ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+#undef c_isalnum
+#define c_isalnum(c) \
+ ({ int __c = (c); \
+ ((__c >= '0' && __c <= '9') \
+ || ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'Z')); \
+ })
+#else
+#undef c_isalnum
+#define c_isalnum(c) \
+ ({ int __c = (c); \
+ ((__c >= '0' && __c <= '9') \
+ || (__c >= 'A' && __c <= 'Z') \
+ || (__c >= 'a' && __c <= 'z')); \
+ })
+#endif
+#endif
+
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+#undef c_isalpha
+#define c_isalpha(c) \
+ ({ int __c = (c); \
+ ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'Z'); \
+ })
+#else
+#undef c_isalpha
+#define c_isalpha(c) \
+ ({ int __c = (c); \
+ ((__c >= 'A' && __c <= 'Z') || (__c >= 'a' && __c <= 'z')); \
+ })
+#endif
+#endif
+
+#undef c_isblank
+#define c_isblank(c) \
+ ({ int __c = (c); \
+ (__c == ' ' || __c == '\t'); \
+ })
+
+#if C_CTYPE_ASCII
+#undef c_iscntrl
+#define c_iscntrl(c) \
+ ({ int __c = (c); \
+ ((__c & ~0x1f) == 0 || __c == 0x7f); \
+ })
+#endif
+
+#if C_CTYPE_CONSECUTIVE_DIGITS
+#undef c_isdigit
+#define c_isdigit(c) \
+ ({ int __c = (c); \
+ (__c >= '0' && __c <= '9'); \
+ })
+#endif
+
+#if C_CTYPE_CONSECUTIVE_LOWERCASE
+#undef c_islower
+#define c_islower(c) \
+ ({ int __c = (c); \
+ (__c >= 'a' && __c <= 'z'); \
+ })
+#endif
+
+#if C_CTYPE_ASCII
+#undef c_isgraph
+#define c_isgraph(c) \
+ ({ int __c = (c); \
+ (__c >= '!' && __c <= '~'); \
+ })
+#endif
+
+#if C_CTYPE_ASCII
+#undef c_isprint
+#define c_isprint(c) \
+ ({ int __c = (c); \
+ (__c >= ' ' && __c <= '~'); \
+ })
+#endif
+
+#if C_CTYPE_ASCII
+#undef c_ispunct
+#define c_ispunct(c) \
+ ({ int _c = (c); \
+ (c_isgraph (_c) && ! c_isalnum (_c)); \
+ })
+#endif
+
+#undef c_isspace
+#define c_isspace(c) \
+ ({ int __c = (c); \
+ (__c == ' ' || __c == '\t' \
+ || __c == '\n' || __c == '\v' || __c == '\f' || __c == '\r'); \
+ })
+
+#if C_CTYPE_CONSECUTIVE_UPPERCASE
+#undef c_isupper
+#define c_isupper(c) \
+ ({ int __c = (c); \
+ (__c >= 'A' && __c <= 'Z'); \
+ })
+#endif
+
+#if C_CTYPE_CONSECUTIVE_DIGITS \
+ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+#undef c_isxdigit
+#define c_isxdigit(c) \
+ ({ int __c = (c); \
+ ((__c >= '0' && __c <= '9') \
+ || ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'F')); \
+ })
+#else
+#undef c_isxdigit
+#define c_isxdigit(c) \
+ ({ int __c = (c); \
+ ((__c >= '0' && __c <= '9') \
+ || (__c >= 'A' && __c <= 'F') \
+ || (__c >= 'a' && __c <= 'f')); \
+ })
+#endif
+#endif
+
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#undef c_tolower
+#define c_tolower(c) \
+ ({ int __c = (c); \
+ (__c >= 'A' && __c <= 'Z' ? __c - 'A' + 'a' : __c); \
+ })
+#undef c_toupper
+#define c_toupper(c) \
+ ({ int __c = (c); \
+ (__c >= 'a' && __c <= 'z' ? __c - 'a' + 'A' : __c); \
+ })
+#endif
+
+#endif /* optimizing for speed */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* C_CTYPE_H */
diff --git a/gnulib/lib/c-stack.c b/gnulib/lib/c-stack.c
new file mode 100644
index 00000000..46575489
--- /dev/null
+++ b/gnulib/lib/c-stack.c
@@ -0,0 +1,342 @@
+/* Stack overflow handling.
+
+ Copyright (C) 2002, 2004, 2006, 2008, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+/* NOTES:
+
+ A program that uses alloca, dynamic arrays, or large local
+ variables may extend the stack by more than a page at a time. If
+ so, when the stack overflows the operating system may not detect
+ the overflow until the program uses the array, and this module may
+ incorrectly report a program error instead of a stack overflow.
+
+ To avoid this problem, allocate only small objects on the stack; a
+ program should be OK if it limits single allocations to a page or
+ less. Allocate larger arrays in static storage, or on the heap
+ (e.g., with malloc). Yes, this is a pain, but we don't know of any
+ better solution that is portable.
+
+ No attempt has been made to deal with multithreaded applications. */
+
+#include <config.h>
+
+#ifndef __attribute__
+# if __GNUC__ < 3
+# define __attribute__(x)
+# endif
+#endif
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include <errno.h>
+
+#include <signal.h>
+#if ! HAVE_STACK_T && ! defined stack_t
+typedef struct sigaltstack stack_t;
+#endif
+#ifndef SIGSTKSZ
+# define SIGSTKSZ 16384
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Posix 2001 declares ucontext_t in <ucontext.h>, Posix 200x in
+ <signal.h>. */
+#if HAVE_UCONTEXT_H
+# include <ucontext.h>
+#endif
+
+#include <unistd.h>
+
+#if HAVE_LIBSIGSEGV
+# include <sigsegv.h>
+#endif
+
+#include "c-stack.h"
+#include "exitfail.h"
+#include "ignore-value.h"
+
+#if defined SA_ONSTACK && defined SA_SIGINFO
+# define SIGACTION_WORKS 1
+#else
+# define SIGACTION_WORKS 0
+# ifndef SA_ONSTACK
+# define SA_ONSTACK 0
+# endif
+#endif
+
+extern char *program_name;
+
+/* The user-specified action to take when a SEGV-related program error
+ or stack overflow occurs. */
+static void (* volatile segv_action) (int);
+
+/* Translated messages for program errors and stack overflow. Do not
+ translate them in the signal handler, since gettext is not
+ async-signal-safe. */
+static char const * volatile program_error_message;
+static char const * volatile stack_overflow_message;
+
+/* Output an error message, then exit with status EXIT_FAILURE if it
+ appears to have been a stack overflow, or with a core dump
+ otherwise. This function is async-signal-safe. */
+
+static void die (int) __attribute__ ((noreturn));
+static void
+die (int signo)
+{
+ char const *message;
+ segv_action (signo);
+ message = signo ? program_error_message : stack_overflow_message;
+ ignore_value (write (STDERR_FILENO, program_name, strlen (program_name)));
+ ignore_value (write (STDERR_FILENO, ": ", 2));
+ ignore_value (write (STDERR_FILENO, message, strlen (message)));
+ ignore_value (write (STDERR_FILENO, "\n", 1));
+ if (! signo)
+ _exit (exit_failure);
+ raise (signo);
+ abort ();
+}
+
+#if (HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK \
+ && HAVE_STACK_OVERFLOW_HANDLING) || HAVE_LIBSIGSEGV
+
+/* Storage for the alternate signal stack. */
+static union
+{
+ char buffer[SIGSTKSZ];
+
+ /* These other members are for proper alignment. There's no
+ standard way to guarantee stack alignment, but this seems enough
+ in practice. */
+ long double ld;
+ long l;
+ void *p;
+} alternate_signal_stack;
+
+static void
+null_action (int signo __attribute__ ((unused)))
+{
+}
+
+#endif /* SIGALTSTACK || LIBSIGSEGV */
+
+/* Only use libsigsegv if we need it; platforms like Solaris can
+ detect stack overflow without the overhead of an external
+ library. */
+#if HAVE_LIBSIGSEGV && ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC
+
+/* Nonzero if general segv handler could not be installed. */
+static volatile int segv_handler_missing;
+
+/* Handle a segmentation violation and exit if it cannot be stack
+ overflow. This function is async-signal-safe. */
+
+static int segv_handler (void *address __attribute__ ((unused)),
+ int serious)
+{
+# if DEBUG
+ {
+ char buf[1024];
+ sprintf (buf, "segv_handler serious=%d\n", serious);
+ write (STDERR_FILENO, buf, strlen (buf));
+ }
+# endif
+
+ /* If this fault is not serious, return 0 to let the stack overflow
+ handler take a shot at it. */
+ if (!serious)
+ return 0;
+ die (SIGSEGV);
+}
+
+/* Handle a segmentation violation that is likely to be a stack
+ overflow and exit. This function is async-signal-safe. */
+
+static void overflow_handler (int, stackoverflow_context_t)
+ __attribute__ ((noreturn));
+static void
+overflow_handler (int emergency,
+ stackoverflow_context_t context __attribute__ ((unused)))
+{
+# if DEBUG
+ {
+ char buf[1024];
+ sprintf (buf, "overflow_handler emergency=%d segv_handler_missing=%d\n",
+ emergency, segv_handler_missing);
+ write (STDERR_FILENO, buf, strlen (buf));
+ }
+# endif
+
+ die ((!emergency || segv_handler_missing) ? 0 : SIGSEGV);
+}
+
+int
+c_stack_action (void (*action) (int))
+{
+ segv_action = action ? action : null_action;
+ program_error_message = _("program error");
+ stack_overflow_message = _("stack overflow");
+
+ /* Always install the overflow handler. */
+ if (stackoverflow_install_handler (overflow_handler,
+ alternate_signal_stack.buffer,
+ sizeof alternate_signal_stack.buffer))
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+ /* Try installing a general handler; if it fails, then treat all
+ segv as stack overflow. */
+ segv_handler_missing = sigsegv_install_handler (segv_handler);
+ return 0;
+}
+
+#elif HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK && HAVE_STACK_OVERFLOW_HANDLING
+
+/* Direction of the C runtime stack. This function is
+ async-signal-safe. */
+
+# if STACK_DIRECTION
+# define find_stack_direction(ptr) STACK_DIRECTION
+# else
+# if ! SIGACTION_WORKS || HAVE_XSI_STACK_OVERFLOW_HEURISTIC
+static int
+find_stack_direction (char const *addr)
+{
+ char dummy;
+ return ! addr ? find_stack_direction (&dummy) : addr < &dummy ? 1 : -1;
+}
+# endif
+# endif
+
+# if SIGACTION_WORKS
+
+/* Handle a segmentation violation and exit. This function is
+ async-signal-safe. */
+
+static void segv_handler (int, siginfo_t *, void *) __attribute__((noreturn));
+static void
+segv_handler (int signo, siginfo_t *info,
+ void *context __attribute__ ((unused)))
+{
+ /* Clear SIGNO if it seems to have been a stack overflow. */
+# if ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC
+ /* We can't easily determine whether it is a stack overflow; so
+ assume that the rest of our program is perfect (!) and that
+ this segmentation violation is a stack overflow.
+
+ Note that although both Linux and Solaris provide
+ sigaltstack, SA_ONSTACK, and SA_SIGINFO, currently only
+ Solaris satisfies the XSI heueristic. This is because
+ Solaris populates uc_stack with the details of the
+ interrupted stack, while Linux populates it with the details
+ of the current stack. */
+ signo = 0;
+# else
+ if (0 < info->si_code)
+ {
+ /* If the faulting address is within the stack, or within one
+ page of the stack end, assume that it is a stack
+ overflow. */
+ ucontext_t const *user_context = context;
+ char const *stack_base = user_context->uc_stack.ss_sp;
+ size_t stack_size = user_context->uc_stack.ss_size;
+ char const *faulting_address = info->si_addr;
+ size_t s = faulting_address - stack_base;
+ size_t page_size = sysconf (_SC_PAGESIZE);
+ if (find_stack_direction (NULL) < 0)
+ s += page_size;
+ if (s < stack_size + page_size)
+ signo = 0;
+
+# if DEBUG
+ {
+ char buf[1024];
+ sprintf (buf,
+ "segv_handler fault=%p base=%p size=%lx page=%lx signo=%d\n",
+ faulting_address, stack_base, (unsigned long) stack_size,
+ (unsigned long) page_size, signo);
+ write (STDERR_FILENO, buf, strlen (buf));
+ }
+# endif
+ }
+# endif
+
+ die (signo);
+}
+# endif
+
+int
+c_stack_action (void (*action) (int))
+{
+ int r;
+ stack_t st;
+ struct sigaction act;
+ st.ss_flags = 0;
+# if SIGALTSTACK_SS_REVERSED
+ /* Irix mistakenly treats ss_sp as the upper bound, rather than
+ lower bound, of the alternate stack. */
+ st.ss_sp = alternate_signal_stack.buffer + SIGSTKSZ - sizeof (void *);
+ st.ss_size = sizeof alternate_signal_stack.buffer - sizeof (void *);
+# else
+ st.ss_sp = alternate_signal_stack.buffer;
+ st.ss_size = sizeof alternate_signal_stack.buffer;
+# endif
+ r = sigaltstack (&st, NULL);
+ if (r != 0)
+ return r;
+
+ segv_action = action ? action : null_action;
+ program_error_message = _("program error");
+ stack_overflow_message = _("stack overflow");
+
+ sigemptyset (&act.sa_mask);
+
+# if SIGACTION_WORKS
+ /* POSIX 1003.1-2001 says SA_RESETHAND implies SA_NODEFER, but
+ this is not true on Solaris 8 at least. It doesn't hurt to use
+ SA_NODEFER here, so leave it in. */
+ act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
+ act.sa_sigaction = segv_handler;
+# else
+ act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
+ act.sa_handler = die;
+# endif
+
+# if FAULT_YIELDS_SIGBUS
+ if (sigaction (SIGBUS, &act, NULL) < 0)
+ return -1;
+# endif
+ return sigaction (SIGSEGV, &act, NULL);
+}
+
+#else /* ! ((HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK
+ && HAVE_STACK_OVERFLOW_HANDLING) || HAVE_LIBSIGSEGV) */
+
+int
+c_stack_action (void (*action) (int) __attribute__ ((unused)))
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+#endif
diff --git a/gnulib/lib/c-stack.h b/gnulib/lib/c-stack.h
new file mode 100644
index 00000000..910bb68f
--- /dev/null
+++ b/gnulib/lib/c-stack.h
@@ -0,0 +1,44 @@
+/* Stack overflow handling.
+
+ Copyright (C) 2002, 2004, 2008, 2009, 2010 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/>. */
+
+
+/* Set up ACTION so that it is invoked on C stack overflow and on other,
+ stack-unrelated, segmentation violation.
+ Return -1 (setting errno) if this cannot be done.
+
+ When a stack overflow or segmentation violation occurs:
+ 1) ACTION is called. It is passed an argument equal to
+ - 0, for a stack overflow,
+ - SIGSEGV, for a segmentation violation that does not appear related
+ to stack overflow.
+ On many platforms the two cases are hard to distinguish; when in doubt,
+ zero is passed.
+ 2) If ACTION returns, a message is written to standard error, and the
+ program is terminated: in the case of stack overflow, with exit code
+ exit_failure (see "exitfail.h"), otherwise through a signal SIGSEGV.
+
+ A null ACTION acts like an action that does nothing.
+
+ ACTION must be async-signal-safe. ACTION together with its callees
+ must not require more than SIGSTKSZ bytes of stack space. Also,
+ ACTION should not call longjmp, because this implementation does
+ not guarantee that it is safe to return to the original stack.
+
+ This function may install a handler for the SIGSEGV signal or for the SIGBUS
+ signal or exercise other system dependent exception handling APIs. */
+
+extern int c_stack_action (void (* /*action*/) (int));
diff --git a/gnulib/lib/c-strcase.h b/gnulib/lib/c-strcase.h
new file mode 100644
index 00000000..b850aa9e
--- /dev/null
+++ b/gnulib/lib/c-strcase.h
@@ -0,0 +1,56 @@
+/* Case-insensitive string comparison functions in C locale.
+ Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef C_STRCASE_H
+#define C_STRCASE_H
+
+#include <stddef.h>
+
+
+/* The functions defined in this file assume the "C" locale and a character
+ set without diacritics (ASCII-US or EBCDIC-US or something like that).
+ Even if the "C" locale on a particular system is an extension of the ASCII
+ character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
+ is ISO-8859-1), the functions in this file recognize only the ASCII
+ characters. More precisely, one of the string arguments must be an ASCII
+ string; the other one can also contain non-ASCII characters (but then
+ the comparison result will be nonzero). */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2. */
+extern int c_strcasecmp (const char *s1, const char *s2);
+
+/* Compare no more than N characters of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2. */
+extern int c_strncasecmp (const char *s1, const char *s2, size_t n);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* C_STRCASE_H */
diff --git a/gnulib/lib/c-strcasecmp.c b/gnulib/lib/c-strcasecmp.c
new file mode 100644
index 00000000..77d13368
--- /dev/null
+++ b/gnulib/lib/c-strcasecmp.c
@@ -0,0 +1,57 @@
+/* c-strcasecmp.c -- case insensitive string comparator in C locale
+ Copyright (C) 1998-1999, 2005-2006, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcase.h"
+
+#include <limits.h>
+
+#include "c-ctype.h"
+
+int
+c_strcasecmp (const char *s1, const char *s2)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ c1 = c_tolower (*p1);
+ c2 = c_tolower (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/gnulib/lib/c-strcaseeq.h b/gnulib/lib/c-strcaseeq.h
new file mode 100644
index 00000000..0af82f30
--- /dev/null
+++ b/gnulib/lib/c-strcaseeq.h
@@ -0,0 +1,184 @@
+/* Optimized case-insensitive string comparison in C locale.
+ Copyright (C) 2001-2002, 2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include "c-strcase.h"
+#include "c-ctype.h"
+
+/* STRCASEEQ allows to optimize string comparison with a small literal string.
+ STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
+ is semantically equivalent to
+ c_strcasecmp (s, "UTF-8") == 0
+ just faster. */
+
+/* Help GCC to generate good code for string comparisons with
+ immediate strings. */
+#if defined (__GNUC__) && defined (__OPTIMIZE__)
+
+/* Case insensitive comparison of ASCII characters. */
+# if C_CTYPE_ASCII
+# define CASEEQ(other,upper) \
+ (c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
+# elif C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+# define CASEEQ(other,upper) \
+ (c_isupper (upper) ? (other) == (upper) || (other) == (upper) - 'A' + 'a' : (other) == (upper))
+# else
+# define CASEEQ(other,upper) \
+ (c_toupper (other) == (upper))
+# endif
+
+static inline int
+strcaseeq9 (const char *s1, const char *s2)
+{
+ return c_strcasecmp (s1 + 9, s2 + 9) == 0;
+}
+
+static inline int
+strcaseeq8 (const char *s1, const char *s2, char s28)
+{
+ if (CASEEQ (s1[8], s28))
+ {
+ if (s28 == 0)
+ return 1;
+ else
+ return strcaseeq9 (s1, s2);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
+{
+ if (CASEEQ (s1[7], s27))
+ {
+ if (s27 == 0)
+ return 1;
+ else
+ return strcaseeq8 (s1, s2, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[6], s26))
+ {
+ if (s26 == 0)
+ return 1;
+ else
+ return strcaseeq7 (s1, s2, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[5], s25))
+ {
+ if (s25 == 0)
+ return 1;
+ else
+ return strcaseeq6 (s1, s2, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[4], s24))
+ {
+ if (s24 == 0)
+ return 1;
+ else
+ return strcaseeq5 (s1, s2, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[3], s23))
+ {
+ if (s23 == 0)
+ return 1;
+ else
+ return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[2], s22))
+ {
+ if (s22 == 0)
+ return 1;
+ else
+ return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[1], s21))
+ {
+ if (s21 == 0)
+ return 1;
+ else
+ return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[0], s20))
+ {
+ if (s20 == 0)
+ return 1;
+ else
+ return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
+
+#else
+
+#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ (c_strcasecmp (s1, s2) == 0)
+
+#endif
diff --git a/gnulib/lib/c-strcasestr.c b/gnulib/lib/c-strcasestr.c
new file mode 100644
index 00000000..86908d64
--- /dev/null
+++ b/gnulib/lib/c-strcasestr.c
@@ -0,0 +1,77 @@
+/* c-strcasestr.c -- case insensitive substring search in C locale
+ Copyright (C) 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcasestr.h"
+
+#include <stdbool.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "c-strcase.h"
+
+/* Two-Way algorithm. */
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#define CANON_ELEMENT c_tolower
+#define CMP_FUNC(p1, p2, l) \
+ c_strncasecmp ((const char *) (p1), (const char *) (p2), l)
+#include "str-two-way.h"
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison from the C locale, regardless of the current locale. */
+char *
+c_strcasestr (const char *haystack_start, const char *needle_start)
+{
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
+
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
+ ok &= (c_tolower ((unsigned char) *haystack++)
+ == c_tolower ((unsigned char) *needle++));
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
+ needle_len = needle - needle_start;
+ haystack = haystack_start + 1;
+ haystack_len = needle_len - 1;
+
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/gnulib/lib/c-strcasestr.h b/gnulib/lib/c-strcasestr.h
new file mode 100644
index 00000000..b46d967d
--- /dev/null
+++ b/gnulib/lib/c-strcasestr.h
@@ -0,0 +1,36 @@
+/* Case-insensitive searching in a string in C locale.
+ Copyright (C) 2005, 2009, 2010 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/>. */
+
+#ifndef C_STRCASESTR_H
+#define C_STRCASESTR_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison. */
+extern char *c_strcasestr (const char *haystack, const char *needle);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* C_STRCASESTR_H */
diff --git a/gnulib/lib/c-strncasecmp.c b/gnulib/lib/c-strncasecmp.c
new file mode 100644
index 00000000..ef737164
--- /dev/null
+++ b/gnulib/lib/c-strncasecmp.c
@@ -0,0 +1,57 @@
+/* c-strncasecmp.c -- case insensitive string comparator in C locale
+ Copyright (C) 1998-1999, 2005-2006, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcase.h"
+
+#include <limits.h>
+
+#include "c-ctype.h"
+
+int
+c_strncasecmp (const char *s1, const char *s2, size_t n)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || n == 0)
+ return 0;
+
+ do
+ {
+ c1 = c_tolower (*p1);
+ c2 = c_tolower (*p2);
+
+ if (--n == 0 || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/gnulib/lib/c-strstr.c b/gnulib/lib/c-strstr.c
new file mode 100644
index 00000000..68fc91fa
--- /dev/null
+++ b/gnulib/lib/c-strstr.c
@@ -0,0 +1,32 @@
+/* c-strstr.c -- substring search in C locale
+ Copyright (C) 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strstr.h"
+
+#include <string.h>
+
+/* Find the first occurrence of NEEDLE in HAYSTACK. */
+char *
+c_strstr (const char *haystack, const char *needle)
+{
+ /* POSIX says that strstr() interprets the strings as byte sequences, not
+ as character sequences in the current locale. */
+ return strstr (haystack, needle);
+}
diff --git a/gnulib/lib/c-strstr.h b/gnulib/lib/c-strstr.h
new file mode 100644
index 00000000..eff8f48d
--- /dev/null
+++ b/gnulib/lib/c-strstr.h
@@ -0,0 +1,44 @@
+/* Searching in a string.
+ Copyright (C) 2001-2003, 2006, 2009-2010 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/>. */
+
+
+/* The functions defined in this file assume a nearly ASCII compatible
+ character set. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK.
+ This function is safe to be called, even in a multibyte locale, if NEEDLE
+ 1. consists solely of printable ASCII characters excluding '\\' and '~'
+ [this restriction is needed because of Shift_JIS and JOHAB]
+ or of the control ASCII characters '\a' '\b' '\f' '\n' '\r' '\t' '\v'
+ [this restriction is needed because of VISCII], and
+ 2. has at least length 2
+ [this restriction is needed because of BIG5, BIG5-HKSCS, GBK, GB18030,
+ Shift_JIS, JOHAB], and
+ 3. does not consist entirely of decimal digits, or has at least length 4
+ [this restricion is needed because of GB18030].
+ This function is also safe to be called, even in a multibyte locale, if
+ HAYSTACK and NEEDLE are known to both consist solely of printable ASCII
+ characters excluding '\\' and '~'. */
+extern char *c_strstr (const char *haystack, const char *needle);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/c-strtod.c b/gnulib/lib/c-strtod.c
new file mode 100644
index 00000000..38d472bd
--- /dev/null
+++ b/gnulib/lib/c-strtod.c
@@ -0,0 +1,112 @@
+/* Convert string to double, using the C locale.
+
+ Copyright (C) 2003-2004, 2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "c-strtod.h"
+
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if LONG
+# define C_STRTOD c_strtold
+# define DOUBLE long double
+# define STRTOD_L strtold_l
+#else
+# define C_STRTOD c_strtod
+# define DOUBLE double
+# define STRTOD_L strtod_l
+#endif
+
+/* c_strtold falls back on strtod if strtold doesn't conform to C99. */
+#if LONG && HAVE_C99_STRTOLD
+# define STRTOD strtold
+#else
+# define STRTOD strtod
+#endif
+
+#ifdef LC_ALL_MASK
+
+/* Cache for the C locale object.
+ Marked volatile so that different threads see the same value
+ (avoids locking). */
+static volatile locale_t c_locale_cache;
+
+/* Return the C locale object, or (locale_t) 0 with errno set
+ if it cannot be created. */
+static inline locale_t
+c_locale (void)
+{
+ if (!c_locale_cache)
+ c_locale_cache = newlocale (LC_ALL_MASK, "C", (locale_t) 0);
+ return c_locale_cache;
+}
+
+#endif
+
+DOUBLE
+C_STRTOD (char const *nptr, char **endptr)
+{
+ DOUBLE r;
+
+#ifdef LC_ALL_MASK
+
+ locale_t locale = c_locale ();
+ if (!locale)
+ {
+ if (endptr)
+ *endptr = (char *) nptr;
+ return 0; /* errno is set here */
+ }
+
+ r = STRTOD_L (nptr, endptr, locale);
+
+#else
+
+ char *saved_locale = setlocale (LC_NUMERIC, NULL);
+
+ if (saved_locale)
+ {
+ saved_locale = strdup (saved_locale);
+ if (saved_locale == NULL)
+ {
+ if (endptr)
+ *endptr = (char *) nptr;
+ return 0; /* errno is set here */
+ }
+ setlocale (LC_NUMERIC, "C");
+ }
+
+ r = STRTOD (nptr, endptr);
+
+ if (saved_locale)
+ {
+ int saved_errno = errno;
+
+ setlocale (LC_NUMERIC, saved_locale);
+ free (saved_locale);
+ errno = saved_errno;
+ }
+
+#endif
+
+ return r;
+}
diff --git a/gnulib/lib/c-strtod.h b/gnulib/lib/c-strtod.h
new file mode 100644
index 00000000..c2adf1e4
--- /dev/null
+++ b/gnulib/lib/c-strtod.h
@@ -0,0 +1,37 @@
+/* Convert string to double, using the C locale.
+
+ Copyright (C) 2003-2004, 2009-2010 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/>. */
+
+/* Parse the initial portion of the string pointed to by NPTR as a floating-
+ point number (in decimal or hexadecimal notation), like in the C locale:
+ accepting only the ASCII digits '0'..'9', and only '.' as decimal point
+ character.
+ If ENDPTR is not NULL, set *ENDPTR to point to the first byte beyond the
+ parsed number or to NPTR if the string does not start with a parseable
+ number.
+ Return value:
+ - If successful, return the value as a double or 'long double',
+ respectively, and don't modify errno.
+ - In case of overflow, return ±HUGE_VAL or ±HUGE_VALL, respectively, and
+ set errno to ERANGE.
+ - In case of underflow, return a value very near to 0 and set errno to
+ ERANGE.
+ - If the string does not start with a number at all, return 0 (and recall
+ that if ENDPTR != NULL, *ENDPTR is set to NPTR), and maybe set errno to
+ EINVAL.
+ - In case of other error, return 0 and set errno, for example to ENOMEM. */
+extern double c_strtod (char const *nptr, char **endptr);
+extern long double c_strtold (char const *nptr, char **endptr);
diff --git a/gnulib/lib/c-strtold.c b/gnulib/lib/c-strtold.c
new file mode 100644
index 00000000..5510e4a4
--- /dev/null
+++ b/gnulib/lib/c-strtold.c
@@ -0,0 +1,2 @@
+#define LONG 1
+#include "c-strtod.c"
diff --git a/gnulib/lib/calloc.c b/gnulib/lib/calloc.c
new file mode 100644
index 00000000..d28e1583
--- /dev/null
+++ b/gnulib/lib/calloc.c
@@ -0,0 +1,70 @@
+/* calloc() function that is glibc compatible.
+ This wrapper function is required at least on Tru64 UNIX 5.1 and mingw.
+ Copyright (C) 2004-2007, 2009-2010 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/>. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#include <config.h>
+/* Only the AC_FUNC_CALLOC macro defines 'calloc' already in config.h. */
+#ifdef calloc
+# define NEED_CALLOC_GNU
+# undef calloc
+#endif
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Call the system's calloc below. */
+#undef calloc
+
+/* Allocate and zero-fill an NxS-byte block of memory from the heap.
+ If N or S is zero, allocate and zero-fill a 1-byte block. */
+
+void *
+rpl_calloc (size_t n, size_t s)
+{
+ void *result;
+
+#ifdef NEED_CALLOC_GNU
+ if (n == 0 || s == 0)
+ {
+ n = 1;
+ s = 1;
+ }
+ else
+ {
+ /* Defend against buggy calloc implementations that mishandle
+ size_t overflow. */
+ size_t bytes = n * s;
+ if (bytes / s != n)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+#endif
+
+ result = calloc (n, s);
+
+#if !HAVE_CALLOC_POSIX
+ if (result == NULL)
+ errno = ENOMEM;
+#endif
+
+ return result;
+}
diff --git a/gnulib/lib/canon-host.c b/gnulib/lib/canon-host.c
new file mode 100644
index 00000000..6083e793
--- /dev/null
+++ b/gnulib/lib/canon-host.c
@@ -0,0 +1,90 @@
+/* Host name canonicalization
+
+ Copyright (C) 2005-2010 Free Software Foundation, Inc.
+
+ Written by Derek Price <derek@ximbiot.com>.
+
+ 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, 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/>. */
+
+#include <config.h>
+
+#include "canon-host.h"
+
+#include <string.h>
+#include <netdb.h>
+
+/* Store the last error for the single-threaded version of this function. */
+static int last_cherror;
+
+/* Single-threaded of wrapper for canon_host_r. After a NULL return, error
+ messages may be retrieved via ch_strerror(). */
+char *
+canon_host (const char *host)
+{
+ return canon_host_r (host, &last_cherror);
+}
+
+/* Return a malloc'd string containing the canonical hostname associated with
+ HOST, or NULL if a canonical name cannot be determined. On NULL return,
+ if CHERROR is not NULL, set *CHERROR to an error code as returned by
+ getaddrinfo(). Use ch_strerror_r() or gai_strerror() to convert a *CHERROR
+ value to a string suitable for error messages.
+
+ WARNINGS
+ HOST must be a string representation of a resolvable name for this host.
+ Strings containing an IP address in dotted decimal notation will be
+ returned as-is, without further resolution.
+
+ The use of the word "canonical" in this context is unfortunate but
+ entrenched. The value returned by this function will be the end result
+ of the resolution of any CNAME chains in the DNS. There may only be one
+ such value for any given hostname, though the actual IP address
+ referenced by this value and the device using that IP address may each
+ actually have any number of such "canonical" hostnames. See the POSIX
+ getaddrinfo spec <http://www.opengroup.org/susv3xsh/getaddrinfo.html">,
+ RFC 1034 <http://www.faqs.org/rfcs/rfc1034.html>, & RFC 2181
+ <http://www.faqs.org/rfcs/rfc2181.html> for more on what this confusing
+ term really refers to. */
+char *
+canon_host_r (char const *host, int *cherror)
+{
+ char *retval = NULL;
+ static struct addrinfo hints;
+ struct addrinfo *res = NULL;
+ int status;
+
+ hints.ai_flags = AI_CANONNAME;
+ status = getaddrinfo (host, NULL, &hints, &res);
+ if (!status)
+ {
+ /* http://lists.gnu.org/archive/html/bug-coreutils/2006-09/msg00300.html
+ says Darwin 7.9.0 getaddrinfo returns 0 but sets
+ res->ai_canonname to NULL. */
+ retval = strdup (res->ai_canonname ? res->ai_canonname : host);
+ if (!retval && cherror)
+ *cherror = EAI_MEMORY;
+ freeaddrinfo (res);
+ }
+ else if (cherror)
+ *cherror = status;
+
+ return retval;
+}
+
+/* Return a string describing the last error encountered by canon_host. */
+const char *
+ch_strerror (void)
+{
+ return gai_strerror (last_cherror);
+}
diff --git a/gnulib/lib/canon-host.h b/gnulib/lib/canon-host.h
new file mode 100644
index 00000000..4120b8a8
--- /dev/null
+++ b/gnulib/lib/canon-host.h
@@ -0,0 +1,29 @@
+/* Host name canonicalization
+
+ Copyright (C) 2005, 2009-2010 Free Software Foundation, Inc.
+
+ Written by Derek Price <derek@ximbiot.com>
+
+ 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, 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/>. */
+
+#ifndef CANON_HOST_H
+# define CANON_HOST_H 1
+
+char *canon_host (char const *host);
+char *canon_host_r (char const *host, int *cherror);
+
+const char *ch_strerror (void);
+# define ch_strerror_r(cherror) gai_strerror (cherror);
+
+#endif /* !CANON_HOST_H */
diff --git a/gnulib/lib/canonicalize-lgpl.c b/gnulib/lib/canonicalize-lgpl.c
new file mode 100644
index 00000000..480a1325
--- /dev/null
+++ b/gnulib/lib/canonicalize-lgpl.c
@@ -0,0 +1,371 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#if !HAVE_CANONICALIZE_FILE_NAME || !FUNC_REALPATH_WORKS || defined _LIBC
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the name == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <alloca.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+#if HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+#include <sys/stat.h>
+#include <errno.h>
+#include <stddef.h>
+
+#ifdef _LIBC
+# include <shlib-compat.h>
+#else
+# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
+# define versioned_symbol(lib, local, symbol, version)
+# define compat_symbol(lib, local, symbol, version)
+# define weak_alias(local, symbol)
+# define __canonicalize_file_name canonicalize_file_name
+# define __realpath realpath
+# include "pathmax.h"
+# include "malloca.h"
+# if HAVE_GETCWD
+# ifdef VMS
+ /* We want the directory in Unix syntax, not in VMS syntax. */
+# define __getcwd(buf, max) getcwd (buf, max, 0)
+# else
+# define __getcwd getcwd
+# endif
+# else
+# define __getcwd(buf, max) getwd (buf)
+# endif
+# define __readlink readlink
+# define __set_errno(e) errno = (e)
+# ifndef MAXSYMLINKS
+# ifdef SYMLOOP_MAX
+# define MAXSYMLINKS SYMLOOP_MAX
+# else
+# define MAXSYMLINKS 20
+# endif
+# endif
+#endif
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+#endif
+
+#if !FUNC_REALPATH_WORKS || defined _LIBC
+/* Return the canonical absolute name of file NAME. A canonical name
+ does not contain any `.', `..' components nor any repeated path
+ separators ('/') or symlinks. All path components must exist. If
+ RESOLVED is null, the result is malloc'd; otherwise, if the
+ canonical name is PATH_MAX chars or more, returns null with `errno'
+ set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
+ returns the name in RESOLVED. If the name cannot be resolved and
+ RESOLVED is non-NULL, it contains the path of the first component
+ that cannot be resolved. If the path can be resolved, RESOLVED
+ holds the same value as the value returned. */
+
+char *
+__realpath (const char *name, char *resolved)
+{
+ char *rpath, *dest, *extra_buf = NULL;
+ const char *start, *end, *rpath_limit;
+ long int path_max;
+ int num_links = 0;
+
+ if (name == NULL)
+ {
+ /* As per Single Unix Specification V2 we must return an error if
+ either parameter is a null pointer. We extend this to allow
+ the RESOLVED parameter to be NULL in case the we are expected to
+ allocate the room for the return value. */
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ if (name[0] == '\0')
+ {
+ /* As per Single Unix Specification V2 we must return an error if
+ the name argument points to an empty string. */
+ __set_errno (ENOENT);
+ return NULL;
+ }
+
+#ifdef PATH_MAX
+ path_max = PATH_MAX;
+#else
+ path_max = pathconf (name, _PC_PATH_MAX);
+ if (path_max <= 0)
+ path_max = 1024;
+#endif
+
+ if (resolved == NULL)
+ {
+ rpath = malloc (path_max);
+ if (rpath == NULL)
+ {
+ /* It's easier to set errno to ENOMEM than to rely on the
+ 'malloc-posix' gnulib module. */
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ else
+ rpath = resolved;
+ rpath_limit = rpath + path_max;
+
+ if (name[0] != '/')
+ {
+ if (!__getcwd (rpath, path_max))
+ {
+ rpath[0] = '\0';
+ goto error;
+ }
+ dest = strchr (rpath, '\0');
+ }
+ else
+ {
+ rpath[0] = '/';
+ dest = rpath + 1;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && name[1] == '/')
+ *dest++ = '/';
+ }
+
+ for (start = end = name; *start; start = end)
+ {
+#ifdef _LIBC
+ struct stat64 st;
+#else
+ struct stat st;
+#endif
+ int n;
+
+ /* Skip sequence of multiple path-separators. */
+ while (*start == '/')
+ ++start;
+
+ /* Find end of path component. */
+ for (end = start; *end && *end != '/'; ++end)
+ /* Nothing. */;
+
+ if (end - start == 0)
+ break;
+ else if (end - start == 1 && start[0] == '.')
+ /* nothing */;
+ else if (end - start == 2 && start[0] == '.' && start[1] == '.')
+ {
+ /* Back up to previous component, ignore if at root already. */
+ if (dest > rpath + 1)
+ while ((--dest)[-1] != '/');
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1
+ && *dest == '/')
+ dest++;
+ }
+ else
+ {
+ size_t new_size;
+
+ if (dest[-1] != '/')
+ *dest++ = '/';
+
+ if (dest + (end - start) >= rpath_limit)
+ {
+ ptrdiff_t dest_offset = dest - rpath;
+ char *new_rpath;
+
+ if (resolved)
+ {
+ __set_errno (ENAMETOOLONG);
+ if (dest > rpath + 1)
+ dest--;
+ *dest = '\0';
+ goto error;
+ }
+ new_size = rpath_limit - rpath;
+ if (end - start + 1 > path_max)
+ new_size += end - start + 1;
+ else
+ new_size += path_max;
+ new_rpath = (char *) realloc (rpath, new_size);
+ if (new_rpath == NULL)
+ {
+ /* It's easier to set errno to ENOMEM than to rely on the
+ 'realloc-posix' gnulib module. */
+ errno = ENOMEM;
+ goto error;
+ }
+ rpath = new_rpath;
+ rpath_limit = rpath + new_size;
+
+ dest = rpath + dest_offset;
+ }
+
+#ifdef _LIBC
+ dest = __mempcpy (dest, start, end - start);
+#else
+ memcpy (dest, start, end - start);
+ dest += end - start;
+#endif
+ *dest = '\0';
+
+#ifdef _LIBC
+ if (__lxstat64 (_STAT_VER, rpath, &st) < 0)
+#else
+ if (lstat (rpath, &st) < 0)
+#endif
+ goto error;
+
+ if (S_ISLNK (st.st_mode))
+ {
+ char *buf;
+ size_t len;
+
+ if (++num_links > MAXSYMLINKS)
+ {
+ __set_errno (ELOOP);
+ goto error;
+ }
+
+ buf = malloca (path_max);
+ if (!buf)
+ {
+ errno = ENOMEM;
+ goto error;
+ }
+
+ n = __readlink (rpath, buf, path_max - 1);
+ if (n < 0)
+ {
+ int saved_errno = errno;
+ freea (buf);
+ errno = saved_errno;
+ goto error;
+ }
+ buf[n] = '\0';
+
+ if (!extra_buf)
+ {
+ extra_buf = malloca (path_max);
+ if (!extra_buf)
+ {
+ freea (buf);
+ errno = ENOMEM;
+ goto error;
+ }
+ }
+
+ len = strlen (end);
+ if ((long int) (n + len) >= path_max)
+ {
+ freea (buf);
+ __set_errno (ENAMETOOLONG);
+ goto error;
+ }
+
+ /* Careful here, end may be a pointer into extra_buf... */
+ memmove (&extra_buf[n], end, len + 1);
+ name = end = memcpy (extra_buf, buf, n);
+
+ if (buf[0] == '/')
+ {
+ dest = rpath + 1; /* It's an absolute symlink */
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && buf[1] == '/')
+ *dest++ = '/';
+ }
+ else
+ {
+ /* Back up to previous component, ignore if at root
+ already: */
+ if (dest > rpath + 1)
+ while ((--dest)[-1] != '/');
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1
+ && *dest == '/')
+ dest++;
+ }
+ }
+ else if (!S_ISDIR (st.st_mode) && *end != '\0')
+ {
+ __set_errno (ENOTDIR);
+ goto error;
+ }
+ }
+ }
+ if (dest > rpath + 1 && dest[-1] == '/')
+ --dest;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1 && *dest == '/')
+ dest++;
+ *dest = '\0';
+
+ if (extra_buf)
+ freea (extra_buf);
+
+ return rpath;
+
+error:
+ {
+ int saved_errno = errno;
+ if (extra_buf)
+ freea (extra_buf);
+ if (resolved == NULL)
+ free (rpath);
+ errno = saved_errno;
+ }
+ return NULL;
+}
+versioned_symbol (libc, __realpath, realpath, GLIBC_2_3);
+#endif /* !FUNC_REALPATH_WORKS || defined _LIBC */
+
+
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3)
+char *
+attribute_compat_text_section
+__old_realpath (const char *name, char *resolved)
+{
+ if (resolved == NULL)
+ {
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ return __realpath (name, resolved);
+}
+compat_symbol (libc, __old_realpath, realpath, GLIBC_2_0);
+#endif
+
+
+char *
+__canonicalize_file_name (const char *name)
+{
+ return __realpath (name, NULL);
+}
+weak_alias (__canonicalize_file_name, canonicalize_file_name)
+
+#else
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#endif
diff --git a/gnulib/lib/canonicalize.c b/gnulib/lib/canonicalize.c
new file mode 100644
index 00000000..18acd061
--- /dev/null
+++ b/gnulib/lib/canonicalize.c
@@ -0,0 +1,290 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2010 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/>. */
+
+#include <config.h>
+
+#include "canonicalize.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "areadlink.h"
+#include "file-set.h"
+#include "hash-triple.h"
+#include "pathmax.h"
+#include "xalloc.h"
+#include "xgetcwd.h"
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+#endif
+
+#if !((HAVE_CANONICALIZE_FILE_NAME && FUNC_REALPATH_WORKS) \
+ || GNULIB_CANONICALIZE_LGPL)
+/* Return the canonical absolute name of file NAME. A canonical name
+ does not contain any `.', `..' components nor any repeated file name
+ separators ('/') or symlinks. All components must exist.
+ The result is malloc'd. */
+
+char *
+canonicalize_file_name (const char *name)
+{
+ return canonicalize_filename_mode (name, CAN_EXISTING);
+}
+#endif /* !HAVE_CANONICALIZE_FILE_NAME */
+
+/* Return true if we've already seen the triple, <FILENAME, dev, ino>.
+ If *HT is not initialized, initialize it. */
+static bool
+seen_triple (Hash_table **ht, char const *filename, struct stat const *st)
+{
+ if (*ht == NULL)
+ {
+ size_t initial_capacity = 7;
+ *ht = hash_initialize (initial_capacity,
+ NULL,
+ triple_hash,
+ triple_compare_ino_str,
+ triple_free);
+ if (*ht == NULL)
+ xalloc_die ();
+ }
+
+ if (seen_file (*ht, filename, st))
+ return true;
+
+ record_file (*ht, filename, st);
+ return false;
+}
+
+/* Return the canonical absolute name of file NAME, while treating
+ missing elements according to CAN_MODE. A canonical name
+ does not contain any `.', `..' components nor any repeated file name
+ separators ('/') or symlinks. Whether components must exist
+ or not depends on canonicalize mode. The result is malloc'd. */
+
+char *
+canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode)
+{
+ char *rname, *dest, *extra_buf = NULL;
+ char const *start;
+ char const *end;
+ char const *rname_limit;
+ size_t extra_len = 0;
+ Hash_table *ht = NULL;
+ int saved_errno;
+
+ if (name == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (name[0] == '\0')
+ {
+ errno = ENOENT;
+ return NULL;
+ }
+
+ if (name[0] != '/')
+ {
+ rname = xgetcwd ();
+ if (!rname)
+ return NULL;
+ dest = strchr (rname, '\0');
+ if (dest - rname < PATH_MAX)
+ {
+ char *p = xrealloc (rname, PATH_MAX);
+ dest = p + (dest - rname);
+ rname = p;
+ rname_limit = rname + PATH_MAX;
+ }
+ else
+ {
+ rname_limit = dest;
+ }
+ }
+ else
+ {
+ rname = xmalloc (PATH_MAX);
+ rname_limit = rname + PATH_MAX;
+ rname[0] = '/';
+ dest = rname + 1;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && name[1] == '/')
+ *dest++ = '/';
+ }
+
+ for (start = name; *start; start = end)
+ {
+ /* Skip sequence of multiple file name separators. */
+ while (*start == '/')
+ ++start;
+
+ /* Find end of component. */
+ for (end = start; *end && *end != '/'; ++end)
+ /* Nothing. */;
+
+ if (end - start == 0)
+ break;
+ else if (end - start == 1 && start[0] == '.')
+ /* nothing */;
+ else if (end - start == 2 && start[0] == '.' && start[1] == '.')
+ {
+ /* Back up to previous component, ignore if at root already. */
+ if (dest > rname + 1)
+ while ((--dest)[-1] != '/');
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
+ && *dest == '/')
+ dest++;
+ }
+ else
+ {
+ struct stat st;
+
+ if (dest[-1] != '/')
+ *dest++ = '/';
+
+ if (dest + (end - start) >= rname_limit)
+ {
+ ptrdiff_t dest_offset = dest - rname;
+ size_t new_size = rname_limit - rname;
+
+ if (end - start + 1 > PATH_MAX)
+ new_size += end - start + 1;
+ else
+ new_size += PATH_MAX;
+ rname = xrealloc (rname, new_size);
+ rname_limit = rname + new_size;
+
+ dest = rname + dest_offset;
+ }
+
+ dest = memcpy (dest, start, end - start);
+ dest += end - start;
+ *dest = '\0';
+
+ if (lstat (rname, &st) != 0)
+ {
+ saved_errno = errno;
+ if (can_mode == CAN_EXISTING)
+ goto error;
+ if (can_mode == CAN_ALL_BUT_LAST)
+ {
+ if (end[strspn (end, "/")] || saved_errno != ENOENT)
+ goto error;
+ continue;
+ }
+ st.st_mode = 0;
+ }
+
+ if (S_ISLNK (st.st_mode))
+ {
+ char *buf;
+ size_t n, len;
+
+ /* Detect loops. We cannot use the cycle-check module here,
+ since it's actually possible to encounter the same symlink
+ more than once in a given traversal. However, encountering
+ the same symlink,NAME pair twice does indicate a loop. */
+ if (seen_triple (&ht, name, &st))
+ {
+ if (can_mode == CAN_MISSING)
+ continue;
+ saved_errno = ELOOP;
+ goto error;
+ }
+
+ buf = areadlink_with_size (rname, st.st_size);
+ if (!buf)
+ {
+ if (can_mode == CAN_MISSING && errno != ENOMEM)
+ continue;
+ saved_errno = errno;
+ goto error;
+ }
+
+ n = strlen (buf);
+ len = strlen (end);
+
+ if (!extra_len)
+ {
+ extra_len =
+ ((n + len + 1) > PATH_MAX) ? (n + len + 1) : PATH_MAX;
+ extra_buf = xmalloc (extra_len);
+ }
+ else if ((n + len + 1) > extra_len)
+ {
+ extra_len = n + len + 1;
+ extra_buf = xrealloc (extra_buf, extra_len);
+ }
+
+ /* Careful here, end may be a pointer into extra_buf... */
+ memmove (&extra_buf[n], end, len + 1);
+ name = end = memcpy (extra_buf, buf, n);
+
+ if (buf[0] == '/')
+ {
+ dest = rname + 1; /* It's an absolute symlink */
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && buf[1] == '/')
+ *dest++ = '/';
+ }
+ else
+ {
+ /* Back up to previous component, ignore if at root
+ already: */
+ if (dest > rname + 1)
+ while ((--dest)[-1] != '/');
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
+ && *dest == '/')
+ dest++;
+ }
+
+ free (buf);
+ }
+ else
+ {
+ if (!S_ISDIR (st.st_mode) && *end && (can_mode != CAN_MISSING))
+ {
+ saved_errno = ENOTDIR;
+ goto error;
+ }
+ }
+ }
+ }
+ if (dest > rname + 1 && dest[-1] == '/')
+ --dest;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && *dest == '/')
+ dest++;
+ *dest = '\0';
+ if (rname_limit != dest + 1)
+ rname = xrealloc (rname, dest - rname + 1);
+
+ free (extra_buf);
+ if (ht)
+ hash_free (ht);
+ return rname;
+
+error:
+ free (extra_buf);
+ free (rname);
+ if (ht)
+ hash_free (ht);
+ errno = saved_errno;
+ return NULL;
+}
diff --git a/gnulib/lib/canonicalize.h b/gnulib/lib/canonicalize.h
new file mode 100644
index 00000000..9d78b93f
--- /dev/null
+++ b/gnulib/lib/canonicalize.h
@@ -0,0 +1,41 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2007, 2009-2010 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/>. */
+
+#ifndef CANONICALIZE_H_
+# define CANONICALIZE_H_
+
+#include <stdlib.h> /* for canonicalize_file_name */
+
+enum canonicalize_mode_t
+ {
+ /* All components must exist. */
+ CAN_EXISTING = 0,
+
+ /* All components excluding last one must exist. */
+ CAN_ALL_BUT_LAST = 1,
+
+ /* No requirements on components existence. */
+ CAN_MISSING = 2
+ };
+typedef enum canonicalize_mode_t canonicalize_mode_t;
+
+/* Return a malloc'd string containing the canonical absolute name of
+ the named file. This acts like canonicalize_file_name, except that
+ whether components must exist depends on the canonicalize_mode_t
+ argument. */
+char *canonicalize_filename_mode (const char *, canonicalize_mode_t);
+
+#endif /* !CANONICALIZE_H_ */
diff --git a/gnulib/lib/ceil.c b/gnulib/lib/ceil.c
new file mode 100644
index 00000000..866804b1
--- /dev/null
+++ b/gnulib/lib/ceil.c
@@ -0,0 +1,93 @@
+/* Round towards positive infinity.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC ceill
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC ceil
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC ceilf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define L_(literal) literal##f
+#endif
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+FUNC (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
diff --git a/gnulib/lib/ceilf.c b/gnulib/lib/ceilf.c
new file mode 100644
index 00000000..11a69391
--- /dev/null
+++ b/gnulib/lib/ceilf.c
@@ -0,0 +1,20 @@
+/* Round towards positive infinity.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "ceil.c"
diff --git a/gnulib/lib/ceill.c b/gnulib/lib/ceill.c
new file mode 100644
index 00000000..b55265b4
--- /dev/null
+++ b/gnulib/lib/ceill.c
@@ -0,0 +1,20 @@
+/* Round towards positive infinity.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_LONG_DOUBLE
+#include "ceil.c"
diff --git a/gnulib/lib/chdir-long.c b/gnulib/lib/chdir-long.c
new file mode 100644
index 00000000..28e24070
--- /dev/null
+++ b/gnulib/lib/chdir-long.c
@@ -0,0 +1,266 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+ Copyright (C) 2004-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "chdir-long.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifndef PATH_MAX
+# error "compile this file only if your system defines PATH_MAX"
+#endif
+
+/* The results of openat() in this file are not leaked to any
+ single-threaded code that could use stdio.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use openat_safer. */
+
+struct cd_buf
+{
+ int fd;
+};
+
+static inline void
+cdb_init (struct cd_buf *cdb)
+{
+ cdb->fd = AT_FDCWD;
+}
+
+static inline int
+cdb_fchdir (struct cd_buf const *cdb)
+{
+ return fchdir (cdb->fd);
+}
+
+static inline void
+cdb_free (struct cd_buf const *cdb)
+{
+ if (0 <= cdb->fd)
+ {
+ bool close_fail = close (cdb->fd);
+ assert (! close_fail);
+ }
+}
+
+/* Given a file descriptor of an open directory (or AT_FDCWD), CDB->fd,
+ try to open the CDB->fd-relative directory, DIR. If the open succeeds,
+ update CDB->fd with the resulting descriptor, close the incoming file
+ descriptor, and return zero. Upon failure, return -1 and set errno. */
+static int
+cdb_advance_fd (struct cd_buf *cdb, char const *dir)
+{
+ int new_fd = openat (cdb->fd, dir,
+ O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
+ if (new_fd < 0)
+ return -1;
+
+ cdb_free (cdb);
+ cdb->fd = new_fd;
+
+ return 0;
+}
+
+/* Return a pointer to the first non-slash in S. */
+static inline char *
+find_non_slash (char const *s)
+{
+ size_t n_slash = strspn (s, "/");
+ return (char *) s + n_slash;
+}
+
+/* This is a function much like chdir, but without the PATH_MAX limitation
+ on the length of the directory name. A significant difference is that
+ it must be able to modify (albeit only temporarily) the directory
+ name. It handles an arbitrarily long directory name by operating
+ on manageable portions of the name. On systems without the openat
+ syscall, this means changing the working directory to more and more
+ `distant' points along the long directory name and then restoring
+ the working directory. If any of those attempts to save or restore
+ the working directory fails, this function exits nonzero.
+
+ Note that this function may still fail with errno == ENAMETOOLONG, but
+ only if the specified directory name contains a component that is long
+ enough to provoke such a failure all by itself (e.g. if the component
+ has length PATH_MAX or greater on systems that define PATH_MAX). */
+
+int
+chdir_long (char *dir)
+{
+ int e = chdir (dir);
+ if (e == 0 || errno != ENAMETOOLONG)
+ return e;
+
+ {
+ size_t len = strlen (dir);
+ char *dir_end = dir + len;
+ struct cd_buf cdb;
+ size_t n_leading_slash;
+
+ cdb_init (&cdb);
+
+ /* If DIR is the empty string, then the chdir above
+ must have failed and set errno to ENOENT. */
+ assert (0 < len);
+ assert (PATH_MAX <= len);
+
+ /* Count leading slashes. */
+ n_leading_slash = strspn (dir, "/");
+
+ /* Handle any leading slashes as well as any name that matches
+ the regular expression, m!^//hostname[/]*! . Handling this
+ prefix separately usually results in a single additional
+ cdb_advance_fd call, but it's worthwhile, since it makes the
+ code in the following loop cleaner. */
+ if (n_leading_slash == 2)
+ {
+ int err;
+ /* Find next slash.
+ We already know that dir[2] is neither a slash nor '\0'. */
+ char *slash = memchr (dir + 3, '/', dir_end - (dir + 3));
+ if (slash == NULL)
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ *slash = '\0';
+ err = cdb_advance_fd (&cdb, dir);
+ *slash = '/';
+ if (err != 0)
+ goto Fail;
+ dir = find_non_slash (slash + 1);
+ }
+ else if (n_leading_slash)
+ {
+ if (cdb_advance_fd (&cdb, "/") != 0)
+ goto Fail;
+ dir += n_leading_slash;
+ }
+
+ assert (*dir != '/');
+ assert (dir <= dir_end);
+
+ while (PATH_MAX <= dir_end - dir)
+ {
+ int err;
+ /* Find a slash that is PATH_MAX or fewer bytes away from dir.
+ I.e. see if there is a slash that will give us a name of
+ length PATH_MAX-1 or less. */
+ char *slash = memrchr (dir, '/', PATH_MAX);
+ if (slash == NULL)
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+
+ *slash = '\0';
+ assert (slash - dir < PATH_MAX);
+ err = cdb_advance_fd (&cdb, dir);
+ *slash = '/';
+ if (err != 0)
+ goto Fail;
+
+ dir = find_non_slash (slash + 1);
+ }
+
+ if (dir < dir_end)
+ {
+ if (cdb_advance_fd (&cdb, dir) != 0)
+ goto Fail;
+ }
+
+ if (cdb_fchdir (&cdb) != 0)
+ goto Fail;
+
+ cdb_free (&cdb);
+ return 0;
+
+ Fail:
+ {
+ int saved_errno = errno;
+ cdb_free (&cdb);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+}
+
+#if TEST_CHDIR
+
+# include "closeout.h"
+# include "error.h"
+
+char *program_name;
+
+int
+main (int argc, char *argv[])
+{
+ char *line = NULL;
+ size_t n = 0;
+ int len;
+
+ program_name = argv[0];
+ atexit (close_stdout);
+
+ len = getline (&line, &n, stdin);
+ if (len < 0)
+ {
+ int saved_errno = errno;
+ if (feof (stdin))
+ exit (0);
+
+ error (EXIT_FAILURE, saved_errno,
+ "reading standard input");
+ }
+ else if (len == 0)
+ exit (0);
+
+ if (line[len-1] == '\n')
+ line[len-1] = '\0';
+
+ if (chdir_long (line) != 0)
+ error (EXIT_FAILURE, errno,
+ "chdir_long failed: %s", line);
+
+ if (argc <= 1)
+ {
+ /* Using `pwd' here makes sense only if it is a robust implementation,
+ like the one in coreutils after the 2004-04-19 changes. */
+ char const *cmd = "pwd";
+ execlp (cmd, (char *) NULL);
+ error (EXIT_FAILURE, errno, "%s", cmd);
+ }
+
+ fclose (stdin);
+ fclose (stderr);
+
+ exit (EXIT_SUCCESS);
+}
+#endif
+
+/*
+Local Variables:
+compile-command: "gcc -DTEST_CHDIR=1 -g -O -W -Wall chdir-long.c libcoreutils.a"
+End:
+*/
diff --git a/gnulib/lib/chdir-long.h b/gnulib/lib/chdir-long.h
new file mode 100644
index 00000000..a0a44321
--- /dev/null
+++ b/gnulib/lib/chdir-long.h
@@ -0,0 +1,34 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+ Copyright (C) 2004-2005, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <unistd.h>
+#include <limits.h>
+
+#ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# endif
+#endif
+
+/* On systems without PATH_MAX, presume that chdir accepts
+ arbitrarily long directory names. */
+#ifndef PATH_MAX
+# define chdir_long(Dir) chdir (Dir)
+#else
+int chdir_long (char *dir);
+#endif
diff --git a/gnulib/lib/chdir-safer.c b/gnulib/lib/chdir-safer.c
new file mode 100644
index 00000000..b3266b51
--- /dev/null
+++ b/gnulib/lib/chdir-safer.c
@@ -0,0 +1,79 @@
+/* much like chdir(2), but safer
+
+ Copyright (C) 2005-2006, 2008-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "chdir-safer.h"
+
+#include <stdbool.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "same-inode.h"
+
+#ifndef HAVE_READLINK
+# define HAVE_READLINK 0
+#endif
+
+/* Like chdir, but fail if DIR is a symbolic link to a directory (or
+ similar funny business), or if DIR is not readable. This avoids a
+ minor race condition between when a directory is created or statted
+ and when the process chdirs into it. */
+int
+chdir_no_follow (char const *dir)
+{
+ int result = 0;
+ int saved_errno;
+ int fd = open (dir,
+ O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK);
+ if (fd < 0)
+ return -1;
+
+ /* If open follows symlinks, lstat DIR and fstat FD to ensure that
+ they are the same file; if they are different files, set errno to
+ ELOOP (the same value that open uses for symlinks with
+ O_NOFOLLOW) so the caller can report a failure.
+ Skip this check if HAVE_READLINK == 0, which should be the case
+ on any system that lacks symlink support. */
+ if (HAVE_READLINK && ! HAVE_WORKING_O_NOFOLLOW)
+ {
+ struct stat sb1;
+ result = lstat (dir, &sb1);
+ if (result == 0)
+ {
+ struct stat sb2;
+ result = fstat (fd, &sb2);
+ if (result == 0 && ! SAME_INODE (sb1, sb2))
+ {
+ errno = ELOOP;
+ result = -1;
+ }
+ }
+ }
+
+ if (result == 0)
+ result = fchdir (fd);
+
+ saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return result;
+}
diff --git a/gnulib/lib/chdir-safer.h b/gnulib/lib/chdir-safer.h
new file mode 100644
index 00000000..b21028b1
--- /dev/null
+++ b/gnulib/lib/chdir-safer.h
@@ -0,0 +1,20 @@
+/* much like chdir(2), but safer
+
+ Copyright (C) 2005, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+int chdir_no_follow (char const *file);
diff --git a/gnulib/lib/check-version.c b/gnulib/lib/check-version.c
new file mode 100644
index 00000000..740f7c58
--- /dev/null
+++ b/gnulib/lib/check-version.c
@@ -0,0 +1,44 @@
+/* check-version.h --- Check version string compatibility.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008,
+ 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. This interface is influenced by
+ gcry_check_version from Werner Koch's Libgcrypt. Paul Eggert
+ suggested the use of strverscmp to simplify implementation. */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <string.h>
+
+/* Get specification. */
+#include "check-version.h"
+
+/* Check that the version of the library (i.e., the CPP symbol VERSION)
+ * is at minimum the requested one in REQ_VERSION (typically found in
+ * a header file) and return the version string. Return NULL if the
+ * condition is not satisfied. If a NULL is passed to this function,
+ * no check is done, but the version string is simply returned.
+ */
+const char *
+check_version (const char *req_version)
+{
+ if (!req_version || strverscmp (req_version, VERSION) <= 0)
+ return VERSION;
+
+ return NULL;
+}
diff --git a/gnulib/lib/check-version.h b/gnulib/lib/check-version.h
new file mode 100644
index 00000000..93a95829
--- /dev/null
+++ b/gnulib/lib/check-version.h
@@ -0,0 +1,26 @@
+/* check-version.h --- Check version string compatibility.
+ Copyright (C) 2005, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#ifndef CHECK_VERSION_H
+# define CHECK_VERSION_H
+
+extern const char *
+check_version (const char *req_version);
+
+#endif /* CHECK_VERSION_H */
diff --git a/gnulib/lib/chown.c b/gnulib/lib/chown.c
new file mode 100644
index 00000000..d8f6bfe0
--- /dev/null
+++ b/gnulib/lib/chown.c
@@ -0,0 +1,156 @@
+/* provide consistent interface to chown for systems that don't interpret
+ an ID of -1 as meaning `don't change the corresponding ID'.
+
+ Copyright (C) 1997, 2004-2007, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_CHOWN
+
+/* Simple stub that always fails with ENOSYS, for mingw. */
+int
+chown (const char *file _GL_UNUSED, uid_t uid _GL_UNUSED,
+ gid_t gid _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_CHOWN */
+
+/* Below we refer to the system's chown(). */
+# undef chown
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+# undef open
+# undef close
+
+/* Provide a more-closely POSIX-conforming version of chown on
+ systems with one or both of the following problems:
+ - chown doesn't treat an ID of -1 as meaning
+ `don't change the corresponding ID'.
+ - chown doesn't dereference symlinks. */
+
+int
+rpl_chown (const char *file, uid_t uid, gid_t gid)
+{
+ struct stat st;
+ bool stat_valid = false;
+ int result;
+
+# if CHOWN_CHANGE_TIME_BUG
+ if (gid != (gid_t) -1 || uid != (uid_t) -1)
+ {
+ if (stat (file, &st))
+ return -1;
+ stat_valid = true;
+ }
+# endif
+
+# if CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE
+ if (gid == (gid_t) -1 || uid == (uid_t) -1)
+ {
+ /* Stat file to get id(s) that should remain unchanged. */
+ if (!stat_valid && stat (file, &st))
+ return -1;
+ if (gid == (gid_t) -1)
+ gid = st.st_gid;
+ if (uid == (uid_t) -1)
+ uid = st.st_uid;
+ }
+# endif
+
+# if CHOWN_MODIFIES_SYMLINK
+ {
+ /* Handle the case in which the system-supplied chown function
+ does *not* follow symlinks. Instead, it changes permissions
+ on the symlink itself. To work around that, we open the
+ file (but this can fail due to lack of read or write permission) and
+ use fchown on the resulting descriptor. */
+ int open_flags = O_NONBLOCK | O_NOCTTY;
+ int fd = open (file, O_RDONLY | open_flags);
+ if (0 <= fd
+ || (errno == EACCES
+ && 0 <= (fd = open (file, O_WRONLY | open_flags))))
+ {
+ int saved_errno;
+ bool fchown_socket_failure;
+
+ result = fchown (fd, uid, gid);
+ saved_errno = errno;
+
+ /* POSIX says fchown can fail with errno == EINVAL on sockets
+ and pipes, so fall back on chown in that case. */
+ fchown_socket_failure =
+ (result != 0 && saved_errno == EINVAL
+ && fstat (fd, &st) == 0
+ && (S_ISFIFO (st.st_mode) || S_ISSOCK (st.st_mode)));
+
+ close (fd);
+
+ if (! fchown_socket_failure)
+ {
+ errno = saved_errno;
+ return result;
+ }
+ }
+ else if (errno != EACCES)
+ return -1;
+ }
+# endif
+
+# if CHOWN_TRAILING_SLASH_BUG
+ if (!stat_valid)
+ {
+ size_t len = strlen (file);
+ if (len && file[len - 1] == '/' && stat (file, &st))
+ return -1;
+ }
+# endif
+
+ result = chown (file, uid, gid);
+
+# if CHOWN_CHANGE_TIME_BUG
+ if (result == 0 && stat_valid
+ && (uid == st.st_uid || uid == (uid_t) -1)
+ && (gid == st.st_gid || gid == (gid_t) -1))
+ {
+ /* No change in ownership, but at least one argument was not -1,
+ so we are required to update ctime. Since chown succeeded,
+ we assume that chmod will do likewise. Fortunately, on all
+ known systems where a 'no-op' chown skips the ctime update, a
+ 'no-op' chmod still does the trick. */
+ result = chmod (file, st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO
+ | S_ISUID | S_ISGID | S_ISVTX));
+ }
+# endif
+
+ return result;
+}
+
+#endif /* HAVE_CHOWN */
diff --git a/gnulib/lib/classpath.c b/gnulib/lib/classpath.c
new file mode 100644
index 00000000..7913e51b
--- /dev/null
+++ b/gnulib/lib/classpath.c
@@ -0,0 +1,122 @@
+/* Java CLASSPATH handling.
+ Copyright (C) 2001-2003, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "classpath.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xsetenv.h"
+#include "xalloc.h"
+
+/* Name of environment variable. */
+#ifndef CLASSPATHVAR
+# define CLASSPATHVAR "CLASSPATH"
+#endif
+
+/* Separator in PATH like lists of pathnames. */
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+ /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* Return the new CLASSPATH value. The given classpaths are prepended to
+ the current CLASSPATH value. If use_minimal_classpath, the current
+ CLASSPATH is ignored. */
+char *
+new_classpath (const char * const *classpaths, unsigned int classpaths_count,
+ bool use_minimal_classpath)
+{
+ const char *old_classpath;
+ unsigned int length;
+ unsigned int i;
+ char *result;
+ char *p;
+
+ old_classpath = (use_minimal_classpath ? NULL : getenv (CLASSPATHVAR));
+ if (old_classpath == NULL)
+ old_classpath = "";
+
+ length = 0;
+ for (i = 0; i < classpaths_count; i++)
+ length += strlen (classpaths[i]) + 1;
+ length += strlen (old_classpath);
+ if (classpaths_count > 0 && old_classpath[0] == '\0')
+ length--;
+
+ result = XNMALLOC (length + 1, char);
+ p = result;
+ for (i = 0; i < classpaths_count; i++)
+ {
+ memcpy (p, classpaths[i], strlen (classpaths[i]));
+ p += strlen (classpaths[i]);
+ *p++ = PATH_SEPARATOR;
+ }
+ if (old_classpath[0] != '\0')
+ {
+ memcpy (p, old_classpath, strlen (old_classpath));
+ p += strlen (old_classpath);
+ }
+ else
+ {
+ if (classpaths_count > 0)
+ p--;
+ }
+ *p = '\0';
+
+ return result;
+}
+
+/* Set CLASSPATH and returns a safe copy of its old value. */
+char *
+set_classpath (const char * const *classpaths, unsigned int classpaths_count,
+ bool use_minimal_classpath, bool verbose)
+{
+ const char *old_CLASSPATH = getenv (CLASSPATHVAR);
+ char *result = (old_CLASSPATH != NULL ? xstrdup (old_CLASSPATH) : NULL);
+ char *new_CLASSPATH =
+ new_classpath (classpaths, classpaths_count, use_minimal_classpath);
+
+ if (verbose)
+ printf (CLASSPATHVAR "=%s ", new_CLASSPATH);
+
+ xsetenv (CLASSPATHVAR, new_CLASSPATH, 1);
+
+ free (new_CLASSPATH);
+
+ return result;
+}
+
+/* Restore CLASSPATH to its previous value. */
+void
+reset_classpath (char *old_classpath)
+{
+ if (old_classpath != NULL)
+ {
+ xsetenv (CLASSPATHVAR, old_classpath, 1);
+ free (old_classpath);
+ }
+ else
+ unsetenv (CLASSPATHVAR);
+}
diff --git a/gnulib/lib/classpath.h b/gnulib/lib/classpath.h
new file mode 100644
index 00000000..7439148e
--- /dev/null
+++ b/gnulib/lib/classpath.h
@@ -0,0 +1,33 @@
+/* Java CLASSPATH handling.
+ Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2003.
+
+ 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/>. */
+
+#include <stdbool.h>
+
+/* Return the new CLASSPATH value. The given classpaths are prepended to
+ the current CLASSPATH value. If use_minimal_classpath, the current
+ CLASSPATH is ignored. */
+extern char * new_classpath (const char * const *classpaths,
+ unsigned int classpaths_count,
+ bool use_minimal_classpath);
+
+/* Set CLASSPATH and returns a safe copy of its old value. */
+extern char * set_classpath (const char * const *classpaths,
+ unsigned int classpaths_count,
+ bool use_minimal_classpath, bool verbose);
+
+/* Restore CLASSPATH to its previous value. */
+extern void reset_classpath (char *old_classpath);
diff --git a/gnulib/lib/clean-temp.c b/gnulib/lib/clean-temp.c
new file mode 100644
index 00000000..93008151
--- /dev/null
+++ b/gnulib/lib/clean-temp.c
@@ -0,0 +1,785 @@
+/* Temporary directories and temporary files with automatic cleanup.
+ Copyright (C) 2001, 2003, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "clean-temp.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+#endif
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "pathmax.h"
+#include "tmpdir.h"
+#include "xalloc.h"
+#include "xmalloca.h"
+#include "gl_xlist.h"
+#include "gl_linkedhash_list.h"
+#include "gettext.h"
+#if GNULIB_FWRITEERROR
+# include "fwriteerror.h"
+#endif
+#if GNULIB_CLOSE_STREAM
+# include "close-stream.h"
+#endif
+#if GNULIB_FCNTL_SAFER
+# include "fcntl--.h"
+#endif
+#if GNULIB_FOPEN_SAFER
+# include "stdio--.h"
+#endif
+
+#define _(str) gettext (str)
+
+/* GNU Hurd doesn't have PATH_MAX. */
+#ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# else
+# define PATH_MAX 1024
+# endif
+#endif
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+#if !GNULIB_FCNTL_SAFER
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+# undef open
+# undef close
+#endif
+
+
+/* The use of 'volatile' in the types below (and ISO C 99 section 5.1.2.3.(5))
+ ensure that while constructing or modifying the data structures, the field
+ values are written to memory in the order of the C statements. So the
+ signal handler can rely on these field values to be up to date. */
+
+
+/* Registry for a single temporary directory.
+ 'struct temp_dir' from the public header file overlaps with this. */
+struct tempdir
+{
+ /* The absolute pathname of the directory. */
+ char * volatile dirname;
+ /* Whether errors during explicit cleanup are reported to standard error. */
+ bool cleanup_verbose;
+ /* Absolute pathnames of subdirectories. */
+ gl_list_t /* <char *> */ volatile subdirs;
+ /* Absolute pathnames of files. */
+ gl_list_t /* <char *> */ volatile files;
+};
+
+/* List of all temporary directories. */
+static struct
+{
+ struct tempdir * volatile * volatile tempdir_list;
+ size_t volatile tempdir_count;
+ size_t tempdir_allocated;
+} cleanup_list /* = { NULL, 0, 0 } */;
+
+/* List of all open file descriptors to temporary files. */
+static gl_list_t /* <int> */ volatile descriptors;
+
+
+/* For the subdirs and for the files, we use a gl_list_t of type LINKEDHASH.
+ Why? We need a data structure that
+
+ 1) Can contain an arbitrary number of 'char *' values. The strings
+ are compared via strcmp, not pointer comparison.
+ 2) Has insertion and deletion operations that are fast: ideally O(1),
+ or possibly O(log n). This is important for GNU sort, which may
+ create a large number of temporary files.
+ 3) Allows iteration through all elements from within a signal handler.
+ 4) May or may not allow duplicates. It doesn't matter here, since
+ any file or subdir can only be removed once.
+
+ Criterion 1) would allow any gl_list_t or gl_oset_t implementation.
+
+ Criterion 2) leaves only GL_LINKEDHASH_LIST, GL_TREEHASH_LIST, or
+ GL_TREE_OSET.
+
+ Criterion 3) puts at disadvantage GL_TREEHASH_LIST and GL_TREE_OSET.
+ Namely, iteration through the elements of a binary tree requires access
+ to many ->left, ->right, ->parent pointers. However, the rebalancing
+ code for insertion and deletion in an AVL or red-black tree is so
+ complicated that we cannot assume that >left, ->right, ->parent pointers
+ are in a consistent state throughout these operations. Therefore, to
+ avoid a crash in the signal handler, all destructive operations to the
+ lists would have to be protected by a
+ block_fatal_signals ();
+ ...
+ unblock_fatal_signals ();
+ pair. Which causes extra system calls.
+
+ Criterion 3) would also discourage GL_ARRAY_LIST and GL_CARRAY_LIST,
+ if they were not already excluded. Namely, these implementations use
+ xrealloc(), leaving a time window in which in the list->elements pointer
+ points to already deallocated memory. To avoid a crash in the signal
+ handler at such a moment, all destructive operations would have to
+ protected by block/unblock_fatal_signals (), in this case too.
+
+ A list of type GL_LINKEDHASH_LIST without duplicates fulfills all
+ requirements:
+ 2) Insertion and deletion are O(1) on average.
+ 3) The gl_list_iterator, gl_list_iterator_next implementations do
+ not trigger memory allocations, nor other system calls, and are
+ therefore safe to be called from a signal handler.
+ Furthermore, since SIGNAL_SAFE_LIST is defined, the implementation
+ of the destructive functions ensures that the list structure is
+ safe to be traversed at any moment, even when interrupted by an
+ asynchronous signal.
+ */
+
+/* String equality and hash code functions used by the lists. */
+
+static bool
+string_equals (const void *x1, const void *x2)
+{
+ const char *s1 = (const char *) x1;
+ const char *s2 = (const char *) x2;
+ return strcmp (s1, s2) == 0;
+}
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+static size_t
+string_hash (const void *x)
+{
+ const char *s = (const char *) x;
+ size_t h = 0;
+
+ for (; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h;
+}
+
+
+/* The signal handler. It gets called asynchronously. */
+static void
+cleanup ()
+{
+ size_t i;
+
+ /* First close all file descriptors to temporary files. */
+ {
+ gl_list_t fds = descriptors;
+
+ if (fds != NULL)
+ {
+ gl_list_iterator_t iter;
+ const void *element;
+
+ iter = gl_list_iterator (fds);
+ while (gl_list_iterator_next (&iter, &element, NULL))
+ {
+ int fd = (int) (uintptr_t) element;
+ close (fd);
+ }
+ gl_list_iterator_free (&iter);
+ }
+ }
+
+ for (i = 0; i < cleanup_list.tempdir_count; i++)
+ {
+ struct tempdir *dir = cleanup_list.tempdir_list[i];
+
+ if (dir != NULL)
+ {
+ gl_list_iterator_t iter;
+ const void *element;
+
+ /* First cleanup the files in the subdirectories. */
+ iter = gl_list_iterator (dir->files);
+ while (gl_list_iterator_next (&iter, &element, NULL))
+ {
+ const char *file = (const char *) element;
+ unlink (file);
+ }
+ gl_list_iterator_free (&iter);
+
+ /* Then cleanup the subdirectories. */
+ iter = gl_list_iterator (dir->subdirs);
+ while (gl_list_iterator_next (&iter, &element, NULL))
+ {
+ const char *subdir = (const char *) element;
+ rmdir (subdir);
+ }
+ gl_list_iterator_free (&iter);
+
+ /* Then cleanup the temporary directory itself. */
+ rmdir (dir->dirname);
+ }
+ }
+}
+
+/* Create a temporary directory.
+ PREFIX is used as a prefix for the name of the temporary directory. It
+ should be short and still give an indication about the program.
+ PARENTDIR can be used to specify the parent directory; if NULL, a default
+ parent directory is used (either $TMPDIR or /tmp or similar).
+ CLEANUP_VERBOSE determines whether errors during explicit cleanup are
+ reported to standard error.
+ Return a fresh 'struct temp_dir' on success. Upon error, an error message
+ is shown and NULL is returned. */
+struct temp_dir *
+create_temp_dir (const char *prefix, const char *parentdir,
+ bool cleanup_verbose)
+{
+ struct tempdir * volatile *tmpdirp = NULL;
+ struct tempdir *tmpdir;
+ size_t i;
+ char *xtemplate;
+ char *tmpdirname;
+
+ /* See whether it can take the slot of an earlier temporary directory
+ already cleaned up. */
+ for (i = 0; i < cleanup_list.tempdir_count; i++)
+ if (cleanup_list.tempdir_list[i] == NULL)
+ {
+ tmpdirp = &cleanup_list.tempdir_list[i];
+ break;
+ }
+ if (tmpdirp == NULL)
+ {
+ /* See whether the array needs to be extended. */
+ if (cleanup_list.tempdir_count == cleanup_list.tempdir_allocated)
+ {
+ /* Note that we cannot use xrealloc(), because then the cleanup()
+ function could access an already deallocated array. */
+ struct tempdir * volatile *old_array = cleanup_list.tempdir_list;
+ size_t old_allocated = cleanup_list.tempdir_allocated;
+ size_t new_allocated = 2 * cleanup_list.tempdir_allocated + 1;
+ struct tempdir * volatile *new_array =
+ XNMALLOC (new_allocated, struct tempdir * volatile);
+
+ if (old_allocated == 0)
+ /* First use of this facility. Register the cleanup handler. */
+ at_fatal_signal (&cleanup);
+ else
+ {
+ /* Don't use memcpy() here, because memcpy takes non-volatile
+ arguments and is therefore not guaranteed to complete all
+ memory stores before the next statement. */
+ size_t k;
+
+ for (k = 0; k < old_allocated; k++)
+ new_array[k] = old_array[k];
+ }
+
+ cleanup_list.tempdir_list = new_array;
+ cleanup_list.tempdir_allocated = new_allocated;
+
+ /* Now we can free the old array. */
+ if (old_array != NULL)
+ free ((struct tempdir **) old_array);
+ }
+
+ tmpdirp = &cleanup_list.tempdir_list[cleanup_list.tempdir_count];
+ /* Initialize *tmpdirp before incrementing tempdir_count, so that
+ cleanup() will skip this entry before it is fully initialized. */
+ *tmpdirp = NULL;
+ cleanup_list.tempdir_count++;
+ }
+
+ /* Initialize a 'struct tempdir'. */
+ tmpdir = XMALLOC (struct tempdir);
+ tmpdir->dirname = NULL;
+ tmpdir->cleanup_verbose = cleanup_verbose;
+ tmpdir->subdirs = gl_list_create_empty (GL_LINKEDHASH_LIST,
+ string_equals, string_hash, NULL,
+ false);
+ tmpdir->files = gl_list_create_empty (GL_LINKEDHASH_LIST,
+ string_equals, string_hash, NULL,
+ false);
+
+ /* Create the temporary directory. */
+ xtemplate = (char *) xmalloca (PATH_MAX);
+ if (path_search (xtemplate, PATH_MAX, parentdir, prefix, parentdir == NULL))
+ {
+ error (0, errno,
+ _("cannot find a temporary directory, try setting $TMPDIR"));
+ goto quit;
+ }
+ block_fatal_signals ();
+ tmpdirname = mkdtemp (xtemplate);
+ if (tmpdirname != NULL)
+ {
+ tmpdir->dirname = tmpdirname;
+ *tmpdirp = tmpdir;
+ }
+ unblock_fatal_signals ();
+ if (tmpdirname == NULL)
+ {
+ error (0, errno,
+ _("cannot create a temporary directory using template \"%s\""),
+ xtemplate);
+ goto quit;
+ }
+ /* Replace tmpdir->dirname with a copy that has indefinite extent.
+ We cannot do this inside the block_fatal_signals/unblock_fatal_signals
+ block because then the cleanup handler would not remove the directory
+ if xstrdup fails. */
+ tmpdir->dirname = xstrdup (tmpdirname);
+ freea (xtemplate);
+ return (struct temp_dir *) tmpdir;
+
+ quit:
+ freea (xtemplate);
+ return NULL;
+}
+
+/* Register the given ABSOLUTE_FILE_NAME as being a file inside DIR, that
+ needs to be removed before DIR can be removed.
+ Should be called before the file ABSOLUTE_FILE_NAME is created. */
+void
+register_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+
+ /* Add absolute_file_name to tmpdir->files, without duplicates. */
+ if (gl_list_search (tmpdir->files, absolute_file_name) == NULL)
+ gl_list_add_first (tmpdir->files, xstrdup (absolute_file_name));
+}
+
+/* Unregister the given ABSOLUTE_FILE_NAME as being a file inside DIR, that
+ needs to be removed before DIR can be removed.
+ Should be called when the file ABSOLUTE_FILE_NAME could not be created. */
+void
+unregister_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+ gl_list_t list = tmpdir->files;
+ gl_list_node_t node;
+
+ node = gl_list_search (list, absolute_file_name);
+ if (node != NULL)
+ {
+ char *old_string = (char *) gl_list_node_value (list, node);
+
+ gl_list_remove_node (list, node);
+ free (old_string);
+ }
+}
+
+/* Register the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR,
+ that needs to be removed before DIR can be removed.
+ Should be called before the subdirectory ABSOLUTE_DIR_NAME is created. */
+void
+register_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+
+ /* Add absolute_dir_name to tmpdir->subdirs, without duplicates. */
+ if (gl_list_search (tmpdir->subdirs, absolute_dir_name) == NULL)
+ gl_list_add_first (tmpdir->subdirs, xstrdup (absolute_dir_name));
+}
+
+/* Unregister the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR,
+ that needs to be removed before DIR can be removed.
+ Should be called when the subdirectory ABSOLUTE_DIR_NAME could not be
+ created. */
+void
+unregister_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+ gl_list_t list = tmpdir->subdirs;
+ gl_list_node_t node;
+
+ node = gl_list_search (list, absolute_dir_name);
+ if (node != NULL)
+ {
+ char *old_string = (char *) gl_list_node_value (list, node);
+
+ gl_list_remove_node (list, node);
+ free (old_string);
+ }
+}
+
+/* Remove a file, with optional error message.
+ Return 0 upon success, or -1 if there was some problem. */
+static int
+do_unlink (struct temp_dir *dir, const char *absolute_file_name)
+{
+ if (unlink (absolute_file_name) < 0 && dir->cleanup_verbose
+ && errno != ENOENT)
+ {
+ error (0, errno, _("cannot remove temporary file %s"), absolute_file_name);
+ return -1;
+ }
+ return 0;
+}
+
+/* Remove a directory, with optional error message.
+ Return 0 upon success, or -1 if there was some problem. */
+static int
+do_rmdir (struct temp_dir *dir, const char *absolute_dir_name)
+{
+ if (rmdir (absolute_dir_name) < 0 && dir->cleanup_verbose
+ && errno != ENOENT)
+ {
+ error (0, errno,
+ _("cannot remove temporary directory %s"), absolute_dir_name);
+ return -1;
+ }
+ return 0;
+}
+
+/* Remove the given ABSOLUTE_FILE_NAME and unregister it.
+ Return 0 upon success, or -1 if there was some problem. */
+int
+cleanup_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name)
+{
+ int err;
+
+ err = do_unlink (dir, absolute_file_name);
+ unregister_temp_file (dir, absolute_file_name);
+
+ return err;
+}
+
+/* Remove the given ABSOLUTE_DIR_NAME and unregister it.
+ Return 0 upon success, or -1 if there was some problem. */
+int
+cleanup_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name)
+{
+ int err;
+
+ err = do_rmdir (dir, absolute_dir_name);
+ unregister_temp_subdir (dir, absolute_dir_name);
+
+ return err;
+}
+
+/* Remove all registered files and subdirectories inside DIR.
+ Return 0 upon success, or -1 if there was some problem. */
+int
+cleanup_temp_dir_contents (struct temp_dir *dir)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+ int err = 0;
+ gl_list_t list;
+ gl_list_iterator_t iter;
+ const void *element;
+ gl_list_node_t node;
+
+ /* First cleanup the files in the subdirectories. */
+ list = tmpdir->files;
+ iter = gl_list_iterator (list);
+ while (gl_list_iterator_next (&iter, &element, &node))
+ {
+ char *file = (char *) element;
+
+ err |= do_unlink (dir, file);
+ gl_list_remove_node (list, node);
+ /* Now only we can free file. */
+ free (file);
+ }
+ gl_list_iterator_free (&iter);
+
+ /* Then cleanup the subdirectories. */
+ list = tmpdir->subdirs;
+ iter = gl_list_iterator (list);
+ while (gl_list_iterator_next (&iter, &element, &node))
+ {
+ char *subdir = (char *) element;
+
+ err |= do_rmdir (dir, subdir);
+ gl_list_remove_node (list, node);
+ /* Now only we can free subdir. */
+ free (subdir);
+ }
+ gl_list_iterator_free (&iter);
+
+ return err;
+}
+
+/* Remove all registered files and subdirectories inside DIR and DIR itself.
+ DIR cannot be used any more after this call.
+ Return 0 upon success, or -1 if there was some problem. */
+int
+cleanup_temp_dir (struct temp_dir *dir)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+ int err = 0;
+ size_t i;
+
+ err |= cleanup_temp_dir_contents (dir);
+ err |= do_rmdir (dir, tmpdir->dirname);
+
+ for (i = 0; i < cleanup_list.tempdir_count; i++)
+ if (cleanup_list.tempdir_list[i] == tmpdir)
+ {
+ /* Remove cleanup_list.tempdir_list[i]. */
+ if (i + 1 == cleanup_list.tempdir_count)
+ {
+ while (i > 0 && cleanup_list.tempdir_list[i - 1] == NULL)
+ i--;
+ cleanup_list.tempdir_count = i;
+ }
+ else
+ cleanup_list.tempdir_list[i] = NULL;
+ /* Now only we can free the tmpdir->dirname and tmpdir itself. */
+ free (tmpdir->dirname);
+ free (tmpdir);
+ return err;
+ }
+
+ /* The user passed an invalid DIR argument. */
+ abort ();
+}
+
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* On Windows, opening a file with _O_TEMPORARY has the effect of passing
+ the FILE_FLAG_DELETE_ON_CLOSE flag to CreateFile(), which has the effect
+ of deleting the file when it is closed - even when the program crashes.
+ But (according to the Cygwin sources) it works only on Windows NT or newer.
+ So we cache the info whether we are running on Windows NT or newer. */
+
+static bool
+supports_delete_on_close ()
+{
+ static int known; /* 1 = yes, -1 = no, 0 = unknown */
+ if (!known)
+ {
+ OSVERSIONINFO v;
+
+ if (GetVersionEx (&v))
+ known = (v.dwPlatformId == VER_PLATFORM_WIN32_NT ? 1 : -1);
+ else
+ known = -1;
+ }
+ return (known > 0);
+}
+
+#endif
+
+
+/* Register a file descriptor to be closed. */
+static void
+register_fd (int fd)
+{
+ if (descriptors == NULL)
+ descriptors = gl_list_create_empty (GL_LINKEDHASH_LIST, NULL, NULL, NULL,
+ false);
+ gl_list_add_first (descriptors, (void *) (uintptr_t) fd);
+}
+
+/* Unregister a file descriptor to be closed. */
+static void
+unregister_fd (int fd)
+{
+ gl_list_t fds = descriptors;
+ gl_list_node_t node;
+
+ if (fds == NULL)
+ /* descriptors should already contain fd. */
+ abort ();
+ node = gl_list_search (fds, (void *) (uintptr_t) fd);
+ if (node == NULL)
+ /* descriptors should already contain fd. */
+ abort ();
+ gl_list_remove_node (fds, node);
+}
+
+/* Open a temporary file in a temporary directory.
+ Registers the resulting file descriptor to be closed. */
+int
+open_temp (const char *file_name, int flags, mode_t mode)
+{
+ int fd;
+ int saved_errno;
+
+ block_fatal_signals ();
+ /* Note: 'open' here is actually open() or open_safer(). */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Use _O_TEMPORARY when possible, to increase the chances that the
+ temporary file is removed when the process crashes. */
+ if (supports_delete_on_close ())
+ fd = open (file_name, flags | _O_TEMPORARY, mode);
+ else
+#endif
+ fd = open (file_name, flags, mode);
+ saved_errno = errno;
+ if (fd >= 0)
+ register_fd (fd);
+ unblock_fatal_signals ();
+ errno = saved_errno;
+ return fd;
+}
+
+/* Open a temporary file in a temporary directory.
+ Registers the resulting file descriptor to be closed. */
+FILE *
+fopen_temp (const char *file_name, const char *mode)
+{
+ FILE *fp;
+ int saved_errno;
+
+ block_fatal_signals ();
+ /* Note: 'fopen' here is actually fopen() or fopen_safer(). */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Use _O_TEMPORARY when possible, to increase the chances that the
+ temporary file is removed when the process crashes. */
+ if (supports_delete_on_close ())
+ {
+ size_t mode_len = strlen (mode);
+ char *augmented_mode = (char *) xmalloca (mode_len + 2);
+ memcpy (augmented_mode, mode, mode_len);
+ memcpy (augmented_mode + mode_len, "D", 2);
+
+ fp = fopen (file_name, augmented_mode);
+ saved_errno = errno;
+
+ freea (augmented_mode);
+ }
+ else
+#endif
+ {
+ fp = fopen (file_name, mode);
+ saved_errno = errno;
+ }
+ if (fp != NULL)
+ {
+ /* It is sufficient to register fileno (fp) instead of the entire fp,
+ because at cleanup time there is no need to do an fflush (fp); a
+ close (fileno (fp)) will be enough. */
+ int fd = fileno (fp);
+ if (!(fd >= 0))
+ abort ();
+ register_fd (fd);
+ }
+ unblock_fatal_signals ();
+ errno = saved_errno;
+ return fp;
+}
+
+/* Close a temporary file in a temporary directory.
+ Unregisters the previously registered file descriptor. */
+int
+close_temp (int fd)
+{
+ if (fd >= 0)
+ {
+ /* No blocking of signals is needed here, since a double close of a
+ file descriptor is harmless. */
+ int result = close (fd);
+ int saved_errno = errno;
+
+ /* No race condition here: we assume a single-threaded program, hence
+ fd cannot be re-opened here. */
+
+ unregister_fd (fd);
+
+ errno = saved_errno;
+ return result;
+ }
+ else
+ return close (fd);
+}
+
+/* Close a temporary file in a temporary directory.
+ Unregisters the previously registered file descriptor. */
+int
+fclose_temp (FILE *fp)
+{
+ int fd = fileno (fp);
+ /* No blocking of signals is needed here, since a double close of a
+ file descriptor is harmless. */
+ int result = fclose (fp);
+ int saved_errno = errno;
+
+ /* No race condition here: we assume a single-threaded program, hence
+ fd cannot be re-opened here. */
+
+ unregister_fd (fd);
+
+ errno = saved_errno;
+ return result;
+}
+
+#if GNULIB_FWRITEERROR
+/* Like fwriteerror.
+ Unregisters the previously registered file descriptor. */
+int
+fwriteerror_temp (FILE *fp)
+{
+ int fd = fileno (fp);
+ /* No blocking of signals is needed here, since a double close of a
+ file descriptor is harmless. */
+ int result = fwriteerror (fp);
+ int saved_errno = errno;
+
+ /* No race condition here: we assume a single-threaded program, hence
+ fd cannot be re-opened here. */
+
+ unregister_fd (fd);
+
+ errno = saved_errno;
+ return result;
+}
+#endif
+
+#if GNULIB_CLOSE_STREAM
+/* Like close_stream.
+ Unregisters the previously registered file descriptor. */
+int
+close_stream_temp (FILE *fp)
+{
+ int fd = fileno (fp);
+ /* No blocking of signals is needed here, since a double close of a
+ file descriptor is harmless. */
+ int result = close_stream (fp);
+ int saved_errno = errno;
+
+ /* No race condition here: we assume a single-threaded program, hence
+ fd cannot be re-opened here. */
+
+ unregister_fd (fd);
+
+ errno = saved_errno;
+ return result;
+}
+#endif
diff --git a/gnulib/lib/clean-temp.h b/gnulib/lib/clean-temp.h
new file mode 100644
index 00000000..03a52493
--- /dev/null
+++ b/gnulib/lib/clean-temp.h
@@ -0,0 +1,133 @@
+/* Temporary directories and temporary files with automatic cleanup.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _CLEAN_TEMP_H
+#define _CLEAN_TEMP_H
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Temporary directories and temporary files should be automatically removed
+ when the program exits either normally or through a fatal signal. We can't
+ rely on the "unlink before close" idiom, because it works only on Unix and
+ also - if no signal blocking is used - leaves a time window where a fatal
+ signal would not clean up the temporary file.
+
+ Also, open file descriptors need to be closed before the temporary files
+ and the temporary directories can be removed, because only on Unix
+ (excluding Cygwin) can one remove directories containing open files.
+
+ This module provides support for temporary directories and temporary files
+ inside these temporary directories. Temporary files without temporary
+ directories are not supported here. */
+
+struct temp_dir
+{
+ /* The absolute pathname of the directory. */
+ const char * const dir_name;
+ /* Whether errors during explicit cleanup are reported to standard error. */
+ bool cleanup_verbose;
+ /* More fields are present here, but not public. */
+};
+
+/* Create a temporary directory.
+ PREFIX is used as a prefix for the name of the temporary directory. It
+ should be short and still give an indication about the program.
+ PARENTDIR can be used to specify the parent directory; if NULL, a default
+ parent directory is used (either $TMPDIR or /tmp or similar).
+ CLEANUP_VERBOSE determines whether errors during explicit cleanup are
+ reported to standard error.
+ Return a fresh 'struct temp_dir' on success. Upon error, an error message
+ is shown and NULL is returned. */
+extern struct temp_dir * create_temp_dir (const char *prefix,
+ const char *parentdir,
+ bool cleanup_verbose);
+
+/* Register the given ABSOLUTE_FILE_NAME as being a file inside DIR, that
+ needs to be removed before DIR can be removed.
+ Should be called before the file ABSOLUTE_FILE_NAME is created. */
+extern void register_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name);
+
+/* Unregister the given ABSOLUTE_FILE_NAME as being a file inside DIR, that
+ needs to be removed before DIR can be removed.
+ Should be called when the file ABSOLUTE_FILE_NAME could not be created. */
+extern void unregister_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name);
+
+/* Register the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR,
+ that needs to be removed before DIR can be removed.
+ Should be called before the subdirectory ABSOLUTE_DIR_NAME is created. */
+extern void register_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name);
+
+/* Unregister the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR,
+ that needs to be removed before DIR can be removed.
+ Should be called when the subdirectory ABSOLUTE_DIR_NAME could not be
+ created. */
+extern void unregister_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name);
+
+/* Remove the given ABSOLUTE_FILE_NAME and unregister it.
+ Return 0 upon success, or -1 if there was some problem. */
+extern int cleanup_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name);
+
+/* Remove the given ABSOLUTE_DIR_NAME and unregister it.
+ Return 0 upon success, or -1 if there was some problem. */
+extern int cleanup_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name);
+
+/* Remove all registered files and subdirectories inside DIR.
+ Return 0 upon success, or -1 if there was some problem. */
+extern int cleanup_temp_dir_contents (struct temp_dir *dir);
+
+/* Remove all registered files and subdirectories inside DIR and DIR itself.
+ DIR cannot be used any more after this call.
+ Return 0 upon success, or -1 if there was some problem. */
+extern int cleanup_temp_dir (struct temp_dir *dir);
+
+/* Open a temporary file in a temporary directory.
+ Registers the resulting file descriptor to be closed. */
+extern int open_temp (const char *file_name, int flags, mode_t mode);
+extern FILE * fopen_temp (const char *file_name, const char *mode);
+
+/* Close a temporary file in a temporary directory.
+ Unregisters the previously registered file descriptor. */
+extern int close_temp (int fd);
+extern int fclose_temp (FILE *fp);
+
+/* Like fwriteerror.
+ Unregisters the previously registered file descriptor. */
+extern int fwriteerror_temp (FILE *fp);
+
+/* Like close_stream.
+ Unregisters the previously registered file descriptor. */
+extern int close_stream_temp (FILE *fp);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CLEAN_TEMP_H */
diff --git a/gnulib/lib/cloexec.c b/gnulib/lib/cloexec.c
new file mode 100644
index 00000000..2d12efef
--- /dev/null
+++ b/gnulib/lib/cloexec.c
@@ -0,0 +1,83 @@
+/* closexec.c - set or clear the close-on-exec descriptor flag
+
+ Copyright (C) 1991, 2004-2006, 2009-2010 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/>.
+
+ The code is taken from glibc/manual/llio.texi */
+
+#include <config.h>
+
+#include "cloexec.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Set the `FD_CLOEXEC' flag of DESC if VALUE is true,
+ or clear the flag if VALUE is false.
+ Return 0 on success, or -1 on error with `errno' set.
+
+ Note that on MingW, this function does NOT protect DESC from being
+ inherited into spawned children. Instead, either use dup_cloexec
+ followed by closing the original DESC, or use interfaces such as
+ open or pipe2 that accept flags like O_CLOEXEC to create DESC
+ non-inheritable in the first place. */
+
+int
+set_cloexec_flag (int desc, bool value)
+{
+#ifdef F_SETFD
+
+ int flags = fcntl (desc, F_GETFD, 0);
+
+ if (0 <= flags)
+ {
+ int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
+
+ if (flags == newflags
+ || fcntl (desc, F_SETFD, newflags) != -1)
+ return 0;
+ }
+
+ return -1;
+
+#else /* !F_SETFD */
+
+ /* Use dup2 to reject invalid file descriptors; the cloexec flag
+ will be unaffected. */
+ if (desc < 0)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (dup2 (desc, desc) < 0)
+ /* errno is EBADF here. */
+ return -1;
+
+ /* There is nothing we can do on this kind of platform. Punt. */
+ return 0;
+#endif /* !F_SETFD */
+}
+
+
+/* Duplicates a file handle FD, while marking the copy to be closed
+ prior to exec or spawn. Returns -1 and sets errno if FD could not
+ be duplicated. */
+
+int
+dup_cloexec (int fd)
+{
+ return fcntl (fd, F_DUPFD_CLOEXEC, 0);
+}
diff --git a/gnulib/lib/cloexec.h b/gnulib/lib/cloexec.h
new file mode 100644
index 00000000..e3a2cb85
--- /dev/null
+++ b/gnulib/lib/cloexec.h
@@ -0,0 +1,38 @@
+/* closexec.c - set or clear the close-on-exec descriptor flag
+
+ Copyright (C) 2004, 2009-2010 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/>.
+
+*/
+
+#include <stdbool.h>
+
+/* Set the `FD_CLOEXEC' flag of DESC if VALUE is true,
+ or clear the flag if VALUE is false.
+ Return 0 on success, or -1 on error with `errno' set.
+
+ Note that on MingW, this function does NOT protect DESC from being
+ inherited into spawned children. Instead, either use dup_cloexec
+ followed by closing the original DESC, or use interfaces such as
+ open or pipe2 that accept flags like O_CLOEXEC to create DESC
+ non-inheritable in the first place. */
+
+int set_cloexec_flag (int desc, bool value);
+
+/* Duplicates a file handle FD, while marking the copy to be closed
+ prior to exec or spawn. Returns -1 and sets errno if FD could not
+ be duplicated. */
+
+int dup_cloexec (int fd);
diff --git a/gnulib/lib/close-hook.c b/gnulib/lib/close-hook.c
new file mode 100644
index 00000000..15d67fb6
--- /dev/null
+++ b/gnulib/lib/close-hook.c
@@ -0,0 +1,91 @@
+/* Hook for making the close() function extensible.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "close-hook.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#undef close
+
+
+/* Currently, this entire code is only needed for the handling of sockets
+ on native Windows platforms. */
+#if WINDOWS_SOCKETS
+
+/* The first and last link in the doubly linked list.
+ Initially the list is empty. */
+static struct close_hook anchor = { &anchor, &anchor, NULL };
+
+int
+execute_close_hooks (int fd, const struct close_hook *remaining_list)
+{
+ if (remaining_list == &anchor)
+ /* End of list reached. */
+ return close (fd);
+ else
+ return remaining_list->private_fn (fd, remaining_list->private_next);
+}
+
+int
+execute_all_close_hooks (int fd)
+{
+ return execute_close_hooks (fd, anchor.private_next);
+}
+
+void
+register_close_hook (close_hook_fn hook, struct close_hook *link)
+{
+ if (link->private_next == NULL && link->private_prev == NULL)
+ {
+ /* Add the link to the doubly linked list. */
+ link->private_next = anchor.private_next;
+ link->private_prev = &anchor;
+ link->private_fn = hook;
+ anchor.private_next->private_prev = link;
+ anchor.private_next = link;
+ }
+ else
+ {
+ /* The link is already in use. */
+ if (link->private_fn != hook)
+ abort ();
+ }
+}
+
+void
+unregister_close_hook (struct close_hook *link)
+{
+ struct close_hook *next = link->private_next;
+ struct close_hook *prev = link->private_prev;
+
+ if (next != NULL && prev != NULL)
+ {
+ /* The link is in use. Remove it from the doubly linked list. */
+ prev->private_next = next;
+ next->private_prev = prev;
+ /* Clear the link, to mark it unused. */
+ link->private_next = NULL;
+ link->private_prev = NULL;
+ link->private_fn = NULL;
+ }
+}
+
+#endif
diff --git a/gnulib/lib/close-hook.h b/gnulib/lib/close-hook.h
new file mode 100644
index 00000000..aff57574
--- /dev/null
+++ b/gnulib/lib/close-hook.h
@@ -0,0 +1,72 @@
+/* Hook for making the close() function extensible.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifndef CLOSE_HOOK_H
+#define CLOSE_HOOK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Currently, this entire code is only needed for the handling of sockets
+ on native Windows platforms. */
+#if WINDOWS_SOCKETS
+
+
+/* An element of the list of close hooks.
+ The fields of this structure are considered private. */
+struct close_hook
+{
+ /* Doubly linked list. */
+ struct close_hook *private_next;
+ struct close_hook *private_prev;
+ /* Function that treats the types of FD that it knows about and calls
+ execute_close_hooks (FD, REMAINING_LIST) as a fallback. */
+ int (*private_fn) (int fd, const struct close_hook *remaining_list);
+};
+
+/* This type of function closes FD, applying special knowledge for the FD
+ types it knows about, and calls execute_close_hooks (FD, REMAINING_LIST)
+ for the other FD types. */
+typedef int (*close_hook_fn) (int fd, const struct close_hook *remaining_list);
+
+/* Execute the close hooks in REMAINING_LIST.
+ Return 0 or -1, like close() would do. */
+extern int execute_close_hooks (int fd, const struct close_hook *remaining_list);
+
+/* Execute all close hooks.
+ Return 0 or -1, like close() would do. */
+extern int execute_all_close_hooks (int fd);
+
+/* Add a function to the list of close hooks.
+ The LINK variable points to a piece of memory which is guaranteed to be
+ accessible until the corresponding call to unregister_close_hook. */
+extern void register_close_hook (close_hook_fn hook, struct close_hook *link);
+
+/* Removes a function from the list of close hooks. */
+extern void unregister_close_hook (struct close_hook *link);
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CLOSE_HOOK_H */
diff --git a/gnulib/lib/close-stream.c b/gnulib/lib/close-stream.c
new file mode 100644
index 00000000..cf0422f3
--- /dev/null
+++ b/gnulib/lib/close-stream.c
@@ -0,0 +1,78 @@
+/* Close a stream, with nicer error checking than fclose's.
+
+ Copyright (C) 1998-2002, 2004, 2006-2010 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/>. */
+
+#include <config.h>
+
+#include "close-stream.h"
+
+#include <errno.h>
+#include <stdbool.h>
+
+#include "fpending.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Close STREAM. Return 0 if successful, EOF (setting errno)
+ otherwise. A failure might set errno to 0 if the error number
+ cannot be determined.
+
+ A failure with errno set to EPIPE may or may not indicate an error
+ situation worth signaling to the user. See the documentation of the
+ close_stdout_set_ignore_EPIPE function for details.
+
+ If a program writes *anything* to STREAM, that program should close
+ STREAM and make sure that it succeeds before exiting. Otherwise,
+ suppose that you go to the extreme of checking the return status
+ of every function that does an explicit write to STREAM. The last
+ printf can succeed in writing to the internal stream buffer, and yet
+ the fclose(STREAM) could still fail (due e.g., to a disk full error)
+ when it tries to write out that buffered data. Thus, you would be
+ left with an incomplete output file and the offending program would
+ exit successfully. Even calling fflush is not always sufficient,
+ since some file systems (NFS and CODA) buffer written/flushed data
+ until an actual close call.
+
+ Besides, it's wasteful to check the return value from every call
+ that writes to STREAM -- just let the internal stream state record
+ the failure. That's what the ferror test is checking below. */
+
+int
+close_stream (FILE *stream)
+{
+ bool some_pending = (__fpending (stream) != 0);
+ bool prev_fail = (ferror (stream) != 0);
+ bool fclose_fail = (fclose (stream) != 0);
+
+ /* Return an error indication if there was a previous failure or if
+ fclose failed, with one exception: ignore an fclose failure if
+ there was no previous error, no data remains to be flushed, and
+ fclose failed with EBADF. That can happen when a program like cp
+ is invoked like this `cp a b >&-' (i.e., with standard output
+ closed) and doesn't generate any output (hence no previous error
+ and nothing to be flushed). */
+
+ if (prev_fail || (fclose_fail && (some_pending || errno != EBADF)))
+ {
+ if (! fclose_fail)
+ errno = 0;
+ return EOF;
+ }
+
+ return 0;
+}
diff --git a/gnulib/lib/close-stream.h b/gnulib/lib/close-stream.h
new file mode 100644
index 00000000..be3d4196
--- /dev/null
+++ b/gnulib/lib/close-stream.h
@@ -0,0 +1,2 @@
+#include <stdio.h>
+int close_stream (FILE *stream);
diff --git a/gnulib/lib/close.c b/gnulib/lib/close.c
new file mode 100644
index 00000000..afa8f640
--- /dev/null
+++ b/gnulib/lib/close.c
@@ -0,0 +1,42 @@
+/* close replacement.
+ Copyright (C) 2008-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include "close-hook.h"
+
+/* Override close() to call into other gnulib modules. */
+
+int
+rpl_close (int fd)
+#undef close
+{
+#if WINDOWS_SOCKETS
+ int retval = execute_all_close_hooks (fd);
+#else
+ int retval = close (fd);
+#endif
+
+#if REPLACE_FCHDIR
+ if (retval >= 0)
+ _gl_unregister_fd (fd);
+#endif
+
+ return retval;
+}
diff --git a/gnulib/lib/closein.c b/gnulib/lib/closein.c
new file mode 100644
index 00000000..077a3247
--- /dev/null
+++ b/gnulib/lib/closein.c
@@ -0,0 +1,111 @@
+/* Close standard input, rewinding seekable stdin if necessary.
+
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include "closein.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "close-stream.h"
+#include "closeout.h"
+#include "error.h"
+#include "exitfail.h"
+#include "freadahead.h"
+#include "quotearg.h"
+
+static const char *file_name;
+
+/* Set the file name to be reported in the event an error is detected
+ on stdin by close_stdin. See also close_stdout_set_file_name, if
+ an error is detected when closing stdout. */
+void
+close_stdin_set_file_name (const char *file)
+{
+ file_name = file;
+}
+
+/* Close standard input, rewinding any unused input if stdin is
+ seekable. On error, issue a diagnostic and _exit with status
+ 'exit_failure'. Then call close_stdout.
+
+ Most programs can get by with close_stdout. close_stdin is only
+ needed when a program wants to guarantee that partially read input
+ from seekable stdin is not consumed, for any subsequent clients.
+ For example, POSIX requires that these two commands behave alike:
+
+ (sed -ne 1q; cat) < file
+ tail -n 1 file
+
+ Since close_stdin is commonly registered via 'atexit', POSIX
+ and the C standard both say that it should not call 'exit',
+ because the behavior is undefined if 'exit' is called more than
+ once. So it calls '_exit' instead of 'exit'. If close_stdin
+ is registered via atexit before other functions are registered,
+ the other functions can act before this _exit is invoked.
+
+ Applications that use close_stdout should flush any streams other
+ than stdin, stdout, and stderr before exiting, since the call to
+ _exit will bypass other buffer flushing. Applications should be
+ flushing and closing other streams anyway, to check for I/O errors.
+ Also, applications should not use tmpfile, since _exit can bypass
+ the removal of these files.
+
+ It's important to detect such failures and exit nonzero because many
+ tools (most notably `make' and other build-management systems) depend
+ on being able to detect failure in other tools via their exit status. */
+
+void
+close_stdin (void)
+{
+ bool fail = false;
+
+ /* There is no need to flush stdin if we can determine quickly that stdin's
+ input buffer is empty; in this case we know that if stdin is seekable,
+ fseeko (stdin, 0, SEEK_CUR) == lseek (0, 0, SEEK_CUR). */
+ if (freadahead (stdin) > 0)
+ {
+ /* Only attempt flush if stdin is seekable, as fflush is entitled to
+ fail on non-seekable streams. */
+ if (fseeko (stdin, 0, SEEK_CUR) == 0 && fflush (stdin) != 0)
+ fail = true;
+ }
+ if (close_stream (stdin) != 0)
+ fail = true;
+ if (fail)
+ {
+ /* Report failure, but defer exit until after closing stdout,
+ since the failure report should still be flushed. */
+ char const *close_error = _("error closing file");
+ if (file_name)
+ error (0, errno, "%s: %s", quotearg_colon (file_name),
+ close_error);
+ else
+ error (0, errno, "%s", close_error);
+ }
+
+ close_stdout ();
+
+ if (fail)
+ _exit (exit_failure);
+}
diff --git a/gnulib/lib/closein.h b/gnulib/lib/closein.h
new file mode 100644
index 00000000..20e97521
--- /dev/null
+++ b/gnulib/lib/closein.h
@@ -0,0 +1,32 @@
+/* Close standard input, rewinding seekable stdin if necessary.
+
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#ifndef _GL_CLOSEIN_H
+# define _GL_CLOSEIN_H 1
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+void close_stdin_set_file_name (const char *file);
+void close_stdin (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/closeout.c b/gnulib/lib/closeout.c
new file mode 100644
index 00000000..18a8912d
--- /dev/null
+++ b/gnulib/lib/closeout.c
@@ -0,0 +1,124 @@
+/* Close standard output and standard error, exiting with a diagnostic on error.
+
+ Copyright (C) 1998-2002, 2004, 2006, 2008-2010 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/>. */
+
+#include <config.h>
+
+#include "closeout.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "close-stream.h"
+#include "error.h"
+#include "exitfail.h"
+#include "quotearg.h"
+
+static const char *file_name;
+
+/* Set the file name to be reported in the event an error is detected
+ by close_stdout. */
+void
+close_stdout_set_file_name (const char *file)
+{
+ file_name = file;
+}
+
+static bool ignore_EPIPE /* = false */;
+
+/* Specify the reaction to an EPIPE error during the closing of stdout:
+ - If ignore = true, it shall be ignored.
+ - If ignore = false, it shall evoke a diagnostic, along with a nonzero
+ exit status.
+ The default is ignore = false.
+
+ This setting matters only if the SIGPIPE signal is ignored (i.e. its
+ handler set to SIG_IGN) or blocked. Only particular programs need to
+ temporarily ignore SIGPIPE. If SIGPIPE is ignored or blocked because
+ it was ignored or blocked in the parent process when it created the
+ child process, it usually is a bug in the parent process: It is bad
+ practice to have SIGPIPE ignored or blocked while creating a child
+ process.
+
+ EPIPE occurs when writing to a pipe or socket that has no readers now,
+ when SIGPIPE is ignored or blocked.
+
+ The ignore = false setting is suitable for a scenario where it is normally
+ guaranteed that the pipe writer terminates before the pipe reader. In
+ this case, an EPIPE is an indication of a premature termination of the
+ pipe reader and should lead to a diagnostic and a nonzero exit status.
+
+ The ignore = true setting is suitable for a scenario where you don't know
+ ahead of time whether the pipe writer or the pipe reader will terminate
+ first. In this case, an EPIPE is an indication that the pipe writer can
+ stop doing useless write() calls; this is what close_stdout does anyway.
+ EPIPE is part of the normal pipe/socket shutdown protocol in this case,
+ and should not lead to a diagnostic message. */
+
+void
+close_stdout_set_ignore_EPIPE (bool ignore)
+{
+ ignore_EPIPE = ignore;
+}
+
+/* Close standard output. On error, issue a diagnostic and _exit
+ with status 'exit_failure'.
+
+ Also close standard error. On error, _exit with status 'exit_failure'.
+
+ Since close_stdout is commonly registered via 'atexit', POSIX
+ and the C standard both say that it should not call 'exit',
+ because the behavior is undefined if 'exit' is called more than
+ once. So it calls '_exit' instead of 'exit'. If close_stdout
+ is registered via atexit before other functions are registered,
+ the other functions can act before this _exit is invoked.
+
+ Applications that use close_stdout should flush any streams
+ other than stdout and stderr before exiting, since the call to
+ _exit will bypass other buffer flushing. Applications should
+ be flushing and closing other streams anyway, to check for I/O
+ errors. Also, applications should not use tmpfile, since _exit
+ can bypass the removal of these files.
+
+ It's important to detect such failures and exit nonzero because many
+ tools (most notably `make' and other build-management systems) depend
+ on being able to detect failure in other tools via their exit status. */
+
+void
+close_stdout (void)
+{
+ if (close_stream (stdout) != 0
+ && !(ignore_EPIPE && errno == EPIPE))
+ {
+ char const *write_error = _("write error");
+ if (file_name)
+ error (0, errno, "%s: %s", quotearg_colon (file_name),
+ write_error);
+ else
+ error (0, errno, "%s", write_error);
+
+ _exit (exit_failure);
+ }
+
+ if (close_stream (stderr) != 0)
+ _exit (exit_failure);
+}
diff --git a/gnulib/lib/closeout.h b/gnulib/lib/closeout.h
new file mode 100644
index 00000000..475f95e6
--- /dev/null
+++ b/gnulib/lib/closeout.h
@@ -0,0 +1,36 @@
+/* Close standard output and standard error.
+
+ Copyright (C) 1998, 2000, 2003-2004, 2006, 2008-2010 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/>. */
+
+#ifndef CLOSEOUT_H
+# define CLOSEOUT_H 1
+
+# include <stdbool.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+void close_stdout_set_file_name (const char *file);
+void close_stdout_set_ignore_EPIPE (bool ignore);
+void close_stdout (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/concat-filename.c b/gnulib/lib/concat-filename.c
new file mode 100644
index 00000000..32e9515a
--- /dev/null
+++ b/gnulib/lib/concat-filename.c
@@ -0,0 +1,73 @@
+/* Construct a full filename from a directory and a relative filename.
+ Copyright (C) 2001-2004, 2006-2010 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 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/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "concat-filename.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "filename.h"
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. The directory may end with the directory separator. The second
+ argument may not start with the directory separator (it is relative).
+ Return a freshly allocated filename. Return NULL and set errno
+ upon memory allocation failure. */
+char *
+concatenated_filename (const char *directory, const char *filename,
+ const char *suffix)
+{
+ char *result;
+ char *p;
+
+ if (strcmp (directory, ".") == 0)
+ {
+ /* No need to prepend the directory. */
+ result = (char *) malloc (strlen (filename)
+ + (suffix != NULL ? strlen (suffix) : 0)
+ + 1);
+ if (result == NULL)
+ return NULL; /* errno is set here */
+ p = result;
+ }
+ else
+ {
+ size_t directory_len = strlen (directory);
+ int need_slash =
+ (directory_len > FILE_SYSTEM_PREFIX_LEN (directory)
+ && !ISSLASH (directory[directory_len - 1]));
+ result = (char *) malloc (directory_len + need_slash
+ + strlen (filename)
+ + (suffix != NULL ? strlen (suffix) : 0)
+ + 1);
+ if (result == NULL)
+ return NULL; /* errno is set here */
+ memcpy (result, directory, directory_len);
+ p = result + directory_len;
+ if (need_slash)
+ *p++ = '/';
+ }
+ p = stpcpy (p, filename);
+ if (suffix != NULL)
+ stpcpy (p, suffix);
+ return result;
+}
diff --git a/gnulib/lib/concat-filename.h b/gnulib/lib/concat-filename.h
new file mode 100644
index 00000000..e6c958d1
--- /dev/null
+++ b/gnulib/lib/concat-filename.h
@@ -0,0 +1,41 @@
+/* Construct a full filename from a directory and a relative filename.
+ Copyright (C) 2001-2004, 2007-2010 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/>. */
+
+#ifndef _CONCAT_FILENAME_H
+#define _CONCAT_FILENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. Return a freshly allocated filename. Return NULL and set errno
+ upon memory allocation failure. */
+extern char *concatenated_filename (const char *directory,
+ const char *filename, const char *suffix);
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. Return a freshly allocated filename. */
+extern char *xconcatenated_filename (const char *directory,
+ const char *filename, const char *suffix);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CONCAT_FILENAME_H */
diff --git a/gnulib/lib/config.charset b/gnulib/lib/config.charset
new file mode 100644
index 00000000..1336723e
--- /dev/null
+++ b/gnulib/lib/config.charset
@@ -0,0 +1,683 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+# Copyright (C) 2000-2004, 2006-2010 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 2, 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, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# The table consists of lines of the form
+# ALIAS CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+# name MIME? used by which systems
+# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin
+# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin
+# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin
+# ISO-8859-3 Y glibc solaris
+# ISO-8859-4 Y osf solaris freebsd netbsd openbsd darwin
+# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin
+# ISO-8859-6 Y glibc aix hpux solaris
+# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd openbsd darwin
+# ISO-8859-8 Y glibc aix hpux osf solaris
+# ISO-8859-9 Y glibc aix hpux irix osf solaris darwin
+# ISO-8859-13 glibc netbsd openbsd darwin
+# ISO-8859-14 glibc
+# ISO-8859-15 glibc aix osf solaris freebsd netbsd openbsd darwin
+# KOI8-R Y glibc solaris freebsd netbsd openbsd darwin
+# KOI8-U Y glibc freebsd netbsd openbsd darwin
+# KOI8-T glibc
+# CP437 dos
+# CP775 dos
+# CP850 aix osf dos
+# CP852 dos
+# CP855 dos
+# CP856 aix
+# CP857 dos
+# CP861 dos
+# CP862 dos
+# CP864 dos
+# CP865 dos
+# CP866 freebsd netbsd openbsd darwin dos
+# CP869 dos
+# CP874 woe32 dos
+# CP922 aix
+# CP932 aix woe32 dos
+# CP943 aix
+# CP949 osf darwin woe32 dos
+# CP950 woe32 dos
+# CP1046 aix
+# CP1124 aix
+# CP1125 dos
+# CP1129 aix
+# CP1131 darwin
+# CP1250 woe32
+# CP1251 glibc solaris netbsd openbsd darwin woe32
+# CP1252 aix woe32
+# CP1253 woe32
+# CP1254 woe32
+# CP1255 glibc woe32
+# CP1256 woe32
+# CP1257 woe32
+# GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin
+# EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# EUC-TW glibc aix hpux irix osf solaris netbsd
+# BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin
+# BIG5-HKSCS glibc solaris darwin
+# GBK glibc aix osf solaris darwin woe32 dos
+# GB18030 glibc solaris netbsd darwin
+# SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin
+# JOHAB glibc solaris woe32
+# TIS-620 glibc aix hpux osf solaris
+# VISCII Y glibc
+# TCVN5712-1 glibc
+# ARMSCII-8 glibc darwin
+# GEORGIAN-PS glibc
+# PT154 glibc
+# HP-ROMAN8 hpux
+# HP-ARABIC8 hpux
+# HP-GREEK8 hpux
+# HP-HEBREW8 hpux
+# HP-TURKISH8 hpux
+# HP-KANA8 hpux
+# DEC-KANJI osf
+# DEC-HANYU osf
+# UTF-8 Y glibc aix hpux osf solaris netbsd darwin
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+ linux-gnulibc1*)
+ # Linux libc5 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ echo "POSIX ASCII"
+ for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \
+ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \
+ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \
+ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \
+ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \
+ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \
+ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \
+ sv_FI sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.iso-8859-1 ISO-8859-1"
+ echo "$l.iso-8859-15 ISO-8859-15"
+ echo "$l.iso-8859-15@euro ISO-8859-15"
+ echo "$l@euro ISO-8859-15"
+ echo "$l.cp-437 CP437"
+ echo "$l.cp-850 CP850"
+ echo "$l.cp-1252 CP1252"
+ echo "$l.cp-1252@euro CP1252"
+ #echo "$l.atari-st ATARI-ST" # not a commonly used encoding
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \
+ sl_SI sr sr_CS sr_YU; do
+ echo "$l ISO-8859-2"
+ echo "$l.iso-8859-2 ISO-8859-2"
+ echo "$l.cp-852 CP852"
+ echo "$l.cp-1250 CP1250"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in mk mk_MK ru ru_RU; do
+ echo "$l ISO-8859-5"
+ echo "$l.iso-8859-5 ISO-8859-5"
+ echo "$l.koi8-r KOI8-R"
+ echo "$l.cp-866 CP866"
+ echo "$l.cp-1251 CP1251"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in ar ar_SA; do
+ echo "$l ISO-8859-6"
+ echo "$l.iso-8859-6 ISO-8859-6"
+ echo "$l.cp-864 CP864"
+ #echo "$l.cp-868 CP868" # not a commonly used encoding
+ echo "$l.cp-1256 CP1256"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in el el_GR gr gr_GR; do
+ echo "$l ISO-8859-7"
+ echo "$l.iso-8859-7 ISO-8859-7"
+ echo "$l.cp-869 CP869"
+ echo "$l.cp-1253 CP1253"
+ echo "$l.cp-1253@euro CP1253"
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in he he_IL iw iw_IL; do
+ echo "$l ISO-8859-8"
+ echo "$l.iso-8859-8 ISO-8859-8"
+ echo "$l.cp-862 CP862"
+ echo "$l.cp-1255 CP1255"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in tr tr_TR; do
+ echo "$l ISO-8859-9"
+ echo "$l.iso-8859-9 ISO-8859-9"
+ echo "$l.cp-857 CP857"
+ echo "$l.cp-1254 CP1254"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in lt lt_LT lv lv_LV; do
+ #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name
+ echo "$l ISO-8859-13"
+ done
+ for l in ru_UA uk uk_UA; do
+ echo "$l KOI8-U"
+ done
+ for l in zh zh_CN; do
+ #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name
+ echo "$l GB2312"
+ done
+ for l in ja ja_JP ja_JP.EUC; do
+ echo "$l EUC-JP"
+ done
+ for l in ko ko_KR; do
+ echo "$l EUC-KR"
+ done
+ for l in th th_TH; do
+ echo "$l TIS-620"
+ done
+ for l in fa fa_IR; do
+ #echo "$l ISIRI-3342" # a broken encoding
+ echo "$l.utf-8 UTF-8"
+ done
+ ;;
+ linux* | *-gnu*)
+ # With glibc-2.1 or newer, we don't need any canonicalization,
+ # because glibc has iconv and both glibc and libiconv support all
+ # GNU canonical names directly. Therefore, the Makefile does not
+ # need to install the alias file at all.
+ # The following applies only to glibc-2.0.x and older libcs.
+ echo "ISO_646.IRV:1983 ASCII"
+ ;;
+ aix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "IBM-850 CP850"
+ echo "IBM-856 CP856"
+ echo "IBM-921 ISO-8859-13"
+ echo "IBM-922 CP922"
+ echo "IBM-932 CP932"
+ echo "IBM-943 CP943"
+ echo "IBM-1046 CP1046"
+ echo "IBM-1124 CP1124"
+ echo "IBM-1129 CP1129"
+ echo "IBM-1252 CP1252"
+ echo "IBM-eucCN GB2312"
+ echo "IBM-eucJP EUC-JP"
+ echo "IBM-eucKR EUC-KR"
+ echo "IBM-eucTW EUC-TW"
+ echo "big5 BIG5"
+ echo "GBK GBK"
+ echo "TIS-620 TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ hpux*)
+ echo "iso88591 ISO-8859-1"
+ echo "iso88592 ISO-8859-2"
+ echo "iso88595 ISO-8859-5"
+ echo "iso88596 ISO-8859-6"
+ echo "iso88597 ISO-8859-7"
+ echo "iso88598 ISO-8859-8"
+ echo "iso88599 ISO-8859-9"
+ echo "iso885915 ISO-8859-15"
+ echo "roman8 HP-ROMAN8"
+ echo "arabic8 HP-ARABIC8"
+ echo "greek8 HP-GREEK8"
+ echo "hebrew8 HP-HEBREW8"
+ echo "turkish8 HP-TURKISH8"
+ echo "kana8 HP-KANA8"
+ echo "tis620 TIS-620"
+ echo "big5 BIG5"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "hp15CN GB2312"
+ #echo "ccdc ?" # what is this?
+ echo "SJIS SHIFT_JIS"
+ echo "utf8 UTF-8"
+ ;;
+ irix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ ;;
+ osf*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "cp850 CP850"
+ echo "big5 BIG5"
+ echo "dechanyu DEC-HANYU"
+ echo "dechanzi GB2312"
+ echo "deckanji DEC-KANJI"
+ echo "deckorean EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "GBK GBK"
+ echo "KSC5601 CP949"
+ echo "sdeckanji EUC-JP"
+ echo "SJIS SHIFT_JIS"
+ echo "TACTIS TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ solaris*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-3 ISO-8859-3"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "koi8-r KOI8-R"
+ echo "ansi-1251 CP1251"
+ echo "BIG5 BIG5"
+ echo "Big5-HKSCS BIG5-HKSCS"
+ echo "gb2312 GB2312"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "cns11643 EUC-TW"
+ echo "5601 EUC-KR"
+ echo "ko_KR.johap92 JOHAB"
+ echo "eucJP EUC-JP"
+ echo "PCK SHIFT_JIS"
+ echo "TIS620.2533 TIS-620"
+ #echo "sun_eu_greek ?" # what is this?
+ echo "UTF-8 UTF-8"
+ ;;
+ freebsd* | os2*)
+ # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+ # reuse FreeBSD's locale data for OS/2.
+ echo "C ASCII"
+ echo "US-ASCII ASCII"
+ for l in la_LN lt_LN; do
+ echo "$l.ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+ echo "$l.ISO_8859-1 ISO-8859-1"
+ echo "$l.DIS_8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+ echo "$l.ISO_8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO_8859-4 ISO-8859-4"
+ done
+ for l in ru_RU ru_SU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO_8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ja_JP.Shift_JIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ netbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "BIG5 BIG5"
+ echo "SJIS SHIFT_JIS"
+ ;;
+ openbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ ;;
+ darwin[56]*)
+ # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ for l in en_AU en_CA en_GB en_US la_LN; do
+ echo "$l.US-ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \
+ nl_NL no_NO pt_PT sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in la_LN; do
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do
+ echo "$l.ISO8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO8859-4 ISO-8859-4"
+ done
+ for l in ru_RU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ for l in bg_BG; do
+ echo "$l.CP1251 CP1251"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ darwin*)
+ # Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is
+ # useless:
+ # - It returns the empty string when LANG is set to a locale of the
+ # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8
+ # LC_CTYPE file.
+ # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by
+ # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case.
+ # - The documentation says:
+ # "... all code that calls BSD system routines should ensure
+ # that the const *char parameters of these routines are in UTF-8
+ # encoding. All BSD system functions expect their string
+ # parameters to be in UTF-8 encoding and nothing else."
+ # It also says
+ # "An additional caveat is that string parameters for files,
+ # paths, and other file-system entities must be in canonical
+ # UTF-8. In a canonical UTF-8 Unicode string, all decomposable
+ # characters are decomposed ..."
+ # but this is not true: You can pass non-decomposed UTF-8 strings
+ # to file system functions, and it is the OS which will convert
+ # them to decomposed UTF-8 before accessing the file system.
+ # - The Apple Terminal application displays UTF-8 by default.
+ # - However, other applications are free to use different encodings:
+ # - xterm uses ISO-8859-1 by default.
+ # - TextEdit uses MacRoman by default.
+ # We prefer UTF-8 over decomposed UTF-8-MAC because one should
+ # minimize the use of decomposed Unicode. Unfortunately, through the
+ # Darwin file system, decomposed UTF-8 strings are leaked into user
+ # space nevertheless.
+ # Then there are also the locales with encodings other than US-ASCII
+ # and UTF-8. These locales can be occasionally useful to users (e.g.
+ # when grepping through ISO-8859-1 encoded text files), when all their
+ # file names are in US-ASCII.
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "KOI8-R KOI8-R"
+ echo "KOI8-U KOI8-U"
+ echo "CP866 CP866"
+ echo "CP949 CP949"
+ echo "CP1131 CP1131"
+ echo "CP1251 CP1251"
+ echo "eucCN GB2312"
+ echo "GB2312 GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "Big5 BIG5"
+ echo "Big5HKSCS BIG5-HKSCS"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "SJIS SHIFT_JIS"
+ echo "ARMSCII-8 ARMSCII-8"
+ echo "PT154 PT154"
+ #echo "ISCII-DEV ?"
+ echo "* UTF-8"
+ ;;
+ beos* | haiku*)
+ # BeOS and Haiku have a single locale, and it has UTF-8 encoding.
+ echo "* UTF-8"
+ ;;
+ msdosdjgpp*)
+ # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "#"
+ echo "# The encodings given here may not all be correct."
+ echo "# If you find that the encoding given for your language and"
+ echo "# country is not the one your DOS machine actually uses, just"
+ echo "# correct it in this file, and send a mail to"
+ echo "# Juan Manuel Guerrero <juan.guerrero@gmx.de>"
+ echo "# and Bruno Haible <bruno@clisp.org>."
+ echo "#"
+ echo "C ASCII"
+ # ISO-8859-1 languages
+ echo "ca CP850"
+ echo "ca_ES CP850"
+ echo "da CP865" # not CP850 ??
+ echo "da_DK CP865" # not CP850 ??
+ echo "de CP850"
+ echo "de_AT CP850"
+ echo "de_CH CP850"
+ echo "de_DE CP850"
+ echo "en CP850"
+ echo "en_AU CP850" # not CP437 ??
+ echo "en_CA CP850"
+ echo "en_GB CP850"
+ echo "en_NZ CP437"
+ echo "en_US CP437"
+ echo "en_ZA CP850" # not CP437 ??
+ echo "es CP850"
+ echo "es_AR CP850"
+ echo "es_BO CP850"
+ echo "es_CL CP850"
+ echo "es_CO CP850"
+ echo "es_CR CP850"
+ echo "es_CU CP850"
+ echo "es_DO CP850"
+ echo "es_EC CP850"
+ echo "es_ES CP850"
+ echo "es_GT CP850"
+ echo "es_HN CP850"
+ echo "es_MX CP850"
+ echo "es_NI CP850"
+ echo "es_PA CP850"
+ echo "es_PY CP850"
+ echo "es_PE CP850"
+ echo "es_SV CP850"
+ echo "es_UY CP850"
+ echo "es_VE CP850"
+ echo "et CP850"
+ echo "et_EE CP850"
+ echo "eu CP850"
+ echo "eu_ES CP850"
+ echo "fi CP850"
+ echo "fi_FI CP850"
+ echo "fr CP850"
+ echo "fr_BE CP850"
+ echo "fr_CA CP850"
+ echo "fr_CH CP850"
+ echo "fr_FR CP850"
+ echo "ga CP850"
+ echo "ga_IE CP850"
+ echo "gd CP850"
+ echo "gd_GB CP850"
+ echo "gl CP850"
+ echo "gl_ES CP850"
+ echo "id CP850" # not CP437 ??
+ echo "id_ID CP850" # not CP437 ??
+ echo "is CP861" # not CP850 ??
+ echo "is_IS CP861" # not CP850 ??
+ echo "it CP850"
+ echo "it_CH CP850"
+ echo "it_IT CP850"
+ echo "lt CP775"
+ echo "lt_LT CP775"
+ echo "lv CP775"
+ echo "lv_LV CP775"
+ echo "nb CP865" # not CP850 ??
+ echo "nb_NO CP865" # not CP850 ??
+ echo "nl CP850"
+ echo "nl_BE CP850"
+ echo "nl_NL CP850"
+ echo "nn CP865" # not CP850 ??
+ echo "nn_NO CP865" # not CP850 ??
+ echo "no CP865" # not CP850 ??
+ echo "no_NO CP865" # not CP850 ??
+ echo "pt CP850"
+ echo "pt_BR CP850"
+ echo "pt_PT CP850"
+ echo "sv CP850"
+ echo "sv_SE CP850"
+ # ISO-8859-2 languages
+ echo "cs CP852"
+ echo "cs_CZ CP852"
+ echo "hr CP852"
+ echo "hr_HR CP852"
+ echo "hu CP852"
+ echo "hu_HU CP852"
+ echo "pl CP852"
+ echo "pl_PL CP852"
+ echo "ro CP852"
+ echo "ro_RO CP852"
+ echo "sk CP852"
+ echo "sk_SK CP852"
+ echo "sl CP852"
+ echo "sl_SI CP852"
+ echo "sq CP852"
+ echo "sq_AL CP852"
+ echo "sr CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_CS CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+ # ISO-8859-3 languages
+ echo "mt CP850"
+ echo "mt_MT CP850"
+ # ISO-8859-5 languages
+ echo "be CP866"
+ echo "be_BE CP866"
+ echo "bg CP866" # not CP855 ??
+ echo "bg_BG CP866" # not CP855 ??
+ echo "mk CP866" # not CP855 ??
+ echo "mk_MK CP866" # not CP855 ??
+ echo "ru CP866"
+ echo "ru_RU CP866"
+ echo "uk CP1125"
+ echo "uk_UA CP1125"
+ # ISO-8859-6 languages
+ echo "ar CP864"
+ echo "ar_AE CP864"
+ echo "ar_DZ CP864"
+ echo "ar_EG CP864"
+ echo "ar_IQ CP864"
+ echo "ar_IR CP864"
+ echo "ar_JO CP864"
+ echo "ar_KW CP864"
+ echo "ar_MA CP864"
+ echo "ar_OM CP864"
+ echo "ar_QA CP864"
+ echo "ar_SA CP864"
+ echo "ar_SY CP864"
+ # ISO-8859-7 languages
+ echo "el CP869"
+ echo "el_GR CP869"
+ # ISO-8859-8 languages
+ echo "he CP862"
+ echo "he_IL CP862"
+ # ISO-8859-9 languages
+ echo "tr CP857"
+ echo "tr_TR CP857"
+ # Japanese
+ echo "ja CP932"
+ echo "ja_JP CP932"
+ # Chinese
+ echo "zh_CN GBK"
+ echo "zh_TW CP950" # not CP938 ??
+ # Korean
+ echo "kr CP949" # not CP934 ??
+ echo "kr_KR CP949" # not CP934 ??
+ # Thai
+ echo "th CP874"
+ echo "th_TH CP874"
+ # Other
+ echo "eo CP850"
+ echo "eo_EO CP850"
+ ;;
+esac
diff --git a/gnulib/lib/connect.c b/gnulib/lib/connect.c
new file mode 100644
index 00000000..5e7f95a2
--- /dev/null
+++ b/gnulib/lib/connect.c
@@ -0,0 +1,47 @@
+/* connect.c --- wrappers for Windows connect function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef connect
+
+int
+rpl_connect (int fd, struct sockaddr *sockaddr, int len)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = connect (sock, sockaddr, len);
+ if (r < 0)
+ {
+ /* EINPROGRESS is not returned by WinSock 2.0; for backwards
+ compatibility, connect(2) uses EWOULDBLOCK. */
+ if (WSAGetLastError () == WSAEWOULDBLOCK)
+ WSASetLastError (WSAEINPROGRESS);
+
+ set_winsock_errno ();
+ }
+
+ return r;
+}
diff --git a/gnulib/lib/copy-acl.c b/gnulib/lib/copy-acl.c
new file mode 100644
index 00000000..1e822408
--- /dev/null
+++ b/gnulib/lib/copy-acl.c
@@ -0,0 +1,553 @@
+/* copy-acl.c - copy access control list from one file to another file
+
+ Copyright (C) 2002-2003, 2005-2010 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/>.
+
+ Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include "acl-internal.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+
+/* Copy access control lists from one file to another. If SOURCE_DESC is
+ a valid file descriptor, use file descriptor operations, else use
+ filename based operations on SRC_NAME. Likewise for DEST_DESC and
+ DST_NAME.
+ If access control lists are not available, fchmod the target file to
+ MODE. Also sets the non-permission bits of the destination file
+ (S_ISUID, S_ISGID, S_ISVTX) to those from MODE if any are set.
+ Return 0 if successful.
+ Return -2 and set errno for an error relating to the source file.
+ Return -1 and set errno for an error relating to the destination file. */
+
+static int
+qcopy_acl (const char *src_name, int source_desc, const char *dst_name,
+ int dest_desc, mode_t mode)
+{
+#if USE_ACL && HAVE_ACL_GET_FILE
+ /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
+ /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+# if MODE_INSIDE_ACL
+ /* Linux, FreeBSD, IRIX, Tru64 */
+
+ acl_t acl;
+ int ret;
+
+ if (HAVE_ACL_GET_FD && source_desc != -1)
+ acl = acl_get_fd (source_desc);
+ else
+ acl = acl_get_file (src_name, ACL_TYPE_ACCESS);
+ if (acl == NULL)
+ {
+ if (ACL_NOT_WELL_SUPPORTED (errno))
+ return qset_acl (dst_name, dest_desc, mode);
+ else
+ return -2;
+ }
+
+ if (HAVE_ACL_SET_FD && dest_desc != -1)
+ ret = acl_set_fd (dest_desc, acl);
+ else
+ ret = acl_set_file (dst_name, ACL_TYPE_ACCESS, acl);
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+
+ if (ACL_NOT_WELL_SUPPORTED (errno) && !acl_access_nontrivial (acl))
+ {
+ acl_free (acl);
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+ }
+ else
+ {
+ acl_free (acl);
+ chmod_or_fchmod (dst_name, dest_desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ else
+ acl_free (acl);
+
+ if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+ {
+ /* We did not call chmod so far, and either the mode and the ACL are
+ separate or special bits are to be set which don't fit into ACLs. */
+
+ if (chmod_or_fchmod (dst_name, dest_desc, mode) != 0)
+ return -1;
+ }
+
+ if (S_ISDIR (mode))
+ {
+ acl = acl_get_file (src_name, ACL_TYPE_DEFAULT);
+ if (acl == NULL)
+ return -2;
+
+ if (acl_set_file (dst_name, ACL_TYPE_DEFAULT, acl))
+ {
+ int saved_errno = errno;
+
+ acl_free (acl);
+ errno = saved_errno;
+ return -1;
+ }
+ else
+ acl_free (acl);
+ }
+ return 0;
+
+# else /* !MODE_INSIDE_ACL */
+ /* MacOS X */
+
+# if !HAVE_ACL_TYPE_EXTENDED
+# error Must have ACL_TYPE_EXTENDED
+# endif
+
+ /* On MacOS X, acl_get_file (name, ACL_TYPE_ACCESS)
+ and acl_get_file (name, ACL_TYPE_DEFAULT)
+ always return NULL / EINVAL. You have to use
+ acl_get_file (name, ACL_TYPE_EXTENDED)
+ or acl_get_fd (open (name, ...))
+ to retrieve an ACL.
+ On the other hand,
+ acl_set_file (name, ACL_TYPE_ACCESS, acl)
+ and acl_set_file (name, ACL_TYPE_DEFAULT, acl)
+ have the same effect as
+ acl_set_file (name, ACL_TYPE_EXTENDED, acl):
+ Each of these calls sets the file's ACL. */
+
+ acl_t acl;
+ int ret;
+
+ if (HAVE_ACL_GET_FD && source_desc != -1)
+ acl = acl_get_fd (source_desc);
+ else
+ acl = acl_get_file (src_name, ACL_TYPE_EXTENDED);
+ if (acl == NULL)
+ {
+ if (ACL_NOT_WELL_SUPPORTED (errno))
+ return qset_acl (dst_name, dest_desc, mode);
+ else
+ return -2;
+ }
+
+ if (HAVE_ACL_SET_FD && dest_desc != -1)
+ ret = acl_set_fd (dest_desc, acl);
+ else
+ ret = acl_set_file (dst_name, ACL_TYPE_EXTENDED, acl);
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+
+ if (ACL_NOT_WELL_SUPPORTED (errno) && !acl_extended_nontrivial (acl))
+ {
+ acl_free (acl);
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+ }
+ else
+ {
+ acl_free (acl);
+ chmod_or_fchmod (dst_name, dest_desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ else
+ acl_free (acl);
+
+ /* Since !MODE_INSIDE_ACL, we have to call chmod explicitly. */
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+
+# endif
+
+#elif USE_ACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
+
+# if defined ACL_NO_TRIVIAL
+ /* Solaris 10 (newer version), which has additional API declared in
+ <sys/acl.h> (acl_t) and implemented in libsec (acl_set, acl_trivial,
+ acl_fromtext, ...). */
+
+ int ret;
+ acl_t *aclp = NULL;
+ ret = (source_desc < 0
+ ? acl_get (src_name, ACL_NO_TRIVIAL, &aclp)
+ : facl_get (source_desc, ACL_NO_TRIVIAL, &aclp));
+ if (ret != 0 && errno != ENOSYS)
+ return -2;
+
+ ret = qset_acl (dst_name, dest_desc, mode);
+ if (ret != 0)
+ return -1;
+
+ if (aclp)
+ {
+ ret = (dest_desc < 0
+ ? acl_set (dst_name, aclp)
+ : facl_set (dest_desc, aclp));
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+
+ acl_free (aclp);
+ errno = saved_errno;
+ return -1;
+ }
+ acl_free (aclp);
+ }
+
+ return 0;
+
+# else /* Solaris, Cygwin, general case */
+
+ /* Solaris 2.5 through Solaris 10, Cygwin, and contemporaneous versions
+ of Unixware. The acl() call returns the access and default ACL both
+ at once. */
+# ifdef ACE_GETACL
+ int ace_count;
+ ace_t *ace_entries;
+# endif
+ int count;
+ aclent_t *entries;
+ int did_chmod;
+ int saved_errno;
+ int ret;
+
+# ifdef ACE_GETACL
+ /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
+ file systems (whereas the other ones are used in UFS file systems).
+ There is an API
+ pathconf (name, _PC_ACL_ENABLED)
+ fpathconf (desc, _PC_ACL_ENABLED)
+ that allows to determine which of the two kinds of ACLs is supported
+ for the given file. But some file systems may implement this call
+ incorrectly, so better not use it.
+ When fetching the source ACL, we simply fetch both ACL types.
+ When setting the destination ACL, we try either ACL types, assuming
+ that the kernel will translate the ACL from one form to the other.
+ (See in <http://docs.sun.com/app/docs/doc/819-2241/6n4huc7ia?l=en&a=view>
+ the description of ENOTSUP.) */
+ for (;;)
+ {
+ ace_count = (source_desc != -1
+ ? facl (source_desc, ACE_GETACLCNT, 0, NULL)
+ : acl (src_name, ACE_GETACLCNT, 0, NULL));
+
+ if (ace_count < 0)
+ {
+ if (errno == ENOSYS || errno == EINVAL)
+ {
+ ace_count = 0;
+ ace_entries = NULL;
+ break;
+ }
+ else
+ return -2;
+ }
+
+ if (ace_count == 0)
+ {
+ ace_entries = NULL;
+ break;
+ }
+
+ ace_entries = (ace_t *) malloc (ace_count * sizeof (ace_t));
+ if (ace_entries == NULL)
+ {
+ errno = ENOMEM;
+ return -2;
+ }
+
+ if ((source_desc != -1
+ ? facl (source_desc, ACE_GETACL, ace_count, ace_entries)
+ : acl (src_name, ACE_GETACL, ace_count, ace_entries))
+ == ace_count)
+ break;
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+# endif
+
+ for (;;)
+ {
+ count = (source_desc != -1
+ ? facl (source_desc, GETACLCNT, 0, NULL)
+ : acl (src_name, GETACLCNT, 0, NULL));
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == ENOTSUP)
+ {
+ count = 0;
+ entries = NULL;
+ break;
+ }
+ else
+ return -2;
+ }
+
+ if (count == 0)
+ {
+ entries = NULL;
+ break;
+ }
+
+ entries = (aclent_t *) malloc (count * sizeof (aclent_t));
+ if (entries == NULL)
+ {
+ errno = ENOMEM;
+ return -2;
+ }
+
+ if ((source_desc != -1
+ ? facl (source_desc, GETACL, count, entries)
+ : acl (src_name, GETACL, count, entries))
+ == count)
+ break;
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+ /* Is there an ACL of either kind? */
+# ifdef ACE_GETACL
+ if (ace_count == 0)
+# endif
+ if (count == 0)
+ return qset_acl (dst_name, dest_desc, mode);
+
+ did_chmod = 0; /* set to 1 once the mode bits in 0777 have been set */
+ saved_errno = 0; /* the first non-ignorable error code */
+
+ if (!MODE_INSIDE_ACL)
+ {
+ /* On Cygwin, it is necessary to call chmod before acl, because
+ chmod can change the contents of the ACL (in ways that don't
+ change the allowed accesses, but still visible). */
+ if (chmod_or_fchmod (dst_name, dest_desc, mode) != 0)
+ saved_errno = errno;
+ did_chmod = 1;
+ }
+
+ /* If both ace_entries and entries are available, try SETACL before
+ ACE_SETACL, because SETACL cannot fail with ENOTSUP whereas ACE_SETACL
+ can. */
+
+ if (count > 0)
+ {
+ ret = (dest_desc != -1
+ ? facl (dest_desc, SETACL, count, entries)
+ : acl (dst_name, SETACL, count, entries));
+ if (ret < 0 && saved_errno == 0)
+ {
+ saved_errno = errno;
+ if (errno == ENOSYS && !acl_nontrivial (count, entries))
+ saved_errno = 0;
+ }
+ else
+ did_chmod = 1;
+ }
+ free (entries);
+
+# ifdef ACE_GETACL
+ if (ace_count > 0)
+ {
+ ret = (dest_desc != -1
+ ? facl (dest_desc, ACE_SETACL, ace_count, ace_entries)
+ : acl (dst_name, ACE_SETACL, ace_count, ace_entries));
+ if (ret < 0 && saved_errno == 0)
+ {
+ saved_errno = errno;
+ if ((errno == ENOSYS || errno == EINVAL || errno == ENOTSUP)
+ && !acl_ace_nontrivial (ace_count, ace_entries))
+ saved_errno = 0;
+ }
+ }
+ free (ace_entries);
+# endif
+
+ if (MODE_INSIDE_ACL
+ && did_chmod <= ((mode & (S_ISUID | S_ISGID | S_ISVTX)) ? 1 : 0))
+ {
+ /* We did not call chmod so far, and either the mode and the ACL are
+ separate or special bits are to be set which don't fit into ACLs. */
+
+ if (chmod_or_fchmod (dst_name, dest_desc, mode) != 0)
+ {
+ if (saved_errno == 0)
+ saved_errno = errno;
+ }
+ }
+
+ if (saved_errno)
+ {
+ errno = saved_errno;
+ return -1;
+ }
+ return 0;
+
+# endif
+
+#elif USE_ACL && HAVE_GETACL /* HP-UX */
+
+ int count;
+ struct acl_entry entries[NACLENTRIES];
+ int ret;
+
+ for (;;)
+ {
+ count = (source_desc != -1
+ ? fgetacl (source_desc, 0, NULL)
+ : getacl (src_name, 0, NULL));
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == EOPNOTSUPP)
+ {
+ count = 0;
+ break;
+ }
+ else
+ return -2;
+ }
+
+ if (count == 0)
+ break;
+
+ if (count > NACLENTRIES)
+ /* If NACLENTRIES cannot be trusted, use dynamic memory allocation. */
+ abort ();
+
+ if ((source_desc != -1
+ ? fgetacl (source_desc, count, entries)
+ : getacl (src_name, count, entries))
+ == count)
+ break;
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+ if (count == 0)
+ return qset_acl (dst_name, dest_desc, mode);
+
+ ret = (dest_desc != -1
+ ? fsetacl (dest_desc, count, entries)
+ : setacl (dst_name, count, entries));
+ if (ret < 0)
+ {
+ int saved_errno = errno;
+
+ if (errno == ENOSYS || errno == EOPNOTSUPP)
+ {
+ struct stat source_statbuf;
+
+ if ((source_desc != -1
+ ? fstat (source_desc, &source_statbuf)
+ : stat (src_name, &source_statbuf)) == 0)
+ {
+ if (!acl_nontrivial (count, entries, &source_statbuf))
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+ }
+ else
+ saved_errno = errno;
+ }
+
+ chmod_or_fchmod (dst_name, dest_desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+
+ if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+ {
+ /* We did not call chmod so far, and either the mode and the ACL are
+ separate or special bits are to be set which don't fit into ACLs. */
+
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+ }
+ return 0;
+
+#elif USE_ACL && HAVE_ACLX_GET && 0 /* AIX */
+
+ /* TODO */
+
+#elif USE_ACL && HAVE_STATACL /* older AIX */
+
+ union { struct acl a; char room[4096]; } u;
+ int ret;
+
+ if ((source_desc != -1
+ ? fstatacl (source_desc, STX_NORMAL, &u.a, sizeof (u))
+ : statacl (src_name, STX_NORMAL, &u.a, sizeof (u)))
+ < 0)
+ return -2;
+
+ ret = (dest_desc != -1
+ ? fchacl (dest_desc, &u.a, u.a.acl_len)
+ : chacl (dst_name, &u.a, u.a.acl_len));
+ if (ret < 0)
+ {
+ int saved_errno = errno;
+
+ chmod_or_fchmod (dst_name, dest_desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+
+ /* No need to call chmod_or_fchmod at this point, since the mode bits
+ S_ISUID, S_ISGID, S_ISVTX are also stored in the ACL. */
+
+ return 0;
+
+#else
+
+ return qset_acl (dst_name, dest_desc, mode);
+
+#endif
+}
+
+
+/* Copy access control lists from one file to another. If SOURCE_DESC is
+ a valid file descriptor, use file descriptor operations, else use
+ filename based operations on SRC_NAME. Likewise for DEST_DESC and
+ DST_NAME.
+ If access control lists are not available, fchmod the target file to
+ MODE. Also sets the non-permission bits of the destination file
+ (S_ISUID, S_ISGID, S_ISVTX) to those from MODE if any are set.
+ Return 0 if successful, otherwise output a diagnostic and return -1. */
+
+int
+copy_acl (const char *src_name, int source_desc, const char *dst_name,
+ int dest_desc, mode_t mode)
+{
+ int ret = qcopy_acl (src_name, source_desc, dst_name, dest_desc, mode);
+ switch (ret)
+ {
+ case -2:
+ error (0, errno, "%s", quote (src_name));
+ return -1;
+
+ case -1:
+ error (0, errno, _("preserving permissions for %s"), quote (dst_name));
+ return -1;
+
+ default:
+ return 0;
+ }
+}
diff --git a/gnulib/lib/copy-file.c b/gnulib/lib/copy-file.c
new file mode 100644
index 00000000..acb6395a
--- /dev/null
+++ b/gnulib/lib/copy-file.c
@@ -0,0 +1,137 @@
+/* Copying of files.
+ Copyright (C) 2001-2003, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "copy-file.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#if HAVE_UTIME || HAVE_UTIMES
+# if HAVE_UTIME_H
+# include <utime.h>
+# else
+# include <sys/utime.h>
+# endif
+#endif
+
+#include "error.h"
+#include "safe-read.h"
+#include "full-write.h"
+#include "acl.h"
+#include "binary-io.h"
+#include "gettext.h"
+#include "xalloc.h"
+
+#define _(str) gettext (str)
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+enum { IO_SIZE = 32 * 1024 };
+
+void
+copy_file_preserving (const char *src_filename, const char *dest_filename)
+{
+ int src_fd;
+ struct stat statbuf;
+ int mode;
+ int dest_fd;
+ char *buf = xmalloc (IO_SIZE);
+
+ src_fd = open (src_filename, O_RDONLY | O_BINARY);
+ if (src_fd < 0 || fstat (src_fd, &statbuf) < 0)
+ error (EXIT_FAILURE, errno, _("error while opening \"%s\" for reading"),
+ src_filename);
+
+ mode = statbuf.st_mode & 07777;
+
+ dest_fd = open (dest_filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0600);
+ if (dest_fd < 0)
+ error (EXIT_FAILURE, errno, _("cannot open backup file \"%s\" for writing"),
+ dest_filename);
+
+ /* Copy the file contents. */
+ for (;;)
+ {
+ size_t n_read = safe_read (src_fd, buf, IO_SIZE);
+ if (n_read == SAFE_READ_ERROR)
+ error (EXIT_FAILURE, errno, _("error reading \"%s\""), src_filename);
+ if (n_read == 0)
+ break;
+
+ if (full_write (dest_fd, buf, n_read) < n_read)
+ error (EXIT_FAILURE, errno, _("error writing \"%s\""), dest_filename);
+ }
+
+ free (buf);
+
+#if !USE_ACL
+ if (close (dest_fd) < 0)
+ error (EXIT_FAILURE, errno, _("error writing \"%s\""), dest_filename);
+ if (close (src_fd) < 0)
+ error (EXIT_FAILURE, errno, _("error after reading \"%s\""), src_filename);
+#endif
+
+ /* Preserve the access and modification times. */
+#if HAVE_UTIME
+ {
+ struct utimbuf ut;
+
+ ut.actime = statbuf.st_atime;
+ ut.modtime = statbuf.st_mtime;
+ utime (dest_filename, &ut);
+ }
+#elif HAVE_UTIMES
+ {
+ struct timeval ut[2];
+
+ ut[0].tv_sec = statbuf.st_atime; ut[0].tv_usec = 0;
+ ut[1].tv_sec = statbuf.st_mtime; ut[1].tv_usec = 0;
+ utimes (dest_filename, &ut);
+ }
+#endif
+
+#if HAVE_CHOWN
+ /* Preserve the owner and group. */
+ chown (dest_filename, statbuf.st_uid, statbuf.st_gid);
+#endif
+
+ /* Preserve the access permissions. */
+#if USE_ACL
+ if (copy_acl (src_filename, src_fd, dest_filename, dest_fd, mode))
+ exit (EXIT_FAILURE);
+#else
+ chmod (dest_filename, mode);
+#endif
+
+#if USE_ACL
+ if (close (dest_fd) < 0)
+ error (EXIT_FAILURE, errno, _("error writing \"%s\""), dest_filename);
+ if (close (src_fd) < 0)
+ error (EXIT_FAILURE, errno, _("error after reading \"%s\""), src_filename);
+#endif
+}
diff --git a/gnulib/lib/copy-file.h b/gnulib/lib/copy-file.h
new file mode 100644
index 00000000..4791fdb2
--- /dev/null
+++ b/gnulib/lib/copy-file.h
@@ -0,0 +1,34 @@
+/* Copying of files.
+ Copyright (C) 2001-2003, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Copy a regular file: from src_filename to dest_filename.
+ The destination file is assumed to be a backup file.
+ Modification times, owner, group and access permissions are preserved as
+ far as possible.
+ Exit upon failure. */
+extern void copy_file_preserving (const char *src_filename, const char *dest_filename);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/cosl.c b/gnulib/lib/cosl.c
new file mode 100644
index 00000000..884cec8c
--- /dev/null
+++ b/gnulib/lib/cosl.c
@@ -0,0 +1,98 @@
+/* s_cosl.c -- long double version of s_sin.c.
+ * Conversion to long double by Jakub Jelinek, jj@ultra.linux.cz.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+/* sinl(x)
+ * Return sine function of x.
+ *
+ * kernel function:
+ * __kernel_sinl ... sine function on [-pi/4,pi/4]
+ * __kernel_cosl ... cose function on [-pi/4,pi/4]
+ * __ieee754_rem_pio2l ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "trigl.h"
+
+long double cosl(long double x)
+{
+ long double y[2],z=0.0L;
+ int n;
+
+ /* cosl(NaN) is NaN */
+ if (isnanl (x))
+ return x;
+
+ /* |x| ~< pi/4 */
+ if(x >= -0.7853981633974483096156608458198757210492 &&
+ x <= 0.7853981633974483096156608458198757210492)
+ return kernel_cosl(x, z);
+
+ /* cosl(Inf) is NaN, cosl(0) is 1 */
+ else if (x + x == x && x != 0.0)
+ return x-x; /* NaN */
+
+ /* argument reduction needed */
+ else {
+ n = ieee754_rem_pio2l(x,y);
+ switch(n&3) {
+ case 0: return kernel_cosl(y[0],y[1]);
+ case 1: return -kernel_sinl(y[0],y[1],1);
+ case 2: return -kernel_cosl(y[0],y[1]);
+ default:
+ return kernel_sinl(y[0],y[1],1);
+ }
+ }
+}
+
+#if 0
+int
+main (void)
+{
+ printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492));
+ printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *29));
+ printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *2));
+ printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *30));
+ printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *4));
+ printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *32));
+ printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *2/3));
+ printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *4/3));
+}
+#endif
diff --git a/gnulib/lib/count-one-bits.h b/gnulib/lib/count-one-bits.h
new file mode 100644
index 00000000..1d84ef0f
--- /dev/null
+++ b/gnulib/lib/count-one-bits.h
@@ -0,0 +1,77 @@
+/* count-one-bits.h -- counts the number of 1-bits in a word.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Ben Pfaff. */
+
+#ifndef COUNT_ONE_BITS_H
+# define COUNT_ONE_BITS_H 1
+
+#include <stdlib.h>
+#include "verify.h"
+
+/* Expand the code which computes the number of 1-bits of the local
+ variable 'x' of type TYPE (an unsigned integer type) and returns it
+ from the current function. */
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#define COUNT_ONE_BITS(BUILTIN, TYPE) \
+ return BUILTIN (x);
+#else
+#define COUNT_ONE_BITS(BUILTIN, TYPE) \
+ /* This condition is written so as to avoid shifting by more than \
+ 31 bits at once, and also avoids a random HP-UX cc bug. */ \
+ verify (((TYPE) -1 >> 31 >> 31 >> 2) == 0); /* TYPE has at most 64 bits */ \
+ int count = count_one_bits_32 (x); \
+ if (1 < (TYPE) -1 >> 31) /* TYPE has more than 32 bits? */ \
+ count += count_one_bits_32 (x >> 31 >> 1); \
+ return count;
+
+/* Compute and return the the number of 1-bits set in the least
+ significant 32 bits of X. */
+static inline int
+count_one_bits_32 (unsigned int x)
+{
+ x = ((x & 0xaaaaaaaaU) >> 1) + (x & 0x55555555U);
+ x = ((x & 0xccccccccU) >> 2) + (x & 0x33333333U);
+ x = (x >> 16) + (x & 0xffff);
+ x = ((x & 0xf0f0) >> 4) + (x & 0x0f0f);
+ return (x >> 8) + (x & 0x00ff);
+}
+#endif
+
+/* Compute and return the number of 1-bits set in X. */
+static inline int
+count_one_bits (unsigned int x)
+{
+ COUNT_ONE_BITS (__builtin_popcount, unsigned int);
+}
+
+/* Compute and return the number of 1-bits set in X. */
+static inline int
+count_one_bits_l (unsigned long int x)
+{
+ COUNT_ONE_BITS (__builtin_popcountl, unsigned long int);
+}
+
+#if HAVE_UNSIGNED_LONG_LONG_INT
+/* Compute and return the number of 1-bits set in X. */
+static inline int
+count_one_bits_ll (unsigned long long int x)
+{
+ COUNT_ONE_BITS (__builtin_popcountll, unsigned long long int);
+}
+#endif
+
+#endif /* COUNT_ONE_BITS_H */
diff --git a/gnulib/lib/crc.c b/gnulib/lib/crc.c
new file mode 100644
index 00000000..580133b3
--- /dev/null
+++ b/gnulib/lib/crc.c
@@ -0,0 +1,103 @@
+/* crc.c -- cyclic redundancy checks
+ Copyright (C) 2005, 2006, 2009, 2010 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, 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "crc.h"
+
+/* Table of CRCs of all 8-bit messages. Generated by running code
+ from RFC 1952 modified to print out the table. */
+static const uint32_t crc32_table[256] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+};
+
+/*
+ * The following function was extracted from RFC 1952 by Simon
+ * Josefsson. It was modified to avoid initial and final XOR, to use
+ * size_t for the buffer length, and to use the const keyword.
+ */
+uint32_t
+crc32_update_no_xor (uint32_t crc, const char *buf, size_t len)
+{
+ size_t n;
+
+ for (n = 0; n < len; n++)
+ crc = crc32_table[(crc ^ buf[n]) & 0xff] ^ (crc >> 8);
+
+ return crc;
+}
+
+uint32_t
+crc32_no_xor (const char *buf, size_t len)
+{
+ return crc32_update_no_xor (0L, buf, len);
+}
+
+uint32_t
+crc32_update (uint32_t crc, const char *buf, size_t len)
+{
+ return crc32_update_no_xor (crc ^ 0xffffffff, buf, len) ^ 0xffffffff;
+}
+
+uint32_t
+crc32 (const char *buf, size_t len)
+{
+ return crc32_update (0L, buf, len);
+}
diff --git a/gnulib/lib/crc.h b/gnulib/lib/crc.h
new file mode 100644
index 00000000..4fa8fbc9
--- /dev/null
+++ b/gnulib/lib/crc.h
@@ -0,0 +1,47 @@
+/* crc.h -- cyclic redundancy checks
+ Copyright (C) 2005, 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#ifndef CRC_H
+# define CRC_H 1
+
+#include <stddef.h>
+#include <stdint.h>
+
+/* Compute CRC-32 value of LEN bytes long BUF, and return it. */
+extern uint32_t crc32 (const char *buf, size_t len);
+
+/* Incrementally update CRC-32 value CRC using LEN bytes long BUF. In
+ the first call, use 0 as the value for CRC. Return the updated
+ CRC-32 value. */
+extern uint32_t crc32_update (uint32_t crc, const char *buf, size_t len);
+
+/* Compute modified-CRC-32 value of LEN bytes long BUF, and return it.
+ The "modification" is to avoid the initial and final XOR operation.
+ Due to historic implementation errors, this variant is sometimes
+ used (i.e., in RFC 3961). */
+extern uint32_t crc32_no_xor (const char *buf, size_t len);
+
+/* Incrementally update modified-CRC-32 value CRC using LEN bytes long
+ BUF. In the first call, use 0 as the value for CRC. Return the
+ updated modified-CRC-32 value. The "modification" is to avoid the
+ initial and final XOR operation. Due to historic implementation
+ errors, this variant is sometimes used (i.e., in RFC 3961). */
+extern uint32_t
+crc32_update_no_xor (uint32_t crc, const char *buf, size_t len);
+
+#endif /* CRC_H */
diff --git a/gnulib/lib/creat-safer.c b/gnulib/lib/creat-safer.c
new file mode 100644
index 00000000..da0418df
--- /dev/null
+++ b/gnulib/lib/creat-safer.c
@@ -0,0 +1,31 @@
+/* Invoke creat, but avoid some glitches.
+
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "fcntl-safer.h"
+
+#include <fcntl.h>
+#include "unistd-safer.h"
+
+int
+creat_safer (char const *file, mode_t mode)
+{
+ return fd_safer (creat (file, mode));
+}
diff --git a/gnulib/lib/csharpcomp.c b/gnulib/lib/csharpcomp.c
new file mode 100644
index 00000000..8f791516
--- /dev/null
+++ b/gnulib/lib/csharpcomp.c
@@ -0,0 +1,573 @@
+/* Compile a C# program.
+ Copyright (C) 2003-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "csharpcomp.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "execute.h"
+#include "pipe.h"
+#include "wait-process.h"
+#include "sh-quote.h"
+#include "safe-read.h"
+#include "xmalloca.h"
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Survey of C# compilers.
+
+ Program from
+
+ cscc pnet
+ mcs mono
+ csc sscli
+
+ We try the CIL interpreters in the following order:
+ 1. "cscc", because it is a completely free system.
+ 2. "mcs", because it is a free system but doesn't integrate so well
+ with Unix. (Command line options start with / instead of -. Errors go
+ to stdout instead of stderr. Source references are printed as
+ "file(lineno)" instead of "file:lineno:".)
+ 3. "csc", although it is not free, because it is a kind of "reference
+ implementation" of C#.
+ But the order can be changed through the --enable-csharp configuration
+ option.
+ */
+
+static int
+compile_csharp_using_pnet (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file, bool output_is_library,
+ bool optimize, bool debug,
+ bool verbose)
+{
+ static bool cscc_tested;
+ static bool cscc_present;
+
+ if (!cscc_tested)
+ {
+ /* Test for presence of cscc:
+ "cscc --version >/dev/null 2>/dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "cscc";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ exitstatus = execute ("cscc", "cscc", argv, false, false, true, true,
+ true, false, NULL);
+ cscc_present = (exitstatus == 0);
+ cscc_tested = true;
+ }
+
+ if (cscc_present)
+ {
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + (output_is_library ? 1 : 0) + 2 + 2 * libdirs_count
+ + 2 * libraries_count + (optimize ? 1 : 0) + (debug ? 1 : 0)
+ + sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "cscc";
+ if (output_is_library)
+ *argp++ = "-shared";
+ *argp++ = "-o";
+ *argp++ = (char *) output_file;
+ for (i = 0; i < libdirs_count; i++)
+ {
+ *argp++ = "-L";
+ *argp++ = (char *) libdirs[i];
+ }
+ for (i = 0; i < libraries_count; i++)
+ {
+ *argp++ = "-l";
+ *argp++ = (char *) libraries[i];
+ }
+ if (optimize)
+ *argp++ = "-O";
+ if (debug)
+ *argp++ = "-g";
+ for (i = 0; i < sources_count; i++)
+ {
+ const char *source_file = sources[i];
+ if (strlen (source_file) >= 10
+ && memcmp (source_file + strlen (source_file) - 10, ".resources",
+ 10) == 0)
+ {
+ char *option = (char *) xmalloca (12 + strlen (source_file) + 1);
+
+ memcpy (option, "-fresources=", 12);
+ strcpy (option + 12, source_file);
+ *argp++ = option;
+ }
+ else
+ *argp++ = (char *) source_file;
+ }
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("cscc", "cscc", argv, false, false, false, false,
+ true, true, NULL);
+
+ for (i = 0; i < sources_count; i++)
+ if (argv[argc - sources_count + i] != sources[i])
+ freea (argv[argc - sources_count + i]);
+ freea (argv);
+
+ return (exitstatus != 0);
+ }
+ else
+ return -1;
+}
+
+static int
+compile_csharp_using_mono (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file, bool output_is_library,
+ bool optimize, bool debug,
+ bool verbose)
+{
+ static bool mcs_tested;
+ static bool mcs_present;
+
+ if (!mcs_tested)
+ {
+ /* Test for presence of mcs:
+ "mcs --version >/dev/null 2>/dev/null"
+ and (to exclude an unrelated 'mcs' program on QNX 6)
+ "mcs --version 2>/dev/null | grep Mono >/dev/null" */
+ char *argv[3];
+ pid_t child;
+ int fd[1];
+ int exitstatus;
+
+ argv[0] = "mcs";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ child = create_pipe_in ("mcs", "mcs", argv, DEV_NULL, true, true, false,
+ fd);
+ mcs_present = false;
+ if (child != -1)
+ {
+ /* Read the subprocess output, and test whether it contains the
+ string "Mono". */
+ char c[4];
+ size_t count = 0;
+
+ while (safe_read (fd[0], &c[count], 1) > 0)
+ {
+ count++;
+ if (count == 4)
+ {
+ if (memcmp (c, "Mono", 4) == 0)
+ mcs_present = true;
+ c[0] = c[1]; c[1] = c[2]; c[2] = c[3];
+ count--;
+ }
+ }
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list, and retrieve exit
+ status. */
+ exitstatus =
+ wait_subprocess (child, "mcs", false, true, true, false, NULL);
+ if (exitstatus != 0)
+ mcs_present = false;
+ }
+ mcs_tested = true;
+ }
+
+ if (mcs_present)
+ {
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ pid_t child;
+ int fd[1];
+ FILE *fp;
+ char *line[2];
+ size_t linesize[2];
+ size_t linelen[2];
+ unsigned int l;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + (output_is_library ? 1 : 0) + 1 + libdirs_count + libraries_count
+ + (debug ? 1 : 0) + sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "mcs";
+ if (output_is_library)
+ *argp++ = "-target:library";
+ {
+ char *option = (char *) xmalloca (5 + strlen (output_file) + 1);
+ memcpy (option, "-out:", 5);
+ strcpy (option + 5, output_file);
+ *argp++ = option;
+ }
+ for (i = 0; i < libdirs_count; i++)
+ {
+ char *option = (char *) xmalloca (5 + strlen (libdirs[i]) + 1);
+ memcpy (option, "-lib:", 5);
+ strcpy (option + 5, libdirs[i]);
+ *argp++ = option;
+ }
+ for (i = 0; i < libraries_count; i++)
+ {
+ char *option = (char *) xmalloca (11 + strlen (libraries[i]) + 4 + 1);
+ memcpy (option, "-reference:", 11);
+ memcpy (option + 11, libraries[i], strlen (libraries[i]));
+ strcpy (option + 11 + strlen (libraries[i]), ".dll");
+ *argp++ = option;
+ }
+ if (debug)
+ *argp++ = "-debug";
+ for (i = 0; i < sources_count; i++)
+ {
+ const char *source_file = sources[i];
+ if (strlen (source_file) >= 10
+ && memcmp (source_file + strlen (source_file) - 10, ".resources",
+ 10) == 0)
+ {
+ char *option = (char *) xmalloca (10 + strlen (source_file) + 1);
+
+ memcpy (option, "-resource:", 10);
+ strcpy (option + 10, source_file);
+ *argp++ = option;
+ }
+ else
+ *argp++ = (char *) source_file;
+ }
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ child = create_pipe_in ("mcs", "mcs", argv, NULL, false, true, true, fd);
+
+ /* Read the subprocess output, copying it to stderr. Drop the last
+ line if it starts with "Compilation succeeded". */
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ error (EXIT_FAILURE, errno, _("fdopen() failed"));
+ line[0] = NULL; linesize[0] = 0;
+ line[1] = NULL; linesize[1] = 0;
+ l = 0;
+ for (;;)
+ {
+ linelen[l] = getline (&line[l], &linesize[l], fp);
+ if (linelen[l] == (size_t)(-1))
+ break;
+ l = (l + 1) % 2;
+ if (line[l] != NULL)
+ fwrite (line[l], 1, linelen[l], stderr);
+ }
+ l = (l + 1) % 2;
+ if (line[l] != NULL
+ && !(linelen[l] >= 21
+ && memcmp (line[l], "Compilation succeeded", 21) == 0))
+ fwrite (line[l], 1, linelen[l], stderr);
+ if (line[0] != NULL)
+ free (line[0]);
+ if (line[1] != NULL)
+ free (line[1]);
+ fclose (fp);
+
+ /* Remove zombie process from process list, and retrieve exit status. */
+ exitstatus =
+ wait_subprocess (child, "mcs", false, false, true, true, NULL);
+
+ for (i = 1 + (output_is_library ? 1 : 0);
+ i < 1 + (output_is_library ? 1 : 0)
+ + 1 + libdirs_count + libraries_count;
+ i++)
+ freea (argv[i]);
+ for (i = 0; i < sources_count; i++)
+ if (argv[argc - sources_count + i] != sources[i])
+ freea (argv[argc - sources_count + i]);
+ freea (argv);
+
+ return (exitstatus != 0);
+ }
+ else
+ return -1;
+}
+
+static int
+compile_csharp_using_sscli (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file, bool output_is_library,
+ bool optimize, bool debug,
+ bool verbose)
+{
+ static bool csc_tested;
+ static bool csc_present;
+
+ if (!csc_tested)
+ {
+ /* Test for presence of csc:
+ "csc -help >/dev/null 2>/dev/null \
+ && ! { csc -help 2>/dev/null | grep -i chicken > /dev/null; }" */
+ char *argv[3];
+ pid_t child;
+ int fd[1];
+ int exitstatus;
+
+ argv[0] = "csc";
+ argv[1] = "-help";
+ argv[2] = NULL;
+ child = create_pipe_in ("csc", "csc", argv, DEV_NULL, true, true, false,
+ fd);
+ csc_present = false;
+ if (child != -1)
+ {
+ /* Read the subprocess output, and test whether it contains the
+ string "chicken". */
+ char c[7];
+ size_t count = 0;
+
+ csc_present = true;
+ while (safe_read (fd[0], &c[count], 1) > 0)
+ {
+ if (c[count] >= 'A' && c[count] <= 'Z')
+ c[count] += 'a' - 'A';
+ count++;
+ if (count == 7)
+ {
+ if (memcmp (c, "chicken", 7) == 0)
+ csc_present = false;
+ c[0] = c[1]; c[1] = c[2]; c[2] = c[3];
+ c[3] = c[4]; c[4] = c[5]; c[5] = c[6];
+ count--;
+ }
+ }
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list, and retrieve exit
+ status. */
+ exitstatus =
+ wait_subprocess (child, "csc", false, true, true, false, NULL);
+ if (exitstatus != 0)
+ csc_present = false;
+ }
+ csc_tested = true;
+ }
+
+ if (csc_present)
+ {
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + 1 + 1 + libdirs_count + libraries_count
+ + (optimize ? 1 : 0) + (debug ? 1 : 0) + sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "csc";
+ *argp++ =
+ (char *) (output_is_library ? "-target:library" : "-target:exe");
+ {
+ char *option = (char *) xmalloca (5 + strlen (output_file) + 1);
+ memcpy (option, "-out:", 5);
+ strcpy (option + 5, output_file);
+ *argp++ = option;
+ }
+ for (i = 0; i < libdirs_count; i++)
+ {
+ char *option = (char *) xmalloca (5 + strlen (libdirs[i]) + 1);
+ memcpy (option, "-lib:", 5);
+ strcpy (option + 5, libdirs[i]);
+ *argp++ = option;
+ }
+ for (i = 0; i < libraries_count; i++)
+ {
+ char *option = (char *) xmalloca (11 + strlen (libraries[i]) + 4 + 1);
+ memcpy (option, "-reference:", 11);
+ memcpy (option + 11, libraries[i], strlen (libraries[i]));
+ strcpy (option + 11 + strlen (libraries[i]), ".dll");
+ *argp++ = option;
+ }
+ if (optimize)
+ *argp++ = "-optimize+";
+ if (debug)
+ *argp++ = "-debug+";
+ for (i = 0; i < sources_count; i++)
+ {
+ const char *source_file = sources[i];
+ if (strlen (source_file) >= 10
+ && memcmp (source_file + strlen (source_file) - 10, ".resources",
+ 10) == 0)
+ {
+ char *option = (char *) xmalloca (10 + strlen (source_file) + 1);
+
+ memcpy (option, "-resource:", 10);
+ strcpy (option + 10, source_file);
+ *argp++ = option;
+ }
+ else
+ *argp++ = (char *) source_file;
+ }
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("csc", "csc", argv, false, false, false, false,
+ true, true, NULL);
+
+ for (i = 2; i < 3 + libdirs_count + libraries_count; i++)
+ freea (argv[i]);
+ for (i = 0; i < sources_count; i++)
+ if (argv[argc - sources_count + i] != sources[i])
+ freea (argv[argc - sources_count + i]);
+ freea (argv);
+
+ return (exitstatus != 0);
+ }
+ else
+ return -1;
+}
+
+bool
+compile_csharp_class (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file,
+ bool optimize, bool debug,
+ bool verbose)
+{
+ bool output_is_library =
+ (strlen (output_file) >= 4
+ && memcmp (output_file + strlen (output_file) - 4, ".dll", 4) == 0);
+ int result;
+
+ /* First try the C# implementation specified through --enable-csharp. */
+#if CSHARP_CHOICE_PNET
+ result = compile_csharp_using_pnet (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+#if CSHARP_CHOICE_MONO
+ result = compile_csharp_using_mono (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+ /* Then try the remaining C# implementations in our standard order. */
+#if !CSHARP_CHOICE_PNET
+ result = compile_csharp_using_pnet (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+#if !CSHARP_CHOICE_MONO
+ result = compile_csharp_using_mono (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+ result = compile_csharp_using_sscli (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+
+ error (0, 0, _("C# compiler not found, try installing pnet"));
+ return true;
+}
diff --git a/gnulib/lib/csharpcomp.h b/gnulib/lib/csharpcomp.h
new file mode 100644
index 00000000..31c614ef
--- /dev/null
+++ b/gnulib/lib/csharpcomp.h
@@ -0,0 +1,40 @@
+/* Compile a C# program.
+ Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+#ifndef _CSHARPCOMP_H
+#define _CSHARPCOMP_H
+
+#include <stdbool.h>
+
+/* Compile a set of C# source files to bytecode.
+ sources is an array of source file names, including resource files.
+ libdirs is a list of directories to be searched for libraries.
+ libraries is a list of libraries on which the program depends.
+ output_file is the name of the output file; it should end in .exe or .dll.
+ If verbose, the command to be executed will be printed.
+ Return false if OK, true on error. */
+extern bool compile_csharp_class (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file,
+ bool optimize, bool debug,
+ bool verbose);
+
+#endif /* _CSHARPCOMP_H */
diff --git a/gnulib/lib/csharpexec.c b/gnulib/lib/csharpexec.c
new file mode 100644
index 00000000..570b1545
--- /dev/null
+++ b/gnulib/lib/csharpexec.c
@@ -0,0 +1,345 @@
+/* Execute a C# program.
+ Copyright (C) 2003-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "csharpexec.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "execute.h"
+#include "sh-quote.h"
+#include "xmalloca.h"
+#include "error.h"
+#include "gettext.h"
+
+/* Handling of MONO_PATH is just like Java CLASSPATH. */
+#define CLASSPATHVAR "MONO_PATH"
+#define new_classpath new_monopath
+#define set_classpath set_monopath
+#define reset_classpath reset_monopath
+#include "classpath.h"
+#include "classpath.c"
+#undef reset_classpath
+#undef set_classpath
+#undef new_classpath
+#undef CLASSPATHVAR
+
+/* Handling of clix' PATH variable is just like Java CLASSPATH. */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+ /* Win32, Cygwin */
+ #define CLASSPATHVAR "PATH"
+#elif defined __APPLE__ && defined __MACH__
+ /* MacOS X */
+ #define CLASSPATHVAR "DYLD_LIBRARY_PATH"
+#else
+ /* Normal Unix */
+ #define CLASSPATHVAR "LD_LIBRARY_PATH"
+#endif
+#define new_classpath new_clixpath
+#define set_classpath set_clixpath
+#define reset_classpath reset_clixpath
+#include "classpath.h"
+#include "classpath.c"
+#undef reset_classpath
+#undef set_classpath
+#undef new_classpath
+#undef CLASSPATHVAR
+
+#define _(str) gettext (str)
+
+
+/* Survey of CIL interpreters.
+
+ Program from
+
+ ilrun pnet
+ mono mono
+ clix sscli
+
+ With Mono, the MONO_PATH is a colon separated list of pathnames. (On
+ Windows: semicolon separated list of pathnames.)
+
+ We try the CIL interpreters in the following order:
+ 1. "ilrun", because it is a completely free system.
+ 2. "mono", because it is a partially free system but doesn't integrate
+ well with Unix.
+ 3. "clix", although it is not free, because it is a kind of "reference
+ implementation" of C#.
+ But the order can be changed through the --enable-csharp configuration
+ option.
+ */
+
+static int
+execute_csharp_using_pnet (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args, unsigned int nargs,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ static bool ilrun_tested;
+ static bool ilrun_present;
+
+ if (!ilrun_tested)
+ {
+ /* Test for presence of ilrun:
+ "ilrun --version >/dev/null 2>/dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "ilrun";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ exitstatus = execute ("ilrun", "ilrun", argv, false, false, true, true,
+ true, false, NULL);
+ ilrun_present = (exitstatus == 0);
+ ilrun_tested = true;
+ }
+
+ if (ilrun_present)
+ {
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ unsigned int i;
+ bool err;
+
+ argc = 1 + 2 * libdirs_count + 1 + nargs;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "ilrun";
+ for (i = 0; i < libdirs_count; i++)
+ {
+ *argp++ = "-L";
+ *argp++ = (char *) libdirs[i];
+ }
+ *argp++ = (char *) assembly_path;
+ for (i = 0; i < nargs; i++)
+ *argp++ = (char *) args[i];
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("ilrun", "ilrun", argv, private_data);
+
+ freea (argv);
+
+ return err;
+ }
+ else
+ return -1;
+}
+
+static int
+execute_csharp_using_mono (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args, unsigned int nargs,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ static bool mono_tested;
+ static bool mono_present;
+
+ if (!mono_tested)
+ {
+ /* Test for presence of mono:
+ "mono --version >/dev/null 2>/dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "mono";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ exitstatus = execute ("mono", "mono", argv, false, false, true, true,
+ true, false, NULL);
+ mono_present = (exitstatus == 0);
+ mono_tested = true;
+ }
+
+ if (mono_present)
+ {
+ char *old_monopath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+ bool err;
+
+ /* Set MONO_PATH. */
+ old_monopath = set_monopath (libdirs, libdirs_count, false, verbose);
+
+ argv[0] = "mono";
+ argv[1] = (char *) assembly_path;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("mono", "mono", argv, private_data);
+
+ /* Reset MONO_PATH. */
+ reset_monopath (old_monopath);
+
+ freea (argv);
+
+ return err;
+ }
+ else
+ return -1;
+}
+
+static int
+execute_csharp_using_sscli (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args, unsigned int nargs,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ static bool clix_tested;
+ static bool clix_present;
+
+ if (!clix_tested)
+ {
+ /* Test for presence of clix:
+ "clix >/dev/null 2>/dev/null ; test $? = 1" */
+ char *argv[2];
+ int exitstatus;
+
+ argv[0] = "clix";
+ argv[1] = NULL;
+ exitstatus = execute ("clix", "clix", argv, false, false, true, true,
+ true, false, NULL);
+ clix_present = (exitstatus == 0 || exitstatus == 1);
+ clix_tested = true;
+ }
+
+ if (clix_present)
+ {
+ char *old_clixpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+ bool err;
+
+ /* Set clix' PATH variable. */
+ old_clixpath = set_clixpath (libdirs, libdirs_count, false, verbose);
+
+ argv[0] = "clix";
+ argv[1] = (char *) assembly_path;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("clix", "clix", argv, private_data);
+
+ /* Reset clix' PATH variable. */
+ reset_clixpath (old_clixpath);
+
+ freea (argv);
+
+ return err;
+ }
+ else
+ return -1;
+}
+
+bool
+execute_csharp_program (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ unsigned int nargs;
+ int result;
+
+ /* Count args. */
+ {
+ const char * const *arg;
+
+ for (nargs = 0, arg = args; *arg != NULL; nargs++, arg++)
+ ;
+ }
+
+ /* First try the C# implementation specified through --enable-csharp. */
+#if CSHARP_CHOICE_PNET
+ result = execute_csharp_using_pnet (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+#if CSHARP_CHOICE_MONO
+ result = execute_csharp_using_mono (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+ /* Then try the remaining C# implementations in our standard order. */
+#if !CSHARP_CHOICE_PNET
+ result = execute_csharp_using_pnet (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+#if !CSHARP_CHOICE_MONO
+ result = execute_csharp_using_mono (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+ result = execute_csharp_using_sscli (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+
+ if (!quiet)
+ error (0, 0, _("C# virtual machine not found, try installing pnet"));
+ return true;
+}
diff --git a/gnulib/lib/csharpexec.h b/gnulib/lib/csharpexec.h
new file mode 100644
index 00000000..4a3cb32e
--- /dev/null
+++ b/gnulib/lib/csharpexec.h
@@ -0,0 +1,43 @@
+/* Execute a C# program.
+ Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+#ifndef _CSHARPEXEC_H
+#define _CSHARPEXEC_H
+
+#include <stdbool.h>
+
+typedef bool execute_fn (const char *progname,
+ const char *prog_path, char **prog_argv,
+ void *private_data);
+
+/* Execute a C# program.
+ assembly_path is the assembly's pathname (= program name with .exe).
+ libdirs is a list of directories to be searched for libraries.
+ args is a NULL terminated list of arguments to be passed to the program.
+ If verbose, the command to be executed will be printed.
+ Then the command is passed to the execute function together with the
+ private_data argument. This function returns false if OK, true on error.
+ Return false if OK, true on error.
+ If quiet, error messages will not be printed. */
+extern bool execute_csharp_program (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data);
+
+#endif /* _CSHARPEXEC_H */
diff --git a/gnulib/lib/ctype.in.h b/gnulib/lib/ctype.in.h
new file mode 100644
index 00000000..c9b1063c
--- /dev/null
+++ b/gnulib/lib/ctype.in.h
@@ -0,0 +1,55 @@
+/* A substitute for ISO C99 <ctype.h>, for platforms on which it is incomplete.
+
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible. */
+
+/*
+ * ISO C 99 <ctype.h> for platforms on which it is incomplete.
+ * <http://www.opengroup.org/onlinepubs/9699919799/basedefs/ctype.h.html>
+ */
+
+#ifndef _GL_CTYPE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* Include the original <ctype.h>. */
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_CTYPE_H@
+
+#ifndef _GL_CTYPE_H
+#define _GL_CTYPE_H
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Return non-zero if c is a blank, i.e. a space or tab character. */
+#if @GNULIB_ISBLANK@
+# if !@HAVE_ISBLANK@
+extern int isblank (int c);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef isblank
+# if HAVE_RAW_DECL_ISBLANK
+_GL_WARN_ON_USE (isblank, "isblank is unportable - "
+ "use gnulib module isblank for portability");
+# endif
+#endif
+
+#endif /* _GL_CTYPE_H */
+#endif /* _GL_CTYPE_H */
diff --git a/gnulib/lib/cycle-check.c b/gnulib/lib/cycle-check.c
new file mode 100644
index 00000000..2f31cb9f
--- /dev/null
+++ b/gnulib/lib/cycle-check.c
@@ -0,0 +1,85 @@
+/* help detect directory cycles efficiently
+
+ Copyright (C) 2003-2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+
+#include <stdbool.h>
+
+#include "cycle-check.h"
+
+#define CC_MAGIC 9827862
+
+/* Return true if I is a power of 2, or is zero. */
+
+static inline bool
+is_zero_or_power_of_two (uintmax_t i)
+{
+ return (i & (i - 1)) == 0;
+}
+
+void
+cycle_check_init (struct cycle_check_state *state)
+{
+ state->chdir_counter = 0;
+ state->magic = CC_MAGIC;
+}
+
+/* In traversing a directory hierarchy, call this function once for each
+ descending chdir call, with SB corresponding to the chdir operand.
+ If SB corresponds to a directory that has already been seen,
+ return true to indicate that there is a directory cycle.
+ Note that this is done `lazily', which means that some of
+ the directories in the cycle may be processed twice before
+ the cycle is detected. */
+
+bool
+cycle_check (struct cycle_check_state *state, struct stat const *sb)
+{
+ assert (state->magic == CC_MAGIC);
+
+ /* If the current directory ever happens to be the same
+ as the one we last recorded for the cycle detection,
+ then it's obviously part of a cycle. */
+ if (state->chdir_counter && SAME_INODE (*sb, state->dev_ino))
+ return true;
+
+ /* If the number of `descending' chdir calls is a power of two,
+ record the dev/ino of the current directory. */
+ if (is_zero_or_power_of_two (++(state->chdir_counter)))
+ {
+ /* On all architectures that we know about, if the counter
+ overflows then there is a directory cycle here somewhere,
+ even if we haven't detected it yet. Typically this happens
+ only after the counter is incremented 2**64 times, so it's a
+ fairly theoretical point. */
+ if (state->chdir_counter == 0)
+ return true;
+
+ state->dev_ino.st_dev = sb->st_dev;
+ state->dev_ino.st_ino = sb->st_ino;
+ }
+
+ return false;
+}
diff --git a/gnulib/lib/cycle-check.h b/gnulib/lib/cycle-check.h
new file mode 100644
index 00000000..546f56b8
--- /dev/null
+++ b/gnulib/lib/cycle-check.h
@@ -0,0 +1,52 @@
+/* help detect directory cycles efficiently
+
+ Copyright (C) 2003-2004, 2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering */
+
+#ifndef CYCLE_CHECK_H
+# define CYCLE_CHECK_H 1
+
+# include <stdint.h>
+# include <stdbool.h>
+# include "dev-ino.h"
+# include "same-inode.h"
+
+struct cycle_check_state
+{
+ struct dev_ino dev_ino;
+ uintmax_t chdir_counter;
+ int magic;
+};
+
+void cycle_check_init (struct cycle_check_state *state);
+bool cycle_check (struct cycle_check_state *state, struct stat const *sb);
+
+# define CYCLE_CHECK_REFLECT_CHDIR_UP(State, SB_dir, SB_subdir) \
+ do \
+ { \
+ /* You must call cycle_check at least once before using this macro. */ \
+ if ((State)->chdir_counter == 0) \
+ abort (); \
+ if (SAME_INODE ((State)->dev_ino, SB_subdir)) \
+ { \
+ (State)->dev_ino.st_dev = (SB_dir).st_dev; \
+ (State)->dev_ino.st_ino = (SB_dir).st_ino; \
+ } \
+ } \
+ while (0)
+
+#endif
diff --git a/gnulib/lib/des.c b/gnulib/lib/des.c
new file mode 100644
index 00000000..331e8353
--- /dev/null
+++ b/gnulib/lib/des.c
@@ -0,0 +1,669 @@
+/* des.c --- DES and Triple-DES encryption/decryption Algorithm
+ * Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009,
+ * 2010 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson, based on Libgcrypt. */
+
+/*
+ * For a description of triple encryption, see:
+ * Bruce Schneier: Applied Cryptography. Second Edition.
+ * John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff.
+ * This implementation is according to the definition of DES in FIPS
+ * PUB 46-2 from December 1993.
+ *
+ * Written by Michael Roth <mroth@nessie.de>, September 1998
+ */
+
+/*
+ * U S A G E
+ * ===========
+ *
+ * For DES or Triple-DES encryption/decryption you must initialize a proper
+ * encryption context with a key.
+ *
+ * A DES key is 64bit wide but only 56bits of the key are used. The remaining
+ * bits are parity bits and they will _not_ checked in this implementation, but
+ * simply ignored.
+ *
+ * For Triple-DES you could use either two 64bit keys or three 64bit keys.
+ * The parity bits will _not_ checked, too.
+ *
+ * After initializing a context with a key you could use this context to
+ * encrypt or decrypt data in 64bit blocks in Electronic Codebook Mode.
+ *
+ * DES Example
+ * -----------
+ * unsigned char key[8];
+ * unsigned char plaintext[8];
+ * unsigned char ciphertext[8];
+ * unsigned char recoverd[8];
+ * gl_des_ctx context;
+ *
+ * // Fill 'key' and 'plaintext' with some data
+ * ....
+ *
+ * // Set up the DES encryption context
+ * gl_des_setkey(&context, key);
+ *
+ * // Encrypt the plaintext
+ * des_ecb_encrypt(&context, plaintext, ciphertext);
+ *
+ * // To recover the orginal plaintext from ciphertext use:
+ * des_ecb_decrypt(&context, ciphertext, recoverd);
+ *
+ *
+ * Triple-DES Example
+ * ------------------
+ * unsigned char key1[8];
+ * unsigned char key2[8];
+ * unsigned char key3[8];
+ * unsigned char plaintext[8];
+ * unsigned char ciphertext[8];
+ * unsigned char recoverd[8];
+ * gl_3des_ctx context;
+ *
+ * // If you would like to use two 64bit keys, fill 'key1' and'key2'
+ * // then setup the encryption context:
+ * gl_3des_set2keys(&context, key1, key2);
+ *
+ * // To use three 64bit keys with Triple-DES use:
+ * gl_3des_set3keys(&context, key1, key2, key3);
+ *
+ * // Encrypting plaintext with Triple-DES
+ * gl_3des_ecb_encrypt(&context, plaintext, ciphertext);
+ *
+ * // Decrypting ciphertext to recover the plaintext with Triple-DES
+ * gl_3des_ecb_decrypt(&context, ciphertext, recoverd);
+ */
+
+
+#include <config.h>
+
+#include "des.h"
+
+#include <stdio.h>
+#include <string.h> /* memcpy, memcmp */
+
+/*
+ * The s-box values are permuted according to the 'primitive function P'
+ * and are rotated one bit to the left.
+ */
+static const uint32_t sbox1[64] = {
+ 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404,
+ 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400,
+ 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400,
+ 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
+ 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404,
+ 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000,
+ 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000,
+ 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
+ 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404,
+ 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000,
+ 0x00010004, 0x00010400, 0x00000000, 0x01010004
+};
+
+static const uint32_t sbox2[64] = {
+ 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020,
+ 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000,
+ 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020,
+ 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
+ 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000,
+ 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000,
+ 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000,
+ 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
+ 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020,
+ 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020,
+ 0x80000000, 0x80100020, 0x80108020, 0x00108000
+};
+
+static const uint32_t sbox3[64] = {
+ 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000,
+ 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000,
+ 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008,
+ 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
+ 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208,
+ 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208,
+ 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008,
+ 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
+ 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208,
+ 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000,
+ 0x00020208, 0x00000008, 0x08020008, 0x00020200
+};
+
+static const uint32_t sbox4[64] = {
+ 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081,
+ 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081,
+ 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000,
+ 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
+ 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080,
+ 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081,
+ 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080,
+ 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
+ 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001,
+ 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001,
+ 0x00000080, 0x00800000, 0x00002000, 0x00802080
+};
+
+static const uint32_t sbox5[64] = {
+ 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100,
+ 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100,
+ 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000,
+ 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
+ 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000,
+ 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000,
+ 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000,
+ 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
+ 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000,
+ 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000,
+ 0x00000000, 0x40080000, 0x02080100, 0x40000100
+};
+
+static const uint32_t sbox6[64] = {
+ 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010,
+ 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010,
+ 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010,
+ 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
+ 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000,
+ 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000,
+ 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000,
+ 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
+ 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000,
+ 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000,
+ 0x20404000, 0x20000000, 0x00400010, 0x20004010
+};
+
+static const uint32_t sbox7[64] = {
+ 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802,
+ 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002,
+ 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802,
+ 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
+ 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002,
+ 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802,
+ 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000,
+ 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
+ 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000,
+ 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800,
+ 0x04000002, 0x04000800, 0x00000800, 0x00200002
+};
+
+static const uint32_t sbox8[64] = {
+ 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040,
+ 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000,
+ 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040,
+ 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
+ 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000,
+ 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000,
+ 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040,
+ 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
+ 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000,
+ 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040,
+ 0x00001040, 0x00040040, 0x10000000, 0x10041000
+};
+
+/*
+ * These two tables are part of the 'permuted choice 1' function.
+ * In this implementation several speed improvements are done.
+ */
+static const uint32_t leftkey_swap[16] = {
+ 0x00000000, 0x00000001, 0x00000100, 0x00000101,
+ 0x00010000, 0x00010001, 0x00010100, 0x00010101,
+ 0x01000000, 0x01000001, 0x01000100, 0x01000101,
+ 0x01010000, 0x01010001, 0x01010100, 0x01010101
+};
+
+static const uint32_t rightkey_swap[16] = {
+ 0x00000000, 0x01000000, 0x00010000, 0x01010000,
+ 0x00000100, 0x01000100, 0x00010100, 0x01010100,
+ 0x00000001, 0x01000001, 0x00010001, 0x01010001,
+ 0x00000101, 0x01000101, 0x00010101, 0x01010101,
+};
+
+/*
+ * Numbers of left shifts per round for encryption subkeys. To
+ * calculate the decryption subkeys we just reverse the ordering of
+ * the calculated encryption subkeys, so there is no need for a
+ * decryption rotate tab.
+ */
+static const unsigned char encrypt_rotate_tab[16] = {
+ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
+};
+
+/*
+ * Table with weak DES keys sorted in ascending order. In DES there
+ * are 64 known keys which are weak. They are weak because they
+ * produce only one, two or four different subkeys in the subkey
+ * scheduling process. The keys in this table have all their parity
+ * bits cleared.
+ */
+static const unsigned char weak_keys[64][8] = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*w */
+ {0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e},
+ {0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0},
+ {0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe},
+ {0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e}, /*sw */
+ {0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00},
+ {0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe},
+ {0x00, 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0},
+ {0x00, 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0}, /*sw */
+ {0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe},
+ {0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00},
+ {0x00, 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e},
+ {0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe}, /*sw */
+ {0x00, 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0},
+ {0x00, 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e},
+ {0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00},
+ {0x1e, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 0x0e},
+ {0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e, 0x00}, /*sw */
+ {0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0, 0xfe},
+ {0x1e, 0x00, 0xfe, 0xe0, 0x0e, 0x00, 0xfe, 0xf0},
+ {0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00},
+ {0x1e, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0e, 0x0e}, /*w */
+ {0x1e, 0x1e, 0xe0, 0xe0, 0x0e, 0x0e, 0xf0, 0xf0},
+ {0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe, 0xfe},
+ {0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00, 0xfe},
+ {0x1e, 0xe0, 0x1e, 0xe0, 0x0e, 0xf0, 0x0e, 0xf0}, /*sw */
+ {0x1e, 0xe0, 0xe0, 0x1e, 0x0e, 0xf0, 0xf0, 0x0e},
+ {0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe, 0x00},
+ {0x1e, 0xfe, 0x00, 0xe0, 0x0e, 0xfe, 0x00, 0xf0},
+ {0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe}, /*sw */
+ {0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0, 0x00},
+ {0x1e, 0xfe, 0xfe, 0x1e, 0x0e, 0xfe, 0xfe, 0x0e},
+ {0xe0, 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x00, 0xf0},
+ {0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e, 0xfe},
+ {0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0, 0x00}, /*sw */
+ {0xe0, 0x00, 0xfe, 0x1e, 0xf0, 0x00, 0xfe, 0x0e},
+ {0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00, 0xfe},
+ {0xe0, 0x1e, 0x1e, 0xe0, 0xf0, 0x0e, 0x0e, 0xf0},
+ {0xe0, 0x1e, 0xe0, 0x1e, 0xf0, 0x0e, 0xf0, 0x0e}, /*sw */
+ {0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe, 0x00},
+ {0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00},
+ {0xe0, 0xe0, 0x1e, 0x1e, 0xf0, 0xf0, 0x0e, 0x0e},
+ {0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0}, /*w */
+ {0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe, 0xfe},
+ {0xe0, 0xfe, 0x00, 0x1e, 0xf0, 0xfe, 0x00, 0x0e},
+ {0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e, 0x00},
+ {0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe}, /*sw */
+ {0xe0, 0xfe, 0xfe, 0xe0, 0xf0, 0xfe, 0xfe, 0xf0},
+ {0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe},
+ {0xfe, 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0},
+ {0xfe, 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e},
+ {0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00}, /*sw */
+ {0xfe, 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0},
+ {0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe},
+ {0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00},
+ {0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e}, /*sw */
+ {0xfe, 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e},
+ {0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00},
+ {0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe},
+ {0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0}, /*sw */
+ {0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00},
+ {0xfe, 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e},
+ {0xfe, 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0},
+ {0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe} /*w */
+};
+
+bool
+gl_des_is_weak_key (const char * key)
+{
+ char work[8];
+ int i, left, right, middle, cmp_result;
+
+ /* clear parity bits */
+ for (i = 0; i < 8; ++i)
+ work[i] = ((unsigned char)key[i]) & 0xfe;
+
+ /* binary search in the weak key table */
+ left = 0;
+ right = 63;
+ while (left <= right)
+ {
+ middle = (left + right) / 2;
+
+ if (!(cmp_result = memcmp (work, weak_keys[middle], 8)))
+ return -1;
+
+ if (cmp_result > 0)
+ left = middle + 1;
+ else
+ right = middle - 1;
+ }
+
+ return 0;
+}
+
+/*
+ * Macro to swap bits across two words.
+ */
+#define DO_PERMUTATION(a, temp, b, offset, mask) \
+ temp = ((a>>offset) ^ b) & mask; \
+ b ^= temp; \
+ a ^= temp<<offset;
+
+
+/*
+ * This performs the 'initial permutation' of the data to be encrypted
+ * or decrypted. Additionally the resulting two words are rotated one bit
+ * to the left.
+ */
+#define INITIAL_PERMUTATION(left, temp, right) \
+ DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) \
+ DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \
+ DO_PERMUTATION(right, temp, left, 2, 0x33333333) \
+ DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \
+ right = (right << 1) | (right >> 31); \
+ temp = (left ^ right) & 0xaaaaaaaa; \
+ right ^= temp; \
+ left ^= temp; \
+ left = (left << 1) | (left >> 31);
+
+/*
+ * The 'inverse initial permutation'.
+ */
+#define FINAL_PERMUTATION(left, temp, right) \
+ left = (left << 31) | (left >> 1); \
+ temp = (left ^ right) & 0xaaaaaaaa; \
+ left ^= temp; \
+ right ^= temp; \
+ right = (right << 31) | (right >> 1); \
+ DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \
+ DO_PERMUTATION(right, temp, left, 2, 0x33333333) \
+ DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \
+ DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)
+
+
+/*
+ * A full DES round including 'expansion function', 'sbox substitution'
+ * and 'primitive function P' but without swapping the left and right word.
+ * Please note: The data in 'from' and 'to' is already rotated one bit to
+ * the left, done in the initial permutation.
+ */
+#define DES_ROUND(from, to, work, subkey) \
+ work = from ^ *subkey++; \
+ to ^= sbox8[ work & 0x3f ]; \
+ to ^= sbox6[ (work>>8) & 0x3f ]; \
+ to ^= sbox4[ (work>>16) & 0x3f ]; \
+ to ^= sbox2[ (work>>24) & 0x3f ]; \
+ work = ((from << 28) | (from >> 4)) ^ *subkey++; \
+ to ^= sbox7[ work & 0x3f ]; \
+ to ^= sbox5[ (work>>8) & 0x3f ]; \
+ to ^= sbox3[ (work>>16) & 0x3f ]; \
+ to ^= sbox1[ (work>>24) & 0x3f ];
+
+/*
+ * Macros to convert 8 bytes from/to 32bit words.
+ */
+#define READ_64BIT_DATA(data, left, right) \
+ left = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; \
+ right = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
+
+#define WRITE_64BIT_DATA(data, left, right) \
+ data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff; \
+ data[2] = (left >> 8) &0xff; data[3] = left &0xff; \
+ data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff; \
+ data[6] = (right >> 8) &0xff; data[7] = right &0xff;
+
+/*
+ * des_key_schedule(): Calculate 16 subkeys pairs (even/odd) for
+ * 16 encryption rounds.
+ * To calculate subkeys for decryption the caller
+ * have to reorder the generated subkeys.
+ *
+ * rawkey: 8 Bytes of key data
+ * subkey: Array of at least 32 uint32_ts. Will be filled
+ * with calculated subkeys.
+ *
+ */
+static void
+des_key_schedule (const char * _rawkey, uint32_t * subkey)
+{
+ const unsigned char *rawkey = (const unsigned char *) _rawkey;
+ uint32_t left, right, work;
+ int round;
+
+ READ_64BIT_DATA (rawkey, left, right)
+ DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f)
+ DO_PERMUTATION (right, work, left, 0, 0x10101010)
+ left = ((leftkey_swap[(left >> 0) & 0xf] << 3)
+ | (leftkey_swap[(left >> 8) & 0xf] << 2)
+ | (leftkey_swap[(left >> 16) & 0xf] << 1)
+ | (leftkey_swap[(left >> 24) & 0xf])
+ | (leftkey_swap[(left >> 5) & 0xf] << 7)
+ | (leftkey_swap[(left >> 13) & 0xf] << 6)
+ | (leftkey_swap[(left >> 21) & 0xf] << 5)
+ | (leftkey_swap[(left >> 29) & 0xf] << 4));
+
+ left &= 0x0fffffff;
+
+ right = ((rightkey_swap[(right >> 1) & 0xf] << 3)
+ | (rightkey_swap[(right >> 9) & 0xf] << 2)
+ | (rightkey_swap[(right >> 17) & 0xf] << 1)
+ | (rightkey_swap[(right >> 25) & 0xf])
+ | (rightkey_swap[(right >> 4) & 0xf] << 7)
+ | (rightkey_swap[(right >> 12) & 0xf] << 6)
+ | (rightkey_swap[(right >> 20) & 0xf] << 5)
+ | (rightkey_swap[(right >> 28) & 0xf] << 4));
+
+ right &= 0x0fffffff;
+
+ for (round = 0; round < 16; ++round)
+ {
+ left = ((left << encrypt_rotate_tab[round])
+ | (left >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
+ right = ((right << encrypt_rotate_tab[round])
+ | (right >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
+
+ *subkey++ = (((left << 4) & 0x24000000)
+ | ((left << 28) & 0x10000000)
+ | ((left << 14) & 0x08000000)
+ | ((left << 18) & 0x02080000)
+ | ((left << 6) & 0x01000000)
+ | ((left << 9) & 0x00200000)
+ | ((left >> 1) & 0x00100000)
+ | ((left << 10) & 0x00040000)
+ | ((left << 2) & 0x00020000)
+ | ((left >> 10) & 0x00010000)
+ | ((right >> 13) & 0x00002000)
+ | ((right >> 4) & 0x00001000)
+ | ((right << 6) & 0x00000800)
+ | ((right >> 1) & 0x00000400)
+ | ((right >> 14) & 0x00000200)
+ | (right & 0x00000100)
+ | ((right >> 5) & 0x00000020)
+ | ((right >> 10) & 0x00000010)
+ | ((right >> 3) & 0x00000008)
+ | ((right >> 18) & 0x00000004)
+ | ((right >> 26) & 0x00000002)
+ | ((right >> 24) & 0x00000001));
+
+ *subkey++ = (((left << 15) & 0x20000000)
+ | ((left << 17) & 0x10000000)
+ | ((left << 10) & 0x08000000)
+ | ((left << 22) & 0x04000000)
+ | ((left >> 2) & 0x02000000)
+ | ((left << 1) & 0x01000000)
+ | ((left << 16) & 0x00200000)
+ | ((left << 11) & 0x00100000)
+ | ((left << 3) & 0x00080000)
+ | ((left >> 6) & 0x00040000)
+ | ((left << 15) & 0x00020000)
+ | ((left >> 4) & 0x00010000)
+ | ((right >> 2) & 0x00002000)
+ | ((right << 8) & 0x00001000)
+ | ((right >> 14) & 0x00000808)
+ | ((right >> 9) & 0x00000400)
+ | ((right) & 0x00000200)
+ | ((right << 7) & 0x00000100)
+ | ((right >> 7) & 0x00000020)
+ | ((right >> 3) & 0x00000011)
+ | ((right << 2) & 0x00000004)
+ | ((right >> 21) & 0x00000002));
+ }
+}
+
+void
+gl_des_setkey (gl_des_ctx *ctx, const char * key)
+{
+ int i;
+
+ des_key_schedule (key, ctx->encrypt_subkeys);
+
+ for (i = 0; i < 32; i += 2)
+ {
+ ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30 - i];
+ ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[31 - i];
+ }
+}
+
+bool
+gl_des_makekey (gl_des_ctx *ctx, const char * key, size_t keylen)
+{
+ if (keylen != 8)
+ return false;
+
+ gl_des_setkey (ctx, key);
+
+ return !gl_des_is_weak_key (key);
+}
+
+void
+gl_des_ecb_crypt (gl_des_ctx *ctx, const char * _from, char * _to, int mode)
+{
+ const unsigned char *from = (const unsigned char *) _from;
+ unsigned char *to = (unsigned char *) _to;
+ uint32_t left, right, work;
+ uint32_t *keys;
+
+ keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
+
+ READ_64BIT_DATA (from, left, right)
+ INITIAL_PERMUTATION (left, work, right)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ FINAL_PERMUTATION (right, work, left)
+ WRITE_64BIT_DATA (to, right, left)
+}
+
+void
+gl_3des_set2keys (gl_3des_ctx *ctx, const char * key1, const char * key2)
+{
+ int i;
+
+ des_key_schedule (key1, ctx->encrypt_subkeys);
+ des_key_schedule (key2, &(ctx->decrypt_subkeys[32]));
+
+ for (i = 0; i < 32; i += 2)
+ {
+ ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30 - i];
+ ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[31 - i];
+
+ ctx->encrypt_subkeys[i + 32] = ctx->decrypt_subkeys[62 - i];
+ ctx->encrypt_subkeys[i + 33] = ctx->decrypt_subkeys[63 - i];
+
+ ctx->encrypt_subkeys[i + 64] = ctx->encrypt_subkeys[i];
+ ctx->encrypt_subkeys[i + 65] = ctx->encrypt_subkeys[i + 1];
+
+ ctx->decrypt_subkeys[i + 64] = ctx->decrypt_subkeys[i];
+ ctx->decrypt_subkeys[i + 65] = ctx->decrypt_subkeys[i + 1];
+ }
+}
+
+void
+gl_3des_set3keys (gl_3des_ctx *ctx, const char * key1,
+ const char * key2, const char * key3)
+{
+ int i;
+
+ des_key_schedule (key1, ctx->encrypt_subkeys);
+ des_key_schedule (key2, &(ctx->decrypt_subkeys[32]));
+ des_key_schedule (key3, &(ctx->encrypt_subkeys[64]));
+
+ for (i = 0; i < 32; i += 2)
+ {
+ ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[94 - i];
+ ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[95 - i];
+
+ ctx->encrypt_subkeys[i + 32] = ctx->decrypt_subkeys[62 - i];
+ ctx->encrypt_subkeys[i + 33] = ctx->decrypt_subkeys[63 - i];
+
+ ctx->decrypt_subkeys[i + 64] = ctx->encrypt_subkeys[30 - i];
+ ctx->decrypt_subkeys[i + 65] = ctx->encrypt_subkeys[31 - i];
+ }
+}
+
+void
+gl_3des_ecb_crypt (gl_3des_ctx *ctx,
+ const char * _from,
+ char * _to, int mode)
+{
+ const unsigned char *from = (const unsigned char *) _from;
+ unsigned char *to = (unsigned char *) _to;
+ uint32_t left, right, work;
+ uint32_t *keys;
+
+ keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
+
+ READ_64BIT_DATA (from, left, right)
+ INITIAL_PERMUTATION (left, work, right)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ FINAL_PERMUTATION (right, work, left)
+ WRITE_64BIT_DATA (to, right, left)
+}
+
+bool
+gl_3des_makekey (gl_3des_ctx *ctx, const char * key, size_t keylen)
+{
+ if (keylen != 24)
+ return false;
+
+ gl_3des_set3keys (ctx, key, key + 8, key + 16);
+
+ return !(gl_des_is_weak_key (key)
+ || gl_des_is_weak_key (key + 8)
+ || gl_des_is_weak_key (key + 16));
+}
diff --git a/gnulib/lib/des.h b/gnulib/lib/des.h
new file mode 100644
index 00000000..2622ad16
--- /dev/null
+++ b/gnulib/lib/des.h
@@ -0,0 +1,121 @@
+/* des.h --- DES cipher implementation.
+ * Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson, based on Libgcrypt. */
+
+#ifndef DES_H
+# define DES_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+/*
+ * Encryption/Decryption context of DES
+ */
+typedef struct
+{
+ uint32_t encrypt_subkeys[32];
+ uint32_t decrypt_subkeys[32];
+} gl_des_ctx;
+
+/*
+ * Encryption/Decryption context of Triple-DES
+ */
+typedef struct
+{
+ uint32_t encrypt_subkeys[96];
+ uint32_t decrypt_subkeys[96];
+} gl_3des_ctx;
+
+/* Check whether the 8 byte key is weak. Does not check the parity
+ * bits of the key but simple ignore them. */
+extern bool
+gl_des_is_weak_key (const char * key);
+
+/*
+ * DES
+ * ---
+ */
+
+/* Fill a DES context CTX with subkeys calculated from 64bit KEY.
+ * Does not check parity bits, but simply ignore them. Does not check
+ * for weak keys. */
+extern void
+gl_des_setkey (gl_des_ctx *ctx, const char * key);
+
+/* Fill a DES context CTX with subkeys calculated from 64bit KEY, with
+ * weak key checking. Does not check parity bits, but simply ignore
+ * them. */
+extern bool
+gl_des_makekey (gl_des_ctx *ctx, const char * key, size_t keylen);
+
+/* Electronic Codebook Mode DES encryption/decryption of data
+ * according to 'mode'. */
+extern void
+gl_des_ecb_crypt (gl_des_ctx *ctx, const char * from, char * to, int mode);
+
+#define gl_des_ecb_encrypt(ctx, from, to) gl_des_ecb_crypt(ctx, from, to, 0)
+#define gl_des_ecb_decrypt(ctx, from, to) gl_des_ecb_crypt(ctx, from, to, 1)
+
+/* Triple-DES
+ * ----------
+ */
+
+/* Fill a Triple-DES context CTX with subkeys calculated from two
+ * 64bit keys in KEY1 and KEY2. Does not check the parity bits of the
+ * keys, but simply ignore them. Does not check for weak keys. */
+extern void
+gl_3des_set2keys (gl_3des_ctx *ctx,
+ const char * key1,
+ const char * key2);
+
+/*
+ * Fill a Triple-DES context CTX with subkeys calculated from three
+ * 64bit keys in KEY1, KEY2 and KEY3. Does not check the parity bits
+ * of the keys, but simply ignore them. Does not check for weak
+ * keys. */
+extern void
+gl_3des_set3keys (gl_3des_ctx *ctx,
+ const char * key1,
+ const char * key2,
+ const char * key3);
+
+/* Fill a Triple-DES context CTX with subkeys calculated from three
+ * concatenated 64bit keys in KEY, with weak key checking. Does not
+ * check the parity bits of the keys, but simply ignore them. */
+extern bool
+gl_3des_makekey (gl_3des_ctx *ctx,
+ const char * key,
+ size_t keylen);
+
+/* Electronic Codebook Mode Triple-DES encryption/decryption of data
+ * according to 'mode'. Sometimes this mode is named 'EDE' mode
+ * (Encryption-Decryption-Encryption). */
+extern void
+gl_3des_ecb_crypt (gl_3des_ctx *ctx,
+ const char * from,
+ char * to,
+ int mode);
+
+#define gl_3des_ecb_encrypt(ctx, from, to) gl_3des_ecb_crypt(ctx,from,to,0)
+#define gl_3des_ecb_decrypt(ctx, from, to) gl_3des_ecb_crypt(ctx,from,to,1)
+
+#endif /* DES_H */
diff --git a/gnulib/lib/dev-ino.h b/gnulib/lib/dev-ino.h
new file mode 100644
index 00000000..695d38c7
--- /dev/null
+++ b/gnulib/lib/dev-ino.h
@@ -0,0 +1,13 @@
+#ifndef DEV_INO_H
+# define DEV_INO_H 1
+
+# include <sys/types.h>
+# include <sys/stat.h>
+
+struct dev_ino
+{
+ ino_t st_ino;
+ dev_t st_dev;
+};
+
+#endif
diff --git a/gnulib/lib/diacrit.c b/gnulib/lib/diacrit.c
new file mode 100644
index 00000000..9a6b6134
--- /dev/null
+++ b/gnulib/lib/diacrit.c
@@ -0,0 +1,161 @@
+/* Diacritics processing for a few character codes.
+
+ Copyright (C) 1990-1993, 2000, 2006, 2009-2010 Free Software Foundation,
+ Inc.
+
+ François Pinard <pinard@iro.umontreal.ca>, 1988.
+
+ All this file is a temporary hack, waiting for locales in GNU.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "diacrit.h"
+
+/* ISO 8859-1 Latin-1 code is used as the underlying character set. If
+ MSDOS is defined, IBM-PC's character set code is used instead. */
+
+/*--------------------------------------------------------------------.
+| For each alphabetic character, returns what it would be without its |
+| possible diacritic symbol. |
+`--------------------------------------------------------------------*/
+
+const char diacrit_base[256] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 0, 0, 0, 0, 0,
+ 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 0, 0, 0, 0, 0,
+
+#ifdef __MSDOS__
+
+ 'C', 'u', 'e', 'a', 'a', 'a', 'a', 'c',
+ 'e', 'e', 'e', 'i', 'i', 'i', 'A', 'A',
+ 'E', 'e', 'E', 'o', 'o', 'o', 'u', 'u',
+ 'y', 'O', 'U', 0, 0, 0, 0, 0,
+ 'a', 'i', 'o', 'u', 'n', 'N', 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+
+#else
+
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C',
+ 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I',
+ 0, 'N', 'O', 'O', 'O', 'O', 'O', 0,
+ 'O', 'U', 'U', 'U', 'U', 'Y', 0, 0,
+ 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c',
+ 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
+ 0, 'n', 'o', 'o', 'o', 'o', 'o', 0,
+ 'o', 'u', 'u', 'u', 'u', 'y', 0, 'y',
+
+#endif
+};
+
+/*------------------------------------------------------------------------.
+| For each alphabetic character, returns a code of what its diacritic is, |
+| according to the following codes: 1 (eE) over aA for latin diphtongs; 2 |
+| (') acute accent; 3 (`) grave accent; 4 (^) circumflex accent; 5 (") |
+| umlaut or diaraesis; 6 (~) tilda; 7 (,) cedilla; 8 (o) covering degree |
+| symbol; 9 (|) slashed character. |
+`------------------------------------------------------------------------*/
+
+const char diacrit_diac[256] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 0,
+
+#ifdef __MSDOS__
+
+ 7, 5, 2, 4, 5, 3, 8, 7,
+ 4, 5, 3, 5, 4, 3, 5, 8,
+ 2, 1, 1, 4, 5, 3, 4, 3,
+ 5, 5, 5, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 6, 6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+
+#else
+
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 2, 4, 6, 5, 8, 1, 7,
+ 3, 2, 4, 5, 3, 2, 4, 5,
+ 0, 6, 3, 2, 4, 6, 5, 0,
+ 9, 3, 2, 4, 5, 2, 0, 0,
+ 3, 2, 4, 6, 5, 8, 1, 7,
+ 3, 2, 4, 5, 3, 2, 4, 5,
+ 0, 6, 3, 2, 4, 6, 5, 0,
+ 9, 3, 2, 4, 5, 2, 0, 0,
+
+#endif
+};
diff --git a/gnulib/lib/diacrit.h b/gnulib/lib/diacrit.h
new file mode 100644
index 00000000..9237f518
--- /dev/null
+++ b/gnulib/lib/diacrit.h
@@ -0,0 +1,27 @@
+/* Diacritics processing for a few character codes.
+ Copyright (C) 1990-1993, 2009-2010 Free Software Foundation, Inc.
+ François Pinard <pinard@iro.umontreal.ca>, 1988.
+
+ All this file is a temporary hack, waiting for locales in GNU.
+
+ 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/>. */
+
+extern const char diacrit_base[]; /* characters without diacritics */
+extern const char diacrit_diac[]; /* diacritic code for each character */
+
+/* Returns CHAR without its diacritic. CHAR is known to be alphabetic. */
+#define tobase(Char) (diacrit_base[(unsigned char) (Char)])
+
+/* Returns a diacritic code for CHAR. CHAR is known to be alphabetic. */
+#define todiac(Char) (diacrit_diac[(unsigned char) (Char)])
diff --git a/gnulib/lib/diffseq.h b/gnulib/lib/diffseq.h
new file mode 100644
index 00000000..d9c871b5
--- /dev/null
+++ b/gnulib/lib/diffseq.h
@@ -0,0 +1,500 @@
+/* Analyze differences between two vectors.
+
+ Copyright (C) 1988-1989, 1992-1995, 2001-2004, 2006-2010 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/>. */
+
+
+/* The basic idea is to consider two vectors as similar if, when
+ transforming the first vector into the second vector through a
+ sequence of edits (inserts and deletes of one element each),
+ this sequence is short - or equivalently, if the ordered list
+ of elements that are untouched by these edits is long. For a
+ good introduction to the subject, read about the "Levenshtein
+ distance" in Wikipedia.
+
+ The basic algorithm is described in:
+ "An O(ND) Difference Algorithm and its Variations", Eugene Myers,
+ Algorithmica Vol. 1 No. 2, 1986, pp. 251-266;
+ see especially section 4.2, which describes the variation used below.
+
+ The basic algorithm was independently discovered as described in:
+ "Algorithms for Approximate String Matching", E. Ukkonen,
+ Information and Control Vol. 64, 1985, pp. 100-118.
+
+ Unless the 'find_minimal' flag is set, this code uses the TOO_EXPENSIVE
+ heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N)
+ at the price of producing suboptimal output for large inputs with
+ many differences. */
+
+/* Before including this file, you need to define:
+ ELEMENT The element type of the vectors being compared.
+ EQUAL A two-argument macro that tests two elements for
+ equality.
+ OFFSET A signed integer type sufficient to hold the
+ difference between two indices. Usually
+ something like ssize_t.
+ EXTRA_CONTEXT_FIELDS Declarations of fields for 'struct context'.
+ NOTE_DELETE(ctxt, xoff) Record the removal of the object xvec[xoff].
+ NOTE_INSERT(ctxt, yoff) Record the insertion of the object yvec[yoff].
+ EARLY_ABORT(ctxt) (Optional) A boolean expression that triggers an
+ early abort of the computation.
+ USE_HEURISTIC (Optional) Define if you want to support the
+ heuristic for large vectors.
+ Before including this file, you also need to include:
+ #include <limits.h>
+ #include <stdbool.h>
+ #include "minmax.h"
+ */
+
+/* Maximum value of type OFFSET. */
+#define OFFSET_MAX \
+ ((((OFFSET)1 << (sizeof (OFFSET) * CHAR_BIT - 2)) - 1) * 2 + 1)
+
+/* Default to no early abort. */
+#ifndef EARLY_ABORT
+# define EARLY_ABORT(ctxt) false
+#endif
+
+/* Use this to suppress gcc's `...may be used before initialized' warnings.
+ Beware: The Code argument must not contain commas. */
+#ifndef IF_LINT
+# ifdef lint
+# define IF_LINT(Code) Code
+# else
+# define IF_LINT(Code) /* empty */
+# endif
+#endif
+
+/* As above, but when Code must contain one comma. */
+#ifndef IF_LINT2
+# ifdef lint
+# define IF_LINT2(Code1, Code2) Code1, Code2
+# else
+# define IF_LINT2(Code1, Code2) /* empty */
+# endif
+#endif
+
+/*
+ * Context of comparison operation.
+ */
+struct context
+{
+ /* Vectors being compared. */
+ ELEMENT const *xvec;
+ ELEMENT const *yvec;
+
+ /* Extra fields. */
+ EXTRA_CONTEXT_FIELDS
+
+ /* Vector, indexed by diagonal, containing 1 + the X coordinate of the point
+ furthest along the given diagonal in the forward search of the edit
+ matrix. */
+ OFFSET *fdiag;
+
+ /* Vector, indexed by diagonal, containing the X coordinate of the point
+ furthest along the given diagonal in the backward search of the edit
+ matrix. */
+ OFFSET *bdiag;
+
+ #ifdef USE_HEURISTIC
+ /* This corresponds to the diff -H flag. With this heuristic, for
+ vectors with a constant small density of changes, the algorithm is
+ linear in the vectors size. */
+ bool heuristic;
+ #endif
+
+ /* Edit scripts longer than this are too expensive to compute. */
+ OFFSET too_expensive;
+
+ /* Snakes bigger than this are considered `big'. */
+ #define SNAKE_LIMIT 20
+};
+
+struct partition
+{
+ /* Midpoints of this partition. */
+ OFFSET xmid;
+ OFFSET ymid;
+
+ /* True if low half will be analyzed minimally. */
+ bool lo_minimal;
+
+ /* Likewise for high half. */
+ bool hi_minimal;
+};
+
+
+/* Find the midpoint of the shortest edit script for a specified portion
+ of the two vectors.
+
+ Scan from the beginnings of the vectors, and simultaneously from the ends,
+ doing a breadth-first search through the space of edit-sequence.
+ When the two searches meet, we have found the midpoint of the shortest
+ edit sequence.
+
+ If FIND_MINIMAL is true, find the minimal edit script regardless of
+ expense. Otherwise, if the search is too expensive, use heuristics to
+ stop the search and report a suboptimal answer.
+
+ Set PART->(xmid,ymid) to the midpoint (XMID,YMID). The diagonal number
+ XMID - YMID equals the number of inserted elements minus the number
+ of deleted elements (counting only elements before the midpoint).
+
+ Set PART->lo_minimal to true iff the minimal edit script for the
+ left half of the partition is known; similarly for PART->hi_minimal.
+
+ This function assumes that the first elements of the specified portions
+ of the two vectors do not match, and likewise that the last elements do not
+ match. The caller must trim matching elements from the beginning and end
+ of the portions it is going to specify.
+
+ If we return the "wrong" partitions, the worst this can do is cause
+ suboptimal diff output. It cannot cause incorrect diff output. */
+
+static void
+diag (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim, bool find_minimal,
+ struct partition *part, struct context *ctxt)
+{
+ OFFSET *const fd = ctxt->fdiag; /* Give the compiler a chance. */
+ OFFSET *const bd = ctxt->bdiag; /* Additional help for the compiler. */
+ ELEMENT const *const xv = ctxt->xvec; /* Still more help for the compiler. */
+ ELEMENT const *const yv = ctxt->yvec; /* And more and more . . . */
+ const OFFSET dmin = xoff - ylim; /* Minimum valid diagonal. */
+ const OFFSET dmax = xlim - yoff; /* Maximum valid diagonal. */
+ const OFFSET fmid = xoff - yoff; /* Center diagonal of top-down search. */
+ const OFFSET bmid = xlim - ylim; /* Center diagonal of bottom-up search. */
+ OFFSET fmin = fmid;
+ OFFSET fmax = fmid; /* Limits of top-down search. */
+ OFFSET bmin = bmid;
+ OFFSET bmax = bmid; /* Limits of bottom-up search. */
+ OFFSET c; /* Cost. */
+ bool odd = (fmid - bmid) & 1; /* True if southeast corner is on an odd
+ diagonal with respect to the northwest. */
+
+ fd[fmid] = xoff;
+ bd[bmid] = xlim;
+
+ for (c = 1;; ++c)
+ {
+ OFFSET d; /* Active diagonal. */
+ bool big_snake = false;
+
+ /* Extend the top-down search by an edit step in each diagonal. */
+ if (fmin > dmin)
+ fd[--fmin - 1] = -1;
+ else
+ ++fmin;
+ if (fmax < dmax)
+ fd[++fmax + 1] = -1;
+ else
+ --fmax;
+ for (d = fmax; d >= fmin; d -= 2)
+ {
+ OFFSET x;
+ OFFSET y;
+ OFFSET tlo = fd[d - 1];
+ OFFSET thi = fd[d + 1];
+ OFFSET x0 = tlo < thi ? thi : tlo + 1;
+
+ for (x = x0, y = x0 - d;
+ x < xlim && y < ylim && EQUAL (xv[x], yv[y]);
+ x++, y++)
+ continue;
+ if (x - x0 > SNAKE_LIMIT)
+ big_snake = true;
+ fd[d] = x;
+ if (odd && bmin <= d && d <= bmax && bd[d] <= x)
+ {
+ part->xmid = x;
+ part->ymid = y;
+ part->lo_minimal = part->hi_minimal = true;
+ return;
+ }
+ }
+
+ /* Similarly extend the bottom-up search. */
+ if (bmin > dmin)
+ bd[--bmin - 1] = OFFSET_MAX;
+ else
+ ++bmin;
+ if (bmax < dmax)
+ bd[++bmax + 1] = OFFSET_MAX;
+ else
+ --bmax;
+ for (d = bmax; d >= bmin; d -= 2)
+ {
+ OFFSET x;
+ OFFSET y;
+ OFFSET tlo = bd[d - 1];
+ OFFSET thi = bd[d + 1];
+ OFFSET x0 = tlo < thi ? tlo : thi - 1;
+
+ for (x = x0, y = x0 - d;
+ xoff < x && yoff < y && EQUAL (xv[x - 1], yv[y - 1]);
+ x--, y--)
+ continue;
+ if (x0 - x > SNAKE_LIMIT)
+ big_snake = true;
+ bd[d] = x;
+ if (!odd && fmin <= d && d <= fmax && x <= fd[d])
+ {
+ part->xmid = x;
+ part->ymid = y;
+ part->lo_minimal = part->hi_minimal = true;
+ return;
+ }
+ }
+
+ if (find_minimal)
+ continue;
+
+#ifdef USE_HEURISTIC
+ /* Heuristic: check occasionally for a diagonal that has made lots
+ of progress compared with the edit distance. If we have any
+ such, find the one that has made the most progress and return it
+ as if it had succeeded.
+
+ With this heuristic, for vectors with a constant small density
+ of changes, the algorithm is linear in the vector size. */
+
+ if (200 < c && big_snake && ctxt->heuristic)
+ {
+ {
+ OFFSET best = 0;
+
+ for (d = fmax; d >= fmin; d -= 2)
+ {
+ OFFSET dd = d - fmid;
+ OFFSET x = fd[d];
+ OFFSET y = x - d;
+ OFFSET v = (x - xoff) * 2 - dd;
+
+ if (v > 12 * (c + (dd < 0 ? -dd : dd)))
+ {
+ if (v > best
+ && xoff + SNAKE_LIMIT <= x && x < xlim
+ && yoff + SNAKE_LIMIT <= y && y < ylim)
+ {
+ /* We have a good enough best diagonal; now insist
+ that it end with a significant snake. */
+ int k;
+
+ for (k = 1; EQUAL (xv[x - k], yv[y - k]); k++)
+ if (k == SNAKE_LIMIT)
+ {
+ best = v;
+ part->xmid = x;
+ part->ymid = y;
+ break;
+ }
+ }
+ }
+ }
+ if (best > 0)
+ {
+ part->lo_minimal = true;
+ part->hi_minimal = false;
+ return;
+ }
+ }
+
+ {
+ OFFSET best = 0;
+
+ for (d = bmax; d >= bmin; d -= 2)
+ {
+ OFFSET dd = d - bmid;
+ OFFSET x = bd[d];
+ OFFSET y = x - d;
+ OFFSET v = (xlim - x) * 2 + dd;
+
+ if (v > 12 * (c + (dd < 0 ? -dd : dd)))
+ {
+ if (v > best
+ && xoff < x && x <= xlim - SNAKE_LIMIT
+ && yoff < y && y <= ylim - SNAKE_LIMIT)
+ {
+ /* We have a good enough best diagonal; now insist
+ that it end with a significant snake. */
+ int k;
+
+ for (k = 0; EQUAL (xv[x + k], yv[y + k]); k++)
+ if (k == SNAKE_LIMIT - 1)
+ {
+ best = v;
+ part->xmid = x;
+ part->ymid = y;
+ break;
+ }
+ }
+ }
+ }
+ if (best > 0)
+ {
+ part->lo_minimal = false;
+ part->hi_minimal = true;
+ return;
+ }
+ }
+ }
+#endif /* USE_HEURISTIC */
+
+ /* Heuristic: if we've gone well beyond the call of duty, give up
+ and report halfway between our best results so far. */
+ if (c >= ctxt->too_expensive)
+ {
+ OFFSET fxybest;
+ OFFSET fxbest IF_LINT (= 0);
+ OFFSET bxybest;
+ OFFSET bxbest IF_LINT (= 0);
+
+ /* Find forward diagonal that maximizes X + Y. */
+ fxybest = -1;
+ for (d = fmax; d >= fmin; d -= 2)
+ {
+ OFFSET x = MIN (fd[d], xlim);
+ OFFSET y = x - d;
+ if (ylim < y)
+ {
+ x = ylim + d;
+ y = ylim;
+ }
+ if (fxybest < x + y)
+ {
+ fxybest = x + y;
+ fxbest = x;
+ }
+ }
+
+ /* Find backward diagonal that minimizes X + Y. */
+ bxybest = OFFSET_MAX;
+ for (d = bmax; d >= bmin; d -= 2)
+ {
+ OFFSET x = MAX (xoff, bd[d]);
+ OFFSET y = x - d;
+ if (y < yoff)
+ {
+ x = yoff + d;
+ y = yoff;
+ }
+ if (x + y < bxybest)
+ {
+ bxybest = x + y;
+ bxbest = x;
+ }
+ }
+
+ /* Use the better of the two diagonals. */
+ if ((xlim + ylim) - bxybest < fxybest - (xoff + yoff))
+ {
+ part->xmid = fxbest;
+ part->ymid = fxybest - fxbest;
+ part->lo_minimal = true;
+ part->hi_minimal = false;
+ }
+ else
+ {
+ part->xmid = bxbest;
+ part->ymid = bxybest - bxbest;
+ part->lo_minimal = false;
+ part->hi_minimal = true;
+ }
+ return;
+ }
+ }
+}
+
+
+/* Compare in detail contiguous subsequences of the two vectors
+ which are known, as a whole, to match each other.
+
+ The subsequence of vector 0 is [XOFF, XLIM) and likewise for vector 1.
+
+ Note that XLIM, YLIM are exclusive bounds. All indices into the vectors
+ are origin-0.
+
+ If FIND_MINIMAL, find a minimal difference no matter how
+ expensive it is.
+
+ The results are recorded by invoking NOTE_DELETE and NOTE_INSERT.
+
+ Return false if terminated normally, or true if terminated through early
+ abort. */
+
+static bool
+compareseq (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim,
+ bool find_minimal, struct context *ctxt)
+{
+ ELEMENT const *xv = ctxt->xvec; /* Help the compiler. */
+ ELEMENT const *yv = ctxt->yvec;
+
+ /* Slide down the bottom initial diagonal. */
+ while (xoff < xlim && yoff < ylim && EQUAL (xv[xoff], yv[yoff]))
+ {
+ xoff++;
+ yoff++;
+ }
+
+ /* Slide up the top initial diagonal. */
+ while (xoff < xlim && yoff < ylim && EQUAL (xv[xlim - 1], yv[ylim - 1]))
+ {
+ xlim--;
+ ylim--;
+ }
+
+ /* Handle simple cases. */
+ if (xoff == xlim)
+ while (yoff < ylim)
+ {
+ NOTE_INSERT (ctxt, yoff);
+ if (EARLY_ABORT (ctxt))
+ return true;
+ yoff++;
+ }
+ else if (yoff == ylim)
+ while (xoff < xlim)
+ {
+ NOTE_DELETE (ctxt, xoff);
+ if (EARLY_ABORT (ctxt))
+ return true;
+ xoff++;
+ }
+ else
+ {
+ struct partition part IF_LINT2 (= { .xmid = 0, .ymid = 0 });
+
+ /* Find a point of correspondence in the middle of the vectors. */
+ diag (xoff, xlim, yoff, ylim, find_minimal, &part, ctxt);
+
+ /* Use the partitions to split this problem into subproblems. */
+ if (compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal, ctxt))
+ return true;
+ if (compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal, ctxt))
+ return true;
+ }
+
+ return false;
+}
+
+#undef ELEMENT
+#undef EQUAL
+#undef OFFSET
+#undef EXTRA_CONTEXT_FIELDS
+#undef NOTE_DELETE
+#undef NOTE_INSERT
+#undef EARLY_ABORT
+#undef USE_HEURISTIC
+#undef OFFSET_MAX
diff --git a/gnulib/lib/dirchownmod.c b/gnulib/lib/dirchownmod.c
new file mode 100644
index 00000000..a07c5f0c
--- /dev/null
+++ b/gnulib/lib/dirchownmod.c
@@ -0,0 +1,141 @@
+/* Change the ownership and mode bits of a directory.
+
+ Copyright (C) 2006-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "dirchownmod.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "stat-macros.h"
+
+#ifndef HAVE_FCHMOD
+# define HAVE_FCHMOD 0
+# undef fchmod
+# define fchmod(fd, mode) (-1)
+#endif
+
+/* Change the ownership and mode bits of a directory. If FD is
+ nonnegative, it should be a file descriptor associated with the
+ directory; close it before returning. DIR is the name of the
+ directory.
+
+ If MKDIR_MODE is not (mode_t) -1, mkdir (DIR, MKDIR_MODE) has just
+ been executed successfully with umask zero, so DIR should be a
+ directory (not a symbolic link).
+
+ First, set the file's owner to OWNER and group to GROUP, but leave
+ the owner alone if OWNER is (uid_t) -1, and similarly for GROUP.
+
+ Then, set the file's mode bits to MODE, except preserve any of the
+ bits that correspond to zero bits in MODE_BITS. In other words,
+ MODE_BITS is a mask that specifies which of the file's mode bits
+ should be set or cleared. MODE should be a subset of MODE_BITS,
+ which in turn should be a subset of CHMOD_MODE_BITS.
+
+ This implementation assumes the current umask is zero.
+
+ Return 0 if successful, -1 (setting errno) otherwise. Unsuccessful
+ calls may do the chown but not the chmod. */
+
+int
+dirchownmod (int fd, char const *dir, mode_t mkdir_mode,
+ uid_t owner, gid_t group,
+ mode_t mode, mode_t mode_bits)
+{
+ struct stat st;
+ int result = (fd < 0 ? stat (dir, &st) : fstat (fd, &st));
+
+ if (result == 0)
+ {
+ mode_t dir_mode = st.st_mode;
+
+ /* Check whether DIR is a directory. If FD is nonnegative, this
+ check avoids changing the ownership and mode bits of the
+ wrong file in many cases. This doesn't fix all the race
+ conditions, but it is better than nothing. */
+ if (! S_ISDIR (dir_mode))
+ {
+ errno = ENOTDIR;
+ result = -1;
+ }
+ else
+ {
+ /* If at least one of the S_IXUGO bits are set, chown might
+ clear the S_ISUID and S_SGID bits. Keep track of any
+ file mode bits whose values are indeterminate due to this
+ issue. */
+ mode_t indeterminate = 0;
+
+ /* On some systems, chown clears S_ISUID and S_ISGID, so do
+ chown before chmod. On older System V hosts, ordinary
+ users can give their files away via chown; don't worry
+ about that here, since users shouldn't do that. */
+
+ if ((owner != (uid_t) -1 && owner != st.st_uid)
+ || (group != (gid_t) -1 && group != st.st_gid))
+ {
+ result = (0 <= fd
+ ? fchown (fd, owner, group)
+ : mkdir_mode != (mode_t) -1
+ ? lchown (dir, owner, group)
+ : chown (dir, owner, group));
+
+ /* Either the user cares about an indeterminate bit and
+ it'll be set properly by chmod below, or the user
+ doesn't care and it's OK to use the bit's pre-chown
+ value. So there's no need to re-stat DIR here. */
+
+ if (result == 0 && (dir_mode & S_IXUGO))
+ indeterminate = dir_mode & (S_ISUID | S_ISGID);
+ }
+
+ /* If the file mode bits might not be right, use chmod to
+ change them. Don't change bits the user doesn't care
+ about. */
+ if (result == 0 && (((dir_mode ^ mode) | indeterminate) & mode_bits))
+ {
+ mode_t chmod_mode =
+ mode | (dir_mode & CHMOD_MODE_BITS & ~mode_bits);
+ result = (HAVE_FCHMOD && 0 <= fd
+ ? fchmod (fd, chmod_mode)
+ : mkdir_mode != (mode_t) -1
+ ? lchmod (dir, chmod_mode)
+ : chmod (dir, chmod_mode));
+ }
+ }
+ }
+
+ if (0 <= fd)
+ {
+ if (result == 0)
+ result = close (fd);
+ else
+ {
+ int e = errno;
+ close (fd);
+ errno = e;
+ }
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/dirchownmod.h b/gnulib/lib/dirchownmod.h
new file mode 100644
index 00000000..3f07748e
--- /dev/null
+++ b/gnulib/lib/dirchownmod.h
@@ -0,0 +1,2 @@
+#include <sys/types.h>
+int dirchownmod (int, char const *, mode_t, uid_t, gid_t, mode_t, mode_t);
diff --git a/gnulib/lib/dirent--.h b/gnulib/lib/dirent--.h
new file mode 100644
index 00000000..aebab2df
--- /dev/null
+++ b/gnulib/lib/dirent--.h
@@ -0,0 +1,23 @@
+/* Like dirent.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include "dirent-safer.h"
+
+#undef opendir
+#define opendir opendir_safer
diff --git a/gnulib/lib/dirent-safer.h b/gnulib/lib/dirent-safer.h
new file mode 100644
index 00000000..c72359f0
--- /dev/null
+++ b/gnulib/lib/dirent-safer.h
@@ -0,0 +1,22 @@
+/* Invoke dirent-like functions, but avoid some glitches.
+
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <dirent.h>
+
+DIR *opendir_safer (const char *name);
diff --git a/gnulib/lib/dirent.in.h b/gnulib/lib/dirent.in.h
new file mode 100644
index 00000000..ccd0a106
--- /dev/null
+++ b/gnulib/lib/dirent.in.h
@@ -0,0 +1,126 @@
+/* A GNU-like <dirent.h>.
+ Copyright (C) 2006-2010 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/>. */
+
+#ifndef _GL_DIRENT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_DIRENT_H@
+
+#ifndef _GL_DIRENT_H
+#define _GL_DIRENT_H
+
+/* Get ino_t. Needed on some systems, including glibc 2.8. */
+#include <sys/types.h>
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Declare overridden functions. */
+
+#if @REPLACE_CLOSEDIR@
+# define closedir rpl_closedir
+extern int closedir (DIR *) _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_DIRFD@
+# if !@HAVE_DECL_DIRFD@ && !defined dirfd
+/* Return the file descriptor associated with the given directory stream,
+ or -1 if none exists. */
+extern int dirfd (DIR *dir) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef dirfd
+# if HAVE_RAW_DECL_DIRFD
+_GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
+ "use gnulib module dirfd for portability");
+# endif
+#endif
+
+#if @GNULIB_FDOPENDIR@
+# if @REPLACE_FDOPENDIR@
+# undef fdopendir
+# define fdopendir rpl_fdopendir
+# endif
+# if !@HAVE_FDOPENDIR@ || @REPLACE_FDOPENDIR@
+/* Open a directory stream visiting the given directory file
+ descriptor. Return NULL and set errno if fd is not visiting a
+ directory. On success, this function consumes fd (it will be
+ implicitly closed either by this function or by a subsequent
+ closedir). */
+extern DIR *fdopendir (int fd);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fdopendir
+# if HAVE_RAW_DECL_FDOPENDIR
+_GL_WARN_ON_USE (fdopendir, "fdopendir is unportable - "
+ "use gnulib module fdopendir for portability");
+# endif
+#endif
+
+#if @REPLACE_OPENDIR@
+# define opendir rpl_opendir
+extern DIR * opendir (const char *) _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_SCANDIR@
+/* Scan the directory DIR, calling FILTER on each directory entry.
+ Entries for which FILTER returns nonzero are individually malloc'd,
+ sorted using qsort with CMP, and collected in a malloc'd array in
+ *NAMELIST. Returns the number of entries selected, or -1 on error. */
+# if !@HAVE_SCANDIR@
+extern int scandir (const char *dir, struct dirent ***namelist,
+ int (*filter) (const struct dirent *),
+ int (*cmp) (const struct dirent **, const struct dirent **))
+ _GL_ARG_NONNULL ((1, 2, 4));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef scandir
+# if HAVE_RAW_DECL_SCANDIR
+_GL_WARN_ON_USE (scandir, "scandir is unportable - "
+ "use gnulib module scandir for portability");
+# endif
+#endif
+
+#if @GNULIB_ALPHASORT@
+/* Compare two 'struct dirent' entries alphabetically. */
+# if !@HAVE_ALPHASORT@
+extern int alphasort (const struct dirent **, const struct dirent **)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef alphasort
+# if HAVE_RAW_DECL_ALPHASORT
+_GL_WARN_ON_USE (alphasort, "alphasort is unportable - "
+ "use gnulib module alphasort for portability");
+# endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_DIRENT_H */
+#endif /* _GL_DIRENT_H */
diff --git a/gnulib/lib/dirfd.c b/gnulib/lib/dirfd.c
new file mode 100644
index 00000000..c285370d
--- /dev/null
+++ b/gnulib/lib/dirfd.c
@@ -0,0 +1,32 @@
+/* dirfd.c -- return the file descriptor associated with an open DIR*
+
+ Copyright (C) 2001, 2006, 2008-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include <dirent.h>
+#include <errno.h>
+
+int
+dirfd (DIR *dir_p)
+{
+ int fd = DIR_TO_FD (dir_p);
+ if (fd == -1)
+ errno = ENOTSUP;
+ return fd;
+}
diff --git a/gnulib/lib/dirname-lgpl.c b/gnulib/lib/dirname-lgpl.c
new file mode 100644
index 00000000..d4506e06
--- /dev/null
+++ b/gnulib/lib/dirname-lgpl.c
@@ -0,0 +1,86 @@
+/* dirname.c -- return all but the last element in a file name
+
+ Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Return the length of the prefix of FILE that will be used by
+ dir_name. If FILE is in the working directory, this returns zero
+ even though `dir_name (FILE)' will return ".". Works properly even
+ if there are trailing slashes (by effectively ignoring them). */
+
+size_t
+dir_len (char const *file)
+{
+ size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file);
+ size_t length;
+
+ /* Advance prefix_length beyond important leading slashes. */
+ prefix_length += (prefix_length != 0
+ ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+ && ISSLASH (file[prefix_length]))
+ : (ISSLASH (file[0])
+ ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT
+ && ISSLASH (file[1]) && ! ISSLASH (file[2])
+ ? 2 : 1))
+ : 0));
+
+ /* Strip the basename and any redundant slashes before it. */
+ for (length = last_component (file) - file;
+ prefix_length < length; length--)
+ if (! ISSLASH (file[length - 1]))
+ break;
+ return length;
+}
+
+
+/* In general, we can't use the builtin `dirname' function if available,
+ since it has different meanings in different environments.
+ In some environments the builtin `dirname' modifies its argument.
+
+ Return the leading directories part of FILE, allocated with malloc.
+ Works properly even if there are trailing slashes (by effectively
+ ignoring them). Return NULL on failure.
+
+ If lstat (FILE) would succeed, then { chdir (dir_name (FILE));
+ lstat (base_name (FILE)); } will access the same file. Likewise,
+ if the sequence { chdir (dir_name (FILE));
+ rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE
+ to "foo" in the same directory FILE was in. */
+
+char *
+mdir_name (char const *file)
+{
+ size_t length = dir_len (file);
+ bool append_dot = (length == 0
+ || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+ && length == FILE_SYSTEM_PREFIX_LEN (file)
+ && file[2] != '\0' && ! ISSLASH (file[2])));
+ char *dir = malloc (length + append_dot + 1);
+ if (!dir)
+ return NULL;
+ memcpy (dir, file, length);
+ if (append_dot)
+ dir[length++] = '.';
+ dir[length] = '\0';
+ return dir;
+}
diff --git a/gnulib/lib/dirname.c b/gnulib/lib/dirname.c
new file mode 100644
index 00000000..953a9acc
--- /dev/null
+++ b/gnulib/lib/dirname.c
@@ -0,0 +1,38 @@
+/* dirname.c -- return all but the last element in a file name
+
+ Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include "xalloc.h"
+
+/* Just like mdir_name (dirname-lgpl.c), except, rather than
+ returning NULL upon malloc failure, here, we report the
+ "memory exhausted" condition and exit. */
+
+char *
+dir_name (char const *file)
+{
+ char *result = mdir_name (file);
+ if (!result)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/dirname.h b/gnulib/lib/dirname.h
new file mode 100644
index 00000000..fb19508f
--- /dev/null
+++ b/gnulib/lib/dirname.h
@@ -0,0 +1,74 @@
+/* Take file names apart into directory and base names.
+
+ Copyright (C) 1998, 2001, 2003-2006, 2009-2010 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/>. */
+
+#ifndef DIRNAME_H_
+# define DIRNAME_H_ 1
+
+# include <stdbool.h>
+# include <stddef.h>
+
+# ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+# endif
+
+# ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+# endif
+
+# ifndef FILE_SYSTEM_PREFIX_LEN
+# if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
+ /* This internal macro assumes ASCII, but all hosts that support drive
+ letters use ASCII. */
+# define _IS_DRIVE_LETTER(c) (((unsigned int) (c) | ('a' - 'A')) - 'a' \
+ <= 'z' - 'a')
+# define FILE_SYSTEM_PREFIX_LEN(Filename) \
+ (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
+# else
+# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
+# endif
+# endif
+
+# ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
+# endif
+
+# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+# endif
+
+# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
+# else
+# define IS_ABSOLUTE_FILE_NAME(F) \
+ (ISSLASH ((F)[0]) || 0 < FILE_SYSTEM_PREFIX_LEN (F))
+# endif
+# define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
+
+# if GNULIB_DIRNAME
+char *base_name (char const *file);
+char *dir_name (char const *file);
+# endif
+
+char *mdir_name (char const *file);
+size_t base_len (char const *file);
+size_t dir_len (char const *file);
+char *last_component (char const *file);
+
+bool strip_trailing_slashes (char *file);
+
+#endif /* not DIRNAME_H_ */
diff --git a/gnulib/lib/dprintf.c b/gnulib/lib/dprintf.c
new file mode 100644
index 00000000..c57c7d27
--- /dev/null
+++ b/gnulib/lib/dprintf.c
@@ -0,0 +1,70 @@
+/* Formatted output to a file descriptor.
+ Copyright (C) 2009, 2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "full-write.h"
+#include "vasnprintf.h"
+
+int
+dprintf (int fd, const char *format, ...)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ return -1;
+
+ if (full_write (fd, output, len) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/dummy.c b/gnulib/lib/dummy.c
new file mode 100644
index 00000000..0f9a2779
--- /dev/null
+++ b/gnulib/lib/dummy.c
@@ -0,0 +1,42 @@
+/* A dummy file, to prevent empty libraries from breaking builds.
+ Copyright (C) 2004, 2007, 2009, 2010 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/>. */
+
+/* Some systems, reportedly OpenBSD and Mac OS X, refuse to create
+ libraries without any object files. You might get an error like:
+
+ > ar cru .libs/libgl.a
+ > ar: no archive members specified
+
+ Compiling this file, and adding its object file to the library, will
+ prevent the library from being empty. */
+
+/* Some systems, such as Solaris with cc 5.0, refuse to work with libraries
+ that don't export any symbol. You might get an error like:
+
+ > cc ... libgnu.a
+ > ild: (bad file) garbled symbol table in archive ../gllib/libgnu.a
+
+ Compiling this file, and adding its object file to the library, will
+ prevent the library from exporting no symbols. */
+
+#ifdef __sun
+/* This declaration ensures that the library will export at least 1 symbol. */
+int gl_dummy_symbol;
+#else
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+#endif
diff --git a/gnulib/lib/dup-safer-flag.c b/gnulib/lib/dup-safer-flag.c
new file mode 100644
index 00000000..10d6a1bb
--- /dev/null
+++ b/gnulib/lib/dup-safer-flag.c
@@ -0,0 +1,44 @@
+/* Duplicate a file descriptor result, avoiding clobbering
+ STD{IN,OUT,ERR}_FILENO, with specific flags.
+
+ Copyright (C) 2001, 2004-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "cloexec.h"
+
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. If FLAG contains O_CLOEXEC, behave like
+ fcntl(F_DUPFD_CLOEXEC) rather than fcntl(F_DUPFD). */
+
+int
+dup_safer_flag (int fd, int flag)
+{
+ return fcntl (fd, (flag & O_CLOEXEC) ? F_DUPFD_CLOEXEC : F_DUPFD,
+ STDERR_FILENO + 1);
+}
diff --git a/gnulib/lib/dup-safer.c b/gnulib/lib/dup-safer.c
new file mode 100644
index 00000000..33f599be
--- /dev/null
+++ b/gnulib/lib/dup-safer.c
@@ -0,0 +1,34 @@
+/* Invoke dup, but avoid some glitches.
+
+ Copyright (C) 2001, 2004-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+
+int
+dup_safer (int fd)
+{
+ return fcntl (fd, F_DUPFD, STDERR_FILENO + 1);
+}
diff --git a/gnulib/lib/dup2.c b/gnulib/lib/dup2.c
new file mode 100644
index 00000000..a4422bf3
--- /dev/null
+++ b/gnulib/lib/dup2.c
@@ -0,0 +1,128 @@
+/* Duplicate an open file descriptor to a specified file descriptor.
+
+ Copyright (C) 1999, 2004-2007, 2009-2010 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/>. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#if HAVE_DUP2
+
+# undef dup2
+
+int
+rpl_dup2 (int fd, int desired_fd)
+{
+ int result;
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open,
+ dup2 (fd, fd) returns 0, but all further attempts to use fd in
+ future dup2 calls will hang. */
+ if (fd == desired_fd)
+ {
+ if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ return fd;
+ }
+ /* Wine 1.0.1 return 0 when desired_fd is negative but not -1:
+ http://bugs.winehq.org/show_bug.cgi?id=21289 */
+ if (desired_fd < 0)
+ {
+ errno = EBADF;
+ return -1;
+ }
+# endif
+ result = dup2 (fd, desired_fd);
+# ifdef __linux__
+ /* Correct a Linux return value.
+ <http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.30.y.git;a=commitdiff;h=2b79bc4f7ebbd5af3c8b867968f9f15602d5f802>
+ */
+ if (fd == desired_fd && result == (unsigned int) -EBADF)
+ {
+ errno = EBADF;
+ result = -1;
+ }
+# endif
+ if (result == 0)
+ result = desired_fd;
+ /* Correct a cygwin 1.5.x errno value. */
+ else if (result == -1 && errno == EMFILE)
+ errno = EBADF;
+# if REPLACE_FCHDIR
+ if (fd != desired_fd && result != -1)
+ result = _gl_register_dup (fd, result);
+# endif
+ return result;
+}
+
+#else /* !HAVE_DUP2 */
+
+/* On older platforms, dup2 did not exist. */
+
+# ifndef F_DUPFD
+static int
+dupfd (int fd, int desired_fd)
+{
+ int duplicated_fd = dup (fd);
+ if (duplicated_fd < 0 || duplicated_fd == desired_fd)
+ return duplicated_fd;
+ else
+ {
+ int r = dupfd (fd, desired_fd);
+ int e = errno;
+ close (duplicated_fd);
+ errno = e;
+ return r;
+ }
+}
+# endif
+
+int
+dup2 (int fd, int desired_fd)
+{
+ int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd;
+ if (result == -1 || fd == desired_fd)
+ return result;
+ close (desired_fd);
+# ifdef F_DUPFD
+ result = fcntl (fd, F_DUPFD, desired_fd);
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (fd, result);
+# endif
+# else
+ result = dupfd (fd, desired_fd);
+# endif
+ if (result == -1 && (errno == EMFILE || errno == EINVAL))
+ errno = EBADF;
+ return result;
+}
+#endif /* !HAVE_DUP2 */
diff --git a/gnulib/lib/dup3.c b/gnulib/lib/dup3.c
new file mode 100644
index 00000000..d44aa92b
--- /dev/null
+++ b/gnulib/lib/dup3.c
@@ -0,0 +1,123 @@
+/* Copy a file descriptor, applying specific flags.
+ Copyright (C) 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#include "binary-io.h"
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+# include <string.h>
+
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* Upper bound on getdtablesize(). See lib/getdtablesize.c. */
+# define OPEN_MAX_MAX 0x10000
+
+#else
+/* Unix API. */
+
+# ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+# endif
+
+#endif
+
+int
+dup3 (int oldfd, int newfd, int flags)
+{
+#if HAVE_DUP3
+# undef dup3
+ /* Try the system call first, if it exists. (We may be running with a glibc
+ that has the function but with an older kernel that lacks it.) */
+ {
+ /* Cache the information whether the system call really exists. */
+ static int have_dup3_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_dup3_really >= 0)
+ {
+ int result = dup3 (oldfd, newfd, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_dup3_really = 1;
+#if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (oldfd, newfd);
+#endif
+ return result;
+ }
+ have_dup3_really = -1;
+ }
+ }
+#endif
+
+ if (newfd < 0 || newfd >= getdtablesize () || fcntl (oldfd, F_GETFD) == -1)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (newfd == oldfd)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Check the supported flags.
+ Note that O_NONBLOCK is not supported, because setting it on newfd
+ would implicitly also set it on oldfd. */
+ if ((flags & ~(O_CLOEXEC | O_BINARY | O_TEXT)) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (flags & O_CLOEXEC)
+ {
+ int result;
+ close (newfd);
+ result = fcntl (oldfd, F_DUPFD_CLOEXEC, newfd);
+ if (newfd < result)
+ {
+ close (result);
+ errno = EIO;
+ result = -1;
+ }
+ if (result < 0)
+ return -1;
+ }
+ else if (dup2 (oldfd, newfd) < 0)
+ return -1;
+
+#if O_BINARY
+ if (flags & O_BINARY)
+ setmode (newfd, O_BINARY);
+ else if (flags & O_TEXT)
+ setmode (newfd, O_TEXT);
+#endif
+
+ return newfd;
+}
diff --git a/gnulib/lib/duplocale.c b/gnulib/lib/duplocale.c
new file mode 100644
index 00000000..6f06d1fa
--- /dev/null
+++ b/gnulib/lib/duplocale.c
@@ -0,0 +1,100 @@
+/* Duplicate a locale object.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#include <locale.h>
+
+#include <errno.h>
+#include <string.h>
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+#undef duplocale
+
+locale_t
+rpl_duplocale (locale_t locale)
+{
+ /* Work around crash in the duplocale function in glibc < 2.12.
+ See <http://sourceware.org/bugzilla/show_bug.cgi?id=10969>. */
+ if (locale == LC_GLOBAL_LOCALE)
+ {
+ /* Create a copy of the locale by fetching the name of each locale
+ category, starting with LC_CTYPE. */
+ static struct { int cat; int mask; } const categories[] =
+ {
+ { LC_NUMERIC, LC_NUMERIC_MASK },
+ { LC_TIME, LC_TIME_MASK },
+ { LC_COLLATE, LC_COLLATE_MASK },
+ { LC_MONETARY, LC_MONETARY_MASK },
+ { LC_MESSAGES, LC_MESSAGES_MASK }
+#ifdef LC_PAPER
+ , { LC_PAPER, LC_PAPER_MASK }
+#endif
+#ifdef LC_NAME
+ , { LC_NAME, LC_NAME_MASK }
+#endif
+#ifdef LC_ADDRESS
+ , { LC_ADDRESS, LC_ADDRESS_MASK }
+#endif
+#ifdef LC_TELEPHONE
+ , { LC_TELEPHONE, LC_TELEPHONE_MASK }
+#endif
+#ifdef LC_MEASUREMENT
+ , { LC_MEASUREMENT, LC_MEASUREMENT_MASK }
+#endif
+#ifdef LC_IDENTIFICATION
+ , { LC_IDENTIFICATION, LC_IDENTIFICATION_MASK }
+#endif
+ };
+ const char *base_name;
+ locale_t base_copy;
+ unsigned int i;
+
+ base_name = setlocale (LC_CTYPE, NULL);
+ base_copy = newlocale (LC_ALL_MASK, base_name, NULL);
+ if (base_copy == NULL)
+ return NULL;
+
+ for (i = 0; i < SIZEOF (categories); i++)
+ {
+ int category = categories[i].cat;
+ int category_mask = categories[i].mask;
+ const char *name = setlocale (category, NULL);
+ if (strcmp (name, base_name) != 0)
+ {
+ locale_t copy = newlocale (category_mask, name, base_copy);
+ if (copy == NULL)
+ {
+ int saved_errno = errno;
+ freelocale (base_copy);
+ errno = saved_errno;
+ return NULL;
+ }
+ /* No need to call freelocale (base_copy) if copy != base_copy;
+ the newlocale function already takes care of doing it. */
+ base_copy = copy;
+ }
+ }
+
+ return base_copy;
+ }
+
+ return duplocale (locale);
+}
diff --git a/gnulib/lib/eealloc.h b/gnulib/lib/eealloc.h
new file mode 100644
index 00000000..02cd7925
--- /dev/null
+++ b/gnulib/lib/eealloc.h
@@ -0,0 +1,70 @@
+/* Memory allocation with expensive empty allocations.
+ Copyright (C) 2003, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003,
+ based on prior work by Jim Meyering.
+
+ 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/>. */
+
+#ifndef _EEALLOC_H
+#define _EEALLOC_H
+
+/* malloc() and realloc() are allowed to return NULL when asked to allocate
+ a memory block of 0 bytes; this is not an out-of-memory condition.
+ (See ISO C 99 section 7.20.3.) In some places, this is not welcome,
+ because it requires extra checking (so as not to confuse a zero-sized
+ allocation with an out-of-memory condition). This file provides
+ malloc()/realloc() workalikes which return non-NULL pointers for
+ succeeding zero-sized allocations. GNU libc already defines malloc()
+ and realloc() this way; on such platforms the workalikes are aliased
+ to the original malloc()/realloc() functions. */
+
+#include <stdlib.h>
+
+#if MALLOC_0_IS_NONNULL
+# define eemalloc malloc
+#else
+# if __GNUC__ >= 3
+static inline void *eemalloc (size_t n) __attribute__ ((__malloc__));
+# endif
+static inline void *
+eemalloc (size_t n)
+{
+ /* If n is zero, allocate a 1-byte block. */
+ if (n == 0)
+ n = 1;
+ return malloc (n);
+}
+#endif
+
+#if REALLOC_0_IS_NONNULL
+# define eerealloc realloc
+#else
+static inline void *
+eerealloc (void *p, size_t n)
+{
+ /* If n is zero, allocate or keep a 1-byte block. */
+ if (n == 0)
+ n = 1;
+ return realloc (p, n);
+}
+#endif
+
+/* Maybe we should also define variants
+ eenmalloc (size_t n, size_t s) - behaves like eemalloc (n * s)
+ eezalloc (size_t n) - like eemalloc followed by memset 0
+ eecalloc (size_t n, size_t s) - like eemalloc (n * s) followed by memset 0
+ eenrealloc (void *p, size_t n, size_t s) - like eerealloc (p, n * s)
+ If this would be useful in your application. please speak up. */
+
+#endif /* _EEALLOC_H */
diff --git a/gnulib/lib/errno.in.h b/gnulib/lib/errno.in.h
new file mode 100644
index 00000000..9ac3a5b4
--- /dev/null
+++ b/gnulib/lib/errno.in.h
@@ -0,0 +1,160 @@
+/* A POSIX-like <errno.h>.
+
+ Copyright (C) 2008-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_ERRNO_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
+
+#ifndef _GL_ERRNO_H
+#define _GL_ERRNO_H
+
+
+/* On native Windows platforms, many macros are not defined. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* POSIX says that EAGAIN and EWOULDBLOCK may have the same value. */
+# define EWOULDBLOCK EAGAIN
+
+/* Values >= 100 seem safe to use. */
+# define ETXTBSY 100
+# define GNULIB_defined_ETXTBSY 1
+
+/* These are intentionally the same values as the WSA* error numbers, defined
+ in <winsock2.h>. */
+# define EINPROGRESS 10036
+# define EALREADY 10037
+# define ENOTSOCK 10038
+# define EDESTADDRREQ 10039
+# define EMSGSIZE 10040
+# define EPROTOTYPE 10041
+# define ENOPROTOOPT 10042
+# define EPROTONOSUPPORT 10043
+# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */
+# define EOPNOTSUPP 10045
+# define EPFNOSUPPORT 10046 /* not required by POSIX */
+# define EAFNOSUPPORT 10047
+# define EADDRINUSE 10048
+# define EADDRNOTAVAIL 10049
+# define ENETDOWN 10050
+# define ENETUNREACH 10051
+# define ENETRESET 10052
+# define ECONNABORTED 10053
+# define ECONNRESET 10054
+# define ENOBUFS 10055
+# define EISCONN 10056
+# define ENOTCONN 10057
+# define ESHUTDOWN 10058 /* not required by POSIX */
+# define ETOOMANYREFS 10059 /* not required by POSIX */
+# define ETIMEDOUT 10060
+# define ECONNREFUSED 10061
+# define ELOOP 10062
+# define EHOSTDOWN 10064 /* not required by POSIX */
+# define EHOSTUNREACH 10065
+# define EPROCLIM 10067 /* not required by POSIX */
+# define EUSERS 10068 /* not required by POSIX */
+# define EDQUOT 10069
+# define ESTALE 10070
+# define EREMOTE 10071 /* not required by POSIX */
+# define GNULIB_defined_ESOCK 1
+
+# endif
+
+
+/* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros
+ EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */
+# if @EMULTIHOP_HIDDEN@
+# define EMULTIHOP @EMULTIHOP_VALUE@
+# define GNULIB_defined_EMULTIHOP 1
+# endif
+# if @ENOLINK_HIDDEN@
+# define ENOLINK @ENOLINK_VALUE@
+# define GNULIB_defined_ENOLINK 1
+# endif
+# if @EOVERFLOW_HIDDEN@
+# define EOVERFLOW @EOVERFLOW_VALUE@
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+
+/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
+ EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
+ Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151,
+ HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
+
+ Note: When one of these systems defines some of these macros some day,
+ binaries will have to be recompiled so that they recognizes the new
+ errno values from the system. */
+
+# ifndef ENOMSG
+# define ENOMSG 2000
+# define GNULIB_defined_ENOMSG 1
+# endif
+
+# ifndef EIDRM
+# define EIDRM 2001
+# define GNULIB_defined_EIDRM 1
+# endif
+
+# ifndef ENOLINK
+# define ENOLINK 2002
+# define GNULIB_defined_ENOLINK 1
+# endif
+
+# ifndef EPROTO
+# define EPROTO 2003
+# define GNULIB_defined_EPROTO 1
+# endif
+
+# ifndef EMULTIHOP
+# define EMULTIHOP 2004
+# define GNULIB_defined_EMULTIHOP 1
+# endif
+
+# ifndef EBADMSG
+# define EBADMSG 2005
+# define GNULIB_defined_EBADMSG 1
+# endif
+
+# ifndef EOVERFLOW
+# define EOVERFLOW 2006
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+# ifndef ENOTSUP
+# define ENOTSUP 2007
+# define GNULIB_defined_ENOTSUP 1
+# endif
+
+# ifndef ESTALE
+# define ESTALE 2009
+# define GNULIB_defined_ESTALE 1
+# endif
+
+# ifndef ECANCELED
+# define ECANCELED 2008
+# define GNULIB_defined_ECANCELED 1
+# endif
+
+
+#endif /* _GL_ERRNO_H */
+#endif /* _GL_ERRNO_H */
diff --git a/gnulib/lib/error.c b/gnulib/lib/error.c
new file mode 100644
index 00000000..c79e8d42
--- /dev/null
+++ b/gnulib/lib/error.c
@@ -0,0 +1,366 @@
+/* Error handler for noninteractive utilities
+ Copyright (C) 1990-1998, 2000-2007, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include "error.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !_LIBC && ENABLE_NLS
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <wchar.h>
+# define mbsrtowcs __mbsrtowcs
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifndef _
+# define _(String) String
+#endif
+
+/* If NULL, error will flush stdout, then print on stderr the program
+ name, a colon and a space. Otherwise, error will call this
+ function without parameters instead. */
+void (*error_print_progname) (void);
+
+/* This variable is incremented each time `error' is called. */
+unsigned int error_message_count;
+
+#ifdef _LIBC
+/* In the GNU C library, there is a predefined variable for this. */
+
+# define program_name program_invocation_name
+# include <errno.h>
+# include <limits.h>
+# include <libio/libioP.h>
+
+/* In GNU libc we want do not want to use the common name `error' directly.
+ Instead make it a weak alias. */
+extern void __error (int status, int errnum, const char *message, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+extern void __error_at_line (int status, int errnum, const char *file_name,
+ unsigned int line_number, const char *message,
+ ...)
+ __attribute__ ((__format__ (__printf__, 5, 6)));;
+# define error __error
+# define error_at_line __error_at_line
+
+# include <libio/iolibio.h>
+# define fflush(s) INTUSE(_IO_fflush) (s)
+# undef putc
+# define putc(c, fp) INTUSE(_IO_putc) (c, fp)
+
+# include <bits/libc-lock.h>
+
+#else /* not _LIBC */
+
+# include <fcntl.h>
+# include <unistd.h>
+
+# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
+# ifndef HAVE_DECL_STRERROR_R
+"this configure-time declaration test was not run"
+# endif
+char *strerror_r ();
+# endif
+
+/* The calling program should define program_name and set it to the
+ name of the executing program. */
+extern char *program_name;
+
+# if HAVE_STRERROR_R || defined strerror_r
+# define __strerror_r strerror_r
+# endif /* HAVE_STRERROR_R || defined strerror_r */
+#endif /* not _LIBC */
+
+static inline void
+flush_stdout (void)
+{
+#if !_LIBC && defined F_GETFL
+ int stdout_fd;
+
+# if GNULIB_FREOPEN_SAFER
+ /* Use of gnulib's freopen-safer module normally ensures that
+ fileno (stdout) == 1
+ whenever stdout is open. */
+ stdout_fd = STDOUT_FILENO;
+# else
+ /* POSIX states that fileno (stdout) after fclose is unspecified. But in
+ practice it is not a problem, because stdout is statically allocated and
+ the fd of a FILE stream is stored as a field in its allocated memory. */
+ stdout_fd = fileno (stdout);
+# endif
+ /* POSIX states that fflush (stdout) after fclose is unspecified; it
+ is safe in glibc, but not on all other platforms. fflush (NULL)
+ is always defined, but too draconian. */
+ if (0 <= stdout_fd && 0 <= fcntl (stdout_fd, F_GETFL))
+#endif
+ fflush (stdout);
+}
+
+static void
+print_errno_message (int errnum)
+{
+ char const *s;
+
+#if defined HAVE_STRERROR_R || _LIBC
+ char errbuf[1024];
+# if STRERROR_R_CHAR_P || _LIBC
+ s = __strerror_r (errnum, errbuf, sizeof errbuf);
+# else
+ if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
+ s = errbuf;
+ else
+ s = 0;
+# endif
+#else
+ s = strerror (errnum);
+#endif
+
+#if !_LIBC
+ if (! s)
+ s = _("Unknown system error");
+#endif
+
+#if _LIBC
+ __fxprintf (NULL, ": %s", s);
+#else
+ fprintf (stderr, ": %s", s);
+#endif
+}
+
+static void
+error_tail (int status, int errnum, const char *message, va_list args)
+{
+#if _LIBC
+ if (_IO_fwide (stderr, 0) > 0)
+ {
+# define ALLOCA_LIMIT 2000
+ size_t len = strlen (message) + 1;
+ wchar_t *wmessage = NULL;
+ mbstate_t st;
+ size_t res;
+ const char *tmp;
+ bool use_malloc = false;
+
+ while (1)
+ {
+ if (__libc_use_alloca (len * sizeof (wchar_t)))
+ wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
+ else
+ {
+ if (!use_malloc)
+ wmessage = NULL;
+
+ wchar_t *p = (wchar_t *) realloc (wmessage,
+ len * sizeof (wchar_t));
+ if (p == NULL)
+ {
+ free (wmessage);
+ fputws_unlocked (L"out of memory\n", stderr);
+ return;
+ }
+ wmessage = p;
+ use_malloc = true;
+ }
+
+ memset (&st, '\0', sizeof (st));
+ tmp = message;
+
+ res = mbsrtowcs (wmessage, &tmp, len, &st);
+ if (res != len)
+ break;
+
+ if (__builtin_expect (len >= SIZE_MAX / 2, 0))
+ {
+ /* This really should not happen if everything is fine. */
+ res = (size_t) -1;
+ break;
+ }
+
+ len *= 2;
+ }
+
+ if (res == (size_t) -1)
+ {
+ /* The string cannot be converted. */
+ if (use_malloc)
+ {
+ free (wmessage);
+ use_malloc = false;
+ }
+ wmessage = (wchar_t *) L"???";
+ }
+
+ __vfwprintf (stderr, wmessage, args);
+
+ if (use_malloc)
+ free (wmessage);
+ }
+ else
+#endif
+ vfprintf (stderr, message, args);
+ va_end (args);
+
+ ++error_message_count;
+ if (errnum)
+ print_errno_message (errnum);
+#if _LIBC
+ __fxprintf (NULL, "\n");
+#else
+ putc ('\n', stderr);
+#endif
+ fflush (stderr);
+ if (status)
+ exit (status);
+}
+
+
+/* Print the program name and error message MESSAGE, which is a printf-style
+ format string with optional args.
+ If ERRNUM is nonzero, print its corresponding system error message.
+ Exit with status STATUS if it is nonzero. */
+void
+error (int status, int errnum, const char *message, ...)
+{
+ va_list args;
+
+#if defined _LIBC && defined __libc_ptf_call
+ /* We do not want this call to be cut short by a thread
+ cancellation. Therefore disable cancellation for now. */
+ int state = PTHREAD_CANCEL_ENABLE;
+ __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
+ 0);
+#endif
+
+ flush_stdout ();
+#ifdef _LIBC
+ _IO_flockfile (stderr);
+#endif
+ if (error_print_progname)
+ (*error_print_progname) ();
+ else
+ {
+#if _LIBC
+ __fxprintf (NULL, "%s: ", program_name);
+#else
+ fprintf (stderr, "%s: ", program_name);
+#endif
+ }
+
+ va_start (args, message);
+ error_tail (status, errnum, message, args);
+
+#ifdef _LIBC
+ _IO_funlockfile (stderr);
+# ifdef __libc_ptf_call
+ __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
+# endif
+#endif
+}
+
+/* Sometimes we want to have at most one error per line. This
+ variable controls whether this mode is selected or not. */
+int error_one_per_line;
+
+void
+error_at_line (int status, int errnum, const char *file_name,
+ unsigned int line_number, const char *message, ...)
+{
+ va_list args;
+
+ if (error_one_per_line)
+ {
+ static const char *old_file_name;
+ static unsigned int old_line_number;
+
+ if (old_line_number == line_number
+ && (file_name == old_file_name
+ || strcmp (old_file_name, file_name) == 0))
+ /* Simply return and print nothing. */
+ return;
+
+ old_file_name = file_name;
+ old_line_number = line_number;
+ }
+
+#if defined _LIBC && defined __libc_ptf_call
+ /* We do not want this call to be cut short by a thread
+ cancellation. Therefore disable cancellation for now. */
+ int state = PTHREAD_CANCEL_ENABLE;
+ __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
+ 0);
+#endif
+
+ flush_stdout ();
+#ifdef _LIBC
+ _IO_flockfile (stderr);
+#endif
+ if (error_print_progname)
+ (*error_print_progname) ();
+ else
+ {
+#if _LIBC
+ __fxprintf (NULL, "%s:", program_name);
+#else
+ fprintf (stderr, "%s:", program_name);
+#endif
+ }
+
+#if _LIBC
+ __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ",
+ file_name, line_number);
+#else
+ fprintf (stderr, file_name != NULL ? "%s:%d: " : " ",
+ file_name, line_number);
+#endif
+
+ va_start (args, message);
+ error_tail (status, errnum, message, args);
+
+#ifdef _LIBC
+ _IO_funlockfile (stderr);
+# ifdef __libc_ptf_call
+ __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
+# endif
+#endif
+}
+
+#ifdef _LIBC
+/* Make the weak alias. */
+# undef error
+# undef error_at_line
+weak_alias (__error, error)
+weak_alias (__error_at_line, error_at_line)
+#endif
diff --git a/gnulib/lib/error.h b/gnulib/lib/error.h
new file mode 100644
index 00000000..9deef02d
--- /dev/null
+++ b/gnulib/lib/error.h
@@ -0,0 +1,65 @@
+/* Declaration for error-reporting function
+ Copyright (C) 1995, 1996, 1997, 2003, 2006, 2008, 2009, 2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _ERROR_H
+#define _ERROR_H 1
+
+#ifndef __attribute__
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable __attribute__ only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(Spec) /* empty */
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Print a message with `fprintf (stderr, FORMAT, ...)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
+
+extern void error (int __status, int __errnum, const char *__format, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+
+extern void error_at_line (int __status, int __errnum, const char *__fname,
+ unsigned int __lineno, const char *__format, ...)
+ __attribute__ ((__format__ (__printf__, 5, 6)));
+
+/* If NULL, error will flush stdout, then print on stderr the program
+ name, a colon and a space. Otherwise, error will call this
+ function without parameters instead. */
+extern void (*error_print_progname) (void);
+
+/* This variable is incremented each time `error' is called. */
+extern unsigned int error_message_count;
+
+/* Sometimes we want to have at most one error per line. This
+ variable controls whether this mode is selected or not. */
+extern int error_one_per_line;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* error.h */
diff --git a/gnulib/lib/euidaccess.c b/gnulib/lib/euidaccess.c
new file mode 100644
index 00000000..ba744d5c
--- /dev/null
+++ b/gnulib/lib/euidaccess.c
@@ -0,0 +1,222 @@
+/* euidaccess -- check if effective user id can access file
+
+ Copyright (C) 1990-1991, 1995, 1998, 2000, 2003-2006, 2008-2010 Free
+ Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+/* Written by David MacKenzie and Torbjorn Granlund.
+ Adapted for GNU C library by Roland McGrath. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#if HAVE_LIBGEN_H
+# include <libgen.h>
+#endif
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#if defined EACCES && !defined EACCESS
+# define EACCESS EACCES
+#endif
+
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+
+#ifdef _LIBC
+
+# define access __access
+# define getuid __getuid
+# define getgid __getgid
+# define geteuid __geteuid
+# define getegid __getegid
+# define group_member __group_member
+# define euidaccess __euidaccess
+# undef stat
+# define stat stat64
+
+#else
+
+# include "group-member.h"
+
+#endif
+
+/* Return 0 if the user has permission of type MODE on FILE;
+ otherwise, return -1 and set `errno'.
+ Like access, except that it uses the effective user and group
+ id's instead of the real ones, and it does not always check for read-only
+ file system, text busy, etc. */
+
+int
+euidaccess (const char *file, int mode)
+{
+#if HAVE_FACCESSAT
+ return faccessat (AT_FDCWD, file, mode, AT_EACCESS);
+#elif defined EFF_ONLY_OK
+ return access (file, mode | EFF_ONLY_OK);
+#elif defined ACC_SELF
+ return accessx (file, mode, ACC_SELF);
+#elif HAVE_EACCESS
+ return eaccess (file, mode);
+#else
+
+ uid_t uid = getuid ();
+ gid_t gid = getgid ();
+ uid_t euid = geteuid ();
+ gid_t egid = getegid ();
+ struct stat stats;
+
+# if HAVE_DECL_SETREGID && PREFER_NONREENTRANT_EUIDACCESS
+
+ /* Define PREFER_NONREENTRANT_EUIDACCESS if you prefer euidaccess to
+ return the correct result even if this would make it
+ nonreentrant. Define this only if your entire application is
+ safe even if the uid or gid might temporarily change. If your
+ application uses signal handlers or threads it is probably not
+ safe. */
+
+ if (mode == F_OK)
+ return stat (file, &stats);
+ else
+ {
+ int result;
+ int saved_errno;
+
+ if (uid != euid)
+ setreuid (euid, uid);
+ if (gid != egid)
+ setregid (egid, gid);
+
+ result = access (file, mode);
+ saved_errno = errno;
+
+ /* Restore them. */
+ if (uid != euid)
+ setreuid (uid, euid);
+ if (gid != egid)
+ setregid (gid, egid);
+
+ errno = saved_errno;
+ return result;
+ }
+
+# else
+
+ /* The following code assumes the traditional Unix model, and is not
+ correct on systems that have ACLs or the like. However, it's
+ better than nothing, and it is reentrant. */
+
+ unsigned int granted;
+ if (uid == euid && gid == egid)
+ /* If we are not set-uid or set-gid, access does the same. */
+ return access (file, mode);
+
+ if (stat (file, &stats) != 0)
+ return -1;
+
+ /* The super-user can read and write any file, and execute any file
+ that anyone can execute. */
+ if (euid == 0 && ((mode & X_OK) == 0
+ || (stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))))
+ return 0;
+
+ /* Convert the mode to traditional form, clearing any bogus bits. */
+ if (R_OK == 4 && W_OK == 2 && X_OK == 1 && F_OK == 0)
+ mode &= 7;
+ else
+ mode = ((mode & R_OK ? 4 : 0)
+ + (mode & W_OK ? 2 : 0)
+ + (mode & X_OK ? 1 : 0));
+
+ if (mode == 0)
+ return 0; /* The file exists. */
+
+ /* Convert the file's permission bits to traditional form. */
+ if (S_IRUSR == (4 << 6) && S_IWUSR == (2 << 6) && S_IXUSR == (1 << 6)
+ && S_IRGRP == (4 << 3) && S_IWGRP == (2 << 3) && S_IXGRP == (1 << 3)
+ && S_IROTH == (4 << 0) && S_IWOTH == (2 << 0) && S_IXOTH == (1 << 0))
+ granted = stats.st_mode;
+ else
+ granted = ((stats.st_mode & S_IRUSR ? 4 << 6 : 0)
+ + (stats.st_mode & S_IWUSR ? 2 << 6 : 0)
+ + (stats.st_mode & S_IXUSR ? 1 << 6 : 0)
+ + (stats.st_mode & S_IRGRP ? 4 << 3 : 0)
+ + (stats.st_mode & S_IWGRP ? 2 << 3 : 0)
+ + (stats.st_mode & S_IXGRP ? 1 << 3 : 0)
+ + (stats.st_mode & S_IROTH ? 4 << 0 : 0)
+ + (stats.st_mode & S_IWOTH ? 2 << 0 : 0)
+ + (stats.st_mode & S_IXOTH ? 1 << 0 : 0));
+
+ if (euid == stats.st_uid)
+ granted >>= 6;
+ else if (egid == stats.st_gid || group_member (stats.st_gid))
+ granted >>= 3;
+
+ if ((mode & ~granted) == 0)
+ return 0;
+ __set_errno (EACCESS);
+ return -1;
+
+# endif
+#endif
+}
+#undef euidaccess
+#ifdef weak_alias
+weak_alias (__euidaccess, euidaccess)
+#endif
+
+#ifdef TEST
+# include <error.h>
+# include <stdio.h>
+# include <stdlib.h>
+
+char *program_name;
+
+int
+main (int argc, char **argv)
+{
+ char *file;
+ int mode;
+ int err;
+
+ program_name = argv[0];
+ if (argc < 3)
+ abort ();
+ file = argv[1];
+ mode = atoi (argv[2]);
+
+ err = euidaccess (file, mode);
+ printf ("%d\n", err);
+ if (err != 0)
+ error (0, errno, "%s", file);
+ exit (0);
+}
+#endif
diff --git a/gnulib/lib/exclude.c b/gnulib/lib/exclude.c
new file mode 100644
index 00000000..d4dcd76b
--- /dev/null
+++ b/gnulib/lib/exclude.c
@@ -0,0 +1,556 @@
+/* exclude.c -- exclude file names
+
+ Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
+ 2005, 2006, 2007, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com>
+ and Sergey Poznyakoff <gray@gnu.org>.
+ Thanks to Phil Proudman <phil@proudman51.freeserve.co.uk>
+ for improvement suggestions. */
+
+#include <config.h>
+
+#include <stdbool.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wctype.h>
+
+#include "exclude.h"
+#include "hash.h"
+#include "mbuiter.h"
+#include "fnmatch.h"
+#include "xalloc.h"
+#include "verify.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Non-GNU systems lack these options, so we don't need to check them. */
+#ifndef FNM_CASEFOLD
+# define FNM_CASEFOLD 0
+#endif
+#ifndef FNM_EXTMATCH
+# define FNM_EXTMATCH 0
+#endif
+#ifndef FNM_LEADING_DIR
+# define FNM_LEADING_DIR 0
+#endif
+
+verify (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS)
+ & (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR
+ | FNM_CASEFOLD | FNM_EXTMATCH))
+ == 0);
+
+
+/* Exclusion patterns are grouped into a singly-linked list of
+ "exclusion segments". Each segment represents a set of patterns
+ that can be matches using the same algorithm. Non-wildcard
+ patterns are kept in hash tables, to speed up searches. Wildcard
+ patterns are stored as arrays of patterns. */
+
+
+/* An exclude pattern-options pair. The options are fnmatch options
+ ORed with EXCLUDE_* options. */
+
+struct patopts
+ {
+ char const *pattern;
+ int options;
+ };
+
+/* An array of pattern-options pairs. */
+
+struct exclude_pattern
+ {
+ struct patopts *exclude;
+ size_t exclude_alloc;
+ size_t exclude_count;
+ };
+
+enum exclude_type
+ {
+ exclude_hash, /* a hash table of excluded names */
+ exclude_pattern /* an array of exclude patterns */
+ };
+
+struct exclude_segment
+ {
+ struct exclude_segment *next; /* next segment in list */
+ enum exclude_type type; /* type of this segment */
+ int options; /* common options for this segment */
+ union
+ {
+ Hash_table *table; /* for type == exclude_hash */
+ struct exclude_pattern pat; /* for type == exclude_pattern */
+ } v;
+ };
+
+/* The exclude structure keeps a singly-linked list of exclude segments */
+struct exclude
+ {
+ struct exclude_segment *head, *tail;
+ };
+
+/* Return true if str has wildcard characters */
+bool
+fnmatch_pattern_has_wildcards (const char *str, int options)
+{
+ const char *cset = "\\?*[]";
+ if (options & FNM_NOESCAPE)
+ cset++;
+ while (*str)
+ {
+ size_t n = strcspn (str, cset);
+ if (str[n] == 0)
+ break;
+ else if (str[n] == '\\')
+ {
+ str += n + 1;
+ if (*str)
+ str++;
+ }
+ else
+ return true;
+ }
+ return false;
+}
+
+/* Return a newly allocated and empty exclude list. */
+
+struct exclude *
+new_exclude (void)
+{
+ return xzalloc (sizeof *new_exclude ());
+}
+
+/* Calculate the hash of string. */
+static size_t
+string_hasher (void const *data, size_t n_buckets)
+{
+ char const *p = data;
+ return hash_string (p, n_buckets);
+}
+
+/* Ditto, for case-insensitive hashes */
+static size_t
+string_hasher_ci (void const *data, size_t n_buckets)
+{
+ char const *p = data;
+ mbui_iterator_t iter;
+ size_t value = 0;
+
+ for (mbui_init (iter, p); mbui_avail (iter); mbui_advance (iter))
+ {
+ mbchar_t m = mbui_cur (iter);
+ wchar_t wc;
+
+ if (m.wc_valid)
+ wc = towlower (m.wc);
+ else
+ wc = *m.ptr;
+
+ value = (value * 31 + wc) % n_buckets;
+ }
+
+ return value;
+}
+
+/* compare two strings for equality */
+static bool
+string_compare (void const *data1, void const *data2)
+{
+ char const *p1 = data1;
+ char const *p2 = data2;
+ return strcmp (p1, p2) == 0;
+}
+
+/* compare two strings for equality, case-insensitive */
+static bool
+string_compare_ci (void const *data1, void const *data2)
+{
+ char const *p1 = data1;
+ char const *p2 = data2;
+ return mbscasecmp (p1, p2) == 0;
+}
+
+static void
+string_free (void *data)
+{
+ free (data);
+}
+
+/* Create new exclude segment of given TYPE and OPTIONS, and attach it
+ to the tail of list in EX */
+static struct exclude_segment *
+new_exclude_segment (struct exclude *ex, enum exclude_type type, int options)
+{
+ struct exclude_segment *sp = xzalloc (sizeof (struct exclude_segment));
+ sp->type = type;
+ sp->options = options;
+ switch (type)
+ {
+ case exclude_pattern:
+ break;
+
+ case exclude_hash:
+ sp->v.table = hash_initialize (0, NULL,
+ (options & FNM_CASEFOLD) ?
+ string_hasher_ci
+ : string_hasher,
+ (options & FNM_CASEFOLD) ?
+ string_compare_ci
+ : string_compare,
+ string_free);
+ break;
+ }
+ if (ex->tail)
+ ex->tail->next = sp;
+ else
+ ex->head = sp;
+ ex->tail = sp;
+ return sp;
+}
+
+/* Free a single exclude segment */
+static void
+free_exclude_segment (struct exclude_segment *seg)
+{
+ switch (seg->type)
+ {
+ case exclude_pattern:
+ free (seg->v.pat.exclude);
+ break;
+
+ case exclude_hash:
+ hash_free (seg->v.table);
+ break;
+ }
+ free (seg);
+}
+
+/* Free the storage associated with an exclude list. */
+void
+free_exclude (struct exclude *ex)
+{
+ struct exclude_segment *seg;
+ for (seg = ex->head; seg; )
+ {
+ struct exclude_segment *next = seg->next;
+ free_exclude_segment (seg);
+ seg = next;
+ }
+ free (ex);
+}
+
+/* Return zero if PATTERN matches F, obeying OPTIONS, except that
+ (unlike fnmatch) wildcards are disabled in PATTERN. */
+
+static int
+fnmatch_no_wildcards (char const *pattern, char const *f, int options)
+{
+ if (! (options & FNM_LEADING_DIR))
+ return ((options & FNM_CASEFOLD)
+ ? mbscasecmp (pattern, f)
+ : strcmp (pattern, f));
+ else if (! (options & FNM_CASEFOLD))
+ {
+ size_t patlen = strlen (pattern);
+ int r = strncmp (pattern, f, patlen);
+ if (! r)
+ {
+ r = f[patlen];
+ if (r == '/')
+ r = 0;
+ }
+ return r;
+ }
+ else
+ {
+ /* Walk through a copy of F, seeing whether P matches any prefix
+ of F.
+
+ FIXME: This is an O(N**2) algorithm; it should be O(N).
+ Also, the copy should not be necessary. However, fixing this
+ will probably involve a change to the mbs* API. */
+
+ char *fcopy = xstrdup (f);
+ char *p;
+ int r;
+ for (p = fcopy; ; *p++ = '/')
+ {
+ p = strchr (p, '/');
+ if (p)
+ *p = '\0';
+ r = mbscasecmp (pattern, fcopy);
+ if (!p || r <= 0)
+ break;
+ }
+ free (fcopy);
+ return r;
+ }
+}
+
+bool
+exclude_fnmatch (char const *pattern, char const *f, int options)
+{
+ int (*matcher) (char const *, char const *, int) =
+ (options & EXCLUDE_WILDCARDS
+ ? fnmatch
+ : fnmatch_no_wildcards);
+ bool matched = ((*matcher) (pattern, f, options) == 0);
+ char const *p;
+
+ if (! (options & EXCLUDE_ANCHORED))
+ for (p = f; *p && ! matched; p++)
+ if (*p == '/' && p[1] != '/')
+ matched = ((*matcher) (pattern, p + 1, options) == 0);
+
+ return matched;
+}
+
+/* Return true if the exclude_pattern segment SEG excludes F. */
+
+static bool
+excluded_file_pattern_p (struct exclude_segment const *seg, char const *f)
+{
+ size_t exclude_count = seg->v.pat.exclude_count;
+ struct patopts const *exclude = seg->v.pat.exclude;
+ size_t i;
+ bool excluded = !! (exclude[0].options & EXCLUDE_INCLUDE);
+
+ /* Scan through the options, until they change excluded */
+ for (i = 0; i < exclude_count; i++)
+ {
+ char const *pattern = exclude[i].pattern;
+ int options = exclude[i].options;
+ if (excluded != exclude_fnmatch (pattern, f, options))
+ return !excluded;
+ }
+ return excluded;
+}
+
+/* Return true if the exclude_hash segment SEG excludes F.
+ BUFFER is an auxiliary storage of the same length as F (with nul
+ terminator included) */
+static bool
+excluded_file_name_p (struct exclude_segment const *seg, char const *f,
+ char *buffer)
+{
+ int options = seg->options;
+ bool excluded = !! (options & EXCLUDE_INCLUDE);
+ Hash_table *table = seg->v.table;
+
+ do
+ {
+ /* initialize the pattern */
+ strcpy (buffer, f);
+
+ while (1)
+ {
+ if (hash_lookup (table, buffer))
+ return !excluded;
+ if (options & FNM_LEADING_DIR)
+ {
+ char *p = strrchr (buffer, '/');
+ if (p)
+ {
+ *p = 0;
+ continue;
+ }
+ }
+ break;
+ }
+
+ if (!(options & EXCLUDE_ANCHORED))
+ {
+ f = strchr (f, '/');
+ if (f)
+ f++;
+ }
+ else
+ break;
+ }
+ while (f);
+ return excluded;
+}
+
+/* Return true if EX excludes F. */
+
+bool
+excluded_file_name (struct exclude const *ex, char const *f)
+{
+ struct exclude_segment *seg;
+ bool excluded;
+ char *filename = NULL;
+
+ /* If no patterns are given, the default is to include. */
+ if (!ex->head)
+ return false;
+
+ /* Otherwise, the default is the opposite of the first option. */
+ excluded = !! (ex->head->options & EXCLUDE_INCLUDE);
+ /* Scan through the segments, seeing whether they change status from
+ excluded to included or vice versa. */
+ for (seg = ex->head; seg; seg = seg->next)
+ {
+ bool rc;
+
+ switch (seg->type)
+ {
+ case exclude_pattern:
+ rc = excluded_file_pattern_p (seg, f);
+ break;
+
+ case exclude_hash:
+ if (!filename)
+ filename = xmalloc (strlen (f) + 1);
+ rc = excluded_file_name_p (seg, f, filename);
+ break;
+
+ default:
+ abort ();
+ }
+ if (rc != excluded)
+ {
+ excluded = rc;
+ break;
+ }
+ }
+ free (filename);
+ return excluded;
+}
+
+/* Append to EX the exclusion PATTERN with OPTIONS. */
+
+void
+add_exclude (struct exclude *ex, char const *pattern, int options)
+{
+ struct exclude_segment *seg;
+
+ if ((options & EXCLUDE_WILDCARDS)
+ && fnmatch_pattern_has_wildcards (pattern, options))
+ {
+ struct exclude_pattern *pat;
+ struct patopts *patopts;
+
+ if (ex->tail && ex->tail->type == exclude_pattern
+ && ((ex->tail->options & EXCLUDE_INCLUDE) ==
+ (options & EXCLUDE_INCLUDE)))
+ seg = ex->tail;
+ else
+ seg = new_exclude_segment (ex, exclude_pattern, options);
+
+ pat = &seg->v.pat;
+ if (pat->exclude_count == pat->exclude_alloc)
+ pat->exclude = x2nrealloc (pat->exclude, &pat->exclude_alloc,
+ sizeof *pat->exclude);
+ patopts = &pat->exclude[pat->exclude_count++];
+ patopts->pattern = pattern;
+ patopts->options = options;
+ }
+ else
+ {
+ char *str, *p;
+#define EXCLUDE_HASH_FLAGS (EXCLUDE_INCLUDE|EXCLUDE_ANCHORED|\
+ FNM_LEADING_DIR|FNM_CASEFOLD)
+ if (ex->tail && ex->tail->type == exclude_hash
+ && ((ex->tail->options & EXCLUDE_HASH_FLAGS) ==
+ (options & EXCLUDE_HASH_FLAGS)))
+ seg = ex->tail;
+ else
+ seg = new_exclude_segment (ex, exclude_hash, options);
+
+ str = xstrdup (pattern);
+ p = hash_insert (seg->v.table, str);
+ if (p != str)
+ free (str);
+ }
+}
+
+/* Use ADD_FUNC to append to EX the patterns in FILE_NAME, each with
+ OPTIONS. LINE_END terminates each pattern in the file. If
+ LINE_END is a space character, ignore trailing spaces and empty
+ lines in FILE. Return -1 on failure, 0 on success. */
+
+int
+add_exclude_file (void (*add_func) (struct exclude *, char const *, int),
+ struct exclude *ex, char const *file_name, int options,
+ char line_end)
+{
+ bool use_stdin = file_name[0] == '-' && !file_name[1];
+ FILE *in;
+ char *buf = NULL;
+ char *p;
+ char const *pattern;
+ char const *lim;
+ size_t buf_alloc = 0;
+ size_t buf_count = 0;
+ int c;
+ int e = 0;
+
+ if (use_stdin)
+ in = stdin;
+ else if (! (in = fopen (file_name, "r")))
+ return -1;
+
+ while ((c = getc (in)) != EOF)
+ {
+ if (buf_count == buf_alloc)
+ buf = x2realloc (buf, &buf_alloc);
+ buf[buf_count++] = c;
+ }
+
+ if (ferror (in))
+ e = errno;
+
+ if (!use_stdin && fclose (in) != 0)
+ e = errno;
+
+ buf = xrealloc (buf, buf_count + 1);
+ buf[buf_count] = line_end;
+ lim = buf + buf_count + ! (buf_count == 0 || buf[buf_count - 1] == line_end);
+ pattern = buf;
+
+ for (p = buf; p < lim; p++)
+ if (*p == line_end)
+ {
+ char *pattern_end = p;
+
+ if (isspace ((unsigned char) line_end))
+ {
+ for (; ; pattern_end--)
+ if (pattern_end == pattern)
+ goto next_pattern;
+ else if (! isspace ((unsigned char) pattern_end[-1]))
+ break;
+ }
+
+ *pattern_end = '\0';
+ (*add_func) (ex, pattern, options);
+
+ next_pattern:
+ pattern = p + 1;
+ }
+
+ errno = e;
+ return e ? -1 : 0;
+}
diff --git a/gnulib/lib/exclude.h b/gnulib/lib/exclude.h
new file mode 100644
index 00000000..65d31287
--- /dev/null
+++ b/gnulib/lib/exclude.h
@@ -0,0 +1,52 @@
+/* exclude.h -- declarations for excluding file names
+
+ Copyright (C) 1992, 1993, 1994, 1997, 1999, 2001, 2002, 2003, 2005, 2006,
+ 2009, 2010 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/>. */
+
+#ifndef _GL_EXCLUDE_H
+#define _GL_EXCLUDE_H 1
+
+#include <stdbool.h>
+
+/* Written by Paul Eggert <eggert@twinsun.com>
+ and Sergey Poznyakoff <gray@gnu.org> */
+
+/* Exclude options, which can be ORed with fnmatch options. */
+
+/* Patterns must match the start of file names, instead of matching
+ anywhere after a '/'. */
+#define EXCLUDE_ANCHORED (1 << 30)
+
+/* Include instead of exclude. */
+#define EXCLUDE_INCLUDE (1 << 29)
+
+/* '?', '*', '[', and '\\' are special in patterns. Without this
+ option, these characters are ordinary and fnmatch is not used. */
+#define EXCLUDE_WILDCARDS (1 << 28)
+
+struct exclude;
+
+bool fnmatch_pattern_has_wildcards (const char *, int);
+
+struct exclude *new_exclude (void);
+void free_exclude (struct exclude *);
+void add_exclude (struct exclude *, char const *, int);
+int add_exclude_file (void (*) (struct exclude *, char const *, int),
+ struct exclude *, char const *, int, char);
+bool excluded_file_name (struct exclude const *, char const *);
+bool exclude_fnmatch (char const *pattern, char const *f, int options);
+
+#endif /* _GL_EXCLUDE_H */
diff --git a/gnulib/lib/execute.c b/gnulib/lib/execute.c
new file mode 100644
index 00000000..79193289
--- /dev/null
+++ b/gnulib/lib/execute.c
@@ -0,0 +1,278 @@
+/* Creation of autonomous subprocesses.
+ Copyright (C) 2001-2004, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "execute.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "wait-process.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Native Woe32 API. */
+# include <process.h>
+# include "w32spawn.h"
+
+#else
+
+/* Unix API. */
+# include <spawn.h>
+
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+
+#ifdef EINTR
+
+/* EINTR handling for close(), open().
+ These functions can return -1/EINTR even though we don't have any
+ signal handlers set up, namely when we get interrupted via SIGSTOP. */
+
+static inline int
+nonintr_close (int fd)
+{
+ int retval;
+
+ do
+ retval = close (fd);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#define close nonintr_close
+
+static inline int
+nonintr_open (const char *pathname, int oflag, mode_t mode)
+{
+ int retval;
+
+ do
+ retval = open (pathname, oflag, mode);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef open /* avoid warning on VMS */
+#define open nonintr_open
+
+#endif
+
+
+/* Execute a command, optionally redirecting any of the three standard file
+ descriptors to /dev/null. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127.
+ If slave_process is true, the child process will be terminated when its
+ creator receives a catchable fatal signal. */
+int
+execute (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool ignore_sigpipe,
+ bool null_stdin, bool null_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+ /* Native Woe32 API. */
+ int orig_stdin;
+ int orig_stdout;
+ int orig_stderr;
+ int exitcode;
+ int nullinfd;
+ int nulloutfd;
+
+ /* FIXME: Need to free memory allocated by prepare_spawn. */
+ prog_argv = prepare_spawn (prog_argv);
+
+ /* Save standard file handles of parent process. */
+ if (null_stdin)
+ orig_stdin = dup_safer_noinherit (STDIN_FILENO);
+ if (null_stdout)
+ orig_stdout = dup_safer_noinherit (STDOUT_FILENO);
+ if (null_stderr)
+ orig_stderr = dup_safer_noinherit (STDERR_FILENO);
+ exitcode = -1;
+
+ /* Create standard file handles of child process. */
+ nullinfd = -1;
+ nulloutfd = -1;
+ if ((!null_stdin
+ || ((nullinfd = open ("NUL", O_RDONLY, 0)) >= 0
+ && (nullinfd == STDIN_FILENO
+ || (dup2 (nullinfd, STDIN_FILENO) >= 0
+ && close (nullinfd) >= 0))))
+ && (!(null_stdout || null_stderr)
+ || ((nulloutfd = open ("NUL", O_RDWR, 0)) >= 0
+ && (!null_stdout
+ || nulloutfd == STDOUT_FILENO
+ || dup2 (nulloutfd, STDOUT_FILENO) >= 0)
+ && (!null_stderr
+ || nulloutfd == STDERR_FILENO
+ || dup2 (nulloutfd, STDERR_FILENO) >= 0)
+ && ((null_stdout && nulloutfd == STDOUT_FILENO)
+ || (null_stderr && nulloutfd == STDERR_FILENO)
+ || close (nulloutfd) >= 0))))
+ /* Use spawnvpe and pass the environment explicitly. This is needed if
+ the program has modified the environment using putenv() or [un]setenv().
+ On Windows, programs have two environments, one in the "environment
+ block" of the process and managed through SetEnvironmentVariable(), and
+ one inside the process, in the location retrieved by the 'environ'
+ macro. When using spawnvp() without 'e', the child process inherits a
+ copy of the environment block - ignoring the effects of putenv() and
+ [un]setenv(). */
+ {
+ exitcode = spawnvpe (P_WAIT, prog_path, (const char **) prog_argv,
+ (const char **) environ);
+ if (exitcode < 0 && errno == ENOEXEC)
+ {
+ /* prog is not an native executable. Try to execute it as a
+ shell script. Note that prepare_spawn() has already prepended
+ a hidden element "sh.exe" to prog_argv. */
+ --prog_argv;
+ exitcode = spawnvpe (P_WAIT, prog_argv[0], (const char **) prog_argv,
+ (const char **) environ);
+ }
+ }
+ if (nulloutfd >= 0)
+ close (nulloutfd);
+ if (nullinfd >= 0)
+ close (nullinfd);
+
+ /* Restore standard file handles of parent process. */
+ if (null_stderr)
+ undup_safer_noinherit (orig_stderr, STDERR_FILENO);
+ if (null_stdout)
+ undup_safer_noinherit (orig_stdout, STDOUT_FILENO);
+ if (null_stdin)
+ undup_safer_noinherit (orig_stdin, STDIN_FILENO);
+
+ if (termsigp != NULL)
+ *termsigp = 0;
+
+ if (exitcode == -1)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+
+ return exitcode;
+
+#else
+
+ /* Unix API. */
+ /* Note about 127: Some errors during posix_spawnp() cause the function
+ posix_spawnp() to return an error code; some other errors cause the
+ subprocess to exit with return code 127. It is implementation
+ dependent which error is reported which way. We treat both cases as
+ equivalent. */
+ sigset_t blocked_signals;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+
+ if (slave_process)
+ {
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ block_fatal_signals ();
+ }
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (null_stdin
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDIN_FILENO,
+ "/dev/null", O_RDONLY,
+ 0))
+ != 0)
+ || (null_stdout
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDOUT_FILENO,
+ "/dev/null", O_RDWR,
+ 0))
+ != 0)
+ || (null_stderr
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDERR_FILENO,
+ "/dev/null", O_RDWR,
+ 0))
+ != 0)
+ || (slave_process
+ && ((err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs,
+ &blocked_signals))
+ != 0
+ || (err = posix_spawnattr_setflags (&attrs,
+ POSIX_SPAWN_SETSIGMASK))
+ != 0)))
+ || (err = posix_spawnp (&child, prog_path, &actions,
+ attrs_allocated ? &attrs : NULL, prog_argv,
+ environ))
+ != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ unblock_fatal_signals ();
+ if (termsigp != NULL)
+ *termsigp = 0;
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, err,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ {
+ register_slave_subprocess (child);
+ unblock_fatal_signals ();
+ }
+
+ return wait_subprocess (child, progname, ignore_sigpipe, null_stderr,
+ slave_process, exit_on_error, termsigp);
+
+#endif
+}
diff --git a/gnulib/lib/execute.h b/gnulib/lib/execute.h
new file mode 100644
index 00000000..b99f0cee
--- /dev/null
+++ b/gnulib/lib/execute.h
@@ -0,0 +1,44 @@
+/* Creation of autonomous subprocesses.
+ Copyright (C) 2001-2003, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#ifndef _EXECUTE_H
+#define _EXECUTE_H
+
+#include <stdbool.h>
+
+/* Execute a command, optionally redirecting any of the three standard file
+ descriptors to /dev/null. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127.
+ If ignore_sigpipe is true, consider a subprocess termination due to SIGPIPE
+ as equivalent to a success. This is suitable for processes whose only
+ purpose is to write to standard output.
+ If slave_process is true, the child process will be terminated when its
+ creator receives a catchable fatal signal.
+ If termsigp is not NULL, *termsig will be set to the signal that terminated
+ the subprocess (if supported by the platform: not on native Windows
+ platforms), otherwise 0.
+ It is recommended that no signal is blocked or ignored while execute()
+ is called. See pipe.h for the reason. */
+extern int execute (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool ignore_sigpipe,
+ bool null_stdin, bool null_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp);
+
+#endif /* _EXECUTE_H */
diff --git a/gnulib/lib/exitfail.c b/gnulib/lib/exitfail.c
new file mode 100644
index 00000000..3b63f8a1
--- /dev/null
+++ b/gnulib/lib/exitfail.c
@@ -0,0 +1,25 @@
+/* Failure exit status
+
+ Copyright (C) 2002, 2003, 2005, 2006, 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include "exitfail.h"
+
+#include <stdlib.h>
+
+int volatile exit_failure = EXIT_FAILURE;
diff --git a/gnulib/lib/exitfail.h b/gnulib/lib/exitfail.h
new file mode 100644
index 00000000..7ffffe5c
--- /dev/null
+++ b/gnulib/lib/exitfail.h
@@ -0,0 +1,18 @@
+/* Failure exit status
+
+ Copyright (C) 2002, 2009, 2010 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/>. */
+
+extern int volatile exit_failure;
diff --git a/gnulib/lib/expl.c b/gnulib/lib/expl.c
new file mode 100644
index 00000000..97ad8e38
--- /dev/null
+++ b/gnulib/lib/expl.c
@@ -0,0 +1,135 @@
+/* Emulation for expl.
+ Contributed by Paolo Bonzini
+
+ Copyright 2002, 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+static const long double C[] = {
+/* Chebyshev polynom coeficients for (exp(x)-1)/x */
+#define P1 C[0]
+#define P2 C[1]
+#define P3 C[2]
+#define P4 C[3]
+#define P5 C[4]
+#define P6 C[5]
+ 0.5L,
+ 1.66666666666666666666666666666666683E-01L,
+ 4.16666666666666666666654902320001674E-02L,
+ 8.33333333333333333333314659767198461E-03L,
+ 1.38888888889899438565058018857254025E-03L,
+ 1.98412698413981650382436541785404286E-04L,
+
+/* Smallest integer x for which e^x overflows. */
+#define himark C[6]
+ 11356.523406294143949491931077970765L,
+
+/* Largest integer x for which e^x underflows. */
+#define lomark C[7]
+-11433.4627433362978788372438434526231L,
+
+/* very small number */
+#define TINY C[8]
+ 1.0e-4900L,
+
+/* 2^16383 */
+#define TWO16383 C[9]
+ 5.94865747678615882542879663314003565E+4931L};
+
+long double
+expl (long double x)
+{
+ /* Check for usual case. */
+ if (x < himark && x > lomark)
+ {
+ int exponent;
+ long double t, x22;
+ int k = 1;
+ long double result = 1.0;
+
+ /* Compute an integer power of e with a granularity of 0.125. */
+ exponent = (int) floorl (x * 8.0L);
+ x -= exponent / 8.0L;
+
+ if (x > 0.0625)
+ {
+ exponent++;
+ x -= 0.125L;
+ }
+
+ if (exponent < 0)
+ {
+ t = 0.8824969025845954028648921432290507362220L; /* e^-0.25 */
+ exponent = -exponent;
+ }
+ else
+ t = 1.1331484530668263168290072278117938725655L; /* e^0.25 */
+
+ while (exponent)
+ {
+ if (exponent & k)
+ {
+ result *= t;
+ exponent ^= k;
+ }
+ t *= t;
+ k <<= 1;
+ }
+
+ /* Approximate (e^x - 1)/x, using a seventh-degree polynomial,
+ with maximum error in [-2^-16-2^-53,2^-16+2^-53]
+ less than 4.8e-39. */
+ x22 = x + x*x*(P1+x*(P2+x*(P3+x*(P4+x*(P5+x*P6)))));
+
+ return result + result * x22;
+ }
+ /* Exceptional cases: */
+ else if (x < himark)
+ {
+ if (x + x == x)
+ /* e^-inf == 0, with no error. */
+ return 0;
+ else
+ /* Underflow */
+ return TINY * TINY;
+ }
+ else
+ /* Return x, if x is a NaN or Inf; or overflow, otherwise. */
+ return TWO16383*x;
+}
+
+#if 0
+int
+main (void)
+{
+ printf ("%.16Lg\n", expl(1.0L));
+ printf ("%.16Lg\n", expl(-1.0L));
+ printf ("%.16Lg\n", expl(2.0L));
+ printf ("%.16Lg\n", expl(4.0L));
+ printf ("%.16Lg\n", expl(-2.0L));
+ printf ("%.16Lg\n", expl(-4.0L));
+ printf ("%.16Lg\n", expl(0.0625L));
+ printf ("%.16Lg\n", expl(0.3L));
+ printf ("%.16Lg\n", expl(0.6L));
+}
+#endif
diff --git a/gnulib/lib/faccessat.c b/gnulib/lib/faccessat.c
new file mode 100644
index 00000000..d110aaa2
--- /dev/null
+++ b/gnulib/lib/faccessat.c
@@ -0,0 +1,44 @@
+/* Check the access rights of a file relative to an open directory.
+ Copyright (C) 2009-2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#ifndef HAVE_ACCESS
+/* Mingw lacks access, but it also lacks real vs. effective ids, so
+ the gnulib euidaccess module is good enough. */
+# undef access
+# define access euidaccess
+#endif
+
+/* Invoke access or euidaccess on file, FILE, using mode MODE, in the directory
+ open on descriptor FD. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir, then
+ (access|euidaccess)/restore_cwd. If either the save_cwd or the
+ restore_cwd fails, then give a diagnostic and exit nonzero.
+ Note that this implementation only supports AT_EACCESS, although some
+ native versions also support AT_SYMLINK_NOFOLLOW. */
+
+#define AT_FUNC_NAME faccessat
+#define AT_FUNC_F1 euidaccess
+#define AT_FUNC_F2 access
+#define AT_FUNC_USE_F1_COND AT_EACCESS
+#define AT_FUNC_POST_FILE_PARAM_DECLS , int mode, int flag
+#define AT_FUNC_POST_FILE_ARGS , mode
+#include "at-func.c"
diff --git a/gnulib/lib/fatal-signal.c b/gnulib/lib/fatal-signal.c
new file mode 100644
index 00000000..4c612635
--- /dev/null
+++ b/gnulib/lib/fatal-signal.c
@@ -0,0 +1,286 @@
+/* Emergency actions in case of a fatal signal.
+ Copyright (C) 2003-2004, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "fatal-signal.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "sig-handler.h"
+#include "xalloc.h"
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+/* ========================================================================= */
+
+
+/* The list of fatal signals.
+ These are those signals whose default action is to terminate the process
+ without a core dump, except
+ SIGKILL - because it cannot be caught,
+ SIGALRM SIGUSR1 SIGUSR2 SIGPOLL SIGIO SIGLOST - because applications
+ often use them for their own purpose,
+ SIGPROF SIGVTALRM - because they are used for profiling,
+ SIGSTKFLT - because it is more similar to SIGFPE, SIGSEGV, SIGBUS,
+ SIGSYS - because it is more similar to SIGABRT, SIGSEGV,
+ SIGPWR - because it of too special use,
+ SIGRTMIN...SIGRTMAX - because they are reserved for application use.
+ plus
+ SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */
+
+static int fatal_signals[] =
+ {
+ /* ISO C 99 signals. */
+#ifdef SIGINT
+ SIGINT,
+#endif
+#ifdef SIGTERM
+ SIGTERM,
+#endif
+ /* POSIX:2001 signals. */
+#ifdef SIGHUP
+ SIGHUP,
+#endif
+#ifdef SIGPIPE
+ SIGPIPE,
+#endif
+ /* BSD signals. */
+#ifdef SIGXCPU
+ SIGXCPU,
+#endif
+#ifdef SIGXFSZ
+ SIGXFSZ,
+#endif
+ /* Woe32 signals. */
+#ifdef SIGBREAK
+ SIGBREAK,
+#endif
+ 0
+ };
+
+#define num_fatal_signals (SIZEOF (fatal_signals) - 1)
+
+/* Eliminate signals whose signal handler is SIG_IGN. */
+
+static void
+init_fatal_signals (void)
+{
+ static bool fatal_signals_initialized = false;
+ if (!fatal_signals_initialized)
+ {
+ size_t i;
+
+ for (i = 0; i < num_fatal_signals; i++)
+ {
+ struct sigaction action;
+
+ if (sigaction (fatal_signals[i], NULL, &action) >= 0
+ && get_handler (&action) == SIG_IGN)
+ fatal_signals[i] = -1;
+ }
+
+ fatal_signals_initialized = true;
+ }
+}
+
+
+/* ========================================================================= */
+
+
+typedef void (*action_t) (void);
+
+/* Type of an entry in the actions array.
+ The 'action' field is accessed from within the fatal_signal_handler(),
+ therefore we mark it as 'volatile'. */
+typedef struct
+{
+ volatile action_t action;
+}
+actions_entry_t;
+
+/* The registered cleanup actions. */
+static actions_entry_t static_actions[32];
+static actions_entry_t * volatile actions = static_actions;
+static sig_atomic_t volatile actions_count = 0;
+static size_t actions_allocated = SIZEOF (static_actions);
+
+
+/* The saved signal handlers.
+ Size 32 would not be sufficient: On HP-UX, SIGXCPU = 33, SIGXFSZ = 34. */
+static struct sigaction saved_sigactions[64];
+
+
+/* Uninstall the handlers. */
+static inline void
+uninstall_handlers ()
+{
+ size_t i;
+
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ {
+ int sig = fatal_signals[i];
+ if (saved_sigactions[sig].sa_handler == SIG_IGN)
+ saved_sigactions[sig].sa_handler = SIG_DFL;
+ sigaction (sig, &saved_sigactions[sig], NULL);
+ }
+}
+
+
+/* The signal handler. It gets called asynchronously. */
+static void
+fatal_signal_handler (int sig)
+{
+ for (;;)
+ {
+ /* Get the last registered cleanup action, in a reentrant way. */
+ action_t action;
+ size_t n = actions_count;
+ if (n == 0)
+ break;
+ n--;
+ actions_count = n;
+ action = actions[n].action;
+ /* Execute the action. */
+ action ();
+ }
+
+ /* Now execute the signal's default action.
+ If the signal being delivered was blocked, the re-raised signal would be
+ delivered when this handler returns. But the way we install this handler,
+ no signal is blocked, and the re-raised signal is delivered already
+ during raise(). */
+ uninstall_handlers ();
+ raise (sig);
+}
+
+
+/* Install the handlers. */
+static inline void
+install_handlers ()
+{
+ size_t i;
+ struct sigaction action;
+
+ action.sa_handler = &fatal_signal_handler;
+ /* If we get a fatal signal while executing fatal_signal_handler, enter
+ fatal_signal_handler recursively, since it is reentrant. Hence no
+ SA_RESETHAND. */
+ action.sa_flags = SA_NODEFER;
+ sigemptyset (&action.sa_mask);
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ {
+ int sig = fatal_signals[i];
+
+ if (!(sig < sizeof (saved_sigactions) / sizeof (saved_sigactions[0])))
+ abort ();
+ sigaction (sig, &action, &saved_sigactions[sig]);
+ }
+}
+
+
+/* Register a cleanup function to be executed when a catchable fatal signal
+ occurs. */
+void
+at_fatal_signal (action_t action)
+{
+ static bool cleanup_initialized = false;
+ if (!cleanup_initialized)
+ {
+ init_fatal_signals ();
+ install_handlers ();
+ cleanup_initialized = true;
+ }
+
+ if (actions_count == actions_allocated)
+ {
+ /* Extend the actions array. Note that we cannot use xrealloc(),
+ because then the cleanup() function could access an already
+ deallocated array. */
+ actions_entry_t *old_actions = actions;
+ size_t old_actions_allocated = actions_allocated;
+ size_t new_actions_allocated = 2 * actions_allocated;
+ actions_entry_t *new_actions =
+ XNMALLOC (new_actions_allocated, actions_entry_t);
+ size_t k;
+
+ /* Don't use memcpy() here, because memcpy takes non-volatile arguments
+ and is therefore not guaranteed to complete all memory stores before
+ the next statement. */
+ for (k = 0; k < old_actions_allocated; k++)
+ new_actions[k] = old_actions[k];
+ actions = new_actions;
+ actions_allocated = new_actions_allocated;
+ /* Now we can free the old actions array. */
+ if (old_actions != static_actions)
+ free (old_actions);
+ }
+ /* The two uses of 'volatile' in the types above (and ISO C 99 section
+ 5.1.2.3.(5)) ensure that we increment the actions_count only after
+ the new action has been written to the memory location
+ actions[actions_count]. */
+ actions[actions_count].action = action;
+ actions_count++;
+}
+
+
+/* ========================================================================= */
+
+
+static sigset_t fatal_signal_set;
+
+static void
+init_fatal_signal_set ()
+{
+ static bool fatal_signal_set_initialized = false;
+ if (!fatal_signal_set_initialized)
+ {
+ size_t i;
+
+ init_fatal_signals ();
+
+ sigemptyset (&fatal_signal_set);
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ sigaddset (&fatal_signal_set, fatal_signals[i]);
+
+ fatal_signal_set_initialized = true;
+ }
+}
+
+/* Temporarily delay the catchable fatal signals. */
+void
+block_fatal_signals ()
+{
+ init_fatal_signal_set ();
+ sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+}
+
+/* Stop delaying the catchable fatal signals. */
+void
+unblock_fatal_signals ()
+{
+ init_fatal_signal_set ();
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+}
diff --git a/gnulib/lib/fatal-signal.h b/gnulib/lib/fatal-signal.h
new file mode 100644
index 00000000..133eced5
--- /dev/null
+++ b/gnulib/lib/fatal-signal.h
@@ -0,0 +1,76 @@
+/* Emergency actions in case of a fatal signal.
+ Copyright (C) 2003-2004, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* It is often useful to do some cleanup action when a usually fatal signal
+ terminates the process, like removing a temporary file or killing a
+ subprocess that may be stuck waiting for a device, pipe or network input.
+ Such signals are SIGHUP, SIGINT, SIGPIPE, SIGTERM, and possibly others.
+ The limitation of this facility is that it cannot work for SIGKILL.
+
+ Signals with a SIG_IGN handler are considered to be non-fatal. The
+ functions in this file assume that when a SIG_IGN handler is installed
+ for a signal, it was installed before any functions in this file were
+ called and it stays so for the whole lifetime of the process. */
+
+/* Register a cleanup function to be executed when a catchable fatal signal
+ occurs.
+
+ Restrictions for the cleanup function:
+ - The cleanup function can do all kinds of system calls.
+ - It can also access application dependent memory locations and data
+ structures provided they are in a consistent state. One way to ensure
+ this is through block_fatal_signals()/unblock_fatal_signals(), see
+ below. Another - more tricky - way to ensure this is the careful use
+ of 'volatile'.
+ However,
+ - malloc() and similarly complex facilities are not safe to be called
+ because they are not guaranteed to be in a consistent state.
+ - Also, the cleanup function must not block the catchable fatal signals
+ and leave them blocked upon return.
+
+ The cleanup function is executed asynchronously. It is unspecified
+ whether during its execution the catchable fatal signals are blocked
+ or not. */
+extern void at_fatal_signal (void (*function) (void));
+
+
+/* Sometimes it is necessary to block the usually fatal signals while the
+ data structures being accessed by the cleanup action are being built or
+ reorganized. This is the case, for example, when a temporary file or
+ directory is created through mkstemp() or mkdtemp(), because these
+ functions create the temporary file or directory _before_ returning its
+ name to the application. */
+
+/* Temporarily delay the catchable fatal signals.
+ The signals will be blocked (= delayed) until the next call to
+ unblock_fatal_signals(). If the signals are already blocked, a further
+ call to block_fatal_signals() has no effect. */
+extern void block_fatal_signals (void);
+
+/* Stop delaying the catchable fatal signals. */
+extern void unblock_fatal_signals (void);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/fbufmode.c b/gnulib/lib/fbufmode.c
new file mode 100644
index 00000000..42a305b5
--- /dev/null
+++ b/gnulib/lib/fbufmode.c
@@ -0,0 +1,83 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fbufmode.h"
+
+#if HAVE___FLBF
+# include <stdio_ext.h>
+#endif
+
+#include "stdio-impl.h"
+
+int
+fbufmode (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+# if HAVE___FLBF /* glibc >= 2.2 */
+ if (__flbf (fp))
+ return _IOLBF;
+# else
+ if (fp->_flags & _IO_LINE_BUF)
+ return _IOLBF;
+# endif
+ if (fp->_flags & _IO_UNBUFFERED)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if (fp_->_flags & __SLBF)
+ return _IOLBF;
+ if (fp_->_flags & __SNBF)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __EMX__ /* emx+gcc */
+ return fp->_flags & (_IOLBF | _IONBF | _IOFBF);
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+# if HAVE___FLBF /* Solaris >= 7 */
+ if (__flbf (fp))
+ return _IOLBF;
+# else
+ if (fp->_flag & _IOLBF)
+ return _IOLBF;
+# endif
+ if (fp_->_flag & _IONBF)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __UCLIBC__ /* uClibc */
+ if (fp->__modeflags & __FLAG_LBF)
+ return _IOLBF;
+ if (fp->__modeflags & __FLAG_NBF)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __QNX__ /* QNX */
+ if (fp->_Mode & 0x400 /* _MLBF */)
+ return _IOLBF;
+ if (fp->_Mode & 0x800 /* _MNBF */)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (fp->__linebuf)
+ return _IOLBF;
+ return (fp->__bufsize > 0 ? _IOFBF : _IONBF);
+#else
+ #error "Please port gnulib fbufmode.c to your platform! Look at the setvbuf implementation."
+#endif
+}
diff --git a/gnulib/lib/fbufmode.h b/gnulib/lib/fbufmode.h
new file mode 100644
index 00000000..346583a0
--- /dev/null
+++ b/gnulib/lib/fbufmode.h
@@ -0,0 +1,36 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the buffering mode of the stream STREAM.
+
+ Result means
+ ------ -------
+ _IONBF unbuffered
+ _IOLBF line buffered
+ _IOFBF fully buffered
+
+ STREAM must not be wide-character oriented. */
+extern int fbufmode (FILE *stream);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/fchdir.c b/gnulib/lib/fchdir.c
new file mode 100644
index 00000000..015e5f38
--- /dev/null
+++ b/gnulib/lib/fchdir.c
@@ -0,0 +1,287 @@
+/* fchdir replacement.
+ Copyright (C) 2006-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <assert.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifndef REPLACE_OPEN_DIRECTORY
+# define REPLACE_OPEN_DIRECTORY 0
+#endif
+
+#ifndef HAVE_CANONICALIZE_FILE_NAME
+# if GNULIB_CANONICALIZE || GNULIB_CANONICALIZE_LGPL
+# define HAVE_CANONICALIZE_FILE_NAME 1
+# else
+# define HAVE_CANONICALIZE_FILE_NAME 0
+# define canonicalize_file_name(name) NULL
+# endif
+#endif
+
+/* This replacement assumes that a directory is not renamed while opened
+ through a file descriptor.
+
+ FIXME: On mingw, this would be possible to enforce if we were to
+ also open a HANDLE to each directory currently visited by a file
+ descriptor, since mingw refuses to rename any in-use file system
+ object. */
+
+/* Array of file descriptors opened. If REPLACE_OPEN_DIRECTORY or if it points
+ to a directory, it stores info about this directory. */
+typedef struct
+{
+ char *name; /* Absolute name of the directory, or NULL. */
+ /* FIXME - add a DIR* member to make dirfd possible on mingw? */
+} dir_info_t;
+static dir_info_t *dirs;
+static size_t dirs_allocated;
+
+/* Try to ensure dirs has enough room for a slot at index fd; free any
+ contents already in that slot. Return false and set errno to
+ ENOMEM on allocation failure. */
+static bool
+ensure_dirs_slot (size_t fd)
+{
+ if (fd < dirs_allocated)
+ free (dirs[fd].name);
+ else
+ {
+ size_t new_allocated;
+ dir_info_t *new_dirs;
+
+ new_allocated = 2 * dirs_allocated + 1;
+ if (new_allocated <= fd)
+ new_allocated = fd + 1;
+ new_dirs =
+ (dirs != NULL
+ ? (dir_info_t *) realloc (dirs, new_allocated * sizeof *dirs)
+ : (dir_info_t *) malloc (new_allocated * sizeof *dirs));
+ if (new_dirs == NULL)
+ return false;
+ memset (new_dirs + dirs_allocated, 0,
+ (new_allocated - dirs_allocated) * sizeof *dirs);
+ dirs = new_dirs;
+ dirs_allocated = new_allocated;
+ }
+ return true;
+}
+
+/* Return the canonical name of DIR in malloc'd storage. */
+static char *
+get_name (char const *dir)
+{
+ char *result;
+ if (REPLACE_OPEN_DIRECTORY || !HAVE_CANONICALIZE_FILE_NAME)
+ {
+ /* The function canonicalize_file_name has not yet been ported
+ to mingw, with all its drive letter and backslash quirks.
+ Fortunately, getcwd is reliable in this case, but we ensure
+ we can get back to where we started before using it. Treat
+ "." as a special case, as it is frequently encountered. */
+ char *cwd = getcwd (NULL, 0);
+ int saved_errno;
+ if (dir[0] == '.' && dir[1] == '\0')
+ return cwd;
+ if (chdir (cwd))
+ return NULL;
+ result = chdir (dir) ? NULL : getcwd (NULL, 0);
+ saved_errno = errno;
+ if (chdir (cwd))
+ abort ();
+ free (cwd);
+ errno = saved_errno;
+ }
+ else
+ {
+ /* Avoid changing the directory. */
+ result = canonicalize_file_name (dir);
+ }
+ return result;
+}
+
+/* Hook into the gnulib replacements for open() and close() to keep track
+ of the open file descriptors. */
+
+/* Close FD, cleaning up any fd to name mapping if fd was visiting a
+ directory. */
+void
+_gl_unregister_fd (int fd)
+{
+ if (fd >= 0 && fd < dirs_allocated)
+ {
+ free (dirs[fd].name);
+ dirs[fd].name = NULL;
+ }
+}
+
+/* Mark FD as visiting FILENAME. FD must be non-negative, and refer
+ to an open file descriptor. If REPLACE_OPEN_DIRECTORY is non-zero,
+ this should only be called if FD is visiting a directory. Close FD
+ and return -1 if there is insufficient memory to track the
+ directory name; otherwise return FD. */
+int
+_gl_register_fd (int fd, const char *filename)
+{
+ struct stat statbuf;
+
+ assert (0 <= fd);
+ if (REPLACE_OPEN_DIRECTORY
+ || (fstat (fd, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)))
+ {
+ if (!ensure_dirs_slot (fd)
+ || (dirs[fd].name = get_name (filename)) == NULL)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ return fd;
+}
+
+/* Mark NEWFD as a duplicate of OLDFD; useful from dup, dup2, dup3,
+ and fcntl. Both arguments must be valid and distinct file
+ descriptors. Close NEWFD and return -1 if OLDFD is tracking a
+ directory, but there is insufficient memory to track the same
+ directory in NEWFD; otherwise return NEWFD. */
+int
+_gl_register_dup (int oldfd, int newfd)
+{
+ assert (0 <= oldfd && 0 <= newfd && oldfd != newfd);
+ if (oldfd < dirs_allocated && dirs[oldfd].name)
+ {
+ /* Duplicated a directory; must ensure newfd is allocated. */
+ if (!ensure_dirs_slot (newfd)
+ || (dirs[newfd].name = strdup (dirs[oldfd].name)) == NULL)
+ {
+ int saved_errno = errno;
+ close (newfd);
+ errno = saved_errno;
+ newfd = -1;
+ }
+ }
+ else if (newfd < dirs_allocated)
+ {
+ /* Duplicated a non-directory; ensure newfd is cleared. */
+ free (dirs[newfd].name);
+ dirs[newfd].name = NULL;
+ }
+ return newfd;
+}
+
+/* If FD is currently visiting a directory, then return the name of
+ that directory. Otherwise, return NULL and set errno. */
+const char *
+_gl_directory_name (int fd)
+{
+ if (0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
+ return dirs[fd].name;
+ /* At this point, fd is either invalid, or open but not a directory.
+ If dup2 fails, errno is correctly EBADF. */
+ if (0 <= fd)
+ {
+ if (dup2 (fd, fd) == fd)
+ errno = ENOTDIR;
+ }
+ else
+ errno = EBADF;
+ return NULL;
+}
+
+#if REPLACE_OPEN_DIRECTORY
+/* Return stat information about FD in STATBUF. Needed when
+ rpl_open() used a dummy file to work around an open() that can't
+ normally visit directories. */
+# undef fstat
+int
+rpl_fstat (int fd, struct stat *statbuf)
+{
+ if (0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
+ return stat (dirs[fd].name, statbuf);
+ return fstat (fd, statbuf);
+}
+#endif
+
+/* Override opendir() and closedir(), to keep track of the open file
+ descriptors. Needed because there is a function dirfd(). */
+
+int
+rpl_closedir (DIR *dp)
+#undef closedir
+{
+ int fd = dirfd (dp);
+ int retval = closedir (dp);
+
+ if (retval >= 0)
+ _gl_unregister_fd (fd);
+ return retval;
+}
+
+DIR *
+rpl_opendir (const char *filename)
+#undef opendir
+{
+ DIR *dp;
+
+ dp = opendir (filename);
+ if (dp != NULL)
+ {
+ int fd = dirfd (dp);
+ if (0 <= fd && _gl_register_fd (fd, filename) != fd)
+ {
+ int saved_errno = errno;
+ closedir (dp);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+ return dp;
+}
+
+/* Override dup(), to keep track of open file descriptors. */
+
+int
+rpl_dup (int oldfd)
+#undef dup
+{
+ int newfd = dup (oldfd);
+
+ if (0 <= newfd)
+ newfd = _gl_register_dup (oldfd, newfd);
+ return newfd;
+}
+
+
+/* Implement fchdir() in terms of chdir(). */
+
+int
+fchdir (int fd)
+{
+ const char *name = _gl_directory_name (fd);
+ return name ? chdir (name) : -1;
+}
diff --git a/gnulib/lib/fchmodat.c b/gnulib/lib/fchmodat.c
new file mode 100644
index 00000000..0a765431
--- /dev/null
+++ b/gnulib/lib/fchmodat.c
@@ -0,0 +1,53 @@
+/* Change the protections of file relative to an open directory.
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#ifndef HAVE_LCHMOD
+/* Use a different name, to avoid conflicting with any
+ system-supplied declaration. */
+# undef lchmod
+# define lchmod lchmod_rpl
+static int
+lchmod (char const *f _GL_UNUSED, mode_t m _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+#endif
+
+/* Solaris 10 has no function like this.
+ Invoke chmod or lchmod on file, FILE, using mode MODE, in the directory
+ open on descriptor FD. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then (chmod|lchmod)/restore_cwd. If either the save_cwd or the
+ restore_cwd fails, then give a diagnostic and exit nonzero.
+ Note that an attempt to use a FLAG value of AT_SYMLINK_NOFOLLOW
+ on a system without lchmod support causes this function to fail. */
+
+#define AT_FUNC_NAME fchmodat
+#define AT_FUNC_F1 lchmod
+#define AT_FUNC_F2 chmod
+#define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+#define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, int flag
+#define AT_FUNC_POST_FILE_ARGS , mode
+#include "at-func.c"
diff --git a/gnulib/lib/fchown-stub.c b/gnulib/lib/fchown-stub.c
new file mode 100644
index 00000000..6be750b8
--- /dev/null
+++ b/gnulib/lib/fchown-stub.c
@@ -0,0 +1,16 @@
+#include <config.h>
+
+#include <sys/types.h>
+#include <errno.h>
+
+/* A trivial substitute for `fchown'.
+
+ DJGPP 2.03 and earlier (and perhaps later) don't have `fchown',
+ so we pretend no-one has permission for this operation. */
+
+int
+fchown (int fd, uid_t uid, gid_t gid)
+{
+ errno = EPERM;
+ return -1;
+}
diff --git a/gnulib/lib/fchownat.c b/gnulib/lib/fchownat.c
new file mode 100644
index 00000000..00126acf
--- /dev/null
+++ b/gnulib/lib/fchownat.c
@@ -0,0 +1,107 @@
+/* This function serves as replacement for a missing fchownat function,
+ as well as a work around for the fchownat bug in glibc-2.4:
+ <http://lists.ubuntu.com/archives/ubuntu-users/2006-September/093218.html>
+ when the buggy fchownat-with-AT_SYMLINK_NOFOLLOW operates on a symlink, it
+ mistakenly affects the symlink referent, rather than the symlink itself.
+
+ Copyright (C) 2006-2007, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+
+#include "openat.h"
+
+#if !HAVE_FCHOWNAT
+
+/* Replacement for Solaris' function by the same name.
+ Invoke chown or lchown on file, FILE, using OWNER and GROUP, in the
+ directory open on descriptor FD. If FLAG is AT_SYMLINK_NOFOLLOW, then
+ use lchown, otherwise, use chown. If possible, do it without changing
+ the working directory. Otherwise, resort to using save_cwd/fchdir,
+ then (chown|lchown)/restore_cwd. If either the save_cwd or the
+ restore_cwd fails, then give a diagnostic and exit nonzero. */
+
+# define AT_FUNC_NAME fchownat
+# define AT_FUNC_F1 lchown
+# define AT_FUNC_F2 chown
+# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+# define AT_FUNC_POST_FILE_PARAM_DECLS , uid_t owner, gid_t group, int flag
+# define AT_FUNC_POST_FILE_ARGS , owner, group
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_F2
+# undef AT_FUNC_USE_F1_COND
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#else /* HAVE_FCHOWNAT */
+
+# undef fchownat
+
+# if FCHOWNAT_NOFOLLOW_BUG
+
+/* Failure to handle AT_SYMLINK_NOFOLLOW requires the /proc/self/fd or
+ fchdir workaround to call lchown for lchownat, but there is no need
+ to penalize chownat. */
+static int
+local_lchownat (int fd, char const *file, uid_t owner, gid_t group);
+
+# define AT_FUNC_NAME local_lchownat
+# define AT_FUNC_F1 lchown
+# define AT_FUNC_POST_FILE_PARAM_DECLS , uid_t owner, gid_t group
+# define AT_FUNC_POST_FILE_ARGS , owner, group
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+# endif
+
+/* Work around bugs with trailing slash, using the same workarounds as
+ chown and lchown. */
+
+int
+rpl_fchownat (int fd, char const *file, uid_t owner, gid_t group, int flag)
+{
+# if FCHOWNAT_NOFOLLOW_BUG
+ if (flag == AT_SYMLINK_NOFOLLOW)
+ return local_lchownat (fd, file, owner, group);
+# endif
+# if CHOWN_TRAILING_SLASH_BUG
+ {
+ size_t len = strlen (file);
+ struct stat st;
+ if (len && file[len - 1] == '/')
+ {
+ if (statat (fd, file, &st))
+ return -1;
+ if (flag == AT_SYMLINK_NOFOLLOW)
+ return fchownat (fd, file, owner, group, 0);
+ }
+ }
+# endif
+ return fchownat (fd, file, owner, group, flag);
+}
+
+#endif /* HAVE_FCHOWNAT */
diff --git a/gnulib/lib/fclose.c b/gnulib/lib/fclose.c
new file mode 100644
index 00000000..9f438891
--- /dev/null
+++ b/gnulib/lib/fclose.c
@@ -0,0 +1,47 @@
+/* fclose replacement.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+/* Override fclose() to call the overridden close(). */
+
+int
+rpl_fclose (FILE *fp)
+#undef fclose
+{
+ int saved_errno = 0;
+
+ if (fflush (fp))
+ saved_errno = errno;
+
+ if (close (fileno (fp)) < 0 && saved_errno == 0)
+ saved_errno = errno;
+
+ fclose (fp); /* will fail with errno = EBADF */
+
+ if (saved_errno != 0)
+ {
+ errno = saved_errno;
+ return EOF;
+ }
+ return 0;
+}
diff --git a/gnulib/lib/fcntl--.h b/gnulib/lib/fcntl--.h
new file mode 100644
index 00000000..7baa2cbc
--- /dev/null
+++ b/gnulib/lib/fcntl--.h
@@ -0,0 +1,32 @@
+/* Like fcntl.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <fcntl.h>
+#include "fcntl-safer.h"
+
+#undef open
+#define open open_safer
+
+#undef creat
+#define creat creat_safer
+
+#if GNULIB_OPENAT_SAFER
+# undef openat
+# define openat openat_safer
+#endif
diff --git a/gnulib/lib/fcntl-safer.h b/gnulib/lib/fcntl-safer.h
new file mode 100644
index 00000000..5c76b4bc
--- /dev/null
+++ b/gnulib/lib/fcntl-safer.h
@@ -0,0 +1,27 @@
+/* Invoke fcntl-like functions, but avoid some glitches.
+
+ Copyright (C) 2005, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <sys/types.h>
+
+int open_safer (char const *, int, ...);
+int creat_safer (char const *, mode_t);
+
+#if GNULIB_OPENAT_SAFER
+int openat_safer (int, char const *, int, ...);
+#endif
diff --git a/gnulib/lib/fcntl.c b/gnulib/lib/fcntl.c
new file mode 100644
index 00000000..c51e8ded
--- /dev/null
+++ b/gnulib/lib/fcntl.c
@@ -0,0 +1,294 @@
+/* Provide file descriptor control.
+
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <fcntl.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <unistd.h>
+
+#if !HAVE_FCNTL
+# define rpl_fcntl fcntl
+#endif
+#undef fcntl
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* Upper bound on getdtablesize(). See lib/getdtablesize.c. */
+# define OPEN_MAX_MAX 0x10000
+
+/* Duplicate OLDFD into the first available slot of at least NEWFD,
+ which must be positive, with FLAGS determining whether the duplicate
+ will be inheritable. */
+static int
+dupfd (int oldfd, int newfd, int flags)
+{
+ /* Mingw has no way to create an arbitrary fd. Iterate until all
+ file descriptors less than newfd are filled up. */
+ HANDLE curr_process = GetCurrentProcess ();
+ HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd);
+ unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT];
+ unsigned int fds_to_close_bound = 0;
+ int result;
+ BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE;
+ int mode;
+
+ if (newfd < 0 || getdtablesize () <= newfd)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ if (old_handle == INVALID_HANDLE_VALUE
+ || (mode = setmode (oldfd, O_BINARY)) == -1)
+ {
+ /* oldfd is not open, or is an unassigned standard file
+ descriptor. */
+ errno = EBADF;
+ return -1;
+ }
+ setmode (oldfd, mode);
+ flags |= mode;
+
+ for (;;)
+ {
+ HANDLE new_handle;
+ int duplicated_fd;
+ unsigned int index;
+
+ if (!DuplicateHandle (curr_process, /* SourceProcessHandle */
+ old_handle, /* SourceHandle */
+ curr_process, /* TargetProcessHandle */
+ (PHANDLE) &new_handle, /* TargetHandle */
+ (DWORD) 0, /* DesiredAccess */
+ inherit, /* InheritHandle */
+ DUPLICATE_SAME_ACCESS)) /* Options */
+ {
+ /* TODO: Translate GetLastError () into errno. */
+ errno = EMFILE;
+ result = -1;
+ break;
+ }
+ duplicated_fd = _open_osfhandle ((long) new_handle, flags);
+ if (duplicated_fd < 0)
+ {
+ CloseHandle (new_handle);
+ errno = EMFILE;
+ result = -1;
+ break;
+ }
+ if (newfd <= duplicated_fd)
+ {
+ result = duplicated_fd;
+ break;
+ }
+
+ /* Set the bit duplicated_fd in fds_to_close[]. */
+ index = (unsigned int) duplicated_fd / CHAR_BIT;
+ if (fds_to_close_bound <= index)
+ {
+ if (sizeof fds_to_close <= index)
+ /* Need to increase OPEN_MAX_MAX. */
+ abort ();
+ memset (fds_to_close + fds_to_close_bound, '\0',
+ index + 1 - fds_to_close_bound);
+ fds_to_close_bound = index + 1;
+ }
+ fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT);
+ }
+
+ /* Close the previous fds that turned out to be too small. */
+ {
+ int saved_errno = errno;
+ unsigned int duplicated_fd;
+
+ for (duplicated_fd = 0;
+ duplicated_fd < fds_to_close_bound * CHAR_BIT;
+ duplicated_fd++)
+ if ((fds_to_close[duplicated_fd / CHAR_BIT]
+ >> (duplicated_fd % CHAR_BIT))
+ & 1)
+ close (duplicated_fd);
+
+ errno = saved_errno;
+ }
+
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (oldfd, result);
+# endif
+ return result;
+}
+#endif /* W32 */
+
+/* Perform the specified ACTION on the file descriptor FD, possibly
+ using the argument ARG further described below. This replacement
+ handles the following actions, and forwards all others on to the
+ native fcntl. An unrecognized ACTION returns -1 with errno set to
+ EINVAL.
+
+ F_DUPFD - duplicate FD, with int ARG being the minimum target fd.
+ If successful, return the duplicate, which will be inheritable;
+ otherwise return -1 and set errno.
+
+ F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum
+ target fd. If successful, return the duplicate, which will not be
+ inheritable; otherwise return -1 and set errno.
+
+ F_GETFD - ARG need not be present. If successful, return a
+ non-negative value containing the descriptor flags of FD (only
+ FD_CLOEXEC is portable, but other flags may be present); otherwise
+ return -1 and set errno. */
+
+int
+rpl_fcntl (int fd, int action, /* arg */...)
+{
+ va_list arg;
+ int result = -1;
+ va_start (arg, action);
+ switch (action)
+ {
+
+#if !HAVE_FCNTL
+ case F_DUPFD:
+ {
+ int target = va_arg (arg, int);
+ result = dupfd (fd, target, 0);
+ break;
+ }
+#elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR
+ case F_DUPFD:
+ {
+ int target = va_arg (arg, int);
+ /* Detect invalid target; needed for cygwin 1.5.x. */
+ if (target < 0 || getdtablesize () <= target)
+ errno = EINVAL;
+ else
+ {
+ result = fcntl (fd, action, target);
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (fd, result);
+# endif
+ }
+ break;
+ } /* F_DUPFD */
+#endif /* FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR */
+
+ case F_DUPFD_CLOEXEC:
+ {
+ int target = va_arg (arg, int);
+
+#if !HAVE_FCNTL
+ result = dupfd (fd, target, O_CLOEXEC);
+ break;
+#else /* HAVE_FCNTL */
+ /* Try the system call first, if the headers claim it exists
+ (that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we
+ may be running with a glibc that has the macro but with an
+ older kernel that does not support it. Cache the
+ information on whether the system call really works, but
+ avoid caching failure if the corresponding F_DUPFD fails
+ for any reason. 0 = unknown, 1 = yes, -1 = no. */
+ static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0;
+ if (0 <= have_dupfd_cloexec)
+ {
+ result = fcntl (fd, action, target);
+ if (0 <= result || errno != EINVAL)
+ {
+ have_dupfd_cloexec = 1;
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (fd, result);
+# endif
+ }
+ else
+ {
+ result = rpl_fcntl (fd, F_DUPFD, target);
+ if (result < 0)
+ break;
+ have_dupfd_cloexec = -1;
+ }
+ }
+ else
+ result = rpl_fcntl (fd, F_DUPFD, target);
+ if (0 <= result && have_dupfd_cloexec == -1)
+ {
+ int flags = fcntl (result, F_GETFD);
+ if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1)
+ {
+ int saved_errno = errno;
+ close (result);
+ errno = saved_errno;
+ result = -1;
+ }
+ }
+ break;
+#endif /* HAVE_FCNTL */
+ } /* F_DUPFD_CLOEXEC */
+
+#if !HAVE_FCNTL
+ case F_GETFD:
+ {
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ HANDLE handle = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ if (handle == INVALID_HANDLE_VALUE
+ || GetHandleInformation (handle, &flags) == 0)
+ errno = EBADF;
+ else
+ result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC;
+# else /* !W32 */
+ /* Use dup2 to reject invalid file descriptors. No way to
+ access this information, so punt. */
+ if (0 <= dup2 (fd, fd))
+ result = 0;
+# endif /* !W32 */
+ break;
+ } /* F_GETFD */
+#endif /* !HAVE_FCNTL */
+
+ /* Implementing F_SETFD on mingw is not trivial - there is no
+ API for changing the O_NOINHERIT bit on an fd, and merely
+ changing the HANDLE_FLAG_INHERIT bit on the underlying handle
+ can lead to odd state. It may be possible by duplicating the
+ handle, using _open_osfhandle with the right flags, then
+ using dup2 to move the duplicate onto the original, but that
+ is not supported for now. */
+
+ default:
+ {
+#if HAVE_FCNTL
+ void *p = va_arg (arg, void *);
+ result = fcntl (fd, action, p);
+#else
+ errno = EINVAL;
+#endif
+ break;
+ }
+ }
+ va_end (arg);
+ return result;
+}
diff --git a/gnulib/lib/fcntl.in.h b/gnulib/lib/fcntl.in.h
new file mode 100644
index 00000000..a1d9e230
--- /dev/null
+++ b/gnulib/lib/fcntl.in.h
@@ -0,0 +1,258 @@
+/* Like <fcntl.h>, but with non-working flags defined to 0.
+
+ Copyright (C) 2006-2010 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/>. */
+
+/* written by Paul Eggert */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if defined __need_system_fcntl_h
+/* Special invocation convention. */
+
+#include <sys/types.h>
+#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */
+# include <sys/stat.h>
+#endif
+#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _GL_FCNTL_H
+
+#include <sys/types.h>
+#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */
+# include <sys/stat.h>
+#endif
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
+
+#ifndef _GL_FCNTL_H
+#define _GL_FCNTL_H
+
+#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */
+# include <unistd.h>
+#endif
+
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_FCNTL@
+# if @REPLACE_FCNTL@
+# undef fcntl
+# define fcntl rpl_fcntl
+# endif
+# if !@HAVE_FCNTL@ || @REPLACE_FCNTL@
+extern int fcntl (int fd, int action, ...);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fcntl
+# if HAVE_RAW_DECL_FCNTL
+_GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - "
+ "use gnulib module fcntl for portability");
+# endif
+#endif
+
+#if @GNULIB_OPEN@
+# if @REPLACE_OPEN@
+# undef open
+# define open rpl_open
+extern int open (const char *filename, int flags, ...) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef open
+/* Assume open is always declared. */
+_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
+ "use gnulib module open for portability");
+#endif
+
+#if @GNULIB_OPENAT@
+# if @REPLACE_OPENAT@
+# undef openat
+# define openat rpl_openat
+# endif
+# if !@HAVE_OPENAT@ || @REPLACE_OPENAT@
+extern int openat (int fd, char const *file, int flags, /* mode_t mode */ ...)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef openat
+# if HAVE_RAW_DECL_OPENAT
+_GL_WARN_ON_USE (openat, "openat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Fix up the FD_* macros, only known to be missing on mingw. */
+
+#ifndef FD_CLOEXEC
+# define FD_CLOEXEC 1
+#endif
+
+/* Fix up the supported F_* macros. Intentionally leave other F_*
+ macros undefined. Only known to be missing on mingw. */
+
+#ifndef F_DUPFD_CLOEXEC
+# define F_DUPFD_CLOEXEC 0x40000000
+/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */
+# define GNULIB_defined_F_DUPFD_CLOEXEC 1
+#else
+# define GNULIB_defined_F_DUPFD_CLOEXEC 0
+#endif
+
+#ifndef F_DUPFD
+# define F_DUPFD 1
+#endif
+
+#ifndef F_GETFD
+# define F_GETFD 2
+#endif
+
+/* Fix up the O_* macros. */
+
+#if !defined O_DIRECT && defined O_DIRECTIO
+/* Tru64 spells it `O_DIRECTIO'. */
+# define O_DIRECT O_DIRECTIO
+#endif
+
+#if !defined O_CLOEXEC && defined O_NOINHERIT
+/* Mingw spells it `O_NOINHERIT'. Intentionally leave it
+ undefined if not available. */
+# define O_CLOEXEC O_NOINHERIT
+#endif
+
+#ifndef O_DIRECT
+# define O_DIRECT 0
+#endif
+
+#ifndef O_DIRECTORY
+# define O_DIRECTORY 0
+#endif
+
+#ifndef O_DSYNC
+# define O_DSYNC 0
+#endif
+
+#ifndef O_NDELAY
+# define O_NDELAY 0
+#endif
+
+#ifndef O_NOATIME
+# define O_NOATIME 0
+#endif
+
+#ifndef O_NONBLOCK
+# define O_NONBLOCK O_NDELAY
+#endif
+
+#ifndef O_NOCTTY
+# define O_NOCTTY 0
+#endif
+
+#ifndef O_NOFOLLOW
+# define O_NOFOLLOW 0
+#endif
+
+#ifndef O_NOLINKS
+# define O_NOLINKS 0
+#endif
+
+#ifndef O_RSYNC
+# define O_RSYNC 0
+#endif
+
+#ifndef O_SYNC
+# define O_SYNC 0
+#endif
+
+#ifndef O_TTY_INIT
+# define O_TTY_INIT 0
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is usually declared in fcntl.h */
+#if !defined O_BINARY && defined _O_BINARY
+ /* For MSC-compatible compilers. */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+
+#if defined __BEOS__ || defined __HAIKU__
+ /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+# define O_TEXT 0
+#endif
+
+/* Fix up the AT_* macros. */
+
+/* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its
+ value exceeds INT_MAX, so its use as an int doesn't conform to the
+ C standard, and GCC and Sun C complain in some cases. If the bug
+ is present, undef AT_FDCWD here, so it can be redefined below. */
+#if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
+# undef AT_FDCWD
+#endif
+
+/* Use the same bit pattern as Solaris 9, but with the proper
+ signedness. The bit pattern is important, in case this actually is
+ Solaris with the above workaround. */
+#ifndef AT_FDCWD
+# define AT_FDCWD (-3041965)
+#endif
+
+/* Use the same values as Solaris 9. This shouldn't matter, but
+ there's no real reason to differ. */
+#ifndef AT_SYMLINK_NOFOLLOW
+# define AT_SYMLINK_NOFOLLOW 4096
+#endif
+
+#ifndef AT_REMOVEDIR
+# define AT_REMOVEDIR 1
+#endif
+
+/* Solaris 9 lacks these two, so just pick unique values. */
+#ifndef AT_SYMLINK_FOLLOW
+# define AT_SYMLINK_FOLLOW 2
+#endif
+
+#ifndef AT_EACCESS
+# define AT_EACCESS 4
+#endif
+
+
+#endif /* _GL_FCNTL_H */
+#endif /* _GL_FCNTL_H */
+#endif
diff --git a/gnulib/lib/fd-safer-flag.c b/gnulib/lib/fd-safer-flag.c
new file mode 100644
index 00000000..0e3019b8
--- /dev/null
+++ b/gnulib/lib/fd-safer-flag.c
@@ -0,0 +1,52 @@
+/* Adjust a file descriptor result so that it avoids clobbering
+ STD{IN,OUT,ERR}_FILENO, with specific flags.
+
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+/* Return FD, unless FD would be a copy of standard input, output, or
+ error; in that case, return a duplicate of FD, closing FD. If FLAG
+ contains O_CLOEXEC, the returned FD will have close-on-exec
+ semantics. On failure to duplicate, close FD, set errno, and
+ return -1. Preserve errno if FD is negative, so that the caller
+ can always inspect errno when the returned value is negative.
+
+ This function is usefully wrapped around functions that return file
+ descriptors, e.g., fd_safer_flag (open ("file", O_RDONLY | flag), flag). */
+
+int
+fd_safer_flag (int fd, int flag)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer_flag (fd, flag);
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
diff --git a/gnulib/lib/fd-safer.c b/gnulib/lib/fd-safer.c
new file mode 100644
index 00000000..c1c60005
--- /dev/null
+++ b/gnulib/lib/fd-safer.c
@@ -0,0 +1,49 @@
+/* Return a safer copy of a file descriptor.
+
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+/* Return FD, unless FD would be a copy of standard input, output, or
+ error; in that case, return a duplicate of FD, closing FD. On
+ failure to duplicate, close FD, set errno, and return -1. Preserve
+ errno if FD is negative, so that the caller can always inspect
+ errno when the returned value is negative.
+
+ This function is usefully wrapped around functions that return file
+ descriptors, e.g., fd_safer (open ("file", O_RDONLY)). */
+
+int
+fd_safer (int fd)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer (fd);
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
diff --git a/gnulib/lib/fdopendir.c b/gnulib/lib/fdopendir.c
new file mode 100644
index 00000000..f7b29af3
--- /dev/null
+++ b/gnulib/lib/fdopendir.c
@@ -0,0 +1,134 @@
+/* provide a replacement fdopendir function
+ Copyright (C) 2004-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#if !HAVE_FDOPENDIR
+
+# include "openat.h"
+# include "openat-priv.h"
+# include "save-cwd.h"
+
+# if GNULIB_DIRENT_SAFER
+# include "dirent--.h"
+# endif
+
+/* Replacement for Solaris' function by the same name.
+ <http://www.google.com/search?q=fdopendir+site:docs.sun.com>
+ First, try to simulate it via opendir ("/proc/self/fd/FD"). Failing
+ that, simulate it by using fchdir metadata, or by doing
+ save_cwd/fchdir/opendir(".")/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, this function works just like Solaris' fdopendir.
+
+ W A R N I N G:
+ Unlike other fd-related functions, this one effectively consumes
+ its FD parameter. The caller should not close or otherwise
+ manipulate FD if this function returns successfully. Also, this
+ implementation does not guarantee that dirfd(fdopendir(n))==n;
+ the open directory stream may use a clone of FD, or have no
+ associated fd at all. */
+DIR *
+fdopendir (int fd)
+{
+ int saved_errno;
+ DIR *dir;
+
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, ".");
+ if (proc_file)
+ {
+ dir = opendir (proc_file);
+ saved_errno = errno;
+ }
+ else
+ {
+ dir = NULL;
+ saved_errno = EOPNOTSUPP;
+ }
+
+ /* If the syscall fails with an expected errno value, resort to
+ save_cwd/restore_cwd. */
+ if (! dir && EXPECTED_ERRNO (saved_errno))
+ {
+# if REPLACE_FCHDIR
+ const char *name = _gl_directory_name (fd);
+ if (name)
+ dir = opendir (name);
+ saved_errno = errno;
+# else /* !REPLACE_FCHDIR */
+ struct saved_cwd saved_cwd;
+ if (save_cwd (&saved_cwd) != 0)
+ openat_save_fail (errno);
+
+ if (fchdir (fd) != 0)
+ {
+ dir = NULL;
+ saved_errno = errno;
+ }
+ else
+ {
+ dir = opendir (".");
+ saved_errno = errno;
+
+ if (restore_cwd (&saved_cwd) != 0)
+ openat_restore_fail (errno);
+ }
+
+ free_cwd (&saved_cwd);
+# endif /* !REPLACE_FCHDIR */
+ }
+
+ if (dir)
+ close (fd);
+ if (proc_file != buf)
+ free (proc_file);
+ errno = saved_errno;
+ return dir;
+}
+
+#else /* HAVE_FDOPENDIR */
+
+# include <errno.h>
+# include <sys/stat.h>
+
+# undef fdopendir
+
+/* Like fdopendir, but work around GNU/Hurd bug by validating FD. */
+
+DIR *
+rpl_fdopendir (int fd)
+{
+ struct stat st;
+ if (fstat (fd, &st))
+ return NULL;
+ if (!S_ISDIR (st.st_mode))
+ {
+ errno = ENOTDIR;
+ return NULL;
+ }
+ return fdopendir (fd);
+}
+
+#endif /* HAVE_FDOPENDIR */
diff --git a/gnulib/lib/fdutimensat.c b/gnulib/lib/fdutimensat.c
new file mode 100644
index 00000000..7c08a525
--- /dev/null
+++ b/gnulib/lib/fdutimensat.c
@@ -0,0 +1,54 @@
+/* Set file access and modification times.
+
+ Copyright (C) 2009-2010 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 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/>. */
+
+/* Written by Eric Blake. */
+
+/* derived from a function in utimens.c */
+
+#include <config.h>
+
+#include "utimens.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* Set the access and modification time stamps of FD (a.k.a. FILE) to be
+ TIMESPEC[0] and TIMESPEC[1], respectively; relative to directory DIR.
+ FD must be either negative -- in which case it is ignored --
+ or a file descriptor that is open on FILE.
+ If FD is nonnegative, then FILE can be NULL, which means
+ use just futimes (or equivalent) instead of utimes (or equivalent),
+ and fail if on an old system without futimes (or equivalent).
+ If TIMESPEC is null, set the time stamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+int
+fdutimensat (int dir, char const *file, int fd, struct timespec const ts[2])
+{
+ int result = 1;
+ if (0 <= fd)
+ result = futimens (fd, ts);
+ if (file && (fd < 0 || (result == -1 && errno == ENOSYS)))
+ result = utimensat (dir, file, ts, 0);
+ if (result == 1)
+ {
+ errno = EBADF;
+ result = -1;
+ }
+ return result;
+}
diff --git a/gnulib/lib/fflush.c b/gnulib/lib/fflush.c
new file mode 100644
index 00000000..ead48754
--- /dev/null
+++ b/gnulib/lib/fflush.c
@@ -0,0 +1,218 @@
+/* fflush.c -- allow flushing input streams
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "freading.h"
+
+#include "stdio-impl.h"
+
+#undef fflush
+
+
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+
+/* Clear the stream's ungetc buffer, preserving the value of ftello (fp). */
+static inline void
+clear_ungetc_buffer_preserving_position (FILE *fp)
+{
+ if (fp->_flags & _IO_IN_BACKUP)
+ /* _IO_free_backup_area is a bit complicated. Simply call fseek. */
+ fseeko (fp, 0, SEEK_CUR);
+}
+
+#else
+
+/* Clear the stream's ungetc buffer. May modify the value of ftello (fp). */
+static inline void
+clear_ungetc_buffer (FILE *fp)
+{
+# if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if (HASUB (fp))
+ {
+ fp_->_p += fp_->_r;
+ fp_->_r = 0;
+ }
+# elif defined __EMX__ /* emx+gcc */
+ if (fp->_ungetc_count > 0)
+ {
+ fp->_ungetc_count = 0;
+ fp->_rcount = - fp->_rcount;
+ }
+# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ /* Nothing to do. */
+# else /* other implementations */
+ fseeko (fp, 0, SEEK_CUR);
+# endif
+}
+
+#endif
+
+#if (defined __sferror || defined __DragonFly__) && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+
+static inline int
+disable_seek_optimization (FILE *fp)
+{
+ int saved_flags = fp_->_flags & (__SOPT | __SNPT);
+ fp_->_flags = (fp_->_flags & ~__SOPT) | __SNPT;
+ return saved_flags;
+}
+
+static inline void
+restore_seek_optimization (FILE *fp, int saved_flags)
+{
+ fp_->_flags = (fp_->_flags & ~(__SOPT | __SNPT)) | saved_flags;
+}
+
+#endif
+
+static inline void
+update_fpos_cache (FILE *fp, off_t pos)
+{
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+# if defined __CYGWIN__
+ /* fp_->_offset is typed as an integer. */
+ fp_->_offset = pos;
+# else
+ /* fp_->_offset is an fpos_t. */
+ /* Use a union, since on NetBSD, the compilation flags determine
+ whether fpos_t is typedef'd to off_t or a struct containing a
+ single off_t member. */
+ union
+ {
+ fpos_t f;
+ off_t o;
+ } u;
+ u.o = pos;
+ fp_->_offset = u.f;
+# endif
+ fp_->_flags |= __SOFF;
+#endif
+}
+
+/* Flush all pending data on STREAM according to POSIX rules. Both
+ output and seekable input streams are supported. */
+int
+rpl_fflush (FILE *stream)
+{
+ /* When stream is NULL, POSIX and C99 only require flushing of "output
+ streams and update streams in which the most recent operation was not
+ input", and all implementations do this.
+
+ When stream is "an output stream or an update stream in which the most
+ recent operation was not input", POSIX and C99 requires that fflush
+ writes out any buffered data, and all implementations do this.
+
+ When stream is, however, an input stream or an update stream in
+ which the most recent operation was input, C99 specifies nothing,
+ and POSIX only specifies behavior if the stream is seekable.
+ mingw, in particular, drops the input buffer, leaving the file
+ descriptor positioned at the end of the input buffer. I.e. ftell
+ (stream) is lost. We don't want to call the implementation's
+ fflush in this case.
+
+ We test ! freading (stream) here, rather than fwriting (stream), because
+ what we need to know is whether the stream holds a "read buffer", and on
+ mingw this is indicated by _IOREAD, regardless of _IOWRT. */
+ if (stream == NULL || ! freading (stream))
+ return fflush (stream);
+
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+
+ clear_ungetc_buffer_preserving_position (stream);
+
+ return fflush (stream);
+
+#else
+ {
+ /* Notes about the file-position indicator:
+ 1) The file position indicator is incremented by fgetc() and decremented
+ by ungetc():
+ <http://www.opengroup.org/susv3/functions/fgetc.html>
+ "... the fgetc() function shall ... advance the associated file
+ position indicator for the stream ..."
+ <http://www.opengroup.org/susv3/functions/ungetc.html>
+ "The file-position indicator is decremented by each successful
+ call to ungetc()..."
+ 2) <http://www.opengroup.org/susv3/functions/ungetc.html> says:
+ "The value of the file-position indicator for the stream after
+ reading or discarding all pushed-back bytes shall be the same
+ as it was before the bytes were pushed back."
+ Here we are discarding all pushed-back bytes. But more specifically,
+ 3) <http://www.opengroup.org/austin/aardvark/latest/xshbug3.txt> says:
+ "[After fflush(),] the file offset of the underlying open file
+ description shall be set to the file position of the stream, and
+ any characters pushed back onto the stream by ungetc() ... shall
+ be discarded." */
+
+ /* POSIX does not specify fflush behavior for non-seekable input
+ streams. Some implementations purge unread data, some return
+ EBADF, some do nothing. */
+ off_t pos = ftello (stream);
+ if (pos == -1)
+ {
+ errno = EBADF;
+ return EOF;
+ }
+
+ /* Clear the ungetc buffer. */
+ clear_ungetc_buffer (stream);
+
+ /* To get here, we must be flushing a seekable input stream, so the
+ semantics of fpurge are now appropriate to clear the buffer. To
+ avoid losing data, the lseek is also necessary. */
+ {
+ int result = fpurge (stream);
+ if (result != 0)
+ return result;
+ }
+
+# if (defined __sferror || defined __DragonFly__) && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+
+ {
+ /* Disable seek optimization for the next fseeko call. This tells the
+ following fseeko call to seek to the desired position directly, rather
+ than to seek to a block-aligned boundary. */
+ int saved_flags = disable_seek_optimization (stream);
+ int result = fseeko (stream, pos, SEEK_SET);
+
+ restore_seek_optimization (stream, saved_flags);
+ return result;
+ }
+
+# else
+
+ pos = lseek (fileno (stream), pos, SEEK_SET);
+ if (pos == -1)
+ return EOF;
+ /* After a successful lseek, update the file descriptor's position cache
+ in the stream. */
+ update_fpos_cache (stream, pos);
+
+ return 0;
+
+# endif
+ }
+#endif
+}
diff --git a/gnulib/lib/file-has-acl.c b/gnulib/lib/file-has-acl.c
new file mode 100644
index 00000000..92aa07ed
--- /dev/null
+++ b/gnulib/lib/file-has-acl.c
@@ -0,0 +1,606 @@
+/* Test whether a file has a nontrivial access control list.
+
+ Copyright (C) 2002-2003, 2005-2010 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/>.
+
+ Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include "acl-internal.h"
+
+
+#if USE_ACL && HAVE_ACL_GET_FILE
+
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+
+/* ACL is an ACL, from a file, stored as type ACL_TYPE_EXTENDED.
+ Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial. */
+int
+acl_extended_nontrivial (acl_t acl)
+{
+ /* acl is non-trivial if it is non-empty. */
+ return (acl_entries (acl) > 0);
+}
+
+# else /* Linux, FreeBSD, IRIX, Tru64 */
+
+/* ACL is an ACL, from a file, stored as type ACL_TYPE_ACCESS.
+ Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode.
+ Return -1 and set errno upon failure to determine it. */
+int
+acl_access_nontrivial (acl_t acl)
+{
+ /* acl is non-trivial if it has some entries other than for "user::",
+ "group::", and "other::". Normally these three should be present
+ at least, allowing us to write
+ return (3 < acl_entries (acl));
+ but the following code is more robust. */
+# if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD */
+
+ acl_entry_t ace;
+ int got_one;
+
+ for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
+ got_one > 0;
+ got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
+ {
+ acl_tag_t tag;
+ if (acl_get_tag_type (ace, &tag) < 0)
+ return -1;
+ if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ || tag == ACL_OTHER))
+ return 1;
+ }
+ return got_one;
+
+# else /* IRIX, Tru64 */
+# if HAVE_ACL_TO_SHORT_TEXT /* IRIX */
+ /* Don't use acl_get_entry: it is undocumented. */
+
+ int count = acl->acl_cnt;
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ acl_entry_t ace = &acl->acl_entry[i];
+ acl_tag_t tag = ace->ae_tag;
+
+ if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ
+ || tag == ACL_OTHER_OBJ))
+ return 1;
+ }
+ return 0;
+
+# endif
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+ /* Don't use acl_get_entry: it takes only one argument and does not work. */
+
+ int count = acl->acl_num;
+ acl_entry_t ace;
+
+ for (ace = acl->acl_first; count > 0; ace = ace->next, count--)
+ {
+ acl_tag_t tag;
+ acl_perm_t perm;
+
+ tag = ace->entry->acl_type;
+ if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ || tag == ACL_OTHER))
+ return 1;
+
+ perm = ace->entry->acl_perm;
+ /* On Tru64, perm can also contain non-standard bits such as
+ PERM_INSERT, PERM_DELETE, PERM_MODIFY, PERM_LOOKUP, ... */
+ if ((perm & ~(ACL_READ | ACL_WRITE | ACL_EXECUTE)) != 0)
+ return 1;
+ }
+ return 0;
+
+# endif
+# endif
+}
+
+# endif
+
+
+#elif USE_ACL && HAVE_ACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
+
+# if !defined ACL_NO_TRIVIAL /* Solaris <= 10, Cygwin */
+
+/* Test an ACL retrieved with GETACL.
+ Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nontrivial (int count, aclent_t *entries)
+{
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ aclent_t *ace = &entries[i];
+
+ /* Note: If ace->a_type = USER_OBJ, ace->a_id is the st_uid from stat().
+ If ace->a_type = GROUP_OBJ, ace->a_id is the st_gid from stat().
+ We don't need to check ace->a_id in these cases. */
+ if (!(ace->a_type == USER_OBJ
+ || ace->a_type == GROUP_OBJ
+ || ace->a_type == OTHER_OBJ
+ /* Note: Cygwin does not return a CLASS_OBJ ("mask:") entry
+ sometimes. */
+ || ace->a_type == CLASS_OBJ))
+ return 1;
+ }
+ return 0;
+}
+
+# ifdef ACE_GETACL
+
+/* Test an ACL retrieved with ACE_GETACL.
+ Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_ace_nontrivial (int count, ace_t *entries)
+{
+ int i;
+
+ /* The flags in the ace_t structure changed in a binary incompatible way
+ when ACL_NO_TRIVIAL etc. were introduced in <sys/acl.h> version 1.15.
+ How to distinguish the two conventions at runtime?
+ In the old convention, usually three ACEs have a_flags = ACE_OWNER /
+ ACE_GROUP / ACE_OTHER, in the range 0x0100..0x0400. In the new
+ convention, these values are not used. */
+ int old_convention = 0;
+
+ for (i = 0; i < count; i++)
+ if (entries[i].a_flags & (ACE_OWNER | ACE_GROUP | ACE_OTHER))
+ {
+ old_convention = 1;
+ break;
+ }
+
+ if (old_convention)
+ /* Running on Solaris 10. */
+ for (i = 0; i < count; i++)
+ {
+ ace_t *ace = &entries[i];
+
+ /* Note:
+ If ace->a_flags = ACE_OWNER, ace->a_who is the st_uid from stat().
+ If ace->a_flags = ACE_GROUP, ace->a_who is the st_gid from stat().
+ We don't need to check ace->a_who in these cases. */
+ if (!(ace->a_type == ALLOW
+ && (ace->a_flags == ACE_OWNER
+ || ace->a_flags == ACE_GROUP
+ || ace->a_flags == ACE_OTHER)))
+ return 1;
+ }
+ else
+ /* Running on Solaris 10 (newer version) or Solaris 11. */
+ for (i = 0; i < count; i++)
+ {
+ ace_t *ace = &entries[i];
+
+ if (!(ace->a_type == ACE_ACCESS_ALLOWED_ACE_TYPE
+ && (ace->a_flags == NEW_ACE_OWNER
+ || ace->a_flags
+ == (NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP)
+ || ace->a_flags == ACE_EVERYONE)
+ && (ace->a_access_mask
+ & ~(NEW_ACE_READ_DATA | NEW_ACE_WRITE_DATA | NEW_ACE_EXECUTE))
+ == 0))
+ return 1;
+ }
+
+ return 0;
+}
+
+# endif
+
+# endif
+
+#elif USE_ACL && HAVE_GETACL /* HP-UX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb)
+{
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ struct acl_entry *ace = &entries[i];
+
+ if (!((ace->uid == sb->st_uid && ace->gid == ACL_NSGROUP)
+ || (ace->uid == ACL_NSUSER && ace->gid == sb->st_gid)
+ || (ace->uid == ACL_NSUSER && ace->gid == ACL_NSGROUP)))
+ return 1;
+ }
+ return 0;
+}
+
+#elif USE_ACL && (HAVE_ACLX_GET || HAVE_STATACL) /* AIX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nontrivial (struct acl *a)
+{
+ /* The normal way to iterate through an ACL is like this:
+ struct acl_entry *ace;
+ for (ace = a->acl_ext; ace != acl_last (a); ace = acl_nxt (ace))
+ {
+ struct ace_id *aei;
+ switch (ace->ace_type)
+ {
+ case ACC_PERMIT:
+ case ACC_DENY:
+ case ACC_SPECIFY:
+ ...;
+ }
+ for (aei = ace->ace_id; aei != id_last (ace); aei = id_nxt (aei))
+ ...
+ }
+ */
+ return (acl_last (a) != a->acl_ext ? 1 : 0);
+}
+
+# if HAVE_ACLX_GET && defined ACL_AIX_WIP /* newer AIX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nfs4_nontrivial (nfs4_acl_int_t *a)
+{
+# if 1 /* let's try this first */
+ return (a->aclEntryN > 0 ? 1 : 0);
+# else
+ int count = a->aclEntryN;
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ nfs4_ace_int_t *ace = &a->aclEntry[i];
+
+ if (!((ace->flags & ACE4_ID_SPECIAL) != 0
+ && (ace->aceWho.special_whoid == ACE4_WHO_OWNER
+ || ace->aceWho.special_whoid == ACE4_WHO_GROUP
+ || ace->aceWho.special_whoid == ACE4_WHO_EVERYONE)
+ && ace->aceType == ACE4_ACCESS_ALLOWED_ACE_TYPE
+ && ace->aceFlags == 0
+ && (ace->aceMask & ~(ACE4_READ_DATA | ACE4_LIST_DIRECTORY
+ | ACE4_WRITE_DATA | ACE4_ADD_FILE
+ | ACE4_EXECUTE)) == 0))
+ return 1;
+ }
+ return 0;
+# endif
+}
+
+# endif
+
+#endif
+
+
+/* Return 1 if NAME has a nontrivial access control list, 0 if NAME
+ only has no or a base access control list, and -1 (setting errno)
+ on error. SB must be set to the stat buffer of FILE. */
+
+int
+file_has_acl (char const *name, struct stat const *sb)
+{
+#if USE_ACL
+ if (! S_ISLNK (sb->st_mode))
+ {
+# if HAVE_ACL_GET_FILE
+
+ /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
+ /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+ int ret;
+
+ if (HAVE_ACL_EXTENDED_FILE) /* Linux */
+ {
+ /* On Linux, acl_extended_file is an optimized function: It only
+ makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for
+ ACL_TYPE_DEFAULT. */
+ ret = acl_extended_file (name);
+ }
+ else /* FreeBSD, MacOS X, IRIX, Tru64 */
+ {
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+ /* On MacOS X, acl_get_file (name, ACL_TYPE_ACCESS)
+ and acl_get_file (name, ACL_TYPE_DEFAULT)
+ always return NULL / EINVAL. There is no point in making
+ these two useless calls. The real ACL is retrieved through
+ acl_get_file (name, ACL_TYPE_EXTENDED). */
+ acl_t acl = acl_get_file (name, ACL_TYPE_EXTENDED);
+ if (acl)
+ {
+ ret = acl_extended_nontrivial (acl);
+ acl_free (acl);
+ }
+ else
+ ret = -1;
+# else /* FreeBSD, IRIX, Tru64 */
+ acl_t acl = acl_get_file (name, ACL_TYPE_ACCESS);
+ if (acl)
+ {
+ int saved_errno;
+
+ ret = acl_access_nontrivial (acl);
+ saved_errno = errno;
+ acl_free (acl);
+ errno = saved_errno;
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+ /* On OSF/1, acl_get_file (name, ACL_TYPE_DEFAULT) always
+ returns NULL with errno not set. There is no point in
+ making this call. */
+# else /* FreeBSD, IRIX */
+ /* On Linux, FreeBSD, IRIX, acl_get_file (name, ACL_TYPE_ACCESS)
+ and acl_get_file (name, ACL_TYPE_DEFAULT) on a directory
+ either both succeed or both fail; it depends on the
+ file system. Therefore there is no point in making the second
+ call if the first one already failed. */
+ if (ret == 0 && S_ISDIR (sb->st_mode))
+ {
+ acl = acl_get_file (name, ACL_TYPE_DEFAULT);
+ if (acl)
+ {
+ ret = (0 < acl_entries (acl));
+ acl_free (acl);
+ }
+ else
+ ret = -1;
+ }
+# endif
+ }
+ else
+ ret = -1;
+# endif
+ }
+ if (ret < 0)
+ return ACL_NOT_WELL_SUPPORTED (errno) ? 0 : -1;
+ return ret;
+
+# elif HAVE_ACL && defined GETACLCNT /* Solaris, Cygwin, not HP-UX */
+
+# if defined ACL_NO_TRIVIAL
+
+ /* Solaris 10 (newer version), which has additional API declared in
+ <sys/acl.h> (acl_t) and implemented in libsec (acl_set, acl_trivial,
+ acl_fromtext, ...). */
+ return acl_trivial (name);
+
+# else /* Solaris, Cygwin, general case */
+
+ /* Solaris 2.5 through Solaris 10, Cygwin, and contemporaneous versions
+ of Unixware. The acl() call returns the access and default ACL both
+ at once. */
+ int count;
+ {
+ aclent_t *entries;
+
+ for (;;)
+ {
+ count = acl (name, GETACLCNT, 0, NULL);
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == ENOTSUP)
+ break;
+ else
+ return -1;
+ }
+
+ if (count == 0)
+ break;
+
+ /* Don't use MIN_ACL_ENTRIES: It's set to 4 on Cygwin, but Cygwin
+ returns only 3 entries for files with no ACL. But this is safe:
+ If there are more than 4 entries, there cannot be only the
+ "user::", "group::", "other:", and "mask:" entries. */
+ if (count > 4)
+ return 1;
+
+ entries = (aclent_t *) malloc (count * sizeof (aclent_t));
+ if (entries == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ if (acl (name, GETACL, count, entries) == count)
+ {
+ if (acl_nontrivial (count, entries))
+ {
+ free (entries);
+ return 1;
+ }
+ free (entries);
+ break;
+ }
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ free (entries);
+ }
+ }
+
+# ifdef ACE_GETACL
+ /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
+ file systems (whereas the other ones are used in UFS file systems). */
+ {
+ ace_t *entries;
+
+ for (;;)
+ {
+ count = acl (name, ACE_GETACLCNT, 0, NULL);
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == EINVAL)
+ break;
+ else
+ return -1;
+ }
+
+ if (count == 0)
+ break;
+
+ /* If there are more than 3 entries, there cannot be only the
+ ACE_OWNER, ACE_GROUP, ACE_OTHER entries. */
+ if (count > 3)
+ return 1;
+
+ entries = (ace_t *) malloc (count * sizeof (ace_t));
+ if (entries == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ if (acl (name, ACE_GETACL, count, entries) == count)
+ {
+ if (acl_ace_nontrivial (count, entries))
+ {
+ free (entries);
+ return 1;
+ }
+ free (entries);
+ break;
+ }
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ free (entries);
+ }
+ }
+# endif
+
+ return 0;
+# endif
+
+# elif HAVE_GETACL /* HP-UX */
+
+ int count;
+ struct acl_entry entries[NACLENTRIES];
+
+ for (;;)
+ {
+ count = getacl (name, 0, NULL);
+
+ if (count < 0)
+ return (errno == ENOSYS || errno == EOPNOTSUPP ? 0 : -1);
+
+ if (count == 0)
+ return 0;
+
+ if (count > NACLENTRIES)
+ /* If NACLENTRIES cannot be trusted, use dynamic memory
+ allocation. */
+ abort ();
+
+ /* If there are more than 3 entries, there cannot be only the
+ (uid,%), (%,gid), (%,%) entries. */
+ if (count > 3)
+ return 1;
+
+ if (getacl (name, count, entries) == count)
+ {
+ struct stat statbuf;
+
+ if (stat (name, &statbuf) < 0)
+ return -1;
+
+ return acl_nontrivial (count, entries, &statbuf);
+ }
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+# elif HAVE_ACLX_GET && defined ACL_AIX_WIP /* AIX */
+
+ acl_type_t type;
+ char aclbuf[1024];
+ void *acl = aclbuf;
+ size_t aclsize = sizeof (aclbuf);
+ mode_t mode;
+
+ for (;;)
+ {
+ /* The docs say that type being 0 is equivalent to ACL_ANY, but it
+ is not true, in AIX 5.3. */
+ type.u64 = ACL_ANY;
+ if (aclx_get (name, 0, &type, aclbuf, &aclsize, &mode) >= 0)
+ break;
+ if (errno != ENOSPC)
+ {
+ if (acl != aclbuf)
+ {
+ int saved_errno = errno;
+ free (acl);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ aclsize = 2 * aclsize;
+ if (acl != aclbuf)
+ free (acl);
+ acl = malloc (aclsize);
+ if (acl == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+
+ if (type.u64 == ACL_AIXC)
+ {
+ int result = acl_nontrivial ((struct acl *) acl);
+ if (acl != aclbuf)
+ free (acl);
+ return result;
+ }
+ else if (type.u64 == ACL_NFS4)
+ {
+ int result = acl_nfs4_nontrivial ((nfs4_acl_int_t *) acl);
+ if (acl != aclbuf)
+ free (acl);
+ return result;
+ }
+ else
+ {
+ /* A newer type of ACL has been introduced in the system.
+ We should better support it. */
+ if (acl != aclbuf)
+ free (acl);
+ errno = EINVAL;
+ return -1;
+ }
+
+# elif HAVE_STATACL /* older AIX */
+
+ union { struct acl a; char room[4096]; } u;
+
+ if (statacl (name, STX_NORMAL, &u.a, sizeof (u)) < 0)
+ return -1;
+
+ return acl_nontrivial (&u.a);
+
+# endif
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/file-set.c b/gnulib/lib/file-set.c
new file mode 100644
index 00000000..d72f6ba5
--- /dev/null
+++ b/gnulib/lib/file-set.c
@@ -0,0 +1,74 @@
+/* Specialized functions to manipulate a set of files.
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+#include "file-set.h"
+
+#include "hash-triple.h"
+#include "xalloc.h"
+
+/* Record file, FILE, and dev/ino from *STATS, in the hash table, HT.
+ If HT is NULL, return immediately.
+ If memory allocation fails, exit immediately. */
+void
+record_file (Hash_table *ht, char const *file, struct stat const *stats)
+{
+ struct F_triple *ent;
+
+ if (ht == NULL)
+ return;
+
+ ent = xmalloc (sizeof *ent);
+ ent->name = xstrdup (file);
+ ent->st_ino = stats->st_ino;
+ ent->st_dev = stats->st_dev;
+
+ {
+ struct F_triple *ent_from_table = hash_insert (ht, ent);
+ if (ent_from_table == NULL)
+ {
+ /* Insertion failed due to lack of memory. */
+ xalloc_die ();
+ }
+
+ if (ent_from_table != ent)
+ {
+ /* There was alread a matching entry in the table, so ENT was
+ not inserted. Free it. */
+ triple_free (ent);
+ }
+ }
+}
+
+/* Return true if there is an entry in hash table, HT,
+ for the file described by FILE and STATS. */
+bool
+seen_file (Hash_table const *ht, char const *file,
+ struct stat const *stats)
+{
+ struct F_triple new_ent;
+
+ if (ht == NULL)
+ return false;
+
+ new_ent.name = (char *) file;
+ new_ent.st_ino = stats->st_ino;
+ new_ent.st_dev = stats->st_dev;
+
+ return !!hash_lookup (ht, &new_ent);
+}
diff --git a/gnulib/lib/file-set.h b/gnulib/lib/file-set.h
new file mode 100644
index 00000000..1e9365f8
--- /dev/null
+++ b/gnulib/lib/file-set.h
@@ -0,0 +1,12 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+
+#include "hash.h"
+
+extern void record_file (Hash_table *ht, char const *file,
+ struct stat const *stats)
+ __attribute__((nonnull(2, 3)));
+
+extern bool seen_file (Hash_table const *ht, char const *file,
+ struct stat const *stats);
diff --git a/gnulib/lib/file-type.c b/gnulib/lib/file-type.c
new file mode 100644
index 00000000..5a2bf7c6
--- /dev/null
+++ b/gnulib/lib/file-type.c
@@ -0,0 +1,71 @@
+/* Return a string describing the type of a file.
+
+ Copyright (C) 1993-1994, 2001-2002, 2004-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "file-type.h"
+
+#include <gettext.h>
+#define _(text) gettext (text)
+
+char const *
+file_type (struct stat const *st)
+{
+ /* See POSIX 1003.1-2001 XCU Table 4-8 lines 17093-17107 for some of
+ these formats.
+
+ To keep diagnostics grammatical in English, the returned string
+ must start with a consonant. */
+
+ if (S_ISREG (st->st_mode))
+ return st->st_size == 0 ? _("regular empty file") : _("regular file");
+
+ if (S_ISDIR (st->st_mode))
+ return _("directory");
+
+ if (S_ISBLK (st->st_mode))
+ return _("block special file");
+
+ if (S_ISCHR (st->st_mode))
+ return _("character special file");
+
+ if (S_ISFIFO (st->st_mode))
+ return _("fifo");
+
+ if (S_ISLNK (st->st_mode))
+ return _("symbolic link");
+
+ if (S_ISSOCK (st->st_mode))
+ return _("socket");
+
+ if (S_TYPEISMQ (st))
+ return _("message queue");
+
+ if (S_TYPEISSEM (st))
+ return _("semaphore");
+
+ if (S_TYPEISSHM (st))
+ return _("shared memory object");
+
+ if (S_TYPEISTMO (st))
+ return _("typed memory object");
+
+ return _("weird file");
+}
diff --git a/gnulib/lib/file-type.h b/gnulib/lib/file-type.h
new file mode 100644
index 00000000..11ccc077
--- /dev/null
+++ b/gnulib/lib/file-type.h
@@ -0,0 +1,29 @@
+/* Return a string describing the type of a file.
+
+ Copyright (C) 1993-1994, 2001-2002, 2004-2005, 2009-2010 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/>. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#ifndef FILE_TYPE_H
+# define FILE_TYPE_H 1
+
+# include <sys/types.h>
+# include <sys/stat.h>
+
+char const *file_type (struct stat const *);
+
+#endif /* FILE_TYPE_H */
diff --git a/gnulib/lib/fileblocks.c b/gnulib/lib/fileblocks.c
new file mode 100644
index 00000000..63897c8f
--- /dev/null
+++ b/gnulib/lib/fileblocks.c
@@ -0,0 +1,74 @@
+/* Convert file size to number of blocks on System V-like machines.
+
+ Copyright (C) 1990, 1997-1999, 2004-2006, 2009-2010 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/>. */
+
+/* Written by Brian L. Matthews, blm@6sceng.UUCP. */
+
+#include <config.h>
+
+#include <sys/types.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if !HAVE_STRUCT_STAT_ST_BLOCKS && !defined _POSIX_SOURCE && defined BSIZE
+
+# include <unistd.h>
+
+# ifndef NINDIR
+
+# if defined __DJGPP__
+typedef long daddr_t; /* for disk address */
+# endif
+
+/* Some SysV's, like Irix, seem to lack this. Hope it's correct. */
+/* Number of inode pointers per indirect block. */
+# define NINDIR (BSIZE / sizeof (daddr_t))
+# endif /* !NINDIR */
+
+/* Number of direct block addresses in an inode. */
+# define NDIR 10
+
+/* Return the number of 512-byte blocks in a file of SIZE bytes. */
+
+off_t
+st_blocks (off_t size)
+{
+ off_t datablks = size / 512 + (size % 512 != 0);
+ off_t indrblks = 0;
+
+ if (datablks > NDIR)
+ {
+ indrblks = (datablks - NDIR - 1) / NINDIR + 1;
+
+ if (datablks > NDIR + NINDIR)
+ {
+ indrblks += (datablks - NDIR - NINDIR - 1) / (NINDIR * NINDIR) + 1;
+
+ if (datablks > NDIR + NINDIR + NINDIR * NINDIR)
+ indrblks++;
+ }
+ }
+
+ return datablks + indrblks;
+}
+#else
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int textutils_fileblocks_unused;
+#endif
diff --git a/gnulib/lib/filemode.c b/gnulib/lib/filemode.c
new file mode 100644
index 00000000..2b8035a4
--- /dev/null
+++ b/gnulib/lib/filemode.c
@@ -0,0 +1,180 @@
+/* filemode.c -- make a string describing file modes
+
+ Copyright (C) 1985, 1990, 1993, 1998-2000, 2004, 2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "filemode.h"
+
+/* The following is for Cray DMF (Data Migration Facility), which is a
+ HSM file system. A migrated file has a `st_dm_mode' that is
+ different from the normal `st_mode', so any tests for migrated
+ files should use the former. */
+#if HAVE_ST_DM_MODE
+# define IS_MIGRATED_FILE(statp) \
+ (S_ISOFD (statp->st_dm_mode) || S_ISOFL (statp->st_dm_mode))
+#else
+# define IS_MIGRATED_FILE(statp) 0
+#endif
+
+#if ! HAVE_DECL_STRMODE
+
+/* Return a character indicating the type of file described by
+ file mode BITS:
+ '-' regular file
+ 'b' block special file
+ 'c' character special file
+ 'C' high performance ("contiguous data") file
+ 'd' directory
+ 'D' door
+ 'l' symbolic link
+ 'm' multiplexed file (7th edition Unix; obsolete)
+ 'n' network special file (HP-UX)
+ 'p' fifo (named pipe)
+ 'P' port
+ 's' socket
+ 'w' whiteout (4.4BSD)
+ '?' some other file type */
+
+static char
+ftypelet (mode_t bits)
+{
+ /* These are the most common, so test for them first. */
+ if (S_ISREG (bits))
+ return '-';
+ if (S_ISDIR (bits))
+ return 'd';
+
+ /* Other letters standardized by POSIX 1003.1-2004. */
+ if (S_ISBLK (bits))
+ return 'b';
+ if (S_ISCHR (bits))
+ return 'c';
+ if (S_ISLNK (bits))
+ return 'l';
+ if (S_ISFIFO (bits))
+ return 'p';
+
+ /* Other file types (though not letters) standardized by POSIX. */
+ if (S_ISSOCK (bits))
+ return 's';
+
+ /* Nonstandard file types. */
+ if (S_ISCTG (bits))
+ return 'C';
+ if (S_ISDOOR (bits))
+ return 'D';
+ if (S_ISMPB (bits) || S_ISMPC (bits))
+ return 'm';
+ if (S_ISNWK (bits))
+ return 'n';
+ if (S_ISPORT (bits))
+ return 'P';
+ if (S_ISWHT (bits))
+ return 'w';
+
+ return '?';
+}
+
+/* Like filemodestring, but rely only on MODE. */
+
+void
+strmode (mode_t mode, char *str)
+{
+ str[0] = ftypelet (mode);
+ str[1] = mode & S_IRUSR ? 'r' : '-';
+ str[2] = mode & S_IWUSR ? 'w' : '-';
+ str[3] = (mode & S_ISUID
+ ? (mode & S_IXUSR ? 's' : 'S')
+ : (mode & S_IXUSR ? 'x' : '-'));
+ str[4] = mode & S_IRGRP ? 'r' : '-';
+ str[5] = mode & S_IWGRP ? 'w' : '-';
+ str[6] = (mode & S_ISGID
+ ? (mode & S_IXGRP ? 's' : 'S')
+ : (mode & S_IXGRP ? 'x' : '-'));
+ str[7] = mode & S_IROTH ? 'r' : '-';
+ str[8] = mode & S_IWOTH ? 'w' : '-';
+ str[9] = (mode & S_ISVTX
+ ? (mode & S_IXOTH ? 't' : 'T')
+ : (mode & S_IXOTH ? 'x' : '-'));
+ str[10] = ' ';
+ str[11] = '\0';
+}
+
+#endif /* ! HAVE_DECL_STRMODE */
+
+/* filemodestring - fill in string STR with an ls-style ASCII
+ representation of the st_mode field of file stats block STATP.
+ 12 characters are stored in STR.
+ The characters stored in STR are:
+
+ 0 File type, as in ftypelet above, except that other letters are used
+ for files whose type cannot be determined solely from st_mode:
+
+ 'F' semaphore
+ 'M' migrated file (Cray DMF)
+ 'Q' message queue
+ 'S' shared memory object
+ 'T' typed memory object
+
+ 1 'r' if the owner may read, '-' otherwise.
+
+ 2 'w' if the owner may write, '-' otherwise.
+
+ 3 'x' if the owner may execute, 's' if the file is
+ set-user-id, '-' otherwise.
+ 'S' if the file is set-user-id, but the execute
+ bit isn't set.
+
+ 4 'r' if group members may read, '-' otherwise.
+
+ 5 'w' if group members may write, '-' otherwise.
+
+ 6 'x' if group members may execute, 's' if the file is
+ set-group-id, '-' otherwise.
+ 'S' if it is set-group-id but not executable.
+
+ 7 'r' if any user may read, '-' otherwise.
+
+ 8 'w' if any user may write, '-' otherwise.
+
+ 9 'x' if any user may execute, 't' if the file is "sticky"
+ (will be retained in swap space after execution), '-'
+ otherwise.
+ 'T' if the file is sticky but not executable.
+
+ 10 ' ' for compatibility with 4.4BSD strmode,
+ since this interface does not support ACLs.
+
+ 11 '\0'. */
+
+void
+filemodestring (struct stat const *statp, char *str)
+{
+ strmode (statp->st_mode, str);
+
+ if (S_TYPEISSEM (statp))
+ str[0] = 'F';
+ else if (IS_MIGRATED_FILE (statp))
+ str[0] = 'M';
+ else if (S_TYPEISMQ (statp))
+ str[0] = 'Q';
+ else if (S_TYPEISSHM (statp))
+ str[0] = 'S';
+ else if (S_TYPEISTMO (statp))
+ str[0] = 'T';
+}
diff --git a/gnulib/lib/filemode.h b/gnulib/lib/filemode.h
new file mode 100644
index 00000000..83864dfa
--- /dev/null
+++ b/gnulib/lib/filemode.h
@@ -0,0 +1,33 @@
+/* Make a string describing file modes.
+
+ Copyright (C) 1998-1999, 2003, 2006, 2009-2010 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/>. */
+
+#ifndef FILEMODE_H_
+
+# include <sys/types.h>
+# include <sys/stat.h>
+
+# if HAVE_DECL_STRMODE
+# include <string.h> /* FreeBSD, OpenBSD */
+# include <unistd.h> /* NetBSD */
+# else
+void strmode (mode_t mode, char *str);
+# endif
+
+void filemodestring (struct stat const *statp, char *str);
+
+#endif
diff --git a/gnulib/lib/filename.h b/gnulib/lib/filename.h
new file mode 100644
index 00000000..d1e4514c
--- /dev/null
+++ b/gnulib/lib/filename.h
@@ -0,0 +1,54 @@
+/* Basic filename support macros.
+ Copyright (C) 2001-2004, 2007-2010 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/>. */
+
+#ifndef _FILENAME_H
+#define _FILENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not,
+ it may be concatenated to a directory pathname.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILE_SYSTEM_PREFIX_LEN(P) 0
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FILENAME_H */
diff --git a/gnulib/lib/filenamecat-lgpl.c b/gnulib/lib/filenamecat-lgpl.c
new file mode 100644
index 00000000..7653c5ed
--- /dev/null
+++ b/gnulib/lib/filenamecat-lgpl.c
@@ -0,0 +1,88 @@
+/* Concatenate two arbitrary file names.
+
+ Copyright (C) 1996-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "filenamecat.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "dirname.h"
+
+#if ! HAVE_MEMPCPY && ! defined mempcpy
+# define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
+#endif
+
+/* Return the longest suffix of F that is a relative file name.
+ If it has no such suffix, return the empty string. */
+
+static char const *
+longest_relative_suffix (char const *f)
+{
+ for (f += FILE_SYSTEM_PREFIX_LEN (f); ISSLASH (*f); f++)
+ continue;
+ return f;
+}
+
+/* Concatenate two file name components, DIR and ABASE, in
+ newly-allocated storage and return the result.
+ The resulting file name F is such that the commands "ls F" and "(cd
+ DIR; ls BASE)" refer to the same file, where BASE is ABASE with any
+ file system prefixes and leading separators removed.
+ Arrange for a directory separator if necessary between DIR and BASE
+ in the result, removing any redundant separators.
+ In any case, if BASE_IN_RESULT is non-NULL, set
+ *BASE_IN_RESULT to point to the copy of ABASE in the returned
+ concatenation. However, if ABASE begins with more than one slash,
+ set *BASE_IN_RESULT to point to the sole corresponding slash that
+ is copied into the result buffer.
+
+ Return NULL if malloc fails. */
+
+char *
+mfile_name_concat (char const *dir, char const *abase, char **base_in_result)
+{
+ char const *dirbase = last_component (dir);
+ size_t dirbaselen = base_len (dirbase);
+ size_t dirlen = dirbase - dir + dirbaselen;
+ size_t needs_separator = (dirbaselen && ! ISSLASH (dirbase[dirbaselen - 1]));
+
+ char const *base = longest_relative_suffix (abase);
+ size_t baselen = strlen (base);
+
+ char *p_concat = malloc (dirlen + needs_separator + baselen + 1);
+ char *p;
+
+ if (p_concat == NULL)
+ return NULL;
+
+ p = mempcpy (p_concat, dir, dirlen);
+ *p = DIRECTORY_SEPARATOR;
+ p += needs_separator;
+
+ if (base_in_result)
+ *base_in_result = p - IS_ABSOLUTE_FILE_NAME (abase);
+
+ p = mempcpy (p, base, baselen);
+ *p = '\0';
+
+ return p_concat;
+}
diff --git a/gnulib/lib/filenamecat.c b/gnulib/lib/filenamecat.c
new file mode 100644
index 00000000..64a7ebb1
--- /dev/null
+++ b/gnulib/lib/filenamecat.c
@@ -0,0 +1,41 @@
+/* Concatenate two arbitrary file names.
+
+ Copyright (C) 1996-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "filenamecat.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+
+/* Just like mfile_name_concat (filenamecat-lgpl.c), except, rather than
+ returning NULL upon malloc failure, here, we report the
+ "memory exhausted" condition and exit. */
+
+char *
+file_name_concat (char const *dir, char const *abase, char **base_in_result)
+{
+ char *p = mfile_name_concat (dir, abase, base_in_result);
+ if (p == NULL)
+ xalloc_die ();
+ return p;
+}
diff --git a/gnulib/lib/filenamecat.h b/gnulib/lib/filenamecat.h
new file mode 100644
index 00000000..950f456b
--- /dev/null
+++ b/gnulib/lib/filenamecat.h
@@ -0,0 +1,27 @@
+/* Concatenate two arbitrary file names.
+
+ Copyright (C) 1996-1997, 2003, 2005, 2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#if GNULIB_FILENAMECAT
+char *file_name_concat (char const *dir, char const *base,
+ char **base_in_result);
+#endif
+
+char *mfile_name_concat (char const *dir, char const *base,
+ char **base_in_result);
diff --git a/gnulib/lib/filevercmp.c b/gnulib/lib/filevercmp.c
new file mode 100644
index 00000000..cb7c25cb
--- /dev/null
+++ b/gnulib/lib/filevercmp.c
@@ -0,0 +1,181 @@
+/*
+ Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
+ Copyright (C) 2001 Anthony Towns <aj@azure.humbug.org.au>
+ Copyright (C) 2008-2010 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/>. */
+
+#include <config.h>
+#include "filevercmp.h"
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <c-ctype.h>
+#include <limits.h>
+
+/* Match a file suffix defined by this regular expression:
+ /(\.[A-Za-z~][A-Za-z0-9~]*)*$/
+ Scan the string *STR and return a pointer to the matching suffix, or
+ NULL if not found. Upon return, *STR points to terminating NUL. */
+static const char *
+match_suffix (const char **str)
+{
+ const char *match = NULL;
+ bool read_alpha = false;
+ while (**str)
+ {
+ if (read_alpha)
+ {
+ read_alpha = false;
+ if (!c_isalpha (**str) && '~' != **str)
+ match = NULL;
+ }
+ else if ('.' == **str)
+ {
+ read_alpha = true;
+ if (!match)
+ match = *str;
+ }
+ else if (!c_isalnum (**str) && '~' != **str)
+ match = NULL;
+ (*str)++;
+ }
+ return match;
+}
+
+/* verrevcmp helper function */
+static inline int
+order (unsigned char c)
+{
+ if (c_isdigit (c))
+ return 0;
+ else if (c_isalpha (c))
+ return c;
+ else if (c == '~')
+ return -1;
+ else
+ return (int) c + UCHAR_MAX + 1;
+}
+
+/* slightly modified verrevcmp function from dpkg
+ S1, S2 - compared string
+ S1_LEN, S2_LEN - length of strings to be scanned
+
+ This implements the algorithm for comparison of version strings
+ specified by Debian and now widely adopted. The detailed
+ specification can be found in the Debian Policy Manual in the
+ section on the `Version' control field. This version of the code
+ implements that from s5.6.12 of Debian Policy v3.8.0.1
+ http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version */
+static int
+verrevcmp (const char *s1, size_t s1_len, const char *s2, size_t s2_len)
+{
+ size_t s1_pos = 0;
+ size_t s2_pos = 0;
+ while (s1_pos < s1_len || s2_pos < s2_len)
+ {
+ int first_diff = 0;
+ while ((s1_pos < s1_len && !c_isdigit (s1[s1_pos]))
+ || (s2_pos < s2_len && !c_isdigit (s2[s2_pos])))
+ {
+ int s1_c = (s1_pos == s1_len) ? 0 : order (s1[s1_pos]);
+ int s2_c = (s2_pos == s2_len) ? 0 : order (s2[s2_pos]);
+ if (s1_c != s2_c)
+ return s1_c - s2_c;
+ s1_pos++;
+ s2_pos++;
+ }
+ while (s1[s1_pos] == '0')
+ s1_pos++;
+ while (s2[s2_pos] == '0')
+ s2_pos++;
+ while (c_isdigit (s1[s1_pos]) && c_isdigit (s2[s2_pos]))
+ {
+ if (!first_diff)
+ first_diff = s1[s1_pos] - s2[s2_pos];
+ s1_pos++;
+ s2_pos++;
+ }
+ if (c_isdigit (s1[s1_pos]))
+ return 1;
+ if (c_isdigit (s2[s2_pos]))
+ return -1;
+ if (first_diff)
+ return first_diff;
+ }
+ return 0;
+}
+
+/* Compare version strings S1 and S2.
+ See filevercmp.h for function description. */
+int
+filevercmp (const char *s1, const char *s2)
+{
+ const char *s1_pos;
+ const char *s2_pos;
+ const char *s1_suffix, *s2_suffix;
+ size_t s1_len, s2_len;
+ int result;
+
+ /* easy comparison to see if strings are identical */
+ int simple_cmp = strcmp (s1, s2);
+ if (simple_cmp == 0)
+ return 0;
+
+ /* special handle for "", "." and ".." */
+ if (!*s1)
+ return -1;
+ if (!*s2)
+ return 1;
+ if (0 == strcmp (".", s1))
+ return -1;
+ if (0 == strcmp (".", s2))
+ return 1;
+ if (0 == strcmp ("..", s1))
+ return -1;
+ if (0 == strcmp ("..", s2))
+ return 1;
+
+ /* special handle for other hidden files */
+ if (*s1 == '.' && *s2 != '.')
+ return -1;
+ if (*s1 != '.' && *s2 == '.')
+ return 1;
+ if (*s1 == '.' && *s2 == '.')
+ {
+ s1++;
+ s2++;
+ }
+
+ /* "cut" file suffixes */
+ s1_pos = s1;
+ s2_pos = s2;
+ s1_suffix = match_suffix (&s1_pos);
+ s2_suffix = match_suffix (&s2_pos);
+ s1_len = (s1_suffix ? s1_suffix : s1_pos) - s1;
+ s2_len = (s2_suffix ? s2_suffix : s2_pos) - s2;
+
+ /* restore file suffixes if strings are identical after "cut" */
+ if ((s1_suffix || s2_suffix) && (s1_len == s2_len)
+ && 0 == strncmp (s1, s2, s1_len))
+ {
+ s1_len = s1_pos - s1;
+ s2_len = s2_pos - s2;
+ }
+
+ result = verrevcmp (s1, s1_len, s2, s2_len);
+ return result == 0 ? simple_cmp : result;
+}
diff --git a/gnulib/lib/filevercmp.h b/gnulib/lib/filevercmp.h
new file mode 100644
index 00000000..1865b535
--- /dev/null
+++ b/gnulib/lib/filevercmp.h
@@ -0,0 +1,42 @@
+/*
+ Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
+ Copyright (C) 2001 Anthony Towns <aj@azure.humbug.org.au>
+ Copyright (C) 2008-2010 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/>. */
+
+#ifndef FILEVERCMP_H
+#define FILEVERCMP_H
+
+/* Compare version strings:
+
+ This function compares strings S1 and S2:
+ 1) By PREFIX in the same way as strcmp.
+ 2) Then by VERSION (most similarly to version compare of Debian's dpkg).
+ Leading zeros in version numbers are ignored.
+ 3) If both (PREFIX and VERSION) are equal, strcmp function is used for
+ comparison. So this function can return 0 if (and only if) strings S1
+ and S2 are identical.
+
+ It returns number >0 for S1 > S2, 0 for S1 == S2 and number <0 for S1 < S2.
+
+ This function compares strings, in a way that if VER1 and VER2 are version
+ numbers and PREFIX and SUFFIX (SUFFIX defined as (\.[A-Za-z~][A-Za-z0-9~]*)*)
+ are strings then VER1 < VER2 implies filevercmp (PREFIX VER1 SUFFIX,
+ PREFIX VER2 SUFFIX) < 0.
+
+ This function is intended to be a replacement for strverscmp. */
+int filevercmp (const char *s1, const char *s2);
+
+#endif /* FILEVERCMP_H */
diff --git a/gnulib/lib/findprog-lgpl.c b/gnulib/lib/findprog-lgpl.c
new file mode 100644
index 00000000..50a29d0a
--- /dev/null
+++ b/gnulib/lib/findprog-lgpl.c
@@ -0,0 +1,20 @@
+/* Locating a program in PATH.
+ Copyright (C) 2001-2004, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2008.
+
+ 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/>. */
+
+#define IN_FINDPROG_LGPL 1
+
+#include "findprog.c"
diff --git a/gnulib/lib/findprog.c b/gnulib/lib/findprog.c
new file mode 100644
index 00000000..a60a09db
--- /dev/null
+++ b/gnulib/lib/findprog.c
@@ -0,0 +1,138 @@
+/* Locating a program in PATH.
+ Copyright (C) 2001-2004, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "findprog.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* Avoid collision between findprog.c and findprog-lgpl.c. */
+#if IN_FINDPROG_LGPL || ! GNULIB_FINDPROG_LGPL
+
+#if !IN_FINDPROG_LGPL
+# include "xalloc.h"
+#endif
+#include "concat-filename.h"
+
+
+const char *
+find_in_path (const char *progname)
+{
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+ /* The searching rules with .COM, .EXE, .BAT, .CMD etc. suffixes are
+ too complicated. Leave it to the OS. */
+ return progname;
+#else
+ /* Unix */
+ char *path;
+ char *path_rest;
+ char *cp;
+
+ if (strchr (progname, '/') != NULL)
+ /* If progname contains a slash, it is either absolute or relative to
+ the current directory. PATH is not used. */
+ return progname;
+
+ path = getenv ("PATH");
+ if (path == NULL || *path == '\0')
+ /* If PATH is not set, the default search path is implementation
+ dependent. */
+ return progname;
+
+ /* Make a copy, to prepare for destructive modifications. */
+# if !IN_FINDPROG_LGPL
+ path = xstrdup (path);
+# else
+ path = strdup (path);
+ if (path == NULL)
+ /* Out of memory. */
+ return progname;
+# endif
+ for (path_rest = path; ; path_rest = cp + 1)
+ {
+ const char *dir;
+ bool last;
+ char *progpathname;
+
+ /* Extract next directory in PATH. */
+ dir = path_rest;
+ for (cp = path_rest; *cp != '\0' && *cp != ':'; cp++)
+ ;
+ last = (*cp == '\0');
+ *cp = '\0';
+
+ /* Empty PATH components designate the current directory. */
+ if (dir == cp)
+ dir = ".";
+
+ /* Concatenate dir and progname. */
+# if !IN_FINDPROG_LGPL
+ progpathname = xconcatenated_filename (dir, progname, NULL);
+# else
+ progpathname = concatenated_filename (dir, progname, NULL);
+ if (progpathname == NULL)
+ {
+ /* Out of memory. */
+ free (path);
+ return progname;
+ }
+# endif
+
+ /* On systems which have the eaccess() system call, let's use it.
+ On other systems, let's hope that this program is not installed
+ setuid or setgid, so that it is ok to call access() despite its
+ design flaw. */
+ if (eaccess (progpathname, X_OK) == 0)
+ {
+ /* Found! */
+ if (strcmp (progpathname, progname) == 0)
+ {
+ free (progpathname);
+
+ /* Add the "./" prefix for real, that xconcatenated_filename()
+ optimized away. This avoids a second PATH search when the
+ caller uses execlp/execvp. */
+ progpathname = XNMALLOC (2 + strlen (progname) + 1, char);
+ progpathname[0] = '.';
+ progpathname[1] = '/';
+ memcpy (progpathname + 2, progname, strlen (progname) + 1);
+ }
+
+ free (path);
+ return progpathname;
+ }
+
+ free (progpathname);
+
+ if (last)
+ break;
+ }
+
+ /* Not found in PATH. An error will be signalled at the first call. */
+ free (path);
+ return progname;
+#endif
+}
+
+#endif
diff --git a/gnulib/lib/findprog.h b/gnulib/lib/findprog.h
new file mode 100644
index 00000000..7dcbf21c
--- /dev/null
+++ b/gnulib/lib/findprog.h
@@ -0,0 +1,37 @@
+/* Locating a program in PATH.
+ Copyright (C) 2001-2003, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Look up a program in the PATH.
+ Attempt to determine the pathname that would be called by execlp/execvp
+ of PROGNAME. If successful, return a pathname containing a slash
+ (either absolute or relative to the current directory). Otherwise,
+ return PROGNAME unmodified.
+ Because of the latter case, callers should use execlp/execvp, not
+ execl/execv on the returned pathname.
+ The returned string is freshly malloc()ed if it is != PROGNAME. */
+extern const char *find_in_path (const char *progname);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/float+.h b/gnulib/lib/float+.h
new file mode 100644
index 00000000..d2549219
--- /dev/null
+++ b/gnulib/lib/float+.h
@@ -0,0 +1,148 @@
+/* Supplemental information about the floating-point formats.
+ Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _FLOATPLUS_H
+#define _FLOATPLUS_H
+
+#include <float.h>
+#include <limits.h>
+
+/* Number of bits in the mantissa of a floating-point number, including the
+ "hidden bit". */
+#if FLT_RADIX == 2
+# define FLT_MANT_BIT FLT_MANT_DIG
+# define DBL_MANT_BIT DBL_MANT_DIG
+# define LDBL_MANT_BIT LDBL_MANT_DIG
+#elif FLT_RADIX == 4
+# define FLT_MANT_BIT (FLT_MANT_DIG * 2)
+# define DBL_MANT_BIT (DBL_MANT_DIG * 2)
+# define LDBL_MANT_BIT (LDBL_MANT_DIG * 2)
+#elif FLT_RADIX == 16
+# define FLT_MANT_BIT (FLT_MANT_DIG * 4)
+# define DBL_MANT_BIT (DBL_MANT_DIG * 4)
+# define LDBL_MANT_BIT (LDBL_MANT_DIG * 4)
+#endif
+
+/* Bit mask that can be used to mask the exponent, as an unsigned number. */
+#define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7)
+#define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+#define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7)
+
+/* Number of bits used for the exponent of a floating-point number, including
+ the exponent's sign. */
+#define FLT_EXP_BIT \
+ (FLT_EXP_MASK < 0x100 ? 8 : \
+ FLT_EXP_MASK < 0x200 ? 9 : \
+ FLT_EXP_MASK < 0x400 ? 10 : \
+ FLT_EXP_MASK < 0x800 ? 11 : \
+ FLT_EXP_MASK < 0x1000 ? 12 : \
+ FLT_EXP_MASK < 0x2000 ? 13 : \
+ FLT_EXP_MASK < 0x4000 ? 14 : \
+ FLT_EXP_MASK < 0x8000 ? 15 : \
+ FLT_EXP_MASK < 0x10000 ? 16 : \
+ FLT_EXP_MASK < 0x20000 ? 17 : \
+ FLT_EXP_MASK < 0x40000 ? 18 : \
+ FLT_EXP_MASK < 0x80000 ? 19 : \
+ FLT_EXP_MASK < 0x100000 ? 20 : \
+ FLT_EXP_MASK < 0x200000 ? 21 : \
+ FLT_EXP_MASK < 0x400000 ? 22 : \
+ FLT_EXP_MASK < 0x800000 ? 23 : \
+ FLT_EXP_MASK < 0x1000000 ? 24 : \
+ FLT_EXP_MASK < 0x2000000 ? 25 : \
+ FLT_EXP_MASK < 0x4000000 ? 26 : \
+ FLT_EXP_MASK < 0x8000000 ? 27 : \
+ FLT_EXP_MASK < 0x10000000 ? 28 : \
+ FLT_EXP_MASK < 0x20000000 ? 29 : \
+ FLT_EXP_MASK < 0x40000000 ? 30 : \
+ FLT_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+#define DBL_EXP_BIT \
+ (DBL_EXP_MASK < 0x100 ? 8 : \
+ DBL_EXP_MASK < 0x200 ? 9 : \
+ DBL_EXP_MASK < 0x400 ? 10 : \
+ DBL_EXP_MASK < 0x800 ? 11 : \
+ DBL_EXP_MASK < 0x1000 ? 12 : \
+ DBL_EXP_MASK < 0x2000 ? 13 : \
+ DBL_EXP_MASK < 0x4000 ? 14 : \
+ DBL_EXP_MASK < 0x8000 ? 15 : \
+ DBL_EXP_MASK < 0x10000 ? 16 : \
+ DBL_EXP_MASK < 0x20000 ? 17 : \
+ DBL_EXP_MASK < 0x40000 ? 18 : \
+ DBL_EXP_MASK < 0x80000 ? 19 : \
+ DBL_EXP_MASK < 0x100000 ? 20 : \
+ DBL_EXP_MASK < 0x200000 ? 21 : \
+ DBL_EXP_MASK < 0x400000 ? 22 : \
+ DBL_EXP_MASK < 0x800000 ? 23 : \
+ DBL_EXP_MASK < 0x1000000 ? 24 : \
+ DBL_EXP_MASK < 0x2000000 ? 25 : \
+ DBL_EXP_MASK < 0x4000000 ? 26 : \
+ DBL_EXP_MASK < 0x8000000 ? 27 : \
+ DBL_EXP_MASK < 0x10000000 ? 28 : \
+ DBL_EXP_MASK < 0x20000000 ? 29 : \
+ DBL_EXP_MASK < 0x40000000 ? 30 : \
+ DBL_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+#define LDBL_EXP_BIT \
+ (LDBL_EXP_MASK < 0x100 ? 8 : \
+ LDBL_EXP_MASK < 0x200 ? 9 : \
+ LDBL_EXP_MASK < 0x400 ? 10 : \
+ LDBL_EXP_MASK < 0x800 ? 11 : \
+ LDBL_EXP_MASK < 0x1000 ? 12 : \
+ LDBL_EXP_MASK < 0x2000 ? 13 : \
+ LDBL_EXP_MASK < 0x4000 ? 14 : \
+ LDBL_EXP_MASK < 0x8000 ? 15 : \
+ LDBL_EXP_MASK < 0x10000 ? 16 : \
+ LDBL_EXP_MASK < 0x20000 ? 17 : \
+ LDBL_EXP_MASK < 0x40000 ? 18 : \
+ LDBL_EXP_MASK < 0x80000 ? 19 : \
+ LDBL_EXP_MASK < 0x100000 ? 20 : \
+ LDBL_EXP_MASK < 0x200000 ? 21 : \
+ LDBL_EXP_MASK < 0x400000 ? 22 : \
+ LDBL_EXP_MASK < 0x800000 ? 23 : \
+ LDBL_EXP_MASK < 0x1000000 ? 24 : \
+ LDBL_EXP_MASK < 0x2000000 ? 25 : \
+ LDBL_EXP_MASK < 0x4000000 ? 26 : \
+ LDBL_EXP_MASK < 0x8000000 ? 27 : \
+ LDBL_EXP_MASK < 0x10000000 ? 28 : \
+ LDBL_EXP_MASK < 0x20000000 ? 29 : \
+ LDBL_EXP_MASK < 0x40000000 ? 30 : \
+ LDBL_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+
+/* Number of bits used for a floating-point number: the mantissa (not
+ counting the "hidden bit", since it may or may not be explicit), the
+ exponent, and the sign. */
+#define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1)
+#define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1)
+#define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1)
+
+/* Number of bytes used for a floating-point number.
+ This can be smaller than the 'sizeof'. For example, on i386 systems,
+ 'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence
+ LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but
+ sizeof (long double) = 12 or = 16. */
+#define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+#define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+
+/* Verify that SIZEOF_FLT <= sizeof (float) etc. */
+typedef int verify_sizeof_flt[2 * (SIZEOF_FLT <= sizeof (float)) - 1];
+typedef int verify_sizeof_dbl[2 * (SIZEOF_DBL <= sizeof (double)) - 1];
+typedef int verify_sizeof_ldbl[2 * (SIZEOF_LDBL <= sizeof (long double)) - 1];
+
+#endif /* _FLOATPLUS_H */
diff --git a/gnulib/lib/float.in.h b/gnulib/lib/float.in.h
new file mode 100644
index 00000000..caf822f1
--- /dev/null
+++ b/gnulib/lib/float.in.h
@@ -0,0 +1,62 @@
+/* A correct <float.h>.
+
+ Copyright (C) 2007-2010 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/>. */
+
+#ifndef _GL_FLOAT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
+
+#ifndef _GL_FLOAT_H
+#define _GL_FLOAT_H
+
+/* 'long double' properties. */
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+/* Number of mantissa units, in base FLT_RADIX. */
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 64
+/* Number of decimal digits that is sufficient for representing a number. */
+# undef LDBL_DIG
+# define LDBL_DIG 18
+/* x-1 where x is the smallest representable number > 1. */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 1.0842021724855044340E-19L
+/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
+# undef LDBL_MAX_EXP
+# define LDBL_MAX_EXP 16384
+/* Minimum positive normalized number. */
+# undef LDBL_MIN
+# define LDBL_MIN 3.3621031431120935063E-4932L
+/* Maximum representable finite number. */
+# undef LDBL_MAX
+# define LDBL_MAX 1.1897314953572317650E+4932L
+/* Minimum e such that 10^e is in the range of normalized numbers. */
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP (-4931)
+/* Maximum e such that 10^e is in the range of representable finite numbers. */
+# undef LDBL_MAX_10_EXP
+# define LDBL_MAX_10_EXP 4932
+#endif
+
+#endif /* _GL_FLOAT_H */
+#endif /* _GL_FLOAT_H */
diff --git a/gnulib/lib/flock.c b/gnulib/lib/flock.c
new file mode 100644
index 00000000..f643f32d
--- /dev/null
+++ b/gnulib/lib/flock.c
@@ -0,0 +1,222 @@
+/* Emulate flock on platforms that lack it, primarily Windows and MinGW.
+
+ This is derived from sqlite3 sources.
+ http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/os_win.c
+ http://www.sqlite.org/copyright.html
+
+ Written by Richard W.M. Jones <rjones.at.redhat.com>
+
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <sys/file.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* _get_osfhandle */
+#include <io.h>
+
+/* LockFileEx */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include <errno.h>
+
+/* Determine the current size of a file. Because the other braindead
+ * APIs we'll call need lower/upper 32 bit pairs, keep the file size
+ * like that too.
+ */
+static BOOL
+file_size (HANDLE h, DWORD * lower, DWORD * upper)
+{
+ *lower = GetFileSize (h, upper);
+ return 1;
+}
+
+/* LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. */
+#ifndef LOCKFILE_FAIL_IMMEDIATELY
+# define LOCKFILE_FAIL_IMMEDIATELY 1
+#endif
+
+/* Acquire a lock. */
+static BOOL
+do_lock (HANDLE h, int non_blocking, int exclusive)
+{
+ BOOL res;
+ DWORD size_lower, size_upper;
+ OVERLAPPED ovlp;
+ int flags = 0;
+
+ /* We're going to lock the whole file, so get the file size. */
+ res = file_size (h, &size_lower, &size_upper);
+ if (!res)
+ return 0;
+
+ /* Start offset is 0, and also zero the remaining members of this struct. */
+ memset (&ovlp, 0, sizeof ovlp);
+
+ if (non_blocking)
+ flags |= LOCKFILE_FAIL_IMMEDIATELY;
+ if (exclusive)
+ flags |= LOCKFILE_EXCLUSIVE_LOCK;
+
+ return LockFileEx (h, flags, 0, size_lower, size_upper, &ovlp);
+}
+
+/* Unlock reader or exclusive lock. */
+static BOOL
+do_unlock (HANDLE h)
+{
+ int res;
+ DWORD size_lower, size_upper;
+
+ res = file_size (h, &size_lower, &size_upper);
+ if (!res)
+ return 0;
+
+ return UnlockFile (h, 0, 0, size_lower, size_upper);
+}
+
+/* Now our BSD-like flock operation. */
+int
+flock (int fd, int operation)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD res;
+ int non_blocking;
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ non_blocking = operation & LOCK_NB;
+ operation &= ~LOCK_NB;
+
+ switch (operation)
+ {
+ case LOCK_SH:
+ res = do_lock (h, non_blocking, 0);
+ break;
+ case LOCK_EX:
+ res = do_lock (h, non_blocking, 1);
+ break;
+ case LOCK_UN:
+ res = do_unlock (h);
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Map Windows errors into Unix errnos. As usual MSDN fails to
+ * document the permissible error codes.
+ */
+ if (!res)
+ {
+ DWORD err = GetLastError ();
+ switch (err)
+ {
+ /* This means someone else is holding a lock. */
+ case ERROR_LOCK_VIOLATION:
+ errno = EAGAIN;
+ break;
+
+ /* Out of memory. */
+ case ERROR_NOT_ENOUGH_MEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_BAD_COMMAND:
+ errno = EINVAL;
+ break;
+
+ /* Unlikely to be other errors, but at least don't lose the
+ * error code.
+ */
+ default:
+ errno = err;
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+#else /* !Windows */
+
+#ifdef HAVE_STRUCT_FLOCK_L_TYPE
+/* We know how to implement flock in terms of fcntl. */
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+int
+flock (int fd, int operation)
+{
+ int cmd, r;
+ struct flock fl;
+
+ if (operation & LOCK_NB)
+ cmd = F_SETLK;
+ else
+ cmd = F_SETLKW;
+ operation &= ~LOCK_NB;
+
+ memset (&fl, 0, sizeof fl);
+ fl.l_whence = SEEK_SET;
+ /* l_start & l_len are 0, which as a special case means "whole file". */
+
+ switch (operation)
+ {
+ case LOCK_SH:
+ fl.l_type = F_RDLCK;
+ break;
+ case LOCK_EX:
+ fl.l_type = F_WRLCK;
+ break;
+ case LOCK_UN:
+ fl.l_type = F_UNLCK;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ r = fcntl (fd, cmd, &fl);
+ if (r == -1 && errno == EACCES)
+ errno = EAGAIN;
+
+ return r;
+}
+
+#else /* !HAVE_STRUCT_FLOCK_L_TYPE */
+
+#error "This platform lacks flock function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+#endif /* !HAVE_STRUCT_FLOCK_L_TYPE */
+
+#endif /* !Windows */
diff --git a/gnulib/lib/floor.c b/gnulib/lib/floor.c
new file mode 100644
index 00000000..593b5268
--- /dev/null
+++ b/gnulib/lib/floor.c
@@ -0,0 +1,93 @@
+/* Round towards negative infinity.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC floorl
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC floor
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC floorf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define L_(literal) literal##f
+#endif
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+FUNC (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ return z;
+}
diff --git a/gnulib/lib/floorf.c b/gnulib/lib/floorf.c
new file mode 100644
index 00000000..eae57934
--- /dev/null
+++ b/gnulib/lib/floorf.c
@@ -0,0 +1,20 @@
+/* Round towards negative infinity.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "floor.c"
diff --git a/gnulib/lib/floorl.c b/gnulib/lib/floorl.c
new file mode 100644
index 00000000..b703d90c
--- /dev/null
+++ b/gnulib/lib/floorl.c
@@ -0,0 +1,20 @@
+/* Round towards negative infinity.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_LONG_DOUBLE
+#include "floor.c"
diff --git a/gnulib/lib/fnmatch.c b/gnulib/lib/fnmatch.c
new file mode 100644
index 00000000..f15dbb80
--- /dev/null
+++ b/gnulib/lib/fnmatch.c
@@ -0,0 +1,354 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+ 2003, 2004, 2005, 2006, 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Enable GNU extensions in fnmatch.h. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#if ! defined __builtin_expect && __GNUC__ < 3
+# define __builtin_expect(expr, expected) (expr)
+#endif
+
+#include <fnmatch.h>
+
+#include <alloca.h>
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define WIDE_CHAR_SUPPORT \
+ (HAVE_WCTYPE_H && HAVE_BTOWC && HAVE_ISWCTYPE \
+ && HAVE_WMEMCHR && (HAVE_WMEMCPY || HAVE_WMEMPCPY))
+
+/* For platform which support the ISO C amendement 1 functionality we
+ support user defined character classes. */
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+# include <wctype.h>
+# include <wchar.h>
+#endif
+
+/* We need some of the locale data (the collation sequence information)
+ but there is no interface to get this information in general. Therefore
+ we support a correct implementation only in glibc. */
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# include "../locale/elem-hash.h"
+# include "../locale/coll-lookup.h"
+# include <shlib-compat.h>
+
+# define CONCAT(a,b) __CONCAT(a,b)
+# define mbsrtowcs __mbsrtowcs
+# define fnmatch __fnmatch
+extern int fnmatch (const char *pattern, const char *string, int flags);
+#endif
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* We often have to test for FNM_FILE_NAME and FNM_PERIOD being both set. */
+#define NO_LEADING_PERIOD(flags) \
+ ((flags & (FNM_FILE_NAME | FNM_PERIOD)) == (FNM_FILE_NAME | FNM_PERIOD))
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself, and have not detected a bug
+ in the library. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined _LIBC || !defined __GNU_LIBRARY__ || !HAVE_FNMATCH_GNU
+
+
+# if ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK))
+# define isblank(c) ((c) == ' ' || (c) == '\t')
+# endif
+
+# define STREQ(s1, s2) (strcmp (s1, s2) == 0)
+
+# if defined _LIBC || WIDE_CHAR_SUPPORT
+/* The GNU C library provides support for user-defined character classes
+ and the functions from ISO C amendement 1. */
+# ifdef CHARCLASS_NAME_MAX
+# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+# else
+/* This shouldn't happen but some implementation might still have this
+ problem. Use a reasonable default value. */
+# define CHAR_CLASS_MAX_LENGTH 256
+# endif
+
+# ifdef _LIBC
+# define IS_CHAR_CLASS(string) __wctype (string)
+# else
+# define IS_CHAR_CLASS(string) wctype (string)
+# endif
+
+# ifdef _LIBC
+# define ISWCTYPE(WC, WT) __iswctype (WC, WT)
+# else
+# define ISWCTYPE(WC, WT) iswctype (WC, WT)
+# endif
+
+# if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS) || _LIBC
+/* In this case we are implementing the multibyte character handling. */
+# define HANDLE_MULTIBYTE 1
+# endif
+
+# else
+# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
+
+# define IS_CHAR_CLASS(string) \
+ (STREQ (string, "alpha") || STREQ (string, "upper") \
+ || STREQ (string, "lower") || STREQ (string, "digit") \
+ || STREQ (string, "alnum") || STREQ (string, "xdigit") \
+ || STREQ (string, "space") || STREQ (string, "print") \
+ || STREQ (string, "punct") || STREQ (string, "graph") \
+ || STREQ (string, "cntrl") || STREQ (string, "blank"))
+# endif
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+/* Global variable. */
+static int posixly_correct;
+
+# ifndef internal_function
+/* Inside GNU libc we mark some function in a special way. In other
+ environments simply ignore the marking. */
+# define internal_function
+# endif
+
+/* Note that this evaluates C many times. */
+# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
+# define CHAR char
+# define UCHAR unsigned char
+# define INT int
+# define FCT internal_fnmatch
+# define EXT ext_match
+# define END end_pattern
+# define L_(CS) CS
+# ifdef _LIBC
+# define BTOWC(C) __btowc (C)
+# else
+# define BTOWC(C) btowc (C)
+# endif
+# define STRLEN(S) strlen (S)
+# define STRCAT(D, S) strcat (D, S)
+# ifdef _LIBC
+# define MEMPCPY(D, S, N) __mempcpy (D, S, N)
+# else
+# if HAVE_MEMPCPY
+# define MEMPCPY(D, S, N) mempcpy (D, S, N)
+# else
+# define MEMPCPY(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
+# endif
+# endif
+# define MEMCHR(S, C, N) memchr (S, C, N)
+# define STRCOLL(S1, S2) strcoll (S1, S2)
+# include "fnmatch_loop.c"
+
+
+# if HANDLE_MULTIBYTE
+# define FOLD(c) ((flags & FNM_CASEFOLD) ? towlower (c) : (c))
+# define CHAR wchar_t
+# define UCHAR wint_t
+# define INT wint_t
+# define FCT internal_fnwmatch
+# define EXT ext_wmatch
+# define END end_wpattern
+# define L_(CS) L##CS
+# define BTOWC(C) (C)
+# ifdef _LIBC
+# define STRLEN(S) __wcslen (S)
+# define STRCAT(D, S) __wcscat (D, S)
+# define MEMPCPY(D, S, N) __wmempcpy (D, S, N)
+# else
+# define STRLEN(S) wcslen (S)
+# define STRCAT(D, S) wcscat (D, S)
+# if HAVE_WMEMPCPY
+# define MEMPCPY(D, S, N) wmempcpy (D, S, N)
+# else
+# define MEMPCPY(D, S, N) (wmemcpy (D, S, N) + (N))
+# endif
+# endif
+# define MEMCHR(S, C, N) wmemchr (S, C, N)
+# define STRCOLL(S1, S2) wcscoll (S1, S2)
+# define WIDE_CHAR_VERSION 1
+
+# undef IS_CHAR_CLASS
+/* We have to convert the wide character string in a multibyte string. But
+ we know that the character class names consist of alphanumeric characters
+ from the portable character set, and since the wide character encoding
+ for a member of the portable character set is the same code point as
+ its single-byte encoding, we can use a simplified method to convert the
+ string to a multibyte character string. */
+static wctype_t
+is_char_class (const wchar_t *wcs)
+{
+ char s[CHAR_CLASS_MAX_LENGTH + 1];
+ char *cp = s;
+
+ do
+ {
+ /* Test for a printable character from the portable character set. */
+# ifdef _LIBC
+ if (*wcs < 0x20 || *wcs > 0x7e
+ || *wcs == 0x24 || *wcs == 0x40 || *wcs == 0x60)
+ return (wctype_t) 0;
+# else
+ switch (*wcs)
+ {
+ case L' ': case L'!': case L'"': case L'#': case L'%':
+ case L'&': case L'\'': case L'(': case L')': case L'*':
+ case L'+': case L',': case L'-': case L'.': case L'/':
+ case L'0': case L'1': case L'2': case L'3': case L'4':
+ case L'5': case L'6': case L'7': case L'8': case L'9':
+ case L':': case L';': case L'<': case L'=': case L'>':
+ case L'?':
+ case L'A': case L'B': case L'C': case L'D': case L'E':
+ case L'F': case L'G': case L'H': case L'I': case L'J':
+ case L'K': case L'L': case L'M': case L'N': case L'O':
+ case L'P': case L'Q': case L'R': case L'S': case L'T':
+ case L'U': case L'V': case L'W': case L'X': case L'Y':
+ case L'Z':
+ case L'[': case L'\\': case L']': case L'^': case L'_':
+ case L'a': case L'b': case L'c': case L'd': case L'e':
+ case L'f': case L'g': case L'h': case L'i': case L'j':
+ case L'k': case L'l': case L'm': case L'n': case L'o':
+ case L'p': case L'q': case L'r': case L's': case L't':
+ case L'u': case L'v': case L'w': case L'x': case L'y':
+ case L'z': case L'{': case L'|': case L'}': case L'~':
+ break;
+ default:
+ return (wctype_t) 0;
+ }
+# endif
+
+ /* Avoid overrunning the buffer. */
+ if (cp == s + CHAR_CLASS_MAX_LENGTH)
+ return (wctype_t) 0;
+
+ *cp++ = (char) *wcs++;
+ }
+ while (*wcs != L'\0');
+
+ *cp = '\0';
+
+# ifdef _LIBC
+ return __wctype (s);
+# else
+ return wctype (s);
+# endif
+}
+# define IS_CHAR_CLASS(string) is_char_class (string)
+
+# include "fnmatch_loop.c"
+# endif
+
+
+int
+fnmatch (const char *pattern, const char *string, int flags)
+{
+# if HANDLE_MULTIBYTE
+# define ALLOCA_LIMIT 2000
+ if (__builtin_expect (MB_CUR_MAX, 1) != 1)
+ {
+ mbstate_t ps;
+ size_t patsize;
+ size_t strsize;
+ size_t totsize;
+ wchar_t *wpattern;
+ wchar_t *wstring;
+ int res;
+
+ /* Calculate the size needed to convert the strings to
+ wide characters. */
+ memset (&ps, '\0', sizeof (ps));
+ patsize = mbsrtowcs (NULL, &pattern, 0, &ps) + 1;
+ if (__builtin_expect (patsize != 0, 1))
+ {
+ assert (mbsinit (&ps));
+ strsize = mbsrtowcs (NULL, &string, 0, &ps) + 1;
+ if (__builtin_expect (strsize != 0, 1))
+ {
+ assert (mbsinit (&ps));
+ totsize = patsize + strsize;
+ if (__builtin_expect (! (patsize <= totsize
+ && totsize <= SIZE_MAX / sizeof (wchar_t)),
+ 0))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ /* Allocate room for the wide characters. */
+ if (__builtin_expect (totsize < ALLOCA_LIMIT, 1))
+ wpattern = (wchar_t *) alloca (totsize * sizeof (wchar_t));
+ else
+ {
+ wpattern = malloc (totsize * sizeof (wchar_t));
+ if (__builtin_expect (! wpattern, 0))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ wstring = wpattern + patsize;
+
+ /* Convert the strings into wide characters. */
+ mbsrtowcs (wpattern, &pattern, patsize, &ps);
+ assert (mbsinit (&ps));
+ mbsrtowcs (wstring, &string, strsize, &ps);
+
+ res = internal_fnwmatch (wpattern, wstring, wstring + strsize - 1,
+ flags & FNM_PERIOD, flags);
+
+ if (__builtin_expect (! (totsize < ALLOCA_LIMIT), 0))
+ free (wpattern);
+ return res;
+ }
+ }
+ }
+
+# endif /* HANDLE_MULTIBYTE */
+
+ return internal_fnmatch (pattern, string, string + strlen (string),
+ flags & FNM_PERIOD, flags);
+}
+
+# ifdef _LIBC
+# undef fnmatch
+versioned_symbol (libc, __fnmatch, fnmatch, GLIBC_2_2_3);
+# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_3)
+strong_alias (__fnmatch, __fnmatch_old)
+compat_symbol (libc, __fnmatch_old, fnmatch, GLIBC_2_0);
+# endif
+libc_hidden_ver (__fnmatch, fnmatch)
+# endif
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
diff --git a/gnulib/lib/fnmatch.in.h b/gnulib/lib/fnmatch.in.h
new file mode 100644
index 00000000..29baf1c6
--- /dev/null
+++ b/gnulib/lib/fnmatch.in.h
@@ -0,0 +1,68 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2001, 2002, 2003,
+ 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _FNMATCH_H
+#define _FNMATCH_H 1
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* We #undef these before defining them because some losing systems
+ (HP-UX A.08.07 for example) define these in <unistd.h>. */
+#undef FNM_PATHNAME
+#undef FNM_NOESCAPE
+#undef FNM_PERIOD
+
+/* Bits set in the FLAGS argument to `fnmatch'. */
+#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
+#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */
+#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */
+
+#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
+# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */
+# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */
+# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
+# define FNM_EXTMATCH (1 << 5) /* Use ksh-like extended matching. */
+#endif
+
+/* Value returned by `fnmatch' if STRING does not match PATTERN. */
+#define FNM_NOMATCH 1
+
+/* This value is returned if the implementation does not support
+ `fnmatch'. Since this is not the case here it will never be
+ returned but the conformance test suites still require the symbol
+ to be defined. */
+#ifdef _XOPEN_SOURCE
+# define FNM_NOSYS (-1)
+#endif
+
+/* Match NAME against the file name pattern PATTERN,
+ returning zero if it matches, FNM_NOMATCH if not. */
+extern int fnmatch (const char *__pattern, const char *__name,
+ int __flags)
+ _GL_ARG_NONNULL ((1, 2));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* fnmatch.h */
diff --git a/gnulib/lib/fnmatch_loop.c b/gnulib/lib/fnmatch_loop.c
new file mode 100644
index 00000000..8cd44440
--- /dev/null
+++ b/gnulib/lib/fnmatch_loop.c
@@ -0,0 +1,1215 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+ 2003, 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Match STRING against the file name pattern PATTERN, returning zero if
+ it matches, nonzero if not. */
+static int EXT (INT opt, const CHAR *pattern, const CHAR *string,
+ const CHAR *string_end, bool no_leading_period, int flags)
+ internal_function;
+static const CHAR *END (const CHAR *patternp) internal_function;
+
+static int
+internal_function
+FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
+ bool no_leading_period, int flags)
+{
+ register const CHAR *p = pattern, *n = string;
+ register UCHAR c;
+#ifdef _LIBC
+# if WIDE_CHAR_VERSION
+ const char *collseq = (const char *)
+ _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+# else
+ const UCHAR *collseq = (const UCHAR *)
+ _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+# endif
+#endif
+
+ while ((c = *p++) != L_('\0'))
+ {
+ bool new_no_leading_period = false;
+ c = FOLD (c);
+
+ switch (c)
+ {
+ case L_('?'):
+ if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period,
+ flags);
+ if (res != -1)
+ return res;
+ }
+
+ if (n == string_end)
+ return FNM_NOMATCH;
+ else if (*n == L_('/') && (flags & FNM_FILE_NAME))
+ return FNM_NOMATCH;
+ else if (*n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+ break;
+
+ case L_('\\'):
+ if (!(flags & FNM_NOESCAPE))
+ {
+ c = *p++;
+ if (c == L_('\0'))
+ /* Trailing \ loses. */
+ return FNM_NOMATCH;
+ c = FOLD (c);
+ }
+ if (n == string_end || FOLD ((UCHAR) *n) != c)
+ return FNM_NOMATCH;
+ break;
+
+ case L_('*'):
+ if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period,
+ flags);
+ if (res != -1)
+ return res;
+ }
+
+ if (n != string_end && *n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+
+ for (c = *p++; c == L_('?') || c == L_('*'); c = *p++)
+ {
+ if (*p == L_('(') && (flags & FNM_EXTMATCH) != 0)
+ {
+ const CHAR *endp = END (p);
+ if (endp != p)
+ {
+ /* This is a pattern. Skip over it. */
+ p = endp;
+ continue;
+ }
+ }
+
+ if (c == L_('?'))
+ {
+ /* A ? needs to match one character. */
+ if (n == string_end)
+ /* There isn't another character; no match. */
+ return FNM_NOMATCH;
+ else if (*n == L_('/')
+ && __builtin_expect (flags & FNM_FILE_NAME, 0))
+ /* A slash does not match a wildcard under
+ FNM_FILE_NAME. */
+ return FNM_NOMATCH;
+ else
+ /* One character of the string is consumed in matching
+ this ? wildcard, so *??? won't match if there are
+ less than three characters. */
+ ++n;
+ }
+ }
+
+ if (c == L_('\0'))
+ /* The wildcard(s) is/are the last element of the pattern.
+ If the name is a file name and contains another slash
+ this means it cannot match, unless the FNM_LEADING_DIR
+ flag is set. */
+ {
+ int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH;
+
+ if (flags & FNM_FILE_NAME)
+ {
+ if (flags & FNM_LEADING_DIR)
+ result = 0;
+ else
+ {
+ if (MEMCHR (n, L_('/'), string_end - n) == NULL)
+ result = 0;
+ }
+ }
+
+ return result;
+ }
+ else
+ {
+ const CHAR *endp;
+
+ endp = MEMCHR (n, (flags & FNM_FILE_NAME) ? L_('/') : L_('\0'),
+ string_end - n);
+ if (endp == NULL)
+ endp = string_end;
+
+ if (c == L_('[')
+ || (__builtin_expect (flags & FNM_EXTMATCH, 0) != 0
+ && (c == L_('@') || c == L_('+') || c == L_('!'))
+ && *p == L_('(')))
+ {
+ int flags2 = ((flags & FNM_FILE_NAME)
+ ? flags : (flags & ~FNM_PERIOD));
+ bool no_leading_period2 = no_leading_period;
+
+ for (--p; n < endp; ++n, no_leading_period2 = false)
+ if (FCT (p, n, string_end, no_leading_period2, flags2)
+ == 0)
+ return 0;
+ }
+ else if (c == L_('/') && (flags & FNM_FILE_NAME))
+ {
+ while (n < string_end && *n != L_('/'))
+ ++n;
+ if (n < string_end && *n == L_('/')
+ && (FCT (p, n + 1, string_end, flags & FNM_PERIOD, flags)
+ == 0))
+ return 0;
+ }
+ else
+ {
+ int flags2 = ((flags & FNM_FILE_NAME)
+ ? flags : (flags & ~FNM_PERIOD));
+ int no_leading_period2 = no_leading_period;
+
+ if (c == L_('\\') && !(flags & FNM_NOESCAPE))
+ c = *p;
+ c = FOLD (c);
+ for (--p; n < endp; ++n, no_leading_period2 = false)
+ if (FOLD ((UCHAR) *n) == c
+ && (FCT (p, n, string_end, no_leading_period2, flags2)
+ == 0))
+ return 0;
+ }
+ }
+
+ /* If we come here no match is possible with the wildcard. */
+ return FNM_NOMATCH;
+
+ case L_('['):
+ {
+ /* Nonzero if the sense of the character class is inverted. */
+ register bool not;
+ CHAR cold;
+ UCHAR fn;
+
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ if (n == string_end)
+ return FNM_NOMATCH;
+
+ if (*n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+
+ if (*n == L_('/') && (flags & FNM_FILE_NAME))
+ /* `/' cannot be matched. */
+ return FNM_NOMATCH;
+
+ not = (*p == L_('!') || (posixly_correct < 0 && *p == L_('^')));
+ if (not)
+ ++p;
+
+ fn = FOLD ((UCHAR) *n);
+
+ c = *p++;
+ for (;;)
+ {
+ if (!(flags & FNM_NOESCAPE) && c == L_('\\'))
+ {
+ if (*p == L_('\0'))
+ return FNM_NOMATCH;
+ c = FOLD ((UCHAR) *p);
+ ++p;
+
+ goto normal_bracket;
+ }
+ else if (c == L_('[') && *p == L_(':'))
+ {
+ /* Leave room for the null. */
+ CHAR str[CHAR_CLASS_MAX_LENGTH + 1];
+ size_t c1 = 0;
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+ wctype_t wt;
+#endif
+ const CHAR *startp = p;
+
+ for (;;)
+ {
+ if (c1 == CHAR_CLASS_MAX_LENGTH)
+ /* The name is too long and therefore the pattern
+ is ill-formed. */
+ return FNM_NOMATCH;
+
+ c = *++p;
+ if (c == L_(':') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c < L_('a') || c >= L_('z'))
+ {
+ /* This cannot possibly be a character class name.
+ Match it as a normal range. */
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ str[c1++] = c;
+ }
+ str[c1] = L_('\0');
+
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+ wt = IS_CHAR_CLASS (str);
+ if (wt == 0)
+ /* Invalid character class name. */
+ return FNM_NOMATCH;
+
+# if defined _LIBC && ! WIDE_CHAR_VERSION
+ /* The following code is glibc specific but does
+ there a good job in speeding up the code since
+ we can avoid the btowc() call. */
+ if (_ISCTYPE ((UCHAR) *n, wt))
+ goto matched;
+# else
+ if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
+ goto matched;
+# endif
+#else
+ if ((STREQ (str, L_("alnum")) && isalnum ((UCHAR) *n))
+ || (STREQ (str, L_("alpha")) && isalpha ((UCHAR) *n))
+ || (STREQ (str, L_("blank")) && isblank ((UCHAR) *n))
+ || (STREQ (str, L_("cntrl")) && iscntrl ((UCHAR) *n))
+ || (STREQ (str, L_("digit")) && isdigit ((UCHAR) *n))
+ || (STREQ (str, L_("graph")) && isgraph ((UCHAR) *n))
+ || (STREQ (str, L_("lower")) && islower ((UCHAR) *n))
+ || (STREQ (str, L_("print")) && isprint ((UCHAR) *n))
+ || (STREQ (str, L_("punct")) && ispunct ((UCHAR) *n))
+ || (STREQ (str, L_("space")) && isspace ((UCHAR) *n))
+ || (STREQ (str, L_("upper")) && isupper ((UCHAR) *n))
+ || (STREQ (str, L_("xdigit")) && isxdigit ((UCHAR) *n)))
+ goto matched;
+#endif
+ c = *p++;
+ }
+#ifdef _LIBC
+ else if (c == L_('[') && *p == L_('='))
+ {
+ UCHAR str[1];
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+
+ c = *++p;
+ if (c == L_('\0'))
+ {
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ str[0] = c;
+
+ c = *++p;
+ if (c != L_('=') || p[1] != L_(']'))
+ {
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ p += 2;
+
+ if (nrules == 0)
+ {
+ if ((UCHAR) *n == str[0])
+ goto matched;
+ }
+ else
+ {
+ const int32_t *table;
+# if WIDE_CHAR_VERSION
+ const int32_t *weights;
+ const int32_t *extra;
+# else
+ const unsigned char *weights;
+ const unsigned char *extra;
+# endif
+ const int32_t *indirect;
+ int32_t idx;
+ const UCHAR *cp = (const UCHAR *) str;
+
+ /* This #include defines a local function! */
+# if WIDE_CHAR_VERSION
+# include <locale/weightwc.h>
+# else
+# include <locale/weight.h>
+# endif
+
+# if WIDE_CHAR_VERSION
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC);
+ weights = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC);
+ extra = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC);
+# else
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+# endif
+
+ idx = findidx (&cp);
+ if (idx != 0)
+ {
+ /* We found a table entry. Now see whether the
+ character we are currently at has the same
+ equivalance class value. */
+ int len = weights[idx & 0xffffff];
+ int32_t idx2;
+ const UCHAR *np = (const UCHAR *) n;
+
+ idx2 = findidx (&np);
+ if (idx2 != 0
+ && (idx >> 24) == (idx2 >> 24)
+ && len == weights[idx2 & 0xffffff])
+ {
+ int cnt = 0;
+
+ idx &= 0xffffff;
+ idx2 &= 0xffffff;
+
+ while (cnt < len
+ && (weights[idx + 1 + cnt]
+ == weights[idx2 + 1 + cnt]))
+ ++cnt;
+
+ if (cnt == len)
+ goto matched;
+ }
+ }
+ }
+
+ c = *p++;
+ }
+#endif
+ else if (c == L_('\0'))
+ /* [ (unterminated) loses. */
+ return FNM_NOMATCH;
+ else
+ {
+ bool is_range = false;
+
+#ifdef _LIBC
+ bool is_seqval = false;
+
+ if (c == L_('[') && *p == L_('.'))
+ {
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+ size_t c1 = 0;
+
+ while (1)
+ {
+ c = *++p;
+ if (c == L_('.') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c == '\0')
+ return FNM_NOMATCH;
+ ++c1;
+ }
+
+ /* We have to handling the symbols differently in
+ ranges since then the collation sequence is
+ important. */
+ is_range = *p == L_('-') && p[1] != L_('\0');
+
+ if (nrules == 0)
+ {
+ /* There are no names defined in the collation
+ data. Therefore we only accept the trivial
+ names consisting of the character itself. */
+ if (c1 != 1)
+ return FNM_NOMATCH;
+
+ if (!is_range && *n == startp[1])
+ goto matched;
+
+ cold = startp[1];
+ c = *p++;
+ }
+ else
+ {
+ int32_t table_size;
+ const int32_t *symb_table;
+# ifdef WIDE_CHAR_VERSION
+ char str[c1];
+ size_t strcnt;
+# else
+# define str (startp + 1)
+# endif
+ const unsigned char *extra;
+ int32_t idx;
+ int32_t elem;
+ int32_t second;
+ int32_t hash;
+
+# ifdef WIDE_CHAR_VERSION
+ /* We have to convert the name to a single-byte
+ string. This is possible since the names
+ consist of ASCII characters and the internal
+ representation is UCS4. */
+ for (strcnt = 0; strcnt < c1; ++strcnt)
+ str[strcnt] = startp[1 + strcnt];
+# endif
+
+ table_size =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+
+ /* Locate the character in the hashing table. */
+ hash = elem_hash (str, c1);
+
+ idx = 0;
+ elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ && (c1
+ == extra[symb_table[2 * elem + 1]])
+ && memcmp (str,
+ &extra[symb_table[2 * elem
+ + 1]
+ + 1], c1) == 0)
+ {
+ /* Yep, this is the entry. */
+ idx = symb_table[2 * elem + 1];
+ idx += 1 + extra[idx];
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+
+ if (symb_table[2 * elem] != 0)
+ {
+ /* Compare the byte sequence but only if
+ this is not part of a range. */
+# ifdef WIDE_CHAR_VERSION
+ int32_t *wextra;
+
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+
+ wextra = (int32_t *) &extra[idx + 4];
+# endif
+
+ if (! is_range)
+ {
+# ifdef WIDE_CHAR_VERSION
+ for (c1 = 0;
+ (int32_t) c1 < wextra[idx];
+ ++c1)
+ if (n[c1] != wextra[1 + c1])
+ break;
+
+ if ((int32_t) c1 == wextra[idx])
+ goto matched;
+# else
+ for (c1 = 0; c1 < extra[idx]; ++c1)
+ if (n[c1] != extra[1 + c1])
+ break;
+
+ if (c1 == extra[idx])
+ goto matched;
+# endif
+ }
+
+ /* Get the collation sequence value. */
+ is_seqval = true;
+# ifdef WIDE_CHAR_VERSION
+ cold = wextra[1 + wextra[idx]];
+# else
+ /* Adjust for the alignment. */
+ idx += 1 + extra[idx];
+ idx = (idx + 3) & ~4;
+ cold = *((int32_t *) &extra[idx]);
+# endif
+
+ c = *p++;
+ }
+ else if (c1 == 1)
+ {
+ /* No valid character. Match it as a
+ single byte. */
+ if (!is_range && *n == str[0])
+ goto matched;
+
+ cold = str[0];
+ c = *p++;
+ }
+ else
+ return FNM_NOMATCH;
+ }
+ }
+ else
+# undef str
+#endif
+ {
+ c = FOLD (c);
+ normal_bracket:
+
+ /* We have to handling the symbols differently in
+ ranges since then the collation sequence is
+ important. */
+ is_range = (*p == L_('-') && p[1] != L_('\0')
+ && p[1] != L_(']'));
+
+ if (!is_range && c == fn)
+ goto matched;
+
+#if _LIBC
+ /* This is needed if we goto normal_bracket; from
+ outside of is_seqval's scope. */
+ is_seqval = false;
+#endif
+
+ cold = c;
+ c = *p++;
+ }
+
+ if (c == L_('-') && *p != L_(']'))
+ {
+#if _LIBC
+ /* We have to find the collation sequence
+ value for C. Collation sequence is nothing
+ we can regularly access. The sequence
+ value is defined by the order in which the
+ definitions of the collation values for the
+ various characters appear in the source
+ file. A strange concept, nowhere
+ documented. */
+ uint32_t fcollseq;
+ uint32_t lcollseq;
+ UCHAR cend = *p++;
+
+# ifdef WIDE_CHAR_VERSION
+ /* Search in the `names' array for the characters. */
+ fcollseq = __collseq_table_lookup (collseq, fn);
+ if (fcollseq == ~((uint32_t) 0))
+ /* XXX We don't know anything about the character
+ we are supposed to match. This means we are
+ failing. */
+ goto range_not_matched;
+
+ if (is_seqval)
+ lcollseq = cold;
+ else
+ lcollseq = __collseq_table_lookup (collseq, cold);
+# else
+ fcollseq = collseq[fn];
+ lcollseq = is_seqval ? cold : collseq[(UCHAR) cold];
+# endif
+
+ is_seqval = false;
+ if (cend == L_('[') && *p == L_('.'))
+ {
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+ size_t c1 = 0;
+
+ while (1)
+ {
+ c = *++p;
+ if (c == L_('.') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c == '\0')
+ return FNM_NOMATCH;
+ ++c1;
+ }
+
+ if (nrules == 0)
+ {
+ /* There are no names defined in the
+ collation data. Therefore we only
+ accept the trivial names consisting
+ of the character itself. */
+ if (c1 != 1)
+ return FNM_NOMATCH;
+
+ cend = startp[1];
+ }
+ else
+ {
+ int32_t table_size;
+ const int32_t *symb_table;
+# ifdef WIDE_CHAR_VERSION
+ char str[c1];
+ size_t strcnt;
+# else
+# define str (startp + 1)
+# endif
+ const unsigned char *extra;
+ int32_t idx;
+ int32_t elem;
+ int32_t second;
+ int32_t hash;
+
+# ifdef WIDE_CHAR_VERSION
+ /* We have to convert the name to a single-byte
+ string. This is possible since the names
+ consist of ASCII characters and the internal
+ representation is UCS4. */
+ for (strcnt = 0; strcnt < c1; ++strcnt)
+ str[strcnt] = startp[1 + strcnt];
+# endif
+
+ table_size =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+
+ /* Locate the character in the hashing
+ table. */
+ hash = elem_hash (str, c1);
+
+ idx = 0;
+ elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ && (c1
+ == extra[symb_table[2 * elem + 1]])
+ && memcmp (str,
+ &extra[symb_table[2 * elem + 1]
+ + 1], c1) == 0)
+ {
+ /* Yep, this is the entry. */
+ idx = symb_table[2 * elem + 1];
+ idx += 1 + extra[idx];
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+
+ if (symb_table[2 * elem] != 0)
+ {
+ /* Compare the byte sequence but only if
+ this is not part of a range. */
+# ifdef WIDE_CHAR_VERSION
+ int32_t *wextra;
+
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~4;
+
+ wextra = (int32_t *) &extra[idx + 4];
+# endif
+ /* Get the collation sequence value. */
+ is_seqval = true;
+# ifdef WIDE_CHAR_VERSION
+ cend = wextra[1 + wextra[idx]];
+# else
+ /* Adjust for the alignment. */
+ idx += 1 + extra[idx];
+ idx = (idx + 3) & ~4;
+ cend = *((int32_t *) &extra[idx]);
+# endif
+ }
+ else if (symb_table[2 * elem] != 0 && c1 == 1)
+ {
+ cend = str[0];
+ c = *p++;
+ }
+ else
+ return FNM_NOMATCH;
+ }
+# undef str
+ }
+ else
+ {
+ if (!(flags & FNM_NOESCAPE) && cend == L_('\\'))
+ cend = *p++;
+ if (cend == L_('\0'))
+ return FNM_NOMATCH;
+ cend = FOLD (cend);
+ }
+
+ /* XXX It is not entirely clear to me how to handle
+ characters which are not mentioned in the
+ collation specification. */
+ if (
+# ifdef WIDE_CHAR_VERSION
+ lcollseq == 0xffffffff ||
+# endif
+ lcollseq <= fcollseq)
+ {
+ /* We have to look at the upper bound. */
+ uint32_t hcollseq;
+
+ if (is_seqval)
+ hcollseq = cend;
+ else
+ {
+# ifdef WIDE_CHAR_VERSION
+ hcollseq =
+ __collseq_table_lookup (collseq, cend);
+ if (hcollseq == ~((uint32_t) 0))
+ {
+ /* Hum, no information about the upper
+ bound. The matching succeeds if the
+ lower bound is matched exactly. */
+ if (lcollseq != fcollseq)
+ goto range_not_matched;
+
+ goto matched;
+ }
+# else
+ hcollseq = collseq[cend];
+# endif
+ }
+
+ if (lcollseq <= hcollseq && fcollseq <= hcollseq)
+ goto matched;
+ }
+# ifdef WIDE_CHAR_VERSION
+ range_not_matched:
+# endif
+#else
+ /* We use a boring value comparison of the character
+ values. This is better than comparing using
+ `strcoll' since the latter would have surprising
+ and sometimes fatal consequences. */
+ UCHAR cend = *p++;
+
+ if (!(flags & FNM_NOESCAPE) && cend == L_('\\'))
+ cend = *p++;
+ if (cend == L_('\0'))
+ return FNM_NOMATCH;
+
+ /* It is a range. */
+ if (cold <= fn && fn <= cend)
+ goto matched;
+#endif
+
+ c = *p++;
+ }
+ }
+
+ if (c == L_(']'))
+ break;
+ }
+
+ if (!not)
+ return FNM_NOMATCH;
+ break;
+
+ matched:
+ /* Skip the rest of the [...] that already matched. */
+ do
+ {
+ ignore_next:
+ c = *p++;
+
+ if (c == L_('\0'))
+ /* [... (unterminated) loses. */
+ return FNM_NOMATCH;
+
+ if (!(flags & FNM_NOESCAPE) && c == L_('\\'))
+ {
+ if (*p == L_('\0'))
+ return FNM_NOMATCH;
+ /* XXX 1003.2d11 is unclear if this is right. */
+ ++p;
+ }
+ else if (c == L_('[') && *p == L_(':'))
+ {
+ int c1 = 0;
+ const CHAR *startp = p;
+
+ while (1)
+ {
+ c = *++p;
+ if (++c1 == CHAR_CLASS_MAX_LENGTH)
+ return FNM_NOMATCH;
+
+ if (*p == L_(':') && p[1] == L_(']'))
+ break;
+
+ if (c < L_('a') || c >= L_('z'))
+ {
+ p = startp;
+ goto ignore_next;
+ }
+ }
+ p += 2;
+ c = *p++;
+ }
+ else if (c == L_('[') && *p == L_('='))
+ {
+ c = *++p;
+ if (c == L_('\0'))
+ return FNM_NOMATCH;
+ c = *++p;
+ if (c != L_('=') || p[1] != L_(']'))
+ return FNM_NOMATCH;
+ p += 2;
+ c = *p++;
+ }
+ else if (c == L_('[') && *p == L_('.'))
+ {
+ ++p;
+ while (1)
+ {
+ c = *++p;
+ if (c == '\0')
+ return FNM_NOMATCH;
+
+ if (*p == L_('.') && p[1] == L_(']'))
+ break;
+ }
+ p += 2;
+ c = *p++;
+ }
+ }
+ while (c != L_(']'));
+ if (not)
+ return FNM_NOMATCH;
+ }
+ break;
+
+ case L_('+'):
+ case L_('@'):
+ case L_('!'):
+ if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period, flags);
+ if (res != -1)
+ return res;
+ }
+ goto normal_match;
+
+ case L_('/'):
+ if (NO_LEADING_PERIOD (flags))
+ {
+ if (n == string_end || c != (UCHAR) *n)
+ return FNM_NOMATCH;
+
+ new_no_leading_period = true;
+ break;
+ }
+ /* FALLTHROUGH */
+ default:
+ normal_match:
+ if (n == string_end || c != FOLD ((UCHAR) *n))
+ return FNM_NOMATCH;
+ }
+
+ no_leading_period = new_no_leading_period;
+ ++n;
+ }
+
+ if (n == string_end)
+ return 0;
+
+ if ((flags & FNM_LEADING_DIR) && n != string_end && *n == L_('/'))
+ /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */
+ return 0;
+
+ return FNM_NOMATCH;
+}
+
+
+static const CHAR *
+internal_function
+END (const CHAR *pattern)
+{
+ const CHAR *p = pattern;
+
+ while (1)
+ if (*++p == L_('\0'))
+ /* This is an invalid pattern. */
+ return pattern;
+ else if (*p == L_('['))
+ {
+ /* Handle brackets special. */
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ /* Skip the not sign. We have to recognize it because of a possibly
+ following ']'. */
+ if (*++p == L_('!') || (posixly_correct < 0 && *p == L_('^')))
+ ++p;
+ /* A leading ']' is recognized as such. */
+ if (*p == L_(']'))
+ ++p;
+ /* Skip over all characters of the list. */
+ while (*p != L_(']'))
+ if (*p++ == L_('\0'))
+ /* This is no valid pattern. */
+ return pattern;
+ }
+ else if ((*p == L_('?') || *p == L_('*') || *p == L_('+') || *p == L_('@')
+ || *p == L_('!')) && p[1] == L_('('))
+ p = END (p + 1);
+ else if (*p == L_(')'))
+ break;
+
+ return p + 1;
+}
+
+
+static int
+internal_function
+EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
+ bool no_leading_period, int flags)
+{
+ const CHAR *startp;
+ size_t level;
+ struct patternlist
+ {
+ struct patternlist *next;
+ CHAR str[1];
+ } *list = NULL;
+ struct patternlist **lastp = &list;
+ size_t pattern_len = STRLEN (pattern);
+ const CHAR *p;
+ const CHAR *rs;
+ enum { ALLOCA_LIMIT = 8000 };
+
+ /* Parse the pattern. Store the individual parts in the list. */
+ level = 0;
+ for (startp = p = pattern + 1; ; ++p)
+ if (*p == L_('\0'))
+ /* This is an invalid pattern. */
+ return -1;
+ else if (*p == L_('['))
+ {
+ /* Handle brackets special. */
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ /* Skip the not sign. We have to recognize it because of a possibly
+ following ']'. */
+ if (*++p == L_('!') || (posixly_correct < 0 && *p == L_('^')))
+ ++p;
+ /* A leading ']' is recognized as such. */
+ if (*p == L_(']'))
+ ++p;
+ /* Skip over all characters of the list. */
+ while (*p != L_(']'))
+ if (*p++ == L_('\0'))
+ /* This is no valid pattern. */
+ return -1;
+ }
+ else if ((*p == L_('?') || *p == L_('*') || *p == L_('+') || *p == L_('@')
+ || *p == L_('!')) && p[1] == L_('('))
+ /* Remember the nesting level. */
+ ++level;
+ else if (*p == L_(')'))
+ {
+ if (level-- == 0)
+ {
+ /* This means we found the end of the pattern. */
+#define NEW_PATTERN \
+ struct patternlist *newp; \
+ size_t plen; \
+ size_t plensize; \
+ size_t newpsize; \
+ \
+ plen = (opt == L_('?') || opt == L_('@') \
+ ? pattern_len \
+ : p - startp + 1UL); \
+ plensize = plen * sizeof (CHAR); \
+ newpsize = offsetof (struct patternlist, str) + plensize; \
+ if ((size_t) -1 / sizeof (CHAR) < plen \
+ || newpsize < offsetof (struct patternlist, str) \
+ || ALLOCA_LIMIT <= newpsize) \
+ return -1; \
+ newp = (struct patternlist *) alloca (newpsize); \
+ *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L_('\0'); \
+ newp->next = NULL; \
+ *lastp = newp; \
+ lastp = &newp->next
+ NEW_PATTERN;
+ break;
+ }
+ }
+ else if (*p == L_('|'))
+ {
+ if (level == 0)
+ {
+ NEW_PATTERN;
+ startp = p + 1;
+ }
+ }
+ assert (list != NULL);
+ assert (p[-1] == L_(')'));
+#undef NEW_PATTERN
+
+ switch (opt)
+ {
+ case L_('*'):
+ if (FCT (p, string, string_end, no_leading_period, flags) == 0)
+ return 0;
+ /* FALLTHROUGH */
+
+ case L_('+'):
+ do
+ {
+ for (rs = string; rs <= string_end; ++rs)
+ /* First match the prefix with the current pattern with the
+ current pattern. */
+ if (FCT (list->str, string, rs, no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0
+ /* This was successful. Now match the rest with the rest
+ of the pattern. */
+ && (FCT (p, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME
+ ? flags : flags & ~FNM_PERIOD) == 0
+ /* This didn't work. Try the whole pattern. */
+ || (rs != string
+ && FCT (pattern - 1, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME
+ ? flags : flags & ~FNM_PERIOD) == 0)))
+ /* It worked. Signal success. */
+ return 0;
+ }
+ while ((list = list->next) != NULL);
+
+ /* None of the patterns lead to a match. */
+ return FNM_NOMATCH;
+
+ case L_('?'):
+ if (FCT (p, string, string_end, no_leading_period, flags) == 0)
+ return 0;
+ /* FALLTHROUGH */
+
+ case L_('@'):
+ do
+ /* I cannot believe it but `strcat' is actually acceptable
+ here. Match the entire string with the prefix from the
+ pattern list and the rest of the pattern following the
+ pattern list. */
+ if (FCT (STRCAT (list->str, p), string, string_end,
+ no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0)
+ /* It worked. Signal success. */
+ return 0;
+ while ((list = list->next) != NULL);
+
+ /* None of the patterns lead to a match. */
+ return FNM_NOMATCH;
+
+ case L_('!'):
+ for (rs = string; rs <= string_end; ++rs)
+ {
+ struct patternlist *runp;
+
+ for (runp = list; runp != NULL; runp = runp->next)
+ if (FCT (runp->str, string, rs, no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0)
+ break;
+
+ /* If none of the patterns matched see whether the rest does. */
+ if (runp == NULL
+ && (FCT (p, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD)
+ == 0))
+ /* This is successful. */
+ return 0;
+ }
+
+ /* None of the patterns together with the rest of the pattern
+ lead to a match. */
+ return FNM_NOMATCH;
+
+ default:
+ assert (! "Invalid extended matching operator");
+ break;
+ }
+
+ return -1;
+}
+
+
+#undef FOLD
+#undef CHAR
+#undef UCHAR
+#undef INT
+#undef FCT
+#undef EXT
+#undef END
+#undef MEMPCPY
+#undef MEMCHR
+#undef STRCOLL
+#undef STRLEN
+#undef STRCAT
+#undef L_
+#undef BTOWC
diff --git a/gnulib/lib/fopen-safer.c b/gnulib/lib/fopen-safer.c
new file mode 100644
index 00000000..0151182d
--- /dev/null
+++ b/gnulib/lib/fopen-safer.c
@@ -0,0 +1,63 @@
+/* Invoke fopen, but avoid some glitches.
+
+ Copyright (C) 2001, 2004-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "stdio-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include "unistd-safer.h"
+
+/* Like fopen, but do not return stdin, stdout, or stderr. */
+
+FILE *
+fopen_safer (char const *file, char const *mode)
+{
+ FILE *fp = fopen (file, mode);
+
+ if (fp)
+ {
+ int fd = fileno (fp);
+
+ if (0 <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer (fd);
+
+ if (f < 0)
+ {
+ int e = errno;
+ fclose (fp);
+ errno = e;
+ return NULL;
+ }
+
+ if (fclose (fp) != 0
+ || ! (fp = fdopen (f, mode)))
+ {
+ int e = errno;
+ close (f);
+ errno = e;
+ return NULL;
+ }
+ }
+ }
+
+ return fp;
+}
diff --git a/gnulib/lib/fopen.c b/gnulib/lib/fopen.c
new file mode 100644
index 00000000..377b14f7
--- /dev/null
+++ b/gnulib/lib/fopen.c
@@ -0,0 +1,105 @@
+/* Open a stream to a file.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Get the original definition of fopen. It might be defined as a macro. */
+#define __need_FILE
+#include <stdio.h>
+#undef __need_FILE
+
+static inline FILE *
+orig_fopen (const char *filename, const char *mode)
+{
+ return fopen (filename, mode);
+}
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+FILE *
+rpl_fopen (const char *filename, const char *mode)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (strcmp (filename, "/dev/null") == 0)
+ filename = "NUL";
+#endif
+
+#if FOPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and a mode that requires write access is
+ specified, then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file already exists as a directory, then if a mode that
+ requires write access is specified, fopen() must fail because POSIX
+ <http://www.opengroup.org/susv3/functions/fopen.html> says that it
+ fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ fopen() must fail since the file does not contain a '.' directory. */
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ int fd;
+ struct stat statbuf;
+ FILE *fp;
+
+ if (mode[0] == 'w' || mode[0] == 'a')
+ {
+ errno = EISDIR;
+ return NULL;
+ }
+
+ fd = open (filename, O_RDONLY);
+ if (fd < 0)
+ return NULL;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return NULL;
+ }
+
+ fp = fdopen (fd, mode);
+ if (fp == NULL)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ }
+ return fp;
+ }
+ }
+# endif
+
+ return orig_fopen (filename, mode);
+}
diff --git a/gnulib/lib/fpending.c b/gnulib/lib/fpending.c
new file mode 100644
index 00000000..774b396e
--- /dev/null
+++ b/gnulib/lib/fpending.c
@@ -0,0 +1,30 @@
+/* fpending.c -- return the number of pending output bytes on a stream
+ Copyright (C) 2000, 2004, 2006-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "fpending.h"
+
+/* Return the number of pending (aka buffered, unflushed)
+ bytes on the stream, FP, that is open for writing. */
+size_t
+__fpending (FILE *fp)
+{
+ return PENDING_OUTPUT_N_BYTES;
+}
diff --git a/gnulib/lib/fpending.h b/gnulib/lib/fpending.h
new file mode 100644
index 00000000..fff34f1e
--- /dev/null
+++ b/gnulib/lib/fpending.h
@@ -0,0 +1,34 @@
+/* Declare __fpending.
+
+ Copyright (C) 2000, 2003, 2005-2006, 2009-2010 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/>.
+
+ Written by Jim Meyering. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifndef HAVE_DECL___FPENDING
+"this configure-time declaration test was not run"
+#endif
+
+#if HAVE_DECL___FPENDING
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+#else
+size_t __fpending (FILE *);
+#endif
diff --git a/gnulib/lib/fprintf.c b/gnulib/lib/fprintf.c
new file mode 100644
index 00000000..fda2a49c
--- /dev/null
+++ b/gnulib/lib/fprintf.c
@@ -0,0 +1,77 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+#include "vasnprintf.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+fprintf (FILE *fp, const char *format, ...)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/fprintftime.c b/gnulib/lib/fprintftime.c
new file mode 100644
index 00000000..e6eb4f20
--- /dev/null
+++ b/gnulib/lib/fprintftime.c
@@ -0,0 +1,2 @@
+#define FPRINTFTIME 1
+#include "strftime.c"
diff --git a/gnulib/lib/fprintftime.h b/gnulib/lib/fprintftime.h
new file mode 100644
index 00000000..e702e6ca
--- /dev/null
+++ b/gnulib/lib/fprintftime.h
@@ -0,0 +1,29 @@
+/* Generate time strings directly to the output. */
+
+/* Copyright (C) 2005, 2009-2010 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/>. */
+
+#include <stdio.h>
+#include <time.h>
+
+/* A cross between fprintf and nstrftime, that prints directly
+ to the output stream, without the need for the potentially
+ large buffer that nstrftime would require.
+
+ Output to stream FP the result of formatting (according to the
+ nstrftime format string, FMT) the time data, *TM, and the UTC
+ and NANOSECONDS values. */
+size_t fprintftime (FILE *fp, char const *fmt, struct tm const *tm,
+ int utc, int nanoseconds);
diff --git a/gnulib/lib/fpucw.h b/gnulib/lib/fpucw.h
new file mode 100644
index 00000000..c855faea
--- /dev/null
+++ b/gnulib/lib/fpucw.h
@@ -0,0 +1,107 @@
+/* Manipulating the FPU control word.
+ Copyright (C) 2007-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#ifndef _FPUCW_H
+#define _FPUCW_H
+
+/* The i386 floating point hardware (the 387 compatible FPU, not the modern
+ SSE/SSE2 hardware) has a controllable rounding precision. It is specified
+ through the 'PC' bits in the FPU control word ('fctrl' register). (See
+ the GNU libc i386 <fpu_control.h> header for details.)
+
+ On some platforms, such as Linux or Solaris, the default precision setting
+ is set to "extended precision". This means that 'long double' instructions
+ operate correctly, but 'double' computations often produce slightly
+ different results as on strictly IEEE 754 conforming systems.
+
+ On some platforms, such as NetBSD, the default precision is set to
+ "double precision". This means that 'long double' instructions will operate
+ only as 'double', i.e. lead wrong results.
+
+ The FPU control word is under control of the application, i.e. it is
+ not required to be set either way by the ABI. (In fact, the i386 ABI
+ http://refspecs.freestandards.org/elf/abi386-4.pdf page 3-12 = page 38
+ is not clear about it. But in any case, gcc treats the control word
+ like a "preserved" register: it emits code that assumes that the control
+ word is preserved across calls, and it restores the control word at the
+ end of functions that modify it.)
+
+ See Vincent Lefèvre's page http://www.vinc17.org/research/extended.en.html
+ for a good explanation.
+ See http://www.uwsg.iu.edu/hypermail/linux/kernel/0103.0/0453.html for
+ some argumentation which setting should be the default. */
+
+/* This header file provides the following facilities:
+ fpucw_t integral type holding the value of 'fctrl'
+ FPU_PC_MASK bit mask denoting the precision control
+ FPU_PC_DOUBLE precision control for 53 bits mantissa
+ FPU_PC_EXTENDED precision control for 64 bits mantissa
+ GET_FPUCW () yields the current FPU control word
+ SET_FPUCW (word) sets the FPU control word
+ DECL_LONG_DOUBLE_ROUNDING variable declaration for
+ BEGIN/END_LONG_DOUBLE_ROUNDING
+ BEGIN_LONG_DOUBLE_ROUNDING () starts a sequence of instructions with
+ 'long double' safe operation precision
+ END_LONG_DOUBLE_ROUNDING () ends a sequence of instructions with
+ 'long double' safe operation precision
+ */
+
+/* Inline assembler like this works only with GNU C. */
+#if (defined __i386__ || defined __x86_64__) && defined __GNUC__
+
+typedef unsigned short fpucw_t; /* glibc calls this fpu_control_t */
+
+# define FPU_PC_MASK 0x0300
+# define FPU_PC_DOUBLE 0x200 /* glibc calls this _FPU_DOUBLE */
+# define FPU_PC_EXTENDED 0x300 /* glibc calls this _FPU_EXTENDED */
+
+# define GET_FPUCW() \
+ ({ fpucw_t _cw; \
+ __asm__ __volatile__ ("fnstcw %0" : "=m" (*&_cw)); \
+ _cw; \
+ })
+# define SET_FPUCW(word) \
+ (void)({ fpucw_t _ncw = (word); \
+ __asm__ __volatile__ ("fldcw %0" : : "m" (*&_ncw)); \
+ })
+
+# define DECL_LONG_DOUBLE_ROUNDING \
+ fpucw_t oldcw;
+# define BEGIN_LONG_DOUBLE_ROUNDING() \
+ (void)(oldcw = GET_FPUCW (), \
+ SET_FPUCW ((oldcw & ~FPU_PC_MASK) | FPU_PC_EXTENDED))
+# define END_LONG_DOUBLE_ROUNDING() \
+ SET_FPUCW (oldcw)
+
+#else
+
+typedef unsigned int fpucw_t;
+
+# define FPU_PC_MASK 0
+# define FPU_PC_DOUBLE 0
+# define FPU_PC_EXTENDED 0
+
+# define GET_FPUCW() 0
+# define SET_FPUCW(word) (void)(word)
+
+# define DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_LONG_DOUBLE_ROUNDING()
+# define END_LONG_DOUBLE_ROUNDING()
+
+#endif
+
+#endif /* _FPUCW_H */
diff --git a/gnulib/lib/fpurge.c b/gnulib/lib/fpurge.c
new file mode 100644
index 00000000..079a2995
--- /dev/null
+++ b/gnulib/lib/fpurge.c
@@ -0,0 +1,137 @@
+/* Flushing buffers of a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7 */
+# include <stdio_ext.h>
+#endif
+#include <stdlib.h>
+
+#include "stdio-impl.h"
+
+int
+fpurge (FILE *fp)
+{
+#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7 */
+
+ __fpurge (fp);
+ /* The __fpurge function does not have a return value. */
+ return 0;
+
+#elif HAVE_FPURGE /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin 1.7 */
+
+ /* Call the system's fpurge function. */
+# undef fpurge
+# if !HAVE_DECL_FPURGE
+ extern int fpurge (FILE *);
+# endif
+ int result = fpurge (fp);
+# if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if (result == 0)
+ /* Correct the invariants that fpurge broke.
+ <stdio.h> on BSD systems says:
+ "The following always hold: if _flags & __SRD, _w is 0."
+ If this invariant is not fulfilled and the stream is read-write but
+ currently reading, subsequent putc or fputc calls will write directly
+ into the buffer, although they shouldn't be allowed to. */
+ if ((fp_->_flags & __SRD) != 0)
+ fp_->_w = 0;
+# endif
+ return result;
+
+#else
+
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+# if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_IO_read_end = fp->_IO_read_ptr;
+ fp->_IO_write_ptr = fp->_IO_write_base;
+ /* Avoid memory leak when there is an active ungetc buffer. */
+ if (fp->_IO_save_base != NULL)
+ {
+ free (fp->_IO_save_base);
+ fp->_IO_save_base = NULL;
+ }
+ return 0;
+# elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ fp_->_p = fp_->_bf._base;
+ fp_->_r = 0;
+ fp_->_w = ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
+ ? fp_->_bf._size
+ : 0);
+ /* Avoid memory leak when there is an active ungetc buffer. */
+ if (fp_ub._base != NULL)
+ {
+ if (fp_ub._base != fp_->_ubuf)
+ free (fp_ub._base);
+ fp_ub._base = NULL;
+ }
+ return 0;
+# elif defined __EMX__ /* emx+gcc */
+ fp->_ptr = fp->_buffer;
+ fp->_rcount = 0;
+ fp->_wcount = 0;
+ fp->_ungetc_count = 0;
+ return 0;
+# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ fp->_ptr = fp->_base;
+ if (fp->_ptr != NULL)
+ fp->_cnt = 0;
+ return 0;
+# elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ if (fp->__modeflags & __FLAG_WRITING)
+ fp->__bufpos = fp->__bufstart;
+ else if (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING))
+ fp->__bufpos = fp->__bufread;
+# endif
+ return 0;
+# elif defined __QNX__ /* QNX */
+ fp->_Rback = fp->_Back + sizeof (fp->_Back);
+ fp->_Rsave = NULL;
+ if (fp->_Mode & 0x2000 /* _MWRITE */)
+ /* fp->_Buf <= fp->_Next <= fp->_Wend */
+ fp->_Next = fp->_Buf;
+ else
+ /* fp->_Buf <= fp->_Next <= fp->_Rend */
+ fp->_Rend = fp->_Next;
+ return 0;
+# elif defined __MINT__ /* Atari FreeMiNT */
+ if (fp->__pushed_back)
+ {
+ fp->__bufp = fp->__pushback_bufp;
+ fp->__pushed_back = 0;
+ }
+ /* Preserve the current file position. */
+ if (fp->__target != -1)
+ fp->__target += fp->__bufp - fp->__buffer;
+ fp->__bufp = fp->__buffer;
+ /* Nothing in the buffer, next getc is nontrivial. */
+ fp->__get_limit = fp->__bufp;
+ /* Nothing in the buffer, next putc is nontrivial. */
+ fp->__put_limit = fp->__buffer;
+ return 0;
+# else
+ #error "Please port gnulib fpurge.c to your platform! Look at the definitions of fflush, setvbuf and ungetc on your system, then report this to bug-gnulib."
+# endif
+
+#endif
+}
diff --git a/gnulib/lib/freadable.c b/gnulib/lib/freadable.c
new file mode 100644
index 00000000..9464408b
--- /dev/null
+++ b/gnulib/lib/freadable.c
@@ -0,0 +1,45 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freadable.h"
+
+#include "stdio-impl.h"
+
+bool
+freadable (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return (fp->_flags & _IO_NO_READS) == 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ return (fp_->_flags & (__SRW | __SRD)) != 0;
+#elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & (_IORW | _IOREAD)) != 0;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ return (fp->_flag & (_IORW | _IOREAD)) != 0;
+#elif defined __QNX__ /* QNX */
+ return (fp->_Mode & 0x1 /* _MOPENR */) != 0;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ return fp->__mode.__read;
+#else
+ #error "Please port gnulib freadable.c to your platform! Look at the definition of fopen, fdopen on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/freadable.h b/gnulib/lib/freadable.h
new file mode 100644
index 00000000..7f697ac1
--- /dev/null
+++ b/gnulib/lib/freadable.h
@@ -0,0 +1,42 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM supports reading, false if it supports
+ only writing, i.e. if it was opened write-only or append-only.
+ STREAM must not be wide-character oriented.
+ The result doesn't change until the stream is closed or re-opened. */
+
+#if HAVE___FREADABLE /* glibc >= 2.2, Solaris >= 7 */
+
+# include <stdio_ext.h>
+# define freadable(stream) (__freadable (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool freadable (FILE *stream);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/freadahead.c b/gnulib/lib/freadahead.c
new file mode 100644
index 00000000..50ff27ee
--- /dev/null
+++ b/gnulib/lib/freadahead.c
@@ -0,0 +1,85 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freadahead.h"
+
+#include <stdlib.h>
+#include "stdio-impl.h"
+
+size_t
+freadahead (FILE *fp)
+{
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ if (fp->_IO_write_ptr > fp->_IO_write_base)
+ return 0;
+ return (fp->_IO_read_end - fp->_IO_read_ptr)
+ + (fp->_flags & _IO_IN_BACKUP ? fp->_IO_save_end - fp->_IO_save_base :
+ 0);
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
+ return 0;
+# if defined __DragonFly__
+ return __sreadahead (fp);
+# else
+ return fp_->_r
+ + (HASUB (fp) ? fp_->_ur : 0);
+# endif
+#elif defined __EMX__ /* emx+gcc */
+ if ((fp->_flags & _IOWRT) != 0)
+ return 0;
+ /* Note: fp->_ungetc_count > 0 implies fp->_rcount <= 0,
+ fp->_ungetc_count = 0 implies fp->_rcount >= 0. */
+ /* equivalent to
+ (fp->_ungetc_count == 0 ? fp->_rcount : fp->_ungetc_count - fp->_rcount) */
+ return (fp->_rcount > 0 ? fp->_rcount : fp->_ungetc_count - fp->_rcount);
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ if ((fp_->_flag & _IOWRT) != 0)
+ return 0;
+ return fp_->_cnt;
+#elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ if (fp->__modeflags & __FLAG_WRITING)
+ return 0;
+ return (fp->__bufread - fp->__bufpos)
+ + (fp->__modeflags & __FLAG_UNGOT ? 1 : 0);
+# else
+ return 0;
+# endif
+#elif defined __QNX__ /* QNX */
+ if ((fp->_Mode & 0x2000 /* _MWRITE */) != 0)
+ return 0;
+ /* fp->_Buf <= fp->_Next <= fp->_Rend,
+ and fp->_Rend may be overridden by fp->_Rsave. */
+ return ((fp->_Rsave ? fp->_Rsave : fp->_Rend) - fp->_Next)
+ + (fp->_Mode & 0x4000 /* _MBYTE */
+ ? (fp->_Back + sizeof (fp->_Back)) - fp->_Rback
+ : 0);
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__read)
+ return 0;
+ return (fp->__pushed_back
+ ? fp->__get_limit - fp->__pushback_bufp + 1
+ : fp->__get_limit - fp->__bufp);
+#elif defined SLOW_BUT_NO_HACKS /* users can define this */
+ abort ();
+ return 0;
+#else
+ #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/freadahead.h b/gnulib/lib/freadahead.h
new file mode 100644
index 00000000..54466b40
--- /dev/null
+++ b/gnulib/lib/freadahead.h
@@ -0,0 +1,38 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Assuming the stream STREAM is open for reading:
+ Return the number of bytes waiting in the input buffer of STREAM.
+ This includes both the bytes that have been read from the underlying input
+ source and the bytes that have been pushed back through 'ungetc'.
+
+ If this number is 0 and the stream is not currently writing,
+ fflush (STREAM) is known to be a no-op.
+
+ STREAM must not be wide-character oriented. */
+
+extern size_t freadahead (FILE *stream);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/freading.c b/gnulib/lib/freading.c
new file mode 100644
index 00000000..faca60e1
--- /dev/null
+++ b/gnulib/lib/freading.c
@@ -0,0 +1,64 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freading.h"
+
+#include "stdio-impl.h"
+
+/* Don't use glibc's __freading function in glibc < 2.7, see
+ <http://sourceware.org/bugzilla/show_bug.cgi?id=4359> */
+#if !(HAVE___FREADING && (!defined __GLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)))
+
+bool
+freading (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return ((fp->_flags & _IO_NO_WRITES) != 0
+ || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
+ && fp->_IO_read_base != NULL));
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ return (fp_->_flags & __SRD) != 0;
+#elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & _IOREAD) != 0;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ return (fp->_flag & _IOREAD) != 0;
+#elif defined __UCLIBC__ /* uClibc */
+ return (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) != 0;
+#elif defined __QNX__ /* QNX */
+ return ((fp->_Mode & 0x2 /* _MOPENW */) == 0
+ || (fp->_Mode & 0x1000 /* _MREAD */) != 0);
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__write)
+ return 1;
+ if (!fp->__mode.__read)
+ return 0;
+# ifdef _IO_CURRENTLY_GETTING /* Flag added on 2009-02-28 */
+ return (fp->__flags & _IO_CURRENTLY_GETTING) != 0;
+# else
+ return (fp->__buffer < fp->__get_limit /*|| fp->__bufp == fp->__put_limit ??*/);
+# endif
+#else
+ #error "Please port gnulib freading.c to your platform!"
+#endif
+}
+
+#endif
diff --git a/gnulib/lib/freading.h b/gnulib/lib/freading.h
new file mode 100644
index 00000000..9b3b6c6a
--- /dev/null
+++ b/gnulib/lib/freading.h
@@ -0,0 +1,53 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM is opened read-only, or if the
+ last operation on the stream was a read operation. Return false if
+ the stream is opened write-only or append-only, or if it supports
+ writing and there is no current read operation (such as fgetc).
+
+ freading and fwriting will never both be true. If STREAM supports
+ both reads and writes, then:
+ - both freading and fwriting might be false when the stream is first
+ opened, after read encounters EOF, or after fflush,
+ - freading might be false or true and fwriting might be false
+ after repositioning (such as fseek, fsetpos, or rewind),
+ depending on the underlying implementation.
+
+ STREAM must not be wide-character oriented. */
+
+#if HAVE___FREADING && (!defined __GLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
+/* Solaris >= 7, not glibc >= 2.2, but glibc >= 2.7 */
+
+# include <stdio_ext.h>
+# define freading(stream) (__freading (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool freading (FILE *stream);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/freadptr.c b/gnulib/lib/freadptr.c
new file mode 100644
index 00000000..05f501bf
--- /dev/null
+++ b/gnulib/lib/freadptr.c
@@ -0,0 +1,103 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freadptr.h"
+
+#include <stdlib.h>
+
+#include "stdio-impl.h"
+
+const char *
+freadptr (FILE *fp, size_t *sizep)
+{
+ size_t size;
+
+ /* Keep this code in sync with freadahead! */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ if (fp->_IO_write_ptr > fp->_IO_write_base)
+ return NULL;
+ size = fp->_IO_read_end - fp->_IO_read_ptr;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp->_IO_read_ptr;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
+ return NULL;
+ size = fp_->_r;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp_->_p;
+#elif defined __EMX__ /* emx+gcc */
+ if ((fp->_flags & _IOWRT) != 0)
+ return NULL;
+ /* Note: fp->_ungetc_count > 0 implies fp->_rcount <= 0,
+ fp->_ungetc_count = 0 implies fp->_rcount >= 0. */
+ if (fp->_rcount <= 0)
+ return NULL;
+ if (!(fp->_ungetc_count == 0))
+ abort ();
+ *sizep = fp->_rcount;
+ return fp->_ptr;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ if ((fp_->_flag & _IOWRT) != 0)
+ return NULL;
+ size = fp_->_cnt;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp_->_ptr;
+#elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ if (fp->__modeflags & __FLAG_WRITING)
+ return NULL;
+ size = fp->__bufread - fp->__bufpos;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp->__bufpos;
+# else
+ return NULL;
+# endif
+#elif defined __QNX__ /* QNX */
+ if ((fp->_Mode & 0x2000 /* _MWRITE */) != 0)
+ return NULL;
+ /* fp->_Buf <= fp->_Next <= fp->_Rend */
+ size = fp->_Rend - fp->_Next;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp->_Next;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__read)
+ return NULL;
+ size = fp->__get_limit - fp->__bufp;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return fp->__bufp;
+#elif defined SLOW_BUT_NO_HACKS /* users can define this */
+ /* This implementation is correct on any ANSI C platform. It is just
+ awfully slow. */
+ return NULL;
+#else
+ #error "Please port gnulib freadptr.c to your platform! Look at the definition of fflush, fread, getc, getc_unlocked on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/freadptr.h b/gnulib/lib/freadptr.h
new file mode 100644
index 00000000..855cbd66
--- /dev/null
+++ b/gnulib/lib/freadptr.h
@@ -0,0 +1,39 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Assuming the stream STREAM is open for reading:
+ Return a pointer to the input buffer of STREAM, or NULL.
+ If the returned pointer is non-NULL, *SIZEP is set to the (positive) size
+ of the input buffer.
+ If the returned pointer is NULL, you should use getc (STREAM),
+ fgetc (STREAM), or fread (..., STREAM) to access the input from STREAM.
+
+ The resulting pointer becomes invalid upon any operation on STREAM.
+
+ STREAM must not be wide-character oriented. */
+
+extern const char * freadptr (FILE *stream, size_t *sizep);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/freadseek.c b/gnulib/lib/freadseek.c
new file mode 100644
index 00000000..99af4370
--- /dev/null
+++ b/gnulib/lib/freadseek.c
@@ -0,0 +1,136 @@
+/* Skipping input from a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freadseek.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "freadahead.h"
+#include "freadptr.h"
+
+#include "stdio-impl.h"
+
+/* Increment the in-memory pointer. INCREMENT must be at most the buffer size
+ returned by freadptr().
+ This is very cheap (no system calls). */
+static inline void
+freadptrinc (FILE *fp, size_t increment)
+{
+ /* Keep this code in sync with freadptr! */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_IO_read_ptr += increment;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ fp_->_p += increment;
+ fp_->_r -= increment;
+#elif defined __EMX__ /* emx+gcc */
+ fp->_ptr += increment;
+ fp->_rcount -= increment;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ fp_->_ptr += increment;
+ fp_->_cnt -= increment;
+#elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ fp->__bufpos += increment;
+# else
+ abort ();
+# endif
+#elif defined __QNX__ /* QNX */
+ fp->_Next += increment;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ fp->__bufp += increment;
+#elif defined SLOW_BUT_NO_HACKS /* users can define this */
+#else
+ #error "Please port gnulib freadseek.c to your platform! Look at the definition of getc, getc_unlocked on your system, then report this to bug-gnulib."
+#endif
+}
+
+int
+freadseek (FILE *fp, size_t offset)
+{
+ size_t total_buffered;
+ int fd;
+
+ if (offset == 0)
+ return 0;
+
+ /* Seek over the already read and buffered input as quickly as possible,
+ without doing any system calls. */
+ total_buffered = freadahead (fp);
+ /* This loop is usually executed at most twice: once for ungetc buffer (if
+ present) and once for the main buffer. */
+ while (total_buffered > 0)
+ {
+ size_t buffered;
+
+ if (freadptr (fp, &buffered) != NULL && buffered > 0)
+ {
+ size_t increment = (buffered < offset ? buffered : offset);
+
+ freadptrinc (fp, increment);
+ offset -= increment;
+ if (offset == 0)
+ return 0;
+ total_buffered -= increment;
+ if (total_buffered == 0)
+ break;
+ }
+ /* Read one byte. If we were reading from the ungetc buffer, this
+ switches the stream back to the main buffer. */
+ if (fgetc (fp) == EOF)
+ goto eof;
+ offset--;
+ if (offset == 0)
+ return 0;
+ total_buffered--;
+ }
+
+ /* Test whether the stream is seekable or not. */
+ fd = fileno (fp);
+ if (fd >= 0 && lseek (fd, 0, SEEK_CUR) >= 0)
+ {
+ /* FP refers to a regular file. fseek is most efficient in this case. */
+ return fseeko (fp, offset, SEEK_CUR);
+ }
+ else
+ {
+ /* FP is a non-seekable stream, possibly not even referring to a file
+ descriptor. Read OFFSET bytes explicitly and discard them. */
+ char buf[4096];
+
+ do
+ {
+ size_t count = (sizeof (buf) < offset ? sizeof (buf) : offset);
+ if (fread (buf, 1, count, fp) < count)
+ goto eof;
+ offset -= count;
+ }
+ while (offset > 0);
+
+ return 0;
+ }
+
+ eof:
+ /* EOF, or error before or while reading. */
+ if (ferror (fp))
+ return EOF;
+ else
+ /* Encountered EOF. */
+ return 0;
+}
diff --git a/gnulib/lib/freadseek.h b/gnulib/lib/freadseek.h
new file mode 100644
index 00000000..572d4870
--- /dev/null
+++ b/gnulib/lib/freadseek.h
@@ -0,0 +1,42 @@
+/* Skipping input from a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Assuming the stream STREAM is open for reading:
+
+ Read and discard OFFSET bytes from STREAM.
+
+ freadseek (STREAM, OFFSET) is the same as
+ fseek (STREAM, OFFSET, SEEK_CUR), except that the latter does not work
+ on non-seekable input streams (such as pipes).
+
+ Upon success, return 0.
+ Upon premature end of stream, return 0 (like fseek does).
+ Upon error, set the error indicator in the stream and return EOF.
+
+ STREAM must not be wide-character oriented. */
+
+extern int freadseek (FILE *stream, size_t offset);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/free.c b/gnulib/lib/free.c
new file mode 100644
index 00000000..f6c6643d
--- /dev/null
+++ b/gnulib/lib/free.c
@@ -0,0 +1,30 @@
+/* Work around incompatibility on older systems where free (NULL) fails.
+
+ Copyright (C) 2003, 2006, 2009, 2010 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/>. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+#undef free
+
+#include <stdlib.h>
+
+void
+rpl_free (void *p)
+{
+ if (p)
+ free (p);
+}
diff --git a/gnulib/lib/freopen-safer.c b/gnulib/lib/freopen-safer.c
new file mode 100644
index 00000000..447a0ecf
--- /dev/null
+++ b/gnulib/lib/freopen-safer.c
@@ -0,0 +1,103 @@
+/* Invoke freopen, but avoid some glitches.
+
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "stdio-safer.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+/* Guarantee that FD is open; all smaller FDs must already be open.
+ Return true if successful. */
+static bool
+protect_fd (int fd)
+{
+ int value = open ("/dev/null", O_RDONLY);
+ if (value != fd)
+ {
+ if (0 <= value)
+ {
+ close (value);
+ errno = EBADF; /* Unexpected; this is as good as anything else. */
+ }
+ return false;
+ }
+ return true;
+}
+
+/* Like freopen, but guarantee that reopening stdin, stdout, or stderr
+ preserves the invariant that STDxxx_FILENO==fileno(stdxxx), and
+ that no other stream will interfere with the standard streams.
+ This is necessary because most freopen implementations will change
+ the associated fd of a stream to the lowest available slot. */
+
+FILE *
+freopen_safer (char const *name, char const *mode, FILE *f)
+{
+ /* Unfortunately, we cannot use the fopen_safer approach of using
+ fdopen (dup_safer (fileno (freopen (cmd, mode, f)))), because we
+ need to return f itself. The implementation of freopen(NULL,m,f)
+ is system-dependent, so the best we can do is guarantee that all
+ lower-valued standard fds are open prior to the freopen call,
+ even though this puts more pressure on open fds. */
+ bool protect_in = false;
+ bool protect_out = false;
+ bool protect_err = false;
+ int saved_errno;
+
+ switch (fileno (f))
+ {
+ default: /* -1 or not a standard stream. */
+ if (dup2 (STDERR_FILENO, STDERR_FILENO) != STDERR_FILENO)
+ protect_err = true;
+ /* fall through */
+ case STDERR_FILENO:
+ if (dup2 (STDOUT_FILENO, STDOUT_FILENO) != STDOUT_FILENO)
+ protect_out = true;
+ /* fall through */
+ case STDOUT_FILENO:
+ if (dup2 (STDIN_FILENO, STDIN_FILENO) != STDIN_FILENO)
+ protect_in = true;
+ /* fall through */
+ case STDIN_FILENO:
+ /* Nothing left to protect. */
+ break;
+ }
+ if (protect_in && !protect_fd (STDIN_FILENO))
+ f = NULL;
+ else if (protect_out && !protect_fd (STDOUT_FILENO))
+ f = NULL;
+ else if (protect_err && !protect_fd (STDERR_FILENO))
+ f = NULL;
+ else
+ f = freopen (name, mode, f);
+ saved_errno = errno;
+ if (protect_err)
+ close (STDERR_FILENO);
+ if (protect_out)
+ close (STDOUT_FILENO);
+ if (protect_in)
+ close (STDIN_FILENO);
+ if (!f)
+ errno = saved_errno;
+ return f;
+}
diff --git a/gnulib/lib/freopen.c b/gnulib/lib/freopen.c
new file mode 100644
index 00000000..5da5ceda
--- /dev/null
+++ b/gnulib/lib/freopen.c
@@ -0,0 +1,46 @@
+/* Open a stream to a file.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Get the original definition of freopen. It might be defined as a macro. */
+#define __need_FILE
+#include <stdio.h>
+#undef __need_FILE
+
+static inline FILE *
+orig_freopen (const char *filename, const char *mode, FILE *stream)
+{
+ return freopen (filename, mode, stream);
+}
+
+/* Specification. */
+#include <stdio.h>
+
+#include <string.h>
+
+FILE *
+rpl_freopen (const char *filename, const char *mode, FILE *stream)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (strcmp (filename, "/dev/null") == 0)
+ filename = "NUL";
+#endif
+
+ return orig_freopen (filename, mode, stream);
+}
diff --git a/gnulib/lib/frexp.c b/gnulib/lib/frexp.c
new file mode 100644
index 00000000..e139885c
--- /dev/null
+++ b/gnulib/lib/frexp.c
@@ -0,0 +1,166 @@
+/* Split a double into fraction and mantissa.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Paolo Bonzini <bonzini@gnu.org>, 2003, and
+ Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+#ifdef USE_LONG_DOUBLE
+# include "isnanl-nolibm.h"
+# include "fpucw.h"
+#else
+# include "isnand-nolibm.h"
+#endif
+
+/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
+ than 2, or not even a power of 2, some rounding errors can occur, so that
+ then the returned mantissa is only guaranteed to be <= 1.0, not < 1.0. */
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC frexpl
+# define DOUBLE long double
+# define ISNAN isnanl
+# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
+# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
+# define L_(literal) literal##L
+#else
+# define FUNC frexp
+# define DOUBLE double
+# define ISNAN isnand
+# define DECL_ROUNDING
+# define BEGIN_ROUNDING()
+# define END_ROUNDING()
+# define L_(literal) literal
+#endif
+
+DOUBLE
+FUNC (DOUBLE x, int *expptr)
+{
+ int sign;
+ int exponent;
+ DECL_ROUNDING
+
+ /* Test for NaN, infinity, and zero. */
+ if (ISNAN (x) || x + x == x)
+ {
+ *expptr = 0;
+ return x;
+ }
+
+ sign = 0;
+ if (x < 0)
+ {
+ x = - x;
+ sign = -1;
+ }
+
+ BEGIN_ROUNDING ();
+
+ {
+ /* Since the exponent is an 'int', it fits in 64 bits. Therefore the
+ loops are executed no more than 64 times. */
+ DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
+ DOUBLE powh[64]; /* powh[i] = 2^-2^i */
+ int i;
+
+ exponent = 0;
+ if (x >= L_(1.0))
+ {
+ /* A positive exponent. */
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x >= 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x >= pow2_i)
+ {
+ exponent += (1 << i);
+ x *= powh_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ /* Avoid making x too small, as it could become a denormalized
+ number and thus lose precision. */
+ while (i > 0 && x < pow2[i - 1])
+ {
+ i--;
+ powh_i = powh[i];
+ }
+ exponent += (1 << i);
+ x *= powh_i;
+ /* Here 2^-2^i <= x < 1.0. */
+ }
+ else
+ {
+ /* A negative or zero exponent. */
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x < 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x < powh_i)
+ {
+ exponent -= (1 << i);
+ x *= pow2_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ /* Here 2^-2^i <= x < 1.0. */
+ }
+
+ /* Invariants: x * 2^exponent = argument, and 2^-2^i <= x < 1.0. */
+ while (i > 0)
+ {
+ i--;
+ if (x < powh[i])
+ {
+ exponent -= (1 << i);
+ x *= pow2[i];
+ }
+ }
+ /* Here 0.5 <= x < 1.0. */
+ }
+
+ if (sign < 0)
+ x = - x;
+
+ END_ROUNDING ();
+
+ *expptr = exponent;
+ return x;
+}
diff --git a/gnulib/lib/frexpl.c b/gnulib/lib/frexpl.c
new file mode 100644
index 00000000..c8059995
--- /dev/null
+++ b/gnulib/lib/frexpl.c
@@ -0,0 +1,18 @@
+/* Split a 'long double' into fraction and mantissa.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#define USE_LONG_DOUBLE
+#include "frexp.c"
diff --git a/gnulib/lib/fseek.c b/gnulib/lib/fseek.c
new file mode 100644
index 00000000..f289da51
--- /dev/null
+++ b/gnulib/lib/fseek.c
@@ -0,0 +1,30 @@
+/* An fseek() function that, together with fflush(), is POSIX compliant.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get off_t. */
+#include <unistd.h>
+
+int
+fseek (FILE *fp, long offset, int whence)
+{
+ /* Use the replacement fseeko function with all its workarounds. */
+ return fseeko (fp, (off_t)offset, whence);
+}
diff --git a/gnulib/lib/fseeko.c b/gnulib/lib/fseeko.c
new file mode 100644
index 00000000..7c0fd0e8
--- /dev/null
+++ b/gnulib/lib/fseeko.c
@@ -0,0 +1,147 @@
+/* An fseeko() function that, together with fflush(), is POSIX compliant.
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get off_t and lseek. */
+#include <unistd.h>
+
+#include "stdio-impl.h"
+
+#undef fseeko
+#if !HAVE_FSEEKO
+# undef fseek
+# define fseeko fseek
+#endif
+
+int
+rpl_fseeko (FILE *fp, off_t offset, int whence)
+{
+#if LSEEK_PIPE_BROKEN
+ /* mingw gives bogus answers rather than failure on non-seekable files. */
+ if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
+ return EOF;
+#endif
+
+ /* These tests are based on fpurge.c. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ if (fp->_IO_read_end == fp->_IO_read_ptr
+ && fp->_IO_write_ptr == fp->_IO_write_base
+ && fp->_IO_save_base == NULL)
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+# if defined __SL64 && defined __SCLE /* Cygwin */
+ if ((fp->_flags & __SL64) == 0)
+ {
+ /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
+ mode; but has an fseeko that requires 64-bit mode. */
+ FILE *tmp = fopen ("/dev/null", "r");
+ if (!tmp)
+ return -1;
+ fp->_flags |= __SL64;
+ fp->_seek64 = tmp->_seek64;
+ fclose (tmp);
+ }
+# endif
+ if (fp_->_p == fp_->_bf._base
+ && fp_->_r == 0
+ && fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
+ ? fp_->_bf._size
+ : 0)
+ && fp_ub._base == NULL)
+#elif defined __EMX__ /* emx+gcc */
+ if (fp->_ptr == fp->_buffer
+ && fp->_rcount == 0
+ && fp->_wcount == 0
+ && fp->_ungetc_count == 0)
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ if (fp_->_ptr == fp_->_base
+ && (fp_->_ptr == NULL || fp_->_cnt == 0))
+#elif defined __UCLIBC__ /* uClibc */
+ if (((fp->__modeflags & __FLAG_WRITING) == 0
+ || fp->__bufpos == fp->__bufstart)
+ && ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0
+ || fp->__bufpos == fp->__bufread))
+#elif defined __QNX__ /* QNX */
+ if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend)
+ && fp->_Rback == fp->_Back + sizeof (fp->_Back)
+ && fp->_Rsave == NULL)
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (fp->__bufp == fp->__buffer
+ && fp->__get_limit == fp->__bufp
+ && fp->__put_limit == fp->__bufp
+ && !fp->__pushed_back)
+#else
+ #error "Please port gnulib fseeko.c to your platform! Look at the code in fpurge.c, then report this to bug-gnulib."
+#endif
+ {
+ /* We get here when an fflush() call immediately preceded this one. We
+ know there are no buffers.
+ POSIX requires us to modify the file descriptor's position.
+ But we cannot position beyond end of file here. */
+ off_t pos =
+ lseek (fileno (fp),
+ whence == SEEK_END && offset > 0 ? 0 : offset,
+ whence);
+ if (pos == -1)
+ {
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ fp_->_flags &= ~__SOFF;
+#endif
+ return -1;
+ }
+
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_flags &= ~_IO_EOF_SEEN;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+# if defined __CYGWIN__
+ /* fp_->_offset is typed as an integer. */
+ fp_->_offset = pos;
+# else
+ /* fp_->_offset is an fpos_t. */
+ {
+ /* Use a union, since on NetBSD, the compilation flags
+ determine whether fpos_t is typedef'd to off_t or a struct
+ containing a single off_t member. */
+ union
+ {
+ fpos_t f;
+ off_t o;
+ } u;
+ u.o = pos;
+ fp_->_offset = u.f;
+ }
+# endif
+ fp_->_flags |= __SOFF;
+ fp_->_flags &= ~__SEOF;
+#elif defined __EMX__ /* emx+gcc */
+ fp->_flags &= ~_IOEOF;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ fp->_flag &= ~_IOEOF;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ fp->__offset = pos;
+ fp->__eof = 0;
+#endif
+ /* If we were not requested to position beyond end of file, we're
+ done. */
+ if (!(whence == SEEK_END && offset > 0))
+ return 0;
+ }
+ return fseeko (fp, offset, whence);
+}
diff --git a/gnulib/lib/fseterr.c b/gnulib/lib/fseterr.c
new file mode 100644
index 00000000..b1a379eb
--- /dev/null
+++ b/gnulib/lib/fseterr.c
@@ -0,0 +1,74 @@
+/* Set the error indicator of a stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fseterr.h"
+
+#include <errno.h>
+
+#include "stdio-impl.h"
+
+void
+fseterr (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_flags |= _IO_ERR_SEEN;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ fp_->_flags |= __SERR;
+#elif defined __EMX__ /* emx+gcc */
+ fp->_flags |= _IOERR;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ fp_->_flag |= _IOERR;
+#elif defined __UCLIBC__ /* uClibc */
+ fp->__modeflags |= __FLAG_ERROR;
+#elif defined __QNX__ /* QNX */
+ fp->_Mode |= 0x200 /* _MERR */;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ fp->__error = 1;
+#elif 0 /* unknown */
+ /* Portable fallback, based on an idea by Rich Felker.
+ Wow! 6 system calls for something that is just a bit operation!
+ Not activated on any system, because there is no way to repair FP when
+ the sequence of system calls fails, and library code should not call
+ abort(). */
+ int saved_errno;
+ int fd;
+ int fd2;
+
+ saved_errno = errno;
+ fflush (fp);
+ fd = fileno (fp);
+ fd2 = dup (fd);
+ if (fd2 >= 0)
+ {
+ close (fd);
+ fputc ('\0', fp); /* This should set the error indicator. */
+ fflush (fp); /* Or this. */
+ if (dup2 (fd2, fd) < 0)
+ /* Whee... we botched the stream and now cannot restore it! */
+ abort ();
+ close (fd2);
+ }
+ errno = saved_errno;
+#else
+ #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/fseterr.h b/gnulib/lib/fseterr.h
new file mode 100644
index 00000000..178f0bc7
--- /dev/null
+++ b/gnulib/lib/fseterr.h
@@ -0,0 +1,37 @@
+/* Set the error indicator of a stream.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#ifndef _FSETERR_H
+#define _FSETERR_H
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Set the error indicator of the stream FP.
+ The "error indicator" is set when an I/O operation on the stream fails, and
+ is cleared (together with the "end-of-file" indicator) by clearerr (FP). */
+extern void fseterr (FILE *fp);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FSETERR_H */
diff --git a/gnulib/lib/fstatat.c b/gnulib/lib/fstatat.c
new file mode 100644
index 00000000..bd295b0c
--- /dev/null
+++ b/gnulib/lib/fstatat.c
@@ -0,0 +1,110 @@
+/* Work around an fstatat bug on Solaris 9.
+
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+#if HAVE_FSTATAT
+
+# undef fstatat
+
+/* fstatat should always follow symbolic links that end in /, but on
+ Solaris 9 it doesn't if AT_SYMLINK_NOFOLLOW is specified.
+ Likewise, trailing slash on a non-directory should be an error.
+ These are the same problems that lstat.c and stat.c address, so
+ solve it in a similar way. */
+
+int
+rpl_fstatat (int fd, char const *file, struct stat *st, int flag)
+{
+ int result = fstatat (fd, file, st, flag);
+ size_t len;
+
+ if (result != 0)
+ return result;
+ len = strlen (file);
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ {
+ /* Fix lstat behavior. */
+ if (file[len - 1] != '/' || S_ISDIR (st->st_mode))
+ return 0;
+ if (!S_ISLNK (st->st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ result = fstatat (fd, file, st, flag & ~AT_SYMLINK_NOFOLLOW);
+ }
+ /* Fix stat behavior. */
+ if (result == 0 && !S_ISDIR (st->st_mode) && file[len - 1] == '/')
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ return result;
+}
+
+#else /* !HAVE_FSTATAT */
+
+/* On mingw, the gnulib <sys/stat.h> defines `stat' as a function-like
+ macro; but using it in AT_FUNC_F2 causes compilation failure
+ because the preprocessor sees a use of a macro that requires two
+ arguments but is only given one. Hence, we need an inline
+ forwarder to get past the preprocessor. */
+static inline int
+stat_func (char const *name, struct stat *st)
+{
+ return stat (name, st);
+}
+
+/* Likewise, if there is no native `lstat', then the gnulib
+ <sys/stat.h> defined it as stat, which also needs adjustment. */
+# if !HAVE_LSTAT
+# undef lstat
+# define lstat stat_func
+# endif
+
+/* Replacement for Solaris' function by the same name.
+ <http://www.google.com/search?q=fstatat+site:docs.sun.com>
+ First, try to simulate it via l?stat ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it via save_cwd/fchdir/(stat|lstat)/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, this function works just like Solaris' fstatat. */
+
+# define AT_FUNC_NAME fstatat
+# define AT_FUNC_F1 lstat
+# define AT_FUNC_F2 stat_func
+# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+# define AT_FUNC_POST_FILE_PARAM_DECLS , struct stat *st, int flag
+# define AT_FUNC_POST_FILE_ARGS , st
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_F2
+# undef AT_FUNC_USE_F1_COND
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* !HAVE_FSTATAT */
diff --git a/gnulib/lib/fstrcmp.c b/gnulib/lib/fstrcmp.c
new file mode 100644
index 00000000..4fdbcae7
--- /dev/null
+++ b/gnulib/lib/fstrcmp.c
@@ -0,0 +1,271 @@
+/* Functions to make fuzzy comparisons between strings
+ Copyright (C) 1988-1989, 1992-1993, 1995, 2001-2003, 2006, 2008-2010 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/>.
+
+
+ Derived from GNU diff 2.7, analyze.c et al.
+
+ The basic idea is to consider two vectors as similar if, when
+ transforming the first vector into the second vector through a
+ sequence of edits (inserts and deletes of one element each),
+ this sequence is short - or equivalently, if the ordered list
+ of elements that are untouched by these edits is long. For a
+ good introduction to the subject, read about the "Levenshtein
+ distance" in Wikipedia.
+
+ The basic algorithm is described in:
+ "An O(ND) Difference Algorithm and its Variations", Eugene Myers,
+ Algorithmica Vol. 1 No. 2, 1986, pp. 251-266;
+ see especially section 4.2, which describes the variation used below.
+
+ The basic algorithm was independently discovered as described in:
+ "Algorithms for Approximate String Matching", E. Ukkonen,
+ Information and Control Vol. 64, 1985, pp. 100-118.
+
+ Unless the 'find_minimal' flag is set, this code uses the TOO_EXPENSIVE
+ heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N)
+ at the price of producing suboptimal output for large inputs with
+ many differences. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fstrcmp.h"
+
+#include <string.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "glthread/lock.h"
+#include "glthread/tls.h"
+#include "minmax.h"
+#include "xalloc.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+
+#define ELEMENT char
+#define EQUAL(x,y) ((x) == (y))
+#define OFFSET int
+#define EXTRA_CONTEXT_FIELDS \
+ /* The number of edits beyond which the computation can be aborted. */ \
+ int edit_count_limit; \
+ /* The number of edits (= number of elements inserted, plus the number of \
+ elements deleted), temporarily minus edit_count_limit. */ \
+ int edit_count;
+#define NOTE_DELETE(ctxt, xoff) ctxt->edit_count++
+#define NOTE_INSERT(ctxt, yoff) ctxt->edit_count++
+#define EARLY_ABORT(ctxt) ctxt->edit_count > 0
+/* We don't need USE_HEURISTIC, since it is unlikely in typical uses of
+ fstrcmp(). */
+#include "diffseq.h"
+
+
+/* Because fstrcmp is typically called multiple times, attempt to minimize
+ the number of memory allocations performed. Thus, let a call reuse the
+ memory already allocated by the previous call, if it is sufficient.
+ To make it multithread-safe, without need for a lock that protects the
+ already allocated memory, store the allocated memory per thread. Free
+ it only when the thread exits. */
+
+static gl_tls_key_t buffer_key; /* TLS key for a 'int *' */
+static gl_tls_key_t bufmax_key; /* TLS key for a 'size_t' */
+
+static void
+keys_init (void)
+{
+ gl_tls_key_init (buffer_key, free);
+ gl_tls_key_init (bufmax_key, NULL);
+ /* The per-thread initial values are NULL and 0, respectively. */
+}
+
+/* Ensure that keys_init is called once only. */
+gl_once_define(static, keys_init_once)
+
+
+/* In the code below, branch probabilities were measured by Ralf Wildenhues,
+ by running "msgmerge LL.po coreutils.pot" with msgmerge 0.18 for many
+ values of LL. The probability indicates that the condition evaluates
+ to true; whether that leads to a branch or a non-branch in the code,
+ depends on the compiler's reordering of basic blocks. */
+
+
+double
+fstrcmp_bounded (const char *string1, const char *string2, double lower_bound)
+{
+ struct context ctxt;
+ int xvec_length = strlen (string1);
+ int yvec_length = strlen (string2);
+ int i;
+
+ size_t fdiag_len;
+ int *buffer;
+ size_t bufmax;
+
+ /* short-circuit obvious comparisons */
+ if (xvec_length == 0 || yvec_length == 0) /* Prob: 1% */
+ return (xvec_length == 0 && yvec_length == 0 ? 1.0 : 0.0);
+
+ if (lower_bound > 0)
+ {
+ /* Compute a quick upper bound.
+ Each edit is an insertion or deletion of an element, hence modifies
+ the length of the sequence by at most 1.
+ Therefore, when starting from a sequence X and ending at a sequence Y,
+ with N edits, | yvec_length - xvec_length | <= N. (Proof by
+ induction over N.)
+ So, at the end, we will have
+ edit_count >= | xvec_length - yvec_length |.
+ and hence
+ result
+ = (xvec_length + yvec_length - edit_count)
+ / (xvec_length + yvec_length)
+ <= (xvec_length + yvec_length - | yvec_length - xvec_length |)
+ / (xvec_length + yvec_length)
+ = 2 * min (xvec_length, yvec_length) / (xvec_length + yvec_length).
+ */
+ volatile double upper_bound =
+ (double) (2 * MIN (xvec_length, yvec_length))
+ / (xvec_length + yvec_length);
+
+ if (upper_bound < lower_bound) /* Prob: 74% */
+ /* Return an arbitrary value < LOWER_BOUND. */
+ return 0.0;
+
+#if CHAR_BIT <= 8
+ /* When X and Y are both small, avoid the overhead of setting up an
+ array of size 256. */
+ if (xvec_length + yvec_length >= 20) /* Prob: 99% */
+ {
+ /* Compute a less quick upper bound.
+ Each edit is an insertion or deletion of a character, hence
+ modifies the occurrence count of a character by 1 and leaves the
+ other occurrence counts unchanged.
+ Therefore, when starting from a sequence X and ending at a
+ sequence Y, and denoting the occurrence count of C in X with
+ OCC (X, C), with N edits,
+ sum_C | OCC (X, C) - OCC (Y, C) | <= N.
+ (Proof by induction over N.)
+ So, at the end, we will have
+ edit_count >= sum_C | OCC (X, C) - OCC (Y, C) |,
+ and hence
+ result
+ = (xvec_length + yvec_length - edit_count)
+ / (xvec_length + yvec_length)
+ <= (xvec_length + yvec_length - sum_C | OCC(X,C) - OCC(Y,C) |)
+ / (xvec_length + yvec_length).
+ */
+ int occ_diff[UCHAR_MAX + 1]; /* array C -> OCC(X,C) - OCC(Y,C) */
+ int sum;
+
+ /* Determine the occurrence counts in X. */
+ memset (occ_diff, 0, sizeof (occ_diff));
+ for (i = xvec_length - 1; i >= 0; i--)
+ occ_diff[(unsigned char) string1[i]]++;
+ /* Subtract the occurrence counts in Y. */
+ for (i = yvec_length - 1; i >= 0; i--)
+ occ_diff[(unsigned char) string2[i]]--;
+ /* Sum up the absolute values. */
+ sum = 0;
+ for (i = 0; i <= UCHAR_MAX; i++)
+ {
+ int d = occ_diff[i];
+ sum += (d >= 0 ? d : -d);
+ }
+
+ upper_bound = 1.0 - (double) sum / (xvec_length + yvec_length);
+
+ if (upper_bound < lower_bound) /* Prob: 66% */
+ /* Return an arbitrary value < LOWER_BOUND. */
+ return 0.0;
+ }
+#endif
+ }
+
+ /* set the info for each string. */
+ ctxt.xvec = string1;
+ ctxt.yvec = string2;
+
+ /* Set TOO_EXPENSIVE to be approximate square root of input size,
+ bounded below by 256. */
+ ctxt.too_expensive = 1;
+ for (i = xvec_length + yvec_length;
+ i != 0;
+ i >>= 2)
+ ctxt.too_expensive <<= 1;
+ if (ctxt.too_expensive < 256)
+ ctxt.too_expensive = 256;
+
+ /* Allocate memory for fdiag and bdiag from a thread-local pool. */
+ fdiag_len = xvec_length + yvec_length + 3;
+ gl_once (keys_init_once, keys_init);
+ buffer = (int *) gl_tls_get (buffer_key);
+ bufmax = (size_t) (uintptr_t) gl_tls_get (bufmax_key);
+ if (fdiag_len > bufmax)
+ {
+ /* Need more memory. */
+ bufmax = 2 * bufmax;
+ if (fdiag_len > bufmax)
+ bufmax = fdiag_len;
+ /* Calling xrealloc would be a waste: buffer's contents does not need
+ to be preserved. */
+ if (buffer != NULL)
+ free (buffer);
+ buffer = (int *) xnmalloc (bufmax, 2 * sizeof (int));
+ gl_tls_set (buffer_key, buffer);
+ gl_tls_set (bufmax_key, (void *) (uintptr_t) bufmax);
+ }
+ ctxt.fdiag = buffer + yvec_length + 1;
+ ctxt.bdiag = ctxt.fdiag + fdiag_len;
+
+ /* The edit_count is only ever increased. The computation can be aborted
+ when
+ (xvec_length + yvec_length - edit_count) / (xvec_length + yvec_length)
+ < lower_bound,
+ or equivalently
+ edit_count > (xvec_length + yvec_length) * (1 - lower_bound)
+ or equivalently
+ edit_count > floor((xvec_length + yvec_length) * (1 - lower_bound)).
+ We need to add an epsilon inside the floor(...) argument, to neutralize
+ rounding errors. */
+ ctxt.edit_count_limit =
+ (lower_bound < 1.0
+ ? (int) ((xvec_length + yvec_length) * (1.0 - lower_bound + 0.000001))
+ : 0);
+
+ /* Now do the main comparison algorithm */
+ ctxt.edit_count = - ctxt.edit_count_limit;
+ if (compareseq (0, xvec_length, 0, yvec_length, 0, &ctxt)) /* Prob: 98% */
+ /* The edit_count passed the limit. Hence the result would be
+ < lower_bound. We can return any value < lower_bound instead. */
+ return 0.0;
+ ctxt.edit_count += ctxt.edit_count_limit;
+
+ /* The result is
+ ((number of chars in common) / (average length of the strings)).
+ The numerator is
+ = xvec_length - (number of calls to NOTE_DELETE)
+ = yvec_length - (number of calls to NOTE_INSERT)
+ = 1/2 * (xvec_length + yvec_length - (number of edits)).
+ This is admittedly biased towards finding that the strings are
+ similar, however it does produce meaningful results. */
+ return ((double) (xvec_length + yvec_length - ctxt.edit_count)
+ / (xvec_length + yvec_length));
+}
diff --git a/gnulib/lib/fstrcmp.h b/gnulib/lib/fstrcmp.h
new file mode 100644
index 00000000..343c5ee7
--- /dev/null
+++ b/gnulib/lib/fstrcmp.h
@@ -0,0 +1,45 @@
+/* Fuzzy string comparison.
+ Copyright (C) 1995, 2000, 2002-2003, 2006, 2008-2010 Free Software
+ Foundation, Inc.
+
+ This file was written by Peter Miller <pmiller@agso.gov.au>
+
+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/>. */
+
+#ifndef _FSTRCMP_H
+#define _FSTRCMP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Fuzzy compare of S1 and S2. Return a measure for the similarity of S1
+ and S1. The higher the result, the more similar the strings are.
+ The result is bounded between 0 (meaning very dissimilar strings) and
+ 1 (meaning identical strings). */
+extern double fstrcmp (const char *s1, const char *s2);
+
+/* Like fstrcmp (S1, S2), except that if the result is < LOWER_BOUND, an
+ arbitrary other value < LOWER_BOUND can be returned. */
+extern double fstrcmp_bounded (const char *s1, const char *s2,
+ double lower_bound);
+
+/* A shortcut for fstrcmp. Avoids a function call. */
+#define fstrcmp(s1,s2) fstrcmp_bounded (s1, s2, 0.0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gnulib/lib/fsusage.c b/gnulib/lib/fsusage.c
new file mode 100644
index 00000000..10db467d
--- /dev/null
+++ b/gnulib/lib/fsusage.c
@@ -0,0 +1,264 @@
+/* fsusage.c -- return space usage of mounted file systems
+
+ Copyright (C) 1991-1992, 1996, 1998-1999, 2002-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "fsusage.h"
+
+#include <limits.h>
+#include <sys/types.h>
+
+#if STAT_STATVFS /* POSIX 1003.1-2001 (and later) with XSI */
+# include <sys/statvfs.h>
+#else
+/* Don't include backward-compatibility files unless they're needed.
+ Eventually we'd like to remove all this cruft. */
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/stat.h>
+# if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# endif
+# if HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+# endif
+# if HAVE_SYS_VFS_H
+# include <sys/vfs.h>
+# endif
+# if HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */
+# include <sys/fs/s5param.h>
+# endif
+# if defined HAVE_SYS_FILSYS_H && !defined _CRAY
+# include <sys/filsys.h> /* SVR2 */
+# endif
+# if HAVE_SYS_STATFS_H
+# include <sys/statfs.h>
+# endif
+# if HAVE_DUSTAT_H /* AIX PS/2 */
+# include <sys/dustat.h>
+# endif
+# include "full-read.h"
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+/* Many space usage primitives use all 1 bits to denote a value that is
+ not applicable or unknown. Propagate this information by returning
+ a uintmax_t value that is all 1 bits if X is all 1 bits, even if X
+ is unsigned and narrower than uintmax_t. */
+#define PROPAGATE_ALL_ONES(x) \
+ ((sizeof (x) < sizeof (uintmax_t) \
+ && (~ (x) == (sizeof (x) < sizeof (int) \
+ ? - (1 << (sizeof (x) * CHAR_BIT)) \
+ : 0))) \
+ ? UINTMAX_MAX : (uintmax_t) (x))
+
+/* Extract the top bit of X as an uintmax_t value. */
+#define EXTRACT_TOP_BIT(x) ((x) \
+ & ((uintmax_t) 1 << (sizeof (x) * CHAR_BIT - 1)))
+
+/* If a value is negative, many space usage primitives store it into an
+ integer variable by assignment, even if the variable's type is unsigned.
+ So, if a space usage variable X's top bit is set, convert X to the
+ uintmax_t value V such that (- (uintmax_t) V) is the negative of
+ the original value. If X's top bit is clear, just yield X.
+ Use PROPAGATE_TOP_BIT if the original value might be negative;
+ otherwise, use PROPAGATE_ALL_ONES. */
+#define PROPAGATE_TOP_BIT(x) ((x) | ~ (EXTRACT_TOP_BIT (x) - 1))
+
+/* Fill in the fields of FSP with information about space usage for
+ the file system on which FILE resides.
+ DISK is the device on which FILE is mounted, for space-getting
+ methods that need to know it.
+ Return 0 if successful, -1 if not. When returning -1, ensure that
+ ERRNO is either a system error value, or zero if DISK is NULL
+ on a system that requires a non-NULL value. */
+int
+get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp)
+{
+#if defined STAT_STATVFS /* POSIX */
+
+ struct statvfs fsd;
+
+ if (statvfs (file, &fsd) < 0)
+ return -1;
+
+ /* f_frsize isn't guaranteed to be supported. */
+ fsp->fsu_blocksize = (fsd.f_frsize
+ ? PROPAGATE_ALL_ONES (fsd.f_frsize)
+ : PROPAGATE_ALL_ONES (fsd.f_bsize));
+
+#elif defined STAT_STATFS2_FS_DATA /* Ultrix */
+
+ struct fs_data fsd;
+
+ if (statfs (file, &fsd) != 1)
+ return -1;
+
+ fsp->fsu_blocksize = 1024;
+ fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.fd_req.btot);
+ fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.fd_req.bfree);
+ fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.fd_req.bfreen);
+ fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.fd_req.bfreen) != 0;
+ fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.fd_req.gtot);
+ fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.fd_req.gfree);
+
+#elif defined STAT_READ_FILSYS /* SVR2 */
+# ifndef SUPERBOFF
+# define SUPERBOFF (SUPERB * 512)
+# endif
+
+ struct filsys fsd;
+ int fd;
+
+ if (! disk)
+ {
+ errno = 0;
+ return -1;
+ }
+
+ fd = open (disk, O_RDONLY);
+ if (fd < 0)
+ return -1;
+ lseek (fd, (off_t) SUPERBOFF, 0);
+ if (full_read (fd, (char *) &fsd, sizeof fsd) != sizeof fsd)
+ {
+ close (fd);
+ return -1;
+ }
+ close (fd);
+
+ fsp->fsu_blocksize = (fsd.s_type == Fs2b ? 1024 : 512);
+ fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.s_fsize);
+ fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.s_tfree);
+ fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.s_tfree);
+ fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.s_tfree) != 0;
+ fsp->fsu_files = (fsd.s_isize == -1
+ ? UINTMAX_MAX
+ : (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1));
+ fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.s_tinode);
+
+#elif defined STAT_STATFS3_OSF1
+
+ struct statfs fsd;
+
+ if (statfs (file, &fsd, sizeof (struct statfs)) != 0)
+ return -1;
+
+ fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
+
+#elif defined STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */
+
+ struct statfs fsd;
+
+ if (statfs (file, &fsd) < 0)
+ return -1;
+
+ fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
+
+# ifdef STATFS_TRUNCATES_BLOCK_COUNTS
+
+ /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
+ struct statfs are truncated to 2GB. These conditions detect that
+ truncation, presumably without botching the 4.1.1 case, in which
+ the values are not truncated. The correct counts are stored in
+ undocumented spare fields. */
+ if (fsd.f_blocks == 0x7fffffff / fsd.f_bsize && fsd.f_spare[0] > 0)
+ {
+ fsd.f_blocks = fsd.f_spare[0];
+ fsd.f_bfree = fsd.f_spare[1];
+ fsd.f_bavail = fsd.f_spare[2];
+ }
+# endif /* STATFS_TRUNCATES_BLOCK_COUNTS */
+
+#elif defined STAT_STATFS2_FSIZE /* 4.4BSD */
+
+ struct statfs fsd;
+
+ if (statfs (file, &fsd) < 0)
+ return -1;
+
+ fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
+
+#elif defined STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */
+
+# if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN
+# define f_bavail f_bfree
+# endif
+
+ struct statfs fsd;
+
+ if (statfs (file, &fsd, sizeof fsd, 0) < 0)
+ return -1;
+
+ /* Empirically, the block counts on most SVR3 and SVR3-derived
+ systems seem to always be in terms of 512-byte blocks,
+ no matter what value f_bsize has. */
+# if _AIX || defined _CRAY
+ fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
+# else
+ fsp->fsu_blocksize = 512;
+# endif
+
+#endif
+
+#if (defined STAT_STATVFS \
+ || (!defined STAT_STATFS2_FS_DATA && !defined STAT_READ_FILSYS))
+
+ fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.f_blocks);
+ fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.f_bfree);
+ fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.f_bavail);
+ fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.f_bavail) != 0;
+ fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.f_files);
+ fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.f_ffree);
+
+#endif
+
+ (void) disk; /* avoid argument-unused warning */
+ return 0;
+}
+
+#if defined _AIX && defined _I386
+/* AIX PS/2 does not supply statfs. */
+
+int
+statfs (char *file, struct statfs *fsb)
+{
+ struct stat stats;
+ struct dustat fsd;
+
+ if (stat (file, &stats) != 0)
+ return -1;
+ if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd)))
+ return -1;
+ fsb->f_type = 0;
+ fsb->f_bsize = fsd.du_bsize;
+ fsb->f_blocks = fsd.du_fsize - fsd.du_isize;
+ fsb->f_bfree = fsd.du_tfree;
+ fsb->f_bavail = fsd.du_tfree;
+ fsb->f_files = (fsd.du_isize - 2) * fsd.du_inopb;
+ fsb->f_ffree = fsd.du_tinode;
+ fsb->f_fsid.val[0] = fsd.du_site;
+ fsb->f_fsid.val[1] = fsd.du_pckno;
+ return 0;
+}
+
+#endif /* _AIX && _I386 */
diff --git a/gnulib/lib/fsusage.h b/gnulib/lib/fsusage.h
new file mode 100644
index 00000000..bb2d86f1
--- /dev/null
+++ b/gnulib/lib/fsusage.h
@@ -0,0 +1,40 @@
+/* fsusage.h -- declarations for file system space usage info
+
+ Copyright (C) 1991-1992, 1997, 2003-2006, 2009-2010 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/>. */
+
+/* Space usage statistics for a file system. Blocks are 512-byte. */
+
+#if !defined FSUSAGE_H_
+# define FSUSAGE_H_
+
+# include <stdint.h>
+# include <stdbool.h>
+
+struct fs_usage
+{
+ uintmax_t fsu_blocksize; /* Size of a block. */
+ uintmax_t fsu_blocks; /* Total blocks. */
+ uintmax_t fsu_bfree; /* Free blocks available to superuser. */
+ uintmax_t fsu_bavail; /* Free blocks available to non-superuser. */
+ bool fsu_bavail_top_bit_set; /* 1 if fsu_bavail represents a value < 0. */
+ uintmax_t fsu_files; /* Total file nodes. */
+ uintmax_t fsu_ffree; /* Free file nodes. */
+};
+
+int get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp);
+
+#endif
diff --git a/gnulib/lib/fsync.c b/gnulib/lib/fsync.c
new file mode 100644
index 00000000..9ecf2571
--- /dev/null
+++ b/gnulib/lib/fsync.c
@@ -0,0 +1,78 @@
+/* Emulate fsync on platforms that lack it, primarily Windows and
+ cross-compilers like MinGW.
+
+ This is derived from sqlite3 sources.
+ http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/os_win.c
+ http://www.sqlite.org/copyright.html
+
+ Written by Richard W.M. Jones <rjones.at.redhat.com>
+
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* _get_osfhandle */
+#include <io.h>
+
+/* FlushFileBuffers */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include <errno.h>
+
+int
+fsync (int fd)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD err;
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (!FlushFileBuffers (h))
+ {
+ /* Translate some Windows errors into rough approximations of Unix
+ * errors. MSDN is useless as usual - in this case it doesn't
+ * document the full range of errors.
+ */
+ err = GetLastError ();
+ switch (err)
+ {
+ /* eg. Trying to fsync a tty. */
+ case ERROR_INVALID_HANDLE:
+ errno = EINVAL;
+ break;
+
+ default:
+ errno = EIO;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+
+#else /* !Windows */
+
+#error "This platform lacks fsync function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+#endif /* !Windows */
diff --git a/gnulib/lib/ftell.c b/gnulib/lib/ftell.c
new file mode 100644
index 00000000..2bcc97ed
--- /dev/null
+++ b/gnulib/lib/ftell.c
@@ -0,0 +1,38 @@
+/* An ftell() function that works around platform bugs.
+ Copyright (C) 2007, 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+/* Get off_t. */
+#include <unistd.h>
+
+long
+ftell (FILE *fp)
+{
+ /* Use the replacement ftello function with all its workarounds. */
+ off_t offset = ftello (fp);
+ if (offset == (long)offset)
+ return (long)offset;
+ else
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+}
diff --git a/gnulib/lib/ftello.c b/gnulib/lib/ftello.c
new file mode 100644
index 00000000..70cd3592
--- /dev/null
+++ b/gnulib/lib/ftello.c
@@ -0,0 +1,54 @@
+/* An ftello() function that works around platform bugs.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get lseek. */
+#include <unistd.h>
+
+#undef ftello
+#if !HAVE_FTELLO
+# undef ftell
+# define ftello ftell
+#endif
+
+off_t
+rpl_ftello (FILE *fp)
+{
+#if LSEEK_PIPE_BROKEN
+ /* mingw gives bogus answers rather than failure on non-seekable files. */
+ if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
+ return -1;
+#endif
+
+#if defined __SL64 && defined __SCLE /* Cygwin */
+ if ((fp->_flags & __SL64) == 0)
+ {
+ /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
+ mode; but has an ftello that requires 64-bit mode. */
+ FILE *tmp = fopen ("/dev/null", "r");
+ if (!tmp)
+ return -1;
+ fp->_flags |= __SL64;
+ fp->_seek64 = tmp->_seek64;
+ fclose (tmp);
+ }
+#endif
+ return ftello (fp);
+}
diff --git a/gnulib/lib/ftruncate.c b/gnulib/lib/ftruncate.c
new file mode 100644
index 00000000..33b69d81
--- /dev/null
+++ b/gnulib/lib/ftruncate.c
@@ -0,0 +1,90 @@
+/* ftruncate emulations that work on some System V's.
+ This file is in the public domain. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifdef F_CHSIZE
+
+int
+ftruncate (int fd, off_t length)
+{
+ return fcntl (fd, F_CHSIZE, length);
+}
+
+#else /* not F_CHSIZE */
+# ifdef F_FREESP
+
+/* By William Kucharski <kucharsk@netcom.com>. */
+
+# include <sys/stat.h>
+# include <errno.h>
+
+int
+ftruncate (int fd, off_t length)
+{
+ struct flock fl;
+ struct stat filebuf;
+
+ if (fstat (fd, &filebuf) < 0)
+ return -1;
+
+ if (filebuf.st_size < length)
+ {
+ /* Extend file length. */
+ if (lseek (fd, (length - 1), SEEK_SET) < 0)
+ return -1;
+
+ /* Write a "0" byte. */
+ if (write (fd, "", 1) != 1)
+ return -1;
+ }
+ else
+ {
+
+ /* Truncate length. */
+
+ fl.l_whence = 0;
+ fl.l_len = 0;
+ fl.l_start = length;
+ fl.l_type = F_WRLCK; /* write lock on file space */
+
+ /* This relies on the *undocumented* F_FREESP argument to fcntl,
+ which truncates the file so that it ends at the position
+ indicated by fl.l_start. Will minor miracles never cease? */
+
+ if (fcntl (fd, F_FREESP, &fl) < 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+# else /* not F_CHSIZE nor F_FREESP */
+# if HAVE_CHSIZE /* native Windows, e.g. mingw */
+
+int
+ftruncate (int fd, off_t length)
+{
+ return chsize (fd, length);
+}
+
+# else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */
+
+# include <errno.h>
+
+int
+ftruncate (int fd, off_t length)
+{
+ errno = EIO;
+ return -1;
+}
+
+# endif /* not HAVE_CHSIZE */
+# endif /* not F_FREESP */
+#endif /* not F_CHSIZE */
diff --git a/gnulib/lib/fts-cycle.c b/gnulib/lib/fts-cycle.c
new file mode 100644
index 00000000..dc038cfa
--- /dev/null
+++ b/gnulib/lib/fts-cycle.c
@@ -0,0 +1,160 @@
+/* Detect cycles in file tree walks.
+
+ Copyright (C) 2003-2006, 2009-2010 Free Software Foundation, Inc.
+
+ Written by Jim Meyering.
+
+ 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/>. */
+
+#include "cycle-check.h"
+#include "hash.h"
+
+/* Use each of these to map a device/inode pair to an FTSENT. */
+struct Active_dir
+{
+ dev_t dev;
+ ino_t ino;
+ FTSENT *fts_ent;
+};
+
+static bool
+AD_compare (void const *x, void const *y)
+{
+ struct Active_dir const *ax = x;
+ struct Active_dir const *ay = y;
+ return ax->ino == ay->ino
+ && ax->dev == ay->dev;
+}
+
+static size_t
+AD_hash (void const *x, size_t table_size)
+{
+ struct Active_dir const *ax = x;
+ return (uintmax_t) ax->ino % table_size;
+}
+
+/* Set up the cycle-detection machinery. */
+
+static bool
+setup_dir (FTS *fts)
+{
+ if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
+ {
+ enum { HT_INITIAL_SIZE = 31 };
+ fts->fts_cycle.ht = hash_initialize (HT_INITIAL_SIZE, NULL, AD_hash,
+ AD_compare, free);
+ if (! fts->fts_cycle.ht)
+ return false;
+ }
+ else
+ {
+ fts->fts_cycle.state = malloc (sizeof *fts->fts_cycle.state);
+ if (! fts->fts_cycle.state)
+ return false;
+ cycle_check_init (fts->fts_cycle.state);
+ }
+
+ return true;
+}
+
+/* Enter a directory during a file tree walk. */
+
+static bool
+enter_dir (FTS *fts, FTSENT *ent)
+{
+ if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
+ {
+ struct stat const *st = ent->fts_statp;
+ struct Active_dir *ad = malloc (sizeof *ad);
+ struct Active_dir *ad_from_table;
+
+ if (!ad)
+ return false;
+
+ ad->dev = st->st_dev;
+ ad->ino = st->st_ino;
+ ad->fts_ent = ent;
+
+ /* See if we've already encountered this directory.
+ This can happen when following symlinks as well as
+ with a corrupted directory hierarchy. */
+ ad_from_table = hash_insert (fts->fts_cycle.ht, ad);
+
+ if (ad_from_table != ad)
+ {
+ free (ad);
+ if (!ad_from_table)
+ return false;
+
+ /* There was an entry with matching dev/inode already in the table.
+ Record the fact that we've found a cycle. */
+ ent->fts_cycle = ad_from_table->fts_ent;
+ ent->fts_info = FTS_DC;
+ }
+ }
+ else
+ {
+ if (cycle_check (fts->fts_cycle.state, ent->fts_statp))
+ {
+ /* FIXME: setting fts_cycle like this isn't proper.
+ To do what the documentation requires, we'd have to
+ go around the cycle again and find the right entry.
+ But no callers in coreutils use the fts_cycle member. */
+ ent->fts_cycle = ent;
+ ent->fts_info = FTS_DC;
+ }
+ }
+
+ return true;
+}
+
+/* Leave a directory during a file tree walk. */
+
+static void
+leave_dir (FTS *fts, FTSENT *ent)
+{
+ struct stat const *st = ent->fts_statp;
+ if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
+ {
+ struct Active_dir obj;
+ void *found;
+ obj.dev = st->st_dev;
+ obj.ino = st->st_ino;
+ found = hash_delete (fts->fts_cycle.ht, &obj);
+ if (!found)
+ abort ();
+ free (found);
+ }
+ else
+ {
+ FTSENT *parent = ent->fts_parent;
+ if (parent != NULL && 0 <= parent->fts_level)
+ CYCLE_CHECK_REFLECT_CHDIR_UP (fts->fts_cycle.state,
+ *(parent->fts_statp), *st);
+ }
+}
+
+/* Free any memory used for cycle detection. */
+
+static void
+free_dir (FTS *sp)
+{
+ if (sp->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
+ {
+ if (sp->fts_cycle.ht)
+ hash_free (sp->fts_cycle.ht);
+ }
+ else
+ free (sp->fts_cycle.state);
+}
diff --git a/gnulib/lib/fts.c b/gnulib/lib/fts.c
new file mode 100644
index 00000000..374c58ad
--- /dev/null
+++ b/gnulib/lib/fts.c
@@ -0,0 +1,2038 @@
+/* Traverse a file hierarchy.
+
+ Copyright (C) 2004-2010 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/>. */
+
+/*-
+ * Copyright (c) 1990, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94";
+#endif /* LIBC_SCCS and not lint */
+
+#include "fts_.h"
+
+#if HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+#ifdef _LIBC
+# include <include/sys/stat.h>
+#else
+# include <sys/stat.h>
+#endif
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if ! _LIBC
+# include "fcntl--.h"
+# include "dirent--.h"
+# include "unistd--.h"
+/* FIXME - use fcntl(F_DUPFD_CLOEXEC)/openat(O_CLOEXEC) once they are
+ supported. */
+# include "cloexec.h"
+# include "openat.h"
+# include "same-inode.h"
+#endif
+
+#include <dirent.h>
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dirent) strlen ((dirent)->d_name)
+#endif
+
+#if HAVE_STRUCT_DIRENT_D_TYPE
+/* True if the type of the directory entry D is known. */
+# define DT_IS_KNOWN(d) ((d)->d_type != DT_UNKNOWN)
+/* True if the type of the directory entry D must be T. */
+# define DT_MUST_BE(d, t) ((d)->d_type == (t))
+# define D_TYPE(d) ((d)->d_type)
+#else
+# define DT_IS_KNOWN(d) false
+# define DT_MUST_BE(d, t) false
+# define D_TYPE(d) DT_UNKNOWN
+
+# undef DT_UNKNOWN
+# define DT_UNKNOWN 0
+
+/* Any nonzero values will do here, so long as they're distinct.
+ Undef any existing macros out of the way. */
+# undef DT_BLK
+# undef DT_CHR
+# undef DT_DIR
+# undef DT_FIFO
+# undef DT_LNK
+# undef DT_REG
+# undef DT_SOCK
+# define DT_BLK 1
+# define DT_CHR 2
+# define DT_DIR 3
+# define DT_FIFO 4
+# define DT_LNK 5
+# define DT_REG 6
+# define DT_SOCK 7
+#endif
+
+#ifndef S_IFLNK
+# define S_IFLNK 0
+#endif
+#ifndef S_IFSOCK
+# define S_IFSOCK 0
+#endif
+
+enum
+{
+ NOT_AN_INODE_NUMBER = 0
+};
+
+#ifdef D_INO_IN_DIRENT
+# define D_INO(dp) (dp)->d_ino
+#else
+/* Some systems don't have inodes, so fake them to avoid lots of ifdefs. */
+# define D_INO(dp) NOT_AN_INODE_NUMBER
+#endif
+
+/* If there are more than this many entries in a directory,
+ and the conditions mentioned below are satisfied, then sort
+ the entries on inode number before any further processing. */
+#ifndef FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD
+# define FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD 10000
+#endif
+enum
+{
+ _FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD = FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD
+};
+
+enum Fts_stat
+{
+ FTS_NO_STAT_REQUIRED = 1,
+ FTS_STAT_REQUIRED = 2
+};
+
+#ifdef _LIBC
+# undef close
+# define close __close
+# undef closedir
+# define closedir __closedir
+# undef fchdir
+# define fchdir __fchdir
+# undef open
+# define open __open
+# undef opendir
+# define opendir __opendir
+# undef readdir
+# define readdir __readdir
+#else
+# undef internal_function
+# define internal_function /* empty */
+#endif
+
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+/* If this host provides the openat function, then we can avoid
+ attempting to open "." in some initialization code below. */
+#ifdef HAVE_OPENAT
+# define HAVE_OPENAT_SUPPORT 1
+#else
+# define HAVE_OPENAT_SUPPORT 0
+#endif
+
+#ifdef NDEBUG
+# define fts_assert(expr) ((void) 0)
+#else
+# define fts_assert(expr) \
+ do \
+ { \
+ if (!(expr)) \
+ abort (); \
+ } \
+ while (false)
+#endif
+
+static FTSENT *fts_alloc (FTS *, const char *, size_t) internal_function;
+static FTSENT *fts_build (FTS *, int) internal_function;
+static void fts_lfree (FTSENT *) internal_function;
+static void fts_load (FTS *, FTSENT *) internal_function;
+static size_t fts_maxarglen (char * const *) internal_function;
+static void fts_padjust (FTS *, FTSENT *) internal_function;
+static bool fts_palloc (FTS *, size_t) internal_function;
+static FTSENT *fts_sort (FTS *, FTSENT *, size_t) internal_function;
+static unsigned short int fts_stat (FTS *, FTSENT *, bool) internal_function;
+static int fts_safe_changedir (FTS *, FTSENT *, int, const char *)
+ internal_function;
+
+#if GNULIB_FTS
+# include "fts-cycle.c"
+#else
+static bool enter_dir (FTS *fts, FTSENT *ent) { return true; }
+static void leave_dir (FTS *fts, FTSENT *ent) {}
+static bool setup_dir (FTS *fts) { return true; }
+static void free_dir (FTS *fts) {}
+#endif
+
+#ifndef MAX
+# define MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+#define CLR(opt) (sp->fts_options &= ~(opt))
+#define ISSET(opt) (sp->fts_options & (opt))
+#define SET(opt) (sp->fts_options |= (opt))
+
+/* FIXME: make this a function */
+#define RESTORE_INITIAL_CWD(sp) \
+ (fd_ring_clear (&((sp)->fts_fd_ring)), \
+ FCHDIR ((sp), (ISSET (FTS_CWDFD) ? AT_FDCWD : (sp)->fts_rfd)))
+
+/* FIXME: FTS_NOCHDIR is now misnamed.
+ Call it FTS_USE_FULL_RELATIVE_FILE_NAMES instead. */
+#define FCHDIR(sp, fd) \
+ (!ISSET(FTS_NOCHDIR) && (ISSET(FTS_CWDFD) \
+ ? (cwd_advance_fd ((sp), (fd), true), 0) \
+ : fchdir (fd)))
+
+
+/* fts_build flags */
+/* FIXME: make this an enum */
+#define BCHILD 1 /* fts_children */
+#define BNAMES 2 /* fts_children, names only */
+#define BREAD 3 /* fts_read */
+
+#if FTS_DEBUG
+# include <inttypes.h>
+# include <stdint.h>
+# include <stdio.h>
+# include "getcwdat.h"
+bool fts_debug = false;
+# define Dprintf(x) do { if (fts_debug) printf x; } while (false)
+#else
+# define Dprintf(x)
+# define fd_ring_check(x)
+# define fd_ring_print(a, b, c)
+#endif
+
+#define LEAVE_DIR(Fts, Ent, Tag) \
+ do \
+ { \
+ Dprintf ((" %s-leaving: %s\n", Tag, (Ent)->fts_path)); \
+ leave_dir (Fts, Ent); \
+ fd_ring_check (Fts); \
+ } \
+ while (false)
+
+static void
+fd_ring_clear (I_ring *fd_ring)
+{
+ while ( ! i_ring_empty (fd_ring))
+ {
+ int fd = i_ring_pop (fd_ring);
+ if (0 <= fd)
+ close (fd);
+ }
+}
+
+/* Overload the fts_statp->st_size member (otherwise unused, when
+ fts_info is FTS_NSOK) to indicate whether fts_read should stat
+ this entry or not. */
+static void
+fts_set_stat_required (FTSENT *p, bool required)
+{
+ fts_assert (p->fts_info == FTS_NSOK);
+ p->fts_statp->st_size = (required
+ ? FTS_STAT_REQUIRED
+ : FTS_NO_STAT_REQUIRED);
+}
+
+/* file-descriptor-relative opendir. */
+/* FIXME: if others need this function, move it into lib/openat.c */
+static inline DIR *
+internal_function
+opendirat (int fd, char const *dir)
+{
+ int new_fd = openat (fd, dir,
+ O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
+ DIR *dirp;
+
+ if (new_fd < 0)
+ return NULL;
+ set_cloexec_flag (new_fd, true);
+ dirp = fdopendir (new_fd);
+ if (dirp == NULL)
+ {
+ int saved_errno = errno;
+ close (new_fd);
+ errno = saved_errno;
+ }
+ return dirp;
+}
+
+/* Virtual fchdir. Advance SP's working directory file descriptor,
+ SP->fts_cwd_fd, to FD, and push the previous value onto the fd_ring.
+ CHDIR_DOWN_ONE is true if FD corresponds to an entry in the directory
+ open on sp->fts_cwd_fd; i.e., to move the working directory one level
+ down. */
+static void
+internal_function
+cwd_advance_fd (FTS *sp, int fd, bool chdir_down_one)
+{
+ int old = sp->fts_cwd_fd;
+ fts_assert (old != fd || old == AT_FDCWD);
+
+ if (chdir_down_one)
+ {
+ /* Push "old" onto the ring.
+ If the displaced file descriptor is non-negative, close it. */
+ int prev_fd_in_slot = i_ring_push (&sp->fts_fd_ring, old);
+ fd_ring_print (sp, stderr, "post-push");
+ if (0 <= prev_fd_in_slot)
+ close (prev_fd_in_slot); /* ignore any close failure */
+ }
+ else if ( ! ISSET (FTS_NOCHDIR))
+ {
+ if (0 <= old)
+ close (old); /* ignore any close failure */
+ }
+
+ sp->fts_cwd_fd = fd;
+}
+
+/* Open the directory DIR if possible, and return a file
+ descriptor. Return -1 and set errno on failure. It doesn't matter
+ whether the file descriptor has read or write access. */
+
+static inline int
+internal_function
+diropen (FTS const *sp, char const *dir)
+{
+ int open_flags = (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
+ | (ISSET (FTS_PHYSICAL) ? O_NOFOLLOW : 0));
+
+ int fd = (ISSET (FTS_CWDFD)
+ ? openat (sp->fts_cwd_fd, dir, open_flags)
+ : open (dir, open_flags));
+ if (0 <= fd)
+ set_cloexec_flag (fd, true);
+ return fd;
+}
+
+FTS *
+fts_open (char * const *argv,
+ register int options,
+ int (*compar) (FTSENT const **, FTSENT const **))
+{
+ register FTS *sp;
+ register FTSENT *p, *root;
+ register size_t nitems;
+ FTSENT *parent = NULL;
+ FTSENT *tmp = NULL; /* pacify gcc */
+ bool defer_stat;
+
+ /* Options check. */
+ if (options & ~FTS_OPTIONMASK) {
+ __set_errno (EINVAL);
+ return (NULL);
+ }
+ if ((options & FTS_NOCHDIR) && (options & FTS_CWDFD)) {
+ __set_errno (EINVAL);
+ return (NULL);
+ }
+ if ( ! (options & (FTS_LOGICAL | FTS_PHYSICAL))) {
+ __set_errno (EINVAL);
+ return (NULL);
+ }
+
+ /* Allocate/initialize the stream */
+ if ((sp = malloc(sizeof(FTS))) == NULL)
+ return (NULL);
+ memset(sp, 0, sizeof(FTS));
+ sp->fts_compar = compar;
+ sp->fts_options = options;
+
+ /* Logical walks turn on NOCHDIR; symbolic links are too hard. */
+ if (ISSET(FTS_LOGICAL)) {
+ SET(FTS_NOCHDIR);
+ CLR(FTS_CWDFD);
+ }
+
+ /* Initialize fts_cwd_fd. */
+ sp->fts_cwd_fd = AT_FDCWD;
+ if ( ISSET(FTS_CWDFD) && ! HAVE_OPENAT_SUPPORT)
+ {
+ /* While it isn't technically necessary to open "." this
+ early, doing it here saves us the trouble of ensuring
+ later (where it'd be messier) that "." can in fact
+ be opened. If not, revert to FTS_NOCHDIR mode. */
+ int fd = open (".", O_RDONLY);
+ if (fd < 0)
+ {
+ /* Even if `.' is unreadable, don't revert to FTS_NOCHDIR mode
+ on systems like Linux+PROC_FS, where our openat emulation
+ is good enough. Note: on a system that emulates
+ openat via /proc, this technique can still fail, but
+ only in extreme conditions, e.g., when the working
+ directory cannot be saved (i.e. save_cwd fails) --
+ and that happens on Linux only when "." is unreadable
+ and the CWD would be longer than PATH_MAX.
+ FIXME: once Linux kernel openat support is well established,
+ replace the above open call and this entire if/else block
+ with the body of the if-block below. */
+ if ( openat_needs_fchdir ())
+ {
+ SET(FTS_NOCHDIR);
+ CLR(FTS_CWDFD);
+ }
+ }
+ else
+ {
+ close (fd);
+ }
+ }
+
+ /*
+ * Start out with 1K of file name space, and enough, in any case,
+ * to hold the user's file names.
+ */
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+ {
+ size_t maxarglen = fts_maxarglen(argv);
+ if (! fts_palloc(sp, MAX(maxarglen, MAXPATHLEN)))
+ goto mem1;
+ }
+
+ /* Allocate/initialize root's parent. */
+ if (*argv != NULL) {
+ if ((parent = fts_alloc(sp, "", 0)) == NULL)
+ goto mem2;
+ parent->fts_level = FTS_ROOTPARENTLEVEL;
+ }
+
+ /* The classic fts implementation would call fts_stat with
+ a new entry for each iteration of the loop below.
+ If the comparison function is not specified or if the
+ FTS_DEFER_STAT option is in effect, don't stat any entry
+ in this loop. This is an attempt to minimize the interval
+ between the initial stat/lstat/fstatat and the point at which
+ a directory argument is first opened. This matters for any
+ directory command line argument that resides on a file system
+ without genuine i-nodes. If you specify FTS_DEFER_STAT along
+ with a comparison function, that function must not access any
+ data via the fts_statp pointer. */
+ defer_stat = (compar == NULL || ISSET(FTS_DEFER_STAT));
+
+ /* Allocate/initialize root(s). */
+ for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) {
+ /* *Do* allow zero-length file names. */
+ size_t len = strlen(*argv);
+ if ((p = fts_alloc(sp, *argv, len)) == NULL)
+ goto mem3;
+ p->fts_level = FTS_ROOTLEVEL;
+ p->fts_parent = parent;
+ p->fts_accpath = p->fts_name;
+ /* Even when defer_stat is true, be sure to stat the first
+ command line argument, since fts_read (at least with
+ FTS_XDEV) requires that. */
+ if (defer_stat && root != NULL) {
+ p->fts_info = FTS_NSOK;
+ fts_set_stat_required(p, true);
+ } else {
+ p->fts_info = fts_stat(sp, p, false);
+ }
+
+ /*
+ * If comparison routine supplied, traverse in sorted
+ * order; otherwise traverse in the order specified.
+ */
+ if (compar) {
+ p->fts_link = root;
+ root = p;
+ } else {
+ p->fts_link = NULL;
+ if (root == NULL)
+ tmp = root = p;
+ else {
+ tmp->fts_link = p;
+ tmp = p;
+ }
+ }
+ }
+ if (compar && nitems > 1)
+ root = fts_sort(sp, root, nitems);
+
+ /*
+ * Allocate a dummy pointer and make fts_read think that we've just
+ * finished the node before the root(s); set p->fts_info to FTS_INIT
+ * so that everything about the "current" node is ignored.
+ */
+ if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL)
+ goto mem3;
+ sp->fts_cur->fts_link = root;
+ sp->fts_cur->fts_info = FTS_INIT;
+ if (! setup_dir (sp))
+ goto mem3;
+
+ /*
+ * If using chdir(2), grab a file descriptor pointing to dot to ensure
+ * that we can get back here; this could be avoided for some file names,
+ * but almost certainly not worth the effort. Slashes, symbolic links,
+ * and ".." are all fairly nasty problems. Note, if we can't get the
+ * descriptor we run anyway, just more slowly.
+ */
+ if (!ISSET(FTS_NOCHDIR) && !ISSET(FTS_CWDFD)
+ && (sp->fts_rfd = diropen (sp, ".")) < 0)
+ SET(FTS_NOCHDIR);
+
+ i_ring_init (&sp->fts_fd_ring, -1);
+ return (sp);
+
+mem3: fts_lfree(root);
+ free(parent);
+mem2: free(sp->fts_path);
+mem1: free(sp);
+ return (NULL);
+}
+
+static void
+internal_function
+fts_load (FTS *sp, register FTSENT *p)
+{
+ register size_t len;
+ register char *cp;
+
+ /*
+ * Load the stream structure for the next traversal. Since we don't
+ * actually enter the directory until after the preorder visit, set
+ * the fts_accpath field specially so the chdir gets done to the right
+ * place and the user can access the first node. From fts_open it's
+ * known that the file name will fit.
+ */
+ len = p->fts_pathlen = p->fts_namelen;
+ memmove(sp->fts_path, p->fts_name, len + 1);
+ if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) {
+ len = strlen(++cp);
+ memmove(p->fts_name, cp, len + 1);
+ p->fts_namelen = len;
+ }
+ p->fts_accpath = p->fts_path = sp->fts_path;
+}
+
+int
+fts_close (FTS *sp)
+{
+ register FTSENT *freep, *p;
+ int saved_errno = 0;
+
+ /*
+ * This still works if we haven't read anything -- the dummy structure
+ * points to the root list, so we step through to the end of the root
+ * list which has a valid parent pointer.
+ */
+ if (sp->fts_cur) {
+ for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) {
+ freep = p;
+ p = p->fts_link != NULL ? p->fts_link : p->fts_parent;
+ free(freep);
+ }
+ free(p);
+ }
+
+ /* Free up child linked list, sort array, file name buffer. */
+ if (sp->fts_child)
+ fts_lfree(sp->fts_child);
+ free(sp->fts_array);
+ free(sp->fts_path);
+
+ if (ISSET(FTS_CWDFD))
+ {
+ if (0 <= sp->fts_cwd_fd)
+ if (close (sp->fts_cwd_fd))
+ saved_errno = errno;
+ }
+ else if (!ISSET(FTS_NOCHDIR))
+ {
+ /* Return to original directory, save errno if necessary. */
+ if (fchdir(sp->fts_rfd))
+ saved_errno = errno;
+
+ /* If close fails, record errno only if saved_errno is zero,
+ so that we report the probably-more-meaningful fchdir errno. */
+ if (close (sp->fts_rfd))
+ if (saved_errno == 0)
+ saved_errno = errno;
+ }
+
+ fd_ring_clear (&sp->fts_fd_ring);
+
+#if GNULIB_FTS
+ if (sp->fts_leaf_optimization_works_ht)
+ hash_free (sp->fts_leaf_optimization_works_ht);
+#endif
+
+ free_dir (sp);
+
+ /* Free up the stream pointer. */
+ free(sp);
+
+ /* Set errno and return. */
+ if (saved_errno) {
+ __set_errno (saved_errno);
+ return (-1);
+ }
+
+ return (0);
+}
+
+#if defined __linux__ \
+ && HAVE_SYS_VFS_H && HAVE_FSTATFS && HAVE_STRUCT_STATFS_F_TYPE
+
+#include <sys/vfs.h>
+
+/* Linux-specific constants from coreutils' src/fs.h */
+# define S_MAGIC_TMPFS 0x1021994
+# define S_MAGIC_NFS 0x6969
+# define S_MAGIC_REISERFS 0x52654973
+# define S_MAGIC_PROC 0x9FA0
+
+/* Return false if it is easy to determine the file system type of
+ the directory on which DIR_FD is open, and sorting dirents on
+ inode numbers is known not to improve traversal performance with
+ that type of file system. Otherwise, return true. */
+static bool
+dirent_inode_sort_may_be_useful (int dir_fd)
+{
+ /* Skip the sort only if we can determine efficiently
+ that skipping it is the right thing to do.
+ The cost of performing an unnecessary sort is negligible,
+ while the cost of *not* performing it can be O(N^2) with
+ a very large constant. */
+ struct statfs fs_buf;
+
+ /* If fstatfs fails, assume sorting would be useful. */
+ if (fstatfs (dir_fd, &fs_buf) != 0)
+ return true;
+
+ /* FIXME: what about when f_type is not an integral type?
+ deal with that if/when it's encountered. */
+ switch (fs_buf.f_type)
+ {
+ case S_MAGIC_TMPFS:
+ case S_MAGIC_NFS:
+ /* On a file system of any of these types, sorting
+ is unnecessary, and hence wasteful. */
+ return false;
+
+ default:
+ return true;
+ }
+}
+
+/* Given a file descriptor DIR_FD open on a directory D,
+ return true if it is valid to apply the leaf-optimization
+ technique of counting directories in D via stat.st_nlink. */
+static bool
+leaf_optimization_applies (int dir_fd)
+{
+ struct statfs fs_buf;
+
+ /* If fstatfs fails, assume we can't use the optimization. */
+ if (fstatfs (dir_fd, &fs_buf) != 0)
+ return false;
+
+ /* FIXME: do we need to detect AFS mount points? I doubt it,
+ unless fstatfs can report S_MAGIC_REISERFS for such a directory. */
+
+ switch (fs_buf.f_type)
+ {
+ /* List here the file system types that lack useable dirent.d_type
+ info, yet for which the optimization does apply. */
+ case S_MAGIC_REISERFS:
+ return true;
+
+ case S_MAGIC_PROC:
+ /* Explicitly listing this or any other file system type for which
+ the optimization is not applicable is not necessary, but we leave
+ it here to document the risk. Per http://bugs.debian.org/143111,
+ /proc may have bogus stat.st_nlink values. */
+ /* fall through */
+ default:
+ return false;
+ }
+}
+
+#else
+static bool
+dirent_inode_sort_may_be_useful (int dir_fd _GL_UNUSED) { return true; }
+static bool
+leaf_optimization_applies (int dir_fd _GL_UNUSED) { return false; }
+#endif
+
+#if GNULIB_FTS
+/* link-count-optimization entry:
+ map an stat.st_dev number to a boolean: leaf_optimization_works */
+struct LCO_ent
+{
+ dev_t st_dev;
+ bool opt_ok;
+};
+
+/* Use a tiny initial size. If a traversal encounters more than
+ a few devices, the cost of growing/rehashing this table will be
+ rendered negligible by the number of inodes processed. */
+enum { LCO_HT_INITIAL_SIZE = 13 };
+
+static size_t
+LCO_hash (void const *x, size_t table_size)
+{
+ struct LCO_ent const *ax = x;
+ return (uintmax_t) ax->st_dev % table_size;
+}
+
+static bool
+LCO_compare (void const *x, void const *y)
+{
+ struct LCO_ent const *ax = x;
+ struct LCO_ent const *ay = y;
+ return ax->st_dev == ay->st_dev;
+}
+
+/* Ask the same question as leaf_optimization_applies, but query
+ the cache first (FTS.fts_leaf_optimization_works_ht), and if necessary,
+ update that cache. */
+static bool
+link_count_optimize_ok (FTSENT const *p)
+{
+ FTS *sp = p->fts_fts;
+ Hash_table *h = sp->fts_leaf_optimization_works_ht;
+ struct LCO_ent tmp;
+ struct LCO_ent *ent;
+ bool opt_ok;
+ struct LCO_ent *t2;
+
+ /* If we're not in CWDFD mode, don't bother with this optimization,
+ since the caller is not serious about performance. */
+ if (!ISSET(FTS_CWDFD))
+ return false;
+
+ /* map st_dev to the boolean, leaf_optimization_works */
+ if (h == NULL)
+ {
+ h = sp->fts_leaf_optimization_works_ht
+ = hash_initialize (LCO_HT_INITIAL_SIZE, NULL, LCO_hash,
+ LCO_compare, free);
+ if (h == NULL)
+ return false;
+ }
+ tmp.st_dev = p->fts_statp->st_dev;
+ ent = hash_lookup (h, &tmp);
+ if (ent)
+ return ent->opt_ok;
+
+ /* Look-up failed. Query directly and cache the result. */
+ t2 = malloc (sizeof *t2);
+ if (t2 == NULL)
+ return false;
+
+ /* Is it ok to perform the optimization in the dir, FTS_CWD_FD? */
+ opt_ok = leaf_optimization_applies (sp->fts_cwd_fd);
+ t2->opt_ok = opt_ok;
+ t2->st_dev = p->fts_statp->st_dev;
+
+ ent = hash_insert (h, t2);
+ if (ent == NULL)
+ {
+ /* insertion failed */
+ free (t2);
+ return false;
+ }
+ fts_assert (ent == t2);
+
+ return opt_ok;
+}
+#endif
+
+/*
+ * Special case of "/" at the end of the file name so that slashes aren't
+ * appended which would cause file names to be written as "....//foo".
+ */
+#define NAPPEND(p) \
+ (p->fts_path[p->fts_pathlen - 1] == '/' \
+ ? p->fts_pathlen - 1 : p->fts_pathlen)
+
+FTSENT *
+fts_read (register FTS *sp)
+{
+ register FTSENT *p, *tmp;
+ register unsigned short int instr;
+ register char *t;
+
+ /* If finished or unrecoverable error, return NULL. */
+ if (sp->fts_cur == NULL || ISSET(FTS_STOP))
+ return (NULL);
+
+ /* Set current node pointer. */
+ p = sp->fts_cur;
+
+ /* Save and zero out user instructions. */
+ instr = p->fts_instr;
+ p->fts_instr = FTS_NOINSTR;
+
+ /* Any type of file may be re-visited; re-stat and re-turn. */
+ if (instr == FTS_AGAIN) {
+ p->fts_info = fts_stat(sp, p, false);
+ return (p);
+ }
+ Dprintf (("fts_read: p=%s\n",
+ p->fts_info == FTS_INIT ? "" : p->fts_path));
+
+ /*
+ * Following a symlink -- SLNONE test allows application to see
+ * SLNONE and recover. If indirecting through a symlink, have
+ * keep a pointer to current location. If unable to get that
+ * pointer, follow fails.
+ */
+ if (instr == FTS_FOLLOW &&
+ (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
+ p->fts_info = fts_stat(sp, p, true);
+ if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
+ if ((p->fts_symfd = diropen (sp, ".")) < 0) {
+ p->fts_errno = errno;
+ p->fts_info = FTS_ERR;
+ } else
+ p->fts_flags |= FTS_SYMFOLLOW;
+ }
+ goto check_for_dir;
+ }
+
+ /* Directory in pre-order. */
+ if (p->fts_info == FTS_D) {
+ /* If skipped or crossed mount point, do post-order visit. */
+ if (instr == FTS_SKIP ||
+ (ISSET(FTS_XDEV) && p->fts_statp->st_dev != sp->fts_dev)) {
+ if (p->fts_flags & FTS_SYMFOLLOW)
+ (void)close(p->fts_symfd);
+ if (sp->fts_child) {
+ fts_lfree(sp->fts_child);
+ sp->fts_child = NULL;
+ }
+ p->fts_info = FTS_DP;
+ LEAVE_DIR (sp, p, "1");
+ return (p);
+ }
+
+ /* Rebuild if only read the names and now traversing. */
+ if (sp->fts_child != NULL && ISSET(FTS_NAMEONLY)) {
+ CLR(FTS_NAMEONLY);
+ fts_lfree(sp->fts_child);
+ sp->fts_child = NULL;
+ }
+
+ /*
+ * Cd to the subdirectory.
+ *
+ * If have already read and now fail to chdir, whack the list
+ * to make the names come out right, and set the parent errno
+ * so the application will eventually get an error condition.
+ * Set the FTS_DONTCHDIR flag so that when we logically change
+ * directories back to the parent we don't do a chdir.
+ *
+ * If haven't read do so. If the read fails, fts_build sets
+ * FTS_STOP or the fts_info field of the node.
+ */
+ if (sp->fts_child != NULL) {
+ if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) {
+ p->fts_errno = errno;
+ p->fts_flags |= FTS_DONTCHDIR;
+ for (p = sp->fts_child; p != NULL;
+ p = p->fts_link)
+ p->fts_accpath =
+ p->fts_parent->fts_accpath;
+ }
+ } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) {
+ if (ISSET(FTS_STOP))
+ return (NULL);
+ /* If fts_build's call to fts_safe_changedir failed
+ because it was not able to fchdir into a
+ subdirectory, tell the caller. */
+ if (p->fts_errno && p->fts_info != FTS_DNR)
+ p->fts_info = FTS_ERR;
+ LEAVE_DIR (sp, p, "2");
+ return (p);
+ }
+ p = sp->fts_child;
+ sp->fts_child = NULL;
+ goto name;
+ }
+
+ /* Move to the next node on this level. */
+next: tmp = p;
+ if ((p = p->fts_link) != NULL) {
+ sp->fts_cur = p;
+ free(tmp);
+
+ /*
+ * If reached the top, return to the original directory (or
+ * the root of the tree), and load the file names for the next
+ * root.
+ */
+ if (p->fts_level == FTS_ROOTLEVEL) {
+ if (RESTORE_INITIAL_CWD(sp)) {
+ SET(FTS_STOP);
+ return (NULL);
+ }
+ free_dir(sp);
+ fts_load(sp, p);
+ setup_dir(sp);
+ goto check_for_dir;
+ }
+
+ /*
+ * User may have called fts_set on the node. If skipped,
+ * ignore. If followed, get a file descriptor so we can
+ * get back if necessary.
+ */
+ if (p->fts_instr == FTS_SKIP)
+ goto next;
+ if (p->fts_instr == FTS_FOLLOW) {
+ p->fts_info = fts_stat(sp, p, true);
+ if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
+ if ((p->fts_symfd = diropen (sp, ".")) < 0) {
+ p->fts_errno = errno;
+ p->fts_info = FTS_ERR;
+ } else
+ p->fts_flags |= FTS_SYMFOLLOW;
+ }
+ p->fts_instr = FTS_NOINSTR;
+ }
+
+name: t = sp->fts_path + NAPPEND(p->fts_parent);
+ *t++ = '/';
+ memmove(t, p->fts_name, p->fts_namelen + 1);
+check_for_dir:
+ sp->fts_cur = p;
+ if (p->fts_info == FTS_NSOK)
+ {
+ if (p->fts_statp->st_size == FTS_STAT_REQUIRED)
+ {
+ FTSENT *parent = p->fts_parent;
+ if (FTS_ROOTLEVEL < p->fts_level
+ /* ->fts_n_dirs_remaining is not valid
+ for command-line-specified names. */
+ && parent->fts_n_dirs_remaining == 0
+ && ISSET(FTS_NOSTAT)
+ && ISSET(FTS_PHYSICAL)
+ && link_count_optimize_ok (parent))
+ {
+ /* nothing more needed */
+ }
+ else
+ {
+ p->fts_info = fts_stat(sp, p, false);
+ if (S_ISDIR(p->fts_statp->st_mode)
+ && p->fts_level != FTS_ROOTLEVEL
+ && parent->fts_n_dirs_remaining)
+ parent->fts_n_dirs_remaining--;
+ }
+ }
+ else
+ fts_assert (p->fts_statp->st_size == FTS_NO_STAT_REQUIRED);
+ }
+
+ if (p->fts_info == FTS_D)
+ {
+ /* Now that P->fts_statp is guaranteed to be valid,
+ if this is a command-line directory, record its
+ device number, to be used for FTS_XDEV. */
+ if (p->fts_level == FTS_ROOTLEVEL)
+ sp->fts_dev = p->fts_statp->st_dev;
+ Dprintf ((" entering: %s\n", p->fts_path));
+ if (! enter_dir (sp, p))
+ {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+ }
+ return p;
+ }
+
+ /* Move up to the parent node. */
+ p = tmp->fts_parent;
+ sp->fts_cur = p;
+ free(tmp);
+
+ if (p->fts_level == FTS_ROOTPARENTLEVEL) {
+ /*
+ * Done; free everything up and set errno to 0 so the user
+ * can distinguish between error and EOF.
+ */
+ free(p);
+ __set_errno (0);
+ return (sp->fts_cur = NULL);
+ }
+
+ fts_assert (p->fts_info != FTS_NSOK);
+
+ /* NUL terminate the file name. */
+ sp->fts_path[p->fts_pathlen] = '\0';
+
+ /*
+ * Return to the parent directory. If at a root node, restore
+ * the initial working directory. If we came through a symlink,
+ * go back through the file descriptor. Otherwise, move up
+ * one level, via "..".
+ */
+ if (p->fts_level == FTS_ROOTLEVEL) {
+ if (RESTORE_INITIAL_CWD(sp)) {
+ p->fts_errno = errno;
+ SET(FTS_STOP);
+ }
+ } else if (p->fts_flags & FTS_SYMFOLLOW) {
+ if (FCHDIR(sp, p->fts_symfd)) {
+ int saved_errno = errno;
+ (void)close(p->fts_symfd);
+ __set_errno (saved_errno);
+ p->fts_errno = errno;
+ SET(FTS_STOP);
+ }
+ (void)close(p->fts_symfd);
+ } else if (!(p->fts_flags & FTS_DONTCHDIR) &&
+ fts_safe_changedir(sp, p->fts_parent, -1, "..")) {
+ p->fts_errno = errno;
+ SET(FTS_STOP);
+ }
+ p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
+ if (p->fts_errno == 0)
+ LEAVE_DIR (sp, p, "3");
+ return ISSET(FTS_STOP) ? NULL : p;
+}
+
+/*
+ * Fts_set takes the stream as an argument although it's not used in this
+ * implementation; it would be necessary if anyone wanted to add global
+ * semantics to fts using fts_set. An error return is allowed for similar
+ * reasons.
+ */
+/* ARGSUSED */
+int
+fts_set(FTS *sp _GL_UNUSED, FTSENT *p, int instr)
+{
+ if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
+ instr != FTS_NOINSTR && instr != FTS_SKIP) {
+ __set_errno (EINVAL);
+ return (1);
+ }
+ p->fts_instr = instr;
+ return (0);
+}
+
+FTSENT *
+fts_children (register FTS *sp, int instr)
+{
+ register FTSENT *p;
+ int fd;
+
+ if (instr != 0 && instr != FTS_NAMEONLY) {
+ __set_errno (EINVAL);
+ return (NULL);
+ }
+
+ /* Set current node pointer. */
+ p = sp->fts_cur;
+
+ /*
+ * Errno set to 0 so user can distinguish empty directory from
+ * an error.
+ */
+ __set_errno (0);
+
+ /* Fatal errors stop here. */
+ if (ISSET(FTS_STOP))
+ return (NULL);
+
+ /* Return logical hierarchy of user's arguments. */
+ if (p->fts_info == FTS_INIT)
+ return (p->fts_link);
+
+ /*
+ * If not a directory being visited in pre-order, stop here. Could
+ * allow FTS_DNR, assuming the user has fixed the problem, but the
+ * same effect is available with FTS_AGAIN.
+ */
+ if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */)
+ return (NULL);
+
+ /* Free up any previous child list. */
+ if (sp->fts_child != NULL)
+ fts_lfree(sp->fts_child);
+
+ if (instr == FTS_NAMEONLY) {
+ SET(FTS_NAMEONLY);
+ instr = BNAMES;
+ } else
+ instr = BCHILD;
+
+ /*
+ * If using chdir on a relative file name and called BEFORE fts_read
+ * does its chdir to the root of a traversal, we can lose -- we need to
+ * chdir into the subdirectory, and we don't know where the current
+ * directory is, so we can't get back so that the upcoming chdir by
+ * fts_read will work.
+ */
+ if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' ||
+ ISSET(FTS_NOCHDIR))
+ return (sp->fts_child = fts_build(sp, instr));
+
+ if ((fd = diropen (sp, ".")) < 0)
+ return (sp->fts_child = NULL);
+ sp->fts_child = fts_build(sp, instr);
+ if (ISSET(FTS_CWDFD))
+ {
+ cwd_advance_fd (sp, fd, true);
+ }
+ else
+ {
+ if (fchdir(fd))
+ {
+ int saved_errno = errno;
+ close (fd);
+ __set_errno (saved_errno);
+ return NULL;
+ }
+ close (fd);
+ }
+ return (sp->fts_child);
+}
+
+/* A comparison function to sort on increasing inode number.
+ For some file system types, sorting either way makes a huge
+ performance difference for a directory with very many entries,
+ but sorting on increasing values is slightly better than sorting
+ on decreasing values. The difference is in the 5% range. */
+static int
+fts_compare_ino (struct _ftsent const **a, struct _ftsent const **b)
+{
+ return (a[0]->fts_statp->st_ino < b[0]->fts_statp->st_ino ? -1
+ : b[0]->fts_statp->st_ino < a[0]->fts_statp->st_ino ? 1 : 0);
+}
+
+/* Map the dirent.d_type value, DTYPE, to the corresponding stat.st_mode
+ S_IF* bit and set ST.st_mode, thus clearing all other bits in that field. */
+static void
+set_stat_type (struct stat *st, unsigned int dtype)
+{
+ mode_t type;
+ switch (dtype)
+ {
+ case DT_BLK:
+ type = S_IFBLK;
+ break;
+ case DT_CHR:
+ type = S_IFCHR;
+ break;
+ case DT_DIR:
+ type = S_IFDIR;
+ break;
+ case DT_FIFO:
+ type = S_IFIFO;
+ break;
+ case DT_LNK:
+ type = S_IFLNK;
+ break;
+ case DT_REG:
+ type = S_IFREG;
+ break;
+ case DT_SOCK:
+ type = S_IFSOCK;
+ break;
+ default:
+ type = 0;
+ }
+ st->st_mode = type;
+}
+
+/*
+ * This is the tricky part -- do not casually change *anything* in here. The
+ * idea is to build the linked list of entries that are used by fts_children
+ * and fts_read. There are lots of special cases.
+ *
+ * The real slowdown in walking the tree is the stat calls. If FTS_NOSTAT is
+ * set and it's a physical walk (so that symbolic links can't be directories),
+ * we can do things quickly. First, if it's a 4.4BSD file system, the type
+ * of the file is in the directory entry. Otherwise, we assume that the number
+ * of subdirectories in a node is equal to the number of links to the parent.
+ * The former skips all stat calls. The latter skips stat calls in any leaf
+ * directories and for any files after the subdirectories in the directory have
+ * been found, cutting the stat calls by about 2/3.
+ */
+static FTSENT *
+internal_function
+fts_build (register FTS *sp, int type)
+{
+ register struct dirent *dp;
+ register FTSENT *p, *head;
+ register size_t nitems;
+ FTSENT *cur, *tail;
+ DIR *dirp;
+ void *oldaddr;
+ int saved_errno;
+ bool descend;
+ bool doadjust;
+ ptrdiff_t level;
+ nlink_t nlinks;
+ bool nostat;
+ size_t len, maxlen, new_len;
+ char *cp;
+
+ /* Set current node pointer. */
+ cur = sp->fts_cur;
+
+ /*
+ * Open the directory for reading. If this fails, we're done.
+ * If being called from fts_read, set the fts_info field.
+ */
+#if defined FTS_WHITEOUT && 0
+ if (ISSET(FTS_WHITEOUT))
+ oflag = DTF_NODUP|DTF_REWIND;
+ else
+ oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND;
+#else
+# define __opendir2(file, flag) \
+ ( ! ISSET(FTS_NOCHDIR) && ISSET(FTS_CWDFD) \
+ ? opendirat(sp->fts_cwd_fd, file) \
+ : opendir(file))
+#endif
+ if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) {
+ if (type == BREAD) {
+ cur->fts_info = FTS_DNR;
+ cur->fts_errno = errno;
+ }
+ return (NULL);
+ }
+ /* Rather than calling fts_stat for each and every entry encountered
+ in the readdir loop (below), stat each directory only right after
+ opening it. */
+ if (cur->fts_info == FTS_NSOK)
+ cur->fts_info = fts_stat(sp, cur, false);
+ else if (sp->fts_options & FTS_TIGHT_CYCLE_CHECK) {
+ /* Now read the stat info again after opening a directory to
+ * reveal eventual changes caused by a submount triggered by
+ * the traversal. But do it only for utilities which use
+ * FTS_TIGHT_CYCLE_CHECK. Therefore, only find and du
+ * benefit/suffer from this feature for now.
+ */
+ LEAVE_DIR (sp, cur, "4");
+ fts_stat (sp, cur, false);
+ if (! enter_dir (sp, cur)) {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+ }
+
+ /*
+ * Nlinks is the number of possible entries of type directory in the
+ * directory if we're cheating on stat calls, 0 if we're not doing
+ * any stat calls at all, (nlink_t) -1 if we're statting everything.
+ */
+ if (type == BNAMES) {
+ nlinks = 0;
+ /* Be quiet about nostat, GCC. */
+ nostat = false;
+ } else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) {
+ nlinks = (cur->fts_statp->st_nlink
+ - (ISSET(FTS_SEEDOT) ? 0 : 2));
+ nostat = true;
+ } else {
+ nlinks = -1;
+ nostat = false;
+ }
+
+ /*
+ * If we're going to need to stat anything or we want to descend
+ * and stay in the directory, chdir. If this fails we keep going,
+ * but set a flag so we don't chdir after the post-order visit.
+ * We won't be able to stat anything, but we can still return the
+ * names themselves. Note, that since fts_read won't be able to
+ * chdir into the directory, it will have to return different file
+ * names than before, i.e. "a/b" instead of "b". Since the node
+ * has already been visited in pre-order, have to wait until the
+ * post-order visit to return the error. There is a special case
+ * here, if there was nothing to stat then it's not an error to
+ * not be able to stat. This is all fairly nasty. If a program
+ * needed sorted entries or stat information, they had better be
+ * checking FTS_NS on the returned nodes.
+ */
+ if (nlinks || type == BREAD) {
+ int dir_fd = dirfd(dirp);
+ if (ISSET(FTS_CWDFD) && 0 <= dir_fd)
+ {
+ dir_fd = dup (dir_fd);
+ set_cloexec_flag (dir_fd, true);
+ }
+ if (dir_fd < 0 || fts_safe_changedir(sp, cur, dir_fd, NULL)) {
+ if (nlinks && type == BREAD)
+ cur->fts_errno = errno;
+ cur->fts_flags |= FTS_DONTCHDIR;
+ descend = false;
+ closedir(dirp);
+ if (ISSET(FTS_CWDFD) && 0 <= dir_fd)
+ close (dir_fd);
+ dirp = NULL;
+ } else
+ descend = true;
+ } else
+ descend = false;
+
+ /*
+ * Figure out the max file name length that can be stored in the
+ * current buffer -- the inner loop allocates more space as necessary.
+ * We really wouldn't have to do the maxlen calculations here, we
+ * could do them in fts_read before returning the name, but it's a
+ * lot easier here since the length is part of the dirent structure.
+ *
+ * If not changing directories set a pointer so that can just append
+ * each new component into the file name.
+ */
+ len = NAPPEND(cur);
+ if (ISSET(FTS_NOCHDIR)) {
+ cp = sp->fts_path + len;
+ *cp++ = '/';
+ } else {
+ /* GCC, you're too verbose. */
+ cp = NULL;
+ }
+ len++;
+ maxlen = sp->fts_pathlen - len;
+
+ level = cur->fts_level + 1;
+
+ /* Read the directory, attaching each entry to the `link' pointer. */
+ doadjust = false;
+ for (head = tail = NULL, nitems = 0; dirp && (dp = readdir(dirp));) {
+ bool is_dir;
+
+ if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name))
+ continue;
+
+ if ((p = fts_alloc (sp, dp->d_name,
+ _D_EXACT_NAMLEN (dp))) == NULL)
+ goto mem1;
+ if (_D_EXACT_NAMLEN (dp) >= maxlen) {
+ /* include space for NUL */
+ oldaddr = sp->fts_path;
+ if (! fts_palloc(sp, _D_EXACT_NAMLEN (dp) + len + 1)) {
+ /*
+ * No more memory. Save
+ * errno, free up the current structure and the
+ * structures already allocated.
+ */
+mem1: saved_errno = errno;
+ free(p);
+ fts_lfree(head);
+ closedir(dirp);
+ cur->fts_info = FTS_ERR;
+ SET(FTS_STOP);
+ __set_errno (saved_errno);
+ return (NULL);
+ }
+ /* Did realloc() change the pointer? */
+ if (oldaddr != sp->fts_path) {
+ doadjust = true;
+ if (ISSET(FTS_NOCHDIR))
+ cp = sp->fts_path + len;
+ }
+ maxlen = sp->fts_pathlen - len;
+ }
+
+ new_len = len + _D_EXACT_NAMLEN (dp);
+ if (new_len < len) {
+ /*
+ * In the unlikely event that we would end up
+ * with a file name longer than SIZE_MAX, free up
+ * the current structure and the structures already
+ * allocated, then error out with ENAMETOOLONG.
+ */
+ free(p);
+ fts_lfree(head);
+ closedir(dirp);
+ cur->fts_info = FTS_ERR;
+ SET(FTS_STOP);
+ __set_errno (ENAMETOOLONG);
+ return (NULL);
+ }
+ p->fts_level = level;
+ p->fts_parent = sp->fts_cur;
+ p->fts_pathlen = new_len;
+
+#if defined FTS_WHITEOUT && 0
+ if (dp->d_type == DT_WHT)
+ p->fts_flags |= FTS_ISW;
+#endif
+ /* Store dirent.d_ino, in case we need to sort
+ entries before processing them. */
+ p->fts_statp->st_ino = D_INO (dp);
+
+ /* Build a file name for fts_stat to stat. */
+ if (ISSET(FTS_NOCHDIR)) {
+ p->fts_accpath = p->fts_path;
+ memmove(cp, p->fts_name, p->fts_namelen + 1);
+ } else
+ p->fts_accpath = p->fts_name;
+
+ if (sp->fts_compar == NULL || ISSET(FTS_DEFER_STAT)) {
+ /* Record what fts_read will have to do with this
+ entry. In many cases, it will simply fts_stat it,
+ but we can take advantage of any d_type information
+ to optimize away the unnecessary stat calls. I.e.,
+ if FTS_NOSTAT is in effect and we're not following
+ symlinks (FTS_PHYSICAL) and d_type indicates this
+ is *not* a directory, then we won't have to stat it
+ at all. If it *is* a directory, then (currently)
+ we stat it regardless, in order to get device and
+ inode numbers. Some day we might optimize that
+ away, too, for directories where d_ino is known to
+ be valid. */
+ bool skip_stat = (ISSET(FTS_PHYSICAL)
+ && ISSET(FTS_NOSTAT)
+ && DT_IS_KNOWN(dp)
+ && ! DT_MUST_BE(dp, DT_DIR));
+ p->fts_info = FTS_NSOK;
+ /* Propagate dirent.d_type information back
+ to caller, when possible. */
+ set_stat_type (p->fts_statp, D_TYPE (dp));
+ fts_set_stat_required(p, !skip_stat);
+ is_dir = (ISSET(FTS_PHYSICAL)
+ && DT_MUST_BE(dp, DT_DIR));
+ } else {
+ p->fts_info = fts_stat(sp, p, false);
+ is_dir = (p->fts_info == FTS_D
+ || p->fts_info == FTS_DC
+ || p->fts_info == FTS_DOT);
+ }
+
+ /* Decrement link count if applicable. */
+ if (nlinks > 0 && is_dir)
+ nlinks -= nostat;
+
+ /* We walk in directory order so "ls -f" doesn't get upset. */
+ p->fts_link = NULL;
+ if (head == NULL)
+ head = tail = p;
+ else {
+ tail->fts_link = p;
+ tail = p;
+ }
+ ++nitems;
+ }
+ if (dirp)
+ closedir(dirp);
+
+ /*
+ * If realloc() changed the address of the file name, adjust the
+ * addresses for the rest of the tree and the dir list.
+ */
+ if (doadjust)
+ fts_padjust(sp, head);
+
+ /*
+ * If not changing directories, reset the file name back to original
+ * state.
+ */
+ if (ISSET(FTS_NOCHDIR)) {
+ if (len == sp->fts_pathlen || nitems == 0)
+ --cp;
+ *cp = '\0';
+ }
+
+ /*
+ * If descended after called from fts_children or after called from
+ * fts_read and nothing found, get back. At the root level we use
+ * the saved fd; if one of fts_open()'s arguments is a relative name
+ * to an empty directory, we wind up here with no other way back. If
+ * can't get back, we're done.
+ */
+ if (descend && (type == BCHILD || !nitems) &&
+ (cur->fts_level == FTS_ROOTLEVEL
+ ? RESTORE_INITIAL_CWD(sp)
+ : fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) {
+ cur->fts_info = FTS_ERR;
+ SET(FTS_STOP);
+ fts_lfree(head);
+ return (NULL);
+ }
+
+ /* If didn't find anything, return NULL. */
+ if (!nitems) {
+ if (type == BREAD)
+ cur->fts_info = FTS_DP;
+ fts_lfree(head);
+ return (NULL);
+ }
+
+ /* If there are many entries, no sorting function has been specified,
+ and this file system is of a type that may be slow with a large
+ number of entries, then sort the directory entries on increasing
+ inode numbers. */
+ if (nitems > _FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD
+ && !sp->fts_compar
+ && ISSET (FTS_CWDFD)
+ && dirent_inode_sort_may_be_useful (sp->fts_cwd_fd)) {
+ sp->fts_compar = fts_compare_ino;
+ head = fts_sort (sp, head, nitems);
+ sp->fts_compar = NULL;
+ }
+
+ /* Sort the entries. */
+ if (sp->fts_compar && nitems > 1)
+ head = fts_sort(sp, head, nitems);
+ return (head);
+}
+
+#if FTS_DEBUG
+
+/* Walk ->fts_parent links starting at E_CURR, until the root of the
+ current hierarchy. There should be a directory with dev/inode
+ matching those of AD. If not, print a lot of diagnostics. */
+static void
+find_matching_ancestor (FTSENT const *e_curr, struct Active_dir const *ad)
+{
+ FTSENT const *ent;
+ for (ent = e_curr; ent->fts_level >= FTS_ROOTLEVEL; ent = ent->fts_parent)
+ {
+ if (ad->ino == ent->fts_statp->st_ino
+ && ad->dev == ent->fts_statp->st_dev)
+ return;
+ }
+ printf ("ERROR: tree dir, %s, not active\n", ad->fts_ent->fts_accpath);
+ printf ("active dirs:\n");
+ for (ent = e_curr;
+ ent->fts_level >= FTS_ROOTLEVEL; ent = ent->fts_parent)
+ printf (" %s(%"PRIuMAX"/%"PRIuMAX") to %s(%"PRIuMAX"/%"PRIuMAX")...\n",
+ ad->fts_ent->fts_accpath,
+ (uintmax_t) ad->dev,
+ (uintmax_t) ad->ino,
+ ent->fts_accpath,
+ (uintmax_t) ent->fts_statp->st_dev,
+ (uintmax_t) ent->fts_statp->st_ino);
+}
+
+void
+fts_cross_check (FTS const *sp)
+{
+ FTSENT const *ent = sp->fts_cur;
+ FTSENT const *t;
+ if ( ! ISSET (FTS_TIGHT_CYCLE_CHECK))
+ return;
+
+ Dprintf (("fts-cross-check cur=%s\n", ent->fts_path));
+ /* Make sure every parent dir is in the tree. */
+ for (t = ent->fts_parent; t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
+ {
+ struct Active_dir ad;
+ ad.ino = t->fts_statp->st_ino;
+ ad.dev = t->fts_statp->st_dev;
+ if ( ! hash_lookup (sp->fts_cycle.ht, &ad))
+ printf ("ERROR: active dir, %s, not in tree\n", t->fts_path);
+ }
+
+ /* Make sure every dir in the tree is an active dir.
+ But ENT is not necessarily a directory. If so, just skip this part. */
+ if (ent->fts_parent->fts_level >= FTS_ROOTLEVEL
+ && (ent->fts_info == FTS_DP
+ || ent->fts_info == FTS_D))
+ {
+ struct Active_dir *ad;
+ for (ad = hash_get_first (sp->fts_cycle.ht); ad != NULL;
+ ad = hash_get_next (sp->fts_cycle.ht, ad))
+ {
+ find_matching_ancestor (ent, ad);
+ }
+ }
+}
+
+static bool
+same_fd (int fd1, int fd2)
+{
+ struct stat sb1, sb2;
+ return (fstat (fd1, &sb1) == 0
+ && fstat (fd2, &sb2) == 0
+ && SAME_INODE (sb1, sb2));
+}
+
+static void
+fd_ring_print (FTS const *sp, FILE *stream, char const *msg)
+{
+ I_ring const *fd_ring = &sp->fts_fd_ring;
+ unsigned int i = fd_ring->fts_front;
+ char *cwd = getcwdat (sp->fts_cwd_fd, NULL, 0);
+ fprintf (stream, "=== %s ========== %s\n", msg, cwd);
+ free (cwd);
+ if (i_ring_empty (fd_ring))
+ return;
+
+ while (true)
+ {
+ int fd = fd_ring->fts_fd_ring[i];
+ if (fd < 0)
+ fprintf (stream, "%d: %d:\n", i, fd);
+ else
+ {
+ char *wd = getcwdat (fd, NULL, 0);
+ fprintf (stream, "%d: %d: %s\n", i, fd, wd);
+ free (wd);
+ }
+ if (i == fd_ring->fts_back)
+ break;
+ i = (i + I_RING_SIZE - 1) % I_RING_SIZE;
+ }
+}
+
+/* Ensure that each file descriptor on the fd_ring matches a
+ parent, grandparent, etc. of the current working directory. */
+static void
+fd_ring_check (FTS const *sp)
+{
+ if (!fts_debug)
+ return;
+
+ /* Make a writable copy. */
+ I_ring fd_w = sp->fts_fd_ring;
+
+ int cwd_fd = sp->fts_cwd_fd;
+ cwd_fd = dup (cwd_fd);
+ char *dot = getcwdat (cwd_fd, NULL, 0);
+ error (0, 0, "===== check ===== cwd: %s", dot);
+ free (dot);
+ while ( ! i_ring_empty (&fd_w))
+ {
+ int fd = i_ring_pop (&fd_w);
+ if (0 <= fd)
+ {
+ int parent_fd = openat (cwd_fd, "..", O_RDONLY);
+ if (parent_fd < 0)
+ {
+ // Warn?
+ break;
+ }
+ if (!same_fd (fd, parent_fd))
+ {
+ char *cwd = getcwdat (fd, NULL, 0);
+ error (0, errno, "ring : %s", cwd);
+ char *c2 = getcwdat (parent_fd, NULL, 0);
+ error (0, errno, "parent: %s", c2);
+ free (cwd);
+ free (c2);
+ fts_assert (0);
+ }
+ close (cwd_fd);
+ cwd_fd = parent_fd;
+ }
+ }
+ close (cwd_fd);
+}
+#endif
+
+static unsigned short int
+internal_function
+fts_stat(FTS *sp, register FTSENT *p, bool follow)
+{
+ struct stat *sbp = p->fts_statp;
+ int saved_errno;
+
+ if (p->fts_level == FTS_ROOTLEVEL && ISSET(FTS_COMFOLLOW))
+ follow = true;
+
+#if defined FTS_WHITEOUT && 0
+ /* check for whiteout */
+ if (p->fts_flags & FTS_ISW) {
+ memset(sbp, '\0', sizeof (*sbp));
+ sbp->st_mode = S_IFWHT;
+ return (FTS_W);
+ }
+#endif
+
+ /*
+ * If doing a logical walk, or application requested FTS_FOLLOW, do
+ * a stat(2). If that fails, check for a non-existent symlink. If
+ * fail, set the errno from the stat call.
+ */
+ if (ISSET(FTS_LOGICAL) || follow) {
+ if (stat(p->fts_accpath, sbp)) {
+ saved_errno = errno;
+ if (errno == ENOENT
+ && lstat(p->fts_accpath, sbp) == 0) {
+ __set_errno (0);
+ return (FTS_SLNONE);
+ }
+ p->fts_errno = saved_errno;
+ goto err;
+ }
+ } else if (fstatat(sp->fts_cwd_fd, p->fts_accpath, sbp,
+ AT_SYMLINK_NOFOLLOW)) {
+ p->fts_errno = errno;
+err: memset(sbp, 0, sizeof(struct stat));
+ return (FTS_NS);
+ }
+
+ if (S_ISDIR(sbp->st_mode)) {
+ p->fts_n_dirs_remaining = (sbp->st_nlink
+ - (ISSET(FTS_SEEDOT) ? 0 : 2));
+ if (ISDOT(p->fts_name)) {
+ /* Command-line "." and ".." are real directories. */
+ return (p->fts_level == FTS_ROOTLEVEL ? FTS_D : FTS_DOT);
+ }
+
+#if !GNULIB_FTS
+ {
+ /*
+ * Cycle detection is done by brute force when the directory
+ * is first encountered. If the tree gets deep enough or the
+ * number of symbolic links to directories is high enough,
+ * something faster might be worthwhile.
+ */
+ FTSENT *t;
+
+ for (t = p->fts_parent;
+ t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
+ if (sbp->st_ino == t->fts_statp->st_ino
+ && sbp->st_dev == t->fts_statp->st_dev)
+ {
+ p->fts_cycle = t;
+ return (FTS_DC);
+ }
+ }
+#endif
+
+ return (FTS_D);
+ }
+ if (S_ISLNK(sbp->st_mode))
+ return (FTS_SL);
+ if (S_ISREG(sbp->st_mode))
+ return (FTS_F);
+ return (FTS_DEFAULT);
+}
+
+static int
+fts_compar (void const *a, void const *b)
+{
+ /* Convert A and B to the correct types, to pacify the compiler, and
+ for portability to bizarre hosts where "void const *" and "FTSENT
+ const **" differ in runtime representation. The comparison
+ function cannot modify *a and *b, but there is no compile-time
+ check for this. */
+ FTSENT const **pa = (FTSENT const **) a;
+ FTSENT const **pb = (FTSENT const **) b;
+ return pa[0]->fts_fts->fts_compar (pa, pb);
+}
+
+static FTSENT *
+internal_function
+fts_sort (FTS *sp, FTSENT *head, register size_t nitems)
+{
+ register FTSENT **ap, *p;
+
+ /* On most modern hosts, void * and FTSENT ** have the same
+ run-time representation, and one can convert sp->fts_compar to
+ the type qsort expects without problem. Use the heuristic that
+ this is OK if the two pointer types are the same size, and if
+ converting FTSENT ** to long int is the same as converting
+ FTSENT ** to void * and then to long int. This heuristic isn't
+ valid in general but we don't know of any counterexamples. */
+ FTSENT *dummy;
+ int (*compare) (void const *, void const *) =
+ ((sizeof &dummy == sizeof (void *)
+ && (long int) &dummy == (long int) (void *) &dummy)
+ ? (int (*) (void const *, void const *)) sp->fts_compar
+ : fts_compar);
+
+ /*
+ * Construct an array of pointers to the structures and call qsort(3).
+ * Reassemble the array in the order returned by qsort. If unable to
+ * sort for memory reasons, return the directory entries in their
+ * current order. Allocate enough space for the current needs plus
+ * 40 so don't realloc one entry at a time.
+ */
+ if (nitems > sp->fts_nitems) {
+ FTSENT **a;
+
+ sp->fts_nitems = nitems + 40;
+ if (SIZE_MAX / sizeof *a < sp->fts_nitems
+ || ! (a = realloc (sp->fts_array,
+ sp->fts_nitems * sizeof *a))) {
+ free(sp->fts_array);
+ sp->fts_array = NULL;
+ sp->fts_nitems = 0;
+ return (head);
+ }
+ sp->fts_array = a;
+ }
+ for (ap = sp->fts_array, p = head; p; p = p->fts_link)
+ *ap++ = p;
+ qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), compare);
+ for (head = *(ap = sp->fts_array); --nitems; ++ap)
+ ap[0]->fts_link = ap[1];
+ ap[0]->fts_link = NULL;
+ return (head);
+}
+
+static FTSENT *
+internal_function
+fts_alloc (FTS *sp, const char *name, register size_t namelen)
+{
+ register FTSENT *p;
+ size_t len;
+
+ /*
+ * The file name is a variable length array. Allocate the FTSENT
+ * structure and the file name in one chunk.
+ */
+ len = sizeof(FTSENT) + namelen;
+ if ((p = malloc(len)) == NULL)
+ return (NULL);
+
+ /* Copy the name and guarantee NUL termination. */
+ memmove(p->fts_name, name, namelen);
+ p->fts_name[namelen] = '\0';
+
+ p->fts_namelen = namelen;
+ p->fts_fts = sp;
+ p->fts_path = sp->fts_path;
+ p->fts_errno = 0;
+ p->fts_flags = 0;
+ p->fts_instr = FTS_NOINSTR;
+ p->fts_number = 0;
+ p->fts_pointer = NULL;
+ return (p);
+}
+
+static void
+internal_function
+fts_lfree (register FTSENT *head)
+{
+ register FTSENT *p;
+
+ /* Free a linked list of structures. */
+ while ((p = head)) {
+ head = head->fts_link;
+ free(p);
+ }
+}
+
+/*
+ * Allow essentially unlimited file name lengths; find, rm, ls should
+ * all work on any tree. Most systems will allow creation of file
+ * names much longer than MAXPATHLEN, even though the kernel won't
+ * resolve them. Add the size (not just what's needed) plus 256 bytes
+ * so don't realloc the file name 2 bytes at a time.
+ */
+static bool
+internal_function
+fts_palloc (FTS *sp, size_t more)
+{
+ char *p;
+ size_t new_len = sp->fts_pathlen + more + 256;
+
+ /*
+ * See if fts_pathlen would overflow.
+ */
+ if (new_len < sp->fts_pathlen) {
+ free(sp->fts_path);
+ sp->fts_path = NULL;
+ __set_errno (ENAMETOOLONG);
+ return false;
+ }
+ sp->fts_pathlen = new_len;
+ p = realloc(sp->fts_path, sp->fts_pathlen);
+ if (p == NULL) {
+ free(sp->fts_path);
+ sp->fts_path = NULL;
+ return false;
+ }
+ sp->fts_path = p;
+ return true;
+}
+
+/*
+ * When the file name is realloc'd, have to fix all of the pointers in
+ * structures already returned.
+ */
+static void
+internal_function
+fts_padjust (FTS *sp, FTSENT *head)
+{
+ FTSENT *p;
+ char *addr = sp->fts_path;
+
+#define ADJUST(p) do { \
+ if ((p)->fts_accpath != (p)->fts_name) { \
+ (p)->fts_accpath = \
+ (char *)addr + ((p)->fts_accpath - (p)->fts_path); \
+ } \
+ (p)->fts_path = addr; \
+} while (0)
+ /* Adjust the current set of children. */
+ for (p = sp->fts_child; p; p = p->fts_link)
+ ADJUST(p);
+
+ /* Adjust the rest of the tree, including the current level. */
+ for (p = head; p->fts_level >= FTS_ROOTLEVEL;) {
+ ADJUST(p);
+ p = p->fts_link ? p->fts_link : p->fts_parent;
+ }
+}
+
+static size_t
+internal_function
+fts_maxarglen (char * const *argv)
+{
+ size_t len, max;
+
+ for (max = 0; *argv; ++argv)
+ if ((len = strlen(*argv)) > max)
+ max = len;
+ return (max + 1);
+}
+
+/*
+ * Change to dir specified by fd or file name without getting
+ * tricked by someone changing the world out from underneath us.
+ * Assumes p->fts_statp->st_dev and p->fts_statp->st_ino are filled in.
+ * If FD is non-negative, expect it to be used after this function returns,
+ * and to be closed eventually. So don't pass e.g., `dirfd(dirp)' and then
+ * do closedir(dirp), because that would invalidate the saved FD.
+ * Upon failure, close FD immediately and return nonzero.
+ */
+static int
+internal_function
+fts_safe_changedir (FTS *sp, FTSENT *p, int fd, char const *dir)
+{
+ int ret;
+ bool is_dotdot = dir && STREQ (dir, "..");
+ int newfd;
+
+ /* This clause handles the unusual case in which FTS_NOCHDIR
+ is specified, along with FTS_CWDFD. In that case, there is
+ no need to change even the virtual cwd file descriptor.
+ However, if FD is non-negative, we do close it here. */
+ if (ISSET (FTS_NOCHDIR))
+ {
+ if (ISSET (FTS_CWDFD) && 0 <= fd)
+ close (fd);
+ return 0;
+ }
+
+ if (fd < 0 && is_dotdot && ISSET (FTS_CWDFD))
+ {
+ /* When possible, skip the diropen and subsequent fstat+dev/ino
+ comparison. I.e., when changing to parent directory
+ (chdir ("..")), use a file descriptor from the ring and
+ save the overhead of diropen+fstat, as well as avoiding
+ failure when we lack "x" access to the virtual cwd. */
+ if ( ! i_ring_empty (&sp->fts_fd_ring))
+ {
+ int parent_fd;
+ fd_ring_print (sp, stderr, "pre-pop");
+ parent_fd = i_ring_pop (&sp->fts_fd_ring);
+ is_dotdot = true;
+ if (0 <= parent_fd)
+ {
+ fd = parent_fd;
+ dir = NULL;
+ }
+ }
+ }
+
+ newfd = fd;
+ if (fd < 0 && (newfd = diropen (sp, dir)) < 0)
+ return -1;
+
+ /* The following dev/inode check is necessary if we're doing a
+ `logical' traversal (through symlinks, a la chown -L), if the
+ system lacks O_NOFOLLOW support, or if we're changing to ".."
+ (but not via a popped file descriptor). When changing to the
+ name "..", O_NOFOLLOW can't help. In general, when the target is
+ not "..", diropen's use of O_NOFOLLOW ensures we don't mistakenly
+ follow a symlink, so we can avoid the expense of this fstat. */
+ if (ISSET(FTS_LOGICAL) || ! HAVE_WORKING_O_NOFOLLOW
+ || (dir && STREQ (dir, "..")))
+ {
+ struct stat sb;
+ if (fstat(newfd, &sb))
+ {
+ ret = -1;
+ goto bail;
+ }
+ if (p->fts_statp->st_dev != sb.st_dev
+ || p->fts_statp->st_ino != sb.st_ino)
+ {
+ __set_errno (ENOENT); /* disinformation */
+ ret = -1;
+ goto bail;
+ }
+ }
+
+ if (ISSET(FTS_CWDFD))
+ {
+ cwd_advance_fd (sp, newfd, ! is_dotdot);
+ return 0;
+ }
+
+ ret = fchdir(newfd);
+bail:
+ if (fd < 0)
+ {
+ int oerrno = errno;
+ (void)close(newfd);
+ __set_errno (oerrno);
+ }
+ return ret;
+}
diff --git a/gnulib/lib/fts_.h b/gnulib/lib/fts_.h
new file mode 100644
index 00000000..e1a8196a
--- /dev/null
+++ b/gnulib/lib/fts_.h
@@ -0,0 +1,263 @@
+/* Traverse a file hierarchy.
+
+ Copyright (C) 2004-2010 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/>. */
+
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)fts.h 8.3 (Berkeley) 8/14/94
+ */
+
+#ifndef _FTS_H
+# define _FTS_H 1
+
+# ifdef _LIBC
+# include <features.h>
+# else
+# undef __THROW
+# define __THROW
+# undef __BEGIN_DECLS
+# define __BEGIN_DECLS
+# undef __END_DECLS
+# define __END_DECLS
+# endif
+
+# include <stddef.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include "i-ring.h"
+
+typedef struct {
+ struct _ftsent *fts_cur; /* current node */
+ struct _ftsent *fts_child; /* linked list of children */
+ struct _ftsent **fts_array; /* sort array */
+ dev_t fts_dev; /* starting device # */
+ char *fts_path; /* file name for this descent */
+ int fts_rfd; /* fd for root */
+ int fts_cwd_fd; /* the file descriptor on which the
+ virtual cwd is open, or AT_FDCWD */
+ size_t fts_pathlen; /* sizeof(path) */
+ size_t fts_nitems; /* elements in the sort array */
+ int (*fts_compar) (struct _ftsent const **, struct _ftsent const **);
+ /* compare fn */
+
+# define FTS_COMFOLLOW 0x0001 /* follow command line symlinks */
+# define FTS_LOGICAL 0x0002 /* logical walk */
+# define FTS_NOCHDIR 0x0004 /* don't change directories */
+# define FTS_NOSTAT 0x0008 /* don't get stat info */
+# define FTS_PHYSICAL 0x0010 /* physical walk */
+# define FTS_SEEDOT 0x0020 /* return dot and dot-dot */
+# define FTS_XDEV 0x0040 /* don't cross devices */
+# define FTS_WHITEOUT 0x0080 /* return whiteout information */
+
+ /* There are two ways to detect cycles.
+ The lazy way (which works only with FTS_PHYSICAL),
+ with which one may process a directory that is a
+ part of the cycle several times before detecting the cycle.
+ The `tight' way, whereby fts uses more memory (proportional
+ to number of `active' directories, aka distance from root
+ of current tree to current directory -- see active_dir_ht)
+ to detect any cycle right away. For example, du must use
+ this option to avoid counting disk space in a cycle multiple
+ times, but chown -R need not.
+ The default is to use the constant-memory lazy way, when possible
+ (see below).
+
+ However, with FTS_LOGICAL (when following symlinks, e.g., chown -L)
+ using lazy cycle detection is inadequate. For example, traversing
+ a directory containing a symbolic link to a peer directory, it is
+ possible to encounter the same directory twice even though there
+ is no cycle:
+ dir
+ ...
+ slink -> dir
+ So, when FTS_LOGICAL is selected, we have to use a different
+ mode of cycle detection: FTS_TIGHT_CYCLE_CHECK. */
+# define FTS_TIGHT_CYCLE_CHECK 0x0100
+
+ /* Use this flag to enable semantics with which the parent
+ application may be made both more efficient and more robust.
+ Whereas the default is to visit each directory in a recursive
+ traversal (via chdir), using this flag makes it so the initial
+ working directory is never changed. Instead, these functions
+ perform the traversal via a virtual working directory, maintained
+ through the file descriptor member, fts_cwd_fd. */
+# define FTS_CWDFD 0x0200
+
+ /* Historically, for each directory that fts initially encounters, it would
+ open it, read all entries, and stat each entry, storing the results, and
+ then it would process the first entry. But that behavior is bad for
+ locality of reference, and also causes trouble with inode-simulating
+ file systems like FAT, CIFS, FUSE-based ones, etc., when entries from
+ their name/inode cache are flushed too early.
+ Use this flag to make fts_open and fts_read defer the stat/lstat/fststat
+ of each entry until it is actually processed. However, note that if you
+ use this option and also specify a comparison function, that function may
+ not examine any data via fts_statp. However, when fts_statp->st_mode is
+ nonzero, the S_IFMT type bits are valid, with mapped dirent.d_type data.
+ Of course, that happens only on file systems that provide useful
+ dirent.d_type data. */
+# define FTS_DEFER_STAT 0x0400
+
+# define FTS_OPTIONMASK 0x07ff /* valid user option mask */
+
+# define FTS_NAMEONLY 0x1000 /* (private) child names only */
+# define FTS_STOP 0x2000 /* (private) unrecoverable error */
+ int fts_options; /* fts_open options, global flags */
+
+# if GNULIB_FTS
+ /* Map a directory's device number to a boolean. The boolean is
+ true if for that file system (type determined by a single fstatfs
+ call per FS) st_nlink can be used to calculate the number of
+ sub-directory entries in a directory.
+ Using this table is an optimization that permits us to look up
+ file system type on a per-inode basis at the minimal cost of
+ calling fstatfs only once per traversed device. */
+ struct hash_table *fts_leaf_optimization_works_ht;
+
+ union {
+ /* This data structure is used if FTS_TIGHT_CYCLE_CHECK is
+ specified. It records the directories between a starting
+ point and the current directory. I.e., a directory is
+ recorded here IFF we have visited it once, but we have not
+ yet completed processing of all its entries. Every time we
+ visit a new directory, we add that directory to this set.
+ When we finish with a directory (usually by visiting it a
+ second time), we remove it from this set. Each entry in
+ this data structure is a device/inode pair. This data
+ structure is used to detect directory cycles efficiently and
+ promptly even when the depth of a hierarchy is in the tens
+ of thousands. */
+ struct hash_table *ht;
+
+ /* FIXME: rename these two members to have the fts_ prefix */
+ /* This data structure uses a lazy cycle-detection algorithm,
+ as done by rm via cycle-check.c. It's the default,
+ but it's not appropriate for programs like du. */
+ struct cycle_check_state *state;
+ } fts_cycle;
+
+# endif
+ /* A stack of the file descriptors corresponding to the
+ most-recently traversed parent directories.
+ Currently used only in FTS_CWDFD mode. */
+ I_ring fts_fd_ring;
+} FTS;
+
+typedef struct _ftsent {
+ struct _ftsent *fts_cycle; /* cycle node */
+ struct _ftsent *fts_parent; /* parent directory */
+ struct _ftsent *fts_link; /* next file in directory */
+ long fts_number; /* local numeric value */
+ void *fts_pointer; /* local address value */
+ char *fts_accpath; /* access file name */
+ char *fts_path; /* root name; == fts_fts->fts_path */
+ int fts_errno; /* errno for this node */
+ int fts_symfd; /* fd for symlink */
+ size_t fts_pathlen; /* strlen(fts_path) */
+
+ FTS *fts_fts; /* the file hierarchy itself */
+
+# define FTS_ROOTPARENTLEVEL (-1)
+# define FTS_ROOTLEVEL 0
+ ptrdiff_t fts_level; /* depth (-1 to N) */
+
+ size_t fts_namelen; /* strlen(fts_name) */
+ nlink_t fts_n_dirs_remaining; /* count down from st_nlink */
+
+# define FTS_D 1 /* preorder directory */
+# define FTS_DC 2 /* directory that causes cycles */
+# define FTS_DEFAULT 3 /* none of the above */
+# define FTS_DNR 4 /* unreadable directory */
+# define FTS_DOT 5 /* dot or dot-dot */
+# define FTS_DP 6 /* postorder directory */
+# define FTS_ERR 7 /* error; errno is set */
+# define FTS_F 8 /* regular file */
+# define FTS_INIT 9 /* initialized only */
+# define FTS_NS 10 /* stat(2) failed */
+# define FTS_NSOK 11 /* no stat(2) requested */
+# define FTS_SL 12 /* symbolic link */
+# define FTS_SLNONE 13 /* symbolic link without target */
+# define FTS_W 14 /* whiteout object */
+ unsigned short int fts_info; /* user flags for FTSENT structure */
+
+# define FTS_DONTCHDIR 0x01 /* don't chdir .. to the parent */
+# define FTS_SYMFOLLOW 0x02 /* followed a symlink to get here */
+ unsigned short int fts_flags; /* private flags for FTSENT structure */
+
+# define FTS_AGAIN 1 /* read node again */
+# define FTS_FOLLOW 2 /* follow symbolic link */
+# define FTS_NOINSTR 3 /* no instructions */
+# define FTS_SKIP 4 /* discard node */
+ unsigned short int fts_instr; /* fts_set() instructions */
+
+ struct stat fts_statp[1]; /* stat(2) information */
+ char fts_name[1]; /* file name */
+} FTSENT;
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#if __GNUC_PREREQ (3,4)
+# undef __attribute_warn_unused_result__
+# define __attribute_warn_unused_result__ \
+ __attribute__ ((__warn_unused_result__))
+#else
+# define __attribute_warn_unused_result__ /* empty */
+#endif
+
+__BEGIN_DECLS
+FTSENT *fts_children (FTS *, int) __THROW __attribute_warn_unused_result__;
+int fts_close (FTS *) __THROW __attribute_warn_unused_result__;
+FTS *fts_open (char * const *, int,
+ int (*)(const FTSENT **, const FTSENT **))
+ __THROW __attribute_warn_unused_result__;
+FTSENT *fts_read (FTS *) __THROW __attribute_warn_unused_result__;
+int fts_set (FTS *, FTSENT *, int) __THROW;
+__END_DECLS
+
+#endif /* fts.h */
diff --git a/gnulib/lib/full-read.c b/gnulib/lib/full-read.c
new file mode 100644
index 00000000..e5de3760
--- /dev/null
+++ b/gnulib/lib/full-read.c
@@ -0,0 +1,18 @@
+/* An interface to read that retries after partial reads and interrupts.
+ Copyright (C) 2002-2003, 2009-2010 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/>. */
+
+#define FULL_READ
+#include "full-write.c"
diff --git a/gnulib/lib/full-read.h b/gnulib/lib/full-read.h
new file mode 100644
index 00000000..a41f617c
--- /dev/null
+++ b/gnulib/lib/full-read.h
@@ -0,0 +1,24 @@
+/* An interface to read() that reads all it is asked to read.
+
+ Copyright (C) 2002, 2009-2010 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, read to the Free Software Foundation,
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+/* Read COUNT bytes at BUF to descriptor FD, retrying if interrupted
+ or if partial reads occur. Return the number of bytes successfully
+ read, setting errno if that is less than COUNT. errno = 0 means EOF. */
+extern size_t full_read (int fd, void *buf, size_t count);
diff --git a/gnulib/lib/full-write.c b/gnulib/lib/full-write.c
new file mode 100644
index 00000000..5d9b7c33
--- /dev/null
+++ b/gnulib/lib/full-write.c
@@ -0,0 +1,79 @@
+/* An interface to read and write that retries (if necessary) until complete.
+
+ Copyright (C) 1993-1994, 1997-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef FULL_READ
+# include "full-read.h"
+#else
+# include "full-write.h"
+#endif
+
+#include <errno.h>
+
+#ifdef FULL_READ
+# include "safe-read.h"
+# define safe_rw safe_read
+# define full_rw full_read
+# undef const
+# define const /* empty */
+#else
+# include "safe-write.h"
+# define safe_rw safe_write
+# define full_rw full_write
+#endif
+
+#ifdef FULL_READ
+/* Set errno to zero upon EOF. */
+# define ZERO_BYTE_TRANSFER_ERRNO 0
+#else
+/* Some buggy drivers return 0 when one tries to write beyond
+ a device's end. (Example: Linux 1.2.13 on /dev/fd0.)
+ Set errno to ENOSPC so they get a sensible diagnostic. */
+# define ZERO_BYTE_TRANSFER_ERRNO ENOSPC
+#endif
+
+/* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if
+ interrupted or if a partial write(read) occurs. Return the number
+ of bytes transferred.
+ When writing, set errno if fewer than COUNT bytes are written.
+ When reading, if fewer than COUNT bytes are read, you must examine
+ errno to distinguish failure from EOF (errno == 0). */
+size_t
+full_rw (int fd, const void *buf, size_t count)
+{
+ size_t total = 0;
+ const char *ptr = (const char *) buf;
+
+ while (count > 0)
+ {
+ size_t n_rw = safe_rw (fd, ptr, count);
+ if (n_rw == (size_t) -1)
+ break;
+ if (n_rw == 0)
+ {
+ errno = ZERO_BYTE_TRANSFER_ERRNO;
+ break;
+ }
+ total += n_rw;
+ ptr += n_rw;
+ count -= n_rw;
+ }
+
+ return total;
+}
diff --git a/gnulib/lib/full-write.h b/gnulib/lib/full-write.h
new file mode 100644
index 00000000..15d61808
--- /dev/null
+++ b/gnulib/lib/full-write.h
@@ -0,0 +1,34 @@
+/* An interface to write() that writes all it is asked to write.
+
+ Copyright (C) 2002-2003, 2009-2010 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/>. */
+
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Write COUNT bytes at BUF to descriptor FD, retrying if interrupted
+ or if partial writes occur. Return the number of bytes successfully
+ written, setting errno if that is less than COUNT. */
+extern size_t full_write (int fd, const void *buf, size_t count);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/futimens.c b/gnulib/lib/futimens.c
new file mode 100644
index 00000000..ff7c7b4d
--- /dev/null
+++ b/gnulib/lib/futimens.c
@@ -0,0 +1,37 @@
+/* Set the access and modification time of an open fd.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "utimens.h"
+
+/* Set the access and modification time stamps of FD to be
+ TIMESPEC[0] and TIMESPEC[1], respectively.
+ Fail with ENOSYS on systems without futimes (or equivalent).
+ If TIMESPEC is null, set the time stamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+int
+futimens (int fd, struct timespec const times[2])
+{
+ /* fdutimens also works around bugs in native futimens, when running
+ with glibc compiled against newer headers but on a Linux kernel
+ older than 2.6.32. */
+ return fdutimens (NULL, fd, times);
+}
diff --git a/gnulib/lib/fwritable.c b/gnulib/lib/fwritable.c
new file mode 100644
index 00000000..a3f87958
--- /dev/null
+++ b/gnulib/lib/fwritable.c
@@ -0,0 +1,45 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fwritable.h"
+
+#include "stdio-impl.h"
+
+bool
+fwritable (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return (fp->_flags & _IO_NO_WRITES) == 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ return (fp_->_flags & (__SRW | __SWR)) != 0;
+#elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & (_IORW | _IOWRT)) != 0;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ return (fp->_flag & (_IORW | _IOWRT)) != 0;
+#elif defined __QNX__ /* QNX */
+ return (fp->_Mode & 0x2 /* _MOPENW */) != 0;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ return fp->__mode.__write;
+#else
+ #error "Please port gnulib fwritable.c to your platform! Look at the definition of fopen, fdopen on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/fwritable.h b/gnulib/lib/fwritable.h
new file mode 100644
index 00000000..b5193376
--- /dev/null
+++ b/gnulib/lib/fwritable.h
@@ -0,0 +1,42 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM supports writing, false if it supports
+ only reading.
+ STREAM must not be wide-character oriented.
+ The result doesn't change until the stream is closed or re-opened. */
+
+#if HAVE___FWRITABLE /* glibc >= 2.2, Solaris >= 7 */
+
+# include <stdio_ext.h>
+# define fwritable(stream) (__fwritable (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool fwritable (FILE *stream);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/fwriteerror.c b/gnulib/lib/fwriteerror.c
new file mode 100644
index 00000000..c2eab1b0
--- /dev/null
+++ b/gnulib/lib/fwriteerror.c
@@ -0,0 +1,181 @@
+/* Detect write error on a stream.
+ Copyright (C) 2003-2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fwriteerror.h"
+
+#include <errno.h>
+#include <stdbool.h>
+
+static int
+do_fwriteerror (FILE *fp, bool ignore_ebadf)
+{
+ /* State to allow multiple calls to fwriteerror (stdout). */
+ static bool stdout_closed = false;
+
+ if (fp == stdout)
+ {
+ if (stdout_closed)
+ return 0;
+
+ /* If we are closing stdout, don't attempt to do it later again. */
+ stdout_closed = true;
+ }
+
+ /* This function returns an error indication if there was a previous failure
+ or if fclose failed, with two exceptions:
+ - Ignore an fclose failure if there was no previous error, no data
+ remains to be flushed, and fclose failed with EBADF. That can
+ happen when a program like cp is invoked like this `cp a b >&-'
+ (i.e., with standard output closed) and doesn't generate any
+ output (hence no previous error and nothing to be flushed).
+ - Ignore an fclose failure due to EPIPE. That can happen when a
+ program blocks or ignores SIGPIPE, and the output pipe or socket
+ has no readers now. The EPIPE tells us that we should stop writing
+ to this output. That's what we are doing anyway here.
+
+ Need to
+ 1. test the error indicator of the stream,
+ 2. flush the buffers both in userland and in the kernel, through fclose,
+ testing for error again. */
+
+ /* Clear errno, so that on non-POSIX systems the caller doesn't see a
+ wrong value of errno when we return -1. */
+ errno = 0;
+
+ if (ferror (fp))
+ {
+ if (fflush (fp))
+ goto close_preserving_errno; /* errno is set here */
+ /* The stream had an error earlier, but its errno was lost. If the
+ error was not temporary, we can get the same errno by writing and
+ flushing one more byte. We can do so because at this point the
+ stream's contents is garbage anyway. */
+ if (fputc ('\0', fp) == EOF)
+ goto close_preserving_errno; /* errno is set here */
+ if (fflush (fp))
+ goto close_preserving_errno; /* errno is set here */
+ /* Give up on errno. */
+ errno = 0;
+ goto close_preserving_errno;
+ }
+
+ if (ignore_ebadf)
+ {
+ /* We need an explicit fflush to tell whether some output was already
+ done on FP. */
+ if (fflush (fp))
+ goto close_preserving_errno; /* errno is set here */
+ if (fclose (fp) && errno != EBADF)
+ goto got_errno; /* errno is set here */
+ }
+ else
+ {
+ if (fclose (fp))
+ goto got_errno; /* errno is set here */
+ }
+
+ return 0;
+
+ close_preserving_errno:
+ /* There's an error. Nevertheless call fclose(fp), for consistency
+ with the other cases. */
+ {
+ int saved_errno = errno;
+ fclose (fp);
+ errno = saved_errno;
+ }
+ got_errno:
+ /* There's an error. Ignore EPIPE. */
+ if (errno == EPIPE)
+ return 0;
+ else
+ return -1;
+}
+
+int
+fwriteerror (FILE *fp)
+{
+ return do_fwriteerror (fp, false);
+}
+
+int
+fwriteerror_no_ebadf (FILE *fp)
+{
+ return do_fwriteerror (fp, true);
+}
+
+
+#if TEST
+
+/* Name of a file on which writing fails. On systems without /dev/full,
+ you can choose a filename on a full file system. */
+#define UNWRITABLE_FILE "/dev/full"
+
+int
+main ()
+{
+ static int sizes[] =
+ {
+ 511, 512, 513,
+ 1023, 1024, 1025,
+ 2047, 2048, 2049,
+ 4095, 4096, 4097,
+ 8191, 8192, 8193
+ };
+ static char dummy[8193];
+ unsigned int i, j;
+
+ for (i = 0; i < sizeof (sizes) / sizeof (sizes[0]); i++)
+ {
+ size_t size = sizes[i];
+
+ for (j = 0; j < 2; j++)
+ {
+ /* Run a test depending on i and j:
+ Write size bytes and then calls fflush if j==1. */
+ FILE *stream = fopen (UNWRITABLE_FILE, "w");
+
+ if (stream == NULL)
+ {
+ fprintf (stderr, "Test %u:%u: could not open file\n", i, j);
+ continue;
+ }
+
+ fwrite (dummy, 347, 1, stream);
+ fwrite (dummy, size - 347, 1, stream);
+ if (j)
+ fflush (stream);
+
+ if (fwriteerror (stream) == -1)
+ {
+ if (errno != ENOSPC)
+ fprintf (stderr, "Test %u:%u: fwriteerror ok, errno = %d\n",
+ i, j, errno);
+ }
+ else
+ fprintf (stderr, "Test %u:%u: fwriteerror found no error!\n",
+ i, j);
+ }
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/fwriteerror.h b/gnulib/lib/fwriteerror.h
new file mode 100644
index 00000000..6a3edc6d
--- /dev/null
+++ b/gnulib/lib/fwriteerror.h
@@ -0,0 +1,62 @@
+/* Detect write error on a stream.
+ Copyright (C) 2003, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+/* There are two approaches for detecting a write error on a stream opened
+ for writing:
+
+ (a) Test the return value of every fwrite() or fprintf() call, and react
+ immediately.
+ (b) Just before fclose(), test the error indicator in the stream and
+ the return value of the final fclose() call.
+
+ The benefit of (a) is that non file related errors (such that ENOMEM during
+ fprintf) and temporary error conditions can be diagnosed accurately.
+
+ A theoretical benefit of (a) is also that, on POSIX systems, in the case of
+ an ENOSPC error, errno is set and can be used by error() to provide a more
+ accurate error message. But in practice, this benefit is not big because
+ users can easily figure out by themselves why a file cannot be written to,
+ and furthermore the function fwriteerror() can provide errno as well.
+
+ The big drawback of (a) is extensive error checking code: Every function
+ which does stream output must return an error indicator.
+
+ This file provides support for (b). */
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write out the not yet written buffered contents of the stream FP, close
+ the stream FP, and test whether some error occurred on the stream FP.
+ FP must be a stream opened for writing.
+ Return 0 if no error occurred and fclose (fp) succeeded.
+ Return -1 and set errno if there was an error. The errno value will be 0
+ if the cause of the error cannot be determined.
+ For any given stream FP other than stdout, fwriteerror (FP) may only be
+ called once. */
+extern int fwriteerror (FILE *fp);
+
+/* Likewise, but don't consider it an error if FP has an invalid file
+ descriptor and no output was done to FP. */
+extern int fwriteerror_no_ebadf (FILE *fp);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/fwriting.c b/gnulib/lib/fwriting.c
new file mode 100644
index 00000000..12cd25e2
--- /dev/null
+++ b/gnulib/lib/fwriting.c
@@ -0,0 +1,56 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fwriting.h"
+
+#include "stdio-impl.h"
+
+bool
+fwriting (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return (fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) != 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ return (fp_->_flags & __SWR) != 0;
+#elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & _IOWRT) != 0;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
+ return (fp->_flag & _IOWRT) != 0;
+#elif defined __UCLIBC__ /* uClibc */
+ return (fp->__modeflags & __FLAG_WRITING) != 0;
+#elif defined __QNX__ /* QNX */
+ return ((fp->_Mode & 0x1 /* _MOPENR */) == 0
+ || (fp->_Mode & 0x2000 /* _MWRITE */) != 0);
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__read)
+ return 1;
+ if (!fp->__mode.__write)
+ return 0;
+# ifdef _IO_CURRENTLY_PUTTING /* Flag added on 2009-02-28 */
+ return (fp->__flags & _IO_CURRENTLY_PUTTING) != 0;
+# else
+ return (fp->__buffer < fp->__put_limit /*|| fp->__bufp == fp->__get_limit ??*/);
+# endif
+#else
+ #error "Please port gnulib fwriting.c to your platform!"
+#endif
+}
diff --git a/gnulib/lib/fwriting.h b/gnulib/lib/fwriting.h
new file mode 100644
index 00000000..66056b29
--- /dev/null
+++ b/gnulib/lib/fwriting.h
@@ -0,0 +1,53 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM is opened write-only or
+ append-only, or if the last operation on the stream was a write
+ operation. Return false if the stream is opened read-only, or if
+ it supports reading and there is no current write operation (such
+ as fputc).
+
+ freading and fwriting will never both be true. If STREAM supports
+ both reads and writes, then:
+ - both freading and fwriting might be false when the stream is first
+ opened, after read encounters EOF, or after fflush,
+ - freading might be false or true and fwriting might be false
+ after repositioning (such as fseek, fsetpos, or rewind),
+ depending on the underlying implementation.
+
+ STREAM must not be wide-character oriented. */
+
+#if HAVE___FWRITING /* glibc >= 2.2, Solaris >= 7 */
+
+# include <stdio_ext.h>
+# define fwriting(stream) (__fwriting (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool fwriting (FILE *stream);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/gai_strerror.c b/gnulib/lib/gai_strerror.c
new file mode 100644
index 00000000..653ff75b
--- /dev/null
+++ b/gnulib/lib/gai_strerror.c
@@ -0,0 +1,76 @@
+/* Copyright (C) 1997, 2001, 2002, 2004, 2005, 2006, 2008, 2009, 2010 Free
+ Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Philip Blundell <pjb27@cam.ac.uk>, 1997.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <netdb.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(String) gettext (String)
+# define N_(String) String
+#endif
+
+static struct
+ {
+ int code;
+ const char *msg;
+ }
+values[] =
+ {
+ { EAI_ADDRFAMILY, N_("Address family for hostname not supported") },
+ { EAI_AGAIN, N_("Temporary failure in name resolution") },
+ { EAI_BADFLAGS, N_("Bad value for ai_flags") },
+ { EAI_FAIL, N_("Non-recoverable failure in name resolution") },
+ { EAI_FAMILY, N_("ai_family not supported") },
+ { EAI_MEMORY, N_("Memory allocation failure") },
+ { EAI_NODATA, N_("No address associated with hostname") },
+ { EAI_NONAME, N_("Name or service not known") },
+ { EAI_SERVICE, N_("Servname not supported for ai_socktype") },
+ { EAI_SOCKTYPE, N_("ai_socktype not supported") },
+ { EAI_SYSTEM, N_("System error") },
+ { EAI_OVERFLOW, N_("Argument buffer too small") },
+#ifdef EAI_INPROGRESS
+ { EAI_INPROGRESS, N_("Processing request in progress") },
+ { EAI_CANCELED, N_("Request canceled") },
+ { EAI_NOTCANCELED, N_("Request not canceled") },
+ { EAI_ALLDONE, N_("All requests done") },
+ { EAI_INTR, N_("Interrupted by a signal") },
+ { EAI_IDN_ENCODE, N_("Parameter string not correctly encoded") }
+#endif
+ };
+
+const char *
+gai_strerror (int code)
+{
+ size_t i;
+ for (i = 0; i < sizeof (values) / sizeof (values[0]); ++i)
+ if (values[i].code == code)
+ return _(values[i].msg);
+
+ return _("Unknown error");
+}
+#ifdef _LIBC
+libc_hidden_def (gai_strerror)
+#endif
diff --git a/gnulib/lib/gc-gnulib.c b/gnulib/lib/gc-gnulib.c
new file mode 100644
index 00000000..00eba174
--- /dev/null
+++ b/gnulib/lib/gc-gnulib.c
@@ -0,0 +1,919 @@
+/* gc-gnulib.c --- Common gnulib internal crypto interface functions
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+ * Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Note: This file is only built if GC uses internal functions. */
+
+#include <config.h>
+
+/* Get prototype. */
+#include "gc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* For randomize. */
+#ifdef GNULIB_GC_RANDOM
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+# include <errno.h>
+#endif
+
+/* Hashes. */
+#ifdef GNULIB_GC_MD2
+# include "md2.h"
+#endif
+#ifdef GNULIB_GC_MD4
+# include "md4.h"
+#endif
+#ifdef GNULIB_GC_MD5
+# include "md5.h"
+#endif
+#ifdef GNULIB_GC_SHA1
+# include "sha1.h"
+#endif
+#if defined(GNULIB_GC_HMAC_MD5) || defined(GNULIB_GC_HMAC_SHA1)
+# include "hmac.h"
+#endif
+
+/* Ciphers. */
+#ifdef GNULIB_GC_ARCFOUR
+# include "arcfour.h"
+#endif
+#ifdef GNULIB_GC_ARCTWO
+# include "arctwo.h"
+#endif
+#ifdef GNULIB_GC_DES
+# include "des.h"
+#endif
+#ifdef GNULIB_GC_RIJNDAEL
+# include "rijndael-api-fst.h"
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+#ifdef GNULIB_GC_RANDOM
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <windows.h>
+# include <wincrypt.h>
+HCRYPTPROV g_hProv = 0;
+# ifndef PROV_INTEL_SEC
+# define PROV_INTEL_SEC 22
+# endif
+# ifndef CRYPT_VERIFY_CONTEXT
+# define CRYPT_VERIFY_CONTEXT 0xF0000000
+# endif
+# endif
+#endif
+
+Gc_rc
+gc_init (void)
+{
+#ifdef GNULIB_GC_RANDOM
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (g_hProv)
+ CryptReleaseContext (g_hProv, 0);
+
+ /* There is no need to create a container for just random data, so
+ we can use CRYPT_VERIFY_CONTEXT (one call) see:
+ http://blogs.msdn.com/dangriff/archive/2003/11/19/51709.aspx */
+
+ /* We first try to use the Intel PIII RNG if drivers are present */
+ if (!CryptAcquireContext (&g_hProv, NULL, NULL,
+ PROV_INTEL_SEC, CRYPT_VERIFY_CONTEXT))
+ {
+ /* not a PIII or no drivers available, use default RSA CSP */
+ if (!CryptAcquireContext (&g_hProv, NULL, NULL,
+ PROV_RSA_FULL, CRYPT_VERIFY_CONTEXT))
+ return GC_RANDOM_ERROR;
+ }
+# endif
+#endif
+
+ return GC_OK;
+}
+
+void
+gc_done (void)
+{
+#ifdef GNULIB_GC_RANDOM
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (g_hProv)
+ {
+ CryptReleaseContext (g_hProv, 0);
+ g_hProv = 0;
+ }
+# endif
+#endif
+
+ return;
+}
+
+#ifdef GNULIB_GC_RANDOM
+
+/* Randomness. */
+
+static Gc_rc
+randomize (int level, char *data, size_t datalen)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (!g_hProv)
+ return GC_RANDOM_ERROR;
+ CryptGenRandom (g_hProv, (DWORD) datalen, data);
+#else
+ int fd;
+ const char *device;
+ size_t len = 0;
+ int rc;
+
+ switch (level)
+ {
+ case 0:
+ device = NAME_OF_NONCE_DEVICE;
+ break;
+
+ case 1:
+ device = NAME_OF_PSEUDO_RANDOM_DEVICE;
+ break;
+
+ default:
+ device = NAME_OF_RANDOM_DEVICE;
+ break;
+ }
+
+ if (strcmp (device, "no") == 0)
+ return GC_RANDOM_ERROR;
+
+ fd = open (device, O_RDONLY);
+ if (fd < 0)
+ return GC_RANDOM_ERROR;
+
+ do
+ {
+ ssize_t tmp;
+
+ tmp = read (fd, data, datalen);
+
+ if (tmp < 0)
+ {
+ int save_errno = errno;
+ close (fd);
+ errno = save_errno;
+ return GC_RANDOM_ERROR;
+ }
+
+ len += tmp;
+ }
+ while (len < datalen);
+
+ rc = close (fd);
+ if (rc < 0)
+ return GC_RANDOM_ERROR;
+#endif
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_nonce (char *data, size_t datalen)
+{
+ return randomize (0, data, datalen);
+}
+
+Gc_rc
+gc_pseudo_random (char *data, size_t datalen)
+{
+ return randomize (1, data, datalen);
+}
+
+Gc_rc
+gc_random (char *data, size_t datalen)
+{
+ return randomize (2, data, datalen);
+}
+
+#endif
+
+/* Memory allocation. */
+
+void
+gc_set_allocators (gc_malloc_t func_malloc,
+ gc_malloc_t secure_malloc,
+ gc_secure_check_t secure_check,
+ gc_realloc_t func_realloc, gc_free_t func_free)
+{
+ return;
+}
+
+/* Ciphers. */
+
+typedef struct _gc_cipher_ctx
+{
+ Gc_cipher alg;
+ Gc_cipher_mode mode;
+#ifdef GNULIB_GC_ARCTWO
+ arctwo_context arctwoContext;
+ char arctwoIV[ARCTWO_BLOCK_SIZE];
+#endif
+#ifdef GNULIB_GC_ARCFOUR
+ arcfour_context arcfourContext;
+#endif
+#ifdef GNULIB_GC_DES
+ gl_des_ctx desContext;
+#endif
+#ifdef GNULIB_GC_RIJNDAEL
+ rijndaelKeyInstance aesEncKey;
+ rijndaelKeyInstance aesDecKey;
+ rijndaelCipherInstance aesContext;
+#endif
+} _gc_cipher_ctx;
+
+Gc_rc
+gc_cipher_open (Gc_cipher alg, Gc_cipher_mode mode,
+ gc_cipher_handle * outhandle)
+{
+ _gc_cipher_ctx *ctx;
+ Gc_rc rc = GC_OK;
+
+ ctx = calloc (sizeof (*ctx), 1);
+ if (!ctx)
+ return GC_MALLOC_ERROR;
+
+ ctx->alg = alg;
+ ctx->mode = mode;
+
+ switch (alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ switch (mode)
+ {
+ case GC_ECB:
+ case GC_CBC:
+ break;
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_ARCFOUR
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ switch (mode)
+ {
+ case GC_STREAM:
+ break;
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_DES
+ case GC_DES:
+ switch (mode)
+ {
+ case GC_ECB:
+ break;
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ switch (mode)
+ {
+ case GC_ECB:
+ case GC_CBC:
+ break;
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+
+ if (rc == GC_OK)
+ *outhandle = ctx;
+ else
+ free (ctx);
+
+ return rc;
+}
+
+Gc_rc
+gc_cipher_setkey (gc_cipher_handle handle, size_t keylen, const char *key)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ arctwo_setkey (&ctx->arctwoContext, keylen, key);
+ break;
+#endif
+
+#ifdef GNULIB_GC_ARCFOUR
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ arcfour_setkey (&ctx->arcfourContext, key, keylen);
+ break;
+#endif
+
+#ifdef GNULIB_GC_DES
+ case GC_DES:
+ if (keylen != 8)
+ return GC_INVALID_CIPHER;
+ gl_des_setkey (&ctx->desContext, key);
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ {
+ rijndael_rc rc;
+ size_t i;
+ char keyMaterial[RIJNDAEL_MAX_KEY_SIZE + 1];
+
+ for (i = 0; i < keylen; i++)
+ sprintf (&keyMaterial[2 * i], "%02x", key[i] & 0xFF);
+
+ rc = rijndaelMakeKey (&ctx->aesEncKey, RIJNDAEL_DIR_ENCRYPT,
+ keylen * 8, keyMaterial);
+ if (rc < 0)
+ return GC_INVALID_CIPHER;
+
+ rc = rijndaelMakeKey (&ctx->aesDecKey, RIJNDAEL_DIR_DECRYPT,
+ keylen * 8, keyMaterial);
+ if (rc < 0)
+ return GC_INVALID_CIPHER;
+
+ rc = rijndaelCipherInit (&ctx->aesContext, RIJNDAEL_MODE_ECB, NULL);
+ if (rc < 0)
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_setiv (gc_cipher_handle handle, size_t ivlen, const char *iv)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ if (ivlen != ARCTWO_BLOCK_SIZE)
+ return GC_INVALID_CIPHER;
+ memcpy (ctx->arctwoIV, iv, ivlen);
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ switch (ctx->mode)
+ {
+ case GC_ECB:
+ /* Doesn't use IV. */
+ break;
+
+ case GC_CBC:
+ {
+ rijndael_rc rc;
+ size_t i;
+ char ivMaterial[2 * RIJNDAEL_MAX_IV_SIZE + 1];
+
+ for (i = 0; i < ivlen; i++)
+ sprintf (&ivMaterial[2 * i], "%02x", iv[i] & 0xFF);
+
+ rc = rijndaelCipherInit (&ctx->aesContext, RIJNDAEL_MODE_CBC,
+ ivMaterial);
+ if (rc < 0)
+ return GC_INVALID_CIPHER;
+ }
+ break;
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_encrypt_inline (gc_cipher_handle handle, size_t len, char *data)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ switch (ctx->mode)
+ {
+ case GC_ECB:
+ arctwo_encrypt (&ctx->arctwoContext, data, data, len);
+ break;
+
+ case GC_CBC:
+ for (; len >= ARCTWO_BLOCK_SIZE; len -= ARCTWO_BLOCK_SIZE,
+ data += ARCTWO_BLOCK_SIZE)
+ {
+ size_t i;
+ for (i = 0; i < ARCTWO_BLOCK_SIZE; i++)
+ data[i] ^= ctx->arctwoIV[i];
+ arctwo_encrypt (&ctx->arctwoContext, data, data,
+ ARCTWO_BLOCK_SIZE);
+ memcpy (ctx->arctwoIV, data, ARCTWO_BLOCK_SIZE);
+ }
+ break;
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_ARCFOUR
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ arcfour_stream (&ctx->arcfourContext, data, data, len);
+ break;
+#endif
+
+#ifdef GNULIB_GC_DES
+ case GC_DES:
+ for (; len >= 8; len -= 8, data += 8)
+ gl_des_ecb_encrypt (&ctx->desContext, data, data);
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ {
+ int nblocks;
+
+ nblocks = rijndaelBlockEncrypt (&ctx->aesContext, &ctx->aesEncKey,
+ data, 8 * len, data);
+ if (nblocks < 0)
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_decrypt_inline (gc_cipher_handle handle, size_t len, char *data)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ switch (ctx->mode)
+ {
+ case GC_ECB:
+ arctwo_decrypt (&ctx->arctwoContext, data, data, len);
+ break;
+
+ case GC_CBC:
+ for (; len >= ARCTWO_BLOCK_SIZE; len -= ARCTWO_BLOCK_SIZE,
+ data += ARCTWO_BLOCK_SIZE)
+ {
+ char tmpIV[ARCTWO_BLOCK_SIZE];
+ size_t i;
+ memcpy (tmpIV, data, ARCTWO_BLOCK_SIZE);
+ arctwo_decrypt (&ctx->arctwoContext, data, data,
+ ARCTWO_BLOCK_SIZE);
+ for (i = 0; i < ARCTWO_BLOCK_SIZE; i++)
+ data[i] ^= ctx->arctwoIV[i];
+ memcpy (ctx->arctwoIV, tmpIV, ARCTWO_BLOCK_SIZE);
+ }
+ break;
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_ARCFOUR
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ arcfour_stream (&ctx->arcfourContext, data, data, len);
+ break;
+#endif
+
+#ifdef GNULIB_GC_DES
+ case GC_DES:
+ for (; len >= 8; len -= 8, data += 8)
+ gl_des_ecb_decrypt (&ctx->desContext, data, data);
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ {
+ int nblocks;
+
+ nblocks = rijndaelBlockDecrypt (&ctx->aesContext, &ctx->aesDecKey,
+ data, 8 * len, data);
+ if (nblocks < 0)
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_close (gc_cipher_handle handle)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ free (ctx);
+
+ return GC_OK;
+}
+
+/* Hashes. */
+
+#define MAX_DIGEST_SIZE 20
+
+typedef struct _gc_hash_ctx
+{
+ Gc_hash alg;
+ Gc_hash_mode mode;
+ char hash[MAX_DIGEST_SIZE];
+#ifdef GNULIB_GC_MD2
+ struct md2_ctx md2Context;
+#endif
+#ifdef GNULIB_GC_MD4
+ struct md4_ctx md4Context;
+#endif
+#ifdef GNULIB_GC_MD5
+ struct md5_ctx md5Context;
+#endif
+#ifdef GNULIB_GC_SHA1
+ struct sha1_ctx sha1Context;
+#endif
+} _gc_hash_ctx;
+
+Gc_rc
+gc_hash_open (Gc_hash hash, Gc_hash_mode mode, gc_hash_handle * outhandle)
+{
+ _gc_hash_ctx *ctx;
+ Gc_rc rc = GC_OK;
+
+ ctx = calloc (sizeof (*ctx), 1);
+ if (!ctx)
+ return GC_MALLOC_ERROR;
+
+ ctx->alg = hash;
+ ctx->mode = mode;
+
+ switch (hash)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_init_ctx (&ctx->md2Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ md4_init_ctx (&ctx->md4Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ md5_init_ctx (&ctx->md5Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ sha1_init_ctx (&ctx->sha1Context);
+ break;
+#endif
+
+ default:
+ rc = GC_INVALID_HASH;
+ break;
+ }
+
+ switch (mode)
+ {
+ case 0:
+ break;
+
+ default:
+ rc = GC_INVALID_HASH;
+ break;
+ }
+
+ if (rc == GC_OK)
+ *outhandle = ctx;
+ else
+ free (ctx);
+
+ return rc;
+}
+
+Gc_rc
+gc_hash_clone (gc_hash_handle handle, gc_hash_handle * outhandle)
+{
+ _gc_hash_ctx *in = handle;
+ _gc_hash_ctx *out;
+
+ *outhandle = out = calloc (sizeof (*out), 1);
+ if (!out)
+ return GC_MALLOC_ERROR;
+
+ memcpy (out, in, sizeof (*out));
+
+ return GC_OK;
+}
+
+size_t
+gc_hash_digest_length (Gc_hash hash)
+{
+ size_t len;
+
+ switch (hash)
+ {
+ case GC_MD2:
+ len = GC_MD2_DIGEST_SIZE;
+ break;
+
+ case GC_MD4:
+ len = GC_MD4_DIGEST_SIZE;
+ break;
+
+ case GC_MD5:
+ len = GC_MD5_DIGEST_SIZE;
+ break;
+
+ case GC_RMD160:
+ len = GC_RMD160_DIGEST_SIZE;
+ break;
+
+ case GC_SHA1:
+ len = GC_SHA1_DIGEST_SIZE;
+ break;
+
+ default:
+ return 0;
+ }
+
+ return len;
+}
+
+void
+gc_hash_write (gc_hash_handle handle, size_t len, const char *data)
+{
+ _gc_hash_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_process_bytes (data, len, &ctx->md2Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ md4_process_bytes (data, len, &ctx->md4Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ md5_process_bytes (data, len, &ctx->md5Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ sha1_process_bytes (data, len, &ctx->sha1Context);
+ break;
+#endif
+
+ default:
+ break;
+ }
+}
+
+const char *
+gc_hash_read (gc_hash_handle handle)
+{
+ _gc_hash_ctx *ctx = handle;
+ const char *ret = NULL;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_finish_ctx (&ctx->md2Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ md4_finish_ctx (&ctx->md4Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ md5_finish_ctx (&ctx->md5Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ sha1_finish_ctx (&ctx->sha1Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+ default:
+ return NULL;
+ }
+
+ return ret;
+}
+
+void
+gc_hash_close (gc_hash_handle handle)
+{
+ _gc_hash_ctx *ctx = handle;
+
+ free (ctx);
+}
+
+Gc_rc
+gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *resbuf)
+{
+ switch (hash)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ md4_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ md5_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ sha1_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+ default:
+ return GC_INVALID_HASH;
+ }
+
+ return GC_OK;
+}
+
+#ifdef GNULIB_GC_MD2
+Gc_rc
+gc_md2 (const void *in, size_t inlen, void *resbuf)
+{
+ md2_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_MD4
+Gc_rc
+gc_md4 (const void *in, size_t inlen, void *resbuf)
+{
+ md4_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_MD5
+Gc_rc
+gc_md5 (const void *in, size_t inlen, void *resbuf)
+{
+ md5_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_SHA1
+Gc_rc
+gc_sha1 (const void *in, size_t inlen, void *resbuf)
+{
+ sha1_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_HMAC_MD5
+Gc_rc
+gc_hmac_md5 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf)
+{
+ hmac_md5 (key, keylen, in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_HMAC_SHA1
+Gc_rc
+gc_hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf)
+{
+ hmac_sha1 (key, keylen, in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
diff --git a/gnulib/lib/gc-libgcrypt.c b/gnulib/lib/gc-libgcrypt.c
new file mode 100644
index 00000000..1ecc9623
--- /dev/null
+++ b/gnulib/lib/gc-libgcrypt.c
@@ -0,0 +1,726 @@
+/* gc-libgcrypt.c --- Crypto wrappers around Libgcrypt for GC.
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+ * Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Note: This file is only built if GC uses Libgcrypt. */
+
+#include <config.h>
+
+/* Get prototype. */
+#include "gc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Get libgcrypt API. */
+#include <gcrypt.h>
+#ifdef GNULIB_GC_MD2
+# include "md2.h"
+#endif
+
+#include <assert.h>
+
+/* Initialization. */
+
+Gc_rc
+gc_init (void)
+{
+ gcry_error_t err;
+
+ err = gcry_control (GCRYCTL_ANY_INITIALIZATION_P);
+ if (err == GPG_ERR_NO_ERROR)
+ {
+ if (gcry_control (GCRYCTL_DISABLE_SECMEM, NULL, 0))
+ return GC_INIT_ERROR;
+
+ if (gcry_check_version (GCRYPT_VERSION) == NULL)
+ return GC_INIT_ERROR;
+
+ err = gcry_control (GCRYCTL_INITIALIZATION_FINISHED, NULL, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INIT_ERROR;
+ }
+
+ return GC_OK;
+}
+
+void
+gc_done (void)
+{
+ return;
+}
+
+#ifdef GNULIB_GC_RANDOM
+
+/* Randomness. */
+
+Gc_rc
+gc_nonce (char *data, size_t datalen)
+{
+ gcry_create_nonce ((unsigned char *) data, datalen);
+ return GC_OK;
+}
+
+Gc_rc
+gc_pseudo_random (char *data, size_t datalen)
+{
+ gcry_randomize ((unsigned char *) data, datalen, GCRY_STRONG_RANDOM);
+ return GC_OK;
+}
+
+Gc_rc
+gc_random (char *data, size_t datalen)
+{
+ gcry_randomize ((unsigned char *) data, datalen, GCRY_VERY_STRONG_RANDOM);
+ return GC_OK;
+}
+
+#endif
+
+/* Memory allocation. */
+
+void
+gc_set_allocators (gc_malloc_t func_malloc,
+ gc_malloc_t secure_malloc,
+ gc_secure_check_t secure_check,
+ gc_realloc_t func_realloc, gc_free_t func_free)
+{
+ gcry_set_allocation_handler (func_malloc, secure_malloc, secure_check,
+ func_realloc, func_free);
+}
+
+/* Ciphers. */
+
+Gc_rc
+gc_cipher_open (Gc_cipher alg, Gc_cipher_mode mode,
+ gc_cipher_handle * outhandle)
+{
+ int gcryalg, gcrymode;
+ gcry_error_t err;
+
+ switch (alg)
+ {
+ case GC_AES128:
+ gcryalg = GCRY_CIPHER_RIJNDAEL;
+ break;
+
+ case GC_AES192:
+ gcryalg = GCRY_CIPHER_RIJNDAEL;
+ break;
+
+ case GC_AES256:
+ gcryalg = GCRY_CIPHER_RIJNDAEL256;
+ break;
+
+ case GC_3DES:
+ gcryalg = GCRY_CIPHER_3DES;
+ break;
+
+ case GC_DES:
+ gcryalg = GCRY_CIPHER_DES;
+ break;
+
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ gcryalg = GCRY_CIPHER_ARCFOUR;
+ break;
+
+ case GC_ARCTWO40:
+ gcryalg = GCRY_CIPHER_RFC2268_40;
+ break;
+
+#ifdef HAVE_CAMELLIA
+ case GC_CAMELLIA128:
+ gcryalg = GCRY_CIPHER_CAMELLIA128;
+ break;
+
+ case GC_CAMELLIA256:
+ gcryalg = GCRY_CIPHER_CAMELLIA256;
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ switch (mode)
+ {
+ case GC_ECB:
+ gcrymode = GCRY_CIPHER_MODE_ECB;
+ break;
+
+ case GC_CBC:
+ gcrymode = GCRY_CIPHER_MODE_CBC;
+ break;
+
+ case GC_STREAM:
+ gcrymode = GCRY_CIPHER_MODE_STREAM;
+ break;
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ err = gcry_cipher_open ((gcry_cipher_hd_t *) outhandle,
+ gcryalg, gcrymode, 0);
+ if (gcry_err_code (err))
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_setkey (gc_cipher_handle handle, size_t keylen, const char *key)
+{
+ gcry_error_t err;
+
+ err = gcry_cipher_setkey ((gcry_cipher_hd_t) handle, key, keylen);
+ if (gcry_err_code (err))
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_setiv (gc_cipher_handle handle, size_t ivlen, const char *iv)
+{
+ gcry_error_t err;
+
+ err = gcry_cipher_setiv ((gcry_cipher_hd_t) handle, iv, ivlen);
+ if (gcry_err_code (err))
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_encrypt_inline (gc_cipher_handle handle, size_t len, char *data)
+{
+ if (gcry_cipher_encrypt ((gcry_cipher_hd_t) handle,
+ data, len, NULL, len) != 0)
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_decrypt_inline (gc_cipher_handle handle, size_t len, char *data)
+{
+ if (gcry_cipher_decrypt ((gcry_cipher_hd_t) handle,
+ data, len, NULL, len) != 0)
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_close (gc_cipher_handle handle)
+{
+ gcry_cipher_close (handle);
+
+ return GC_OK;
+}
+
+/* Hashes. */
+
+typedef struct _gc_hash_ctx {
+ Gc_hash alg;
+ Gc_hash_mode mode;
+ gcry_md_hd_t gch;
+#ifdef GNULIB_GC_MD2
+ char hash[GC_MD2_DIGEST_SIZE];
+ struct md2_ctx md2Context;
+#endif
+} _gc_hash_ctx;
+
+Gc_rc
+gc_hash_open (Gc_hash hash, Gc_hash_mode mode, gc_hash_handle * outhandle)
+{
+ _gc_hash_ctx *ctx;
+ int gcryalg = 0, gcrymode = 0;
+ gcry_error_t err;
+ Gc_rc rc = GC_OK;
+
+ ctx = calloc (sizeof (*ctx), 1);
+ if (!ctx)
+ return GC_MALLOC_ERROR;
+
+ ctx->alg = hash;
+ ctx->mode = mode;
+
+ switch (hash)
+ {
+ case GC_MD2:
+ gcryalg = GCRY_MD_NONE;
+ break;
+
+ case GC_MD4:
+ gcryalg = GCRY_MD_MD4;
+ break;
+
+ case GC_MD5:
+ gcryalg = GCRY_MD_MD5;
+ break;
+
+ case GC_SHA1:
+ gcryalg = GCRY_MD_SHA1;
+ break;
+
+ case GC_SHA256:
+ gcryalg = GCRY_MD_SHA256;
+ break;
+
+ case GC_SHA384:
+ gcryalg = GCRY_MD_SHA384;
+ break;
+
+ case GC_SHA512:
+ gcryalg = GCRY_MD_SHA512;
+ break;
+
+ case GC_SHA224:
+ gcryalg = GCRY_MD_SHA224;
+ break;
+
+ case GC_RMD160:
+ gcryalg = GCRY_MD_RMD160;
+ break;
+
+ default:
+ rc = GC_INVALID_HASH;
+ }
+
+ switch (mode)
+ {
+ case 0:
+ gcrymode = 0;
+ break;
+
+ case GC_HMAC:
+ gcrymode = GCRY_MD_FLAG_HMAC;
+ break;
+
+ default:
+ rc = GC_INVALID_HASH;
+ }
+
+ if (rc == GC_OK && gcryalg != GCRY_MD_NONE)
+ {
+ err = gcry_md_open (&ctx->gch, gcryalg, gcrymode);
+ if (gcry_err_code (err))
+ rc = GC_INVALID_HASH;
+ }
+
+ if (rc == GC_OK)
+ *outhandle = ctx;
+ else
+ free (ctx);
+
+ return rc;
+}
+
+Gc_rc
+gc_hash_clone (gc_hash_handle handle, gc_hash_handle * outhandle)
+{
+ _gc_hash_ctx *in = handle;
+ _gc_hash_ctx *out;
+ int err;
+
+ *outhandle = out = calloc (sizeof (*out), 1);
+ if (!out)
+ return GC_MALLOC_ERROR;
+
+ memcpy (out, in, sizeof (*out));
+
+ err = gcry_md_copy (&out->gch, in->gch);
+ if (err)
+ {
+ free (out);
+ return GC_INVALID_HASH;
+ }
+
+ return GC_OK;
+}
+
+size_t
+gc_hash_digest_length (Gc_hash hash)
+{
+ size_t len;
+
+ switch (hash)
+ {
+ case GC_MD2:
+ len = GC_MD2_DIGEST_SIZE;
+ break;
+
+ case GC_MD4:
+ len = GC_MD4_DIGEST_SIZE;
+ break;
+
+ case GC_MD5:
+ len = GC_MD5_DIGEST_SIZE;
+ break;
+
+ case GC_RMD160:
+ len = GC_RMD160_DIGEST_SIZE;
+ break;
+
+ case GC_SHA1:
+ len = GC_SHA1_DIGEST_SIZE;
+ break;
+
+ case GC_SHA256:
+ len = GC_SHA256_DIGEST_SIZE;
+ break;
+
+ case GC_SHA384:
+ len = GC_SHA384_DIGEST_SIZE;
+ break;
+
+ case GC_SHA512:
+ len = GC_SHA512_DIGEST_SIZE;
+ break;
+
+ case GC_SHA224:
+ len = GC_SHA224_DIGEST_SIZE;
+ break;
+
+ default:
+ return 0;
+ }
+
+ return len;
+}
+
+void
+gc_hash_hmac_setkey (gc_hash_handle handle, size_t len, const char *key)
+{
+ _gc_hash_ctx *ctx = handle;
+#ifdef GNULIB_GC_MD2
+ if (ctx->alg != GC_MD2)
+#endif
+ gcry_md_setkey (ctx->gch, key, len);
+}
+
+void
+gc_hash_write (gc_hash_handle handle, size_t len, const char *data)
+{
+ _gc_hash_ctx *ctx = handle;
+
+#ifdef GNULIB_GC_MD2
+ if (ctx->alg == GC_MD2)
+ md2_process_bytes (data, len, &ctx->md2Context);
+ else
+#endif
+ gcry_md_write (ctx->gch, data, len);
+}
+
+const char *
+gc_hash_read (gc_hash_handle handle)
+{
+ _gc_hash_ctx *ctx = handle;
+ const char *digest;
+
+#ifdef GNULIB_GC_MD2
+ if (ctx->alg == GC_MD2)
+ {
+ md2_finish_ctx (&ctx->md2Context, ctx->hash);
+ digest = ctx->hash;
+ }
+ else
+#endif
+ {
+ gcry_md_final (ctx->gch);
+ digest = gcry_md_read (ctx->gch, 0);
+ }
+
+ return digest;
+}
+
+void
+gc_hash_close (gc_hash_handle handle)
+{
+ _gc_hash_ctx *ctx = handle;
+
+#ifdef GNULIB_GC_MD2
+ if (ctx->alg != GC_MD2)
+#endif
+ gcry_md_close (ctx->gch);
+
+ free (ctx);
+}
+
+Gc_rc
+gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *resbuf)
+{
+ int gcryalg;
+
+ switch (hash)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_buffer (in, inlen, resbuf);
+ return GC_OK;
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ gcryalg = GCRY_MD_MD4;
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ gcryalg = GCRY_MD_MD5;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ gcryalg = GCRY_MD_SHA1;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA256
+ case GC_SHA256:
+ gcryalg = GCRY_MD_SHA256;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA384
+ case GC_SHA384:
+ gcryalg = GCRY_MD_SHA384;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA512
+ case GC_SHA512:
+ gcryalg = GCRY_MD_SHA512;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA224
+ case GC_SHA224:
+ gcryalg = GCRY_MD_SHA224;
+ break;
+#endif
+
+#ifdef GNULIB_GC_RMD160
+ case GC_RMD160:
+ gcryalg = GCRY_MD_RMD160;
+ break;
+#endif
+
+ default:
+ return GC_INVALID_HASH;
+ }
+
+ gcry_md_hash_buffer (gcryalg, resbuf, in, inlen);
+
+ return GC_OK;
+}
+
+/* One-call interface. */
+
+#ifdef GNULIB_GC_MD2
+Gc_rc
+gc_md2 (const void *in, size_t inlen, void *resbuf)
+{
+ md2_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_MD4
+Gc_rc
+gc_md4 (const void *in, size_t inlen, void *resbuf)
+{
+ size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_MD4);
+ gcry_md_hd_t hd;
+ gpg_error_t err;
+ unsigned char *p;
+
+ assert (outlen == GC_MD4_DIGEST_SIZE);
+
+ err = gcry_md_open (&hd, GCRY_MD_MD4, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ gcry_md_write (hd, in, inlen);
+
+ p = gcry_md_read (hd, GCRY_MD_MD4);
+ if (p == NULL)
+ {
+ gcry_md_close (hd);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, p, outlen);
+
+ gcry_md_close (hd);
+
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_MD5
+Gc_rc
+gc_md5 (const void *in, size_t inlen, void *resbuf)
+{
+ size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_MD5);
+ gcry_md_hd_t hd;
+ gpg_error_t err;
+ unsigned char *p;
+
+ assert (outlen == GC_MD5_DIGEST_SIZE);
+
+ err = gcry_md_open (&hd, GCRY_MD_MD5, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ gcry_md_write (hd, in, inlen);
+
+ p = gcry_md_read (hd, GCRY_MD_MD5);
+ if (p == NULL)
+ {
+ gcry_md_close (hd);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, p, outlen);
+
+ gcry_md_close (hd);
+
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_SHA1
+Gc_rc
+gc_sha1 (const void *in, size_t inlen, void *resbuf)
+{
+ size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_SHA1);
+ gcry_md_hd_t hd;
+ gpg_error_t err;
+ unsigned char *p;
+
+ assert (outlen == GC_SHA1_DIGEST_SIZE);
+
+ err = gcry_md_open (&hd, GCRY_MD_SHA1, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ gcry_md_write (hd, in, inlen);
+
+ p = gcry_md_read (hd, GCRY_MD_SHA1);
+ if (p == NULL)
+ {
+ gcry_md_close (hd);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, p, outlen);
+
+ gcry_md_close (hd);
+
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_HMAC_MD5
+Gc_rc
+gc_hmac_md5 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf)
+{
+ size_t hlen = gcry_md_get_algo_dlen (GCRY_MD_MD5);
+ gcry_md_hd_t mdh;
+ unsigned char *hash;
+ gpg_error_t err;
+
+ assert (hlen == 16);
+
+ err = gcry_md_open (&mdh, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ err = gcry_md_setkey (mdh, key, keylen);
+ if (err != GPG_ERR_NO_ERROR)
+ {
+ gcry_md_close (mdh);
+ return GC_INVALID_HASH;
+ }
+
+ gcry_md_write (mdh, in, inlen);
+
+ hash = gcry_md_read (mdh, GCRY_MD_MD5);
+ if (hash == NULL)
+ {
+ gcry_md_close (mdh);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, hash, hlen);
+
+ gcry_md_close (mdh);
+
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_HMAC_SHA1
+Gc_rc
+gc_hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf)
+{
+ size_t hlen = gcry_md_get_algo_dlen (GCRY_MD_SHA1);
+ gcry_md_hd_t mdh;
+ unsigned char *hash;
+ gpg_error_t err;
+
+ assert (hlen == GC_SHA1_DIGEST_SIZE);
+
+ err = gcry_md_open (&mdh, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ err = gcry_md_setkey (mdh, key, keylen);
+ if (err != GPG_ERR_NO_ERROR)
+ {
+ gcry_md_close (mdh);
+ return GC_INVALID_HASH;
+ }
+
+ gcry_md_write (mdh, in, inlen);
+
+ hash = gcry_md_read (mdh, GCRY_MD_SHA1);
+ if (hash == NULL)
+ {
+ gcry_md_close (mdh);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, hash, hlen);
+
+ gcry_md_close (mdh);
+
+ return GC_OK;
+}
+#endif
diff --git a/gnulib/lib/gc-pbkdf2-sha1.c b/gnulib/lib/gc-pbkdf2-sha1.c
new file mode 100644
index 00000000..8ed95b3f
--- /dev/null
+++ b/gnulib/lib/gc-pbkdf2-sha1.c
@@ -0,0 +1,104 @@
+/* gc-pbkdf2-sha1.c --- Password-Based Key Derivation Function a'la PKCS#5
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "gc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Implement PKCS#5 PBKDF2 as per RFC 2898. The PRF to use is hard
+ coded to be HMAC-SHA1. Inputs are the password P of length PLEN,
+ the salt S of length SLEN, the iteration counter C (> 0), and the
+ desired derived output length DKLEN. Output buffer is DK which
+ must have room for at least DKLEN octets. The output buffer will
+ be filled with the derived data. */
+Gc_rc
+gc_pbkdf2_sha1 (const char *P, size_t Plen,
+ const char *S, size_t Slen,
+ unsigned int c,
+ char *DK, size_t dkLen)
+{
+ unsigned int hLen = 20;
+ char U[20];
+ char T[20];
+ unsigned int u;
+ unsigned int l;
+ unsigned int r;
+ unsigned int i;
+ unsigned int k;
+ int rc;
+ char *tmp;
+ size_t tmplen = Slen + 4;
+
+ if (c == 0)
+ return GC_PKCS5_INVALID_ITERATION_COUNT;
+
+ if (dkLen == 0)
+ return GC_PKCS5_INVALID_DERIVED_KEY_LENGTH;
+
+ if (dkLen > 4294967295U)
+ return GC_PKCS5_DERIVED_KEY_TOO_LONG;
+
+ l = ((dkLen - 1) / hLen) + 1;
+ r = dkLen - (l - 1) * hLen;
+
+ tmp = malloc (tmplen);
+ if (tmp == NULL)
+ return GC_MALLOC_ERROR;
+
+ memcpy (tmp, S, Slen);
+
+ for (i = 1; i <= l; i++)
+ {
+ memset (T, 0, hLen);
+
+ for (u = 1; u <= c; u++)
+ {
+ if (u == 1)
+ {
+ tmp[Slen + 0] = (i & 0xff000000) >> 24;
+ tmp[Slen + 1] = (i & 0x00ff0000) >> 16;
+ tmp[Slen + 2] = (i & 0x0000ff00) >> 8;
+ tmp[Slen + 3] = (i & 0x000000ff) >> 0;
+
+ rc = gc_hmac_sha1 (P, Plen, tmp, tmplen, U);
+ }
+ else
+ rc = gc_hmac_sha1 (P, Plen, U, hLen, U);
+
+ if (rc != GC_OK)
+ {
+ free (tmp);
+ return rc;
+ }
+
+ for (k = 0; k < hLen; k++)
+ T[k] ^= U[k];
+ }
+
+ memcpy (DK + (i - 1) * hLen, T, i == l ? r : hLen);
+ }
+
+ free (tmp);
+
+ return GC_OK;
+}
diff --git a/gnulib/lib/gc.h b/gnulib/lib/gc.h
new file mode 100644
index 00000000..03d27c17
--- /dev/null
+++ b/gnulib/lib/gc.h
@@ -0,0 +1,317 @@
+/* gc.h --- Header file for implementation agnostic crypto wrapper API.
+ * Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008 Simon Josefsson
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+#ifndef GC_H
+# define GC_H
+
+/* Get size_t. */
+# include <stddef.h>
+
+enum Gc_rc
+{
+ GC_OK = 0,
+ GC_MALLOC_ERROR,
+ GC_INIT_ERROR,
+ GC_RANDOM_ERROR,
+ GC_INVALID_CIPHER,
+ GC_INVALID_HASH,
+ GC_PKCS5_INVALID_ITERATION_COUNT,
+ GC_PKCS5_INVALID_DERIVED_KEY_LENGTH,
+ GC_PKCS5_DERIVED_KEY_TOO_LONG
+};
+typedef enum Gc_rc Gc_rc;
+
+/* Hash types. */
+enum Gc_hash
+{
+ GC_MD4,
+ GC_MD5,
+ GC_SHA1,
+ GC_MD2,
+ GC_RMD160,
+ GC_SHA256,
+ GC_SHA384,
+ GC_SHA512,
+ GC_SHA224
+};
+typedef enum Gc_hash Gc_hash;
+
+enum Gc_hash_mode
+{
+ GC_HMAC = 1
+};
+typedef enum Gc_hash_mode Gc_hash_mode;
+
+typedef void *gc_hash_handle;
+
+#define GC_MD2_DIGEST_SIZE 16
+#define GC_MD4_DIGEST_SIZE 16
+#define GC_MD5_DIGEST_SIZE 16
+#define GC_RMD160_DIGEST_SIZE 20
+#define GC_SHA1_DIGEST_SIZE 20
+#define GC_SHA256_DIGEST_SIZE 32
+#define GC_SHA384_DIGEST_SIZE 48
+#define GC_SHA512_DIGEST_SIZE 64
+#define GC_SHA224_DIGEST_SIZE 24
+
+/* Cipher types. */
+enum Gc_cipher
+{
+ GC_AES128,
+ GC_AES192,
+ GC_AES256,
+ GC_3DES,
+ GC_DES,
+ GC_ARCFOUR128,
+ GC_ARCFOUR40,
+ GC_ARCTWO40,
+ GC_CAMELLIA128,
+ GC_CAMELLIA256
+};
+typedef enum Gc_cipher Gc_cipher;
+
+enum Gc_cipher_mode
+{
+ GC_ECB,
+ GC_CBC,
+ GC_STREAM
+};
+typedef enum Gc_cipher_mode Gc_cipher_mode;
+
+typedef void *gc_cipher_handle;
+
+/* Call before respectively after any other functions. */
+extern Gc_rc gc_init (void);
+extern void gc_done (void);
+
+/* Memory allocation (avoid). */
+typedef void *(*gc_malloc_t) (size_t n);
+typedef int (*gc_secure_check_t) (const void *);
+typedef void *(*gc_realloc_t) (void *p, size_t n);
+typedef void (*gc_free_t) (void *);
+extern void gc_set_allocators (gc_malloc_t func_malloc,
+ gc_malloc_t secure_malloc,
+ gc_secure_check_t secure_check,
+ gc_realloc_t func_realloc,
+ gc_free_t func_free);
+
+/* Randomness. */
+extern Gc_rc gc_nonce (char *data, size_t datalen);
+extern Gc_rc gc_pseudo_random (char *data, size_t datalen);
+extern Gc_rc gc_random (char *data, size_t datalen);
+
+/* Ciphers. */
+extern Gc_rc gc_cipher_open (Gc_cipher cipher, Gc_cipher_mode mode,
+ gc_cipher_handle *outhandle);
+extern Gc_rc gc_cipher_setkey (gc_cipher_handle handle,
+ size_t keylen, const char *key);
+extern Gc_rc gc_cipher_setiv (gc_cipher_handle handle,
+ size_t ivlen, const char *iv);
+extern Gc_rc gc_cipher_encrypt_inline (gc_cipher_handle handle,
+ size_t len, char *data);
+extern Gc_rc gc_cipher_decrypt_inline (gc_cipher_handle handle,
+ size_t len, char *data);
+extern Gc_rc gc_cipher_close (gc_cipher_handle handle);
+
+/* Hashes. */
+
+extern Gc_rc gc_hash_open (Gc_hash hash, Gc_hash_mode mode,
+ gc_hash_handle *outhandle);
+extern Gc_rc gc_hash_clone (gc_hash_handle handle, gc_hash_handle *outhandle);
+extern size_t gc_hash_digest_length (Gc_hash hash);
+extern void gc_hash_hmac_setkey (gc_hash_handle handle,
+ size_t len, const char *key);
+extern void gc_hash_write (gc_hash_handle handle,
+ size_t len, const char *data);
+extern const char *gc_hash_read (gc_hash_handle handle);
+extern void gc_hash_close (gc_hash_handle handle);
+
+/* Compute a hash value over buffer IN of INLEN bytes size using the
+ algorithm HASH, placing the result in the pre-allocated buffer OUT.
+ The required size of OUT depends on HASH, and is generally
+ GC_<HASH>_DIGEST_SIZE. For example, for GC_MD5 the output buffer
+ must be 16 bytes. The return value is 0 (GC_OK) on success, or
+ another Gc_rc error code. */
+extern Gc_rc
+gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *out);
+
+/* One-call interface. */
+extern Gc_rc gc_md2 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_md4 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_md5 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_sha1 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_hmac_md5 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf);
+extern Gc_rc gc_hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf);
+
+/* Derive cryptographic keys from a password P of length PLEN, with
+ salt S of length SLEN, placing the result in pre-allocated buffer
+ DK of length DKLEN. An iteration count is specified in C, where a
+ larger value means this function take more time (typical iteration
+ counts are 1000-20000). This function "stretches" the key to be
+ exactly dkLen bytes long. GC_OK is returned on success, otherwise
+ an Gc_rc error code is returned. */
+extern Gc_rc
+gc_pbkdf2_sha1 (const char *P, size_t Plen,
+ const char *S, size_t Slen,
+ unsigned int c, char *DK, size_t dkLen);
+
+/*
+ TODO:
+
+ From: Simon Josefsson <jas@extundo.com>
+ Subject: Re: generic crypto
+ Newsgroups: gmane.comp.lib.gnulib.bugs
+ Cc: bug-gnulib@gnu.org
+ Date: Fri, 07 Oct 2005 12:50:57 +0200
+ Mail-Copies-To: nobody
+
+ Paul Eggert <eggert@CS.UCLA.EDU> writes:
+
+ > Simon Josefsson <jas@extundo.com> writes:
+ >
+ >> * Perhaps the /dev/?random reading should be separated into a separate
+ >> module? It might be useful outside of the gc layer too.
+ >
+ > Absolutely. I've been meaning to do that for months (for a "shuffle"
+ > program I want to add to coreutils), but hadn't gotten around to it.
+ > It would have to be generalized a bit. I'd like to have the file
+ > descriptor cached, for example.
+
+ I'll write a separate module for that part.
+
+ I think we should even add a good PRNG that is re-seeded from
+ /dev/?random frequently. GnuTLS can need a lot of random data on a
+ big server, more than /dev/random can supply. And /dev/urandom might
+ not be strong enough. Further, the security of /dev/?random can also
+ be questionable.
+
+ >> I'm also not sure about the names of those functions, they suggest
+ >> a more higher-level API than what is really offered (i.e., the
+ >> names "nonce" and "pseudo_random" and "random" imply certain
+ >> cryptographic properties).
+ >
+ > Could you expand a bit more on that? What is the relationship between
+ > nonce/pseudorandom/random and the /dev/ values you are using?
+
+ There is none, that is the problem.
+
+ Applications generally need different kind of "random" numbers.
+ Sometimes they just need some random data and doesn't care whether it
+ is possible for an attacker to compute the string (aka a "nonce").
+ Sometimes they need data that is very difficult to compute (i.e.,
+ computing it require inverting SHA1 or similar). Sometimes they need
+ data that is not possible to compute, i.e., it wants real entropy
+ collected over time on the system. Collecting the last kind of random
+ data is very expensive, so it must not be used too often. The second
+ kind of random data ("pseudo random") is typically generated by
+ seeding a good PRNG with a couple of hundred bytes of real entropy
+ from the "real random" data pool. The "nonce" is usually computed
+ using the PRNG as well, because PRNGs are usually fast.
+
+ Pseudo-random data is typically used for session keys. Strong random
+ data is often used to generate long-term keys (e.g., private RSA
+ keys).
+
+ Of course, there are many subtleties. There are several different
+ kind of nonce:s. Sometimes a nonce is just an ever-increasing
+ integer, starting from 0. Sometimes it is assumed to be unlikely to
+ be the same as previous nonces, but without a requirement that the
+ nonce is possible to guess. MD5(system clock) would thus suffice, if
+ it isn't called too often. You can guess what the next value will be,
+ but it will always be different.
+
+ The problem is that /dev/?random doesn't offer any kind of semantic
+ guarantees. But applications need an API that make that promise.
+
+ I think we should do this in several steps:
+
+ 1) Write a module that can read from /dev/?random.
+
+ 2) Add a module for a known-good PRNG suitable for random number
+ generation, that can be continuously re-seeded.
+
+ 3) Add a high-level module that provide various different randomness
+ functions. One for nonces, perhaps even different kind of nonces,
+ one for pseudo random data, and one for strong random data. It is
+ not clear whether we can hope to achieve the last one in a portable
+ way.
+
+ Further, it would be useful to allow users to provide their own
+ entropy source as a file, used to seed the PRNG or initialize the
+ strong randomness pool. This is used on embedded platforms that
+ doesn't have enough interrupts to hope to generate good random data.
+
+ > For example, why not use OpenBSD's /dev/arandom?
+
+ I don't trust ARC4. For example, recent cryptographic efforts
+ indicate that you must throw away the first 512 bytes generated from
+ the PRNG for it to be secure. I don't know whether OpenBSD do this.
+ Further, I recall some eprint paper on RC4 security that didn't
+ inspire confidence.
+
+ While I trust the random devices in OpenBSD more than
+ Solaris/AIX/HPUX/etc, I think that since we need something better on
+ Solaris/AIX/HPUX we'd might as well use it on OpenBSD or even Linux
+ too.
+
+ > Here is one thought. The user could specify a desired quality level
+ > range, and the implementation then would supply random data that is at
+ > least as good as the lower bound of the range. I.e., ihe
+ > implementation refuses to produce any random data if it can't generate
+ > data that is at least as good as the lower end of the range. The
+ > upper bound of the range is advice from the user not to be any more
+ > expensive than that, but the implementation can ignore the advice if
+ > it doesn't have anything cheaper.
+
+ I'm not sure this is a good idea. Users can't really be expected to
+ understand this. Further, applications need many different kind of
+ random data. Selecting the randomness level for each by the user will
+ be too complicated.
+
+ I think it is better if the application decide, from its cryptographic
+ requirement, what entropy quality it require, and call the proper API.
+ Meeting the implied semantic properties should be the job for gnulib.
+
+ >> Perhaps gc_dev_random and gc_dev_urandom?
+ >
+ > To some extent. I'd rather insulate the user from the details of
+ > where the random numbers come from. On the other hand we need to
+ > provide a way for applications to specify a file that contains
+ > random bits, so that people can override the defaults.
+
+ Agreed.
+
+ This may require some thinking before it is finalized. Is it ok to
+ install the GC module as-is meanwhile? Then I can continue to add the
+ stuff that GnuTLS need, and then come back to re-working the
+ randomness module. That way, we have two different projects that use
+ the code. GnuTLS includes the same randomness code that was in GNU
+ SASL and that is in the current gc module. I feel much more
+ comfortable working in small steps at a time, rather then working on
+ this for a long time in gnulib and only later integrate the stuff in
+ GnuTLS.
+
+ Thanks,
+ Simon
+ */
+
+#endif /* GC_H */
diff --git a/gnulib/lib/gcd.c b/gnulib/lib/gcd.c
new file mode 100644
index 00000000..5401fd65
--- /dev/null
+++ b/gnulib/lib/gcd.c
@@ -0,0 +1,87 @@
+/* Arithmetic.
+ Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ 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/>. */
+
+#include <config.h>
+
+/* This file can also be used to define gcd functions for other unsigned
+ types, such as 'unsigned long long' or 'uintmax_t'. */
+#ifndef WORD_T
+/* Specification. */
+# include "gcd.h"
+# define WORD_T unsigned long
+# define GCD gcd
+#endif
+
+#include <stdlib.h>
+
+/* Return the greatest common divisor of a > 0 and b > 0. */
+WORD_T
+GCD (WORD_T a, WORD_T b)
+{
+ /* Why no division, as in Euclid's algorithm? Because in Euclid's algorithm
+ the division result floor(a/b) or floor(b/a) is very often = 1 or = 2,
+ and nearly always < 8. A sequence of a few subtractions and tests is
+ faster than a division. */
+ /* Why not Euclid's algorithm? Because the two integers can be shifted by 1
+ bit in a single instruction, and the algorithm uses fewer variables than
+ Euclid's algorithm. */
+
+ WORD_T c = a | b;
+ c = c ^ (c - 1);
+ /* c = largest power of 2 that divides a and b. */
+
+ if (a & c)
+ {
+ if (b & c)
+ goto odd_odd;
+ else
+ goto odd_even;
+ }
+ else
+ {
+ if (b & c)
+ goto even_odd;
+ else
+ abort ();
+ }
+
+ for (;;)
+ {
+ odd_odd: /* a/c and b/c both odd */
+ if (a == b)
+ break;
+ if (a > b)
+ {
+ a = a - b;
+ even_odd: /* a/c even, b/c odd */
+ do
+ a = a >> 1;
+ while ((a & c) == 0);
+ }
+ else
+ {
+ b = b - a;
+ odd_even: /* a/c odd, b/c even */
+ do
+ b = b >> 1;
+ while ((b & c) == 0);
+ }
+ }
+
+ /* a = b */
+ return a;
+}
diff --git a/gnulib/lib/gcd.h b/gnulib/lib/gcd.h
new file mode 100644
index 00000000..db56b3f5
--- /dev/null
+++ b/gnulib/lib/gcd.h
@@ -0,0 +1,34 @@
+/* Arithmetic.
+ Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ 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/>. */
+
+#ifndef _GCD_H
+#define _GCD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return the greatest common divisor of a > 0 and b > 0. */
+extern unsigned long gcd (unsigned long a, unsigned long b);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GCD_H */
diff --git a/gnulib/lib/gen-uni-tables.c b/gnulib/lib/gen-uni-tables.c
new file mode 100644
index 00000000..502b9ff5
--- /dev/null
+++ b/gnulib/lib/gen-uni-tables.c
@@ -0,0 +1,8388 @@
+/* Generate Unicode conforming character classification tables and
+ line break properties tables and word break property tables and
+ decomposition/composition and case mapping tables from a UnicodeData file.
+ Copyright (C) 2000-2002, 2004, 2007-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2000-2002.
+
+ 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/>. */
+
+/* Usage example:
+ $ gen-uni-tables /usr/local/share/Unidata/UnicodeData.txt \
+ /usr/local/share/Unidata/PropList.txt \
+ /usr/local/share/Unidata/DerivedCoreProperties.txt \
+ /usr/local/share/Unidata/Scripts.txt \
+ /usr/local/share/Unidata/Blocks.txt \
+ /usr/local/share/Unidata/PropList-3.0.1.txt \
+ /usr/local/share/Unidata/EastAsianWidth.txt \
+ /usr/local/share/Unidata/LineBreak.txt \
+ /usr/local/share/Unidata/WordBreakProperty.txt \
+ /usr/local/share/Unidata/CompositionExclusions.txt \
+ /usr/local/share/Unidata/SpecialCasing.txt \
+ /usr/local/share/Unidata/CaseFolding.txt \
+ 5.1.0
+ */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/* ========================================================================= */
+
+/* Reading UnicodeData.txt. */
+/* See UCD.html. */
+
+/* This structure represents one line in the UnicodeData.txt file. */
+struct unicode_attribute
+{
+ const char *name; /* Character name */
+ const char *category; /* General category */
+ const char *combining; /* Canonical combining class */
+ const char *bidi; /* Bidirectional category */
+ const char *decomposition; /* Character decomposition mapping */
+ const char *decdigit; /* Decimal digit value */
+ const char *digit; /* Digit value */
+ const char *numeric; /* Numeric value */
+ bool mirrored; /* mirrored */
+ const char *oldname; /* Old Unicode 1.0 name */
+ const char *comment; /* Comment */
+ unsigned int upper; /* Uppercase mapping */
+ unsigned int lower; /* Lowercase mapping */
+ unsigned int title; /* Titlecase mapping */
+};
+
+/* Missing fields are represented with "" for strings, and NONE for
+ characters. */
+#define NONE (~(unsigned int)0)
+
+/* The entire contents of the UnicodeData.txt file. */
+struct unicode_attribute unicode_attributes [0x110000];
+
+/* Stores in unicode_attributes[i] the values from the given fields. */
+static void
+fill_attribute (unsigned int i,
+ const char *field1, const char *field2,
+ const char *field3, const char *field4,
+ const char *field5, const char *field6,
+ const char *field7, const char *field8,
+ const char *field9, const char *field10,
+ const char *field11, const char *field12,
+ const char *field13, const char *field14)
+{
+ struct unicode_attribute * uni;
+
+ if (i >= 0x110000)
+ {
+ fprintf (stderr, "index too large\n");
+ exit (1);
+ }
+ if (strcmp (field2, "Cs") == 0)
+ /* Surrogates are UTF-16 artefacts, not real characters. Ignore them. */
+ return;
+ uni = &unicode_attributes[i];
+ /* Copy the strings. */
+ uni->name = strdup (field1);
+ uni->category = (field2[0] == '\0' ? "" : strdup (field2));
+ uni->combining = (field3[0] == '\0' ? "" : strdup (field3));
+ uni->bidi = (field4[0] == '\0' ? "" : strdup (field4));
+ uni->decomposition = (field5[0] == '\0' ? "" : strdup (field5));
+ uni->decdigit = (field6[0] == '\0' ? "" : strdup (field6));
+ uni->digit = (field7[0] == '\0' ? "" : strdup (field7));
+ uni->numeric = (field8[0] == '\0' ? "" : strdup (field8));
+ uni->mirrored = (field9[0] == 'Y');
+ uni->oldname = (field10[0] == '\0' ? "" : strdup (field10));
+ uni->comment = (field11[0] == '\0' ? "" : strdup (field11));
+ uni->upper = (field12[0] =='\0' ? NONE : strtoul (field12, NULL, 16));
+ uni->lower = (field13[0] =='\0' ? NONE : strtoul (field13, NULL, 16));
+ uni->title = (field14[0] =='\0' ? NONE : strtoul (field14, NULL, 16));
+}
+
+/* Maximum length of a field in the UnicodeData.txt file. */
+#define FIELDLEN 120
+
+/* Reads the next field from STREAM. The buffer BUFFER has size FIELDLEN.
+ Reads up to (but excluding) DELIM.
+ Returns 1 when a field was successfully read, otherwise 0. */
+static int
+getfield (FILE *stream, char *buffer, int delim)
+{
+ int count = 0;
+ int c;
+
+ for (; (c = getc (stream)), (c != EOF && c != delim); )
+ {
+ /* The original unicode.org UnicodeData.txt file happens to have
+ CR/LF line terminators. Silently convert to LF. */
+ if (c == '\r')
+ continue;
+
+ /* Put c into the buffer. */
+ if (++count >= FIELDLEN - 1)
+ {
+ fprintf (stderr, "field longer than expected, increase FIELDLEN\n");
+ exit (1);
+ }
+ *buffer++ = c;
+ }
+
+ if (c == EOF)
+ return 0;
+
+ *buffer = '\0';
+ return 1;
+}
+
+/* Stores in unicode_attributes[] the entire contents of the UnicodeData.txt
+ file. */
+static void
+fill_attributes (const char *unicodedata_filename)
+{
+ unsigned int i, j;
+ FILE *stream;
+ char field0[FIELDLEN];
+ char field1[FIELDLEN];
+ char field2[FIELDLEN];
+ char field3[FIELDLEN];
+ char field4[FIELDLEN];
+ char field5[FIELDLEN];
+ char field6[FIELDLEN];
+ char field7[FIELDLEN];
+ char field8[FIELDLEN];
+ char field9[FIELDLEN];
+ char field10[FIELDLEN];
+ char field11[FIELDLEN];
+ char field12[FIELDLEN];
+ char field13[FIELDLEN];
+ char field14[FIELDLEN];
+ int lineno = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_attributes[i].name = NULL;
+
+ stream = fopen (unicodedata_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", unicodedata_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ int n;
+
+ lineno++;
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ';');
+ n += getfield (stream, field2, ';');
+ n += getfield (stream, field3, ';');
+ n += getfield (stream, field4, ';');
+ n += getfield (stream, field5, ';');
+ n += getfield (stream, field6, ';');
+ n += getfield (stream, field7, ';');
+ n += getfield (stream, field8, ';');
+ n += getfield (stream, field9, ';');
+ n += getfield (stream, field10, ';');
+ n += getfield (stream, field11, ';');
+ n += getfield (stream, field12, ';');
+ n += getfield (stream, field13, ';');
+ n += getfield (stream, field14, '\n');
+ if (n == 0)
+ break;
+ if (n != 15)
+ {
+ fprintf (stderr, "short line in '%s':%d\n",
+ unicodedata_filename, lineno);
+ exit (1);
+ }
+ i = strtoul (field0, NULL, 16);
+ if (field1[0] == '<'
+ && strlen (field1) >= 9
+ && strcmp (field1 + strlen(field1) - 8, ", First>") == 0)
+ {
+ /* Deal with a range. */
+ lineno++;
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ';');
+ n += getfield (stream, field2, ';');
+ n += getfield (stream, field3, ';');
+ n += getfield (stream, field4, ';');
+ n += getfield (stream, field5, ';');
+ n += getfield (stream, field6, ';');
+ n += getfield (stream, field7, ';');
+ n += getfield (stream, field8, ';');
+ n += getfield (stream, field9, ';');
+ n += getfield (stream, field10, ';');
+ n += getfield (stream, field11, ';');
+ n += getfield (stream, field12, ';');
+ n += getfield (stream, field13, ';');
+ n += getfield (stream, field14, '\n');
+ if (n != 15)
+ {
+ fprintf (stderr, "missing end range in '%s':%d\n",
+ unicodedata_filename, lineno);
+ exit (1);
+ }
+ if (!(field1[0] == '<'
+ && strlen (field1) >= 8
+ && strcmp (field1 + strlen (field1) - 7, ", Last>") == 0))
+ {
+ fprintf (stderr, "missing end range in '%s':%d\n",
+ unicodedata_filename, lineno);
+ exit (1);
+ }
+ field1[strlen (field1) - 7] = '\0';
+ j = strtoul (field0, NULL, 16);
+ for (; i <= j; i++)
+ fill_attribute (i, field1+1, field2, field3, field4, field5,
+ field6, field7, field8, field9, field10,
+ field11, field12, field13, field14);
+ }
+ else
+ {
+ /* Single character line */
+ fill_attribute (i, field1, field2, field3, field4, field5,
+ field6, field7, field8, field9, field10,
+ field11, field12, field13, field14);
+ }
+ }
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", unicodedata_filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* General category. */
+/* See Unicode 3.0 book, section 4.5,
+ UCD.html. */
+
+static bool
+is_category_L (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L');
+}
+
+static bool
+is_category_Lu (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 'u');
+}
+
+static bool
+is_category_Ll (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 'l');
+}
+
+static bool
+is_category_Lt (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 't');
+}
+
+static bool
+is_category_Lm (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 'm');
+}
+
+static bool
+is_category_Lo (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_M (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M');
+}
+
+static bool
+is_category_Mn (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M'
+ && unicode_attributes[ch].category[1] == 'n');
+}
+
+static bool
+is_category_Mc (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M'
+ && unicode_attributes[ch].category[1] == 'c');
+}
+
+static bool
+is_category_Me (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M'
+ && unicode_attributes[ch].category[1] == 'e');
+}
+
+static bool
+is_category_N (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N');
+}
+
+static bool
+is_category_Nd (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'd');
+}
+
+static bool
+is_category_Nl (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'l');
+}
+
+static bool
+is_category_No (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_P (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P');
+}
+
+static bool
+is_category_Pc (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'c');
+}
+
+static bool
+is_category_Pd (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'd');
+}
+
+static bool
+is_category_Ps (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 's');
+}
+
+static bool
+is_category_Pe (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'e');
+}
+
+static bool
+is_category_Pi (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'i');
+}
+
+static bool
+is_category_Pf (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'f');
+}
+
+static bool
+is_category_Po (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_S (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S');
+}
+
+static bool
+is_category_Sm (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'm');
+}
+
+static bool
+is_category_Sc (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'c');
+}
+
+static bool
+is_category_Sk (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'k');
+}
+
+static bool
+is_category_So (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_Z (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z');
+}
+
+static bool
+is_category_Zs (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && unicode_attributes[ch].category[1] == 's');
+}
+
+static bool
+is_category_Zl (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && unicode_attributes[ch].category[1] == 'l');
+}
+
+static bool
+is_category_Zp (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && unicode_attributes[ch].category[1] == 'p');
+}
+
+static bool
+is_category_C (unsigned int ch)
+{
+ return (unicode_attributes[ch].name == NULL
+ || unicode_attributes[ch].category[0] == 'C');
+}
+
+static bool
+is_category_Cc (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'C'
+ && unicode_attributes[ch].category[1] == 'c');
+}
+
+static bool
+is_category_Cf (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'C'
+ && unicode_attributes[ch].category[1] == 'f');
+}
+
+static bool
+is_category_Cs (unsigned int ch)
+{
+ return (ch >= 0xd800 && ch < 0xe000);
+}
+
+static bool
+is_category_Co (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'C'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_Cn (unsigned int ch)
+{
+ return (unicode_attributes[ch].name == NULL
+ && !(ch >= 0xd800 && ch < 0xe000));
+}
+
+/* Output a boolean property in a human readable format. */
+static void
+debug_output_predicate (const char *filename, bool (*predicate) (unsigned int))
+{
+ FILE *stream;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+#if 0 /* This yields huge text output. */
+ for (ch = 0; ch < 0x110000; ch++)
+ if (predicate (ch))
+ {
+ fprintf (stream, "0x%04X\n", ch);
+ }
+#else
+ for (ch = 0; ch < 0x110000; ch++)
+ if (predicate (ch))
+ {
+ unsigned int first = ch;
+ unsigned int last;
+
+ while (ch + 1 < 0x110000 && predicate (ch + 1))
+ ch++;
+ last = ch;
+ if (first < last)
+ fprintf (stream, "0x%04X..0x%04X\n", first, last);
+ else
+ fprintf (stream, "0x%04X\n", ch);
+ }
+#endif
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output the unit test for a boolean property. */
+static void
+output_predicate_test (const char *filename, bool (*predicate) (unsigned int), const char *expression)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Test the Unicode character type functions.\n");
+ fprintf (stream, " Copyright (C) 2007 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+ fprintf (stream, "#include \"test-predicate-part1.h\"\n");
+ fprintf (stream, "\n");
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ if (predicate (ch))
+ {
+ unsigned int first = ch;
+ unsigned int last;
+
+ while (ch + 1 < 0x110000 && predicate (ch + 1))
+ ch++;
+ last = ch;
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, 0x%04X }", first, last);
+ need_comma = true;
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ fprintf (stream, "\n");
+ fprintf (stream, "#define PREDICATE(c) %s\n", expression);
+ fprintf (stream, "#include \"test-predicate-part2.h\"\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE predicate_table
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3levelbit.h"
+
+/* Output a boolean property in a three-level bitmap. */
+static void
+output_predicate (const char *filename, bool (*predicate) (unsigned int), const char *name, const char *comment, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct predicate_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* %s of Unicode characters. */\n", comment);
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ t.p = 4; /* or: 5 */
+ t.q = 7; /* or: 6 */
+ predicate_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ if (predicate (ch))
+ predicate_table_add (&t, ch);
+
+ predicate_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ if (i != 1)
+ fprintf (stream, "#define header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int header[1];\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " /*unsigned*/ int level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "%s =\n", name);
+ fprintf (stream, "{\n");
+ fprintf (stream, " { %d },\n", ((uint32_t *) t.result)[1]);
+ fprintf (stream, " {");
+ if (t.level1_size > 1)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 1) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu * sizeof (int) / sizeof (short) + %5zu",
+ 1 + t.level1_size, (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 1)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 1)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 1) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu + %5zu * sizeof (short) / sizeof (int) + %5zu",
+ 1 + t.level1_size, t.level2_size << t.q, (offset - level3_offset) / sizeof (uint32_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 1)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 4)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 4) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%08X",
+ ((uint32_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 4)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output all categories. */
+static void
+output_categories (const char *version)
+{
+#define CATEGORY(C) \
+ debug_output_predicate ("unictype/categ_" #C ".txt", is_category_ ## C); \
+ output_predicate_test ("../tests/unictype/test-categ_" #C ".c", is_category_ ## C, "uc_is_general_category (c, UC_CATEGORY_" #C ")"); \
+ output_predicate ("unictype/categ_" #C ".h", is_category_ ## C, "u_categ_" #C, "Categories", version);
+ CATEGORY (L)
+ CATEGORY (Lu)
+ CATEGORY (Ll)
+ CATEGORY (Lt)
+ CATEGORY (Lm)
+ CATEGORY (Lo)
+ CATEGORY (M)
+ CATEGORY (Mn)
+ CATEGORY (Mc)
+ CATEGORY (Me)
+ CATEGORY (N)
+ CATEGORY (Nd)
+ CATEGORY (Nl)
+ CATEGORY (No)
+ CATEGORY (P)
+ CATEGORY (Pc)
+ CATEGORY (Pd)
+ CATEGORY (Ps)
+ CATEGORY (Pe)
+ CATEGORY (Pi)
+ CATEGORY (Pf)
+ CATEGORY (Po)
+ CATEGORY (S)
+ CATEGORY (Sm)
+ CATEGORY (Sc)
+ CATEGORY (Sk)
+ CATEGORY (So)
+ CATEGORY (Z)
+ CATEGORY (Zs)
+ CATEGORY (Zl)
+ CATEGORY (Zp)
+ CATEGORY (C)
+ CATEGORY (Cc)
+ CATEGORY (Cf)
+ CATEGORY (Cs)
+ CATEGORY (Co)
+ CATEGORY (Cn)
+#undef CATEGORY
+}
+
+enum
+{
+ UC_CATEGORY_MASK_L = 0x0000001f,
+ UC_CATEGORY_MASK_Lu = 0x00000001,
+ UC_CATEGORY_MASK_Ll = 0x00000002,
+ UC_CATEGORY_MASK_Lt = 0x00000004,
+ UC_CATEGORY_MASK_Lm = 0x00000008,
+ UC_CATEGORY_MASK_Lo = 0x00000010,
+ UC_CATEGORY_MASK_M = 0x000000e0,
+ UC_CATEGORY_MASK_Mn = 0x00000020,
+ UC_CATEGORY_MASK_Mc = 0x00000040,
+ UC_CATEGORY_MASK_Me = 0x00000080,
+ UC_CATEGORY_MASK_N = 0x00000700,
+ UC_CATEGORY_MASK_Nd = 0x00000100,
+ UC_CATEGORY_MASK_Nl = 0x00000200,
+ UC_CATEGORY_MASK_No = 0x00000400,
+ UC_CATEGORY_MASK_P = 0x0003f800,
+ UC_CATEGORY_MASK_Pc = 0x00000800,
+ UC_CATEGORY_MASK_Pd = 0x00001000,
+ UC_CATEGORY_MASK_Ps = 0x00002000,
+ UC_CATEGORY_MASK_Pe = 0x00004000,
+ UC_CATEGORY_MASK_Pi = 0x00008000,
+ UC_CATEGORY_MASK_Pf = 0x00010000,
+ UC_CATEGORY_MASK_Po = 0x00020000,
+ UC_CATEGORY_MASK_S = 0x003c0000,
+ UC_CATEGORY_MASK_Sm = 0x00040000,
+ UC_CATEGORY_MASK_Sc = 0x00080000,
+ UC_CATEGORY_MASK_Sk = 0x00100000,
+ UC_CATEGORY_MASK_So = 0x00200000,
+ UC_CATEGORY_MASK_Z = 0x01c00000,
+ UC_CATEGORY_MASK_Zs = 0x00400000,
+ UC_CATEGORY_MASK_Zl = 0x00800000,
+ UC_CATEGORY_MASK_Zp = 0x01000000,
+ UC_CATEGORY_MASK_C = 0x3e000000,
+ UC_CATEGORY_MASK_Cc = 0x02000000,
+ UC_CATEGORY_MASK_Cf = 0x04000000,
+ UC_CATEGORY_MASK_Cs = 0x08000000,
+ UC_CATEGORY_MASK_Co = 0x10000000,
+ UC_CATEGORY_MASK_Cn = 0x20000000
+};
+
+static int
+general_category_byname (const char *category_name)
+{
+ if (category_name[0] != '\0'
+ && (category_name[1] == '\0' || category_name[2] == '\0'))
+ switch (category_name[0])
+ {
+ case 'L':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_L;
+ case 'u': return UC_CATEGORY_MASK_Lu;
+ case 'l': return UC_CATEGORY_MASK_Ll;
+ case 't': return UC_CATEGORY_MASK_Lt;
+ case 'm': return UC_CATEGORY_MASK_Lm;
+ case 'o': return UC_CATEGORY_MASK_Lo;
+ }
+ break;
+ case 'M':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_M;
+ case 'n': return UC_CATEGORY_MASK_Mn;
+ case 'c': return UC_CATEGORY_MASK_Mc;
+ case 'e': return UC_CATEGORY_MASK_Me;
+ }
+ break;
+ case 'N':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_N;
+ case 'd': return UC_CATEGORY_MASK_Nd;
+ case 'l': return UC_CATEGORY_MASK_Nl;
+ case 'o': return UC_CATEGORY_MASK_No;
+ }
+ break;
+ case 'P':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_P;
+ case 'c': return UC_CATEGORY_MASK_Pc;
+ case 'd': return UC_CATEGORY_MASK_Pd;
+ case 's': return UC_CATEGORY_MASK_Ps;
+ case 'e': return UC_CATEGORY_MASK_Pe;
+ case 'i': return UC_CATEGORY_MASK_Pi;
+ case 'f': return UC_CATEGORY_MASK_Pf;
+ case 'o': return UC_CATEGORY_MASK_Po;
+ }
+ break;
+ case 'S':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_S;
+ case 'm': return UC_CATEGORY_MASK_Sm;
+ case 'c': return UC_CATEGORY_MASK_Sc;
+ case 'k': return UC_CATEGORY_MASK_Sk;
+ case 'o': return UC_CATEGORY_MASK_So;
+ }
+ break;
+ case 'Z':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_Z;
+ case 's': return UC_CATEGORY_MASK_Zs;
+ case 'l': return UC_CATEGORY_MASK_Zl;
+ case 'p': return UC_CATEGORY_MASK_Zp;
+ }
+ break;
+ case 'C':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_C;
+ case 'c': return UC_CATEGORY_MASK_Cc;
+ case 'f': return UC_CATEGORY_MASK_Cf;
+ case 's': return UC_CATEGORY_MASK_Cs;
+ case 'o': return UC_CATEGORY_MASK_Co;
+ case 'n': return UC_CATEGORY_MASK_Cn;
+ }
+ break;
+ }
+ /* Invalid category name. */
+ abort ();
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE category_table
+#define ELEMENT uint8_t
+#define DEFAULT 29 /* = log2(UC_CATEGORY_MASK_Cn) */
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character category table. */
+static void
+output_category (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct category_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ uint16_t *level3_packed;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Categories of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ category_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value;
+ unsigned int log2_value;
+
+ if (is_category_Cs (ch))
+ value = UC_CATEGORY_MASK_Cs;
+ else if (unicode_attributes[ch].name != NULL)
+ value = general_category_byname (unicode_attributes[ch].category);
+ else
+ continue;
+
+ /* Now value should contain exactly one bit. */
+ if (value == 0 || ((value & (value - 1)) != 0))
+ abort ();
+
+ for (log2_value = 0; value > 1; value >>= 1, log2_value++);
+
+ category_table_add (&t, ch, log2_value);
+ }
+
+ category_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define category_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned short level3[%zu * %d + 1];\n", t.level3_size,
+ (1 << t.p) * 5 / 16);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_category =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 5 bits only. Use 16-bit units,
+ not 32-bit units, in order to make the lookup function easier. */
+ level3_packed =
+ (uint16_t *)
+ calloc ((t.level3_size << t.p) * 5 / 16 + 1, sizeof (uint16_t));
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned int j = (i * 5) / 16;
+ unsigned int k = (i * 5) % 16;
+ uint32_t value = ((unsigned char *) (t.result + level3_offset))[i];
+ value = level3_packed[j] | (level3_packed[j+1] << 16) | (value << k);
+ level3_packed[j] = value & 0xffff;
+ level3_packed[j+1] = value >> 16;
+ }
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 5 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 5 / 16 + 1; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%04x", level3_packed[i]);
+ if (i+1 < (t.level3_size << t.p) * 5 / 16 + 1)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 5 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ free (level3_packed);
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Canonical combining class. */
+/* See Unicode 3.0 book, section 4.2,
+ UCD.html. */
+
+/* Construction of sparse 3-level tables. */
+#define TABLE combclass_table
+#define ELEMENT uint8_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character combining class table. */
+static void
+output_combclass (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct combclass_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Combining class of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ combclass_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ if (unicode_attributes[ch].name != NULL)
+ {
+ int value = atoi (unicode_attributes[ch].combining);
+ if (!(value >= 0 && value <= 255))
+ abort ();
+ combclass_table_add (&t, ch, value);
+ }
+
+ combclass_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define combclass_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_combclass =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %3d", ((uint8_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Bidirectional category. */
+/* See Unicode 3.0 book, section 4.3,
+ UCD.html. */
+
+enum
+{
+ UC_BIDI_L, /* Left-to-Right */
+ UC_BIDI_LRE, /* Left-to-Right Embedding */
+ UC_BIDI_LRO, /* Left-to-Right Override */
+ UC_BIDI_R, /* Right-to-Left */
+ UC_BIDI_AL, /* Right-to-Left Arabic */
+ UC_BIDI_RLE, /* Right-to-Left Embedding */
+ UC_BIDI_RLO, /* Right-to-Left Override */
+ UC_BIDI_PDF, /* Pop Directional Format */
+ UC_BIDI_EN, /* European Number */
+ UC_BIDI_ES, /* European Number Separator */
+ UC_BIDI_ET, /* European Number Terminator */
+ UC_BIDI_AN, /* Arabic Number */
+ UC_BIDI_CS, /* Common Number Separator */
+ UC_BIDI_NSM, /* Non-Spacing Mark */
+ UC_BIDI_BN, /* Boundary Neutral */
+ UC_BIDI_B, /* Paragraph Separator */
+ UC_BIDI_S, /* Segment Separator */
+ UC_BIDI_WS, /* Whitespace */
+ UC_BIDI_ON /* Other Neutral */
+};
+
+static int
+bidi_category_byname (const char *category_name)
+{
+ switch (category_name[0])
+ {
+ case 'A':
+ switch (category_name[1])
+ {
+ case 'L':
+ if (category_name[2] == '\0')
+ return UC_BIDI_AL;
+ break;
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_AN;
+ break;
+ }
+ break;
+ case 'B':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_B;
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_BN;
+ break;
+ }
+ break;
+ case 'C':
+ switch (category_name[1])
+ {
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_CS;
+ break;
+ }
+ break;
+ case 'E':
+ switch (category_name[1])
+ {
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_EN;
+ break;
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ES;
+ break;
+ case 'T':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ET;
+ break;
+ }
+ break;
+ case 'L':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_L;
+ case 'R':
+ switch (category_name[2])
+ {
+ case 'E':
+ if (category_name[3] == '\0')
+ return UC_BIDI_LRE;
+ break;
+ case 'O':
+ if (category_name[3] == '\0')
+ return UC_BIDI_LRO;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'N':
+ switch (category_name[1])
+ {
+ case 'S':
+ switch (category_name[2])
+ {
+ case 'M':
+ if (category_name[3] == '\0')
+ return UC_BIDI_NSM;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'O':
+ switch (category_name[1])
+ {
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ON;
+ break;
+ }
+ break;
+ case 'P':
+ switch (category_name[1])
+ {
+ case 'D':
+ switch (category_name[2])
+ {
+ case 'F':
+ if (category_name[3] == '\0')
+ return UC_BIDI_PDF;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'R':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_R;
+ case 'L':
+ switch (category_name[2])
+ {
+ case 'E':
+ if (category_name[3] == '\0')
+ return UC_BIDI_RLE;
+ break;
+ case 'O':
+ if (category_name[3] == '\0')
+ return UC_BIDI_RLO;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'S':
+ if (category_name[1] == '\0')
+ return UC_BIDI_S;
+ break;
+ case 'W':
+ switch (category_name[1])
+ {
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_WS;
+ break;
+ }
+ break;
+ }
+ /* Invalid bidi category name. */
+ abort ();
+}
+
+static int
+get_bidi_category (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL)
+ return bidi_category_byname (unicode_attributes[ch].bidi);
+ else
+ {
+ /* The bidi category of unassigned characters depends on the range.
+ See UTR #9 and DerivedBidiClass.txt. */
+ if ((ch >= 0x0590 && ch <= 0x05FF)
+ || (ch >= 0x07FB && ch <= 0x08FF)
+ || (ch >= 0xFB37 && ch <= 0xFB45)
+ || (ch >= 0x10800 && ch <= 0x10FFF))
+ return UC_BIDI_R;
+ else if ((ch >= 0x0600 && ch <= 0x07BF)
+ || (ch >= 0x2064 && ch <= 0x2069)
+ || (ch >= 0xFBB2 && ch <= 0xFDCF)
+ || (ch >= 0xFDFE && ch <= 0xFEFE))
+ return UC_BIDI_AL;
+ else if ((ch >= 0xFDD0 && ch <= 0xFDEF)
+ || (ch >= 0xFFF0 && ch <= 0xFFFF)
+ || (ch & 0xFFFF) == 0xFFFE
+ || (ch & 0xFFFF) == 0xFFFF
+ || (ch >= 0xE0000 && ch <= 0xE0FFF))
+ return UC_BIDI_BN;
+ else
+ return UC_BIDI_L;
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE bidi_category_table
+#define ELEMENT uint8_t
+#define DEFAULT UC_BIDI_L
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character bidi category table. */
+static void
+output_bidi_category (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct bidi_category_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ uint16_t *level3_packed;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Bidi categories of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ bidi_category_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = get_bidi_category (ch);
+
+ bidi_category_table_add (&t, ch, value);
+ }
+
+ bidi_category_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define bidi_category_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned short level3[%zu * %d + 1];\n", t.level3_size,
+ (1 << t.p) * 5 / 16);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_bidi_category =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 5 bits only. Use 16-bit units,
+ not 32-bit units, in order to make the lookup function easier. */
+ level3_packed =
+ (uint16_t *)
+ calloc ((t.level3_size << t.p) * 5 / 16 + 1, sizeof (uint16_t));
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned int j = (i * 5) / 16;
+ unsigned int k = (i * 5) % 16;
+ uint32_t value = ((unsigned char *) (t.result + level3_offset))[i];
+ value = level3_packed[j] | (level3_packed[j+1] << 16) | (value << k);
+ level3_packed[j] = value & 0xffff;
+ level3_packed[j+1] = value >> 16;
+ }
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 5 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 5 / 16 + 1; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%04x", level3_packed[i]);
+ if (i+1 < (t.level3_size << t.p) * 5 / 16 + 1)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 5 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ free (level3_packed);
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Decimal digit value. */
+/* See Unicode 3.0 book, section 4.6. */
+
+static int
+get_decdigit_value (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].decdigit[0] != '\0')
+ return atoi (unicode_attributes[ch].decdigit);
+ return -1;
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE decdigit_table
+#define ELEMENT uint8_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the unit test for the per-character decimal digit value table. */
+static void
+output_decimal_digit_test (const char *filename, const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Decimal digit values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = get_decdigit_value (ch);
+
+ if (!(value >= -1 && value < 10))
+ abort ();
+
+ if (value >= 0)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, %d }", ch, value);
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output the per-character decimal digit value table. */
+static void
+output_decimal_digit (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct decdigit_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Decimal digit values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ decdigit_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = 1 + get_decdigit_value (ch);
+
+ if (!(value >= 0 && value <= 10))
+ abort ();
+
+ decdigit_table_add (&t, ch, value);
+ }
+
+ decdigit_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define decdigit_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size,
+ t.p - 1);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_decdigit =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 4 bits only. */
+ fprintf (stream, " {");
+ if (t.level3_size << (t.p - 1) > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << (t.p - 1); i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%02x",
+ ((uint8_t *) (t.result + level3_offset))[2*i]
+ + (((uint8_t *) (t.result + level3_offset))[2*i+1] << 4));
+ if (i+1 < t.level3_size << (t.p - 1))
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << (t.p - 1) > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Digit value. */
+/* See Unicode 3.0 book, section 4.6. */
+
+static int
+get_digit_value (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].digit[0] != '\0')
+ return atoi (unicode_attributes[ch].digit);
+ return -1;
+}
+
+/* Output the unit test for the per-character digit value table. */
+static void
+output_digit_test (const char *filename, const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Digit values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = get_digit_value (ch);
+
+ if (!(value >= -1 && value < 10))
+ abort ();
+
+ if (value >= 0)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, %d }", ch, value);
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output the per-character digit value table. */
+static void
+output_digit (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct decdigit_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Digit values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ decdigit_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = 1 + get_digit_value (ch);
+
+ if (!(value >= 0 && value <= 10))
+ abort ();
+
+ decdigit_table_add (&t, ch, value);
+ }
+
+ decdigit_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define digit_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size,
+ t.p - 1);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_digit =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 4 bits only. */
+ fprintf (stream, " {");
+ if (t.level3_size << (t.p - 1) > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << (t.p - 1); i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%02x",
+ ((uint8_t *) (t.result + level3_offset))[2*i]
+ + (((uint8_t *) (t.result + level3_offset))[2*i+1] << 4));
+ if (i+1 < t.level3_size << (t.p - 1))
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << (t.p - 1) > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Numeric value. */
+/* See Unicode 3.0 book, section 4.6. */
+
+typedef struct { int numerator; int denominator; } uc_fraction_t;
+
+static uc_fraction_t
+get_numeric_value (unsigned int ch)
+{
+ uc_fraction_t value;
+
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].numeric[0] != '\0')
+ {
+ const char *str = unicode_attributes[ch].numeric;
+ /* str is of the form "integer" or "integer/posinteger". */
+ value.numerator = atoi (str);
+ if (strchr (str, '/') != NULL)
+ value.denominator = atoi (strchr (str, '/') + 1);
+ else
+ value.denominator = 1;
+ }
+ else
+ {
+ value.numerator = 0;
+ value.denominator = 0;
+ }
+ return value;
+}
+
+/* Output the unit test for the per-character numeric value table. */
+static void
+output_numeric_test (const char *filename, const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Numeric values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ uc_fraction_t value = get_numeric_value (ch);
+
+ if (value.numerator != 0 || value.denominator != 0)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, %d, %d }",
+ ch, value.numerator, value.denominator);
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE numeric_table
+#define ELEMENT uint8_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character numeric value table. */
+static void
+output_numeric (const char *filename, const char *version)
+{
+ FILE *stream;
+ uc_fraction_t fractions[128];
+ unsigned int nfractions;
+ unsigned int ch, i, j;
+ struct numeric_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ uint16_t *level3_packed;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Numeric values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ /* Create table of occurring fractions. */
+ nfractions = 0;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ uc_fraction_t value = get_numeric_value (ch);
+
+ for (i = 0; i < nfractions; i++)
+ if (value.numerator == fractions[i].numerator
+ && value.denominator == fractions[i].denominator)
+ break;
+ if (i == nfractions)
+ {
+ if (nfractions == 128)
+ abort ();
+ for (i = 0; i < nfractions; i++)
+ if (value.denominator < fractions[i].denominator
+ || (value.denominator == fractions[i].denominator
+ && value.numerator < fractions[i].numerator))
+ break;
+ for (j = nfractions; j > i; j--)
+ fractions[j] = fractions[j - 1];
+ fractions[i] = value;
+ nfractions++;
+ }
+ }
+
+ fprintf (stream, "static const uc_fraction_t u_numeric_values[%d] =\n",
+ nfractions);
+ fprintf (stream, "{\n");
+ for (i = 0; i < nfractions; i++)
+ {
+ fprintf (stream, " { %d, %d }", fractions[i].numerator,
+ fractions[i].denominator);
+ if (i+1 < nfractions)
+ fprintf (stream, ",");
+ fprintf (stream, "\n");
+ }
+ fprintf (stream, "};\n");
+
+ t.p = 7;
+ t.q = 9;
+ numeric_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ uc_fraction_t value = get_numeric_value (ch);
+
+ for (i = 0; i < nfractions; i++)
+ if (value.numerator == fractions[i].numerator
+ && value.denominator == fractions[i].denominator)
+ break;
+ if (i == nfractions)
+ abort ();
+
+ numeric_table_add (&t, ch, i);
+ }
+
+ numeric_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define numeric_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned short level3[%zu * %d + 1];\n", t.level3_size,
+ (1 << t.p) * 7 / 16);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_numeric =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 7 bits only. Use 16-bit units,
+ not 32-bit units, in order to make the lookup function easier. */
+ level3_packed =
+ (uint16_t *)
+ calloc ((t.level3_size << t.p) * 7 / 16 + 1, sizeof (uint16_t));
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned int j = (i * 7) / 16;
+ unsigned int k = (i * 7) % 16;
+ uint32_t value = ((unsigned char *) (t.result + level3_offset))[i];
+ value = level3_packed[j] | (level3_packed[j+1] << 16) | (value << k);
+ level3_packed[j] = value & 0xffff;
+ level3_packed[j+1] = value >> 16;
+ }
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 7 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 7 / 16 + 1; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%04x", level3_packed[i]);
+ if (i+1 < (t.level3_size << t.p) * 7 / 16 + 1)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 7 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ free (level3_packed);
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Mirrored. */
+/* See Unicode 3.0 book, section 4.7,
+ UAX #9. */
+
+/* List of mirrored character pairs. This is a subset of the characters
+ having the BidiMirrored property. */
+static unsigned int mirror_pairs[][2] =
+{
+ { 0x0028, 0x0029 },
+ { 0x003C, 0x003E },
+ { 0x005B, 0x005D },
+ { 0x007B, 0x007D },
+ { 0x00AB, 0x00BB },
+ { 0x2039, 0x203A },
+ { 0x2045, 0x2046 },
+ { 0x207D, 0x207E },
+ { 0x208D, 0x208E },
+ { 0x2208, 0x220B },
+ { 0x220A, 0x220D },
+ { 0x223C, 0x223D },
+ { 0x2243, 0x22CD },
+ { 0x2252, 0x2253 },
+ { 0x2254, 0x2255 },
+ { 0x2264, 0x2265 },
+ { 0x2266, 0x2267 },
+ { 0x226A, 0x226B },
+ { 0x2276, 0x2277 },
+ { 0x2278, 0x2279 },
+ { 0x227A, 0x227B },
+ { 0x227C, 0x227D },
+ { 0x2282, 0x2283 },
+ { 0x2286, 0x2287 },
+ { 0x228F, 0x2290 },
+ { 0x2291, 0x2292 },
+ { 0x22A2, 0x22A3 },
+ { 0x22B0, 0x22B1 },
+ { 0x22B2, 0x22B3 },
+ { 0x22B4, 0x22B5 },
+ { 0x22B6, 0x22B7 },
+ { 0x22C9, 0x22CA },
+ { 0x22CB, 0x22CC },
+ { 0x22D0, 0x22D1 },
+ { 0x22D6, 0x22D7 },
+ { 0x22D8, 0x22D9 },
+ { 0x22DA, 0x22DB },
+ { 0x22DC, 0x22DD },
+ { 0x22DE, 0x22DF },
+ { 0x22F0, 0x22F1 },
+ { 0x2308, 0x2309 },
+ { 0x230A, 0x230B },
+ { 0x2329, 0x232A },
+ { 0x3008, 0x3009 },
+ { 0x300A, 0x300B },
+ { 0x300C, 0x300D },
+ { 0x300E, 0x300F },
+ { 0x3010, 0x3011 },
+ { 0x3014, 0x3015 },
+ { 0x3016, 0x3017 },
+ { 0x3018, 0x3019 },
+ { 0x301A, 0x301B }
+};
+
+static int
+get_mirror_value (unsigned int ch)
+{
+ bool mirrored;
+ unsigned int mirror_char;
+ unsigned int i;
+
+ mirrored = (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].mirrored);
+ mirror_char = 0xfffd;
+ for (i = 0; i < sizeof (mirror_pairs) / sizeof (mirror_pairs[0]); i++)
+ if (ch == mirror_pairs[i][0])
+ {
+ mirror_char = mirror_pairs[i][1];
+ break;
+ }
+ else if (ch == mirror_pairs[i][1])
+ {
+ mirror_char = mirror_pairs[i][0];
+ break;
+ }
+ if (mirrored)
+ return (int) mirror_char - (int) ch;
+ else
+ {
+ if (mirror_char != 0xfffd)
+ abort ();
+ return 0;
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE mirror_table
+#define ELEMENT int32_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character mirror table. */
+static void
+output_mirror (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct mirror_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Mirrored Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ mirror_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = get_mirror_value (ch);
+
+ mirror_table_add (&t, ch, value);
+ }
+
+ mirror_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define mirror_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " int level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_mirror =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (int32_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %5d", ((int32_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Properties. */
+
+/* Reading PropList.txt and DerivedCoreProperties.txt. */
+enum
+{
+ /* PropList.txt */
+ PROP_WHITE_SPACE,
+ PROP_BIDI_CONTROL,
+ PROP_JOIN_CONTROL,
+ PROP_DASH,
+ PROP_HYPHEN,
+ PROP_QUOTATION_MARK,
+ PROP_TERMINAL_PUNCTUATION,
+ PROP_OTHER_MATH,
+ PROP_HEX_DIGIT,
+ PROP_ASCII_HEX_DIGIT,
+ PROP_OTHER_ALPHABETIC,
+ PROP_IDEOGRAPHIC,
+ PROP_DIACRITIC,
+ PROP_EXTENDER,
+ PROP_OTHER_LOWERCASE,
+ PROP_OTHER_UPPERCASE,
+ PROP_NONCHARACTER_CODE_POINT,
+ PROP_OTHER_GRAPHEME_EXTEND,
+ PROP_IDS_BINARY_OPERATOR,
+ PROP_IDS_TRINARY_OPERATOR,
+ PROP_RADICAL,
+ PROP_UNIFIED_IDEOGRAPH,
+ PROP_OTHER_DEFAULT_IGNORABLE_CODE_POINT,
+ PROP_DEPRECATED,
+ PROP_SOFT_DOTTED,
+ PROP_LOGICAL_ORDER_EXCEPTION,
+ PROP_OTHER_ID_START,
+ PROP_OTHER_ID_CONTINUE,
+ PROP_STERM,
+ PROP_VARIATION_SELECTOR,
+ PROP_PATTERN_WHITE_SPACE,
+ PROP_PATTERN_SYNTAX,
+ /* DerivedCoreProperties.txt */
+ PROP_MATH,
+ PROP_ALPHABETIC,
+ PROP_LOWERCASE,
+ PROP_UPPERCASE,
+ PROP_ID_START,
+ PROP_ID_CONTINUE,
+ PROP_XID_START,
+ PROP_XID_CONTINUE,
+ PROP_DEFAULT_IGNORABLE_CODE_POINT,
+ PROP_GRAPHEME_EXTEND,
+ PROP_GRAPHEME_BASE,
+ PROP_GRAPHEME_LINK
+};
+unsigned long long unicode_properties[0x110000];
+
+static void
+clear_properties (void)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_properties[i] = 0;
+}
+
+/* Stores in unicode_properties[] the properties from the
+ PropList.txt or DerivedCoreProperties.txt file. */
+static void
+fill_properties (const char *proplist_filename)
+{
+ unsigned int i;
+ FILE *stream;
+
+ stream = fopen (proplist_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", proplist_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char propname[200+1];
+ unsigned int propvalue;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^ ]", &i1, &i2, padding, propname) != 4)
+ {
+ if (sscanf (buf, "%X%[ ;]%[^ ]", &i1, padding, propname) != 3)
+ {
+ fprintf (stderr, "parse error in '%s'\n", proplist_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+#define PROP(name,value) \
+ if (strcmp (propname, name) == 0) propvalue = value; else
+ /* PropList.txt */
+ PROP ("White_Space", PROP_WHITE_SPACE)
+ PROP ("Bidi_Control", PROP_BIDI_CONTROL)
+ PROP ("Join_Control", PROP_JOIN_CONTROL)
+ PROP ("Dash", PROP_DASH)
+ PROP ("Hyphen", PROP_HYPHEN)
+ PROP ("Quotation_Mark", PROP_QUOTATION_MARK)
+ PROP ("Terminal_Punctuation", PROP_TERMINAL_PUNCTUATION)
+ PROP ("Other_Math", PROP_OTHER_MATH)
+ PROP ("Hex_Digit", PROP_HEX_DIGIT)
+ PROP ("ASCII_Hex_Digit", PROP_ASCII_HEX_DIGIT)
+ PROP ("Other_Alphabetic", PROP_OTHER_ALPHABETIC)
+ PROP ("Ideographic", PROP_IDEOGRAPHIC)
+ PROP ("Diacritic", PROP_DIACRITIC)
+ PROP ("Extender", PROP_EXTENDER)
+ PROP ("Other_Lowercase", PROP_OTHER_LOWERCASE)
+ PROP ("Other_Uppercase", PROP_OTHER_UPPERCASE)
+ PROP ("Noncharacter_Code_Point", PROP_NONCHARACTER_CODE_POINT)
+ PROP ("Other_Grapheme_Extend", PROP_OTHER_GRAPHEME_EXTEND)
+ PROP ("IDS_Binary_Operator", PROP_IDS_BINARY_OPERATOR)
+ PROP ("IDS_Trinary_Operator", PROP_IDS_TRINARY_OPERATOR)
+ PROP ("Radical", PROP_RADICAL)
+ PROP ("Unified_Ideograph", PROP_UNIFIED_IDEOGRAPH)
+ PROP ("Other_Default_Ignorable_Code_Point", PROP_OTHER_DEFAULT_IGNORABLE_CODE_POINT)
+ PROP ("Deprecated", PROP_DEPRECATED)
+ PROP ("Soft_Dotted", PROP_SOFT_DOTTED)
+ PROP ("Logical_Order_Exception", PROP_LOGICAL_ORDER_EXCEPTION)
+ PROP ("Other_ID_Start", PROP_OTHER_ID_START)
+ PROP ("Other_ID_Continue", PROP_OTHER_ID_CONTINUE)
+ PROP ("STerm", PROP_STERM)
+ PROP ("Variation_Selector", PROP_VARIATION_SELECTOR)
+ PROP ("Pattern_White_Space", PROP_PATTERN_WHITE_SPACE)
+ PROP ("Pattern_Syntax", PROP_PATTERN_SYNTAX)
+ /* DerivedCoreProperties.txt */
+ PROP ("Math", PROP_MATH)
+ PROP ("Alphabetic", PROP_ALPHABETIC)
+ PROP ("Lowercase", PROP_LOWERCASE)
+ PROP ("Uppercase", PROP_UPPERCASE)
+ PROP ("ID_Start", PROP_ID_START)
+ PROP ("ID_Continue", PROP_ID_CONTINUE)
+ PROP ("XID_Start", PROP_XID_START)
+ PROP ("XID_Continue", PROP_XID_CONTINUE)
+ PROP ("Default_Ignorable_Code_Point", PROP_DEFAULT_IGNORABLE_CODE_POINT)
+ PROP ("Grapheme_Extend", PROP_GRAPHEME_EXTEND)
+ PROP ("Grapheme_Base", PROP_GRAPHEME_BASE)
+ PROP ("Grapheme_Link", PROP_GRAPHEME_LINK)
+#undef PROP
+ {
+ fprintf (stderr, "unknown property named '%s' in '%s'\n", propname,
+ proplist_filename);
+ exit (1);
+ }
+ if (!(i1 <= i2 && i2 < 0x110000))
+ abort ();
+
+ for (i = i1; i <= i2; i++)
+ unicode_properties[i] |= 1ULL << propvalue;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", proplist_filename);
+ exit (1);
+ }
+}
+
+/* Stores in array the given property from the Unicode 3.0 PropList.txt
+ file. */
+static void
+fill_property30 (char array[0x110000], const char *proplist_filename, const char *property_name)
+{
+ unsigned int i;
+ FILE *stream;
+ char buf[100+1];
+
+ for (i = 0; i < 0x110000; i++)
+ array[i] = 0;
+
+ stream = fopen (proplist_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", proplist_filename);
+ exit (1);
+ }
+
+ /* Search for the "Property dump for: ..." line. */
+ do
+ {
+ if (fscanf (stream, "%100[^\n]\n", buf) < 1)
+ {
+ fprintf (stderr, "no property found in '%s'\n", proplist_filename);
+ exit (1);
+ }
+ }
+ while (strstr (buf, property_name) == NULL);
+
+ for (;;)
+ {
+ unsigned int i1, i2;
+
+ if (fscanf (stream, "%100[^\n]\n", buf) < 1)
+ break;
+ if (buf[0] == '*')
+ break;
+ if (strlen (buf) >= 10 && buf[4] == '.' && buf[5] == '.')
+ {
+ if (sscanf (buf, "%4X..%4X", &i1, &i2) < 2)
+ {
+ fprintf (stderr, "parse error in property in '%s'\n",
+ proplist_filename);
+ exit (1);
+ }
+ }
+ else if (strlen (buf) >= 4)
+ {
+ if (sscanf (buf, "%4X", &i1) < 1)
+ {
+ fprintf (stderr, "parse error in property in '%s'\n",
+ proplist_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+ else
+ {
+ fprintf (stderr, "parse error in property in '%s'\n",
+ proplist_filename);
+ exit (1);
+ }
+ if (!(i1 <= i2 && i2 < 0x110000))
+ abort ();
+ for (i = i1; i <= i2; i++)
+ array[i] = 1;
+ }
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", proplist_filename);
+ exit (1);
+ }
+}
+
+/* Properties from Unicode 3.0 PropList.txt file. */
+
+/* The paired punctuation property from the PropList.txt file. */
+char unicode_pairedpunctuation[0x110000];
+
+/* The left of pair property from the PropList.txt file. */
+char unicode_leftofpair[0x110000];
+
+static void
+fill_properties30 (const char *proplist30_filename)
+{
+ fill_property30 (unicode_pairedpunctuation, proplist30_filename, "(Paired Punctuation)");
+ fill_property30 (unicode_leftofpair, proplist30_filename, "(Left of Pair)");
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_white_space (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_WHITE_SPACE)) != 0);
+}
+
+/* See Unicode 3.0 book, section 4.10,
+ PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_alphabetic (unsigned int ch)
+{
+ bool result1 =
+ is_category_L (ch)
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_ALPHABETIC)) != 0)
+ /* For some reason, the following are listed as having property
+ Alphabetic but not as having property Other_Alphabetic. */
+ || (ch >= 0x16EE && ch <= 0x16F0) /* RUNIC SYMBOLS */
+ || (ch >= 0x2160 && ch <= 0x2182) /* ROMAN NUMERALS */
+ || (ch >= 0x2185 && ch <= 0x2188) /* ROMAN NUMERALS */
+ || (ch >= 0x24D0 && ch <= 0x24E9) /* CIRCLED LATIN SMALL LETTER */
+ || (ch == 0x3007) /* IDEOGRAPHIC NUMBER ZERO */
+ || (ch >= 0x3021 && ch <= 0x3029) /* HANGZHOU NUMERAL */
+ || (ch >= 0x3038 && ch <= 0x303A) /* HANGZHOU NUMERAL */
+ || (ch >= 0x10140 && ch <= 0x10174) /* GREEK ACROPHONICS */
+ || (ch == 0x10341) /* GOTHIC LETTER NINETY */
+ || (ch == 0x1034A) /* GOTHIC LETTER NINE HUNDRED */
+ || (ch >= 0x103D1 && ch <= 0x103D5) /* OLD PERSIAN NUMBERS */
+ || (ch >= 0x12400 && ch <= 0x12462); /* CUNEIFORM NUMERIC SIGNS */
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_ALPHABETIC)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_alphabetic (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_ALPHABETIC)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_not_a_character (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_NONCHARACTER_CODE_POINT)) != 0);
+}
+
+/* See PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_default_ignorable_code_point (unsigned int ch)
+{
+ bool result1 =
+ (is_category_Cf (ch)
+ && !(ch >= 0xFFF9 && ch <= 0xFFFB) /* Annotations */
+ && !((ch >= 0x0600 && ch <= 0x0603) || ch == 0x06DD || ch == 0x070F))
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_DEFAULT_IGNORABLE_CODE_POINT)) != 0)
+ || ((unicode_properties[ch] & (1ULL << PROP_VARIATION_SELECTOR)) != 0);
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_DEFAULT_IGNORABLE_CODE_POINT)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_default_ignorable_code_point (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_DEFAULT_IGNORABLE_CODE_POINT)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_deprecated (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_DEPRECATED)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_logical_order_exception (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_LOGICAL_ORDER_EXCEPTION)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_variation_selector (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_VARIATION_SELECTOR)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_private_use (unsigned int ch)
+{
+ /* Determined through "grep 'Private Use,' UnicodeData-3.1.0.txt". */
+ return (ch >= 0xE000 && ch <= 0xF8FF)
+ || (ch >= 0xF0000 && ch <= 0xFFFFD)
+ || (ch >= 0x100000 && ch <= 0x10FFFD);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_unassigned_code_value (unsigned int ch)
+{
+ return (is_category_Cn (ch) && !is_property_not_a_character (ch));
+}
+
+/* See PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_uppercase (unsigned int ch)
+{
+ bool result1 =
+ is_category_Lu (ch)
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_UPPERCASE)) != 0);
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_UPPERCASE)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_uppercase (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_UPPERCASE)) != 0);
+}
+
+/* See PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_lowercase (unsigned int ch)
+{
+ bool result1 =
+ is_category_Ll (ch)
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_LOWERCASE)) != 0);
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_LOWERCASE)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_lowercase (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_LOWERCASE)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_titlecase (unsigned int ch)
+{
+ return is_category_Lt (ch);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_soft_dotted (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_SOFT_DOTTED)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_id_start (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_ID_START)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_id_start (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_ID_START)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_id_continue (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_ID_CONTINUE)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_id_continue (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_ID_CONTINUE)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_xid_start (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_XID_START)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_xid_continue (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_XID_CONTINUE)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_pattern_white_space (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_PATTERN_WHITE_SPACE)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_pattern_syntax (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_PATTERN_SYNTAX)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_join_control (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_JOIN_CONTROL)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_grapheme_base (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_GRAPHEME_BASE)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_grapheme_extend (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_GRAPHEME_EXTEND)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_grapheme_extend (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_GRAPHEME_EXTEND)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_grapheme_link (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_GRAPHEME_LINK)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_bidi_control (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_BIDI_CONTROL)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_left_to_right (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_L);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_hebrew_right_to_left (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_R);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_arabic_right_to_left (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_AL);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_european_digit (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_EN);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_eur_num_separator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_ES);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_eur_num_terminator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_ET);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_arabic_digit (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_AN);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_common_separator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_CS);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_block_separator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_B);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_segment_separator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_S);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_whitespace (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_WS);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_non_spacing_mark (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_NSM);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_boundary_neutral (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_BN);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_pdf (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_PDF);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_embedding_or_override (unsigned int ch)
+{
+ int category = get_bidi_category (ch);
+ return (category == UC_BIDI_LRE || category == UC_BIDI_LRO
+ || category == UC_BIDI_RLE || category == UC_BIDI_RLO);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_other_neutral (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_ON);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_hex_digit (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_HEX_DIGIT)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_ascii_hex_digit (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_ASCII_HEX_DIGIT)) != 0);
+}
+
+/* See Unicode 3.0 book, section 4.10,
+ PropList.txt, UCD.html. */
+static bool
+is_property_ideographic (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_IDEOGRAPHIC)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_unified_ideograph (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_UNIFIED_IDEOGRAPH)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_radical (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_RADICAL)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_ids_binary_operator (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_IDS_BINARY_OPERATOR)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_ids_trinary_operator (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_IDS_TRINARY_OPERATOR)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_zero_width (unsigned int ch)
+{
+ return is_category_Cf (ch)
+ || (unicode_attributes[ch].name != NULL
+ && strstr (unicode_attributes[ch].name, "ZERO WIDTH") != NULL);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_space (unsigned int ch)
+{
+ return is_category_Zs (ch);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_non_break (unsigned int ch)
+{
+ /* This is exactly the set of characters having line breaking
+ property GL. */
+ return (ch == 0x00A0 /* NO-BREAK SPACE */
+ || ch == 0x034F /* COMBINING GRAPHEME JOINER */
+ || ch == 0x035C /* COMBINING DOUBLE BREVE BELOW */
+ || ch == 0x035D /* COMBINING DOUBLE BREVE */
+ || ch == 0x035E /* COMBINING DOUBLE MACRON */
+ || ch == 0x035F /* COMBINING DOUBLE MACRON BELOW */
+ || ch == 0x0360 /* COMBINING DOUBLE TILDE */
+ || ch == 0x0361 /* COMBINING DOUBLE INVERTED BREVE */
+ || ch == 0x0362 /* COMBINING DOUBLE RIGHTWARDS ARROW BELOW */
+ || ch == 0x0F08 /* TIBETAN MARK SBRUL SHAD */
+ || ch == 0x0F0C /* TIBETAN MARK DELIMITER TSHEG BSTAR */
+ || ch == 0x0F12 /* TIBETAN MARK RGYA GRAM SHAD */
+ || ch == 0x180E /* MONGOLIAN VOWEL SEPARATOR */
+ || ch == 0x2007 /* FIGURE SPACE */
+ || ch == 0x2011 /* NON-BREAKING HYPHEN */
+ || ch == 0x202F /* NARROW NO-BREAK SPACE */);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_iso_control (unsigned int ch)
+{
+ bool result1 =
+ (unicode_attributes[ch].name != NULL
+ && strcmp (unicode_attributes[ch].name, "<control>") == 0);
+ bool result2 =
+ is_category_Cc (ch);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_format_control (unsigned int ch)
+{
+ return (is_category_Cf (ch)
+ && get_bidi_category (ch) == UC_BIDI_BN
+ && !is_property_join_control (ch)
+ && ch != 0xFEFF);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_dash (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_DASH)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_hyphen (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_HYPHEN)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_punctuation (unsigned int ch)
+{
+ return is_category_P (ch);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_line_separator (unsigned int ch)
+{
+ return is_category_Zl (ch);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_paragraph_separator (unsigned int ch)
+{
+ return is_category_Zp (ch);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_quotation_mark (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_QUOTATION_MARK)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_sentence_terminal (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_STERM)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_terminal_punctuation (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_TERMINAL_PUNCTUATION)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_currency_symbol (unsigned int ch)
+{
+ return is_category_Sc (ch);
+}
+
+/* See Unicode 3.0 book, section 4.9,
+ PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_math (unsigned int ch)
+{
+ bool result1 =
+ is_category_Sm (ch)
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_MATH)) != 0);
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_MATH)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_math (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_MATH)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_paired_punctuation (unsigned int ch)
+{
+ return unicode_pairedpunctuation[ch];
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_left_of_pair (unsigned int ch)
+{
+ return unicode_leftofpair[ch];
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_combining (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && (strcmp (unicode_attributes[ch].combining, "0") != 0
+ || is_category_Mc (ch)
+ || is_category_Me (ch)
+ || is_category_Mn (ch)));
+}
+
+#if 0 /* same as is_property_bidi_non_spacing_mark */
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_non_spacing (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && get_bidi_category (ch) == UC_BIDI_NSM);
+}
+#endif
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_composite (unsigned int ch)
+{
+ /* This definition differs from the one in PropList-3.0.1.txt, but is more
+ logical in some sense. */
+ if (ch >= 0xAC00 && ch <= 0xD7A4) /* Hangul Syllables */
+ return true;
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].decomposition != NULL)
+ {
+ /* Test whether the decomposition contains more than one character,
+ and the first is not a space. */
+ const char *decomp = unicode_attributes[ch].decomposition;
+ if (decomp[0] == '<')
+ {
+ decomp = strchr (decomp, '>') + 1;
+ if (decomp[0] == ' ')
+ decomp++;
+ }
+ return strchr (decomp, ' ') != NULL && strncmp (decomp, "0020 ", 5) != 0;
+ }
+ return false;
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_decimal_digit (unsigned int ch)
+{
+ return is_category_Nd (ch);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_numeric (unsigned int ch)
+{
+ return ((get_numeric_value (ch)).denominator > 0)
+ || (ch == 0x09F8) /* BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR */
+ || (ch == 0x2183); /* ROMAN NUMERAL REVERSED ONE HUNDRED */
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_diacritic (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_DIACRITIC)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_extender (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_EXTENDER)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_ignorable_control (unsigned int ch)
+{
+ return ((is_category_Cc (ch) && get_bidi_category (ch) == UC_BIDI_BN)
+ || is_category_Cf (ch))
+ && ch != 0x0000;
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Output all properties. */
+static void
+output_properties (const char *version)
+{
+#define PROPERTY(P) \
+ debug_output_predicate ("unictype/pr_" #P ".txt", is_property_ ## P); \
+ output_predicate_test ("../tests/unictype/test-pr_" #P ".c", is_property_ ## P, "uc_is_property_" #P " (c)"); \
+ output_predicate ("unictype/pr_" #P ".h", is_property_ ## P, "u_property_" #P, "Properties", version);
+ PROPERTY(white_space)
+ PROPERTY(alphabetic)
+ PROPERTY(other_alphabetic)
+ PROPERTY(not_a_character)
+ PROPERTY(default_ignorable_code_point)
+ PROPERTY(other_default_ignorable_code_point)
+ PROPERTY(deprecated)
+ PROPERTY(logical_order_exception)
+ PROPERTY(variation_selector)
+ PROPERTY(private_use)
+ PROPERTY(unassigned_code_value)
+ PROPERTY(uppercase)
+ PROPERTY(other_uppercase)
+ PROPERTY(lowercase)
+ PROPERTY(other_lowercase)
+ PROPERTY(titlecase)
+ PROPERTY(soft_dotted)
+ PROPERTY(id_start)
+ PROPERTY(other_id_start)
+ PROPERTY(id_continue)
+ PROPERTY(other_id_continue)
+ PROPERTY(xid_start)
+ PROPERTY(xid_continue)
+ PROPERTY(pattern_white_space)
+ PROPERTY(pattern_syntax)
+ PROPERTY(join_control)
+ PROPERTY(grapheme_base)
+ PROPERTY(grapheme_extend)
+ PROPERTY(other_grapheme_extend)
+ PROPERTY(grapheme_link)
+ PROPERTY(bidi_control)
+ PROPERTY(bidi_left_to_right)
+ PROPERTY(bidi_hebrew_right_to_left)
+ PROPERTY(bidi_arabic_right_to_left)
+ PROPERTY(bidi_european_digit)
+ PROPERTY(bidi_eur_num_separator)
+ PROPERTY(bidi_eur_num_terminator)
+ PROPERTY(bidi_arabic_digit)
+ PROPERTY(bidi_common_separator)
+ PROPERTY(bidi_block_separator)
+ PROPERTY(bidi_segment_separator)
+ PROPERTY(bidi_whitespace)
+ PROPERTY(bidi_non_spacing_mark)
+ PROPERTY(bidi_boundary_neutral)
+ PROPERTY(bidi_pdf)
+ PROPERTY(bidi_embedding_or_override)
+ PROPERTY(bidi_other_neutral)
+ PROPERTY(hex_digit)
+ PROPERTY(ascii_hex_digit)
+ PROPERTY(ideographic)
+ PROPERTY(unified_ideograph)
+ PROPERTY(radical)
+ PROPERTY(ids_binary_operator)
+ PROPERTY(ids_trinary_operator)
+ PROPERTY(zero_width)
+ PROPERTY(space)
+ PROPERTY(non_break)
+ PROPERTY(iso_control)
+ PROPERTY(format_control)
+ PROPERTY(dash)
+ PROPERTY(hyphen)
+ PROPERTY(punctuation)
+ PROPERTY(line_separator)
+ PROPERTY(paragraph_separator)
+ PROPERTY(quotation_mark)
+ PROPERTY(sentence_terminal)
+ PROPERTY(terminal_punctuation)
+ PROPERTY(currency_symbol)
+ PROPERTY(math)
+ PROPERTY(other_math)
+ PROPERTY(paired_punctuation)
+ PROPERTY(left_of_pair)
+ PROPERTY(combining)
+ PROPERTY(composite)
+ PROPERTY(decimal_digit)
+ PROPERTY(numeric)
+ PROPERTY(diacritic)
+ PROPERTY(extender)
+ PROPERTY(ignorable_control)
+#undef PROPERTY
+}
+
+/* ========================================================================= */
+
+/* Scripts. */
+
+static const char *scripts[256];
+static unsigned int numscripts;
+
+static uint8_t unicode_scripts[0x110000];
+
+static void
+fill_scripts (const char *scripts_filename)
+{
+ FILE *stream;
+ unsigned int i;
+
+ stream = fopen (scripts_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", scripts_filename);
+ exit (1);
+ }
+
+ numscripts = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_scripts[i] = (uint8_t)~(uint8_t)0;
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char scriptname[200+1];
+ int script;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^ ]", &i1, &i2, padding, scriptname) != 4)
+ {
+ if (sscanf (buf, "%X%[ ;]%[^ ]", &i1, padding, scriptname) != 3)
+ {
+ fprintf (stderr, "parse error in '%s'\n", scripts_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+ if (i2 < i1)
+ abort ();
+ if (i2 >= 0x110000)
+ abort ();
+
+ for (script = numscripts - 1; script >= 0; script--)
+ if (strcmp (scripts[script], scriptname) == 0)
+ break;
+ if (script < 0)
+ {
+ scripts[numscripts] = strdup (scriptname);
+ script = numscripts;
+ numscripts++;
+ if (numscripts == 256)
+ abort ();
+ }
+
+ for (i = i1; i <= i2; i++)
+ {
+ if (unicode_scripts[i] != (uint8_t)~(uint8_t)0)
+ fprintf (stderr, "0x%04X belongs to multiple scripts\n", i);
+ unicode_scripts[i] = script;
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", scripts_filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE script_table
+#define ELEMENT uint8_t
+#define DEFAULT (uint8_t)~(uint8_t)0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_scripts (const char *version)
+{
+ const char *filename = "unictype/scripts.h";
+ FILE *stream;
+ unsigned int ch, s, i;
+ struct script_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ typedef struct
+ {
+ const char *lowercase_name;
+ }
+ scriptinfo_t;
+ scriptinfo_t scriptinfo[256];
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Unicode scripts. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ for (s = 0; s < numscripts; s++)
+ {
+ char *lcp = strdup (scripts[s]);
+ char *cp;
+
+ for (cp = lcp; *cp != '\0'; cp++)
+ if (*cp >= 'A' && *cp <= 'Z')
+ *cp += 'a' - 'A';
+
+ scriptinfo[s].lowercase_name = lcp;
+ }
+
+ for (s = 0; s < numscripts; s++)
+ {
+ fprintf (stream, "static const uc_interval_t script_%s_intervals[] =\n",
+ scriptinfo[s].lowercase_name);
+ fprintf (stream, "{\n");
+ i = 0;
+ for (ch = 0; ch < 0x110000; ch++)
+ if (unicode_scripts[ch] == s)
+ {
+ unsigned int start;
+ unsigned int end;
+
+ start = ch;
+ while (ch + 1 < 0x110000 && unicode_scripts[ch + 1] == s)
+ ch++;
+ end = ch;
+
+ if (i > 0)
+ fprintf (stream, ",\n");
+ if (start == end)
+ fprintf (stream, " { 0x%04X, 1, 1 }", start);
+ else
+ fprintf (stream, " { 0x%04X, 1, 0 }, { 0x%04X, 0, 1 }",
+ start, end);
+ i++;
+ }
+ fprintf (stream, "\n");
+ fprintf (stream, "};\n");
+ }
+
+ fprintf (stream, "static const uc_script_t scripts[%d] =\n", numscripts);
+ fprintf (stream, "{\n");
+ for (s = 0; s < numscripts; s++)
+ {
+ fprintf (stream, " {\n");
+ fprintf (stream, " sizeof (script_%s_intervals) / sizeof (uc_interval_t),\n",
+ scriptinfo[s].lowercase_name);
+ fprintf (stream, " script_%s_intervals,\n",
+ scriptinfo[s].lowercase_name);
+ fprintf (stream, " \"%s\"\n", scripts[s]);
+ fprintf (stream, " }");
+ if (s+1 < numscripts)
+ fprintf (stream, ",");
+ fprintf (stream, "\n");
+ }
+ fprintf (stream, "};\n");
+
+ t.p = 7;
+ t.q = 9;
+ script_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int s = unicode_scripts[ch];
+ if (s != (uint8_t)~(uint8_t)0)
+ script_table_add (&t, ch, s);
+ }
+
+ script_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define script_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_script =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %3d", ((uint8_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+static void
+output_scripts_byname (const char *version)
+{
+ const char *filename = "unictype/scripts_byname.gperf";
+ FILE *stream;
+ unsigned int s;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Unicode scripts. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "struct named_script { const char *name; unsigned int index; };\n");
+ fprintf (stream, "%%struct-type\n");
+ fprintf (stream, "%%language=ANSI-C\n");
+ fprintf (stream, "%%define hash-function-name scripts_hash\n");
+ fprintf (stream, "%%define lookup-function-name uc_script_lookup\n");
+ fprintf (stream, "%%readonly-tables\n");
+ fprintf (stream, "%%global-table\n");
+ fprintf (stream, "%%define word-array-name script_names\n");
+ fprintf (stream, "%%%%\n");
+ for (s = 0; s < numscripts; s++)
+ fprintf (stream, "%s, %u\n", scripts[s], s);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Blocks. */
+
+typedef struct { unsigned int start; unsigned int end; const char *name; }
+ block_t;
+static block_t blocks[256];
+static unsigned int numblocks;
+
+static void
+fill_blocks (const char *blocks_filename)
+{
+ FILE *stream;
+
+ stream = fopen (blocks_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", blocks_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char blockname[200+1];
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^\r]", &i1, &i2, padding, blockname) != 4)
+ {
+ fprintf (stderr, "parse error in '%s'\n", blocks_filename);
+ exit (1);
+ }
+ blocks[numblocks].start = i1;
+ blocks[numblocks].end = i2;
+ blocks[numblocks].name = strdup (blockname);
+ /* It must be sorted. */
+ if (numblocks > 0 && !(blocks[numblocks-1].end < blocks[numblocks].start))
+ abort ();
+ numblocks++;
+ if (numblocks == 256)
+ abort ();
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", blocks_filename);
+ exit (1);
+ }
+}
+
+/* Return the smallest block index among the blocks for characters >= ch. */
+static unsigned int
+block_first_index (unsigned int ch)
+{
+ /* Binary search. */
+ unsigned int lo = 0;
+ unsigned int hi = numblocks;
+ /* Invariants:
+ All blocks[i], i < lo, have blocks[i].end < ch,
+ all blocks[i], i >= hi, have blocks[i].end >= ch. */
+ while (lo < hi)
+ {
+ unsigned int mid = (lo + hi) / 2; /* >= lo, < hi */
+ if (blocks[mid].end < ch)
+ lo = mid + 1;
+ else
+ hi = mid;
+ }
+ return hi;
+}
+
+/* Return the largest block index among the blocks for characters <= ch,
+ plus 1. */
+static unsigned int
+block_last_index (unsigned int ch)
+{
+ /* Binary search. */
+ unsigned int lo = 0;
+ unsigned int hi = numblocks;
+ /* Invariants:
+ All blocks[i], i < lo, have blocks[i].start <= ch,
+ all blocks[i], i >= hi, have blocks[i].start > ch. */
+ while (lo < hi)
+ {
+ unsigned int mid = (lo + hi) / 2; /* >= lo, < hi */
+ if (blocks[mid].start <= ch)
+ lo = mid + 1;
+ else
+ hi = mid;
+ }
+ return hi;
+}
+
+static void
+output_blocks (const char *version)
+{
+ const char *filename = "unictype/blocks.h";
+ const unsigned int shift = 8; /* bits to shift away for array access */
+ const unsigned int threshold = 0x30000; /* cut-off table here to save space */
+ FILE *stream;
+ unsigned int i;
+ unsigned int i1;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Unicode blocks. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ fprintf (stream, "static const uc_block_t blocks[] =\n");
+ fprintf (stream, "{\n");
+ for (i = 0; i < numblocks; i++)
+ {
+ fprintf (stream, " { 0x%04X, 0x%04X, \"%s\" }", blocks[i].start,
+ blocks[i].end, blocks[i].name);
+ if (i+1 < numblocks)
+ fprintf (stream, ",");
+ fprintf (stream, "\n");
+ }
+ fprintf (stream, "};\n");
+ fprintf (stream, "#define blocks_level1_shift %d\n", shift);
+ fprintf (stream, "#define blocks_level1_threshold 0x%04X\n", threshold);
+ fprintf (stream, "static const uint8_t blocks_level1[%d * 2] =\n",
+ threshold >> shift);
+ fprintf (stream, "{\n");
+ for (i1 = 0; i1 < (threshold >> shift); i1++)
+ {
+ unsigned int first_index = block_first_index (i1 << shift);
+ unsigned int last_index = block_last_index (((i1 + 1) << shift) - 1);
+ fprintf (stream, " %3d, %3d", first_index, last_index);
+ if (i1+1 < (threshold >> shift))
+ fprintf (stream, ",");
+ fprintf (stream, "\n");
+ }
+ fprintf (stream, "};\n");
+ fprintf (stream, "#define blocks_upper_first_index %d\n",
+ block_first_index (threshold));
+ fprintf (stream, "#define blocks_upper_last_index %d\n",
+ block_last_index (0x10FFFF));
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* C and Java syntax. */
+
+enum
+{
+ UC_IDENTIFIER_START, /* valid as first or subsequent character */
+ UC_IDENTIFIER_VALID, /* valid as subsequent character only */
+ UC_IDENTIFIER_INVALID, /* not valid */
+ UC_IDENTIFIER_IGNORABLE /* ignorable (Java only) */
+};
+
+/* ISO C 99 section 6.4.(3). */
+static bool
+is_c_whitespace (unsigned int ch)
+{
+ return (ch == ' ' /* space */
+ || ch == '\t' /* horizontal tab */
+ || ch == '\n' || ch == '\r' /* new-line */
+ || ch == '\v' /* vertical tab */
+ || ch == '\f'); /* form-feed */
+}
+
+/* ISO C 99 section 6.4.2.1 and appendix D. */
+static int
+c_ident_category (unsigned int ch)
+{
+ /* Section 6.4.2.1. */
+ if (ch >= '0' && ch <= '9')
+ return UC_IDENTIFIER_VALID;
+ if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '_')
+ return UC_IDENTIFIER_START;
+ /* Appendix D. */
+ if (0
+ /* Latin */
+ || (ch == 0x00AA)
+ || (ch == 0x00BA)
+ || (ch >= 0x00C0 && ch <= 0x00D6)
+ || (ch >= 0x00D8 && ch <= 0x00F6)
+ || (ch >= 0x00F8 && ch <= 0x01F5)
+ || (ch >= 0x01FA && ch <= 0x0217)
+ || (ch >= 0x0250 && ch <= 0x02A8)
+ || (ch >= 0x1E00 && ch <= 0x1E9B)
+ || (ch >= 0x1EA0 && ch <= 0x1EF9)
+ || (ch == 0x207F)
+ /* Greek */
+ || (ch == 0x0386)
+ || (ch >= 0x0388 && ch <= 0x038A)
+ || (ch == 0x038C)
+ || (ch >= 0x038E && ch <= 0x03A1)
+ || (ch >= 0x03A3 && ch <= 0x03CE)
+ || (ch >= 0x03D0 && ch <= 0x03D6)
+ || (ch == 0x03DA)
+ || (ch == 0x03DC)
+ || (ch == 0x03DE)
+ || (ch == 0x03E0)
+ || (ch >= 0x03E2 && ch <= 0x03F3)
+ || (ch >= 0x1F00 && ch <= 0x1F15)
+ || (ch >= 0x1F18 && ch <= 0x1F1D)
+ || (ch >= 0x1F20 && ch <= 0x1F45)
+ || (ch >= 0x1F48 && ch <= 0x1F4D)
+ || (ch >= 0x1F50 && ch <= 0x1F57)
+ || (ch == 0x1F59)
+ || (ch == 0x1F5B)
+ || (ch == 0x1F5D)
+ || (ch >= 0x1F5F && ch <= 0x1F7D)
+ || (ch >= 0x1F80 && ch <= 0x1FB4)
+ || (ch >= 0x1FB6 && ch <= 0x1FBC)
+ || (ch >= 0x1FC2 && ch <= 0x1FC4)
+ || (ch >= 0x1FC6 && ch <= 0x1FCC)
+ || (ch >= 0x1FD0 && ch <= 0x1FD3)
+ || (ch >= 0x1FD6 && ch <= 0x1FDB)
+ || (ch >= 0x1FE0 && ch <= 0x1FEC)
+ || (ch >= 0x1FF2 && ch <= 0x1FF4)
+ || (ch >= 0x1FF6 && ch <= 0x1FFC)
+ /* Cyrillic */
+ || (ch >= 0x0401 && ch <= 0x040C)
+ || (ch >= 0x040E && ch <= 0x044F)
+ || (ch >= 0x0451 && ch <= 0x045C)
+ || (ch >= 0x045E && ch <= 0x0481)
+ || (ch >= 0x0490 && ch <= 0x04C4)
+ || (ch >= 0x04C7 && ch <= 0x04C8)
+ || (ch >= 0x04CB && ch <= 0x04CC)
+ || (ch >= 0x04D0 && ch <= 0x04EB)
+ || (ch >= 0x04EE && ch <= 0x04F5)
+ || (ch >= 0x04F8 && ch <= 0x04F9)
+ /* Armenian */
+ || (ch >= 0x0531 && ch <= 0x0556)
+ || (ch >= 0x0561 && ch <= 0x0587)
+ /* Hebrew */
+ || (ch >= 0x05B0 && ch <= 0x05B9)
+ || (ch >= 0x05BB && ch <= 0x05BD)
+ || (ch == 0x05BF)
+ || (ch >= 0x05C1 && ch <= 0x05C2)
+ || (ch >= 0x05D0 && ch <= 0x05EA)
+ || (ch >= 0x05F0 && ch <= 0x05F2)
+ /* Arabic */
+ || (ch >= 0x0621 && ch <= 0x063A)
+ || (ch >= 0x0640 && ch <= 0x0652)
+ || (ch >= 0x0670 && ch <= 0x06B7)
+ || (ch >= 0x06BA && ch <= 0x06BE)
+ || (ch >= 0x06C0 && ch <= 0x06CE)
+ || (ch >= 0x06D0 && ch <= 0x06DC)
+ || (ch >= 0x06E5 && ch <= 0x06E8)
+ || (ch >= 0x06EA && ch <= 0x06ED)
+ /* Devanagari */
+ || (ch >= 0x0901 && ch <= 0x0903)
+ || (ch >= 0x0905 && ch <= 0x0939)
+ || (ch >= 0x093E && ch <= 0x094D)
+ || (ch >= 0x0950 && ch <= 0x0952)
+ || (ch >= 0x0958 && ch <= 0x0963)
+ /* Bengali */
+ || (ch >= 0x0981 && ch <= 0x0983)
+ || (ch >= 0x0985 && ch <= 0x098C)
+ || (ch >= 0x098F && ch <= 0x0990)
+ || (ch >= 0x0993 && ch <= 0x09A8)
+ || (ch >= 0x09AA && ch <= 0x09B0)
+ || (ch == 0x09B2)
+ || (ch >= 0x09B6 && ch <= 0x09B9)
+ || (ch >= 0x09BE && ch <= 0x09C4)
+ || (ch >= 0x09C7 && ch <= 0x09C8)
+ || (ch >= 0x09CB && ch <= 0x09CD)
+ || (ch >= 0x09DC && ch <= 0x09DD)
+ || (ch >= 0x09DF && ch <= 0x09E3)
+ || (ch >= 0x09F0 && ch <= 0x09F1)
+ /* Gurmukhi */
+ || (ch == 0x0A02)
+ || (ch >= 0x0A05 && ch <= 0x0A0A)
+ || (ch >= 0x0A0F && ch <= 0x0A10)
+ || (ch >= 0x0A13 && ch <= 0x0A28)
+ || (ch >= 0x0A2A && ch <= 0x0A30)
+ || (ch >= 0x0A32 && ch <= 0x0A33)
+ || (ch >= 0x0A35 && ch <= 0x0A36)
+ || (ch >= 0x0A38 && ch <= 0x0A39)
+ || (ch >= 0x0A3E && ch <= 0x0A42)
+ || (ch >= 0x0A47 && ch <= 0x0A48)
+ || (ch >= 0x0A4B && ch <= 0x0A4D)
+ || (ch >= 0x0A59 && ch <= 0x0A5C)
+ || (ch == 0x0A5E)
+ || (ch == 0x0A74)
+ /* Gujarati */
+ || (ch >= 0x0A81 && ch <= 0x0A83)
+ || (ch >= 0x0A85 && ch <= 0x0A8B)
+ || (ch == 0x0A8D)
+ || (ch >= 0x0A8F && ch <= 0x0A91)
+ || (ch >= 0x0A93 && ch <= 0x0AA8)
+ || (ch >= 0x0AAA && ch <= 0x0AB0)
+ || (ch >= 0x0AB2 && ch <= 0x0AB3)
+ || (ch >= 0x0AB5 && ch <= 0x0AB9)
+ || (ch >= 0x0ABD && ch <= 0x0AC5)
+ || (ch >= 0x0AC7 && ch <= 0x0AC9)
+ || (ch >= 0x0ACB && ch <= 0x0ACD)
+ || (ch == 0x0AD0)
+ || (ch == 0x0AE0)
+ /* Oriya */
+ || (ch >= 0x0B01 && ch <= 0x0B03)
+ || (ch >= 0x0B05 && ch <= 0x0B0C)
+ || (ch >= 0x0B0F && ch <= 0x0B10)
+ || (ch >= 0x0B13 && ch <= 0x0B28)
+ || (ch >= 0x0B2A && ch <= 0x0B30)
+ || (ch >= 0x0B32 && ch <= 0x0B33)
+ || (ch >= 0x0B36 && ch <= 0x0B39)
+ || (ch >= 0x0B3E && ch <= 0x0B43)
+ || (ch >= 0x0B47 && ch <= 0x0B48)
+ || (ch >= 0x0B4B && ch <= 0x0B4D)
+ || (ch >= 0x0B5C && ch <= 0x0B5D)
+ || (ch >= 0x0B5F && ch <= 0x0B61)
+ /* Tamil */
+ || (ch >= 0x0B82 && ch <= 0x0B83)
+ || (ch >= 0x0B85 && ch <= 0x0B8A)
+ || (ch >= 0x0B8E && ch <= 0x0B90)
+ || (ch >= 0x0B92 && ch <= 0x0B95)
+ || (ch >= 0x0B99 && ch <= 0x0B9A)
+ || (ch == 0x0B9C)
+ || (ch >= 0x0B9E && ch <= 0x0B9F)
+ || (ch >= 0x0BA3 && ch <= 0x0BA4)
+ || (ch >= 0x0BA8 && ch <= 0x0BAA)
+ || (ch >= 0x0BAE && ch <= 0x0BB5)
+ || (ch >= 0x0BB7 && ch <= 0x0BB9)
+ || (ch >= 0x0BBE && ch <= 0x0BC2)
+ || (ch >= 0x0BC6 && ch <= 0x0BC8)
+ || (ch >= 0x0BCA && ch <= 0x0BCD)
+ /* Telugu */
+ || (ch >= 0x0C01 && ch <= 0x0C03)
+ || (ch >= 0x0C05 && ch <= 0x0C0C)
+ || (ch >= 0x0C0E && ch <= 0x0C10)
+ || (ch >= 0x0C12 && ch <= 0x0C28)
+ || (ch >= 0x0C2A && ch <= 0x0C33)
+ || (ch >= 0x0C35 && ch <= 0x0C39)
+ || (ch >= 0x0C3E && ch <= 0x0C44)
+ || (ch >= 0x0C46 && ch <= 0x0C48)
+ || (ch >= 0x0C4A && ch <= 0x0C4D)
+ || (ch >= 0x0C60 && ch <= 0x0C61)
+ /* Kannada */
+ || (ch >= 0x0C82 && ch <= 0x0C83)
+ || (ch >= 0x0C85 && ch <= 0x0C8C)
+ || (ch >= 0x0C8E && ch <= 0x0C90)
+ || (ch >= 0x0C92 && ch <= 0x0CA8)
+ || (ch >= 0x0CAA && ch <= 0x0CB3)
+ || (ch >= 0x0CB5 && ch <= 0x0CB9)
+ || (ch >= 0x0CBE && ch <= 0x0CC4)
+ || (ch >= 0x0CC6 && ch <= 0x0CC8)
+ || (ch >= 0x0CCA && ch <= 0x0CCD)
+ || (ch == 0x0CDE)
+ || (ch >= 0x0CE0 && ch <= 0x0CE1)
+ /* Malayalam */
+ || (ch >= 0x0D02 && ch <= 0x0D03)
+ || (ch >= 0x0D05 && ch <= 0x0D0C)
+ || (ch >= 0x0D0E && ch <= 0x0D10)
+ || (ch >= 0x0D12 && ch <= 0x0D28)
+ || (ch >= 0x0D2A && ch <= 0x0D39)
+ || (ch >= 0x0D3E && ch <= 0x0D43)
+ || (ch >= 0x0D46 && ch <= 0x0D48)
+ || (ch >= 0x0D4A && ch <= 0x0D4D)
+ || (ch >= 0x0D60 && ch <= 0x0D61)
+ /* Thai */
+ || (ch >= 0x0E01 && ch <= 0x0E3A)
+ || (ch >= 0x0E40 && ch <= 0x0E5B)
+ /* Lao */
+ || (ch >= 0x0E81 && ch <= 0x0E82)
+ || (ch == 0x0E84)
+ || (ch >= 0x0E87 && ch <= 0x0E88)
+ || (ch == 0x0E8A)
+ || (ch == 0x0E8D)
+ || (ch >= 0x0E94 && ch <= 0x0E97)
+ || (ch >= 0x0E99 && ch <= 0x0E9F)
+ || (ch >= 0x0EA1 && ch <= 0x0EA3)
+ || (ch == 0x0EA5)
+ || (ch == 0x0EA7)
+ || (ch >= 0x0EAA && ch <= 0x0EAB)
+ || (ch >= 0x0EAD && ch <= 0x0EAE)
+ || (ch >= 0x0EB0 && ch <= 0x0EB9)
+ || (ch >= 0x0EBB && ch <= 0x0EBD)
+ || (ch >= 0x0EC0 && ch <= 0x0EC4)
+ || (ch == 0x0EC6)
+ || (ch >= 0x0EC8 && ch <= 0x0ECD)
+ || (ch >= 0x0EDC && ch <= 0x0EDD)
+ /* Tibetan */
+ || (ch == 0x0F00)
+ || (ch >= 0x0F18 && ch <= 0x0F19)
+ || (ch == 0x0F35)
+ || (ch == 0x0F37)
+ || (ch == 0x0F39)
+ || (ch >= 0x0F3E && ch <= 0x0F47)
+ || (ch >= 0x0F49 && ch <= 0x0F69)
+ || (ch >= 0x0F71 && ch <= 0x0F84)
+ || (ch >= 0x0F86 && ch <= 0x0F8B)
+ || (ch >= 0x0F90 && ch <= 0x0F95)
+ || (ch == 0x0F97)
+ || (ch >= 0x0F99 && ch <= 0x0FAD)
+ || (ch >= 0x0FB1 && ch <= 0x0FB7)
+ || (ch == 0x0FB9)
+ /* Georgian */
+ || (ch >= 0x10A0 && ch <= 0x10C5)
+ || (ch >= 0x10D0 && ch <= 0x10F6)
+ /* Hiragana */
+ || (ch >= 0x3041 && ch <= 0x3093)
+ || (ch >= 0x309B && ch <= 0x309C)
+ /* Katakana */
+ || (ch >= 0x30A1 && ch <= 0x30F6)
+ || (ch >= 0x30FB && ch <= 0x30FC)
+ /* Bopomofo */
+ || (ch >= 0x3105 && ch <= 0x312C)
+ /* CJK Unified Ideographs */
+ || (ch >= 0x4E00 && ch <= 0x9FA5)
+ /* Hangul */
+ || (ch >= 0xAC00 && ch <= 0xD7A3)
+ /* Digits */
+ || (ch >= 0x0660 && ch <= 0x0669)
+ || (ch >= 0x06F0 && ch <= 0x06F9)
+ || (ch >= 0x0966 && ch <= 0x096F)
+ || (ch >= 0x09E6 && ch <= 0x09EF)
+ || (ch >= 0x0A66 && ch <= 0x0A6F)
+ || (ch >= 0x0AE6 && ch <= 0x0AEF)
+ || (ch >= 0x0B66 && ch <= 0x0B6F)
+ || (ch >= 0x0BE7 && ch <= 0x0BEF)
+ || (ch >= 0x0C66 && ch <= 0x0C6F)
+ || (ch >= 0x0CE6 && ch <= 0x0CEF)
+ || (ch >= 0x0D66 && ch <= 0x0D6F)
+ || (ch >= 0x0E50 && ch <= 0x0E59)
+ || (ch >= 0x0ED0 && ch <= 0x0ED9)
+ || (ch >= 0x0F20 && ch <= 0x0F33)
+ /* Special characters */
+ || (ch == 0x00B5)
+ || (ch == 0x00B7)
+ || (ch >= 0x02B0 && ch <= 0x02B8)
+ || (ch == 0x02BB)
+ || (ch >= 0x02BD && ch <= 0x02C1)
+ || (ch >= 0x02D0 && ch <= 0x02D1)
+ || (ch >= 0x02E0 && ch <= 0x02E4)
+ || (ch == 0x037A)
+ || (ch == 0x0559)
+ || (ch == 0x093D)
+ || (ch == 0x0B3D)
+ || (ch == 0x1FBE)
+ || (ch >= 0x203F && ch <= 0x2040)
+ || (ch == 0x2102)
+ || (ch == 0x2107)
+ || (ch >= 0x210A && ch <= 0x2113)
+ || (ch == 0x2115)
+ || (ch >= 0x2118 && ch <= 0x211D)
+ || (ch == 0x2124)
+ || (ch == 0x2126)
+ || (ch == 0x2128)
+ || (ch >= 0x212A && ch <= 0x2131)
+ || (ch >= 0x2133 && ch <= 0x2138)
+ || (ch >= 0x2160 && ch <= 0x2182)
+ || (ch >= 0x3005 && ch <= 0x3007)
+ || (ch >= 0x3021 && ch <= 0x3029)
+ )
+ return UC_IDENTIFIER_START;
+ return UC_IDENTIFIER_INVALID;
+}
+
+/* The Java Language Specification, 3rd edition, §3.6.
+ http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#95710 */
+static bool
+is_java_whitespace (unsigned int ch)
+{
+ return (ch == ' ' || ch == '\t' || ch == '\f'
+ || ch == '\n' || ch == '\r');
+}
+
+/* The Java Language Specification, 3rd edition, §3.8.
+ http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#40625
+ and Character.isJavaIdentifierStart and Character.isJavaIdentifierPart */
+static int
+java_ident_category (unsigned int ch)
+{
+ /* FIXME: Check this against Sun's JDK implementation. */
+ if (is_category_L (ch) /* = Character.isLetter(ch) */
+ || is_category_Nl (ch) /* = Character.getType(ch)==LETTER_NUMBER */
+ || is_category_Sc (ch) /* currency symbol */
+ || is_category_Pc (ch) /* connector punctuation */
+ )
+ return UC_IDENTIFIER_START;
+ if (is_category_Nd (ch) /* digit */
+ || is_category_Mc (ch) /* combining mark */
+ || is_category_Mn (ch) /* non-spacing mark */
+ )
+ return UC_IDENTIFIER_VALID;
+ if ((ch >= 0x0000 && ch <= 0x0008)
+ || (ch >= 0x000E && ch <= 0x001B)
+ || (ch >= 0x007F && ch <= 0x009F)
+ || is_category_Cf (ch) /* = Character.getType(ch)==FORMAT */
+ )
+ return UC_IDENTIFIER_IGNORABLE;
+ return UC_IDENTIFIER_INVALID;
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE identsyntax_table
+#define ELEMENT uint8_t
+#define DEFAULT UC_IDENTIFIER_INVALID
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output an identifier syntax categorization in a three-level bitmap. */
+static void
+output_ident_category (const char *filename, int (*predicate) (unsigned int), const char *name, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct identsyntax_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Language syntax properties of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-ctype.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7; /* or 8 */
+ t.q = 5; /* or 4 */
+ identsyntax_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int syntaxcode = predicate (ch);
+ if (syntaxcode != UC_IDENTIFIER_INVALID)
+ identsyntax_table_add (&t, ch, syntaxcode);
+ }
+
+ identsyntax_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define identsyntax_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned short level3[%zu * %d];\n", t.level3_size,
+ (1 << t.p) * 2 / 16);
+ fprintf (stream, " }\n");
+ fprintf (stream, "%s =\n", name);
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 2 bits only. */
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 2 / 16 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 2 / 16; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%04x",
+ (((uint8_t *) (t.result + level3_offset))[8 * i] << 0)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 1] << 2)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 2] << 4)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 3] << 6)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 4] << 8)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 5] << 10)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 6] << 12)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 7] << 14));
+ if (i+1 < (t.level3_size << t.p) * 2 / 16)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 2 / 16 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+static void
+output_ident_properties (const char *version)
+{
+#define PROPERTY(P) \
+ debug_output_predicate ("unictype/sy_" #P ".txt", is_ ## P); \
+ output_predicate_test ("../tests/unictype/test-sy_" #P ".c", is_ ## P, "uc_is_" #P " (c)"); \
+ output_predicate ("unictype/sy_" #P ".h", is_ ## P, "u_" #P, "Language syntax properties", version);
+ PROPERTY(c_whitespace)
+ PROPERTY(java_whitespace)
+#undef PROPERTY
+
+ output_ident_category ("unictype/sy_c_ident.h", c_ident_category, "u_c_ident", version);
+ output_ident_category ("unictype/sy_java_ident.h", java_ident_category, "u_java_ident", version);
+}
+
+/* ========================================================================= */
+
+/* Like ISO C <ctype.h> and <wctype.h>. Compatible to glibc's
+ glibc/localedata/locales/i18n file, generated by
+ glibc/localedata/gen-unicode-ctype.c. */
+
+/* Character mappings. */
+
+static unsigned int
+to_upper (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].upper != NONE)
+ return unicode_attributes[ch].upper;
+ else
+ return ch;
+}
+
+static unsigned int
+to_lower (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].lower != NONE)
+ return unicode_attributes[ch].lower;
+ else
+ return ch;
+}
+
+static unsigned int
+to_title (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].title != NONE)
+ return unicode_attributes[ch].title;
+ else
+ return ch;
+}
+
+/* Character class properties. */
+
+static bool
+is_upper (unsigned int ch)
+{
+ return (to_lower (ch) != ch);
+}
+
+static bool
+is_lower (unsigned int ch)
+{
+ return (to_upper (ch) != ch)
+ /* <U00DF> is lowercase, but without simple to_upper mapping. */
+ || (ch == 0x00DF);
+}
+
+static bool
+is_alpha (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && ((unicode_attributes[ch].category[0] == 'L'
+ /* Theppitak Karoonboonyanan <thep@links.nectec.or.th> says
+ <U0E2F>, <U0E46> should belong to is_punct. */
+ && (ch != 0x0E2F) && (ch != 0x0E46))
+ /* Theppitak Karoonboonyanan <thep@links.nectec.or.th> says
+ <U0E31>, <U0E34>..<U0E3A>, <U0E47>..<U0E4E> are is_alpha. */
+ || (ch == 0x0E31)
+ || (ch >= 0x0E34 && ch <= 0x0E3A)
+ || (ch >= 0x0E47 && ch <= 0x0E4E)
+ /* Avoid warning for <U0345>. */
+ || (ch == 0x0345)
+ /* Avoid warnings for <U2160>..<U217F>. */
+ || (unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'l')
+ /* Avoid warnings for <U24B6>..<U24E9>. */
+ || (unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'o'
+ && strstr (unicode_attributes[ch].name, " LETTER ")
+ != NULL)
+ /* Consider all the non-ASCII digits as alphabetic.
+ ISO C 99 forbids us to have them in category "digit",
+ but we want iswalnum to return true on them. */
+ || (unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'd'
+ && !(ch >= 0x0030 && ch <= 0x0039))));
+}
+
+static bool
+is_digit (unsigned int ch)
+{
+#if 0
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'd');
+ /* Note: U+0BE7..U+0BEF and U+1369..U+1371 are digit systems without
+ a zero. Must add <0> in front of them by hand. */
+#else
+ /* SUSV2 gives us some freedom for the "digit" category, but ISO C 99
+ takes it away:
+ 7.25.2.1.5:
+ The iswdigit function tests for any wide character that corresponds
+ to a decimal-digit character (as defined in 5.2.1).
+ 5.2.1:
+ the 10 decimal digits 0 1 2 3 4 5 6 7 8 9
+ */
+ return (ch >= 0x0030 && ch <= 0x0039);
+#endif
+}
+
+static bool
+is_outdigit (unsigned int ch)
+{
+ return (ch >= 0x0030 && ch <= 0x0039);
+}
+
+static bool
+is_alnum (unsigned int ch)
+{
+ return is_alpha (ch) || is_digit (ch);
+}
+
+static bool
+is_blank (unsigned int ch)
+{
+ return (ch == 0x0009 /* '\t' */
+ /* Category Zs without mention of "<noBreak>" */
+ || (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && unicode_attributes[ch].category[1] == 's'
+ && !strstr (unicode_attributes[ch].decomposition, "<noBreak>")));
+}
+
+static bool
+is_space (unsigned int ch)
+{
+ /* Don't make U+00A0 a space. Non-breaking space means that all programs
+ should treat it like a punctuation character, not like a space. */
+ return (ch == 0x0020 /* ' ' */
+ || ch == 0x000C /* '\f' */
+ || ch == 0x000A /* '\n' */
+ || ch == 0x000D /* '\r' */
+ || ch == 0x0009 /* '\t' */
+ || ch == 0x000B /* '\v' */
+ /* Categories Zl, Zp, and Zs without mention of "<noBreak>" */
+ || (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && (unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 'p'
+ || (unicode_attributes[ch].category[1] == 's'
+ && !strstr (unicode_attributes[ch].decomposition,
+ "<noBreak>")))));
+}
+
+static bool
+is_cntrl (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && (strcmp (unicode_attributes[ch].name, "<control>") == 0
+ /* Categories Zl and Zp */
+ || (unicode_attributes[ch].category[0] == 'Z'
+ && (unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 'p'))));
+}
+
+static bool
+is_xdigit (unsigned int ch)
+{
+#if 0
+ return is_digit (ch)
+ || (ch >= 0x0041 && ch <= 0x0046)
+ || (ch >= 0x0061 && ch <= 0x0066);
+#else
+ /* SUSV2 gives us some freedom for the "xdigit" category, but ISO C 99
+ takes it away:
+ 7.25.2.1.12:
+ The iswxdigit function tests for any wide character that corresponds
+ to a hexadecimal-digit character (as defined in 6.4.4.1).
+ 6.4.4.1:
+ hexadecimal-digit: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
+ */
+ return (ch >= 0x0030 && ch <= 0x0039)
+ || (ch >= 0x0041 && ch <= 0x0046)
+ || (ch >= 0x0061 && ch <= 0x0066);
+#endif
+}
+
+static bool
+is_graph (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && strcmp (unicode_attributes[ch].name, "<control>")
+ && !is_space (ch));
+}
+
+static bool
+is_print (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && strcmp (unicode_attributes[ch].name, "<control>")
+ /* Categories Zl and Zp */
+ && !(unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && (unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 'p')));
+}
+
+static bool
+is_punct (unsigned int ch)
+{
+#if 0
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P');
+#else
+ /* The traditional POSIX definition of punctuation is every graphic,
+ non-alphanumeric character. */
+ return (is_graph (ch) && !is_alpha (ch) && !is_digit (ch));
+#endif
+}
+
+/* Output all properties. */
+static void
+output_old_ctype (const char *version)
+{
+#define PROPERTY(P) \
+ debug_output_predicate ("unictype/ctype_" #P ".txt", is_ ## P); \
+ output_predicate_test ("../tests/unictype/test-ctype_" #P ".c", is_ ## P, "uc_is_" #P " (c)"); \
+ output_predicate ("unictype/ctype_" #P ".h", is_ ## P, "u_is_" #P, "ISO C <ctype.h> like properties", version);
+ PROPERTY(alnum)
+ PROPERTY(alpha)
+ PROPERTY(cntrl)
+ PROPERTY(digit)
+ PROPERTY(graph)
+ PROPERTY(lower)
+ PROPERTY(print)
+ PROPERTY(punct)
+ PROPERTY(space)
+ PROPERTY(upper)
+ PROPERTY(xdigit)
+ PROPERTY(blank)
+#undef PROPERTY
+}
+
+#if 0
+
+static bool
+is_combining (unsigned int ch)
+{
+ /* Up to Unicode 3.0.1 we took the Combining property from the PropList.txt
+ file. In 3.0.1 it was identical to the union of the general categories
+ "Mn", "Mc", "Me". In Unicode 3.1 this property has been dropped from the
+ PropList.txt file, so we take the latter definition. */
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M'
+ && (unicode_attributes[ch].category[1] == 'n'
+ || unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'e'));
+}
+
+static bool
+is_combining_level3 (unsigned int ch)
+{
+ return is_combining (ch)
+ && !(unicode_attributes[ch].combining[0] != '\0'
+ && unicode_attributes[ch].combining[0] != '0'
+ && strtoul (unicode_attributes[ch].combining, NULL, 10) >= 200);
+}
+
+/* Return the UCS symbol string for a Unicode character. */
+static const char *
+ucs_symbol (unsigned int i)
+{
+ static char buf[11+1];
+
+ sprintf (buf, (i < 0x10000 ? "<U%04X>" : "<U%08X>"), i);
+ return buf;
+}
+
+/* Return the UCS symbol range string for a Unicode characters interval. */
+static const char *
+ucs_symbol_range (unsigned int low, unsigned int high)
+{
+ static char buf[24+1];
+
+ strcpy (buf, ucs_symbol (low));
+ strcat (buf, "..");
+ strcat (buf, ucs_symbol (high));
+ return buf;
+}
+
+/* Output a character class (= property) table. */
+
+static void
+output_charclass (FILE *stream, const char *classname,
+ bool (*func) (unsigned int))
+{
+ char table[0x110000];
+ unsigned int i;
+ bool need_semicolon;
+ const int max_column = 75;
+ int column;
+
+ for (i = 0; i < 0x110000; i++)
+ table[i] = (int) func (i);
+
+ fprintf (stream, "%s ", classname);
+ need_semicolon = false;
+ column = 1000;
+ for (i = 0; i < 0x110000; )
+ {
+ if (!table[i])
+ i++;
+ else
+ {
+ unsigned int low, high;
+ char buf[25];
+
+ low = i;
+ do
+ i++;
+ while (i < 0x110000 && table[i]);
+ high = i - 1;
+
+ if (low == high)
+ strcpy (buf, ucs_symbol (low));
+ else
+ strcpy (buf, ucs_symbol_range (low, high));
+
+ if (need_semicolon)
+ {
+ fprintf (stream, ";");
+ column++;
+ }
+
+ if (column + strlen (buf) > max_column)
+ {
+ fprintf (stream, "/\n ");
+ column = 3;
+ }
+
+ fprintf (stream, "%s", buf);
+ column += strlen (buf);
+ need_semicolon = true;
+ }
+ }
+ fprintf (stream, "\n");
+}
+
+/* Output a character mapping table. */
+
+static void
+output_charmap (FILE *stream, const char *mapname,
+ unsigned int (*func) (unsigned int))
+{
+ char table[0x110000];
+ unsigned int i;
+ bool need_semicolon;
+ const int max_column = 75;
+ int column;
+
+ for (i = 0; i < 0x110000; i++)
+ table[i] = (func (i) != i);
+
+ fprintf (stream, "%s ", mapname);
+ need_semicolon = false;
+ column = 1000;
+ for (i = 0; i < 0x110000; i++)
+ if (table[i])
+ {
+ char buf[25+1];
+
+ strcpy (buf, "(");
+ strcat (buf, ucs_symbol (i));
+ strcat (buf, ",");
+ strcat (buf, ucs_symbol (func (i)));
+ strcat (buf, ")");
+
+ if (need_semicolon)
+ {
+ fprintf (stream, ";");
+ column++;
+ }
+
+ if (column + strlen (buf) > max_column)
+ {
+ fprintf (stream, "/\n ");
+ column = 3;
+ }
+
+ fprintf (stream, "%s", buf);
+ column += strlen (buf);
+ need_semicolon = true;
+ }
+ fprintf (stream, "\n");
+}
+
+/* Output the width table. */
+
+static void
+output_widthmap (FILE *stream)
+{
+}
+
+/* Output the tables to the given file. */
+
+static void
+output_tables (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "escape_char /\n");
+ fprintf (stream, "comment_char %%\n");
+ fprintf (stream, "\n");
+ fprintf (stream, "%% Generated automatically by gen-unicode-ctype for Unicode %s.\n",
+ version);
+ fprintf (stream, "\n");
+
+ fprintf (stream, "LC_IDENTIFICATION\n");
+ fprintf (stream, "title \"Unicode %s FDCC-set\"\n", version);
+ fprintf (stream, "source \"UnicodeData.txt, PropList.txt\"\n");
+ fprintf (stream, "address \"\"\n");
+ fprintf (stream, "contact \"\"\n");
+ fprintf (stream, "email \"bug-glibc@gnu.org\"\n");
+ fprintf (stream, "tel \"\"\n");
+ fprintf (stream, "fax \"\"\n");
+ fprintf (stream, "language \"\"\n");
+ fprintf (stream, "territory \"Earth\"\n");
+ fprintf (stream, "revision \"%s\"\n", version);
+ {
+ time_t now;
+ char date[11];
+ now = time (NULL);
+ strftime (date, sizeof (date), "%Y-%m-%d", gmtime (&now));
+ fprintf (stream, "date \"%s\"\n", date);
+ }
+ fprintf (stream, "category \"unicode:2001\";LC_CTYPE\n");
+ fprintf (stream, "END LC_IDENTIFICATION\n");
+ fprintf (stream, "\n");
+
+ /* Verifications. */
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ /* toupper restriction: "Only characters specified for the keywords
+ lower and upper shall be specified. */
+ if (to_upper (ch) != ch && !(is_lower (ch) || is_upper (ch)))
+ fprintf (stderr,
+ "%s is not upper|lower but toupper(0x%04X) = 0x%04X\n",
+ ucs_symbol (ch), ch, to_upper (ch));
+
+ /* tolower restriction: "Only characters specified for the keywords
+ lower and upper shall be specified. */
+ if (to_lower (ch) != ch && !(is_lower (ch) || is_upper (ch)))
+ fprintf (stderr,
+ "%s is not upper|lower but tolower(0x%04X) = 0x%04X\n",
+ ucs_symbol (ch), ch, to_lower (ch));
+
+ /* alpha restriction: "Characters classified as either upper or lower
+ shall automatically belong to this class. */
+ if ((is_lower (ch) || is_upper (ch)) && !is_alpha (ch))
+ fprintf (stderr, "%s is upper|lower but not alpha\n", ucs_symbol (ch));
+
+ /* alpha restriction: "No character specified for the keywords cntrl,
+ digit, punct or space shall be specified." */
+ if (is_alpha (ch) && is_cntrl (ch))
+ fprintf (stderr, "%s is alpha and cntrl\n", ucs_symbol (ch));
+ if (is_alpha (ch) && is_digit (ch))
+ fprintf (stderr, "%s is alpha and digit\n", ucs_symbol (ch));
+ if (is_alpha (ch) && is_punct (ch))
+ fprintf (stderr, "%s is alpha and punct\n", ucs_symbol (ch));
+ if (is_alpha (ch) && is_space (ch))
+ fprintf (stderr, "%s is alpha and space\n", ucs_symbol (ch));
+
+ /* space restriction: "No character specified for the keywords upper,
+ lower, alpha, digit, graph or xdigit shall be specified."
+ upper, lower, alpha already checked above. */
+ if (is_space (ch) && is_digit (ch))
+ fprintf (stderr, "%s is space and digit\n", ucs_symbol (ch));
+ if (is_space (ch) && is_graph (ch))
+ fprintf (stderr, "%s is space and graph\n", ucs_symbol (ch));
+ if (is_space (ch) && is_xdigit (ch))
+ fprintf (stderr, "%s is space and xdigit\n", ucs_symbol (ch));
+
+ /* cntrl restriction: "No character specified for the keywords upper,
+ lower, alpha, digit, punct, graph, print or xdigit shall be
+ specified." upper, lower, alpha already checked above. */
+ if (is_cntrl (ch) && is_digit (ch))
+ fprintf (stderr, "%s is cntrl and digit\n", ucs_symbol (ch));
+ if (is_cntrl (ch) && is_punct (ch))
+ fprintf (stderr, "%s is cntrl and punct\n", ucs_symbol (ch));
+ if (is_cntrl (ch) && is_graph (ch))
+ fprintf (stderr, "%s is cntrl and graph\n", ucs_symbol (ch));
+ if (is_cntrl (ch) && is_print (ch))
+ fprintf (stderr, "%s is cntrl and print\n", ucs_symbol (ch));
+ if (is_cntrl (ch) && is_xdigit (ch))
+ fprintf (stderr, "%s is cntrl and xdigit\n", ucs_symbol (ch));
+
+ /* punct restriction: "No character specified for the keywords upper,
+ lower, alpha, digit, cntrl, xdigit or as the <space> character shall
+ be specified." upper, lower, alpha, cntrl already checked above. */
+ if (is_punct (ch) && is_digit (ch))
+ fprintf (stderr, "%s is punct and digit\n", ucs_symbol (ch));
+ if (is_punct (ch) && is_xdigit (ch))
+ fprintf (stderr, "%s is punct and xdigit\n", ucs_symbol (ch));
+ if (is_punct (ch) && (ch == 0x0020))
+ fprintf (stderr, "%s is punct\n", ucs_symbol (ch));
+
+ /* graph restriction: "No character specified for the keyword cntrl
+ shall be specified." Already checked above. */
+
+ /* print restriction: "No character specified for the keyword cntrl
+ shall be specified." Already checked above. */
+
+ /* graph - print relation: differ only in the <space> character.
+ How is this possible if there are more than one space character?!
+ I think susv2/xbd/locale.html should speak of "space characters",
+ not "space character". */
+ if (is_print (ch) && !(is_graph (ch) || /* ch == 0x0020 */ is_space (ch)))
+ fprintf (stderr,
+ "%s is print but not graph|<space>\n", ucs_symbol (ch));
+ if (!is_print (ch) && (is_graph (ch) || ch == 0x0020))
+ fprintf (stderr,
+ "%s is graph|<space> but not print\n", ucs_symbol (ch));
+ }
+
+ fprintf (stream, "LC_CTYPE\n");
+ output_charclass (stream, "upper", is_upper);
+ output_charclass (stream, "lower", is_lower);
+ output_charclass (stream, "alpha", is_alpha);
+ output_charclass (stream, "digit", is_digit);
+ output_charclass (stream, "outdigit", is_outdigit);
+ output_charclass (stream, "blank", is_blank);
+ output_charclass (stream, "space", is_space);
+ output_charclass (stream, "cntrl", is_cntrl);
+ output_charclass (stream, "punct", is_punct);
+ output_charclass (stream, "xdigit", is_xdigit);
+ output_charclass (stream, "graph", is_graph);
+ output_charclass (stream, "print", is_print);
+ output_charclass (stream, "class \"combining\";", is_combining);
+ output_charclass (stream, "class \"combining_level3\";", is_combining_level3);
+ output_charmap (stream, "toupper", to_upper);
+ output_charmap (stream, "tolower", to_lower);
+ output_charmap (stream, "map \"totitle\";", to_title);
+ output_widthmap (stream);
+ fprintf (stream, "END LC_CTYPE\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+#endif
+
+/* ========================================================================= */
+
+/* The width property from the EastAsianWidth.txt file.
+ Each is NULL (unassigned) or "N", "A", "H", "W", "F", "Na". */
+const char * unicode_width[0x110000];
+
+/* Stores in unicode_width[] the width property from the EastAsianWidth.txt
+ file. */
+static void
+fill_width (const char *width_filename)
+{
+ unsigned int i, j;
+ FILE *stream;
+ char field0[FIELDLEN];
+ char field1[FIELDLEN];
+ char field2[FIELDLEN];
+ int lineno = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_width[i] = (unicode_attributes[i].name != NULL ? "N" : NULL);
+
+ stream = fopen (width_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", width_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ int n;
+ int c;
+
+ lineno++;
+ c = getc (stream);
+ if (c == EOF)
+ break;
+ if (c == '#')
+ {
+ do c = getc (stream); while (c != EOF && c != '\n');
+ continue;
+ }
+ ungetc (c, stream);
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ' ');
+ n += getfield (stream, field2, '\n');
+ if (n == 0)
+ break;
+ if (n != 3)
+ {
+ fprintf (stderr, "short line in '%s':%d\n", width_filename, lineno);
+ exit (1);
+ }
+ i = strtoul (field0, NULL, 16);
+ if (strstr (field0, "..") != NULL)
+ {
+ /* Deal with a range. */
+ j = strtoul (strstr (field0, "..") + 2, NULL, 16);
+ for (; i <= j; i++)
+ unicode_width[i] = strdup (field1);
+ }
+ else
+ {
+ /* Single character line. */
+ unicode_width[i] = strdup (field1);
+ }
+ }
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", width_filename);
+ exit (1);
+ }
+}
+
+/* Line breaking classification. */
+
+enum
+{
+ /* Values >= 24 are resolved at run time. */
+ LBP_BK = 24, /* mandatory break */
+/*LBP_CR, carriage return - not used here because it's a DOSism */
+/*LBP_LF, line feed - not used here because it's a DOSism */
+ LBP_CM = 25, /* attached characters and combining marks */
+/*LBP_NL, next line - not used here because it's equivalent to LBP_BK */
+/*LBP_SG, surrogates - not used here because they are not characters */
+ LBP_WJ = 0, /* word joiner */
+ LBP_ZW = 26, /* zero width space */
+ LBP_GL = 1, /* non-breaking (glue) */
+ LBP_SP = 27, /* space */
+ LBP_B2 = 2, /* break opportunity before and after */
+ LBP_BA = 3, /* break opportunity after */
+ LBP_BB = 4, /* break opportunity before */
+ LBP_HY = 5, /* hyphen */
+ LBP_CB = 28, /* contingent break opportunity */
+ LBP_CL = 6, /* closing punctuation */
+ LBP_EX = 7, /* exclamation/interrogation */
+ LBP_IN = 8, /* inseparable */
+ LBP_NS = 9, /* non starter */
+ LBP_OP = 10, /* opening punctuation */
+ LBP_QU = 11, /* ambiguous quotation */
+ LBP_IS = 12, /* infix separator (numeric) */
+ LBP_NU = 13, /* numeric */
+ LBP_PO = 14, /* postfix (numeric) */
+ LBP_PR = 15, /* prefix (numeric) */
+ LBP_SY = 16, /* symbols allowing breaks */
+ LBP_AI = 29, /* ambiguous (alphabetic or ideograph) */
+ LBP_AL = 17, /* ordinary alphabetic and symbol characters */
+ LBP_H2 = 18, /* Hangul LV syllable */
+ LBP_H3 = 19, /* Hangul LVT syllable */
+ LBP_ID = 20, /* ideographic */
+ LBP_JL = 21, /* Hangul L Jamo */
+ LBP_JV = 22, /* Hangul V Jamo */
+ LBP_JT = 23, /* Hangul T Jamo */
+ LBP_SA = 30, /* complex context (South East Asian) */
+ LBP_XX = 31 /* unknown */
+};
+
+/* Returns the line breaking classification for ch, as a bit mask. */
+static int
+get_lbp (unsigned int ch)
+{
+ int attr = 0;
+
+ if (unicode_attributes[ch].name != NULL)
+ {
+ /* mandatory break */
+ if (ch == 0x000A || ch == 0x000D || ch == 0x0085 /* newline */
+ || ch == 0x000C /* form feed */
+ || ch == 0x000B /* line tabulation */
+ || ch == 0x2028 /* LINE SEPARATOR */
+ || ch == 0x2029 /* PARAGRAPH SEPARATOR */)
+ attr |= 1 << LBP_BK;
+
+ if (ch == 0x2060 /* WORD JOINER */
+ || ch == 0xFEFF /* ZERO WIDTH NO-BREAK SPACE */)
+ attr |= 1 << LBP_WJ;
+
+ /* zero width space */
+ if (ch == 0x200B /* ZERO WIDTH SPACE */)
+ attr |= 1 << LBP_ZW;
+
+ /* non-breaking (glue) */
+ if (ch == 0x00A0 /* NO-BREAK SPACE */
+ || ch == 0x202F /* NARROW NO-BREAK SPACE */
+ || ch == 0x180E /* MONGOLIAN VOWEL SEPARATOR */
+ || ch == 0x034F /* COMBINING GRAPHEME JOINER */
+ || ch == 0x2007 /* FIGURE SPACE */
+ || ch == 0x2011 /* NON-BREAKING HYPHEN */
+ || ch == 0x0F08 /* TIBETAN MARK SBRUL SHAD */
+ || ch == 0x0F0C /* TIBETAN MARK DELIMITER TSHEG BSTAR */
+ || ch == 0x0F12 /* TIBETAN MARK RGYA GRAM SHAD */
+ || (ch >= 0x035C && ch <= 0x0362) /* COMBINING DOUBLE ... */)
+ attr |= 1 << LBP_GL;
+
+ /* space */
+ if (ch == 0x0020 /* SPACE */)
+ attr |= 1 << LBP_SP;
+
+ /* break opportunity before and after */
+ if (ch == 0x2014 /* EM DASH */)
+ attr |= 1 << LBP_B2;
+
+ /* break opportunity after */
+ if (ch == 0x1680 /* OGHAM SPACE MARK */
+ || ch == 0x2000 /* EN QUAD */
+ || ch == 0x2001 /* EM QUAD */
+ || ch == 0x2002 /* EN SPACE */
+ || ch == 0x2003 /* EM SPACE */
+ || ch == 0x2004 /* THREE-PER-EM SPACE */
+ || ch == 0x2005 /* FOUR-PER-EM SPACE */
+ || ch == 0x2006 /* SIX-PER-EM SPACE */
+ || ch == 0x2008 /* PUNCTUATION SPACE */
+ || ch == 0x2009 /* THIN SPACE */
+ || ch == 0x200A /* HAIR SPACE */
+ || ch == 0x205F /* MEDIUM MATHEMATICAL SPACE */
+ || ch == 0x0009 /* tab */
+ || ch == 0x00AD /* SOFT HYPHEN */
+ || ch == 0x058A /* ARMENIAN HYPHEN */
+ || ch == 0x2010 /* HYPHEN */
+ || ch == 0x2012 /* FIGURE DASH */
+ || ch == 0x2013 /* EN DASH */
+ || ch == 0x05BE /* HEBREW PUNCTUATION MAQAF */
+ || ch == 0x0F0B /* TIBETAN MARK INTERSYLLABIC TSHEG */
+ || ch == 0x1361 /* ETHIOPIC WORDSPACE */
+ || ch == 0x17D8 /* KHMER SIGN BEYYAL */
+ || ch == 0x17DA /* KHMER SIGN KOOMUUT */
+ || ch == 0x2027 /* HYPHENATION POINT */
+ || ch == 0x007C /* VERTICAL LINE */
+ || ch == 0x16EB /* RUNIC SINGLE PUNCTUATION */
+ || ch == 0x16EC /* RUNIC MULTIPLE PUNCTUATION */
+ || ch == 0x16ED /* RUNIC CROSS PUNCTUATION */
+ || ch == 0x2056 /* THREE DOT PUNCTUATION */
+ || ch == 0x2058 /* FOUR DOT PUNCTUATION */
+ || ch == 0x2059 /* FIVE DOT PUNCTUATION */
+ || ch == 0x205A /* TWO DOT PUNCTUATION */
+ || ch == 0x205B /* FOUR DOT MARK */
+ || ch == 0x205D /* TRICOLON */
+ || ch == 0x205E /* VERTICAL FOUR DOTS */
+ || ch == 0x2E19 /* PALM BRANCH */
+ || ch == 0x2E2A /* TWO DOTS OVER ONE DOT PUNCTUATION */
+ || ch == 0x2E2B /* ONE DOT OVER TWO DOTS PUNCTUATION */
+ || ch == 0x2E2C /* SQUARED FOUR DOT PUNCTUATION */
+ || ch == 0x2E2D /* FIVE DOT PUNCTUATION */
+ || ch == 0x2E30 /* RING POINT */
+ || ch == 0x10100 /* AEGEAN WORD SEPARATOR LINE */
+ || ch == 0x10101 /* AEGEAN WORD SEPARATOR DOT */
+ || ch == 0x10102 /* AEGEAN CHECK MARK */
+ || ch == 0x1039F /* UGARITIC WORD DIVIDER */
+ || ch == 0x103D0 /* OLD PERSIAN WORD DIVIDER */
+ || ch == 0x1091F /* PHOENICIAN WORD SEPARATOR */
+ || ch == 0x12470 /* CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER */
+ || ch == 0x0964 /* DEVANAGARI DANDA */
+ || ch == 0x0965 /* DEVANAGARI DOUBLE DANDA */
+ || ch == 0x0E5A /* THAI CHARACTER ANGKHANKHU */
+ || ch == 0x0E5B /* THAI CHARACTER KHOMUT */
+ || ch == 0x104A /* MYANMAR SIGN LITTLE SECTION */
+ || ch == 0x104B /* MYANMAR SIGN SECTION */
+ || ch == 0x1735 /* PHILIPPINE SINGLE PUNCTUATION */
+ || ch == 0x1736 /* PHILIPPINE DOUBLE PUNCTUATION */
+ || ch == 0x17D4 /* KHMER SIGN KHAN */
+ || ch == 0x17D5 /* KHMER SIGN BARIYOOSAN */
+ || ch == 0x1B5E /* BALINESE CARIK SIKI */
+ || ch == 0x1B5F /* BALINESE CARIK PAREREN */
+ || ch == 0xA8CE /* SAURASHTRA DANDA */
+ || ch == 0xA8CF /* SAURASHTRA DOUBLE DANDA */
+ || ch == 0xAA5D /* CHAM PUNCTUATION DANDA */
+ || ch == 0xAA5E /* CHAM PUNCTUATION DOUBLE DANDA */
+ || ch == 0xAA5F /* CHAM PUNCTUATION TRIPLE DANDA */
+ || ch == 0x10A56 /* KHAROSHTHI PUNCTUATION DANDA */
+ || ch == 0x10A57 /* KHAROSHTHI PUNCTUATION DOUBLE DANDA */
+ || ch == 0x0F34 /* TIBETAN MARK BSDUS RTAGS */
+ || ch == 0x0F7F /* TIBETAN SIGN RNAM BCAD */
+ || ch == 0x0F85 /* TIBETAN MARK PALUTA */
+ || ch == 0x0FBE /* TIBETAN KU RU KHA */
+ || ch == 0x0FBF /* TIBETAN KU RU KHA BZHI MIG CAN */
+ || ch == 0x0FD2 /* TIBETAN MARK NYIS TSHEG */
+ || ch == 0x1804 /* MONGOLIAN COLON */
+ || ch == 0x1805 /* MONGOLIAN FOUR DOTS */
+ || ch == 0x1B5A /* BALINESE PANTI */
+ || ch == 0x1B5B /* BALINESE PAMADA */
+ || ch == 0x1B5C /* BALINESE WINDU */
+ || ch == 0x1B5D /* BALINESE CARIK PAMUNGKAH */
+ || ch == 0x1B60 /* BALINESE PAMENENG */
+ || ch == 0x1C3B /* LEPCHA PUNCTUATION TA-ROL */
+ || ch == 0x1C3C /* LEPCHA PUNCTUATION NYET THYOOM TA-ROL */
+ || ch == 0x1C3D /* LEPCHA PUNCTUATION CER-WA */
+ || ch == 0x1C3E /* LEPCHA PUNCTUATION TSHOOK CER-WA */
+ || ch == 0x1C3F /* LEPCHA PUNCTUATION TSHOOK */
+ || ch == 0x1C7E /* OL CHIKI PUNCTUATION MUCAAD */
+ || ch == 0x1C7F /* OL CHIKI PUNCTUATION DOUBLE MUCAAD */
+ || ch == 0x2CFA /* COPTIC OLD NUBIAN DIRECT QUESTION MARK */
+ || ch == 0x2CFB /* COPTIC OLD NUBIAN INDIRECT QUESTION MARK */
+ || ch == 0x2CFC /* COPTIC OLD NUBIAN VERSE DIVIDER */
+ || ch == 0x2CFF /* COPTIC MORPHOLOGICAL DIVIDER */
+ || (ch >= 0x2E0E && ch <= 0x2E15) /* EDITORIAL CORONIS .. UPWARDS ANCORA */
+ || ch == 0x2E17 /* DOUBLE OBLIQUE HYPHEN */
+ || ch == 0xA60D /* VAI COMMA */
+ || ch == 0xA60F /* VAI QUESTION MARK */
+ || ch == 0xA92E /* KAYAH LI SIGN CWI */
+ || ch == 0xA92F /* KAYAH LI SIGN SHYA */
+ || ch == 0x10A50 /* KHAROSHTHI PUNCTUATION DOT */
+ || ch == 0x10A51 /* KHAROSHTHI PUNCTUATION SMALL CIRCLE */
+ || ch == 0x10A52 /* KHAROSHTHI PUNCTUATION CIRCLE */
+ || ch == 0x10A53 /* KHAROSHTHI PUNCTUATION CRESCENT BAR */
+ || ch == 0x10A54 /* KHAROSHTHI PUNCTUATION MANGALAM */
+ || ch == 0x10A55 /* KHAROSHTHI PUNCTUATION LOTUS */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x12471 /* CUNEIFORM PUNCTUATION SIGN VERTICAL COLON */
+ || ch == 0x12472 /* CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON */
+ || ch == 0x12473 /* CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON */)
+ attr |= 1 << LBP_BA;
+
+ /* break opportunity before */
+ if (ch == 0x00B4 /* ACUTE ACCENT */
+ || ch == 0x1FFD /* GREEK OXIA */
+ || ch == 0x02DF /* MODIFIER LETTER CROSS ACCENT */
+ || ch == 0x02C8 /* MODIFIER LETTER VERTICAL LINE */
+ || ch == 0x02CC /* MODIFIER LETTER LOW VERTICAL LINE */
+ || ch == 0x0F01 /* TIBETAN MARK GTER YIG MGO TRUNCATED A */
+ || ch == 0x0F02 /* TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA */
+ || ch == 0x0F03 /* TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA */
+ || ch == 0x0F04 /* TIBETAN MARK INITIAL YIG MGO MDUN MA */
+ || ch == 0x0F06 /* TIBETAN MARK CARET YIG MGO PHUR SHAD MA */
+ || ch == 0x0F07 /* TIBETAN MARK YIG MGO TSHEG SHAD MA */
+ || ch == 0x0F09 /* TIBETAN MARK BSKUR YIG MGO */
+ || ch == 0x0F0A /* TIBETAN MARK BKA- SHOG YIG MGO */
+ || ch == 0x0FD0 /* TIBETAN MARK BSKA- SHOG GI MGO RGYAN */
+ || ch == 0x0FD1 /* TIBETAN MARK MNYAM YIG GI MGO RGYAN */
+ || ch == 0x0FD3 /* TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA */
+ || ch == 0xA874 /* PHAGS-PA SINGLE HEAD MARK */
+ || ch == 0xA875 /* PHAGS-PA DOUBLE HEAD MARK */
+ || ch == 0x1806 /* MONGOLIAN TODO SOFT HYPHEN */)
+ attr |= 1 << LBP_BB;
+
+ /* hyphen */
+ if (ch == 0x002D /* HYPHEN-MINUS */)
+ attr |= 1 << LBP_HY;
+
+ /* contingent break opportunity */
+ if (ch == 0xFFFC /* OBJECT REPLACEMENT CHARACTER */)
+ attr |= 1 << LBP_CB;
+
+ /* closing punctuation */
+ if ((unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'e')
+ || ch == 0x3001 /* IDEOGRAPHIC COMMA */
+ || ch == 0x3002 /* IDEOGRAPHIC FULL STOP */
+ || ch == 0xFE11 /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA */
+ || ch == 0xFE12 /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP */
+ || ch == 0xFE50 /* SMALL COMMA */
+ || ch == 0xFE52 /* SMALL FULL STOP */
+ || ch == 0xFF0C /* FULLWIDTH COMMA */
+ || ch == 0xFF0E /* FULLWIDTH FULL STOP */
+ || ch == 0xFF61 /* HALFWIDTH IDEOGRAPHIC FULL STOP */
+ || ch == 0xFF64 /* HALFWIDTH IDEOGRAPHIC COMMA */)
+ attr |= 1 << LBP_CL;
+
+ /* exclamation/interrogation */
+ if (ch == 0x0021 /* EXCLAMATION MARK */
+ || ch == 0x003F /* QUESTION MARK */
+ || ch == 0x05C6 /* HEBREW PUNCTUATION NUN HAFUKHA */
+ || ch == 0x061B /* ARABIC SEMICOLON */
+ || ch == 0x061E /* ARABIC TRIPLE DOT PUNCTUATION MARK */
+ || ch == 0x061F /* ARABIC QUESTION MARK */
+ || ch == 0x06D4 /* ARABIC FULL STOP */
+ || ch == 0x07F9 /* NKO EXCLAMATION MARK */
+ || ch == 0x0F0D /* TIBETAN MARK SHAD */
+ || ch == 0x0F0E /* TIBETAN MARK NYIS SHAD */
+ || ch == 0x0F0F /* TIBETAN MARK TSHEG SHAD */
+ || ch == 0x0F10 /* TIBETAN MARK NYIS TSHEG SHAD */
+ || ch == 0x0F11 /* TIBETAN MARK RIN CHEN SPUNGS SHAD */
+ || ch == 0x0F14 /* TIBETAN MARK GTER TSHEG */
+ || ch == 0x1802 /* MONGOLIAN COMMA */
+ || ch == 0x1803 /* MONGOLIAN FULL STOP */
+ || ch == 0x1808 /* MONGOLIAN MANCHU COMMA */
+ || ch == 0x1809 /* MONGOLIAN MANCHU FULL STOP */
+ || ch == 0x1944 /* LIMBU EXCLAMATION MARK */
+ || ch == 0x1945 /* LIMBU QUESTION MARK */
+ || ch == 0x2762 /* HEAVY EXCLAMATION MARK ORNAMENT */
+ || ch == 0x2763 /* HEAVY HEART EXCLAMATION MARK ORNAMENT */
+ || ch == 0x2CF9 /* COPTIC OLD NUBIAN FULL STOP */
+ || ch == 0x2CFE /* COPTIC FULL STOP */
+ || ch == 0x2E2E /* REVERSED QUESTION MARK */
+#if REVISION_22
+ || ch == 0xA60C /* VAI SYLLABLE LENGTHENER */
+#endif
+ || ch == 0xA60E /* VAI FULL STOP */
+ || ch == 0xA876 /* PHAGS-PA MARK SHAD */
+ || ch == 0xA877 /* PHAGS-PA MARK DOUBLE SHAD */
+ || ch == 0xFE15 /* PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK */
+ || ch == 0xFE16 /* PRESENTATION FORM FOR VERTICAL QUESTION MARK */
+ || ch == 0xFE56 /* SMALL QUESTION MARK */
+ || ch == 0xFE57 /* SMALL EXCLAMATION MARK */
+ || ch == 0xFF01 /* FULLWIDTH EXCLAMATION MARK */
+ || ch == 0xFF1F /* FULLWIDTH QUESTION MARK */)
+ attr |= 1 << LBP_EX;
+
+ /* inseparable */
+ if (ch == 0x2024 /* ONE DOT LEADER */
+ || ch == 0x2025 /* TWO DOT LEADER */
+ || ch == 0x2026 /* HORIZONTAL ELLIPSIS */
+ || ch == 0xFE19 /* PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS */)
+ attr |= 1 << LBP_IN;
+
+ /* non starter */
+ if (ch == 0x17D6 /* KHMER SIGN CAMNUC PII KUUH */
+ || ch == 0x203C /* DOUBLE EXCLAMATION MARK */
+ || ch == 0x203D /* INTERROBANG */
+ || ch == 0x2047 /* DOUBLE QUESTION MARK */
+ || ch == 0x2048 /* QUESTION EXCLAMATION MARK */
+ || ch == 0x2049 /* EXCLAMATION QUESTION MARK */
+ || ch == 0x3005 /* IDEOGRAPHIC ITERATION MARK */
+ || ch == 0x301C /* WAVE DASH */
+ || ch == 0x303C /* MASU MARK */
+ || ch == 0x303B /* VERTICAL IDEOGRAPHIC ITERATION MARK */
+ || ch == 0x309B /* KATAKANA-HIRAGANA VOICED SOUND MARK */
+ || ch == 0x309C /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+ || ch == 0x309D /* HIRAGANA ITERATION MARK */
+ || ch == 0x309E /* HIRAGANA VOICED ITERATION MARK */
+ || ch == 0x30A0 /* KATAKANA-HIRAGANA DOUBLE HYPHEN */
+ || ch == 0x30FB /* KATAKANA MIDDLE DOT */
+ || ch == 0x30FC /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ || ch == 0x30FD /* KATAKANA ITERATION MARK */
+ || ch == 0x30FE /* KATAKANA VOICED ITERATION MARK */
+ || ch == 0xA015 /* YI SYLLABLE WU */
+ || ch == 0xFE54 /* SMALL SEMICOLON */
+ || ch == 0xFE55 /* SMALL COLON */
+ || ch == 0xFF1A /* FULLWIDTH COLON */
+ || ch == 0xFF1B /* FULLWIDTH SEMICOLON */
+ || ch == 0xFF65 /* HALFWIDTH KATAKANA MIDDLE DOT */
+ || ch == 0xFF70 /* HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ || ch == 0xFF9E /* HALFWIDTH KATAKANA VOICED SOUND MARK */
+ || ch == 0xFF9F /* HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK */
+ || strstr (unicode_attributes[ch].name, "HIRAGANA LETTER SMALL ") != NULL
+ || strstr (unicode_attributes[ch].name, "KATAKANA LETTER SMALL ") != NULL)
+ attr |= 1 << LBP_NS;
+
+ /* opening punctuation */
+ if ((unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 's')
+ || ch == 0x00A1 /* INVERTED EXCLAMATION MARK */
+ || ch == 0x00BF /* INVERTED QUESTION MARK */
+ || ch == 0x2E18 /* INVERTED INTERROBANG */)
+ attr |= 1 << LBP_OP;
+
+ /* ambiguous quotation */
+ if ((unicode_attributes[ch].category[0] == 'P'
+ && (unicode_attributes[ch].category[1] == 'f'
+ || unicode_attributes[ch].category[1] == 'i'))
+ || ch == 0x0022 /* QUOTATION MARK */
+ || ch == 0x0027 /* APOSTROPHE */
+ || ch == 0x275B /* HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ || ch == 0x275C /* HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT */
+ || ch == 0x275D /* HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ || ch == 0x275E /* HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT */
+ || ch == 0x2E00 /* RIGHT ANGLE SUBSTITUTION MARKER */
+ || ch == 0x2E01 /* RIGHT ANGLE DOTTED SUBSTITUTION MARKER */
+ || ch == 0x2E06 /* RAISED INTERPOLATION MARKER */
+ || ch == 0x2E07 /* RAISED DOTTED INTERPOLATION MARKER */
+ || ch == 0x2E08 /* DOTTED TRANSPOSITION MARKER */
+ || ch == 0x2E0B /* RAISED SQUARE */)
+ attr |= 1 << LBP_QU;
+
+ /* infix separator (numeric) */
+ if (ch == 0x002C /* COMMA */
+ || ch == 0x002E /* FULL STOP */
+ || ch == 0x003A /* COLON */
+ || ch == 0x003B /* SEMICOLON */
+ || ch == 0x037E /* GREEK QUESTION MARK */
+ || ch == 0x0589 /* ARMENIAN FULL STOP */
+ || ch == 0x060C /* ARABIC COMMA */
+ || ch == 0x060D /* ARABIC DATE SEPARATOR */
+ || ch == 0x07F8 /* NKO COMMA */
+ || ch == 0x2044 /* FRACTION SLASH */
+ || ch == 0xFE10 /* PRESENTATION FORM FOR VERTICAL COMMA */
+ || ch == 0xFE13 /* PRESENTATION FORM FOR VERTICAL COLON */
+ || ch == 0xFE14 /* PRESENTATION FORM FOR VERTICAL SEMICOLON */)
+ attr |= 1 << LBP_IS;
+
+ /* numeric */
+ if ((unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'd'
+ && strstr (unicode_attributes[ch].name, "FULLWIDTH") == NULL)
+ || ch == 0x066B /* ARABIC DECIMAL SEPARATOR */
+ || ch == 0x066C /* ARABIC THOUSANDS SEPARATOR */)
+ attr |= 1 << LBP_NU;
+
+ /* postfix (numeric) */
+ if (ch == 0x0025 /* PERCENT SIGN */
+ || ch == 0x00A2 /* CENT SIGN */
+ || ch == 0x00B0 /* DEGREE SIGN */
+ || ch == 0x060B /* AFGHANI SIGN */
+ || ch == 0x066A /* ARABIC PERCENT SIGN */
+ || ch == 0x2030 /* PER MILLE SIGN */
+ || ch == 0x2031 /* PER TEN THOUSAND SIGN */
+ || ch == 0x2032 /* PRIME */
+ || ch == 0x2033 /* DOUBLE PRIME */
+ || ch == 0x2034 /* TRIPLE PRIME */
+ || ch == 0x2035 /* REVERSED PRIME */
+ || ch == 0x2036 /* REVERSED DOUBLE PRIME */
+ || ch == 0x2037 /* REVERSED TRIPLE PRIME */
+ || ch == 0x20A7 /* PESETA SIGN */
+ || ch == 0x2103 /* DEGREE CELSIUS */
+ || ch == 0x2109 /* DEGREE FAHRENHEIT */
+ || ch == 0xFDFC /* RIAL SIGN */
+ || ch == 0xFE6A /* SMALL PERCENT SIGN */
+ || ch == 0xFF05 /* FULLWIDTH PERCENT SIGN */
+ || ch == 0xFFE0 /* FULLWIDTH DIGIT ZERO */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x0609 /* ARABIC-INDIC PER MILLE SIGN */
+ || ch == 0x060A /* ARABIC-INDIC PER TEN THOUSAND SIGN */
+ || ch == 0x0D79 /* MALAYALAM DATE MARK */)
+ attr |= 1 << LBP_PO;
+
+ /* prefix (numeric) */
+ if ((unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'c')
+ || ch == 0x002B /* PLUS SIGN */
+ || ch == 0x005C /* REVERSE SOLIDUS */
+ || ch == 0x00B1 /* PLUS-MINUS SIGN */
+ || ch == 0x2116 /* NUMERO SIGN */
+ || ch == 0x2212 /* MINUS SIGN */
+ || ch == 0x2213 /* MINUS-OR-PLUS SIGN */)
+ if (!(attr & (1 << LBP_PO)))
+ attr |= 1 << LBP_PR;
+
+ /* symbols allowing breaks */
+ if (ch == 0x002F /* SOLIDUS */)
+ attr |= 1 << LBP_SY;
+
+ if (ch >= 0xAC00 && ch <= 0xD7A3 && ((ch - 0xAC00) % 28) == 0)
+ attr |= 1 << LBP_H2;
+
+ if (ch >= 0xAC00 && ch <= 0xD7A3 && ((ch - 0xAC00) % 28) != 0)
+ attr |= 1 << LBP_H3;
+
+ if ((ch >= 0x1100 && ch <= 0x1159) || ch == 0x115F)
+ attr |= 1 << LBP_JL;
+
+ if (ch >= 0x1160 && ch <= 0x11A2)
+ attr |= 1 << LBP_JV;
+
+ if (ch >= 0x11A8 && ch <= 0x11F9)
+ attr |= 1 << LBP_JT;
+
+ /* complex context (South East Asian) */
+ if (((unicode_attributes[ch].category[0] == 'C'
+ && unicode_attributes[ch].category[1] == 'f')
+ || (unicode_attributes[ch].category[0] == 'L'
+ && (unicode_attributes[ch].category[1] == 'm'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || (unicode_attributes[ch].category[0] == 'M'
+ && (unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'n'))
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x109E /* MYANMAR SYMBOL SHAN ONE */
+ || ch == 0x109F /* MYANMAR SYMBOL SHAN EXCLAMATION */
+ || ch == 0x19DE /* NEW TAI LUE SIGN LAE */
+ || ch == 0x19DF /* NEW TAI LUE SIGN LAEV */)
+ && ((ch >= 0x0E00 && ch <= 0x0EFF)
+ || (ch >= 0x1000 && ch <= 0x109F)
+ || (ch >= 0x1780 && ch <= 0x17FF)
+ || (ch >= 0x1950 && ch <= 0x19DF)))
+ attr |= 1 << LBP_SA;
+
+ /* attached characters and combining marks */
+ if ((unicode_attributes[ch].category[0] == 'M'
+ && (unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'e'
+ || unicode_attributes[ch].category[1] == 'n'))
+ || (unicode_attributes[ch].category[0] == 'C'
+ && (unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'f')))
+ if (!(attr & ((1 << LBP_BK) | (1 << LBP_BA) | (1 << LBP_GL) | (1 << LBP_SA) | (1 << LBP_WJ) | (1 << LBP_ZW))))
+ attr |= 1 << LBP_CM;
+
+ /* ideographic */
+ if ((ch >= 0x2E80 && ch <= 0x2FFF) /* CJK RADICAL, KANGXI RADICAL, IDEOGRAPHIC DESCRIPTION */
+ || ch == 0x3000 /* IDEOGRAPHIC SPACE */
+ || (ch >= 0x3040 && ch <= 0x309F) /* HIRAGANA */
+ || (ch >= 0x30A0 && ch <= 0x30FF) /* KATAKANA */
+ || (ch >= 0x3400 && ch <= 0x4DB5) /* CJK Ideograph Extension A */
+ || (ch >= 0x4E00 && ch <= 0x9FC3) /* CJK Ideograph */
+ || (ch >= 0xF900 && ch <= 0xFAD9) /* CJK COMPATIBILITY IDEOGRAPH */
+ || (ch >= 0xA000 && ch <= 0xA48F) /* YI SYLLABLE */
+ || (ch >= 0xA490 && ch <= 0xA4CF) /* YI RADICAL */
+ || ch == 0xFE62 /* SMALL PLUS SIGN */
+ || ch == 0xFE63 /* SMALL HYPHEN-MINUS */
+ || ch == 0xFE64 /* SMALL LESS-THAN SIGN */
+ || ch == 0xFE65 /* SMALL GREATER-THAN SIGN */
+ || ch == 0xFE66 /* SMALL EQUALS SIGN */
+ || (ch >= 0xFF10 && ch <= 0xFF19) /* FULLWIDTH DIGIT */
+ || (ch >= 0x20000 && ch <= 0x2A6D6) /* CJK Ideograph Extension B */
+ || (ch >= 0x2F800 && ch <= 0x2FA1D) /* CJK COMPATIBILITY IDEOGRAPH */
+ || strstr (unicode_attributes[ch].name, "FULLWIDTH LATIN ") != NULL
+ || (ch >= 0x3000 && ch <= 0x33FF
+ && !(attr & ((1 << LBP_CM) | (1 << LBP_NS) | (1 << LBP_OP) | (1 << LBP_CL))))
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0xFE30 /* PRESENTATION FORM FOR VERTICAL TWO DOT LEADER */
+ || ch == 0xFE31 /* PRESENTATION FORM FOR VERTICAL EM DASH */
+ || ch == 0xFE32 /* PRESENTATION FORM FOR VERTICAL EN DASH */
+ || ch == 0xFE33 /* PRESENTATION FORM FOR VERTICAL LOW LINE */
+ || ch == 0xFE34 /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE */
+ || ch == 0xFE45 /* SESAME DOT */
+ || ch == 0xFE46 /* WHITE SESAME DOT */
+ || ch == 0xFE49 /* DASHED OVERLINE */
+ || ch == 0xFE4A /* CENTRELINE OVERLINE */
+ || ch == 0xFE4B /* WAVY OVERLINE */
+ || ch == 0xFE4C /* DOUBLE WAVY OVERLINE */
+ || ch == 0xFE4D /* DASHED LOW LINE */
+ || ch == 0xFE4E /* CENTRELINE LOW LINE */
+ || ch == 0xFE4F /* WAVY LOW LINE */
+ || ch == 0xFE51 /* SMALL IDEOGRAPHIC COMMA */
+ || ch == 0xFE58 /* SMALL EM DASH */
+ || ch == 0xFE5F /* SMALL NUMBER SIGN */
+ || ch == 0xFE60 /* SMALL AMPERSAND */
+ || ch == 0xFE61 /* SMALL ASTERISK */
+ || ch == 0xFE68 /* SMALL REVERSE SOLIDUS */
+ || ch == 0xFE6B /* SMALL COMMERCIAL AT */
+ || ch == 0xFF02 /* FULLWIDTH QUOTATION MARK */
+ || ch == 0xFF03 /* FULLWIDTH NUMBER SIGN */
+ || ch == 0xFF06 /* FULLWIDTH AMPERSAND */
+ || ch == 0xFF07 /* FULLWIDTH APOSTROPHE */
+ || ch == 0xFF0A /* FULLWIDTH ASTERISK */
+ || ch == 0xFF0B /* FULLWIDTH PLUS SIGN */
+ || ch == 0xFF0D /* FULLWIDTH HYPHEN-MINUS */
+ || ch == 0xFF0F /* FULLWIDTH SOLIDUS */
+ || ch == 0xFF1C /* FULLWIDTH LESS-THAN SIGN */
+ || ch == 0xFF1D /* FULLWIDTH EQUALS SIGN */
+ || ch == 0xFF1E /* FULLWIDTH GREATER-THAN SIGN */
+ || ch == 0xFF20 /* FULLWIDTH COMMERCIAL AT */
+ || ch == 0xFF3C /* FULLWIDTH REVERSE SOLIDUS */
+ || ch == 0xFF3E /* FULLWIDTH CIRCUMFLEX ACCENT */
+ || ch == 0xFF3F /* FULLWIDTH LOW LINE */
+ || ch == 0xFF40 /* FULLWIDTH GRAVE ACCENT */
+ || ch == 0xFF5C /* FULLWIDTH VERTICAL LINE */
+ || ch == 0xFF5E /* FULLWIDTH TILDE */
+ || ch == 0xFFE2 /* FULLWIDTH NOT SIGN */
+ || ch == 0xFFE3 /* FULLWIDTH MACRON */
+ || ch == 0xFFE4 /* FULLWIDTH BROKEN BAR */)
+ if (!(attr & ((1 << LBP_NS) | (1 << LBP_CM))))
+ {
+ /* ambiguous (ideograph) ? */
+ if ((unicode_width[ch] != NULL
+ && unicode_width[ch][0] == 'A'
+ && ch >= 0x2000)
+ || ch == 0x24EA /* CIRCLED DIGIT ZERO */
+ || (ch >= 0x2780 && ch <= 0x2793) /* DINGBAT ... CIRCLED DIGIT ... */)
+ attr |= 1 << LBP_AI;
+ else
+ attr |= 1 << LBP_ID;
+ }
+
+ /* ordinary alphabetic and symbol characters */
+ if ((unicode_attributes[ch].category[0] == 'L'
+ && (unicode_attributes[ch].category[1] == 'u'
+ || unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 't'
+ || unicode_attributes[ch].category[1] == 'm'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || (unicode_attributes[ch].category[0] == 'S'
+ && (unicode_attributes[ch].category[1] == 'm'
+ || unicode_attributes[ch].category[1] == 'k'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || (unicode_attributes[ch].category[0] == 'N'
+ && (unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || (unicode_attributes[ch].category[0] == 'P'
+ && (unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'd'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || ch == 0x0600 /* ARABIC NUMBER SIGN */
+ || ch == 0x0601 /* ARABIC SIGN SANAH */
+ || ch == 0x0602 /* ARABIC FOOTNOTE MARKER */
+ || ch == 0x0603 /* ARABIC SIGN SAFHA */
+ || ch == 0x06DD /* ARABIC END OF AYAH */
+ || ch == 0x070F /* SYRIAC ABBREVIATION MARK */
+ || ch == 0x2061 /* FUNCTION APPLICATION */
+ || ch == 0x2062 /* INVISIBLE TIMES */
+ || ch == 0x2063 /* INVISIBLE SEPARATOR */
+ || ch == 0x2064 /* INVISIBLE PLUS */)
+ if (!(attr & ((1 << LBP_GL) | (1 << LBP_B2) | (1 << LBP_BA) | (1 << LBP_BB) | (1 << LBP_HY) | (1 << LBP_CB) | (1 << LBP_CL) | (1 << LBP_EX) | (1 << LBP_IN) | (1 << LBP_NS) | (1 << LBP_OP) | (1 << LBP_QU) | (1 << LBP_IS) | (1 << LBP_NU) | (1 << LBP_PO) | (1 << LBP_PR) | (1 << LBP_SY) | (1 << LBP_H2) | (1 << LBP_H3) | (1 << LBP_JL) | (1 << LBP_JV) | (1 << LBP_JT) | (1 << LBP_SA) | (1 << LBP_ID))))
+ {
+ /* ambiguous (alphabetic) ? */
+ if ((unicode_width[ch] != NULL
+ && unicode_width[ch][0] == 'A'
+ && ch >= 0x2000
+ /* Extra exceptions for compatibility with Unicode LineBreak.txt. */
+ && ch != 0x2022 /* BULLET */
+ && ch != 0x203E /* OVERLINE */
+ && ch != 0x2126 /* OHM SIGN */
+ && ch != 0x2153 /* VULGAR FRACTION ONE THIRD */
+ && ch != 0x215C /* VULGAR FRACTION THREE EIGHTHS */
+ && ch != 0x215D /* VULGAR FRACTION FIVE EIGHTHS */
+ && ch != 0x21B8 /* NORTH WEST ARROW TO LONG BAR */
+ && ch != 0x21B9 /* LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR */
+ && ch != 0x21E7 /* UPWARDS WHITE ARROW */
+ && ch != 0x24FF /* NEGATIVE CIRCLED DIGIT ZERO */
+ && ch != 0x273D /* HEAVY TEARDROP-SPOKED ASTERISK */)
+#if !REVISION_22
+ || ch == 0x00A1 /* INVERTED EXCLAMATION MARK */
+ || ch == 0x00A7 /* SECTION SIGN */
+ || ch == 0x00A8 /* DIAERESIS */
+ || ch == 0x00AA /* FEMININE ORDINAL INDICATOR */
+ || ch == 0x00B2 /* SUPERSCRIPT TWO */
+ || ch == 0x00B3 /* SUPERSCRIPT THREE */
+ || ch == 0x00B6 /* PILCROW SIGN */
+ || ch == 0x00B7 /* MIDDLE DOT */
+ || ch == 0x00B8 /* CEDILLA */
+ || ch == 0x00B9 /* SUPERSCRIPT ONE */
+ || ch == 0x00BA /* MASCULINE ORDINAL INDICATOR */
+ || ch == 0x00BC /* VULGAR FRACTION ONE QUARTER */
+ || ch == 0x00BD /* VULGAR FRACTION ONE HALF */
+ || ch == 0x00BE /* VULGAR FRACTION THREE QUARTERS */
+ || ch == 0x00BF /* INVERTED QUESTION MARK */
+ || ch == 0x00D7 /* MULTIPLICATION SIGN */
+ || ch == 0x00F7 /* DIVISION SIGN */
+ || ch == 0x02C7 /* CARON */
+ || ch == 0x02C9 /* MODIFIER LETTER MACRON */
+ || ch == 0x02CA /* MODIFIER LETTER ACUTE ACCENT */
+ || ch == 0x02CB /* MODIFIER LETTER GRAVE ACCENT */
+ || ch == 0x02CD /* MODIFIER LETTER LOW MACRON */
+ || ch == 0x02D0 /* MODIFIER LETTER TRIANGULAR COLON */
+ || ch == 0x02D8 /* BREVE */
+ || ch == 0x02D9 /* DOT ABOVE */
+ || ch == 0x02DA /* RING ABOVE */
+ || ch == 0x02DB /* OGONEK */
+ || ch == 0x02DD /* DOUBLE ACUTE ACCENT */
+#endif
+ || ch == 0x24EA /* CIRCLED DIGIT ZERO */
+ || (ch >= 0x2780 && ch <= 0x2793) /* DINGBAT ... CIRCLED DIGIT ... */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x2155 /* VULGAR FRACTION ONE FIFTH */
+ || ch == 0x2574 /* BOX DRAWINGS LIGHT LEFT */
+ || ch == 0x2616 /* WHITE SHOGI PIECE */
+ || ch == 0x2617 /* BLACK SHOGI PIECE */)
+ attr |= 1 << LBP_AI;
+ else
+ attr |= 1 << LBP_AL;
+ attr &= ~(1 << LBP_CM);
+ }
+ }
+
+ if (attr == 0)
+ /* unknown */
+ attr |= 1 << LBP_XX;
+
+ return attr;
+}
+
+/* Output the line breaking properties in a human readable format. */
+static void
+debug_output_lbp (FILE *stream)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int attr = get_lbp (i);
+ if (attr != 1 << LBP_XX)
+ {
+ fprintf (stream, "0x%04X", i);
+#define PRINT_BIT(attr,bit) \
+ if (attr & (1 << bit)) fprintf (stream, " " #bit);
+ PRINT_BIT(attr,LBP_BK);
+ PRINT_BIT(attr,LBP_CM);
+ PRINT_BIT(attr,LBP_WJ);
+ PRINT_BIT(attr,LBP_ZW);
+ PRINT_BIT(attr,LBP_GL);
+ PRINT_BIT(attr,LBP_SP);
+ PRINT_BIT(attr,LBP_B2);
+ PRINT_BIT(attr,LBP_BA);
+ PRINT_BIT(attr,LBP_BB);
+ PRINT_BIT(attr,LBP_HY);
+ PRINT_BIT(attr,LBP_CB);
+ PRINT_BIT(attr,LBP_CL);
+ PRINT_BIT(attr,LBP_EX);
+ PRINT_BIT(attr,LBP_IN);
+ PRINT_BIT(attr,LBP_NS);
+ PRINT_BIT(attr,LBP_OP);
+ PRINT_BIT(attr,LBP_QU);
+ PRINT_BIT(attr,LBP_IS);
+ PRINT_BIT(attr,LBP_NU);
+ PRINT_BIT(attr,LBP_PO);
+ PRINT_BIT(attr,LBP_PR);
+ PRINT_BIT(attr,LBP_SY);
+ PRINT_BIT(attr,LBP_AI);
+ PRINT_BIT(attr,LBP_AL);
+ PRINT_BIT(attr,LBP_H2);
+ PRINT_BIT(attr,LBP_H3);
+ PRINT_BIT(attr,LBP_ID);
+ PRINT_BIT(attr,LBP_JL);
+ PRINT_BIT(attr,LBP_JV);
+ PRINT_BIT(attr,LBP_JT);
+ PRINT_BIT(attr,LBP_SA);
+ PRINT_BIT(attr,LBP_XX);
+#undef PRINT_BIT
+ fprintf (stream, "\n");
+ }
+ }
+}
+
+static void
+debug_output_lbrk_tables (const char *filename)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ debug_output_lbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* The line breaking property from the LineBreak.txt file. */
+int unicode_org_lbp[0x110000];
+
+/* Stores in unicode_org_lbp[] the line breaking property from the
+ LineBreak.txt file. */
+static void
+fill_org_lbp (const char *linebreak_filename)
+{
+ unsigned int i, j;
+ FILE *stream;
+ char field0[FIELDLEN];
+ char field1[FIELDLEN];
+ char field2[FIELDLEN];
+ int lineno = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_org_lbp[i] = LBP_XX;
+
+ stream = fopen (linebreak_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", linebreak_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ int n;
+ int c;
+ int value;
+
+ lineno++;
+ c = getc (stream);
+ if (c == EOF)
+ break;
+ if (c == '#')
+ {
+ do c = getc (stream); while (c != EOF && c != '\n');
+ continue;
+ }
+ ungetc (c, stream);
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ' ');
+ n += getfield (stream, field2, '\n');
+ if (n == 0)
+ break;
+ if (n != 3)
+ {
+ fprintf (stderr, "short line in '%s':%d\n", linebreak_filename,
+ lineno);
+ exit (1);
+ }
+#define TRY(bit) else if (strcmp (field1, #bit + 4) == 0) value = bit;
+ if (false) {}
+ TRY(LBP_BK)
+ TRY(LBP_CM)
+ TRY(LBP_WJ)
+ TRY(LBP_ZW)
+ TRY(LBP_GL)
+ TRY(LBP_SP)
+ TRY(LBP_B2)
+ TRY(LBP_BA)
+ TRY(LBP_BB)
+ TRY(LBP_HY)
+ TRY(LBP_CB)
+ TRY(LBP_CL)
+ TRY(LBP_EX)
+ TRY(LBP_IN)
+ TRY(LBP_NS)
+ TRY(LBP_OP)
+ TRY(LBP_QU)
+ TRY(LBP_IS)
+ TRY(LBP_NU)
+ TRY(LBP_PO)
+ TRY(LBP_PR)
+ TRY(LBP_SY)
+ TRY(LBP_AI)
+ TRY(LBP_AL)
+ TRY(LBP_H2)
+ TRY(LBP_H3)
+ TRY(LBP_ID)
+ TRY(LBP_JL)
+ TRY(LBP_JV)
+ TRY(LBP_JT)
+ TRY(LBP_SA)
+ TRY(LBP_XX)
+#undef TRY
+ else if (strcmp (field1, "LF") == 0) value = LBP_BK;
+ else if (strcmp (field1, "CR") == 0) value = LBP_BK;
+ else if (strcmp (field1, "NL") == 0) value = LBP_BK;
+ else if (strcmp (field1, "SG") == 0) value = LBP_XX;
+ else
+ {
+ fprintf (stderr, "unknown property value \"%s\" in '%s':%d\n",
+ field1, linebreak_filename, lineno);
+ exit (1);
+ }
+ i = strtoul (field0, NULL, 16);
+ if (strstr (field0, "..") != NULL)
+ {
+ /* Deal with a range. */
+ j = strtoul (strstr (field0, "..") + 2, NULL, 16);
+ for (; i <= j; i++)
+ unicode_org_lbp[i] = value;
+ }
+ else
+ {
+ /* Single character line. */
+ unicode_org_lbp[i] = value;
+ }
+ }
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", linebreak_filename);
+ exit (1);
+ }
+}
+
+/* Output the line breaking properties in a human readable format. */
+static void
+debug_output_org_lbp (FILE *stream)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int attr = unicode_org_lbp[i];
+ if (attr != LBP_XX)
+ {
+ fprintf (stream, "0x%04X", i);
+#define PRINT_BIT(attr,bit) \
+ if (attr == bit) fprintf (stream, " " #bit);
+ PRINT_BIT(attr,LBP_BK);
+ PRINT_BIT(attr,LBP_CM);
+ PRINT_BIT(attr,LBP_WJ);
+ PRINT_BIT(attr,LBP_ZW);
+ PRINT_BIT(attr,LBP_GL);
+ PRINT_BIT(attr,LBP_SP);
+ PRINT_BIT(attr,LBP_B2);
+ PRINT_BIT(attr,LBP_BA);
+ PRINT_BIT(attr,LBP_BB);
+ PRINT_BIT(attr,LBP_HY);
+ PRINT_BIT(attr,LBP_CB);
+ PRINT_BIT(attr,LBP_CL);
+ PRINT_BIT(attr,LBP_EX);
+ PRINT_BIT(attr,LBP_IN);
+ PRINT_BIT(attr,LBP_NS);
+ PRINT_BIT(attr,LBP_OP);
+ PRINT_BIT(attr,LBP_QU);
+ PRINT_BIT(attr,LBP_IS);
+ PRINT_BIT(attr,LBP_NU);
+ PRINT_BIT(attr,LBP_PO);
+ PRINT_BIT(attr,LBP_PR);
+ PRINT_BIT(attr,LBP_SY);
+ PRINT_BIT(attr,LBP_AI);
+ PRINT_BIT(attr,LBP_AL);
+ PRINT_BIT(attr,LBP_H2);
+ PRINT_BIT(attr,LBP_H3);
+ PRINT_BIT(attr,LBP_ID);
+ PRINT_BIT(attr,LBP_JL);
+ PRINT_BIT(attr,LBP_JV);
+ PRINT_BIT(attr,LBP_JT);
+ PRINT_BIT(attr,LBP_SA);
+ PRINT_BIT(attr,LBP_XX);
+#undef PRINT_BIT
+ fprintf (stream, "\n");
+ }
+ }
+}
+
+static void
+debug_output_org_lbrk_tables (const char *filename)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ debug_output_org_lbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE lbp_table
+#define ELEMENT unsigned char
+#define DEFAULT LBP_XX
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_lbp (FILE *stream1, FILE *stream2)
+{
+ unsigned int i;
+ struct lbp_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ t.p = 7;
+ t.q = 9;
+ lbp_table_init (&t);
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int attr = get_lbp (i);
+
+ /* Now attr should contain exactly one bit. */
+ if (attr == 0 || ((attr & (attr - 1)) != 0))
+ abort ();
+
+ if (attr != 1 << LBP_XX)
+ {
+ unsigned int log2_attr;
+ for (log2_attr = 0; attr > 1; attr >>= 1, log2_attr++);
+
+ lbp_table_add (&t, i, log2_attr);
+ }
+ }
+
+ lbp_table_finalize (&t);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream1, "#define lbrkprop_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream1, "\n");
+ fprintf (stream1, "typedef struct\n");
+ fprintf (stream1, " {\n");
+ fprintf (stream1, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream1, " int level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream1, " unsigned char level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream1, " }\n");
+ fprintf (stream1, "lbrkprop_t;\n");
+ fprintf (stream1, "extern const lbrkprop_t unilbrkprop;\n");
+
+ fprintf (stream2, "const lbrkprop_t unilbrkprop =\n");
+ fprintf (stream2, "{\n");
+ fprintf (stream2, " {");
+ if (t.level1_size > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream2, " %5d", -1);
+ else
+ fprintf (stream2, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream2, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " },\n");
+ fprintf (stream2, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream2, " %5d", -1);
+ else
+ fprintf (stream2, " %5zu",
+ (offset - level3_offset) / sizeof (unsigned char));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream2, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " },\n");
+ fprintf (stream2, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned char value = ((unsigned char *) (t.result + level3_offset))[i];
+ const char *value_string;
+ switch (value)
+ {
+#define CASE(x) case x: value_string = #x; break;
+ CASE(LBP_BK);
+ CASE(LBP_CM);
+ CASE(LBP_WJ);
+ CASE(LBP_ZW);
+ CASE(LBP_GL);
+ CASE(LBP_SP);
+ CASE(LBP_B2);
+ CASE(LBP_BA);
+ CASE(LBP_BB);
+ CASE(LBP_HY);
+ CASE(LBP_CB);
+ CASE(LBP_CL);
+ CASE(LBP_EX);
+ CASE(LBP_IN);
+ CASE(LBP_NS);
+ CASE(LBP_OP);
+ CASE(LBP_QU);
+ CASE(LBP_IS);
+ CASE(LBP_NU);
+ CASE(LBP_PO);
+ CASE(LBP_PR);
+ CASE(LBP_SY);
+ CASE(LBP_AI);
+ CASE(LBP_AL);
+ CASE(LBP_H2);
+ CASE(LBP_H3);
+ CASE(LBP_ID);
+ CASE(LBP_JL);
+ CASE(LBP_JV);
+ CASE(LBP_JT);
+ CASE(LBP_SA);
+ CASE(LBP_XX);
+#undef CASE
+ default:
+ abort ();
+ }
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " %s%s", value_string,
+ (i+1 < t.level3_size << t.p ? "," : ""));
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " }\n");
+ fprintf (stream2, "};\n");
+}
+
+static void
+output_lbrk_tables (const char *filename1, const char *filename2, const char *version)
+{
+ const char *filenames[2];
+ FILE *streams[2];
+ size_t i;
+
+ filenames[0] = filename1;
+ filenames[1] = filename2;
+
+ for (i = 0; i < 2; i++)
+ {
+ streams[i] = fopen (filenames[i], "w");
+ if (streams[i] == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filenames[i]);
+ exit (1);
+ }
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ FILE *stream = streams[i];
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Line breaking properties of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-lbrk for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+
+ /* Put a GPL header on it. The gnulib module is under LGPL (although it
+ still carries the GPL header), and it's gnulib-tool which replaces the
+ GPL header with an LGPL header. */
+ fprintf (stream, "/* Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+ }
+
+ output_lbp (streams[0], streams[1]);
+
+ for (i = 0; i < 2; i++)
+ {
+ if (ferror (streams[i]) || fclose (streams[i]))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filenames[i]);
+ exit (1);
+ }
+ }
+}
+
+/* ========================================================================= */
+
+/* Word break property. */
+
+/* Possible values of the Word_Break property. */
+enum
+{
+ WBP_OTHER = 0,
+ WBP_CR = 11,
+ WBP_LF = 12,
+ WBP_NEWLINE = 10,
+ WBP_EXTEND = 8,
+ WBP_FORMAT = 9,
+ WBP_KATAKANA = 1,
+ WBP_ALETTER = 2,
+ WBP_MIDNUMLET = 3,
+ WBP_MIDLETTER = 4,
+ WBP_MIDNUM = 5,
+ WBP_NUMERIC = 6,
+ WBP_EXTENDNUMLET = 7
+};
+
+/* Returns the word breaking property for ch, as a bit mask. */
+static int
+get_wbp (unsigned int ch)
+{
+ int attr = 0;
+
+ if (unicode_attributes[ch].name != NULL)
+ {
+ if (ch == 0x000D)
+ attr |= 1 << WBP_CR;
+
+ if (ch == 0x000A)
+ attr |= 1 << WBP_LF;
+
+ if (ch == 0x000B || ch == 0x000C
+ || ch == 0x0085
+ || ch == 0x2028 || ch == 0x2029)
+ attr |= 1 << WBP_NEWLINE;
+
+ if (((unicode_properties[ch] >> PROP_GRAPHEME_EXTEND) & 1) != 0
+ || (unicode_attributes[ch].category != NULL
+ && strcmp (unicode_attributes[ch].category, "Mc") == 0))
+ attr |= 1 << WBP_EXTEND;
+
+ if (unicode_attributes[ch].category != NULL
+ && strcmp (unicode_attributes[ch].category, "Cf") == 0
+ && ch != 0x200C && ch != 0x200D)
+ attr |= 1 << WBP_FORMAT;
+
+ if ((unicode_scripts[ch] < numscripts
+ && strcmp (scripts[unicode_scripts[ch]], "Katakana") == 0)
+ || (ch >= 0x3031 && ch <= 0x3035)
+ || ch == 0x309B || ch == 0x309C || ch == 0x30A0 || ch == 0x30FC
+ || ch == 0xFF70)
+ attr |= 1 << WBP_KATAKANA;
+
+ if ((((unicode_properties[ch] >> PROP_ALPHABETIC) & 1) != 0
+ || ch == 0x05F3)
+ && ((unicode_properties[ch] >> PROP_IDEOGRAPHIC) & 1) == 0
+ && (attr & (1 << WBP_KATAKANA)) == 0
+ && ((get_lbp (ch) >> LBP_SA) & 1) == 0
+ && !(unicode_scripts[ch] < numscripts
+ && strcmp (scripts[unicode_scripts[ch]], "Hiragana") == 0)
+ && (attr & (1 << WBP_EXTEND)) == 0)
+ attr |= 1 << WBP_ALETTER;
+
+ if (ch == 0x0027 || ch == 0x002E || ch == 0x2018 || ch == 0x2019
+ || ch == 0x2024 || ch == 0xFE52 || ch == 0xFF07 || ch == 0xFF0E)
+ attr |= 1 << WBP_MIDNUMLET;
+
+ if (ch == 0x00B7 || ch == 0x05F4 || ch == 0x2027 || ch == 0x003A
+ || ch == 0x0387 || ch == 0xFE13 || ch == 0xFE55 || ch == 0xFF1A)
+ attr |= 1 << WBP_MIDLETTER;
+
+ if ((((get_lbp (ch) >> LBP_IS) & 1) != 0
+ || ch == 0x066C || ch == 0xFE50 || ch == 0xFE54 || ch == 0xFF0C
+ || ch == 0xFF1B)
+ && ch != 0x003A && ch != 0xFE13 && ch != 0x002E)
+ attr |= 1 << WBP_MIDNUM;
+
+ if (((get_lbp (ch) >> LBP_NU) & 1) != 0
+ && ch != 0x066C)
+ attr |= 1 << WBP_NUMERIC;
+
+ if (unicode_attributes[ch].category != NULL
+ && strcmp (unicode_attributes[ch].category, "Pc") == 0)
+ attr |= 1 << WBP_EXTENDNUMLET;
+ }
+
+ if (attr == 0)
+ /* other */
+ attr |= 1 << WBP_OTHER;
+
+ return attr;
+}
+
+/* Output the word break property in a human readable format. */
+static void
+debug_output_wbp (FILE *stream)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int attr = get_wbp (i);
+ if (attr != 1 << WBP_OTHER)
+ {
+ fprintf (stream, "0x%04X", i);
+ if (attr & (1 << WBP_CR))
+ fprintf (stream, " CR");
+ if (attr & (1 << WBP_LF))
+ fprintf (stream, " LF");
+ if (attr & (1 << WBP_NEWLINE))
+ fprintf (stream, " Newline");
+ if (attr & (1 << WBP_EXTEND))
+ fprintf (stream, " Extend");
+ if (attr & (1 << WBP_FORMAT))
+ fprintf (stream, " Format");
+ if (attr & (1 << WBP_KATAKANA))
+ fprintf (stream, " Katakana");
+ if (attr & (1 << WBP_ALETTER))
+ fprintf (stream, " ALetter");
+ if (attr & (1 << WBP_MIDNUMLET))
+ fprintf (stream, " MidNumLet");
+ if (attr & (1 << WBP_MIDLETTER))
+ fprintf (stream, " MidLetter");
+ if (attr & (1 << WBP_MIDNUM))
+ fprintf (stream, " MidNum");
+ if (attr & (1 << WBP_NUMERIC))
+ fprintf (stream, " Numeric");
+ if (attr & (1 << WBP_EXTENDNUMLET))
+ fprintf (stream, " ExtendNumLet");
+ fprintf (stream, "\n");
+ }
+ }
+}
+
+static void
+debug_output_wbrk_tables (const char *filename)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ debug_output_wbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* The word break property from the WordBreakProperty.txt file. */
+int unicode_org_wbp[0x110000];
+
+/* Stores in unicode_org_wbp[] the word break property from the
+ WordBreakProperty.txt file. */
+static void
+fill_org_wbp (const char *wordbreakproperty_filename)
+{
+ unsigned int i;
+ FILE *stream;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_org_wbp[i] = WBP_OTHER;
+
+ stream = fopen (wordbreakproperty_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", wordbreakproperty_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char propname[200+1];
+ int propvalue;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^ ]", &i1, &i2, padding, propname) != 4)
+ {
+ if (sscanf (buf, "%X%[ ;]%[^ ]", &i1, padding, propname) != 3)
+ {
+ fprintf (stderr, "parse error in '%s'\n",
+ wordbreakproperty_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+#define PROP(name,value) \
+ if (strcmp (propname, name) == 0) propvalue = value; else
+ PROP ("CR", WBP_CR)
+ PROP ("LF", WBP_LF)
+ PROP ("Newline", WBP_NEWLINE)
+ PROP ("Extend", WBP_EXTEND)
+ PROP ("Format", WBP_FORMAT)
+ PROP ("Katakana", WBP_KATAKANA)
+ PROP ("ALetter", WBP_ALETTER)
+ PROP ("MidNumLet", WBP_MIDNUMLET)
+ PROP ("MidLetter", WBP_MIDLETTER)
+ PROP ("MidNum", WBP_MIDNUM)
+ PROP ("Numeric", WBP_NUMERIC)
+ PROP ("ExtendNumLet", WBP_EXTENDNUMLET)
+#undef PROP
+ {
+ fprintf (stderr, "unknown property value '%s' in '%s'\n", propname,
+ wordbreakproperty_filename);
+ exit (1);
+ }
+ if (!(i1 <= i2 && i2 < 0x110000))
+ abort ();
+
+ for (i = i1; i <= i2; i++)
+ unicode_org_wbp[i] = propvalue;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", wordbreakproperty_filename);
+ exit (1);
+ }
+}
+
+/* Output the word break property in a human readable format. */
+static void
+debug_output_org_wbp (FILE *stream)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int propvalue = unicode_org_wbp[i];
+ if (propvalue != WBP_OTHER)
+ {
+ fprintf (stream, "0x%04X", i);
+#define PROP(name,value) \
+ if (propvalue == value) fprintf (stream, " " name); else
+ PROP ("CR", WBP_CR)
+ PROP ("LF", WBP_LF)
+ PROP ("Newline", WBP_NEWLINE)
+ PROP ("Extend", WBP_EXTEND)
+ PROP ("Format", WBP_FORMAT)
+ PROP ("Katakana", WBP_KATAKANA)
+ PROP ("ALetter", WBP_ALETTER)
+ PROP ("MidNumLet", WBP_MIDNUMLET)
+ PROP ("MidLetter", WBP_MIDLETTER)
+ PROP ("MidNum", WBP_MIDNUM)
+ PROP ("Numeric", WBP_NUMERIC)
+ PROP ("ExtendNumLet", WBP_EXTENDNUMLET)
+#undef PROP
+ fprintf (stream, " ??");
+ fprintf (stream, "\n");
+ }
+ }
+}
+
+static void
+debug_output_org_wbrk_tables (const char *filename)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ debug_output_org_wbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE wbp_table
+#define ELEMENT unsigned char
+#define DEFAULT WBP_OTHER
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_wbp (FILE *stream)
+{
+ unsigned int i;
+ struct wbp_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ t.p = 7;
+ t.q = 9;
+ wbp_table_init (&t);
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int attr = get_wbp (i);
+
+ /* Now attr should contain exactly one bit. */
+ if (attr == 0 || ((attr & (attr - 1)) != 0))
+ abort ();
+
+ if (attr != 1 << WBP_OTHER)
+ {
+ unsigned int log2_attr;
+ for (log2_attr = 0; attr > 1; attr >>= 1, log2_attr++);
+
+ wbp_table_add (&t, i, log2_attr);
+ }
+ }
+
+ wbp_table_finalize (&t);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define wbrkprop_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "\n");
+ fprintf (stream, "typedef struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " int level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "wbrkprop_t;\n");
+ fprintf (stream, "static const wbrkprop_t uniwbrkprop =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (unsigned char));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 4)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned char value = ((unsigned char *) (t.result + level3_offset))[i];
+ const char *value_string;
+ switch (value)
+ {
+#define CASE(x) case x: value_string = #x; break;
+ CASE(WBP_OTHER);
+ CASE(WBP_CR);
+ CASE(WBP_LF);
+ CASE(WBP_NEWLINE);
+ CASE(WBP_EXTEND);
+ CASE(WBP_FORMAT);
+ CASE(WBP_KATAKANA);
+ CASE(WBP_ALETTER);
+ CASE(WBP_MIDNUMLET);
+ CASE(WBP_MIDLETTER);
+ CASE(WBP_MIDNUM);
+ CASE(WBP_NUMERIC);
+ CASE(WBP_EXTENDNUMLET);
+#undef CASE
+ default:
+ abort ();
+ }
+ if (i > 0 && (i % 4) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %s%s", value_string,
+ (i+1 < t.level3_size << t.p ? "," : ""));
+ }
+ if (t.level3_size << t.p > 4)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+}
+
+static void
+output_wbrk_tables (const char *filename, const char *version)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Line breaking properties of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+
+ /* Put a GPL header on it. The gnulib module is under LGPL (although it
+ still carries the GPL header), and it's gnulib-tool which replaces the
+ GPL header with an LGPL header. */
+ fprintf (stream, "/* Copyright (C) 2000-2002, 2004, 2007-2009 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+
+ output_wbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Maximum number of characters into which a single Unicode character can be
+ decomposed. */
+#define MAX_DECOMP_LENGTH 18
+
+enum
+{
+ UC_DECOMP_CANONICAL,/* Canonical decomposition. */
+ UC_DECOMP_FONT, /* <font> A font variant (e.g. a blackletter form). */
+ UC_DECOMP_NOBREAK, /* <noBreak> A no-break version of a space or hyphen. */
+ UC_DECOMP_INITIAL, /* <initial> An initial presentation form (Arabic). */
+ UC_DECOMP_MEDIAL, /* <medial> A medial presentation form (Arabic). */
+ UC_DECOMP_FINAL, /* <final> A final presentation form (Arabic). */
+ UC_DECOMP_ISOLATED,/* <isolated> An isolated presentation form (Arabic). */
+ UC_DECOMP_CIRCLE, /* <circle> An encircled form. */
+ UC_DECOMP_SUPER, /* <super> A superscript form. */
+ UC_DECOMP_SUB, /* <sub> A subscript form. */
+ UC_DECOMP_VERTICAL,/* <vertical> A vertical layout presentation form. */
+ UC_DECOMP_WIDE, /* <wide> A wide (or zenkaku) compatibility character. */
+ UC_DECOMP_NARROW, /* <narrow> A narrow (or hankaku) compatibility character. */
+ UC_DECOMP_SMALL, /* <small> A small variant form (CNS compatibility). */
+ UC_DECOMP_SQUARE, /* <square> A CJK squared font variant. */
+ UC_DECOMP_FRACTION,/* <fraction> A vulgar fraction form. */
+ UC_DECOMP_COMPAT /* <compat> Otherwise unspecified compatibility character. */
+};
+
+/* Return the decomposition for a Unicode character (ignoring Hangul Jamo
+ decompositions). Return the type, or -1 for none. */
+static int
+get_decomposition (unsigned int ch,
+ unsigned int *lengthp, unsigned int decomposed[MAX_DECOMP_LENGTH])
+{
+ const char *decomposition = unicode_attributes[ch].decomposition;
+
+ if (decomposition != NULL && decomposition[0] != '\0')
+ {
+ int type = UC_DECOMP_CANONICAL;
+ unsigned int length;
+ char *endptr;
+
+ if (decomposition[0] == '<')
+ {
+ const char *rangle;
+ size_t typelen;
+
+ rangle = strchr (decomposition + 1, '>');
+ if (rangle == NULL)
+ abort ();
+ typelen = rangle + 1 - decomposition;
+#define TYPE(t1,t2) \
+ if (typelen == (sizeof (t1) - 1) && memcmp (decomposition, t1, typelen) == 0) \
+ type = t2; \
+ else
+ TYPE ("<font>", UC_DECOMP_FONT)
+ TYPE ("<noBreak>", UC_DECOMP_NOBREAK)
+ TYPE ("<initial>", UC_DECOMP_INITIAL)
+ TYPE ("<medial>", UC_DECOMP_MEDIAL)
+ TYPE ("<final>", UC_DECOMP_FINAL)
+ TYPE ("<isolated>", UC_DECOMP_ISOLATED)
+ TYPE ("<circle>", UC_DECOMP_CIRCLE)
+ TYPE ("<super>", UC_DECOMP_SUPER)
+ TYPE ("<sub>", UC_DECOMP_SUB)
+ TYPE ("<vertical>", UC_DECOMP_VERTICAL)
+ TYPE ("<wide>", UC_DECOMP_WIDE)
+ TYPE ("<narrow>", UC_DECOMP_NARROW)
+ TYPE ("<small>", UC_DECOMP_SMALL)
+ TYPE ("<square>", UC_DECOMP_SQUARE)
+ TYPE ("<fraction>", UC_DECOMP_FRACTION)
+ TYPE ("<compat>", UC_DECOMP_COMPAT)
+ {
+ fprintf (stderr, "unknown decomposition type %*s\n", (int)typelen, decomposition);
+ exit (1);
+ }
+#undef TYPE
+ decomposition = rangle + 1;
+ if (decomposition[0] == ' ')
+ decomposition++;
+ }
+ for (length = 0; length < MAX_DECOMP_LENGTH; length++)
+ {
+ decomposed[length] = strtoul (decomposition, &endptr, 16);
+ if (endptr == decomposition)
+ break;
+ decomposition = endptr;
+ if (decomposition[0] == ' ')
+ decomposition++;
+ }
+ if (*decomposition != '\0')
+ /* MAX_DECOMP_LENGTH is too small. */
+ abort ();
+
+ *lengthp = length;
+ return type;
+ }
+ else
+ return -1;
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE decomp_table
+#define ELEMENT uint16_t
+#define DEFAULT (uint16_t)(-1)
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_decomposition (FILE *stream1, FILE *stream2)
+{
+ struct decomp_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ unsigned int offset;
+ unsigned int ch;
+ unsigned int i;
+
+ t.p = 5;
+ t.q = 5;
+ decomp_table_init (&t);
+
+ fprintf (stream1, "extern const unsigned char gl_uninorm_decomp_chars_table[];\n");
+ fprintf (stream1, "\n");
+ fprintf (stream2, "const unsigned char gl_uninorm_decomp_chars_table[] =\n{");
+ offset = 0;
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int length;
+ unsigned int decomposed[MAX_DECOMP_LENGTH];
+ int type = get_decomposition (ch, &length, decomposed);
+
+ if (type >= 0)
+ {
+ if (!(offset < (1 << 15)))
+ abort ();
+ decomp_table_add (&t, ch, ((type == UC_DECOMP_CANONICAL ? 0 : 1) << 15) | offset);
+
+ /* Produce length 3-bytes entries. */
+ if (length == 0)
+ /* We would need a special representation of zero-length entries. */
+ abort ();
+ for (i = 0; i < length; i++)
+ {
+ if (offset > 0)
+ fprintf (stream2, ",");
+ if ((offset % 4) == 0)
+ fprintf (stream2, "\n ");
+ if (!(decomposed[i] < (1 << 18)))
+ abort ();
+ fprintf (stream2, " 0x%02X, 0x%02X, 0x%02X",
+ (((i+1 < length ? (1 << 23) : 0)
+ | (i == 0 ? (type << 18) : 0)
+ | decomposed[i]) >> 16) & 0xff,
+ (decomposed[i] >> 8) & 0xff,
+ decomposed[i] & 0xff);
+ offset++;
+ }
+ }
+ }
+
+ fprintf (stream2, "\n};\n");
+ fprintf (stream2, "\n");
+
+ decomp_table_finalize (&t);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream1, "#define decomp_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream1, "\n");
+ fprintf (stream1, "typedef struct\n");
+ fprintf (stream1, " {\n");
+ fprintf (stream1, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream1, " int level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream1, " unsigned short level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream1, " }\n");
+ fprintf (stream1, "decomp_index_table_t;\n");
+ fprintf (stream1, "extern const decomp_index_table_t gl_uninorm_decomp_index_table;\n");
+ fprintf (stream2, "const decomp_index_table_t gl_uninorm_decomp_index_table =\n");
+ fprintf (stream2, "{\n");
+ fprintf (stream2, " {");
+ if (t.level1_size > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream2, " %5d", -1);
+ else
+ fprintf (stream2, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream2, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " },\n");
+ fprintf (stream2, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream2, " %5d", -1);
+ else
+ fprintf (stream2, " %5zu",
+ (offset - level3_offset) / sizeof (uint16_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream2, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " },\n");
+ fprintf (stream2, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ uint16_t value = ((uint16_t *) (t.result + level3_offset))[i];
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " %5d", value == (uint16_t)(-1) ? -1 : value);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream2, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " }\n");
+ fprintf (stream2, "};\n");
+}
+
+static void
+output_decomposition_tables (const char *filename1, const char *filename2, const char *version)
+{
+ const char *filenames[2];
+ FILE *streams[2];
+ size_t i;
+
+ filenames[0] = filename1;
+ filenames[1] = filename2;
+
+ for (i = 0; i < 2; i++)
+ {
+ streams[i] = fopen (filenames[i], "w");
+ if (streams[i] == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filenames[i]);
+ exit (1);
+ }
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ FILE *stream = streams[i];
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Decomposition of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+ }
+
+ output_decomposition (streams[0], streams[1]);
+
+ for (i = 0; i < 2; i++)
+ {
+ if (ferror (streams[i]) || fclose (streams[i]))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filenames[i]);
+ exit (1);
+ }
+ }
+}
+
+/* The "excluded from composition" property from the CompositionExclusions.txt file. */
+char unicode_composition_exclusions[0x110000];
+
+static void
+fill_composition_exclusions (const char *compositionexclusions_filename)
+{
+ FILE *stream;
+ unsigned int i;
+
+ stream = fopen (compositionexclusions_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", compositionexclusions_filename);
+ exit (1);
+ }
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_composition_exclusions[i] = 0;
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X", &i) != 1)
+ {
+ fprintf (stderr, "parse error in '%s'\n", compositionexclusions_filename);
+ exit (1);
+ }
+ if (!(i < 0x110000))
+ abort ();
+
+ unicode_composition_exclusions[i] = 1;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", compositionexclusions_filename);
+ exit (1);
+ }
+}
+
+static void
+debug_output_composition_tables (const char *filename)
+{
+ FILE *stream;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int length;
+ unsigned int decomposed[MAX_DECOMP_LENGTH];
+ int type = get_decomposition (ch, &length, decomposed);
+
+ if (type == UC_DECOMP_CANONICAL
+ /* Consider only binary decompositions.
+ Exclude singleton decompositions. */
+ && length == 2)
+ {
+ unsigned int code1 = decomposed[0];
+ unsigned int code2 = decomposed[1];
+ unsigned int combined = ch;
+
+ /* Exclude decompositions where the first part is not a starter,
+ i.e. is not of canonical combining class 0. */
+ if (strcmp (unicode_attributes[code1].combining, "0") == 0
+ /* Exclude characters listed in CompositionExclusions.txt. */
+ && !unicode_composition_exclusions[combined])
+ {
+ /* The combined character must now also be a starter.
+ Verify this. */
+ if (strcmp (unicode_attributes[combined].combining, "0") != 0)
+ abort ();
+
+ fprintf (stream, "0x%04X\t0x%04X\t0x%04X\t%s\n",
+ code1,
+ code2,
+ combined,
+ unicode_attributes[code2].combining);
+ }
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+static void
+output_composition_tables (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Canonical composition of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+
+ /* Put a GPL header on it. The gnulib module is under LGPL (although it
+ still carries the GPL header), and it's gnulib-tool which replaces the
+ GPL header with an LGPL header. */
+ fprintf (stream, "/* Copyright (C) 2009 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+
+ /* The composition table is a set of mappings (code1, code2) -> combined,
+ with 928 entries,
+ 367 values for code1 (from 0x003C to 0x30FD),
+ 54 values for code2 (from 0x0300 to 0x309A).
+ For a fixed code1, there are from 1 to 19 possible values for code2.
+ For a fixed code2, there are from 1 to 117 possible values for code1.
+ This is a very sparse matrix.
+
+ We want an O(1) hash lookup.
+
+ We could implement the hash lookup by mapping (code1, code2) to a linear
+ combination mul1*code1 + mul2*code2, which is then used as an index into
+ a 3-level table. But this leads to a table of size 37 KB.
+
+ We use gperf to implement the hash lookup, giving it the 928 sets of
+ 4 bytes (code1, code2) as input. gperf generates a hash table of size
+ 1527, which is quite good (60% filled). It requires an auxiliary table
+ lookup in a table of size 0.5 KB. The total tables size is 11 KB. */
+
+ fprintf (stream, "struct composition_rule { char codes[4]; };\n");
+ fprintf (stream, "%%struct-type\n");
+ fprintf (stream, "%%language=ANSI-C\n");
+ fprintf (stream, "%%define slot-name codes\n");
+ fprintf (stream, "%%define hash-function-name gl_uninorm_compose_hash\n");
+ fprintf (stream, "%%define lookup-function-name gl_uninorm_compose_lookup\n");
+ fprintf (stream, "%%compare-lengths\n");
+ fprintf (stream, "%%compare-strncmp\n");
+ fprintf (stream, "%%readonly-tables\n");
+ fprintf (stream, "%%omit-struct-type\n");
+ fprintf (stream, "%%%%\n");
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int length;
+ unsigned int decomposed[MAX_DECOMP_LENGTH];
+ int type = get_decomposition (ch, &length, decomposed);
+
+ if (type == UC_DECOMP_CANONICAL
+ /* Consider only binary decompositions.
+ Exclude singleton decompositions. */
+ && length == 2)
+ {
+ unsigned int code1 = decomposed[0];
+ unsigned int code2 = decomposed[1];
+ unsigned int combined = ch;
+
+ /* Exclude decompositions where the first part is not a starter,
+ i.e. is not of canonical combining class 0. */
+ if (strcmp (unicode_attributes[code1].combining, "0") == 0
+ /* Exclude characters listed in CompositionExclusions.txt. */
+ && !unicode_composition_exclusions[combined])
+ {
+ /* The combined character must now also be a starter.
+ Verify this. */
+ if (strcmp (unicode_attributes[combined].combining, "0") != 0)
+ abort ();
+
+ if (!(code1 < 0x10000))
+ abort ();
+ if (!(code2 < 0x10000))
+ abort ();
+ if (!(combined < 0x10000))
+ abort ();
+
+ fprintf (stream, "\"\\x%02x\\x%02x\\x%02x\\x%02x\", 0x%04x\n",
+ (code1 >> 8) & 0xff, code1 & 0xff,
+ (code2 >> 8) & 0xff, code2 & 0xff,
+ combined);
+ }
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Output the test for a simple character mapping table to the given file. */
+
+static void
+output_simple_mapping_test (const char *filename,
+ const char *function_name,
+ unsigned int (*func) (unsigned int),
+ const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Test the Unicode character mapping functions.\n");
+ fprintf (stream, " Copyright (C) 2009 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+ fprintf (stream, "/* Generated automatically by gen-case.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+ fprintf (stream, "#include \"test-mapping-part1.h\"\n");
+ fprintf (stream, "\n");
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int value = func (ch);
+
+ if (value != ch)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, 0x%04X }", ch, value);
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ fprintf (stream, "\n");
+ fprintf (stream, "#define MAP(c) %s (c)\n", function_name);
+ fprintf (stream, "#include \"test-mapping-part2.h\"\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE mapping_table
+#define ELEMENT int32_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output a simple character mapping table to the given file. */
+
+static void
+output_simple_mapping (const char *filename,
+ unsigned int (*func) (unsigned int),
+ const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct mapping_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Simple character mapping of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-case.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ mapping_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = (int) func (ch) - (int) ch;
+
+ mapping_table_add (&t, ch, value);
+ }
+
+ mapping_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define mapping_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " int level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_mapping =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (int32_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %5d", ((int32_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* A special casing context.
+ A context is negated through x -> -x. */
+enum
+{
+ SCC_ALWAYS = 0,
+ SCC_FINAL_SIGMA,
+ SCC_AFTER_SOFT_DOTTED,
+ SCC_MORE_ABOVE,
+ SCC_BEFORE_DOT,
+ SCC_AFTER_I
+};
+
+/* A special casing rule. */
+struct special_casing_rule
+{
+ unsigned int code;
+ unsigned int lower_mapping[3];
+ unsigned int title_mapping[3];
+ unsigned int upper_mapping[3];
+ unsigned int casefold_mapping[3];
+ const char *language;
+ int context;
+};
+
+/* The special casing rules. */
+struct special_casing_rule **casing_rules;
+unsigned int num_casing_rules;
+unsigned int allocated_casing_rules;
+
+static void
+add_casing_rule (struct special_casing_rule *new_rule)
+{
+ if (num_casing_rules == allocated_casing_rules)
+ {
+ allocated_casing_rules = 2 * allocated_casing_rules;
+ if (allocated_casing_rules < 16)
+ allocated_casing_rules = 16;
+ casing_rules =
+ (struct special_casing_rule **)
+ realloc (casing_rules, allocated_casing_rules * sizeof (struct special_casing_rule *));
+ }
+ casing_rules[num_casing_rules++] = new_rule;
+}
+
+/* Stores in casing_rules the special casing rules found in
+ specialcasing_filename. */
+static void
+fill_casing_rules (const char *specialcasing_filename)
+{
+ FILE *stream;
+
+ stream = fopen (specialcasing_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+
+ casing_rules = NULL;
+ num_casing_rules = 0;
+ allocated_casing_rules = 0;
+
+ for (;;)
+ {
+ char buf[200+1];
+ char *scanptr;
+ char *endptr;
+ int i;
+
+ unsigned int code;
+ unsigned int lower_mapping[3];
+ unsigned int title_mapping[3];
+ unsigned int upper_mapping[3];
+ char *language;
+ int context;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ /* Scan code. */
+ scanptr = buf;
+ code = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan lower mapping. */
+ for (i = 0; i < 3; i++)
+ lower_mapping[i] = 0;
+ for (i = 0; i < 3; i++)
+ {
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr == ';')
+ break;
+ lower_mapping[i] = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ }
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan title mapping. */
+ for (i = 0; i < 3; i++)
+ title_mapping[i] = 0;
+ for (i = 0; i < 3; i++)
+ {
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr == ';')
+ break;
+ title_mapping[i] = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ }
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan upper mapping. */
+ for (i = 0; i < 3; i++)
+ upper_mapping[i] = 0;
+ for (i = 0; i < 3; i++)
+ {
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr == ';')
+ break;
+ upper_mapping[i] = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ }
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan language and context. */
+ language = NULL;
+ context = SCC_ALWAYS;
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr != '\0' && *scanptr != '#')
+ {
+ const char *word_begin = scanptr;
+ const char *word_end;
+
+ while (*scanptr != '\0' && *scanptr != '#' && *scanptr != ';' && *scanptr != ' ')
+ scanptr++;
+ word_end = scanptr;
+
+ while (*scanptr == ' ')
+ scanptr++;
+
+ if (word_end - word_begin == 2)
+ {
+ language = (char *) malloc ((word_end - word_begin) + 1);
+ memcpy (language, word_begin, 2);
+ language[word_end - word_begin] = '\0';
+ word_begin = word_end = NULL;
+
+ if (*scanptr != '\0' && *scanptr != '#' && *scanptr != ';')
+ {
+ word_begin = scanptr;
+ while (*scanptr != '\0' && *scanptr != '#' && *scanptr != ';' && *scanptr != ' ')
+ scanptr++;
+ word_end = scanptr;
+ }
+ }
+
+ if (word_end > word_begin)
+ {
+ bool negate = false;
+
+ if (word_end - word_begin >= 4 && memcmp (word_begin, "Not_", 4) == 0)
+ {
+ word_begin += 4;
+ negate = true;
+ }
+ if (word_end - word_begin == 11 && memcmp (word_begin, "Final_Sigma", 11) == 0)
+ context = SCC_FINAL_SIGMA;
+ else if (word_end - word_begin == 17 && memcmp (word_begin, "After_Soft_Dotted", 17) == 0)
+ context = SCC_AFTER_SOFT_DOTTED;
+ else if (word_end - word_begin == 10 && memcmp (word_begin, "More_Above", 10) == 0)
+ context = SCC_MORE_ABOVE;
+ else if (word_end - word_begin == 10 && memcmp (word_begin, "Before_Dot", 10) == 0)
+ context = SCC_BEFORE_DOT;
+ else if (word_end - word_begin == 7 && memcmp (word_begin, "After_I", 7) == 0)
+ context = SCC_AFTER_I;
+ else
+ {
+ fprintf (stderr, "unknown context type in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ if (negate)
+ context = - context;
+ }
+
+ if (*scanptr != '\0' && *scanptr != '#' && *scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ }
+
+ /* Store the rule. */
+ {
+ struct special_casing_rule *new_rule =
+ (struct special_casing_rule *) malloc (sizeof (struct special_casing_rule));
+ new_rule->code = code;
+ new_rule->language = language;
+ new_rule->context = context;
+ memcpy (new_rule->lower_mapping, lower_mapping, sizeof (new_rule->lower_mapping));
+ memcpy (new_rule->title_mapping, title_mapping, sizeof (new_rule->title_mapping));
+ memcpy (new_rule->upper_mapping, upper_mapping, sizeof (new_rule->upper_mapping));
+
+ add_casing_rule (new_rule);
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+}
+
+/* A casefolding rule. */
+struct casefold_rule
+{
+ unsigned int code;
+ unsigned int mapping[3];
+ const char *language;
+};
+
+/* The casefolding rules. */
+struct casefold_rule **casefolding_rules;
+unsigned int num_casefolding_rules;
+unsigned int allocated_casefolding_rules;
+
+/* Stores in casefolding_rules the case folding rules found in
+ casefolding_filename. */
+static void
+fill_casefolding_rules (const char *casefolding_filename)
+{
+ FILE *stream;
+
+ stream = fopen (casefolding_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", casefolding_filename);
+ exit (1);
+ }
+
+ casefolding_rules = NULL;
+ num_casefolding_rules = 0;
+ allocated_casefolding_rules = 0;
+
+ for (;;)
+ {
+ char buf[200+1];
+ char *scanptr;
+ char *endptr;
+ int i;
+
+ unsigned int code;
+ char type;
+ unsigned int mapping[3];
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ /* Scan code. */
+ scanptr = buf;
+ code = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan type. */
+ while (*scanptr == ' ')
+ scanptr++;
+
+ switch (*scanptr)
+ {
+ case 'C': case 'F': case 'S': case 'T':
+ type = *scanptr;
+ break;
+ default:
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr++;
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan casefold mapping. */
+ for (i = 0; i < 3; i++)
+ mapping[i] = 0;
+ for (i = 0; i < 3; i++)
+ {
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr == ';')
+ break;
+ mapping[i] = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ }
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Ignore rules of type 'S'; we use the rules of type 'F' instead. */
+ if (type != 'S')
+ {
+ const char * const *languages;
+ unsigned int languages_count;
+
+ /* Type 'T' indicates that the rule is applicable to Turkish
+ languages only. */
+ if (type == 'T')
+ {
+ static const char * const turkish_languages[] = { "tr", "az" };
+ languages = turkish_languages;
+ languages_count = 2;
+ }
+ else
+ {
+ static const char * const all_languages[] = { NULL };
+ languages = all_languages;
+ languages_count = 1;
+ }
+
+ for (i = 0; i < languages_count; i++)
+ {
+ /* Store a new rule. */
+ struct casefold_rule *new_rule =
+ (struct casefold_rule *) malloc (sizeof (struct casefold_rule));
+ new_rule->code = code;
+ memcpy (new_rule->mapping, mapping, sizeof (new_rule->mapping));
+ new_rule->language = languages[i];
+
+ if (num_casefolding_rules == allocated_casefolding_rules)
+ {
+ allocated_casefolding_rules = 2 * allocated_casefolding_rules;
+ if (allocated_casefolding_rules < 16)
+ allocated_casefolding_rules = 16;
+ casefolding_rules =
+ (struct casefold_rule **)
+ realloc (casefolding_rules,
+ allocated_casefolding_rules * sizeof (struct casefold_rule *));
+ }
+ casefolding_rules[num_casefolding_rules++] = new_rule;
+ }
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", casefolding_filename);
+ exit (1);
+ }
+}
+
+/* Casefold mapping, when it maps to a single character. */
+unsigned int unicode_casefold[0x110000];
+
+static unsigned int
+to_casefold (unsigned int ch)
+{
+ return unicode_casefold[ch];
+}
+
+/* Redistribute the casefolding_rules:
+ - Rules that map to a single character, language independently, are stored
+ in unicode_casefold.
+ - Other rules are merged into casing_rules. */
+static void
+redistribute_casefolding_rules (void)
+{
+ unsigned int ch, i, j;
+
+ /* Fill unicode_casefold[]. */
+ for (ch = 0; ch < 0x110000; ch++)
+ unicode_casefold[ch] = ch;
+ for (i = 0; i < num_casefolding_rules; i++)
+ {
+ struct casefold_rule *cfrule = casefolding_rules[i];
+
+ if (cfrule->language == NULL && cfrule->mapping[1] == 0)
+ {
+ ch = cfrule->code;
+ if (!(ch < 0x110000))
+ abort ();
+ unicode_casefold[ch] = cfrule->mapping[0];
+ }
+ }
+
+ /* Extend the special casing rules by filling in their casefold_mapping[]
+ field. */
+ for (j = 0; j < num_casing_rules; j++)
+ {
+ struct special_casing_rule *rule = casing_rules[j];
+ unsigned int k;
+
+ rule->casefold_mapping[0] = to_casefold (rule->code);
+ for (k = 1; k < 3; k++)
+ rule->casefold_mapping[k] = 0;
+ }
+
+ /* Now merge the other casefolding rules into casing_rules. */
+ for (i = 0; i < num_casefolding_rules; i++)
+ {
+ struct casefold_rule *cfrule = casefolding_rules[i];
+
+ if (!(cfrule->language == NULL && cfrule->mapping[1] == 0))
+ {
+ /* Find a rule that applies to the same code, same language, and it
+ has context SCC_ALWAYS. At the same time, update all rules that
+ have the same code and same or more specific language. */
+ struct special_casing_rule *found_rule = NULL;
+
+ for (j = 0; j < num_casing_rules; j++)
+ {
+ struct special_casing_rule *rule = casing_rules[j];
+
+ if (rule->code == cfrule->code
+ && (cfrule->language == NULL
+ || (rule->language != NULL
+ && strcmp (rule->language, cfrule->language) == 0)))
+ {
+ memcpy (rule->casefold_mapping, cfrule->mapping,
+ sizeof (rule->casefold_mapping));
+
+ if ((cfrule->language == NULL
+ ? rule->language == NULL
+ : rule->language != NULL
+ && strcmp (rule->language, cfrule->language) == 0)
+ && rule->context == SCC_ALWAYS)
+ {
+ /* Found it. */
+ found_rule = rule;
+ }
+ }
+ }
+
+ if (found_rule == NULL)
+ {
+ /* Create a new rule. */
+ struct special_casing_rule *new_rule =
+ (struct special_casing_rule *) malloc (sizeof (struct special_casing_rule));
+
+ /* Try to find a rule that applies to the same code, no language
+ restriction, and with context SCC_ALWAYS. */
+ for (j = 0; j < num_casing_rules; j++)
+ {
+ struct special_casing_rule *rule = casing_rules[j];
+
+ if (rule->code == cfrule->code
+ && rule->context == SCC_ALWAYS
+ && rule->language == NULL)
+ {
+ /* Found it. */
+ found_rule = rule;
+ break;
+ }
+ }
+
+ new_rule->code = cfrule->code;
+ new_rule->language = cfrule->language;
+ new_rule->context = SCC_ALWAYS;
+ if (found_rule != NULL)
+ {
+ memcpy (new_rule->lower_mapping, found_rule->lower_mapping,
+ sizeof (new_rule->lower_mapping));
+ memcpy (new_rule->title_mapping, found_rule->title_mapping,
+ sizeof (new_rule->title_mapping));
+ memcpy (new_rule->upper_mapping, found_rule->upper_mapping,
+ sizeof (new_rule->upper_mapping));
+ }
+ else
+ {
+ unsigned int k;
+
+ new_rule->lower_mapping[0] = to_lower (cfrule->code);
+ for (k = 1; k < 3; k++)
+ new_rule->lower_mapping[k] = 0;
+ new_rule->title_mapping[0] = to_title (cfrule->code);
+ for (k = 1; k < 3; k++)
+ new_rule->title_mapping[k] = 0;
+ new_rule->upper_mapping[0] = to_upper (cfrule->code);
+ for (k = 1; k < 3; k++)
+ new_rule->upper_mapping[k] = 0;
+ }
+ memcpy (new_rule->casefold_mapping, cfrule->mapping,
+ sizeof (new_rule->casefold_mapping));
+
+ add_casing_rule (new_rule);
+ }
+ }
+ }
+}
+
+static int
+compare_casing_rules (const void *a, const void *b)
+{
+ struct special_casing_rule *a_rule = *(struct special_casing_rule **) a;
+ struct special_casing_rule *b_rule = *(struct special_casing_rule **) b;
+ unsigned int a_code = a_rule->code;
+ unsigned int b_code = b_rule->code;
+
+ if (a_code < b_code)
+ return -1;
+ if (a_code > b_code)
+ return 1;
+
+ /* Sort the more specific rules before the more general ones. */
+ return (- ((a_rule->language != NULL ? 1 : 0) + (a_rule->context != SCC_ALWAYS ? 1 : 0))
+ + ((b_rule->language != NULL ? 1 : 0) + (b_rule->context != SCC_ALWAYS ? 1 : 0)));
+}
+
+static void
+sort_casing_rules (void)
+{
+ /* Sort the rules 1. by code, 2. by specificity. */
+ if (num_casing_rules > 1)
+ qsort (casing_rules, num_casing_rules, sizeof (struct special_casing_rule *),
+ compare_casing_rules);
+}
+
+/* Output the special casing rules. */
+static void
+output_casing_rules (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int i, j;
+ unsigned int minor;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Special casing rules of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "struct special_casing_rule { char code[3]; };\n");
+ fprintf (stream, "%%struct-type\n");
+ fprintf (stream, "%%language=ANSI-C\n");
+ fprintf (stream, "%%define slot-name code\n");
+ fprintf (stream, "%%define hash-function-name gl_unicase_special_hash\n");
+ fprintf (stream, "%%define lookup-function-name gl_unicase_special_lookup\n");
+ fprintf (stream, "%%compare-lengths\n");
+ fprintf (stream, "%%compare-strncmp\n");
+ fprintf (stream, "%%readonly-tables\n");
+ fprintf (stream, "%%omit-struct-type\n");
+ fprintf (stream, "%%%%\n");
+
+ minor = 0;
+ for (i = 0; i < num_casing_rules; i++)
+ {
+ struct special_casing_rule *rule = casing_rules[i];
+ int context;
+
+ if (i > 0 && rule->code == casing_rules[i - 1]->code)
+ minor += 1;
+ else
+ minor = 0;
+
+ if (!(rule->code < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+
+ fprintf (stream, "\"\\x%02x\\x%02x\\x%02x\", ",
+ (rule->code >> 8) & 0xff, rule->code & 0xff, minor);
+
+ fprintf (stream, "%d, ",
+ i + 1 < num_casing_rules && casing_rules[i + 1]->code == rule->code ? 1 : 0);
+
+ context = rule->context;
+ if (context < 0)
+ {
+ fprintf (stream, "-");
+ context = - context;
+ }
+ else
+ fprintf (stream, " ");
+ switch (context)
+ {
+ case SCC_ALWAYS:
+ fprintf (stream, "SCC_ALWAYS ");
+ break;
+ case SCC_FINAL_SIGMA:
+ fprintf (stream, "SCC_FINAL_SIGMA ");
+ break;
+ case SCC_AFTER_SOFT_DOTTED:
+ fprintf (stream, "SCC_AFTER_SOFT_DOTTED");
+ break;
+ case SCC_MORE_ABOVE:
+ fprintf (stream, "SCC_MORE_ABOVE ");
+ break;
+ case SCC_BEFORE_DOT:
+ fprintf (stream, "SCC_BEFORE_DOT ");
+ break;
+ case SCC_AFTER_I:
+ fprintf (stream, "SCC_AFTER_I ");
+ break;
+ default:
+ abort ();
+ }
+ fprintf (stream, ", ");
+
+ if (rule->language != NULL)
+ {
+ if (strlen (rule->language) != 2)
+ abort ();
+ fprintf (stream, "{ '%c', '%c' }, ", rule->language[0], rule->language[1]);
+ }
+ else
+ fprintf (stream, "{ '\\0', '\\0' }, ");
+
+ fprintf (stream, "{ ");
+ for (j = 0; j < 3; j++)
+ {
+ if (j > 0)
+ fprintf (stream, ", ");
+ if (!(rule->upper_mapping[j] < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: upper mapping of code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+ if (rule->upper_mapping[j] != 0)
+ fprintf (stream, "0x%04X", rule->upper_mapping[j]);
+ else
+ fprintf (stream, " 0");
+ }
+ fprintf (stream, " }, { ");
+ for (j = 0; j < 3; j++)
+ {
+ if (j > 0)
+ fprintf (stream, ", ");
+ if (!(rule->lower_mapping[j] < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: lower mapping of code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+ if (rule->lower_mapping[j] != 0)
+ fprintf (stream, "0x%04X", rule->lower_mapping[j]);
+ else
+ fprintf (stream, " 0");
+ }
+ fprintf (stream, " }, { ");
+ for (j = 0; j < 3; j++)
+ {
+ if (j > 0)
+ fprintf (stream, ", ");
+ if (!(rule->title_mapping[j] < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: title mapping of code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+ if (rule->title_mapping[j] != 0)
+ fprintf (stream, "0x%04X", rule->title_mapping[j]);
+ else
+ fprintf (stream, " 0");
+ }
+ fprintf (stream, " }, { ");
+ for (j = 0; j < 3; j++)
+ {
+ if (j > 0)
+ fprintf (stream, ", ");
+ if (!(rule->casefold_mapping[j] < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: casefold mapping of code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+ if (rule->casefold_mapping[j] != 0)
+ fprintf (stream, "0x%04X", rule->casefold_mapping[j]);
+ else
+ fprintf (stream, " 0");
+ }
+ fprintf (stream, " }\n");
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "cased" if it has the Lowercase
+ or Uppercase property or has a General_Category value of
+ Titlecase_Letter. */
+static bool
+is_cased (unsigned int ch)
+{
+ return (is_property_lowercase (ch)
+ || is_property_uppercase (ch)
+ || is_category_Lt (ch));
+}
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "case-ignorable" if it has the
+ value MidLetter {or the value MidNumLet} for the Word_Break property or
+ its General_Category is one of Nonspacing_Mark (Mn), Enclosing_Mark (Me),
+ Format (Cf), Modifier_Letter (Lm), or Modifier_Symbol (Sk).
+ The text marked in braces was added in Unicode 5.1.0, see
+ <http://www.unicode.org/versions/Unicode5.1.0/> section "Update of
+ Definition of case-ignorable". */
+/* Since this predicate is only used for the "Before C" and "After C"
+ conditions of FINAL_SIGMA, we exclude the "cased" characters here.
+ This simplifies the evaluation of the regular expressions
+ \p{cased} (\p{case-ignorable})* C
+ and
+ C (\p{case-ignorable})* \p{cased}
+ */
+static bool
+is_case_ignorable (unsigned int ch)
+{
+ return (unicode_org_wbp[ch] == WBP_MIDLETTER
+ || unicode_org_wbp[ch] == WBP_MIDNUMLET
+ || is_category_Mn (ch)
+ || is_category_Me (ch)
+ || is_category_Cf (ch)
+ || is_category_Lm (ch)
+ || is_category_Sk (ch))
+ && !is_cased (ch);
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Output all case related properties. */
+static void
+output_casing_properties (const char *version)
+{
+#define PROPERTY(FN,P) \
+ debug_output_predicate ("unicase/" #FN ".txt", is_ ## P); \
+ output_predicate_test ("../tests/unicase/test-" #FN ".c", is_ ## P, "uc_is_" #P " (c)"); \
+ output_predicate ("unicase/" #FN ".h", is_ ## P, "u_casing_property_" #P, "Casing Properties", version);
+ PROPERTY(cased, cased)
+ PROPERTY(ignorable, case_ignorable)
+#undef PROPERTY
+}
+
+/* ========================================================================= */
+
+int
+main (int argc, char * argv[])
+{
+ const char *unicodedata_filename;
+ const char *proplist_filename;
+ const char *derivedproplist_filename;
+ const char *scripts_filename;
+ const char *blocks_filename;
+ const char *proplist30_filename;
+ const char *eastasianwidth_filename;
+ const char *linebreak_filename;
+ const char *wordbreakproperty_filename;
+ const char *compositionexclusions_filename;
+ const char *specialcasing_filename;
+ const char *casefolding_filename;
+ const char *version;
+
+ if (argc != 14)
+ {
+ fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt DerivedCoreProperties.txt Scripts.txt Blocks.txt PropList-3.0.1.txt EastAsianWidth.txt LineBreak.txt WordBreakProperty.txt CompositionExclusions.txt SpecialCasing.txt CaseFolding.txt version\n",
+ argv[0]);
+ exit (1);
+ }
+
+ unicodedata_filename = argv[1];
+ proplist_filename = argv[2];
+ derivedproplist_filename = argv[3];
+ scripts_filename = argv[4];
+ blocks_filename = argv[5];
+ proplist30_filename = argv[6];
+ eastasianwidth_filename = argv[7];
+ linebreak_filename = argv[8];
+ wordbreakproperty_filename = argv[9];
+ compositionexclusions_filename = argv[10];
+ specialcasing_filename = argv[11];
+ casefolding_filename = argv[12];
+ version = argv[13];
+
+ fill_attributes (unicodedata_filename);
+ clear_properties ();
+ fill_properties (proplist_filename);
+ fill_properties (derivedproplist_filename);
+ fill_properties30 (proplist30_filename);
+ fill_scripts (scripts_filename);
+ fill_blocks (blocks_filename);
+ fill_width (eastasianwidth_filename);
+ fill_org_lbp (linebreak_filename);
+ fill_org_wbp (wordbreakproperty_filename);
+ fill_composition_exclusions (compositionexclusions_filename);
+ fill_casing_rules (specialcasing_filename);
+ fill_casefolding_rules (casefolding_filename);
+ redistribute_casefolding_rules ();
+ sort_casing_rules ();
+
+ output_categories (version);
+ output_category ("unictype/categ_of.h", version);
+ output_combclass ("unictype/combining.h", version);
+ output_bidi_category ("unictype/bidi_of.h", version);
+ output_decimal_digit_test ("../tests/unictype/test-decdigit.h", version);
+ output_decimal_digit ("unictype/decdigit.h", version);
+ output_digit_test ("../tests/unictype/test-digit.h", version);
+ output_digit ("unictype/digit.h", version);
+ output_numeric_test ("../tests/unictype/test-numeric.h", version);
+ output_numeric ("unictype/numeric.h", version);
+ output_mirror ("unictype/mirror.h", version);
+ output_properties (version);
+ output_scripts (version);
+ output_scripts_byname (version);
+ output_blocks (version);
+ output_ident_properties (version);
+ output_old_ctype (version);
+
+ debug_output_lbrk_tables ("unilbrk/lbrkprop.txt");
+ debug_output_org_lbrk_tables ("unilbrk/lbrkprop_org.txt");
+ output_lbrk_tables ("unilbrk/lbrkprop1.h", "unilbrk/lbrkprop2.h", version);
+
+ debug_output_wbrk_tables ("uniwbrk/wbrkprop.txt");
+ debug_output_org_wbrk_tables ("uniwbrk/wbrkprop_org.txt");
+ output_wbrk_tables ("uniwbrk/wbrkprop.h", version);
+
+ output_decomposition_tables ("uninorm/decomposition-table1.h", "uninorm/decomposition-table2.h", version);
+ debug_output_composition_tables ("uninorm/composition.txt");
+ output_composition_tables ("uninorm/composition-table.gperf", version);
+
+ output_simple_mapping_test ("../tests/unicase/test-uc_toupper.c", "uc_toupper", to_upper, version);
+ output_simple_mapping_test ("../tests/unicase/test-uc_tolower.c", "uc_tolower", to_lower, version);
+ output_simple_mapping_test ("../tests/unicase/test-uc_totitle.c", "uc_totitle", to_title, version);
+ output_simple_mapping ("unicase/toupper.h", to_upper, version);
+ output_simple_mapping ("unicase/tolower.h", to_lower, version);
+ output_simple_mapping ("unicase/totitle.h", to_title, version);
+ output_simple_mapping ("unicase/tocasefold.h", to_casefold, version);
+ output_casing_rules ("unicase/special-casing-table.gperf", version);
+ output_casing_properties (version);
+
+ return 0;
+}
+
+/*
+ * For Emacs M-x compile
+ * Local Variables:
+ * compile-command: "
+ gcc -O -Wall gen-uni-tables.c -Iunictype -o gen-uni-tables && \
+ ./gen-uni-tables \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/UnicodeData.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/PropList.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/DerivedCoreProperties.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/Scripts.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/Blocks.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/3.0.1/PropList-3.0.1.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/EastAsianWidth.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/LineBreak.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/auxiliary/WordBreakProperty.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/CompositionExclusions.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/SpecialCasing.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/CaseFolding.txt \
+ 5.1.0
+ "
+ * End:
+ */
diff --git a/gnulib/lib/getaddrinfo.c b/gnulib/lib/getaddrinfo.c
new file mode 100644
index 00000000..9109a805
--- /dev/null
+++ b/gnulib/lib/getaddrinfo.c
@@ -0,0 +1,438 @@
+/* Get address information (partial implementation).
+ Copyright (C) 1997, 2001-2002, 2004-2010 Free Software Foundation, Inc.
+ Contributed by Simon Josefsson <simon@josefsson.org>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the sa == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <netdb.h>
+
+#if HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+/* Get inet_ntop. */
+#include <arpa/inet.h>
+
+/* Get calloc. */
+#include <stdlib.h>
+
+/* Get memcpy, strdup. */
+#include <string.h>
+
+/* Get snprintf. */
+#include <stdio.h>
+
+#include <stdbool.h>
+
+#include "gettext.h"
+#define _(String) gettext (String)
+#define N_(String) String
+
+/* BeOS has AF_INET, but not PF_INET. */
+#ifndef PF_INET
+# define PF_INET AF_INET
+#endif
+/* BeOS also lacks PF_UNSPEC. */
+#ifndef PF_UNSPEC
+# define PF_UNSPEC 0
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#ifdef WIN32_NATIVE
+typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*,
+ const struct addrinfo*,
+ struct addrinfo**);
+typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*);
+typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*,
+ socklen_t, char*, DWORD,
+ char*, DWORD, int);
+
+static getaddrinfo_func getaddrinfo_ptr = NULL;
+static freeaddrinfo_func freeaddrinfo_ptr = NULL;
+static getnameinfo_func getnameinfo_ptr = NULL;
+
+static int
+use_win32_p (void)
+{
+ static int done = 0;
+ HMODULE h;
+
+ if (done)
+ return getaddrinfo_ptr ? 1 : 0;
+
+ done = 1;
+
+ h = GetModuleHandle ("ws2_32.dll");
+
+ if (h)
+ {
+ getaddrinfo_ptr = (getaddrinfo_func) GetProcAddress (h, "getaddrinfo");
+ freeaddrinfo_ptr = (freeaddrinfo_func) GetProcAddress (h, "freeaddrinfo");
+ getnameinfo_ptr = (getnameinfo_func) GetProcAddress (h, "getnameinfo");
+ }
+
+ /* If either is missing, something is odd. */
+ if (!getaddrinfo_ptr || !freeaddrinfo_ptr || !getnameinfo_ptr)
+ {
+ getaddrinfo_ptr = NULL;
+ freeaddrinfo_ptr = NULL;
+ getnameinfo_ptr = NULL;
+ return 0;
+ }
+
+ return 1;
+}
+#endif
+
+static inline bool
+validate_family (int family)
+{
+ /* FIXME: Support more families. */
+#if HAVE_IPV4
+ if (family == PF_INET)
+ return true;
+#endif
+#if HAVE_IPV6
+ if (family == PF_INET6)
+ return true;
+#endif
+ if (family == PF_UNSPEC)
+ return true;
+ return false;
+}
+
+/* Translate name of a service location and/or a service name to set of
+ socket addresses. */
+int
+getaddrinfo (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res)
+{
+ struct addrinfo *tmp;
+ int port = 0;
+ struct hostent *he;
+ void *storage;
+ size_t size;
+#if HAVE_IPV6
+ struct v6_pair {
+ struct addrinfo addrinfo;
+ struct sockaddr_in6 sockaddr_in6;
+ };
+#endif
+#if HAVE_IPV4
+ struct v4_pair {
+ struct addrinfo addrinfo;
+ struct sockaddr_in sockaddr_in;
+ };
+#endif
+
+#ifdef WIN32_NATIVE
+ if (use_win32_p ())
+ return getaddrinfo_ptr (nodename, servname, hints, res);
+#endif
+
+ if (hints && (hints->ai_flags & ~(AI_CANONNAME|AI_PASSIVE)))
+ /* FIXME: Support more flags. */
+ return EAI_BADFLAGS;
+
+ if (hints && !validate_family (hints->ai_family))
+ return EAI_FAMILY;
+
+ if (hints &&
+ hints->ai_socktype != SOCK_STREAM && hints->ai_socktype != SOCK_DGRAM)
+ /* FIXME: Support other socktype. */
+ return EAI_SOCKTYPE; /* FIXME: Better return code? */
+
+ if (!nodename)
+ {
+ if (!(hints->ai_flags & AI_PASSIVE))
+ return EAI_NONAME;
+
+#ifdef HAVE_IPV6
+ nodename = (hints->ai_family == AF_INET6) ? "::" : "0.0.0.0";
+#else
+ nodename = "0.0.0.0";
+#endif
+ }
+
+ if (servname)
+ {
+ struct servent *se = NULL;
+ const char *proto =
+ (hints && hints->ai_socktype == SOCK_DGRAM) ? "udp" : "tcp";
+
+ if (hints == NULL || !(hints->ai_flags & AI_NUMERICSERV))
+ /* FIXME: Use getservbyname_r if available. */
+ se = getservbyname (servname, proto);
+
+ if (!se)
+ {
+ char *c;
+ if (!(*servname >= '0' && *servname <= '9'))
+ return EAI_NONAME;
+ port = strtoul (servname, &c, 10);
+ if (*c || port > 0xffff)
+ return EAI_NONAME;
+ port = htons (port);
+ }
+ else
+ port = se->s_port;
+ }
+
+ /* FIXME: Use gethostbyname_r if available. */
+ he = gethostbyname (nodename);
+ if (!he || he->h_addr_list[0] == NULL)
+ return EAI_NONAME;
+
+ switch (he->h_addrtype)
+ {
+#if HAVE_IPV6
+ case PF_INET6:
+ size = sizeof (struct v6_pair);
+ break;
+#endif
+
+#if HAVE_IPV4
+ case PF_INET:
+ size = sizeof (struct v4_pair);
+ break;
+#endif
+
+ default:
+ return EAI_NODATA;
+ }
+
+ storage = calloc (1, size);
+ if (!storage)
+ return EAI_MEMORY;
+
+ switch (he->h_addrtype)
+ {
+#if HAVE_IPV6
+ case PF_INET6:
+ {
+ struct v6_pair *p = storage;
+ struct sockaddr_in6 *sinp = &p->sockaddr_in6;
+ tmp = &p->addrinfo;
+
+ if (port)
+ sinp->sin6_port = port;
+
+ if (he->h_length != sizeof (sinp->sin6_addr))
+ {
+ free (storage);
+ return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */
+ }
+
+ memcpy (&sinp->sin6_addr, he->h_addr_list[0], sizeof sinp->sin6_addr);
+
+ tmp->ai_addr = (struct sockaddr *) sinp;
+ tmp->ai_addrlen = sizeof *sinp;
+ }
+ break;
+#endif
+
+#if HAVE_IPV4
+ case PF_INET:
+ {
+ struct v4_pair *p = storage;
+ struct sockaddr_in *sinp = &p->sockaddr_in;
+ tmp = &p->addrinfo;
+
+ if (port)
+ sinp->sin_port = port;
+
+ if (he->h_length != sizeof (sinp->sin_addr))
+ {
+ free (storage);
+ return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */
+ }
+
+ memcpy (&sinp->sin_addr, he->h_addr_list[0], sizeof sinp->sin_addr);
+
+ tmp->ai_addr = (struct sockaddr *) sinp;
+ tmp->ai_addrlen = sizeof *sinp;
+ }
+ break;
+#endif
+
+ default:
+ free (storage);
+ return EAI_NODATA;
+ }
+
+ if (hints && hints->ai_flags & AI_CANONNAME)
+ {
+ const char *cn;
+ if (he->h_name)
+ cn = he->h_name;
+ else
+ cn = nodename;
+
+ tmp->ai_canonname = strdup (cn);
+ if (!tmp->ai_canonname)
+ {
+ free (storage);
+ return EAI_MEMORY;
+ }
+ }
+
+ tmp->ai_protocol = (hints) ? hints->ai_protocol : 0;
+ tmp->ai_socktype = (hints) ? hints->ai_socktype : 0;
+ tmp->ai_addr->sa_family = he->h_addrtype;
+ tmp->ai_family = he->h_addrtype;
+
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ switch (he->h_addrtype)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+ tmp->ai_addr->sa_len = sizeof (struct sockaddr_in);
+ break;
+#endif
+#if HAVE_IPV6
+ case AF_INET6:
+ tmp->ai_addr->sa_len = sizeof (struct sockaddr_in6);
+ break;
+#endif
+ }
+#endif
+
+ /* FIXME: If more than one address, create linked list of addrinfo's. */
+
+ *res = tmp;
+
+ return 0;
+}
+
+/* Free `addrinfo' structure AI including associated storage. */
+void
+freeaddrinfo (struct addrinfo *ai)
+{
+#ifdef WIN32_NATIVE
+ if (use_win32_p ())
+ {
+ freeaddrinfo_ptr (ai);
+ return;
+ }
+#endif
+
+ while (ai)
+ {
+ struct addrinfo *cur;
+
+ cur = ai;
+ ai = ai->ai_next;
+
+ free (cur->ai_canonname);
+ free (cur);
+ }
+}
+
+int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen,
+ char *restrict node, socklen_t nodelen,
+ char *restrict service, socklen_t servicelen,
+ int flags)
+{
+#ifdef WIN32_NATIVE
+ if (use_win32_p ())
+ return getnameinfo_ptr (sa, salen, node, nodelen,
+ service, servicelen, flags);
+#endif
+
+ /* FIXME: Support other flags. */
+ if ((node && nodelen > 0 && !(flags & NI_NUMERICHOST)) ||
+ (service && servicelen > 0 && !(flags & NI_NUMERICHOST)) ||
+ (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV)))
+ return EAI_BADFLAGS;
+
+ if (sa == NULL || salen < sizeof (sa->sa_family))
+ return EAI_FAMILY;
+
+ switch (sa->sa_family)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+ if (salen < sizeof (struct sockaddr_in))
+ return EAI_FAMILY;
+ break;
+#endif
+#if HAVE_IPV6
+ case AF_INET6:
+ if (salen < sizeof (struct sockaddr_in6))
+ return EAI_FAMILY;
+ break;
+#endif
+ default:
+ return EAI_FAMILY;
+ }
+
+ if (node && nodelen > 0 && flags & NI_NUMERICHOST)
+ {
+ switch (sa->sa_family)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+ if (!inet_ntop (AF_INET,
+ &(((const struct sockaddr_in *) sa)->sin_addr),
+ node, nodelen))
+ return EAI_SYSTEM;
+ break;
+#endif
+
+#if HAVE_IPV6
+ case AF_INET6:
+ if (!inet_ntop (AF_INET6,
+ &(((const struct sockaddr_in6 *) sa)->sin6_addr),
+ node, nodelen))
+ return EAI_SYSTEM;
+ break;
+#endif
+
+ default:
+ return EAI_FAMILY;
+ }
+ }
+
+ if (service && servicelen > 0 && flags & NI_NUMERICSERV)
+ switch (sa->sa_family)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+#endif
+#if HAVE_IPV6
+ case AF_INET6:
+#endif
+ {
+ unsigned short int port
+ = ntohs (((const struct sockaddr_in *) sa)->sin_port);
+ if (servicelen <= snprintf (service, servicelen, "%u", port))
+ return EAI_OVERFLOW;
+ }
+ break;
+ }
+
+ return 0;
+}
diff --git a/gnulib/lib/getcwd.c b/gnulib/lib/getcwd.c
new file mode 100644
index 00000000..1ba705c3
--- /dev/null
+++ b/gnulib/lib/getcwd.c
@@ -0,0 +1,423 @@
+/* Copyright (C) 1991-1999, 2004-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+# include <unistd.h>
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+#include <fcntl.h> /* For AT_FDCWD on Solaris 9. */
+
+/* If this host provides the openat function, then enable
+ code below to make getcwd more efficient and robust. */
+#ifdef HAVE_OPENAT
+# define HAVE_OPENAT_SUPPORT 1
+#else
+# define HAVE_OPENAT_SUPPORT 0
+#endif
+
+#ifndef __set_errno
+# define __set_errno(val) (errno = (val))
+#endif
+
+#include <dirent.h>
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) strlen ((d)->d_name)
+#endif
+#ifndef _D_ALLOC_NAMLEN
+# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if _LIBC
+# ifndef mempcpy
+# define mempcpy __mempcpy
+# endif
+#endif
+
+#include <limits.h>
+
+#ifndef MAX
+# define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef MIN
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+#ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# else
+# define PATH_MAX 1024
+# endif
+#endif
+
+#if D_INO_IN_DIRENT
+# define MATCHING_INO(dp, ino) ((dp)->d_ino == (ino))
+#else
+# define MATCHING_INO(dp, ino) true
+#endif
+
+#if !_LIBC
+# define __getcwd rpl_getcwd
+# define __lstat lstat
+# define __closedir closedir
+# define __opendir opendir
+# define __readdir readdir
+#endif
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary recursion in fchdir.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use opendir_safer and
+ openat_safer. */
+#undef opendir
+#undef closedir
+
+/* Get the name of the current working directory, and put it in SIZE
+ bytes of BUF. Returns NULL if the directory couldn't be determined or
+ SIZE was too small. If successful, returns BUF. In GNU, if BUF is
+ NULL, an array is allocated with `malloc'; the array is SIZE bytes long,
+ unless SIZE == 0, in which case it is as big as necessary. */
+
+char *
+__getcwd (char *buf, size_t size)
+{
+ /* Lengths of big file name components and entire file names, and a
+ deep level of file name nesting. These numbers are not upper
+ bounds; they are merely large values suitable for initial
+ allocations, designed to be large enough for most real-world
+ uses. */
+ enum
+ {
+ BIG_FILE_NAME_COMPONENT_LENGTH = 255,
+ BIG_FILE_NAME_LENGTH = MIN (4095, PATH_MAX - 1),
+ DEEP_NESTING = 100
+ };
+
+#if HAVE_OPENAT_SUPPORT
+ int fd = AT_FDCWD;
+ bool fd_needs_closing = false;
+#else
+ char dots[DEEP_NESTING * sizeof ".." + BIG_FILE_NAME_COMPONENT_LENGTH + 1];
+ char *dotlist = dots;
+ size_t dotsize = sizeof dots;
+ size_t dotlen = 0;
+#endif
+ DIR *dirstream = NULL;
+ dev_t rootdev, thisdev;
+ ino_t rootino, thisino;
+ char *dir;
+ register char *dirp;
+ struct stat st;
+ size_t allocated = size;
+ size_t used;
+
+#if HAVE_PARTLY_WORKING_GETCWD
+ /* The system getcwd works, except it sometimes fails when it
+ shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT. If
+ AT_FDCWD is not defined, the algorithm below is O(N**2) and this
+ is much slower than the system getcwd (at least on GNU/Linux).
+ So trust the system getcwd's results unless they look
+ suspicious.
+
+ Use the system getcwd even if we have openat support, since the
+ system getcwd works even when a parent is unreadable, while the
+ openat-based approach does not. */
+
+# undef getcwd
+ dir = getcwd (buf, size);
+ if (dir || (errno != ERANGE && errno != ENAMETOOLONG && errno != ENOENT))
+ return dir;
+#endif
+
+ if (size == 0)
+ {
+ if (buf != NULL)
+ {
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ allocated = BIG_FILE_NAME_LENGTH + 1;
+ }
+
+ if (buf == NULL)
+ {
+ dir = malloc (allocated);
+ if (dir == NULL)
+ return NULL;
+ }
+ else
+ dir = buf;
+
+ dirp = dir + allocated;
+ *--dirp = '\0';
+
+ if (__lstat (".", &st) < 0)
+ goto lose;
+ thisdev = st.st_dev;
+ thisino = st.st_ino;
+
+ if (__lstat ("/", &st) < 0)
+ goto lose;
+ rootdev = st.st_dev;
+ rootino = st.st_ino;
+
+ while (!(thisdev == rootdev && thisino == rootino))
+ {
+ struct dirent *d;
+ dev_t dotdev;
+ ino_t dotino;
+ bool mount_point;
+ int parent_status;
+ size_t dirroom;
+ size_t namlen;
+ bool use_d_ino = true;
+
+ /* Look at the parent directory. */
+#if HAVE_OPENAT_SUPPORT
+ fd = openat (fd, "..", O_RDONLY);
+ if (fd < 0)
+ goto lose;
+ fd_needs_closing = true;
+ parent_status = fstat (fd, &st);
+#else
+ dotlist[dotlen++] = '.';
+ dotlist[dotlen++] = '.';
+ dotlist[dotlen] = '\0';
+ parent_status = __lstat (dotlist, &st);
+#endif
+ if (parent_status != 0)
+ goto lose;
+
+ if (dirstream && __closedir (dirstream) != 0)
+ {
+ dirstream = NULL;
+ goto lose;
+ }
+
+ /* Figure out if this directory is a mount point. */
+ dotdev = st.st_dev;
+ dotino = st.st_ino;
+ mount_point = dotdev != thisdev;
+
+ /* Search for the last directory. */
+#if HAVE_OPENAT_SUPPORT
+ dirstream = fdopendir (fd);
+ if (dirstream == NULL)
+ goto lose;
+ /* Reset fd. It may have been closed by fdopendir. */
+ fd = dirfd (dirstream);
+ fd_needs_closing = false;
+#else
+ dirstream = __opendir (dotlist);
+ if (dirstream == NULL)
+ goto lose;
+ dotlist[dotlen++] = '/';
+#endif
+ for (;;)
+ {
+ /* Clear errno to distinguish EOF from error if readdir returns
+ NULL. */
+ __set_errno (0);
+ d = __readdir (dirstream);
+
+ /* When we've iterated through all directory entries without finding
+ one with a matching d_ino, rewind the stream and consider each
+ name again, but this time, using lstat. This is necessary in a
+ chroot on at least one system (glibc-2.3.6 + linux 2.6.12), where
+ .., ../.., ../../.., etc. all had the same device number, yet the
+ d_ino values for entries in / did not match those obtained
+ via lstat. */
+ if (d == NULL && errno == 0 && use_d_ino)
+ {
+ use_d_ino = false;
+ rewinddir (dirstream);
+ d = __readdir (dirstream);
+ }
+
+ if (d == NULL)
+ {
+ if (errno == 0)
+ /* EOF on dirstream, which can mean e.g., that the current
+ directory has been removed. */
+ __set_errno (ENOENT);
+ goto lose;
+ }
+ if (d->d_name[0] == '.' &&
+ (d->d_name[1] == '\0' ||
+ (d->d_name[1] == '.' && d->d_name[2] == '\0')))
+ continue;
+
+ if (use_d_ino)
+ {
+ bool match = (MATCHING_INO (d, thisino) || mount_point);
+ if (! match)
+ continue;
+ }
+
+ {
+ int entry_status;
+#if HAVE_OPENAT_SUPPORT
+ entry_status = fstatat (fd, d->d_name, &st, AT_SYMLINK_NOFOLLOW);
+#else
+ /* Compute size needed for this file name, or for the file
+ name ".." in the same directory, whichever is larger.
+ Room for ".." might be needed the next time through
+ the outer loop. */
+ size_t name_alloc = _D_ALLOC_NAMLEN (d);
+ size_t filesize = dotlen + MAX (sizeof "..", name_alloc);
+
+ if (filesize < dotlen)
+ goto memory_exhausted;
+
+ if (dotsize < filesize)
+ {
+ /* My, what a deep directory tree you have, Grandma. */
+ size_t newsize = MAX (filesize, dotsize * 2);
+ size_t i;
+ if (newsize < dotsize)
+ goto memory_exhausted;
+ if (dotlist != dots)
+ free (dotlist);
+ dotlist = malloc (newsize);
+ if (dotlist == NULL)
+ goto lose;
+ dotsize = newsize;
+
+ i = 0;
+ do
+ {
+ dotlist[i++] = '.';
+ dotlist[i++] = '.';
+ dotlist[i++] = '/';
+ }
+ while (i < dotlen);
+ }
+
+ memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN (d));
+ entry_status = __lstat (dotlist, &st);
+#endif
+ /* We don't fail here if we cannot stat() a directory entry.
+ This can happen when (network) file systems fail. If this
+ entry is in fact the one we are looking for we will find
+ out soon as we reach the end of the directory without
+ having found anything. */
+ if (entry_status == 0 && S_ISDIR (st.st_mode)
+ && st.st_dev == thisdev && st.st_ino == thisino)
+ break;
+ }
+ }
+
+ dirroom = dirp - dir;
+ namlen = _D_EXACT_NAMLEN (d);
+
+ if (dirroom <= namlen)
+ {
+ if (size != 0)
+ {
+ __set_errno (ERANGE);
+ goto lose;
+ }
+ else
+ {
+ char *tmp;
+ size_t oldsize = allocated;
+
+ allocated += MAX (allocated, namlen);
+ if (allocated < oldsize
+ || ! (tmp = realloc (dir, allocated)))
+ goto memory_exhausted;
+
+ /* Move current contents up to the end of the buffer.
+ This is guaranteed to be non-overlapping. */
+ dirp = memcpy (tmp + allocated - (oldsize - dirroom),
+ tmp + dirroom,
+ oldsize - dirroom);
+ dir = tmp;
+ }
+ }
+ dirp -= namlen;
+ memcpy (dirp, d->d_name, namlen);
+ *--dirp = '/';
+
+ thisdev = dotdev;
+ thisino = dotino;
+ }
+
+ if (dirstream && __closedir (dirstream) != 0)
+ {
+ dirstream = NULL;
+ goto lose;
+ }
+
+ if (dirp == &dir[allocated - 1])
+ *--dirp = '/';
+
+#if ! HAVE_OPENAT_SUPPORT
+ if (dotlist != dots)
+ free (dotlist);
+#endif
+
+ used = dir + allocated - dirp;
+ memmove (dir, dirp, used);
+
+ if (size == 0)
+ /* Ensure that the buffer is only as large as necessary. */
+ buf = realloc (dir, used);
+
+ if (buf == NULL)
+ /* Either buf was NULL all along, or `realloc' failed but
+ we still have the original string. */
+ buf = dir;
+
+ return buf;
+
+ memory_exhausted:
+ __set_errno (ENOMEM);
+ lose:
+ {
+ int save = errno;
+ if (dirstream)
+ __closedir (dirstream);
+#if HAVE_OPENAT_SUPPORT
+ if (fd_needs_closing)
+ close (fd);
+#else
+ if (dotlist != dots)
+ free (dotlist);
+#endif
+ if (buf == NULL)
+ free (dir);
+ __set_errno (save);
+ }
+ return NULL;
+}
+
+#ifdef weak_alias
+weak_alias (__getcwd, getcwd)
+#endif
diff --git a/gnulib/lib/getdate.h b/gnulib/lib/getdate.h
new file mode 100644
index 00000000..22cc2c02
--- /dev/null
+++ b/gnulib/lib/getdate.h
@@ -0,0 +1,22 @@
+/* Parse a string into an internal time stamp.
+
+ Copyright (C) 1995, 1997, 1998, 2003, 2004, 2007, 2009, 2010 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/>. */
+
+#include <stdbool.h>
+#include <time.h>
+
+bool get_date (struct timespec *, char const *, struct timespec const *);
diff --git a/gnulib/lib/getdate.y b/gnulib/lib/getdate.y
new file mode 100644
index 00000000..445865bd
--- /dev/null
+++ b/gnulib/lib/getdate.y
@@ -0,0 +1,1572 @@
+%{
+/* Parse a string into an internal time stamp.
+
+ Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+ 2010 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/>. */
+
+/* Originally written by Steven M. Bellovin <smb@research.att.com> while
+ at the University of North Carolina at Chapel Hill. Later tweaked by
+ a couple of people on Usenet. Completely overhauled by Rich $alz
+ <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990.
+
+ Modified by Paul Eggert <eggert@twinsun.com> in August 1999 to do
+ the right thing about local DST. Also modified by Paul Eggert
+ <eggert@cs.ucla.edu> in February 2004 to support
+ nanosecond-resolution time stamps, and in October 2004 to support
+ TZ strings in dates. */
+
+/* FIXME: Check for arithmetic overflow in all cases, not just
+ some of them. */
+
+#include <config.h>
+
+#include "getdate.h"
+
+#include "intprops.h"
+#include "timespec.h"
+#include "verify.h"
+
+/* There's no need to extend the stack, so there's no need to involve
+ alloca. */
+#define YYSTACK_USE_ALLOCA 0
+
+/* Tell Bison how much stack space is needed. 20 should be plenty for
+ this grammar, which is not right recursive. Beware setting it too
+ high, since that might cause problems on machines whose
+ implementations have lame stack-overflow checking. */
+#define YYMAXDEPTH 20
+#define YYINITDEPTH YYMAXDEPTH
+
+/* Since the code of getdate.y is not included in the Emacs executable
+ itself, there is no need to #define static in this file. Even if
+ the code were included in the Emacs executable, it probably
+ wouldn't do any harm to #undef it here; this will only cause
+ problems if we try to write to a static variable, which I don't
+ think this code needs to do. */
+#ifdef emacs
+# undef static
+#endif
+
+#include <c-ctype.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that INT_BITS is at least 32.
+
+ ISO C99 says that A >> B is implementation-defined if A < 0. Some
+ implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
+ right in the usual way when A < 0, so SHR falls back on division if
+ ordinary A >> B doesn't seem to be the usual signed shift. */
+#define SHR(a, b) \
+ (-1 >> 1 == -1 \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+
+#define HOUR(x) ((x) * 60)
+
+/* long_time_t is a signed integer type that contains all time_t values. */
+verify (TYPE_IS_INTEGER (time_t));
+#if TIME_T_FITS_IN_LONG_INT
+typedef long int long_time_t;
+#else
+typedef time_t long_time_t;
+#endif
+
+/* Lots of this code assumes time_t and time_t-like values fit into
+ long_time_t. */
+verify (TYPE_MINIMUM (long_time_t) <= TYPE_MINIMUM (time_t)
+ && TYPE_MAXIMUM (time_t) <= TYPE_MAXIMUM (long_time_t));
+
+/* FIXME: It also assumes that signed integer overflow silently wraps around,
+ but this is not true any more with recent versions of GCC 4. */
+
+/* An integer value, and the number of digits in its textual
+ representation. */
+typedef struct
+{
+ bool negative;
+ long int value;
+ size_t digits;
+} textint;
+
+/* An entry in the lexical lookup table. */
+typedef struct
+{
+ char const *name;
+ int type;
+ int value;
+} table;
+
+/* Meridian: am, pm, or 24-hour style. */
+enum { MERam, MERpm, MER24 };
+
+enum { BILLION = 1000000000, LOG10_BILLION = 9 };
+
+/* Relative times. */
+typedef struct
+{
+ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */
+ long int year;
+ long int month;
+ long int day;
+ long int hour;
+ long int minutes;
+ long_time_t seconds;
+ long int ns;
+} relative_time;
+
+#if HAVE_COMPOUND_LITERALS
+# define RELATIVE_TIME_0 ((relative_time) { 0, 0, 0, 0, 0, 0, 0 })
+#else
+static relative_time const RELATIVE_TIME_0;
+#endif
+
+/* Information passed to and from the parser. */
+typedef struct
+{
+ /* The input string remaining to be parsed. */
+ const char *input;
+
+ /* N, if this is the Nth Tuesday. */
+ long int day_ordinal;
+
+ /* Day of week; Sunday is 0. */
+ int day_number;
+
+ /* tm_isdst flag for the local zone. */
+ int local_isdst;
+
+ /* Time zone, in minutes east of UTC. */
+ long int time_zone;
+
+ /* Style used for time. */
+ int meridian;
+
+ /* Gregorian year, month, day, hour, minutes, seconds, and nanoseconds. */
+ textint year;
+ long int month;
+ long int day;
+ long int hour;
+ long int minutes;
+ struct timespec seconds; /* includes nanoseconds */
+
+ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */
+ relative_time rel;
+
+ /* Presence or counts of nonterminals of various flavors parsed so far. */
+ bool timespec_seen;
+ bool rels_seen;
+ size_t dates_seen;
+ size_t days_seen;
+ size_t local_zones_seen;
+ size_t dsts_seen;
+ size_t times_seen;
+ size_t zones_seen;
+
+ /* Table of local time zone abbrevations, terminated by a null entry. */
+ table local_time_zone_table[3];
+} parser_control;
+
+union YYSTYPE;
+static int yylex (union YYSTYPE *, parser_control *);
+static int yyerror (parser_control const *, char const *);
+static long int time_zone_hhmm (parser_control *, textint, long int);
+
+/* Extract into *PC any date and time info from a string of digits
+ of the form e.g., YYYYMMDD, YYMMDD, HHMM, HH (and sometimes YYY,
+ YYYY, ...). */
+static void
+digits_to_date_time (parser_control *pc, textint text_int)
+{
+ if (pc->dates_seen && ! pc->year.digits
+ && ! pc->rels_seen && (pc->times_seen || 2 < text_int.digits))
+ pc->year = text_int;
+ else
+ {
+ if (4 < text_int.digits)
+ {
+ pc->dates_seen++;
+ pc->day = text_int.value % 100;
+ pc->month = (text_int.value / 100) % 100;
+ pc->year.value = text_int.value / 10000;
+ pc->year.digits = text_int.digits - 4;
+ }
+ else
+ {
+ pc->times_seen++;
+ if (text_int.digits <= 2)
+ {
+ pc->hour = text_int.value;
+ pc->minutes = 0;
+ }
+ else
+ {
+ pc->hour = text_int.value / 100;
+ pc->minutes = text_int.value % 100;
+ }
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = MER24;
+ }
+ }
+}
+
+/* Increment PC->rel by FACTOR * REL (FACTOR is 1 or -1). */
+static void
+apply_relative_time (parser_control *pc, relative_time rel, int factor)
+{
+ pc->rel.ns += factor * rel.ns;
+ pc->rel.seconds += factor * rel.seconds;
+ pc->rel.minutes += factor * rel.minutes;
+ pc->rel.hour += factor * rel.hour;
+ pc->rel.day += factor * rel.day;
+ pc->rel.month += factor * rel.month;
+ pc->rel.year += factor * rel.year;
+ pc->rels_seen = true;
+}
+
+/* Set PC-> hour, minutes, seconds and nanoseconds members from arguments. */
+static void
+set_hhmmss (parser_control *pc, long int hour, long int minutes,
+ time_t sec, long int nsec)
+{
+ pc->hour = hour;
+ pc->minutes = minutes;
+ pc->seconds.tv_sec = sec;
+ pc->seconds.tv_nsec = nsec;
+}
+
+%}
+
+/* We want a reentrant parser, even if the TZ manipulation and the calls to
+ localtime and gmtime are not reentrant. */
+%pure-parser
+%parse-param { parser_control *pc }
+%lex-param { parser_control *pc }
+
+/* This grammar has 20 shift/reduce conflicts. */
+%expect 20
+
+%union
+{
+ long int intval;
+ textint textintval;
+ struct timespec timespec;
+ relative_time rel;
+}
+
+%token tAGO tDST
+
+%token tYEAR_UNIT tMONTH_UNIT tHOUR_UNIT tMINUTE_UNIT tSEC_UNIT
+%token <intval> tDAY_UNIT tDAY_SHIFT
+
+%token <intval> tDAY tDAYZONE tLOCAL_ZONE tMERIDIAN
+%token <intval> tMONTH tORDINAL tZONE
+
+%token <textintval> tSNUMBER tUNUMBER
+%token <timespec> tSDECIMAL_NUMBER tUDECIMAL_NUMBER
+
+%type <intval> o_colon_minutes o_merid
+%type <timespec> seconds signed_seconds unsigned_seconds
+
+%type <rel> relunit relunit_snumber dayshift
+
+%%
+
+spec:
+ timespec
+ | items
+ ;
+
+timespec:
+ '@' seconds
+ {
+ pc->seconds = $2;
+ pc->timespec_seen = true;
+ }
+ ;
+
+items:
+ /* empty */
+ | items item
+ ;
+
+item:
+ time
+ { pc->times_seen++; }
+ | local_zone
+ { pc->local_zones_seen++; }
+ | zone
+ { pc->zones_seen++; }
+ | date
+ { pc->dates_seen++; }
+ | day
+ { pc->days_seen++; }
+ | rel
+ | number
+ | hybrid
+ ;
+
+time:
+ tUNUMBER tMERIDIAN
+ {
+ set_hhmmss (pc, $1.value, 0, 0, 0);
+ pc->meridian = $2;
+ }
+ | tUNUMBER ':' tUNUMBER o_merid
+ {
+ set_hhmmss (pc, $1.value, $3.value, 0, 0);
+ pc->meridian = $4;
+ }
+ | tUNUMBER ':' tUNUMBER tSNUMBER o_colon_minutes
+ {
+ set_hhmmss (pc, $1.value, $3.value, 0, 0);
+ pc->meridian = MER24;
+ pc->zones_seen++;
+ pc->time_zone = time_zone_hhmm (pc, $4, $5);
+ }
+ | tUNUMBER ':' tUNUMBER ':' unsigned_seconds o_merid
+ {
+ set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec);
+ pc->meridian = $6;
+ }
+ | tUNUMBER ':' tUNUMBER ':' unsigned_seconds tSNUMBER o_colon_minutes
+ {
+ set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec);
+ pc->meridian = MER24;
+ pc->zones_seen++;
+ pc->time_zone = time_zone_hhmm (pc, $6, $7);
+ }
+ ;
+
+local_zone:
+ tLOCAL_ZONE
+ {
+ pc->local_isdst = $1;
+ pc->dsts_seen += (0 < $1);
+ }
+ | tLOCAL_ZONE tDST
+ {
+ pc->local_isdst = 1;
+ pc->dsts_seen += (0 < $1) + 1;
+ }
+ ;
+
+zone:
+ tZONE
+ { pc->time_zone = $1; }
+ | tZONE relunit_snumber
+ { pc->time_zone = $1;
+ apply_relative_time (pc, $2, 1); }
+ | tZONE tSNUMBER o_colon_minutes
+ { pc->time_zone = $1 + time_zone_hhmm (pc, $2, $3); }
+ | tDAYZONE
+ { pc->time_zone = $1 + 60; }
+ | tZONE tDST
+ { pc->time_zone = $1 + 60; }
+ ;
+
+day:
+ tDAY
+ {
+ pc->day_ordinal = 0;
+ pc->day_number = $1;
+ }
+ | tDAY ','
+ {
+ pc->day_ordinal = 0;
+ pc->day_number = $1;
+ }
+ | tORDINAL tDAY
+ {
+ pc->day_ordinal = $1;
+ pc->day_number = $2;
+ }
+ | tUNUMBER tDAY
+ {
+ pc->day_ordinal = $1.value;
+ pc->day_number = $2;
+ }
+ ;
+
+date:
+ tUNUMBER '/' tUNUMBER
+ {
+ pc->month = $1.value;
+ pc->day = $3.value;
+ }
+ | tUNUMBER '/' tUNUMBER '/' tUNUMBER
+ {
+ /* Interpret as YYYY/MM/DD if the first value has 4 or more digits,
+ otherwise as MM/DD/YY.
+ The goal in recognizing YYYY/MM/DD is solely to support legacy
+ machine-generated dates like those in an RCS log listing. If
+ you want portability, use the ISO 8601 format. */
+ if (4 <= $1.digits)
+ {
+ pc->year = $1;
+ pc->month = $3.value;
+ pc->day = $5.value;
+ }
+ else
+ {
+ pc->month = $1.value;
+ pc->day = $3.value;
+ pc->year = $5;
+ }
+ }
+ | tUNUMBER tSNUMBER tSNUMBER
+ {
+ /* ISO 8601 format. YYYY-MM-DD. */
+ pc->year = $1;
+ pc->month = -$2.value;
+ pc->day = -$3.value;
+ }
+ | tUNUMBER tMONTH tSNUMBER
+ {
+ /* e.g. 17-JUN-1992. */
+ pc->day = $1.value;
+ pc->month = $2;
+ pc->year.value = -$3.value;
+ pc->year.digits = $3.digits;
+ }
+ | tMONTH tSNUMBER tSNUMBER
+ {
+ /* e.g. JUN-17-1992. */
+ pc->month = $1;
+ pc->day = -$2.value;
+ pc->year.value = -$3.value;
+ pc->year.digits = $3.digits;
+ }
+ | tMONTH tUNUMBER
+ {
+ pc->month = $1;
+ pc->day = $2.value;
+ }
+ | tMONTH tUNUMBER ',' tUNUMBER
+ {
+ pc->month = $1;
+ pc->day = $2.value;
+ pc->year = $4;
+ }
+ | tUNUMBER tMONTH
+ {
+ pc->day = $1.value;
+ pc->month = $2;
+ }
+ | tUNUMBER tMONTH tUNUMBER
+ {
+ pc->day = $1.value;
+ pc->month = $2;
+ pc->year = $3;
+ }
+ ;
+
+rel:
+ relunit tAGO
+ { apply_relative_time (pc, $1, -1); }
+ | relunit
+ { apply_relative_time (pc, $1, 1); }
+ | dayshift
+ { apply_relative_time (pc, $1, 1); }
+ ;
+
+relunit:
+ tORDINAL tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1; }
+ | tUNUMBER tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1.value; }
+ | tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = 1; }
+ | tORDINAL tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1; }
+ | tUNUMBER tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1.value; }
+ | tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = 1; }
+ | tORDINAL tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1 * $2; }
+ | tUNUMBER tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1.value * $2; }
+ | tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1; }
+ | tORDINAL tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1; }
+ | tUNUMBER tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1.value; }
+ | tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = 1; }
+ | tORDINAL tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1; }
+ | tUNUMBER tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1.value; }
+ | tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = 1; }
+ | tORDINAL tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1; }
+ | tUNUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; }
+ | tSDECIMAL_NUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.tv_sec; $$.ns = $1.tv_nsec; }
+ | tUDECIMAL_NUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.tv_sec; $$.ns = $1.tv_nsec; }
+ | tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = 1; }
+ | relunit_snumber
+ ;
+
+relunit_snumber:
+ tSNUMBER tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1.value; }
+ | tSNUMBER tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1.value; }
+ | tSNUMBER tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1.value * $2; }
+ | tSNUMBER tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1.value; }
+ | tSNUMBER tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1.value; }
+ | tSNUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; }
+ ;
+
+dayshift:
+ tDAY_SHIFT
+ { $$ = RELATIVE_TIME_0; $$.day = $1; }
+ ;
+
+seconds: signed_seconds | unsigned_seconds;
+
+signed_seconds:
+ tSDECIMAL_NUMBER
+ | tSNUMBER
+ { $$.tv_sec = $1.value; $$.tv_nsec = 0; }
+ ;
+
+unsigned_seconds:
+ tUDECIMAL_NUMBER
+ | tUNUMBER
+ { $$.tv_sec = $1.value; $$.tv_nsec = 0; }
+ ;
+
+number:
+ tUNUMBER
+ { digits_to_date_time (pc, $1); }
+ ;
+
+hybrid:
+ tUNUMBER relunit_snumber
+ {
+ /* Hybrid all-digit and relative offset, so that we accept e.g.,
+ "YYYYMMDD +N days" as well as "YYYYMMDD N days". */
+ digits_to_date_time (pc, $1);
+ apply_relative_time (pc, $2, 1);
+ }
+ ;
+
+o_colon_minutes:
+ /* empty */
+ { $$ = -1; }
+ | ':' tUNUMBER
+ { $$ = $2.value; }
+ ;
+
+o_merid:
+ /* empty */
+ { $$ = MER24; }
+ | tMERIDIAN
+ { $$ = $1; }
+ ;
+
+%%
+
+static table const meridian_table[] =
+{
+ { "AM", tMERIDIAN, MERam },
+ { "A.M.", tMERIDIAN, MERam },
+ { "PM", tMERIDIAN, MERpm },
+ { "P.M.", tMERIDIAN, MERpm },
+ { NULL, 0, 0 }
+};
+
+static table const dst_table[] =
+{
+ { "DST", tDST, 0 }
+};
+
+static table const month_and_day_table[] =
+{
+ { "JANUARY", tMONTH, 1 },
+ { "FEBRUARY", tMONTH, 2 },
+ { "MARCH", tMONTH, 3 },
+ { "APRIL", tMONTH, 4 },
+ { "MAY", tMONTH, 5 },
+ { "JUNE", tMONTH, 6 },
+ { "JULY", tMONTH, 7 },
+ { "AUGUST", tMONTH, 8 },
+ { "SEPTEMBER",tMONTH, 9 },
+ { "SEPT", tMONTH, 9 },
+ { "OCTOBER", tMONTH, 10 },
+ { "NOVEMBER", tMONTH, 11 },
+ { "DECEMBER", tMONTH, 12 },
+ { "SUNDAY", tDAY, 0 },
+ { "MONDAY", tDAY, 1 },
+ { "TUESDAY", tDAY, 2 },
+ { "TUES", tDAY, 2 },
+ { "WEDNESDAY",tDAY, 3 },
+ { "WEDNES", tDAY, 3 },
+ { "THURSDAY", tDAY, 4 },
+ { "THUR", tDAY, 4 },
+ { "THURS", tDAY, 4 },
+ { "FRIDAY", tDAY, 5 },
+ { "SATURDAY", tDAY, 6 },
+ { NULL, 0, 0 }
+};
+
+static table const time_units_table[] =
+{
+ { "YEAR", tYEAR_UNIT, 1 },
+ { "MONTH", tMONTH_UNIT, 1 },
+ { "FORTNIGHT",tDAY_UNIT, 14 },
+ { "WEEK", tDAY_UNIT, 7 },
+ { "DAY", tDAY_UNIT, 1 },
+ { "HOUR", tHOUR_UNIT, 1 },
+ { "MINUTE", tMINUTE_UNIT, 1 },
+ { "MIN", tMINUTE_UNIT, 1 },
+ { "SECOND", tSEC_UNIT, 1 },
+ { "SEC", tSEC_UNIT, 1 },
+ { NULL, 0, 0 }
+};
+
+/* Assorted relative-time words. */
+static table const relative_time_table[] =
+{
+ { "TOMORROW", tDAY_SHIFT, 1 },
+ { "YESTERDAY",tDAY_SHIFT, -1 },
+ { "TODAY", tDAY_SHIFT, 0 },
+ { "NOW", tDAY_SHIFT, 0 },
+ { "LAST", tORDINAL, -1 },
+ { "THIS", tORDINAL, 0 },
+ { "NEXT", tORDINAL, 1 },
+ { "FIRST", tORDINAL, 1 },
+/*{ "SECOND", tORDINAL, 2 }, */
+ { "THIRD", tORDINAL, 3 },
+ { "FOURTH", tORDINAL, 4 },
+ { "FIFTH", tORDINAL, 5 },
+ { "SIXTH", tORDINAL, 6 },
+ { "SEVENTH", tORDINAL, 7 },
+ { "EIGHTH", tORDINAL, 8 },
+ { "NINTH", tORDINAL, 9 },
+ { "TENTH", tORDINAL, 10 },
+ { "ELEVENTH", tORDINAL, 11 },
+ { "TWELFTH", tORDINAL, 12 },
+ { "AGO", tAGO, 1 },
+ { NULL, 0, 0 }
+};
+
+/* The universal time zone table. These labels can be used even for
+ time stamps that would not otherwise be valid, e.g., GMT time
+ stamps in London during summer. */
+static table const universal_time_zone_table[] =
+{
+ { "GMT", tZONE, HOUR ( 0) }, /* Greenwich Mean */
+ { "UT", tZONE, HOUR ( 0) }, /* Universal (Coordinated) */
+ { "UTC", tZONE, HOUR ( 0) },
+ { NULL, 0, 0 }
+};
+
+/* The time zone table. This table is necessarily incomplete, as time
+ zone abbreviations are ambiguous; e.g. Australians interpret "EST"
+ as Eastern time in Australia, not as US Eastern Standard Time.
+ You cannot rely on getdate to handle arbitrary time zone
+ abbreviations; use numeric abbreviations like `-0500' instead. */
+static table const time_zone_table[] =
+{
+ { "WET", tZONE, HOUR ( 0) }, /* Western European */
+ { "WEST", tDAYZONE, HOUR ( 0) }, /* Western European Summer */
+ { "BST", tDAYZONE, HOUR ( 0) }, /* British Summer */
+ { "ART", tZONE, -HOUR ( 3) }, /* Argentina */
+ { "BRT", tZONE, -HOUR ( 3) }, /* Brazil */
+ { "BRST", tDAYZONE, -HOUR ( 3) }, /* Brazil Summer */
+ { "NST", tZONE, -(HOUR ( 3) + 30) }, /* Newfoundland Standard */
+ { "NDT", tDAYZONE,-(HOUR ( 3) + 30) }, /* Newfoundland Daylight */
+ { "AST", tZONE, -HOUR ( 4) }, /* Atlantic Standard */
+ { "ADT", tDAYZONE, -HOUR ( 4) }, /* Atlantic Daylight */
+ { "CLT", tZONE, -HOUR ( 4) }, /* Chile */
+ { "CLST", tDAYZONE, -HOUR ( 4) }, /* Chile Summer */
+ { "EST", tZONE, -HOUR ( 5) }, /* Eastern Standard */
+ { "EDT", tDAYZONE, -HOUR ( 5) }, /* Eastern Daylight */
+ { "CST", tZONE, -HOUR ( 6) }, /* Central Standard */
+ { "CDT", tDAYZONE, -HOUR ( 6) }, /* Central Daylight */
+ { "MST", tZONE, -HOUR ( 7) }, /* Mountain Standard */
+ { "MDT", tDAYZONE, -HOUR ( 7) }, /* Mountain Daylight */
+ { "PST", tZONE, -HOUR ( 8) }, /* Pacific Standard */
+ { "PDT", tDAYZONE, -HOUR ( 8) }, /* Pacific Daylight */
+ { "AKST", tZONE, -HOUR ( 9) }, /* Alaska Standard */
+ { "AKDT", tDAYZONE, -HOUR ( 9) }, /* Alaska Daylight */
+ { "HST", tZONE, -HOUR (10) }, /* Hawaii Standard */
+ { "HAST", tZONE, -HOUR (10) }, /* Hawaii-Aleutian Standard */
+ { "HADT", tDAYZONE, -HOUR (10) }, /* Hawaii-Aleutian Daylight */
+ { "SST", tZONE, -HOUR (12) }, /* Samoa Standard */
+ { "WAT", tZONE, HOUR ( 1) }, /* West Africa */
+ { "CET", tZONE, HOUR ( 1) }, /* Central European */
+ { "CEST", tDAYZONE, HOUR ( 1) }, /* Central European Summer */
+ { "MET", tZONE, HOUR ( 1) }, /* Middle European */
+ { "MEZ", tZONE, HOUR ( 1) }, /* Middle European */
+ { "MEST", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */
+ { "MESZ", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */
+ { "EET", tZONE, HOUR ( 2) }, /* Eastern European */
+ { "EEST", tDAYZONE, HOUR ( 2) }, /* Eastern European Summer */
+ { "CAT", tZONE, HOUR ( 2) }, /* Central Africa */
+ { "SAST", tZONE, HOUR ( 2) }, /* South Africa Standard */
+ { "EAT", tZONE, HOUR ( 3) }, /* East Africa */
+ { "MSK", tZONE, HOUR ( 3) }, /* Moscow */
+ { "MSD", tDAYZONE, HOUR ( 3) }, /* Moscow Daylight */
+ { "IST", tZONE, (HOUR ( 5) + 30) }, /* India Standard */
+ { "SGT", tZONE, HOUR ( 8) }, /* Singapore */
+ { "KST", tZONE, HOUR ( 9) }, /* Korea Standard */
+ { "JST", tZONE, HOUR ( 9) }, /* Japan Standard */
+ { "GST", tZONE, HOUR (10) }, /* Guam Standard */
+ { "NZST", tZONE, HOUR (12) }, /* New Zealand Standard */
+ { "NZDT", tDAYZONE, HOUR (12) }, /* New Zealand Daylight */
+ { NULL, 0, 0 }
+};
+
+/* Military time zone table. */
+static table const military_table[] =
+{
+ { "A", tZONE, -HOUR ( 1) },
+ { "B", tZONE, -HOUR ( 2) },
+ { "C", tZONE, -HOUR ( 3) },
+ { "D", tZONE, -HOUR ( 4) },
+ { "E", tZONE, -HOUR ( 5) },
+ { "F", tZONE, -HOUR ( 6) },
+ { "G", tZONE, -HOUR ( 7) },
+ { "H", tZONE, -HOUR ( 8) },
+ { "I", tZONE, -HOUR ( 9) },
+ { "K", tZONE, -HOUR (10) },
+ { "L", tZONE, -HOUR (11) },
+ { "M", tZONE, -HOUR (12) },
+ { "N", tZONE, HOUR ( 1) },
+ { "O", tZONE, HOUR ( 2) },
+ { "P", tZONE, HOUR ( 3) },
+ { "Q", tZONE, HOUR ( 4) },
+ { "R", tZONE, HOUR ( 5) },
+ { "S", tZONE, HOUR ( 6) },
+ { "T", tZONE, HOUR ( 7) },
+ { "U", tZONE, HOUR ( 8) },
+ { "V", tZONE, HOUR ( 9) },
+ { "W", tZONE, HOUR (10) },
+ { "X", tZONE, HOUR (11) },
+ { "Y", tZONE, HOUR (12) },
+ { "Z", tZONE, HOUR ( 0) },
+ { NULL, 0, 0 }
+};
+
+
+
+/* Convert a time zone expressed as HH:MM into an integer count of
+ minutes. If MM is negative, then S is of the form HHMM and needs
+ to be picked apart; otherwise, S is of the form HH. As specified in
+ http://www.opengroup.org/susv3xbd/xbd_chap08.html#tag_08_03, allow
+ only valid TZ range, and consider first two digits as hours, if no
+ minutes specified. */
+
+static long int
+time_zone_hhmm (parser_control *pc, textint s, long int mm)
+{
+ long int n_minutes;
+
+ /* If the length of S is 1 or 2 and no minutes are specified,
+ interpret it as a number of hours. */
+ if (s.digits <= 2 && mm < 0)
+ s.value *= 100;
+
+ if (mm < 0)
+ n_minutes = (s.value / 100) * 60 + s.value % 100;
+ else
+ n_minutes = s.value * 60 + (s.negative ? -mm : mm);
+
+ /* If the absolute number of minutes is larger than 24 hours,
+ arrange to reject it by incrementing pc->zones_seen. Thus,
+ we allow only values in the range UTC-24:00 to UTC+24:00. */
+ if (24 * 60 < abs (n_minutes))
+ pc->zones_seen++;
+
+ return n_minutes;
+}
+
+static int
+to_hour (long int hours, int meridian)
+{
+ switch (meridian)
+ {
+ default: /* Pacify GCC. */
+ case MER24:
+ return 0 <= hours && hours < 24 ? hours : -1;
+ case MERam:
+ return 0 < hours && hours < 12 ? hours : hours == 12 ? 0 : -1;
+ case MERpm:
+ return 0 < hours && hours < 12 ? hours + 12 : hours == 12 ? 12 : -1;
+ }
+}
+
+static long int
+to_year (textint textyear)
+{
+ long int year = textyear.value;
+
+ if (year < 0)
+ year = -year;
+
+ /* XPG4 suggests that years 00-68 map to 2000-2068, and
+ years 69-99 map to 1969-1999. */
+ else if (textyear.digits == 2)
+ year += year < 69 ? 2000 : 1900;
+
+ return year;
+}
+
+static table const *
+lookup_zone (parser_control const *pc, char const *name)
+{
+ table const *tp;
+
+ for (tp = universal_time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ /* Try local zone abbreviations before those in time_zone_table, as
+ the local ones are more likely to be right. */
+ for (tp = pc->local_time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ for (tp = time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ return NULL;
+}
+
+#if ! HAVE_TM_GMTOFF
+/* Yield the difference between *A and *B,
+ measured in seconds, ignoring leap seconds.
+ The body of this function is taken directly from the GNU C Library;
+ see src/strftime.c. */
+static long int
+tm_diff (struct tm const *a, struct tm const *b)
+{
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid int overflow in leap day calculations. */
+ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3);
+ int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3);
+ int a100 = a4 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 0);
+ int a400 = SHR (a100, 2);
+ int b400 = SHR (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+ long int ayear = a->tm_year;
+ long int years = ayear - b->tm_year;
+ long int days = (365 * years + intervening_leap_days
+ + (a->tm_yday - b->tm_yday));
+ return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+ + (a->tm_min - b->tm_min))
+ + (a->tm_sec - b->tm_sec));
+}
+#endif /* ! HAVE_TM_GMTOFF */
+
+static table const *
+lookup_word (parser_control const *pc, char *word)
+{
+ char *p;
+ char *q;
+ size_t wordlen;
+ table const *tp;
+ bool period_found;
+ bool abbrev;
+
+ /* Make it uppercase. */
+ for (p = word; *p; p++)
+ {
+ unsigned char ch = *p;
+ *p = c_toupper (ch);
+ }
+
+ for (tp = meridian_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* See if we have an abbreviation for a month. */
+ wordlen = strlen (word);
+ abbrev = wordlen == 3 || (wordlen == 4 && word[3] == '.');
+
+ for (tp = month_and_day_table; tp->name; tp++)
+ if ((abbrev ? strncmp (word, tp->name, 3) : strcmp (word, tp->name)) == 0)
+ return tp;
+
+ if ((tp = lookup_zone (pc, word)))
+ return tp;
+
+ if (strcmp (word, dst_table[0].name) == 0)
+ return dst_table;
+
+ for (tp = time_units_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* Strip off any plural and try the units table again. */
+ if (word[wordlen - 1] == 'S')
+ {
+ word[wordlen - 1] = '\0';
+ for (tp = time_units_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+ word[wordlen - 1] = 'S'; /* For "this" in relative_time_table. */
+ }
+
+ for (tp = relative_time_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* Military time zones. */
+ if (wordlen == 1)
+ for (tp = military_table; tp->name; tp++)
+ if (word[0] == tp->name[0])
+ return tp;
+
+ /* Drop out any periods and try the time zone table again. */
+ for (period_found = false, p = q = word; (*p = *q); q++)
+ if (*q == '.')
+ period_found = true;
+ else
+ p++;
+ if (period_found && (tp = lookup_zone (pc, word)))
+ return tp;
+
+ return NULL;
+}
+
+static int
+yylex (YYSTYPE *lvalp, parser_control *pc)
+{
+ unsigned char c;
+ size_t count;
+
+ for (;;)
+ {
+ while (c = *pc->input, c_isspace (c))
+ pc->input++;
+
+ if (ISDIGIT (c) || c == '-' || c == '+')
+ {
+ char const *p;
+ int sign;
+ unsigned long int value;
+ if (c == '-' || c == '+')
+ {
+ sign = c == '-' ? -1 : 1;
+ while (c = *++pc->input, c_isspace (c))
+ continue;
+ if (! ISDIGIT (c))
+ /* skip the '-' sign */
+ continue;
+ }
+ else
+ sign = 0;
+ p = pc->input;
+ for (value = 0; ; value *= 10)
+ {
+ unsigned long int value1 = value + (c - '0');
+ if (value1 < value)
+ return '?';
+ value = value1;
+ c = *++p;
+ if (! ISDIGIT (c))
+ break;
+ if (ULONG_MAX / 10 < value)
+ return '?';
+ }
+ if ((c == '.' || c == ',') && ISDIGIT (p[1]))
+ {
+ time_t s;
+ int ns;
+ int digits;
+ unsigned long int value1;
+
+ /* Check for overflow when converting value to time_t. */
+ if (sign < 0)
+ {
+ s = - value;
+ if (0 < s)
+ return '?';
+ value1 = -s;
+ }
+ else
+ {
+ s = value;
+ if (s < 0)
+ return '?';
+ value1 = s;
+ }
+ if (value != value1)
+ return '?';
+
+ /* Accumulate fraction, to ns precision. */
+ p++;
+ ns = *p++ - '0';
+ for (digits = 2; digits <= LOG10_BILLION; digits++)
+ {
+ ns *= 10;
+ if (ISDIGIT (*p))
+ ns += *p++ - '0';
+ }
+
+ /* Skip excess digits, truncating toward -Infinity. */
+ if (sign < 0)
+ for (; ISDIGIT (*p); p++)
+ if (*p != '0')
+ {
+ ns++;
+ break;
+ }
+ while (ISDIGIT (*p))
+ p++;
+
+ /* Adjust to the timespec convention, which is that
+ tv_nsec is always a positive offset even if tv_sec is
+ negative. */
+ if (sign < 0 && ns)
+ {
+ s--;
+ if (! (s < 0))
+ return '?';
+ ns = BILLION - ns;
+ }
+
+ lvalp->timespec.tv_sec = s;
+ lvalp->timespec.tv_nsec = ns;
+ pc->input = p;
+ return sign ? tSDECIMAL_NUMBER : tUDECIMAL_NUMBER;
+ }
+ else
+ {
+ lvalp->textintval.negative = sign < 0;
+ if (sign < 0)
+ {
+ lvalp->textintval.value = - value;
+ if (0 < lvalp->textintval.value)
+ return '?';
+ }
+ else
+ {
+ lvalp->textintval.value = value;
+ if (lvalp->textintval.value < 0)
+ return '?';
+ }
+ lvalp->textintval.digits = p - pc->input;
+ pc->input = p;
+ return sign ? tSNUMBER : tUNUMBER;
+ }
+ }
+
+ if (c_isalpha (c))
+ {
+ char buff[20];
+ char *p = buff;
+ table const *tp;
+
+ do
+ {
+ if (p < buff + sizeof buff - 1)
+ *p++ = c;
+ c = *++pc->input;
+ }
+ while (c_isalpha (c) || c == '.');
+
+ *p = '\0';
+ tp = lookup_word (pc, buff);
+ if (! tp)
+ return '?';
+ lvalp->intval = tp->value;
+ return tp->type;
+ }
+
+ if (c != '(')
+ return *pc->input++;
+ count = 0;
+ do
+ {
+ c = *pc->input++;
+ if (c == '\0')
+ return c;
+ if (c == '(')
+ count++;
+ else if (c == ')')
+ count--;
+ }
+ while (count != 0);
+ }
+}
+
+/* Do nothing if the parser reports an error. */
+static int
+yyerror (parser_control const *pc _GL_UNUSED,
+ char const *s _GL_UNUSED)
+{
+ return 0;
+}
+
+/* If *TM0 is the old and *TM1 is the new value of a struct tm after
+ passing it to mktime, return true if it's OK that mktime returned T.
+ It's not OK if *TM0 has out-of-range members. */
+
+static bool
+mktime_ok (struct tm const *tm0, struct tm const *tm1, time_t t)
+{
+ if (t == (time_t) -1)
+ {
+ /* Guard against falsely reporting an error when parsing a time
+ stamp that happens to equal (time_t) -1, on a host that
+ supports such a time stamp. */
+ tm1 = localtime (&t);
+ if (!tm1)
+ return false;
+ }
+
+ return ! ((tm0->tm_sec ^ tm1->tm_sec)
+ | (tm0->tm_min ^ tm1->tm_min)
+ | (tm0->tm_hour ^ tm1->tm_hour)
+ | (tm0->tm_mday ^ tm1->tm_mday)
+ | (tm0->tm_mon ^ tm1->tm_mon)
+ | (tm0->tm_year ^ tm1->tm_year));
+}
+
+/* A reasonable upper bound for the size of ordinary TZ strings.
+ Use heap allocation if TZ's length exceeds this. */
+enum { TZBUFSIZE = 100 };
+
+/* Return a copy of TZ, stored in TZBUF if it fits, and heap-allocated
+ otherwise. */
+static char *
+get_tz (char tzbuf[TZBUFSIZE])
+{
+ char *tz = getenv ("TZ");
+ if (tz)
+ {
+ size_t tzsize = strlen (tz) + 1;
+ tz = (tzsize <= TZBUFSIZE
+ ? memcpy (tzbuf, tz, tzsize)
+ : xmemdup (tz, tzsize));
+ }
+ return tz;
+}
+
+/* Parse a date/time string, storing the resulting time value into *RESULT.
+ The string itself is pointed to by P. Return true if successful.
+ P can be an incomplete or relative time specification; if so, use
+ *NOW as the basis for the returned time. */
+bool
+get_date (struct timespec *result, char const *p, struct timespec const *now)
+{
+ time_t Start;
+ long int Start_ns;
+ struct tm const *tmp;
+ struct tm tm;
+ struct tm tm0;
+ parser_control pc;
+ struct timespec gettime_buffer;
+ unsigned char c;
+ bool tz_was_altered = false;
+ char *tz0 = NULL;
+ char tz0buf[TZBUFSIZE];
+ bool ok = true;
+
+ if (! now)
+ {
+ gettime (&gettime_buffer);
+ now = &gettime_buffer;
+ }
+
+ Start = now->tv_sec;
+ Start_ns = now->tv_nsec;
+
+ tmp = localtime (&now->tv_sec);
+ if (! tmp)
+ return false;
+
+ while (c = *p, c_isspace (c))
+ p++;
+
+ if (strncmp (p, "TZ=\"", 4) == 0)
+ {
+ char const *tzbase = p + 4;
+ size_t tzsize = 1;
+ char const *s;
+
+ for (s = tzbase; *s; s++, tzsize++)
+ if (*s == '\\')
+ {
+ s++;
+ if (! (*s == '\\' || *s == '"'))
+ break;
+ }
+ else if (*s == '"')
+ {
+ char *z;
+ char *tz1;
+ char tz1buf[TZBUFSIZE];
+ bool large_tz = TZBUFSIZE < tzsize;
+ bool setenv_ok;
+ /* Free tz0, in case this is the 2nd or subsequent time through. */
+ free (tz0);
+ tz0 = get_tz (tz0buf);
+ z = tz1 = large_tz ? xmalloc (tzsize) : tz1buf;
+ for (s = tzbase; *s != '"'; s++)
+ *z++ = *(s += *s == '\\');
+ *z = '\0';
+ setenv_ok = setenv ("TZ", tz1, 1) == 0;
+ if (large_tz)
+ free (tz1);
+ if (!setenv_ok)
+ goto fail;
+ tz_was_altered = true;
+ p = s + 1;
+ }
+ }
+
+ /* As documented, be careful to treat the empty string just like
+ a date string of "0". Without this, an empty string would be
+ declared invalid when parsed during a DST transition. */
+ if (*p == '\0')
+ p = "0";
+
+ pc.input = p;
+ pc.year.value = tmp->tm_year;
+ pc.year.value += TM_YEAR_BASE;
+ pc.year.digits = 0;
+ pc.month = tmp->tm_mon + 1;
+ pc.day = tmp->tm_mday;
+ pc.hour = tmp->tm_hour;
+ pc.minutes = tmp->tm_min;
+ pc.seconds.tv_sec = tmp->tm_sec;
+ pc.seconds.tv_nsec = Start_ns;
+ tm.tm_isdst = tmp->tm_isdst;
+
+ pc.meridian = MER24;
+ pc.rel = RELATIVE_TIME_0;
+ pc.timespec_seen = false;
+ pc.rels_seen = false;
+ pc.dates_seen = 0;
+ pc.days_seen = 0;
+ pc.times_seen = 0;
+ pc.local_zones_seen = 0;
+ pc.dsts_seen = 0;
+ pc.zones_seen = 0;
+
+#if HAVE_STRUCT_TM_TM_ZONE
+ pc.local_time_zone_table[0].name = tmp->tm_zone;
+ pc.local_time_zone_table[0].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[0].value = tmp->tm_isdst;
+ pc.local_time_zone_table[1].name = NULL;
+
+ /* Probe the names used in the next three calendar quarters, looking
+ for a tm_isdst different from the one we already have. */
+ {
+ int quarter;
+ for (quarter = 1; quarter <= 3; quarter++)
+ {
+ time_t probe = Start + quarter * (90 * 24 * 60 * 60);
+ struct tm const *probe_tm = localtime (&probe);
+ if (probe_tm && probe_tm->tm_zone
+ && probe_tm->tm_isdst != pc.local_time_zone_table[0].value)
+ {
+ {
+ pc.local_time_zone_table[1].name = probe_tm->tm_zone;
+ pc.local_time_zone_table[1].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[1].value = probe_tm->tm_isdst;
+ pc.local_time_zone_table[2].name = NULL;
+ }
+ break;
+ }
+ }
+ }
+#else
+#if HAVE_TZNAME
+ {
+# if !HAVE_DECL_TZNAME
+ extern char *tzname[];
+# endif
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ pc.local_time_zone_table[i].name = tzname[i];
+ pc.local_time_zone_table[i].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[i].value = i;
+ }
+ pc.local_time_zone_table[i].name = NULL;
+ }
+#else
+ pc.local_time_zone_table[0].name = NULL;
+#endif
+#endif
+
+ if (pc.local_time_zone_table[0].name && pc.local_time_zone_table[1].name
+ && ! strcmp (pc.local_time_zone_table[0].name,
+ pc.local_time_zone_table[1].name))
+ {
+ /* This locale uses the same abbrevation for standard and
+ daylight times. So if we see that abbreviation, we don't
+ know whether it's daylight time. */
+ pc.local_time_zone_table[0].value = -1;
+ pc.local_time_zone_table[1].name = NULL;
+ }
+
+ if (yyparse (&pc) != 0)
+ goto fail;
+
+ if (pc.timespec_seen)
+ *result = pc.seconds;
+ else
+ {
+ if (1 < (pc.times_seen | pc.dates_seen | pc.days_seen | pc.dsts_seen
+ | (pc.local_zones_seen + pc.zones_seen)))
+ goto fail;
+
+ tm.tm_year = to_year (pc.year) - TM_YEAR_BASE;
+ tm.tm_mon = pc.month - 1;
+ tm.tm_mday = pc.day;
+ if (pc.times_seen || (pc.rels_seen && ! pc.dates_seen && ! pc.days_seen))
+ {
+ tm.tm_hour = to_hour (pc.hour, pc.meridian);
+ if (tm.tm_hour < 0)
+ goto fail;
+ tm.tm_min = pc.minutes;
+ tm.tm_sec = pc.seconds.tv_sec;
+ }
+ else
+ {
+ tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+ pc.seconds.tv_nsec = 0;
+ }
+
+ /* Let mktime deduce tm_isdst if we have an absolute time stamp. */
+ if (pc.dates_seen | pc.days_seen | pc.times_seen)
+ tm.tm_isdst = -1;
+
+ /* But if the input explicitly specifies local time with or without
+ DST, give mktime that information. */
+ if (pc.local_zones_seen)
+ tm.tm_isdst = pc.local_isdst;
+
+ tm0 = tm;
+
+ Start = mktime (&tm);
+
+ if (! mktime_ok (&tm0, &tm, Start))
+ {
+ if (! pc.zones_seen)
+ goto fail;
+ else
+ {
+ /* Guard against falsely reporting errors near the time_t
+ boundaries when parsing times in other time zones. For
+ example, suppose the input string "1969-12-31 23:00:00 -0100",
+ the current time zone is 8 hours ahead of UTC, and the min
+ time_t value is 1970-01-01 00:00:00 UTC. Then the min
+ localtime value is 1970-01-01 08:00:00, and mktime will
+ therefore fail on 1969-12-31 23:00:00. To work around the
+ problem, set the time zone to 1 hour behind UTC temporarily
+ by setting TZ="XXX1:00" and try mktime again. */
+
+ long int time_zone = pc.time_zone;
+ long int abs_time_zone = time_zone < 0 ? - time_zone : time_zone;
+ long int abs_time_zone_hour = abs_time_zone / 60;
+ int abs_time_zone_min = abs_time_zone % 60;
+ char tz1buf[sizeof "XXX+0:00"
+ + sizeof pc.time_zone * CHAR_BIT / 3];
+ if (!tz_was_altered)
+ tz0 = get_tz (tz0buf);
+ sprintf (tz1buf, "XXX%s%ld:%02d", "-" + (time_zone < 0),
+ abs_time_zone_hour, abs_time_zone_min);
+ if (setenv ("TZ", tz1buf, 1) != 0)
+ goto fail;
+ tz_was_altered = true;
+ tm = tm0;
+ Start = mktime (&tm);
+ if (! mktime_ok (&tm0, &tm, Start))
+ goto fail;
+ }
+ }
+
+ if (pc.days_seen && ! pc.dates_seen)
+ {
+ tm.tm_mday += ((pc.day_number - tm.tm_wday + 7) % 7
+ + 7 * (pc.day_ordinal
+ - (0 < pc.day_ordinal
+ && tm.tm_wday != pc.day_number)));
+ tm.tm_isdst = -1;
+ Start = mktime (&tm);
+ if (Start == (time_t) -1)
+ goto fail;
+ }
+
+ /* Add relative date. */
+ if (pc.rel.year | pc.rel.month | pc.rel.day)
+ {
+ int year = tm.tm_year + pc.rel.year;
+ int month = tm.tm_mon + pc.rel.month;
+ int day = tm.tm_mday + pc.rel.day;
+ if (((year < tm.tm_year) ^ (pc.rel.year < 0))
+ | ((month < tm.tm_mon) ^ (pc.rel.month < 0))
+ | ((day < tm.tm_mday) ^ (pc.rel.day < 0)))
+ goto fail;
+ tm.tm_year = year;
+ tm.tm_mon = month;
+ tm.tm_mday = day;
+ tm.tm_hour = tm0.tm_hour;
+ tm.tm_min = tm0.tm_min;
+ tm.tm_sec = tm0.tm_sec;
+ tm.tm_isdst = tm0.tm_isdst;
+ Start = mktime (&tm);
+ if (Start == (time_t) -1)
+ goto fail;
+ }
+
+ /* The only "output" of this if-block is an updated Start value,
+ so this block must follow others that clobber Start. */
+ if (pc.zones_seen)
+ {
+ long int delta = pc.time_zone * 60;
+ time_t t1;
+#ifdef HAVE_TM_GMTOFF
+ delta -= tm.tm_gmtoff;
+#else
+ time_t t = Start;
+ struct tm const *gmt = gmtime (&t);
+ if (! gmt)
+ goto fail;
+ delta -= tm_diff (&tm, gmt);
+#endif
+ t1 = Start - delta;
+ if ((Start < t1) != (delta < 0))
+ goto fail; /* time_t overflow */
+ Start = t1;
+ }
+
+ /* Add relative hours, minutes, and seconds. On hosts that support
+ leap seconds, ignore the possibility of leap seconds; e.g.,
+ "+ 10 minutes" adds 600 seconds, even if one of them is a
+ leap second. Typically this is not what the user wants, but it's
+ too hard to do it the other way, because the time zone indicator
+ must be applied before relative times, and if mktime is applied
+ again the time zone will be lost. */
+ {
+ long int sum_ns = pc.seconds.tv_nsec + pc.rel.ns;
+ long int normalized_ns = (sum_ns % BILLION + BILLION) % BILLION;
+ time_t t0 = Start;
+ long int d1 = 60 * 60 * pc.rel.hour;
+ time_t t1 = t0 + d1;
+ long int d2 = 60 * pc.rel.minutes;
+ time_t t2 = t1 + d2;
+ long_time_t d3 = pc.rel.seconds;
+ long_time_t t3 = t2 + d3;
+ long int d4 = (sum_ns - normalized_ns) / BILLION;
+ long_time_t t4 = t3 + d4;
+ time_t t5 = t4;
+
+ if ((d1 / (60 * 60) ^ pc.rel.hour)
+ | (d2 / 60 ^ pc.rel.minutes)
+ | ((t1 < t0) ^ (d1 < 0))
+ | ((t2 < t1) ^ (d2 < 0))
+ | ((t3 < t2) ^ (d3 < 0))
+ | ((t4 < t3) ^ (d4 < 0))
+ | (t5 != t4))
+ goto fail;
+
+ result->tv_sec = t5;
+ result->tv_nsec = normalized_ns;
+ }
+ }
+
+ goto done;
+
+ fail:
+ ok = false;
+ done:
+ if (tz_was_altered)
+ ok &= (tz0 ? setenv ("TZ", tz0, 1) : unsetenv ("TZ")) == 0;
+ if (tz0 != tz0buf)
+ free (tz0);
+ return ok;
+}
+
+#if TEST
+
+int
+main (int ac, char **av)
+{
+ char buff[BUFSIZ];
+
+ printf ("Enter date, or blank line to exit.\n\t> ");
+ fflush (stdout);
+
+ buff[BUFSIZ - 1] = '\0';
+ while (fgets (buff, BUFSIZ - 1, stdin) && buff[0])
+ {
+ struct timespec d;
+ struct tm const *tm;
+ if (! get_date (&d, buff, NULL))
+ printf ("Bad format - couldn't convert.\n");
+ else if (! (tm = localtime (&d.tv_sec)))
+ {
+ long int sec = d.tv_sec;
+ printf ("localtime (%ld) failed\n", sec);
+ }
+ else
+ {
+ int ns = d.tv_nsec;
+ printf ("%04ld-%02d-%02d %02d:%02d:%02d.%09d\n",
+ tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec, ns);
+ }
+ printf ("\t> ");
+ fflush (stdout);
+ }
+ return 0;
+}
+#endif /* TEST */
diff --git a/gnulib/lib/getdelim.c b/gnulib/lib/getdelim.c
new file mode 100644
index 00000000..c0240900
--- /dev/null
+++ b/gnulib/lib/getdelim.c
@@ -0,0 +1,137 @@
+/* getdelim.c --- Implementation of replacement getdelim function.
+ Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005, 2006, 2007, 2008,
+ 2009, 2010 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 2, 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Ported from glibc by Simon Josefsson. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <stdio.h>
+
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+# define getc_maybe_unlocked(fp) getc(fp)
+#elif !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE || !HAVE_DECL_GETC_UNLOCKED
+# undef flockfile
+# undef funlockfile
+# define flockfile(x) ((void) 0)
+# define funlockfile(x) ((void) 0)
+# define getc_maybe_unlocked(fp) getc(fp)
+#else
+# define getc_maybe_unlocked(fp) getc_unlocked(fp)
+#endif
+
+/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and
+ NUL-terminate it). *LINEPTR is a pointer returned from malloc (or
+ NULL), pointing to *N characters of space. It is realloc'ed as
+ necessary. Returns the number of characters read (not including
+ the null terminator), or -1 on error or EOF. */
+
+ssize_t
+getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
+{
+ ssize_t result;
+ size_t cur_len = 0;
+
+ if (lineptr == NULL || n == NULL || fp == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ flockfile (fp);
+
+ if (*lineptr == NULL || *n == 0)
+ {
+ char *new_lineptr;
+ *n = 120;
+ new_lineptr = (char *) realloc (*lineptr, *n);
+ if (new_lineptr == NULL)
+ {
+ result = -1;
+ goto unlock_return;
+ }
+ *lineptr = new_lineptr;
+ }
+
+ for (;;)
+ {
+ int i;
+
+ i = getc_maybe_unlocked (fp);
+ if (i == EOF)
+ {
+ result = -1;
+ break;
+ }
+
+ /* Make enough space for len+1 (for final NUL) bytes. */
+ if (cur_len + 1 >= *n)
+ {
+ size_t needed_max =
+ SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
+ size_t needed = 2 * *n + 1; /* Be generous. */
+ char *new_lineptr;
+
+ if (needed_max < needed)
+ needed = needed_max;
+ if (cur_len + 1 >= needed)
+ {
+ result = -1;
+ errno = EOVERFLOW;
+ goto unlock_return;
+ }
+
+ new_lineptr = (char *) realloc (*lineptr, needed);
+ if (new_lineptr == NULL)
+ {
+ result = -1;
+ goto unlock_return;
+ }
+
+ *lineptr = new_lineptr;
+ *n = needed;
+ }
+
+ (*lineptr)[cur_len] = i;
+ cur_len++;
+
+ if (i == delimiter)
+ break;
+ }
+ (*lineptr)[cur_len] = '\0';
+ result = cur_len ? cur_len : result;
+
+ unlock_return:
+ funlockfile (fp); /* doesn't set errno */
+
+ return result;
+}
diff --git a/gnulib/lib/getdomainname.c b/gnulib/lib/getdomainname.c
new file mode 100644
index 00000000..95ca3994
--- /dev/null
+++ b/gnulib/lib/getdomainname.c
@@ -0,0 +1,53 @@
+/* getdomainname emulation for systems that doesn't have it.
+
+ Copyright (C) 2003, 2006, 2008, 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <string.h>
+#include <errno.h>
+
+/* Return the NIS domain name of the machine.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+
+ Put up to LEN bytes of the NIS domain name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+int
+getdomainname (char *name, size_t len)
+{
+ const char *result = ""; /* Hardcode your domain name if you want. */
+ size_t result_len = strlen (result);
+
+ if (result_len > len)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ memcpy (name, result, result_len);
+ if (result_len < len)
+ name[result_len] = '\0';
+ return 0;
+}
diff --git a/gnulib/lib/getdtablesize.c b/gnulib/lib/getdtablesize.c
new file mode 100644
index 00000000..a565a2de
--- /dev/null
+++ b/gnulib/lib/getdtablesize.c
@@ -0,0 +1,63 @@
+/* getdtablesize() function for platforms that don't have it.
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+#include <stdio.h>
+
+/* Cache for the previous getdtablesize () result. */
+static int dtablesize;
+
+int
+getdtablesize (void)
+{
+ if (dtablesize == 0)
+ {
+ /* We are looking for the number N such that the valid file descriptors
+ are 0..N-1. It can be obtained through a loop as follows:
+ {
+ int fd;
+ for (fd = 3; fd < 65536; fd++)
+ if (dup2 (0, fd) == -1)
+ break;
+ return fd;
+ }
+ On Windows XP, the result is 2048.
+ The drawback of this loop is that it allocates memory for a libc
+ internal array that is never freed.
+
+ The number N can also be obtained as the upper bound for
+ _getmaxstdio (). _getmaxstdio () returns the maximum number of open
+ FILE objects. The sanity check in _setmaxstdio reveals the maximum
+ number of file descriptors. This too allocates memory, but it is
+ freed when we call _setmaxstdio with the original value. */
+ int orig_max_stdio = _getmaxstdio ();
+ unsigned int bound;
+ for (bound = 0x10000; _setmaxstdio (bound) < 0; bound = bound / 2)
+ ;
+ _setmaxstdio (orig_max_stdio);
+ dtablesize = bound;
+ }
+ return dtablesize;
+}
+
+#endif
diff --git a/gnulib/lib/getfilecon.c b/gnulib/lib/getfilecon.c
new file mode 100644
index 00000000..d0d0f91d
--- /dev/null
+++ b/gnulib/lib/getfilecon.c
@@ -0,0 +1,87 @@
+/* wrap getfilecon, lgetfilecon, and fgetfilecon
+ Copyright (C) 2009-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <selinux/selinux.h>
+
+#include <sys/types.h>
+#include <errno.h>
+#include <string.h>
+
+/* FIXME: remove this once there is an errno-gnu module
+ that guarantees the definition of ENODATA. */
+#ifndef ENODATA
+# define ENODATA ENOTSUP
+#endif
+
+#undef getfilecon
+#undef lgetfilecon
+#undef fgetfilecon
+int getfilecon (char const *file, security_context_t *con);
+int lgetfilecon (char const *file, security_context_t *con);
+int fgetfilecon (int fd, security_context_t *con);
+
+/* getfilecon, lgetfilecon, and fgetfilecon can all misbehave, be it
+ via an old version of libselinux where these would return 0 and set the
+ result context to NULL, or via a modern kernel+lib operating on a file
+ from a disk whose attributes were set by a kernel from around 2006.
+ In that latter case, the functions return a length of 10 for the
+ "unlabeled" context. Map both failures to a return value of -1, and
+ set errno to ENOTSUP in the first case, and ENODATA in the latter. */
+
+static inline int
+map_to_failure (int ret, security_context_t *con)
+{
+ if (ret == 0)
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+
+ if (ret == 10 && strcmp (*con, "unlabeled") == 0)
+ {
+ freecon (*con);
+ errno = ENODATA;
+ return -1;
+ }
+
+ return ret;
+}
+
+int
+rpl_getfilecon (char const *file, security_context_t *con)
+{
+ int ret = getfilecon (file, con);
+ return map_to_failure (ret, con);
+}
+
+int
+rpl_lgetfilecon (char const *file, security_context_t *con)
+{
+ int ret = lgetfilecon (file, con);
+ return map_to_failure (ret, con);
+}
+
+int
+rpl_fgetfilecon (int fd, security_context_t *con)
+{
+ int ret = fgetfilecon (fd, con);
+ return map_to_failure (ret, con);
+}
diff --git a/gnulib/lib/getgroups.c b/gnulib/lib/getgroups.c
new file mode 100644
index 00000000..c9661d6a
--- /dev/null
+++ b/gnulib/lib/getgroups.c
@@ -0,0 +1,116 @@
+/* provide consistent interface to getgroups for systems that don't allow N==0
+
+ Copyright (C) 1996, 1999, 2003, 2006-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#if !HAVE_GETGROUPS
+
+/* Provide a stub that fails with ENOSYS, since there is no group
+ information available on mingw. */
+int
+getgroups (int n _GL_UNUSED, GETGROUPS_T *groups _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_GETGROUPS */
+
+# undef getgroups
+# ifndef GETGROUPS_ZERO_BUG
+# define GETGROUPS_ZERO_BUG 0
+# endif
+
+/* On at least Ultrix 4.3 and NextStep 3.2, getgroups (0, NULL) always
+ fails. On other systems, it returns the number of supplemental
+ groups for the process. This function handles that special case
+ and lets the system-provided function handle all others. However,
+ it can fail with ENOMEM if memory is tight. It is unspecified
+ whether the effective group id is included in the list. */
+
+int
+rpl_getgroups (int n, gid_t *group)
+{
+ int n_groups;
+ GETGROUPS_T *gbuf;
+ int saved_errno;
+
+ if (n < 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (n != 0 || !GETGROUPS_ZERO_BUG)
+ {
+ int result;
+ if (sizeof *group == sizeof *gbuf)
+ return getgroups (n, (GETGROUPS_T *) group);
+
+ if (SIZE_MAX / sizeof *gbuf <= n)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ gbuf = malloc (n * sizeof *gbuf);
+ if (!gbuf)
+ return -1;
+ result = getgroups (n, gbuf);
+ if (0 <= result)
+ {
+ n = result;
+ while (n--)
+ group[n] = gbuf[n];
+ }
+ saved_errno = errno;
+ free (gbuf);
+ errno == saved_errno;
+ return result;
+ }
+
+ n = 20;
+ while (1)
+ {
+ /* No need to worry about address arithmetic overflow here,
+ since the ancient systems that we're running on have low
+ limits on the number of secondary groups. */
+ gbuf = malloc (n * sizeof *gbuf);
+ if (!gbuf)
+ return -1;
+ n_groups = getgroups (n, gbuf);
+ if (n_groups == -1 ? errno != EINVAL : n_groups < n)
+ break;
+ free (gbuf);
+ n *= 2;
+ }
+
+ saved_errno = errno;
+ free (gbuf);
+ errno = saved_errno;
+
+ return n_groups;
+}
+
+#endif /* HAVE_GETGROUPS */
diff --git a/gnulib/lib/gethostname.c b/gnulib/lib/gethostname.c
new file mode 100644
index 00000000..b0da748f
--- /dev/null
+++ b/gnulib/lib/gethostname.c
@@ -0,0 +1,105 @@
+/* gethostname emulation for SysV and POSIX.1.
+
+ Copyright (C) 1992, 2003, 2006, 2008, 2009, 2010 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/>. */
+
+/* David MacKenzie <djm@gnu.ai.mit.edu>
+ Windows port by Simon Josefsson <simon@josefsson.org> */
+
+#include <config.h>
+
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+/* Unix API. */
+
+/* Specification. */
+#include <unistd.h>
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif
+
+#include <string.h>
+
+/* Put up to LEN chars of the host name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ Return 0 if ok, -1 if error. */
+
+#include <stddef.h>
+
+int
+gethostname (char *name, size_t len)
+{
+#ifdef HAVE_UNAME
+ struct utsname uts;
+
+ if (uname (&uts) == -1)
+ return -1;
+ if (len > sizeof (uts.nodename))
+ {
+ /* More space than we need is available. */
+ name[sizeof (uts.nodename)] = '\0';
+ len = sizeof (uts.nodename);
+ }
+ strncpy (name, uts.nodename, len);
+#else
+ strcpy (name, ""); /* Hardcode your system name if you want. */
+#endif
+ return 0;
+}
+
+#else
+/* Native Windows API. Which primitive to choose?
+ - gethostname() requires linking with -lws2_32.
+ - GetComputerName() does not return the right kind of hostname.
+ - GetComputerNameEx(ComputerNameDnsHostname,...) returns the right hostname,
+ but it is hard to use portably:
+ - It requires defining _WIN32_WINNT to at least 0x0500.
+ - With mingw, it also requires
+ "#define GetComputerNameEx GetComputerNameExA".
+ - With older versions of mingw, none of the declarations are present at
+ all, not even of the enum value ComputerNameDnsHostname.
+ So we use gethostname(). Linking with -lws2_32 is the least evil. */
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <unistd.h>
+
+/* Get INT_MAX. */
+#include <limits.h>
+
+/* Get set_winsock_errno. */
+#include "w32sock.h"
+
+#include "sockets.h"
+
+#undef gethostname
+
+int
+rpl_gethostname (char *name, size_t len)
+{
+ int r;
+
+ if (len > INT_MAX)
+ len = INT_MAX;
+ gl_sockets_startup (SOCKETS_1_1);
+ r = gethostname (name, (int) len);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
+
+#endif
diff --git a/gnulib/lib/gethrxtime.c b/gnulib/lib/gethrxtime.c
new file mode 100644
index 00000000..84367466
--- /dev/null
+++ b/gnulib/lib/gethrxtime.c
@@ -0,0 +1,68 @@
+/* gethrxtime -- get high resolution real time
+
+ Copyright (C) 2005, 2006, 2007, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "gethrxtime.h"
+
+#include <sys/time.h>
+#include "timespec.h"
+
+/* Get the current time, as a count of the number of nanoseconds since
+ an arbitrary epoch (e.g., the system boot time). Prefer a
+ high-resolution clock that is not subject to resetting or
+ drifting. */
+
+xtime_t
+gethrxtime (void)
+{
+#if HAVE_NANOUPTIME
+ {
+ struct timespec ts;
+ nanouptime (&ts);
+ return xtime_make (ts.tv_sec, ts.tv_nsec);
+ }
+#else
+
+# if defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME
+ {
+ struct timespec ts;
+ if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0)
+ return xtime_make (ts.tv_sec, ts.tv_nsec);
+ }
+# endif
+
+# if HAVE_MICROUPTIME
+ {
+ struct timeval tv;
+ microuptime (&tv);
+ return xtime_make (tv.tv_sec, 1000 * tv.tv_usec);
+ }
+
+# else
+ /* No monotonically increasing clocks are available; fall back on a
+ clock that might jump backwards, since it's the best we can do. */
+ {
+ struct timespec ts;
+ gettime (&ts);
+ return xtime_make (ts.tv_sec, ts.tv_nsec);
+ }
+# endif
+#endif
+}
diff --git a/gnulib/lib/gethrxtime.h b/gnulib/lib/gethrxtime.h
new file mode 100644
index 00000000..c25b801f
--- /dev/null
+++ b/gnulib/lib/gethrxtime.h
@@ -0,0 +1,37 @@
+/* gethrxtime -- get high resolution real time
+
+ Copyright (C) 2005, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef GETHRXTIME_H_
+# define GETHRXTIME_H_ 1
+
+# include "xtime.h"
+
+/* Get the current time, as a count of the number of nanoseconds since
+ an arbitrary epoch (e.g., the system boot time). Prefer a
+ high-resolution clock that is not subject to resetting or
+ drifting. */
+
+# if HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME
+# include <time.h>
+static inline xtime_t gethrxtime (void) { return gethrtime (); }
+# else
+xtime_t gethrxtime (void);
+# endif
+
+#endif
diff --git a/gnulib/lib/getline.c b/gnulib/lib/getline.c
new file mode 100644
index 00000000..bc8cbd98
--- /dev/null
+++ b/gnulib/lib/getline.c
@@ -0,0 +1,29 @@
+/* getline.c --- Implementation of replacement getline function.
+ Copyright (C) 2005, 2006, 2007, 2009, 2010 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 2, 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+ssize_t
+getline (char **lineptr, size_t *n, FILE *stream)
+{
+ return getdelim (lineptr, n, '\n', stream);
+}
diff --git a/gnulib/lib/getloadavg.c b/gnulib/lib/getloadavg.c
new file mode 100644
index 00000000..c6d782b4
--- /dev/null
+++ b/gnulib/lib/getloadavg.c
@@ -0,0 +1,1050 @@
+/* Get the system load averages.
+
+ Copyright (C) 1985-1989, 1991-1995, 1997, 1999-2000, 2003-2010 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with gnulib.
+ Bugs can be reported to bug-gnulib@gnu.org.
+
+ 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/>. */
+
+/* Compile-time symbols that this file uses:
+
+ HAVE_PSTAT_GETDYNAMIC Define this if your system has the
+ pstat_getdynamic function. I think it
+ is unique to HPUX9. The best way to get the
+ definition is through the AC_FUNC_GETLOADAVG
+ macro that comes with autoconf 2.13 or newer.
+ If that isn't an option, then just put
+ AC_CHECK_FUNCS(pstat_getdynamic) in your
+ configure.in file.
+ HAVE_LIBPERFSTAT Define this if your system has the
+ perfstat_cpu_total function in libperfstat (AIX).
+ FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist.
+ KERNEL_FILE Name of the kernel file to nlist.
+ LDAV_CVT() Scale the load average from the kernel.
+ Returns a double.
+ LDAV_SYMBOL Name of kernel symbol giving load average.
+ LOAD_AVE_TYPE Type of the load average array in the kernel.
+ Must be defined unless one of
+ apollo, DGUX, NeXT, or UMAX is defined;
+ or we have libkstat;
+ otherwise, no load average is available.
+ HAVE_NLIST_H nlist.h is available. NLIST_STRUCT defaults
+ to this.
+ NLIST_STRUCT Include nlist.h, not a.out.h.
+ N_NAME_POINTER The nlist n_name element is a pointer,
+ not an array.
+ HAVE_STRUCT_NLIST_N_UN_N_NAME `n_un.n_name' is member of `struct nlist'.
+ LINUX_LDAV_FILE [__linux__, __CYGWIN__]: File containing
+ load averages.
+
+ Specific system predefines this file uses, aside from setting
+ default values if not emacs:
+
+ apollo
+ BSD Real BSD, not just BSD-like.
+ convex
+ DGUX
+ eunice UNIX emulator under VMS.
+ hpux
+ __MSDOS__ No-op for MSDOS.
+ NeXT
+ sgi
+ sequent Sequent Dynix 3.x.x (BSD)
+ _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV)
+ sony_news NEWS-OS (works at least for 4.1C)
+ UMAX
+ UMAX4_3
+ VMS
+ WINDOWS32 No-op for Windows95/NT.
+ __linux__ Linux: assumes /proc file system mounted.
+ Support from Michael K. Johnson.
+ __CYGWIN__ Cygwin emulates linux /proc/loadavg.
+ __NetBSD__ NetBSD: assumes /kern file system mounted.
+
+ In addition, to avoid nesting many #ifdefs, we internally set
+ LDAV_DONE to indicate that the load average has been computed.
+
+ We also #define LDAV_PRIVILEGED if a program will require
+ special installation to be able to call getloadavg. */
+
+/* "configure" defines CONFIGURING_GETLOADAVG to sidestep problems
+ with partially-configured source directories. */
+
+#ifndef CONFIGURING_GETLOADAVG
+# include <config.h>
+# include <stdbool.h>
+#endif
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+/* Exclude all the code except the test program at the end
+ if the system has its own `getloadavg' function. */
+
+#ifndef HAVE_GETLOADAVG
+
+# include <sys/types.h>
+
+/* Both the Emacs and non-Emacs sections want this. Some
+ configuration files' definitions for the LOAD_AVE_CVT macro (like
+ sparc.h's) use macros like FSCALE, defined here. */
+# if defined (unix) || defined (__unix)
+# include <sys/param.h>
+# endif
+
+# include "c-strtod.h"
+# include "cloexec.h"
+# include "intprops.h"
+
+/* The existing Emacs configuration files define a macro called
+ LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and
+ returns the load average multiplied by 100. What we actually want
+ is a macro called LDAV_CVT, which returns the load average as an
+ unmultiplied double.
+
+ For backwards compatibility, we'll define LDAV_CVT in terms of
+ LOAD_AVE_CVT, but future machine config files should just define
+ LDAV_CVT directly. */
+
+# if !defined (LDAV_CVT) && defined (LOAD_AVE_CVT)
+# define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0)
+# endif
+
+# if !defined (BSD) && defined (ultrix)
+/* Ultrix behaves like BSD on Vaxen. */
+# define BSD
+# endif
+
+# ifdef NeXT
+/* NeXT in the 2.{0,1,2} releases defines BSD in <sys/param.h>, which
+ conflicts with the definition understood in this file, that this
+ really is BSD. */
+# undef BSD
+
+/* NeXT defines FSCALE in <sys/param.h>. However, we take FSCALE being
+ defined to mean that the nlist method should be used, which is not true. */
+# undef FSCALE
+# endif
+
+/* Same issues as for NeXT apply to the HURD-based GNU system. */
+# ifdef __GNU__
+# undef BSD
+# undef FSCALE
+# endif /* __GNU__ */
+
+/* Set values that are different from the defaults, which are
+ set a little farther down with #ifndef. */
+
+
+/* Some shorthands. */
+
+# if defined (HPUX) && !defined (hpux)
+# define hpux
+# endif
+
+# if defined (__hpux) && !defined (hpux)
+# define hpux
+# endif
+
+# if defined (__sun) && !defined (sun)
+# define sun
+# endif
+
+# if defined (hp300) && !defined (hpux)
+# define MORE_BSD
+# endif
+
+# if defined (ultrix) && defined (mips)
+# define decstation
+# endif
+
+# if defined (__SVR4) && !defined (SVR4)
+# define SVR4
+# endif
+
+# if (defined (sun) && defined (SVR4)) || defined (SOLARIS2)
+# define SUNOS_5
+# endif
+
+# if defined (__osf__) && (defined (__alpha) || defined (__alpha__))
+# define OSF_ALPHA
+# include <sys/mbuf.h>
+# include <sys/socket.h>
+# include <net/route.h>
+# include <sys/table.h>
+/* Tru64 4.0D's table.h redefines sys */
+# undef sys
+# endif
+
+# if defined (__osf__) && (defined (mips) || defined (__mips__))
+# define OSF_MIPS
+# include <sys/table.h>
+# endif
+
+/* UTek's /bin/cc on the 4300 has no architecture specific cpp define by
+ default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>. Combine
+ that with a couple of other things and we'll have a unique match. */
+# if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES)
+# define tek4300 /* Define by emacs, but not by other users. */
+# endif
+
+
+/* VAX C can't handle multi-line #ifs, or lines longer than 256 chars. */
+# ifndef LOAD_AVE_TYPE
+
+# ifdef MORE_BSD
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef sun
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef decstation
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef _SEQUENT_
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef sgi
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef SVR4
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef sony_news
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef sequent
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef OSF_ALPHA
+# define LOAD_AVE_TYPE long
+# endif
+
+# if defined (ardent) && defined (titan)
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef tek4300
+# define LOAD_AVE_TYPE long
+# endif
+
+# if defined (alliant) && defined (i860) /* Alliant FX/2800 */
+# define LOAD_AVE_TYPE long
+# endif
+
+# if defined _AIX && ! defined HAVE_LIBPERFSTAT
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef convex
+# define LOAD_AVE_TYPE double
+# ifndef LDAV_CVT
+# define LDAV_CVT(n) (n)
+# endif
+# endif
+
+# endif /* No LOAD_AVE_TYPE. */
+
+# ifdef OSF_ALPHA
+/* <sys/param.h> defines an incorrect value for FSCALE on Alpha OSF/1,
+ according to ghazi@noc.rutgers.edu. */
+# undef FSCALE
+# define FSCALE 1024.0
+# endif
+
+# if defined (alliant) && defined (i860) /* Alliant FX/2800 */
+/* <sys/param.h> defines an incorrect value for FSCALE on an
+ Alliant FX/2800 Concentrix 2.2, according to ghazi@noc.rutgers.edu. */
+# undef FSCALE
+# define FSCALE 100.0
+# endif
+
+
+# ifndef FSCALE
+
+/* SunOS and some others define FSCALE in sys/param.h. */
+
+# ifdef MORE_BSD
+# define FSCALE 2048.0
+# endif
+
+# if defined (MIPS) || defined (SVR4) || defined (decstation)
+# define FSCALE 256
+# endif
+
+# if defined (sgi) || defined (sequent)
+/* Sometimes both MIPS and sgi are defined, so FSCALE was just defined
+ above under #ifdef MIPS. But we want the sgi value. */
+# undef FSCALE
+# define FSCALE 1000.0
+# endif
+
+# if defined (ardent) && defined (titan)
+# define FSCALE 65536.0
+# endif
+
+# ifdef tek4300
+# define FSCALE 100.0
+# endif
+
+# if defined _AIX && !defined HAVE_LIBPERFSTAT
+# define FSCALE 65536.0
+# endif
+
+# endif /* Not FSCALE. */
+
+# if !defined (LDAV_CVT) && defined (FSCALE)
+# define LDAV_CVT(n) (((double) (n)) / FSCALE)
+# endif
+
+# ifndef NLIST_STRUCT
+# if HAVE_NLIST_H
+# define NLIST_STRUCT
+# endif
+# endif
+
+# if defined (sgi) || (defined (mips) && !defined (BSD))
+# define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))
+# endif
+
+
+# if !defined (KERNEL_FILE) && defined (sequent)
+# define KERNEL_FILE "/dynix"
+# endif
+
+# if !defined (KERNEL_FILE) && defined (hpux)
+# define KERNEL_FILE "/hp-ux"
+# endif
+
+# if !defined (KERNEL_FILE) && (defined (_SEQUENT_) || defined (MIPS) || defined (SVR4) || defined (ISC) || defined (sgi) || (defined (ardent) && defined (titan)))
+# define KERNEL_FILE "/unix"
+# endif
+
+
+# if !defined (LDAV_SYMBOL) && defined (alliant)
+# define LDAV_SYMBOL "_Loadavg"
+# endif
+
+# if !defined (LDAV_SYMBOL) && ((defined (hpux) && !defined (hp9000s300)) || defined (_SEQUENT_) || defined (SVR4) || defined (ISC) || defined (sgi) || (defined (ardent) && defined (titan)) || (defined (_AIX) && !defined(HAVE_LIBPERFSTAT)))
+# define LDAV_SYMBOL "avenrun"
+# endif
+
+# include <unistd.h>
+
+/* LOAD_AVE_TYPE should only get defined if we're going to use the
+ nlist method. */
+# if !defined (LOAD_AVE_TYPE) && (defined (BSD) || defined (LDAV_CVT) || defined (KERNEL_FILE) || defined (LDAV_SYMBOL))
+# define LOAD_AVE_TYPE double
+# endif
+
+# ifdef LOAD_AVE_TYPE
+
+# ifndef __VMS
+# ifndef __linux__
+# ifndef NLIST_STRUCT
+# include <a.out.h>
+# else /* NLIST_STRUCT */
+# include <nlist.h>
+# endif /* NLIST_STRUCT */
+
+# ifdef SUNOS_5
+# include <fcntl.h>
+# include <kvm.h>
+# include <kstat.h>
+# endif
+
+# if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
+# include <sys/pstat.h>
+# endif
+
+# ifndef KERNEL_FILE
+# define KERNEL_FILE "/vmunix"
+# endif /* KERNEL_FILE */
+
+# ifndef LDAV_SYMBOL
+# define LDAV_SYMBOL "_avenrun"
+# endif /* LDAV_SYMBOL */
+# endif /* __linux__ */
+
+# else /* __VMS */
+
+# ifndef eunice
+# include <iodef.h>
+# include <descrip.h>
+# else /* eunice */
+# include <vms/iodef.h>
+# endif /* eunice */
+# endif /* __VMS */
+
+# ifndef LDAV_CVT
+# define LDAV_CVT(n) ((double) (n))
+# endif /* !LDAV_CVT */
+
+# endif /* LOAD_AVE_TYPE */
+
+# if defined HAVE_LIBPERFSTAT
+# include <sys/protosw.h>
+# include <libperfstat.h>
+# include <sys/proc.h>
+# ifndef SBITS
+# define SBITS 16
+# endif
+# endif
+
+# if defined (__GNU__) && !defined (NeXT)
+/* Note that NeXT Openstep defines __GNU__ even though it should not. */
+/* GNU system acts much like NeXT, for load average purposes,
+ but not exactly. */
+# define NeXT
+# define host_self mach_host_self
+# endif
+
+# ifdef NeXT
+# ifdef HAVE_MACH_MACH_H
+# include <mach/mach.h>
+# else
+# include <mach.h>
+# endif
+# endif /* NeXT */
+
+# ifdef sgi
+# include <sys/sysmp.h>
+# endif /* sgi */
+
+# ifdef UMAX
+# include <signal.h>
+# include <sys/time.h>
+# include <sys/wait.h>
+# include <sys/syscall.h>
+
+# ifdef UMAX_43
+# include <machine/cpu.h>
+# include <inq_stats/statistics.h>
+# include <inq_stats/sysstats.h>
+# include <inq_stats/cpustats.h>
+# include <inq_stats/procstats.h>
+# else /* Not UMAX_43. */
+# include <sys/sysdefs.h>
+# include <sys/statistics.h>
+# include <sys/sysstats.h>
+# include <sys/cpudefs.h>
+# include <sys/cpustats.h>
+# include <sys/procstats.h>
+# endif /* Not UMAX_43. */
+# endif /* UMAX */
+
+# ifdef DGUX
+# include <sys/dg_sys_info.h>
+# endif
+
+# include "fcntl--.h"
+
+/* Avoid static vars inside a function since in HPUX they dump as pure. */
+
+# ifdef NeXT
+static processor_set_t default_set;
+static bool getloadavg_initialized;
+# endif /* NeXT */
+
+# ifdef UMAX
+static unsigned int cpus = 0;
+static unsigned int samples;
+# endif /* UMAX */
+
+# ifdef DGUX
+static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */
+# endif /* DGUX */
+
+# if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE)
+/* File descriptor open to /dev/kmem or VMS load ave driver. */
+static int channel;
+/* True iff channel is valid. */
+static bool getloadavg_initialized;
+/* Offset in kmem to seek to read load average, or 0 means invalid. */
+static long offset;
+
+# if ! defined __VMS && ! defined sgi && ! defined __linux__
+static struct nlist nl[2];
+# endif
+
+# ifdef SUNOS_5
+static kvm_t *kd;
+# endif /* SUNOS_5 */
+
+# endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */
+
+/* Put the 1 minute, 5 minute and 15 minute load averages
+ into the first NELEM elements of LOADAVG.
+ Return the number written (never more than 3, but may be less than NELEM),
+ or -1 if an error occurred. */
+
+int
+getloadavg (double loadavg[], int nelem)
+{
+ int elem = 0; /* Return value. */
+
+# ifdef NO_GET_LOAD_AVG
+# define LDAV_DONE
+ /* Set errno to zero to indicate that there was no particular error;
+ this function just can't work at all on this system. */
+ errno = 0;
+ elem = -1;
+# endif
+
+# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT)
+/* Use libkstat because we don't have to be root. */
+# define LDAV_DONE
+ kstat_ctl_t *kc;
+ kstat_t *ksp;
+ kstat_named_t *kn;
+
+ kc = kstat_open ();
+ if (kc == 0)
+ return -1;
+ ksp = kstat_lookup (kc, "unix", 0, "system_misc");
+ if (ksp == 0)
+ return -1;
+ if (kstat_read (kc, ksp, 0) == -1)
+ return -1;
+
+
+ kn = kstat_data_lookup (ksp, "avenrun_1min");
+ if (kn == 0)
+ {
+ /* Return -1 if no load average information is available. */
+ nelem = 0;
+ elem = -1;
+ }
+
+ if (nelem >= 1)
+ loadavg[elem++] = (double) kn->value.ul / FSCALE;
+
+ if (nelem >= 2)
+ {
+ kn = kstat_data_lookup (ksp, "avenrun_5min");
+ if (kn != 0)
+ {
+ loadavg[elem++] = (double) kn->value.ul / FSCALE;
+
+ if (nelem >= 3)
+ {
+ kn = kstat_data_lookup (ksp, "avenrun_15min");
+ if (kn != 0)
+ loadavg[elem++] = (double) kn->value.ul / FSCALE;
+ }
+ }
+ }
+
+ kstat_close (kc);
+# endif /* HAVE_LIBKSTAT */
+
+# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
+/* Use pstat_getdynamic() because we don't have to be root. */
+# define LDAV_DONE
+# undef LOAD_AVE_TYPE
+
+ struct pst_dynamic dyn_info;
+ if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0)
+ return -1;
+ if (nelem > 0)
+ loadavg[elem++] = dyn_info.psd_avg_1_min;
+ if (nelem > 1)
+ loadavg[elem++] = dyn_info.psd_avg_5_min;
+ if (nelem > 2)
+ loadavg[elem++] = dyn_info.psd_avg_15_min;
+
+# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */
+
+# if ! defined LDAV_DONE && defined HAVE_LIBPERFSTAT
+# define LDAV_DONE
+# undef LOAD_AVE_TYPE
+/* Use perfstat_cpu_total because we don't have to be root. */
+ {
+ perfstat_cpu_total_t cpu_stats;
+ int result = perfstat_cpu_total (NULL, &cpu_stats, sizeof cpu_stats, 1);
+ if (result == -1)
+ return result;
+ loadavg[0] = cpu_stats.loadavg[0] / (double)(1 << SBITS);
+ loadavg[1] = cpu_stats.loadavg[1] / (double)(1 << SBITS);
+ loadavg[2] = cpu_stats.loadavg[2] / (double)(1 << SBITS);
+ elem = 3;
+ }
+# endif
+
+# if !defined (LDAV_DONE) && (defined (__linux__) || defined (__CYGWIN__))
+# define LDAV_DONE
+# undef LOAD_AVE_TYPE
+
+# ifndef LINUX_LDAV_FILE
+# define LINUX_LDAV_FILE "/proc/loadavg"
+# endif
+
+ char ldavgbuf[3 * (INT_STRLEN_BOUND (int) + sizeof ".00 ")];
+ char const *ptr = ldavgbuf;
+ int fd, count;
+
+ fd = open (LINUX_LDAV_FILE, O_RDONLY);
+ if (fd == -1)
+ return -1;
+ count = read (fd, ldavgbuf, sizeof ldavgbuf - 1);
+ (void) close (fd);
+ if (count <= 0)
+ return -1;
+ ldavgbuf[count] = '\0';
+
+ for (elem = 0; elem < nelem; elem++)
+ {
+ char *endptr;
+ double d;
+
+ errno = 0;
+ d = c_strtod (ptr, &endptr);
+ if (ptr == endptr || (d == 0 && errno != 0))
+ {
+ if (elem == 0)
+ return -1;
+ break;
+ }
+ loadavg[elem] = d;
+ ptr = endptr;
+ }
+
+ return elem;
+
+# endif /* __linux__ || __CYGWIN__ */
+
+# if !defined (LDAV_DONE) && defined (__NetBSD__)
+# define LDAV_DONE
+# undef LOAD_AVE_TYPE
+
+# ifndef NETBSD_LDAV_FILE
+# define NETBSD_LDAV_FILE "/kern/loadavg"
+# endif
+
+ unsigned long int load_ave[3], scale;
+ int count;
+ FILE *fp;
+
+ fp = fopen (NETBSD_LDAV_FILE, "r");
+ if (fp == NULL)
+ return -1;
+ count = fscanf (fp, "%lu %lu %lu %lu\n",
+ &load_ave[0], &load_ave[1], &load_ave[2],
+ &scale);
+ (void) fclose (fp);
+ if (count != 4)
+ return -1;
+
+ for (elem = 0; elem < nelem; elem++)
+ loadavg[elem] = (double) load_ave[elem] / (double) scale;
+
+ return elem;
+
+# endif /* __NetBSD__ */
+
+# if !defined (LDAV_DONE) && defined (NeXT)
+# define LDAV_DONE
+ /* The NeXT code was adapted from iscreen 3.2. */
+
+ host_t host;
+ struct processor_set_basic_info info;
+ unsigned int info_count;
+
+ /* We only know how to get the 1-minute average for this system,
+ so even if the caller asks for more than 1, we only return 1. */
+
+ if (!getloadavg_initialized)
+ {
+ if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS)
+ getloadavg_initialized = true;
+ }
+
+ if (getloadavg_initialized)
+ {
+ info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
+ if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host,
+ (processor_set_info_t) &info, &info_count)
+ != KERN_SUCCESS)
+ getloadavg_initialized = false;
+ else
+ {
+ if (nelem > 0)
+ loadavg[elem++] = (double) info.load_average / LOAD_SCALE;
+ }
+ }
+
+ if (!getloadavg_initialized)
+ return -1;
+# endif /* NeXT */
+
+# if !defined (LDAV_DONE) && defined (UMAX)
+# define LDAV_DONE
+/* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not
+ have a /dev/kmem. Information about the workings of the running kernel
+ can be gathered with inq_stats system calls.
+ We only know how to get the 1-minute average for this system. */
+
+ struct proc_summary proc_sum_data;
+ struct stat_descr proc_info;
+ double load;
+ register unsigned int i, j;
+
+ if (cpus == 0)
+ {
+ register unsigned int c, i;
+ struct cpu_config conf;
+ struct stat_descr desc;
+
+ desc.sd_next = 0;
+ desc.sd_subsys = SUBSYS_CPU;
+ desc.sd_type = CPUTYPE_CONFIG;
+ desc.sd_addr = (char *) &conf;
+ desc.sd_size = sizeof conf;
+
+ if (inq_stats (1, &desc))
+ return -1;
+
+ c = 0;
+ for (i = 0; i < conf.config_maxclass; ++i)
+ {
+ struct class_stats stats;
+ bzero ((char *) &stats, sizeof stats);
+
+ desc.sd_type = CPUTYPE_CLASS;
+ desc.sd_objid = i;
+ desc.sd_addr = (char *) &stats;
+ desc.sd_size = sizeof stats;
+
+ if (inq_stats (1, &desc))
+ return -1;
+
+ c += stats.class_numcpus;
+ }
+ cpus = c;
+ samples = cpus < 2 ? 3 : (2 * cpus / 3);
+ }
+
+ proc_info.sd_next = 0;
+ proc_info.sd_subsys = SUBSYS_PROC;
+ proc_info.sd_type = PROCTYPE_SUMMARY;
+ proc_info.sd_addr = (char *) &proc_sum_data;
+ proc_info.sd_size = sizeof (struct proc_summary);
+ proc_info.sd_sizeused = 0;
+
+ if (inq_stats (1, &proc_info) != 0)
+ return -1;
+
+ load = proc_sum_data.ps_nrunnable;
+ j = 0;
+ for (i = samples - 1; i > 0; --i)
+ {
+ load += proc_sum_data.ps_nrun[j];
+ if (j++ == PS_NRUNSIZE)
+ j = 0;
+ }
+
+ if (nelem > 0)
+ loadavg[elem++] = load / samples / cpus;
+# endif /* UMAX */
+
+# if !defined (LDAV_DONE) && defined (DGUX)
+# define LDAV_DONE
+ /* This call can return -1 for an error, but with good args
+ it's not supposed to fail. The first argument is for no
+ apparent reason of type `long int *'. */
+ dg_sys_info ((long int *) &load_info,
+ DG_SYS_INFO_LOAD_INFO_TYPE,
+ DG_SYS_INFO_LOAD_VERSION_0);
+
+ if (nelem > 0)
+ loadavg[elem++] = load_info.one_minute;
+ if (nelem > 1)
+ loadavg[elem++] = load_info.five_minute;
+ if (nelem > 2)
+ loadavg[elem++] = load_info.fifteen_minute;
+# endif /* DGUX */
+
+# if !defined (LDAV_DONE) && defined (apollo)
+# define LDAV_DONE
+/* Apollo code from lisch@mentorg.com (Ray Lischner).
+
+ This system call is not documented. The load average is obtained as
+ three long integers, for the load average over the past minute,
+ five minutes, and fifteen minutes. Each value is a scaled integer,
+ with 16 bits of integer part and 16 bits of fraction part.
+
+ I'm not sure which operating system first supported this system call,
+ but I know that SR10.2 supports it. */
+
+ extern void proc1_$get_loadav ();
+ unsigned long load_ave[3];
+
+ proc1_$get_loadav (load_ave);
+
+ if (nelem > 0)
+ loadavg[elem++] = load_ave[0] / 65536.0;
+ if (nelem > 1)
+ loadavg[elem++] = load_ave[1] / 65536.0;
+ if (nelem > 2)
+ loadavg[elem++] = load_ave[2] / 65536.0;
+# endif /* apollo */
+
+# if !defined (LDAV_DONE) && defined (OSF_MIPS)
+# define LDAV_DONE
+
+ struct tbl_loadavg load_ave;
+ table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
+ loadavg[elem++]
+ = (load_ave.tl_lscale == 0
+ ? load_ave.tl_avenrun.d[0]
+ : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale));
+# endif /* OSF_MIPS */
+
+# if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32))
+# define LDAV_DONE
+
+ /* A faithful emulation is going to have to be saved for a rainy day. */
+ for ( ; elem < nelem; elem++)
+ {
+ loadavg[elem] = 0.0;
+ }
+# endif /* __MSDOS__ || WINDOWS32 */
+
+# if !defined (LDAV_DONE) && defined (OSF_ALPHA)
+# define LDAV_DONE
+
+ struct tbl_loadavg load_ave;
+ table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
+ for (elem = 0; elem < nelem; elem++)
+ loadavg[elem]
+ = (load_ave.tl_lscale == 0
+ ? load_ave.tl_avenrun.d[elem]
+ : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale));
+# endif /* OSF_ALPHA */
+
+# if ! defined LDAV_DONE && defined __VMS
+ /* VMS specific code -- read from the Load Ave driver. */
+
+ LOAD_AVE_TYPE load_ave[3];
+ static bool getloadavg_initialized;
+# ifdef eunice
+ struct
+ {
+ int dsc$w_length;
+ char *dsc$a_pointer;
+ } descriptor;
+# endif
+
+ /* Ensure that there is a channel open to the load ave device. */
+ if (!getloadavg_initialized)
+ {
+ /* Attempt to open the channel. */
+# ifdef eunice
+ descriptor.dsc$w_length = 18;
+ descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE";
+# else
+ $DESCRIPTOR (descriptor, "LAV0:");
+# endif
+ if (sys$assign (&descriptor, &channel, 0, 0) & 1)
+ getloadavg_initialized = true;
+ }
+
+ /* Read the load average vector. */
+ if (getloadavg_initialized
+ && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0,
+ load_ave, 12, 0, 0, 0, 0) & 1))
+ {
+ sys$dassgn (channel);
+ getloadavg_initialized = false;
+ }
+
+ if (!getloadavg_initialized)
+ return -1;
+# endif /* ! defined LDAV_DONE && defined __VMS */
+
+# if ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS
+
+ /* UNIX-specific code -- read the average from /dev/kmem. */
+
+# define LDAV_PRIVILEGED /* This code requires special installation. */
+
+ LOAD_AVE_TYPE load_ave[3];
+
+ /* Get the address of LDAV_SYMBOL. */
+ if (offset == 0)
+ {
+# ifndef sgi
+# if ! defined NLIST_STRUCT || ! defined N_NAME_POINTER
+ strcpy (nl[0].n_name, LDAV_SYMBOL);
+ strcpy (nl[1].n_name, "");
+# else /* NLIST_STRUCT */
+# ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
+ nl[0].n_un.n_name = LDAV_SYMBOL;
+ nl[1].n_un.n_name = 0;
+# else /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
+ nl[0].n_name = LDAV_SYMBOL;
+ nl[1].n_name = 0;
+# endif /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
+# endif /* NLIST_STRUCT */
+
+# ifndef SUNOS_5
+ if (
+# if !(defined (_AIX) && !defined (ps2))
+ nlist (KERNEL_FILE, nl)
+# else /* _AIX */
+ knlist (nl, 1, sizeof (nl[0]))
+# endif
+ >= 0)
+ /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */
+ {
+# ifdef FIXUP_KERNEL_SYMBOL_ADDR
+ FIXUP_KERNEL_SYMBOL_ADDR (nl);
+# endif
+ offset = nl[0].n_value;
+ }
+# endif /* !SUNOS_5 */
+# else /* sgi */
+ int ldav_off;
+
+ ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
+ if (ldav_off != -1)
+ offset = (long int) ldav_off & 0x7fffffff;
+# endif /* sgi */
+ }
+
+ /* Make sure we have /dev/kmem open. */
+ if (!getloadavg_initialized)
+ {
+# ifndef SUNOS_5
+ channel = open ("/dev/kmem", O_RDONLY);
+ if (channel >= 0)
+ {
+ /* Set the channel to close on exec, so it does not
+ litter any child's descriptor table. */
+ set_cloexec_flag (channel, true);
+ getloadavg_initialized = true;
+ }
+# else /* SUNOS_5 */
+ /* We pass 0 for the kernel, corefile, and swapfile names
+ to use the currently running kernel. */
+ kd = kvm_open (0, 0, 0, O_RDONLY, 0);
+ if (kd != 0)
+ {
+ /* nlist the currently running kernel. */
+ kvm_nlist (kd, nl);
+ offset = nl[0].n_value;
+ getloadavg_initialized = true;
+ }
+# endif /* SUNOS_5 */
+ }
+
+ /* If we can, get the load average values. */
+ if (offset && getloadavg_initialized)
+ {
+ /* Try to read the load. */
+# ifndef SUNOS_5
+ if (lseek (channel, offset, 0) == -1L
+ || read (channel, (char *) load_ave, sizeof (load_ave))
+ != sizeof (load_ave))
+ {
+ close (channel);
+ getloadavg_initialized = false;
+ }
+# else /* SUNOS_5 */
+ if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave))
+ != sizeof (load_ave))
+ {
+ kvm_close (kd);
+ getloadavg_initialized = false;
+ }
+# endif /* SUNOS_5 */
+ }
+
+ if (offset == 0 || !getloadavg_initialized)
+ return -1;
+# endif /* ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS */
+
+# if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS. */
+ if (nelem > 0)
+ loadavg[elem++] = LDAV_CVT (load_ave[0]);
+ if (nelem > 1)
+ loadavg[elem++] = LDAV_CVT (load_ave[1]);
+ if (nelem > 2)
+ loadavg[elem++] = LDAV_CVT (load_ave[2]);
+
+# define LDAV_DONE
+# endif /* !LDAV_DONE && LOAD_AVE_TYPE */
+
+# if !defined LDAV_DONE
+ /* Set errno to zero to indicate that there was no particular error;
+ this function just can't work at all on this system. */
+ errno = 0;
+ elem = -1;
+# endif
+ return elem;
+}
+
+#endif /* ! HAVE_GETLOADAVG */
+
+#ifdef TEST
+int
+main (int argc, char **argv)
+{
+ int naptime = 0;
+
+ if (argc > 1)
+ naptime = atoi (argv[1]);
+
+ while (1)
+ {
+ double avg[3];
+ int loads;
+
+ errno = 0; /* Don't be misled if it doesn't set errno. */
+ loads = getloadavg (avg, 3);
+ if (loads == -1)
+ {
+ perror ("Error getting load average");
+ return EXIT_FAILURE;
+ }
+ if (loads > 0)
+ printf ("1-minute: %f ", avg[0]);
+ if (loads > 1)
+ printf ("5-minute: %f ", avg[1]);
+ if (loads > 2)
+ printf ("15-minute: %f ", avg[2]);
+ if (loads > 0)
+ putchar ('\n');
+
+ if (naptime == 0)
+ break;
+ sleep (naptime);
+ }
+
+ return EXIT_SUCCESS;
+}
+#endif /* TEST */
diff --git a/gnulib/lib/getlogin.c b/gnulib/lib/getlogin.c
new file mode 100644
index 00000000..6c79de64
--- /dev/null
+++ b/gnulib/lib/getlogin.c
@@ -0,0 +1,41 @@
+/* Provide a working getlogin for systems which lack it.
+
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible, 2010. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+char *
+getlogin (void)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ static char login_name[1024];
+ DWORD sz = sizeof (login_name);
+
+ if (GetUserName (login_name, &sz))
+ return login_name;
+#endif
+ return NULL;
+}
diff --git a/gnulib/lib/getlogin_r.c b/gnulib/lib/getlogin_r.c
new file mode 100644
index 00000000..c1e74358
--- /dev/null
+++ b/gnulib/lib/getlogin_r.c
@@ -0,0 +1,79 @@
+/* Provide a working getlogin_r for systems which lack it.
+
+ Copyright (C) 2005-2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert, Derek Price, and Bruno Haible. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#else
+# if !HAVE_DECL_GETLOGIN
+extern char *getlogin (void);
+# endif
+#endif
+
+/* See unistd.in.h for documentation. */
+int
+getlogin_r (char *name, size_t size)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Native Windows platform. */
+ DWORD sz;
+
+ /* When size > 0x7fff, the doc says that GetUserName will fail.
+ Actually, on Windows XP SP3, it succeeds. But let's be safe,
+ for the sake of older Windows versions. */
+ if (size > 0x7fff)
+ size = 0x7fff;
+ sz = size;
+ if (!GetUserName (name, &sz))
+ {
+ if (GetLastError () == ERROR_INSUFFICIENT_BUFFER)
+ /* In this case, the doc says that sz contains the required size, but
+ actually, on Windows XP SP3, it contains 2 * the required size. */
+ return ERANGE;
+ else
+ return ENOENT;
+ }
+ return 0;
+#else
+ /* Platform with a getlogin() function. */
+ char *n;
+ size_t nlen;
+
+ errno = 0;
+ n = getlogin ();
+ if (!n)
+ /* ENOENT is a reasonable errno value if getlogin returns NULL. */
+ return (errno != 0 ? errno : ENOENT);
+
+ nlen = strlen (n);
+ if (size <= nlen)
+ return ERANGE;
+ memcpy (name, n, nlen + 1);
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/getndelim2.c b/gnulib/lib/getndelim2.c
new file mode 100644
index 00000000..161ee816
--- /dev/null
+++ b/gnulib/lib/getndelim2.c
@@ -0,0 +1,217 @@
+/* getndelim2 - Read a line from a stream, stopping at one of 2 delimiters,
+ with bounded memory allocation.
+
+ Copyright (C) 1993, 1996, 1997, 1998, 2000, 2003, 2004, 2006, 2008, 2009,
+ 2010 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/>. */
+
+/* Originally written by Jan Brittenson, bson@gnu.ai.mit.edu. */
+
+#include <config.h>
+
+#include "getndelim2.h"
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+#if !HAVE_FLOCKFILE
+# undef flockfile
+# define flockfile(x) ((void) 0)
+#endif
+#if !HAVE_FUNLOCKFILE
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+#endif
+
+#include <limits.h>
+#include <stdint.h>
+
+#include "freadptr.h"
+#include "freadseek.h"
+#include "memchr2.h"
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+/* Use this to suppress gcc's `...may be used before initialized' warnings. */
+#ifdef lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+/* The maximum value that getndelim2 can return without suffering from
+ overflow problems, either internally (because of pointer
+ subtraction overflow) or due to the API (because of ssize_t). */
+#define GETNDELIM2_MAXIMUM (PTRDIFF_MAX < SSIZE_MAX ? PTRDIFF_MAX : SSIZE_MAX)
+
+/* Try to add at least this many bytes when extending the buffer.
+ MIN_CHUNK must be no greater than GETNDELIM2_MAXIMUM. */
+#define MIN_CHUNK 64
+
+ssize_t
+getndelim2 (char **lineptr, size_t *linesize, size_t offset, size_t nmax,
+ int delim1, int delim2, FILE *stream)
+{
+ size_t nbytes_avail; /* Allocated but unused bytes in *LINEPTR. */
+ char *read_pos; /* Where we're reading into *LINEPTR. */
+ ssize_t bytes_stored = -1;
+ char *ptr = *lineptr;
+ size_t size = *linesize;
+ bool found_delimiter;
+
+ if (!ptr)
+ {
+ size = nmax < MIN_CHUNK ? nmax : MIN_CHUNK;
+ ptr = malloc (size);
+ if (!ptr)
+ return -1;
+ }
+
+ if (size < offset)
+ goto done;
+
+ nbytes_avail = size - offset;
+ read_pos = ptr + offset;
+
+ if (nbytes_avail == 0 && nmax <= size)
+ goto done;
+
+ /* Normalize delimiters, since memchr2 doesn't handle EOF. */
+ if (delim1 == EOF)
+ delim1 = delim2;
+ else if (delim2 == EOF)
+ delim2 = delim1;
+
+ flockfile (stream);
+
+ found_delimiter = false;
+ do
+ {
+ /* Here always ptr + size == read_pos + nbytes_avail.
+ Also nbytes_avail > 0 || size < nmax. */
+
+ int c IF_LINT (= 0);
+ const char *buffer;
+ size_t buffer_len;
+
+ buffer = freadptr (stream, &buffer_len);
+ if (buffer)
+ {
+ if (delim1 != EOF)
+ {
+ const char *end = memchr2 (buffer, delim1, delim2, buffer_len);
+ if (end)
+ {
+ buffer_len = end - buffer + 1;
+ found_delimiter = true;
+ }
+ }
+ }
+ else
+ {
+ c = getc (stream);
+ if (c == EOF)
+ {
+ /* Return partial line, if any. */
+ if (read_pos == ptr)
+ goto unlock_done;
+ else
+ break;
+ }
+ if (c == delim1 || c == delim2)
+ found_delimiter = true;
+ buffer_len = 1;
+ }
+
+ /* We always want at least one byte left in the buffer, since we
+ always (unless we get an error while reading the first byte)
+ NUL-terminate the line buffer. */
+
+ if (nbytes_avail < buffer_len + 1 && size < nmax)
+ {
+ /* Grow size proportionally, not linearly, to avoid O(n^2)
+ running time. */
+ size_t newsize = size < MIN_CHUNK ? size + MIN_CHUNK : 2 * size;
+ char *newptr;
+
+ /* Increase newsize so that it becomes
+ >= (read_pos - ptr) + buffer_len. */
+ if (newsize - (read_pos - ptr) < buffer_len + 1)
+ newsize = (read_pos - ptr) + buffer_len + 1;
+ /* Respect nmax. This handles possible integer overflow. */
+ if (! (size < newsize && newsize <= nmax))
+ newsize = nmax;
+
+ if (GETNDELIM2_MAXIMUM < newsize - offset)
+ {
+ size_t newsizemax = offset + GETNDELIM2_MAXIMUM + 1;
+ if (size == newsizemax)
+ goto unlock_done;
+ newsize = newsizemax;
+ }
+
+ nbytes_avail = newsize - (read_pos - ptr);
+ newptr = realloc (ptr, newsize);
+ if (!newptr)
+ goto unlock_done;
+ ptr = newptr;
+ size = newsize;
+ read_pos = size - nbytes_avail + ptr;
+ }
+
+ /* Here, if size < nmax, nbytes_avail >= buffer_len + 1.
+ If size == nmax, nbytes_avail > 0. */
+
+ if (1 < nbytes_avail)
+ {
+ size_t copy_len = nbytes_avail - 1;
+ if (buffer_len < copy_len)
+ copy_len = buffer_len;
+ if (buffer)
+ memcpy (read_pos, buffer, copy_len);
+ else
+ *read_pos = c;
+ read_pos += copy_len;
+ nbytes_avail -= copy_len;
+ }
+
+ /* Here still nbytes_avail > 0. */
+
+ if (buffer && freadseek (stream, buffer_len))
+ goto unlock_done;
+ }
+ while (!found_delimiter);
+
+ /* Done - NUL terminate and return the number of bytes read.
+ At this point we know that nbytes_avail >= 1. */
+ *read_pos = '\0';
+
+ bytes_stored = read_pos - (ptr + offset);
+
+ unlock_done:
+ funlockfile (stream);
+
+ done:
+ *lineptr = ptr;
+ *linesize = size;
+ return bytes_stored ? bytes_stored : -1;
+}
diff --git a/gnulib/lib/getndelim2.h b/gnulib/lib/getndelim2.h
new file mode 100644
index 00000000..6d7819a0
--- /dev/null
+++ b/gnulib/lib/getndelim2.h
@@ -0,0 +1,42 @@
+/* getndelim2 - Read a line from a stream, stopping at one of 2 delimiters,
+ with bounded memory allocation.
+
+ Copyright (C) 2003, 2004, 2006, 2009, 2010 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/>. */
+
+#ifndef GETNDELIM2_H
+#define GETNDELIM2_H 1
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#define GETNLINE_NO_LIMIT ((size_t) -1)
+
+/* Read into a buffer *LINEPTR returned from malloc (or NULL),
+ pointing to *LINESIZE bytes of space. Store the input bytes
+ starting at *LINEPTR + OFFSET, and null-terminate them. Reallocate
+ the buffer as necessary, but if NMAX is not GETNLINE_NO_LIMIT
+ then do not allocate more than NMAX bytes; if the line is longer
+ than that, read and discard the extra bytes. Stop reading after
+ the first occurrence of DELIM1 or DELIM2, whichever comes first;
+ a delimiter equal to EOF stands for no delimiter. Read the
+ input bytes from STREAM.
+ Return the number of bytes read and stored at *LINEPTR + OFFSET (not
+ including the NUL terminator), or -1 on error or EOF. */
+extern ssize_t getndelim2 (char **lineptr, size_t *linesize, size_t offset,
+ size_t nmax, int delim1, int delim2,
+ FILE *stream);
+
+#endif /* GETNDELIM2_H */
diff --git a/gnulib/lib/getnline.c b/gnulib/lib/getnline.c
new file mode 100644
index 00000000..6e0cca1f
--- /dev/null
+++ b/gnulib/lib/getnline.c
@@ -0,0 +1,36 @@
+/* getnline - Read a line from a stream, with bounded memory allocation.
+
+ Copyright (C) 2003, 2004, 2006, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "getnline.h"
+
+#include "getndelim2.h"
+
+ssize_t
+getndelim (char **lineptr, size_t *linesize, size_t nmax,
+ int delimiter, FILE *stream)
+{
+ return getndelim2 (lineptr, linesize, 0, nmax, delimiter, EOF, stream);
+}
+
+ssize_t
+getnline (char **lineptr, size_t *linesize, size_t nmax, FILE *stream)
+{
+ return getndelim (lineptr, linesize, nmax, '\n', stream);
+}
diff --git a/gnulib/lib/getnline.h b/gnulib/lib/getnline.h
new file mode 100644
index 00000000..ffe91669
--- /dev/null
+++ b/gnulib/lib/getnline.h
@@ -0,0 +1,47 @@
+/* getnline - Read a line from a stream, with bounded memory allocation.
+
+ Copyright (C) 2003, 2004, 2009, 2010 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/>. */
+
+#ifndef GETNLINE_H
+#define GETNLINE_H 1
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#define GETNLINE_NO_LIMIT ((size_t) -1)
+
+/* Read a line, up to the next newline, from STREAM, and store it in *LINEPTR.
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary. Reallocation is limited to
+ NMAX bytes; if the line is longer than that, the extra bytes are read but
+ thrown away.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+extern ssize_t getnline (char **lineptr, size_t *linesize, size_t nmax,
+ FILE *stream);
+
+/* Read a line, up to the next occurrence of DELIMITER, from STREAM, and store
+ it in *LINEPTR.
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary. Reallocation is limited to
+ NMAX bytes; if the line is longer than that, the extra bytes are read but
+ thrown away.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+extern ssize_t getndelim (char **lineptr, size_t *linesize, size_t nmax,
+ int delimiter, FILE *stream);
+
+#endif /* GETNLINE_H */
diff --git a/gnulib/lib/getopt.c b/gnulib/lib/getopt.c
new file mode 100644
index 00000000..406d5b71
--- /dev/null
+++ b/gnulib/lib/getopt.c
@@ -0,0 +1,1189 @@
+/* Getopt for GNU.
+ NOTE: getopt is part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to drepper@gnu.org
+ before changing it!
+ Copyright (C) 1987-1996, 1998-2004, 2006, 2008-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include "getopt.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt_long' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Using `getopt' or setting the environment variable POSIXLY_CORRECT
+ disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include "getopt_int.h"
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* 1003.2 says this must be 1 before any call. */
+int optind = 1;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
+
+/* Keep a global copy of all internal members of getopt_data. */
+
+static struct _getopt_data getopt_data;
+
+
+#if defined HAVE_DECL_GETENV && !HAVE_DECL_GETENV
+extern char *getenv ();
+#endif
+
+#ifdef _LIBC
+/* Stored original parameters.
+ XXX This is no good solution. We should rather copy the args so
+ that we can compare them later. But we must not use malloc(3). */
+extern int __libc_argc;
+extern char **__libc_argv;
+
+/* Bash 2.0 gives us an environment variable containing flags
+ indicating ARGV elements that should not be considered arguments. */
+
+# ifdef USE_NONOPTION_FLAGS
+/* Defined in getopt_init.c */
+extern char *__getopt_nonoption_flags;
+# endif
+
+# ifdef USE_NONOPTION_FLAGS
+# define SWAP_FLAGS(ch1, ch2) \
+ if (d->__nonoption_flags_len > 0) \
+ { \
+ char __tmp = __getopt_nonoption_flags[ch1]; \
+ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
+ __getopt_nonoption_flags[ch2] = __tmp; \
+ }
+# else
+# define SWAP_FLAGS(ch1, ch2)
+# endif
+#else /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+static void
+exchange (char **argv, struct _getopt_data *d)
+{
+ int bottom = d->__first_nonopt;
+ int middle = d->__last_nonopt;
+ int top = d->optind;
+ char *tem;
+
+ /* Exchange the shorter segment with the far end of the longer segment.
+ That puts the shorter segment into the right place.
+ It leaves the longer segment in the right place overall,
+ but it consists of two parts that need to be swapped next. */
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ /* First make sure the handling of the `__getopt_nonoption_flags'
+ string can work normally. Our top argument must be in the range
+ of the string. */
+ if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
+ {
+ /* We must extend the array. The user plays games with us and
+ presents new arguments. */
+ char *new_str = malloc (top + 1);
+ if (new_str == NULL)
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
+ else
+ {
+ memset (__mempcpy (new_str, __getopt_nonoption_flags,
+ d->__nonoption_flags_max_len),
+ '\0', top + 1 - d->__nonoption_flags_max_len);
+ d->__nonoption_flags_max_len = top + 1;
+ __getopt_nonoption_flags = new_str;
+ }
+ }
+#endif
+
+ while (top > middle && middle > bottom)
+ {
+ if (top - middle > middle - bottom)
+ {
+ /* Bottom segment is the short one. */
+ int len = middle - bottom;
+ register int i;
+
+ /* Swap it with the top part of the top segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[top - (middle - bottom) + i];
+ argv[top - (middle - bottom) + i] = tem;
+ SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+ }
+ /* Exclude the moved bottom segment from further swapping. */
+ top -= len;
+ }
+ else
+ {
+ /* Top segment is the short one. */
+ int len = top - middle;
+ register int i;
+
+ /* Swap it with the bottom part of the bottom segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[middle + i];
+ argv[middle + i] = tem;
+ SWAP_FLAGS (bottom + i, middle + i);
+ }
+ /* Exclude the moved top segment from further swapping. */
+ bottom += len;
+ }
+ }
+
+ /* Update records for the slots the non-options now occupy. */
+
+ d->__first_nonopt += (d->optind - d->__last_nonopt);
+ d->__last_nonopt = d->optind;
+}
+
+/* Initialize the internal data when the first call is made. */
+
+static const char *
+_getopt_initialize (int argc _GL_UNUSED,
+ char **argv _GL_UNUSED, const char *optstring,
+ struct _getopt_data *d, int posixly_correct)
+{
+ /* Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ d->__first_nonopt = d->__last_nonopt = d->optind;
+
+ d->__nextchar = NULL;
+
+ d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT");
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ d->__ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ d->__ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (d->__posixly_correct)
+ d->__ordering = REQUIRE_ORDER;
+ else
+ d->__ordering = PERMUTE;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ if (!d->__posixly_correct
+ && argc == __libc_argc && argv == __libc_argv)
+ {
+ if (d->__nonoption_flags_max_len == 0)
+ {
+ if (__getopt_nonoption_flags == NULL
+ || __getopt_nonoption_flags[0] == '\0')
+ d->__nonoption_flags_max_len = -1;
+ else
+ {
+ const char *orig_str = __getopt_nonoption_flags;
+ int len = d->__nonoption_flags_max_len = strlen (orig_str);
+ if (d->__nonoption_flags_max_len < argc)
+ d->__nonoption_flags_max_len = argc;
+ __getopt_nonoption_flags =
+ (char *) malloc (d->__nonoption_flags_max_len);
+ if (__getopt_nonoption_flags == NULL)
+ d->__nonoption_flags_max_len = -1;
+ else
+ memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+ '\0', d->__nonoption_flags_max_len - len);
+ }
+ }
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len;
+ }
+ else
+ d->__nonoption_flags_len = 0;
+#endif
+
+ return optstring;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns -1.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `--' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ if the `flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal_r (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind,
+ int long_only, struct _getopt_data *d, int posixly_correct)
+{
+ int print_errors = d->opterr;
+ if (optstring[0] == ':')
+ print_errors = 0;
+
+ if (argc < 1)
+ return -1;
+
+ d->optarg = NULL;
+
+ if (d->optind == 0 || !d->__initialized)
+ {
+ if (d->optind == 0)
+ d->optind = 1; /* Don't scan ARGV[0], the program name. */
+ optstring = _getopt_initialize (argc, argv, optstring, d,
+ posixly_correct);
+ d->__initialized = 1;
+ }
+
+ /* Test whether ARGV[optind] points to a non-option argument.
+ Either it does not have option syntax, or there is an environment flag
+ from the shell indicating it is not an option. The later information
+ is only used when the used in the GNU libc. */
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
+ || (d->optind < d->__nonoption_flags_len \
+ && __getopt_nonoption_flags[d->optind] == '1'))
+#else
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
+#endif
+
+ if (d->__nextchar == NULL || *d->__nextchar == '\0')
+ {
+ /* Advance to the next ARGV-element. */
+
+ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+ moved back by the user (who may also have changed the arguments). */
+ if (d->__last_nonopt > d->optind)
+ d->__last_nonopt = d->optind;
+ if (d->__first_nonopt > d->optind)
+ d->__first_nonopt = d->optind;
+
+ if (d->__ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange ((char **) argv, d);
+ else if (d->__last_nonopt != d->optind)
+ d->__first_nonopt = d->optind;
+
+ /* Skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (d->optind < argc && NONOPTION_P)
+ d->optind++;
+ d->__last_nonopt = d->optind;
+ }
+
+ /* The special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (d->optind != argc && !strcmp (argv[d->optind], "--"))
+ {
+ d->optind++;
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange ((char **) argv, d);
+ else if (d->__first_nonopt == d->__last_nonopt)
+ d->__first_nonopt = d->optind;
+ d->__last_nonopt = argc;
+
+ d->optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (d->optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (d->__first_nonopt != d->__last_nonopt)
+ d->optind = d->__first_nonopt;
+ return -1;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if (NONOPTION_P)
+ {
+ if (d->__ordering == REQUIRE_ORDER)
+ return -1;
+ d->optarg = argv[d->optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Skip the initial punctuation. */
+
+ d->__nextchar = (argv[d->optind] + 1
+ + (longopts != NULL && argv[d->optind][1] == '-'));
+ }
+
+ /* Decode the current option-ARGV-element. */
+
+ /* Check whether the ARGV-element is a long option.
+
+ If long_only and the ARGV-element has the form "-f", where f is
+ a valid short option, don't consider it an abbreviated form of
+ a long option that starts with f. Otherwise there would be no
+ way to give the -f short option.
+
+ On the other hand, if there's a long option "fubar" and
+ the ARGV-element is "-fu", do consider that an abbreviation of
+ the long option, just like "--fu", and not "-f" with arg "u".
+
+ This distinction seems to be the most useful approach. */
+
+ if (longopts != NULL
+ && (argv[d->optind][1] == '-'
+ || (long_only && (argv[d->optind][2]
+ || !strchr (optstring, argv[d->optind][1])))))
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = -1;
+ int option_index;
+
+ for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar)
+ == (unsigned int) strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else if (long_only
+ || pfound->has_arg != p->has_arg
+ || pfound->flag != p->flag
+ || pfound->val != p->val)
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option '%s' is ambiguous\n"),
+ argv[0], argv[d->optind]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option '%s' is ambiguous\n"),
+ argv[0], argv[d->optind]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ d->optind++;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind - 1][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option '--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option '--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option '%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option '%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+
+ d->optopt = pfound->val;
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option '%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optopt = pfound->val;
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[d->optind][1] == '-'
+ || strchr (optstring, *d->__nextchar) == NULL)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option '--%s'\n"),
+ argv[0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option '--%s'\n"),
+ argv[0], d->__nextchar);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option '%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option '%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->__nextchar = (char *) "";
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next short option-character. */
+
+ {
+ char c = *d->__nextchar++;
+ char *temp = strchr (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*d->__nextchar == '\0')
+ ++d->optind;
+
+ if (temp == NULL || c == ':')
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: invalid option -- '%c'\n"),
+ argv[0], c);
+#else
+ fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->optopt = c;
+ return '?';
+ }
+ /* Convenience. Treat POSIX -W foo same as long option --foo */
+ if (temp[0] == 'W' && temp[1] == ';')
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = 0;
+ int option_index;
+
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf,
+ _("%s: option requires an argument -- '%c'\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option requires an argument -- '%c'\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ return c;
+ }
+ else
+ /* We already incremented `d->optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+
+ /* optarg is now the argument, see if it's in the
+ table of longopts. */
+
+ for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
+ nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"),
+ argv[0], argv[d->optind]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
+ argv[0], argv[d->optind]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ return '?';
+ }
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option '%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ d->__nextchar = NULL;
+ return 'W'; /* Let the application handle it. */
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ d->optind++;
+ }
+ else
+ d->optarg = NULL;
+ d->__nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option requires an argument -- '%c'\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option requires an argument -- '%c'\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+ d->__nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+_getopt_internal (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind, int long_only,
+ int posixly_correct)
+{
+ int result;
+
+ getopt_data.optind = optind;
+ getopt_data.opterr = opterr;
+
+ result = _getopt_internal_r (argc, argv, optstring, longopts,
+ longind, long_only, &getopt_data,
+ posixly_correct);
+
+ optind = getopt_data.optind;
+ optarg = getopt_data.optarg;
+ optopt = getopt_data.optopt;
+
+ return result;
+}
+
+/* glibc gets a LSB-compliant getopt.
+ Standalone applications get a POSIX-compliant getopt. */
+#if _LIBC
+enum { POSIXLY_CORRECT = 0 };
+#else
+enum { POSIXLY_CORRECT = 1 };
+#endif
+
+int
+getopt (int argc, char *const *argv, const char *optstring)
+{
+ return _getopt_internal (argc, (char **) argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0, POSIXLY_CORRECT);
+}
+
+#ifdef _LIBC
+int
+__posix_getopt (int argc, char *const *argv, const char *optstring)
+{
+ return _getopt_internal (argc, argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0, 1);
+}
+#endif
+
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of `getopt'. */
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value '%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/getopt.in.h b/gnulib/lib/getopt.in.h
new file mode 100644
index 00000000..57a8e899
--- /dev/null
+++ b/gnulib/lib/getopt.in.h
@@ -0,0 +1,249 @@
+/* Declarations for getopt.
+ Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _GL_GETOPT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. We must
+ also inform the replacement unistd.h to not recursively use
+ <getopt.h>; our definitions will be present soon enough. */
+#if @HAVE_GETOPT_H@
+# define _GL_SYSTEM_GETOPT
+# @INCLUDE_NEXT@ @NEXT_GETOPT_H@
+# undef _GL_SYSTEM_GETOPT
+#endif
+
+#ifndef _GL_GETOPT_H
+
+#ifndef __need_getopt
+# define _GL_GETOPT_H 1
+#endif
+
+/* Standalone applications should #define __GETOPT_PREFIX to an
+ identifier that prefixes the external functions and variables
+ defined in this header. When this happens, include the
+ headers that might declare getopt so that they will not cause
+ confusion if included after this file (if the system had <getopt.h>,
+ we have already included it). Then systematically rename
+ identifiers so that they do not collide with the system functions
+ and variables. Renaming avoids problems with some compilers and
+ linkers. */
+#if defined __GETOPT_PREFIX && !defined __need_getopt
+# if !@HAVE_GETOPT_H@
+# include <stdlib.h>
+# include <stdio.h>
+# include <unistd.h>
+# endif
+# undef __need_getopt
+# undef getopt
+# undef getopt_long
+# undef getopt_long_only
+# undef optarg
+# undef opterr
+# undef optind
+# undef optopt
+# undef option
+# define __GETOPT_CONCAT(x, y) x ## y
+# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
+# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
+# define getopt __GETOPT_ID (getopt)
+# define getopt_long __GETOPT_ID (getopt_long)
+# define getopt_long_only __GETOPT_ID (getopt_long_only)
+# define optarg __GETOPT_ID (optarg)
+# define opterr __GETOPT_ID (opterr)
+# define optind __GETOPT_ID (optind)
+# define optopt __GETOPT_ID (optopt)
+# define option __GETOPT_ID (option)
+# define _getopt_internal __GETOPT_ID (getopt_internal)
+#endif
+
+/* Standalone applications get correct prototypes for getopt_long and
+ getopt_long_only; they declare "char **argv". libc uses prototypes
+ with "char *const *argv" that are incorrect because getopt_long and
+ getopt_long_only can permute argv; this is required for backward
+ compatibility (e.g., for LSB 2.0.1).
+
+ This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt',
+ but it caused redefinition warnings if both unistd.h and getopt.h were
+ included, since unistd.h includes getopt.h having previously defined
+ __need_getopt.
+
+ The only place where __getopt_argv_const is used is in definitions
+ of getopt_long and getopt_long_only below, but these are visible
+ only if __need_getopt is not defined, so it is quite safe to rewrite
+ the conditional as follows:
+*/
+#if !defined __need_getopt
+# if defined __GETOPT_PREFIX
+# define __getopt_argv_const /* empty */
+# else
+# define __getopt_argv_const const
+# endif
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+ standalone, or this is the first header included in the source file.
+ If we are being used with glibc, we need to include <features.h>, but
+ that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
+ not defined, include <ctype.h>, which will pull in <features.h> for us
+ if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
+ doesn't flood the namespace with stuff the way some other headers do.) */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifndef __THROW
+# ifndef __GNUC_PREREQ
+# define __GNUC_PREREQ(maj, min) (0)
+# endif
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+ const char *name;
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+# define no_argument 0
+# define required_argument 1
+# define optional_argument 2
+#endif /* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+ arguments in ARGV (ARGC of them, minus the program name) for
+ options given in OPTS.
+
+ Return the option character from OPTS just read. Return -1 when
+ there are no more options. For unrecognized options, or options
+ missing arguments, `optopt' is set to the option letter, and '?' is
+ returned.
+
+ The OPTS string is a list of characters which are recognized option
+ letters, optionally followed by colons, specifying that that letter
+ takes an argument, to be placed in `optarg'.
+
+ If a letter in OPTS is followed by two colons, its argument is
+ optional. This behavior is specific to the GNU `getopt'.
+
+ The argument `--' causes premature termination of argument
+ scanning, explicitly telling `getopt' that there are no more
+ options.
+
+ If OPTS begins with `-', then non-option arguments are treated as
+ arguments to the option '\1'. This behavior is specific to the GNU
+ `getopt'. If OPTS begins with `+', or POSIXLY_CORRECT is set in
+ the environment, then do not permute arguments. */
+
+extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+
+#ifndef __need_getopt
+extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations. */
+#undef __need_getopt
+
+#endif /* getopt.h */
+#endif /* getopt.h */
diff --git a/gnulib/lib/getopt1.c b/gnulib/lib/getopt1.c
new file mode 100644
index 00000000..046d69f9
--- /dev/null
+++ b/gnulib/lib/getopt1.c
@@ -0,0 +1,170 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997,
+ 1998, 2004, 2006, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifdef _LIBC
+# include <getopt.h>
+#else
+# include <config.h>
+# include "getopt.h"
+#endif
+#include "getopt_int.h"
+
+#include <stdio.h>
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, (char **) argv, options, long_options,
+ opt_index, 0, 0);
+}
+
+int
+_getopt_long_r (int argc, char **argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 0, d, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+ If an option that starts with '-' (not '--') doesn't match a long option,
+ but does match a short option, it is parsed as a short option
+ instead. */
+
+int
+getopt_long_only (int argc, char *__getopt_argv_const *argv,
+ const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, (char **) argv, options, long_options,
+ opt_index, 1, 0);
+}
+
+int
+_getopt_long_only_r (int argc, char **argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 1, d, 0);
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+ int option_index = 0;
+ static const struct option long_options[] =
+ {
+ {"add", 1, 0, 0},
+ {"append", 0, 0, 0},
+ {"delete", 1, 0, 0},
+ {"verbose", 0, 0, 0},
+ {"create", 0, 0, 0},
+ {"file", 1, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "abc:d:0123456789",
+ long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ printf ("option %s", long_options[option_index].name);
+ if (optarg)
+ printf (" with arg %s", optarg);
+ printf ("\n");
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case 'd':
+ printf ("option d with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/getopt_int.h b/gnulib/lib/getopt_int.h
new file mode 100644
index 00000000..169def5b
--- /dev/null
+++ b/gnulib/lib/getopt_int.h
@@ -0,0 +1,132 @@
+/* Internal declarations for getopt.
+ Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2004, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _GETOPT_INT_H
+#define _GETOPT_INT_H 1
+
+#include <getopt.h>
+
+extern int _getopt_internal (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, int __posixly_correct);
+
+
+/* Reentrant versions which can handle parsing multiple argument
+ vectors at the same time. */
+
+/* Data type for reentrant functions. */
+struct _getopt_data
+{
+ /* These have exactly the same meaning as the corresponding global
+ variables, except that they are used for the reentrant
+ versions of getopt. */
+ int optind;
+ int opterr;
+ int optopt;
+ char *optarg;
+
+ /* Internal members. */
+
+ /* True if the internal members have been initialized. */
+ int __initialized;
+
+ /* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+ char *__nextchar;
+
+ /* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters, or by calling getopt.
+
+ PERMUTE is the default. We permute the contents of ARGV as we
+ scan, so that eventually all the non-options are at the end.
+ This allows options to be given in any order, even with programs
+ that were not written to expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were
+ written to expect options and other ARGV-elements in any order
+ and that care about the ordering of the two. We describe each
+ non-option ARGV-element as if it were the argument of an option
+ with character code 1. Using `-' as the first character of the
+ list of option characters selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return -1 with `optind' != ARGC. */
+
+ enum
+ {
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+ } __ordering;
+
+ /* If the POSIXLY_CORRECT environment variable is set
+ or getopt was called. */
+ int __posixly_correct;
+
+
+ /* Handle permutation of arguments. */
+
+ /* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first
+ of them; `last_nonopt' is the index after the last of them. */
+
+ int __first_nonopt;
+ int __last_nonopt;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ int __nonoption_flags_max_len;
+ int __nonoption_flags_len;
+# endif
+};
+
+/* The initializer is necessary to set OPTIND and OPTERR to their
+ default values and to clear the initialization flag. */
+#define _GETOPT_DATA_INITIALIZER { 1, 1 }
+
+extern int _getopt_internal_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, struct _getopt_data *__data,
+ int __posixly_correct);
+
+extern int _getopt_long_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ struct _getopt_data *__data);
+
+extern int _getopt_long_only_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts,
+ int *__longind,
+ struct _getopt_data *__data);
+
+#endif /* getopt_int.h */
diff --git a/gnulib/lib/getpagesize.c b/gnulib/lib/getpagesize.c
new file mode 100644
index 00000000..cc252687
--- /dev/null
+++ b/gnulib/lib/getpagesize.c
@@ -0,0 +1,39 @@
+/* getpagesize emulation for systems where it cannot be done in a C macro.
+
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+/* Written by Bruno Haible and Martin Lambers. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+/* This implementation is only for native Win32 systems. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+int
+getpagesize (void)
+{
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ return system_info.dwPageSize;
+}
+
+#endif
diff --git a/gnulib/lib/getpass.c b/gnulib/lib/getpass.c
new file mode 100644
index 00000000..1aac4b71
--- /dev/null
+++ b/gnulib/lib/getpass.c
@@ -0,0 +1,230 @@
+/* Copyright (C) 1992-2001, 2003-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include "getpass.h"
+
+#include <stdio.h>
+
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+
+#include <stdbool.h>
+
+#if HAVE_DECL___FSETLOCKING && HAVE___FSETLOCKING
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+#else
+# define __fsetlocking(stream, type) /* empty */
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#else
+# if !HAVE_DECL_FFLUSH_UNLOCKED
+# undef fflush_unlocked
+# define fflush_unlocked(x) fflush (x)
+# endif
+# if !HAVE_DECL_FLOCKFILE
+# undef flockfile
+# define flockfile(x) ((void) 0)
+# endif
+# if !HAVE_DECL_FUNLOCKFILE
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+# endif
+# if !HAVE_DECL_FPUTS_UNLOCKED
+# undef fputs_unlocked
+# define fputs_unlocked(str,stream) fputs (str, stream)
+# endif
+# if !HAVE_DECL_PUTC_UNLOCKED
+# undef putc_unlocked
+# define putc_unlocked(c,stream) putc (c, stream)
+# endif
+#endif
+
+/* It is desirable to use this bit on systems that have it.
+ The only bit of terminal state we want to twiddle is echoing, which is
+ done in software; there is no need to change the state of the terminal
+ hardware. */
+
+#ifndef TCSASOFT
+# define TCSASOFT 0
+#endif
+
+static void
+call_fclose (void *arg)
+{
+ if (arg != NULL)
+ fclose (arg);
+}
+
+char *
+getpass (const char *prompt)
+{
+ FILE *tty;
+ FILE *in, *out;
+ struct termios s, t;
+ bool tty_changed = false;
+ static char *buf;
+ static size_t bufsize;
+ ssize_t nread;
+
+ /* Try to write to and read from the terminal if we can.
+ If we can't open the terminal, use stderr and stdin. */
+
+ tty = fopen ("/dev/tty", "w+");
+ if (tty == NULL)
+ {
+ in = stdin;
+ out = stderr;
+ }
+ else
+ {
+ /* We do the locking ourselves. */
+ __fsetlocking (tty, FSETLOCKING_BYCALLER);
+
+ out = in = tty;
+ }
+
+ flockfile (out);
+
+ /* Turn echoing off if it is on now. */
+#if HAVE_TCGETATTR
+ if (tcgetattr (fileno (in), &t) == 0)
+ {
+ /* Save the old one. */
+ s = t;
+ /* Tricky, tricky. */
+ t.c_lflag &= ~(ECHO | ISIG);
+ tty_changed = (tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &t) == 0);
+ }
+#endif
+
+ /* Write the prompt. */
+ fputs_unlocked (prompt, out);
+ fflush_unlocked (out);
+
+ /* Read the password. */
+ nread = getline (&buf, &bufsize, in);
+
+ /* According to the C standard, input may not be followed by output
+ on the same stream without an intervening call to a file
+ positioning function. Suppose in == out; then without this fseek
+ call, on Solaris, HP-UX, AIX, OSF/1, the previous input gets
+ echoed, whereas on IRIX, the following newline is not output as
+ it should be. POSIX imposes similar restrictions if fileno (in)
+ == fileno (out). The POSIX restrictions are tricky and change
+ from POSIX version to POSIX version, so play it safe and invoke
+ fseek even if in != out. */
+ fseeko (out, 0, SEEK_CUR);
+
+ if (buf != NULL)
+ {
+ if (nread < 0)
+ buf[0] = '\0';
+ else if (buf[nread - 1] == '\n')
+ {
+ /* Remove the newline. */
+ buf[nread - 1] = '\0';
+ if (tty_changed)
+ {
+ /* Write the newline that was not echoed. */
+ putc_unlocked ('\n', out);
+ }
+ }
+ }
+
+ /* Restore the original setting. */
+#if HAVE_TCSETATTR
+ if (tty_changed)
+ tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &s);
+#endif
+
+ funlockfile (out);
+
+ call_fclose (tty);
+
+ return buf;
+}
+
+#else /* W32 native */
+
+/* Windows implementation by Martin Lambers <marlam@marlam.de>,
+ improved by Simon Josefsson. */
+
+/* For PASS_MAX. */
+#include <limits.h>
+/* For _getch(). */
+#include <conio.h>
+/* For strdup(). */
+#include <string.h>
+
+#ifndef PASS_MAX
+# define PASS_MAX 512
+#endif
+
+char *
+getpass (const char *prompt)
+{
+ char getpassbuf[PASS_MAX + 1];
+ size_t i = 0;
+ int c;
+
+ if (prompt)
+ {
+ fputs (prompt, stderr);
+ fflush (stderr);
+ }
+
+ for (;;)
+ {
+ c = _getch ();
+ if (c == '\r')
+ {
+ getpassbuf[i] = '\0';
+ break;
+ }
+ else if (i < PASS_MAX)
+ {
+ getpassbuf[i++] = c;
+ }
+
+ if (i >= PASS_MAX)
+ {
+ getpassbuf[i] = '\0';
+ break;
+ }
+ }
+
+ if (prompt)
+ {
+ fputs ("\r\n", stderr);
+ fflush (stderr);
+ }
+
+ return strdup (getpassbuf);
+}
+#endif
diff --git a/gnulib/lib/getpass.h b/gnulib/lib/getpass.h
new file mode 100644
index 00000000..10ed003c
--- /dev/null
+++ b/gnulib/lib/getpass.h
@@ -0,0 +1,31 @@
+/* getpass.h -- Read a password of arbitrary length from /dev/tty or stdin.
+ Copyright (C) 2004, 2009-2010 Free Software Foundation, Inc.
+ Contributed by Simon Josefsson <jas@extundo.com>, 2004.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef GETPASS_H
+# define GETPASS_H
+
+/* Get getpass declaration, if available. */
+# include <unistd.h>
+
+# if defined HAVE_DECL_GETPASS && !HAVE_DECL_GETPASS
+/* Read a password of arbitrary length from /dev/tty or stdin. */
+char *getpass (const char *prompt);
+
+# endif
+
+#endif /* GETPASS_H */
diff --git a/gnulib/lib/getpeername.c b/gnulib/lib/getpeername.c
new file mode 100644
index 00000000..b9da14c0
--- /dev/null
+++ b/gnulib/lib/getpeername.c
@@ -0,0 +1,40 @@
+/* getpeername.c --- wrappers for Windows getpeername function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getpeername
+
+int
+rpl_getpeername (int fd, struct sockaddr *addr, int *addrlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = getpeername (sock, addr, addrlen);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/getsockname.c b/gnulib/lib/getsockname.c
new file mode 100644
index 00000000..247a5a9e
--- /dev/null
+++ b/gnulib/lib/getsockname.c
@@ -0,0 +1,40 @@
+/* getsockname.c --- wrappers for Windows getsockname function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getsockname
+
+int
+rpl_getsockname (int fd, struct sockaddr *addr, int *addrlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = getsockname (sock, addr, addrlen);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/getsockopt.c b/gnulib/lib/getsockopt.c
new file mode 100644
index 00000000..4e53a6fe
--- /dev/null
+++ b/gnulib/lib/getsockopt.c
@@ -0,0 +1,67 @@
+/* getsockopt.c --- wrappers for Windows getsockopt function
+
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get struct timeval. */
+#include <sys/time.h>
+
+/* Get memcpy. */
+#include <string.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getsockopt
+
+int
+rpl_getsockopt (int fd, int level, int optname, void *optval, socklen_t *optlen)
+{
+ int r;
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (level == SOL_SOCKET && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO))
+ {
+ int milliseconds;
+ int milliseconds_len = sizeof (int);
+ struct timeval tv;
+ size_t n;
+ r = getsockopt (sock, level, optname, &milliseconds, &milliseconds_len);
+ tv.tv_sec = milliseconds / 1000;
+ tv.tv_usec = (milliseconds - 1000 * tv.tv_sec) * 1000;
+ n = sizeof (struct timeval);
+ if (n > *optlen)
+ n = *optlen;
+ memcpy (optval, &tv, n);
+ *optlen = n;
+ }
+ else
+ {
+ r = getsockopt (sock, level, optname, optval, optlen);
+ }
+
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/getsubopt.c b/gnulib/lib/getsubopt.c
new file mode 100644
index 00000000..27922102
--- /dev/null
+++ b/gnulib/lib/getsubopt.c
@@ -0,0 +1,82 @@
+/* Parse comma separated list into words.
+ Copyright (C) 1996, 1997, 1999, 2004, 2007, 2009, 2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#if !_LIBC
+/* This code is written for inclusion in gnu-libc, and uses names in
+ the namespace reserved for libc. If we're compiling in gnulib,
+ define those names to be the normal ones instead. */
+# undef __strchrnul
+# define __strchrnul strchrnul
+#endif
+
+/* Parse comma separated suboption from *OPTIONP and match against
+ strings in TOKENS. If found return index and set *VALUEP to
+ optional value introduced by an equal sign. If the suboption is
+ not part of TOKENS return in *VALUEP beginning of unknown
+ suboption. On exit *OPTIONP is set to the beginning of the next
+ token or at the terminating NUL character. */
+int
+getsubopt (char **optionp, char *const *tokens, char **valuep)
+{
+ char *endp, *vstart;
+ int cnt;
+
+ if (**optionp == '\0')
+ return -1;
+
+ /* Find end of next token. */
+ endp = __strchrnul (*optionp, ',');
+
+ /* Find start of value. */
+ vstart = memchr (*optionp, '=', endp - *optionp);
+ if (vstart == NULL)
+ vstart = endp;
+
+ /* Try to match the characters between *OPTIONP and VSTART against
+ one of the TOKENS. */
+ for (cnt = 0; tokens[cnt] != NULL; ++cnt)
+ if (strncmp (*optionp, tokens[cnt], vstart - *optionp) == 0
+ && tokens[cnt][vstart - *optionp] == '\0')
+ {
+ /* We found the current option in TOKENS. */
+ *valuep = vstart != endp ? vstart + 1 : NULL;
+
+ if (*endp != '\0')
+ *endp++ = '\0';
+ *optionp = endp;
+
+ return cnt;
+ }
+
+ /* The current suboption does not match any option. */
+ *valuep = *optionp;
+
+ if (*endp != '\0')
+ *endp++ = '\0';
+ *optionp = endp;
+
+ return -1;
+}
diff --git a/gnulib/lib/gettext.h b/gnulib/lib/gettext.h
new file mode 100644
index 00000000..6b98c3b6
--- /dev/null
+++ b/gnulib/lib/gettext.h
@@ -0,0 +1,280 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+ Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option. */
+#if ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions. */
+# include <libintl.h>
+
+/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
+ the gettext() and ngettext() macros. This is an alternative to calling
+ textdomain(), and is useful for libraries. */
+# ifdef DEFAULT_TEXT_DOMAIN
+# undef gettext
+# define gettext(Msgid) \
+ dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
+# undef ngettext
+# define ngettext(Msgid1, Msgid2, N) \
+ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
+# endif
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+ chokes if dcgettext is defined as a macro. So include it now, to make
+ later inclusions of <locale.h> a NOP. We don't include <libintl.h>
+ as well because people using "gettext.h" will not include <libintl.h>,
+ and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+ is OK. */
+#if defined(__sun)
+# include <locale.h>
+#endif
+
+/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
+ <libintl.h>, which chokes if dcgettext is defined as a macro. So include
+ it now, to make later inclusions of <libintl.h> a NOP. */
+#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
+# include <cstdlib>
+# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H
+# include <libintl.h>
+# endif
+#endif
+
+/* Disabled NLS.
+ The casts to 'const char *' serve the purpose of producing warnings
+ for invalid uses of the value returned from these functions.
+ On pre-ANSI systems without 'const', the config.h file is supposed to
+ contain "#define const". */
+# undef gettext
+# define gettext(Msgid) ((const char *) (Msgid))
+# undef dgettext
+# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
+# undef dcgettext
+# define dcgettext(Domainname, Msgid, Category) \
+ ((void) (Category), dgettext (Domainname, Msgid))
+# undef ngettext
+# define ngettext(Msgid1, Msgid2, N) \
+ ((N) == 1 \
+ ? ((void) (Msgid2), (const char *) (Msgid1)) \
+ : ((void) (Msgid1), (const char *) (Msgid2)))
+# undef dngettext
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+ ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
+# undef dcngettext
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+ ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N))
+# undef textdomain
+# define textdomain(Domainname) ((const char *) (Domainname))
+# undef bindtextdomain
+# define bindtextdomain(Domainname, Dirname) \
+ ((void) (Domainname), (const char *) (Dirname))
+# undef bind_textdomain_codeset
+# define bind_textdomain_codeset(Domainname, Codeset) \
+ ((void) (Domainname), (const char *) (Codeset))
+
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+ extraction of messages, but does not call gettext(). The run-time
+ translation is done at a different place in the code.
+ The argument, String, should be a literal string. Concatenated strings
+ and other string expressions won't work.
+ The macro's expansion is not parenthesized, so that it is suitable as
+ initializer for static 'char[]' or 'const char[]' variables. */
+#define gettext_noop(String) String
+
+/* The separator between msgctxt and msgid in a .mo file. */
+#define GETTEXT_CONTEXT_GLUE "\004"
+
+/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
+ MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
+ short and rarely need to change.
+ The letter 'p' stands for 'particular' or 'special'. */
+#ifdef DEFAULT_TEXT_DOMAIN
+# define pgettext(Msgctxt, Msgid) \
+ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#else
+# define pgettext(Msgctxt, Msgid) \
+ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#endif
+#define dpgettext(Domainname, Msgctxt, Msgid) \
+ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
+ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
+#ifdef DEFAULT_TEXT_DOMAIN
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#else
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#endif
+#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
+ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+pgettext_aux (const char *domain,
+ const char *msg_ctxt_id, const char *msgid,
+ int category)
+{
+ const char *translation = dcgettext (domain, msg_ctxt_id, category);
+ if (translation == msg_ctxt_id)
+ return msgid;
+ else
+ return translation;
+}
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+npgettext_aux (const char *domain,
+ const char *msg_ctxt_id, const char *msgid,
+ const char *msgid_plural, unsigned long int n,
+ int category)
+{
+ const char *translation =
+ dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+ if (translation == msg_ctxt_id || translation == msgid_plural)
+ return (n == 1 ? msgid : msgid_plural);
+ else
+ return translation;
+}
+
+/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
+ can be arbitrary expressions. But for string literals these macros are
+ less efficient than those above. */
+
+#include <string.h>
+
+#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \
+ (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \
+ /* || __STDC_VERSION__ >= 199901L */ )
+
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+#include <stdlib.h>
+#endif
+
+#define pgettext_expr(Msgctxt, Msgid) \
+ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
+#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
+ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcpgettext_expr (const char *domain,
+ const char *msgctxt, const char *msgid,
+ int category)
+{
+ size_t msgctxt_len = strlen (msgctxt) + 1;
+ size_t msgid_len = strlen (msgid) + 1;
+ const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+ char buf[1024];
+ char *msg_ctxt_id =
+ (msgctxt_len + msgid_len <= sizeof (buf)
+ ? buf
+ : (char *) malloc (msgctxt_len + msgid_len));
+ if (msg_ctxt_id != NULL)
+#endif
+ {
+ memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+ msg_ctxt_id[msgctxt_len - 1] = '\004';
+ memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+ translation = dcgettext (domain, msg_ctxt_id, category);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ if (msg_ctxt_id != buf)
+ free (msg_ctxt_id);
+#endif
+ if (translation != msg_ctxt_id)
+ return translation;
+ }
+ return msgid;
+}
+
+#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
+ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcnpgettext_expr (const char *domain,
+ const char *msgctxt, const char *msgid,
+ const char *msgid_plural, unsigned long int n,
+ int category)
+{
+ size_t msgctxt_len = strlen (msgctxt) + 1;
+ size_t msgid_len = strlen (msgid) + 1;
+ const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+ char buf[1024];
+ char *msg_ctxt_id =
+ (msgctxt_len + msgid_len <= sizeof (buf)
+ ? buf
+ : (char *) malloc (msgctxt_len + msgid_len));
+ if (msg_ctxt_id != NULL)
+#endif
+ {
+ memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+ msg_ctxt_id[msgctxt_len - 1] = '\004';
+ memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+ translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ if (msg_ctxt_id != buf)
+ free (msg_ctxt_id);
+#endif
+ if (!(translation == msg_ctxt_id || translation == msgid_plural))
+ return translation;
+ }
+ return (n == 1 ? msgid : msgid_plural);
+}
+
+#endif /* _LIBGETTEXT_H */
diff --git a/gnulib/lib/gettime.c b/gnulib/lib/gettime.c
new file mode 100644
index 00000000..044b26f0
--- /dev/null
+++ b/gnulib/lib/gettime.c
@@ -0,0 +1,48 @@
+/* gettime -- get the system clock
+
+ Copyright (C) 2002, 2004-2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "timespec.h"
+
+#include <sys/time.h>
+
+/* Get the system time into *TS. */
+
+void
+gettime (struct timespec *ts)
+{
+#if HAVE_NANOTIME
+ nanotime (ts);
+#else
+
+# if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME
+ if (clock_gettime (CLOCK_REALTIME, ts) == 0)
+ return;
+# endif
+
+ {
+ struct timeval tv;
+ gettimeofday (&tv, NULL);
+ ts->tv_sec = tv.tv_sec;
+ ts->tv_nsec = tv.tv_usec * 1000;
+ }
+
+#endif
+}
diff --git a/gnulib/lib/gettimeofday.c b/gnulib/lib/gettimeofday.c
new file mode 100644
index 00000000..3c4e3a28
--- /dev/null
+++ b/gnulib/lib/gettimeofday.c
@@ -0,0 +1,144 @@
+/* Provide gettimeofday for systems that don't have it or for which it's broken.
+
+ Copyright (C) 2001-2003, 2005-2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/time.h>
+
+#include <time.h>
+
+#if HAVE_SYS_TIMEB_H
+# include <sys/timeb.h>
+#endif
+
+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME
+
+/* Work around the bug in some systems whereby gettimeofday clobbers
+ the static buffer that localtime uses for its return value. The
+ gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has
+ this problem. The tzset replacement is necessary for at least
+ Solaris 2.5, 2.5.1, and 2.6. */
+
+static struct tm tm_zero_buffer;
+static struct tm *localtime_buffer_addr = &tm_zero_buffer;
+
+#undef localtime
+extern struct tm *localtime (time_t const *);
+
+#undef gmtime
+extern struct tm *gmtime (time_t const *);
+
+/* This is a wrapper for localtime. It is used only on systems for which
+ gettimeofday clobbers the static buffer used for localtime's result.
+
+ On the first call, record the address of the static buffer that
+ localtime uses for its result. */
+
+struct tm *
+rpl_localtime (time_t const *timep)
+{
+ struct tm *tm = localtime (timep);
+
+ if (localtime_buffer_addr == &tm_zero_buffer)
+ localtime_buffer_addr = tm;
+
+ return tm;
+}
+
+/* Same as above, since gmtime and localtime use the same buffer. */
+struct tm *
+rpl_gmtime (time_t const *timep)
+{
+ struct tm *tm = gmtime (timep);
+
+ if (localtime_buffer_addr == &tm_zero_buffer)
+ localtime_buffer_addr = tm;
+
+ return tm;
+}
+
+#endif /* GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME */
+
+#if TZSET_CLOBBERS_LOCALTIME
+
+#undef tzset
+extern void tzset (void);
+
+/* This is a wrapper for tzset, for systems on which tzset may clobber
+ the static buffer used for localtime's result. */
+void
+rpl_tzset (void)
+{
+ /* Save and restore the contents of the buffer used for localtime's
+ result around the call to tzset. */
+ struct tm save = *localtime_buffer_addr;
+ tzset ();
+ *localtime_buffer_addr = save;
+}
+#endif
+
+/* This is a wrapper for gettimeofday. It is used only on systems
+ that lack this function, or whose implementation of this function
+ causes problems. */
+
+int
+gettimeofday (struct timeval *restrict tv, void *restrict tz)
+{
+#undef gettimeofday
+#if HAVE_GETTIMEOFDAY
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+ /* Save and restore the contents of the buffer used for localtime's
+ result around the call to gettimeofday. */
+ struct tm save = *localtime_buffer_addr;
+# endif
+
+ int result = gettimeofday (tv, (struct timezone *) tz);
+
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+ *localtime_buffer_addr = save;
+# endif
+
+ return result;
+
+#else
+
+# if HAVE__FTIME
+
+ struct _timeb timebuf;
+ _ftime (&timebuf);
+ tv->tv_sec = timebuf.time;
+ tv->tv_usec = timebuf.millitm * 1000;
+
+# else
+
+# if !defined OK_TO_USE_1S_CLOCK
+# error "Only 1-second nominal clock resolution found. Is that intended?" \
+ "If so, compile with the -DOK_TO_USE_1S_CLOCK option."
+# endif
+ tv->tv_sec = time (NULL);
+ tv->tv_usec = 0;
+
+# endif
+
+ return 0;
+
+#endif
+}
diff --git a/gnulib/lib/getugroups.c b/gnulib/lib/getugroups.c
new file mode 100644
index 00000000..299bae68
--- /dev/null
+++ b/gnulib/lib/getugroups.c
@@ -0,0 +1,125 @@
+/* getugroups.c -- return a list of the groups a user is in
+
+ Copyright (C) 1990-1991, 1998-2000, 2003-2010 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/>. */
+
+/* Written by David MacKenzie. */
+
+#include <config.h>
+
+#include "getugroups.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h> /* grp.h on alpha OSF1 V2.0 uses "FILE *". */
+#include <string.h>
+#include <unistd.h>
+
+#if !HAVE_GRP_H
+
+/* Mingw lacks all things related to group management. The best we
+ can do is fail with ENOSYS. */
+
+int
+getugroups (int maxcount _GL_UNUSED,
+ gid_t *grouplist _GL_UNUSED,
+ char const *username _GL_UNUSED,
+ gid_t gid _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_GRP_H */
+# include <grp.h>
+
+# define STREQ(a, b) (strcmp (a, b) == 0)
+
+/* Like `getgroups', but for user USERNAME instead of for the current
+ process. Store at most MAXCOUNT group IDs in the GROUPLIST array.
+ If GID is not -1, store it first (if possible). GID should be the
+ group ID (pw_gid) obtained from getpwuid, in case USERNAME is not
+ listed in /etc/groups. Upon failure, set errno and return -1.
+ Otherwise, return the number of IDs we've written into GROUPLIST. */
+
+int
+getugroups (int maxcount, gid_t *grouplist, char const *username,
+ gid_t gid)
+{
+ int count = 0;
+
+ if (gid != (gid_t) -1)
+ {
+ if (maxcount != 0)
+ grouplist[count] = gid;
+ ++count;
+ }
+
+ setgrent ();
+ while (1)
+ {
+ char **cp;
+ struct group *grp;
+
+ errno = 0;
+ grp = getgrent ();
+ if (grp == NULL)
+ break;
+
+ for (cp = grp->gr_mem; *cp; ++cp)
+ {
+ int n;
+
+ if ( ! STREQ (username, *cp))
+ continue;
+
+ /* See if this group number is already on the list. */
+ for (n = 0; n < count; ++n)
+ if (grouplist && grouplist[n] == grp->gr_gid)
+ break;
+
+ /* If it's a new group number, then try to add it to the list. */
+ if (n == count)
+ {
+ if (maxcount != 0)
+ {
+ if (count >= maxcount)
+ goto done;
+ grouplist[count] = grp->gr_gid;
+ }
+ if (count == INT_MAX)
+ {
+ errno = EOVERFLOW;
+ goto done;
+ }
+ count++;
+ }
+ }
+ }
+
+ if (errno != 0)
+ count = -1;
+
+ done:
+ {
+ int saved_errno = errno;
+ endgrent ();
+ errno = saved_errno;
+ }
+
+ return count;
+}
+
+#endif /* HAVE_GRP_H */
diff --git a/gnulib/lib/getugroups.h b/gnulib/lib/getugroups.h
new file mode 100644
index 00000000..7ed78dde
--- /dev/null
+++ b/gnulib/lib/getugroups.h
@@ -0,0 +1,19 @@
+/* Get a list of group IDs associated with a specified user ID.
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+#include <sys/types.h>
+int getugroups (int maxcount, gid_t *grouplist, char const *username,
+ gid_t gid);
diff --git a/gnulib/lib/getusershell.c b/gnulib/lib/getusershell.c
new file mode 100644
index 00000000..a97b34ab
--- /dev/null
+++ b/gnulib/lib/getusershell.c
@@ -0,0 +1,173 @@
+/* getusershell.c -- Return names of valid user shells.
+
+ Copyright (C) 1991, 1997, 2000-2001, 2003-2006, 2008-2010 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/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu> */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#ifndef SHELLS_FILE
+# ifndef __DJGPP__
+/* File containing a list of nonrestricted shells, one per line. */
+# define SHELLS_FILE "/etc/shells"
+# else
+/* This is a horrible kludge. Isn't there a better way? */
+# define SHELLS_FILE "/dev/env/DJDIR/etc/shells"
+# endif
+#endif
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "stdio--.h"
+#include "xalloc.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+static size_t readname (char **, size_t *, FILE *);
+
+#if ! defined ADDITIONAL_DEFAULT_SHELLS && defined __MSDOS__
+# define ADDITIONAL_DEFAULT_SHELLS \
+ "c:/dos/command.com", "c:/windows/command.com", "c:/command.com",
+#else
+# define ADDITIONAL_DEFAULT_SHELLS /* empty */
+#endif
+
+/* List of shells to use if the shells file is missing. */
+static char const* const default_shells[] =
+{
+ ADDITIONAL_DEFAULT_SHELLS
+ "/bin/sh", "/bin/csh", "/usr/bin/sh", "/usr/bin/csh", NULL
+};
+
+/* Index of the next shell in `default_shells' to return.
+ 0 means we are not using `default_shells'. */
+static size_t default_index = 0;
+
+/* Input stream from the shells file. */
+static FILE *shellstream = NULL;
+
+/* Line of input from the shells file. */
+static char *line = NULL;
+
+/* Number of bytes allocated for `line'. */
+static size_t line_size = 0;
+
+/* Return an entry from the shells file, ignoring comment lines.
+ If the file doesn't exist, use the list in DEFAULT_SHELLS (above).
+ In any case, the returned string is in memory allocated through malloc.
+ Return NULL if there are no more entries. */
+
+char *
+getusershell (void)
+{
+ if (default_index > 0)
+ {
+ if (default_shells[default_index])
+ /* Not at the end of the list yet. */
+ return xstrdup (default_shells[default_index++]);
+ return NULL;
+ }
+
+ if (shellstream == NULL)
+ {
+ shellstream = fopen (SHELLS_FILE, "r");
+ if (shellstream == NULL)
+ {
+ /* No shells file. Use the default list. */
+ default_index = 1;
+ return xstrdup (default_shells[0]);
+ }
+ }
+
+ while (readname (&line, &line_size, shellstream))
+ {
+ if (*line != '#')
+ return line;
+ }
+ return NULL; /* End of file. */
+}
+
+/* Rewind the shells file. */
+
+void
+setusershell (void)
+{
+ default_index = 0;
+ if (shellstream)
+ rewind (shellstream);
+}
+
+/* Close the shells file. */
+
+void
+endusershell (void)
+{
+ if (shellstream)
+ {
+ fclose (shellstream);
+ shellstream = NULL;
+ }
+}
+
+/* Read a line from STREAM, removing any newline at the end.
+ Place the result in *NAME, which is malloc'd
+ and/or realloc'd as necessary and can start out NULL,
+ and whose size is passed and returned in *SIZE.
+
+ Return the number of bytes placed in *NAME
+ if some nonempty sequence was found, otherwise 0. */
+
+static size_t
+readname (char **name, size_t *size, FILE *stream)
+{
+ int c;
+ size_t name_index = 0;
+
+ /* Skip blank space. */
+ while ((c = getc (stream)) != EOF && isspace (c))
+ /* Do nothing. */ ;
+
+ for (;;)
+ {
+ if (*size <= name_index)
+ *name = x2nrealloc (*name, size, sizeof **name);
+ if (c == EOF || isspace (c))
+ break;
+ (*name)[name_index++] = c;
+ c = getc (stream);
+ }
+ (*name)[name_index] = '\0';
+ return name_index;
+}
+
+#ifdef TEST
+int
+main (void)
+{
+ char *s;
+
+ while (s = getusershell ())
+ puts (s);
+ exit (0);
+}
+#endif
diff --git a/gnulib/lib/git-merge-changelog.c b/gnulib/lib/git-merge-changelog.c
new file mode 100644
index 00000000..b9ab4294
--- /dev/null
+++ b/gnulib/lib/git-merge-changelog.c
@@ -0,0 +1,1646 @@
+/* git-merge-changelog - git "merge" driver for GNU style ChangeLog files.
+ Copyright (C) 2008-2009 Bruno Haible <bruno@clisp.org>
+
+ 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 2 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/>. */
+
+/* README:
+ The default merge driver of 'git' *always* produces conflicts when
+ pulling public modifications into a privately modified ChangeLog file.
+ This is because ChangeLog files are always modified at the top; the
+ default merge driver has no clue how to deal with this. Furthermore
+ the conflicts are presented with more <<<< ==== >>>> markers than
+ necessary; this is because the default merge driver makes pointless
+ efforts to look at the individual line changes inside a ChangeLog entry.
+
+ This program serves as a 'git' merge driver that avoids these problems.
+ 1. It produces no conflict when ChangeLog entries have been inserted
+ at the top both in the public and in the private modification. It
+ puts the privately added entries above the publicly added entries.
+ 2. It respects the structure of ChangeLog files: entries are not split
+ into lines but kept together.
+ 3. It also handles the case of small modifications of past ChangeLog
+ entries, or of removed ChangeLog entries: they are merged as one
+ would expect it.
+ 4. Conflicts are presented at the top of the file, rather than where
+ they occurred, so that the user will see them immediately. (Unlike
+ for source code written in some programming language, conflict markers
+ that are located several hundreds lines from the top will not cause
+ any syntax error and therefore would be likely to remain unnoticed.)
+ */
+
+/* Installation:
+ $ gnulib-tool --create-testdir --dir=/tmp/testdir123 git-merge-changelog
+ $ cd /tmp/testdir123
+ $ ./configure
+ $ make
+ $ make install
+ - Add to .git/config of the checkout (or to your $HOME/.gitconfig) the lines
+
+ [merge "merge-changelog"]
+ name = GNU-style ChangeLog merge driver
+ driver = /usr/local/bin/git-merge-changelog %O %A %B
+
+ - In every directory that contains a ChangeLog file, add a file
+ '.gitattributes' with this line:
+
+ ChangeLog merge=merge-changelog
+
+ (See "man 5 gitattributes" for more info.)
+ */
+
+/* Calling convention:
+ A merge driver is called with three filename arguments:
+ 1. %O = The common ancestor of %A and %B.
+ 2. %A = The file's contents from the "current branch".
+ 3. %B = The file's contents from the "other branch"; this is the contents
+ being merged in.
+
+ In case of a "git stash apply" or of an upstream pull (e.g. from a subsystem
+ maintainer to a central maintainer) or of a downstream pull with --rebase:
+ 2. %A = The file's newest pulled contents; modified by other committers.
+ 3. %B = The user's newest copy of the file; modified by the user.
+ In case of a downstream pull (e.g. from a central repository to the user)
+ or of an upstream pull with --rebase:
+ 2. %A = The user's newest copy of the file; modified by the user.
+ 3. %B = The file's newest pulled contents; modified by other committers.
+
+ It should write its merged output into file %A. It can also echo some
+ remarks to stdout. It should exit with return code 0 if the merge could
+ be resolved cleanly, or with non-zero return code if there were conflicts.
+ */
+
+/* How it works:
+ The structure of a ChangeLog file: It consists of ChangeLog entries. A
+ ChangeLog entry starts at a line following a blank line and that starts with
+ a non-whitespace character, or at the beginning of a file.
+ The merge driver works as follows: It reads the three files into memory and
+ dissects them into ChangeLog entries. It then finds the differences between
+ %O and %B. They are classified as:
+ - removals (some consecutive entries removed),
+ - changes (some consecutive entries removed, some consecutive entries
+ added),
+ - additions (some consecutive entries added).
+ The driver then attempts to apply the changes to %A.
+ To this effect, it first computes a correspondence between the entries in %O
+ and the entries in %A, using fuzzy string matching to still identify changed
+ entries.
+ - Removals are applied one by one. If the entry is present in %A, at any
+ position, it is removed. If not, the removal is marked as a conflict.
+ - Additions at the top of %B are applied at the top of %A.
+ - Additions between entry x and entry y (y may be the file end) in %B are
+ applied between entry x and entry y in %A (if they still exist and are
+ still consecutive in %A), otherwise the additions are marked as a
+ conflict.
+ - Changes are categorized into "simple changes":
+ entry1 ... entryn
+ are mapped to
+ added_entry ... added_entry modified_entry1 ... modified_entryn,
+ where the correspondence between entry_i and modified_entry_i is still
+ clear; and "big changes": these are all the rest. Simple changes at the
+ top of %B are applied by putting the added entries at the top of %A. The
+ changes in simple changes are applied one by one; possibly leading to
+ single-entry conflicts. Big changes are applied en bloc, possibly
+ leading to conflicts spanning multiple entries.
+ - Conflicts are output at the top of the file and cause an exit status of
+ 1.
+ */
+
+#include <config.h>
+
+#include <getopt.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "progname.h"
+#include "error.h"
+#include "read-file.h"
+#include "gl_xlist.h"
+#include "gl_array_list.h"
+#include "gl_linkedhash_list.h"
+#include "gl_rbtreehash_list.h"
+#include "gl_linked_list.h"
+#include "xalloc.h"
+#include "xmalloca.h"
+#include "fstrcmp.h"
+#include "minmax.h"
+#include "c-strstr.h"
+#include "fwriteerror.h"
+
+#define ASSERT(expr) \
+ do \
+ { \
+ if (!(expr)) \
+ abort (); \
+ } \
+ while (0)
+
+#define FSTRCMP_THRESHOLD 0.6
+#define FSTRCMP_STRICTER_THRESHOLD 0.8
+
+/* Representation of a ChangeLog entry.
+ The string may contain NUL bytes; therefore it is represented as a plain
+ opaque memory region. */
+struct entry
+{
+ char *string;
+ size_t length;
+ /* Cache for the hash code. */
+ bool hashcode_cached;
+ size_t hashcode;
+};
+
+/* Create an entry.
+ The memory region passed by the caller must of indefinite extent. It is
+ *not* copied here. */
+static struct entry *
+entry_create (char *string, size_t length)
+{
+ struct entry *result = XMALLOC (struct entry);
+ result->string = string;
+ result->length = length;
+ result->hashcode_cached = false;
+ return result;
+}
+
+/* Compare two entries for equality. */
+static bool
+entry_equals (const void *elt1, const void *elt2)
+{
+ const struct entry *entry1 = (const struct entry *) elt1;
+ const struct entry *entry2 = (const struct entry *) elt2;
+ return entry1->length == entry2->length
+ && memcmp (entry1->string, entry2->string, entry1->length) == 0;
+}
+
+/* Return a hash code of the contents of a ChangeLog entry. */
+static size_t
+entry_hashcode (const void *elt)
+{
+ struct entry *entry = (struct entry *) elt;
+ if (!entry->hashcode_cached)
+ {
+ /* See http://www.haible.de/bruno/hashfunc.html. */
+ const char *s;
+ size_t n;
+ size_t h = 0;
+
+ for (s = entry->string, n = entry->length; n > 0; s++, n--)
+ h = (unsigned char) *s + ((h << 9) | (h >> (sizeof (size_t) * CHAR_BIT - 9)));
+
+ entry->hashcode = h;
+ entry->hashcode_cached = true;
+ }
+ return entry->hashcode;
+}
+
+/* Perform a fuzzy comparison of two ChangeLog entries.
+ Return a similarity measure of the two entries, a value between 0 and 1.
+ 0 stands for very distinct, 1 for identical.
+ If the result is < LOWER_BOUND, an arbitrary other value < LOWER_BOUND can
+ be returned. */
+static double
+entry_fstrcmp (const struct entry *entry1, const struct entry *entry2,
+ double lower_bound)
+{
+ /* fstrcmp works only on NUL terminated strings. */
+ char *memory;
+ double similarity;
+
+ if (memchr (entry1->string, '\0', entry1->length) != NULL)
+ return 0.0;
+ if (memchr (entry2->string, '\0', entry2->length) != NULL)
+ return 0.0;
+ memory = (char *) xmalloca (entry1->length + 1 + entry2->length + 1);
+ {
+ char *p = memory;
+ memcpy (p, entry1->string, entry1->length);
+ p += entry1->length;
+ *p++ = '\0';
+ memcpy (p, entry2->string, entry2->length);
+ p += entry2->length;
+ *p++ = '\0';
+ }
+ similarity =
+ fstrcmp_bounded (memory, memory + entry1->length + 1, lower_bound);
+ freea (memory);
+ return similarity;
+}
+
+/* This structure represents an entire ChangeLog file, after it was read
+ into memory. */
+struct changelog_file
+{
+ /* The entries, as a list. */
+ gl_list_t /* <struct entry *> */ entries_list;
+ /* The entries, as a list in opposite direction. */
+ gl_list_t /* <struct entry *> */ entries_reversed;
+ /* The entries, as an array. */
+ size_t num_entries;
+ struct entry **entries;
+};
+
+/* Read a ChangeLog file into memory.
+ Return the contents in *RESULT. */
+static void
+read_changelog_file (const char *filename, struct changelog_file *result)
+{
+ /* Read the file in text mode, otherwise it's hard to recognize empty
+ lines. */
+ size_t length;
+ char *contents = read_file (filename, &length);
+ if (contents == NULL)
+ {
+ fprintf (stderr, "could not read file '%s'\n", filename);
+ exit (EXIT_FAILURE);
+ }
+
+ result->entries_list =
+ gl_list_create_empty (GL_LINKEDHASH_LIST, entry_equals, entry_hashcode,
+ NULL, true);
+ result->entries_reversed =
+ gl_list_create_empty (GL_RBTREEHASH_LIST, entry_equals, entry_hashcode,
+ NULL, true);
+ /* A ChangeLog file consists of ChangeLog entries. A ChangeLog entry starts
+ at a line following a blank line and that starts with a non-whitespace
+ character, or at the beginning of a file.
+ Split the file contents into entries. */
+ {
+ char *contents_end = contents + length;
+ char *start = contents;
+ while (start < contents_end)
+ {
+ /* Search the end of the current entry. */
+ char *ptr = start;
+ struct entry *curr;
+
+ while (ptr < contents_end)
+ {
+ ptr = memchr (ptr, '\n', contents_end - ptr);
+ if (ptr == NULL)
+ {
+ ptr = contents_end;
+ break;
+ }
+ ptr++;
+ if (contents_end - ptr >= 2
+ && ptr[0] == '\n'
+ && !(ptr[1] == '\n' || ptr[1] == '\t' || ptr[1] == ' '))
+ {
+ ptr++;
+ break;
+ }
+ }
+
+ curr = entry_create (start, ptr - start);
+ gl_list_add_last (result->entries_list, curr);
+ gl_list_add_first (result->entries_reversed, curr);
+
+ start = ptr;
+ }
+ }
+
+ result->num_entries = gl_list_size (result->entries_list);
+ result->entries = XNMALLOC (result->num_entries, struct entry *);
+ {
+ size_t index = 0;
+ gl_list_iterator_t iter = gl_list_iterator (result->entries_list);
+ const void *elt;
+ gl_list_node_t node;
+ while (gl_list_iterator_next (&iter, &elt, &node))
+ result->entries[index++] = (struct entry *) elt;
+ gl_list_iterator_free (&iter);
+ ASSERT (index == result->num_entries);
+ }
+}
+
+/* A mapping (correspondence) between entries of FILE1 and of FILE2. */
+struct entries_mapping
+{
+ struct changelog_file *file1;
+ struct changelog_file *file2;
+ /* Mapping from indices in FILE1 to indices in FILE2.
+ A value -1 means that the entry from FILE1 is not found in FILE2.
+ A value -2 means that it has not yet been computed. */
+ ssize_t *index_mapping;
+ /* Mapping from indices in FILE2 to indices in FILE1.
+ A value -1 means that the entry from FILE2 is not found in FILE1.
+ A value -2 means that it has not yet been computed. */
+ ssize_t *index_mapping_reverse;
+};
+
+/* Look up (or lazily compute) the mapping of an entry in FILE1.
+ i is the index in FILE1.
+ Return the index in FILE2, or -1 when the entry is not found in FILE2. */
+static ssize_t
+entries_mapping_get (struct entries_mapping *mapping, ssize_t i)
+{
+ if (mapping->index_mapping[i] < -1)
+ {
+ struct changelog_file *file1 = mapping->file1;
+ struct changelog_file *file2 = mapping->file2;
+ size_t n1 = file1->num_entries;
+ size_t n2 = file2->num_entries;
+ struct entry *entry_i = file1->entries[i];
+ ssize_t j;
+
+ /* Search whether it approximately occurs in file2. */
+ ssize_t best_j = -1;
+ double best_j_similarity = 0.0;
+ for (j = n2 - 1; j >= 0; j--)
+ if (mapping->index_mapping_reverse[j] < 0)
+ {
+ double similarity =
+ entry_fstrcmp (entry_i, file2->entries[j], best_j_similarity);
+ if (similarity > best_j_similarity)
+ {
+ best_j = j;
+ best_j_similarity = similarity;
+ }
+ }
+ if (best_j_similarity >= FSTRCMP_THRESHOLD)
+ {
+ /* Found a similar entry in file2. */
+ struct entry *entry_j = file2->entries[best_j];
+ /* Search whether it approximately occurs in file1 at index i. */
+ ssize_t best_i = -1;
+ double best_i_similarity = 0.0;
+ ssize_t ii;
+ for (ii = n1 - 1; ii >= 0; ii--)
+ if (mapping->index_mapping[ii] < 0)
+ {
+ double similarity =
+ entry_fstrcmp (file1->entries[ii], entry_j,
+ best_i_similarity);
+ if (similarity > best_i_similarity)
+ {
+ best_i = ii;
+ best_i_similarity = similarity;
+ }
+ }
+ if (best_i_similarity >= FSTRCMP_THRESHOLD && best_i == i)
+ {
+ mapping->index_mapping[i] = best_j;
+ mapping->index_mapping_reverse[best_j] = i;
+ }
+ }
+ if (mapping->index_mapping[i] < -1)
+ /* It does not approximately occur in FILE2.
+ Remember it, for next time. */
+ mapping->index_mapping[i] = -1;
+ }
+ return mapping->index_mapping[i];
+}
+
+/* Look up (or lazily compute) the mapping of an entry in FILE2.
+ j is the index in FILE2.
+ Return the index in FILE1, or -1 when the entry is not found in FILE1. */
+static ssize_t
+entries_mapping_reverse_get (struct entries_mapping *mapping, ssize_t j)
+{
+ if (mapping->index_mapping_reverse[j] < -1)
+ {
+ struct changelog_file *file1 = mapping->file1;
+ struct changelog_file *file2 = mapping->file2;
+ size_t n1 = file1->num_entries;
+ size_t n2 = file2->num_entries;
+ struct entry *entry_j = file2->entries[j];
+ ssize_t i;
+
+ /* Search whether it approximately occurs in file1. */
+ ssize_t best_i = -1;
+ double best_i_similarity = 0.0;
+ for (i = n1 - 1; i >= 0; i--)
+ if (mapping->index_mapping[i] < 0)
+ {
+ double similarity =
+ entry_fstrcmp (file1->entries[i], entry_j, best_i_similarity);
+ if (similarity > best_i_similarity)
+ {
+ best_i = i;
+ best_i_similarity = similarity;
+ }
+ }
+ if (best_i_similarity >= FSTRCMP_THRESHOLD)
+ {
+ /* Found a similar entry in file1. */
+ struct entry *entry_i = file1->entries[best_i];
+ /* Search whether it approximately occurs in file2 at index j. */
+ ssize_t best_j = -1;
+ double best_j_similarity = 0.0;
+ ssize_t jj;
+ for (jj = n2 - 1; jj >= 0; jj--)
+ if (mapping->index_mapping_reverse[jj] < 0)
+ {
+ double similarity =
+ entry_fstrcmp (entry_i, file2->entries[jj],
+ best_j_similarity);
+ if (similarity > best_j_similarity)
+ {
+ best_j = jj;
+ best_j_similarity = similarity;
+ }
+ }
+ if (best_j_similarity >= FSTRCMP_THRESHOLD && best_j == j)
+ {
+ mapping->index_mapping_reverse[j] = best_i;
+ mapping->index_mapping[best_i] = j;
+ }
+ }
+ if (mapping->index_mapping_reverse[j] < -1)
+ /* It does not approximately occur in FILE1.
+ Remember it, for next time. */
+ mapping->index_mapping_reverse[j] = -1;
+ }
+ return mapping->index_mapping_reverse[j];
+}
+
+/* Compute a mapping (correspondence) between entries of FILE1 and of FILE2.
+ The correspondence also takes into account small modifications; i.e. the
+ indicated relation is not equality of entries but best-match similarity
+ of entries.
+ If FULL is true, the maximum of matching is done up-front. If it is false,
+ it is done in a lazy way through the functions entries_mapping_get and
+ entries_mapping_reverse_get.
+ Return the result in *RESULT. */
+static void
+compute_mapping (struct changelog_file *file1, struct changelog_file *file2,
+ bool full,
+ struct entries_mapping *result)
+{
+ /* Mapping from indices in file1 to indices in file2. */
+ ssize_t *index_mapping;
+ /* Mapping from indices in file2 to indices in file1. */
+ ssize_t *index_mapping_reverse;
+ size_t n1 = file1->num_entries;
+ size_t n2 = file2->num_entries;
+ ssize_t i, j;
+
+ index_mapping = XNMALLOC (n1, ssize_t);
+ for (i = 0; i < n1; i++)
+ index_mapping[i] = -2;
+
+ index_mapping_reverse = XNMALLOC (n2, ssize_t);
+ for (j = 0; j < n2; j++)
+ index_mapping_reverse[j] = -2;
+
+ for (i = n1 - 1; i >= 0; i--)
+ /* Take an entry from file1. */
+ if (index_mapping[i] < -1)
+ {
+ struct entry *entry = file1->entries[i];
+ /* Search whether it occurs in file2. */
+ j = gl_list_indexof (file2->entries_reversed, entry);
+ if (j >= 0)
+ {
+ j = n2 - 1 - j;
+ /* Found an exact correspondence. */
+ /* If index_mapping_reverse[j] >= 0, we have already seen other
+ copies of this entry, and there were more occurrences of it in
+ file1 than in file2. In this case, do nothing. */
+ if (index_mapping_reverse[j] < 0)
+ {
+ index_mapping[i] = j;
+ index_mapping_reverse[j] = i;
+ /* Look for more occurrences of the same entry. Match them
+ as long as they pair up. Unpaired occurrences of the same
+ entry are left without mapping. */
+ {
+ ssize_t curr_i = i;
+ ssize_t curr_j = j;
+
+ for (;;)
+ {
+ ssize_t next_i;
+ ssize_t next_j;
+
+ next_i =
+ gl_list_indexof_from (file1->entries_reversed,
+ n1 - curr_i, entry);
+ if (next_i < 0)
+ break;
+ next_j =
+ gl_list_indexof_from (file2->entries_reversed,
+ n2 - curr_j, entry);
+ if (next_j < 0)
+ break;
+ curr_i = n1 - 1 - next_i;
+ curr_j = n2 - 1 - next_j;
+ ASSERT (index_mapping[curr_i] < 0);
+ ASSERT (index_mapping_reverse[curr_j] < 0);
+ index_mapping[curr_i] = curr_j;
+ index_mapping_reverse[curr_j] = curr_i;
+ }
+ }
+ }
+ }
+ }
+
+ result->file1 = file1;
+ result->file2 = file2;
+ result->index_mapping = index_mapping;
+ result->index_mapping_reverse = index_mapping_reverse;
+
+ if (full)
+ for (i = n1 - 1; i >= 0; i--)
+ entries_mapping_get (result, i);
+}
+
+/* An "edit" is a textual modification performed by the user, that needs to
+ be applied to the other file. */
+enum edit_type
+{
+ /* Some consecutive entries were added. */
+ ADDITION,
+ /* Some consecutive entries were removed; some other consecutive entries
+ were added at the same position. (Not necessarily the same number of
+ entries.) */
+ CHANGE,
+ /* Some consecutive entries were removed. */
+ REMOVAL
+};
+
+/* This structure represents an edit. */
+struct edit
+{
+ enum edit_type type;
+ /* Range of indices into the entries of FILE1. */
+ ssize_t i1, i2; /* first, last index; only used for CHANGE, REMOVAL */
+ /* Range of indices into the entries of FILE2. */
+ ssize_t j1, j2; /* first, last index; only used for ADDITION, CHANGE */
+};
+
+/* This structure represents the differences from one file, FILE1, to another
+ file, FILE2. */
+struct differences
+{
+ /* An array mapping FILE1 indices to FILE2 indices (or -1 when the entry
+ from FILE1 is not found in FILE2). */
+ ssize_t *index_mapping;
+ /* An array mapping FILE2 indices to FILE1 indices (or -1 when the entry
+ from FILE2 is not found in FILE1). */
+ ssize_t *index_mapping_reverse;
+ /* The edits that transform FILE1 into FILE2. */
+ size_t num_edits;
+ struct edit **edits;
+};
+
+/* Import the difference detection algorithm from GNU diff. */
+#define ELEMENT struct entry *
+#define EQUAL entry_equals
+#define OFFSET ssize_t
+#define EXTRA_CONTEXT_FIELDS \
+ ssize_t *index_mapping; \
+ ssize_t *index_mapping_reverse;
+#define NOTE_DELETE(ctxt, xoff) \
+ ctxt->index_mapping[xoff] = -1
+#define NOTE_INSERT(ctxt, yoff) \
+ ctxt->index_mapping_reverse[yoff] = -1
+#include "diffseq.h"
+
+/* Compute the differences between the entries of FILE1 and the entries of
+ FILE2. */
+static void
+compute_differences (struct changelog_file *file1, struct changelog_file *file2,
+ struct differences *result)
+{
+ /* Unlike compute_mapping, which mostly ignores the order of the entries and
+ therefore works well when some entries are permuted, here we use the order.
+ I think this is needed in order to distinguish changes from
+ additions+removals; I don't know how to say what is a "change" if the
+ files are considered as unordered sets of entries. */
+ struct context ctxt;
+ size_t n1 = file1->num_entries;
+ size_t n2 = file2->num_entries;
+ ssize_t i;
+ ssize_t j;
+ gl_list_t /* <struct edit *> */ edits;
+
+ ctxt.xvec = file1->entries;
+ ctxt.yvec = file2->entries;
+ ctxt.index_mapping = XNMALLOC (n1, ssize_t);
+ for (i = 0; i < n1; i++)
+ ctxt.index_mapping[i] = 0;
+ ctxt.index_mapping_reverse = XNMALLOC (n2, ssize_t);
+ for (j = 0; j < n2; j++)
+ ctxt.index_mapping_reverse[j] = 0;
+ ctxt.fdiag = XNMALLOC (2 * (n1 + n2 + 3), ssize_t) + n2 + 1;
+ ctxt.bdiag = ctxt.fdiag + n1 + n2 + 3;
+ ctxt.too_expensive = n1 + n2;
+
+ /* Store in ctxt.index_mapping and ctxt.index_mapping_reverse a -1 for
+ each removed or added entry. */
+ compareseq (0, n1, 0, n2, 0, &ctxt);
+
+ /* Complete the index_mapping and index_mapping_reverse arrays. */
+ i = 0;
+ j = 0;
+ while (i < n1 || j < n2)
+ {
+ while (i < n1 && ctxt.index_mapping[i] < 0)
+ i++;
+ while (j < n2 && ctxt.index_mapping_reverse[j] < 0)
+ j++;
+ ASSERT ((i < n1) == (j < n2));
+ if (i == n1 && j == n2)
+ break;
+ ctxt.index_mapping[i] = j;
+ ctxt.index_mapping_reverse[j] = i;
+ i++;
+ j++;
+ }
+
+ /* Create the edits. */
+ edits = gl_list_create_empty (GL_ARRAY_LIST, NULL, NULL, NULL, true);
+ i = 0;
+ j = 0;
+ while (i < n1 || j < n2)
+ {
+ if (i == n1)
+ {
+ struct edit *e;
+ ASSERT (j < n2);
+ e = XMALLOC (struct edit);
+ e->type = ADDITION;
+ e->j1 = j;
+ e->j2 = n2 - 1;
+ gl_list_add_last (edits, e);
+ break;
+ }
+ if (j == n2)
+ {
+ struct edit *e;
+ ASSERT (i < n1);
+ e = XMALLOC (struct edit);
+ e->type = REMOVAL;
+ e->i1 = i;
+ e->i2 = n1 - 1;
+ gl_list_add_last (edits, e);
+ break;
+ }
+ if (ctxt.index_mapping[i] >= 0)
+ {
+ if (ctxt.index_mapping_reverse[j] >= 0)
+ {
+ ASSERT (ctxt.index_mapping[i] == j);
+ ASSERT (ctxt.index_mapping_reverse[j] == i);
+ i++;
+ j++;
+ }
+ else
+ {
+ struct edit *e;
+ ASSERT (ctxt.index_mapping_reverse[j] < 0);
+ e = XMALLOC (struct edit);
+ e->type = ADDITION;
+ e->j1 = j;
+ do
+ j++;
+ while (j < n2 && ctxt.index_mapping_reverse[j] < 0);
+ e->j2 = j - 1;
+ gl_list_add_last (edits, e);
+ }
+ }
+ else
+ {
+ if (ctxt.index_mapping_reverse[j] >= 0)
+ {
+ struct edit *e;
+ ASSERT (ctxt.index_mapping[i] < 0);
+ e = XMALLOC (struct edit);
+ e->type = REMOVAL;
+ e->i1 = i;
+ do
+ i++;
+ while (i < n1 && ctxt.index_mapping[i] < 0);
+ e->i2 = i - 1;
+ gl_list_add_last (edits, e);
+ }
+ else
+ {
+ struct edit *e;
+ ASSERT (ctxt.index_mapping[i] < 0);
+ ASSERT (ctxt.index_mapping_reverse[j] < 0);
+ e = XMALLOC (struct edit);
+ e->type = CHANGE;
+ e->i1 = i;
+ do
+ i++;
+ while (i < n1 && ctxt.index_mapping[i] < 0);
+ e->i2 = i - 1;
+ e->j1 = j;
+ do
+ j++;
+ while (j < n2 && ctxt.index_mapping_reverse[j] < 0);
+ e->j2 = j - 1;
+ gl_list_add_last (edits, e);
+ }
+ }
+ }
+
+ result->index_mapping = ctxt.index_mapping;
+ result->index_mapping_reverse = ctxt.index_mapping_reverse;
+ result->num_edits = gl_list_size (edits);
+ result->edits = XNMALLOC (result->num_edits, struct edit *);
+ {
+ size_t index = 0;
+ gl_list_iterator_t iter = gl_list_iterator (edits);
+ const void *elt;
+ gl_list_node_t node;
+ while (gl_list_iterator_next (&iter, &elt, &node))
+ result->edits[index++] = (struct edit *) elt;
+ gl_list_iterator_free (&iter);
+ ASSERT (index == result->num_edits);
+ }
+}
+
+/* An empty entry. */
+static struct entry empty_entry = { NULL, 0 };
+
+/* Return the end a paragraph.
+ ENTRY is an entry.
+ OFFSET is an offset into the entry, OFFSET <= ENTRY->length.
+ Return the offset of the end of paragraph, as an offset <= ENTRY->length;
+ it is the start of a blank line or the end of the entry. */
+static size_t
+find_paragraph_end (const struct entry *entry, size_t offset)
+{
+ const char *string = entry->string;
+ size_t length = entry->length;
+
+ for (;;)
+ {
+ const char *nl = memchr (string + offset, '\n', length - offset);
+ if (nl == NULL)
+ return length;
+ offset = (nl - string) + 1;
+ if (offset < length && string[offset] == '\n')
+ return offset;
+ }
+}
+
+/* Split a merged entry.
+ Given an old entry of the form
+ TITLE
+ BODY
+ and a new entry of the form
+ TITLE
+ BODY1
+ BODY'
+ where the two titles are the same and BODY and BODY' are very similar,
+ this computes two new entries
+ TITLE
+ BODY1
+ and
+ TITLE
+ BODY'
+ and returns true.
+ If the entries don't have this form, it returns false. */
+static bool
+try_split_merged_entry (const struct entry *old_entry,
+ const struct entry *new_entry,
+ struct entry *new_split[2])
+{
+ size_t old_title_len = find_paragraph_end (old_entry, 0);
+ size_t new_title_len = find_paragraph_end (new_entry, 0);
+ struct entry old_body;
+ struct entry new_body;
+ size_t best_split_offset;
+ double best_similarity;
+ size_t split_offset;
+
+ /* Same title? */
+ if (!(old_title_len == new_title_len
+ && memcmp (old_entry->string, new_entry->string, old_title_len) == 0))
+ return false;
+
+ old_body.string = old_entry->string + old_title_len;
+ old_body.length = old_entry->length - old_title_len;
+
+ /* Determine where to split the new entry.
+ This is done by maximizing the similarity between BODY and BODY'. */
+ best_split_offset = split_offset = new_title_len;
+ best_similarity = 0.0;
+ for (;;)
+ {
+ double similarity;
+
+ new_body.string = new_entry->string + split_offset;
+ new_body.length = new_entry->length - split_offset;
+ similarity =
+ entry_fstrcmp (&old_body, &new_body, best_similarity);
+ if (similarity > best_similarity)
+ {
+ best_split_offset = split_offset;
+ best_similarity = similarity;
+ }
+ if (best_similarity == 1.0)
+ /* It cannot get better. */
+ break;
+
+ if (split_offset < new_entry->length)
+ split_offset = find_paragraph_end (new_entry, split_offset + 1);
+ else
+ break;
+ }
+
+ /* BODY' should not be empty. */
+ if (best_split_offset == new_entry->length)
+ return false;
+ ASSERT (new_entry->string[best_split_offset] == '\n');
+
+ /* A certain similarity between BODY and BODY' is required. */
+ if (best_similarity < FSTRCMP_STRICTER_THRESHOLD)
+ return false;
+
+ new_split[0] = entry_create (new_entry->string, best_split_offset + 1);
+
+ {
+ size_t len1 = new_title_len;
+ size_t len2 = new_entry->length - best_split_offset;
+ char *combined = XNMALLOC (len1 + len2, char);
+ memcpy (combined, new_entry->string, len1);
+ memcpy (combined + len1, new_entry->string + best_split_offset, len2);
+ new_split[1] = entry_create (combined, len1 + len2);
+ }
+
+ return true;
+}
+
+/* Write the contents of an entry to the output stream FP. */
+static void
+entry_write (FILE *fp, struct entry *entry)
+{
+ if (entry->length > 0)
+ fwrite (entry->string, 1, entry->length, fp);
+}
+
+/* This structure represents a conflict.
+ A conflict can occur for various reasons. */
+struct conflict
+{
+ /* Parts from the ancestor file. */
+ size_t num_old_entries;
+ struct entry **old_entries;
+ /* Parts of the modified file. */
+ size_t num_modified_entries;
+ struct entry **modified_entries;
+};
+
+/* Write a conflict to the output stream FP, including markers. */
+static void
+conflict_write (FILE *fp, struct conflict *c)
+{
+ size_t i;
+
+ /* Use the same syntax as git's default merge driver.
+ Don't indent the contents of the entries (with things like ">" or "-"),
+ otherwise the user needs more textual editing to resolve the conflict. */
+ fputs ("<<<<<<<\n", fp);
+ for (i = 0; i < c->num_old_entries; i++)
+ entry_write (fp, c->old_entries[i]);
+ fputs ("=======\n", fp);
+ for (i = 0; i < c->num_modified_entries; i++)
+ entry_write (fp, c->modified_entries[i]);
+ fputs (">>>>>>>\n", fp);
+}
+
+/* Long options. */
+static const struct option long_options[] =
+{
+ { "help", no_argument, NULL, 'h' },
+ { "split-merged-entry", no_argument, NULL, CHAR_MAX + 1 },
+ { "version", no_argument, NULL, 'V' },
+ { NULL, 0, NULL, 0 }
+};
+
+/* Print a usage mesage and exit. */
+static void
+usage (int status)
+{
+ if (status != EXIT_SUCCESS)
+ fprintf (stderr, "Try `%s --help' for more information.\n",
+ program_name);
+ else
+ {
+ printf ("Usage: %s [OPTION] O-FILE-NAME A-FILE-NAME B-FILE-NAME\n",
+ program_name);
+ printf ("\n");
+ printf ("Merges independent modifications of a ChangeLog style file.\n");
+ printf ("O-FILE-NAME names the original file, the ancestor of the two others.\n");
+ printf ("A-FILE-NAME names the publicly modified file.\n");
+ printf ("B-FILE-NAME names the user-modified file.\n");
+ printf ("Writes the merged file into A-FILE-NAME.\n");
+ printf ("\n");
+ printf ("Operation modifiers:\n");
+ printf ("\
+ --split-merged-entry Possibly split a merged entry between paragraphs.\n\
+ Use this if you have the habit to merge unrelated\n\
+ entries into a single one, separated only by a\n\
+ newline, just because they happened on the same\n\
+ date.\n");
+ printf ("\n");
+ printf ("Informative output:\n");
+ printf (" -h, --help display this help and exit\n");
+ printf (" -V, --version output version information and exit\n");
+ printf ("\n");
+ fputs ("Report bugs to <bug-gnu-gettext@gnu.org>.\n",
+ stdout);
+ }
+
+ exit (status);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int optchar;
+ bool do_help;
+ bool do_version;
+ bool split_merged_entry;
+
+ /* Set program name for messages. */
+ set_program_name (argv[0]);
+
+ /* Set default values for variables. */
+ do_help = false;
+ do_version = false;
+ split_merged_entry = false;
+
+ /* Parse command line options. */
+ while ((optchar = getopt_long (argc, argv, "hV", long_options, NULL)) != EOF)
+ switch (optchar)
+ {
+ case '\0': /* Long option. */
+ break;
+ case 'h':
+ do_help = true;
+ break;
+ case 'V':
+ do_version = true;
+ break;
+ case CHAR_MAX + 1: /* --split-merged-entry */
+ split_merged_entry = true;
+ break;
+ default:
+ usage (EXIT_FAILURE);
+ }
+
+ if (do_version)
+ {
+ /* Version information is requested. */
+ printf ("%s\n", program_name);
+ printf ("Copyright (C) %s Free Software Foundation, Inc.\n\
+License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>\n\
+This is free software: you are free to change and redistribute it.\n\
+There is NO WARRANTY, to the extent permitted by law.\n\
+",
+ "2008");
+ printf ("Written by %s.\n", "Bruno Haible");
+ exit (EXIT_SUCCESS);
+ }
+
+ if (do_help)
+ {
+ /* Help is requested. */
+ usage (EXIT_SUCCESS);
+ }
+
+ /* Test argument count. */
+ if (optind + 3 != argc)
+ error (EXIT_FAILURE, 0, "expected three arguments");
+
+ {
+ const char *ancestor_file_name; /* O-FILE-NAME */
+ const char *destination_file_name; /* A-FILE-NAME */
+ bool downstream;
+ const char *other_file_name; /* B-FILE-NAME */
+ const char *mainstream_file_name;
+ const char *modified_file_name;
+ struct changelog_file ancestor_file;
+ struct changelog_file mainstream_file;
+ struct changelog_file modified_file;
+ /* Mapping from indices in ancestor_file to indices in mainstream_file. */
+ struct entries_mapping mapping;
+ struct differences diffs;
+ gl_list_node_t *result_entries_pointers; /* array of pointers into result_entries */
+ gl_list_t /* <struct entry *> */ result_entries;
+ gl_list_t /* <struct conflict *> */ result_conflicts;
+
+ ancestor_file_name = argv[optind];
+ destination_file_name = argv[optind + 1];
+ other_file_name = argv[optind + 2];
+
+ /* Heuristic to determine whether it's a pull in downstream direction
+ (e.g. pull from a centralized server) or a pull in upstream direction
+ (e.g. "git stash apply").
+
+ For ChangeLog this distinction is important. The difference between
+ an "upstream" and a "downstream" repository is that more people are
+ looking at the "upstream" repository. They want to be informed about
+ changes and expect them to be shown at the top of the ChangeLog.
+ When a user pulls downstream, on the other hand, he has two options:
+ a) He gets the change entries from the central repository also at the
+ top of his ChangeLog, and his own changes come after them.
+ b) He gets the change entries from the central repository after those
+ he has collected for his branch. His own change entries stay at
+ the top of the ChangeLog file.
+ In the case a) he has to reorder the ChangeLog before he can commit.
+ No one does that. So most people want b).
+ In other words, the order of entries in a ChangeLog should represent
+ the order in which they have flown (or will flow) into the *central*
+ repository.
+
+ But in git this is fundamentally indistinguishable, because when Linus
+ pulls patches from akpm and akpm pulls patches from Linus, it's not
+ clear which of the two is more "upstream". Also, when you have many
+ branches in a repository and pull from one to another, "git" has no way
+ to know which branch is more "upstream" than the other. The git-tag(1)
+ manual page also says:
+ "One important aspect of git is it is distributed, and being
+ distributed largely means there is no inherent "upstream" or
+ "downstream" in the system."
+ Therefore anyone who attempts to produce a ChangeLog from the merge
+ history will fail.
+
+ Here we allow the user to specify the pull direction through an
+ environment variable (GIT_UPSTREAM or GIT_DOWNSTREAM). If these two
+ environment variables are not set, we assume a "simple single user"
+ usage pattern: He manages local changes through stashes and uses
+ "git pull" only to pull downstream.
+
+ How to distinguish these situation? There are several hints:
+ - During a "git stash apply", GIT_REFLOG_ACTION is not set. During
+ a "git pull", it is set to 'pull '. During a "git pull --rebase",
+ it is set to 'pull --rebase'. During a "git cherry-pick", it is
+ set to 'cherry-pick'.
+ - During a "git stash apply", there is an environment variable of
+ the form GITHEAD_<40_hex_digits>='Stashed changes'. */
+ {
+ const char *var;
+
+ var = getenv ("GIT_DOWNSTREAM");
+ if (var != NULL && var[0] != '\0')
+ downstream = true;
+ else
+ {
+ var = getenv ("GIT_UPSTREAM");
+ if (var != NULL && var[0] != '\0')
+ downstream = false;
+ else
+ {
+ var = getenv ("GIT_REFLOG_ACTION");
+ #if 0 /* Debugging code */
+ printf ("GIT_REFLOG_ACTION=|%s|\n", var);
+ #endif
+ if (var != NULL
+ && ((strncmp (var, "pull", 4) == 0
+ && c_strstr (var, " --rebase") == NULL)
+ || strncmp (var, "merge origin", 12) == 0))
+ downstream = true;
+ else
+ {
+ /* "git stash apply", "git rebase", "git cherry-pick" and
+ similar. */
+ downstream = false;
+ }
+ }
+ }
+ }
+
+ #if 0 /* Debugging code */
+ {
+ char buf[1000];
+ printf ("First line of %%A:\n");
+ sprintf (buf, "head -1 %s", destination_file_name); system (buf);
+ printf ("First line of %%B:\n");
+ sprintf (buf, "head -1 %s", other_file_name); system (buf);
+ printf ("Guessing calling convention: %s\n",
+ downstream
+ ? "%A = modified by user, %B = upstream"
+ : "%A = upstream, %B = modified by user");
+ }
+ #endif
+
+ if (downstream)
+ {
+ mainstream_file_name = other_file_name;
+ modified_file_name = destination_file_name;
+ }
+ else
+ {
+ mainstream_file_name = destination_file_name;
+ modified_file_name = other_file_name;
+ }
+
+ /* Read the three files into memory. */
+ read_changelog_file (ancestor_file_name, &ancestor_file);
+ read_changelog_file (mainstream_file_name, &mainstream_file);
+ read_changelog_file (modified_file_name, &modified_file);
+
+ /* Compute correspondence between the entries of ancestor_file and of
+ mainstream_file. */
+ compute_mapping (&ancestor_file, &mainstream_file, false, &mapping);
+ (void) entries_mapping_reverse_get; /* avoid gcc "defined but not" warning */
+
+ /* Compute differences between the entries of ancestor_file and of
+ modified_file. */
+ compute_differences (&ancestor_file, &modified_file, &diffs);
+
+ /* Compute the result. */
+ result_entries_pointers =
+ XNMALLOC (mainstream_file.num_entries, gl_list_node_t);
+ result_entries =
+ gl_list_create_empty (GL_LINKED_LIST, entry_equals, entry_hashcode,
+ NULL, true);
+ {
+ size_t k;
+ for (k = 0; k < mainstream_file.num_entries; k++)
+ result_entries_pointers[k] =
+ gl_list_add_last (result_entries, mainstream_file.entries[k]);
+ }
+ result_conflicts =
+ gl_list_create_empty (GL_ARRAY_LIST, NULL, NULL, NULL, true);
+ {
+ size_t e;
+ for (e = 0; e < diffs.num_edits; e++)
+ {
+ struct edit *edit = diffs.edits[e];
+ switch (edit->type)
+ {
+ case ADDITION:
+ if (edit->j1 == 0)
+ {
+ /* An addition to the top of modified_file.
+ Apply it to the top of mainstream_file. */
+ ssize_t j;
+ for (j = edit->j2; j >= edit->j1; j--)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_first (result_entries, added_entry);
+ }
+ }
+ else
+ {
+ ssize_t i_before;
+ ssize_t i_after;
+ ssize_t k_before;
+ ssize_t k_after;
+ i_before = diffs.index_mapping_reverse[edit->j1 - 1];
+ ASSERT (i_before >= 0);
+ i_after = (edit->j2 + 1 == modified_file.num_entries
+ ? ancestor_file.num_entries
+ : diffs.index_mapping_reverse[edit->j2 + 1]);
+ ASSERT (i_after >= 0);
+ ASSERT (i_after == i_before + 1);
+ /* An addition between ancestor_file.entries[i_before] and
+ ancestor_file.entries[i_after]. See whether these two
+ entries still exist in mainstream_file and are still
+ consecutive. */
+ k_before = entries_mapping_get (&mapping, i_before);
+ k_after = (i_after == ancestor_file.num_entries
+ ? mainstream_file.num_entries
+ : entries_mapping_get (&mapping, i_after));
+ if (k_before >= 0 && k_after >= 0 && k_after == k_before + 1)
+ {
+ /* Yes, the entry before and after are still neighbours
+ in mainstream_file. Apply the addition between
+ them. */
+ if (k_after == mainstream_file.num_entries)
+ {
+ size_t j;
+ for (j = edit->j1; j <= edit->j2; j++)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_last (result_entries, added_entry);
+ }
+ }
+ else
+ {
+ gl_list_node_t node_k_after = result_entries_pointers[k_after];
+ size_t j;
+ for (j = edit->j1; j <= edit->j2; j++)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_before (result_entries, node_k_after, added_entry);
+ }
+ }
+ }
+ else
+ {
+ /* It's not clear where the additions should be applied.
+ Let the user decide. */
+ struct conflict *c = XMALLOC (struct conflict);
+ size_t j;
+ c->num_old_entries = 0;
+ c->old_entries = NULL;
+ c->num_modified_entries = edit->j2 - edit->j1 + 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ for (j = edit->j1; j <= edit->j2; j++)
+ c->modified_entries[j - edit->j1] = modified_file.entries[j];
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ break;
+ case REMOVAL:
+ {
+ /* Apply the removals one by one. */
+ size_t i;
+ for (i = edit->i1; i <= edit->i2; i++)
+ {
+ struct entry *removed_entry = ancestor_file.entries[i];
+ ssize_t k = entries_mapping_get (&mapping, i);
+ if (k >= 0
+ && entry_equals (removed_entry,
+ mainstream_file.entries[k]))
+ {
+ /* The entry to be removed still exists in
+ mainstream_file. Remove it. */
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ &empty_entry);
+ }
+ else
+ {
+ /* The entry to be removed was already removed or was
+ modified. This is a conflict. */
+ struct conflict *c = XMALLOC (struct conflict);
+ c->num_old_entries = 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ c->old_entries[0] = removed_entry;
+ c->num_modified_entries = 0;
+ c->modified_entries = NULL;
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ }
+ break;
+ case CHANGE:
+ {
+ bool done = false;
+ /* When the user usually merges entries from the same day,
+ and this edit is at the top of the file: */
+ if (split_merged_entry && edit->j1 == 0)
+ {
+ /* Test whether the change is "simple merged", i.e. whether
+ it consists of additions, followed by an augmentation of
+ the first changed entry, followed by small changes of the
+ remaining entries:
+ entry_1
+ entry_2
+ ...
+ entry_n
+ are mapped to
+ added_entry
+ ...
+ added_entry
+ augmented_entry_1
+ modified_entry_2
+ ...
+ modified_entry_n. */
+ if (edit->i2 - edit->i1 <= edit->j2 - edit->j1)
+ {
+ struct entry *split[2];
+ bool simple_merged =
+ try_split_merged_entry (ancestor_file.entries[edit->i1],
+ modified_file.entries[edit->i1 + edit->j2 - edit->i2],
+ split);
+ if (simple_merged)
+ {
+ size_t i;
+ for (i = edit->i1 + 1; i <= edit->i2; i++)
+ if (entry_fstrcmp (ancestor_file.entries[i],
+ modified_file.entries[i + edit->j2 - edit->i2],
+ FSTRCMP_THRESHOLD)
+ < FSTRCMP_THRESHOLD)
+ {
+ simple_merged = false;
+ break;
+ }
+ }
+ if (simple_merged)
+ {
+ /* Apply the additions at the top of modified_file.
+ Apply each of the single-entry changes
+ separately. */
+ size_t num_changed = edit->i2 - edit->i1 + 1; /* > 0 */
+ size_t num_added = (edit->j2 - edit->j1 + 1) - num_changed;
+ ssize_t j;
+ /* First part of the split modified_file.entries[edit->j2 - edit->i2 + edit->i1]: */
+ gl_list_add_first (result_entries, split[0]);
+ /* The additions. */
+ for (j = edit->j1 + num_added - 1; j >= edit->j1; j--)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_first (result_entries, added_entry);
+ }
+ /* Now the single-entry changes. */
+ for (j = edit->j1 + num_added; j <= edit->j2; j++)
+ {
+ struct entry *changed_entry =
+ (j == edit->j1 + num_added
+ ? split[1]
+ : modified_file.entries[j]);
+ size_t i = j + edit->i2 - edit->j2;
+ ssize_t k = entries_mapping_get (&mapping, i);
+ if (k >= 0
+ && entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[k]))
+ {
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ changed_entry);
+ }
+ else if (!entry_equals (ancestor_file.entries[i],
+ changed_entry))
+ {
+ struct conflict *c = XMALLOC (struct conflict);
+ c->num_old_entries = 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ c->old_entries[0] = ancestor_file.entries[i];
+ c->num_modified_entries = 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ c->modified_entries[0] = changed_entry;
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ done = true;
+ }
+ }
+ }
+ if (!done)
+ {
+ bool simple;
+ /* Test whether the change is "simple", i.e. whether it
+ consists of small changes to the old ChangeLog entries
+ and additions before them:
+ entry_1
+ ...
+ entry_n
+ are mapped to
+ added_entry
+ ...
+ added_entry
+ modified_entry_1
+ ...
+ modified_entry_n. */
+ if (edit->i2 - edit->i1 <= edit->j2 - edit->j1)
+ {
+ size_t i;
+ simple = true;
+ for (i = edit->i1; i <= edit->i2; i++)
+ if (entry_fstrcmp (ancestor_file.entries[i],
+ modified_file.entries[i + edit->j2 - edit->i2],
+ FSTRCMP_THRESHOLD)
+ < FSTRCMP_THRESHOLD)
+ {
+ simple = false;
+ break;
+ }
+ }
+ else
+ simple = false;
+ if (simple)
+ {
+ /* Apply the additions and each of the single-entry
+ changes separately. */
+ size_t num_changed = edit->i2 - edit->i1 + 1; /* > 0 */
+ size_t num_added = (edit->j2 - edit->j1 + 1) - num_changed;
+ if (edit->j1 == 0)
+ {
+ /* A simple change at the top of modified_file.
+ Apply it to the top of mainstream_file. */
+ ssize_t j;
+ for (j = edit->j1 + num_added - 1; j >= edit->j1; j--)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_first (result_entries, added_entry);
+ }
+ for (j = edit->j1 + num_added; j <= edit->j2; j++)
+ {
+ struct entry *changed_entry = modified_file.entries[j];
+ size_t i = j + edit->i2 - edit->j2;
+ ssize_t k = entries_mapping_get (&mapping, i);
+ if (k >= 0
+ && entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[k]))
+ {
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ changed_entry);
+ }
+ else
+ {
+ struct conflict *c;
+ ASSERT (!entry_equals (ancestor_file.entries[i],
+ changed_entry));
+ c = XMALLOC (struct conflict);
+ c->num_old_entries = 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ c->old_entries[0] = ancestor_file.entries[i];
+ c->num_modified_entries = 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ c->modified_entries[0] = changed_entry;
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ done = true;
+ }
+ else
+ {
+ ssize_t i_before;
+ ssize_t k_before;
+ bool linear;
+ i_before = diffs.index_mapping_reverse[edit->j1 - 1];
+ ASSERT (i_before >= 0);
+ /* A simple change after ancestor_file.entries[i_before].
+ See whether this entry and the following num_changed
+ entries still exist in mainstream_file and are still
+ consecutive. */
+ k_before = entries_mapping_get (&mapping, i_before);
+ linear = (k_before >= 0);
+ if (linear)
+ {
+ size_t i;
+ for (i = i_before + 1; i <= i_before + num_changed; i++)
+ if (entries_mapping_get (&mapping, i) != k_before + (i - i_before))
+ {
+ linear = false;
+ break;
+ }
+ }
+ if (linear)
+ {
+ gl_list_node_t node_for_insert =
+ result_entries_pointers[k_before + 1];
+ ssize_t j;
+ for (j = edit->j1 + num_added - 1; j >= edit->j1; j--)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_before (result_entries, node_for_insert, added_entry);
+ }
+ for (j = edit->j1 + num_added; j <= edit->j2; j++)
+ {
+ struct entry *changed_entry = modified_file.entries[j];
+ size_t i = j + edit->i2 - edit->j2;
+ ssize_t k = entries_mapping_get (&mapping, i);
+ ASSERT (k >= 0);
+ if (entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[k]))
+ {
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ changed_entry);
+ }
+ else
+ {
+ struct conflict *c;
+ ASSERT (!entry_equals (ancestor_file.entries[i],
+ changed_entry));
+ c = XMALLOC (struct conflict);
+ c->num_old_entries = 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ c->old_entries[0] = ancestor_file.entries[i];
+ c->num_modified_entries = 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ c->modified_entries[0] = changed_entry;
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ done = true;
+ }
+ }
+ }
+ else
+ {
+ /* A big change.
+ See whether the num_changed entries still exist
+ unchanged in mainstream_file and are still
+ consecutive. */
+ ssize_t i_first;
+ ssize_t k_first;
+ bool linear_unchanged;
+ i_first = edit->i1;
+ k_first = entries_mapping_get (&mapping, i_first);
+ linear_unchanged =
+ (k_first >= 0
+ && entry_equals (ancestor_file.entries[i_first],
+ mainstream_file.entries[k_first]));
+ if (linear_unchanged)
+ {
+ size_t i;
+ for (i = i_first + 1; i <= edit->i2; i++)
+ if (!(entries_mapping_get (&mapping, i) == k_first + (i - i_first)
+ && entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[entries_mapping_get (&mapping, i)])))
+ {
+ linear_unchanged = false;
+ break;
+ }
+ }
+ if (linear_unchanged)
+ {
+ gl_list_node_t node_for_insert =
+ result_entries_pointers[k_first];
+ ssize_t j;
+ size_t i;
+ for (j = edit->j2; j >= edit->j1; j--)
+ {
+ struct entry *new_entry = modified_file.entries[j];
+ gl_list_add_before (result_entries, node_for_insert, new_entry);
+ }
+ for (i = edit->i1; i <= edit->i2; i++)
+ {
+ ssize_t k = entries_mapping_get (&mapping, i);
+ ASSERT (k >= 0);
+ ASSERT (entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[k]));
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ &empty_entry);
+ }
+ done = true;
+ }
+ }
+ }
+ if (!done)
+ {
+ struct conflict *c = XMALLOC (struct conflict);
+ size_t i, j;
+ c->num_old_entries = edit->i2 - edit->i1 + 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ for (i = edit->i1; i <= edit->i2; i++)
+ c->old_entries[i - edit->i1] = ancestor_file.entries[i];
+ c->num_modified_entries = edit->j2 - edit->j1 + 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ for (j = edit->j1; j <= edit->j2; j++)
+ c->modified_entries[j - edit->j1] = modified_file.entries[j];
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ /* Output the result. */
+ {
+ FILE *fp = fopen (destination_file_name, "w");
+ if (fp == NULL)
+ {
+ fprintf (stderr, "could not write file '%s'\n", destination_file_name);
+ exit (EXIT_FAILURE);
+ }
+
+ /* Output the conflicts at the top. */
+ {
+ size_t n = gl_list_size (result_conflicts);
+ size_t i;
+ for (i = 0; i < n; i++)
+ conflict_write (fp, (struct conflict *) gl_list_get_at (result_conflicts, i));
+ }
+ /* Output the modified and unmodified entries, in order. */
+ {
+ gl_list_iterator_t iter = gl_list_iterator (result_entries);
+ const void *elt;
+ gl_list_node_t node;
+ while (gl_list_iterator_next (&iter, &elt, &node))
+ entry_write (fp, (struct entry *) elt);
+ gl_list_iterator_free (&iter);
+ }
+
+ if (fwriteerror (fp))
+ {
+ fprintf (stderr, "error writing to file '%s'\n", destination_file_name);
+ exit (EXIT_FAILURE);
+ }
+ }
+
+ exit (gl_list_size (result_conflicts) > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+ }
+}
diff --git a/gnulib/lib/gl_anyavltree_list1.h b/gnulib/lib/gl_anyavltree_list1.h
new file mode 100644
index 00000000..f34c728e
--- /dev/null
+++ b/gnulib/lib/gl_anyavltree_list1.h
@@ -0,0 +1,70 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_avltree_list.c and gl_avltreehash_list.c. */
+
+/* An AVL tree is a binary tree where
+ 1. The height of each node is calculated as
+ heightof(node) = 1 + max (heightof(node.left), heightof(node.right)).
+ 2. The heights of the subtrees of each node differ by at most 1:
+ | heightof(right) - heightof(left) | <= 1.
+ 3. The index of the elements in the node.left subtree are smaller than
+ the index of node.
+ The index of the elements in the node.right subtree are larger than
+ the index of node.
+ */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete list node implementation, valid for this file only. */
+struct gl_list_node_impl
+{
+#if WITH_HASHTABLE
+ struct gl_hash_entry h; /* hash table entry fields; must be first */
+#endif
+ struct gl_list_node_impl *left; /* left branch, or NULL */
+ struct gl_list_node_impl *right; /* right branch, or NULL */
+ /* Parent pointer, or NULL. The parent pointer is not needed for most
+ operations. It is needed so that a gl_list_node_t can be returned
+ without memory allocation, on which the functions gl_list_remove_node,
+ gl_list_add_before, gl_list_add_after can be implemented. */
+ struct gl_list_node_impl *parent;
+ int balance; /* heightof(right) - heightof(left),
+ always = -1 or 0 or 1 */
+ size_t branch_size; /* number of nodes in this branch,
+ = branchsize(left)+branchsize(right)+1 */
+ const void *value;
+};
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+#if WITH_HASHTABLE
+ /* A hash table: managed as an array of collision lists. */
+ struct gl_hash_entry **table;
+ size_t table_size;
+#endif
+ struct gl_list_node_impl *root; /* root node or NULL */
+};
+
+/* An AVL tree of height h has at least F_(h+2) [Fibonacci number] and at most
+ 2^h - 1 elements. So, h <= 84 (because a tree of height h >= 85 would have
+ at least F_87 elements, and because even on 64-bit machines,
+ sizeof (gl_list_node_impl) * F_87 > 2^64
+ this would exceed the address space of the machine. */
+#define MAXHEIGHT 83
diff --git a/gnulib/lib/gl_anyavltree_list2.h b/gnulib/lib/gl_anyavltree_list2.h
new file mode 100644
index 00000000..1c12f9cc
--- /dev/null
+++ b/gnulib/lib/gl_anyavltree_list2.h
@@ -0,0 +1,809 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_avltree_list.c and gl_avltreehash_list.c. */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Create a subtree for count >= 1 elements.
+ Its height is h where 2^(h-1) <= count <= 2^h - 1.
+ Return NULL upon out-of-memory. */
+static gl_list_node_t
+create_subtree_with_contents (size_t count, const void **contents)
+{
+ size_t half1 = (count - 1) / 2;
+ size_t half2 = count / 2;
+ /* Note: half1 + half2 = count - 1. */
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (node == NULL)
+ return NULL;
+
+ if (half1 > 0)
+ {
+ node->left = create_subtree_with_contents (half1, contents);
+ if (node->left == NULL)
+ goto fail1;
+ node->left->parent = node;
+ }
+ else
+ node->left = NULL;
+
+ node->value = contents[half1];
+
+ if (half2 > 0)
+ {
+ node->right = create_subtree_with_contents (half2, contents + half1 + 1);
+ if (node->right == NULL)
+ goto fail2;
+ node->right->parent = node;
+ }
+ else
+ node->right = NULL;
+
+ /* balance is 0, except when count is a power of two and > 1.
+ Reason: half1 <= half2 <= half1 + 1, and the two branches can have
+ different heights only if half1 = 2^h - 1 and half2 = 2^h; in this
+ case, count = half1 + half2 + 1 = 2^(h+1). */
+ node->balance = (count > 1 && (count & (count - 1)) == 0 ? 1 : 0);
+
+ node->branch_size = count;
+
+ return node;
+
+ fail2:
+ if (node->left != NULL)
+ free_subtree (node->left);
+ fail1:
+ free (node);
+ return NULL;
+}
+
+static gl_list_t
+gl_tree_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ {
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate < 10)
+ estimate = 10;
+ list->table_size = next_prime (estimate);
+ if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t))))
+ goto fail1;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail1;
+ }
+#endif
+ if (count > 0)
+ {
+ list->root = create_subtree_with_contents (count, contents);
+ if (list->root == NULL)
+ goto fail2;
+ list->root->parent = NULL;
+
+#if WITH_HASHTABLE
+ /* Now that the tree is built, node_position() works. Now we can
+ add the nodes to the hash table. */
+ if (add_nodes_to_buckets (list) < 0)
+ goto fail3;
+#endif
+ }
+ else
+ list->root = NULL;
+
+ return list;
+
+#if WITH_HASHTABLE
+ fail3:
+ free_subtree (list->root);
+#endif
+ fail2:
+#if WITH_HASHTABLE
+ free (list->table);
+ fail1:
+#endif
+ free (list);
+ return NULL;
+}
+
+/* Ensure the tree is balanced, after an insertion or deletion operation.
+ The height of NODE is incremented by HEIGHT_DIFF (1 or -1).
+ PARENT = NODE->parent. (NODE can also be NULL. But PARENT is non-NULL.)
+ Rotation operations are performed starting at PARENT (not NODE itself!). */
+static void
+rebalance (gl_list_t list,
+ gl_list_node_t node, int height_diff, gl_list_node_t parent)
+{
+ for (;;)
+ {
+ gl_list_node_t child;
+ int previous_balance;
+ int balance_diff;
+ gl_list_node_t nodeleft;
+ gl_list_node_t noderight;
+
+ child = node;
+ node = parent;
+
+ previous_balance = node->balance;
+
+ /* The balance of NODE is incremented by BALANCE_DIFF: +1 if the right
+ branch's height has increased by 1 or the left branch's height has
+ decreased by 1, -1 if the right branch's height has decreased by 1 or
+ the left branch's height has increased by 1, 0 if no height change. */
+ if (node->left != NULL || node->right != NULL)
+ balance_diff = (child == node->right ? height_diff : -height_diff);
+ else
+ /* Special case where above formula doesn't work, because the caller
+ didn't tell whether node's left or right branch shrunk from height 1
+ to NULL. */
+ balance_diff = - previous_balance;
+
+ node->balance += balance_diff;
+ if (balance_diff == previous_balance)
+ {
+ /* node->balance is outside the range [-1,1]. Must rotate. */
+ gl_list_node_t *nodep;
+
+ if (node->parent == NULL)
+ /* node == list->root */
+ nodep = &list->root;
+ else if (node->parent->left == node)
+ nodep = &node->parent->left;
+ else if (node->parent->right == node)
+ nodep = &node->parent->right;
+ else
+ abort ();
+
+ nodeleft = node->left;
+ noderight = node->right;
+
+ if (balance_diff < 0)
+ {
+ /* node->balance = -2. The subtree is heavier on the left side.
+ Rotate from left to right:
+
+ *
+ / \
+ h+2 h
+ */
+ gl_list_node_t nodeleftleft = nodeleft->left;
+ gl_list_node_t nodeleftright = nodeleft->right;
+ if (nodeleft->balance <= 0)
+ {
+ /*
+ * h+2|h+3
+ / \ / \
+ h+2 h --> / h+1|h+2
+ / \ | / \
+ h+1 h|h+1 h+1 h|h+1 h
+ */
+ node->left = nodeleftright;
+ nodeleft->right = node;
+
+ nodeleft->parent = node->parent;
+ node->parent = nodeleft;
+ if (nodeleftright != NULL)
+ nodeleftright->parent = node;
+
+ nodeleft->balance += 1;
+ node->balance = - nodeleft->balance;
+
+ node->branch_size =
+ (nodeleftright != NULL ? nodeleftright->branch_size : 0)
+ + 1 + (noderight != NULL ? noderight->branch_size : 0);
+ nodeleft->branch_size =
+ nodeleftleft->branch_size + 1 + node->branch_size;
+
+ *nodep = nodeleft;
+ height_diff = (height_diff < 0
+ ? /* noderight's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2|h+3. */
+ nodeleft->balance - 1
+ : /* nodeleft's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2|h+3. */
+ nodeleft->balance);
+ }
+ else
+ {
+ /*
+ * h+2
+ / \ / \
+ h+2 h --> h+1 h+1
+ / \ / \ / \
+ h h+1 h L R h
+ / \
+ L R
+
+ */
+ gl_list_node_t L = nodeleft->right = nodeleftright->left;
+ gl_list_node_t R = node->left = nodeleftright->right;
+ nodeleftright->left = nodeleft;
+ nodeleftright->right = node;
+
+ nodeleftright->parent = node->parent;
+ if (L != NULL)
+ L->parent = nodeleft;
+ if (R != NULL)
+ R->parent = node;
+ nodeleft->parent = nodeleftright;
+ node->parent = nodeleftright;
+
+ nodeleft->balance = (nodeleftright->balance > 0 ? -1 : 0);
+ node->balance = (nodeleftright->balance < 0 ? 1 : 0);
+ nodeleftright->balance = 0;
+
+ nodeleft->branch_size =
+ (nodeleft->left != NULL ? nodeleft->left->branch_size : 0)
+ + 1 + (nodeleft->right != NULL ? nodeleft->right->branch_size : 0);
+ node->branch_size =
+ (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0);
+ nodeleftright->branch_size =
+ nodeleft->branch_size + 1 + node->branch_size;
+
+ *nodep = nodeleftright;
+ height_diff = (height_diff < 0
+ ? /* noderight's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2. */
+ -1
+ : /* nodeleft's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2. */
+ 0);
+ }
+ }
+ else
+ {
+ /* node->balance = 2. The subtree is heavier on the right side.
+ Rotate from right to left:
+
+ *
+ / \
+ h h+2
+ */
+ gl_list_node_t noderightleft = noderight->left;
+ gl_list_node_t noderightright = noderight->right;
+ if (noderight->balance >= 0)
+ {
+ /*
+ * h+2|h+3
+ / \ / \
+ h h+2 --> h+1|h+2 \
+ / \ / \ |
+ h|h+1 h+1 h h|h+1 h+1
+ */
+ node->right = noderightleft;
+ noderight->left = node;
+
+ noderight->parent = node->parent;
+ node->parent = noderight;
+ if (noderightleft != NULL)
+ noderightleft->parent = node;
+
+ noderight->balance -= 1;
+ node->balance = - noderight->balance;
+
+ node->branch_size =
+ (nodeleft != NULL ? nodeleft->branch_size : 0)
+ + 1 + (noderightleft != NULL ? noderightleft->branch_size : 0);
+ noderight->branch_size =
+ node->branch_size + 1 + noderightright->branch_size;
+
+ *nodep = noderight;
+ height_diff = (height_diff < 0
+ ? /* nodeleft's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2|h+3. */
+ - noderight->balance - 1
+ : /* noderight's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2|h+3. */
+ - noderight->balance);
+ }
+ else
+ {
+ /*
+ * h+2
+ / \ / \
+ h h+2 --> h+1 h+1
+ / \ / \ / \
+ h+1 h h L R h
+ / \
+ L R
+
+ */
+ gl_list_node_t L = node->right = noderightleft->left;
+ gl_list_node_t R = noderight->left = noderightleft->right;
+ noderightleft->left = node;
+ noderightleft->right = noderight;
+
+ noderightleft->parent = node->parent;
+ if (L != NULL)
+ L->parent = node;
+ if (R != NULL)
+ R->parent = noderight;
+ node->parent = noderightleft;
+ noderight->parent = noderightleft;
+
+ node->balance = (noderightleft->balance > 0 ? -1 : 0);
+ noderight->balance = (noderightleft->balance < 0 ? 1 : 0);
+ noderightleft->balance = 0;
+
+ node->branch_size =
+ (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0);
+ noderight->branch_size =
+ (noderight->left != NULL ? noderight->left->branch_size : 0)
+ + 1 + (noderight->right != NULL ? noderight->right->branch_size : 0);
+ noderightleft->branch_size =
+ node->branch_size + 1 + noderight->branch_size;
+
+ *nodep = noderightleft;
+ height_diff = (height_diff < 0
+ ? /* nodeleft's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2. */
+ -1
+ : /* noderight's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2. */
+ 0);
+ }
+ }
+ node = *nodep;
+ }
+ else
+ {
+ /* No rotation needed. Only propagation of the height change to the
+ next higher level. */
+ if (height_diff < 0)
+ height_diff = (previous_balance == 0 ? 0 : -1);
+ else
+ height_diff = (node->balance == 0 ? 0 : 1);
+ }
+
+ if (height_diff == 0)
+ break;
+
+ parent = node->parent;
+ if (parent == NULL)
+ break;
+ }
+}
+
+static void
+gl_tree_remove_node_from_tree (gl_list_t list, gl_list_node_t node)
+{
+ gl_list_node_t parent = node->parent;
+
+ if (node->left == NULL)
+ {
+ /* Replace node with node->right. */
+ gl_list_node_t child = node->right;
+
+ if (child != NULL)
+ child->parent = parent;
+ if (parent == NULL)
+ list->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ rebalance (list, child, -1, parent);
+ }
+ }
+ else if (node->right == NULL)
+ {
+ /* It is not absolutely necessary to treat this case. But the more
+ general case below is more complicated, hence slower. */
+ /* Replace node with node->left. */
+ gl_list_node_t child = node->left;
+
+ child->parent = parent;
+ if (parent == NULL)
+ list->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ rebalance (list, child, -1, parent);
+ }
+ }
+ else
+ {
+ /* Replace node with the rightmost element of the node->left subtree. */
+ gl_list_node_t subst;
+ gl_list_node_t subst_parent;
+ gl_list_node_t child;
+
+ for (subst = node->left; subst->right != NULL; )
+ subst = subst->right;
+
+ subst_parent = subst->parent;
+
+ child = subst->left;
+
+ /* The case subst_parent == node is special: If we do nothing special,
+ we get confusion about node->left, subst->left and child->parent.
+ subst_parent == node
+ <==> The 'for' loop above terminated immediately.
+ <==> subst == subst_parent->left
+ [otherwise subst == subst_parent->right]
+ In this case, we would need to first set
+ child->parent = node; node->left = child;
+ and later - when we copy subst into node's position - again
+ child->parent = subst; subst->left = child;
+ Altogether a no-op. */
+ if (subst_parent != node)
+ {
+ if (child != NULL)
+ child->parent = subst_parent;
+ subst_parent->right = child;
+ }
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = subst_parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ /* Copy subst into node's position.
+ (This is safer than to copy subst's value into node, keep node in
+ place, and free subst.) */
+ if (subst_parent != node)
+ {
+ subst->left = node->left;
+ subst->left->parent = subst;
+ }
+ subst->right = node->right;
+ subst->right->parent = subst;
+ subst->balance = node->balance;
+ subst->branch_size = node->branch_size;
+ subst->parent = parent;
+ if (parent == NULL)
+ list->root = subst;
+ else if (parent->left == node)
+ parent->left = subst;
+ else /* parent->right == node */
+ parent->right = subst;
+
+ /* Rebalancing starts at child's parent, that is subst_parent -
+ except when subst_parent == node. In this case, we need to use
+ its replacement, subst. */
+ rebalance (list, child, -1, subst_parent != node ? subst_parent : subst);
+ }
+}
+
+static gl_list_node_t
+gl_tree_nx_add_first (gl_list_t list, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (list->root == NULL)
+ {
+ list->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ for (node = list->root; node->left != NULL; )
+ node = node->left;
+
+ node->left = new_node;
+ new_node->parent = node;
+ node->balance--;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Rebalance. */
+ if (node->right == NULL && node->parent != NULL)
+ rebalance (list, node, 1, node->parent);
+ }
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_last (gl_list_t list, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (list->root == NULL)
+ {
+ list->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ for (node = list->root; node->right != NULL; )
+ node = node->right;
+
+ node->right = new_node;
+ new_node->parent = node;
+ node->balance++;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Rebalance. */
+ if (node->left == NULL && node->parent != NULL)
+ rebalance (list, node, 1, node->parent);
+ }
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node;
+ bool height_inc;
+
+ new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (node->left == NULL)
+ {
+ node->left = new_node;
+ node->balance--;
+ height_inc = (node->right == NULL);
+ }
+ else
+ {
+ for (node = node->left; node->right != NULL; )
+ node = node->right;
+ node->right = new_node;
+ node->balance++;
+ height_inc = (node->left == NULL);
+ }
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Rebalance. */
+ if (height_inc && node->parent != NULL)
+ rebalance (list, node, 1, node->parent);
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node;
+ bool height_inc;
+
+ new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (node->right == NULL)
+ {
+ node->right = new_node;
+ node->balance++;
+ height_inc = (node->left == NULL);
+ }
+ else
+ {
+ for (node = node->right; node->left != NULL; )
+ node = node->left;
+ node->left = new_node;
+ node->balance--;
+ height_inc = (node->right == NULL);
+ }
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Rebalance. */
+ if (height_inc && node->parent != NULL)
+ rebalance (list, node, 1, node->parent);
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
diff --git a/gnulib/lib/gl_anyhash_list1.h b/gnulib/lib/gl_anyhash_list1.h
new file mode 100644
index 00000000..4e4c91bd
--- /dev/null
+++ b/gnulib/lib/gl_anyhash_list1.h
@@ -0,0 +1,27 @@
+/* Sequential list data type implemented by a hash table with another list.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of
+ gl_linkedhash_list.c, gl_avltreehash_list.c, gl_rbtreehash_list.c. */
+
+/* Hash table entry. */
+struct gl_hash_entry
+{
+ struct gl_hash_entry *hash_next; /* chain of entries in same bucket */
+ size_t hashcode; /* cache of values' common hash code */
+};
+typedef struct gl_hash_entry * gl_hash_entry_t;
diff --git a/gnulib/lib/gl_anyhash_list2.h b/gnulib/lib/gl_anyhash_list2.h
new file mode 100644
index 00000000..43135815
--- /dev/null
+++ b/gnulib/lib/gl_anyhash_list2.h
@@ -0,0 +1,138 @@
+/* Sequential list data type implemented by a hash table with another list.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of
+ gl_linkedhash_list.c, gl_avltreehash_list.c, gl_rbtreehash_list.c. */
+
+/* Array of primes, approximately in steps of factor 1.2.
+ This table was computed by executing the Common Lisp expression
+ (dotimes (i 244) (format t "nextprime(~D)~%" (ceiling (expt 1.2d0 i))))
+ and feeding the result to PARI/gp. */
+static const size_t primes[] =
+ {
+ 11, 13, 17, 19, 23, 29, 37, 41, 47, 59, 67, 83, 97, 127, 139, 167, 199,
+ 239, 293, 347, 419, 499, 593, 709, 853, 1021, 1229, 1471, 1777, 2129, 2543,
+ 3049, 3659, 4391, 5273, 6323, 7589, 9103, 10937, 13109, 15727, 18899,
+ 22651, 27179, 32609, 39133, 46957, 56359, 67619, 81157, 97369, 116849,
+ 140221, 168253, 201907, 242309, 290761, 348889, 418667, 502409, 602887,
+ 723467, 868151, 1041779, 1250141, 1500181, 1800191, 2160233, 2592277,
+ 3110741, 3732887, 4479463, 5375371, 6450413, 7740517, 9288589, 11146307,
+ 13375573, 16050689, 19260817, 23112977, 27735583, 33282701, 39939233,
+ 47927081, 57512503, 69014987, 82818011, 99381577, 119257891, 143109469,
+ 171731387, 206077643, 247293161, 296751781, 356102141, 427322587,
+ 512787097, 615344489, 738413383, 886096061, 1063315271, 1275978331,
+ 1531174013, 1837408799, 2204890543UL, 2645868653UL, 3175042391UL,
+ 3810050851UL,
+#if SIZE_MAX > 4294967295UL
+ 4572061027UL, 5486473229UL, 6583767889UL, 7900521449UL, 9480625733UL,
+ 11376750877UL, 13652101063UL, 16382521261UL, 19659025513UL, 23590830631UL,
+ 28308996763UL, 33970796089UL, 40764955463UL, 48917946377UL, 58701535657UL,
+ 70441842749UL, 84530211301UL, 101436253561UL, 121723504277UL,
+ 146068205131UL, 175281846149UL, 210338215379UL, 252405858521UL,
+ 302887030151UL, 363464436191UL, 436157323417UL, 523388788231UL,
+ 628066545713UL, 753679854847UL, 904415825857UL, 1085298991109UL,
+ 1302358789181UL, 1562830547009UL, 1875396656429UL, 2250475987709UL,
+ 2700571185239UL, 3240685422287UL, 3888822506759UL, 4666587008147UL,
+ 5599904409713UL, 6719885291641UL, 8063862349969UL, 9676634819959UL,
+ 11611961783951UL, 13934354140769UL, 16721224968907UL, 20065469962669UL,
+ 24078563955191UL, 28894276746229UL, 34673132095507UL, 41607758514593UL,
+ 49929310217531UL, 59915172260971UL, 71898206713183UL, 86277848055823UL,
+ 103533417666967UL, 124240101200359UL, 149088121440451UL, 178905745728529UL,
+ 214686894874223UL, 257624273849081UL, 309149128618903UL, 370978954342639UL,
+ 445174745211143UL, 534209694253381UL, 641051633104063UL, 769261959724877UL,
+ 923114351670013UL, 1107737222003791UL, 1329284666404567UL,
+ 1595141599685509UL, 1914169919622551UL, 2297003903547091UL,
+ 2756404684256459UL, 3307685621107757UL, 3969222745329323UL,
+ 4763067294395177UL, 5715680753274209UL, 6858816903929113UL,
+ 8230580284714831UL, 9876696341657791UL, 11852035609989371UL,
+ 14222442731987227UL, 17066931278384657UL, 20480317534061597UL,
+ 24576381040873903UL, 29491657249048679UL, 35389988698858471UL,
+ 42467986438630267UL, 50961583726356109UL, 61153900471627387UL,
+ 73384680565952851UL, 88061616679143347UL, 105673940014972061UL,
+ 126808728017966413UL, 152170473621559703UL, 182604568345871671UL,
+ 219125482015045997UL, 262950578418055169UL, 315540694101666193UL,
+ 378648832921999397UL, 454378599506399233UL, 545254319407679131UL,
+ 654305183289214771UL, 785166219947057701UL, 942199463936469157UL,
+ 1130639356723763129UL, 1356767228068515623UL, 1628120673682218619UL,
+ 1953744808418662409UL, 2344493770102394881UL, 2813392524122873857UL,
+ 3376071028947448339UL, 4051285234736937517UL, 4861542281684325481UL,
+ 5833850738021191727UL, 7000620885625427969UL, 8400745062750513217UL,
+ 10080894075300616261UL, 12097072890360739951UL, 14516487468432885797UL,
+ 17419784962119465179UL,
+#endif
+ SIZE_MAX /* sentinel, to ensure the search terminates */
+ };
+
+/* Return a suitable prime >= ESTIMATE. */
+static size_t
+next_prime (size_t estimate)
+{
+ size_t i;
+
+ for (i = 0; i < sizeof (primes) / sizeof (primes[0]); i++)
+ if (primes[i] >= estimate)
+ return primes[i];
+ return SIZE_MAX; /* not a prime, but better than nothing */
+}
+
+/* Resize the hash table with a new estimated size. */
+static void
+hash_resize (gl_list_t list, size_t estimate)
+{
+ size_t new_size = next_prime (estimate);
+
+ if (new_size > list->table_size)
+ {
+ gl_hash_entry_t *old_table = list->table;
+ /* Allocate the new table. */
+ gl_hash_entry_t *new_table;
+ size_t i;
+
+ if (size_overflow_p (xtimes (new_size, sizeof (gl_hash_entry_t))))
+ goto fail;
+ new_table =
+ (gl_hash_entry_t *) calloc (new_size, sizeof (gl_hash_entry_t));
+ if (new_table == NULL)
+ goto fail;
+
+ /* Iterate through the entries of the old table. */
+ for (i = list->table_size; i > 0; )
+ {
+ gl_hash_entry_t node = old_table[--i];
+
+ while (node != NULL)
+ {
+ gl_hash_entry_t next = node->hash_next;
+ /* Add the entry to the new table. */
+ size_t bucket = node->hashcode % new_size;
+ node->hash_next = new_table[bucket];
+ new_table[bucket] = node;
+
+ node = next;
+ }
+ }
+
+ list->table = new_table;
+ list->table_size = new_size;
+ free (old_table);
+ }
+ return;
+
+ fail:
+ /* Just continue without resizing the table. */
+ return;
+}
diff --git a/gnulib/lib/gl_anylinked_list1.h b/gnulib/lib/gl_anylinked_list1.h
new file mode 100644
index 00000000..121fc826
--- /dev/null
+++ b/gnulib/lib/gl_anylinked_list1.h
@@ -0,0 +1,48 @@
+/* Sequential list data type implemented by a linked list.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_linked_list.c and gl_linkedhash_list.c. */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete list node implementation, valid for this file only. */
+struct gl_list_node_impl
+{
+#if WITH_HASHTABLE
+ struct gl_hash_entry h; /* hash table entry fields; must be first */
+#endif
+ struct gl_list_node_impl *next;
+ struct gl_list_node_impl *prev;
+ const void *value;
+};
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+#if WITH_HASHTABLE
+ /* A hash table: managed as an array of collision lists. */
+ struct gl_hash_entry **table;
+ size_t table_size;
+#endif
+ /* A circular list anchored at root.
+ The first node is = root.next, the last node is = root.prev.
+ The root's value is unused. */
+ struct gl_list_node_impl root;
+ /* Number of list nodes, excluding the root. */
+ size_t count;
+};
diff --git a/gnulib/lib/gl_anylinked_list2.h b/gnulib/lib/gl_anylinked_list2.h
new file mode 100644
index 00000000..770ce8cb
--- /dev/null
+++ b/gnulib/lib/gl_anylinked_list2.h
@@ -0,0 +1,1195 @@
+/* Sequential list data type implemented by a linked list.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_linked_list.c and gl_linkedhash_list.c. */
+
+/* If the symbol SIGNAL_SAFE_LIST is defined, the code is compiled in such
+ a way that a gl_list_t data structure may be used from within a signal
+ handler. The operations allowed in the signal handler are:
+ gl_list_iterator, gl_list_iterator_next, gl_list_iterator_free.
+ The list and node fields that are therefore accessed from the signal handler
+ are:
+ list->root, node->next, node->value.
+ We are careful to make modifications to these fields only in an order
+ that maintains the consistency of the list data structure at any moment,
+ and we use 'volatile' assignments to prevent the compiler from reordering
+ such assignments. */
+#ifdef SIGNAL_SAFE_LIST
+# define ASYNCSAFE(type) *(volatile type *)&
+#else
+# define ASYNCSAFE(type)
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+static gl_list_t
+gl_linked_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ list->table_size = 11;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail;
+#endif
+ list->root.next = &list->root;
+ list->root.prev = &list->root;
+ list->count = 0;
+
+ return list;
+
+#if WITH_HASHTABLE
+ fail:
+ free (list);
+ return NULL;
+#endif
+}
+
+static gl_list_t
+gl_linked_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+ gl_list_node_t tail;
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ {
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate < 10)
+ estimate = 10;
+ list->table_size = next_prime (estimate);
+ if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t))))
+ goto fail1;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail1;
+ }
+#endif
+ list->count = count;
+ tail = &list->root;
+ for (; count > 0; contents++, count--)
+ {
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (node == NULL)
+ goto fail2;
+
+ node->value = *contents;
+#if WITH_HASHTABLE
+ node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (node->value)
+ : (size_t)(uintptr_t) node->value);
+
+ /* Add node to the hash table. */
+ if (add_to_bucket (list, node) < 0)
+ {
+ free (node);
+ goto fail2;
+ }
+#endif
+
+ /* Add node to the list. */
+ node->prev = tail;
+ tail->next = node;
+ tail = node;
+ }
+ tail->next = &list->root;
+ list->root.prev = tail;
+
+ return list;
+
+ fail2:
+ {
+ gl_list_node_t node;
+
+ for (node = tail; node != &list->root; )
+ {
+ gl_list_node_t prev = node->prev;
+
+ free (node);
+ node = prev;
+ }
+ }
+#if WITH_HASHTABLE
+ free (list->table);
+ fail1:
+#endif
+ free (list);
+ return NULL;
+}
+
+static size_t
+gl_linked_size (gl_list_t list)
+{
+ return list->count;
+}
+
+static const void *
+gl_linked_node_value (gl_list_t list, gl_list_node_t node)
+{
+ return node->value;
+}
+
+static int
+gl_linked_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+#if WITH_HASHTABLE
+ if (elt != node->value)
+ {
+ size_t new_hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+
+ if (new_hashcode != node->h.hashcode)
+ {
+ remove_from_bucket (list, node);
+ node->value = elt;
+ node->h.hashcode = new_hashcode;
+ if (add_to_bucket (list, node) < 0)
+ {
+ /* Out of memory. We removed node from a bucket but cannot add
+ it to another bucket. In order to avoid inconsistencies, we
+ must remove node entirely from the list. */
+ gl_list_node_t before_removed = node->prev;
+ gl_list_node_t after_removed = node->next;
+ ASYNCSAFE(gl_list_node_t) before_removed->next = after_removed;
+ after_removed->prev = before_removed;
+ list->count--;
+ free (node);
+ return -1;
+ }
+ }
+ else
+ node->value = elt;
+ }
+#else
+ node->value = elt;
+#endif
+ return 0;
+}
+
+static gl_list_node_t
+gl_linked_next_node (gl_list_t list, gl_list_node_t node)
+{
+ return (node->next != &list->root ? node->next : NULL);
+}
+
+static gl_list_node_t
+gl_linked_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ return (node->prev != &list->root ? node->prev : NULL);
+}
+
+static const void *
+gl_linked_get_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ gl_list_node_t node;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ /* Here we know count > 0. */
+ if (position <= ((count - 1) / 2))
+ {
+ node = list->root.next;
+ for (; position > 0; position--)
+ node = node->next;
+ }
+ else
+ {
+ position = count - 1 - position;
+ node = list->root.prev;
+ for (; position > 0; position--)
+ node = node->prev;
+ }
+ return node->value;
+}
+
+static gl_list_node_t
+gl_linked_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ gl_list_node_t node;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ /* Here we know count > 0. */
+ if (position <= ((count - 1) / 2))
+ {
+ node = list->root.next;
+ for (; position > 0; position--)
+ node = node->next;
+ }
+ else
+ {
+ position = count - 1 - position;
+ node = list->root.prev;
+ for (; position > 0; position--)
+ node = node->prev;
+ }
+#if WITH_HASHTABLE
+ if (elt != node->value)
+ {
+ size_t new_hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+
+ if (new_hashcode != node->h.hashcode)
+ {
+ remove_from_bucket (list, node);
+ node->value = elt;
+ node->h.hashcode = new_hashcode;
+ if (add_to_bucket (list, node) < 0)
+ {
+ /* Out of memory. We removed node from a bucket but cannot add
+ it to another bucket. In order to avoid inconsistencies, we
+ must remove node entirely from the list. */
+ gl_list_node_t before_removed = node->prev;
+ gl_list_node_t after_removed = node->next;
+ ASYNCSAFE(gl_list_node_t) before_removed->next = after_removed;
+ after_removed->prev = before_removed;
+ list->count--;
+ free (node);
+ return NULL;
+ }
+ }
+ else
+ node->value = elt;
+ }
+#else
+ node->value = elt;
+#endif
+ return node;
+}
+
+static gl_list_node_t
+gl_linked_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+ {
+#if WITH_HASHTABLE
+ size_t hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+ size_t bucket = hashcode % list->table_size;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+
+ if (!list->base.allow_duplicates)
+ {
+ /* Look for the first match in the hash bucket. */
+ gl_list_node_t found = NULL;
+ gl_list_node_t node;
+
+ for (node = (gl_list_node_t) list->table[bucket];
+ node != NULL;
+ node = (gl_list_node_t) node->h.hash_next)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ {
+ found = node;
+ break;
+ }
+ if (start_index > 0)
+ /* Look whether found's index is < start_index. */
+ for (node = list->root.next; ; node = node->next)
+ {
+ if (node == found)
+ return NULL;
+ if (--start_index == 0)
+ break;
+ }
+ if (end_index < count)
+ /* Look whether found's index is >= end_index. */
+ {
+ end_index = count - end_index;
+ for (node = list->root.prev; ; node = node->prev)
+ {
+ if (node == found)
+ return NULL;
+ if (--end_index == 0)
+ break;
+ }
+ }
+ return found;
+ }
+ else
+ {
+ /* Look whether there is more than one match in the hash bucket. */
+ bool multiple_matches = false;
+ gl_list_node_t first_match = NULL;
+ gl_list_node_t node;
+
+ for (node = (gl_list_node_t) list->table[bucket];
+ node != NULL;
+ node = (gl_list_node_t) node->h.hash_next)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ {
+ if (first_match == NULL)
+ first_match = node;
+ else
+ {
+ multiple_matches = true;
+ break;
+ }
+ }
+ if (multiple_matches)
+ {
+ /* We need the match with the smallest index. But we don't have
+ a fast mapping node -> index. So we have to walk the list. */
+ end_index -= start_index;
+ node = list->root.next;
+ for (; start_index > 0; start_index--)
+ node = node->next;
+
+ for (;
+ end_index > 0;
+ node = node->next, end_index--)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ return node;
+ /* The matches must have all been at indices < start_index or
+ >= end_index. */
+ return NULL;
+ }
+ else
+ {
+ if (start_index > 0)
+ /* Look whether first_match's index is < start_index. */
+ for (node = list->root.next; node != &list->root; node = node->next)
+ {
+ if (node == first_match)
+ return NULL;
+ if (--start_index == 0)
+ break;
+ }
+ if (end_index < list->count)
+ /* Look whether first_match's index is >= end_index. */
+ {
+ end_index = list->count - end_index;
+ for (node = list->root.prev; ; node = node->prev)
+ {
+ if (node == first_match)
+ return NULL;
+ if (--end_index == 0)
+ break;
+ }
+ }
+ return first_match;
+ }
+ }
+#else
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_list_node_t node = list->root.next;
+
+ end_index -= start_index;
+ for (; start_index > 0; start_index--)
+ node = node->next;
+
+ if (equals != NULL)
+ {
+ for (; end_index > 0; node = node->next, end_index--)
+ if (equals (elt, node->value))
+ return node;
+ }
+ else
+ {
+ for (; end_index > 0; node = node->next, end_index--)
+ if (elt == node->value)
+ return node;
+ }
+ return NULL;
+#endif
+ }
+}
+
+static size_t
+gl_linked_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+ {
+#if WITH_HASHTABLE
+ /* Here the hash table doesn't help much. It only allows us to minimize
+ the number of equals() calls, by looking up first the node and then
+ its index. */
+ size_t hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+ size_t bucket = hashcode % list->table_size;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_list_node_t node;
+
+ /* First step: Look up the node. */
+ if (!list->base.allow_duplicates)
+ {
+ /* Look for the first match in the hash bucket. */
+ for (node = (gl_list_node_t) list->table[bucket];
+ node != NULL;
+ node = (gl_list_node_t) node->h.hash_next)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ break;
+ }
+ else
+ {
+ /* Look whether there is more than one match in the hash bucket. */
+ bool multiple_matches = false;
+ gl_list_node_t first_match = NULL;
+
+ for (node = (gl_list_node_t) list->table[bucket];
+ node != NULL;
+ node = (gl_list_node_t) node->h.hash_next)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ {
+ if (first_match == NULL)
+ first_match = node;
+ else
+ {
+ multiple_matches = true;
+ break;
+ }
+ }
+ if (multiple_matches)
+ {
+ /* We need the match with the smallest index. But we don't have
+ a fast mapping node -> index. So we have to walk the list. */
+ size_t index;
+
+ index = start_index;
+ node = list->root.next;
+ for (; start_index > 0; start_index--)
+ node = node->next;
+
+ for (;
+ index < end_index;
+ node = node->next, index++)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ return index;
+ /* The matches must have all been at indices < start_index or
+ >= end_index. */
+ return (size_t)(-1);
+ }
+ node = first_match;
+ }
+
+ /* Second step: Look up the index of the node. */
+ if (node == NULL)
+ return (size_t)(-1);
+ else
+ {
+ size_t index = 0;
+
+ for (; node->prev != &list->root; node = node->prev)
+ index++;
+
+ if (index >= start_index && index < end_index)
+ return index;
+ else
+ return (size_t)(-1);
+ }
+#else
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ size_t index = start_index;
+ gl_list_node_t node = list->root.next;
+
+ for (; start_index > 0; start_index--)
+ node = node->next;
+
+ if (equals != NULL)
+ {
+ for (;
+ index < end_index;
+ node = node->next, index++)
+ if (equals (elt, node->value))
+ return index;
+ }
+ else
+ {
+ for (;
+ index < end_index;
+ node = node->next, index++)
+ if (elt == node->value)
+ return index;
+ }
+ return (size_t)(-1);
+#endif
+ }
+}
+
+static gl_list_node_t
+gl_linked_nx_add_first (gl_list_t list, const void *elt)
+{
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) node->value = elt;
+#if WITH_HASHTABLE
+ node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (node->value)
+ : (size_t)(uintptr_t) node->value);
+
+ /* Add node to the hash table. */
+ if (add_to_bucket (list, node) < 0)
+ {
+ free (node);
+ return NULL;
+ }
+#endif
+
+ /* Add node to the list. */
+ node->prev = &list->root;
+ ASYNCSAFE(gl_list_node_t) node->next = list->root.next;
+ node->next->prev = node;
+ ASYNCSAFE(gl_list_node_t) list->root.next = node;
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_last (gl_list_t list, const void *elt)
+{
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) node->value = elt;
+#if WITH_HASHTABLE
+ node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (node->value)
+ : (size_t)(uintptr_t) node->value);
+
+ /* Add node to the hash table. */
+ if (add_to_bucket (list, node) < 0)
+ {
+ free (node);
+ return NULL;
+ }
+#endif
+
+ /* Add node to the list. */
+ ASYNCSAFE(gl_list_node_t) node->next = &list->root;
+ node->prev = list->root.prev;
+ ASYNCSAFE(gl_list_node_t) node->prev->next = node;
+ list->root.prev = node;
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+
+ /* Add new_node to the hash table. */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ free (new_node);
+ return NULL;
+ }
+#endif
+
+ /* Add new_node to the list. */
+ ASYNCSAFE(gl_list_node_t) new_node->next = node;
+ new_node->prev = node->prev;
+ ASYNCSAFE(gl_list_node_t) new_node->prev->next = new_node;
+ node->prev = new_node;
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+
+ /* Add new_node to the hash table. */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ free (new_node);
+ return NULL;
+ }
+#endif
+
+ /* Add new_node to the list. */
+ new_node->prev = node;
+ ASYNCSAFE(gl_list_node_t) new_node->next = node->next;
+ new_node->next->prev = new_node;
+ ASYNCSAFE(gl_list_node_t) node->next = new_node;
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ gl_list_node_t new_node;
+
+ if (!(position <= count))
+ /* Invalid argument. */
+ abort ();
+
+ new_node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (new_node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+
+ /* Add new_node to the hash table. */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ free (new_node);
+ return NULL;
+ }
+#endif
+
+ /* Add new_node to the list. */
+ if (position <= (count / 2))
+ {
+ gl_list_node_t node;
+
+ node = &list->root;
+ for (; position > 0; position--)
+ node = node->next;
+ new_node->prev = node;
+ ASYNCSAFE(gl_list_node_t) new_node->next = node->next;
+ new_node->next->prev = new_node;
+ ASYNCSAFE(gl_list_node_t) node->next = new_node;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ position = count - position;
+ node = &list->root;
+ for (; position > 0; position--)
+ node = node->prev;
+ ASYNCSAFE(gl_list_node_t) new_node->next = node;
+ new_node->prev = node->prev;
+ ASYNCSAFE(gl_list_node_t) new_node->prev->next = new_node;
+ node->prev = new_node;
+ }
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static bool
+gl_linked_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ gl_list_node_t prev;
+ gl_list_node_t next;
+
+#if WITH_HASHTABLE
+ /* Remove node from the hash table. */
+ remove_from_bucket (list, node);
+#endif
+
+ /* Remove node from the list. */
+ prev = node->prev;
+ next = node->next;
+
+ ASYNCSAFE(gl_list_node_t) prev->next = next;
+ next->prev = prev;
+ list->count--;
+
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (node->value);
+ free (node);
+ return true;
+}
+
+static bool
+gl_linked_remove_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ gl_list_node_t removed_node;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ /* Here we know count > 0. */
+ if (position <= ((count - 1) / 2))
+ {
+ gl_list_node_t node;
+ gl_list_node_t after_removed;
+
+ node = &list->root;
+ for (; position > 0; position--)
+ node = node->next;
+ removed_node = node->next;
+ after_removed = node->next->next;
+ ASYNCSAFE(gl_list_node_t) node->next = after_removed;
+ after_removed->prev = node;
+ }
+ else
+ {
+ gl_list_node_t node;
+ gl_list_node_t before_removed;
+
+ position = count - 1 - position;
+ node = &list->root;
+ for (; position > 0; position--)
+ node = node->prev;
+ removed_node = node->prev;
+ before_removed = node->prev->prev;
+ node->prev = before_removed;
+ ASYNCSAFE(gl_list_node_t) before_removed->next = node;
+ }
+#if WITH_HASHTABLE
+ remove_from_bucket (list, removed_node);
+#endif
+ list->count--;
+
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (removed_node->value);
+ free (removed_node);
+ return true;
+}
+
+static bool
+gl_linked_remove (gl_list_t list, const void *elt)
+{
+ gl_list_node_t node = gl_linked_search_from_to (list, 0, list->count, elt);
+
+ if (node != NULL)
+ return gl_linked_remove_node (list, node);
+ else
+ return false;
+}
+
+static void
+gl_linked_list_free (gl_list_t list)
+{
+ gl_listelement_dispose_fn dispose = list->base.dispose_fn;
+ gl_list_node_t node;
+
+ for (node = list->root.next; node != &list->root; )
+ {
+ gl_list_node_t next = node->next;
+ if (dispose != NULL)
+ dispose (node->value);
+ free (node);
+ node = next;
+ }
+#if WITH_HASHTABLE
+ free (list->table);
+#endif
+ free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_linked_iterator (gl_list_t list)
+{
+ gl_list_iterator_t result;
+
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.p = list->root.next;
+ result.q = &list->root;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static gl_list_iterator_t
+gl_linked_iterator_from_to (gl_list_t list,
+ size_t start_index, size_t end_index)
+{
+ gl_list_iterator_t result;
+ size_t n1, n2, n3;
+
+ if (!(start_index <= end_index && end_index <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ result.vtable = list->base.vtable;
+ result.list = list;
+ n1 = start_index;
+ n2 = end_index - start_index;
+ n3 = list->count - end_index;
+ /* Find the maximum among n1, n2, n3, so as to reduce the number of
+ loop iterations to n1 + n2 + n3 - max(n1,n2,n3). */
+ if (n1 > n2 && n1 > n3)
+ {
+ /* n1 is the maximum, use n2 and n3. */
+ gl_list_node_t node;
+ size_t i;
+
+ node = &list->root;
+ for (i = n3; i > 0; i--)
+ node = node->prev;
+ result.q = node;
+ for (i = n2; i > 0; i--)
+ node = node->prev;
+ result.p = node;
+ }
+ else if (n2 > n3)
+ {
+ /* n2 is the maximum, use n1 and n3. */
+ gl_list_node_t node;
+ size_t i;
+
+ node = list->root.next;
+ for (i = n1; i > 0; i--)
+ node = node->next;
+ result.p = node;
+
+ node = &list->root;
+ for (i = n3; i > 0; i--)
+ node = node->prev;
+ result.q = node;
+ }
+ else
+ {
+ /* n3 is the maximum, use n1 and n2. */
+ gl_list_node_t node;
+ size_t i;
+
+ node = list->root.next;
+ for (i = n1; i > 0; i--)
+ node = node->next;
+ result.p = node;
+ for (i = n2; i > 0; i--)
+ node = node->next;
+ result.q = node;
+ }
+
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_linked_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ if (iterator->p != iterator->q)
+ {
+ gl_list_node_t node = (gl_list_node_t) iterator->p;
+ *eltp = node->value;
+ if (nodep != NULL)
+ *nodep = node;
+ iterator->p = node->next;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_linked_iterator_free (gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static gl_list_node_t
+gl_linked_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ for (node = list->root.next; node != &list->root; node = node->next)
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return node;
+ }
+ return NULL;
+}
+
+static gl_list_node_t
+gl_linked_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(low <= high && high <= list->count))
+ /* Invalid arguments. */
+ abort ();
+
+ high -= low;
+ if (high > 0)
+ {
+ /* Here we know low < count. */
+ size_t position = low;
+ gl_list_node_t node;
+
+ if (position <= ((count - 1) / 2))
+ {
+ node = list->root.next;
+ for (; position > 0; position--)
+ node = node->next;
+ }
+ else
+ {
+ position = count - 1 - position;
+ node = list->root.prev;
+ for (; position > 0; position--)
+ node = node->prev;
+ }
+
+ do
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return node;
+ node = node->next;
+ }
+ while (--high > 0);
+ }
+ return NULL;
+}
+
+static size_t
+gl_linked_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+ size_t index;
+
+ for (node = list->root.next, index = 0;
+ node != &list->root;
+ node = node->next, index++)
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return index;
+ }
+ return (size_t)(-1);
+}
+
+static size_t
+gl_linked_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(low <= high && high <= list->count))
+ /* Invalid arguments. */
+ abort ();
+
+ high -= low;
+ if (high > 0)
+ {
+ /* Here we know low < count. */
+ size_t index = low;
+ size_t position = low;
+ gl_list_node_t node;
+
+ if (position <= ((count - 1) / 2))
+ {
+ node = list->root.next;
+ for (; position > 0; position--)
+ node = node->next;
+ }
+ else
+ {
+ position = count - 1 - position;
+ node = list->root.prev;
+ for (; position > 0; position--)
+ node = node->prev;
+ }
+
+ do
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return index;
+ node = node->next;
+ index++;
+ }
+ while (--high > 0);
+ }
+ return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_linked_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ for (node = list->root.next; node != &list->root; node = node->next)
+ if (compar (node->value, elt) >= 0)
+ return gl_linked_nx_add_before (list, node, elt);
+ return gl_linked_nx_add_last (list, elt);
+}
+
+static bool
+gl_linked_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ for (node = list->root.next; node != &list->root; node = node->next)
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return gl_linked_remove_node (list, node);
+ }
+ return false;
+}
diff --git a/gnulib/lib/gl_anyrbtree_list1.h b/gnulib/lib/gl_anyrbtree_list1.h
new file mode 100644
index 00000000..b4596daf
--- /dev/null
+++ b/gnulib/lib/gl_anyrbtree_list1.h
@@ -0,0 +1,76 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_rbtree_list.c and gl_rbtreehash_list.c. */
+
+/* A red-black tree is a binary tree where every node is colored black or
+ red such that
+ 1. The root is black.
+ 2. No red node has a red parent.
+ Or equivalently: No red node has a red child.
+ 3. All paths from the root down to any NULL endpoint contain the same
+ number of black nodes.
+ Let's call this the "black-height" bh of the tree. It follows that every
+ such path contains exactly bh black and between 0 and bh red nodes. (The
+ extreme cases are a path containing only black nodes, and a path colored
+ alternatingly black-red-black-red-...-black-red.) The height of the tree
+ therefore is >= bh, <= 2*bh.
+ */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Color of a node. */
+typedef enum color { BLACK, RED } color_t;
+
+/* Concrete list node implementation, valid for this file only. */
+struct gl_list_node_impl
+{
+#if WITH_HASHTABLE
+ struct gl_hash_entry h; /* hash table entry fields; must be first */
+#endif
+ struct gl_list_node_impl *left; /* left branch, or NULL */
+ struct gl_list_node_impl *right; /* right branch, or NULL */
+ /* Parent pointer, or NULL. The parent pointer is not needed for most
+ operations. It is needed so that a gl_list_node_t can be returned
+ without memory allocation, on which the functions gl_list_remove_node,
+ gl_list_add_before, gl_list_add_after can be implemented. */
+ struct gl_list_node_impl *parent;
+ color_t color; /* node's color */
+ size_t branch_size; /* number of nodes in this branch,
+ = branchsize(left)+branchsize(right)+1 */
+ const void *value;
+};
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+#if WITH_HASHTABLE
+ /* A hash table: managed as an array of collision lists. */
+ struct gl_hash_entry **table;
+ size_t table_size;
+#endif
+ struct gl_list_node_impl *root; /* root node or NULL */
+};
+
+/* A red-black tree of height h has a black-height bh >= ceil(h/2) and
+ therefore at least 2^ceil(h/2) - 1 elements. So, h <= 116 (because a tree
+ of height h >= 117 would have at least 2^59 - 1 elements, and because even
+ on 64-bit machines,
+ sizeof (gl_list_node_impl) * (2^59 - 1) > 2^64
+ this would exceed the address space of the machine. */
+#define MAXHEIGHT 116
diff --git a/gnulib/lib/gl_anyrbtree_list2.h b/gnulib/lib/gl_anyrbtree_list2.h
new file mode 100644
index 00000000..299a2b0a
--- /dev/null
+++ b/gnulib/lib/gl_anyrbtree_list2.h
@@ -0,0 +1,1028 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_rbtree_list.c and gl_rbtreehash_list.c. */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Create a subtree for count >= 1 elements.
+ Its black-height bh is passed as argument, with
+ 2^bh - 1 <= count <= 2^(bh+1) - 1. bh == 0 implies count == 1.
+ Its height is h where 2^(h-1) <= count <= 2^h - 1.
+ Return NULL upon out-of-memory. */
+static gl_list_node_t
+create_subtree_with_contents (unsigned int bh,
+ size_t count, const void **contents)
+{
+ size_t half1 = (count - 1) / 2;
+ size_t half2 = count / 2;
+ /* Note: half1 + half2 = count - 1. */
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (node == NULL)
+ return NULL;
+
+ if (half1 > 0)
+ {
+ /* half1 > 0 implies count > 1, implies bh >= 1, implies
+ 2^(bh-1) - 1 <= half1 <= 2^bh - 1. */
+ node->left =
+ create_subtree_with_contents (bh - 1, half1, contents);
+ if (node->left == NULL)
+ goto fail1;
+ node->left->parent = node;
+ }
+ else
+ node->left = NULL;
+
+ node->value = contents[half1];
+
+ if (half2 > 0)
+ {
+ /* half2 > 0 implies count > 1, implies bh >= 1, implies
+ 2^(bh-1) - 1 <= half2 <= 2^bh - 1. */
+ node->right =
+ create_subtree_with_contents (bh - 1, half2, contents + half1 + 1);
+ if (node->right == NULL)
+ goto fail2;
+ node->right->parent = node;
+ }
+ else
+ node->right = NULL;
+
+ node->color = (bh == 0 ? RED : BLACK);
+
+ node->branch_size = count;
+
+ return node;
+
+ fail2:
+ if (node->left != NULL)
+ free_subtree (node->left);
+ fail1:
+ free (node);
+ return NULL;
+}
+
+static gl_list_t
+gl_tree_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ {
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate < 10)
+ estimate = 10;
+ list->table_size = next_prime (estimate);
+ if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t))))
+ goto fail1;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail1;
+ }
+#endif
+ if (count > 0)
+ {
+ /* Assuming 2^bh - 1 <= count <= 2^(bh+1) - 2, we create a tree whose
+ upper bh levels are black, and only the partially present lowest
+ level is red. */
+ unsigned int bh;
+ {
+ size_t n;
+ for (n = count + 1, bh = 0; n > 1; n = n >> 1)
+ bh++;
+ }
+
+ list->root = create_subtree_with_contents (bh, count, contents);
+ if (list->root == NULL)
+ goto fail2;
+ list->root->parent = NULL;
+
+#if WITH_HASHTABLE
+ /* Now that the tree is built, node_position() works. Now we can
+ add the nodes to the hash table. */
+ if (add_nodes_to_buckets (list) < 0)
+ goto fail3;
+#endif
+ }
+ else
+ list->root = NULL;
+
+ return list;
+
+#if WITH_HASHTABLE
+ fail3:
+ free_subtree (list->root);
+#endif
+ fail2:
+#if WITH_HASHTABLE
+ free (list->table);
+ fail1:
+#endif
+ free (list);
+ return NULL;
+}
+
+/* Rotate left a subtree.
+
+ B D
+ / \ / \
+ A D --> B E
+ / \ / \
+ C E A C
+
+ Change the tree structure, update the branch sizes.
+ The caller must update the colors and register D as child of its parent. */
+static inline gl_list_node_t
+rotate_left (gl_list_node_t b_node, gl_list_node_t d_node)
+{
+ gl_list_node_t a_node = b_node->left;
+ gl_list_node_t c_node = d_node->left;
+ gl_list_node_t e_node = d_node->right;
+
+ b_node->right = c_node;
+ d_node->left = b_node;
+
+ d_node->parent = b_node->parent;
+ b_node->parent = d_node;
+ if (c_node != NULL)
+ c_node->parent = b_node;
+
+ b_node->branch_size =
+ (a_node != NULL ? a_node->branch_size : 0)
+ + 1 + (c_node != NULL ? c_node->branch_size : 0);
+ d_node->branch_size =
+ b_node->branch_size + 1 + (e_node != NULL ? e_node->branch_size : 0);
+
+ return d_node;
+}
+
+/* Rotate right a subtree.
+
+ D B
+ / \ / \
+ B E --> A D
+ / \ / \
+ A C C E
+
+ Change the tree structure, update the branch sizes.
+ The caller must update the colors and register B as child of its parent. */
+static inline gl_list_node_t
+rotate_right (gl_list_node_t b_node, gl_list_node_t d_node)
+{
+ gl_list_node_t a_node = b_node->left;
+ gl_list_node_t c_node = b_node->right;
+ gl_list_node_t e_node = d_node->right;
+
+ d_node->left = c_node;
+ b_node->right = d_node;
+
+ b_node->parent = d_node->parent;
+ d_node->parent = b_node;
+ if (c_node != NULL)
+ c_node->parent = d_node;
+
+ d_node->branch_size =
+ (c_node != NULL ? c_node->branch_size : 0)
+ + 1 + (e_node != NULL ? e_node->branch_size : 0);
+ b_node->branch_size =
+ (a_node != NULL ? a_node->branch_size : 0) + 1 + d_node->branch_size;
+
+ return b_node;
+}
+
+/* Ensure the tree is balanced, after an insertion operation.
+ Also assigns node->color.
+ parent is the given node's parent, known to be non-NULL. */
+static void
+rebalance_after_add (gl_list_t list, gl_list_node_t node, gl_list_node_t parent)
+{
+ for (;;)
+ {
+ /* At this point, parent = node->parent != NULL.
+ Think of node->color being RED (although node->color is not yet
+ assigned.) */
+ gl_list_node_t grandparent;
+ gl_list_node_t uncle;
+
+ if (parent->color == BLACK)
+ {
+ /* A RED color for node is acceptable. */
+ node->color = RED;
+ return;
+ }
+
+ grandparent = parent->parent;
+ /* Since parent is RED, we know that
+ grandparent is != NULL and colored BLACK. */
+
+ if (grandparent->left == parent)
+ uncle = grandparent->right;
+ else if (grandparent->right == parent)
+ uncle = grandparent->left;
+ else
+ abort ();
+
+ if (uncle != NULL && uncle->color == RED)
+ {
+ /* Change grandparent from BLACK to RED, and
+ change parent and uncle from RED to BLACK.
+ This makes it acceptable for node to be RED. */
+ node->color = RED;
+ parent->color = uncle->color = BLACK;
+ node = grandparent;
+ }
+ else
+ {
+ /* grandparent and uncle are BLACK. parent is RED. node wants
+ to be RED too.
+ In this case, recoloring is not sufficient. Need to perform
+ one or two rotations. */
+ gl_list_node_t *grandparentp;
+
+ if (grandparent->parent == NULL)
+ grandparentp = &list->root;
+ else if (grandparent->parent->left == grandparent)
+ grandparentp = &grandparent->parent->left;
+ else if (grandparent->parent->right == grandparent)
+ grandparentp = &grandparent->parent->right;
+ else
+ abort ();
+
+ if (grandparent->left == parent)
+ {
+ if (parent->right == node)
+ {
+ /* Rotation between node and parent. */
+ grandparent->left = rotate_left (parent, node);
+ node = parent;
+ parent = grandparent->left;
+ }
+ /* grandparent and uncle are BLACK. parent and node want to be
+ RED. parent = grandparent->left. node = parent->left.
+
+ grandparent parent
+ bh+1 bh+1
+ / \ / \
+ parent uncle --> node grandparent
+ bh bh bh bh
+ / \ / \
+ node C C uncle
+ bh bh bh bh
+ */
+ *grandparentp = rotate_right (parent, grandparent);
+ parent->color = BLACK;
+ node->color = grandparent->color = RED;
+ }
+ else /* grandparent->right == parent */
+ {
+ if (parent->left == node)
+ {
+ /* Rotation between node and parent. */
+ grandparent->right = rotate_right (node, parent);
+ node = parent;
+ parent = grandparent->right;
+ }
+ /* grandparent and uncle are BLACK. parent and node want to be
+ RED. parent = grandparent->right. node = parent->right.
+
+ grandparent parent
+ bh+1 bh+1
+ / \ / \
+ uncle parent --> grandparent node
+ bh bh bh bh
+ / \ / \
+ C node uncle C
+ bh bh bh bh
+ */
+ *grandparentp = rotate_left (grandparent, parent);
+ parent->color = BLACK;
+ node->color = grandparent->color = RED;
+ }
+ return;
+ }
+
+ /* Start again with a new (node, parent) pair. */
+ parent = node->parent;
+
+ if (parent == NULL)
+ {
+ /* Change node's color from RED to BLACK. This increases the
+ tree's black-height. */
+ node->color = BLACK;
+ return;
+ }
+ }
+}
+
+/* Ensure the tree is balanced, after a deletion operation.
+ CHILD was a grandchild of PARENT and is now its child. Between them,
+ a black node was removed. CHILD is also black, or NULL.
+ (CHILD can also be NULL. But PARENT is non-NULL.) */
+static void
+rebalance_after_remove (gl_list_t list, gl_list_node_t child, gl_list_node_t parent)
+{
+ for (;;)
+ {
+ /* At this point, we reduced the black-height of the CHILD subtree by 1.
+ To make up, either look for a possibility to turn a RED to a BLACK
+ node, or try to reduce the black-height tree of CHILD's sibling
+ subtree as well. */
+ gl_list_node_t *parentp;
+
+ if (parent->parent == NULL)
+ parentp = &list->root;
+ else if (parent->parent->left == parent)
+ parentp = &parent->parent->left;
+ else if (parent->parent->right == parent)
+ parentp = &parent->parent->right;
+ else
+ abort ();
+
+ if (parent->left == child)
+ {
+ gl_list_node_t sibling = parent->right;
+ /* sibling's black-height is >= 1. In particular,
+ sibling != NULL.
+
+ parent
+ / \
+ child sibling
+ bh bh+1
+ */
+
+ if (sibling->color == RED)
+ {
+ /* sibling is RED, hence parent is BLACK and sibling's children
+ are non-NULL and BLACK.
+
+ parent sibling
+ bh+2 bh+2
+ / \ / \
+ child sibling --> parent SR
+ bh bh+1 bh+1 bh+1
+ / \ / \
+ SL SR child SL
+ bh+1 bh+1 bh bh+1
+ */
+ *parentp = rotate_left (parent, sibling);
+ parent->color = RED;
+ sibling->color = BLACK;
+
+ /* Concentrate on the subtree of parent. The new sibling is
+ one of the old sibling's children, and known to be BLACK. */
+ parentp = &sibling->left;
+ sibling = parent->right;
+ }
+ /* Now we know that sibling is BLACK.
+
+ parent
+ / \
+ child sibling
+ bh bh+1
+ */
+ if (sibling->right != NULL && sibling->right->color == RED)
+ {
+ /*
+ parent sibling
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ child sibling --> parent SR
+ bh bh+1 bh+1 bh+1
+ / \ / \
+ SL SR child SL
+ bh bh bh bh
+ */
+ *parentp = rotate_left (parent, sibling);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->right->color = BLACK;
+ return;
+ }
+ else if (sibling->left != NULL && sibling->left->color == RED)
+ {
+ /*
+ parent parent
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ child sibling --> child SL
+ bh bh+1 bh bh+1
+ / \ / \
+ SL SR SLL sibling
+ bh bh bh bh
+ / \ / \
+ SLL SLR SLR SR
+ bh bh bh bh
+
+ where SLL, SLR, SR are all black.
+ */
+ parent->right = rotate_right (sibling->left, sibling);
+ /* Change sibling from BLACK to RED and SL from RED to BLACK. */
+ sibling->color = RED;
+ sibling = parent->right;
+ sibling->color = BLACK;
+
+ /* Now do as in the previous case. */
+ *parentp = rotate_left (parent, sibling);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->right->color = BLACK;
+ return;
+ }
+ else
+ {
+ if (parent->color == BLACK)
+ {
+ /* Change sibling from BLACK to RED. Then the entire
+ subtree at parent has decreased its black-height.
+ parent parent
+ bh+2 bh+1
+ / \ / \
+ child sibling --> child sibling
+ bh bh+1 bh bh
+ */
+ sibling->color = RED;
+
+ child = parent;
+ }
+ else
+ {
+ /* Change parent from RED to BLACK, but compensate by
+ changing sibling from BLACK to RED.
+ parent parent
+ bh+1 bh+1
+ / \ / \
+ child sibling --> child sibling
+ bh bh+1 bh bh
+ */
+ parent->color = BLACK;
+ sibling->color = RED;
+ return;
+ }
+ }
+ }
+ else if (parent->right == child)
+ {
+ gl_list_node_t sibling = parent->left;
+ /* sibling's black-height is >= 1. In particular,
+ sibling != NULL.
+
+ parent
+ / \
+ sibling child
+ bh+1 bh
+ */
+
+ if (sibling->color == RED)
+ {
+ /* sibling is RED, hence parent is BLACK and sibling's children
+ are non-NULL and BLACK.
+
+ parent sibling
+ bh+2 bh+2
+ / \ / \
+ sibling child --> SR parent
+ bh+1 ch bh+1 bh+1
+ / \ / \
+ SL SR SL child
+ bh+1 bh+1 bh+1 bh
+ */
+ *parentp = rotate_right (sibling, parent);
+ parent->color = RED;
+ sibling->color = BLACK;
+
+ /* Concentrate on the subtree of parent. The new sibling is
+ one of the old sibling's children, and known to be BLACK. */
+ parentp = &sibling->right;
+ sibling = parent->left;
+ }
+ /* Now we know that sibling is BLACK.
+
+ parent
+ / \
+ sibling child
+ bh+1 bh
+ */
+ if (sibling->left != NULL && sibling->left->color == RED)
+ {
+ /*
+ parent sibling
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ sibling child --> SL parent
+ bh+1 bh bh+1 bh+1
+ / \ / \
+ SL SR SR child
+ bh bh bh bh
+ */
+ *parentp = rotate_right (sibling, parent);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->left->color = BLACK;
+ return;
+ }
+ else if (sibling->right != NULL && sibling->right->color == RED)
+ {
+ /*
+ parent parent
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ sibling child --> SR child
+ bh+1 bh bh+1 bh
+ / \ / \
+ SL SR sibling SRR
+ bh bh bh bh
+ / \ / \
+ SRL SRR SL SRL
+ bh bh bh bh
+
+ where SL, SRL, SRR are all black.
+ */
+ parent->left = rotate_left (sibling, sibling->right);
+ /* Change sibling from BLACK to RED and SL from RED to BLACK. */
+ sibling->color = RED;
+ sibling = parent->left;
+ sibling->color = BLACK;
+
+ /* Now do as in the previous case. */
+ *parentp = rotate_right (sibling, parent);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->left->color = BLACK;
+ return;
+ }
+ else
+ {
+ if (parent->color == BLACK)
+ {
+ /* Change sibling from BLACK to RED. Then the entire
+ subtree at parent has decreased its black-height.
+ parent parent
+ bh+2 bh+1
+ / \ / \
+ sibling child --> sibling child
+ bh+1 bh bh bh
+ */
+ sibling->color = RED;
+
+ child = parent;
+ }
+ else
+ {
+ /* Change parent from RED to BLACK, but compensate by
+ changing sibling from BLACK to RED.
+ parent parent
+ bh+1 bh+1
+ / \ / \
+ sibling child --> sibling child
+ bh+1 bh bh bh
+ */
+ parent->color = BLACK;
+ sibling->color = RED;
+ return;
+ }
+ }
+ }
+ else
+ abort ();
+
+ /* Start again with a new (child, parent) pair. */
+ parent = child->parent;
+
+#if 0 /* Already handled. */
+ if (child != NULL && child->color == RED)
+ {
+ child->color = BLACK;
+ return;
+ }
+#endif
+
+ if (parent == NULL)
+ return;
+ }
+}
+
+static void
+gl_tree_remove_node_from_tree (gl_list_t list, gl_list_node_t node)
+{
+ gl_list_node_t parent = node->parent;
+
+ if (node->left == NULL)
+ {
+ /* Replace node with node->right. */
+ gl_list_node_t child = node->right;
+
+ if (child != NULL)
+ {
+ child->parent = parent;
+ /* Since node->left == NULL, child must be RED and of height 1,
+ hence node must have been BLACK. Recolor the child. */
+ child->color = BLACK;
+ }
+ if (parent == NULL)
+ list->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ if (child == NULL && node->color == BLACK)
+ rebalance_after_remove (list, child, parent);
+ }
+ }
+ else if (node->right == NULL)
+ {
+ /* It is not absolutely necessary to treat this case. But the more
+ general case below is more complicated, hence slower. */
+ /* Replace node with node->left. */
+ gl_list_node_t child = node->left;
+
+ child->parent = parent;
+ /* Since node->right == NULL, child must be RED and of height 1,
+ hence node must have been BLACK. Recolor the child. */
+ child->color = BLACK;
+ if (parent == NULL)
+ list->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+ }
+ }
+ else
+ {
+ /* Replace node with the rightmost element of the node->left subtree. */
+ gl_list_node_t subst;
+ gl_list_node_t subst_parent;
+ gl_list_node_t child;
+ color_t removed_color;
+
+ for (subst = node->left; subst->right != NULL; )
+ subst = subst->right;
+
+ subst_parent = subst->parent;
+
+ child = subst->left;
+
+ removed_color = subst->color;
+
+ /* The case subst_parent == node is special: If we do nothing special,
+ we get confusion about node->left, subst->left and child->parent.
+ subst_parent == node
+ <==> The 'for' loop above terminated immediately.
+ <==> subst == subst_parent->left
+ [otherwise subst == subst_parent->right]
+ In this case, we would need to first set
+ child->parent = node; node->left = child;
+ and later - when we copy subst into node's position - again
+ child->parent = subst; subst->left = child;
+ Altogether a no-op. */
+ if (subst_parent != node)
+ {
+ if (child != NULL)
+ child->parent = subst_parent;
+ subst_parent->right = child;
+ }
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = subst_parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ /* Copy subst into node's position.
+ (This is safer than to copy subst's value into node, keep node in
+ place, and free subst.) */
+ if (subst_parent != node)
+ {
+ subst->left = node->left;
+ subst->left->parent = subst;
+ }
+ subst->right = node->right;
+ subst->right->parent = subst;
+ subst->color = node->color;
+ subst->branch_size = node->branch_size;
+ subst->parent = parent;
+ if (parent == NULL)
+ list->root = subst;
+ else if (parent->left == node)
+ parent->left = subst;
+ else /* parent->right == node */
+ parent->right = subst;
+
+ if (removed_color == BLACK)
+ {
+ if (child != NULL && child->color == RED)
+ /* Recolor the child. */
+ child->color = BLACK;
+ else
+ /* Rebalancing starts at child's parent, that is subst_parent -
+ except when subst_parent == node. In this case, we need to use
+ its replacement, subst. */
+ rebalance_after_remove (list, child,
+ subst_parent != node ? subst_parent : subst);
+ }
+ }
+}
+
+static gl_list_node_t
+gl_tree_nx_add_first (gl_list_t list, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (list->root == NULL)
+ {
+ new_node->color = BLACK;
+ list->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ for (node = list->root; node->left != NULL; )
+ node = node->left;
+
+ node->left = new_node;
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Color and rebalance. */
+ rebalance_after_add (list, new_node, node);
+ }
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_last (gl_list_t list, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (list->root == NULL)
+ {
+ new_node->color = BLACK;
+ list->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ for (node = list->root; node->right != NULL; )
+ node = node->right;
+
+ node->right = new_node;
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Color and rebalance. */
+ rebalance_after_add (list, new_node, node);
+ }
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (node->left == NULL)
+ node->left = new_node;
+ else
+ {
+ for (node = node->left; node->right != NULL; )
+ node = node->right;
+ node->right = new_node;
+ }
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Color and rebalance. */
+ rebalance_after_add (list, new_node, node);
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (node->right == NULL)
+ node->right = new_node;
+ else
+ {
+ for (node = node->right; node->left != NULL; )
+ node = node->left;
+ node->left = new_node;
+ }
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Color and rebalance. */
+ rebalance_after_add (list, new_node, node);
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
diff --git a/gnulib/lib/gl_anytree_list1.h b/gnulib/lib/gl_anytree_list1.h
new file mode 100644
index 00000000..4999c96f
--- /dev/null
+++ b/gnulib/lib/gl_anytree_list1.h
@@ -0,0 +1,41 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_avltree_list.c, gl_rbtree_list.c,
+ gl_avltreehash_list.c, gl_rbtreehash_list.c. */
+
+/* An item on the stack used for iterating across the elements. */
+typedef struct
+{
+ gl_list_node_t node;
+ size_t rightp;
+} iterstack_item_t;
+
+/* A stack used for iterating across the elements. */
+typedef iterstack_item_t iterstack_t[MAXHEIGHT];
+
+/* Free a non-empty subtree recursively.
+ This function is recursive and therefore not very fast. */
+static void
+free_subtree (gl_list_node_t node)
+{
+ if (node->left != NULL)
+ free_subtree (node->left);
+ if (node->right != NULL)
+ free_subtree (node->right);
+ free (node);
+}
diff --git a/gnulib/lib/gl_anytree_list2.h b/gnulib/lib/gl_anytree_list2.h
new file mode 100644
index 00000000..b23f5f52
--- /dev/null
+++ b/gnulib/lib/gl_anytree_list2.h
@@ -0,0 +1,940 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_avltree_list.c, gl_rbtree_list.c,
+ gl_avltreehash_list.c, gl_rbtreehash_list.c. */
+
+static gl_list_t
+gl_tree_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ struct gl_list_impl *list = (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ list->table_size = 11;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail;
+#endif
+ list->root = NULL;
+
+ return list;
+
+#if WITH_HASHTABLE
+ fail:
+ free (list);
+ return NULL;
+#endif
+}
+
+static size_t
+gl_tree_size (gl_list_t list)
+{
+ return (list->root != NULL ? list->root->branch_size : 0);
+}
+
+static const void *
+gl_tree_node_value (gl_list_t list, gl_list_node_t node)
+{
+ return node->value;
+}
+
+static int
+gl_tree_node_nx_set_value (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+#if WITH_HASHTABLE
+ if (elt != node->value)
+ {
+ size_t new_hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+
+ if (new_hashcode != node->h.hashcode)
+ {
+ remove_from_bucket (list, node);
+ node->value = elt;
+ node->h.hashcode = new_hashcode;
+ if (add_to_bucket (list, node) < 0)
+ {
+ /* Out of memory. We removed node from a bucket but cannot add
+ it to another bucket. In order to avoid inconsistencies, we
+ must remove node entirely from the list. */
+ gl_tree_remove_node_from_tree (list, node);
+ free (node);
+ return -1;
+ }
+ }
+ else
+ node->value = elt;
+ }
+#else
+ node->value = elt;
+#endif
+ return 0;
+}
+
+static gl_list_node_t
+gl_tree_next_node (gl_list_t list, gl_list_node_t node)
+{
+ if (node->right != NULL)
+ {
+ node = node->right;
+ while (node->left != NULL)
+ node = node->left;
+ }
+ else
+ {
+ while (node->parent != NULL && node->parent->right == node)
+ node = node->parent;
+ node = node->parent;
+ }
+ return node;
+}
+
+static gl_list_node_t
+gl_tree_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ if (node->left != NULL)
+ {
+ node = node->left;
+ while (node->right != NULL)
+ node = node->right;
+ }
+ else
+ {
+ while (node->parent != NULL && node->parent->left == node)
+ node = node->parent;
+ node = node->parent;
+ }
+ return node;
+}
+
+/* Return the node at the given position < gl_tree_size (list). */
+static inline gl_list_node_t
+node_at (gl_list_node_t root, size_t position)
+{
+ /* Here we know that root != NULL. */
+ gl_list_node_t node = root;
+
+ for (;;)
+ {
+ if (node->left != NULL)
+ {
+ if (position < node->left->branch_size)
+ {
+ node = node->left;
+ continue;
+ }
+ position -= node->left->branch_size;
+ }
+ if (position == 0)
+ break;
+ position--;
+ node = node->right;
+ }
+ return node;
+}
+
+static const void *
+gl_tree_get_at (gl_list_t list, size_t position)
+{
+ gl_list_node_t node = list->root;
+
+ if (!(node != NULL && position < node->branch_size))
+ /* Invalid argument. */
+ abort ();
+ node = node_at (node, position);
+ return node->value;
+}
+
+static gl_list_node_t
+gl_tree_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t node = list->root;
+
+ if (!(node != NULL && position < node->branch_size))
+ /* Invalid argument. */
+ abort ();
+ node = node_at (node, position);
+#if WITH_HASHTABLE
+ if (elt != node->value)
+ {
+ size_t new_hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+
+ if (new_hashcode != node->h.hashcode)
+ {
+ remove_from_bucket (list, node);
+ node->value = elt;
+ node->h.hashcode = new_hashcode;
+ if (add_to_bucket (list, node) < 0)
+ {
+ /* Out of memory. We removed node from a bucket but cannot add
+ it to another bucket. In order to avoid inconsistencies, we
+ must remove node entirely from the list. */
+ gl_tree_remove_node_from_tree (list, node);
+ free (node);
+ return NULL;
+ }
+ }
+ else
+ node->value = elt;
+ }
+#else
+ node->value = elt;
+#endif
+ return node;
+}
+
+#if !WITH_HASHTABLE
+
+static gl_list_node_t
+gl_tree_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index
+ && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+ {
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ /* Iterate across all elements. */
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+ size_t index = 0;
+
+ if (start_index == 0)
+ {
+ /* Consider all elements. */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = 0;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ return NULL;
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ }
+ node = stack_ptr->node;
+ /* Test against current element. */
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ return node;
+ index++;
+ if (index >= end_index)
+ return NULL;
+ /* Descend on right branch. */
+ stack_ptr->rightp = 1;
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ else
+ {
+ /* Consider only elements at indices >= start_index.
+ In this case, rightp contains the difference between the start_index
+ for the parent node and the one for the child node (0 when the child
+ node is the parent's left child, > 0 when the child is the parent's
+ right child). */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ if (node->branch_size <= start_index)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = 0;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ return NULL;
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ start_index += stack_ptr->rightp;
+ }
+ node = stack_ptr->node;
+ {
+ size_t left_branch_size1 =
+ (node->left != NULL ? node->left->branch_size : 0) + 1;
+ if (start_index < left_branch_size1)
+ {
+ /* Test against current element. */
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ return node;
+ /* Now that we have considered all indices < left_branch_size1,
+ we can increment start_index. */
+ start_index = left_branch_size1;
+ }
+ index++;
+ if (index >= end_index)
+ return NULL;
+ /* Descend on right branch. */
+ start_index -= left_branch_size1;
+ stack_ptr->rightp = left_branch_size1;
+ }
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ }
+}
+
+static size_t
+gl_tree_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index
+ && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+ {
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ /* Iterate across all elements. */
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+ size_t index = 0;
+
+ if (start_index == 0)
+ {
+ /* Consider all elements. */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = 0;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ return (size_t)(-1);
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ }
+ node = stack_ptr->node;
+ /* Test against current element. */
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ return index;
+ index++;
+ if (index >= end_index)
+ return (size_t)(-1);
+ /* Descend on right branch. */
+ stack_ptr->rightp = 1;
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ else
+ {
+ /* Consider only elements at indices >= start_index.
+ In this case, rightp contains the difference between the start_index
+ for the parent node and the one for the child node (0 when the child
+ node is the parent's left child, > 0 when the child is the parent's
+ right child). */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ if (node->branch_size <= start_index)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = 0;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ return (size_t)(-1);
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ start_index += stack_ptr->rightp;
+ }
+ node = stack_ptr->node;
+ {
+ size_t left_branch_size1 =
+ (node->left != NULL ? node->left->branch_size : 0) + 1;
+ if (start_index < left_branch_size1)
+ {
+ /* Test against current element. */
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ return index;
+ /* Now that we have considered all indices < left_branch_size1,
+ we can increment start_index. */
+ start_index = left_branch_size1;
+ }
+ index++;
+ if (index >= end_index)
+ return (size_t)(-1);
+ /* Descend on right branch. */
+ start_index -= left_branch_size1;
+ stack_ptr->rightp = left_branch_size1;
+ }
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ }
+}
+
+#endif
+
+static gl_list_node_t
+gl_tree_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = (list->root != NULL ? list->root->branch_size : 0);
+
+ if (!(position <= count))
+ /* Invalid argument. */
+ abort ();
+ if (position == count)
+ return gl_tree_nx_add_last (list, elt);
+ else
+ return gl_tree_nx_add_before (list, node_at (list->root, position), elt);
+}
+
+static bool
+gl_tree_remove_node (gl_list_t list, gl_list_node_t node)
+{
+#if WITH_HASHTABLE
+ /* Remove node from the hash table.
+ Note that this is only possible _before_ the node is removed from the
+ tree structure, because remove_from_bucket() uses node_position(). */
+ remove_from_bucket (list, node);
+#endif
+
+ gl_tree_remove_node_from_tree (list, node);
+
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (node->value);
+ free (node);
+ return true;
+}
+
+static bool
+gl_tree_remove_at (gl_list_t list, size_t position)
+{
+ gl_list_node_t node = list->root;
+
+ if (!(node != NULL && position < node->branch_size))
+ /* Invalid argument. */
+ abort ();
+ node = node_at (node, position);
+ return gl_tree_remove_node (list, node);
+}
+
+static bool
+gl_tree_remove (gl_list_t list, const void *elt)
+{
+ if (list->root != NULL)
+ {
+ gl_list_node_t node =
+ gl_tree_search_from_to (list, 0, list->root->branch_size, elt);
+
+ if (node != NULL)
+ return gl_tree_remove_node (list, node);
+ }
+ return false;
+}
+
+#if !WITH_HASHTABLE
+
+static void
+gl_tree_list_free (gl_list_t list)
+{
+ /* Iterate across all elements in post-order. */
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto done_iterate;
+ stack_ptr--;
+ node = stack_ptr->node;
+ if (!stack_ptr->rightp)
+ break;
+ /* Free the current node. */
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (node->value);
+ free (node);
+ }
+ /* Descend on right branch. */
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ done_iterate:
+ free (list);
+}
+
+#endif
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_tree_iterator (gl_list_t list)
+{
+ gl_list_iterator_t result;
+ gl_list_node_t node;
+
+ result.vtable = list->base.vtable;
+ result.list = list;
+ /* Start node is the leftmost node. */
+ node = list->root;
+ if (node != NULL)
+ while (node->left != NULL)
+ node = node->left;
+ result.p = node;
+ /* End point is past the rightmost node. */
+ result.q = NULL;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static gl_list_iterator_t
+gl_tree_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ size_t count = (list->root != NULL ? list->root->branch_size : 0);
+ gl_list_iterator_t result;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+ result.vtable = list->base.vtable;
+ result.list = list;
+ /* Start node is the node at position start_index. */
+ result.p = (start_index < count ? node_at (list->root, start_index) : NULL);
+ /* End point is the node at position end_index. */
+ result.q = (end_index < count ? node_at (list->root, end_index) : NULL);
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_tree_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ if (iterator->p != iterator->q)
+ {
+ gl_list_node_t node = (gl_list_node_t) iterator->p;
+ *eltp = node->value;
+ if (nodep != NULL)
+ *nodep = node;
+ /* Advance to the next node. */
+ if (node->right != NULL)
+ {
+ node = node->right;
+ while (node->left != NULL)
+ node = node->left;
+ }
+ else
+ {
+ while (node->parent != NULL && node->parent->right == node)
+ node = node->parent;
+ node = node->parent;
+ }
+ iterator->p = node;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_tree_iterator_free (gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static gl_list_node_t
+gl_tree_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ for (node = list->root; node != NULL; )
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ node = node->right;
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT. But we need the leftmost such
+ element. */
+ gl_list_node_t found = node;
+ node = node->left;
+ for (; node != NULL; )
+ {
+ int cmp2 = compar (node->value, elt);
+
+ if (cmp2 < 0)
+ node = node->right;
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ found = node;
+ node = node->left;
+ }
+ }
+ return found;
+ }
+ }
+ return NULL;
+}
+
+static gl_list_node_t
+gl_tree_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ if (!(low <= high
+ && high <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+
+ for (node = list->root; node != NULL; )
+ {
+ size_t left_branch_size =
+ (node->left != NULL ? node->left->branch_size : 0);
+
+ if (low > left_branch_size)
+ {
+ low -= left_branch_size + 1;
+ high -= left_branch_size + 1;
+ node = node->right;
+ }
+ else if (high <= left_branch_size)
+ node = node->left;
+ else
+ {
+ /* Here low <= left_branch_size < high. */
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ {
+ low = 0;
+ high -= left_branch_size + 1;
+ node = node->right;
+ }
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT. But we need the leftmost
+ such element. */
+ gl_list_node_t found = node;
+ node = node->left;
+ for (; node != NULL; )
+ {
+ size_t left_branch_size2 =
+ (node->left != NULL ? node->left->branch_size : 0);
+
+ if (low > left_branch_size2)
+ {
+ low -= left_branch_size2 + 1;
+ node = node->right;
+ }
+ else
+ {
+ /* Here low <= left_branch_size2. */
+ int cmp2 = compar (node->value, elt);
+
+ if (cmp2 < 0)
+ {
+ low = 0;
+ node = node->right;
+ }
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ found = node;
+ node = node->left;
+ }
+ }
+ }
+ return found;
+ }
+ }
+ }
+ return NULL;
+}
+
+static size_t
+gl_tree_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+ size_t position;
+
+ for (node = list->root, position = 0; node != NULL; )
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ {
+ if (node->left != NULL)
+ position += node->left->branch_size;
+ position++;
+ node = node->right;
+ }
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT. But we need the leftmost such
+ element. */
+ size_t found_position =
+ position + (node->left != NULL ? node->left->branch_size : 0);
+ node = node->left;
+ for (; node != NULL; )
+ {
+ int cmp2 = compar (node->value, elt);
+
+ if (cmp2 < 0)
+ {
+ if (node->left != NULL)
+ position += node->left->branch_size;
+ position++;
+ node = node->right;
+ }
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ found_position =
+ position
+ + (node->left != NULL ? node->left->branch_size : 0);
+ node = node->left;
+ }
+ }
+ return found_position;
+ }
+ }
+ return (size_t)(-1);
+}
+
+static size_t
+gl_tree_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ gl_list_node_t node;
+ size_t position;
+
+ if (!(low <= high
+ && high <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+
+ for (node = list->root, position = 0; node != NULL; )
+ {
+ size_t left_branch_size =
+ (node->left != NULL ? node->left->branch_size : 0);
+
+ if (low > left_branch_size)
+ {
+ low -= left_branch_size + 1;
+ high -= left_branch_size + 1;
+ position += left_branch_size + 1;
+ node = node->right;
+ }
+ else if (high <= left_branch_size)
+ node = node->left;
+ else
+ {
+ /* Here low <= left_branch_size < high. */
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ {
+ low = 0;
+ high -= left_branch_size + 1;
+ position += left_branch_size + 1;
+ node = node->right;
+ }
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT. But we need the leftmost
+ such element. */
+ size_t found_position =
+ position + (node->left != NULL ? node->left->branch_size : 0);
+ node = node->left;
+ for (; node != NULL; )
+ {
+ size_t left_branch_size2 =
+ (node->left != NULL ? node->left->branch_size : 0);
+
+ if (low > left_branch_size2)
+ {
+ low -= left_branch_size2 + 1;
+ node = node->right;
+ }
+ else
+ {
+ /* Here low <= left_branch_size2. */
+ int cmp2 = compar (node->value, elt);
+
+ if (cmp2 < 0)
+ {
+ position += left_branch_size2 + 1;
+ node = node->right;
+ }
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ found_position = position + left_branch_size2;
+ node = node->left;
+ }
+ }
+ }
+ return found_position;
+ }
+ }
+ }
+ return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_tree_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node = list->root;
+
+ if (node == NULL)
+ return gl_tree_nx_add_first (list, elt);
+
+ for (;;)
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ {
+ if (node->right == NULL)
+ return gl_tree_nx_add_after (list, node, elt);
+ node = node->right;
+ }
+ else if (cmp > 0)
+ {
+ if (node->left == NULL)
+ return gl_tree_nx_add_before (list, node, elt);
+ node = node->left;
+ }
+ else /* cmp == 0 */
+ return gl_tree_nx_add_before (list, node, elt);
+ }
+}
+
+static bool
+gl_tree_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node = gl_tree_sortedlist_search (list, compar, elt);
+ if (node != NULL)
+ return gl_tree_remove_node (list, node);
+ else
+ return false;
+}
diff --git a/gnulib/lib/gl_anytree_oset.h b/gnulib/lib/gl_anytree_oset.h
new file mode 100644
index 00000000..0ecef1ac
--- /dev/null
+++ b/gnulib/lib/gl_anytree_oset.h
@@ -0,0 +1,297 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_avltree_oset.c and gl_rbtree_oset.c. */
+
+/* An item on the stack used for iterating across the elements. */
+typedef struct
+{
+ gl_oset_node_t node;
+ bool rightp;
+} iterstack_item_t;
+
+/* A stack used for iterating across the elements. */
+typedef iterstack_item_t iterstack_t[MAXHEIGHT];
+
+static gl_oset_t
+gl_tree_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ struct gl_oset_impl *set =
+ (struct gl_oset_impl *) malloc (sizeof (struct gl_oset_impl));
+
+ if (set == NULL)
+ return NULL;
+
+ set->base.vtable = implementation;
+ set->base.compar_fn = compar_fn;
+ set->base.dispose_fn = dispose_fn;
+ set->root = NULL;
+ set->count = 0;
+
+ return set;
+}
+
+static size_t
+gl_tree_size (gl_oset_t set)
+{
+ return set->count;
+}
+
+static bool
+gl_tree_search (gl_oset_t set, const void *elt)
+{
+ gl_setelement_compar_fn compar = set->base.compar_fn;
+ gl_oset_node_t node;
+
+ for (node = set->root; node != NULL; )
+ {
+ int cmp = (compar != NULL
+ ? compar (node->value, elt)
+ : (node->value > elt ? 1 :
+ node->value < elt ? -1 : 0));
+
+ if (cmp < 0)
+ node = node->right;
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ /* We have an element equal to ELT. */
+ return true;
+ }
+ return false;
+}
+
+static bool
+gl_tree_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold,
+ const void **eltp)
+{
+ gl_oset_node_t node;
+
+ for (node = set->root; node != NULL; )
+ {
+ if (! threshold_fn (node->value, threshold))
+ node = node->right;
+ else
+ {
+ /* We have an element >= VALUE. But we need the leftmost such
+ element. */
+ gl_oset_node_t found = node;
+ node = node->left;
+ for (; node != NULL; )
+ {
+ if (! threshold_fn (node->value, threshold))
+ node = node->right;
+ else
+ {
+ found = node;
+ node = node->left;
+ }
+ }
+ *eltp = found->value;
+ return true;
+ }
+ }
+ return false;
+}
+
+static gl_oset_node_t
+gl_tree_search_node (gl_oset_t set, const void *elt)
+{
+ gl_setelement_compar_fn compar = set->base.compar_fn;
+ gl_oset_node_t node;
+
+ for (node = set->root; node != NULL; )
+ {
+ int cmp = (compar != NULL
+ ? compar (node->value, elt)
+ : (node->value > elt ? 1 :
+ node->value < elt ? -1 : 0));
+
+ if (cmp < 0)
+ node = node->right;
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ /* We have an element equal to ELT. */
+ return node;
+ }
+ return NULL;
+}
+
+static int
+gl_tree_nx_add (gl_oset_t set, const void *elt)
+{
+ gl_setelement_compar_fn compar;
+ gl_oset_node_t node = set->root;
+
+ if (node == NULL)
+ {
+ if (gl_tree_nx_add_first (set, elt) == NULL)
+ return -1;
+ return true;
+ }
+
+ compar = set->base.compar_fn;
+
+ for (;;)
+ {
+ int cmp = (compar != NULL
+ ? compar (node->value, elt)
+ : (node->value > elt ? 1 :
+ node->value < elt ? -1 : 0));
+
+ if (cmp < 0)
+ {
+ if (node->right == NULL)
+ {
+ if (gl_tree_nx_add_after (set, node, elt) == NULL)
+ return -1;
+ return true;
+ }
+ node = node->right;
+ }
+ else if (cmp > 0)
+ {
+ if (node->left == NULL)
+ {
+ if (gl_tree_nx_add_before (set, node, elt) == NULL)
+ return -1;
+ return true;
+ }
+ node = node->left;
+ }
+ else /* cmp == 0 */
+ return false;
+ }
+}
+
+static bool
+gl_tree_remove (gl_oset_t set, const void *elt)
+{
+ gl_oset_node_t node = gl_tree_search_node (set, elt);
+
+ if (node != NULL)
+ return gl_tree_remove_node (set, node);
+ else
+ return false;
+}
+
+static void
+gl_tree_oset_free (gl_oset_t set)
+{
+ /* Iterate across all elements in post-order. */
+ gl_oset_node_t node = set->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto done_iterate;
+ stack_ptr--;
+ node = stack_ptr->node;
+ if (!stack_ptr->rightp)
+ break;
+ /* Free the current node. */
+ if (set->base.dispose_fn != NULL)
+ set->base.dispose_fn (node->value);
+ free (node);
+ }
+ /* Descend on right branch. */
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ done_iterate:
+ free (set);
+}
+
+/* --------------------- gl_oset_iterator_t Data Type --------------------- */
+
+static gl_oset_iterator_t
+gl_tree_iterator (gl_oset_t set)
+{
+ gl_oset_iterator_t result;
+ gl_oset_node_t node;
+
+ result.vtable = set->base.vtable;
+ result.set = set;
+ /* Start node is the leftmost node. */
+ node = set->root;
+ if (node != NULL)
+ while (node->left != NULL)
+ node = node->left;
+ result.p = node;
+ /* End point is past the rightmost node. */
+ result.q = NULL;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_tree_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+ if (iterator->p != iterator->q)
+ {
+ gl_oset_node_t node = (gl_oset_node_t) iterator->p;
+ *eltp = node->value;
+ /* Advance to the next node. */
+ if (node->right != NULL)
+ {
+ node = node->right;
+ while (node->left != NULL)
+ node = node->left;
+ }
+ else
+ {
+ while (node->parent != NULL && node->parent->right == node)
+ node = node->parent;
+ node = node->parent;
+ }
+ iterator->p = node;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_tree_iterator_free (gl_oset_iterator_t *iterator)
+{
+}
diff --git a/gnulib/lib/gl_anytreehash_list1.h b/gnulib/lib/gl_anytreehash_list1.h
new file mode 100644
index 00000000..5caf9425
--- /dev/null
+++ b/gnulib/lib/gl_anytreehash_list1.h
@@ -0,0 +1,358 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_avltreehash_list.c and gl_rbtreehash_list.c. */
+
+/* Hash table entry representing the same value at more than one position. */
+struct gl_multiple_nodes
+{
+ struct gl_hash_entry h; /* hash table entry fields; must be first */
+ void *magic; /* used to distinguish from single node */
+ gl_oset_t nodes; /* set of nodes, sorted by position */
+};
+/* A value that cannot occur at the corresponding field (->left) in
+ gl_list_node_impl. */
+#define MULTIPLE_NODES_MAGIC (void *) -1
+
+/* Resize the hash table if needed, after list->count was incremented. */
+static inline void
+hash_resize_after_add (gl_list_t list)
+{
+ size_t count = (list->root != 0 ? list->root->branch_size : 0);
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate > list->table_size)
+ hash_resize (list, estimate);
+}
+
+/* Return the position of the given node in the tree. */
+static size_t
+node_position (gl_list_node_t node)
+{
+ size_t position = 0;
+
+ if (node->left != NULL)
+ position += node->left->branch_size;
+ for (;;)
+ {
+ gl_list_node_t parent = node->parent;
+
+ if (parent == NULL)
+ return position;
+ /* position is now relative to the subtree of node. */
+ if (parent->right == node)
+ {
+ position += 1;
+ if (parent->left != NULL)
+ position += parent->left->branch_size;
+ }
+ /* position is now relative to the subtree of parent. */
+ node = parent;
+ }
+}
+
+/* Compares two nodes by their position in the tree. */
+static int
+compare_by_position (const void *x1, const void *x2)
+{
+ gl_list_node_t node1 = (gl_list_node_t) x1;
+ gl_list_node_t node2 = (gl_list_node_t) x2;
+ size_t position1 = node_position (node1);
+ size_t position2 = node_position (node2);
+
+ return (position1 > position2 ? 1 :
+ position1 < position2 ? -1 : 0);
+}
+
+/* Compares a node's position in the tree with a given threshold. */
+static bool
+compare_position_threshold (const void *x, const void *threshold)
+{
+ gl_list_node_t node = (gl_list_node_t) x;
+ size_t position = node_position (node);
+ return (position >= (uintptr_t)threshold);
+}
+
+/* Return the first element of a non-empty ordered set of nodes. */
+static inline gl_list_node_t
+gl_oset_first (gl_oset_t set)
+{
+ gl_oset_iterator_t iter = gl_oset_iterator (set);
+ const void *first;
+
+ if (!gl_oset_iterator_next (&iter, &first))
+ abort ();
+ gl_oset_iterator_free (&iter);
+ return (gl_list_node_t) first;
+}
+
+/* Add a node to the hash table structure.
+ If duplicates are allowed, this function performs in average time
+ O((log n)^2): gl_oset_nx_add may need to add an element to an ordered set
+ of size O(n), needing O(log n) comparison function calls. The comparison
+ function is compare_by_position, which is O(log n) worst-case.
+ If duplicates are forbidden, this function is O(1).
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
+add_to_bucket (gl_list_t list, gl_list_node_t new_node)
+{
+ size_t bucket = new_node->h.hashcode % list->table_size;
+
+ /* If no duplicates are allowed, multiple nodes are not needed. */
+ if (list->base.allow_duplicates)
+ {
+ size_t hashcode = new_node->h.hashcode;
+ const void *value = new_node->value;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_hash_entry_t *entryp;
+
+ for (entryp = &list->table[bucket]; *entryp != NULL; entryp = &(*entryp)->hash_next)
+ {
+ gl_hash_entry_t entry = *entryp;
+
+ if (entry->hashcode == hashcode)
+ {
+ if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+ {
+ /* An entry representing multiple nodes. */
+ gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+ /* Only the first node is interesting. */
+ gl_list_node_t node = gl_oset_first (nodes);
+ if (equals != NULL ? equals (value, node->value) : value == node->value)
+ {
+ /* Found already multiple nodes with the same value.
+ Add the new_node to it. */
+ return gl_oset_nx_add (nodes, new_node);
+ }
+ }
+ else
+ {
+ /* An entry representing a single node. */
+ gl_list_node_t node = (struct gl_list_node_impl *) entry;
+ if (equals != NULL ? equals (value, node->value) : value == node->value)
+ {
+ /* Found already a node with the same value. Turn it
+ into an ordered set, and add new_node to it. */
+ gl_oset_t nodes;
+ struct gl_multiple_nodes *multi_entry;
+
+ nodes =
+ gl_oset_nx_create_empty (OSET_TREE_FLAVOR,
+ compare_by_position, NULL);
+ if (nodes == NULL)
+ return -1;
+
+ if (gl_oset_nx_add (nodes, node) < 0)
+ goto fail;
+ if (gl_oset_nx_add (nodes, new_node) < 0)
+ goto fail;
+
+ multi_entry =
+ (struct gl_multiple_nodes *) malloc (sizeof (struct gl_multiple_nodes));
+ if (multi_entry == NULL)
+ goto fail;
+ multi_entry->h.hash_next = entry->hash_next;
+ multi_entry->h.hashcode = entry->hashcode;
+ multi_entry->magic = MULTIPLE_NODES_MAGIC;
+ multi_entry->nodes = nodes;
+ *entryp = &multi_entry->h;
+ return 0;
+
+ fail:
+ gl_oset_free (nodes);
+ return -1;
+ }
+ }
+ }
+ }
+ }
+ /* If no duplicates are allowed, multiple nodes are not needed. */
+ new_node->h.hash_next = list->table[bucket];
+ list->table[bucket] = &new_node->h;
+ return 0;
+}
+/* Tell GCC that the likely return value is 0. */
+#if __GNUC__ >= 3
+# define add_to_bucket(list,node) \
+ __builtin_expect ((add_to_bucket) (list, node), 0)
+#endif
+
+/* Remove a node from the hash table structure.
+ If duplicates are allowed, this function performs in average time
+ O((log n)^2): gl_oset_remove may need to remove an element from an ordered
+ set of size O(n), needing O(log n) comparison function calls. The
+ comparison function is compare_by_position, which is O(log n) worst-case.
+ If duplicates are forbidden, this function is O(1) on average. */
+static void
+remove_from_bucket (gl_list_t list, gl_list_node_t old_node)
+{
+ size_t bucket = old_node->h.hashcode % list->table_size;
+
+ if (list->base.allow_duplicates)
+ {
+ size_t hashcode = old_node->h.hashcode;
+ const void *value = old_node->value;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_hash_entry_t *entryp;
+
+ for (entryp = &list->table[bucket]; ; entryp = &(*entryp)->hash_next)
+ {
+ gl_hash_entry_t entry = *entryp;
+
+ if (entry == &old_node->h)
+ {
+ /* Found old_node as a single node in the bucket. Remove it. */
+ *entryp = old_node->h.hash_next;
+ break;
+ }
+ if (entry == NULL)
+ /* node is not in the right bucket. Did the hash codes
+ change inadvertently? */
+ abort ();
+ if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC
+ && entry->hashcode == hashcode)
+ {
+ /* An entry representing multiple nodes. */
+ gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+ /* Only the first node is interesting. */
+ gl_list_node_t node = gl_oset_first (nodes);
+ if (equals != NULL ? equals (value, node->value) : value == node->value)
+ {
+ /* Found multiple nodes with the same value.
+ old_node must be one of them. Remove it. */
+ if (!gl_oset_remove (nodes, old_node))
+ abort ();
+ if (gl_oset_size (nodes) == 1)
+ {
+ /* Replace a one-element set with a single node. */
+ node = gl_oset_first (nodes);
+ node->h.hash_next = entry->hash_next;
+ *entryp = &node->h;
+ gl_oset_free (nodes);
+ free (entry);
+ }
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* If no duplicates are allowed, multiple nodes are not needed. */
+ gl_hash_entry_t *entryp;
+
+ for (entryp = &list->table[bucket]; ; entryp = &(*entryp)->hash_next)
+ {
+ if (*entryp == &old_node->h)
+ {
+ *entryp = old_node->h.hash_next;
+ break;
+ }
+ if (*entryp == NULL)
+ /* node is not in the right bucket. Did the hash codes
+ change inadvertently? */
+ abort ();
+ }
+ }
+}
+
+/* Build up the hash table during initialization: Store all the nodes of
+ list->root in the hash table.
+ Return 0 upon success, -1 upon out-of-memory. */
+static inline int
+add_nodes_to_buckets (gl_list_t list)
+{
+ /* Iterate across all nodes. */
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto done;
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ }
+ node = stack_ptr->node;
+ /* Add the current node to the hash table. */
+ node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (node->value)
+ : (size_t)(uintptr_t) node->value);
+ if (add_to_bucket (list, node) < 0)
+ goto fail;
+ /* Descend on right branch. */
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ done:
+ return 0;
+
+ fail:
+ /* Undo everything. */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ /* Descend on right branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto fail_done;
+ stack_ptr--;
+ if (stack_ptr->rightp)
+ break;
+ }
+ node = stack_ptr->node;
+ /* Remove the current node from the hash table. */
+ remove_from_bucket (list, node);
+ }
+ fail_done:
+ return -1;
+}
+/* Tell GCC that the likely return value is 0. */
+#if __GNUC__ >= 3
+# define add_nodes_to_buckets(list) \
+ __builtin_expect ((add_nodes_to_buckets) (list), 0)
+#endif
diff --git a/gnulib/lib/gl_anytreehash_list2.h b/gnulib/lib/gl_anytreehash_list2.h
new file mode 100644
index 00000000..15210e04
--- /dev/null
+++ b/gnulib/lib/gl_anytreehash_list2.h
@@ -0,0 +1,213 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* Common code of gl_avltreehash_list.c and gl_rbtreehash_list.c. */
+
+static gl_list_node_t
+gl_tree_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index
+ && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+ {
+ size_t hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+ size_t bucket = hashcode % list->table_size;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_hash_entry_t entry;
+
+ if (list->base.allow_duplicates)
+ {
+ for (entry = list->table[bucket]; entry != NULL; entry = entry->hash_next)
+ if (entry->hashcode == hashcode)
+ {
+ if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+ {
+ /* An entry representing multiple nodes. */
+ gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+ /* The first node is interesting. */
+ gl_list_node_t node = gl_oset_first (nodes);
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ {
+ /* All nodes in the entry are equal to the given ELT. */
+ if (start_index == 0)
+ {
+ /* We have to return only the one at the minimal
+ position, and this is the first one in the ordered
+ set. */
+ if (end_index == list->root->branch_size
+ || node_position (node) < end_index)
+ return node;
+ }
+ else
+ {
+ /* We have to return only the one at the minimal
+ position >= start_index. */
+ const void *elt;
+ if (gl_oset_search_atleast (nodes,
+ compare_position_threshold,
+ (void *)(uintptr_t)start_index,
+ &elt))
+ {
+ node = (gl_list_node_t) elt;
+ if (end_index == list->root->branch_size
+ || node_position (node) < end_index)
+ return node;
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ /* An entry representing a single node. */
+ gl_list_node_t node = (struct gl_list_node_impl *) entry;
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ {
+ bool position_in_bounds;
+ if (start_index == 0 && end_index == list->root->branch_size)
+ position_in_bounds = true;
+ else
+ {
+ size_t position = node_position (node);
+ position_in_bounds =
+ (position >= start_index && position < end_index);
+ }
+ if (position_in_bounds)
+ return node;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* If no duplicates are allowed, multiple nodes are not needed. */
+ for (entry = list->table[bucket]; entry != NULL; entry = entry->hash_next)
+ if (entry->hashcode == hashcode)
+ {
+ gl_list_node_t node = (struct gl_list_node_impl *) entry;
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ {
+ bool position_in_bounds;
+ if (start_index == 0 && end_index == list->root->branch_size)
+ position_in_bounds = true;
+ else
+ {
+ size_t position = node_position (node);
+ position_in_bounds =
+ (position >= start_index && position < end_index);
+ }
+ if (position_in_bounds)
+ return node;
+ break;
+ }
+ }
+ }
+
+ return NULL;
+ }
+}
+
+static size_t
+gl_tree_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ gl_list_node_t node =
+ gl_tree_search_from_to (list, start_index, end_index, elt);
+
+ if (node != NULL)
+ return node_position (node);
+ else
+ return (size_t)(-1);
+}
+
+static void
+gl_tree_list_free (gl_list_t list)
+{
+ if (list->base.allow_duplicates)
+ {
+ /* Free the ordered sets in the hash buckets. */
+ size_t i;
+
+ for (i = list->table_size; i > 0; )
+ {
+ gl_hash_entry_t entry = list->table[--i];
+
+ while (entry != NULL)
+ {
+ gl_hash_entry_t next = entry->hash_next;
+
+ if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+ {
+ gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+
+ gl_oset_free (nodes);
+ free (entry);
+ }
+
+ entry = next;
+ }
+ }
+ }
+
+ /* Iterate across all elements in post-order. */
+ {
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto done_iterate;
+ stack_ptr--;
+ node = stack_ptr->node;
+ if (!stack_ptr->rightp)
+ break;
+ /* Free the current node. */
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (node->value);
+ free (node);
+ }
+ /* Descend on right branch. */
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ done_iterate:
+ free (list->table);
+ free (list);
+}
diff --git a/gnulib/lib/gl_array_list.c b/gnulib/lib/gl_array_list.c
new file mode 100644
index 00000000..106dc216
--- /dev/null
+++ b/gnulib/lib/gl_array_list.c
@@ -0,0 +1,680 @@
+/* Sequential list data type implemented by an array.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_array_list.h"
+
+#include <stdlib.h>
+/* Get memcpy. */
+#include <string.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+ /* An array of ALLOCATED elements, of which the first COUNT are used.
+ 0 <= COUNT <= ALLOCATED. */
+ const void **elements;
+ size_t count;
+ size_t allocated;
+};
+
+/* struct gl_list_node_impl doesn't exist here. The pointers are actually
+ indices + 1. */
+#define INDEX_TO_NODE(index) (gl_list_node_t)(uintptr_t)(size_t)((index) + 1)
+#define NODE_TO_INDEX(node) ((uintptr_t)(node) - 1)
+
+static gl_list_t
+gl_array_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+ list->elements = NULL;
+ list->count = 0;
+ list->allocated = 0;
+
+ return list;
+}
+
+static gl_list_t
+gl_array_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+ if (count > 0)
+ {
+ if (size_overflow_p (xtimes (count, sizeof (const void *))))
+ goto fail;
+ list->elements = (const void **) malloc (count * sizeof (const void *));
+ if (list->elements == NULL)
+ goto fail;
+ memcpy (list->elements, contents, count * sizeof (const void *));
+ }
+ else
+ list->elements = NULL;
+ list->count = count;
+ list->allocated = count;
+
+ return list;
+
+ fail:
+ free (list);
+ return NULL;
+}
+
+static size_t
+gl_array_size (gl_list_t list)
+{
+ return list->count;
+}
+
+static const void *
+gl_array_node_value (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ return list->elements[index];
+}
+
+static int
+gl_array_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ list->elements[index] = elt;
+ return 0;
+}
+
+static gl_list_node_t
+gl_array_next_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ index++;
+ if (index < list->count)
+ return INDEX_TO_NODE (index);
+ else
+ return NULL;
+}
+
+static gl_list_node_t
+gl_array_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ if (index > 0)
+ return INDEX_TO_NODE (index - 1);
+ else
+ return NULL;
+}
+
+static const void *
+gl_array_get_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ return list->elements[position];
+}
+
+static gl_list_node_t
+gl_array_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ list->elements[position] = elt;
+ return INDEX_TO_NODE (position);
+}
+
+static size_t
+gl_array_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+
+ if (start_index < end_index)
+ {
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ if (equals != NULL)
+ {
+ size_t i;
+
+ for (i = start_index;;)
+ {
+ if (equals (elt, list->elements[i]))
+ return i;
+ i++;
+ if (i == end_index)
+ break;
+ }
+ }
+ else
+ {
+ size_t i;
+
+ for (i = start_index;;)
+ {
+ if (elt == list->elements[i])
+ return i;
+ i++;
+ if (i == end_index)
+ break;
+ }
+ }
+ }
+ return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_array_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t index = gl_array_indexof_from_to (list, start_index, end_index, elt);
+ return INDEX_TO_NODE (index);
+}
+
+/* Ensure that list->allocated > list->count.
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
+grow (gl_list_t list)
+{
+ size_t new_allocated;
+ size_t memory_size;
+ const void **memory;
+
+ new_allocated = xtimes (list->allocated, 2);
+ new_allocated = xsum (new_allocated, 1);
+ memory_size = xtimes (new_allocated, sizeof (const void *));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ return -1;
+ memory = (const void **) realloc (list->elements, memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ return -1;
+ list->elements = memory;
+ list->allocated = new_allocated;
+ return 0;
+}
+
+static gl_list_node_t
+gl_array_nx_add_first (gl_list_t list, const void *elt)
+{
+ size_t count = list->count;
+ const void **elements;
+ size_t i;
+
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ for (i = count; i > 0; i--)
+ elements[i] = elements[i - 1];
+ elements[0] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (0);
+}
+
+static gl_list_node_t
+gl_array_nx_add_last (gl_list_t list, const void *elt)
+{
+ size_t count = list->count;
+
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ list->elements[count] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (count);
+}
+
+static gl_list_node_t
+gl_array_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t position;
+ const void **elements;
+ size_t i;
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ position = index;
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ for (i = count; i > position; i--)
+ elements[i] = elements[i - 1];
+ elements[position] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_array_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t position;
+ const void **elements;
+ size_t i;
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ position = index + 1;
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ for (i = count; i > position; i--)
+ elements[i] = elements[i - 1];
+ elements[position] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_array_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ const void **elements;
+ size_t i;
+
+ if (!(position <= count))
+ /* Invalid argument. */
+ abort ();
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ for (i = count; i > position; i--)
+ elements[i] = elements[i - 1];
+ elements[position] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (position);
+}
+
+static bool
+gl_array_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t position;
+ const void **elements;
+ size_t i;
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ position = index;
+ elements = list->elements;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[position]);
+ for (i = position + 1; i < count; i++)
+ elements[i - 1] = elements[i];
+ list->count = count - 1;
+ return true;
+}
+
+static bool
+gl_array_remove_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ const void **elements;
+ size_t i;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ elements = list->elements;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[position]);
+ for (i = position + 1; i < count; i++)
+ elements[i - 1] = elements[i];
+ list->count = count - 1;
+ return true;
+}
+
+static bool
+gl_array_remove (gl_list_t list, const void *elt)
+{
+ size_t position = gl_array_indexof_from_to (list, 0, list->count, elt);
+ if (position == (size_t)(-1))
+ return false;
+ else
+ return gl_array_remove_at (list, position);
+}
+
+static void
+gl_array_list_free (gl_list_t list)
+{
+ if (list->elements != NULL)
+ {
+ if (list->base.dispose_fn != NULL)
+ {
+ size_t count = list->count;
+
+ if (count > 0)
+ {
+ gl_listelement_dispose_fn dispose = list->base.dispose_fn;
+ const void **elements = list->elements;
+
+ do
+ dispose (*elements++);
+ while (--count > 0);
+ }
+ }
+ free (list->elements);
+ }
+ free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_array_iterator (gl_list_t list)
+{
+ gl_list_iterator_t result;
+
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.count = list->count;
+ result.p = list->elements + 0;
+ result.q = list->elements + list->count;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+#endif
+
+ return result;
+}
+
+static gl_list_iterator_t
+gl_array_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ gl_list_iterator_t result;
+
+ if (!(start_index <= end_index && end_index <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.count = list->count;
+ result.p = list->elements + start_index;
+ result.q = list->elements + end_index;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_array_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ gl_list_t list = iterator->list;
+ if (iterator->count != list->count)
+ {
+ if (iterator->count != list->count + 1)
+ /* Concurrent modifications were done on the list. */
+ abort ();
+ /* The last returned element was removed. */
+ iterator->count--;
+ iterator->p = (const void **) iterator->p - 1;
+ iterator->q = (const void **) iterator->q - 1;
+ }
+ if (iterator->p < iterator->q)
+ {
+ const void **p = (const void **) iterator->p;
+ *eltp = *p;
+ if (nodep != NULL)
+ *nodep = INDEX_TO_NODE (p - list->elements);
+ iterator->p = p + 1;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_array_iterator_free (gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static size_t
+gl_array_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ if (!(low <= high && high <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ if (low < high)
+ {
+ /* At each loop iteration, low < high; for indices < low the values
+ are smaller than ELT; for indices >= high the values are greater
+ than ELT. So, if the element occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ int cmp = compar (list->elements[mid], elt);
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT at index MID. But we need
+ the minimal such index. */
+ high = mid;
+ /* At each loop iteration, low <= high and
+ compar (list->elements[high], elt) == 0,
+ and we know that the first occurrence of the element is at
+ low <= position <= high. */
+ while (low < high)
+ {
+ size_t mid2 = low + (high - low) / 2; /* low <= mid2 < high */
+ int cmp2 = compar (list->elements[mid2], elt);
+
+ if (cmp2 < 0)
+ low = mid2 + 1;
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ if (mid2 == low)
+ break;
+ high = mid2 - 1;
+ }
+ }
+ return low;
+ }
+ }
+ while (low < high);
+ /* Here low == high. */
+ }
+ return (size_t)(-1);
+}
+
+static size_t
+gl_array_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ return gl_array_sortedlist_indexof_from_to (list, compar, 0, list->count,
+ elt);
+}
+
+static gl_list_node_t
+gl_array_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t index =
+ gl_array_sortedlist_indexof_from_to (list, compar, low, high, elt);
+ return INDEX_TO_NODE (index);
+}
+
+static gl_list_node_t
+gl_array_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index =
+ gl_array_sortedlist_indexof_from_to (list, compar, 0, list->count, elt);
+ return INDEX_TO_NODE (index);
+}
+
+static gl_list_node_t
+gl_array_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t count = list->count;
+ size_t low = 0;
+ size_t high = count;
+
+ /* At each loop iteration, low <= high; for indices < low the values are
+ smaller than ELT; for indices >= high the values are greater than ELT. */
+ while (low < high)
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ int cmp = compar (list->elements[mid], elt);
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ {
+ low = mid;
+ break;
+ }
+ }
+ return gl_array_nx_add_at (list, low, elt);
+}
+
+static bool
+gl_array_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index = gl_array_sortedlist_indexof (list, compar, elt);
+ if (index == (size_t)(-1))
+ return false;
+ else
+ return gl_array_remove_at (list, index);
+}
+
+
+const struct gl_list_implementation gl_array_list_implementation =
+ {
+ gl_array_nx_create_empty,
+ gl_array_nx_create,
+ gl_array_size,
+ gl_array_node_value,
+ gl_array_node_nx_set_value,
+ gl_array_next_node,
+ gl_array_previous_node,
+ gl_array_get_at,
+ gl_array_nx_set_at,
+ gl_array_search_from_to,
+ gl_array_indexof_from_to,
+ gl_array_nx_add_first,
+ gl_array_nx_add_last,
+ gl_array_nx_add_before,
+ gl_array_nx_add_after,
+ gl_array_nx_add_at,
+ gl_array_remove_node,
+ gl_array_remove_at,
+ gl_array_remove,
+ gl_array_list_free,
+ gl_array_iterator,
+ gl_array_iterator_from_to,
+ gl_array_iterator_next,
+ gl_array_iterator_free,
+ gl_array_sortedlist_search,
+ gl_array_sortedlist_search_from_to,
+ gl_array_sortedlist_indexof,
+ gl_array_sortedlist_indexof_from_to,
+ gl_array_sortedlist_nx_add,
+ gl_array_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_array_list.h b/gnulib/lib/gl_array_list.h
new file mode 100644
index 00000000..a763bca4
--- /dev/null
+++ b/gnulib/lib/gl_array_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by an array.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_ARRAY_LIST_H
+#define _GL_ARRAY_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_array_list_implementation;
+#define GL_ARRAY_LIST &gl_array_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_ARRAY_LIST_H */
diff --git a/gnulib/lib/gl_array_oset.c b/gnulib/lib/gl_array_oset.c
new file mode 100644
index 00000000..a6d4584c
--- /dev/null
+++ b/gnulib/lib/gl_array_oset.c
@@ -0,0 +1,357 @@
+/* Ordered set data type implemented by an array.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_array_oset.h"
+
+#include <stdlib.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Concrete gl_oset_impl type, valid for this file only. */
+struct gl_oset_impl
+{
+ struct gl_oset_impl_base base;
+ /* An array of ALLOCATED elements, of which the first COUNT are used.
+ 0 <= COUNT <= ALLOCATED. */
+ const void **elements;
+ size_t count;
+ size_t allocated;
+};
+
+static gl_oset_t
+gl_array_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ struct gl_oset_impl *set =
+ (struct gl_oset_impl *) malloc (sizeof (struct gl_oset_impl));
+
+ if (set == NULL)
+ return NULL;
+
+ set->base.vtable = implementation;
+ set->base.compar_fn = compar_fn;
+ set->base.dispose_fn = dispose_fn;
+ set->elements = NULL;
+ set->count = 0;
+ set->allocated = 0;
+
+ return set;
+}
+
+static size_t
+gl_array_size (gl_oset_t set)
+{
+ return set->count;
+}
+
+static size_t
+gl_array_indexof (gl_oset_t set, const void *elt)
+{
+ size_t count = set->count;
+
+ if (count > 0)
+ {
+ gl_setelement_compar_fn compar = set->base.compar_fn;
+ size_t low = 0;
+ size_t high = count;
+
+ /* At each loop iteration, low < high; for indices < low the values
+ are smaller than ELT; for indices >= high the values are greater
+ than ELT. So, if the element occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ int cmp = (compar != NULL
+ ? compar (set->elements[mid], elt)
+ : (set->elements[mid] > elt ? 1 :
+ set->elements[mid] < elt ? -1 : 0));
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ /* We have an element equal to ELT at index MID. */
+ return mid;
+ }
+ while (low < high);
+ }
+ return (size_t)(-1);
+}
+
+static bool
+gl_array_search (gl_oset_t set, const void *elt)
+{
+ return gl_array_indexof (set, elt) != (size_t)(-1);
+}
+
+static bool
+gl_array_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold,
+ const void **eltp)
+{
+ size_t count = set->count;
+
+ if (count > 0)
+ {
+ size_t low = 0;
+ size_t high = count;
+
+ /* At each loop iteration, low < high; for indices < low the values are
+ smaller than THRESHOLD; for indices >= high the values are nonexistent.
+ So, if an element >= THRESHOLD occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+
+ if (! threshold_fn (set->elements[mid], threshold))
+ low = mid + 1;
+ else
+ {
+ /* We have an element >= THRESHOLD at index MID. But we need the
+ minimal such index. */
+ high = mid;
+ /* At each loop iteration, low <= high and
+ compar (list->elements[high], value) >= 0,
+ and we know that the first occurrence of the element is at
+ low <= position <= high. */
+ while (low < high)
+ {
+ size_t mid2 = low + (high - low) / 2; /* low <= mid2 < high */
+
+ if (! threshold_fn (set->elements[mid2], threshold))
+ low = mid2 + 1;
+ else
+ high = mid2;
+ }
+ *eltp = set->elements[low];
+ return true;
+ }
+ }
+ while (low < high);
+ }
+ return false;
+}
+
+/* Ensure that set->allocated > set->count.
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
+grow (gl_oset_t set)
+{
+ size_t new_allocated;
+ size_t memory_size;
+ const void **memory;
+
+ new_allocated = xtimes (set->allocated, 2);
+ new_allocated = xsum (new_allocated, 1);
+ memory_size = xtimes (new_allocated, sizeof (const void *));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ return -1;
+ memory = (const void **) realloc (set->elements, memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ return -1;
+ set->elements = memory;
+ set->allocated = new_allocated;
+ return 0;
+}
+
+/* Add the given element ELT at the given position,
+ 0 <= position <= gl_oset_size (set).
+ Return 1 upon success, -1 upon out-of-memory. */
+static inline int
+gl_array_nx_add_at (gl_oset_t set, size_t position, const void *elt)
+{
+ size_t count = set->count;
+ const void **elements;
+ size_t i;
+
+ if (count == set->allocated)
+ if (grow (set) < 0)
+ return -1;
+ elements = set->elements;
+ for (i = count; i > position; i--)
+ elements[i] = elements[i - 1];
+ elements[position] = elt;
+ set->count = count + 1;
+ return 1;
+}
+
+/* Remove the element at the given position,
+ 0 <= position < gl_oset_size (set). */
+static inline void
+gl_array_remove_at (gl_oset_t set, size_t position)
+{
+ size_t count = set->count;
+ const void **elements;
+ size_t i;
+
+ elements = set->elements;
+ if (set->base.dispose_fn != NULL)
+ set->base.dispose_fn (elements[position]);
+ for (i = position + 1; i < count; i++)
+ elements[i - 1] = elements[i];
+ set->count = count - 1;
+}
+
+static int
+gl_array_nx_add (gl_oset_t set, const void *elt)
+{
+ size_t count = set->count;
+ size_t low = 0;
+
+ if (count > 0)
+ {
+ gl_setelement_compar_fn compar = set->base.compar_fn;
+ size_t high = count;
+
+ /* At each loop iteration, low < high; for indices < low the values
+ are smaller than ELT; for indices >= high the values are greater
+ than ELT. So, if the element occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ int cmp = (compar != NULL
+ ? compar (set->elements[mid], elt)
+ : (set->elements[mid] > elt ? 1 :
+ set->elements[mid] < elt ? -1 : 0));
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ return false;
+ }
+ while (low < high);
+ }
+ return gl_array_nx_add_at (set, low, elt);
+}
+
+static bool
+gl_array_remove (gl_oset_t set, const void *elt)
+{
+ size_t index = gl_array_indexof (set, elt);
+ if (index != (size_t)(-1))
+ {
+ gl_array_remove_at (set, index);
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_array_free (gl_oset_t set)
+{
+ if (set->elements != NULL)
+ {
+ if (set->base.dispose_fn != NULL)
+ {
+ size_t count = set->count;
+
+ if (count > 0)
+ {
+ gl_setelement_dispose_fn dispose = set->base.dispose_fn;
+ const void **elements = set->elements;
+
+ do
+ dispose (*elements++);
+ while (--count > 0);
+ }
+ }
+ free (set->elements);
+ }
+ free (set);
+}
+
+/* --------------------- gl_oset_iterator_t Data Type --------------------- */
+
+static gl_oset_iterator_t
+gl_array_iterator (gl_oset_t set)
+{
+ gl_oset_iterator_t result;
+
+ result.vtable = set->base.vtable;
+ result.set = set;
+ result.count = set->count;
+ result.p = set->elements + 0;
+ result.q = set->elements + set->count;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_array_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+ gl_oset_t set = iterator->set;
+ if (iterator->count != set->count)
+ {
+ if (iterator->count != set->count + 1)
+ /* Concurrent modifications were done on the set. */
+ abort ();
+ /* The last returned element was removed. */
+ iterator->count--;
+ iterator->p = (const void **) iterator->p - 1;
+ iterator->q = (const void **) iterator->q - 1;
+ }
+ if (iterator->p < iterator->q)
+ {
+ const void **p = (const void **) iterator->p;
+ *eltp = *p;
+ iterator->p = p + 1;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_array_iterator_free (gl_oset_iterator_t *iterator)
+{
+}
+
+
+const struct gl_oset_implementation gl_array_oset_implementation =
+ {
+ gl_array_nx_create_empty,
+ gl_array_size,
+ gl_array_search,
+ gl_array_search_atleast,
+ gl_array_nx_add,
+ gl_array_remove,
+ gl_array_free,
+ gl_array_iterator,
+ gl_array_iterator_next,
+ gl_array_iterator_free
+ };
diff --git a/gnulib/lib/gl_array_oset.h b/gnulib/lib/gl_array_oset.h
new file mode 100644
index 00000000..190a96bd
--- /dev/null
+++ b/gnulib/lib/gl_array_oset.h
@@ -0,0 +1,34 @@
+/* Ordered set data type implemented by an array.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_ARRAY_OSET_H
+#define _GL_ARRAY_OSET_H
+
+#include "gl_oset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_oset_implementation gl_array_oset_implementation;
+#define GL_ARRAY_OSET &gl_array_oset_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_ARRAY_OSET_H */
diff --git a/gnulib/lib/gl_avltree_list.c b/gnulib/lib/gl_avltree_list.c
new file mode 100644
index 00000000..1d838f80
--- /dev/null
+++ b/gnulib/lib/gl_avltree_list.c
@@ -0,0 +1,101 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_avltree_list.h"
+
+#include <stdlib.h>
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic AVL tree code. */
+#include "gl_anyavltree_list1.h"
+
+/* Generic binary tree code. */
+#include "gl_anytree_list1.h"
+
+/* Generic AVL tree code. */
+#include "gl_anyavltree_list2.h"
+
+/* Generic binary tree code. */
+#include "gl_anytree_list2.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+ unsigned int left_height =
+ (node->left != NULL ? check_invariants (node->left, node) : 0);
+ unsigned int right_height =
+ (node->right != NULL ? check_invariants (node->right, node) : 0);
+ int balance = (int)right_height - (int)left_height;
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->branch_size
+ == (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+ abort ();
+ if (!(balance >= -1 && balance <= 1))
+ abort ();
+ if (!(node->balance == balance))
+ abort ();
+
+ return 1 + (left_height > right_height ? left_height : right_height);
+}
+void
+gl_avltree_list_check_invariants (gl_list_t list)
+{
+ if (list->root != NULL)
+ check_invariants (list->root, NULL);
+}
+
+const struct gl_list_implementation gl_avltree_list_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_nx_create,
+ gl_tree_size,
+ gl_tree_node_value,
+ gl_tree_node_nx_set_value,
+ gl_tree_next_node,
+ gl_tree_previous_node,
+ gl_tree_get_at,
+ gl_tree_nx_set_at,
+ gl_tree_search_from_to,
+ gl_tree_indexof_from_to,
+ gl_tree_nx_add_first,
+ gl_tree_nx_add_last,
+ gl_tree_nx_add_before,
+ gl_tree_nx_add_after,
+ gl_tree_nx_add_at,
+ gl_tree_remove_node,
+ gl_tree_remove_at,
+ gl_tree_remove,
+ gl_tree_list_free,
+ gl_tree_iterator,
+ gl_tree_iterator_from_to,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free,
+ gl_tree_sortedlist_search,
+ gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof,
+ gl_tree_sortedlist_indexof_from_to,
+ gl_tree_sortedlist_nx_add,
+ gl_tree_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_avltree_list.h b/gnulib/lib/gl_avltree_list.h
new file mode 100644
index 00000000..782637e2
--- /dev/null
+++ b/gnulib/lib/gl_avltree_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_AVLTREE_LIST_H
+#define _GL_AVLTREE_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_avltree_list_implementation;
+#define GL_AVLTREE_LIST &gl_avltree_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_AVLTREE_LIST_H */
diff --git a/gnulib/lib/gl_avltree_oset.c b/gnulib/lib/gl_avltree_oset.c
new file mode 100644
index 00000000..f566d557
--- /dev/null
+++ b/gnulib/lib/gl_avltree_oset.c
@@ -0,0 +1,583 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_avltree_oset.h"
+
+#include <stdlib.h>
+
+/* An AVL tree is a binary tree where
+ 1. The height of each node is calculated as
+ heightof(node) = 1 + max (heightof(node.left), heightof(node.right)).
+ 2. The heights of the subtrees of each node differ by at most 1:
+ | heightof(right) - heightof(left) | <= 1.
+ 3. The index of the elements in the node.left subtree are smaller than
+ the index of node.
+ The index of the elements in the node.right subtree are larger than
+ the index of node.
+ */
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Tree node implementation, valid for this file only. */
+struct gl_oset_node_impl
+{
+ struct gl_oset_node_impl *left; /* left branch, or NULL */
+ struct gl_oset_node_impl *right; /* right branch, or NULL */
+ /* Parent pointer, or NULL. The parent pointer is not needed for most
+ operations. It is needed so that a gl_oset_node_t can be returned
+ without memory allocation, on which the functions gl_oset_remove_node,
+ gl_oset_add_before, gl_oset_add_after can be implemented. */
+ struct gl_oset_node_impl *parent;
+ int balance; /* heightof(right) - heightof(left),
+ always = -1 or 0 or 1 */
+ const void *value;
+};
+typedef struct gl_oset_node_impl * gl_oset_node_t;
+
+/* Concrete gl_oset_impl type, valid for this file only. */
+struct gl_oset_impl
+{
+ struct gl_oset_impl_base base;
+ struct gl_oset_node_impl *root; /* root node or NULL */
+ size_t count; /* number of nodes */
+};
+
+/* An AVL tree of height h has at least F_(h+2) [Fibonacci number] and at most
+ 2^h - 1 elements. So, h <= 84 (because a tree of height h >= 85 would have
+ at least F_87 elements, and because even on 64-bit machines,
+ sizeof (gl_oset_node_impl) * F_87 > 2^64
+ this would exceed the address space of the machine. */
+#define MAXHEIGHT 83
+
+/* Ensure the tree is balanced, after an insertion or deletion operation.
+ The height of NODE is incremented by HEIGHT_DIFF (1 or -1).
+ PARENT = NODE->parent. (NODE can also be NULL. But PARENT is non-NULL.)
+ Rotation operations are performed starting at PARENT (not NODE itself!). */
+static void
+rebalance (gl_oset_t set,
+ gl_oset_node_t node, int height_diff, gl_oset_node_t parent)
+{
+ for (;;)
+ {
+ gl_oset_node_t child;
+ int previous_balance;
+ int balance_diff;
+ gl_oset_node_t nodeleft;
+ gl_oset_node_t noderight;
+
+ child = node;
+ node = parent;
+
+ previous_balance = node->balance;
+
+ /* The balance of NODE is incremented by BALANCE_DIFF: +1 if the right
+ branch's height has increased by 1 or the left branch's height has
+ decreased by 1, -1 if the right branch's height has decreased by 1 or
+ the left branch's height has increased by 1, 0 if no height change. */
+ if (node->left != NULL || node->right != NULL)
+ balance_diff = (child == node->right ? height_diff : -height_diff);
+ else
+ /* Special case where above formula doesn't work, because the caller
+ didn't tell whether node's left or right branch shrunk from height 1
+ to NULL. */
+ balance_diff = - previous_balance;
+
+ node->balance += balance_diff;
+ if (balance_diff == previous_balance)
+ {
+ /* node->balance is outside the range [-1,1]. Must rotate. */
+ gl_oset_node_t *nodep;
+
+ if (node->parent == NULL)
+ /* node == set->root */
+ nodep = &set->root;
+ else if (node->parent->left == node)
+ nodep = &node->parent->left;
+ else if (node->parent->right == node)
+ nodep = &node->parent->right;
+ else
+ abort ();
+
+ nodeleft = node->left;
+ noderight = node->right;
+
+ if (balance_diff < 0)
+ {
+ /* node->balance = -2. The subtree is heavier on the left side.
+ Rotate from left to right:
+
+ *
+ / \
+ h+2 h
+ */
+ gl_oset_node_t nodeleftright = nodeleft->right;
+ if (nodeleft->balance <= 0)
+ {
+ /*
+ * h+2|h+3
+ / \ / \
+ h+2 h --> / h+1|h+2
+ / \ | / \
+ h+1 h|h+1 h+1 h|h+1 h
+ */
+ node->left = nodeleftright;
+ nodeleft->right = node;
+
+ nodeleft->parent = node->parent;
+ node->parent = nodeleft;
+ if (nodeleftright != NULL)
+ nodeleftright->parent = node;
+
+ nodeleft->balance += 1;
+ node->balance = - nodeleft->balance;
+
+ *nodep = nodeleft;
+ height_diff = (height_diff < 0
+ ? /* noderight's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2|h+3. */
+ nodeleft->balance - 1
+ : /* nodeleft's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2|h+3. */
+ nodeleft->balance);
+ }
+ else
+ {
+ /*
+ * h+2
+ / \ / \
+ h+2 h --> h+1 h+1
+ / \ / \ / \
+ h h+1 h L R h
+ / \
+ L R
+
+ */
+ gl_oset_node_t L = nodeleft->right = nodeleftright->left;
+ gl_oset_node_t R = node->left = nodeleftright->right;
+ nodeleftright->left = nodeleft;
+ nodeleftright->right = node;
+
+ nodeleftright->parent = node->parent;
+ if (L != NULL)
+ L->parent = nodeleft;
+ if (R != NULL)
+ R->parent = node;
+ nodeleft->parent = nodeleftright;
+ node->parent = nodeleftright;
+
+ nodeleft->balance = (nodeleftright->balance > 0 ? -1 : 0);
+ node->balance = (nodeleftright->balance < 0 ? 1 : 0);
+ nodeleftright->balance = 0;
+
+ *nodep = nodeleftright;
+ height_diff = (height_diff < 0
+ ? /* noderight's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2. */
+ -1
+ : /* nodeleft's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2. */
+ 0);
+ }
+ }
+ else
+ {
+ /* node->balance = 2. The subtree is heavier on the right side.
+ Rotate from right to left:
+
+ *
+ / \
+ h h+2
+ */
+ gl_oset_node_t noderightleft = noderight->left;
+ if (noderight->balance >= 0)
+ {
+ /*
+ * h+2|h+3
+ / \ / \
+ h h+2 --> h+1|h+2 \
+ / \ / \ |
+ h|h+1 h+1 h h|h+1 h+1
+ */
+ node->right = noderightleft;
+ noderight->left = node;
+
+ noderight->parent = node->parent;
+ node->parent = noderight;
+ if (noderightleft != NULL)
+ noderightleft->parent = node;
+
+ noderight->balance -= 1;
+ node->balance = - noderight->balance;
+
+ *nodep = noderight;
+ height_diff = (height_diff < 0
+ ? /* nodeleft's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2|h+3. */
+ - noderight->balance - 1
+ : /* noderight's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2|h+3. */
+ - noderight->balance);
+ }
+ else
+ {
+ /*
+ * h+2
+ / \ / \
+ h h+2 --> h+1 h+1
+ / \ / \ / \
+ h+1 h h L R h
+ / \
+ L R
+
+ */
+ gl_oset_node_t L = node->right = noderightleft->left;
+ gl_oset_node_t R = noderight->left = noderightleft->right;
+ noderightleft->left = node;
+ noderightleft->right = noderight;
+
+ noderightleft->parent = node->parent;
+ if (L != NULL)
+ L->parent = node;
+ if (R != NULL)
+ R->parent = noderight;
+ node->parent = noderightleft;
+ noderight->parent = noderightleft;
+
+ node->balance = (noderightleft->balance > 0 ? -1 : 0);
+ noderight->balance = (noderightleft->balance < 0 ? 1 : 0);
+ noderightleft->balance = 0;
+
+ *nodep = noderightleft;
+ height_diff = (height_diff < 0
+ ? /* nodeleft's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2. */
+ -1
+ : /* noderight's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2. */
+ 0);
+ }
+ }
+ node = *nodep;
+ }
+ else
+ {
+ /* No rotation needed. Only propagation of the height change to the
+ next higher level. */
+ if (height_diff < 0)
+ height_diff = (previous_balance == 0 ? 0 : -1);
+ else
+ height_diff = (node->balance == 0 ? 0 : 1);
+ }
+
+ if (height_diff == 0)
+ break;
+
+ parent = node->parent;
+ if (parent == NULL)
+ break;
+ }
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_first (gl_oset_t set, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (set->root == NULL)
+ {
+ set->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_oset_node_t node;
+
+ for (node = set->root; node->left != NULL; )
+ node = node->left;
+
+ node->left = new_node;
+ new_node->parent = node;
+ node->balance--;
+
+ /* Rebalance. */
+ if (node->right == NULL && node->parent != NULL)
+ rebalance (set, node, 1, node->parent);
+ }
+
+ set->count++;
+ return new_node;
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_before (gl_oset_t set, gl_oset_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+ bool height_inc;
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (node->left == NULL)
+ {
+ node->left = new_node;
+ node->balance--;
+ height_inc = (node->right == NULL);
+ }
+ else
+ {
+ for (node = node->left; node->right != NULL; )
+ node = node->right;
+ node->right = new_node;
+ node->balance++;
+ height_inc = (node->left == NULL);
+ }
+ new_node->parent = node;
+
+ /* Rebalance. */
+ if (height_inc && node->parent != NULL)
+ rebalance (set, node, 1, node->parent);
+
+ set->count++;
+ return new_node;
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_after (gl_oset_t set, gl_oset_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+ bool height_inc;
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (node->right == NULL)
+ {
+ node->right = new_node;
+ node->balance++;
+ height_inc = (node->left == NULL);
+ }
+ else
+ {
+ for (node = node->right; node->left != NULL; )
+ node = node->left;
+ node->left = new_node;
+ node->balance--;
+ height_inc = (node->right == NULL);
+ }
+ new_node->parent = node;
+
+ /* Rebalance. */
+ if (height_inc && node->parent != NULL)
+ rebalance (set, node, 1, node->parent);
+
+ set->count++;
+ return new_node;
+}
+
+static bool
+gl_tree_remove_node (gl_oset_t set, gl_oset_node_t node)
+{
+ gl_oset_node_t parent = node->parent;
+
+ if (node->left == NULL)
+ {
+ /* Replace node with node->right. */
+ gl_oset_node_t child = node->right;
+
+ if (child != NULL)
+ child->parent = parent;
+ if (parent == NULL)
+ set->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ rebalance (set, child, -1, parent);
+ }
+ }
+ else if (node->right == NULL)
+ {
+ /* It is not absolutely necessary to treat this case. But the more
+ general case below is more complicated, hence slower. */
+ /* Replace node with node->left. */
+ gl_oset_node_t child = node->left;
+
+ child->parent = parent;
+ if (parent == NULL)
+ set->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ rebalance (set, child, -1, parent);
+ }
+ }
+ else
+ {
+ /* Replace node with the rightmost element of the node->left subtree. */
+ gl_oset_node_t subst;
+ gl_oset_node_t subst_parent;
+ gl_oset_node_t child;
+
+ for (subst = node->left; subst->right != NULL; )
+ subst = subst->right;
+
+ subst_parent = subst->parent;
+
+ child = subst->left;
+
+ /* The case subst_parent == node is special: If we do nothing special,
+ we get confusion about node->left, subst->left and child->parent.
+ subst_parent == node
+ <==> The 'for' loop above terminated immediately.
+ <==> subst == subst_parent->left
+ [otherwise subst == subst_parent->right]
+ In this case, we would need to first set
+ child->parent = node; node->left = child;
+ and later - when we copy subst into node's position - again
+ child->parent = subst; subst->left = child;
+ Altogether a no-op. */
+ if (subst_parent != node)
+ {
+ if (child != NULL)
+ child->parent = subst_parent;
+ subst_parent->right = child;
+ }
+
+ /* Copy subst into node's position.
+ (This is safer than to copy subst's value into node, keep node in
+ place, and free subst.) */
+ if (subst_parent != node)
+ {
+ subst->left = node->left;
+ subst->left->parent = subst;
+ }
+ subst->right = node->right;
+ subst->right->parent = subst;
+ subst->balance = node->balance;
+ subst->parent = parent;
+ if (parent == NULL)
+ set->root = subst;
+ else if (parent->left == node)
+ parent->left = subst;
+ else /* parent->right == node */
+ parent->right = subst;
+
+ /* Rebalancing starts at child's parent, that is subst_parent -
+ except when subst_parent == node. In this case, we need to use
+ its replacement, subst. */
+ rebalance (set, child, -1, subst_parent != node ? subst_parent : subst);
+ }
+
+ set->count--;
+ if (set->base.dispose_fn != NULL)
+ set->base.dispose_fn (node->value);
+ free (node);
+ return true;
+}
+
+/* Generic binary tree code. */
+#include "gl_anytree_oset.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_oset_node_t node, gl_oset_node_t parent, size_t *counterp)
+{
+ unsigned int left_height =
+ (node->left != NULL ? check_invariants (node->left, node, counterp) : 0);
+ unsigned int right_height =
+ (node->right != NULL ? check_invariants (node->right, node, counterp) : 0);
+ int balance = (int)right_height - (int)left_height;
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(balance >= -1 && balance <= 1))
+ abort ();
+ if (!(node->balance == balance))
+ abort ();
+
+ (*counterp)++;
+
+ return 1 + (left_height > right_height ? left_height : right_height);
+}
+void
+gl_avltree_oset_check_invariants (gl_oset_t set)
+{
+ size_t counter = 0;
+ if (set->root != NULL)
+ check_invariants (set->root, NULL, &counter);
+ if (!(set->count == counter))
+ abort ();
+}
+
+const struct gl_oset_implementation gl_avltree_oset_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_size,
+ gl_tree_search,
+ gl_tree_search_atleast,
+ gl_tree_nx_add,
+ gl_tree_remove,
+ gl_tree_oset_free,
+ gl_tree_iterator,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free
+ };
diff --git a/gnulib/lib/gl_avltree_oset.h b/gnulib/lib/gl_avltree_oset.h
new file mode 100644
index 00000000..4f5ea78e
--- /dev/null
+++ b/gnulib/lib/gl_avltree_oset.h
@@ -0,0 +1,34 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_AVLTREE_OSET_H
+#define _GL_AVLTREE_OSET_H
+
+#include "gl_oset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_oset_implementation gl_avltree_oset_implementation;
+#define GL_AVLTREE_OSET &gl_avltree_oset_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_AVLTREE_OSET_H */
diff --git a/gnulib/lib/gl_avltreehash_list.c b/gnulib/lib/gl_avltreehash_list.c
new file mode 100644
index 00000000..ce68a03d
--- /dev/null
+++ b/gnulib/lib/gl_avltreehash_list.c
@@ -0,0 +1,127 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_avltreehash_list.h"
+
+#include <stdint.h> /* for SIZE_MAX */
+#include <stdlib.h>
+
+#include "gl_avltree_oset.h"
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+#define WITH_HASHTABLE 1
+
+/* Which kind of binary trees to use for ordered sets. Quite arbitrary. */
+#define OSET_TREE_FLAVOR GL_AVLTREE_OSET
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic hash-table code: Type definitions. */
+#include "gl_anyhash_list1.h"
+
+/* Generic AVL tree code: Type definitions. */
+#include "gl_anyavltree_list1.h"
+
+/* Generic hash-table code: Low-level code. */
+#include "gl_anyhash_list2.h"
+
+/* Generic binary tree code: Type definitions. */
+#include "gl_anytree_list1.h"
+
+/* Hash-table with binary tree code: Handling of hash buckets. */
+#include "gl_anytreehash_list1.h"
+
+/* Generic AVL tree code: Insertion/deletion algorithms. */
+#include "gl_anyavltree_list2.h"
+
+/* Generic binary tree code: Functions taking advantage of the hash table. */
+#include "gl_anytreehash_list2.h"
+
+/* Generic binary tree code: All other functions. */
+#include "gl_anytree_list2.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+ unsigned int left_height =
+ (node->left != NULL ? check_invariants (node->left, node) : 0);
+ unsigned int right_height =
+ (node->right != NULL ? check_invariants (node->right, node) : 0);
+ int balance = (int)right_height - (int)left_height;
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->branch_size
+ == (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+ abort ();
+ if (!(balance >= -1 && balance <= 1))
+ abort ();
+ if (!(node->balance == balance))
+ abort ();
+
+ return 1 + (left_height > right_height ? left_height : right_height);
+}
+void
+gl_avltreehash_list_check_invariants (gl_list_t list)
+{
+ if (list->root != NULL)
+ check_invariants (list->root, NULL);
+}
+
+
+const struct gl_list_implementation gl_avltreehash_list_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_nx_create,
+ gl_tree_size,
+ gl_tree_node_value,
+ gl_tree_node_nx_set_value,
+ gl_tree_next_node,
+ gl_tree_previous_node,
+ gl_tree_get_at,
+ gl_tree_nx_set_at,
+ gl_tree_search_from_to,
+ gl_tree_indexof_from_to,
+ gl_tree_nx_add_first,
+ gl_tree_nx_add_last,
+ gl_tree_nx_add_before,
+ gl_tree_nx_add_after,
+ gl_tree_nx_add_at,
+ gl_tree_remove_node,
+ gl_tree_remove_at,
+ gl_tree_remove,
+ gl_tree_list_free,
+ gl_tree_iterator,
+ gl_tree_iterator_from_to,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free,
+ gl_tree_sortedlist_search,
+ gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof,
+ gl_tree_sortedlist_indexof_from_to,
+ gl_tree_sortedlist_nx_add,
+ gl_tree_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_avltreehash_list.h b/gnulib/lib/gl_avltreehash_list.h
new file mode 100644
index 00000000..2aa82cde
--- /dev/null
+++ b/gnulib/lib/gl_avltreehash_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_AVLTREEHASH_LIST_H
+#define _GL_AVLTREEHASH_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_avltreehash_list_implementation;
+#define GL_AVLTREEHASH_LIST &gl_avltreehash_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_AVLTREEHASH_LIST_H */
diff --git a/gnulib/lib/gl_carray_list.c b/gnulib/lib/gl_carray_list.c
new file mode 100644
index 00000000..e108926f
--- /dev/null
+++ b/gnulib/lib/gl_carray_list.c
@@ -0,0 +1,873 @@
+/* Sequential list data type implemented by a circular array.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_carray_list.h"
+
+#include <stdlib.h>
+/* Get memcpy. */
+#include <string.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+ /* An array of ALLOCATED elements, of which the elements
+ OFFSET, (OFFSET + 1) % ALLOCATED, ..., (OFFSET + COUNT - 1) % ALLOCATED
+ are used. 0 <= COUNT <= ALLOCATED. Either OFFSET = ALLOCATED = 0 or
+ 0 <= OFFSET < ALLOCATED. */
+ const void **elements;
+ size_t offset;
+ size_t count;
+ size_t allocated;
+};
+
+/* struct gl_list_node_impl doesn't exist here. The pointers are actually
+ indices + 1. */
+#define INDEX_TO_NODE(index) (gl_list_node_t)(uintptr_t)(size_t)((index) + 1)
+#define NODE_TO_INDEX(node) ((uintptr_t)(node) - 1)
+
+static gl_list_t
+gl_carray_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+ list->elements = NULL;
+ list->offset = 0;
+ list->count = 0;
+ list->allocated = 0;
+
+ return list;
+}
+
+static gl_list_t
+gl_carray_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+ if (count > 0)
+ {
+ if (size_overflow_p (xtimes (count, sizeof (const void *))))
+ goto fail;
+ list->elements = (const void **) malloc (count * sizeof (const void *));
+ if (list->elements == NULL)
+ goto fail;
+ memcpy (list->elements, contents, count * sizeof (const void *));
+ }
+ else
+ list->elements = NULL;
+ list->offset = 0;
+ list->count = count;
+ list->allocated = count;
+
+ return list;
+
+ fail:
+ free (list);
+ return NULL;
+}
+
+static size_t
+gl_carray_size (gl_list_t list)
+{
+ return list->count;
+}
+
+static const void *
+gl_carray_node_value (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t i;
+
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ i = list->offset + index;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ return list->elements[i];
+}
+
+static int
+gl_carray_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t i;
+
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ i = list->offset + index;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ list->elements[i] = elt;
+ return 0;
+}
+
+static gl_list_node_t
+gl_carray_next_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ index++;
+ if (index < list->count)
+ return INDEX_TO_NODE (index);
+ else
+ return NULL;
+}
+
+static gl_list_node_t
+gl_carray_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ if (index > 0)
+ return INDEX_TO_NODE (index - 1);
+ else
+ return NULL;
+}
+
+static const void *
+gl_carray_get_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ size_t i;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ i = list->offset + position;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ return list->elements[i];
+}
+
+static gl_list_node_t
+gl_carray_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ size_t i;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ i = list->offset + position;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ list->elements[i] = elt;
+ return INDEX_TO_NODE (position);
+}
+
+static size_t
+gl_carray_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+
+ if (start_index < end_index)
+ {
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ size_t allocated = list->allocated;
+ size_t i_end;
+
+ i_end = list->offset + end_index;
+ if (i_end >= allocated)
+ i_end -= allocated;
+
+ if (equals != NULL)
+ {
+ size_t i;
+
+ i = list->offset + start_index;
+ if (i >= allocated) /* can only happen if start_index > 0 */
+ i -= allocated;
+
+ for (;;)
+ {
+ if (equals (elt, list->elements[i]))
+ return (i >= list->offset ? i : i + allocated) - list->offset;
+ i++;
+ if (i == allocated)
+ i = 0;
+ if (i == i_end)
+ break;
+ }
+ }
+ else
+ {
+ size_t i;
+
+ i = list->offset + start_index;
+ if (i >= allocated) /* can only happen if start_index > 0 */
+ i -= allocated;
+
+ for (;;)
+ {
+ if (elt == list->elements[i])
+ return (i >= list->offset ? i : i + allocated) - list->offset;
+ i++;
+ if (i == allocated)
+ i = 0;
+ if (i == i_end)
+ break;
+ }
+ }
+ }
+ return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_carray_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t index = gl_carray_indexof_from_to (list, start_index, end_index, elt);
+ return INDEX_TO_NODE (index);
+}
+
+/* Ensure that list->allocated > list->count.
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
+grow (gl_list_t list)
+{
+ size_t new_allocated;
+ size_t memory_size;
+ const void **memory;
+
+ new_allocated = xtimes (list->allocated, 2);
+ new_allocated = xsum (new_allocated, 1);
+ memory_size = xtimes (new_allocated, sizeof (const void *));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ return -1;
+ if (list->offset > 0 && list->count > 0)
+ {
+ memory = (const void **) malloc (memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ return -1;
+ if (list->offset + list->count > list->allocated)
+ {
+ memcpy (memory, &list->elements[list->offset],
+ (list->allocated - list->offset) * sizeof (const void *));
+ memcpy (memory + (list->allocated - list->offset), list->elements,
+ (list->offset + list->count - list->allocated)
+ * sizeof (const void *));
+
+ }
+ else
+ memcpy (memory, &list->elements[list->offset],
+ list->count * sizeof (const void *));
+ if (list->elements != NULL)
+ free (list->elements);
+ }
+ else
+ {
+ memory = (const void **) realloc (list->elements, memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ return -1;
+ }
+ list->elements = memory;
+ list->offset = 0;
+ list->allocated = new_allocated;
+ return 0;
+}
+
+static gl_list_node_t
+gl_carray_nx_add_first (gl_list_t list, const void *elt)
+{
+ size_t count = list->count;
+
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ list->offset = (list->offset == 0 ? list->allocated : list->offset) - 1;
+ list->elements[list->offset] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (0);
+}
+
+static gl_list_node_t
+gl_carray_nx_add_last (gl_list_t list, const void *elt)
+{
+ size_t count = list->count;
+ size_t i;
+
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ i = list->offset + count;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ list->elements[i] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (count);
+}
+
+static gl_list_node_t
+gl_carray_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ const void **elements;
+
+ if (!(position <= count))
+ /* Invalid argument. */
+ abort ();
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ if (position <= (count / 2))
+ {
+ /* Shift at most count/2 elements to the left. */
+ size_t i2, i;
+
+ list->offset = (list->offset == 0 ? list->allocated : list->offset) - 1;
+
+ i2 = list->offset + position;
+ if (i2 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence list->allocated > 0. */
+ size_t i1 = list->allocated - 1;
+ i2 -= list->allocated;
+ for (i = list->offset; i < i1; i++)
+ elements[i] = elements[i + 1];
+ elements[i1] = elements[0];
+ for (i = 0; i < i2; i++)
+ elements[i] = elements[i + 1];
+ }
+ else
+ {
+ for (i = list->offset; i < i2; i++)
+ elements[i] = elements[i + 1];
+ }
+ elements[i2] = elt;
+ }
+ else
+ {
+ /* Shift at most (count+1)/2 elements to the right. */
+ size_t i1, i3, i;
+
+ i1 = list->offset + position;
+ i3 = list->offset + count;
+ if (i1 >= list->allocated)
+ {
+ i1 -= list->allocated;
+ i3 -= list->allocated;
+ for (i = i3; i > i1; i--)
+ elements[i] = elements[i - 1];
+ }
+ else if (i3 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence list->allocated > 0. */
+ size_t i2 = list->allocated - 1;
+ i3 -= list->allocated;
+ for (i = i3; i > 0; i--)
+ elements[i] = elements[i - 1];
+ elements[0] = elements[i2];
+ for (i = i2; i > i1; i--)
+ elements[i] = elements[i - 1];
+ }
+ else
+ {
+ for (i = i3; i > i1; i--)
+ elements[i] = elements[i - 1];
+ }
+ elements[i1] = elt;
+ }
+ list->count = count + 1;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_carray_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ return gl_carray_nx_add_at (list, index, elt);
+}
+
+static gl_list_node_t
+gl_carray_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ return gl_carray_nx_add_at (list, index + 1, elt);
+}
+
+static bool
+gl_carray_remove_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ const void **elements;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ /* Here we know count > 0. */
+ elements = list->elements;
+ if (position <= ((count - 1) / 2))
+ {
+ /* Shift at most (count-1)/2 elements to the right. */
+ size_t i0, i2, i;
+
+ i0 = list->offset;
+ i2 = list->offset + position;
+ if (i2 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence list->allocated > 0. */
+ size_t i1 = list->allocated - 1;
+ i2 -= list->allocated;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i2]);
+ for (i = i2; i > 0; i--)
+ elements[i] = elements[i - 1];
+ elements[0] = elements[i1];
+ for (i = i1; i > i0; i--)
+ elements[i] = elements[i - 1];
+ }
+ else
+ {
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i2]);
+ for (i = i2; i > i0; i--)
+ elements[i] = elements[i - 1];
+ }
+
+ i0++;
+ list->offset = (i0 == list->allocated ? 0 : i0);
+ }
+ else
+ {
+ /* Shift at most count/2 elements to the left. */
+ size_t i1, i3, i;
+
+ i1 = list->offset + position;
+ i3 = list->offset + count - 1;
+ if (i1 >= list->allocated)
+ {
+ i1 -= list->allocated;
+ i3 -= list->allocated;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i1]);
+ for (i = i1; i < i3; i++)
+ elements[i] = elements[i + 1];
+ }
+ else if (i3 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence list->allocated > 0. */
+ size_t i2 = list->allocated - 1;
+ i3 -= list->allocated;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i1]);
+ for (i = i1; i < i2; i++)
+ elements[i] = elements[i + 1];
+ elements[i2] = elements[0];
+ for (i = 0; i < i3; i++)
+ elements[i] = elements[i + 1];
+ }
+ else
+ {
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i1]);
+ for (i = i1; i < i3; i++)
+ elements[i] = elements[i + 1];
+ }
+ }
+ list->count = count - 1;
+ return true;
+}
+
+static bool
+gl_carray_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ return gl_carray_remove_at (list, index);
+}
+
+static bool
+gl_carray_remove (gl_list_t list, const void *elt)
+{
+ size_t position = gl_carray_indexof_from_to (list, 0, list->count, elt);
+ if (position == (size_t)(-1))
+ return false;
+ else
+ return gl_carray_remove_at (list, position);
+}
+
+static void
+gl_carray_list_free (gl_list_t list)
+{
+ if (list->elements != NULL)
+ {
+ if (list->base.dispose_fn != NULL)
+ {
+ size_t count = list->count;
+
+ if (count > 0)
+ {
+ gl_listelement_dispose_fn dispose = list->base.dispose_fn;
+ const void **elements = list->elements;
+ size_t i1 = list->offset;
+ size_t i3 = list->offset + count - 1;
+
+ if (i3 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence
+ list->allocated > 0. */
+ size_t i2 = list->allocated - 1;
+ size_t i;
+
+ i3 -= list->allocated;
+ for (i = i1; i <= i2; i++)
+ dispose (elements[i]);
+ for (i = 0; i <= i3; i++)
+ dispose (elements[i]);
+ }
+ else
+ {
+ size_t i;
+
+ for (i = i1; i <= i3; i++)
+ dispose (elements[i]);
+ }
+ }
+ }
+ free (list->elements);
+ }
+ free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_carray_iterator (gl_list_t list)
+{
+ gl_list_iterator_t result;
+
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.count = list->count;
+ result.i = 0;
+ result.j = list->count;
+#ifdef lint
+ result.p = 0;
+ result.q = 0;
+#endif
+
+ return result;
+}
+
+static gl_list_iterator_t
+gl_carray_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ gl_list_iterator_t result;
+
+ if (!(start_index <= end_index && end_index <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.count = list->count;
+ result.i = start_index;
+ result.j = end_index;
+#ifdef lint
+ result.p = 0;
+ result.q = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_carray_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ gl_list_t list = iterator->list;
+ if (iterator->count != list->count)
+ {
+ if (iterator->count != list->count + 1)
+ /* Concurrent modifications were done on the list. */
+ abort ();
+ /* The last returned element was removed. */
+ iterator->count--;
+ iterator->i--;
+ iterator->j--;
+ }
+ if (iterator->i < iterator->j)
+ {
+ size_t i = list->offset + iterator->i;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ *eltp = list->elements[i];
+ if (nodep != NULL)
+ *nodep = INDEX_TO_NODE (iterator->i);
+ iterator->i++;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_carray_iterator_free (gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static size_t
+gl_carray_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ if (!(low <= high && high <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ if (low < high)
+ {
+ /* At each loop iteration, low < high; for indices < low the values
+ are smaller than ELT; for indices >= high the values are greater
+ than ELT. So, if the element occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ size_t i_mid;
+ int cmp;
+
+ i_mid = list->offset + mid;
+ if (i_mid >= list->allocated)
+ i_mid -= list->allocated;
+
+ cmp = compar (list->elements[i_mid], elt);
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT at index MID. But we need
+ the minimal such index. */
+ high = mid;
+ /* At each loop iteration, low <= high and
+ compar (list->elements[i_high], elt) == 0,
+ and we know that the first occurrence of the element is at
+ low <= position <= high. */
+ while (low < high)
+ {
+ size_t mid2 = low + (high - low) / 2; /* low <= mid2 < high */
+ size_t i_mid2;
+ int cmp2;
+
+ i_mid2 = list->offset + mid2;
+ if (i_mid2 >= list->allocated)
+ i_mid2 -= list->allocated;
+
+ cmp2 = compar (list->elements[i_mid2], elt);
+
+ if (cmp2 < 0)
+ low = mid2 + 1;
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ if (mid2 == low)
+ break;
+ high = mid2 - 1;
+ }
+ }
+ return low;
+ }
+ }
+ while (low < high);
+ /* Here low == high. */
+ }
+ return (size_t)(-1);
+}
+
+static size_t
+gl_carray_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ return gl_carray_sortedlist_indexof_from_to (list, compar, 0, list->count,
+ elt);
+}
+
+static gl_list_node_t
+gl_carray_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t index =
+ gl_carray_sortedlist_indexof_from_to (list, compar, low, high, elt);
+ return INDEX_TO_NODE (index);
+}
+
+static gl_list_node_t
+gl_carray_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index =
+ gl_carray_sortedlist_indexof_from_to (list, compar, 0, list->count, elt);
+ return INDEX_TO_NODE (index);
+}
+
+static gl_list_node_t
+gl_carray_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t count = list->count;
+ size_t low = 0;
+ size_t high = count;
+
+ /* At each loop iteration, low <= high; for indices < low the values are
+ smaller than ELT; for indices >= high the values are greater than ELT. */
+ while (low < high)
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ size_t i_mid;
+ int cmp;
+
+ i_mid = list->offset + mid;
+ if (i_mid >= list->allocated)
+ i_mid -= list->allocated;
+
+ cmp = compar (list->elements[i_mid], elt);
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ {
+ low = mid;
+ break;
+ }
+ }
+ return gl_carray_nx_add_at (list, low, elt);
+}
+
+static bool
+gl_carray_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index = gl_carray_sortedlist_indexof (list, compar, elt);
+ if (index == (size_t)(-1))
+ return false;
+ else
+ return gl_carray_remove_at (list, index);
+}
+
+
+const struct gl_list_implementation gl_carray_list_implementation =
+ {
+ gl_carray_nx_create_empty,
+ gl_carray_nx_create,
+ gl_carray_size,
+ gl_carray_node_value,
+ gl_carray_node_nx_set_value,
+ gl_carray_next_node,
+ gl_carray_previous_node,
+ gl_carray_get_at,
+ gl_carray_nx_set_at,
+ gl_carray_search_from_to,
+ gl_carray_indexof_from_to,
+ gl_carray_nx_add_first,
+ gl_carray_nx_add_last,
+ gl_carray_nx_add_before,
+ gl_carray_nx_add_after,
+ gl_carray_nx_add_at,
+ gl_carray_remove_node,
+ gl_carray_remove_at,
+ gl_carray_remove,
+ gl_carray_list_free,
+ gl_carray_iterator,
+ gl_carray_iterator_from_to,
+ gl_carray_iterator_next,
+ gl_carray_iterator_free,
+ gl_carray_sortedlist_search,
+ gl_carray_sortedlist_search_from_to,
+ gl_carray_sortedlist_indexof,
+ gl_carray_sortedlist_indexof_from_to,
+ gl_carray_sortedlist_nx_add,
+ gl_carray_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_carray_list.h b/gnulib/lib/gl_carray_list.h
new file mode 100644
index 00000000..d748311d
--- /dev/null
+++ b/gnulib/lib/gl_carray_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a circular array.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_CARRAY_LIST_H
+#define _GL_CARRAY_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_carray_list_implementation;
+#define GL_CARRAY_LIST &gl_carray_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_CARRAY_LIST_H */
diff --git a/gnulib/lib/gl_linked_list.c b/gnulib/lib/gl_linked_list.c
new file mode 100644
index 00000000..e2902d93
--- /dev/null
+++ b/gnulib/lib/gl_linked_list.c
@@ -0,0 +1,64 @@
+/* Sequential list data type implemented by a linked list.
+ Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_linked_list.h"
+
+#include <stdlib.h>
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic linked list code. */
+#include "gl_anylinked_list1.h"
+#include "gl_anylinked_list2.h"
+
+
+const struct gl_list_implementation gl_linked_list_implementation =
+ {
+ gl_linked_nx_create_empty,
+ gl_linked_nx_create,
+ gl_linked_size,
+ gl_linked_node_value,
+ gl_linked_node_nx_set_value,
+ gl_linked_next_node,
+ gl_linked_previous_node,
+ gl_linked_get_at,
+ gl_linked_nx_set_at,
+ gl_linked_search_from_to,
+ gl_linked_indexof_from_to,
+ gl_linked_nx_add_first,
+ gl_linked_nx_add_last,
+ gl_linked_nx_add_before,
+ gl_linked_nx_add_after,
+ gl_linked_nx_add_at,
+ gl_linked_remove_node,
+ gl_linked_remove_at,
+ gl_linked_remove,
+ gl_linked_list_free,
+ gl_linked_iterator,
+ gl_linked_iterator_from_to,
+ gl_linked_iterator_next,
+ gl_linked_iterator_free,
+ gl_linked_sortedlist_search,
+ gl_linked_sortedlist_search_from_to,
+ gl_linked_sortedlist_indexof,
+ gl_linked_sortedlist_indexof_from_to,
+ gl_linked_sortedlist_nx_add,
+ gl_linked_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_linked_list.h b/gnulib/lib/gl_linked_list.h
new file mode 100644
index 00000000..b0449ed1
--- /dev/null
+++ b/gnulib/lib/gl_linked_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a linked list.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_LINKED_LIST_H
+#define _GL_LINKED_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_linked_list_implementation;
+#define GL_LINKED_LIST &gl_linked_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LINKED_LIST_H */
diff --git a/gnulib/lib/gl_linkedhash_list.c b/gnulib/lib/gl_linkedhash_list.c
new file mode 100644
index 00000000..467e4110
--- /dev/null
+++ b/gnulib/lib/gl_linkedhash_list.c
@@ -0,0 +1,124 @@
+/* Sequential list data type implemented by a hash table with a linked list.
+ Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_linkedhash_list.h"
+
+#include <stdint.h> /* for SIZE_MAX */
+#include <stdlib.h>
+
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+#define WITH_HASHTABLE 1
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic hash-table code. */
+#include "gl_anyhash_list1.h"
+
+/* Generic linked list code. */
+#include "gl_anylinked_list1.h"
+
+/* Generic hash-table code. */
+#include "gl_anyhash_list2.h"
+
+/* Resize the hash table if needed, after list->count was incremented. */
+static inline void
+hash_resize_after_add (gl_list_t list)
+{
+ size_t count = list->count;
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate > list->table_size)
+ hash_resize (list, estimate);
+}
+
+/* Add a node to the hash table structure. */
+static inline void
+add_to_bucket (gl_list_t list, gl_list_node_t node)
+{
+ size_t bucket = node->h.hashcode % list->table_size;
+
+ node->h.hash_next = list->table[bucket];
+ list->table[bucket] = &node->h;
+}
+/* Tell all compilers that the return value is 0. */
+#define add_to_bucket(list,node) ((add_to_bucket) (list, node), 0)
+
+/* Remove a node from the hash table structure. */
+static inline void
+remove_from_bucket (gl_list_t list, gl_list_node_t node)
+{
+ size_t bucket = node->h.hashcode % list->table_size;
+ gl_hash_entry_t *p;
+
+ for (p = &list->table[bucket]; ; p = &(*p)->hash_next)
+ {
+ if (*p == &node->h)
+ {
+ *p = node->h.hash_next;
+ break;
+ }
+ if (*p == NULL)
+ /* node is not in the right bucket. Did the hash codes
+ change inadvertently? */
+ abort ();
+ }
+}
+
+/* Generic linked list code. */
+#include "gl_anylinked_list2.h"
+
+
+const struct gl_list_implementation gl_linkedhash_list_implementation =
+ {
+ gl_linked_nx_create_empty,
+ gl_linked_nx_create,
+ gl_linked_size,
+ gl_linked_node_value,
+ gl_linked_node_nx_set_value,
+ gl_linked_next_node,
+ gl_linked_previous_node,
+ gl_linked_get_at,
+ gl_linked_nx_set_at,
+ gl_linked_search_from_to,
+ gl_linked_indexof_from_to,
+ gl_linked_nx_add_first,
+ gl_linked_nx_add_last,
+ gl_linked_nx_add_before,
+ gl_linked_nx_add_after,
+ gl_linked_nx_add_at,
+ gl_linked_remove_node,
+ gl_linked_remove_at,
+ gl_linked_remove,
+ gl_linked_list_free,
+ gl_linked_iterator,
+ gl_linked_iterator_from_to,
+ gl_linked_iterator_next,
+ gl_linked_iterator_free,
+ gl_linked_sortedlist_search,
+ gl_linked_sortedlist_search_from_to,
+ gl_linked_sortedlist_indexof,
+ gl_linked_sortedlist_indexof_from_to,
+ gl_linked_sortedlist_nx_add,
+ gl_linked_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_linkedhash_list.h b/gnulib/lib/gl_linkedhash_list.h
new file mode 100644
index 00000000..20bc62d6
--- /dev/null
+++ b/gnulib/lib/gl_linkedhash_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a hash table with a linked list.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_LINKEDHASH_LIST_H
+#define _GL_LINKEDHASH_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_linkedhash_list_implementation;
+#define GL_LINKEDHASH_LIST &gl_linkedhash_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LINKEDHASH_LIST_H */
diff --git a/gnulib/lib/gl_list.c b/gnulib/lib/gl_list.c
new file mode 100644
index 00000000..4a2c0356
--- /dev/null
+++ b/gnulib/lib/gl_list.c
@@ -0,0 +1,283 @@
+/* Abstract sequential list data type.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_list.h"
+
+#if !HAVE_INLINE
+
+/* Define all functions of this file as inline accesses to the
+ struct gl_list_implementation.
+ Use #define to avoid a warning because of extern vs. static. */
+
+gl_list_t
+gl_list_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ return implementation->nx_create_empty (implementation, equals_fn,
+ hashcode_fn, dispose_fn,
+ allow_duplicates);
+}
+
+gl_list_t
+gl_list_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ return implementation->nx_create (implementation, equals_fn, hashcode_fn,
+ dispose_fn, allow_duplicates, count,
+ contents);
+}
+
+size_t
+gl_list_size (gl_list_t list)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->size (list);
+}
+
+const void *
+gl_list_node_value (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->node_value (list, node);
+}
+
+int
+gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->node_nx_set_value (list, node, elt);
+}
+
+gl_list_node_t
+gl_list_next_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->next_node (list, node);
+}
+
+gl_list_node_t
+gl_list_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->previous_node (list, node);
+}
+
+const void *
+gl_list_get_at (gl_list_t list, size_t position)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->get_at (list, position);
+}
+
+gl_list_node_t
+gl_list_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_set_at (list, position, elt);
+}
+
+gl_list_node_t
+gl_list_search (gl_list_t list, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, 0, size, elt);
+}
+
+gl_list_node_t
+gl_list_search_from (gl_list_t list, size_t start_index, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, start_index, size, elt);
+}
+
+gl_list_node_t
+gl_list_search_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, start_index, end_index, elt);
+}
+
+size_t
+gl_list_indexof (gl_list_t list, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, 0, size, elt);
+}
+
+size_t
+gl_list_indexof_from (gl_list_t list, size_t start_index, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, start_index, size, elt);
+}
+
+size_t
+gl_list_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, start_index, end_index, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_first (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_first (list, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_last (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_last (list, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_before (list, node, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_after (list, node, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_at (list, position, elt);
+}
+
+bool
+gl_list_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_node (list, node);
+}
+
+bool
+gl_list_remove_at (gl_list_t list, size_t position)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_at (list, position);
+}
+
+bool
+gl_list_remove (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_elt (list, elt);
+}
+
+void
+gl_list_free (gl_list_t list)
+{
+ ((const struct gl_list_impl_base *) list)->vtable->list_free (list);
+}
+
+gl_list_iterator_t
+gl_list_iterator (gl_list_t list)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->iterator (list);
+}
+
+gl_list_iterator_t
+gl_list_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->iterator_from_to (list, start_index, end_index);
+}
+
+bool
+gl_list_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ return iterator->vtable->iterator_next (iterator, eltp, nodep);
+}
+
+void
+gl_list_iterator_free (gl_list_iterator_t *iterator)
+{
+ iterator->vtable->iterator_free (iterator);
+}
+
+gl_list_node_t
+gl_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_search (list, compar, elt);
+}
+
+gl_list_node_t
+gl_sortedlist_search_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_search_from_to (list, compar, start_index, end_index,
+ elt);
+}
+
+size_t
+gl_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_indexof (list, compar, elt);
+}
+
+size_t
+gl_sortedlist_indexof_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_indexof_from_to (list, compar, start_index, end_index,
+ elt);
+}
+
+gl_list_node_t
+gl_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_nx_add (list, compar, elt);
+}
+
+bool
+gl_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_remove (list, compar, elt);
+}
+
+#endif
diff --git a/gnulib/lib/gl_list.h b/gnulib/lib/gl_list.h
new file mode 100644
index 00000000..2b3aa58f
--- /dev/null
+++ b/gnulib/lib/gl_list.h
@@ -0,0 +1,844 @@
+/* Abstract sequential list data type.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_LIST_H
+#define _GL_LIST_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* gl_list is an abstract list data type. It can contain any number of
+ objects ('void *' or 'const void *' pointers) in any given order.
+ Duplicates are allowed, but can optionally be forbidden.
+
+ There are several implementations of this list datatype, optimized for
+ different operations or for memory. You can start using the simplest list
+ implementation, GL_ARRAY_LIST, and switch to a different implementation
+ later, when you realize which operations are performed the most frequently.
+ The API of the different implementations is exactly the same; when
+ switching to a different implementation, you only have to change the
+ gl_list_create call.
+
+ The implementations are:
+ GL_ARRAY_LIST a growable array
+ GL_CARRAY_LIST a growable circular array
+ GL_LINKED_LIST a linked list
+ GL_AVLTREE_LIST a binary tree (AVL tree)
+ GL_RBTREE_LIST a binary tree (red-black tree)
+ GL_LINKEDHASH_LIST a hash table with a linked list
+ GL_AVLTREEHASH_LIST a hash table with a binary tree (AVL tree)
+ GL_RBTREEHASH_LIST a hash table with a binary tree (red-black tree)
+
+ The memory consumption is asymptotically the same: O(1) for every object
+ in the list. When looking more closely at the average memory consumed
+ for an object, GL_ARRAY_LIST is the most compact representation, and
+ GL_LINKEDHASH_LIST and GL_TREEHASH_LIST need more memory.
+
+ The guaranteed average performance of the operations is, for a list of
+ n elements:
+
+ Operation ARRAY LINKED TREE LINKEDHASH TREEHASH
+ CARRAY with|without with|without
+ duplicates duplicates
+
+ gl_list_size O(1) O(1) O(1) O(1) O(1)
+ gl_list_node_value O(1) O(1) O(1) O(1) O(1)
+ gl_list_node_set_value O(1) O(1) O(1) O(1) O((log n)²)/O(1)
+ gl_list_next_node O(1) O(1) O(log n) O(1) O(log n)
+ gl_list_previous_node O(1) O(1) O(log n) O(1) O(log n)
+ gl_list_get_at O(1) O(n) O(log n) O(n) O(log n)
+ gl_list_set_at O(1) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ gl_list_search O(n) O(n) O(n) O(n)/O(1) O(log n)/O(1)
+ gl_list_search_from O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n)
+ gl_list_search_from_to O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n)
+ gl_list_indexof O(n) O(n) O(n) O(n) O(log n)
+ gl_list_indexof_from O(n) O(n) O(n) O(n) O((log n)²)/O(log n)
+ gl_list_indexof_from_to O(n) O(n) O(n) O(n) O((log n)²)/O(log n)
+ gl_list_add_first O(n)/O(1) O(1) O(log n) O(1) O((log n)²)/O(log n)
+ gl_list_add_last O(1) O(1) O(log n) O(1) O((log n)²)/O(log n)
+ gl_list_add_before O(n) O(1) O(log n) O(1) O((log n)²)/O(log n)
+ gl_list_add_after O(n) O(1) O(log n) O(1) O((log n)²)/O(log n)
+ gl_list_add_at O(n) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ gl_list_remove_node O(n) O(1) O(log n) O(n)/O(1) O((log n)²)/O(log n)
+ gl_list_remove_at O(n) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ gl_list_remove O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n)
+ gl_list_iterator O(1) O(1) O(log n) O(1) O(log n)
+ gl_list_iterator_from_to O(1) O(n) O(log n) O(n) O(log n)
+ gl_list_iterator_next O(1) O(1) O(log n) O(1) O(log n)
+ gl_sortedlist_search O(log n) O(n) O(log n) O(n) O(log n)
+ gl_sortedlist_search_from O(log n) O(n) O(log n) O(n) O(log n)
+ gl_sortedlist_indexof O(log n) O(n) O(log n) O(n) O(log n)
+ gl_sortedlist_indexof_fro O(log n) O(n) O(log n) O(n) O(log n)
+ gl_sortedlist_add O(n) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ gl_sortedlist_remove O(n) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Type of function used to compare two elements.
+ NULL denotes pointer comparison. */
+typedef bool (*gl_listelement_equals_fn) (const void *elt1, const void *elt2);
+
+/* Type of function used to compute a hash code.
+ NULL denotes a function that depends only on the pointer itself. */
+typedef size_t (*gl_listelement_hashcode_fn) (const void *elt);
+
+/* Type of function used to dispose an element once it's removed from a list.
+ NULL denotes a no-op. */
+typedef void (*gl_listelement_dispose_fn) (const void *elt);
+
+struct gl_list_impl;
+/* Type representing an entire list. */
+typedef struct gl_list_impl * gl_list_t;
+
+struct gl_list_node_impl;
+/* Type representing the position of an element in the list, in a way that
+ is more adapted to the list implementation than a plain index.
+ Note: It is invalidated by insertions and removals! */
+typedef struct gl_list_node_impl * gl_list_node_t;
+
+struct gl_list_implementation;
+/* Type representing a list datatype implementation. */
+typedef const struct gl_list_implementation * gl_list_implementation_t;
+
+/* Create an empty list.
+ IMPLEMENTATION is one of GL_ARRAY_LIST, GL_CARRAY_LIST, GL_LINKED_LIST,
+ GL_AVLTREE_LIST, GL_RBTREE_LIST, GL_LINKEDHASH_LIST, GL_AVLTREEHASH_LIST,
+ GL_RBTREEHASH_LIST.
+ EQUALS_FN is an element comparison function or NULL.
+ HASHCODE_FN is an element hash code function or NULL.
+ DISPOSE_FN is an element disposal function or NULL.
+ ALLOW_DUPLICATES is false if duplicate elements shall not be allowed in
+ the list. The implementation may verify this at runtime. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_t gl_list_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_t gl_list_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates);
+
+/* Create a list with given contents.
+ IMPLEMENTATION is one of GL_ARRAY_LIST, GL_CARRAY_LIST, GL_LINKED_LIST,
+ GL_AVLTREE_LIST, GL_RBTREE_LIST, GL_LINKEDHASH_LIST, GL_AVLTREEHASH_LIST,
+ GL_RBTREEHASH_LIST.
+ EQUALS_FN is an element comparison function or NULL.
+ HASHCODE_FN is an element hash code function or NULL.
+ DISPOSE_FN is an element disposal function or NULL.
+ ALLOW_DUPLICATES is false if duplicate elements shall not be allowed in
+ the list. The implementation may verify this at runtime.
+ COUNT is the number of initial elements.
+ CONTENTS[0..COUNT-1] is the initial contents. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_t gl_list_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_t gl_list_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents);
+
+/* Return the current number of elements in a list. */
+extern size_t gl_list_size (gl_list_t list);
+
+/* Return the element value represented by a list node. */
+extern const void * gl_list_node_value (gl_list_t list, gl_list_node_t node);
+
+/* Replace the element value represented by a list node. */
+#if 0 /* declared in gl_xlist.h */
+extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+#endif
+/* Likewise. Return 0 upon success, -1 upon out-of-memory. */
+extern int gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Return the node immediately after the given node in the list, or NULL
+ if the given node is the last (rightmost) one in the list. */
+extern gl_list_node_t gl_list_next_node (gl_list_t list, gl_list_node_t node);
+
+/* Return the node immediately before the given node in the list, or NULL
+ if the given node is the first (leftmost) one in the list. */
+extern gl_list_node_t gl_list_previous_node (gl_list_t list, gl_list_node_t node);
+
+/* Return the element at a given position in the list.
+ POSITION must be >= 0 and < gl_list_size (list). */
+extern const void * gl_list_get_at (gl_list_t list, size_t position);
+
+/* Replace the element at a given position in the list.
+ POSITION must be >= 0 and < gl_list_size (list).
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_set_at (gl_list_t list, size_t position,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Search whether an element is already in the list.
+ Return its node if found, or NULL if not present in the list. */
+extern gl_list_node_t gl_list_search (gl_list_t list, const void *elt);
+
+/* Search whether an element is already in the list,
+ at a position >= START_INDEX.
+ Return its node if found, or NULL if not present in the list. */
+extern gl_list_node_t gl_list_search_from (gl_list_t list, size_t start_index,
+ const void *elt);
+
+/* Search whether an element is already in the list,
+ at a position >= START_INDEX and < END_INDEX.
+ Return its node if found, or NULL if not present in the list. */
+extern gl_list_node_t gl_list_search_from_to (gl_list_t list,
+ size_t start_index,
+ size_t end_index,
+ const void *elt);
+
+/* Search whether an element is already in the list.
+ Return its position if found, or (size_t)(-1) if not present in the list. */
+extern size_t gl_list_indexof (gl_list_t list, const void *elt);
+
+/* Search whether an element is already in the list,
+ at a position >= START_INDEX.
+ Return its position if found, or (size_t)(-1) if not present in the list. */
+extern size_t gl_list_indexof_from (gl_list_t list, size_t start_index,
+ const void *elt);
+
+/* Search whether an element is already in the list,
+ at a position >= START_INDEX and < END_INDEX.
+ Return its position if found, or (size_t)(-1) if not present in the list. */
+extern size_t gl_list_indexof_from_to (gl_list_t list,
+ size_t start_index, size_t end_index,
+ const void *elt);
+
+/* Add an element as the first element of the list.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_first (gl_list_t list, const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Add an element as the last element of the list.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_last (gl_list_t list, const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Add an element before a given element node of the list.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_before (gl_list_t list,
+ gl_list_node_t node,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Add an element after a given element node of the list.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_after (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Add an element at a given position in the list.
+ POSITION must be >= 0 and <= gl_list_size (list). */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_at (gl_list_t list, size_t position,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_at (gl_list_t list, size_t position,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Remove an element from the list.
+ Return true. */
+extern bool gl_list_remove_node (gl_list_t list, gl_list_node_t node);
+
+/* Remove an element at a given position from the list.
+ POSITION must be >= 0 and < gl_list_size (list).
+ Return true. */
+extern bool gl_list_remove_at (gl_list_t list, size_t position);
+
+/* Search and remove an element from the list.
+ Return true if it was found and removed. */
+extern bool gl_list_remove (gl_list_t list, const void *elt);
+
+/* Free an entire list.
+ (But this call does not free the elements of the list.) */
+extern void gl_list_free (gl_list_t list);
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+/* Functions for iterating through a list. */
+
+/* Type of an iterator that traverses a list.
+ This is a fixed-size struct, so that creation of an iterator doesn't need
+ memory allocation on the heap. */
+typedef struct
+{
+ /* For fast dispatch of gl_list_iterator_next. */
+ const struct gl_list_implementation *vtable;
+ /* For detecting whether the last returned element was removed. */
+ gl_list_t list;
+ size_t count;
+ /* Other, implementation-private fields. */
+ void *p; void *q;
+ size_t i; size_t j;
+} gl_list_iterator_t;
+
+/* Create an iterator traversing a list.
+ The list contents must not be modified while the iterator is in use,
+ except for replacing or removing the last returned element. */
+extern gl_list_iterator_t gl_list_iterator (gl_list_t list);
+
+/* Create an iterator traversing the element with indices i,
+ start_index <= i < end_index, of a list.
+ The list contents must not be modified while the iterator is in use,
+ except for replacing or removing the last returned element. */
+extern gl_list_iterator_t gl_list_iterator_from_to (gl_list_t list,
+ size_t start_index,
+ size_t end_index);
+
+/* If there is a next element, store the next element in *ELTP, store its
+ node in *NODEP if NODEP is non-NULL, advance the iterator and return true.
+ Otherwise, return false. */
+extern bool gl_list_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep);
+
+/* Free an iterator. */
+extern void gl_list_iterator_free (gl_list_iterator_t *iterator);
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+/* The following functions are for lists without duplicates where the
+ order is given by a sort criterion. */
+
+/* Type of function used to compare two elements. Same as for qsort().
+ NULL denotes pointer comparison. */
+typedef int (*gl_listelement_compar_fn) (const void *elt1, const void *elt2);
+
+/* Search whether an element is already in the list.
+ The list is assumed to be sorted with COMPAR.
+ Return its node if found, or NULL if not present in the list.
+ If the list contains several copies of ELT, the node of the leftmost one is
+ returned. */
+extern gl_list_node_t gl_sortedlist_search (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+
+/* Search whether an element is already in the list.
+ The list is assumed to be sorted with COMPAR.
+ Only list elements with indices >= START_INDEX and < END_INDEX are
+ considered; the implementation uses these bounds to minimize the number
+ of COMPAR invocations.
+ Return its node if found, or NULL if not present in the list.
+ If the list contains several copies of ELT, the node of the leftmost one is
+ returned. */
+extern gl_list_node_t gl_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t start_index,
+ size_t end_index,
+ const void *elt);
+
+/* Search whether an element is already in the list.
+ The list is assumed to be sorted with COMPAR.
+ Return its position if found, or (size_t)(-1) if not present in the list.
+ If the list contains several copies of ELT, the position of the leftmost one
+ is returned. */
+extern size_t gl_sortedlist_indexof (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+
+/* Search whether an element is already in the list.
+ The list is assumed to be sorted with COMPAR.
+ Only list elements with indices >= START_INDEX and < END_INDEX are
+ considered; the implementation uses these bounds to minimize the number
+ of COMPAR invocations.
+ Return its position if found, or (size_t)(-1) if not present in the list.
+ If the list contains several copies of ELT, the position of the leftmost one
+ is returned. */
+extern size_t gl_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t start_index,
+ size_t end_index,
+ const void *elt);
+
+/* Add an element at the appropriate position in the list.
+ The list is assumed to be sorted with COMPAR.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_sortedlist_add (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_sortedlist_nx_add (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Search and remove an element from the list.
+ The list is assumed to be sorted with COMPAR.
+ Return true if it was found and removed.
+ If the list contains several copies of ELT, only the leftmost one is
+ removed. */
+extern bool gl_sortedlist_remove (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+
+/* ------------------------ Implementation Details ------------------------ */
+
+struct gl_list_implementation
+{
+ /* gl_list_t functions. */
+ gl_list_t (*nx_create_empty) (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates);
+ gl_list_t (*nx_create) (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents);
+ size_t (*size) (gl_list_t list);
+ const void * (*node_value) (gl_list_t list, gl_list_node_t node);
+ int (*node_nx_set_value) (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+ gl_list_node_t (*next_node) (gl_list_t list, gl_list_node_t node);
+ gl_list_node_t (*previous_node) (gl_list_t list, gl_list_node_t node);
+ const void * (*get_at) (gl_list_t list, size_t position);
+ gl_list_node_t (*nx_set_at) (gl_list_t list, size_t position,
+ const void *elt);
+ gl_list_node_t (*search_from_to) (gl_list_t list, size_t start_index,
+ size_t end_index, const void *elt);
+ size_t (*indexof_from_to) (gl_list_t list, size_t start_index,
+ size_t end_index, const void *elt);
+ gl_list_node_t (*nx_add_first) (gl_list_t list, const void *elt);
+ gl_list_node_t (*nx_add_last) (gl_list_t list, const void *elt);
+ gl_list_node_t (*nx_add_before) (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+ gl_list_node_t (*nx_add_after) (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+ gl_list_node_t (*nx_add_at) (gl_list_t list, size_t position,
+ const void *elt);
+ bool (*remove_node) (gl_list_t list, gl_list_node_t node);
+ bool (*remove_at) (gl_list_t list, size_t position);
+ bool (*remove_elt) (gl_list_t list, const void *elt);
+ void (*list_free) (gl_list_t list);
+ /* gl_list_iterator_t functions. */
+ gl_list_iterator_t (*iterator) (gl_list_t list);
+ gl_list_iterator_t (*iterator_from_to) (gl_list_t list,
+ size_t start_index,
+ size_t end_index);
+ bool (*iterator_next) (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep);
+ void (*iterator_free) (gl_list_iterator_t *iterator);
+ /* Sorted gl_list_t functions. */
+ gl_list_node_t (*sortedlist_search) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+ gl_list_node_t (*sortedlist_search_from_to) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t start_index,
+ size_t end_index,
+ const void *elt);
+ size_t (*sortedlist_indexof) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+ size_t (*sortedlist_indexof_from_to) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t start_index, size_t end_index,
+ const void *elt);
+ gl_list_node_t (*sortedlist_nx_add) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+ bool (*sortedlist_remove) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+};
+
+struct gl_list_impl_base
+{
+ const struct gl_list_implementation *vtable;
+ gl_listelement_equals_fn equals_fn;
+ gl_listelement_hashcode_fn hashcode_fn;
+ gl_listelement_dispose_fn dispose_fn;
+ bool allow_duplicates;
+};
+
+#if HAVE_INLINE
+
+/* Define all functions of this file as inline accesses to the
+ struct gl_list_implementation.
+ Use #define to avoid a warning because of extern vs. static. */
+
+# define gl_list_nx_create_empty gl_list_nx_create_empty_inline
+static inline gl_list_t
+gl_list_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ return implementation->nx_create_empty (implementation, equals_fn,
+ hashcode_fn, dispose_fn,
+ allow_duplicates);
+}
+
+# define gl_list_nx_create gl_list_nx_create_inline
+static inline gl_list_t
+gl_list_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ return implementation->nx_create (implementation, equals_fn, hashcode_fn,
+ dispose_fn, allow_duplicates, count,
+ contents);
+}
+
+# define gl_list_size gl_list_size_inline
+static inline size_t
+gl_list_size (gl_list_t list)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->size (list);
+}
+
+# define gl_list_node_value gl_list_node_value_inline
+static inline const void *
+gl_list_node_value (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->node_value (list, node);
+}
+
+# define gl_list_node_nx_set_value gl_list_node_nx_set_value_inline
+static inline int
+gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->node_nx_set_value (list, node, elt);
+}
+
+# define gl_list_next_node gl_list_next_node_inline
+static inline gl_list_node_t
+gl_list_next_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->next_node (list, node);
+}
+
+# define gl_list_previous_node gl_list_previous_node_inline
+static inline gl_list_node_t
+gl_list_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->previous_node (list, node);
+}
+
+# define gl_list_get_at gl_list_get_at_inline
+static inline const void *
+gl_list_get_at (gl_list_t list, size_t position)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->get_at (list, position);
+}
+
+# define gl_list_nx_set_at gl_list_nx_set_at_inline
+static inline gl_list_node_t
+gl_list_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_set_at (list, position, elt);
+}
+
+# define gl_list_search gl_list_search_inline
+static inline gl_list_node_t
+gl_list_search (gl_list_t list, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, 0, size, elt);
+}
+
+# define gl_list_search_from gl_list_search_from_inline
+static inline gl_list_node_t
+gl_list_search_from (gl_list_t list, size_t start_index, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, start_index, size, elt);
+}
+
+# define gl_list_search_from_to gl_list_search_from_to_inline
+static inline gl_list_node_t
+gl_list_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, start_index, end_index, elt);
+}
+
+# define gl_list_indexof gl_list_indexof_inline
+static inline size_t
+gl_list_indexof (gl_list_t list, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, 0, size, elt);
+}
+
+# define gl_list_indexof_from gl_list_indexof_from_inline
+static inline size_t
+gl_list_indexof_from (gl_list_t list, size_t start_index, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, start_index, size, elt);
+}
+
+# define gl_list_indexof_from_to gl_list_indexof_from_to_inline
+static inline size_t
+gl_list_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, start_index, end_index, elt);
+}
+
+# define gl_list_nx_add_first gl_list_nx_add_first_inline
+static inline gl_list_node_t
+gl_list_nx_add_first (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_first (list, elt);
+}
+
+# define gl_list_nx_add_last gl_list_nx_add_last_inline
+static inline gl_list_node_t
+gl_list_nx_add_last (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_last (list, elt);
+}
+
+# define gl_list_nx_add_before gl_list_nx_add_before_inline
+static inline gl_list_node_t
+gl_list_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_before (list, node, elt);
+}
+
+# define gl_list_nx_add_after gl_list_nx_add_after_inline
+static inline gl_list_node_t
+gl_list_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_after (list, node, elt);
+}
+
+# define gl_list_nx_add_at gl_list_nx_add_at_inline
+static inline gl_list_node_t
+gl_list_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_at (list, position, elt);
+}
+
+# define gl_list_remove_node gl_list_remove_node_inline
+static inline bool
+gl_list_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_node (list, node);
+}
+
+# define gl_list_remove_at gl_list_remove_at_inline
+static inline bool
+gl_list_remove_at (gl_list_t list, size_t position)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_at (list, position);
+}
+
+# define gl_list_remove gl_list_remove_inline
+static inline bool
+gl_list_remove (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_elt (list, elt);
+}
+
+# define gl_list_free gl_list_free_inline
+static inline void
+gl_list_free (gl_list_t list)
+{
+ ((const struct gl_list_impl_base *) list)->vtable->list_free (list);
+}
+
+# define gl_list_iterator gl_list_iterator_inline
+static inline gl_list_iterator_t
+gl_list_iterator (gl_list_t list)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->iterator (list);
+}
+
+# define gl_list_iterator_from_to gl_list_iterator_from_to_inline
+static inline gl_list_iterator_t
+gl_list_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->iterator_from_to (list, start_index, end_index);
+}
+
+# define gl_list_iterator_next gl_list_iterator_next_inline
+static inline bool
+gl_list_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ return iterator->vtable->iterator_next (iterator, eltp, nodep);
+}
+
+# define gl_list_iterator_free gl_list_iterator_free_inline
+static inline void
+gl_list_iterator_free (gl_list_iterator_t *iterator)
+{
+ iterator->vtable->iterator_free (iterator);
+}
+
+# define gl_sortedlist_search gl_sortedlist_search_inline
+static inline gl_list_node_t
+gl_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_search (list, compar, elt);
+}
+
+# define gl_sortedlist_search_from_to gl_sortedlist_search_from_to_inline
+static inline gl_list_node_t
+gl_sortedlist_search_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_search_from_to (list, compar, start_index, end_index,
+ elt);
+}
+
+# define gl_sortedlist_indexof gl_sortedlist_indexof_inline
+static inline size_t
+gl_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_indexof (list, compar, elt);
+}
+
+# define gl_sortedlist_indexof_from_to gl_sortedlist_indexof_from_to_inline
+static inline size_t
+gl_sortedlist_indexof_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_indexof_from_to (list, compar, start_index, end_index,
+ elt);
+}
+
+# define gl_sortedlist_nx_add gl_sortedlist_nx_add_inline
+static inline gl_list_node_t
+gl_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_nx_add (list, compar, elt);
+}
+
+# define gl_sortedlist_remove gl_sortedlist_remove_inline
+static inline bool
+gl_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_remove (list, compar, elt);
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LIST_H */
diff --git a/gnulib/lib/gl_oset.c b/gnulib/lib/gl_oset.c
new file mode 100644
index 00000000..e067035d
--- /dev/null
+++ b/gnulib/lib/gl_oset.c
@@ -0,0 +1,96 @@
+/* Abstract ordered set data type.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_oset.h"
+
+#if !HAVE_INLINE
+
+/* Define all functions of this file as inline accesses to the
+ struct gl_list_implementation.
+ Use #define to avoid a warning because of extern vs. static. */
+
+gl_oset_t
+gl_oset_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ return implementation->nx_create_empty (implementation, compar_fn,
+ dispose_fn);
+}
+
+size_t
+gl_oset_size (gl_oset_t set)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->size (set);
+}
+
+bool
+gl_oset_search (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->search (set, elt);
+}
+
+bool
+gl_oset_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold, const void **eltp)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable
+ ->search_atleast (set, threshold_fn, threshold, eltp);
+}
+
+int
+gl_oset_nx_add (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->nx_add (set, elt);
+}
+
+bool
+gl_oset_remove (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable
+ ->remove_elt (set, elt);
+}
+
+void
+gl_oset_free (gl_oset_t set)
+{
+ ((const struct gl_oset_impl_base *) set)->vtable->oset_free (set);
+}
+
+gl_oset_iterator_t
+gl_oset_iterator (gl_oset_t set)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->iterator (set);
+}
+
+bool
+gl_oset_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+ return iterator->vtable->iterator_next (iterator, eltp);
+}
+
+void
+gl_oset_iterator_free (gl_oset_iterator_t *iterator)
+{
+ iterator->vtable->iterator_free (iterator);
+}
+
+#endif
diff --git a/gnulib/lib/gl_oset.h b/gnulib/lib/gl_oset.h
new file mode 100644
index 00000000..b4bb8f38
--- /dev/null
+++ b/gnulib/lib/gl_oset.h
@@ -0,0 +1,289 @@
+/* Abstract ordered set data type.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_OSET_H
+#define _GL_OSET_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* gl_oset is an abstract ordered set data type. It can contain any number
+ of objects ('void *' or 'const void *' pointers) in the order of a given
+ comparator function. Duplicates (in the sense of the comparator) are
+ forbidden.
+
+ There are several implementations of this ordered set datatype, optimized
+ for different operations or for memory. You can start using the simplest
+ ordered set implementation, GL_ARRAY_OSET, and switch to a different
+ implementation later, when you realize which operations are performed
+ the most frequently. The API of the different implementations is exactly
+ the same; when switching to a different implementation, you only have to
+ change the gl_oset_create call.
+
+ The implementations are:
+ GL_ARRAY_OSET a growable array
+ GL_AVLTREE_OSET a binary tree (AVL tree)
+ GL_RBTREE_OSET a binary tree (red-black tree)
+
+ The memory consumption is asymptotically the same: O(1) for every object
+ in the set. When looking more closely at the average memory consumed
+ for an object, GL_ARRAY_OSET is the most compact representation, and
+ GL_AVLTREE_OSET, GL_RBTREE_OSET need more memory.
+
+ The guaranteed average performance of the operations is, for a set of
+ n elements:
+
+ Operation ARRAY TREE
+
+ gl_oset_size O(1) O(1)
+ gl_oset_add O(n) O(log n)
+ gl_oset_remove O(n) O(log n)
+ gl_oset_search O(log n) O(log n)
+ gl_oset_search_atleast O(log n) O(log n)
+ gl_oset_iterator O(1) O(log n)
+ gl_oset_iterator_next O(1) O(log n)
+ */
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Type of function used to compare two elements. Same as for qsort().
+ NULL denotes pointer comparison. */
+typedef int (*gl_setelement_compar_fn) (const void *elt1, const void *elt2);
+
+/* Type of function used to dispose an element once it's removed from a set.
+ NULL denotes a no-op. */
+typedef void (*gl_setelement_dispose_fn) (const void *elt);
+
+/* Type of function used to compare an element with a threshold.
+ Return true if the element is greater or equal than the threshold. */
+typedef bool (*gl_setelement_threshold_fn) (const void *elt, const void *threshold);
+
+struct gl_oset_impl;
+/* Type representing an entire ordered set. */
+typedef struct gl_oset_impl * gl_oset_t;
+
+struct gl_oset_implementation;
+/* Type representing a ordered set datatype implementation. */
+typedef const struct gl_oset_implementation * gl_oset_implementation_t;
+
+/* Create an empty set.
+ IMPLEMENTATION is one of GL_ARRAY_OSET, GL_AVLTREE_OSET, GL_RBTREE_OSET.
+ COMPAR_FN is an element comparison function or NULL.
+ DISPOSE_FN is an element disposal function or NULL. */
+#if 0 /* declared in gl_xoset.h */
+extern gl_oset_t gl_oset_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_oset_t gl_oset_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn);
+
+/* Return the current number of elements in an ordered set. */
+extern size_t gl_oset_size (gl_oset_t set);
+
+/* Search whether an element is already in the ordered set.
+ Return true if found, or false if not present in the set. */
+extern bool gl_oset_search (gl_oset_t set, const void *elt);
+
+/* Search the least element in the ordered set that compares greater or equal
+ to the given THRESHOLD. The representation of the THRESHOLD is defined
+ by the THRESHOLD_FN.
+ Return true and store the found element in *ELTP if found, otherwise return
+ false. */
+extern bool gl_oset_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold,
+ const void **eltp);
+
+/* Add an element to an ordered set.
+ Return true if it was not already in the set and added, false otherwise. */
+#if 0 /* declared in gl_xoset.h */
+extern bool gl_oset_add (gl_oset_t set, const void *elt);
+#endif
+/* Likewise. Return -1 upon out-of-memory. */
+extern int gl_oset_nx_add (gl_oset_t set, const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Remove an element from an ordered set.
+ Return true if it was found and removed. */
+extern bool gl_oset_remove (gl_oset_t set, const void *elt);
+
+/* Free an entire ordered set.
+ (But this call does not free the elements of the set.) */
+extern void gl_oset_free (gl_oset_t set);
+
+/* --------------------- gl_oset_iterator_t Data Type --------------------- */
+
+/* Functions for iterating through an ordered set. */
+
+/* Type of an iterator that traverses an ordered set.
+ This is a fixed-size struct, so that creation of an iterator doesn't need
+ memory allocation on the heap. */
+typedef struct
+{
+ /* For fast dispatch of gl_oset_iterator_next. */
+ const struct gl_oset_implementation *vtable;
+ /* For detecting whether the last returned element was removed. */
+ gl_oset_t set;
+ size_t count;
+ /* Other, implementation-private fields. */
+ void *p; void *q;
+ size_t i; size_t j;
+} gl_oset_iterator_t;
+
+/* Create an iterator traversing an ordered set.
+ The set's contents must not be modified while the iterator is in use,
+ except for removing the last returned element. */
+extern gl_oset_iterator_t gl_oset_iterator (gl_oset_t set);
+
+/* If there is a next element, store the next element in *ELTP, advance the
+ iterator and return true. Otherwise, return false. */
+extern bool gl_oset_iterator_next (gl_oset_iterator_t *iterator,
+ const void **eltp);
+
+/* Free an iterator. */
+extern void gl_oset_iterator_free (gl_oset_iterator_t *iterator);
+
+/* ------------------------ Implementation Details ------------------------ */
+
+struct gl_oset_implementation
+{
+ /* gl_oset_t functions. */
+ gl_oset_t (*nx_create_empty) (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn);
+ size_t (*size) (gl_oset_t set);
+ bool (*search) (gl_oset_t set, const void *elt);
+ bool (*search_atleast) (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold, const void **eltp);
+ int (*nx_add) (gl_oset_t set, const void *elt);
+ bool (*remove_elt) (gl_oset_t set, const void *elt);
+ void (*oset_free) (gl_oset_t set);
+ /* gl_oset_iterator_t functions. */
+ gl_oset_iterator_t (*iterator) (gl_oset_t set);
+ bool (*iterator_next) (gl_oset_iterator_t *iterator, const void **eltp);
+ void (*iterator_free) (gl_oset_iterator_t *iterator);
+};
+
+struct gl_oset_impl_base
+{
+ const struct gl_oset_implementation *vtable;
+ gl_setelement_compar_fn compar_fn;
+ gl_setelement_dispose_fn dispose_fn;
+};
+
+#if HAVE_INLINE
+
+/* Define all functions of this file as inline accesses to the
+ struct gl_oset_implementation.
+ Use #define to avoid a warning because of extern vs. static. */
+
+# define gl_oset_nx_create_empty gl_oset_nx_create_empty_inline
+static inline gl_oset_t
+gl_oset_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ return implementation->nx_create_empty (implementation, compar_fn,
+ dispose_fn);
+}
+
+# define gl_oset_size gl_oset_size_inline
+static inline size_t
+gl_oset_size (gl_oset_t set)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->size (set);
+}
+
+# define gl_oset_search gl_oset_search_inline
+static inline bool
+gl_oset_search (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->search (set, elt);
+}
+
+# define gl_oset_search_atleast gl_oset_search_atleast_inline
+static inline bool
+gl_oset_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold, const void **eltp)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable
+ ->search_atleast (set, threshold_fn, threshold, eltp);
+}
+
+# define gl_oset_nx_add gl_oset_nx_add_inline
+static inline int
+gl_oset_nx_add (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->nx_add (set, elt);
+}
+
+# define gl_oset_remove gl_oset_remove_inline
+static inline bool
+gl_oset_remove (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable
+ ->remove_elt (set, elt);
+}
+
+# define gl_oset_free gl_oset_free_inline
+static inline void
+gl_oset_free (gl_oset_t set)
+{
+ ((const struct gl_oset_impl_base *) set)->vtable->oset_free (set);
+}
+
+# define gl_oset_iterator gl_oset_iterator_inline
+static inline gl_oset_iterator_t
+gl_oset_iterator (gl_oset_t set)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->iterator (set);
+}
+
+# define gl_oset_iterator_next gl_oset_iterator_next_inline
+static inline bool
+gl_oset_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+ return iterator->vtable->iterator_next (iterator, eltp);
+}
+
+# define gl_oset_iterator_free gl_oset_iterator_free_inline
+static inline void
+gl_oset_iterator_free (gl_oset_iterator_t *iterator)
+{
+ iterator->vtable->iterator_free (iterator);
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_OSET_H */
diff --git a/gnulib/lib/gl_rbtree_list.c b/gnulib/lib/gl_rbtree_list.c
new file mode 100644
index 00000000..fdbdce27
--- /dev/null
+++ b/gnulib/lib/gl_rbtree_list.c
@@ -0,0 +1,102 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_rbtree_list.h"
+
+#include <stdlib.h>
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic red-black tree code. */
+#include "gl_anyrbtree_list1.h"
+
+/* Generic binary tree code. */
+#include "gl_anytree_list1.h"
+
+/* Generic red-black tree code. */
+#include "gl_anyrbtree_list2.h"
+
+/* Generic binary tree code. */
+#include "gl_anytree_list2.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+ unsigned int left_blackheight =
+ (node->left != NULL ? check_invariants (node->left, node) : 0);
+ unsigned int right_blackheight =
+ (node->right != NULL ? check_invariants (node->right, node) : 0);
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->branch_size
+ == (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+ abort ();
+ if (!(node->color == BLACK || node->color == RED))
+ abort ();
+ if (parent == NULL && !(node->color == BLACK))
+ abort ();
+ if (!(left_blackheight == right_blackheight))
+ abort ();
+
+ return left_blackheight + (node->color == BLACK ? 1 : 0);
+}
+void
+gl_rbtree_list_check_invariants (gl_list_t list)
+{
+ if (list->root != NULL)
+ check_invariants (list->root, NULL);
+}
+
+const struct gl_list_implementation gl_rbtree_list_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_nx_create,
+ gl_tree_size,
+ gl_tree_node_value,
+ gl_tree_node_nx_set_value,
+ gl_tree_next_node,
+ gl_tree_previous_node,
+ gl_tree_get_at,
+ gl_tree_nx_set_at,
+ gl_tree_search_from_to,
+ gl_tree_indexof_from_to,
+ gl_tree_nx_add_first,
+ gl_tree_nx_add_last,
+ gl_tree_nx_add_before,
+ gl_tree_nx_add_after,
+ gl_tree_nx_add_at,
+ gl_tree_remove_node,
+ gl_tree_remove_at,
+ gl_tree_remove,
+ gl_tree_list_free,
+ gl_tree_iterator,
+ gl_tree_iterator_from_to,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free,
+ gl_tree_sortedlist_search,
+ gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof,
+ gl_tree_sortedlist_indexof_from_to,
+ gl_tree_sortedlist_nx_add,
+ gl_tree_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_rbtree_list.h b/gnulib/lib/gl_rbtree_list.h
new file mode 100644
index 00000000..1fde961c
--- /dev/null
+++ b/gnulib/lib/gl_rbtree_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_RBTREE_LIST_H
+#define _GL_RBTREE_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_rbtree_list_implementation;
+#define GL_RBTREE_LIST &gl_rbtree_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_RBTREE_LIST_H */
diff --git a/gnulib/lib/gl_rbtree_oset.c b/gnulib/lib/gl_rbtree_oset.c
new file mode 100644
index 00000000..f6b94ecb
--- /dev/null
+++ b/gnulib/lib/gl_rbtree_oset.c
@@ -0,0 +1,814 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_rbtree_oset.h"
+
+#include <stdlib.h>
+
+/* A red-black tree is a binary tree where every node is colored black or
+ red such that
+ 1. The root is black.
+ 2. No red node has a red parent.
+ Or equivalently: No red node has a red child.
+ 3. All paths from the root down to any NULL endpoint contain the same
+ number of black nodes.
+ Let's call this the "black-height" bh of the tree. It follows that every
+ such path contains exactly bh black and between 0 and bh red nodes. (The
+ extreme cases are a path containing only black nodes, and a path colored
+ alternatingly black-red-black-red-...-black-red.) The height of the tree
+ therefore is >= bh, <= 2*bh.
+ */
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Color of a node. */
+typedef enum color { BLACK, RED } color_t;
+
+/* Tree node implementation, valid for this file only. */
+struct gl_oset_node_impl
+{
+ struct gl_oset_node_impl *left; /* left branch, or NULL */
+ struct gl_oset_node_impl *right; /* right branch, or NULL */
+ /* Parent pointer, or NULL. The parent pointer is not needed for most
+ operations. It is needed so that a gl_oset_node_t can be returned
+ without memory allocation, on which the functions gl_oset_remove_node,
+ gl_oset_add_before, gl_oset_add_after can be implemented. */
+ struct gl_oset_node_impl *parent;
+ color_t color; /* node's color */
+ const void *value;
+};
+typedef struct gl_oset_node_impl * gl_oset_node_t;
+
+/* Concrete gl_oset_impl type, valid for this file only. */
+struct gl_oset_impl
+{
+ struct gl_oset_impl_base base;
+ struct gl_oset_node_impl *root; /* root node or NULL */
+ size_t count; /* number of nodes */
+};
+
+/* A red-black tree of height h has a black-height bh >= ceil(h/2) and
+ therefore at least 2^ceil(h/2) - 1 elements. So, h <= 116 (because a tree
+ of height h >= 117 would have at least 2^59 - 1 elements, and because even
+ on 64-bit machines,
+ sizeof (gl_oset_node_impl) * (2^59 - 1) > 2^64
+ this would exceed the address space of the machine. */
+#define MAXHEIGHT 116
+
+/* Rotate left a subtree.
+
+ B D
+ / \ / \
+ A D --> B E
+ / \ / \
+ C E A C
+
+ Change the tree structure, update the branch sizes.
+ The caller must update the colors and register D as child of its parent. */
+static inline gl_oset_node_t
+rotate_left (gl_oset_node_t b_node, gl_oset_node_t d_node)
+{
+ gl_oset_node_t c_node = d_node->left;
+
+ b_node->right = c_node;
+ d_node->left = b_node;
+
+ d_node->parent = b_node->parent;
+ b_node->parent = d_node;
+ if (c_node != NULL)
+ c_node->parent = b_node;
+
+ return d_node;
+}
+
+/* Rotate right a subtree.
+
+ D B
+ / \ / \
+ B E --> A D
+ / \ / \
+ A C C E
+
+ Change the tree structure, update the branch sizes.
+ The caller must update the colors and register B as child of its parent. */
+static inline gl_oset_node_t
+rotate_right (gl_oset_node_t b_node, gl_oset_node_t d_node)
+{
+ gl_oset_node_t c_node = b_node->right;
+
+ d_node->left = c_node;
+ b_node->right = d_node;
+
+ b_node->parent = d_node->parent;
+ d_node->parent = b_node;
+ if (c_node != NULL)
+ c_node->parent = d_node;
+
+ return b_node;
+}
+
+/* Ensure the tree is balanced, after an insertion operation.
+ Also assigns node->color.
+ parent is the given node's parent, known to be non-NULL. */
+static void
+rebalance_after_add (gl_oset_t set, gl_oset_node_t node, gl_oset_node_t parent)
+{
+ for (;;)
+ {
+ /* At this point, parent = node->parent != NULL.
+ Think of node->color being RED (although node->color is not yet
+ assigned.) */
+ gl_oset_node_t grandparent;
+ gl_oset_node_t uncle;
+
+ if (parent->color == BLACK)
+ {
+ /* A RED color for node is acceptable. */
+ node->color = RED;
+ return;
+ }
+
+ grandparent = parent->parent;
+ /* Since parent is RED, we know that
+ grandparent is != NULL and colored BLACK. */
+
+ if (grandparent->left == parent)
+ uncle = grandparent->right;
+ else if (grandparent->right == parent)
+ uncle = grandparent->left;
+ else
+ abort ();
+
+ if (uncle != NULL && uncle->color == RED)
+ {
+ /* Change grandparent from BLACK to RED, and
+ change parent and uncle from RED to BLACK.
+ This makes it acceptable for node to be RED. */
+ node->color = RED;
+ parent->color = uncle->color = BLACK;
+ node = grandparent;
+ }
+ else
+ {
+ /* grandparent and uncle are BLACK. parent is RED. node wants
+ to be RED too.
+ In this case, recoloring is not sufficient. Need to perform
+ one or two rotations. */
+ gl_oset_node_t *grandparentp;
+
+ if (grandparent->parent == NULL)
+ grandparentp = &set->root;
+ else if (grandparent->parent->left == grandparent)
+ grandparentp = &grandparent->parent->left;
+ else if (grandparent->parent->right == grandparent)
+ grandparentp = &grandparent->parent->right;
+ else
+ abort ();
+
+ if (grandparent->left == parent)
+ {
+ if (parent->right == node)
+ {
+ /* Rotation between node and parent. */
+ grandparent->left = rotate_left (parent, node);
+ node = parent;
+ parent = grandparent->left;
+ }
+ /* grandparent and uncle are BLACK. parent and node want to be
+ RED. parent = grandparent->left. node = parent->left.
+
+ grandparent parent
+ bh+1 bh+1
+ / \ / \
+ parent uncle --> node grandparent
+ bh bh bh bh
+ / \ / \
+ node C C uncle
+ bh bh bh bh
+ */
+ *grandparentp = rotate_right (parent, grandparent);
+ parent->color = BLACK;
+ node->color = grandparent->color = RED;
+ }
+ else /* grandparent->right == parent */
+ {
+ if (parent->left == node)
+ {
+ /* Rotation between node and parent. */
+ grandparent->right = rotate_right (node, parent);
+ node = parent;
+ parent = grandparent->right;
+ }
+ /* grandparent and uncle are BLACK. parent and node want to be
+ RED. parent = grandparent->right. node = parent->right.
+
+ grandparent parent
+ bh+1 bh+1
+ / \ / \
+ uncle parent --> grandparent node
+ bh bh bh bh
+ / \ / \
+ C node uncle C
+ bh bh bh bh
+ */
+ *grandparentp = rotate_left (grandparent, parent);
+ parent->color = BLACK;
+ node->color = grandparent->color = RED;
+ }
+ return;
+ }
+
+ /* Start again with a new (node, parent) pair. */
+ parent = node->parent;
+
+ if (parent == NULL)
+ {
+ /* Change node's color from RED to BLACK. This increases the
+ tree's black-height. */
+ node->color = BLACK;
+ return;
+ }
+ }
+}
+
+/* Ensure the tree is balanced, after a deletion operation.
+ CHILD was a grandchild of PARENT and is now its child. Between them,
+ a black node was removed. CHILD is also black, or NULL.
+ (CHILD can also be NULL. But PARENT is non-NULL.) */
+static void
+rebalance_after_remove (gl_oset_t set, gl_oset_node_t child, gl_oset_node_t parent)
+{
+ for (;;)
+ {
+ /* At this point, we reduced the black-height of the CHILD subtree by 1.
+ To make up, either look for a possibility to turn a RED to a BLACK
+ node, or try to reduce the black-height tree of CHILD's sibling
+ subtree as well. */
+ gl_oset_node_t *parentp;
+
+ if (parent->parent == NULL)
+ parentp = &set->root;
+ else if (parent->parent->left == parent)
+ parentp = &parent->parent->left;
+ else if (parent->parent->right == parent)
+ parentp = &parent->parent->right;
+ else
+ abort ();
+
+ if (parent->left == child)
+ {
+ gl_oset_node_t sibling = parent->right;
+ /* sibling's black-height is >= 1. In particular,
+ sibling != NULL.
+
+ parent
+ / \
+ child sibling
+ bh bh+1
+ */
+
+ if (sibling->color == RED)
+ {
+ /* sibling is RED, hence parent is BLACK and sibling's children
+ are non-NULL and BLACK.
+
+ parent sibling
+ bh+2 bh+2
+ / \ / \
+ child sibling --> parent SR
+ bh bh+1 bh+1 bh+1
+ / \ / \
+ SL SR child SL
+ bh+1 bh+1 bh bh+1
+ */
+ *parentp = rotate_left (parent, sibling);
+ parent->color = RED;
+ sibling->color = BLACK;
+
+ /* Concentrate on the subtree of parent. The new sibling is
+ one of the old sibling's children, and known to be BLACK. */
+ parentp = &sibling->left;
+ sibling = parent->right;
+ }
+ /* Now we know that sibling is BLACK.
+
+ parent
+ / \
+ child sibling
+ bh bh+1
+ */
+ if (sibling->right != NULL && sibling->right->color == RED)
+ {
+ /*
+ parent sibling
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ child sibling --> parent SR
+ bh bh+1 bh+1 bh+1
+ / \ / \
+ SL SR child SL
+ bh bh bh bh
+ */
+ *parentp = rotate_left (parent, sibling);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->right->color = BLACK;
+ return;
+ }
+ else if (sibling->left != NULL && sibling->left->color == RED)
+ {
+ /*
+ parent parent
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ child sibling --> child SL
+ bh bh+1 bh bh+1
+ / \ / \
+ SL SR SLL sibling
+ bh bh bh bh
+ / \ / \
+ SLL SLR SLR SR
+ bh bh bh bh
+
+ where SLL, SLR, SR are all black.
+ */
+ parent->right = rotate_right (sibling->left, sibling);
+ /* Change sibling from BLACK to RED and SL from RED to BLACK. */
+ sibling->color = RED;
+ sibling = parent->right;
+ sibling->color = BLACK;
+
+ /* Now do as in the previous case. */
+ *parentp = rotate_left (parent, sibling);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->right->color = BLACK;
+ return;
+ }
+ else
+ {
+ if (parent->color == BLACK)
+ {
+ /* Change sibling from BLACK to RED. Then the entire
+ subtree at parent has decreased its black-height.
+ parent parent
+ bh+2 bh+1
+ / \ / \
+ child sibling --> child sibling
+ bh bh+1 bh bh
+ */
+ sibling->color = RED;
+
+ child = parent;
+ }
+ else
+ {
+ /* Change parent from RED to BLACK, but compensate by
+ changing sibling from BLACK to RED.
+ parent parent
+ bh+1 bh+1
+ / \ / \
+ child sibling --> child sibling
+ bh bh+1 bh bh
+ */
+ parent->color = BLACK;
+ sibling->color = RED;
+ return;
+ }
+ }
+ }
+ else if (parent->right == child)
+ {
+ gl_oset_node_t sibling = parent->left;
+ /* sibling's black-height is >= 1. In particular,
+ sibling != NULL.
+
+ parent
+ / \
+ sibling child
+ bh+1 bh
+ */
+
+ if (sibling->color == RED)
+ {
+ /* sibling is RED, hence parent is BLACK and sibling's children
+ are non-NULL and BLACK.
+
+ parent sibling
+ bh+2 bh+2
+ / \ / \
+ sibling child --> SR parent
+ bh+1 ch bh+1 bh+1
+ / \ / \
+ SL SR SL child
+ bh+1 bh+1 bh+1 bh
+ */
+ *parentp = rotate_right (sibling, parent);
+ parent->color = RED;
+ sibling->color = BLACK;
+
+ /* Concentrate on the subtree of parent. The new sibling is
+ one of the old sibling's children, and known to be BLACK. */
+ parentp = &sibling->right;
+ sibling = parent->left;
+ }
+ /* Now we know that sibling is BLACK.
+
+ parent
+ / \
+ sibling child
+ bh+1 bh
+ */
+ if (sibling->left != NULL && sibling->left->color == RED)
+ {
+ /*
+ parent sibling
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ sibling child --> SL parent
+ bh+1 bh bh+1 bh+1
+ / \ / \
+ SL SR SR child
+ bh bh bh bh
+ */
+ *parentp = rotate_right (sibling, parent);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->left->color = BLACK;
+ return;
+ }
+ else if (sibling->right != NULL && sibling->right->color == RED)
+ {
+ /*
+ parent parent
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ sibling child --> SR child
+ bh+1 bh bh+1 bh
+ / \ / \
+ SL SR sibling SRR
+ bh bh bh bh
+ / \ / \
+ SRL SRR SL SRL
+ bh bh bh bh
+
+ where SL, SRL, SRR are all black.
+ */
+ parent->left = rotate_left (sibling, sibling->right);
+ /* Change sibling from BLACK to RED and SL from RED to BLACK. */
+ sibling->color = RED;
+ sibling = parent->left;
+ sibling->color = BLACK;
+
+ /* Now do as in the previous case. */
+ *parentp = rotate_right (sibling, parent);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->left->color = BLACK;
+ return;
+ }
+ else
+ {
+ if (parent->color == BLACK)
+ {
+ /* Change sibling from BLACK to RED. Then the entire
+ subtree at parent has decreased its black-height.
+ parent parent
+ bh+2 bh+1
+ / \ / \
+ sibling child --> sibling child
+ bh+1 bh bh bh
+ */
+ sibling->color = RED;
+
+ child = parent;
+ }
+ else
+ {
+ /* Change parent from RED to BLACK, but compensate by
+ changing sibling from BLACK to RED.
+ parent parent
+ bh+1 bh+1
+ / \ / \
+ sibling child --> sibling child
+ bh+1 bh bh bh
+ */
+ parent->color = BLACK;
+ sibling->color = RED;
+ return;
+ }
+ }
+ }
+ else
+ abort ();
+
+ /* Start again with a new (child, parent) pair. */
+ parent = child->parent;
+
+#if 0 /* Already handled. */
+ if (child != NULL && child->color == RED)
+ {
+ child->color = BLACK;
+ return;
+ }
+#endif
+
+ if (parent == NULL)
+ return;
+ }
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_first (gl_oset_t set, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (set->root == NULL)
+ {
+ new_node->color = BLACK;
+ set->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_oset_node_t node;
+
+ for (node = set->root; node->left != NULL; )
+ node = node->left;
+
+ node->left = new_node;
+ new_node->parent = node;
+
+ /* Color and rebalance. */
+ rebalance_after_add (set, new_node, node);
+ }
+
+ set->count++;
+ return new_node;
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_before (gl_oset_t set, gl_oset_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (node->left == NULL)
+ node->left = new_node;
+ else
+ {
+ for (node = node->left; node->right != NULL; )
+ node = node->right;
+ node->right = new_node;
+ }
+ new_node->parent = node;
+
+ /* Color and rebalance. */
+ rebalance_after_add (set, new_node, node);
+
+ set->count++;
+ return new_node;
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_after (gl_oset_t set, gl_oset_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (node->right == NULL)
+ node->right = new_node;
+ else
+ {
+ for (node = node->right; node->left != NULL; )
+ node = node->left;
+ node->left = new_node;
+ }
+ new_node->parent = node;
+
+ /* Color and rebalance. */
+ rebalance_after_add (set, new_node, node);
+
+ set->count++;
+ return new_node;
+}
+
+static bool
+gl_tree_remove_node (gl_oset_t set, gl_oset_node_t node)
+{
+ gl_oset_node_t parent = node->parent;
+
+ if (node->left == NULL)
+ {
+ /* Replace node with node->right. */
+ gl_oset_node_t child = node->right;
+
+ if (child != NULL)
+ {
+ child->parent = parent;
+ /* Since node->left == NULL, child must be RED and of height 1,
+ hence node must have been BLACK. Recolor the child. */
+ child->color = BLACK;
+ }
+ if (parent == NULL)
+ set->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ if (child == NULL && node->color == BLACK)
+ rebalance_after_remove (set, child, parent);
+ }
+ }
+ else if (node->right == NULL)
+ {
+ /* It is not absolutely necessary to treat this case. But the more
+ general case below is more complicated, hence slower. */
+ /* Replace node with node->left. */
+ gl_oset_node_t child = node->left;
+
+ child->parent = parent;
+ /* Since node->right == NULL, child must be RED and of height 1,
+ hence node must have been BLACK. Recolor the child. */
+ child->color = BLACK;
+ if (parent == NULL)
+ set->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+ }
+ }
+ else
+ {
+ /* Replace node with the rightmost element of the node->left subtree. */
+ gl_oset_node_t subst;
+ gl_oset_node_t subst_parent;
+ gl_oset_node_t child;
+ color_t removed_color;
+
+ for (subst = node->left; subst->right != NULL; )
+ subst = subst->right;
+
+ subst_parent = subst->parent;
+
+ child = subst->left;
+
+ removed_color = subst->color;
+
+ /* The case subst_parent == node is special: If we do nothing special,
+ we get confusion about node->left, subst->left and child->parent.
+ subst_parent == node
+ <==> The 'for' loop above terminated immediately.
+ <==> subst == subst_parent->left
+ [otherwise subst == subst_parent->right]
+ In this case, we would need to first set
+ child->parent = node; node->left = child;
+ and later - when we copy subst into node's position - again
+ child->parent = subst; subst->left = child;
+ Altogether a no-op. */
+ if (subst_parent != node)
+ {
+ if (child != NULL)
+ child->parent = subst_parent;
+ subst_parent->right = child;
+ }
+
+ /* Copy subst into node's position.
+ (This is safer than to copy subst's value into node, keep node in
+ place, and free subst.) */
+ if (subst_parent != node)
+ {
+ subst->left = node->left;
+ subst->left->parent = subst;
+ }
+ subst->right = node->right;
+ subst->right->parent = subst;
+ subst->color = node->color;
+ subst->parent = parent;
+ if (parent == NULL)
+ set->root = subst;
+ else if (parent->left == node)
+ parent->left = subst;
+ else /* parent->right == node */
+ parent->right = subst;
+
+ if (removed_color == BLACK)
+ {
+ if (child != NULL && child->color == RED)
+ /* Recolor the child. */
+ child->color = BLACK;
+ else
+ /* Rebalancing starts at child's parent, that is subst_parent -
+ except when subst_parent == node. In this case, we need to use
+ its replacement, subst. */
+ rebalance_after_remove (set, child,
+ subst_parent != node ? subst_parent : subst);
+ }
+ }
+
+ set->count--;
+ if (set->base.dispose_fn != NULL)
+ set->base.dispose_fn (node->value);
+ free (node);
+ return true;
+}
+
+/* Generic binary tree code. */
+#include "gl_anytree_oset.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_oset_node_t node, gl_oset_node_t parent, size_t *counterp)
+{
+ unsigned int left_blackheight =
+ (node->left != NULL ? check_invariants (node->left, node, counterp) : 0);
+ unsigned int right_blackheight =
+ (node->right != NULL ? check_invariants (node->right, node, counterp) : 0);
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->color == BLACK || node->color == RED))
+ abort ();
+ if (parent == NULL && !(node->color == BLACK))
+ abort ();
+ if (!(left_blackheight == right_blackheight))
+ abort ();
+
+ (*counterp)++;
+
+ return left_blackheight + (node->color == BLACK ? 1 : 0);
+}
+void
+gl_rbtree_oset_check_invariants (gl_oset_t set)
+{
+ size_t counter = 0;
+ if (set->root != NULL)
+ check_invariants (set->root, NULL, &counter);
+ if (!(set->count == counter))
+ abort ();
+}
+
+const struct gl_oset_implementation gl_rbtree_oset_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_size,
+ gl_tree_search,
+ gl_tree_search_atleast,
+ gl_tree_nx_add,
+ gl_tree_remove,
+ gl_tree_oset_free,
+ gl_tree_iterator,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free
+ };
diff --git a/gnulib/lib/gl_rbtree_oset.h b/gnulib/lib/gl_rbtree_oset.h
new file mode 100644
index 00000000..8bac66fe
--- /dev/null
+++ b/gnulib/lib/gl_rbtree_oset.h
@@ -0,0 +1,34 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_RBTREE_OSET_H
+#define _GL_RBTREE_OSET_H
+
+#include "gl_oset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_oset_implementation gl_rbtree_oset_implementation;
+#define GL_RBTREE_OSET &gl_rbtree_oset_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_RBTREE_OSET_H */
diff --git a/gnulib/lib/gl_rbtreehash_list.c b/gnulib/lib/gl_rbtreehash_list.c
new file mode 100644
index 00000000..1a9cd059
--- /dev/null
+++ b/gnulib/lib/gl_rbtreehash_list.c
@@ -0,0 +1,128 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_rbtreehash_list.h"
+
+#include <stdint.h> /* for SIZE_MAX */
+#include <stdlib.h>
+
+#include "gl_rbtree_oset.h"
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+#define WITH_HASHTABLE 1
+
+/* Which kind of binary trees to use for ordered sets. Quite arbitrary. */
+#define OSET_TREE_FLAVOR GL_RBTREE_OSET
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic hash-table code: Type definitions. */
+#include "gl_anyhash_list1.h"
+
+/* Generic red-black tree code: Type definitions. */
+#include "gl_anyrbtree_list1.h"
+
+/* Generic hash-table code: Low-level code. */
+#include "gl_anyhash_list2.h"
+
+/* Generic binary tree code: Type definitions. */
+#include "gl_anytree_list1.h"
+
+/* Hash-table with binary tree code: Handling of hash buckets. */
+#include "gl_anytreehash_list1.h"
+
+/* Generic red-black tree code: Insertion/deletion algorithms. */
+#include "gl_anyrbtree_list2.h"
+
+/* Generic binary tree code: Functions taking advantage of the hash table. */
+#include "gl_anytreehash_list2.h"
+
+/* Generic binary tree code: All other functions. */
+#include "gl_anytree_list2.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+ unsigned int left_blackheight =
+ (node->left != NULL ? check_invariants (node->left, node) : 0);
+ unsigned int right_blackheight =
+ (node->right != NULL ? check_invariants (node->right, node) : 0);
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->branch_size
+ == (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+ abort ();
+ if (!(node->color == BLACK || node->color == RED))
+ abort ();
+ if (parent == NULL && !(node->color == BLACK))
+ abort ();
+ if (!(left_blackheight == right_blackheight))
+ abort ();
+
+ return left_blackheight + (node->color == BLACK ? 1 : 0);
+}
+void
+gl_rbtreehash_list_check_invariants (gl_list_t list)
+{
+ if (list->root != NULL)
+ check_invariants (list->root, NULL);
+}
+
+
+const struct gl_list_implementation gl_rbtreehash_list_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_nx_create,
+ gl_tree_size,
+ gl_tree_node_value,
+ gl_tree_node_nx_set_value,
+ gl_tree_next_node,
+ gl_tree_previous_node,
+ gl_tree_get_at,
+ gl_tree_nx_set_at,
+ gl_tree_search_from_to,
+ gl_tree_indexof_from_to,
+ gl_tree_nx_add_first,
+ gl_tree_nx_add_last,
+ gl_tree_nx_add_before,
+ gl_tree_nx_add_after,
+ gl_tree_nx_add_at,
+ gl_tree_remove_node,
+ gl_tree_remove_at,
+ gl_tree_remove,
+ gl_tree_list_free,
+ gl_tree_iterator,
+ gl_tree_iterator_from_to,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free,
+ gl_tree_sortedlist_search,
+ gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof,
+ gl_tree_sortedlist_indexof_from_to,
+ gl_tree_sortedlist_nx_add,
+ gl_tree_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_rbtreehash_list.h b/gnulib/lib/gl_rbtreehash_list.h
new file mode 100644
index 00000000..092c122e
--- /dev/null
+++ b/gnulib/lib/gl_rbtreehash_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_RBTREEHASH_LIST_H
+#define _GL_RBTREEHASH_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_rbtreehash_list_implementation;
+#define GL_RBTREEHASH_LIST &gl_rbtreehash_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_RBTREEHASH_LIST_H */
diff --git a/gnulib/lib/gl_sublist.c b/gnulib/lib/gl_sublist.c
new file mode 100644
index 00000000..3083543a
--- /dev/null
+++ b/gnulib/lib/gl_sublist.c
@@ -0,0 +1,479 @@
+/* Sequential list data type backed by another list.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_sublist.h"
+
+#include <stdlib.h>
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+ /* Reference to the whole list. */
+ gl_list_t whole;
+ /* Limits of the index range. */
+ size_t start;
+ size_t end;
+};
+
+/* struct gl_list_node_impl doesn't exist here. The pointers are actually
+ indices + 1. (We don't use the whole list's gl_list_node_t implementation,
+ because gl_sublist_next_node and gl_sublist_previous_node would not be easy
+ to implement with this choice.) */
+#define INDEX_TO_NODE(index) (gl_list_node_t)(uintptr_t)(size_t)((index) + 1)
+#define NODE_TO_INDEX(node) ((uintptr_t)(node) - 1)
+
+static gl_list_t
+gl_sublist_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ /* Shouldn't be called. */
+ abort ();
+}
+
+static gl_list_t
+gl_sublist_nx_create_fill (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ /* Shouldn't be called. */
+ abort ();
+}
+
+static size_t
+gl_sublist_size (gl_list_t list)
+{
+ return list->end - list->start;
+}
+
+static const void *
+gl_sublist_node_value (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ return gl_list_get_at (list->whole, list->start + index);
+}
+
+static int
+gl_sublist_node_nx_set_value (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (gl_list_nx_set_at (list->whole, list->start + index, elt) == NULL)
+ return -1;
+ return 0;
+}
+
+static gl_list_node_t
+gl_sublist_next_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t count = list->end - list->start;
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ index++;
+ if (index < count)
+ return INDEX_TO_NODE (index);
+ else
+ return NULL;
+}
+
+static gl_list_node_t
+gl_sublist_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (index > 0)
+ return INDEX_TO_NODE (index - 1);
+ else
+ return NULL;
+}
+
+static const void *
+gl_sublist_get_at (gl_list_t list, size_t position)
+{
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ return gl_list_get_at (list->whole, list->start + position);
+}
+
+static gl_list_node_t
+gl_sublist_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (gl_list_nx_set_at (list->whole, list->start + position, elt) == NULL)
+ return NULL;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_sublist_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index && end_index <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+ {
+ size_t index =
+ gl_list_indexof_from_to (list->whole,
+ list->start + start_index,
+ list->start + end_index,
+ elt);
+ if (index != (size_t)(-1))
+ return INDEX_TO_NODE (index - list->start);
+ else
+ return NULL;
+ }
+}
+
+static size_t
+gl_sublist_indexof_from_to (gl_list_t list,
+ size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index && end_index <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+ {
+ size_t index =
+ gl_list_indexof_from_to (list->whole,
+ list->start + start_index,
+ list->start + end_index,
+ elt);
+ if (index != (size_t)(-1))
+ index -= list->start;
+ return index;
+ }
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_first (gl_list_t list, const void *elt)
+{
+ if (gl_list_nx_add_at (list->whole, list->start, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (0);
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_last (gl_list_t list, const void *elt)
+{
+ if (gl_list_nx_add_at (list->whole, list->end, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (list->end - list->start - 1);
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t position = NODE_TO_INDEX (node);
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (gl_list_nx_add_at (list->whole, list->start + position, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t position = NODE_TO_INDEX (node);
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ position++;
+ if (gl_list_nx_add_at (list->whole, list->start + position, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ if (!(position <= list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (gl_list_nx_add_at (list->whole, list->start + position, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (position);
+}
+
+static bool
+gl_sublist_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ return gl_list_remove_at (list->whole, list->start + index);
+}
+
+static bool
+gl_sublist_remove_at (gl_list_t list, size_t position)
+{
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ return gl_list_remove_at (list->whole, list->start + position);
+}
+
+static bool
+gl_sublist_remove (gl_list_t list, const void *elt)
+{
+ size_t position =
+ gl_list_indexof_from_to (list->whole, list->start, list->end, elt);
+ if (position == (size_t)(-1))
+ return false;
+ else
+ return gl_list_remove_at (list->whole, position);
+}
+
+static void
+gl_sublist_list_free (gl_list_t list)
+{
+ free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_sublist_iterator (gl_list_t list)
+{
+ return gl_list_iterator_from_to (list->whole, list->start, list->end);
+}
+
+static gl_list_iterator_t
+gl_sublist_iterator_from_to (gl_list_t list,
+ size_t start_index, size_t end_index)
+{
+ if (!(start_index <= end_index && end_index <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+ return gl_list_iterator_from_to (list->whole,
+ list->start + start_index,
+ list->start + end_index);
+}
+
+static bool
+gl_sublist_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ /* Shouldn't be called. */
+ abort ();
+}
+
+static void
+gl_sublist_iterator_free (gl_list_iterator_t *iterator)
+{
+ /* Shouldn't be called. */
+ abort ();
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static gl_list_node_t
+gl_sublist_sortedlist_search (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index =
+ gl_sortedlist_indexof_from_to (list->whole, compar,
+ list->start, list->end, elt);
+ if (index != (size_t)(-1))
+ return INDEX_TO_NODE (index - list->start);
+ else
+ return NULL;
+}
+
+static gl_list_node_t
+gl_sublist_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t index;
+
+ if (!(low <= high && high <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+
+ index =
+ gl_sortedlist_indexof_from_to (list->whole, compar,
+ list->start + low, list->start + high, elt);
+ if (index != (size_t)(-1))
+ return INDEX_TO_NODE (index - list->start);
+ else
+ return NULL;
+}
+
+static size_t
+gl_sublist_sortedlist_indexof (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index =
+ gl_sortedlist_indexof_from_to (list->whole, compar, list->start, list->end,
+ elt);
+ if (index != (size_t)(-1))
+ index -= list->start;
+ return index;
+}
+
+static size_t
+gl_sublist_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t index;
+
+ if (!(low <= high && high <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+
+ index = gl_sortedlist_indexof_from_to (list->whole, compar,
+ list->start + low, list->start + high,
+ elt);
+ if (index != (size_t)(-1))
+ index -= list->start;
+ return index;
+}
+
+static gl_list_node_t
+gl_sublist_sortedlist_nx_add (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ /* It's impossible to implement this method without risking to put the
+ whole list into unsorted order (namely, when the given ELT is smaller
+ or larger than all elements of the sublist). */
+ abort ();
+}
+
+static bool
+gl_sublist_sortedlist_remove (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index = gl_sublist_sortedlist_indexof (list, compar, elt);
+ if (index == (size_t)(-1))
+ return false;
+ else
+ return gl_sublist_remove_at (list, index);
+}
+
+
+static const struct gl_list_implementation gl_sublist_list_implementation =
+ {
+ gl_sublist_nx_create_empty,
+ gl_sublist_nx_create_fill,
+ gl_sublist_size,
+ gl_sublist_node_value,
+ gl_sublist_node_nx_set_value,
+ gl_sublist_next_node,
+ gl_sublist_previous_node,
+ gl_sublist_get_at,
+ gl_sublist_nx_set_at,
+ gl_sublist_search_from_to,
+ gl_sublist_indexof_from_to,
+ gl_sublist_nx_add_first,
+ gl_sublist_nx_add_last,
+ gl_sublist_nx_add_before,
+ gl_sublist_nx_add_after,
+ gl_sublist_nx_add_at,
+ gl_sublist_remove_node,
+ gl_sublist_remove_at,
+ gl_sublist_remove,
+ gl_sublist_list_free,
+ gl_sublist_iterator,
+ gl_sublist_iterator_from_to,
+ gl_sublist_iterator_next,
+ gl_sublist_iterator_free,
+ gl_sublist_sortedlist_search,
+ gl_sublist_sortedlist_search_from_to,
+ gl_sublist_sortedlist_indexof,
+ gl_sublist_sortedlist_indexof_from_to,
+ gl_sublist_sortedlist_nx_add,
+ gl_sublist_sortedlist_remove
+ };
+
+gl_list_t
+gl_sublist_nx_create (gl_list_t whole_list, size_t start_index, size_t end_index)
+{
+ if (!(start_index <= end_index && end_index <= gl_list_size (whole_list)))
+ /* Invalid arguments. */
+ abort ();
+ {
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = &gl_sublist_list_implementation;
+ list->base.equals_fn = whole_list->base.equals_fn; /* actually unused */
+ list->base.hashcode_fn = whole_list->base.hashcode_fn; /* actually unused */
+ list->base.dispose_fn = whole_list->base.dispose_fn; /* actually unused */
+ list->base.allow_duplicates = whole_list->base.allow_duplicates; /* unused */
+ if (whole_list->base.vtable == &gl_sublist_list_implementation)
+ {
+ /* Optimization of a sublist of a sublist: Collapse the two
+ indirections into a single indirection. */
+ list->whole = whole_list->whole;
+ list->start = whole_list->start + start_index;
+ list->end = whole_list->start + end_index;
+ }
+ else
+ {
+ list->whole = whole_list;
+ list->start = start_index;
+ list->end = end_index;
+ }
+
+ return list;
+ }
+}
diff --git a/gnulib/lib/gl_sublist.h b/gnulib/lib/gl_sublist.h
new file mode 100644
index 00000000..ea50c6e1
--- /dev/null
+++ b/gnulib/lib/gl_sublist.h
@@ -0,0 +1,49 @@
+/* Sequential list data type backed by another list.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _GL_SUBLIST_H
+#define _GL_SUBLIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Create a sublist of a given list.
+ This is the list of elements with indices i, start_index <= i < end_index.
+ The sublist is backed by the given list, which means:
+ - Modifications to the sublist affect the whole list.
+ - Modifications to the whole list are immediately visible in the sublist.
+ - The sublist is only valid as long as the whole list is valid.
+ - The sublist must not be passed to the gl_list_sortedlist_add() function.
+ */
+#if 0 /* declared in gl_xsublist.h */
+extern gl_list_t gl_sublist_create (gl_list_t whole_list,
+ size_t start_index, size_t end_index);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_t gl_sublist_nx_create (gl_list_t whole_list,
+ size_t start_index, size_t end_index);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_SUBLIST_H */
diff --git a/gnulib/lib/gl_xlist.c b/gnulib/lib/gl_xlist.c
new file mode 100644
index 00000000..2bffc6f3
--- /dev/null
+++ b/gnulib/lib/gl_xlist.c
@@ -0,0 +1,128 @@
+/* Abstract sequential list data type, with out-of-memory checking.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_xlist.h"
+
+#if !HAVE_INLINE
+
+gl_list_t
+gl_list_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ gl_list_t result =
+ gl_list_nx_create_empty (implementation, equals_fn, hashcode_fn, dispose_fn,
+ allow_duplicates);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_t
+gl_list_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ gl_list_t result =
+ gl_list_nx_create (implementation, equals_fn, hashcode_fn, dispose_fn,
+ allow_duplicates, count, contents);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+void
+gl_list_node_set_value (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ int result = gl_list_node_nx_set_value (list, node, elt);
+ if (result < 0)
+ xalloc_die ();
+}
+
+gl_list_node_t
+gl_list_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_set_at (list, position, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_first (gl_list_t list, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_first (list, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_last (gl_list_t list, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_last (list, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_before (list, node, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_after (list, node, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_at (list, position, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t result = gl_sortedlist_nx_add (list, compar, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+#endif
diff --git a/gnulib/lib/gl_xlist.h b/gnulib/lib/gl_xlist.h
new file mode 100644
index 00000000..2f352bee
--- /dev/null
+++ b/gnulib/lib/gl_xlist.h
@@ -0,0 +1,179 @@
+/* Abstract sequential list data type, with out-of-memory checking.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#ifndef _GL_XLIST_H
+#define _GL_XLIST_H
+
+#include "gl_list.h"
+#include "xalloc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions are thin wrappers around the corresponding functions with
+ _nx_ infix from gl_list.h. Upon out-of-memory, they invoke xalloc_die (),
+ instead of returning an error indicator. */
+extern gl_list_t gl_list_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates);
+extern gl_list_t gl_list_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents);
+extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position,
+ const void *elt);
+extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt);
+extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt);
+extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+extern gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+extern gl_list_node_t gl_list_add_at (gl_list_t list, size_t position,
+ const void *elt);
+extern gl_list_node_t gl_sortedlist_add (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+
+#if HAVE_INLINE
+
+# define gl_list_create_empty gl_list_create_empty_inline
+static inline gl_list_t
+gl_list_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ gl_list_t result =
+ gl_list_nx_create_empty (implementation, equals_fn, hashcode_fn, dispose_fn,
+ allow_duplicates);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_create gl_list_create_inline
+static inline gl_list_t
+gl_list_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ gl_list_t result =
+ gl_list_nx_create (implementation, equals_fn, hashcode_fn, dispose_fn,
+ allow_duplicates, count, contents);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_node_set_value gl_list_node_set_value_inline
+static inline void
+gl_list_node_set_value (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ int result = gl_list_node_nx_set_value (list, node, elt);
+ if (result < 0)
+ xalloc_die ();
+}
+
+# define gl_list_set_at gl_list_set_at_inline
+static inline gl_list_node_t
+gl_list_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_set_at (list, position, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_first gl_list_add_first_inline
+static inline gl_list_node_t
+gl_list_add_first (gl_list_t list, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_first (list, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_last gl_list_add_last_inline
+static inline gl_list_node_t
+gl_list_add_last (gl_list_t list, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_last (list, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_before gl_list_add_before_inline
+static inline gl_list_node_t
+gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_before (list, node, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_after gl_list_add_after_inline
+static inline gl_list_node_t
+gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_after (list, node, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_at gl_list_add_at_inline
+static inline gl_list_node_t
+gl_list_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_at (list, position, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_sortedlist_add gl_sortedlist_add_inline
+static inline gl_list_node_t
+gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t result = gl_sortedlist_nx_add (list, compar, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_XLIST_H */
diff --git a/gnulib/lib/gl_xoset.c b/gnulib/lib/gl_xoset.c
new file mode 100644
index 00000000..21dbf716
--- /dev/null
+++ b/gnulib/lib/gl_xoset.c
@@ -0,0 +1,46 @@
+/* Abstract ordered set data type, with out-of-memory checking.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_xoset.h"
+
+#if !HAVE_INLINE
+
+gl_oset_t
+gl_oset_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ gl_oset_t result =
+ gl_oset_nx_create_empty (implementation, compar_fn, dispose_fn);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+bool
+gl_oset_add (gl_oset_t set, const void *elt)
+{
+ int result = gl_oset_nx_add (set, elt);
+ if (result < 0)
+ xalloc_die ();
+ return result;
+}
+
+#endif
diff --git a/gnulib/lib/gl_xoset.h b/gnulib/lib/gl_xoset.h
new file mode 100644
index 00000000..905865d9
--- /dev/null
+++ b/gnulib/lib/gl_xoset.h
@@ -0,0 +1,67 @@
+/* Abstract ordered set data type, with out-of-memory checking.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#ifndef _GL_XOSET_H
+#define _GL_XOSET_H
+
+#include "gl_oset.h"
+#include "xalloc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions are thin wrappers around the corresponding functions with
+ _nx_ infix from gl_oset.h. Upon out-of-memory, they invoke xalloc_die (),
+ instead of returning an error indicator. */
+extern gl_oset_t gl_oset_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn);
+extern bool gl_oset_add (gl_oset_t set, const void *elt);
+
+#if HAVE_INLINE
+
+# define gl_oset_create_empty gl_oset_create_empty_inline
+static inline gl_oset_t
+gl_oset_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ gl_oset_t result =
+ gl_oset_nx_create_empty (implementation, compar_fn, dispose_fn);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_oset_add gl_oset_add_inline
+static inline bool
+gl_oset_add (gl_oset_t set, const void *elt)
+{
+ int result = gl_oset_nx_add (set, elt);
+ if (result < 0)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_XOSET_H */
diff --git a/gnulib/lib/gl_xsublist.c b/gnulib/lib/gl_xsublist.c
new file mode 100644
index 00000000..7a30ad79
--- /dev/null
+++ b/gnulib/lib/gl_xsublist.c
@@ -0,0 +1,35 @@
+/* Sequential list data type backed by another list, with out-of-memory
+ checking.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_xsublist.h"
+
+#if !HAVE_INLINE
+
+gl_list_t
+gl_sublist_create (gl_list_t whole_list, size_t start_index, size_t end_index)
+{
+ gl_list_t result = gl_sublist_nx_create (whole_list, start_index, end_index);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+#endif
diff --git a/gnulib/lib/gl_xsublist.h b/gnulib/lib/gl_xsublist.h
new file mode 100644
index 00000000..dfd97d13
--- /dev/null
+++ b/gnulib/lib/gl_xsublist.h
@@ -0,0 +1,53 @@
+/* Sequential list data type backed by another list, with out-of-memory
+ checking.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#ifndef _GL_XSUBLIST_H
+#define _GL_XSUBLIST_H
+
+#include "gl_sublist.h"
+#include "xalloc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions are thin wrappers around the corresponding functions with
+ _nx_ infix from gl_sublist.h. Upon out-of-memory, they invoke
+ xalloc_die (), instead of returning an error indicator. */
+extern gl_list_t gl_sublist_create (gl_list_t whole_list,
+ size_t start_index, size_t end_index);
+
+#if HAVE_INLINE
+
+# define gl_sublist_create gl_sublist_create_inline
+static inline gl_list_t
+gl_sublist_create (gl_list_t whole_list, size_t start_index, size_t end_index)
+{
+ gl_list_t result = gl_sublist_nx_create (whole_list, start_index, end_index);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_XSUBLIST_H */
diff --git a/gnulib/lib/glob-libc.h b/gnulib/lib/glob-libc.h
new file mode 100644
index 00000000..575b9fdd
--- /dev/null
+++ b/gnulib/lib/glob-libc.h
@@ -0,0 +1,212 @@
+/* Copyright (C) 1991-1992, 1995-1998, 2000-2001, 2004-2007, 2009-2010 Free
+ Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _GLOB_H
+#define _GLOB_H 1
+
+#ifndef __GLOB_GNULIB
+# include <sys/cdefs.h>
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+# define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# define _Restrict_ __restrict
+# else
+# define _Restrict_
+# endif
+#endif
+
+__BEGIN_DECLS
+
+/* We need `size_t' for the following definitions. */
+#ifndef __size_t
+# if defined __GNUC__ && __GNUC__ >= 2
+typedef __SIZE_TYPE__ __size_t;
+# ifdef __USE_XOPEN
+typedef __SIZE_TYPE__ size_t;
+# endif
+# else
+# include <stddef.h>
+# ifndef __size_t
+# define __size_t size_t
+# endif
+# endif
+#else
+/* The GNU CC stddef.h version defines __size_t as empty. We need a real
+ definition. */
+# undef __size_t
+# define __size_t size_t
+#endif
+
+/* Bits set in the FLAGS argument to `glob'. */
+#define GLOB_ERR (1 << 0)/* Return on read errors. */
+#define GLOB_MARK (1 << 1)/* Append a slash to each name. */
+#define GLOB_NOSORT (1 << 2)/* Don't sort the names. */
+#define GLOB_DOOFFS (1 << 3)/* Insert PGLOB->gl_offs NULLs. */
+#define GLOB_NOCHECK (1 << 4)/* If nothing matches, return the pattern. */
+#define GLOB_APPEND (1 << 5)/* Append to results of a previous call. */
+#define GLOB_NOESCAPE (1 << 6)/* Backslashes don't quote metacharacters. */
+#define GLOB_PERIOD (1 << 7)/* Leading `.' can be matched by metachars. */
+
+#if !defined __USE_POSIX2 || defined __USE_BSD || defined __USE_GNU
+# define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */
+# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */
+# define GLOB_BRACE (1 << 10)/* Expand "{a,b}" to "a" "b". */
+# define GLOB_NOMAGIC (1 << 11)/* If no magic chars, return the pattern. */
+# define GLOB_TILDE (1 << 12)/* Expand ~user and ~ to home directories. */
+# define GLOB_ONLYDIR (1 << 13)/* Match only directories. */
+# define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return an error
+ if the user name is not available. */
+# define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
+ GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \
+ GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE| \
+ GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR|GLOB_TILDE_CHECK)
+#else
+# define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
+ GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \
+ GLOB_PERIOD)
+#endif
+
+/* Error returns from `glob'. */
+#define GLOB_NOSPACE 1 /* Ran out of memory. */
+#define GLOB_ABORTED 2 /* Read error. */
+#define GLOB_NOMATCH 3 /* No matches found. */
+#define GLOB_NOSYS 4 /* Not implemented. */
+#ifdef __USE_GNU
+/* Previous versions of this file defined GLOB_ABEND instead of
+ GLOB_ABORTED. Provide a compatibility definition here. */
+# define GLOB_ABEND GLOB_ABORTED
+#endif
+
+/* Structure describing a globbing run. */
+#ifdef __USE_GNU
+struct stat;
+#endif
+typedef struct
+ {
+ __size_t gl_pathc; /* Count of paths matched by the pattern. */
+ char **gl_pathv; /* List of matched pathnames. */
+ __size_t gl_offs; /* Slots to reserve in `gl_pathv'. */
+ int gl_flags; /* Set to FLAGS, maybe | GLOB_MAGCHAR. */
+
+ /* If the GLOB_ALTDIRFUNC flag is set, the following functions
+ are used instead of the normal file access functions. */
+ void (*gl_closedir) (void *);
+#ifdef __USE_GNU
+ struct dirent *(*gl_readdir) (void *);
+#else
+ void *(*gl_readdir) (void *);
+#endif
+ void *(*gl_opendir) (const char *);
+#ifdef __USE_GNU
+ int (*gl_lstat) (const char *_Restrict_, struct stat *_Restrict_);
+ int (*gl_stat) (const char *_Restrict_, struct stat *_Restrict_);
+#else
+ int (*gl_lstat) (const char *_Restrict_, void *_Restrict_);
+ int (*gl_stat) (const char *_Restrict_, void *_Restrict_);
+#endif
+ } glob_t;
+
+#if defined __USE_LARGEFILE64 && !defined __GLOB_GNULIB
+# ifdef __USE_GNU
+struct stat64;
+# endif
+typedef struct
+ {
+ __size_t gl_pathc;
+ char **gl_pathv;
+ __size_t gl_offs;
+ int gl_flags;
+
+ /* If the GLOB_ALTDIRFUNC flag is set, the following functions
+ are used instead of the normal file access functions. */
+ void (*gl_closedir) (void *);
+# ifdef __USE_GNU
+ struct dirent64 *(*gl_readdir) (void *);
+# else
+ void *(*gl_readdir) (void *);
+# endif
+ void *(*gl_opendir) (const char *);
+# ifdef __USE_GNU
+ int (*gl_lstat) (const char *_Restrict_, struct stat64 *_Restrict_);
+ int (*gl_stat) (const char *_Restrict_, struct stat64 *_Restrict_);
+# else
+ int (*gl_lstat) (const char *_Restrict_, void *_Restrict_);
+ int (*gl_stat) (const char *_Restrict_, void *_Restrict_);
+# endif
+ } glob64_t;
+#endif
+
+#if __USE_FILE_OFFSET64 && __GNUC__ < 2 && !defined __GLOB_GNULIB
+# define glob glob64
+# define globfree globfree64
+#endif
+
+/* Do glob searching for PATTERN, placing results in PGLOB.
+ The bits defined above may be set in FLAGS.
+ If a directory cannot be opened or read and ERRFUNC is not nil,
+ it is called with the pathname that caused the error, and the
+ `errno' value from the failing call; if it returns non-zero
+ `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
+ If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
+ Otherwise, `glob' returns zero. */
+#if !defined __USE_FILE_OFFSET64 || __GNUC__ < 2 || defined __GLOB_GNULIB
+extern int glob (const char *_Restrict_ __pattern, int __flags,
+ int (*__errfunc) (const char *, int),
+ glob_t *_Restrict_ __pglob) __THROW _GL_ARG_NONNULL ((1, 4));
+
+/* Free storage allocated in PGLOB by a previous `glob' call. */
+extern void globfree (glob_t *__pglob) __THROW _GL_ARG_NONNULL ((1));
+#else
+extern int __REDIRECT_NTH (glob, (const char *_Restrict_ __pattern,
+ int __flags,
+ int (*__errfunc) (const char *, int),
+ glob_t *_Restrict_ __pglob), glob64);
+
+extern void __REDIRECT_NTH (globfree, (glob_t *__pglob), globfree64);
+#endif
+
+#if defined __USE_LARGEFILE64 && !defined __GLOB_GNULIB
+extern int glob64 (const char *_Restrict_ __pattern, int __flags,
+ int (*__errfunc) (const char *, int),
+ glob64_t *_Restrict_ __pglob)
+ __THROW _GL_ARG_NONNULL ((1, 4));
+
+extern void globfree64 (glob64_t *__pglob) __THROW _GL_ARG_NONNULL ((1));
+#endif
+
+
+#ifdef __USE_GNU
+/* Return nonzero if PATTERN contains any metacharacters.
+ Metacharacters can be quoted with backslashes if QUOTE is nonzero.
+
+ This function is not part of the interface specified by POSIX.2
+ but several programs want to use it. */
+extern int glob_pattern_p (const char *__pattern, int __quote)
+ __THROW _GL_ARG_NONNULL ((1));
+#endif
+
+__END_DECLS
+
+#endif /* glob.h */
diff --git a/gnulib/lib/glob.c b/gnulib/lib/glob.c
new file mode 100644
index 00000000..03b55df2
--- /dev/null
+++ b/gnulib/lib/glob.c
@@ -0,0 +1,1552 @@
+/* Copyright (C) 1991-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the pattern == NULL || pglob == NULL tests below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <glob.h>
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stddef.h>
+
+/* Outcomment the following line for production quality code. */
+/* #define NDEBUG 1 */
+#include <assert.h>
+
+#include <stdbool.h>
+
+#include <stdio.h> /* Needed on stupid SunOS for assert. */
+
+#if !defined _LIBC || !defined GLOB_ONLY_P
+
+#include <unistd.h>
+#if !defined POSIX && defined _POSIX_VERSION
+# define POSIX
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WINDOWS32
+#endif
+
+#ifndef WINDOWS32
+# include <pwd.h>
+#endif
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#include <dirent.h>
+
+
+/* In GNU systems, <dirent.h> defines this macro for us. */
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dirent) strlen ((dirent)->d_name)
+#endif
+
+/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
+ if the `d_type' member for `struct dirent' is available.
+ HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */
+#if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
+/* True if the directory entry D must be of type T. */
+# define DIRENT_MUST_BE(d, t) ((d)->d_type == (t))
+
+/* True if the directory entry D might be a symbolic link. */
+# define DIRENT_MIGHT_BE_SYMLINK(d) \
+ ((d)->d_type == DT_UNKNOWN || (d)->d_type == DT_LNK)
+
+/* True if the directory entry D might be a directory. */
+# define DIRENT_MIGHT_BE_DIR(d) \
+ ((d)->d_type == DT_DIR || DIRENT_MIGHT_BE_SYMLINK (d))
+
+#else /* !HAVE_D_TYPE */
+# define DIRENT_MUST_BE(d, t) false
+# define DIRENT_MIGHT_BE_SYMLINK(d) true
+# define DIRENT_MIGHT_BE_DIR(d) true
+#endif /* HAVE_D_TYPE */
+
+/* If the system has the `struct dirent64' type we use it internally. */
+#if defined _LIBC && !defined COMPILE_GLOB64
+# if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
+# define CONVERT_D_INO(d64, d32)
+# else
+# define CONVERT_D_INO(d64, d32) \
+ (d64)->d_ino = (d32)->d_ino;
+# endif
+
+# ifdef _DIRENT_HAVE_D_TYPE
+# define CONVERT_D_TYPE(d64, d32) \
+ (d64)->d_type = (d32)->d_type;
+# else
+# define CONVERT_D_TYPE(d64, d32)
+# endif
+
+# define CONVERT_DIRENT_DIRENT64(d64, d32) \
+ memcpy ((d64)->d_name, (d32)->d_name, _D_EXACT_NAMLEN (d32) + 1); \
+ CONVERT_D_INO (d64, d32) \
+ CONVERT_D_TYPE (d64, d32)
+#endif
+
+
+#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
+/* Posix does not require that the d_ino field be present, and some
+ systems do not provide it. */
+# define REAL_DIR_ENTRY(dp) 1
+#else
+# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
+#endif /* POSIX */
+
+#include <stdlib.h>
+#include <string.h>
+
+/* NAME_MAX is usually defined in <dirent.h> or <limits.h>. */
+#include <limits.h>
+#ifndef NAME_MAX
+# define NAME_MAX (sizeof (((struct dirent *) 0)->d_name))
+#endif
+
+#include <alloca.h>
+
+#ifdef _LIBC
+# undef strdup
+# define strdup(str) __strdup (str)
+# define sysconf(id) __sysconf (id)
+# define closedir(dir) __closedir (dir)
+# define opendir(name) __opendir (name)
+# define readdir(str) __readdir64 (str)
+# define getpwnam_r(name, bufp, buf, len, res) \
+ __getpwnam_r (name, bufp, buf, len, res)
+# ifndef __stat64
+# define __stat64(fname, buf) __xstat64 (_STAT_VER, fname, buf)
+# endif
+# define struct_stat64 struct stat64
+#else /* !_LIBC */
+# define __stat64(fname, buf) stat (fname, buf)
+# define __fxstatat64(_, d, f, st, flag) fstatat (d, f, st, flag)
+# define struct_stat64 struct stat
+# define __stat(fname, buf) stat (fname, buf)
+# define __alloca alloca
+# define __readdir readdir
+# define __readdir64 readdir64
+# define __glob_pattern_p glob_pattern_p
+#endif /* _LIBC */
+
+#include <fnmatch.h>
+
+#ifdef _SC_GETPW_R_SIZE_MAX
+# define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX)
+#else
+# define GETPW_R_SIZE_MAX() (-1)
+#endif
+#ifdef _SC_LOGIN_NAME_MAX
+# define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX)
+#else
+# define GET_LOGIN_NAME_MAX() (-1)
+#endif
+
+static const char *next_brace_sub (const char *begin, int flags) __THROW;
+
+#endif /* !defined _LIBC || !defined GLOB_ONLY_P */
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+#ifndef __attribute_noinline__
+# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1)
+# define __attribute_noinline__ /* Ignore */
+#else
+# define __attribute_noinline__ __attribute__ ((__noinline__))
+# endif
+#endif
+
+#if ! defined __builtin_expect && __GNUC__ < 3
+# define __builtin_expect(expr, expected) (expr)
+#endif
+
+#ifndef _LIBC
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary recursion in fchdir.c and opendir_safer.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use opendir_safer. */
+# undef opendir
+# undef closedir
+
+# if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots. */
+# define __libc_use_alloca(n) ((n) < 4032)
+# else
+/* alloca is implemented with malloc, so just use malloc. */
+# define __libc_use_alloca(n) 0
+# endif
+#endif
+
+static int glob_in_dir (const char *pattern, const char *directory,
+ int flags, int (*errfunc) (const char *, int),
+ glob_t *pglob);
+extern int __glob_pattern_type (const char *pattern, int quote)
+ attribute_hidden;
+
+#if !defined _LIBC || !defined GLOB_ONLY_P
+static int prefix_array (const char *prefix, char **array, size_t n) __THROW;
+static int collated_compare (const void *, const void *) __THROW;
+
+
+/* Find the end of the sub-pattern in a brace expression. */
+static const char *
+next_brace_sub (const char *cp, int flags)
+{
+ unsigned int depth = 0;
+ while (*cp != '\0')
+ if ((flags & GLOB_NOESCAPE) == 0 && *cp == '\\')
+ {
+ if (*++cp == '\0')
+ break;
+ ++cp;
+ }
+ else
+ {
+ if ((*cp == '}' && depth-- == 0) || (*cp == ',' && depth == 0))
+ break;
+
+ if (*cp++ == '{')
+ depth++;
+ }
+
+ return *cp != '\0' ? cp : NULL;
+}
+
+#endif /* !defined _LIBC || !defined GLOB_ONLY_P */
+
+/* Do glob searching for PATTERN, placing results in PGLOB.
+ The bits defined above may be set in FLAGS.
+ If a directory cannot be opened or read and ERRFUNC is not nil,
+ it is called with the pathname that caused the error, and the
+ `errno' value from the failing call; if it returns non-zero
+ `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
+ If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
+ Otherwise, `glob' returns zero. */
+int
+#ifdef GLOB_ATTRIBUTE
+GLOB_ATTRIBUTE
+#endif
+glob (pattern, flags, errfunc, pglob)
+ const char * restrict pattern;
+ int flags;
+ int (*errfunc) (const char *, int);
+ glob_t * restrict pglob;
+{
+ const char *filename;
+ const char *dirname;
+ size_t dirlen;
+ int status;
+ size_t oldcount;
+ int meta;
+ int dirname_modified;
+ glob_t dirs;
+
+ if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (!(flags & GLOB_DOOFFS))
+ /* Have to do this so `globfree' knows where to start freeing. It
+ also makes all the code that uses gl_offs simpler. */
+ pglob->gl_offs = 0;
+
+ if (flags & GLOB_BRACE)
+ {
+ const char *begin;
+
+ if (flags & GLOB_NOESCAPE)
+ begin = strchr (pattern, '{');
+ else
+ {
+ begin = pattern;
+ while (1)
+ {
+ if (*begin == '\0')
+ {
+ begin = NULL;
+ break;
+ }
+
+ if (*begin == '\\' && begin[1] != '\0')
+ ++begin;
+ else if (*begin == '{')
+ break;
+
+ ++begin;
+ }
+ }
+
+ if (begin != NULL)
+ {
+ /* Allocate working buffer large enough for our work. Note that
+ we have at least an opening and closing brace. */
+ size_t firstc;
+ char *alt_start;
+ const char *p;
+ const char *next;
+ const char *rest;
+ size_t rest_len;
+#ifdef __GNUC__
+ char onealt[strlen (pattern) - 1];
+#else
+ char *onealt = malloc (strlen (pattern) - 1);
+ if (onealt == NULL)
+ {
+ if (!(flags & GLOB_APPEND))
+ {
+ pglob->gl_pathc = 0;
+ pglob->gl_pathv = NULL;
+ }
+ return GLOB_NOSPACE;
+ }
+#endif
+
+ /* We know the prefix for all sub-patterns. */
+ alt_start = mempcpy (onealt, pattern, begin - pattern);
+
+ /* Find the first sub-pattern and at the same time find the
+ rest after the closing brace. */
+ next = next_brace_sub (begin + 1, flags);
+ if (next == NULL)
+ {
+ /* It is an invalid expression. */
+#ifndef __GNUC__
+ free (onealt);
+#endif
+ return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
+ }
+
+ /* Now find the end of the whole brace expression. */
+ rest = next;
+ while (*rest != '}')
+ {
+ rest = next_brace_sub (rest + 1, flags);
+ if (rest == NULL)
+ {
+ /* It is an invalid expression. */
+#ifndef __GNUC__
+ free (onealt);
+#endif
+ return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
+ }
+ }
+ /* Please note that we now can be sure the brace expression
+ is well-formed. */
+ rest_len = strlen (++rest) + 1;
+
+ /* We have a brace expression. BEGIN points to the opening {,
+ NEXT points past the terminator of the first element, and END
+ points past the final }. We will accumulate result names from
+ recursive runs for each brace alternative in the buffer using
+ GLOB_APPEND. */
+
+ if (!(flags & GLOB_APPEND))
+ {
+ /* This call is to set a new vector, so clear out the
+ vector so we can append to it. */
+ pglob->gl_pathc = 0;
+ pglob->gl_pathv = NULL;
+ }
+ firstc = pglob->gl_pathc;
+
+ p = begin + 1;
+ while (1)
+ {
+ int result;
+
+ /* Construct the new glob expression. */
+ mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
+
+ result = glob (onealt,
+ ((flags & ~(GLOB_NOCHECK | GLOB_NOMAGIC))
+ | GLOB_APPEND), errfunc, pglob);
+
+ /* If we got an error, return it. */
+ if (result && result != GLOB_NOMATCH)
+ {
+#ifndef __GNUC__
+ free (onealt);
+#endif
+ if (!(flags & GLOB_APPEND))
+ {
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ }
+ return result;
+ }
+
+ if (*next == '}')
+ /* We saw the last entry. */
+ break;
+
+ p = next + 1;
+ next = next_brace_sub (p, flags);
+ assert (next != NULL);
+ }
+
+#ifndef __GNUC__
+ free (onealt);
+#endif
+
+ if (pglob->gl_pathc != firstc)
+ /* We found some entries. */
+ return 0;
+ else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
+ return GLOB_NOMATCH;
+ }
+ }
+
+ /* Find the filename. */
+ filename = strrchr (pattern, '/');
+#if defined __MSDOS__ || defined WINDOWS32
+ /* The case of "d:pattern". Since `:' is not allowed in
+ file names, we can safely assume that wherever it
+ happens in pattern, it signals the filename part. This
+ is so we could some day support patterns like "[a-z]:foo". */
+ if (filename == NULL)
+ filename = strchr (pattern, ':');
+#endif /* __MSDOS__ || WINDOWS32 */
+ dirname_modified = 0;
+ if (filename == NULL)
+ {
+ /* This can mean two things: a simple name or "~name". The latter
+ case is nothing but a notation for a directory. */
+ if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
+ {
+ dirname = pattern;
+ dirlen = strlen (pattern);
+
+ /* Set FILENAME to NULL as a special flag. This is ugly but
+ other solutions would require much more code. We test for
+ this special case below. */
+ filename = NULL;
+ }
+ else
+ {
+ filename = pattern;
+#ifdef _AMIGA
+ dirname = "";
+#else
+ dirname = ".";
+#endif
+ dirlen = 0;
+ }
+ }
+ else if (filename == pattern
+ || (filename == pattern + 1 && pattern[0] == '\\'
+ && (flags & GLOB_NOESCAPE) == 0))
+ {
+ /* "/pattern" or "\\/pattern". */
+ dirname = "/";
+ dirlen = 1;
+ ++filename;
+ }
+ else
+ {
+ char *newp;
+ dirlen = filename - pattern;
+#if defined __MSDOS__ || defined WINDOWS32
+ if (*filename == ':'
+ || (filename > pattern + 1 && filename[-1] == ':'))
+ {
+ char *drive_spec;
+
+ ++dirlen;
+ drive_spec = __alloca (dirlen + 1);
+ *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
+ /* For now, disallow wildcards in the drive spec, to
+ prevent infinite recursion in glob. */
+ if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
+ return GLOB_NOMATCH;
+ /* If this is "d:pattern", we need to copy `:' to DIRNAME
+ as well. If it's "d:/pattern", don't remove the slash
+ from "d:/", since "d:" and "d:/" are not the same.*/
+ }
+#endif
+ newp = __alloca (dirlen + 1);
+ *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
+ dirname = newp;
+ ++filename;
+
+ if (filename[0] == '\0'
+#if defined __MSDOS__ || defined WINDOWS32
+ && dirname[dirlen - 1] != ':'
+ && (dirlen < 3 || dirname[dirlen - 2] != ':'
+ || dirname[dirlen - 1] != '/')
+#endif
+ && dirlen > 1)
+ /* "pattern/". Expand "pattern", appending slashes. */
+ {
+ int orig_flags = flags;
+ int val;
+ if (!(flags & GLOB_NOESCAPE) && dirname[dirlen - 1] == '\\')
+ {
+ /* "pattern\\/". Remove the final backslash if it hasn't
+ been quoted. */
+ char *p = (char *) &dirname[dirlen - 1];
+
+ while (p > dirname && p[-1] == '\\') --p;
+ if ((&dirname[dirlen] - p) & 1)
+ {
+ *(char *) &dirname[--dirlen] = '\0';
+ flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
+ }
+ }
+ val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
+ if (val == 0)
+ pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
+ | (flags & GLOB_MARK));
+ else if (val == GLOB_NOMATCH && flags != orig_flags)
+ {
+ /* Make sure globfree (&dirs); is a nop. */
+ dirs.gl_pathv = NULL;
+ flags = orig_flags;
+ oldcount = pglob->gl_pathc + pglob->gl_offs;
+ goto no_matches;
+ }
+ return val;
+ }
+ }
+
+ if (!(flags & GLOB_APPEND))
+ {
+ pglob->gl_pathc = 0;
+ if (!(flags & GLOB_DOOFFS))
+ pglob->gl_pathv = NULL;
+ else
+ {
+ size_t i;
+ pglob->gl_pathv = malloc ((pglob->gl_offs + 1) * sizeof (char *));
+ if (pglob->gl_pathv == NULL)
+ return GLOB_NOSPACE;
+
+ for (i = 0; i <= pglob->gl_offs; ++i)
+ pglob->gl_pathv[i] = NULL;
+ }
+ }
+
+ oldcount = pglob->gl_pathc + pglob->gl_offs;
+
+ if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
+ {
+ if (dirname[1] == '\0' || dirname[1] == '/'
+ || (!(flags & GLOB_NOESCAPE) && dirname[1] == '\\'
+ && (dirname[2] == '\0' || dirname[2] == '/')))
+ {
+ /* Look up home directory. */
+ const char *home_dir = getenv ("HOME");
+# ifdef _AMIGA
+ if (home_dir == NULL || home_dir[0] == '\0')
+ home_dir = "SYS:";
+# else
+# ifdef WINDOWS32
+ /* Windows NT defines HOMEDRIVE and HOMEPATH. But give preference
+ to HOME, because the user can change HOME. */
+ if (home_dir == NULL || home_dir[0] == '\0')
+ {
+ const char *home_drive = getenv ("HOMEDRIVE");
+ const char *home_path = getenv ("HOMEPATH");
+
+ if (home_drive != NULL && home_path != NULL)
+ {
+ size_t home_drive_len = strlen (home_drive);
+ size_t home_path_len = strlen (home_path);
+ char *mem = alloca (home_drive_len + home_path_len + 1);
+
+ memcpy (mem, home_drive, home_drive_len);
+ memcpy (mem + home_drive_len, home_path, home_path_len + 1);
+ home_dir = mem;
+ }
+ else
+ home_dir = "c:/users/default"; /* poor default */
+ }
+# else
+ if (home_dir == NULL || home_dir[0] == '\0')
+ {
+ int success;
+ char *name;
+ size_t buflen = GET_LOGIN_NAME_MAX () + 1;
+
+ if (buflen == 0)
+ /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
+ a moderate value. */
+ buflen = 20;
+ name = __alloca (buflen);
+
+ success = getlogin_r (name, buflen) == 0;
+ if (success)
+ {
+ struct passwd *p;
+# if defined HAVE_GETPWNAM_R || defined _LIBC
+ long int pwbuflen = GETPW_R_SIZE_MAX ();
+ char *pwtmpbuf;
+ struct passwd pwbuf;
+ int save = errno;
+
+# ifndef _LIBC
+ if (pwbuflen == -1)
+ /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
+ Try a moderate value. */
+ pwbuflen = 1024;
+# endif
+ pwtmpbuf = __alloca (pwbuflen);
+
+ while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
+ != 0)
+ {
+ if (errno != ERANGE)
+ {
+ p = NULL;
+ break;
+ }
+# ifdef _LIBC
+ pwtmpbuf = extend_alloca (pwtmpbuf, pwbuflen,
+ 2 * pwbuflen);
+# else
+ pwbuflen *= 2;
+ pwtmpbuf = __alloca (pwbuflen);
+# endif
+ __set_errno (save);
+ }
+# else
+ p = getpwnam (name);
+# endif
+ if (p != NULL)
+ home_dir = p->pw_dir;
+ }
+ }
+ if (home_dir == NULL || home_dir[0] == '\0')
+ {
+ if (flags & GLOB_TILDE_CHECK)
+ return GLOB_NOMATCH;
+ else
+ home_dir = "~"; /* No luck. */
+ }
+# endif /* WINDOWS32 */
+# endif
+ /* Now construct the full directory. */
+ if (dirname[1] == '\0')
+ {
+ dirname = home_dir;
+ dirlen = strlen (dirname);
+ }
+ else
+ {
+ char *newp;
+ size_t home_len = strlen (home_dir);
+ newp = __alloca (home_len + dirlen);
+ mempcpy (mempcpy (newp, home_dir, home_len),
+ &dirname[1], dirlen);
+ dirname = newp;
+ dirlen += home_len - 1;
+ }
+ dirname_modified = 1;
+ }
+# if !defined _AMIGA && !defined WINDOWS32
+ else
+ {
+ char *end_name = strchr (dirname, '/');
+ const char *user_name;
+ const char *home_dir;
+ char *unescape = NULL;
+
+ if (!(flags & GLOB_NOESCAPE))
+ {
+ if (end_name == NULL)
+ {
+ unescape = strchr (dirname, '\\');
+ if (unescape)
+ end_name = strchr (unescape, '\0');
+ }
+ else
+ unescape = memchr (dirname, '\\', end_name - dirname);
+ }
+ if (end_name == NULL)
+ user_name = dirname + 1;
+ else
+ {
+ char *newp;
+ newp = __alloca (end_name - dirname);
+ *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
+ = '\0';
+ if (unescape != NULL)
+ {
+ char *p = mempcpy (newp, dirname + 1,
+ unescape - dirname - 1);
+ char *q = unescape;
+ while (*q != '\0')
+ {
+ if (*q == '\\')
+ {
+ if (q[1] == '\0')
+ {
+ /* "~fo\\o\\" unescape to user_name "foo\\",
+ but "~fo\\o\\/" unescape to user_name
+ "foo". */
+ if (filename == NULL)
+ *p++ = '\\';
+ break;
+ }
+ ++q;
+ }
+ *p++ = *q++;
+ }
+ *p = '\0';
+ }
+ else
+ *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
+ = '\0';
+ user_name = newp;
+ }
+
+ /* Look up specific user's home directory. */
+ {
+ struct passwd *p;
+# if defined HAVE_GETPWNAM_R || defined _LIBC
+ long int buflen = GETPW_R_SIZE_MAX ();
+ char *pwtmpbuf;
+ struct passwd pwbuf;
+ int save = errno;
+
+# ifndef _LIBC
+ if (buflen == -1)
+ /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
+ moderate value. */
+ buflen = 1024;
+# endif
+ pwtmpbuf = __alloca (buflen);
+
+ while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
+ {
+ if (errno != ERANGE)
+ {
+ p = NULL;
+ break;
+ }
+# ifdef _LIBC
+ pwtmpbuf = extend_alloca (pwtmpbuf, buflen, 2 * buflen);
+# else
+ buflen *= 2;
+ pwtmpbuf = __alloca (buflen);
+# endif
+ __set_errno (save);
+ }
+# else
+ p = getpwnam (user_name);
+# endif
+ if (p != NULL)
+ home_dir = p->pw_dir;
+ else
+ home_dir = NULL;
+ }
+ /* If we found a home directory use this. */
+ if (home_dir != NULL)
+ {
+ char *newp;
+ size_t home_len = strlen (home_dir);
+ size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
+ newp = __alloca (home_len + rest_len + 1);
+ *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
+ end_name, rest_len)) = '\0';
+ dirname = newp;
+ dirlen = home_len + rest_len;
+ dirname_modified = 1;
+ }
+ else
+ if (flags & GLOB_TILDE_CHECK)
+ /* We have to regard it as an error if we cannot find the
+ home directory. */
+ return GLOB_NOMATCH;
+ }
+# endif /* Not Amiga && not WINDOWS32. */
+ }
+
+ /* Now test whether we looked for "~" or "~NAME". In this case we
+ can give the answer now. */
+ if (filename == NULL)
+ {
+ struct stat st;
+ struct_stat64 st64;
+
+ /* Return the directory if we don't check for error or if it exists. */
+ if ((flags & GLOB_NOCHECK)
+ || (((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ ? ((*pglob->gl_stat) (dirname, &st) == 0
+ && S_ISDIR (st.st_mode))
+ : (__stat64 (dirname, &st64) == 0 && S_ISDIR (st64.st_mode)))))
+ {
+ int newcount = pglob->gl_pathc + pglob->gl_offs;
+ char **new_gl_pathv;
+
+ new_gl_pathv
+ = realloc (pglob->gl_pathv, (newcount + 1 + 1) * sizeof (char *));
+ if (new_gl_pathv == NULL)
+ {
+ nospace:
+ free (pglob->gl_pathv);
+ pglob->gl_pathv = NULL;
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+ pglob->gl_pathv = new_gl_pathv;
+
+ if (flags & GLOB_MARK)
+ {
+ char *p;
+ pglob->gl_pathv[newcount] = malloc (dirlen + 2);
+ if (pglob->gl_pathv[newcount] == NULL)
+ goto nospace;
+ p = mempcpy (pglob->gl_pathv[newcount], dirname, dirlen);
+ p[0] = '/';
+ p[1] = '\0';
+ }
+ else
+ {
+ pglob->gl_pathv[newcount] = strdup (dirname);
+ if (pglob->gl_pathv[newcount] == NULL)
+ goto nospace;
+ }
+ pglob->gl_pathv[++newcount] = NULL;
+ ++pglob->gl_pathc;
+ pglob->gl_flags = flags;
+
+ return 0;
+ }
+
+ /* Not found. */
+ return GLOB_NOMATCH;
+ }
+
+ meta = __glob_pattern_type (dirname, !(flags & GLOB_NOESCAPE));
+ /* meta is 1 if correct glob pattern containing metacharacters.
+ If meta has bit (1 << 2) set, it means there was an unterminated
+ [ which we handle the same, using fnmatch. Broken unterminated
+ pattern bracket expressions ought to be rare enough that it is
+ not worth special casing them, fnmatch will do the right thing. */
+ if (meta & 5)
+ {
+ /* The directory name contains metacharacters, so we
+ have to glob for the directory, and then glob for
+ the pattern in each directory found. */
+ size_t i;
+
+ if (!(flags & GLOB_NOESCAPE) && dirlen > 0 && dirname[dirlen - 1] == '\\')
+ {
+ /* "foo\\/bar". Remove the final backslash from dirname
+ if it has not been quoted. */
+ char *p = (char *) &dirname[dirlen - 1];
+
+ while (p > dirname && p[-1] == '\\') --p;
+ if ((&dirname[dirlen] - p) & 1)
+ *(char *) &dirname[--dirlen] = '\0';
+ }
+
+ if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) != 0, 0))
+ {
+ /* Use the alternative access functions also in the recursive
+ call. */
+ dirs.gl_opendir = pglob->gl_opendir;
+ dirs.gl_readdir = pglob->gl_readdir;
+ dirs.gl_closedir = pglob->gl_closedir;
+ dirs.gl_stat = pglob->gl_stat;
+ dirs.gl_lstat = pglob->gl_lstat;
+ }
+
+ status = glob (dirname,
+ ((flags & (GLOB_ERR | GLOB_NOESCAPE
+ | GLOB_ALTDIRFUNC))
+ | GLOB_NOSORT | GLOB_ONLYDIR),
+ errfunc, &dirs);
+ if (status != 0)
+ {
+ if ((flags & GLOB_NOCHECK) == 0 || status != GLOB_NOMATCH)
+ return status;
+ goto no_matches;
+ }
+
+ /* We have successfully globbed the preceding directory name.
+ For each name we found, call glob_in_dir on it and FILENAME,
+ appending the results to PGLOB. */
+ for (i = 0; i < dirs.gl_pathc; ++i)
+ {
+ int old_pathc;
+
+#ifdef SHELL
+ {
+ /* Make globbing interruptible in the bash shell. */
+ extern int interrupt_state;
+
+ if (interrupt_state)
+ {
+ globfree (&dirs);
+ return GLOB_ABORTED;
+ }
+ }
+#endif /* SHELL. */
+
+ old_pathc = pglob->gl_pathc;
+ status = glob_in_dir (filename, dirs.gl_pathv[i],
+ ((flags | GLOB_APPEND)
+ & ~(GLOB_NOCHECK | GLOB_NOMAGIC)),
+ errfunc, pglob);
+ if (status == GLOB_NOMATCH)
+ /* No matches in this directory. Try the next. */
+ continue;
+
+ if (status != 0)
+ {
+ globfree (&dirs);
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return status;
+ }
+
+ /* Stick the directory on the front of each name. */
+ if (prefix_array (dirs.gl_pathv[i],
+ &pglob->gl_pathv[old_pathc + pglob->gl_offs],
+ pglob->gl_pathc - old_pathc))
+ {
+ globfree (&dirs);
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+ }
+
+ flags |= GLOB_MAGCHAR;
+
+ /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
+ But if we have not found any matching entry and the GLOB_NOCHECK
+ flag was set we must return the input pattern itself. */
+ if (pglob->gl_pathc + pglob->gl_offs == oldcount)
+ {
+ no_matches:
+ /* No matches. */
+ if (flags & GLOB_NOCHECK)
+ {
+ int newcount = pglob->gl_pathc + pglob->gl_offs;
+ char **new_gl_pathv;
+
+ new_gl_pathv = realloc (pglob->gl_pathv,
+ (newcount + 2) * sizeof (char *));
+ if (new_gl_pathv == NULL)
+ {
+ globfree (&dirs);
+ return GLOB_NOSPACE;
+ }
+ pglob->gl_pathv = new_gl_pathv;
+
+ pglob->gl_pathv[newcount] = strdup (pattern);
+ if (pglob->gl_pathv[newcount] == NULL)
+ {
+ globfree (&dirs);
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+
+ ++pglob->gl_pathc;
+ ++newcount;
+
+ pglob->gl_pathv[newcount] = NULL;
+ pglob->gl_flags = flags;
+ }
+ else
+ {
+ globfree (&dirs);
+ return GLOB_NOMATCH;
+ }
+ }
+
+ globfree (&dirs);
+ }
+ else
+ {
+ int old_pathc = pglob->gl_pathc;
+ int orig_flags = flags;
+
+ if (meta & 2)
+ {
+ char *p = strchr (dirname, '\\'), *q;
+ /* We need to unescape the dirname string. It is certainly
+ allocated by alloca, as otherwise filename would be NULL
+ or dirname wouldn't contain backslashes. */
+ q = p;
+ do
+ {
+ if (*p == '\\')
+ {
+ *q = *++p;
+ --dirlen;
+ }
+ else
+ *q = *p;
+ ++q;
+ }
+ while (*p++ != '\0');
+ dirname_modified = 1;
+ }
+ if (dirname_modified)
+ flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
+ status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
+ if (status != 0)
+ {
+ if (status == GLOB_NOMATCH && flags != orig_flags
+ && pglob->gl_pathc + pglob->gl_offs == oldcount)
+ {
+ /* Make sure globfree (&dirs); is a nop. */
+ dirs.gl_pathv = NULL;
+ flags = orig_flags;
+ goto no_matches;
+ }
+ return status;
+ }
+
+ if (dirlen > 0)
+ {
+ /* Stick the directory on the front of each name. */
+ if (prefix_array (dirname,
+ &pglob->gl_pathv[old_pathc + pglob->gl_offs],
+ pglob->gl_pathc - old_pathc))
+ {
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+ }
+ }
+
+ if (flags & GLOB_MARK)
+ {
+ /* Append slashes to directory names. */
+ size_t i;
+ struct stat st;
+ struct_stat64 st64;
+
+ for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
+ if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? ((*pglob->gl_stat) (pglob->gl_pathv[i], &st) == 0
+ && S_ISDIR (st.st_mode))
+ : (__stat64 (pglob->gl_pathv[i], &st64) == 0
+ && S_ISDIR (st64.st_mode))))
+ {
+ size_t len = strlen (pglob->gl_pathv[i]) + 2;
+ char *new = realloc (pglob->gl_pathv[i], len);
+ if (new == NULL)
+ {
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+ strcpy (&new[len - 2], "/");
+ pglob->gl_pathv[i] = new;
+ }
+ }
+
+ if (!(flags & GLOB_NOSORT))
+ {
+ /* Sort the vector. */
+ qsort (&pglob->gl_pathv[oldcount],
+ pglob->gl_pathc + pglob->gl_offs - oldcount,
+ sizeof (char *), collated_compare);
+ }
+
+ return 0;
+}
+#if defined _LIBC && !defined glob
+libc_hidden_def (glob)
+#endif
+
+
+#if !defined _LIBC || !defined GLOB_ONLY_P
+
+/* Free storage allocated in PGLOB by a previous `glob' call. */
+void
+globfree (pglob)
+ register glob_t *pglob;
+{
+ if (pglob->gl_pathv != NULL)
+ {
+ size_t i;
+ for (i = 0; i < pglob->gl_pathc; ++i)
+ if (pglob->gl_pathv[pglob->gl_offs + i] != NULL)
+ free (pglob->gl_pathv[pglob->gl_offs + i]);
+ free (pglob->gl_pathv);
+ pglob->gl_pathv = NULL;
+ }
+}
+#if defined _LIBC && !defined globfree
+libc_hidden_def (globfree)
+#endif
+
+
+/* Do a collated comparison of A and B. */
+static int
+collated_compare (const void *a, const void *b)
+{
+ char *const *ps1 = a; char *s1 = *ps1;
+ char *const *ps2 = b; char *s2 = *ps2;
+
+ if (s1 == s2)
+ return 0;
+ if (s1 == NULL)
+ return 1;
+ if (s2 == NULL)
+ return -1;
+ return strcoll (s1, s2);
+}
+
+
+/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
+ elements in place. Return nonzero if out of memory, zero if successful.
+ A slash is inserted between DIRNAME and each elt of ARRAY,
+ unless DIRNAME is just "/". Each old element of ARRAY is freed. */
+static int
+prefix_array (const char *dirname, char **array, size_t n)
+{
+ register size_t i;
+ size_t dirlen = strlen (dirname);
+#if defined __MSDOS__ || defined WINDOWS32
+ int sep_char = '/';
+# define DIRSEP_CHAR sep_char
+#else
+# define DIRSEP_CHAR '/'
+#endif
+
+ if (dirlen == 1 && dirname[0] == '/')
+ /* DIRNAME is just "/", so normal prepending would get us "//foo".
+ We want "/foo" instead, so don't prepend any chars from DIRNAME. */
+ dirlen = 0;
+#if defined __MSDOS__ || defined WINDOWS32
+ else if (dirlen > 1)
+ {
+ if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
+ /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
+ --dirlen;
+ else if (dirname[dirlen - 1] == ':')
+ {
+ /* DIRNAME is "d:". Use `:' instead of `/'. */
+ --dirlen;
+ sep_char = ':';
+ }
+ }
+#endif
+
+ for (i = 0; i < n; ++i)
+ {
+ size_t eltlen = strlen (array[i]) + 1;
+ char *new = malloc (dirlen + 1 + eltlen);
+ if (new == NULL)
+ {
+ while (i > 0)
+ free (array[--i]);
+ return 1;
+ }
+
+ {
+ char *endp = mempcpy (new, dirname, dirlen);
+ *endp++ = DIRSEP_CHAR;
+ mempcpy (endp, array[i], eltlen);
+ }
+ free (array[i]);
+ array[i] = new;
+ }
+
+ return 0;
+}
+
+
+/* We must not compile this function twice. */
+#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
+int
+__glob_pattern_type (pattern, quote)
+ const char *pattern;
+ int quote;
+{
+ register const char *p;
+ int ret = 0;
+
+ for (p = pattern; *p != '\0'; ++p)
+ switch (*p)
+ {
+ case '?':
+ case '*':
+ return 1;
+
+ case '\\':
+ if (quote)
+ {
+ if (p[1] != '\0')
+ ++p;
+ ret |= 2;
+ }
+ break;
+
+ case '[':
+ ret |= 4;
+ break;
+
+ case ']':
+ if (ret & 4)
+ return 1;
+ break;
+ }
+
+ return ret;
+}
+
+/* Return nonzero if PATTERN contains any metacharacters.
+ Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
+int
+__glob_pattern_p (pattern, quote)
+ const char *pattern;
+ int quote;
+{
+ return __glob_pattern_type (pattern, quote) == 1;
+}
+# ifdef _LIBC
+weak_alias (__glob_pattern_p, glob_pattern_p)
+# endif
+#endif
+
+#endif /* !GLOB_ONLY_P */
+
+
+#if !defined _LIBC || !defined GLOB_ONLY_P
+/* We put this in a separate function mainly to allow the memory
+ allocated with alloca to be recycled. */
+static int
+__attribute_noinline__
+link_exists2_p (const char *dir, size_t dirlen, const char *fname,
+ glob_t *pglob
+# if !defined _LIBC && !HAVE_FSTATAT
+ , int flags
+# endif
+ )
+{
+ size_t fnamelen = strlen (fname);
+ char *fullname = __alloca (dirlen + 1 + fnamelen + 1);
+ struct stat st;
+
+ mempcpy (mempcpy (mempcpy (fullname, dir, dirlen), "/", 1),
+ fname, fnamelen + 1);
+
+# if !defined _LIBC && !HAVE_FSTATAT
+ if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) == 0, 1))
+ {
+ struct_stat64 st64;
+ return __stat64 (fullname, &st64) == 0;
+ }
+# endif
+ return (*pglob->gl_stat) (fullname, &st) == 0;
+}
+
+/* Return true if DIR/FNAME exists. */
+static int
+link_exists_p (int dfd, const char *dir, size_t dirlen, const char *fname,
+ glob_t *pglob, int flags)
+{
+# if defined _LIBC || HAVE_FSTATAT
+ if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ return link_exists2_p (dir, dirlen, fname, pglob);
+ else
+ {
+ struct_stat64 st64;
+ return __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0;
+ }
+# else
+ return link_exists2_p (dir, dirlen, fname, pglob, flags);
+# endif
+}
+#endif
+
+
+/* Like `glob', but PATTERN is a final pathname component,
+ and matches are searched for in DIRECTORY.
+ The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
+ The GLOB_APPEND flag is assumed to be set (always appends). */
+static int
+glob_in_dir (const char *pattern, const char *directory, int flags,
+ int (*errfunc) (const char *, int),
+ glob_t *pglob)
+{
+ size_t dirlen = strlen (directory);
+ void *stream = NULL;
+ struct globnames
+ {
+ struct globnames *next;
+ size_t count;
+ char *name[64];
+ };
+#define INITIAL_COUNT sizeof (init_names.name) / sizeof (init_names.name[0])
+ struct globnames init_names;
+ struct globnames *names = &init_names;
+ struct globnames *names_alloca = &init_names;
+ size_t nfound = 0;
+ size_t allocasize = sizeof (init_names);
+ size_t cur = 0;
+ int meta;
+ int save;
+ int result;
+
+ init_names.next = NULL;
+ init_names.count = INITIAL_COUNT;
+
+ meta = __glob_pattern_type (pattern, !(flags & GLOB_NOESCAPE));
+ if (meta == 0 && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
+ {
+ /* We need not do any tests. The PATTERN contains no meta
+ characters and we must not return an error therefore the
+ result will always contain exactly one name. */
+ flags |= GLOB_NOCHECK;
+ }
+ else if (meta == 0)
+ {
+ /* Since we use the normal file functions we can also use stat()
+ to verify the file is there. */
+ struct stat st;
+ struct_stat64 st64;
+ size_t patlen = strlen (pattern);
+ char *fullname = __alloca (dirlen + 1 + patlen + 1);
+
+ mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
+ "/", 1),
+ pattern, patlen + 1);
+ if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? (*pglob->gl_stat) (fullname, &st)
+ : __stat64 (fullname, &st64)) == 0)
+ /* We found this file to be existing. Now tell the rest
+ of the function to copy this name into the result. */
+ flags |= GLOB_NOCHECK;
+ }
+ else
+ {
+ stream = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? (*pglob->gl_opendir) (directory)
+ : opendir (directory));
+ if (stream == NULL)
+ {
+ if (errno != ENOTDIR
+ && ((errfunc != NULL && (*errfunc) (directory, errno))
+ || (flags & GLOB_ERR)))
+ return GLOB_ABORTED;
+ }
+ else
+ {
+ int dfd = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? -1 : dirfd ((DIR *) stream));
+ int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
+ | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
+#if defined _AMIGA || defined VMS
+ | FNM_CASEFOLD
+#endif
+ );
+ flags |= GLOB_MAGCHAR;
+
+ while (1)
+ {
+ const char *name;
+ size_t len;
+#if defined _LIBC && !defined COMPILE_GLOB64
+ struct dirent64 *d;
+ union
+ {
+ struct dirent64 d64;
+ char room [offsetof (struct dirent64, d_name[0])
+ + NAME_MAX + 1];
+ }
+ d64buf;
+
+ if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ {
+ struct dirent *d32 = (*pglob->gl_readdir) (stream);
+ if (d32 != NULL)
+ {
+ CONVERT_DIRENT_DIRENT64 (&d64buf.d64, d32);
+ d = &d64buf.d64;
+ }
+ else
+ d = NULL;
+ }
+ else
+ d = __readdir64 (stream);
+#else
+ struct dirent *d = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? ((struct dirent *)
+ (*pglob->gl_readdir) (stream))
+ : __readdir (stream));
+#endif
+ if (d == NULL)
+ break;
+ if (! REAL_DIR_ENTRY (d))
+ continue;
+
+ /* If we shall match only directories use the information
+ provided by the dirent call if possible. */
+ if ((flags & GLOB_ONLYDIR) && !DIRENT_MIGHT_BE_DIR (d))
+ continue;
+
+ name = d->d_name;
+
+ if (fnmatch (pattern, name, fnm_flags) == 0)
+ {
+ /* If the file we found is a symlink we have to
+ make sure the target file exists. */
+ if (!DIRENT_MIGHT_BE_SYMLINK (d)
+ || link_exists_p (dfd, directory, dirlen, name, pglob,
+ flags))
+ {
+ if (cur == names->count)
+ {
+ struct globnames *newnames;
+ size_t count = names->count * 2;
+ size_t size = (sizeof (struct globnames)
+ + ((count - INITIAL_COUNT)
+ * sizeof (char *)));
+ allocasize += size;
+ if (__libc_use_alloca (allocasize))
+ newnames = names_alloca = __alloca (size);
+ else if ((newnames = malloc (size))
+ == NULL)
+ goto memory_error;
+ newnames->count = count;
+ newnames->next = names;
+ names = newnames;
+ cur = 0;
+ }
+ len = _D_EXACT_NAMLEN (d);
+ names->name[cur] = malloc (len + 1);
+ if (names->name[cur] == NULL)
+ goto memory_error;
+ *((char *) mempcpy (names->name[cur++], name, len))
+ = '\0';
+ ++nfound;
+ }
+ }
+ }
+ }
+ }
+
+ if (nfound == 0 && (flags & GLOB_NOCHECK))
+ {
+ size_t len = strlen (pattern);
+ nfound = 1;
+ names->name[cur] = malloc (len + 1);
+ if (names->name[cur] == NULL)
+ goto memory_error;
+ *((char *) mempcpy (names->name[cur++], pattern, len)) = '\0';
+ }
+
+ result = GLOB_NOMATCH;
+ if (nfound != 0)
+ {
+ char **new_gl_pathv
+ = realloc (pglob->gl_pathv,
+ (pglob->gl_pathc + pglob->gl_offs + nfound + 1)
+ * sizeof (char *));
+ result = 0;
+
+ if (new_gl_pathv == NULL)
+ {
+ memory_error:
+ while (1)
+ {
+ struct globnames *old = names;
+ size_t i;
+ for (i = 0; i < cur; ++i)
+ free (names->name[i]);
+ names = names->next;
+ /* NB: we will not leak memory here if we exit without
+ freeing the current block assigned to OLD. At least
+ the very first block is always allocated on the stack
+ and this is the block assigned to OLD here. */
+ if (names == NULL)
+ {
+ assert (old == &init_names);
+ break;
+ }
+ cur = names->count;
+ if (old == names_alloca)
+ names_alloca = names;
+ else
+ free (old);
+ }
+ result = GLOB_NOSPACE;
+ }
+ else
+ {
+ while (1)
+ {
+ struct globnames *old = names;
+ size_t i;
+ for (i = 0; i < cur; ++i)
+ new_gl_pathv[pglob->gl_offs + pglob->gl_pathc++]
+ = names->name[i];
+ names = names->next;
+ /* NB: we will not leak memory here if we exit without
+ freeing the current block assigned to OLD. At least
+ the very first block is always allocated on the stack
+ and this is the block assigned to OLD here. */
+ if (names == NULL)
+ {
+ assert (old == &init_names);
+ break;
+ }
+ cur = names->count;
+ if (old == names_alloca)
+ names_alloca = names;
+ else
+ free (old);
+ }
+
+ pglob->gl_pathv = new_gl_pathv;
+
+ pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
+
+ pglob->gl_flags = flags;
+ }
+ }
+
+ if (stream != NULL)
+ {
+ save = errno;
+ if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ (*pglob->gl_closedir) (stream);
+ else
+ closedir (stream);
+ __set_errno (save);
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/glob.in.h b/gnulib/lib/glob.in.h
new file mode 100644
index 00000000..8f32a792
--- /dev/null
+++ b/gnulib/lib/glob.in.h
@@ -0,0 +1,67 @@
+/* glob.h -- Find a path matching a pattern.
+
+ Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc.
+
+ Written by Derek Price <derek@ximbiot.com> & Paul Eggert <eggert@CS.UCLA.EDU>
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_GLOB_H
+#define _GL_GLOB_H
+
+#if @HAVE_SYS_CDEFS_H@
+# include <sys/cdefs.h>
+#endif
+
+#include <stddef.h>
+
+/* On some systems, such as AIX 5.1, <sys/stat.h> does a "#define stat stat64".
+ Make sure this definition is seen before glob-libc.h defines types that
+ rely on 'struct stat'. */
+#include <sys/stat.h>
+
+#ifndef __BEGIN_DECLS
+# ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+# else
+# define __BEGIN_DECLS
+# define __END_DECLS
+# endif
+#endif
+#ifndef __THROW
+# define __THROW
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+#ifndef __size_t
+# define __size_t size_t
+#endif
+#ifndef __USE_GNU
+# define __USE_GNU 1
+#endif
+
+
+#define glob rpl_glob
+#define globfree rpl_globfree
+#define glob_pattern_p rpl_glob_pattern_p
+
+#define __GLOB_GNULIB 1
+
+/* Now the standard GNU C Library header should work. */
+#include "glob-libc.h"
+
+#endif /* _GL_GLOB_H */
diff --git a/gnulib/lib/glthread/cond.c b/gnulib/lib/glthread/cond.c
new file mode 100644
index 00000000..b4a1dfc0
--- /dev/null
+++ b/gnulib/lib/glthread/cond.c
@@ -0,0 +1,464 @@
+/* Condition variables for multithreading.
+ Copyright (C) 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Yoann Vandoorselaere <yoann@prelude-ids.org>, 2008,
+ and Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "glthread/cond.h"
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+int
+glthread_cond_timedwait_multithreaded (gl_cond_t *cond,
+ gl_lock_t *lock,
+ struct timespec *abstime)
+{
+ int ret, status;
+ pth_event_t ev;
+
+ ev = pth_event (PTH_EVENT_TIME, pth_time (abstime->tv_sec, abstime->tv_nsec / 1000));
+ ret = pth_cond_await (cond, lock, ev);
+
+ status = pth_event_status (ev);
+ pth_event_free (ev, PTH_FREE_THIS);
+
+ if (status == PTH_STATUS_OCCURRED)
+ return ETIMEDOUT;
+
+ return ret;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+int
+glthread_cond_timedwait_multithreaded (gl_cond_t *cond,
+ gl_lock_t *lock,
+ struct timespec *abstime)
+{
+ int ret;
+
+ ret = cond_timedwait (cond, lock, abstime);
+ if (ret == ETIME)
+ return ETIMEDOUT;
+ return ret;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+#include <sys/time.h>
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+/* In this file, the waitqueues are implemented as linked lists. */
+#define gl_waitqueue_t gl_linked_waitqueue_t
+
+/* All links of a circular list, except the anchor, are of this type, carrying
+ a payload. */
+struct gl_waitqueue_element
+{
+ struct gl_waitqueue_link link; /* must be the first field! */
+ HANDLE event; /* Waiting thread, represented by an event.
+ This field is immutable once initialized. */
+};
+
+static inline void
+gl_waitqueue_init (gl_waitqueue_t *wq)
+{
+ wq->wq_list.wql_next = &wq->wq_list;
+ wq->wq_list.wql_prev = &wq->wq_list;
+}
+
+/* Enqueues the current thread, represented by an event, in a wait queue.
+ Returns NULL if an allocation failure occurs. */
+static struct gl_waitqueue_element *
+gl_waitqueue_add (gl_waitqueue_t *wq)
+{
+ struct gl_waitqueue_element *elt;
+ HANDLE event;
+
+ /* Allocate the memory for the waitqueue element on the heap, not on the
+ thread's stack. If the thread exits unexpectedly, we prefer to leak
+ some memory rather than to access unavailable memory and crash. */
+ elt =
+ (struct gl_waitqueue_element *)
+ malloc (sizeof (struct gl_waitqueue_element));
+ if (elt == NULL)
+ /* No more memory. */
+ return NULL;
+
+ /* Whether the created event is a manual-reset one or an auto-reset one,
+ does not matter, since we will wait on it only once. */
+ event = CreateEvent (NULL, TRUE, FALSE, NULL);
+ if (event == INVALID_HANDLE_VALUE)
+ {
+ /* No way to allocate an event. */
+ free (elt);
+ return NULL;
+ }
+ elt->event = event;
+ /* Insert elt at the end of the circular list. */
+ (elt->link.wql_prev = wq->wq_list.wql_prev)->wql_next = &elt->link;
+ (elt->link.wql_next = &wq->wq_list)->wql_prev = &elt->link;
+ return elt;
+}
+
+/* Removes the current thread, represented by a 'struct gl_waitqueue_element *',
+ from a wait queue.
+ Returns true if is was found and removed, false if it was not present. */
+static inline bool
+gl_waitqueue_remove (gl_waitqueue_t *wq, struct gl_waitqueue_element *elt)
+{
+ if (elt->link.wql_next != NULL && elt->link.wql_prev != NULL)
+ {
+ /* Remove elt from the circular list. */
+ struct gl_waitqueue_link *prev = elt->link.wql_prev;
+ struct gl_waitqueue_link *next = elt->link.wql_next;
+ prev->wql_next = next;
+ next->wql_prev = prev;
+ elt->link.wql_next = NULL;
+ elt->link.wql_prev = NULL;
+ return true;
+ }
+ else
+ return false;
+}
+
+/* Notifies the first thread from a wait queue and dequeues it. */
+static inline void
+gl_waitqueue_notify_first (gl_waitqueue_t *wq)
+{
+ if (wq->wq_list.wql_next != &wq->wq_list)
+ {
+ struct gl_waitqueue_element *elt =
+ (struct gl_waitqueue_element *) wq->wq_list.wql_next;
+ struct gl_waitqueue_link *prev;
+ struct gl_waitqueue_link *next;
+
+ /* Remove elt from the circular list. */
+ prev = &wq->wq_list; /* = elt->link.wql_prev; */
+ next = elt->link.wql_next;
+ prev->wql_next = next;
+ next->wql_prev = prev;
+ elt->link.wql_next = NULL;
+ elt->link.wql_prev = NULL;
+
+ SetEvent (elt->event);
+ /* After the SetEvent, this thread cannot access *elt any more, because
+ the woken-up thread will quickly call free (elt). */
+ }
+}
+
+/* Notifies all threads from a wait queue and dequeues them all. */
+static inline void
+gl_waitqueue_notify_all (gl_waitqueue_t *wq)
+{
+ struct gl_waitqueue_link *l;
+
+ for (l = wq->wq_list.wql_next; l != &wq->wq_list; )
+ {
+ struct gl_waitqueue_element *elt = (struct gl_waitqueue_element *) l;
+ struct gl_waitqueue_link *prev;
+ struct gl_waitqueue_link *next;
+
+ /* Remove elt from the circular list. */
+ prev = &wq->wq_list; /* = elt->link.wql_prev; */
+ next = elt->link.wql_next;
+ prev->wql_next = next;
+ next->wql_prev = prev;
+ elt->link.wql_next = NULL;
+ elt->link.wql_prev = NULL;
+
+ SetEvent (elt->event);
+ /* After the SetEvent, this thread cannot access *elt any more, because
+ the woken-up thread will quickly call free (elt). */
+
+ l = next;
+ }
+ if (!(wq->wq_list.wql_next == &wq->wq_list
+ && wq->wq_list.wql_prev == &wq->wq_list))
+ abort ();
+}
+
+int
+glthread_cond_init_func (gl_cond_t *cond)
+{
+ InitializeCriticalSection (&cond->lock);
+ gl_waitqueue_init (&cond->waiters);
+
+ cond->guard.done = 1;
+ return 0;
+}
+
+int
+glthread_cond_wait_func (gl_cond_t *cond, gl_lock_t *lock)
+{
+ if (!cond->guard.done)
+ {
+ if (InterlockedIncrement (&cond->guard.started) == 0)
+ /* This thread is the first one to need this condition variable.
+ Initialize it. */
+ glthread_cond_init (cond);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this condition variable. */
+ while (!cond->guard.done)
+ Sleep (0);
+ }
+
+ EnterCriticalSection (&cond->lock);
+ {
+ struct gl_waitqueue_element *elt = gl_waitqueue_add (&cond->waiters);
+ LeaveCriticalSection (&cond->lock);
+ if (elt == NULL)
+ {
+ /* Allocation failure. Weird. */
+ return EAGAIN;
+ }
+ else
+ {
+ HANDLE event = elt->event;
+ int err;
+ DWORD result;
+
+ /* Now release the lock and let any other thread take it. */
+ err = glthread_lock_unlock (lock);
+ if (err != 0)
+ {
+ EnterCriticalSection (&cond->lock);
+ gl_waitqueue_remove (&cond->waiters, elt);
+ LeaveCriticalSection (&cond->lock);
+ CloseHandle (event);
+ free (elt);
+ return err;
+ }
+ /* POSIX says:
+ "If another thread is able to acquire the mutex after the
+ about-to-block thread has released it, then a subsequent call to
+ pthread_cond_broadcast() or pthread_cond_signal() in that thread
+ shall behave as if it were issued after the about-to-block thread
+ has blocked."
+ This is fulfilled here, because the thread signalling is done
+ through SetEvent, not PulseEvent. */
+ /* Wait until another thread signals this event. */
+ result = WaitForSingleObject (event, INFINITE);
+ if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+ abort ();
+ CloseHandle (event);
+ free (elt);
+ /* The thread which signalled the event already did the bookkeeping:
+ removed us from the waiters. */
+ return glthread_lock_lock (lock);
+ }
+ }
+}
+
+int
+glthread_cond_timedwait_func (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime)
+{
+ struct timeval currtime;
+
+ gettimeofday (&currtime, NULL);
+ if (currtime.tv_sec > abstime->tv_sec
+ || (currtime.tv_sec == abstime->tv_sec
+ && currtime.tv_usec * 1000 >= abstime->tv_nsec))
+ return ETIMEDOUT;
+
+ if (!cond->guard.done)
+ {
+ if (InterlockedIncrement (&cond->guard.started) == 0)
+ /* This thread is the first one to need this condition variable.
+ Initialize it. */
+ glthread_cond_init (cond);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this condition variable. */
+ while (!cond->guard.done)
+ Sleep (0);
+ }
+
+ EnterCriticalSection (&cond->lock);
+ {
+ struct gl_waitqueue_element *elt = gl_waitqueue_add (&cond->waiters);
+ LeaveCriticalSection (&cond->lock);
+ if (elt == NULL)
+ {
+ /* Allocation failure. Weird. */
+ return EAGAIN;
+ }
+ else
+ {
+ HANDLE event = elt->event;
+ int err;
+ DWORD timeout;
+ DWORD result;
+
+ /* Now release the lock and let any other thread take it. */
+ err = glthread_lock_unlock (lock);
+ if (err != 0)
+ {
+ EnterCriticalSection (&cond->lock);
+ gl_waitqueue_remove (&cond->waiters, elt);
+ LeaveCriticalSection (&cond->lock);
+ CloseHandle (event);
+ free (elt);
+ return err;
+ }
+ /* POSIX says:
+ "If another thread is able to acquire the mutex after the
+ about-to-block thread has released it, then a subsequent call to
+ pthread_cond_broadcast() or pthread_cond_signal() in that thread
+ shall behave as if it were issued after the about-to-block thread
+ has blocked."
+ This is fulfilled here, because the thread signalling is done
+ through SetEvent, not PulseEvent. */
+ /* Wait until another thread signals this event or until the abstime
+ passes. */
+ gettimeofday (&currtime, NULL);
+ if (currtime.tv_sec > abstime->tv_sec)
+ timeout = 0;
+ else
+ {
+ unsigned long seconds = abstime->tv_sec - currtime.tv_sec;
+ timeout = seconds * 1000;
+ if (timeout / 1000 != seconds) /* overflow? */
+ timeout = INFINITE;
+ else
+ {
+ long milliseconds =
+ abstime->tv_nsec / 1000000 - currtime.tv_usec / 1000;
+ if (milliseconds >= 0)
+ {
+ timeout += milliseconds;
+ if (timeout < milliseconds) /* overflow? */
+ timeout = INFINITE;
+ }
+ else
+ {
+ if (timeout >= - milliseconds)
+ timeout -= (- milliseconds);
+ else
+ timeout = 0;
+ }
+ }
+ }
+ result = WaitForSingleObject (event, timeout);
+ if (result == WAIT_FAILED)
+ abort ();
+ if (result == WAIT_TIMEOUT)
+ {
+ EnterCriticalSection (&cond->lock);
+ if (gl_waitqueue_remove (&cond->waiters, elt))
+ {
+ /* The event was not signaled between the WaitForSingleObject
+ call and the EnterCriticalSection call. */
+ if (!(WaitForSingleObject (event, 0) == WAIT_TIMEOUT))
+ abort ();
+ }
+ else
+ {
+ /* The event was signaled between the WaitForSingleObject
+ call and the EnterCriticalSection call. */
+ if (!(WaitForSingleObject (event, 0) == WAIT_OBJECT_0))
+ abort ();
+ /* Produce the right return value. */
+ result = WAIT_OBJECT_0;
+ }
+ LeaveCriticalSection (&cond->lock);
+ }
+ else
+ {
+ /* The thread which signalled the event already did the
+ bookkeeping: removed us from the waiters. */
+ }
+ CloseHandle (event);
+ free (elt);
+ /* Take the lock again. It does not matter whether this is done
+ before or after the bookkeeping for WAIT_TIMEOUT. */
+ err = glthread_lock_lock (lock);
+ return (err ? err :
+ result == WAIT_OBJECT_0 ? 0 :
+ result == WAIT_TIMEOUT ? ETIMEDOUT :
+ /* WAIT_FAILED shouldn't happen */ EAGAIN);
+ }
+ }
+}
+
+int
+glthread_cond_signal_func (gl_cond_t *cond)
+{
+ if (!cond->guard.done)
+ return EINVAL;
+
+ EnterCriticalSection (&cond->lock);
+ /* POSIX says:
+ "The pthread_cond_broadcast() and pthread_cond_signal() functions shall
+ have no effect if there are no threads currently blocked on cond." */
+ if (cond->waiters.wq_list.wql_next != &cond->waiters.wq_list)
+ gl_waitqueue_notify_first (&cond->waiters);
+ LeaveCriticalSection (&cond->lock);
+
+ return 0;
+}
+
+int
+glthread_cond_broadcast_func (gl_cond_t *cond)
+{
+ if (!cond->guard.done)
+ return EINVAL;
+
+ EnterCriticalSection (&cond->lock);
+ /* POSIX says:
+ "The pthread_cond_broadcast() and pthread_cond_signal() functions shall
+ have no effect if there are no threads currently blocked on cond."
+ gl_waitqueue_notify_all is a nop in this case. */
+ gl_waitqueue_notify_all (&cond->waiters);
+ LeaveCriticalSection (&cond->lock);
+
+ return 0;
+}
+
+int
+glthread_cond_destroy_func (gl_cond_t *cond)
+{
+ if (!cond->guard.done)
+ return EINVAL;
+ if (cond->waiters.wq_list.wql_next != &cond->waiters.wq_list)
+ return EBUSY;
+ DeleteCriticalSection (&cond->lock);
+ cond->guard.done = 0;
+ return 0;
+}
+
+#endif
+
+/* ========================================================================= */
diff --git a/gnulib/lib/glthread/cond.h b/gnulib/lib/glthread/cond.h
new file mode 100644
index 00000000..d866b6e6
--- /dev/null
+++ b/gnulib/lib/glthread/cond.h
@@ -0,0 +1,408 @@
+/* Condition variables for multithreading.
+ Copyright (C) 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Yoann Vandoorselaere <yoann@prelude-ids.org>, 2008.
+ Based on Bruno Haible <bruno@clisp.org> lock.h */
+
+/*
+ Condition variables can be used for waiting until a condition
+ becomes true. In this respect, they are similar to wait queues. But
+ contrary to wait queues, condition variables have different
+ semantics that allows events to be lost when there is no thread
+ waiting for them.
+
+ Condition variable:
+ Type: gl_cond_t
+ Declaration: gl_cond_define(extern, name)
+ Initializer: gl_cond_define_initialized(, name)
+ Initialization: gl_cond_init (name);
+ Waiting: gl_cond_wait (name, lock);
+ Timed wait: bool timedout = gl_cond_timedwait (name, lock, abstime);
+ where lock is a gl_lock_t variable (cf. <glthread/lock.h>)
+ Signaling: gl_cond_signal (name);
+ Broadcasting: gl_cond_broadcast (name);
+ De-initialization: gl_cond_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_cond_init (&name);
+ Waiting: err = glthread_cond_wait (&name);
+ Timed wait: err = glthread_cond_timedwait (&name, &lock, abstime);
+ Signaling: err = glthread_cond_signal (&name);
+ Broadcasting: err = glthread_cond_broadcast (&name);
+ De-initialization: err = glthread_cond_destroy (&name);
+*/
+
+
+#ifndef _GLTHREAD_COND_H
+#define _GLTHREAD_COND_H
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "glthread/lock.h"
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+/* Weak references avoid dragging in external libraries if the other parts
+ of the program don't use them. Here we use them, because we don't want
+ every program that uses libintl to depend on libpthread. This assumes
+ that libpthread would not be loaded after libintl; i.e. if libintl is
+ loaded first, by an executable that does not depend on libpthread, and
+ then a module is dynamically loaded that depends on libpthread, libintl
+ will not be multithread-safe. */
+
+/* The way to test at runtime whether libpthread is present is to test
+ whether a function pointer's value, such as &pthread_mutex_init, is
+ non-NULL. However, some versions of GCC have a bug through which, in
+ PIC mode, &foo != NULL always evaluates to true if there is a direct
+ call to foo(...) in the same function. To avoid this, we test the
+ address of a function in libpthread that we don't use. */
+
+# pragma weak pthread_cond_init
+# pragma weak pthread_cond_wait
+# pragma weak pthread_cond_timedwait
+# pragma weak pthread_cond_signal
+# pragma weak pthread_cond_broadcast
+# pragma weak pthread_cond_destroy
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# pragma weak pthread_cancel
+# define pthread_in_use() (pthread_cancel != NULL)
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+typedef pthread_cond_t gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME;
+# define gl_cond_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME = gl_cond_initializer;
+# define gl_cond_initializer \
+ PTHREAD_COND_INITIALIZER
+# define glthread_cond_init(COND) \
+ (pthread_in_use () ? pthread_cond_init (COND, NULL) : 0)
+# define glthread_cond_wait(COND, LOCK) \
+ (pthread_in_use () ? pthread_cond_wait (COND, LOCK) : 0)
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) \
+ (pthread_in_use () ? pthread_cond_timedwait (COND, LOCK, ABSTIME) : 0)
+# define glthread_cond_signal(COND) \
+ (pthread_in_use () ? pthread_cond_signal (COND) : 0)
+# define glthread_cond_broadcast(COND) \
+ (pthread_in_use () ? pthread_cond_broadcast (COND) : 0)
+# define glthread_cond_destroy(COND) \
+ (pthread_in_use () ? pthread_cond_destroy (COND) : 0)
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library. */
+
+# pragma weak pth_cond_init
+# pragma weak pth_cond_await
+# pragma weak pth_cond_notify
+# pragma weak pth_event
+# pragma weak pth_timeout
+
+# pragma weak pth_cancel
+# define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+# define pth_in_use() 1
+
+# endif
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+typedef pth_cond_t gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME;
+# define gl_cond_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME = gl_cond_initializer;
+# define gl_cond_initializer \
+ PTH_COND_INIT
+# define glthread_cond_init(COND) \
+ (pth_in_use () && !pth_cond_init (COND) ? errno : 0)
+# define glthread_cond_wait(COND, LOCK) \
+ (pth_in_use () && !pth_cond_await (COND, LOCK, NULL) ? errno : 0)
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) \
+ (pth_in_use () ? glthread_cond_timedwait_multithreaded (COND, LOCK, ABSTIME) : 0)
+# define glthread_cond_signal(COND) \
+ (pth_in_use () && !pth_cond_notify (COND, FALSE) ? errno : 0)
+# define glthread_cond_broadcast(COND) \
+ (pth_in_use () && !pth_cond_notify (COND, TRUE) ? errno : 0)
+# define glthread_cond_destroy(COND) 0
+extern int glthread_cond_timedwait_multithreaded (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+# include <synch.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library. */
+
+# pragma weak cond_init
+# pragma weak cond_wait
+# pragma weak cond_timedwait
+# pragma weak cond_signal
+# pragma weak cond_broadcast
+# pragma weak cond_destroy
+# pragma weak thr_suspend
+# define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+# define thread_in_use() 1
+
+# endif
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+typedef cond_t gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME;
+# define gl_cond_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME = gl_cond_initializer;
+# define gl_cond_initializer \
+ DEFAULTCV
+# define glthread_cond_init(COND) \
+ (pthread_in_use () ? cond_init (COND, USYNC_THREAD, NULL) : 0)
+# define glthread_cond_wait(COND, LOCK) \
+ (pthread_in_use () ? cond_wait (COND, LOCK) : 0)
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) \
+ (pthread_in_use () ? glthread_cond_timedwait_multithreaded (COND, LOCK, ABSTIME) : 0)
+# define glthread_cond_signal(COND) \
+ (pthread_in_use () ? cond_signal (COND) : 0)
+# define glthread_cond_broadcast(COND) \
+ (pthread_in_use () ? cond_broadcast (COND) : 0)
+# define glthread_cond_destroy(COND) \
+ (pthread_in_use () ? cond_destroy (COND) : 0)
+extern int glthread_cond_timedwait_multithreaded (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+struct gl_waitqueue_link
+{
+ struct gl_waitqueue_link *wql_next;
+ struct gl_waitqueue_link *wql_prev;
+};
+typedef struct
+ {
+ struct gl_waitqueue_link wq_list; /* circular list of waiting threads */
+ }
+ gl_linked_waitqueue_t;
+typedef struct
+ {
+ gl_spinlock_t guard; /* protects the initialization */
+ CRITICAL_SECTION lock; /* protects the remaining fields */
+ gl_linked_waitqueue_t waiters; /* waiting threads */
+ }
+ gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME;
+# define gl_cond_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME = gl_cond_initializer;
+# define gl_cond_initializer \
+ { { 0, -1 } }
+# define glthread_cond_init(COND) \
+ glthread_cond_init_func (COND)
+# define glthread_cond_wait(COND, LOCK) \
+ glthread_cond_wait_func (COND, LOCK)
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) \
+ glthread_cond_timedwait_func (COND, LOCK, ABSTIME)
+# define glthread_cond_signal(COND) \
+ glthread_cond_signal_func (COND)
+# define glthread_cond_broadcast(COND) \
+ glthread_cond_broadcast_func (COND)
+# define glthread_cond_destroy(COND) \
+ glthread_cond_destroy_func (COND)
+extern int glthread_cond_init_func (gl_cond_t *cond);
+extern int glthread_cond_wait_func (gl_cond_t *cond, gl_lock_t *lock);
+extern int glthread_cond_timedwait_func (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime);
+extern int glthread_cond_signal_func (gl_cond_t *cond);
+extern int glthread_cond_broadcast_func (gl_cond_t *cond);
+extern int glthread_cond_destroy_func (gl_cond_t *cond);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+typedef int gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME)
+# define gl_cond_define_initialized(STORAGECLASS, NAME)
+# define glthread_cond_init(COND) 0
+# define glthread_cond_wait(COND, LOCK) 0
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) 0
+# define glthread_cond_signal(COND) 0
+# define glthread_cond_broadcast(COND) 0
+# define glthread_cond_destroy(COND) 0
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define gl_cond_init(COND) \
+ do \
+ { \
+ if (glthread_cond_init (&COND)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_cond_wait(COND, LOCK) \
+ do \
+ { \
+ if (glthread_cond_wait (&COND, &LOCK)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_cond_timedwait(COND, LOCK, ABSTIME) \
+ gl_cond_timedwait_func (&COND, &LOCK, ABSTIME)
+static inline bool
+gl_cond_timedwait_func (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime)
+{
+ int err = glthread_cond_timedwait (cond, lock, abstime);
+ if (err == ETIMEDOUT)
+ return true;
+ if (err != 0)
+ abort ();
+ return false;
+}
+#define gl_cond_signal(COND) \
+ do \
+ { \
+ if (glthread_cond_signal (&COND)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_cond_broadcast(COND) \
+ do \
+ { \
+ if (glthread_cond_broadcast (&COND)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_cond_destroy(COND) \
+ do \
+ { \
+ if (glthread_cond_destroy (&COND)) \
+ abort (); \
+ } \
+ while (0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GLTHREAD_COND_H */
diff --git a/gnulib/lib/glthread/lock.c b/gnulib/lib/glthread/lock.c
new file mode 100644
index 00000000..1631c25d
--- /dev/null
+++ b/gnulib/lib/glthread/lock.c
@@ -0,0 +1,1058 @@
+/* Locking in multithreaded situations.
+ Copyright (C) 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+ gthr-win32.h. */
+
+#include <config.h>
+
+#include "glthread/lock.h"
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+# if HAVE_PTHREAD_RWLOCK
+
+# if !defined PTHREAD_RWLOCK_INITIALIZER
+
+int
+glthread_rwlock_init_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_rwlock_init (&lock->rwlock, NULL);
+ if (err != 0)
+ return err;
+ lock->initialized = 1;
+ return 0;
+}
+
+int
+glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_rwlock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_rwlock_rdlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_rwlock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_rwlock_wrlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ return EINVAL;
+ return pthread_rwlock_unlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ if (!lock->initialized)
+ return EINVAL;
+ err = pthread_rwlock_destroy (&lock->rwlock);
+ if (err != 0)
+ return err;
+ lock->initialized = 0;
+ return 0;
+}
+
+# endif
+
+# else
+
+int
+glthread_rwlock_init_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_init (&lock->lock, NULL);
+ if (err != 0)
+ return err;
+ err = pthread_cond_init (&lock->waiting_readers, NULL);
+ if (err != 0)
+ return err;
+ err = pthread_cond_init (&lock->waiting_writers, NULL);
+ if (err != 0)
+ return err;
+ lock->waiting_writers_count = 0;
+ lock->runcount = 0;
+ return 0;
+}
+
+int
+glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ /* Test whether only readers are currently running, and whether the runcount
+ field will not overflow. */
+ /* POSIX says: "It is implementation-defined whether the calling thread
+ acquires the lock when a writer does not hold the lock and there are
+ writers blocked on the lock." Let's say, no: give the writers a higher
+ priority. */
+ while (!(lock->runcount + 1 > 0 && lock->waiting_writers_count == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_readers. */
+ err = pthread_cond_wait (&lock->waiting_readers, &lock->lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ lock->runcount++;
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ /* Test whether no readers or writers are currently running. */
+ while (!(lock->runcount == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_writers. */
+ lock->waiting_writers_count++;
+ err = pthread_cond_wait (&lock->waiting_writers, &lock->lock);
+ if (err != 0)
+ {
+ lock->waiting_writers_count--;
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ lock->waiting_writers_count--;
+ }
+ lock->runcount--; /* runcount becomes -1 */
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ if (lock->runcount < 0)
+ {
+ /* Drop a writer lock. */
+ if (!(lock->runcount == -1))
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->runcount = 0;
+ }
+ else
+ {
+ /* Drop a reader lock. */
+ if (!(lock->runcount > 0))
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->runcount--;
+ }
+ if (lock->runcount == 0)
+ {
+ /* POSIX recommends that "write locks shall take precedence over read
+ locks", to avoid "writer starvation". */
+ if (lock->waiting_writers_count > 0)
+ {
+ /* Wake up one of the waiting writers. */
+ err = pthread_cond_signal (&lock->waiting_writers);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ else
+ {
+ /* Wake up all waiting readers. */
+ err = pthread_cond_broadcast (&lock->waiting_readers);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ }
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_destroy (&lock->lock);
+ if (err != 0)
+ return err;
+ err = pthread_cond_destroy (&lock->waiting_readers);
+ if (err != 0)
+ return err;
+ err = pthread_cond_destroy (&lock->waiting_writers);
+ if (err != 0)
+ return err;
+ return 0;
+}
+
+# endif
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+# if HAVE_PTHREAD_MUTEX_RECURSIVE
+
+# if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_mutexattr_t attributes;
+ int err;
+
+ err = pthread_mutexattr_init (&attributes);
+ if (err != 0)
+ return err;
+ err = pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutex_init (lock, &attributes);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutexattr_destroy (&attributes);
+ if (err != 0)
+ return err;
+ return 0;
+}
+
+# else
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_mutexattr_t attributes;
+ int err;
+
+ err = pthread_mutexattr_init (&attributes);
+ if (err != 0)
+ return err;
+ err = pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutex_init (&lock->recmutex, &attributes);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutexattr_destroy (&attributes);
+ if (err != 0)
+ return err;
+ lock->initialized = 1;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_recursive_lock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_mutex_lock (&lock->recmutex);
+}
+
+int
+glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (!lock->initialized)
+ return EINVAL;
+ return pthread_mutex_unlock (&lock->recmutex);
+}
+
+int
+glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock)
+{
+ int err;
+
+ if (!lock->initialized)
+ return EINVAL;
+ err = pthread_mutex_destroy (&lock->recmutex);
+ if (err != 0)
+ return err;
+ lock->initialized = 0;
+ return 0;
+}
+
+# endif
+
+# else
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_init (&lock->mutex, NULL);
+ if (err != 0)
+ return err;
+ lock->owner = (pthread_t) 0;
+ lock->depth = 0;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_t self = pthread_self ();
+ if (lock->owner != self)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->mutex);
+ if (err != 0)
+ return err;
+ lock->owner = self;
+ }
+ if (++(lock->depth) == 0) /* wraparound? */
+ {
+ lock->depth--;
+ return EAGAIN;
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != pthread_self ())
+ return EPERM;
+ if (lock->depth == 0)
+ return EINVAL;
+ if (--(lock->depth) == 0)
+ {
+ lock->owner = (pthread_t) 0;
+ return pthread_mutex_unlock (&lock->mutex);
+ }
+ else
+ return 0;
+}
+
+int
+glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != (pthread_t) 0)
+ return EBUSY;
+ return pthread_mutex_destroy (&lock->mutex);
+}
+
+# endif
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+static const pthread_once_t fresh_once = PTHREAD_ONCE_INIT;
+
+int
+glthread_once_singlethreaded (pthread_once_t *once_control)
+{
+ /* We don't know whether pthread_once_t is an integer type, a floating-point
+ type, a pointer type, or a structure type. */
+ char *firstbyte = (char *)once_control;
+ if (*firstbyte == *(const char *)&fresh_once)
+ {
+ /* First time use of once_control. Invert the first byte. */
+ *firstbyte = ~ *(const char *)&fresh_once;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+static void
+glthread_once_call (void *arg)
+{
+ void (**gl_once_temp_addr) (void) = (void (**) (void)) arg;
+ void (*initfunction) (void) = *gl_once_temp_addr;
+ initfunction ();
+}
+
+int
+glthread_once_multithreaded (pth_once_t *once_control, void (*initfunction) (void))
+{
+ void (*temp) (void) = initfunction;
+ return (!pth_once (once_control, glthread_once_call, &temp) ? errno : 0);
+}
+
+int
+glthread_once_singlethreaded (pth_once_t *once_control)
+{
+ /* We know that pth_once_t is an integer type. */
+ if (*once_control == PTH_ONCE_INIT)
+ {
+ /* First time use of once_control. Invert the marker. */
+ *once_control = ~ PTH_ONCE_INIT;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ int err;
+
+ err = mutex_init (&lock->mutex, USYNC_THREAD, NULL);
+ if (err != 0)
+ return err;
+ lock->owner = (thread_t) 0;
+ lock->depth = 0;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock)
+{
+ thread_t self = thr_self ();
+ if (lock->owner != self)
+ {
+ int err;
+
+ err = mutex_lock (&lock->mutex);
+ if (err != 0)
+ return err;
+ lock->owner = self;
+ }
+ if (++(lock->depth) == 0) /* wraparound? */
+ {
+ lock->depth--;
+ return EAGAIN;
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != thr_self ())
+ return EPERM;
+ if (lock->depth == 0)
+ return EINVAL;
+ if (--(lock->depth) == 0)
+ {
+ lock->owner = (thread_t) 0;
+ return mutex_unlock (&lock->mutex);
+ }
+ else
+ return 0;
+}
+
+int
+glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != (thread_t) 0)
+ return EBUSY;
+ return mutex_destroy (&lock->mutex);
+}
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+int
+glthread_once_multithreaded (gl_once_t *once_control, void (*initfunction) (void))
+{
+ if (!once_control->inited)
+ {
+ int err;
+
+ /* Use the mutex to guarantee that if another thread is already calling
+ the initfunction, this thread waits until it's finished. */
+ err = mutex_lock (&once_control->mutex);
+ if (err != 0)
+ return err;
+ if (!once_control->inited)
+ {
+ once_control->inited = 1;
+ initfunction ();
+ }
+ return mutex_unlock (&once_control->mutex);
+ }
+ else
+ return 0;
+}
+
+int
+glthread_once_singlethreaded (gl_once_t *once_control)
+{
+ /* We know that gl_once_t contains an integer type. */
+ if (!once_control->inited)
+ {
+ /* First time use of once_control. Invert the marker. */
+ once_control->inited = ~ 0;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+void
+glthread_lock_init_func (gl_lock_t *lock)
+{
+ InitializeCriticalSection (&lock->lock);
+ lock->guard.done = 1;
+}
+
+int
+glthread_lock_lock_func (gl_lock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glthread_lock_init (lock);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ EnterCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_lock_unlock_func (gl_lock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_lock_destroy_func (gl_lock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ DeleteCriticalSection (&lock->lock);
+ lock->guard.done = 0;
+ return 0;
+}
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* In this file, the waitqueues are implemented as circular arrays. */
+#define gl_waitqueue_t gl_carray_waitqueue_t
+
+static inline void
+gl_waitqueue_init (gl_waitqueue_t *wq)
+{
+ wq->array = NULL;
+ wq->count = 0;
+ wq->alloc = 0;
+ wq->offset = 0;
+}
+
+/* Enqueues the current thread, represented by an event, in a wait queue.
+ Returns INVALID_HANDLE_VALUE if an allocation failure occurs. */
+static HANDLE
+gl_waitqueue_add (gl_waitqueue_t *wq)
+{
+ HANDLE event;
+ unsigned int index;
+
+ if (wq->count == wq->alloc)
+ {
+ unsigned int new_alloc = 2 * wq->alloc + 1;
+ HANDLE *new_array =
+ (HANDLE *) realloc (wq->array, new_alloc * sizeof (HANDLE));
+ if (new_array == NULL)
+ /* No more memory. */
+ return INVALID_HANDLE_VALUE;
+ /* Now is a good opportunity to rotate the array so that its contents
+ starts at offset 0. */
+ if (wq->offset > 0)
+ {
+ unsigned int old_count = wq->count;
+ unsigned int old_alloc = wq->alloc;
+ unsigned int old_offset = wq->offset;
+ unsigned int i;
+ if (old_offset + old_count > old_alloc)
+ {
+ unsigned int limit = old_offset + old_count - old_alloc;
+ for (i = 0; i < limit; i++)
+ new_array[old_alloc + i] = new_array[i];
+ }
+ for (i = 0; i < old_count; i++)
+ new_array[i] = new_array[old_offset + i];
+ wq->offset = 0;
+ }
+ wq->array = new_array;
+ wq->alloc = new_alloc;
+ }
+ /* Whether the created event is a manual-reset one or an auto-reset one,
+ does not matter, since we will wait on it only once. */
+ event = CreateEvent (NULL, TRUE, FALSE, NULL);
+ if (event == INVALID_HANDLE_VALUE)
+ /* No way to allocate an event. */
+ return INVALID_HANDLE_VALUE;
+ index = wq->offset + wq->count;
+ if (index >= wq->alloc)
+ index -= wq->alloc;
+ wq->array[index] = event;
+ wq->count++;
+ return event;
+}
+
+/* Notifies the first thread from a wait queue and dequeues it. */
+static inline void
+gl_waitqueue_notify_first (gl_waitqueue_t *wq)
+{
+ SetEvent (wq->array[wq->offset + 0]);
+ wq->offset++;
+ wq->count--;
+ if (wq->count == 0 || wq->offset == wq->alloc)
+ wq->offset = 0;
+}
+
+/* Notifies all threads from a wait queue and dequeues them all. */
+static inline void
+gl_waitqueue_notify_all (gl_waitqueue_t *wq)
+{
+ unsigned int i;
+
+ for (i = 0; i < wq->count; i++)
+ {
+ unsigned int index = wq->offset + i;
+ if (index >= wq->alloc)
+ index -= wq->alloc;
+ SetEvent (wq->array[index]);
+ }
+ wq->count = 0;
+ wq->offset = 0;
+}
+
+void
+glthread_rwlock_init_func (gl_rwlock_t *lock)
+{
+ InitializeCriticalSection (&lock->lock);
+ gl_waitqueue_init (&lock->waiting_readers);
+ gl_waitqueue_init (&lock->waiting_writers);
+ lock->runcount = 0;
+ lock->guard.done = 1;
+}
+
+int
+glthread_rwlock_rdlock_func (gl_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glthread_rwlock_init (lock);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ EnterCriticalSection (&lock->lock);
+ /* Test whether only readers are currently running, and whether the runcount
+ field will not overflow. */
+ if (!(lock->runcount + 1 > 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_readers. */
+ HANDLE event = gl_waitqueue_add (&lock->waiting_readers);
+ if (event != INVALID_HANDLE_VALUE)
+ {
+ DWORD result;
+ LeaveCriticalSection (&lock->lock);
+ /* Wait until another thread signals this event. */
+ result = WaitForSingleObject (event, INFINITE);
+ if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+ abort ();
+ CloseHandle (event);
+ /* The thread which signalled the event already did the bookkeeping:
+ removed us from the waiting_readers, incremented lock->runcount. */
+ if (!(lock->runcount > 0))
+ abort ();
+ return 0;
+ }
+ else
+ {
+ /* Allocation failure. Weird. */
+ do
+ {
+ LeaveCriticalSection (&lock->lock);
+ Sleep (1);
+ EnterCriticalSection (&lock->lock);
+ }
+ while (!(lock->runcount + 1 > 0));
+ }
+ }
+ lock->runcount++;
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_rwlock_wrlock_func (gl_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glthread_rwlock_init (lock);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ EnterCriticalSection (&lock->lock);
+ /* Test whether no readers or writers are currently running. */
+ if (!(lock->runcount == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_writers. */
+ HANDLE event = gl_waitqueue_add (&lock->waiting_writers);
+ if (event != INVALID_HANDLE_VALUE)
+ {
+ DWORD result;
+ LeaveCriticalSection (&lock->lock);
+ /* Wait until another thread signals this event. */
+ result = WaitForSingleObject (event, INFINITE);
+ if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+ abort ();
+ CloseHandle (event);
+ /* The thread which signalled the event already did the bookkeeping:
+ removed us from the waiting_writers, set lock->runcount = -1. */
+ if (!(lock->runcount == -1))
+ abort ();
+ return 0;
+ }
+ else
+ {
+ /* Allocation failure. Weird. */
+ do
+ {
+ LeaveCriticalSection (&lock->lock);
+ Sleep (1);
+ EnterCriticalSection (&lock->lock);
+ }
+ while (!(lock->runcount == 0));
+ }
+ }
+ lock->runcount--; /* runcount becomes -1 */
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_rwlock_unlock_func (gl_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ EnterCriticalSection (&lock->lock);
+ if (lock->runcount < 0)
+ {
+ /* Drop a writer lock. */
+ if (!(lock->runcount == -1))
+ abort ();
+ lock->runcount = 0;
+ }
+ else
+ {
+ /* Drop a reader lock. */
+ if (!(lock->runcount > 0))
+ {
+ LeaveCriticalSection (&lock->lock);
+ return EPERM;
+ }
+ lock->runcount--;
+ }
+ if (lock->runcount == 0)
+ {
+ /* POSIX recommends that "write locks shall take precedence over read
+ locks", to avoid "writer starvation". */
+ if (lock->waiting_writers.count > 0)
+ {
+ /* Wake up one of the waiting writers. */
+ lock->runcount--;
+ gl_waitqueue_notify_first (&lock->waiting_writers);
+ }
+ else
+ {
+ /* Wake up all waiting readers. */
+ lock->runcount += lock->waiting_readers.count;
+ gl_waitqueue_notify_all (&lock->waiting_readers);
+ }
+ }
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_rwlock_destroy_func (gl_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ if (lock->runcount != 0)
+ return EBUSY;
+ DeleteCriticalSection (&lock->lock);
+ if (lock->waiting_readers.array != NULL)
+ free (lock->waiting_readers.array);
+ if (lock->waiting_writers.array != NULL)
+ free (lock->waiting_writers.array);
+ lock->guard.done = 0;
+ return 0;
+}
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+void
+glthread_recursive_lock_init_func (gl_recursive_lock_t *lock)
+{
+ lock->owner = 0;
+ lock->depth = 0;
+ InitializeCriticalSection (&lock->lock);
+ lock->guard.done = 1;
+}
+
+int
+glthread_recursive_lock_lock_func (gl_recursive_lock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glthread_recursive_lock_init (lock);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ {
+ DWORD self = GetCurrentThreadId ();
+ if (lock->owner != self)
+ {
+ EnterCriticalSection (&lock->lock);
+ lock->owner = self;
+ }
+ if (++(lock->depth) == 0) /* wraparound? */
+ {
+ lock->depth--;
+ return EAGAIN;
+ }
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_unlock_func (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != GetCurrentThreadId ())
+ return EPERM;
+ if (lock->depth == 0)
+ return EINVAL;
+ if (--(lock->depth) == 0)
+ {
+ lock->owner = 0;
+ LeaveCriticalSection (&lock->lock);
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_destroy_func (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != 0)
+ return EBUSY;
+ DeleteCriticalSection (&lock->lock);
+ lock->guard.done = 0;
+ return 0;
+}
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+void
+glthread_once_func (gl_once_t *once_control, void (*initfunction) (void))
+{
+ if (once_control->inited <= 0)
+ {
+ if (InterlockedIncrement (&once_control->started) == 0)
+ {
+ /* This thread is the first one to come to this once_control. */
+ InitializeCriticalSection (&once_control->lock);
+ EnterCriticalSection (&once_control->lock);
+ once_control->inited = 0;
+ initfunction ();
+ once_control->inited = 1;
+ LeaveCriticalSection (&once_control->lock);
+ }
+ else
+ {
+ /* Undo last operation. */
+ InterlockedDecrement (&once_control->started);
+ /* Some other thread has already started the initialization.
+ Yield the CPU while waiting for the other thread to finish
+ initializing and taking the lock. */
+ while (once_control->inited < 0)
+ Sleep (0);
+ if (once_control->inited <= 0)
+ {
+ /* Take the lock. This blocks until the other thread has
+ finished calling the initfunction. */
+ EnterCriticalSection (&once_control->lock);
+ LeaveCriticalSection (&once_control->lock);
+ if (!(once_control->inited > 0))
+ abort ();
+ }
+ }
+ }
+}
+
+#endif
+
+/* ========================================================================= */
diff --git a/gnulib/lib/glthread/lock.h b/gnulib/lib/glthread/lock.h
new file mode 100644
index 00000000..9de88a81
--- /dev/null
+++ b/gnulib/lib/glthread/lock.h
@@ -0,0 +1,927 @@
+/* Locking in multithreaded situations.
+ Copyright (C) 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+ gthr-win32.h. */
+
+/* This file contains locking primitives for use with a given thread library.
+ It does not contain primitives for creating threads or for other
+ synchronization primitives.
+
+ Normal (non-recursive) locks:
+ Type: gl_lock_t
+ Declaration: gl_lock_define(extern, name)
+ Initializer: gl_lock_define_initialized(, name)
+ Initialization: gl_lock_init (name);
+ Taking the lock: gl_lock_lock (name);
+ Releasing the lock: gl_lock_unlock (name);
+ De-initialization: gl_lock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_lock_init (&name);
+ Taking the lock: err = glthread_lock_lock (&name);
+ Releasing the lock: err = glthread_lock_unlock (&name);
+ De-initialization: err = glthread_lock_destroy (&name);
+
+ Read-Write (non-recursive) locks:
+ Type: gl_rwlock_t
+ Declaration: gl_rwlock_define(extern, name)
+ Initializer: gl_rwlock_define_initialized(, name)
+ Initialization: gl_rwlock_init (name);
+ Taking the lock: gl_rwlock_rdlock (name);
+ gl_rwlock_wrlock (name);
+ Releasing the lock: gl_rwlock_unlock (name);
+ De-initialization: gl_rwlock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_rwlock_init (&name);
+ Taking the lock: err = glthread_rwlock_rdlock (&name);
+ err = glthread_rwlock_wrlock (&name);
+ Releasing the lock: err = glthread_rwlock_unlock (&name);
+ De-initialization: err = glthread_rwlock_destroy (&name);
+
+ Recursive locks:
+ Type: gl_recursive_lock_t
+ Declaration: gl_recursive_lock_define(extern, name)
+ Initializer: gl_recursive_lock_define_initialized(, name)
+ Initialization: gl_recursive_lock_init (name);
+ Taking the lock: gl_recursive_lock_lock (name);
+ Releasing the lock: gl_recursive_lock_unlock (name);
+ De-initialization: gl_recursive_lock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_recursive_lock_init (&name);
+ Taking the lock: err = glthread_recursive_lock_lock (&name);
+ Releasing the lock: err = glthread_recursive_lock_unlock (&name);
+ De-initialization: err = glthread_recursive_lock_destroy (&name);
+
+ Once-only execution:
+ Type: gl_once_t
+ Initializer: gl_once_define(extern, name)
+ Execution: gl_once (name, initfunction);
+ Equivalent functions with control of error handling:
+ Execution: err = glthread_once (&name, initfunction);
+*/
+
+
+#ifndef _LOCK_H
+#define _LOCK_H
+
+#include <errno.h>
+#include <stdlib.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+/* Weak references avoid dragging in external libraries if the other parts
+ of the program don't use them. Here we use them, because we don't want
+ every program that uses libintl to depend on libpthread. This assumes
+ that libpthread would not be loaded after libintl; i.e. if libintl is
+ loaded first, by an executable that does not depend on libpthread, and
+ then a module is dynamically loaded that depends on libpthread, libintl
+ will not be multithread-safe. */
+
+/* The way to test at runtime whether libpthread is present is to test
+ whether a function pointer's value, such as &pthread_mutex_init, is
+ non-NULL. However, some versions of GCC have a bug through which, in
+ PIC mode, &foo != NULL always evaluates to true if there is a direct
+ call to foo(...) in the same function. To avoid this, we test the
+ address of a function in libpthread that we don't use. */
+
+# pragma weak pthread_mutex_init
+# pragma weak pthread_mutex_lock
+# pragma weak pthread_mutex_unlock
+# pragma weak pthread_mutex_destroy
+# pragma weak pthread_rwlock_init
+# pragma weak pthread_rwlock_rdlock
+# pragma weak pthread_rwlock_wrlock
+# pragma weak pthread_rwlock_unlock
+# pragma weak pthread_rwlock_destroy
+# pragma weak pthread_once
+# pragma weak pthread_cond_init
+# pragma weak pthread_cond_wait
+# pragma weak pthread_cond_signal
+# pragma weak pthread_cond_broadcast
+# pragma weak pthread_cond_destroy
+# pragma weak pthread_mutexattr_init
+# pragma weak pthread_mutexattr_settype
+# pragma weak pthread_mutexattr_destroy
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# pragma weak pthread_cancel
+# define pthread_in_use() (pthread_cancel != NULL)
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef pthread_mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ PTHREAD_MUTEX_INITIALIZER
+# define glthread_lock_init(LOCK) \
+ (pthread_in_use () ? pthread_mutex_init (LOCK, NULL) : 0)
+# define glthread_lock_lock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0)
+# define glthread_lock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0)
+# define glthread_lock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+# if HAVE_PTHREAD_RWLOCK
+
+# ifdef PTHREAD_RWLOCK_INITIALIZER
+
+typedef pthread_rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ PTHREAD_RWLOCK_INITIALIZER
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_init (LOCK, NULL) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_rdlock (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_wrlock (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_unlock (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_destroy (LOCK) : 0)
+
+# else
+
+typedef struct
+ {
+ int initialized;
+ pthread_mutex_t guard; /* protects the initialization */
+ pthread_rwlock_t rwlock; /* read-write lock */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ { 0, PTHREAD_MUTEX_INITIALIZER }
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock);
+
+# endif
+
+# else
+
+typedef struct
+ {
+ pthread_mutex_t lock; /* protects the remaining fields */
+ pthread_cond_t waiting_readers; /* waiting readers */
+ pthread_cond_t waiting_writers; /* waiting writers */
+ unsigned int waiting_writers_count; /* number of waiting writers */
+ int runcount; /* number of readers running, or -1 when a writer runs */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0 }
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock);
+
+# endif
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+# if HAVE_PTHREAD_MUTEX_RECURSIVE
+
+# if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+
+typedef pthread_mutex_t gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME = gl_recursive_lock_initializer;
+# ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+# define gl_recursive_lock_initializer \
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+# else
+# define gl_recursive_lock_initializer \
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+# endif
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+
+# else
+
+typedef struct
+ {
+ pthread_mutex_t recmutex; /* recursive mutex */
+ pthread_mutex_t guard; /* protects the initialization */
+ int initialized;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
+
+# endif
+
+# else
+
+/* Old versions of POSIX threads on Solaris did not have recursive locks.
+ We have to implement them ourselves. */
+
+typedef struct
+ {
+ pthread_mutex_t mutex;
+ pthread_t owner;
+ unsigned long depth;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, (pthread_t) 0, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
+
+# endif
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef pthread_once_t gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (pthread_in_use () \
+ ? pthread_once (ONCE_CONTROL, INITFUNCTION) \
+ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+extern int glthread_once_singlethreaded (pthread_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library. */
+
+# pragma weak pth_mutex_init
+# pragma weak pth_mutex_acquire
+# pragma weak pth_mutex_release
+# pragma weak pth_rwlock_init
+# pragma weak pth_rwlock_acquire
+# pragma weak pth_rwlock_release
+# pragma weak pth_once
+
+# pragma weak pth_cancel
+# define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+# define pth_in_use() 1
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef pth_mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pth_mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pth_mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ PTH_MUTEX_INIT
+# define glthread_lock_init(LOCK) \
+ (pth_in_use() && !pth_mutex_init (LOCK) ? errno : 0)
+# define glthread_lock_lock(LOCK) \
+ (pth_in_use() && !pth_mutex_acquire (LOCK, 0, NULL) ? errno : 0)
+# define glthread_lock_unlock(LOCK) \
+ (pth_in_use() && !pth_mutex_release (LOCK) ? errno : 0)
+# define glthread_lock_destroy(LOCK) \
+ ((void)(LOCK), 0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef pth_rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pth_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pth_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ PTH_RWLOCK_INIT
+# define glthread_rwlock_init(LOCK) \
+ (pth_in_use() && !pth_rwlock_init (LOCK) ? errno : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pth_in_use() && !pth_rwlock_acquire (LOCK, PTH_RWLOCK_RD, 0, NULL) ? errno : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pth_in_use() && !pth_rwlock_acquire (LOCK, PTH_RWLOCK_RW, 0, NULL) ? errno : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pth_in_use() && !pth_rwlock_release (LOCK) ? errno : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ ((void)(LOCK), 0)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* In Pth, mutexes are recursive by default. */
+typedef pth_mutex_t gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pth_mutex_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pth_mutex_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ PTH_MUTEX_INIT
+# define glthread_recursive_lock_init(LOCK) \
+ (pth_in_use() && !pth_mutex_init (LOCK) ? errno : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pth_in_use() && !pth_mutex_acquire (LOCK, 0, NULL) ? errno : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pth_in_use() && !pth_mutex_release (LOCK) ? errno : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ ((void)(LOCK), 0)
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef pth_once_t gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS pth_once_t NAME = PTH_ONCE_INIT;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (pth_in_use () \
+ ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION) \
+ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+extern int glthread_once_multithreaded (pth_once_t *once_control, void (*initfunction) (void));
+extern int glthread_once_singlethreaded (pth_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+# include <synch.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library. */
+
+# pragma weak mutex_init
+# pragma weak mutex_lock
+# pragma weak mutex_unlock
+# pragma weak mutex_destroy
+# pragma weak rwlock_init
+# pragma weak rw_rdlock
+# pragma weak rw_wrlock
+# pragma weak rw_unlock
+# pragma weak rwlock_destroy
+# pragma weak thr_self
+
+# pragma weak thr_suspend
+# define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+# define thread_in_use() 1
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ DEFAULTMUTEX
+# define glthread_lock_init(LOCK) \
+ (thread_in_use () ? mutex_init (LOCK, USYNC_THREAD, NULL) : 0)
+# define glthread_lock_lock(LOCK) \
+ (thread_in_use () ? mutex_lock (LOCK) : 0)
+# define glthread_lock_unlock(LOCK) \
+ (thread_in_use () ? mutex_unlock (LOCK) : 0)
+# define glthread_lock_destroy(LOCK) \
+ (thread_in_use () ? mutex_destroy (LOCK) : 0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ DEFAULTRWLOCK
+# define glthread_rwlock_init(LOCK) \
+ (thread_in_use () ? rwlock_init (LOCK, USYNC_THREAD, NULL) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (thread_in_use () ? rw_rdlock (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (thread_in_use () ? rw_wrlock (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (thread_in_use () ? rw_unlock (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (thread_in_use () ? rwlock_destroy (LOCK) : 0)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* Old Solaris threads did not have recursive locks.
+ We have to implement them ourselves. */
+
+typedef struct
+ {
+ mutex_t mutex;
+ thread_t owner;
+ unsigned long depth;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { DEFAULTMUTEX, (thread_t) 0, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (thread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (thread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (thread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (thread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef struct
+ {
+ volatile int inited;
+ mutex_t mutex;
+ }
+ gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_once_t NAME = { 0, DEFAULTMUTEX };
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (thread_in_use () \
+ ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION) \
+ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+extern int glthread_once_multithreaded (gl_once_t *once_control, void (*initfunction) (void));
+extern int glthread_once_singlethreaded (gl_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* We can use CRITICAL_SECTION directly, rather than the Win32 Event, Mutex,
+ Semaphore types, because
+ - we need only to synchronize inside a single process (address space),
+ not inter-process locking,
+ - we don't need to support trylock operations. (TryEnterCriticalSection
+ does not work on Windows 95/98/ME. Packages that need trylock usually
+ define their own mutex type.) */
+
+/* There is no way to statically initialize a CRITICAL_SECTION. It needs
+ to be done lazily, once only. For this we need spinlocks. */
+
+typedef struct { volatile int done; volatile long started; } gl_spinlock_t;
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef struct
+ {
+ gl_spinlock_t guard; /* protects the initialization */
+ CRITICAL_SECTION lock;
+ }
+ gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_lock_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_lock_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ { { 0, -1 } }
+# define glthread_lock_init(LOCK) \
+ (glthread_lock_init_func (LOCK), 0)
+# define glthread_lock_lock(LOCK) \
+ glthread_lock_lock_func (LOCK)
+# define glthread_lock_unlock(LOCK) \
+ glthread_lock_unlock_func (LOCK)
+# define glthread_lock_destroy(LOCK) \
+ glthread_lock_destroy_func (LOCK)
+extern void glthread_lock_init_func (gl_lock_t *lock);
+extern int glthread_lock_lock_func (gl_lock_t *lock);
+extern int glthread_lock_unlock_func (gl_lock_t *lock);
+extern int glthread_lock_destroy_func (gl_lock_t *lock);
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* It is impossible to implement read-write locks using plain locks, without
+ introducing an extra thread dedicated to managing read-write locks.
+ Therefore here we need to use the low-level Event type. */
+
+typedef struct
+ {
+ HANDLE *array; /* array of waiting threads, each represented by an event */
+ unsigned int count; /* number of waiting threads */
+ unsigned int alloc; /* length of allocated array */
+ unsigned int offset; /* index of first waiting thread in array */
+ }
+ gl_carray_waitqueue_t;
+typedef struct
+ {
+ gl_spinlock_t guard; /* protects the initialization */
+ CRITICAL_SECTION lock; /* protects the remaining fields */
+ gl_carray_waitqueue_t waiting_readers; /* waiting readers */
+ gl_carray_waitqueue_t waiting_writers; /* waiting writers */
+ int runcount; /* number of readers running, or -1 when a writer runs */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ { { 0, -1 } }
+# define glthread_rwlock_init(LOCK) \
+ (glthread_rwlock_init_func (LOCK), 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ glthread_rwlock_rdlock_func (LOCK)
+# define glthread_rwlock_wrlock(LOCK) \
+ glthread_rwlock_wrlock_func (LOCK)
+# define glthread_rwlock_unlock(LOCK) \
+ glthread_rwlock_unlock_func (LOCK)
+# define glthread_rwlock_destroy(LOCK) \
+ glthread_rwlock_destroy_func (LOCK)
+extern void glthread_rwlock_init_func (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock_func (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock_func (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock_func (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy_func (gl_rwlock_t *lock);
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* The Win32 documentation says that CRITICAL_SECTION already implements a
+ recursive lock. But we need not rely on it: It's easy to implement a
+ recursive lock without this assumption. */
+
+typedef struct
+ {
+ gl_spinlock_t guard; /* protects the initialization */
+ DWORD owner;
+ unsigned long depth;
+ CRITICAL_SECTION lock;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { { 0, -1 }, 0, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (glthread_recursive_lock_init_func (LOCK), 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ glthread_recursive_lock_lock_func (LOCK)
+# define glthread_recursive_lock_unlock(LOCK) \
+ glthread_recursive_lock_unlock_func (LOCK)
+# define glthread_recursive_lock_destroy(LOCK) \
+ glthread_recursive_lock_destroy_func (LOCK)
+extern void glthread_recursive_lock_init_func (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_func (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_func (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_func (gl_recursive_lock_t *lock);
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef struct
+ {
+ volatile int inited;
+ volatile long started;
+ CRITICAL_SECTION lock;
+ }
+ gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_once_t NAME = { -1, -1 };
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (glthread_once_func (ONCE_CONTROL, INITFUNCTION), 0)
+extern void glthread_once_func (gl_once_t *once_control, void (*initfunction) (void));
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef int gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME)
+# define gl_lock_define_initialized(STORAGECLASS, NAME)
+# define glthread_lock_init(NAME) 0
+# define glthread_lock_lock(NAME) 0
+# define glthread_lock_unlock(NAME) 0
+# define glthread_lock_destroy(NAME) 0
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef int gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME)
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME)
+# define glthread_rwlock_init(NAME) 0
+# define glthread_rwlock_rdlock(NAME) 0
+# define glthread_rwlock_wrlock(NAME) 0
+# define glthread_rwlock_unlock(NAME) 0
+# define glthread_rwlock_destroy(NAME) 0
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+typedef int gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME)
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME)
+# define glthread_recursive_lock_init(NAME) 0
+# define glthread_recursive_lock_lock(NAME) 0
+# define glthread_recursive_lock_unlock(NAME) 0
+# define glthread_recursive_lock_destroy(NAME) 0
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef int gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_once_t NAME = 0;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (*(ONCE_CONTROL) == 0 ? (*(ONCE_CONTROL) = ~ 0, INITFUNCTION (), 0) : 0)
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+#define gl_lock_init(NAME) \
+ do \
+ { \
+ if (glthread_lock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_lock(NAME) \
+ do \
+ { \
+ if (glthread_lock_lock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_lock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_lock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+#define gl_rwlock_init(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_rdlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_rdlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_wrlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_wrlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+#define gl_recursive_lock_init(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_lock(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_lock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+#define gl_once(NAME, INITFUNCTION) \
+ do \
+ { \
+ if (glthread_once (&NAME, INITFUNCTION)) \
+ abort (); \
+ } \
+ while (0)
+
+/* ========================================================================= */
+
+#endif /* _LOCK_H */
diff --git a/gnulib/lib/glthread/thread.c b/gnulib/lib/glthread/thread.c
new file mode 100644
index 00000000..5df2d350
--- /dev/null
+++ b/gnulib/lib/glthread/thread.c
@@ -0,0 +1,218 @@
+/* Creating and controlling threads.
+ Copyright (C) 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+ gthr-win32.h. */
+
+#include <config.h>
+
+/* Specification. */
+#include "glthread/thread.h"
+
+#include <stdlib.h>
+#include "glthread/lock.h"
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+#include <process.h>
+
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+/* The Thread-Local Storage (TLS) key that allows to access each thread's
+ 'struct gl_thread_struct *' pointer. */
+static DWORD self_key = (DWORD)-1;
+
+/* Initializes self_key. This function must only be called once. */
+static void
+do_init_self_key (void)
+{
+ self_key = TlsAlloc ();
+ /* If this fails, we're hosed. */
+ if (self_key == (DWORD)-1)
+ abort ();
+}
+
+/* Initializes self_key. */
+static void
+init_self_key (void)
+{
+ gl_once_define(static, once)
+ gl_once (once, do_init_self_key);
+}
+
+/* This structure contains information about a thread.
+ It is stored in TLS under key self_key. */
+struct gl_thread_struct
+{
+ /* Fields for managing the handle. */
+ HANDLE volatile handle;
+ CRITICAL_SECTION handle_lock;
+ /* Fields for managing the exit value. */
+ void * volatile result;
+ /* Fields for managing the thread start. */
+ void * (*func) (void *);
+ void *arg;
+};
+
+/* Return a real HANDLE object for the current thread. */
+static inline HANDLE
+get_current_thread_handle (void)
+{
+ HANDLE this_handle;
+
+ /* GetCurrentThread() returns a pseudo-handle, i.e. only a symbolic
+ identifier, not a real handle. */
+ if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
+ GetCurrentProcess (), &this_handle,
+ 0, FALSE, DUPLICATE_SAME_ACCESS))
+ abort ();
+ return this_handle;
+}
+
+gl_thread_t
+gl_thread_self_func (void)
+{
+ gl_thread_t thread;
+
+ if (self_key == (DWORD)-1)
+ init_self_key ();
+ thread = TlsGetValue (self_key);
+ if (thread == NULL)
+ {
+ /* This happens only in threads that have not been created through
+ glthread_create(), such as the main thread. */
+ for (;;)
+ {
+ thread =
+ (struct gl_thread_struct *)
+ malloc (sizeof (struct gl_thread_struct));
+ if (thread != NULL)
+ break;
+ /* Memory allocation failed. There is not much we can do. Have to
+ busy-loop, waiting for the availability of memory. */
+ Sleep (1);
+ }
+
+ thread->handle = get_current_thread_handle ();
+ InitializeCriticalSection (&thread->handle_lock);
+ thread->result = NULL; /* just to be deterministic */
+ TlsSetValue (self_key, thread);
+ }
+ return thread;
+}
+
+/* The main function of a freshly creating thread. It's a wrapper around
+ the FUNC and ARG arguments passed to glthread_create_func. */
+static unsigned int WINAPI
+wrapper_func (void *varg)
+{
+ struct gl_thread_struct *thread = (struct gl_thread_struct *)varg;
+
+ EnterCriticalSection (&thread->handle_lock);
+ /* Create a new handle for the thread only if the parent thread did not yet
+ fill in the handle. */
+ if (thread->handle == NULL)
+ thread->handle = get_current_thread_handle ();
+ LeaveCriticalSection (&thread->handle_lock);
+
+ if (self_key == (DWORD)-1)
+ init_self_key ();
+ TlsSetValue (self_key, thread);
+
+ /* Run the thread. Store the exit value if the thread was not terminated
+ otherwise. */
+ thread->result = thread->func (thread->arg);
+ return 0;
+}
+
+int
+glthread_create_func (gl_thread_t *threadp, void * (*func) (void *), void *arg)
+{
+ struct gl_thread_struct *thread =
+ (struct gl_thread_struct *) malloc (sizeof (struct gl_thread_struct));
+ if (thread == NULL)
+ return ENOMEM;
+ thread->handle = NULL;
+ InitializeCriticalSection (&thread->handle_lock);
+ thread->result = NULL; /* just to be deterministic */
+ thread->func = func;
+ thread->arg = arg;
+
+ {
+ unsigned int thread_id;
+ HANDLE thread_handle;
+
+ thread_handle = (HANDLE)
+ _beginthreadex (NULL, 100000, wrapper_func, thread, 0, &thread_id);
+ /* calls CreateThread with the same arguments */
+ if (thread_handle == NULL)
+ {
+ DeleteCriticalSection (&thread->handle_lock);
+ free (thread);
+ return EAGAIN;
+ }
+
+ EnterCriticalSection (&thread->handle_lock);
+ if (thread->handle == NULL)
+ thread->handle = thread_handle;
+ else
+ /* thread->handle was already set by the thread itself. */
+ CloseHandle (thread_handle);
+ LeaveCriticalSection (&thread->handle_lock);
+
+ *threadp = thread;
+ return 0;
+ }
+}
+
+int
+glthread_join_func (gl_thread_t thread, void **retvalp)
+{
+ if (thread == NULL)
+ return EINVAL;
+
+ if (thread == gl_thread_self ())
+ return EDEADLK;
+
+ if (WaitForSingleObject (thread->handle, INFINITE) == WAIT_FAILED)
+ return EINVAL;
+
+ if (retvalp != NULL)
+ *retvalp = thread->result;
+
+ DeleteCriticalSection (&thread->handle_lock);
+ CloseHandle (thread->handle);
+ free (thread);
+
+ return 0;
+}
+
+int
+gl_thread_exit_func (void *retval)
+{
+ gl_thread_t thread = gl_thread_self ();
+ thread->result = retval;
+ _endthreadex (0); /* calls ExitThread (0) */
+ abort ();
+}
+
+#endif
+
+/* ========================================================================= */
diff --git a/gnulib/lib/glthread/thread.h b/gnulib/lib/glthread/thread.h
new file mode 100644
index 00000000..456d3979
--- /dev/null
+++ b/gnulib/lib/glthread/thread.h
@@ -0,0 +1,376 @@
+/* Creating and controlling threads.
+ Copyright (C) 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+ gthr-win32.h. */
+
+/* This file contains primitives for creating and controlling threads.
+
+ Thread data type: gl_thread_t.
+
+ Creating a thread:
+ thread = gl_thread_create (func, arg);
+ Or with control of error handling:
+ err = glthread_create (&thread, func, arg);
+ extern int glthread_create (gl_thread_t *result,
+ void *(*func) (void *), void *arg);
+
+ Querying and changing the signal mask of a thread (not supported on all
+ platforms):
+ gl_thread_sigmask (how, newmask, oldmask);
+ Or with control of error handling:
+ err = glthread_sigmask (how, newmask, oldmask);
+ extern int glthread_sigmask (int how, const sigset_t *newmask, sigset_t *oldmask);
+
+ Waiting for termination of another thread:
+ gl_thread_join (thread, &return_value);
+ Or with control of error handling:
+ err = glthread_join (thread, &return_value);
+ extern int glthread_join (gl_thread_t thread, void **return_value_ptr);
+
+ Getting a reference to the current thread:
+ current = gl_thread_self ();
+ extern gl_thread_t gl_thread_self (void);
+
+ Terminating the current thread:
+ gl_thread_exit (return_value);
+ extern void gl_thread_exit (void *return_value) __attribute__ ((noreturn));
+
+ Requesting custom code to be executed at fork() time(not supported on all
+ platforms):
+ gl_thread_atfork (prepare_func, parent_func, child_func);
+ Or with control of error handling:
+ err = glthread_atfork (prepare_func, parent_func, child_func);
+ extern int glthread_atfork (void (*prepare_func) (void),
+ void (*parent_func) (void),
+ void (*child_func) (void));
+ Note that even on platforms where this is supported, use of fork() and
+ threads together is problematic, see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2008-08/msg00062.html>
+ */
+
+
+#ifndef _GLTHREAD_THREAD_H
+#define _GLTHREAD_THREAD_H
+
+#include <errno.h>
+#include <stdlib.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+/* Weak references avoid dragging in external libraries if the other parts
+ of the program don't use them. Here we use them, because we don't want
+ every program that uses libintl to depend on libpthread. This assumes
+ that libpthread would not be loaded after libintl; i.e. if libintl is
+ loaded first, by an executable that does not depend on libpthread, and
+ then a module is dynamically loaded that depends on libpthread, libintl
+ will not be multithread-safe. */
+
+/* The way to test at runtime whether libpthread is present is to test
+ whether a function pointer's value, such as &pthread_mutex_init, is
+ non-NULL. However, some versions of GCC have a bug through which, in
+ PIC mode, &foo != NULL always evaluates to true if there is a direct
+ call to foo(...) in the same function. To avoid this, we test the
+ address of a function in libpthread that we don't use. */
+
+# pragma weak pthread_create
+# pragma weak pthread_sigmask
+# pragma weak pthread_join
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+# pragma weak pthread_exit
+# if HAVE_PTHREAD_ATFORK
+# pragma weak pthread_atfork
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# pragma weak pthread_cancel
+# define pthread_in_use() (pthread_cancel != NULL)
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+/* This choice of gl_thread_t assumes that
+ pthread_equal (a, b) is equivalent to ((a) == (b)).
+ This is the case on all platforms in use in 2008. */
+typedef pthread_t gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) \
+ (pthread_in_use () ? pthread_create (THREADP, NULL, FUNC, ARG) : ENOSYS)
+# define glthread_sigmask(HOW, SET, OSET) \
+ (pthread_in_use () ? pthread_sigmask (HOW, SET, OSET) : 0)
+# define glthread_join(THREAD, RETVALP) \
+ (pthread_in_use () ? pthread_join (THREAD, RETVALP) : 0)
+# define gl_thread_self() \
+ (pthread_in_use () ? (void *) pthread_self () : NULL)
+# define gl_thread_exit(RETVAL) \
+ (pthread_in_use () ? pthread_exit (RETVAL) : 0)
+
+# if HAVE_PTHREAD_ATFORK
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) \
+ (pthread_in_use () ? pthread_atfork (PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) : 0)
+# else
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library. */
+
+# pragma weak pth_spawn
+# pragma weak pth_sigmask
+# pragma weak pth_join
+# pragma weak pth_self
+# pragma weak pth_exit
+
+# pragma weak pth_cancel
+# define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+# define pth_in_use() 1
+
+# endif
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+typedef pth_t gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) \
+ (pth_in_use () ? ((*(THREADP) = pth_spawn (NULL, FUNC, ARG)) ? 0 : errno) : 0)
+# define glthread_sigmask(HOW, SET, OSET) \
+ (pth_in_use () && !pth_sigmask (HOW, SET, OSET) ? errno : 0)
+# define glthread_join(THREAD, RETVALP) \
+ (pth_in_use () && !pth_join (THREAD, RETVALP) ? errno : 0)
+# define gl_thread_self() \
+ (pth_in_use () ? (void *) pth_self () : 0)
+# define gl_thread_exit(RETVAL) \
+ (pth_in_use () ? pth_exit (RETVAL) : 0)
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+# include <synch.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library. */
+
+# pragma weak thr_create
+# pragma weak thr_join
+# pragma weak thr_self
+# pragma weak thr_exit
+
+# pragma weak thr_suspend
+# define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+# define thread_in_use() 1
+
+# endif
+
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+typedef thread_t gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) \
+ (thread_in_use () ? thr_create (NULL, 0, FUNC, ARG, 0, THREADP) : 0)
+# define glthread_sigmask(HOW, SET, OSET) \
+ (thread_in_use () ? sigprocmask (HOW, SET, OSET) : 0)
+# define glthread_join(THREAD, RETVALP) \
+ (thread_in_use () ? thr_join (THREAD, NULL, RETVALP) : 0)
+# define gl_thread_self() \
+ (thread_in_use () ? (void *) thr_self () : 0)
+# define gl_thread_exit(RETVAL) \
+ (thread_in_use () ? thr_exit (RETVAL) : 0)
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+/* The gl_thread_t is a pointer to a structure in memory.
+ Why not the thread handle? If it were the thread handle, it would be hard
+ to implement gl_thread_self() (since GetCurrentThread () returns a pseudo-
+ handle, DuplicateHandle (GetCurrentThread ()) returns a handle that must be
+ closed afterwards, and there is no function for quickly retrieving a thread
+ handle from its id).
+ Why not the thread id? I tried it. It did not work: Sometimes ids appeared
+ that did not belong to running threads, and glthread_join failed with ESRCH.
+ */
+typedef struct gl_thread_struct *gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) \
+ glthread_create_func (THREADP, FUNC, ARG)
+# define glthread_sigmask(HOW, SET, OSET) \
+ /* unsupported */ 0
+# define glthread_join(THREAD, RETVALP) \
+ glthread_join_func (THREAD, RETVALP)
+# define gl_thread_self() \
+ gl_thread_self_func ()
+# define gl_thread_exit(RETVAL) \
+ gl_thread_exit_func (RETVAL)
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+extern int glthread_create_func (gl_thread_t *threadp, void * (*func) (void *), void *arg);
+extern int glthread_join_func (gl_thread_t thread, void **retvalp);
+extern gl_thread_t gl_thread_self_func (void);
+extern int gl_thread_exit_func (void *retval);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+typedef int gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) ENOSYS
+# define glthread_sigmask(HOW, SET, OSET) 0
+# define glthread_join(THREAD, RETVALP) 0
+# define gl_thread_self() NULL
+# define gl_thread_exit(RETVAL) 0
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static inline gl_thread_t
+gl_thread_create (void *(*func) (void *arg), void *arg)
+{
+ gl_thread_t thread;
+ int ret;
+
+ ret = glthread_create (&thread, func, arg);
+ if (ret != 0)
+ abort ();
+ return thread;
+}
+#define gl_thread_sigmask(HOW, SET, OSET) \
+ do \
+ { \
+ if (glthread_sigmask (HOW, SET, OSET)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_thread_join(THREAD, RETVAL) \
+ do \
+ { \
+ if (glthread_join (THREAD, RETVAL)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_thread_atfork(PREPARE, PARENT, CHILD) \
+ do \
+ { \
+ if (glthread_atfork (PREPARE, PARENT, CHILD)) \
+ abort (); \
+ } \
+ while (0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GLTHREAD_THREAD_H */
diff --git a/gnulib/lib/glthread/threadlib.c b/gnulib/lib/glthread/threadlib.c
new file mode 100644
index 00000000..26416d7d
--- /dev/null
+++ b/gnulib/lib/glthread/threadlib.c
@@ -0,0 +1,74 @@
+/* Multithreading primitives.
+ Copyright (C) 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+# include <stdlib.h>
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The function to be executed by a dummy thread. */
+static void *
+dummy_thread_func (void *arg)
+{
+ return arg;
+}
+
+int
+glthread_in_use (void)
+{
+ static int tested;
+ static int result; /* 1: linked with -lpthread, 0: only with libc */
+
+ if (!tested)
+ {
+ pthread_t thread;
+
+ if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
+ /* Thread creation failed. */
+ result = 0;
+ else
+ {
+ /* Thread creation works. */
+ void *retval;
+ if (pthread_join (thread, &retval) != 0)
+ abort ();
+ result = 1;
+ }
+ tested = 1;
+ }
+ return result;
+}
+
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
diff --git a/gnulib/lib/glthread/tls.c b/gnulib/lib/glthread/tls.c
new file mode 100644
index 00000000..6618884b
--- /dev/null
+++ b/gnulib/lib/glthread/tls.c
@@ -0,0 +1,61 @@
+/* Thread-local storage in multithreaded situations.
+ Copyright (C) 2005-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+#include "glthread/tls.h"
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+void *
+glthread_tls_get_multithreaded (thread_key_t key)
+{
+ void *value;
+
+ if (thr_getspecific (key, &value) != 0)
+ abort ();
+ return value;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+#endif
+
+/* ========================================================================= */
diff --git a/gnulib/lib/glthread/tls.h b/gnulib/lib/glthread/tls.h
new file mode 100644
index 00000000..e39623f7
--- /dev/null
+++ b/gnulib/lib/glthread/tls.h
@@ -0,0 +1,298 @@
+/* Thread-local storage in multithreaded situations.
+ Copyright (C) 2005, 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+/* This file contains thread-local storage primitives for use with a given
+ thread library. It does not contain primitives for creating threads or
+ for other multithreading primitives.
+
+ Type: gl_tls_key_t
+ Initialization: gl_tls_key_init (name, destructor);
+ Getting per-thread value: gl_tls_get (name)
+ Setting per-thread value: gl_tls_set (name, pointer);
+ De-initialization: gl_tls_key_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_tls_key_init (&name, destructor);
+ Setting per-thread value: err = glthread_tls_set (&name, pointer);
+ De-initialization: err = glthread_tls_key_destroy (&name);
+
+ A per-thread value is of type 'void *'.
+
+ A destructor is a function pointer of type 'void (*) (void *)', called
+ when a thread exits, and taking the last per-thread value as argument. It
+ is unspecified whether the destructor function is called when the last
+ per-thread value is NULL. On some platforms, the destructor function is
+ not called at all.
+*/
+
+
+#ifndef _TLS_H
+#define _TLS_H
+
+#include <errno.h>
+#include <stdlib.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+# pragma weak pthread_key_create
+# pragma weak pthread_getspecific
+# pragma weak pthread_setspecific
+# pragma weak pthread_key_delete
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# pragma weak pthread_cancel
+# define pthread_in_use() (pthread_cancel != NULL)
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef union
+ {
+ void *singlethread_value;
+ pthread_key_t key;
+ }
+ gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ (pthread_in_use () \
+ ? pthread_key_create (&(KEY)->key, DESTRUCTOR) \
+ : ((KEY)->singlethread_value = NULL, 0))
+# define gl_tls_get(NAME) \
+ (pthread_in_use () \
+ ? pthread_getspecific ((NAME).key) \
+ : (NAME).singlethread_value)
+# define glthread_tls_set(KEY, POINTER) \
+ (pthread_in_use () \
+ ? pthread_setspecific ((KEY)->key, (POINTER)) \
+ : ((KEY)->singlethread_value = (POINTER), 0))
+# define glthread_tls_key_destroy(KEY) \
+ (pthread_in_use () ? pthread_key_delete ((KEY)->key) : 0)
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library. */
+
+# pragma weak pth_key_create
+# pragma weak pth_key_getdata
+# pragma weak pth_key_setdata
+# pragma weak pth_key_delete
+
+# pragma weak pth_cancel
+# define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+# define pth_in_use() 1
+
+# endif
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef union
+ {
+ void *singlethread_value;
+ pth_key_t key;
+ }
+ gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ (pth_in_use () \
+ ? (!pth_key_create (&(KEY)->key, DESTRUCTOR) ? errno : 0) \
+ : ((KEY)->singlethread_value = NULL, 0))
+# define gl_tls_get(NAME) \
+ (pth_in_use () \
+ ? pth_key_getdata ((NAME).key) \
+ : (NAME).singlethread_value)
+# define glthread_tls_set(KEY, POINTER) \
+ (pth_in_use () \
+ ? (!pth_key_setdata ((KEY)->key, (POINTER)) ? errno : 0) \
+ : ((KEY)->singlethread_value = (POINTER), 0))
+# define glthread_tls_key_destroy(KEY) \
+ (pth_in_use () \
+ ? (!pth_key_delete ((KEY)->key) ? errno : 0) \
+ : 0)
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library. */
+
+# pragma weak thr_keycreate
+# pragma weak thr_getspecific
+# pragma weak thr_setspecific
+
+# pragma weak thr_suspend
+# define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+# define thread_in_use() 1
+
+# endif
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef union
+ {
+ void *singlethread_value;
+ thread_key_t key;
+ }
+ gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ (thread_in_use () \
+ ? thr_keycreate (&(KEY)->key, DESTRUCTOR) \
+ : ((KEY)->singlethread_value = NULL, 0))
+# define gl_tls_get(NAME) \
+ (thread_in_use () \
+ ? glthread_tls_get_multithreaded ((NAME).key) \
+ : (NAME).singlethread_value)
+extern void *glthread_tls_get_multithreaded (thread_key_t key);
+# define glthread_tls_set(KEY, POINTER) \
+ (thread_in_use () \
+ ? thr_setspecific ((KEY)->key, (POINTER)) \
+ : ((KEY)->singlethread_value = (POINTER), 0))
+# define glthread_tls_key_destroy(KEY) \
+ /* Unsupported. */ \
+ 0
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# include <windows.h>
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef DWORD gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ /* The destructor is unsupported. */ \
+ ((*(KEY) = TlsAlloc ()) == (DWORD)-1 ? EAGAIN : ((void) (DESTRUCTOR), 0))
+# define gl_tls_get(NAME) \
+ TlsGetValue (NAME)
+# define glthread_tls_set(KEY, POINTER) \
+ (!TlsSetValue (*(KEY), POINTER) ? EINVAL : 0)
+# define glthread_tls_key_destroy(KEY) \
+ (!TlsFree (*(KEY)) ? EINVAL : 0)
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef struct
+ {
+ void *singlethread_value;
+ }
+ gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ ((KEY)->singlethread_value = NULL, \
+ (void) (DESTRUCTOR), \
+ 0)
+# define gl_tls_get(NAME) \
+ (NAME).singlethread_value
+# define glthread_tls_set(KEY, POINTER) \
+ ((KEY)->singlethread_value = (POINTER), 0)
+# define glthread_tls_key_destroy(KEY) \
+ 0
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+#define gl_tls_key_init(NAME, DESTRUCTOR) \
+ do \
+ { \
+ if (glthread_tls_key_init (&NAME, DESTRUCTOR)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_tls_set(NAME, POINTER) \
+ do \
+ { \
+ if (glthread_tls_set (&NAME, POINTER)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_tls_key_destroy(NAME) \
+ do \
+ { \
+ if (glthread_tls_key_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* ========================================================================= */
+
+#endif /* _TLS_H */
diff --git a/gnulib/lib/glthread/yield.h b/gnulib/lib/glthread/yield.h
new file mode 100644
index 00000000..b2f44ac2
--- /dev/null
+++ b/gnulib/lib/glthread/yield.h
@@ -0,0 +1,121 @@
+/* Yielding the processor to other threads and processes.
+ Copyright (C) 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file contains a primitive for yielding the processor to other threads.
+ extern void gl_thread_yield (void);
+ */
+
+#ifndef _GLTHREAD_YIELD_H
+#define _GLTHREAD_YIELD_H
+
+#include <errno.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <sched.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define gl_thread_yield() \
+ sched_yield ()
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define gl_thread_yield() \
+ pth_yield (NULL)
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define gl_thread_yield() \
+ thr_yield ()
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define gl_thread_yield() \
+ Sleep (0)
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+# define gl_thread_yield() 0
+
+#endif
+
+/* ========================================================================= */
+
+#endif /* _GLTHREAD_YIELD_H */
diff --git a/gnulib/lib/group-member.c b/gnulib/lib/group-member.c
new file mode 100644
index 00000000..8aa3d8c2
--- /dev/null
+++ b/gnulib/lib/group-member.c
@@ -0,0 +1,125 @@
+/* group-member.c -- determine whether group id is in calling user's group list
+
+ Copyright (C) 1994, 1997-1998, 2003, 2005-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "group-member.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include <unistd.h>
+
+#include "xalloc.h"
+
+struct group_info
+ {
+ int n_groups;
+ gid_t *group;
+ };
+
+static void
+free_group_info (struct group_info const *g)
+{
+ free (g->group);
+}
+
+static bool
+get_group_info (struct group_info *gi)
+{
+ int n_groups;
+ int n_group_slots = getgroups (0, NULL);
+ gid_t *group;
+
+ if (n_group_slots < 0)
+ return false;
+
+ /* Avoid xnmalloc, as it goes awry when SIZE_MAX < n_group_slots. */
+ if (xalloc_oversized (n_group_slots, sizeof *group))
+ xalloc_die ();
+ group = xmalloc (n_group_slots * sizeof *group);
+ n_groups = getgroups (n_group_slots, group);
+
+ /* In case of error, the user loses. */
+ if (n_groups < 0)
+ {
+ free (group);
+ return false;
+ }
+
+ gi->n_groups = n_groups;
+ gi->group = group;
+
+ return true;
+}
+
+/* Return non-zero if GID is one that we have in our groups list.
+ Note that the groups list is not guaranteed to contain the current
+ or effective group ID, so they should generally be checked
+ separately. */
+
+int
+group_member (gid_t gid)
+{
+ int i;
+ int found;
+ struct group_info gi;
+
+ if (! get_group_info (&gi))
+ return 0;
+
+ /* Search through the list looking for GID. */
+ found = 0;
+ for (i = 0; i < gi.n_groups; i++)
+ {
+ if (gid == gi.group[i])
+ {
+ found = 1;
+ break;
+ }
+ }
+
+ free_group_info (&gi);
+
+ return found;
+}
+
+#ifdef TEST
+
+char *program_name;
+
+int
+main (int argc, char **argv)
+{
+ int i;
+
+ program_name = argv[0];
+
+ for (i = 1; i < argc; i++)
+ {
+ gid_t gid;
+
+ gid = atoi (argv[i]);
+ printf ("%d: %s\n", gid, group_member (gid) ? "yes" : "no");
+ }
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/group-member.h b/gnulib/lib/group-member.h
new file mode 100644
index 00000000..8f7cd4ce
--- /dev/null
+++ b/gnulib/lib/group-member.h
@@ -0,0 +1,25 @@
+/* Determine whether group id is in calling user's group list.
+
+ Copyright (C) 1994, 1997, 2003, 2009-2010 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/>. */
+
+#ifndef GROUP_MEMBER_H_
+# define GROUP_MEMBER_H_ 1
+
+# include <sys/types.h>
+
+int group_member (gid_t);
+
+#endif /* GROUP_MEMBER_H_ */
diff --git a/gnulib/lib/hard-locale.c b/gnulib/lib/hard-locale.c
new file mode 100644
index 00000000..c868ac0f
--- /dev/null
+++ b/gnulib/lib/hard-locale.c
@@ -0,0 +1,70 @@
+/* hard-locale.c -- Determine whether a locale is hard.
+
+ Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004, 2006, 2007, 2009, 2010
+ 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/>. */
+
+#include <config.h>
+
+#include "hard-locale.h"
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __GLIBC__
+# define GLIBC_VERSION __GLIBC__
+#else
+# define GLIBC_VERSION 0
+#endif
+
+/* Return true if the current CATEGORY locale is hard, i.e. if you
+ can't get away with assuming traditional C or POSIX behavior. */
+bool
+hard_locale (int category)
+{
+ bool hard = true;
+ char const *p = setlocale (category, NULL);
+
+ if (p)
+ {
+ if (2 <= GLIBC_VERSION)
+ {
+ if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0)
+ hard = false;
+ }
+ else
+ {
+ char *locale = strdup (p);
+ if (locale)
+ {
+ /* Temporarily set the locale to the "C" and "POSIX" locales
+ to find their names, so that we can determine whether one
+ or the other is the caller's locale. */
+ if (((p = setlocale (category, "C"))
+ && strcmp (p, locale) == 0)
+ || ((p = setlocale (category, "POSIX"))
+ && strcmp (p, locale) == 0))
+ hard = false;
+
+ /* Restore the caller's locale. */
+ setlocale (category, locale);
+ free (locale);
+ }
+ }
+ }
+
+ return hard;
+}
diff --git a/gnulib/lib/hard-locale.h b/gnulib/lib/hard-locale.h
new file mode 100644
index 00000000..a1ce5bfb
--- /dev/null
+++ b/gnulib/lib/hard-locale.h
@@ -0,0 +1,25 @@
+/* Determine whether a locale is hard.
+
+ Copyright (C) 1999, 2003, 2004, 2009, 2010 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/>. */
+
+#ifndef HARD_LOCALE_H_
+# define HARD_LOCALE_H_ 1
+
+# include <stdbool.h>
+
+bool hard_locale (int);
+
+#endif /* HARD_LOCALE_H_ */
diff --git a/gnulib/lib/hash-pjw.c b/gnulib/lib/hash-pjw.c
new file mode 100644
index 00000000..6ca57e98
--- /dev/null
+++ b/gnulib/lib/hash-pjw.c
@@ -0,0 +1,40 @@
+/* hash-pjw.c -- compute a hash value from a NUL-terminated string.
+
+ Copyright (C) 2001, 2003, 2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "hash-pjw.h"
+
+#include <limits.h>
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+
+size_t
+hash_pjw (const void *x, size_t tablesize)
+{
+ const char *s;
+ size_t h = 0;
+
+ for (s = x; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h % tablesize;
+}
diff --git a/gnulib/lib/hash-pjw.h b/gnulib/lib/hash-pjw.h
new file mode 100644
index 00000000..35b5432d
--- /dev/null
+++ b/gnulib/lib/hash-pjw.h
@@ -0,0 +1,23 @@
+/* hash-pjw.h -- declaration for a simple hash function
+ Copyright (C) 2001, 2003, 2009-2010 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/>. */
+
+#include <stddef.h>
+
+/* Compute a hash code for a NUL-terminated string starting at X,
+ and return the hash code modulo TABLESIZE.
+ The result is platform dependent: it depends on the size of the 'size_t'
+ type and on the signedness of the 'char' type. */
+extern size_t hash_pjw (void const *x, size_t tablesize);
diff --git a/gnulib/lib/hash-triple.c b/gnulib/lib/hash-triple.c
new file mode 100644
index 00000000..42053762
--- /dev/null
+++ b/gnulib/lib/hash-triple.c
@@ -0,0 +1,77 @@
+/* Hash functions for file-related triples: name, device, inode.
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "hash-triple.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "hash-pjw.h"
+#include "same.h"
+#include "same-inode.h"
+
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+/* Hash an F_triple, and *do* consider the file name. */
+size_t
+triple_hash (void const *x, size_t table_size)
+{
+ struct F_triple const *p = x;
+ size_t tmp = hash_pjw (p->name, table_size);
+
+ /* Ignoring the device number here should be fine. */
+ return (tmp ^ p->st_ino) % table_size;
+}
+
+/* Hash an F_triple, without considering the file name. */
+size_t
+triple_hash_no_name (void const *x, size_t table_size)
+{
+ struct F_triple const *p = x;
+
+ /* Ignoring the device number here should be fine. */
+ return p->st_ino % table_size;
+}
+
+/* Compare two F_triple structs. */
+bool
+triple_compare (void const *x, void const *y)
+{
+ struct F_triple const *a = x;
+ struct F_triple const *b = y;
+ return (SAME_INODE (*a, *b) && same_name (a->name, b->name)) ? true : false;
+}
+
+bool
+triple_compare_ino_str (void const *x, void const *y)
+{
+ struct F_triple const *a = x;
+ struct F_triple const *b = y;
+ return (SAME_INODE (*a, *b) && STREQ (a->name, b->name)) ? true : false;
+}
+
+/* Free an F_triple. */
+void
+triple_free (void *x)
+{
+ struct F_triple *a = x;
+ free (a->name);
+ free (a);
+}
diff --git a/gnulib/lib/hash-triple.h b/gnulib/lib/hash-triple.h
new file mode 100644
index 00000000..51863c9d
--- /dev/null
+++ b/gnulib/lib/hash-triple.h
@@ -0,0 +1,22 @@
+#ifndef HASH_TRIPLE_H
+#define HASH_TRIPLE_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+
+/* Describe a just-created or just-renamed destination file. */
+struct F_triple
+{
+ char *name;
+ ino_t st_ino;
+ dev_t st_dev;
+};
+
+extern size_t triple_hash (void const *x, size_t table_size);
+extern size_t triple_hash_no_name (void const *x, size_t table_size);
+extern bool triple_compare (void const *x, void const *y);
+extern bool triple_compare_ino_str (void const *x, void const *y);
+extern void triple_free (void *x);
+
+#endif
diff --git a/gnulib/lib/hash.c b/gnulib/lib/hash.c
new file mode 100644
index 00000000..f9abb9fd
--- /dev/null
+++ b/gnulib/lib/hash.c
@@ -0,0 +1,1194 @@
+/* hash - hashing table processing.
+
+ Copyright (C) 1998-2004, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ Written by Jim Meyering, 1992.
+
+ 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/>. */
+
+/* A generic hash table package. */
+
+/* Define USE_OBSTACK to 1 if you want the allocator to use obstacks instead
+ of malloc. If you change USE_OBSTACK, you have to recompile! */
+
+#include <config.h>
+
+#include "hash.h"
+
+#include "bitrotate.h"
+#include "xalloc.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if USE_OBSTACK
+# include "obstack.h"
+# ifndef obstack_chunk_alloc
+# define obstack_chunk_alloc malloc
+# endif
+# ifndef obstack_chunk_free
+# define obstack_chunk_free free
+# endif
+#endif
+
+struct hash_entry
+ {
+ void *data;
+ struct hash_entry *next;
+ };
+
+struct hash_table
+ {
+ /* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1,
+ for a possibility of N_BUCKETS. Among those, N_BUCKETS_USED buckets
+ are not empty, there are N_ENTRIES active entries in the table. */
+ struct hash_entry *bucket;
+ struct hash_entry const *bucket_limit;
+ size_t n_buckets;
+ size_t n_buckets_used;
+ size_t n_entries;
+
+ /* Tuning arguments, kept in a physically separate structure. */
+ const Hash_tuning *tuning;
+
+ /* Three functions are given to `hash_initialize', see the documentation
+ block for this function. In a word, HASHER randomizes a user entry
+ into a number up from 0 up to some maximum minus 1; COMPARATOR returns
+ true if two user entries compare equally; and DATA_FREER is the cleanup
+ function for a user entry. */
+ Hash_hasher hasher;
+ Hash_comparator comparator;
+ Hash_data_freer data_freer;
+
+ /* A linked list of freed struct hash_entry structs. */
+ struct hash_entry *free_entry_list;
+
+#if USE_OBSTACK
+ /* Whenever obstacks are used, it is possible to allocate all overflowed
+ entries into a single stack, so they all can be freed in a single
+ operation. It is not clear if the speedup is worth the trouble. */
+ struct obstack entry_stack;
+#endif
+ };
+
+/* A hash table contains many internal entries, each holding a pointer to
+ some user-provided data (also called a user entry). An entry indistinctly
+ refers to both the internal entry and its associated user entry. A user
+ entry contents may be hashed by a randomization function (the hashing
+ function, or just `hasher' for short) into a number (or `slot') between 0
+ and the current table size. At each slot position in the hash table,
+ starts a linked chain of entries for which the user data all hash to this
+ slot. A bucket is the collection of all entries hashing to the same slot.
+
+ A good `hasher' function will distribute entries rather evenly in buckets.
+ In the ideal case, the length of each bucket is roughly the number of
+ entries divided by the table size. Finding the slot for a data is usually
+ done in constant time by the `hasher', and the later finding of a precise
+ entry is linear in time with the size of the bucket. Consequently, a
+ larger hash table size (that is, a larger number of buckets) is prone to
+ yielding shorter chains, *given* the `hasher' function behaves properly.
+
+ Long buckets slow down the lookup algorithm. One might use big hash table
+ sizes in hope to reduce the average length of buckets, but this might
+ become inordinate, as unused slots in the hash table take some space. The
+ best bet is to make sure you are using a good `hasher' function (beware
+ that those are not that easy to write! :-), and to use a table size
+ larger than the actual number of entries. */
+
+/* If an insertion makes the ratio of nonempty buckets to table size larger
+ than the growth threshold (a number between 0.0 and 1.0), then increase
+ the table size by multiplying by the growth factor (a number greater than
+ 1.0). The growth threshold defaults to 0.8, and the growth factor
+ defaults to 1.414, meaning that the table will have doubled its size
+ every second time 80% of the buckets get used. */
+#define DEFAULT_GROWTH_THRESHOLD 0.8
+#define DEFAULT_GROWTH_FACTOR 1.414
+
+/* If a deletion empties a bucket and causes the ratio of used buckets to
+ table size to become smaller than the shrink threshold (a number between
+ 0.0 and 1.0), then shrink the table by multiplying by the shrink factor (a
+ number greater than the shrink threshold but smaller than 1.0). The shrink
+ threshold and factor default to 0.0 and 1.0, meaning that the table never
+ shrinks. */
+#define DEFAULT_SHRINK_THRESHOLD 0.0
+#define DEFAULT_SHRINK_FACTOR 1.0
+
+/* Use this to initialize or reset a TUNING structure to
+ some sensible values. */
+static const Hash_tuning default_tuning =
+ {
+ DEFAULT_SHRINK_THRESHOLD,
+ DEFAULT_SHRINK_FACTOR,
+ DEFAULT_GROWTH_THRESHOLD,
+ DEFAULT_GROWTH_FACTOR,
+ false
+ };
+
+/* Information and lookup. */
+
+/* The following few functions provide information about the overall hash
+ table organization: the number of entries, number of buckets and maximum
+ length of buckets. */
+
+/* Return the number of buckets in the hash table. The table size, the total
+ number of buckets (used plus unused), or the maximum number of slots, are
+ the same quantity. */
+
+size_t
+hash_get_n_buckets (const Hash_table *table)
+{
+ return table->n_buckets;
+}
+
+/* Return the number of slots in use (non-empty buckets). */
+
+size_t
+hash_get_n_buckets_used (const Hash_table *table)
+{
+ return table->n_buckets_used;
+}
+
+/* Return the number of active entries. */
+
+size_t
+hash_get_n_entries (const Hash_table *table)
+{
+ return table->n_entries;
+}
+
+/* Return the length of the longest chain (bucket). */
+
+size_t
+hash_get_max_bucket_length (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+ size_t max_bucket_length = 0;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry const *cursor = bucket;
+ size_t bucket_length = 1;
+
+ while (cursor = cursor->next, cursor)
+ bucket_length++;
+
+ if (bucket_length > max_bucket_length)
+ max_bucket_length = bucket_length;
+ }
+ }
+
+ return max_bucket_length;
+}
+
+/* Do a mild validation of a hash table, by traversing it and checking two
+ statistics. */
+
+bool
+hash_table_ok (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+ size_t n_buckets_used = 0;
+ size_t n_entries = 0;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry const *cursor = bucket;
+
+ /* Count bucket head. */
+ n_buckets_used++;
+ n_entries++;
+
+ /* Count bucket overflow. */
+ while (cursor = cursor->next, cursor)
+ n_entries++;
+ }
+ }
+
+ if (n_buckets_used == table->n_buckets_used && n_entries == table->n_entries)
+ return true;
+
+ return false;
+}
+
+void
+hash_print_statistics (const Hash_table *table, FILE *stream)
+{
+ size_t n_entries = hash_get_n_entries (table);
+ size_t n_buckets = hash_get_n_buckets (table);
+ size_t n_buckets_used = hash_get_n_buckets_used (table);
+ size_t max_bucket_length = hash_get_max_bucket_length (table);
+
+ fprintf (stream, "# entries: %lu\n", (unsigned long int) n_entries);
+ fprintf (stream, "# buckets: %lu\n", (unsigned long int) n_buckets);
+ fprintf (stream, "# buckets used: %lu (%.2f%%)\n",
+ (unsigned long int) n_buckets_used,
+ (100.0 * n_buckets_used) / n_buckets);
+ fprintf (stream, "max bucket length: %lu\n",
+ (unsigned long int) max_bucket_length);
+}
+
+/* If ENTRY matches an entry already in the hash table, return the
+ entry from the table. Otherwise, return NULL. */
+
+void *
+hash_lookup (const Hash_table *table, const void *entry)
+{
+ struct hash_entry const *bucket
+ = table->bucket + table->hasher (entry, table->n_buckets);
+ struct hash_entry const *cursor;
+
+ if (! (bucket < table->bucket_limit))
+ abort ();
+
+ if (bucket->data == NULL)
+ return NULL;
+
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ if (entry == cursor->data || table->comparator (entry, cursor->data))
+ return cursor->data;
+
+ return NULL;
+}
+
+/* Walking. */
+
+/* The functions in this page traverse the hash table and process the
+ contained entries. For the traversal to work properly, the hash table
+ should not be resized nor modified while any particular entry is being
+ processed. In particular, entries should not be added, and an entry
+ may be removed only if there is no shrink threshold and the entry being
+ removed has already been passed to hash_get_next. */
+
+/* Return the first data in the table, or NULL if the table is empty. */
+
+void *
+hash_get_first (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+
+ if (table->n_entries == 0)
+ return NULL;
+
+ for (bucket = table->bucket; ; bucket++)
+ if (! (bucket < table->bucket_limit))
+ abort ();
+ else if (bucket->data)
+ return bucket->data;
+}
+
+/* Return the user data for the entry following ENTRY, where ENTRY has been
+ returned by a previous call to either `hash_get_first' or `hash_get_next'.
+ Return NULL if there are no more entries. */
+
+void *
+hash_get_next (const Hash_table *table, const void *entry)
+{
+ struct hash_entry const *bucket
+ = table->bucket + table->hasher (entry, table->n_buckets);
+ struct hash_entry const *cursor;
+
+ if (! (bucket < table->bucket_limit))
+ abort ();
+
+ /* Find next entry in the same bucket. */
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ if (cursor->data == entry && cursor->next)
+ return cursor->next->data;
+
+ /* Find first entry in any subsequent bucket. */
+ while (++bucket < table->bucket_limit)
+ if (bucket->data)
+ return bucket->data;
+
+ /* None found. */
+ return NULL;
+}
+
+/* Fill BUFFER with pointers to active user entries in the hash table, then
+ return the number of pointers copied. Do not copy more than BUFFER_SIZE
+ pointers. */
+
+size_t
+hash_get_entries (const Hash_table *table, void **buffer,
+ size_t buffer_size)
+{
+ size_t counter = 0;
+ struct hash_entry const *bucket;
+ struct hash_entry const *cursor;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ if (counter >= buffer_size)
+ return counter;
+ buffer[counter++] = cursor->data;
+ }
+ }
+ }
+
+ return counter;
+}
+
+/* Call a PROCESSOR function for each entry of a hash table, and return the
+ number of entries for which the processor function returned success. A
+ pointer to some PROCESSOR_DATA which will be made available to each call to
+ the processor function. The PROCESSOR accepts two arguments: the first is
+ the user entry being walked into, the second is the value of PROCESSOR_DATA
+ as received. The walking continue for as long as the PROCESSOR function
+ returns nonzero. When it returns zero, the walking is interrupted. */
+
+size_t
+hash_do_for_each (const Hash_table *table, Hash_processor processor,
+ void *processor_data)
+{
+ size_t counter = 0;
+ struct hash_entry const *bucket;
+ struct hash_entry const *cursor;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ if (! processor (cursor->data, processor_data))
+ return counter;
+ counter++;
+ }
+ }
+ }
+
+ return counter;
+}
+
+/* Allocation and clean-up. */
+
+/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
+ This is a convenience routine for constructing other hashing functions. */
+
+#if USE_DIFF_HASH
+
+/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
+ B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
+ Software--practice & experience 20, 2 (Feb 1990), 209-224. Good hash
+ algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
+ may not be good for your application." */
+
+size_t
+hash_string (const char *string, size_t n_buckets)
+{
+# define HASH_ONE_CHAR(Value, Byte) \
+ ((Byte) + rotl_sz (Value, 7))
+
+ size_t value = 0;
+ unsigned char ch;
+
+ for (; (ch = *string); string++)
+ value = HASH_ONE_CHAR (value, ch);
+ return value % n_buckets;
+
+# undef HASH_ONE_CHAR
+}
+
+#else /* not USE_DIFF_HASH */
+
+/* This one comes from `recode', and performs a bit better than the above as
+ per a few experiments. It is inspired from a hashing routine found in the
+ very old Cyber `snoop', itself written in typical Greg Mansfield style.
+ (By the way, what happened to this excellent man? Is he still alive?) */
+
+size_t
+hash_string (const char *string, size_t n_buckets)
+{
+ size_t value = 0;
+ unsigned char ch;
+
+ for (; (ch = *string); string++)
+ value = (value * 31 + ch) % n_buckets;
+ return value;
+}
+
+#endif /* not USE_DIFF_HASH */
+
+/* Return true if CANDIDATE is a prime number. CANDIDATE should be an odd
+ number at least equal to 11. */
+
+static bool
+is_prime (size_t candidate)
+{
+ size_t divisor = 3;
+ size_t square = divisor * divisor;
+
+ while (square < candidate && (candidate % divisor))
+ {
+ divisor++;
+ square += 4 * divisor;
+ divisor++;
+ }
+
+ return (candidate % divisor ? true : false);
+}
+
+/* Round a given CANDIDATE number up to the nearest prime, and return that
+ prime. Primes lower than 10 are merely skipped. */
+
+static size_t
+next_prime (size_t candidate)
+{
+ /* Skip small primes. */
+ if (candidate < 10)
+ candidate = 10;
+
+ /* Make it definitely odd. */
+ candidate |= 1;
+
+ while (SIZE_MAX != candidate && !is_prime (candidate))
+ candidate += 2;
+
+ return candidate;
+}
+
+void
+hash_reset_tuning (Hash_tuning *tuning)
+{
+ *tuning = default_tuning;
+}
+
+/* If the user passes a NULL hasher, we hash the raw pointer. */
+static size_t
+raw_hasher (const void *data, size_t n)
+{
+ /* When hashing unique pointers, it is often the case that they were
+ generated by malloc and thus have the property that the low-order
+ bits are 0. As this tends to give poorer performance with small
+ tables, we rotate the pointer value before performing division,
+ in an attempt to improve hash quality. */
+ size_t val = rotr_sz ((size_t) data, 3);
+ return val % n;
+}
+
+/* If the user passes a NULL comparator, we use pointer comparison. */
+static bool
+raw_comparator (const void *a, const void *b)
+{
+ return a == b;
+}
+
+
+/* For the given hash TABLE, check the user supplied tuning structure for
+ reasonable values, and return true if there is no gross error with it.
+ Otherwise, definitively reset the TUNING field to some acceptable default
+ in the hash table (that is, the user loses the right of further modifying
+ tuning arguments), and return false. */
+
+static bool
+check_tuning (Hash_table *table)
+{
+ const Hash_tuning *tuning = table->tuning;
+ float epsilon;
+ if (tuning == &default_tuning)
+ return true;
+
+ /* Be a bit stricter than mathematics would require, so that
+ rounding errors in size calculations do not cause allocations to
+ fail to grow or shrink as they should. The smallest allocation
+ is 11 (due to next_prime's algorithm), so an epsilon of 0.1
+ should be good enough. */
+ epsilon = 0.1f;
+
+ if (epsilon < tuning->growth_threshold
+ && tuning->growth_threshold < 1 - epsilon
+ && 1 + epsilon < tuning->growth_factor
+ && 0 <= tuning->shrink_threshold
+ && tuning->shrink_threshold + epsilon < tuning->shrink_factor
+ && tuning->shrink_factor <= 1
+ && tuning->shrink_threshold + epsilon < tuning->growth_threshold)
+ return true;
+
+ table->tuning = &default_tuning;
+ return false;
+}
+
+/* Compute the size of the bucket array for the given CANDIDATE and
+ TUNING, or return 0 if there is no possible way to allocate that
+ many entries. */
+
+static size_t
+compute_bucket_size (size_t candidate, const Hash_tuning *tuning)
+{
+ if (!tuning->is_n_buckets)
+ {
+ float new_candidate = candidate / tuning->growth_threshold;
+ if (SIZE_MAX <= new_candidate)
+ return 0;
+ candidate = new_candidate;
+ }
+ candidate = next_prime (candidate);
+ if (xalloc_oversized (candidate, sizeof (struct hash_entry *)))
+ return 0;
+ return candidate;
+}
+
+/* Allocate and return a new hash table, or NULL upon failure. The initial
+ number of buckets is automatically selected so as to _guarantee_ that you
+ may insert at least CANDIDATE different user entries before any growth of
+ the hash table size occurs. So, if have a reasonably tight a-priori upper
+ bound on the number of entries you intend to insert in the hash table, you
+ may save some table memory and insertion time, by specifying it here. If
+ the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE
+ argument has its meaning changed to the wanted number of buckets.
+
+ TUNING points to a structure of user-supplied values, in case some fine
+ tuning is wanted over the default behavior of the hasher. If TUNING is
+ NULL, the default tuning parameters are used instead. If TUNING is
+ provided but the values requested are out of bounds or might cause
+ rounding errors, return NULL.
+
+ The user-supplied HASHER function, when not NULL, accepts two
+ arguments ENTRY and TABLE_SIZE. It computes, by hashing ENTRY contents, a
+ slot number for that entry which should be in the range 0..TABLE_SIZE-1.
+ This slot number is then returned.
+
+ The user-supplied COMPARATOR function, when not NULL, accepts two
+ arguments pointing to user data, it then returns true for a pair of entries
+ that compare equal, or false otherwise. This function is internally called
+ on entries which are already known to hash to the same bucket index,
+ but which are distinct pointers.
+
+ The user-supplied DATA_FREER function, when not NULL, may be later called
+ with the user data as an argument, just before the entry containing the
+ data gets freed. This happens from within `hash_free' or `hash_clear'.
+ You should specify this function only if you want these functions to free
+ all of your `data' data. This is typically the case when your data is
+ simply an auxiliary struct that you have malloc'd to aggregate several
+ values. */
+
+Hash_table *
+hash_initialize (size_t candidate, const Hash_tuning *tuning,
+ Hash_hasher hasher, Hash_comparator comparator,
+ Hash_data_freer data_freer)
+{
+ Hash_table *table;
+
+ if (hasher == NULL)
+ hasher = raw_hasher;
+ if (comparator == NULL)
+ comparator = raw_comparator;
+
+ table = malloc (sizeof *table);
+ if (table == NULL)
+ return NULL;
+
+ if (!tuning)
+ tuning = &default_tuning;
+ table->tuning = tuning;
+ if (!check_tuning (table))
+ {
+ /* Fail if the tuning options are invalid. This is the only occasion
+ when the user gets some feedback about it. Once the table is created,
+ if the user provides invalid tuning options, we silently revert to
+ using the defaults, and ignore further request to change the tuning
+ options. */
+ goto fail;
+ }
+
+ table->n_buckets = compute_bucket_size (candidate, tuning);
+ if (!table->n_buckets)
+ goto fail;
+
+ table->bucket = calloc (table->n_buckets, sizeof *table->bucket);
+ if (table->bucket == NULL)
+ goto fail;
+ table->bucket_limit = table->bucket + table->n_buckets;
+ table->n_buckets_used = 0;
+ table->n_entries = 0;
+
+ table->hasher = hasher;
+ table->comparator = comparator;
+ table->data_freer = data_freer;
+
+ table->free_entry_list = NULL;
+#if USE_OBSTACK
+ obstack_init (&table->entry_stack);
+#endif
+ return table;
+
+ fail:
+ free (table);
+ return NULL;
+}
+
+/* Make all buckets empty, placing any chained entries on the free list.
+ Apply the user-specified function data_freer (if any) to the datas of any
+ affected entries. */
+
+void
+hash_clear (Hash_table *table)
+{
+ struct hash_entry *bucket;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+
+ /* Free the bucket overflow. */
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ if (table->data_freer)
+ table->data_freer (cursor->data);
+ cursor->data = NULL;
+
+ next = cursor->next;
+ /* Relinking is done one entry at a time, as it is to be expected
+ that overflows are either rare or short. */
+ cursor->next = table->free_entry_list;
+ table->free_entry_list = cursor;
+ }
+
+ /* Free the bucket head. */
+ if (table->data_freer)
+ table->data_freer (bucket->data);
+ bucket->data = NULL;
+ bucket->next = NULL;
+ }
+ }
+
+ table->n_buckets_used = 0;
+ table->n_entries = 0;
+}
+
+/* Reclaim all storage associated with a hash table. If a data_freer
+ function has been supplied by the user when the hash table was created,
+ this function applies it to the data of each entry before freeing that
+ entry. */
+
+void
+hash_free (Hash_table *table)
+{
+ struct hash_entry *bucket;
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+
+ /* Call the user data_freer function. */
+ if (table->data_freer && table->n_entries)
+ {
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ table->data_freer (cursor->data);
+ }
+ }
+ }
+
+#if USE_OBSTACK
+
+ obstack_free (&table->entry_stack, NULL);
+
+#else
+
+ /* Free all bucket overflowed entries. */
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ next = cursor->next;
+ free (cursor);
+ }
+ }
+
+ /* Also reclaim the internal list of previously freed entries. */
+ for (cursor = table->free_entry_list; cursor; cursor = next)
+ {
+ next = cursor->next;
+ free (cursor);
+ }
+
+#endif
+
+ /* Free the remainder of the hash table structure. */
+ free (table->bucket);
+ free (table);
+}
+
+/* Insertion and deletion. */
+
+/* Get a new hash entry for a bucket overflow, possibly by recycling a
+ previously freed one. If this is not possible, allocate a new one. */
+
+static struct hash_entry *
+allocate_entry (Hash_table *table)
+{
+ struct hash_entry *new;
+
+ if (table->free_entry_list)
+ {
+ new = table->free_entry_list;
+ table->free_entry_list = new->next;
+ }
+ else
+ {
+#if USE_OBSTACK
+ new = obstack_alloc (&table->entry_stack, sizeof *new);
+#else
+ new = malloc (sizeof *new);
+#endif
+ }
+
+ return new;
+}
+
+/* Free a hash entry which was part of some bucket overflow,
+ saving it for later recycling. */
+
+static void
+free_entry (Hash_table *table, struct hash_entry *entry)
+{
+ entry->data = NULL;
+ entry->next = table->free_entry_list;
+ table->free_entry_list = entry;
+}
+
+/* This private function is used to help with insertion and deletion. When
+ ENTRY matches an entry in the table, return a pointer to the corresponding
+ user data and set *BUCKET_HEAD to the head of the selected bucket.
+ Otherwise, return NULL. When DELETE is true and ENTRY matches an entry in
+ the table, unlink the matching entry. */
+
+static void *
+hash_find_entry (Hash_table *table, const void *entry,
+ struct hash_entry **bucket_head, bool delete)
+{
+ struct hash_entry *bucket
+ = table->bucket + table->hasher (entry, table->n_buckets);
+ struct hash_entry *cursor;
+
+ if (! (bucket < table->bucket_limit))
+ abort ();
+
+ *bucket_head = bucket;
+
+ /* Test for empty bucket. */
+ if (bucket->data == NULL)
+ return NULL;
+
+ /* See if the entry is the first in the bucket. */
+ if (entry == bucket->data || table->comparator (entry, bucket->data))
+ {
+ void *data = bucket->data;
+
+ if (delete)
+ {
+ if (bucket->next)
+ {
+ struct hash_entry *next = bucket->next;
+
+ /* Bump the first overflow entry into the bucket head, then save
+ the previous first overflow entry for later recycling. */
+ *bucket = *next;
+ free_entry (table, next);
+ }
+ else
+ {
+ bucket->data = NULL;
+ }
+ }
+
+ return data;
+ }
+
+ /* Scan the bucket overflow. */
+ for (cursor = bucket; cursor->next; cursor = cursor->next)
+ {
+ if (entry == cursor->next->data
+ || table->comparator (entry, cursor->next->data))
+ {
+ void *data = cursor->next->data;
+
+ if (delete)
+ {
+ struct hash_entry *next = cursor->next;
+
+ /* Unlink the entry to delete, then save the freed entry for later
+ recycling. */
+ cursor->next = next->next;
+ free_entry (table, next);
+ }
+
+ return data;
+ }
+ }
+
+ /* No entry found. */
+ return NULL;
+}
+
+/* Internal helper, to move entries from SRC to DST. Both tables must
+ share the same free entry list. If SAFE, only move overflow
+ entries, saving bucket heads for later, so that no allocations will
+ occur. Return false if the free entry list is exhausted and an
+ allocation fails. */
+
+static bool
+transfer_entries (Hash_table *dst, Hash_table *src, bool safe)
+{
+ struct hash_entry *bucket;
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+ for (bucket = src->bucket; bucket < src->bucket_limit; bucket++)
+ if (bucket->data)
+ {
+ void *data;
+ struct hash_entry *new_bucket;
+
+ /* Within each bucket, transfer overflow entries first and
+ then the bucket head, to minimize memory pressure. After
+ all, the only time we might allocate is when moving the
+ bucket head, but moving overflow entries first may create
+ free entries that can be recycled by the time we finally
+ get to the bucket head. */
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ data = cursor->data;
+ new_bucket = (dst->bucket + dst->hasher (data, dst->n_buckets));
+
+ if (! (new_bucket < dst->bucket_limit))
+ abort ();
+
+ next = cursor->next;
+
+ if (new_bucket->data)
+ {
+ /* Merely relink an existing entry, when moving from a
+ bucket overflow into a bucket overflow. */
+ cursor->next = new_bucket->next;
+ new_bucket->next = cursor;
+ }
+ else
+ {
+ /* Free an existing entry, when moving from a bucket
+ overflow into a bucket header. */
+ new_bucket->data = data;
+ dst->n_buckets_used++;
+ free_entry (dst, cursor);
+ }
+ }
+ /* Now move the bucket head. Be sure that if we fail due to
+ allocation failure that the src table is in a consistent
+ state. */
+ data = bucket->data;
+ bucket->next = NULL;
+ if (safe)
+ continue;
+ new_bucket = (dst->bucket + dst->hasher (data, dst->n_buckets));
+
+ if (! (new_bucket < dst->bucket_limit))
+ abort ();
+
+ if (new_bucket->data)
+ {
+ /* Allocate or recycle an entry, when moving from a bucket
+ header into a bucket overflow. */
+ struct hash_entry *new_entry = allocate_entry (dst);
+
+ if (new_entry == NULL)
+ return false;
+
+ new_entry->data = data;
+ new_entry->next = new_bucket->next;
+ new_bucket->next = new_entry;
+ }
+ else
+ {
+ /* Move from one bucket header to another. */
+ new_bucket->data = data;
+ dst->n_buckets_used++;
+ }
+ bucket->data = NULL;
+ src->n_buckets_used--;
+ }
+ return true;
+}
+
+/* For an already existing hash table, change the number of buckets through
+ specifying CANDIDATE. The contents of the hash table are preserved. The
+ new number of buckets is automatically selected so as to _guarantee_ that
+ the table may receive at least CANDIDATE different user entries, including
+ those already in the table, before any other growth of the hash table size
+ occurs. If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the
+ exact number of buckets desired. Return true iff the rehash succeeded. */
+
+bool
+hash_rehash (Hash_table *table, size_t candidate)
+{
+ Hash_table storage;
+ Hash_table *new_table;
+ size_t new_size = compute_bucket_size (candidate, table->tuning);
+
+ if (!new_size)
+ return false;
+ if (new_size == table->n_buckets)
+ return true;
+ new_table = &storage;
+ new_table->bucket = calloc (new_size, sizeof *new_table->bucket);
+ if (new_table->bucket == NULL)
+ return false;
+ new_table->n_buckets = new_size;
+ new_table->bucket_limit = new_table->bucket + new_size;
+ new_table->n_buckets_used = 0;
+ new_table->n_entries = 0;
+ new_table->tuning = table->tuning;
+ new_table->hasher = table->hasher;
+ new_table->comparator = table->comparator;
+ new_table->data_freer = table->data_freer;
+
+ /* In order for the transfer to successfully complete, we need
+ additional overflow entries when distinct buckets in the old
+ table collide into a common bucket in the new table. The worst
+ case possible is a hasher that gives a good spread with the old
+ size, but returns a constant with the new size; if we were to
+ guarantee table->n_buckets_used-1 free entries in advance, then
+ the transfer would be guaranteed to not allocate memory.
+ However, for large tables, a guarantee of no further allocation
+ introduces a lot of extra memory pressure, all for an unlikely
+ corner case (most rehashes reduce, rather than increase, the
+ number of overflow entries needed). So, we instead ensure that
+ the transfer process can be reversed if we hit a memory
+ allocation failure mid-transfer. */
+
+ /* Merely reuse the extra old space into the new table. */
+#if USE_OBSTACK
+ new_table->entry_stack = table->entry_stack;
+#endif
+ new_table->free_entry_list = table->free_entry_list;
+
+ if (transfer_entries (new_table, table, false))
+ {
+ /* Entries transferred successfully; tie up the loose ends. */
+ free (table->bucket);
+ table->bucket = new_table->bucket;
+ table->bucket_limit = new_table->bucket_limit;
+ table->n_buckets = new_table->n_buckets;
+ table->n_buckets_used = new_table->n_buckets_used;
+ table->free_entry_list = new_table->free_entry_list;
+ /* table->n_entries and table->entry_stack already hold their value. */
+ return true;
+ }
+
+ /* We've allocated new_table->bucket (and possibly some entries),
+ exhausted the free list, and moved some but not all entries into
+ new_table. We must undo the partial move before returning
+ failure. The only way to get into this situation is if new_table
+ uses fewer buckets than the old table, so we will reclaim some
+ free entries as overflows in the new table are put back into
+ distinct buckets in the old table.
+
+ There are some pathological cases where a single pass through the
+ table requires more intermediate overflow entries than using two
+ passes. Two passes give worse cache performance and takes
+ longer, but at this point, we're already out of memory, so slow
+ and safe is better than failure. */
+ table->free_entry_list = new_table->free_entry_list;
+ if (! (transfer_entries (table, new_table, true)
+ && transfer_entries (table, new_table, false)))
+ abort ();
+ /* table->n_entries already holds its value. */
+ free (new_table->bucket);
+ return false;
+}
+
+/* If ENTRY matches an entry already in the hash table, return the pointer
+ to the entry from the table. Otherwise, insert ENTRY and return ENTRY.
+ Return NULL if the storage required for insertion cannot be allocated.
+ This implementation does not support duplicate entries or insertion of
+ NULL. */
+
+void *
+hash_insert (Hash_table *table, const void *entry)
+{
+ void *data;
+ struct hash_entry *bucket;
+
+ /* The caller cannot insert a NULL entry. */
+ if (! entry)
+ abort ();
+
+ /* If there's a matching entry already in the table, return that. */
+ if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL)
+ return data;
+
+ /* If the growth threshold of the buckets in use has been reached, increase
+ the table size and rehash. There's no point in checking the number of
+ entries: if the hashing function is ill-conditioned, rehashing is not
+ likely to improve it. */
+
+ if (table->n_buckets_used
+ > table->tuning->growth_threshold * table->n_buckets)
+ {
+ /* Check more fully, before starting real work. If tuning arguments
+ became invalid, the second check will rely on proper defaults. */
+ check_tuning (table);
+ if (table->n_buckets_used
+ > table->tuning->growth_threshold * table->n_buckets)
+ {
+ const Hash_tuning *tuning = table->tuning;
+ float candidate =
+ (tuning->is_n_buckets
+ ? (table->n_buckets * tuning->growth_factor)
+ : (table->n_buckets * tuning->growth_factor
+ * tuning->growth_threshold));
+
+ if (SIZE_MAX <= candidate)
+ return NULL;
+
+ /* If the rehash fails, arrange to return NULL. */
+ if (!hash_rehash (table, candidate))
+ return NULL;
+
+ /* Update the bucket we are interested in. */
+ if (hash_find_entry (table, entry, &bucket, false) != NULL)
+ abort ();
+ }
+ }
+
+ /* ENTRY is not matched, it should be inserted. */
+
+ if (bucket->data)
+ {
+ struct hash_entry *new_entry = allocate_entry (table);
+
+ if (new_entry == NULL)
+ return NULL;
+
+ /* Add ENTRY in the overflow of the bucket. */
+
+ new_entry->data = (void *) entry;
+ new_entry->next = bucket->next;
+ bucket->next = new_entry;
+ table->n_entries++;
+ return (void *) entry;
+ }
+
+ /* Add ENTRY right in the bucket head. */
+
+ bucket->data = (void *) entry;
+ table->n_entries++;
+ table->n_buckets_used++;
+
+ return (void *) entry;
+}
+
+/* If ENTRY is already in the table, remove it and return the just-deleted
+ data (the user may want to deallocate its storage). If ENTRY is not in the
+ table, don't modify the table and return NULL. */
+
+void *
+hash_delete (Hash_table *table, const void *entry)
+{
+ void *data;
+ struct hash_entry *bucket;
+
+ data = hash_find_entry (table, entry, &bucket, true);
+ if (!data)
+ return NULL;
+
+ table->n_entries--;
+ if (!bucket->data)
+ {
+ table->n_buckets_used--;
+
+ /* If the shrink threshold of the buckets in use has been reached,
+ rehash into a smaller table. */
+
+ if (table->n_buckets_used
+ < table->tuning->shrink_threshold * table->n_buckets)
+ {
+ /* Check more fully, before starting real work. If tuning arguments
+ became invalid, the second check will rely on proper defaults. */
+ check_tuning (table);
+ if (table->n_buckets_used
+ < table->tuning->shrink_threshold * table->n_buckets)
+ {
+ const Hash_tuning *tuning = table->tuning;
+ size_t candidate =
+ (tuning->is_n_buckets
+ ? table->n_buckets * tuning->shrink_factor
+ : (table->n_buckets * tuning->shrink_factor
+ * tuning->growth_threshold));
+
+ if (!hash_rehash (table, candidate))
+ {
+ /* Failure to allocate memory in an attempt to
+ shrink the table is not fatal. But since memory
+ is low, we can at least be kind and free any
+ spare entries, rather than keeping them tied up
+ in the free entry list. */
+#if ! USE_OBSTACK
+ struct hash_entry *cursor = table->free_entry_list;
+ struct hash_entry *next;
+ while (cursor)
+ {
+ next = cursor->next;
+ free (cursor);
+ cursor = next;
+ }
+ table->free_entry_list = NULL;
+#endif
+ }
+ }
+ }
+ }
+
+ return data;
+}
+
+/* Testing. */
+
+#if TESTING
+
+void
+hash_print (const Hash_table *table)
+{
+ struct hash_entry *bucket = (struct hash_entry *) table->bucket;
+
+ for ( ; bucket < table->bucket_limit; bucket++)
+ {
+ struct hash_entry *cursor;
+
+ if (bucket)
+ printf ("%lu:\n", (unsigned long int) (bucket - table->bucket));
+
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ char const *s = cursor->data;
+ /* FIXME */
+ if (s)
+ printf (" %s\n", s);
+ }
+ }
+}
+
+#endif /* TESTING */
diff --git a/gnulib/lib/hash.h b/gnulib/lib/hash.h
new file mode 100644
index 00000000..e795cdc8
--- /dev/null
+++ b/gnulib/lib/hash.h
@@ -0,0 +1,93 @@
+/* hash - hashing table processing.
+ Copyright (C) 1998-1999, 2001, 2003, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Jim Meyering <meyering@ascend.com>, 1998.
+
+ 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/>. */
+
+/* A generic hash table package. */
+
+/* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use
+ obstacks instead of malloc, and recompile `hash.c' with same setting. */
+
+#ifndef HASH_H_
+# define HASH_H_
+
+# include <stdio.h>
+# include <stdbool.h>
+
+/* The warn_unused_result attribute appeared first in gcc-3.4.0 */
+# ifndef __attribute__
+# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
+# define __attribute__(x)
+# endif
+# endif
+
+# ifndef ATTRIBUTE_WUR
+# define ATTRIBUTE_WUR __attribute__ ((__warn_unused_result__))
+# endif
+
+typedef size_t (*Hash_hasher) (const void *, size_t);
+typedef bool (*Hash_comparator) (const void *, const void *);
+typedef void (*Hash_data_freer) (void *);
+typedef bool (*Hash_processor) (void *, void *);
+
+struct hash_tuning
+ {
+ /* This structure is mainly used for `hash_initialize', see the block
+ documentation of `hash_reset_tuning' for more complete comments. */
+
+ float shrink_threshold; /* ratio of used buckets to trigger a shrink */
+ float shrink_factor; /* ratio of new smaller size to original size */
+ float growth_threshold; /* ratio of used buckets to trigger a growth */
+ float growth_factor; /* ratio of new bigger size to original size */
+ bool is_n_buckets; /* if CANDIDATE really means table size */
+ };
+
+typedef struct hash_tuning Hash_tuning;
+
+struct hash_table;
+
+typedef struct hash_table Hash_table;
+
+/* Information and lookup. */
+size_t hash_get_n_buckets (const Hash_table *);
+size_t hash_get_n_buckets_used (const Hash_table *);
+size_t hash_get_n_entries (const Hash_table *);
+size_t hash_get_max_bucket_length (const Hash_table *);
+bool hash_table_ok (const Hash_table *);
+void hash_print_statistics (const Hash_table *, FILE *);
+void *hash_lookup (const Hash_table *, const void *);
+
+/* Walking. */
+void *hash_get_first (const Hash_table *);
+void *hash_get_next (const Hash_table *, const void *);
+size_t hash_get_entries (const Hash_table *, void **, size_t);
+size_t hash_do_for_each (const Hash_table *, Hash_processor, void *);
+
+/* Allocation and clean-up. */
+size_t hash_string (const char *, size_t);
+void hash_reset_tuning (Hash_tuning *);
+Hash_table *hash_initialize (size_t, const Hash_tuning *,
+ Hash_hasher, Hash_comparator,
+ Hash_data_freer) ATTRIBUTE_WUR;
+void hash_clear (Hash_table *);
+void hash_free (Hash_table *);
+
+/* Insertion and deletion. */
+bool hash_rehash (Hash_table *, size_t) ATTRIBUTE_WUR;
+void *hash_insert (Hash_table *, const void *) ATTRIBUTE_WUR;
+void *hash_delete (Hash_table *, const void *);
+
+#endif
diff --git a/gnulib/lib/hmac-md5.c b/gnulib/lib/hmac-md5.c
new file mode 100644
index 00000000..ea2dc4f9
--- /dev/null
+++ b/gnulib/lib/hmac-md5.c
@@ -0,0 +1,81 @@
+/* hmac-md5.c -- hashed message authentication codes
+ Copyright (C) 2005, 2006, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "hmac.h"
+
+#include "memxor.h"
+#include "md5.h"
+
+#include <string.h>
+
+#define IPAD 0x36
+#define OPAD 0x5c
+
+int
+hmac_md5 (const void *key, size_t keylen,
+ const void *in, size_t inlen, void *resbuf)
+{
+ struct md5_ctx inner;
+ struct md5_ctx outer;
+ char optkeybuf[16];
+ char block[64];
+ char innerhash[16];
+
+ /* Reduce the key's size, so that it becomes <= 64 bytes large. */
+
+ if (keylen > 64)
+ {
+ struct md5_ctx keyhash;
+
+ md5_init_ctx (&keyhash);
+ md5_process_bytes (key, keylen, &keyhash);
+ md5_finish_ctx (&keyhash, optkeybuf);
+
+ key = optkeybuf;
+ keylen = 16;
+ }
+
+ /* Compute INNERHASH from KEY and IN. */
+
+ md5_init_ctx (&inner);
+
+ memset (block, IPAD, sizeof (block));
+ memxor (block, key, keylen);
+
+ md5_process_block (block, 64, &inner);
+ md5_process_bytes (in, inlen, &inner);
+
+ md5_finish_ctx (&inner, innerhash);
+
+ /* Compute result from KEY and INNERHASH. */
+
+ md5_init_ctx (&outer);
+
+ memset (block, OPAD, sizeof (block));
+ memxor (block, key, keylen);
+
+ md5_process_block (block, 64, &outer);
+ md5_process_bytes (innerhash, 16, &outer);
+
+ md5_finish_ctx (&outer, resbuf);
+
+ return 0;
+}
diff --git a/gnulib/lib/hmac-sha1.c b/gnulib/lib/hmac-sha1.c
new file mode 100644
index 00000000..5d89d815
--- /dev/null
+++ b/gnulib/lib/hmac-sha1.c
@@ -0,0 +1,81 @@
+/* hmac-sha1.c -- hashed message authentication codes
+ Copyright (C) 2005, 2006, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "hmac.h"
+
+#include "memxor.h"
+#include "sha1.h"
+
+#include <string.h>
+
+#define IPAD 0x36
+#define OPAD 0x5c
+
+int
+hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, void *resbuf)
+{
+ struct sha1_ctx inner;
+ struct sha1_ctx outer;
+ char optkeybuf[20];
+ char block[64];
+ char innerhash[20];
+
+ /* Reduce the key's size, so that it becomes <= 64 bytes large. */
+
+ if (keylen > 64)
+ {
+ struct sha1_ctx keyhash;
+
+ sha1_init_ctx (&keyhash);
+ sha1_process_bytes (key, keylen, &keyhash);
+ sha1_finish_ctx (&keyhash, optkeybuf);
+
+ key = optkeybuf;
+ keylen = 20;
+ }
+
+ /* Compute INNERHASH from KEY and IN. */
+
+ sha1_init_ctx (&inner);
+
+ memset (block, IPAD, sizeof (block));
+ memxor (block, key, keylen);
+
+ sha1_process_block (block, 64, &inner);
+ sha1_process_bytes (in, inlen, &inner);
+
+ sha1_finish_ctx (&inner, innerhash);
+
+ /* Compute result from KEY and INNERHASH. */
+
+ sha1_init_ctx (&outer);
+
+ memset (block, OPAD, sizeof (block));
+ memxor (block, key, keylen);
+
+ sha1_process_block (block, 64, &outer);
+ sha1_process_bytes (innerhash, 20, &outer);
+
+ sha1_finish_ctx (&outer, resbuf);
+
+ return 0;
+}
diff --git a/gnulib/lib/hmac.h b/gnulib/lib/hmac.h
new file mode 100644
index 00000000..d0f77861
--- /dev/null
+++ b/gnulib/lib/hmac.h
@@ -0,0 +1,41 @@
+/* hmac.h -- hashed message authentication codes
+ Copyright (C) 2005, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#ifndef HMAC_H
+# define HMAC_H 1
+
+#include <stddef.h>
+
+/* Compute Hashed Message Authentication Code with MD5, as described
+ in RFC 2104, over BUFFER data of BUFLEN bytes using the KEY of
+ KEYLEN bytes, writing the output to pre-allocated 16 byte minimum
+ RESBUF buffer. Return 0 on success. */
+int
+hmac_md5 (const void *key, size_t keylen,
+ const void *buffer, size_t buflen, void *resbuf);
+
+/* Compute Hashed Message Authentication Code with SHA-1, over BUFFER
+ data of BUFLEN bytes using the KEY of KEYLEN bytes, writing the
+ output to pre-allocated 20 byte minimum RESBUF buffer. Return 0 on
+ success. */
+int
+hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, void *resbuf);
+
+#endif /* HMAC_H */
diff --git a/gnulib/lib/human.c b/gnulib/lib/human.c
new file mode 100644
index 00000000..f5b9511c
--- /dev/null
+++ b/gnulib/lib/human.c
@@ -0,0 +1,471 @@
+/* human.c -- print human readable file size
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006, 2007, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert and Larry McVoy. */
+
+#include <config.h>
+
+#include "human.h"
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <argmatch.h>
+#include <error.h>
+#include <intprops.h>
+
+/* The maximum length of a suffix like "KiB". */
+#define HUMAN_READABLE_SUFFIX_LENGTH_MAX 3
+
+static const char power_letter[] =
+{
+ 0, /* not used */
+ 'K', /* kibi ('k' for kilo is a special case) */
+ 'M', /* mega or mebi */
+ 'G', /* giga or gibi */
+ 'T', /* tera or tebi */
+ 'P', /* peta or pebi */
+ 'E', /* exa or exbi */
+ 'Z', /* zetta or 2**70 */
+ 'Y' /* yotta or 2**80 */
+};
+
+
+/* If INEXACT_STYLE is not human_round_to_nearest, and if easily
+ possible, adjust VALUE according to the style. */
+
+static long double
+adjust_value (int inexact_style, long double value)
+{
+ /* Do not use the floorl or ceill functions, as that would mean
+ checking for their presence and possibly linking with the
+ standard math library, which is a porting pain. So leave the
+ value alone if it is too large to easily round. */
+ if (inexact_style != human_round_to_nearest && value < UINTMAX_MAX)
+ {
+ uintmax_t u = value;
+ value = u + (inexact_style == human_ceiling && u != value);
+ }
+
+ return value;
+}
+
+/* Group the digits of NUMBER according to the grouping rules of the
+ current locale. NUMBER contains NUMBERLEN digits. Modify the
+ bytes pointed to by NUMBER in place, subtracting 1 from NUMBER for
+ each byte inserted. Return the starting address of the modified
+ number.
+
+ To group the digits, use GROUPING and THOUSANDS_SEP as in `struct
+ lconv' from <locale.h>. */
+
+static char *
+group_number (char *number, size_t numberlen,
+ char const *grouping, char const *thousands_sep)
+{
+ register char *d;
+ size_t grouplen = SIZE_MAX;
+ size_t thousands_seplen = strlen (thousands_sep);
+ size_t i = numberlen;
+
+ /* The maximum possible value for NUMBERLEN is the number of digits
+ in the square of the largest uintmax_t, so double the size needed. */
+ char buf[2 * INT_STRLEN_BOUND (uintmax_t) + 1];
+
+ memcpy (buf, number, numberlen);
+ d = number + numberlen;
+
+ for (;;)
+ {
+ unsigned char g = *grouping;
+
+ if (g)
+ {
+ grouplen = g < CHAR_MAX ? g : i;
+ grouping++;
+ }
+
+ if (i < grouplen)
+ grouplen = i;
+
+ d -= grouplen;
+ i -= grouplen;
+ memcpy (d, buf + i, grouplen);
+ if (i == 0)
+ return d;
+
+ d -= thousands_seplen;
+ memcpy (d, thousands_sep, thousands_seplen);
+ }
+}
+
+/* Convert N to a human readable format in BUF, using the options OPTS.
+
+ N is expressed in units of FROM_BLOCK_SIZE. FROM_BLOCK_SIZE must
+ be nonnegative.
+
+ Use units of TO_BLOCK_SIZE in the output number. TO_BLOCK_SIZE
+ must be positive.
+
+ Use (OPTS & (human_round_to_nearest | human_floor | human_ceiling))
+ to determine whether to take the ceiling or floor of any result
+ that cannot be expressed exactly.
+
+ If (OPTS & human_group_digits), group the thousands digits
+ according to the locale, e.g., `1,000,000' in an American English
+ locale.
+
+ If (OPTS & human_autoscale), deduce the output block size
+ automatically; TO_BLOCK_SIZE must be 1 but it has no effect on the
+ output. Use powers of 1024 if (OPTS & human_base_1024), and powers
+ of 1000 otherwise. For example, assuming powers of 1024, 8500
+ would be converted to 8.3, 133456345 to 127, 56990456345 to 53, and
+ so on. Numbers smaller than the power aren't modified.
+ human_autoscale is normally used together with human_SI.
+
+ If (OPTS & human_space_before_unit), use a space to separate the
+ number from any suffix that is appended as described below.
+
+ If (OPTS & human_SI), append an SI prefix indicating which power is
+ being used. If in addition (OPTS & human_B), append "B" (if base
+ 1000) or "iB" (if base 1024) to the SI prefix. When ((OPTS &
+ human_SI) && ! (OPTS & human_autoscale)), TO_BLOCK_SIZE must be a
+ power of 1024 or of 1000, depending on (OPTS &
+ human_base_1024). */
+
+char *
+human_readable (uintmax_t n, char *buf, int opts,
+ uintmax_t from_block_size, uintmax_t to_block_size)
+{
+ int inexact_style =
+ opts & (human_round_to_nearest | human_floor | human_ceiling);
+ unsigned int base = opts & human_base_1024 ? 1024 : 1000;
+ uintmax_t amt;
+ int tenths;
+ int exponent = -1;
+ int exponent_max = sizeof power_letter - 1;
+ char *p;
+ char *psuffix;
+ char const *integerlim;
+
+ /* 0 means adjusted N == AMT.TENTHS;
+ 1 means AMT.TENTHS < adjusted N < AMT.TENTHS + 0.05;
+ 2 means adjusted N == AMT.TENTHS + 0.05;
+ 3 means AMT.TENTHS + 0.05 < adjusted N < AMT.TENTHS + 0.1. */
+ int rounding;
+
+ char const *decimal_point = ".";
+ size_t decimal_pointlen = 1;
+ char const *grouping = "";
+ char const *thousands_sep = "";
+ struct lconv const *l = localeconv ();
+ size_t pointlen = strlen (l->decimal_point);
+ if (0 < pointlen && pointlen <= MB_LEN_MAX)
+ {
+ decimal_point = l->decimal_point;
+ decimal_pointlen = pointlen;
+ }
+ grouping = l->grouping;
+ if (strlen (l->thousands_sep) <= MB_LEN_MAX)
+ thousands_sep = l->thousands_sep;
+
+ psuffix = buf + LONGEST_HUMAN_READABLE - HUMAN_READABLE_SUFFIX_LENGTH_MAX;
+ p = psuffix;
+
+ /* Adjust AMT out of FROM_BLOCK_SIZE units and into TO_BLOCK_SIZE
+ units. If this can be done exactly with integer arithmetic, do
+ not use floating point operations. */
+ if (to_block_size <= from_block_size)
+ {
+ if (from_block_size % to_block_size == 0)
+ {
+ uintmax_t multiplier = from_block_size / to_block_size;
+ amt = n * multiplier;
+ if (amt / multiplier == n)
+ {
+ tenths = 0;
+ rounding = 0;
+ goto use_integer_arithmetic;
+ }
+ }
+ }
+ else if (from_block_size != 0 && to_block_size % from_block_size == 0)
+ {
+ uintmax_t divisor = to_block_size / from_block_size;
+ uintmax_t r10 = (n % divisor) * 10;
+ uintmax_t r2 = (r10 % divisor) * 2;
+ amt = n / divisor;
+ tenths = r10 / divisor;
+ rounding = r2 < divisor ? 0 < r2 : 2 + (divisor < r2);
+ goto use_integer_arithmetic;
+ }
+
+ {
+ /* Either the result cannot be computed easily using uintmax_t,
+ or from_block_size is zero. Fall back on floating point.
+ FIXME: This can yield answers that are slightly off. */
+
+ long double dto_block_size = to_block_size;
+ long double damt = n * (from_block_size / dto_block_size);
+ size_t buflen;
+ size_t nonintegerlen;
+
+ if (! (opts & human_autoscale))
+ {
+ sprintf (buf, "%.0Lf", adjust_value (inexact_style, damt));
+ buflen = strlen (buf);
+ nonintegerlen = 0;
+ }
+ else
+ {
+ long double e = 1;
+ exponent = 0;
+
+ do
+ {
+ e *= base;
+ exponent++;
+ }
+ while (e * base <= damt && exponent < exponent_max);
+
+ damt /= e;
+
+ sprintf (buf, "%.1Lf", adjust_value (inexact_style, damt));
+ buflen = strlen (buf);
+ nonintegerlen = decimal_pointlen + 1;
+
+ if (1 + nonintegerlen + ! (opts & human_base_1024) < buflen
+ || ((opts & human_suppress_point_zero)
+ && buf[buflen - 1] == '0'))
+ {
+ sprintf (buf, "%.0Lf",
+ adjust_value (inexact_style, damt * 10) / 10);
+ buflen = strlen (buf);
+ nonintegerlen = 0;
+ }
+ }
+
+ p = psuffix - buflen;
+ memmove (p, buf, buflen);
+ integerlim = p + buflen - nonintegerlen;
+ }
+ goto do_grouping;
+
+ use_integer_arithmetic:
+ {
+ /* The computation can be done exactly, with integer arithmetic.
+
+ Use power of BASE notation if requested and if adjusted AMT is
+ large enough. */
+
+ if (opts & human_autoscale)
+ {
+ exponent = 0;
+
+ if (base <= amt)
+ {
+ do
+ {
+ unsigned int r10 = (amt % base) * 10 + tenths;
+ unsigned int r2 = (r10 % base) * 2 + (rounding >> 1);
+ amt /= base;
+ tenths = r10 / base;
+ rounding = (r2 < base
+ ? (r2 + rounding) != 0
+ : 2 + (base < r2 + rounding));
+ exponent++;
+ }
+ while (base <= amt && exponent < exponent_max);
+
+ if (amt < 10)
+ {
+ if (inexact_style == human_round_to_nearest
+ ? 2 < rounding + (tenths & 1)
+ : inexact_style == human_ceiling && 0 < rounding)
+ {
+ tenths++;
+ rounding = 0;
+
+ if (tenths == 10)
+ {
+ amt++;
+ tenths = 0;
+ }
+ }
+
+ if (amt < 10
+ && (tenths || ! (opts & human_suppress_point_zero)))
+ {
+ *--p = '0' + tenths;
+ p -= decimal_pointlen;
+ memcpy (p, decimal_point, decimal_pointlen);
+ tenths = rounding = 0;
+ }
+ }
+ }
+ }
+
+ if (inexact_style == human_round_to_nearest
+ ? 5 < tenths + (0 < rounding + (amt & 1))
+ : inexact_style == human_ceiling && 0 < tenths + rounding)
+ {
+ amt++;
+
+ if ((opts & human_autoscale)
+ && amt == base && exponent < exponent_max)
+ {
+ exponent++;
+ if (! (opts & human_suppress_point_zero))
+ {
+ *--p = '0';
+ p -= decimal_pointlen;
+ memcpy (p, decimal_point, decimal_pointlen);
+ }
+ amt = 1;
+ }
+ }
+
+ integerlim = p;
+
+ do
+ {
+ int digit = amt % 10;
+ *--p = digit + '0';
+ }
+ while ((amt /= 10) != 0);
+ }
+
+ do_grouping:
+ if (opts & human_group_digits)
+ p = group_number (p, integerlim - p, grouping, thousands_sep);
+
+ if (opts & human_SI)
+ {
+ if (exponent < 0)
+ {
+ uintmax_t power;
+ exponent = 0;
+ for (power = 1; power < to_block_size; power *= base)
+ if (++exponent == exponent_max)
+ break;
+ }
+
+ if ((exponent | (opts & human_B)) && (opts & human_space_before_unit))
+ *psuffix++ = ' ';
+
+ if (exponent)
+ *psuffix++ = (! (opts & human_base_1024) && exponent == 1
+ ? 'k'
+ : power_letter[exponent]);
+
+ if (opts & human_B)
+ {
+ if ((opts & human_base_1024) && exponent)
+ *psuffix++ = 'i';
+ *psuffix++ = 'B';
+ }
+ }
+
+ *psuffix = '\0';
+
+ return p;
+}
+
+
+/* The default block size used for output. This number may change in
+ the future as disks get larger. */
+#ifndef DEFAULT_BLOCK_SIZE
+# define DEFAULT_BLOCK_SIZE 1024
+#endif
+
+static char const *const block_size_args[] = { "human-readable", "si", 0 };
+static int const block_size_opts[] =
+ {
+ human_autoscale + human_SI + human_base_1024,
+ human_autoscale + human_SI
+ };
+
+static uintmax_t
+default_block_size (void)
+{
+ return getenv ("POSIXLY_CORRECT") ? 512 : DEFAULT_BLOCK_SIZE;
+}
+
+static strtol_error
+humblock (char const *spec, uintmax_t *block_size, int *options)
+{
+ int i;
+ int opts = 0;
+
+ if (! spec
+ && ! (spec = getenv ("BLOCK_SIZE"))
+ && ! (spec = getenv ("BLOCKSIZE")))
+ *block_size = default_block_size ();
+ else
+ {
+ if (*spec == '\'')
+ {
+ opts |= human_group_digits;
+ spec++;
+ }
+
+ if (0 <= (i = ARGMATCH (spec, block_size_args, block_size_opts)))
+ {
+ opts |= block_size_opts[i];
+ *block_size = 1;
+ }
+ else
+ {
+ char *ptr;
+ strtol_error e = xstrtoumax (spec, &ptr, 0, block_size,
+ "eEgGkKmMpPtTyYzZ0");
+ if (e != LONGINT_OK)
+ {
+ *options = 0;
+ return e;
+ }
+ for (; ! ('0' <= *spec && *spec <= '9'); spec++)
+ if (spec == ptr)
+ {
+ opts |= human_SI;
+ if (ptr[-1] == 'B')
+ opts |= human_B;
+ if (ptr[-1] != 'B' || ptr[-2] == 'i')
+ opts |= human_base_1024;
+ break;
+ }
+ }
+ }
+
+ *options = opts;
+ return LONGINT_OK;
+}
+
+enum strtol_error
+human_options (char const *spec, int *opts, uintmax_t *block_size)
+{
+ strtol_error e = humblock (spec, block_size, opts);
+ if (*block_size == 0)
+ {
+ *block_size = default_block_size ();
+ e = LONGINT_INVALID;
+ }
+ return e;
+}
diff --git a/gnulib/lib/human.h b/gnulib/lib/human.h
new file mode 100644
index 00000000..d6b6ed5b
--- /dev/null
+++ b/gnulib/lib/human.h
@@ -0,0 +1,84 @@
+/* human.h -- print human readable file size
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006, 2007, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert and Larry McVoy. */
+
+#ifndef HUMAN_H_
+# define HUMAN_H_ 1
+
+# include <limits.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <unistd.h>
+
+# include <xstrtol.h>
+
+/* A conservative bound on the maximum length of a human-readable string.
+ The output can be the square of the largest uintmax_t, so double
+ its size before converting to a bound.
+ log10 (2.0) < 146/485. Add 1 for integer division truncation.
+ Also, the output can have a thousands separator between every digit,
+ so multiply by MB_LEN_MAX + 1 and then subtract MB_LEN_MAX.
+ Append 1 for a space before the suffix.
+ Finally, append 3, the maximum length of a suffix. */
+# define LONGEST_HUMAN_READABLE \
+ ((2 * sizeof (uintmax_t) * CHAR_BIT * 146 / 485 + 1) * (MB_LEN_MAX + 1) \
+ - MB_LEN_MAX + 1 + 3)
+
+/* Options for human_readable. */
+enum
+{
+ /* Unless otherwise specified these options may be ORed together. */
+
+ /* The following three options are mutually exclusive. */
+ /* Round to plus infinity (default). */
+ human_ceiling = 0,
+ /* Round to nearest, ties to even. */
+ human_round_to_nearest = 1,
+ /* Round to minus infinity. */
+ human_floor = 2,
+
+ /* Group digits together, e.g. `1,000,000'. This uses the
+ locale-defined grouping; the traditional C locale does not group,
+ so this has effect only if some other locale is in use. */
+ human_group_digits = 4,
+
+ /* When autoscaling, suppress ".0" at end. */
+ human_suppress_point_zero = 8,
+
+ /* Scale output and use SI-style units, ignoring the output block size. */
+ human_autoscale = 16,
+
+ /* Prefer base 1024 to base 1000. */
+ human_base_1024 = 32,
+
+ /* Prepend " " before unit symbol. */
+ human_space_before_unit = 64,
+
+ /* Append SI prefix, e.g. "k" or "M". */
+ human_SI = 128,
+
+ /* Append "B" (if base 1000) or "iB" (if base 1024) to SI prefix. */
+ human_B = 256
+};
+
+char *human_readable (uintmax_t, char *, int, uintmax_t, uintmax_t);
+
+enum strtol_error human_options (char const *, int *, uintmax_t *);
+
+#endif /* HUMAN_H_ */
diff --git a/gnulib/lib/i-ring.c b/gnulib/lib/i-ring.c
new file mode 100644
index 00000000..2825ab97
--- /dev/null
+++ b/gnulib/lib/i-ring.c
@@ -0,0 +1,68 @@
+/* a simple ring buffer
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+#include "i-ring.h"
+
+#include <stdlib.h>
+
+void
+i_ring_init (I_ring *ir, int default_val)
+{
+ int i;
+ ir->ir_empty = true;
+ ir->ir_front = 0;
+ ir->ir_back = 0;
+ for (i = 0; i < I_RING_SIZE; i++)
+ ir->ir_data[i] = default_val;
+ ir->ir_default_val = default_val;
+}
+
+bool
+i_ring_empty (I_ring const *ir)
+{
+ return ir->ir_empty;
+}
+
+int
+i_ring_push (I_ring *ir, int val)
+{
+ unsigned int dest_idx = (ir->ir_front + !ir->ir_empty) % I_RING_SIZE;
+ int old_val = ir->ir_data[dest_idx];
+ ir->ir_data[dest_idx] = val;
+ ir->ir_front = dest_idx;
+ if (dest_idx == ir->ir_back)
+ ir->ir_back = (ir->ir_back + !ir->ir_empty) % I_RING_SIZE;
+ ir->ir_empty = false;
+ return old_val;
+}
+
+int
+i_ring_pop (I_ring *ir)
+{
+ int top_val;
+ if (i_ring_empty (ir))
+ abort ();
+ top_val = ir->ir_data[ir->ir_front];
+ ir->ir_data[ir->ir_front] = ir->ir_default_val;
+ if (ir->ir_front == ir->ir_back)
+ ir->ir_empty = true;
+ else
+ ir->ir_front = ((ir->ir_front + I_RING_SIZE - 1) % I_RING_SIZE);
+ return top_val;
+}
diff --git a/gnulib/lib/i-ring.h b/gnulib/lib/i-ring.h
new file mode 100644
index 00000000..2009266f
--- /dev/null
+++ b/gnulib/lib/i-ring.h
@@ -0,0 +1,44 @@
+/* definitions for a simple ring buffer
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+#include <stdbool.h>
+#include "verify.h"
+
+enum { I_RING_SIZE = 4 };
+verify (1 <= I_RING_SIZE);
+
+/* When ir_empty is true, the ring is empty.
+ Otherwise, ir_data[B..F] are defined, where B..F is the contiguous
+ range of indices, modulo I_RING_SIZE, from back to front, inclusive.
+ Undefined elements of ir_data are always set to ir_default_val.
+ Popping from an empty ring aborts.
+ Pushing onto a full ring returns the displaced value.
+ An empty ring has F==B and ir_empty == true.
+ A ring with one entry still has F==B, but now ir_empty == false. */
+struct I_ring
+{
+ int ir_data[I_RING_SIZE];
+ int ir_default_val;
+ unsigned int ir_front;
+ unsigned int ir_back;
+ bool ir_empty;
+};
+typedef struct I_ring I_ring;
+
+void i_ring_init (I_ring *ir, int ir_default_val);
+int i_ring_push (I_ring *ir, int val);
+int i_ring_pop (I_ring *ir);
+bool i_ring_empty (I_ring const *ir);
diff --git a/gnulib/lib/iconv.c b/gnulib/lib/iconv.c
new file mode 100644
index 00000000..197afdb7
--- /dev/null
+++ b/gnulib/lib/iconv.c
@@ -0,0 +1,450 @@
+/* Character set conversion.
+ Copyright (C) 1999-2001, 2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <iconv.h>
+
+#include <stddef.h>
+
+#if REPLACE_ICONV_UTF
+# include <errno.h>
+# include <stdint.h>
+# include <stdlib.h>
+# include "unistr.h"
+# ifndef uintptr_t
+# define uintptr_t unsigned long
+# endif
+#endif
+
+#if REPLACE_ICONV_UTF
+
+/* UTF-{16,32}{BE,LE} converters taken from GNU libiconv 1.11. */
+
+/* Return code if invalid. (xxx_mbtowc) */
+# define RET_ILSEQ -1
+/* Return code if no bytes were read. (xxx_mbtowc) */
+# define RET_TOOFEW -2
+
+/* Return code if invalid. (xxx_wctomb) */
+# define RET_ILUNI -1
+/* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */
+# define RET_TOOSMALL -2
+
+/*
+ * UTF-16BE
+ */
+
+/* Specification: RFC 2781 */
+
+static int
+utf16be_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+ if (n >= 2)
+ {
+ ucs4_t wc = (s[0] << 8) + s[1];
+ if (wc >= 0xd800 && wc < 0xdc00)
+ {
+ if (n >= 4)
+ {
+ ucs4_t wc2 = (s[2] << 8) + s[3];
+ if (!(wc2 >= 0xdc00 && wc2 < 0xe000))
+ return RET_ILSEQ;
+ *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00);
+ return 4;
+ }
+ }
+ else if (wc >= 0xdc00 && wc < 0xe000)
+ {
+ return RET_ILSEQ;
+ }
+ else
+ {
+ *pwc = wc;
+ return 2;
+ }
+ }
+ return RET_TOOFEW;
+}
+
+static int
+utf16be_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+ if (!(wc >= 0xd800 && wc < 0xe000))
+ {
+ if (wc < 0x10000)
+ {
+ if (n >= 2)
+ {
+ r[0] = (unsigned char) (wc >> 8);
+ r[1] = (unsigned char) wc;
+ return 2;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ else if (wc < 0x110000)
+ {
+ if (n >= 4)
+ {
+ ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10);
+ ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff);
+ r[0] = (unsigned char) (wc1 >> 8);
+ r[1] = (unsigned char) wc1;
+ r[2] = (unsigned char) (wc2 >> 8);
+ r[3] = (unsigned char) wc2;
+ return 4;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ }
+ return RET_ILUNI;
+}
+
+/*
+ * UTF-16LE
+ */
+
+/* Specification: RFC 2781 */
+
+static int
+utf16le_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+ if (n >= 2)
+ {
+ ucs4_t wc = s[0] + (s[1] << 8);
+ if (wc >= 0xd800 && wc < 0xdc00)
+ {
+ if (n >= 4)
+ {
+ ucs4_t wc2 = s[2] + (s[3] << 8);
+ if (!(wc2 >= 0xdc00 && wc2 < 0xe000))
+ return RET_ILSEQ;
+ *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00);
+ return 4;
+ }
+ }
+ else if (wc >= 0xdc00 && wc < 0xe000)
+ {
+ return RET_ILSEQ;
+ }
+ else
+ {
+ *pwc = wc;
+ return 2;
+ }
+ }
+ return RET_TOOFEW;
+}
+
+static int
+utf16le_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+ if (!(wc >= 0xd800 && wc < 0xe000))
+ {
+ if (wc < 0x10000)
+ {
+ if (n >= 2)
+ {
+ r[0] = (unsigned char) wc;
+ r[1] = (unsigned char) (wc >> 8);
+ return 2;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ else if (wc < 0x110000)
+ {
+ if (n >= 4)
+ {
+ ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10);
+ ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff);
+ r[0] = (unsigned char) wc1;
+ r[1] = (unsigned char) (wc1 >> 8);
+ r[2] = (unsigned char) wc2;
+ r[3] = (unsigned char) (wc2 >> 8);
+ return 4;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ }
+ return RET_ILUNI;
+}
+
+/*
+ * UTF-32BE
+ */
+
+/* Specification: Unicode 3.1 Standard Annex #19 */
+
+static int
+utf32be_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+ if (n >= 4)
+ {
+ ucs4_t wc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
+ if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+ {
+ *pwc = wc;
+ return 4;
+ }
+ else
+ return RET_ILSEQ;
+ }
+ return RET_TOOFEW;
+}
+
+static int
+utf32be_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+ if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+ {
+ if (n >= 4)
+ {
+ r[0] = 0;
+ r[1] = (unsigned char) (wc >> 16);
+ r[2] = (unsigned char) (wc >> 8);
+ r[3] = (unsigned char) wc;
+ return 4;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ return RET_ILUNI;
+}
+
+/*
+ * UTF-32LE
+ */
+
+/* Specification: Unicode 3.1 Standard Annex #19 */
+
+static int
+utf32le_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+ if (n >= 4)
+ {
+ ucs4_t wc = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24);
+ if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+ {
+ *pwc = wc;
+ return 4;
+ }
+ else
+ return RET_ILSEQ;
+ }
+ return RET_TOOFEW;
+}
+
+static int
+utf32le_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+ if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+ {
+ if (n >= 4)
+ {
+ r[0] = (unsigned char) wc;
+ r[1] = (unsigned char) (wc >> 8);
+ r[2] = (unsigned char) (wc >> 16);
+ r[3] = 0;
+ return 4;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ return RET_ILUNI;
+}
+
+#endif
+
+size_t
+rpl_iconv (iconv_t cd,
+ ICONV_CONST char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+#undef iconv
+{
+#if REPLACE_ICONV_UTF
+ switch ((uintptr_t) cd)
+ {
+ {
+ int (*xxx_wctomb) (unsigned char *, ucs4_t, size_t);
+
+ case (uintptr_t) _ICONV_UTF8_UTF16BE:
+ xxx_wctomb = utf16be_wctomb;
+ goto loop_from_utf8;
+ case (uintptr_t) _ICONV_UTF8_UTF16LE:
+ xxx_wctomb = utf16le_wctomb;
+ goto loop_from_utf8;
+ case (uintptr_t) _ICONV_UTF8_UTF32BE:
+ xxx_wctomb = utf32be_wctomb;
+ goto loop_from_utf8;
+ case (uintptr_t) _ICONV_UTF8_UTF32LE:
+ xxx_wctomb = utf32le_wctomb;
+ goto loop_from_utf8;
+
+ loop_from_utf8:
+ if (inbuf == NULL || *inbuf == NULL)
+ return 0;
+ {
+ ICONV_CONST char *inptr = *inbuf;
+ size_t inleft = *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outleft = *outbytesleft;
+ size_t res = 0;
+ while (inleft > 0)
+ {
+ ucs4_t uc;
+ int m = u8_mbtoucr (&uc, (const uint8_t *) inptr, inleft);
+ if (m <= 0)
+ {
+ if (m == -1)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ break;
+ }
+ if (m == -2)
+ {
+ errno = EINVAL;
+ res = (size_t)(-1);
+ break;
+ }
+ abort ();
+ }
+ else
+ {
+ int n = xxx_wctomb ((uint8_t *) outptr, uc, outleft);
+ if (n < 0)
+ {
+ if (n == RET_ILUNI)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ break;
+ }
+ if (n == RET_TOOSMALL)
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ break;
+ }
+ abort ();
+ }
+ else
+ {
+ inptr += m;
+ inleft -= m;
+ outptr += n;
+ outleft -= n;
+ }
+ }
+ }
+ *inbuf = inptr;
+ *inbytesleft = inleft;
+ *outbuf = outptr;
+ *outbytesleft = outleft;
+ return res;
+ }
+ }
+
+ {
+ int (*xxx_mbtowc) (ucs4_t *, const unsigned char *, size_t);
+
+ case (uintptr_t) _ICONV_UTF16BE_UTF8:
+ xxx_mbtowc = utf16be_mbtowc;
+ goto loop_to_utf8;
+ case (uintptr_t) _ICONV_UTF16LE_UTF8:
+ xxx_mbtowc = utf16le_mbtowc;
+ goto loop_to_utf8;
+ case (uintptr_t) _ICONV_UTF32BE_UTF8:
+ xxx_mbtowc = utf32be_mbtowc;
+ goto loop_to_utf8;
+ case (uintptr_t) _ICONV_UTF32LE_UTF8:
+ xxx_mbtowc = utf32le_mbtowc;
+ goto loop_to_utf8;
+
+ loop_to_utf8:
+ if (inbuf == NULL || *inbuf == NULL)
+ return 0;
+ {
+ ICONV_CONST char *inptr = *inbuf;
+ size_t inleft = *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outleft = *outbytesleft;
+ size_t res = 0;
+ while (inleft > 0)
+ {
+ ucs4_t uc;
+ int m = xxx_mbtowc (&uc, (const uint8_t *) inptr, inleft);
+ if (m <= 0)
+ {
+ if (m == RET_ILSEQ)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ break;
+ }
+ if (m == RET_TOOFEW)
+ {
+ errno = EINVAL;
+ res = (size_t)(-1);
+ break;
+ }
+ abort ();
+ }
+ else
+ {
+ int n = u8_uctomb ((uint8_t *) outptr, uc, outleft);
+ if (n < 0)
+ {
+ if (n == -1)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ break;
+ }
+ if (n == -2)
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ break;
+ }
+ abort ();
+ }
+ else
+ {
+ inptr += m;
+ inleft -= m;
+ outptr += n;
+ outleft -= n;
+ }
+ }
+ }
+ *inbuf = inptr;
+ *inbytesleft = inleft;
+ *outbuf = outptr;
+ *outbytesleft = outleft;
+ return res;
+ }
+ }
+ }
+#endif
+ return iconv (cd, inbuf, inbytesleft, outbuf, outbytesleft);
+}
diff --git a/gnulib/lib/iconv.in.h b/gnulib/lib/iconv.in.h
new file mode 100644
index 00000000..b75ae245
--- /dev/null
+++ b/gnulib/lib/iconv.in.h
@@ -0,0 +1,74 @@
+/* A GNU-like <iconv.h>.
+
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_ICONV_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_ICONV_H@
+
+#ifndef _GL_ICONV_H
+#define _GL_ICONV_H
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @REPLACE_ICONV_OPEN@
+/* An iconv_open wrapper that supports the IANA standardized encoding names
+ ("ISO-8859-1" etc.) as far as possible. */
+# define iconv_open rpl_iconv_open
+extern iconv_t iconv_open (const char *tocode, const char *fromcode)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @REPLACE_ICONV_UTF@
+/* Special constants for supporting UTF-{16,32}{BE,LE} encodings.
+ Not public. */
+# define _ICONV_UTF8_UTF16BE (iconv_t)(-161)
+# define _ICONV_UTF8_UTF16LE (iconv_t)(-162)
+# define _ICONV_UTF8_UTF32BE (iconv_t)(-163)
+# define _ICONV_UTF8_UTF32LE (iconv_t)(-164)
+# define _ICONV_UTF16BE_UTF8 (iconv_t)(-165)
+# define _ICONV_UTF16LE_UTF8 (iconv_t)(-166)
+# define _ICONV_UTF32BE_UTF8 (iconv_t)(-167)
+# define _ICONV_UTF32LE_UTF8 (iconv_t)(-168)
+#endif
+
+#if @REPLACE_ICONV@
+# define iconv rpl_iconv
+extern size_t iconv (iconv_t cd,
+ @ICONV_CONST@ char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft);
+# define iconv_close rpl_iconv_close
+extern int iconv_close (iconv_t cd);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_ICONV_H */
+#endif /* _GL_ICONV_H */
diff --git a/gnulib/lib/iconv_close.c b/gnulib/lib/iconv_close.c
new file mode 100644
index 00000000..9c72380a
--- /dev/null
+++ b/gnulib/lib/iconv_close.c
@@ -0,0 +1,47 @@
+/* Character set conversion.
+ Copyright (C) 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <iconv.h>
+
+#include <stdint.h>
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+int
+rpl_iconv_close (iconv_t cd)
+#undef iconv_close
+{
+#if REPLACE_ICONV_UTF
+ switch ((uintptr_t) cd)
+ {
+ case (uintptr_t) _ICONV_UTF8_UTF16BE:
+ case (uintptr_t) _ICONV_UTF8_UTF16LE:
+ case (uintptr_t) _ICONV_UTF8_UTF32BE:
+ case (uintptr_t) _ICONV_UTF8_UTF32LE:
+ case (uintptr_t) _ICONV_UTF16BE_UTF8:
+ case (uintptr_t) _ICONV_UTF16LE_UTF8:
+ case (uintptr_t) _ICONV_UTF32BE_UTF8:
+ case (uintptr_t) _ICONV_UTF32LE_UTF8:
+ return 0;
+ }
+#endif
+ return iconv_close (cd);
+}
diff --git a/gnulib/lib/iconv_open-aix.gperf b/gnulib/lib/iconv_open-aix.gperf
new file mode 100644
index 00000000..6782b995
--- /dev/null
+++ b/gnulib/lib/iconv_open-aix.gperf
@@ -0,0 +1,44 @@
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On AIX 5.1, look in /usr/lib/nls/loc/uconvTable.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP437, "IBM-437"
+CP850, "IBM-850"
+CP852, "IBM-852"
+CP856, "IBM-856"
+CP857, "IBM-857"
+CP861, "IBM-861"
+CP865, "IBM-865"
+CP869, "IBM-869"
+ISO-8859-13, "IBM-921"
+CP922, "IBM-922"
+CP932, "IBM-932"
+CP943, "IBM-943"
+CP1046, "IBM-1046"
+CP1124, "IBM-1124"
+CP1125, "IBM-1125"
+CP1129, "IBM-1129"
+CP1252, "IBM-1252"
+GB2312, "IBM-eucCN"
+EUC-JP, "IBM-eucJP"
+EUC-KR, "IBM-eucKR"
+EUC-TW, "IBM-eucTW"
+BIG5, "big5"
diff --git a/gnulib/lib/iconv_open-hpux.gperf b/gnulib/lib/iconv_open-hpux.gperf
new file mode 100644
index 00000000..5a35c83e
--- /dev/null
+++ b/gnulib/lib/iconv_open-hpux.gperf
@@ -0,0 +1,56 @@
+struct mapping { int standard_name; const char vendor_name[9 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On HP-UX 11.11, look in /usr/lib/nls/iconv.
+ISO-8859-1, "iso88591"
+ISO-8859-2, "iso88592"
+ISO-8859-5, "iso88595"
+ISO-8859-6, "iso88596"
+ISO-8859-7, "iso88597"
+ISO-8859-8, "iso88598"
+ISO-8859-9, "iso88599"
+ISO-8859-15, "iso885915"
+CP437, "cp437"
+CP775, "cp775"
+CP850, "cp850"
+CP852, "cp852"
+CP855, "cp855"
+CP857, "cp857"
+CP861, "cp861"
+CP862, "cp862"
+CP864, "cp864"
+CP865, "cp865"
+CP866, "cp866"
+CP869, "cp869"
+CP874, "cp874"
+CP1250, "cp1250"
+CP1251, "cp1251"
+CP1252, "cp1252"
+CP1253, "cp1253"
+CP1254, "cp1254"
+CP1255, "cp1255"
+CP1256, "cp1256"
+CP1257, "cp1257"
+CP1258, "cp1258"
+HP-ROMAN8, "roman8"
+HP-ARABIC8, "arabic8"
+HP-GREEK8, "greek8"
+HP-HEBREW8, "hebrew8"
+HP-TURKISH8, "turkish8"
+HP-KANA8, "kana8"
+TIS-620, "tis620"
+GB2312, "hp15CN"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+BIG5, "big5"
+SHIFT_JIS, "sjis"
+UTF-8, "utf8"
diff --git a/gnulib/lib/iconv_open-irix.gperf b/gnulib/lib/iconv_open-irix.gperf
new file mode 100644
index 00000000..3672a801
--- /dev/null
+++ b/gnulib/lib/iconv_open-irix.gperf
@@ -0,0 +1,31 @@
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On IRIX 6.5, look in /usr/lib/iconv and /usr/lib/international/encodings.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+KOI8-R, "KOI8"
+CP855, "DOS855"
+CP1251, "WIN1251"
+GB2312, "eucCN"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+SHIFT_JIS, "sjis"
+TIS-620, "TIS620"
diff --git a/gnulib/lib/iconv_open-osf.gperf b/gnulib/lib/iconv_open-osf.gperf
new file mode 100644
index 00000000..f468ff60
--- /dev/null
+++ b/gnulib/lib/iconv_open-osf.gperf
@@ -0,0 +1,50 @@
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On OSF/1 5.1, look in /usr/lib/nls/loc/iconv.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP437, "cp437"
+CP775, "cp775"
+CP850, "cp850"
+CP852, "cp852"
+CP855, "cp855"
+CP857, "cp857"
+CP861, "cp861"
+CP862, "cp862"
+CP865, "cp865"
+CP866, "cp866"
+CP869, "cp869"
+CP874, "cp874"
+CP949, "KSC5601"
+CP1250, "cp1250"
+CP1251, "cp1251"
+CP1252, "cp1252"
+CP1253, "cp1253"
+CP1254, "cp1254"
+CP1255, "cp1255"
+CP1256, "cp1256"
+CP1257, "cp1257"
+CP1258, "cp1258"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+BIG5, "big5"
+SHIFT_JIS, "SJIS"
+TIS-620, "TACTIS"
diff --git a/gnulib/lib/iconv_open-solaris.gperf b/gnulib/lib/iconv_open-solaris.gperf
new file mode 100644
index 00000000..7d7da38e
--- /dev/null
+++ b/gnulib/lib/iconv_open-solaris.gperf
@@ -0,0 +1,30 @@
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On Solaris 10, look in the "iconv -l" output. Some aliases are advertised but
+# not actually supported by the iconv() function and by the 'iconv' program.
+# For example:
+# $ echo abc | iconv -f 646 -t ISO-8859-1
+# Not supported 646 to ISO-8859-1
+# $ echo abc | iconv -f 646 -t ISO8859-1
+$ abc
+ASCII, "646"
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP1251, "ansi-1251"
diff --git a/gnulib/lib/iconv_open.c b/gnulib/lib/iconv_open.c
new file mode 100644
index 00000000..68e241fa
--- /dev/null
+++ b/gnulib/lib/iconv_open.c
@@ -0,0 +1,173 @@
+/* Character set conversion.
+ Copyright (C) 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <iconv.h>
+
+#include <errno.h>
+#include <string.h>
+#include "c-ctype.h"
+#include "c-strcase.h"
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+/* Namespace cleanliness. */
+#define mapping_lookup rpl_iconv_open_mapping_lookup
+
+/* The macro ICONV_FLAVOR is defined to one of these or undefined. */
+
+#define ICONV_FLAVOR_AIX "iconv_open-aix.h"
+#define ICONV_FLAVOR_HPUX "iconv_open-hpux.h"
+#define ICONV_FLAVOR_IRIX "iconv_open-irix.h"
+#define ICONV_FLAVOR_OSF "iconv_open-osf.h"
+#define ICONV_FLAVOR_SOLARIS "iconv_open-solaris.h"
+
+#ifdef ICONV_FLAVOR
+# include ICONV_FLAVOR
+#endif
+
+iconv_t
+rpl_iconv_open (const char *tocode, const char *fromcode)
+#undef iconv_open
+{
+ char fromcode_upper[32];
+ char tocode_upper[32];
+ char *fromcode_upper_end;
+ char *tocode_upper_end;
+
+#if REPLACE_ICONV_UTF
+ /* Special handling of conversion between UTF-8 and UTF-{16,32}{BE,LE}.
+ Do this here, before calling the real iconv_open(), because OSF/1 5.1
+ iconv() to these encoding inserts a BOM, which is wrong.
+ We do not need to handle conversion between arbitrary encodings and
+ UTF-{16,32}{BE,LE}, because the 'striconveh' module implements two-step
+ conversion throough UTF-8.
+ The _ICONV_* constants are chosen to be disjoint from any iconv_t
+ returned by the system's iconv_open() functions. Recall that iconv_t
+ is a scalar type. */
+ if (c_toupper (fromcode[0]) == 'U'
+ && c_toupper (fromcode[1]) == 'T'
+ && c_toupper (fromcode[2]) == 'F'
+ && fromcode[3] == '-')
+ {
+ if (c_toupper (tocode[0]) == 'U'
+ && c_toupper (tocode[1]) == 'T'
+ && c_toupper (tocode[2]) == 'F'
+ && tocode[3] == '-')
+ {
+ if (strcmp (fromcode + 4, "8") == 0)
+ {
+ if (c_strcasecmp (tocode + 4, "16BE") == 0)
+ return _ICONV_UTF8_UTF16BE;
+ if (c_strcasecmp (tocode + 4, "16LE") == 0)
+ return _ICONV_UTF8_UTF16LE;
+ if (c_strcasecmp (tocode + 4, "32BE") == 0)
+ return _ICONV_UTF8_UTF32BE;
+ if (c_strcasecmp (tocode + 4, "32LE") == 0)
+ return _ICONV_UTF8_UTF32LE;
+ }
+ else if (strcmp (tocode + 4, "8") == 0)
+ {
+ if (c_strcasecmp (fromcode + 4, "16BE") == 0)
+ return _ICONV_UTF16BE_UTF8;
+ if (c_strcasecmp (fromcode + 4, "16LE") == 0)
+ return _ICONV_UTF16LE_UTF8;
+ if (c_strcasecmp (fromcode + 4, "32BE") == 0)
+ return _ICONV_UTF32BE_UTF8;
+ if (c_strcasecmp (fromcode + 4, "32LE") == 0)
+ return _ICONV_UTF32LE_UTF8;
+ }
+ }
+ }
+#endif
+
+ /* Do *not* add special support for 8-bit encodings like ASCII or ISO-8859-1
+ here. This would lead to programs that work in some locales (such as the
+ "C" or "en_US" locales) but do not work in East Asian locales. It is
+ better if programmers make their programs depend on GNU libiconv (except
+ on glibc systems), e.g. by using the AM_ICONV macro and documenting the
+ dependency in an INSTALL or DEPENDENCIES file. */
+
+ /* Try with the original names first.
+ This covers the case when fromcode or tocode is a lowercase encoding name
+ that is understood by the system's iconv_open but not listed in our
+ mappings table. */
+ {
+ iconv_t cd = iconv_open (tocode, fromcode);
+ if (cd != (iconv_t)(-1))
+ return cd;
+ }
+
+ /* Convert the encodings to upper case, because
+ 1. in the arguments of iconv_open() on AIX, HP-UX, and OSF/1 the case
+ matters,
+ 2. it makes searching in the table faster. */
+ {
+ const char *p = fromcode;
+ char *q = fromcode_upper;
+ while ((*q = c_toupper (*p)) != '\0')
+ {
+ p++;
+ q++;
+ if (q == &fromcode_upper[SIZEOF (fromcode_upper)])
+ {
+ errno = EINVAL;
+ return (iconv_t)(-1);
+ }
+ }
+ fromcode_upper_end = q;
+ }
+
+ {
+ const char *p = tocode;
+ char *q = tocode_upper;
+ while ((*q = c_toupper (*p)) != '\0')
+ {
+ p++;
+ q++;
+ if (q == &tocode_upper[SIZEOF (tocode_upper)])
+ {
+ errno = EINVAL;
+ return (iconv_t)(-1);
+ }
+ }
+ tocode_upper_end = q;
+ }
+
+#ifdef ICONV_FLAVOR
+ /* Apply the mappings. */
+ {
+ const struct mapping *m =
+ mapping_lookup (fromcode_upper, fromcode_upper_end - fromcode_upper);
+
+ fromcode = (m != NULL ? m->vendor_name : fromcode_upper);
+ }
+ {
+ const struct mapping *m =
+ mapping_lookup (tocode_upper, tocode_upper_end - tocode_upper);
+
+ tocode = (m != NULL ? m->vendor_name : tocode_upper);
+ }
+#else
+ fromcode = fromcode_upper;
+ tocode = tocode_upper;
+#endif
+
+ return iconv_open (tocode, fromcode);
+}
diff --git a/gnulib/lib/iconveh.h b/gnulib/lib/iconveh.h
new file mode 100644
index 00000000..52adfef7
--- /dev/null
+++ b/gnulib/lib/iconveh.h
@@ -0,0 +1,41 @@
+/* Character set conversion handler type.
+ Copyright (C) 2001-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ 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/>. */
+
+#ifndef _ICONVEH_H
+#define _ICONVEH_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Handling of unconvertible characters. */
+enum iconv_ilseq_handler
+{
+ iconveh_error, /* return and set errno = EILSEQ */
+ iconveh_question_mark, /* use one '?' per unconvertible character */
+ iconveh_escape_sequence /* use escape sequence \uxxxx or \Uxxxxxxxx */
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _ICONVEH_H */
diff --git a/gnulib/lib/idcache.c b/gnulib/lib/idcache.c
new file mode 100644
index 00000000..11c82f01
--- /dev/null
+++ b/gnulib/lib/idcache.c
@@ -0,0 +1,227 @@
+/* idcache.c -- map user and group IDs, cached for speed
+
+ Copyright (C) 1985, 1988-1990, 1997-1998, 2003, 2005-2007, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "idcache.h"
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <pwd.h>
+#include <grp.h>
+
+#include <unistd.h>
+
+#include "xalloc.h"
+
+#ifdef __DJGPP__
+static char digits[] = "0123456789";
+#endif
+
+struct userid
+{
+ union
+ {
+ uid_t u;
+ gid_t g;
+ } id;
+ struct userid *next;
+ char name[FLEXIBLE_ARRAY_MEMBER];
+};
+
+/* FIXME: provide a function to free any malloc'd storage and reset lists,
+ so that an application can use code like this just before exiting:
+ #ifdef lint
+ idcache_clear ();
+ #endif
+*/
+
+static struct userid *user_alist;
+
+/* Each entry on list is a user name for which the first lookup failed. */
+static struct userid *nouser_alist;
+
+/* Use the same struct as for userids. */
+static struct userid *group_alist;
+
+/* Each entry on list is a group name for which the first lookup failed. */
+static struct userid *nogroup_alist;
+
+/* Translate UID to a login name, with cache, or NULL if unresolved. */
+
+char *
+getuser (uid_t uid)
+{
+ struct userid *tail;
+ struct userid *match = NULL;
+
+ for (tail = user_alist; tail; tail = tail->next)
+ {
+ if (tail->id.u == uid)
+ {
+ match = tail;
+ break;
+ }
+ }
+
+ if (match == NULL)
+ {
+ struct passwd *pwent = getpwuid (uid);
+ char const *name = pwent ? pwent->pw_name : "";
+ match = xmalloc (offsetof (struct userid, name) + strlen (name) + 1);
+ match->id.u = uid;
+ strcpy (match->name, name);
+
+ /* Add to the head of the list, so most recently used is first. */
+ match->next = user_alist;
+ user_alist = match;
+ }
+
+ return match->name[0] ? match->name : NULL;
+}
+
+/* Translate USER to a UID, with cache.
+ Return NULL if there is no such user.
+ (We also cache which user names have no passwd entry,
+ so we don't keep looking them up.) */
+
+uid_t *
+getuidbyname (const char *user)
+{
+ struct userid *tail;
+ struct passwd *pwent;
+
+ for (tail = user_alist; tail; tail = tail->next)
+ /* Avoid a function call for the most common case. */
+ if (*tail->name == *user && !strcmp (tail->name, user))
+ return &tail->id.u;
+
+ for (tail = nouser_alist; tail; tail = tail->next)
+ /* Avoid a function call for the most common case. */
+ if (*tail->name == *user && !strcmp (tail->name, user))
+ return NULL;
+
+ pwent = getpwnam (user);
+#ifdef __DJGPP__
+ /* We need to pretend to be the user USER, to make
+ pwd functions know about an arbitrary user name. */
+ if (!pwent && strspn (user, digits) < strlen (user))
+ {
+ setenv ("USER", user, 1);
+ pwent = getpwnam (user); /* now it will succeed */
+ }
+#endif
+
+ tail = xmalloc (offsetof (struct userid, name) + strlen (user) + 1);
+ strcpy (tail->name, user);
+
+ /* Add to the head of the list, so most recently used is first. */
+ if (pwent)
+ {
+ tail->id.u = pwent->pw_uid;
+ tail->next = user_alist;
+ user_alist = tail;
+ return &tail->id.u;
+ }
+
+ tail->next = nouser_alist;
+ nouser_alist = tail;
+ return NULL;
+}
+
+/* Translate GID to a group name, with cache, or NULL if unresolved. */
+
+char *
+getgroup (gid_t gid)
+{
+ struct userid *tail;
+ struct userid *match = NULL;
+
+ for (tail = group_alist; tail; tail = tail->next)
+ {
+ if (tail->id.g == gid)
+ {
+ match = tail;
+ break;
+ }
+ }
+
+ if (match == NULL)
+ {
+ struct group *grent = getgrgid (gid);
+ char const *name = grent ? grent->gr_name : "";
+ match = xmalloc (offsetof (struct userid, name) + strlen (name) + 1);
+ match->id.g = gid;
+ strcpy (match->name, name);
+
+ /* Add to the head of the list, so most recently used is first. */
+ match->next = group_alist;
+ group_alist = match;
+ }
+
+ return match->name[0] ? match->name : NULL;
+}
+
+/* Translate GROUP to a GID, with cache.
+ Return NULL if there is no such group.
+ (We also cache which group names have no group entry,
+ so we don't keep looking them up.) */
+
+gid_t *
+getgidbyname (const char *group)
+{
+ struct userid *tail;
+ struct group *grent;
+
+ for (tail = group_alist; tail; tail = tail->next)
+ /* Avoid a function call for the most common case. */
+ if (*tail->name == *group && !strcmp (tail->name, group))
+ return &tail->id.g;
+
+ for (tail = nogroup_alist; tail; tail = tail->next)
+ /* Avoid a function call for the most common case. */
+ if (*tail->name == *group && !strcmp (tail->name, group))
+ return NULL;
+
+ grent = getgrnam (group);
+#ifdef __DJGPP__
+ /* We need to pretend to belong to group GROUP, to make
+ grp functions know about an arbitrary group name. */
+ if (!grent && strspn (group, digits) < strlen (group))
+ {
+ setenv ("GROUP", group, 1);
+ grent = getgrnam (group); /* now it will succeed */
+ }
+#endif
+
+ tail = xmalloc (offsetof (struct userid, name) + strlen (group) + 1);
+ strcpy (tail->name, group);
+
+ /* Add to the head of the list, so most recently used is first. */
+ if (grent)
+ {
+ tail->id.g = grent->gr_gid;
+ tail->next = group_alist;
+ group_alist = tail;
+ return &tail->id.g;
+ }
+
+ tail->next = nogroup_alist;
+ nogroup_alist = tail;
+ return NULL;
+}
diff --git a/gnulib/lib/idcache.h b/gnulib/lib/idcache.h
new file mode 100644
index 00000000..e7573b83
--- /dev/null
+++ b/gnulib/lib/idcache.h
@@ -0,0 +1,11 @@
+#ifndef IDCACHE_H
+# define IDCACHE_H 1
+
+# include <sys/types.h>
+
+extern char *getuser (uid_t uid);
+extern char *getgroup (gid_t gid);
+extern uid_t *getuidbyname (const char *user);
+extern gid_t *getgidbyname (const char *group);
+
+#endif
diff --git a/gnulib/lib/idpriv-drop.c b/gnulib/lib/idpriv-drop.c
new file mode 100644
index 00000000..30ce5a4f
--- /dev/null
+++ b/gnulib/lib/idpriv-drop.c
@@ -0,0 +1,129 @@
+/* Dropping uid/gid privileges of the current process permanently.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include "idpriv.h"
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int
+idpriv_drop (void)
+{
+#if HAVE_GETUID
+ int uid = getuid ();
+#endif
+#if HAVE_GETGID
+ int gid = getgid ();
+#endif
+
+ /* Drop the gid privilege first, because in some cases the gid privilege
+ cannot be dropped after the uid privilege has been dropped. */
+
+ /* This is for executables that have the setgid bit set. */
+#if HAVE_SETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ /* This code is needed: In particular, on HP-UX 11.11, setregid (gid, gid)
+ may leave the saved gid as 0. See also the comment below regarding
+ setresuid. */
+ if (setresgid (gid, gid, gid) < 0)
+ return -1;
+#elif HAVE_SETREGID /* MacOS X, NetBSD, AIX, IRIX, Solaris, OSF/1, Cygwin */
+ if (setregid (gid, gid) < 0)
+ return -1;
+#elif HAVE_SETEGID /* Solaris 2.4 */
+ if (setegid (gid) < 0)
+ return -1;
+#endif
+
+ /* This is for executables that have the setuid bit set. */
+#if HAVE_SETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ /* On systems which have setresuid(), we use it instead of setreuid(),
+ because
+ <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ says about setreuid(): "The rule by which the saved uid id is modified
+ is complicated." Similarly, <http://unixpapa.com/incnote/setuid.html>
+ says about setreuid(): "What exactly happens to the saved UID when this
+ is used seems to vary a lot." */
+ if (setresuid (uid, uid, uid) < 0)
+ return -1;
+#elif HAVE_SETREUID /* MacOS X, NetBSD, AIX, IRIX, Solaris, OSF/1, Cygwin */
+ if (setreuid (uid, uid) < 0)
+ return -1;
+#elif HAVE_SETEUID /* Solaris 2.4 */
+ if (seteuid (uid) < 0)
+ return -1;
+#endif
+
+ /* Verify that the privileges have really been dropped.
+ This verification is here for security reasons. Doesn't matter if it
+ takes a couple of system calls.
+ On Solaris (which has saved uids and gids but no getresuid, getresgid
+ functions), we could read /proc/<pid>/cred and verify the saved uid and
+ gid found there. But it's not clear to me when to interpret the file as a
+ 'prcred_t' and when as a 'prcred32_t'.
+ <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ section 8.1.3 also recommends to use a setreuid call as a probe, but
+ this call would unexpectedly succeed (and the verification thus fail)
+ on Linux if the process has the CAP_SETUID capability.
+ When the verification fails, it indicates that we need to use different
+ API in the code above. Therefore 'abort ()', not 'return -1'. */
+#if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresuid (&real, &effective, &saved) < 0
+ || real != uid
+ || effective != uid
+ || saved != uid)
+ abort ();
+ }
+#else
+# if HAVE_GETEUID
+ if (geteuid () != uid)
+ abort ();
+# endif
+# if HAVE_GETUID
+ if (getuid () != uid)
+ abort ();
+# endif
+#endif
+#if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ gid_t real;
+ gid_t effective;
+ gid_t saved;
+ if (getresgid (&real, &effective, &saved) < 0
+ || real != gid
+ || effective != gid
+ || saved != gid)
+ abort ();
+ }
+#else
+# if HAVE_GETEGID
+ if (getegid () != gid)
+ abort ();
+# endif
+# if HAVE_GETGID
+ if (getgid () != gid)
+ abort ();
+# endif
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/idpriv-droptemp.c b/gnulib/lib/idpriv-droptemp.c
new file mode 100644
index 00000000..1c19c13d
--- /dev/null
+++ b/gnulib/lib/idpriv-droptemp.c
@@ -0,0 +1,204 @@
+/* Dropping uid/gid privileges of the current process temporarily.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include "idpriv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/* The privileged uid and gid that the process had earlier. */
+#if HAVE_GETUID
+static int saved_uid = -1;
+#endif
+#if HAVE_GETGID
+static int saved_gid = -1;
+#endif
+
+int
+idpriv_temp_drop (void)
+{
+#if HAVE_GETEUID && HAVE_GETEGID && (HAVE_SETRESUID || HAVE_SETREUID) && (HAVE_SETRESGID || HAVE_SETREGID)
+ int uid = getuid ();
+ int gid = getgid ();
+
+ /* Find out about the privileged uid and gid at the first call. */
+ if (saved_uid == -1)
+ saved_uid = geteuid ();
+ if (saved_gid == -1)
+ saved_gid = getegid ();
+
+ /* Drop the gid privilege first, because in some cases the gid privilege
+ cannot be dropped after the uid privilege has been dropped. */
+
+ /* This is for executables that have the setgid bit set. */
+# if HAVE_SETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ if (setresgid (-1, gid, saved_gid) < 0)
+ return -1;
+# else /* MacOS X, NetBSD, AIX, IRIX, Solaris >= 2.5, OSF/1, Cygwin */
+ if (setregid (-1, gid) < 0)
+ return -1;
+# endif
+
+ /* This is for executables that have the setuid bit set. */
+# if HAVE_SETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ /* See <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ figure 14. */
+ if (setresuid (-1, uid, saved_uid) < 0)
+ return -1;
+# else /* MacOS X, NetBSD, AIX, IRIX, Solaris >= 2.5, OSF/1, Cygwin */
+ if (setreuid (-1, uid) < 0)
+ return -1;
+# endif
+
+ /* Verify that the privileges have really been dropped.
+ This verification is here for security reasons. Doesn't matter if it
+ takes a couple of system calls.
+ When the verification fails, it indicates that we need to use different
+ API in the code above. Therefore 'abort ()', not 'return -1'. */
+# if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresuid (&real, &effective, &saved) < 0
+ || real != uid
+ || effective != uid
+ || saved != saved_uid)
+ abort ();
+ }
+# else
+# if HAVE_GETEUID
+ if (geteuid () != uid)
+ abort ();
+# endif
+ if (getuid () != uid)
+ abort ();
+# endif
+# if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresgid (&real, &effective, &saved) < 0
+ || real != gid
+ || effective != gid
+ || saved != saved_gid)
+ abort ();
+ }
+# else
+# if HAVE_GETEGID
+ if (getegid () != gid)
+ abort ();
+# endif
+ if (getgid () != gid)
+ abort ();
+# endif
+
+ return 0;
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+
+int
+idpriv_temp_restore (void)
+{
+#if HAVE_GETEUID && HAVE_GETEGID && (HAVE_SETRESUID || HAVE_SETREUID) && (HAVE_SETRESGID || HAVE_SETREGID)
+ int uid = getuid ();
+ int gid = getgid ();
+
+ if (saved_uid == -1 || saved_gid == -1)
+ /* Caller error: idpriv_temp_drop was never invoked. */
+ abort ();
+
+ /* Acquire the gid privilege last, because in some cases the gid privilege
+ cannot be acquired before the uid privilege has been acquired. */
+
+ /* This is for executables that have the setuid bit set. */
+# if HAVE_SETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ /* See <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ figure 14. */
+ if (setresuid (-1, saved_uid, -1) < 0)
+ return -1;
+# else /* MacOS X, NetBSD, AIX, IRIX, Solaris >= 2.5, OSF/1, Cygwin */
+ if (setreuid (-1, saved_uid) < 0)
+ return -1;
+# endif
+
+ /* This is for executables that have the setgid bit set. */
+# if HAVE_SETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ if (setresgid (-1, saved_gid, -1) < 0)
+ return -1;
+# else /* MacOS X, NetBSD, AIX, IRIX, Solaris >= 2.5, OSF/1, Cygwin */
+ if (setregid (-1, saved_gid) < 0)
+ return -1;
+# endif
+
+ /* Verify that the privileges have really been acquired.
+ This verification is here for security reasons. Doesn't matter if it
+ takes a couple of system calls.
+ When the verification fails, it indicates that we need to use different
+ API in the code above. Therefore 'abort ()', not 'return -1'. */
+# if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresuid (&real, &effective, &saved) < 0
+ || real != uid
+ || effective != saved_uid
+ || saved != saved_uid)
+ abort ();
+ }
+# else
+# if HAVE_GETEUID
+ if (geteuid () != saved_uid)
+ abort ();
+# endif
+ if (getuid () != uid)
+ abort ();
+# endif
+# if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresgid (&real, &effective, &saved) < 0
+ || real != gid
+ || effective != saved_gid
+ || saved != saved_gid)
+ abort ();
+ }
+# else
+# if HAVE_GETEGID
+ if (getegid () != saved_gid)
+ abort ();
+# endif
+ if (getgid () != gid)
+ abort ();
+# endif
+
+ return 0;
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/idpriv.h b/gnulib/lib/idpriv.h
new file mode 100644
index 00000000..eb4d0517
--- /dev/null
+++ b/gnulib/lib/idpriv.h
@@ -0,0 +1,116 @@
+/* Dropping uid/gid privileges of the current process.
+ Copyright (C) 2009, 2010 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/>. */
+
+#ifndef _IDPRIV_H
+#define _IDPRIV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* This module allows programs which are installed with setuid or setgid bit
+ (and which therefore initially run with an effective user id or group id
+ different from the one of the current user) to drop their uid or gid
+ privilege, either permanently or temporarily.
+
+ It is absolutely necessary to minimize the amount of code that is running
+ with escalated privileges (e.g. with effective uid = root). The reason is
+ that any bug or exploit in a part of a program that is running with
+ escalated privileges is a security vulnerability that - upon discovery -
+ puts the users in danger and requires immediate fixing. Then consider that
+ there's a bug every 10 or 20 lines of code on average...
+
+ For programs that temporarily drop privileges but have the ability to
+ restore them later, there are additionally the dangers that
+ - Any bug in the non-privileged part of the program may be used to
+ create invalid data structures that will trigger security
+ vulnerabilities in the privileged part of the program.
+ - Code execution exploits in the non-privileged part of the program may
+ be used to invoke the function that restores high privileges and then
+ execute additional arbitrary code.
+
+ 1) The usual, and reasonably safe, way to minimize the amount of code
+ running with privileges is to create a separate executable, with setuid
+ or setgid bit, that contains only code for the tasks that require
+ privileges (and,of course, strict checking of the arguments, so that the
+ program cannot be abused). The main program is installed without setuid
+ or setgid bit.
+
+ 2) A less safe way is to do some privileged tasks at the beginning of the
+ program's run, and drop privileges permanently as soon as possible.
+
+ Note: There may still be security issues if the privileged task puts
+ sensitive data into the process memory or opens communication channels
+ to restricted facilities.
+
+ 3) The most unsafe way is to drop privileges temporarily for most of the
+ main program but to re-enable them for the duration of privileged tasks.
+
+ As explained above, this approach has uncontrollable dangers for
+ security.
+
+ This approach is normally not usable in multithreaded programs, because
+ you cannot know what kind of system calls the other threads could be
+ doing during the time the privileges are enabled.
+
+ With approach 1, you don't need gnulib modules.
+ With approach 2, you need the gnulib module 'idpriv-drop'.
+ With approach 3, you need the gnulib module 'idpriv-droptemp'. But really,
+ you should better stay away from this approach.
+ */
+
+/* For more in-depth discussion of these topics, see the papers/articles
+ * Hao Chen, David Wagner, Drew Dean: Setuid Demystified
+ <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ * Dan Tsafrir, Dilma da Silva, David Wagner: The Murky Issue of Changing
+ Process Identity: Revising "Setuid Demystified"
+ <http://www.eecs.berkeley.edu/~daw/papers/setuid-login08b.pdf>
+ <http://code.google.com/p/change-process-identity/>
+ * Dhruv Mohindra: Observe correct revocation order while relinquishing
+ privileges
+ <https://www.securecoding.cert.org/confluence/display/seccode/POS36-C.+Observe+correct+revocation+order+while+relinquishing+privileges>
+ */
+
+
+/* For approach 2. */
+
+/* Drop the uid and gid privileges of the current process.
+ Return 0 if successful, or -1 with errno set upon failure. The recommended
+ handling of failure is to terminate the process. */
+extern int idpriv_drop (void);
+
+
+/* For approach 3. */
+
+/* Drop the uid and gid privileges of the current process in a way that allows
+ them to be restored later.
+ Return 0 if successful, or -1 with errno set upon failure. The recommended
+ handling of failure is to terminate the process. */
+extern int idpriv_temp_drop (void);
+
+/* Restore the uid and gid privileges of the current process.
+ Return 0 if successful, or -1 with errno set upon failure. The recommended
+ handling of failure is to not perform the actions that require the escalated
+ privileges. */
+extern int idpriv_temp_restore (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _IDPRIV_H */
diff --git a/gnulib/lib/ignore-value.h b/gnulib/lib/ignore-value.h
new file mode 100644
index 00000000..2eb6918d
--- /dev/null
+++ b/gnulib/lib/ignore-value.h
@@ -0,0 +1,37 @@
+/* ignore a function return without a compiler warning
+
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+/* Use these functions to avoid a warning when using a function declared with
+ gcc's warn_unused_result attribute, but for which you really do want to
+ ignore the result. Traditionally, people have used a "(void)" cast to
+ indicate that a function's return value is deliberately unused. However,
+ if the function is declared with __attribute__((warn_unused_result)),
+ gcc issues a warning even with the cast.
+
+ Caution: most of the time, you really should heed gcc's warning, and
+ check the return value. However, in those exceptional cases in which
+ you're sure you know what you're doing, use this function.
+
+ For the record, here's one of the ignorable warnings:
+ "copy.c:233: warning: ignoring return value of 'fchown',
+ declared with attribute warn_unused_result". */
+
+static inline void ignore_value (int i) { (void) i; }
+static inline void ignore_ptr (void* p) { (void) p; }
+/* FIXME: what about aggregate types? */
diff --git a/gnulib/lib/imaxabs.c b/gnulib/lib/imaxabs.c
new file mode 100644
index 00000000..b09ce593
--- /dev/null
+++ b/gnulib/lib/imaxabs.c
@@ -0,0 +1,26 @@
+/* imaxabs() function: absolute value of 'intmax_t'.
+ Copyright (C) 2006, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <inttypes.h>
+
+intmax_t
+imaxabs (intmax_t x)
+{
+ return (x >= 0 ? x : - x);
+}
diff --git a/gnulib/lib/imaxdiv.c b/gnulib/lib/imaxdiv.c
new file mode 100644
index 00000000..88bee2f5
--- /dev/null
+++ b/gnulib/lib/imaxdiv.c
@@ -0,0 +1,63 @@
+/* imaxdiv() function: division of 'intmax_t'.
+ Copyright (C) 2006, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <inttypes.h>
+
+#include <stdlib.h>
+
+imaxdiv_t
+imaxdiv (intmax_t numer, intmax_t denom)
+{
+ imaxdiv_t result;
+
+ result.quot = numer / denom;
+ result.rem = numer % denom;
+
+ /* Verify the requirements of ISO C 99 section 6.5.5 paragraph 6:
+ "When integers are divided, the result of the / operator is the
+ algebraic quotient with any fractional part discarded. (This is
+ often called "truncation toward zero".) If the quotient a/b is
+ representable, the expression (a/b)*b + a%b shall equal a." */
+ if (!(denom == 0
+ || (INTMAX_MIN + INTMAX_MAX < 0
+ && denom == -1
+ && numer < - INTMAX_MAX)))
+ {
+ if (!(result.quot * denom + result.rem == numer))
+ /* The compiler's implementation of / and % is broken. */
+ abort ();
+ if (!(numer >= 0
+ ? result.rem >= 0
+ && (denom >= 0
+ ? result.rem < denom
+ : /* Don't write result.rem < - denom,
+ as it gives integer overflow if denom == INTMAX_MIN. */
+ - result.rem > denom)
+ : result.rem <= 0
+ && (denom >= 0
+ ? result.rem > - denom
+ : result.rem > denom)))
+ /* The compiler's implementation of / and % may be ok according to
+ C89, but not to C99. Please report this to <bug-gnulib@ngu.org>.
+ This might be a big portability problem. */
+ abort ();
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/imaxtostr.c b/gnulib/lib/imaxtostr.c
new file mode 100644
index 00000000..34ef96c4
--- /dev/null
+++ b/gnulib/lib/imaxtostr.c
@@ -0,0 +1,4 @@
+#define inttostr imaxtostr
+#define inttype intmax_t
+#define inttype_is_signed 1
+#include "inttostr.c"
diff --git a/gnulib/lib/inet_ntop.c b/gnulib/lib/inet_ntop.c
new file mode 100644
index 00000000..2251aaa0
--- /dev/null
+++ b/gnulib/lib/inet_ntop.c
@@ -0,0 +1,234 @@
+/* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form
+
+ Copyright (C) 2005-2006, 2008-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/*
+ * Copyright (c) 1996-1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <arpa/inet.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#define NS_IN6ADDRSZ 16
+#define NS_INT16SZ 2
+
+/*
+ * WARNING: Don't even consider trying to compile this on a system where
+ * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
+ */
+typedef int verify_int_size[2 * sizeof (int) - 7];
+
+static const char *inet_ntop4 (const unsigned char *src, char *dst, socklen_t size);
+#if HAVE_IPV6
+static const char *inet_ntop6 (const unsigned char *src, char *dst, socklen_t size);
+#endif
+
+
+/* char *
+ * inet_ntop(af, src, dst, size)
+ * convert a network format address to presentation format.
+ * return:
+ * pointer to presentation format address (`dst'), or NULL (see errno).
+ * author:
+ * Paul Vixie, 1996.
+ */
+const char *
+inet_ntop (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+{
+ switch (af)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+ return (inet_ntop4 (src, dst, cnt));
+#endif
+
+#if HAVE_IPV6
+ case AF_INET6:
+ return (inet_ntop6 (src, dst, cnt));
+#endif
+
+ default:
+ errno = EAFNOSUPPORT;
+ return (NULL);
+ }
+ /* NOTREACHED */
+}
+
+/* const char *
+ * inet_ntop4(src, dst, size)
+ * format an IPv4 address
+ * return:
+ * `dst' (as a const)
+ * notes:
+ * (1) uses no statics
+ * (2) takes a u_char* not an in_addr as input
+ * author:
+ * Paul Vixie, 1996.
+ */
+static const char *
+inet_ntop4 (const unsigned char *src, char *dst, socklen_t size)
+{
+ char tmp[sizeof "255.255.255.255"];
+ int len;
+
+ len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1], src[2], src[3]);
+ if (len < 0)
+ return NULL;
+
+ if (len > size)
+ {
+ errno = ENOSPC;
+ return NULL;
+ }
+
+ return strcpy (dst, tmp);
+}
+
+#if HAVE_IPV6
+
+/* const char *
+ * inet_ntop6(src, dst, size)
+ * convert IPv6 binary address into presentation (printable) format
+ * author:
+ * Paul Vixie, 1996.
+ */
+static const char *
+inet_ntop6 (const unsigned char *src, char *dst, socklen_t size)
+{
+ /*
+ * Note that int32_t and int16_t need only be "at least" large enough
+ * to contain a value of the specified size. On some systems, like
+ * Crays, there is no such thing as an integer variable with 16 bits.
+ * Keep this in mind if you think this function should have been coded
+ * to use pointer overlays. All the world's not a VAX.
+ */
+ char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
+ struct
+ {
+ int base, len;
+ } best, cur;
+ unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];
+ int i;
+
+ /*
+ * Preprocess:
+ * Copy the input (bytewise) array into a wordwise array.
+ * Find the longest run of 0x00's in src[] for :: shorthanding.
+ */
+ memset (words, '\0', sizeof words);
+ for (i = 0; i < NS_IN6ADDRSZ; i += 2)
+ words[i / 2] = (src[i] << 8) | src[i + 1];
+ best.base = -1;
+ cur.base = -1;
+ for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
+ {
+ if (words[i] == 0)
+ {
+ if (cur.base == -1)
+ cur.base = i, cur.len = 1;
+ else
+ cur.len++;
+ }
+ else
+ {
+ if (cur.base != -1)
+ {
+ if (best.base == -1 || cur.len > best.len)
+ best = cur;
+ cur.base = -1;
+ }
+ }
+ }
+ if (cur.base != -1)
+ {
+ if (best.base == -1 || cur.len > best.len)
+ best = cur;
+ }
+ if (best.base != -1 && best.len < 2)
+ best.base = -1;
+
+ /*
+ * Format the result.
+ */
+ tp = tmp;
+ for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
+ {
+ /* Are we inside the best run of 0x00's? */
+ if (best.base != -1 && i >= best.base && i < (best.base + best.len))
+ {
+ if (i == best.base)
+ *tp++ = ':';
+ continue;
+ }
+ /* Are we following an initial run of 0x00s or any real hex? */
+ if (i != 0)
+ *tp++ = ':';
+ /* Is this address an encapsulated IPv4? */
+ if (i == 6 && best.base == 0 &&
+ (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
+ {
+ if (!inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp)))
+ return (NULL);
+ tp += strlen (tp);
+ break;
+ }
+ {
+ int len = sprintf (tp, "%x", words[i]);
+ if (len < 0)
+ return NULL;
+ tp += len;
+ }
+ }
+ /* Was it a trailing run of 0x00's? */
+ if (best.base != -1 && (best.base + best.len) ==
+ (NS_IN6ADDRSZ / NS_INT16SZ))
+ *tp++ = ':';
+ *tp++ = '\0';
+
+ /*
+ * Check for overflow, copy, and we're done.
+ */
+ if ((socklen_t) (tp - tmp) > size)
+ {
+ errno = ENOSPC;
+ return NULL;
+ }
+
+ return strcpy (dst, tmp);
+}
+
+#endif
diff --git a/gnulib/lib/inet_pton.c b/gnulib/lib/inet_pton.c
new file mode 100644
index 00000000..d8a2dee0
--- /dev/null
+++ b/gnulib/lib/inet_pton.c
@@ -0,0 +1,253 @@
+/* inet_pton.c -- convert IPv4 and IPv6 addresses from text to binary form
+
+ Copyright (C) 2006, 2008, 2009, 2010 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/>. */
+
+/*
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <arpa/inet.h>
+
+#include <c-ctype.h>
+#include <string.h>
+#include <errno.h>
+
+#define NS_INADDRSZ 4
+#define NS_IN6ADDRSZ 16
+#define NS_INT16SZ 2
+
+/*
+ * WARNING: Don't even consider trying to compile this on a system where
+ * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
+ */
+
+static int inet_pton4 (const char *src, unsigned char *dst);
+#if HAVE_IPV6
+static int inet_pton6 (const char *src, unsigned char *dst);
+#endif
+
+/* int
+ * inet_pton(af, src, dst)
+ * convert from presentation format (which usually means ASCII printable)
+ * to network format (which is usually some kind of binary format).
+ * return:
+ * 1 if the address was valid for the specified address family
+ * 0 if the address wasn't valid (`dst' is untouched in this case)
+ * -1 if some other error occurred (`dst' is untouched in this case, too)
+ * author:
+ * Paul Vixie, 1996.
+ */
+int
+inet_pton (int af, const char *restrict src, void *restrict dst)
+{
+ switch (af)
+ {
+ case AF_INET:
+ return (inet_pton4 (src, dst));
+
+#if HAVE_IPV6
+ case AF_INET6:
+ return (inet_pton6 (src, dst));
+#endif
+
+ default:
+ errno = EAFNOSUPPORT;
+ return (-1);
+ }
+ /* NOTREACHED */
+}
+
+/* int
+ * inet_pton4(src, dst)
+ * like inet_aton() but without all the hexadecimal, octal (with the
+ * exception of 0) and shorthand.
+ * return:
+ * 1 if `src' is a valid dotted quad, else 0.
+ * notice:
+ * does not touch `dst' unless it's returning 1.
+ * author:
+ * Paul Vixie, 1996.
+ */
+static int
+inet_pton4 (const char *restrict src, unsigned char *restrict dst)
+{
+ int saw_digit, octets, ch;
+ unsigned char tmp[NS_INADDRSZ], *tp;
+
+ saw_digit = 0;
+ octets = 0;
+ *(tp = tmp) = 0;
+ while ((ch = *src++) != '\0')
+ {
+
+ if (ch >= '0' && ch <= '9')
+ {
+ unsigned new = *tp * 10 + (ch - '0');
+
+ if (saw_digit && *tp == 0)
+ return (0);
+ if (new > 255)
+ return (0);
+ *tp = new;
+ if (!saw_digit)
+ {
+ if (++octets > 4)
+ return (0);
+ saw_digit = 1;
+ }
+ }
+ else if (ch == '.' && saw_digit)
+ {
+ if (octets == 4)
+ return (0);
+ *++tp = 0;
+ saw_digit = 0;
+ }
+ else
+ return (0);
+ }
+ if (octets < 4)
+ return (0);
+ memcpy (dst, tmp, NS_INADDRSZ);
+ return (1);
+}
+
+#if HAVE_IPV6
+
+/* int
+ * inet_pton6(src, dst)
+ * convert presentation level address to network order binary form.
+ * return:
+ * 1 if `src' is a valid [RFC1884 2.2] address, else 0.
+ * notice:
+ * (1) does not touch `dst' unless it's returning 1.
+ * (2) :: in a full address is silently ignored.
+ * credit:
+ * inspired by Mark Andrews.
+ * author:
+ * Paul Vixie, 1996.
+ */
+static int
+inet_pton6 (const char *restrict src, unsigned char *restrict dst)
+{
+ static const char xdigits[] = "0123456789abcdef";
+ unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
+ const char *curtok;
+ int ch, saw_xdigit;
+ unsigned val;
+
+ tp = memset (tmp, '\0', NS_IN6ADDRSZ);
+ endp = tp + NS_IN6ADDRSZ;
+ colonp = NULL;
+ /* Leading :: requires some special handling. */
+ if (*src == ':')
+ if (*++src != ':')
+ return (0);
+ curtok = src;
+ saw_xdigit = 0;
+ val = 0;
+ while ((ch = c_tolower (*src++)) != '\0')
+ {
+ const char *pch;
+
+ pch = strchr (xdigits, ch);
+ if (pch != NULL)
+ {
+ val <<= 4;
+ val |= (pch - xdigits);
+ if (val > 0xffff)
+ return (0);
+ saw_xdigit = 1;
+ continue;
+ }
+ if (ch == ':')
+ {
+ curtok = src;
+ if (!saw_xdigit)
+ {
+ if (colonp)
+ return (0);
+ colonp = tp;
+ continue;
+ }
+ else if (*src == '\0')
+ {
+ return (0);
+ }
+ if (tp + NS_INT16SZ > endp)
+ return (0);
+ *tp++ = (u_char) (val >> 8) & 0xff;
+ *tp++ = (u_char) val & 0xff;
+ saw_xdigit = 0;
+ val = 0;
+ continue;
+ }
+ if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
+ inet_pton4 (curtok, tp) > 0)
+ {
+ tp += NS_INADDRSZ;
+ saw_xdigit = 0;
+ break; /* '\0' was seen by inet_pton4(). */
+ }
+ return (0);
+ }
+ if (saw_xdigit)
+ {
+ if (tp + NS_INT16SZ > endp)
+ return (0);
+ *tp++ = (u_char) (val >> 8) & 0xff;
+ *tp++ = (u_char) val & 0xff;
+ }
+ if (colonp != NULL)
+ {
+ /*
+ * Since some memmove()'s erroneously fail to handle
+ * overlapping regions, we'll do the shift by hand.
+ */
+ const int n = tp - colonp;
+ int i;
+
+ if (tp == endp)
+ return (0);
+ for (i = 1; i <= n; i++)
+ {
+ endp[-i] = colonp[n - i];
+ colonp[n - i] = 0;
+ }
+ tp = endp;
+ }
+ if (tp != endp)
+ return (0);
+ memcpy (dst, tmp, NS_IN6ADDRSZ);
+ return (1);
+}
+#endif
diff --git a/gnulib/lib/intprops.h b/gnulib/lib/intprops.h
new file mode 100644
index 00000000..46f4d47d
--- /dev/null
+++ b/gnulib/lib/intprops.h
@@ -0,0 +1,83 @@
+/* intprops.h -- properties of integer types
+
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef GL_INTPROPS_H
+# define GL_INTPROPS_H
+
+# include <limits.h>
+
+/* The extra casts in the following macros work around compiler bugs,
+ e.g., in Cray C 5.0.3.0. */
+
+/* True if the arithmetic type T is an integer type. bool counts as
+ an integer. */
+# define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
+
+/* True if negative values of the signed integer type T use two's
+ complement, ones' complement, or signed magnitude representation,
+ respectively. Much GNU code assumes two's complement, but some
+ people like to be portable to all possible C hosts. */
+# define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+# define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
+# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+
+/* True if the arithmetic type T is signed. */
+# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* The maximum and minimum values for the integer type T. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+# define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+# define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+
+/* Return zero if T can be determined to be an unsigned type.
+ Otherwise, return 1.
+ When compiling with GCC, INT_STRLEN_BOUND uses this macro to obtain a
+ tighter bound. Otherwise, it overestimates the true bound by one byte
+ when applied to unsigned types of size 2, 4, 16, ... bytes.
+ The symbol signed_type_or_expr__ is private to this header file. */
+# if __GNUC__ >= 2
+# define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t))
+# else
+# define signed_type_or_expr__(t) 1
+# endif
+
+/* Bound on length of the string representing an integer type or expression T.
+ Subtract 1 for the sign bit if T is signed; log10 (2.0) < 146/485;
+ add 1 for integer division truncation; add 1 more for a minus sign
+ if needed. */
+# define INT_STRLEN_BOUND(t) \
+ ((sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) * 146 / 485 \
+ + signed_type_or_expr__ (t) + 1)
+
+/* Bound on buffer size needed to represent an integer type or expression T,
+ including the terminating null. */
+# define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
+
+#endif /* GL_INTPROPS_H */
diff --git a/gnulib/lib/inttostr.c b/gnulib/lib/inttostr.c
new file mode 100644
index 00000000..775a2a28
--- /dev/null
+++ b/gnulib/lib/inttostr.c
@@ -0,0 +1,54 @@
+/* inttostr.c -- convert integers to printable strings
+
+ Copyright (C) 2001, 2006, 2008, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert */
+
+#include <config.h>
+
+#include "inttostr.h"
+#include "verify.h"
+
+/* Convert I to a printable string in BUF, which must be at least
+ INT_BUFSIZE_BOUND (INTTYPE) bytes long. Return the address of the
+ printable string, which need not start at BUF. */
+
+char *
+inttostr (inttype i, char *buf)
+{
+ char *p = buf + INT_STRLEN_BOUND (inttype);
+ *p = 0;
+
+ verify (TYPE_SIGNED (inttype) == inttype_is_signed);
+#if inttype_is_signed
+ if (i < 0)
+ {
+ do
+ *--p = '0' - i % 10;
+ while ((i /= 10) != 0);
+
+ *--p = '-';
+ }
+ else
+#endif
+ {
+ do
+ *--p = '0' + i % 10;
+ while ((i /= 10) != 0);
+ }
+
+ return p;
+}
diff --git a/gnulib/lib/inttostr.h b/gnulib/lib/inttostr.h
new file mode 100644
index 00000000..f11a5ff6
--- /dev/null
+++ b/gnulib/lib/inttostr.h
@@ -0,0 +1,45 @@
+/* inttostr.h -- convert integers to printable strings
+
+ Copyright (C) 2001-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert */
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include "intprops.h"
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#if __GNUC_PREREQ (3,4)
+# undef __attribute_warn_unused_result__
+# define __attribute_warn_unused_result__ \
+ __attribute__ ((__warn_unused_result__))
+#else
+# define __attribute_warn_unused_result__ /* empty */
+#endif
+
+char *offtostr (off_t, char *) __attribute_warn_unused_result__;
+char *imaxtostr (intmax_t, char *) __attribute_warn_unused_result__;
+char *umaxtostr (uintmax_t, char *) __attribute_warn_unused_result__;
+char *uinttostr (unsigned int, char *) __attribute_warn_unused_result__;
diff --git a/gnulib/lib/inttypes.in.h b/gnulib/lib/inttypes.in.h
new file mode 100644
index 00000000..a732c697
--- /dev/null
+++ b/gnulib/lib/inttypes.in.h
@@ -0,0 +1,1103 @@
+/* Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Paul Eggert, Bruno Haible, Derek Price.
+ This file is part of gnulib.
+
+ 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/>. */
+
+/*
+ * ISO C 99 <inttypes.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/inttypes.h.html>
+ */
+
+/* Include the original <inttypes.h> if it exists, and if this file
+ has not been included yet or if this file includes gnulib stdint.h
+ which in turn includes this file.
+ The include_next requires a split double-inclusion guard. */
+#if ! defined INTTYPES_H || defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+# if @HAVE_INTTYPES_H@
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+# @INCLUDE_NEXT@ @NEXT_INTTYPES_H@
+# endif
+#endif
+
+#if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+#define INTTYPES_H
+
+/* Include <stdint.h> or the gnulib replacement.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stdint.h>
+#endif
+/* Get CHAR_BIT. */
+#include <limits.h>
+
+#if !(INT_MIN == INT32_MIN && INT_MAX == INT32_MAX)
+# error "This file assumes that 'int' has exactly 32 bits. Please report your platform and compiler to <bug-gnulib@gnu.org>."
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* 7.8.1 Macros for format specifiers */
+
+#if ! defined __cplusplus || defined __STDC_FORMAT_MACROS
+
+# if defined _TNS_R_TARGET
+ /* Tandem NonStop R series and compatible platforms released before
+ July 2005 support %Ld but not %lld. */
+# define _LONG_LONG_FORMAT_PREFIX "L"
+# else
+# define _LONG_LONG_FORMAT_PREFIX "ll"
+# endif
+
+# if !defined PRId8 || @PRI_MACROS_BROKEN@
+# undef PRId8
+# ifdef INT8_MAX
+# define PRId8 "d"
+# endif
+# endif
+# if !defined PRIi8 || @PRI_MACROS_BROKEN@
+# undef PRIi8
+# ifdef INT8_MAX
+# define PRIi8 "i"
+# endif
+# endif
+# if !defined PRIo8 || @PRI_MACROS_BROKEN@
+# undef PRIo8
+# ifdef UINT8_MAX
+# define PRIo8 "o"
+# endif
+# endif
+# if !defined PRIu8 || @PRI_MACROS_BROKEN@
+# undef PRIu8
+# ifdef UINT8_MAX
+# define PRIu8 "u"
+# endif
+# endif
+# if !defined PRIx8 || @PRI_MACROS_BROKEN@
+# undef PRIx8
+# ifdef UINT8_MAX
+# define PRIx8 "x"
+# endif
+# endif
+# if !defined PRIX8 || @PRI_MACROS_BROKEN@
+# undef PRIX8
+# ifdef UINT8_MAX
+# define PRIX8 "X"
+# endif
+# endif
+# if !defined PRId16 || @PRI_MACROS_BROKEN@
+# undef PRId16
+# ifdef INT16_MAX
+# define PRId16 "d"
+# endif
+# endif
+# if !defined PRIi16 || @PRI_MACROS_BROKEN@
+# undef PRIi16
+# ifdef INT16_MAX
+# define PRIi16 "i"
+# endif
+# endif
+# if !defined PRIo16 || @PRI_MACROS_BROKEN@
+# undef PRIo16
+# ifdef UINT16_MAX
+# define PRIo16 "o"
+# endif
+# endif
+# if !defined PRIu16 || @PRI_MACROS_BROKEN@
+# undef PRIu16
+# ifdef UINT16_MAX
+# define PRIu16 "u"
+# endif
+# endif
+# if !defined PRIx16 || @PRI_MACROS_BROKEN@
+# undef PRIx16
+# ifdef UINT16_MAX
+# define PRIx16 "x"
+# endif
+# endif
+# if !defined PRIX16 || @PRI_MACROS_BROKEN@
+# undef PRIX16
+# ifdef UINT16_MAX
+# define PRIX16 "X"
+# endif
+# endif
+# if !defined PRId32 || @PRI_MACROS_BROKEN@
+# undef PRId32
+# ifdef INT32_MAX
+# define PRId32 "d"
+# endif
+# endif
+# if !defined PRIi32 || @PRI_MACROS_BROKEN@
+# undef PRIi32
+# ifdef INT32_MAX
+# define PRIi32 "i"
+# endif
+# endif
+# if !defined PRIo32 || @PRI_MACROS_BROKEN@
+# undef PRIo32
+# ifdef UINT32_MAX
+# define PRIo32 "o"
+# endif
+# endif
+# if !defined PRIu32 || @PRI_MACROS_BROKEN@
+# undef PRIu32
+# ifdef UINT32_MAX
+# define PRIu32 "u"
+# endif
+# endif
+# if !defined PRIx32 || @PRI_MACROS_BROKEN@
+# undef PRIx32
+# ifdef UINT32_MAX
+# define PRIx32 "x"
+# endif
+# endif
+# if !defined PRIX32 || @PRI_MACROS_BROKEN@
+# undef PRIX32
+# ifdef UINT32_MAX
+# define PRIX32 "X"
+# endif
+# endif
+# ifdef INT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
+# define _PRI64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRI64_PREFIX "I64"
+# elif @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRId64 || @PRI_MACROS_BROKEN@
+# undef PRId64
+# define PRId64 _PRI64_PREFIX "d"
+# endif
+# if !defined PRIi64 || @PRI_MACROS_BROKEN@
+# undef PRIi64
+# define PRIi64 _PRI64_PREFIX "i"
+# endif
+# endif
+# ifdef UINT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
+# define _PRIu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRIu64_PREFIX "I64"
+# elif @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRIo64 || @PRI_MACROS_BROKEN@
+# undef PRIo64
+# define PRIo64 _PRIu64_PREFIX "o"
+# endif
+# if !defined PRIu64 || @PRI_MACROS_BROKEN@
+# undef PRIu64
+# define PRIu64 _PRIu64_PREFIX "u"
+# endif
+# if !defined PRIx64 || @PRI_MACROS_BROKEN@
+# undef PRIx64
+# define PRIx64 _PRIu64_PREFIX "x"
+# endif
+# if !defined PRIX64 || @PRI_MACROS_BROKEN@
+# undef PRIX64
+# define PRIX64 _PRIu64_PREFIX "X"
+# endif
+# endif
+
+# if !defined PRIdLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST8
+# define PRIdLEAST8 "d"
+# endif
+# if !defined PRIiLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST8
+# define PRIiLEAST8 "i"
+# endif
+# if !defined PRIoLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST8
+# define PRIoLEAST8 "o"
+# endif
+# if !defined PRIuLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST8
+# define PRIuLEAST8 "u"
+# endif
+# if !defined PRIxLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST8
+# define PRIxLEAST8 "x"
+# endif
+# if !defined PRIXLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST8
+# define PRIXLEAST8 "X"
+# endif
+# if !defined PRIdLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST16
+# define PRIdLEAST16 "d"
+# endif
+# if !defined PRIiLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST16
+# define PRIiLEAST16 "i"
+# endif
+# if !defined PRIoLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST16
+# define PRIoLEAST16 "o"
+# endif
+# if !defined PRIuLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST16
+# define PRIuLEAST16 "u"
+# endif
+# if !defined PRIxLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST16
+# define PRIxLEAST16 "x"
+# endif
+# if !defined PRIXLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST16
+# define PRIXLEAST16 "X"
+# endif
+# if !defined PRIdLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST32
+# define PRIdLEAST32 "d"
+# endif
+# if !defined PRIiLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST32
+# define PRIiLEAST32 "i"
+# endif
+# if !defined PRIoLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST32
+# define PRIoLEAST32 "o"
+# endif
+# if !defined PRIuLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST32
+# define PRIuLEAST32 "u"
+# endif
+# if !defined PRIxLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST32
+# define PRIxLEAST32 "x"
+# endif
+# if !defined PRIXLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST32
+# define PRIXLEAST32 "X"
+# endif
+# ifdef INT64_MAX
+# if !defined PRIdLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST64
+# define PRIdLEAST64 PRId64
+# endif
+# if !defined PRIiLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+# endif
+# endif
+# ifdef UINT64_MAX
+# if !defined PRIoLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+# endif
+# if !defined PRIuLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+# endif
+# if !defined PRIxLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+# endif
+# if !defined PRIXLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+# endif
+# endif
+
+# if !defined PRIdFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIdFAST8 PRId64
+# else
+# define PRIdFAST8 "d"
+# endif
+# endif
+# if !defined PRIiFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIiFAST8 PRIi64
+# else
+# define PRIiFAST8 "i"
+# endif
+# endif
+# if !defined PRIoFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIoFAST8 PRIo64
+# else
+# define PRIoFAST8 "o"
+# endif
+# endif
+# if !defined PRIuFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIuFAST8 PRIu64
+# else
+# define PRIuFAST8 "u"
+# endif
+# endif
+# if !defined PRIxFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIxFAST8 PRIx64
+# else
+# define PRIxFAST8 "x"
+# endif
+# endif
+# if !defined PRIXFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIXFAST8 PRIX64
+# else
+# define PRIXFAST8 "X"
+# endif
+# endif
+# if !defined PRIdFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIdFAST16 PRId64
+# else
+# define PRIdFAST16 "d"
+# endif
+# endif
+# if !defined PRIiFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIiFAST16 PRIi64
+# else
+# define PRIiFAST16 "i"
+# endif
+# endif
+# if !defined PRIoFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIoFAST16 PRIo64
+# else
+# define PRIoFAST16 "o"
+# endif
+# endif
+# if !defined PRIuFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIuFAST16 PRIu64
+# else
+# define PRIuFAST16 "u"
+# endif
+# endif
+# if !defined PRIxFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIxFAST16 PRIx64
+# else
+# define PRIxFAST16 "x"
+# endif
+# endif
+# if !defined PRIXFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIXFAST16 PRIX64
+# else
+# define PRIXFAST16 "X"
+# endif
+# endif
+# if !defined PRIdFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIdFAST32 PRId64
+# else
+# define PRIdFAST32 "d"
+# endif
+# endif
+# if !defined PRIiFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIiFAST32 PRIi64
+# else
+# define PRIiFAST32 "i"
+# endif
+# endif
+# if !defined PRIoFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIoFAST32 PRIo64
+# else
+# define PRIoFAST32 "o"
+# endif
+# endif
+# if !defined PRIuFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIuFAST32 PRIu64
+# else
+# define PRIuFAST32 "u"
+# endif
+# endif
+# if !defined PRIxFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIxFAST32 PRIx64
+# else
+# define PRIxFAST32 "x"
+# endif
+# endif
+# if !defined PRIXFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIXFAST32 PRIX64
+# else
+# define PRIXFAST32 "X"
+# endif
+# endif
+# ifdef INT64_MAX
+# if !defined PRIdFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST64
+# define PRIdFAST64 PRId64
+# endif
+# if !defined PRIiFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST64
+# define PRIiFAST64 PRIi64
+# endif
+# endif
+# ifdef UINT64_MAX
+# if !defined PRIoFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST64
+# define PRIoFAST64 PRIo64
+# endif
+# if !defined PRIuFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST64
+# define PRIuFAST64 PRIu64
+# endif
+# if !defined PRIxFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST64
+# define PRIxFAST64 PRIx64
+# endif
+# if !defined PRIXFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST64
+# define PRIXFAST64 PRIX64
+# endif
+# endif
+
+# if !defined PRIdMAX || @PRI_MACROS_BROKEN@
+# undef PRIdMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define PRIdMAX PRId64
+# else
+# define PRIdMAX "ld"
+# endif
+# endif
+# if !defined PRIiMAX || @PRI_MACROS_BROKEN@
+# undef PRIiMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define PRIiMAX PRIi64
+# else
+# define PRIiMAX "li"
+# endif
+# endif
+# if !defined PRIoMAX || @PRI_MACROS_BROKEN@
+# undef PRIoMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIoMAX PRIo64
+# else
+# define PRIoMAX "lo"
+# endif
+# endif
+# if !defined PRIuMAX || @PRI_MACROS_BROKEN@
+# undef PRIuMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIuMAX PRIu64
+# else
+# define PRIuMAX "lu"
+# endif
+# endif
+# if !defined PRIxMAX || @PRI_MACROS_BROKEN@
+# undef PRIxMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIxMAX PRIx64
+# else
+# define PRIxMAX "lx"
+# endif
+# endif
+# if !defined PRIXMAX || @PRI_MACROS_BROKEN@
+# undef PRIXMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIXMAX PRIX64
+# else
+# define PRIXMAX "lX"
+# endif
+# endif
+
+# if !defined PRIdPTR || @PRI_MACROS_BROKEN@
+# undef PRIdPTR
+# ifdef INTPTR_MAX
+# define PRIdPTR @PRIPTR_PREFIX@ "d"
+# endif
+# endif
+# if !defined PRIiPTR || @PRI_MACROS_BROKEN@
+# undef PRIiPTR
+# ifdef INTPTR_MAX
+# define PRIiPTR @PRIPTR_PREFIX@ "i"
+# endif
+# endif
+# if !defined PRIoPTR || @PRI_MACROS_BROKEN@
+# undef PRIoPTR
+# ifdef UINTPTR_MAX
+# define PRIoPTR @PRIPTR_PREFIX@ "o"
+# endif
+# endif
+# if !defined PRIuPTR || @PRI_MACROS_BROKEN@
+# undef PRIuPTR
+# ifdef UINTPTR_MAX
+# define PRIuPTR @PRIPTR_PREFIX@ "u"
+# endif
+# endif
+# if !defined PRIxPTR || @PRI_MACROS_BROKEN@
+# undef PRIxPTR
+# ifdef UINTPTR_MAX
+# define PRIxPTR @PRIPTR_PREFIX@ "x"
+# endif
+# endif
+# if !defined PRIXPTR || @PRI_MACROS_BROKEN@
+# undef PRIXPTR
+# ifdef UINTPTR_MAX
+# define PRIXPTR @PRIPTR_PREFIX@ "X"
+# endif
+# endif
+
+# if !defined SCNd8 || @PRI_MACROS_BROKEN@
+# undef SCNd8
+# ifdef INT8_MAX
+# define SCNd8 "hhd"
+# endif
+# endif
+# if !defined SCNi8 || @PRI_MACROS_BROKEN@
+# undef SCNi8
+# ifdef INT8_MAX
+# define SCNi8 "hhi"
+# endif
+# endif
+# if !defined SCNo8 || @PRI_MACROS_BROKEN@
+# undef SCNo8
+# ifdef UINT8_MAX
+# define SCNo8 "hho"
+# endif
+# endif
+# if !defined SCNu8 || @PRI_MACROS_BROKEN@
+# undef SCNu8
+# ifdef UINT8_MAX
+# define SCNu8 "hhu"
+# endif
+# endif
+# if !defined SCNx8 || @PRI_MACROS_BROKEN@
+# undef SCNx8
+# ifdef UINT8_MAX
+# define SCNx8 "hhx"
+# endif
+# endif
+# if !defined SCNd16 || @PRI_MACROS_BROKEN@
+# undef SCNd16
+# ifdef INT16_MAX
+# define SCNd16 "hd"
+# endif
+# endif
+# if !defined SCNi16 || @PRI_MACROS_BROKEN@
+# undef SCNi16
+# ifdef INT16_MAX
+# define SCNi16 "hi"
+# endif
+# endif
+# if !defined SCNo16 || @PRI_MACROS_BROKEN@
+# undef SCNo16
+# ifdef UINT16_MAX
+# define SCNo16 "ho"
+# endif
+# endif
+# if !defined SCNu16 || @PRI_MACROS_BROKEN@
+# undef SCNu16
+# ifdef UINT16_MAX
+# define SCNu16 "hu"
+# endif
+# endif
+# if !defined SCNx16 || @PRI_MACROS_BROKEN@
+# undef SCNx16
+# ifdef UINT16_MAX
+# define SCNx16 "hx"
+# endif
+# endif
+# if !defined SCNd32 || @PRI_MACROS_BROKEN@
+# undef SCNd32
+# ifdef INT32_MAX
+# define SCNd32 "d"
+# endif
+# endif
+# if !defined SCNi32 || @PRI_MACROS_BROKEN@
+# undef SCNi32
+# ifdef INT32_MAX
+# define SCNi32 "i"
+# endif
+# endif
+# if !defined SCNo32 || @PRI_MACROS_BROKEN@
+# undef SCNo32
+# ifdef UINT32_MAX
+# define SCNo32 "o"
+# endif
+# endif
+# if !defined SCNu32 || @PRI_MACROS_BROKEN@
+# undef SCNu32
+# ifdef UINT32_MAX
+# define SCNu32 "u"
+# endif
+# endif
+# if !defined SCNx32 || @PRI_MACROS_BROKEN@
+# undef SCNx32
+# ifdef UINT32_MAX
+# define SCNx32 "x"
+# endif
+# endif
+# ifdef INT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
+# define _SCN64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCN64_PREFIX "I64"
+# elif @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNd64 || @PRI_MACROS_BROKEN@
+# undef SCNd64
+# define SCNd64 _SCN64_PREFIX "d"
+# endif
+# if !defined SCNi64 || @PRI_MACROS_BROKEN@
+# undef SCNi64
+# define SCNi64 _SCN64_PREFIX "i"
+# endif
+# endif
+# ifdef UINT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
+# define _SCNu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCNu64_PREFIX "I64"
+# elif @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNo64 || @PRI_MACROS_BROKEN@
+# undef SCNo64
+# define SCNo64 _SCNu64_PREFIX "o"
+# endif
+# if !defined SCNu64 || @PRI_MACROS_BROKEN@
+# undef SCNu64
+# define SCNu64 _SCNu64_PREFIX "u"
+# endif
+# if !defined SCNx64 || @PRI_MACROS_BROKEN@
+# undef SCNx64
+# define SCNx64 _SCNu64_PREFIX "x"
+# endif
+# endif
+
+# if !defined SCNdLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST8
+# define SCNdLEAST8 "hhd"
+# endif
+# if !defined SCNiLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST8
+# define SCNiLEAST8 "hhi"
+# endif
+# if !defined SCNoLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST8
+# define SCNoLEAST8 "hho"
+# endif
+# if !defined SCNuLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST8
+# define SCNuLEAST8 "hhu"
+# endif
+# if !defined SCNxLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST8
+# define SCNxLEAST8 "hhx"
+# endif
+# if !defined SCNdLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST16
+# define SCNdLEAST16 "hd"
+# endif
+# if !defined SCNiLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST16
+# define SCNiLEAST16 "hi"
+# endif
+# if !defined SCNoLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST16
+# define SCNoLEAST16 "ho"
+# endif
+# if !defined SCNuLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST16
+# define SCNuLEAST16 "hu"
+# endif
+# if !defined SCNxLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST16
+# define SCNxLEAST16 "hx"
+# endif
+# if !defined SCNdLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST32
+# define SCNdLEAST32 "d"
+# endif
+# if !defined SCNiLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST32
+# define SCNiLEAST32 "i"
+# endif
+# if !defined SCNoLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST32
+# define SCNoLEAST32 "o"
+# endif
+# if !defined SCNuLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST32
+# define SCNuLEAST32 "u"
+# endif
+# if !defined SCNxLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST32
+# define SCNxLEAST32 "x"
+# endif
+# ifdef INT64_MAX
+# if !defined SCNdLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST64
+# define SCNdLEAST64 SCNd64
+# endif
+# if !defined SCNiLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST64
+# define SCNiLEAST64 SCNi64
+# endif
+# endif
+# ifdef UINT64_MAX
+# if !defined SCNoLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST64
+# define SCNoLEAST64 SCNo64
+# endif
+# if !defined SCNuLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST64
+# define SCNuLEAST64 SCNu64
+# endif
+# if !defined SCNxLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST64
+# define SCNxLEAST64 SCNx64
+# endif
+# endif
+
+# if !defined SCNdFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define SCNdFAST8 SCNd64
+# elif INT_FAST8_MAX == 0x7fff
+# define SCNdFAST8 "hd"
+# elif INT_FAST8_MAX == 0x7f
+# define SCNdFAST8 "hhd"
+# else
+# define SCNdFAST8 "d"
+# endif
+# endif
+# if !defined SCNiFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define SCNiFAST8 SCNi64
+# elif INT_FAST8_MAX == 0x7fff
+# define SCNiFAST8 "hi"
+# elif INT_FAST8_MAX == 0x7f
+# define SCNiFAST8 "hhi"
+# else
+# define SCNiFAST8 "i"
+# endif
+# endif
+# if !defined SCNoFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNoFAST8 SCNo64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNoFAST8 "ho"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNoFAST8 "hho"
+# else
+# define SCNoFAST8 "o"
+# endif
+# endif
+# if !defined SCNuFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNuFAST8 SCNu64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNuFAST8 "hu"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNuFAST8 "hhu"
+# else
+# define SCNuFAST8 "u"
+# endif
+# endif
+# if !defined SCNxFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNxFAST8 SCNx64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNxFAST8 "hx"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNxFAST8 "hhx"
+# else
+# define SCNxFAST8 "x"
+# endif
+# endif
+# if !defined SCNdFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define SCNdFAST16 SCNd64
+# elif INT_FAST16_MAX == 0x7fff
+# define SCNdFAST16 "hd"
+# else
+# define SCNdFAST16 "d"
+# endif
+# endif
+# if !defined SCNiFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define SCNiFAST16 SCNi64
+# elif INT_FAST16_MAX == 0x7fff
+# define SCNiFAST16 "hi"
+# else
+# define SCNiFAST16 "i"
+# endif
+# endif
+# if !defined SCNoFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNoFAST16 SCNo64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNoFAST16 "ho"
+# else
+# define SCNoFAST16 "o"
+# endif
+# endif
+# if !defined SCNuFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNuFAST16 SCNu64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNuFAST16 "hu"
+# else
+# define SCNuFAST16 "u"
+# endif
+# endif
+# if !defined SCNxFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNxFAST16 SCNx64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNxFAST16 "hx"
+# else
+# define SCNxFAST16 "x"
+# endif
+# endif
+# if !defined SCNdFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNdFAST32 SCNd64
+# else
+# define SCNdFAST32 "d"
+# endif
+# endif
+# if !defined SCNiFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNiFAST32 SCNi64
+# else
+# define SCNiFAST32 "i"
+# endif
+# endif
+# if !defined SCNoFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNoFAST32 SCNo64
+# else
+# define SCNoFAST32 "o"
+# endif
+# endif
+# if !defined SCNuFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNuFAST32 SCNu64
+# else
+# define SCNuFAST32 "u"
+# endif
+# endif
+# if !defined SCNxFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNxFAST32 SCNx64
+# else
+# define SCNxFAST32 "x"
+# endif
+# endif
+# ifdef INT64_MAX
+# if !defined SCNdFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST64
+# define SCNdFAST64 SCNd64
+# endif
+# if !defined SCNiFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST64
+# define SCNiFAST64 SCNi64
+# endif
+# endif
+# ifdef UINT64_MAX
+# if !defined SCNoFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST64
+# define SCNoFAST64 SCNo64
+# endif
+# if !defined SCNuFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST64
+# define SCNuFAST64 SCNu64
+# endif
+# if !defined SCNxFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST64
+# define SCNxFAST64 SCNx64
+# endif
+# endif
+
+# if !defined SCNdMAX || @PRI_MACROS_BROKEN@
+# undef SCNdMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define SCNdMAX SCNd64
+# else
+# define SCNdMAX "ld"
+# endif
+# endif
+# if !defined SCNiMAX || @PRI_MACROS_BROKEN@
+# undef SCNiMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define SCNiMAX SCNi64
+# else
+# define SCNiMAX "li"
+# endif
+# endif
+# if !defined SCNoMAX || @PRI_MACROS_BROKEN@
+# undef SCNoMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNoMAX SCNo64
+# else
+# define SCNoMAX "lo"
+# endif
+# endif
+# if !defined SCNuMAX || @PRI_MACROS_BROKEN@
+# undef SCNuMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNuMAX SCNu64
+# else
+# define SCNuMAX "lu"
+# endif
+# endif
+# if !defined SCNxMAX || @PRI_MACROS_BROKEN@
+# undef SCNxMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNxMAX SCNx64
+# else
+# define SCNxMAX "lx"
+# endif
+# endif
+
+# if !defined SCNdPTR || @PRI_MACROS_BROKEN@
+# undef SCNdPTR
+# ifdef INTPTR_MAX
+# define SCNdPTR @PRIPTR_PREFIX@ "d"
+# endif
+# endif
+# if !defined SCNiPTR || @PRI_MACROS_BROKEN@
+# undef SCNiPTR
+# ifdef INTPTR_MAX
+# define SCNiPTR @PRIPTR_PREFIX@ "i"
+# endif
+# endif
+# if !defined SCNoPTR || @PRI_MACROS_BROKEN@
+# undef SCNoPTR
+# ifdef UINTPTR_MAX
+# define SCNoPTR @PRIPTR_PREFIX@ "o"
+# endif
+# endif
+# if !defined SCNuPTR || @PRI_MACROS_BROKEN@
+# undef SCNuPTR
+# ifdef UINTPTR_MAX
+# define SCNuPTR @PRIPTR_PREFIX@ "u"
+# endif
+# endif
+# if !defined SCNxPTR || @PRI_MACROS_BROKEN@
+# undef SCNxPTR
+# ifdef UINTPTR_MAX
+# define SCNxPTR @PRIPTR_PREFIX@ "x"
+# endif
+# endif
+
+#endif
+
+/* 7.8.2 Functions for greatest-width integer types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_IMAXABS@
+# if !@HAVE_DECL_IMAXABS@
+extern intmax_t imaxabs (intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxabs
+# if HAVE_RAW_DECL_IMAXABS
+_GL_WARN_ON_USE (imaxabs, "imaxabs is unportable - "
+ "use gnulib module imaxabs for portability");
+# endif
+#endif
+
+#if @GNULIB_IMAXDIV@
+# if !@HAVE_DECL_IMAXDIV@
+typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t;
+extern imaxdiv_t imaxdiv (intmax_t, intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxdiv
+# if HAVE_RAW_DECL_IMAXDIV
+_GL_WARN_ON_USE (imaxdiv, "imaxdiv is unportable - "
+ "use gnulib module imaxdiv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOIMAX@
+# if !@HAVE_DECL_STRTOIMAX@
+extern intmax_t strtoimax (const char *, char **, int) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoimax
+# if HAVE_RAW_DECL_STRTOIMAX
+_GL_WARN_ON_USE (strtoimax, "strtoimax is unportable - "
+ "use gnulib module strtoimax for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOUMAX@
+# if !@HAVE_DECL_STRTOUMAX@
+extern uintmax_t strtoumax (const char *, char **, int) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoumax
+# if HAVE_RAW_DECL_STRTOUMAX
+_GL_WARN_ON_USE (strtoumax, "strtoumax is unportable - "
+ "use gnulib module strtoumax for portability");
+# endif
+#endif
+
+/* Don't bother defining or declaring wcstoimax and wcstoumax, since
+ wide-character functions like this are hardly ever useful. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !defined INTTYPES_H && !defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H */
diff --git a/gnulib/lib/ioctl.c b/gnulib/lib/ioctl.c
new file mode 100644
index 00000000..de3f82bd
--- /dev/null
+++ b/gnulib/lib/ioctl.c
@@ -0,0 +1,51 @@
+/* ioctl.c --- wrappers for Windows ioctl function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#include <sys/ioctl.h>
+
+#include <stdarg.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+int
+rpl_ioctl (int fd, int req, ...)
+{
+ void *buf;
+ va_list args;
+ SOCKET sock;
+ int r;
+
+ va_start (args, req);
+ buf = va_arg (args, void *);
+ va_end (args);
+
+ sock = FD_TO_SOCKET (fd);
+ r = ioctlsocket (sock, req, buf);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/isapipe.c b/gnulib/lib/isapipe.c
new file mode 100644
index 00000000..b8db8600
--- /dev/null
+++ b/gnulib/lib/isapipe.c
@@ -0,0 +1,119 @@
+/* Test whether a file descriptor is a pipe.
+
+ Copyright (C) 2006, 2008-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "isapipe.h"
+
+#include <errno.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Windows platforms. */
+
+/* Get _get_osfhandle. */
+# include <io.h>
+
+/* Get GetFileType. */
+# include <windows.h>
+
+int
+isapipe (int fd)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ return (GetFileType (h) == FILE_TYPE_PIPE);
+}
+
+#else
+/* Unix platforms. */
+
+# include <stdbool.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <unistd.h>
+
+/* The maximum link count for pipes; (nlink_t) -1 if not known. */
+# ifndef PIPE_LINK_COUNT_MAX
+# define PIPE_LINK_COUNT_MAX ((nlink_t) (-1))
+# endif
+
+/* Return 1 if FD is a pipe, 0 if not, -1 (setting errno) on error.
+
+ Test fairly strictly whether FD is a pipe. lseek and checking for
+ ESPIPE does not suffice, since many non-pipe files cause lseek to
+ fail with errno == ESPIPE. */
+
+int
+isapipe (int fd)
+{
+ nlink_t pipe_link_count_max = PIPE_LINK_COUNT_MAX;
+ bool check_for_fifo = (HAVE_FIFO_PIPES == 1);
+ struct stat st;
+ int fstat_result = fstat (fd, &st);
+
+ if (fstat_result != 0)
+ return fstat_result;
+
+ /* We want something that succeeds only for pipes, but on
+ POSIX-conforming hosts S_ISFIFO succeeds for both FIFOs and pipes
+ and we know of no portable, reliable way to distinguish them in
+ general. However, in practice pipes always have a link count <=
+ PIPE_LINK_COUNT_MAX (unless someone attaches them to the file
+ system name space using fattach, in which case they're not really
+ pipes any more), so test for that as well.
+
+ On Darwin 7.7, pipes are sockets, so check for those instead. */
+
+ if (! ((HAVE_FIFO_PIPES == 0 || HAVE_FIFO_PIPES == 1)
+ && PIPE_LINK_COUNT_MAX != (nlink_t) -1)
+ && (S_ISFIFO (st.st_mode) | S_ISSOCK (st.st_mode)))
+ {
+ int fd_pair[2];
+ int pipe_result = pipe (fd_pair);
+ if (pipe_result != 0)
+ return pipe_result;
+ else
+ {
+ struct stat pipe_st;
+ int fstat_pipe_result = fstat (fd_pair[0], &pipe_st);
+ int fstat_pipe_errno = errno;
+ close (fd_pair[0]);
+ close (fd_pair[1]);
+ if (fstat_pipe_result != 0)
+ {
+ errno = fstat_pipe_errno;
+ return fstat_pipe_result;
+ }
+ check_for_fifo = (S_ISFIFO (pipe_st.st_mode) != 0);
+ pipe_link_count_max = pipe_st.st_nlink;
+ }
+ }
+
+ return
+ (st.st_nlink <= pipe_link_count_max
+ && (check_for_fifo ? S_ISFIFO (st.st_mode) : S_ISSOCK (st.st_mode)));
+}
+
+#endif
diff --git a/gnulib/lib/isapipe.h b/gnulib/lib/isapipe.h
new file mode 100644
index 00000000..c108e308
--- /dev/null
+++ b/gnulib/lib/isapipe.h
@@ -0,0 +1,6 @@
+/* Whether pipes are FIFOs; -1 if not known. */
+#ifndef HAVE_FIFO_PIPES
+# define HAVE_FIFO_PIPES (-1)
+#endif
+
+int isapipe (int fd);
diff --git a/gnulib/lib/isblank.c b/gnulib/lib/isblank.c
new file mode 100644
index 00000000..e4cddac2
--- /dev/null
+++ b/gnulib/lib/isblank.c
@@ -0,0 +1,33 @@
+/* Test whether a character is a blank.
+
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <ctype.h>
+
+int
+isblank (int c)
+{
+ /* On all known platforms, in all predefined locales, isblank(c) is likely
+ equivalent with (c == ' ' || c == '\t'). Look at the glibc definition
+ (in glibc/localedata/locales/i18n): The "blank" characters are '\t', ' ',
+ U+1680, U+180E, U+2000..U+2006, U+2008..U+200A, U+205F, U+3000, and none
+ except the first two is present in a common 8-bit encoding. Therefore
+ the substitute for other platforms is not more complicated than this. */
+ return (c == ' ' || c == '\t');
+}
diff --git a/gnulib/lib/isdir.c b/gnulib/lib/isdir.c
new file mode 100644
index 00000000..c1430cc6
--- /dev/null
+++ b/gnulib/lib/isdir.c
@@ -0,0 +1,33 @@
+/* isdir.c -- determine whether a directory exists
+
+ Copyright (C) 1990, 1998, 2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "isdir.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* If PATH is an existing directory or symbolic link to a directory,
+ return nonzero, else 0. */
+int
+isdir (const char *path)
+{
+ struct stat stats;
+
+ return stat (path, &stats) == 0 && S_ISDIR (stats.st_mode);
+}
diff --git a/gnulib/lib/isdir.h b/gnulib/lib/isdir.h
new file mode 100644
index 00000000..80116bc6
--- /dev/null
+++ b/gnulib/lib/isdir.h
@@ -0,0 +1 @@
+int isdir (const char *path);
diff --git a/gnulib/lib/isfinite.c b/gnulib/lib/isfinite.c
new file mode 100644
index 00000000..fd0d0039
--- /dev/null
+++ b/gnulib/lib/isfinite.c
@@ -0,0 +1,39 @@
+/* Test for finite value (zero, subnormal, or normal, and not infinite or NaN).
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2007. */
+
+#include <config.h>
+
+#include "isnanf-nolibm.h"
+#include "isnand-nolibm.h"
+#include "isnanl-nolibm.h"
+
+int gl_isfinitef (float x)
+{
+ return !isnanf (x) && x - x == 0.f;
+}
+
+int gl_isfinited (double x)
+{
+ return !isnand (x) && x - x == 0.;
+}
+
+int gl_isfinitel (long double x)
+{
+ return !isnanl (x) && x - x == 0.L;
+}
diff --git a/gnulib/lib/isinf.c b/gnulib/lib/isinf.c
new file mode 100644
index 00000000..44a97945
--- /dev/null
+++ b/gnulib/lib/isinf.c
@@ -0,0 +1,37 @@
+/* Test for positive or negative infinity.
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2008. */
+
+#include <config.h>
+
+#include <float.h>
+
+int gl_isinff (float x)
+{
+ return x < -FLT_MAX || x > FLT_MAX;
+}
+
+int gl_isinfd (double x)
+{
+ return x < -DBL_MAX || x > DBL_MAX;
+}
+
+int gl_isinfl (long double x)
+{
+ return x < -LDBL_MAX || x > LDBL_MAX;
+}
diff --git a/gnulib/lib/isnan.c b/gnulib/lib/isnan.c
new file mode 100644
index 00000000..ee9fa8b6
--- /dev/null
+++ b/gnulib/lib/isnan.c
@@ -0,0 +1,173 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef USE_LONG_DOUBLE
+/* Specification found in math.h or isnanl-nolibm.h. */
+extern int rpl_isnanl (long double x);
+#elif ! defined USE_FLOAT
+/* Specification found in math.h or isnand-nolibm.h. */
+extern int rpl_isnand (double x);
+#else /* defined USE_FLOAT */
+/* Specification found in math.h or isnanf-nolibm.h. */
+extern int rpl_isnanf (float x);
+#endif
+
+#include <float.h>
+#include <string.h>
+
+#include "float+.h"
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC rpl_isnanl
+# define DOUBLE long double
+# define MAX_EXP LDBL_MAX_EXP
+# define MIN_EXP LDBL_MIN_EXP
+# if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD LDBL_EXPBIT0_WORD
+# define EXPBIT0_BIT LDBL_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_LDBL
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC rpl_isnand
+# define DOUBLE double
+# define MAX_EXP DBL_MAX_EXP
+# define MIN_EXP DBL_MIN_EXP
+# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD DBL_EXPBIT0_WORD
+# define EXPBIT0_BIT DBL_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_DBL
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC rpl_isnanf
+# define DOUBLE float
+# define MAX_EXP FLT_MAX_EXP
+# define MIN_EXP FLT_MIN_EXP
+# if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD FLT_EXPBIT0_WORD
+# define EXPBIT0_BIT FLT_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_FLT
+# define L_(literal) literal##f
+#endif
+
+#define EXP_MASK ((MAX_EXP - MIN_EXP) | 7)
+
+#define NWORDS \
+ ((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double;
+
+int
+FUNC (DOUBLE x)
+{
+#ifdef KNOWN_EXPBIT0_LOCATION
+# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ /* Special CPU dependent code is needed to treat bit patterns outside the
+ IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals) as NaNs.
+ These bit patterns are:
+ - exponent = 0x0001..0x7FFF, mantissa bit 63 = 0,
+ - exponent = 0x0000, mantissa bit 63 = 1.
+ The NaN bit pattern is:
+ - exponent = 0x7FFF, mantissa >= 0x8000000000000001. */
+ memory_double m;
+ unsigned int exponent;
+
+ m.value = x;
+ exponent = (m.word[EXPBIT0_WORD] >> EXPBIT0_BIT) & EXP_MASK;
+# ifdef WORDS_BIGENDIAN
+ /* Big endian: EXPBIT0_WORD = 0, EXPBIT0_BIT = 16. */
+ if (exponent == 0)
+ return 1 & (m.word[0] >> 15);
+ else if (exponent == EXP_MASK)
+ return (((m.word[0] ^ 0x8000U) << 16) | m.word[1] | (m.word[2] >> 16)) != 0;
+ else
+ return 1 & ~(m.word[0] >> 15);
+# else
+ /* Little endian: EXPBIT0_WORD = 2, EXPBIT0_BIT = 0. */
+ if (exponent == 0)
+ return (m.word[1] >> 31);
+ else if (exponent == EXP_MASK)
+ return ((m.word[1] ^ 0x80000000U) | m.word[0]) != 0;
+ else
+ return (m.word[1] >> 31) ^ 1;
+# endif
+# else
+ /* Be careful to not do any floating-point operation on x, such as x == x,
+ because x may be a signaling NaN. */
+# if defined __SUNPRO_C || defined __DECC || (defined __sgi && !defined __GNUC__)
+ /* The Sun C 5.0 compilers and the Compaq (ex-DEC) 6.4 compilers don't
+ recognize the initializers as constant expressions. The latter compiler
+ also fails when constant-folding 0.0 / 0.0 even when constant-folding is
+ not required. The SGI MIPSpro C compiler complains about "floating-point
+ operation result is out of range". */
+ static DOUBLE zero = L_(0.0);
+ memory_double nan;
+ DOUBLE plus_inf = L_(1.0) / L_(0.0);
+ DOUBLE minus_inf = -L_(1.0) / L_(0.0);
+ nan.value = zero / zero;
+# else
+ static memory_double nan = { L_(0.0) / L_(0.0) };
+ static DOUBLE plus_inf = L_(1.0) / L_(0.0);
+ static DOUBLE minus_inf = -L_(1.0) / L_(0.0);
+# endif
+ {
+ memory_double m;
+
+ /* A NaN can be recognized through its exponent. But exclude +Infinity and
+ -Infinity, which have the same exponent. */
+ m.value = x;
+ if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD])
+ & (EXP_MASK << EXPBIT0_BIT))
+ == 0)
+ return (memcmp (&m.value, &plus_inf, SIZE) != 0
+ && memcmp (&m.value, &minus_inf, SIZE) != 0);
+ else
+ return 0;
+ }
+# endif
+#else
+ /* The configuration did not find sufficient information. Give up about
+ the signaling NaNs, handle only the quiet NaNs. */
+ if (x == x)
+ {
+# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ /* Detect any special bit patterns that pass ==; see comment above. */
+ memory_double m1;
+ memory_double m2;
+
+ memset (&m1.value, 0, SIZE);
+ memset (&m2.value, 0, SIZE);
+ m1.value = x;
+ m2.value = x + (x ? 0.0L : -0.0L);
+ if (memcmp (&m1.value, &m2.value, SIZE) != 0)
+ return 1;
+# endif
+ return 0;
+ }
+ else
+ return 1;
+#endif
+}
diff --git a/gnulib/lib/isnand-nolibm.h b/gnulib/lib/isnand-nolibm.h
new file mode 100644
index 00000000..bcf6b85a
--- /dev/null
+++ b/gnulib/lib/isnand-nolibm.h
@@ -0,0 +1,33 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2010 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/>. */
+
+#if HAVE_ISNAND_IN_LIBC
+/* Get declaration of isnan macro. */
+# include <math.h>
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnand
+# define isnand(x) __builtin_isnan ((double)(x))
+# else
+# undef isnand
+# define isnand(x) isnan ((double)(x))
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnand
+# define isnand rpl_isnand
+extern int isnand (double x);
+#endif
diff --git a/gnulib/lib/isnand.c b/gnulib/lib/isnand.c
new file mode 100644
index 00000000..de026def
--- /dev/null
+++ b/gnulib/lib/isnand.c
@@ -0,0 +1,19 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include "isnan.c"
diff --git a/gnulib/lib/isnanf-nolibm.h b/gnulib/lib/isnanf-nolibm.h
new file mode 100644
index 00000000..4f90031f
--- /dev/null
+++ b/gnulib/lib/isnanf-nolibm.h
@@ -0,0 +1,33 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2010 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/>. */
+
+#if HAVE_ISNANF_IN_LIBC
+/* Get declaration of isnan macro or (older) isnanf function. */
+# include <math.h>
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanf
+# define isnanf(x) __builtin_isnanf ((float)(x))
+# elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnanf
+# define isnanf rpl_isnanf
+extern int isnanf (float x);
+#endif
diff --git a/gnulib/lib/isnanf.c b/gnulib/lib/isnanf.c
new file mode 100644
index 00000000..4f2e5abc
--- /dev/null
+++ b/gnulib/lib/isnanf.c
@@ -0,0 +1,20 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "isnan.c"
diff --git a/gnulib/lib/isnanl-nolibm.h b/gnulib/lib/isnanl-nolibm.h
new file mode 100644
index 00000000..3dbba8bc
--- /dev/null
+++ b/gnulib/lib/isnanl-nolibm.h
@@ -0,0 +1,33 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2010 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/>. */
+
+#if HAVE_ISNANL_IN_LIBC
+/* Get declaration of isnan macro or (older) isnanl function. */
+# include <math.h>
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanl
+# define isnanl(x) __builtin_isnanl ((long double)(x))
+# elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnanl
+# define isnanl rpl_isnanl
+extern int isnanl (long double x);
+#endif
diff --git a/gnulib/lib/isnanl.c b/gnulib/lib/isnanl.c
new file mode 100644
index 00000000..9594801f
--- /dev/null
+++ b/gnulib/lib/isnanl.c
@@ -0,0 +1,20 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_LONG_DOUBLE
+#include "isnan.c"
diff --git a/gnulib/lib/javacomp.c b/gnulib/lib/javacomp.c
new file mode 100644
index 00000000..0bd5ec5d
--- /dev/null
+++ b/gnulib/lib/javacomp.c
@@ -0,0 +1,2355 @@
+/* Compile a Java program.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "javacomp.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "javaversion.h"
+#include "execute.h"
+#include "pipe.h"
+#include "wait-process.h"
+#include "classpath.h"
+#include "xsetenv.h"
+#include "sh-quote.h"
+#include "binary-io.h"
+#include "safe-read.h"
+#include "xalloc.h"
+#include "xmalloca.h"
+#include "concat-filename.h"
+#include "fwriteerror.h"
+#include "clean-temp.h"
+#include "error.h"
+#include "xvasprintf.h"
+#include "c-strstr.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+
+/* Survey of Java compilers.
+
+ A = does it work without CLASSPATH being set
+ C = option to set CLASSPATH, other than setting it in the environment
+ O = option for optimizing
+ g = option for debugging
+ T = test for presence
+
+ Program from A C O g T
+
+ $JAVAC unknown N n/a -O -g true
+ gcj -C GCC 3.2 Y --classpath=P -O -g gcj --version | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null
+ javac JDK 1.1.8 Y -classpath P -O -g javac 2>/dev/null; test $? = 1
+ javac JDK 1.3.0 Y -classpath P -O -g javac 2>/dev/null; test $? -le 2
+ jikes Jikes 1.14 N -classpath P -O -g jikes 2>/dev/null; test $? = 1
+
+ All compilers support the option "-d DIRECTORY" for the base directory
+ of the classes to be written.
+
+ The CLASSPATH is a colon separated list of pathnames. (On Windows: a
+ semicolon separated list of pathnames.)
+
+ We try the Java compilers in the following order:
+ 1. getenv ("JAVAC"), because the user must be able to override our
+ preferences,
+ 2. "gcj -C", because it is a completely free compiler,
+ 3. "javac", because it is a standard compiler,
+ 4. "jikes", comes last because it has some deviating interpretation
+ of the Java Language Specification and because it requires a
+ CLASSPATH environment variable.
+
+ We unset the JAVA_HOME environment variable, because a wrong setting of
+ this variable can confuse the JDK's javac.
+ */
+
+/* Return the default target_version. */
+static const char *
+default_target_version (void)
+{
+ /* Use a cache. Assumes that the PATH environment variable doesn't change
+ during the lifetime of the program. */
+ static const char *java_version_cache;
+ if (java_version_cache == NULL)
+ {
+ /* Determine the version from the found JVM. */
+ java_version_cache = javaexec_version ();
+ if (java_version_cache == NULL
+ || !(java_version_cache[0] == '1' && java_version_cache[1] == '.'
+ && (java_version_cache[2] >= '1' && java_version_cache[2] <= '6')
+ && java_version_cache[3] == '\0'))
+ java_version_cache = "1.1";
+ }
+ return java_version_cache;
+}
+
+/* ======================= Source version dependent ======================= */
+
+/* Convert a source version to an index. */
+#define SOURCE_VERSION_BOUND 3 /* exclusive upper bound */
+static unsigned int
+source_version_index (const char *source_version)
+{
+ if (source_version[0] == '1' && source_version[1] == '.'
+ && (source_version[2] >= '3' && source_version[2] <= '5')
+ && source_version[3] == '\0')
+ return source_version[2] - '3';
+ error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
+ return 0;
+}
+
+/* Return a snippet of code that should compile in the given source version. */
+static const char *
+get_goodcode_snippet (const char *source_version)
+{
+ if (strcmp (source_version, "1.3") == 0)
+ return "class conftest {}\n";
+ if (strcmp (source_version, "1.4") == 0)
+ return "class conftest { static { assert(true); } }\n";
+ if (strcmp (source_version, "1.5") == 0)
+ return "class conftest<T> { T foo() { return null; } }\n";
+ error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
+ return NULL;
+}
+
+/* Return a snippet of code that should fail to compile in the given source
+ version, or NULL (standing for a snippet that would fail to compile with
+ any compiler). */
+static const char *
+get_failcode_snippet (const char *source_version)
+{
+ if (strcmp (source_version, "1.3") == 0)
+ return "class conftestfail { static { assert(true); } }\n";
+ if (strcmp (source_version, "1.4") == 0)
+ return "class conftestfail<T> { T foo() { return null; } }\n";
+ if (strcmp (source_version, "1.5") == 0)
+ return NULL;
+ error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
+ return NULL;
+}
+
+/* ======================= Target version dependent ======================= */
+
+/* Convert a target version to an index. */
+#define TARGET_VERSION_BOUND 6 /* exclusive upper bound */
+static unsigned int
+target_version_index (const char *target_version)
+{
+ if (target_version[0] == '1' && target_version[1] == '.'
+ && (target_version[2] >= '1' && target_version[2] <= '6')
+ && target_version[3] == '\0')
+ return target_version[2] - '1';
+ error (EXIT_FAILURE, 0, _("invalid target_version argument to compile_java_class"));
+ return 0;
+}
+
+/* Return the class file version number corresponding to a given target
+ version. */
+static int
+corresponding_classfile_version (const char *target_version)
+{
+ if (strcmp (target_version, "1.1") == 0)
+ return 45;
+ if (strcmp (target_version, "1.2") == 0)
+ return 46;
+ if (strcmp (target_version, "1.3") == 0)
+ return 47;
+ if (strcmp (target_version, "1.4") == 0)
+ return 48;
+ if (strcmp (target_version, "1.5") == 0)
+ return 49;
+ if (strcmp (target_version, "1.6") == 0)
+ return 50;
+ error (EXIT_FAILURE, 0, _("invalid target_version argument to compile_java_class"));
+ return 0;
+}
+
+/* ======================== Compilation subroutines ======================== */
+
+/* Try to compile a set of Java sources with $JAVAC.
+ Return a failure indicator (true upon error). */
+static bool
+compile_using_envjavac (const char *javac,
+ const char * const *java_sources,
+ unsigned int java_sources_count,
+ const char *directory,
+ bool optimize, bool debug,
+ bool verbose, bool null_stderr)
+{
+ /* Because $JAVAC may consist of a command and options, we use the
+ shell. Because $JAVAC has been set by the user, we leave all
+ environment variables in place, including JAVA_HOME, and we don't
+ erase the user's CLASSPATH. */
+ bool err;
+ unsigned int command_length;
+ char *command;
+ char *argv[4];
+ int exitstatus;
+ unsigned int i;
+ char *p;
+
+ command_length = strlen (javac);
+ if (optimize)
+ command_length += 3;
+ if (debug)
+ command_length += 3;
+ if (directory != NULL)
+ command_length += 4 + shell_quote_length (directory);
+ for (i = 0; i < java_sources_count; i++)
+ command_length += 1 + shell_quote_length (java_sources[i]);
+ command_length += 1;
+
+ command = (char *) xmalloca (command_length);
+ p = command;
+ /* Don't shell_quote $JAVAC, because it may consist of a command
+ and options. */
+ memcpy (p, javac, strlen (javac));
+ p += strlen (javac);
+ if (optimize)
+ {
+ memcpy (p, " -O", 3);
+ p += 3;
+ }
+ if (debug)
+ {
+ memcpy (p, " -g", 3);
+ p += 3;
+ }
+ if (directory != NULL)
+ {
+ memcpy (p, " -d ", 4);
+ p += 4;
+ p = shell_quote_copy (p, directory);
+ }
+ for (i = 0; i < java_sources_count; i++)
+ {
+ *p++ = ' ';
+ p = shell_quote_copy (p, java_sources[i]);
+ }
+ *p++ = '\0';
+ /* Ensure command_length was correctly calculated. */
+ if (p - command > command_length)
+ abort ();
+
+ if (verbose)
+ printf ("%s\n", command);
+
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = NULL;
+ exitstatus = execute (javac, "/bin/sh", argv, false, false, false,
+ null_stderr, true, true, NULL);
+ err = (exitstatus != 0);
+
+ freea (command);
+
+ return err;
+}
+
+/* Try to compile a set of Java sources with gcj.
+ Return a failure indicator (true upon error). */
+static bool
+compile_using_gcj (const char * const *java_sources,
+ unsigned int java_sources_count,
+ bool no_assert_option,
+ bool fsource_option, const char *source_version,
+ bool ftarget_option, const char *target_version,
+ const char *directory,
+ bool optimize, bool debug,
+ bool verbose, bool null_stderr)
+{
+ bool err;
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ char *fsource_arg;
+ char *ftarget_arg;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 2 + (no_assert_option ? 1 : 0) + (fsource_option ? 1 : 0)
+ + (ftarget_option ? 1 : 0) + (optimize ? 1 : 0) + (debug ? 1 : 0)
+ + (directory != NULL ? 2 : 0) + java_sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "gcj";
+ *argp++ = "-C";
+ if (no_assert_option)
+ *argp++ = "-fno-assert";
+ if (fsource_option)
+ {
+ fsource_arg = (char *) xmalloca (9 + strlen (source_version) + 1);
+ memcpy (fsource_arg, "-fsource=", 9);
+ strcpy (fsource_arg + 9, source_version);
+ *argp++ = fsource_arg;
+ }
+ else
+ fsource_arg = NULL;
+ if (ftarget_option)
+ {
+ ftarget_arg = (char *) xmalloca (9 + strlen (target_version) + 1);
+ memcpy (ftarget_arg, "-ftarget=", 9);
+ strcpy (ftarget_arg + 9, target_version);
+ *argp++ = ftarget_arg;
+ }
+ else
+ ftarget_arg = NULL;
+ if (optimize)
+ *argp++ = "-O";
+ if (debug)
+ *argp++ = "-g";
+ if (directory != NULL)
+ {
+ *argp++ = "-d";
+ *argp++ = (char *) directory;
+ }
+ for (i = 0; i < java_sources_count; i++)
+ *argp++ = (char *) java_sources[i];
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("gcj", "gcj", argv, false, false, false, null_stderr,
+ true, true, NULL);
+ err = (exitstatus != 0);
+
+ if (ftarget_arg != NULL)
+ freea (ftarget_arg);
+ if (fsource_arg != NULL)
+ freea (fsource_arg);
+ freea (argv);
+
+ return err;
+}
+
+/* Try to compile a set of Java sources with javac.
+ Return a failure indicator (true upon error). */
+static bool
+compile_using_javac (const char * const *java_sources,
+ unsigned int java_sources_count,
+ bool source_option, const char *source_version,
+ bool target_option, const char *target_version,
+ const char *directory,
+ bool optimize, bool debug,
+ bool verbose, bool null_stderr)
+{
+ bool err;
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + (source_option ? 2 : 0) + (target_option ? 2 : 0) + (optimize ? 1 : 0)
+ + (debug ? 1 : 0) + (directory != NULL ? 2 : 0) + java_sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "javac";
+ if (source_option)
+ {
+ *argp++ = "-source";
+ *argp++ = (char *) source_version;
+ }
+ if (target_option)
+ {
+ *argp++ = "-target";
+ *argp++ = (char *) target_version;
+ }
+ if (optimize)
+ *argp++ = "-O";
+ if (debug)
+ *argp++ = "-g";
+ if (directory != NULL)
+ {
+ *argp++ = "-d";
+ *argp++ = (char *) directory;
+ }
+ for (i = 0; i < java_sources_count; i++)
+ *argp++ = (char *) java_sources[i];
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("javac", "javac", argv, false, false, false,
+ null_stderr, true, true, NULL);
+ err = (exitstatus != 0);
+
+ freea (argv);
+
+ return err;
+}
+
+/* Try to compile a set of Java sources with jikes.
+ Return a failure indicator (true upon error). */
+static bool
+compile_using_jikes (const char * const *java_sources,
+ unsigned int java_sources_count,
+ const char *directory,
+ bool optimize, bool debug,
+ bool verbose, bool null_stderr)
+{
+ bool err;
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + (optimize ? 1 : 0) + (debug ? 1 : 0) + (directory != NULL ? 2 : 0)
+ + java_sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "jikes";
+ if (optimize)
+ *argp++ = "-O";
+ if (debug)
+ *argp++ = "-g";
+ if (directory != NULL)
+ {
+ *argp++ = "-d";
+ *argp++ = (char *) directory;
+ }
+ for (i = 0; i < java_sources_count; i++)
+ *argp++ = (char *) java_sources[i];
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("jikes", "jikes", argv, false, false, false,
+ null_stderr, true, true, NULL);
+ err = (exitstatus != 0);
+
+ freea (argv);
+
+ return err;
+}
+
+/* ====================== Usability test subroutines ====================== */
+
+/* Write a given contents to a temporary file.
+ FILE_NAME is the name of a file inside TMPDIR that is known not to exist
+ yet.
+ Return a failure indicator (true upon error). */
+static bool
+write_temp_file (struct temp_dir *tmpdir, const char *file_name,
+ const char *contents)
+{
+ FILE *fp;
+
+ register_temp_file (tmpdir, file_name);
+ fp = fopen_temp (file_name, "w");
+ if (fp == NULL)
+ {
+ error (0, errno, _("failed to create \"%s\""), file_name);
+ unregister_temp_file (tmpdir, file_name);
+ return true;
+ }
+ fputs (contents, fp);
+ if (fwriteerror_temp (fp))
+ {
+ error (0, errno, _("error while writing \"%s\" file"), file_name);
+ return true;
+ }
+ return false;
+}
+
+/* Return the class file version number of a class file on disk. */
+static int
+get_classfile_version (const char *compiled_file_name)
+{
+ unsigned char header[8];
+ int fd;
+
+ /* Open the class file. */
+ fd = open (compiled_file_name, O_RDONLY | O_BINARY, 0);
+ if (fd >= 0)
+ {
+ /* Read its first 8 bytes. */
+ if (safe_read (fd, header, 8) == 8)
+ {
+ /* Verify the class file signature. */
+ if (header[0] == 0xCA && header[1] == 0xFE
+ && header[2] == 0xBA && header[3] == 0xBE)
+ return header[7];
+ }
+ close (fd);
+ }
+
+ /* Could not get the class file version. Return a very large one. */
+ return INT_MAX;
+}
+
+/* Return true if $JAVAC is a version of gcj. */
+static bool
+is_envjavac_gcj (const char *javac)
+{
+ static bool envjavac_tested;
+ static bool envjavac_gcj;
+
+ if (!envjavac_tested)
+ {
+ /* Test whether $JAVAC is gcj:
+ "$JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null" */
+ unsigned int command_length;
+ char *command;
+ char *argv[4];
+ pid_t child;
+ int fd[1];
+ FILE *fp;
+ char *line;
+ size_t linesize;
+ size_t linelen;
+ int exitstatus;
+ char *p;
+
+ /* Setup the command "$JAVAC --version". */
+ command_length = strlen (javac) + 1 + 9 + 1;
+ command = (char *) xmalloca (command_length);
+ p = command;
+ /* Don't shell_quote $JAVAC, because it may consist of a command
+ and options. */
+ memcpy (p, javac, strlen (javac));
+ p += strlen (javac);
+ memcpy (p, " --version", 1 + 9 + 1);
+ p += 1 + 9 + 1;
+ /* Ensure command_length was correctly calculated. */
+ if (p - command > command_length)
+ abort ();
+
+ /* Call $JAVAC --version 2>/dev/null. */
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = NULL;
+ child = create_pipe_in (javac, "/bin/sh", argv, DEV_NULL, true, true,
+ false, fd);
+ if (child == -1)
+ goto failed;
+
+ /* Retrieve its result. */
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ goto failed;
+
+ line = NULL; linesize = 0;
+ linelen = getline (&line, &linesize, fp);
+ if (linelen == (size_t)(-1))
+ {
+ fclose (fp);
+ goto failed;
+ }
+ /* It is safe to call c_strstr() instead of strstr() here; see the
+ comments in c-strstr.h. */
+ envjavac_gcj = (c_strstr (line, "gcj") != NULL);
+
+ fclose (fp);
+
+ /* Remove zombie process from process list, and retrieve exit status. */
+ exitstatus =
+ wait_subprocess (child, javac, true, true, true, false, NULL);
+ if (exitstatus != 0)
+ envjavac_gcj = false;
+
+ failed:
+ freea (command);
+
+ envjavac_tested = true;
+ }
+
+ return envjavac_gcj;
+}
+
+/* Return true if $JAVAC, known to be a version of gcj, is a version >= 4.3
+ of gcj. */
+static bool
+is_envjavac_gcj43 (const char *javac)
+{
+ static bool envjavac_tested;
+ static bool envjavac_gcj43;
+
+ if (!envjavac_tested)
+ {
+ /* Test whether $JAVAC is gcj:
+ "$JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q \
+ | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null" */
+ unsigned int command_length;
+ char *command;
+ char *argv[4];
+ pid_t child;
+ int fd[1];
+ FILE *fp;
+ char *line;
+ size_t linesize;
+ size_t linelen;
+ int exitstatus;
+ char *p;
+
+ /* Setup the command "$JAVAC --version". */
+ command_length = strlen (javac) + 1 + 9 + 1;
+ command = (char *) xmalloca (command_length);
+ p = command;
+ /* Don't shell_quote $JAVAC, because it may consist of a command
+ and options. */
+ memcpy (p, javac, strlen (javac));
+ p += strlen (javac);
+ memcpy (p, " --version", 1 + 9 + 1);
+ p += 1 + 9 + 1;
+ /* Ensure command_length was correctly calculated. */
+ if (p - command > command_length)
+ abort ();
+
+ /* Call $JAVAC --version 2>/dev/null. */
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = NULL;
+ child = create_pipe_in (javac, "/bin/sh", argv, DEV_NULL, true, true,
+ false, fd);
+ if (child == -1)
+ goto failed;
+
+ /* Retrieve its result. */
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ goto failed;
+
+ line = NULL; linesize = 0;
+ linelen = getline (&line, &linesize, fp);
+ if (linelen == (size_t)(-1))
+ {
+ fclose (fp);
+ goto failed;
+ }
+ p = line;
+ while (*p != '\0' && !(*p >= '0' && *p <= '9'))
+ p++;
+ envjavac_gcj43 =
+ !(*p == '4' && p[1] == '.' && p[2] >= '0' && p[2] <= '2')
+ && (*p >= '4' && *p <= '9');
+
+ fclose (fp);
+
+ /* Remove zombie process from process list, and retrieve exit status. */
+ exitstatus =
+ wait_subprocess (child, javac, true, true, true, false, NULL);
+ if (exitstatus != 0)
+ envjavac_gcj43 = false;
+
+ failed:
+ freea (command);
+
+ envjavac_tested = true;
+ }
+
+ return envjavac_gcj43;
+}
+
+/* Test whether $JAVAC, known to be a version of gcj >= 4.3, can be used, and
+ whether it needs a -fsource and/or -ftarget option.
+ Return a failure indicator (true upon error). */
+static bool
+is_envjavac_gcj43_usable (const char *javac,
+ const char *source_version,
+ const char *target_version,
+ bool *usablep,
+ bool *fsource_option_p, bool *ftarget_option_p)
+{
+ /* The cache depends on the source_version and target_version. */
+ struct result_t
+ {
+ bool tested;
+ bool usable;
+ bool fsource_option;
+ bool ftarget_option;
+ };
+ static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND];
+ struct result_t *resultp;
+
+ resultp = &result_cache[source_version_index (source_version)]
+ [target_version_index (target_version)];
+ if (!resultp->tested)
+ {
+ /* Try $JAVAC. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet (source_version)))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* $JAVAC compiled conftest.java successfully. */
+ /* Try adding -fsource option if it is useful. */
+ char *javac_source =
+ xasprintf ("%s -fsource=%s", javac, source_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_source,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name, failcode))
+ {
+ free (conftest_file_name);
+ free (javac_source);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_envjavac (javac_source,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* $JAVAC compiled conftestfail.java successfully, and
+ "$JAVAC -fsource=$source_version" rejects it. So
+ the -fsource option is useful. */
+ resultp->fsource_option = true;
+ }
+ }
+ }
+
+ free (javac_source);
+
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Try with -fsource and -ftarget options. */
+ char *javac_target =
+ xasprintf ("%s -fsource=%s -ftarget=%s",
+ javac, source_version, target_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "$JAVAC -fsource $source_version -ftarget $target_version"
+ compiled conftest.java successfully. */
+ resultp->fsource_option = true;
+ resultp->ftarget_option = true;
+ resultp->usable = true;
+ }
+
+ free (javac_target);
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ resultp->tested = true;
+ }
+
+ *usablep = resultp->usable;
+ *fsource_option_p = resultp->fsource_option;
+ *ftarget_option_p = resultp->ftarget_option;
+ return false;
+}
+
+/* Test whether $JAVAC, known to be a version of gcj < 4.3, can be used for
+ compiling with target_version = 1.4 and source_version = 1.4.
+ Return a failure indicator (true upon error). */
+static bool
+is_envjavac_oldgcj_14_14_usable (const char *javac, bool *usablep)
+{
+ static bool envjavac_tested;
+ static bool envjavac_usable;
+
+ if (!envjavac_tested)
+ {
+ /* Try $JAVAC. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet ("1.4")))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac, java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ envjavac_usable = true;
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ cleanup_temp_dir (tmpdir);
+
+ envjavac_tested = true;
+ }
+
+ *usablep = envjavac_usable;
+ return false;
+}
+
+/* Test whether $JAVAC, known to be a version of gcj < 4.3, can be used for
+ compiling with target_version = 1.4 and source_version = 1.3.
+ Return a failure indicator (true upon error). */
+static bool
+is_envjavac_oldgcj_14_13_usable (const char *javac,
+ bool *usablep, bool *need_no_assert_option_p)
+{
+ static bool envjavac_tested;
+ static bool envjavac_usable;
+ static bool envjavac_need_no_assert_option;
+
+ if (!envjavac_tested)
+ {
+ /* Try $JAVAC and "$JAVAC -fno-assert". But add -fno-assert only if
+ it makes a difference. (It could already be part of $JAVAC.) */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+ bool javac_works;
+ char *javac_noassert;
+ bool javac_noassert_works;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet ("1.3")))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ javac_works = true;
+ else
+ javac_works = false;
+
+ unlink (compiled_file_name);
+
+ javac_noassert = xasprintf ("%s -fno-assert", javac);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_noassert,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ javac_noassert_works = true;
+ else
+ javac_noassert_works = false;
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ if (javac_works && javac_noassert_works)
+ {
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_failcode_snippet ("1.3")))
+ {
+ free (conftest_file_name);
+ free (javac_noassert);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ /* Compilation succeeded. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!(!compile_using_envjavac (javac_noassert,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0))
+ /* Compilation failed. */
+ /* "$JAVAC -fno-assert" works better than $JAVAC. */
+ javac_works = true;
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+ }
+
+ cleanup_temp_dir (tmpdir);
+
+ if (javac_works)
+ {
+ envjavac_usable = true;
+ envjavac_need_no_assert_option = false;
+ }
+ else if (javac_noassert_works)
+ {
+ envjavac_usable = true;
+ envjavac_need_no_assert_option = true;
+ }
+
+ envjavac_tested = true;
+ }
+
+ *usablep = envjavac_usable;
+ *need_no_assert_option_p = envjavac_need_no_assert_option;
+ return false;
+}
+
+/* Test whether $JAVAC, known to be not a version of gcj, can be used, and
+ whether it needs a -source and/or -target option.
+ Return a failure indicator (true upon error). */
+static bool
+is_envjavac_nongcj_usable (const char *javac,
+ const char *source_version,
+ const char *target_version,
+ bool *usablep,
+ bool *source_option_p, bool *target_option_p)
+{
+ /* The cache depends on the source_version and target_version. */
+ struct result_t
+ {
+ bool tested;
+ bool usable;
+ bool source_option;
+ bool target_option;
+ };
+ static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND];
+ struct result_t *resultp;
+
+ resultp = &result_cache[source_version_index (source_version)]
+ [target_version_index (target_version)];
+ if (!resultp->tested)
+ {
+ /* Try $JAVAC. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet (source_version)))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* $JAVAC compiled conftest.java successfully. */
+ /* Try adding -source option if it is useful. */
+ char *javac_source =
+ xasprintf ("%s -source %s", javac, source_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_source,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name, failcode))
+ {
+ free (conftest_file_name);
+ free (javac_source);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_envjavac (javac_source,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* $JAVAC compiled conftestfail.java successfully, and
+ "$JAVAC -source $source_version" rejects it. So the
+ -source option is useful. */
+ resultp->source_option = true;
+ }
+ }
+ }
+
+ free (javac_source);
+
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Try with -target option alone. (Sun javac 1.3.1 has the -target
+ option but no -source option.) */
+ char *javac_target =
+ xasprintf ("%s -target %s", javac, target_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "$JAVAC -target $target_version" compiled conftest.java
+ successfully. */
+ /* Try adding -source option if it is useful. */
+ char *javac_target_source =
+ xasprintf ("%s -source %s", javac_target, source_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target_source,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ failcode))
+ {
+ free (conftest_file_name);
+ free (javac_target_source);
+ free (javac_target);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_envjavac (javac_target_source,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false,
+ true))
+ /* "$JAVAC -target $target_version" compiled
+ conftestfail.java successfully, and
+ "$JAVAC -target $target_version -source $source_version"
+ rejects it. So the -source option is useful. */
+ resultp->source_option = true;
+ }
+ }
+ }
+
+ free (javac_target_source);
+
+ resultp->target_option = true;
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Maybe this -target option requires a -source option? Try with
+ -target and -source options. (Supported by Sun javac 1.4 and
+ higher.) */
+ char *javac_target_source =
+ xasprintf ("%s -source %s", javac_target, source_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target_source,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "$JAVAC -target $target_version -source $source_version"
+ compiled conftest.java successfully. */
+ resultp->source_option = true;
+ resultp->target_option = true;
+ resultp->usable = true;
+ }
+
+ free (javac_target_source);
+ }
+
+ free (javac_target);
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ resultp->tested = true;
+ }
+
+ *usablep = resultp->usable;
+ *source_option_p = resultp->source_option;
+ *target_option_p = resultp->target_option;
+ return false;
+}
+
+static bool
+is_gcj_present (void)
+{
+ static bool gcj_tested;
+ static bool gcj_present;
+
+ if (!gcj_tested)
+ {
+ /* Test for presence of gcj:
+ "gcj --version 2> /dev/null | \
+ sed -e 's,^[^0-9]*,,' -e 1q | \
+ sed -e '/^3\.[01]/d' | grep '^[3-9]' > /dev/null" */
+ char *argv[3];
+ pid_t child;
+ int fd[1];
+ int exitstatus;
+
+ argv[0] = "gcj";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ child = create_pipe_in ("gcj", "gcj", argv, DEV_NULL, true, true,
+ false, fd);
+ gcj_present = false;
+ if (child != -1)
+ {
+ /* Read the subprocess output, drop all lines except the first,
+ drop all characters before the first digit, and test whether
+ the remaining string starts with a digit >= 3, but not with
+ "3.0" or "3.1". */
+ char c[3];
+ size_t count = 0;
+
+ while (safe_read (fd[0], &c[count], 1) > 0)
+ {
+ if (c[count] == '\n')
+ break;
+ if (count == 0)
+ {
+ if (!(c[0] >= '0' && c[0] <= '9'))
+ continue;
+ gcj_present = (c[0] >= '3');
+ }
+ count++;
+ if (count == 3)
+ {
+ if (c[0] == '3' && c[1] == '.'
+ && (c[2] == '0' || c[2] == '1'))
+ gcj_present = false;
+ break;
+ }
+ }
+ while (safe_read (fd[0], &c[0], 1) > 0)
+ ;
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list, and retrieve exit
+ status. */
+ exitstatus =
+ wait_subprocess (child, "gcj", false, true, true, false, NULL);
+ if (exitstatus != 0)
+ gcj_present = false;
+ }
+
+ if (gcj_present)
+ {
+ /* See if libgcj.jar is well installed. */
+ struct temp_dir *tmpdir;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ gcj_present = false;
+ else
+ {
+ char *conftest_file_name;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftestlib.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+"public class conftestlib {\n"
+" public static void main (String[] args) {\n"
+" }\n"
+"}\n"))
+ gcj_present = false;
+ else
+ {
+ char *compiled_file_name;
+ const char *java_sources[1];
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestlib.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_gcj (java_sources, 1, false,
+ false, NULL, false, NULL,
+ tmpdir->dir_name,
+ false, false, false, true))
+ gcj_present = false;
+
+ free (compiled_file_name);
+ }
+ free (conftest_file_name);
+ }
+ cleanup_temp_dir (tmpdir);
+ }
+
+ gcj_tested = true;
+ }
+
+ return gcj_present;
+}
+
+static bool
+is_gcj_43 (void)
+{
+ static bool gcj_tested;
+ static bool gcj_43;
+
+ if (!gcj_tested)
+ {
+ /* Test for presence of gcj:
+ "gcj --version 2> /dev/null | \
+ sed -e 's,^[^0-9]*,,' -e 1q | \
+ sed -e '/^4\.[012]/d' | grep '^[4-9]'" */
+ char *argv[3];
+ pid_t child;
+ int fd[1];
+ int exitstatus;
+
+ argv[0] = "gcj";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ child = create_pipe_in ("gcj", "gcj", argv, DEV_NULL, true, true,
+ false, fd);
+ gcj_43 = false;
+ if (child != -1)
+ {
+ /* Read the subprocess output, drop all lines except the first,
+ drop all characters before the first digit, and test whether
+ the remaining string starts with a digit >= 4, but not with
+ "4.0" or "4.1" or "4.2". */
+ char c[3];
+ size_t count = 0;
+
+ while (safe_read (fd[0], &c[count], 1) > 0)
+ {
+ if (c[count] == '\n')
+ break;
+ if (count == 0)
+ {
+ if (!(c[0] >= '0' && c[0] <= '9'))
+ continue;
+ gcj_43 = (c[0] >= '4');
+ }
+ count++;
+ if (count == 3)
+ {
+ if (c[0] == '4' && c[1] == '.' && c[2] >= '0' && c[2] <= '2')
+ gcj_43 = false;
+ break;
+ }
+ }
+ while (safe_read (fd[0], &c[0], 1) > 0)
+ ;
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list, and retrieve exit
+ status. */
+ exitstatus =
+ wait_subprocess (child, "gcj", false, true, true, false, NULL);
+ if (exitstatus != 0)
+ gcj_43 = false;
+ }
+
+ gcj_tested = true;
+ }
+
+ return gcj_43;
+}
+
+/* Test whether gcj >= 4.3 can be used, and whether it needs a -fsource and/or
+ -ftarget option.
+ Return a failure indicator (true upon error). */
+static bool
+is_gcj43_usable (const char *source_version,
+ const char *target_version,
+ bool *usablep,
+ bool *fsource_option_p, bool *ftarget_option_p)
+{
+ /* The cache depends on the source_version and target_version. */
+ struct result_t
+ {
+ bool tested;
+ bool usable;
+ bool fsource_option;
+ bool ftarget_option;
+ };
+ static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND];
+ struct result_t *resultp;
+
+ resultp = &result_cache[source_version_index (source_version)]
+ [target_version_index (target_version)];
+ if (!resultp->tested)
+ {
+ /* Try gcj. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet (source_version)))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1, false, false, NULL, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* gcj compiled conftest.java successfully. */
+ /* Try adding -fsource option if it is useful. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1,
+ false, true, source_version, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name, failcode))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1,
+ false, false, NULL, false, NULL,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_gcj (java_sources, 1,
+ false, true, source_version,
+ false, NULL,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* gcj compiled conftestfail.java successfully, and
+ "gcj -fsource=$source_version" rejects it. So
+ the -fsource option is useful. */
+ resultp->fsource_option = true;
+ }
+ }
+ }
+
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Try with -fsource and -ftarget options. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1,
+ false, true, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "gcj -fsource $source_version -ftarget $target_version"
+ compiled conftest.java successfully. */
+ resultp->fsource_option = true;
+ resultp->ftarget_option = true;
+ resultp->usable = true;
+ }
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ resultp->tested = true;
+ }
+
+ *usablep = resultp->usable;
+ *fsource_option_p = resultp->fsource_option;
+ *ftarget_option_p = resultp->ftarget_option;
+ return false;
+}
+
+/* Test whether gcj < 4.3 can be used for compiling with target_version = 1.4
+ and source_version = 1.4.
+ Return a failure indicator (true upon error). */
+static bool
+is_oldgcj_14_14_usable (bool *usablep)
+{
+ static bool gcj_tested;
+ static bool gcj_usable;
+
+ if (!gcj_tested)
+ {
+ /* Try gcj. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet ("1.4")))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1, false, false, NULL, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ gcj_usable = true;
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ cleanup_temp_dir (tmpdir);
+
+ gcj_tested = true;
+ }
+
+ *usablep = gcj_usable;
+ return false;
+}
+
+/* Test whether gcj < 4.3 can be used for compiling with target_version = 1.4
+ and source_version = 1.3.
+ Return a failure indicator (true upon error). */
+static bool
+is_oldgcj_14_13_usable (bool *usablep, bool *need_no_assert_option_p)
+{
+ static bool gcj_tested;
+ static bool gcj_usable;
+ static bool gcj_need_no_assert_option;
+
+ if (!gcj_tested)
+ {
+ /* Try gcj and "gcj -fno-assert". But add -fno-assert only if
+ it works (not gcj < 3.3). */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet ("1.3")))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1, true, false, NULL, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ {
+ gcj_usable = true;
+ gcj_need_no_assert_option = true;
+ }
+ else
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1, false,
+ false, NULL, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ {
+ gcj_usable = true;
+ gcj_need_no_assert_option = false;
+ }
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ cleanup_temp_dir (tmpdir);
+
+ gcj_tested = true;
+ }
+
+ *usablep = gcj_usable;
+ *need_no_assert_option_p = gcj_need_no_assert_option;
+ return false;
+}
+
+static bool
+is_javac_present (void)
+{
+ static bool javac_tested;
+ static bool javac_present;
+
+ if (!javac_tested)
+ {
+ /* Test for presence of javac: "javac 2> /dev/null ; test $? -le 2" */
+ char *argv[2];
+ int exitstatus;
+
+ argv[0] = "javac";
+ argv[1] = NULL;
+ exitstatus = execute ("javac", "javac", argv, false, false, true, true,
+ true, false, NULL);
+ javac_present = (exitstatus == 0 || exitstatus == 1 || exitstatus == 2);
+ javac_tested = true;
+ }
+
+ return javac_present;
+}
+
+/* Test whether javac can be used and whether it needs a -source and/or
+ -target option.
+ Return a failure indicator (true upon error). */
+static bool
+is_javac_usable (const char *source_version, const char *target_version,
+ bool *usablep, bool *source_option_p, bool *target_option_p)
+{
+ /* The cache depends on the source_version and target_version. */
+ struct result_t
+ {
+ bool tested;
+ bool usable;
+ bool source_option;
+ bool target_option;
+ };
+ static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND];
+ struct result_t *resultp;
+
+ resultp = &result_cache[source_version_index (source_version)]
+ [target_version_index (target_version)];
+ if (!resultp->tested)
+ {
+ /* Try javac. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet (source_version)))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ false, source_version,
+ false, target_version,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* javac compiled conftest.java successfully. */
+ /* Try adding -source option if it is useful. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ true, source_version,
+ false, target_version,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name, failcode))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ false, source_version,
+ false, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_javac (java_sources, 1,
+ true, source_version,
+ false, target_version,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* javac compiled conftestfail.java successfully, and
+ "javac -source $source_version" rejects it. So the
+ -source option is useful. */
+ resultp->source_option = true;
+ }
+ }
+ }
+
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Try with -target option alone. (Sun javac 1.3.1 has the -target
+ option but no -source option.) */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ false, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "javac -target $target_version" compiled conftest.java
+ successfully. */
+ /* Try adding -source option if it is useful. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ true, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ failcode))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ false, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_javac (java_sources, 1,
+ true, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* "javac -target $target_version" compiled
+ conftestfail.java successfully, and
+ "javac -target $target_version -source $source_version"
+ rejects it. So the -source option is useful. */
+ resultp->source_option = true;
+ }
+ }
+ }
+
+ resultp->target_option = true;
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Maybe this -target option requires a -source option? Try with
+ -target and -source options. (Supported by Sun javac 1.4 and
+ higher.) */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ true, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "javac -target $target_version -source $source_version"
+ compiled conftest.java successfully. */
+ resultp->source_option = true;
+ resultp->target_option = true;
+ resultp->usable = true;
+ }
+ }
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ resultp->tested = true;
+ }
+
+ *usablep = resultp->usable;
+ *source_option_p = resultp->source_option;
+ *target_option_p = resultp->target_option;
+ return false;
+}
+
+static bool
+is_jikes_present (void)
+{
+ static bool jikes_tested;
+ static bool jikes_present;
+
+ if (!jikes_tested)
+ {
+ /* Test for presence of jikes: "jikes 2> /dev/null ; test $? = 1" */
+ char *argv[2];
+ int exitstatus;
+
+ argv[0] = "jikes";
+ argv[1] = NULL;
+ exitstatus = execute ("jikes", "jikes", argv, false, false, true, true,
+ true, false, NULL);
+ jikes_present = (exitstatus == 0 || exitstatus == 1);
+ jikes_tested = true;
+ }
+
+ return jikes_present;
+}
+
+/* ============================= Main function ============================= */
+
+bool
+compile_java_class (const char * const *java_sources,
+ unsigned int java_sources_count,
+ const char * const *classpaths,
+ unsigned int classpaths_count,
+ const char *source_version,
+ const char *target_version,
+ const char *directory,
+ bool optimize, bool debug,
+ bool use_minimal_classpath,
+ bool verbose)
+{
+ bool err = false;
+ char *old_JAVA_HOME;
+
+ {
+ const char *javac = getenv ("JAVAC");
+ if (javac != NULL && javac[0] != '\0')
+ {
+ bool usable = false;
+ bool no_assert_option = false;
+ bool source_option = false;
+ bool target_option = false;
+ bool fsource_option = false;
+ bool ftarget_option = false;
+
+ if (target_version == NULL)
+ target_version = default_target_version ();
+
+ if (is_envjavac_gcj (javac))
+ {
+ /* It's a version of gcj. */
+ if (is_envjavac_gcj43 (javac))
+ {
+ /* It's a version of gcj >= 4.3. Assume the classfile versions
+ are correct. */
+ if (is_envjavac_gcj43_usable (javac,
+ source_version, target_version,
+ &usable,
+ &fsource_option, &ftarget_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ else
+ {
+ /* It's a version of gcj < 4.3. Ignore the version of the
+ class files that it creates. */
+ if (strcmp (target_version, "1.4") == 0
+ && strcmp (source_version, "1.4") == 0)
+ {
+ if (is_envjavac_oldgcj_14_14_usable (javac, &usable))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ else if (strcmp (target_version, "1.4") == 0
+ && strcmp (source_version, "1.3") == 0)
+ {
+ if (is_envjavac_oldgcj_14_13_usable (javac,
+ &usable,
+ &no_assert_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* It's not gcj. Assume the classfile versions are correct. */
+ if (is_envjavac_nongcj_usable (javac,
+ source_version, target_version,
+ &usable,
+ &source_option, &target_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+
+ if (usable)
+ {
+ char *old_classpath;
+ char *javac_with_options;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, false, verbose);
+
+ javac_with_options =
+ (no_assert_option
+ ? xasprintf ("%s -fno-assert", javac)
+ : xasprintf ("%s%s%s%s%s%s%s%s%s",
+ javac,
+ source_option ? " -source " : "",
+ source_option ? source_version : "",
+ target_option ? " -target " : "",
+ target_option ? target_version : "",
+ fsource_option ? " -fsource=" : "",
+ fsource_option ? source_version : "",
+ ftarget_option ? " -ftarget=" : "",
+ ftarget_option ? target_version : ""));
+
+ err = compile_using_envjavac (javac_with_options,
+ java_sources, java_sources_count,
+ directory, optimize, debug, verbose,
+ false);
+
+ free (javac_with_options);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done1;
+ }
+ }
+ }
+
+ /* Unset the JAVA_HOME environment variable. */
+ old_JAVA_HOME = getenv ("JAVA_HOME");
+ if (old_JAVA_HOME != NULL)
+ {
+ old_JAVA_HOME = xstrdup (old_JAVA_HOME);
+ unsetenv ("JAVA_HOME");
+ }
+
+ if (is_gcj_present ())
+ {
+ /* It's a version of gcj. */
+ bool usable = false;
+ bool no_assert_option = false;
+ bool fsource_option = false;
+ bool ftarget_option = false;
+
+ if (target_version == NULL)
+ target_version = default_target_version ();
+
+ if (is_gcj_43 ())
+ {
+ /* It's a version of gcj >= 4.3. Assume the classfile versions
+ are correct. */
+ if (is_gcj43_usable (source_version, target_version,
+ &usable, &fsource_option, &ftarget_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ else
+ {
+ /* It's a version of gcj < 4.3. Ignore the version of the class
+ files that it creates.
+ Test whether it supports the desired target-version and
+ source-version. */
+ if (strcmp (target_version, "1.4") == 0
+ && strcmp (source_version, "1.4") == 0)
+ {
+ if (is_oldgcj_14_14_usable (&usable))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ else if (strcmp (target_version, "1.4") == 0
+ && strcmp (source_version, "1.3") == 0)
+ {
+ if (is_oldgcj_14_13_usable (&usable, &no_assert_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ }
+
+ if (usable)
+ {
+ char *old_classpath;
+
+ /* Set CLASSPATH. We could also use the --CLASSPATH=... option
+ of gcj. Note that --classpath=... option is different: its
+ argument should also contain gcj's libgcj.jar, but we don't
+ know its location. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ err = compile_using_gcj (java_sources, java_sources_count,
+ no_assert_option,
+ fsource_option, source_version,
+ ftarget_option, target_version,
+ directory, optimize, debug, verbose, false);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done2;
+ }
+ }
+
+ if (is_javac_present ())
+ {
+ bool usable = false;
+ bool source_option = false;
+ bool target_option = false;
+
+ if (target_version == NULL)
+ target_version = default_target_version ();
+
+ if (is_javac_usable (source_version, target_version,
+ &usable, &source_option, &target_option))
+ {
+ err = true;
+ goto done1;
+ }
+
+ if (usable)
+ {
+ char *old_classpath;
+
+ /* Set CLASSPATH. We don't use the "-classpath ..." option because
+ in JDK 1.1.x its argument should also contain the JDK's
+ classes.zip, but we don't know its location. (In JDK 1.3.0 it
+ would work.) */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ err = compile_using_javac (java_sources, java_sources_count,
+ source_option, source_version,
+ target_option, target_version,
+ directory, optimize, debug, verbose,
+ false);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done2;
+ }
+ }
+
+ if (is_jikes_present ())
+ {
+ /* Test whether it supports the desired target-version and
+ source-version. */
+ bool usable = (strcmp (source_version, "1.3") == 0);
+
+ if (usable)
+ {
+ char *old_classpath;
+
+ /* Set CLASSPATH. We could also use the "-classpath ..." option.
+ Since jikes doesn't come with its own standard library, it
+ needs a classes.zip or rt.jar or libgcj.jar in the CLASSPATH.
+ To increase the chance of success, we reuse the current CLASSPATH
+ if the user has set it. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, false, verbose);
+
+ err = compile_using_jikes (java_sources, java_sources_count,
+ directory, optimize, debug, verbose,
+ false);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done2;
+ }
+ }
+
+ error (0, 0, _("Java compiler not found, try installing gcj or set $JAVAC"));
+ err = true;
+
+ done2:
+ if (old_JAVA_HOME != NULL)
+ {
+ xsetenv ("JAVA_HOME", old_JAVA_HOME, 1);
+ free (old_JAVA_HOME);
+ }
+
+ done1:
+ return err;
+}
diff --git a/gnulib/lib/javacomp.h b/gnulib/lib/javacomp.h
new file mode 100644
index 00000000..612f9de4
--- /dev/null
+++ b/gnulib/lib/javacomp.h
@@ -0,0 +1,75 @@
+/* Compile a Java program.
+ Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#ifndef _JAVACOMP_H
+#define _JAVACOMP_H
+
+#include <stdbool.h>
+
+/* Compile a Java source file to bytecode.
+ java_sources is an array of source file names.
+ classpaths is a list of pathnames to be prepended to the CLASSPATH.
+
+ source_version can be: support for
+ 1.3 inner classes
+ 1.4 assert keyword
+ 1.5 generic classes and methods
+ 1.6 (not yet supported)
+ target_version can be: classfile version:
+ 1.1 45.3
+ 1.2 46.0
+ 1.3 47.0
+ 1.4 48.0
+ 1.5 49.0
+ 1.6 50.0
+ target_version can also be given as NULL. In this case, the required
+ target_version is determined from the found JVM (see javaversion.h).
+ Specifying target_version is useful when building a library (.jar) that is
+ useful outside the given package. Passing target_version = NULL is useful
+ when building an application.
+ It is unreasonable to ask for:
+ - target_version < 1.4 with source_version >= 1.4, or
+ - target_version < 1.5 with source_version >= 1.5, or
+ - target_version < 1.6 with source_version >= 1.6,
+ because even Sun's javac doesn't support these combinations.
+ It is redundant to ask for a target_version > source_version, since the
+ smaller target_version = source_version will also always work and newer JVMs
+ support the older target_versions too. Except for the case
+ target_version = 1.4, source_version = 1.3, which allows gcj versions 3.0
+ to 3.2 to be used.
+
+ directory is the target directory. The .class file for class X.Y.Z is
+ written at directory/X/Y/Z.class. If directory is NULL, the .class
+ file is written in the source's directory.
+ use_minimal_classpath = true means to ignore the user's CLASSPATH and
+ use a minimal one. This is likely to reduce possible problems if the
+ user's CLASSPATH contains garbage or a classes.zip file of the wrong
+ Java version.
+ If verbose, the command to be executed will be printed.
+ Return false if OK, true on error. */
+extern bool compile_java_class (const char * const *java_sources,
+ unsigned int java_sources_count,
+ const char * const *classpaths,
+ unsigned int classpaths_count,
+ const char *source_version,
+ const char *target_version,
+ const char *directory,
+ bool optimize, bool debug,
+ bool use_minimal_classpath,
+ bool verbose);
+
+#endif /* _JAVACOMP_H */
diff --git a/gnulib/lib/javaexec.c b/gnulib/lib/javaexec.c
new file mode 100644
index 00000000..64584b83
--- /dev/null
+++ b/gnulib/lib/javaexec.c
@@ -0,0 +1,429 @@
+/* Execute a Java program.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "javaexec.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "execute.h"
+#include "classpath.h"
+#include "xsetenv.h"
+#include "sh-quote.h"
+#include "concat-filename.h"
+#include "xalloc.h"
+#include "xmalloca.h"
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Survey of Java virtual machines.
+
+ A = does it work without CLASSPATH being set
+ B = does it work with CLASSPATH being set to empty
+ C = option to set CLASSPATH, other than setting it in the environment
+ T = test for presence
+
+ Program from A B C T
+
+ $JAVA unknown N Y n/a true
+ gij GCC 3.0 Y Y n/a gij --version >/dev/null
+ java JDK 1.1.8 Y Y -classpath P java -version 2>/dev/null
+ jre JDK 1.1.8 N Y -classpath P jre 2>/dev/null; test $? = 1
+ java JDK 1.3.0 Y Y -classpath P java -version 2>/dev/null
+ jview MS IE Y Y -cp P jview -? >nul; %errorlevel% = 1
+
+ The CLASSPATH is a colon separated list of pathnames. (On Windows: a
+ semicolon separated list of pathnames.)
+
+ We try the Java virtual machines in the following order:
+ 1. getenv ("JAVA"), because the user must be able to override our
+ preferences,
+ 2. "gij", because it is a completely free JVM,
+ 3. "java", because it is a standard JVM,
+ 4. "jre", comes last because it requires a CLASSPATH environment variable,
+ 5. "jview", on Windows only, because it is frequently installed.
+
+ We unset the JAVA_HOME environment variable, because a wrong setting of
+ this variable can confuse the JDK's javac.
+ */
+
+bool
+execute_java_class (const char *class_name,
+ const char * const *classpaths,
+ unsigned int classpaths_count,
+ bool use_minimal_classpath,
+ const char *exe_dir,
+ const char * const *args,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ bool err = false;
+ unsigned int nargs;
+ char *old_JAVA_HOME;
+
+ /* Count args. */
+ {
+ const char * const *arg;
+
+ for (nargs = 0, arg = args; *arg != NULL; nargs++, arg++)
+ ;
+ }
+
+ /* First, try a class compiled to a native code executable. */
+ if (exe_dir != NULL)
+ {
+ char *exe_pathname = xconcatenated_filename (exe_dir, class_name, EXEEXT);
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((1 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = exe_pathname;
+ for (i = 0; i <= nargs; i++)
+ argv[1 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer (class_name, exe_pathname, argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done1;
+ }
+
+ {
+ const char *java = getenv ("JAVA");
+ if (java != NULL && java[0] != '\0')
+ {
+ /* Because $JAVA may consist of a command and options, we use the
+ shell. Because $JAVA has been set by the user, we leave all
+ all environment variables in place, including JAVA_HOME, and
+ we don't erase the user's CLASSPATH. */
+ char *old_classpath;
+ unsigned int command_length;
+ char *command;
+ char *argv[4];
+ const char * const *arg;
+ char *p;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, false,
+ verbose);
+
+ command_length = strlen (java);
+ command_length += 1 + shell_quote_length (class_name);
+ for (arg = args; *arg != NULL; arg++)
+ command_length += 1 + shell_quote_length (*arg);
+ command_length += 1;
+
+ command = (char *) xmalloca (command_length);
+ p = command;
+ /* Don't shell_quote $JAVA, because it may consist of a command
+ and options. */
+ memcpy (p, java, strlen (java));
+ p += strlen (java);
+ *p++ = ' ';
+ p = shell_quote_copy (p, class_name);
+ for (arg = args; *arg != NULL; arg++)
+ {
+ *p++ = ' ';
+ p = shell_quote_copy (p, *arg);
+ }
+ *p++ = '\0';
+ /* Ensure command_length was correctly calculated. */
+ if (p - command > command_length)
+ abort ();
+
+ if (verbose)
+ printf ("%s\n", command);
+
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = NULL;
+ err = executer (java, "/bin/sh", argv, private_data);
+
+ freea (command);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done1;
+ }
+ }
+
+ /* Unset the JAVA_HOME environment variable. */
+ old_JAVA_HOME = getenv ("JAVA_HOME");
+ if (old_JAVA_HOME != NULL)
+ {
+ old_JAVA_HOME = xstrdup (old_JAVA_HOME);
+ unsetenv ("JAVA_HOME");
+ }
+
+ {
+ static bool gij_tested;
+ static bool gij_present;
+
+ if (!gij_tested)
+ {
+ /* Test for presence of gij: "gij --version > /dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "gij";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ exitstatus = execute ("gij", "gij", argv, false, false, true, true,
+ true, false, NULL);
+ gij_present = (exitstatus == 0);
+ gij_tested = true;
+ }
+
+ if (gij_present)
+ {
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = "gij";
+ argv[1] = (char *) class_name;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("gij", "gij", argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done2;
+ }
+ }
+
+ {
+ static bool java_tested;
+ static bool java_present;
+
+ if (!java_tested)
+ {
+ /* Test for presence of java: "java -version 2> /dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "java";
+ argv[1] = "-version";
+ argv[2] = NULL;
+ exitstatus = execute ("java", "java", argv, false, false, true, true,
+ true, false, NULL);
+ java_present = (exitstatus == 0);
+ java_tested = true;
+ }
+
+ if (java_present)
+ {
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. We don't use the "-classpath ..." option because
+ in JDK 1.1.x its argument should also contain the JDK's classes.zip,
+ but we don't know its location. (In JDK 1.3.0 it would work.) */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = "java";
+ argv[1] = (char *) class_name;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("java", "java", argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done2;
+ }
+ }
+
+ {
+ static bool jre_tested;
+ static bool jre_present;
+
+ if (!jre_tested)
+ {
+ /* Test for presence of jre: "jre 2> /dev/null ; test $? = 1" */
+ char *argv[2];
+ int exitstatus;
+
+ argv[0] = "jre";
+ argv[1] = NULL;
+ exitstatus = execute ("jre", "jre", argv, false, false, true, true,
+ true, false, NULL);
+ jre_present = (exitstatus == 0 || exitstatus == 1);
+ jre_tested = true;
+ }
+
+ if (jre_present)
+ {
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. We don't use the "-classpath ..." option because
+ in JDK 1.1.x its argument should also contain the JDK's classes.zip,
+ but we don't know its location. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = "jre";
+ argv[1] = (char *) class_name;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("jre", "jre", argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done2;
+ }
+ }
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+ /* Win32, Cygwin */
+ {
+ static bool jview_tested;
+ static bool jview_present;
+
+ if (!jview_tested)
+ {
+ /* Test for presence of jview: "jview -? >nul ; test $? = 1" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "jview";
+ argv[1] = "-?";
+ argv[2] = NULL;
+ exitstatus = execute ("jview", "jview", argv, false, false, true, true,
+ true, false, NULL);
+ jview_present = (exitstatus == 0 || exitstatus == 1);
+ jview_tested = true;
+ }
+
+ if (jview_present)
+ {
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = "jview";
+ argv[1] = (char *) class_name;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("jview", "jview", argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done2;
+ }
+ }
+#endif
+
+ if (!quiet)
+ error (0, 0, _("Java virtual machine not found, try installing gij or set $JAVA"));
+ err = true;
+
+ done2:
+ if (old_JAVA_HOME != NULL)
+ {
+ xsetenv ("JAVA_HOME", old_JAVA_HOME, 1);
+ free (old_JAVA_HOME);
+ }
+
+ done1:
+ return err;
+}
diff --git a/gnulib/lib/javaexec.h b/gnulib/lib/javaexec.h
new file mode 100644
index 00000000..b6d65543
--- /dev/null
+++ b/gnulib/lib/javaexec.h
@@ -0,0 +1,50 @@
+/* Execute a Java program.
+ Copyright (C) 2001-2002, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#ifndef _JAVAEXEC_H
+#define _JAVAEXEC_H
+
+#include <stdbool.h>
+
+typedef bool execute_fn (const char *progname,
+ const char *prog_path, char **prog_argv,
+ void *private_data);
+
+/* Execute a Java class.
+ class_name is the Java class name to be executed.
+ classpaths is a list of pathnames to be prepended to the CLASSPATH.
+ use_minimal_classpath = true means to ignore the user's CLASSPATH and
+ use a minimal one. This is likely to reduce possible problems if the
+ user's CLASSPATH contains garbage or a classes.zip file of the wrong
+ Java version.
+ exe_dir is a directory that may contain a native executable for the class.
+ args is a NULL terminated list of arguments to be passed to the program.
+ If verbose, the command to be executed will be printed.
+ Then the command is passed to the execute function together with the
+ private_data argument. This function returns false if OK, true on error.
+ Return false if OK, true on error.
+ If quiet, error messages will not be printed. */
+extern bool execute_java_class (const char *class_name,
+ const char * const *classpaths,
+ unsigned int classpaths_count,
+ bool use_minimal_classpath,
+ const char *exe_dir,
+ const char * const *args,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data);
+
+#endif /* _JAVAEXEC_H */
diff --git a/gnulib/lib/javaversion.c b/gnulib/lib/javaversion.c
new file mode 100644
index 00000000..7d76539d
--- /dev/null
+++ b/gnulib/lib/javaversion.c
@@ -0,0 +1,119 @@
+/* Determine the Java version supported by javaexec.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "javaversion.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+#include "javaexec.h"
+#include "pipe.h"
+#include "wait-process.h"
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+/* Get PKGDATADIR. */
+#include "configmake.h"
+
+
+struct locals
+{
+ /* OUT */
+ char *line;
+};
+
+static bool
+execute_and_read_line (const char *progname,
+ const char *prog_path, char **prog_argv,
+ void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ pid_t child;
+ int fd[1];
+ FILE *fp;
+ char *line;
+ size_t linesize;
+ size_t linelen;
+ int exitstatus;
+
+ /* Open a pipe to the JVM. */
+ child = create_pipe_in (progname, prog_path, prog_argv, DEV_NULL, false,
+ true, false, fd);
+
+ if (child == -1)
+ return false;
+
+ /* Retrieve its result. */
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ {
+ error (0, errno, _("fdopen() failed"));
+ return false;
+ }
+
+ line = NULL; linesize = 0;
+ linelen = getline (&line, &linesize, fp);
+ if (linelen == (size_t)(-1))
+ {
+ error (0, 0, _("%s subprocess I/O error"), progname);
+ return false;
+ }
+ if (linelen > 0 && line[linelen - 1] == '\n')
+ line[linelen - 1] = '\0';
+
+ fclose (fp);
+
+ /* Remove zombie process from process list, and retrieve exit status. */
+ exitstatus =
+ wait_subprocess (child, progname, true, false, true, false, NULL);
+ if (exitstatus != 0)
+ {
+ free (line);
+ return false;
+ }
+
+ l->line = line;
+ return false;
+}
+
+char *
+javaexec_version (void)
+{
+ const char *class_name = "javaversion";
+ const char *pkgdatadir = relocate (PKGDATADIR);
+ const char *args[1];
+ struct locals locals;
+
+ args[0] = NULL;
+ locals.line = NULL;
+ execute_java_class (class_name, &pkgdatadir, 1, true, NULL, args,
+ false, false, execute_and_read_line, &locals);
+
+ return locals.line;
+}
diff --git a/gnulib/lib/javaversion.class b/gnulib/lib/javaversion.class
new file mode 100644
index 00000000..d62585b0
--- /dev/null
+++ b/gnulib/lib/javaversion.class
Binary files differ
diff --git a/gnulib/lib/javaversion.h b/gnulib/lib/javaversion.h
new file mode 100644
index 00000000..03b66c97
--- /dev/null
+++ b/gnulib/lib/javaversion.h
@@ -0,0 +1,39 @@
+/* Determine the Java version supported by javaexec.
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#ifndef _JAVAVERSION_H
+#define _JAVAVERSION_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return information about the Java version used by execute_java_class().
+ This is the value of System.getProperty("java.specification.version").
+ Some possible values are: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6. Return NULL if
+ the Java version cannot be determined. */
+extern char * javaexec_version (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _JAVAVERSION_H */
diff --git a/gnulib/lib/javaversion.java b/gnulib/lib/javaversion.java
new file mode 100644
index 00000000..1d4acd84
--- /dev/null
+++ b/gnulib/lib/javaversion.java
@@ -0,0 +1,31 @@
+/* Show the Java version.
+ * Copyright (C) 2006, 2009, 2010 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/>.
+ */
+
+/**
+ * This program shows the Java version.
+ *
+ * This program _must_ be compiled with
+ * javac -d . -target 1.1 javaversion.java
+ * since its purpose is to show the version of _any_ Java implementation.
+ *
+ * @author Bruno Haible
+ */
+public class javaversion {
+ public static void main (String[] args) {
+ System.out.println(System.getProperty("java.specification.version"));
+ }
+}
diff --git a/gnulib/lib/langinfo.in.h b/gnulib/lib/langinfo.in.h
new file mode 100644
index 00000000..3d3e2baa
--- /dev/null
+++ b/gnulib/lib/langinfo.in.h
@@ -0,0 +1,162 @@
+/* Substitute for and wrapper around <langinfo.h>.
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/*
+ * POSIX <langinfo.h> for platforms that lack it or have an incomplete one.
+ * <http://www.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>
+ */
+
+#ifndef _GL_LANGINFO_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_LANGINFO_H@
+# @INCLUDE_NEXT@ @NEXT_LANGINFO_H@
+#endif
+
+#ifndef _GL_LANGINFO_H
+#define _GL_LANGINFO_H
+
+
+#if !@HAVE_LANGINFO_H@
+
+/* A platform that lacks <langinfo.h>. */
+
+/* Assume that it also lacks <nl_types.h> and the nl_item type. */
+typedef int nl_item;
+
+/* nl_langinfo items of the LC_CTYPE category */
+# define CODESET 10000
+/* nl_langinfo items of the LC_NUMERIC category */
+# define RADIXCHAR 10001
+# define THOUSEP 10002
+/* nl_langinfo items of the LC_TIME category */
+# define D_T_FMT 10003
+# define D_FMT 10004
+# define T_FMT 10005
+# define T_FMT_AMPM 10006
+# define AM_STR 10007
+# define PM_STR 10008
+# define DAY_1 10009
+# define DAY_2 (DAY_1 + 1)
+# define DAY_3 (DAY_1 + 2)
+# define DAY_4 (DAY_1 + 3)
+# define DAY_5 (DAY_1 + 4)
+# define DAY_6 (DAY_1 + 5)
+# define DAY_7 (DAY_1 + 6)
+# define ABDAY_1 10016
+# define ABDAY_2 (ABDAY_1 + 1)
+# define ABDAY_3 (ABDAY_1 + 2)
+# define ABDAY_4 (ABDAY_1 + 3)
+# define ABDAY_5 (ABDAY_1 + 4)
+# define ABDAY_6 (ABDAY_1 + 5)
+# define ABDAY_7 (ABDAY_1 + 6)
+# define MON_1 10023
+# define MON_2 (MON_1 + 1)
+# define MON_3 (MON_1 + 2)
+# define MON_4 (MON_1 + 3)
+# define MON_5 (MON_1 + 4)
+# define MON_6 (MON_1 + 5)
+# define MON_7 (MON_1 + 6)
+# define MON_8 (MON_1 + 7)
+# define MON_9 (MON_1 + 8)
+# define MON_10 (MON_1 + 9)
+# define MON_11 (MON_1 + 10)
+# define MON_12 (MON_1 + 11)
+# define ABMON_1 10035
+# define ABMON_2 (ABMON_1 + 1)
+# define ABMON_3 (ABMON_1 + 2)
+# define ABMON_4 (ABMON_1 + 3)
+# define ABMON_5 (ABMON_1 + 4)
+# define ABMON_6 (ABMON_1 + 5)
+# define ABMON_7 (ABMON_1 + 6)
+# define ABMON_8 (ABMON_1 + 7)
+# define ABMON_9 (ABMON_1 + 8)
+# define ABMON_10 (ABMON_1 + 9)
+# define ABMON_11 (ABMON_1 + 10)
+# define ABMON_12 (ABMON_1 + 11)
+# define ERA 10047
+# define ERA_D_FMT 10048
+# define ERA_D_T_FMT 10049
+# define ERA_T_FMT 10050
+# define ALT_DIGITS 10051
+/* nl_langinfo items of the LC_MONETARY category */
+# define CRNCYSTR 10052
+/* nl_langinfo items of the LC_MESSAGES category */
+# define YESEXPR 10053
+# define NOEXPR 10054
+
+#else
+
+/* A platform that has <langinfo.h>. */
+
+# if !@HAVE_LANGINFO_CODESET@
+# define CODESET 10000
+# define GNULIB_defined_CODESET 1
+# endif
+
+# if !@HAVE_LANGINFO_ERA@
+# define ERA 10047
+# define ERA_D_FMT 10048
+# define ERA_D_T_FMT 10049
+# define ERA_T_FMT 10050
+# define ALT_DIGITS 10051
+# define GNULIB_defined_ERA 1
+# endif
+
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Declare overridden functions. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return a piece of locale dependent information.
+ Note: The difference between nl_langinfo (CODESET) and locale_charset ()
+ is that the latter normalizes the encoding names to GNU conventions. */
+
+#if @GNULIB_NL_LANGINFO@
+# if @REPLACE_NL_LANGINFO@
+# undef nl_langinfo
+# define nl_langinfo rpl_nl_langinfo
+# endif
+# if !@HAVE_NL_LANGINFO@ || @REPLACE_NL_LANGINFO@
+extern char *nl_langinfo (nl_item item);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef nl_langinfo
+# if HAVE_RAW_DECL_NL_LANGINFO
+_GL_WARN_ON_USE (nl_langinfo, "nl_langinfo is not portable - "
+ "use gnulib module nl_langinfo for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_LANGINFO_H */
+#endif /* _GL_LANGINFO_H */
diff --git a/gnulib/lib/lchown.c b/gnulib/lib/lchown.c
new file mode 100644
index 00000000..0d2ecb05
--- /dev/null
+++ b/gnulib/lib/lchown.c
@@ -0,0 +1,116 @@
+/* Provide a stub lchown function for systems that lack it.
+
+ Copyright (C) 1998-1999, 2002, 2004, 2006-2007, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_LCHOWN
+
+/* If the system chown does not follow symlinks, we don't want it
+ replaced by gnulib's chown, which does follow symlinks. */
+# if CHOWN_MODIFIES_SYMLINK
+# undef chown
+# endif
+
+/* Work just like chown, except when FILE is a symbolic link.
+ In that case, set errno to EOPNOTSUPP and return -1.
+ But if autoconf tests determined that chown modifies
+ symlinks, then just call chown. */
+
+int
+lchown (const char *file, uid_t uid, gid_t gid)
+{
+# if HAVE_CHOWN
+# if ! CHOWN_MODIFIES_SYMLINK
+ struct stat stats;
+
+ if (lstat (file, &stats) == 0 && S_ISLNK (stats.st_mode))
+ {
+ errno = EOPNOTSUPP;
+ return -1;
+ }
+# endif
+
+ return chown (file, uid, gid);
+
+# else /* !HAVE_CHOWN */
+ errno = ENOSYS;
+ return -1;
+# endif
+}
+
+#else /* HAVE_LCHOWN */
+
+# undef lchown
+
+/* Work around trailing slash bugs in lchown. */
+int
+rpl_lchown (const char *file, uid_t uid, gid_t gid)
+{
+ struct stat st;
+ bool stat_valid = false;
+ int result;
+
+# if CHOWN_CHANGE_TIME_BUG
+ if (gid != (gid_t) -1 || uid != (uid_t) -1)
+ {
+ if (lstat (file, &st))
+ return -1;
+ stat_valid = true;
+ if (!S_ISLNK (st.st_mode))
+ return chown (file, uid, gid);
+ }
+# endif
+
+# if CHOWN_TRAILING_SLASH_BUG
+ if (!stat_valid)
+ {
+ size_t len = strlen (file);
+ if (len && file[len - 1] == '/')
+ return chown (file, uid, gid);
+ }
+# endif
+
+ result = lchown (file, uid, gid);
+
+# if CHOWN_CHANGE_TIME_BUG && HAVE_LCHMOD
+ if (result == 0 && stat_valid
+ && (uid == st.st_uid || uid == (uid_t) -1)
+ && (gid == st.st_gid || gid == (gid_t) -1))
+ {
+ /* No change in ownership, but at least one argument was not -1,
+ so we are required to update ctime. Since lchown succeeded,
+ we assume that lchmod will do likewise. But if the system
+ lacks lchmod and lutimes, we are out of luck. Oh well. */
+ result = lchmod (file, st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO
+ | S_ISUID | S_ISGID | S_ISVTX));
+ }
+# endif
+
+ return result;
+}
+
+#endif /* HAVE_LCHOWN */
diff --git a/gnulib/lib/ldexpl.c b/gnulib/lib/ldexpl.c
new file mode 100644
index 00000000..a18045ad
--- /dev/null
+++ b/gnulib/lib/ldexpl.c
@@ -0,0 +1,77 @@
+/* Emulation for ldexpl.
+ Contributed by Paolo Bonzini
+
+ Copyright 2002, 2003, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+#include "fpucw.h"
+
+long double
+ldexpl(long double x, int exp)
+{
+ long double factor;
+ int bit;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* Check for zero, nan and infinity. */
+ if (!(isnanl (x) || x + x == x))
+ {
+ if (exp < 0)
+ {
+ exp = -exp;
+ factor = 0.5L;
+ }
+ else
+ factor = 2.0L;
+
+ if (exp > 0)
+ for (bit = 1;;)
+ {
+ /* Invariant: Here bit = 2^i, factor = 2^-2^i or = 2^2^i,
+ and bit <= exp. */
+ if (exp & bit)
+ x *= factor;
+ bit <<= 1;
+ if (bit > exp)
+ break;
+ factor = factor * factor;
+ }
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+
+ return x;
+}
+
+#if 0
+int
+main (void)
+{
+ long double x;
+ int y;
+ for (y = 0; y < 29; y++)
+ printf ("%5d %.16Lg %.16Lg\n", y, ldexpl(0.8L, y), ldexpl(0.8L, -y) * ldexpl(0.8L, y));
+}
+#endif
diff --git a/gnulib/lib/linebuffer.c b/gnulib/lib/linebuffer.c
new file mode 100644
index 00000000..74b7c894
--- /dev/null
+++ b/gnulib/lib/linebuffer.c
@@ -0,0 +1,103 @@
+/* linebuffer.c -- read arbitrarily long lines
+
+ Copyright (C) 1986, 1991, 1998-1999, 2001, 2003-2004, 2006-2007, 2009-2010
+ 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/>. */
+
+/* Written by Richard Stallman. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include "linebuffer.h"
+#include "xalloc.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Initialize linebuffer LINEBUFFER for use. */
+
+void
+initbuffer (struct linebuffer *linebuffer)
+{
+ memset (linebuffer, 0, sizeof *linebuffer);
+}
+
+struct linebuffer *
+readlinebuffer (struct linebuffer *linebuffer, FILE *stream)
+{
+ return readlinebuffer_delim (linebuffer, stream, '\n');
+}
+
+/* Read an arbitrarily long line of text from STREAM into LINEBUFFER.
+ Consider lines to be terminated by DELIMITER.
+ Keep the delimiter; append DELIMITER if it's the last line of a file
+ that ends in a character other than DELIMITER. Do not NUL-terminate.
+ Therefore the stream can contain NUL bytes, and the length
+ (including the delimiter) is returned in linebuffer->length.
+ Return NULL when stream is empty. Return NULL and set errno upon
+ error; callers can distinguish this case from the empty case by
+ invoking ferror (stream).
+ Otherwise, return LINEBUFFER. */
+struct linebuffer *
+readlinebuffer_delim (struct linebuffer *linebuffer, FILE *stream,
+ char delimiter)
+{
+ int c;
+ char *buffer = linebuffer->buffer;
+ char *p = linebuffer->buffer;
+ char *end = buffer + linebuffer->size; /* Sentinel. */
+
+ if (feof (stream))
+ return NULL;
+
+ do
+ {
+ c = getc (stream);
+ if (c == EOF)
+ {
+ if (p == buffer || ferror (stream))
+ return NULL;
+ if (p[-1] == delimiter)
+ break;
+ c = delimiter;
+ }
+ if (p == end)
+ {
+ size_t oldsize = linebuffer->size;
+ buffer = x2realloc (buffer, &linebuffer->size);
+ p = buffer + oldsize;
+ linebuffer->buffer = buffer;
+ end = buffer + linebuffer->size;
+ }
+ *p++ = c;
+ }
+ while (c != delimiter);
+
+ linebuffer->length = p - buffer;
+ return linebuffer;
+}
+
+/* Free the buffer that was allocated for linebuffer LINEBUFFER. */
+
+void
+freebuffer (struct linebuffer *linebuffer)
+{
+ free (linebuffer->buffer);
+}
diff --git a/gnulib/lib/linebuffer.h b/gnulib/lib/linebuffer.h
new file mode 100644
index 00000000..4e121473
--- /dev/null
+++ b/gnulib/lib/linebuffer.h
@@ -0,0 +1,53 @@
+/* linebuffer.h -- declarations for reading arbitrarily long lines
+
+ Copyright (C) 1986, 1991, 1998-1999, 2002-2003, 2007, 2009-2010 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/>. */
+
+#if !defined LINEBUFFER_H
+# define LINEBUFFER_H
+
+# include <stdio.h>
+
+/* A `struct linebuffer' holds a line of text. */
+
+struct linebuffer
+{
+ size_t size; /* Allocated. */
+ size_t length; /* Used. */
+ char *buffer;
+};
+
+/* Initialize linebuffer LINEBUFFER for use. */
+void initbuffer (struct linebuffer *linebuffer);
+
+/* Read an arbitrarily long line of text from STREAM into LINEBUFFER.
+ Consider lines to be terminated by DELIMITER.
+ Keep the delimiter; append DELIMITER if we reach EOF and it wasn't
+ the last character in the file. Do not NUL-terminate.
+ Return LINEBUFFER, except at end of file return NULL. */
+struct linebuffer *readlinebuffer_delim (struct linebuffer *linebuffer,
+ FILE *stream, char delimiter);
+
+/* Read an arbitrarily long line of text from STREAM into LINEBUFFER.
+ Keep the newline; append a newline if it's the last line of a file
+ that ends in a non-newline character. Do not NUL-terminate.
+ Return LINEBUFFER, except at end of file return NULL. */
+struct linebuffer *readlinebuffer (struct linebuffer *linebuffer, FILE *stream);
+
+/* Free linebuffer LINEBUFFER and its data, all allocated with malloc. */
+void freebuffer (struct linebuffer *);
+
+#endif /* LINEBUFFER_H */
diff --git a/gnulib/lib/link.c b/gnulib/lib/link.c
new file mode 100644
index 00000000..90eaa103
--- /dev/null
+++ b/gnulib/lib/link.c
@@ -0,0 +1,203 @@
+/* Emulate link on platforms that lack it, namely native Windows platforms.
+
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_LINK
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* CreateHardLink was introduced only in Windows 2000. */
+typedef BOOL (WINAPI * CreateHardLinkFuncType) (LPCTSTR lpFileName,
+ LPCTSTR lpExistingFileName,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes);
+static CreateHardLinkFuncType CreateHardLinkFunc = NULL;
+static BOOL initialized = FALSE;
+
+static void
+initialize (void)
+{
+ HMODULE kernel32 = GetModuleHandle ("kernel32.dll");
+ if (kernel32 != NULL)
+ {
+ CreateHardLinkFunc =
+ (CreateHardLinkFuncType) GetProcAddress (kernel32, "CreateHardLinkA");
+ }
+ initialized = TRUE;
+}
+
+int
+link (const char *file1, const char *file2)
+{
+ char *dir;
+ size_t len1 = strlen (file1);
+ size_t len2 = strlen (file2);
+ if (!initialized)
+ initialize ();
+ if (CreateHardLinkFunc == NULL)
+ {
+ /* System does not support hard links. */
+ errno = EPERM;
+ return -1;
+ }
+ /* Reject trailing slashes on non-directories; mingw does not
+ support hard-linking directories. */
+ if ((len1 && (file1[len1 - 1] == '/' || file1[len1 - 1] == '\\'))
+ || (len2 && (file2[len2 - 1] == '/' || file2[len2 - 1] == '\\')))
+ {
+ struct stat st;
+ if (stat (file1, &st) == 0 && S_ISDIR (st.st_mode))
+ errno = EPERM;
+ else
+ errno = ENOTDIR;
+ return -1;
+ }
+ /* CreateHardLink("b/.","a",NULL) creates file "b", so we must check
+ that dirname(file2) exists. */
+ dir = strdup (file2);
+ if (!dir)
+ return -1;
+ {
+ struct stat st;
+ char *p = strchr (dir, '\0');
+ while (dir < p && (*--p != '/' && *p != '\\'));
+ *p = '\0';
+ if (p != dir && stat (dir, &st) == -1)
+ {
+ int saved_errno = errno;
+ free (dir);
+ errno = saved_errno;
+ return -1;
+ }
+ free (dir);
+ }
+ /* Now create the link. */
+ if (CreateHardLinkFunc (file2, file1, NULL) == 0)
+ {
+ /* It is not documented which errors CreateHardLink() can produce.
+ * The following conversions are based on tests on a Windows XP SP2
+ * system. */
+ DWORD err = GetLastError ();
+ switch (err)
+ {
+ case ERROR_ACCESS_DENIED:
+ errno = EACCES;
+ break;
+
+ case ERROR_INVALID_FUNCTION: /* fs does not support hard links */
+ errno = EPERM;
+ break;
+
+ case ERROR_NOT_SAME_DEVICE:
+ errno = EXDEV;
+ break;
+
+ case ERROR_PATH_NOT_FOUND:
+ case ERROR_FILE_NOT_FOUND:
+ errno = ENOENT;
+ break;
+
+ case ERROR_INVALID_PARAMETER:
+ errno = ENAMETOOLONG;
+ break;
+
+ case ERROR_TOO_MANY_LINKS:
+ errno = EMLINK;
+ break;
+
+ case ERROR_ALREADY_EXISTS:
+ errno = EEXIST;
+ break;
+
+ default:
+ errno = EIO;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+
+# else /* !Windows */
+
+# error "This platform lacks a link function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+# endif /* !Windows */
+#else /* HAVE_LINK */
+
+# undef link
+
+/* Create a hard link from FILE1 to FILE2, working around platform bugs. */
+int
+rpl_link (char const *file1, char const *file2)
+{
+ /* Reject trailing slashes on non-directories. */
+ size_t len1 = strlen (file1);
+ size_t len2 = strlen (file2);
+ if ((len1 && file1[len1 - 1] == '/')
+ || (len2 && file2[len2 - 1] == '/'))
+ {
+ /* Let link() decide whether hard-linking directories is legal.
+ If stat() fails, then link() should fail for the same reason
+ (although on Solaris 9, link("file/","oops") mistakenly
+ succeeds); if stat() succeeds, require a directory. */
+ struct stat st;
+ if (stat (file1, &st))
+ return -1;
+ if (!S_ISDIR (st.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ else
+ {
+ /* Fix Cygwin 1.5.x bug where link("a","b/.") creates file "b". */
+ char *dir = strdup (file2);
+ struct stat st;
+ char *p;
+ if (!dir)
+ return -1;
+ /* We already know file2 does not end in slash. Strip off the
+ basename, then check that the dirname exists. */
+ p = strrchr (dir, '/');
+ if (p)
+ {
+ *p = '\0';
+ if (stat (dir, &st) == -1)
+ {
+ int saved_errno = errno;
+ free (dir);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ free (dir);
+ }
+ return link (file1, file2);
+}
+#endif /* HAVE_LINK */
diff --git a/gnulib/lib/linkat.c b/gnulib/lib/linkat.c
new file mode 100644
index 00000000..30a61e93
--- /dev/null
+++ b/gnulib/lib/linkat.c
@@ -0,0 +1,290 @@
+/* Create a hard link relative to open directories.
+ Copyright (C) 2009-2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "areadlink.h"
+#include "dirname.h"
+#include "filenamecat.h"
+#include "openat-priv.h"
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifndef MAXSYMLINKS
+# ifdef SYMLOOP_MAX
+# define MAXSYMLINKS SYMLOOP_MAX
+# else
+# define MAXSYMLINKS 20
+# endif
+#endif
+
+#if !HAVE_LINKAT
+
+/* Create a link. If FILE1 is a symlink, either create a hardlink to
+ that symlink, or fake it by creating an identical symlink. */
+# if LINK_FOLLOWS_SYMLINKS == 0
+# define link_immediate link
+# else
+static int
+link_immediate (char const *file1, char const *file2)
+{
+ char *target = areadlink (file1);
+ if (target)
+ {
+ /* A symlink cannot be modified in-place. Therefore, creating
+ an identical symlink behaves like a hard link to a symlink,
+ except for incorrect st_ino and st_nlink. However, we must
+ be careful of EXDEV. */
+ struct stat st1;
+ struct stat st2;
+ char *dir = mdir_name (file2);
+ if (!dir)
+ {
+ free (target);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (lstat (file1, &st1) == 0 && stat (dir, &st2) == 0)
+ {
+ if (st1.st_dev == st2.st_dev)
+ {
+ int result = symlink (target, file2);
+ int saved_errno = errno;
+ free (target);
+ free (dir);
+ errno = saved_errno;
+ return result;
+ }
+ free (target);
+ free (dir);
+ errno = EXDEV;
+ return -1;
+ }
+ free (target);
+ free (dir);
+ }
+ if (errno == ENOMEM)
+ return -1;
+ return link (file1, file2);
+}
+# endif /* LINK_FOLLOWS_SYMLINKS == 0 */
+
+/* Create a link. If FILE1 is a symlink, create a hardlink to the
+ canonicalized file. */
+# if 0 < LINK_FOLLOWS_SYMLINKS
+# define link_follow link
+# else
+static int
+link_follow (char const *file1, char const *file2)
+{
+ char *name = (char *) file1;
+ char *target;
+ int result;
+ int i = MAXSYMLINKS;
+
+ /* Using realpath or canonicalize_file_name is too heavy-handed: we
+ don't need an absolute name, and we don't need to resolve
+ intermediate symlinks, just the basename of each iteration. */
+ while (i-- && (target = areadlink (name)))
+ {
+ if (IS_ABSOLUTE_FILE_NAME (target))
+ {
+ if (name != file1)
+ free (name);
+ name = target;
+ }
+ else
+ {
+ char *dir = mdir_name (name);
+ if (name != file1)
+ free (name);
+ if (!dir)
+ {
+ free (target);
+ errno = ENOMEM;
+ return -1;
+ }
+ name = mfile_name_concat (dir, target, NULL);
+ free (dir);
+ free (target);
+ if (!name)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ }
+ if (i < 0)
+ {
+ target = NULL;
+ errno = ELOOP;
+ }
+ if (!target && errno != EINVAL)
+ {
+ if (name != file1)
+ {
+ int saved_errno = errno;
+ free (name);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ result = link (name, file2);
+ if (name != file1)
+ {
+ int saved_errno = errno;
+ free (name);
+ errno = saved_errno;
+ }
+ return result;
+}
+# endif /* 0 < LINK_FOLLOWS_SYMLINKS */
+
+/* Create a link to FILE1, in the directory open on descriptor FD1, to FILE2,
+ in the directory open on descriptor FD2. If FILE1 is a symlink, FLAG
+ controls whether to dereference FILE1 first. If possible, do it without
+ changing the working directory. Otherwise, resort to using
+ save_cwd/fchdir, then rename/restore_cwd. If either the save_cwd or
+ the restore_cwd fails, then give a diagnostic and exit nonzero. */
+
+int
+linkat (int fd1, char const *file1, int fd2, char const *file2, int flag)
+{
+ if (flag & ~AT_SYMLINK_FOLLOW)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ return at_func2 (fd1, file1, fd2, file2,
+ flag ? link_follow : link_immediate);
+}
+
+#else /* HAVE_LINKAT */
+
+# undef linkat
+
+/* Create a link. If FILE1 is a symlink, create a hardlink to the
+ canonicalized file. */
+
+static int
+linkat_follow (int fd1, char const *file1, int fd2, char const *file2)
+{
+ char *name = (char *) file1;
+ char *target;
+ int result;
+ int i = MAXSYMLINKS;
+
+ /* There is no realpathat. */
+ while (i-- && (target = areadlinkat (fd1, name)))
+ {
+ if (IS_ABSOLUTE_FILE_NAME (target))
+ {
+ if (name != file1)
+ free (name);
+ name = target;
+ }
+ else
+ {
+ char *dir = mdir_name (name);
+ if (name != file1)
+ free (name);
+ if (!dir)
+ {
+ free (target);
+ errno = ENOMEM;
+ return -1;
+ }
+ name = mfile_name_concat (dir, target, NULL);
+ free (dir);
+ free (target);
+ if (!name)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ }
+ if (i < 0)
+ {
+ target = NULL;
+ errno = ELOOP;
+ }
+ if (!target && errno != EINVAL)
+ {
+ if (name != file1)
+ {
+ int saved_errno = errno;
+ free (name);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ result = linkat (fd1, name, fd2, file2, 0);
+ if (name != file1)
+ {
+ int saved_errno = errno;
+ free (name);
+ errno = saved_errno;
+ }
+ return result;
+}
+
+
+/* Like linkat, but guarantee that AT_SYMLINK_FOLLOW works even on
+ older Linux kernels. */
+
+int
+rpl_linkat (int fd1, char const *file1, int fd2, char const *file2, int flag)
+{
+ if (!flag)
+ return linkat (fd1, file1, fd2, file2, flag);
+ if (flag & ~AT_SYMLINK_FOLLOW)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Cache the information on whether the system call really works. */
+ {
+ static int have_follow_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (0 <= have_follow_really)
+ {
+ int result = linkat (fd1, file1, fd2, file2, flag);
+ if (!(result == -1 && errno == EINVAL))
+ {
+ have_follow_really = 1;
+ return result;
+ }
+ have_follow_really = -1;
+ }
+ }
+ return linkat_follow (fd1, file1, fd2, file2);
+}
+
+#endif /* HAVE_LINKAT */
diff --git a/gnulib/lib/listen.c b/gnulib/lib/listen.c
new file mode 100644
index 00000000..4a77de22
--- /dev/null
+++ b/gnulib/lib/listen.c
@@ -0,0 +1,40 @@
+/* listen.c --- wrappers for Windows listen function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef listen
+
+int
+rpl_listen (int fd, int backlog)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = listen (sock, backlog);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/localcharset.c b/gnulib/lib/localcharset.c
new file mode 100644
index 00000000..26a2b03d
--- /dev/null
+++ b/gnulib/lib/localcharset.c
@@ -0,0 +1,549 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2006, 2008-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "localcharset.h"
+
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
+# define DARWIN7 /* Darwin 7 or newer, i.e. MacOS X 10.3 or newer */
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */
+# ifndef OS2
+# define OS2
+# endif
+#endif
+
+#if !defined WIN32_NATIVE
+# include <unistd.h>
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if 0 /* see comment below */
+# include <locale.h>
+# endif
+# endif
+# ifdef __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# endif
+#elif defined WIN32_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* Get LIBDIR. */
+#ifndef LIBDIR
+# include "configmake.h"
+#endif
+
+/* Define O_NOFOLLOW to 0 on platforms where it does not exist. */
+#ifndef O_NOFOLLOW
+# define O_NOFOLLOW 0
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+ possible multithread problem in the function get_charset_aliases. If we
+ are running in a threaded environment, and if two threads initialize
+ 'charset_aliases' simultaneously, both will produce the same value,
+ and everything will be ok if the two assignments to 'charset_aliases'
+ are atomic. But I don't know what will happen if the two assignments mix. */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+ read, else NULL. Its format is:
+ ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file. */
+static const char *
+get_charset_aliases (void)
+{
+ const char *cp;
+
+ cp = charset_aliases;
+ if (cp == NULL)
+ {
+#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
+ const char *dir;
+ const char *base = "charset.alias";
+ char *file_name;
+
+ /* Make it possible to override the charset.alias location. This is
+ necessary for running the testsuite before "make install". */
+ dir = getenv ("CHARSETALIASDIR");
+ if (dir == NULL || dir[0] == '\0')
+ dir = relocate (LIBDIR);
+
+ /* Concatenate dir and base into freshly allocated file_name. */
+ {
+ size_t dir_len = strlen (dir);
+ size_t base_len = strlen (base);
+ int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+ file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+ if (file_name != NULL)
+ {
+ memcpy (file_name, dir, dir_len);
+ if (add_slash)
+ file_name[dir_len] = DIRECTORY_SEPARATOR;
+ memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+ }
+ }
+
+ if (file_name == NULL)
+ /* Out of memory. Treat the file as empty. */
+ cp = "";
+ else
+ {
+ int fd;
+
+ /* Open the file. Reject symbolic links on platforms that support
+ O_NOFOLLOW. This is a security feature. Without it, an attacker
+ could retrieve parts of the contents (namely, the tail of the
+ first line that starts with "* ") of an arbitrary file by placing
+ a symbolic link to that file under the name "charset.alias" in
+ some writable directory and defining the environment variable
+ CHARSETALIASDIR to point to that directory. */
+ fd = open (file_name,
+ O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0));
+ if (fd < 0)
+ /* File not found. Treat it as empty. */
+ cp = "";
+ else
+ {
+ FILE *fp;
+
+ fp = fdopen (fd, "r");
+ if (fp == NULL)
+ {
+ /* Out of memory. Treat the file as empty. */
+ close (fd);
+ cp = "";
+ }
+ else
+ {
+ /* Parse the file's contents. */
+ char *res_ptr = NULL;
+ size_t res_size = 0;
+
+ for (;;)
+ {
+ int c;
+ char buf1[50+1];
+ char buf2[50+1];
+ size_t l1, l2;
+ char *old_res_ptr;
+
+ c = getc (fp);
+ if (c == EOF)
+ break;
+ if (c == '\n' || c == ' ' || c == '\t')
+ continue;
+ if (c == '#')
+ {
+ /* Skip comment, to end of line. */
+ do
+ c = getc (fp);
+ while (!(c == EOF || c == '\n'));
+ if (c == EOF)
+ break;
+ continue;
+ }
+ ungetc (c, fp);
+ if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+ break;
+ l1 = strlen (buf1);
+ l2 = strlen (buf2);
+ old_res_ptr = res_ptr;
+ if (res_size == 0)
+ {
+ res_size = l1 + 1 + l2 + 1;
+ res_ptr = (char *) malloc (res_size + 1);
+ }
+ else
+ {
+ res_size += l1 + 1 + l2 + 1;
+ res_ptr = (char *) realloc (res_ptr, res_size + 1);
+ }
+ if (res_ptr == NULL)
+ {
+ /* Out of memory. */
+ res_size = 0;
+ if (old_res_ptr != NULL)
+ free (old_res_ptr);
+ break;
+ }
+ strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+ strcpy (res_ptr + res_size - (l2 + 1), buf2);
+ }
+ fclose (fp);
+ if (res_size == 0)
+ cp = "";
+ else
+ {
+ *(res_ptr + res_size) = '\0';
+ cp = res_ptr;
+ }
+ }
+ }
+
+ free (file_name);
+ }
+
+#else
+
+# if defined DARWIN7
+ /* To avoid the trouble of installing a file that is shared by many
+ GNU packages -- many packaging systems have problems with this --,
+ simply inline the aliases here. */
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+ "ISO8859-2" "\0" "ISO-8859-2" "\0"
+ "ISO8859-4" "\0" "ISO-8859-4" "\0"
+ "ISO8859-5" "\0" "ISO-8859-5" "\0"
+ "ISO8859-7" "\0" "ISO-8859-7" "\0"
+ "ISO8859-9" "\0" "ISO-8859-9" "\0"
+ "ISO8859-13" "\0" "ISO-8859-13" "\0"
+ "ISO8859-15" "\0" "ISO-8859-15" "\0"
+ "KOI8-R" "\0" "KOI8-R" "\0"
+ "KOI8-U" "\0" "KOI8-U" "\0"
+ "CP866" "\0" "CP866" "\0"
+ "CP949" "\0" "CP949" "\0"
+ "CP1131" "\0" "CP1131" "\0"
+ "CP1251" "\0" "CP1251" "\0"
+ "eucCN" "\0" "GB2312" "\0"
+ "GB2312" "\0" "GB2312" "\0"
+ "eucJP" "\0" "EUC-JP" "\0"
+ "eucKR" "\0" "EUC-KR" "\0"
+ "Big5" "\0" "BIG5" "\0"
+ "Big5HKSCS" "\0" "BIG5-HKSCS" "\0"
+ "GBK" "\0" "GBK" "\0"
+ "GB18030" "\0" "GB18030" "\0"
+ "SJIS" "\0" "SHIFT_JIS" "\0"
+ "ARMSCII-8" "\0" "ARMSCII-8" "\0"
+ "PT154" "\0" "PT154" "\0"
+ /*"ISCII-DEV" "\0" "?" "\0"*/
+ "*" "\0" "UTF-8" "\0";
+# endif
+
+# if defined VMS
+ /* To avoid the troubles of an extra file charset.alias_vms in the
+ sources of many GNU packages, simply inline the aliases here. */
+ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+ "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+ section 10.7 "Handling Different Character Sets". */
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+ "ISO8859-2" "\0" "ISO-8859-2" "\0"
+ "ISO8859-5" "\0" "ISO-8859-5" "\0"
+ "ISO8859-7" "\0" "ISO-8859-7" "\0"
+ "ISO8859-8" "\0" "ISO-8859-8" "\0"
+ "ISO8859-9" "\0" "ISO-8859-9" "\0"
+ /* Japanese */
+ "eucJP" "\0" "EUC-JP" "\0"
+ "SJIS" "\0" "SHIFT_JIS" "\0"
+ "DECKANJI" "\0" "DEC-KANJI" "\0"
+ "SDECKANJI" "\0" "EUC-JP" "\0"
+ /* Chinese */
+ "eucTW" "\0" "EUC-TW" "\0"
+ "DECHANYU" "\0" "DEC-HANYU" "\0"
+ "DECHANZI" "\0" "GB2312" "\0"
+ /* Korean */
+ "DECKOREAN" "\0" "EUC-KR" "\0";
+# endif
+
+# if defined WIN32_NATIVE || defined __CYGWIN__
+ /* To avoid the troubles of installing a separate file in the same
+ directory as the DLL and of retrieving the DLL's directory at
+ runtime, simply inline the aliases here. */
+
+ cp = "CP936" "\0" "GBK" "\0"
+ "CP1361" "\0" "JOHAB" "\0"
+ "CP20127" "\0" "ASCII" "\0"
+ "CP20866" "\0" "KOI8-R" "\0"
+ "CP20936" "\0" "GB2312" "\0"
+ "CP21866" "\0" "KOI8-RU" "\0"
+ "CP28591" "\0" "ISO-8859-1" "\0"
+ "CP28592" "\0" "ISO-8859-2" "\0"
+ "CP28593" "\0" "ISO-8859-3" "\0"
+ "CP28594" "\0" "ISO-8859-4" "\0"
+ "CP28595" "\0" "ISO-8859-5" "\0"
+ "CP28596" "\0" "ISO-8859-6" "\0"
+ "CP28597" "\0" "ISO-8859-7" "\0"
+ "CP28598" "\0" "ISO-8859-8" "\0"
+ "CP28599" "\0" "ISO-8859-9" "\0"
+ "CP28605" "\0" "ISO-8859-15" "\0"
+ "CP38598" "\0" "ISO-8859-8" "\0"
+ "CP51932" "\0" "EUC-JP" "\0"
+ "CP51936" "\0" "GB2312" "\0"
+ "CP51949" "\0" "EUC-KR" "\0"
+ "CP51950" "\0" "EUC-TW" "\0"
+ "CP54936" "\0" "GB18030" "\0"
+ "CP65001" "\0" "UTF-8" "\0";
+# endif
+#endif
+
+ charset_aliases = cp;
+ }
+
+ return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset (void)
+{
+ const char *codeset;
+ const char *aliases;
+
+#if !(defined WIN32_NATIVE || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# ifdef __CYGWIN__
+ /* Cygwin 1.5.x does not have locales. nl_langinfo (CODESET) always
+ returns "US-ASCII". As long as this is not fixed, return the suffix
+ of the locale name from the environment variables (if present) or
+ the codepage as a number. */
+ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
+ {
+ const char *locale;
+ static char buf[2 + 10 + 1];
+
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return
+ it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+ }
+
+ /* Woe32 has a function returning the locale's codepage as a number:
+ GetACP(). This encoding is used by Cygwin, unless the user has set
+ the environment variable CYGWIN=codepage:oem (which very few people
+ do).
+ Output directed to console windows needs to be converted (to
+ GetOEMCP() if the console is using a raster font, or to
+ GetConsoleOutputCP() if it is using a TrueType font). Cygwin does
+ this conversion transparently (see winsup/cygwin/fhandler_console.cc),
+ converting to GetConsoleOutputCP(). This leads to correct results,
+ except when SetConsoleOutputCP has been called and a raster font is
+ in use. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+ }
+# endif
+
+# else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't
+ use setlocale here; it would return "C" when it doesn't support the
+ locale name the user has set. */
+# if 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ }
+
+ /* On some old systems, one used to set locale = "iso8859_1". On others,
+ you set it to "language_COUNTRY.charset". In any case, we resolve it
+ through the charset.alias file. */
+ codeset = locale;
+
+# endif
+
+#elif defined WIN32_NATIVE
+
+ static char buf[2 + 10 + 1];
+
+ /* Woe32 has a function returning the locale's codepage as a number:
+ GetACP().
+ When the output goes to a console window, it needs to be provided in
+ GetOEMCP() encoding if the console is using a raster font, or in
+ GetConsoleOutputCP() encoding if it is using a TrueType font.
+ But in GUI programs and for output sent to files and pipes, GetACP()
+ encoding is the best bet. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+
+#elif defined OS2
+
+ const char *locale;
+ static char buf[2 + 10 + 1];
+ ULONG cp[3];
+ ULONG cplen;
+
+ /* Allow user to override the codeset, as set in the operating system,
+ with standard language environment variables. */
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+
+ /* Resolve through the charset.alias file. */
+ codeset = locale;
+ }
+ else
+ {
+ /* OS/2 has a function returning the locale's codepage as a number. */
+ if (DosQueryCp (sizeof (cp), cp, &cplen))
+ codeset = "";
+ else
+ {
+ sprintf (buf, "CP%u", cp[0]);
+ codeset = buf;
+ }
+ }
+
+#endif
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+ /* Resolve alias. */
+ for (aliases = get_charset_aliases ();
+ *aliases != '\0';
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+ if (strcmp (codeset, aliases) == 0
+ || (aliases[0] == '*' && aliases[1] == '\0'))
+ {
+ codeset = aliases + strlen (aliases) + 1;
+ break;
+ }
+
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ if (codeset[0] == '\0')
+ codeset = "ASCII";
+
+ return codeset;
+}
diff --git a/gnulib/lib/localcharset.h b/gnulib/lib/localcharset.h
new file mode 100644
index 00000000..653ad0fe
--- /dev/null
+++ b/gnulib/lib/localcharset.h
@@ -0,0 +1,41 @@
+/* Determine a canonical name for the current locale's character encoding.
+ Copyright (C) 2000-2003, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU CHARSET Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+extern const char * locale_charset (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/gnulib/lib/locale.in.h b/gnulib/lib/locale.in.h
new file mode 100644
index 00000000..193e9375
--- /dev/null
+++ b/gnulib/lib/locale.in.h
@@ -0,0 +1,62 @@
+/* A POSIX <locale.h>.
+ Copyright (C) 2007-2010 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/>. */
+
+#ifndef _GL_LOCALE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_LOCALE_H@
+
+#ifndef _GL_LOCALE_H
+#define _GL_LOCALE_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MacOS X 10.5 defines the locale_t type in <xlocale.h>. */
+#if @HAVE_XLOCALE_H@
+# include <xlocale.h>
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C.
+ On systems that don't define it, use the same value as GNU libintl. */
+#if !defined LC_MESSAGES
+# define LC_MESSAGES 1729
+#endif
+
+#if @GNULIB_DUPLOCALE@
+# if @REPLACE_DUPLOCALE@
+# undef duplocale
+# define duplocale rpl_duplocale
+extern locale_t duplocale (locale_t locale) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef duplocale
+# if HAVE_RAW_DECL_DUPLOCALE
+_GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - "
+ "use gnulib module duplocale for portability");
+# endif
+#endif
+
+#endif /* _GL_LOCALE_H */
+#endif /* _GL_LOCALE_H */
diff --git a/gnulib/lib/localename.c b/gnulib/lib/localename.c
new file mode 100644
index 00000000..d2554fd9
--- /dev/null
+++ b/gnulib/lib/localename.c
@@ -0,0 +1,2930 @@
+/* Determine name of the currently selected locale.
+ Copyright (C) 1995-2010 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+/* Written by Ulrich Drepper <drepper@gnu.org>, 1995. */
+/* Win32 code written by Tor Lillqvist <tml@iki.fi>. */
+/* MacOS X code written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef IN_LIBINTL
+# include "gettextP.h"
+#else
+# include "localename.h"
+#endif
+
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <string.h>
+
+#if HAVE_USELOCALE
+/* MacOS X 10.5 defines the locale_t type in <xlocale.h>. */
+# if defined __APPLE__ && defined __MACH__
+# include <xlocale.h>
+# endif
+# include <langinfo.h>
+# if !defined IN_LIBINTL
+# include "glthread/lock.h"
+# endif
+#endif
+
+#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+# include <CoreFoundation/CFString.h>
+# if HAVE_CFLOCALECOPYCURRENT
+# include <CoreFoundation/CFLocale.h>
+# elif HAVE_CFPREFERENCESCOPYAPPVALUE
+# include <CoreFoundation/CFPreferences.h>
+# endif
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#if defined WIN32_NATIVE || defined __CYGWIN__ /* WIN32 or Cygwin */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* List of language codes, sorted by value:
+ 0x01 LANG_ARABIC
+ 0x02 LANG_BULGARIAN
+ 0x03 LANG_CATALAN
+ 0x04 LANG_CHINESE
+ 0x05 LANG_CZECH
+ 0x06 LANG_DANISH
+ 0x07 LANG_GERMAN
+ 0x08 LANG_GREEK
+ 0x09 LANG_ENGLISH
+ 0x0a LANG_SPANISH
+ 0x0b LANG_FINNISH
+ 0x0c LANG_FRENCH
+ 0x0d LANG_HEBREW
+ 0x0e LANG_HUNGARIAN
+ 0x0f LANG_ICELANDIC
+ 0x10 LANG_ITALIAN
+ 0x11 LANG_JAPANESE
+ 0x12 LANG_KOREAN
+ 0x13 LANG_DUTCH
+ 0x14 LANG_NORWEGIAN
+ 0x15 LANG_POLISH
+ 0x16 LANG_PORTUGUESE
+ 0x17 LANG_ROMANSH
+ 0x18 LANG_ROMANIAN
+ 0x19 LANG_RUSSIAN
+ 0x1a LANG_CROATIAN == LANG_SERBIAN
+ 0x1b LANG_SLOVAK
+ 0x1c LANG_ALBANIAN
+ 0x1d LANG_SWEDISH
+ 0x1e LANG_THAI
+ 0x1f LANG_TURKISH
+ 0x20 LANG_URDU
+ 0x21 LANG_INDONESIAN
+ 0x22 LANG_UKRAINIAN
+ 0x23 LANG_BELARUSIAN
+ 0x24 LANG_SLOVENIAN
+ 0x25 LANG_ESTONIAN
+ 0x26 LANG_LATVIAN
+ 0x27 LANG_LITHUANIAN
+ 0x28 LANG_TAJIK
+ 0x29 LANG_FARSI
+ 0x2a LANG_VIETNAMESE
+ 0x2b LANG_ARMENIAN
+ 0x2c LANG_AZERI
+ 0x2d LANG_BASQUE
+ 0x2e LANG_SORBIAN
+ 0x2f LANG_MACEDONIAN
+ 0x30 LANG_SUTU
+ 0x31 LANG_TSONGA
+ 0x32 LANG_TSWANA
+ 0x33 LANG_VENDA
+ 0x34 LANG_XHOSA
+ 0x35 LANG_ZULU
+ 0x36 LANG_AFRIKAANS
+ 0x37 LANG_GEORGIAN
+ 0x38 LANG_FAEROESE
+ 0x39 LANG_HINDI
+ 0x3a LANG_MALTESE
+ 0x3b LANG_SAMI
+ 0x3c LANG_GAELIC
+ 0x3d LANG_YIDDISH
+ 0x3e LANG_MALAY
+ 0x3f LANG_KAZAK
+ 0x40 LANG_KYRGYZ
+ 0x41 LANG_SWAHILI
+ 0x42 LANG_TURKMEN
+ 0x43 LANG_UZBEK
+ 0x44 LANG_TATAR
+ 0x45 LANG_BENGALI
+ 0x46 LANG_PUNJABI
+ 0x47 LANG_GUJARATI
+ 0x48 LANG_ORIYA
+ 0x49 LANG_TAMIL
+ 0x4a LANG_TELUGU
+ 0x4b LANG_KANNADA
+ 0x4c LANG_MALAYALAM
+ 0x4d LANG_ASSAMESE
+ 0x4e LANG_MARATHI
+ 0x4f LANG_SANSKRIT
+ 0x50 LANG_MONGOLIAN
+ 0x51 LANG_TIBETAN
+ 0x52 LANG_WELSH
+ 0x53 LANG_CAMBODIAN
+ 0x54 LANG_LAO
+ 0x55 LANG_BURMESE
+ 0x56 LANG_GALICIAN
+ 0x57 LANG_KONKANI
+ 0x58 LANG_MANIPURI
+ 0x59 LANG_SINDHI
+ 0x5a LANG_SYRIAC
+ 0x5b LANG_SINHALESE
+ 0x5c LANG_CHEROKEE
+ 0x5d LANG_INUKTITUT
+ 0x5e LANG_AMHARIC
+ 0x5f LANG_TAMAZIGHT
+ 0x60 LANG_KASHMIRI
+ 0x61 LANG_NEPALI
+ 0x62 LANG_FRISIAN
+ 0x63 LANG_PASHTO
+ 0x64 LANG_TAGALOG
+ 0x65 LANG_DIVEHI
+ 0x66 LANG_EDO
+ 0x67 LANG_FULFULDE
+ 0x68 LANG_HAUSA
+ 0x69 LANG_IBIBIO
+ 0x6a LANG_YORUBA
+ 0x6d LANG_BASHKIR
+ 0x6e LANG_LUXEMBOURGISH
+ 0x6f LANG_GREENLANDIC
+ 0x70 LANG_IGBO
+ 0x71 LANG_KANURI
+ 0x72 LANG_OROMO
+ 0x73 LANG_TIGRINYA
+ 0x74 LANG_GUARANI
+ 0x75 LANG_HAWAIIAN
+ 0x76 LANG_LATIN
+ 0x77 LANG_SOMALI
+ 0x78 LANG_YI
+ 0x79 LANG_PAPIAMENTU
+ 0x7a LANG_MAPUDUNGUN
+ 0x7c LANG_MOHAWK
+ 0x7e LANG_BRETON
+ 0x82 LANG_OCCITAN
+ 0x83 LANG_CORSICAN
+ 0x84 LANG_ALSATIAN
+ 0x85 LANG_YAKUT
+ 0x86 LANG_KICHE
+ 0x87 LANG_KINYARWANDA
+ 0x88 LANG_WOLOF
+ 0x8c LANG_DARI
+ 0x91 LANG_SCOTTISH_GAELIC
+*/
+/* Mingw headers don't have latest language and sublanguage codes. */
+# ifndef LANG_AFRIKAANS
+# define LANG_AFRIKAANS 0x36
+# endif
+# ifndef LANG_ALBANIAN
+# define LANG_ALBANIAN 0x1c
+# endif
+# ifndef LANG_ALSATIAN
+# define LANG_ALSATIAN 0x84
+# endif
+# ifndef LANG_AMHARIC
+# define LANG_AMHARIC 0x5e
+# endif
+# ifndef LANG_ARABIC
+# define LANG_ARABIC 0x01
+# endif
+# ifndef LANG_ARMENIAN
+# define LANG_ARMENIAN 0x2b
+# endif
+# ifndef LANG_ASSAMESE
+# define LANG_ASSAMESE 0x4d
+# endif
+# ifndef LANG_AZERI
+# define LANG_AZERI 0x2c
+# endif
+# ifndef LANG_BASHKIR
+# define LANG_BASHKIR 0x6d
+# endif
+# ifndef LANG_BASQUE
+# define LANG_BASQUE 0x2d
+# endif
+# ifndef LANG_BELARUSIAN
+# define LANG_BELARUSIAN 0x23
+# endif
+# ifndef LANG_BENGALI
+# define LANG_BENGALI 0x45
+# endif
+# ifndef LANG_BRETON
+# define LANG_BRETON 0x7e
+# endif
+# ifndef LANG_BURMESE
+# define LANG_BURMESE 0x55
+# endif
+# ifndef LANG_CAMBODIAN
+# define LANG_CAMBODIAN 0x53
+# endif
+# ifndef LANG_CATALAN
+# define LANG_CATALAN 0x03
+# endif
+# ifndef LANG_CHEROKEE
+# define LANG_CHEROKEE 0x5c
+# endif
+# ifndef LANG_CORSICAN
+# define LANG_CORSICAN 0x83
+# endif
+# ifndef LANG_DARI
+# define LANG_DARI 0x8c
+# endif
+# ifndef LANG_DIVEHI
+# define LANG_DIVEHI 0x65
+# endif
+# ifndef LANG_EDO
+# define LANG_EDO 0x66
+# endif
+# ifndef LANG_ESTONIAN
+# define LANG_ESTONIAN 0x25
+# endif
+# ifndef LANG_FAEROESE
+# define LANG_FAEROESE 0x38
+# endif
+# ifndef LANG_FARSI
+# define LANG_FARSI 0x29
+# endif
+# ifndef LANG_FRISIAN
+# define LANG_FRISIAN 0x62
+# endif
+# ifndef LANG_FULFULDE
+# define LANG_FULFULDE 0x67
+# endif
+# ifndef LANG_GAELIC
+# define LANG_GAELIC 0x3c
+# endif
+# ifndef LANG_GALICIAN
+# define LANG_GALICIAN 0x56
+# endif
+# ifndef LANG_GEORGIAN
+# define LANG_GEORGIAN 0x37
+# endif
+# ifndef LANG_GREENLANDIC
+# define LANG_GREENLANDIC 0x6f
+# endif
+# ifndef LANG_GUARANI
+# define LANG_GUARANI 0x74
+# endif
+# ifndef LANG_GUJARATI
+# define LANG_GUJARATI 0x47
+# endif
+# ifndef LANG_HAUSA
+# define LANG_HAUSA 0x68
+# endif
+# ifndef LANG_HAWAIIAN
+# define LANG_HAWAIIAN 0x75
+# endif
+# ifndef LANG_HEBREW
+# define LANG_HEBREW 0x0d
+# endif
+# ifndef LANG_HINDI
+# define LANG_HINDI 0x39
+# endif
+# ifndef LANG_IBIBIO
+# define LANG_IBIBIO 0x69
+# endif
+# ifndef LANG_IGBO
+# define LANG_IGBO 0x70
+# endif
+# ifndef LANG_INDONESIAN
+# define LANG_INDONESIAN 0x21
+# endif
+# ifndef LANG_INUKTITUT
+# define LANG_INUKTITUT 0x5d
+# endif
+# ifndef LANG_KANNADA
+# define LANG_KANNADA 0x4b
+# endif
+# ifndef LANG_KANURI
+# define LANG_KANURI 0x71
+# endif
+# ifndef LANG_KASHMIRI
+# define LANG_KASHMIRI 0x60
+# endif
+# ifndef LANG_KAZAK
+# define LANG_KAZAK 0x3f
+# endif
+# ifndef LANG_KICHE
+# define LANG_KICHE 0x86
+# endif
+# ifndef LANG_KINYARWANDA
+# define LANG_KINYARWANDA 0x87
+# endif
+# ifndef LANG_KONKANI
+# define LANG_KONKANI 0x57
+# endif
+# ifndef LANG_KYRGYZ
+# define LANG_KYRGYZ 0x40
+# endif
+# ifndef LANG_LAO
+# define LANG_LAO 0x54
+# endif
+# ifndef LANG_LATIN
+# define LANG_LATIN 0x76
+# endif
+# ifndef LANG_LATVIAN
+# define LANG_LATVIAN 0x26
+# endif
+# ifndef LANG_LITHUANIAN
+# define LANG_LITHUANIAN 0x27
+# endif
+# ifndef LANG_LUXEMBOURGISH
+# define LANG_LUXEMBOURGISH 0x6e
+# endif
+# ifndef LANG_MACEDONIAN
+# define LANG_MACEDONIAN 0x2f
+# endif
+# ifndef LANG_MALAY
+# define LANG_MALAY 0x3e
+# endif
+# ifndef LANG_MALAYALAM
+# define LANG_MALAYALAM 0x4c
+# endif
+# ifndef LANG_MALTESE
+# define LANG_MALTESE 0x3a
+# endif
+# ifndef LANG_MANIPURI
+# define LANG_MANIPURI 0x58
+# endif
+# ifndef LANG_MAORI
+# define LANG_MAORI 0x81
+# endif
+# ifndef LANG_MAPUDUNGUN
+# define LANG_MAPUDUNGUN 0x7a
+# endif
+# ifndef LANG_MARATHI
+# define LANG_MARATHI 0x4e
+# endif
+# ifndef LANG_MOHAWK
+# define LANG_MOHAWK 0x7c
+# endif
+# ifndef LANG_MONGOLIAN
+# define LANG_MONGOLIAN 0x50
+# endif
+# ifndef LANG_NEPALI
+# define LANG_NEPALI 0x61
+# endif
+# ifndef LANG_OCCITAN
+# define LANG_OCCITAN 0x82
+# endif
+# ifndef LANG_ORIYA
+# define LANG_ORIYA 0x48
+# endif
+# ifndef LANG_OROMO
+# define LANG_OROMO 0x72
+# endif
+# ifndef LANG_PAPIAMENTU
+# define LANG_PAPIAMENTU 0x79
+# endif
+# ifndef LANG_PASHTO
+# define LANG_PASHTO 0x63
+# endif
+# ifndef LANG_PUNJABI
+# define LANG_PUNJABI 0x46
+# endif
+# ifndef LANG_QUECHUA
+# define LANG_QUECHUA 0x6b
+# endif
+# ifndef LANG_ROMANSH
+# define LANG_ROMANSH 0x17
+# endif
+# ifndef LANG_SAMI
+# define LANG_SAMI 0x3b
+# endif
+# ifndef LANG_SANSKRIT
+# define LANG_SANSKRIT 0x4f
+# endif
+# ifndef LANG_SCOTTISH_GAELIC
+# define LANG_SCOTTISH_GAELIC 0x91
+# endif
+# ifndef LANG_SERBIAN
+# define LANG_SERBIAN 0x1a
+# endif
+# ifndef LANG_SINDHI
+# define LANG_SINDHI 0x59
+# endif
+# ifndef LANG_SINHALESE
+# define LANG_SINHALESE 0x5b
+# endif
+# ifndef LANG_SLOVAK
+# define LANG_SLOVAK 0x1b
+# endif
+# ifndef LANG_SOMALI
+# define LANG_SOMALI 0x77
+# endif
+# ifndef LANG_SORBIAN
+# define LANG_SORBIAN 0x2e
+# endif
+# ifndef LANG_SOTHO
+# define LANG_SOTHO 0x6c
+# endif
+# ifndef LANG_SUTU
+# define LANG_SUTU 0x30
+# endif
+# ifndef LANG_SWAHILI
+# define LANG_SWAHILI 0x41
+# endif
+# ifndef LANG_SYRIAC
+# define LANG_SYRIAC 0x5a
+# endif
+# ifndef LANG_TAGALOG
+# define LANG_TAGALOG 0x64
+# endif
+# ifndef LANG_TAJIK
+# define LANG_TAJIK 0x28
+# endif
+# ifndef LANG_TAMAZIGHT
+# define LANG_TAMAZIGHT 0x5f
+# endif
+# ifndef LANG_TAMIL
+# define LANG_TAMIL 0x49
+# endif
+# ifndef LANG_TATAR
+# define LANG_TATAR 0x44
+# endif
+# ifndef LANG_TELUGU
+# define LANG_TELUGU 0x4a
+# endif
+# ifndef LANG_THAI
+# define LANG_THAI 0x1e
+# endif
+# ifndef LANG_TIBETAN
+# define LANG_TIBETAN 0x51
+# endif
+# ifndef LANG_TIGRINYA
+# define LANG_TIGRINYA 0x73
+# endif
+# ifndef LANG_TSONGA
+# define LANG_TSONGA 0x31
+# endif
+# ifndef LANG_TSWANA
+# define LANG_TSWANA 0x32
+# endif
+# ifndef LANG_TURKMEN
+# define LANG_TURKMEN 0x42
+# endif
+# ifndef LANG_UIGHUR
+# define LANG_UIGHUR 0x80
+# endif
+# ifndef LANG_UKRAINIAN
+# define LANG_UKRAINIAN 0x22
+# endif
+# ifndef LANG_URDU
+# define LANG_URDU 0x20
+# endif
+# ifndef LANG_UZBEK
+# define LANG_UZBEK 0x43
+# endif
+# ifndef LANG_VENDA
+# define LANG_VENDA 0x33
+# endif
+# ifndef LANG_VIETNAMESE
+# define LANG_VIETNAMESE 0x2a
+# endif
+# ifndef LANG_WELSH
+# define LANG_WELSH 0x52
+# endif
+# ifndef LANG_WOLOF
+# define LANG_WOLOF 0x88
+# endif
+# ifndef LANG_XHOSA
+# define LANG_XHOSA 0x34
+# endif
+# ifndef LANG_YAKUT
+# define LANG_YAKUT 0x85
+# endif
+# ifndef LANG_YI
+# define LANG_YI 0x78
+# endif
+# ifndef LANG_YIDDISH
+# define LANG_YIDDISH 0x3d
+# endif
+# ifndef LANG_YORUBA
+# define LANG_YORUBA 0x6a
+# endif
+# ifndef LANG_ZULU
+# define LANG_ZULU 0x35
+# endif
+# ifndef SUBLANG_AFRIKAANS_SOUTH_AFRICA
+# define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01
+# endif
+# ifndef SUBLANG_ALBANIAN_ALBANIA
+# define SUBLANG_ALBANIAN_ALBANIA 0x01
+# endif
+# ifndef SUBLANG_ALSATIAN_FRANCE
+# define SUBLANG_ALSATIAN_FRANCE 0x01
+# endif
+# ifndef SUBLANG_AMHARIC_ETHIOPIA
+# define SUBLANG_AMHARIC_ETHIOPIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_IRAQ
+# define SUBLANG_ARABIC_IRAQ 0x02
+# endif
+# ifndef SUBLANG_ARABIC_EGYPT
+# define SUBLANG_ARABIC_EGYPT 0x03
+# endif
+# ifndef SUBLANG_ARABIC_LIBYA
+# define SUBLANG_ARABIC_LIBYA 0x04
+# endif
+# ifndef SUBLANG_ARABIC_ALGERIA
+# define SUBLANG_ARABIC_ALGERIA 0x05
+# endif
+# ifndef SUBLANG_ARABIC_MOROCCO
+# define SUBLANG_ARABIC_MOROCCO 0x06
+# endif
+# ifndef SUBLANG_ARABIC_TUNISIA
+# define SUBLANG_ARABIC_TUNISIA 0x07
+# endif
+# ifndef SUBLANG_ARABIC_OMAN
+# define SUBLANG_ARABIC_OMAN 0x08
+# endif
+# ifndef SUBLANG_ARABIC_YEMEN
+# define SUBLANG_ARABIC_YEMEN 0x09
+# endif
+# ifndef SUBLANG_ARABIC_SYRIA
+# define SUBLANG_ARABIC_SYRIA 0x0a
+# endif
+# ifndef SUBLANG_ARABIC_JORDAN
+# define SUBLANG_ARABIC_JORDAN 0x0b
+# endif
+# ifndef SUBLANG_ARABIC_LEBANON
+# define SUBLANG_ARABIC_LEBANON 0x0c
+# endif
+# ifndef SUBLANG_ARABIC_KUWAIT
+# define SUBLANG_ARABIC_KUWAIT 0x0d
+# endif
+# ifndef SUBLANG_ARABIC_UAE
+# define SUBLANG_ARABIC_UAE 0x0e
+# endif
+# ifndef SUBLANG_ARABIC_BAHRAIN
+# define SUBLANG_ARABIC_BAHRAIN 0x0f
+# endif
+# ifndef SUBLANG_ARABIC_QATAR
+# define SUBLANG_ARABIC_QATAR 0x10
+# endif
+# ifndef SUBLANG_ARMENIAN_ARMENIA
+# define SUBLANG_ARMENIAN_ARMENIA 0x01
+# endif
+# ifndef SUBLANG_ASSAMESE_INDIA
+# define SUBLANG_ASSAMESE_INDIA 0x01
+# endif
+# ifndef SUBLANG_AZERI_LATIN
+# define SUBLANG_AZERI_LATIN 0x01
+# endif
+# ifndef SUBLANG_AZERI_CYRILLIC
+# define SUBLANG_AZERI_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_BASHKIR_RUSSIA
+# define SUBLANG_BASHKIR_RUSSIA 0x01
+# endif
+# ifndef SUBLANG_BASQUE_BASQUE
+# define SUBLANG_BASQUE_BASQUE 0x01
+# endif
+# ifndef SUBLANG_BELARUSIAN_BELARUS
+# define SUBLANG_BELARUSIAN_BELARUS 0x01
+# endif
+# ifndef SUBLANG_BENGALI_INDIA
+# define SUBLANG_BENGALI_INDIA 0x01
+# endif
+# ifndef SUBLANG_BENGALI_BANGLADESH
+# define SUBLANG_BENGALI_BANGLADESH 0x02
+# endif
+# ifndef SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN
+# define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05
+# endif
+# ifndef SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC
+# define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08
+# endif
+# ifndef SUBLANG_BRETON_FRANCE
+# define SUBLANG_BRETON_FRANCE 0x01
+# endif
+# ifndef SUBLANG_BULGARIAN_BULGARIA
+# define SUBLANG_BULGARIAN_BULGARIA 0x01
+# endif
+# ifndef SUBLANG_CAMBODIAN_CAMBODIA
+# define SUBLANG_CAMBODIAN_CAMBODIA 0x01
+# endif
+# ifndef SUBLANG_CATALAN_SPAIN
+# define SUBLANG_CATALAN_SPAIN 0x01
+# endif
+# ifndef SUBLANG_CORSICAN_FRANCE
+# define SUBLANG_CORSICAN_FRANCE 0x01
+# endif
+# ifndef SUBLANG_CROATIAN_CROATIA
+# define SUBLANG_CROATIAN_CROATIA 0x01
+# endif
+# ifndef SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN
+# define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04
+# endif
+# ifndef SUBLANG_CHINESE_MACAU
+# define SUBLANG_CHINESE_MACAU 0x05
+# endif
+# ifndef SUBLANG_CZECH_CZECH_REPUBLIC
+# define SUBLANG_CZECH_CZECH_REPUBLIC 0x01
+# endif
+# ifndef SUBLANG_DANISH_DENMARK
+# define SUBLANG_DANISH_DENMARK 0x01
+# endif
+# ifndef SUBLANG_DARI_AFGHANISTAN
+# define SUBLANG_DARI_AFGHANISTAN 0x01
+# endif
+# ifndef SUBLANG_DIVEHI_MALDIVES
+# define SUBLANG_DIVEHI_MALDIVES 0x01
+# endif
+# ifndef SUBLANG_DUTCH_SURINAM
+# define SUBLANG_DUTCH_SURINAM 0x03
+# endif
+# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
+# endif
+# ifndef SUBLANG_ENGLISH_JAMAICA
+# define SUBLANG_ENGLISH_JAMAICA 0x08
+# endif
+# ifndef SUBLANG_ENGLISH_CARIBBEAN
+# define SUBLANG_ENGLISH_CARIBBEAN 0x09
+# endif
+# ifndef SUBLANG_ENGLISH_BELIZE
+# define SUBLANG_ENGLISH_BELIZE 0x0a
+# endif
+# ifndef SUBLANG_ENGLISH_TRINIDAD
+# define SUBLANG_ENGLISH_TRINIDAD 0x0b
+# endif
+# ifndef SUBLANG_ENGLISH_ZIMBABWE
+# define SUBLANG_ENGLISH_ZIMBABWE 0x0c
+# endif
+# ifndef SUBLANG_ENGLISH_PHILIPPINES
+# define SUBLANG_ENGLISH_PHILIPPINES 0x0d
+# endif
+# ifndef SUBLANG_ENGLISH_INDONESIA
+# define SUBLANG_ENGLISH_INDONESIA 0x0e
+# endif
+# ifndef SUBLANG_ENGLISH_HONGKONG
+# define SUBLANG_ENGLISH_HONGKONG 0x0f
+# endif
+# ifndef SUBLANG_ENGLISH_INDIA
+# define SUBLANG_ENGLISH_INDIA 0x10
+# endif
+# ifndef SUBLANG_ENGLISH_MALAYSIA
+# define SUBLANG_ENGLISH_MALAYSIA 0x11
+# endif
+# ifndef SUBLANG_ENGLISH_SINGAPORE
+# define SUBLANG_ENGLISH_SINGAPORE 0x12
+# endif
+# ifndef SUBLANG_ESTONIAN_ESTONIA
+# define SUBLANG_ESTONIAN_ESTONIA 0x01
+# endif
+# ifndef SUBLANG_FAEROESE_FAROE_ISLANDS
+# define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01
+# endif
+# ifndef SUBLANG_FARSI_IRAN
+# define SUBLANG_FARSI_IRAN 0x01
+# endif
+# ifndef SUBLANG_FINNISH_FINLAND
+# define SUBLANG_FINNISH_FINLAND 0x01
+# endif
+# ifndef SUBLANG_FRENCH_LUXEMBOURG
+# define SUBLANG_FRENCH_LUXEMBOURG 0x05
+# endif
+# ifndef SUBLANG_FRENCH_MONACO
+# define SUBLANG_FRENCH_MONACO 0x06
+# endif
+# ifndef SUBLANG_FRENCH_WESTINDIES
+# define SUBLANG_FRENCH_WESTINDIES 0x07
+# endif
+# ifndef SUBLANG_FRENCH_REUNION
+# define SUBLANG_FRENCH_REUNION 0x08
+# endif
+# ifndef SUBLANG_FRENCH_CONGO
+# define SUBLANG_FRENCH_CONGO 0x09
+# endif
+# ifndef SUBLANG_FRENCH_SENEGAL
+# define SUBLANG_FRENCH_SENEGAL 0x0a
+# endif
+# ifndef SUBLANG_FRENCH_CAMEROON
+# define SUBLANG_FRENCH_CAMEROON 0x0b
+# endif
+# ifndef SUBLANG_FRENCH_COTEDIVOIRE
+# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c
+# endif
+# ifndef SUBLANG_FRENCH_MALI
+# define SUBLANG_FRENCH_MALI 0x0d
+# endif
+# ifndef SUBLANG_FRENCH_MOROCCO
+# define SUBLANG_FRENCH_MOROCCO 0x0e
+# endif
+# ifndef SUBLANG_FRENCH_HAITI
+# define SUBLANG_FRENCH_HAITI 0x0f
+# endif
+# ifndef SUBLANG_FRISIAN_NETHERLANDS
+# define SUBLANG_FRISIAN_NETHERLANDS 0x01
+# endif
+# ifndef SUBLANG_GALICIAN_SPAIN
+# define SUBLANG_GALICIAN_SPAIN 0x01
+# endif
+# ifndef SUBLANG_GEORGIAN_GEORGIA
+# define SUBLANG_GEORGIAN_GEORGIA 0x01
+# endif
+# ifndef SUBLANG_GERMAN_LUXEMBOURG
+# define SUBLANG_GERMAN_LUXEMBOURG 0x04
+# endif
+# ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
+# endif
+# ifndef SUBLANG_GREEK_GREECE
+# define SUBLANG_GREEK_GREECE 0x01
+# endif
+# ifndef SUBLANG_GREENLANDIC_GREENLAND
+# define SUBLANG_GREENLANDIC_GREENLAND 0x01
+# endif
+# ifndef SUBLANG_GUJARATI_INDIA
+# define SUBLANG_GUJARATI_INDIA 0x01
+# endif
+# ifndef SUBLANG_HAUSA_NIGERIA_LATIN
+# define SUBLANG_HAUSA_NIGERIA_LATIN 0x01
+# endif
+# ifndef SUBLANG_HEBREW_ISRAEL
+# define SUBLANG_HEBREW_ISRAEL 0x01
+# endif
+# ifndef SUBLANG_HINDI_INDIA
+# define SUBLANG_HINDI_INDIA 0x01
+# endif
+# ifndef SUBLANG_HUNGARIAN_HUNGARY
+# define SUBLANG_HUNGARIAN_HUNGARY 0x01
+# endif
+# ifndef SUBLANG_ICELANDIC_ICELAND
+# define SUBLANG_ICELANDIC_ICELAND 0x01
+# endif
+# ifndef SUBLANG_IGBO_NIGERIA
+# define SUBLANG_IGBO_NIGERIA 0x01
+# endif
+# ifndef SUBLANG_INDONESIAN_INDONESIA
+# define SUBLANG_INDONESIAN_INDONESIA 0x01
+# endif
+# ifndef SUBLANG_INUKTITUT_CANADA
+# define SUBLANG_INUKTITUT_CANADA 0x01
+# endif
+# undef SUBLANG_INUKTITUT_CANADA_LATIN
+# define SUBLANG_INUKTITUT_CANADA_LATIN 0x02
+# undef SUBLANG_IRISH_IRELAND
+# define SUBLANG_IRISH_IRELAND 0x02
+# ifndef SUBLANG_JAPANESE_JAPAN
+# define SUBLANG_JAPANESE_JAPAN 0x01
+# endif
+# ifndef SUBLANG_KANNADA_INDIA
+# define SUBLANG_KANNADA_INDIA 0x01
+# endif
+# ifndef SUBLANG_KASHMIRI_INDIA
+# define SUBLANG_KASHMIRI_INDIA 0x02
+# endif
+# ifndef SUBLANG_KAZAK_KAZAKHSTAN
+# define SUBLANG_KAZAK_KAZAKHSTAN 0x01
+# endif
+# ifndef SUBLANG_KICHE_GUATEMALA
+# define SUBLANG_KICHE_GUATEMALA 0x01
+# endif
+# ifndef SUBLANG_KINYARWANDA_RWANDA
+# define SUBLANG_KINYARWANDA_RWANDA 0x01
+# endif
+# ifndef SUBLANG_KONKANI_INDIA
+# define SUBLANG_KONKANI_INDIA 0x01
+# endif
+# ifndef SUBLANG_KYRGYZ_KYRGYZSTAN
+# define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01
+# endif
+# ifndef SUBLANG_LAO_LAOS
+# define SUBLANG_LAO_LAOS 0x01
+# endif
+# ifndef SUBLANG_LATVIAN_LATVIA
+# define SUBLANG_LATVIAN_LATVIA 0x01
+# endif
+# ifndef SUBLANG_LITHUANIAN_LITHUANIA
+# define SUBLANG_LITHUANIAN_LITHUANIA 0x01
+# endif
+# undef SUBLANG_LOWER_SORBIAN_GERMANY
+# define SUBLANG_LOWER_SORBIAN_GERMANY 0x02
+# ifndef SUBLANG_LUXEMBOURGISH_LUXEMBOURG
+# define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01
+# endif
+# ifndef SUBLANG_MACEDONIAN_MACEDONIA
+# define SUBLANG_MACEDONIAN_MACEDONIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_MALAYSIA
+# define SUBLANG_MALAY_MALAYSIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+# endif
+# ifndef SUBLANG_MALAYALAM_INDIA
+# define SUBLANG_MALAYALAM_INDIA 0x01
+# endif
+# ifndef SUBLANG_MALTESE_MALTA
+# define SUBLANG_MALTESE_MALTA 0x01
+# endif
+# ifndef SUBLANG_MAORI_NEW_ZEALAND
+# define SUBLANG_MAORI_NEW_ZEALAND 0x01
+# endif
+# ifndef SUBLANG_MAPUDUNGUN_CHILE
+# define SUBLANG_MAPUDUNGUN_CHILE 0x01
+# endif
+# ifndef SUBLANG_MARATHI_INDIA
+# define SUBLANG_MARATHI_INDIA 0x01
+# endif
+# ifndef SUBLANG_MOHAWK_CANADA
+# define SUBLANG_MOHAWK_CANADA 0x01
+# endif
+# ifndef SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA
+# define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01
+# endif
+# ifndef SUBLANG_MONGOLIAN_PRC
+# define SUBLANG_MONGOLIAN_PRC 0x02
+# endif
+# ifndef SUBLANG_NEPALI_NEPAL
+# define SUBLANG_NEPALI_NEPAL 0x01
+# endif
+# ifndef SUBLANG_NEPALI_INDIA
+# define SUBLANG_NEPALI_INDIA 0x02
+# endif
+# ifndef SUBLANG_OCCITAN_FRANCE
+# define SUBLANG_OCCITAN_FRANCE 0x01
+# endif
+# ifndef SUBLANG_ORIYA_INDIA
+# define SUBLANG_ORIYA_INDIA 0x01
+# endif
+# ifndef SUBLANG_PASHTO_AFGHANISTAN
+# define SUBLANG_PASHTO_AFGHANISTAN 0x01
+# endif
+# ifndef SUBLANG_POLISH_POLAND
+# define SUBLANG_POLISH_POLAND 0x01
+# endif
+# ifndef SUBLANG_PUNJABI_INDIA
+# define SUBLANG_PUNJABI_INDIA 0x01
+# endif
+# ifndef SUBLANG_PUNJABI_PAKISTAN
+# define SUBLANG_PUNJABI_PAKISTAN 0x02
+# endif
+# ifndef SUBLANG_QUECHUA_BOLIVIA
+# define SUBLANG_QUECHUA_BOLIVIA 0x01
+# endif
+# ifndef SUBLANG_QUECHUA_ECUADOR
+# define SUBLANG_QUECHUA_ECUADOR 0x02
+# endif
+# ifndef SUBLANG_QUECHUA_PERU
+# define SUBLANG_QUECHUA_PERU 0x03
+# endif
+# ifndef SUBLANG_ROMANIAN_ROMANIA
+# define SUBLANG_ROMANIAN_ROMANIA 0x01
+# endif
+# ifndef SUBLANG_ROMANIAN_MOLDOVA
+# define SUBLANG_ROMANIAN_MOLDOVA 0x02
+# endif
+# ifndef SUBLANG_ROMANSH_SWITZERLAND
+# define SUBLANG_ROMANSH_SWITZERLAND 0x01
+# endif
+# ifndef SUBLANG_RUSSIAN_RUSSIA
+# define SUBLANG_RUSSIAN_RUSSIA 0x01
+# endif
+# ifndef SUBLANG_RUSSIAN_MOLDAVIA
+# define SUBLANG_RUSSIAN_MOLDAVIA 0x02
+# endif
+# ifndef SUBLANG_SAMI_NORTHERN_NORWAY
+# define SUBLANG_SAMI_NORTHERN_NORWAY 0x01
+# endif
+# ifndef SUBLANG_SAMI_NORTHERN_SWEDEN
+# define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02
+# endif
+# ifndef SUBLANG_SAMI_NORTHERN_FINLAND
+# define SUBLANG_SAMI_NORTHERN_FINLAND 0x03
+# endif
+# ifndef SUBLANG_SAMI_LULE_NORWAY
+# define SUBLANG_SAMI_LULE_NORWAY 0x04
+# endif
+# ifndef SUBLANG_SAMI_LULE_SWEDEN
+# define SUBLANG_SAMI_LULE_SWEDEN 0x05
+# endif
+# ifndef SUBLANG_SAMI_SOUTHERN_NORWAY
+# define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06
+# endif
+# ifndef SUBLANG_SAMI_SOUTHERN_SWEDEN
+# define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07
+# endif
+# undef SUBLANG_SAMI_SKOLT_FINLAND
+# define SUBLANG_SAMI_SKOLT_FINLAND 0x08
+# undef SUBLANG_SAMI_INARI_FINLAND
+# define SUBLANG_SAMI_INARI_FINLAND 0x09
+# ifndef SUBLANG_SANSKRIT_INDIA
+# define SUBLANG_SANSKRIT_INDIA 0x01
+# endif
+# ifndef SUBLANG_SERBIAN_LATIN
+# define SUBLANG_SERBIAN_LATIN 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_CYRILLIC
+# define SUBLANG_SERBIAN_CYRILLIC 0x03
+# endif
+# ifndef SUBLANG_SINDHI_INDIA
+# define SUBLANG_SINDHI_INDIA 0x01
+# endif
+# undef SUBLANG_SINDHI_PAKISTAN
+# define SUBLANG_SINDHI_PAKISTAN 0x02
+# ifndef SUBLANG_SINDHI_AFGHANISTAN
+# define SUBLANG_SINDHI_AFGHANISTAN 0x02
+# endif
+# ifndef SUBLANG_SINHALESE_SRI_LANKA
+# define SUBLANG_SINHALESE_SRI_LANKA 0x01
+# endif
+# ifndef SUBLANG_SLOVAK_SLOVAKIA
+# define SUBLANG_SLOVAK_SLOVAKIA 0x01
+# endif
+# ifndef SUBLANG_SLOVENIAN_SLOVENIA
+# define SUBLANG_SLOVENIAN_SLOVENIA 0x01
+# endif
+# ifndef SUBLANG_SOTHO_SOUTH_AFRICA
+# define SUBLANG_SOTHO_SOUTH_AFRICA 0x01
+# endif
+# ifndef SUBLANG_SPANISH_GUATEMALA
+# define SUBLANG_SPANISH_GUATEMALA 0x04
+# endif
+# ifndef SUBLANG_SPANISH_COSTA_RICA
+# define SUBLANG_SPANISH_COSTA_RICA 0x05
+# endif
+# ifndef SUBLANG_SPANISH_PANAMA
+# define SUBLANG_SPANISH_PANAMA 0x06
+# endif
+# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+# endif
+# ifndef SUBLANG_SPANISH_VENEZUELA
+# define SUBLANG_SPANISH_VENEZUELA 0x08
+# endif
+# ifndef SUBLANG_SPANISH_COLOMBIA
+# define SUBLANG_SPANISH_COLOMBIA 0x09
+# endif
+# ifndef SUBLANG_SPANISH_PERU
+# define SUBLANG_SPANISH_PERU 0x0a
+# endif
+# ifndef SUBLANG_SPANISH_ARGENTINA
+# define SUBLANG_SPANISH_ARGENTINA 0x0b
+# endif
+# ifndef SUBLANG_SPANISH_ECUADOR
+# define SUBLANG_SPANISH_ECUADOR 0x0c
+# endif
+# ifndef SUBLANG_SPANISH_CHILE
+# define SUBLANG_SPANISH_CHILE 0x0d
+# endif
+# ifndef SUBLANG_SPANISH_URUGUAY
+# define SUBLANG_SPANISH_URUGUAY 0x0e
+# endif
+# ifndef SUBLANG_SPANISH_PARAGUAY
+# define SUBLANG_SPANISH_PARAGUAY 0x0f
+# endif
+# ifndef SUBLANG_SPANISH_BOLIVIA
+# define SUBLANG_SPANISH_BOLIVIA 0x10
+# endif
+# ifndef SUBLANG_SPANISH_EL_SALVADOR
+# define SUBLANG_SPANISH_EL_SALVADOR 0x11
+# endif
+# ifndef SUBLANG_SPANISH_HONDURAS
+# define SUBLANG_SPANISH_HONDURAS 0x12
+# endif
+# ifndef SUBLANG_SPANISH_NICARAGUA
+# define SUBLANG_SPANISH_NICARAGUA 0x13
+# endif
+# ifndef SUBLANG_SPANISH_PUERTO_RICO
+# define SUBLANG_SPANISH_PUERTO_RICO 0x14
+# endif
+# ifndef SUBLANG_SPANISH_US
+# define SUBLANG_SPANISH_US 0x15
+# endif
+# ifndef SUBLANG_SWAHILI_KENYA
+# define SUBLANG_SWAHILI_KENYA 0x01
+# endif
+# ifndef SUBLANG_SWEDISH_SWEDEN
+# define SUBLANG_SWEDISH_SWEDEN 0x01
+# endif
+# ifndef SUBLANG_SWEDISH_FINLAND
+# define SUBLANG_SWEDISH_FINLAND 0x02
+# endif
+# ifndef SUBLANG_SYRIAC_SYRIA
+# define SUBLANG_SYRIAC_SYRIA 0x01
+# endif
+# ifndef SUBLANG_TAGALOG_PHILIPPINES
+# define SUBLANG_TAGALOG_PHILIPPINES 0x01
+# endif
+# ifndef SUBLANG_TAJIK_TAJIKISTAN
+# define SUBLANG_TAJIK_TAJIKISTAN 0x01
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ARABIC
+# define SUBLANG_TAMAZIGHT_ARABIC 0x01
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ALGERIA_LATIN
+# define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02
+# endif
+# ifndef SUBLANG_TAMIL_INDIA
+# define SUBLANG_TAMIL_INDIA 0x01
+# endif
+# ifndef SUBLANG_TATAR_RUSSIA
+# define SUBLANG_TATAR_RUSSIA 0x01
+# endif
+# ifndef SUBLANG_TELUGU_INDIA
+# define SUBLANG_TELUGU_INDIA 0x01
+# endif
+# ifndef SUBLANG_THAI_THAILAND
+# define SUBLANG_THAI_THAILAND 0x01
+# endif
+# ifndef SUBLANG_TIBETAN_PRC
+# define SUBLANG_TIBETAN_PRC 0x01
+# endif
+# undef SUBLANG_TIBETAN_BHUTAN
+# define SUBLANG_TIBETAN_BHUTAN 0x02
+# ifndef SUBLANG_TIGRINYA_ETHIOPIA
+# define SUBLANG_TIGRINYA_ETHIOPIA 0x01
+# endif
+# ifndef SUBLANG_TIGRINYA_ERITREA
+# define SUBLANG_TIGRINYA_ERITREA 0x02
+# endif
+# ifndef SUBLANG_TSWANA_SOUTH_AFRICA
+# define SUBLANG_TSWANA_SOUTH_AFRICA 0x01
+# endif
+# ifndef SUBLANG_TURKISH_TURKEY
+# define SUBLANG_TURKISH_TURKEY 0x01
+# endif
+# ifndef SUBLANG_TURKMEN_TURKMENISTAN
+# define SUBLANG_TURKMEN_TURKMENISTAN 0x01
+# endif
+# ifndef SUBLANG_UIGHUR_PRC
+# define SUBLANG_UIGHUR_PRC 0x01
+# endif
+# ifndef SUBLANG_UKRAINIAN_UKRAINE
+# define SUBLANG_UKRAINIAN_UKRAINE 0x01
+# endif
+# ifndef SUBLANG_UPPER_SORBIAN_GERMANY
+# define SUBLANG_UPPER_SORBIAN_GERMANY 0x01
+# endif
+# ifndef SUBLANG_URDU_PAKISTAN
+# define SUBLANG_URDU_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_URDU_INDIA
+# define SUBLANG_URDU_INDIA 0x02
+# endif
+# ifndef SUBLANG_UZBEK_LATIN
+# define SUBLANG_UZBEK_LATIN 0x01
+# endif
+# ifndef SUBLANG_UZBEK_CYRILLIC
+# define SUBLANG_UZBEK_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_VIETNAMESE_VIETNAM
+# define SUBLANG_VIETNAMESE_VIETNAM 0x01
+# endif
+# ifndef SUBLANG_WELSH_UNITED_KINGDOM
+# define SUBLANG_WELSH_UNITED_KINGDOM 0x01
+# endif
+# ifndef SUBLANG_WOLOF_SENEGAL
+# define SUBLANG_WOLOF_SENEGAL 0x01
+# endif
+# ifndef SUBLANG_XHOSA_SOUTH_AFRICA
+# define SUBLANG_XHOSA_SOUTH_AFRICA 0x01
+# endif
+# ifndef SUBLANG_YAKUT_RUSSIA
+# define SUBLANG_YAKUT_RUSSIA 0x01
+# endif
+# ifndef SUBLANG_YI_PRC
+# define SUBLANG_YI_PRC 0x01
+# endif
+# ifndef SUBLANG_YORUBA_NIGERIA
+# define SUBLANG_YORUBA_NIGERIA 0x01
+# endif
+# ifndef SUBLANG_ZULU_SOUTH_AFRICA
+# define SUBLANG_ZULU_SOUTH_AFRICA 0x01
+# endif
+/* GetLocaleInfoA operations. */
+# ifndef LOCALE_SNAME
+# define LOCALE_SNAME 0x5c
+# endif
+#endif
+
+
+#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+/* MacOS X 10.2 or newer */
+
+/* Canonicalize a MacOS X locale name to a Unix locale name.
+ NAME is a sufficiently large buffer.
+ On input, it contains the MacOS X locale name.
+ On output, it contains the Unix locale name. */
+# if !defined IN_LIBINTL
+static
+# endif
+void
+gl_locale_name_canonicalize (char *name)
+{
+ /* This conversion is based on a posting by
+ Deborah GoldSmith <goldsmit@apple.com> on 2005-03-08,
+ http://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html */
+
+ /* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 and
+ ISO 3166) names. Prior to MacOS X 10.3, there is no API for doing this.
+ Therefore we do it ourselves, using a table based on the results of the
+ MacOS X 10.3.8 function
+ CFLocaleCreateCanonicalLocaleIdentifierFromString(). */
+ typedef struct { const char legacy[21+1]; const char unixy[5+1]; }
+ legacy_entry;
+ static const legacy_entry legacy_table[] = {
+ { "Afrikaans", "af" },
+ { "Albanian", "sq" },
+ { "Amharic", "am" },
+ { "Arabic", "ar" },
+ { "Armenian", "hy" },
+ { "Assamese", "as" },
+ { "Aymara", "ay" },
+ { "Azerbaijani", "az" },
+ { "Basque", "eu" },
+ { "Belarusian", "be" },
+ { "Belorussian", "be" },
+ { "Bengali", "bn" },
+ { "Brazilian Portugese", "pt_BR" },
+ { "Brazilian Portuguese", "pt_BR" },
+ { "Breton", "br" },
+ { "Bulgarian", "bg" },
+ { "Burmese", "my" },
+ { "Byelorussian", "be" },
+ { "Catalan", "ca" },
+ { "Chewa", "ny" },
+ { "Chichewa", "ny" },
+ { "Chinese", "zh" },
+ { "Chinese, Simplified", "zh_CN" },
+ { "Chinese, Traditional", "zh_TW" },
+ { "Chinese, Tradtional", "zh_TW" },
+ { "Croatian", "hr" },
+ { "Czech", "cs" },
+ { "Danish", "da" },
+ { "Dutch", "nl" },
+ { "Dzongkha", "dz" },
+ { "English", "en" },
+ { "Esperanto", "eo" },
+ { "Estonian", "et" },
+ { "Faroese", "fo" },
+ { "Farsi", "fa" },
+ { "Finnish", "fi" },
+ { "Flemish", "nl_BE" },
+ { "French", "fr" },
+ { "Galician", "gl" },
+ { "Gallegan", "gl" },
+ { "Georgian", "ka" },
+ { "German", "de" },
+ { "Greek", "el" },
+ { "Greenlandic", "kl" },
+ { "Guarani", "gn" },
+ { "Gujarati", "gu" },
+ { "Hawaiian", "haw" }, /* Yes, "haw", not "cpe". */
+ { "Hebrew", "he" },
+ { "Hindi", "hi" },
+ { "Hungarian", "hu" },
+ { "Icelandic", "is" },
+ { "Indonesian", "id" },
+ { "Inuktitut", "iu" },
+ { "Irish", "ga" },
+ { "Italian", "it" },
+ { "Japanese", "ja" },
+ { "Javanese", "jv" },
+ { "Kalaallisut", "kl" },
+ { "Kannada", "kn" },
+ { "Kashmiri", "ks" },
+ { "Kazakh", "kk" },
+ { "Khmer", "km" },
+ { "Kinyarwanda", "rw" },
+ { "Kirghiz", "ky" },
+ { "Korean", "ko" },
+ { "Kurdish", "ku" },
+ { "Latin", "la" },
+ { "Latvian", "lv" },
+ { "Lithuanian", "lt" },
+ { "Macedonian", "mk" },
+ { "Malagasy", "mg" },
+ { "Malay", "ms" },
+ { "Malayalam", "ml" },
+ { "Maltese", "mt" },
+ { "Manx", "gv" },
+ { "Marathi", "mr" },
+ { "Moldavian", "mo" },
+ { "Mongolian", "mn" },
+ { "Nepali", "ne" },
+ { "Norwegian", "nb" }, /* Yes, "nb", not the obsolete "no". */
+ { "Nyanja", "ny" },
+ { "Nynorsk", "nn" },
+ { "Oriya", "or" },
+ { "Oromo", "om" },
+ { "Panjabi", "pa" },
+ { "Pashto", "ps" },
+ { "Persian", "fa" },
+ { "Polish", "pl" },
+ { "Portuguese", "pt" },
+ { "Portuguese, Brazilian", "pt_BR" },
+ { "Punjabi", "pa" },
+ { "Pushto", "ps" },
+ { "Quechua", "qu" },
+ { "Romanian", "ro" },
+ { "Ruanda", "rw" },
+ { "Rundi", "rn" },
+ { "Russian", "ru" },
+ { "Sami", "se_NO" }, /* Not just "se". */
+ { "Sanskrit", "sa" },
+ { "Scottish", "gd" },
+ { "Serbian", "sr" },
+ { "Simplified Chinese", "zh_CN" },
+ { "Sindhi", "sd" },
+ { "Sinhalese", "si" },
+ { "Slovak", "sk" },
+ { "Slovenian", "sl" },
+ { "Somali", "so" },
+ { "Spanish", "es" },
+ { "Sundanese", "su" },
+ { "Swahili", "sw" },
+ { "Swedish", "sv" },
+ { "Tagalog", "tl" },
+ { "Tajik", "tg" },
+ { "Tajiki", "tg" },
+ { "Tamil", "ta" },
+ { "Tatar", "tt" },
+ { "Telugu", "te" },
+ { "Thai", "th" },
+ { "Tibetan", "bo" },
+ { "Tigrinya", "ti" },
+ { "Tongan", "to" },
+ { "Traditional Chinese", "zh_TW" },
+ { "Turkish", "tr" },
+ { "Turkmen", "tk" },
+ { "Uighur", "ug" },
+ { "Ukrainian", "uk" },
+ { "Urdu", "ur" },
+ { "Uzbek", "uz" },
+ { "Vietnamese", "vi" },
+ { "Welsh", "cy" },
+ { "Yiddish", "yi" }
+ };
+
+ /* Convert new-style locale names with language tags (ISO 639 and ISO 15924)
+ to Unix (ISO 639 and ISO 3166) names. */
+ typedef struct { const char langtag[7+1]; const char unixy[12+1]; }
+ langtag_entry;
+ static const langtag_entry langtag_table[] = {
+ /* MacOS X has "az-Arab", "az-Cyrl", "az-Latn".
+ The default script for az on Unix is Latin. */
+ { "az-Latn", "az" },
+ /* MacOS X has "ga-dots". Does not yet exist on Unix. */
+ { "ga-dots", "ga" },
+ /* MacOS X has "kk-Cyrl". Does not yet exist on Unix. */
+ /* MacOS X has "mn-Cyrl", "mn-Mong".
+ The default script for mn on Unix is Cyrillic. */
+ { "mn-Cyrl", "mn" },
+ /* MacOS X has "ms-Arab", "ms-Latn".
+ The default script for ms on Unix is Latin. */
+ { "ms-Latn", "ms" },
+ /* MacOS X has "tg-Cyrl".
+ The default script for tg on Unix is Cyrillic. */
+ { "tg-Cyrl", "tg" },
+ /* MacOS X has "tk-Cyrl". Does not yet exist on Unix. */
+ /* MacOS X has "tt-Cyrl".
+ The default script for tt on Unix is Cyrillic. */
+ { "tt-Cyrl", "tt" },
+ /* MacOS X has "zh-Hans", "zh-Hant".
+ Country codes are used to distinguish these on Unix. */
+ { "zh-Hans", "zh_CN" },
+ { "zh-Hant", "zh_TW" }
+ };
+
+ /* Convert script names (ISO 15924) to Unix conventions.
+ See http://www.unicode.org/iso15924/iso15924-codes.html */
+ typedef struct { const char script[4+1]; const char unixy[9+1]; }
+ script_entry;
+ static const script_entry script_table[] = {
+ { "Arab", "arabic" },
+ { "Cyrl", "cyrillic" },
+ { "Mong", "mongolian" }
+ };
+
+ /* Step 1: Convert using legacy_table. */
+ if (name[0] >= 'A' && name[0] <= 'Z')
+ {
+ unsigned int i1, i2;
+ i1 = 0;
+ i2 = sizeof (legacy_table) / sizeof (legacy_entry);
+ while (i2 - i1 > 1)
+ {
+ /* At this point we know that if name occurs in legacy_table,
+ its index must be >= i1 and < i2. */
+ unsigned int i = (i1 + i2) >> 1;
+ const legacy_entry *p = &legacy_table[i];
+ if (strcmp (name, p->legacy) < 0)
+ i2 = i;
+ else
+ i1 = i;
+ }
+ if (strcmp (name, legacy_table[i1].legacy) == 0)
+ {
+ strcpy (name, legacy_table[i1].unixy);
+ return;
+ }
+ }
+
+ /* Step 2: Convert using langtag_table and script_table. */
+ if (strlen (name) == 7 && name[2] == '-')
+ {
+ unsigned int i1, i2;
+ i1 = 0;
+ i2 = sizeof (langtag_table) / sizeof (langtag_entry);
+ while (i2 - i1 > 1)
+ {
+ /* At this point we know that if name occurs in langtag_table,
+ its index must be >= i1 and < i2. */
+ unsigned int i = (i1 + i2) >> 1;
+ const langtag_entry *p = &langtag_table[i];
+ if (strcmp (name, p->langtag) < 0)
+ i2 = i;
+ else
+ i1 = i;
+ }
+ if (strcmp (name, langtag_table[i1].langtag) == 0)
+ {
+ strcpy (name, langtag_table[i1].unixy);
+ return;
+ }
+
+ i1 = 0;
+ i2 = sizeof (script_table) / sizeof (script_entry);
+ while (i2 - i1 > 1)
+ {
+ /* At this point we know that if (name + 3) occurs in script_table,
+ its index must be >= i1 and < i2. */
+ unsigned int i = (i1 + i2) >> 1;
+ const script_entry *p = &script_table[i];
+ if (strcmp (name + 3, p->script) < 0)
+ i2 = i;
+ else
+ i1 = i;
+ }
+ if (strcmp (name + 3, script_table[i1].script) == 0)
+ {
+ name[2] = '@';
+ strcpy (name + 3, script_table[i1].unixy);
+ return;
+ }
+ }
+
+ /* Step 3: Convert new-style dash to Unix underscore. */
+ {
+ char *p;
+ for (p = name; *p != '\0'; p++)
+ if (*p == '-')
+ *p = '_';
+ }
+}
+
+#endif
+
+
+#if defined WIN32_NATIVE || defined __CYGWIN__ /* WIN32 or Cygwin */
+
+/* Canonicalize a Win32 native locale name to a Unix locale name.
+ NAME is a sufficiently large buffer.
+ On input, it contains the Win32 locale name.
+ On output, it contains the Unix locale name. */
+# if !defined IN_LIBINTL
+static
+# endif
+void
+gl_locale_name_canonicalize (char *name)
+{
+ /* FIXME: This is probably incomplete: it does not handle "zh-Hans" and
+ "zh-Hant". */
+ char *p;
+
+ for (p = name; *p != '\0'; p++)
+ if (*p == '-')
+ {
+ *p = '_';
+ p++;
+ for (; *p != '\0'; p++)
+ {
+ if (*p >= 'a' && *p <= 'z')
+ *p += 'A' - 'a';
+ if (*p == '-')
+ {
+ *p = '\0';
+ return;
+ }
+ }
+ return;
+ }
+}
+
+# if !defined IN_LIBINTL
+static
+# endif
+const char *
+gl_locale_name_from_win32_LANGID (LANGID langid)
+{
+ /* Activate the new code only when the GETTEXT_MUI environment variable is
+ set, for the time being, since the new code is not well tested. */
+ if (getenv ("GETTEXT_MUI") != NULL)
+ {
+ static char namebuf[256];
+
+ /* Query the system's notion of locale name.
+ On Windows95/98/ME, GetLocaleInfoA returns some incorrect results.
+ But we don't need to support systems that are so old. */
+ if (GetLocaleInfoA (MAKELCID (langid, SORT_DEFAULT), LOCALE_SNAME,
+ namebuf, sizeof (namebuf) - 1))
+ {
+ /* Convert it to a Unix locale name. */
+ gl_locale_name_canonicalize (namebuf);
+ return namebuf;
+ }
+ }
+ /* Internet Explorer has an LCID to RFC3066 name mapping stored in
+ HKEY_CLASSES_ROOT\Mime\Database\Rfc1766. But we better don't use that
+ since IE's i18n subsystem is known to be inconsistent with the Win32 base
+ (e.g. they have different character conversion facilities that produce
+ different results). */
+ /* Use our own table. */
+ {
+ int primary, sub;
+
+ /* Split into language and territory part. */
+ primary = PRIMARYLANGID (langid);
+ sub = SUBLANGID (langid);
+
+ /* Dispatch on language.
+ See also http://www.unicode.org/unicode/onlinedat/languages.html .
+ For details about languages, see http://www.ethnologue.com/ . */
+ switch (primary)
+ {
+ case LANG_AFRIKAANS:
+ switch (sub)
+ {
+ case SUBLANG_AFRIKAANS_SOUTH_AFRICA: return "af_ZA";
+ }
+ return "af";
+ case LANG_ALBANIAN:
+ switch (sub)
+ {
+ case SUBLANG_ALBANIAN_ALBANIA: return "sq_AL";
+ }
+ return "sq";
+ case LANG_ALSATIAN:
+ switch (sub)
+ {
+ case SUBLANG_ALSATIAN_FRANCE: return "gsw_FR";
+ }
+ return "gsw";
+ case LANG_AMHARIC:
+ switch (sub)
+ {
+ case SUBLANG_AMHARIC_ETHIOPIA: return "am_ET";
+ }
+ return "am";
+ case LANG_ARABIC:
+ switch (sub)
+ {
+ case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
+ case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
+ case SUBLANG_ARABIC_EGYPT: return "ar_EG";
+ case SUBLANG_ARABIC_LIBYA: return "ar_LY";
+ case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
+ case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
+ case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
+ case SUBLANG_ARABIC_OMAN: return "ar_OM";
+ case SUBLANG_ARABIC_YEMEN: return "ar_YE";
+ case SUBLANG_ARABIC_SYRIA: return "ar_SY";
+ case SUBLANG_ARABIC_JORDAN: return "ar_JO";
+ case SUBLANG_ARABIC_LEBANON: return "ar_LB";
+ case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
+ case SUBLANG_ARABIC_UAE: return "ar_AE";
+ case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
+ case SUBLANG_ARABIC_QATAR: return "ar_QA";
+ }
+ return "ar";
+ case LANG_ARMENIAN:
+ switch (sub)
+ {
+ case SUBLANG_ARMENIAN_ARMENIA: return "hy_AM";
+ }
+ return "hy";
+ case LANG_ASSAMESE:
+ switch (sub)
+ {
+ case SUBLANG_ASSAMESE_INDIA: return "as_IN";
+ }
+ return "as";
+ case LANG_AZERI:
+ switch (sub)
+ {
+ /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */
+ case 0x1e: return "az@latin";
+ case SUBLANG_AZERI_LATIN: return "az_AZ@latin";
+ case 0x1d: return "az@cyrillic";
+ case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic";
+ }
+ return "az";
+ case LANG_BASHKIR:
+ switch (sub)
+ {
+ case SUBLANG_BASHKIR_RUSSIA: return "ba_RU";
+ }
+ return "ba";
+ case LANG_BASQUE:
+ switch (sub)
+ {
+ case SUBLANG_BASQUE_BASQUE: return "eu_ES";
+ }
+ return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */
+ case LANG_BELARUSIAN:
+ switch (sub)
+ {
+ case SUBLANG_BELARUSIAN_BELARUS: return "be_BY";
+ }
+ return "be";
+ case LANG_BENGALI:
+ switch (sub)
+ {
+ case SUBLANG_BENGALI_INDIA: return "bn_IN";
+ case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";
+ }
+ return "bn";
+ case LANG_BRETON:
+ switch (sub)
+ {
+ case SUBLANG_BRETON_FRANCE: return "br_FR";
+ }
+ return "br";
+ case LANG_BULGARIAN:
+ switch (sub)
+ {
+ case SUBLANG_BULGARIAN_BULGARIA: return "bg_BG";
+ }
+ return "bg";
+ case LANG_BURMESE:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "my_MM";
+ }
+ return "my";
+ case LANG_CAMBODIAN:
+ switch (sub)
+ {
+ case SUBLANG_CAMBODIAN_CAMBODIA: return "km_KH";
+ }
+ return "km";
+ case LANG_CATALAN:
+ switch (sub)
+ {
+ case SUBLANG_CATALAN_SPAIN: return "ca_ES";
+ }
+ return "ca";
+ case LANG_CHEROKEE:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "chr_US";
+ }
+ return "chr";
+ case LANG_CHINESE:
+ switch (sub)
+ {
+ case SUBLANG_CHINESE_TRADITIONAL: case 0x1f: return "zh_TW";
+ case SUBLANG_CHINESE_SIMPLIFIED: case 0x00: return "zh_CN";
+ case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; /* traditional */
+ case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; /* simplified */
+ case SUBLANG_CHINESE_MACAU: return "zh_MO"; /* traditional */
+ }
+ return "zh";
+ case LANG_CORSICAN:
+ switch (sub)
+ {
+ case SUBLANG_CORSICAN_FRANCE: return "co_FR";
+ }
+ return "co";
+ case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN == LANG_BOSNIAN
+ * What used to be called Serbo-Croatian
+ * should really now be two separate
+ * languages because of political reasons.
+ * (Says tml, who knows nothing about Serbian
+ * or Croatian.)
+ * (I can feel those flames coming already.)
+ */
+ switch (sub)
+ {
+ /* Croatian */
+ case 0x00: return "hr";
+ case SUBLANG_CROATIAN_CROATIA: return "hr_HR";
+ case SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN: return "hr_BA";
+ /* Serbian */
+ case 0x1f: return "sr";
+ case 0x1c: return "sr"; /* latin */
+ case SUBLANG_SERBIAN_LATIN: return "sr_CS"; /* latin */
+ case 0x09: return "sr_RS"; /* latin */
+ case 0x0b: return "sr_ME"; /* latin */
+ case 0x06: return "sr_BA"; /* latin */
+ case 0x1b: return "sr@cyrillic";
+ case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic";
+ case 0x0a: return "sr_RS@cyrillic";
+ case 0x0c: return "sr_ME@cyrillic";
+ case 0x07: return "sr_BA@cyrillic";
+ /* Bosnian */
+ case 0x1e: return "bs";
+ case 0x1a: return "bs"; /* latin */
+ case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN: return "bs_BA"; /* latin */
+ case 0x19: return "bs@cyrillic";
+ case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC: return "bs_BA@cyrillic";
+ }
+ return "hr";
+ case LANG_CZECH:
+ switch (sub)
+ {
+ case SUBLANG_CZECH_CZECH_REPUBLIC: return "cs_CZ";
+ }
+ return "cs";
+ case LANG_DANISH:
+ switch (sub)
+ {
+ case SUBLANG_DANISH_DENMARK: return "da_DK";
+ }
+ return "da";
+ case LANG_DARI:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ case SUBLANG_DARI_AFGHANISTAN: return "prs_AF";
+ }
+ return "prs";
+ case LANG_DIVEHI:
+ switch (sub)
+ {
+ case SUBLANG_DIVEHI_MALDIVES: return "dv_MV";
+ }
+ return "dv";
+ case LANG_DUTCH:
+ switch (sub)
+ {
+ case SUBLANG_DUTCH: return "nl_NL";
+ case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
+ case SUBLANG_DUTCH_SURINAM: return "nl_SR";
+ }
+ return "nl";
+ case LANG_EDO:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "bin_NG";
+ }
+ return "bin";
+ case LANG_ENGLISH:
+ switch (sub)
+ {
+ /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
+ * English was the language spoken in England.
+ * Oh well.
+ */
+ case SUBLANG_ENGLISH_US: return "en_US";
+ case SUBLANG_ENGLISH_UK: return "en_GB";
+ case SUBLANG_ENGLISH_AUS: return "en_AU";
+ case SUBLANG_ENGLISH_CAN: return "en_CA";
+ case SUBLANG_ENGLISH_NZ: return "en_NZ";
+ case SUBLANG_ENGLISH_EIRE: return "en_IE";
+ case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
+ case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
+ case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
+ case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
+ case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
+ case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
+ case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
+ case SUBLANG_ENGLISH_INDONESIA: return "en_ID";
+ case SUBLANG_ENGLISH_HONGKONG: return "en_HK";
+ case SUBLANG_ENGLISH_INDIA: return "en_IN";
+ case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";
+ case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";
+ }
+ return "en";
+ case LANG_ESTONIAN:
+ switch (sub)
+ {
+ case SUBLANG_ESTONIAN_ESTONIA: return "et_EE";
+ }
+ return "et";
+ case LANG_FAEROESE:
+ switch (sub)
+ {
+ case SUBLANG_FAEROESE_FAROE_ISLANDS: return "fo_FO";
+ }
+ return "fo";
+ case LANG_FARSI:
+ switch (sub)
+ {
+ case SUBLANG_FARSI_IRAN: return "fa_IR";
+ }
+ return "fa";
+ case LANG_FINNISH:
+ switch (sub)
+ {
+ case SUBLANG_FINNISH_FINLAND: return "fi_FI";
+ }
+ return "fi";
+ case LANG_FRENCH:
+ switch (sub)
+ {
+ case SUBLANG_FRENCH: return "fr_FR";
+ case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
+ case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
+ case SUBLANG_FRENCH_SWISS: return "fr_CH";
+ case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
+ case SUBLANG_FRENCH_MONACO: return "fr_MC";
+ case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */
+ case SUBLANG_FRENCH_REUNION: return "fr_RE";
+ case SUBLANG_FRENCH_CONGO: return "fr_CG";
+ case SUBLANG_FRENCH_SENEGAL: return "fr_SN";
+ case SUBLANG_FRENCH_CAMEROON: return "fr_CM";
+ case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";
+ case SUBLANG_FRENCH_MALI: return "fr_ML";
+ case SUBLANG_FRENCH_MOROCCO: return "fr_MA";
+ case SUBLANG_FRENCH_HAITI: return "fr_HT";
+ }
+ return "fr";
+ case LANG_FRISIAN:
+ switch (sub)
+ {
+ case SUBLANG_FRISIAN_NETHERLANDS: return "fy_NL";
+ }
+ return "fy";
+ case LANG_FULFULDE:
+ /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ff_NG";
+ }
+ return "ff";
+ case LANG_GAELIC:
+ switch (sub)
+ {
+ case 0x01: /* SCOTTISH */
+ /* old, superseded by LANG_SCOTTISH_GAELIC */
+ return "gd_GB";
+ case SUBLANG_IRISH_IRELAND: return "ga_IE";
+ }
+ return "ga";
+ case LANG_GALICIAN:
+ switch (sub)
+ {
+ case SUBLANG_GALICIAN_SPAIN: return "gl_ES";
+ }
+ return "gl";
+ case LANG_GEORGIAN:
+ switch (sub)
+ {
+ case SUBLANG_GEORGIAN_GEORGIA: return "ka_GE";
+ }
+ return "ka";
+ case LANG_GERMAN:
+ switch (sub)
+ {
+ case SUBLANG_GERMAN: return "de_DE";
+ case SUBLANG_GERMAN_SWISS: return "de_CH";
+ case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
+ case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
+ case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
+ }
+ return "de";
+ case LANG_GREEK:
+ switch (sub)
+ {
+ case SUBLANG_GREEK_GREECE: return "el_GR";
+ }
+ return "el";
+ case LANG_GREENLANDIC:
+ switch (sub)
+ {
+ case SUBLANG_GREENLANDIC_GREENLAND: return "kl_GL";
+ }
+ return "kl";
+ case LANG_GUARANI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "gn_PY";
+ }
+ return "gn";
+ case LANG_GUJARATI:
+ switch (sub)
+ {
+ case SUBLANG_GUJARATI_INDIA: return "gu_IN";
+ }
+ return "gu";
+ case LANG_HAUSA:
+ switch (sub)
+ {
+ case 0x1f: return "ha";
+ case SUBLANG_HAUSA_NIGERIA_LATIN: return "ha_NG";
+ }
+ return "ha";
+ case LANG_HAWAIIAN:
+ /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
+ or Hawaii Creole English ("cpe_US", 600000 speakers)? */
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "cpe_US";
+ }
+ return "cpe";
+ case LANG_HEBREW:
+ switch (sub)
+ {
+ case SUBLANG_HEBREW_ISRAEL: return "he_IL";
+ }
+ return "he";
+ case LANG_HINDI:
+ switch (sub)
+ {
+ case SUBLANG_HINDI_INDIA: return "hi_IN";
+ }
+ return "hi";
+ case LANG_HUNGARIAN:
+ switch (sub)
+ {
+ case SUBLANG_HUNGARIAN_HUNGARY: return "hu_HU";
+ }
+ return "hu";
+ case LANG_IBIBIO:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "nic_NG";
+ }
+ return "nic";
+ case LANG_ICELANDIC:
+ switch (sub)
+ {
+ case SUBLANG_ICELANDIC_ICELAND: return "is_IS";
+ }
+ return "is";
+ case LANG_IGBO:
+ switch (sub)
+ {
+ case SUBLANG_IGBO_NIGERIA: return "ig_NG";
+ }
+ return "ig";
+ case LANG_INDONESIAN:
+ switch (sub)
+ {
+ case SUBLANG_INDONESIAN_INDONESIA: return "id_ID";
+ }
+ return "id";
+ case LANG_INUKTITUT:
+ switch (sub)
+ {
+ case 0x1e: return "iu"; /* syllabic */
+ case SUBLANG_INUKTITUT_CANADA: return "iu_CA"; /* syllabic */
+ case 0x1f: return "iu@latin";
+ case SUBLANG_INUKTITUT_CANADA_LATIN: return "iu_CA@latin";
+ }
+ return "iu";
+ case LANG_ITALIAN:
+ switch (sub)
+ {
+ case SUBLANG_ITALIAN: return "it_IT";
+ case SUBLANG_ITALIAN_SWISS: return "it_CH";
+ }
+ return "it";
+ case LANG_JAPANESE:
+ switch (sub)
+ {
+ case SUBLANG_JAPANESE_JAPAN: return "ja_JP";
+ }
+ return "ja";
+ case LANG_KANNADA:
+ switch (sub)
+ {
+ case SUBLANG_KANNADA_INDIA: return "kn_IN";
+ }
+ return "kn";
+ case LANG_KANURI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "kr_NG";
+ }
+ return "kr";
+ case LANG_KASHMIRI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ks_PK";
+ case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
+ }
+ return "ks";
+ case LANG_KAZAK:
+ switch (sub)
+ {
+ case SUBLANG_KAZAK_KAZAKHSTAN: return "kk_KZ";
+ }
+ return "kk";
+ case LANG_KICHE:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ case SUBLANG_KICHE_GUATEMALA: return "qut_GT";
+ }
+ return "qut";
+ case LANG_KINYARWANDA:
+ switch (sub)
+ {
+ case SUBLANG_KINYARWANDA_RWANDA: return "rw_RW";
+ }
+ return "rw";
+ case LANG_KONKANI:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ case SUBLANG_KONKANI_INDIA: return "kok_IN";
+ }
+ return "kok";
+ case LANG_KOREAN:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ko_KR";
+ }
+ return "ko";
+ case LANG_KYRGYZ:
+ switch (sub)
+ {
+ case SUBLANG_KYRGYZ_KYRGYZSTAN: return "ky_KG";
+ }
+ return "ky";
+ case LANG_LAO:
+ switch (sub)
+ {
+ case SUBLANG_LAO_LAOS: return "lo_LA";
+ }
+ return "lo";
+ case LANG_LATIN:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "la_VA";
+ }
+ return "la";
+ case LANG_LATVIAN:
+ switch (sub)
+ {
+ case SUBLANG_LATVIAN_LATVIA: return "lv_LV";
+ }
+ return "lv";
+ case LANG_LITHUANIAN:
+ switch (sub)
+ {
+ case SUBLANG_LITHUANIAN_LITHUANIA: return "lt_LT";
+ }
+ return "lt";
+ case LANG_LUXEMBOURGISH:
+ switch (sub)
+ {
+ case SUBLANG_LUXEMBOURGISH_LUXEMBOURG: return "lb_LU";
+ }
+ return "lb";
+ case LANG_MACEDONIAN:
+ switch (sub)
+ {
+ case SUBLANG_MACEDONIAN_MACEDONIA: return "mk_MK";
+ }
+ return "mk";
+ case LANG_MALAY:
+ switch (sub)
+ {
+ case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
+ case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
+ }
+ return "ms";
+ case LANG_MALAYALAM:
+ switch (sub)
+ {
+ case SUBLANG_MALAYALAM_INDIA: return "ml_IN";
+ }
+ return "ml";
+ case LANG_MALTESE:
+ switch (sub)
+ {
+ case SUBLANG_MALTESE_MALTA: return "mt_MT";
+ }
+ return "mt";
+ case LANG_MANIPURI:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "mni_IN";
+ }
+ return "mni";
+ case LANG_MAORI:
+ switch (sub)
+ {
+ case SUBLANG_MAORI_NEW_ZEALAND: return "mi_NZ";
+ }
+ return "mi";
+ case LANG_MAPUDUNGUN:
+ switch (sub)
+ {
+ case SUBLANG_MAPUDUNGUN_CHILE: return "arn_CL";
+ }
+ return "arn";
+ case LANG_MARATHI:
+ switch (sub)
+ {
+ case SUBLANG_MARATHI_INDIA: return "mr_IN";
+ }
+ return "mr";
+ case LANG_MOHAWK:
+ switch (sub)
+ {
+ case SUBLANG_MOHAWK_CANADA: return "moh_CA";
+ }
+ return "moh";
+ case LANG_MONGOLIAN:
+ switch (sub)
+ {
+ case SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA: case 0x1e: return "mn_MN";
+ case SUBLANG_MONGOLIAN_PRC: case 0x1f: return "mn_CN";
+ }
+ return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */
+ case LANG_NEPALI:
+ switch (sub)
+ {
+ case SUBLANG_NEPALI_NEPAL: return "ne_NP";
+ case SUBLANG_NEPALI_INDIA: return "ne_IN";
+ }
+ return "ne";
+ case LANG_NORWEGIAN:
+ switch (sub)
+ {
+ case 0x1f: return "nb";
+ case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO";
+ case 0x1e: return "nn";
+ case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
+ }
+ return "no";
+ case LANG_OCCITAN:
+ switch (sub)
+ {
+ case SUBLANG_OCCITAN_FRANCE: return "oc_FR";
+ }
+ return "oc";
+ case LANG_ORIYA:
+ switch (sub)
+ {
+ case SUBLANG_ORIYA_INDIA: return "or_IN";
+ }
+ return "or";
+ case LANG_OROMO:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "om_ET";
+ }
+ return "om";
+ case LANG_PAPIAMENTU:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "pap_AN";
+ }
+ return "pap";
+ case LANG_PASHTO:
+ switch (sub)
+ {
+ case SUBLANG_PASHTO_AFGHANISTAN: return "ps_AF";
+ }
+ return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */
+ case LANG_POLISH:
+ switch (sub)
+ {
+ case SUBLANG_POLISH_POLAND: return "pl_PL";
+ }
+ return "pl";
+ case LANG_PORTUGUESE:
+ switch (sub)
+ {
+ /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
+ Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
+ case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
+ case SUBLANG_PORTUGUESE: return "pt_PT";
+ }
+ return "pt";
+ case LANG_PUNJABI:
+ switch (sub)
+ {
+ case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */
+ case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */
+ }
+ return "pa";
+ case LANG_QUECHUA:
+ /* Note: Microsoft uses the non-ISO language code "quz". */
+ switch (sub)
+ {
+ case SUBLANG_QUECHUA_BOLIVIA: return "qu_BO";
+ case SUBLANG_QUECHUA_ECUADOR: return "qu_EC";
+ case SUBLANG_QUECHUA_PERU: return "qu_PE";
+ }
+ return "qu";
+ case LANG_ROMANIAN:
+ switch (sub)
+ {
+ case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";
+ case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD";
+ }
+ return "ro";
+ case LANG_ROMANSH:
+ switch (sub)
+ {
+ case SUBLANG_ROMANSH_SWITZERLAND: return "rm_CH";
+ }
+ return "rm";
+ case LANG_RUSSIAN:
+ switch (sub)
+ {
+ case SUBLANG_RUSSIAN_RUSSIA: return "ru_RU";
+ case SUBLANG_RUSSIAN_MOLDAVIA: return "ru_MD";
+ }
+ return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */
+ case LANG_SAMI:
+ switch (sub)
+ {
+ /* Northern Sami */
+ case 0x00: return "se";
+ case SUBLANG_SAMI_NORTHERN_NORWAY: return "se_NO";
+ case SUBLANG_SAMI_NORTHERN_SWEDEN: return "se_SE";
+ case SUBLANG_SAMI_NORTHERN_FINLAND: return "se_FI";
+ /* Lule Sami */
+ case 0x1f: return "smj";
+ case SUBLANG_SAMI_LULE_NORWAY: return "smj_NO";
+ case SUBLANG_SAMI_LULE_SWEDEN: return "smj_SE";
+ /* Southern Sami */
+ case 0x1e: return "sma";
+ case SUBLANG_SAMI_SOUTHERN_NORWAY: return "sma_NO";
+ case SUBLANG_SAMI_SOUTHERN_SWEDEN: return "sma_SE";
+ /* Skolt Sami */
+ case 0x1d: return "sms";
+ case SUBLANG_SAMI_SKOLT_FINLAND: return "sms_FI";
+ /* Inari Sami */
+ case 0x1c: return "smn";
+ case SUBLANG_SAMI_INARI_FINLAND: return "smn_FI";
+ }
+ return "se"; /* or "smi"? */
+ case LANG_SANSKRIT:
+ switch (sub)
+ {
+ case SUBLANG_SANSKRIT_INDIA: return "sa_IN";
+ }
+ return "sa";
+ case LANG_SCOTTISH_GAELIC:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "gd_GB";
+ }
+ return "gd";
+ case LANG_SINDHI:
+ switch (sub)
+ {
+ case SUBLANG_SINDHI_INDIA: return "sd_IN";
+ case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";
+ /*case SUBLANG_SINDHI_AFGHANISTAN: return "sd_AF";*/
+ }
+ return "sd";
+ case LANG_SINHALESE:
+ switch (sub)
+ {
+ case SUBLANG_SINHALESE_SRI_LANKA: return "si_LK";
+ }
+ return "si";
+ case LANG_SLOVAK:
+ switch (sub)
+ {
+ case SUBLANG_SLOVAK_SLOVAKIA: return "sk_SK";
+ }
+ return "sk";
+ case LANG_SLOVENIAN:
+ switch (sub)
+ {
+ case SUBLANG_SLOVENIAN_SLOVENIA: return "sl_SI";
+ }
+ return "sl";
+ case LANG_SOMALI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "so_SO";
+ }
+ return "so";
+ case LANG_SORBIAN:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ /* Upper Sorbian */
+ case 0x00: return "hsb";
+ case SUBLANG_UPPER_SORBIAN_GERMANY: return "hsb_DE";
+ /* Lower Sorbian */
+ case 0x1f: return "dsb";
+ case SUBLANG_LOWER_SORBIAN_GERMANY: return "dsb_DE";
+ }
+ return "wen";
+ case LANG_SOTHO:
+ /* <http://www.microsoft.com/globaldev/reference/lcid-all.mspx> calls
+ it "Sepedi"; according to
+ <http://www.ethnologue.com/show_language.asp?code=nso>
+ <http://www.ethnologue.com/show_language.asp?code=sot>
+ it's the same as Northern Sotho. */
+ switch (sub)
+ {
+ case SUBLANG_SOTHO_SOUTH_AFRICA: return "nso_ZA";
+ }
+ return "nso";
+ case LANG_SPANISH:
+ switch (sub)
+ {
+ case SUBLANG_SPANISH: return "es_ES";
+ case SUBLANG_SPANISH_MEXICAN: return "es_MX";
+ case SUBLANG_SPANISH_MODERN:
+ return "es_ES@modern"; /* not seen on Unix */
+ case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
+ case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
+ case SUBLANG_SPANISH_PANAMA: return "es_PA";
+ case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
+ case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
+ case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
+ case SUBLANG_SPANISH_PERU: return "es_PE";
+ case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
+ case SUBLANG_SPANISH_ECUADOR: return "es_EC";
+ case SUBLANG_SPANISH_CHILE: return "es_CL";
+ case SUBLANG_SPANISH_URUGUAY: return "es_UY";
+ case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
+ case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
+ case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
+ case SUBLANG_SPANISH_HONDURAS: return "es_HN";
+ case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
+ case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
+ case SUBLANG_SPANISH_US: return "es_US";
+ }
+ return "es";
+ case LANG_SUTU:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */
+ }
+ return "bnt";
+ case LANG_SWAHILI:
+ switch (sub)
+ {
+ case SUBLANG_SWAHILI_KENYA: return "sw_KE";
+ }
+ return "sw";
+ case LANG_SWEDISH:
+ switch (sub)
+ {
+ case SUBLANG_SWEDISH_SWEDEN: return "sv_SE";
+ case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
+ }
+ return "sv";
+ case LANG_SYRIAC:
+ switch (sub)
+ {
+ case SUBLANG_SYRIAC_SYRIA: return "syr_SY"; /* An extinct language. */
+ }
+ return "syr";
+ case LANG_TAGALOG:
+ switch (sub)
+ {
+ case SUBLANG_TAGALOG_PHILIPPINES: return "tl_PH"; /* or "fil_PH"? */
+ }
+ return "tl"; /* or "fil"? */
+ case LANG_TAJIK:
+ switch (sub)
+ {
+ case 0x1f: return "tg";
+ case SUBLANG_TAJIK_TAJIKISTAN: return "tg_TJ";
+ }
+ return "tg";
+ case LANG_TAMAZIGHT:
+ /* Note: Microsoft uses the non-ISO language code "tmz". */
+ switch (sub)
+ {
+ /* FIXME: Adjust this when Tamazight locales appear on Unix. */
+ case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic";
+ case 0x1f: return "ber@latin";
+ case SUBLANG_TAMAZIGHT_ALGERIA_LATIN: return "ber_DZ@latin";
+ }
+ return "ber";
+ case LANG_TAMIL:
+ switch (sub)
+ {
+ case SUBLANG_TAMIL_INDIA: return "ta_IN";
+ }
+ return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */
+ case LANG_TATAR:
+ switch (sub)
+ {
+ case SUBLANG_TATAR_RUSSIA: return "tt_RU";
+ }
+ return "tt";
+ case LANG_TELUGU:
+ switch (sub)
+ {
+ case SUBLANG_TELUGU_INDIA: return "te_IN";
+ }
+ return "te";
+ case LANG_THAI:
+ switch (sub)
+ {
+ case SUBLANG_THAI_THAILAND: return "th_TH";
+ }
+ return "th";
+ case LANG_TIBETAN:
+ switch (sub)
+ {
+ case SUBLANG_TIBETAN_PRC:
+ /* Most Tibetans would not like "bo_CN". But Tibet does not yet
+ have a country code of its own. */
+ return "bo";
+ case SUBLANG_TIBETAN_BHUTAN: return "bo_BT";
+ }
+ return "bo";
+ case LANG_TIGRINYA:
+ switch (sub)
+ {
+ case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";
+ case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";
+ }
+ return "ti";
+ case LANG_TSONGA:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ts_ZA";
+ }
+ return "ts";
+ case LANG_TSWANA:
+ /* Spoken in South Africa, Botswana. */
+ switch (sub)
+ {
+ case SUBLANG_TSWANA_SOUTH_AFRICA: return "tn_ZA";
+ }
+ return "tn";
+ case LANG_TURKISH:
+ switch (sub)
+ {
+ case SUBLANG_TURKISH_TURKEY: return "tr_TR";
+ }
+ return "tr";
+ case LANG_TURKMEN:
+ switch (sub)
+ {
+ case SUBLANG_TURKMEN_TURKMENISTAN: return "tk_TM";
+ }
+ return "tk";
+ case LANG_UIGHUR:
+ switch (sub)
+ {
+ case SUBLANG_UIGHUR_PRC: return "ug_CN";
+ }
+ return "ug";
+ case LANG_UKRAINIAN:
+ switch (sub)
+ {
+ case SUBLANG_UKRAINIAN_UKRAINE: return "uk_UA";
+ }
+ return "uk";
+ case LANG_URDU:
+ switch (sub)
+ {
+ case SUBLANG_URDU_PAKISTAN: return "ur_PK";
+ case SUBLANG_URDU_INDIA: return "ur_IN";
+ }
+ return "ur";
+ case LANG_UZBEK:
+ switch (sub)
+ {
+ case 0x1f: return "uz";
+ case SUBLANG_UZBEK_LATIN: return "uz_UZ";
+ case 0x1e: return "uz@cyrillic";
+ case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic";
+ }
+ return "uz";
+ case LANG_VENDA:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ve_ZA";
+ }
+ return "ve";
+ case LANG_VIETNAMESE:
+ switch (sub)
+ {
+ case SUBLANG_VIETNAMESE_VIETNAM: return "vi_VN";
+ }
+ return "vi";
+ case LANG_WELSH:
+ switch (sub)
+ {
+ case SUBLANG_WELSH_UNITED_KINGDOM: return "cy_GB";
+ }
+ return "cy";
+ case LANG_WOLOF:
+ switch (sub)
+ {
+ case SUBLANG_WOLOF_SENEGAL: return "wo_SN";
+ }
+ return "wo";
+ case LANG_XHOSA:
+ switch (sub)
+ {
+ case SUBLANG_XHOSA_SOUTH_AFRICA: return "xh_ZA";
+ }
+ return "xh";
+ case LANG_YAKUT:
+ switch (sub)
+ {
+ case SUBLANG_YAKUT_RUSSIA: return "sah_RU";
+ }
+ return "sah";
+ case LANG_YI:
+ switch (sub)
+ {
+ case SUBLANG_YI_PRC: return "ii_CN";
+ }
+ return "ii";
+ case LANG_YIDDISH:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "yi_IL";
+ }
+ return "yi";
+ case LANG_YORUBA:
+ switch (sub)
+ {
+ case SUBLANG_YORUBA_NIGERIA: return "yo_NG";
+ }
+ return "yo";
+ case LANG_ZULU:
+ switch (sub)
+ {
+ case SUBLANG_ZULU_SOUTH_AFRICA: return "zu_ZA";
+ }
+ return "zu";
+ default: return "C";
+ }
+ }
+}
+
+# if !defined IN_LIBINTL
+static
+# endif
+const char *
+gl_locale_name_from_win32_LCID (LCID lcid)
+{
+ LANGID langid;
+
+ /* Strip off the sorting rules, keep only the language part. */
+ langid = LANGIDFROMLCID (lcid);
+
+ return gl_locale_name_from_win32_LANGID (langid);
+}
+
+#endif
+
+
+#if HAVE_USELOCALE /* glibc or MacOS X */
+
+/* Simple hash set of strings. We don't want to drag in lots of hash table
+ code here. */
+
+# define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+static size_t
+string_hash (const void *x)
+{
+ const char *s = (const char *) x;
+ size_t h = 0;
+
+ for (; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h;
+}
+
+/* A hash table of fixed size. Multiple threads can access it read-only
+ simultaneously, but only one thread can insert into it at the same time. */
+
+/* A node in a hash bucket collision list. */
+struct hash_node
+ {
+ struct hash_node * volatile next;
+ char contents[100]; /* has variable size */
+ };
+
+# define HASH_TABLE_SIZE 257
+static struct hash_node * volatile struniq_hash_table[HASH_TABLE_SIZE]
+ /* = { NULL, ..., NULL } */;
+
+/* This lock protects the struniq_hash_table against multiple simultaneous
+ insertions. */
+gl_lock_define_initialized(static, struniq_lock)
+
+/* Store a copy of the given string in a string pool with indefinite extent.
+ Return a pointer to this copy. */
+static const char *
+struniq (const char *string)
+{
+ size_t hashcode = string_hash (string);
+ size_t slot = hashcode % HASH_TABLE_SIZE;
+ size_t size;
+ struct hash_node *new_node;
+ struct hash_node *p;
+ for (p = struniq_hash_table[slot]; p != NULL; p = p->next)
+ if (strcmp (p->contents, string) == 0)
+ return p->contents;
+ size = strlen (string) + 1;
+ new_node =
+ (struct hash_node *)
+ malloc (offsetof (struct hash_node, contents[0]) + size);
+ if (new_node == NULL)
+ /* Out of memory. Return a statically allocated string. */
+ return "C";
+ memcpy (new_node->contents, string, size);
+ /* Lock while inserting new_node. */
+ gl_lock_lock (struniq_lock);
+ /* Check whether another thread already added the string while we were
+ waiting on the lock. */
+ for (p = struniq_hash_table[slot]; p != NULL; p = p->next)
+ if (strcmp (p->contents, string) == 0)
+ {
+ free (new_node);
+ new_node = p;
+ goto done;
+ }
+ /* Really insert new_node into the hash table. Fill new_node entirely first,
+ because other threads may be iterating over the linked list. */
+ new_node->next = struniq_hash_table[slot];
+ struniq_hash_table[slot] = new_node;
+ done:
+ /* Unlock after new_node is inserted. */
+ gl_lock_unlock (struniq_lock);
+ return new_node->contents;
+}
+
+#endif
+
+
+#if defined IN_LIBINTL || HAVE_USELOCALE
+
+/* Like gl_locale_name_thread, except that the result is not in storage of
+ indefinite extent. */
+# if !defined IN_LIBINTL
+static
+# endif
+const char *
+gl_locale_name_thread_unsafe (int category, const char *categoryname)
+{
+# if HAVE_USELOCALE
+ {
+ locale_t thread_locale = uselocale (NULL);
+ if (thread_locale != LC_GLOBAL_LOCALE)
+ {
+# if __GLIBC__ >= 2
+ /* Work around an incorrect definition of the _NL_LOCALE_NAME macro in
+ glibc < 2.12.
+ See <http://sourceware.org/bugzilla/show_bug.cgi?id=10968>. */
+ const char *name =
+ nl_langinfo (_NL_ITEM ((category), _NL_ITEM_INDEX (-1)));
+ if (name[0] == '\0')
+ /* Fallback code for glibc < 2.4, which did not implement
+ nl_langinfo (_NL_LOCALE_NAME (category)). */
+ name = thread_locale->__names[category];
+ return name;
+# endif
+# if defined __APPLE__ && defined __MACH__ /* MacOS X */
+ /* The locale name is found deep in an undocumented data structure.
+ Since it's stored in a buffer of size 32 and newlocale() rejects
+ locale names of length > 31, we can assume that it is NUL terminated
+ in this buffer. But we need to make a copy of the locale name, of
+ indefinite extent. */
+ struct _xlocale
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ __darwin_mbstate_t __mbs[10];
+ int64_t __magic;
+ unsigned char __collate_load_error;
+ unsigned char __collate_substitute_nontrivial;
+ unsigned char _messages_using_locale;
+ unsigned char _monetary_using_locale;
+ unsigned char _numeric_using_locale;
+ unsigned char _time_using_locale;
+ unsigned char __mlocale_changed;
+ unsigned char __nlocale_changed;
+ unsigned char __numeric_fp_cvt;
+ struct __xlocale_st_collate *__lc_collate;
+ struct __xlocale_st_runelocale *__lc_ctype;
+ struct __xlocale_st_messages *__lc_messages;
+ struct __xlocale_st_monetary *__lc_monetary;
+ struct __xlocale_st_numeric *__lc_numeric;
+ struct _xlocale *__lc_numeric_loc;
+ struct __xlocale_st_time *__lc_time;
+ /* more */
+ };
+ struct __xlocale_st_collate
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char __encoding[32];
+ /* more */
+ };
+ struct __xlocale_st_runelocale
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char __ctype_encoding[32];
+ /* more */
+ };
+ struct __xlocale_st_messages
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char *_messages_locale_buf;
+ /* more */
+ };
+ struct __xlocale_st_monetary
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char *_monetary_locale_buf;
+ /* more */
+ };
+ struct __xlocale_st_numeric {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char *_numeric_locale_buf;
+ /* more */
+ };
+ struct __xlocale_st_time {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char *_time_locale_buf;
+ /* more */
+ };
+ struct _xlocale *tlp = (struct _xlocale *) thread_locale;
+ switch (category)
+ {
+ case LC_CTYPE:
+ return tlp->__lc_ctype->__ctype_encoding;
+ case LC_NUMERIC:
+ return tlp->_numeric_using_locale
+ ? tlp->__lc_numeric->_numeric_locale_buf
+ : "C";
+ case LC_TIME:
+ return tlp->_time_using_locale
+ ? tlp->__lc_time->_time_locale_buf
+ : "C";
+ case LC_COLLATE:
+ return !tlp->__collate_load_error
+ ? tlp->__lc_collate->__encoding
+ : "C";
+ case LC_MONETARY:
+ return tlp->_monetary_using_locale
+ ? tlp->__lc_monetary->_monetary_locale_buf
+ : "C";
+ case LC_MESSAGES:
+ return tlp->_messages_using_locale
+ ? tlp->__lc_messages->_messages_locale_buf
+ : "C";
+ default: /* We shouldn't get here. */
+ return "";
+ }
+# endif
+ }
+ }
+# endif
+ return NULL;
+}
+
+#endif
+
+const char *
+gl_locale_name_thread (int category, const char *categoryname)
+{
+#if HAVE_USELOCALE
+ const char *name = gl_locale_name_thread_unsafe (category, categoryname);
+ if (name != NULL)
+ return struniq (name);
+#endif
+ return NULL;
+}
+
+/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+ "Directs 'setlocale()' to query 'category' and return the current
+ setting of 'local'."
+ However it does not specify the exact format. Neither do SUSV2 and
+ ISO C 99. So we can use this feature only on selected systems (e.g.
+ those using GNU C Library). */
+#if defined _LIBC || (defined __GLIBC__ && __GLIBC__ >= 2)
+# define HAVE_LOCALE_NULL
+#endif
+
+const char *
+gl_locale_name_posix (int category, const char *categoryname)
+{
+ /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+ On some systems this can be done by the 'setlocale' function itself. */
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+ return setlocale (category, NULL);
+#else
+ /* On other systems we ignore what setlocale reports and instead look at the
+ environment variables directly. This is necessary
+ 1. on systems which have a facility for customizing the default locale
+ (MacOS X, native Windows, Cygwin) and where the system's setlocale()
+ function ignores this default locale (MacOS X, Cygwin), in two cases:
+ a. when the user missed to use the setlocale() override from libintl
+ (for example by not including <libintl.h>),
+ b. when setlocale supports only the "C" locale, such as on Cygwin
+ 1.5.x. In this case even the override from libintl cannot help.
+ 2. on all systems where setlocale supports only the "C" locale. */
+ /* Strictly speaking, it is a POSIX violation to look at the environment
+ variables regardless whether setlocale has been called or not. POSIX
+ says:
+ "For C-language programs, the POSIX locale shall be the
+ default locale when the setlocale() function is not called."
+ But we assume that all programs that use internationalized APIs call
+ setlocale (LC_ALL, ""). */
+ return gl_locale_name_environ (category, categoryname);
+#endif
+}
+
+const char *
+gl_locale_name_environ (int category, const char *categoryname)
+{
+ const char *retval;
+
+ /* Setting of LC_ALL overrides all other. */
+ retval = getenv ("LC_ALL");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+ /* Next comes the name of the desired category. */
+ retval = getenv (categoryname);
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+ /* Last possibility is the LANG environment variable. */
+ retval = getenv ("LANG");
+ if (retval != NULL && retval[0] != '\0')
+ {
+#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+ /* MacOS X 10.2 or newer.
+ Ignore invalid LANG value set by the Terminal application. */
+ if (strcmp (retval, "UTF-8") != 0)
+#endif
+#if defined __CYGWIN__
+ /* Cygwin.
+ Ignore dummy LANG value set by ~/.profile. */
+ if (strcmp (retval, "C.UTF-8") != 0)
+#endif
+ return retval;
+ }
+
+ return NULL;
+}
+
+const char *
+gl_locale_name_default (void)
+{
+ /* POSIX:2001 says:
+ "All implementations shall define a locale as the default locale, to be
+ invoked when no environment variables are set, or set to the empty
+ string. This default locale can be the POSIX locale or any other
+ implementation-defined locale. Some implementations may provide
+ facilities for local installation administrators to set the default
+ locale, customizing it for each location. POSIX:2001 does not require
+ such a facility.
+
+ The systems with such a facility are MacOS X and Windows: They provide a
+ GUI that allows the user to choose a locale.
+ - On MacOS X, by default, none of LC_* or LANG are set. Starting with
+ MacOS X 10.4 or 10.5, LANG is set for processes launched by the
+ 'Terminal' application (but sometimes to an incorrect value "UTF-8").
+ When no environment variable is set, setlocale (LC_ALL, "") uses the
+ "C" locale.
+ - On native Windows, by default, none of LC_* or LANG are set.
+ When no environment variable is set, setlocale (LC_ALL, "") uses the
+ locale chosen by the user.
+ - On Cygwin 1.5.x, by default, none of LC_* or LANG are set.
+ When no environment variable is set, setlocale (LC_ALL, "") uses the
+ "C" locale.
+ - On Cygwin 1.7, by default, LANG is set to "C.UTF-8" when the default
+ ~/.profile is executed.
+ When no environment variable is set, setlocale (LC_ALL, "") uses the
+ "C.UTF-8" locale, which operates in the same way as the "C" locale.
+ */
+
+#if !(HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE || defined WIN32_NATIVE || defined __CYGWIN__)
+
+ /* The system does not have a way of setting the locale, other than the
+ POSIX specified environment variables. We use C as default locale. */
+ return "C";
+
+#else
+
+ /* Return an XPG style locale name language[_territory][@modifier].
+ Don't even bother determining the codeset; it's not useful in this
+ context, because message catalogs are not specific to a single
+ codeset. */
+
+# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+ /* MacOS X 10.2 or newer */
+ {
+ /* Cache the locale name, since CoreFoundation calls are expensive. */
+ static const char *cached_localename;
+
+ if (cached_localename == NULL)
+ {
+ char namebuf[256];
+# if HAVE_CFLOCALECOPYCURRENT /* MacOS X 10.3 or newer */
+ CFLocaleRef locale = CFLocaleCopyCurrent ();
+ CFStringRef name = CFLocaleGetIdentifier (locale);
+
+ if (CFStringGetCString (name, namebuf, sizeof(namebuf),
+ kCFStringEncodingASCII))
+ {
+ gl_locale_name_canonicalize (namebuf);
+ cached_localename = strdup (namebuf);
+ }
+ CFRelease (locale);
+# elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */
+ CFTypeRef value =
+ CFPreferencesCopyAppValue (CFSTR ("AppleLocale"),
+ kCFPreferencesCurrentApplication);
+ if (value != NULL
+ && CFGetTypeID (value) == CFStringGetTypeID ()
+ && CFStringGetCString ((CFStringRef)value, namebuf, sizeof(namebuf),
+ kCFStringEncodingASCII))
+ {
+ gl_locale_name_canonicalize (namebuf);
+ cached_localename = strdup (namebuf);
+ }
+# endif
+ if (cached_localename == NULL)
+ cached_localename = "C";
+ }
+ return cached_localename;
+ }
+
+# endif
+
+# if defined WIN32_NATIVE || defined __CYGWIN__ /* WIN32 or Cygwin */
+ {
+ LCID lcid;
+
+ /* Use native Win32 API locale ID. */
+ lcid = GetThreadLocale ();
+
+ return gl_locale_name_from_win32_LCID (lcid);
+ }
+# endif
+#endif
+}
+
+/* Determine the current locale's name, and canonicalize it into XPG syntax
+ language[_territory][.codeset][@modifier]
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+
+const char *
+gl_locale_name (int category, const char *categoryname)
+{
+ const char *retval;
+
+ retval = gl_locale_name_thread (category, categoryname);
+ if (retval != NULL)
+ return retval;
+
+ retval = gl_locale_name_posix (category, categoryname);
+ if (retval != NULL)
+ return retval;
+
+ return gl_locale_name_default ();
+}
diff --git a/gnulib/lib/localename.h b/gnulib/lib/localename.h
new file mode 100644
index 00000000..bb7caee4
--- /dev/null
+++ b/gnulib/lib/localename.h
@@ -0,0 +1,97 @@
+/* Determine name of the currently selected locale.
+ Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+#ifndef _GL_LOCALENAME_H
+#define _GL_LOCALENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's name.
+ It considers both the POSIX notion of locale name (see functions
+ gl_locale_name_thread and gl_locale_name_posix) and the system notion
+ of locale name (see function gl_locale_name_default).
+ CATEGORY is a locale category abbreviation, as defined in <locale.h>,
+ but not LC_ALL. E.g. LC_MESSAGES.
+ CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES".
+ Return the locale category's name, canonicalized into XPG syntax
+ language[_territory][.codeset][@modifier]
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name (int category, const char *categoryname);
+
+/* Determine the current per-thread locale's name, as specified by uselocale()
+ calls.
+ CATEGORY is a locale category abbreviation, as defined in <locale.h>,
+ but not LC_ALL. E.g. LC_MESSAGES.
+ CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES".
+ Return the locale category's name, canonicalized into XPG syntax
+ language[_territory][.codeset][@modifier]
+ or NULL if no locale has been specified for the current thread.
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name_thread (int category, const char *categoryname);
+
+/* Determine the thread-independent current locale's name, as specified by
+ setlocale() calls or by environment variables.
+ CATEGORY is a locale category abbreviation, as defined in <locale.h>,
+ but not LC_ALL. E.g. LC_MESSAGES.
+ CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES".
+ Return the locale category's name, canonicalized into XPG syntax
+ language[_territory][.codeset][@modifier]
+ or NULL if no locale has been specified to setlocale() or by environment
+ variables.
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name_posix (int category, const char *categoryname);
+
+/* Determine the default locale's name, as specified by environment
+ variables.
+ Return the locale category's name, or NULL if no locale has been specified
+ by environment variables.
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name_environ (int category, const char *categoryname);
+
+/* Determine the default locale's name. This is the current locale's name,
+ if not specified by uselocale() calls, by setlocale() calls, or by
+ environment variables. This locale name is usually determined by systems
+ settings that the user can manipulate through a GUI.
+
+ Quoting POSIX:2001:
+ "All implementations shall define a locale as the default locale,
+ to be invoked when no environment variables are set, or set to the
+ empty string. This default locale can be the C locale or any other
+ implementation-defined locale. Some implementations may provide
+ facilities for local installation administrators to set the default
+ locale, customizing it for each location. IEEE Std 1003.1-2001 does
+ not require such a facility."
+
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name_default (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LOCALENAME_H */
diff --git a/gnulib/lib/logl.c b/gnulib/lib/logl.c
new file mode 100644
index 00000000..2b514126
--- /dev/null
+++ b/gnulib/lib/logl.c
@@ -0,0 +1,261 @@
+/* Copyright 2001 by Stephen L. Moshier <moshier@na-net.ornl.gov>
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+/* logll.c
+ *
+ * Natural logarithm for 128-bit long double precision.
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, logl();
+ *
+ * y = logl( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns the base e (2.718...) logarithm of x.
+ *
+ * The argument is separated into its exponent and fractional
+ * parts. Use of a lookup table increases the speed of the routine.
+ * The program uses logarithms tabulated at intervals of 1/128 to
+ * cover the domain from approximately 0.7 to 1.4.
+ *
+ * On the interval [-1/128, +1/128] the logarithm of 1+x is approximated by
+ * log(1+x) = x - 0.5 x^2 + x^3 P(x) .
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0.875, 1.125 100000 1.2e-34 4.1e-35
+ * IEEE 0.125, 8 100000 1.2e-34 4.1e-35
+ *
+ *
+ * WARNING:
+ *
+ * This program uses integer operations on bit fields of floating-point
+ * numbers. It does not work with data structures other than the
+ * structure assumed.
+ *
+ */
+
+/* log(1+x) = x - .5 x^2 + x^3 l(x)
+ -.0078125 <= x <= +.0078125
+ peak relative error 1.2e-37 */
+static const long double
+l3 = 3.333333333333333333333333333333336096926E-1L,
+l4 = -2.499999999999999999999999999486853077002E-1L,
+l5 = 1.999999999999999999999999998515277861905E-1L,
+l6 = -1.666666666666666666666798448356171665678E-1L,
+l7 = 1.428571428571428571428808945895490721564E-1L,
+l8 = -1.249999999999999987884655626377588149000E-1L,
+l9 = 1.111111111111111093947834982832456459186E-1L,
+l10 = -1.000000000000532974938900317952530453248E-1L,
+l11 = 9.090909090915566247008015301349979892689E-2L,
+l12 = -8.333333211818065121250921925397567745734E-2L,
+l13 = 7.692307559897661630807048686258659316091E-2L,
+l14 = -7.144242754190814657241902218399056829264E-2L,
+l15 = 6.668057591071739754844678883223432347481E-2L;
+
+/* Lookup table of ln(t) - (t-1)
+ t = 0.5 + (k+26)/128)
+ k = 0, ..., 91 */
+static const long double logtbl[92] = {
+-5.5345593589352099112142921677820359632418E-2L,
+-5.2108257402767124761784665198737642086148E-2L,
+-4.8991686870576856279407775480686721935120E-2L,
+-4.5993270766361228596215288742353061431071E-2L,
+-4.3110481649613269682442058976885699556950E-2L,
+-4.0340872319076331310838085093194799765520E-2L,
+-3.7682072451780927439219005993827431503510E-2L,
+-3.5131785416234343803903228503274262719586E-2L,
+-3.2687785249045246292687241862699949178831E-2L,
+-3.0347913785027239068190798397055267411813E-2L,
+-2.8110077931525797884641940838507561326298E-2L,
+-2.5972247078357715036426583294246819637618E-2L,
+-2.3932450635346084858612873953407168217307E-2L,
+-2.1988775689981395152022535153795155900240E-2L,
+-2.0139364778244501615441044267387667496733E-2L,
+-1.8382413762093794819267536615342902718324E-2L,
+-1.6716169807550022358923589720001638093023E-2L,
+-1.5138929457710992616226033183958974965355E-2L,
+-1.3649036795397472900424896523305726435029E-2L,
+-1.2244881690473465543308397998034325468152E-2L,
+-1.0924898127200937840689817557742469105693E-2L,
+-9.6875626072830301572839422532631079809328E-3L,
+-8.5313926245226231463436209313499745894157E-3L,
+-7.4549452072765973384933565912143044991706E-3L,
+-6.4568155251217050991200599386801665681310E-3L,
+-5.5356355563671005131126851708522185605193E-3L,
+-4.6900728132525199028885749289712348829878E-3L,
+-3.9188291218610470766469347968659624282519E-3L,
+-3.2206394539524058873423550293617843896540E-3L,
+-2.5942708080877805657374888909297113032132E-3L,
+-2.0385211375711716729239156839929281289086E-3L,
+-1.5522183228760777967376942769773768850872E-3L,
+-1.1342191863606077520036253234446621373191E-3L,
+-7.8340854719967065861624024730268350459991E-4L,
+-4.9869831458030115699628274852562992756174E-4L,
+-2.7902661731604211834685052867305795169688E-4L,
+-1.2335696813916860754951146082826952093496E-4L,
+-3.0677461025892873184042490943581654591817E-5L,
+#define ZERO logtbl[38]
+ 0.0000000000000000000000000000000000000000E0L,
+-3.0359557945051052537099938863236321874198E-5L,
+-1.2081346403474584914595395755316412213151E-4L,
+-2.7044071846562177120083903771008342059094E-4L,
+-4.7834133324631162897179240322783590830326E-4L,
+-7.4363569786340080624467487620270965403695E-4L,
+-1.0654639687057968333207323853366578860679E-3L,
+-1.4429854811877171341298062134712230604279E-3L,
+-1.8753781835651574193938679595797367137975E-3L,
+-2.3618380914922506054347222273705859653658E-3L,
+-2.9015787624124743013946600163375853631299E-3L,
+-3.4938307889254087318399313316921940859043E-3L,
+-4.1378413103128673800485306215154712148146E-3L,
+-4.8328735414488877044289435125365629849599E-3L,
+-5.5782063183564351739381962360253116934243E-3L,
+-6.3731336597098858051938306767880719015261E-3L,
+-7.2169643436165454612058905294782949315193E-3L,
+-8.1090214990427641365934846191367315083867E-3L,
+-9.0486422112807274112838713105168375482480E-3L,
+-1.0035177140880864314674126398350812606841E-2L,
+-1.1067990155502102718064936259435676477423E-2L,
+-1.2146457974158024928196575103115488672416E-2L,
+-1.3269969823361415906628825374158424754308E-2L,
+-1.4437927104692837124388550722759686270765E-2L,
+-1.5649743073340777659901053944852735064621E-2L,
+-1.6904842527181702880599758489058031645317E-2L,
+-1.8202661505988007336096407340750378994209E-2L,
+-1.9542647000370545390701192438691126552961E-2L,
+-2.0924256670080119637427928803038530924742E-2L,
+-2.2346958571309108496179613803760727786257E-2L,
+-2.3810230892650362330447187267648486279460E-2L,
+-2.5313561699385640380910474255652501521033E-2L,
+-2.6856448685790244233704909690165496625399E-2L,
+-2.8438398935154170008519274953860128449036E-2L,
+-3.0058928687233090922411781058956589863039E-2L,
+-3.1717563112854831855692484086486099896614E-2L,
+-3.3413836095418743219397234253475252001090E-2L,
+-3.5147290019036555862676702093393332533702E-2L,
+-3.6917475563073933027920505457688955423688E-2L,
+-3.8723951502862058660874073462456610731178E-2L,
+-4.0566284516358241168330505467000838017425E-2L,
+-4.2444048996543693813649967076598766917965E-2L,
+-4.4356826869355401653098777649745233339196E-2L,
+-4.6304207416957323121106944474331029996141E-2L,
+-4.8285787106164123613318093945035804818364E-2L,
+-5.0301169421838218987124461766244507342648E-2L,
+-5.2349964705088137924875459464622098310997E-2L,
+-5.4431789996103111613753440311680967840214E-2L,
+-5.6546268881465384189752786409400404404794E-2L,
+-5.8693031345788023909329239565012647817664E-2L,
+-6.0871713627532018185577188079210189048340E-2L,
+-6.3081958078862169742820420185833800925568E-2L,
+-6.5323413029406789694910800219643791556918E-2L,
+-6.7595732653791419081537811574227049288168E-2L
+};
+
+/* ln(2) = ln2a + ln2b with extended precision. */
+static const long double
+ ln2a = 6.93145751953125e-1L,
+ ln2b = 1.4286068203094172321214581765680755001344E-6L;
+
+long double
+logl(long double x)
+{
+ long double z, y, w;
+ long double t;
+ int k, e;
+
+ /* Check for IEEE special cases. */
+
+ /* log(NaN) = NaN. */
+ if (isnanl (x))
+ {
+ return x;
+ }
+ /* log(0) = -infinity. */
+ if (x == 0.0L)
+ {
+ return -0.5L / ZERO;
+ }
+ /* log ( x < 0 ) = NaN */
+ if (x < 0.0L)
+ {
+ return (x - x) / ZERO;
+ }
+ /* log (infinity) */
+ if (x + x == x)
+ {
+ return x + x;
+ }
+
+ /* Extract exponent and reduce domain to 0.703125 <= u < 1.40625 */
+ x = frexpl(x, &e);
+ if (x < 0.703125L)
+ {
+ x += x;
+ e--;
+ }
+
+ /* On this interval the table is not used due to cancellation error. */
+ if ((x <= 1.0078125L) && (x >= 0.9921875L))
+ {
+ z = x - 1.0L;
+ k = 64;
+ t = 1.0L;
+ }
+ else
+ {
+ k = floorl ((x - 0.5L) * 128.0L);
+ t = 0.5L + k / 128.0L;
+ z = (x - t) / t;
+ }
+
+ /* Series expansion of log(1+z). */
+ w = z * z;
+ y = ((((((((((((l15 * z
+ + l14) * z
+ + l13) * z
+ + l12) * z
+ + l11) * z
+ + l10) * z
+ + l9) * z
+ + l8) * z
+ + l7) * z
+ + l6) * z
+ + l5) * z
+ + l4) * z
+ + l3) * z * w;
+ y -= 0.5 * w;
+ y += e * ln2b; /* Base 2 exponent offset times ln(2). */
+ y += z;
+ y += logtbl[k-26]; /* log(t) - (t-1) */
+ y += (t - 1.0L);
+ y += e * ln2a;
+ return y;
+}
diff --git a/gnulib/lib/long-options.c b/gnulib/lib/long-options.c
new file mode 100644
index 00000000..d28d69fa
--- /dev/null
+++ b/gnulib/lib/long-options.c
@@ -0,0 +1,88 @@
+/* Utility to accept --help and --version options as unobtrusively as possible.
+
+ Copyright (C) 1993-1994, 1998-2000, 2002-2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "long-options.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#include "version-etc.h"
+
+static struct option const long_options[] =
+{
+ {"help", no_argument, NULL, 'h'},
+ {"version", no_argument, NULL, 'v'},
+ {NULL, 0, NULL, 0}
+};
+
+/* Process long options --help and --version, but only if argc == 2.
+ Be careful not to gobble up `--'. */
+
+void
+parse_long_options (int argc,
+ char **argv,
+ const char *command_name,
+ const char *package,
+ const char *version,
+ void (*usage_func) (int),
+ /* const char *author1, ...*/ ...)
+{
+ int c;
+ int saved_opterr;
+
+ saved_opterr = opterr;
+
+ /* Don't print an error message for unrecognized options. */
+ opterr = 0;
+
+ if (argc == 2
+ && (c = getopt_long (argc, argv, "+", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ (*usage_func) (EXIT_SUCCESS);
+
+ case 'v':
+ {
+ va_list authors;
+ va_start (authors, usage_func);
+ version_etc_va (stdout, command_name, package, version, authors);
+ exit (0);
+ }
+
+ default:
+ /* Don't process any other long-named options. */
+ break;
+ }
+ }
+
+ /* Restore previous value. */
+ opterr = saved_opterr;
+
+ /* Reset this to zero so that getopt internals get initialized from
+ the probably-new parameters when/if getopt is called later. */
+ optind = 0;
+}
diff --git a/gnulib/lib/long-options.h b/gnulib/lib/long-options.h
new file mode 100644
index 00000000..3fe24d7b
--- /dev/null
+++ b/gnulib/lib/long-options.h
@@ -0,0 +1,26 @@
+/* long-options.h -- declaration for --help- and --version-handling function.
+ Copyright (C) 1993-1994, 1998-1999, 2003, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+void parse_long_options (int _argc,
+ char **_argv,
+ const char *_command_name,
+ const char *_package,
+ const char *_version,
+ void (*_usage) (int),
+ /* const char *author1, ...*/ ...);
diff --git a/gnulib/lib/lseek.c b/gnulib/lib/lseek.c
new file mode 100644
index 00000000..adcae404
--- /dev/null
+++ b/gnulib/lib/lseek.c
@@ -0,0 +1,62 @@
+/* An lseek() function that detects pipes.
+ Copyright (C) 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Windows platforms. */
+/* Get GetFileType. */
+# include <windows.h>
+#else
+# include <sys/stat.h>
+#endif
+#include <errno.h>
+
+#undef lseek
+
+off_t
+rpl_lseek (int fd, off_t offset, int whence)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals. */
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (GetFileType (h) != FILE_TYPE_DISK)
+ {
+ errno = ESPIPE;
+ return -1;
+ }
+#else
+ /* BeOS lseek mistakenly succeeds on pipes... */
+ struct stat statbuf;
+ if (fstat (fd, &statbuf) < 0)
+ return -1;
+ if (!S_ISREG (statbuf.st_mode))
+ {
+ errno = ESPIPE;
+ return -1;
+ }
+#endif
+ return lseek (fd, offset, whence);
+}
diff --git a/gnulib/lib/lstat.c b/gnulib/lib/lstat.c
new file mode 100644
index 00000000..586ab16b
--- /dev/null
+++ b/gnulib/lib/lstat.c
@@ -0,0 +1,91 @@
+/* Work around a bug of lstat on some systems
+
+ Copyright (C) 1997-2006, 2008-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#if !HAVE_LSTAT
+/* On systems that lack symlinks, our replacement <sys/stat.h> already
+ defined lstat as stat, so there is nothing further to do other than
+ avoid an empty file. */
+typedef int dummy;
+#else /* HAVE_LSTAT */
+
+/* Get the original definition of lstat. It might be defined as a macro. */
+# define __need_system_sys_stat_h
+# include <sys/types.h>
+# include <sys/stat.h>
+# undef __need_system_sys_stat_h
+
+static inline int
+orig_lstat (const char *filename, struct stat *buf)
+{
+ return lstat (filename, buf);
+}
+
+/* Specification. */
+# include <sys/stat.h>
+
+# include <string.h>
+# include <errno.h>
+
+/* lstat works differently on Linux and Solaris systems. POSIX (see
+ `pathname resolution' in the glossary) requires that programs like
+ `ls' take into consideration the fact that FILE has a trailing slash
+ when FILE is a symbolic link. On Linux and Solaris 10 systems, the
+ lstat function already has the desired semantics (in treating
+ `lstat ("symlink/", sbuf)' just like `lstat ("symlink/.", sbuf)',
+ but on Solaris 9 and earlier it does not.
+
+ If FILE has a trailing slash and specifies a symbolic link,
+ then use stat() to get more info on the referent of FILE.
+ If the referent is a non-directory, then set errno to ENOTDIR
+ and return -1. Otherwise, return stat's result. */
+
+int
+rpl_lstat (const char *file, struct stat *sbuf)
+{
+ size_t len;
+ int lstat_result = orig_lstat (file, sbuf);
+
+ if (lstat_result != 0)
+ return lstat_result;
+
+ /* This replacement file can blindly check against '/' rather than
+ using the ISSLASH macro, because all platforms with '\\' either
+ lack symlinks (mingw) or have working lstat (cygwin) and thus do
+ not compile this file. 0 len should have already been filtered
+ out above, with a failure return of ENOENT. */
+ len = strlen (file);
+ if (file[len - 1] != '/' || S_ISDIR (sbuf->st_mode))
+ return 0;
+
+ /* At this point, a trailing slash is only permitted on
+ symlink-to-dir; but it should have found information on the
+ directory, not the symlink. Call stat() to get info about the
+ link's referent. Our replacement stat guarantees valid results,
+ even if the symlink is not pointing to a directory. */
+ if (!S_ISLNK (sbuf->st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ return stat (file, sbuf);
+}
+
+#endif /* HAVE_LSTAT */
diff --git a/gnulib/lib/malloc.c b/gnulib/lib/malloc.c
new file mode 100644
index 00000000..f236f372
--- /dev/null
+++ b/gnulib/lib/malloc.c
@@ -0,0 +1,57 @@
+/* malloc() function that is glibc compatible.
+
+ Copyright (C) 1997-1998, 2006-2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#include <config.h>
+/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */
+#ifdef malloc
+# define NEED_MALLOC_GNU
+# undef malloc
+#endif
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Call the system's malloc below. */
+#undef malloc
+
+/* Allocate an N-byte block of memory from the heap.
+ If N is zero, allocate a 1-byte block. */
+
+void *
+rpl_malloc (size_t n)
+{
+ void *result;
+
+#ifdef NEED_MALLOC_GNU
+ if (n == 0)
+ n = 1;
+#endif
+
+ result = malloc (n);
+
+#if !HAVE_MALLOC_POSIX
+ if (result == NULL)
+ errno = ENOMEM;
+#endif
+
+ return result;
+}
diff --git a/gnulib/lib/malloca.c b/gnulib/lib/malloca.c
new file mode 100644
index 00000000..b0e6ab6e
--- /dev/null
+++ b/gnulib/lib/malloca.c
@@ -0,0 +1,137 @@
+/* Safe automatic memory allocation.
+ Copyright (C) 2003, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "malloca.h"
+
+/* The speed critical point in this file is freea() applied to an alloca()
+ result: it must be fast, to match the speed of alloca(). The speed of
+ mmalloca() and freea() in the other case are not critical, because they
+ are only invoked for big memory sizes. */
+
+#if HAVE_ALLOCA
+
+/* Store the mmalloca() results in a hash table. This is needed to reliably
+ distinguish a mmalloca() result and an alloca() result.
+
+ Although it is possible that the same pointer is returned by alloca() and
+ by mmalloca() at different times in the same application, it does not lead
+ to a bug in freea(), because:
+ - Before a pointer returned by alloca() can point into malloc()ed memory,
+ the function must return, and once this has happened the programmer must
+ not call freea() on it anyway.
+ - Before a pointer returned by mmalloca() can point into the stack, it
+ must be freed. The only function that can free it is freea(), and
+ when freea() frees it, it also removes it from the hash table. */
+
+#define MAGIC_NUMBER 0x1415fb4a
+#define MAGIC_SIZE sizeof (int)
+/* This is how the header info would look like without any alignment
+ considerations. */
+struct preliminary_header { void *next; char room[MAGIC_SIZE]; };
+/* But the header's size must be a multiple of sa_alignment_max. */
+#define HEADER_SIZE \
+ (((sizeof (struct preliminary_header) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max)
+struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header) + MAGIC_SIZE]; };
+/* Verify that HEADER_SIZE == sizeof (struct header). */
+typedef int verify1[2 * (HEADER_SIZE == sizeof (struct header)) - 1];
+/* We make the hash table quite big, so that during lookups the probability
+ of empty hash buckets is quite high. There is no need to make the hash
+ table resizable, because when the hash table gets filled so much that the
+ lookup becomes slow, it means that the application has memory leaks. */
+#define HASH_TABLE_SIZE 257
+static void * mmalloca_results[HASH_TABLE_SIZE];
+
+#endif
+
+void *
+mmalloca (size_t n)
+{
+#if HAVE_ALLOCA
+ /* Allocate one more word, that serves as an indicator for malloc()ed
+ memory, so that freea() of an alloca() result is fast. */
+ size_t nplus = n + HEADER_SIZE;
+
+ if (nplus >= n)
+ {
+ char *p = (char *) malloc (nplus);
+
+ if (p != NULL)
+ {
+ size_t slot;
+
+ p += HEADER_SIZE;
+
+ /* Put a magic number into the indicator word. */
+ ((int *) p)[-1] = MAGIC_NUMBER;
+
+ /* Enter p into the hash table. */
+ slot = (unsigned long) p % HASH_TABLE_SIZE;
+ ((struct header *) (p - HEADER_SIZE))->next = mmalloca_results[slot];
+ mmalloca_results[slot] = p;
+
+ return p;
+ }
+ }
+ /* Out of memory. */
+ return NULL;
+#else
+# if !MALLOC_0_IS_NONNULL
+ if (n == 0)
+ n = 1;
+# endif
+ return malloc (n);
+#endif
+}
+
+#if HAVE_ALLOCA
+void
+freea (void *p)
+{
+ /* mmalloca() may have returned NULL. */
+ if (p != NULL)
+ {
+ /* Attempt to quickly distinguish the mmalloca() result - which has
+ a magic indicator word - and the alloca() result - which has an
+ uninitialized indicator word. It is for this test that sa_increment
+ additional bytes are allocated in the alloca() case. */
+ if (((int *) p)[-1] == MAGIC_NUMBER)
+ {
+ /* Looks like a mmalloca() result. To see whether it really is one,
+ perform a lookup in the hash table. */
+ size_t slot = (unsigned long) p % HASH_TABLE_SIZE;
+ void **chain = &mmalloca_results[slot];
+ for (; *chain != NULL;)
+ {
+ if (*chain == p)
+ {
+ /* Found it. Remove it from the hash table and free it. */
+ char *p_begin = (char *) p - HEADER_SIZE;
+ *chain = ((struct header *) p_begin)->next;
+ free (p_begin);
+ return;
+ }
+ chain = &((struct header *) ((char *) *chain - HEADER_SIZE))->next;
+ }
+ }
+ /* At this point, we know it was not a mmalloca() result. */
+ }
+}
+#endif
diff --git a/gnulib/lib/malloca.h b/gnulib/lib/malloca.h
new file mode 100644
index 00000000..fb560e76
--- /dev/null
+++ b/gnulib/lib/malloca.h
@@ -0,0 +1,134 @@
+/* Safe automatic memory allocation.
+ Copyright (C) 2003-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _MALLOCA_H
+#define _MALLOCA_H
+
+#include <alloca.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* safe_alloca(N) is equivalent to alloca(N) when it is safe to call
+ alloca(N); otherwise it returns NULL. It either returns N bytes of
+ memory allocated on the stack, that lasts until the function returns,
+ or NULL.
+ Use of safe_alloca should be avoided:
+ - inside arguments of function calls - undefined behaviour,
+ - in inline functions - the allocation may actually last until the
+ calling function returns.
+*/
+#if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots.
+ This must be a macro, not an inline function. */
+# define safe_alloca(N) ((N) < 4032 ? alloca (N) : NULL)
+#else
+# define safe_alloca(N) ((void) (N), NULL)
+#endif
+
+/* malloca(N) is a safe variant of alloca(N). It allocates N bytes of
+ memory allocated on the stack, that must be freed using freea() before
+ the function returns. Upon failure, it returns NULL. */
+#if HAVE_ALLOCA
+# define malloca(N) \
+ ((N) < 4032 - sa_increment \
+ ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \
+ : mmalloca (N))
+#else
+# define malloca(N) \
+ mmalloca (N)
+#endif
+extern void * mmalloca (size_t n);
+
+/* Free a block of memory allocated through malloca(). */
+#if HAVE_ALLOCA
+extern void freea (void *p);
+#else
+# define freea free
+#endif
+
+/* nmalloca(N,S) is an overflow-safe variant of malloca (N * S).
+ It allocates an array of N objects, each with S bytes of memory,
+ on the stack. S must be positive and N must be nonnegative.
+ The array must be freed using freea() before the function returns. */
+#if 1
+/* Cf. the definition of xalloc_oversized. */
+# define nmalloca(n, s) \
+ ((n) > (size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) \
+ ? NULL \
+ : malloca ((n) * (s)))
+#else
+extern void * nmalloca (size_t n, size_t s);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* ------------------- Auxiliary, non-public definitions ------------------- */
+
+/* Determine the alignment of a type at compile time. */
+#if defined __GNUC__
+# define sa_alignof __alignof__
+#elif defined __cplusplus
+ template <class type> struct sa_alignof_helper { char __slot1; type __slot2; };
+# define sa_alignof(type) offsetof (sa_alignof_helper<type>, __slot2)
+#elif defined __hpux
+ /* Work around a HP-UX 10.20 cc bug with enums constants defined as offsetof
+ values. */
+# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8)
+#elif defined _AIX
+ /* Work around an AIX 3.2.5 xlc bug with enums constants defined as offsetof
+ values. */
+# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8)
+#else
+# define sa_alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2)
+#endif
+
+enum
+{
+/* The desired alignment of memory allocations is the maximum alignment
+ among all elementary types. */
+ sa_alignment_long = sa_alignof (long),
+ sa_alignment_double = sa_alignof (double),
+#if HAVE_LONG_LONG_INT
+ sa_alignment_longlong = sa_alignof (long long),
+#endif
+ sa_alignment_longdouble = sa_alignof (long double),
+ sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1)
+#if HAVE_LONG_LONG_INT
+ | (sa_alignment_longlong - 1)
+#endif
+ | (sa_alignment_longdouble - 1)
+ ) + 1,
+/* The increment that guarantees room for a magic word must be >= sizeof (int)
+ and a multiple of sa_alignment_max. */
+ sa_increment = ((sizeof (int) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max
+};
+
+#endif /* _MALLOCA_H */
diff --git a/gnulib/lib/malloca.valgrind b/gnulib/lib/malloca.valgrind
new file mode 100644
index 00000000..52f0a50f
--- /dev/null
+++ b/gnulib/lib/malloca.valgrind
@@ -0,0 +1,7 @@
+# Suppress a valgrind message about use of uninitialized memory in freea().
+# This use is OK because it provides only a speedup.
+{
+ freea
+ Memcheck:Cond
+ fun:freea
+}
diff --git a/gnulib/lib/math.in.h b/gnulib/lib/math.in.h
new file mode 100644
index 00000000..70e7988b
--- /dev/null
+++ b/gnulib/lib/math.in.h
@@ -0,0 +1,633 @@
+/* A GNU-like <math.h>.
+
+ Copyright (C) 2002-2003, 2007-2010 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/>. */
+
+#ifndef _GL_MATH_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
+
+#ifndef _GL_MATH_H
+#define _GL_MATH_H
+
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Helper macros to define a portability warning for the
+ classification macro FUNC called with VALUE. POSIX declares the
+ classification macros with an argument of real-floating (that is,
+ one of float, double, or long double). */
+#define _GL_WARN_REAL_FLOATING_DECL(func) \
+static inline int \
+rpl_ ## func ## f (float f) \
+{ \
+ return func (f); \
+} \
+static inline int \
+rpl_ ## func ## d (double d) \
+{ \
+ return func (d); \
+} \
+static inline int \
+rpl_ ## func ## l (long double l) \
+{ \
+ return func (l); \
+} \
+_GL_WARN_ON_USE (rpl_ ## func ## f, #func " is unportable - " \
+ "use gnulib module " #func " for portability"); \
+_GL_WARN_ON_USE (rpl_ ## func ## d, #func " is unportable - " \
+ "use gnulib module " #func " for portability"); \
+_GL_WARN_ON_USE (rpl_ ## func ## l, #func " is unportable - " \
+ "use gnulib module " #func " for portability")
+#define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
+ (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value) \
+ : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value) \
+ : rpl_ ## func ## l (value))
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* POSIX allows platforms that don't support NAN. But all major
+ machines in the past 15 years have supported something close to
+ IEEE NaN, so we define this unconditionally. We also must define
+ it on platforms like Solaris 10, where NAN is present but defined
+ as a function pointer rather than a floating point constant. */
+#if !defined NAN || @REPLACE_NAN@
+# undef NAN
+ /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
+# ifdef __DECC
+static float
+_NaN ()
+{
+ static float zero = 0.0f;
+ return zero / zero;
+}
+# define NAN (_NaN())
+# else
+# define NAN (0.0f / 0.0f)
+# endif
+#endif
+
+/* Solaris 10 defines HUGE_VAL, but as a function pointer rather
+ than a floating point constant. */
+#if @REPLACE_HUGE_VAL@
+# undef HUGE_VAL
+# define HUGE_VAL (1.0 / 0.0)
+#endif
+
+/* Write x as
+ x = mantissa * 2^exp
+ where
+ If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
+ If x is zero: mantissa = x, exp = 0.
+ If x is infinite or NaN: mantissa = x, exp unspecified.
+ Store exp in *EXPPTR and return mantissa. */
+#if @GNULIB_FREXP@
+# if @REPLACE_FREXP@
+# define frexp rpl_frexp
+extern double frexp (double x, int *expptr) _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef frexp
+/* Assume frexp is always declared. */
+_GL_WARN_ON_USE (frexp, "frexp is unportable - "
+ "use gnulib module frexp for portability");
+#endif
+
+
+#if @GNULIB_ACOSL@
+# if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@
+extern long double acosl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef acosl
+# if HAVE_RAW_DECL_ACOSL
+_GL_WARN_ON_USE (acosl, "acosl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ASINL@
+# if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@
+extern long double asinl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef asinl
+# if HAVE_RAW_DECL_ASINL
+_GL_WARN_ON_USE (asinl, "asinl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ATANL@
+# if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@
+extern long double atanl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef atanl
+# if HAVE_RAW_DECL_ATANL
+_GL_WARN_ON_USE (atanl, "atanl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CEILF@
+# if @REPLACE_CEILF@
+# define ceilf rpl_ceilf
+extern float ceilf (float x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ceilf
+# if HAVE_RAW_DECL_CEILF
+_GL_WARN_ON_USE (ceilf, "ceilf is unportable - "
+ "use gnulib module ceilf for portability");
+# endif
+#endif
+
+#if @GNULIB_CEILL@
+# if @REPLACE_CEILL@
+# define ceill rpl_ceill
+extern long double ceill (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ceill
+# if HAVE_RAW_DECL_CEILL
+_GL_WARN_ON_USE (ceill, "ceill is unportable - "
+ "use gnulib module ceill for portability");
+# endif
+#endif
+
+
+#if @GNULIB_COSL@
+# if !@HAVE_COSL@
+# undef cosl
+# define cosl rpl_cosl
+# endif
+# if !@HAVE_COSL@ || !@HAVE_DECL_COSL@
+extern long double cosl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef cosl
+# if HAVE_RAW_DECL_COSL
+_GL_WARN_ON_USE (cosl, "cosl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_EXPL@
+# if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@
+extern long double expl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef expl
+# if HAVE_RAW_DECL_EXPL
+_GL_WARN_ON_USE (expl, "expl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FLOORF@
+# if @REPLACE_FLOORF@
+# define floorf rpl_floorf
+extern float floorf (float x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef floorf
+# if HAVE_RAW_DECL_FLOORF
+_GL_WARN_ON_USE (floorf, "floorf is unportable - "
+ "use gnulib module floorf for portability");
+# endif
+#endif
+
+#if @GNULIB_FLOORL@
+# if @REPLACE_FLOORL@
+# define floorl rpl_floorl
+extern long double floorl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef floorl
+# if HAVE_RAW_DECL_FLOORL
+_GL_WARN_ON_USE (floorl, "floorl is unportable - "
+ "use gnulib module floorl for portability");
+# endif
+#endif
+
+
+/* Write x as
+ x = mantissa * 2^exp
+ where
+ If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
+ If x is zero: mantissa = x, exp = 0.
+ If x is infinite or NaN: mantissa = x, exp unspecified.
+ Store exp in *EXPPTR and return mantissa. */
+#if @GNULIB_FREXPL@ && @REPLACE_FREXPL@
+# define frexpl rpl_frexpl
+#endif
+#if (@GNULIB_FREXPL@ && @REPLACE_FREXPL@) || !@HAVE_DECL_FREXPL@
+extern long double frexpl (long double x, int *expptr) _GL_ARG_NONNULL ((2));
+#endif
+#if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK
+# undef frexpl
+# if HAVE_RAW_DECL_FREXPL
+_GL_WARN_ON_USE (frexpl, "frexpl is unportable - "
+ "use gnulib module frexpl for portability");
+# endif
+#endif
+
+
+/* Return x * 2^exp. */
+#if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@
+# define ldexpl rpl_ldexpl
+#endif
+#if (@GNULIB_LDEXPL@ && @REPLACE_LDEXPL@) || !@HAVE_DECL_LDEXPL@
+extern long double ldexpl (long double x, int exp);
+#endif
+#if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK
+# undef ldexpl
+# if HAVE_RAW_DECL_LDEXPL
+_GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - "
+ "use gnulib module ldexpl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOGL@
+# if !@HAVE_LOGL@
+# undef logl
+# define logl rpl_logl
+# endif
+# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@
+extern long double logl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef logl
+# if HAVE_RAW_DECL_LOGL
+_GL_WARN_ON_USE (logl, "logl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ROUNDF@
+# if @REPLACE_ROUNDF@
+# undef roundf
+# define roundf rpl_roundf
+extern float roundf (float x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef roundf
+# if HAVE_RAW_DECL_ROUNDF
+_GL_WARN_ON_USE (roundf, "roundf is unportable - "
+ "use gnulib module roundf for portability");
+# endif
+#endif
+
+#if @GNULIB_ROUND@
+# if @REPLACE_ROUND@
+# undef round
+# define round rpl_round
+extern double round (double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef round
+# if HAVE_RAW_DECL_ROUND
+_GL_WARN_ON_USE (round, "round is unportable - "
+ "use gnulib module round for portability");
+# endif
+#endif
+
+#if @GNULIB_ROUNDL@
+# if @REPLACE_ROUNDL@
+# undef roundl
+# define roundl rpl_roundl
+extern long double roundl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef roundl
+# if HAVE_RAW_DECL_ROUNDL
+_GL_WARN_ON_USE (roundl, "roundl is unportable - "
+ "use gnulib module roundl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SINL@
+# if !@HAVE_SINL@
+# undef sinl
+# define sinl rpl_sinl
+# endif
+# if !@HAVE_SINL@ || !@HAVE_DECL_SINL@
+extern long double sinl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sinl
+# if HAVE_RAW_DECL_SINL
+_GL_WARN_ON_USE (sinl, "sinl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SQRTL@
+# if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@
+extern long double sqrtl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sqrtl
+# if HAVE_RAW_DECL_SQRTL
+_GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TANL@
+# if !@HAVE_TANL@ || !@HAVE_DECL_TANL@
+extern long double tanl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef tanl
+# if HAVE_RAW_DECL_TANL
+_GL_WARN_ON_USE (tanl, "tanl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TRUNCF@
+# if !@HAVE_DECL_TRUNCF@
+# define truncf rpl_truncf
+extern float truncf (float x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef truncf
+# if HAVE_RAW_DECL_TRUNCF
+_GL_WARN_ON_USE (truncf, "truncf is unportable - "
+ "use gnulib module truncf for portability");
+# endif
+#endif
+
+#if @GNULIB_TRUNC@
+# if !@HAVE_DECL_TRUNC@
+# define trunc rpl_trunc
+extern double trunc (double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef trunc
+# if HAVE_RAW_DECL_TRUNC
+_GL_WARN_ON_USE (trunc, "trunc is unportable - "
+ "use gnulib module trunc for portability");
+# endif
+#endif
+
+#if @GNULIB_TRUNCL@
+# if @REPLACE_TRUNCL@
+# undef truncl
+# define truncl rpl_truncl
+extern long double truncl (long double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef truncl
+# if HAVE_RAW_DECL_TRUNCL
+_GL_WARN_ON_USE (truncl, "truncl is unportable - "
+ "use gnulib module truncl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ISFINITE@
+# if @REPLACE_ISFINITE@
+extern int gl_isfinitef (float x);
+extern int gl_isfinited (double x);
+extern int gl_isfinitel (long double x);
+# undef isfinite
+# define isfinite(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \
+ sizeof (x) == sizeof (double) ? gl_isfinited (x) : \
+ gl_isfinitef (x))
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isfinite
+_GL_WARN_REAL_FLOATING_DECL (isfinite);
+# undef isfinite
+# define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x)
+# endif
+#endif
+
+
+#if @GNULIB_ISINF@
+# if @REPLACE_ISINF@
+extern int gl_isinff (float x);
+extern int gl_isinfd (double x);
+extern int gl_isinfl (long double x);
+# undef isinf
+# define isinf(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \
+ sizeof (x) == sizeof (double) ? gl_isinfd (x) : \
+ gl_isinff (x))
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isinf
+_GL_WARN_REAL_FLOATING_DECL (isinf);
+# undef isinf
+# define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x)
+# endif
+#endif
+
+
+#if @GNULIB_ISNANF@
+/* Test for NaN for 'float' numbers. */
+# if @HAVE_ISNANF@
+/* The original <math.h> included above provides a declaration of isnan macro
+ or (older) isnanf function. */
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanf
+# define isnanf(x) __builtin_isnanf ((float)(x))
+# elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnanf
+# define isnanf rpl_isnanf
+extern int isnanf (float x);
+# endif
+#endif
+
+#if @GNULIB_ISNAND@
+/* Test for NaN for 'double' numbers.
+ This function is a gnulib extension, unlike isnan() which applied only
+ to 'double' numbers earlier but now is a type-generic macro. */
+# if @HAVE_ISNAND@
+/* The original <math.h> included above provides a declaration of isnan macro. */
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnand
+# define isnand(x) __builtin_isnan ((double)(x))
+# else
+# undef isnand
+# define isnand(x) isnan ((double)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnand
+# define isnand rpl_isnand
+extern int isnand (double x);
+# endif
+#endif
+
+#if @GNULIB_ISNANL@
+/* Test for NaN for 'long double' numbers. */
+# if @HAVE_ISNANL@
+/* The original <math.h> included above provides a declaration of isnan macro or (older) isnanl function. */
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanl
+# define isnanl(x) __builtin_isnanl ((long double)(x))
+# elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnanl
+# define isnanl rpl_isnanl
+extern int isnanl (long double x);
+# endif
+#endif
+
+/* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL! */
+#if @GNULIB_ISNAN@
+# if @REPLACE_ISNAN@
+/* We can't just use the isnanf macro (e.g.) as exposed by
+ isnanf.h (e.g.) here, because those may end up being macros
+ that recursively expand back to isnan. So use the gnulib
+ replacements for them directly. */
+# if @HAVE_ISNANF@ && __GNUC__ >= 4
+# define gl_isnan_f(x) __builtin_isnan ((float)(x))
+# else
+extern int rpl_isnanf (float x);
+# define gl_isnan_f(x) rpl_isnanf (x)
+# endif
+# if @HAVE_ISNAND@ && __GNUC__ >= 4
+# define gl_isnan_d(x) __builtin_isnan ((double)(x))
+# else
+extern int rpl_isnand (double x);
+# define gl_isnan_d(x) rpl_isnand (x)
+# endif
+# if @HAVE_ISNANL@ && __GNUC__ >= 4
+# define gl_isnan_l(x) __builtin_isnan ((long double)(x))
+# else
+extern int rpl_isnanl (long double x);
+# define gl_isnan_l(x) rpl_isnanl (x)
+# endif
+# undef isnan
+# define isnan(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
+ sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
+ gl_isnan_f (x))
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isnan
+_GL_WARN_REAL_FLOATING_DECL (isnan);
+# undef isnan
+# define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x)
+# endif
+#endif
+
+
+#if @GNULIB_SIGNBIT@
+# if @REPLACE_SIGNBIT_USING_GCC@
+# undef signbit
+ /* GCC 4.0 and newer provides three built-ins for signbit. */
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
+ __builtin_signbitf (x))
+# endif
+# if @REPLACE_SIGNBIT@
+# undef signbit
+extern int gl_signbitf (float arg);
+extern int gl_signbitd (double arg);
+extern int gl_signbitl (long double arg);
+# if __GNUC__ >= 2 && !__STRICT_ANSI__
+# if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
+# define gl_signbitf_OPTIMIZED_MACRO
+# define gl_signbitf(arg) \
+ ({ union { float _value; \
+ unsigned int _word[(sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd
+# define gl_signbitd_OPTIMIZED_MACRO
+# define gl_signbitd(arg) \
+ ({ union { double _value; \
+ unsigned int _word[(sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl
+# define gl_signbitl_OPTIMIZED_MACRO
+# define gl_signbitl(arg) \
+ ({ union { long double _value; \
+ unsigned int _word[(sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# endif
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? gl_signbitd (x) : \
+ gl_signbitf (x))
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined signbit
+_GL_WARN_REAL_FLOATING_DECL (signbit);
+# undef signbit
+# define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x)
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_MATH_H */
+#endif /* _GL_MATH_H */
diff --git a/gnulib/lib/mbchar.c b/gnulib/lib/mbchar.c
new file mode 100644
index 00000000..6ec01950
--- /dev/null
+++ b/gnulib/lib/mbchar.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 2001, 2006, 2009, 2010 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/>. */
+
+
+#include <config.h>
+
+#include <limits.h>
+
+#include "mbchar.h"
+
+#if IS_BASIC_ASCII
+
+/* Bit table of characters in the ISO C "basic character set". */
+const unsigned int is_basic_table [UCHAR_MAX / 32 + 1] =
+{
+ 0x00001a00, /* '\t' '\v' '\f' */
+ 0xffffffef, /* ' '...'#' '%'...'?' */
+ 0xfffffffe, /* 'A'...'Z' '[' '\\' ']' '^' '_' */
+ 0x7ffffffe /* 'a'...'z' '{' '|' '}' '~' */
+ /* The remaining bits are 0. */
+};
+
+#endif /* IS_BASIC_ASCII */
diff --git a/gnulib/lib/mbchar.h b/gnulib/lib/mbchar.h
new file mode 100644
index 00000000..012bfcb1
--- /dev/null
+++ b/gnulib/lib/mbchar.h
@@ -0,0 +1,350 @@
+/* Multibyte character data type.
+ Copyright (C) 2001, 2005-2007, 2009-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* A multibyte character is a short subsequence of a char* string,
+ representing a single wide character.
+
+ We use multibyte characters instead of wide characters because of
+ the following goals:
+ 1) correct multibyte handling, i.e. operate according to the LC_CTYPE
+ locale,
+ 2) ease of maintenance, i.e. the maintainer needs not know all details
+ of the ISO C 99 standard,
+ 3) don't fail grossly if the input is not in the encoding set by the
+ locale, because often different encodings are in use in the same
+ countries (ISO-8859-1/UTF-8, EUC-JP/Shift_JIS, ...),
+ 4) fast in the case of ASCII characters,
+ 5) portability, i.e. don't make unportable assumptions about wchar_t.
+
+ Multibyte characters are only accessed through the mb* macros.
+
+ mb_ptr (mbc)
+ return a pointer to the beginning of the multibyte sequence.
+
+ mb_len (mbc)
+ returns the number of bytes occupied by the multibyte sequence.
+ Always > 0.
+
+ mb_iseq (mbc, sc)
+ returns true if mbc is the standard ASCII character sc.
+
+ mb_isnul (mbc)
+ returns true if mbc is the nul character.
+
+ mb_cmp (mbc1, mbc2)
+ returns a positive, zero, or negative value depending on whether mbc1
+ sorts after, same or before mbc2.
+
+ mb_casecmp (mbc1, mbc2)
+ returns a positive, zero, or negative value depending on whether mbc1
+ sorts after, same or before mbc2, modulo upper/lowercase conversion.
+
+ mb_equal (mbc1, mbc2)
+ returns true if mbc1 and mbc2 are equal.
+
+ mb_caseequal (mbc1, mbc2)
+ returns true if mbc1 and mbc2 are equal modulo upper/lowercase conversion.
+
+ mb_isalnum (mbc)
+ returns true if mbc is alphanumeric.
+
+ mb_isalpha (mbc)
+ returns true if mbc is alphabetic.
+
+ mb_isascii(mbc)
+ returns true if mbc is plain ASCII.
+
+ mb_isblank (mbc)
+ returns true if mbc is a blank.
+
+ mb_iscntrl (mbc)
+ returns true if mbc is a control character.
+
+ mb_isdigit (mbc)
+ returns true if mbc is a decimal digit.
+
+ mb_isgraph (mbc)
+ returns true if mbc is a graphic character.
+
+ mb_islower (mbc)
+ returns true if mbc is lowercase.
+
+ mb_isprint (mbc)
+ returns true if mbc is a printable character.
+
+ mb_ispunct (mbc)
+ returns true if mbc is a punctuation character.
+
+ mb_isspace (mbc)
+ returns true if mbc is a space character.
+
+ mb_isupper (mbc)
+ returns true if mbc is uppercase.
+
+ mb_isxdigit (mbc)
+ returns true if mbc is a hexadecimal digit.
+
+ mb_width (mbc)
+ returns the number of columns on the output device occupied by mbc.
+ Always >= 0.
+
+ mb_putc (mbc, stream)
+ outputs mbc on stream, a byte oriented FILE stream opened for output.
+
+ mb_setascii (&mbc, sc)
+ assigns the standard ASCII character sc to mbc.
+
+ mb_copy (&destmbc, &srcmbc)
+ copies srcmbc to destmbc.
+
+ Here are the function prototypes of the macros.
+
+ extern const char * mb_ptr (const mbchar_t mbc);
+ extern size_t mb_len (const mbchar_t mbc);
+ extern bool mb_iseq (const mbchar_t mbc, char sc);
+ extern bool mb_isnul (const mbchar_t mbc);
+ extern int mb_cmp (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern int mb_casecmp (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_equal (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_caseequal (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_isalnum (const mbchar_t mbc);
+ extern bool mb_isalpha (const mbchar_t mbc);
+ extern bool mb_isascii (const mbchar_t mbc);
+ extern bool mb_isblank (const mbchar_t mbc);
+ extern bool mb_iscntrl (const mbchar_t mbc);
+ extern bool mb_isdigit (const mbchar_t mbc);
+ extern bool mb_isgraph (const mbchar_t mbc);
+ extern bool mb_islower (const mbchar_t mbc);
+ extern bool mb_isprint (const mbchar_t mbc);
+ extern bool mb_ispunct (const mbchar_t mbc);
+ extern bool mb_isspace (const mbchar_t mbc);
+ extern bool mb_isupper (const mbchar_t mbc);
+ extern bool mb_isxdigit (const mbchar_t mbc);
+ extern int mb_width (const mbchar_t mbc);
+ extern void mb_putc (const mbchar_t mbc, FILE *stream);
+ extern void mb_setascii (mbchar_t *new, char sc);
+ extern void mb_copy (mbchar_t *new, const mbchar_t *old);
+ */
+
+#ifndef _MBCHAR_H
+#define _MBCHAR_H 1
+
+#include <stdbool.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#define MBCHAR_BUF_SIZE 24
+
+struct mbchar
+{
+ const char *ptr; /* pointer to current character */
+ size_t bytes; /* number of bytes of current character, > 0 */
+ bool wc_valid; /* true if wc is a valid wide character */
+ wchar_t wc; /* if wc_valid: the current character */
+ char buf[MBCHAR_BUF_SIZE]; /* room for the bytes, used for file input only */
+};
+
+/* EOF (not a real character) is represented with bytes = 0 and
+ wc_valid = false. */
+
+typedef struct mbchar mbchar_t;
+
+/* Access the current character. */
+#define mb_ptr(mbc) ((mbc).ptr)
+#define mb_len(mbc) ((mbc).bytes)
+
+/* Comparison of characters. */
+#define mb_iseq(mbc, sc) ((mbc).wc_valid && (mbc).wc == (sc))
+#define mb_isnul(mbc) ((mbc).wc_valid && (mbc).wc == 0)
+#define mb_cmp(mbc1, mbc2) \
+ ((mbc1).wc_valid \
+ ? ((mbc2).wc_valid \
+ ? (int) (mbc1).wc - (int) (mbc2).wc \
+ : -1) \
+ : ((mbc2).wc_valid \
+ ? 1 \
+ : (mbc1).bytes == (mbc2).bytes \
+ ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \
+ : (mbc1).bytes < (mbc2).bytes \
+ ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
+ : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
+#define mb_casecmp(mbc1, mbc2) \
+ ((mbc1).wc_valid \
+ ? ((mbc2).wc_valid \
+ ? (int) towlower ((mbc1).wc) - (int) towlower ((mbc2).wc) \
+ : -1) \
+ : ((mbc2).wc_valid \
+ ? 1 \
+ : (mbc1).bytes == (mbc2).bytes \
+ ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \
+ : (mbc1).bytes < (mbc2).bytes \
+ ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
+ : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
+#define mb_equal(mbc1, mbc2) \
+ ((mbc1).wc_valid && (mbc2).wc_valid \
+ ? (mbc1).wc == (mbc2).wc \
+ : (mbc1).bytes == (mbc2).bytes \
+ && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
+#define mb_caseequal(mbc1, mbc2) \
+ ((mbc1).wc_valid && (mbc2).wc_valid \
+ ? towlower ((mbc1).wc) == towlower ((mbc2).wc) \
+ : (mbc1).bytes == (mbc2).bytes \
+ && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
+
+/* <ctype.h>, <wctype.h> classification. */
+#define mb_isascii(mbc) \
+ ((mbc).wc_valid && (mbc).wc >= 0 && (mbc).wc <= 127)
+#define mb_isalnum(mbc) ((mbc).wc_valid && iswalnum ((mbc).wc))
+#define mb_isalpha(mbc) ((mbc).wc_valid && iswalpha ((mbc).wc))
+#define mb_isblank(mbc) ((mbc).wc_valid && iswblank ((mbc).wc))
+#define mb_iscntrl(mbc) ((mbc).wc_valid && iswcntrl ((mbc).wc))
+#define mb_isdigit(mbc) ((mbc).wc_valid && iswdigit ((mbc).wc))
+#define mb_isgraph(mbc) ((mbc).wc_valid && iswgraph ((mbc).wc))
+#define mb_islower(mbc) ((mbc).wc_valid && iswlower ((mbc).wc))
+#define mb_isprint(mbc) ((mbc).wc_valid && iswprint ((mbc).wc))
+#define mb_ispunct(mbc) ((mbc).wc_valid && iswpunct ((mbc).wc))
+#define mb_isspace(mbc) ((mbc).wc_valid && iswspace ((mbc).wc))
+#define mb_isupper(mbc) ((mbc).wc_valid && iswupper ((mbc).wc))
+#define mb_isxdigit(mbc) ((mbc).wc_valid && iswxdigit ((mbc).wc))
+
+/* Extra <wchar.h> function. */
+
+/* Unprintable characters appear as a small box of width 1. */
+#define MB_UNPRINTABLE_WIDTH 1
+
+static inline int
+mb_width_aux (wint_t wc)
+{
+ int w = wcwidth (wc);
+ /* For unprintable characters, arbitrarily return 0 for control characters
+ and MB_UNPRINTABLE_WIDTH otherwise. */
+ return (w >= 0 ? w : iswcntrl (wc) ? 0 : MB_UNPRINTABLE_WIDTH);
+}
+
+#define mb_width(mbc) \
+ ((mbc).wc_valid ? mb_width_aux ((mbc).wc) : MB_UNPRINTABLE_WIDTH)
+
+/* Output. */
+#define mb_putc(mbc, stream) fwrite ((mbc).ptr, 1, (mbc).bytes, (stream))
+
+/* Assignment. */
+#define mb_setascii(mbc, sc) \
+ ((mbc)->ptr = (mbc)->buf, (mbc)->bytes = 1, (mbc)->wc_valid = 1, \
+ (mbc)->wc = (mbc)->buf[0] = (sc))
+
+/* Copying a character. */
+static inline void
+mb_copy (mbchar_t *new_mbc, const mbchar_t *old_mbc)
+{
+ if (old_mbc->ptr == &old_mbc->buf[0])
+ {
+ memcpy (&new_mbc->buf[0], &old_mbc->buf[0], old_mbc->bytes);
+ new_mbc->ptr = &new_mbc->buf[0];
+ }
+ else
+ new_mbc->ptr = old_mbc->ptr;
+ new_mbc->bytes = old_mbc->bytes;
+ if ((new_mbc->wc_valid = old_mbc->wc_valid))
+ new_mbc->wc = old_mbc->wc;
+}
+
+
+/* is_basic(c) tests whether the single-byte character c is in the
+ ISO C "basic character set".
+ This is a convenience function, and is in this file only to share code
+ between mbiter_multi.h and mbfile_multi.h. */
+#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
+/* The character set is ISO-646, not EBCDIC. */
+# define IS_BASIC_ASCII 1
+
+extern const unsigned int is_basic_table[];
+
+static inline bool
+is_basic (char c)
+{
+ return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31))
+ & 1;
+}
+
+#else
+
+static inline bool
+is_basic (char c)
+{
+ switch (c)
+ {
+ case '\t': case '\v': case '\f':
+ case ' ': case '!': case '"': case '#': case '%':
+ case '&': case '\'': case '(': case ')': case '*':
+ case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>':
+ case '?':
+ case 'A': case 'B': case 'C': case 'D': case 'E':
+ case 'F': case 'G': case 'H': case 'I': case 'J':
+ case 'K': case 'L': case 'M': case 'N': case 'O':
+ case 'P': case 'Q': case 'R': case 'S': case 'T':
+ case 'U': case 'V': case 'W': case 'X': case 'Y':
+ case 'Z':
+ case '[': case '\\': case ']': case '^': case '_':
+ case 'a': case 'b': case 'c': case 'd': case 'e':
+ case 'f': case 'g': case 'h': case 'i': case 'j':
+ case 'k': case 'l': case 'm': case 'n': case 'o':
+ case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y':
+ case 'z': case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+#endif
+
+#endif /* _MBCHAR_H */
diff --git a/gnulib/lib/mbfile.h b/gnulib/lib/mbfile.h
new file mode 100644
index 00000000..0a9a4b09
--- /dev/null
+++ b/gnulib/lib/mbfile.h
@@ -0,0 +1,242 @@
+/* Multibyte character I/O: macros for multi-byte encodings.
+ Copyright (C) 2001, 2005, 2009, 2010 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/>. */
+
+/* Written by Mitsuru Chinen <mchinen@yamato.ibm.com>
+ and Bruno Haible <bruno@clisp.org>. */
+
+/* The macros in this file implement multi-byte character input from a
+ stream.
+
+ mb_file_t
+ is the type for multibyte character input stream, usable for variable
+ declarations.
+
+ mbf_char_t
+ is the type for multibyte character or EOF, usable for variable
+ declarations.
+
+ mbf_init (mbf, stream)
+ initializes the MB_FILE for reading from stream.
+
+ mbf_getc (mbc, mbf)
+ reads the next multibyte character from mbf and stores it in mbc.
+
+ mb_iseof (mbc)
+ returns true if mbc represents the EOF value.
+
+ Here are the function prototypes of the macros.
+
+ extern void mbf_init (mb_file_t mbf, FILE *stream);
+ extern void mbf_getc (mbf_char_t mbc, mb_file_t mbf);
+ extern bool mb_iseof (const mbf_char_t mbc);
+ */
+
+#ifndef _MBFILE_H
+#define _MBFILE_H 1
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+
+#include "mbchar.h"
+
+struct mbfile_multi {
+ FILE *fp;
+ bool eof_seen;
+ bool have_pushback;
+ mbstate_t state;
+ unsigned int bufcount;
+ char buf[MBCHAR_BUF_SIZE];
+ struct mbchar pushback;
+};
+
+static inline void
+mbfile_multi_getc (struct mbchar *mbc, struct mbfile_multi *mbf)
+{
+ size_t bytes;
+
+ /* If EOF has already been seen, don't use getc. This matters if
+ mbf->fp is connected to an interactive tty. */
+ if (mbf->eof_seen)
+ goto eof;
+
+ /* Return character pushed back, if there is one. */
+ if (mbf->have_pushback)
+ {
+ mb_copy (mbc, &mbf->pushback);
+ mbf->have_pushback = false;
+ return;
+ }
+
+ /* Before using mbrtowc, we need at least one byte. */
+ if (mbf->bufcount == 0)
+ {
+ int c = getc (mbf->fp);
+ if (c == EOF)
+ {
+ mbf->eof_seen = true;
+ goto eof;
+ }
+ mbf->buf[0] = (unsigned char) c;
+ mbf->bufcount++;
+ }
+
+ /* Handle most ASCII characters quickly, without calling mbrtowc(). */
+ if (mbf->bufcount == 1 && mbsinit (&mbf->state) && is_basic (mbf->buf[0]))
+ {
+ /* These characters are part of the basic character set. ISO C 99
+ guarantees that their wide character code is identical to their
+ char code. */
+ mbc->wc = mbc->buf[0] = mbf->buf[0];
+ mbc->wc_valid = true;
+ mbc->ptr = &mbc->buf[0];
+ mbc->bytes = 1;
+ mbf->bufcount = 0;
+ return;
+ }
+
+ /* Use mbrtowc on an increasing number of bytes. Read only as many bytes
+ from mbf->fp as needed. This is needed to give reasonable interactive
+ behaviour when mbf->fp is connected to an interactive tty. */
+ for (;;)
+ {
+ /* We don't know whether the 'mbrtowc' function updates the state when
+ it returns -2, - this is the ISO C 99 and glibc-2.2 behaviour - or
+ not - amended ANSI C, glibc-2.1 and Solaris 2.7 behaviour. We
+ don't have an autoconf test for this, yet.
+ The new behaviour would allow us to feed the bytes one by one into
+ mbrtowc. But the old behaviour forces us to feed all bytes since
+ the end of the last character into mbrtowc. Since we want to retry
+ with more bytes when mbrtowc returns -2, we must backup the state
+ before calling mbrtowc, because implementations with the new
+ behaviour will clobber it. */
+ mbstate_t backup_state = mbf->state;
+
+ bytes = mbrtowc (&mbc->wc, &mbf->buf[0], mbf->bufcount, &mbf->state);
+
+ if (bytes == (size_t) -1)
+ {
+ /* An invalid multibyte sequence was encountered. */
+ /* Return a single byte. */
+ bytes = 1;
+ mbc->wc_valid = false;
+ break;
+ }
+ else if (bytes == (size_t) -2)
+ {
+ /* An incomplete multibyte character. */
+ mbf->state = backup_state;
+ if (mbf->bufcount == MBCHAR_BUF_SIZE)
+ {
+ /* An overlong incomplete multibyte sequence was encountered. */
+ /* Return a single byte. */
+ bytes = 1;
+ mbc->wc_valid = false;
+ break;
+ }
+ else
+ {
+ /* Read one more byte and retry mbrtowc. */
+ int c = getc (mbf->fp);
+ if (c == EOF)
+ {
+ /* An incomplete multibyte character at the end. */
+ mbf->eof_seen = true;
+ bytes = mbf->bufcount;
+ mbc->wc_valid = false;
+ break;
+ }
+ mbf->buf[mbf->bufcount] = (unsigned char) c;
+ mbf->bufcount++;
+ }
+ }
+ else
+ {
+ if (bytes == 0)
+ {
+ /* A null wide character was encountered. */
+ bytes = 1;
+ assert (mbf->buf[0] == '\0');
+ assert (mbc->wc == 0);
+ }
+ mbc->wc_valid = true;
+ break;
+ }
+ }
+
+ /* Return the multibyte sequence mbf->buf[0..bytes-1]. */
+ mbc->ptr = &mbc->buf[0];
+ memcpy (&mbc->buf[0], &mbf->buf[0], bytes);
+ mbc->bytes = bytes;
+
+ mbf->bufcount -= bytes;
+ if (mbf->bufcount > 0)
+ {
+ /* It's not worth calling memmove() for so few bytes. */
+ unsigned int count = mbf->bufcount;
+ char *p = &mbf->buf[0];
+
+ do
+ {
+ *p = *(p + bytes);
+ p++;
+ }
+ while (--count > 0);
+ }
+ return;
+
+eof:
+ /* An mbchar_t with bytes == 0 is used to indicate EOF. */
+ mbc->ptr = NULL;
+ mbc->bytes = 0;
+ mbc->wc_valid = false;
+ return;
+}
+
+static inline void
+mbfile_multi_ungetc (const struct mbchar *mbc, struct mbfile_multi *mbf)
+{
+ mb_copy (&mbf->pushback, mbc);
+ mbf->have_pushback = true;
+}
+
+typedef struct mbfile_multi mb_file_t;
+
+typedef mbchar_t mbf_char_t;
+
+#define mbf_init(mbf, stream) \
+ ((mbf).fp = (stream), \
+ (mbf).eof_seen = false, \
+ (mbf).have_pushback = false, \
+ memset (&(mbf).state, '\0', sizeof (mbstate_t)), \
+ (mbf).bufcount = 0)
+
+#define mbf_getc(mbc, mbf) mbfile_multi_getc (&(mbc), &(mbf))
+
+#define mbf_ungetc(mbc, mbf) mbfile_multi_ungetc (&(mbc), &(mbf))
+
+#define mb_iseof(mbc) ((mbc).bytes == 0)
+
+#endif /* _MBFILE_H */
diff --git a/gnulib/lib/mbiter.h b/gnulib/lib/mbiter.h
new file mode 100644
index 00000000..6b738268
--- /dev/null
+++ b/gnulib/lib/mbiter.h
@@ -0,0 +1,215 @@
+/* Iterating through multibyte strings: macros for multi-byte encodings.
+ Copyright (C) 2001, 2005, 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* The macros in this file implement forward iteration through a
+ multi-byte string.
+
+ With these macros, an iteration loop that looks like
+
+ char *iter;
+ for (iter = buf; iter < buf + buflen; iter++)
+ {
+ do_something (*iter);
+ }
+
+ becomes
+
+ mbi_iterator_t iter;
+ for (mbi_init (iter, buf, buflen); mbi_avail (iter); mbi_advance (iter))
+ {
+ do_something (mbi_cur_ptr (iter), mb_len (mbi_cur (iter)));
+ }
+
+ The benefit of these macros over plain use of mbrtowc is:
+ - Handling of invalid multibyte sequences is possible without
+ making the code more complicated, while still preserving the
+ invalid multibyte sequences.
+
+ mbi_iterator_t
+ is a type usable for variable declarations.
+
+ mbi_init (iter, startptr, length)
+ initializes the iterator, starting at startptr and crossing length bytes.
+
+ mbi_avail (iter)
+ returns true if there are more multibyte chracters available before
+ the end of string is reached. In this case, mbi_cur (iter) is
+ initialized to the next multibyte chracter.
+
+ mbi_advance (iter)
+ advances the iterator by one multibyte character.
+
+ mbi_cur (iter)
+ returns the current multibyte character, of type mbchar_t. All the
+ macros defined in mbchar.h can be used on it.
+
+ mbi_cur_ptr (iter)
+ return a pointer to the beginning of the current multibyte character.
+
+ mbi_reloc (iter, ptrdiff)
+ relocates iterator when the string is moved by ptrdiff bytes.
+
+ mbi_copy (&destiter, &srciter)
+ copies srciter to destiter.
+
+ Here are the function prototypes of the macros.
+
+ extern void mbi_init (mbi_iterator_t iter,
+ const char *startptr, size_t length);
+ extern bool mbi_avail (mbi_iterator_t iter);
+ extern void mbi_advance (mbi_iterator_t iter);
+ extern mbchar_t mbi_cur (mbi_iterator_t iter);
+ extern const char * mbi_cur_ptr (mbi_iterator_t iter);
+ extern void mbi_reloc (mbi_iterator_t iter, ptrdiff_t ptrdiff);
+ extern void mbi_copy (mbi_iterator_t *new, const mbi_iterator_t *old);
+ */
+
+#ifndef _MBITER_H
+#define _MBITER_H 1
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+
+#include "mbchar.h"
+
+struct mbiter_multi
+{
+ const char *limit; /* pointer to end of string */
+ bool in_shift; /* true if next byte may not be interpreted as ASCII */
+ mbstate_t state; /* if in_shift: current shift state */
+ bool next_done; /* true if mbi_avail has already filled the following */
+ struct mbchar cur; /* the current character:
+ const char *cur.ptr pointer to current character
+ The following are only valid after mbi_avail.
+ size_t cur.bytes number of bytes of current character
+ bool cur.wc_valid true if wc is a valid wide character
+ wchar_t cur.wc if wc_valid: the current character
+ */
+};
+
+static inline void
+mbiter_multi_next (struct mbiter_multi *iter)
+{
+ if (iter->next_done)
+ return;
+ if (iter->in_shift)
+ goto with_shift;
+ /* Handle most ASCII characters quickly, without calling mbrtowc(). */
+ if (is_basic (*iter->cur.ptr))
+ {
+ /* These characters are part of the basic character set. ISO C 99
+ guarantees that their wide character code is identical to their
+ char code. */
+ iter->cur.bytes = 1;
+ iter->cur.wc = *iter->cur.ptr;
+ iter->cur.wc_valid = true;
+ }
+ else
+ {
+ assert (mbsinit (&iter->state));
+ iter->in_shift = true;
+ with_shift:
+ iter->cur.bytes = mbrtowc (&iter->cur.wc, iter->cur.ptr,
+ iter->limit - iter->cur.ptr, &iter->state);
+ if (iter->cur.bytes == (size_t) -1)
+ {
+ /* An invalid multibyte sequence was encountered. */
+ iter->cur.bytes = 1;
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not very important; the string is bogus anyway. */
+ }
+ else if (iter->cur.bytes == (size_t) -2)
+ {
+ /* An incomplete multibyte character at the end. */
+ iter->cur.bytes = iter->limit - iter->cur.ptr;
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not important; the string end is reached anyway. */
+ }
+ else
+ {
+ if (iter->cur.bytes == 0)
+ {
+ /* A null wide character was encountered. */
+ iter->cur.bytes = 1;
+ assert (*iter->cur.ptr == '\0');
+ assert (iter->cur.wc == 0);
+ }
+ iter->cur.wc_valid = true;
+
+ /* When in the initial state, we can go back treating ASCII
+ characters more quickly. */
+ if (mbsinit (&iter->state))
+ iter->in_shift = false;
+ }
+ }
+ iter->next_done = true;
+}
+
+static inline void
+mbiter_multi_reloc (struct mbiter_multi *iter, ptrdiff_t ptrdiff)
+{
+ iter->cur.ptr += ptrdiff;
+ iter->limit += ptrdiff;
+}
+
+static inline void
+mbiter_multi_copy (struct mbiter_multi *new_iter, const struct mbiter_multi *old_iter)
+{
+ new_iter->limit = old_iter->limit;
+ if ((new_iter->in_shift = old_iter->in_shift))
+ memcpy (&new_iter->state, &old_iter->state, sizeof (mbstate_t));
+ else
+ memset (&new_iter->state, 0, sizeof (mbstate_t));
+ new_iter->next_done = old_iter->next_done;
+ mb_copy (&new_iter->cur, &old_iter->cur);
+}
+
+/* Iteration macros. */
+typedef struct mbiter_multi mbi_iterator_t;
+#define mbi_init(iter, startptr, length) \
+ ((iter).cur.ptr = (startptr), (iter).limit = (iter).cur.ptr + (length), \
+ (iter).in_shift = false, memset (&(iter).state, '\0', sizeof (mbstate_t)), \
+ (iter).next_done = false)
+#define mbi_avail(iter) \
+ ((iter).cur.ptr < (iter).limit && (mbiter_multi_next (&(iter)), true))
+#define mbi_advance(iter) \
+ ((iter).cur.ptr += (iter).cur.bytes, (iter).next_done = false)
+
+/* Access to the current character. */
+#define mbi_cur(iter) (iter).cur
+#define mbi_cur_ptr(iter) (iter).cur.ptr
+
+/* Relocation. */
+#define mbi_reloc(iter, ptrdiff) mbiter_multi_reloc (&iter, ptrdiff)
+
+/* Copying an iterator. */
+#define mbi_copy mbiter_multi_copy
+
+#endif /* _MBITER_H */
diff --git a/gnulib/lib/mbmemcasecmp.c b/gnulib/lib/mbmemcasecmp.c
new file mode 100644
index 00000000..b02083fd
--- /dev/null
+++ b/gnulib/lib/mbmemcasecmp.c
@@ -0,0 +1,96 @@
+/* Compare two memory areas with possibly different lengths, case-insensitive.
+ Copyright (C) 1998-1999, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009,
+ based on earlier glibc code.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "mbmemcasecmp.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "mbiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+int
+mbmemcasecmp (const char *s1, size_t n1, const char *s2, size_t n2)
+{
+ if (s1 == s2)
+ return (n1 < n2 ? -1 : n1 > n2 ? 1 : 0);
+
+ if (MB_CUR_MAX > 1)
+ {
+ mbi_iterator_t iter1;
+ mbi_iterator_t iter2;
+
+ mbi_init (iter1, s1, n1);
+ mbi_init (iter2, s2, n2);
+
+ while (mbi_avail (iter1) && mbi_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbi_cur (iter1), mbi_cur (iter2));
+
+ if (cmp != 0)
+ return cmp;
+
+ mbi_advance (iter1);
+ mbi_advance (iter2);
+ }
+ if (mbi_avail (iter1))
+ /* s2 terminated before s1. */
+ return 1;
+ if (mbi_avail (iter2))
+ /* s1 terminated before s2. */
+ return -1;
+ return 0;
+ }
+ else
+ {
+ const unsigned char *s1_end = (const unsigned char *) (s1 + n1);
+ const unsigned char *s2_end = (const unsigned char *) (s2 + n2);
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+
+ while (p1 < s1_end && p2 < s2_end)
+ {
+ unsigned char c1 = TOLOWER (*p1);
+ unsigned char c2 = TOLOWER (*p2);
+ if (c1 != c2)
+ {
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same
+ size, the difference of two 'unsigned char' values
+ - including the sign bit - doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+ }
+ ++p1;
+ ++p2;
+ }
+ if (p1 < s1_end)
+ /* s2 terminated before s1. */
+ return 1;
+ if (p2 < s2_end)
+ /* s1 terminated before s2. */
+ return -1;
+ return 0;
+ }
+}
diff --git a/gnulib/lib/mbmemcasecmp.h b/gnulib/lib/mbmemcasecmp.h
new file mode 100644
index 00000000..90ada091
--- /dev/null
+++ b/gnulib/lib/mbmemcasecmp.h
@@ -0,0 +1,45 @@
+/* Compare two memory areas with possibly different lengths, case-insensitive.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef MBMEMCASECMP_H
+#define MBMEMCASECMP_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare the memory regions S1 = [s1..s1+N1-1], S2 = [s2..s2+n2-1], that
+ contain character sequences, lexicographically, ignoring case.
+ This function's result is locale dependent. Unlike memcasecmp(), it works
+ correctly in multibyte locales and also handles Turkish i / dotless i.
+ Unlike ulc_casecmp(), it does not handle the German sharp s and the Greek
+ final sigma. Unlike memcoll() and ulc_casecoll(), it ignores collation
+ order.
+ Return a negative number if S1 < S2, a positive number if S1 > S2, or
+ 0 if S1 and S2 have the same contents.
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths! */
+extern int mbmemcasecmp (const char *s1, size_t n1, const char *s2, size_t n2);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MBMEMCASECMP_H */
diff --git a/gnulib/lib/mbmemcasecoll.c b/gnulib/lib/mbmemcasecoll.c
new file mode 100644
index 00000000..b8248f90
--- /dev/null
+++ b/gnulib/lib/mbmemcasecoll.c
@@ -0,0 +1,186 @@
+/* Locale-specific case-ignoring memory comparison.
+ Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "mbmemcasecoll.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Get tolower(). */
+#include <ctype.h>
+
+/* Get mbstate_t, mbrtowc(), wcrtomb(). */
+#include <wchar.h>
+
+/* Get towlower(). */
+#include <wctype.h>
+
+#include "malloca.h"
+#include "memcmp2.h"
+#include "memcoll.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Apply towlower() to the multibyte character sequence in INBUF, storing the
+ result as a multibyte character sequence in OUTBUF. */
+static size_t
+apply_towlower (const char *inbuf, size_t inbufsize,
+ char *outbuf, size_t outbufsize)
+{
+ char *outbuf_orig = outbuf;
+ size_t remaining;
+
+ remaining = inbufsize;
+ while (remaining > 0)
+ {
+ wchar_t wc1;
+ size_t n1;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ n1 = mbrtowc (&wc1, inbuf, remaining, &state);
+ if (n1 == (size_t)(-2))
+ break;
+ if (n1 != (size_t)(-1))
+ {
+ wint_t wc2 = towlower (wc1);
+
+ if (wc2 != wc1)
+ {
+ size_t n2;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ n2 = wcrtomb (outbuf, wc2, &state);
+ if (n2 != (size_t)(-1))
+ {
+ /* Store the translated multibyte character. */
+ inbuf += n1;
+ remaining -= n1;
+ outbuf += n2;
+ continue;
+ }
+ }
+
+ /* Nothing to translate. */
+ memcpy (outbuf, inbuf, n1);
+ inbuf += n1;
+ remaining -= n1;
+ outbuf += n1;
+ continue;
+ }
+
+ /* Invalid multibyte character on input.
+ Copy one byte without modification. */
+ *outbuf++ = *inbuf++;
+ remaining -= 1;
+ }
+ /* Incomplete multibyte sequence on input.
+ Pass it through unmodified. */
+ while (remaining > 0)
+ {
+ *outbuf++ = *inbuf++;
+ remaining -= 1;
+ }
+
+ /* Verify the output buffer was large enough. */
+ if (outbuf - outbuf_orig > outbufsize)
+ abort ();
+
+ /* Return the number of written output bytes. */
+ return outbuf - outbuf_orig;
+}
+
+/* Apply tolower() to the unibyte character sequence in INBUF, storing the
+ result as a unibyte character sequence in OUTBUF. */
+static void
+apply_tolower (const char *inbuf, char *outbuf, size_t bufsize)
+{
+ for (; bufsize > 0; bufsize--)
+ {
+ *outbuf = TOLOWER ((unsigned char) *inbuf);
+ inbuf++;
+ outbuf++;
+ }
+}
+
+int
+mbmemcasecoll (const char *s1, size_t s1len, const char *s2, size_t s2len,
+ bool hard_LC_COLLATE)
+{
+ char *t1;
+ size_t t1len;
+ char *t2;
+ size_t t2len;
+ char *memory;
+ int cmp;
+
+ if (MB_CUR_MAX > 1)
+ {
+ /* Application of towlower grows each character by a factor 2
+ at most. */
+ t1len = 2 * s1len;
+ t2len = 2 * s2len;
+ }
+ else
+ {
+ /* Application of tolower doesn't change the size. */
+ t1len = s1len;
+ t2len = s2len;
+ }
+ /* Allocate memory for t1 and t2. */
+ memory = (char *) malloca (t1len + 1 + t2len + 1);
+ if (memory == NULL)
+ {
+ errno = ENOMEM;
+ return 0;
+ }
+ t1 = memory;
+ t2 = memory + t1len + 1;
+
+ /* Csae-fold the two argument strings. */
+ if (MB_CUR_MAX > 1)
+ {
+ t1len = apply_towlower (s1, s1len, t1, t1len);
+ t2len = apply_towlower (s2, s2len, t2, t2len);
+ }
+ else
+ {
+ apply_tolower (s1, t1, s1len);
+ apply_tolower (s2, t2, s2len);
+ }
+
+ /* Compare the two case-folded strings. */
+ if (hard_LC_COLLATE)
+ cmp = memcoll (t1, t1len, t2, t2len);
+ else
+ {
+ cmp = memcmp2 (t1, t1len, t2, t2len);
+ errno = 0;
+ }
+
+ {
+ int saved_errno = errno;
+ freea (memory);
+ errno = saved_errno;
+ }
+
+ return cmp;
+}
diff --git a/gnulib/lib/mbmemcasecoll.h b/gnulib/lib/mbmemcasecoll.h
new file mode 100644
index 00000000..8b95627e
--- /dev/null
+++ b/gnulib/lib/mbmemcasecoll.h
@@ -0,0 +1,58 @@
+/* Locale-specific case-ignoring memory comparison.
+ Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2001. */
+
+#ifndef MBMEMCASECOLL_H
+#define MBMEMCASECOLL_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare the memory regions S1 = [s1..s1+s1len-1], S2 = [s2..s2+s2len-1],
+ that contain character sequences, using the rules of the current locale,
+ ignoring case.
+ HARD_LC_COLLATE is false if the LC_COLLATE category of the current locale
+ is equivalent to the "C" locale.
+
+ This function's result is locale dependent. Unlike memcasecmp(), it works
+ correctly in multibyte locales and also handles Turkish i / dotless i.
+ Unlike ulc_casecmp(), it does not handle the German sharp s and the Greek
+ final sigma. Like memcoll() and ulc_casecoll(), it uses collation order.
+
+ Return a negative number if S1 < S2, a positive number if S1 > S2, 0 if
+ S1 and S2 have the same contents, or an unspecified value if there is an
+ error.
+ Set errno to an error number if there is an error, and to zero otherwise.
+
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths! */
+
+extern int mbmemcasecoll (const char *s1, size_t s1len,
+ const char *s2, size_t s2len,
+ bool hard_LC_COLLATE);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MBMEMCASECOLL_H */
diff --git a/gnulib/lib/mbrlen.c b/gnulib/lib/mbrlen.c
new file mode 100644
index 00000000..01ee0944
--- /dev/null
+++ b/gnulib/lib/mbrlen.c
@@ -0,0 +1,32 @@
+/* Recognize multibyte character.
+ Copyright (C) 1999-2000, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+
+static mbstate_t internal_state;
+
+size_t
+mbrlen (const char *s, size_t n, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &internal_state;
+ return mbrtowc (NULL, s, n, ps);
+}
diff --git a/gnulib/lib/mbrtowc.c b/gnulib/lib/mbrtowc.c
new file mode 100644
index 00000000..5c2650e9
--- /dev/null
+++ b/gnulib/lib/mbrtowc.c
@@ -0,0 +1,386 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 1999-2002, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#if GNULIB_defined_mbstate_t
+/* Implement mbrtowc() on top of mbtowc(). */
+
+# include <errno.h>
+# include <stdlib.h>
+
+# include "localcharset.h"
+# include "streq.h"
+# include "verify.h"
+
+
+verify (sizeof (mbstate_t) >= 4);
+
+static char internal_state[4];
+
+size_t
+mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+ char *pstate = (char *)ps;
+
+ if (pstate == NULL)
+ pstate = internal_state;
+
+ if (s == NULL)
+ {
+ pwc = NULL;
+ s = "";
+ n = 1;
+ }
+
+ if (n == 0)
+ return (size_t)(-2);
+
+ /* Here n > 0. */
+ {
+ size_t nstate = pstate[0];
+ char buf[4];
+ const char *p;
+ size_t m;
+
+ switch (nstate)
+ {
+ case 0:
+ p = s;
+ m = n;
+ break;
+ case 3:
+ buf[2] = pstate[3];
+ /*FALLTHROUGH*/
+ case 2:
+ buf[1] = pstate[2];
+ /*FALLTHROUGH*/
+ case 1:
+ buf[0] = pstate[1];
+ p = buf;
+ m = nstate;
+ buf[m++] = s[0];
+ if (n >= 2 && m < 4)
+ {
+ buf[m++] = s[1];
+ if (n >= 3 && m < 4)
+ buf[m++] = s[2];
+ }
+ break;
+ default:
+ errno = EINVAL;
+ return (size_t)(-1);
+ }
+
+ /* Here m > 0. */
+
+# if __GLIBC__
+ /* Work around bug <http://sourceware.org/bugzilla/show_bug.cgi?id=9674> */
+ mbtowc (NULL, NULL, 0);
+# endif
+ {
+ int res = mbtowc (pwc, p, m);
+
+ if (res >= 0)
+ {
+ if (pwc != NULL && ((*pwc == 0) != (res == 0)))
+ abort ();
+ if (nstate >= (res > 0 ? res : 1))
+ abort ();
+ res -= nstate;
+ pstate[0] = 0;
+ return res;
+ }
+
+ /* mbtowc does not distinguish between invalid and incomplete multibyte
+ sequences. But mbrtowc needs to make this distinction.
+ There are two possible approaches:
+ - Use iconv() and its return value.
+ - Use built-in knowledge about the possible encodings.
+ Given the low quality of implementation of iconv() on the systems that
+ lack mbrtowc(), we use the second approach.
+ The possible encodings are:
+ - 8-bit encodings,
+ - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS,
+ - UTF-8.
+ Use specialized code for each. */
+ if (m >= 4 || m >= MB_CUR_MAX)
+ goto invalid;
+ /* Here MB_CUR_MAX > 1 and 0 < m < 4. */
+ {
+ const char *encoding = locale_charset ();
+
+ if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
+ {
+ /* Cf. unistr/u8-mblen.c. */
+ unsigned char c = (unsigned char) p[0];
+
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (m == 1)
+ goto incomplete;
+ }
+ else if (c < 0xf0)
+ {
+ if (m == 1)
+ goto incomplete;
+ if (m == 2)
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if ((c2 ^ 0x80) < 0x40
+ && (c >= 0xe1 || c2 >= 0xa0)
+ && (c != 0xed || c2 < 0xa0))
+ goto incomplete;
+ }
+ }
+ else if (c <= 0xf4)
+ {
+ if (m == 1)
+ goto incomplete;
+ else /* m == 2 || m == 3 */
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if ((c2 ^ 0x80) < 0x40
+ && (c >= 0xf1 || c2 >= 0x90)
+ && (c < 0xf4 || (c == 0xf4 && c2 < 0x90)))
+ {
+ if (m == 2)
+ goto incomplete;
+ else /* m == 3 */
+ {
+ unsigned char c3 = (unsigned char) p[2];
+
+ if ((c3 ^ 0x80) < 0x40)
+ goto incomplete;
+ }
+ }
+ }
+ }
+ }
+ goto invalid;
+ }
+
+ /* As a reference for this code, you can use the GNU libiconv
+ implementation. Look for uses of the RET_TOOFEW macro. */
+
+ if (STREQ (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0xa1 && c < 0xff) || c == 0x8e || c == 0x8f)
+ goto incomplete;
+ }
+ if (m == 2)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c == 0x8f)
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if (c2 >= 0xa1 && c2 < 0xff)
+ goto incomplete;
+ }
+ }
+ goto invalid;
+ }
+ if (STREQ (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ || STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
+ || STREQ (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c >= 0xa1 && c < 0xff)
+ goto incomplete;
+ }
+ goto invalid;
+ }
+ if (STREQ (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0xa1 && c < 0xff) || c == 0x8e)
+ goto incomplete;
+ }
+ else /* m == 2 || m == 3 */
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c == 0x8e)
+ goto incomplete;
+ }
+ goto invalid;
+ }
+ if (STREQ (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe))
+ goto incomplete;
+ }
+ else /* m == 2 || m == 3 */
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c >= 0x90 && c <= 0xe3)
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if (c2 >= 0x30 && c2 <= 0x39)
+ {
+ if (m == 2)
+ goto incomplete;
+ else /* m == 3 */
+ {
+ unsigned char c3 = (unsigned char) p[2];
+
+ if (c3 >= 0x81 && c3 <= 0xfe)
+ goto incomplete;
+ }
+ }
+ }
+ }
+ goto invalid;
+ }
+ if (STREQ (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)
+ || (c >= 0xf0 && c <= 0xf9))
+ goto incomplete;
+ }
+ goto invalid;
+ }
+
+ /* An unknown multibyte encoding. */
+ goto incomplete;
+ }
+
+ incomplete:
+ {
+ size_t k = nstate;
+ /* Here 0 <= k < m < 4. */
+ pstate[++k] = s[0];
+ if (k < m)
+ {
+ pstate[++k] = s[1];
+ if (k < m)
+ pstate[++k] = s[2];
+ }
+ if (k != m)
+ abort ();
+ }
+ pstate[0] = m;
+ return (size_t)(-2);
+
+ invalid:
+ errno = EILSEQ;
+ /* The conversion state is undefined, says POSIX. */
+ return (size_t)(-1);
+ }
+ }
+}
+
+#else
+/* Override the system's mbrtowc() function. */
+
+# undef mbrtowc
+
+size_t
+rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+# if MBRTOWC_NULL_ARG_BUG || MBRTOWC_RETVAL_BUG
+ if (s == NULL)
+ {
+ pwc = NULL;
+ s = "";
+ n = 1;
+ }
+# endif
+
+# if MBRTOWC_RETVAL_BUG
+ {
+ static mbstate_t internal_state;
+
+ /* Override mbrtowc's internal state. We can not call mbsinit() on the
+ hidden internal state, but we can call it on our variable. */
+ if (ps == NULL)
+ ps = &internal_state;
+
+ if (!mbsinit (ps))
+ {
+ /* Parse the rest of the multibyte character byte for byte. */
+ size_t count = 0;
+ for (; n > 0; s++, n--)
+ {
+ wchar_t wc;
+ size_t ret = mbrtowc (&wc, s, 1, ps);
+
+ if (ret == (size_t)(-1))
+ return (size_t)(-1);
+ count++;
+ if (ret != (size_t)(-2))
+ {
+ /* The multibyte character has been completed. */
+ if (pwc != NULL)
+ *pwc = wc;
+ return (wc == 0 ? 0 : count);
+ }
+ }
+ return (size_t)(-2);
+ }
+ }
+# endif
+
+# if MBRTOWC_NUL_RETVAL_BUG
+ {
+ wchar_t wc;
+ size_t ret = mbrtowc (&wc, s, n, ps);
+
+ if (ret != (size_t)(-1) && ret != (size_t)(-2))
+ {
+ if (pwc != NULL)
+ *pwc = wc;
+ if (wc == 0)
+ ret = 0;
+ }
+ return ret;
+ }
+# else
+ return mbrtowc (pwc, s, n, ps);
+# endif
+}
+
+#endif
diff --git a/gnulib/lib/mbscasecmp.c b/gnulib/lib/mbscasecmp.c
new file mode 100644
index 00000000..ba9feef4
--- /dev/null
+++ b/gnulib/lib/mbscasecmp.c
@@ -0,0 +1,98 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005,
+ based on earlier glibc code.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#include "mbuiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare the character strings S1 and S2, ignoring case, returning less than,
+ equal to or greater than zero if S1 is lexicographically less than, equal to
+ or greater than S2.
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths! */
+int
+mbscasecmp (const char *s1, const char *s2)
+{
+ if (s1 == s2)
+ return 0;
+
+ /* Be careful not to look at the entire extent of s1 or s2 until needed.
+ This is useful because when two strings differ, the difference is
+ most often already in the very few first characters. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter1;
+ mbui_iterator_t iter2;
+
+ mbui_init (iter1, s1);
+ mbui_init (iter2, s2);
+
+ while (mbui_avail (iter1) && mbui_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
+
+ if (cmp != 0)
+ return cmp;
+
+ mbui_advance (iter1);
+ mbui_advance (iter2);
+ }
+ if (mbui_avail (iter1))
+ /* s2 terminated before s1. */
+ return 1;
+ if (mbui_avail (iter2))
+ /* s1 terminated before s2. */
+ return -1;
+ return 0;
+ }
+ else
+ {
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+ }
+}
diff --git a/gnulib/lib/mbscasestr.c b/gnulib/lib/mbscasestr.c
new file mode 100644
index 00000000..7586a99f
--- /dev/null
+++ b/gnulib/lib/mbscasestr.c
@@ -0,0 +1,409 @@
+/* Case-insensitive searching in a string.
+ Copyright (C) 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <stddef.h> /* for NULL, in case a nonstandard string.h lacks it */
+
+#include "malloca.h"
+#include "mbuiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Knuth-Morris-Pratt algorithm. */
+#define CANON_ELEMENT(c) TOLOWER (c)
+#include "str-kmp.h"
+
+/* Knuth-Morris-Pratt algorithm.
+ See http://en.wikipedia.org/wiki/Knuth-Morris-Pratt_algorithm
+ Return a boolean indicating success:
+ Return true and set *RESULTP if the search was completed.
+ Return false if it was aborted because not enough memory was available. */
+static bool
+knuth_morris_pratt_multibyte (const char *haystack, const char *needle,
+ const char **resultp)
+{
+ size_t m = mbslen (needle);
+ mbchar_t *needle_mbchars;
+ size_t *table;
+
+ /* Allocate room for needle_mbchars and the table. */
+ char *memory = (char *) nmalloca (m, sizeof (mbchar_t) + sizeof (size_t));
+ if (memory == NULL)
+ return false;
+ needle_mbchars = (mbchar_t *) memory;
+ table = (size_t *) (memory + m * sizeof (mbchar_t));
+
+ /* Fill needle_mbchars. */
+ {
+ mbui_iterator_t iter;
+ size_t j;
+
+ j = 0;
+ for (mbui_init (iter, needle); mbui_avail (iter); mbui_advance (iter), j++)
+ {
+ mb_copy (&needle_mbchars[j], &mbui_cur (iter));
+ if (needle_mbchars[j].wc_valid)
+ needle_mbchars[j].wc = towlower (needle_mbchars[j].wc);
+ }
+ }
+
+ /* Fill the table.
+ For 0 < i < m:
+ 0 < table[i] <= i is defined such that
+ forall 0 < x < table[i]: needle[x..i-1] != needle[0..i-1-x],
+ and table[i] is as large as possible with this property.
+ This implies:
+ 1) For 0 < i < m:
+ If table[i] < i,
+ needle[table[i]..i-1] = needle[0..i-1-table[i]].
+ 2) For 0 < i < m:
+ rhaystack[0..i-1] == needle[0..i-1]
+ and exists h, i <= h < m: rhaystack[h] != needle[h]
+ implies
+ forall 0 <= x < table[i]: rhaystack[x..x+m-1] != needle[0..m-1].
+ table[0] remains uninitialized. */
+ {
+ size_t i, j;
+
+ /* i = 1: Nothing to verify for x = 0. */
+ table[1] = 1;
+ j = 0;
+
+ for (i = 2; i < m; i++)
+ {
+ /* Here: j = i-1 - table[i-1].
+ The inequality needle[x..i-1] != needle[0..i-1-x] is known to hold
+ for x < table[i-1], by induction.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ mbchar_t *b = &needle_mbchars[i - 1];
+
+ for (;;)
+ {
+ /* Invariants: The inequality needle[x..i-1] != needle[0..i-1-x]
+ is known to hold for x < i-1-j.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ if (mb_equal (*b, needle_mbchars[j]))
+ {
+ /* Set table[i] := i-1-j. */
+ table[i] = i - ++j;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for x = i-1-j, because
+ needle[i-1] != needle[j] = needle[i-1-x]. */
+ if (j == 0)
+ {
+ /* The inequality holds for all possible x. */
+ table[i] = i;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for i-1-j < x < i-1-j+table[j], because for these x:
+ needle[x..i-2]
+ = needle[x-(i-1-j)..j-1]
+ != needle[0..j-1-(x-(i-1-j))] (by definition of table[j])
+ = needle[0..i-2-x],
+ hence needle[x..i-1] != needle[0..i-1-x].
+ Furthermore
+ needle[i-1-j+table[j]..i-2]
+ = needle[table[j]..j-1]
+ = needle[0..j-1-table[j]] (by definition of table[j]). */
+ j = j - table[j];
+ }
+ /* Here: j = i - table[i]. */
+ }
+ }
+
+ /* Search, using the table to accelerate the processing. */
+ {
+ size_t j;
+ mbui_iterator_t rhaystack;
+ mbui_iterator_t phaystack;
+
+ *resultp = NULL;
+ j = 0;
+ mbui_init (rhaystack, haystack);
+ mbui_init (phaystack, haystack);
+ /* Invariant: phaystack = rhaystack + j. */
+ while (mbui_avail (phaystack))
+ {
+ mbchar_t c;
+
+ mb_copy (&c, &mbui_cur (phaystack));
+ if (c.wc_valid)
+ c.wc = towlower (c.wc);
+ if (mb_equal (needle_mbchars[j], c))
+ {
+ j++;
+ mbui_advance (phaystack);
+ if (j == m)
+ {
+ /* The entire needle has been found. */
+ *resultp = mbui_cur_ptr (rhaystack);
+ break;
+ }
+ }
+ else if (j > 0)
+ {
+ /* Found a match of needle[0..j-1], mismatch at needle[j]. */
+ size_t count = table[j];
+ j -= count;
+ for (; count > 0; count--)
+ {
+ if (!mbui_avail (rhaystack))
+ abort ();
+ mbui_advance (rhaystack);
+ }
+ }
+ else
+ {
+ /* Found a mismatch at needle[0] already. */
+ if (!mbui_avail (rhaystack))
+ abort ();
+ mbui_advance (rhaystack);
+ mbui_advance (phaystack);
+ }
+ }
+ }
+
+ freea (memory);
+ return true;
+}
+
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK, using case-insensitive comparison.
+ Note: This function may, in multibyte locales, return success even if
+ strlen (haystack) < strlen (needle) ! */
+char *
+mbscasestr (const char *haystack, const char *needle)
+{
+ /* Be careful not to look at the entire extent of haystack or needle
+ until needed. This is useful because of these two cases:
+ - haystack may be very long, and a match of needle found early,
+ - needle may be very long, and not even a short initial segment of
+ needle may be found in haystack. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter_needle;
+
+ mbui_init (iter_needle, needle);
+ if (mbui_avail (iter_needle))
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = mbslen(haystack), m = mbslen(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ mbui_iterator_t iter_needle_last_ccount; /* = needle + last_ccount */
+
+ mbchar_t b;
+ mbui_iterator_t iter_haystack;
+
+ mbui_init (iter_needle_last_ccount, needle);
+
+ mb_copy (&b, &mbui_cur (iter_needle));
+ if (b.wc_valid)
+ b.wc = towlower (b.wc);
+
+ mbui_init (iter_haystack, haystack);
+ for (;; mbui_advance (iter_haystack))
+ {
+ mbchar_t c;
+
+ if (!mbui_avail (iter_haystack))
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ size_t count = comparison_count - last_ccount;
+ for (;
+ count > 0 && mbui_avail (iter_needle_last_ccount);
+ count--)
+ mbui_advance (iter_needle_last_ccount);
+ last_ccount = comparison_count;
+ if (!mbui_avail (iter_needle_last_ccount))
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const char *result;
+ bool success =
+ knuth_morris_pratt_multibyte (haystack, needle,
+ &result);
+ if (success)
+ return (char *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ mb_copy (&c, &mbui_cur (iter_haystack));
+ if (c.wc_valid)
+ c.wc = towlower (c.wc);
+ if (mb_equal (c, b))
+ /* The first character matches. */
+ {
+ mbui_iterator_t rhaystack;
+ mbui_iterator_t rneedle;
+
+ memcpy (&rhaystack, &iter_haystack, sizeof (mbui_iterator_t));
+ mbui_advance (rhaystack);
+
+ mbui_init (rneedle, needle);
+ if (!mbui_avail (rneedle))
+ abort ();
+ mbui_advance (rneedle);
+
+ for (;; mbui_advance (rhaystack), mbui_advance (rneedle))
+ {
+ if (!mbui_avail (rneedle))
+ /* Found a match. */
+ return (char *) mbui_cur_ptr (iter_haystack);
+ if (!mbui_avail (rhaystack))
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (!mb_caseequal (mbui_cur (rhaystack),
+ mbui_cur (rneedle)))
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+ else
+ return (char *) haystack;
+ }
+ else
+ {
+ if (*needle != '\0')
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = strlen(haystack), m = strlen(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ const char *needle_last_ccount = needle; /* = needle + last_ccount */
+
+ /* Speed up the following searches of needle by caching its first
+ character. */
+ unsigned char b = TOLOWER ((unsigned char) *needle);
+
+ needle++;
+ for (;; haystack++)
+ {
+ if (*haystack == '\0')
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ if (needle_last_ccount != NULL)
+ {
+ needle_last_ccount +=
+ strnlen (needle_last_ccount,
+ comparison_count - last_ccount);
+ if (*needle_last_ccount == '\0')
+ needle_last_ccount = NULL;
+ last_ccount = comparison_count;
+ }
+ if (needle_last_ccount == NULL)
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const char *result;
+ bool success =
+ knuth_morris_pratt_unibyte (haystack, needle - 1,
+ &result);
+ if (success)
+ return (char *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ if (TOLOWER ((unsigned char) *haystack) == b)
+ /* The first character matches. */
+ {
+ const char *rhaystack = haystack + 1;
+ const char *rneedle = needle;
+
+ for (;; rhaystack++, rneedle++)
+ {
+ if (*rneedle == '\0')
+ /* Found a match. */
+ return (char *) haystack;
+ if (*rhaystack == '\0')
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (TOLOWER ((unsigned char) *rhaystack)
+ != TOLOWER ((unsigned char) *rneedle))
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+ else
+ return (char *) haystack;
+ }
+}
diff --git a/gnulib/lib/mbschr.c b/gnulib/lib/mbschr.c
new file mode 100644
index 00000000..e6504c4d
--- /dev/null
+++ b/gnulib/lib/mbschr.c
@@ -0,0 +1,52 @@
+/* Searching a string for a character.
+ Copyright (C) 2007-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Locate the first single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING. */
+char *
+mbschr (const char *string, int c)
+{
+ if (MB_CUR_MAX > 1
+ /* Optimization: We know that ASCII characters < 0x30 don't occur as
+ part of multibyte characters longer than 1 byte. Hence, if c < 0x30,
+ the faster unibyte loop can be used. */
+ && (unsigned char) c >= 0x30)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string);; mbui_advance (iter))
+ {
+ if (!mbui_avail (iter))
+ goto notfound;
+ if (mb_len (mbui_cur (iter)) == 1
+ && (unsigned char) * mbui_cur_ptr (iter) == (unsigned char) c)
+ break;
+ }
+ return (char *) mbui_cur_ptr (iter);
+ notfound:
+ return NULL;
+ }
+ else
+ return strchr (string, c);
+}
diff --git a/gnulib/lib/mbscspn.c b/gnulib/lib/mbscspn.c
new file mode 100644
index 00000000..99ecfb2c
--- /dev/null
+++ b/gnulib/lib/mbscspn.c
@@ -0,0 +1,68 @@
+/* Searching a string for a character among a given set of characters.
+ Copyright (C) 1999, 2002, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists. */
+size_t
+mbscspn (const char *string, const char *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == '\0')
+ return strlen (string);
+ if (accept[1] == '\0')
+ {
+ const char *ptr = mbschr (string, accept[0]);
+ return (ptr != NULL ? ptr - string : strlen (string));
+ }
+ /* General case. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ if (mb_len (mbui_cur (iter)) == 1)
+ {
+ if (mbschr (accept, * mbui_cur_ptr (iter)))
+ goto found;
+ }
+ else
+ {
+ mbui_iterator_t aiter;
+
+ for (mbui_init (aiter, accept);
+ mbui_avail (aiter);
+ mbui_advance (aiter))
+ if (mb_equal (mbui_cur (aiter), mbui_cur (iter)))
+ goto found;
+ }
+ }
+ found:
+ return mbui_cur_ptr (iter) - string;
+ }
+ else
+ return strcspn (string, accept);
+}
diff --git a/gnulib/lib/mbsinit.c b/gnulib/lib/mbsinit.c
new file mode 100644
index 00000000..066ddfe5
--- /dev/null
+++ b/gnulib/lib/mbsinit.c
@@ -0,0 +1,47 @@
+/* Test for initial conversion state.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "verify.h"
+
+/* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs()
+ and wcrtomb(), wcsrtombs().
+ We assume that
+ - sizeof (mbstate_t) >= 4,
+ - only stateless encodings are supported (such as UTF-8 and EUC-JP, but
+ not ISO-2022 variants),
+ - for each encoding, the number of bytes for a wide character is <= 4.
+ (This maximum is attained for UTF-8, GB18030, EUC-TW.)
+ We define the meaning of mbstate_t as follows:
+ - In mb -> wc direction, mbstate_t's first byte contains the number of
+ buffered bytes (in the range 0..3), followed by up to 3 buffered bytes.
+ - In wc -> mb direction, mbstate_t contains no information. In other
+ words, it is always in the initial state. */
+
+verify (sizeof (mbstate_t) >= 4);
+
+int
+mbsinit (const mbstate_t *ps)
+{
+ const char *pstate = (const char *)ps;
+
+ return pstate[0] == 0;
+}
diff --git a/gnulib/lib/mbslen.c b/gnulib/lib/mbslen.c
new file mode 100644
index 00000000..5ccede64
--- /dev/null
+++ b/gnulib/lib/mbslen.c
@@ -0,0 +1,44 @@
+/* Counting the multibyte characters in a string.
+ Copyright (C) 2007-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <stdlib.h>
+
+#include "mbuiter.h"
+
+/* Return the number of multibyte characters in the character string STRING. */
+size_t
+mbslen (const char *string)
+{
+ if (MB_CUR_MAX > 1)
+ {
+ size_t count;
+ mbui_iterator_t iter;
+
+ count = 0;
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ count++;
+
+ return count;
+ }
+ else
+ return strlen (string);
+}
diff --git a/gnulib/lib/mbsncasecmp.c b/gnulib/lib/mbsncasecmp.c
new file mode 100644
index 00000000..12c7247a
--- /dev/null
+++ b/gnulib/lib/mbsncasecmp.c
@@ -0,0 +1,99 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005,
+ based on earlier glibc code.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#include "mbuiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare the initial segment of the character string S1 consisting of at most
+ N characters with the initial segment of the character string S2 consisting
+ of at most N characters, ignoring case, returning less than, equal to or
+ greater than zero if the initial segment of S1 is lexicographically less
+ than, equal to or greater than the initial segment of S2.
+ Note: This function may, in multibyte locales, return 0 for initial segments
+ of different lengths! */
+int
+mbsncasecmp (const char *s1, const char *s2, size_t n)
+{
+ if (s1 == s2 || n == 0)
+ return 0;
+
+ /* Be careful not to look at the entire extent of s1 or s2 until needed.
+ This is useful because when two strings differ, the difference is
+ most often already in the very few first characters. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter1;
+ mbui_iterator_t iter2;
+
+ mbui_init (iter1, s1);
+ mbui_init (iter2, s2);
+
+ while (mbui_avail (iter1) && mbui_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
+
+ if (cmp != 0)
+ return cmp;
+
+ if (--n == 0)
+ return 0;
+
+ mbui_advance (iter1);
+ mbui_advance (iter2);
+ }
+ if (mbui_avail (iter1))
+ /* s2 terminated before s1 and n. */
+ return 1;
+ if (mbui_avail (iter2))
+ /* s1 terminated before s2 and n. */
+ return -1;
+ return 0;
+ }
+ else
+ {
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ for (; ; p1++, p2++)
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (--n == 0 || c1 == '\0' || c1 != c2)
+ break;
+ }
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+ }
+}
diff --git a/gnulib/lib/mbsnlen.c b/gnulib/lib/mbsnlen.c
new file mode 100644
index 00000000..ea21af55
--- /dev/null
+++ b/gnulib/lib/mbsnlen.c
@@ -0,0 +1,45 @@
+/* Counting the multibyte characters in a string.
+ Copyright (C) 2007-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <stdlib.h>
+
+#include "mbiter.h"
+
+/* Return the number of multibyte characters in the character string starting
+ at STRING and ending at STRING + LEN. */
+size_t
+mbsnlen (const char *string, size_t len)
+{
+ if (MB_CUR_MAX > 1)
+ {
+ size_t count;
+ mbi_iterator_t iter;
+
+ count = 0;
+ for (mbi_init (iter, string, len); mbi_avail (iter); mbi_advance (iter))
+ count++;
+
+ return count;
+ }
+ else
+ return len;
+}
diff --git a/gnulib/lib/mbsnrtowcs.c b/gnulib/lib/mbsnrtowcs.c
new file mode 100644
index 00000000..0308b234
--- /dev/null
+++ b/gnulib/lib/mbsnrtowcs.c
@@ -0,0 +1,139 @@
+/* Convert string to wide string.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "strnlen1.h"
+
+
+extern mbstate_t _gl_mbsrtowcs_state;
+
+size_t
+mbsnrtowcs (wchar_t *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_mbsrtowcs_state;
+ {
+ const char *src = *srcp;
+
+ if (dest != NULL)
+ {
+ wchar_t *destptr = dest;
+
+ for (; srclen > 0 && len > 0; destptr++, len--)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MIN (srclen, MB_LEN_MAX)); */
+ if (srclen == 1 || src[0] == '\0')
+ src_avail = 1;
+ else if (srclen == 2 || src[1] == '\0')
+ src_avail = 2;
+ else if (srclen == 3 || src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || srclen == 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MIN (srclen, MB_LEN_MAX) - 4);
+
+ /* Parse the next multibyte character. */
+ ret = mbrtowc (destptr, src, src_avail, ps);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (ret == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ src += ret;
+ srclen -= ret;
+ }
+
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (; srclen > 0; totalcount++)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MIN (srclen, MB_LEN_MAX)); */
+ if (srclen == 1 || src[0] == '\0')
+ src_avail = 1;
+ else if (srclen == 2 || src[1] == '\0')
+ src_avail = 2;
+ else if (srclen == 3 || src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || srclen == 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MIN (srclen, MB_LEN_MAX) - 4);
+
+ /* Parse the next multibyte character. */
+ ret = mbrtowc (NULL, src, src_avail, &state);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (ret == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ src += ret;
+ srclen -= ret;
+ }
+
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
diff --git a/gnulib/lib/mbspbrk.c b/gnulib/lib/mbspbrk.c
new file mode 100644
index 00000000..25323393
--- /dev/null
+++ b/gnulib/lib/mbspbrk.c
@@ -0,0 +1,63 @@
+/* Searching a string for a character among a given set of characters.
+ Copyright (C) 1999, 2002, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the pointer to it, or NULL if none
+ exists. */
+char *
+mbspbrk (const char *string, const char *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == '\0')
+ return NULL;
+ if (accept[1] == '\0')
+ return mbschr (string, accept[0]);
+ /* General case. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ if (mb_len (mbui_cur (iter)) == 1)
+ {
+ if (mbschr (accept, * mbui_cur_ptr (iter)))
+ return (char *) mbui_cur_ptr (iter);
+ }
+ else
+ {
+ mbui_iterator_t aiter;
+
+ for (mbui_init (aiter, accept);
+ mbui_avail (aiter);
+ mbui_advance (aiter))
+ if (mb_equal (mbui_cur (aiter), mbui_cur (iter)))
+ return (char *) mbui_cur_ptr (iter);
+ }
+ }
+ return NULL;
+ }
+ else
+ return strpbrk (string, accept);
+}
diff --git a/gnulib/lib/mbspcasecmp.c b/gnulib/lib/mbspcasecmp.c
new file mode 100644
index 00000000..8975c952
--- /dev/null
+++ b/gnulib/lib/mbspcasecmp.c
@@ -0,0 +1,95 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+
+#include "mbuiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare the initial segment of the character string STRING consisting of
+ at most mbslen (PREFIX) characters with the character string PREFIX,
+ ignoring case, returning less than, equal to or greater than zero if this
+ initial segment is lexicographically less than, equal to or greater than
+ PREFIX.
+ Note: This function may, in multibyte locales, return 0 if STRING is of
+ smaller length than PREFIX! */
+char *
+mbspcasecmp (const char *string, const char *prefix)
+{
+ /* This is essentially the same as
+ mbsncasecmp (string, prefix, mbslen (prefix))
+ just with small optimizations. */
+ if (string == prefix)
+ return (char *) (string + strlen (string));
+
+ /* Be careful not to look at the entire extent of STRING or PREFIX until
+ needed. This is useful because when two strings differ, the difference is
+ most often already in the very few first characters. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter1;
+ mbui_iterator_t iter2;
+
+ mbui_init (iter1, string);
+ mbui_init (iter2, prefix);
+
+ while (mbui_avail (iter1) && mbui_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
+
+ if (cmp != 0)
+ return NULL;
+
+ mbui_advance (iter1);
+ mbui_advance (iter2);
+ }
+ if (!mbui_avail (iter2))
+ /* PREFIX equals STRING or is terminated before STRING. */
+ return (char *) mbui_cur_ptr (iter1);
+ else
+ /* STRING terminated before PREFIX. */
+ return NULL;
+ }
+ else
+ {
+ const unsigned char *p1 = (const unsigned char *) string;
+ const unsigned char *p2 = (const unsigned char *) prefix;
+ unsigned char c1, c2;
+
+ for (; ; p1++, p2++)
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (c2 == '\0' || c1 != c2)
+ break;
+ }
+
+ if (c2 == '\0')
+ /* PREFIX equals STRING or is terminated before STRING. */
+ return (char *) p1;
+ else
+ /* STRING terminated before PREFIX. */
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/mbsrchr.c b/gnulib/lib/mbsrchr.c
new file mode 100644
index 00000000..d956e22a
--- /dev/null
+++ b/gnulib/lib/mbsrchr.c
@@ -0,0 +1,49 @@
+/* Searching a string for the last occurrence of a character.
+ Copyright (C) 2007-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Locate the last single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING. */
+char *
+mbsrchr (const char *string, int c)
+{
+ if (MB_CUR_MAX > 1
+ /* Optimization: We know that ASCII characters < 0x30 don't occur as
+ part of multibyte characters longer than 1 byte. Hence, if c < 0x30,
+ the faster unibyte loop can be used. */
+ && (unsigned char) c >= 0x30)
+ {
+ const char *result = NULL;
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ if (mb_len (mbui_cur (iter)) == 1
+ && (unsigned char) * mbui_cur_ptr (iter) == (unsigned char) c)
+ result = mbui_cur_ptr (iter);
+ }
+ return (char *) result;
+ }
+ else
+ return strrchr (string, c);
+}
diff --git a/gnulib/lib/mbsrtowcs-state.c b/gnulib/lib/mbsrtowcs-state.c
new file mode 100644
index 00000000..35045f65
--- /dev/null
+++ b/gnulib/lib/mbsrtowcs-state.c
@@ -0,0 +1,37 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+/* Internal state used by the functions mbsrtowcs() and mbsnrtowcs(). */
+mbstate_t _gl_mbsrtowcs_state
+/* The state must initially be in the "initial state"; so, zero-initialize it.
+ On most systems, putting it into BSS is sufficient. Not so on MacOS X 10.3,
+ see <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>.
+ When it needs an initializer, use 0 or {0} as initializer? 0 only works
+ when mbstate_t is a scalar type (such as when gnulib defines it, or on
+ AIX, IRIX, mingw). {0} works as an initializer in all cases: for a struct
+ or union type, but also for a scalar type (ISO C 99, 6.7.8.(11)). */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ /* Use braces, to be on the safe side. */
+ = { 0 }
+#endif
+ ;
diff --git a/gnulib/lib/mbsrtowcs.c b/gnulib/lib/mbsrtowcs.c
new file mode 100644
index 00000000..c577f36f
--- /dev/null
+++ b/gnulib/lib/mbsrtowcs.c
@@ -0,0 +1,136 @@
+/* Convert string to wide string.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "strnlen1.h"
+
+
+extern mbstate_t _gl_mbsrtowcs_state;
+
+size_t
+mbsrtowcs (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_mbsrtowcs_state;
+ {
+ const char *src = *srcp;
+
+ if (dest != NULL)
+ {
+ wchar_t *destptr = dest;
+
+ for (; len > 0; destptr++, len--)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MB_LEN_MAX); */
+ if (src[0] == '\0')
+ src_avail = 1;
+ else if (src[1] == '\0')
+ src_avail = 2;
+ else if (src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
+
+ /* Parse the next multibyte character. */
+ ret = mbrtowc (destptr, src, src_avail, ps);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (ret == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ src += ret;
+ }
+
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (;; totalcount++)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MB_LEN_MAX); */
+ if (src[0] == '\0')
+ src_avail = 1;
+ else if (src[1] == '\0')
+ src_avail = 2;
+ else if (src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
+
+ /* Parse the next multibyte character. */
+ ret = mbrtowc (NULL, src, src_avail, &state);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (ret == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ src += ret;
+ }
+
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
diff --git a/gnulib/lib/mbssep.c b/gnulib/lib/mbssep.c
new file mode 100644
index 00000000..a26e363e
--- /dev/null
+++ b/gnulib/lib/mbssep.c
@@ -0,0 +1,61 @@
+/* Tokenizing a string.
+ Copyright (C) 2007-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+char *
+mbssep (char **stringp, const char *delim)
+{
+ if (MB_CUR_MAX > 1)
+ {
+ char *start = *stringp;
+ char *ptr;
+
+ if (start == NULL)
+ return NULL;
+
+ /* No need to optimize the cases of 0 or 1 delimiters specially,
+ since mbspbrk already optimizes them. */
+
+ ptr = mbspbrk (start, delim);
+
+ if (ptr == NULL)
+ {
+ *stringp = NULL;
+ return start;
+ }
+ else
+ {
+ mbui_iterator_t iter;
+
+ mbui_init (iter, ptr);
+ if (!mbui_avail (iter))
+ abort ();
+ mbui_advance (iter);
+ *ptr = '\0';
+ *stringp = (char *) mbui_cur_ptr (iter);
+ return start;
+ }
+ }
+ else
+ return strsep (stringp, delim);
+}
diff --git a/gnulib/lib/mbsspn.c b/gnulib/lib/mbsspn.c
new file mode 100644
index 00000000..07f07806
--- /dev/null
+++ b/gnulib/lib/mbsspn.c
@@ -0,0 +1,89 @@
+/* Searching a string for a character outside a given set of characters.
+ Copyright (C) 1999, 2002, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Find the first occurrence in the character string STRING of any character
+ not in the character string REJECT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists. */
+size_t
+mbsspn (const char *string, const char *reject)
+{
+ /* Optimize two cases. */
+ if (reject[0] == '\0')
+ return 0;
+ if (reject[1] == '\0')
+ {
+ unsigned char uc = (unsigned char) reject[0];
+
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ if (!(mb_len (mbui_cur (iter)) == 1
+ && (unsigned char) * mbui_cur_ptr (iter) == uc))
+ break;
+ return mbui_cur_ptr (iter) - string;
+ }
+ else
+ {
+ const char *ptr;
+
+ for (ptr = string; *ptr != '\0'; ptr++)
+ if ((unsigned char) *ptr != uc)
+ break;
+ return ptr - string;
+ }
+ }
+ /* General case. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ if (mb_len (mbui_cur (iter)) == 1)
+ {
+ if (mbschr (reject, * mbui_cur_ptr (iter)) == NULL)
+ goto found;
+ }
+ else
+ {
+ mbui_iterator_t aiter;
+
+ for (mbui_init (aiter, reject);; mbui_advance (aiter))
+ {
+ if (!mbui_avail (aiter))
+ goto found;
+ if (mb_equal (mbui_cur (aiter), mbui_cur (iter)))
+ break;
+ }
+ }
+ }
+ found:
+ return mbui_cur_ptr (iter) - string;
+ }
+ else
+ return strspn (string, reject);
+}
diff --git a/gnulib/lib/mbsstr.c b/gnulib/lib/mbsstr.c
new file mode 100644
index 00000000..d44b4c3d
--- /dev/null
+++ b/gnulib/lib/mbsstr.c
@@ -0,0 +1,379 @@
+/* Searching in a string.
+ Copyright (C) 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <stdbool.h>
+#include <stddef.h> /* for NULL, in case a nonstandard string.h lacks it */
+
+#include "malloca.h"
+#include "mbuiter.h"
+
+/* Knuth-Morris-Pratt algorithm. */
+#define CANON_ELEMENT(c) c
+#include "str-kmp.h"
+
+/* Knuth-Morris-Pratt algorithm.
+ See http://en.wikipedia.org/wiki/Knuth-Morris-Pratt_algorithm
+ Return a boolean indicating success:
+ Return true and set *RESULTP if the search was completed.
+ Return false if it was aborted because not enough memory was available. */
+static bool
+knuth_morris_pratt_multibyte (const char *haystack, const char *needle,
+ const char **resultp)
+{
+ size_t m = mbslen (needle);
+ mbchar_t *needle_mbchars;
+ size_t *table;
+
+ /* Allocate room for needle_mbchars and the table. */
+ char *memory = (char *) nmalloca (m, sizeof (mbchar_t) + sizeof (size_t));
+ if (memory == NULL)
+ return false;
+ needle_mbchars = (mbchar_t *) memory;
+ table = (size_t *) (memory + m * sizeof (mbchar_t));
+
+ /* Fill needle_mbchars. */
+ {
+ mbui_iterator_t iter;
+ size_t j;
+
+ j = 0;
+ for (mbui_init (iter, needle); mbui_avail (iter); mbui_advance (iter), j++)
+ mb_copy (&needle_mbchars[j], &mbui_cur (iter));
+ }
+
+ /* Fill the table.
+ For 0 < i < m:
+ 0 < table[i] <= i is defined such that
+ forall 0 < x < table[i]: needle[x..i-1] != needle[0..i-1-x],
+ and table[i] is as large as possible with this property.
+ This implies:
+ 1) For 0 < i < m:
+ If table[i] < i,
+ needle[table[i]..i-1] = needle[0..i-1-table[i]].
+ 2) For 0 < i < m:
+ rhaystack[0..i-1] == needle[0..i-1]
+ and exists h, i <= h < m: rhaystack[h] != needle[h]
+ implies
+ forall 0 <= x < table[i]: rhaystack[x..x+m-1] != needle[0..m-1].
+ table[0] remains uninitialized. */
+ {
+ size_t i, j;
+
+ /* i = 1: Nothing to verify for x = 0. */
+ table[1] = 1;
+ j = 0;
+
+ for (i = 2; i < m; i++)
+ {
+ /* Here: j = i-1 - table[i-1].
+ The inequality needle[x..i-1] != needle[0..i-1-x] is known to hold
+ for x < table[i-1], by induction.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ mbchar_t *b = &needle_mbchars[i - 1];
+
+ for (;;)
+ {
+ /* Invariants: The inequality needle[x..i-1] != needle[0..i-1-x]
+ is known to hold for x < i-1-j.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ if (mb_equal (*b, needle_mbchars[j]))
+ {
+ /* Set table[i] := i-1-j. */
+ table[i] = i - ++j;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for x = i-1-j, because
+ needle[i-1] != needle[j] = needle[i-1-x]. */
+ if (j == 0)
+ {
+ /* The inequality holds for all possible x. */
+ table[i] = i;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for i-1-j < x < i-1-j+table[j], because for these x:
+ needle[x..i-2]
+ = needle[x-(i-1-j)..j-1]
+ != needle[0..j-1-(x-(i-1-j))] (by definition of table[j])
+ = needle[0..i-2-x],
+ hence needle[x..i-1] != needle[0..i-1-x].
+ Furthermore
+ needle[i-1-j+table[j]..i-2]
+ = needle[table[j]..j-1]
+ = needle[0..j-1-table[j]] (by definition of table[j]). */
+ j = j - table[j];
+ }
+ /* Here: j = i - table[i]. */
+ }
+ }
+
+ /* Search, using the table to accelerate the processing. */
+ {
+ size_t j;
+ mbui_iterator_t rhaystack;
+ mbui_iterator_t phaystack;
+
+ *resultp = NULL;
+ j = 0;
+ mbui_init (rhaystack, haystack);
+ mbui_init (phaystack, haystack);
+ /* Invariant: phaystack = rhaystack + j. */
+ while (mbui_avail (phaystack))
+ if (mb_equal (needle_mbchars[j], mbui_cur (phaystack)))
+ {
+ j++;
+ mbui_advance (phaystack);
+ if (j == m)
+ {
+ /* The entire needle has been found. */
+ *resultp = mbui_cur_ptr (rhaystack);
+ break;
+ }
+ }
+ else if (j > 0)
+ {
+ /* Found a match of needle[0..j-1], mismatch at needle[j]. */
+ size_t count = table[j];
+ j -= count;
+ for (; count > 0; count--)
+ {
+ if (!mbui_avail (rhaystack))
+ abort ();
+ mbui_advance (rhaystack);
+ }
+ }
+ else
+ {
+ /* Found a mismatch at needle[0] already. */
+ if (!mbui_avail (rhaystack))
+ abort ();
+ mbui_advance (rhaystack);
+ mbui_advance (phaystack);
+ }
+ }
+
+ freea (memory);
+ return true;
+}
+
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK. */
+char *
+mbsstr (const char *haystack, const char *needle)
+{
+ /* Be careful not to look at the entire extent of haystack or needle
+ until needed. This is useful because of these two cases:
+ - haystack may be very long, and a match of needle found early,
+ - needle may be very long, and not even a short initial segment of
+ needle may be found in haystack. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter_needle;
+
+ mbui_init (iter_needle, needle);
+ if (mbui_avail (iter_needle))
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = mbslen(haystack), m = mbslen(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ mbui_iterator_t iter_needle_last_ccount; /* = needle + last_ccount */
+
+ mbui_iterator_t iter_haystack;
+
+ mbui_init (iter_needle_last_ccount, needle);
+ mbui_init (iter_haystack, haystack);
+ for (;; mbui_advance (iter_haystack))
+ {
+ if (!mbui_avail (iter_haystack))
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ size_t count = comparison_count - last_ccount;
+ for (;
+ count > 0 && mbui_avail (iter_needle_last_ccount);
+ count--)
+ mbui_advance (iter_needle_last_ccount);
+ last_ccount = comparison_count;
+ if (!mbui_avail (iter_needle_last_ccount))
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const char *result;
+ bool success =
+ knuth_morris_pratt_multibyte (haystack, needle,
+ &result);
+ if (success)
+ return (char *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ if (mb_equal (mbui_cur (iter_haystack), mbui_cur (iter_needle)))
+ /* The first character matches. */
+ {
+ mbui_iterator_t rhaystack;
+ mbui_iterator_t rneedle;
+
+ memcpy (&rhaystack, &iter_haystack, sizeof (mbui_iterator_t));
+ mbui_advance (rhaystack);
+
+ mbui_init (rneedle, needle);
+ if (!mbui_avail (rneedle))
+ abort ();
+ mbui_advance (rneedle);
+
+ for (;; mbui_advance (rhaystack), mbui_advance (rneedle))
+ {
+ if (!mbui_avail (rneedle))
+ /* Found a match. */
+ return (char *) mbui_cur_ptr (iter_haystack);
+ if (!mbui_avail (rhaystack))
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (!mb_equal (mbui_cur (rhaystack), mbui_cur (rneedle)))
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+ else
+ return (char *) haystack;
+ }
+ else
+ {
+ if (*needle != '\0')
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = strlen(haystack), m = strlen(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ const char *needle_last_ccount = needle; /* = needle + last_ccount */
+
+ /* Speed up the following searches of needle by caching its first
+ character. */
+ char b = *needle++;
+
+ for (;; haystack++)
+ {
+ if (*haystack == '\0')
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ if (needle_last_ccount != NULL)
+ {
+ needle_last_ccount +=
+ strnlen (needle_last_ccount,
+ comparison_count - last_ccount);
+ if (*needle_last_ccount == '\0')
+ needle_last_ccount = NULL;
+ last_ccount = comparison_count;
+ }
+ if (needle_last_ccount == NULL)
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const char *result;
+ bool success =
+ knuth_morris_pratt_unibyte (haystack, needle - 1,
+ &result);
+ if (success)
+ return (char *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ if (*haystack == b)
+ /* The first character matches. */
+ {
+ const char *rhaystack = haystack + 1;
+ const char *rneedle = needle;
+
+ for (;; rhaystack++, rneedle++)
+ {
+ if (*rneedle == '\0')
+ /* Found a match. */
+ return (char *) haystack;
+ if (*rhaystack == '\0')
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (*rhaystack != *rneedle)
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+ else
+ return (char *) haystack;
+ }
+}
diff --git a/gnulib/lib/mbstok_r.c b/gnulib/lib/mbstok_r.c
new file mode 100644
index 00000000..7d7be022
--- /dev/null
+++ b/gnulib/lib/mbstok_r.c
@@ -0,0 +1,66 @@
+/* Tokenizing a string.
+ Copyright (C) 1999, 2002, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+char *
+mbstok_r (char *string, const char *delim, char **save_ptr)
+{
+ if (MB_CUR_MAX > 1)
+ {
+ if (string == NULL)
+ {
+ string = *save_ptr;
+ if (string == NULL)
+ return NULL; /* reminder that end of token sequence has been
+ reached */
+ }
+
+ /* Skip leading delimiters. */
+ string += mbsspn (string, delim);
+
+ /* Found a token? */
+ if (*string == '\0')
+ {
+ *save_ptr = NULL;
+ return NULL;
+ }
+
+ /* Move past the token. */
+ {
+ char *token_end = mbspbrk (string, delim);
+
+ if (token_end != NULL)
+ {
+ /* NUL-terminate the token. */
+ *token_end = '\0';
+ *save_ptr = token_end + 1;
+ }
+ else
+ *save_ptr = NULL;
+ }
+
+ return string;
+ }
+ else
+ return strtok_r (string, delim, save_ptr);
+}
diff --git a/gnulib/lib/mbswidth.c b/gnulib/lib/mbswidth.c
new file mode 100644
index 00000000..caf0c4d1
--- /dev/null
+++ b/gnulib/lib/mbswidth.c
@@ -0,0 +1,167 @@
+/* Determine the number of screen columns needed for a string.
+ Copyright (C) 2000-2010 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/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "mbswidth.h"
+
+/* Get MB_CUR_MAX. */
+#include <stdlib.h>
+
+#include <string.h>
+
+/* Get isprint(). */
+#include <ctype.h>
+
+/* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */
+#include <wchar.h>
+
+/* Get iswcntrl(). */
+#include <wctype.h>
+
+/* Returns the number of columns needed to represent the multibyte
+ character string pointed to by STRING. If a non-printable character
+ occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned.
+ With flags = MBSW_REJECT_INVALID | MBSW_REJECT_UNPRINTABLE, this is
+ the multibyte analogue of the wcswidth function.
+ If STRING is not of length < INT_MAX / 2, integer overflow can occur. */
+int
+mbswidth (const char *string, int flags)
+{
+ return mbsnwidth (string, strlen (string), flags);
+}
+
+/* Returns the number of columns needed to represent the multibyte
+ character string pointed to by STRING of length NBYTES. If a
+ non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is
+ specified, -1 is returned.
+ If NBYTES is not < INT_MAX / 2, integer overflow can occur. */
+int
+mbsnwidth (const char *string, size_t nbytes, int flags)
+{
+ const char *p = string;
+ const char *plimit = p + nbytes;
+ int width;
+
+ width = 0;
+ if (MB_CUR_MAX > 1)
+ {
+ while (p < plimit)
+ switch (*p)
+ {
+ case ' ': case '!': case '"': case '#': case '%':
+ case '&': case '\'': case '(': case ')': case '*':
+ case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>':
+ case '?':
+ case 'A': case 'B': case 'C': case 'D': case 'E':
+ case 'F': case 'G': case 'H': case 'I': case 'J':
+ case 'K': case 'L': case 'M': case 'N': case 'O':
+ case 'P': case 'Q': case 'R': case 'S': case 'T':
+ case 'U': case 'V': case 'W': case 'X': case 'Y':
+ case 'Z':
+ case '[': case '\\': case ']': case '^': case '_':
+ case 'a': case 'b': case 'c': case 'd': case 'e':
+ case 'f': case 'g': case 'h': case 'i': case 'j':
+ case 'k': case 'l': case 'm': case 'n': case 'o':
+ case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y':
+ case 'z': case '{': case '|': case '}': case '~':
+ /* These characters are printable ASCII characters. */
+ p++;
+ width++;
+ break;
+ default:
+ /* If we have a multibyte sequence, scan it up to its end. */
+ {
+ mbstate_t mbstate;
+ memset (&mbstate, 0, sizeof mbstate);
+ do
+ {
+ wchar_t wc;
+ size_t bytes;
+ int w;
+
+ bytes = mbrtowc (&wc, p, plimit - p, &mbstate);
+
+ if (bytes == (size_t) -1)
+ /* An invalid multibyte sequence was encountered. */
+ {
+ if (!(flags & MBSW_REJECT_INVALID))
+ {
+ p++;
+ width++;
+ break;
+ }
+ else
+ return -1;
+ }
+
+ if (bytes == (size_t) -2)
+ /* An incomplete multibyte character at the end. */
+ {
+ if (!(flags & MBSW_REJECT_INVALID))
+ {
+ p = plimit;
+ width++;
+ break;
+ }
+ else
+ return -1;
+ }
+
+ if (bytes == 0)
+ /* A null wide character was encountered. */
+ bytes = 1;
+
+ w = wcwidth (wc);
+ if (w >= 0)
+ /* A printable multibyte character. */
+ width += w;
+ else
+ /* An unprintable multibyte character. */
+ if (!(flags & MBSW_REJECT_UNPRINTABLE))
+ width += (iswcntrl (wc) ? 0 : 1);
+ else
+ return -1;
+
+ p += bytes;
+ }
+ while (! mbsinit (&mbstate));
+ }
+ break;
+ }
+ return width;
+ }
+
+ while (p < plimit)
+ {
+ unsigned char c = (unsigned char) *p++;
+
+ if (isprint (c))
+ width++;
+ else if (!(flags & MBSW_REJECT_UNPRINTABLE))
+ width += (iscntrl (c) ? 0 : 1);
+ else
+ return -1;
+ }
+ return width;
+}
diff --git a/gnulib/lib/mbswidth.h b/gnulib/lib/mbswidth.h
new file mode 100644
index 00000000..0383b232
--- /dev/null
+++ b/gnulib/lib/mbswidth.h
@@ -0,0 +1,60 @@
+/* Determine the number of screen columns needed for a string.
+ Copyright (C) 2000-2004, 2007, 2009-2010 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/>. */
+
+#include <stddef.h>
+
+/* Avoid a clash of our mbswidth() with a function of the same name defined
+ in UnixWare 7.1.1 <wchar.h>. We need this #include before the #define
+ below.
+ However, we don't want to #include <wchar.h> on all platforms because
+ - Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ - BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#if HAVE_DECL_MBSWIDTH_IN_WCHAR_H
+# include <wchar.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Optional flags to influence mbswidth/mbsnwidth behavior. */
+
+/* If this bit is set, return -1 upon finding an invalid or incomplete
+ character. Otherwise, assume invalid characters have width 1. */
+#define MBSW_REJECT_INVALID 1
+
+/* If this bit is set, return -1 upon finding a non-printable character.
+ Otherwise, assume unprintable characters have width 0 if they are
+ control characters and 1 otherwise. */
+#define MBSW_REJECT_UNPRINTABLE 2
+
+
+/* Returns the number of screen columns needed for STRING. */
+#define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */
+extern int mbswidth (const char *string, int flags);
+
+/* Returns the number of screen columns needed for the NBYTES bytes
+ starting at BUF. */
+extern int mbsnwidth (const char *buf, size_t nbytes, int flags);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/mbuiter.h b/gnulib/lib/mbuiter.h
new file mode 100644
index 00000000..3015c4ef
--- /dev/null
+++ b/gnulib/lib/mbuiter.h
@@ -0,0 +1,222 @@
+/* Iterating through multibyte strings: macros for multi-byte encodings.
+ Copyright (C) 2001, 2005, 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* The macros in this file implement forward iteration through a
+ multi-byte string, without knowing its length a-priori.
+
+ With these macros, an iteration loop that looks like
+
+ char *iter;
+ for (iter = buf; *iter != '\0'; iter++)
+ {
+ do_something (*iter);
+ }
+
+ becomes
+
+ mbui_iterator_t iter;
+ for (mbui_init (iter, buf); mbui_avail (iter); mbui_advance (iter))
+ {
+ do_something (mbui_cur_ptr (iter), mb_len (mbui_cur (iter)));
+ }
+
+ The benefit of these macros over plain use of mbrtowc is:
+ - Handling of invalid multibyte sequences is possible without
+ making the code more complicated, while still preserving the
+ invalid multibyte sequences.
+
+ Compared to mbiter.h, the macros here don't need to know the string's
+ length a-priori. The downside is that at each step, the look-ahead
+ that guards against overrunning the terminating '\0' is more expensive.
+ The mbui_* macros are therefore suitable when there is a high probability
+ that only the first few multibyte characters need to be inspected.
+ Whereas the mbi_* macros are better if usually the iteration runs
+ through the entire string.
+
+ mbui_iterator_t
+ is a type usable for variable declarations.
+
+ mbui_init (iter, startptr)
+ initializes the iterator, starting at startptr.
+
+ mbui_avail (iter)
+ returns true if there are more multibyte chracters available before
+ the end of string is reached. In this case, mbui_cur (iter) is
+ initialized to the next multibyte chracter.
+
+ mbui_advance (iter)
+ advances the iterator by one multibyte character.
+
+ mbui_cur (iter)
+ returns the current multibyte character, of type mbchar_t. All the
+ macros defined in mbchar.h can be used on it.
+
+ mbui_cur_ptr (iter)
+ return a pointer to the beginning of the current multibyte character.
+
+ mbui_reloc (iter, ptrdiff)
+ relocates iterator when the string is moved by ptrdiff bytes.
+
+ mbui_copy (&destiter, &srciter)
+ copies srciter to destiter.
+
+ Here are the function prototypes of the macros.
+
+ extern void mbui_init (mbui_iterator_t iter, const char *startptr);
+ extern bool mbui_avail (mbui_iterator_t iter);
+ extern void mbui_advance (mbui_iterator_t iter);
+ extern mbchar_t mbui_cur (mbui_iterator_t iter);
+ extern const char * mbui_cur_ptr (mbui_iterator_t iter);
+ extern void mbui_reloc (mbui_iterator_t iter, ptrdiff_t ptrdiff);
+ extern void mbui_copy (mbui_iterator_t *new, const mbui_iterator_t *old);
+ */
+
+#ifndef _MBUITER_H
+#define _MBUITER_H 1
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+
+#include "mbchar.h"
+#include "strnlen1.h"
+
+struct mbuiter_multi
+{
+ bool in_shift; /* true if next byte may not be interpreted as ASCII */
+ mbstate_t state; /* if in_shift: current shift state */
+ bool next_done; /* true if mbui_avail has already filled the following */
+ struct mbchar cur; /* the current character:
+ const char *cur.ptr pointer to current character
+ The following are only valid after mbui_avail.
+ size_t cur.bytes number of bytes of current character
+ bool cur.wc_valid true if wc is a valid wide character
+ wchar_t cur.wc if wc_valid: the current character
+ */
+};
+
+static inline void
+mbuiter_multi_next (struct mbuiter_multi *iter)
+{
+ if (iter->next_done)
+ return;
+ if (iter->in_shift)
+ goto with_shift;
+ /* Handle most ASCII characters quickly, without calling mbrtowc(). */
+ if (is_basic (*iter->cur.ptr))
+ {
+ /* These characters are part of the basic character set. ISO C 99
+ guarantees that their wide character code is identical to their
+ char code. */
+ iter->cur.bytes = 1;
+ iter->cur.wc = *iter->cur.ptr;
+ iter->cur.wc_valid = true;
+ }
+ else
+ {
+ assert (mbsinit (&iter->state));
+ iter->in_shift = true;
+ with_shift:
+ iter->cur.bytes = mbrtowc (&iter->cur.wc, iter->cur.ptr,
+ strnlen1 (iter->cur.ptr, MB_CUR_MAX),
+ &iter->state);
+ if (iter->cur.bytes == (size_t) -1)
+ {
+ /* An invalid multibyte sequence was encountered. */
+ iter->cur.bytes = 1;
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not very important; the string is bogus anyway. */
+ }
+ else if (iter->cur.bytes == (size_t) -2)
+ {
+ /* An incomplete multibyte character at the end. */
+ iter->cur.bytes = strlen (iter->cur.ptr);
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not important; the string end is reached anyway. */
+ }
+ else
+ {
+ if (iter->cur.bytes == 0)
+ {
+ /* A null wide character was encountered. */
+ iter->cur.bytes = 1;
+ assert (*iter->cur.ptr == '\0');
+ assert (iter->cur.wc == 0);
+ }
+ iter->cur.wc_valid = true;
+
+ /* When in the initial state, we can go back treating ASCII
+ characters more quickly. */
+ if (mbsinit (&iter->state))
+ iter->in_shift = false;
+ }
+ }
+ iter->next_done = true;
+}
+
+static inline void
+mbuiter_multi_reloc (struct mbuiter_multi *iter, ptrdiff_t ptrdiff)
+{
+ iter->cur.ptr += ptrdiff;
+}
+
+static inline void
+mbuiter_multi_copy (struct mbuiter_multi *new_iter, const struct mbuiter_multi *old_iter)
+{
+ if ((new_iter->in_shift = old_iter->in_shift))
+ memcpy (&new_iter->state, &old_iter->state, sizeof (mbstate_t));
+ else
+ memset (&new_iter->state, 0, sizeof (mbstate_t));
+ new_iter->next_done = old_iter->next_done;
+ mb_copy (&new_iter->cur, &old_iter->cur);
+}
+
+/* Iteration macros. */
+typedef struct mbuiter_multi mbui_iterator_t;
+#define mbui_init(iter, startptr) \
+ ((iter).cur.ptr = (startptr), \
+ (iter).in_shift = false, memset (&(iter).state, '\0', sizeof (mbstate_t)), \
+ (iter).next_done = false)
+#define mbui_avail(iter) \
+ (mbuiter_multi_next (&(iter)), !mb_isnul ((iter).cur))
+#define mbui_advance(iter) \
+ ((iter).cur.ptr += (iter).cur.bytes, (iter).next_done = false)
+
+/* Access to the current character. */
+#define mbui_cur(iter) (iter).cur
+#define mbui_cur_ptr(iter) (iter).cur.ptr
+
+/* Relocation. */
+#define mbui_reloc(iter, ptrdiff) mbuiter_multi_reloc (&iter, ptrdiff)
+
+/* Copying an iterator. */
+#define mbui_copy mbuiter_multi_copy
+
+#endif /* _MBUITER_H */
diff --git a/gnulib/lib/md2.c b/gnulib/lib/md2.c
new file mode 100644
index 00000000..62654f84
--- /dev/null
+++ b/gnulib/lib/md2.c
@@ -0,0 +1,275 @@
+/* Functions to compute MD2 message digest of files or memory blocks.
+ according to the definition of MD2 in RFC 1319 from April 1992.
+ Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
+ 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Adapted by Simon Josefsson from public domain Libtomcrypt 1.06 by
+ Tom St Denis. */
+
+#include <config.h>
+
+#include "md2.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <minmax.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+static void md2_update_chksum (struct md2_ctx *md);
+static void md2_compress (struct md2_ctx *md);
+
+/* Initialize structure containing state of computation.
+ (RFC 1319, 3.3: Step 3) */
+void
+md2_init_ctx (struct md2_ctx *ctx)
+{
+ memset (ctx->X, 0, sizeof (ctx->X));
+ memset (ctx->chksum, 0, sizeof (ctx->chksum));
+ memset (ctx->buf, 0, sizeof (ctx->buf));
+ ctx->curlen = 0;
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md2_read_ctx (const struct md2_ctx *ctx, void *resbuf)
+{
+ memcpy (resbuf, ctx->X, 16);
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md2_finish_ctx (struct md2_ctx *ctx, void *resbuf)
+{
+ unsigned long i, k;
+
+ /* pad the message */
+ k = 16 - ctx->curlen;
+ for (i = ctx->curlen; i < 16; i++)
+ {
+ ctx->buf[i] = (unsigned char) k;
+ }
+
+ /* hash and update */
+ md2_compress (ctx);
+ md2_update_chksum (ctx);
+
+ /* hash checksum */
+ memcpy (ctx->buf, ctx->chksum, 16);
+ md2_compress (ctx);
+
+ return md2_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD2 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md2_stream (FILE *stream, void *resblock)
+{
+ struct md2_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ md2_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md2_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md2_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md2_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md2_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md2_ctx ctx;
+
+ /* Initialize the computation context. */
+ md2_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md2_process_block (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md2_finish_ctx (&ctx, resblock);
+}
+
+void
+md2_process_bytes (const void *buffer, size_t len, struct md2_ctx *ctx)
+{
+ const char *in = buffer;
+ unsigned long n;
+
+ while (len > 0)
+ {
+ n = MIN (len, (16 - ctx->curlen));
+ memcpy (ctx->buf + ctx->curlen, in, (size_t) n);
+ ctx->curlen += n;
+ in += n;
+ len -= n;
+
+ /* is 16 bytes full? */
+ if (ctx->curlen == 16)
+ {
+ md2_compress (ctx);
+ md2_update_chksum (ctx);
+ ctx->curlen = 0;
+ }
+ }
+}
+
+static const unsigned char PI_SUBST[256] = {
+ 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
+ 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
+ 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
+ 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
+ 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
+ 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
+ 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
+ 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
+ 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
+ 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
+ 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
+ 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
+ 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
+ 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
+ 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
+ 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
+ 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
+ 31, 26, 219, 153, 141, 51, 159, 17, 131, 20
+};
+
+/* adds 16 bytes to the checksum */
+static void
+md2_update_chksum (struct md2_ctx *ctx)
+{
+ int j;
+ unsigned char L;
+
+ L = ctx->chksum[15];
+ for (j = 0; j < 16; j++)
+ {
+ /* caution, the RFC says its "C[j] = S[M[i*16+j] xor L]" but the
+ reference source code [and test vectors] say otherwise. */
+ L = (ctx->chksum[j] ^= PI_SUBST[(int) (ctx->buf[j] ^ L)] & 255);
+ }
+}
+
+static void
+md2_compress (struct md2_ctx *ctx)
+{
+ size_t j, k;
+ unsigned char t;
+
+ /* copy block */
+ for (j = 0; j < 16; j++)
+ {
+ ctx->X[16 + j] = ctx->buf[j];
+ ctx->X[32 + j] = ctx->X[j] ^ ctx->X[16 + j];
+ }
+
+ t = (unsigned char) 0;
+
+ /* do 18 rounds */
+ for (j = 0; j < 18; j++)
+ {
+ for (k = 0; k < 48; k++)
+ {
+ t = (ctx->X[k] ^= PI_SUBST[(int) (t & 255)]);
+ }
+ t = (t + (unsigned char) j) & 255;
+ }
+}
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX. */
+void
+md2_process_block (const void *buffer, size_t len, struct md2_ctx *ctx)
+{
+ md2_process_bytes (buffer, len, ctx);
+}
diff --git a/gnulib/lib/md2.h b/gnulib/lib/md2.h
new file mode 100644
index 00000000..2476bdae
--- /dev/null
+++ b/gnulib/lib/md2.h
@@ -0,0 +1,85 @@
+/* Declarations of functions and data types used for MD2 sum
+ library functions.
+ Copyright (C) 2000, 2001, 2003, 2005, 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef MD2_H
+# define MD2_H 1
+
+# include <stdio.h>
+# include <stddef.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define MD2_DIGEST_SIZE 16
+
+/* Structure to save state of computation between the single steps. */
+struct md2_ctx
+{
+ unsigned char chksum[16], X[48], buf[16];
+ size_t curlen;
+};
+
+
+/* Initialize structure containing state of computation. */
+extern void md2_init_ctx (struct md2_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md2_process_block (const void *buffer, size_t len,
+ struct md2_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md2_process_bytes (const void *buffer, size_t len,
+ struct md2_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *md2_finish_ctx (struct md2_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *md2_read_ctx (const struct md2_ctx *ctx, void *resbuf);
+
+
+/* Compute MD2 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int md2_stream (FILE *stream, void *resblock);
+
+/* Compute MD2 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *md2_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/md4.c b/gnulib/lib/md4.c
new file mode 100644
index 00000000..ff39c681
--- /dev/null
+++ b/gnulib/lib/md4.c
@@ -0,0 +1,390 @@
+/* Functions to compute MD4 message digest of files or memory blocks.
+ according to the definition of MD4 in RFC 1320 from April 1992.
+ Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
+ 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt
+ cipher/md4.c . */
+
+#include <config.h>
+
+#include "md4.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#else
+# define SWAP(n) (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1320, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1320, 3.3: Step 3) */
+void
+md4_init_ctx (struct md4_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static inline void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md4_read_ctx (const struct md4_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md4_finish_ctx (struct md4_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t pad;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
+ memcpy (&((char*)ctx->buffer)[bytes], fillbuf, pad);
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[(bytes + pad) / 4] = SWAP (ctx->total[0] << 3);
+ ctx->buffer[(bytes + pad) / 4 + 1] = SWAP ((ctx->total[1] << 3) |
+ (ctx->total[0] >> 29));
+
+ /* Process last bytes. */
+ md4_process_block (ctx->buffer, bytes + pad + 8, ctx);
+
+ return md4_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD4 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md4_stream (FILE * stream, void *resblock)
+{
+ struct md4_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ md4_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md4_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md4_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md4_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute MD4 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md4_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md4_ctx ctx;
+
+ /* Initialize the computation context. */
+ md4_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md4_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md4_finish_ctx (&ctx, resblock);
+}
+
+void
+md4_process_bytes (const void *buffer, size_t len, struct md4_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char*)ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ md4_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer, &((char*)ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+ /* To check alignment gcc has an appropriate operator. Other
+ compilers don't. */
+# if __GNUC__ >= 2
+# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0)
+# else
+# define alignof(type) offsetof (struct { char c; type x; }, x)
+# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
+# endif
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ md4_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ md4_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char*)ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ md4_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between md5.c and md4.c --- */
+
+/* MD4 round constants */
+#define K1 0x5a827999
+#define K2 0x6ed9eba1
+
+/* Round functions. */
+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n))))
+#define R1(a,b,c,d,k,s) a=rol(a+F(b,c,d)+x[k],s);
+#define R2(a,b,c,d,k,s) a=rol(a+G(b,c,d)+x[k]+K1,s);
+#define R3(a,b,c,d,k,s) a=rol(a+H(b,c,d)+x[k]+K2,s);
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md4_process_block (const void *buffer, size_t len, struct md4_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+
+ /* First increment the byte count. RFC 1320 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ int t;
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ /* Round 1. */
+ R1 (A, B, C, D, 0, 3);
+ R1 (D, A, B, C, 1, 7);
+ R1 (C, D, A, B, 2, 11);
+ R1 (B, C, D, A, 3, 19);
+ R1 (A, B, C, D, 4, 3);
+ R1 (D, A, B, C, 5, 7);
+ R1 (C, D, A, B, 6, 11);
+ R1 (B, C, D, A, 7, 19);
+ R1 (A, B, C, D, 8, 3);
+ R1 (D, A, B, C, 9, 7);
+ R1 (C, D, A, B, 10, 11);
+ R1 (B, C, D, A, 11, 19);
+ R1 (A, B, C, D, 12, 3);
+ R1 (D, A, B, C, 13, 7);
+ R1 (C, D, A, B, 14, 11);
+ R1 (B, C, D, A, 15, 19);
+
+ /* Round 2. */
+ R2 (A, B, C, D, 0, 3);
+ R2 (D, A, B, C, 4, 5);
+ R2 (C, D, A, B, 8, 9);
+ R2 (B, C, D, A, 12, 13);
+ R2 (A, B, C, D, 1, 3);
+ R2 (D, A, B, C, 5, 5);
+ R2 (C, D, A, B, 9, 9);
+ R2 (B, C, D, A, 13, 13);
+ R2 (A, B, C, D, 2, 3);
+ R2 (D, A, B, C, 6, 5);
+ R2 (C, D, A, B, 10, 9);
+ R2 (B, C, D, A, 14, 13);
+ R2 (A, B, C, D, 3, 3);
+ R2 (D, A, B, C, 7, 5);
+ R2 (C, D, A, B, 11, 9);
+ R2 (B, C, D, A, 15, 13);
+
+ /* Round 3. */
+ R3 (A, B, C, D, 0, 3);
+ R3 (D, A, B, C, 8, 9);
+ R3 (C, D, A, B, 4, 11);
+ R3 (B, C, D, A, 12, 15);
+ R3 (A, B, C, D, 2, 3);
+ R3 (D, A, B, C, 10, 9);
+ R3 (C, D, A, B, 6, 11);
+ R3 (B, C, D, A, 14, 15);
+ R3 (A, B, C, D, 1, 3);
+ R3 (D, A, B, C, 9, 9);
+ R3 (C, D, A, B, 5, 11);
+ R3 (B, C, D, A, 13, 15);
+ R3 (A, B, C, D, 3, 3);
+ R3 (D, A, B, C, 11, 9);
+ R3 (C, D, A, B, 7, 11);
+ R3 (B, C, D, A, 15, 15);
+
+ A = ctx->A += A;
+ B = ctx->B += B;
+ C = ctx->C += C;
+ D = ctx->D += D;
+ }
+}
diff --git a/gnulib/lib/md4.h b/gnulib/lib/md4.h
new file mode 100644
index 00000000..e0d82965
--- /dev/null
+++ b/gnulib/lib/md4.h
@@ -0,0 +1,91 @@
+/* Declarations of functions and data types used for MD4 sum
+ library functions.
+ Copyright (C) 2000, 2001, 2003, 2005, 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef MD4_H
+# define MD4_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define MD4_DIGEST_SIZE 16
+
+/* Structure to save state of computation between the single steps. */
+struct md4_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+
+ uint32_t total[2];
+ uint32_t buflen;
+ uint32_t buffer[32];
+};
+
+
+/* Initialize structure containing state of computation. */
+extern void md4_init_ctx (struct md4_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void md4_process_block (const void *buffer, size_t len,
+ struct md4_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md4_process_bytes (const void *buffer, size_t len,
+ struct md4_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *md4_finish_ctx (struct md4_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *md4_read_ctx (const struct md4_ctx *ctx, void *resbuf);
+
+
+/* Compute MD4 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int md4_stream (FILE * stream, void *resblock);
+
+/* Compute MD4 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *md4_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/md5.c b/gnulib/lib/md5.c
new file mode 100644
index 00000000..4480ba87
--- /dev/null
+++ b/gnulib/lib/md5.c
@@ -0,0 +1,462 @@
+/* Functions to compute MD5 message digest of files or memory blocks.
+ according to the definition of MD5 in RFC 1321 from April 1992.
+ Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2005, 2006, 2008, 2009,
+ 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
+
+#include <config.h>
+
+#include "md5.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef _LIBC
+# include <endian.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define WORDS_BIGENDIAN 1
+# endif
+/* We need to keep the namespace clean so define the MD5 function
+ protected using leading __ . */
+# define md5_init_ctx __md5_init_ctx
+# define md5_process_block __md5_process_block
+# define md5_process_bytes __md5_process_bytes
+# define md5_finish_ctx __md5_finish_ctx
+# define md5_read_ctx __md5_read_ctx
+# define md5_stream __md5_stream
+# define md5_buffer __md5_buffer
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#else
+# define SWAP(n) (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+void
+md5_init_ctx (struct md5_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static inline void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[size - 2] = SWAP (ctx->total[0] << 3);
+ ctx->buffer[size - 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ md5_process_block (ctx->buffer, size * 4, ctx);
+
+ return md5_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md5_stream (FILE *stream, void *resblock)
+{
+ struct md5_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md5_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md5_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md5_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md5_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md5_ctx ctx;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md5_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md5_finish_ctx (&ctx, resblock);
+}
+
+
+void
+md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+# define alignof(type) offsetof (struct { char c; type x; }, x)
+# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ md5_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ md5_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
+{
+ uint32_t correct_words[16];
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ uint32_t *cwp = correct_words;
+ uint32_t A_save = A;
+ uint32_t B_save = B;
+ uint32_t C_save = C;
+ uint32_t D_save = D;
+
+ /* First round: using the given function, the context and a constant
+ the next context is computed. Because the algorithms processing
+ unit is a 32-bit word and it is determined to work on words in
+ little endian byte order we perhaps have to change the byte order
+ before the computation. To reduce the work for the next steps
+ we store the swapped words in the array CORRECT_WORDS. */
+
+#define OP(a, b, c, d, s, T) \
+ do \
+ { \
+ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
+ ++words; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* It is unfortunate that C does not provide an operator for
+ cyclic rotation. Hope the C compiler is smart enough. */
+#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+
+ /* Before we start, one word to the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+
+ Here is an equivalent invocation using Perl:
+
+ perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+ /* For the second to fourth round we have the possibly swapped words
+ in CORRECT_WORDS. Redefine the macro to take an additional first
+ argument specifying the function to use. */
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do \
+ { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Add the starting values of the context. */
+ A += A_save;
+ B += B_save;
+ C += C_save;
+ D += D_save;
+ }
+
+ /* Put checksum in context given as argument. */
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+}
diff --git a/gnulib/lib/md5.h b/gnulib/lib/md5.h
new file mode 100644
index 00000000..71f17f56
--- /dev/null
+++ b/gnulib/lib/md5.h
@@ -0,0 +1,126 @@
+/* Declaration of functions and data types used for MD5 sum computing
+ library functions.
+ Copyright (C) 1995-1997, 1999-2001, 2004-2006, 2008-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _MD5_H
+#define _MD5_H 1
+
+#include <stdio.h>
+#include <stdint.h>
+
+#define MD5_DIGEST_SIZE 16
+#define MD5_BLOCK_SIZE 64
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#ifndef __THROW
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+#ifndef _LIBC
+# define __md5_buffer md5_buffer
+# define __md5_finish_ctx md5_finish_ctx
+# define __md5_init_ctx md5_init_ctx
+# define __md5_process_block md5_process_block
+# define __md5_process_bytes md5_process_bytes
+# define __md5_read_ctx md5_read_ctx
+# define __md5_stream md5_stream
+#endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Structure to save state of computation between the single steps. */
+struct md5_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+
+ uint32_t total[2];
+ uint32_t buflen;
+ uint32_t buffer[32];
+};
+
+/*
+ * The following three functions are build up the low level used in
+ * the functions `md5_stream' and `md5_buffer'.
+ */
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void __md5_process_block (const void *buffer, size_t len,
+ struct md5_ctx *ctx) __THROW;
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void __md5_process_bytes (const void *buffer, size_t len,
+ struct md5_ctx *ctx) __THROW;
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW;
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW;
+
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int __md5_stream (FILE *stream, void *resblock) __THROW;
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *__md5_buffer (const char *buffer, size_t len,
+ void *resblock) __THROW;
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* md5.h */
diff --git a/gnulib/lib/memcasecmp.c b/gnulib/lib/memcasecmp.c
new file mode 100644
index 00000000..d326e8e0
--- /dev/null
+++ b/gnulib/lib/memcasecmp.c
@@ -0,0 +1,49 @@
+/* Case-insensitive buffer comparator.
+ Copyright (C) 1996-1997, 2000, 2003, 2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "memcasecmp.h"
+
+#include <ctype.h>
+#include <limits.h>
+
+/* Like memcmp, but ignore differences in case.
+ Convert to upper case (not lower) before comparing so that
+ join -i works with sort -f. */
+
+int
+memcasecmp (const void *vs1, const void *vs2, size_t n)
+{
+ size_t i;
+ char const *s1 = vs1;
+ char const *s2 = vs2;
+ for (i = 0; i < n; i++)
+ {
+ unsigned char u1 = s1[i];
+ unsigned char u2 = s2[i];
+ int U1 = toupper (u1);
+ int U2 = toupper (u2);
+ int diff = (UCHAR_MAX <= INT_MAX ? U1 - U2
+ : U1 < U2 ? -1 : U2 < U1);
+ if (diff)
+ return diff;
+ }
+ return 0;
+}
diff --git a/gnulib/lib/memcasecmp.h b/gnulib/lib/memcasecmp.h
new file mode 100644
index 00000000..78a9e68a
--- /dev/null
+++ b/gnulib/lib/memcasecmp.h
@@ -0,0 +1,22 @@
+/* Case-insensitive buffer comparator.
+
+ Copyright (C) 1996, 1998, 2003, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <stddef.h>
+
+int memcasecmp (const void *vs1, const void *vs2, size_t n);
diff --git a/gnulib/lib/memchr.c b/gnulib/lib/memchr.c
new file mode 100644
index 00000000..6c2b2d6c
--- /dev/null
+++ b/gnulib/lib/memchr.c
@@ -0,0 +1,172 @@
+/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2010
+ Free Software Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented by Roland McGrath (roland@ai.mit.edu).
+
+NOTE: The canonical source of this file is maintained with the GNU C Library.
+Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+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 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <stddef.h>
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# define reg_char char
+#endif
+
+#include <limits.h>
+
+#if HAVE_BP_SYM_H || defined _LIBC
+# include <bp-sym.h>
+#else
+# define BP_SYM(sym) sym
+#endif
+
+#undef __memchr
+#ifdef _LIBC
+# undef memchr
+#endif
+
+#ifndef weak_alias
+# define __memchr memchr
+#endif
+
+/* Search no more than N bytes of S for C. */
+void *
+__memchr (void const *s, int c_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned reg_char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n, ++char_ptr)
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c. We first use an xor
+ with repeated_c. This reduces the task to testing whether *any of the
+ four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ So, the test whether any byte in longword1 is zero is equivalent to
+ testing whether tmp is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c. On little-endian
+ machines, we could determine the first such byte without any further
+ memory accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines. Choose code
+ that works in both cases. */
+
+ for (; n > 0; --n, ++char_ptr)
+ {
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__memchr, BP_SYM (memchr))
+#endif
diff --git a/gnulib/lib/memchr.valgrind b/gnulib/lib/memchr.valgrind
new file mode 100644
index 00000000..60f247e1
--- /dev/null
+++ b/gnulib/lib/memchr.valgrind
@@ -0,0 +1,14 @@
+# Suppress a valgrind message about use of uninitialized memory in memchr().
+# POSIX states that when the character is found, memchr must not read extra
+# bytes in an overestimated length (for example, where memchr is used to
+# implement strnlen). However, we use a safe word read to provide a speedup.
+{
+ memchr-value4
+ Memcheck:Value4
+ fun:rpl_memchr
+}
+{
+ memchr-value8
+ Memcheck:Value8
+ fun:rpl_memchr
+}
diff --git a/gnulib/lib/memchr2.c b/gnulib/lib/memchr2.c
new file mode 100644
index 00000000..1ad936be
--- /dev/null
+++ b/gnulib/lib/memchr2.c
@@ -0,0 +1,164 @@
+/* Copyright (C) 1991, 1993, 1996, 1997, 1999, 2000, 2003, 2004, 2006, 2008,
+ 2009, 2010 Free Software Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented in glibc by Roland McGrath (roland@ai.mit.edu).
+ Extension to memchr2 implemented by Eric Blake (ebb9@byu.net).
+
+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 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/>. */
+
+#include <config.h>
+
+#include "memchr2.h"
+
+#include <limits.h>
+#include <stdint.h>
+#include <string.h>
+
+/* Return the first address of either C1 or C2 (treated as unsigned
+ char) that occurs within N bytes of the memory region S. If
+ neither byte appears, return NULL. */
+void *
+memchr2 (void const *s, int c1_in, int c2_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c1;
+ longword repeated_c2;
+ unsigned char c1;
+ unsigned char c2;
+
+ c1 = (unsigned char) c1_in;
+ c2 = (unsigned char) c2_in;
+
+ if (c1 == c2)
+ return memchr (s, c1, n);
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n, ++char_ptr)
+ if (*char_ptr == c1 || *char_ptr == c2)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c1 has c1 in every byte.
+ repeated_c2 has c2 in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c1 = c1 | (c1 << 8);
+ repeated_c2 = c2 | (c2 << 8);
+ repeated_c1 |= repeated_c1 << 16;
+ repeated_c2 |= repeated_c2 << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c1 |= repeated_c1 << 31 << 1;
+ repeated_c2 |= repeated_c2 << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c1 |= repeated_c1 << i;
+ repeated_c2 |= repeated_c2 << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c1 or c2. We first use
+ an xor with repeated_c1 and repeated_c2, respectively. This reduces
+ the task to testing whether *any of the four* bytes in longword1 or
+ longword2 is zero.
+
+ Let's consider longword1. We compute tmp1 =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp1 is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ Similary, we compute tmp2 =
+ ((longword2 - repeated_one) & ~longword2) & (repeated_one << 7).
+
+ The test whether any byte in longword1 or longword2 is zero is equivalent
+ to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine
+ this into a single test, whether (tmp1 | tmp2) is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *longword_ptr ^ repeated_c1;
+ longword longword2 = *longword_ptr ^ repeated_c2;
+
+ if (((((longword1 - repeated_one) & ~longword1)
+ | ((longword2 - repeated_one) & ~longword2))
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c1 or == c2. On
+ little-endian machines, we could determine the first such byte without
+ any further memory accesses, just by looking at the (tmp1 | tmp2) result
+ from the last loop iteration. But this does not work on big-endian
+ machines. Choose code that works in both cases. */
+
+ for (; n > 0; --n, ++char_ptr)
+ {
+ if (*char_ptr == c1 || *char_ptr == c2)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/memchr2.h b/gnulib/lib/memchr2.h
new file mode 100644
index 00000000..f5db8b79
--- /dev/null
+++ b/gnulib/lib/memchr2.h
@@ -0,0 +1,31 @@
+/* Scan memory for the first of two bytes.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the first address of either C1 or C2 (treated as unsigned
+ char) that occurs within N bytes of the memory region S. If
+ neither byte appears, return NULL. */
+
+extern void *memchr2 (void const *s, int c1, int c2, size_t n);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/memchr2.valgrind b/gnulib/lib/memchr2.valgrind
new file mode 100644
index 00000000..778fe867
--- /dev/null
+++ b/gnulib/lib/memchr2.valgrind
@@ -0,0 +1,14 @@
+# Suppress a valgrind message about use of uninitialized memory in memchr2().
+# Like memchr, it is safe to overestimate the length when the terminator
+# is guaranteed to be found. In this case, we may end up reading a word
+# that is partially uninitialized, but this use is OK for a speedup.
+{
+ memchr2-value4
+ Memcheck:Value4
+ fun:memchr2
+}
+{
+ memchr2-value8
+ Memcheck:Value8
+ fun:memchr2
+}
diff --git a/gnulib/lib/memcmp.c b/gnulib/lib/memcmp.c
new file mode 100644
index 00000000..0c7ce5e8
--- /dev/null
+++ b/gnulib/lib/memcmp.c
@@ -0,0 +1,363 @@
+/* Copyright (C) 1991, 1993, 1995, 1997-1998, 2003, 2006, 2009-2010 Free
+ Software Foundation, Inc.
+
+ Contributed by Torbjorn Granlund (tege@sics.se).
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ 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 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <stdint.h>
+
+#undef memcmp
+
+#ifdef _LIBC
+
+# include <memcopy.h>
+# include <endian.h>
+
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define WORDS_BIGENDIAN
+# endif
+
+#else /* Not in the GNU C library. */
+
+# include <sys/types.h>
+
+/* Type to use for aligned memory operations.
+ This should normally be the biggest type supported by a single load
+ and store. Must be an unsigned type. */
+# define op_t unsigned long int
+# define OPSIZ (sizeof(op_t))
+
+/* Threshold value for when to enter the unrolled loops. */
+# define OP_T_THRES 16
+
+/* Type to use for unaligned operations. */
+typedef unsigned char byte;
+
+# ifndef WORDS_BIGENDIAN
+# define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2)))
+# else
+# define MERGE(w0, sh_1, w1, sh_2) (((w0) << (sh_1)) | ((w1) >> (sh_2)))
+# endif
+
+#endif /* In the GNU C library. */
+
+#ifdef WORDS_BIGENDIAN
+# define CMP_LT_OR_GT(a, b) ((a) > (b) ? 1 : -1)
+#else
+# define CMP_LT_OR_GT(a, b) memcmp_bytes (a, b)
+#endif
+
+/* BE VERY CAREFUL IF YOU CHANGE THIS CODE! */
+
+/* The strategy of this memcmp is:
+
+ 1. Compare bytes until one of the block pointers is aligned.
+
+ 2. Compare using memcmp_common_alignment or
+ memcmp_not_common_alignment, regarding the alignment of the other
+ block after the initial byte operations. The maximum number of
+ full words (of type op_t) are compared in this way.
+
+ 3. Compare the few remaining bytes. */
+
+#ifndef WORDS_BIGENDIAN
+/* memcmp_bytes -- Compare A and B bytewise in the byte order of the machine.
+ A and B are known to be different.
+ This is needed only on little-endian machines. */
+
+# ifdef __GNUC__
+__inline
+# endif
+static int
+memcmp_bytes (op_t a, op_t b)
+{
+ const byte *srcp1 = (const byte *) &a;
+ const byte *srcp2 = (const byte *) &b;
+ op_t a0, b0;
+
+ do
+ {
+ a0 = srcp1[0];
+ b0 = srcp2[0];
+ srcp1 += 1;
+ srcp2 += 1;
+ }
+ while (a0 == b0);
+ return a0 - b0;
+}
+#endif
+
+/* memcmp_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN `op_t'
+ objects (not LEN bytes!). Both SRCP1 and SRCP2 should be aligned for
+ memory operations on `op_t's. */
+#ifdef __GNUC__
+__inline
+#endif
+static int
+memcmp_common_alignment (uintptr_t srcp1, uintptr_t srcp2, size_t len)
+{
+ op_t a0, a1;
+ op_t b0, b1;
+
+ switch (len % 4)
+ {
+ default: /* Avoid warning about uninitialized local variables. */
+ case 2:
+ a0 = ((op_t *) srcp1)[0];
+ b0 = ((op_t *) srcp2)[0];
+ srcp1 -= 2 * OPSIZ;
+ srcp2 -= 2 * OPSIZ;
+ len += 2;
+ goto do1;
+ case 3:
+ a1 = ((op_t *) srcp1)[0];
+ b1 = ((op_t *) srcp2)[0];
+ srcp1 -= OPSIZ;
+ srcp2 -= OPSIZ;
+ len += 1;
+ goto do2;
+ case 0:
+ if (OP_T_THRES <= 3 * OPSIZ && len == 0)
+ return 0;
+ a0 = ((op_t *) srcp1)[0];
+ b0 = ((op_t *) srcp2)[0];
+ goto do3;
+ case 1:
+ a1 = ((op_t *) srcp1)[0];
+ b1 = ((op_t *) srcp2)[0];
+ srcp1 += OPSIZ;
+ srcp2 += OPSIZ;
+ len -= 1;
+ if (OP_T_THRES <= 3 * OPSIZ && len == 0)
+ goto do0;
+ /* Fall through. */
+ }
+
+ do
+ {
+ a0 = ((op_t *) srcp1)[0];
+ b0 = ((op_t *) srcp2)[0];
+ if (a1 != b1)
+ return CMP_LT_OR_GT (a1, b1);
+
+ do3:
+ a1 = ((op_t *) srcp1)[1];
+ b1 = ((op_t *) srcp2)[1];
+ if (a0 != b0)
+ return CMP_LT_OR_GT (a0, b0);
+
+ do2:
+ a0 = ((op_t *) srcp1)[2];
+ b0 = ((op_t *) srcp2)[2];
+ if (a1 != b1)
+ return CMP_LT_OR_GT (a1, b1);
+
+ do1:
+ a1 = ((op_t *) srcp1)[3];
+ b1 = ((op_t *) srcp2)[3];
+ if (a0 != b0)
+ return CMP_LT_OR_GT (a0, b0);
+
+ srcp1 += 4 * OPSIZ;
+ srcp2 += 4 * OPSIZ;
+ len -= 4;
+ }
+ while (len != 0);
+
+ /* This is the right position for do0. Please don't move
+ it into the loop. */
+ do0:
+ if (a1 != b1)
+ return CMP_LT_OR_GT (a1, b1);
+ return 0;
+}
+
+/* memcmp_not_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN
+ `op_t' objects (not LEN bytes!). SRCP2 should be aligned for memory
+ operations on `op_t', but SRCP1 *should be unaligned*. */
+#ifdef __GNUC__
+__inline
+#endif
+static int
+memcmp_not_common_alignment (uintptr_t srcp1, uintptr_t srcp2, size_t len)
+{
+ op_t a0, a1, a2, a3;
+ op_t b0, b1, b2, b3;
+ op_t x;
+ int shl, shr;
+
+ /* Calculate how to shift a word read at the memory operation
+ aligned srcp1 to make it aligned for comparison. */
+
+ shl = 8 * (srcp1 % OPSIZ);
+ shr = 8 * OPSIZ - shl;
+
+ /* Make SRCP1 aligned by rounding it down to the beginning of the `op_t'
+ it points in the middle of. */
+ srcp1 &= -OPSIZ;
+
+ switch (len % 4)
+ {
+ default: /* Avoid warning about uninitialized local variables. */
+ case 2:
+ a1 = ((op_t *) srcp1)[0];
+ a2 = ((op_t *) srcp1)[1];
+ b2 = ((op_t *) srcp2)[0];
+ srcp1 -= 1 * OPSIZ;
+ srcp2 -= 2 * OPSIZ;
+ len += 2;
+ goto do1;
+ case 3:
+ a0 = ((op_t *) srcp1)[0];
+ a1 = ((op_t *) srcp1)[1];
+ b1 = ((op_t *) srcp2)[0];
+ srcp2 -= 1 * OPSIZ;
+ len += 1;
+ goto do2;
+ case 0:
+ if (OP_T_THRES <= 3 * OPSIZ && len == 0)
+ return 0;
+ a3 = ((op_t *) srcp1)[0];
+ a0 = ((op_t *) srcp1)[1];
+ b0 = ((op_t *) srcp2)[0];
+ srcp1 += 1 * OPSIZ;
+ goto do3;
+ case 1:
+ a2 = ((op_t *) srcp1)[0];
+ a3 = ((op_t *) srcp1)[1];
+ b3 = ((op_t *) srcp2)[0];
+ srcp1 += 2 * OPSIZ;
+ srcp2 += 1 * OPSIZ;
+ len -= 1;
+ if (OP_T_THRES <= 3 * OPSIZ && len == 0)
+ goto do0;
+ /* Fall through. */
+ }
+
+ do
+ {
+ a0 = ((op_t *) srcp1)[0];
+ b0 = ((op_t *) srcp2)[0];
+ x = MERGE(a2, shl, a3, shr);
+ if (x != b3)
+ return CMP_LT_OR_GT (x, b3);
+
+ do3:
+ a1 = ((op_t *) srcp1)[1];
+ b1 = ((op_t *) srcp2)[1];
+ x = MERGE(a3, shl, a0, shr);
+ if (x != b0)
+ return CMP_LT_OR_GT (x, b0);
+
+ do2:
+ a2 = ((op_t *) srcp1)[2];
+ b2 = ((op_t *) srcp2)[2];
+ x = MERGE(a0, shl, a1, shr);
+ if (x != b1)
+ return CMP_LT_OR_GT (x, b1);
+
+ do1:
+ a3 = ((op_t *) srcp1)[3];
+ b3 = ((op_t *) srcp2)[3];
+ x = MERGE(a1, shl, a2, shr);
+ if (x != b2)
+ return CMP_LT_OR_GT (x, b2);
+
+ srcp1 += 4 * OPSIZ;
+ srcp2 += 4 * OPSIZ;
+ len -= 4;
+ }
+ while (len != 0);
+
+ /* This is the right position for do0. Please don't move
+ it into the loop. */
+ do0:
+ x = MERGE(a2, shl, a3, shr);
+ if (x != b3)
+ return CMP_LT_OR_GT (x, b3);
+ return 0;
+}
+
+int
+rpl_memcmp (const void *s1, const void *s2, size_t len)
+{
+ op_t a0;
+ op_t b0;
+ uintptr_t srcp1 = (uintptr_t) s1;
+ uintptr_t srcp2 = (uintptr_t) s2;
+ op_t res;
+
+ if (len >= OP_T_THRES)
+ {
+ /* There are at least some bytes to compare. No need to test
+ for LEN == 0 in this alignment loop. */
+ while (srcp2 % OPSIZ != 0)
+ {
+ a0 = ((byte *) srcp1)[0];
+ b0 = ((byte *) srcp2)[0];
+ srcp1 += 1;
+ srcp2 += 1;
+ res = a0 - b0;
+ if (res != 0)
+ return res;
+ len -= 1;
+ }
+
+ /* SRCP2 is now aligned for memory operations on `op_t'.
+ SRCP1 alignment determines if we can do a simple,
+ aligned compare or need to shuffle bits. */
+
+ if (srcp1 % OPSIZ == 0)
+ res = memcmp_common_alignment (srcp1, srcp2, len / OPSIZ);
+ else
+ res = memcmp_not_common_alignment (srcp1, srcp2, len / OPSIZ);
+ if (res != 0)
+ return res;
+
+ /* Number of bytes remaining in the interval [0..OPSIZ-1]. */
+ srcp1 += len & -OPSIZ;
+ srcp2 += len & -OPSIZ;
+ len %= OPSIZ;
+ }
+
+ /* There are just a few bytes to compare. Use byte memory operations. */
+ while (len != 0)
+ {
+ a0 = ((byte *) srcp1)[0];
+ b0 = ((byte *) srcp2)[0];
+ srcp1 += 1;
+ srcp2 += 1;
+ res = a0 - b0;
+ if (res != 0)
+ return res;
+ len -= 1;
+ }
+
+ return 0;
+}
+
+#ifdef weak_alias
+# undef bcmp
+weak_alias (memcmp, bcmp)
+#endif
diff --git a/gnulib/lib/memcmp2.c b/gnulib/lib/memcmp2.c
new file mode 100644
index 00000000..a0429483
--- /dev/null
+++ b/gnulib/lib/memcmp2.c
@@ -0,0 +1,36 @@
+/* Compare two memory areas with possibly different lengths.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "memcmp2.h"
+
+#include <string.h>
+
+int
+memcmp2 (const char *s1, size_t n1, const char *s2, size_t n2)
+{
+ int cmp = memcmp (s1, s2, n1 <= n2 ? n1 : n2);
+ if (cmp == 0)
+ {
+ if (n1 < n2)
+ cmp = -1;
+ else if (n1 > n2)
+ cmp = 1;
+ }
+ return cmp;
+}
diff --git a/gnulib/lib/memcmp2.h b/gnulib/lib/memcmp2.h
new file mode 100644
index 00000000..c00e1418
--- /dev/null
+++ b/gnulib/lib/memcmp2.h
@@ -0,0 +1,39 @@
+/* Compare two memory areas with possibly different lengths.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef MEMCMP2_H
+#define MEMCMP2_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare the memory regions S1 = [s1..s1+N1-1], S2 = [s2..s2+n2-1],
+ lexicographically.
+ This function's result is locale independent, unlike memcoll()'s.
+ Return a negative number if S1 < S2, a positive number if S1 > S2, or
+ 0 if S1 and S2 have the same contents. */
+extern int memcmp2 (const char *s1, size_t n1, const char *s2, size_t n2);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MEMCMP2_H */
diff --git a/gnulib/lib/memcoll.c b/gnulib/lib/memcoll.c
new file mode 100644
index 00000000..e08ffa54
--- /dev/null
+++ b/gnulib/lib/memcoll.c
@@ -0,0 +1,96 @@
+/* Locale-specific memory comparison.
+
+ Copyright (C) 1999, 2002-2004, 2006, 2009-2010 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/>. */
+
+/* Contributed by Paul Eggert <eggert@twinsun.com>. */
+
+#include <config.h>
+
+#include "memcoll.h"
+
+#include <errno.h>
+#include <string.h>
+
+/* Compare S1 (with length S1LEN) and S2 (with length S2LEN) according
+ to the LC_COLLATE locale. S1 and S2 do not overlap, and are not
+ adjacent. Perhaps temporarily modify the bytes after S1 and S2,
+ but restore their original contents before returning. Set errno to an
+ error number if there is an error, and to zero otherwise. */
+int
+memcoll (char *s1, size_t s1len, char *s2, size_t s2len)
+{
+ int diff;
+
+#if HAVE_STRCOLL
+
+ /* strcoll is slow on many platforms, so check for the common case
+ where the arguments are bytewise equal. Otherwise, walk through
+ the buffers using strcoll on each substring. */
+
+ if (s1len == s2len && memcmp (s1, s2, s1len) == 0)
+ {
+ errno = 0;
+ diff = 0;
+ }
+ else
+ {
+ char n1 = s1[s1len];
+ char n2 = s2[s2len];
+
+ s1[s1len++] = '\0';
+ s2[s2len++] = '\0';
+
+ while (! (errno = 0, (diff = strcoll (s1, s2)) || errno))
+ {
+ /* strcoll found no difference, but perhaps it was fooled by NUL
+ characters in the data. Work around this problem by advancing
+ past the NUL chars. */
+ size_t size1 = strlen (s1) + 1;
+ size_t size2 = strlen (s2) + 1;
+ s1 += size1;
+ s2 += size2;
+ s1len -= size1;
+ s2len -= size2;
+
+ if (s1len == 0)
+ {
+ if (s2len != 0)
+ diff = -1;
+ break;
+ }
+ else if (s2len == 0)
+ {
+ diff = 1;
+ break;
+ }
+ }
+
+ s1[s1len - 1] = n1;
+ s2[s2len - 1] = n2;
+ }
+
+#else
+
+ diff = memcmp (s1, s2, s1len < s2len ? s1len : s2len);
+ if (! diff)
+ diff = s1len < s2len ? -1 : s1len != s2len;
+ errno = 0;
+
+#endif
+
+ return diff;
+}
diff --git a/gnulib/lib/memcoll.h b/gnulib/lib/memcoll.h
new file mode 100644
index 00000000..8f2e1b15
--- /dev/null
+++ b/gnulib/lib/memcoll.h
@@ -0,0 +1,27 @@
+/* Locale-specific memory comparison.
+
+ Copyright (C) 1999, 2003, 2009-2010 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/>. */
+
+/* Contributed by Paul Eggert <eggert@twinsun.com>. */
+
+#ifndef MEMCOLL_H_
+# define MEMCOLL_H_ 1
+
+# include <stddef.h>
+
+int memcoll (char *, size_t, char *, size_t);
+
+#endif /* MEMCOLL_H_ */
diff --git a/gnulib/lib/memcpy.c b/gnulib/lib/memcpy.c
new file mode 100644
index 00000000..2d87e5dc
--- /dev/null
+++ b/gnulib/lib/memcpy.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 1995, 1997, 2000, 2003, 2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <meyering@na-net.ornl.gov>. */
+
+#include <config.h>
+
+#include <stddef.h>
+
+/* Copy LEN bytes starting at SRCADDR to DESTADDR. Result undefined
+ if the source overlaps with the destination.
+ Return DESTADDR. */
+
+void *
+memcpy (void *destaddr, void const *srcaddr, size_t len)
+{
+ char *dest = destaddr;
+ char const *src = srcaddr;
+
+ while (len-- > 0)
+ *dest++ = *src++;
+ return destaddr;
+}
diff --git a/gnulib/lib/memmem.c b/gnulib/lib/memmem.c
new file mode 100644
index 00000000..d294a2ef
--- /dev/null
+++ b/gnulib/lib/memmem.c
@@ -0,0 +1,76 @@
+/* Copyright (C) 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000, 2004, 2007,
+ 2008, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This particular implementation was written by Eric Blake, 2008. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Specification of memmem. */
+#include <string.h>
+
+#ifndef _LIBC
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#define RETURN_TYPE void *
+#define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l))
+#include "str-two-way.h"
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK
+ if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in
+ HAYSTACK. */
+void *
+memmem (const void *haystack_start, size_t haystack_len,
+ const void *needle_start, size_t needle_len)
+{
+ /* Abstract memory is considered to be an array of 'unsigned char' values,
+ not an array of 'char' values. See ISO C 99 section 6.2.6.1. */
+ const unsigned char *haystack = (const unsigned char *) haystack_start;
+ const unsigned char *needle = (const unsigned char *) needle_start;
+
+ if (needle_len == 0)
+ /* The first occurrence of the empty string is deemed to occur at
+ the beginning of the string. */
+ return (void *) haystack;
+
+ /* Sanity check, otherwise the loop might search through the whole
+ memory. */
+ if (__builtin_expect (haystack_len < needle_len, 0))
+ return NULL;
+
+ /* Use optimizations in memchr when possible, to reduce the search
+ size of haystack using a linear algorithm with a smaller
+ coefficient. However, avoid memchr for long needles, since we
+ can often achieve sublinear performance. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ {
+ haystack = memchr (haystack, *needle, haystack_len);
+ if (!haystack || __builtin_expect (needle_len == 1, 0))
+ return (void *) haystack;
+ haystack_len -= haystack - (const unsigned char *) haystack_start;
+ if (haystack_len < needle_len)
+ return NULL;
+ return two_way_short_needle (haystack, haystack_len, needle, needle_len);
+ }
+ else
+ return two_way_long_needle (haystack, haystack_len, needle, needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/gnulib/lib/memmove.c b/gnulib/lib/memmove.c
new file mode 100644
index 00000000..0f040540
--- /dev/null
+++ b/gnulib/lib/memmove.c
@@ -0,0 +1,26 @@
+/* memmove.c -- copy memory.
+ Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate.
+ In the public domain.
+ By David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+#include <stddef.h>
+
+void *
+memmove (void *dest0, void const *source0, size_t length)
+{
+ char *dest = dest0;
+ char const *source = source0;
+ if (source < dest)
+ /* Moving from low mem to hi mem; start at end. */
+ for (source += length, dest += length; length; --length)
+ *--dest = *--source;
+ else if (source != dest)
+ {
+ /* Moving from hi mem to low mem; start at beginning. */
+ for (; length; --length)
+ *dest++ = *source++;
+ }
+ return dest0;
+}
diff --git a/gnulib/lib/mempcpy.c b/gnulib/lib/mempcpy.c
new file mode 100644
index 00000000..f8fdb037
--- /dev/null
+++ b/gnulib/lib/mempcpy.c
@@ -0,0 +1,29 @@
+/* Copy memory area and return pointer after last written byte.
+ Copyright (C) 2003, 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+ last written byte. */
+void *
+mempcpy (void *dest, const void *src, size_t n)
+{
+ return (char *) memcpy (dest, src, n) + n;
+}
diff --git a/gnulib/lib/memrchr.c b/gnulib/lib/memrchr.c
new file mode 100644
index 00000000..358f6183
--- /dev/null
+++ b/gnulib/lib/memrchr.c
@@ -0,0 +1,161 @@
+/* memrchr -- find the last occurrence of a byte in a memory block
+
+ Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2010 Free Software
+ Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented by Roland McGrath (roland@ai.mit.edu).
+
+ 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/>. */
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# include <config.h>
+# define reg_char char
+#endif
+
+#include <string.h>
+#include <limits.h>
+
+#undef __memrchr
+#ifdef _LIBC
+# undef memrchr
+#endif
+
+#ifndef weak_alias
+# define __memrchr memrchr
+#endif
+
+/* Search no more than N bytes of S for C. */
+void *
+__memrchr (void const *s, int c_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned reg_char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the last few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s + n;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n)
+ if (*--char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c. We first use an xor
+ with repeated_c. This reduces the task to testing whether *any of the
+ four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ So, the test whether any byte in longword1 is zero is equivalent to
+ testing whether tmp is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *--longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ {
+ longword_ptr++;
+ break;
+ }
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c. On little-endian
+ machines, we could determine the first such byte without any further
+ memory accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines. Choose code
+ that works in both cases. */
+
+ while (n-- > 0)
+ {
+ if (*--char_ptr == c)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__memrchr, memrchr)
+#endif
diff --git a/gnulib/lib/memset.c b/gnulib/lib/memset.c
new file mode 100644
index 00000000..d9912b1e
--- /dev/null
+++ b/gnulib/lib/memset.c
@@ -0,0 +1,28 @@
+/* memset.c -- set an area of memory to a given value
+ Copyright (C) 1991, 2003, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <stddef.h>
+
+void *
+memset (void *str, int c, size_t len)
+{
+ register char *st = str;
+
+ while (len-- > 0)
+ *st++ = c;
+ return str;
+}
diff --git a/gnulib/lib/memxfrm.c b/gnulib/lib/memxfrm.c
new file mode 100644
index 00000000..a1c6cf8a
--- /dev/null
+++ b/gnulib/lib/memxfrm.c
@@ -0,0 +1,137 @@
+/* Locale dependent memory area transformation for comparison.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "memxfrm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *
+memxfrm (char *s, size_t n, char *resultbuf, size_t *lengthp)
+{
+ /* Result accumulator. */
+ char *result;
+ size_t length;
+ size_t allocated;
+
+ char orig_sentinel;
+
+ /* Initial memory allocation. */
+ if (resultbuf != NULL && *lengthp > 0)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ allocated = (n > 0 ? n : 1);
+ result = (char *) malloc (allocated);
+ if (result == NULL)
+ goto out_of_memory_2;
+ }
+ length = 0;
+
+ /* Add sentinel.byte. */
+ orig_sentinel = s[n];
+ s[n] = '\0';
+
+ /* Iterate through S, transforming each NUL terminated segment.
+ Accumulate the resulting transformed segments in result, separated by
+ NULs. */
+ {
+ const char *p_end = s + n + 1;
+ const char *p;
+
+ p = s;
+ for (;;)
+ {
+ /* Search next NUL byte. */
+ const char *q = p + strlen (p);
+
+ for (;;)
+ {
+ size_t k;
+
+ errno = 0;
+ k = strxfrm (result + length, p, allocated - length);
+ if (errno != 0)
+ goto fail;
+ if (k >= allocated - length)
+ {
+ /* Grow the result buffer. */
+ char *new_result;
+
+ allocated = 2 * allocated;
+ if (allocated < 64)
+ allocated = 64;
+ if (result == resultbuf)
+ new_result = (char *) malloc (allocated);
+ else
+ new_result = (char *) realloc (result, allocated);
+ if (new_result == NULL)
+ goto out_of_memory_1;
+ result = new_result;
+ }
+ else
+ {
+ length += k;
+ break;
+ }
+ }
+
+ p = q + 1;
+ if (p == p_end)
+ break;
+ result[length] = '\0';
+ length++;
+ }
+ }
+
+ /* Shrink the allocated memory if possible. */
+ if (result != resultbuf && (length > 0 ? length : 1) < allocated)
+ {
+ char *memory = (char *) realloc (result, length > 0 ? length : 1);
+ if (memory != NULL)
+ result = memory;
+ }
+
+ s[n] = orig_sentinel;
+ *lengthp = length;
+ return result;
+
+ fail:
+ {
+ int saved_errno = errno;
+ if (result != resultbuf)
+ free (result);
+ s[n] = orig_sentinel;
+ errno = saved_errno;
+ return NULL;
+ }
+
+ out_of_memory_1:
+ if (result != resultbuf)
+ free (result);
+ s[n] = orig_sentinel;
+ out_of_memory_2:
+ errno = ENOMEM;
+ return NULL;
+}
diff --git a/gnulib/lib/memxfrm.h b/gnulib/lib/memxfrm.h
new file mode 100644
index 00000000..8b7284a6
--- /dev/null
+++ b/gnulib/lib/memxfrm.h
@@ -0,0 +1,48 @@
+/* Locale dependent memory area transformation for comparison.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef MEMXFRM_H
+#define MEMXFRM_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Generalization of strxfrm() to strings with embedded NUL bytes. */
+
+/* Transform the memory area [S..S+N-1] to a memory area, in such a way that
+ comparing (S1,N1) and (S2,N2) with memcoll() is equivalent to comparing
+ memxfrm(S1,N1) and memxfrm(S2,N2) with memcmp2().
+ The byte S[N] may be temporarily overwritten by this function, but will be
+ restored before this function returns.
+ The result of this function depends on the LC_COLLATE category of the
+ current locale.
+ If successful: If resultbuf is not NULL and the result fits into *lengthp
+ bytes, 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 of the returned string.
+ Upon failure, return NULL, with errno set. */
+extern char * memxfrm (char *s, size_t n, char *resultbuf, size_t *lengthp);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MEMXFRM_H */
diff --git a/gnulib/lib/memxor.c b/gnulib/lib/memxor.c
new file mode 100644
index 00000000..9fc1b608
--- /dev/null
+++ b/gnulib/lib/memxor.c
@@ -0,0 +1,35 @@
+/* memxor.c -- perform binary exclusive OR operation of two memory blocks.
+ Copyright (C) 2005, 2006, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. The interface was inspired by memxor
+ in Niels Möller's Nettle. */
+
+#include <config.h>
+
+#include "memxor.h"
+
+void *
+memxor (void *restrict dest, const void *restrict src, size_t n)
+{
+ char const *s = src;
+ char *d = dest;
+
+ for (; n > 0; n--)
+ *d++ ^= *s++;
+
+ return dest;
+}
diff --git a/gnulib/lib/memxor.h b/gnulib/lib/memxor.h
new file mode 100644
index 00000000..d0be0b9d
--- /dev/null
+++ b/gnulib/lib/memxor.h
@@ -0,0 +1,31 @@
+/* memxor.h -- perform binary exclusive OR operation on memory blocks.
+ Copyright (C) 2005, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. The interface was inspired by memxor
+ in Niels Möller's Nettle. */
+
+#ifndef MEMXOR_H
+# define MEMXOR_H
+
+#include <stddef.h>
+
+/* Compute binary exclusive OR of memory areas DEST and SRC, putting
+ the result in DEST, of length N bytes. Returns a pointer to
+ DEST. */
+void *memxor (void *restrict dest, const void *restrict src, size_t n);
+
+#endif /* MEMXOR_H */
diff --git a/gnulib/lib/mgetgroups.c b/gnulib/lib/mgetgroups.c
new file mode 100644
index 00000000..76474c21
--- /dev/null
+++ b/gnulib/lib/mgetgroups.c
@@ -0,0 +1,206 @@
+/* mgetgroups.c -- return a list of the groups a user or current process is in
+
+ Copyright (C) 2007-2010 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/>. */
+
+/* Extracted from coreutils' src/id.c. */
+
+#include <config.h>
+
+#include "mgetgroups.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+#if HAVE_GETGROUPLIST
+# include <grp.h>
+#endif
+
+#include "getugroups.h"
+#include "xalloc.h"
+
+static gid_t *
+realloc_groupbuf (gid_t *g, size_t num)
+{
+ if (xalloc_oversized (num, sizeof *g))
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ return realloc (g, num * sizeof *g);
+}
+
+/* Like getugroups, but store the result in malloc'd storage.
+ Set *GROUPS to the malloc'd list of all group IDs of which USERNAME
+ is a member. If GID is not -1, store it first. GID should be the
+ group ID (pw_gid) obtained from getpwuid, in case USERNAME is not
+ listed in the groups database (e.g., /etc/groups). If USERNAME is
+ NULL, store the supplementary groups of the current process, and GID
+ should be -1 or the effective group ID (getegid). Upon failure,
+ don't modify *GROUPS, set errno, and return -1. Otherwise, return
+ the number of groups. The resulting list may contain duplicates,
+ but adjacent members will be distinct. */
+
+int
+mgetgroups (char const *username, gid_t gid, gid_t **groups)
+{
+ int max_n_groups;
+ int ng;
+ gid_t *g;
+
+#if HAVE_GETGROUPLIST
+ /* We prefer to use getgrouplist if available, because it has better
+ performance characteristics.
+
+ In glibc 2.3.2, getgrouplist is buggy. If you pass a zero as the
+ length of the output buffer, getgrouplist will still write to the
+ buffer. Contrary to what some versions of the getgrouplist
+ manpage say, this doesn't happen with nonzero buffer sizes.
+ Therefore our usage here just avoids a zero sized buffer. */
+ if (username)
+ {
+ enum { N_GROUPS_INIT = 10 };
+ max_n_groups = N_GROUPS_INIT;
+
+ g = realloc_groupbuf (NULL, max_n_groups);
+ if (g == NULL)
+ return -1;
+
+ while (1)
+ {
+ gid_t *h;
+ int last_n_groups = max_n_groups;
+
+ /* getgrouplist updates max_n_groups to num required. */
+ ng = getgrouplist (username, gid, g, &max_n_groups);
+
+ /* Some systems (like Darwin) have a bug where they
+ never increase max_n_groups. */
+ if (ng < 0 && last_n_groups == max_n_groups)
+ max_n_groups *= 2;
+
+ if ((h = realloc_groupbuf (g, max_n_groups)) == NULL)
+ {
+ int saved_errno = errno;
+ free (g);
+ errno = saved_errno;
+ return -1;
+ }
+ g = h;
+
+ if (0 <= ng)
+ {
+ *groups = g;
+ /* On success some systems just return 0 from getgrouplist,
+ so return max_n_groups rather than ng. */
+ return max_n_groups;
+ }
+ }
+ }
+ /* else no username, so fall through and use getgroups. */
+#endif
+
+ max_n_groups = (username
+ ? getugroups (0, NULL, username, gid)
+ : getgroups (0, NULL));
+
+ /* If we failed to count groups because there is no supplemental
+ group support, then return an array containing just GID.
+ Otherwise, we fail for the same reason. */
+ if (max_n_groups < 0)
+ {
+ if (errno == ENOSYS && (g = realloc_groupbuf (NULL, 1)))
+ {
+ *groups = g;
+ *g = gid;
+ return gid != (gid_t) -1;
+ }
+ return -1;
+ }
+
+ if (!username && gid != (gid_t) -1)
+ max_n_groups++;
+ g = realloc_groupbuf (NULL, max_n_groups);
+ if (g == NULL)
+ return -1;
+
+ ng = (username
+ ? getugroups (max_n_groups, g, username, gid)
+ : getgroups (max_n_groups - (gid != (gid_t) -1),
+ g + (gid != (gid_t) -1)));
+
+ if (ng < 0)
+ {
+ /* Failure is unexpected, but handle it anyway. */
+ int saved_errno = errno;
+ free (g);
+ errno = saved_errno;
+ return -1;
+ }
+
+ if (!username && gid != (gid_t) -1)
+ {
+ *g = gid;
+ ng++;
+ }
+ *groups = g;
+
+ /* Reduce the number of duplicates. On some systems, getgroups
+ returns the effective gid twice: once as the first element, and
+ once in its position within the supplementary groups. On other
+ systems, getgroups does not return the effective gid at all,
+ which is why we provide a GID argument. Meanwhile, the GID
+ argument, if provided, is typically any member of the
+ supplementary groups, and not necessarily the effective gid. So,
+ the most likely duplicates are the first element with an
+ arbitrary other element, or pair-wise duplication between the
+ first and second elements returned by getgroups. It is possible
+ that this O(n) pass will not remove all duplicates, but it is not
+ worth the effort to slow down to an O(n log n) algorithm that
+ sorts the array in place, nor the extra memory needed for
+ duplicate removal via an O(n) hash-table. Hence, this function
+ is only documented as guaranteeing no pair-wise duplicates,
+ rather than returning the minimal set. */
+ if (1 < ng)
+ {
+ gid_t first = *g;
+ gid_t *next;
+ gid_t *groups_end = g + ng;
+
+ for (next = g + 1; next < groups_end; next++)
+ {
+ if (*next == first || *next == *g)
+ ng--;
+ else
+ *++g = *next;
+ }
+ }
+
+ return ng;
+}
+
+/* Like mgetgroups, but call xalloc_die on allocation failure. */
+
+int
+xgetgroups (char const *username, gid_t gid, gid_t **groups)
+{
+ int result = mgetgroups (username, gid, groups);
+ if (result == -1 && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/mgetgroups.h b/gnulib/lib/mgetgroups.h
new file mode 100644
index 00000000..f9a8d893
--- /dev/null
+++ b/gnulib/lib/mgetgroups.h
@@ -0,0 +1,20 @@
+/* Get a list of all group IDs associated with a specified user ID.
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+#include <sys/types.h>
+
+int mgetgroups (const char *username, gid_t gid, gid_t **groups);
+int xgetgroups (const char *username, gid_t gid, gid_t **groups);
diff --git a/gnulib/lib/minmax.h b/gnulib/lib/minmax.h
new file mode 100644
index 00000000..8ee442be
--- /dev/null
+++ b/gnulib/lib/minmax.h
@@ -0,0 +1,61 @@
+/* MIN, MAX macros.
+ Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _MINMAX_H
+#define _MINMAX_H
+
+/* Note: MIN, MAX are also defined in <sys/param.h> on some systems
+ (glibc, IRIX, HP-UX, OSF/1). Therefore you might get warnings about
+ MIN, MAX macro redefinitions on some systems; the workaround is to
+ #include this file as the last one among the #include list. */
+
+/* Before we define the following symbols we get the <limits.h> file
+ since otherwise we get redefinitions on some systems if <limits.h> is
+ included after this file. Likewise for <sys/param.h>.
+ If more than one of these system headers define MIN and MAX, pick just
+ one of the headers (because the definitions most likely are the same). */
+#if HAVE_MINMAX_IN_LIMITS_H
+# include <limits.h>
+#elif HAVE_MINMAX_IN_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+/* Note: MIN and MAX should be used with two arguments of the
+ same type. They might not return the minimum and maximum of their two
+ arguments, if the arguments have different types or have unusual
+ floating-point values. For example, on a typical host with 32-bit 'int',
+ 64-bit 'long long', and 64-bit IEEE 754 'double' types:
+
+ MAX (-1, 2147483648) returns 4294967295.
+ MAX (9007199254740992.0, 9007199254740993) returns 9007199254740992.0.
+ MAX (NaN, 0.0) returns 0.0.
+ MAX (+0.0, -0.0) returns -0.0.
+
+ and in each case the answer is in some sense bogus. */
+
+/* MAX(a,b) returns the maximum of A and B. */
+#ifndef MAX
+# define MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+
+/* MIN(a,b) returns the minimum of A and B. */
+#ifndef MIN
+# define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#endif /* _MINMAX_H */
diff --git a/gnulib/lib/mkancesdirs.c b/gnulib/lib/mkancesdirs.c
new file mode 100644
index 00000000..709e93bc
--- /dev/null
+++ b/gnulib/lib/mkancesdirs.c
@@ -0,0 +1,153 @@
+/* Make a file's ancestor directories.
+
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "mkancesdirs.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "dirname.h"
+#include "savewd.h"
+
+/* Ensure that the ancestor directories of FILE exist, using an
+ algorithm that should work even if two processes execute this
+ function in parallel. Modify FILE as necessary to access the
+ ancestor directories, but restore FILE to an equivalent value
+ if successful.
+
+ WD points to the working directory, using the conventions of
+ savewd.
+
+ Create any ancestor directories that don't already exist, by
+ invoking MAKE_DIR (FILE, COMPONENT, MAKE_DIR_ARG). This function
+ should return 0 if successful and the resulting directory is
+ readable, 1 if successful but the resulting directory might not be
+ readable, -1 (setting errno) otherwise. If COMPONENT is relative,
+ it is relative to the temporary working directory, which may differ
+ from *WD.
+
+ Ordinarily MAKE_DIR is executed with the working directory changed
+ to reflect the already-made prefix, and mkancesdirs returns with
+ the working directory changed a prefix of FILE. However, if the
+ initial working directory cannot be saved in a file descriptor,
+ MAKE_DIR is invoked in a subprocess and this function returns in
+ both the parent and child process, so the caller should not assume
+ any changed state survives other than the EXITMAX component of WD,
+ and the caller should take care that the parent does not attempt to
+ do the work that the child is doing.
+
+ If successful and if this process can go ahead and create FILE,
+ return the length of the prefix of FILE that has already been made.
+ If successful so far but a child process is doing the actual work,
+ return -2. If unsuccessful, return -1 and set errno. */
+
+ptrdiff_t
+mkancesdirs (char *file, struct savewd *wd,
+ int (*make_dir) (char const *, char const *, void *),
+ void *make_dir_arg)
+{
+ /* Address of the previous directory separator that follows an
+ ordinary byte in a file name in the left-to-right scan, or NULL
+ if no such separator precedes the current location P. */
+ char *sep = NULL;
+
+ /* Address of the leftmost file name component that has not yet
+ been processed. */
+ char *component = file;
+
+ char *p = file + FILE_SYSTEM_PREFIX_LEN (file);
+ char c;
+ bool made_dir = false;
+
+ /* Scan forward through FILE, creating and chdiring into directories
+ along the way. Try MAKE_DIR before chdir, so that the procedure
+ works even when two or more processes are executing it in
+ parallel. Isolate each file name component by having COMPONENT
+ point to its start and SEP point just after its end. */
+
+ while ((c = *p++))
+ if (ISSLASH (*p))
+ {
+ if (! ISSLASH (c))
+ sep = p;
+ }
+ else if (ISSLASH (c) && *p && sep)
+ {
+ /* Don't bother to make or test for "." since it does not
+ affect the algorithm. */
+ if (! (sep - component == 1 && component[0] == '.'))
+ {
+ int make_dir_errno = 0;
+ int savewd_chdir_options = 0;
+ int chdir_result;
+
+ /* Temporarily modify FILE to isolate this file name
+ component. */
+ *sep = '\0';
+
+ /* Invoke MAKE_DIR on this component, except don't bother
+ with ".." since it must exist if its "parent" does. */
+ if (sep - component == 2
+ && component[0] == '.' && component[1] == '.')
+ made_dir = false;
+ else
+ switch (make_dir (file, component, make_dir_arg))
+ {
+ case -1:
+ make_dir_errno = errno;
+ break;
+
+ case 0:
+ savewd_chdir_options |= SAVEWD_CHDIR_READABLE;
+ /* Fall through. */
+ case 1:
+ made_dir = true;
+ break;
+ }
+
+ if (made_dir)
+ savewd_chdir_options |= SAVEWD_CHDIR_NOFOLLOW;
+
+ chdir_result =
+ savewd_chdir (wd, component, savewd_chdir_options, NULL);
+
+ /* Undo the temporary modification to FILE, unless there
+ was a failure. */
+ if (chdir_result != -1)
+ *sep = '/';
+
+ if (chdir_result != 0)
+ {
+ if (make_dir_errno != 0 && errno == ENOENT)
+ errno = make_dir_errno;
+ return chdir_result;
+ }
+ }
+
+ component = p;
+ }
+
+ return component - file;
+}
diff --git a/gnulib/lib/mkancesdirs.h b/gnulib/lib/mkancesdirs.h
new file mode 100644
index 00000000..5f7b2d64
--- /dev/null
+++ b/gnulib/lib/mkancesdirs.h
@@ -0,0 +1,4 @@
+#include <stddef.h>
+struct savewd;
+ptrdiff_t mkancesdirs (char *, struct savewd *,
+ int (*) (char const *, char const *, void *), void *);
diff --git a/gnulib/lib/mkdir-p.c b/gnulib/lib/mkdir-p.c
new file mode 100644
index 00000000..058508c8
--- /dev/null
+++ b/gnulib/lib/mkdir-p.c
@@ -0,0 +1,208 @@
+/* mkdir-p.c -- Ensure that a directory and its parents exist.
+
+ Copyright (C) 1990, 1997-2000, 2002-2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert, David MacKenzie, and Jim Meyering. */
+
+#include <config.h>
+
+#include "mkdir-p.h"
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "dirchownmod.h"
+#include "dirname.h"
+#include "error.h"
+#include "quote.h"
+#include "mkancesdirs.h"
+#include "savewd.h"
+
+#ifndef HAVE_FCHMOD
+# define HAVE_FCHMOD false
+#endif
+
+/* Ensure that the directory DIR exists.
+
+ WD is the working directory, as in savewd.c.
+
+ If MAKE_ANCESTOR is not null, create any ancestor directories that
+ don't already exist, by invoking MAKE_ANCESTOR (DIR, ANCESTOR, OPTIONS).
+ This function should return zero if successful, -1 (setting errno)
+ otherwise. In this case, DIR may be modified by storing '\0' bytes
+ into it, to access the ancestor directories, and this modification
+ is retained on return if the ancestor directories could not be
+ created.
+
+ Create DIR as a new directory with using mkdir with permissions
+ MODE. It is also OK if MAKE_ANCESTOR is not null and a
+ directory DIR already exists.
+
+ Call ANNOUNCE (DIR, OPTIONS) just after successfully making DIR,
+ even if some of the following actions fail.
+
+ Set DIR's owner to OWNER and group to GROUP, but leave the owner
+ alone if OWNER is (uid_t) -1, and similarly for GROUP.
+
+ Set DIR's mode bits to MODE, except preserve any of the bits that
+ correspond to zero bits in MODE_BITS. In other words, MODE_BITS is
+ a mask that specifies which of DIR's mode bits should be set or
+ cleared. MODE should be a subset of MODE_BITS, which in turn
+ should be a subset of CHMOD_MODE_BITS. Changing the mode in this
+ way is necessary if DIR already existed or if MODE and MODE_BITS
+ specify non-permissions bits like S_ISUID.
+
+ However, if PRESERVE_EXISTING is true and DIR already exists,
+ do not attempt to set DIR's ownership and file mode bits.
+
+ This implementation assumes the current umask is zero.
+
+ Return true if DIR exists as a directory with the proper ownership
+ and file mode bits when done, or if a child process has been
+ dispatched to do the real work (though the child process may not
+ have finished yet -- it is the caller's responsibility to handle
+ this). Report a diagnostic and return false on failure, storing
+ '\0' into *DIR if an ancestor directory had problems. */
+
+bool
+make_dir_parents (char *dir,
+ struct savewd *wd,
+ int (*make_ancestor) (char const *, char const *, void *),
+ void *options,
+ mode_t mode,
+ void (*announce) (char const *, void *),
+ mode_t mode_bits,
+ uid_t owner,
+ gid_t group,
+ bool preserve_existing)
+{
+ int mkdir_errno = (IS_ABSOLUTE_FILE_NAME (dir) ? 0 : savewd_errno (wd));
+
+ if (mkdir_errno == 0)
+ {
+ ptrdiff_t prefix_len = 0;
+ int savewd_chdir_options = (HAVE_FCHMOD ? SAVEWD_CHDIR_SKIP_READABLE : 0);
+
+ if (make_ancestor)
+ {
+ prefix_len = mkancesdirs (dir, wd, make_ancestor, options);
+ if (prefix_len < 0)
+ {
+ if (prefix_len < -1)
+ return true;
+ mkdir_errno = errno;
+ }
+ }
+
+ if (0 <= prefix_len)
+ {
+ /* If the ownership might change, or if the directory will be
+ writeable to other users and its special mode bits may
+ change after the directory is created, create it with
+ more restrictive permissions at first, so unauthorized
+ users cannot nip in before the directory is ready. */
+ bool keep_owner = owner == (uid_t) -1 && group == (gid_t) -1;
+ bool keep_special_mode_bits =
+ ((mode_bits & (S_ISUID | S_ISGID)) | (mode & S_ISVTX)) == 0;
+ mode_t mkdir_mode = mode;
+ if (! keep_owner)
+ mkdir_mode &= ~ (S_IRWXG | S_IRWXO);
+ else if (! keep_special_mode_bits)
+ mkdir_mode &= ~ (S_IWGRP | S_IWOTH);
+
+ if (mkdir (dir + prefix_len, mkdir_mode) == 0)
+ {
+ announce (dir, options);
+ preserve_existing = keep_owner & keep_special_mode_bits;
+ savewd_chdir_options |=
+ (SAVEWD_CHDIR_NOFOLLOW
+ | (mode & S_IRUSR ? SAVEWD_CHDIR_READABLE : 0));
+ }
+ else
+ {
+ mkdir_errno = errno;
+ mkdir_mode = -1;
+ }
+
+ if (preserve_existing)
+ {
+ struct stat st;
+ if (mkdir_errno == 0
+ || (mkdir_errno != ENOENT && make_ancestor
+ && stat (dir + prefix_len, &st) == 0
+ && S_ISDIR (st.st_mode)))
+ return true;
+ }
+ else
+ {
+ int open_result[2];
+ int chdir_result =
+ savewd_chdir (wd, dir + prefix_len,
+ savewd_chdir_options, open_result);
+ if (chdir_result < -1)
+ return true;
+ else
+ {
+ bool chdir_ok = (chdir_result == 0);
+ int chdir_errno = errno;
+ int fd = open_result[0];
+ bool chdir_failed_unexpectedly =
+ (mkdir_errno == 0
+ && ((! chdir_ok && (mode & S_IXUSR))
+ || (fd < 0 && (mode & S_IRUSR))));
+
+ if (chdir_failed_unexpectedly)
+ {
+ /* No need to save errno here; it's irrelevant. */
+ if (0 <= fd)
+ close (fd);
+ }
+ else
+ {
+ char const *subdir = (chdir_ok ? "." : dir + prefix_len);
+ if (dirchownmod (fd, subdir, mkdir_mode, owner, group,
+ mode, mode_bits)
+ == 0)
+ return true;
+ }
+
+ if (mkdir_errno == 0
+ || (mkdir_errno != ENOENT && make_ancestor
+ && errno != ENOTDIR))
+ {
+ error (0,
+ (! chdir_failed_unexpectedly ? errno
+ : ! chdir_ok && (mode & S_IXUSR) ? chdir_errno
+ : open_result[1]),
+ _(keep_owner
+ ? "cannot change permissions of %s"
+ : "cannot change owner and permissions of %s"),
+ quote (dir));
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ error (0, mkdir_errno, _("cannot create directory %s"), quote (dir));
+ return false;
+}
diff --git a/gnulib/lib/mkdir-p.h b/gnulib/lib/mkdir-p.h
new file mode 100644
index 00000000..26d3b469
--- /dev/null
+++ b/gnulib/lib/mkdir-p.h
@@ -0,0 +1,35 @@
+/* mkdir-p.h -- Ensure that a directory and its parents exist.
+
+ Copyright (C) 1994-1997, 2000, 2003-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert, David MacKenzie, and Jim Meyering. */
+
+#include <stdbool.h>
+#include <sys/types.h>
+
+struct savewd;
+bool make_dir_parents (char *dir,
+ struct savewd *wd,
+ int (*make_ancestor) (char const *, char const *,
+ void *),
+ void *options,
+ mode_t mode,
+ void (*announce) (char const *, void *),
+ mode_t mode_bits,
+ uid_t owner,
+ gid_t group,
+ bool preserve_existing);
diff --git a/gnulib/lib/mkdir.c b/gnulib/lib/mkdir.c
new file mode 100644
index 00000000..b117b76b
--- /dev/null
+++ b/gnulib/lib/mkdir.c
@@ -0,0 +1,92 @@
+/* On some systems, mkdir ("foo/", 0700) fails because of the trailing
+ slash. On those systems, this wrapper removes the trailing slash.
+
+ Copyright (C) 2001, 2003, 2006, 2008-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "dirname.h"
+
+/* Disable the definition of mkdir to rpl_mkdir (from the <sys/stat.h>
+ substitute) in this file. Otherwise, we'd get an endless recursion. */
+#undef mkdir
+
+/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
+ Additionally, it declares _mkdir (and depending on compile flags, an
+ alias mkdir), only in the nonstandard io.h. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define mkdir(name,mode) _mkdir (name)
+# define maybe_unused _GL_UNUSED
+#else
+# define maybe_unused /* empty */
+#endif
+
+/* This function is required at least for NetBSD 1.5.2. */
+
+int
+rpl_mkdir (char const *dir, mode_t mode maybe_unused)
+{
+ int ret_val;
+ char *tmp_dir;
+ size_t len = strlen (dir);
+
+ if (len && dir[len - 1] == '/')
+ {
+ tmp_dir = strdup (dir);
+ if (!tmp_dir)
+ {
+ /* Rather than rely on strdup-posix, we set errno ourselves. */
+ errno = ENOMEM;
+ return -1;
+ }
+ strip_trailing_slashes (tmp_dir);
+ }
+ else
+ {
+ tmp_dir = (char *) dir;
+ }
+#if FUNC_MKDIR_DOT_BUG
+ /* Additionally, cygwin 1.5 mistakenly creates a directory "d/./". */
+ {
+ char *last = last_component (tmp_dir);
+ if (*last == '.' && (last[1] == '\0'
+ || (last[1] == '.' && last[2] == '\0')))
+ {
+ struct stat st;
+ if (stat (tmp_dir, &st) == 0)
+ errno = EEXIST;
+ return -1;
+ }
+ }
+#endif /* FUNC_MKDIR_DOT_BUG */
+
+ ret_val = mkdir (tmp_dir, mode);
+
+ if (tmp_dir != dir)
+ free (tmp_dir);
+
+ return ret_val;
+}
diff --git a/gnulib/lib/mkdirat.c b/gnulib/lib/mkdirat.c
new file mode 100644
index 00000000..9e68222a
--- /dev/null
+++ b/gnulib/lib/mkdirat.c
@@ -0,0 +1,34 @@
+/* fd-relative mkdir
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+/* Solaris 10 has no function like this.
+ Create a subdirectory, FILE, with mode MODE, in the directory
+ open on descriptor FD. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mkdir/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+#define AT_FUNC_NAME mkdirat
+#define AT_FUNC_F1 mkdir
+#define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode
+#define AT_FUNC_POST_FILE_ARGS , mode
+#include "at-func.c"
diff --git a/gnulib/lib/mkdtemp.c b/gnulib/lib/mkdtemp.c
new file mode 100644
index 00000000..075cf32c
--- /dev/null
+++ b/gnulib/lib/mkdtemp.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 1999, 2001-2003, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+/* Extracted from misc/mkdtemp.c. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include "tempname.h"
+
+/* Generate a unique temporary directory from XTEMPLATE.
+ The last six characters of XTEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the filename unique.
+ The directory is created, mode 700, and its name is returned.
+ (This function comes from OpenBSD.) */
+char *
+mkdtemp (char *xtemplate)
+{
+ if (gen_tempname (xtemplate, 0, 0, GT_DIR))
+ return NULL;
+ else
+ return xtemplate;
+}
diff --git a/gnulib/lib/mkfifo.c b/gnulib/lib/mkfifo.c
new file mode 100644
index 00000000..aeffb84b
--- /dev/null
+++ b/gnulib/lib/mkfifo.c
@@ -0,0 +1,58 @@
+/* Create a named fifo.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <string.h>
+
+#if !HAVE_MKFIFO
+/* Mingw lacks mkfifo; always fail with ENOSYS. */
+
+int
+mkfifo (char const *name _GL_UNUSED, mode_t mode _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_MKFIFO */
+
+# undef mkfifo
+
+/* Create a named fifo FILE, with access permissions in MODE. Work
+around trailing slash bugs. */
+
+int
+rpl_mkfifo (char const *name, mode_t mode)
+{
+# if MKFIFO_TRAILING_SLASH_BUG
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ struct stat st;
+ if (stat (name, &st) == 0)
+ errno = EEXIST;
+ return -1;
+ }
+# endif
+ return mkfifo (name, mode);
+}
+#endif /* HAVE_MKFIFO */
diff --git a/gnulib/lib/mkfifoat.c b/gnulib/lib/mkfifoat.c
new file mode 100644
index 00000000..8a0348db
--- /dev/null
+++ b/gnulib/lib/mkfifoat.c
@@ -0,0 +1,55 @@
+/* Create a named fifo relative to an open directory.
+ Copyright (C) 2009-2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#if !HAVE_MKFIFO
+
+# include <errno.h>
+
+/* Mingw lacks mkfifo, so this wrapper is trivial. */
+
+int
+mkfifoat (int fd _GL_UNUSED, char const *path _GL_UNUSED,
+ mode_t mode _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_MKFIFO */
+
+/* Create a named fifo FILE relative to directory FD, with access
+ permissions in MODE. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mkfifo/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+# define AT_FUNC_NAME mkfifoat
+# define AT_FUNC_F1 mkfifo
+# define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode
+# define AT_FUNC_POST_FILE_ARGS , mode
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* HAVE_MKFIFO */
diff --git a/gnulib/lib/mknod.c b/gnulib/lib/mknod.c
new file mode 100644
index 00000000..39e8cddf
--- /dev/null
+++ b/gnulib/lib/mknod.c
@@ -0,0 +1,74 @@
+/* Create a device inode.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <string.h>
+
+#if !HAVE_MKNOD
+/* Mingw lacks mknod; always fail with ENOSYS. */
+
+int
+mknod (char const *name _GL_UNUSED, mode_t mode _GL_UNUSED,
+ dev_t dev _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_MKNOD */
+
+# undef mknod
+
+/* Create a file system node FILE, with access permissions and file
+ type in MODE, and device type in DEV. Usually, non-root
+ applications can only create named fifos (mode includes S_IFIFO),
+ with DEV set to 0. Also work around trailing slash bugs. */
+
+int
+rpl_mknod (char const *name, mode_t mode, dev_t dev)
+{
+# if MKFIFO_TRAILING_SLASH_BUG
+ /* Trailing slash only makes sense for directories. Of course,
+ using mknod to create a directory is not very portable, so it may
+ still fail later on. */
+ if (!S_ISDIR (mode))
+ {
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ struct stat st;
+ if (stat (name, &st) == 0)
+ errno = EEXIST;
+ return -1;
+ }
+ }
+# endif
+# if MKNOD_FIFO_BUG
+ /* POSIX requires mknod to create fifos for non-privileged
+ processes, but BSD implementations fail with EPERM. */
+ if (S_ISFIFO (mode) && dev == 0)
+ return mkfifo (name, mode & ~S_IFIFO);
+# endif
+ return mknod (name, mode, dev);
+}
+
+#endif /* HAVE_MKNOD */
diff --git a/gnulib/lib/mknodat.c b/gnulib/lib/mknodat.c
new file mode 100644
index 00000000..a90d7fd2
--- /dev/null
+++ b/gnulib/lib/mknodat.c
@@ -0,0 +1,57 @@
+/* Create an inode relative to an open directory.
+ Copyright (C) 2009-2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#if !HAVE_MKNOD
+
+# include <errno.h>
+
+/* Mingw lacks mknod, so this wrapper is trivial. */
+
+int
+mknodat (int fd _GL_UNUSED, char const *path _GL_UNUSED,
+ mode_t mode _GL_UNUSED, dev_t dev _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_MKFIFO */
+
+/* Create a file system node FILE relative to directory FD, with
+ access permissions and file type in MODE, and device type in DEV.
+ Usually, non-root applications can only create named fifos, with
+ DEV set to 0. If possible, create the node without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mknod/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+# define AT_FUNC_NAME mknodat
+# define AT_FUNC_F1 mknod
+# define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, dev_t dev
+# define AT_FUNC_POST_FILE_ARGS , mode, dev
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* HAVE_MKFIFO */
diff --git a/gnulib/lib/mkostemp.c b/gnulib/lib/mkostemp.c
new file mode 100644
index 00000000..e4cc9e19
--- /dev/null
+++ b/gnulib/lib/mkostemp.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GTFILE
+# define __GT_FILE GT_FILE
+# endif
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE.
+ The last six characters of XTEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ Then open the file and return a fd. */
+int
+mkostemp (char *xtemplate, int flags)
+{
+ return __gen_tempname (xtemplate, 0, flags, __GT_FILE);
+}
diff --git a/gnulib/lib/mkostemps.c b/gnulib/lib/mkostemps.c
new file mode 100644
index 00000000..fb83014b
--- /dev/null
+++ b/gnulib/lib/mkostemps.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1998, 1999, 2001, 2005, 2006, 2007, 2009, 2010 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include <errno.h>
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GT_FILE
+# define __GT_FILE GT_FILE
+# endif
+# define __set_errno(x) errno = x;
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE. The last six
+ characters before a suffix of length SUFFIXLEN of XTEMPLATE must be
+ "XXXXXX"; they are replaced with a string that makes the filename
+ unique. Then open the file and return a fd. */
+int
+mkostemps (char *xtemplate, int suffixlen, int flags)
+{
+ if (suffixlen < 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ return __gen_tempname (xtemplate, suffixlen, flags, __GT_FILE);
+}
diff --git a/gnulib/lib/mkstemp-safer.c b/gnulib/lib/mkstemp-safer.c
new file mode 100644
index 00000000..47d3b2c6
--- /dev/null
+++ b/gnulib/lib/mkstemp-safer.c
@@ -0,0 +1,63 @@
+/* Invoke mkstemp, but avoid some glitches.
+
+ Copyright (C) 2005-2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "stdlib-safer.h"
+
+#include <stdlib.h>
+#include "unistd-safer.h"
+
+/* Like mkstemp, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+
+int
+mkstemp_safer (char *templ)
+{
+ return fd_safer (mkstemp (templ));
+}
+
+#if GNULIB_MKOSTEMP
+/* Like mkostemp, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+int
+mkostemp_safer (char *templ, int flags)
+{
+ return fd_safer_flag (mkostemp (templ, flags), flags);
+}
+#endif
+
+#if GNULIB_MKOSTEMPS
+/* Like mkostemps, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+int
+mkostemps_safer (char *templ, int suffixlen, int flags)
+{
+ return fd_safer_flag (mkostemps (templ, suffixlen, flags), flags);
+}
+#endif
+
+#if GNULIB_MKSTEMPS
+/* Like mkstemps, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+int mkstemps_safer (char *templ, int suffixlen)
+{
+ return fd_safer (mkstemps (templ, suffixlen));
+}
+#endif
diff --git a/gnulib/lib/mkstemp.c b/gnulib/lib/mkstemp.c
new file mode 100644
index 00000000..c1dc7964
--- /dev/null
+++ b/gnulib/lib/mkstemp.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GT_FILE
+# define __GT_FILE GT_FILE
+# endif
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE.
+ The last six characters of XTEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ Then open the file and return a fd. */
+int
+mkstemp (char *xtemplate)
+{
+ return __gen_tempname (xtemplate, 0, 0, __GT_FILE);
+}
diff --git a/gnulib/lib/mkstemps.c b/gnulib/lib/mkstemps.c
new file mode 100644
index 00000000..7e30c987
--- /dev/null
+++ b/gnulib/lib/mkstemps.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1998, 1999, 2001, 2005, 2006, 2007, 2009, 2010 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include <errno.h>
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GT_FILE
+# define __GT_FILE GT_FILE
+# endif
+# define __set_errno(x) errno = x;
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE. The last six
+ characters before a suffix of length SUFFIXLEN of XTEMPLATE must be
+ "XXXXXX"; they are replaced with a string that makes the filename
+ unique. Then open the file and return a fd. */
+int
+mkstemps (char *xtemplate, int suffixlen)
+{
+ if (suffixlen < 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ return __gen_tempname (xtemplate, suffixlen, 0, __GT_FILE);
+}
diff --git a/gnulib/lib/mktime-internal.h b/gnulib/lib/mktime-internal.h
new file mode 100644
index 00000000..4287acf4
--- /dev/null
+++ b/gnulib/lib/mktime-internal.h
@@ -0,0 +1,4 @@
+#include <time.h>
+time_t mktime_internal (struct tm *,
+ struct tm * (*) (time_t const *, struct tm *),
+ time_t *);
diff --git a/gnulib/lib/mktime.c b/gnulib/lib/mktime.c
new file mode 100644
index 00000000..5c1d947a
--- /dev/null
+++ b/gnulib/lib/mktime.c
@@ -0,0 +1,669 @@
+/* Convert a `struct tm' to a time_t value.
+ Copyright (C) 1993-1999, 2002-2007, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Paul Eggert <eggert@twinsun.com>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Define this to have a standalone program to test this implementation of
+ mktime. */
+/* #define DEBUG 1 */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Assume that leap seconds are possible, unless told otherwise.
+ If the host has a `zic' command with a `-L leapsecondfilename' option,
+ then it supports leap seconds; otherwise it probably doesn't. */
+#ifndef LEAP_SECONDS_POSSIBLE
+# define LEAP_SECONDS_POSSIBLE 1
+#endif
+
+#include <time.h>
+
+#include <limits.h>
+
+#include <string.h> /* For the real memcpy prototype. */
+
+#if DEBUG
+# include <stdio.h>
+# include <stdlib.h>
+/* Make it work even if the system's libc has its own mktime routine. */
+# define mktime my_mktime
+#endif /* DEBUG */
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that INT_BITS is at least 32.
+
+ ISO C99 says that A >> B is implementation-defined if A < 0. Some
+ implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
+ right in the usual way when A < 0, so SHR falls back on division if
+ ordinary A >> B doesn't seem to be the usual signed shift. */
+#define SHR(a, b) \
+ (-1 >> 1 == -1 \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+/* The extra casts in the following macros work around compiler bugs,
+ e.g., in Cray C 5.0.3.0. */
+
+/* True if the arithmetic type T is an integer type. bool counts as
+ an integer. */
+#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
+
+/* True if negative values of the signed integer type T use two's
+ complement, ones' complement, or signed magnitude representation,
+ respectively. Much GNU code assumes two's complement, but some
+ people like to be portable to all possible C hosts. */
+#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
+#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+
+/* True if the arithmetic type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* The maximum and minimum values for the integer type T. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+#define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+#define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+
+#ifndef TIME_T_MIN
+# define TIME_T_MIN TYPE_MINIMUM (time_t)
+#endif
+#ifndef TIME_T_MAX
+# define TIME_T_MAX TYPE_MAXIMUM (time_t)
+#endif
+#define TIME_T_MIDPOINT (SHR (TIME_T_MIN + TIME_T_MAX, 1) + 1)
+
+/* Verify a requirement at compile-time (unlike assert, which is runtime). */
+#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
+
+verify (time_t_is_integer, TYPE_IS_INTEGER (time_t));
+verify (twos_complement_arithmetic, TYPE_TWOS_COMPLEMENT (int));
+/* The code also assumes that signed integer overflow silently wraps
+ around, but this assumption can't be stated without causing a
+ diagnostic on some hosts. */
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+verify (base_year_is_a_multiple_of_100, TM_YEAR_BASE % 100 == 0);
+
+/* Return 1 if YEAR + TM_YEAR_BASE is a leap year. */
+static inline int
+leapyear (long int year)
+{
+ /* Don't add YEAR to TM_YEAR_BASE, as that might overflow.
+ Also, work even if YEAR is negative. */
+ return
+ ((year & 3) == 0
+ && (year % 100 != 0
+ || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3)));
+}
+
+/* How many days come before each month (0-12). */
+#ifndef _LIBC
+static
+#endif
+const unsigned short int __mon_yday[2][13] =
+ {
+ /* Normal years. */
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+ /* Leap years. */
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+ };
+
+
+#ifndef _LIBC
+/* Portable standalone applications should supply a <time.h> that
+ declares a POSIX-compliant localtime_r, for the benefit of older
+ implementations that lack localtime_r or have a nonstandard one.
+ See the gnulib time_r module for one way to implement this. */
+# undef __localtime_r
+# define __localtime_r localtime_r
+# define __mktime_internal mktime_internal
+# include "mktime-internal.h"
+#endif
+
+/* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) -
+ (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks
+ were not adjusted between the time stamps.
+
+ The YEAR values uses the same numbering as TP->tm_year. Values
+ need not be in the usual range. However, YEAR1 must not be less
+ than 2 * INT_MIN or greater than 2 * INT_MAX.
+
+ The result may overflow. It is the caller's responsibility to
+ detect overflow. */
+
+static inline time_t
+ydhms_diff (long int year1, long int yday1, int hour1, int min1, int sec1,
+ int year0, int yday0, int hour0, int min0, int sec0)
+{
+ verify (C99_integer_division, -1 / 2 == 0);
+#if 0 /* This assertion fails on 32-bit systems with 64-bit time_t, such as
+ NetBSD 5 on i386. */
+ verify (long_int_year_and_yday_are_wide_enough,
+ INT_MAX <= LONG_MAX / 2 || TIME_T_MAX <= UINT_MAX);
+#endif
+
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid integer overflow here. */
+ int a4 = SHR (year1, 2) + SHR (TM_YEAR_BASE, 2) - ! (year1 & 3);
+ int b4 = SHR (year0, 2) + SHR (TM_YEAR_BASE, 2) - ! (year0 & 3);
+ int a100 = a4 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 0);
+ int a400 = SHR (a100, 2);
+ int b400 = SHR (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+
+ /* Compute the desired time in time_t precision. Overflow might
+ occur here. */
+ time_t tyear1 = year1;
+ time_t years = tyear1 - year0;
+ time_t days = 365 * years + yday1 - yday0 + intervening_leap_days;
+ time_t hours = 24 * days + hour1 - hour0;
+ time_t minutes = 60 * hours + min1 - min0;
+ time_t seconds = 60 * minutes + sec1 - sec0;
+ return seconds;
+}
+
+
+/* Return a time_t value corresponding to (YEAR-YDAY HOUR:MIN:SEC),
+ assuming that *T corresponds to *TP and that no clock adjustments
+ occurred between *TP and the desired time.
+ If TP is null, return a value not equal to *T; this avoids false matches.
+ If overflow occurs, yield the minimal or maximal value, except do not
+ yield a value equal to *T. */
+static time_t
+guess_time_tm (long int year, long int yday, int hour, int min, int sec,
+ const time_t *t, const struct tm *tp)
+{
+ if (tp)
+ {
+ time_t d = ydhms_diff (year, yday, hour, min, sec,
+ tp->tm_year, tp->tm_yday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec);
+ time_t t1 = *t + d;
+ if ((t1 < *t) == (TYPE_SIGNED (time_t) ? d < 0 : TIME_T_MAX / 2 < d))
+ return t1;
+ }
+
+ /* Overflow occurred one way or another. Return the nearest result
+ that is actually in range, except don't report a zero difference
+ if the actual difference is nonzero, as that would cause a false
+ match; and don't oscillate between two values, as that would
+ confuse the spring-forward gap detector. */
+ return (*t < TIME_T_MIDPOINT
+ ? (*t <= TIME_T_MIN + 1 ? *t + 1 : TIME_T_MIN)
+ : (TIME_T_MAX - 1 <= *t ? *t - 1 : TIME_T_MAX));
+}
+
+/* Use CONVERT to convert *T to a broken down time in *TP.
+ If *T is out of range for conversion, adjust it so that
+ it is the nearest in-range value and then convert that. */
+static struct tm *
+ranged_convert (struct tm *(*convert) (const time_t *, struct tm *),
+ time_t *t, struct tm *tp)
+{
+ struct tm *r = convert (t, tp);
+
+ if (!r && *t)
+ {
+ time_t bad = *t;
+ time_t ok = 0;
+
+ /* BAD is a known unconvertible time_t, and OK is a known good one.
+ Use binary search to narrow the range between BAD and OK until
+ they differ by 1. */
+ while (bad != ok + (bad < 0 ? -1 : 1))
+ {
+ time_t mid = *t = (bad < 0
+ ? bad + ((ok - bad) >> 1)
+ : ok + ((bad - ok) >> 1));
+ r = convert (t, tp);
+ if (r)
+ ok = mid;
+ else
+ bad = mid;
+ }
+
+ if (!r && ok)
+ {
+ /* The last conversion attempt failed;
+ revert to the most recent successful attempt. */
+ *t = ok;
+ r = convert (t, tp);
+ }
+ }
+
+ return r;
+}
+
+
+/* Convert *TP to a time_t value, inverting
+ the monotonic and mostly-unit-linear conversion function CONVERT.
+ Use *OFFSET to keep track of a guess at the offset of the result,
+ compared to what the result would be for UTC without leap seconds.
+ If *OFFSET's guess is correct, only one CONVERT call is needed.
+ This function is external because it is used also by timegm.c. */
+time_t
+__mktime_internal (struct tm *tp,
+ struct tm *(*convert) (const time_t *, struct tm *),
+ time_t *offset)
+{
+ time_t t, gt, t0, t1, t2;
+ struct tm tm;
+
+ /* The maximum number of probes (calls to CONVERT) should be enough
+ to handle any combinations of time zone rule changes, solar time,
+ leap seconds, and oscillations around a spring-forward gap.
+ POSIX.1 prohibits leap seconds, but some hosts have them anyway. */
+ int remaining_probes = 6;
+
+ /* Time requested. Copy it in case CONVERT modifies *TP; this can
+ occur if TP is localtime's returned value and CONVERT is localtime. */
+ int sec = tp->tm_sec;
+ int min = tp->tm_min;
+ int hour = tp->tm_hour;
+ int mday = tp->tm_mday;
+ int mon = tp->tm_mon;
+ int year_requested = tp->tm_year;
+ /* Normalize the value. */
+ int isdst = ((tp->tm_isdst >> (8 * sizeof (tp->tm_isdst) - 1))
+ | (tp->tm_isdst != 0));
+
+ /* 1 if the previous probe was DST. */
+ int dst2;
+
+ /* Ensure that mon is in range, and set year accordingly. */
+ int mon_remainder = mon % 12;
+ int negative_mon_remainder = mon_remainder < 0;
+ int mon_years = mon / 12 - negative_mon_remainder;
+ long int lyear_requested = year_requested;
+ long int year = lyear_requested + mon_years;
+
+ /* The other values need not be in range:
+ the remaining code handles minor overflows correctly,
+ assuming int and time_t arithmetic wraps around.
+ Major overflows are caught at the end. */
+
+ /* Calculate day of year from year, month, and day of month.
+ The result need not be in range. */
+ int mon_yday = ((__mon_yday[leapyear (year)]
+ [mon_remainder + 12 * negative_mon_remainder])
+ - 1);
+ long int lmday = mday;
+ long int yday = mon_yday + lmday;
+
+ time_t guessed_offset = *offset;
+
+ int sec_requested = sec;
+
+ if (LEAP_SECONDS_POSSIBLE)
+ {
+ /* Handle out-of-range seconds specially,
+ since ydhms_tm_diff assumes every minute has 60 seconds. */
+ if (sec < 0)
+ sec = 0;
+ if (59 < sec)
+ sec = 59;
+ }
+
+ /* Invert CONVERT by probing. First assume the same offset as last
+ time. */
+
+ t0 = ydhms_diff (year, yday, hour, min, sec,
+ EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, - guessed_offset);
+
+ if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3)
+ {
+ /* time_t isn't large enough to rule out overflows, so check
+ for major overflows. A gross check suffices, since if t0
+ has overflowed, it is off by a multiple of TIME_T_MAX -
+ TIME_T_MIN + 1. So ignore any component of the difference
+ that is bounded by a small value. */
+
+ /* Approximate log base 2 of the number of time units per
+ biennium. A biennium is 2 years; use this unit instead of
+ years to avoid integer overflow. For example, 2 average
+ Gregorian years are 2 * 365.2425 * 24 * 60 * 60 seconds,
+ which is 63113904 seconds, and rint (log2 (63113904)) is
+ 26. */
+ int ALOG2_SECONDS_PER_BIENNIUM = 26;
+ int ALOG2_MINUTES_PER_BIENNIUM = 20;
+ int ALOG2_HOURS_PER_BIENNIUM = 14;
+ int ALOG2_DAYS_PER_BIENNIUM = 10;
+ int LOG2_YEARS_PER_BIENNIUM = 1;
+
+ int approx_requested_biennia =
+ (SHR (year_requested, LOG2_YEARS_PER_BIENNIUM)
+ - SHR (EPOCH_YEAR - TM_YEAR_BASE, LOG2_YEARS_PER_BIENNIUM)
+ + SHR (mday, ALOG2_DAYS_PER_BIENNIUM)
+ + SHR (hour, ALOG2_HOURS_PER_BIENNIUM)
+ + SHR (min, ALOG2_MINUTES_PER_BIENNIUM)
+ + (LEAP_SECONDS_POSSIBLE
+ ? 0
+ : SHR (sec, ALOG2_SECONDS_PER_BIENNIUM)));
+
+ int approx_biennia = SHR (t0, ALOG2_SECONDS_PER_BIENNIUM);
+ int diff = approx_biennia - approx_requested_biennia;
+ int abs_diff = diff < 0 ? - diff : diff;
+
+ /* IRIX 4.0.5 cc miscaculates TIME_T_MIN / 3: it erroneously
+ gives a positive value of 715827882. Setting a variable
+ first then doing math on it seems to work.
+ (ghazi@caip.rutgers.edu) */
+ time_t time_t_max = TIME_T_MAX;
+ time_t time_t_min = TIME_T_MIN;
+ time_t overflow_threshold =
+ (time_t_max / 3 - time_t_min / 3) >> ALOG2_SECONDS_PER_BIENNIUM;
+
+ if (overflow_threshold < abs_diff)
+ {
+ /* Overflow occurred. Try repairing it; this might work if
+ the time zone offset is enough to undo the overflow. */
+ time_t repaired_t0 = -1 - t0;
+ approx_biennia = SHR (repaired_t0, ALOG2_SECONDS_PER_BIENNIUM);
+ diff = approx_biennia - approx_requested_biennia;
+ abs_diff = diff < 0 ? - diff : diff;
+ if (overflow_threshold < abs_diff)
+ return -1;
+ guessed_offset += repaired_t0 - t0;
+ t0 = repaired_t0;
+ }
+ }
+
+ /* Repeatedly use the error to improve the guess. */
+
+ for (t = t1 = t2 = t0, dst2 = 0;
+ (gt = guess_time_tm (year, yday, hour, min, sec, &t,
+ ranged_convert (convert, &t, &tm)),
+ t != gt);
+ t1 = t2, t2 = t, t = gt, dst2 = tm.tm_isdst != 0)
+ if (t == t1 && t != t2
+ && (tm.tm_isdst < 0
+ || (isdst < 0
+ ? dst2 <= (tm.tm_isdst != 0)
+ : (isdst != 0) != (tm.tm_isdst != 0))))
+ /* We can't possibly find a match, as we are oscillating
+ between two values. The requested time probably falls
+ within a spring-forward gap of size GT - T. Follow the common
+ practice in this case, which is to return a time that is GT - T
+ away from the requested time, preferring a time whose
+ tm_isdst differs from the requested value. (If no tm_isdst
+ was requested and only one of the two values has a nonzero
+ tm_isdst, prefer that value.) In practice, this is more
+ useful than returning -1. */
+ goto offset_found;
+ else if (--remaining_probes == 0)
+ return -1;
+
+ /* We have a match. Check whether tm.tm_isdst has the requested
+ value, if any. */
+ if (isdst != tm.tm_isdst && 0 <= isdst && 0 <= tm.tm_isdst)
+ {
+ /* tm.tm_isdst has the wrong value. Look for a neighboring
+ time with the right value, and use its UTC offset.
+
+ Heuristic: probe the adjacent timestamps in both directions,
+ looking for the desired isdst. This should work for all real
+ time zone histories in the tz database. */
+
+ /* Distance between probes when looking for a DST boundary. In
+ tzdata2003a, the shortest period of DST is 601200 seconds
+ (e.g., America/Recife starting 2000-10-08 01:00), and the
+ shortest period of non-DST surrounded by DST is 694800
+ seconds (Africa/Tunis starting 1943-04-17 01:00). Use the
+ minimum of these two values, so we don't miss these short
+ periods when probing. */
+ int stride = 601200;
+
+ /* The longest period of DST in tzdata2003a is 536454000 seconds
+ (e.g., America/Jujuy starting 1946-10-01 01:00). The longest
+ period of non-DST is much longer, but it makes no real sense
+ to search for more than a year of non-DST, so use the DST
+ max. */
+ int duration_max = 536454000;
+
+ /* Search in both directions, so the maximum distance is half
+ the duration; add the stride to avoid off-by-1 problems. */
+ int delta_bound = duration_max / 2 + stride;
+
+ int delta, direction;
+
+ for (delta = stride; delta < delta_bound; delta += stride)
+ for (direction = -1; direction <= 1; direction += 2)
+ {
+ time_t ot = t + delta * direction;
+ if ((ot < t) == (direction < 0))
+ {
+ struct tm otm;
+ ranged_convert (convert, &ot, &otm);
+ if (otm.tm_isdst == isdst)
+ {
+ /* We found the desired tm_isdst.
+ Extrapolate back to the desired time. */
+ t = guess_time_tm (year, yday, hour, min, sec, &ot, &otm);
+ ranged_convert (convert, &t, &tm);
+ goto offset_found;
+ }
+ }
+ }
+ }
+
+ offset_found:
+ *offset = guessed_offset + t - t0;
+
+ if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec)
+ {
+ /* Adjust time to reflect the tm_sec requested, not the normalized value.
+ Also, repair any damage from a false match due to a leap second. */
+ int sec_adjustment = (sec == 0 && tm.tm_sec == 60) - sec;
+ t1 = t + sec_requested;
+ t2 = t1 + sec_adjustment;
+ if (((t1 < t) != (sec_requested < 0))
+ | ((t2 < t1) != (sec_adjustment < 0))
+ | ! convert (&t2, &tm))
+ return -1;
+ t = t2;
+ }
+
+ *tp = tm;
+ return t;
+}
+
+
+/* FIXME: This should use a signed type wide enough to hold any UTC
+ offset in seconds. 'int' should be good enough for GNU code. We
+ can't fix this unilaterally though, as other modules invoke
+ __mktime_internal. */
+static time_t localtime_offset;
+
+/* Convert *TP to a time_t value. */
+time_t
+mktime (struct tm *tp)
+{
+#ifdef _LIBC
+ /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
+ time zone names contained in the external variable `tzname' shall
+ be set as if the tzset() function had been called. */
+ __tzset ();
+#endif
+
+ return __mktime_internal (tp, __localtime_r, &localtime_offset);
+}
+
+#ifdef weak_alias
+weak_alias (mktime, timelocal)
+#endif
+
+#ifdef _LIBC
+libc_hidden_def (mktime)
+libc_hidden_weak (timelocal)
+#endif
+
+#if DEBUG
+
+static int
+not_equal_tm (const struct tm *a, const struct tm *b)
+{
+ return ((a->tm_sec ^ b->tm_sec)
+ | (a->tm_min ^ b->tm_min)
+ | (a->tm_hour ^ b->tm_hour)
+ | (a->tm_mday ^ b->tm_mday)
+ | (a->tm_mon ^ b->tm_mon)
+ | (a->tm_year ^ b->tm_year)
+ | (a->tm_yday ^ b->tm_yday)
+ | (a->tm_isdst ^ b->tm_isdst));
+}
+
+static void
+print_tm (const struct tm *tp)
+{
+ if (tp)
+ printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
+ tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec,
+ tp->tm_yday, tp->tm_wday, tp->tm_isdst);
+ else
+ printf ("0");
+}
+
+static int
+check_result (time_t tk, struct tm tmk, time_t tl, const struct tm *lt)
+{
+ if (tk != tl || !lt || not_equal_tm (&tmk, lt))
+ {
+ printf ("mktime (");
+ print_tm (lt);
+ printf (")\nyields (");
+ print_tm (&tmk);
+ printf (") == %ld, should be %ld\n", (long int) tk, (long int) tl);
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+ int status = 0;
+ struct tm tm, tmk, tml;
+ struct tm *lt;
+ time_t tk, tl, tl1;
+ char trailer;
+
+ if ((argc == 3 || argc == 4)
+ && (sscanf (argv[1], "%d-%d-%d%c",
+ &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
+ == 3)
+ && (sscanf (argv[2], "%d:%d:%d%c",
+ &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
+ == 3))
+ {
+ tm.tm_year -= TM_YEAR_BASE;
+ tm.tm_mon--;
+ tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
+ tmk = tm;
+ tl = mktime (&tmk);
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tml = *lt;
+ lt = &tml;
+ }
+ printf ("mktime returns %ld == ", (long int) tl);
+ print_tm (&tmk);
+ printf ("\n");
+ status = check_result (tl, tmk, tl, lt);
+ }
+ else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
+ {
+ time_t from = atol (argv[1]);
+ time_t by = atol (argv[2]);
+ time_t to = atol (argv[3]);
+
+ if (argc == 4)
+ for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
+ {
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tmk = tml = *lt;
+ tk = mktime (&tmk);
+ status |= check_result (tk, tmk, tl, &tml);
+ }
+ else
+ {
+ printf ("localtime (%ld) yields 0\n", (long int) tl);
+ status = 1;
+ }
+ tl1 = tl + by;
+ if ((tl1 < tl) != (by < 0))
+ break;
+ }
+ else
+ for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
+ {
+ /* Null benchmark. */
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tmk = tml = *lt;
+ tk = tl;
+ status |= check_result (tk, tmk, tl, &tml);
+ }
+ else
+ {
+ printf ("localtime (%ld) yields 0\n", (long int) tl);
+ status = 1;
+ }
+ tl1 = tl + by;
+ if ((tl1 < tl) != (by < 0))
+ break;
+ }
+ }
+ else
+ printf ("Usage:\
+\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\
+\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\
+\t%s FROM BY TO - # Do not test those values (for benchmark).\n",
+ argv[0], argv[0], argv[0]);
+
+ return status;
+}
+
+#endif /* DEBUG */
+
+/*
+Local Variables:
+compile-command: "gcc -DDEBUG -Wall -W -O -g mktime.c -o mktime"
+End:
+*/
diff --git a/gnulib/lib/modechange.c b/gnulib/lib/modechange.c
new file mode 100644
index 00000000..9b4e23f4
--- /dev/null
+++ b/gnulib/lib/modechange.c
@@ -0,0 +1,385 @@
+/* modechange.c -- file mode manipulation
+
+ Copyright (C) 1989-1990, 1997-1999, 2001, 2003-2006, 2009-2010 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/>. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu> */
+
+/* The ASCII mode string is compiled into an array of `struct
+ modechange', which can then be applied to each file to be changed.
+ We do this instead of re-parsing the ASCII string for each file
+ because the compiled form requires less computation to use; when
+ changing the mode of many files, this probably results in a
+ performance gain. */
+
+#include <config.h>
+
+#include "modechange.h"
+#include <sys/stat.h>
+#include "stat-macros.h"
+#include "xalloc.h"
+#include <stdlib.h>
+
+/* The traditional octal values corresponding to each mode bit. */
+#define SUID 04000
+#define SGID 02000
+#define SVTX 01000
+#define RUSR 00400
+#define WUSR 00200
+#define XUSR 00100
+#define RGRP 00040
+#define WGRP 00020
+#define XGRP 00010
+#define ROTH 00004
+#define WOTH 00002
+#define XOTH 00001
+#define ALLM 07777 /* all octal mode bits */
+
+/* Convert OCTAL, which uses one of the traditional octal values, to
+ an internal mode_t value. */
+static mode_t
+octal_to_mode (unsigned int octal)
+{
+ /* Help the compiler optimize the usual case where mode_t uses
+ the traditional octal representation. */
+ return ((S_ISUID == SUID && S_ISGID == SGID && S_ISVTX == SVTX
+ && S_IRUSR == RUSR && S_IWUSR == WUSR && S_IXUSR == XUSR
+ && S_IRGRP == RGRP && S_IWGRP == WGRP && S_IXGRP == XGRP
+ && S_IROTH == ROTH && S_IWOTH == WOTH && S_IXOTH == XOTH)
+ ? octal
+ : (mode_t) ((octal & SUID ? S_ISUID : 0)
+ | (octal & SGID ? S_ISGID : 0)
+ | (octal & SVTX ? S_ISVTX : 0)
+ | (octal & RUSR ? S_IRUSR : 0)
+ | (octal & WUSR ? S_IWUSR : 0)
+ | (octal & XUSR ? S_IXUSR : 0)
+ | (octal & RGRP ? S_IRGRP : 0)
+ | (octal & WGRP ? S_IWGRP : 0)
+ | (octal & XGRP ? S_IXGRP : 0)
+ | (octal & ROTH ? S_IROTH : 0)
+ | (octal & WOTH ? S_IWOTH : 0)
+ | (octal & XOTH ? S_IXOTH : 0)));
+}
+
+/* Special operations flags. */
+enum
+ {
+ /* For the sentinel at the end of the mode changes array. */
+ MODE_DONE,
+
+ /* The typical case. */
+ MODE_ORDINARY_CHANGE,
+
+ /* In addition to the typical case, affect the execute bits if at
+ least one execute bit is set already, or if the file is a
+ directory. */
+ MODE_X_IF_ANY_X,
+
+ /* Instead of the typical case, copy some existing permissions for
+ u, g, or o onto the other two. Which of u, g, or o is copied
+ is determined by which bits are set in the `value' field. */
+ MODE_COPY_EXISTING
+ };
+
+/* Description of a mode change. */
+struct mode_change
+{
+ char op; /* One of "=+-". */
+ char flag; /* Special operations flag. */
+ mode_t affected; /* Set for u, g, o, or a. */
+ mode_t value; /* Bits to add/remove. */
+ mode_t mentioned; /* Bits explicitly mentioned. */
+};
+
+/* Return a mode_change array with the specified `=ddd'-style
+ mode change operation, where NEW_MODE is `ddd' and MENTIONED
+ contains the bits explicitly mentioned in the mode are MENTIONED. */
+
+static struct mode_change *
+make_node_op_equals (mode_t new_mode, mode_t mentioned)
+{
+ struct mode_change *p = xmalloc (2 * sizeof *p);
+ p->op = '=';
+ p->flag = MODE_ORDINARY_CHANGE;
+ p->affected = CHMOD_MODE_BITS;
+ p->value = new_mode;
+ p->mentioned = mentioned;
+ p[1].flag = MODE_DONE;
+ return p;
+}
+
+/* Return a pointer to an array of file mode change operations created from
+ MODE_STRING, an ASCII string that contains either an octal number
+ specifying an absolute mode, or symbolic mode change operations with
+ the form:
+ [ugoa...][[+-=][rwxXstugo...]...][,...]
+
+ Return NULL if `mode_string' does not contain a valid
+ representation of file mode change operations. */
+
+struct mode_change *
+mode_compile (char const *mode_string)
+{
+ /* The array of mode-change directives to be returned. */
+ struct mode_change *mc;
+ size_t used = 0;
+
+ if ('0' <= *mode_string && *mode_string < '8')
+ {
+ unsigned int octal_mode = 0;
+ mode_t mode;
+ mode_t mentioned;
+
+ do
+ {
+ octal_mode = 8 * octal_mode + *mode_string++ - '0';
+ if (ALLM < octal_mode)
+ return NULL;
+ }
+ while ('0' <= *mode_string && *mode_string < '8');
+
+ if (*mode_string)
+ return NULL;
+
+ mode = octal_to_mode (octal_mode);
+ mentioned = (mode & (S_ISUID | S_ISGID)) | S_ISVTX | S_IRWXUGO;
+ return make_node_op_equals (mode, mentioned);
+ }
+
+ /* Allocate enough space to hold the result. */
+ {
+ size_t needed = 1;
+ char const *p;
+ for (p = mode_string; *p; p++)
+ needed += (*p == '=' || *p == '+' || *p == '-');
+ mc = xnmalloc (needed, sizeof *mc);
+ }
+
+ /* One loop iteration for each `[ugoa]*([-+=]([rwxXst]*|[ugo]))+'. */
+ for (;; mode_string++)
+ {
+ /* Which bits in the mode are operated on. */
+ mode_t affected = 0;
+
+ /* Turn on all the bits in `affected' for each group given. */
+ for (;; mode_string++)
+ switch (*mode_string)
+ {
+ default:
+ goto invalid;
+ case 'u':
+ affected |= S_ISUID | S_IRWXU;
+ break;
+ case 'g':
+ affected |= S_ISGID | S_IRWXG;
+ break;
+ case 'o':
+ affected |= S_ISVTX | S_IRWXO;
+ break;
+ case 'a':
+ affected |= CHMOD_MODE_BITS;
+ break;
+ case '=': case '+': case '-':
+ goto no_more_affected;
+ }
+ no_more_affected:;
+
+ do
+ {
+ char op = *mode_string++;
+ mode_t value;
+ char flag = MODE_COPY_EXISTING;
+ struct mode_change *change;
+
+ switch (*mode_string++)
+ {
+ case 'u':
+ /* Set the affected bits to the value of the `u' bits
+ on the same file. */
+ value = S_IRWXU;
+ break;
+ case 'g':
+ /* Set the affected bits to the value of the `g' bits
+ on the same file. */
+ value = S_IRWXG;
+ break;
+ case 'o':
+ /* Set the affected bits to the value of the `o' bits
+ on the same file. */
+ value = S_IRWXO;
+ break;
+
+ default:
+ value = 0;
+ flag = MODE_ORDINARY_CHANGE;
+
+ for (mode_string--;; mode_string++)
+ switch (*mode_string)
+ {
+ case 'r':
+ value |= S_IRUSR | S_IRGRP | S_IROTH;
+ break;
+ case 'w':
+ value |= S_IWUSR | S_IWGRP | S_IWOTH;
+ break;
+ case 'x':
+ value |= S_IXUSR | S_IXGRP | S_IXOTH;
+ break;
+ case 'X':
+ flag = MODE_X_IF_ANY_X;
+ break;
+ case 's':
+ /* Set the setuid/gid bits if `u' or `g' is selected. */
+ value |= S_ISUID | S_ISGID;
+ break;
+ case 't':
+ /* Set the "save text image" bit if `o' is selected. */
+ value |= S_ISVTX;
+ break;
+ default:
+ goto no_more_values;
+ }
+ no_more_values:;
+ }
+
+ change = &mc[used++];
+ change->op = op;
+ change->flag = flag;
+ change->affected = affected;
+ change->value = value;
+ change->mentioned = (affected ? affected & value : value);
+ }
+ while (*mode_string == '=' || *mode_string == '+'
+ || *mode_string == '-');
+
+ if (*mode_string != ',')
+ break;
+ }
+
+ if (*mode_string == 0)
+ {
+ mc[used].flag = MODE_DONE;
+ return mc;
+ }
+
+invalid:
+ free (mc);
+ return NULL;
+}
+
+/* Return a file mode change operation that sets permissions to match those
+ of REF_FILE. Return NULL (setting errno) if REF_FILE can't be accessed. */
+
+struct mode_change *
+mode_create_from_ref (const char *ref_file)
+{
+ struct stat ref_stats;
+
+ if (stat (ref_file, &ref_stats) != 0)
+ return NULL;
+ return make_node_op_equals (ref_stats.st_mode, CHMOD_MODE_BITS);
+}
+
+/* Return the file mode bits of OLDMODE (which is the mode of a
+ directory if DIR), assuming the umask is UMASK_VALUE, adjusted as
+ indicated by the list of change operations CHANGES. If DIR, the
+ type 'X' change affects the returned value even if no execute bits
+ were set in OLDMODE, and set user and group ID bits are preserved
+ unless CHANGES mentioned them. If PMODE_BITS is not null, store into
+ *PMODE_BITS a mask denoting file mode bits that are affected by
+ CHANGES.
+
+ The returned value and *PMODE_BITS contain only file mode bits.
+ For example, they have the S_IFMT bits cleared on a standard
+ Unix-like host. */
+
+mode_t
+mode_adjust (mode_t oldmode, bool dir, mode_t umask_value,
+ struct mode_change const *changes, mode_t *pmode_bits)
+{
+ /* The adjusted mode. */
+ mode_t newmode = oldmode & CHMOD_MODE_BITS;
+
+ /* File mode bits that CHANGES cares about. */
+ mode_t mode_bits = 0;
+
+ for (; changes->flag != MODE_DONE; changes++)
+ {
+ mode_t affected = changes->affected;
+ mode_t omit_change =
+ (dir ? S_ISUID | S_ISGID : 0) & ~ changes->mentioned;
+ mode_t value = changes->value;
+
+ switch (changes->flag)
+ {
+ case MODE_ORDINARY_CHANGE:
+ break;
+
+ case MODE_COPY_EXISTING:
+ /* Isolate in `value' the bits in `newmode' to copy. */
+ value &= newmode;
+
+ /* Copy the isolated bits to the other two parts. */
+ value |= ((value & (S_IRUSR | S_IRGRP | S_IROTH)
+ ? S_IRUSR | S_IRGRP | S_IROTH : 0)
+ | (value & (S_IWUSR | S_IWGRP | S_IWOTH)
+ ? S_IWUSR | S_IWGRP | S_IWOTH : 0)
+ | (value & (S_IXUSR | S_IXGRP | S_IXOTH)
+ ? S_IXUSR | S_IXGRP | S_IXOTH : 0));
+ break;
+
+ case MODE_X_IF_ANY_X:
+ /* Affect the execute bits if execute bits are already set
+ or if the file is a directory. */
+ if ((newmode & (S_IXUSR | S_IXGRP | S_IXOTH)) | dir)
+ value |= S_IXUSR | S_IXGRP | S_IXOTH;
+ break;
+ }
+
+ /* If WHO was specified, limit the change to the affected bits.
+ Otherwise, apply the umask. Either way, omit changes as
+ requested. */
+ value &= (affected ? affected : ~umask_value) & ~ omit_change;
+
+ switch (changes->op)
+ {
+ case '=':
+ /* If WHO was specified, preserve the previous values of
+ bits that are not affected by this change operation.
+ Otherwise, clear all the bits. */
+ {
+ mode_t preserved = (affected ? ~affected : 0) | omit_change;
+ mode_bits |= CHMOD_MODE_BITS & ~preserved;
+ newmode = (newmode & preserved) | value;
+ break;
+ }
+
+ case '+':
+ mode_bits |= value;
+ newmode |= value;
+ break;
+
+ case '-':
+ mode_bits |= value;
+ newmode &= ~value;
+ break;
+ }
+ }
+
+ if (pmode_bits)
+ *pmode_bits = mode_bits;
+ return newmode;
+}
diff --git a/gnulib/lib/modechange.h b/gnulib/lib/modechange.h
new file mode 100644
index 00000000..3cc4bf9d
--- /dev/null
+++ b/gnulib/lib/modechange.h
@@ -0,0 +1,30 @@
+/* modechange.h -- definitions for file mode manipulation
+
+ Copyright (C) 1989-1990, 1997, 2003-2006, 2009-2010 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/>. */
+
+#if ! defined MODECHANGE_H_
+# define MODECHANGE_H_
+
+# include <stdbool.h>
+# include <sys/types.h>
+
+struct mode_change *mode_compile (const char *);
+struct mode_change *mode_create_from_ref (const char *);
+mode_t mode_adjust (mode_t, bool, mode_t, struct mode_change const *,
+ mode_t *);
+
+#endif
diff --git a/gnulib/lib/mountlist.c b/gnulib/lib/mountlist.c
new file mode 100644
index 00000000..996b71a1
--- /dev/null
+++ b/gnulib/lib/mountlist.c
@@ -0,0 +1,880 @@
+/* mountlist.c -- return a list of mounted file systems
+
+ Copyright (C) 1991-1992, 1997-2010 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/>. */
+
+#include <config.h>
+
+#include "mountlist.h"
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "xalloc.h"
+
+#include <errno.h>
+
+#include <fcntl.h>
+
+#include <unistd.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if defined MOUNTED_GETFSSTAT /* OSF_1 and Darwin1.3.x */
+# if HAVE_SYS_UCRED_H
+# include <grp.h> /* needed on OSF V4.0 for definition of NGROUPS,
+ NGROUPS is used as an array dimension in ucred.h */
+# include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */
+# endif
+# if HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+# endif
+# if HAVE_SYS_FS_TYPES_H
+# include <sys/fs_types.h> /* needed by powerpc-apple-darwin1.3.7 */
+# endif
+# if HAVE_STRUCT_FSSTAT_F_FSTYPENAME
+# define FS_TYPE(Ent) ((Ent).f_fstypename)
+# else
+# define FS_TYPE(Ent) mnt_names[(Ent).f_type]
+# endif
+#endif /* MOUNTED_GETFSSTAT */
+
+#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
+# include <mntent.h>
+# if !defined MOUNTED
+# if defined _PATH_MOUNTED /* GNU libc */
+# define MOUNTED _PATH_MOUNTED
+# endif
+# if defined MNT_MNTTAB /* HP-UX. */
+# define MOUNTED MNT_MNTTAB
+# endif
+# if defined MNTTABNAME /* Dynix. */
+# define MOUNTED MNTTABNAME
+# endif
+# endif
+#endif
+
+#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
+# include <sys/mount.h>
+#endif
+
+#ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */
+# include <sys/statvfs.h>
+#endif
+
+#ifdef MOUNTED_GETMNT /* Ultrix. */
+# include <sys/mount.h>
+# include <sys/fs_types.h>
+#endif
+
+#ifdef MOUNTED_FS_STAT_DEV /* BeOS. */
+# include <fs_info.h>
+# include <dirent.h>
+#endif
+
+#ifdef MOUNTED_FREAD /* SVR2. */
+# include <mnttab.h>
+#endif
+
+#ifdef MOUNTED_FREAD_FSTYP /* SVR3. */
+# include <mnttab.h>
+# include <sys/fstyp.h>
+# include <sys/statfs.h>
+#endif
+
+#ifdef MOUNTED_LISTMNTENT
+# include <mntent.h>
+#endif
+
+#ifdef MOUNTED_GETMNTENT2 /* SVR4. */
+# include <sys/mnttab.h>
+#endif
+
+#ifdef MOUNTED_VMOUNT /* AIX. */
+# include <fshelp.h>
+# include <sys/vfs.h>
+#endif
+
+#ifdef DOLPHIN
+/* So special that it's not worth putting this in autoconf. */
+# undef MOUNTED_FREAD_FSTYP
+# define MOUNTED_GETMNTTBL
+#endif
+
+#if HAVE_SYS_MNTENT_H
+/* This is to get MNTOPT_IGNORE on e.g. SVR4. */
+# include <sys/mntent.h>
+#endif
+
+#undef MNT_IGNORE
+#if defined MNTOPT_IGNORE && defined HAVE_HASMNTOPT
+# define MNT_IGNORE(M) hasmntopt (M, MNTOPT_IGNORE)
+#else
+# define MNT_IGNORE(M) 0
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef opendir
+#undef closedir
+
+#ifndef ME_DUMMY
+# define ME_DUMMY(Fs_name, Fs_type) \
+ (strcmp (Fs_type, "autofs") == 0 \
+ || strcmp (Fs_type, "none") == 0 \
+ || strcmp (Fs_type, "proc") == 0 \
+ || strcmp (Fs_type, "subfs") == 0 \
+ /* for NetBSD 3.0 */ \
+ || strcmp (Fs_type, "kernfs") == 0 \
+ /* for Irix 6.5 */ \
+ || strcmp (Fs_type, "ignore") == 0)
+#endif
+
+#ifndef ME_REMOTE
+/* A file system is `remote' if its Fs_name contains a `:'
+ or if (it is of type (smbfs or cifs) and its Fs_name starts with `//'). */
+# define ME_REMOTE(Fs_name, Fs_type) \
+ (strchr (Fs_name, ':') != NULL \
+ || ((Fs_name)[0] == '/' \
+ && (Fs_name)[1] == '/' \
+ && (strcmp (Fs_type, "smbfs") == 0 \
+ || strcmp (Fs_type, "cifs") == 0)))
+#endif
+
+#if MOUNTED_GETMNTINFO
+
+# if ! HAVE_STRUCT_STATFS_F_FSTYPENAME
+static char *
+fstype_to_string (short int t)
+{
+ switch (t)
+ {
+# ifdef MOUNT_PC
+ case MOUNT_PC:
+ return "pc";
+# endif
+# ifdef MOUNT_MFS
+ case MOUNT_MFS:
+ return "mfs";
+# endif
+# ifdef MOUNT_LO
+ case MOUNT_LO:
+ return "lo";
+# endif
+# ifdef MOUNT_TFS
+ case MOUNT_TFS:
+ return "tfs";
+# endif
+# ifdef MOUNT_TMP
+ case MOUNT_TMP:
+ return "tmp";
+# endif
+# ifdef MOUNT_UFS
+ case MOUNT_UFS:
+ return "ufs" ;
+# endif
+# ifdef MOUNT_NFS
+ case MOUNT_NFS:
+ return "nfs" ;
+# endif
+# ifdef MOUNT_MSDOS
+ case MOUNT_MSDOS:
+ return "msdos" ;
+# endif
+# ifdef MOUNT_LFS
+ case MOUNT_LFS:
+ return "lfs" ;
+# endif
+# ifdef MOUNT_LOFS
+ case MOUNT_LOFS:
+ return "lofs" ;
+# endif
+# ifdef MOUNT_FDESC
+ case MOUNT_FDESC:
+ return "fdesc" ;
+# endif
+# ifdef MOUNT_PORTAL
+ case MOUNT_PORTAL:
+ return "portal" ;
+# endif
+# ifdef MOUNT_NULL
+ case MOUNT_NULL:
+ return "null" ;
+# endif
+# ifdef MOUNT_UMAP
+ case MOUNT_UMAP:
+ return "umap" ;
+# endif
+# ifdef MOUNT_KERNFS
+ case MOUNT_KERNFS:
+ return "kernfs" ;
+# endif
+# ifdef MOUNT_PROCFS
+ case MOUNT_PROCFS:
+ return "procfs" ;
+# endif
+# ifdef MOUNT_AFS
+ case MOUNT_AFS:
+ return "afs" ;
+# endif
+# ifdef MOUNT_CD9660
+ case MOUNT_CD9660:
+ return "cd9660" ;
+# endif
+# ifdef MOUNT_UNION
+ case MOUNT_UNION:
+ return "union" ;
+# endif
+# ifdef MOUNT_DEVFS
+ case MOUNT_DEVFS:
+ return "devfs" ;
+# endif
+# ifdef MOUNT_EXT2FS
+ case MOUNT_EXT2FS:
+ return "ext2fs" ;
+# endif
+ default:
+ return "?";
+ }
+}
+# endif
+
+static char *
+fsp_to_string (const struct statfs *fsp)
+{
+# if HAVE_STRUCT_STATFS_F_FSTYPENAME
+ return (char *) (fsp->f_fstypename);
+# else
+ return fstype_to_string (fsp->f_type);
+# endif
+}
+
+#endif /* MOUNTED_GETMNTINFO */
+
+#ifdef MOUNTED_VMOUNT /* AIX. */
+static char *
+fstype_to_string (int t)
+{
+ struct vfs_ent *e;
+
+ e = getvfsbytype (t);
+ if (!e || !e->vfsent_name)
+ return "none";
+ else
+ return e->vfsent_name;
+}
+#endif /* MOUNTED_VMOUNT */
+
+
+#if defined MOUNTED_GETMNTENT1 || defined MOUNTED_GETMNTENT2
+
+/* Return the device number from MOUNT_OPTIONS, if possible.
+ Otherwise return (dev_t) -1. */
+static dev_t
+dev_from_mount_options (char const *mount_options)
+{
+ /* GNU/Linux allows file system implementations to define their own
+ meaning for "dev=" mount options, so don't trust the meaning
+ here. */
+# ifndef __linux__
+
+ static char const dev_pattern[] = ",dev=";
+ char const *devopt = strstr (mount_options, dev_pattern);
+
+ if (devopt)
+ {
+ char const *optval = devopt + sizeof dev_pattern - 1;
+ char *optvalend;
+ unsigned long int dev;
+ errno = 0;
+ dev = strtoul (optval, &optvalend, 16);
+ if (optval != optvalend
+ && (*optvalend == '\0' || *optvalend == ',')
+ && ! (dev == ULONG_MAX && errno == ERANGE)
+ && dev == (dev_t) dev)
+ return dev;
+ }
+
+# endif
+ (void) mount_options;
+ return -1;
+}
+
+#endif
+
+/* Return a list of the currently mounted file systems, or NULL on error.
+ Add each entry to the tail of the list so that they stay in order.
+ If NEED_FS_TYPE is true, ensure that the file system type fields in
+ the returned list are valid. Otherwise, they might not be. */
+
+struct mount_entry *
+read_file_system_list (bool need_fs_type)
+{
+ struct mount_entry *mount_list;
+ struct mount_entry *me;
+ struct mount_entry **mtail = &mount_list;
+ (void) need_fs_type;
+
+#ifdef MOUNTED_LISTMNTENT
+ {
+ struct tabmntent *mntlist, *p;
+ struct mntent *mnt;
+ struct mount_entry *me;
+
+ /* the third and fourth arguments could be used to filter mounts,
+ but Crays doesn't seem to have any mounts that we want to
+ remove. Specifically, automount create normal NFS mounts.
+ */
+
+ if (listmntent (&mntlist, KMTAB, NULL, NULL) < 0)
+ return NULL;
+ for (p = mntlist; p; p = p->next) {
+ mnt = p->ment;
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (mnt->mnt_fsname);
+ me->me_mountdir = xstrdup (mnt->mnt_dir);
+ me->me_type = xstrdup (mnt->mnt_type);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = -1;
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ freemntlist (mntlist);
+ }
+#endif
+
+#ifdef MOUNTED_GETMNTENT1 /* GNU/Linux, 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
+ {
+ struct mntent *mnt;
+ char const *table = MOUNTED;
+ FILE *fp;
+
+ fp = setmntent (table, "r");
+ if (fp == NULL)
+ return NULL;
+
+ while ((mnt = getmntent (fp)))
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (mnt->mnt_fsname);
+ me->me_mountdir = xstrdup (mnt->mnt_dir);
+ me->me_type = xstrdup (mnt->mnt_type);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = dev_from_mount_options (mnt->mnt_opts);
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+
+ if (endmntent (fp) == 0)
+ goto free_then_fail;
+ }
+#endif /* MOUNTED_GETMNTENT1. */
+
+#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
+ {
+ struct statfs *fsp;
+ int entries;
+
+ entries = getmntinfo (&fsp, MNT_NOWAIT);
+ if (entries < 0)
+ return NULL;
+ for (; entries-- > 0; fsp++)
+ {
+ char *fs_type = fsp_to_string (fsp);
+
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (fsp->f_mntfromname);
+ me->me_mountdir = xstrdup (fsp->f_mntonname);
+ me->me_type = fs_type;
+ me->me_type_malloced = 0;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ }
+#endif /* MOUNTED_GETMNTINFO */
+
+#ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */
+ {
+ struct statvfs *fsp;
+ int entries;
+
+ entries = getmntinfo (&fsp, MNT_NOWAIT);
+ if (entries < 0)
+ return NULL;
+ for (; entries-- > 0; fsp++)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (fsp->f_mntfromname);
+ me->me_mountdir = xstrdup (fsp->f_mntonname);
+ me->me_type = xstrdup (fsp->f_fstypename);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ }
+#endif /* MOUNTED_GETMNTINFO2 */
+
+#ifdef MOUNTED_GETMNT /* Ultrix. */
+ {
+ int offset = 0;
+ int val;
+ struct fs_data fsd;
+
+ while (errno = 0,
+ 0 < (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY,
+ (char *) 0)))
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (fsd.fd_req.devname);
+ me->me_mountdir = xstrdup (fsd.fd_req.path);
+ me->me_type = gt_names[fsd.fd_req.fstype];
+ me->me_type_malloced = 0;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = fsd.fd_req.dev;
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ if (val < 0)
+ goto free_then_fail;
+ }
+#endif /* MOUNTED_GETMNT. */
+
+#if defined MOUNTED_FS_STAT_DEV /* BeOS */
+ {
+ /* The next_dev() and fs_stat_dev() system calls give the list of
+ all file systems, including the information returned by statvfs()
+ (fs type, total blocks, free blocks etc.), but without the mount
+ point. But on BeOS all file systems except / are mounted in the
+ rootfs, directly under /.
+ The directory name of the mount point is often, but not always,
+ identical to the volume name of the device.
+ We therefore get the list of subdirectories of /, and the list
+ of all file systems, and match the two lists. */
+
+ DIR *dirp;
+ struct rootdir_entry
+ {
+ char *name;
+ dev_t dev;
+ ino_t ino;
+ struct rootdir_entry *next;
+ };
+ struct rootdir_entry *rootdir_list;
+ struct rootdir_entry **rootdir_tail;
+ int32 pos;
+ dev_t dev;
+ fs_info fi;
+
+ /* All volumes are mounted in the rootfs, directly under /. */
+ rootdir_list = NULL;
+ rootdir_tail = &rootdir_list;
+ dirp = opendir ("/");
+ if (dirp)
+ {
+ struct dirent *d;
+
+ while ((d = readdir (dirp)) != NULL)
+ {
+ char *name;
+ struct stat statbuf;
+
+ if (strcmp (d->d_name, "..") == 0)
+ continue;
+
+ if (strcmp (d->d_name, ".") == 0)
+ name = xstrdup ("/");
+ else
+ {
+ name = xmalloc (1 + strlen (d->d_name) + 1);
+ name[0] = '/';
+ strcpy (name + 1, d->d_name);
+ }
+
+ if (lstat (name, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode))
+ {
+ struct rootdir_entry *re = xmalloc (sizeof *re);
+ re->name = name;
+ re->dev = statbuf.st_dev;
+ re->ino = statbuf.st_ino;
+
+ /* Add to the linked list. */
+ *rootdir_tail = re;
+ rootdir_tail = &re->next;
+ }
+ else
+ free (name);
+ }
+ closedir (dirp);
+ }
+ *rootdir_tail = NULL;
+
+ for (pos = 0; (dev = next_dev (&pos)) >= 0; )
+ if (fs_stat_dev (dev, &fi) >= 0)
+ {
+ /* Note: fi.dev == dev. */
+ struct rootdir_entry *re;
+
+ for (re = rootdir_list; re; re = re->next)
+ if (re->dev == fi.dev && re->ino == fi.root)
+ break;
+
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (fi.device_name[0] != '\0' ? fi.device_name : fi.fsh_name);
+ me->me_mountdir = xstrdup (re != NULL ? re->name : fi.fsh_name);
+ me->me_type = xstrdup (fi.fsh_name);
+ me->me_type_malloced = 1;
+ me->me_dev = fi.dev;
+ me->me_dummy = 0;
+ me->me_remote = (fi.flags & B_FS_IS_SHARED) != 0;
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ *mtail = NULL;
+
+ while (rootdir_list != NULL)
+ {
+ struct rootdir_entry *re = rootdir_list;
+ rootdir_list = re->next;
+ free (re->name);
+ free (re);
+ }
+ }
+#endif /* MOUNTED_FS_STAT_DEV */
+
+#if defined MOUNTED_GETFSSTAT /* __alpha running OSF_1 */
+ {
+ int numsys, counter;
+ size_t bufsize;
+ struct statfs *stats;
+
+ numsys = getfsstat ((struct statfs *)0, 0L, MNT_NOWAIT);
+ if (numsys < 0)
+ return (NULL);
+ if (SIZE_MAX / sizeof *stats <= numsys)
+ xalloc_die ();
+
+ bufsize = (1 + numsys) * sizeof *stats;
+ stats = xmalloc (bufsize);
+ numsys = getfsstat (stats, bufsize, MNT_NOWAIT);
+
+ if (numsys < 0)
+ {
+ free (stats);
+ return (NULL);
+ }
+
+ for (counter = 0; counter < numsys; counter++)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (stats[counter].f_mntfromname);
+ me->me_mountdir = xstrdup (stats[counter].f_mntonname);
+ me->me_type = xstrdup (FS_TYPE (stats[counter]));
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+
+ free (stats);
+ }
+#endif /* MOUNTED_GETFSSTAT */
+
+#if defined MOUNTED_FREAD || defined MOUNTED_FREAD_FSTYP /* SVR[23]. */
+ {
+ struct mnttab mnt;
+ char *table = "/etc/mnttab";
+ FILE *fp;
+
+ fp = fopen (table, "r");
+ if (fp == NULL)
+ return NULL;
+
+ while (fread (&mnt, sizeof mnt, 1, fp) > 0)
+ {
+ me = xmalloc (sizeof *me);
+# ifdef GETFSTYP /* SVR3. */
+ me->me_devname = xstrdup (mnt.mt_dev);
+# else
+ me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6);
+ strcpy (me->me_devname, "/dev/");
+ strcpy (me->me_devname + 5, mnt.mt_dev);
+# endif
+ me->me_mountdir = xstrdup (mnt.mt_filsys);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+ me->me_type = "";
+ me->me_type_malloced = 0;
+# ifdef GETFSTYP /* SVR3. */
+ if (need_fs_type)
+ {
+ struct statfs fsd;
+ char typebuf[FSTYPSZ];
+
+ if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1
+ && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1)
+ {
+ me->me_type = xstrdup (typebuf);
+ me->me_type_malloced = 1;
+ }
+ }
+# endif
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+
+ if (ferror (fp))
+ {
+ /* The last fread() call must have failed. */
+ int saved_errno = errno;
+ fclose (fp);
+ errno = saved_errno;
+ goto free_then_fail;
+ }
+
+ if (fclose (fp) == EOF)
+ goto free_then_fail;
+ }
+#endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */
+
+#ifdef MOUNTED_GETMNTTBL /* DolphinOS goes its own way. */
+ {
+ struct mntent **mnttbl = getmnttbl (), **ent;
+ for (ent=mnttbl;*ent;ent++)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup ( (*ent)->mt_resource);
+ me->me_mountdir = xstrdup ( (*ent)->mt_directory);
+ me->me_type = xstrdup ((*ent)->mt_fstype);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ endmnttbl ();
+ }
+#endif
+
+#ifdef MOUNTED_GETMNTENT2 /* SVR4. */
+ {
+ struct mnttab mnt;
+ char *table = MNTTAB;
+ FILE *fp;
+ int ret;
+ int lockfd = -1;
+
+# if defined F_RDLCK && defined F_SETLKW
+ /* MNTTAB_LOCK is a macro name of our own invention; it's not present in
+ e.g. Solaris 2.6. If the SVR4 folks ever define a macro
+ for this file name, we should use their macro name instead.
+ (Why not just lock MNTTAB directly? We don't know.) */
+# ifndef MNTTAB_LOCK
+# define MNTTAB_LOCK "/etc/.mnttab.lock"
+# endif
+ lockfd = open (MNTTAB_LOCK, O_RDONLY);
+ if (0 <= lockfd)
+ {
+ struct flock flock;
+ flock.l_type = F_RDLCK;
+ flock.l_whence = SEEK_SET;
+ flock.l_start = 0;
+ flock.l_len = 0;
+ while (fcntl (lockfd, F_SETLKW, &flock) == -1)
+ if (errno != EINTR)
+ {
+ int saved_errno = errno;
+ close (lockfd);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+ else if (errno != ENOENT)
+ return NULL;
+# endif
+
+ errno = 0;
+ fp = fopen (table, "r");
+ if (fp == NULL)
+ ret = errno;
+ else
+ {
+ while ((ret = getmntent (fp, &mnt)) == 0)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (mnt.mnt_special);
+ me->me_mountdir = xstrdup (mnt.mnt_mountp);
+ me->me_type = xstrdup (mnt.mnt_fstype);
+ me->me_type_malloced = 1;
+ me->me_dummy = MNT_IGNORE (&mnt) != 0;
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = dev_from_mount_options (mnt.mnt_mntopts);
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+
+ ret = fclose (fp) == EOF ? errno : 0 < ret ? 0 : -1;
+ }
+
+ if (0 <= lockfd && close (lockfd) != 0)
+ ret = errno;
+
+ if (0 <= ret)
+ {
+ errno = ret;
+ goto free_then_fail;
+ }
+ }
+#endif /* MOUNTED_GETMNTENT2. */
+
+#ifdef MOUNTED_VMOUNT /* AIX. */
+ {
+ int bufsize;
+ char *entries, *thisent;
+ struct vmount *vmp;
+ int n_entries;
+ int i;
+
+ /* Ask how many bytes to allocate for the mounted file system info. */
+ if (mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize) != 0)
+ return NULL;
+ entries = xmalloc (bufsize);
+
+ /* Get the list of mounted file systems. */
+ n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
+ if (n_entries < 0)
+ {
+ int saved_errno = errno;
+ free (entries);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ for (i = 0, thisent = entries;
+ i < n_entries;
+ i++, thisent += vmp->vmt_length)
+ {
+ char *options, *ignore;
+
+ vmp = (struct vmount *) thisent;
+ me = xmalloc (sizeof *me);
+ if (vmp->vmt_flags & MNT_REMOTE)
+ {
+ char *host, *dir;
+
+ me->me_remote = 1;
+ /* Prepend the remote dirname. */
+ host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off;
+ dir = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off;
+ me->me_devname = xmalloc (strlen (host) + strlen (dir) + 2);
+ strcpy (me->me_devname, host);
+ strcat (me->me_devname, ":");
+ strcat (me->me_devname, dir);
+ }
+ else
+ {
+ me->me_remote = 0;
+ me->me_devname = xstrdup (thisent +
+ vmp->vmt_data[VMT_OBJECT].vmt_off);
+ }
+ me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off);
+ me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype));
+ me->me_type_malloced = 1;
+ options = thisent + vmp->vmt_data[VMT_ARGS].vmt_off;
+ ignore = strstr (options, "ignore");
+ me->me_dummy = (ignore
+ && (ignore == options || ignore[-1] == ',')
+ && (ignore[sizeof "ignore" - 1] == ','
+ || ignore[sizeof "ignore" - 1] == '\0'));
+ me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ free (entries);
+ }
+#endif /* MOUNTED_VMOUNT. */
+
+ *mtail = NULL;
+ return mount_list;
+
+
+ free_then_fail:
+ {
+ int saved_errno = errno;
+ *mtail = NULL;
+
+ while (mount_list)
+ {
+ me = mount_list->me_next;
+ free (mount_list->me_devname);
+ free (mount_list->me_mountdir);
+ if (mount_list->me_type_malloced)
+ free (mount_list->me_type);
+ free (mount_list);
+ mount_list = me;
+ }
+
+ errno = saved_errno;
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/mountlist.h b/gnulib/lib/mountlist.h
new file mode 100644
index 00000000..ad66def5
--- /dev/null
+++ b/gnulib/lib/mountlist.h
@@ -0,0 +1,40 @@
+/* mountlist.h -- declarations for list of mounted file systems
+
+ Copyright (C) 1991-1992, 1998, 2000-2005, 2009-2010 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/>. */
+
+#ifndef MOUNTLIST_H_
+# define MOUNTLIST_H_
+
+# include <stdbool.h>
+# include <sys/types.h>
+
+/* A mount table entry. */
+struct mount_entry
+{
+ char *me_devname; /* Device node name, including "/dev/". */
+ char *me_mountdir; /* Mount point directory name. */
+ char *me_type; /* "nfs", "4.2", etc. */
+ dev_t me_dev; /* Device number of me_mountdir. */
+ unsigned int me_dummy : 1; /* Nonzero for dummy file systems. */
+ unsigned int me_remote : 1; /* Nonzero for remote fileystems. */
+ unsigned int me_type_malloced : 1; /* Nonzero if me_type was malloced. */
+ struct mount_entry *me_next;
+};
+
+struct mount_entry *read_file_system_list (bool need_fs_type);
+
+#endif
diff --git a/gnulib/lib/mpsort.c b/gnulib/lib/mpsort.c
new file mode 100644
index 00000000..dfa09222
--- /dev/null
+++ b/gnulib/lib/mpsort.c
@@ -0,0 +1,156 @@
+/* Sort a vector of pointers to data.
+
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "mpsort.h"
+
+#include <string.h>
+
+/* The type of qsort-style comparison functions. */
+
+typedef int (*comparison_function) (void const *, void const *);
+
+static void mpsort_with_tmp (void const **restrict, size_t,
+ void const **restrict, comparison_function);
+
+/* Sort a vector BASE containing N pointers, placing the sorted array
+ into TMP. Compare pointers with CMP. N must be at least 2. */
+
+static void
+mpsort_into_tmp (void const **restrict base, size_t n,
+ void const **restrict tmp,
+ comparison_function cmp)
+{
+ size_t n1 = n / 2;
+ size_t n2 = n - n1;
+ size_t a = 0;
+ size_t alim = n1;
+ size_t b = n1;
+ size_t blim = n;
+ void const *ba;
+ void const *bb;
+
+ mpsort_with_tmp (base + n1, n2, tmp, cmp);
+ mpsort_with_tmp (base, n1, tmp, cmp);
+
+ ba = base[a];
+ bb = base[b];
+
+ for (;;)
+ if (cmp (ba, bb) <= 0)
+ {
+ *tmp++ = ba;
+ a++;
+ if (a == alim)
+ {
+ a = b;
+ alim = blim;
+ break;
+ }
+ ba = base[a];
+ }
+ else
+ {
+ *tmp++ = bb;
+ b++;
+ if (b == blim)
+ break;
+ bb = base[b];
+ }
+
+ memcpy (tmp, base + a, (alim - a) * sizeof *base);
+}
+
+/* Sort a vector BASE containing N pointers, in place. Use TMP
+ (containing N / 2 pointers) for temporary storage. Compare
+ pointers with CMP. */
+
+static void
+mpsort_with_tmp (void const **restrict base, size_t n,
+ void const **restrict tmp,
+ comparison_function cmp)
+{
+ if (n <= 2)
+ {
+ if (n == 2)
+ {
+ void const *p0 = base[0];
+ void const *p1 = base[1];
+ if (! (cmp (p0, p1) <= 0))
+ {
+ base[0] = p1;
+ base[1] = p0;
+ }
+ }
+ }
+ else
+ {
+ size_t n1 = n / 2;
+ size_t n2 = n - n1;
+ size_t i;
+ size_t t = 0;
+ size_t tlim = n1;
+ size_t b = n1;
+ size_t blim = n;
+ void const *bb;
+ void const *tt;
+
+ mpsort_with_tmp (base + n1, n2, tmp, cmp);
+
+ if (n1 < 2)
+ tmp[0] = base[0];
+ else
+ mpsort_into_tmp (base, n1, tmp, cmp);
+
+ tt = tmp[t];
+ bb = base[b];
+
+ for (i = 0; ; )
+ if (cmp (tt, bb) <= 0)
+ {
+ base[i++] = tt;
+ t++;
+ if (t == tlim)
+ break;
+ tt = tmp[t];
+ }
+ else
+ {
+ base[i++] = bb;
+ b++;
+ if (b == blim)
+ {
+ memcpy (base + i, tmp + t, (tlim - t) * sizeof *base);
+ break;
+ }
+ bb = base[b];
+ }
+ }
+}
+
+/* Sort a vector BASE containing N pointers, in place. BASE must
+ contain enough storage to hold N + N / 2 vectors; the trailing
+ vectors are used for temporaries. Compare pointers with CMP. */
+
+void
+mpsort (void const **base, size_t n, comparison_function cmp)
+{
+ mpsort_with_tmp (base, n, base + n, cmp);
+}
diff --git a/gnulib/lib/mpsort.h b/gnulib/lib/mpsort.h
new file mode 100644
index 00000000..5e588117
--- /dev/null
+++ b/gnulib/lib/mpsort.h
@@ -0,0 +1,2 @@
+#include <stddef.h>
+void mpsort (void const **, size_t, int (*) (void const *, void const *));
diff --git a/gnulib/lib/nanosleep.c b/gnulib/lib/nanosleep.c
new file mode 100644
index 00000000..58fc7881
--- /dev/null
+++ b/gnulib/lib/nanosleep.c
@@ -0,0 +1,177 @@
+/* Provide a replacement for the POSIX nanosleep function.
+
+ Copyright (C) 1999-2000, 2002, 2004-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <time.h>
+
+#include "intprops.h"
+#include "sig-handler.h"
+#include "verify.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <signal.h>
+
+#include <sys/time.h>
+#include <errno.h>
+
+#include <unistd.h>
+
+#undef nanosleep
+
+enum { BILLION = 1000 * 1000 * 1000 };
+
+#if HAVE_BUG_BIG_NANOSLEEP
+
+int
+rpl_nanosleep (const struct timespec *requested_delay,
+ struct timespec *remaining_delay)
+{
+ /* nanosleep mishandles large sleeps due to internal overflow
+ problems. The worst known case of this is cygwin 1.5.x, which
+ can't sleep more than 49.7 days (2**32 milliseconds). Solve this
+ by breaking the sleep up into smaller chunks. Verify that time_t
+ is large enough. */
+ verify (TYPE_MAXIMUM (time_t) / 49 / 24 / 60 / 60);
+ const time_t limit = 49 * 24 * 60 * 60;
+ time_t seconds = requested_delay->tv_sec;
+ struct timespec intermediate;
+ intermediate.tv_nsec = 0;
+
+ while (limit < seconds)
+ {
+ int result;
+ intermediate.tv_sec = limit;
+ result = nanosleep (&intermediate, remaining_delay);
+ seconds -= limit;
+ if (result)
+ {
+ if (remaining_delay)
+ {
+ remaining_delay->tv_sec += seconds;
+ remaining_delay->tv_nsec += requested_delay->tv_nsec;
+ if (BILLION <= requested_delay->tv_nsec)
+ {
+ remaining_delay->tv_sec++;
+ remaining_delay->tv_nsec -= BILLION;
+ }
+ }
+ return result;
+ }
+ }
+ intermediate.tv_sec = seconds;
+ intermediate.tv_nsec = requested_delay->tv_nsec;
+ return nanosleep (&intermediate, remaining_delay);
+}
+
+#else
+
+/* Some systems (MSDOS) don't have SIGCONT.
+ Using SIGTERM here turns the signal-handling code below
+ into a no-op on such systems. */
+# ifndef SIGCONT
+# define SIGCONT SIGTERM
+# endif
+
+static sig_atomic_t volatile suspended;
+
+/* Handle SIGCONT. */
+
+static void
+sighandler (int sig)
+{
+ suspended = 1;
+}
+
+/* Suspend execution for at least *TS_DELAY seconds. */
+
+static void
+my_usleep (const struct timespec *ts_delay)
+{
+ struct timeval tv_delay;
+ tv_delay.tv_sec = ts_delay->tv_sec;
+ tv_delay.tv_usec = (ts_delay->tv_nsec + 999) / 1000;
+ if (tv_delay.tv_usec == 1000000)
+ {
+ time_t t1 = tv_delay.tv_sec + 1;
+ if (t1 < tv_delay.tv_sec)
+ tv_delay.tv_usec = 1000000 - 1; /* close enough */
+ else
+ {
+ tv_delay.tv_sec = t1;
+ tv_delay.tv_usec = 0;
+ }
+ }
+ select (0, NULL, NULL, NULL, &tv_delay);
+}
+
+/* Suspend execution for at least *REQUESTED_DELAY seconds. The
+ *REMAINING_DELAY part isn't implemented yet. */
+
+int
+rpl_nanosleep (const struct timespec *requested_delay,
+ struct timespec *remaining_delay)
+{
+ static bool initialized;
+
+ if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* set up sig handler */
+ if (! initialized)
+ {
+ struct sigaction oldact;
+
+ sigaction (SIGCONT, NULL, &oldact);
+ if (get_handler (&oldact) != SIG_IGN)
+ {
+ struct sigaction newact;
+
+ newact.sa_handler = sighandler;
+ sigemptyset (&newact.sa_mask);
+ newact.sa_flags = 0;
+ sigaction (SIGCONT, &newact, NULL);
+ }
+ initialized = true;
+ }
+
+ suspended = 0;
+
+ my_usleep (requested_delay);
+
+ if (suspended)
+ {
+ /* Calculate time remaining. */
+ /* FIXME: the code in sleep doesn't use this, so there's no
+ rush to implement it. */
+
+ errno = EINTR;
+ }
+
+ /* FIXME: Restore sig handler? */
+
+ return suspended;
+}
+#endif
diff --git a/gnulib/lib/netdb.in.h b/gnulib/lib/netdb.in.h
new file mode 100644
index 00000000..2edd98bd
--- /dev/null
+++ b/gnulib/lib/netdb.in.h
@@ -0,0 +1,192 @@
+/* Provide a netdb.h header file for systems lacking it (read: MinGW).
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file is supposed to be used on platforms that lack <netdb.h>.
+ It is intended to provide definitions and prototypes needed by an
+ application. */
+
+#ifndef _GL_NETDB_H
+
+#if @HAVE_NETDB_H@
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_NETDB_H@
+
+#endif
+
+#ifndef _GL_NETDB_H
+#define _GL_NETDB_H
+
+/* Get netdb.h definitions such as struct hostent for MinGW. */
+#include <sys/socket.h>
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* Declarations for a platform that lacks <netdb.h>, or where it is
+ incomplete. */
+
+#if @GNULIB_GETADDRINFO@
+
+# if !@HAVE_STRUCT_ADDRINFO@
+
+/* Structure to contain information about address of a service provider. */
+struct addrinfo
+{
+ int ai_flags; /* Input flags. */
+ int ai_family; /* Protocol family for socket. */
+ int ai_socktype; /* Socket type. */
+ int ai_protocol; /* Protocol for socket. */
+ socklen_t ai_addrlen; /* Length of socket address. */
+ struct sockaddr *ai_addr; /* Socket address for socket. */
+ char *ai_canonname; /* Canonical name for service location. */
+ struct addrinfo *ai_next; /* Pointer to next in list. */
+};
+# endif
+
+/* Possible values for `ai_flags' field in `addrinfo' structure. */
+# ifndef AI_PASSIVE
+# define AI_PASSIVE 0x0001 /* Socket address is intended for `bind'. */
+# endif
+# ifndef AI_CANONNAME
+# define AI_CANONNAME 0x0002 /* Request for canonical name. */
+# endif
+# ifndef AI_NUMERICSERV
+# define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */
+# endif
+
+# if 0
+# define AI_NUMERICHOST 0x0004 /* Don't use name resolution. */
+# endif
+
+/* These symbolic constants are required to be present by POSIX, but
+ our getaddrinfo replacement doesn't use them (yet). Setting them
+ to 0 on systems that doesn't have them avoids causing problems for
+ system getaddrinfo implementations that would be confused by
+ unknown values. */
+# ifndef AI_V4MAPPED
+# define AI_V4MAPPED 0 /* 0x0008: IPv4 mapped addresses are acceptable. */
+# endif
+# ifndef AI_ALL
+# define AI_ALL 0 /* 0x0010: Return IPv4 mapped and IPv6 addresses. */
+# endif
+# ifndef AI_ADDRCONFIG
+# define AI_ADDRCONFIG 0 /* 0x0020: Use configuration of this host to choose
+ returned address type. */
+# endif
+
+/* Error values for `getaddrinfo' function. */
+# ifndef EAI_BADFLAGS
+# define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */
+# define EAI_NONAME -2 /* NAME or SERVICE is unknown. */
+# define EAI_AGAIN -3 /* Temporary failure in name resolution. */
+# define EAI_FAIL -4 /* Non-recoverable failure in name res. */
+# define EAI_NODATA -5 /* No address associated with NAME. */
+# define EAI_FAMILY -6 /* `ai_family' not supported. */
+# define EAI_SOCKTYPE -7 /* `ai_socktype' not supported. */
+# define EAI_SERVICE -8 /* SERVICE not supported for `ai_socktype'. */
+# define EAI_MEMORY -10 /* Memory allocation failure. */
+# endif
+
+/* Since EAI_NODATA is deprecated by RFC3493, some systems (at least
+ FreeBSD, which does define EAI_BADFLAGS) have removed the definition
+ in favor of EAI_NONAME. */
+# if !defined EAI_NODATA && defined EAI_NONAME
+# define EAI_NODATA EAI_NONAME
+# endif
+
+# ifndef EAI_OVERFLOW
+/* Not defined on mingw32 and Haiku. */
+# define EAI_OVERFLOW -12 /* Argument buffer overflow. */
+# endif
+# ifndef EAI_ADDRFAMILY
+/* Not defined on mingw32. */
+# define EAI_ADDRFAMILY -9 /* Address family for NAME not supported. */
+# endif
+# ifndef EAI_SYSTEM
+/* Not defined on mingw32. */
+# define EAI_SYSTEM -11 /* System error returned in `errno'. */
+# endif
+
+# if 0
+/* The commented out definitions below are not yet implemented in the
+ GNULIB getaddrinfo() replacement, so are not yet needed.
+
+ If they are restored, be sure to protect the definitions with #ifndef. */
+# ifndef EAI_INPROGRESS
+# define EAI_INPROGRESS -100 /* Processing request in progress. */
+# define EAI_CANCELED -101 /* Request canceled. */
+# define EAI_NOTCANCELED -102 /* Request not canceled. */
+# define EAI_ALLDONE -103 /* All requests done. */
+# define EAI_INTR -104 /* Interrupted by a signal. */
+# define EAI_IDN_ENCODE -105 /* IDN encoding failed. */
+# endif
+# endif
+
+# if !@HAVE_DECL_GETADDRINFO@
+/* Translate name of a service location and/or a service name to set of
+ socket addresses.
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */
+extern int getaddrinfo (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res)
+ _GL_ARG_NONNULL ((4));
+# endif
+
+# if !@HAVE_DECL_FREEADDRINFO@
+/* Free `addrinfo' structure AI including associated storage.
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */
+extern void freeaddrinfo (struct addrinfo *ai) _GL_ARG_NONNULL ((1));
+# endif
+
+# if !@HAVE_DECL_GAI_STRERROR@
+/* Convert error return from getaddrinfo() to a string.
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/gai_strerror.html>. */
+extern const char *gai_strerror (int ecode);
+# endif
+
+# if !@HAVE_DECL_GETNAMEINFO@
+/* Convert socket address to printable node and service names.
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/getnameinfo.html>. */
+extern int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen,
+ char *restrict node, socklen_t nodelen,
+ char *restrict service, socklen_t servicelen,
+ int flags)
+ _GL_ARG_NONNULL ((1));
+# endif
+
+/* Possible flags for getnameinfo. */
+# ifndef NI_NUMERICHOST
+# define NI_NUMERICHOST 1
+# endif
+# ifndef NI_NUMERICSERV
+# define NI_NUMERICSERV 2
+# endif
+
+#endif /* @GNULIB_GETADDRINFO@ */
+
+#endif /* _GL_NETDB_H */
+#endif /* _GL_NETDB_H */
diff --git a/gnulib/lib/netinet_in.in.h b/gnulib/lib/netinet_in.in.h
new file mode 100644
index 00000000..114c66b0
--- /dev/null
+++ b/gnulib/lib/netinet_in.in.h
@@ -0,0 +1,47 @@
+/* Substitute for <netinet/in.h>.
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_NETINET_IN_H
+
+#if @HAVE_NETINET_IN_H@
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+/* On many platforms, <netinet/in.h> assumes prior inclusion of
+ <sys/types.h>. */
+# include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_NETINET_IN_H@
+
+#endif
+
+#ifndef _GL_NETINET_IN_H
+#define _GL_NETINET_IN_H
+
+#if !@HAVE_NETINET_IN_H@
+
+/* A platform that lacks <netinet/in.h>. */
+
+# include <sys/socket.h>
+
+#endif
+
+#endif /* _GL_NETINET_IN_H */
+#endif /* _GL_NETINET_IN_H */
diff --git a/gnulib/lib/nl_langinfo.c b/gnulib/lib/nl_langinfo.c
new file mode 100644
index 00000000..e81c81e7
--- /dev/null
+++ b/gnulib/lib/nl_langinfo.c
@@ -0,0 +1,260 @@
+/* nl_langinfo() replacement: query locale dependent information.
+
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <langinfo.h>
+
+#if REPLACE_NL_LANGINFO
+
+/* Override nl_langinfo with support for added nl_item values. */
+
+# include <locale.h>
+# include <string.h>
+
+# undef nl_langinfo
+
+char *
+rpl_nl_langinfo (nl_item item)
+{
+ switch (item)
+ {
+# if GNULIB_defined_CODESET
+ case CODESET:
+ {
+ const char *locale;
+ static char buf[2 + 10 + 1];
+
+ locale = setlocale (LC_CTYPE, NULL);
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return
+ it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+ }
+ return "";
+ }
+# endif
+# if GNULIB_defined_ERA
+ case ERA:
+ /* The format is not standardized. In glibc it is a sequence of strings
+ of the form "direction:offset:start_date:end_date:era_name:era_format"
+ with an empty string at the end. */
+ return "";
+ case ERA_D_FMT:
+ /* The %Ex conversion in strftime behaves like %x if the locale does not
+ have an alternative time format. */
+ item = D_FMT;
+ break;
+ case ERA_D_T_FMT:
+ /* The %Ec conversion in strftime behaves like %c if the locale does not
+ have an alternative time format. */
+ item = D_T_FMT;
+ break;
+ case ERA_T_FMT:
+ /* The %EX conversion in strftime behaves like %X if the locale does not
+ have an alternative time format. */
+ item = T_FMT;
+ break;
+ case ALT_DIGITS:
+ /* The format is not standardized. In glibc it is a sequence of 10
+ strings, appended in memory. */
+ return "\0\0\0\0\0\0\0\0\0\0";
+# endif
+ default:
+ break;
+ }
+ return nl_langinfo (item);
+}
+
+#else
+
+/* Provide nl_langinfo from scratch. */
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Native Windows platforms. */
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include <stdio.h>
+
+# else
+
+/* An old Unix platform without locales, such as Linux libc5 or BeOS. */
+
+# endif
+
+# include <locale.h>
+
+char *
+nl_langinfo (nl_item item)
+{
+ switch (item)
+ {
+ /* nl_langinfo items of the LC_CTYPE category */
+ case CODESET:
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ {
+ static char buf[2 + 10 + 1];
+
+ /* Woe32 has a function returning the locale's codepage as a number. */
+ sprintf (buf, "CP%u", GetACP ());
+ return buf;
+ }
+# elif defined __BEOS__
+ return "UTF-8";
+# else
+ return "ISO-8859-1";
+# endif
+ /* nl_langinfo items of the LC_NUMERIC category */
+ case RADIXCHAR:
+ return localeconv () ->decimal_point;
+ case THOUSEP:
+ return localeconv () ->thousands_sep;
+ /* nl_langinfo items of the LC_TIME category.
+ TODO: Really use the locale. */
+ case D_T_FMT:
+ case ERA_D_T_FMT:
+ return "%a %b %e %H:%M:%S %Y";
+ case D_FMT:
+ case ERA_D_FMT:
+ return "%m/%d/%y";
+ case T_FMT:
+ case ERA_T_FMT:
+ return "%H:%M:%S";
+ case T_FMT_AMPM:
+ return "%I:%M:%S %p";
+ case AM_STR:
+ return "AM";
+ case PM_STR:
+ return "PM";
+ case DAY_1:
+ return "Sunday";
+ case DAY_2:
+ return "Monday";
+ case DAY_3:
+ return "Tuesday";
+ case DAY_4:
+ return "Wednesday";
+ case DAY_5:
+ return "Thursday";
+ case DAY_6:
+ return "Friday";
+ case DAY_7:
+ return "Saturday";
+ case ABDAY_1:
+ return "Sun";
+ case ABDAY_2:
+ return "Mon";
+ case ABDAY_3:
+ return "Tue";
+ case ABDAY_4:
+ return "Wed";
+ case ABDAY_5:
+ return "Thu";
+ case ABDAY_6:
+ return "Fri";
+ case ABDAY_7:
+ return "Sat";
+ case MON_1:
+ return "January";
+ case MON_2:
+ return "February";
+ case MON_3:
+ return "March";
+ case MON_4:
+ return "April";
+ case MON_5:
+ return "May";
+ case MON_6:
+ return "June";
+ case MON_7:
+ return "July";
+ case MON_8:
+ return "August";
+ case MON_9:
+ return "September";
+ case MON_10:
+ return "October";
+ case MON_11:
+ return "November";
+ case MON_12:
+ return "December";
+ case ABMON_1:
+ return "Jan";
+ case ABMON_2:
+ return "Feb";
+ case ABMON_3:
+ return "Mar";
+ case ABMON_4:
+ return "Apr";
+ case ABMON_5:
+ return "May";
+ case ABMON_6:
+ return "Jun";
+ case ABMON_7:
+ return "Jul";
+ case ABMON_8:
+ return "Aug";
+ case ABMON_9:
+ return "Sep";
+ case ABMON_10:
+ return "Oct";
+ case ABMON_11:
+ return "Nov";
+ case ABMON_12:
+ return "Dec";
+ case ERA:
+ return "";
+ case ALT_DIGITS:
+ return "\0\0\0\0\0\0\0\0\0\0";
+ /* nl_langinfo items of the LC_MONETARY category
+ TODO: Really use the locale. */
+ case CRNCYSTR:
+ return "-";
+ /* nl_langinfo items of the LC_MESSAGES category
+ TODO: Really use the locale. */
+ case YESEXPR:
+ return "^[yY]";
+ case NOEXPR:
+ return "^[nN]";
+ default:
+ return "";
+ }
+}
+
+#endif
diff --git a/gnulib/lib/nproc.c b/gnulib/lib/nproc.c
new file mode 100644
index 00000000..90b568eb
--- /dev/null
+++ b/gnulib/lib/nproc.c
@@ -0,0 +1,358 @@
+/* Detect the number of processors.
+
+ Copyright (C) 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Glen Lenker and Bruno Haible. */
+
+#include <config.h>
+#include "nproc.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#if HAVE_PTHREAD_AFFINITY_NP && 0
+# include <pthread.h>
+# include <sched.h>
+#endif
+#if HAVE_SCHED_GETAFFINITY_LIKE_GLIBC || HAVE_SCHED_GETAFFINITY_NP
+# include <sched.h>
+#endif
+
+#include <sys/types.h>
+
+#if HAVE_SYS_PSTAT_H
+# include <sys/pstat.h>
+#endif
+
+#if HAVE_SYS_SYSMP_H
+# include <sys/sysmp.h>
+#endif
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if HAVE_SYS_SYSCTL_H
+# include <sys/sysctl.h>
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "c-ctype.h"
+
+#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
+
+/* Return the number of processors available to the current process, based
+ on a modern system call that returns the "affinity" between the current
+ process and each CPU. Return 0 if unknown or if such a system call does
+ not exist. */
+static unsigned long
+num_processors_via_affinity_mask (void)
+{
+ /* glibc >= 2.3.3 with NPTL and NetBSD 5 have pthread_getaffinity_np,
+ but with different APIs. Also it requires linking with -lpthread.
+ Therefore this code is not enabled.
+ glibc >= 2.3.4 has sched_getaffinity whereas NetBSD 5 has
+ sched_getaffinity_np. */
+#if HAVE_PTHREAD_AFFINITY_NP && defined __GLIBC__ && 0
+ {
+ cpu_set_t set;
+
+ if (pthread_getaffinity_np (pthread_self (), sizeof (set), &set) == 0)
+ {
+ unsigned long count;
+
+# ifdef CPU_COUNT
+ /* glibc >= 2.6 has the CPU_COUNT macro. */
+ count = CPU_COUNT (&set);
+# else
+ size_t i;
+
+ count = 0;
+ for (i = 0; i < CPU_SETSIZE; i++)
+ if (CPU_ISSET (i, &set))
+ count++;
+# endif
+ if (count > 0)
+ return count;
+ }
+ }
+#elif HAVE_PTHREAD_AFFINITY_NP && defined __NetBSD__ && 0
+ {
+ cpuset_t *set;
+
+ set = cpuset_create ();
+ if (set != NULL)
+ {
+ unsigned long count = 0;
+
+ if (pthread_getaffinity_np (pthread_self (), cpuset_size (set), set)
+ == 0)
+ {
+ cpuid_t i;
+
+ for (i = 0;; i++)
+ {
+ int ret = cpuset_isset (i, set);
+ if (ret < 0)
+ break;
+ if (ret > 0)
+ count++;
+ }
+ }
+ cpuset_destroy (set);
+ if (count > 0)
+ return count;
+ }
+ }
+#elif HAVE_SCHED_GETAFFINITY_LIKE_GLIBC /* glibc >= 2.3.4 */
+ {
+ cpu_set_t set;
+
+ if (sched_getaffinity (0, sizeof (set), &set) == 0)
+ {
+ unsigned long count;
+
+# ifdef CPU_COUNT
+ /* glibc >= 2.6 has the CPU_COUNT macro. */
+ count = CPU_COUNT (&set);
+# else
+ size_t i;
+
+ count = 0;
+ for (i = 0; i < CPU_SETSIZE; i++)
+ if (CPU_ISSET (i, &set))
+ count++;
+# endif
+ if (count > 0)
+ return count;
+ }
+ }
+#elif HAVE_SCHED_GETAFFINITY_NP /* NetBSD >= 5 */
+ {
+ cpuset_t *set;
+
+ set = cpuset_create ();
+ if (set != NULL)
+ {
+ unsigned long count = 0;
+
+ if (sched_getaffinity_np (getpid (), cpuset_size (set), set) == 0)
+ {
+ cpuid_t i;
+
+ for (i = 0;; i++)
+ {
+ int ret = cpuset_isset (i, set);
+ if (ret < 0)
+ break;
+ if (ret > 0)
+ count++;
+ }
+ }
+ cpuset_destroy (set);
+ if (count > 0)
+ return count;
+ }
+ }
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ { /* This works on native Windows platforms. */
+ DWORD_PTR process_mask;
+ DWORD_PTR system_mask;
+
+ if (GetProcessAffinityMask (GetCurrentProcess (),
+ &process_mask, &system_mask))
+ {
+ DWORD_PTR mask = process_mask;
+ unsigned long count = 0;
+
+ for (; mask != 0; mask = mask >> 1)
+ if (mask & 1)
+ count++;
+ if (count > 0)
+ return count;
+ }
+ }
+#endif
+
+ return 0;
+}
+
+unsigned long int
+num_processors (enum nproc_query query)
+{
+ if (query == NPROC_CURRENT_OVERRIDABLE)
+ {
+ /* Test the environment variable OMP_NUM_THREADS, recognized also by all
+ programs that are based on OpenMP. The OpenMP spec says that the
+ value assigned to the environment variable "may have leading and
+ trailing white space". */
+ const char *envvalue = getenv ("OMP_NUM_THREADS");
+
+ if (envvalue != NULL)
+ {
+ while (*envvalue != '\0' && c_isspace (*envvalue))
+ envvalue++;
+ /* Convert it from decimal to 'unsigned long'. */
+ if (c_isdigit (*envvalue))
+ {
+ char *endptr = NULL;
+ unsigned long int value = strtoul (envvalue, &endptr, 10);
+
+ if (endptr != NULL)
+ {
+ while (*endptr != '\0' && c_isspace (*endptr))
+ endptr++;
+ if (*endptr == '\0')
+ return (value > 0 ? value : 1);
+ }
+ }
+ }
+
+ query = NPROC_CURRENT;
+ }
+ /* Here query is one of NPROC_ALL, NPROC_CURRENT. */
+
+ /* On systems with a modern affinity mask system call, we have
+ sysconf (_SC_NPROCESSORS_CONF)
+ >= sysconf (_SC_NPROCESSORS_ONLN)
+ >= num_processors_via_affinity_mask ()
+ The first number is the number of CPUs configured in the system.
+ The second number is the number of CPUs available to the scheduler.
+ The third number is the number of CPUs available to the current process.
+
+ Note! On Linux systems with glibc, the first and second number come from
+ the /sys and /proc file systems (see
+ glibc/sysdeps/unix/sysv/linux/getsysstats.c).
+ In some situations these file systems are not mounted, and the sysconf
+ call returns 1, which does not reflect the reality. */
+
+ if (query == NPROC_CURRENT)
+ {
+ /* Try the modern affinity mask system call. */
+ {
+ unsigned long nprocs = num_processors_via_affinity_mask ();
+
+ if (nprocs > 0)
+ return nprocs;
+ }
+
+#if defined _SC_NPROCESSORS_ONLN
+ { /* This works on glibc, MacOS X 10.5, FreeBSD, AIX, OSF/1, Solaris,
+ Cygwin, Haiku. */
+ long int nprocs = sysconf (_SC_NPROCESSORS_ONLN);
+ if (nprocs > 0)
+ return nprocs;
+ }
+#endif
+ }
+ else /* query == NPROC_ALL */
+ {
+#if defined _SC_NPROCESSORS_CONF
+ { /* This works on glibc, MacOS X 10.5, FreeBSD, AIX, OSF/1, Solaris,
+ Cygwin, Haiku. */
+ long int nprocs = sysconf (_SC_NPROCESSORS_CONF);
+
+# if __GLIBC__ >= 2 && defined __linux__
+ /* On Linux systems with glibc, this information comes from the /sys and
+ /proc file systems (see glibc/sysdeps/unix/sysv/linux/getsysstats.c).
+ In some situations these file systems are not mounted, and the
+ sysconf call returns 1. But we wish to guarantee that
+ num_processors (NPROC_ALL) >= num_processors (NPROC_CURRENT). */
+ if (nprocs == 1)
+ {
+ unsigned long nprocs_current = num_processors_via_affinity_mask ();
+
+ if (nprocs_current > 0)
+ nprocs = nprocs_current;
+ }
+# endif
+
+ if (nprocs > 0)
+ return nprocs;
+ }
+#endif
+ }
+
+#if HAVE_PSTAT_GETDYNAMIC
+ { /* This works on HP-UX. */
+ struct pst_dynamic psd;
+ if (pstat_getdynamic (&psd, sizeof psd, 1, 0) >= 0)
+ {
+ /* The field psd_proc_cnt contains the number of active processors.
+ In newer releases of HP-UX 11, the field psd_max_proc_cnt includes
+ deactivated processors. */
+ if (query == NPROC_CURRENT)
+ {
+ if (psd.psd_proc_cnt > 0)
+ return psd.psd_proc_cnt;
+ }
+ else
+ {
+ if (psd.psd_max_proc_cnt > 0)
+ return psd.psd_max_proc_cnt;
+ }
+ }
+ }
+#endif
+
+#if HAVE_SYSMP && defined MP_NAPROCS && defined MP_NPROCS
+ { /* This works on IRIX. */
+ /* MP_NPROCS yields the number of installed processors.
+ MP_NAPROCS yields the number of processors available to unprivileged
+ processes. */
+ int nprocs =
+ sysmp (query == NPROC_CURRENT && getpid () != 0
+ ? MP_NAPROCS
+ : MP_NPROCS);
+ if (nprocs > 0)
+ return nprocs;
+ }
+#endif
+
+ /* Finally, as fallback, use the APIs that don't distinguish between
+ NPROC_CURRENT and NPROC_ALL. */
+
+#if HAVE_SYSCTL && defined HW_NCPU
+ { /* This works on MacOS X, FreeBSD, NetBSD, OpenBSD. */
+ int nprocs;
+ size_t len = sizeof (nprocs);
+ static int mib[2] = { CTL_HW, HW_NCPU };
+
+ if (sysctl (mib, ARRAY_SIZE (mib), &nprocs, &len, NULL, 0) == 0
+ && len == sizeof (nprocs)
+ && 0 < nprocs)
+ return nprocs;
+ }
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ { /* This works on native Windows platforms. */
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ if (0 < system_info.dwNumberOfProcessors)
+ return system_info.dwNumberOfProcessors;
+ }
+#endif
+
+ return 1;
+}
diff --git a/gnulib/lib/nproc.h b/gnulib/lib/nproc.h
new file mode 100644
index 00000000..9efcab57
--- /dev/null
+++ b/gnulib/lib/nproc.h
@@ -0,0 +1,47 @@
+/* Detect the number of processors.
+
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Glen Lenker and Bruno Haible. */
+
+/* Allow the use in C++ code. */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A "processor" in this context means a thread execution unit, that is either
+ - an execution core in a (possibly multi-core) chip, in a (possibly multi-
+ chip) module, in a single computer, or
+ - a thread execution unit inside a core
+ (hyper-threading, see <http://en.wikipedia.org/wiki/Hyper-threading>).
+ Which of the two definitions is used, is unspecified. */
+
+enum nproc_query
+{
+ NPROC_ALL, /* total number of processors */
+ NPROC_CURRENT, /* processors available to the current process */
+ NPROC_CURRENT_OVERRIDABLE /* likewise, but overridable through the
+ OMP_NUM_THREADS environment variable */
+};
+
+/* Return the total number of processors. The result is guaranteed to
+ be at least 1. */
+extern unsigned long int num_processors (enum nproc_query query);
+
+#ifdef __cplusplus
+}
+#endif /* C++ */
diff --git a/gnulib/lib/obstack.c b/gnulib/lib/obstack.c
new file mode 100644
index 00000000..7c71acde
--- /dev/null
+++ b/gnulib/lib/obstack.c
@@ -0,0 +1,430 @@
+/* obstack.c - subroutines used implicitly by object stack macros
+
+ Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010 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/>. */
+
+#ifdef _LIBC
+# include <obstack.h>
+# include <shlib-compat.h>
+#else
+# include <config.h>
+# include "obstack.h"
+#endif
+
+/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
+ incremented whenever callers compiled using an old obstack.h can no
+ longer properly call the functions in this obstack.c. */
+#define OBSTACK_INTERFACE_VERSION 1
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself, and the installed library
+ supports the same library interface we do. This code is part of the GNU
+ C Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object
+ files, it is simpler to just do this in the source for each such file. */
+
+#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
+#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
+# include <gnu-versions.h>
+# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
+# define ELIDE_CODE
+# endif
+#endif
+
+#include <stddef.h>
+
+#ifndef ELIDE_CODE
+
+# include <stdint.h>
+
+/* Determine default alignment. */
+union fooround
+{
+ uintmax_t i;
+ long double d;
+ void *p;
+};
+struct fooalign
+{
+ char c;
+ union fooround u;
+};
+/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
+ But in fact it might be less smart and round addresses to as much as
+ DEFAULT_ROUNDING. So we prepare for it to do that. */
+enum
+ {
+ DEFAULT_ALIGNMENT = offsetof (struct fooalign, u),
+ DEFAULT_ROUNDING = sizeof (union fooround)
+ };
+
+/* When we copy a long block of data, this is the unit to do it with.
+ On some machines, copying successive ints does not work;
+ in such a case, redefine COPYING_UNIT to `long' (if that works)
+ or `char' as a last resort. */
+# ifndef COPYING_UNIT
+# define COPYING_UNIT int
+# endif
+
+
+/* The functions allocating more room by calling `obstack_chunk_alloc'
+ jump to the handler pointed to by `obstack_alloc_failed_handler'.
+ This can be set to a user defined function which should either
+ abort gracefully or use longjump - but shouldn't return. This
+ variable by default points to the internal function
+ `print_and_abort'. */
+static void print_and_abort (void);
+void (*obstack_alloc_failed_handler) (void) = print_and_abort;
+
+/* Exit value used when `print_and_abort' is used. */
+# include <stdlib.h>
+# ifdef _LIBC
+int obstack_exit_failure = EXIT_FAILURE;
+# else
+# include "exitfail.h"
+# define obstack_exit_failure exit_failure
+# endif
+
+# ifdef _LIBC
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+/* A looong time ago (before 1994, anyway; we're not sure) this global variable
+ was used by non-GNU-C macros to avoid multiple evaluation. The GNU C
+ library still exports it because somebody might use it. */
+struct obstack *_obstack_compat;
+compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0);
+# endif
+# endif
+
+/* Define a macro that either calls functions with the traditional malloc/free
+ calling interface, or calls functions with the mmalloc/mfree interface
+ (that adds an extra first argument), based on the state of use_extra_arg.
+ For free, do not use ?:, since some compilers, like the MIPS compilers,
+ do not allow (expr) ? void : void. */
+
+# define CALL_CHUNKFUN(h, size) \
+ (((h) -> use_extra_arg) \
+ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
+ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
+
+# define CALL_FREEFUN(h, old_chunk) \
+ do { \
+ if ((h) -> use_extra_arg) \
+ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
+ else \
+ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
+ } while (0)
+
+
+/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
+ Objects start on multiples of ALIGNMENT (0 means use default).
+ CHUNKFUN is the function to use to allocate chunks,
+ and FREEFUN the function to free them.
+
+ Return nonzero if successful, calls obstack_alloc_failed_handler if
+ allocation fails. */
+
+int
+_obstack_begin (struct obstack *h,
+ int size, int alignment,
+ void *(*chunkfun) (long),
+ void (*freefun) (void *))
+{
+ register struct _obstack_chunk *chunk; /* points to new chunk */
+
+ if (alignment == 0)
+ alignment = DEFAULT_ALIGNMENT;
+ if (size == 0)
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ {
+ /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
+
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
+ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
+ size = 4096 - extra;
+ }
+
+ h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
+ h->chunk_size = size;
+ h->alignment_mask = alignment - 1;
+ h->use_extra_arg = 0;
+
+ chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
+ if (!chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+ alignment - 1);
+ h->chunk_limit = chunk->limit
+ = (char *) chunk + h->chunk_size;
+ chunk->prev = 0;
+ /* The initial chunk now contains no empty object. */
+ h->maybe_empty_object = 0;
+ h->alloc_failed = 0;
+ return 1;
+}
+
+int
+_obstack_begin_1 (struct obstack *h, int size, int alignment,
+ void *(*chunkfun) (void *, long),
+ void (*freefun) (void *, void *),
+ void *arg)
+{
+ register struct _obstack_chunk *chunk; /* points to new chunk */
+
+ if (alignment == 0)
+ alignment = DEFAULT_ALIGNMENT;
+ if (size == 0)
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ {
+ /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
+
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
+ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
+ size = 4096 - extra;
+ }
+
+ h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
+ h->chunk_size = size;
+ h->alignment_mask = alignment - 1;
+ h->extra_arg = arg;
+ h->use_extra_arg = 1;
+
+ chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
+ if (!chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+ alignment - 1);
+ h->chunk_limit = chunk->limit
+ = (char *) chunk + h->chunk_size;
+ chunk->prev = 0;
+ /* The initial chunk now contains no empty object. */
+ h->maybe_empty_object = 0;
+ h->alloc_failed = 0;
+ return 1;
+}
+
+/* Allocate a new current chunk for the obstack *H
+ on the assumption that LENGTH bytes need to be added
+ to the current object, or a new object of length LENGTH allocated.
+ Copies any partial object from the end of the old chunk
+ to the beginning of the new one. */
+
+void
+_obstack_newchunk (struct obstack *h, int length)
+{
+ register struct _obstack_chunk *old_chunk = h->chunk;
+ register struct _obstack_chunk *new_chunk;
+ register long new_size;
+ register long obj_size = h->next_free - h->object_base;
+ register long i;
+ long already;
+ char *object_base;
+
+ /* Compute size for new chunk. */
+ new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100;
+ if (new_size < h->chunk_size)
+ new_size = h->chunk_size;
+
+ /* Allocate and initialize the new chunk. */
+ new_chunk = CALL_CHUNKFUN (h, new_size);
+ if (!new_chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->chunk = new_chunk;
+ new_chunk->prev = old_chunk;
+ new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
+
+ /* Compute an aligned object_base in the new chunk */
+ object_base =
+ __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask);
+
+ /* Move the existing object to the new chunk.
+ Word at a time is fast and is safe if the object
+ is sufficiently aligned. */
+ if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
+ {
+ for (i = obj_size / sizeof (COPYING_UNIT) - 1;
+ i >= 0; i--)
+ ((COPYING_UNIT *)object_base)[i]
+ = ((COPYING_UNIT *)h->object_base)[i];
+ /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
+ but that can cross a page boundary on a machine
+ which does not do strict alignment for COPYING_UNITS. */
+ already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
+ }
+ else
+ already = 0;
+ /* Copy remaining bytes one by one. */
+ for (i = already; i < obj_size; i++)
+ object_base[i] = h->object_base[i];
+
+ /* If the object just copied was the only data in OLD_CHUNK,
+ free that chunk and remove it from the chain.
+ But not if that chunk might contain an empty object. */
+ if (! h->maybe_empty_object
+ && (h->object_base
+ == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents,
+ h->alignment_mask)))
+ {
+ new_chunk->prev = old_chunk->prev;
+ CALL_FREEFUN (h, old_chunk);
+ }
+
+ h->object_base = object_base;
+ h->next_free = h->object_base + obj_size;
+ /* The new chunk certainly contains no empty object yet. */
+ h->maybe_empty_object = 0;
+}
+# ifdef _LIBC
+libc_hidden_def (_obstack_newchunk)
+# endif
+
+/* Return nonzero if object OBJ has been allocated from obstack H.
+ This is here for debugging.
+ If you use it in a program, you are probably losing. */
+
+/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
+ obstack.h because it is just for debugging. */
+int _obstack_allocated_p (struct obstack *h, void *obj);
+
+int
+_obstack_allocated_p (struct obstack *h, void *obj)
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = (h)->chunk;
+ /* We use >= rather than > since the object cannot be exactly at
+ the beginning of the chunk but might be an empty object exactly
+ at the end of an adjacent chunk. */
+ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ lp = plp;
+ }
+ return lp != 0;
+}
+
+/* Free objects in obstack H, including OBJ and everything allocate
+ more recently than OBJ. If OBJ is zero, free everything in H. */
+
+# undef obstack_free
+
+void
+__obstack_free (struct obstack *h, void *obj)
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = h->chunk;
+ /* We use >= because there cannot be an object at the beginning of a chunk.
+ But there can be an empty object at that address
+ at the end of another chunk. */
+ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ CALL_FREEFUN (h, lp);
+ lp = plp;
+ /* If we switch chunks, we can't tell whether the new current
+ chunk contains an empty object, so assume that it may. */
+ h->maybe_empty_object = 1;
+ }
+ if (lp)
+ {
+ h->object_base = h->next_free = (char *) (obj);
+ h->chunk_limit = lp->limit;
+ h->chunk = lp;
+ }
+ else if (obj != 0)
+ /* obj is not in any of the chunks! */
+ abort ();
+}
+
+# ifdef _LIBC
+/* Older versions of libc used a function _obstack_free intended to be
+ called by non-GCC compilers. */
+strong_alias (obstack_free, _obstack_free)
+# endif
+
+int
+_obstack_memory_used (struct obstack *h)
+{
+ register struct _obstack_chunk* lp;
+ register int nbytes = 0;
+
+ for (lp = h->chunk; lp != 0; lp = lp->prev)
+ {
+ nbytes += lp->limit - (char *) lp;
+ }
+ return nbytes;
+}
+
+/* Define the error handler. */
+# ifdef _LIBC
+# include <libintl.h>
+# else
+# include "gettext.h"
+# endif
+# ifndef _
+# define _(msgid) gettext (msgid)
+# endif
+
+# ifdef _LIBC
+# include <libio/iolibio.h>
+# endif
+
+# ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
+# define __attribute__(Spec) /* empty */
+# endif
+# endif
+
+static void
+__attribute__ ((noreturn))
+print_and_abort (void)
+{
+ /* Don't change any of these strings. Yes, it would be possible to add
+ the newline to the string and use fputs or so. But this must not
+ happen because the "memory exhausted" message appears in other places
+ like this and the translation should be reused instead of creating
+ a very similar string which requires a separate translation. */
+# ifdef _LIBC
+ (void) __fxprintf (NULL, "%s\n", _("memory exhausted"));
+# else
+ fprintf (stderr, "%s\n", _("memory exhausted"));
+# endif
+ exit (obstack_exit_failure);
+}
+
+#endif /* !ELIDE_CODE */
diff --git a/gnulib/lib/obstack.h b/gnulib/lib/obstack.h
new file mode 100644
index 00000000..27b732d5
--- /dev/null
+++ b/gnulib/lib/obstack.h
@@ -0,0 +1,512 @@
+/* obstack.h - object stack macros
+ Copyright (C) 1988-1994, 1996-1999, 2003-2006, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+/* Summary:
+
+All the apparent functions defined here are macros. The idea
+is that you would use these pre-tested macros to solve a
+very specific set of problems, and they would run fast.
+Caution: no side-effects in arguments please!! They may be
+evaluated MANY times!!
+
+These macros operate a stack of objects. Each object starts life
+small, and may grow to maturity. (Consider building a word syllable
+by syllable.) An object can move while it is growing. Once it has
+been "finished" it never changes address again. So the "top of the
+stack" is typically an immature growing object, while the rest of the
+stack is of mature, fixed size and fixed address objects.
+
+These routines grab large chunks of memory, using a function you
+supply, called `obstack_chunk_alloc'. On occasion, they free chunks,
+by calling `obstack_chunk_free'. You must define them and declare
+them before using any obstack macros.
+
+Each independent stack is represented by a `struct obstack'.
+Each of the obstack macros expects a pointer to such a structure
+as the first argument.
+
+One motivation for this package is the problem of growing char strings
+in symbol tables. Unless you are "fascist pig with a read-only mind"
+--Gosper's immortal quote from HAKMEM item 154, out of context--you
+would not like to put any arbitrary upper limit on the length of your
+symbols.
+
+In practice this often means you will build many short symbols and a
+few long symbols. At the time you are reading a symbol you don't know
+how long it is. One traditional method is to read a symbol into a
+buffer, realloc()ating the buffer every time you try to read a symbol
+that is longer than the buffer. This is beaut, but you still will
+want to copy the symbol from the buffer to a more permanent
+symbol-table entry say about half the time.
+
+With obstacks, you can work differently. Use one obstack for all symbol
+names. As you read a symbol, grow the name in the obstack gradually.
+When the name is complete, finalize it. Then, if the symbol exists already,
+free the newly read name.
+
+The way we do this is to take a large chunk, allocating memory from
+low addresses. When you want to build a symbol in the chunk you just
+add chars above the current "high water mark" in the chunk. When you
+have finished adding chars, because you got to the end of the symbol,
+you know how long the chars are, and you can create a new object.
+Mostly the chars will not burst over the highest address of the chunk,
+because you would typically expect a chunk to be (say) 100 times as
+long as an average object.
+
+In case that isn't clear, when we have enough chars to make up
+the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
+so we just point to it where it lies. No moving of chars is
+needed and this is the second win: potentially long strings need
+never be explicitly shuffled. Once an object is formed, it does not
+change its address during its lifetime.
+
+When the chars burst over a chunk boundary, we allocate a larger
+chunk, and then copy the partly formed object from the end of the old
+chunk to the beginning of the new larger chunk. We then carry on
+accreting characters to the end of the object as we normally would.
+
+A special macro is provided to add a single char at a time to a
+growing object. This allows the use of register variables, which
+break the ordinary 'growth' macro.
+
+Summary:
+ We allocate large chunks.
+ We carve out one object at a time from the current chunk.
+ Once carved, an object never moves.
+ We are free to append data of any size to the currently
+ growing object.
+ Exactly one object is growing in an obstack at any one time.
+ You can run one obstack per control block.
+ You may have as many control blocks as you dare.
+ Because of the way we do it, you can `unwind' an obstack
+ back to a previous state. (You may remove objects much
+ as you would with a stack.)
+*/
+
+
+/* Don't do the contents of this file more than once. */
+
+#ifndef _OBSTACK_H
+#define _OBSTACK_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* We need the type of a pointer subtraction. If __PTRDIFF_TYPE__ is
+ defined, as with GNU C, use that; that way we don't pollute the
+ namespace with <stddef.h>'s symbols. Otherwise, include <stddef.h>
+ and use ptrdiff_t. */
+
+#ifdef __PTRDIFF_TYPE__
+# define PTR_INT_TYPE __PTRDIFF_TYPE__
+#else
+# include <stddef.h>
+# define PTR_INT_TYPE ptrdiff_t
+#endif
+
+/* If B is the base of an object addressed by P, return the result of
+ aligning P to the next multiple of A + 1. B and P must be of type
+ char *. A + 1 must be a power of 2. */
+
+#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A)))
+
+/* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case
+ where pointers can be converted to integers, aligned as integers,
+ and converted back again. If PTR_INT_TYPE is narrower than a
+ pointer (e.g., the AS/400), play it safe and compute the alignment
+ relative to B. Otherwise, use the faster strategy of computing the
+ alignment relative to 0. */
+
+#define __PTR_ALIGN(B, P, A) \
+ __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \
+ P, A)
+
+#include <string.h>
+
+struct _obstack_chunk /* Lives at front of each chunk. */
+{
+ char *limit; /* 1 past end of this chunk */
+ struct _obstack_chunk *prev; /* address of prior chunk or NULL */
+ char contents[4]; /* objects begin here */
+};
+
+struct obstack /* control current object in current chunk */
+{
+ long chunk_size; /* preferred size to allocate chunks in */
+ struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
+ char *object_base; /* address of object we are building */
+ char *next_free; /* where to add next char to current object */
+ char *chunk_limit; /* address of char after current chunk */
+ union
+ {
+ PTR_INT_TYPE tempint;
+ void *tempptr;
+ } temp; /* Temporary for some macros. */
+ int alignment_mask; /* Mask of alignment for each object. */
+ /* These prototypes vary based on `use_extra_arg', and we use
+ casts to the prototypeless function type in all assignments,
+ but having prototypes here quiets -Wstrict-prototypes. */
+ struct _obstack_chunk *(*chunkfun) (void *, long);
+ void (*freefun) (void *, struct _obstack_chunk *);
+ void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
+ unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */
+ unsigned maybe_empty_object:1;/* There is a possibility that the current
+ chunk contains a zero-length object. This
+ prevents freeing the chunk if we allocate
+ a bigger chunk to replace it. */
+ unsigned alloc_failed:1; /* No longer used, as we now call the failed
+ handler on error, but retained for binary
+ compatibility. */
+};
+
+/* Declare the external functions we use; they are in obstack.c. */
+
+extern void _obstack_newchunk (struct obstack *, int);
+extern int _obstack_begin (struct obstack *, int, int,
+ void *(*) (long), void (*) (void *));
+extern int _obstack_begin_1 (struct obstack *, int, int,
+ void *(*) (void *, long),
+ void (*) (void *, void *), void *);
+extern int _obstack_memory_used (struct obstack *);
+
+/* The default name of the function for freeing a chunk is 'obstack_free',
+ but gnulib users can override this by defining '__obstack_free'. */
+#ifndef __obstack_free
+# define __obstack_free obstack_free
+#endif
+extern void __obstack_free (struct obstack *obstack, void *block);
+
+
+/* Error handler called when `obstack_chunk_alloc' failed to allocate
+ more memory. This can be set to a user defined function which
+ should either abort gracefully or use longjump - but shouldn't
+ return. The default action is to print a message and abort. */
+extern void (*obstack_alloc_failed_handler) (void);
+
+/* Exit value used when `print_and_abort' is used. */
+extern int obstack_exit_failure;
+
+/* Pointer to beginning of object being allocated or to be allocated next.
+ Note that this might not be the final address of the object
+ because a new chunk might be needed to hold the final size. */
+
+#define obstack_base(h) ((void *) (h)->object_base)
+
+/* Size for allocating ordinary chunks. */
+
+#define obstack_chunk_size(h) ((h)->chunk_size)
+
+/* Pointer to next byte not yet allocated in current chunk. */
+
+#define obstack_next_free(h) ((h)->next_free)
+
+/* Mask specifying low bits that should be clear in address of an object. */
+
+#define obstack_alignment_mask(h) ((h)->alignment_mask)
+
+/* To prevent prototype warnings provide complete argument list. */
+#define obstack_init(h) \
+ _obstack_begin ((h), 0, 0, \
+ (void *(*) (long)) obstack_chunk_alloc, \
+ (void (*) (void *)) obstack_chunk_free)
+
+#define obstack_begin(h, size) \
+ _obstack_begin ((h), (size), 0, \
+ (void *(*) (long)) obstack_chunk_alloc, \
+ (void (*) (void *)) obstack_chunk_free)
+
+#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
+ _obstack_begin ((h), (size), (alignment), \
+ (void *(*) (long)) (chunkfun), \
+ (void (*) (void *)) (freefun))
+
+#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
+ _obstack_begin_1 ((h), (size), (alignment), \
+ (void *(*) (void *, long)) (chunkfun), \
+ (void (*) (void *, void *)) (freefun), (arg))
+
+#define obstack_chunkfun(h, newchunkfun) \
+ ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
+
+#define obstack_freefun(h, newfreefun) \
+ ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
+
+#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar))
+
+#define obstack_blank_fast(h,n) ((h)->next_free += (n))
+
+#define obstack_memory_used(h) _obstack_memory_used (h)
+
+#if defined __GNUC__ && defined __STDC__ && __STDC__
+/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
+ does not implement __extension__. But that compiler doesn't define
+ __GNUC_MINOR__. */
+# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
+# define __extension__
+# endif
+
+/* For GNU C, if not -traditional,
+ we can define these macros to compute all args only once
+ without using a global variable.
+ Also, we can avoid using the `temp' slot, to make faster code. */
+
+# define obstack_object_size(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (unsigned) (__o->next_free - __o->object_base); })
+
+# define obstack_room(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (unsigned) (__o->chunk_limit - __o->next_free); })
+
+# define obstack_make_room(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->chunk_limit - __o->next_free < __len) \
+ _obstack_newchunk (__o, __len); \
+ (void) 0; })
+
+# define obstack_empty_p(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (__o->chunk->prev == 0 \
+ && __o->next_free == __PTR_ALIGN ((char *) __o->chunk, \
+ __o->chunk->contents, \
+ __o->alignment_mask)); })
+
+# define obstack_grow(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->next_free + __len > __o->chunk_limit) \
+ _obstack_newchunk (__o, __len); \
+ memcpy (__o->next_free, where, __len); \
+ __o->next_free += __len; \
+ (void) 0; })
+
+# define obstack_grow0(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->next_free + __len + 1 > __o->chunk_limit) \
+ _obstack_newchunk (__o, __len + 1); \
+ memcpy (__o->next_free, where, __len); \
+ __o->next_free += __len; \
+ *(__o->next_free)++ = 0; \
+ (void) 0; })
+
+# define obstack_1grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + 1 > __o->chunk_limit) \
+ _obstack_newchunk (__o, 1); \
+ obstack_1grow_fast (__o, datum); \
+ (void) 0; })
+
+/* These assume that the obstack alignment is good enough for pointers
+ or ints, and that the data added so far to the current object
+ shares that much alignment. */
+
+# define obstack_ptr_grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
+ _obstack_newchunk (__o, sizeof (void *)); \
+ obstack_ptr_grow_fast (__o, datum); }) \
+
+# define obstack_int_grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + sizeof (int) > __o->chunk_limit) \
+ _obstack_newchunk (__o, sizeof (int)); \
+ obstack_int_grow_fast (__o, datum); })
+
+# define obstack_ptr_grow_fast(OBSTACK,aptr) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ *(const void **) __o1->next_free = (aptr); \
+ __o1->next_free += sizeof (const void *); \
+ (void) 0; })
+
+# define obstack_int_grow_fast(OBSTACK,aint) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ *(int *) __o1->next_free = (aint); \
+ __o1->next_free += sizeof (int); \
+ (void) 0; })
+
+# define obstack_blank(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->chunk_limit - __o->next_free < __len) \
+ _obstack_newchunk (__o, __len); \
+ obstack_blank_fast (__o, __len); \
+ (void) 0; })
+
+# define obstack_alloc(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_blank (__h, (length)); \
+ obstack_finish (__h); })
+
+# define obstack_copy(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+# define obstack_copy0(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow0 (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+/* The local variable is named __o1 to avoid a name conflict
+ when obstack_blank is called. */
+# define obstack_finish(OBSTACK) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ void *__value = (void *) __o1->object_base; \
+ if (__o1->next_free == __value) \
+ __o1->maybe_empty_object = 1; \
+ __o1->next_free \
+ = __PTR_ALIGN (__o1->object_base, __o1->next_free, \
+ __o1->alignment_mask); \
+ if (__o1->next_free - (char *)__o1->chunk \
+ > __o1->chunk_limit - (char *)__o1->chunk) \
+ __o1->next_free = __o1->chunk_limit; \
+ __o1->object_base = __o1->next_free; \
+ __value; })
+
+# define obstack_free(OBSTACK, OBJ) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ void *__obj = (OBJ); \
+ if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \
+ __o->next_free = __o->object_base = (char *)__obj; \
+ else (__obstack_free) (__o, __obj); })
+
+#else /* not __GNUC__ or not __STDC__ */
+
+# define obstack_object_size(h) \
+ (unsigned) ((h)->next_free - (h)->object_base)
+
+# define obstack_room(h) \
+ (unsigned) ((h)->chunk_limit - (h)->next_free)
+
+# define obstack_empty_p(h) \
+ ((h)->chunk->prev == 0 \
+ && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk, \
+ (h)->chunk->contents, \
+ (h)->alignment_mask))
+
+/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
+ so that we can avoid having void expressions
+ in the arms of the conditional expression.
+ Casting the third operand to void was tried before,
+ but some compilers won't accept it. */
+
+# define obstack_make_room(h,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0))
+
+# define obstack_grow(h,where,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \
+ memcpy ((h)->next_free, where, (h)->temp.tempint), \
+ (h)->next_free += (h)->temp.tempint)
+
+# define obstack_grow0(h,where,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0), \
+ memcpy ((h)->next_free, where, (h)->temp.tempint), \
+ (h)->next_free += (h)->temp.tempint, \
+ *((h)->next_free)++ = 0)
+
+# define obstack_1grow(h,datum) \
+( (((h)->next_free + 1 > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), 1), 0) : 0), \
+ obstack_1grow_fast (h, datum))
+
+# define obstack_ptr_grow(h,datum) \
+( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
+ obstack_ptr_grow_fast (h, datum))
+
+# define obstack_int_grow(h,datum) \
+( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
+ obstack_int_grow_fast (h, datum))
+
+# define obstack_ptr_grow_fast(h,aptr) \
+ (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr))
+
+# define obstack_int_grow_fast(h,aint) \
+ (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint))
+
+# define obstack_blank(h,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \
+ obstack_blank_fast (h, (h)->temp.tempint))
+
+# define obstack_alloc(h,length) \
+ (obstack_blank ((h), (length)), obstack_finish ((h)))
+
+# define obstack_copy(h,where,length) \
+ (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
+
+# define obstack_copy0(h,where,length) \
+ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
+
+# define obstack_finish(h) \
+( ((h)->next_free == (h)->object_base \
+ ? (((h)->maybe_empty_object = 1), 0) \
+ : 0), \
+ (h)->temp.tempptr = (h)->object_base, \
+ (h)->next_free \
+ = __PTR_ALIGN ((h)->object_base, (h)->next_free, \
+ (h)->alignment_mask), \
+ (((h)->next_free - (char *) (h)->chunk \
+ > (h)->chunk_limit - (char *) (h)->chunk) \
+ ? ((h)->next_free = (h)->chunk_limit) : 0), \
+ (h)->object_base = (h)->next_free, \
+ (h)->temp.tempptr)
+
+# define obstack_free(h,obj) \
+( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk, \
+ ((((h)->temp.tempint > 0 \
+ && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk)) \
+ ? (int) ((h)->next_free = (h)->object_base \
+ = (h)->temp.tempint + (char *) (h)->chunk) \
+ : (((__obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0)))
+
+#endif /* not __GNUC__ or not __STDC__ */
+
+#ifdef __cplusplus
+} /* C++ */
+#endif
+
+#endif /* obstack.h */
diff --git a/gnulib/lib/obstack_printf.c b/gnulib/lib/obstack_printf.c
new file mode 100644
index 00000000..743032da
--- /dev/null
+++ b/gnulib/lib/obstack_printf.c
@@ -0,0 +1,92 @@
+/* Formatted output to obstacks.
+ Copyright (C) 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include "obstack.h"
+#include "vasnprintf.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+/* Grow an obstack with formatted output. Return the number of bytes
+ added to OBS. No trailing nul byte is added, and the object should
+ be closed with obstack_finish before use.
+
+ Upon memory allocation error, call obstack_alloc_failed_handler.
+ Upon other error, return -1. */
+int
+obstack_printf (struct obstack *obs, const char *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = obstack_vprintf (obs, format, args);
+ va_end (args);
+ return result;
+}
+
+/* Grow an obstack with formatted output. Return the number of bytes
+ added to OBS. No trailing nul byte is added, and the object should
+ be closed with obstack_finish before use.
+
+ Upon memory allocation error, call obstack_alloc_failed_handler.
+ Upon other error, return -1. */
+int
+obstack_vprintf (struct obstack *obs, const char *format, va_list args)
+{
+ /* If we are close to the end of the current obstack chunk, use a
+ stack-allocated buffer and copy, to reduce the likelihood of a
+ small-size malloc. Otherwise, print directly into the
+ obstack. */
+ enum { CUTOFF = 1024 };
+ char buf[CUTOFF];
+ char *base = obstack_next_free (obs);
+ size_t len = obstack_room (obs);
+ char *str;
+
+ if (len < CUTOFF)
+ {
+ base = buf;
+ len = CUTOFF;
+ }
+ str = vasnprintf (base, &len, format, args);
+ if (!str)
+ {
+ if (errno == ENOMEM)
+ obstack_alloc_failed_handler ();
+ return -1;
+ }
+ if (str == base && str != buf)
+ /* The output was already computed in place, but we need to
+ account for its size. */
+ obstack_blank_fast (obs, len);
+ else
+ {
+ /* The output exceeded available obstack space or we used buf;
+ copy the resulting string. */
+ obstack_grow (obs, str, len);
+ if (str != buf)
+ free (str);
+ }
+ return len;
+}
diff --git a/gnulib/lib/offtostr.c b/gnulib/lib/offtostr.c
new file mode 100644
index 00000000..3a60c6e7
--- /dev/null
+++ b/gnulib/lib/offtostr.c
@@ -0,0 +1,4 @@
+#define inttostr offtostr
+#define inttype off_t
+#define inttype_is_signed 1
+#include "inttostr.c"
diff --git a/gnulib/lib/open-safer.c b/gnulib/lib/open-safer.c
new file mode 100644
index 00000000..3b36471f
--- /dev/null
+++ b/gnulib/lib/open-safer.c
@@ -0,0 +1,46 @@
+/* Invoke open, but avoid some glitches.
+
+ Copyright (C) 2005-2006, 2008-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "fcntl-safer.h"
+
+#include <fcntl.h>
+#include <stdarg.h>
+#include "unistd-safer.h"
+
+int
+open_safer (char const *file, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if (flags & O_CREAT)
+ {
+ va_list ap;
+ va_start (ap, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (ap, PROMOTED_MODE_T);
+
+ va_end (ap);
+ }
+
+ return fd_safer (open (file, flags, mode));
+}
diff --git a/gnulib/lib/open.c b/gnulib/lib/open.c
new file mode 100644
index 00000000..f612b802
--- /dev/null
+++ b/gnulib/lib/open.c
@@ -0,0 +1,166 @@
+/* Open a descriptor to a file.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Get the original definition of open. It might be defined as a macro. */
+#define __need_system_fcntl_h
+#include <fcntl.h>
+#undef __need_system_fcntl_h
+#include <sys/types.h>
+
+static inline int
+orig_open (const char *filename, int flags, mode_t mode)
+{
+ return open (filename, flags, mode);
+}
+
+/* Specification. */
+#include <fcntl.h>
+
+#include <errno.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifndef REPLACE_OPEN_DIRECTORY
+# define REPLACE_OPEN_DIRECTORY 0
+#endif
+
+int
+open (const char *filename, int flags, ...)
+{
+ mode_t mode;
+ int fd;
+
+ mode = 0;
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (strcmp (filename, "/dev/null") == 0)
+ filename = "NUL";
+#endif
+
+#if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and one of O_CREAT, O_WRONLY, O_RDWR
+ is specified, then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file already exists as a directory, then
+ - if O_CREAT is specified, open() must fail because of the semantics
+ of O_CREAT,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX
+ <http://www.opengroup.org/susv3/functions/open.html> says that it
+ fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ - if O_CREAT is specified, open() must fail since open() cannot create
+ directories,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because the
+ file does not contain a '.' directory. */
+ if (flags & (O_CREAT | O_WRONLY | O_RDWR))
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ errno = EISDIR;
+ return -1;
+ }
+ }
+#endif
+
+ fd = orig_open (filename, flags, mode);
+
+#if REPLACE_FCHDIR
+ /* Implementing fchdir and fdopendir requires the ability to open a
+ directory file descriptor. If open doesn't support that (as on
+ mingw), we use a dummy file that behaves the same as directories
+ on Linux (ie. always reports EOF on attempts to read()), and
+ override fstat() in fchdir.c to hide the fact that we have a
+ dummy. */
+ if (REPLACE_OPEN_DIRECTORY && fd < 0 && errno == EACCES
+ && (flags & O_ACCMODE) == O_RDONLY)
+ {
+ struct stat statbuf;
+ if (stat (filename, &statbuf) == 0 && S_ISDIR (statbuf.st_mode))
+ {
+ /* Maximum recursion depth of 1. */
+ fd = open ("/dev/null", flags, mode);
+ if (0 <= fd)
+ fd = _gl_register_fd (fd, filename);
+ }
+ else
+ errno = EACCES;
+ }
+#endif
+
+#if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and fd does not refer to a directory,
+ then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file without the slash is not a directory, open() must fail
+ with ENOTDIR. */
+ if (fd >= 0)
+ {
+ /* We know len is positive, since open did not fail with ENOENT. */
+ size_t len = strlen (filename);
+ if (filename[len - 1] == '/')
+ {
+ struct stat statbuf;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ }
+#endif
+
+#if REPLACE_FCHDIR
+ if (!REPLACE_OPEN_DIRECTORY && 0 <= fd)
+ fd = _gl_register_fd (fd, filename);
+#endif
+
+ return fd;
+}
diff --git a/gnulib/lib/openat-die.c b/gnulib/lib/openat-die.c
new file mode 100644
index 00000000..a8639e11
--- /dev/null
+++ b/gnulib/lib/openat-die.c
@@ -0,0 +1,56 @@
+/* Report a save- or restore-cwd failure in our openat replacement and then exit.
+
+ Copyright (C) 2005-2006, 2008-2010 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/>. */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+openat_save_fail (int errnum)
+{
+ error (exit_failure, errnum,
+ _("unable to record current working directory"));
+
+ /* The `noreturn' attribute cannot be applied to error, since it returns
+ when its first argument is 0. To help compilers understand that this
+ function does not return, call abort. Also, the abort is a
+ safety feature if exit_failure is 0 (which shouldn't happen). */
+ abort ();
+}
+
+
+/* Exit with an error about failure to restore the working directory
+ during an openat emulation. The caller must ensure that fd 2 is
+ not a just-opened fd, even when openat_safer is not in use. */
+
+void
+openat_restore_fail (int errnum)
+{
+ error (exit_failure, errnum,
+ _("failed to return to initial working directory"));
+
+ /* As above. */
+ abort ();
+}
diff --git a/gnulib/lib/openat-priv.h b/gnulib/lib/openat-priv.h
new file mode 100644
index 00000000..e0818731
--- /dev/null
+++ b/gnulib/lib/openat-priv.h
@@ -0,0 +1,44 @@
+/* Internals for openat-like functions.
+
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#ifndef _GL_HEADER_OPENAT_PRIV
+#define _GL_HEADER_OPENAT_PRIV
+
+#include <errno.h>
+#include <stdlib.h>
+
+#define OPENAT_BUFFER_SIZE 512
+char *openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file);
+
+/* Trying to access a BUILD_PROC_NAME file will fail on systems without
+ /proc support, and even on systems *with* ProcFS support. Return
+ nonzero if the failure may be legitimate, e.g., because /proc is not
+ readable, or the particular .../fd/N directory is not present. */
+#define EXPECTED_ERRNO(Errno) \
+ ((Errno) == ENOTDIR || (Errno) == ENOENT \
+ || (Errno) == EPERM || (Errno) == EACCES \
+ || (Errno) == ENOSYS /* Solaris 8 */ \
+ || (Errno) == EOPNOTSUPP /* FreeBSD */)
+
+/* Wrapper function shared among linkat and renameat. */
+int at_func2 (int fd1, char const *file1,
+ int fd2, char const *file2,
+ int (*func) (char const *file1, char const *file2));
+
+#endif /* _GL_HEADER_OPENAT_PRIV */
diff --git a/gnulib/lib/openat-proc.c b/gnulib/lib/openat-proc.c
new file mode 100644
index 00000000..25384127
--- /dev/null
+++ b/gnulib/lib/openat-proc.c
@@ -0,0 +1,105 @@
+/* Create /proc/self/fd-related names for subfiles of open directories.
+
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "openat-priv.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "dirname.h"
+#include "intprops.h"
+#include "same-inode.h"
+#include "xalloc.h"
+
+/* The results of open() in this file are not used with fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary work in fchdir.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use open_safer. */
+#undef open
+#undef close
+
+#define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/%s"
+
+#define PROC_SELF_FD_NAME_SIZE_BOUND(len) \
+ (sizeof PROC_SELF_FD_FORMAT - sizeof "%d%s" \
+ + INT_STRLEN_BOUND (int) + (len) + 1)
+
+
+/* Set BUF to the expansion of PROC_SELF_FD_FORMAT, using FD and FILE
+ respectively for %d and %s. If successful, return BUF if the
+ result fits in BUF, dynamically allocated memory otherwise. But
+ return NULL if /proc is not reliable. */
+char *
+openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
+{
+ static int proc_status = 0;
+
+ /* Make sure the caller gets ENOENT when appropriate. */
+ if (!*file)
+ {
+ buf[0] = '\0';
+ return buf;
+ }
+
+ if (! proc_status)
+ {
+ /* Set PROC_STATUS to a positive value if /proc/self/fd is
+ reliable, and a negative value otherwise. Solaris 10
+ /proc/self/fd mishandles "..", and any file name might expand
+ to ".." after symbolic link expansion, so avoid /proc/self/fd
+ if it mishandles "..". Solaris 10 has openat, but this
+ problem is exhibited on code that built on Solaris 8 and
+ running on Solaris 10. */
+
+ int proc_self_fd = open ("/proc/self/fd", O_RDONLY);
+ if (proc_self_fd < 0)
+ proc_status = -1;
+ else
+ {
+ struct stat proc_self_fd_dotdot_st;
+ struct stat proc_self_st;
+ char dotdot_buf[PROC_SELF_FD_NAME_SIZE_BOUND (sizeof ".." - 1)];
+ sprintf (dotdot_buf, PROC_SELF_FD_FORMAT, proc_self_fd, "..");
+ proc_status =
+ ((stat (dotdot_buf, &proc_self_fd_dotdot_st) == 0
+ && stat ("/proc/self", &proc_self_st) == 0
+ && SAME_INODE (proc_self_fd_dotdot_st, proc_self_st))
+ ? 1 : -1);
+ close (proc_self_fd);
+ }
+ }
+
+ if (proc_status < 0)
+ return NULL;
+ else
+ {
+ size_t bufsize = PROC_SELF_FD_NAME_SIZE_BOUND (strlen (file));
+ char *result = (bufsize < OPENAT_BUFFER_SIZE ? buf : xmalloc (bufsize));
+ sprintf (result, PROC_SELF_FD_FORMAT, fd, file);
+ return result;
+ }
+}
diff --git a/gnulib/lib/openat-safer.c b/gnulib/lib/openat-safer.c
new file mode 100644
index 00000000..f573f97d
--- /dev/null
+++ b/gnulib/lib/openat-safer.c
@@ -0,0 +1,46 @@
+/* Invoke openat, but avoid some glitches.
+
+ Copyright (C) 2005-2006, 2008-2010 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/>. */
+
+/* Written by Paul Eggert for open, ported by Eric Blake for openat. */
+
+#include <config.h>
+
+#include "fcntl-safer.h"
+
+#include <fcntl.h>
+#include <stdarg.h>
+#include "unistd-safer.h"
+
+int
+openat_safer (int fd, char const *file, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if (flags & O_CREAT)
+ {
+ va_list ap;
+ va_start (ap, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (ap, PROMOTED_MODE_T);
+
+ va_end (ap);
+ }
+
+ return fd_safer (openat (fd, file, flags, mode));
+}
diff --git a/gnulib/lib/openat.c b/gnulib/lib/openat.c
new file mode 100644
index 00000000..f2eac868
--- /dev/null
+++ b/gnulib/lib/openat.c
@@ -0,0 +1,265 @@
+/* provide a replacement openat function
+ Copyright (C) 2004-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "openat-priv.h"
+#include "save-cwd.h"
+
+#if HAVE_OPENAT
+
+# undef openat
+
+/* Like openat, but work around Solaris 9 bugs with trailing slash. */
+int
+rpl_openat (int dfd, char const *filename, int flags, ...)
+{
+ mode_t mode;
+ int fd;
+
+ mode = 0;
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+#if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and one of O_CREAT, O_WRONLY, O_RDWR
+ is specified, then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file already exists as a directory, then
+ - if O_CREAT is specified, open() must fail because of the semantics
+ of O_CREAT,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX
+ <http://www.opengroup.org/susv3/functions/open.html> says that it
+ fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ - if O_CREAT is specified, open() must fail since open() cannot create
+ directories,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because the
+ file does not contain a '.' directory. */
+ if (flags & (O_CREAT | O_WRONLY | O_RDWR))
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ errno = EISDIR;
+ return -1;
+ }
+ }
+#endif
+
+ fd = openat (dfd, filename, flags, mode);
+
+#if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and fd does not refer to a directory,
+ then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file without the slash is not a directory, open() must fail
+ with ENOTDIR. */
+ if (fd >= 0)
+ {
+ /* We know len is positive, since open did not fail with ENOENT. */
+ size_t len = strlen (filename);
+ if (filename[len - 1] == '/')
+ {
+ struct stat statbuf;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ }
+#endif
+
+ return fd;
+}
+
+#else /* !HAVE_OPENAT */
+
+/* Replacement for Solaris' openat function.
+ <http://www.google.com/search?q=openat+site:docs.sun.com>
+ First, try to simulate it via open ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it by doing save_cwd/fchdir/open/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, upon failure, set errno and return -1, as openat does.
+ Upon successful completion, return a file descriptor. */
+int
+openat (int fd, char const *file, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+ return openat_permissive (fd, file, flags, mode, NULL);
+}
+
+/* Like openat (FD, FILE, FLAGS, MODE), but if CWD_ERRNO is
+ nonnull, set *CWD_ERRNO to an errno value if unable to save
+ or restore the initial working directory. This is needed only
+ the first time remove.c's remove_dir opens a command-line
+ directory argument.
+
+ If a previous attempt to restore the current working directory
+ failed, then we must not even try to access a `.'-relative name.
+ It is the caller's responsibility not to call this function
+ in that case. */
+
+int
+openat_permissive (int fd, char const *file, int flags, mode_t mode,
+ int *cwd_errno)
+{
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ int err;
+ bool save_ok;
+
+ if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+ return open (file, flags, mode);
+
+ {
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, file);
+ if (proc_file)
+ {
+ int open_result = open (proc_file, flags, mode);
+ int open_errno = errno;
+ if (proc_file != buf)
+ free (proc_file);
+ /* If the syscall succeeds, or if it fails with an unexpected
+ errno value, then return right away. Otherwise, fall through
+ and resort to using save_cwd/restore_cwd. */
+ if (0 <= open_result || ! EXPECTED_ERRNO (open_errno))
+ {
+ errno = open_errno;
+ return open_result;
+ }
+ }
+ }
+
+ save_ok = (save_cwd (&saved_cwd) == 0);
+ if (! save_ok)
+ {
+ if (! cwd_errno)
+ openat_save_fail (errno);
+ *cwd_errno = errno;
+ }
+ if (0 <= fd && fd == saved_cwd.desc)
+ {
+ /* If saving the working directory collides with the user's
+ requested fd, then the user's fd must have been closed to
+ begin with. */
+ free_cwd (&saved_cwd);
+ errno = EBADF;
+ return -1;
+ }
+
+ err = fchdir (fd);
+ saved_errno = errno;
+
+ if (! err)
+ {
+ err = open (file, flags, mode);
+ saved_errno = errno;
+ if (save_ok && restore_cwd (&saved_cwd) != 0)
+ {
+ if (! cwd_errno)
+ {
+ /* Don't write a message to just-created fd 2. */
+ saved_errno = errno;
+ if (err == STDERR_FILENO)
+ close (err);
+ openat_restore_fail (saved_errno);
+ }
+ *cwd_errno = errno;
+ }
+ }
+
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return err;
+}
+
+/* Return true if our openat implementation must resort to
+ using save_cwd and restore_cwd. */
+bool
+openat_needs_fchdir (void)
+{
+ bool needs_fchdir = true;
+ int fd = open ("/", O_RDONLY);
+
+ if (0 <= fd)
+ {
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, ".");
+ if (proc_file)
+ {
+ needs_fchdir = false;
+ if (proc_file != buf)
+ free (proc_file);
+ }
+ close (fd);
+ }
+
+ return needs_fchdir;
+}
+
+#endif /* !HAVE_OPENAT */
diff --git a/gnulib/lib/openat.h b/gnulib/lib/openat.h
new file mode 100644
index 00000000..11a0314d
--- /dev/null
+++ b/gnulib/lib/openat.h
@@ -0,0 +1,114 @@
+/* provide a replacement openat function
+ Copyright (C) 2004-2006, 2008-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#ifndef _GL_HEADER_OPENAT
+#define _GL_HEADER_OPENAT
+
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+# define __attribute__(x) /* empty */
+# endif
+#endif
+
+#ifndef ATTRIBUTE_NORETURN
+# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+#endif
+
+#if !HAVE_OPENAT
+
+int openat_permissive (int fd, char const *file, int flags, mode_t mode,
+ int *cwd_errno);
+bool openat_needs_fchdir (void);
+
+#else
+
+# define openat_permissive(Fd, File, Flags, Mode, Cwd_errno) \
+ openat (Fd, File, Flags, Mode)
+# define openat_needs_fchdir() false
+
+#endif
+
+void openat_restore_fail (int) ATTRIBUTE_NORETURN;
+void openat_save_fail (int) ATTRIBUTE_NORETURN;
+
+/* Using these function names makes application code
+ slightly more readable than it would be with
+ fchownat (..., 0) or fchownat (..., AT_SYMLINK_NOFOLLOW). */
+static inline int
+chownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+ return fchownat (fd, file, owner, group, 0);
+}
+
+static inline int
+lchownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+ return fchownat (fd, file, owner, group, AT_SYMLINK_NOFOLLOW);
+}
+
+static inline int
+chmodat (int fd, char const *file, mode_t mode)
+{
+ return fchmodat (fd, file, mode, 0);
+}
+
+static inline int
+lchmodat (int fd, char const *file, mode_t mode)
+{
+ return fchmodat (fd, file, mode, AT_SYMLINK_NOFOLLOW);
+}
+
+static inline int
+statat (int fd, char const *name, struct stat *st)
+{
+ return fstatat (fd, name, st, 0);
+}
+
+static inline int
+lstatat (int fd, char const *name, struct stat *st)
+{
+ return fstatat (fd, name, st, AT_SYMLINK_NOFOLLOW);
+}
+
+#if GNULIB_FACCESSAT
+/* For now, there are no wrappers named laccessat or leuidaccessat,
+ since gnulib doesn't support faccessat(,AT_SYMLINK_NOFOLLOW) and
+ since access rights on symlinks are of limited utility. */
+
+static inline int
+accessat (int fd, char const *file, int mode)
+{
+ return faccessat (fd, file, mode, 0);
+}
+
+static inline int
+euidaccessat (int fd, char const *file, int mode)
+{
+ return faccessat (fd, file, mode, AT_EACCESS);
+}
+#endif
+
+#endif /* _GL_HEADER_OPENAT */
diff --git a/gnulib/lib/opendir-safer.c b/gnulib/lib/opendir-safer.c
new file mode 100644
index 00000000..36d47329
--- /dev/null
+++ b/gnulib/lib/opendir-safer.c
@@ -0,0 +1,68 @@
+/* Invoke opendir, but avoid some glitches.
+
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "dirent-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include "unistd-safer.h"
+
+/* Like opendir, but do not clobber stdin, stdout, or stderr. */
+
+DIR *
+opendir_safer (char const *name)
+{
+ DIR *dp = opendir (name);
+
+ if (dp)
+ {
+ int fd = dirfd (dp);
+
+ if (0 <= fd && fd <= STDERR_FILENO)
+ {
+ /* If fdopendir is native (as on Linux), then it is safe to
+ assume dirfd(fdopendir(n))==n. If we are using the
+ gnulib module fdopendir, then this guarantee is not met,
+ but fdopendir recursively calls opendir_safer up to 3
+ times to at least get a safe fd. If fdopendir is not
+ present but dirfd is accurate (as on cygwin 1.5.x), then
+ we recurse up to 3 times ourselves. Finally, if dirfd
+ always fails (as on mingw), then we are already safe. */
+ DIR *newdp;
+ int e;
+#if HAVE_FDOPENDIR || GNULIB_FDOPENDIR
+ int f = dup_safer (fd);
+ newdp = fdopendir (f);
+ e = errno;
+ if (! newdp)
+ close (f);
+#else /* !FDOPENDIR */
+ newdp = opendir_safer (name);
+ e = errno;
+#endif
+ closedir (dp);
+ errno = e;
+ dp = newdp;
+ }
+ }
+
+ return dp;
+}
diff --git a/gnulib/lib/pagealign_alloc.c b/gnulib/lib/pagealign_alloc.c
new file mode 100644
index 00000000..f02f84eb
--- /dev/null
+++ b/gnulib/lib/pagealign_alloc.c
@@ -0,0 +1,194 @@
+/* Memory allocation aligned to system page boundaries.
+
+ Copyright (C) 2005, 2006, 2007, 2009, 2010 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/>. */
+
+/* Written by Derek R. Price <derek@ximbiot.com>. */
+
+#include <config.h>
+
+#include "pagealign_alloc.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#if HAVE_MMAP
+# include <sys/mman.h>
+#endif
+
+#include "error.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#if HAVE_MMAP
+/* Define MAP_FILE when it isn't otherwise. */
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+/* Define MAP_FAILED for old systems which neglect to. */
+# ifndef MAP_FAILED
+# define MAP_FAILED ((void *)-1)
+# endif
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+
+#if HAVE_MMAP || ! HAVE_POSIX_MEMALIGN
+
+# if HAVE_MMAP
+/* For each memory region, we store its size. */
+typedef size_t info_t;
+# else
+/* For each memory region, we store the original pointer returned by
+ malloc(). */
+typedef void * info_t;
+# endif
+
+/* A simple linked list of allocated memory regions. It is probably not the
+ most efficient way to store these, but anyway... */
+typedef struct memnode_s memnode_t;
+struct memnode_s
+{
+ void *aligned_ptr;
+ info_t info;
+ memnode_t *next;
+};
+
+/* The list of currently allocated memory regions. */
+static memnode_t *memnode_table = NULL;
+
+
+static void
+new_memnode (void *aligned_ptr, info_t info)
+{
+ memnode_t *new_node = XMALLOC (memnode_t);
+ new_node->aligned_ptr = aligned_ptr;
+ new_node->info = info;
+ new_node->next = memnode_table;
+ memnode_table = new_node;
+}
+
+
+/* Dispose of the memnode containing a map for the ALIGNED_PTR in question
+ and return the content of the node's INFO field. */
+static info_t
+get_memnode (void *aligned_ptr)
+{
+ info_t ret;
+ memnode_t *c;
+ memnode_t **p_next = &memnode_table;
+
+ for (c = *p_next; c != NULL; p_next = &c->next, c = c->next)
+ if (c->aligned_ptr == aligned_ptr)
+ break;
+
+ if (c == NULL)
+ /* An attempt to free untracked memory. A wrong pointer was passed
+ to pagealign_free(). */
+ abort ();
+
+ /* Remove this entry from the list, save the return value, and free it. */
+ *p_next = c->next;
+ ret = c->info;
+ free (c);
+
+ return ret;
+}
+
+#endif /* HAVE_MMAP || !HAVE_POSIX_MEMALIGN */
+
+
+void *
+pagealign_alloc (size_t size)
+{
+ void *ret;
+#if HAVE_MMAP
+# ifdef HAVE_MAP_ANONYMOUS
+ const int fd = -1;
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+# else /* !HAVE_MAP_ANONYMOUS */
+ static int fd = -1; /* Only open /dev/zero once in order to avoid limiting
+ the amount of memory we may allocate based on the
+ number of open file descriptors. */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ if (fd == -1)
+ {
+ fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd < 0)
+ error (EXIT_FAILURE, errno, _("Failed to open /dev/zero for read"));
+ }
+# endif /* HAVE_MAP_ANONYMOUS */
+ ret = mmap (NULL, size, PROT_READ | PROT_WRITE, flags, fd, 0);
+ if (ret == MAP_FAILED)
+ return NULL;
+ new_memnode (ret, size);
+#elif HAVE_POSIX_MEMALIGN
+ int status = posix_memalign (&ret, getpagesize (), size);
+ if (status)
+ {
+ errno = status;
+ return NULL;
+ }
+#else /* !HAVE_MMAP && !HAVE_POSIX_MEMALIGN */
+ size_t pagesize = getpagesize ();
+ void *unaligned_ptr = malloc (size + pagesize - 1);
+ if (unaligned_ptr == NULL)
+ {
+ /* Set errno. We don't know whether malloc already set errno: some
+ implementations of malloc do, some don't. */
+ errno = ENOMEM;
+ return NULL;
+ }
+ ret = (char *) unaligned_ptr
+ + ((- (unsigned long) unaligned_ptr) & (pagesize - 1));
+ new_memnode (ret, unaligned_ptr);
+#endif /* HAVE_MMAP && HAVE_POSIX_MEMALIGN */
+ return ret;
+}
+
+
+void *
+pagealign_xalloc (size_t size)
+{
+ void *ret;
+
+ ret = pagealign_alloc (size);
+ if (ret == NULL)
+ xalloc_die ();
+ return ret;
+}
+
+
+void
+pagealign_free (void *aligned_ptr)
+{
+#if HAVE_MMAP
+ if (munmap (aligned_ptr, get_memnode (aligned_ptr)) < 0)
+ error (EXIT_FAILURE, errno, "Failed to unmap memory");
+#elif HAVE_POSIX_MEMALIGN
+ free (aligned_ptr);
+#else
+ free (get_memnode (aligned_ptr));
+#endif
+}
diff --git a/gnulib/lib/pagealign_alloc.h b/gnulib/lib/pagealign_alloc.h
new file mode 100644
index 00000000..d7770b50
--- /dev/null
+++ b/gnulib/lib/pagealign_alloc.h
@@ -0,0 +1,48 @@
+/* Memory allocation aligned to system page boundaries.
+
+ Copyright (C) 2005, 2008, 2009, 2010 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/>. */
+
+#ifndef _PAGEALIGN_ALLOC_H
+# define _PAGEALIGN_ALLOC_H
+
+# include <stddef.h>
+
+/* Allocate a block of memory of SIZE bytes, aligned on a system page
+ boundary.
+ If SIZE is not a multiple of the system page size, it will be rounded up
+ to the next multiple.
+ Return a pointer to the start of the memory block. Upon allocation failure,
+ return NULL and set errno. */
+extern void *pagealign_alloc (size_t size)
+# if __GNUC__ >= 3
+ __attribute__ ((__malloc__))
+# endif
+ ;
+
+/* Like pagealign_alloc, except it exits the program if the allocation
+ fails. */
+extern void *pagealign_xalloc (size_t size)
+# if __GNUC__ >= 3
+ __attribute__ ((__malloc__))
+# endif
+ ;
+
+/* Free a memory block.
+ PTR must be a non-NULL pointer returned by pagealign_alloc or
+ pagealign_xalloc. */
+extern void pagealign_free (void *ptr);
+
+#endif /* _PAGEALIGN_ALLOC_H */
diff --git a/gnulib/lib/parse-duration.c b/gnulib/lib/parse-duration.c
new file mode 100644
index 00000000..2f108538
--- /dev/null
+++ b/gnulib/lib/parse-duration.c
@@ -0,0 +1,595 @@
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "parse-duration.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "xalloc.h"
+
+#ifndef NUL
+#define NUL '\0'
+#endif
+
+#define cch_t char const
+
+typedef enum {
+ NOTHING_IS_DONE,
+ YEAR_IS_DONE,
+ MONTH_IS_DONE,
+ WEEK_IS_DONE,
+ DAY_IS_DONE,
+ HOUR_IS_DONE,
+ MINUTE_IS_DONE,
+ SECOND_IS_DONE
+} whats_done_t;
+
+#define SEC_PER_MIN 60
+#define SEC_PER_HR (SEC_PER_MIN * 60)
+#define SEC_PER_DAY (SEC_PER_HR * 24)
+#define SEC_PER_WEEK (SEC_PER_DAY * 7)
+#define SEC_PER_MONTH (SEC_PER_DAY * 30)
+#define SEC_PER_YEAR (SEC_PER_DAY * 365)
+
+#define TIME_MAX 0x7FFFFFFF
+
+/* Wrapper around strtoul that does not require a cast. */
+static unsigned long inline
+str_const_to_ul (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtoul (str, (char **)ppz, base);
+}
+
+/* Wrapper around strtol that does not require a cast. */
+static long inline
+str_const_to_l (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtol (str, (char **)ppz, base);
+}
+
+/* Returns BASE + VAL * SCALE, interpreting BASE = BAD_TIME
+ with errno set as an error situation, and returning BAD_TIME
+ with errno set in an error situation. */
+static time_t inline
+scale_n_add (time_t base, time_t val, int scale)
+{
+ if (base == BAD_TIME)
+ {
+ if (errno == 0)
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ if (val > TIME_MAX / scale)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ val *= scale;
+ if (base > TIME_MAX - val)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ return base + val;
+}
+
+/* After a number HH has been parsed, parse subsequent :MM or :MM:SS. */
+static time_t
+parse_hr_min_sec (time_t start, cch_t * pz)
+{
+ int lpct = 0;
+
+ errno = 0;
+
+ /* For as long as our scanner pointer points to a colon *AND*
+ we've not looped before, then keep looping. (two iterations max) */
+ while ((*pz == ':') && (lpct++ <= 1))
+ {
+ unsigned long v = str_const_to_ul (pz+1, &pz, 10);
+
+ if (errno != 0)
+ return BAD_TIME;
+
+ start = scale_n_add (v, start, 60);
+
+ if (errno != 0)
+ return BAD_TIME;
+ }
+
+ /* allow for trailing spaces */
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return start;
+}
+
+/* Parses a value and returns BASE + value * SCALE, interpreting
+ BASE = BAD_TIME with errno set as an error situation, and returning
+ BAD_TIME with errno set in an error situation. */
+static time_t
+parse_scaled_value (time_t base, cch_t ** ppz, cch_t * endp, int scale)
+{
+ cch_t * pz = *ppz;
+ time_t val;
+
+ if (base == BAD_TIME)
+ return base;
+
+ errno = 0;
+ val = str_const_to_ul (pz, &pz, 10);
+ if (errno != 0)
+ return BAD_TIME;
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (pz != endp)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ *ppz = pz;
+ return scale_n_add (base, val, scale);
+}
+
+/* Parses the syntax YEAR-MONTH-DAY.
+ PS points into the string, after "YEAR", before "-MONTH-DAY". */
+static time_t
+parse_year_month_day (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+
+ pz++; /* over the first '-' */
+ ps = strchr (pz, '-');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+
+ pz++; /* over the second '-' */
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+}
+
+/* Parses the syntax YYYYMMDD. */
+static time_t
+parse_yearmonthday (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[8];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 8)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 4);
+ buf[4] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 4, SEC_PER_YEAR);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MONTH);
+
+ memcpy (buf, in_pz + 6, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, SEC_PER_DAY);
+}
+
+/* Parses the syntax yy Y mm M ww W dd D. */
+static time_t
+parse_YMWD (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'Y');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+ pz++;
+ }
+
+ ps = strchr (pz, 'W');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_WEEK);
+ pz++;
+ }
+
+ ps = strchr (pz, 'D');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+/* Parses the syntax HH:MM:SS.
+ PS points into the string, after "HH", before ":MM:SS". */
+static time_t
+parse_hour_minute_second (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+
+ pz++;
+ ps = strchr (pz, ':');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+
+ pz++;
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, 1);
+}
+
+/* Parses the syntax HHMMSS. */
+static time_t
+parse_hourminutesecond (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[4];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 6)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 2, SEC_PER_HR);
+
+ memcpy (buf, in_pz + 2, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MIN);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, 1);
+}
+
+/* Parses the syntax hh H mm M ss S. */
+static time_t
+parse_HMS (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'H');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+ pz++;
+ }
+
+ ps = strchr (pz, 'S');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, 1);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+/* Parses a time (hours, minutes, seconds) specification in either syntax. */
+static time_t
+parse_time (cch_t * pz)
+{
+ cch_t * ps;
+ time_t res = 0;
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, ':');
+ if (ps != NULL)
+ {
+ res = parse_hour_minute_second (pz, ps);
+ }
+
+ /*
+ * Try for a 'H', 'M' or 'S' suffix
+ */
+ else if (ps = strpbrk (pz, "HMS"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_hourminutesecond (pz);
+ }
+
+ else
+ res = parse_HMS (pz);
+
+ return res;
+}
+
+/* Returns a substring of the given string, with spaces at the beginning and at
+ the end destructively removed. */
+static char *
+trim (char * pz)
+{
+ /* trim leading white space */
+ while (isspace ((unsigned char)*pz))
+ pz++;
+
+ /* trim trailing white space */
+ {
+ char * pe = pz + strlen (pz);
+ while ((pe > pz) && isspace ((unsigned char)pe[-1]))
+ pe--;
+ *pe = NUL;
+ }
+
+ return pz;
+}
+
+/*
+ * Parse the year/months/days of a time period
+ */
+static time_t
+parse_period (cch_t * in_pz)
+{
+ char * pz = xstrdup (in_pz);
+ char * pT = strchr (pz, 'T');
+ char * ps;
+ void * fptr = pz;
+ time_t res = 0;
+
+ if (pT != NUL)
+ {
+ *(pT++) = NUL;
+ pz = trim (pz);
+ pT = trim (pT);
+ }
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, '-');
+ if (ps != NULL)
+ {
+ res = parse_year_month_day (pz, ps);
+ }
+
+ /*
+ * Try for a 'Y', 'M' or 'D' suffix
+ */
+ else if (ps = strpbrk (pz, "YMWD"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_yearmonthday (pz);
+ }
+
+ else
+ res = parse_YMWD (pz);
+
+ if ((errno == 0) && (pT != NULL))
+ {
+ time_t val = parse_time (pT);
+ res = scale_n_add (res, val, 1);
+ }
+
+ free (fptr);
+ return res;
+}
+
+static time_t
+parse_non_iso8601(cch_t * pz)
+{
+ whats_done_t whatd_we_do = NOTHING_IS_DONE;
+
+ time_t res = 0;
+
+ do {
+ time_t val;
+
+ errno = 0;
+ val = str_const_to_l (pz, &pz, 10);
+ if (errno != 0)
+ goto bad_time;
+
+ /* IF we find a colon, then we're going to have a seconds value.
+ We will not loop here any more. We cannot already have parsed
+ a minute value and if we've parsed an hour value, then the result
+ value has to be less than an hour. */
+ if (*pz == ':')
+ {
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ break;
+
+ val = parse_hr_min_sec (val, pz);
+
+ if ((whatd_we_do == HOUR_IS_DONE) && (val >= SEC_PER_HR))
+ break;
+
+ return scale_n_add (res, val, 1);
+ }
+
+ {
+ unsigned int mult;
+
+ /* Skip over white space following the number we just parsed. */
+ while (isspace ((unsigned char)*pz))
+ pz++;
+
+ switch (*pz)
+ {
+ default: goto bad_time;
+ case NUL:
+ return scale_n_add (res, val, 1);
+
+ case 'y': case 'Y':
+ if (whatd_we_do >= YEAR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_YEAR;
+ whatd_we_do = YEAR_IS_DONE;
+ break;
+
+ case 'M':
+ if (whatd_we_do >= MONTH_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MONTH;
+ whatd_we_do = MONTH_IS_DONE;
+ break;
+
+ case 'W':
+ if (whatd_we_do >= WEEK_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_WEEK;
+ whatd_we_do = WEEK_IS_DONE;
+ break;
+
+ case 'd': case 'D':
+ if (whatd_we_do >= DAY_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_DAY;
+ whatd_we_do = DAY_IS_DONE;
+ break;
+
+ case 'h':
+ if (whatd_we_do >= HOUR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_HR;
+ whatd_we_do = HOUR_IS_DONE;
+ break;
+
+ case 'm':
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MIN;
+ whatd_we_do = MINUTE_IS_DONE;
+ break;
+
+ case 's':
+ mult = 1;
+ whatd_we_do = SECOND_IS_DONE;
+ break;
+ }
+
+ res = scale_n_add (res, val, mult);
+
+ pz++;
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (*pz == NUL)
+ return res;
+
+ if (! isdigit ((unsigned char)*pz))
+ break;
+ }
+
+ } while (whatd_we_do < SECOND_IS_DONE);
+
+ bad_time:
+ errno = EINVAL;
+ return BAD_TIME;
+}
+
+time_t
+parse_duration (char const * pz)
+{
+ while (isspace ((unsigned char)*pz))
+ pz++;
+
+ switch (*pz)
+ {
+ case 'P':
+ return parse_period (pz + 1);
+
+ case 'T':
+ return parse_time (pz + 1);
+
+ default:
+ if (isdigit ((unsigned char)*pz))
+ return parse_non_iso8601 (pz);
+
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "gnu"
+ * indent-tabs-mode: nil
+ * End:
+ * end of parse-duration.c */
diff --git a/gnulib/lib/parse-duration.h b/gnulib/lib/parse-duration.h
new file mode 100644
index 00000000..ea551840
--- /dev/null
+++ b/gnulib/lib/parse-duration.h
@@ -0,0 +1,90 @@
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ 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/>. */
+
+/*
+
+ Readers and users of this function are referred to the ISO-8601
+ specification, with particular attention to "Durations".
+
+ At the time of writing, this worked:
+
+ http://en.wikipedia.org/wiki/ISO_8601#Durations
+
+ The string must start with a 'P', 'T' or a digit.
+
+ ==== if it is a digit
+
+ the string may contain: NNN Y NNN M NNN W NNN d NNN h NNN m NNN s
+ This represents NNN years, NNN months, NNN weeks, NNN days, NNN hours,
+ NNN minutes and NNN seconds.
+ The embeded white space is optional.
+ These terms must appear in this order.
+ Case is significant: 'M' is months and 'm' is minutes.
+ The final "s" is optional.
+ All of the terms ("NNN" plus designator) are optional.
+ Minutes and seconds may optionally be represented as NNN:NNN.
+ Also, hours, minute and seconds may be represented as NNN:NNN:NNN.
+ There is no limitation on the value of any of the terms, except
+ that the final result must fit in a time_t value.
+
+ ==== if it is a 'P' or 'T', please see ISO-8601 for a rigorous definition.
+
+ The 'P' term may be followed by any of three formats:
+ yyyymmdd
+ yy-mm-dd
+ yy Y mm M ww W dd D
+
+ or it may be empty and followed by a 'T'. The "yyyymmdd" must be eight
+ digits long.
+
+ NOTE! Months are always 30 days and years are always 365 days long.
+ 5 years is always 1825 days, not 1826 or 1827 depending on leap year
+ considerations. 3 months is always 90 days. There is no consideration
+ for how many days are in the current, next or previous months.
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The meanings are yy years, mm months, ww weeks and dd days.
+ * The terms must appear in this order.
+
+ ==== The 'T' term may be followed by any of these formats:
+
+ hhmmss
+ hh:mm:ss
+ hh H mm M ss S
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The terms must appear in this order.
+
+ */
+#ifndef GNULIB_PARSE_DURATION_H
+#define GNULIB_PARSE_DURATION_H
+
+#include <time.h>
+
+/* Return value when a valid duration cannot be parsed. */
+#define BAD_TIME ((time_t)~0)
+
+/* Parses the given string. If it has the syntax of a valid duration,
+ this duration is returned. Otherwise, the return value is BAD_TIME,
+ and errno is set to either EINVAL (bad syntax) or ERANGE (out of range). */
+extern time_t parse_duration(char const * in_pz);
+
+#endif /* GNULIB_PARSE_DURATION_H */
diff --git a/gnulib/lib/pathmax.h b/gnulib/lib/pathmax.h
new file mode 100644
index 00000000..610cabba
--- /dev/null
+++ b/gnulib/lib/pathmax.h
@@ -0,0 +1,48 @@
+/* Define PATH_MAX somehow. Requires sys/types.h.
+ Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PATHMAX_H
+# define _PATHMAX_H
+
+# include <unistd.h>
+
+# include <limits.h>
+
+# ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 256
+# endif
+
+# if !defined PATH_MAX && defined _PC_PATH_MAX && defined HAVE_PATHCONF
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
+ : pathconf ("/", _PC_PATH_MAX))
+# endif
+
+/* Don't include sys/param.h if it already has been. */
+# if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+# endif
+
+# if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# endif
+
+# ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+# endif
+
+#endif /* _PATHMAX_H */
diff --git a/gnulib/lib/perror.c b/gnulib/lib/perror.c
new file mode 100644
index 00000000..bc3c7649
--- /dev/null
+++ b/gnulib/lib/perror.c
@@ -0,0 +1,35 @@
+/* Print a message describing error code.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <string.h>
+
+void
+perror (const char *string)
+{
+ const char *errno_description = strerror (errno);
+
+ if (string != NULL && *string != '\0')
+ fprintf (stderr, "%s: %s\n", string, errno_description);
+ else
+ fprintf (stderr, "%s\n", errno_description);
+}
diff --git a/gnulib/lib/physmem.c b/gnulib/lib/physmem.c
new file mode 100644
index 00000000..1b19ef35
--- /dev/null
+++ b/gnulib/lib/physmem.c
@@ -0,0 +1,304 @@
+/* Calculate the size of physical memory.
+
+ Copyright (C) 2000-2001, 2003, 2005-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "physmem.h"
+
+#include <unistd.h>
+
+#if HAVE_SYS_PSTAT_H
+# include <sys/pstat.h>
+#endif
+
+#if HAVE_SYS_SYSMP_H
+# include <sys/sysmp.h>
+#endif
+
+#if HAVE_SYS_SYSINFO_H && HAVE_MACHINE_HAL_SYSINFO_H
+# include <sys/sysinfo.h>
+# include <machine/hal_sysinfo.h>
+#endif
+
+#if HAVE_SYS_TABLE_H
+# include <sys/table.h>
+#endif
+
+#include <sys/types.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if HAVE_SYS_SYSCTL_H
+# include <sys/sysctl.h>
+#endif
+
+#if HAVE_SYS_SYSTEMCFG_H
+# include <sys/systemcfg.h>
+#endif
+
+#ifdef _WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* MEMORYSTATUSEX is missing from older windows headers, so define
+ a local replacement. */
+typedef struct
+{
+ DWORD dwLength;
+ DWORD dwMemoryLoad;
+ DWORDLONG ullTotalPhys;
+ DWORDLONG ullAvailPhys;
+ DWORDLONG ullTotalPageFile;
+ DWORDLONG ullAvailPageFile;
+ DWORDLONG ullTotalVirtual;
+ DWORDLONG ullAvailVirtual;
+ DWORDLONG ullAvailExtendedVirtual;
+} lMEMORYSTATUSEX;
+typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*);
+#endif
+
+#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
+
+/* Return the total amount of physical memory. */
+double
+physmem_total (void)
+{
+#if defined _SC_PHYS_PAGES && defined _SC_PAGESIZE
+ { /* This works on linux-gnu, solaris2 and cygwin. */
+ double pages = sysconf (_SC_PHYS_PAGES);
+ double pagesize = sysconf (_SC_PAGESIZE);
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+#endif
+
+#if HAVE_PSTAT_GETSTATIC
+ { /* This works on hpux11. */
+ struct pst_static pss;
+ if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0))
+ {
+ double pages = pss.physical_memory;
+ double pagesize = pss.page_size;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_SYSMP && defined MP_SAGET && defined MPSA_RMINFO && defined _SC_PAGESIZE
+ { /* This works on irix6. */
+ struct rminfo realmem;
+ if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0)
+ {
+ double pagesize = sysconf (_SC_PAGESIZE);
+ double pages = realmem.physmem;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_GETSYSINFO && defined GSI_PHYSMEM
+ { /* This works on Tru64 UNIX V4/5. */
+ int physmem;
+
+ if (getsysinfo (GSI_PHYSMEM, (caddr_t) &physmem, sizeof (physmem),
+ NULL, NULL, NULL) == 1)
+ {
+ double kbytes = physmem;
+
+ if (0 <= kbytes)
+ return kbytes * 1024.0;
+ }
+ }
+#endif
+
+#if HAVE_SYSCTL && defined HW_PHYSMEM
+ { /* This works on *bsd and darwin. */
+ unsigned int physmem;
+ size_t len = sizeof physmem;
+ static int mib[2] = { CTL_HW, HW_PHYSMEM };
+
+ if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0
+ && len == sizeof (physmem))
+ return (double) physmem;
+ }
+#endif
+
+#if HAVE__SYSTEM_CONFIGURATION
+ /* This works on AIX. */
+ return _system_configuration.physmem;
+#endif
+
+#if defined _WIN32
+ { /* this works on windows */
+ PFN_MS_EX pfnex;
+ HMODULE h = GetModuleHandle ("kernel32.dll");
+
+ if (!h)
+ return 0.0;
+
+ /* Use GlobalMemoryStatusEx if available. */
+ if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx")))
+ {
+ lMEMORYSTATUSEX lms_ex;
+ lms_ex.dwLength = sizeof lms_ex;
+ if (!pfnex (&lms_ex))
+ return 0.0;
+ return (double) lms_ex.ullTotalPhys;
+ }
+
+ /* Fall back to GlobalMemoryStatus which is always available.
+ but returns wrong results for physical memory > 4GB. */
+ else
+ {
+ MEMORYSTATUS ms;
+ GlobalMemoryStatus (&ms);
+ return (double) ms.dwTotalPhys;
+ }
+ }
+#endif
+
+ /* Guess 64 MB. It's probably an older host, so guess small. */
+ return 64 * 1024 * 1024;
+}
+
+/* Return the amount of physical memory available. */
+double
+physmem_available (void)
+{
+#if defined _SC_AVPHYS_PAGES && defined _SC_PAGESIZE
+ { /* This works on linux-gnu, solaris2 and cygwin. */
+ double pages = sysconf (_SC_AVPHYS_PAGES);
+ double pagesize = sysconf (_SC_PAGESIZE);
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+#endif
+
+#if HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC
+ { /* This works on hpux11. */
+ struct pst_static pss;
+ struct pst_dynamic psd;
+ if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0)
+ && 0 <= pstat_getdynamic (&psd, sizeof psd, 1, 0))
+ {
+ double pages = psd.psd_free;
+ double pagesize = pss.page_size;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_SYSMP && defined MP_SAGET && defined MPSA_RMINFO && defined _SC_PAGESIZE
+ { /* This works on irix6. */
+ struct rminfo realmem;
+ if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0)
+ {
+ double pagesize = sysconf (_SC_PAGESIZE);
+ double pages = realmem.availrmem;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_TABLE && defined TBL_VMSTATS
+ { /* This works on Tru64 UNIX V4/5. */
+ struct tbl_vmstats vmstats;
+
+ if (table (TBL_VMSTATS, 0, &vmstats, 1, sizeof (vmstats)) == 1)
+ {
+ double pages = vmstats.free_count;
+ double pagesize = vmstats.pagesize;
+
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_SYSCTL && defined HW_USERMEM
+ { /* This works on *bsd and darwin. */
+ unsigned int usermem;
+ size_t len = sizeof usermem;
+ static int mib[2] = { CTL_HW, HW_USERMEM };
+
+ if (sysctl (mib, ARRAY_SIZE (mib), &usermem, &len, NULL, 0) == 0
+ && len == sizeof (usermem))
+ return (double) usermem;
+ }
+#endif
+
+#if defined _WIN32
+ { /* this works on windows */
+ PFN_MS_EX pfnex;
+ HMODULE h = GetModuleHandle ("kernel32.dll");
+
+ if (!h)
+ return 0.0;
+
+ /* Use GlobalMemoryStatusEx if available. */
+ if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx")))
+ {
+ lMEMORYSTATUSEX lms_ex;
+ lms_ex.dwLength = sizeof lms_ex;
+ if (!pfnex (&lms_ex))
+ return 0.0;
+ return (double) lms_ex.ullAvailPhys;
+ }
+
+ /* Fall back to GlobalMemoryStatus which is always available.
+ but returns wrong results for physical memory > 4GB */
+ else
+ {
+ MEMORYSTATUS ms;
+ GlobalMemoryStatus (&ms);
+ return (double) ms.dwAvailPhys;
+ }
+ }
+#endif
+
+ /* Guess 25% of physical memory. */
+ return physmem_total () / 4;
+}
+
+
+#if DEBUG
+
+# include <stdio.h>
+# include <stdlib.h>
+
+int
+main (void)
+{
+ printf ("%12.f %12.f\n", physmem_total (), physmem_available ());
+ exit (0);
+}
+
+#endif /* DEBUG */
+
+/*
+Local Variables:
+compile-command: "gcc -DDEBUG -g -O -Wall -W physmem.c"
+End:
+*/
diff --git a/gnulib/lib/physmem.h b/gnulib/lib/physmem.h
new file mode 100644
index 00000000..f77d85be
--- /dev/null
+++ b/gnulib/lib/physmem.h
@@ -0,0 +1,26 @@
+/* Calculate the size of physical memory.
+
+ Copyright (C) 2000, 2003, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef PHYSMEM_H_
+# define PHYSMEM_H_ 1
+
+double physmem_total (void);
+double physmem_available (void);
+
+#endif /* PHYSMEM_H_ */
diff --git a/gnulib/lib/pipe-filter-aux.h b/gnulib/lib/pipe-filter-aux.h
new file mode 100644
index 00000000..179c296b
--- /dev/null
+++ b/gnulib/lib/pipe-filter-aux.h
@@ -0,0 +1,116 @@
+/* Auxiliary code for filtering of data through a subprocess.
+ Copyright (C) 2001-2003, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2009.
+
+ 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/>. */
+
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+/* We use a child process, and communicate through a bidirectional pipe.
+ To avoid deadlocks, let the child process decide when it wants to read
+ or to write, and let the parent behave accordingly. The parent uses
+ select() to know whether it must write or read. On platforms without
+ select(), we use non-blocking I/O. (This means the parent is busy
+ looping while waiting for the child. Not good. But hardly any platform
+ lacks select() nowadays.) */
+
+/* On BeOS select() works only on sockets, not on normal file descriptors. */
+#ifdef __BEOS__
+# undef HAVE_SELECT
+#endif
+
+#ifdef EINTR
+
+/* EINTR handling for close(), read(), write(), select().
+ These functions can return -1/EINTR even though we don't have any
+ signal handlers set up, namely when we get interrupted via SIGSTOP. */
+
+static inline int
+nonintr_close (int fd)
+{
+ int retval;
+
+ do
+ retval = close (fd);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef close /* avoid warning related to gnulib module unistd */
+#define close nonintr_close
+
+static inline ssize_t
+nonintr_read (int fd, void *buf, size_t count)
+{
+ ssize_t retval;
+
+ do
+ retval = read (fd, buf, count);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#define read nonintr_read
+
+static inline ssize_t
+nonintr_write (int fd, const void *buf, size_t count)
+{
+ ssize_t retval;
+
+ do
+ retval = write (fd, buf, count);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef write /* avoid warning on VMS */
+#define write nonintr_write
+
+# if HAVE_SELECT
+
+static inline int
+nonintr_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+ struct timeval *timeout)
+{
+ int retval;
+
+ do
+ retval = select (n, readfds, writefds, exceptfds, timeout);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+# undef select /* avoid warning on VMS */
+# define select nonintr_select
+
+# endif
+
+#endif
+
+/* Non-blocking I/O. */
+#ifndef O_NONBLOCK
+# define O_NONBLOCK O_NDELAY
+#endif
+#if HAVE_SELECT
+# define IS_EAGAIN(errcode) 0
+#else
+# ifdef EWOULDBLOCK
+# define IS_EAGAIN(errcode) ((errcode) == EAGAIN || (errcode) == EWOULDBLOCK)
+# else
+# define IS_EAGAIN(errcode) ((errcode) == EAGAIN)
+# endif
+#endif
diff --git a/gnulib/lib/pipe-filter-gi.c b/gnulib/lib/pipe-filter-gi.c
new file mode 100644
index 00000000..19521836
--- /dev/null
+++ b/gnulib/lib/pipe-filter-gi.c
@@ -0,0 +1,558 @@
+/* Filtering of data through a subprocess.
+ Copyright (C) 2001-2003, 2008-2010 Free Software Foundation, Inc.
+ Written by Paolo Bonzini <bonzini@gnu.org>, 2009,
+ and Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "pipe-filter.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <windows.h>
+#else
+# include <signal.h>
+# include <sys/select.h>
+#endif
+
+#include "error.h"
+#include "pipe.h"
+#include "wait-process.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#include "pipe-filter-aux.h"
+
+struct pipe_filter_gi
+{
+ /* Arguments passed to pipe_filter_gi_create. */
+ const char *progname;
+ bool null_stderr;
+ bool exit_on_error;
+ prepare_read_fn prepare_read;
+ done_read_fn done_read;
+ void *private_data;
+
+ /* Management of the subprocess. */
+ pid_t child;
+ int fd[2];
+ bool exited;
+ int exitstatus;
+
+ /* Status of the writer part. */
+ volatile bool writer_terminated;
+ int writer_errno;
+ /* Status of the reader part. */
+ volatile bool reader_terminated;
+ volatile int reader_errno;
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ CRITICAL_SECTION lock; /* protects the volatile fields */
+ HANDLE reader_thread_handle;
+#else
+ struct sigaction orig_sigpipe_action;
+ fd_set readfds; /* All bits except fd[0] are always cleared. */
+ fd_set writefds; /* All bits except fd[1] are always cleared. */
+#endif
+};
+
+
+/* Platform dependent functions. */
+
+/* Perform additional initializations.
+ Return 0 if successful, -1 upon failure. */
+static inline int filter_init (struct pipe_filter_gi *filter);
+
+/* Write count bytes starting at buf, while at the same time invoking the
+ read iterator (the functions prepare_read/done_read) when needed. */
+static void filter_loop (struct pipe_filter_gi *filter,
+ const char *wbuf, size_t count);
+
+/* Perform cleanup actions at the end.
+ finish_reading is true if there was no error, or false if some error
+ occurred already. */
+static inline void filter_cleanup (struct pipe_filter_gi *filter,
+ bool finish_reading);
+
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+static unsigned int WINAPI
+reader_thread_func (void *thread_arg)
+{
+ struct pipe_filter_gi *filter = (struct pipe_filter_gi *) thread_arg;
+
+ for (;;)
+ {
+ size_t bufsize;
+ void *buf = filter->prepare_read (&bufsize, filter->private_data);
+ if (!(buf != NULL && bufsize > 0))
+ /* prepare_read returned wrong values. */
+ abort ();
+ {
+ ssize_t nread =
+ read (filter->fd[0], buf, bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ EnterCriticalSection (&filter->lock);
+ /* If the writer already encountered an error, terminate. */
+ if (filter->writer_terminated)
+ break;
+ if (nread < 0)
+ {
+ filter->reader_errno = errno;
+ break;
+ }
+ else if (nread > 0)
+ filter->done_read (buf, nread, filter->private_data);
+ else /* nread == 0 */
+ break;
+ LeaveCriticalSection (&filter->lock);
+ }
+ }
+
+ filter->reader_terminated = true;
+ LeaveCriticalSection (&filter->lock);
+ _endthreadex (0); /* calls ExitThread (0) */
+ abort ();
+}
+
+static inline int
+filter_init (struct pipe_filter_gi *filter)
+{
+ InitializeCriticalSection (&filter->lock);
+ EnterCriticalSection (&filter->lock);
+
+ filter->reader_thread_handle =
+ (HANDLE) _beginthreadex (NULL, 100000, reader_thread_func, filter,
+ 0, NULL);
+
+ if (filter->reader_thread_handle == NULL)
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, 0, _("creation of reading thread failed"));
+ return -1;
+ }
+ else
+ return 0;
+}
+
+static void
+filter_loop (struct pipe_filter_gi *filter, const char *wbuf, size_t count)
+{
+ if (!filter->writer_terminated)
+ {
+ for (;;)
+ {
+ ssize_t nwritten;
+
+ /* Allow the reader thread to continue. */
+ LeaveCriticalSection (&filter->lock);
+
+ nwritten =
+ write (filter->fd[1], wbuf, count > SSIZE_MAX ? SSIZE_MAX : count);
+
+ /* Get the lock back from the reader thread. */
+ EnterCriticalSection (&filter->lock);
+
+ if (nwritten < 0)
+ {
+ /* Don't assume that the gnulib modules 'write' and 'sigpipe' are
+ used. */
+ if (GetLastError () == ERROR_NO_DATA)
+ errno = EPIPE;
+ filter->writer_errno = errno;
+ filter->writer_terminated = true;
+ break;
+ }
+ else if (nwritten > 0)
+ {
+ count -= nwritten;
+ if (count == 0)
+ break;
+ wbuf += nwritten;
+ }
+ else /* nwritten == 0 */
+ {
+ filter->writer_terminated = true;
+ break;
+ }
+ }
+ }
+}
+
+static inline void
+filter_cleanup (struct pipe_filter_gi *filter, bool finish_reading)
+{
+ if (finish_reading)
+ {
+ LeaveCriticalSection (&filter->lock);
+ WaitForSingleObject (filter->reader_thread_handle, INFINITE);
+ }
+ else
+ TerminateThread (filter->reader_thread_handle, 1);
+
+ CloseHandle (filter->reader_thread_handle);
+ DeleteCriticalSection (&filter->lock);
+}
+
+#else
+/* Unix API. */
+
+static inline int
+filter_init (struct pipe_filter_gi *filter)
+{
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ /* When we write to the child process and it has just terminated,
+ we don't want to die from a SIGPIPE signal. So set the SIGPIPE
+ handler to SIG_IGN, and handle EPIPE error codes in write(). */
+ {
+ struct sigaction sigpipe_action;
+
+ sigpipe_action.sa_handler = SIG_IGN;
+ sigpipe_action.sa_flags = 0;
+ sigemptyset (&sigpipe_action.sa_mask);
+ if (sigaction (SIGPIPE, &sigpipe_action, &filter->orig_sigpipe_action) < 0)
+ abort ();
+ }
+#endif
+
+ /* Enable non-blocking I/O. This permits the read() and write() calls
+ to return -1/EAGAIN without blocking; this is important for polling
+ if HAVE_SELECT is not defined. It also permits the read() and write()
+ calls to return after partial reads/writes; this is important if
+ HAVE_SELECT is defined, because select() only says that some data
+ can be read or written, not how many. Without non-blocking I/O,
+ Linux 2.2.17 and BSD systems prefer to block instead of returning
+ with partial results. */
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (filter->fd[1], F_GETFL, 0)) < 0
+ || fcntl (filter->fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1
+ || (fcntl_flags = fcntl (filter->fd[0], F_GETFL, 0)) < 0
+ || fcntl (filter->fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1)
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("cannot set up nonblocking I/O to %s subprocess"),
+ filter->progname);
+ return -1;
+ }
+ }
+
+ FD_ZERO (&filter->readfds);
+ FD_ZERO (&filter->writefds);
+
+ return 0;
+}
+
+static void
+filter_loop (struct pipe_filter_gi *filter, const char *wbuf, size_t count)
+{
+ /* This function is used in two situations:
+ - in order to write some data to the subprocess
+ [done_writing = false],
+ - in order to read the remaining data after everything was written
+ [done_writing = true]. In this case buf is NULL and count is
+ ignored. */
+ bool done_writing = (wbuf == NULL);
+
+ if (!done_writing)
+ {
+ if (filter->writer_terminated || filter->reader_terminated)
+ /* pipe_filter_gi_write was called when it should not be. */
+ abort ();
+ }
+ else
+ {
+ if (filter->reader_terminated)
+ return;
+ }
+
+ /* Loop, trying to write the given buffer or reading, whichever is
+ possible. */
+ for (;;)
+ {
+ /* Here filter->writer_terminated is false. When it becomes true, this
+ loop is terminated. */
+ /* Whereas filter->reader_terminated is initially false but may become
+ true during this loop. */
+ /* Here, if !done_writing, count > 0. When count becomes 0, this loop
+ is terminated. */
+ /* Here, if done_writing, filter->reader_terminated is false. When
+ filter->reader_terminated becomes true, this loop is terminated. */
+# if HAVE_SELECT
+ int n;
+
+ /* See whether reading or writing is possible. */
+ n = 1;
+ if (!filter->reader_terminated)
+ {
+ FD_SET (filter->fd[0], &filter->readfds);
+ n = filter->fd[0] + 1;
+ }
+ if (!done_writing)
+ {
+ FD_SET (filter->fd[1], &filter->writefds);
+ if (n <= filter->fd[1])
+ n = filter->fd[1] + 1;
+ }
+ n = select (n,
+ (!filter->reader_terminated ? &filter->readfds : NULL),
+ (!done_writing ? &filter->writefds : NULL),
+ NULL, NULL);
+
+ if (n < 0)
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("communication with %s subprocess failed"),
+ filter->progname);
+ filter->writer_errno = errno;
+ filter->writer_terminated = true;
+ break;
+ }
+
+ if (!done_writing && FD_ISSET (filter->fd[1], &filter->writefds))
+ goto try_write;
+ if (!filter->reader_terminated
+ && FD_ISSET (filter->fd[0], &filter->readfds))
+ goto try_read;
+ /* How could select() return if none of the two descriptors is ready? */
+ abort ();
+# endif
+
+ /* Attempt to write. */
+# if HAVE_SELECT
+ try_write:
+# endif
+ if (!done_writing)
+ {
+ ssize_t nwritten =
+ write (filter->fd[1], wbuf, count > SSIZE_MAX ? SSIZE_MAX : count);
+ if (nwritten < 0)
+ {
+ if (!IS_EAGAIN (errno))
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("write to %s subprocess failed"),
+ filter->progname);
+ filter->writer_errno = errno;
+ filter->writer_terminated = true;
+ break;
+ }
+ }
+ else if (nwritten > 0)
+ {
+ count -= nwritten;
+ if (count == 0)
+ break;
+ wbuf += nwritten;
+ }
+ }
+# if HAVE_SELECT
+ continue;
+# endif
+
+ /* Attempt to read. */
+# if HAVE_SELECT
+ try_read:
+# endif
+ if (!filter->reader_terminated)
+ {
+ size_t bufsize;
+ void *buf = filter->prepare_read (&bufsize, filter->private_data);
+ if (!(buf != NULL && bufsize > 0))
+ /* prepare_read returned wrong values. */
+ abort ();
+ {
+ ssize_t nread =
+ read (filter->fd[0], buf,
+ bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nread < 0)
+ {
+ if (!IS_EAGAIN (errno))
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("read from %s subprocess failed"),
+ filter->progname);
+ filter->reader_errno = errno;
+ filter->reader_terminated = true;
+ break;
+ }
+ }
+ else if (nread > 0)
+ filter->done_read (buf, nread, filter->private_data);
+ else /* nread == 0 */
+ {
+ filter->reader_terminated = true;
+ if (done_writing)
+ break;
+ }
+ }
+ }
+# if HAVE_SELECT
+ continue;
+# endif
+ }
+}
+
+static void
+filter_cleanup (struct pipe_filter_gi *filter, bool finish_reading)
+{
+ if (finish_reading)
+ /* A select loop, with done_writing = true. */
+ filter_loop (filter, NULL, 0);
+
+ if (sigaction (SIGPIPE, &filter->orig_sigpipe_action, NULL) < 0)
+ abort ();
+}
+
+#endif
+
+
+/* Terminate the child process. Do nothing if it already exited. */
+static void
+filter_terminate (struct pipe_filter_gi *filter)
+{
+ if (!filter->exited)
+ {
+ /* Tell the child there is nothing more the parent will send. */
+ close (filter->fd[1]);
+ filter_cleanup (filter, !filter->reader_terminated);
+ close (filter->fd[0]);
+ filter->exitstatus =
+ wait_subprocess (filter->child, filter->progname, true,
+ filter->null_stderr, true, filter->exit_on_error,
+ NULL);
+ if (filter->exitstatus != 0 && filter->exit_on_error)
+ error (EXIT_FAILURE, 0,
+ _("subprocess %s terminated with exit code %d"),
+ filter->progname, filter->exitstatus);
+ filter->exited = true;
+ }
+}
+
+/* After filter_terminate:
+ Return 0 upon success, or (only if exit_on_error is false):
+ - -1 with errno set upon failure,
+ - the positive exit code of the subprocess if that failed. */
+static inline int
+filter_retcode (struct pipe_filter_gi *filter)
+{
+ if (filter->writer_errno != 0)
+ {
+ errno = filter->writer_errno;
+ return -1;
+ }
+ else if (filter->reader_errno != 0)
+ {
+ errno = filter->reader_errno;
+ return -1;
+ }
+ else
+ return filter->exitstatus;
+}
+
+struct pipe_filter_gi *
+pipe_filter_gi_create (const char *progname,
+ const char *prog_path, const char **prog_argv,
+ bool null_stderr, bool exit_on_error,
+ prepare_read_fn prepare_read,
+ done_read_fn done_read,
+ void *private_data)
+{
+ struct pipe_filter_gi *filter;
+
+ filter =
+ (struct pipe_filter_gi *) xmalloc (sizeof (struct pipe_filter_gi));
+
+ /* Open a bidirectional pipe to a subprocess. */
+ filter->child = create_pipe_bidi (progname, prog_path, (char **) prog_argv,
+ null_stderr, true, exit_on_error,
+ filter->fd);
+ filter->progname = progname;
+ filter->null_stderr = null_stderr;
+ filter->exit_on_error = exit_on_error;
+ filter->prepare_read = prepare_read;
+ filter->done_read = done_read;
+ filter->private_data = private_data;
+ filter->exited = false;
+ filter->exitstatus = 0;
+ filter->writer_terminated = false;
+ filter->writer_errno = 0;
+ filter->reader_terminated = false;
+ filter->reader_errno = 0;
+
+ if (filter->child == -1)
+ {
+ /* Child process could not be created.
+ Arrange for filter_retcode (filter) to be the current errno. */
+ filter->writer_errno = errno;
+ filter->writer_terminated = true;
+ filter->exited = true;
+ }
+ else if (filter_init (filter) < 0)
+ filter_terminate (filter);
+
+ return filter;
+}
+
+int
+pipe_filter_gi_write (struct pipe_filter_gi *filter,
+ const void *buf, size_t size)
+{
+ if (buf == NULL)
+ /* Invalid argument. */
+ abort ();
+
+ if (filter->exited)
+ return filter_retcode (filter);
+
+ if (size > 0)
+ {
+ filter_loop (filter, buf, size);
+ if (filter->writer_terminated || filter->reader_terminated)
+ {
+ filter_terminate (filter);
+ return filter_retcode (filter);
+ }
+ }
+ return 0;
+}
+
+int
+pipe_filter_gi_close (struct pipe_filter_gi *filter)
+{
+ int ret;
+ int saved_errno;
+
+ filter_terminate (filter);
+ ret = filter_retcode (filter);
+ saved_errno = errno;
+ free (filter);
+ errno = saved_errno;
+ return ret;
+}
diff --git a/gnulib/lib/pipe-filter-ii.c b/gnulib/lib/pipe-filter-ii.c
new file mode 100644
index 00000000..b25662d0
--- /dev/null
+++ b/gnulib/lib/pipe-filter-ii.c
@@ -0,0 +1,446 @@
+/* Filtering of data through a subprocess.
+ Copyright (C) 2001-2003, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "pipe-filter.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <windows.h>
+#else
+# include <signal.h>
+# include <sys/select.h>
+#endif
+
+#include "error.h"
+#include "pipe.h"
+#include "wait-process.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#include "pipe-filter-aux.h"
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+struct locals
+{
+ /* Arguments passed to pipe_filter_ii_execute. */
+ prepare_write_fn prepare_write;
+ done_write_fn done_write;
+ prepare_read_fn prepare_read;
+ done_read_fn done_read;
+
+ /* Management of the subprocess. */
+ void *private_data;
+ int fd[2];
+
+ /* Status of the writer part. */
+ volatile bool writer_terminated;
+ volatile int writer_errno;
+ /* Status of the reader part. */
+ volatile bool reader_terminated;
+ volatile int reader_errno;
+};
+
+static unsigned int WINAPI
+writer_thread_func (void *thread_arg)
+{
+ struct locals *l = (struct locals *) thread_arg;
+
+ for (;;)
+ {
+ size_t bufsize;
+ const void *buf = l->prepare_write (&bufsize, l->private_data);
+ if (buf != NULL)
+ {
+ ssize_t nwritten =
+ write (l->fd[1], buf, bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nwritten < 0)
+ {
+ /* Don't assume that the gnulib modules 'write' and 'sigpipe' are
+ used. */
+ if (GetLastError () == ERROR_NO_DATA)
+ errno = EPIPE;
+ l->writer_errno = errno;
+ break;
+ }
+ else if (nwritten > 0)
+ l->done_write ((void *) buf, nwritten, l->private_data);
+ }
+ else
+ break;
+ }
+
+ l->writer_terminated = true;
+ _endthreadex (0); /* calls ExitThread (0) */
+ abort ();
+}
+
+static unsigned int WINAPI
+reader_thread_func (void *thread_arg)
+{
+ struct locals *l = (struct locals *) thread_arg;
+
+ for (;;)
+ {
+ size_t bufsize;
+ void *buf = l->prepare_read (&bufsize, l->private_data);
+ if (!(buf != NULL && bufsize > 0))
+ /* prepare_read returned wrong values. */
+ abort ();
+ {
+ ssize_t nread =
+ read (l->fd[0], buf, bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nread < 0)
+ {
+ l->reader_errno = errno;
+ break;
+ }
+ else if (nread > 0)
+ l->done_read (buf, nread, l->private_data);
+ else /* nread == 0 */
+ break;
+ }
+ }
+
+ l->reader_terminated = true;
+ _endthreadex (0); /* calls ExitThread (0) */
+ abort ();
+}
+
+#endif
+
+int
+pipe_filter_ii_execute (const char *progname,
+ const char *prog_path, const char **prog_argv,
+ bool null_stderr, bool exit_on_error,
+ prepare_write_fn prepare_write,
+ done_write_fn done_write,
+ prepare_read_fn prepare_read,
+ done_read_fn done_read,
+ void *private_data)
+{
+ pid_t child;
+ int fd[2];
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ struct sigaction orig_sigpipe_action;
+#endif
+
+ /* Open a bidirectional pipe to a subprocess. */
+ child = create_pipe_bidi (progname, prog_path, (char **) prog_argv,
+ null_stderr, true, exit_on_error,
+ fd);
+ if (child == -1)
+ return -1;
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Native Woe32 API. */
+ /* Pipes have a non-blocking mode, see function SetNamedPipeHandleState and
+ the article "Named Pipe Type, Read, and Wait Modes", but Microsoft's
+ documentation discourages its use. So don't use it.
+ Asynchronous I/O is also not suitable because it notifies the caller only
+ about completion of the I/O request, not about intermediate progress.
+ So do the writing and the reading in separate threads. */
+ {
+ struct locals l;
+ HANDLE handles[2];
+ #define writer_thread_handle handles[0]
+ #define reader_thread_handle handles[1]
+ bool writer_cleaned_up;
+ bool reader_cleaned_up;
+
+ l.prepare_write = prepare_write;
+ l.done_write = done_write;
+ l.prepare_read = prepare_read;
+ l.done_read = done_read;
+ l.private_data = private_data;
+ l.fd[0] = fd[0];
+ l.fd[1] = fd[1];
+ l.writer_terminated = false;
+ l.writer_errno = 0;
+ l.reader_terminated = false;
+ l.reader_errno = 0;
+
+ writer_thread_handle =
+ (HANDLE) _beginthreadex (NULL, 100000, writer_thread_func, &l, 0, NULL);
+ reader_thread_handle =
+ (HANDLE) _beginthreadex (NULL, 100000, reader_thread_func, &l, 0, NULL);
+ if (writer_thread_handle == NULL || reader_thread_handle == NULL)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, 0, _("creation of threads failed"));
+ if (reader_thread_handle != NULL)
+ CloseHandle (reader_thread_handle);
+ if (writer_thread_handle != NULL)
+ CloseHandle (writer_thread_handle);
+ goto fail;
+ }
+ writer_cleaned_up = false;
+ reader_cleaned_up = false;
+ for (;;)
+ {
+ DWORD ret;
+
+ /* Here !(writer_cleaned_up && reader_cleaned_up). */
+ if (writer_cleaned_up)
+ ret = WaitForSingleObject (reader_thread_handle, INFINITE);
+ else if (reader_cleaned_up)
+ ret = WaitForSingleObject (writer_thread_handle, INFINITE);
+ else
+ ret = WaitForMultipleObjects (2, handles, FALSE, INFINITE);
+ if (!(ret == WAIT_OBJECT_0 + 0 || ret == WAIT_OBJECT_0 + 1))
+ abort ();
+
+ if (l.writer_terminated)
+ {
+ /* The writer thread has just terminated. */
+ l.writer_terminated = false;
+ CloseHandle (writer_thread_handle);
+ if (l.writer_errno)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, l.writer_errno,
+ _("write to %s subprocess failed"), progname);
+ if (!reader_cleaned_up)
+ {
+ TerminateThread (reader_thread_handle, 1);
+ CloseHandle (reader_thread_handle);
+ }
+ goto fail;
+ }
+ /* Tell the child there is nothing more the parent will send. */
+ close (fd[1]);
+ writer_cleaned_up = true;
+ }
+ if (l.reader_terminated)
+ {
+ /* The reader thread has just terminated. */
+ l.reader_terminated = false;
+ CloseHandle (reader_thread_handle);
+ if (l.reader_errno)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, l.reader_errno,
+ _("read from %s subprocess failed"), progname);
+ if (!writer_cleaned_up)
+ {
+ TerminateThread (writer_thread_handle, 1);
+ CloseHandle (writer_thread_handle);
+ }
+ goto fail;
+ }
+ reader_cleaned_up = true;
+ }
+ if (writer_cleaned_up && reader_cleaned_up)
+ break;
+ }
+ }
+#else
+ /* When we write to the child process and it has just terminated,
+ we don't want to die from a SIGPIPE signal. So set the SIGPIPE
+ handler to SIG_IGN, and handle EPIPE error codes in write(). */
+ {
+ struct sigaction sigpipe_action;
+
+ sigpipe_action.sa_handler = SIG_IGN;
+ sigpipe_action.sa_flags = 0;
+ sigemptyset (&sigpipe_action.sa_mask);
+ if (sigaction (SIGPIPE, &sigpipe_action, &orig_sigpipe_action) < 0)
+ abort ();
+ }
+
+ {
+# if HAVE_SELECT
+ fd_set readfds; /* All bits except fd[0] are always cleared. */
+ fd_set writefds; /* All bits except fd[1] are always cleared. */
+# endif
+ bool done_writing;
+
+ /* Enable non-blocking I/O. This permits the read() and write() calls
+ to return -1/EAGAIN without blocking; this is important for polling
+ if HAVE_SELECT is not defined. It also permits the read() and write()
+ calls to return after partial reads/writes; this is important if
+ HAVE_SELECT is defined, because select() only says that some data
+ can be read or written, not how many. Without non-blocking I/O,
+ Linux 2.2.17 and BSD systems prefer to block instead of returning
+ with partial results. */
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd[1], F_GETFL, 0)) < 0
+ || fcntl (fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1
+ || (fcntl_flags = fcntl (fd[0], F_GETFL, 0)) < 0
+ || fcntl (fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("cannot set up nonblocking I/O to %s subprocess"),
+ progname);
+ goto fail;
+ }
+ }
+
+# if HAVE_SELECT
+ FD_ZERO (&readfds);
+ FD_ZERO (&writefds);
+# endif
+ done_writing = false;
+ for (;;)
+ {
+# if HAVE_SELECT
+ int n;
+
+ FD_SET (fd[0], &readfds);
+ n = fd[0] + 1;
+ if (!done_writing)
+ {
+ FD_SET (fd[1], &writefds);
+ if (n <= fd[1])
+ n = fd[1] + 1;
+ }
+
+ n = select (n, &readfds, (!done_writing ? &writefds : NULL), NULL,
+ NULL);
+ if (n < 0)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("communication with %s subprocess failed"), progname);
+ goto fail;
+ }
+ if (!done_writing && FD_ISSET (fd[1], &writefds))
+ goto try_write;
+ if (FD_ISSET (fd[0], &readfds))
+ goto try_read;
+ /* How could select() return if none of the two descriptors is ready? */
+ abort ();
+# endif
+
+ /* Attempt to write. */
+# if HAVE_SELECT
+ try_write:
+# endif
+ if (!done_writing)
+ {
+ size_t bufsize;
+ const void *buf = prepare_write (&bufsize, private_data);
+ if (buf != NULL)
+ {
+ ssize_t nwritten =
+ write (fd[1], buf,
+ bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nwritten < 0)
+ {
+ if (!IS_EAGAIN (errno))
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("write to %s subprocess failed"), progname);
+ goto fail;
+ }
+ }
+ else if (nwritten > 0)
+ done_write ((void *) buf, nwritten, private_data);
+ }
+ else
+ {
+ /* Tell the child there is nothing more the parent will send. */
+ close (fd[1]);
+ done_writing = true;
+ }
+ }
+# if HAVE_SELECT
+ continue;
+# endif
+
+ /* Attempt to read. */
+# if HAVE_SELECT
+ try_read:
+# endif
+ {
+ size_t bufsize;
+ void *buf = prepare_read (&bufsize, private_data);
+ if (!(buf != NULL && bufsize > 0))
+ /* prepare_read returned wrong values. */
+ abort ();
+ {
+ ssize_t nread =
+ read (fd[0], buf, bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nread < 0)
+ {
+ if (!IS_EAGAIN (errno))
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("read from %s subprocess failed"), progname);
+ goto fail;
+ }
+ }
+ else if (nread > 0)
+ done_read (buf, nread, private_data);
+ else /* nread == 0 */
+ {
+ if (done_writing)
+ break;
+ }
+ }
+ }
+# if HAVE_SELECT
+ continue;
+# endif
+ }
+ }
+
+ /* Restore SIGPIPE signal handler. */
+ if (sigaction (SIGPIPE, &orig_sigpipe_action, NULL) < 0)
+ abort ();
+#endif
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list. */
+ {
+ int exitstatus =
+ wait_subprocess (child, progname, false, null_stderr,
+ true, exit_on_error, NULL);
+ if (exitstatus != 0 && exit_on_error)
+ error (EXIT_FAILURE, 0, _("%s subprocess terminated with exit code %d"),
+ progname, exitstatus);
+ return exitstatus;
+ }
+
+ fail:
+ {
+ int saved_errno = errno;
+ close (fd[1]);
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ if (sigaction (SIGPIPE, &orig_sigpipe_action, NULL) < 0)
+ abort ();
+#endif
+ close (fd[0]);
+ wait_subprocess (child, progname, true, true, true, false, NULL);
+ errno = saved_errno;
+ return -1;
+ }
+}
diff --git a/gnulib/lib/pipe-filter.h b/gnulib/lib/pipe-filter.h
new file mode 100644
index 00000000..350204a8
--- /dev/null
+++ b/gnulib/lib/pipe-filter.h
@@ -0,0 +1,237 @@
+/* Filtering of data through a subprocess.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2009,
+ and Paolo Bonzini <bonzini@gnu.org>, 2009.
+
+ 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/>. */
+
+#ifndef _PIPE_FILTER_H
+#define _PIPE_FILTER_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Piping data through a subprocess in the naïve way - write data to the
+ subprocess and read from the subprocess when you expect it to have
+ produced results - is subject to two kinds of deadlocks:
+ 1) If you write more than PIPE_MAX bytes or, more generally, if you write
+ more bytes than the subprocess can handle at once, the subprocess
+ may write its data and wait on you to read it, but you are currently
+ busy writing.
+ 2) When you don't know ahead of time how many bytes the subprocess
+ will produce, the usual technique of calling read (fd, buf, BUFSIZ)
+ with a fixed BUFSIZ will, on Linux 2.2.17 and on BSD systems, cause
+ the read() call to block until *all* of the buffer has been filled.
+ But the subprocess cannot produce more data until you gave it more
+ input. But you are currently busy reading from it.
+
+ This header file declares four set of functions that pipes data through
+ the subprocess, without risking these deadlocks.
+
+ The side that writes data to the subprocess can be seen as a "generator",
+ that is, as a subroutine that produces and writes a piece of data here and
+ there, see <http://en.wikipedia.org/wiki/Generator_(computer_science)>.
+ But often, it can be written in the form of an "iterator", that is, as a
+ function that, each time it is invoked, produces and writes one more piece
+ of data.
+
+ Similarly, the side that reads data from the subprocess can be seen as
+ a "generator", that is, as a subroutine that consumes a piece of data here
+ and there. Often, it can be written in the form of an "iterator", that
+ is, as a function that, each time it is invoked, consumes one more piece
+ of data.
+
+ This header file declares four set of functions:
+
+ | writer | reader |
+ ----------------+------------+------------+
+ pipe_filter_ii | iterator | iterator |
+ pipe_filter_ig | iterator | generator |
+ pipe_filter_gi | generator | iterator |
+ pipe_filter_gg | generator | generator |
+ ----------------+------------+------------+
+
+ The last one uses threads in order to implement two generators running at
+ the same time. (For the relation between generators, coroutines, and
+ threads, see <http://en.wikipedia.org/wiki/Generator_(computer_science)>
+ and <http://en.wikipedia.org/wiki/Coroutine>.) It is therefore only
+ portable to platforms with kernel-based POSIX threads. */
+
+/* These two functions together describe the side that writes data to the
+ subprocess when it has the form of an iterator.
+ - prepare_write (&num_bytes, p) must either return a pointer to data that
+ is ready to be written and set num_bytes to the number of bytes ready to
+ be written, or return NULL when no more bytes are to be written.
+ - done_write (data_written, num_bytes_written) is called after
+ num_bytes_written bytes were written. It is guaranteed that
+ num_bytes_written > 0.
+ Here p is always the private_data argument passed to the main function. */
+typedef const void * (*prepare_write_fn) (size_t *num_bytes_p,
+ void *private_data);
+typedef void (*done_write_fn) (void *data_written, size_t num_bytes_written,
+ void *private_data);
+
+/* These two functions together describe the side that reads data from the
+ subprocess when it has the form of an iterator.
+ - prepare_read (&num_bytes, p) must return a pointer to a buffer for data
+ that can be read and set num_bytes to the size of that buffer
+ (must be > 0).
+ - done_read (data_read, num_bytes_read, p) is called after num_bytes_read
+ bytes were read into the buffer.
+ Here p is always the private_data argument passed to the main function. */
+typedef void * (*prepare_read_fn) (size_t *num_bytes_p,
+ void *private_data);
+typedef void (*done_read_fn) (void *data_read, size_t num_bytes_read,
+ void *private_data);
+
+
+/* ============================ pipe_filter_ii ============================ */
+
+/* Create a subprocess and pipe some data through it.
+ Arguments:
+ - progname is the program name used in error messages.
+ - prog_path is the file name of the program to invoke.
+ - prog_argv is a NULL terminated argument list, starting with prog_path as
+ first element.
+ - If null_stderr is true, the subprocess' stderr will be redirected to
+ /dev/null, and the usual error message to stderr will be omitted.
+ This is suitable when the subprocess does not fulfill an important task.
+ - If exit_on_error is true, any error will cause the main process to exit
+ with an error status.
+ If the subprocess does not terminate correctly, exit if exit_on_error is
+ true, otherwise return 127.
+ Callback arguments are as described above.
+
+ Data is alternatingly written to the subprocess, through the functions
+ prepare_write and done_write, and read from the subprocess, through the
+ functions prepare_read and done_read.
+
+ Note that the prepare_write/done_write functions and the
+ prepare_read/done_read functions may be called in different threads than
+ the current thread (depending on the platform). But they will not be
+ called after the pipe_filter_ii_execute function has returned.
+
+ Return 0 upon success, or (only if exit_on_error is false):
+ - -1 with errno set upon failure,
+ - the positive exit code of the subprocess if that failed. */
+extern int
+ pipe_filter_ii_execute (const char *progname,
+ const char *prog_path, const char **prog_argv,
+ bool null_stderr, bool exit_on_error,
+ prepare_write_fn prepare_write,
+ done_write_fn done_write,
+ prepare_read_fn prepare_read,
+ done_read_fn done_read,
+ void *private_data);
+
+
+/* ============================ pipe_filter_ig ============================ */
+
+struct pipe_filter_ig;
+
+
+/* ============================ pipe_filter_gi ============================ */
+
+struct pipe_filter_gi;
+
+/* Create a subprocess and pipe some data through it.
+ Arguments:
+ - progname is the program name used in error messages.
+ - prog_path is the file name of the program to invoke.
+ - prog_argv is a NULL terminated argument list, starting with
+ prog_path as first element.
+ - If null_stderr is true, the subprocess' stderr will be redirected
+ to /dev/null, and the usual error message to stderr will be
+ omitted. This is suitable when the subprocess does not fulfill an
+ important task.
+ - If exit_on_error is true, any error will cause the main process to
+ exit with an error status.
+ If the subprocess does not start correctly, exit if exit_on_error is
+ true, otherwise return NULL and set errno.
+
+ The caller will write to the subprocess through pipe_filter_gi_write
+ and finally call pipe_filter_gi_write. During such calls, the
+ prepare_read and done_read function may be called to process any data
+ that the subprocess has written.
+
+ Note that the prepare_read/done_read functions may be called in a
+ different thread than the current thread (depending on the platform).
+ But they will not be called after the pipe_filter_gi_close function has
+ returned.
+
+ Return the freshly created 'struct pipe_filter_gi'. */
+extern struct pipe_filter_gi *
+ pipe_filter_gi_create (const char *progname,
+ const char *prog_path, const char **prog_argv,
+ bool null_stderr, bool exit_on_error,
+ prepare_read_fn prepare_read,
+ done_read_fn done_read,
+ void *private_data);
+
+/* Write size bytes starting at buf into the pipe and in the meanwhile
+ possibly call the prepare_read and done_read functions specified to
+ pipe_filter_gi_create.
+
+ Note that the prepare_read/done_read functions may be called in a
+ different thread than the current thread (depending on the platform).
+ However, they will always be called before pipe_filter_gi_write has
+ returned, or otherwise not sooner than the next call to
+ pipe_filter_gi_write or pipe_filter_gi_close.
+
+ Return only after all the entire buffer has been written to the pipe or
+ the subprocess has exited.
+
+ Return 0 upon success, or (only if exit_on_error is false):
+ - -1 with errno set upon failure,
+ - the positive exit code of the subprocess if that failed. */
+extern int
+ pipe_filter_gi_write (struct pipe_filter_gi *filter,
+ const void *buf, size_t size);
+
+/* Finish reading the output via the prepare_read/done_read functions
+ specified to pipe_filter_gi_create.
+
+ Note that the prepare_read/done_read functions may be called in a
+ different thread than the current thread (depending on the platform).
+ However, they will always be called before pipe_filter_gi_close has
+ returned.
+
+ The write side of the pipe is closed as soon as pipe_filter_gi_close
+ starts, while the read side will be closed just before it finishes.
+
+ Return 0 upon success, or (only if exit_on_error is false):
+ - -1 with errno set upon failure,
+ - the positive exit code of the subprocess if that failed. */
+extern int
+ pipe_filter_gi_close (struct pipe_filter_gi *filter);
+
+
+/* ============================ pipe_filter_gg ============================ */
+
+
+/* ======================================================================== */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _PIPE_FILTER_H */
diff --git a/gnulib/lib/pipe-safer.c b/gnulib/lib/pipe-safer.c
new file mode 100644
index 00000000..ae9f2e3e
--- /dev/null
+++ b/gnulib/lib/pipe-safer.c
@@ -0,0 +1,56 @@
+/* Invoke pipe, but avoid some glitches.
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <unistd.h>
+#include <errno.h>
+
+/* Like pipe, but ensure that neither of the file descriptors is
+ STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. Fail with ENOSYS on
+ platforms that lack pipe. */
+
+int
+pipe_safer (int fd[2])
+{
+#if HAVE_PIPE
+ if (pipe (fd) == 0)
+ {
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ fd[i] = fd_safer (fd[i]);
+ if (fd[i] < 0)
+ {
+ int e = errno;
+ close (fd[1 - i]);
+ errno = e;
+ return -1;
+ }
+ }
+
+ return 0;
+ }
+#else
+ errno = ENOSYS;
+#endif
+
+ return -1;
+}
diff --git a/gnulib/lib/pipe.c b/gnulib/lib/pipe.c
new file mode 100644
index 00000000..69865250
--- /dev/null
+++ b/gnulib/lib/pipe.c
@@ -0,0 +1,445 @@
+/* Creation of subprocesses, communicating via pipes.
+ Copyright (C) 2001-2004, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "pipe.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "unistd-safer.h"
+#include "wait-process.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Native Woe32 API. */
+# include <process.h>
+# include "w32spawn.h"
+
+#else
+
+/* Unix API. */
+# include <spawn.h>
+
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+
+#ifdef EINTR
+
+/* EINTR handling for close().
+ These functions can return -1/EINTR even though we don't have any
+ signal handlers set up, namely when we get interrupted via SIGSTOP. */
+
+static inline int
+nonintr_close (int fd)
+{
+ int retval;
+
+ do
+ retval = close (fd);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#define close nonintr_close
+
+static inline int
+nonintr_open (const char *pathname, int oflag, mode_t mode)
+{
+ int retval;
+
+ do
+ retval = open (pathname, oflag, mode);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef open /* avoid warning on VMS */
+#define open nonintr_open
+
+#endif
+
+
+/* Open a pipe connected to a child process.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child if pipe_stdin
+ * parent <- fd[0] <- STDOUT_FILENO <- child if pipe_stdout
+ * read system write
+ *
+ * At least one of pipe_stdin, pipe_stdout must be true.
+ * pipe_stdin and prog_stdin together determine the child's standard input.
+ * pipe_stdout and prog_stdout together determine the child's standard output.
+ * If pipe_stdin is true, prog_stdin is ignored.
+ * If pipe_stdout is true, prog_stdout is ignored.
+ */
+static pid_t
+create_pipe (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool pipe_stdin, bool pipe_stdout,
+ const char *prog_stdin, const char *prog_stdout,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2])
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+ /* Native Woe32 API.
+ This uses _pipe(), dup2(), and spawnv(). It could also be implemented
+ using the low-level functions CreatePipe(), DuplicateHandle(),
+ CreateProcess() and _open_osfhandle(); see the GNU make and GNU clisp
+ and cvs source code. */
+ int ifd[2];
+ int ofd[2];
+ int orig_stdin;
+ int orig_stdout;
+ int orig_stderr;
+ int child;
+ int nulloutfd;
+ int stdinfd;
+ int stdoutfd;
+
+ /* FIXME: Need to free memory allocated by prepare_spawn. */
+ prog_argv = prepare_spawn (prog_argv);
+
+ if (pipe_stdout)
+ if (pipe2_safer (ifd, O_BINARY | O_CLOEXEC) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+ if (pipe_stdin)
+ if (pipe2_safer (ofd, O_BINARY | O_CLOEXEC) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+/* Data flow diagram:
+ *
+ * write system read
+ * parent -> ofd[1] -> ofd[0] -> child if pipe_stdin
+ * parent <- ifd[0] <- ifd[1] <- child if pipe_stdout
+ * read system write
+ *
+ */
+
+ /* Save standard file handles of parent process. */
+ if (pipe_stdin || prog_stdin != NULL)
+ orig_stdin = dup_safer_noinherit (STDIN_FILENO);
+ if (pipe_stdout || prog_stdout != NULL)
+ orig_stdout = dup_safer_noinherit (STDOUT_FILENO);
+ if (null_stderr)
+ orig_stderr = dup_safer_noinherit (STDERR_FILENO);
+ child = -1;
+
+ /* Create standard file handles of child process. */
+ nulloutfd = -1;
+ stdinfd = -1;
+ stdoutfd = -1;
+ if ((!pipe_stdin || dup2 (ofd[0], STDIN_FILENO) >= 0)
+ && (!pipe_stdout || dup2 (ifd[1], STDOUT_FILENO) >= 0)
+ && (!null_stderr
+ || ((nulloutfd = open ("NUL", O_RDWR, 0)) >= 0
+ && (nulloutfd == STDERR_FILENO
+ || (dup2 (nulloutfd, STDERR_FILENO) >= 0
+ && close (nulloutfd) >= 0))))
+ && (pipe_stdin
+ || prog_stdin == NULL
+ || ((stdinfd = open (prog_stdin, O_RDONLY, 0)) >= 0
+ && (stdinfd == STDIN_FILENO
+ || (dup2 (stdinfd, STDIN_FILENO) >= 0
+ && close (stdinfd) >= 0))))
+ && (pipe_stdout
+ || prog_stdout == NULL
+ || ((stdoutfd = open (prog_stdout, O_WRONLY, 0)) >= 0
+ && (stdoutfd == STDOUT_FILENO
+ || (dup2 (stdoutfd, STDOUT_FILENO) >= 0
+ && close (stdoutfd) >= 0)))))
+ /* The child process doesn't inherit ifd[0], ifd[1], ofd[0], ofd[1],
+ but it inherits all open()ed or dup2()ed file handles (which is what
+ we want in the case of STD*_FILENO). */
+ /* Use spawnvpe and pass the environment explicitly. This is needed if
+ the program has modified the environment using putenv() or [un]setenv().
+ On Windows, programs have two environments, one in the "environment
+ block" of the process and managed through SetEnvironmentVariable(), and
+ one inside the process, in the location retrieved by the 'environ'
+ macro. When using spawnvp() without 'e', the child process inherits a
+ copy of the environment block - ignoring the effects of putenv() and
+ [un]setenv(). */
+ {
+ child = spawnvpe (P_NOWAIT, prog_path, (const char **) prog_argv,
+ (const char **) environ);
+ if (child < 0 && errno == ENOEXEC)
+ {
+ /* prog is not an native executable. Try to execute it as a
+ shell script. Note that prepare_spawn() has already prepended
+ a hidden element "sh.exe" to prog_argv. */
+ --prog_argv;
+ child = spawnvpe (P_NOWAIT, prog_argv[0], (const char **) prog_argv,
+ (const char **) environ);
+ }
+ }
+ if (stdinfd >= 0)
+ close (stdinfd);
+ if (stdoutfd >= 0)
+ close (stdoutfd);
+ if (nulloutfd >= 0)
+ close (nulloutfd);
+
+ /* Restore standard file handles of parent process. */
+ if (null_stderr)
+ undup_safer_noinherit (orig_stderr, STDERR_FILENO);
+ if (pipe_stdout || prog_stdout != NULL)
+ undup_safer_noinherit (orig_stdout, STDOUT_FILENO);
+ if (pipe_stdin || prog_stdin != NULL)
+ undup_safer_noinherit (orig_stdin, STDIN_FILENO);
+
+ if (pipe_stdin)
+ close (ofd[0]);
+ if (pipe_stdout)
+ close (ifd[1]);
+ if (child == -1)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess failed"), progname);
+ if (pipe_stdout)
+ close (ifd[0]);
+ if (pipe_stdin)
+ close (ofd[1]);
+ return -1;
+ }
+
+ if (pipe_stdout)
+ fd[0] = ifd[0];
+ if (pipe_stdin)
+ fd[1] = ofd[1];
+ return child;
+
+#else
+
+ /* Unix API. */
+ int ifd[2];
+ int ofd[2];
+ sigset_t blocked_signals;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+
+ if (pipe_stdout)
+ if (pipe_safer (ifd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+ if (pipe_stdin)
+ if (pipe_safer (ofd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+/* Data flow diagram:
+ *
+ * write system read
+ * parent -> ofd[1] -> ofd[0] -> child if pipe_stdin
+ * parent <- ifd[0] <- ifd[1] <- child if pipe_stdout
+ * read system write
+ *
+ */
+
+ if (slave_process)
+ {
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ block_fatal_signals ();
+ }
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (pipe_stdin
+ && (err = posix_spawn_file_actions_adddup2 (&actions,
+ ofd[0], STDIN_FILENO))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_adddup2 (&actions,
+ ifd[1], STDOUT_FILENO))
+ != 0)
+ || (pipe_stdin
+ && (err = posix_spawn_file_actions_addclose (&actions, ofd[0]))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_addclose (&actions, ifd[1]))
+ != 0)
+ || (pipe_stdin
+ && (err = posix_spawn_file_actions_addclose (&actions, ofd[1]))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_addclose (&actions, ifd[0]))
+ != 0)
+ || (null_stderr
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDERR_FILENO,
+ "/dev/null", O_RDWR,
+ 0))
+ != 0)
+ || (!pipe_stdin
+ && prog_stdin != NULL
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDIN_FILENO,
+ prog_stdin, O_RDONLY,
+ 0))
+ != 0)
+ || (!pipe_stdout
+ && prog_stdout != NULL
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDOUT_FILENO,
+ prog_stdout, O_WRONLY,
+ 0))
+ != 0)
+ || (slave_process
+ && ((err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs,
+ &blocked_signals))
+ != 0
+ || (err = posix_spawnattr_setflags (&attrs,
+ POSIX_SPAWN_SETSIGMASK))
+ != 0)))
+ || (err = posix_spawnp (&child, prog_path, &actions,
+ attrs_allocated ? &attrs : NULL, prog_argv,
+ environ))
+ != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ unblock_fatal_signals ();
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, err,
+ _("%s subprocess failed"), progname);
+ if (pipe_stdout)
+ {
+ close (ifd[0]);
+ close (ifd[1]);
+ }
+ if (pipe_stdin)
+ {
+ close (ofd[0]);
+ close (ofd[1]);
+ }
+ return -1;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ {
+ register_slave_subprocess (child);
+ unblock_fatal_signals ();
+ }
+ if (pipe_stdin)
+ close (ofd[0]);
+ if (pipe_stdout)
+ close (ifd[1]);
+
+ if (pipe_stdout)
+ fd[0] = ifd[0];
+ if (pipe_stdin)
+ fd[1] = ofd[1];
+ return child;
+
+#endif
+}
+
+/* Open a bidirectional pipe.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ * read system write
+ *
+ */
+pid_t
+create_pipe_bidi (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2])
+{
+ pid_t result = create_pipe (progname, prog_path, prog_argv,
+ true, true, NULL, NULL,
+ null_stderr, slave_process, exit_on_error,
+ fd);
+ return result;
+}
+
+/* Open a pipe for input from a child process.
+ * The child's stdin comes from a file.
+ *
+ * read system write
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ *
+ */
+pid_t
+create_pipe_in (const char *progname,
+ const char *prog_path, char **prog_argv,
+ const char *prog_stdin, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1])
+{
+ int iofd[2];
+ pid_t result = create_pipe (progname, prog_path, prog_argv,
+ false, true, prog_stdin, NULL,
+ null_stderr, slave_process, exit_on_error,
+ iofd);
+ if (result != -1)
+ fd[0] = iofd[0];
+ return result;
+}
+
+/* Open a pipe for output to a child process.
+ * The child's stdout goes to a file.
+ *
+ * write system read
+ * parent -> fd[0] -> STDIN_FILENO -> child
+ *
+ */
+pid_t
+create_pipe_out (const char *progname,
+ const char *prog_path, char **prog_argv,
+ const char *prog_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1])
+{
+ int iofd[2];
+ pid_t result = create_pipe (progname, prog_path, prog_argv,
+ true, false, NULL, prog_stdout,
+ null_stderr, slave_process, exit_on_error,
+ iofd);
+ if (result != -1)
+ fd[0] = iofd[1];
+ return result;
+}
diff --git a/gnulib/lib/pipe.h b/gnulib/lib/pipe.h
new file mode 100644
index 00000000..2f23903a
--- /dev/null
+++ b/gnulib/lib/pipe.h
@@ -0,0 +1,146 @@
+/* Creation of subprocesses, communicating via pipes.
+ Copyright (C) 2001-2003, 2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#ifndef _PIPE_H
+#define _PIPE_H
+
+/* Get pid_t. */
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* All these functions create a subprocess and don't wait for its termination.
+ They return the process id of the subprocess. They also return in fd[]
+ one or two file descriptors for communication with the subprocess.
+ If the subprocess creation fails: if exit_on_error is true, the main
+ process exits with an error message; otherwise, an error message is given
+ if null_stderr is false, then -1 is returned and fd[] remain uninitialized.
+
+ After finishing communication, the caller should call wait_subprocess()
+ to get rid of the subprocess in the process table.
+
+ If slave_process is true, the child process will be terminated when its
+ creator receives a catchable fatal signal or exits normally. If
+ slave_process is false, the child process will continue running in this
+ case, until it is lucky enough to attempt to communicate with its creator
+ and thus get a SIGPIPE signal.
+
+ If exit_on_error is false, a child process id of -1 should be treated the
+ same way as a subprocess which accepts no input, produces no output and
+ terminates with exit code 127. Why? Some errors during posix_spawnp()
+ cause the function posix_spawnp() to return an error code; some other
+ errors cause the subprocess to exit with return code 127. It is
+ implementation dependent which error is reported which way. The caller
+ must treat both cases as equivalent.
+
+ It is recommended that no signal is blocked or ignored (i.e. have a
+ signal handler with value SIG_IGN) while any of these functions is called.
+ The reason is that child processes inherit the mask of blocked signals
+ from their parent (both through posix_spawn() and fork()/exec());
+ likewise, signals ignored in the parent are also ignored in the child
+ (except possibly for SIGCHLD). And POSIX:2001 says [in the description
+ of exec()]:
+ "it should be noted that many existing applications wrongly
+ assume that they start with certain signals set to the default
+ action and/or unblocked. In particular, applications written
+ with a simpler signal model that does not include blocking of
+ signals, such as the one in the ISO C standard, may not behave
+ properly if invoked with some signals blocked. Therefore, it is
+ best not to block or ignore signals across execs without explicit
+ reason to do so, and especially not to block signals across execs
+ of arbitrary (not closely co-operating) programs." */
+
+/* Open a pipe for output to a child process.
+ * The child's stdout goes to a file.
+ *
+ * write system read
+ * parent -> fd[0] -> STDIN_FILENO -> child
+ *
+ * Note: When writing to a child process, it is useful to ignore the SIGPIPE
+ * signal and the EPIPE error code.
+ */
+extern pid_t create_pipe_out (const char *progname,
+ const char *prog_path, char **prog_argv,
+ const char *prog_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1]);
+
+/* Open a pipe for input from a child process.
+ * The child's stdin comes from a file.
+ *
+ * read system write
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ *
+ */
+extern pid_t create_pipe_in (const char *progname,
+ const char *prog_path, char **prog_argv,
+ const char *prog_stdin, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1]);
+
+/* Open a bidirectional pipe.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ * read system write
+ *
+ * Note: When writing to a child process, it is useful to ignore the SIGPIPE
+ * signal and the EPIPE error code.
+ *
+ * Note: The parent process must be careful to avoid deadlock.
+ * 1) If you write more than PIPE_MAX bytes or, more generally, if you write
+ * more bytes than the subprocess can handle at once, the subprocess
+ * may write its data and wait on you to read it, but you are currently
+ * busy writing.
+ * 2) When you don't know ahead of time how many bytes the subprocess
+ * will produce, the usual technique of calling read (fd, buf, BUFSIZ)
+ * with a fixed BUFSIZ will, on Linux 2.2.17 and on BSD systems, cause
+ * the read() call to block until *all* of the buffer has been filled.
+ * But the subprocess cannot produce more data until you gave it more
+ * input. But you are currently busy reading from it.
+ */
+extern pid_t create_pipe_bidi (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2]);
+
+/* The name of the "always silent" device. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+# define DEV_NULL "NUL"
+#else
+/* Unix API. */
+# define DEV_NULL "/dev/null"
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _PIPE_H */
diff --git a/gnulib/lib/pipe2-safer.c b/gnulib/lib/pipe2-safer.c
new file mode 100644
index 00000000..034fcd87
--- /dev/null
+++ b/gnulib/lib/pipe2-safer.c
@@ -0,0 +1,52 @@
+/* Invoke pipe2, but avoid some glitches.
+ Copyright (C) 2005, 2006, 2009, 2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <unistd.h>
+#include <errno.h>
+
+/* Like pipe2, but ensure that neither of the file descriptors is
+ STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. */
+
+int
+pipe2_safer (int fd[2], int flags)
+{
+ /* This is a generalization of the pipe_safer implementation. */
+ if (pipe2 (fd, flags) == 0)
+ {
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ fd[i] = fd_safer_flag (fd[i], flags);
+ if (fd[i] < 0)
+ {
+ int e = errno;
+ close (fd[1 - i]);
+ errno = e;
+ return -1;
+ }
+ }
+
+ return 0;
+ }
+ return -1;
+}
diff --git a/gnulib/lib/pipe2.c b/gnulib/lib/pipe2.c
new file mode 100644
index 00000000..2d973dce
--- /dev/null
+++ b/gnulib/lib/pipe2.c
@@ -0,0 +1,141 @@
+/* Create a pipe, with specific opening flags.
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#include "binary-io.h"
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+# include <io.h>
+
+#else
+/* Unix API. */
+
+# ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+# endif
+
+#endif
+
+int
+pipe2 (int fd[2], int flags)
+{
+#if HAVE_PIPE2
+# undef pipe2
+ /* Try the system call first, if it exists. (We may be running with a glibc
+ that has the function but with an older kernel that lacks it.) */
+ {
+ /* Cache the information whether the system call really exists. */
+ static int have_pipe2_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_pipe2_really >= 0)
+ {
+ int result = pipe2 (fd, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_pipe2_really = 1;
+ return result;
+ }
+ have_pipe2_really = -1;
+ }
+ }
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+ /* Check the supported flags. */
+ if ((flags & ~(O_CLOEXEC | O_BINARY | O_TEXT)) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return _pipe (fd, 4096, flags);
+
+#else
+/* Unix API. */
+
+ /* Check the supported flags. */
+ if ((flags & ~(O_CLOEXEC | O_NONBLOCK | O_TEXT | O_BINARY)) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (pipe (fd) < 0)
+ return -1;
+
+ /* POSIX <http://www.opengroup.org/onlinepubs/9699919799/functions/pipe.html>
+ says that initially, the O_NONBLOCK and FD_CLOEXEC flags are cleared on
+ both fd[0] amd fd[1]. */
+
+ if (flags & O_NONBLOCK)
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd[1], F_GETFL, 0)) < 0
+ || fcntl (fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1
+ || (fcntl_flags = fcntl (fd[0], F_GETFL, 0)) < 0
+ || fcntl (fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1)
+ goto fail;
+ }
+
+ if (flags & O_CLOEXEC)
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd[1], F_GETFD, 0)) < 0
+ || fcntl (fd[1], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1
+ || (fcntl_flags = fcntl (fd[0], F_GETFD, 0)) < 0
+ || fcntl (fd[0], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1)
+ goto fail;
+ }
+
+# if O_BINARY
+ if (flags & O_BINARY)
+ {
+ setmode (fd[1], O_BINARY);
+ setmode (fd[0], O_BINARY);
+ }
+ else if (flags & O_TEXT)
+ {
+ setmode (fd[1], O_TEXT);
+ setmode (fd[0], O_TEXT);
+ }
+# endif
+
+ return 0;
+
+ fail:
+ {
+ int saved_errno = errno;
+ close (fd[0]);
+ close (fd[1]);
+ errno = saved_errno;
+ return -1;
+ }
+
+#endif
+}
diff --git a/gnulib/lib/poll.c b/gnulib/lib/poll.c
new file mode 100644
index 00000000..90d99d92
--- /dev/null
+++ b/gnulib/lib/poll.c
@@ -0,0 +1,595 @@
+/* Emulation for poll(2)
+ Contributed by Paolo Bonzini.
+
+ Copyright 2001-2003, 2006-2010 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Tell gcc not to warn about the (nfd < 0) tests, below. */
+#if (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) || 4 < __GNUC__
+# pragma GCC diagnostic ignored "-Wtype-limits"
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+#include <sys/types.h>
+#include "poll.h"
+#include <errno.h>
+#include <limits.h>
+#include <assert.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_NATIVE
+# include <winsock2.h>
+# include <windows.h>
+# include <io.h>
+# include <stdio.h>
+# include <conio.h>
+#else
+# include <sys/time.h>
+# include <sys/socket.h>
+# include <sys/select.h>
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#ifdef HAVE_SYS_FILIO_H
+# include <sys/filio.h>
+#endif
+
+#include <time.h>
+
+#ifndef INFTIM
+# define INFTIM (-1)
+#endif
+
+/* BeOS does not have MSG_PEEK. */
+#ifndef MSG_PEEK
+# define MSG_PEEK 0
+#endif
+
+#ifdef WIN32_NATIVE
+
+#define IsConsoleHandle(h) (((long) (h) & 3) == 3)
+
+static BOOL
+IsSocketHandle(HANDLE h)
+{
+ WSANETWORKEVENTS ev;
+
+ if (IsConsoleHandle (h))
+ return FALSE;
+
+ /* Under Wine, it seems that getsockopt returns 0 for pipes too.
+ WSAEnumNetworkEvents instead distinguishes the two correctly. */
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
+ return ev.lNetworkEvents != 0xDEADBEEF;
+}
+
+/* Declare data structures for ntdll functions. */
+typedef struct _FILE_PIPE_LOCAL_INFORMATION {
+ ULONG NamedPipeType;
+ ULONG NamedPipeConfiguration;
+ ULONG MaximumInstances;
+ ULONG CurrentInstances;
+ ULONG InboundQuota;
+ ULONG ReadDataAvailable;
+ ULONG OutboundQuota;
+ ULONG WriteQuotaAvailable;
+ ULONG NamedPipeState;
+ ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+
+typedef struct _IO_STATUS_BLOCK
+{
+ union {
+ DWORD Status;
+ PVOID Pointer;
+ } u;
+ ULONG_PTR Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef enum _FILE_INFORMATION_CLASS {
+ FilePipeLocalInformation = 24
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef DWORD (WINAPI *PNtQueryInformationFile)
+ (HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS);
+
+# ifndef PIPE_BUF
+# define PIPE_BUF 512
+# endif
+
+/* Compute revents values for file handle H. If some events cannot happen
+ for the handle, eliminate them from *P_SOUGHT. */
+
+static int
+win32_compute_revents (HANDLE h, int *p_sought)
+{
+ int i, ret, happened;
+ INPUT_RECORD *irbuffer;
+ DWORD avail, nbuffer;
+ BOOL bRet;
+ IO_STATUS_BLOCK iosb;
+ FILE_PIPE_LOCAL_INFORMATION fpli;
+ static PNtQueryInformationFile NtQueryInformationFile;
+ static BOOL once_only;
+
+ switch (GetFileType (h))
+ {
+ case FILE_TYPE_PIPE:
+ if (!once_only)
+ {
+ NtQueryInformationFile = (PNtQueryInformationFile)
+ GetProcAddress (GetModuleHandle ("ntdll.dll"),
+ "NtQueryInformationFile");
+ once_only = TRUE;
+ }
+
+ happened = 0;
+ if (PeekNamedPipe (h, NULL, 0, NULL, &avail, NULL) != 0)
+ {
+ if (avail)
+ happened |= *p_sought & (POLLIN | POLLRDNORM);
+ }
+
+ else
+ {
+ /* It was the write-end of the pipe. Check if it is writable.
+ If NtQueryInformationFile fails, optimistically assume the pipe is
+ writable. This could happen on Win9x, where NtQueryInformationFile
+ is not available, or if we inherit a pipe that doesn't permit
+ FILE_READ_ATTRIBUTES access on the write end (I think this should
+ not happen since WinXP SP2; WINE seems fine too). Otherwise,
+ ensure that enough space is available for atomic writes. */
+ memset (&iosb, 0, sizeof (iosb));
+ memset (&fpli, 0, sizeof (fpli));
+
+ if (!NtQueryInformationFile
+ || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli),
+ FilePipeLocalInformation)
+ || fpli.WriteQuotaAvailable >= PIPE_BUF
+ || (fpli.OutboundQuota < PIPE_BUF &&
+ fpli.WriteQuotaAvailable == fpli.OutboundQuota))
+ happened |= *p_sought & (POLLOUT | POLLWRNORM | POLLWRBAND);
+ }
+ return happened;
+
+ case FILE_TYPE_CHAR:
+ ret = WaitForSingleObject (h, 0);
+ if (!IsConsoleHandle (h))
+ return ret == WAIT_OBJECT_0 ? *p_sought & ~(POLLPRI | POLLRDBAND) : 0;
+
+ nbuffer = avail = 0;
+ bRet = GetNumberOfConsoleInputEvents (h, &nbuffer);
+ if (bRet)
+ {
+ /* Input buffer. */
+ *p_sought &= POLLIN | POLLRDNORM;
+ if (nbuffer == 0)
+ return POLLHUP;
+ if (!*p_sought)
+ return 0;
+
+ irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD));
+ bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail);
+ if (!bRet || avail == 0)
+ return POLLHUP;
+
+ for (i = 0; i < avail; i++)
+ if (irbuffer[i].EventType == KEY_EVENT)
+ return *p_sought;
+ return 0;
+ }
+ else
+ {
+ /* Screen buffer. */
+ *p_sought &= POLLOUT | POLLWRNORM | POLLWRBAND;
+ return *p_sought;
+ }
+
+ default:
+ ret = WaitForSingleObject (h, 0);
+ if (ret == WAIT_OBJECT_0)
+ return *p_sought & ~(POLLPRI | POLLRDBAND);
+
+ return *p_sought & (POLLOUT | POLLWRNORM | POLLWRBAND);
+ }
+}
+
+/* Convert fd_sets returned by select into revents values. */
+
+static int
+win32_compute_revents_socket (SOCKET h, int sought, long lNetworkEvents)
+{
+ int happened = 0;
+
+ if ((lNetworkEvents & (FD_READ | FD_ACCEPT | FD_CLOSE)) == FD_ACCEPT)
+ happened |= (POLLIN | POLLRDNORM) & sought;
+
+ else if (lNetworkEvents & (FD_READ | FD_ACCEPT | FD_CLOSE))
+ {
+ int r, error;
+
+ char data[64];
+ WSASetLastError (0);
+ r = recv (h, data, sizeof (data), MSG_PEEK);
+ error = WSAGetLastError ();
+ WSASetLastError (0);
+
+ if (r > 0 || error == WSAENOTCONN)
+ happened |= (POLLIN | POLLRDNORM) & sought;
+
+ /* Distinguish hung-up sockets from other errors. */
+ else if (r == 0 || error == WSAESHUTDOWN || error == WSAECONNRESET
+ || error == WSAECONNABORTED || error == WSAENETRESET)
+ happened |= POLLHUP;
+
+ else
+ happened |= POLLERR;
+ }
+
+ if (lNetworkEvents & (FD_WRITE | FD_CONNECT))
+ happened |= (POLLOUT | POLLWRNORM | POLLWRBAND) & sought;
+
+ if (lNetworkEvents & FD_OOB)
+ happened |= (POLLPRI | POLLRDBAND) & sought;
+
+ return happened;
+}
+
+#else /* !MinGW */
+
+/* Convert select(2) returned fd_sets into poll(2) revents values. */
+static int
+compute_revents (int fd, int sought, fd_set *rfds, fd_set *wfds, fd_set *efds)
+{
+ int happened = 0;
+ if (FD_ISSET (fd, rfds))
+ {
+ int r;
+ int socket_errno;
+
+# if defined __MACH__ && defined __APPLE__
+ /* There is a bug in Mac OS X that causes it to ignore MSG_PEEK
+ for some kinds of descriptors. Detect if this descriptor is a
+ connected socket, a server socket, or something else using a
+ 0-byte recv, and use ioctl(2) to detect POLLHUP. */
+ r = recv (fd, NULL, 0, MSG_PEEK);
+ socket_errno = (r < 0) ? errno : 0;
+ if (r == 0 || socket_errno == ENOTSOCK)
+ ioctl (fd, FIONREAD, &r);
+# else
+ char data[64];
+ r = recv (fd, data, sizeof (data), MSG_PEEK);
+ socket_errno = (r < 0) ? errno : 0;
+# endif
+ if (r == 0)
+ happened |= POLLHUP;
+
+ /* If the event happened on an unconnected server socket,
+ that's fine. */
+ else if (r > 0 || ( /* (r == -1) && */ socket_errno == ENOTCONN))
+ happened |= (POLLIN | POLLRDNORM) & sought;
+
+ /* Distinguish hung-up sockets from other errors. */
+ else if (socket_errno == ESHUTDOWN || socket_errno == ECONNRESET
+ || socket_errno == ECONNABORTED || socket_errno == ENETRESET)
+ happened |= POLLHUP;
+
+ else
+ happened |= POLLERR;
+ }
+
+ if (FD_ISSET (fd, wfds))
+ happened |= (POLLOUT | POLLWRNORM | POLLWRBAND) & sought;
+
+ if (FD_ISSET (fd, efds))
+ happened |= (POLLPRI | POLLRDBAND) & sought;
+
+ return happened;
+}
+#endif /* !MinGW */
+
+int
+poll (pfd, nfd, timeout)
+ struct pollfd *pfd;
+ nfds_t nfd;
+ int timeout;
+{
+#ifndef WIN32_NATIVE
+ fd_set rfds, wfds, efds;
+ struct timeval tv;
+ struct timeval *ptv;
+ int maxfd, rc;
+ nfds_t i;
+
+# ifdef _SC_OPEN_MAX
+ static int sc_open_max = -1;
+
+ if (nfd < 0
+ || (nfd > sc_open_max
+ && (sc_open_max != -1
+ || nfd > (sc_open_max = sysconf (_SC_OPEN_MAX)))))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+# else /* !_SC_OPEN_MAX */
+# ifdef OPEN_MAX
+ if (nfd < 0 || nfd > OPEN_MAX)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+# endif /* OPEN_MAX -- else, no check is needed */
+# endif /* !_SC_OPEN_MAX */
+
+ /* EFAULT is not necessary to implement, but let's do it in the
+ simplest case. */
+ if (!pfd)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* convert timeout number into a timeval structure */
+ if (timeout == 0)
+ {
+ ptv = &tv;
+ ptv->tv_sec = 0;
+ ptv->tv_usec = 0;
+ }
+ else if (timeout > 0)
+ {
+ ptv = &tv;
+ ptv->tv_sec = timeout / 1000;
+ ptv->tv_usec = (timeout % 1000) * 1000;
+ }
+ else if (timeout == INFTIM)
+ /* wait forever */
+ ptv = NULL;
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* create fd sets and determine max fd */
+ maxfd = -1;
+ FD_ZERO (&rfds);
+ FD_ZERO (&wfds);
+ FD_ZERO (&efds);
+ for (i = 0; i < nfd; i++)
+ {
+ if (pfd[i].fd < 0)
+ continue;
+
+ if (pfd[i].events & (POLLIN | POLLRDNORM))
+ FD_SET (pfd[i].fd, &rfds);
+
+ /* see select(2): "the only exceptional condition detectable
+ is out-of-band data received on a socket", hence we push
+ POLLWRBAND events onto wfds instead of efds. */
+ if (pfd[i].events & (POLLOUT | POLLWRNORM | POLLWRBAND))
+ FD_SET (pfd[i].fd, &wfds);
+ if (pfd[i].events & (POLLPRI | POLLRDBAND))
+ FD_SET (pfd[i].fd, &efds);
+ if (pfd[i].fd >= maxfd
+ && (pfd[i].events & (POLLIN | POLLOUT | POLLPRI
+ | POLLRDNORM | POLLRDBAND
+ | POLLWRNORM | POLLWRBAND)))
+ {
+ maxfd = pfd[i].fd;
+ if (maxfd > FD_SETSIZE)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ }
+ }
+
+ /* examine fd sets */
+ rc = select (maxfd + 1, &rfds, &wfds, &efds, ptv);
+ if (rc < 0)
+ return rc;
+
+ /* establish results */
+ rc = 0;
+ for (i = 0; i < nfd; i++)
+ if (pfd[i].fd < 0)
+ pfd[i].revents = 0;
+ else
+ {
+ int happened = compute_revents (pfd[i].fd, pfd[i].events,
+ &rfds, &wfds, &efds);
+ if (happened)
+ {
+ pfd[i].revents = happened;
+ rc++;
+ }
+ }
+
+ return rc;
+#else
+ static struct timeval tv0;
+ static HANDLE hEvent;
+ WSANETWORKEVENTS ev;
+ HANDLE h, handle_array[FD_SETSIZE + 2];
+ DWORD ret, wait_timeout, nhandles;
+ fd_set rfds, wfds, xfds;
+ BOOL poll_again;
+ MSG msg;
+ int rc = 0;
+ nfds_t i;
+
+ if (nfd < 0 || timeout < -1)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (!hEvent)
+ hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
+
+ handle_array[0] = hEvent;
+ nhandles = 1;
+ FD_ZERO (&rfds);
+ FD_ZERO (&wfds);
+ FD_ZERO (&xfds);
+
+ /* Classify socket handles and create fd sets. */
+ for (i = 0; i < nfd; i++)
+ {
+ int sought = pfd[i].events;
+ pfd[i].revents = 0;
+ if (pfd[i].fd < 0)
+ continue;
+ if (!(sought & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLWRBAND
+ | POLLPRI | POLLRDBAND)))
+ continue;
+
+ h = (HANDLE) _get_osfhandle (pfd[i].fd);
+ assert (h != NULL);
+ if (IsSocketHandle (h))
+ {
+ int requested = FD_CLOSE;
+
+ /* see above; socket handles are mapped onto select. */
+ if (sought & (POLLIN | POLLRDNORM))
+ {
+ requested |= FD_READ | FD_ACCEPT;
+ FD_SET ((SOCKET) h, &rfds);
+ }
+ if (sought & (POLLOUT | POLLWRNORM | POLLWRBAND))
+ {
+ requested |= FD_WRITE | FD_CONNECT;
+ FD_SET ((SOCKET) h, &wfds);
+ }
+ if (sought & (POLLPRI | POLLRDBAND))
+ {
+ requested |= FD_OOB;
+ FD_SET ((SOCKET) h, &xfds);
+ }
+
+ if (requested)
+ WSAEventSelect ((SOCKET) h, hEvent, requested);
+ }
+ else
+ {
+ /* Poll now. If we get an event, do not poll again. Also,
+ screen buffer handles are waitable, and they'll block until
+ a character is available. win32_compute_revents eliminates
+ bits for the "wrong" direction. */
+ pfd[i].revents = win32_compute_revents (h, &sought);
+ if (sought)
+ handle_array[nhandles++] = h;
+ if (pfd[i].revents)
+ wait_timeout = 0;
+ }
+ }
+
+ if (select (0, &rfds, &wfds, &xfds, &tv0) > 0)
+ {
+ /* Do MsgWaitForMultipleObjects anyway to dispatch messages, but
+ no need to call select again. */
+ poll_again = FALSE;
+ wait_timeout = 0;
+ }
+ else
+ {
+ poll_again = TRUE;
+ if (timeout == INFTIM)
+ wait_timeout = INFINITE;
+ else
+ wait_timeout = timeout;
+ }
+
+ for (;;)
+ {
+ ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE,
+ wait_timeout, QS_ALLINPUT);
+
+ if (ret == WAIT_OBJECT_0 + nhandles)
+ {
+ /* new input of some other kind */
+ BOOL bRet;
+ while ((bRet = PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) != 0)
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ }
+ else
+ break;
+ }
+
+ if (poll_again)
+ select (0, &rfds, &wfds, &xfds, &tv0);
+
+ /* Place a sentinel at the end of the array. */
+ handle_array[nhandles] = NULL;
+ nhandles = 1;
+ for (i = 0; i < nfd; i++)
+ {
+ int happened;
+
+ if (pfd[i].fd < 0)
+ continue;
+ if (!(pfd[i].events & (POLLIN | POLLRDNORM |
+ POLLOUT | POLLWRNORM | POLLWRBAND)))
+ continue;
+
+ h = (HANDLE) _get_osfhandle (pfd[i].fd);
+ if (h != handle_array[nhandles])
+ {
+ /* It's a socket. */
+ WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
+ WSAEventSelect ((SOCKET) h, 0, 0);
+
+ /* If we're lucky, WSAEnumNetworkEvents already provided a way
+ to distinguish FD_READ and FD_ACCEPT; this saves a recv later. */
+ if (FD_ISSET ((SOCKET) h, &rfds)
+ && !(ev.lNetworkEvents & (FD_READ | FD_ACCEPT)))
+ ev.lNetworkEvents |= FD_READ | FD_ACCEPT;
+ if (FD_ISSET ((SOCKET) h, &wfds))
+ ev.lNetworkEvents |= FD_WRITE | FD_CONNECT;
+ if (FD_ISSET ((SOCKET) h, &xfds))
+ ev.lNetworkEvents |= FD_OOB;
+
+ happened = win32_compute_revents_socket ((SOCKET) h, pfd[i].events,
+ ev.lNetworkEvents);
+ }
+ else
+ {
+ /* Not a socket. */
+ int sought = pfd[i].events;
+ happened = win32_compute_revents (h, &sought);
+ nhandles++;
+ }
+
+ if ((pfd[i].revents |= happened) != 0)
+ rc++;
+ }
+
+ return rc;
+#endif
+}
diff --git a/gnulib/lib/poll.in.h b/gnulib/lib/poll.in.h
new file mode 100644
index 00000000..b7aa59d9
--- /dev/null
+++ b/gnulib/lib/poll.in.h
@@ -0,0 +1,53 @@
+/* Header for poll(2) emulation
+ Contributed by Paolo Bonzini.
+
+ Copyright 2001, 2002, 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_POLL_H
+#define _GL_POLL_H
+
+/* fake a poll(2) environment */
+#define POLLIN 0x0001 /* any readable data available */
+#define POLLPRI 0x0002 /* OOB/Urgent readable data */
+#define POLLOUT 0x0004 /* file descriptor is writeable */
+#define POLLERR 0x0008 /* some poll error occurred */
+#define POLLHUP 0x0010 /* file descriptor was "hung up" */
+#define POLLNVAL 0x0020 /* requested events "invalid" */
+#define POLLRDNORM 0x0040
+#define POLLRDBAND 0x0080
+#define POLLWRNORM 0x0100
+#define POLLWRBAND 0x0200
+
+struct pollfd
+{
+ int fd; /* which file descriptor to poll */
+ short events; /* events we are interested in */
+ short revents; /* events found on return */
+};
+
+typedef unsigned long nfds_t;
+
+extern int poll (struct pollfd *pfd, nfds_t nfd, int timeout);
+
+/* Define INFTIM only if doing so conforms to POSIX. */
+#if !defined (_POSIX_C_SOURCE) && !defined (_XOPEN_SOURCE)
+#define INFTIM (-1)
+#endif
+
+#endif /* _GL_POLL_H */
diff --git a/gnulib/lib/popen-safer.c b/gnulib/lib/popen-safer.c
new file mode 100644
index 00000000..1791bc3b
--- /dev/null
+++ b/gnulib/lib/popen-safer.c
@@ -0,0 +1,93 @@
+/* Invoke popen, but avoid some glitches.
+
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "stdio-safer.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "cloexec.h"
+
+/* Like open (name, flags | O_CLOEXEC), although not necessarily
+ atomic. FLAGS must not include O_CREAT. */
+
+static int
+open_noinherit (char const *name, int flags)
+{
+ int fd;
+#ifdef O_CLOEXEC
+ /* 0 = unknown, 1 = yes, -1 = no. */
+ static int have_cloexec;
+ if (have_cloexec >= 0)
+ {
+ fd = open (name, flags | O_CLOEXEC);
+ if (have_cloexec == 0 && (0 <= fd || errno == EINVAL))
+ have_cloexec = (0 <= fd ? 1 : -1);
+ if (have_cloexec == 1)
+ return fd;
+ }
+#endif
+
+ fd = open (name, flags);
+ if (0 <= fd && set_cloexec_flag (fd, true) != 0)
+ {
+ int saved_errno = errno;
+ close (fd);
+ fd = -1;
+ errno = saved_errno;
+ }
+ return fd;
+}
+
+/* Like popen, but do not return stdin, stdout, or stderr. */
+
+FILE *
+popen_safer (char const *cmd, char const *mode)
+{
+ /* Unfortunately, we cannot use the fopen_safer approach of using
+ fdopen (dup_safer (fileno (popen (cmd, mode)))), because stdio
+ libraries maintain hidden state tying the original fd to the pid
+ to wait on when using pclose (this hidden state is also used to
+ avoid fd leaks in subsequent popen calls). So, we instead
+ guarantee that all standard streams are open prior to the popen
+ call (even though this puts more pressure on open fds), so that
+ the original fd created by popen is safe. */
+ FILE *fp;
+ int fd = open_noinherit ("/dev/null", O_RDONLY);
+ if (0 <= fd && fd <= STDERR_FILENO)
+ {
+ /* Maximum recursion depth is 3. */
+ int saved_errno;
+ fp = popen_safer (cmd, mode);
+ saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ }
+ else
+ {
+ /* Either all fd's are tied up, or fd is safe and the real popen
+ will reuse it. */
+ close (fd);
+ fp = popen (cmd, mode);
+ }
+ return fp;
+}
diff --git a/gnulib/lib/popen.c b/gnulib/lib/popen.c
new file mode 100644
index 00000000..e6fd2c50
--- /dev/null
+++ b/gnulib/lib/popen.c
@@ -0,0 +1,82 @@
+/* Open a stream to a sub-process.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#undef popen
+
+FILE *
+rpl_popen (const char *filename, const char *mode)
+{
+ /* The mingw popen works fine, and all other platforms have fcntl.
+ The bug of the child clobbering its own file descriptors if stdin
+ or stdout was closed in the parent can be worked around by
+ opening those two fds as close-on-exec to begin with. */
+ /* Cygwin 1.5.x also has a bug where the popen fd is improperly
+ marked close-on-exec, and if the application undoes this, then
+ the fd leaks into subsequent popen calls. We could work around
+ this by maintaining a list of all fd's opened by popen, and
+ temporarily marking them cloexec around the real popen call, but
+ we would also have to override pclose, and the bookkeepping seems
+ extreme given that cygwin 1.7 no longer has the bug. */
+ FILE *result;
+ int cloexec0 = fcntl (STDIN_FILENO, F_GETFD);
+ int cloexec1 = fcntl (STDOUT_FILENO, F_GETFD);
+ int saved_errno;
+
+ /* If either stdin or stdout was closed (that is, fcntl failed),
+ then we open a dummy close-on-exec fd to occupy that slot. That
+ way, popen's internal use of pipe() will not contain either fd 0
+ or 1, overcoming the fact that the child process blindly calls
+ close() on the parent's end of the pipe without first checking
+ whether it is clobbering the fd just placed there via dup2(); the
+ exec will get rid of the dummy fd's in the child. Fortunately,
+ closed stderr in the parent does not cause problems in the
+ child. */
+ if (cloexec0 < 0)
+ {
+ if (open ("/dev/null", O_RDONLY) != STDIN_FILENO
+ || fcntl (STDIN_FILENO, F_SETFD,
+ fcntl (STDIN_FILENO, F_GETFD) | FD_CLOEXEC) == -1)
+ abort ();
+ }
+ if (cloexec1 < 0)
+ {
+ if (open ("/dev/null", O_RDONLY) != STDOUT_FILENO
+ || fcntl (STDOUT_FILENO, F_SETFD,
+ fcntl (STDOUT_FILENO, F_GETFD) | FD_CLOEXEC) == -1)
+ abort ();
+ }
+ result = popen (filename, mode);
+ /* Now, close any dummy fd's created in the parent. */
+ saved_errno = errno;
+ if (cloexec0 < 0)
+ close (STDIN_FILENO);
+ if (cloexec1 < 0)
+ close (STDOUT_FILENO);
+ errno = saved_errno;
+ return result;
+}
diff --git a/gnulib/lib/posixtm.c b/gnulib/lib/posixtm.c
new file mode 100644
index 00000000..c786adb8
--- /dev/null
+++ b/gnulib/lib/posixtm.c
@@ -0,0 +1,235 @@
+/* Parse dates for touch and date.
+
+ Copyright (C) 1989-1991, 1998, 2000-2010 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/>. */
+
+/* Yacc-based version written by Jim Kingdon and David MacKenzie.
+ Rewritten by Jim Meyering. */
+
+#include <config.h>
+
+#include "posixtm.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/*
+ POSIX requires:
+
+ touch -t [[CC]YY]mmddhhmm[.ss] FILE...
+ 8, 10, or 12 digits, followed by optional .ss
+ (PDS_LEADING_YEAR | PDS_CENTURY | PDS_SECONDS)
+
+ touch mmddhhmm[YY] FILE... (obsoleted by POSIX 1003.1-2001)
+ 8 or 10 digits, YY (if present) must be in the range 69-99
+ (PDS_TRAILING_YEAR | PDS_PRE_2000)
+
+ date mmddhhmm[[CC]YY]
+ 8, 10, or 12 digits
+ (PDS_TRAILING_YEAR | PDS_CENTURY)
+
+*/
+
+static int
+year (struct tm *tm, const int *digit_pair, size_t n, unsigned int syntax_bits)
+{
+ switch (n)
+ {
+ case 1:
+ tm->tm_year = *digit_pair;
+ /* Deduce the century based on the year.
+ POSIX requires that 00-68 be interpreted as 2000-2068,
+ and that 69-99 be interpreted as 1969-1999. */
+ if (digit_pair[0] <= 68)
+ {
+ if (syntax_bits & PDS_PRE_2000)
+ return 1;
+ tm->tm_year += 100;
+ }
+ break;
+
+ case 2:
+ if (! (syntax_bits & PDS_CENTURY))
+ return 1;
+ tm->tm_year = digit_pair[0] * 100 + digit_pair[1] - 1900;
+ break;
+
+ case 0:
+ {
+ time_t now;
+ struct tm *tmp;
+
+ /* Use current year. */
+ time (&now);
+ tmp = localtime (&now);
+ if (! tmp)
+ return 1;
+ tm->tm_year = tmp->tm_year;
+ }
+ break;
+
+ default:
+ abort ();
+ }
+
+ return 0;
+}
+
+static int
+posix_time_parse (struct tm *tm, const char *s, unsigned int syntax_bits)
+{
+ const char *dot = NULL;
+ int pair[6];
+ int *p;
+ size_t i;
+
+ size_t s_len = strlen (s);
+ size_t len = (((syntax_bits & PDS_SECONDS) && (dot = strchr (s, '.')))
+ ? (size_t) (dot - s)
+ : s_len);
+
+ if (len != 8 && len != 10 && len != 12)
+ return 1;
+
+ if (dot)
+ {
+ if (!(syntax_bits & PDS_SECONDS))
+ return 1;
+
+ if (s_len - len != 3)
+ return 1;
+ }
+
+ for (i = 0; i < len; i++)
+ if (!ISDIGIT (s[i]))
+ return 1;
+
+ len /= 2;
+ for (i = 0; i < len; i++)
+ pair[i] = 10 * (s[2*i] - '0') + s[2*i + 1] - '0';
+
+ p = pair;
+ if (syntax_bits & PDS_LEADING_YEAR)
+ {
+ if (year (tm, p, len - 4, syntax_bits))
+ return 1;
+ p += len - 4;
+ len = 4;
+ }
+
+ /* Handle 8 digits worth of `MMDDhhmm'. */
+ tm->tm_mon = *p++ - 1;
+ tm->tm_mday = *p++;
+ tm->tm_hour = *p++;
+ tm->tm_min = *p++;
+ len -= 4;
+
+ /* Handle any trailing year. */
+ if (syntax_bits & PDS_TRAILING_YEAR)
+ {
+ if (year (tm, p, len, syntax_bits))
+ return 1;
+ }
+
+ /* Handle seconds. */
+ if (!dot)
+ {
+ tm->tm_sec = 0;
+ }
+ else
+ {
+ int seconds;
+
+ ++dot;
+ if (!ISDIGIT (dot[0]) || !ISDIGIT (dot[1]))
+ return 1;
+ seconds = 10 * (dot[0] - '0') + dot[1] - '0';
+
+ tm->tm_sec = seconds;
+ }
+
+ return 0;
+}
+
+/* Parse a POSIX-style date, returning true if successful. */
+
+bool
+posixtime (time_t *p, const char *s, unsigned int syntax_bits)
+{
+ struct tm tm0;
+ struct tm tm1;
+ struct tm const *tm;
+ time_t t;
+
+ if (posix_time_parse (&tm0, s, syntax_bits))
+ return false;
+
+ tm1 = tm0;
+ tm1.tm_isdst = -1;
+ t = mktime (&tm1);
+
+ if (t != (time_t) -1)
+ tm = &tm1;
+ else
+ {
+ /* mktime returns -1 for errors, but -1 is also a valid time_t
+ value. Check whether an error really occurred. */
+ tm = localtime (&t);
+ if (! tm)
+ return false;
+ }
+
+ /* Reject dates like "September 31" and times like "25:61".
+ Do not reject times that specify "60" as the number of seconds. */
+ if ((tm0.tm_year ^ tm->tm_year)
+ | (tm0.tm_mon ^ tm->tm_mon)
+ | (tm0.tm_mday ^ tm->tm_mday)
+ | (tm0.tm_hour ^ tm->tm_hour)
+ | (tm0.tm_min ^ tm->tm_min)
+ | (tm0.tm_sec ^ tm->tm_sec))
+ {
+ /* Any mismatch without 60 in the tm_sec field is invalid. */
+ if (tm0.tm_sec != 60)
+ return false;
+
+ {
+ /* Allow times like 01:35:60 or 23:59:60. */
+ time_t dummy;
+ char buf[16];
+ char *b = stpcpy (buf, s);
+ strcpy (b - 2, "59");
+ if (!posixtime (&dummy, buf, syntax_bits))
+ return false;
+ }
+ }
+
+ *p = t;
+ return true;
+}
diff --git a/gnulib/lib/posixtm.h b/gnulib/lib/posixtm.h
new file mode 100644
index 00000000..ae504d7a
--- /dev/null
+++ b/gnulib/lib/posixtm.h
@@ -0,0 +1,36 @@
+/* Parse dates for touch and date.
+
+ Copyright (C) 1998, 2003, 2005, 2007-2010 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/>. */
+
+/* Yacc-based version written by Jim Kingdon and David MacKenzie.
+ Rewritten by Jim Meyering. */
+
+#ifndef POSIXTM_H_
+# define POSIXTM_H_
+
+# include <stdbool.h>
+# include <time.h>
+
+/* POSIX Date Syntax flags. */
+# define PDS_LEADING_YEAR 1
+# define PDS_TRAILING_YEAR 2
+# define PDS_CENTURY 4
+# define PDS_SECONDS 8
+# define PDS_PRE_2000 16
+
+bool posixtime (time_t *p, const char *s, unsigned int syntax_bits);
+
+#endif
diff --git a/gnulib/lib/posixver.c b/gnulib/lib/posixver.c
new file mode 100644
index 00000000..79641739
--- /dev/null
+++ b/gnulib/lib/posixver.c
@@ -0,0 +1,54 @@
+/* Which POSIX version to conform to, for utilities.
+
+ Copyright (C) 2002-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "posixver.h"
+
+#include <limits.h>
+#include <stdlib.h>
+
+#include <unistd.h>
+#ifndef _POSIX2_VERSION
+# define _POSIX2_VERSION 0
+#endif
+
+#ifndef DEFAULT_POSIX2_VERSION
+# define DEFAULT_POSIX2_VERSION _POSIX2_VERSION
+#endif
+
+/* The POSIX version that utilities should conform to. The default is
+ specified by the system. */
+
+int
+posix2_version (void)
+{
+ long int v = DEFAULT_POSIX2_VERSION;
+ char const *s = getenv ("_POSIX2_VERSION");
+
+ if (s && *s)
+ {
+ char *e;
+ long int i = strtol (s, &e, 10);
+ if (! *e)
+ v = i;
+ }
+
+ return v < INT_MIN ? INT_MIN : v < INT_MAX ? v : INT_MAX;
+}
diff --git a/gnulib/lib/posixver.h b/gnulib/lib/posixver.h
new file mode 100644
index 00000000..b64f6a2e
--- /dev/null
+++ b/gnulib/lib/posixver.h
@@ -0,0 +1 @@
+int posix2_version (void);
diff --git a/gnulib/lib/pread.c b/gnulib/lib/pread.c
new file mode 100644
index 00000000..948b377e
--- /dev/null
+++ b/gnulib/lib/pread.c
@@ -0,0 +1,65 @@
+/* replacement pread function
+ Copyright (C) 2009-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#define __libc_lseek(f,o,w) lseek (f, o, w)
+#define __set_errno(Val) errno = (Val)
+#define __libc_read(f,b,n) read (f, b, n)
+
+/* pread substitute for systems that the function, such as mingw32 and BeOS. */
+/* The following is identical to the function from glibc's
+ sysdeps/posix/pread.c */
+
+/* Note: This implementation of pread is not multithread-safe. */
+
+ssize_t
+pread (int fd, void *buf, size_t nbyte, off_t offset)
+{
+ /* Since we must not change the file pointer preserve the value so that
+ we can restore it later. */
+ int save_errno;
+ ssize_t result;
+ off_t old_offset = __libc_lseek (fd, 0, SEEK_CUR);
+ if (old_offset == (off_t) -1)
+ return -1;
+
+ /* Set to wanted position. */
+ if (__libc_lseek (fd, offset, SEEK_SET) == (off_t) -1)
+ return -1;
+
+ /* Write out the data. */
+ result = __libc_read (fd, buf, nbyte);
+
+ /* Now we have to restore the position. If this fails we have to
+ return this as an error. But if the writing also failed we
+ return this error. */
+ save_errno = errno;
+ if (__libc_lseek (fd, old_offset, SEEK_SET) == (off_t) -1)
+ {
+ if (result == -1)
+ __set_errno (save_errno);
+ return -1;
+ }
+ __set_errno (save_errno);
+
+ return result;
+}
diff --git a/gnulib/lib/printf-args.c b/gnulib/lib/printf-args.c
new file mode 100644
index 00000000..43b80d9e
--- /dev/null
+++ b/gnulib/lib/printf-args.c
@@ -0,0 +1,188 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ PRINTF_FETCHARGS Name of the function to be defined.
+ STATIC Set to 'static' to declare the function static. */
+
+#ifndef PRINTF_FETCHARGS
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifndef PRINTF_FETCHARGS
+# include "printf-args.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_FETCHARGS (va_list args, arguments *a)
+{
+ size_t i;
+ argument *ap;
+
+ for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+ switch (ap->type)
+ {
+ case TYPE_SCHAR:
+ ap->a.a_schar = va_arg (args, /*signed char*/ int);
+ break;
+ case TYPE_UCHAR:
+ ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+ break;
+ case TYPE_SHORT:
+ ap->a.a_short = va_arg (args, /*short*/ int);
+ break;
+ case TYPE_USHORT:
+ ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+ break;
+ case TYPE_INT:
+ ap->a.a_int = va_arg (args, int);
+ break;
+ case TYPE_UINT:
+ ap->a.a_uint = va_arg (args, unsigned int);
+ break;
+ case TYPE_LONGINT:
+ ap->a.a_longint = va_arg (args, long int);
+ break;
+ case TYPE_ULONGINT:
+ ap->a.a_ulongint = va_arg (args, unsigned long int);
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_LONGLONGINT:
+ ap->a.a_longlongint = va_arg (args, long long int);
+ break;
+ case TYPE_ULONGLONGINT:
+ ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+ break;
+#endif
+ case TYPE_DOUBLE:
+ ap->a.a_double = va_arg (args, double);
+ break;
+ case TYPE_LONGDOUBLE:
+ ap->a.a_longdouble = va_arg (args, long double);
+ break;
+ case TYPE_CHAR:
+ ap->a.a_char = va_arg (args, int);
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
+ default argument promotions", this is not the case in mingw32,
+ where wint_t is 'unsigned short'. */
+ ap->a.a_wide_char =
+ (sizeof (wint_t) < sizeof (int)
+ ? (wint_t) va_arg (args, int)
+ : va_arg (args, wint_t));
+ break;
+#endif
+ case TYPE_STRING:
+ ap->a.a_string = va_arg (args, const char *);
+ /* A null pointer is an invalid argument for "%s", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_string == NULL)
+ ap->a.a_string = "(NULL)";
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ ap->a.a_wide_string = va_arg (args, const wchar_t *);
+ /* A null pointer is an invalid argument for "%ls", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_wide_string == NULL)
+ {
+ static const wchar_t wide_null_string[] =
+ {
+ (wchar_t)'(',
+ (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
+ (wchar_t)')',
+ (wchar_t)0
+ };
+ ap->a.a_wide_string = wide_null_string;
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ ap->a.a_pointer = va_arg (args, void *);
+ break;
+ case TYPE_COUNT_SCHAR_POINTER:
+ ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ ap->a.a_count_short_pointer = va_arg (args, short *);
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ ap->a.a_count_int_pointer = va_arg (args, int *);
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ ap->a.a_count_longint_pointer = va_arg (args, long int *);
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+ break;
+#endif
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case TYPE_U8_STRING:
+ ap->a.a_u8_string = va_arg (args, const uint8_t *);
+ /* A null pointer is an invalid argument for "%U", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u8_string == NULL)
+ {
+ static const uint8_t u8_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u8_string = u8_null_string;
+ }
+ break;
+ case TYPE_U16_STRING:
+ ap->a.a_u16_string = va_arg (args, const uint16_t *);
+ /* A null pointer is an invalid argument for "%lU", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u16_string == NULL)
+ {
+ static const uint16_t u16_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u16_string = u16_null_string;
+ }
+ break;
+ case TYPE_U32_STRING:
+ ap->a.a_u32_string = va_arg (args, const uint32_t *);
+ /* A null pointer is an invalid argument for "%llU", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u32_string == NULL)
+ {
+ static const uint32_t u32_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u32_string = u32_null_string;
+ }
+ break;
+#endif
+ default:
+ /* Unknown type. */
+ return -1;
+ }
+ return 0;
+}
diff --git a/gnulib/lib/printf-args.h b/gnulib/lib/printf-args.h
new file mode 100644
index 00000000..44279e60
--- /dev/null
+++ b/gnulib/lib/printf-args.h
@@ -0,0 +1,155 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2006-2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ PRINTF_FETCHARGS Name of the function to be declared.
+ STATIC Set to 'static' to declare the function static. */
+
+/* Default parameters. */
+#ifndef PRINTF_FETCHARGS
+# define PRINTF_FETCHARGS printf_fetchargs
+#endif
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get wchar_t. */
+#if HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t. */
+#if HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list. */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+ TYPE_NONE,
+ TYPE_SCHAR,
+ TYPE_UCHAR,
+ TYPE_SHORT,
+ TYPE_USHORT,
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_LONGINT,
+ TYPE_ULONGINT,
+#if HAVE_LONG_LONG_INT
+ TYPE_LONGLONGINT,
+ TYPE_ULONGLONGINT,
+#endif
+ TYPE_DOUBLE,
+ TYPE_LONGDOUBLE,
+ TYPE_CHAR,
+#if HAVE_WINT_T
+ TYPE_WIDE_CHAR,
+#endif
+ TYPE_STRING,
+#if HAVE_WCHAR_T
+ TYPE_WIDE_STRING,
+#endif
+ TYPE_POINTER,
+ TYPE_COUNT_SCHAR_POINTER,
+ TYPE_COUNT_SHORT_POINTER,
+ TYPE_COUNT_INT_POINTER,
+ TYPE_COUNT_LONGINT_POINTER
+#if HAVE_LONG_LONG_INT
+, TYPE_COUNT_LONGLONGINT_POINTER
+#endif
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+, TYPE_U8_STRING
+, TYPE_U16_STRING
+, TYPE_U32_STRING
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+ arg_type type;
+ union
+ {
+ signed char a_schar;
+ unsigned char a_uchar;
+ short a_short;
+ unsigned short a_ushort;
+ int a_int;
+ unsigned int a_uint;
+ long int a_longint;
+ unsigned long int a_ulongint;
+#if HAVE_LONG_LONG_INT
+ long long int a_longlongint;
+ unsigned long long int a_ulonglongint;
+#endif
+ float a_float;
+ double a_double;
+ long double a_longdouble;
+ int a_char;
+#if HAVE_WINT_T
+ wint_t a_wide_char;
+#endif
+ const char* a_string;
+#if HAVE_WCHAR_T
+ const wchar_t* a_wide_string;
+#endif
+ void* a_pointer;
+ signed char * a_count_schar_pointer;
+ short * a_count_short_pointer;
+ int * a_count_int_pointer;
+ long int * a_count_longint_pointer;
+#if HAVE_LONG_LONG_INT
+ long long int * a_count_longlongint_pointer;
+#endif
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ const uint8_t * a_u8_string;
+ const uint16_t * a_u16_string;
+ const uint32_t * a_u32_string;
+#endif
+ }
+ a;
+}
+argument;
+
+typedef struct
+{
+ size_t count;
+ argument *arg;
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int PRINTF_FETCHARGS (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */
diff --git a/gnulib/lib/printf-frexp.c b/gnulib/lib/printf-frexp.c
new file mode 100644
index 00000000..1a538468
--- /dev/null
+++ b/gnulib/lib/printf-frexp.c
@@ -0,0 +1,188 @@
+/* Split a double into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef USE_LONG_DOUBLE
+# include "printf-frexpl.h"
+#else
+# include "printf-frexp.h"
+#endif
+
+#include <float.h>
+#include <math.h>
+#ifdef USE_LONG_DOUBLE
+# include "fpucw.h"
+#endif
+
+/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
+ than 2, or not even a power of 2, some rounding errors can occur, so that
+ then the returned mantissa is only guaranteed to be <= 2.0, not < 2.0. */
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC printf_frexpl
+# define DOUBLE long double
+# define MIN_EXP LDBL_MIN_EXP
+# if HAVE_FREXPL_IN_LIBC && HAVE_LDEXPL_IN_LIBC
+# define USE_FREXP_LDEXP
+# define FREXP frexpl
+# define LDEXP ldexpl
+# endif
+# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
+# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
+# define L_(literal) literal##L
+#else
+# define FUNC printf_frexp
+# define DOUBLE double
+# define MIN_EXP DBL_MIN_EXP
+# if HAVE_FREXP_IN_LIBC && HAVE_LDEXP_IN_LIBC
+# define USE_FREXP_LDEXP
+# define FREXP frexp
+# define LDEXP ldexp
+# endif
+# define DECL_ROUNDING
+# define BEGIN_ROUNDING()
+# define END_ROUNDING()
+# define L_(literal) literal
+#endif
+
+DOUBLE
+FUNC (DOUBLE x, int *expptr)
+{
+ int exponent;
+ DECL_ROUNDING
+
+ BEGIN_ROUNDING ();
+
+#ifdef USE_FREXP_LDEXP
+ /* frexp and ldexp are usually faster than the loop below. */
+ x = FREXP (x, &exponent);
+
+ x = x + x;
+ exponent -= 1;
+
+ if (exponent < MIN_EXP - 1)
+ {
+ x = LDEXP (x, exponent - (MIN_EXP - 1));
+ exponent = MIN_EXP - 1;
+ }
+#else
+ {
+ /* Since the exponent is an 'int', it fits in 64 bits. Therefore the
+ loops are executed no more than 64 times. */
+ DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
+ DOUBLE powh[64]; /* powh[i] = 2^-2^i */
+ int i;
+
+ exponent = 0;
+ if (x >= L_(1.0))
+ {
+ /* A nonnegative exponent. */
+ {
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x >= 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x >= pow2_i)
+ {
+ exponent += (1 << i);
+ x *= powh_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ }
+ /* Here 1.0 <= x < 2^2^i. */
+ }
+ else
+ {
+ /* A negative exponent. */
+ {
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x < 1.0, exponent >= MIN_EXP - 1. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (exponent - (1 << i) < MIN_EXP - 1)
+ break;
+
+ exponent -= (1 << i);
+ x *= pow2_i;
+ if (x >= L_(1.0))
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ }
+ /* Here either x < 1.0 and exponent - 2^i < MIN_EXP - 1 <= exponent,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+
+ if (x < L_(1.0))
+ /* Invariants: x * 2^exponent = argument, x < 1.0 and
+ exponent - 2^i < MIN_EXP - 1 <= exponent. */
+ while (i > 0)
+ {
+ i--;
+ if (exponent - (1 << i) >= MIN_EXP - 1)
+ {
+ exponent -= (1 << i);
+ x *= pow2[i];
+ if (x >= L_(1.0))
+ break;
+ }
+ }
+
+ /* Here either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+ }
+
+ /* Invariants: x * 2^exponent = argument, and
+ either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+ while (i > 0)
+ {
+ i--;
+ if (x >= pow2[i])
+ {
+ exponent += (1 << i);
+ x *= powh[i];
+ }
+ }
+ /* Here either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2.0 and exponent >= MIN_EXP - 1. */
+ }
+#endif
+
+ END_ROUNDING ();
+
+ *expptr = exponent;
+ return x;
+}
diff --git a/gnulib/lib/printf-frexp.h b/gnulib/lib/printf-frexp.h
new file mode 100644
index 00000000..0dc60f8f
--- /dev/null
+++ b/gnulib/lib/printf-frexp.h
@@ -0,0 +1,23 @@
+/* Split a double into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Write a finite, positive number x as
+ x = mantissa * 2^exp
+ where exp >= DBL_MIN_EXP - 1,
+ mantissa < 2.0,
+ if x is not a denormalized number then mantissa >= 1.0.
+ Store exp in *EXPPTR and return mantissa. */
+extern double printf_frexp (double x, int *expptr);
diff --git a/gnulib/lib/printf-frexpl.c b/gnulib/lib/printf-frexpl.c
new file mode 100644
index 00000000..36bac749
--- /dev/null
+++ b/gnulib/lib/printf-frexpl.c
@@ -0,0 +1,18 @@
+/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#define USE_LONG_DOUBLE
+#include "printf-frexp.c"
diff --git a/gnulib/lib/printf-frexpl.h b/gnulib/lib/printf-frexpl.h
new file mode 100644
index 00000000..1b5f7f77
--- /dev/null
+++ b/gnulib/lib/printf-frexpl.h
@@ -0,0 +1,23 @@
+/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Write a finite, positive number x as
+ x = mantissa * 2^exp
+ where exp >= LDBL_MIN_EXP - 1,
+ mantissa < 2.0,
+ if x is not a denormalized number then mantissa >= 1.0.
+ Store exp in *EXPPTR and return mantissa. */
+extern long double printf_frexpl (long double x, int *expptr);
diff --git a/gnulib/lib/printf-parse.c b/gnulib/lib/printf-parse.c
new file mode 100644
index 00000000..4fce8751
--- /dev/null
+++ b/gnulib/lib/printf-parse.c
@@ -0,0 +1,627 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002-2003, 2006-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file can be parametrized with the following macros:
+ CHAR_T The element type of the format string.
+ CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on CHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on CHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on CHAR_T.
+ STATIC Set to 'static' to declare the function static.
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */
+
+#ifndef PRINTF_PARSE
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifndef PRINTF_PARSE
+# include "printf-parse.h"
+#endif
+
+/* Default parameters. */
+#ifndef PRINTF_PARSE
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
+/* Get size_t, NULL. */
+#include <stddef.h>
+
+/* Get intmax_t. */
+#if defined IN_LIBINTL || defined IN_LIBASPRINTF
+# if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+# endif
+# if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+# endif
+#else
+# include <stdint.h>
+#endif
+
+/* malloc(), realloc(), free(). */
+#include <stdlib.h>
+
+/* errno. */
+#include <errno.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#if CHAR_T_ONLY_ASCII
+/* c_isascii(). */
+# include "c-ctype.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+{
+ const CHAR_T *cp = format; /* pointer into format */
+ size_t arg_posn = 0; /* number of regular arguments consumed */
+ size_t d_allocated; /* allocated elements of d->dir */
+ size_t a_allocated; /* allocated elements of a->arg */
+ size_t max_width_length = 0;
+ size_t max_precision_length = 0;
+
+ d->count = 0;
+ d_allocated = 1;
+ d->dir = (DIRECTIVE *) malloc (d_allocated * sizeof (DIRECTIVE));
+ if (d->dir == NULL)
+ /* Out of memory. */
+ goto out_of_memory_1;
+
+ a->count = 0;
+ a_allocated = 0;
+ a->arg = NULL;
+
+#define REGISTER_ARG(_index_,_type_) \
+ { \
+ size_t n = (_index_); \
+ if (n >= a_allocated) \
+ { \
+ size_t memory_size; \
+ argument *memory; \
+ \
+ a_allocated = xtimes (a_allocated, 2); \
+ if (a_allocated <= n) \
+ a_allocated = xsum (n, 1); \
+ memory_size = xtimes (a_allocated, sizeof (argument)); \
+ if (size_overflow_p (memory_size)) \
+ /* Overflow, would lead to out of memory. */ \
+ goto out_of_memory; \
+ memory = (argument *) (a->arg \
+ ? realloc (a->arg, memory_size) \
+ : malloc (memory_size)); \
+ if (memory == NULL) \
+ /* Out of memory. */ \
+ goto out_of_memory; \
+ a->arg = memory; \
+ } \
+ while (a->count <= n) \
+ a->arg[a->count++].type = TYPE_NONE; \
+ if (a->arg[n].type == TYPE_NONE) \
+ a->arg[n].type = (_type_); \
+ else if (a->arg[n].type != (_type_)) \
+ /* Ambiguous type for positional argument. */ \
+ goto error; \
+ }
+
+ while (*cp != '\0')
+ {
+ CHAR_T c = *cp++;
+ if (c == '%')
+ {
+ size_t arg_index = ARG_NONE;
+ DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */
+
+ /* Initialize the next directive. */
+ dp->dir_start = cp - 1;
+ dp->flags = 0;
+ dp->width_start = NULL;
+ dp->width_end = NULL;
+ dp->width_arg_index = ARG_NONE;
+ dp->precision_start = NULL;
+ dp->precision_end = NULL;
+ dp->precision_arg_index = ARG_NONE;
+ dp->arg_index = ARG_NONE;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+
+ /* Read the flags. */
+ for (;;)
+ {
+ if (*cp == '\'')
+ {
+ dp->flags |= FLAG_GROUP;
+ cp++;
+ }
+ else if (*cp == '-')
+ {
+ dp->flags |= FLAG_LEFT;
+ cp++;
+ }
+ else if (*cp == '+')
+ {
+ dp->flags |= FLAG_SHOWSIGN;
+ cp++;
+ }
+ else if (*cp == ' ')
+ {
+ dp->flags |= FLAG_SPACE;
+ cp++;
+ }
+ else if (*cp == '#')
+ {
+ dp->flags |= FLAG_ALT;
+ cp++;
+ }
+ else if (*cp == '0')
+ {
+ dp->flags |= FLAG_ZERO;
+ cp++;
+ }
+ else
+ break;
+ }
+
+ /* Parse the field width. */
+ if (*cp == '*')
+ {
+ dp->width_start = cp;
+ cp++;
+ dp->width_end = cp;
+ if (max_width_length < 1)
+ max_width_length = 1;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ dp->width_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->width_arg_index == ARG_NONE)
+ {
+ dp->width_arg_index = arg_posn++;
+ if (dp->width_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+ }
+ else if (*cp >= '0' && *cp <= '9')
+ {
+ size_t width_length;
+
+ dp->width_start = cp;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->width_end = cp;
+ width_length = dp->width_end - dp->width_start;
+ if (max_width_length < width_length)
+ max_width_length = width_length;
+ }
+
+ /* Parse the precision. */
+ if (*cp == '.')
+ {
+ cp++;
+ if (*cp == '*')
+ {
+ dp->precision_start = cp - 1;
+ cp++;
+ dp->precision_end = cp;
+ if (max_precision_length < 2)
+ max_precision_length = 2;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory
+ later. */
+ goto error;
+ dp->precision_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->precision_arg_index == ARG_NONE)
+ {
+ dp->precision_arg_index = arg_posn++;
+ if (dp->precision_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+ }
+ else
+ {
+ size_t precision_length;
+
+ dp->precision_start = cp - 1;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->precision_end = cp;
+ precision_length = dp->precision_end - dp->precision_start;
+ if (max_precision_length < precision_length)
+ max_precision_length = precision_length;
+ }
+ }
+
+ {
+ arg_type type;
+
+ /* Parse argument type/size specifiers. */
+ {
+ int flags = 0;
+
+ for (;;)
+ {
+ if (*cp == 'h')
+ {
+ flags |= (1 << (flags & 1));
+ cp++;
+ }
+ else if (*cp == 'L')
+ {
+ flags |= 4;
+ cp++;
+ }
+ else if (*cp == 'l')
+ {
+ flags += 8;
+ cp++;
+ }
+ else if (*cp == 'j')
+ {
+ if (sizeof (intmax_t) > sizeof (long))
+ {
+ /* intmax_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (intmax_t) > sizeof (int))
+ {
+ /* intmax_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 'z' || *cp == 'Z')
+ {
+ /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+ because the warning facility in gcc-2.95.2 understands
+ only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
+ if (sizeof (size_t) > sizeof (long))
+ {
+ /* size_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (size_t) > sizeof (int))
+ {
+ /* size_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 't')
+ {
+ if (sizeof (ptrdiff_t) > sizeof (long))
+ {
+ /* ptrdiff_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (ptrdiff_t) > sizeof (int))
+ {
+ /* ptrdiff_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#if defined __APPLE__ && defined __MACH__
+ /* On MacOS X 10.3, PRIdMAX is defined as "qd".
+ We cannot change it to "lld" because PRIdMAX must also
+ be understood by the system's printf routines. */
+ else if (*cp == 'q')
+ {
+ if (64 / 8 > sizeof (long))
+ {
+ /* int64_t = long long */
+ flags += 16;
+ }
+ else
+ {
+ /* int64_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#endif
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On native Win32, PRIdMAX is defined as "I64d".
+ We cannot change it to "lld" because PRIdMAX must also
+ be understood by the system's printf routines. */
+ else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4')
+ {
+ if (64 / 8 > sizeof (long))
+ {
+ /* __int64 = long long */
+ flags += 16;
+ }
+ else
+ {
+ /* __int64 = long */
+ flags += 8;
+ }
+ cp += 3;
+ }
+#endif
+ else
+ break;
+ }
+
+ /* Read the conversion character. */
+ c = *cp++;
+ switch (c)
+ {
+ case 'd': case 'i':
+#if HAVE_LONG_LONG_INT
+ /* If 'long long' exists and is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGLONGINT;
+ else
+#endif
+ /* If 'long long' exists and is the same as 'long', we parse
+ "lld" into TYPE_LONGINT. */
+ if (flags >= 8)
+ type = TYPE_LONGINT;
+ else if (flags & 2)
+ type = TYPE_SCHAR;
+ else if (flags & 1)
+ type = TYPE_SHORT;
+ else
+ type = TYPE_INT;
+ break;
+ case 'o': case 'u': case 'x': case 'X':
+#if HAVE_LONG_LONG_INT
+ /* If 'long long' exists and is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_ULONGLONGINT;
+ else
+#endif
+ /* If 'unsigned long long' exists and is the same as
+ 'unsigned long', we parse "llu" into TYPE_ULONGINT. */
+ if (flags >= 8)
+ type = TYPE_ULONGINT;
+ else if (flags & 2)
+ type = TYPE_UCHAR;
+ else if (flags & 1)
+ type = TYPE_USHORT;
+ else
+ type = TYPE_UINT;
+ break;
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGDOUBLE;
+ else
+ type = TYPE_DOUBLE;
+ break;
+ case 'c':
+ if (flags >= 8)
+#if HAVE_WINT_T
+ type = TYPE_WIDE_CHAR;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_CHAR;
+ break;
+#if HAVE_WINT_T
+ case 'C':
+ type = TYPE_WIDE_CHAR;
+ c = 'c';
+ break;
+#endif
+ case 's':
+ if (flags >= 8)
+#if HAVE_WCHAR_T
+ type = TYPE_WIDE_STRING;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_STRING;
+ break;
+#if HAVE_WCHAR_T
+ case 'S':
+ type = TYPE_WIDE_STRING;
+ c = 's';
+ break;
+#endif
+ case 'p':
+ type = TYPE_POINTER;
+ break;
+ case 'n':
+#if HAVE_LONG_LONG_INT
+ /* If 'long long' exists and is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_COUNT_LONGLONGINT_POINTER;
+ else
+#endif
+ /* If 'long long' exists and is the same as 'long', we parse
+ "lln" into TYPE_COUNT_LONGINT_POINTER. */
+ if (flags >= 8)
+ type = TYPE_COUNT_LONGINT_POINTER;
+ else if (flags & 2)
+ type = TYPE_COUNT_SCHAR_POINTER;
+ else if (flags & 1)
+ type = TYPE_COUNT_SHORT_POINTER;
+ else
+ type = TYPE_COUNT_INT_POINTER;
+ break;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case 'U':
+ if (flags >= 16)
+ type = TYPE_U32_STRING;
+ else if (flags >= 8)
+ type = TYPE_U16_STRING;
+ else
+ type = TYPE_U8_STRING;
+ break;
+#endif
+ case '%':
+ type = TYPE_NONE;
+ break;
+ default:
+ /* Unknown conversion character. */
+ goto error;
+ }
+ }
+
+ if (type != TYPE_NONE)
+ {
+ dp->arg_index = arg_index;
+ if (dp->arg_index == ARG_NONE)
+ {
+ dp->arg_index = arg_posn++;
+ if (dp->arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->arg_index, type);
+ }
+ dp->conversion = c;
+ dp->dir_end = cp;
+ }
+
+ d->count++;
+ if (d->count >= d_allocated)
+ {
+ size_t memory_size;
+ DIRECTIVE *memory;
+
+ d_allocated = xtimes (d_allocated, 2);
+ memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ memory = (DIRECTIVE *) realloc (d->dir, memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ d->dir = memory;
+ }
+ }
+#if CHAR_T_ONLY_ASCII
+ else if (!c_isascii (c))
+ {
+ /* Non-ASCII character. Not supported. */
+ goto error;
+ }
+#endif
+ }
+ d->dir[d->count].dir_start = cp;
+
+ d->max_width_length = max_width_length;
+ d->max_precision_length = max_precision_length;
+ return 0;
+
+error:
+ if (a->arg)
+ free (a->arg);
+ if (d->dir)
+ free (d->dir);
+ errno = EINVAL;
+ return -1;
+
+out_of_memory:
+ if (a->arg)
+ free (a->arg);
+ if (d->dir)
+ free (d->dir);
+out_of_memory_1:
+ errno = ENOMEM;
+ return -1;
+}
+
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T_ONLY_ASCII
+#undef CHAR_T
diff --git a/gnulib/lib/printf-parse.h b/gnulib/lib/printf-parse.h
new file mode 100644
index 00000000..88666ad1
--- /dev/null
+++ b/gnulib/lib/printf-parse.h
@@ -0,0 +1,180 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002-2003, 2005, 2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ STATIC Set to 'static' to declare the function static. */
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP 1 /* ' flag */
+#define FLAG_LEFT 2 /* - flag */
+#define FLAG_SHOWSIGN 4 /* + flag */
+#define FLAG_SPACE 8 /* space flag */
+#define FLAG_ALT 16 /* # flag */
+#define FLAG_ZERO 32
+
+/* arg_index value indicating that no argument is consumed. */
+#define ARG_NONE (~(size_t)0)
+
+/* xxx_directive: A parsed directive.
+ xxx_directives: A parsed format string. */
+
+/* A parsed directive. */
+typedef struct
+{
+ const char* dir_start;
+ const char* dir_end;
+ int flags;
+ const char* width_start;
+ const char* width_end;
+ size_t width_arg_index;
+ const char* precision_start;
+ const char* precision_end;
+ size_t precision_arg_index;
+ char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+char_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ char_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+}
+char_directives;
+
+#if ENABLE_UNISTDIO
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint8_t* dir_start;
+ const uint8_t* dir_end;
+ int flags;
+ const uint8_t* width_start;
+ const uint8_t* width_end;
+ size_t width_arg_index;
+ const uint8_t* precision_start;
+ const uint8_t* precision_end;
+ size_t precision_arg_index;
+ uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u8_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u8_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+}
+u8_directives;
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint16_t* dir_start;
+ const uint16_t* dir_end;
+ int flags;
+ const uint16_t* width_start;
+ const uint16_t* width_end;
+ size_t width_arg_index;
+ const uint16_t* precision_start;
+ const uint16_t* precision_end;
+ size_t precision_arg_index;
+ uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u16_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u16_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+}
+u16_directives;
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint32_t* dir_start;
+ const uint32_t* dir_end;
+ int flags;
+ const uint32_t* width_start;
+ const uint32_t* width_end;
+ size_t width_arg_index;
+ const uint32_t* precision_start;
+ const uint32_t* precision_end;
+ size_t precision_arg_index;
+ uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u32_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u32_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+}
+u32_directives;
+
+#endif
+
+
+/* Parses the format string. Fills in the number N of directives, and fills
+ in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+ to the end of the format string. Also fills in the arg_type fields of the
+ arguments and the needed count of arguments. */
+#if ENABLE_UNISTDIO
+extern int
+ ulc_printf_parse (const char *format, char_directives *d, arguments *a);
+extern int
+ u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a);
+extern int
+ u16_printf_parse (const uint16_t *format, u16_directives *d,
+ arguments *a);
+extern int
+ u32_printf_parse (const uint32_t *format, u32_directives *d,
+ arguments *a);
+#else
+# ifdef STATIC
+STATIC
+# else
+extern
+# endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+#endif
+
+#endif /* _PRINTF_PARSE_H */
diff --git a/gnulib/lib/printf.c b/gnulib/lib/printf.c
new file mode 100644
index 00000000..d0960867
--- /dev/null
+++ b/gnulib/lib/printf.c
@@ -0,0 +1,40 @@
+/* Formatted output to a stream.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <stdarg.h>
+
+/* Print formatted output to standard output.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+printf (const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stdout, format, args);
+ va_end (args);
+
+ return retval;
+}
diff --git a/gnulib/lib/priv-set.c b/gnulib/lib/priv-set.c
new file mode 100644
index 00000000..911c2800
--- /dev/null
+++ b/gnulib/lib/priv-set.c
@@ -0,0 +1,143 @@
+/* Query, remove, or restore a Solaris privilege.
+
+ Copyright (C) 2009, 2010 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/>.
+
+ Written by David Bartley. */
+
+#include <config.h>
+#include "priv-set.h"
+
+#if HAVE_GETPPRIV
+
+# include <errno.h>
+# include <stdbool.h>
+# include <priv.h>
+
+/* Holds a (cached) copy of the effective set. */
+static priv_set_t *eff_set;
+
+/* Holds a set of privileges that we have removed. */
+static priv_set_t *rem_set;
+
+static bool initialized;
+
+static int
+priv_set_initialize (void)
+{
+ if (! initialized)
+ {
+ eff_set = priv_allocset ();
+ if (!eff_set)
+ {
+ return -1;
+ }
+ rem_set = priv_allocset ();
+ if (!rem_set)
+ {
+ priv_freeset (eff_set);
+ return -1;
+ }
+ if (getppriv (PRIV_EFFECTIVE, eff_set) != 0)
+ {
+ priv_freeset (eff_set);
+ priv_freeset (rem_set);
+ return -1;
+ }
+ priv_emptyset (rem_set);
+ initialized = true;
+ }
+
+ return 0;
+}
+
+
+/* Check if priv is in the effective set.
+ Returns 1 if priv is a member and 0 if not.
+ Returns -1 on error with errno set appropriately. */
+int
+priv_set_ismember (const char *priv)
+{
+ if (! initialized && priv_set_initialize () != 0)
+ return -1;
+
+ return priv_ismember (eff_set, priv);
+}
+
+
+/* Try to remove priv from the effective set.
+ Returns 0 if priv was removed from or was not present in the effective set.
+ Returns -1 on error with errno set appropriately. */
+int
+priv_set_remove (const char *priv)
+{
+ if (! initialized && priv_set_initialize () != 0)
+ return -1;
+
+ if (priv_ismember (eff_set, priv))
+ {
+ /* priv_addset/priv_delset can only fail if priv is invalid, which is
+ checked above by the priv_ismember call. */
+ priv_delset (eff_set, priv);
+ if (setppriv (PRIV_SET, PRIV_EFFECTIVE, eff_set) != 0)
+ {
+ priv_addset (eff_set, priv);
+ return -1;
+ }
+ priv_addset (rem_set, priv);
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/* Try to restore priv to the effective set.
+ Returns 0 if priv was re-added to the effective set (after being prviously
+ removed by a call to priv_set_remove) or if priv was already in the
+ effective set.
+ Returns -1 on error with errno set appropriately. */
+int
+priv_set_restore (const char *priv)
+{
+ if (! initialized && priv_set_initialize () != 0)
+ return -1;
+
+ if (priv_ismember (rem_set, priv))
+ {
+ /* priv_addset/priv_delset can only fail if priv is invalid, which is
+ checked above by the priv_ismember call. */
+ priv_addset (eff_set, priv);
+ if (setppriv (PRIV_SET, PRIV_EFFECTIVE, eff_set) != 0)
+ {
+ priv_delset (eff_set, priv);
+ return -1;
+ }
+ priv_delset (rem_set, priv);
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/priv-set.h b/gnulib/lib/priv-set.h
new file mode 100644
index 00000000..b8f8b727
--- /dev/null
+++ b/gnulib/lib/priv-set.h
@@ -0,0 +1,50 @@
+/* Query, remove, or restore a Solaris privilege.
+
+ Copyright (C) 2009, 2010 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/>.
+
+ Written by David Bartley. */
+
+#if HAVE_GETPPRIV
+
+# include <priv.h>
+
+int priv_set_ismember (const char *priv);
+int priv_set_remove (const char *priv);
+int priv_set_restore (const char *priv);
+
+static inline int priv_set_remove_linkdir (void)
+{
+ return priv_set_remove (PRIV_SYS_LINKDIR);
+}
+
+static inline int priv_set_restore_linkdir (void)
+{
+ return priv_set_restore (PRIV_SYS_LINKDIR);
+}
+
+#else
+
+static inline int priv_set_remove_linkdir (void)
+{
+ return -1;
+}
+
+static inline int priv_set_restore_linkdir (void)
+{
+ return -1;
+}
+
+#endif
diff --git a/gnulib/lib/progname.c b/gnulib/lib/progname.c
new file mode 100644
index 00000000..1415e6a5
--- /dev/null
+++ b/gnulib/lib/progname.c
@@ -0,0 +1,92 @@
+/* Program name management.
+ Copyright (C) 2001-2003, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#undef ENABLE_RELOCATABLE /* avoid defining set_program_name as a macro */
+#include "progname.h"
+
+#include <errno.h> /* get program_invocation_name declaration */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/* String containing name the program is called with.
+ To be initialized by main(). */
+const char *program_name = NULL;
+
+/* Set program_name, based on argv[0].
+ argv0 must be a string allocated with indefinite extent, and must not be
+ modified after this call. */
+void
+set_program_name (const char *argv0)
+{
+ /* libtool creates a temporary executable whose name is sometimes prefixed
+ with "lt-" (depends on the platform). It also makes argv[0] absolute.
+ But the name of the temporary executable is a detail that should not be
+ visible to the end user and to the test suite.
+ Remove this "<dirname>/.libs/" or "<dirname>/.libs/lt-" prefix here. */
+ const char *slash;
+ const char *base;
+
+ /* Sanity check. POSIX requires the invoking process to pass a non-NULL
+ argv[0]. */
+ if (argv0 == NULL)
+ {
+ /* It's a bug in the invoking program. Help diagnosing it. */
+ fputs ("A NULL argv[0] was passed through an exec system call.\n",
+ stderr);
+ abort ();
+ }
+
+ slash = strrchr (argv0, '/');
+ base = (slash != NULL ? slash + 1 : argv0);
+ if (base - argv0 >= 7 && strncmp (base - 7, "/.libs/", 7) == 0)
+ {
+ argv0 = base;
+ if (strncmp (base, "lt-", 3) == 0)
+ {
+ argv0 = base + 3;
+ /* On glibc systems, remove the "lt-" prefix from the variable
+ program_invocation_short_name. */
+#if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ program_invocation_short_name = (char *) argv0;
+#endif
+ }
+ }
+
+ /* But don't strip off a leading <dirname>/ in general, because when the user
+ runs
+ /some/hidden/place/bin/cp foo foo
+ he should get the error message
+ /some/hidden/place/bin/cp: `foo' and `foo' are the same file
+ not
+ cp: `foo' and `foo' are the same file
+ */
+
+ program_name = argv0;
+
+ /* On glibc systems, the error() function comes from libc and uses the
+ variable program_invocation_name, not program_name. So set this variable
+ as well. */
+#if HAVE_DECL_PROGRAM_INVOCATION_NAME
+ program_invocation_name = (char *) argv0;
+#endif
+}
diff --git a/gnulib/lib/progname.h b/gnulib/lib/progname.h
new file mode 100644
index 00000000..5ba303bd
--- /dev/null
+++ b/gnulib/lib/progname.h
@@ -0,0 +1,62 @@
+/* Program name management.
+ Copyright (C) 2001-2004, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ 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/>. */
+
+#ifndef _PROGNAME_H
+#define _PROGNAME_H
+
+/* Programs using this file should do the following in main():
+ set_program_name (argv[0]);
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* String containing name the program is called with. */
+extern const char *program_name;
+
+/* Set program_name, based on argv[0].
+ argv0 must be a string allocated with indefinite extent, and must not be
+ modified after this call. */
+extern void set_program_name (const char *argv0);
+
+#if ENABLE_RELOCATABLE
+
+/* Set program_name, based on argv[0], and original installation prefix and
+ directory, for relocatability. */
+extern void set_program_name_and_installdir (const char *argv0,
+ const char *orig_installprefix,
+ const char *orig_installdir);
+#undef set_program_name
+#define set_program_name(ARG0) \
+ set_program_name_and_installdir (ARG0, INSTALLPREFIX, INSTALLDIR)
+
+/* Return the full pathname of the current executable, based on the earlier
+ call to set_program_name_and_installdir. Return NULL if unknown. */
+extern char *get_full_program_name (void);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _PROGNAME_H */
diff --git a/gnulib/lib/progreloc.c b/gnulib/lib/progreloc.c
new file mode 100644
index 00000000..8aa33b75
--- /dev/null
+++ b/gnulib/lib/progreloc.c
@@ -0,0 +1,374 @@
+/* Provide relocatable programs.
+ Copyright (C) 2003-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "progname.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+/* Get declaration of _NSGetExecutablePath on MacOS X 10.2 or newer. */
+#if HAVE_MACH_O_DYLD_H
+# include <mach-o/dyld.h>
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#if defined WIN32_NATIVE || defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "relocatable.h"
+
+#ifdef NO_XMALLOC
+# include "areadlink.h"
+# define xreadlink areadlink
+#else
+# include "xreadlink.h"
+#endif
+
+#ifdef NO_XMALLOC
+# define xmalloc malloc
+# define xstrdup strdup
+#else
+# include "xalloc.h"
+#endif
+
+/* Declare canonicalize_file_name.
+ The <stdlib.h> included above may be the system's one, not the gnulib
+ one. */
+extern char * canonicalize_file_name (const char *name);
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILE_SYSTEM_PREFIX_LEN(P) 0
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+#undef set_program_name
+
+
+#if ENABLE_RELOCATABLE
+
+#ifdef __linux__
+/* File descriptor of the executable.
+ (Only used to verify that we find the correct executable.) */
+static int executable_fd = -1;
+#endif
+
+/* Tests whether a given pathname may belong to the executable. */
+static bool
+maybe_executable (const char *filename)
+{
+ /* Woe32 lacks the access() function, but Cygwin doesn't. */
+#if !(defined WIN32_NATIVE && !defined __CYGWIN__)
+ if (access (filename, X_OK) < 0)
+ return false;
+
+#ifdef __linux__
+ if (executable_fd >= 0)
+ {
+ /* If we already have an executable_fd, check that filename points to
+ the same inode. */
+ struct stat statexe;
+ struct stat statfile;
+
+ if (fstat (executable_fd, &statexe) >= 0)
+ {
+ if (stat (filename, &statfile) < 0)
+ return false;
+ if (!(statfile.st_dev
+ && statfile.st_dev == statexe.st_dev
+ && statfile.st_ino == statexe.st_ino))
+ return false;
+ }
+ }
+#endif
+#endif
+
+ return true;
+}
+
+/* Determine the full pathname of the current executable, freshly allocated.
+ Return NULL if unknown.
+ Guaranteed to work on Linux and Woe32. Likely to work on the other
+ Unixes (maybe except BeOS), under most conditions. */
+static char *
+find_executable (const char *argv0)
+{
+#if defined WIN32_NATIVE || defined __CYGWIN__
+ char location[MAX_PATH];
+ int length = GetModuleFileName (NULL, location, sizeof (location));
+ if (length < 0)
+ return NULL;
+ if (!IS_PATH_WITH_DIR (location))
+ /* Shouldn't happen. */
+ return NULL;
+ {
+#if defined __CYGWIN__
+ /* cygwin-1.5.13 (2005-03-01) or newer would also allow a Linux-like
+ implementation: readlink of "/proc/self/exe". But using the
+ result of the Win32 system call is simpler and is consistent with the
+ code in relocatable.c. */
+ /* On Cygwin, we need to convert paths coming from Win32 system calls
+ to the Unix-like slashified notation. */
+ static char location_as_posix_path[2 * MAX_PATH];
+ /* There's no error return defined for cygwin_conv_to_posix_path.
+ See cygwin-api/func-cygwin-conv-to-posix-path.html.
+ Does it overflow the buffer of expected size MAX_PATH or does it
+ truncate the path? I don't know. Let's catch both. */
+ cygwin_conv_to_posix_path (location, location_as_posix_path);
+ location_as_posix_path[MAX_PATH - 1] = '\0';
+ if (strlen (location_as_posix_path) >= MAX_PATH - 1)
+ /* A sign of buffer overflow or path truncation. */
+ return NULL;
+ /* Call canonicalize_file_name, because Cygwin supports symbolic links. */
+ return canonicalize_file_name (location_as_posix_path);
+#else
+ return xstrdup (location);
+#endif
+ }
+#else /* Unix && !Cygwin */
+#ifdef __linux__
+ /* The executable is accessible as /proc/<pid>/exe. In newer Linux
+ versions, also as /proc/self/exe. Linux >= 2.1 provides a symlink
+ to the true pathname; older Linux versions give only device and ino,
+ enclosed in brackets, which we cannot use here. */
+ {
+ char *link;
+
+ link = xreadlink ("/proc/self/exe");
+ if (link != NULL && link[0] != '[')
+ return link;
+ if (executable_fd < 0)
+ executable_fd = open ("/proc/self/exe", O_RDONLY, 0);
+
+ {
+ char buf[6+10+5];
+ sprintf (buf, "/proc/%d/exe", getpid ());
+ link = xreadlink (buf);
+ if (link != NULL && link[0] != '[')
+ return link;
+ if (executable_fd < 0)
+ executable_fd = open (buf, O_RDONLY, 0);
+ }
+ }
+#endif
+#if HAVE_MACH_O_DYLD_H && HAVE__NSGETEXECUTABLEPATH
+ /* On MacOS X 10.2 or newer, the function
+ int _NSGetExecutablePath (char *buf, uint32_t *bufsize);
+ can be used to retrieve the executable's full path. */
+ char location[4096];
+ unsigned int length = sizeof (location);
+ if (_NSGetExecutablePath (location, &length) == 0
+ && location[0] == '/')
+ return canonicalize_file_name (location);
+#endif
+ /* Guess the executable's full path. We assume the executable has been
+ called via execlp() or execvp() with properly set up argv[0]. The
+ login(1) convention to add a '-' prefix to argv[0] is not supported. */
+ {
+ bool has_slash = false;
+ {
+ const char *p;
+ for (p = argv0; *p; p++)
+ if (*p == '/')
+ {
+ has_slash = true;
+ break;
+ }
+ }
+ if (!has_slash)
+ {
+ /* exec searches paths without slashes in the directory list given
+ by $PATH. */
+ const char *path = getenv ("PATH");
+
+ if (path != NULL)
+ {
+ const char *p;
+ const char *p_next;
+
+ for (p = path; *p; p = p_next)
+ {
+ const char *q;
+ size_t p_len;
+ char *concat_name;
+
+ for (q = p; *q; q++)
+ if (*q == ':')
+ break;
+ p_len = q - p;
+ p_next = (*q == '\0' ? q : q + 1);
+
+ /* We have a path item at p, of length p_len.
+ Now concatenate the path item and argv0. */
+ concat_name = (char *) xmalloc (p_len + strlen (argv0) + 2);
+#ifdef NO_XMALLOC
+ if (concat_name == NULL)
+ return NULL;
+#endif
+ if (p_len == 0)
+ /* An empty PATH element designates the current directory. */
+ strcpy (concat_name, argv0);
+ else
+ {
+ memcpy (concat_name, p, p_len);
+ concat_name[p_len] = '/';
+ strcpy (concat_name + p_len + 1, argv0);
+ }
+ if (maybe_executable (concat_name))
+ return canonicalize_file_name (concat_name);
+ free (concat_name);
+ }
+ }
+ /* Not found in the PATH, assume the current directory. */
+ }
+ /* exec treats paths containing slashes as relative to the current
+ directory. */
+ if (maybe_executable (argv0))
+ return canonicalize_file_name (argv0);
+ }
+ /* No way to find the executable. */
+ return NULL;
+#endif
+}
+
+/* Full pathname of executable, or NULL. */
+static char *executable_fullname;
+
+static void
+prepare_relocate (const char *orig_installprefix, const char *orig_installdir,
+ const char *argv0)
+{
+ char *curr_prefix;
+
+ /* Determine the full pathname of the current executable. */
+ executable_fullname = find_executable (argv0);
+
+ /* Determine the current installation prefix from it. */
+ curr_prefix = compute_curr_prefix (orig_installprefix, orig_installdir,
+ executable_fullname);
+ if (curr_prefix != NULL)
+ {
+ /* Now pass this prefix to all copies of the relocate.c source file. */
+ set_relocation_prefix (orig_installprefix, curr_prefix);
+
+ free (curr_prefix);
+ }
+}
+
+/* Set program_name, based on argv[0], and original installation prefix and
+ directory, for relocatability. */
+void
+set_program_name_and_installdir (const char *argv0,
+ const char *orig_installprefix,
+ const char *orig_installdir)
+{
+ const char *argv0_stripped = argv0;
+
+ /* Relocatable programs are renamed to .bin by install-reloc. Or, more
+ generally, their suffix is changed from $exeext to .bin$exeext.
+ Remove the ".bin" here. */
+ {
+ size_t argv0_len = strlen (argv0);
+ const size_t exeext_len = sizeof (EXEEXT) - sizeof ("");
+ if (argv0_len > 4 + exeext_len)
+ if (memcmp (argv0 + argv0_len - exeext_len - 4, ".bin", 4) == 0)
+ {
+ if (sizeof (EXEEXT) > sizeof (""))
+ {
+ /* Compare using an inlined copy of c_strncasecmp(), because
+ the filenames may have undergone a case conversion since
+ they were packaged. In other words, EXEEXT may be ".exe"
+ on one system and ".EXE" on another. */
+ static const char exeext[] = EXEEXT;
+ const char *s1 = argv0 + argv0_len - exeext_len;
+ const char *s2 = exeext;
+ for (; *s1 != '\0'; s1++, s2++)
+ {
+ unsigned char c1 = *s1;
+ unsigned char c2 = *s2;
+ if ((c1 >= 'A' && c1 <= 'Z' ? c1 - 'A' + 'a' : c1)
+ != (c2 >= 'A' && c2 <= 'Z' ? c2 - 'A' + 'a' : c2))
+ goto done_stripping;
+ }
+ }
+ /* Remove ".bin" before EXEEXT or its equivalent. */
+ {
+ char *shorter = (char *) xmalloc (argv0_len - 4 + 1);
+#ifdef NO_XMALLOC
+ if (shorter != NULL)
+#endif
+ {
+ memcpy (shorter, argv0, argv0_len - exeext_len - 4);
+ if (sizeof (EXEEXT) > sizeof (""))
+ memcpy (shorter + argv0_len - exeext_len - 4,
+ argv0 + argv0_len - exeext_len - 4,
+ exeext_len);
+ shorter[argv0_len - 4] = '\0';
+ argv0_stripped = shorter;
+ }
+ }
+ done_stripping: ;
+ }
+ }
+
+ set_program_name (argv0_stripped);
+
+ prepare_relocate (orig_installprefix, orig_installdir, argv0);
+}
+
+/* Return the full pathname of the current executable, based on the earlier
+ call to set_program_name_and_installdir. Return NULL if unknown. */
+char *
+get_full_program_name (void)
+{
+ return executable_fullname;
+}
+
+#endif
diff --git a/gnulib/lib/propername.c b/gnulib/lib/propername.c
new file mode 100644
index 00000000..3971f3f7
--- /dev/null
+++ b/gnulib/lib/propername.c
@@ -0,0 +1,311 @@
+/* Localization of proper names.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "propername.h"
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include "trim.h"
+#include "mbchar.h"
+#include "mbuiter.h"
+#include "localcharset.h"
+#include "c-strcase.h"
+#include "xstriconv.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+
+/* Tests whether STRING contains trim (SUB), starting and ending at word
+ boundaries.
+ Here, instead of implementing Unicode Standard Annex #29 for determining
+ word boundaries, we assume that trim (SUB) starts and ends with words and
+ only test whether the part before it ends with a non-word and the part
+ after it starts with a non-word. */
+static bool
+mbsstr_trimmed_wordbounded (const char *string, const char *sub)
+{
+ char *tsub = trim (sub);
+ bool found = false;
+
+ for (; *string != '\0';)
+ {
+ const char *tsub_in_string = mbsstr (string, tsub);
+ if (tsub_in_string == NULL)
+ break;
+ else
+ {
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t string_iter;
+ bool word_boundary_before;
+ bool word_boundary_after;
+
+ mbui_init (string_iter, string);
+ word_boundary_before = true;
+ if (mbui_cur_ptr (string_iter) < tsub_in_string)
+ {
+ mbchar_t last_char_before_tsub;
+ do
+ {
+ if (!mbui_avail (string_iter))
+ abort ();
+ last_char_before_tsub = mbui_cur (string_iter);
+ mbui_advance (string_iter);
+ }
+ while (mbui_cur_ptr (string_iter) < tsub_in_string);
+ if (mb_isalnum (last_char_before_tsub))
+ word_boundary_before = false;
+ }
+
+ mbui_init (string_iter, tsub_in_string);
+ {
+ mbui_iterator_t tsub_iter;
+
+ for (mbui_init (tsub_iter, tsub);
+ mbui_avail (tsub_iter);
+ mbui_advance (tsub_iter))
+ {
+ if (!mbui_avail (string_iter))
+ abort ();
+ mbui_advance (string_iter);
+ }
+ }
+ word_boundary_after = true;
+ if (mbui_avail (string_iter))
+ {
+ mbchar_t first_char_after_tsub = mbui_cur (string_iter);
+ if (mb_isalnum (first_char_after_tsub))
+ word_boundary_after = false;
+ }
+
+ if (word_boundary_before && word_boundary_after)
+ {
+ found = true;
+ break;
+ }
+
+ mbui_init (string_iter, tsub_in_string);
+ if (!mbui_avail (string_iter))
+ break;
+ string = tsub_in_string + mb_len (mbui_cur (string_iter));
+ }
+ else
+ {
+ bool word_boundary_before;
+ const char *p;
+ bool word_boundary_after;
+
+ word_boundary_before = true;
+ if (string < tsub_in_string)
+ if (isalnum ((unsigned char) tsub_in_string[-1]))
+ word_boundary_before = false;
+
+ p = tsub_in_string + strlen (tsub);
+ word_boundary_after = true;
+ if (*p != '\0')
+ if (isalnum ((unsigned char) *p))
+ word_boundary_after = false;
+
+ if (word_boundary_before && word_boundary_after)
+ {
+ found = true;
+ break;
+ }
+
+ if (*tsub_in_string == '\0')
+ break;
+ string = tsub_in_string + 1;
+ }
+ }
+ }
+ free (tsub);
+ return found;
+}
+
+/* Return the localization of NAME. NAME is written in ASCII. */
+
+const char *
+proper_name (const char *name)
+{
+ /* See whether there is a translation. */
+ const char *translation = gettext (name);
+
+ if (translation != name)
+ {
+ /* See whether the translation contains the original name. */
+ if (mbsstr_trimmed_wordbounded (translation, name))
+ return translation;
+ else
+ {
+ /* Return "TRANSLATION (NAME)". */
+ char *result =
+ XNMALLOC (strlen (translation) + 2 + strlen (name) + 1 + 1, char);
+
+ sprintf (result, "%s (%s)", translation, name);
+ return result;
+ }
+ }
+ else
+ return name;
+}
+
+/* Return the localization of a name whose original writing is not ASCII.
+ NAME_UTF8 is the real name, written in UTF-8 with octal or hexadecimal
+ escape sequences. NAME_ASCII is a fallback written only with ASCII
+ characters. */
+
+const char *
+proper_name_utf8 (const char *name_ascii, const char *name_utf8)
+{
+ /* See whether there is a translation. */
+ const char *translation = gettext (name_ascii);
+
+ /* Try to convert NAME_UTF8 to the locale encoding. */
+ const char *locale_code = locale_charset ();
+ char *alloc_name_converted = NULL;
+ char *alloc_name_converted_translit = NULL;
+ const char *name_converted = NULL;
+ const char *name_converted_translit = NULL;
+ const char *name;
+
+ if (c_strcasecmp (locale_code, "UTF-8") != 0)
+ {
+#if HAVE_ICONV
+ name_converted = alloc_name_converted =
+ xstr_iconv (name_utf8, "UTF-8", locale_code);
+
+# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \
+ || _LIBICONV_VERSION >= 0x0105
+ {
+ char *converted_translit;
+
+ size_t len = strlen (locale_code);
+ char *locale_code_translit = XNMALLOC (len + 10 + 1, char);
+ memcpy (locale_code_translit, locale_code, len);
+ memcpy (locale_code_translit + len, "//TRANSLIT", 10 + 1);
+
+ converted_translit =
+ xstr_iconv (name_utf8, "UTF-8", locale_code_translit);
+
+ free (locale_code_translit);
+
+ if (converted_translit != NULL)
+ {
+# if !_LIBICONV_VERSION
+ /* Don't use the transliteration if it added question marks.
+ glibc's transliteration falls back to question marks; libiconv's
+ transliteration does not.
+ mbschr is equivalent to strchr in this case. */
+ if (strchr (converted_translit, '?') != NULL)
+ free (converted_translit);
+ else
+# endif
+ name_converted_translit = alloc_name_converted_translit =
+ converted_translit;
+ }
+ }
+# endif
+#endif
+ }
+ else
+ {
+ name_converted = name_utf8;
+ name_converted_translit = name_utf8;
+ }
+
+ /* The name in locale encoding. */
+ name = (name_converted != NULL ? name_converted :
+ name_converted_translit != NULL ? name_converted_translit :
+ name_ascii);
+
+ /* See whether we have a translation. Some translators have not understood
+ that they should use the UTF-8 form of the name, if possible. So if the
+ translator provided a no-op translation, we ignore it. */
+ if (strcmp (translation, name_ascii) != 0)
+ {
+ /* See whether the translation contains the original name. */
+ if (mbsstr_trimmed_wordbounded (translation, name_ascii)
+ || (name_converted != NULL
+ && mbsstr_trimmed_wordbounded (translation, name_converted))
+ || (name_converted_translit != NULL
+ && mbsstr_trimmed_wordbounded (translation, name_converted_translit)))
+ {
+ if (alloc_name_converted != NULL)
+ free (alloc_name_converted);
+ if (alloc_name_converted_translit != NULL)
+ free (alloc_name_converted_translit);
+ return translation;
+ }
+ else
+ {
+ /* Return "TRANSLATION (NAME)". */
+ char *result =
+ XNMALLOC (strlen (translation) + 2 + strlen (name) + 1 + 1, char);
+
+ sprintf (result, "%s (%s)", translation, name);
+
+ if (alloc_name_converted != NULL)
+ free (alloc_name_converted);
+ if (alloc_name_converted_translit != NULL)
+ free (alloc_name_converted_translit);
+ return result;
+ }
+ }
+ else
+ {
+ if (alloc_name_converted != NULL && alloc_name_converted != name)
+ free (alloc_name_converted);
+ if (alloc_name_converted_translit != NULL
+ && alloc_name_converted_translit != name)
+ free (alloc_name_converted_translit);
+ return name;
+ }
+}
+
+#ifdef TEST1
+# include <locale.h>
+int
+main (int argc, char *argv[])
+{
+ setlocale (LC_ALL, "");
+ if (mbsstr_trimmed_wordbounded (argv[1], argv[2]))
+ printf("found\n");
+ return 0;
+}
+#endif
+
+#ifdef TEST2
+# include <locale.h>
+# include <stdio.h>
+int
+main (int argc, char *argv[])
+{
+ setlocale (LC_ALL, "");
+ printf ("%s\n", proper_name_utf8 ("Franc,ois Pinard", "Fran\303\247ois Pinard"));
+ return 0;
+}
+#endif
diff --git a/gnulib/lib/propername.h b/gnulib/lib/propername.h
new file mode 100644
index 00000000..eba56f69
--- /dev/null
+++ b/gnulib/lib/propername.h
@@ -0,0 +1,106 @@
+/* Localization of proper names.
+ Copyright (C) 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+/* INTRODUCTION
+
+ What do
+
+ Torbjörn Granlund (coreutils)
+ François Pinard (coreutils)
+ Danilo Šegan (gettext)
+
+ have in common?
+
+ A non-ASCII name. This causes trouble in the --version output. The simple
+ "solution", unfortunately mutilates the name.
+
+ $ du --version| grep Granlund
+ Écrit par Torbjorn Granlund, David MacKenzie, Paul Eggert et Jim Meyering.
+
+ $ ptx --version| grep Pinard
+ Écrit par F. Pinard.
+
+ What is desirable, is to print the full name if the output character set
+ allows it, and the ASCIIfied name only as a fallback.
+
+ $ recode-sr-latin --version
+ ...
+ Written by Danilo Šegan and Bruno Haible.
+
+ $ LC_ALL=C recode-sr-latin --version
+ ...
+ Written by Danilo Segan and Bruno Haible.
+
+ The 'propername' module does exactly this. Plus, for languages that use
+ a different writing system than the Latin alphabet, it allows a translator
+ to write the name using that different writing system. In that case the
+ output will look like this:
+ <translated name> (<original name in English>)
+
+ To use the 'propername' module is done in three simple steps:
+
+ 1) Add it to the list of gnulib modules to import,
+
+ 2) Change the arguments of version_etc, from
+
+ from "Paul Eggert"
+ to proper_name ("Paul Eggert")
+
+ from "Torbjorn Granlund"
+ to proper_name_utf8 ("Torbjorn Granlund", "Torbj\303\266rn Granlund")
+
+ from "F. Pinard"
+ to proper_name_utf8 ("Franc,ois Pinard", "Fran\303\247ois Pinard")
+
+ (Optionally, here you can also add / * TRANSLATORS: ... * / comments
+ explaining how the name is written or pronounced.)
+
+ 3) If you are using GNU gettext version 0.16.1 or older, in po/Makevars,
+ in the definition of the XGETTEXT_OPTIONS variable, add:
+
+ --keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."'
+ --keyword='proper_name_utf8:1,"This is a proper name. See the gettext manual, section Names."'
+
+ This specifies automatic comments for the translator. (Requires
+ xgettext >= 0.15. The double-quotes inside the quoted string are on
+ purpose: they are part of the --keyword argument syntax.)
+ */
+
+#ifndef _PROPERNAME_H
+#define _PROPERNAME_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the localization of NAME. NAME is written in ASCII. */
+extern const char * proper_name (const char *name);
+
+/* Return the localization of a name whose original writing is not ASCII.
+ NAME_UTF8 is the real name, written in UTF-8 with octal or hexadecimal
+ escape sequences. NAME_ASCII is a fallback written only with ASCII
+ characters. */
+extern const char * proper_name_utf8 (const char *name_ascii,
+ const char *name_utf8);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _PROPERNAME_H */
diff --git a/gnulib/lib/pthread.in.h b/gnulib/lib/pthread.in.h
new file mode 100644
index 00000000..89fbc037
--- /dev/null
+++ b/gnulib/lib/pthread.in.h
@@ -0,0 +1,46 @@
+/* Implement a trivial subset of the pthreads library.
+
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Glen Lenker. */
+
+#ifndef PTHREAD_H_
+# define PTHREAD_H_
+
+# include <errno.h>
+# include <stdlib.h>
+
+typedef int pthread_t;
+typedef int pthread_attr_t;
+
+static int
+pthread_create (pthread_t *restrict thread,
+ const pthread_attr_t *restrict attr,
+ void *(*start_routine)(void*), void *restrict arg)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+static int
+pthread_join (pthread_t thread, void **value_ptr)
+{
+ abort ();
+ return -1;
+}
+
+#endif /* PTHREAD_H_ */
diff --git a/gnulib/lib/putenv.c b/gnulib/lib/putenv.c
new file mode 100644
index 00000000..030f5675
--- /dev/null
+++ b/gnulib/lib/putenv.c
@@ -0,0 +1,132 @@
+/* Copyright (C) 1991, 1994, 1997-1998, 2000, 2003-2010 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ 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 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <stddef.h>
+
+/* Include errno.h *after* sys/types.h to work around header problems
+ on AIX 3.2.5. */
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#include <unistd.h>
+
+#if HAVE_GNU_LD
+# define environ __environ
+#else
+extern char **environ;
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of `environ'. */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+static int
+_unsetenv (const char *name)
+{
+ size_t len;
+ char **ep;
+
+ if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ len = strlen (name);
+
+ LOCK;
+
+ ep = environ;
+ while (*ep != NULL)
+ if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
+ {
+ /* Found it. Remove this pointer by moving later ones back. */
+ char **dp = ep;
+
+ do
+ dp[0] = dp[1];
+ while (*dp++);
+ /* Continue the loop in case NAME appears again. */
+ }
+ else
+ ++ep;
+
+ UNLOCK;
+
+ return 0;
+}
+
+
+/* Put STRING, which is of the form "NAME=VALUE", in the environment.
+ If STRING contains no `=', then remove STRING from the environment. */
+int
+putenv (char *string)
+{
+ const char *const name_end = strchr (string, '=');
+ register size_t size;
+ register char **ep;
+
+ if (name_end == NULL)
+ {
+ /* Remove the variable from the environment. */
+ return _unsetenv (string);
+ }
+
+ size = 0;
+ for (ep = environ; *ep != NULL; ++ep)
+ if (!strncmp (*ep, string, name_end - string) &&
+ (*ep)[name_end - string] == '=')
+ break;
+ else
+ ++size;
+
+ if (*ep == NULL)
+ {
+ static char **last_environ = NULL;
+ char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
+ if (new_environ == NULL)
+ return -1;
+ (void) memcpy ((void *) new_environ, (void *) environ,
+ size * sizeof (char *));
+ new_environ[size] = (char *) string;
+ new_environ[size + 1] = NULL;
+ free (last_environ);
+ last_environ = new_environ;
+ environ = new_environ;
+ }
+ else
+ *ep = string;
+
+ return 0;
+}
diff --git a/gnulib/lib/quote.c b/gnulib/lib/quote.c
new file mode 100644
index 00000000..1f64f44c
--- /dev/null
+++ b/gnulib/lib/quote.c
@@ -0,0 +1,40 @@
+/* quote.c - quote arguments for output
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2003, 2005, 2006, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#include <config.h>
+
+#include "quotearg.h"
+#include "quote.h"
+
+/* Return an unambiguous printable representation of NAME,
+ allocated in slot N, suitable for diagnostics. */
+char const *
+quote_n (int n, char const *name)
+{
+ return quotearg_n_style (n, locale_quoting_style, name);
+}
+
+/* Return an unambiguous printable representation of NAME,
+ suitable for diagnostics. */
+char const *
+quote (char const *name)
+{
+ return quote_n (0, name);
+}
diff --git a/gnulib/lib/quote.h b/gnulib/lib/quote.h
new file mode 100644
index 00000000..a986956a
--- /dev/null
+++ b/gnulib/lib/quote.h
@@ -0,0 +1,21 @@
+/* quote.h - prototypes for quote.c
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2003, 2009, 2010 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/>. */
+
+
+char const *quote_n (int n, char const *name);
+char const *quote (char const *name);
diff --git a/gnulib/lib/quotearg.c b/gnulib/lib/quotearg.c
new file mode 100644
index 00000000..5418f512
--- /dev/null
+++ b/gnulib/lib/quotearg.c
@@ -0,0 +1,889 @@
+/* quotearg.c - quote arguments for output
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008,
+ 2009, 2010 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/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#include <config.h>
+
+#include "quotearg.h"
+
+#include "xalloc.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#define INT_BITS (sizeof (int) * CHAR_BIT)
+
+struct quoting_options
+{
+ /* Basic quoting style. */
+ enum quoting_style style;
+
+ /* Additional flags. Bitwise combination of enum quoting_flags. */
+ int flags;
+
+ /* Quote the characters indicated by this bit vector even if the
+ quoting style would not normally require them to be quoted. */
+ unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
+
+ /* The left quote for custom_quoting_style. */
+ char const *left_quote;
+
+ /* The right quote for custom_quoting_style. */
+ char const *right_quote;
+};
+
+/* Names of quoting styles. */
+char const *const quoting_style_args[] =
+{
+ "literal",
+ "shell",
+ "shell-always",
+ "c",
+ "c-maybe",
+ "escape",
+ "locale",
+ "clocale",
+ 0
+};
+
+/* Correspondences to quoting style names. */
+enum quoting_style const quoting_style_vals[] =
+{
+ literal_quoting_style,
+ shell_quoting_style,
+ shell_always_quoting_style,
+ c_quoting_style,
+ c_maybe_quoting_style,
+ escape_quoting_style,
+ locale_quoting_style,
+ clocale_quoting_style
+};
+
+/* The default quoting options. */
+static struct quoting_options default_quoting_options;
+
+/* Allocate a new set of quoting options, with contents initially identical
+ to O if O is not null, or to the default if O is null.
+ It is the caller's responsibility to free the result. */
+struct quoting_options *
+clone_quoting_options (struct quoting_options *o)
+{
+ int e = errno;
+ struct quoting_options *p = xmemdup (o ? o : &default_quoting_options,
+ sizeof *o);
+ errno = e;
+ return p;
+}
+
+/* Get the value of O's quoting style. If O is null, use the default. */
+enum quoting_style
+get_quoting_style (struct quoting_options *o)
+{
+ return (o ? o : &default_quoting_options)->style;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to S. */
+void
+set_quoting_style (struct quoting_options *o, enum quoting_style s)
+{
+ (o ? o : &default_quoting_options)->style = s;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options for character C to I.
+ Return the old value. Currently, the only values defined for I are
+ 0 (the default) and 1 (which means to quote the character even if
+ it would not otherwise be quoted). */
+int
+set_char_quoting (struct quoting_options *o, char c, int i)
+{
+ unsigned char uc = c;
+ unsigned int *p =
+ (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
+ int shift = uc % INT_BITS;
+ int r = (*p >> shift) & 1;
+ *p ^= ((i & 1) ^ r) << shift;
+ return r;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options flag to I, which can be a
+ bitwise combination of enum quoting_flags, or 0 for default
+ behavior. Return the old value. */
+int
+set_quoting_flags (struct quoting_options *o, int i)
+{
+ int r;
+ if (!o)
+ o = &default_quoting_options;
+ r = o->flags;
+ o->flags = i;
+ return r;
+}
+
+void
+set_custom_quoting (struct quoting_options *o,
+ char const *left_quote, char const *right_quote)
+{
+ if (!o)
+ o = &default_quoting_options;
+ o->style = custom_quoting_style;
+ if (!left_quote || !right_quote)
+ abort ();
+ o->left_quote = left_quote;
+ o->right_quote = right_quote;
+}
+
+/* Return quoting options for STYLE, with no extra quoting. */
+static struct quoting_options
+quoting_options_from_style (enum quoting_style style)
+{
+ struct quoting_options o;
+ o.style = style;
+ o.flags = 0;
+ memset (o.quote_these_too, 0, sizeof o.quote_these_too);
+ return o;
+}
+
+/* MSGID approximates a quotation mark. Return its translation if it
+ has one; otherwise, return either it or "\"", depending on S. */
+static char const *
+gettext_quote (char const *msgid, enum quoting_style s)
+{
+ char const *translation = _(msgid);
+ if (translation == msgid && s == clocale_quoting_style)
+ translation = "\"";
+ return translation;
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using QUOTING_STYLE, FLAGS, and
+ QUOTE_THESE_TOO to control quoting.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE.
+
+ This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
+ ARGSIZE, O), except it breaks O into its component pieces and is
+ not careful about errno. */
+
+static size_t
+quotearg_buffer_restyled (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ enum quoting_style quoting_style, int flags,
+ unsigned int const *quote_these_too,
+ char const *left_quote,
+ char const *right_quote)
+{
+ size_t i;
+ size_t len = 0;
+ char const *quote_string = 0;
+ size_t quote_string_len = 0;
+ bool backslash_escapes = false;
+ bool unibyte_locale = MB_CUR_MAX == 1;
+ bool elide_outer_quotes = (flags & QA_ELIDE_OUTER_QUOTES) != 0;
+
+#define STORE(c) \
+ do \
+ { \
+ if (len < buffersize) \
+ buffer[len] = (c); \
+ len++; \
+ } \
+ while (0)
+
+ switch (quoting_style)
+ {
+ case c_maybe_quoting_style:
+ quoting_style = c_quoting_style;
+ elide_outer_quotes = true;
+ /* Fall through. */
+ case c_quoting_style:
+ if (!elide_outer_quotes)
+ STORE ('"');
+ backslash_escapes = true;
+ quote_string = "\"";
+ quote_string_len = 1;
+ break;
+
+ case escape_quoting_style:
+ backslash_escapes = true;
+ elide_outer_quotes = false;
+ break;
+
+ case locale_quoting_style:
+ case clocale_quoting_style:
+ case custom_quoting_style:
+ {
+ if (quoting_style != custom_quoting_style)
+ {
+ /* TRANSLATORS:
+ Get translations for open and closing quotation marks.
+
+ The message catalog should translate "`" to a left
+ quotation mark suitable for the locale, and similarly for
+ "'". If the catalog has no translation,
+ locale_quoting_style quotes `like this', and
+ clocale_quoting_style quotes "like this".
+
+ For example, an American English Unicode locale should
+ translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+ should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+ MARK). A British English Unicode locale should instead
+ translate these to U+2018 (LEFT SINGLE QUOTATION MARK)
+ and U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+
+ If you don't know what to put here, please see
+ <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+ and use glyphs suitable for your language. */
+ left_quote = gettext_quote (N_("`"), quoting_style);
+ right_quote = gettext_quote (N_("'"), quoting_style);
+ }
+ if (!elide_outer_quotes)
+ for (quote_string = left_quote; *quote_string; quote_string++)
+ STORE (*quote_string);
+ backslash_escapes = true;
+ quote_string = right_quote;
+ quote_string_len = strlen (quote_string);
+ }
+ break;
+
+ case shell_quoting_style:
+ quoting_style = shell_always_quoting_style;
+ elide_outer_quotes = true;
+ /* Fall through. */
+ case shell_always_quoting_style:
+ if (!elide_outer_quotes)
+ STORE ('\'');
+ quote_string = "'";
+ quote_string_len = 1;
+ break;
+
+ case literal_quoting_style:
+ elide_outer_quotes = false;
+ break;
+
+ default:
+ abort ();
+ }
+
+ for (i = 0; ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize); i++)
+ {
+ unsigned char c;
+ unsigned char esc;
+ bool is_right_quote = false;
+
+ if (backslash_escapes
+ && quote_string_len
+ && i + quote_string_len <= argsize
+ && memcmp (arg + i, quote_string, quote_string_len) == 0)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ is_right_quote = true;
+ }
+
+ c = arg[i];
+ switch (c)
+ {
+ case '\0':
+ if (backslash_escapes)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ STORE ('\\');
+ /* If quote_string were to begin with digits, we'd need to
+ test for the end of the arg as well. However, it's
+ hard to imagine any locale that would use digits in
+ quotes, and set_custom_quoting is documented not to
+ accept them. */
+ if (i + 1 < argsize && '0' <= arg[i + 1] && arg[i + 1] <= '9')
+ {
+ STORE ('0');
+ STORE ('0');
+ }
+ c = '0';
+ /* We don't have to worry that this last '0' will be
+ backslash-escaped because, again, quote_string should
+ not start with it and because quote_these_too is
+ documented as not accepting it. */
+ }
+ else if (flags & QA_ELIDE_NULL_BYTES)
+ continue;
+ break;
+
+ case '?':
+ switch (quoting_style)
+ {
+ case shell_always_quoting_style:
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ break;
+
+ case c_quoting_style:
+ if ((flags & QA_SPLIT_TRIGRAPHS)
+ && i + 2 < argsize && arg[i + 1] == '?')
+ switch (arg[i + 2])
+ {
+ case '!': case '\'':
+ case '(': case ')': case '-': case '/':
+ case '<': case '=': case '>':
+ /* Escape the second '?' in what would otherwise be
+ a trigraph. */
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ c = arg[i + 2];
+ i += 2;
+ STORE ('?');
+ STORE ('"');
+ STORE ('"');
+ STORE ('?');
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case '\a': esc = 'a'; goto c_escape;
+ case '\b': esc = 'b'; goto c_escape;
+ case '\f': esc = 'f'; goto c_escape;
+ case '\n': esc = 'n'; goto c_and_shell_escape;
+ case '\r': esc = 'r'; goto c_and_shell_escape;
+ case '\t': esc = 't'; goto c_and_shell_escape;
+ case '\v': esc = 'v'; goto c_escape;
+ case '\\': esc = c;
+ /* No need to escape the escape if we are trying to elide
+ outer quotes and nothing else is problematic. */
+ if (backslash_escapes && elide_outer_quotes && quote_string_len)
+ goto store_c;
+
+ c_and_shell_escape:
+ if (quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+ /* Fall through. */
+ c_escape:
+ if (backslash_escapes)
+ {
+ c = esc;
+ goto store_escape;
+ }
+ break;
+
+ case '{': case '}': /* sometimes special if isolated */
+ if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1))
+ break;
+ /* Fall through. */
+ case '#': case '~':
+ if (i != 0)
+ break;
+ /* Fall through. */
+ case ' ':
+ case '!': /* special in bash */
+ case '"': case '$': case '&':
+ case '(': case ')': case '*': case ';':
+ case '<':
+ case '=': /* sometimes special in 0th or (with "set -k") later args */
+ case '>': case '[':
+ case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
+ case '`': case '|':
+ /* A shell special character. In theory, '$' and '`' could
+ be the first bytes of multibyte characters, which means
+ we should check them with mbrtowc, but in practice this
+ doesn't happen so it's not worth worrying about. */
+ if (quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+ break;
+
+ case '\'':
+ if (quoting_style == shell_always_quoting_style)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ STORE ('\'');
+ STORE ('\\');
+ STORE ('\'');
+ }
+ break;
+
+ case '%': case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9': case ':':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
+ case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
+ case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
+ case 'o': case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
+ /* These characters don't cause problems, no matter what the
+ quoting style is. They cannot start multibyte sequences.
+ A digit or a special letter would cause trouble if it
+ appeared at the beginning of quote_string because we'd then
+ escape by prepending a backslash. However, it's hard to
+ imagine any locale that would use digits or letters as
+ quotes, and set_custom_quoting is documented not to accept
+ them. Also, a digit or a special letter would cause
+ trouble if it appeared in quote_these_too, but that's also
+ documented as not accepting them. */
+ break;
+
+ default:
+ /* If we have a multibyte sequence, copy it until we reach
+ its end, find an error, or come back to the initial shift
+ state. For C-like styles, if the sequence has
+ unprintable characters, escape the whole sequence, since
+ we can't easily escape single characters within it. */
+ {
+ /* Length of multibyte sequence found so far. */
+ size_t m;
+
+ bool printable;
+
+ if (unibyte_locale)
+ {
+ m = 1;
+ printable = isprint (c) != 0;
+ }
+ else
+ {
+ mbstate_t mbstate;
+ memset (&mbstate, 0, sizeof mbstate);
+
+ m = 0;
+ printable = true;
+ if (argsize == SIZE_MAX)
+ argsize = strlen (arg);
+
+ do
+ {
+ wchar_t w;
+ size_t bytes = mbrtowc (&w, &arg[i + m],
+ argsize - (i + m), &mbstate);
+ if (bytes == 0)
+ break;
+ else if (bytes == (size_t) -1)
+ {
+ printable = false;
+ break;
+ }
+ else if (bytes == (size_t) -2)
+ {
+ printable = false;
+ while (i + m < argsize && arg[i + m])
+ m++;
+ break;
+ }
+ else
+ {
+ /* Work around a bug with older shells that "see" a '\'
+ that is really the 2nd byte of a multibyte character.
+ In practice the problem is limited to ASCII
+ chars >= '@' that are shell special chars. */
+ if ('[' == 0x5b && elide_outer_quotes
+ && quoting_style == shell_always_quoting_style)
+ {
+ size_t j;
+ for (j = 1; j < bytes; j++)
+ switch (arg[i + m + j])
+ {
+ case '[': case '\\': case '^':
+ case '`': case '|':
+ goto force_outer_quoting_style;
+
+ default:
+ break;
+ }
+ }
+
+ if (! iswprint (w))
+ printable = false;
+ m += bytes;
+ }
+ }
+ while (! mbsinit (&mbstate));
+ }
+
+ if (1 < m || (backslash_escapes && ! printable))
+ {
+ /* Output a multibyte sequence, or an escaped
+ unprintable unibyte character. */
+ size_t ilim = i + m;
+
+ for (;;)
+ {
+ if (backslash_escapes && ! printable)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ STORE ('\\');
+ STORE ('0' + (c >> 6));
+ STORE ('0' + ((c >> 3) & 7));
+ c = '0' + (c & 7);
+ }
+ else if (is_right_quote)
+ {
+ STORE ('\\');
+ is_right_quote = false;
+ }
+ if (ilim <= i + 1)
+ break;
+ STORE (c);
+ c = arg[++i];
+ }
+
+ goto store_c;
+ }
+ }
+ }
+
+ if (! ((backslash_escapes || elide_outer_quotes)
+ && quote_these_too
+ && quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
+ && !is_right_quote)
+ goto store_c;
+
+ store_escape:
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ STORE ('\\');
+
+ store_c:
+ STORE (c);
+ }
+
+ if (len == 0 && quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+
+ if (quote_string && !elide_outer_quotes)
+ for (; *quote_string; quote_string++)
+ STORE (*quote_string);
+
+ if (len < buffersize)
+ buffer[len] = '\0';
+ return len;
+
+ force_outer_quoting_style:
+ /* Don't reuse quote_these_too, since the addition of outer quotes
+ sufficiently quotes the specified characters. */
+ return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+ quoting_style,
+ flags & ~QA_ELIDE_OUTER_QUOTES, NULL,
+ left_quote, right_quote);
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using O to control quoting.
+ If O is null, use the default.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is SIZE_MAX, use the string length of the argument for
+ ARGSIZE. */
+size_t
+quotearg_buffer (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ struct quoting_options const *o)
+{
+ struct quoting_options const *p = o ? o : &default_quoting_options;
+ int e = errno;
+ size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+ p->style, p->flags, p->quote_these_too,
+ p->left_quote, p->right_quote);
+ errno = e;
+ return r;
+}
+
+/* Equivalent to quotearg_alloc (ARG, ARGSIZE, NULL, O). */
+char *
+quotearg_alloc (char const *arg, size_t argsize,
+ struct quoting_options const *o)
+{
+ return quotearg_alloc_mem (arg, argsize, NULL, o);
+}
+
+/* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
+ allocated storage containing the quoted string, and store the
+ resulting size into *SIZE, if non-NULL. The result can contain
+ embedded null bytes only if ARGSIZE is not SIZE_MAX, SIZE is not
+ NULL, and set_quoting_flags has not set the null byte elision
+ flag. */
+char *
+quotearg_alloc_mem (char const *arg, size_t argsize, size_t *size,
+ struct quoting_options const *o)
+{
+ struct quoting_options const *p = o ? o : &default_quoting_options;
+ int e = errno;
+ /* Elide embedded null bytes if we can't return a size. */
+ int flags = p->flags | (size ? 0 : QA_ELIDE_NULL_BYTES);
+ size_t bufsize = quotearg_buffer_restyled (0, 0, arg, argsize, p->style,
+ flags, p->quote_these_too,
+ p->left_quote,
+ p->right_quote) + 1;
+ char *buf = xcharalloc (bufsize);
+ quotearg_buffer_restyled (buf, bufsize, arg, argsize, p->style, flags,
+ p->quote_these_too,
+ p->left_quote, p->right_quote);
+ errno = e;
+ if (size)
+ *size = bufsize - 1;
+ return buf;
+}
+
+/* A storage slot with size and pointer to a value. */
+struct slotvec
+{
+ size_t size;
+ char *val;
+};
+
+/* Preallocate a slot 0 buffer, so that the caller can always quote
+ one small component of a "memory exhausted" message in slot 0. */
+static char slot0[256];
+static unsigned int nslots = 1;
+static struct slotvec slotvec0 = {sizeof slot0, slot0};
+static struct slotvec *slotvec = &slotvec0;
+
+void
+quotearg_free (void)
+{
+ struct slotvec *sv = slotvec;
+ unsigned int i;
+ for (i = 1; i < nslots; i++)
+ free (sv[i].val);
+ if (sv[0].val != slot0)
+ {
+ free (sv[0].val);
+ slotvec0.size = sizeof slot0;
+ slotvec0.val = slot0;
+ }
+ if (sv != &slotvec0)
+ {
+ free (sv);
+ slotvec = &slotvec0;
+ }
+ nslots = 1;
+}
+
+/* Use storage slot N to return a quoted version of argument ARG.
+ ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
+ null-terminated string.
+ OPTIONS specifies the quoting options.
+ The returned value points to static storage that can be
+ reused by the next call to this function with the same value of N.
+ N must be nonnegative. N is deliberately declared with type "int"
+ to allow for future extensions (using negative values). */
+static char *
+quotearg_n_options (int n, char const *arg, size_t argsize,
+ struct quoting_options const *options)
+{
+ int e = errno;
+
+ unsigned int n0 = n;
+ struct slotvec *sv = slotvec;
+
+ if (n < 0)
+ abort ();
+
+ if (nslots <= n0)
+ {
+ /* FIXME: technically, the type of n1 should be `unsigned int',
+ but that evokes an unsuppressible warning from gcc-4.0.1 and
+ older. If gcc ever provides an option to suppress that warning,
+ revert to the original type, so that the test in xalloc_oversized
+ is once again performed only at compile time. */
+ size_t n1 = n0 + 1;
+ bool preallocated = (sv == &slotvec0);
+
+ if (xalloc_oversized (n1, sizeof *sv))
+ xalloc_die ();
+
+ slotvec = sv = xrealloc (preallocated ? NULL : sv, n1 * sizeof *sv);
+ if (preallocated)
+ *sv = slotvec0;
+ memset (sv + nslots, 0, (n1 - nslots) * sizeof *sv);
+ nslots = n1;
+ }
+
+ {
+ size_t size = sv[n].size;
+ char *val = sv[n].val;
+ /* Elide embedded null bytes since we don't return a size. */
+ int flags = options->flags | QA_ELIDE_NULL_BYTES;
+ size_t qsize = quotearg_buffer_restyled (val, size, arg, argsize,
+ options->style, flags,
+ options->quote_these_too,
+ options->left_quote,
+ options->right_quote);
+
+ if (size <= qsize)
+ {
+ sv[n].size = size = qsize + 1;
+ if (val != slot0)
+ free (val);
+ sv[n].val = val = xcharalloc (size);
+ quotearg_buffer_restyled (val, size, arg, argsize, options->style,
+ flags, options->quote_these_too,
+ options->left_quote,
+ options->right_quote);
+ }
+
+ errno = e;
+ return val;
+ }
+}
+
+char *
+quotearg_n (int n, char const *arg)
+{
+ return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options);
+}
+
+char *
+quotearg_n_mem (int n, char const *arg, size_t argsize)
+{
+ return quotearg_n_options (n, arg, argsize, &default_quoting_options);
+}
+
+char *
+quotearg (char const *arg)
+{
+ return quotearg_n (0, arg);
+}
+
+char *
+quotearg_mem (char const *arg, size_t argsize)
+{
+ return quotearg_n_mem (0, arg, argsize);
+}
+
+char *
+quotearg_n_style (int n, enum quoting_style s, char const *arg)
+{
+ struct quoting_options const o = quoting_options_from_style (s);
+ return quotearg_n_options (n, arg, SIZE_MAX, &o);
+}
+
+char *
+quotearg_n_style_mem (int n, enum quoting_style s,
+ char const *arg, size_t argsize)
+{
+ struct quoting_options const o = quoting_options_from_style (s);
+ return quotearg_n_options (n, arg, argsize, &o);
+}
+
+char *
+quotearg_style (enum quoting_style s, char const *arg)
+{
+ return quotearg_n_style (0, s, arg);
+}
+
+char *
+quotearg_style_mem (enum quoting_style s, char const *arg, size_t argsize)
+{
+ return quotearg_n_style_mem (0, s, arg, argsize);
+}
+
+char *
+quotearg_char_mem (char const *arg, size_t argsize, char ch)
+{
+ struct quoting_options options;
+ options = default_quoting_options;
+ set_char_quoting (&options, ch, 1);
+ return quotearg_n_options (0, arg, argsize, &options);
+}
+
+char *
+quotearg_char (char const *arg, char ch)
+{
+ return quotearg_char_mem (arg, SIZE_MAX, ch);
+}
+
+char *
+quotearg_colon (char const *arg)
+{
+ return quotearg_char (arg, ':');
+}
+
+char *
+quotearg_colon_mem (char const *arg, size_t argsize)
+{
+ return quotearg_char_mem (arg, argsize, ':');
+}
+
+char *
+quotearg_n_custom (int n, char const *left_quote,
+ char const *right_quote, char const *arg)
+{
+ return quotearg_n_custom_mem (n, left_quote, right_quote, arg,
+ SIZE_MAX);
+}
+
+char *
+quotearg_n_custom_mem (int n, char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize)
+{
+ struct quoting_options o = default_quoting_options;
+ set_custom_quoting (&o, left_quote, right_quote);
+ return quotearg_n_options (n, arg, argsize, &o);
+}
+
+char *
+quotearg_custom (char const *left_quote, char const *right_quote,
+ char const *arg)
+{
+ return quotearg_n_custom (0, left_quote, right_quote, arg);
+}
+
+char *
+quotearg_custom_mem (char const *left_quote, char const *right_quote,
+ char const *arg, size_t argsize)
+{
+ return quotearg_n_custom_mem (0, left_quote, right_quote, arg,
+ argsize);
+}
diff --git a/gnulib/lib/quotearg.h b/gnulib/lib/quotearg.h
new file mode 100644
index 00000000..084cd1b2
--- /dev/null
+++ b/gnulib/lib/quotearg.h
@@ -0,0 +1,389 @@
+/* quotearg.h - quote arguments for output
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006, 2008, 2009, 2010
+ 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/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#ifndef QUOTEARG_H_
+# define QUOTEARG_H_ 1
+
+# include <stddef.h>
+
+/* Basic quoting styles. For each style, an example is given on the
+ input strings "simple", "\0 \t\n'\"\033?""?/\\", and "a:b", using
+ quotearg_buffer, quotearg_mem, and quotearg_colon_mem with that
+ style and the default flags and quoted characters. Note that the
+ examples are shown here as valid C strings rather than what
+ displays on a terminal (with "??/" as a trigraph for "\\"). */
+enum quoting_style
+ {
+ /* Output names as-is (ls --quoting-style=literal). Can result in
+ embedded null bytes if QA_ELIDE_NULL_BYTES is not in
+ effect.
+
+ quotearg_buffer:
+ "simple", "\0 \t\n'\"\033??/\\", "a:b"
+ quotearg:
+ "simple", " \t\n'\"\033??/\\", "a:b"
+ quotearg_colon:
+ "simple", " \t\n'\"\033??/\\", "a:b"
+ */
+ literal_quoting_style,
+
+ /* Quote names for the shell if they contain shell metacharacters
+ or would cause ambiguous output (ls --quoting-style=shell).
+ Can result in embedded null bytes if QA_ELIDE_NULL_BYTES is not
+ in effect.
+
+ quotearg_buffer:
+ "simple", "'\0 \t\n'\\''\"\033??/\\'", "a:b"
+ quotearg:
+ "simple", "' \t\n'\\''\"\033??/\\'", "a:b"
+ quotearg_colon:
+ "simple", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ */
+ shell_quoting_style,
+
+ /* Quote names for the shell, even if they would normally not
+ require quoting (ls --quoting-style=shell-always). Can result
+ in embedded null bytes if QA_ELIDE_NULL_BYTES is not in effect.
+ Behaves like shell_quoting_style if QA_ELIDE_OUTER_QUOTES is in
+ effect.
+
+ quotearg_buffer:
+ "'simple'", "'\0 \t\n'\\''\"\033??/\\'", "'a:b'"
+ quotearg:
+ "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ quotearg_colon:
+ "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ */
+ shell_always_quoting_style,
+
+ /* Quote names as for a C language string (ls --quoting-style=c).
+ Behaves like c_maybe_quoting_style if QA_ELIDE_OUTER_QUOTES is
+ in effect. Split into consecutive strings if
+ QA_SPLIT_TRIGRAPHS.
+
+ quotearg_buffer:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg_colon:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\""
+ */
+ c_quoting_style,
+
+ /* Like c_quoting_style except omit the surrounding double-quote
+ characters if no quoted characters are encountered.
+
+ quotearg_buffer:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b"
+ quotearg:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b"
+ quotearg_colon:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ */
+ c_maybe_quoting_style,
+
+ /* Like c_quoting_style except always omit the surrounding
+ double-quote characters and ignore QA_SPLIT_TRIGRAPHS
+ (ls --quoting-style=escape).
+
+ quotearg_buffer:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
+ quotearg:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
+ quotearg_colon:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a\\:b"
+ */
+ escape_quoting_style,
+
+ /* Like clocale_quoting_style, but quote `like this' instead of
+ "like this" in the default C locale (ls --quoting-style=locale).
+
+ LC_MESSAGES=C
+ quotearg_buffer:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'"
+ quotearg:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'"
+ quotearg_colon:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a\\:b'"
+
+ LC_MESSAGES=pt_PT.utf8
+ quotearg_buffer:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg_colon:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
+ */
+ locale_quoting_style,
+
+ /* Like c_quoting_style except use quotation marks appropriate for
+ the locale and ignore QA_SPLIT_TRIGRAPHS
+ (ls --quoting-style=clocale).
+
+ LC_MESSAGES=C
+ quotearg_buffer:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg_colon:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\""
+
+ LC_MESSAGES=pt_PT.utf8
+ quotearg_buffer:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg_colon:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
+ */
+ clocale_quoting_style,
+
+ /* Like clocale_quoting_style except use the custom quotation marks
+ set by set_custom_quoting. If custom quotation marks are not
+ set, the behavior is undefined.
+
+ left_quote = right_quote = "'"
+ quotearg_buffer:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
+ quotearg:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
+ quotearg_colon:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a\\:b'"
+
+ left_quote = "(" and right_quote = ")"
+ quotearg_buffer:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
+ quotearg:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
+ quotearg_colon:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a\\:b)"
+
+ left_quote = ":" and right_quote = " "
+ quotearg_buffer:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
+ quotearg:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
+ quotearg_colon:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a\\:b "
+
+ left_quote = "\"'" and right_quote = "'\""
+ Notice that this is treated as a single level of quotes or two
+ levels where the outer quote need not be escaped within the inner
+ quotes. For two levels where the outer quote must be escaped
+ within the inner quotes, you must use separate quotearg
+ invocations.
+ quotearg_buffer:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
+ quotearg:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
+ quotearg_colon:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a\\:b'\""
+ */
+ custom_quoting_style
+ };
+
+/* Flags for use in set_quoting_flags. */
+enum quoting_flags
+ {
+ /* Always elide null bytes from styles that do not quote them,
+ even when the length of the result is available to the
+ caller. */
+ QA_ELIDE_NULL_BYTES = 0x01,
+
+ /* Omit the surrounding quote characters if no escaped characters
+ are encountered. Note that if no other character needs
+ escaping, then neither does the escape character. */
+ QA_ELIDE_OUTER_QUOTES = 0x02,
+
+ /* In the c_quoting_style and c_maybe_quoting_style, split ANSI
+ trigraph sequences into concatenated strings (for example,
+ "?""?/" rather than "??/", which could be confused with
+ "\\"). */
+ QA_SPLIT_TRIGRAPHS = 0x04
+ };
+
+/* For now, --quoting-style=literal is the default, but this may change. */
+# ifndef DEFAULT_QUOTING_STYLE
+# define DEFAULT_QUOTING_STYLE literal_quoting_style
+# endif
+
+/* Names of quoting styles and their corresponding values. */
+extern char const *const quoting_style_args[];
+extern enum quoting_style const quoting_style_vals[];
+
+struct quoting_options;
+
+/* The functions listed below set and use a hidden variable
+ that contains the default quoting style options. */
+
+/* Allocate a new set of quoting options, with contents initially identical
+ to O if O is not null, or to the default if O is null.
+ It is the caller's responsibility to free the result. */
+struct quoting_options *clone_quoting_options (struct quoting_options *o);
+
+/* Get the value of O's quoting style. If O is null, use the default. */
+enum quoting_style get_quoting_style (struct quoting_options *o);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to S. */
+void set_quoting_style (struct quoting_options *o, enum quoting_style s);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options for character C to I.
+ Return the old value. Currently, the only values defined for I are
+ 0 (the default) and 1 (which means to quote the character even if
+ it would not otherwise be quoted). C must never be a digit or a
+ letter that has special meaning after a backslash (for example, "\t"
+ for tab). */
+int set_char_quoting (struct quoting_options *o, char c, int i);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options flag to I, which can be a
+ bitwise combination of enum quoting_flags, or 0 for default
+ behavior. Return the old value. */
+int set_quoting_flags (struct quoting_options *o, int i);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to custom_quoting_style,
+ set the left quote to LEFT_QUOTE, and set the right quote to
+ RIGHT_QUOTE. Each of LEFT_QUOTE and RIGHT_QUOTE must be
+ null-terminated and can be the empty string. Because backslashes are
+ used for escaping, it does not make sense for RIGHT_QUOTE to contain
+ a backslash. RIGHT_QUOTE must not begin with a digit or a letter
+ that has special meaning after a backslash (for example, "\t" for
+ tab). */
+void set_custom_quoting (struct quoting_options *o,
+ char const *left_quote,
+ char const *right_quote);
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using O to control quoting.
+ If O is null, use the default.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is -1, use the string length of the argument for ARGSIZE.
+ On output, BUFFER might contain embedded null bytes if ARGSIZE was
+ not -1, the style of O does not use backslash escapes, and the
+ flags of O do not request elision of null bytes.*/
+size_t quotearg_buffer (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ struct quoting_options const *o);
+
+/* Like quotearg_buffer, except return the result in a newly allocated
+ buffer. It is the caller's responsibility to free the result. The
+ result will not contain embedded null bytes. */
+char *quotearg_alloc (char const *arg, size_t argsize,
+ struct quoting_options const *o);
+
+/* Like quotearg_alloc, except that the length of the result,
+ excluding the terminating null byte, is stored into SIZE if it is
+ non-NULL. The result might contain embedded null bytes if ARGSIZE
+ was not -1, SIZE was not NULL, the style of O does not use
+ backslash escapes, and the flags of O do not request elision of
+ null bytes.*/
+char *quotearg_alloc_mem (char const *arg, size_t argsize,
+ size_t *size, struct quoting_options const *o);
+
+/* Use storage slot N to return a quoted version of the string ARG.
+ Use the default quoting options.
+ The returned value points to static storage that can be
+ reused by the next call to this function with the same value of N.
+ N must be nonnegative. The output of all functions in the
+ quotearg_n family are guaranteed to not contain embedded null
+ bytes.*/
+char *quotearg_n (int n, char const *arg);
+
+/* Equivalent to quotearg_n (0, ARG). */
+char *quotearg (char const *arg);
+
+/* Use storage slot N to return a quoted version of the argument ARG
+ of size ARGSIZE. This is like quotearg_n (N, ARG), except it can
+ quote null bytes. */
+char *quotearg_n_mem (int n, char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_mem (0, ARG, ARGSIZE). */
+char *quotearg_mem (char const *arg, size_t argsize);
+
+/* Use style S and storage slot N to return a quoted version of the string ARG.
+ This is like quotearg_n (N, ARG), except that it uses S with no other
+ options to specify the quoting method. */
+char *quotearg_n_style (int n, enum quoting_style s, char const *arg);
+
+/* Use style S and storage slot N to return a quoted version of the
+ argument ARG of size ARGSIZE. This is like quotearg_n_style
+ (N, S, ARG), except it can quote null bytes. */
+char *quotearg_n_style_mem (int n, enum quoting_style s,
+ char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_style (0, S, ARG). */
+char *quotearg_style (enum quoting_style s, char const *arg);
+
+/* Equivalent to quotearg_n_style_mem (0, S, ARG, ARGSIZE). */
+char *quotearg_style_mem (enum quoting_style s,
+ char const *arg, size_t argsize);
+
+/* Like quotearg (ARG), except also quote any instances of CH.
+ See set_char_quoting for a description of acceptable CH values. */
+char *quotearg_char (char const *arg, char ch);
+
+/* Like quotearg_char (ARG, CH), except it can quote null bytes. */
+char *quotearg_char_mem (char const *arg, size_t argsize, char ch);
+
+/* Equivalent to quotearg_char (ARG, ':'). */
+char *quotearg_colon (char const *arg);
+
+/* Like quotearg_colon (ARG), except it can quote null bytes. */
+char *quotearg_colon_mem (char const *arg, size_t argsize);
+
+/* Like quotearg_n_style (N, S, ARG) but with S as custom_quoting_style
+ with left quote as LEFT_QUOTE and right quote as RIGHT_QUOTE. See
+ set_custom_quoting for a description of acceptable LEFT_QUOTE and
+ RIGHT_QUOTE values. */
+char *quotearg_n_custom (int n, char const *left_quote,
+ char const *right_quote, char const *arg);
+
+/* Like quotearg_n_custom (N, LEFT_QUOTE, RIGHT_QUOTE, ARG) except it
+ can quote null bytes. */
+char *quotearg_n_custom_mem (int n, char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_custom (0, LEFT_QUOTE, RIGHT_QUOTE, ARG). */
+char *quotearg_custom (char const *left_quote, char const *right_quote,
+ char const *arg);
+
+/* Equivalent to quotearg_n_custom_mem (0, LEFT_QUOTE, RIGHT_QUOTE, ARG,
+ ARGSIZE). */
+char *quotearg_custom_mem (char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize);
+
+/* Free any dynamically allocated memory. */
+void quotearg_free (void);
+
+#endif /* !QUOTEARG_H_ */
diff --git a/gnulib/lib/raise.c b/gnulib/lib/raise.c
new file mode 100644
index 00000000..1924fe86
--- /dev/null
+++ b/gnulib/lib/raise.c
@@ -0,0 +1,30 @@
+/* Provide a non-threads replacement for the POSIX raise function.
+
+ Copyright (C) 2002-2003, 2005-2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <signal.h>
+#include <unistd.h>
+
+int
+raise (int sig)
+{
+ return kill (getpid (), sig);
+}
diff --git a/gnulib/lib/random_r.c b/gnulib/lib/random_r.c
new file mode 100644
index 00000000..9e28daee
--- /dev/null
+++ b/gnulib/lib/random_r.c
@@ -0,0 +1,423 @@
+/*
+ Copyright (C) 1995, 2005, 2008-2010 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/>. */
+
+/*
+ Copyright (C) 1983 Regents of the University of California.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 4. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.*/
+
+/*
+ * This is derived from the Berkeley source:
+ * @(#)random.c 5.5 (Berkeley) 7/6/88
+ * It was reworked for the GNU C Library by Roland McGrath.
+ * Rewritten to be reentrant by Ulrich Drepper, 1995
+ */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the buf == NULL, arg_state == NULL, result == NULL tests
+ below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <errno.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+
+/* An improved random number generation package. In addition to the standard
+ rand()/srand() like interface, this package also has a special state info
+ interface. The initstate() routine is called with a seed, an array of
+ bytes, and a count of how many bytes are being passed in; this array is
+ then initialized to contain information for random number generation with
+ that much state information. Good sizes for the amount of state
+ information are 32, 64, 128, and 256 bytes. The state can be switched by
+ calling the setstate() function with the same array as was initialized
+ with initstate(). By default, the package runs with 128 bytes of state
+ information and generates far better random numbers than a linear
+ congruential generator. If the amount of state information is less than
+ 32 bytes, a simple linear congruential R.N.G. is used. Internally, the
+ state information is treated as an array of longs; the zeroth element of
+ the array is the type of R.N.G. being used (small integer); the remainder
+ of the array is the state information for the R.N.G. Thus, 32 bytes of
+ state information will give 7 longs worth of state information, which will
+ allow a degree seven polynomial. (Note: The zeroth word of state
+ information also has some other information stored in it; see setstate
+ for details). The random number generation technique is a linear feedback
+ shift register approach, employing trinomials (since there are fewer terms
+ to sum up that way). In this approach, the least significant bit of all
+ the numbers in the state table will act as a linear feedback shift register,
+ and will have period 2^deg - 1 (where deg is the degree of the polynomial
+ being used, assuming that the polynomial is irreducible and primitive).
+ The higher order bits will have longer periods, since their values are
+ also influenced by pseudo-random carries out of the lower bits. The
+ total period of the generator is approximately deg*(2**deg - 1); thus
+ doubling the amount of state information has a vast influence on the
+ period of the generator. Note: The deg*(2**deg - 1) is an approximation
+ only good for large deg, when the period of the shift register is the
+ dominant factor. With deg equal to seven, the period is actually much
+ longer than the 7*(2**7 - 1) predicted by this formula. */
+
+
+
+/* For each of the currently supported random number generators, we have a
+ break value on the amount of state information (you need at least this many
+ bytes of state info to support this random number generator), a degree for
+ the polynomial (actually a trinomial) that the R.N.G. is based on, and
+ separation between the two lower order coefficients of the trinomial. */
+
+/* Linear congruential. */
+#define TYPE_0 0
+#define BREAK_0 8
+#define DEG_0 0
+#define SEP_0 0
+
+/* x**7 + x**3 + 1. */
+#define TYPE_1 1
+#define BREAK_1 32
+#define DEG_1 7
+#define SEP_1 3
+
+/* x**15 + x + 1. */
+#define TYPE_2 2
+#define BREAK_2 64
+#define DEG_2 15
+#define SEP_2 1
+
+/* x**31 + x**3 + 1. */
+#define TYPE_3 3
+#define BREAK_3 128
+#define DEG_3 31
+#define SEP_3 3
+
+/* x**63 + x + 1. */
+#define TYPE_4 4
+#define BREAK_4 256
+#define DEG_4 63
+#define SEP_4 1
+
+
+/* Array versions of the above information to make code run faster.
+ Relies on fact that TYPE_i == i. */
+
+#define MAX_TYPES 5 /* Max number of types above. */
+
+struct random_poly_info
+{
+ int seps[MAX_TYPES];
+ int degrees[MAX_TYPES];
+};
+
+static const struct random_poly_info random_poly_info =
+{
+ { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 },
+ { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }
+};
+
+#ifndef _LIBC
+# define weak_alias(local, symbol)
+# define __set_errno(e) errno = (e)
+# define __srandom_r srandom_r
+# define __initstate_r initstate_r
+# define __setstate_r setstate_r
+# define __random_r random_r
+#endif
+
+
+
+/* Initialize the random number generator based on the given seed. If the
+ type is the trivial no-state-information type, just remember the seed.
+ Otherwise, initializes state[] based on the given "seed" via a linear
+ congruential generator. Then, the pointers are set to known locations
+ that are exactly rand_sep places apart. Lastly, it cycles the state
+ information a given number of times to get rid of any initial dependencies
+ introduced by the L.C.R.N.G. Note that the initialization of randtbl[]
+ for default usage relies on values produced by this routine. */
+int
+__srandom_r (unsigned int seed, struct random_data *buf)
+{
+ int type;
+ int32_t *state;
+ long int i;
+ long int word;
+ int32_t *dst;
+ int kc;
+
+ if (buf == NULL)
+ goto fail;
+ type = buf->rand_type;
+ if ((unsigned int) type >= MAX_TYPES)
+ goto fail;
+
+ state = buf->state;
+ /* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */
+ if (seed == 0)
+ seed = 1;
+ state[0] = seed;
+ if (type == TYPE_0)
+ goto done;
+
+ dst = state;
+ word = seed;
+ kc = buf->rand_deg;
+ for (i = 1; i < kc; ++i)
+ {
+ /* This does:
+ state[i] = (16807 * state[i - 1]) % 2147483647;
+ but avoids overflowing 31 bits. */
+ long int hi = word / 127773;
+ long int lo = word % 127773;
+ word = 16807 * lo - 2836 * hi;
+ if (word < 0)
+ word += 2147483647;
+ *++dst = word;
+ }
+
+ buf->fptr = &state[buf->rand_sep];
+ buf->rptr = &state[0];
+ kc *= 10;
+ while (--kc >= 0)
+ {
+ int32_t discard;
+ (void) __random_r (buf, &discard);
+ }
+
+ done:
+ return 0;
+
+ fail:
+ return -1;
+}
+
+weak_alias (__srandom_r, srandom_r)
+
+/* Initialize the state information in the given array of N bytes for
+ future random number generation. Based on the number of bytes we
+ are given, and the break values for the different R.N.G.'s, we choose
+ the best (largest) one we can and set things up for it. srandom is
+ then called to initialize the state information. Note that on return
+ from srandom, we set state[-1] to be the type multiplexed with the current
+ value of the rear pointer; this is so successive calls to initstate won't
+ lose this information and will be able to restart with setstate.
+ Note: The first thing we do is save the current state, if any, just like
+ setstate so that it doesn't matter when initstate is called.
+ Returns a pointer to the old state. */
+int
+__initstate_r (unsigned int seed, char *arg_state, size_t n,
+ struct random_data *buf)
+{
+ int32_t *old_state;
+ int32_t *state;
+ int type;
+ int degree;
+ int separation;
+
+ if (buf == NULL)
+ goto fail;
+
+ old_state = buf->state;
+ if (old_state != NULL)
+ {
+ int old_type = buf->rand_type;
+ if (old_type == TYPE_0)
+ old_state[-1] = TYPE_0;
+ else
+ old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
+ }
+
+ if (n >= BREAK_3)
+ type = n < BREAK_4 ? TYPE_3 : TYPE_4;
+ else if (n < BREAK_1)
+ {
+ if (n < BREAK_0)
+ {
+ __set_errno (EINVAL);
+ goto fail;
+ }
+ type = TYPE_0;
+ }
+ else
+ type = n < BREAK_2 ? TYPE_1 : TYPE_2;
+
+ degree = random_poly_info.degrees[type];
+ separation = random_poly_info.seps[type];
+
+ buf->rand_type = type;
+ buf->rand_sep = separation;
+ buf->rand_deg = degree;
+ state = &((int32_t *) arg_state)[1]; /* First location. */
+ /* Must set END_PTR before srandom. */
+ buf->end_ptr = &state[degree];
+
+ buf->state = state;
+
+ __srandom_r (seed, buf);
+
+ state[-1] = TYPE_0;
+ if (type != TYPE_0)
+ state[-1] = (buf->rptr - state) * MAX_TYPES + type;
+
+ return 0;
+
+ fail:
+ __set_errno (EINVAL);
+ return -1;
+}
+
+weak_alias (__initstate_r, initstate_r)
+
+/* Restore the state from the given state array.
+ Note: It is important that we also remember the locations of the pointers
+ in the current state information, and restore the locations of the pointers
+ from the old state information. This is done by multiplexing the pointer
+ location into the zeroth word of the state information. Note that due
+ to the order in which things are done, it is OK to call setstate with the
+ same state as the current state
+ Returns a pointer to the old state information. */
+int
+__setstate_r (char *arg_state, struct random_data *buf)
+{
+ int32_t *new_state = 1 + (int32_t *) arg_state;
+ int type;
+ int old_type;
+ int32_t *old_state;
+ int degree;
+ int separation;
+
+ if (arg_state == NULL || buf == NULL)
+ goto fail;
+
+ old_type = buf->rand_type;
+ old_state = buf->state;
+ if (old_type == TYPE_0)
+ old_state[-1] = TYPE_0;
+ else
+ old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
+
+ type = new_state[-1] % MAX_TYPES;
+ if (type < TYPE_0 || type > TYPE_4)
+ goto fail;
+
+ buf->rand_deg = degree = random_poly_info.degrees[type];
+ buf->rand_sep = separation = random_poly_info.seps[type];
+ buf->rand_type = type;
+
+ if (type != TYPE_0)
+ {
+ int rear = new_state[-1] / MAX_TYPES;
+ buf->rptr = &new_state[rear];
+ buf->fptr = &new_state[(rear + separation) % degree];
+ }
+ buf->state = new_state;
+ /* Set end_ptr too. */
+ buf->end_ptr = &new_state[degree];
+
+ return 0;
+
+ fail:
+ __set_errno (EINVAL);
+ return -1;
+}
+
+weak_alias (__setstate_r, setstate_r)
+
+/* If we are using the trivial TYPE_0 R.N.G., just do the old linear
+ congruential bit. Otherwise, we do our fancy trinomial stuff, which is the
+ same in all the other cases due to all the global variables that have been
+ set up. The basic operation is to add the number at the rear pointer into
+ the one at the front pointer. Then both pointers are advanced to the next
+ location cyclically in the table. The value returned is the sum generated,
+ reduced to 31 bits by throwing away the "least random" low bit.
+ Note: The code takes advantage of the fact that both the front and
+ rear pointers can't wrap on the same call by not testing the rear
+ pointer if the front one has wrapped. Returns a 31-bit random number. */
+
+int
+__random_r (struct random_data *buf, int32_t *result)
+{
+ int32_t *state;
+
+ if (buf == NULL || result == NULL)
+ goto fail;
+
+ state = buf->state;
+
+ if (buf->rand_type == TYPE_0)
+ {
+ int32_t val = state[0];
+ val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
+ state[0] = val;
+ *result = val;
+ }
+ else
+ {
+ int32_t *fptr = buf->fptr;
+ int32_t *rptr = buf->rptr;
+ int32_t *end_ptr = buf->end_ptr;
+ int32_t val;
+
+ val = *fptr += *rptr;
+ /* Chucking least random bit. */
+ *result = (val >> 1) & 0x7fffffff;
+ ++fptr;
+ if (fptr >= end_ptr)
+ {
+ fptr = state;
+ ++rptr;
+ }
+ else
+ {
+ ++rptr;
+ if (rptr >= end_ptr)
+ rptr = state;
+ }
+ buf->fptr = fptr;
+ buf->rptr = rptr;
+ }
+ return 0;
+
+ fail:
+ __set_errno (EINVAL);
+ return -1;
+}
+
+weak_alias (__random_r, random_r)
diff --git a/gnulib/lib/rawmemchr.c b/gnulib/lib/rawmemchr.c
new file mode 100644
index 00000000..0a88777d
--- /dev/null
+++ b/gnulib/lib/rawmemchr.c
@@ -0,0 +1,136 @@
+/* Searching in a string.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Find the first occurrence of C in S. */
+void *
+rawmemchr (const void *s, int c_in)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ (size_t) char_ptr % sizeof (longword) != 0;
+ ++char_ptr)
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will
+ test a longword at a time. The tricky part is testing if *any of
+ the four* bytes in the longword in question are equal to NUL or
+ c. We first use an xor with repeated_c. This reduces the task
+ to testing whether *any of the four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ The test whether any byte in longword1 is zero is equivalent
+ to testing whether tmp is nonzero.
+
+ This test can read beyond the end of a string, depending on where
+ C_IN is encountered. However, this is considered safe since the
+ initialization phase ensured that the read will be aligned,
+ therefore, the read will not cross page boundaries and will not
+ cause a fault. */
+
+ while (1)
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that one of the sizeof (longword) bytes
+ starting at char_ptr is == c. On little-endian machines, we
+ could determine the first such byte without any further memory
+ accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines.
+ Choose code that works in both cases. */
+
+ char_ptr = (unsigned char *) longword_ptr;
+ while (*char_ptr != c)
+ char_ptr++;
+ return (void *) char_ptr;
+}
diff --git a/gnulib/lib/rawmemchr.valgrind b/gnulib/lib/rawmemchr.valgrind
new file mode 100644
index 00000000..63639236
--- /dev/null
+++ b/gnulib/lib/rawmemchr.valgrind
@@ -0,0 +1,12 @@
+# Suppress a valgrind message about use of uninitialized memory in rawmemchr().
+# This use is OK because it provides only a speedup.
+{
+ rawmemchr-value4
+ Memcheck:Value4
+ fun:rawmemchr
+}
+{
+ rawmemchr-value8
+ Memcheck:Value8
+ fun:rawmemchr
+}
diff --git a/gnulib/lib/read-file.c b/gnulib/lib/read-file.c
new file mode 100644
index 00000000..6b655db5
--- /dev/null
+++ b/gnulib/lib/read-file.c
@@ -0,0 +1,136 @@
+/* read-file.c -- read file contents into a string
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Bruno Haible.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include "read-file.h"
+
+/* Get realloc, free. */
+#include <stdlib.h>
+
+/* Get errno. */
+#include <errno.h>
+
+/* Read a STREAM and return a newly allocated string with the content,
+ and set *LENGTH to the length of the string. The string is
+ zero-terminated, but the terminating zero byte is not counted in
+ *LENGTH. On errors, *LENGTH is undefined, errno preserves the
+ values set by system functions (if any), and NULL is returned. */
+char *
+fread_file (FILE * stream, size_t * length)
+{
+ char *buf = NULL;
+ size_t alloc = 0;
+ size_t size = 0;
+ int save_errno;
+
+ for (;;)
+ {
+ size_t count;
+ size_t requested;
+
+ if (size + BUFSIZ + 1 > alloc)
+ {
+ char *new_buf;
+
+ alloc += alloc / 2;
+ if (alloc < size + BUFSIZ + 1)
+ alloc = size + BUFSIZ + 1;
+
+ new_buf = realloc (buf, alloc);
+ if (!new_buf)
+ {
+ save_errno = errno;
+ break;
+ }
+
+ buf = new_buf;
+ }
+
+ requested = alloc - size - 1;
+ count = fread (buf + size, 1, requested, stream);
+ size += count;
+
+ if (count != requested)
+ {
+ save_errno = errno;
+ if (ferror (stream))
+ break;
+ buf[size] = '\0';
+ *length = size;
+ return buf;
+ }
+ }
+
+ free (buf);
+ errno = save_errno;
+ return NULL;
+}
+
+static char *
+internal_read_file (const char *filename, size_t * length, const char *mode)
+{
+ FILE *stream = fopen (filename, mode);
+ char *out;
+ int save_errno;
+
+ if (!stream)
+ return NULL;
+
+ out = fread_file (stream, length);
+
+ save_errno = errno;
+
+ if (fclose (stream) != 0)
+ {
+ if (out)
+ {
+ save_errno = errno;
+ free (out);
+ }
+ errno = save_errno;
+ return NULL;
+ }
+
+ return out;
+}
+
+/* Open and read the contents of FILENAME, and return a newly
+ allocated string with the content, and set *LENGTH to the length of
+ the string. The string is zero-terminated, but the terminating
+ zero byte is not counted in *LENGTH. On errors, *LENGTH is
+ undefined, errno preserves the values set by system functions (if
+ any), and NULL is returned. */
+char *
+read_file (const char *filename, size_t * length)
+{
+ return internal_read_file (filename, length, "r");
+}
+
+/* Open (on non-POSIX systems, in binary mode) and read the contents
+ of FILENAME, and return a newly allocated string with the content,
+ and set LENGTH to the length of the string. The string is
+ zero-terminated, but the terminating zero byte is not counted in
+ the LENGTH variable. On errors, *LENGTH is undefined, errno
+ preserves the values set by system functions (if any), and NULL is
+ returned. */
+char *
+read_binary_file (const char *filename, size_t * length)
+{
+ return internal_read_file (filename, length, "rb");
+}
diff --git a/gnulib/lib/read-file.h b/gnulib/lib/read-file.h
new file mode 100644
index 00000000..247de8b2
--- /dev/null
+++ b/gnulib/lib/read-file.h
@@ -0,0 +1,34 @@
+/* read-file.h -- read file contents into a string
+ Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef READ_FILE_H
+#define READ_FILE_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get FILE. */
+#include <stdio.h>
+
+extern char *fread_file (FILE * stream, size_t * length);
+
+extern char *read_file (const char *filename, size_t * length);
+
+extern char *read_binary_file (const char *filename, size_t * length);
+
+#endif /* READ_FILE_H */
diff --git a/gnulib/lib/readline.c b/gnulib/lib/readline.c
new file mode 100644
index 00000000..d42f2966
--- /dev/null
+++ b/gnulib/lib/readline.c
@@ -0,0 +1,55 @@
+/* readline.c --- Simple implementation of readline.
+ Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson
+
+ 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/>. */
+
+#include <config.h>
+
+/* This module is intended to be used when the application only needs
+ the readline interface. If you need more functions from the
+ readline library, it is recommended to require the readline library
+ (or improve this module) rather than #if-protect part of your
+ application (doing so would add assumptions of this module into
+ your application). The application should use #include
+ "readline.h", that header file will include <readline/readline.h>
+ if the real library is present on the system. */
+
+/* Get specification. */
+#include "readline.h"
+
+#include <stdio.h>
+#include <string.h>
+
+char *
+readline (const char *prompt)
+{
+ char *out = NULL;
+ size_t size = 0;
+
+ if (prompt)
+ {
+ fputs (prompt, stdout);
+ fflush (stdout);
+ }
+
+ if (getline (&out, &size, stdin) < 0)
+ return NULL;
+
+ while (*out && (out[strlen (out) - 1] == '\r'
+ || out[strlen (out) - 1] == '\n'))
+ out[strlen (out) - 1] = '\0';
+
+ return out;
+}
diff --git a/gnulib/lib/readline.h b/gnulib/lib/readline.h
new file mode 100644
index 00000000..44ec0140
--- /dev/null
+++ b/gnulib/lib/readline.h
@@ -0,0 +1,34 @@
+/* readline.h --- Simple implementation of readline.
+ Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson
+
+ 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/>. */
+
+#ifndef GL_READLINE_H
+#define GL_READLINE_H
+
+#if HAVE_READLINE_READLINE_H
+/* <readline/readline.h> makes use of the FILE type without including
+ <stdio.h> itself. */
+# include <stdio.h>
+# include <readline/readline.h>
+#else
+/* Prints a prompt PROMPT and then reads and returns a single line of
+ text from the user. If PROMPT is NULL or the empty string, no
+ prompt is displayed. The returned line is allocated with malloc;
+ the caller should free the line when it has finished with it. */
+extern char *readline (const char *prompt);
+#endif
+
+#endif /* GL_READLINE_H */
diff --git a/gnulib/lib/readlink.c b/gnulib/lib/readlink.c
new file mode 100644
index 00000000..1d9b3d3b
--- /dev/null
+++ b/gnulib/lib/readlink.c
@@ -0,0 +1,74 @@
+/* Stub for readlink().
+ Copyright (C) 2003-2007, 2009-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_READLINK
+
+/* readlink() substitute for systems that don't have a readlink() function,
+ such as DJGPP 2.03 and mingw32. */
+
+ssize_t
+readlink (const char *name, char *buf _GL_UNUSED,
+ size_t bufsize _GL_UNUSED)
+{
+ struct stat statbuf;
+
+ /* In general we should use lstat() here, not stat(). But on platforms
+ without symbolic links, lstat() - if it exists - would be equivalent to
+ stat(), therefore we can use stat(). This saves us a configure check. */
+ if (stat (name, &statbuf) >= 0)
+ errno = EINVAL;
+ return -1;
+}
+
+#else /* HAVE_READLINK */
+
+# undef readlink
+
+/* readlink() wrapper that uses correct types, for systems like cygwin
+ 1.5.x where readlink returns int, and which rejects trailing slash,
+ for Solaris 9. */
+
+ssize_t
+rpl_readlink (const char *name, char *buf, size_t bufsize)
+{
+# if READLINK_TRAILING_SLASH_BUG
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ /* Even if name without the slash is a symlink to a directory,
+ both lstat() and stat() must resolve the trailing slash to
+ the directory rather than the symlink. We can therefore
+ safely use stat() to distinguish between EINVAL and
+ ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat(). */
+ struct stat st;
+ if (stat (name, &st) == 0)
+ errno = EINVAL;
+ return -1;
+ }
+# endif /* READLINK_TRAILING_SLASH_BUG */
+ return readlink (name, buf, bufsize);
+}
+
+#endif /* HAVE_READLINK */
diff --git a/gnulib/lib/readtokens.c b/gnulib/lib/readtokens.c
new file mode 100644
index 00000000..c65c1b13
--- /dev/null
+++ b/gnulib/lib/readtokens.c
@@ -0,0 +1,203 @@
+/* readtokens.c -- Functions for reading tokens from an input stream.
+
+ Copyright (C) 1990-1991, 1999-2004, 2006, 2009-2010 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/>.
+
+ Written by Jim Meyering. */
+
+/* This almost supercedes xreadline stuff -- using delim="\n"
+ gives the same functionality, except that these functions
+ would never return empty lines. */
+
+#include <config.h>
+
+#include "readtokens.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include "xalloc.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Initialize a tokenbuffer. */
+
+void
+init_tokenbuffer (token_buffer *tokenbuffer)
+{
+ tokenbuffer->size = 0;
+ tokenbuffer->buffer = NULL;
+}
+
+/* Read a token from STREAM into TOKENBUFFER.
+ A token is delimited by any of the N_DELIM bytes in DELIM.
+ Upon return, the token is in tokenbuffer->buffer and
+ has a trailing '\0' instead of any original delimiter.
+ The function value is the length of the token not including
+ the final '\0'. Upon EOF (i.e. on the call after the last
+ token is read) or error, return -1 without modifying tokenbuffer.
+ The EOF and error conditions may be distinguished in the caller
+ by testing ferror (STREAM).
+
+ This function works properly on lines containing NUL bytes
+ and on files do not end with a delimiter. */
+
+size_t
+readtoken (FILE *stream,
+ const char *delim,
+ size_t n_delim,
+ token_buffer *tokenbuffer)
+{
+ char *p;
+ int c;
+ size_t i, n;
+ static const char *saved_delim = NULL;
+ static char isdelim[256];
+ bool same_delimiters;
+
+ if (delim == NULL && saved_delim == NULL)
+ abort ();
+
+ same_delimiters = false;
+ if (delim != saved_delim && saved_delim != NULL)
+ {
+ same_delimiters = true;
+ for (i = 0; i < n_delim; i++)
+ {
+ if (delim[i] != saved_delim[i])
+ {
+ same_delimiters = false;
+ break;
+ }
+ }
+ }
+
+ if (!same_delimiters)
+ {
+ size_t j;
+ saved_delim = delim;
+ memset (isdelim, 0, sizeof isdelim);
+ for (j = 0; j < n_delim; j++)
+ {
+ unsigned char ch = delim[j];
+ isdelim[ch] = 1;
+ }
+ }
+
+ /* FIXME: don't fool with this caching. Use strchr instead. */
+ /* skip over any leading delimiters */
+ for (c = getc (stream); c >= 0 && isdelim[c]; c = getc (stream))
+ {
+ /* empty */
+ }
+
+ p = tokenbuffer->buffer;
+ n = tokenbuffer->size;
+ i = 0;
+ for (;;)
+ {
+ if (c < 0 && i == 0)
+ return -1;
+
+ if (i == n)
+ p = x2nrealloc (p, &n, sizeof *p);
+
+ if (c < 0)
+ {
+ p[i] = 0;
+ break;
+ }
+ if (isdelim[c])
+ {
+ p[i] = 0;
+ break;
+ }
+ p[i++] = c;
+ c = getc (stream);
+ }
+
+ tokenbuffer->buffer = p;
+ tokenbuffer->size = n;
+ return i;
+}
+
+/* Build a NULL-terminated array of pointers to tokens
+ read from STREAM. Return the number of tokens read.
+ All storage is obtained through calls to xmalloc-like functions.
+
+ %%% Question: is it worth it to do a single
+ %%% realloc() of `tokens' just before returning? */
+
+size_t
+readtokens (FILE *stream,
+ size_t projected_n_tokens,
+ const char *delim,
+ size_t n_delim,
+ char ***tokens_out,
+ size_t **token_lengths)
+{
+ token_buffer tb, *token = &tb;
+ char **tokens;
+ size_t *lengths;
+ size_t sz;
+ size_t n_tokens;
+
+ if (projected_n_tokens == 0)
+ projected_n_tokens = 64;
+ else
+ projected_n_tokens++; /* add one for trailing NULL pointer */
+
+ sz = projected_n_tokens;
+ tokens = xnmalloc (sz, sizeof *tokens);
+ lengths = xnmalloc (sz, sizeof *lengths);
+
+ n_tokens = 0;
+ init_tokenbuffer (token);
+ for (;;)
+ {
+ char *tmp;
+ size_t token_length = readtoken (stream, delim, n_delim, token);
+ if (n_tokens >= sz)
+ {
+ tokens = x2nrealloc (tokens, &sz, sizeof *tokens);
+ lengths = xnrealloc (lengths, sz, sizeof *lengths);
+ }
+
+ if (token_length == (size_t) -1)
+ {
+ /* don't increment n_tokens for NULL entry */
+ tokens[n_tokens] = NULL;
+ lengths[n_tokens] = 0;
+ break;
+ }
+ tmp = xnmalloc (token_length + 1, sizeof *tmp);
+ lengths[n_tokens] = token_length;
+ tokens[n_tokens] = memcpy (tmp, token->buffer, token_length + 1);
+ n_tokens++;
+ }
+
+ free (token->buffer);
+ *tokens_out = tokens;
+ if (token_lengths != NULL)
+ *token_lengths = lengths;
+ else
+ free (lengths);
+ return n_tokens;
+}
diff --git a/gnulib/lib/readtokens.h b/gnulib/lib/readtokens.h
new file mode 100644
index 00000000..41632cc2
--- /dev/null
+++ b/gnulib/lib/readtokens.h
@@ -0,0 +1,43 @@
+/* readtokens.h -- Functions for reading tokens from an input stream.
+
+ Copyright (C) 1990-1991, 1999, 2001-2004, 2009-2010 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/>.
+
+ Written by Jim Meyering. */
+
+#ifndef READTOKENS_H
+# define READTOKENS_H
+
+# include <stdio.h>
+
+struct tokenbuffer
+{
+ size_t size;
+ char *buffer;
+};
+typedef struct tokenbuffer token_buffer;
+
+void init_tokenbuffer (token_buffer *tokenbuffer);
+
+size_t
+ readtoken (FILE *stream, const char *delim, size_t n_delim,
+ token_buffer *tokenbuffer);
+size_t
+ readtokens (FILE *stream, size_t projected_n_tokens,
+ const char *delim, size_t n_delim,
+ char ***tokens_out, size_t **token_lengths);
+
+#endif /* not READTOKENS_H */
diff --git a/gnulib/lib/readtokens0.c b/gnulib/lib/readtokens0.c
new file mode 100644
index 00000000..147dd0df
--- /dev/null
+++ b/gnulib/lib/readtokens0.c
@@ -0,0 +1,99 @@
+/* readtokens0.c -- Read NUL-separated tokens from an input stream.
+
+ Copyright (C) 2004, 2006, 2009-2010 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/>.
+
+ Written by Jim Meyering. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "readtokens0.h"
+
+#define obstack_chunk_alloc malloc
+#define obstack_chunk_free free
+
+void
+readtokens0_init (struct Tokens *t)
+{
+ t->n_tok = 0;
+ t->tok = NULL;
+ t->tok_len = NULL;
+ obstack_init (&t->o_data);
+ obstack_init (&t->o_tok);
+ obstack_init (&t->o_tok_len);
+}
+
+void
+readtokens0_free (struct Tokens *t)
+{
+ obstack_free (&t->o_data, NULL);
+ obstack_free (&t->o_tok, NULL);
+ obstack_free (&t->o_tok_len, NULL);
+}
+
+/* Finalize (in the obstack_finish sense) the current token
+ and record its pointer and length. */
+static void
+save_token (struct Tokens *t)
+{
+ /* Don't count the trailing NUL byte in the length. */
+ size_t len = obstack_object_size (&t->o_data) - 1;
+ char const *s = obstack_finish (&t->o_data);
+ obstack_ptr_grow (&t->o_tok, s);
+ obstack_grow (&t->o_tok_len, &len, sizeof len);
+ t->n_tok++;
+}
+
+/* Read NUL-separated tokens from stream IN into T until EOF or error.
+ The final NUL is optional. Always append a NULL pointer to the
+ resulting list of token pointers, but that pointer isn't counted
+ via t->n_tok. Return true if successful. */
+bool
+readtokens0 (FILE *in, struct Tokens *t)
+{
+
+ while (1)
+ {
+ int c = fgetc (in);
+ if (c == EOF)
+ {
+ size_t len = obstack_object_size (&t->o_data);
+ /* If the current object has nonzero length, then there
+ was no NUL byte at EOF -- or maybe there was an error,
+ in which case, we need to append a NUL byte to our buffer. */
+ if (len)
+ {
+ obstack_1grow (&t->o_data, '\0');
+ save_token (t);
+ }
+
+ break;
+ }
+
+ obstack_1grow (&t->o_data, c);
+ if (c == '\0')
+ save_token (t);
+ }
+
+ /* Add a NULL pointer at the end, in case the caller (like du)
+ requires an argv-style array of strings. */
+ obstack_ptr_grow (&t->o_tok, NULL);
+
+ t->tok = obstack_finish (&t->o_tok);
+ t->tok_len = obstack_finish (&t->o_tok_len);
+ return ! ferror (in);
+}
diff --git a/gnulib/lib/readtokens0.h b/gnulib/lib/readtokens0.h
new file mode 100644
index 00000000..9a21a664
--- /dev/null
+++ b/gnulib/lib/readtokens0.h
@@ -0,0 +1,42 @@
+/* readtokens0.h -- read NUL-separated tokens from an input stream.
+
+ Copyright (C) 2004, 2009-2010 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/>.
+
+ Written by Jim Meyering. */
+
+#ifndef READTOKENS0_H
+# define READTOKENS0_H 1
+
+# include <stdio.h>
+# include <sys/types.h>
+# include <stdbool.h>
+# include "obstack.h"
+
+struct Tokens
+{
+ size_t n_tok;
+ char **tok;
+ size_t *tok_len;
+ struct obstack o_data; /* Contains data pointed to by each tok[i]. */
+ struct obstack o_tok; /* array of pointers to tokens */
+ struct obstack o_tok_len; /* array of token lengths */
+};
+
+void readtokens0_init (struct Tokens *t);
+void readtokens0_free (struct Tokens *t);
+bool readtokens0 (FILE *in, struct Tokens *t);
+
+#endif
diff --git a/gnulib/lib/readutmp.c b/gnulib/lib/readutmp.c
new file mode 100644
index 00000000..40c5a9ae
--- /dev/null
+++ b/gnulib/lib/readutmp.c
@@ -0,0 +1,161 @@
+/* GNU's read utmp module.
+
+ Copyright (C) 1992-2001, 2003-2006, 2009-2010 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/>. */
+
+/* Written by jla; revised by djm */
+
+#include <config.h>
+
+#include "readutmp.h"
+
+#include <errno.h>
+#include <stdio.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "xalloc.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Copy UT->ut_name into storage obtained from malloc. Then remove any
+ trailing spaces from the copy, NUL terminate it, and return the copy. */
+
+char *
+extract_trimmed_name (const STRUCT_UTMP *ut)
+{
+ char *p, *trimmed_name;
+
+ trimmed_name = xmalloc (sizeof (UT_USER (ut)) + 1);
+ strncpy (trimmed_name, UT_USER (ut), sizeof (UT_USER (ut)));
+ /* Append a trailing NUL. Some systems pad names shorter than the
+ maximum with spaces, others pad with NULs. Remove any trailing
+ spaces. */
+ trimmed_name[sizeof (UT_USER (ut))] = '\0';
+ for (p = trimmed_name + strlen (trimmed_name);
+ trimmed_name < p && p[-1] == ' ';
+ *--p = '\0')
+ continue;
+ return trimmed_name;
+}
+
+/* Is the utmp entry U desired by the user who asked for OPTIONS? */
+
+static inline bool
+desirable_utmp_entry (STRUCT_UTMP const *u, int options)
+{
+ bool user_proc = IS_USER_PROCESS (u);
+ if ((options & READ_UTMP_USER_PROCESS) && !user_proc)
+ return false;
+ if ((options & READ_UTMP_CHECK_PIDS)
+ && user_proc
+ && (UT_PID (u) <= 0
+ || (kill (UT_PID (u), 0) < 0 && errno == ESRCH)))
+ return false;
+ return true;
+}
+
+/* Read the utmp entries corresponding to file FILE into freshly-
+ malloc'd storage, set *UTMP_BUF to that pointer, set *N_ENTRIES to
+ the number of entries, and return zero. If there is any error,
+ return -1, setting errno, and don't modify the parameters.
+ If OPTIONS & READ_UTMP_CHECK_PIDS is nonzero, omit entries whose
+ process-IDs do not currently exist. */
+
+#ifdef UTMP_NAME_FUNCTION
+
+int
+read_utmp (char const *file, size_t *n_entries, STRUCT_UTMP **utmp_buf,
+ int options)
+{
+ size_t n_read = 0;
+ size_t n_alloc = 0;
+ STRUCT_UTMP *utmp = NULL;
+ STRUCT_UTMP *u;
+
+ /* Ignore the return value for now.
+ Solaris' utmpname returns 1 upon success -- which is contrary
+ to what the GNU libc version does. In addition, older GNU libc
+ versions are actually void. */
+ UTMP_NAME_FUNCTION (file);
+
+ SET_UTMP_ENT ();
+
+ while ((u = GET_UTMP_ENT ()) != NULL)
+ if (desirable_utmp_entry (u, options))
+ {
+ if (n_read == n_alloc)
+ utmp = x2nrealloc (utmp, &n_alloc, sizeof *utmp);
+
+ utmp[n_read++] = *u;
+ }
+
+ END_UTMP_ENT ();
+
+ *n_entries = n_read;
+ *utmp_buf = utmp;
+
+ return 0;
+}
+
+#else
+
+int
+read_utmp (char const *file, size_t *n_entries, STRUCT_UTMP **utmp_buf,
+ int options)
+{
+ size_t n_read = 0;
+ size_t n_alloc = 0;
+ STRUCT_UTMP *utmp = NULL;
+ int saved_errno;
+ FILE *f = fopen (file, "r");
+
+ if (! f)
+ return -1;
+
+ for (;;)
+ {
+ if (n_read == n_alloc)
+ utmp = x2nrealloc (utmp, &n_alloc, sizeof *utmp);
+ if (fread (&utmp[n_read], sizeof utmp[n_read], 1, f) == 0)
+ break;
+ n_read += desirable_utmp_entry (&utmp[n_read], options);
+ }
+
+ saved_errno = ferror (f) ? errno : 0;
+ if (fclose (f) != 0)
+ saved_errno = errno;
+ if (saved_errno != 0)
+ {
+ free (utmp);
+ errno = saved_errno;
+ return -1;
+ }
+
+ *n_entries = n_read;
+ *utmp_buf = utmp;
+
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/readutmp.h b/gnulib/lib/readutmp.h
new file mode 100644
index 00000000..38acf450
--- /dev/null
+++ b/gnulib/lib/readutmp.h
@@ -0,0 +1,216 @@
+/* Declarations for GNU's read utmp module.
+
+ Copyright (C) 1992-2007, 2009-2010 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/>. */
+
+/* Written by jla; revised by djm */
+
+#ifndef __READUTMP_H__
+# define __READUTMP_H__
+
+# include <sys/types.h>
+
+/* AIX 4.3.3 has both utmp.h and utmpx.h, but only struct utmp
+ has the ut_exit member. */
+# if (HAVE_UTMPX_H && HAVE_UTMP_H && HAVE_STRUCT_UTMP_UT_EXIT \
+ && ! HAVE_STRUCT_UTMPX_UT_EXIT)
+# undef HAVE_UTMPX_H
+# endif
+
+# if HAVE_UTMPX_H
+# if HAVE_UTMP_H
+ /* HPUX 10.20 needs utmp.h, for the definition of e.g., UTMP_FILE. */
+# include <utmp.h>
+# endif
+# if defined _THREAD_SAFE && defined UTMP_DATA_INIT
+ /* When including both utmp.h and utmpx.h on AIX 4.3, with _THREAD_SAFE
+ defined, work around the duplicate struct utmp_data declaration. */
+# define utmp_data gl_aix_4_3_workaround_utmp_data
+# endif
+# include <utmpx.h>
+# define UTMP_STRUCT_NAME utmpx
+# define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_tv.tv_sec)
+# define SET_UTMP_ENT setutxent
+# define GET_UTMP_ENT getutxent
+# define END_UTMP_ENT endutxent
+# ifdef HAVE_UTMPXNAME
+# define UTMP_NAME_FUNCTION utmpxname
+# endif
+
+# if HAVE_STRUCT_UTMPX_UT_EXIT_E_TERMINATION
+# define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.e_termination)
+# else
+# if HAVE_STRUCT_UTMPX_UT_EXIT_UT_TERMINATION
+# define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.ut_termination)
+# else
+# define UT_EXIT_E_TERMINATION(U) 0
+# endif
+# endif
+
+# if HAVE_STRUCT_UTMPX_UT_EXIT_E_EXIT
+# define UT_EXIT_E_EXIT(U) ((U)->ut_exit.e_exit)
+# else
+# if HAVE_STRUCT_UTMPX_UT_EXIT_UT_EXIT
+# define UT_EXIT_E_EXIT(U) ((U)->ut_exit.ut_exit)
+# else
+# define UT_EXIT_E_EXIT(U) 0
+# endif
+# endif
+
+# elif HAVE_UTMP_H
+
+# include <utmp.h>
+# if !HAVE_DECL_GETUTENT
+ struct utmp *getutent();
+# endif
+# define UTMP_STRUCT_NAME utmp
+# define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_time)
+# define SET_UTMP_ENT setutent
+# define GET_UTMP_ENT getutent
+# define END_UTMP_ENT endutent
+# ifdef HAVE_UTMPNAME
+# define UTMP_NAME_FUNCTION utmpname
+# endif
+
+# if HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION
+# define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.e_termination)
+# else
+# if HAVE_STRUCT_UTMP_UT_EXIT_UT_TERMINATION
+# define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.ut_termination)
+# else
+# define UT_EXIT_E_TERMINATION(U) 0
+# endif
+# endif
+
+# if HAVE_STRUCT_UTMP_UT_EXIT_E_EXIT
+# define UT_EXIT_E_EXIT(U) ((U)->ut_exit.e_exit)
+# else
+# if HAVE_STRUCT_UTMP_UT_EXIT_UT_EXIT
+# define UT_EXIT_E_EXIT(U) ((U)->ut_exit.ut_exit)
+# else
+# define UT_EXIT_E_EXIT(U) 0
+# endif
+# endif
+
+# endif
+
+/* Accessor macro for the member named ut_user or ut_name. */
+# if HAVE_UTMPX_H
+
+# if HAVE_STRUCT_UTMPX_UT_USER
+# define UT_USER(Utmp) ((Utmp)->ut_user)
+# endif
+# if HAVE_STRUCT_UTMPX_UT_NAME
+# undef UT_USER
+# define UT_USER(Utmp) ((Utmp)->ut_name)
+# endif
+
+# elif HAVE_UTMP_H
+
+# if HAVE_STRUCT_UTMP_UT_USER
+# define UT_USER(Utmp) ((Utmp)->ut_user)
+# endif
+# if HAVE_STRUCT_UTMP_UT_NAME
+# undef UT_USER
+# define UT_USER(Utmp) ((Utmp)->ut_name)
+# endif
+
+# endif
+
+# define HAVE_STRUCT_XTMP_UT_EXIT \
+ (HAVE_STRUCT_UTMP_UT_EXIT \
+ || HAVE_STRUCT_UTMPX_UT_EXIT)
+
+# define HAVE_STRUCT_XTMP_UT_ID \
+ (HAVE_STRUCT_UTMP_UT_ID \
+ || HAVE_STRUCT_UTMPX_UT_ID)
+
+# define HAVE_STRUCT_XTMP_UT_PID \
+ (HAVE_STRUCT_UTMP_UT_PID \
+ || HAVE_STRUCT_UTMPX_UT_PID)
+
+typedef struct UTMP_STRUCT_NAME STRUCT_UTMP;
+
+enum { UT_USER_SIZE = sizeof UT_USER ((STRUCT_UTMP *) 0) };
+
+# if !defined UTMP_FILE && defined _PATH_UTMP
+# define UTMP_FILE _PATH_UTMP
+# endif
+
+# if !defined WTMP_FILE && defined _PATH_WTMP
+# define WTMP_FILE _PATH_WTMP
+# endif
+
+# ifdef UTMPX_FILE /* Solaris, SysVr4 */
+# undef UTMP_FILE
+# define UTMP_FILE UTMPX_FILE
+# endif
+
+# ifdef WTMPX_FILE /* Solaris, SysVr4 */
+# undef WTMP_FILE
+# define WTMP_FILE WTMPX_FILE
+# endif
+
+# ifndef UTMP_FILE
+# define UTMP_FILE "/etc/utmp"
+# endif
+
+# ifndef WTMP_FILE
+# define WTMP_FILE "/etc/wtmp"
+# endif
+
+# if HAVE_STRUCT_XTMP_UT_PID
+# define UT_PID(U) ((U)->ut_pid)
+# else
+# define UT_PID(U) 0
+# endif
+
+# if HAVE_STRUCT_UTMP_UT_TYPE || HAVE_STRUCT_UTMPX_UT_TYPE
+# define UT_TYPE_EQ(U, V) ((U)->ut_type == (V))
+# define UT_TYPE_NOT_DEFINED 0
+# else
+# define UT_TYPE_EQ(U, V) 0
+# define UT_TYPE_NOT_DEFINED 1
+# endif
+
+# ifdef BOOT_TIME
+# define UT_TYPE_BOOT_TIME(U) UT_TYPE_EQ (U, BOOT_TIME)
+# else
+# define UT_TYPE_BOOT_TIME(U) 0
+# endif
+
+# ifdef USER_PROCESS
+# define UT_TYPE_USER_PROCESS(U) UT_TYPE_EQ (U, USER_PROCESS)
+# else
+# define UT_TYPE_USER_PROCESS(U) 0
+# endif
+
+# define IS_USER_PROCESS(U) \
+ (UT_USER (U)[0] \
+ && (UT_TYPE_USER_PROCESS (U) \
+ || (UT_TYPE_NOT_DEFINED && UT_TIME_MEMBER (U) != 0)))
+
+/* Options for read_utmp. */
+enum
+ {
+ READ_UTMP_CHECK_PIDS = 1,
+ READ_UTMP_USER_PROCESS = 2
+ };
+
+char *extract_trimmed_name (const STRUCT_UTMP *ut);
+int read_utmp (char const *file, size_t *n_entries, STRUCT_UTMP **utmp_buf,
+ int options);
+
+#endif /* __READUTMP_H__ */
diff --git a/gnulib/lib/realloc.c b/gnulib/lib/realloc.c
new file mode 100644
index 00000000..36aeecc4
--- /dev/null
+++ b/gnulib/lib/realloc.c
@@ -0,0 +1,88 @@
+/* realloc() function that is glibc compatible.
+
+ Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2010 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/>. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#include <config.h>
+
+/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */
+#ifdef realloc
+# define NEED_REALLOC_GNU 1
+#endif
+
+/* Infer the properties of the system's malloc function.
+ Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */
+#if GNULIB_MALLOC_GNU && !defined malloc
+# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
+#endif
+
+/* Below we want to call the system's malloc and realloc.
+ Undefine the symbols here so that including <stdlib.h> provides a
+ declaration of malloc(), not of rpl_malloc(), and likewise for realloc. */
+#undef malloc
+#undef realloc
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Below we want to call the system's malloc and realloc.
+ Undefine the symbols, if they were defined by gnulib's <stdlib.h>
+ replacement. */
+#undef malloc
+#undef realloc
+
+/* Change the size of an allocated block of memory P to N bytes,
+ with error checking. If N is zero, change it to 1. If P is NULL,
+ use malloc. */
+
+void *
+rpl_realloc (void *p, size_t n)
+{
+ void *result;
+
+#if NEED_REALLOC_GNU
+ if (n == 0)
+ {
+ n = 1;
+
+ /* In theory realloc might fail, so don't rely on it to free. */
+ free (p);
+ p = NULL;
+ }
+#endif
+
+ if (p == NULL)
+ {
+#if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE
+ if (n == 0)
+ n = 1;
+#endif
+ result = malloc (n);
+ }
+ else
+ result = realloc (p, n);
+
+#if !HAVE_REALLOC_POSIX
+ if (result == NULL)
+ errno = ENOMEM;
+#endif
+
+ return result;
+}
diff --git a/gnulib/lib/recv.c b/gnulib/lib/recv.c
new file mode 100644
index 00000000..73e2a11d
--- /dev/null
+++ b/gnulib/lib/recv.c
@@ -0,0 +1,40 @@
+/* recv.c --- wrappers for Windows recv function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef recv
+
+int
+rpl_recv (int fd, void *buf, int len, int flags)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = recv (sock, buf, len, flags);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/recvfrom.c b/gnulib/lib/recvfrom.c
new file mode 100644
index 00000000..5cdfcae6
--- /dev/null
+++ b/gnulib/lib/recvfrom.c
@@ -0,0 +1,48 @@
+/* recvfrom.c --- wrappers for Windows recvfrom function
+
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef recvfrom
+
+int
+rpl_recvfrom (int fd, void *buf, int len, int flags, struct sockaddr *from,
+ int *fromlen)
+{
+ int frombufsize = (from != NULL ? *fromlen : 0);
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = recvfrom (sock, buf, len, flags, from, fromlen);
+
+ if (r < 0)
+ set_winsock_errno ();
+
+ /* Winsock recvfrom() only returns a valid 'from' when the socket is
+ connectionless. POSIX gives a valid 'from' for all types of sockets. */
+ else if (from != NULL && *fromlen == frombufsize)
+ rpl_getpeername (fd, from, fromlen);
+
+ return r;
+}
diff --git a/gnulib/lib/regcomp.c b/gnulib/lib/regcomp.c
new file mode 100644
index 00000000..d5968bd5
--- /dev/null
+++ b/gnulib/lib/regcomp.c
@@ -0,0 +1,3869 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+ Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
+ size_t length, reg_syntax_t syntax);
+static void re_compile_fastmap_iter (regex_t *bufp,
+ const re_dfastate_t *init_state,
+ char *fastmap);
+static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len);
+#ifdef RE_ENABLE_I18N
+static void free_charset (re_charset_t *cset);
+#endif /* RE_ENABLE_I18N */
+static void free_workarea_compile (regex_t *preg);
+static reg_errcode_t create_initial_state (re_dfa_t *dfa);
+#ifdef RE_ENABLE_I18N
+static void optimize_utf8 (re_dfa_t *dfa);
+#endif
+static reg_errcode_t analyze (regex_t *preg);
+static reg_errcode_t preorder (bin_tree_t *root,
+ reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra);
+static reg_errcode_t postorder (bin_tree_t *root,
+ reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra);
+static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node);
+static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node);
+static bin_tree_t *lower_subexp (reg_errcode_t *err, regex_t *preg,
+ bin_tree_t *node);
+static reg_errcode_t calc_first (void *extra, bin_tree_t *node);
+static reg_errcode_t calc_next (void *extra, bin_tree_t *node);
+static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node);
+static Idx duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint);
+static Idx search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
+ unsigned int constraint);
+static reg_errcode_t calc_eclosure (re_dfa_t *dfa);
+static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa,
+ Idx node, bool root);
+static reg_errcode_t calc_inveclosure (re_dfa_t *dfa);
+static Idx fetch_number (re_string_t *input, re_token_t *token,
+ reg_syntax_t syntax);
+static int peek_token (re_token_t *token, re_string_t *input,
+ reg_syntax_t syntax) internal_function;
+static bin_tree_t *parse (re_string_t *regexp, regex_t *preg,
+ reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp,
+ re_dfa_t *dfa, re_token_t *token,
+ reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa,
+ re_token_t *token, reg_syntax_t syntax,
+ reg_errcode_t *err);
+static reg_errcode_t parse_bracket_element (bracket_elem_t *elem,
+ re_string_t *regexp,
+ re_token_t *token, int token_len,
+ re_dfa_t *dfa,
+ reg_syntax_t syntax,
+ bool accept_hyphen);
+static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem,
+ re_string_t *regexp,
+ re_token_t *token);
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t build_equiv_class (bitset_t sbcset,
+ re_charset_t *mbcset,
+ Idx *equiv_class_alloc,
+ const unsigned char *name);
+static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
+ bitset_t sbcset,
+ re_charset_t *mbcset,
+ Idx *char_class_alloc,
+ const unsigned char *class_name,
+ reg_syntax_t syntax);
+#else /* not RE_ENABLE_I18N */
+static reg_errcode_t build_equiv_class (bitset_t sbcset,
+ const unsigned char *name);
+static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
+ bitset_t sbcset,
+ const unsigned char *class_name,
+ reg_syntax_t syntax);
+#endif /* not RE_ENABLE_I18N */
+static bin_tree_t *build_charclass_op (re_dfa_t *dfa,
+ RE_TRANSLATE_TYPE trans,
+ const unsigned char *class_name,
+ const unsigned char *extra,
+ bool non_match, reg_errcode_t *err);
+static bin_tree_t *create_tree (re_dfa_t *dfa,
+ bin_tree_t *left, bin_tree_t *right,
+ re_token_type_t type);
+static bin_tree_t *create_token_tree (re_dfa_t *dfa,
+ bin_tree_t *left, bin_tree_t *right,
+ const re_token_t *token);
+static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa);
+static void free_token (re_token_t *node);
+static reg_errcode_t free_tree (void *extra, bin_tree_t *node);
+static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node);
+
+/* This table gives an error message for each of the error codes listed
+ in regex.h. Obviously the order here has to be same as there.
+ POSIX doesn't require that we do anything for REG_NOERROR,
+ but why not be nice? */
+
+static const char __re_error_msgid[] =
+ {
+#define REG_NOERROR_IDX 0
+ gettext_noop ("Success") /* REG_NOERROR */
+ "\0"
+#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
+ gettext_noop ("No match") /* REG_NOMATCH */
+ "\0"
+#define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match")
+ gettext_noop ("Invalid regular expression") /* REG_BADPAT */
+ "\0"
+#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
+ gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
+ "\0"
+#define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character")
+ gettext_noop ("Invalid character class name") /* REG_ECTYPE */
+ "\0"
+#define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name")
+ gettext_noop ("Trailing backslash") /* REG_EESCAPE */
+ "\0"
+#define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash")
+ gettext_noop ("Invalid back reference") /* REG_ESUBREG */
+ "\0"
+#define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference")
+ gettext_noop ("Unmatched [ or [^") /* REG_EBRACK */
+ "\0"
+#define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [ or [^")
+ gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
+ "\0"
+#define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
+ gettext_noop ("Unmatched \\{") /* REG_EBRACE */
+ "\0"
+#define REG_BADBR_IDX (REG_EBRACE_IDX + sizeof "Unmatched \\{")
+ gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
+ "\0"
+#define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
+ gettext_noop ("Invalid range end") /* REG_ERANGE */
+ "\0"
+#define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end")
+ gettext_noop ("Memory exhausted") /* REG_ESPACE */
+ "\0"
+#define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted")
+ gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
+ "\0"
+#define REG_EEND_IDX (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
+ gettext_noop ("Premature end of regular expression") /* REG_EEND */
+ "\0"
+#define REG_ESIZE_IDX (REG_EEND_IDX + sizeof "Premature end of regular expression")
+ gettext_noop ("Regular expression too big") /* REG_ESIZE */
+ "\0"
+#define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big")
+ gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
+ };
+
+static const size_t __re_error_msgid_idx[] =
+ {
+ REG_NOERROR_IDX,
+ REG_NOMATCH_IDX,
+ REG_BADPAT_IDX,
+ REG_ECOLLATE_IDX,
+ REG_ECTYPE_IDX,
+ REG_EESCAPE_IDX,
+ REG_ESUBREG_IDX,
+ REG_EBRACK_IDX,
+ REG_EPAREN_IDX,
+ REG_EBRACE_IDX,
+ REG_BADBR_IDX,
+ REG_ERANGE_IDX,
+ REG_ESPACE_IDX,
+ REG_BADRPT_IDX,
+ REG_EEND_IDX,
+ REG_ESIZE_IDX,
+ REG_ERPAREN_IDX
+ };
+
+/* Entry points for GNU code. */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+ compiles PATTERN (of length LENGTH) and puts the result in BUFP.
+ Returns 0 if the pattern was valid, otherwise an error string.
+
+ Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+ are set in BUFP on entry. */
+
+#ifdef _LIBC
+const char *
+re_compile_pattern (pattern, length, bufp)
+ const char *pattern;
+ size_t length;
+ struct re_pattern_buffer *bufp;
+#else /* size_t might promote */
+const char *
+re_compile_pattern (const char *pattern, size_t length,
+ struct re_pattern_buffer *bufp)
+#endif
+{
+ reg_errcode_t ret;
+
+ /* And GNU code determines whether or not to get register information
+ by passing null for the REGS argument to re_match, etc., not by
+ setting no_sub, unless RE_NO_SUB is set. */
+ bufp->no_sub = !!(re_syntax_options & RE_NO_SUB);
+
+ /* Match anchors at newline. */
+ bufp->newline_anchor = 1;
+
+ ret = re_compile_internal (bufp, pattern, length, re_syntax_options);
+
+ if (!ret)
+ return NULL;
+ return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+#ifdef _LIBC
+weak_alias (__re_compile_pattern, re_compile_pattern)
+#endif
+
+/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
+ also be assigned to arbitrarily: each pattern buffer stores its own
+ syntax, so it can be changed between regex compilations. */
+/* This has no initializer because initialized variables in Emacs
+ become read-only after dumping. */
+reg_syntax_t re_syntax_options;
+
+
+/* Specify the precise syntax of regexps for compilation. This provides
+ for compatibility for various utilities which historically have
+ different, incompatible syntaxes.
+
+ The argument SYNTAX is a bit mask comprised of the various bits
+ defined in regex.h. We return the old syntax. */
+
+reg_syntax_t
+re_set_syntax (syntax)
+ reg_syntax_t syntax;
+{
+ reg_syntax_t ret = re_syntax_options;
+
+ re_syntax_options = syntax;
+ return ret;
+}
+#ifdef _LIBC
+weak_alias (__re_set_syntax, re_set_syntax)
+#endif
+
+int
+re_compile_fastmap (bufp)
+ struct re_pattern_buffer *bufp;
+{
+ re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+ char *fastmap = bufp->fastmap;
+
+ memset (fastmap, '\0', sizeof (char) * SBC_MAX);
+ re_compile_fastmap_iter (bufp, dfa->init_state, fastmap);
+ if (dfa->init_state != dfa->init_state_word)
+ re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap);
+ if (dfa->init_state != dfa->init_state_nl)
+ re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap);
+ if (dfa->init_state != dfa->init_state_begbuf)
+ re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap);
+ bufp->fastmap_accurate = 1;
+ return 0;
+}
+#ifdef _LIBC
+weak_alias (__re_compile_fastmap, re_compile_fastmap)
+#endif
+
+static inline void
+__attribute ((always_inline))
+re_set_fastmap (char *fastmap, bool icase, int ch)
+{
+ fastmap[ch] = 1;
+ if (icase)
+ fastmap[tolower (ch)] = 1;
+}
+
+/* Helper function for re_compile_fastmap.
+ Compile fastmap for the initial_state INIT_STATE. */
+
+static void
+re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
+ char *fastmap)
+{
+ re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+ Idx node_cnt;
+ bool icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE));
+ for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
+ {
+ Idx node = init_state->nodes.elems[node_cnt];
+ re_token_type_t type = dfa->nodes[node].type;
+
+ if (type == CHARACTER)
+ {
+ re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c);
+#ifdef RE_ENABLE_I18N
+ if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
+ {
+ unsigned char buf[MB_LEN_MAX];
+ unsigned char *p;
+ wchar_t wc;
+ mbstate_t state;
+
+ p = buf;
+ *p++ = dfa->nodes[node].opr.c;
+ while (++node < dfa->nodes_len
+ && dfa->nodes[node].type == CHARACTER
+ && dfa->nodes[node].mb_partial)
+ *p++ = dfa->nodes[node].opr.c;
+ memset (&state, '\0', sizeof (state));
+ if (__mbrtowc (&wc, (const char *) buf, p - buf,
+ &state) == p - buf
+ && (__wcrtomb ((char *) buf, towlower (wc), &state)
+ != (size_t) -1))
+ re_set_fastmap (fastmap, false, buf[0]);
+ }
+#endif
+ }
+ else if (type == SIMPLE_BRACKET)
+ {
+ int i, ch;
+ for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+ {
+ int j;
+ bitset_word_t w = dfa->nodes[node].opr.sbcset[i];
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ if (w & ((bitset_word_t) 1 << j))
+ re_set_fastmap (fastmap, icase, ch);
+ }
+ }
+#ifdef RE_ENABLE_I18N
+ else if (type == COMPLEX_BRACKET)
+ {
+ re_charset_t *cset = dfa->nodes[node].opr.mbcset;
+ Idx i;
+
+# ifdef _LIBC
+ /* See if we have to try all bytes which start multiple collation
+ elements.
+ e.g. In da_DK, we want to catch 'a' since "aa" is a valid
+ collation element, and don't catch 'b' since 'b' is
+ the only collation element which starts from 'b' (and
+ it is caught by SIMPLE_BRACKET). */
+ if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0
+ && (cset->ncoll_syms || cset->nranges))
+ {
+ const int32_t *table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ for (i = 0; i < SBC_MAX; ++i)
+ if (table[i] < 0)
+ re_set_fastmap (fastmap, icase, i);
+ }
+# endif /* _LIBC */
+
+ /* See if we have to start the match at all multibyte characters,
+ i.e. where we would not find an invalid sequence. This only
+ applies to multibyte character sets; for single byte character
+ sets, the SIMPLE_BRACKET again suffices. */
+ if (dfa->mb_cur_max > 1
+ && (cset->nchar_classes || cset->non_match || cset->nranges
+# ifdef _LIBC
+ || cset->nequiv_classes
+# endif /* _LIBC */
+ ))
+ {
+ unsigned char c = 0;
+ do
+ {
+ mbstate_t mbs;
+ memset (&mbs, 0, sizeof (mbs));
+ if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2)
+ re_set_fastmap (fastmap, false, (int) c);
+ }
+ while (++c != 0);
+ }
+
+ else
+ {
+ /* ... Else catch all bytes which can start the mbchars. */
+ for (i = 0; i < cset->nmbchars; ++i)
+ {
+ char buf[256];
+ mbstate_t state;
+ memset (&state, '\0', sizeof (state));
+ if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
+ re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
+ if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
+ {
+ if (__wcrtomb (buf, towlower (cset->mbchars[i]), &state)
+ != (size_t) -1)
+ re_set_fastmap (fastmap, false, *(unsigned char *) buf);
+ }
+ }
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ else if (type == OP_PERIOD
+#ifdef RE_ENABLE_I18N
+ || type == OP_UTF8_PERIOD
+#endif /* RE_ENABLE_I18N */
+ || type == END_OF_RE)
+ {
+ memset (fastmap, '\1', sizeof (char) * SBC_MAX);
+ if (type == END_OF_RE)
+ bufp->can_be_null = 1;
+ return;
+ }
+ }
+}
+
+/* Entry point for POSIX code. */
+/* regcomp takes a regular expression as a string and compiles it.
+
+ PREG is a regex_t *. We do not expect any fields to be initialized,
+ since POSIX says we shouldn't. Thus, we set
+
+ `buffer' to the compiled pattern;
+ `used' to the length of the compiled pattern;
+ `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+ REG_EXTENDED bit in CFLAGS is set; otherwise, to
+ RE_SYNTAX_POSIX_BASIC;
+ `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+ `fastmap' to an allocated space for the fastmap;
+ `fastmap_accurate' to zero;
+ `re_nsub' to the number of subexpressions in PATTERN.
+
+ PATTERN is the address of the pattern string.
+
+ CFLAGS is a series of bits which affect compilation.
+
+ If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+ use POSIX basic syntax.
+
+ If REG_NEWLINE is set, then . and [^...] don't match newline.
+ Also, regexec will try a match beginning after every newline.
+
+ If REG_ICASE is set, then we considers upper- and lowercase
+ versions of letters to be equivalent when matching.
+
+ If REG_NOSUB is set, then when PREG is passed to regexec, that
+ routine will report only success or failure, and nothing about the
+ registers.
+
+ It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for
+ the return codes and their meanings.) */
+
+int
+regcomp (preg, pattern, cflags)
+ regex_t *_Restrict_ preg;
+ const char *_Restrict_ pattern;
+ int cflags;
+{
+ reg_errcode_t ret;
+ reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED
+ : RE_SYNTAX_POSIX_BASIC);
+
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ preg->used = 0;
+
+ /* Try to allocate space for the fastmap. */
+ preg->fastmap = re_malloc (char, SBC_MAX);
+ if (BE (preg->fastmap == NULL, 0))
+ return REG_ESPACE;
+
+ syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0;
+
+ /* If REG_NEWLINE is set, newlines are treated differently. */
+ if (cflags & REG_NEWLINE)
+ { /* REG_NEWLINE implies neither . nor [^...] match newline. */
+ syntax &= ~RE_DOT_NEWLINE;
+ syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+ /* It also changes the matching behavior. */
+ preg->newline_anchor = 1;
+ }
+ else
+ preg->newline_anchor = 0;
+ preg->no_sub = !!(cflags & REG_NOSUB);
+ preg->translate = NULL;
+
+ ret = re_compile_internal (preg, pattern, strlen (pattern), syntax);
+
+ /* POSIX doesn't distinguish between an unmatched open-group and an
+ unmatched close-group: both are REG_EPAREN. */
+ if (ret == REG_ERPAREN)
+ ret = REG_EPAREN;
+
+ /* We have already checked preg->fastmap != NULL. */
+ if (BE (ret == REG_NOERROR, 1))
+ /* Compute the fastmap now, since regexec cannot modify the pattern
+ buffer. This function never fails in this implementation. */
+ (void) re_compile_fastmap (preg);
+ else
+ {
+ /* Some error occurred while compiling the expression. */
+ re_free (preg->fastmap);
+ preg->fastmap = NULL;
+ }
+
+ return (int) ret;
+}
+#ifdef _LIBC
+weak_alias (__regcomp, regcomp)
+#endif
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+ from either regcomp or regexec. We don't use PREG here. */
+
+#ifdef _LIBC
+size_t
+regerror (errcode, preg, errbuf, errbuf_size)
+ int errcode;
+ const regex_t *_Restrict_ preg;
+ char *_Restrict_ errbuf;
+ size_t errbuf_size;
+#else /* size_t might promote */
+size_t
+regerror (int errcode, const regex_t *_Restrict_ preg,
+ char *_Restrict_ errbuf, size_t errbuf_size)
+#endif
+{
+ const char *msg;
+ size_t msg_size;
+
+ if (BE (errcode < 0
+ || errcode >= (int) (sizeof (__re_error_msgid_idx)
+ / sizeof (__re_error_msgid_idx[0])), 0))
+ /* Only error codes returned by the rest of the code should be passed
+ to this routine. If we are given anything else, or if other regex
+ code generates an invalid error code, then the program has a bug.
+ Dump core so we can fix it. */
+ abort ();
+
+ msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
+
+ msg_size = strlen (msg) + 1; /* Includes the null. */
+
+ if (BE (errbuf_size != 0, 1))
+ {
+ size_t cpy_size = msg_size;
+ if (BE (msg_size > errbuf_size, 0))
+ {
+ cpy_size = errbuf_size - 1;
+ errbuf[cpy_size] = '\0';
+ }
+ memcpy (errbuf, msg, cpy_size);
+ }
+
+ return msg_size;
+}
+#ifdef _LIBC
+weak_alias (__regerror, regerror)
+#endif
+
+
+#ifdef RE_ENABLE_I18N
+/* This static array is used for the map to single-byte characters when
+ UTF-8 is used. Otherwise we would allocate memory just to initialize
+ it the same all the time. UTF-8 is the preferred encoding so this is
+ a worthwhile optimization. */
+static const bitset_t utf8_sb_map =
+{
+ /* Set the first 128 bits. */
+# if 4 * BITSET_WORD_BITS < ASCII_CHARS
+# error "bitset_word_t is narrower than 32 bits"
+# elif 3 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX, BITSET_WORD_MAX, BITSET_WORD_MAX,
+# elif 2 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX, BITSET_WORD_MAX,
+# elif 1 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX,
+# endif
+ (BITSET_WORD_MAX
+ >> (SBC_MAX % BITSET_WORD_BITS == 0
+ ? 0
+ : BITSET_WORD_BITS - SBC_MAX % BITSET_WORD_BITS))
+};
+#endif
+
+
+static void
+free_dfa_content (re_dfa_t *dfa)
+{
+ Idx i, j;
+
+ if (dfa->nodes)
+ for (i = 0; i < dfa->nodes_len; ++i)
+ free_token (dfa->nodes + i);
+ re_free (dfa->nexts);
+ for (i = 0; i < dfa->nodes_len; ++i)
+ {
+ if (dfa->eclosures != NULL)
+ re_node_set_free (dfa->eclosures + i);
+ if (dfa->inveclosures != NULL)
+ re_node_set_free (dfa->inveclosures + i);
+ if (dfa->edests != NULL)
+ re_node_set_free (dfa->edests + i);
+ }
+ re_free (dfa->edests);
+ re_free (dfa->eclosures);
+ re_free (dfa->inveclosures);
+ re_free (dfa->nodes);
+
+ if (dfa->state_table)
+ for (i = 0; i <= dfa->state_hash_mask; ++i)
+ {
+ struct re_state_table_entry *entry = dfa->state_table + i;
+ for (j = 0; j < entry->num; ++j)
+ {
+ re_dfastate_t *state = entry->array[j];
+ free_state (state);
+ }
+ re_free (entry->array);
+ }
+ re_free (dfa->state_table);
+#ifdef RE_ENABLE_I18N
+ if (dfa->sb_char != utf8_sb_map)
+ re_free (dfa->sb_char);
+#endif
+ re_free (dfa->subexp_map);
+#ifdef DEBUG
+ re_free (dfa->re_str);
+#endif
+
+ re_free (dfa);
+}
+
+
+/* Free dynamically allocated space used by PREG. */
+
+void
+regfree (preg)
+ regex_t *preg;
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ if (BE (dfa != NULL, 1))
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+
+ re_free (preg->fastmap);
+ preg->fastmap = NULL;
+
+ re_free (preg->translate);
+ preg->translate = NULL;
+}
+#ifdef _LIBC
+weak_alias (__regfree, regfree)
+#endif
+
+/* Entry points compatible with 4.2 BSD regex library. We don't define
+ them unless specifically requested. */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+
+/* BSD has one and only one pattern buffer. */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+# ifdef _LIBC
+/* Make these definitions weak in libc, so POSIX programs can redefine
+ these names if they don't use our functions, and still use
+ regcomp/regexec above without link errors. */
+weak_function
+# endif
+re_comp (s)
+ const char *s;
+{
+ reg_errcode_t ret;
+ char *fastmap;
+
+ if (!s)
+ {
+ if (!re_comp_buf.buffer)
+ return gettext ("No previous regular expression");
+ return 0;
+ }
+
+ if (re_comp_buf.buffer)
+ {
+ fastmap = re_comp_buf.fastmap;
+ re_comp_buf.fastmap = NULL;
+ __regfree (&re_comp_buf);
+ memset (&re_comp_buf, '\0', sizeof (re_comp_buf));
+ re_comp_buf.fastmap = fastmap;
+ }
+
+ if (re_comp_buf.fastmap == NULL)
+ {
+ re_comp_buf.fastmap = (char *) malloc (SBC_MAX);
+ if (re_comp_buf.fastmap == NULL)
+ return (char *) gettext (__re_error_msgid
+ + __re_error_msgid_idx[(int) REG_ESPACE]);
+ }
+
+ /* Since `re_exec' always passes NULL for the `regs' argument, we
+ don't need to initialize the pattern buffer fields which affect it. */
+
+ /* Match anchors at newlines. */
+ re_comp_buf.newline_anchor = 1;
+
+ ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options);
+
+ if (!ret)
+ return NULL;
+
+ /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */
+ return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+
+#ifdef _LIBC
+libc_freeres_fn (free_mem)
+{
+ __regfree (&re_comp_buf);
+}
+#endif
+
+#endif /* _REGEX_RE_COMP */
+
+/* Internal entry point.
+ Compile the regular expression PATTERN, whose length is LENGTH.
+ SYNTAX indicate regular expression's syntax. */
+
+static reg_errcode_t
+re_compile_internal (regex_t *preg, const char * pattern, size_t length,
+ reg_syntax_t syntax)
+{
+ reg_errcode_t err = REG_NOERROR;
+ re_dfa_t *dfa;
+ re_string_t regexp;
+
+ /* Initialize the pattern buffer. */
+ preg->fastmap_accurate = 0;
+ preg->syntax = syntax;
+ preg->not_bol = preg->not_eol = 0;
+ preg->used = 0;
+ preg->re_nsub = 0;
+ preg->can_be_null = 0;
+ preg->regs_allocated = REGS_UNALLOCATED;
+
+ /* Initialize the dfa. */
+ dfa = (re_dfa_t *) preg->buffer;
+ if (BE (preg->allocated < sizeof (re_dfa_t), 0))
+ {
+ /* If zero allocated, but buffer is non-null, try to realloc
+ enough space. This loses if buffer's address is bogus, but
+ that is the user's responsibility. If ->buffer is NULL this
+ is a simple allocation. */
+ dfa = re_realloc (preg->buffer, re_dfa_t, 1);
+ if (dfa == NULL)
+ return REG_ESPACE;
+ preg->allocated = sizeof (re_dfa_t);
+ preg->buffer = (unsigned char *) dfa;
+ }
+ preg->used = sizeof (re_dfa_t);
+
+ err = init_dfa (dfa, length);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ return err;
+ }
+#ifdef DEBUG
+ /* Note: length+1 will not overflow since it is checked in init_dfa. */
+ dfa->re_str = re_malloc (char, length + 1);
+ strncpy (dfa->re_str, pattern, length + 1);
+#endif
+
+ __libc_lock_init (dfa->lock);
+
+ err = re_string_construct (&regexp, pattern, length, preg->translate,
+ (syntax & RE_ICASE) != 0, dfa);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_compile_internal_free_return:
+ free_workarea_compile (preg);
+ re_string_destruct (&regexp);
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ return err;
+ }
+
+ /* Parse the regular expression, and build a structure tree. */
+ preg->re_nsub = 0;
+ dfa->str_tree = parse (&regexp, preg, syntax, &err);
+ if (BE (dfa->str_tree == NULL, 0))
+ goto re_compile_internal_free_return;
+
+ /* Analyze the tree and create the nfa. */
+ err = analyze (preg);
+ if (BE (err != REG_NOERROR, 0))
+ goto re_compile_internal_free_return;
+
+#ifdef RE_ENABLE_I18N
+ /* If possible, do searching in single byte encoding to speed things up. */
+ if (dfa->is_utf8 && !(syntax & RE_ICASE) && preg->translate == NULL)
+ optimize_utf8 (dfa);
+#endif
+
+ /* Then create the initial state of the dfa. */
+ err = create_initial_state (dfa);
+
+ /* Release work areas. */
+ free_workarea_compile (preg);
+ re_string_destruct (&regexp);
+
+ if (BE (err != REG_NOERROR, 0))
+ {
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ }
+
+ return err;
+}
+
+/* Initialize DFA. We use the length of the regular expression PAT_LEN
+ as the initial length of some arrays. */
+
+static reg_errcode_t
+init_dfa (re_dfa_t *dfa, size_t pat_len)
+{
+ __re_size_t table_size;
+#ifndef _LIBC
+ char *codeset_name;
+#endif
+#ifdef RE_ENABLE_I18N
+ size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t));
+#else
+ size_t max_i18n_object_size = 0;
+#endif
+ size_t max_object_size =
+ MAX (sizeof (struct re_state_table_entry),
+ MAX (sizeof (re_token_t),
+ MAX (sizeof (re_node_set),
+ MAX (sizeof (regmatch_t),
+ max_i18n_object_size))));
+
+ memset (dfa, '\0', sizeof (re_dfa_t));
+
+ /* Force allocation of str_tree_storage the first time. */
+ dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
+
+ /* Avoid overflows. The extra "/ 2" is for the table_size doubling
+ calculation below, and for similar doubling calculations
+ elsewhere. And it's <= rather than <, because some of the
+ doubling calculations add 1 afterwards. */
+ if (BE (SIZE_MAX / max_object_size / 2 <= pat_len, 0))
+ return REG_ESPACE;
+
+ dfa->nodes_alloc = pat_len + 1;
+ dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc);
+
+ /* table_size = 2 ^ ceil(log pat_len) */
+ for (table_size = 1; ; table_size <<= 1)
+ if (table_size > pat_len)
+ break;
+
+ dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size);
+ dfa->state_hash_mask = table_size - 1;
+
+ dfa->mb_cur_max = MB_CUR_MAX;
+#ifdef _LIBC
+ if (dfa->mb_cur_max == 6
+ && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0)
+ dfa->is_utf8 = 1;
+ dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII)
+ != 0);
+#else
+ codeset_name = nl_langinfo (CODESET);
+ if (strcasecmp (codeset_name, "UTF-8") == 0
+ || strcasecmp (codeset_name, "UTF8") == 0)
+ dfa->is_utf8 = 1;
+
+ /* We check exhaustively in the loop below if this charset is a
+ superset of ASCII. */
+ dfa->map_notascii = 0;
+#endif
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ if (dfa->is_utf8)
+ dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map;
+ else
+ {
+ int i, j, ch;
+
+ dfa->sb_char = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+ if (BE (dfa->sb_char == NULL, 0))
+ return REG_ESPACE;
+
+ /* Set the bits corresponding to single byte chars. */
+ for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ {
+ wint_t wch = __btowc (ch);
+ if (wch != WEOF)
+ dfa->sb_char[i] |= (bitset_word_t) 1 << j;
+# ifndef _LIBC
+ if (isascii (ch) && wch != ch)
+ dfa->map_notascii = 1;
+# endif
+ }
+ }
+ }
+#endif
+
+ if (BE (dfa->nodes == NULL || dfa->state_table == NULL, 0))
+ return REG_ESPACE;
+ return REG_NOERROR;
+}
+
+/* Initialize WORD_CHAR table, which indicate which character is
+ "word". In this case "word" means that it is the word construction
+ character used by some operators like "\<", "\>", etc. */
+
+static void
+internal_function
+init_word_char (re_dfa_t *dfa)
+{
+ int i, j, ch;
+ dfa->word_ops_used = 1;
+ for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ if (isalnum (ch) || ch == '_')
+ dfa->word_char[i] |= (bitset_word_t) 1 << j;
+}
+
+/* Free the work area which are only used while compiling. */
+
+static void
+free_workarea_compile (regex_t *preg)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_storage_t *storage, *next;
+ for (storage = dfa->str_tree_storage; storage; storage = next)
+ {
+ next = storage->next;
+ re_free (storage);
+ }
+ dfa->str_tree_storage = NULL;
+ dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
+ dfa->str_tree = NULL;
+ re_free (dfa->org_indices);
+ dfa->org_indices = NULL;
+}
+
+/* Create initial states for all contexts. */
+
+static reg_errcode_t
+create_initial_state (re_dfa_t *dfa)
+{
+ Idx first, i;
+ reg_errcode_t err;
+ re_node_set init_nodes;
+
+ /* Initial states have the epsilon closure of the node which is
+ the first node of the regular expression. */
+ first = dfa->str_tree->first->node_idx;
+ dfa->init_node = first;
+ err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* The back-references which are in initial states can epsilon transit,
+ since in this case all of the subexpressions can be null.
+ Then we add epsilon closures of the nodes which are the next nodes of
+ the back-references. */
+ if (dfa->nbackref > 0)
+ for (i = 0; i < init_nodes.nelem; ++i)
+ {
+ Idx node_idx = init_nodes.elems[i];
+ re_token_type_t type = dfa->nodes[node_idx].type;
+
+ Idx clexp_idx;
+ if (type != OP_BACK_REF)
+ continue;
+ for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx)
+ {
+ re_token_t *clexp_node;
+ clexp_node = dfa->nodes + init_nodes.elems[clexp_idx];
+ if (clexp_node->type == OP_CLOSE_SUBEXP
+ && clexp_node->opr.idx == dfa->nodes[node_idx].opr.idx)
+ break;
+ }
+ if (clexp_idx == init_nodes.nelem)
+ continue;
+
+ if (type == OP_BACK_REF)
+ {
+ Idx dest_idx = dfa->edests[node_idx].elems[0];
+ if (!re_node_set_contains (&init_nodes, dest_idx))
+ {
+ reg_errcode_t merge_err
+ = re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx);
+ if (merge_err != REG_NOERROR)
+ return merge_err;
+ i = 0;
+ }
+ }
+ }
+
+ /* It must be the first time to invoke acquire_state. */
+ dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0);
+ /* We don't check ERR here, since the initial state must not be NULL. */
+ if (BE (dfa->init_state == NULL, 0))
+ return err;
+ if (dfa->init_state->has_constraint)
+ {
+ dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes,
+ CONTEXT_WORD);
+ dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes,
+ CONTEXT_NEWLINE);
+ dfa->init_state_begbuf = re_acquire_state_context (&err, dfa,
+ &init_nodes,
+ CONTEXT_NEWLINE
+ | CONTEXT_BEGBUF);
+ if (BE (dfa->init_state_word == NULL || dfa->init_state_nl == NULL
+ || dfa->init_state_begbuf == NULL, 0))
+ return err;
+ }
+ else
+ dfa->init_state_word = dfa->init_state_nl
+ = dfa->init_state_begbuf = dfa->init_state;
+
+ re_node_set_free (&init_nodes);
+ return REG_NOERROR;
+}
+
+#ifdef RE_ENABLE_I18N
+/* If it is possible to do searching in single byte encoding instead of UTF-8
+ to speed things up, set dfa->mb_cur_max to 1, clear is_utf8 and change
+ DFA nodes where needed. */
+
+static void
+optimize_utf8 (re_dfa_t *dfa)
+{
+ Idx node;
+ int i;
+ bool mb_chars = false;
+ bool has_period = false;
+
+ for (node = 0; node < dfa->nodes_len; ++node)
+ switch (dfa->nodes[node].type)
+ {
+ case CHARACTER:
+ if (dfa->nodes[node].opr.c >= ASCII_CHARS)
+ mb_chars = true;
+ break;
+ case ANCHOR:
+ switch (dfa->nodes[node].opr.ctx_type)
+ {
+ case LINE_FIRST:
+ case LINE_LAST:
+ case BUF_FIRST:
+ case BUF_LAST:
+ break;
+ default:
+ /* Word anchors etc. cannot be handled. It's okay to test
+ opr.ctx_type since constraints (for all DFA nodes) are
+ created by ORing one or more opr.ctx_type values. */
+ return;
+ }
+ break;
+ case OP_PERIOD:
+ has_period = true;
+ break;
+ case OP_BACK_REF:
+ case OP_ALT:
+ case END_OF_RE:
+ case OP_DUP_ASTERISK:
+ case OP_OPEN_SUBEXP:
+ case OP_CLOSE_SUBEXP:
+ break;
+ case COMPLEX_BRACKET:
+ return;
+ case SIMPLE_BRACKET:
+ /* Just double check. */
+ {
+ int rshift = (ASCII_CHARS % BITSET_WORD_BITS == 0
+ ? 0
+ : BITSET_WORD_BITS - ASCII_CHARS % BITSET_WORD_BITS);
+ for (i = ASCII_CHARS / BITSET_WORD_BITS; i < BITSET_WORDS; ++i)
+ {
+ if (dfa->nodes[node].opr.sbcset[i] >> rshift != 0)
+ return;
+ rshift = 0;
+ }
+ }
+ break;
+ default:
+ abort ();
+ }
+
+ if (mb_chars || has_period)
+ for (node = 0; node < dfa->nodes_len; ++node)
+ {
+ if (dfa->nodes[node].type == CHARACTER
+ && dfa->nodes[node].opr.c >= ASCII_CHARS)
+ dfa->nodes[node].mb_partial = 0;
+ else if (dfa->nodes[node].type == OP_PERIOD)
+ dfa->nodes[node].type = OP_UTF8_PERIOD;
+ }
+
+ /* The search can be in single byte locale. */
+ dfa->mb_cur_max = 1;
+ dfa->is_utf8 = 0;
+ dfa->has_mb_node = dfa->nbackref > 0 || has_period;
+}
+#endif
+
+/* Analyze the structure tree, and calculate "first", "next", "edest",
+ "eclosure", and "inveclosure". */
+
+static reg_errcode_t
+analyze (regex_t *preg)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ reg_errcode_t ret;
+
+ /* Allocate arrays. */
+ dfa->nexts = re_malloc (Idx, dfa->nodes_alloc);
+ dfa->org_indices = re_malloc (Idx, dfa->nodes_alloc);
+ dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc);
+ dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc);
+ if (BE (dfa->nexts == NULL || dfa->org_indices == NULL || dfa->edests == NULL
+ || dfa->eclosures == NULL, 0))
+ return REG_ESPACE;
+
+ dfa->subexp_map = re_malloc (Idx, preg->re_nsub);
+ if (dfa->subexp_map != NULL)
+ {
+ Idx i;
+ for (i = 0; i < preg->re_nsub; i++)
+ dfa->subexp_map[i] = i;
+ preorder (dfa->str_tree, optimize_subexps, dfa);
+ for (i = 0; i < preg->re_nsub; i++)
+ if (dfa->subexp_map[i] != i)
+ break;
+ if (i == preg->re_nsub)
+ {
+ free (dfa->subexp_map);
+ dfa->subexp_map = NULL;
+ }
+ }
+
+ ret = postorder (dfa->str_tree, lower_subexps, preg);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ ret = postorder (dfa->str_tree, calc_first, dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ preorder (dfa->str_tree, calc_next, dfa);
+ ret = preorder (dfa->str_tree, link_nfa_nodes, dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ ret = calc_eclosure (dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+
+ /* We only need this during the prune_impossible_nodes pass in regexec.c;
+ skip it if p_i_n will not run, as calc_inveclosure can be quadratic. */
+ if ((!preg->no_sub && preg->re_nsub > 0 && dfa->has_plural_match)
+ || dfa->nbackref)
+ {
+ dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len);
+ if (BE (dfa->inveclosures == NULL, 0))
+ return REG_ESPACE;
+ ret = calc_inveclosure (dfa);
+ }
+
+ return ret;
+}
+
+/* Our parse trees are very unbalanced, so we cannot use a stack to
+ implement parse tree visits. Instead, we use parent pointers and
+ some hairy code in these two functions. */
+static reg_errcode_t
+postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra)
+{
+ bin_tree_t *node, *prev;
+
+ for (node = root; ; )
+ {
+ /* Descend down the tree, preferably to the left (or to the right
+ if that's the only child). */
+ while (node->left || node->right)
+ if (node->left)
+ node = node->left;
+ else
+ node = node->right;
+
+ do
+ {
+ reg_errcode_t err = fn (extra, node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ if (node->parent == NULL)
+ return REG_NOERROR;
+ prev = node;
+ node = node->parent;
+ }
+ /* Go up while we have a node that is reached from the right. */
+ while (node->right == prev || node->right == NULL);
+ node = node->right;
+ }
+}
+
+static reg_errcode_t
+preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra)
+{
+ bin_tree_t *node;
+
+ for (node = root; ; )
+ {
+ reg_errcode_t err = fn (extra, node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* Go to the left node, or up and to the right. */
+ if (node->left)
+ node = node->left;
+ else
+ {
+ bin_tree_t *prev = NULL;
+ while (node->right == prev || node->right == NULL)
+ {
+ prev = node;
+ node = node->parent;
+ if (!node)
+ return REG_NOERROR;
+ }
+ node = node->right;
+ }
+ }
+}
+
+/* Optimization pass: if a SUBEXP is entirely contained, strip it and tell
+ re_search_internal to map the inner one's opr.idx to this one's. Adjust
+ backreferences as well. Requires a preorder visit. */
+static reg_errcode_t
+optimize_subexps (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+
+ if (node->token.type == OP_BACK_REF && dfa->subexp_map)
+ {
+ int idx = node->token.opr.idx;
+ node->token.opr.idx = dfa->subexp_map[idx];
+ dfa->used_bkref_map |= 1 << node->token.opr.idx;
+ }
+
+ else if (node->token.type == SUBEXP
+ && node->left && node->left->token.type == SUBEXP)
+ {
+ Idx other_idx = node->left->token.opr.idx;
+
+ node->left = node->left->left;
+ if (node->left)
+ node->left->parent = node;
+
+ dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx];
+ if (other_idx < BITSET_WORD_BITS)
+ dfa->used_bkref_map &= ~((bitset_word_t) 1 << other_idx);
+ }
+
+ return REG_NOERROR;
+}
+
+/* Lowering pass: Turn each SUBEXP node into the appropriate concatenation
+ of OP_OPEN_SUBEXP, the body of the SUBEXP (if any) and OP_CLOSE_SUBEXP. */
+static reg_errcode_t
+lower_subexps (void *extra, bin_tree_t *node)
+{
+ regex_t *preg = (regex_t *) extra;
+ reg_errcode_t err = REG_NOERROR;
+
+ if (node->left && node->left->token.type == SUBEXP)
+ {
+ node->left = lower_subexp (&err, preg, node->left);
+ if (node->left)
+ node->left->parent = node;
+ }
+ if (node->right && node->right->token.type == SUBEXP)
+ {
+ node->right = lower_subexp (&err, preg, node->right);
+ if (node->right)
+ node->right->parent = node;
+ }
+
+ return err;
+}
+
+static bin_tree_t *
+lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *body = node->left;
+ bin_tree_t *op, *cls, *tree1, *tree;
+
+ if (preg->no_sub
+ /* We do not optimize empty subexpressions, because otherwise we may
+ have bad CONCAT nodes with NULL children. This is obviously not
+ very common, so we do not lose much. An example that triggers
+ this case is the sed "script" /\(\)/x. */
+ && node->left != NULL
+ && (node->token.opr.idx >= BITSET_WORD_BITS
+ || !(dfa->used_bkref_map
+ & ((bitset_word_t) 1 << node->token.opr.idx))))
+ return node->left;
+
+ /* Convert the SUBEXP node to the concatenation of an
+ OP_OPEN_SUBEXP, the contents, and an OP_CLOSE_SUBEXP. */
+ op = create_tree (dfa, NULL, NULL, OP_OPEN_SUBEXP);
+ cls = create_tree (dfa, NULL, NULL, OP_CLOSE_SUBEXP);
+ tree1 = body ? create_tree (dfa, body, cls, CONCAT) : cls;
+ tree = create_tree (dfa, op, tree1, CONCAT);
+ if (BE (tree == NULL || tree1 == NULL || op == NULL || cls == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ op->token.opr.idx = cls->token.opr.idx = node->token.opr.idx;
+ op->token.opt_subexp = cls->token.opt_subexp = node->token.opt_subexp;
+ return tree;
+}
+
+/* Pass 1 in building the NFA: compute FIRST and create unlinked automaton
+ nodes. Requires a postorder visit. */
+static reg_errcode_t
+calc_first (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+ if (node->token.type == CONCAT)
+ {
+ node->first = node->left->first;
+ node->node_idx = node->left->node_idx;
+ }
+ else
+ {
+ node->first = node;
+ node->node_idx = re_dfa_add_node (dfa, node->token);
+ if (BE (node->node_idx == REG_MISSING, 0))
+ return REG_ESPACE;
+ if (node->token.type == ANCHOR)
+ dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type;
+ }
+ return REG_NOERROR;
+}
+
+/* Pass 2: compute NEXT on the tree. Preorder visit. */
+static reg_errcode_t
+calc_next (void *extra, bin_tree_t *node)
+{
+ switch (node->token.type)
+ {
+ case OP_DUP_ASTERISK:
+ node->left->next = node;
+ break;
+ case CONCAT:
+ node->left->next = node->right->first;
+ node->right->next = node->next;
+ break;
+ default:
+ if (node->left)
+ node->left->next = node->next;
+ if (node->right)
+ node->right->next = node->next;
+ break;
+ }
+ return REG_NOERROR;
+}
+
+/* Pass 3: link all DFA nodes to their NEXT node (any order will do). */
+static reg_errcode_t
+link_nfa_nodes (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+ Idx idx = node->node_idx;
+ reg_errcode_t err = REG_NOERROR;
+
+ switch (node->token.type)
+ {
+ case CONCAT:
+ break;
+
+ case END_OF_RE:
+ assert (node->next == NULL);
+ break;
+
+ case OP_DUP_ASTERISK:
+ case OP_ALT:
+ {
+ Idx left, right;
+ dfa->has_plural_match = 1;
+ if (node->left != NULL)
+ left = node->left->first->node_idx;
+ else
+ left = node->next->node_idx;
+ if (node->right != NULL)
+ right = node->right->first->node_idx;
+ else
+ right = node->next->node_idx;
+ assert (REG_VALID_INDEX (left));
+ assert (REG_VALID_INDEX (right));
+ err = re_node_set_init_2 (dfa->edests + idx, left, right);
+ }
+ break;
+
+ case ANCHOR:
+ case OP_OPEN_SUBEXP:
+ case OP_CLOSE_SUBEXP:
+ err = re_node_set_init_1 (dfa->edests + idx, node->next->node_idx);
+ break;
+
+ case OP_BACK_REF:
+ dfa->nexts[idx] = node->next->node_idx;
+ if (node->token.type == OP_BACK_REF)
+ err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]);
+ break;
+
+ default:
+ assert (!IS_EPSILON_NODE (node->token.type));
+ dfa->nexts[idx] = node->next->node_idx;
+ break;
+ }
+
+ return err;
+}
+
+/* Duplicate the epsilon closure of the node ROOT_NODE.
+ Note that duplicated nodes have constraint INIT_CONSTRAINT in addition
+ to their own constraint. */
+
+static reg_errcode_t
+internal_function
+duplicate_node_closure (re_dfa_t *dfa, Idx top_org_node, Idx top_clone_node,
+ Idx root_node, unsigned int init_constraint)
+{
+ Idx org_node, clone_node;
+ bool ok;
+ unsigned int constraint = init_constraint;
+ for (org_node = top_org_node, clone_node = top_clone_node;;)
+ {
+ Idx org_dest, clone_dest;
+ if (dfa->nodes[org_node].type == OP_BACK_REF)
+ {
+ /* If the back reference epsilon-transit, its destination must
+ also have the constraint. Then duplicate the epsilon closure
+ of the destination of the back reference, and store it in
+ edests of the back reference. */
+ org_dest = dfa->nexts[org_node];
+ re_node_set_empty (dfa->edests + clone_node);
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ dfa->nexts[clone_node] = dfa->nexts[org_node];
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ else if (dfa->edests[org_node].nelem == 0)
+ {
+ /* In case of the node can't epsilon-transit, don't duplicate the
+ destination and store the original destination as the
+ destination of the node. */
+ dfa->nexts[clone_node] = dfa->nexts[org_node];
+ break;
+ }
+ else if (dfa->edests[org_node].nelem == 1)
+ {
+ /* In case of the node can epsilon-transit, and it has only one
+ destination. */
+ org_dest = dfa->edests[org_node].elems[0];
+ re_node_set_empty (dfa->edests + clone_node);
+ /* If the node is root_node itself, it means the epsilon closure
+ has a loop. Then tie it to the destination of the root_node. */
+ if (org_node == root_node && clone_node != org_node)
+ {
+ ok = re_node_set_insert (dfa->edests + clone_node, org_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ break;
+ }
+ /* In case the node has another constraint, append it. */
+ constraint |= dfa->nodes[org_node].constraint;
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ else /* dfa->edests[org_node].nelem == 2 */
+ {
+ /* In case of the node can epsilon-transit, and it has two
+ destinations. In the bin_tree_t and DFA, that's '|' and '*'. */
+ org_dest = dfa->edests[org_node].elems[0];
+ re_node_set_empty (dfa->edests + clone_node);
+ /* Search for a duplicated node which satisfies the constraint. */
+ clone_dest = search_duplicated_node (dfa, org_dest, constraint);
+ if (clone_dest == REG_MISSING)
+ {
+ /* There is no such duplicated node, create a new one. */
+ reg_errcode_t err;
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ err = duplicate_node_closure (dfa, org_dest, clone_dest,
+ root_node, constraint);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ else
+ {
+ /* There is a duplicated node which satisfies the constraint,
+ use it to avoid infinite loop. */
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+
+ org_dest = dfa->edests[org_node].elems[1];
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ org_node = org_dest;
+ clone_node = clone_dest;
+ }
+ return REG_NOERROR;
+}
+
+/* Search for a node which is duplicated from the node ORG_NODE, and
+ satisfies the constraint CONSTRAINT. */
+
+static Idx
+search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
+ unsigned int constraint)
+{
+ Idx idx;
+ for (idx = dfa->nodes_len - 1; dfa->nodes[idx].duplicated && idx > 0; --idx)
+ {
+ if (org_node == dfa->org_indices[idx]
+ && constraint == dfa->nodes[idx].constraint)
+ return idx; /* Found. */
+ }
+ return REG_MISSING; /* Not found. */
+}
+
+/* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT.
+ Return the index of the new node, or REG_MISSING if insufficient storage is
+ available. */
+
+static Idx
+duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint)
+{
+ Idx dup_idx = re_dfa_add_node (dfa, dfa->nodes[org_idx]);
+ if (BE (dup_idx != REG_MISSING, 1))
+ {
+ dfa->nodes[dup_idx].constraint = constraint;
+ dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint;
+ dfa->nodes[dup_idx].duplicated = 1;
+
+ /* Store the index of the original node. */
+ dfa->org_indices[dup_idx] = org_idx;
+ }
+ return dup_idx;
+}
+
+static reg_errcode_t
+calc_inveclosure (re_dfa_t *dfa)
+{
+ Idx src, idx;
+ bool ok;
+ for (idx = 0; idx < dfa->nodes_len; ++idx)
+ re_node_set_init_empty (dfa->inveclosures + idx);
+
+ for (src = 0; src < dfa->nodes_len; ++src)
+ {
+ Idx *elems = dfa->eclosures[src].elems;
+ for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx)
+ {
+ ok = re_node_set_insert_last (dfa->inveclosures + elems[idx], src);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Calculate "eclosure" for all the node in DFA. */
+
+static reg_errcode_t
+calc_eclosure (re_dfa_t *dfa)
+{
+ Idx node_idx;
+ bool incomplete;
+#ifdef DEBUG
+ assert (dfa->nodes_len > 0);
+#endif
+ incomplete = false;
+ /* For each nodes, calculate epsilon closure. */
+ for (node_idx = 0; ; ++node_idx)
+ {
+ reg_errcode_t err;
+ re_node_set eclosure_elem;
+ if (node_idx == dfa->nodes_len)
+ {
+ if (!incomplete)
+ break;
+ incomplete = false;
+ node_idx = 0;
+ }
+
+#ifdef DEBUG
+ assert (dfa->eclosures[node_idx].nelem != REG_MISSING);
+#endif
+
+ /* If we have already calculated, skip it. */
+ if (dfa->eclosures[node_idx].nelem != 0)
+ continue;
+ /* Calculate epsilon closure of `node_idx'. */
+ err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, true);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ if (dfa->eclosures[node_idx].nelem == 0)
+ {
+ incomplete = true;
+ re_node_set_free (&eclosure_elem);
+ }
+ }
+ return REG_NOERROR;
+}
+
+/* Calculate epsilon closure of NODE. */
+
+static reg_errcode_t
+calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root)
+{
+ reg_errcode_t err;
+ Idx i;
+ re_node_set eclosure;
+ bool ok;
+ bool incomplete = false;
+ err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* This indicates that we are calculating this node now.
+ We reference this value to avoid infinite loop. */
+ dfa->eclosures[node].nelem = REG_MISSING;
+
+ /* If the current node has constraints, duplicate all nodes
+ since they must inherit the constraints. */
+ if (dfa->nodes[node].constraint
+ && dfa->edests[node].nelem
+ && !dfa->nodes[dfa->edests[node].elems[0]].duplicated)
+ {
+ err = duplicate_node_closure (dfa, node, node, node,
+ dfa->nodes[node].constraint);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ /* Expand each epsilon destination nodes. */
+ if (IS_EPSILON_NODE(dfa->nodes[node].type))
+ for (i = 0; i < dfa->edests[node].nelem; ++i)
+ {
+ re_node_set eclosure_elem;
+ Idx edest = dfa->edests[node].elems[i];
+ /* If calculating the epsilon closure of `edest' is in progress,
+ return intermediate result. */
+ if (dfa->eclosures[edest].nelem == REG_MISSING)
+ {
+ incomplete = true;
+ continue;
+ }
+ /* If we haven't calculated the epsilon closure of `edest' yet,
+ calculate now. Otherwise use calculated epsilon closure. */
+ if (dfa->eclosures[edest].nelem == 0)
+ {
+ err = calc_eclosure_iter (&eclosure_elem, dfa, edest, false);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ else
+ eclosure_elem = dfa->eclosures[edest];
+ /* Merge the epsilon closure of `edest'. */
+ err = re_node_set_merge (&eclosure, &eclosure_elem);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ /* If the epsilon closure of `edest' is incomplete,
+ the epsilon closure of this node is also incomplete. */
+ if (dfa->eclosures[edest].nelem == 0)
+ {
+ incomplete = true;
+ re_node_set_free (&eclosure_elem);
+ }
+ }
+
+ /* An epsilon closure includes itself. */
+ ok = re_node_set_insert (&eclosure, node);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ if (incomplete && !root)
+ dfa->eclosures[node].nelem = 0;
+ else
+ dfa->eclosures[node] = eclosure;
+ *new_set = eclosure;
+ return REG_NOERROR;
+}
+
+/* Functions for token which are used in the parser. */
+
+/* Fetch a token from INPUT.
+ We must not use this function inside bracket expressions. */
+
+static void
+internal_function
+fetch_token (re_token_t *result, re_string_t *input, reg_syntax_t syntax)
+{
+ re_string_skip_bytes (input, peek_token (result, input, syntax));
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+ We must not use this function inside bracket expressions. */
+
+static int
+internal_function
+peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
+{
+ unsigned char c;
+
+ if (re_string_eoi (input))
+ {
+ token->type = END_OF_RE;
+ return 0;
+ }
+
+ c = re_string_peek_byte (input, 0);
+ token->opr.c = c;
+
+ token->word_char = 0;
+#ifdef RE_ENABLE_I18N
+ token->mb_partial = 0;
+ if (input->mb_cur_max > 1 &&
+ !re_string_first_byte (input, re_string_cur_idx (input)))
+ {
+ token->type = CHARACTER;
+ token->mb_partial = 1;
+ return 1;
+ }
+#endif
+ if (c == '\\')
+ {
+ unsigned char c2;
+ if (re_string_cur_idx (input) + 1 >= re_string_length (input))
+ {
+ token->type = BACK_SLASH;
+ return 1;
+ }
+
+ c2 = re_string_peek_byte_case (input, 1);
+ token->opr.c = c2;
+ token->type = CHARACTER;
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc = re_string_wchar_at (input,
+ re_string_cur_idx (input) + 1);
+ token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
+ }
+ else
+#endif
+ token->word_char = IS_WORD_CHAR (c2) != 0;
+
+ switch (c2)
+ {
+ case '|':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR))
+ token->type = OP_ALT;
+ break;
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ if (!(syntax & RE_NO_BK_REFS))
+ {
+ token->type = OP_BACK_REF;
+ token->opr.idx = c2 - '1';
+ }
+ break;
+ case '<':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_FIRST;
+ }
+ break;
+ case '>':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_LAST;
+ }
+ break;
+ case 'b':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_DELIM;
+ }
+ break;
+ case 'B':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = NOT_WORD_DELIM;
+ }
+ break;
+ case 'w':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_WORD;
+ break;
+ case 'W':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_NOTWORD;
+ break;
+ case 's':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_SPACE;
+ break;
+ case 'S':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_NOTSPACE;
+ break;
+ case '`':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = BUF_FIRST;
+ }
+ break;
+ case '\'':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = BUF_LAST;
+ }
+ break;
+ case '(':
+ if (!(syntax & RE_NO_BK_PARENS))
+ token->type = OP_OPEN_SUBEXP;
+ break;
+ case ')':
+ if (!(syntax & RE_NO_BK_PARENS))
+ token->type = OP_CLOSE_SUBEXP;
+ break;
+ case '+':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_PLUS;
+ break;
+ case '?':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_QUESTION;
+ break;
+ case '{':
+ if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+ token->type = OP_OPEN_DUP_NUM;
+ break;
+ case '}':
+ if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+ token->type = OP_CLOSE_DUP_NUM;
+ break;
+ default:
+ break;
+ }
+ return 2;
+ }
+
+ token->type = CHARACTER;
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input));
+ token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
+ }
+ else
+#endif
+ token->word_char = IS_WORD_CHAR (token->opr.c);
+
+ switch (c)
+ {
+ case '\n':
+ if (syntax & RE_NEWLINE_ALT)
+ token->type = OP_ALT;
+ break;
+ case '|':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR))
+ token->type = OP_ALT;
+ break;
+ case '*':
+ token->type = OP_DUP_ASTERISK;
+ break;
+ case '+':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_PLUS;
+ break;
+ case '?':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_QUESTION;
+ break;
+ case '{':
+ if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+ token->type = OP_OPEN_DUP_NUM;
+ break;
+ case '}':
+ if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+ token->type = OP_CLOSE_DUP_NUM;
+ break;
+ case '(':
+ if (syntax & RE_NO_BK_PARENS)
+ token->type = OP_OPEN_SUBEXP;
+ break;
+ case ')':
+ if (syntax & RE_NO_BK_PARENS)
+ token->type = OP_CLOSE_SUBEXP;
+ break;
+ case '[':
+ token->type = OP_OPEN_BRACKET;
+ break;
+ case '.':
+ token->type = OP_PERIOD;
+ break;
+ case '^':
+ if (!(syntax & (RE_CONTEXT_INDEP_ANCHORS | RE_CARET_ANCHORS_HERE)) &&
+ re_string_cur_idx (input) != 0)
+ {
+ char prev = re_string_peek_byte (input, -1);
+ if (!(syntax & RE_NEWLINE_ALT) || prev != '\n')
+ break;
+ }
+ token->type = ANCHOR;
+ token->opr.ctx_type = LINE_FIRST;
+ break;
+ case '$':
+ if (!(syntax & RE_CONTEXT_INDEP_ANCHORS) &&
+ re_string_cur_idx (input) + 1 != re_string_length (input))
+ {
+ re_token_t next;
+ re_string_skip_bytes (input, 1);
+ peek_token (&next, input, syntax);
+ re_string_skip_bytes (input, -1);
+ if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP)
+ break;
+ }
+ token->type = ANCHOR;
+ token->opr.ctx_type = LINE_LAST;
+ break;
+ default:
+ break;
+ }
+ return 1;
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+ We must not use this function out of bracket expressions. */
+
+static int
+internal_function
+peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
+{
+ unsigned char c;
+ if (re_string_eoi (input))
+ {
+ token->type = END_OF_RE;
+ return 0;
+ }
+ c = re_string_peek_byte (input, 0);
+ token->opr.c = c;
+
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1 &&
+ !re_string_first_byte (input, re_string_cur_idx (input)))
+ {
+ token->type = CHARACTER;
+ return 1;
+ }
+#endif /* RE_ENABLE_I18N */
+
+ if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS)
+ && re_string_cur_idx (input) + 1 < re_string_length (input))
+ {
+ /* In this case, '\' escape a character. */
+ unsigned char c2;
+ re_string_skip_bytes (input, 1);
+ c2 = re_string_peek_byte (input, 0);
+ token->opr.c = c2;
+ token->type = CHARACTER;
+ return 1;
+ }
+ if (c == '[') /* '[' is a special char in a bracket exps. */
+ {
+ unsigned char c2;
+ int token_len;
+ if (re_string_cur_idx (input) + 1 < re_string_length (input))
+ c2 = re_string_peek_byte (input, 1);
+ else
+ c2 = 0;
+ token->opr.c = c2;
+ token_len = 2;
+ switch (c2)
+ {
+ case '.':
+ token->type = OP_OPEN_COLL_ELEM;
+ break;
+ case '=':
+ token->type = OP_OPEN_EQUIV_CLASS;
+ break;
+ case ':':
+ if (syntax & RE_CHAR_CLASSES)
+ {
+ token->type = OP_OPEN_CHAR_CLASS;
+ break;
+ }
+ /* else fall through. */
+ default:
+ token->type = CHARACTER;
+ token->opr.c = c;
+ token_len = 1;
+ break;
+ }
+ return token_len;
+ }
+ switch (c)
+ {
+ case '-':
+ token->type = OP_CHARSET_RANGE;
+ break;
+ case ']':
+ token->type = OP_CLOSE_BRACKET;
+ break;
+ case '^':
+ token->type = OP_NON_MATCH_LIST;
+ break;
+ default:
+ token->type = CHARACTER;
+ }
+ return 1;
+}
+
+/* Functions for parser. */
+
+/* Entry point of the parser.
+ Parse the regular expression REGEXP and return the structure tree.
+ If an error is occured, ERR is set by error code, and return NULL.
+ This function build the following tree, from regular expression <reg_exp>:
+ CAT
+ / \
+ / \
+ <reg_exp> EOR
+
+ CAT means concatenation.
+ EOR means end of regular expression. */
+
+static bin_tree_t *
+parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
+ reg_errcode_t *err)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree, *eor, *root;
+ re_token_t current_token;
+ dfa->syntax = syntax;
+ fetch_token (&current_token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+ tree = parse_reg_exp (regexp, preg, &current_token, syntax, 0, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ eor = create_tree (dfa, NULL, NULL, END_OF_RE);
+ if (tree != NULL)
+ root = create_tree (dfa, tree, eor, CONCAT);
+ else
+ root = eor;
+ if (BE (eor == NULL || root == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ return root;
+}
+
+/* This function build the following tree, from regular expression
+ <branch1>|<branch2>:
+ ALT
+ / \
+ / \
+ <branch1> <branch2>
+
+ ALT means alternative, which represents the operator `|'. */
+
+static bin_tree_t *
+parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree, *branch = NULL;
+ tree = parse_branch (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+
+ while (token->type == OP_ALT)
+ {
+ fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+ if (token->type != OP_ALT && token->type != END_OF_RE
+ && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+ {
+ branch = parse_branch (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && branch == NULL, 0))
+ return NULL;
+ }
+ else
+ branch = NULL;
+ tree = create_tree (dfa, tree, branch, OP_ALT);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ return tree;
+}
+
+/* This function build the following tree, from regular expression
+ <exp1><exp2>:
+ CAT
+ / \
+ / \
+ <exp1> <exp2>
+
+ CAT means concatenation. */
+
+static bin_tree_t *
+parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ bin_tree_t *tree, *expr;
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ tree = parse_expression (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+
+ while (token->type != OP_ALT && token->type != END_OF_RE
+ && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+ {
+ expr = parse_expression (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && expr == NULL, 0))
+ {
+ return NULL;
+ }
+ if (tree != NULL && expr != NULL)
+ {
+ tree = create_tree (dfa, tree, expr, CONCAT);
+ if (tree == NULL)
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ else if (tree == NULL)
+ tree = expr;
+ /* Otherwise expr == NULL, we don't need to create new tree. */
+ }
+ return tree;
+}
+
+/* This function build the following tree, from regular expression a*:
+ *
+ |
+ a
+*/
+
+static bin_tree_t *
+parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree;
+ switch (token->type)
+ {
+ case CHARACTER:
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ while (!re_string_eoi (regexp)
+ && !re_string_first_byte (regexp, re_string_cur_idx (regexp)))
+ {
+ bin_tree_t *mbc_remain;
+ fetch_token (token, regexp, syntax);
+ mbc_remain = create_token_tree (dfa, NULL, NULL, token);
+ tree = create_tree (dfa, tree, mbc_remain, CONCAT);
+ if (BE (mbc_remain == NULL || tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ }
+#endif
+ break;
+ case OP_OPEN_SUBEXP:
+ tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_OPEN_BRACKET:
+ tree = parse_bracket_exp (regexp, dfa, token, syntax, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_BACK_REF:
+ if (!BE (dfa->completed_bkref_map & (1 << token->opr.idx), 1))
+ {
+ *err = REG_ESUBREG;
+ return NULL;
+ }
+ dfa->used_bkref_map |= 1 << token->opr.idx;
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ ++dfa->nbackref;
+ dfa->has_mb_node = 1;
+ break;
+ case OP_OPEN_DUP_NUM:
+ if (syntax & RE_CONTEXT_INVALID_DUP)
+ {
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ /* FALLTHROUGH */
+ case OP_DUP_ASTERISK:
+ case OP_DUP_PLUS:
+ case OP_DUP_QUESTION:
+ if (syntax & RE_CONTEXT_INVALID_OPS)
+ {
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ else if (syntax & RE_CONTEXT_INDEP_OPS)
+ {
+ fetch_token (token, regexp, syntax);
+ return parse_expression (regexp, preg, token, syntax, nest, err);
+ }
+ /* else fall through */
+ case OP_CLOSE_SUBEXP:
+ if ((token->type == OP_CLOSE_SUBEXP) &&
+ !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD))
+ {
+ *err = REG_ERPAREN;
+ return NULL;
+ }
+ /* else fall through */
+ case OP_CLOSE_DUP_NUM:
+ /* We treat it as a normal character. */
+
+ /* Then we can these characters as normal characters. */
+ token->type = CHARACTER;
+ /* mb_partial and word_char bits should be initialized already
+ by peek_token. */
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ break;
+ case ANCHOR:
+ if ((token->opr.ctx_type
+ & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST))
+ && dfa->word_ops_used == 0)
+ init_word_char (dfa);
+ if (token->opr.ctx_type == WORD_DELIM
+ || token->opr.ctx_type == NOT_WORD_DELIM)
+ {
+ bin_tree_t *tree_first, *tree_last;
+ if (token->opr.ctx_type == WORD_DELIM)
+ {
+ token->opr.ctx_type = WORD_FIRST;
+ tree_first = create_token_tree (dfa, NULL, NULL, token);
+ token->opr.ctx_type = WORD_LAST;
+ }
+ else
+ {
+ token->opr.ctx_type = INSIDE_WORD;
+ tree_first = create_token_tree (dfa, NULL, NULL, token);
+ token->opr.ctx_type = INSIDE_NOTWORD;
+ }
+ tree_last = create_token_tree (dfa, NULL, NULL, token);
+ tree = create_tree (dfa, tree_first, tree_last, OP_ALT);
+ if (BE (tree_first == NULL || tree_last == NULL || tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ else
+ {
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ /* We must return here, since ANCHORs can't be followed
+ by repetition operators.
+ eg. RE"^*" is invalid or "<ANCHOR(^)><CHAR(*)>",
+ it must not be "<ANCHOR(^)><REPEAT(*)>". */
+ fetch_token (token, regexp, syntax);
+ return tree;
+ case OP_PERIOD:
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ if (dfa->mb_cur_max > 1)
+ dfa->has_mb_node = 1;
+ break;
+ case OP_WORD:
+ case OP_NOTWORD:
+ tree = build_charclass_op (dfa, regexp->trans,
+ (const unsigned char *) "alnum",
+ (const unsigned char *) "_",
+ token->type == OP_NOTWORD, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_SPACE:
+ case OP_NOTSPACE:
+ tree = build_charclass_op (dfa, regexp->trans,
+ (const unsigned char *) "space",
+ (const unsigned char *) "",
+ token->type == OP_NOTSPACE, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_ALT:
+ case END_OF_RE:
+ return NULL;
+ case BACK_SLASH:
+ *err = REG_EESCAPE;
+ return NULL;
+ default:
+ /* Must not happen? */
+#ifdef DEBUG
+ assert (0);
+#endif
+ return NULL;
+ }
+ fetch_token (token, regexp, syntax);
+
+ while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS
+ || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM)
+ {
+ tree = parse_dup_op (tree, regexp, dfa, token, syntax, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ /* In BRE consecutive duplications are not allowed. */
+ if ((syntax & RE_CONTEXT_INVALID_DUP)
+ && (token->type == OP_DUP_ASTERISK
+ || token->type == OP_OPEN_DUP_NUM))
+ {
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ }
+
+ return tree;
+}
+
+/* This function build the following tree, from regular expression
+ (<reg_exp>):
+ SUBEXP
+ |
+ <reg_exp>
+*/
+
+static bin_tree_t *
+parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree;
+ size_t cur_nsub;
+ cur_nsub = preg->re_nsub++;
+
+ fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+
+ /* The subexpression may be a null string. */
+ if (token->type == OP_CLOSE_SUBEXP)
+ tree = NULL;
+ else
+ {
+ tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
+ if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
+ *err = REG_EPAREN;
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ }
+
+ if (cur_nsub <= '9' - '1')
+ dfa->completed_bkref_map |= 1 << cur_nsub;
+
+ tree = create_tree (dfa, tree, NULL, SUBEXP);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ tree->token.opr.idx = cur_nsub;
+ return tree;
+}
+
+/* This function parse repetition operators like "*", "+", "{1,3}" etc. */
+
+static bin_tree_t *
+parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
+ re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err)
+{
+ bin_tree_t *tree = NULL, *old_tree = NULL;
+ Idx i, start, end, start_idx = re_string_cur_idx (regexp);
+ re_token_t start_token = *token;
+
+ if (token->type == OP_OPEN_DUP_NUM)
+ {
+ end = 0;
+ start = fetch_number (regexp, token, syntax);
+ if (start == REG_MISSING)
+ {
+ if (token->type == CHARACTER && token->opr.c == ',')
+ start = 0; /* We treat "{,m}" as "{0,m}". */
+ else
+ {
+ *err = REG_BADBR; /* <re>{} is invalid. */
+ return NULL;
+ }
+ }
+ if (BE (start != REG_ERROR, 1))
+ {
+ /* We treat "{n}" as "{n,n}". */
+ end = ((token->type == OP_CLOSE_DUP_NUM) ? start
+ : ((token->type == CHARACTER && token->opr.c == ',')
+ ? fetch_number (regexp, token, syntax) : REG_ERROR));
+ }
+ if (BE (start == REG_ERROR || end == REG_ERROR, 0))
+ {
+ /* Invalid sequence. */
+ if (BE (!(syntax & RE_INVALID_INTERVAL_ORD), 0))
+ {
+ if (token->type == END_OF_RE)
+ *err = REG_EBRACE;
+ else
+ *err = REG_BADBR;
+
+ return NULL;
+ }
+
+ /* If the syntax bit is set, rollback. */
+ re_string_set_index (regexp, start_idx);
+ *token = start_token;
+ token->type = CHARACTER;
+ /* mb_partial and word_char bits should be already initialized by
+ peek_token. */
+ return elem;
+ }
+
+ if (BE ((end != REG_MISSING && start > end)
+ || token->type != OP_CLOSE_DUP_NUM, 0))
+ {
+ /* First number greater than second. */
+ *err = REG_BADBR;
+ return NULL;
+ }
+ }
+ else
+ {
+ start = (token->type == OP_DUP_PLUS) ? 1 : 0;
+ end = (token->type == OP_DUP_QUESTION) ? 1 : REG_MISSING;
+ }
+
+ fetch_token (token, regexp, syntax);
+
+ if (BE (elem == NULL, 0))
+ return NULL;
+ if (BE (start == 0 && end == 0, 0))
+ {
+ postorder (elem, free_tree, NULL);
+ return NULL;
+ }
+
+ /* Extract "<re>{n,m}" to "<re><re>...<re><re>{0,<m-n>}". */
+ if (BE (start > 0, 0))
+ {
+ tree = elem;
+ for (i = 2; i <= start; ++i)
+ {
+ elem = duplicate_tree (elem, dfa);
+ tree = create_tree (dfa, tree, elem, CONCAT);
+ if (BE (elem == NULL || tree == NULL, 0))
+ goto parse_dup_op_espace;
+ }
+
+ if (start == end)
+ return tree;
+
+ /* Duplicate ELEM before it is marked optional. */
+ elem = duplicate_tree (elem, dfa);
+ old_tree = tree;
+ }
+ else
+ old_tree = NULL;
+
+ if (elem->token.type == SUBEXP)
+ postorder (elem, mark_opt_subexp, (void *) (long) elem->token.opr.idx);
+
+ tree = create_tree (dfa, elem, NULL,
+ (end == REG_MISSING ? OP_DUP_ASTERISK : OP_ALT));
+ if (BE (tree == NULL, 0))
+ goto parse_dup_op_espace;
+
+/* From gnulib's "intprops.h":
+ True if the arithmetic type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+ /* This loop is actually executed only when end != REG_MISSING,
+ to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?... We have
+ already created the start+1-th copy. */
+ if (TYPE_SIGNED (Idx) || end != REG_MISSING)
+ for (i = start + 2; i <= end; ++i)
+ {
+ elem = duplicate_tree (elem, dfa);
+ tree = create_tree (dfa, tree, elem, CONCAT);
+ if (BE (elem == NULL || tree == NULL, 0))
+ goto parse_dup_op_espace;
+
+ tree = create_tree (dfa, tree, NULL, OP_ALT);
+ if (BE (tree == NULL, 0))
+ goto parse_dup_op_espace;
+ }
+
+ if (old_tree)
+ tree = create_tree (dfa, old_tree, tree, CONCAT);
+
+ return tree;
+
+ parse_dup_op_espace:
+ *err = REG_ESPACE;
+ return NULL;
+}
+
+/* Size of the names for collating symbol/equivalence_class/character_class.
+ I'm not sure, but maybe enough. */
+#define BRACKET_NAME_BUF_SIZE 32
+
+#ifndef _LIBC
+ /* Local function for parse_bracket_exp only used in case of NOT _LIBC.
+ Build the range expression which starts from START_ELEM, and ends
+ at END_ELEM. The result are written to MBCSET and SBCSET.
+ RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+ mbcset->range_ends, is a pointer argument sinse we may
+ update it. */
+
+static reg_errcode_t
+internal_function
+# ifdef RE_ENABLE_I18N
+build_range_exp (bitset_t sbcset, re_charset_t *mbcset, Idx *range_alloc,
+ bracket_elem_t *start_elem, bracket_elem_t *end_elem)
+# else /* not RE_ENABLE_I18N */
+build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem,
+ bracket_elem_t *end_elem)
+# endif /* not RE_ENABLE_I18N */
+{
+ unsigned int start_ch, end_ch;
+ /* Equivalence Classes and Character Classes can't be a range start/end. */
+ if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
+ || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
+ 0))
+ return REG_ERANGE;
+
+ /* We can handle no multi character collating elements without libc
+ support. */
+ if (BE ((start_elem->type == COLL_SYM
+ && strlen ((char *) start_elem->opr.name) > 1)
+ || (end_elem->type == COLL_SYM
+ && strlen ((char *) end_elem->opr.name) > 1), 0))
+ return REG_ECOLLATE;
+
+# ifdef RE_ENABLE_I18N
+ {
+ wchar_t wc;
+ wint_t start_wc;
+ wint_t end_wc;
+ wchar_t cmp_buf[6] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
+
+ start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
+ : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+ : 0));
+ end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch
+ : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+ : 0));
+ start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM)
+ ? __btowc (start_ch) : start_elem->opr.wch);
+ end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
+ ? __btowc (end_ch) : end_elem->opr.wch);
+ if (start_wc == WEOF || end_wc == WEOF)
+ return REG_ECOLLATE;
+ cmp_buf[0] = start_wc;
+ cmp_buf[4] = end_wc;
+ if (wcscoll (cmp_buf, cmp_buf + 4) > 0)
+ return REG_ERANGE;
+
+ /* Got valid collation sequence values, add them as a new entry.
+ However, for !_LIBC we have no collation elements: if the
+ character set is single byte, the single byte character set
+ that we build below suffices. parse_bracket_exp passes
+ no MBCSET if dfa->mb_cur_max == 1. */
+ if (mbcset)
+ {
+ /* Check the space of the arrays. */
+ if (BE (*range_alloc == mbcset->nranges, 0))
+ {
+ /* There is not enough space, need realloc. */
+ wchar_t *new_array_start, *new_array_end;
+ Idx new_nranges;
+
+ /* +1 in case of mbcset->nranges is 0. */
+ new_nranges = 2 * mbcset->nranges + 1;
+ /* Use realloc since mbcset->range_starts and mbcset->range_ends
+ are NULL if *range_alloc == 0. */
+ new_array_start = re_realloc (mbcset->range_starts, wchar_t,
+ new_nranges);
+ new_array_end = re_realloc (mbcset->range_ends, wchar_t,
+ new_nranges);
+
+ if (BE (new_array_start == NULL || new_array_end == NULL, 0))
+ return REG_ESPACE;
+
+ mbcset->range_starts = new_array_start;
+ mbcset->range_ends = new_array_end;
+ *range_alloc = new_nranges;
+ }
+
+ mbcset->range_starts[mbcset->nranges] = start_wc;
+ mbcset->range_ends[mbcset->nranges++] = end_wc;
+ }
+
+ /* Build the table for single byte characters. */
+ for (wc = 0; wc < SBC_MAX; ++wc)
+ {
+ cmp_buf[2] = wc;
+ if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
+ && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+ bitset_set (sbcset, wc);
+ }
+ }
+# else /* not RE_ENABLE_I18N */
+ {
+ unsigned int ch;
+ start_ch = ((start_elem->type == SB_CHAR ) ? start_elem->opr.ch
+ : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+ : 0));
+ end_ch = ((end_elem->type == SB_CHAR ) ? end_elem->opr.ch
+ : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+ : 0));
+ if (start_ch > end_ch)
+ return REG_ERANGE;
+ /* Build the table for single byte characters. */
+ for (ch = 0; ch < SBC_MAX; ++ch)
+ if (start_ch <= ch && ch <= end_ch)
+ bitset_set (sbcset, ch);
+ }
+# endif /* not RE_ENABLE_I18N */
+ return REG_NOERROR;
+}
+#endif /* not _LIBC */
+
+#ifndef _LIBC
+/* Helper function for parse_bracket_exp only used in case of NOT _LIBC..
+ Build the collating element which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+ pointer argument since we may update it. */
+
+static reg_errcode_t
+internal_function
+build_collating_symbol (bitset_t sbcset,
+# ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset, Idx *coll_sym_alloc,
+# endif
+ const unsigned char *name)
+{
+ size_t name_len = strlen ((const char *) name);
+ if (BE (name_len != 1, 0))
+ return REG_ECOLLATE;
+ else
+ {
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+}
+#endif /* not _LIBC */
+
+/* This function parse bracket expression like "[abc]", "[a-c]",
+ "[[.a-a.]]" etc. */
+
+static bin_tree_t *
+parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
+ reg_syntax_t syntax, reg_errcode_t *err)
+{
+#ifdef _LIBC
+ const unsigned char *collseqmb;
+ const char *collseqwc;
+ uint32_t nrules;
+ int32_t table_size;
+ const int32_t *symb_table;
+ const unsigned char *extra;
+
+ /* Local function for parse_bracket_exp used in _LIBC environement.
+ Seek the collating symbol entry correspondings to NAME.
+ Return the index of the symbol in the SYMB_TABLE. */
+
+ auto inline int32_t
+ __attribute ((always_inline))
+ seek_collating_symbol_entry (name, name_len)
+ const unsigned char *name;
+ size_t name_len;
+ {
+ int32_t hash = elem_hash ((const char *) name, name_len);
+ int32_t elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ int32_t second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ /* Compare the length of the name. */
+ && name_len == extra[symb_table[2 * elem + 1]]
+ /* Compare the name. */
+ && memcmp (name, &extra[symb_table[2 * elem + 1] + 1],
+ name_len) == 0)
+ {
+ /* Yep, this is the entry. */
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+ return elem;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environment.
+ Look up the collation sequence value of BR_ELEM.
+ Return the value if succeeded, UINT_MAX otherwise. */
+
+ auto inline unsigned int
+ __attribute ((always_inline))
+ lookup_collation_sequence_value (br_elem)
+ bracket_elem_t *br_elem;
+ {
+ if (br_elem->type == SB_CHAR)
+ {
+ /*
+ if (MB_CUR_MAX == 1)
+ */
+ if (nrules == 0)
+ return collseqmb[br_elem->opr.ch];
+ else
+ {
+ wint_t wc = __btowc (br_elem->opr.ch);
+ return __collseq_table_lookup (collseqwc, wc);
+ }
+ }
+ else if (br_elem->type == MB_CHAR)
+ {
+ if (nrules != 0)
+ return __collseq_table_lookup (collseqwc, br_elem->opr.wch);
+ }
+ else if (br_elem->type == COLL_SYM)
+ {
+ size_t sym_name_len = strlen ((char *) br_elem->opr.name);
+ if (nrules != 0)
+ {
+ int32_t elem, idx;
+ elem = seek_collating_symbol_entry (br_elem->opr.name,
+ sym_name_len);
+ if (symb_table[2 * elem] != 0)
+ {
+ /* We found the entry. */
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element name. */
+ idx += 1 + extra[idx];
+ /* Skip the byte sequence of the collating element. */
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+ /* Skip the multibyte collation sequence value. */
+ idx += sizeof (unsigned int);
+ /* Skip the wide char sequence of the collating element. */
+ idx += sizeof (unsigned int) *
+ (1 + *(unsigned int *) (extra + idx));
+ /* Return the collation sequence value. */
+ return *(unsigned int *) (extra + idx);
+ }
+ else if (symb_table[2 * elem] == 0 && sym_name_len == 1)
+ {
+ /* No valid character. Match it as a single byte
+ character. */
+ return collseqmb[br_elem->opr.name[0]];
+ }
+ }
+ else if (sym_name_len == 1)
+ return collseqmb[br_elem->opr.name[0]];
+ }
+ return UINT_MAX;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environement.
+ Build the range expression which starts from START_ELEM, and ends
+ at END_ELEM. The result are written to MBCSET and SBCSET.
+ RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+ mbcset->range_ends, is a pointer argument sinse we may
+ update it. */
+
+ auto inline reg_errcode_t
+ __attribute ((always_inline))
+ build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
+ re_charset_t *mbcset;
+ Idx *range_alloc;
+ bitset_t sbcset;
+ bracket_elem_t *start_elem, *end_elem;
+ {
+ unsigned int ch;
+ uint32_t start_collseq;
+ uint32_t end_collseq;
+
+ /* Equivalence Classes and Character Classes can't be a range
+ start/end. */
+ if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
+ || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
+ 0))
+ return REG_ERANGE;
+
+ start_collseq = lookup_collation_sequence_value (start_elem);
+ end_collseq = lookup_collation_sequence_value (end_elem);
+ /* Check start/end collation sequence values. */
+ if (BE (start_collseq == UINT_MAX || end_collseq == UINT_MAX, 0))
+ return REG_ECOLLATE;
+ if (BE ((syntax & RE_NO_EMPTY_RANGES) && start_collseq > end_collseq, 0))
+ return REG_ERANGE;
+
+ /* Got valid collation sequence values, add them as a new entry.
+ However, if we have no collation elements, and the character set
+ is single byte, the single byte character set that we
+ build below suffices. */
+ if (nrules > 0 || dfa->mb_cur_max > 1)
+ {
+ /* Check the space of the arrays. */
+ if (BE (*range_alloc == mbcset->nranges, 0))
+ {
+ /* There is not enough space, need realloc. */
+ uint32_t *new_array_start;
+ uint32_t *new_array_end;
+ Idx new_nranges;
+
+ /* +1 in case of mbcset->nranges is 0. */
+ new_nranges = 2 * mbcset->nranges + 1;
+ new_array_start = re_realloc (mbcset->range_starts, uint32_t,
+ new_nranges);
+ new_array_end = re_realloc (mbcset->range_ends, uint32_t,
+ new_nranges);
+
+ if (BE (new_array_start == NULL || new_array_end == NULL, 0))
+ return REG_ESPACE;
+
+ mbcset->range_starts = new_array_start;
+ mbcset->range_ends = new_array_end;
+ *range_alloc = new_nranges;
+ }
+
+ mbcset->range_starts[mbcset->nranges] = start_collseq;
+ mbcset->range_ends[mbcset->nranges++] = end_collseq;
+ }
+
+ /* Build the table for single byte characters. */
+ for (ch = 0; ch < SBC_MAX; ch++)
+ {
+ uint32_t ch_collseq;
+ /*
+ if (MB_CUR_MAX == 1)
+ */
+ if (nrules == 0)
+ ch_collseq = collseqmb[ch];
+ else
+ ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch));
+ if (start_collseq <= ch_collseq && ch_collseq <= end_collseq)
+ bitset_set (sbcset, ch);
+ }
+ return REG_NOERROR;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environement.
+ Build the collating element which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+ pointer argument sinse we may update it. */
+
+ auto inline reg_errcode_t
+ __attribute ((always_inline))
+ build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name)
+ re_charset_t *mbcset;
+ Idx *coll_sym_alloc;
+ bitset_t sbcset;
+ const unsigned char *name;
+ {
+ int32_t elem, idx;
+ size_t name_len = strlen ((const char *) name);
+ if (nrules != 0)
+ {
+ elem = seek_collating_symbol_entry (name, name_len);
+ if (symb_table[2 * elem] != 0)
+ {
+ /* We found the entry. */
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element name. */
+ idx += 1 + extra[idx];
+ }
+ else if (symb_table[2 * elem] == 0 && name_len == 1)
+ {
+ /* No valid character, treat it as a normal
+ character. */
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+ else
+ return REG_ECOLLATE;
+
+ /* Got valid collation sequence, add it as a new entry. */
+ /* Check the space of the arrays. */
+ if (BE (*coll_sym_alloc == mbcset->ncoll_syms, 0))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->ncoll_syms is 0. */
+ Idx new_coll_sym_alloc = 2 * mbcset->ncoll_syms + 1;
+ /* Use realloc since mbcset->coll_syms is NULL
+ if *alloc == 0. */
+ int32_t *new_coll_syms = re_realloc (mbcset->coll_syms, int32_t,
+ new_coll_sym_alloc);
+ if (BE (new_coll_syms == NULL, 0))
+ return REG_ESPACE;
+ mbcset->coll_syms = new_coll_syms;
+ *coll_sym_alloc = new_coll_sym_alloc;
+ }
+ mbcset->coll_syms[mbcset->ncoll_syms++] = idx;
+ return REG_NOERROR;
+ }
+ else
+ {
+ if (BE (name_len != 1, 0))
+ return REG_ECOLLATE;
+ else
+ {
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+ }
+ }
+#endif
+
+ re_token_t br_token;
+ re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset;
+ Idx coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0;
+ Idx equiv_class_alloc = 0, char_class_alloc = 0;
+#endif /* not RE_ENABLE_I18N */
+ bool non_match = false;
+ bin_tree_t *work_tree;
+ int token_len;
+ bool first_round = true;
+#ifdef _LIBC
+ collseqmb = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+ nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules)
+ {
+ /*
+ if (MB_CUR_MAX > 1)
+ */
+ collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+ table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+ }
+#endif
+ sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+#ifdef RE_ENABLE_I18N
+ mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+#endif /* RE_ENABLE_I18N */
+#ifdef RE_ENABLE_I18N
+ if (BE (sbcset == NULL || mbcset == NULL, 0))
+#else
+ if (BE (sbcset == NULL, 0))
+#endif /* RE_ENABLE_I18N */
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ token_len = peek_token_bracket (token, regexp, syntax);
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *err = REG_BADPAT;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_NON_MATCH_LIST)
+ {
+#ifdef RE_ENABLE_I18N
+ mbcset->non_match = 1;
+#endif /* not RE_ENABLE_I18N */
+ non_match = true;
+ if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
+ bitset_set (sbcset, '\n');
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+ token_len = peek_token_bracket (token, regexp, syntax);
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *err = REG_BADPAT;
+ goto parse_bracket_exp_free_return;
+ }
+ }
+
+ /* We treat the first ']' as a normal character. */
+ if (token->type == OP_CLOSE_BRACKET)
+ token->type = CHARACTER;
+
+ while (1)
+ {
+ bracket_elem_t start_elem, end_elem;
+ unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE];
+ unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE];
+ reg_errcode_t ret;
+ int token_len2 = 0;
+ bool is_range_exp = false;
+ re_token_t token2;
+
+ start_elem.opr.name = start_name_buf;
+ ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa,
+ syntax, first_round);
+ if (BE (ret != REG_NOERROR, 0))
+ {
+ *err = ret;
+ goto parse_bracket_exp_free_return;
+ }
+ first_round = false;
+
+ /* Get information about the next token. We need it in any case. */
+ token_len = peek_token_bracket (token, regexp, syntax);
+
+ /* Do not check for ranges if we know they are not allowed. */
+ if (start_elem.type != CHAR_CLASS && start_elem.type != EQUIV_CLASS)
+ {
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_CHARSET_RANGE)
+ {
+ re_string_skip_bytes (regexp, token_len); /* Skip '-'. */
+ token_len2 = peek_token_bracket (&token2, regexp, syntax);
+ if (BE (token2.type == END_OF_RE, 0))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token2.type == OP_CLOSE_BRACKET)
+ {
+ /* We treat the last '-' as a normal character. */
+ re_string_skip_bytes (regexp, -token_len);
+ token->type = CHARACTER;
+ }
+ else
+ is_range_exp = true;
+ }
+ }
+
+ if (is_range_exp == true)
+ {
+ end_elem.opr.name = end_name_buf;
+ ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2,
+ dfa, syntax, true);
+ if (BE (ret != REG_NOERROR, 0))
+ {
+ *err = ret;
+ goto parse_bracket_exp_free_return;
+ }
+
+ token_len = peek_token_bracket (token, regexp, syntax);
+
+#ifdef _LIBC
+ *err = build_range_exp (sbcset, mbcset, &range_alloc,
+ &start_elem, &end_elem);
+#else
+# ifdef RE_ENABLE_I18N
+ *err = build_range_exp (sbcset,
+ dfa->mb_cur_max > 1 ? mbcset : NULL,
+ &range_alloc, &start_elem, &end_elem);
+# else
+ *err = build_range_exp (sbcset, &start_elem, &end_elem);
+# endif
+#endif /* RE_ENABLE_I18N */
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ }
+ else
+ {
+ switch (start_elem.type)
+ {
+ case SB_CHAR:
+ bitset_set (sbcset, start_elem.opr.ch);
+ break;
+#ifdef RE_ENABLE_I18N
+ case MB_CHAR:
+ /* Check whether the array has enough space. */
+ if (BE (mbchar_alloc == mbcset->nmbchars, 0))
+ {
+ wchar_t *new_mbchars;
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nmbchars is 0. */
+ mbchar_alloc = 2 * mbcset->nmbchars + 1;
+ /* Use realloc since array is NULL if *alloc == 0. */
+ new_mbchars = re_realloc (mbcset->mbchars, wchar_t,
+ mbchar_alloc);
+ if (BE (new_mbchars == NULL, 0))
+ goto parse_bracket_exp_espace;
+ mbcset->mbchars = new_mbchars;
+ }
+ mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch;
+ break;
+#endif /* RE_ENABLE_I18N */
+ case EQUIV_CLASS:
+ *err = build_equiv_class (sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &equiv_class_alloc,
+#endif /* RE_ENABLE_I18N */
+ start_elem.opr.name);
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ break;
+ case COLL_SYM:
+ *err = build_collating_symbol (sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &coll_sym_alloc,
+#endif /* RE_ENABLE_I18N */
+ start_elem.opr.name);
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ break;
+ case CHAR_CLASS:
+ *err = build_charclass (regexp->trans, sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &char_class_alloc,
+#endif /* RE_ENABLE_I18N */
+ start_elem.opr.name, syntax);
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ break;
+ default:
+ assert (0);
+ break;
+ }
+ }
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_CLOSE_BRACKET)
+ break;
+ }
+
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+
+ /* If it is non-matching list. */
+ if (non_match)
+ bitset_not (sbcset);
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure only single byte characters are set. */
+ if (dfa->mb_cur_max > 1)
+ bitset_mask (sbcset, dfa->sb_char);
+
+ if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes
+ || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes
+ || mbcset->non_match)))
+ {
+ bin_tree_t *mbc_tree;
+ int sbc_idx;
+ /* Build a tree for complex bracket. */
+ dfa->has_mb_node = 1;
+ br_token.type = COMPLEX_BRACKET;
+ br_token.opr.mbcset = mbcset;
+ mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (mbc_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+ for (sbc_idx = 0; sbc_idx < BITSET_WORDS; ++sbc_idx)
+ if (sbcset[sbc_idx])
+ break;
+ /* If there are no bits set in sbcset, there is no point
+ of having both SIMPLE_BRACKET and COMPLEX_BRACKET. */
+ if (sbc_idx < BITSET_WORDS)
+ {
+ /* Build a tree for simple bracket. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (work_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+
+ /* Then join them by ALT node. */
+ work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT);
+ if (BE (work_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+ }
+ else
+ {
+ re_free (sbcset);
+ work_tree = mbc_tree;
+ }
+ }
+ else
+#endif /* not RE_ENABLE_I18N */
+ {
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif
+ /* Build a tree for simple bracket. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (work_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+ }
+ return work_tree;
+
+ parse_bracket_exp_espace:
+ *err = REG_ESPACE;
+ parse_bracket_exp_free_return:
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ return NULL;
+}
+
+/* Parse an element in the bracket expression. */
+
+static reg_errcode_t
+parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp,
+ re_token_t *token, int token_len, re_dfa_t *dfa,
+ reg_syntax_t syntax, bool accept_hyphen)
+{
+#ifdef RE_ENABLE_I18N
+ int cur_char_size;
+ cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp));
+ if (cur_char_size > 1)
+ {
+ elem->type = MB_CHAR;
+ elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp));
+ re_string_skip_bytes (regexp, cur_char_size);
+ return REG_NOERROR;
+ }
+#endif /* RE_ENABLE_I18N */
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+ if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS
+ || token->type == OP_OPEN_EQUIV_CLASS)
+ return parse_bracket_symbol (elem, regexp, token);
+ if (BE (token->type == OP_CHARSET_RANGE, 0) && !accept_hyphen)
+ {
+ /* A '-' must only appear as anything but a range indicator before
+ the closing bracket. Everything else is an error. */
+ re_token_t token2;
+ (void) peek_token_bracket (&token2, regexp, syntax);
+ if (token2.type != OP_CLOSE_BRACKET)
+ /* The actual error value is not standardized since this whole
+ case is undefined. But ERANGE makes good sense. */
+ return REG_ERANGE;
+ }
+ elem->type = SB_CHAR;
+ elem->opr.ch = token->opr.c;
+ return REG_NOERROR;
+}
+
+/* Parse a bracket symbol in the bracket expression. Bracket symbols are
+ such as [:<character_class>:], [.<collating_element>.], and
+ [=<equivalent_class>=]. */
+
+static reg_errcode_t
+parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp,
+ re_token_t *token)
+{
+ unsigned char ch, delim = token->opr.c;
+ int i = 0;
+ if (re_string_eoi(regexp))
+ return REG_EBRACK;
+ for (;; ++i)
+ {
+ if (i >= BRACKET_NAME_BUF_SIZE)
+ return REG_EBRACK;
+ if (token->type == OP_OPEN_CHAR_CLASS)
+ ch = re_string_fetch_byte_case (regexp);
+ else
+ ch = re_string_fetch_byte (regexp);
+ if (re_string_eoi(regexp))
+ return REG_EBRACK;
+ if (ch == delim && re_string_peek_byte (regexp, 0) == ']')
+ break;
+ elem->opr.name[i] = ch;
+ }
+ re_string_skip_bytes (regexp, 1);
+ elem->opr.name[i] = '\0';
+ switch (token->type)
+ {
+ case OP_OPEN_COLL_ELEM:
+ elem->type = COLL_SYM;
+ break;
+ case OP_OPEN_EQUIV_CLASS:
+ elem->type = EQUIV_CLASS;
+ break;
+ case OP_OPEN_CHAR_CLASS:
+ elem->type = CHAR_CLASS;
+ break;
+ default:
+ break;
+ }
+ return REG_NOERROR;
+}
+
+ /* Helper function for parse_bracket_exp.
+ Build the equivalence class which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
+ is a pointer argument sinse we may update it. */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_equiv_class (bitset_t sbcset, re_charset_t *mbcset,
+ Idx *equiv_class_alloc, const unsigned char *name)
+#else /* not RE_ENABLE_I18N */
+build_equiv_class (bitset_t sbcset, const unsigned char *name)
+#endif /* not RE_ENABLE_I18N */
+{
+#ifdef _LIBC
+ uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules != 0)
+ {
+ const int32_t *table, *indirect;
+ const unsigned char *weights, *extra, *cp;
+ unsigned char char_buf[2];
+ int32_t idx1, idx2;
+ unsigned int ch;
+ size_t len;
+ /* This #include defines a local function! */
+# include <locale/weight.h>
+ /* Calculate the index for equivalence class. */
+ cp = name;
+ table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_INDIRECTMB);
+ idx1 = findidx (&cp);
+ if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0))
+ /* This isn't a valid character. */
+ return REG_ECOLLATE;
+
+ /* Build single byte matcing table for this equivalence class. */
+ char_buf[1] = (unsigned char) '\0';
+ len = weights[idx1 & 0xffffff];
+ for (ch = 0; ch < SBC_MAX; ++ch)
+ {
+ char_buf[0] = ch;
+ cp = char_buf;
+ idx2 = findidx (&cp);
+/*
+ idx2 = table[ch];
+*/
+ if (idx2 == 0)
+ /* This isn't a valid character. */
+ continue;
+ /* Compare only if the length matches and the collation rule
+ index is the same. */
+ if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24))
+ {
+ int cnt = 0;
+
+ while (cnt <= len &&
+ weights[(idx1 & 0xffffff) + 1 + cnt]
+ == weights[(idx2 & 0xffffff) + 1 + cnt])
+ ++cnt;
+
+ if (cnt > len)
+ bitset_set (sbcset, ch);
+ }
+ }
+ /* Check whether the array has enough space. */
+ if (BE (*equiv_class_alloc == mbcset->nequiv_classes, 0))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nequiv_classes is 0. */
+ Idx new_equiv_class_alloc = 2 * mbcset->nequiv_classes + 1;
+ /* Use realloc since the array is NULL if *alloc == 0. */
+ int32_t *new_equiv_classes = re_realloc (mbcset->equiv_classes,
+ int32_t,
+ new_equiv_class_alloc);
+ if (BE (new_equiv_classes == NULL, 0))
+ return REG_ESPACE;
+ mbcset->equiv_classes = new_equiv_classes;
+ *equiv_class_alloc = new_equiv_class_alloc;
+ }
+ mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1;
+ }
+ else
+#endif /* _LIBC */
+ {
+ if (BE (strlen ((const char *) name) != 1, 0))
+ return REG_ECOLLATE;
+ bitset_set (sbcset, *name);
+ }
+ return REG_NOERROR;
+}
+
+ /* Helper function for parse_bracket_exp.
+ Build the character class which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
+ is a pointer argument sinse we may update it. */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+ re_charset_t *mbcset, Idx *char_class_alloc,
+ const unsigned char *class_name, reg_syntax_t syntax)
+#else /* not RE_ENABLE_I18N */
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+ const unsigned char *class_name, reg_syntax_t syntax)
+#endif /* not RE_ENABLE_I18N */
+{
+ int i;
+ const char *name = (const char *) class_name;
+
+ /* In case of REG_ICASE "upper" and "lower" match the both of
+ upper and lower cases. */
+ if ((syntax & RE_ICASE)
+ && (strcmp (name, "upper") == 0 || strcmp (name, "lower") == 0))
+ name = "alpha";
+
+#ifdef RE_ENABLE_I18N
+ /* Check the space of the arrays. */
+ if (BE (*char_class_alloc == mbcset->nchar_classes, 0))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nchar_classes is 0. */
+ Idx new_char_class_alloc = 2 * mbcset->nchar_classes + 1;
+ /* Use realloc since array is NULL if *alloc == 0. */
+ wctype_t *new_char_classes = re_realloc (mbcset->char_classes, wctype_t,
+ new_char_class_alloc);
+ if (BE (new_char_classes == NULL, 0))
+ return REG_ESPACE;
+ mbcset->char_classes = new_char_classes;
+ *char_class_alloc = new_char_class_alloc;
+ }
+ mbcset->char_classes[mbcset->nchar_classes++] = __wctype (name);
+#endif /* RE_ENABLE_I18N */
+
+#define BUILD_CHARCLASS_LOOP(ctype_func) \
+ do { \
+ if (BE (trans != NULL, 0)) \
+ { \
+ for (i = 0; i < SBC_MAX; ++i) \
+ if (ctype_func (i)) \
+ bitset_set (sbcset, trans[i]); \
+ } \
+ else \
+ { \
+ for (i = 0; i < SBC_MAX; ++i) \
+ if (ctype_func (i)) \
+ bitset_set (sbcset, i); \
+ } \
+ } while (0)
+
+ if (strcmp (name, "alnum") == 0)
+ BUILD_CHARCLASS_LOOP (isalnum);
+ else if (strcmp (name, "cntrl") == 0)
+ BUILD_CHARCLASS_LOOP (iscntrl);
+ else if (strcmp (name, "lower") == 0)
+ BUILD_CHARCLASS_LOOP (islower);
+ else if (strcmp (name, "space") == 0)
+ BUILD_CHARCLASS_LOOP (isspace);
+ else if (strcmp (name, "alpha") == 0)
+ BUILD_CHARCLASS_LOOP (isalpha);
+ else if (strcmp (name, "digit") == 0)
+ BUILD_CHARCLASS_LOOP (isdigit);
+ else if (strcmp (name, "print") == 0)
+ BUILD_CHARCLASS_LOOP (isprint);
+ else if (strcmp (name, "upper") == 0)
+ BUILD_CHARCLASS_LOOP (isupper);
+ else if (strcmp (name, "blank") == 0)
+ BUILD_CHARCLASS_LOOP (isblank);
+ else if (strcmp (name, "graph") == 0)
+ BUILD_CHARCLASS_LOOP (isgraph);
+ else if (strcmp (name, "punct") == 0)
+ BUILD_CHARCLASS_LOOP (ispunct);
+ else if (strcmp (name, "xdigit") == 0)
+ BUILD_CHARCLASS_LOOP (isxdigit);
+ else
+ return REG_ECTYPE;
+
+ return REG_NOERROR;
+}
+
+static bin_tree_t *
+build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
+ const unsigned char *class_name,
+ const unsigned char *extra, bool non_match,
+ reg_errcode_t *err)
+{
+ re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset;
+ Idx alloc = 0;
+#endif /* not RE_ENABLE_I18N */
+ reg_errcode_t ret;
+ re_token_t br_token;
+ bin_tree_t *tree;
+
+ sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+#ifdef RE_ENABLE_I18N
+ mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+#endif /* RE_ENABLE_I18N */
+
+#ifdef RE_ENABLE_I18N
+ if (BE (sbcset == NULL || mbcset == NULL, 0))
+#else /* not RE_ENABLE_I18N */
+ if (BE (sbcset == NULL, 0))
+#endif /* not RE_ENABLE_I18N */
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ if (non_match)
+ {
+#ifdef RE_ENABLE_I18N
+ mbcset->non_match = 1;
+#endif /* not RE_ENABLE_I18N */
+ }
+
+ /* We don't care the syntax in this case. */
+ ret = build_charclass (trans, sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &alloc,
+#endif /* RE_ENABLE_I18N */
+ class_name, 0);
+
+ if (BE (ret != REG_NOERROR, 0))
+ {
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ *err = ret;
+ return NULL;
+ }
+ /* \w match '_' also. */
+ for (; *extra; extra++)
+ bitset_set (sbcset, *extra);
+
+ /* If it is non-matching list. */
+ if (non_match)
+ bitset_not (sbcset);
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure only single byte characters are set. */
+ if (dfa->mb_cur_max > 1)
+ bitset_mask (sbcset, dfa->sb_char);
+#endif
+
+ /* Build a tree for simple bracket. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (tree == NULL, 0))
+ goto build_word_op_espace;
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ bin_tree_t *mbc_tree;
+ /* Build a tree for complex bracket. */
+ br_token.type = COMPLEX_BRACKET;
+ br_token.opr.mbcset = mbcset;
+ dfa->has_mb_node = 1;
+ mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (mbc_tree == NULL, 0))
+ goto build_word_op_espace;
+ /* Then join them by ALT node. */
+ tree = create_tree (dfa, tree, mbc_tree, OP_ALT);
+ if (BE (mbc_tree != NULL, 1))
+ return tree;
+ }
+ else
+ {
+ free_charset (mbcset);
+ return tree;
+ }
+#else /* not RE_ENABLE_I18N */
+ return tree;
+#endif /* not RE_ENABLE_I18N */
+
+ build_word_op_espace:
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ *err = REG_ESPACE;
+ return NULL;
+}
+
+/* This is intended for the expressions like "a{1,3}".
+ Fetch a number from `input', and return the number.
+ Return REG_MISSING if the number field is empty like "{,1}".
+ Return REG_ERROR if an error occurred. */
+
+static Idx
+fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax)
+{
+ Idx num = REG_MISSING;
+ unsigned char c;
+ while (1)
+ {
+ fetch_token (token, input, syntax);
+ c = token->opr.c;
+ if (BE (token->type == END_OF_RE, 0))
+ return REG_ERROR;
+ if (token->type == OP_CLOSE_DUP_NUM || c == ',')
+ break;
+ num = ((token->type != CHARACTER || c < '0' || '9' < c
+ || num == REG_ERROR)
+ ? REG_ERROR
+ : ((num == REG_MISSING) ? c - '0' : num * 10 + c - '0'));
+ num = (num > RE_DUP_MAX) ? REG_ERROR : num;
+ }
+ return num;
+}
+
+#ifdef RE_ENABLE_I18N
+static void
+free_charset (re_charset_t *cset)
+{
+ re_free (cset->mbchars);
+# ifdef _LIBC
+ re_free (cset->coll_syms);
+ re_free (cset->equiv_classes);
+ re_free (cset->range_starts);
+ re_free (cset->range_ends);
+# endif
+ re_free (cset->char_classes);
+ re_free (cset);
+}
+#endif /* RE_ENABLE_I18N */
+
+/* Functions for binary tree operation. */
+
+/* Create a tree node. */
+
+static bin_tree_t *
+create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
+ re_token_type_t type)
+{
+ re_token_t t;
+ t.type = type;
+ return create_token_tree (dfa, left, right, &t);
+}
+
+static bin_tree_t *
+create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
+ const re_token_t *token)
+{
+ bin_tree_t *tree;
+ if (BE (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE, 0))
+ {
+ bin_tree_storage_t *storage = re_malloc (bin_tree_storage_t, 1);
+
+ if (storage == NULL)
+ return NULL;
+ storage->next = dfa->str_tree_storage;
+ dfa->str_tree_storage = storage;
+ dfa->str_tree_storage_idx = 0;
+ }
+ tree = &dfa->str_tree_storage->data[dfa->str_tree_storage_idx++];
+
+ tree->parent = NULL;
+ tree->left = left;
+ tree->right = right;
+ tree->token = *token;
+ tree->token.duplicated = 0;
+ tree->token.opt_subexp = 0;
+ tree->first = NULL;
+ tree->next = NULL;
+ tree->node_idx = REG_MISSING;
+
+ if (left != NULL)
+ left->parent = tree;
+ if (right != NULL)
+ right->parent = tree;
+ return tree;
+}
+
+/* Mark the tree SRC as an optional subexpression.
+ To be called from preorder or postorder. */
+
+static reg_errcode_t
+mark_opt_subexp (void *extra, bin_tree_t *node)
+{
+ Idx idx = (Idx) (long) extra;
+ if (node->token.type == SUBEXP && node->token.opr.idx == idx)
+ node->token.opt_subexp = 1;
+
+ return REG_NOERROR;
+}
+
+/* Free the allocated memory inside NODE. */
+
+static void
+free_token (re_token_t *node)
+{
+#ifdef RE_ENABLE_I18N
+ if (node->type == COMPLEX_BRACKET && node->duplicated == 0)
+ free_charset (node->opr.mbcset);
+ else
+#endif /* RE_ENABLE_I18N */
+ if (node->type == SIMPLE_BRACKET && node->duplicated == 0)
+ re_free (node->opr.sbcset);
+}
+
+/* Worker function for tree walking. Free the allocated memory inside NODE
+ and its children. */
+
+static reg_errcode_t
+free_tree (void *extra, bin_tree_t *node)
+{
+ free_token (&node->token);
+ return REG_NOERROR;
+}
+
+
+/* Duplicate the node SRC, and return new node. This is a preorder
+ visit similar to the one implemented by the generic visitor, but
+ we need more infrastructure to maintain two parallel trees --- so,
+ it's easier to duplicate. */
+
+static bin_tree_t *
+duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa)
+{
+ const bin_tree_t *node;
+ bin_tree_t *dup_root;
+ bin_tree_t **p_new = &dup_root, *dup_node = root->parent;
+
+ for (node = root; ; )
+ {
+ /* Create a new tree and link it back to the current parent. */
+ *p_new = create_token_tree (dfa, NULL, NULL, &node->token);
+ if (*p_new == NULL)
+ return NULL;
+ (*p_new)->parent = dup_node;
+ (*p_new)->token.duplicated = 1;
+ dup_node = *p_new;
+
+ /* Go to the left node, or up and to the right. */
+ if (node->left)
+ {
+ node = node->left;
+ p_new = &dup_node->left;
+ }
+ else
+ {
+ const bin_tree_t *prev = NULL;
+ while (node->right == prev || node->right == NULL)
+ {
+ prev = node;
+ node = node->parent;
+ dup_node = dup_node->parent;
+ if (!node)
+ return dup_root;
+ }
+ node = node->right;
+ p_new = &dup_node->right;
+ }
+ }
+}
diff --git a/gnulib/lib/regex.c b/gnulib/lib/regex.c
new file mode 100644
index 00000000..904fe62c
--- /dev/null
+++ b/gnulib/lib/regex.c
@@ -0,0 +1,72 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Make sure noone compiles this code with a C++ compiler. */
+#if defined __cplusplus && defined _LIBC
+# error "This is C code, use a C compiler"
+#endif
+
+#ifdef _LIBC
+/* We have to keep the namespace clean. */
+# define regfree(preg) __regfree (preg)
+# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
+# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
+# define regerror(errcode, preg, errbuf, errbuf_size) \
+ __regerror(errcode, preg, errbuf, errbuf_size)
+# define re_set_registers(bu, re, nu, st, en) \
+ __re_set_registers (bu, re, nu, st, en)
+# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
+ __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+# define re_match(bufp, string, size, pos, regs) \
+ __re_match (bufp, string, size, pos, regs)
+# define re_search(bufp, string, size, startpos, range, regs) \
+ __re_search (bufp, string, size, startpos, range, regs)
+# define re_compile_pattern(pattern, length, bufp) \
+ __re_compile_pattern (pattern, length, bufp)
+# define re_set_syntax(syntax) __re_set_syntax (syntax)
+# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
+ __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
+# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
+
+# include "../locale/localeinfo.h"
+#endif
+
+/* On some systems, limits.h sets RE_DUP_MAX to a lower value than
+ GNU regex allows. Include it before <regex.h>, which correctly
+ #undefs RE_DUP_MAX and sets it to the right value. */
+#include <limits.h>
+
+#include <regex.h>
+#include "regex_internal.h"
+
+#include "regex_internal.c"
+#include "regcomp.c"
+#include "regexec.c"
+
+/* Binary backward compatibility. */
+#if _LIBC
+# include <shlib-compat.h>
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
+link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.")
+int re_max_failures = 2000;
+# endif
+#endif
diff --git a/gnulib/lib/regex.h b/gnulib/lib/regex.h
new file mode 100644
index 00000000..594d5e6a
--- /dev/null
+++ b/gnulib/lib/regex.h
@@ -0,0 +1,676 @@
+/* Definitions for data structures and routines for the regular
+ expression library.
+ Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993, 1995, 1996, 1997, 1998,
+ 2000, 2001, 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _REGEX_H
+#define _REGEX_H 1
+
+#include <sys/types.h>
+
+/* Allow the use in C++ code. */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Define __USE_GNU_REGEX to declare GNU extensions that violate the
+ POSIX name space rules. */
+#undef __USE_GNU_REGEX
+#if (defined _GNU_SOURCE \
+ || (!defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE \
+ && !defined _XOPEN_SOURCE))
+# define __USE_GNU_REGEX 1
+#endif
+
+#ifdef _REGEX_LARGE_OFFSETS
+
+/* Use types and values that are wide enough to represent signed and
+ unsigned byte offsets in memory. This currently works only when
+ the regex code is used outside of the GNU C library; it is not yet
+ supported within glibc itself, and glibc users should not define
+ _REGEX_LARGE_OFFSETS. */
+
+/* The type of the offset of a byte within a string.
+ For historical reasons POSIX 1003.1-2004 requires that regoff_t be
+ at least as wide as off_t. However, many common POSIX platforms set
+ regoff_t to the more-sensible ssize_t and the Open Group has
+ signalled its intention to change the requirement to be that
+ regoff_t be at least as wide as ptrdiff_t and ssize_t; see XBD ERN
+ 60 (2005-08-25). We don't know of any hosts where ssize_t or
+ ptrdiff_t is wider than ssize_t, so ssize_t is safe. */
+typedef ssize_t regoff_t;
+
+/* The type of nonnegative object indexes. Traditionally, GNU regex
+ uses 'int' for these. Code that uses __re_idx_t should work
+ regardless of whether the type is signed. */
+typedef size_t __re_idx_t;
+
+/* The type of object sizes. */
+typedef size_t __re_size_t;
+
+/* The type of object sizes, in places where the traditional code
+ uses unsigned long int. */
+typedef size_t __re_long_size_t;
+
+#else
+
+/* Use types that are binary-compatible with the traditional GNU regex
+ implementation, which mishandles strings longer than INT_MAX. */
+
+typedef int regoff_t;
+typedef int __re_idx_t;
+typedef unsigned int __re_size_t;
+typedef unsigned long int __re_long_size_t;
+
+#endif
+
+/* The following two types have to be signed and unsigned integer type
+ wide enough to hold a value of a pointer. For most ANSI compilers
+ ptrdiff_t and size_t should be likely OK. Still size of these two
+ types is 2 for Microsoft C. Ugh... */
+typedef long int s_reg_t;
+typedef unsigned long int active_reg_t;
+
+/* The following bits are used to determine the regexp syntax we
+ recognize. The set/not-set meanings are chosen so that Emacs syntax
+ remains the value 0. The bits are given in alphabetical order, and
+ the definitions shifted by one from the previous bit; thus, when we
+ add or remove a bit, only one other definition need change. */
+typedef unsigned long int reg_syntax_t;
+
+#ifdef __USE_GNU_REGEX
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+ If set, then such a \ quotes the following character. */
+# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+ literals.
+ If set, then \+ and \? are operators and + and ? are literals. */
+# define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported. They are:
+ [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],
+ [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+ If not set, then character classes are not supported. */
+# define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+ expressions, of course).
+ If this bit is not set, then it depends:
+ ^ is an anchor if it is at the beginning of a regular
+ expression or after an open-group or an alternation operator;
+ $ is an anchor if it is at the end of a regular expression, or
+ before a close-group or an alternation operator.
+
+ This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+ POSIX draft 11.2 says that * etc. in leading positions is undefined.
+ We already implemented a previous draft which made those constructs
+ invalid, though, so we haven't changed the code back. */
+# define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+ regardless of where they are in the pattern.
+ If this bit is not set, then special characters are special only in
+ some contexts; otherwise they are ordinary. Specifically,
+ * + ? and intervals are only special when not after the beginning,
+ open-group, or alternation operator. */
+# define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+ immediately after an alternation or begin-group operator. */
+# define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+ If not set, then it doesn't. */
+# define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+ If not set, then it does. */
+# define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+ If not set, they do. */
+# define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+ interval, depending on RE_NO_BK_BRACES.
+ If not set, \{, \}, {, and } are literals. */
+# define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+ If not set, they are. */
+# define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+ If not set, newline is literal. */
+# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+ are literals.
+ If not set, then `\{...\}' defines an interval. */
+# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+ If not set, \(...\) defines a group, and ( and ) are literals. */
+# define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+ If not set, then \<digit> is a back-reference. */
+# define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+ If not set, then \| is an alternation operator, and | is literal. */
+# define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+ than the starting range point, as in [z-a], is invalid.
+ If not set, then when ending range point collates higher than the
+ starting range point, the range is ignored. */
+# define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+ If not set, then an unmatched ) is invalid. */
+# define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+ without further backtracking. */
+# define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* If this bit is set, do not process the GNU regex operators.
+ If not set, then the GNU regex operators are recognized. */
+# define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
+
+/* If this bit is set, turn on internal regex debugging.
+ If not set, and debugging was on, turn it off.
+ This only works if regex.c is compiled -DDEBUG.
+ We define this bit always, so that all that's needed to turn on
+ debugging is to recompile regex.c; the calling code can always have
+ this bit set, and it won't affect anything in the normal case. */
+# define RE_DEBUG (RE_NO_GNU_OPS << 1)
+
+/* If this bit is set, a syntactically invalid interval is treated as
+ a string of ordinary characters. For example, the ERE 'a{1' is
+ treated as 'a\{1'. */
+# define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
+
+/* If this bit is set, then ignore case when matching.
+ If not set, then case is significant. */
+# define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
+
+/* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only
+ for ^, because it is difficult to scan the regex backwards to find
+ whether ^ should be special. */
+# define RE_CARET_ANCHORS_HERE (RE_ICASE << 1)
+
+/* If this bit is set, then \{ cannot be first in an bre or
+ immediately after an alternation or begin-group operator. */
+# define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1)
+
+/* If this bit is set, then no_sub will be set to 1 during
+ re_compile_pattern. */
+# define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
+
+#endif /* defined __USE_GNU_REGEX */
+
+/* This global variable defines the particular regexp syntax to use (for
+ some interfaces). When a regexp is compiled, the syntax used is
+ stored in the pattern buffer, so changing this does not affect
+ already-compiled regexps. */
+extern reg_syntax_t re_syntax_options;
+
+#ifdef __USE_GNU_REGEX
+/* Define combinations of the above bits for the standard possibilities.
+ (The [[[ comments delimit what gets put into the Texinfo file, so
+ don't delete them!) */
+/* [[[begin syntaxes]]] */
+# define RE_SYNTAX_EMACS 0
+
+# define RE_SYNTAX_AWK \
+ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
+ | RE_NO_BK_PARENS | RE_NO_BK_REFS \
+ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
+ | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+# define RE_SYNTAX_GNU_AWK \
+ ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \
+ & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS \
+ | RE_CONTEXT_INVALID_OPS ))
+
+# define RE_SYNTAX_POSIX_AWK \
+ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
+ | RE_INTERVALS | RE_NO_GNU_OPS)
+
+# define RE_SYNTAX_GREP \
+ (RE_BK_PLUS_QM | RE_CHAR_CLASSES \
+ | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \
+ | RE_NEWLINE_ALT)
+
+# define RE_SYNTAX_EGREP \
+ (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \
+ | RE_NEWLINE_ALT | RE_NO_BK_PARENS \
+ | RE_NO_BK_VBAR)
+
+# define RE_SYNTAX_POSIX_EGREP \
+ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \
+ | RE_INVALID_INTERVAL_ORD)
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
+# define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+# define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax. */
+# define _RE_SYNTAX_POSIX_COMMON \
+ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
+ | RE_INTERVALS | RE_NO_EMPTY_RANGES)
+
+# define RE_SYNTAX_POSIX_BASIC \
+ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+ RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
+ isn't minimal, since other operators, such as \`, aren't disabled. */
+# define RE_SYNTAX_POSIX_MINIMAL_BASIC \
+ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+# define RE_SYNTAX_POSIX_EXTENDED \
+ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
+ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \
+ | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
+ removed and RE_NO_BK_REFS is added. */
+# define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
+ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
+ | RE_NO_BK_PARENS | RE_NO_BK_REFS \
+ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+#endif /* defined __USE_GNU_REGEX */
+
+#ifdef __USE_GNU_REGEX
+
+/* Maximum number of duplicates an interval can allow. POSIX-conforming
+ systems might define this in <limits.h>, but we want our
+ value, so remove any previous define. */
+# ifdef RE_DUP_MAX
+# undef RE_DUP_MAX
+# endif
+
+/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
+ the counter as a 2-byte signed integer. This is no longer true, so
+ RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
+ ((SIZE_MAX - 2) / 10 - 1) if _REGEX_LARGE_OFFSETS is defined.
+ However, there would be a huge performance problem if someone
+ actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
+ its historical value. */
+# define RE_DUP_MAX (0x7fff)
+
+#endif /* defined __USE_GNU_REGEX */
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp'). */
+
+/* If this bit is set, then use extended regular expression syntax.
+ If not set, then use basic regular expression syntax. */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+ If not set, then case is significant. */
+#define REG_ICASE (1 << 1)
+
+/* If this bit is set, then anchors do not match at newline
+ characters in the string.
+ If not set, then anchors do match at newlines. */
+#define REG_NEWLINE (1 << 2)
+
+/* If this bit is set, then report only success or fail in regexec.
+ If not set, then returns differ between not matching and errors. */
+#define REG_NOSUB (1 << 3)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec). */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+ the beginning of the string (presumably because it's not the
+ beginning of a line).
+ If not set, then the beginning-of-line operator does match the
+ beginning of the string. */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line. */
+#define REG_NOTEOL (1 << 1)
+
+/* Use PMATCH[0] to delimit the start and end of the search in the
+ buffer. */
+#define REG_STARTEND (1 << 2)
+
+
+/* If any error codes are removed, changed, or added, update the
+ `__re_error_msgid' table in regcomp.c. */
+
+typedef enum
+{
+ _REG_ENOSYS = -1, /* This will never happen for this implementation. */
+ _REG_NOERROR = 0, /* Success. */
+ _REG_NOMATCH, /* Didn't find a match (for regexec). */
+
+ /* POSIX regcomp return error codes. (In the order listed in the
+ standard.) */
+ _REG_BADPAT, /* Invalid pattern. */
+ _REG_ECOLLATE, /* Invalid collating element. */
+ _REG_ECTYPE, /* Invalid character class name. */
+ _REG_EESCAPE, /* Trailing backslash. */
+ _REG_ESUBREG, /* Invalid back reference. */
+ _REG_EBRACK, /* Unmatched left bracket. */
+ _REG_EPAREN, /* Parenthesis imbalance. */
+ _REG_EBRACE, /* Unmatched \{. */
+ _REG_BADBR, /* Invalid contents of \{\}. */
+ _REG_ERANGE, /* Invalid range end. */
+ _REG_ESPACE, /* Ran out of memory. */
+ _REG_BADRPT, /* No preceding re for repetition op. */
+
+ /* Error codes we've added. */
+ _REG_EEND, /* Premature end. */
+ _REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */
+ _REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
+} reg_errcode_t;
+
+#ifdef _XOPEN_SOURCE
+# define REG_ENOSYS _REG_ENOSYS
+#endif
+#define REG_NOERROR _REG_NOERROR
+#define REG_NOMATCH _REG_NOMATCH
+#define REG_BADPAT _REG_BADPAT
+#define REG_ECOLLATE _REG_ECOLLATE
+#define REG_ECTYPE _REG_ECTYPE
+#define REG_EESCAPE _REG_EESCAPE
+#define REG_ESUBREG _REG_ESUBREG
+#define REG_EBRACK _REG_EBRACK
+#define REG_EPAREN _REG_EPAREN
+#define REG_EBRACE _REG_EBRACE
+#define REG_BADBR _REG_BADBR
+#define REG_ERANGE _REG_ERANGE
+#define REG_ESPACE _REG_ESPACE
+#define REG_BADRPT _REG_BADRPT
+#define REG_EEND _REG_EEND
+#define REG_ESIZE _REG_ESIZE
+#define REG_ERPAREN _REG_ERPAREN
+
+/* struct re_pattern_buffer normally uses member names like `buffer'
+ that POSIX does not allow. In POSIX mode these members have names
+ with leading `re_' (e.g., `re_buffer'). */
+#ifdef __USE_GNU_REGEX
+# define _REG_RE_NAME(id) id
+# define _REG_RM_NAME(id) id
+#else
+# define _REG_RE_NAME(id) re_##id
+# define _REG_RM_NAME(id) rm_##id
+#endif
+
+/* The user can specify the type of the re_translate member by
+ defining the macro RE_TRANSLATE_TYPE, which defaults to unsigned
+ char *. This pollutes the POSIX name space, so in POSIX mode just
+ use unsigned char *. */
+#ifdef __USE_GNU_REGEX
+# ifndef RE_TRANSLATE_TYPE
+# define RE_TRANSLATE_TYPE unsigned char *
+# endif
+# define REG_TRANSLATE_TYPE RE_TRANSLATE_TYPE
+#else
+# define REG_TRANSLATE_TYPE unsigned char *
+#endif
+
+/* This data structure represents a compiled pattern. Before calling
+ the pattern compiler, the fields `buffer', `allocated', `fastmap',
+ `translate', and `no_sub' can be set. After the pattern has been
+ compiled, the `re_nsub' field is available. All other fields are
+ private to the regex routines. */
+
+struct re_pattern_buffer
+{
+ /* Space that holds the compiled pattern. It is declared as
+ `unsigned char *' because its elements are sometimes used as
+ array indexes. */
+ unsigned char *_REG_RE_NAME (buffer);
+
+ /* Number of bytes to which `buffer' points. */
+ __re_long_size_t _REG_RE_NAME (allocated);
+
+ /* Number of bytes actually used in `buffer'. */
+ __re_long_size_t _REG_RE_NAME (used);
+
+ /* Syntax setting with which the pattern was compiled. */
+ reg_syntax_t _REG_RE_NAME (syntax);
+
+ /* Pointer to a fastmap, if any, otherwise zero. re_search uses the
+ fastmap, if there is one, to skip over impossible starting points
+ for matches. */
+ char *_REG_RE_NAME (fastmap);
+
+ /* Either a translate table to apply to all characters before
+ comparing them, or zero for no translation. The translation is
+ applied to a pattern when it is compiled and to a string when it
+ is matched. */
+ REG_TRANSLATE_TYPE _REG_RE_NAME (translate);
+
+ /* Number of subexpressions found by the compiler. */
+ size_t re_nsub;
+
+ /* Zero if this pattern cannot match the empty string, one else.
+ Well, in truth it's used only in `re_search_2', to see whether or
+ not we should use the fastmap, so we don't set this absolutely
+ perfectly; see `re_compile_fastmap' (the `duplicate' case). */
+ unsigned int _REG_RE_NAME (can_be_null) : 1;
+
+ /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+ for `max (RE_NREGS, re_nsub + 1)' groups.
+ If REGS_REALLOCATE, reallocate space if necessary.
+ If REGS_FIXED, use what's there. */
+#ifdef __USE_GNU_REGEX
+# define REGS_UNALLOCATED 0
+# define REGS_REALLOCATE 1
+# define REGS_FIXED 2
+#endif
+ unsigned int _REG_RE_NAME (regs_allocated) : 2;
+
+ /* Set to zero when `regex_compile' compiles a pattern; set to one
+ by `re_compile_fastmap' if it updates the fastmap. */
+ unsigned int _REG_RE_NAME (fastmap_accurate) : 1;
+
+ /* If set, `re_match_2' does not return information about
+ subexpressions. */
+ unsigned int _REG_RE_NAME (no_sub) : 1;
+
+ /* If set, a beginning-of-line anchor doesn't match at the beginning
+ of the string. */
+ unsigned int _REG_RE_NAME (not_bol) : 1;
+
+ /* Similarly for an end-of-line anchor. */
+ unsigned int _REG_RE_NAME (not_eol) : 1;
+
+ /* If true, an anchor at a newline matches. */
+ unsigned int _REG_RE_NAME (newline_anchor) : 1;
+
+/* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* This is the structure we store register match data in. See
+ regex.texinfo for a full description of what registers match. */
+struct re_registers
+{
+ __re_size_t _REG_RM_NAME (num_regs);
+ regoff_t *_REG_RM_NAME (start);
+ regoff_t *_REG_RM_NAME (end);
+};
+
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+ `re_match_2' returns information about at least this many registers
+ the first time a `regs' structure is passed. */
+#if !defined RE_NREGS && defined __USE_GNU_REGEX
+# define RE_NREGS 30
+#endif
+
+
+/* POSIX specification for registers. Aside from the different names than
+ `re_registers', POSIX uses an array of structures, instead of a
+ structure of arrays. */
+typedef struct
+{
+ regoff_t rm_so; /* Byte offset from string's start to substring's start. */
+ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */
+} regmatch_t;
+
+/* Declarations for routines. */
+
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+ You can also simply assign to the `re_syntax_options' variable. */
+extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
+
+/* Compile the regular expression PATTERN, with length LENGTH
+ and syntax given by the global `re_syntax_options', into the buffer
+ BUFFER. Return NULL if successful, and an error string if not. */
+extern const char *re_compile_pattern (const char *__pattern, size_t __length,
+ struct re_pattern_buffer *__buffer);
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+ accelerate searches. Return 0 if successful and -2 if was an
+ internal error. */
+extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+ compiled into BUFFER. Start searching at position START, for RANGE
+ characters. Return the starting position of the match, -1 for no
+ match, or -2 for an internal error. Also return register
+ information in REGS (if REGS and BUFFER->no_sub are nonzero). */
+extern regoff_t re_search (struct re_pattern_buffer *__buffer,
+ const char *__string, __re_idx_t __length,
+ __re_idx_t __start, regoff_t __range,
+ struct re_registers *__regs);
+
+
+/* Like `re_search', but search in the concatenation of STRING1 and
+ STRING2. Also, stop searching at index START + STOP. */
+extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
+ const char *__string1, __re_idx_t __length1,
+ const char *__string2, __re_idx_t __length2,
+ __re_idx_t __start, regoff_t __range,
+ struct re_registers *__regs,
+ __re_idx_t __stop);
+
+
+/* Like `re_search', but return how many characters in STRING the regexp
+ in BUFFER matched, starting at position START. */
+extern regoff_t re_match (struct re_pattern_buffer *__buffer,
+ const char *__string, __re_idx_t __length,
+ __re_idx_t __start, struct re_registers *__regs);
+
+
+/* Relates to `re_match' as `re_search_2' relates to `re_search'. */
+extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
+ const char *__string1, __re_idx_t __length1,
+ const char *__string2, __re_idx_t __length2,
+ __re_idx_t __start, struct re_registers *__regs,
+ __re_idx_t __stop);
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+ ENDS. Subsequent matches using BUFFER and REGS will use this memory
+ for recording register information. STARTS and ENDS must be
+ allocated with malloc, and must each be at least `NUM_REGS * sizeof
+ (regoff_t)' bytes long.
+
+ If NUM_REGS == 0, then subsequent matches should allocate their own
+ register data.
+
+ Unless this function is called, the first search or match using
+ PATTERN_BUFFER will allocate its own register data, without
+ freeing the old data. */
+extern void re_set_registers (struct re_pattern_buffer *__buffer,
+ struct re_registers *__regs,
+ __re_size_t __num_regs,
+ regoff_t *__starts, regoff_t *__ends);
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+# ifndef _CRAY
+/* 4.2 bsd compatibility. */
+extern char *re_comp (const char *);
+extern int re_exec (const char *);
+# endif
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+# define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# define _Restrict_ __restrict
+# else
+# define _Restrict_
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax. Don't trust
+ sys/cdefs.h's definition of __restrict_arr, though, as it
+ mishandles gcc -ansi -pedantic. */
+#ifndef _Restrict_arr_
+# if ((199901L <= __STDC_VERSION__ \
+ || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
+ && !__STRICT_ANSI__)) \
+ && !defined __GNUG__)
+# define _Restrict_arr_ _Restrict_
+# else
+# define _Restrict_arr_
+# endif
+#endif
+
+/* POSIX compatibility. */
+extern int regcomp (regex_t *_Restrict_ __preg,
+ const char *_Restrict_ __pattern,
+ int __cflags);
+
+extern int regexec (const regex_t *_Restrict_ __preg,
+ const char *_Restrict_ __string, size_t __nmatch,
+ regmatch_t __pmatch[_Restrict_arr_],
+ int __eflags);
+
+extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg,
+ char *_Restrict_ __errbuf, size_t __errbuf_size);
+
+extern void regfree (regex_t *__preg);
+
+
+#ifdef __cplusplus
+}
+#endif /* C++ */
+
+#endif /* regex.h */
diff --git a/gnulib/lib/regex_internal.c b/gnulib/lib/regex_internal.c
new file mode 100644
index 00000000..378b767d
--- /dev/null
+++ b/gnulib/lib/regex_internal.c
@@ -0,0 +1,1740 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+ Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+static void re_string_construct_common (const char *str, Idx len,
+ re_string_t *pstr,
+ RE_TRANSLATE_TYPE trans, bool icase,
+ const re_dfa_t *dfa) internal_function;
+static re_dfastate_t *create_ci_newstate (const re_dfa_t *dfa,
+ const re_node_set *nodes,
+ re_hashval_t hash) internal_function;
+static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa,
+ const re_node_set *nodes,
+ unsigned int context,
+ re_hashval_t hash) internal_function;
+
+/* Functions for string operation. */
+
+/* This function allocate the buffers. It is necessary to call
+ re_string_reconstruct before using the object. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len,
+ RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
+{
+ reg_errcode_t ret;
+ Idx init_buf_len;
+
+ /* Ensure at least one character fits into the buffers. */
+ if (init_len < dfa->mb_cur_max)
+ init_len = dfa->mb_cur_max;
+ init_buf_len = (len + 1 < init_len) ? len + 1: init_len;
+ re_string_construct_common (str, len, pstr, trans, icase, dfa);
+
+ ret = re_string_realloc_buffers (pstr, init_buf_len);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+
+ pstr->word_char = dfa->word_char;
+ pstr->word_ops_used = dfa->word_ops_used;
+ pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
+ pstr->valid_len = (pstr->mbs_allocated || dfa->mb_cur_max > 1) ? 0 : len;
+ pstr->valid_raw_len = pstr->valid_len;
+ return REG_NOERROR;
+}
+
+/* This function allocate the buffers, and initialize them. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_string_construct (re_string_t *pstr, const char *str, Idx len,
+ RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
+{
+ reg_errcode_t ret;
+ memset (pstr, '\0', sizeof (re_string_t));
+ re_string_construct_common (str, len, pstr, trans, icase, dfa);
+
+ if (len > 0)
+ {
+ ret = re_string_realloc_buffers (pstr, len + 1);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
+
+ if (icase)
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ while (1)
+ {
+ ret = build_wcs_upper_buffer (pstr);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ if (pstr->valid_raw_len >= len)
+ break;
+ if (pstr->bufs_len > pstr->valid_len + dfa->mb_cur_max)
+ break;
+ ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ build_upper_buffer (pstr);
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ build_wcs_buffer (pstr);
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ if (trans != NULL)
+ re_string_translate_buffer (pstr);
+ else
+ {
+ pstr->valid_len = pstr->bufs_len;
+ pstr->valid_raw_len = pstr->bufs_len;
+ }
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Helper functions for re_string_allocate, and re_string_construct. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len)
+{
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ wint_t *new_wcs;
+
+ /* Avoid overflow. */
+ size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx));
+ if (BE (SIZE_MAX / max_object_size < new_buf_len, 0))
+ return REG_ESPACE;
+
+ new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
+ if (BE (new_wcs == NULL, 0))
+ return REG_ESPACE;
+ pstr->wcs = new_wcs;
+ if (pstr->offsets != NULL)
+ {
+ Idx *new_offsets = re_realloc (pstr->offsets, Idx, new_buf_len);
+ if (BE (new_offsets == NULL, 0))
+ return REG_ESPACE;
+ pstr->offsets = new_offsets;
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ if (pstr->mbs_allocated)
+ {
+ unsigned char *new_mbs = re_realloc (pstr->mbs, unsigned char,
+ new_buf_len);
+ if (BE (new_mbs == NULL, 0))
+ return REG_ESPACE;
+ pstr->mbs = new_mbs;
+ }
+ pstr->bufs_len = new_buf_len;
+ return REG_NOERROR;
+}
+
+
+static void
+internal_function
+re_string_construct_common (const char *str, Idx len, re_string_t *pstr,
+ RE_TRANSLATE_TYPE trans, bool icase,
+ const re_dfa_t *dfa)
+{
+ pstr->raw_mbs = (const unsigned char *) str;
+ pstr->len = len;
+ pstr->raw_len = len;
+ pstr->trans = trans;
+ pstr->icase = icase;
+ pstr->mbs_allocated = (trans != NULL || icase);
+ pstr->mb_cur_max = dfa->mb_cur_max;
+ pstr->is_utf8 = dfa->is_utf8;
+ pstr->map_notascii = dfa->map_notascii;
+ pstr->stop = pstr->len;
+ pstr->raw_stop = pstr->stop;
+}
+
+#ifdef RE_ENABLE_I18N
+
+/* Build wide character buffer PSTR->WCS.
+ If the byte sequence of the string are:
+ <mb1>(0), <mb1>(1), <mb2>(0), <mb2>(1), <sb3>
+ Then wide character buffer will be:
+ <wc1> , WEOF , <wc2> , WEOF , <wc3>
+ We use WEOF for padding, they indicate that the position isn't
+ a first byte of a multibyte character.
+
+ Note that this function assumes PSTR->VALID_LEN elements are already
+ built and starts from PSTR->VALID_LEN. */
+
+static void
+internal_function
+build_wcs_buffer (re_string_t *pstr)
+{
+#ifdef _LIBC
+ unsigned char buf[MB_LEN_MAX];
+ assert (MB_LEN_MAX >= pstr->mb_cur_max);
+#else
+ unsigned char buf[64];
+#endif
+ mbstate_t prev_st;
+ Idx byte_idx, end_idx, remain_len;
+ size_t mbclen;
+
+ /* Build the buffers from pstr->valid_len to either pstr->len or
+ pstr->bufs_len. */
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+ for (byte_idx = pstr->valid_len; byte_idx < end_idx;)
+ {
+ wchar_t wc;
+ const char *p;
+
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ /* Apply the translation if we need. */
+ if (BE (pstr->trans != NULL, 0))
+ {
+ int i, ch;
+
+ for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
+ {
+ ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i];
+ buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch];
+ }
+ p = (const char *) buf;
+ }
+ else
+ p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx;
+ mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+ if (BE (mbclen == (size_t) -2, 0))
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0))
+ {
+ /* We treat these cases as a singlebyte character. */
+ mbclen = 1;
+ wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+ if (BE (pstr->trans != NULL, 0))
+ wc = pstr->trans[wc];
+ pstr->cur_state = prev_st;
+ }
+
+ /* Write wide character and padding. */
+ pstr->wcs[byte_idx++] = wc;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = byte_idx;
+}
+
+/* Build wide character buffer PSTR->WCS like build_wcs_buffer,
+ but for REG_ICASE. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+build_wcs_upper_buffer (re_string_t *pstr)
+{
+ mbstate_t prev_st;
+ Idx src_idx, byte_idx, end_idx, remain_len;
+ size_t mbclen;
+#ifdef _LIBC
+ char buf[MB_LEN_MAX];
+ assert (MB_LEN_MAX >= pstr->mb_cur_max);
+#else
+ char buf[64];
+#endif
+
+ byte_idx = pstr->valid_len;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ /* The following optimization assumes that ASCII characters can be
+ mapped to wide characters with a simple cast. */
+ if (! pstr->map_notascii && pstr->trans == NULL && !pstr->offsets_needed)
+ {
+ while (byte_idx < end_idx)
+ {
+ wchar_t wc;
+
+ if (isascii (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx])
+ && mbsinit (&pstr->cur_state))
+ {
+ /* In case of a singlebyte character. */
+ pstr->mbs[byte_idx]
+ = toupper (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]);
+ /* The next step uses the assumption that wchar_t is encoded
+ ASCII-safe: all ASCII values can be converted like this. */
+ pstr->wcs[byte_idx] = (wchar_t) pstr->mbs[byte_idx];
+ ++byte_idx;
+ continue;
+ }
+
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ mbclen = __mbrtowc (&wc,
+ ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
+ + byte_idx), remain_len, &pstr->cur_state);
+ if (BE (mbclen < (size_t) -2, 1))
+ {
+ wchar_t wcu = wc;
+ if (iswlower (wc))
+ {
+ size_t mbcdlen;
+
+ wcu = towupper (wc);
+ mbcdlen = wcrtomb (buf, wcu, &prev_st);
+ if (BE (mbclen == mbcdlen, 1))
+ memcpy (pstr->mbs + byte_idx, buf, mbclen);
+ else
+ {
+ src_idx = byte_idx;
+ goto offsets_needed;
+ }
+ }
+ else
+ memcpy (pstr->mbs + byte_idx,
+ pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx, mbclen);
+ pstr->wcs[byte_idx++] = wcu;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ else if (mbclen == (size_t) -1 || mbclen == 0)
+ {
+ /* It is an invalid character or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+ pstr->mbs[byte_idx] = ch;
+ /* And also cast it to wide char. */
+ pstr->wcs[byte_idx++] = (wchar_t) ch;
+ if (BE (mbclen == (size_t) -1, 0))
+ pstr->cur_state = prev_st;
+ }
+ else
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = byte_idx;
+ return REG_NOERROR;
+ }
+ else
+ for (src_idx = pstr->valid_raw_len; byte_idx < end_idx;)
+ {
+ wchar_t wc;
+ const char *p;
+ offsets_needed:
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ if (BE (pstr->trans != NULL, 0))
+ {
+ int i, ch;
+
+ for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
+ {
+ ch = pstr->raw_mbs [pstr->raw_mbs_idx + src_idx + i];
+ buf[i] = pstr->trans[ch];
+ }
+ p = (const char *) buf;
+ }
+ else
+ p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + src_idx;
+ mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+ if (BE (mbclen < (size_t) -2, 1))
+ {
+ wchar_t wcu = wc;
+ if (iswlower (wc))
+ {
+ size_t mbcdlen;
+
+ wcu = towupper (wc);
+ mbcdlen = wcrtomb ((char *) buf, wcu, &prev_st);
+ if (BE (mbclen == mbcdlen, 1))
+ memcpy (pstr->mbs + byte_idx, buf, mbclen);
+ else if (mbcdlen != (size_t) -1)
+ {
+ size_t i;
+
+ if (byte_idx + mbcdlen > pstr->bufs_len)
+ {
+ pstr->cur_state = prev_st;
+ break;
+ }
+
+ if (pstr->offsets == NULL)
+ {
+ pstr->offsets = re_malloc (Idx, pstr->bufs_len);
+
+ if (pstr->offsets == NULL)
+ return REG_ESPACE;
+ }
+ if (!pstr->offsets_needed)
+ {
+ for (i = 0; i < (size_t) byte_idx; ++i)
+ pstr->offsets[i] = i;
+ pstr->offsets_needed = 1;
+ }
+
+ memcpy (pstr->mbs + byte_idx, buf, mbcdlen);
+ pstr->wcs[byte_idx] = wcu;
+ pstr->offsets[byte_idx] = src_idx;
+ for (i = 1; i < mbcdlen; ++i)
+ {
+ pstr->offsets[byte_idx + i]
+ = src_idx + (i < mbclen ? i : mbclen - 1);
+ pstr->wcs[byte_idx + i] = WEOF;
+ }
+ pstr->len += mbcdlen - mbclen;
+ if (pstr->raw_stop > src_idx)
+ pstr->stop += mbcdlen - mbclen;
+ end_idx = (pstr->bufs_len > pstr->len)
+ ? pstr->len : pstr->bufs_len;
+ byte_idx += mbcdlen;
+ src_idx += mbclen;
+ continue;
+ }
+ else
+ memcpy (pstr->mbs + byte_idx, p, mbclen);
+ }
+ else
+ memcpy (pstr->mbs + byte_idx, p, mbclen);
+
+ if (BE (pstr->offsets_needed != 0, 0))
+ {
+ size_t i;
+ for (i = 0; i < mbclen; ++i)
+ pstr->offsets[byte_idx + i] = src_idx + i;
+ }
+ src_idx += mbclen;
+
+ pstr->wcs[byte_idx++] = wcu;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ else if (mbclen == (size_t) -1 || mbclen == 0)
+ {
+ /* It is an invalid character or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
+
+ if (BE (pstr->trans != NULL, 0))
+ ch = pstr->trans [ch];
+ pstr->mbs[byte_idx] = ch;
+
+ if (BE (pstr->offsets_needed != 0, 0))
+ pstr->offsets[byte_idx] = src_idx;
+ ++src_idx;
+
+ /* And also cast it to wide char. */
+ pstr->wcs[byte_idx++] = (wchar_t) ch;
+ if (BE (mbclen == (size_t) -1, 0))
+ pstr->cur_state = prev_st;
+ }
+ else
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = src_idx;
+ return REG_NOERROR;
+}
+
+/* Skip characters until the index becomes greater than NEW_RAW_IDX.
+ Return the index. */
+
+static Idx
+internal_function
+re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc)
+{
+ mbstate_t prev_st;
+ Idx rawbuf_idx;
+ size_t mbclen;
+ wint_t wc = WEOF;
+
+ /* Skip the characters which are not necessary to check. */
+ for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_raw_len;
+ rawbuf_idx < new_raw_idx;)
+ {
+ wchar_t wc2;
+ Idx remain_len;
+ remain_len = pstr->len - rawbuf_idx;
+ prev_st = pstr->cur_state;
+ mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx,
+ remain_len, &pstr->cur_state);
+ if (BE (mbclen == (size_t) -2 || mbclen == (size_t) -1 || mbclen == 0, 0))
+ {
+ /* We treat these cases as a single byte character. */
+ if (mbclen == 0 || remain_len == 0)
+ wc = L'\0';
+ else
+ wc = *(unsigned char *) (pstr->raw_mbs + rawbuf_idx);
+ mbclen = 1;
+ pstr->cur_state = prev_st;
+ }
+ else
+ wc = wc2;
+ /* Then proceed the next character. */
+ rawbuf_idx += mbclen;
+ }
+ *last_wc = wc;
+ return rawbuf_idx;
+}
+#endif /* RE_ENABLE_I18N */
+
+/* Build the buffer PSTR->MBS, and apply the translation if we need.
+ This function is used in case of REG_ICASE. */
+
+static void
+internal_function
+build_upper_buffer (re_string_t *pstr)
+{
+ Idx char_idx, end_idx;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx)
+ {
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx];
+ if (BE (pstr->trans != NULL, 0))
+ ch = pstr->trans[ch];
+ if (islower (ch))
+ pstr->mbs[char_idx] = toupper (ch);
+ else
+ pstr->mbs[char_idx] = ch;
+ }
+ pstr->valid_len = char_idx;
+ pstr->valid_raw_len = char_idx;
+}
+
+/* Apply TRANS to the buffer in PSTR. */
+
+static void
+internal_function
+re_string_translate_buffer (re_string_t *pstr)
+{
+ Idx buf_idx, end_idx;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ for (buf_idx = pstr->valid_len; buf_idx < end_idx; ++buf_idx)
+ {
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + buf_idx];
+ pstr->mbs[buf_idx] = pstr->trans[ch];
+ }
+
+ pstr->valid_len = buf_idx;
+ pstr->valid_raw_len = buf_idx;
+}
+
+/* This function re-construct the buffers.
+ Concretely, convert to wide character in case of pstr->mb_cur_max > 1,
+ convert to upper case in case of REG_ICASE, apply translation. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags)
+{
+ Idx offset;
+
+ if (BE (pstr->raw_mbs_idx <= idx, 0))
+ offset = idx - pstr->raw_mbs_idx;
+ else
+ {
+ /* Reset buffer. */
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+#endif /* RE_ENABLE_I18N */
+ pstr->len = pstr->raw_len;
+ pstr->stop = pstr->raw_stop;
+ pstr->valid_len = 0;
+ pstr->raw_mbs_idx = 0;
+ pstr->valid_raw_len = 0;
+ pstr->offsets_needed = 0;
+ pstr->tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+ : CONTEXT_NEWLINE | CONTEXT_BEGBUF);
+ if (!pstr->mbs_allocated)
+ pstr->mbs = (unsigned char *) pstr->raw_mbs;
+ offset = idx;
+ }
+
+ if (BE (offset != 0, 1))
+ {
+ /* Should the already checked characters be kept? */
+ if (BE (offset < pstr->valid_raw_len, 1))
+ {
+ /* Yes, move them to the front of the buffer. */
+#ifdef RE_ENABLE_I18N
+ if (BE (pstr->offsets_needed, 0))
+ {
+ Idx low = 0, high = pstr->valid_len, mid;
+ do
+ {
+ mid = (high + low) / 2;
+ if (pstr->offsets[mid] > offset)
+ high = mid;
+ else if (pstr->offsets[mid] < offset)
+ low = mid + 1;
+ else
+ break;
+ }
+ while (low < high);
+ if (pstr->offsets[mid] < offset)
+ ++mid;
+ pstr->tip_context = re_string_context_at (pstr, mid - 1,
+ eflags);
+ /* This can be quite complicated, so handle specially
+ only the common and easy case where the character with
+ different length representation of lower and upper
+ case is present at or after offset. */
+ if (pstr->valid_len > offset
+ && mid == offset && pstr->offsets[mid] == offset)
+ {
+ memmove (pstr->wcs, pstr->wcs + offset,
+ (pstr->valid_len - offset) * sizeof (wint_t));
+ memmove (pstr->mbs, pstr->mbs + offset, pstr->valid_len - offset);
+ pstr->valid_len -= offset;
+ pstr->valid_raw_len -= offset;
+ for (low = 0; low < pstr->valid_len; low++)
+ pstr->offsets[low] = pstr->offsets[low + offset] - offset;
+ }
+ else
+ {
+ /* Otherwise, just find out how long the partial multibyte
+ character at offset is and fill it with WEOF/255. */
+ pstr->len = pstr->raw_len - idx + offset;
+ pstr->stop = pstr->raw_stop - idx + offset;
+ pstr->offsets_needed = 0;
+ while (mid > 0 && pstr->offsets[mid - 1] == offset)
+ --mid;
+ while (mid < pstr->valid_len)
+ if (pstr->wcs[mid] != WEOF)
+ break;
+ else
+ ++mid;
+ if (mid == pstr->valid_len)
+ pstr->valid_len = 0;
+ else
+ {
+ pstr->valid_len = pstr->offsets[mid] - offset;
+ if (pstr->valid_len)
+ {
+ for (low = 0; low < pstr->valid_len; ++low)
+ pstr->wcs[low] = WEOF;
+ memset (pstr->mbs, 255, pstr->valid_len);
+ }
+ }
+ pstr->valid_raw_len = pstr->valid_len;
+ }
+ }
+ else
+#endif
+ {
+ pstr->tip_context = re_string_context_at (pstr, offset - 1,
+ eflags);
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ memmove (pstr->wcs, pstr->wcs + offset,
+ (pstr->valid_len - offset) * sizeof (wint_t));
+#endif /* RE_ENABLE_I18N */
+ if (BE (pstr->mbs_allocated, 0))
+ memmove (pstr->mbs, pstr->mbs + offset,
+ pstr->valid_len - offset);
+ pstr->valid_len -= offset;
+ pstr->valid_raw_len -= offset;
+#if DEBUG
+ assert (pstr->valid_len > 0);
+#endif
+ }
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ /* No, skip all characters until IDX. */
+ Idx prev_valid_len = pstr->valid_len;
+
+ if (BE (pstr->offsets_needed, 0))
+ {
+ pstr->len = pstr->raw_len - idx + offset;
+ pstr->stop = pstr->raw_stop - idx + offset;
+ pstr->offsets_needed = 0;
+ }
+#endif
+ pstr->valid_len = 0;
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ Idx wcs_idx;
+ wint_t wc = WEOF;
+
+ if (pstr->is_utf8)
+ {
+ const unsigned char *raw, *p, *end;
+
+ /* Special case UTF-8. Multi-byte chars start with any
+ byte other than 0x80 - 0xbf. */
+ raw = pstr->raw_mbs + pstr->raw_mbs_idx;
+ end = raw + (offset - pstr->mb_cur_max);
+ if (end < pstr->raw_mbs)
+ end = pstr->raw_mbs;
+ p = raw + offset - 1;
+#ifdef _LIBC
+ /* We know the wchar_t encoding is UCS4, so for the simple
+ case, ASCII characters, skip the conversion step. */
+ if (isascii (*p) && BE (pstr->trans == NULL, 1))
+ {
+ memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+ /* pstr->valid_len = 0; */
+ wc = (wchar_t) *p;
+ }
+ else
+#endif
+ for (; p >= end; --p)
+ if ((*p & 0xc0) != 0x80)
+ {
+ mbstate_t cur_state;
+ wchar_t wc2;
+ Idx mlen = raw + pstr->len - p;
+ unsigned char buf[6];
+ size_t mbclen;
+
+ if (BE (pstr->trans != NULL, 0))
+ {
+ int i = mlen < 6 ? mlen : 6;
+ while (--i >= 0)
+ buf[i] = pstr->trans[p[i]];
+ }
+ /* XXX Don't use mbrtowc, we know which conversion
+ to use (UTF-8 -> UCS4). */
+ memset (&cur_state, 0, sizeof (cur_state));
+ mbclen = __mbrtowc (&wc2, (const char *) p, mlen,
+ &cur_state);
+ if (raw + offset - p <= mbclen
+ && mbclen < (size_t) -2)
+ {
+ memset (&pstr->cur_state, '\0',
+ sizeof (mbstate_t));
+ pstr->valid_len = mbclen - (raw + offset - p);
+ wc = wc2;
+ }
+ break;
+ }
+ }
+
+ if (wc == WEOF)
+ pstr->valid_len = re_string_skip_chars (pstr, idx, &wc) - idx;
+ if (wc == WEOF)
+ pstr->tip_context
+ = re_string_context_at (pstr, prev_valid_len - 1, eflags);
+ else
+ pstr->tip_context = ((BE (pstr->word_ops_used != 0, 0)
+ && IS_WIDE_WORD_CHAR (wc))
+ ? CONTEXT_WORD
+ : ((IS_WIDE_NEWLINE (wc)
+ && pstr->newline_anchor)
+ ? CONTEXT_NEWLINE : 0));
+ if (BE (pstr->valid_len, 0))
+ {
+ for (wcs_idx = 0; wcs_idx < pstr->valid_len; ++wcs_idx)
+ pstr->wcs[wcs_idx] = WEOF;
+ if (pstr->mbs_allocated)
+ memset (pstr->mbs, 255, pstr->valid_len);
+ }
+ pstr->valid_raw_len = pstr->valid_len;
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ int c = pstr->raw_mbs[pstr->raw_mbs_idx + offset - 1];
+ pstr->valid_raw_len = 0;
+ if (pstr->trans)
+ c = pstr->trans[c];
+ pstr->tip_context = (bitset_contain (pstr->word_char, c)
+ ? CONTEXT_WORD
+ : ((IS_NEWLINE (c) && pstr->newline_anchor)
+ ? CONTEXT_NEWLINE : 0));
+ }
+ }
+ if (!BE (pstr->mbs_allocated, 0))
+ pstr->mbs += offset;
+ }
+ pstr->raw_mbs_idx = idx;
+ pstr->len -= offset;
+ pstr->stop -= offset;
+
+ /* Then build the buffers. */
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ if (pstr->icase)
+ {
+ reg_errcode_t ret = build_wcs_upper_buffer (pstr);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ else
+ build_wcs_buffer (pstr);
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ if (BE (pstr->mbs_allocated, 0))
+ {
+ if (pstr->icase)
+ build_upper_buffer (pstr);
+ else if (pstr->trans != NULL)
+ re_string_translate_buffer (pstr);
+ }
+ else
+ pstr->valid_len = pstr->len;
+
+ pstr->cur_idx = 0;
+ return REG_NOERROR;
+}
+
+static unsigned char
+internal_function __attribute ((pure))
+re_string_peek_byte_case (const re_string_t *pstr, Idx idx)
+{
+ int ch;
+ Idx off;
+
+ /* Handle the common (easiest) cases first. */
+ if (BE (!pstr->mbs_allocated, 1))
+ return re_string_peek_byte (pstr, idx);
+
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1
+ && ! re_string_is_single_byte_char (pstr, pstr->cur_idx + idx))
+ return re_string_peek_byte (pstr, idx);
+#endif
+
+ off = pstr->cur_idx + idx;
+#ifdef RE_ENABLE_I18N
+ if (pstr->offsets_needed)
+ off = pstr->offsets[off];
+#endif
+
+ ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure that e.g. for tr_TR.UTF-8 BACKSLASH DOTLESS SMALL LETTER I
+ this function returns CAPITAL LETTER I instead of first byte of
+ DOTLESS SMALL LETTER I. The latter would confuse the parser,
+ since peek_byte_case doesn't advance cur_idx in any way. */
+ if (pstr->offsets_needed && !isascii (ch))
+ return re_string_peek_byte (pstr, idx);
+#endif
+
+ return ch;
+}
+
+static unsigned char
+internal_function __attribute ((pure))
+re_string_fetch_byte_case (re_string_t *pstr)
+{
+ if (BE (!pstr->mbs_allocated, 1))
+ return re_string_fetch_byte (pstr);
+
+#ifdef RE_ENABLE_I18N
+ if (pstr->offsets_needed)
+ {
+ Idx off;
+ int ch;
+
+ /* For tr_TR.UTF-8 [[:islower:]] there is
+ [[: CAPITAL LETTER I WITH DOT lower:]] in mbs. Skip
+ in that case the whole multi-byte character and return
+ the original letter. On the other side, with
+ [[: DOTLESS SMALL LETTER I return [[:I, as doing
+ anything else would complicate things too much. */
+
+ if (!re_string_first_byte (pstr, pstr->cur_idx))
+ return re_string_fetch_byte (pstr);
+
+ off = pstr->offsets[pstr->cur_idx];
+ ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
+
+ if (! isascii (ch))
+ return re_string_fetch_byte (pstr);
+
+ re_string_skip_bytes (pstr,
+ re_string_char_size_at (pstr, pstr->cur_idx));
+ return ch;
+ }
+#endif
+
+ return pstr->raw_mbs[pstr->raw_mbs_idx + pstr->cur_idx++];
+}
+
+static void
+internal_function
+re_string_destruct (re_string_t *pstr)
+{
+#ifdef RE_ENABLE_I18N
+ re_free (pstr->wcs);
+ re_free (pstr->offsets);
+#endif /* RE_ENABLE_I18N */
+ if (pstr->mbs_allocated)
+ re_free (pstr->mbs);
+}
+
+/* Return the context at IDX in INPUT. */
+
+static unsigned int
+internal_function
+re_string_context_at (const re_string_t *input, Idx idx, int eflags)
+{
+ int c;
+ if (BE (! REG_VALID_INDEX (idx), 0))
+ /* In this case, we use the value stored in input->tip_context,
+ since we can't know the character in input->mbs[-1] here. */
+ return input->tip_context;
+ if (BE (idx == input->len, 0))
+ return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF
+ : CONTEXT_NEWLINE | CONTEXT_ENDBUF);
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc;
+ Idx wc_idx = idx;
+ while(input->wcs[wc_idx] == WEOF)
+ {
+#ifdef DEBUG
+ /* It must not happen. */
+ assert (REG_VALID_INDEX (wc_idx));
+#endif
+ --wc_idx;
+ if (! REG_VALID_INDEX (wc_idx))
+ return input->tip_context;
+ }
+ wc = input->wcs[wc_idx];
+ if (BE (input->word_ops_used != 0, 0) && IS_WIDE_WORD_CHAR (wc))
+ return CONTEXT_WORD;
+ return (IS_WIDE_NEWLINE (wc) && input->newline_anchor
+ ? CONTEXT_NEWLINE : 0);
+ }
+ else
+#endif
+ {
+ c = re_string_byte_at (input, idx);
+ if (bitset_contain (input->word_char, c))
+ return CONTEXT_WORD;
+ return IS_NEWLINE (c) && input->newline_anchor ? CONTEXT_NEWLINE : 0;
+ }
+}
+
+/* Functions for set operation. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_alloc (re_node_set *set, Idx size)
+{
+ set->alloc = size;
+ set->nelem = 0;
+ set->elems = re_malloc (Idx, size);
+ if (BE (set->elems == NULL, 0))
+ return REG_ESPACE;
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_init_1 (re_node_set *set, Idx elem)
+{
+ set->alloc = 1;
+ set->nelem = 1;
+ set->elems = re_malloc (Idx, 1);
+ if (BE (set->elems == NULL, 0))
+ {
+ set->alloc = set->nelem = 0;
+ return REG_ESPACE;
+ }
+ set->elems[0] = elem;
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2)
+{
+ set->alloc = 2;
+ set->elems = re_malloc (Idx, 2);
+ if (BE (set->elems == NULL, 0))
+ return REG_ESPACE;
+ if (elem1 == elem2)
+ {
+ set->nelem = 1;
+ set->elems[0] = elem1;
+ }
+ else
+ {
+ set->nelem = 2;
+ if (elem1 < elem2)
+ {
+ set->elems[0] = elem1;
+ set->elems[1] = elem2;
+ }
+ else
+ {
+ set->elems[0] = elem2;
+ set->elems[1] = elem1;
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_init_copy (re_node_set *dest, const re_node_set *src)
+{
+ dest->nelem = src->nelem;
+ if (src->nelem > 0)
+ {
+ dest->alloc = dest->nelem;
+ dest->elems = re_malloc (Idx, dest->alloc);
+ if (BE (dest->elems == NULL, 0))
+ {
+ dest->alloc = dest->nelem = 0;
+ return REG_ESPACE;
+ }
+ memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
+ }
+ else
+ re_node_set_init_empty (dest);
+ return REG_NOERROR;
+}
+
+/* Calculate the intersection of the sets SRC1 and SRC2. And merge it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded.
+ Note: We assume dest->elems is NULL, when dest->alloc is 0. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
+ const re_node_set *src2)
+{
+ Idx i1, i2, is, id, delta, sbase;
+ if (src1->nelem == 0 || src2->nelem == 0)
+ return REG_NOERROR;
+
+ /* We need dest->nelem + 2 * elems_in_intersection; this is a
+ conservative estimate. */
+ if (src1->nelem + src2->nelem + dest->nelem > dest->alloc)
+ {
+ Idx new_alloc = src1->nelem + src2->nelem + dest->alloc;
+ Idx *new_elems = re_realloc (dest->elems, Idx, new_alloc);
+ if (BE (new_elems == NULL, 0))
+ return REG_ESPACE;
+ dest->elems = new_elems;
+ dest->alloc = new_alloc;
+ }
+
+ /* Find the items in the intersection of SRC1 and SRC2, and copy
+ into the top of DEST those that are not already in DEST itself. */
+ sbase = dest->nelem + src1->nelem + src2->nelem;
+ i1 = src1->nelem - 1;
+ i2 = src2->nelem - 1;
+ id = dest->nelem - 1;
+ for (;;)
+ {
+ if (src1->elems[i1] == src2->elems[i2])
+ {
+ /* Try to find the item in DEST. Maybe we could binary search? */
+ while (REG_VALID_INDEX (id) && dest->elems[id] > src1->elems[i1])
+ --id;
+
+ if (! REG_VALID_INDEX (id) || dest->elems[id] != src1->elems[i1])
+ dest->elems[--sbase] = src1->elems[i1];
+
+ if (! REG_VALID_INDEX (--i1) || ! REG_VALID_INDEX (--i2))
+ break;
+ }
+
+ /* Lower the highest of the two items. */
+ else if (src1->elems[i1] < src2->elems[i2])
+ {
+ if (! REG_VALID_INDEX (--i2))
+ break;
+ }
+ else
+ {
+ if (! REG_VALID_INDEX (--i1))
+ break;
+ }
+ }
+
+ id = dest->nelem - 1;
+ is = dest->nelem + src1->nelem + src2->nelem - 1;
+ delta = is - sbase + 1;
+
+ /* Now copy. When DELTA becomes zero, the remaining
+ DEST elements are already in place; this is more or
+ less the same loop that is in re_node_set_merge. */
+ dest->nelem += delta;
+ if (delta > 0 && REG_VALID_INDEX (id))
+ for (;;)
+ {
+ if (dest->elems[is] > dest->elems[id])
+ {
+ /* Copy from the top. */
+ dest->elems[id + delta--] = dest->elems[is--];
+ if (delta == 0)
+ break;
+ }
+ else
+ {
+ /* Slide from the bottom. */
+ dest->elems[id + delta] = dest->elems[id];
+ if (! REG_VALID_INDEX (--id))
+ break;
+ }
+ }
+
+ /* Copy remaining SRC elements. */
+ memcpy (dest->elems, dest->elems + sbase, delta * sizeof (Idx));
+
+ return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets SRC1 and SRC2. And store it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_init_union (re_node_set *dest, const re_node_set *src1,
+ const re_node_set *src2)
+{
+ Idx i1, i2, id;
+ if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0)
+ {
+ dest->alloc = src1->nelem + src2->nelem;
+ dest->elems = re_malloc (Idx, dest->alloc);
+ if (BE (dest->elems == NULL, 0))
+ return REG_ESPACE;
+ }
+ else
+ {
+ if (src1 != NULL && src1->nelem > 0)
+ return re_node_set_init_copy (dest, src1);
+ else if (src2 != NULL && src2->nelem > 0)
+ return re_node_set_init_copy (dest, src2);
+ else
+ re_node_set_init_empty (dest);
+ return REG_NOERROR;
+ }
+ for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
+ {
+ if (src1->elems[i1] > src2->elems[i2])
+ {
+ dest->elems[id++] = src2->elems[i2++];
+ continue;
+ }
+ if (src1->elems[i1] == src2->elems[i2])
+ ++i2;
+ dest->elems[id++] = src1->elems[i1++];
+ }
+ if (i1 < src1->nelem)
+ {
+ memcpy (dest->elems + id, src1->elems + i1,
+ (src1->nelem - i1) * sizeof (Idx));
+ id += src1->nelem - i1;
+ }
+ else if (i2 < src2->nelem)
+ {
+ memcpy (dest->elems + id, src2->elems + i2,
+ (src2->nelem - i2) * sizeof (Idx));
+ id += src2->nelem - i2;
+ }
+ dest->nelem = id;
+ return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets DEST and SRC. And store it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_merge (re_node_set *dest, const re_node_set *src)
+{
+ Idx is, id, sbase, delta;
+ if (src == NULL || src->nelem == 0)
+ return REG_NOERROR;
+ if (dest->alloc < 2 * src->nelem + dest->nelem)
+ {
+ Idx new_alloc = 2 * (src->nelem + dest->alloc);
+ Idx *new_buffer = re_realloc (dest->elems, Idx, new_alloc);
+ if (BE (new_buffer == NULL, 0))
+ return REG_ESPACE;
+ dest->elems = new_buffer;
+ dest->alloc = new_alloc;
+ }
+
+ if (BE (dest->nelem == 0, 0))
+ {
+ dest->nelem = src->nelem;
+ memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
+ return REG_NOERROR;
+ }
+
+ /* Copy into the top of DEST the items of SRC that are not
+ found in DEST. Maybe we could binary search in DEST? */
+ for (sbase = dest->nelem + 2 * src->nelem,
+ is = src->nelem - 1, id = dest->nelem - 1;
+ REG_VALID_INDEX (is) && REG_VALID_INDEX (id); )
+ {
+ if (dest->elems[id] == src->elems[is])
+ is--, id--;
+ else if (dest->elems[id] < src->elems[is])
+ dest->elems[--sbase] = src->elems[is--];
+ else /* if (dest->elems[id] > src->elems[is]) */
+ --id;
+ }
+
+ if (REG_VALID_INDEX (is))
+ {
+ /* If DEST is exhausted, the remaining items of SRC must be unique. */
+ sbase -= is + 1;
+ memcpy (dest->elems + sbase, src->elems, (is + 1) * sizeof (Idx));
+ }
+
+ id = dest->nelem - 1;
+ is = dest->nelem + 2 * src->nelem - 1;
+ delta = is - sbase + 1;
+ if (delta == 0)
+ return REG_NOERROR;
+
+ /* Now copy. When DELTA becomes zero, the remaining
+ DEST elements are already in place. */
+ dest->nelem += delta;
+ for (;;)
+ {
+ if (dest->elems[is] > dest->elems[id])
+ {
+ /* Copy from the top. */
+ dest->elems[id + delta--] = dest->elems[is--];
+ if (delta == 0)
+ break;
+ }
+ else
+ {
+ /* Slide from the bottom. */
+ dest->elems[id + delta] = dest->elems[id];
+ if (! REG_VALID_INDEX (--id))
+ {
+ /* Copy remaining SRC elements. */
+ memcpy (dest->elems, dest->elems + sbase,
+ delta * sizeof (Idx));
+ break;
+ }
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+ SET should not already have ELEM.
+ Return true if successful. */
+
+static bool
+internal_function __attribute_warn_unused_result__
+re_node_set_insert (re_node_set *set, Idx elem)
+{
+ Idx idx;
+ /* In case the set is empty. */
+ if (set->alloc == 0)
+ return BE (re_node_set_init_1 (set, elem) == REG_NOERROR, 1);
+
+ if (BE (set->nelem, 0) == 0)
+ {
+ /* We already guaranteed above that set->alloc != 0. */
+ set->elems[0] = elem;
+ ++set->nelem;
+ return true;
+ }
+
+ /* Realloc if we need. */
+ if (set->alloc == set->nelem)
+ {
+ Idx *new_elems;
+ set->alloc = set->alloc * 2;
+ new_elems = re_realloc (set->elems, Idx, set->alloc);
+ if (BE (new_elems == NULL, 0))
+ return false;
+ set->elems = new_elems;
+ }
+
+ /* Move the elements which follows the new element. Test the
+ first element separately to skip a check in the inner loop. */
+ if (elem < set->elems[0])
+ {
+ idx = 0;
+ for (idx = set->nelem; idx > 0; idx--)
+ set->elems[idx] = set->elems[idx - 1];
+ }
+ else
+ {
+ for (idx = set->nelem; set->elems[idx - 1] > elem; idx--)
+ set->elems[idx] = set->elems[idx - 1];
+ }
+
+ /* Insert the new element. */
+ set->elems[idx] = elem;
+ ++set->nelem;
+ return true;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+ SET should not already have any element greater than or equal to ELEM.
+ Return true if successful. */
+
+static bool
+internal_function __attribute_warn_unused_result__
+re_node_set_insert_last (re_node_set *set, Idx elem)
+{
+ /* Realloc if we need. */
+ if (set->alloc == set->nelem)
+ {
+ Idx *new_elems;
+ set->alloc = (set->alloc + 1) * 2;
+ new_elems = re_realloc (set->elems, Idx, set->alloc);
+ if (BE (new_elems == NULL, 0))
+ return false;
+ set->elems = new_elems;
+ }
+
+ /* Insert the new element. */
+ set->elems[set->nelem++] = elem;
+ return true;
+}
+
+/* Compare two node sets SET1 and SET2.
+ Return true if SET1 and SET2 are equivalent. */
+
+static bool
+internal_function __attribute ((pure))
+re_node_set_compare (const re_node_set *set1, const re_node_set *set2)
+{
+ Idx i;
+ if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem)
+ return false;
+ for (i = set1->nelem ; REG_VALID_INDEX (--i) ; )
+ if (set1->elems[i] != set2->elems[i])
+ return false;
+ return true;
+}
+
+/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise. */
+
+static Idx
+internal_function __attribute ((pure))
+re_node_set_contains (const re_node_set *set, Idx elem)
+{
+ __re_size_t idx, right, mid;
+ if (! REG_VALID_NONZERO_INDEX (set->nelem))
+ return 0;
+
+ /* Binary search the element. */
+ idx = 0;
+ right = set->nelem - 1;
+ while (idx < right)
+ {
+ mid = (idx + right) / 2;
+ if (set->elems[mid] < elem)
+ idx = mid + 1;
+ else
+ right = mid;
+ }
+ return set->elems[idx] == elem ? idx + 1 : 0;
+}
+
+static void
+internal_function
+re_node_set_remove_at (re_node_set *set, Idx idx)
+{
+ if (idx < 0 || idx >= set->nelem)
+ return;
+ --set->nelem;
+ for (; idx < set->nelem; idx++)
+ set->elems[idx] = set->elems[idx + 1];
+}
+
+
+/* Add the token TOKEN to dfa->nodes, and return the index of the token.
+ Or return REG_MISSING if an error occurred. */
+
+static Idx
+internal_function
+re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
+{
+ if (BE (dfa->nodes_len >= dfa->nodes_alloc, 0))
+ {
+ size_t new_nodes_alloc = dfa->nodes_alloc * 2;
+ Idx *new_nexts, *new_indices;
+ re_node_set *new_edests, *new_eclosures;
+ re_token_t *new_nodes;
+ size_t max_object_size =
+ MAX (sizeof (re_token_t),
+ MAX (sizeof (re_node_set),
+ sizeof (Idx)));
+
+ /* Avoid overflows. */
+ if (BE (SIZE_MAX / 2 / max_object_size < dfa->nodes_alloc, 0))
+ return REG_MISSING;
+
+ new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc);
+ if (BE (new_nodes == NULL, 0))
+ return REG_MISSING;
+ dfa->nodes = new_nodes;
+ new_nexts = re_realloc (dfa->nexts, Idx, new_nodes_alloc);
+ new_indices = re_realloc (dfa->org_indices, Idx, new_nodes_alloc);
+ new_edests = re_realloc (dfa->edests, re_node_set, new_nodes_alloc);
+ new_eclosures = re_realloc (dfa->eclosures, re_node_set, new_nodes_alloc);
+ if (BE (new_nexts == NULL || new_indices == NULL
+ || new_edests == NULL || new_eclosures == NULL, 0))
+ return REG_MISSING;
+ dfa->nexts = new_nexts;
+ dfa->org_indices = new_indices;
+ dfa->edests = new_edests;
+ dfa->eclosures = new_eclosures;
+ dfa->nodes_alloc = new_nodes_alloc;
+ }
+ dfa->nodes[dfa->nodes_len] = token;
+ dfa->nodes[dfa->nodes_len].constraint = 0;
+#ifdef RE_ENABLE_I18N
+ {
+ int type = token.type;
+ dfa->nodes[dfa->nodes_len].accept_mb =
+ (type == OP_PERIOD && dfa->mb_cur_max > 1) || type == COMPLEX_BRACKET;
+ }
+#endif
+ dfa->nexts[dfa->nodes_len] = REG_MISSING;
+ re_node_set_init_empty (dfa->edests + dfa->nodes_len);
+ re_node_set_init_empty (dfa->eclosures + dfa->nodes_len);
+ return dfa->nodes_len++;
+}
+
+static inline re_hashval_t
+internal_function
+calc_state_hash (const re_node_set *nodes, unsigned int context)
+{
+ re_hashval_t hash = nodes->nelem + context;
+ Idx i;
+ for (i = 0 ; i < nodes->nelem ; i++)
+ hash += nodes->elems[i];
+ return hash;
+}
+
+/* Search for the state whose node_set is equivalent to NODES.
+ Return the pointer to the state, if we found it in the DFA.
+ Otherwise create the new one and return it. In case of an error
+ return NULL and set the error code in ERR.
+ Note: - We assume NULL as the invalid state, then it is possible that
+ return value is NULL and ERR is REG_NOERROR.
+ - We never return non-NULL value in case of any errors, it is for
+ optimization. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa,
+ const re_node_set *nodes)
+{
+ re_hashval_t hash;
+ re_dfastate_t *new_state;
+ struct re_state_table_entry *spot;
+ Idx i;
+#ifdef lint
+ /* Suppress bogus uninitialized-variable warnings. */
+ *err = REG_NOERROR;
+#endif
+ if (BE (nodes->nelem == 0, 0))
+ {
+ *err = REG_NOERROR;
+ return NULL;
+ }
+ hash = calc_state_hash (nodes, 0);
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+ for (i = 0 ; i < spot->num ; i++)
+ {
+ re_dfastate_t *state = spot->array[i];
+ if (hash != state->hash)
+ continue;
+ if (re_node_set_compare (&state->nodes, nodes))
+ return state;
+ }
+
+ /* There are no appropriate state in the dfa, create the new one. */
+ new_state = create_ci_newstate (dfa, nodes, hash);
+ if (BE (new_state == NULL, 0))
+ *err = REG_ESPACE;
+
+ return new_state;
+}
+
+/* Search for the state whose node_set is equivalent to NODES and
+ whose context is equivalent to CONTEXT.
+ Return the pointer to the state, if we found it in the DFA.
+ Otherwise create the new one and return it. In case of an error
+ return NULL and set the error code in ERR.
+ Note: - We assume NULL as the invalid state, then it is possible that
+ return value is NULL and ERR is REG_NOERROR.
+ - We never return non-NULL value in case of any errors, it is for
+ optimization. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa,
+ const re_node_set *nodes, unsigned int context)
+{
+ re_hashval_t hash;
+ re_dfastate_t *new_state;
+ struct re_state_table_entry *spot;
+ Idx i;
+#ifdef lint
+ /* Suppress bogus uninitialized-variable warnings. */
+ *err = REG_NOERROR;
+#endif
+ if (nodes->nelem == 0)
+ {
+ *err = REG_NOERROR;
+ return NULL;
+ }
+ hash = calc_state_hash (nodes, context);
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+ for (i = 0 ; i < spot->num ; i++)
+ {
+ re_dfastate_t *state = spot->array[i];
+ if (state->hash == hash
+ && state->context == context
+ && re_node_set_compare (state->entrance_nodes, nodes))
+ return state;
+ }
+ /* There are no appropriate state in `dfa', create the new one. */
+ new_state = create_cd_newstate (dfa, nodes, context, hash);
+ if (BE (new_state == NULL, 0))
+ *err = REG_ESPACE;
+
+ return new_state;
+}
+
+/* Finish initialization of the new state NEWSTATE, and using its hash value
+ HASH put in the appropriate bucket of DFA's state table. Return value
+ indicates the error code if failed. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+register_state (const re_dfa_t *dfa, re_dfastate_t *newstate,
+ re_hashval_t hash)
+{
+ struct re_state_table_entry *spot;
+ reg_errcode_t err;
+ Idx i;
+
+ newstate->hash = hash;
+ err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem);
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ESPACE;
+ for (i = 0; i < newstate->nodes.nelem; i++)
+ {
+ Idx elem = newstate->nodes.elems[i];
+ if (!IS_EPSILON_NODE (dfa->nodes[elem].type))
+ if (BE (! re_node_set_insert_last (&newstate->non_eps_nodes, elem), 0))
+ return REG_ESPACE;
+ }
+
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+ if (BE (spot->alloc <= spot->num, 0))
+ {
+ Idx new_alloc = 2 * spot->num + 2;
+ re_dfastate_t **new_array = re_realloc (spot->array, re_dfastate_t *,
+ new_alloc);
+ if (BE (new_array == NULL, 0))
+ return REG_ESPACE;
+ spot->array = new_array;
+ spot->alloc = new_alloc;
+ }
+ spot->array[spot->num++] = newstate;
+ return REG_NOERROR;
+}
+
+static void
+free_state (re_dfastate_t *state)
+{
+ re_node_set_free (&state->non_eps_nodes);
+ re_node_set_free (&state->inveclosure);
+ if (state->entrance_nodes != &state->nodes)
+ {
+ re_node_set_free (state->entrance_nodes);
+ re_free (state->entrance_nodes);
+ }
+ re_node_set_free (&state->nodes);
+ re_free (state->word_trtable);
+ re_free (state->trtable);
+ re_free (state);
+}
+
+/* Create the new state which is independ of contexts.
+ Return the new state if succeeded, otherwise return NULL. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
+ re_hashval_t hash)
+{
+ Idx i;
+ reg_errcode_t err;
+ re_dfastate_t *newstate;
+
+ newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+ if (BE (newstate == NULL, 0))
+ return NULL;
+ err = re_node_set_init_copy (&newstate->nodes, nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_free (newstate);
+ return NULL;
+ }
+
+ newstate->entrance_nodes = &newstate->nodes;
+ for (i = 0 ; i < nodes->nelem ; i++)
+ {
+ re_token_t *node = dfa->nodes + nodes->elems[i];
+ re_token_type_t type = node->type;
+ if (type == CHARACTER && !node->constraint)
+ continue;
+#ifdef RE_ENABLE_I18N
+ newstate->accept_mb |= node->accept_mb;
+#endif /* RE_ENABLE_I18N */
+
+ /* If the state has the halt node, the state is a halt state. */
+ if (type == END_OF_RE)
+ newstate->halt = 1;
+ else if (type == OP_BACK_REF)
+ newstate->has_backref = 1;
+ else if (type == ANCHOR || node->constraint)
+ newstate->has_constraint = 1;
+ }
+ err = register_state (dfa, newstate, hash);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ free_state (newstate);
+ newstate = NULL;
+ }
+ return newstate;
+}
+
+/* Create the new state which is depend on the context CONTEXT.
+ Return the new state if succeeded, otherwise return NULL. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
+ unsigned int context, re_hashval_t hash)
+{
+ Idx i, nctx_nodes = 0;
+ reg_errcode_t err;
+ re_dfastate_t *newstate;
+
+ newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+ if (BE (newstate == NULL, 0))
+ return NULL;
+ err = re_node_set_init_copy (&newstate->nodes, nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_free (newstate);
+ return NULL;
+ }
+
+ newstate->context = context;
+ newstate->entrance_nodes = &newstate->nodes;
+
+ for (i = 0 ; i < nodes->nelem ; i++)
+ {
+ re_token_t *node = dfa->nodes + nodes->elems[i];
+ re_token_type_t type = node->type;
+ unsigned int constraint = node->constraint;
+
+ if (type == CHARACTER && !constraint)
+ continue;
+#ifdef RE_ENABLE_I18N
+ newstate->accept_mb |= node->accept_mb;
+#endif /* RE_ENABLE_I18N */
+
+ /* If the state has the halt node, the state is a halt state. */
+ if (type == END_OF_RE)
+ newstate->halt = 1;
+ else if (type == OP_BACK_REF)
+ newstate->has_backref = 1;
+
+ if (constraint)
+ {
+ if (newstate->entrance_nodes == &newstate->nodes)
+ {
+ newstate->entrance_nodes = re_malloc (re_node_set, 1);
+ if (BE (newstate->entrance_nodes == NULL, 0))
+ {
+ free_state (newstate);
+ return NULL;
+ }
+ if (re_node_set_init_copy (newstate->entrance_nodes, nodes)
+ != REG_NOERROR)
+ return NULL;
+ nctx_nodes = 0;
+ newstate->has_constraint = 1;
+ }
+
+ if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context))
+ {
+ re_node_set_remove_at (&newstate->nodes, i - nctx_nodes);
+ ++nctx_nodes;
+ }
+ }
+ }
+ err = register_state (dfa, newstate, hash);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ free_state (newstate);
+ newstate = NULL;
+ }
+ return newstate;
+}
diff --git a/gnulib/lib/regex_internal.h b/gnulib/lib/regex_internal.h
new file mode 100644
index 00000000..e1b4c61b
--- /dev/null
+++ b/gnulib/lib/regex_internal.h
@@ -0,0 +1,871 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+ Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _REGEX_INTERNAL_H
+#define _REGEX_INTERNAL_H 1
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <langinfo.h>
+#ifndef _LIBC
+# include "localcharset.h"
+#endif
+#if defined HAVE_LOCALE_H || defined _LIBC
+# include <locale.h>
+#endif
+
+#include <wchar.h>
+#include <wctype.h>
+#include <stdint.h>
+#if defined _LIBC
+# include <bits/libc-lock.h>
+#else
+# define __libc_lock_init(NAME) do { } while (0)
+# define __libc_lock_lock(NAME) do { } while (0)
+# define __libc_lock_unlock(NAME) do { } while (0)
+#endif
+
+/* In case that the system doesn't have isblank(). */
+#if !defined _LIBC && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK))
+# define isblank(ch) ((ch) == ' ' || (ch) == '\t')
+#endif
+
+#ifdef _LIBC
+# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
+# define _RE_DEFINE_LOCALE_FUNCTIONS 1
+# include <locale/localeinfo.h>
+# include <locale/elem-hash.h>
+# include <locale/coll-lookup.h>
+# endif
+#endif
+
+/* This is for other GNU distributions with internationalized messages. */
+#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
+# include <libintl.h>
+# ifdef _LIBC
+# undef gettext
+# define gettext(msgid) \
+ INTUSE(__dcgettext) (_libc_intl_domainname, msgid, LC_MESSAGES)
+# endif
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef gettext_noop
+/* This define is so xgettext can find the internationalizable
+ strings. */
+# define gettext_noop(String) String
+#endif
+
+/* For loser systems without the definition. */
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#if (defined MB_CUR_MAX && HAVE_LOCALE_H && HAVE_WCTYPE_H && HAVE_ISWCTYPE && HAVE_WCSCOLL) || _LIBC
+# define RE_ENABLE_I18N
+#endif
+
+#if __GNUC__ >= 3
+# define BE(expr, val) __builtin_expect (expr, val)
+#else
+# define BE(expr, val) (expr)
+# ifdef _LIBC
+# define inline
+# endif
+#endif
+
+/* Number of ASCII characters. */
+#define ASCII_CHARS 0x80
+
+/* Number of single byte characters. */
+#define SBC_MAX (UCHAR_MAX + 1)
+
+#define COLL_ELEM_LEN_MAX 8
+
+/* The character which represents newline. */
+#define NEWLINE_CHAR '\n'
+#define WIDE_NEWLINE_CHAR L'\n'
+
+/* Rename to standard API for using out of glibc. */
+#ifndef _LIBC
+# define __wctype wctype
+# define __iswctype iswctype
+# define __btowc btowc
+# define __wcrtomb wcrtomb
+# define __mbrtowc mbrtowc
+# define __regfree regfree
+# define attribute_hidden
+#endif /* not _LIBC */
+
+#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
+# define __attribute(arg) __attribute__ (arg)
+#else
+# define __attribute(arg)
+#endif
+
+typedef __re_idx_t Idx;
+
+/* Special return value for failure to match. */
+#define REG_MISSING ((Idx) -1)
+
+/* Special return value for internal error. */
+#define REG_ERROR ((Idx) -2)
+
+/* Test whether N is a valid index, and is not one of the above. */
+#ifdef _REGEX_LARGE_OFFSETS
+# define REG_VALID_INDEX(n) ((Idx) (n) < REG_ERROR)
+#else
+# define REG_VALID_INDEX(n) (0 <= (n))
+#endif
+
+/* Test whether N is a valid nonzero index. */
+#ifdef _REGEX_LARGE_OFFSETS
+# define REG_VALID_NONZERO_INDEX(n) ((Idx) ((n) - 1) < (Idx) (REG_ERROR - 1))
+#else
+# define REG_VALID_NONZERO_INDEX(n) (0 < (n))
+#endif
+
+/* A hash value, suitable for computing hash tables. */
+typedef __re_size_t re_hashval_t;
+
+/* An integer used to represent a set of bits. It must be unsigned,
+ and must be at least as wide as unsigned int. */
+typedef unsigned long int bitset_word_t;
+/* All bits set in a bitset_word_t. */
+#define BITSET_WORD_MAX ULONG_MAX
+
+/* Number of bits in a bitset_word_t. For portability to hosts with
+ padding bits, do not use '(sizeof (bitset_word_t) * CHAR_BIT)';
+ instead, deduce it directly from BITSET_WORD_MAX. Avoid
+ greater-than-32-bit integers and unconditional shifts by more than
+ 31 bits, as they're not portable. */
+#if BITSET_WORD_MAX == 0xffffffffUL
+# define BITSET_WORD_BITS 32
+#elif BITSET_WORD_MAX >> 31 >> 4 == 1
+# define BITSET_WORD_BITS 36
+#elif BITSET_WORD_MAX >> 31 >> 16 == 1
+# define BITSET_WORD_BITS 48
+#elif BITSET_WORD_MAX >> 31 >> 28 == 1
+# define BITSET_WORD_BITS 60
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 1 == 1
+# define BITSET_WORD_BITS 64
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 9 == 1
+# define BITSET_WORD_BITS 72
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 3 == 1
+# define BITSET_WORD_BITS 128
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 == 1
+# define BITSET_WORD_BITS 256
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 > 1
+# define BITSET_WORD_BITS 257 /* any value > SBC_MAX will do here */
+# if BITSET_WORD_BITS <= SBC_MAX
+# error "Invalid SBC_MAX"
+# endif
+#else
+# error "Add case for new bitset_word_t size"
+#endif
+
+/* Number of bitset_word_t values in a bitset_t. */
+#define BITSET_WORDS ((SBC_MAX + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
+
+typedef bitset_word_t bitset_t[BITSET_WORDS];
+typedef bitset_word_t *re_bitset_ptr_t;
+typedef const bitset_word_t *re_const_bitset_ptr_t;
+
+#define PREV_WORD_CONSTRAINT 0x0001
+#define PREV_NOTWORD_CONSTRAINT 0x0002
+#define NEXT_WORD_CONSTRAINT 0x0004
+#define NEXT_NOTWORD_CONSTRAINT 0x0008
+#define PREV_NEWLINE_CONSTRAINT 0x0010
+#define NEXT_NEWLINE_CONSTRAINT 0x0020
+#define PREV_BEGBUF_CONSTRAINT 0x0040
+#define NEXT_ENDBUF_CONSTRAINT 0x0080
+#define WORD_DELIM_CONSTRAINT 0x0100
+#define NOT_WORD_DELIM_CONSTRAINT 0x0200
+
+typedef enum
+{
+ INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+ WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+ WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+ INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+ LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
+ LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
+ BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
+ BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
+ WORD_DELIM = WORD_DELIM_CONSTRAINT,
+ NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT
+} re_context_type;
+
+typedef struct
+{
+ Idx alloc;
+ Idx nelem;
+ Idx *elems;
+} re_node_set;
+
+typedef enum
+{
+ NON_TYPE = 0,
+
+ /* Node type, These are used by token, node, tree. */
+ CHARACTER = 1,
+ END_OF_RE = 2,
+ SIMPLE_BRACKET = 3,
+ OP_BACK_REF = 4,
+ OP_PERIOD = 5,
+#ifdef RE_ENABLE_I18N
+ COMPLEX_BRACKET = 6,
+ OP_UTF8_PERIOD = 7,
+#endif /* RE_ENABLE_I18N */
+
+ /* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used
+ when the debugger shows values of this enum type. */
+#define EPSILON_BIT 8
+ OP_OPEN_SUBEXP = EPSILON_BIT | 0,
+ OP_CLOSE_SUBEXP = EPSILON_BIT | 1,
+ OP_ALT = EPSILON_BIT | 2,
+ OP_DUP_ASTERISK = EPSILON_BIT | 3,
+ ANCHOR = EPSILON_BIT | 4,
+
+ /* Tree type, these are used only by tree. */
+ CONCAT = 16,
+ SUBEXP = 17,
+
+ /* Token type, these are used only by token. */
+ OP_DUP_PLUS = 18,
+ OP_DUP_QUESTION,
+ OP_OPEN_BRACKET,
+ OP_CLOSE_BRACKET,
+ OP_CHARSET_RANGE,
+ OP_OPEN_DUP_NUM,
+ OP_CLOSE_DUP_NUM,
+ OP_NON_MATCH_LIST,
+ OP_OPEN_COLL_ELEM,
+ OP_CLOSE_COLL_ELEM,
+ OP_OPEN_EQUIV_CLASS,
+ OP_CLOSE_EQUIV_CLASS,
+ OP_OPEN_CHAR_CLASS,
+ OP_CLOSE_CHAR_CLASS,
+ OP_WORD,
+ OP_NOTWORD,
+ OP_SPACE,
+ OP_NOTSPACE,
+ BACK_SLASH
+
+} re_token_type_t;
+
+#ifdef RE_ENABLE_I18N
+typedef struct
+{
+ /* Multibyte characters. */
+ wchar_t *mbchars;
+
+ /* Collating symbols. */
+# ifdef _LIBC
+ int32_t *coll_syms;
+# endif
+
+ /* Equivalence classes. */
+# ifdef _LIBC
+ int32_t *equiv_classes;
+# endif
+
+ /* Range expressions. */
+# ifdef _LIBC
+ uint32_t *range_starts;
+ uint32_t *range_ends;
+# else /* not _LIBC */
+ wchar_t *range_starts;
+ wchar_t *range_ends;
+# endif /* not _LIBC */
+
+ /* Character classes. */
+ wctype_t *char_classes;
+
+ /* If this character set is the non-matching list. */
+ unsigned int non_match : 1;
+
+ /* # of multibyte characters. */
+ Idx nmbchars;
+
+ /* # of collating symbols. */
+ Idx ncoll_syms;
+
+ /* # of equivalence classes. */
+ Idx nequiv_classes;
+
+ /* # of range expressions. */
+ Idx nranges;
+
+ /* # of character classes. */
+ Idx nchar_classes;
+} re_charset_t;
+#endif /* RE_ENABLE_I18N */
+
+typedef struct
+{
+ union
+ {
+ unsigned char c; /* for CHARACTER */
+ re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset; /* for COMPLEX_BRACKET */
+#endif /* RE_ENABLE_I18N */
+ Idx idx; /* for BACK_REF */
+ re_context_type ctx_type; /* for ANCHOR */
+ } opr;
+#if __GNUC__ >= 2 && !__STRICT_ANSI__
+ re_token_type_t type : 8;
+#else
+ re_token_type_t type;
+#endif
+ unsigned int constraint : 10; /* context constraint */
+ unsigned int duplicated : 1;
+ unsigned int opt_subexp : 1;
+#ifdef RE_ENABLE_I18N
+ unsigned int accept_mb : 1;
+ /* These 2 bits can be moved into the union if needed (e.g. if running out
+ of bits; move opr.c to opr.c.c and move the flags to opr.c.flags). */
+ unsigned int mb_partial : 1;
+#endif
+ unsigned int word_char : 1;
+} re_token_t;
+
+#define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT)
+
+struct re_string_t
+{
+ /* Indicate the raw buffer which is the original string passed as an
+ argument of regexec(), re_search(), etc.. */
+ const unsigned char *raw_mbs;
+ /* Store the multibyte string. In case of "case insensitive mode" like
+ REG_ICASE, upper cases of the string are stored, otherwise MBS points
+ the same address that RAW_MBS points. */
+ unsigned char *mbs;
+#ifdef RE_ENABLE_I18N
+ /* Store the wide character string which is corresponding to MBS. */
+ wint_t *wcs;
+ Idx *offsets;
+ mbstate_t cur_state;
+#endif
+ /* Index in RAW_MBS. Each character mbs[i] corresponds to
+ raw_mbs[raw_mbs_idx + i]. */
+ Idx raw_mbs_idx;
+ /* The length of the valid characters in the buffers. */
+ Idx valid_len;
+ /* The corresponding number of bytes in raw_mbs array. */
+ Idx valid_raw_len;
+ /* The length of the buffers MBS and WCS. */
+ Idx bufs_len;
+ /* The index in MBS, which is updated by re_string_fetch_byte. */
+ Idx cur_idx;
+ /* length of RAW_MBS array. */
+ Idx raw_len;
+ /* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN. */
+ Idx len;
+ /* End of the buffer may be shorter than its length in the cases such
+ as re_match_2, re_search_2. Then, we use STOP for end of the buffer
+ instead of LEN. */
+ Idx raw_stop;
+ /* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS. */
+ Idx stop;
+
+ /* The context of mbs[0]. We store the context independently, since
+ the context of mbs[0] may be different from raw_mbs[0], which is
+ the beginning of the input string. */
+ unsigned int tip_context;
+ /* The translation passed as a part of an argument of re_compile_pattern. */
+ RE_TRANSLATE_TYPE trans;
+ /* Copy of re_dfa_t's word_char. */
+ re_const_bitset_ptr_t word_char;
+ /* true if REG_ICASE. */
+ unsigned char icase;
+ unsigned char is_utf8;
+ unsigned char map_notascii;
+ unsigned char mbs_allocated;
+ unsigned char offsets_needed;
+ unsigned char newline_anchor;
+ unsigned char word_ops_used;
+ int mb_cur_max;
+};
+typedef struct re_string_t re_string_t;
+
+
+struct re_dfa_t;
+typedef struct re_dfa_t re_dfa_t;
+
+#ifndef _LIBC
+# if defined __i386__ && !defined __EMX__
+# define internal_function __attribute ((regparm (3), stdcall))
+# else
+# define internal_function
+# endif
+#endif
+
+static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
+ Idx new_buf_len)
+ internal_function;
+#ifdef RE_ENABLE_I18N
+static void build_wcs_buffer (re_string_t *pstr) internal_function;
+static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static void build_upper_buffer (re_string_t *pstr) internal_function;
+static void re_string_translate_buffer (re_string_t *pstr) internal_function;
+static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
+ int eflags)
+ internal_function __attribute ((pure));
+#define re_string_peek_byte(pstr, offset) \
+ ((pstr)->mbs[(pstr)->cur_idx + offset])
+#define re_string_fetch_byte(pstr) \
+ ((pstr)->mbs[(pstr)->cur_idx++])
+#define re_string_first_byte(pstr, idx) \
+ ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF)
+#define re_string_is_single_byte_char(pstr, idx) \
+ ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \
+ || (pstr)->wcs[(idx) + 1] != WEOF))
+#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx)
+#define re_string_cur_idx(pstr) ((pstr)->cur_idx)
+#define re_string_get_buffer(pstr) ((pstr)->mbs)
+#define re_string_length(pstr) ((pstr)->len)
+#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx])
+#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
+#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
+
+#include <alloca.h>
+
+#ifndef _LIBC
+# if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots. */
+# define __libc_use_alloca(n) ((n) < 4032)
+# else
+/* alloca is implemented with malloc, so just use malloc. */
+# define __libc_use_alloca(n) 0
+# endif
+#endif
+
+#ifndef MAX
+# define MAX(a,b) ((a) < (b) ? (b) : (a))
+#endif
+
+#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
+#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
+#define re_free(p) free (p)
+
+struct bin_tree_t
+{
+ struct bin_tree_t *parent;
+ struct bin_tree_t *left;
+ struct bin_tree_t *right;
+ struct bin_tree_t *first;
+ struct bin_tree_t *next;
+
+ re_token_t token;
+
+ /* `node_idx' is the index in dfa->nodes, if `type' == 0.
+ Otherwise `type' indicate the type of this node. */
+ Idx node_idx;
+};
+typedef struct bin_tree_t bin_tree_t;
+
+#define BIN_TREE_STORAGE_SIZE \
+ ((1024 - sizeof (void *)) / sizeof (bin_tree_t))
+
+struct bin_tree_storage_t
+{
+ struct bin_tree_storage_t *next;
+ bin_tree_t data[BIN_TREE_STORAGE_SIZE];
+};
+typedef struct bin_tree_storage_t bin_tree_storage_t;
+
+#define CONTEXT_WORD 1
+#define CONTEXT_NEWLINE (CONTEXT_WORD << 1)
+#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1)
+#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1)
+
+#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD)
+#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE)
+#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF)
+#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF)
+#define IS_ORDINARY_CONTEXT(c) ((c) == 0)
+
+#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_')
+#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR)
+#define IS_WIDE_WORD_CHAR(ch) (iswalnum (ch) || (ch) == L'_')
+#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR)
+
+#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \
+ ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+ || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+ || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\
+ || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context)))
+
+#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \
+ ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+ || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+ || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \
+ || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context)))
+
+struct re_dfastate_t
+{
+ re_hashval_t hash;
+ re_node_set nodes;
+ re_node_set non_eps_nodes;
+ re_node_set inveclosure;
+ re_node_set *entrance_nodes;
+ struct re_dfastate_t **trtable, **word_trtable;
+ unsigned int context : 4;
+ unsigned int halt : 1;
+ /* If this state can accept `multi byte'.
+ Note that we refer to multibyte characters, and multi character
+ collating elements as `multi byte'. */
+ unsigned int accept_mb : 1;
+ /* If this state has backreference node(s). */
+ unsigned int has_backref : 1;
+ unsigned int has_constraint : 1;
+};
+typedef struct re_dfastate_t re_dfastate_t;
+
+struct re_state_table_entry
+{
+ Idx num;
+ Idx alloc;
+ re_dfastate_t **array;
+};
+
+/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */
+
+typedef struct
+{
+ Idx next_idx;
+ Idx alloc;
+ re_dfastate_t **array;
+} state_array_t;
+
+/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */
+
+typedef struct
+{
+ Idx node;
+ Idx str_idx; /* The position NODE match at. */
+ state_array_t path;
+} re_sub_match_last_t;
+
+/* Store information about the node NODE whose type is OP_OPEN_SUBEXP.
+ And information about the node, whose type is OP_CLOSE_SUBEXP,
+ corresponding to NODE is stored in LASTS. */
+
+typedef struct
+{
+ Idx str_idx;
+ Idx node;
+ state_array_t *path;
+ Idx alasts; /* Allocation size of LASTS. */
+ Idx nlasts; /* The number of LASTS. */
+ re_sub_match_last_t **lasts;
+} re_sub_match_top_t;
+
+struct re_backref_cache_entry
+{
+ Idx node;
+ Idx str_idx;
+ Idx subexp_from;
+ Idx subexp_to;
+ char more;
+ char unused;
+ unsigned short int eps_reachable_subexps_map;
+};
+
+typedef struct
+{
+ /* The string object corresponding to the input string. */
+ re_string_t input;
+#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+ const re_dfa_t *const dfa;
+#else
+ const re_dfa_t *dfa;
+#endif
+ /* EFLAGS of the argument of regexec. */
+ int eflags;
+ /* Where the matching ends. */
+ Idx match_last;
+ Idx last_node;
+ /* The state log used by the matcher. */
+ re_dfastate_t **state_log;
+ Idx state_log_top;
+ /* Back reference cache. */
+ Idx nbkref_ents;
+ Idx abkref_ents;
+ struct re_backref_cache_entry *bkref_ents;
+ int max_mb_elem_len;
+ Idx nsub_tops;
+ Idx asub_tops;
+ re_sub_match_top_t **sub_tops;
+} re_match_context_t;
+
+typedef struct
+{
+ re_dfastate_t **sifted_states;
+ re_dfastate_t **limited_states;
+ Idx last_node;
+ Idx last_str_idx;
+ re_node_set limits;
+} re_sift_context_t;
+
+struct re_fail_stack_ent_t
+{
+ Idx idx;
+ Idx node;
+ regmatch_t *regs;
+ re_node_set eps_via_nodes;
+};
+
+struct re_fail_stack_t
+{
+ Idx num;
+ Idx alloc;
+ struct re_fail_stack_ent_t *stack;
+};
+
+struct re_dfa_t
+{
+ re_token_t *nodes;
+ size_t nodes_alloc;
+ size_t nodes_len;
+ Idx *nexts;
+ Idx *org_indices;
+ re_node_set *edests;
+ re_node_set *eclosures;
+ re_node_set *inveclosures;
+ struct re_state_table_entry *state_table;
+ re_dfastate_t *init_state;
+ re_dfastate_t *init_state_word;
+ re_dfastate_t *init_state_nl;
+ re_dfastate_t *init_state_begbuf;
+ bin_tree_t *str_tree;
+ bin_tree_storage_t *str_tree_storage;
+ re_bitset_ptr_t sb_char;
+ int str_tree_storage_idx;
+
+ /* number of subexpressions `re_nsub' is in regex_t. */
+ re_hashval_t state_hash_mask;
+ Idx init_node;
+ Idx nbackref; /* The number of backreference in this dfa. */
+
+ /* Bitmap expressing which backreference is used. */
+ bitset_word_t used_bkref_map;
+ bitset_word_t completed_bkref_map;
+
+ unsigned int has_plural_match : 1;
+ /* If this dfa has "multibyte node", which is a backreference or
+ a node which can accept multibyte character or multi character
+ collating element. */
+ unsigned int has_mb_node : 1;
+ unsigned int is_utf8 : 1;
+ unsigned int map_notascii : 1;
+ unsigned int word_ops_used : 1;
+ int mb_cur_max;
+ bitset_t word_char;
+ reg_syntax_t syntax;
+ Idx *subexp_map;
+#ifdef DEBUG
+ char* re_str;
+#endif
+#ifdef _LIBC
+ __libc_lock_define (, lock)
+#endif
+};
+
+#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))
+#define re_node_set_remove(set,id) \
+ (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1))
+#define re_node_set_empty(p) ((p)->nelem = 0)
+#define re_node_set_free(set) re_free ((set)->elems)
+
+
+typedef enum
+{
+ SB_CHAR,
+ MB_CHAR,
+ EQUIV_CLASS,
+ COLL_SYM,
+ CHAR_CLASS
+} bracket_elem_type;
+
+typedef struct
+{
+ bracket_elem_type type;
+ union
+ {
+ unsigned char ch;
+ unsigned char *name;
+ wchar_t wch;
+ } opr;
+} bracket_elem_t;
+
+
+/* Inline functions for bitset_t operation. */
+
+static inline void
+bitset_set (bitset_t set, Idx i)
+{
+ set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;
+}
+
+static inline void
+bitset_clear (bitset_t set, Idx i)
+{
+ set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);
+}
+
+static inline bool
+bitset_contain (const bitset_t set, Idx i)
+{
+ return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;
+}
+
+static inline void
+bitset_empty (bitset_t set)
+{
+ memset (set, '\0', sizeof (bitset_t));
+}
+
+static inline void
+bitset_set_all (bitset_t set)
+{
+ memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS));
+ if (SBC_MAX % BITSET_WORD_BITS != 0)
+ set[BITSET_WORDS - 1] =
+ ((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;
+}
+
+static inline void
+bitset_copy (bitset_t dest, const bitset_t src)
+{
+ memcpy (dest, src, sizeof (bitset_t));
+}
+
+static inline void
+bitset_not (bitset_t set)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i)
+ set[bitset_i] = ~set[bitset_i];
+ if (SBC_MAX % BITSET_WORD_BITS != 0)
+ set[BITSET_WORDS - 1] =
+ ((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1)
+ & ~set[BITSET_WORDS - 1]);
+}
+
+static inline void
+bitset_merge (bitset_t dest, const bitset_t src)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
+ dest[bitset_i] |= src[bitset_i];
+}
+
+static inline void
+bitset_mask (bitset_t dest, const bitset_t src)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
+ dest[bitset_i] &= src[bitset_i];
+}
+
+#ifdef RE_ENABLE_I18N
+/* Inline functions for re_string. */
+static inline int
+internal_function __attribute ((pure))
+re_string_char_size_at (const re_string_t *pstr, Idx idx)
+{
+ int byte_idx;
+ if (pstr->mb_cur_max == 1)
+ return 1;
+ for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx)
+ if (pstr->wcs[idx + byte_idx] != WEOF)
+ break;
+ return byte_idx;
+}
+
+static inline wint_t
+internal_function __attribute ((pure))
+re_string_wchar_at (const re_string_t *pstr, Idx idx)
+{
+ if (pstr->mb_cur_max == 1)
+ return (wint_t) pstr->mbs[idx];
+ return (wint_t) pstr->wcs[idx];
+}
+
+static int
+internal_function __attribute ((pure))
+re_string_elem_size_at (const re_string_t *pstr, Idx idx)
+{
+# ifdef _LIBC
+ const unsigned char *p, *extra;
+ const int32_t *table, *indirect;
+ int32_t tmp;
+# include <locale/weight.h>
+ uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+
+ if (nrules != 0)
+ {
+ table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_INDIRECTMB);
+ p = pstr->mbs + idx;
+ tmp = findidx (&p);
+ return p - pstr->mbs - idx;
+ }
+ else
+# endif /* _LIBC */
+ return 1;
+}
+#endif /* RE_ENABLE_I18N */
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#if __GNUC_PREREQ (3,4)
+# undef __attribute_warn_unused_result__
+# define __attribute_warn_unused_result__ \
+ __attribute__ ((__warn_unused_result__))
+#else
+# define __attribute_warn_unused_result__ /* empty */
+#endif
+
+#endif /* _REGEX_INTERNAL_H */
diff --git a/gnulib/lib/regexec.c b/gnulib/lib/regexec.c
new file mode 100644
index 00000000..9388ac12
--- /dev/null
+++ b/gnulib/lib/regexec.c
@@ -0,0 +1,4416 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+ Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
+ Idx n) internal_function;
+static void match_ctx_clean (re_match_context_t *mctx) internal_function;
+static void match_ctx_free (re_match_context_t *cache) internal_function;
+static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, Idx node,
+ Idx str_idx, Idx from, Idx to)
+ internal_function;
+static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)
+ internal_function;
+static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node,
+ Idx str_idx) internal_function;
+static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop,
+ Idx node, Idx str_idx)
+ internal_function;
+static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+ re_dfastate_t **limited_sts, Idx last_node,
+ Idx last_str_idx)
+ internal_function;
+static reg_errcode_t re_search_internal (const regex_t *preg,
+ const char *string, Idx length,
+ Idx start, Idx last_start, Idx stop,
+ size_t nmatch, regmatch_t pmatch[],
+ int eflags) internal_function;
+static regoff_t re_search_2_stub (struct re_pattern_buffer *bufp,
+ const char *string1, Idx length1,
+ const char *string2, Idx length2,
+ Idx start, regoff_t range,
+ struct re_registers *regs,
+ Idx stop, bool ret_len) internal_function;
+static regoff_t re_search_stub (struct re_pattern_buffer *bufp,
+ const char *string, Idx length, Idx start,
+ regoff_t range, Idx stop,
+ struct re_registers *regs,
+ bool ret_len) internal_function;
+static unsigned int re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
+ Idx nregs, int regs_allocated)
+ internal_function;
+static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx)
+ internal_function;
+static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
+ Idx *p_match_first) internal_function;
+static Idx check_halt_state_context (const re_match_context_t *mctx,
+ const re_dfastate_t *state, Idx idx)
+ internal_function;
+static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
+ regmatch_t *prev_idx_match, Idx cur_node,
+ Idx cur_idx, Idx nmatch) internal_function;
+static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs,
+ Idx str_idx, Idx dest_node, Idx nregs,
+ regmatch_t *regs,
+ re_node_set *eps_via_nodes)
+ internal_function;
+static reg_errcode_t set_regs (const regex_t *preg,
+ const re_match_context_t *mctx,
+ size_t nmatch, regmatch_t *pmatch,
+ bool fl_backtrack) internal_function;
+static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs)
+ internal_function;
+
+#ifdef RE_ENABLE_I18N
+static int sift_states_iter_mb (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx node_idx, Idx str_idx, Idx max_str_idx)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t sift_states_backward (const re_match_context_t *mctx,
+ re_sift_context_t *sctx)
+ internal_function;
+static reg_errcode_t build_sifted_states (const re_match_context_t *mctx,
+ re_sift_context_t *sctx, Idx str_idx,
+ re_node_set *cur_dest)
+ internal_function;
+static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx str_idx,
+ re_node_set *dest_nodes)
+ internal_function;
+static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa,
+ re_node_set *dest_nodes,
+ const re_node_set *candidates)
+ internal_function;
+static bool check_dst_limits (const re_match_context_t *mctx,
+ const re_node_set *limits,
+ Idx dst_node, Idx dst_idx, Idx src_node,
+ Idx src_idx) internal_function;
+static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx,
+ int boundaries, Idx subexp_idx,
+ Idx from_node, Idx bkref_idx)
+ internal_function;
+static int check_dst_limits_calc_pos (const re_match_context_t *mctx,
+ Idx limit, Idx subexp_idx,
+ Idx node, Idx str_idx,
+ Idx bkref_idx) internal_function;
+static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa,
+ re_node_set *dest_nodes,
+ const re_node_set *candidates,
+ re_node_set *limits,
+ struct re_backref_cache_entry *bkref_ents,
+ Idx str_idx) internal_function;
+static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx str_idx, const re_node_set *candidates)
+ internal_function;
+static reg_errcode_t merge_state_array (const re_dfa_t *dfa,
+ re_dfastate_t **dst,
+ re_dfastate_t **src, Idx num)
+ internal_function;
+static re_dfastate_t *find_recover_state (reg_errcode_t *err,
+ re_match_context_t *mctx) internal_function;
+static re_dfastate_t *transit_state (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *state) internal_function;
+static re_dfastate_t *merge_state_with_log (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *next_state)
+ internal_function;
+static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx,
+ re_node_set *cur_nodes,
+ Idx str_idx) internal_function;
+#if 0
+static re_dfastate_t *transit_state_sb (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *pstate)
+ internal_function;
+#endif
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t transit_state_mb (re_match_context_t *mctx,
+ re_dfastate_t *pstate)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t transit_state_bkref (re_match_context_t *mctx,
+ const re_node_set *nodes)
+ internal_function;
+static reg_errcode_t get_subexp (re_match_context_t *mctx,
+ Idx bkref_node, Idx bkref_str_idx)
+ internal_function;
+static reg_errcode_t get_subexp_sub (re_match_context_t *mctx,
+ const re_sub_match_top_t *sub_top,
+ re_sub_match_last_t *sub_last,
+ Idx bkref_node, Idx bkref_str)
+ internal_function;
+static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+ Idx subexp_idx, int type) internal_function;
+static reg_errcode_t check_arrival (re_match_context_t *mctx,
+ state_array_t *path, Idx top_node,
+ Idx top_str, Idx last_node, Idx last_str,
+ int type) internal_function;
+static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx,
+ Idx str_idx,
+ re_node_set *cur_nodes,
+ re_node_set *next_nodes)
+ internal_function;
+static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa,
+ re_node_set *cur_nodes,
+ Idx ex_subexp, int type)
+ internal_function;
+static reg_errcode_t check_arrival_expand_ecl_sub (const re_dfa_t *dfa,
+ re_node_set *dst_nodes,
+ Idx target, Idx ex_subexp,
+ int type) internal_function;
+static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx,
+ re_node_set *cur_nodes, Idx cur_str,
+ Idx subexp_num, int type)
+ internal_function;
+static bool build_trtable (const re_dfa_t *dfa,
+ re_dfastate_t *state) internal_function;
+#ifdef RE_ENABLE_I18N
+static int check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
+ const re_string_t *input, Idx idx)
+ internal_function;
+# ifdef _LIBC
+static unsigned int find_collation_sequence_value (const unsigned char *mbs,
+ size_t name_len)
+ internal_function;
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa,
+ const re_dfastate_t *state,
+ re_node_set *states_node,
+ bitset_t *states_ch) internal_function;
+static bool check_node_accept (const re_match_context_t *mctx,
+ const re_token_t *node, Idx idx)
+ internal_function;
+static reg_errcode_t extend_buffers (re_match_context_t *mctx)
+ internal_function;
+
+/* Entry point for POSIX code. */
+
+/* regexec searches for a given pattern, specified by PREG, in the
+ string STRING.
+
+ If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+ `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
+ least NMATCH elements, and we set them to the offsets of the
+ corresponding matched substrings.
+
+ EFLAGS specifies `execution flags' which affect matching: if
+ REG_NOTBOL is set, then ^ does not match at the beginning of the
+ string; if REG_NOTEOL is set, then $ does not match at the end.
+
+ We return 0 if we find a match and REG_NOMATCH if not. */
+
+int
+regexec (preg, string, nmatch, pmatch, eflags)
+ const regex_t *_Restrict_ preg;
+ const char *_Restrict_ string;
+ size_t nmatch;
+ regmatch_t pmatch[_Restrict_arr_];
+ int eflags;
+{
+ reg_errcode_t err;
+ Idx start, length;
+#ifdef _LIBC
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+#endif
+
+ if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND))
+ return REG_BADPAT;
+
+ if (eflags & REG_STARTEND)
+ {
+ start = pmatch[0].rm_so;
+ length = pmatch[0].rm_eo;
+ }
+ else
+ {
+ start = 0;
+ length = strlen (string);
+ }
+
+ __libc_lock_lock (dfa->lock);
+ if (preg->no_sub)
+ err = re_search_internal (preg, string, length, start, length,
+ length, 0, NULL, eflags);
+ else
+ err = re_search_internal (preg, string, length, start, length,
+ length, nmatch, pmatch, eflags);
+ __libc_lock_unlock (dfa->lock);
+ return err != REG_NOERROR;
+}
+
+#ifdef _LIBC
+# include <shlib-compat.h>
+versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4);
+
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+__typeof__ (__regexec) __compat_regexec;
+
+int
+attribute_compat_text_section
+__compat_regexec (const regex_t *_Restrict_ preg,
+ const char *_Restrict_ string, size_t nmatch,
+ regmatch_t pmatch[], int eflags)
+{
+ return regexec (preg, string, nmatch, pmatch,
+ eflags & (REG_NOTBOL | REG_NOTEOL));
+}
+compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0);
+# endif
+#endif
+
+/* Entry points for GNU code. */
+
+/* re_match, re_search, re_match_2, re_search_2
+
+ The former two functions operate on STRING with length LENGTH,
+ while the later two operate on concatenation of STRING1 and STRING2
+ with lengths LENGTH1 and LENGTH2, respectively.
+
+ re_match() matches the compiled pattern in BUFP against the string,
+ starting at index START.
+
+ re_search() first tries matching at index START, then it tries to match
+ starting from index START + 1, and so on. The last start position tried
+ is START + RANGE. (Thus RANGE = 0 forces re_search to operate the same
+ way as re_match().)
+
+ The parameter STOP of re_{match,search}_2 specifies that no match exceeding
+ the first STOP characters of the concatenation of the strings should be
+ concerned.
+
+ If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match
+ and all groups is stored in REGS. (For the "_2" variants, the offsets are
+ computed relative to the concatenation, not relative to the individual
+ strings.)
+
+ On success, re_match* functions return the length of the match, re_search*
+ return the position of the start of the match. Return value -1 means no
+ match was found and -2 indicates an internal error. */
+
+regoff_t
+re_match (bufp, string, length, start, regs)
+ struct re_pattern_buffer *bufp;
+ const char *string;
+ Idx length, start;
+ struct re_registers *regs;
+{
+ return re_search_stub (bufp, string, length, start, 0, length, regs, true);
+}
+#ifdef _LIBC
+weak_alias (__re_match, re_match)
+#endif
+
+regoff_t
+re_search (bufp, string, length, start, range, regs)
+ struct re_pattern_buffer *bufp;
+ const char *string;
+ Idx length, start;
+ regoff_t range;
+ struct re_registers *regs;
+{
+ return re_search_stub (bufp, string, length, start, range, length, regs,
+ false);
+}
+#ifdef _LIBC
+weak_alias (__re_search, re_search)
+#endif
+
+regoff_t
+re_match_2 (bufp, string1, length1, string2, length2, start, regs, stop)
+ struct re_pattern_buffer *bufp;
+ const char *string1, *string2;
+ Idx length1, length2, start, stop;
+ struct re_registers *regs;
+{
+ return re_search_2_stub (bufp, string1, length1, string2, length2,
+ start, 0, regs, stop, true);
+}
+#ifdef _LIBC
+weak_alias (__re_match_2, re_match_2)
+#endif
+
+regoff_t
+re_search_2 (bufp, string1, length1, string2, length2, start, range, regs, stop)
+ struct re_pattern_buffer *bufp;
+ const char *string1, *string2;
+ Idx length1, length2, start, stop;
+ regoff_t range;
+ struct re_registers *regs;
+{
+ return re_search_2_stub (bufp, string1, length1, string2, length2,
+ start, range, regs, stop, false);
+}
+#ifdef _LIBC
+weak_alias (__re_search_2, re_search_2)
+#endif
+
+static regoff_t
+internal_function
+re_search_2_stub (struct re_pattern_buffer *bufp,
+ const char *string1, Idx length1,
+ const char *string2, Idx length2,
+ Idx start, regoff_t range, struct re_registers *regs,
+ Idx stop, bool ret_len)
+{
+ const char *str;
+ regoff_t rval;
+ Idx len = length1 + length2;
+ char *s = NULL;
+
+ if (BE (length1 < 0 || length2 < 0 || stop < 0 || len < length1, 0))
+ return -2;
+
+ /* Concatenate the strings. */
+ if (length2 > 0)
+ if (length1 > 0)
+ {
+ s = re_malloc (char, len);
+
+ if (BE (s == NULL, 0))
+ return -2;
+#ifdef _LIBC
+ memcpy (__mempcpy (s, string1, length1), string2, length2);
+#else
+ memcpy (s, string1, length1);
+ memcpy (s + length1, string2, length2);
+#endif
+ str = s;
+ }
+ else
+ str = string2;
+ else
+ str = string1;
+
+ rval = re_search_stub (bufp, str, len, start, range, stop, regs,
+ ret_len);
+ re_free (s);
+ return rval;
+}
+
+/* The parameters have the same meaning as those of re_search.
+ Additional parameters:
+ If RET_LEN is true the length of the match is returned (re_match style);
+ otherwise the position of the match is returned. */
+
+static regoff_t
+internal_function
+re_search_stub (struct re_pattern_buffer *bufp,
+ const char *string, Idx length,
+ Idx start, regoff_t range, Idx stop, struct re_registers *regs,
+ bool ret_len)
+{
+ reg_errcode_t result;
+ regmatch_t *pmatch;
+ Idx nregs;
+ regoff_t rval;
+ int eflags = 0;
+#ifdef _LIBC
+ re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+#endif
+ Idx last_start = start + range;
+
+ /* Check for out-of-range. */
+ if (BE (start < 0 || start > length, 0))
+ return -1;
+ if (BE (length < last_start || (0 <= range && last_start < start), 0))
+ last_start = length;
+ else if (BE (last_start < 0 || (range < 0 && start <= last_start), 0))
+ last_start = 0;
+
+ __libc_lock_lock (dfa->lock);
+
+ eflags |= (bufp->not_bol) ? REG_NOTBOL : 0;
+ eflags |= (bufp->not_eol) ? REG_NOTEOL : 0;
+
+ /* Compile fastmap if we haven't yet. */
+ if (start < last_start && bufp->fastmap != NULL && !bufp->fastmap_accurate)
+ re_compile_fastmap (bufp);
+
+ if (BE (bufp->no_sub, 0))
+ regs = NULL;
+
+ /* We need at least 1 register. */
+ if (regs == NULL)
+ nregs = 1;
+ else if (BE (bufp->regs_allocated == REGS_FIXED
+ && regs->num_regs <= bufp->re_nsub, 0))
+ {
+ nregs = regs->num_regs;
+ if (BE (nregs < 1, 0))
+ {
+ /* Nothing can be copied to regs. */
+ regs = NULL;
+ nregs = 1;
+ }
+ }
+ else
+ nregs = bufp->re_nsub + 1;
+ pmatch = re_malloc (regmatch_t, nregs);
+ if (BE (pmatch == NULL, 0))
+ {
+ rval = -2;
+ goto out;
+ }
+
+ result = re_search_internal (bufp, string, length, start, last_start, stop,
+ nregs, pmatch, eflags);
+
+ rval = 0;
+
+ /* I hope we needn't fill ther regs with -1's when no match was found. */
+ if (result != REG_NOERROR)
+ rval = -1;
+ else if (regs != NULL)
+ {
+ /* If caller wants register contents data back, copy them. */
+ bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs,
+ bufp->regs_allocated);
+ if (BE (bufp->regs_allocated == REGS_UNALLOCATED, 0))
+ rval = -2;
+ }
+
+ if (BE (rval == 0, 1))
+ {
+ if (ret_len)
+ {
+ assert (pmatch[0].rm_so == start);
+ rval = pmatch[0].rm_eo - start;
+ }
+ else
+ rval = pmatch[0].rm_so;
+ }
+ re_free (pmatch);
+ out:
+ __libc_lock_unlock (dfa->lock);
+ return rval;
+}
+
+static unsigned int
+internal_function
+re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs,
+ int regs_allocated)
+{
+ int rval = REGS_REALLOCATE;
+ Idx i;
+ Idx need_regs = nregs + 1;
+ /* We need one extra element beyond `num_regs' for the `-1' marker GNU code
+ uses. */
+
+ /* Have the register data arrays been allocated? */
+ if (regs_allocated == REGS_UNALLOCATED)
+ { /* No. So allocate them with malloc. */
+ regs->start = re_malloc (regoff_t, need_regs);
+ if (BE (regs->start == NULL, 0))
+ return REGS_UNALLOCATED;
+ regs->end = re_malloc (regoff_t, need_regs);
+ if (BE (regs->end == NULL, 0))
+ {
+ re_free (regs->start);
+ return REGS_UNALLOCATED;
+ }
+ regs->num_regs = need_regs;
+ }
+ else if (regs_allocated == REGS_REALLOCATE)
+ { /* Yes. If we need more elements than were already
+ allocated, reallocate them. If we need fewer, just
+ leave it alone. */
+ if (BE (need_regs > regs->num_regs, 0))
+ {
+ regoff_t *new_start = re_realloc (regs->start, regoff_t, need_regs);
+ regoff_t *new_end;
+ if (BE (new_start == NULL, 0))
+ return REGS_UNALLOCATED;
+ new_end = re_realloc (regs->end, regoff_t, need_regs);
+ if (BE (new_end == NULL, 0))
+ {
+ re_free (new_start);
+ return REGS_UNALLOCATED;
+ }
+ regs->start = new_start;
+ regs->end = new_end;
+ regs->num_regs = need_regs;
+ }
+ }
+ else
+ {
+ assert (regs_allocated == REGS_FIXED);
+ /* This function may not be called with REGS_FIXED and nregs too big. */
+ assert (regs->num_regs >= nregs);
+ rval = REGS_FIXED;
+ }
+
+ /* Copy the regs. */
+ for (i = 0; i < nregs; ++i)
+ {
+ regs->start[i] = pmatch[i].rm_so;
+ regs->end[i] = pmatch[i].rm_eo;
+ }
+ for ( ; i < regs->num_regs; ++i)
+ regs->start[i] = regs->end[i] = -1;
+
+ return rval;
+}
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+ ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use
+ this memory for recording register information. STARTS and ENDS
+ must be allocated using the malloc library routine, and must each
+ be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+ If NUM_REGS == 0, then subsequent matches should allocate their own
+ register data.
+
+ Unless this function is called, the first search or match using
+ PATTERN_BUFFER will allocate its own register data, without
+ freeing the old data. */
+
+void
+re_set_registers (bufp, regs, num_regs, starts, ends)
+ struct re_pattern_buffer *bufp;
+ struct re_registers *regs;
+ __re_size_t num_regs;
+ regoff_t *starts, *ends;
+{
+ if (num_regs)
+ {
+ bufp->regs_allocated = REGS_REALLOCATE;
+ regs->num_regs = num_regs;
+ regs->start = starts;
+ regs->end = ends;
+ }
+ else
+ {
+ bufp->regs_allocated = REGS_UNALLOCATED;
+ regs->num_regs = 0;
+ regs->start = regs->end = NULL;
+ }
+}
+#ifdef _LIBC
+weak_alias (__re_set_registers, re_set_registers)
+#endif
+
+/* Entry points compatible with 4.2 BSD regex library. We don't define
+ them unless specifically requested. */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+int
+# ifdef _LIBC
+weak_function
+# endif
+re_exec (s)
+ const char *s;
+{
+ return 0 == regexec (&re_comp_buf, s, 0, NULL, 0);
+}
+#endif /* _REGEX_RE_COMP */
+
+/* Internal entry point. */
+
+/* Searches for a compiled pattern PREG in the string STRING, whose
+ length is LENGTH. NMATCH, PMATCH, and EFLAGS have the same
+ meaning as with regexec. LAST_START is START + RANGE, where
+ START and RANGE have the same meaning as with re_search.
+ Return REG_NOERROR if we find a match, and REG_NOMATCH if not,
+ otherwise return the error code.
+ Note: We assume front end functions already check ranges.
+ (0 <= LAST_START && LAST_START <= LENGTH) */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_search_internal (const regex_t *preg,
+ const char *string, Idx length,
+ Idx start, Idx last_start, Idx stop,
+ size_t nmatch, regmatch_t pmatch[],
+ int eflags)
+{
+ reg_errcode_t err;
+ const re_dfa_t *dfa = (const re_dfa_t *) preg->buffer;
+ Idx left_lim, right_lim;
+ int incr;
+ bool fl_longest_match;
+ int match_kind;
+ Idx match_first;
+ Idx match_last = REG_MISSING;
+ Idx extra_nmatch;
+ bool sb;
+ int ch;
+#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+ re_match_context_t mctx = { .dfa = dfa };
+#else
+ re_match_context_t mctx;
+#endif
+ char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate
+ && start != last_start && !preg->can_be_null)
+ ? preg->fastmap : NULL);
+ RE_TRANSLATE_TYPE t = preg->translate;
+
+#if !(defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
+ memset (&mctx, '\0', sizeof (re_match_context_t));
+ mctx.dfa = dfa;
+#endif
+
+ extra_nmatch = (nmatch > preg->re_nsub) ? nmatch - (preg->re_nsub + 1) : 0;
+ nmatch -= extra_nmatch;
+
+ /* Check if the DFA haven't been compiled. */
+ if (BE (preg->used == 0 || dfa->init_state == NULL
+ || dfa->init_state_word == NULL || dfa->init_state_nl == NULL
+ || dfa->init_state_begbuf == NULL, 0))
+ return REG_NOMATCH;
+
+#ifdef DEBUG
+ /* We assume front-end functions already check them. */
+ assert (0 <= last_start && last_start <= length);
+#endif
+
+ /* If initial states with non-begbuf contexts have no elements,
+ the regex must be anchored. If preg->newline_anchor is set,
+ we'll never use init_state_nl, so do not check it. */
+ if (dfa->init_state->nodes.nelem == 0
+ && dfa->init_state_word->nodes.nelem == 0
+ && (dfa->init_state_nl->nodes.nelem == 0
+ || !preg->newline_anchor))
+ {
+ if (start != 0 && last_start != 0)
+ return REG_NOMATCH;
+ start = last_start = 0;
+ }
+
+ /* We must check the longest matching, if nmatch > 0. */
+ fl_longest_match = (nmatch != 0 || dfa->nbackref);
+
+ err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1,
+ preg->translate, (preg->syntax & RE_ICASE) != 0,
+ dfa);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ mctx.input.stop = stop;
+ mctx.input.raw_stop = stop;
+ mctx.input.newline_anchor = preg->newline_anchor;
+
+ err = match_ctx_init (&mctx, eflags, dfa->nbackref * 2);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ /* We will log all the DFA states through which the dfa pass,
+ if nmatch > 1, or this dfa has "multibyte node", which is a
+ back-reference or a node which can accept multibyte character or
+ multi character collating element. */
+ if (nmatch > 1 || dfa->has_mb_node)
+ {
+ /* Avoid overflow. */
+ if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= mctx.input.bufs_len, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+
+ mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1);
+ if (BE (mctx.state_log == NULL, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ }
+ else
+ mctx.state_log = NULL;
+
+ match_first = start;
+ mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+ : CONTEXT_NEWLINE | CONTEXT_BEGBUF;
+
+ /* Check incrementally whether of not the input string match. */
+ incr = (last_start < start) ? -1 : 1;
+ left_lim = (last_start < start) ? last_start : start;
+ right_lim = (last_start < start) ? start : last_start;
+ sb = dfa->mb_cur_max == 1;
+ match_kind =
+ (fastmap
+ ? ((sb || !(preg->syntax & RE_ICASE || t) ? 4 : 0)
+ | (start <= last_start ? 2 : 0)
+ | (t != NULL ? 1 : 0))
+ : 8);
+
+ for (;; match_first += incr)
+ {
+ err = REG_NOMATCH;
+ if (match_first < left_lim || right_lim < match_first)
+ goto free_return;
+
+ /* Advance as rapidly as possible through the string, until we
+ find a plausible place to start matching. This may be done
+ with varying efficiency, so there are various possibilities:
+ only the most common of them are specialized, in order to
+ save on code size. We use a switch statement for speed. */
+ switch (match_kind)
+ {
+ case 8:
+ /* No fastmap. */
+ break;
+
+ case 7:
+ /* Fastmap with single-byte translation, match forward. */
+ while (BE (match_first < right_lim, 1)
+ && !fastmap[t[(unsigned char) string[match_first]]])
+ ++match_first;
+ goto forward_match_found_start_or_reached_end;
+
+ case 6:
+ /* Fastmap without translation, match forward. */
+ while (BE (match_first < right_lim, 1)
+ && !fastmap[(unsigned char) string[match_first]])
+ ++match_first;
+
+ forward_match_found_start_or_reached_end:
+ if (BE (match_first == right_lim, 0))
+ {
+ ch = match_first >= length
+ ? 0 : (unsigned char) string[match_first];
+ if (!fastmap[t ? t[ch] : ch])
+ goto free_return;
+ }
+ break;
+
+ case 4:
+ case 5:
+ /* Fastmap without multi-byte translation, match backwards. */
+ while (match_first >= left_lim)
+ {
+ ch = match_first >= length
+ ? 0 : (unsigned char) string[match_first];
+ if (fastmap[t ? t[ch] : ch])
+ break;
+ --match_first;
+ }
+ if (match_first < left_lim)
+ goto free_return;
+ break;
+
+ default:
+ /* In this case, we can't determine easily the current byte,
+ since it might be a component byte of a multibyte
+ character. Then we use the constructed buffer instead. */
+ for (;;)
+ {
+ /* If MATCH_FIRST is out of the valid range, reconstruct the
+ buffers. */
+ __re_size_t offset = match_first - mctx.input.raw_mbs_idx;
+ if (BE (offset >= (__re_size_t) mctx.input.valid_raw_len, 0))
+ {
+ err = re_string_reconstruct (&mctx.input, match_first,
+ eflags);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ offset = match_first - mctx.input.raw_mbs_idx;
+ }
+ /* If MATCH_FIRST is out of the buffer, leave it as '\0'.
+ Note that MATCH_FIRST must not be smaller than 0. */
+ ch = (match_first >= length
+ ? 0 : re_string_byte_at (&mctx.input, offset));
+ if (fastmap[ch])
+ break;
+ match_first += incr;
+ if (match_first < left_lim || match_first > right_lim)
+ {
+ err = REG_NOMATCH;
+ goto free_return;
+ }
+ }
+ break;
+ }
+
+ /* Reconstruct the buffers so that the matcher can assume that
+ the matching starts from the beginning of the buffer. */
+ err = re_string_reconstruct (&mctx.input, match_first, eflags);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+#ifdef RE_ENABLE_I18N
+ /* Don't consider this char as a possible match start if it part,
+ yet isn't the head, of a multibyte character. */
+ if (!sb && !re_string_first_byte (&mctx.input, 0))
+ continue;
+#endif
+
+ /* It seems to be appropriate one, then use the matcher. */
+ /* We assume that the matching starts from 0. */
+ mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0;
+ match_last = check_matching (&mctx, fl_longest_match,
+ start <= last_start ? &match_first : NULL);
+ if (match_last != REG_MISSING)
+ {
+ if (BE (match_last == REG_ERROR, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ else
+ {
+ mctx.match_last = match_last;
+ if ((!preg->no_sub && nmatch > 1) || dfa->nbackref)
+ {
+ re_dfastate_t *pstate = mctx.state_log[match_last];
+ mctx.last_node = check_halt_state_context (&mctx, pstate,
+ match_last);
+ }
+ if ((!preg->no_sub && nmatch > 1 && dfa->has_plural_match)
+ || dfa->nbackref)
+ {
+ err = prune_impossible_nodes (&mctx);
+ if (err == REG_NOERROR)
+ break;
+ if (BE (err != REG_NOMATCH, 0))
+ goto free_return;
+ match_last = REG_MISSING;
+ }
+ else
+ break; /* We found a match. */
+ }
+ }
+
+ match_ctx_clean (&mctx);
+ }
+
+#ifdef DEBUG
+ assert (match_last != REG_MISSING);
+ assert (err == REG_NOERROR);
+#endif
+
+ /* Set pmatch[] if we need. */
+ if (nmatch > 0)
+ {
+ Idx reg_idx;
+
+ /* Initialize registers. */
+ for (reg_idx = 1; reg_idx < nmatch; ++reg_idx)
+ pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1;
+
+ /* Set the points where matching start/end. */
+ pmatch[0].rm_so = 0;
+ pmatch[0].rm_eo = mctx.match_last;
+ /* FIXME: This function should fail if mctx.match_last exceeds
+ the maximum possible regoff_t value. We need a new error
+ code REG_OVERFLOW. */
+
+ if (!preg->no_sub && nmatch > 1)
+ {
+ err = set_regs (preg, &mctx, nmatch, pmatch,
+ dfa->has_plural_match && dfa->nbackref > 0);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+
+ /* At last, add the offset to the each registers, since we slided
+ the buffers so that we could assume that the matching starts
+ from 0. */
+ for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+ if (pmatch[reg_idx].rm_so != -1)
+ {
+#ifdef RE_ENABLE_I18N
+ if (BE (mctx.input.offsets_needed != 0, 0))
+ {
+ pmatch[reg_idx].rm_so =
+ (pmatch[reg_idx].rm_so == mctx.input.valid_len
+ ? mctx.input.valid_raw_len
+ : mctx.input.offsets[pmatch[reg_idx].rm_so]);
+ pmatch[reg_idx].rm_eo =
+ (pmatch[reg_idx].rm_eo == mctx.input.valid_len
+ ? mctx.input.valid_raw_len
+ : mctx.input.offsets[pmatch[reg_idx].rm_eo]);
+ }
+#else
+ assert (mctx.input.offsets_needed == 0);
+#endif
+ pmatch[reg_idx].rm_so += match_first;
+ pmatch[reg_idx].rm_eo += match_first;
+ }
+ for (reg_idx = 0; reg_idx < extra_nmatch; ++reg_idx)
+ {
+ pmatch[nmatch + reg_idx].rm_so = -1;
+ pmatch[nmatch + reg_idx].rm_eo = -1;
+ }
+
+ if (dfa->subexp_map)
+ for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++)
+ if (dfa->subexp_map[reg_idx] != reg_idx)
+ {
+ pmatch[reg_idx + 1].rm_so
+ = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so;
+ pmatch[reg_idx + 1].rm_eo
+ = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo;
+ }
+ }
+
+ free_return:
+ re_free (mctx.state_log);
+ if (dfa->nbackref)
+ match_ctx_free (&mctx);
+ re_string_destruct (&mctx.input);
+ return err;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+prune_impossible_nodes (re_match_context_t *mctx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx halt_node, match_last;
+ reg_errcode_t ret;
+ re_dfastate_t **sifted_states;
+ re_dfastate_t **lim_states = NULL;
+ re_sift_context_t sctx;
+#ifdef DEBUG
+ assert (mctx->state_log != NULL);
+#endif
+ match_last = mctx->match_last;
+ halt_node = mctx->last_node;
+
+ /* Avoid overflow. */
+ if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= match_last, 0))
+ return REG_ESPACE;
+
+ sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
+ if (BE (sifted_states == NULL, 0))
+ {
+ ret = REG_ESPACE;
+ goto free_return;
+ }
+ if (dfa->nbackref)
+ {
+ lim_states = re_malloc (re_dfastate_t *, match_last + 1);
+ if (BE (lim_states == NULL, 0))
+ {
+ ret = REG_ESPACE;
+ goto free_return;
+ }
+ while (1)
+ {
+ memset (lim_states, '\0',
+ sizeof (re_dfastate_t *) * (match_last + 1));
+ sift_ctx_init (&sctx, sifted_states, lim_states, halt_node,
+ match_last);
+ ret = sift_states_backward (mctx, &sctx);
+ re_node_set_free (&sctx.limits);
+ if (BE (ret != REG_NOERROR, 0))
+ goto free_return;
+ if (sifted_states[0] != NULL || lim_states[0] != NULL)
+ break;
+ do
+ {
+ --match_last;
+ if (! REG_VALID_INDEX (match_last))
+ {
+ ret = REG_NOMATCH;
+ goto free_return;
+ }
+ } while (mctx->state_log[match_last] == NULL
+ || !mctx->state_log[match_last]->halt);
+ halt_node = check_halt_state_context (mctx,
+ mctx->state_log[match_last],
+ match_last);
+ }
+ ret = merge_state_array (dfa, sifted_states, lim_states,
+ match_last + 1);
+ re_free (lim_states);
+ lim_states = NULL;
+ if (BE (ret != REG_NOERROR, 0))
+ goto free_return;
+ }
+ else
+ {
+ sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, match_last);
+ ret = sift_states_backward (mctx, &sctx);
+ re_node_set_free (&sctx.limits);
+ if (BE (ret != REG_NOERROR, 0))
+ goto free_return;
+ if (sifted_states[0] == NULL)
+ {
+ ret = REG_NOMATCH;
+ goto free_return;
+ }
+ }
+ re_free (mctx->state_log);
+ mctx->state_log = sifted_states;
+ sifted_states = NULL;
+ mctx->last_node = halt_node;
+ mctx->match_last = match_last;
+ ret = REG_NOERROR;
+ free_return:
+ re_free (sifted_states);
+ re_free (lim_states);
+ return ret;
+}
+
+/* Acquire an initial state and return it.
+ We must select appropriate initial state depending on the context,
+ since initial states may have constraints like "\<", "^", etc.. */
+
+static inline re_dfastate_t *
+__attribute ((always_inline)) internal_function
+acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
+ Idx idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ if (dfa->init_state->has_constraint)
+ {
+ unsigned int context;
+ context = re_string_context_at (&mctx->input, idx - 1, mctx->eflags);
+ if (IS_WORD_CONTEXT (context))
+ return dfa->init_state_word;
+ else if (IS_ORDINARY_CONTEXT (context))
+ return dfa->init_state;
+ else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context))
+ return dfa->init_state_begbuf;
+ else if (IS_NEWLINE_CONTEXT (context))
+ return dfa->init_state_nl;
+ else if (IS_BEGBUF_CONTEXT (context))
+ {
+ /* It is relatively rare case, then calculate on demand. */
+ return re_acquire_state_context (err, dfa,
+ dfa->init_state->entrance_nodes,
+ context);
+ }
+ else
+ /* Must not happen? */
+ return dfa->init_state;
+ }
+ else
+ return dfa->init_state;
+}
+
+/* Check whether the regular expression match input string INPUT or not,
+ and return the index where the matching end. Return REG_MISSING if
+ there is no match, and return REG_ERROR in case of an error.
+ FL_LONGEST_MATCH means we want the POSIX longest matching.
+ If P_MATCH_FIRST is not NULL, and the match fails, it is set to the
+ next place where we may want to try matching.
+ Note that the matcher assume that the maching starts from the current
+ index of the buffer. */
+
+static Idx
+internal_function __attribute_warn_unused_result__
+check_matching (re_match_context_t *mctx, bool fl_longest_match,
+ Idx *p_match_first)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx match = 0;
+ Idx match_last = REG_MISSING;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+ re_dfastate_t *cur_state;
+ bool at_init_state = p_match_first != NULL;
+ Idx next_start_idx = cur_str_idx;
+
+ err = REG_NOERROR;
+ cur_state = acquire_init_state_context (&err, mctx, cur_str_idx);
+ /* An initial state must not be NULL (invalid). */
+ if (BE (cur_state == NULL, 0))
+ {
+ assert (err == REG_ESPACE);
+ return REG_ERROR;
+ }
+
+ if (mctx->state_log != NULL)
+ {
+ mctx->state_log[cur_str_idx] = cur_state;
+
+ /* Check OP_OPEN_SUBEXP in the initial state in case that we use them
+ later. E.g. Processing back references. */
+ if (BE (dfa->nbackref, 0))
+ {
+ at_init_state = false;
+ err = check_subexp_matching_top (mctx, &cur_state->nodes, 0);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ if (cur_state->has_backref)
+ {
+ err = transit_state_bkref (mctx, &cur_state->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ }
+
+ /* If the RE accepts NULL string. */
+ if (BE (cur_state->halt, 0))
+ {
+ if (!cur_state->has_constraint
+ || check_halt_state_context (mctx, cur_state, cur_str_idx))
+ {
+ if (!fl_longest_match)
+ return cur_str_idx;
+ else
+ {
+ match_last = cur_str_idx;
+ match = 1;
+ }
+ }
+ }
+
+ while (!re_string_eoi (&mctx->input))
+ {
+ re_dfastate_t *old_state = cur_state;
+ Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1;
+
+ if (BE (next_char_idx >= mctx->input.bufs_len, 0)
+ || (BE (next_char_idx >= mctx->input.valid_len, 0)
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ assert (err == REG_ESPACE);
+ return REG_ERROR;
+ }
+ }
+
+ cur_state = transit_state (&err, mctx, cur_state);
+ if (mctx->state_log != NULL)
+ cur_state = merge_state_with_log (&err, mctx, cur_state);
+
+ if (cur_state == NULL)
+ {
+ /* Reached the invalid state or an error. Try to recover a valid
+ state using the state log, if available and if we have not
+ already found a valid (even if not the longest) match. */
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ERROR;
+
+ if (mctx->state_log == NULL
+ || (match && !fl_longest_match)
+ || (cur_state = find_recover_state (&err, mctx)) == NULL)
+ break;
+ }
+
+ if (BE (at_init_state, 0))
+ {
+ if (old_state == cur_state)
+ next_start_idx = next_char_idx;
+ else
+ at_init_state = false;
+ }
+
+ if (cur_state->halt)
+ {
+ /* Reached a halt state.
+ Check the halt state can satisfy the current context. */
+ if (!cur_state->has_constraint
+ || check_halt_state_context (mctx, cur_state,
+ re_string_cur_idx (&mctx->input)))
+ {
+ /* We found an appropriate halt state. */
+ match_last = re_string_cur_idx (&mctx->input);
+ match = 1;
+
+ /* We found a match, do not modify match_first below. */
+ p_match_first = NULL;
+ if (!fl_longest_match)
+ break;
+ }
+ }
+ }
+
+ if (p_match_first)
+ *p_match_first += next_start_idx;
+
+ return match_last;
+}
+
+/* Check NODE match the current context. */
+
+static bool
+internal_function
+check_halt_node_context (const re_dfa_t *dfa, Idx node, unsigned int context)
+{
+ re_token_type_t type = dfa->nodes[node].type;
+ unsigned int constraint = dfa->nodes[node].constraint;
+ if (type != END_OF_RE)
+ return false;
+ if (!constraint)
+ return true;
+ if (NOT_SATISFY_NEXT_CONSTRAINT (constraint, context))
+ return false;
+ return true;
+}
+
+/* Check the halt state STATE match the current context.
+ Return 0 if not match, if the node, STATE has, is a halt node and
+ match the context, return the node. */
+
+static Idx
+internal_function
+check_halt_state_context (const re_match_context_t *mctx,
+ const re_dfastate_t *state, Idx idx)
+{
+ Idx i;
+ unsigned int context;
+#ifdef DEBUG
+ assert (state->halt);
+#endif
+ context = re_string_context_at (&mctx->input, idx, mctx->eflags);
+ for (i = 0; i < state->nodes.nelem; ++i)
+ if (check_halt_node_context (mctx->dfa, state->nodes.elems[i], context))
+ return state->nodes.elems[i];
+ return 0;
+}
+
+/* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA
+ corresponding to the DFA).
+ Return the destination node, and update EPS_VIA_NODES;
+ return REG_MISSING in case of errors. */
+
+static Idx
+internal_function
+proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs,
+ Idx *pidx, Idx node, re_node_set *eps_via_nodes,
+ struct re_fail_stack_t *fs)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx i;
+ bool ok;
+ if (IS_EPSILON_NODE (dfa->nodes[node].type))
+ {
+ re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes;
+ re_node_set *edests = &dfa->edests[node];
+ Idx dest_node;
+ ok = re_node_set_insert (eps_via_nodes, node);
+ if (BE (! ok, 0))
+ return REG_ERROR;
+ /* Pick up a valid destination, or return REG_MISSING if none
+ is found. */
+ for (dest_node = REG_MISSING, i = 0; i < edests->nelem; ++i)
+ {
+ Idx candidate = edests->elems[i];
+ if (!re_node_set_contains (cur_nodes, candidate))
+ continue;
+ if (dest_node == REG_MISSING)
+ dest_node = candidate;
+
+ else
+ {
+ /* In order to avoid infinite loop like "(a*)*", return the second
+ epsilon-transition if the first was already considered. */
+ if (re_node_set_contains (eps_via_nodes, dest_node))
+ return candidate;
+
+ /* Otherwise, push the second epsilon-transition on the fail stack. */
+ else if (fs != NULL
+ && push_fail_stack (fs, *pidx, candidate, nregs, regs,
+ eps_via_nodes))
+ return REG_ERROR;
+
+ /* We know we are going to exit. */
+ break;
+ }
+ }
+ return dest_node;
+ }
+ else
+ {
+ Idx naccepted = 0;
+ re_token_type_t type = dfa->nodes[node].type;
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->nodes[node].accept_mb)
+ naccepted = check_node_accept_bytes (dfa, node, &mctx->input, *pidx);
+ else
+#endif /* RE_ENABLE_I18N */
+ if (type == OP_BACK_REF)
+ {
+ Idx subexp_idx = dfa->nodes[node].opr.idx + 1;
+ naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so;
+ if (fs != NULL)
+ {
+ if (regs[subexp_idx].rm_so == -1 || regs[subexp_idx].rm_eo == -1)
+ return REG_MISSING;
+ else if (naccepted)
+ {
+ char *buf = (char *) re_string_get_buffer (&mctx->input);
+ if (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx,
+ naccepted) != 0)
+ return REG_MISSING;
+ }
+ }
+
+ if (naccepted == 0)
+ {
+ Idx dest_node;
+ ok = re_node_set_insert (eps_via_nodes, node);
+ if (BE (! ok, 0))
+ return REG_ERROR;
+ dest_node = dfa->edests[node].elems[0];
+ if (re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+ dest_node))
+ return dest_node;
+ }
+ }
+
+ if (naccepted != 0
+ || check_node_accept (mctx, dfa->nodes + node, *pidx))
+ {
+ Idx dest_node = dfa->nexts[node];
+ *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted;
+ if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL
+ || !re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+ dest_node)))
+ return REG_MISSING;
+ re_node_set_empty (eps_via_nodes);
+ return dest_node;
+ }
+ }
+ return REG_MISSING;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node,
+ Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes)
+{
+ reg_errcode_t err;
+ Idx num = fs->num++;
+ if (fs->num == fs->alloc)
+ {
+ struct re_fail_stack_ent_t *new_array;
+ new_array = realloc (fs->stack, (sizeof (struct re_fail_stack_ent_t)
+ * fs->alloc * 2));
+ if (new_array == NULL)
+ return REG_ESPACE;
+ fs->alloc *= 2;
+ fs->stack = new_array;
+ }
+ fs->stack[num].idx = str_idx;
+ fs->stack[num].node = dest_node;
+ fs->stack[num].regs = re_malloc (regmatch_t, nregs);
+ if (fs->stack[num].regs == NULL)
+ return REG_ESPACE;
+ memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs);
+ err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes);
+ return err;
+}
+
+static Idx
+internal_function
+pop_fail_stack (struct re_fail_stack_t *fs, Idx *pidx, Idx nregs,
+ regmatch_t *regs, re_node_set *eps_via_nodes)
+{
+ Idx num = --fs->num;
+ assert (REG_VALID_INDEX (num));
+ *pidx = fs->stack[num].idx;
+ memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs);
+ re_node_set_free (eps_via_nodes);
+ re_free (fs->stack[num].regs);
+ *eps_via_nodes = fs->stack[num].eps_via_nodes;
+ return fs->stack[num].node;
+}
+
+/* Set the positions where the subexpressions are starts/ends to registers
+ PMATCH.
+ Note: We assume that pmatch[0] is already set, and
+ pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch,
+ regmatch_t *pmatch, bool fl_backtrack)
+{
+ const re_dfa_t *dfa = (const re_dfa_t *) preg->buffer;
+ Idx idx, cur_node;
+ re_node_set eps_via_nodes;
+ struct re_fail_stack_t *fs;
+ struct re_fail_stack_t fs_body = { 0, 2, NULL };
+ regmatch_t *prev_idx_match;
+ bool prev_idx_match_malloced = false;
+
+#ifdef DEBUG
+ assert (nmatch > 1);
+ assert (mctx->state_log != NULL);
+#endif
+ if (fl_backtrack)
+ {
+ fs = &fs_body;
+ fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc);
+ if (fs->stack == NULL)
+ return REG_ESPACE;
+ }
+ else
+ fs = NULL;
+
+ cur_node = dfa->init_node;
+ re_node_set_init_empty (&eps_via_nodes);
+
+ if (__libc_use_alloca (nmatch * sizeof (regmatch_t)))
+ prev_idx_match = (regmatch_t *) alloca (nmatch * sizeof (regmatch_t));
+ else
+ {
+ prev_idx_match = re_malloc (regmatch_t, nmatch);
+ if (prev_idx_match == NULL)
+ {
+ free_fail_stack_return (fs);
+ return REG_ESPACE;
+ }
+ prev_idx_match_malloced = true;
+ }
+ memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
+
+ for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;)
+ {
+ update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch);
+
+ if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node)
+ {
+ Idx reg_idx;
+ if (fs)
+ {
+ for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+ if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1)
+ break;
+ if (reg_idx == nmatch)
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return free_fail_stack_return (fs);
+ }
+ cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+ &eps_via_nodes);
+ }
+ else
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return REG_NOERROR;
+ }
+ }
+
+ /* Proceed to next node. */
+ cur_node = proceed_next_node (mctx, nmatch, pmatch, &idx, cur_node,
+ &eps_via_nodes, fs);
+
+ if (BE (! REG_VALID_INDEX (cur_node), 0))
+ {
+ if (BE (cur_node == REG_ERROR, 0))
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ free_fail_stack_return (fs);
+ return REG_ESPACE;
+ }
+ if (fs)
+ cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+ &eps_via_nodes);
+ else
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return REG_NOMATCH;
+ }
+ }
+ }
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return free_fail_stack_return (fs);
+}
+
+static reg_errcode_t
+internal_function
+free_fail_stack_return (struct re_fail_stack_t *fs)
+{
+ if (fs)
+ {
+ Idx fs_idx;
+ for (fs_idx = 0; fs_idx < fs->num; ++fs_idx)
+ {
+ re_node_set_free (&fs->stack[fs_idx].eps_via_nodes);
+ re_free (fs->stack[fs_idx].regs);
+ }
+ re_free (fs->stack);
+ }
+ return REG_NOERROR;
+}
+
+static void
+internal_function
+update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
+ regmatch_t *prev_idx_match, Idx cur_node, Idx cur_idx, Idx nmatch)
+{
+ int type = dfa->nodes[cur_node].type;
+ if (type == OP_OPEN_SUBEXP)
+ {
+ Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
+
+ /* We are at the first node of this sub expression. */
+ if (reg_num < nmatch)
+ {
+ pmatch[reg_num].rm_so = cur_idx;
+ pmatch[reg_num].rm_eo = -1;
+ }
+ }
+ else if (type == OP_CLOSE_SUBEXP)
+ {
+ Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
+ if (reg_num < nmatch)
+ {
+ /* We are at the last node of this sub expression. */
+ if (pmatch[reg_num].rm_so < cur_idx)
+ {
+ pmatch[reg_num].rm_eo = cur_idx;
+ /* This is a non-empty match or we are not inside an optional
+ subexpression. Accept this right away. */
+ memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
+ }
+ else
+ {
+ if (dfa->nodes[cur_node].opt_subexp
+ && prev_idx_match[reg_num].rm_so != -1)
+ /* We transited through an empty match for an optional
+ subexpression, like (a?)*, and this is not the subexp's
+ first match. Copy back the old content of the registers
+ so that matches of an inner subexpression are undone as
+ well, like in ((a?))*. */
+ memcpy (pmatch, prev_idx_match, sizeof (regmatch_t) * nmatch);
+ else
+ /* We completed a subexpression, but it may be part of
+ an optional one, so do not update PREV_IDX_MATCH. */
+ pmatch[reg_num].rm_eo = cur_idx;
+ }
+ }
+ }
+}
+
+/* This function checks the STATE_LOG from the SCTX->last_str_idx to 0
+ and sift the nodes in each states according to the following rules.
+ Updated state_log will be wrote to STATE_LOG.
+
+ Rules: We throw away the Node `a' in the STATE_LOG[STR_IDX] if...
+ 1. When STR_IDX == MATCH_LAST(the last index in the state_log):
+ If `a' isn't the LAST_NODE and `a' can't epsilon transit to
+ the LAST_NODE, we throw away the node `a'.
+ 2. When 0 <= STR_IDX < MATCH_LAST and `a' accepts
+ string `s' and transit to `b':
+ i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
+ away the node `a'.
+ ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
+ thrown away, we throw away the node `a'.
+ 3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b':
+ i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
+ node `a'.
+ ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away,
+ we throw away the node `a'. */
+
+#define STATE_NODE_CONTAINS(state,node) \
+ ((state) != NULL && re_node_set_contains (&(state)->nodes, node))
+
+static reg_errcode_t
+internal_function
+sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx)
+{
+ reg_errcode_t err;
+ int null_cnt = 0;
+ Idx str_idx = sctx->last_str_idx;
+ re_node_set cur_dest;
+
+#ifdef DEBUG
+ assert (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL);
+#endif
+
+ /* Build sifted state_log[str_idx]. It has the nodes which can epsilon
+ transit to the last_node and the last_node itself. */
+ err = re_node_set_init_1 (&cur_dest, sctx->last_node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ /* Then check each states in the state_log. */
+ while (str_idx > 0)
+ {
+ /* Update counters. */
+ null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0;
+ if (null_cnt > mctx->max_mb_elem_len)
+ {
+ memset (sctx->sifted_states, '\0',
+ sizeof (re_dfastate_t *) * str_idx);
+ re_node_set_free (&cur_dest);
+ return REG_NOERROR;
+ }
+ re_node_set_empty (&cur_dest);
+ --str_idx;
+
+ if (mctx->state_log[str_idx])
+ {
+ err = build_sifted_states (mctx, sctx, str_idx, &cur_dest);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+
+ /* Add all the nodes which satisfy the following conditions:
+ - It can epsilon transit to a node in CUR_DEST.
+ - It is in CUR_SRC.
+ And update state_log. */
+ err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ err = REG_NOERROR;
+ free_return:
+ re_node_set_free (&cur_dest);
+ return err;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx str_idx, re_node_set *cur_dest)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ const re_node_set *cur_src = &mctx->state_log[str_idx]->non_eps_nodes;
+ Idx i;
+
+ /* Then build the next sifted state.
+ We build the next sifted state on `cur_dest', and update
+ `sifted_states[str_idx]' with `cur_dest'.
+ Note:
+ `cur_dest' is the sifted state from `state_log[str_idx + 1]'.
+ `cur_src' points the node_set of the old `state_log[str_idx]'
+ (with the epsilon nodes pre-filtered out). */
+ for (i = 0; i < cur_src->nelem; i++)
+ {
+ Idx prev_node = cur_src->elems[i];
+ int naccepted = 0;
+ bool ok;
+
+#ifdef DEBUG
+ re_token_type_t type = dfa->nodes[prev_node].type;
+ assert (!IS_EPSILON_NODE (type));
+#endif
+#ifdef RE_ENABLE_I18N
+ /* If the node may accept `multi byte'. */
+ if (dfa->nodes[prev_node].accept_mb)
+ naccepted = sift_states_iter_mb (mctx, sctx, prev_node,
+ str_idx, sctx->last_str_idx);
+#endif /* RE_ENABLE_I18N */
+
+ /* We don't check backreferences here.
+ See update_cur_sifted_state(). */
+ if (!naccepted
+ && check_node_accept (mctx, dfa->nodes + prev_node, str_idx)
+ && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1],
+ dfa->nexts[prev_node]))
+ naccepted = 1;
+
+ if (naccepted == 0)
+ continue;
+
+ if (sctx->limits.nelem)
+ {
+ Idx to_idx = str_idx + naccepted;
+ if (check_dst_limits (mctx, &sctx->limits,
+ dfa->nexts[prev_node], to_idx,
+ prev_node, str_idx))
+ continue;
+ }
+ ok = re_node_set_insert (cur_dest, prev_node);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+
+ return REG_NOERROR;
+}
+
+/* Helper functions. */
+
+static reg_errcode_t
+internal_function
+clean_state_log_if_needed (re_match_context_t *mctx, Idx next_state_log_idx)
+{
+ Idx top = mctx->state_log_top;
+
+ if (next_state_log_idx >= mctx->input.bufs_len
+ || (next_state_log_idx >= mctx->input.valid_len
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ reg_errcode_t err;
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ if (top < next_state_log_idx)
+ {
+ memset (mctx->state_log + top + 1, '\0',
+ sizeof (re_dfastate_t *) * (next_state_log_idx - top));
+ mctx->state_log_top = next_state_log_idx;
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+merge_state_array (const re_dfa_t *dfa, re_dfastate_t **dst,
+ re_dfastate_t **src, Idx num)
+{
+ Idx st_idx;
+ reg_errcode_t err;
+ for (st_idx = 0; st_idx < num; ++st_idx)
+ {
+ if (dst[st_idx] == NULL)
+ dst[st_idx] = src[st_idx];
+ else if (src[st_idx] != NULL)
+ {
+ re_node_set merged_set;
+ err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes,
+ &src[st_idx]->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ dst[st_idx] = re_acquire_state (&err, dfa, &merged_set);
+ re_node_set_free (&merged_set);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+update_cur_sifted_state (const re_match_context_t *mctx,
+ re_sift_context_t *sctx, Idx str_idx,
+ re_node_set *dest_nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err = REG_NOERROR;
+ const re_node_set *candidates;
+ candidates = ((mctx->state_log[str_idx] == NULL) ? NULL
+ : &mctx->state_log[str_idx]->nodes);
+
+ if (dest_nodes->nelem == 0)
+ sctx->sifted_states[str_idx] = NULL;
+ else
+ {
+ if (candidates)
+ {
+ /* At first, add the nodes which can epsilon transit to a node in
+ DEST_NODE. */
+ err = add_epsilon_src_nodes (dfa, dest_nodes, candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* Then, check the limitations in the current sift_context. */
+ if (sctx->limits.nelem)
+ {
+ err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits,
+ mctx->bkref_ents, str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+
+ sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ if (candidates && mctx->state_log[str_idx]->has_backref)
+ {
+ err = sift_states_bkref (mctx, sctx, str_idx, candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes,
+ const re_node_set *candidates)
+{
+ reg_errcode_t err = REG_NOERROR;
+ Idx i;
+
+ re_dfastate_t *state = re_acquire_state (&err, dfa, dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ if (!state->inveclosure.alloc)
+ {
+ err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem);
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ESPACE;
+ for (i = 0; i < dest_nodes->nelem; i++)
+ {
+ err = re_node_set_merge (&state->inveclosure,
+ dfa->inveclosures + dest_nodes->elems[i]);
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ESPACE;
+ }
+ }
+ return re_node_set_add_intersect (dest_nodes, candidates,
+ &state->inveclosure);
+}
+
+static reg_errcode_t
+internal_function
+sub_epsilon_src_nodes (const re_dfa_t *dfa, Idx node, re_node_set *dest_nodes,
+ const re_node_set *candidates)
+{
+ Idx ecl_idx;
+ reg_errcode_t err;
+ re_node_set *inv_eclosure = dfa->inveclosures + node;
+ re_node_set except_nodes;
+ re_node_set_init_empty (&except_nodes);
+ for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+ {
+ Idx cur_node = inv_eclosure->elems[ecl_idx];
+ if (cur_node == node)
+ continue;
+ if (IS_EPSILON_NODE (dfa->nodes[cur_node].type))
+ {
+ Idx edst1 = dfa->edests[cur_node].elems[0];
+ Idx edst2 = ((dfa->edests[cur_node].nelem > 1)
+ ? dfa->edests[cur_node].elems[1] : REG_MISSING);
+ if ((!re_node_set_contains (inv_eclosure, edst1)
+ && re_node_set_contains (dest_nodes, edst1))
+ || (REG_VALID_NONZERO_INDEX (edst2)
+ && !re_node_set_contains (inv_eclosure, edst2)
+ && re_node_set_contains (dest_nodes, edst2)))
+ {
+ err = re_node_set_add_intersect (&except_nodes, candidates,
+ dfa->inveclosures + cur_node);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&except_nodes);
+ return err;
+ }
+ }
+ }
+ }
+ for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+ {
+ Idx cur_node = inv_eclosure->elems[ecl_idx];
+ if (!re_node_set_contains (&except_nodes, cur_node))
+ {
+ Idx idx = re_node_set_contains (dest_nodes, cur_node) - 1;
+ re_node_set_remove_at (dest_nodes, idx);
+ }
+ }
+ re_node_set_free (&except_nodes);
+ return REG_NOERROR;
+}
+
+static bool
+internal_function
+check_dst_limits (const re_match_context_t *mctx, const re_node_set *limits,
+ Idx dst_node, Idx dst_idx, Idx src_node, Idx src_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx lim_idx, src_pos, dst_pos;
+
+ Idx dst_bkref_idx = search_cur_bkref_entry (mctx, dst_idx);
+ Idx src_bkref_idx = search_cur_bkref_entry (mctx, src_idx);
+ for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+ {
+ Idx subexp_idx;
+ struct re_backref_cache_entry *ent;
+ ent = mctx->bkref_ents + limits->elems[lim_idx];
+ subexp_idx = dfa->nodes[ent->node].opr.idx;
+
+ dst_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
+ subexp_idx, dst_node, dst_idx,
+ dst_bkref_idx);
+ src_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
+ subexp_idx, src_node, src_idx,
+ src_bkref_idx);
+
+ /* In case of:
+ <src> <dst> ( <subexp> )
+ ( <subexp> ) <src> <dst>
+ ( <subexp1> <src> <subexp2> <dst> <subexp3> ) */
+ if (src_pos == dst_pos)
+ continue; /* This is unrelated limitation. */
+ else
+ return true;
+ }
+ return false;
+}
+
+static int
+internal_function
+check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries,
+ Idx subexp_idx, Idx from_node, Idx bkref_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ const re_node_set *eclosures = dfa->eclosures + from_node;
+ Idx node_idx;
+
+ /* Else, we are on the boundary: examine the nodes on the epsilon
+ closure. */
+ for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx)
+ {
+ Idx node = eclosures->elems[node_idx];
+ switch (dfa->nodes[node].type)
+ {
+ case OP_BACK_REF:
+ if (bkref_idx != REG_MISSING)
+ {
+ struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx;
+ do
+ {
+ Idx dst;
+ int cpos;
+
+ if (ent->node != node)
+ continue;
+
+ if (subexp_idx < BITSET_WORD_BITS
+ && !(ent->eps_reachable_subexps_map
+ & ((bitset_word_t) 1 << subexp_idx)))
+ continue;
+
+ /* Recurse trying to reach the OP_OPEN_SUBEXP and
+ OP_CLOSE_SUBEXP cases below. But, if the
+ destination node is the same node as the source
+ node, don't recurse because it would cause an
+ infinite loop: a regex that exhibits this behavior
+ is ()\1*\1* */
+ dst = dfa->edests[node].elems[0];
+ if (dst == from_node)
+ {
+ if (boundaries & 1)
+ return -1;
+ else /* if (boundaries & 2) */
+ return 0;
+ }
+
+ cpos =
+ check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
+ dst, bkref_idx);
+ if (cpos == -1 /* && (boundaries & 1) */)
+ return -1;
+ if (cpos == 0 && (boundaries & 2))
+ return 0;
+
+ if (subexp_idx < BITSET_WORD_BITS)
+ ent->eps_reachable_subexps_map
+ &= ~((bitset_word_t) 1 << subexp_idx);
+ }
+ while (ent++->more);
+ }
+ break;
+
+ case OP_OPEN_SUBEXP:
+ if ((boundaries & 1) && subexp_idx == dfa->nodes[node].opr.idx)
+ return -1;
+ break;
+
+ case OP_CLOSE_SUBEXP:
+ if ((boundaries & 2) && subexp_idx == dfa->nodes[node].opr.idx)
+ return 0;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return (boundaries & 2) ? 1 : 0;
+}
+
+static int
+internal_function
+check_dst_limits_calc_pos (const re_match_context_t *mctx, Idx limit,
+ Idx subexp_idx, Idx from_node, Idx str_idx,
+ Idx bkref_idx)
+{
+ struct re_backref_cache_entry *lim = mctx->bkref_ents + limit;
+ int boundaries;
+
+ /* If we are outside the range of the subexpression, return -1 or 1. */
+ if (str_idx < lim->subexp_from)
+ return -1;
+
+ if (lim->subexp_to < str_idx)
+ return 1;
+
+ /* If we are within the subexpression, return 0. */
+ boundaries = (str_idx == lim->subexp_from);
+ boundaries |= (str_idx == lim->subexp_to) << 1;
+ if (boundaries == 0)
+ return 0;
+
+ /* Else, examine epsilon closure. */
+ return check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
+ from_node, bkref_idx);
+}
+
+/* Check the limitations of sub expressions LIMITS, and remove the nodes
+ which are against limitations from DEST_NODES. */
+
+static reg_errcode_t
+internal_function
+check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes,
+ const re_node_set *candidates, re_node_set *limits,
+ struct re_backref_cache_entry *bkref_ents, Idx str_idx)
+{
+ reg_errcode_t err;
+ Idx node_idx, lim_idx;
+
+ for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+ {
+ Idx subexp_idx;
+ struct re_backref_cache_entry *ent;
+ ent = bkref_ents + limits->elems[lim_idx];
+
+ if (str_idx <= ent->subexp_from || ent->str_idx < str_idx)
+ continue; /* This is unrelated limitation. */
+
+ subexp_idx = dfa->nodes[ent->node].opr.idx;
+ if (ent->subexp_to == str_idx)
+ {
+ Idx ops_node = REG_MISSING;
+ Idx cls_node = REG_MISSING;
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ re_token_type_t type = dfa->nodes[node].type;
+ if (type == OP_OPEN_SUBEXP
+ && subexp_idx == dfa->nodes[node].opr.idx)
+ ops_node = node;
+ else if (type == OP_CLOSE_SUBEXP
+ && subexp_idx == dfa->nodes[node].opr.idx)
+ cls_node = node;
+ }
+
+ /* Check the limitation of the open subexpression. */
+ /* Note that (ent->subexp_to = str_idx != ent->subexp_from). */
+ if (REG_VALID_INDEX (ops_node))
+ {
+ err = sub_epsilon_src_nodes (dfa, ops_node, dest_nodes,
+ candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ /* Check the limitation of the close subexpression. */
+ if (REG_VALID_INDEX (cls_node))
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ if (!re_node_set_contains (dfa->inveclosures + node,
+ cls_node)
+ && !re_node_set_contains (dfa->eclosures + node,
+ cls_node))
+ {
+ /* It is against this limitation.
+ Remove it form the current sifted state. */
+ err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
+ candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ --node_idx;
+ }
+ }
+ }
+ else /* (ent->subexp_to != str_idx) */
+ {
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ re_token_type_t type = dfa->nodes[node].type;
+ if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP)
+ {
+ if (subexp_idx != dfa->nodes[node].opr.idx)
+ continue;
+ /* It is against this limitation.
+ Remove it form the current sifted state. */
+ err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
+ candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx str_idx, const re_node_set *candidates)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx node_idx, node;
+ re_sift_context_t local_sctx;
+ Idx first_idx = search_cur_bkref_entry (mctx, str_idx);
+
+ if (first_idx == REG_MISSING)
+ return REG_NOERROR;
+
+ local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized. */
+
+ for (node_idx = 0; node_idx < candidates->nelem; ++node_idx)
+ {
+ Idx enabled_idx;
+ re_token_type_t type;
+ struct re_backref_cache_entry *entry;
+ node = candidates->elems[node_idx];
+ type = dfa->nodes[node].type;
+ /* Avoid infinite loop for the REs like "()\1+". */
+ if (node == sctx->last_node && str_idx == sctx->last_str_idx)
+ continue;
+ if (type != OP_BACK_REF)
+ continue;
+
+ entry = mctx->bkref_ents + first_idx;
+ enabled_idx = first_idx;
+ do
+ {
+ Idx subexp_len;
+ Idx to_idx;
+ Idx dst_node;
+ bool ok;
+ re_dfastate_t *cur_state;
+
+ if (entry->node != node)
+ continue;
+ subexp_len = entry->subexp_to - entry->subexp_from;
+ to_idx = str_idx + subexp_len;
+ dst_node = (subexp_len ? dfa->nexts[node]
+ : dfa->edests[node].elems[0]);
+
+ if (to_idx > sctx->last_str_idx
+ || sctx->sifted_states[to_idx] == NULL
+ || !STATE_NODE_CONTAINS (sctx->sifted_states[to_idx], dst_node)
+ || check_dst_limits (mctx, &sctx->limits, node,
+ str_idx, dst_node, to_idx))
+ continue;
+
+ if (local_sctx.sifted_states == NULL)
+ {
+ local_sctx = *sctx;
+ err = re_node_set_init_copy (&local_sctx.limits, &sctx->limits);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ local_sctx.last_node = node;
+ local_sctx.last_str_idx = str_idx;
+ ok = re_node_set_insert (&local_sctx.limits, enabled_idx);
+ if (BE (! ok, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ cur_state = local_sctx.sifted_states[str_idx];
+ err = sift_states_backward (mctx, &local_sctx);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ if (sctx->limited_states != NULL)
+ {
+ err = merge_state_array (dfa, sctx->limited_states,
+ local_sctx.sifted_states,
+ str_idx + 1);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ local_sctx.sifted_states[str_idx] = cur_state;
+ re_node_set_remove (&local_sctx.limits, enabled_idx);
+
+ /* mctx->bkref_ents may have changed, reload the pointer. */
+ entry = mctx->bkref_ents + enabled_idx;
+ }
+ while (enabled_idx++, entry++->more);
+ }
+ err = REG_NOERROR;
+ free_return:
+ if (local_sctx.sifted_states != NULL)
+ {
+ re_node_set_free (&local_sctx.limits);
+ }
+
+ return err;
+}
+
+
+#ifdef RE_ENABLE_I18N
+static int
+internal_function
+sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx node_idx, Idx str_idx, Idx max_str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ int naccepted;
+ /* Check the node can accept `multi byte'. */
+ naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx);
+ if (naccepted > 0 && str_idx + naccepted <= max_str_idx &&
+ !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
+ dfa->nexts[node_idx]))
+ /* The node can't accept the `multi byte', or the
+ destination was already thrown away, then the node
+ could't accept the current input `multi byte'. */
+ naccepted = 0;
+ /* Otherwise, it is sure that the node could accept
+ `naccepted' bytes input. */
+ return naccepted;
+}
+#endif /* RE_ENABLE_I18N */
+
+
+/* Functions for state transition. */
+
+/* Return the next state to which the current state STATE will transit by
+ accepting the current input byte, and update STATE_LOG if necessary.
+ If STATE can accept a multibyte char/collating element/back reference
+ update the destination of STATE_LOG. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+transit_state (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *state)
+{
+ re_dfastate_t **trtable;
+ unsigned char ch;
+
+#ifdef RE_ENABLE_I18N
+ /* If the current state can accept multibyte. */
+ if (BE (state->accept_mb, 0))
+ {
+ *err = transit_state_mb (mctx, state);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ }
+#endif /* RE_ENABLE_I18N */
+
+ /* Then decide the next state with the single byte. */
+#if 0
+ if (0)
+ /* don't use transition table */
+ return transit_state_sb (err, mctx, state);
+#endif
+
+ /* Use transition table */
+ ch = re_string_fetch_byte (&mctx->input);
+ for (;;)
+ {
+ trtable = state->trtable;
+ if (BE (trtable != NULL, 1))
+ return trtable[ch];
+
+ trtable = state->word_trtable;
+ if (BE (trtable != NULL, 1))
+ {
+ unsigned int context;
+ context
+ = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input) - 1,
+ mctx->eflags);
+ if (IS_WORD_CONTEXT (context))
+ return trtable[ch + SBC_MAX];
+ else
+ return trtable[ch];
+ }
+
+ if (!build_trtable (mctx->dfa, state))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ /* Retry, we now have a transition table. */
+ }
+}
+
+/* Update the state_log if we need */
+static re_dfastate_t *
+internal_function
+merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *next_state)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx cur_idx = re_string_cur_idx (&mctx->input);
+
+ if (cur_idx > mctx->state_log_top)
+ {
+ mctx->state_log[cur_idx] = next_state;
+ mctx->state_log_top = cur_idx;
+ }
+ else if (mctx->state_log[cur_idx] == 0)
+ {
+ mctx->state_log[cur_idx] = next_state;
+ }
+ else
+ {
+ re_dfastate_t *pstate;
+ unsigned int context;
+ re_node_set next_nodes, *log_nodes, *table_nodes = NULL;
+ /* If (state_log[cur_idx] != 0), it implies that cur_idx is
+ the destination of a multibyte char/collating element/
+ back reference. Then the next state is the union set of
+ these destinations and the results of the transition table. */
+ pstate = mctx->state_log[cur_idx];
+ log_nodes = pstate->entrance_nodes;
+ if (next_state != NULL)
+ {
+ table_nodes = next_state->entrance_nodes;
+ *err = re_node_set_init_union (&next_nodes, table_nodes,
+ log_nodes);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ }
+ else
+ next_nodes = *log_nodes;
+ /* Note: We already add the nodes of the initial state,
+ then we don't need to add them here. */
+
+ context = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input) - 1,
+ mctx->eflags);
+ next_state = mctx->state_log[cur_idx]
+ = re_acquire_state_context (err, dfa, &next_nodes, context);
+ /* We don't need to check errors here, since the return value of
+ this function is next_state and ERR is already set. */
+
+ if (table_nodes != NULL)
+ re_node_set_free (&next_nodes);
+ }
+
+ if (BE (dfa->nbackref, 0) && next_state != NULL)
+ {
+ /* Check OP_OPEN_SUBEXP in the current state in case that we use them
+ later. We must check them here, since the back references in the
+ next state might use them. */
+ *err = check_subexp_matching_top (mctx, &next_state->nodes,
+ cur_idx);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+
+ /* If the next state has back references. */
+ if (next_state->has_backref)
+ {
+ *err = transit_state_bkref (mctx, &next_state->nodes);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ next_state = mctx->state_log[cur_idx];
+ }
+ }
+
+ return next_state;
+}
+
+/* Skip bytes in the input that correspond to part of a
+ multi-byte match, then look in the log for a state
+ from which to restart matching. */
+static re_dfastate_t *
+internal_function
+find_recover_state (reg_errcode_t *err, re_match_context_t *mctx)
+{
+ re_dfastate_t *cur_state;
+ do
+ {
+ Idx max = mctx->state_log_top;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+
+ do
+ {
+ if (++cur_str_idx > max)
+ return NULL;
+ re_string_skip_bytes (&mctx->input, 1);
+ }
+ while (mctx->state_log[cur_str_idx] == NULL);
+
+ cur_state = merge_state_with_log (err, mctx, NULL);
+ }
+ while (*err == REG_NOERROR && cur_state == NULL);
+ return cur_state;
+}
+
+/* Helper functions for transit_state. */
+
+/* From the node set CUR_NODES, pick up the nodes whose types are
+ OP_OPEN_SUBEXP and which have corresponding back references in the regular
+ expression. And register them to use them later for evaluating the
+ correspoding back references. */
+
+static reg_errcode_t
+internal_function
+check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes,
+ Idx str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx node_idx;
+ reg_errcode_t err;
+
+ /* TODO: This isn't efficient.
+ Because there might be more than one nodes whose types are
+ OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
+ nodes.
+ E.g. RE: (a){2} */
+ for (node_idx = 0; node_idx < cur_nodes->nelem; ++node_idx)
+ {
+ Idx node = cur_nodes->elems[node_idx];
+ if (dfa->nodes[node].type == OP_OPEN_SUBEXP
+ && dfa->nodes[node].opr.idx < BITSET_WORD_BITS
+ && (dfa->used_bkref_map
+ & ((bitset_word_t) 1 << dfa->nodes[node].opr.idx)))
+ {
+ err = match_ctx_add_subtop (mctx, node, str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ return REG_NOERROR;
+}
+
+#if 0
+/* Return the next state to which the current state STATE will transit by
+ accepting the current input byte. */
+
+static re_dfastate_t *
+transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *state)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ re_node_set next_nodes;
+ re_dfastate_t *next_state;
+ Idx node_cnt, cur_str_idx = re_string_cur_idx (&mctx->input);
+ unsigned int context;
+
+ *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt)
+ {
+ Idx cur_node = state->nodes.elems[node_cnt];
+ if (check_node_accept (mctx, dfa->nodes + cur_node, cur_str_idx))
+ {
+ *err = re_node_set_merge (&next_nodes,
+ dfa->eclosures + dfa->nexts[cur_node]);
+ if (BE (*err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return NULL;
+ }
+ }
+ }
+ context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags);
+ next_state = re_acquire_state_context (err, dfa, &next_nodes, context);
+ /* We don't need to check errors here, since the return value of
+ this function is next_state and ERR is already set. */
+
+ re_node_set_free (&next_nodes);
+ re_string_skip_bytes (&mctx->input, 1);
+ return next_state;
+}
+#endif
+
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t
+internal_function
+transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx i;
+
+ for (i = 0; i < pstate->nodes.nelem; ++i)
+ {
+ re_node_set dest_nodes, *new_nodes;
+ Idx cur_node_idx = pstate->nodes.elems[i];
+ int naccepted;
+ Idx dest_idx;
+ unsigned int context;
+ re_dfastate_t *dest_state;
+
+ if (!dfa->nodes[cur_node_idx].accept_mb)
+ continue;
+
+ if (dfa->nodes[cur_node_idx].constraint)
+ {
+ context = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input),
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint,
+ context))
+ continue;
+ }
+
+ /* How many bytes the node can accept? */
+ naccepted = check_node_accept_bytes (dfa, cur_node_idx, &mctx->input,
+ re_string_cur_idx (&mctx->input));
+ if (naccepted == 0)
+ continue;
+
+ /* The node can accepts `naccepted' bytes. */
+ dest_idx = re_string_cur_idx (&mctx->input) + naccepted;
+ mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
+ : mctx->max_mb_elem_len);
+ err = clean_state_log_if_needed (mctx, dest_idx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+#ifdef DEBUG
+ assert (dfa->nexts[cur_node_idx] != REG_MISSING);
+#endif
+ new_nodes = dfa->eclosures + dfa->nexts[cur_node_idx];
+
+ dest_state = mctx->state_log[dest_idx];
+ if (dest_state == NULL)
+ dest_nodes = *new_nodes;
+ else
+ {
+ err = re_node_set_init_union (&dest_nodes,
+ dest_state->entrance_nodes, new_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ context = re_string_context_at (&mctx->input, dest_idx - 1,
+ mctx->eflags);
+ mctx->state_log[dest_idx]
+ = re_acquire_state_context (&err, dfa, &dest_nodes, context);
+ if (dest_state != NULL)
+ re_node_set_free (&dest_nodes);
+ if (BE (mctx->state_log[dest_idx] == NULL && err != REG_NOERROR, 0))
+ return err;
+ }
+ return REG_NOERROR;
+}
+#endif /* RE_ENABLE_I18N */
+
+static reg_errcode_t
+internal_function
+transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx i;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+
+ for (i = 0; i < nodes->nelem; ++i)
+ {
+ Idx dest_str_idx, prev_nelem, bkc_idx;
+ Idx node_idx = nodes->elems[i];
+ unsigned int context;
+ const re_token_t *node = dfa->nodes + node_idx;
+ re_node_set *new_dest_nodes;
+
+ /* Check whether `node' is a backreference or not. */
+ if (node->type != OP_BACK_REF)
+ continue;
+
+ if (node->constraint)
+ {
+ context = re_string_context_at (&mctx->input, cur_str_idx,
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+ continue;
+ }
+
+ /* `node' is a backreference.
+ Check the substring which the substring matched. */
+ bkc_idx = mctx->nbkref_ents;
+ err = get_subexp (mctx, node_idx, cur_str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ /* And add the epsilon closures (which is `new_dest_nodes') of
+ the backreference to appropriate state_log. */
+#ifdef DEBUG
+ assert (dfa->nexts[node_idx] != REG_MISSING);
+#endif
+ for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx)
+ {
+ Idx subexp_len;
+ re_dfastate_t *dest_state;
+ struct re_backref_cache_entry *bkref_ent;
+ bkref_ent = mctx->bkref_ents + bkc_idx;
+ if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx)
+ continue;
+ subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from;
+ new_dest_nodes = (subexp_len == 0
+ ? dfa->eclosures + dfa->edests[node_idx].elems[0]
+ : dfa->eclosures + dfa->nexts[node_idx]);
+ dest_str_idx = (cur_str_idx + bkref_ent->subexp_to
+ - bkref_ent->subexp_from);
+ context = re_string_context_at (&mctx->input, dest_str_idx - 1,
+ mctx->eflags);
+ dest_state = mctx->state_log[dest_str_idx];
+ prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
+ : mctx->state_log[cur_str_idx]->nodes.nelem);
+ /* Add `new_dest_node' to state_log. */
+ if (dest_state == NULL)
+ {
+ mctx->state_log[dest_str_idx]
+ = re_acquire_state_context (&err, dfa, new_dest_nodes,
+ context);
+ if (BE (mctx->state_log[dest_str_idx] == NULL
+ && err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ else
+ {
+ re_node_set dest_nodes;
+ err = re_node_set_init_union (&dest_nodes,
+ dest_state->entrance_nodes,
+ new_dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&dest_nodes);
+ goto free_return;
+ }
+ mctx->state_log[dest_str_idx]
+ = re_acquire_state_context (&err, dfa, &dest_nodes, context);
+ re_node_set_free (&dest_nodes);
+ if (BE (mctx->state_log[dest_str_idx] == NULL
+ && err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ /* We need to check recursively if the backreference can epsilon
+ transit. */
+ if (subexp_len == 0
+ && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem)
+ {
+ err = check_subexp_matching_top (mctx, new_dest_nodes,
+ cur_str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ err = transit_state_bkref (mctx, new_dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ }
+ }
+ err = REG_NOERROR;
+ free_return:
+ return err;
+}
+
+/* Enumerate all the candidates which the backreference BKREF_NODE can match
+ at BKREF_STR_IDX, and register them by match_ctx_add_entry().
+ Note that we might collect inappropriate candidates here.
+ However, the cost of checking them strictly here is too high, then we
+ delay these checking for prune_impossible_nodes(). */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx subexp_num, sub_top_idx;
+ const char *buf = (const char *) re_string_get_buffer (&mctx->input);
+ /* Return if we have already checked BKREF_NODE at BKREF_STR_IDX. */
+ Idx cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx);
+ if (cache_idx != REG_MISSING)
+ {
+ const struct re_backref_cache_entry *entry
+ = mctx->bkref_ents + cache_idx;
+ do
+ if (entry->node == bkref_node)
+ return REG_NOERROR; /* We already checked it. */
+ while (entry++->more);
+ }
+
+ subexp_num = dfa->nodes[bkref_node].opr.idx;
+
+ /* For each sub expression */
+ for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx)
+ {
+ reg_errcode_t err;
+ re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx];
+ re_sub_match_last_t *sub_last;
+ Idx sub_last_idx, sl_str, bkref_str_off;
+
+ if (dfa->nodes[sub_top->node].opr.idx != subexp_num)
+ continue; /* It isn't related. */
+
+ sl_str = sub_top->str_idx;
+ bkref_str_off = bkref_str_idx;
+ /* At first, check the last node of sub expressions we already
+ evaluated. */
+ for (sub_last_idx = 0; sub_last_idx < sub_top->nlasts; ++sub_last_idx)
+ {
+ regoff_t sl_str_diff;
+ sub_last = sub_top->lasts[sub_last_idx];
+ sl_str_diff = sub_last->str_idx - sl_str;
+ /* The matched string by the sub expression match with the substring
+ at the back reference? */
+ if (sl_str_diff > 0)
+ {
+ if (BE (bkref_str_off + sl_str_diff > mctx->input.valid_len, 0))
+ {
+ /* Not enough chars for a successful match. */
+ if (bkref_str_off + sl_str_diff > mctx->input.len)
+ break;
+
+ err = clean_state_log_if_needed (mctx,
+ bkref_str_off
+ + sl_str_diff);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+ }
+ if (memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0)
+ /* We don't need to search this sub expression any more. */
+ break;
+ }
+ bkref_str_off += sl_str_diff;
+ sl_str += sl_str_diff;
+ err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+ bkref_str_idx);
+
+ /* Reload buf, since the preceding call might have reallocated
+ the buffer. */
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+
+ if (err == REG_NOMATCH)
+ continue;
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ if (sub_last_idx < sub_top->nlasts)
+ continue;
+ if (sub_last_idx > 0)
+ ++sl_str;
+ /* Then, search for the other last nodes of the sub expression. */
+ for (; sl_str <= bkref_str_idx; ++sl_str)
+ {
+ Idx cls_node;
+ regoff_t sl_str_off;
+ const re_node_set *nodes;
+ sl_str_off = sl_str - sub_top->str_idx;
+ /* The matched string by the sub expression match with the substring
+ at the back reference? */
+ if (sl_str_off > 0)
+ {
+ if (BE (bkref_str_off >= mctx->input.valid_len, 0))
+ {
+ /* If we are at the end of the input, we cannot match. */
+ if (bkref_str_off >= mctx->input.len)
+ break;
+
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+ }
+ if (buf [bkref_str_off++] != buf[sl_str - 1])
+ break; /* We don't need to search this sub expression
+ any more. */
+ }
+ if (mctx->state_log[sl_str] == NULL)
+ continue;
+ /* Does this state have a ')' of the sub expression? */
+ nodes = &mctx->state_log[sl_str]->nodes;
+ cls_node = find_subexp_node (dfa, nodes, subexp_num,
+ OP_CLOSE_SUBEXP);
+ if (cls_node == REG_MISSING)
+ continue; /* No. */
+ if (sub_top->path == NULL)
+ {
+ sub_top->path = calloc (sizeof (state_array_t),
+ sl_str - sub_top->str_idx + 1);
+ if (sub_top->path == NULL)
+ return REG_ESPACE;
+ }
+ /* Can the OP_OPEN_SUBEXP node arrive the OP_CLOSE_SUBEXP node
+ in the current context? */
+ err = check_arrival (mctx, sub_top->path, sub_top->node,
+ sub_top->str_idx, cls_node, sl_str,
+ OP_CLOSE_SUBEXP);
+ if (err == REG_NOMATCH)
+ continue;
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str);
+ if (BE (sub_last == NULL, 0))
+ return REG_ESPACE;
+ err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+ bkref_str_idx);
+ if (err == REG_NOMATCH)
+ continue;
+ }
+ }
+ return REG_NOERROR;
+}
+
+/* Helper functions for get_subexp(). */
+
+/* Check SUB_LAST can arrive to the back reference BKREF_NODE at BKREF_STR.
+ If it can arrive, register the sub expression expressed with SUB_TOP
+ and SUB_LAST. */
+
+static reg_errcode_t
+internal_function
+get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top,
+ re_sub_match_last_t *sub_last, Idx bkref_node, Idx bkref_str)
+{
+ reg_errcode_t err;
+ Idx to_idx;
+ /* Can the subexpression arrive the back reference? */
+ err = check_arrival (mctx, &sub_last->path, sub_last->node,
+ sub_last->str_idx, bkref_node, bkref_str,
+ OP_OPEN_SUBEXP);
+ if (err != REG_NOERROR)
+ return err;
+ err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx,
+ sub_last->str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx;
+ return clean_state_log_if_needed (mctx, to_idx);
+}
+
+/* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX.
+ Search '(' if FL_OPEN, or search ')' otherwise.
+ TODO: This function isn't efficient...
+ Because there might be more than one nodes whose types are
+ OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
+ nodes.
+ E.g. RE: (a){2} */
+
+static Idx
+internal_function
+find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+ Idx subexp_idx, int type)
+{
+ Idx cls_idx;
+ for (cls_idx = 0; cls_idx < nodes->nelem; ++cls_idx)
+ {
+ Idx cls_node = nodes->elems[cls_idx];
+ const re_token_t *node = dfa->nodes + cls_node;
+ if (node->type == type
+ && node->opr.idx == subexp_idx)
+ return cls_node;
+ }
+ return REG_MISSING;
+}
+
+/* Check whether the node TOP_NODE at TOP_STR can arrive to the node
+ LAST_NODE at LAST_STR. We record the path onto PATH since it will be
+ heavily reused.
+ Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node,
+ Idx top_str, Idx last_node, Idx last_str, int type)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err = REG_NOERROR;
+ Idx subexp_num, backup_cur_idx, str_idx, null_cnt;
+ re_dfastate_t *cur_state = NULL;
+ re_node_set *cur_nodes, next_nodes;
+ re_dfastate_t **backup_state_log;
+ unsigned int context;
+
+ subexp_num = dfa->nodes[top_node].opr.idx;
+ /* Extend the buffer if we need. */
+ if (BE (path->alloc < last_str + mctx->max_mb_elem_len + 1, 0))
+ {
+ re_dfastate_t **new_array;
+ Idx old_alloc = path->alloc;
+ Idx new_alloc = old_alloc + last_str + mctx->max_mb_elem_len + 1;
+ if (BE (new_alloc < old_alloc, 0)
+ || BE (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc, 0))
+ return REG_ESPACE;
+ new_array = re_realloc (path->array, re_dfastate_t *, new_alloc);
+ if (BE (new_array == NULL, 0))
+ return REG_ESPACE;
+ path->array = new_array;
+ path->alloc = new_alloc;
+ memset (new_array + old_alloc, '\0',
+ sizeof (re_dfastate_t *) * (path->alloc - old_alloc));
+ }
+
+ str_idx = path->next_idx ? path->next_idx : top_str;
+
+ /* Temporary modify MCTX. */
+ backup_state_log = mctx->state_log;
+ backup_cur_idx = mctx->input.cur_idx;
+ mctx->state_log = path->array;
+ mctx->input.cur_idx = str_idx;
+
+ /* Setup initial node set. */
+ context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
+ if (str_idx == top_str)
+ {
+ err = re_node_set_init_1 (&next_nodes, top_node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ else
+ {
+ cur_state = mctx->state_log[str_idx];
+ if (cur_state && cur_state->has_backref)
+ {
+ err = re_node_set_init_copy (&next_nodes, &cur_state->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ else
+ re_node_set_init_empty (&next_nodes);
+ }
+ if (str_idx == top_str || (cur_state && cur_state->has_backref))
+ {
+ if (next_nodes.nelem)
+ {
+ err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+ subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+ if (BE (cur_state == NULL && err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ mctx->state_log[str_idx] = cur_state;
+ }
+
+ for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;)
+ {
+ re_node_set_empty (&next_nodes);
+ if (mctx->state_log[str_idx + 1])
+ {
+ err = re_node_set_merge (&next_nodes,
+ &mctx->state_log[str_idx + 1]->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ if (cur_state)
+ {
+ err = check_arrival_add_next_nodes (mctx, str_idx,
+ &cur_state->non_eps_nodes,
+ &next_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ ++str_idx;
+ if (next_nodes.nelem)
+ {
+ err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+ subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
+ cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+ if (BE (cur_state == NULL && err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ mctx->state_log[str_idx] = cur_state;
+ null_cnt = cur_state == NULL ? null_cnt + 1 : 0;
+ }
+ re_node_set_free (&next_nodes);
+ cur_nodes = (mctx->state_log[last_str] == NULL ? NULL
+ : &mctx->state_log[last_str]->nodes);
+ path->next_idx = str_idx;
+
+ /* Fix MCTX. */
+ mctx->state_log = backup_state_log;
+ mctx->input.cur_idx = backup_cur_idx;
+
+ /* Then check the current node set has the node LAST_NODE. */
+ if (cur_nodes != NULL && re_node_set_contains (cur_nodes, last_node))
+ return REG_NOERROR;
+
+ return REG_NOMATCH;
+}
+
+/* Helper functions for check_arrival. */
+
+/* Calculate the destination nodes of CUR_NODES at STR_IDX, and append them
+ to NEXT_NODES.
+ TODO: This function is similar to the functions transit_state*(),
+ however this function has many additional works.
+ Can't we unify them? */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx,
+ re_node_set *cur_nodes, re_node_set *next_nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ bool ok;
+ Idx cur_idx;
+#ifdef RE_ENABLE_I18N
+ reg_errcode_t err = REG_NOERROR;
+#endif
+ re_node_set union_set;
+ re_node_set_init_empty (&union_set);
+ for (cur_idx = 0; cur_idx < cur_nodes->nelem; ++cur_idx)
+ {
+ int naccepted = 0;
+ Idx cur_node = cur_nodes->elems[cur_idx];
+#ifdef DEBUG
+ re_token_type_t type = dfa->nodes[cur_node].type;
+ assert (!IS_EPSILON_NODE (type));
+#endif
+#ifdef RE_ENABLE_I18N
+ /* If the node may accept `multi byte'. */
+ if (dfa->nodes[cur_node].accept_mb)
+ {
+ naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input,
+ str_idx);
+ if (naccepted > 1)
+ {
+ re_dfastate_t *dest_state;
+ Idx next_node = dfa->nexts[cur_node];
+ Idx next_idx = str_idx + naccepted;
+ dest_state = mctx->state_log[next_idx];
+ re_node_set_empty (&union_set);
+ if (dest_state)
+ {
+ err = re_node_set_merge (&union_set, &dest_state->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&union_set);
+ return err;
+ }
+ }
+ ok = re_node_set_insert (&union_set, next_node);
+ if (BE (! ok, 0))
+ {
+ re_node_set_free (&union_set);
+ return REG_ESPACE;
+ }
+ mctx->state_log[next_idx] = re_acquire_state (&err, dfa,
+ &union_set);
+ if (BE (mctx->state_log[next_idx] == NULL
+ && err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&union_set);
+ return err;
+ }
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ if (naccepted
+ || check_node_accept (mctx, dfa->nodes + cur_node, str_idx))
+ {
+ ok = re_node_set_insert (next_nodes, dfa->nexts[cur_node]);
+ if (BE (! ok, 0))
+ {
+ re_node_set_free (&union_set);
+ return REG_ESPACE;
+ }
+ }
+ }
+ re_node_set_free (&union_set);
+ return REG_NOERROR;
+}
+
+/* For all the nodes in CUR_NODES, add the epsilon closures of them to
+ CUR_NODES, however exclude the nodes which are:
+ - inside the sub expression whose number is EX_SUBEXP, if FL_OPEN.
+ - out of the sub expression whose number is EX_SUBEXP, if !FL_OPEN.
+*/
+
+static reg_errcode_t
+internal_function
+check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes,
+ Idx ex_subexp, int type)
+{
+ reg_errcode_t err;
+ Idx idx, outside_node;
+ re_node_set new_nodes;
+#ifdef DEBUG
+ assert (cur_nodes->nelem);
+#endif
+ err = re_node_set_alloc (&new_nodes, cur_nodes->nelem);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ /* Create a new node set NEW_NODES with the nodes which are epsilon
+ closures of the node in CUR_NODES. */
+
+ for (idx = 0; idx < cur_nodes->nelem; ++idx)
+ {
+ Idx cur_node = cur_nodes->elems[idx];
+ const re_node_set *eclosure = dfa->eclosures + cur_node;
+ outside_node = find_subexp_node (dfa, eclosure, ex_subexp, type);
+ if (outside_node == REG_MISSING)
+ {
+ /* There are no problematic nodes, just merge them. */
+ err = re_node_set_merge (&new_nodes, eclosure);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&new_nodes);
+ return err;
+ }
+ }
+ else
+ {
+ /* There are problematic nodes, re-calculate incrementally. */
+ err = check_arrival_expand_ecl_sub (dfa, &new_nodes, cur_node,
+ ex_subexp, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&new_nodes);
+ return err;
+ }
+ }
+ }
+ re_node_set_free (cur_nodes);
+ *cur_nodes = new_nodes;
+ return REG_NOERROR;
+}
+
+/* Helper function for check_arrival_expand_ecl.
+ Check incrementally the epsilon closure of TARGET, and if it isn't
+ problematic append it to DST_NODES. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes,
+ Idx target, Idx ex_subexp, int type)
+{
+ Idx cur_node;
+ for (cur_node = target; !re_node_set_contains (dst_nodes, cur_node);)
+ {
+ bool ok;
+
+ if (dfa->nodes[cur_node].type == type
+ && dfa->nodes[cur_node].opr.idx == ex_subexp)
+ {
+ if (type == OP_CLOSE_SUBEXP)
+ {
+ ok = re_node_set_insert (dst_nodes, cur_node);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ break;
+ }
+ ok = re_node_set_insert (dst_nodes, cur_node);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ if (dfa->edests[cur_node].nelem == 0)
+ break;
+ if (dfa->edests[cur_node].nelem == 2)
+ {
+ reg_errcode_t err;
+ err = check_arrival_expand_ecl_sub (dfa, dst_nodes,
+ dfa->edests[cur_node].elems[1],
+ ex_subexp, type);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ cur_node = dfa->edests[cur_node].elems[0];
+ }
+ return REG_NOERROR;
+}
+
+
+/* For all the back references in the current state, calculate the
+ destination of the back references by the appropriate entry
+ in MCTX->BKREF_ENTS. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes,
+ Idx cur_str, Idx subexp_num, int type)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx cache_idx_start = search_cur_bkref_entry (mctx, cur_str);
+ struct re_backref_cache_entry *ent;
+
+ if (cache_idx_start == REG_MISSING)
+ return REG_NOERROR;
+
+ restart:
+ ent = mctx->bkref_ents + cache_idx_start;
+ do
+ {
+ Idx to_idx, next_node;
+
+ /* Is this entry ENT is appropriate? */
+ if (!re_node_set_contains (cur_nodes, ent->node))
+ continue; /* No. */
+
+ to_idx = cur_str + ent->subexp_to - ent->subexp_from;
+ /* Calculate the destination of the back reference, and append it
+ to MCTX->STATE_LOG. */
+ if (to_idx == cur_str)
+ {
+ /* The backreference did epsilon transit, we must re-check all the
+ node in the current state. */
+ re_node_set new_dests;
+ reg_errcode_t err2, err3;
+ next_node = dfa->edests[ent->node].elems[0];
+ if (re_node_set_contains (cur_nodes, next_node))
+ continue;
+ err = re_node_set_init_1 (&new_dests, next_node);
+ err2 = check_arrival_expand_ecl (dfa, &new_dests, subexp_num, type);
+ err3 = re_node_set_merge (cur_nodes, &new_dests);
+ re_node_set_free (&new_dests);
+ if (BE (err != REG_NOERROR || err2 != REG_NOERROR
+ || err3 != REG_NOERROR, 0))
+ {
+ err = (err != REG_NOERROR ? err
+ : (err2 != REG_NOERROR ? err2 : err3));
+ return err;
+ }
+ /* TODO: It is still inefficient... */
+ goto restart;
+ }
+ else
+ {
+ re_node_set union_set;
+ next_node = dfa->nexts[ent->node];
+ if (mctx->state_log[to_idx])
+ {
+ bool ok;
+ if (re_node_set_contains (&mctx->state_log[to_idx]->nodes,
+ next_node))
+ continue;
+ err = re_node_set_init_copy (&union_set,
+ &mctx->state_log[to_idx]->nodes);
+ ok = re_node_set_insert (&union_set, next_node);
+ if (BE (err != REG_NOERROR || ! ok, 0))
+ {
+ re_node_set_free (&union_set);
+ err = err != REG_NOERROR ? err : REG_ESPACE;
+ return err;
+ }
+ }
+ else
+ {
+ err = re_node_set_init_1 (&union_set, next_node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set);
+ re_node_set_free (&union_set);
+ if (BE (mctx->state_log[to_idx] == NULL
+ && err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ while (ent++->more);
+ return REG_NOERROR;
+}
+
+/* Build transition table for the state.
+ Return true if successful. */
+
+static bool
+internal_function
+build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
+{
+ reg_errcode_t err;
+ Idx i, j;
+ int ch;
+ bool need_word_trtable = false;
+ bitset_word_t elem, mask;
+ bool dests_node_malloced = false;
+ bool dest_states_malloced = false;
+ Idx ndests; /* Number of the destination states from `state'. */
+ re_dfastate_t **trtable;
+ re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl;
+ re_node_set follows, *dests_node;
+ bitset_t *dests_ch;
+ bitset_t acceptable;
+
+ struct dests_alloc
+ {
+ re_node_set dests_node[SBC_MAX];
+ bitset_t dests_ch[SBC_MAX];
+ } *dests_alloc;
+
+ /* We build DFA states which corresponds to the destination nodes
+ from `state'. `dests_node[i]' represents the nodes which i-th
+ destination state contains, and `dests_ch[i]' represents the
+ characters which i-th destination state accepts. */
+ if (__libc_use_alloca (sizeof (struct dests_alloc)))
+ dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc));
+ else
+ {
+ dests_alloc = re_malloc (struct dests_alloc, 1);
+ if (BE (dests_alloc == NULL, 0))
+ return false;
+ dests_node_malloced = true;
+ }
+ dests_node = dests_alloc->dests_node;
+ dests_ch = dests_alloc->dests_ch;
+
+ /* Initialize transiton table. */
+ state->word_trtable = state->trtable = NULL;
+
+ /* At first, group all nodes belonging to `state' into several
+ destinations. */
+ ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch);
+ if (BE (! REG_VALID_NONZERO_INDEX (ndests), 0))
+ {
+ if (dests_node_malloced)
+ free (dests_alloc);
+ if (ndests == 0)
+ {
+ state->trtable = (re_dfastate_t **)
+ calloc (sizeof (re_dfastate_t *), SBC_MAX);
+ return true;
+ }
+ return false;
+ }
+
+ err = re_node_set_alloc (&follows, ndests + 1);
+ if (BE (err != REG_NOERROR, 0))
+ goto out_free;
+
+ /* Avoid arithmetic overflow in size calculation. */
+ if (BE ((((SIZE_MAX - (sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX)
+ / (3 * sizeof (re_dfastate_t *)))
+ < ndests),
+ 0))
+ goto out_free;
+
+ if (__libc_use_alloca ((sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX
+ + ndests * 3 * sizeof (re_dfastate_t *)))
+ dest_states = (re_dfastate_t **)
+ alloca (ndests * 3 * sizeof (re_dfastate_t *));
+ else
+ {
+ dest_states = (re_dfastate_t **)
+ malloc (ndests * 3 * sizeof (re_dfastate_t *));
+ if (BE (dest_states == NULL, 0))
+ {
+out_free:
+ if (dest_states_malloced)
+ free (dest_states);
+ re_node_set_free (&follows);
+ for (i = 0; i < ndests; ++i)
+ re_node_set_free (dests_node + i);
+ if (dests_node_malloced)
+ free (dests_alloc);
+ return false;
+ }
+ dest_states_malloced = true;
+ }
+ dest_states_word = dest_states + ndests;
+ dest_states_nl = dest_states_word + ndests;
+ bitset_empty (acceptable);
+
+ /* Then build the states for all destinations. */
+ for (i = 0; i < ndests; ++i)
+ {
+ Idx next_node;
+ re_node_set_empty (&follows);
+ /* Merge the follows of this destination states. */
+ for (j = 0; j < dests_node[i].nelem; ++j)
+ {
+ next_node = dfa->nexts[dests_node[i].elems[j]];
+ if (next_node != REG_MISSING)
+ {
+ err = re_node_set_merge (&follows, dfa->eclosures + next_node);
+ if (BE (err != REG_NOERROR, 0))
+ goto out_free;
+ }
+ }
+ dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0);
+ if (BE (dest_states[i] == NULL && err != REG_NOERROR, 0))
+ goto out_free;
+ /* If the new state has context constraint,
+ build appropriate states for these contexts. */
+ if (dest_states[i]->has_constraint)
+ {
+ dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows,
+ CONTEXT_WORD);
+ if (BE (dest_states_word[i] == NULL && err != REG_NOERROR, 0))
+ goto out_free;
+
+ if (dest_states[i] != dest_states_word[i] && dfa->mb_cur_max > 1)
+ need_word_trtable = true;
+
+ dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows,
+ CONTEXT_NEWLINE);
+ if (BE (dest_states_nl[i] == NULL && err != REG_NOERROR, 0))
+ goto out_free;
+ }
+ else
+ {
+ dest_states_word[i] = dest_states[i];
+ dest_states_nl[i] = dest_states[i];
+ }
+ bitset_merge (acceptable, dests_ch[i]);
+ }
+
+ if (!BE (need_word_trtable, 0))
+ {
+ /* We don't care about whether the following character is a word
+ character, or we are in a single-byte character set so we can
+ discern by looking at the character code: allocate a
+ 256-entry transition table. */
+ trtable = state->trtable =
+ (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX);
+ if (BE (trtable == NULL, 0))
+ goto out_free;
+
+ /* For all characters ch...: */
+ for (i = 0; i < BITSET_WORDS; ++i)
+ for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
+ elem;
+ mask <<= 1, elem >>= 1, ++ch)
+ if (BE (elem & 1, 0))
+ {
+ /* There must be exactly one destination which accepts
+ character ch. See group_nodes_into_DFAstates. */
+ for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
+ ;
+
+ /* j-th destination accepts the word character ch. */
+ if (dfa->word_char[i] & mask)
+ trtable[ch] = dest_states_word[j];
+ else
+ trtable[ch] = dest_states[j];
+ }
+ }
+ else
+ {
+ /* We care about whether the following character is a word
+ character, and we are in a multi-byte character set: discern
+ by looking at the character code: build two 256-entry
+ transition tables, one starting at trtable[0] and one
+ starting at trtable[SBC_MAX]. */
+ trtable = state->word_trtable =
+ (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), 2 * SBC_MAX);
+ if (BE (trtable == NULL, 0))
+ goto out_free;
+
+ /* For all characters ch...: */
+ for (i = 0; i < BITSET_WORDS; ++i)
+ for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
+ elem;
+ mask <<= 1, elem >>= 1, ++ch)
+ if (BE (elem & 1, 0))
+ {
+ /* There must be exactly one destination which accepts
+ character ch. See group_nodes_into_DFAstates. */
+ for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
+ ;
+
+ /* j-th destination accepts the word character ch. */
+ trtable[ch] = dest_states[j];
+ trtable[ch + SBC_MAX] = dest_states_word[j];
+ }
+ }
+
+ /* new line */
+ if (bitset_contain (acceptable, NEWLINE_CHAR))
+ {
+ /* The current state accepts newline character. */
+ for (j = 0; j < ndests; ++j)
+ if (bitset_contain (dests_ch[j], NEWLINE_CHAR))
+ {
+ /* k-th destination accepts newline character. */
+ trtable[NEWLINE_CHAR] = dest_states_nl[j];
+ if (need_word_trtable)
+ trtable[NEWLINE_CHAR + SBC_MAX] = dest_states_nl[j];
+ /* There must be only one destination which accepts
+ newline. See group_nodes_into_DFAstates. */
+ break;
+ }
+ }
+
+ if (dest_states_malloced)
+ free (dest_states);
+
+ re_node_set_free (&follows);
+ for (i = 0; i < ndests; ++i)
+ re_node_set_free (dests_node + i);
+
+ if (dests_node_malloced)
+ free (dests_alloc);
+
+ return true;
+}
+
+/* Group all nodes belonging to STATE into several destinations.
+ Then for all destinations, set the nodes belonging to the destination
+ to DESTS_NODE[i] and set the characters accepted by the destination
+ to DEST_CH[i]. This function return the number of destinations. */
+
+static Idx
+internal_function
+group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
+ re_node_set *dests_node, bitset_t *dests_ch)
+{
+ reg_errcode_t err;
+ bool ok;
+ Idx i, j, k;
+ Idx ndests; /* Number of the destinations from `state'. */
+ bitset_t accepts; /* Characters a node can accept. */
+ const re_node_set *cur_nodes = &state->nodes;
+ bitset_empty (accepts);
+ ndests = 0;
+
+ /* For all the nodes belonging to `state', */
+ for (i = 0; i < cur_nodes->nelem; ++i)
+ {
+ re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
+ re_token_type_t type = node->type;
+ unsigned int constraint = node->constraint;
+
+ /* Enumerate all single byte character this node can accept. */
+ if (type == CHARACTER)
+ bitset_set (accepts, node->opr.c);
+ else if (type == SIMPLE_BRACKET)
+ {
+ bitset_merge (accepts, node->opr.sbcset);
+ }
+ else if (type == OP_PERIOD)
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ bitset_merge (accepts, dfa->sb_char);
+ else
+#endif
+ bitset_set_all (accepts);
+ if (!(dfa->syntax & RE_DOT_NEWLINE))
+ bitset_clear (accepts, '\n');
+ if (dfa->syntax & RE_DOT_NOT_NULL)
+ bitset_clear (accepts, '\0');
+ }
+#ifdef RE_ENABLE_I18N
+ else if (type == OP_UTF8_PERIOD)
+ {
+ if (ASCII_CHARS % BITSET_WORD_BITS == 0)
+ memset (accepts, -1, ASCII_CHARS / CHAR_BIT);
+ else
+ bitset_merge (accepts, utf8_sb_map);
+ if (!(dfa->syntax & RE_DOT_NEWLINE))
+ bitset_clear (accepts, '\n');
+ if (dfa->syntax & RE_DOT_NOT_NULL)
+ bitset_clear (accepts, '\0');
+ }
+#endif
+ else
+ continue;
+
+ /* Check the `accepts' and sift the characters which are not
+ match it the context. */
+ if (constraint)
+ {
+ if (constraint & NEXT_NEWLINE_CONSTRAINT)
+ {
+ bool accepts_newline = bitset_contain (accepts, NEWLINE_CHAR);
+ bitset_empty (accepts);
+ if (accepts_newline)
+ bitset_set (accepts, NEWLINE_CHAR);
+ else
+ continue;
+ }
+ if (constraint & NEXT_ENDBUF_CONSTRAINT)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+
+ if (constraint & NEXT_WORD_CONSTRAINT)
+ {
+ bitset_word_t any_set = 0;
+ if (type == CHARACTER && !node->word_char)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j]));
+ else
+#endif
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= dfa->word_char[j]);
+ if (!any_set)
+ continue;
+ }
+ if (constraint & NEXT_NOTWORD_CONSTRAINT)
+ {
+ bitset_word_t any_set = 0;
+ if (type == CHARACTER && node->word_char)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j]));
+ else
+#endif
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= ~dfa->word_char[j]);
+ if (!any_set)
+ continue;
+ }
+ }
+
+ /* Then divide `accepts' into DFA states, or create a new
+ state. Above, we make sure that accepts is not empty. */
+ for (j = 0; j < ndests; ++j)
+ {
+ bitset_t intersec; /* Intersection sets, see below. */
+ bitset_t remains;
+ /* Flags, see below. */
+ bitset_word_t has_intersec, not_subset, not_consumed;
+
+ /* Optimization, skip if this state doesn't accept the character. */
+ if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
+ continue;
+
+ /* Enumerate the intersection set of this state and `accepts'. */
+ has_intersec = 0;
+ for (k = 0; k < BITSET_WORDS; ++k)
+ has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
+ /* And skip if the intersection set is empty. */
+ if (!has_intersec)
+ continue;
+
+ /* Then check if this state is a subset of `accepts'. */
+ not_subset = not_consumed = 0;
+ for (k = 0; k < BITSET_WORDS; ++k)
+ {
+ not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k];
+ not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
+ }
+
+ /* If this state isn't a subset of `accepts', create a
+ new group state, which has the `remains'. */
+ if (not_subset)
+ {
+ bitset_copy (dests_ch[ndests], remains);
+ bitset_copy (dests_ch[j], intersec);
+ err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]);
+ if (BE (err != REG_NOERROR, 0))
+ goto error_return;
+ ++ndests;
+ }
+
+ /* Put the position in the current group. */
+ ok = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]);
+ if (BE (! ok, 0))
+ goto error_return;
+
+ /* If all characters are consumed, go to next node. */
+ if (!not_consumed)
+ break;
+ }
+ /* Some characters remain, create a new group. */
+ if (j == ndests)
+ {
+ bitset_copy (dests_ch[ndests], accepts);
+ err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]);
+ if (BE (err != REG_NOERROR, 0))
+ goto error_return;
+ ++ndests;
+ bitset_empty (accepts);
+ }
+ }
+ return ndests;
+ error_return:
+ for (j = 0; j < ndests; ++j)
+ re_node_set_free (dests_node + j);
+ return REG_MISSING;
+}
+
+#ifdef RE_ENABLE_I18N
+/* Check how many bytes the node `dfa->nodes[node_idx]' accepts.
+ Return the number of the bytes the node accepts.
+ STR_IDX is the current index of the input string.
+
+ This function handles the nodes which can accept one character, or
+ one collating element like '.', '[a-z]', opposite to the other nodes
+ can only accept one byte. */
+
+static int
+internal_function
+check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
+ const re_string_t *input, Idx str_idx)
+{
+ const re_token_t *node = dfa->nodes + node_idx;
+ int char_len, elem_len;
+ Idx i;
+
+ if (BE (node->type == OP_UTF8_PERIOD, 0))
+ {
+ unsigned char c = re_string_byte_at (input, str_idx), d;
+ if (BE (c < 0xc2, 1))
+ return 0;
+
+ if (str_idx + 2 > input->len)
+ return 0;
+
+ d = re_string_byte_at (input, str_idx + 1);
+ if (c < 0xe0)
+ return (d < 0x80 || d > 0xbf) ? 0 : 2;
+ else if (c < 0xf0)
+ {
+ char_len = 3;
+ if (c == 0xe0 && d < 0xa0)
+ return 0;
+ }
+ else if (c < 0xf8)
+ {
+ char_len = 4;
+ if (c == 0xf0 && d < 0x90)
+ return 0;
+ }
+ else if (c < 0xfc)
+ {
+ char_len = 5;
+ if (c == 0xf8 && d < 0x88)
+ return 0;
+ }
+ else if (c < 0xfe)
+ {
+ char_len = 6;
+ if (c == 0xfc && d < 0x84)
+ return 0;
+ }
+ else
+ return 0;
+
+ if (str_idx + char_len > input->len)
+ return 0;
+
+ for (i = 1; i < char_len; ++i)
+ {
+ d = re_string_byte_at (input, str_idx + i);
+ if (d < 0x80 || d > 0xbf)
+ return 0;
+ }
+ return char_len;
+ }
+
+ char_len = re_string_char_size_at (input, str_idx);
+ if (node->type == OP_PERIOD)
+ {
+ if (char_len <= 1)
+ return 0;
+ /* FIXME: I don't think this if is needed, as both '\n'
+ and '\0' are char_len == 1. */
+ /* '.' accepts any one character except the following two cases. */
+ if ((!(dfa->syntax & RE_DOT_NEWLINE) &&
+ re_string_byte_at (input, str_idx) == '\n') ||
+ ((dfa->syntax & RE_DOT_NOT_NULL) &&
+ re_string_byte_at (input, str_idx) == '\0'))
+ return 0;
+ return char_len;
+ }
+
+ elem_len = re_string_elem_size_at (input, str_idx);
+ if ((elem_len <= 1 && char_len <= 1) || char_len == 0)
+ return 0;
+
+ if (node->type == COMPLEX_BRACKET)
+ {
+ const re_charset_t *cset = node->opr.mbcset;
+# ifdef _LIBC
+ const unsigned char *pin
+ = ((const unsigned char *) re_string_get_buffer (input) + str_idx);
+ Idx j;
+ uint32_t nrules;
+# endif /* _LIBC */
+ int match_len = 0;
+ wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars)
+ ? re_string_wchar_at (input, str_idx) : 0);
+
+ /* match with multibyte character? */
+ for (i = 0; i < cset->nmbchars; ++i)
+ if (wc == cset->mbchars[i])
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ /* match with character_class? */
+ for (i = 0; i < cset->nchar_classes; ++i)
+ {
+ wctype_t wt = cset->char_classes[i];
+ if (__iswctype (wc, wt))
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+
+# ifdef _LIBC
+ nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules != 0)
+ {
+ unsigned int in_collseq = 0;
+ const int32_t *table, *indirect;
+ const unsigned char *weights, *extra;
+ const char *collseqwc;
+ int32_t idx;
+ /* This #include defines a local function! */
+# include <locale/weight.h>
+
+ /* match with collating_symbol? */
+ if (cset->ncoll_syms)
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+ for (i = 0; i < cset->ncoll_syms; ++i)
+ {
+ const unsigned char *coll_sym = extra + cset->coll_syms[i];
+ /* Compare the length of input collating element and
+ the length of current collating element. */
+ if (*coll_sym != elem_len)
+ continue;
+ /* Compare each bytes. */
+ for (j = 0; j < *coll_sym; j++)
+ if (pin[j] != coll_sym[1 + j])
+ break;
+ if (j == *coll_sym)
+ {
+ /* Match if every bytes is equal. */
+ match_len = j;
+ goto check_node_accept_bytes_match;
+ }
+ }
+
+ if (cset->nranges)
+ {
+ if (elem_len <= char_len)
+ {
+ collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+ in_collseq = __collseq_table_lookup (collseqwc, wc);
+ }
+ else
+ in_collseq = find_collation_sequence_value (pin, elem_len);
+ }
+ /* match with range expression? */
+ for (i = 0; i < cset->nranges; ++i)
+ if (cset->range_starts[i] <= in_collseq
+ && in_collseq <= cset->range_ends[i])
+ {
+ match_len = elem_len;
+ goto check_node_accept_bytes_match;
+ }
+
+ /* match with equivalence_class? */
+ if (cset->nequiv_classes)
+ {
+ const unsigned char *cp = pin;
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+ int32_t idx = findidx (&cp);
+ if (idx > 0)
+ for (i = 0; i < cset->nequiv_classes; ++i)
+ {
+ int32_t equiv_class_idx = cset->equiv_classes[i];
+ size_t weight_len = weights[idx & 0xffffff];
+ if (weight_len == weights[equiv_class_idx & 0xffffff]
+ && (idx >> 24) == (equiv_class_idx >> 24))
+ {
+ Idx cnt = 0;
+
+ idx &= 0xffffff;
+ equiv_class_idx &= 0xffffff;
+
+ while (cnt <= weight_len
+ && (weights[equiv_class_idx + 1 + cnt]
+ == weights[idx + 1 + cnt]))
+ ++cnt;
+ if (cnt > weight_len)
+ {
+ match_len = elem_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+ }
+ }
+ }
+ else
+# endif /* _LIBC */
+ {
+ /* match with range expression? */
+#if __GNUC__ >= 2 && ! (__STDC_VERSION__ < 199901L && __STRICT_ANSI__)
+ wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'};
+#else
+ wchar_t cmp_buf[] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
+ cmp_buf[2] = wc;
+#endif
+ for (i = 0; i < cset->nranges; ++i)
+ {
+ cmp_buf[0] = cset->range_starts[i];
+ cmp_buf[4] = cset->range_ends[i];
+ if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
+ && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+ }
+ check_node_accept_bytes_match:
+ if (!cset->non_match)
+ return match_len;
+ else
+ {
+ if (match_len > 0)
+ return 0;
+ else
+ return (elem_len > char_len) ? elem_len : char_len;
+ }
+ }
+ return 0;
+}
+
+# ifdef _LIBC
+static unsigned int
+internal_function
+find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len)
+{
+ uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules == 0)
+ {
+ if (mbs_len == 1)
+ {
+ /* No valid character. Match it as a single byte character. */
+ const unsigned char *collseq = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+ return collseq[mbs[0]];
+ }
+ return UINT_MAX;
+ }
+ else
+ {
+ int32_t idx;
+ const unsigned char *extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+ int32_t extrasize = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB + 1) - extra;
+
+ for (idx = 0; idx < extrasize;)
+ {
+ int mbs_cnt;
+ bool found = false;
+ int32_t elem_mbs_len;
+ /* Skip the name of collating element name. */
+ idx = idx + extra[idx] + 1;
+ elem_mbs_len = extra[idx++];
+ if (mbs_len == elem_mbs_len)
+ {
+ for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt)
+ if (extra[idx + mbs_cnt] != mbs[mbs_cnt])
+ break;
+ if (mbs_cnt == elem_mbs_len)
+ /* Found the entry. */
+ found = true;
+ }
+ /* Skip the byte sequence of the collating element. */
+ idx += elem_mbs_len;
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+ /* Skip the collation sequence value. */
+ idx += sizeof (uint32_t);
+ /* Skip the wide char sequence of the collating element. */
+ idx = idx + sizeof (uint32_t) * (extra[idx] + 1);
+ /* If we found the entry, return the sequence value. */
+ if (found)
+ return *(uint32_t *) (extra + idx);
+ /* Skip the collation sequence value. */
+ idx += sizeof (uint32_t);
+ }
+ return UINT_MAX;
+ }
+}
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+
+/* Check whether the node accepts the byte which is IDX-th
+ byte of the INPUT. */
+
+static bool
+internal_function
+check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
+ Idx idx)
+{
+ unsigned char ch;
+ ch = re_string_byte_at (&mctx->input, idx);
+ switch (node->type)
+ {
+ case CHARACTER:
+ if (node->opr.c != ch)
+ return false;
+ break;
+
+ case SIMPLE_BRACKET:
+ if (!bitset_contain (node->opr.sbcset, ch))
+ return false;
+ break;
+
+#ifdef RE_ENABLE_I18N
+ case OP_UTF8_PERIOD:
+ if (ch >= ASCII_CHARS)
+ return false;
+ /* FALLTHROUGH */
+#endif
+ case OP_PERIOD:
+ if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE))
+ || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL)))
+ return false;
+ break;
+
+ default:
+ return false;
+ }
+
+ if (node->constraint)
+ {
+ /* The node has constraints. Check whether the current context
+ satisfies the constraints. */
+ unsigned int context = re_string_context_at (&mctx->input, idx,
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+ return false;
+ }
+
+ return true;
+}
+
+/* Extend the buffers, if the buffers have run out. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+extend_buffers (re_match_context_t *mctx)
+{
+ reg_errcode_t ret;
+ re_string_t *pstr = &mctx->input;
+
+ /* Avoid overflow. */
+ if (BE (SIZE_MAX / 2 / sizeof (re_dfastate_t *) <= pstr->bufs_len, 0))
+ return REG_ESPACE;
+
+ /* Double the lengthes of the buffers. */
+ ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+
+ if (mctx->state_log != NULL)
+ {
+ /* And double the length of state_log. */
+ /* XXX We have no indication of the size of this buffer. If this
+ allocation fail we have no indication that the state_log array
+ does not have the right size. */
+ re_dfastate_t **new_array = re_realloc (mctx->state_log, re_dfastate_t *,
+ pstr->bufs_len + 1);
+ if (BE (new_array == NULL, 0))
+ return REG_ESPACE;
+ mctx->state_log = new_array;
+ }
+
+ /* Then reconstruct the buffers. */
+ if (pstr->icase)
+ {
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ ret = build_wcs_upper_buffer (pstr);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ build_upper_buffer (pstr);
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ build_wcs_buffer (pstr);
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ if (pstr->trans != NULL)
+ re_string_translate_buffer (pstr);
+ }
+ }
+ return REG_NOERROR;
+}
+
+
+/* Functions for matching context. */
+
+/* Initialize MCTX. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+match_ctx_init (re_match_context_t *mctx, int eflags, Idx n)
+{
+ mctx->eflags = eflags;
+ mctx->match_last = REG_MISSING;
+ if (n > 0)
+ {
+ /* Avoid overflow. */
+ size_t max_object_size =
+ MAX (sizeof (struct re_backref_cache_entry),
+ sizeof (re_sub_match_top_t *));
+ if (BE (SIZE_MAX / max_object_size < n, 0))
+ return REG_ESPACE;
+
+ mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
+ mctx->sub_tops = re_malloc (re_sub_match_top_t *, n);
+ if (BE (mctx->bkref_ents == NULL || mctx->sub_tops == NULL, 0))
+ return REG_ESPACE;
+ }
+ /* Already zero-ed by the caller.
+ else
+ mctx->bkref_ents = NULL;
+ mctx->nbkref_ents = 0;
+ mctx->nsub_tops = 0; */
+ mctx->abkref_ents = n;
+ mctx->max_mb_elem_len = 1;
+ mctx->asub_tops = n;
+ return REG_NOERROR;
+}
+
+/* Clean the entries which depend on the current input in MCTX.
+ This function must be invoked when the matcher changes the start index
+ of the input, or changes the input string. */
+
+static void
+internal_function
+match_ctx_clean (re_match_context_t *mctx)
+{
+ Idx st_idx;
+ for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx)
+ {
+ Idx sl_idx;
+ re_sub_match_top_t *top = mctx->sub_tops[st_idx];
+ for (sl_idx = 0; sl_idx < top->nlasts; ++sl_idx)
+ {
+ re_sub_match_last_t *last = top->lasts[sl_idx];
+ re_free (last->path.array);
+ re_free (last);
+ }
+ re_free (top->lasts);
+ if (top->path)
+ {
+ re_free (top->path->array);
+ re_free (top->path);
+ }
+ free (top);
+ }
+
+ mctx->nsub_tops = 0;
+ mctx->nbkref_ents = 0;
+}
+
+/* Free all the memory associated with MCTX. */
+
+static void
+internal_function
+match_ctx_free (re_match_context_t *mctx)
+{
+ /* First, free all the memory associated with MCTX->SUB_TOPS. */
+ match_ctx_clean (mctx);
+ re_free (mctx->sub_tops);
+ re_free (mctx->bkref_ents);
+}
+
+/* Add a new backreference entry to MCTX.
+ Note that we assume that caller never call this function with duplicate
+ entry, and call with STR_IDX which isn't smaller than any existing entry.
+*/
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from,
+ Idx to)
+{
+ if (mctx->nbkref_ents >= mctx->abkref_ents)
+ {
+ struct re_backref_cache_entry* new_entry;
+ new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry,
+ mctx->abkref_ents * 2);
+ if (BE (new_entry == NULL, 0))
+ {
+ re_free (mctx->bkref_ents);
+ return REG_ESPACE;
+ }
+ mctx->bkref_ents = new_entry;
+ memset (mctx->bkref_ents + mctx->nbkref_ents, '\0',
+ sizeof (struct re_backref_cache_entry) * mctx->abkref_ents);
+ mctx->abkref_ents *= 2;
+ }
+ if (mctx->nbkref_ents > 0
+ && mctx->bkref_ents[mctx->nbkref_ents - 1].str_idx == str_idx)
+ mctx->bkref_ents[mctx->nbkref_ents - 1].more = 1;
+
+ mctx->bkref_ents[mctx->nbkref_ents].node = node;
+ mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx;
+ mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from;
+ mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to;
+
+ /* This is a cache that saves negative results of check_dst_limits_calc_pos.
+ If bit N is clear, means that this entry won't epsilon-transition to
+ an OP_OPEN_SUBEXP or OP_CLOSE_SUBEXP for the N+1-th subexpression. If
+ it is set, check_dst_limits_calc_pos_1 will recurse and try to find one
+ such node.
+
+ A backreference does not epsilon-transition unless it is empty, so set
+ to all zeros if FROM != TO. */
+ mctx->bkref_ents[mctx->nbkref_ents].eps_reachable_subexps_map
+ = (from == to ? -1 : 0);
+
+ mctx->bkref_ents[mctx->nbkref_ents++].more = 0;
+ if (mctx->max_mb_elem_len < to - from)
+ mctx->max_mb_elem_len = to - from;
+ return REG_NOERROR;
+}
+
+/* Return the first entry with the same str_idx, or REG_MISSING if none is
+ found. Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX. */
+
+static Idx
+internal_function
+search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)
+{
+ Idx left, right, mid, last;
+ last = right = mctx->nbkref_ents;
+ for (left = 0; left < right;)
+ {
+ mid = (left + right) / 2;
+ if (mctx->bkref_ents[mid].str_idx < str_idx)
+ left = mid + 1;
+ else
+ right = mid;
+ }
+ if (left < last && mctx->bkref_ents[left].str_idx == str_idx)
+ return left;
+ else
+ return REG_MISSING;
+}
+
+/* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches
+ at STR_IDX. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx)
+{
+#ifdef DEBUG
+ assert (mctx->sub_tops != NULL);
+ assert (mctx->asub_tops > 0);
+#endif
+ if (BE (mctx->nsub_tops == mctx->asub_tops, 0))
+ {
+ Idx new_asub_tops = mctx->asub_tops * 2;
+ re_sub_match_top_t **new_array = re_realloc (mctx->sub_tops,
+ re_sub_match_top_t *,
+ new_asub_tops);
+ if (BE (new_array == NULL, 0))
+ return REG_ESPACE;
+ mctx->sub_tops = new_array;
+ mctx->asub_tops = new_asub_tops;
+ }
+ mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t));
+ if (BE (mctx->sub_tops[mctx->nsub_tops] == NULL, 0))
+ return REG_ESPACE;
+ mctx->sub_tops[mctx->nsub_tops]->node = node;
+ mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx;
+ return REG_NOERROR;
+}
+
+/* Register the node NODE, whose type is OP_CLOSE_SUBEXP, and which matches
+ at STR_IDX, whose corresponding OP_OPEN_SUBEXP is SUB_TOP. */
+
+static re_sub_match_last_t *
+internal_function
+match_ctx_add_sublast (re_sub_match_top_t *subtop, Idx node, Idx str_idx)
+{
+ re_sub_match_last_t *new_entry;
+ if (BE (subtop->nlasts == subtop->alasts, 0))
+ {
+ Idx new_alasts = 2 * subtop->alasts + 1;
+ re_sub_match_last_t **new_array = re_realloc (subtop->lasts,
+ re_sub_match_last_t *,
+ new_alasts);
+ if (BE (new_array == NULL, 0))
+ return NULL;
+ subtop->lasts = new_array;
+ subtop->alasts = new_alasts;
+ }
+ new_entry = calloc (1, sizeof (re_sub_match_last_t));
+ if (BE (new_entry != NULL, 1))
+ {
+ subtop->lasts[subtop->nlasts] = new_entry;
+ new_entry->node = node;
+ new_entry->str_idx = str_idx;
+ ++subtop->nlasts;
+ }
+ return new_entry;
+}
+
+static void
+internal_function
+sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+ re_dfastate_t **limited_sts, Idx last_node, Idx last_str_idx)
+{
+ sctx->sifted_states = sifted_sts;
+ sctx->limited_states = limited_sts;
+ sctx->last_node = last_node;
+ sctx->last_str_idx = last_str_idx;
+ re_node_set_init_empty (&sctx->limits);
+}
diff --git a/gnulib/lib/relocatable.c b/gnulib/lib/relocatable.c
new file mode 100644
index 00000000..172e91c9
--- /dev/null
+++ b/gnulib/lib/relocatable.c
@@ -0,0 +1,493 @@
+/* Provide relocatable packages.
+ Copyright (C) 2003-2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+
+/* Tell glibc's <stdio.h> to provide a prototype for getline().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "relocatable.h"
+
+#if ENABLE_RELOCATABLE
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef NO_XMALLOC
+# define xmalloc malloc
+#else
+# include "xalloc.h"
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#if DEPENDS_ON_LIBCHARSET
+# include <libcharset.h>
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV
+# include <iconv.h>
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS
+# include <libintl.h>
+#endif
+
+/* Faked cheap 'bool'. */
+#undef bool
+#undef false
+#undef true
+#define bool int
+#define false 0
+#define true 1
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILE_SYSTEM_PREFIX_LEN(P) 0
+#endif
+
+/* Original installation prefix. */
+static char *orig_prefix;
+static size_t orig_prefix_len;
+/* Current installation prefix. */
+static char *curr_prefix;
+static size_t curr_prefix_len;
+/* These prefixes do not end in a slash. Anything that will be concatenated
+ to them must start with a slash. */
+
+/* Sets the original and the current installation prefix of this module.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+static void
+set_this_relocation_prefix (const char *orig_prefix_arg,
+ const char *curr_prefix_arg)
+{
+ if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
+ /* Optimization: if orig_prefix and curr_prefix are equal, the
+ relocation is a nop. */
+ && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
+ {
+ /* Duplicate the argument strings. */
+ char *memory;
+
+ orig_prefix_len = strlen (orig_prefix_arg);
+ curr_prefix_len = strlen (curr_prefix_arg);
+ memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+ if (memory != NULL)
+#endif
+ {
+ memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+ orig_prefix = memory;
+ memory += orig_prefix_len + 1;
+ memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+ curr_prefix = memory;
+ return;
+ }
+ }
+ orig_prefix = NULL;
+ curr_prefix = NULL;
+ /* Don't worry about wasted memory here - this function is usually only
+ called once. */
+}
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+void
+set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg)
+{
+ set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+
+ /* Now notify all dependent libraries. */
+#if DEPENDS_ON_LIBCHARSET
+ libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109
+ libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix
+ libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+}
+
+#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR)
+
+/* Convenience function:
+ Computes the current installation prefix, based on the original
+ installation prefix, the original installation directory of a particular
+ file, and the current pathname of this file.
+ Returns it, freshly allocated. Returns NULL upon failure. */
+#ifdef IN_LIBRARY
+#define compute_curr_prefix local_compute_curr_prefix
+static
+#endif
+char *
+compute_curr_prefix (const char *orig_installprefix,
+ const char *orig_installdir,
+ const char *curr_pathname)
+{
+ char *curr_installdir;
+ const char *rel_installdir;
+
+ if (curr_pathname == NULL)
+ return NULL;
+
+ /* Determine the relative installation directory, relative to the prefix.
+ This is simply the difference between orig_installprefix and
+ orig_installdir. */
+ if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix))
+ != 0)
+ /* Shouldn't happen - nothing should be installed outside $(prefix). */
+ return NULL;
+ rel_installdir = orig_installdir + strlen (orig_installprefix);
+
+ /* Determine the current installation directory. */
+ {
+ const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname);
+ const char *p = curr_pathname + strlen (curr_pathname);
+ char *q;
+
+ while (p > p_base)
+ {
+ p--;
+ if (ISSLASH (*p))
+ break;
+ }
+
+ q = (char *) xmalloc (p - curr_pathname + 1);
+#ifdef NO_XMALLOC
+ if (q == NULL)
+ return NULL;
+#endif
+ memcpy (q, curr_pathname, p - curr_pathname);
+ q[p - curr_pathname] = '\0';
+ curr_installdir = q;
+ }
+
+ /* Compute the current installation prefix by removing the trailing
+ rel_installdir from it. */
+ {
+ const char *rp = rel_installdir + strlen (rel_installdir);
+ const char *cp = curr_installdir + strlen (curr_installdir);
+ const char *cp_base =
+ curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir);
+
+ while (rp > rel_installdir && cp > cp_base)
+ {
+ bool same = false;
+ const char *rpi = rp;
+ const char *cpi = cp;
+
+ while (rpi > rel_installdir && cpi > cp_base)
+ {
+ rpi--;
+ cpi--;
+ if (ISSLASH (*rpi) || ISSLASH (*cpi))
+ {
+ if (ISSLASH (*rpi) && ISSLASH (*cpi))
+ same = true;
+ break;
+ }
+ /* Do case-insensitive comparison if the file system is always or
+ often case-insensitive. It's better to accept the comparison
+ if the difference is only in case, rather than to fail. */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS - case insignificant file system */
+ if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+ != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+ break;
+#else
+ if (*rpi != *cpi)
+ break;
+#endif
+ }
+ if (!same)
+ break;
+ /* The last pathname component was the same. opi and cpi now point
+ to the slash before it. */
+ rp = rpi;
+ cp = cpi;
+ }
+
+ if (rp > rel_installdir)
+ {
+ /* Unexpected: The curr_installdir does not end with rel_installdir. */
+ free (curr_installdir);
+ return NULL;
+ }
+
+ {
+ size_t curr_prefix_len = cp - curr_installdir;
+ char *curr_prefix;
+
+ curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+ if (curr_prefix == NULL)
+ {
+ free (curr_installdir);
+ return NULL;
+ }
+#endif
+ memcpy (curr_prefix, curr_installdir, curr_prefix_len);
+ curr_prefix[curr_prefix_len] = '\0';
+
+ free (curr_installdir);
+
+ return curr_prefix;
+ }
+ }
+}
+
+#endif /* !IN_LIBRARY || PIC */
+
+#if defined PIC && defined INSTALLDIR
+
+/* Full pathname of shared library, or NULL. */
+static char *shared_library_fullname;
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+
+/* Determine the full pathname of the shared library when it is loaded. */
+
+BOOL WINAPI
+DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
+{
+ (void) reserved;
+
+ if (event == DLL_PROCESS_ATTACH)
+ {
+ /* The DLL is being loaded into an application's address range. */
+ static char location[MAX_PATH];
+
+ if (!GetModuleFileName (module_handle, location, sizeof (location)))
+ /* Shouldn't happen. */
+ return FALSE;
+
+ if (!IS_PATH_WITH_DIR (location))
+ /* Shouldn't happen. */
+ return FALSE;
+
+ {
+#if defined __CYGWIN__
+ /* On Cygwin, we need to convert paths coming from Win32 system calls
+ to the Unix-like slashified notation. */
+ static char location_as_posix_path[2 * MAX_PATH];
+ /* There's no error return defined for cygwin_conv_to_posix_path.
+ See cygwin-api/func-cygwin-conv-to-posix-path.html.
+ Does it overflow the buffer of expected size MAX_PATH or does it
+ truncate the path? I don't know. Let's catch both. */
+ cygwin_conv_to_posix_path (location, location_as_posix_path);
+ location_as_posix_path[MAX_PATH - 1] = '\0';
+ if (strlen (location_as_posix_path) >= MAX_PATH - 1)
+ /* A sign of buffer overflow or path truncation. */
+ return FALSE;
+ shared_library_fullname = strdup (location_as_posix_path);
+#else
+ shared_library_fullname = strdup (location);
+#endif
+ }
+ }
+
+ return TRUE;
+}
+
+#else /* Unix except Cygwin */
+
+static void
+find_shared_library_fullname ()
+{
+#if defined __linux__ && __GLIBC__ >= 2
+ /* Linux has /proc/self/maps. glibc 2 has the getline() function. */
+ FILE *fp;
+
+ /* Open the current process' maps file. It describes one VMA per line. */
+ fp = fopen ("/proc/self/maps", "r");
+ if (fp)
+ {
+ unsigned long address = (unsigned long) &find_shared_library_fullname;
+ for (;;)
+ {
+ unsigned long start, end;
+ int c;
+
+ if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+ break;
+ if (address >= start && address <= end - 1)
+ {
+ /* Found it. Now see if this line contains a filename. */
+ while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+ continue;
+ if (c == '/')
+ {
+ size_t size;
+ int len;
+
+ ungetc (c, fp);
+ shared_library_fullname = NULL; size = 0;
+ len = getline (&shared_library_fullname, &size, fp);
+ if (len >= 0)
+ {
+ /* Success: filled shared_library_fullname. */
+ if (len > 0 && shared_library_fullname[len - 1] == '\n')
+ shared_library_fullname[len - 1] = '\0';
+ }
+ }
+ break;
+ }
+ while (c = getc (fp), c != EOF && c != '\n')
+ continue;
+ }
+ fclose (fp);
+ }
+#endif
+}
+
+#endif /* (WIN32 or Cygwin) / (Unix except Cygwin) */
+
+/* Return the full pathname of the current shared library.
+ Return NULL if unknown.
+ Guaranteed to work only on Linux, Cygwin and Woe32. */
+static char *
+get_shared_library_fullname ()
+{
+#if !(defined _WIN32 || defined __WIN32__ || defined __CYGWIN__)
+ static bool tried_find_shared_library_fullname;
+ if (!tried_find_shared_library_fullname)
+ {
+ find_shared_library_fullname ();
+ tried_find_shared_library_fullname = true;
+ }
+#endif
+ return shared_library_fullname;
+}
+
+#endif /* PIC */
+
+/* Returns the pathname, relocated according to the current installation
+ directory.
+ The returned string is either PATHNAME unmodified or a freshly allocated
+ string that you can free with free() after casting it to 'char *'. */
+const char *
+relocate (const char *pathname)
+{
+#if defined PIC && defined INSTALLDIR
+ static int initialized;
+
+ /* Initialization code for a shared library. */
+ if (!initialized)
+ {
+ /* At this point, orig_prefix and curr_prefix likely have already been
+ set through the main program's set_program_name_and_installdir
+ function. This is sufficient in the case that the library has
+ initially been installed in the same orig_prefix. But we can do
+ better, to also cover the cases that 1. it has been installed
+ in a different prefix before being moved to orig_prefix and (later)
+ to curr_prefix, 2. unlike the program, it has not moved away from
+ orig_prefix. */
+ const char *orig_installprefix = INSTALLPREFIX;
+ const char *orig_installdir = INSTALLDIR;
+ char *curr_prefix_better;
+
+ curr_prefix_better =
+ compute_curr_prefix (orig_installprefix, orig_installdir,
+ get_shared_library_fullname ());
+
+ set_relocation_prefix (orig_installprefix,
+ curr_prefix_better != NULL
+ ? curr_prefix_better
+ : curr_prefix);
+
+ if (curr_prefix_better != NULL)
+ free (curr_prefix_better);
+
+ initialized = 1;
+ }
+#endif
+
+ /* Note: It is not necessary to perform case insensitive comparison here,
+ even for DOS-like file systems, because the pathname argument was
+ typically created from the same Makefile variable as orig_prefix came
+ from. */
+ if (orig_prefix != NULL && curr_prefix != NULL
+ && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
+ {
+ if (pathname[orig_prefix_len] == '\0')
+ {
+ /* pathname equals orig_prefix. */
+ char *result = (char *) xmalloc (strlen (curr_prefix) + 1);
+
+#ifdef NO_XMALLOC
+ if (result != NULL)
+#endif
+ {
+ strcpy (result, curr_prefix);
+ return result;
+ }
+ }
+ else if (ISSLASH (pathname[orig_prefix_len]))
+ {
+ /* pathname starts with orig_prefix. */
+ const char *pathname_tail = &pathname[orig_prefix_len];
+ char *result =
+ (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+
+#ifdef NO_XMALLOC
+ if (result != NULL)
+#endif
+ {
+ memcpy (result, curr_prefix, curr_prefix_len);
+ strcpy (result + curr_prefix_len, pathname_tail);
+ return result;
+ }
+ }
+ }
+ /* Nothing to relocate. */
+ return pathname;
+}
+
+#endif
diff --git a/gnulib/lib/relocatable.h b/gnulib/lib/relocatable.h
new file mode 100644
index 00000000..6328fa83
--- /dev/null
+++ b/gnulib/lib/relocatable.h
@@ -0,0 +1,83 @@
+/* Provide relocatable packages.
+ Copyright (C) 2003, 2005, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+#ifndef _RELOCATABLE_H
+#define _RELOCATABLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* This can be enabled through the configure --enable-relocatable option. */
+#if ENABLE_RELOCATABLE
+
+/* When building a DLL, we must export some functions. Note that because
+ this is a private .h file, we don't need to use __declspec(dllimport)
+ in any case. */
+#if HAVE_VISIBILITY && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default")))
+#elif defined _MSC_VER && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport)
+#else
+# define RELOCATABLE_DLL_EXPORTED
+#endif
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+extern RELOCATABLE_DLL_EXPORTED void
+ set_relocation_prefix (const char *orig_prefix,
+ const char *curr_prefix);
+
+/* Returns the pathname, relocated according to the current installation
+ directory.
+ The returned string is either PATHNAME unmodified or a freshly allocated
+ string that you can free with free() after casting it to 'char *'. */
+extern const char * relocate (const char *pathname);
+
+/* Memory management: relocate() potentially allocates memory, because it has
+ to construct a fresh pathname. If this is a problem because your program
+ calls relocate() frequently, think about caching the result. Or free the
+ return value if it was different from the argument pathname. */
+
+/* Convenience function:
+ Computes the current installation prefix, based on the original
+ installation prefix, the original installation directory of a particular
+ file, and the current pathname of this file.
+ Returns it, freshly allocated. Returns NULL upon failure. */
+extern char * compute_curr_prefix (const char *orig_installprefix,
+ const char *orig_installdir,
+ const char *curr_pathname);
+
+#else
+
+/* By default, we use the hardwired pathnames. */
+#define relocate(pathname) (pathname)
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RELOCATABLE_H */
diff --git a/gnulib/lib/relocwrapper.c b/gnulib/lib/relocwrapper.c
new file mode 100644
index 00000000..19dfaa38
--- /dev/null
+++ b/gnulib/lib/relocwrapper.c
@@ -0,0 +1,192 @@
+/* Relocating wrapper program.
+ Copyright (C) 2003, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+/* Dependencies:
+ relocwrapper
+ -> progname
+ -> progreloc
+ -> areadlink
+ -> readlink
+ -> canonicalize-lgpl
+ -> malloca
+ -> readlink
+ -> relocatable
+ -> setenv
+ -> malloca
+ -> strerror
+ -> c-ctype
+
+ Macros that need to be set while compiling this file:
+ - ENABLE_RELOCATABLE 1
+ - INSTALLPREFIX the base installation directory
+ - INSTALLDIR the directory into which this program is installed
+ - LIBPATHVAR the platform dependent runtime library path variable
+ - LIBDIRS a comma-terminated list of strings representing the list of
+ directories that contain the libraries at installation time
+
+ We don't want to internationalize this wrapper because then it would
+ depend on libintl and therefore need relocation itself. So use only
+ libc functions, no gettext(), no error(), no xmalloc(), no xsetenv().
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "progname.h"
+#include "relocatable.h"
+#include "c-ctype.h"
+
+/* Return a copy of the filename, with an extra ".bin" at the end.
+ More generally, it replaces "${EXEEXT}" at the end with ".bin${EXEEXT}". */
+static char *
+add_dotbin (const char *filename)
+{
+ size_t filename_len = strlen (filename);
+ char *result = (char *) malloc (filename_len + 4 + 1);
+
+ if (result != NULL)
+ {
+ if (sizeof (EXEEXT) > sizeof (""))
+ {
+ /* EXEEXT handling. */
+ const size_t exeext_len = sizeof (EXEEXT) - sizeof ("");
+ static const char exeext[] = EXEEXT;
+ if (filename_len > exeext_len)
+ {
+ /* Compare using an inlined copy of c_strncasecmp(), because
+ the filenames may have undergone a case conversion since
+ they were packaged. In other words, EXEEXT may be ".exe"
+ on one system and ".EXE" on another. */
+ const char *s1 = filename + filename_len - exeext_len;
+ const char *s2 = exeext;
+ for (; *s1 != '\0'; s1++, s2++)
+ {
+ unsigned char c1 = *s1;
+ unsigned char c2 = *s2;
+ if (c_tolower (c1) != c_tolower (c2))
+ goto simple_append;
+ }
+ /* Insert ".bin" before EXEEXT or its equivalent. */
+ memcpy (result, filename, filename_len - exeext_len);
+ memcpy (result + filename_len - exeext_len, ".bin", 4);
+ memcpy (result + filename_len - exeext_len + 4,
+ filename + filename_len - exeext_len,
+ exeext_len + 1);
+ return result;
+ }
+ }
+ simple_append:
+ /* Simply append ".bin". */
+ memcpy (result, filename, filename_len);
+ memcpy (result + filename_len, ".bin", 4 + 1);
+ return result;
+ }
+ else
+ {
+ fprintf (stderr, "%s: %s\n", program_name, "memory exhausted");
+ exit (1);
+ }
+}
+
+/* List of directories that contain the libraries. */
+static const char *libdirs[] = { LIBDIRS NULL };
+/* Verify that at least one directory is given. */
+typedef int verify1[2 * (sizeof (libdirs) / sizeof (libdirs[0]) > 1) - 1];
+
+/* Relocate the list of directories that contain the libraries. */
+static void
+relocate_libdirs ()
+{
+ size_t i;
+
+ for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++)
+ libdirs[i] = relocate (libdirs[i]);
+}
+
+/* Activate the list of directories in the LIBPATHVAR. */
+static void
+activate_libdirs ()
+{
+ const char *old_value;
+ size_t total;
+ size_t i;
+ char *value;
+ char *p;
+
+ old_value = getenv (LIBPATHVAR);
+ if (old_value == NULL)
+ old_value = "";
+
+ total = 0;
+ for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++)
+ total += strlen (libdirs[i]) + 1;
+ total += strlen (old_value) + 1;
+
+ value = (char *) malloc (total);
+ if (value == NULL)
+ {
+ fprintf (stderr, "%s: %s\n", program_name, "memory exhausted");
+ exit (1);
+ }
+ p = value;
+ for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++)
+ {
+ size_t len = strlen (libdirs[i]);
+ memcpy (p, libdirs[i], len);
+ p += len;
+ *p++ = ':';
+ }
+ if (old_value[0] != '\0')
+ strcpy (p, old_value);
+ else
+ p[-1] = '\0';
+
+ if (setenv (LIBPATHVAR, value, 1) < 0)
+ {
+ fprintf (stderr, "%s: %s\n", program_name, "memory exhausted");
+ exit (1);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ char *full_program_name;
+
+ /* Set the program name and perform preparations for
+ get_full_program_name() and relocate(). */
+ set_program_name_and_installdir (argv[0], INSTALLPREFIX, INSTALLDIR);
+
+ /* Get the full program path. (Important if accessed through a symlink.) */
+ full_program_name = get_full_program_name ();
+ if (full_program_name == NULL)
+ full_program_name = argv[0];
+
+ /* Invoke the real program, with suffix ".bin". */
+ argv[0] = add_dotbin (full_program_name);
+ relocate_libdirs ();
+ activate_libdirs ();
+ execv (argv[0], argv);
+ fprintf (stderr, "%s: could not execute %s: %s\n",
+ program_name, argv[0], strerror (errno));
+ exit (127);
+}
diff --git a/gnulib/lib/remove.c b/gnulib/lib/remove.c
new file mode 100644
index 00000000..62e92da9
--- /dev/null
+++ b/gnulib/lib/remove.c
@@ -0,0 +1,43 @@
+/* Remove a file or directory.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#undef remove
+
+/* Remove NAME from the file system. This works around C89 platforms
+ that don't handle directories like POSIX requires; it also works
+ around Solaris 9 bugs with trailing slash. */
+int
+rpl_remove (char const *name)
+{
+ /* It is faster to just try rmdir, and fall back on unlink, than it
+ is to use lstat to see what we are about to remove. Technically,
+ it is more likely that we want unlink, not rmdir, but we cannot
+ guarantee the safety of unlink on directories. Trailing slash
+ bugs are handled by our rmdir and unlink wrappers. */
+ int result = rmdir (name);
+ if (result && errno == ENOTDIR)
+ result = unlink (name);
+ return result;
+}
diff --git a/gnulib/lib/rename.c b/gnulib/lib/rename.c
new file mode 100644
index 00000000..ca3a6696
--- /dev/null
+++ b/gnulib/lib/rename.c
@@ -0,0 +1,473 @@
+/* Work around rename bugs in some systems.
+
+ Copyright (C) 2001-2003, 2005-2006, 2009-2010 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/>. */
+
+/* Written by Volker Borchert, Eric Blake. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#undef rename
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* The mingw rename has problems with trailing slashes; it also
+ requires use of native Windows calls to allow atomic renames over
+ existing files. */
+
+# include <errno.h>
+# include <stdbool.h>
+# include <stdlib.h>
+# include <sys/stat.h>
+# include <unistd.h>
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include "dirname.h"
+
+/* Rename the file SRC to DST. This replacement is necessary on
+ Windows, on which the system rename function will not replace
+ an existing DST. */
+int
+rpl_rename (char const *src, char const *dst)
+{
+ int error;
+ size_t src_len = strlen (src);
+ size_t dst_len = strlen (dst);
+ char *src_base = last_component (src);
+ char *dst_base = last_component (dst);
+ bool src_slash;
+ bool dst_slash;
+ bool dst_exists;
+ struct stat src_st;
+ struct stat dst_st;
+
+ /* Filter out dot as last component. */
+ if (!src_len || !dst_len)
+ {
+ errno = ENOENT;
+ return -1;
+ }
+ if (*src_base == '.')
+ {
+ size_t len = base_len (src_base);
+ if (len == 1 || (len == 2 && src_base[1] == '.'))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+ if (*dst_base == '.')
+ {
+ size_t len = base_len (dst_base);
+ if (len == 1 || (len == 2 && dst_base[1] == '.'))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+
+ /* Presence of a trailing slash requires directory semantics. If
+ the source does not exist, or if the destination cannot be turned
+ into a directory, give up now. Otherwise, strip trailing slashes
+ before calling rename. There are no symlinks on mingw, so stat
+ works instead of lstat. */
+ src_slash = ISSLASH (src[src_len - 1]);
+ dst_slash = ISSLASH (dst[dst_len - 1]);
+ if (stat (src, &src_st))
+ return -1;
+ if (stat (dst, &dst_st))
+ {
+ if (errno != ENOENT || (!S_ISDIR (src_st.st_mode) && dst_slash))
+ return -1;
+ dst_exists = false;
+ }
+ else
+ {
+ if (S_ISDIR (dst_st.st_mode) != S_ISDIR (src_st.st_mode))
+ {
+ errno = S_ISDIR (dst_st.st_mode) ? EISDIR : ENOTDIR;
+ return -1;
+ }
+ dst_exists = true;
+ }
+
+ /* There are no symlinks, so if a file existed with a trailing
+ slash, it must be a directory, and we don't have to worry about
+ stripping strip trailing slash. However, mingw refuses to
+ replace an existing empty directory, so we have to help it out.
+ And canonicalize_file_name is not yet ported to mingw; however,
+ for directories, getcwd works as a viable alternative. Ensure
+ that we can get back to where we started before using it; later
+ attempts to return are fatal. Note that we can end up losing a
+ directory if rename then fails, but it was empty, so not much
+ damage was done. */
+ if (dst_exists && S_ISDIR (dst_st.st_mode))
+ {
+ char *cwd = getcwd (NULL, 0);
+ char *src_temp;
+ char *dst_temp;
+ if (!cwd || chdir (cwd))
+ return -1;
+ if (IS_ABSOLUTE_FILE_NAME (src))
+ {
+ dst_temp = chdir (dst) ? NULL : getcwd (NULL, 0);
+ src_temp = chdir (src) ? NULL : getcwd (NULL, 0);
+ }
+ else
+ {
+ src_temp = chdir (src) ? NULL : getcwd (NULL, 0);
+ if (!IS_ABSOLUTE_FILE_NAME (dst) && chdir (cwd))
+ abort ();
+ dst_temp = chdir (dst) ? NULL : getcwd (NULL, 0);
+ }
+ if (chdir (cwd))
+ abort ();
+ free (cwd);
+ if (!src_temp || !dst_temp)
+ {
+ free (src_temp);
+ free (dst_temp);
+ errno = ENOMEM;
+ return -1;
+ }
+ src_len = strlen (src_temp);
+ if (strncmp (src_temp, dst_temp, src_len) == 0
+ && (ISSLASH (dst_temp[src_len]) || dst_temp[src_len] == '\0'))
+ {
+ error = dst_temp[src_len];
+ free (src_temp);
+ free (dst_temp);
+ if (error)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ return 0;
+ }
+ if (rmdir (dst))
+ {
+ error = errno;
+ free (src_temp);
+ free (dst_temp);
+ errno = error;
+ return -1;
+ }
+ free (src_temp);
+ free (dst_temp);
+ }
+
+ /* MoveFileEx works if SRC is a directory without any flags, but
+ fails with MOVEFILE_REPLACE_EXISTING, so try without flags first.
+ Thankfully, MoveFileEx handles hard links correctly, even though
+ rename() does not. */
+ if (MoveFileEx (src, dst, 0))
+ return 0;
+
+ /* Retry with MOVEFILE_REPLACE_EXISTING if the move failed
+ due to the destination already existing. */
+ error = GetLastError ();
+ if (error == ERROR_FILE_EXISTS || error == ERROR_ALREADY_EXISTS)
+ {
+ if (MoveFileEx (src, dst, MOVEFILE_REPLACE_EXISTING))
+ return 0;
+
+ error = GetLastError ();
+ }
+
+ switch (error)
+ {
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_PATH_NOT_FOUND:
+ case ERROR_BAD_PATHNAME:
+ case ERROR_DIRECTORY:
+ errno = ENOENT;
+ break;
+
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ errno = EACCES;
+ break;
+
+ case ERROR_OUTOFMEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_CURRENT_DIRECTORY:
+ errno = EBUSY;
+ break;
+
+ case ERROR_NOT_SAME_DEVICE:
+ errno = EXDEV;
+ break;
+
+ case ERROR_WRITE_PROTECT:
+ errno = EROFS;
+ break;
+
+ case ERROR_WRITE_FAULT:
+ case ERROR_READ_FAULT:
+ case ERROR_GEN_FAILURE:
+ errno = EIO;
+ break;
+
+ case ERROR_HANDLE_DISK_FULL:
+ case ERROR_DISK_FULL:
+ case ERROR_DISK_TOO_FRAGMENTED:
+ errno = ENOSPC;
+ break;
+
+ case ERROR_FILE_EXISTS:
+ case ERROR_ALREADY_EXISTS:
+ errno = EEXIST;
+ break;
+
+ case ERROR_BUFFER_OVERFLOW:
+ case ERROR_FILENAME_EXCED_RANGE:
+ errno = ENAMETOOLONG;
+ break;
+
+ case ERROR_INVALID_NAME:
+ case ERROR_DELETE_PENDING:
+ errno = EPERM; /* ? */
+ break;
+
+# ifndef ERROR_FILE_TOO_LARGE
+/* This value is documented but not defined in all versions of windows.h. */
+# define ERROR_FILE_TOO_LARGE 223
+# endif
+ case ERROR_FILE_TOO_LARGE:
+ errno = EFBIG;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+
+ return -1;
+}
+
+#else /* ! W32 platform */
+
+# include <errno.h>
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# include <sys/stat.h>
+# include <unistd.h>
+
+# include "dirname.h"
+# include "same-inode.h"
+
+/* Rename the file SRC to DST, fixing any trailing slash bugs. */
+
+int
+rpl_rename (char const *src, char const *dst)
+{
+ size_t src_len = strlen (src);
+ size_t dst_len = strlen (dst);
+ char *src_temp = (char *) src;
+ char *dst_temp = (char *) dst;
+ bool src_slash;
+ bool dst_slash;
+ bool dst_exists;
+ int ret_val = -1;
+ int rename_errno = ENOTDIR;
+ struct stat src_st;
+ struct stat dst_st;
+
+ if (!src_len || !dst_len)
+ return rename (src, dst); /* Let strace see the ENOENT failure. */
+
+# if RENAME_DEST_EXISTS_BUG
+ {
+ char *src_base = last_component (src);
+ char *dst_base = last_component (dst);
+ if (*src_base == '.')
+ {
+ size_t len = base_len (src_base);
+ if (len == 1 || (len == 2 && src_base[1] == '.'))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+ if (*dst_base == '.')
+ {
+ size_t len = base_len (dst_base);
+ if (len == 1 || (len == 2 && dst_base[1] == '.'))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+ }
+# endif /* RENAME_DEST_EXISTS_BUG */
+
+ src_slash = src[src_len - 1] == '/';
+ dst_slash = dst[dst_len - 1] == '/';
+
+# if !RENAME_HARD_LINK_BUG && !RENAME_DEST_EXISTS_BUG
+ /* If there are no trailing slashes, then trust the native
+ implementation unless we also suspect issues with hard link
+ detection or file/directory conflicts. */
+ if (!src_slash && !dst_slash)
+ return rename (src, dst);
+# endif /* !RENAME_HARD_LINK_BUG && !RENAME_DEST_EXISTS_BUG */
+
+ /* Presence of a trailing slash requires directory semantics. If
+ the source does not exist, or if the destination cannot be turned
+ into a directory, give up now. Otherwise, strip trailing slashes
+ before calling rename. */
+ if (lstat (src, &src_st))
+ return -1;
+ if (lstat (dst, &dst_st))
+ {
+ if (errno != ENOENT || (!S_ISDIR (src_st.st_mode) && dst_slash))
+ return -1;
+ dst_exists = false;
+ }
+ else
+ {
+ if (S_ISDIR (dst_st.st_mode) != S_ISDIR (src_st.st_mode))
+ {
+ errno = S_ISDIR (dst_st.st_mode) ? EISDIR : ENOTDIR;
+ return -1;
+ }
+# if RENAME_HARD_LINK_BUG
+ if (SAME_INODE (src_st, dst_st))
+ return 0;
+# endif /* RENAME_HARD_LINK_BUG */
+ dst_exists = true;
+ }
+
+# if (RENAME_TRAILING_SLASH_SOURCE_BUG || RENAME_DEST_EXISTS_BUG \
+ || RENAME_HARD_LINK_BUG)
+ /* If the only bug was that a trailing slash was allowed on a
+ non-existing file destination, as in Solaris 10, then we've
+ already covered that situation. But if there is any problem with
+ a trailing slash on an existing source or destination, as in
+ Solaris 9, or if a directory can overwrite a symlink, as on
+ Cygwin 1.5, or if directories cannot be created with trailing
+ slash, as on NetBSD 1.6, then we must strip the offending slash
+ and check that we have not encountered a symlink instead of a
+ directory.
+
+ Stripping a trailing slash interferes with POSIX semantics, where
+ rename behavior on a symlink with a trailing slash operates on
+ the corresponding target directory. We prefer the GNU semantics
+ of rejecting any use of a symlink with trailing slash, but do not
+ enforce them, since Solaris 10 is able to obey POSIX semantics
+ and there might be clients expecting it, as counter-intuitive as
+ those semantics are.
+
+ Technically, we could also follow the POSIX behavior by chasing a
+ readlink trail, but that is harder to implement. */
+ if (src_slash)
+ {
+ src_temp = strdup (src);
+ if (!src_temp)
+ {
+ /* Rather than rely on strdup-posix, we set errno ourselves. */
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ strip_trailing_slashes (src_temp);
+ if (lstat (src_temp, &src_st))
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ if (S_ISLNK (src_st.st_mode))
+ goto out;
+ }
+ if (dst_slash)
+ {
+ dst_temp = strdup (dst);
+ if (!dst_temp)
+ {
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ strip_trailing_slashes (dst_temp);
+ if (lstat (dst_temp, &dst_st))
+ {
+ if (errno != ENOENT)
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ }
+ else if (S_ISLNK (dst_st.st_mode))
+ goto out;
+ }
+# endif /* RENAME_TRAILING_SLASH_SOURCE_BUG || RENAME_DEST_EXISTS_BUG
+ || RENAME_HARD_LINK_BUG */
+
+# if RENAME_DEST_EXISTS_BUG
+ /* Cygwin 1.5 sometimes behaves oddly when moving a non-empty
+ directory on top of an empty one (the old directory name can
+ reappear if the new directory tree is removed). Work around this
+ by removing the target first, but don't remove the target if it
+ is a subdirectory of the source. Note that we can end up losing
+ a directory if rename then fails, but it was empty, so not much
+ damage was done. */
+ if (dst_exists && S_ISDIR (dst_st.st_mode))
+ {
+ if (src_st.st_dev != dst_st.st_dev)
+ {
+ rename_errno = EXDEV;
+ goto out;
+ }
+ if (src_temp != src)
+ free (src_temp);
+ src_temp = canonicalize_file_name (src);
+ if (dst_temp != dst)
+ free (dst_temp);
+ dst_temp = canonicalize_file_name (dst);
+ if (!src_temp || !dst_temp)
+ {
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ src_len = strlen (src_temp);
+ if (strncmp (src_temp, dst_temp, src_len) == 0
+ && dst_temp[src_len] == '/')
+ {
+ rename_errno = EINVAL;
+ goto out;
+ }
+ if (rmdir (dst))
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ }
+# endif /* RENAME_DEST_EXISTS_BUG */
+
+ ret_val = rename (src_temp, dst_temp);
+ rename_errno = errno;
+ out:
+ if (src_temp != src)
+ free (src_temp);
+ if (dst_temp != dst)
+ free (dst_temp);
+ errno = rename_errno;
+ return ret_val;
+}
+#endif /* ! W32 platform */
diff --git a/gnulib/lib/renameat.c b/gnulib/lib/renameat.c
new file mode 100644
index 00000000..f2947650
--- /dev/null
+++ b/gnulib/lib/renameat.c
@@ -0,0 +1,157 @@
+/* Rename a file relative to open directories.
+ Copyright (C) 2009-2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#if HAVE_RENAMEAT
+
+# include <errno.h>
+# include <stdbool.h>
+# include <stdlib.h>
+# include <string.h>
+# include <sys/stat.h>
+
+# include "dirname.h"
+# include "openat.h"
+
+# undef renameat
+
+/* renameat does not honor trailing / on Solaris 10. Solve it in a
+ similar manner to rename. No need to worry about bugs not present
+ on Solaris, since all other systems either lack renameat or honor
+ trailing slash correctly. */
+
+int
+rpl_renameat (int fd1, char const *src, int fd2, char const *dst)
+{
+ size_t src_len = strlen (src);
+ size_t dst_len = strlen (dst);
+ char *src_temp = (char *) src;
+ char *dst_temp = (char *) dst;
+ bool src_slash;
+ bool dst_slash;
+ int ret_val = -1;
+ int rename_errno = ENOTDIR;
+ struct stat src_st;
+ struct stat dst_st;
+
+ /* Let strace see any ENOENT failure. */
+ if (!src_len || !dst_len)
+ return renameat (fd1, src, fd2, dst);
+
+ src_slash = src[src_len - 1] == '/';
+ dst_slash = dst[dst_len - 1] == '/';
+ if (!src_slash && !dst_slash)
+ return renameat (fd1, src, fd2, dst);
+
+ /* Presence of a trailing slash requires directory semantics. If
+ the source does not exist, or if the destination cannot be turned
+ into a directory, give up now. Otherwise, strip trailing slashes
+ before calling rename. */
+ if (lstatat (fd1, src, &src_st))
+ return -1;
+ if (lstatat (fd2, dst, &dst_st))
+ {
+ if (errno != ENOENT || !S_ISDIR (src_st.st_mode))
+ return -1;
+ }
+ else if (!S_ISDIR (dst_st.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ else if (!S_ISDIR (src_st.st_mode))
+ {
+ errno = EISDIR;
+ return -1;
+ }
+
+# if RENAME_TRAILING_SLASH_SOURCE_BUG
+ /* See the lengthy comment in rename.c why Solaris 9 is forced to
+ GNU behavior, while Solaris 10 is left with POSIX behavior,
+ regarding symlinks with trailing slash. */
+ if (src_slash)
+ {
+ src_temp = strdup (src);
+ if (!src_temp)
+ {
+ /* Rather than rely on strdup-posix, we set errno ourselves. */
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ strip_trailing_slashes (src_temp);
+ if (lstatat (fd1, src_temp, &src_st))
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ if (S_ISLNK (src_st.st_mode))
+ goto out;
+ }
+ if (dst_slash)
+ {
+ dst_temp = strdup (dst);
+ if (!dst_temp)
+ {
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ strip_trailing_slashes (dst_temp);
+ if (lstatat (fd2, dst_temp, &dst_st))
+ {
+ if (errno != ENOENT)
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ }
+ else if (S_ISLNK (dst_st.st_mode))
+ goto out;
+ }
+# endif /* RENAME_TRAILING_SLASH_SOURCE_BUG */
+
+ ret_val = renameat (fd1, src_temp, fd2, dst_temp);
+ rename_errno = errno;
+ out:
+ if (src_temp != src)
+ free (src_temp);
+ if (dst_temp != dst)
+ free (dst_temp);
+ errno = rename_errno;
+ return ret_val;
+}
+
+#else /* !HAVE_RENAMEAT */
+
+# include "openat-priv.h"
+
+/* Rename FILE1, in the directory open on descriptor FD1, to FILE2, in
+ the directory open on descriptor FD2. If possible, do it without
+ changing the working directory. Otherwise, resort to using
+ save_cwd/fchdir, then rename/restore_cwd. If either the save_cwd or
+ the restore_cwd fails, then give a diagnostic and exit nonzero. */
+
+int
+renameat (int fd1, char const *file1, int fd2, char const *file2)
+{
+ return at_func2 (fd1, file1, fd2, file2, rename);
+}
+
+#endif /* !HAVE_RENAMEAT */
diff --git a/gnulib/lib/rijndael-alg-fst.c b/gnulib/lib/rijndael-alg-fst.c
new file mode 100644
index 00000000..073bb3d7
--- /dev/null
+++ b/gnulib/lib/rijndael-alg-fst.c
@@ -0,0 +1,1083 @@
+/* rijndael-alg-fst.c --- Rijndael cipher implementation.
+ * Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson.
+ *
+ * Based on public domain "Optimised C code" retrieved from (SHA1
+ * 7c8e4b00d06685d1dbc6724a9e0d502353de339e):
+ * http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/~rijmen/rijndael/rijndael-fst-3.0.zip
+ */
+
+#include <config.h>
+
+/**
+ * rijndael-alg-fst.c
+ *
+ * @version 3.0 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "rijndael-alg-fst.h"
+
+/*
+Te0[x] = S [x].[02, 01, 01, 03];
+Te1[x] = S [x].[03, 02, 01, 01];
+Te2[x] = S [x].[01, 03, 02, 01];
+Te3[x] = S [x].[01, 01, 03, 02];
+Te4[x] = S [x].[01, 01, 01, 01];
+
+Td0[x] = Si[x].[0e, 09, 0d, 0b];
+Td1[x] = Si[x].[0b, 0e, 09, 0d];
+Td2[x] = Si[x].[0d, 0b, 0e, 09];
+Td3[x] = Si[x].[09, 0d, 0b, 0e];
+Td4[x] = Si[x].[01, 01, 01, 01];
+*/
+
+static const uint32_t Te0[256] = {
+ 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
+ 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
+ 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
+ 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
+ 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
+ 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
+ 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
+ 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
+ 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
+ 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
+ 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
+ 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
+ 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
+ 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
+ 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
+ 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
+ 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
+ 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
+ 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
+ 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
+ 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
+ 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
+ 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
+ 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
+ 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
+ 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
+ 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
+ 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
+ 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
+ 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
+ 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
+ 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
+ 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
+ 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
+ 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
+ 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
+ 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
+ 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
+ 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
+ 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
+ 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
+ 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
+ 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
+ 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
+ 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
+ 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
+ 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
+ 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
+ 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
+ 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
+ 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
+ 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
+ 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
+ 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
+ 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
+ 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
+ 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
+ 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
+ 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
+ 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
+ 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
+ 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
+ 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
+ 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
+};
+static const uint32_t Te1[256] = {
+ 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
+ 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
+ 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
+ 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
+ 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
+ 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
+ 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
+ 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
+ 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
+ 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
+ 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
+ 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
+ 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
+ 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
+ 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
+ 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
+ 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
+ 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
+ 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
+ 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
+ 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
+ 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
+ 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
+ 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
+ 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
+ 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
+ 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
+ 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
+ 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
+ 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
+ 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
+ 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
+ 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
+ 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
+ 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
+ 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
+ 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
+ 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
+ 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
+ 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
+ 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
+ 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
+ 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
+ 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
+ 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
+ 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
+ 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
+ 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
+ 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
+ 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
+ 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
+ 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
+ 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
+ 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
+ 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
+ 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
+ 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
+ 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
+ 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
+ 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
+ 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
+ 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
+ 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
+ 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
+};
+static const uint32_t Te2[256] = {
+ 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
+ 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
+ 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
+ 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
+ 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
+ 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
+ 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
+ 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
+ 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
+ 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
+ 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
+ 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
+ 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
+ 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
+ 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
+ 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
+ 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
+ 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
+ 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
+ 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
+ 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
+ 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
+ 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
+ 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
+ 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
+ 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
+ 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
+ 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
+ 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
+ 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
+ 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
+ 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
+ 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
+ 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
+ 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
+ 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
+ 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
+ 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
+ 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
+ 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
+ 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
+ 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
+ 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
+ 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
+ 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
+ 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
+ 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
+ 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
+ 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
+ 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
+ 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
+ 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
+ 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
+ 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
+ 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
+ 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
+ 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
+ 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
+ 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
+ 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
+ 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
+ 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
+ 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
+ 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
+};
+static const uint32_t Te3[256] = {
+ 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
+ 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
+ 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
+ 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
+ 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
+ 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
+ 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
+ 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
+ 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
+ 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
+ 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
+ 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
+ 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
+ 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
+ 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
+ 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
+ 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
+ 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
+ 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
+ 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
+ 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
+ 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
+ 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
+ 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
+ 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
+ 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
+ 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
+ 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
+ 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
+ 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
+ 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
+ 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
+ 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
+ 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
+ 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
+ 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
+ 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
+ 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
+ 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
+ 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
+ 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
+ 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
+ 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
+ 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
+ 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
+ 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
+ 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
+ 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
+ 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
+ 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
+ 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
+ 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
+ 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
+ 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
+ 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
+ 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
+ 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
+ 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
+ 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
+ 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
+ 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
+ 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
+ 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
+ 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
+};
+static const uint32_t Te4[256] = {
+ 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
+ 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
+ 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
+ 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
+ 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
+ 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
+ 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
+ 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
+ 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
+ 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
+ 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
+ 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
+ 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
+ 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
+ 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
+ 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
+ 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
+ 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
+ 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
+ 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
+ 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
+ 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
+ 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
+ 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
+ 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
+ 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
+ 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
+ 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
+ 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
+ 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
+ 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
+ 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
+ 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
+ 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
+ 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
+ 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
+ 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
+ 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
+ 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
+ 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
+ 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
+ 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
+ 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
+ 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
+ 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
+ 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
+ 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
+ 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
+ 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
+ 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
+ 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
+ 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
+ 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
+ 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
+ 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
+ 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
+ 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
+ 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
+ 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
+ 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
+ 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
+ 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
+ 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
+ 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616,
+};
+static const uint32_t Td0[256] = {
+ 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
+ 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
+ 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
+ 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
+ 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
+ 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
+ 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
+ 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
+ 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
+ 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
+ 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
+ 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
+ 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
+ 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
+ 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
+ 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
+ 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
+ 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
+ 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
+ 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
+ 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
+ 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
+ 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
+ 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
+ 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
+ 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
+ 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
+ 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
+ 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
+ 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
+ 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
+ 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
+ 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
+ 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
+ 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
+ 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
+ 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
+ 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
+ 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
+ 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
+ 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
+ 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
+ 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
+ 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
+ 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
+ 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
+ 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
+ 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
+ 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
+ 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
+ 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
+ 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
+ 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
+ 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
+ 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
+ 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
+ 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
+ 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
+ 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
+ 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
+ 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
+ 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
+ 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
+ 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
+};
+static const uint32_t Td1[256] = {
+ 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
+ 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
+ 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
+ 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
+ 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
+ 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
+ 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
+ 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
+ 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
+ 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
+ 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
+ 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
+ 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
+ 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
+ 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
+ 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
+ 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
+ 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
+ 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
+ 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
+ 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
+ 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
+ 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
+ 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
+ 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
+ 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
+ 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
+ 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
+ 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
+ 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
+ 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
+ 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
+ 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
+ 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
+ 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
+ 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
+ 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
+ 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
+ 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
+ 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
+ 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
+ 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
+ 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
+ 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
+ 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
+ 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
+ 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
+ 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
+ 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
+ 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
+ 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
+ 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
+ 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
+ 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
+ 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
+ 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
+ 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
+ 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
+ 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
+ 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
+ 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
+ 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
+ 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
+ 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
+};
+static const uint32_t Td2[256] = {
+ 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
+ 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
+ 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
+ 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
+ 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
+ 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
+ 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
+ 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
+ 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
+ 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
+ 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
+ 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
+ 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
+ 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
+ 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
+ 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
+ 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
+ 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
+ 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
+ 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
+ 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
+ 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
+ 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
+ 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
+ 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
+ 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
+ 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
+ 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
+ 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
+ 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
+ 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
+ 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
+ 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
+ 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
+ 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
+ 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
+ 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
+ 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
+ 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
+ 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
+ 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
+ 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
+ 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
+ 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
+ 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
+ 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
+ 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
+ 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
+ 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
+ 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
+ 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
+ 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
+ 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
+ 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
+ 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
+ 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
+ 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
+ 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
+ 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
+ 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
+ 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
+ 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
+ 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
+ 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
+};
+static const uint32_t Td3[256] = {
+ 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
+ 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
+ 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
+ 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
+ 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
+ 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
+ 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
+ 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
+ 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
+ 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
+ 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
+ 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
+ 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
+ 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
+ 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
+ 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
+ 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
+ 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
+ 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
+ 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
+ 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
+ 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
+ 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
+ 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
+ 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
+ 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
+ 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
+ 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
+ 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
+ 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
+ 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
+ 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
+ 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
+ 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
+ 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
+ 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
+ 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
+ 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
+ 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
+ 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
+ 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
+ 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
+ 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
+ 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
+ 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
+ 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
+ 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
+ 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
+ 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
+ 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
+ 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
+ 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
+ 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
+ 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
+ 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
+ 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
+ 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
+ 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
+ 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
+ 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
+ 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
+ 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
+ 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
+ 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
+};
+static const uint32_t Td4[256] = {
+ 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
+ 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
+ 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
+ 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
+ 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
+ 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
+ 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
+ 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
+ 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
+ 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
+ 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
+ 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
+ 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
+ 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
+ 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
+ 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
+ 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
+ 0x86868686, 0x68686868, 0x98989898, 0x16161616,
+ 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
+ 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
+ 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
+ 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
+ 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
+ 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
+ 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
+ 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
+ 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
+ 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
+ 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
+ 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
+ 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
+ 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
+ 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
+ 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
+ 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
+ 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
+ 0x96969696, 0xacacacac, 0x74747474, 0x22222222,
+ 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
+ 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
+ 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
+ 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
+ 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
+ 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
+ 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
+ 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
+ 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
+ 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
+ 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
+ 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
+ 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
+ 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
+ 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
+ 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
+ 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
+ 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
+ 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
+ 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
+ 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
+ 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
+ 0x83838383, 0x53535353, 0x99999999, 0x61616161,
+ 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
+ 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
+ 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
+ 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d,
+};
+static const uint32_t rcon[] = {
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000, 0x80000000,
+ 0x1B000000, 0x36000000
+ /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
+};
+
+#define GETU32(pt) (((uint32_t)((pt)[0] & 0xFF) << 24) ^ \
+ ((uint32_t)((pt)[1] & 0xFF) << 16) ^ \
+ ((uint32_t)((pt)[2] & 0xFF) << 8) ^ \
+ ((uint32_t)((pt)[3] & 0xFF)))
+#define PUTU32(ct, st) { \
+ (ct)[0] = (char)((st) >> 24); \
+ (ct)[1] = (char)((st) >> 16); \
+ (ct)[2] = (char)((st) >> 8); \
+ (ct)[3] = (char)(st); }
+
+/**
+ * Expand the cipher key into the encryption key schedule.
+ *
+ * @return the number of rounds for the given cipher key size.
+ */
+int
+rijndaelKeySetupEnc (uint32_t rk[ /*4*(Nr + 1) */ ],
+ const char cipherKey[], size_t keyBits)
+{
+ size_t i = 0;
+ uint32_t temp;
+
+ rk[0] = GETU32 (cipherKey);
+ rk[1] = GETU32 (cipherKey + 4);
+ rk[2] = GETU32 (cipherKey + 8);
+ rk[3] = GETU32 (cipherKey + 12);
+ if (keyBits == 128)
+ {
+ for (;;)
+ {
+ temp = rk[3];
+ rk[4] = rk[0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
+ rk[5] = rk[1] ^ rk[4];
+ rk[6] = rk[2] ^ rk[5];
+ rk[7] = rk[3] ^ rk[6];
+ if (++i == 10)
+ {
+ return 10;
+ }
+ rk += 4;
+ }
+ }
+ rk[4] = GETU32 (cipherKey + 16);
+ rk[5] = GETU32 (cipherKey + 20);
+ if (keyBits == 192)
+ {
+ for (;;)
+ {
+ temp = rk[5];
+ rk[6] = rk[0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
+ rk[7] = rk[1] ^ rk[6];
+ rk[8] = rk[2] ^ rk[7];
+ rk[9] = rk[3] ^ rk[8];
+ if (++i == 8)
+ {
+ return 12;
+ }
+ rk[10] = rk[4] ^ rk[9];
+ rk[11] = rk[5] ^ rk[10];
+ rk += 6;
+ }
+ }
+ rk[6] = GETU32 (cipherKey + 24);
+ rk[7] = GETU32 (cipherKey + 28);
+ if (keyBits == 256)
+ {
+ for (;;)
+ {
+ temp = rk[7];
+ rk[8] = rk[0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
+ rk[9] = rk[1] ^ rk[8];
+ rk[10] = rk[2] ^ rk[9];
+ rk[11] = rk[3] ^ rk[10];
+ if (++i == 7)
+ {
+ return 14;
+ }
+ temp = rk[11];
+ rk[12] = rk[4] ^
+ (Te4[(temp >> 24)] & 0xff000000) ^
+ (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp) & 0xff] & 0x000000ff);
+ rk[13] = rk[5] ^ rk[12];
+ rk[14] = rk[6] ^ rk[13];
+ rk[15] = rk[7] ^ rk[14];
+
+ rk += 8;
+ }
+ }
+ return 0;
+}
+
+/**
+ * Expand the cipher key into the decryption key schedule.
+ *
+ * @return the number of rounds for the given cipher key size.
+ */
+int
+rijndaelKeySetupDec (uint32_t rk[ /*4*(Nr + 1) */ ],
+ const char cipherKey[], size_t keyBits)
+{
+ size_t Nr, i, j;
+ uint32_t temp;
+
+ /* expand the cipher key: */
+ Nr = rijndaelKeySetupEnc (rk, cipherKey, keyBits);
+ /* invert the order of the round keys: */
+ for (i = 0, j = 4 * Nr; i < j; i += 4, j -= 4)
+ {
+ temp = rk[i];
+ rk[i] = rk[j];
+ rk[j] = temp;
+ temp = rk[i + 1];
+ rk[i + 1] = rk[j + 1];
+ rk[j + 1] = temp;
+ temp = rk[i + 2];
+ rk[i + 2] = rk[j + 2];
+ rk[j + 2] = temp;
+ temp = rk[i + 3];
+ rk[i + 3] = rk[j + 3];
+ rk[j + 3] = temp;
+ }
+ /* apply the inverse MixColumn transform to all round keys but the
+ first and the last: */
+ for (i = 1; i < Nr; i++)
+ {
+ rk += 4;
+ rk[0] =
+ Td0[Te4[(rk[0] >> 24)] & 0xff] ^
+ Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[0]) & 0xff] & 0xff];
+ rk[1] =
+ Td0[Te4[(rk[1] >> 24)] & 0xff] ^
+ Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[1]) & 0xff] & 0xff];
+ rk[2] =
+ Td0[Te4[(rk[2] >> 24)] & 0xff] ^
+ Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[2]) & 0xff] & 0xff];
+ rk[3] =
+ Td0[Te4[(rk[3] >> 24)] & 0xff] ^
+ Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[3]) & 0xff] & 0xff];
+ }
+ return Nr;
+}
+
+void
+rijndaelEncrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
+ const char pt[16], char ct[16])
+{
+ uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
+ size_t r;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = GETU32 (pt) ^ rk[0];
+ s1 = GETU32 (pt + 4) ^ rk[1];
+ s2 = GETU32 (pt + 8) ^ rk[2];
+ s3 = GETU32 (pt + 12) ^ rk[3];
+ /*
+ * Nr - 1 full rounds:
+ */
+ r = Nr >> 1;
+ for (;;)
+ {
+ t0 =
+ Te0[(s0 >> 24)] ^
+ Te1[(s1 >> 16) & 0xff] ^
+ Te2[(s2 >> 8) & 0xff] ^ Te3[(s3) & 0xff] ^ rk[4];
+ t1 =
+ Te0[(s1 >> 24)] ^
+ Te1[(s2 >> 16) & 0xff] ^
+ Te2[(s3 >> 8) & 0xff] ^ Te3[(s0) & 0xff] ^ rk[5];
+ t2 =
+ Te0[(s2 >> 24)] ^
+ Te1[(s3 >> 16) & 0xff] ^
+ Te2[(s0 >> 8) & 0xff] ^ Te3[(s1) & 0xff] ^ rk[6];
+ t3 =
+ Te0[(s3 >> 24)] ^
+ Te1[(s0 >> 16) & 0xff] ^
+ Te2[(s1 >> 8) & 0xff] ^ Te3[(s2) & 0xff] ^ rk[7];
+
+ rk += 8;
+ if (--r == 0)
+ {
+ break;
+ }
+
+ s0 =
+ Te0[(t0 >> 24)] ^
+ Te1[(t1 >> 16) & 0xff] ^
+ Te2[(t2 >> 8) & 0xff] ^ Te3[(t3) & 0xff] ^ rk[0];
+ s1 =
+ Te0[(t1 >> 24)] ^
+ Te1[(t2 >> 16) & 0xff] ^
+ Te2[(t3 >> 8) & 0xff] ^ Te3[(t0) & 0xff] ^ rk[1];
+ s2 =
+ Te0[(t2 >> 24)] ^
+ Te1[(t3 >> 16) & 0xff] ^
+ Te2[(t0 >> 8) & 0xff] ^ Te3[(t1) & 0xff] ^ rk[2];
+ s3 =
+ Te0[(t3 >> 24)] ^
+ Te1[(t0 >> 16) & 0xff] ^
+ Te2[(t1 >> 8) & 0xff] ^ Te3[(t2) & 0xff] ^ rk[3];
+ }
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Te4[(t0 >> 24)] & 0xff000000) ^
+ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t3) & 0xff] & 0x000000ff) ^ rk[0];
+ PUTU32 (ct, s0);
+ s1 =
+ (Te4[(t1 >> 24)] & 0xff000000) ^
+ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t0) & 0xff] & 0x000000ff) ^ rk[1];
+ PUTU32 (ct + 4, s1);
+ s2 =
+ (Te4[(t2 >> 24)] & 0xff000000) ^
+ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t1) & 0xff] & 0x000000ff) ^ rk[2];
+ PUTU32 (ct + 8, s2);
+ s3 =
+ (Te4[(t3 >> 24)] & 0xff000000) ^
+ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t2) & 0xff] & 0x000000ff) ^ rk[3];
+ PUTU32 (ct + 12, s3);
+}
+
+void
+rijndaelDecrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
+ const char ct[16], char pt[16])
+{
+ uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
+ size_t r;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = GETU32 (ct) ^ rk[0];
+ s1 = GETU32 (ct + 4) ^ rk[1];
+ s2 = GETU32 (ct + 8) ^ rk[2];
+ s3 = GETU32 (ct + 12) ^ rk[3];
+ /*
+ * Nr - 1 full rounds:
+ */
+ r = Nr >> 1;
+ for (;;)
+ {
+ t0 =
+ Td0[(s0 >> 24)] ^
+ Td1[(s3 >> 16) & 0xff] ^
+ Td2[(s2 >> 8) & 0xff] ^ Td3[(s1) & 0xff] ^ rk[4];
+ t1 =
+ Td0[(s1 >> 24)] ^
+ Td1[(s0 >> 16) & 0xff] ^
+ Td2[(s3 >> 8) & 0xff] ^ Td3[(s2) & 0xff] ^ rk[5];
+ t2 =
+ Td0[(s2 >> 24)] ^
+ Td1[(s1 >> 16) & 0xff] ^
+ Td2[(s0 >> 8) & 0xff] ^ Td3[(s3) & 0xff] ^ rk[6];
+ t3 =
+ Td0[(s3 >> 24)] ^
+ Td1[(s2 >> 16) & 0xff] ^
+ Td2[(s1 >> 8) & 0xff] ^ Td3[(s0) & 0xff] ^ rk[7];
+
+ rk += 8;
+ if (--r == 0)
+ {
+ break;
+ }
+
+ s0 =
+ Td0[(t0 >> 24)] ^
+ Td1[(t3 >> 16) & 0xff] ^
+ Td2[(t2 >> 8) & 0xff] ^ Td3[(t1) & 0xff] ^ rk[0];
+ s1 =
+ Td0[(t1 >> 24)] ^
+ Td1[(t0 >> 16) & 0xff] ^
+ Td2[(t3 >> 8) & 0xff] ^ Td3[(t2) & 0xff] ^ rk[1];
+ s2 =
+ Td0[(t2 >> 24)] ^
+ Td1[(t1 >> 16) & 0xff] ^
+ Td2[(t0 >> 8) & 0xff] ^ Td3[(t3) & 0xff] ^ rk[2];
+ s3 =
+ Td0[(t3 >> 24)] ^
+ Td1[(t2 >> 16) & 0xff] ^
+ Td2[(t1 >> 8) & 0xff] ^ Td3[(t0) & 0xff] ^ rk[3];
+ }
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Td4[(t0 >> 24)] & 0xff000000) ^
+ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t1) & 0xff] & 0x000000ff) ^ rk[0];
+ PUTU32 (pt, s0);
+ s1 =
+ (Td4[(t1 >> 24)] & 0xff000000) ^
+ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t2) & 0xff] & 0x000000ff) ^ rk[1];
+ PUTU32 (pt + 4, s1);
+ s2 =
+ (Td4[(t2 >> 24)] & 0xff000000) ^
+ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t3) & 0xff] & 0x000000ff) ^ rk[2];
+ PUTU32 (pt + 8, s2);
+ s3 =
+ (Td4[(t3 >> 24)] & 0xff000000) ^
+ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t0) & 0xff] & 0x000000ff) ^ rk[3];
+ PUTU32 (pt + 12, s3);
+}
diff --git a/gnulib/lib/rijndael-alg-fst.h b/gnulib/lib/rijndael-alg-fst.h
new file mode 100644
index 00000000..87d983bf
--- /dev/null
+++ b/gnulib/lib/rijndael-alg-fst.h
@@ -0,0 +1,67 @@
+/* rijndael-alg-fst.h --- Rijndael cipher implementation.
+ * Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson. */
+
+/**
+ * rijndael-alg-fst.h
+ *
+ * @version 3.0 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __RIJNDAEL_ALG_FST_H
+#define __RIJNDAEL_ALG_FST_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+#define RIJNDAEL_MAXKC (256/32)
+#define RIJNDAEL_MAXKB (256/8)
+#define RIJNDAEL_MAXNR 14
+
+int rijndaelKeySetupEnc (uint32_t rk[ /*4*(Nr + 1) */ ],
+ const char cipherKey[], size_t keyBits);
+int rijndaelKeySetupDec (uint32_t rk[ /*4*(Nr + 1) */ ],
+ const char cipherKey[], size_t keyBits);
+void rijndaelEncrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
+ const char pt[16], char ct[16]);
+void rijndaelDecrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
+ const char ct[16], char pt[16]);
+
+#endif /* __RIJNDAEL_ALG_FST_H */
diff --git a/gnulib/lib/rijndael-api-fst.c b/gnulib/lib/rijndael-api-fst.c
new file mode 100644
index 00000000..23ba9b23
--- /dev/null
+++ b/gnulib/lib/rijndael-api-fst.c
@@ -0,0 +1,521 @@
+/* rijndael-api-fst.c --- Rijndael cipher implementation.
+ * Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson.
+ *
+ * Based on public domain "Optimised C code" retrieved from (SHA1
+ * 7c8e4b00d06685d1dbc6724a9e0d502353de339e):
+ * http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/~rijmen/rijndael/rijndael-fst-3.0.zip
+ */
+
+#include <config.h>
+
+/**
+ * rijndael-api-fst.c
+ *
+ * @version 2.9 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Acknowledgements:
+ *
+ * We are deeply indebted to the following people for their bug reports,
+ * fixes, and improvement suggestions to this implementation. Though we
+ * tried to list all contributions, we apologise in advance for any
+ * missing reference.
+ *
+ * Andrew Bales <Andrew.Bales@Honeywell.com>
+ * Markus Friedl <markus.friedl@informatik.uni-erlangen.de>
+ * John Skodon <skodonj@webquill.com>
+ */
+
+#include "rijndael-alg-fst.h"
+#include "rijndael-api-fst.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+rijndael_rc
+rijndaelMakeKey (rijndaelKeyInstance *key, rijndael_direction direction,
+ size_t keyLen, const char *keyMaterial)
+{
+ size_t i;
+ char *keyMat;
+ char cipherKey[RIJNDAEL_MAXKB];
+
+ if (key == NULL)
+ {
+ return RIJNDAEL_BAD_KEY_INSTANCE;
+ }
+
+ if ((direction == RIJNDAEL_DIR_ENCRYPT)
+ || (direction == RIJNDAEL_DIR_DECRYPT))
+ {
+ key->direction = direction;
+ }
+ else
+ {
+ return RIJNDAEL_BAD_KEY_DIR;
+ }
+
+ if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256))
+ {
+ key->keyLen = keyLen;
+ }
+ else
+ {
+ return RIJNDAEL_BAD_KEY_MAT;
+ }
+
+ if (keyMaterial != NULL)
+ {
+ strncpy (key->keyMaterial, keyMaterial, keyLen / 4);
+ }
+
+ /* initialize key schedule: */
+ keyMat = key->keyMaterial;
+ for (i = 0; i < key->keyLen / 8; i++)
+ {
+ char t, v;
+
+ t = *keyMat++;
+ if ((t >= '0') && (t <= '9'))
+ v = (t - '0') << 4;
+ else if ((t >= 'a') && (t <= 'f'))
+ v = (t - 'a' + 10) << 4;
+ else if ((t >= 'A') && (t <= 'F'))
+ v = (t - 'A' + 10) << 4;
+ else
+ return RIJNDAEL_BAD_KEY_MAT;
+
+ t = *keyMat++;
+ if ((t >= '0') && (t <= '9'))
+ v ^= (t - '0');
+ else if ((t >= 'a') && (t <= 'f'))
+ v ^= (t - 'a' + 10);
+ else if ((t >= 'A') && (t <= 'F'))
+ v ^= (t - 'A' + 10);
+ else
+ return RIJNDAEL_BAD_KEY_MAT;
+
+ cipherKey[i] = v;
+ }
+ if (direction == RIJNDAEL_DIR_ENCRYPT)
+ {
+ key->Nr = rijndaelKeySetupEnc (key->rk, cipherKey, keyLen);
+ }
+ else
+ {
+ key->Nr = rijndaelKeySetupDec (key->rk, cipherKey, keyLen);
+ }
+ rijndaelKeySetupEnc (key->ek, cipherKey, keyLen);
+ return 0;
+}
+
+rijndael_rc
+rijndaelCipherInit (rijndaelCipherInstance *cipher, rijndael_mode mode,
+ const char *IV)
+{
+ if ((mode == RIJNDAEL_MODE_ECB) || (mode == RIJNDAEL_MODE_CBC)
+ || (mode == RIJNDAEL_MODE_CFB1))
+ {
+ cipher->mode = mode;
+ }
+ else
+ {
+ return RIJNDAEL_BAD_CIPHER_MODE;
+ }
+ if (IV != NULL)
+ {
+ int i;
+ for (i = 0; i < RIJNDAEL_MAX_IV_SIZE; i++)
+ {
+ int t, j;
+
+ t = IV[2 * i];
+ if ((t >= '0') && (t <= '9'))
+ j = (t - '0') << 4;
+ else if ((t >= 'a') && (t <= 'f'))
+ j = (t - 'a' + 10) << 4;
+ else if ((t >= 'A') && (t <= 'F'))
+ j = (t - 'A' + 10) << 4;
+ else
+ return RIJNDAEL_BAD_CIPHER_INSTANCE;
+
+ t = IV[2 * i + 1];
+ if ((t >= '0') && (t <= '9'))
+ j ^= (t - '0');
+ else if ((t >= 'a') && (t <= 'f'))
+ j ^= (t - 'a' + 10);
+ else if ((t >= 'A') && (t <= 'F'))
+ j ^= (t - 'A' + 10);
+ else
+ return RIJNDAEL_BAD_CIPHER_INSTANCE;
+
+ cipher->IV[i] = (uint8_t) j;
+ }
+ }
+ else
+ {
+ memset (cipher->IV, 0, RIJNDAEL_MAX_IV_SIZE);
+ }
+ return 0;
+}
+
+int
+rijndaelBlockEncrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input,
+ size_t inputLen, char *outBuffer)
+{
+ size_t i, k, t, numBlocks;
+ char block[16], *iv;
+
+ if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_DECRYPT)
+ {
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+ if (input == NULL || inputLen <= 0)
+ {
+ return 0; /* nothing to do */
+ }
+
+ numBlocks = inputLen / 128;
+
+ switch (cipher->mode)
+ {
+ case RIJNDAEL_MODE_ECB:
+ for (i = numBlocks; i > 0; i--)
+ {
+ rijndaelEncrypt (key->rk, key->Nr, input, outBuffer);
+ input += 16;
+ outBuffer += 16;
+ }
+ break;
+
+ case RIJNDAEL_MODE_CBC:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ ((uint32_t *) block)[0] = ((uint32_t *) input)[0] ^
+ ((uint32_t *) iv)[0];
+ ((uint32_t *) block)[1] = ((uint32_t *) input)[1] ^
+ ((uint32_t *) iv)[1];
+ ((uint32_t *) block)[2] = ((uint32_t *) input)[2] ^
+ ((uint32_t *) iv)[2];
+ ((uint32_t *) block)[3] = ((uint32_t *) input)[3] ^
+ ((uint32_t *) iv)[3];
+ rijndaelEncrypt (key->rk, key->Nr, block, outBuffer);
+ memcpy (cipher->IV, outBuffer, 16);
+ input += 16;
+ outBuffer += 16;
+ }
+ break;
+
+ case RIJNDAEL_MODE_CFB1:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ memcpy (outBuffer, input, 16);
+ for (k = 0; k < 128; k++)
+ {
+ rijndaelEncrypt (key->ek, key->Nr, iv, block);
+ outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7);
+ for (t = 0; t < 15; t++)
+ {
+ iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7);
+ }
+ iv[15] = (iv[15] << 1) |
+ ((outBuffer[k >> 3] >> (7 - (k & 7))) & 1);
+ }
+ outBuffer += 16;
+ input += 16;
+ }
+ break;
+
+ default:
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+
+ return 128 * numBlocks;
+}
+
+int
+rijndaelPadEncrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input,
+ size_t inputOctets, char *outBuffer)
+{
+ size_t i, numBlocks, padLen;
+ char block[16], *iv;
+
+ if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_DECRYPT)
+ {
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+ if (input == NULL || inputOctets <= 0)
+ {
+ return 0; /* nothing to do */
+ }
+
+ numBlocks = inputOctets / 16;
+
+ switch (cipher->mode)
+ {
+ case RIJNDAEL_MODE_ECB:
+ for (i = numBlocks; i > 0; i--)
+ {
+ rijndaelEncrypt (key->rk, key->Nr, input, outBuffer);
+ input += 16;
+ outBuffer += 16;
+ }
+ padLen = 16 - (inputOctets - 16 * numBlocks);
+ assert (padLen > 0 && padLen <= 16);
+ memcpy (block, input, 16 - padLen);
+ memset (block + 16 - padLen, padLen, padLen);
+ rijndaelEncrypt (key->rk, key->Nr, block, outBuffer);
+ break;
+
+ case RIJNDAEL_MODE_CBC:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ ((uint32_t *) block)[0] = ((uint32_t *) input)[0] ^
+ ((uint32_t *) iv)[0];
+ ((uint32_t *) block)[1] = ((uint32_t *) input)[1] ^
+ ((uint32_t *) iv)[1];
+ ((uint32_t *) block)[2] = ((uint32_t *) input)[2] ^
+ ((uint32_t *) iv)[2];
+ ((uint32_t *) block)[3] = ((uint32_t *) input)[3] ^
+ ((uint32_t *) iv)[3];
+ rijndaelEncrypt (key->rk, key->Nr, block, outBuffer);
+ memcpy (cipher->IV, outBuffer, 16);
+ input += 16;
+ outBuffer += 16;
+ }
+ padLen = 16 - (inputOctets - 16 * numBlocks);
+ assert (padLen > 0 && padLen <= 16);
+ for (i = 0; i < 16 - padLen; i++)
+ {
+ block[i] = input[i] ^ iv[i];
+ }
+ for (i = 16 - padLen; i < 16; i++)
+ {
+ block[i] = (char) padLen ^ iv[i];
+ }
+ rijndaelEncrypt (key->rk, key->Nr, block, outBuffer);
+ memcpy (cipher->IV, outBuffer, 16);
+ break;
+
+ default:
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+
+ return 16 * (numBlocks + 1);
+}
+
+int
+rijndaelBlockDecrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input,
+ size_t inputLen, char *outBuffer)
+{
+ size_t i, k, t, numBlocks;
+ char block[16], *iv;
+
+ if (cipher == NULL
+ || key == NULL
+ || (cipher->mode != RIJNDAEL_MODE_CFB1
+ && key->direction == RIJNDAEL_DIR_ENCRYPT))
+ {
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+ if (input == NULL || inputLen <= 0)
+ {
+ return 0; /* nothing to do */
+ }
+
+ numBlocks = inputLen / 128;
+
+ switch (cipher->mode)
+ {
+ case RIJNDAEL_MODE_ECB:
+ for (i = numBlocks; i > 0; i--)
+ {
+ rijndaelDecrypt (key->rk, key->Nr, input, outBuffer);
+ input += 16;
+ outBuffer += 16;
+ }
+ break;
+
+ case RIJNDAEL_MODE_CBC:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ rijndaelDecrypt (key->rk, key->Nr, input, block);
+ ((uint32_t *) block)[0] ^= ((uint32_t *) iv)[0];
+ ((uint32_t *) block)[1] ^= ((uint32_t *) iv)[1];
+ ((uint32_t *) block)[2] ^= ((uint32_t *) iv)[2];
+ ((uint32_t *) block)[3] ^= ((uint32_t *) iv)[3];
+ memcpy (cipher->IV, input, 16);
+ memcpy (outBuffer, block, 16);
+ input += 16;
+ outBuffer += 16;
+ }
+ break;
+
+ case RIJNDAEL_MODE_CFB1:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ memcpy (outBuffer, input, 16);
+ for (k = 0; k < 128; k++)
+ {
+ rijndaelEncrypt (key->ek, key->Nr, iv, block);
+ for (t = 0; t < 15; t++)
+ {
+ iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7);
+ }
+ iv[15] = (iv[15] << 1) | ((input[k >> 3] >> (7 - (k & 7))) & 1);
+ outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7);
+ }
+ outBuffer += 16;
+ input += 16;
+ }
+ break;
+
+ default:
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+
+ return 128 * numBlocks;
+}
+
+int
+rijndaelPadDecrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input,
+ size_t inputOctets, char *outBuffer)
+{
+ size_t i, numBlocks, padLen;
+ char block[16];
+
+ if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_ENCRYPT)
+ {
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+ if (input == NULL || inputOctets <= 0)
+ {
+ return 0; /* nothing to do */
+ }
+ if (inputOctets % 16 != 0)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+
+ numBlocks = inputOctets / 16;
+
+ switch (cipher->mode)
+ {
+ case RIJNDAEL_MODE_ECB:
+ /* all blocks but last */
+ for (i = numBlocks - 1; i > 0; i--)
+ {
+ rijndaelDecrypt (key->rk, key->Nr, input, outBuffer);
+ input += 16;
+ outBuffer += 16;
+ }
+ /* last block */
+ rijndaelDecrypt (key->rk, key->Nr, input, block);
+ padLen = block[15];
+ if (padLen >= 16)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+ for (i = 16 - padLen; i < 16; i++)
+ {
+ if (block[i] != padLen)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+ }
+ memcpy (outBuffer, block, 16 - padLen);
+ break;
+
+ case RIJNDAEL_MODE_CBC:
+ /* all blocks but last */
+ for (i = numBlocks - 1; i > 0; i--)
+ {
+ rijndaelDecrypt (key->rk, key->Nr, input, block);
+ ((uint32_t *) block)[0] ^= ((uint32_t *) cipher->IV)[0];
+ ((uint32_t *) block)[1] ^= ((uint32_t *) cipher->IV)[1];
+ ((uint32_t *) block)[2] ^= ((uint32_t *) cipher->IV)[2];
+ ((uint32_t *) block)[3] ^= ((uint32_t *) cipher->IV)[3];
+ memcpy (cipher->IV, input, 16);
+ memcpy (outBuffer, block, 16);
+ input += 16;
+ outBuffer += 16;
+ }
+ /* last block */
+ rijndaelDecrypt (key->rk, key->Nr, input, block);
+ ((uint32_t *) block)[0] ^= ((uint32_t *) cipher->IV)[0];
+ ((uint32_t *) block)[1] ^= ((uint32_t *) cipher->IV)[1];
+ ((uint32_t *) block)[2] ^= ((uint32_t *) cipher->IV)[2];
+ ((uint32_t *) block)[3] ^= ((uint32_t *) cipher->IV)[3];
+ padLen = block[15];
+ if (padLen <= 0 || padLen > 16)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+ for (i = 16 - padLen; i < 16; i++)
+ {
+ if (block[i] != padLen)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+ }
+ memcpy (outBuffer, block, 16 - padLen);
+ break;
+
+ default:
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+
+ return 16 * numBlocks - padLen;
+}
diff --git a/gnulib/lib/rijndael-api-fst.h b/gnulib/lib/rijndael-api-fst.h
new file mode 100644
index 00000000..218cbd2a
--- /dev/null
+++ b/gnulib/lib/rijndael-api-fst.h
@@ -0,0 +1,207 @@
+/* rijndael-api-fst.h --- Rijndael cipher implementation.
+ * Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that 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 file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson. */
+
+/**
+ * rijndael-api-fst.h
+ *
+ * @version 2.9 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Acknowledgements:
+ *
+ * We are deeply indebted to the following people for their bug reports,
+ * fixes, and improvement suggestions to this implementation. Though we
+ * tried to list all contributions, we apologise in advance for any
+ * missing reference.
+ *
+ * Andrew Bales <Andrew.Bales@Honeywell.com>
+ * Markus Friedl <markus.friedl@informatik.uni-erlangen.de>
+ * John Skodon <skodonj@webquill.com>
+ */
+
+#ifndef __RIJNDAEL_API_FST_H
+#define __RIJNDAEL_API_FST_H
+
+#include "rijndael-alg-fst.h"
+
+#include <stdio.h>
+
+/* Default number of bits in a cipher block */
+#define RIJNDAEL_BITSPERBLOCK 128
+
+/* Number of ASCII char's needed to represent a key */
+#define RIJNDAEL_MAX_KEY_SIZE 64
+
+/* Number bytes needed to represent an IV */
+#define RIJNDAEL_MAX_IV_SIZE 16
+
+typedef enum
+{
+ /* Key direction is invalid, e.g., unknown value */
+ RIJNDAEL_BAD_KEY_DIR = -1,
+ /* Key material not of correct length */
+ RIJNDAEL_BAD_KEY_MAT = -2,
+ /* Key passed is not valid */
+ RIJNDAEL_BAD_KEY_INSTANCE = -3,
+ /* Params struct passed to cipherInit invalid */
+ RIJNDAEL_BAD_CIPHER_MODE = -4,
+ /* Cipher in wrong state (e.g., not initialized) */
+ RIJNDAEL_BAD_CIPHER_STATE = -5,
+ RIJNDAEL_BAD_BLOCK_LENGTH = -6,
+ RIJNDAEL_BAD_CIPHER_INSTANCE = -7,
+ /* Data contents are invalid, e.g., invalid padding */
+ RIJNDAEL_BAD_DATA = -8,
+ /* Unknown error */
+ RIJNDAEL_BAD_OTHER = -9
+} rijndael_rc;
+
+typedef enum
+{
+ RIJNDAEL_DIR_ENCRYPT = 0, /* Are we encrypting? */
+ RIJNDAEL_DIR_DECRYPT = 1 /* Are we decrypting? */
+} rijndael_direction;
+
+typedef enum
+{
+ RIJNDAEL_MODE_ECB = 1, /* Are we ciphering in ECB mode? */
+ RIJNDAEL_MODE_CBC = 2, /* Are we ciphering in CBC mode? */
+ RIJNDAEL_MODE_CFB1 = 3 /* Are we ciphering in 1-bit CFB mode? */
+} rijndael_mode;
+
+/* The structure for key information */
+typedef struct
+{
+ /* Key used for encrypting or decrypting? */
+ rijndael_direction direction;
+ /* Length of the key */
+ size_t keyLen;
+ /* Raw key data in ASCII, e.g., user input or KAT values */
+ char keyMaterial[RIJNDAEL_MAX_KEY_SIZE + 1];
+ /* key-length-dependent number of rounds */
+ int Nr;
+ /* key schedule */
+ uint32_t rk[4 * (RIJNDAEL_MAXNR + 1)];
+ /* CFB1 key schedule (encryption only) */
+ uint32_t ek[4 * (RIJNDAEL_MAXNR + 1)];
+} rijndaelKeyInstance;
+
+/* The structure for cipher information */
+typedef struct
+{ /* changed order of the components */
+ rijndael_mode mode; /* MODE_ECB, MODE_CBC, or MODE_CFB1 */
+ /* A possible Initialization Vector for ciphering */
+ char IV[RIJNDAEL_MAX_IV_SIZE];
+} rijndaelCipherInstance;
+
+/* Function prototypes */
+
+/* Create KEY, for encryption or decryption depending on DIRECTION,
+ from KEYMATERIAL, a hex string, of KEYLEN size. KEYLEN should be
+ 128, 192 or 256. Returns 0 on success, or an error code. */
+extern rijndael_rc
+rijndaelMakeKey (rijndaelKeyInstance *key, rijndael_direction direction,
+ size_t keyLen, const char *keyMaterial);
+
+/* Initialize cipher state CIPHER for encryption MODE (e.g.,
+ RIJNDAEL_MODE_CBC) with initialization vector IV, a hex string of
+ 2*RIJNDAEL_MAX_IV_SIZE length. IV may be NULL for modes that do
+ not need an IV (i.e., RIJNDAEL_MODE_ECB). */
+extern rijndael_rc
+rijndaelCipherInit (rijndaelCipherInstance *cipher,
+ rijndael_mode mode, const char *IV);
+
+/* Encrypt data in INPUT, of INPUTLEN/8 bytes length, placing the
+ output in the pre-allocated OUTBUFFER which must hold at least
+ INPUTLEN/8 bytes of data. The CIPHER is used as state, and must be
+ initialized with rijndaelCipherInit before calling this function.
+ The encryption KEY must be initialized with rijndaelMakeKey before
+ calling this function. Return the number of bits written, or a
+ negative rijndael_rc error code. */
+extern int
+rijndaelBlockEncrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input, size_t inputLen,
+ char *outBuffer);
+
+/* Encrypt data in INPUT, of INPUTOCTETS bytes length, placing the
+ output in the pre-allocated OUTBUFFER which must hold at least
+ INPUTOCTETS aligned to the next block size boundary.
+ Ciphertext-Stealing as described in RFC 2040 is used to encrypt
+ partial blocks. The CIPHER is used as state, and must be
+ initialized with rijndaelCipherInit before calling this function.
+ The encryption KEY must be initialized with rijndaelMakeKey before
+ calling this function. Return the number of bits written, or a
+ negative rijndael_rc error code. */
+extern int
+rijndaelPadEncrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input, size_t inputOctets,
+ char *outBuffer);
+
+/* Decrypt data in INPUT, of INPUTLEN/8 bytes length, placing the
+ output in the pre-allocated OUTBUFFER which must hold at least
+ INPUTLEN/8 bytes of data. The CIPHER is used as state, and must be
+ initialized with rijndaelCipherInit before calling this function.
+ The encryption KEY must be initialized with rijndaelMakeKey before
+ calling this function. Return the number of bits written, or a
+ negative rijndael_rc error code. */
+extern int
+rijndaelBlockDecrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input, size_t inputLen,
+ char *outBuffer);
+
+/* Decrypt data in INPUT, of INPUTOCTETS bytes length, placing the
+ output in the pre-allocated OUTBUFFER which must hold at least
+ INPUTOCTETS aligned to the next block size boundary.
+ Ciphertext-Stealing as described in RFC 2040 is used to encrypt
+ partial blocks. The CIPHER is used as state, and must be
+ initialized with rijndaelCipherInit before calling this function.
+ The encryption KEY must be initialized with rijndaelMakeKey before
+ calling this function. Return the number of bits written, or a
+ negative rijndael_rc error code. */
+extern int
+rijndaelPadDecrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input, size_t inputOctets,
+ char *outBuffer);
+
+#endif /* __RIJNDAEL_API_FST_H */
diff --git a/gnulib/lib/rmdir.c b/gnulib/lib/rmdir.c
new file mode 100644
index 00000000..36a61180
--- /dev/null
+++ b/gnulib/lib/rmdir.c
@@ -0,0 +1,99 @@
+/* Work around rmdir bugs.
+
+ Copyright (C) 1988, 1990, 1999, 2003-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#undef rmdir
+
+/* Remove directory DIR.
+ Return 0 if successful, -1 if not. */
+
+int
+rpl_rmdir (char const *dir)
+{
+#if HAVE_RMDIR
+ /* Work around cygwin 1.5.x bug where rmdir("dir/./") succeeds. */
+ size_t len = strlen (dir);
+ int result;
+ while (len && ISSLASH (dir[len - 1]))
+ len--;
+ if (len && dir[len - 1] == '.' && (1 == len || ISSLASH (dir[len - 2])))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ result = rmdir (dir);
+ /* Work around mingw bug, where rmdir("file/") fails with EINVAL
+ instead of ENOTDIR. We've already filtered out trailing ., the
+ only reason allowed by POSIX for EINVAL. */
+ if (result == -1 && errno == EINVAL)
+ errno = ENOTDIR;
+ return result;
+
+#else /* !HAVE_RMDIR */
+ /* rmdir adapted from GNU tar. FIXME: Delete this implementation in
+ 2010 if no one reports a system with missing rmdir. */
+ pid_t cpid;
+ int status;
+ struct stat statbuf;
+
+ if (stat (dir, &statbuf) != 0)
+ return -1; /* errno already set */
+
+ if (!S_ISDIR (statbuf.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+
+ cpid = fork ();
+ switch (cpid)
+ {
+ case -1: /* cannot fork */
+ return -1; /* errno already set */
+
+ case 0: /* child process */
+ execl ("/bin/rmdir", "rmdir", dir, (char *) 0);
+ _exit (1);
+
+ default: /* parent process */
+
+ /* Wait for kid to finish. */
+
+ while (wait (&status) != cpid)
+ /* Do nothing. */ ;
+
+ if (status)
+ {
+
+ /* /bin/rmdir failed. */
+
+ errno = EIO;
+ return -1;
+ }
+ return 0;
+ }
+#endif /* !HAVE_RMDIR */
+}
diff --git a/gnulib/lib/round.c b/gnulib/lib/round.c
new file mode 100644
index 00000000..c935ddc1
--- /dev/null
+++ b/gnulib/lib/round.c
@@ -0,0 +1,154 @@
+/* Round toward nearest, breaking ties away from zero.
+ Copyright (C) 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2007.
+ Based heavily on code by Bruno Haible. */
+
+#include <config.h>
+
+#include <float.h>
+#include <math.h>
+
+#ifdef USE_LONG_DOUBLE
+# define ROUND roundl
+# define FLOOR floorl
+# define CEIL ceill
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define L_(literal) literal##L
+# define HAVE_FLOOR_AND_CEIL HAVE_FLOORL_AND_CEILL
+#elif ! defined USE_FLOAT
+# define ROUND round
+# define FLOOR floor
+# define CEIL ceil
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define L_(literal) literal
+# define HAVE_FLOOR_AND_CEIL 1
+#else /* defined USE_FLOAT */
+# define ROUND roundf
+# define FLOOR floorf
+# define CEIL ceilf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define L_(literal) literal##f
+# define HAVE_FLOOR_AND_CEIL HAVE_FLOORF_AND_CEILF
+#endif
+
+/* If we're being included from test-round2[f].c, it already defined names for
+ our round implementations. Otherwise, pick the preferred implementation for
+ this machine. */
+#if !defined FLOOR_BASED_ROUND && !defined FLOOR_FREE_ROUND
+# if HAVE_FLOOR_AND_CEIL
+# define FLOOR_BASED_ROUND ROUND
+# else
+# define FLOOR_FREE_ROUND ROUND
+# endif
+#endif
+
+#ifdef FLOOR_BASED_ROUND
+/* An implementation of the C99 round function based on floor and ceil. We use
+ this when floor and ceil are available, on the assumption that they are
+ faster than the open-coded versions below. */
+DOUBLE
+FLOOR_BASED_ROUND (DOUBLE x)
+{
+ if (x >= L_(0.0))
+ {
+ DOUBLE y = FLOOR (x);
+ if (x - y >= L_(0.5))
+ y += L_(1.0);
+ return y;
+ }
+ else
+ {
+ DOUBLE y = CEIL (x);
+ if (y - x >= L_(0.5))
+ y -= L_(1.0);
+ return y;
+ }
+}
+#endif /* FLOOR_BASED_ROUND */
+
+#ifdef FLOOR_FREE_ROUND
+/* An implementation of the C99 round function without floor or ceil.
+ We use this when floor or ceil is missing. */
+DOUBLE
+FLOOR_FREE_ROUND (DOUBLE x)
+{
+ /* 2^(MANT_DIG-1). */
+ static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+ /* The use of 'volatile' guarantees that excess precision bits are dropped at
+ each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and
+ compiler option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding error for x = 0.5 - 2^(-MANT_DIG-1). */
+ if (z < L_(0.5))
+ z = L_(0.0);
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ else if (z < TWO_MANT_DIG)
+ {
+ /* Add 0.5 to the absolute value. */
+ y = z += L_(0.5);
+ /* Round to the next integer (nearest or up or down, doesn't
+ matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding error for x = -(0.5 - 2^(-MANT_DIG-1)). */
+ if (z > - L_(0.5))
+ z = L_(0.0);
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ else if (z > -TWO_MANT_DIG)
+ {
+ /* Add 0.5 to the absolute value. */
+ y = z -= L_(0.5);
+ /* Round to the next integer (nearest or up or down, doesn't
+ matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
+#endif /* FLOOR_FREE_ROUND */
+
diff --git a/gnulib/lib/roundf.c b/gnulib/lib/roundf.c
new file mode 100644
index 00000000..bc87e4df
--- /dev/null
+++ b/gnulib/lib/roundf.c
@@ -0,0 +1,19 @@
+/* Round toward nearest, breaking ties away from zero.
+ Copyright (C) 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#define USE_FLOAT
+#include "round.c"
diff --git a/gnulib/lib/roundl.c b/gnulib/lib/roundl.c
new file mode 100644
index 00000000..256dfe61
--- /dev/null
+++ b/gnulib/lib/roundl.c
@@ -0,0 +1,19 @@
+/* Round toward nearest, breaking ties away from zero.
+ Copyright (C) 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#define USE_LONG_DOUBLE
+#include "round.c"
diff --git a/gnulib/lib/rpmatch.c b/gnulib/lib/rpmatch.c
new file mode 100644
index 00000000..e6a1fc76
--- /dev/null
+++ b/gnulib/lib/rpmatch.c
@@ -0,0 +1,173 @@
+/* Determine whether string value is affirmation or negative response
+ according to current locale's data.
+
+ Copyright (C) 1996, 1998, 2000, 2002-2003, 2006-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#if ENABLE_NLS
+# include <sys/types.h>
+# include <limits.h>
+# include <string.h>
+# if HAVE_LANGINFO_YESEXPR
+# include <langinfo.h>
+# endif
+# include <regex.h>
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+# define N_(msgid) gettext_noop (msgid)
+
+# if HAVE_LANGINFO_YESEXPR
+/* Return the localized regular expression pattern corresponding to
+ ENGLISH_PATTERN. NL_INDEX can be used with nl_langinfo.
+ The resulting string may only be used until the next nl_langinfo call. */
+static const char *
+localized_pattern (const char *english_pattern, nl_item nl_index,
+ bool posixly_correct)
+{
+ const char *translated_pattern;
+
+ /* We prefer to get the patterns from a PO file. It would be possible to
+ always use nl_langinfo (YESEXPR) instead of _("^[yY]"), and
+ nl_langinfo (NOEXPR) instead of _("^[nN]"), if we could assume that the
+ system's locale support is good. But this is not the case e.g. on Cygwin.
+ The localizations of gnulib.pot are of better quality in general.
+ Also, if we use locale info from non-free systems that don't have a
+ 'localedef' command, we deprive the users of the freedom to localize
+ this pattern for their preferred language.
+ But some programs, such as 'cp', 'mv', 'rm', 'find', 'xargs', are
+ specified by POSIX to use nl_langinfo (YESEXPR). We implement this
+ behaviour if POSIXLY_CORRECT is set, for the sake of these programs. */
+
+ /* If the user wants strict POSIX compliance, use nl_langinfo. */
+ if (posixly_correct)
+ {
+ translated_pattern = nl_langinfo (nl_index);
+ /* Check against a broken system return value. */
+ if (translated_pattern != NULL && translated_pattern[0] != '\0')
+ return translated_pattern;
+ }
+
+ /* Look in the gnulib message catalog. */
+ translated_pattern = _(english_pattern);
+ if (translated_pattern == english_pattern)
+ {
+ /* The gnulib message catalog provides no translation.
+ Try the system's message catalog. */
+ translated_pattern = nl_langinfo (nl_index);
+ /* Check against a broken system return value. */
+ if (translated_pattern != NULL && translated_pattern[0] != '\0')
+ return translated_pattern;
+ /* Fall back to English. */
+ translated_pattern = english_pattern;
+ }
+ return translated_pattern;
+}
+# else
+# define localized_pattern(english_pattern,nl_index,posixly_correct) \
+ _(english_pattern)
+# endif
+
+static int
+try (const char *response, const char *pattern, char **lastp, regex_t *re)
+{
+ if (*lastp == NULL || strcmp (pattern, *lastp) != 0)
+ {
+ char *safe_pattern;
+
+ /* The pattern has changed. */
+ if (*lastp != NULL)
+ {
+ /* Free the old compiled pattern. */
+ regfree (re);
+ free (*lastp);
+ *lastp = NULL;
+ }
+ /* Put the PATTERN into safe memory before calling regcomp.
+ (regcomp may call nl_langinfo, overwriting PATTERN's storage. */
+ safe_pattern = strdup (pattern);
+ if (safe_pattern == NULL)
+ return -1;
+ /* Compile the pattern and cache it for future runs. */
+ if (regcomp (re, safe_pattern, REG_EXTENDED) != 0)
+ return -1;
+ *lastp = safe_pattern;
+ }
+
+ /* See if the regular expression matches RESPONSE. */
+ return regexec (re, response, 0, NULL, 0) == 0;
+}
+#endif
+
+
+int
+rpmatch (const char *response)
+{
+#if ENABLE_NLS
+ /* Match against one of the response patterns, compiling the pattern
+ first if necessary. */
+
+ /* We cache the response patterns and compiled regexps here. */
+ static char *last_yesexpr, *last_noexpr;
+ static regex_t cached_yesre, cached_nore;
+
+# if HAVE_LANGINFO_YESEXPR
+ bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
+# endif
+
+ const char *yesexpr, *noexpr;
+ int result;
+
+ /* TRANSLATORS: A regular expression testing for an affirmative answer
+ (english: "yes"). Testing the first character may be sufficient.
+ Take care to consider upper and lower case.
+ To enquire the regular expression that your system uses for this
+ purpose, you can use the command
+ locale -k LC_MESSAGES | grep '^yesexpr=' */
+ yesexpr = localized_pattern (N_("^[yY]"), YESEXPR, posixly_correct);
+ result = try (response, yesexpr, &last_yesexpr, &cached_yesre);
+ if (result < 0)
+ return -1;
+ if (result)
+ return 1;
+
+ /* TRANSLATORS: A regular expression testing for a negative answer
+ (english: "no"). Testing the first character may be sufficient.
+ Take care to consider upper and lower case.
+ To enquire the regular expression that your system uses for this
+ purpose, you can use the command
+ locale -k LC_MESSAGES | grep '^noexpr=' */
+ noexpr = localized_pattern (N_("^[nN]"), NOEXPR, posixly_correct);
+ result = try (response, noexpr, &last_noexpr, &cached_nore);
+ if (result < 0)
+ return -1;
+ if (result)
+ return 0;
+
+ return -1;
+#else
+ /* Test against "^[yY]" and "^[nN]", hardcoded to avoid requiring regex */
+ return (*response == 'y' || *response == 'Y' ? 1
+ : *response == 'n' || *response == 'N' ? 0 : -1);
+#endif
+}
diff --git a/gnulib/lib/safe-alloc.c b/gnulib/lib/safe-alloc.c
new file mode 100644
index 00000000..c37dd08a
--- /dev/null
+++ b/gnulib/lib/safe-alloc.c
@@ -0,0 +1,121 @@
+/* safe-alloc.c: safer memory allocation
+
+ Copyright (C) 2009, 2010 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 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/>. */
+
+/* Written by Daniel Berrange <berrange@redhat.com>, 2008 */
+
+#include <config.h>
+
+/* Specification. */
+#include "safe-alloc.h"
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <errno.h>
+
+
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+ to size arithmetic overflow. S must be positive and N must be
+ nonnegative. This is a macro, not an inline function, so that it
+ works correctly even when SIZE_MAX < N.
+
+ By gnulib convention, SIZE_MAX represents overflow in size
+ calculations, so the conservative dividend to use here is
+ SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
+ However, malloc (SIZE_MAX) fails on all known hosts where
+ sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
+ exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+ branch when S is known to be 1.
+
+ This is the same as xalloc_oversized from xalloc.h
+*/
+#define safe_alloc_oversized(n, s) \
+ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+
+
+/**
+ * safe_alloc_alloc_n:
+ * @ptrptr: pointer to pointer for address of allocated memory
+ * @size: number of bytes to allocate
+ * @count: number of elements to allocate
+ *
+ * Allocate an array of memory 'count' elements long,
+ * each with 'size' bytes. Return the address of the
+ * allocated memory in 'ptrptr'. The newly allocated
+ * memory is filled with zeros.
+ *
+ * Return -1 on failure to allocate, zero on success
+ */
+int
+safe_alloc_alloc_n (void *ptrptr, size_t size, size_t count, int zeroed)
+{
+ if (size == 0 || count == 0)
+ {
+ *(void **) ptrptr = NULL;
+ return 0;
+ }
+
+ if (safe_alloc_oversized (count, size))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ if (zeroed)
+ *(void **) ptrptr = calloc (count, size);
+ else
+ *(void **) ptrptr = malloc (count * size);
+
+ if (*(void **) ptrptr == NULL)
+ return -1;
+ return 0;
+}
+
+/**
+ * safe_alloc_realloc_n:
+ * @ptrptr: pointer to pointer for address of allocated memory
+ * @size: number of bytes to allocate
+ * @count: number of elements in array
+ *
+ * Resize the block of memory in 'ptrptr' to be an array of
+ * 'count' elements, each 'size' bytes in length. Update 'ptrptr'
+ * with the address of the newly allocated memory. On failure,
+ * 'ptrptr' is not changed and still points to the original memory
+ * block. The newly allocated memory is filled with zeros.
+ *
+ * Return -1 on failure to allocate, zero on success
+ */
+int
+safe_alloc_realloc_n (void *ptrptr, size_t size, size_t count)
+{
+ void *tmp;
+ if (size == 0 || count == 0)
+ {
+ free (*(void **) ptrptr);
+ *(void **) ptrptr = NULL;
+ return 0;
+ }
+ if (safe_alloc_oversized (count, size))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ tmp = realloc (*(void **) ptrptr, size * count);
+ if (!tmp)
+ return -1;
+ *(void **) ptrptr = tmp;
+ return 0;
+}
diff --git a/gnulib/lib/safe-alloc.h b/gnulib/lib/safe-alloc.h
new file mode 100644
index 00000000..fb53db31
--- /dev/null
+++ b/gnulib/lib/safe-alloc.h
@@ -0,0 +1,121 @@
+/* safe-alloc.h: safer memory allocation
+
+ Copyright (C) 2009, 2010 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 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/>. */
+
+/* Written by Daniel Berrange <berrange@redhat.com>, 2008 */
+
+#ifndef SAFE_ALLOC_H_
+# define SAFE_ALLOC_H_
+
+# include <stdlib.h>
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+# ifndef ATTRIBUTE_RETURN_CHECK
+# if __GNUC_PREREQ (3, 4)
+# define ATTRIBUTE_RETURN_CHECK __attribute__((__warn_unused_result__))
+# else
+# define ATTRIBUTE_RETURN_CHECK
+# endif
+# endif
+
+/* Don't call these directly - use the macros below */
+int
+safe_alloc_alloc_n (void *ptrptr, size_t size, size_t count, int zeroed)
+ ATTRIBUTE_RETURN_CHECK;
+
+int
+safe_alloc_realloc_n (void *ptrptr, size_t size, size_t count)
+ ATTRIBUTE_RETURN_CHECK;
+
+/**
+ * ALLOC:
+ * @ptr: pointer to hold address of allocated memory
+ *
+ * Allocate sizeof(*ptr) bytes of memory and store
+ * the address of allocated memory in 'ptr'. Fill the
+ * newly allocated memory with zeros.
+ *
+ * Return -1 on failure to allocate, zero on success
+ */
+# define ALLOC(ptr) \
+ safe_alloc_alloc_n (&(ptr), sizeof(*(ptr)), 1, 1)
+
+/**
+ * ALLOC_N:
+ * @ptr: pointer to hold address of allocated memory
+ * @count: number of elements to allocate
+ *
+ * Allocate an array of 'count' elements, each sizeof(*ptr)
+ * bytes long and store the address of allocated memory in
+ * 'ptr'. Fill the newly allocated memory with zeros.
+ *
+ * Return -1 on failure, 0 on success
+ */
+# define ALLOC_N(ptr, count) \
+ safe_alloc_alloc_n (&(ptr), sizeof(*(ptr)), (count), 1)
+
+/**
+ * ALLOC_N_UNINITIALIZED:
+ * @ptr: pointer to hold address of allocated memory
+ * @count: number of elements to allocate
+ *
+ * Allocate an array of 'count' elements, each sizeof(*ptr)
+ * bytes long and store the address of allocated memory in
+ * 'ptr'. Do not initialize the new memory at all.
+ *
+ * Return -1 on failure to allocate, zero on success
+ */
+# define ALLOC_N_UNINITIALIZED(ptr, count) \
+ safe_alloc_alloc_n (&(ptr), sizeof(*(ptr)), (count), 0)
+
+/**
+ * REALLOC_N:
+ * @ptr: pointer to hold address of allocated memory
+ * @count: number of elements to allocate
+ *
+ * Re-allocate an array of 'count' elements, each sizeof(*ptr)
+ * bytes long and store the address of allocated memory in
+ * 'ptr'. Fill the newly allocated memory with zeros
+ *
+ * Return -1 on failure to reallocate, zero on success
+ */
+# define REALLOC_N(ptr, count) \
+ safe_alloc_realloc_n (&(ptr), sizeof(*(ptr)), (count))
+
+/**
+ * FREE:
+ * @ptr: pointer holding address to be freed
+ *
+ * Free the memory stored in 'ptr' and update to point
+ * to NULL.
+ */
+# define FREE(ptr) \
+ do \
+ { \
+ free (ptr); \
+ (ptr) = NULL; \
+ } \
+ while(0)
+
+#endif /* SAFE_ALLOC_H_ */
diff --git a/gnulib/lib/safe-read.c b/gnulib/lib/safe-read.c
new file mode 100644
index 00000000..855be677
--- /dev/null
+++ b/gnulib/lib/safe-read.c
@@ -0,0 +1,77 @@
+/* An interface to read and write that retries after interrupts.
+
+ Copyright (C) 1993-1994, 1998, 2002-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef SAFE_WRITE
+# include "safe-write.h"
+#else
+# include "safe-read.h"
+#endif
+
+/* Get ssize_t. */
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <errno.h>
+
+#ifdef EINTR
+# define IS_EINTR(x) ((x) == EINTR)
+#else
+# define IS_EINTR(x) 0
+#endif
+
+#include <limits.h>
+
+#ifdef SAFE_WRITE
+# define safe_rw safe_write
+# define rw write
+#else
+# define safe_rw safe_read
+# define rw read
+# undef const
+# define const /* empty */
+#endif
+
+/* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
+ interrupted. Return the actual number of bytes read(written), zero for EOF,
+ or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error. */
+size_t
+safe_rw (int fd, void const *buf, size_t count)
+{
+ /* Work around a bug in Tru64 5.1. Attempting to read more than
+ INT_MAX bytes fails with errno == EINVAL. See
+ <http://lists.gnu.org/archive/html/bug-gnu-utils/2002-04/msg00010.html>.
+ When decreasing COUNT, keep it block-aligned. */
+ enum { BUGGY_READ_MAXIMUM = INT_MAX & ~8191 };
+
+ for (;;)
+ {
+ ssize_t result = rw (fd, buf, count);
+
+ if (0 <= result)
+ return result;
+ else if (IS_EINTR (errno))
+ continue;
+ else if (errno == EINVAL && BUGGY_READ_MAXIMUM < count)
+ count = BUGGY_READ_MAXIMUM;
+ else
+ return result;
+ }
+}
diff --git a/gnulib/lib/safe-read.h b/gnulib/lib/safe-read.h
new file mode 100644
index 00000000..1f15b018
--- /dev/null
+++ b/gnulib/lib/safe-read.h
@@ -0,0 +1,34 @@
+/* An interface to read() that retries after interrupts.
+ Copyright (C) 2002, 2006, 2009-2010 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/>. */
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define SAFE_READ_ERROR ((size_t) -1)
+
+/* Read up to COUNT bytes at BUF from descriptor FD, retrying if interrupted.
+ Return the actual number of bytes read, zero for EOF, or SAFE_READ_ERROR
+ upon error. */
+extern size_t safe_read (int fd, void *buf, size_t count);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/safe-write.c b/gnulib/lib/safe-write.c
new file mode 100644
index 00000000..a2c3b4df
--- /dev/null
+++ b/gnulib/lib/safe-write.c
@@ -0,0 +1,18 @@
+/* An interface to write that retries after interrupts.
+ Copyright (C) 2002, 2009-2010 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/>. */
+
+#define SAFE_WRITE
+#include "safe-read.c"
diff --git a/gnulib/lib/safe-write.h b/gnulib/lib/safe-write.h
new file mode 100644
index 00000000..185f6603
--- /dev/null
+++ b/gnulib/lib/safe-write.h
@@ -0,0 +1,24 @@
+/* An interface to write() that retries after interrupts.
+ Copyright (C) 2002, 2009-2010 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/>. */
+
+#include <stddef.h>
+
+#define SAFE_WRITE_ERROR ((size_t) -1)
+
+/* Write up to COUNT bytes at BUF to descriptor FD, retrying if interrupted.
+ Return the actual number of bytes written, zero for EOF, or SAFE_WRITE_ERROR
+ upon error. */
+extern size_t safe_write (int fd, const void *buf, size_t count);
diff --git a/gnulib/lib/same-inode.h b/gnulib/lib/same-inode.h
new file mode 100644
index 00000000..e978abbe
--- /dev/null
+++ b/gnulib/lib/same-inode.h
@@ -0,0 +1,25 @@
+/* Determine whether two stat buffers refer to the same file.
+
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+#ifndef SAME_INODE_H
+# define SAME_INODE_H 1
+
+# define SAME_INODE(Stat_buf_1, Stat_buf_2) \
+ ((Stat_buf_1).st_ino == (Stat_buf_2).st_ino \
+ && (Stat_buf_1).st_dev == (Stat_buf_2).st_dev)
+
+#endif
diff --git a/gnulib/lib/same.c b/gnulib/lib/same.c
new file mode 100644
index 00000000..1abc55c8
--- /dev/null
+++ b/gnulib/lib/same.c
@@ -0,0 +1,123 @@
+/* Determine whether two file names refer to the same file.
+
+ Copyright (C) 1997-2000, 2002-2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include <string.h>
+
+#include <limits.h>
+#ifndef _POSIX_NAME_MAX
+# define _POSIX_NAME_MAX 14
+#endif
+
+#include "same.h"
+#include "dirname.h"
+#include "error.h"
+#include "same-inode.h"
+
+#ifndef MIN
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/* Return nonzero if SOURCE and DEST point to the same name in the same
+ directory. */
+
+bool
+same_name (const char *source, const char *dest)
+{
+ /* Compare the basenames. */
+ char const *source_basename = last_component (source);
+ char const *dest_basename = last_component (dest);
+ size_t source_baselen = base_len (source_basename);
+ size_t dest_baselen = base_len (dest_basename);
+ bool identical_basenames =
+ (source_baselen == dest_baselen
+ && memcmp (source_basename, dest_basename, dest_baselen) == 0);
+ bool compare_dirs = identical_basenames;
+ bool same = false;
+
+#if ! _POSIX_NO_TRUNC && HAVE_PATHCONF && defined _PC_NAME_MAX
+ /* This implementation silently truncates components of file names. If
+ the base names might be truncated, check whether the truncated
+ base names are the same, while checking the directories. */
+ size_t slen_max = HAVE_LONG_FILE_NAMES ? 255 : _POSIX_NAME_MAX;
+ size_t min_baselen = MIN (source_baselen, dest_baselen);
+ if (slen_max <= min_baselen
+ && memcmp (source_basename, dest_basename, slen_max) == 0)
+ compare_dirs = true;
+#endif
+
+ if (compare_dirs)
+ {
+ struct stat source_dir_stats;
+ struct stat dest_dir_stats;
+ char *source_dirname, *dest_dirname;
+
+ /* Compare the parent directories (via the device and inode numbers). */
+ source_dirname = dir_name (source);
+ dest_dirname = dir_name (dest);
+
+ if (stat (source_dirname, &source_dir_stats))
+ {
+ /* Shouldn't happen. */
+ error (1, errno, "%s", source_dirname);
+ }
+
+ if (stat (dest_dirname, &dest_dir_stats))
+ {
+ /* Shouldn't happen. */
+ error (1, errno, "%s", dest_dirname);
+ }
+
+ same = SAME_INODE (source_dir_stats, dest_dir_stats);
+
+#if ! _POSIX_NO_TRUNC && HAVE_PATHCONF && defined _PC_NAME_MAX
+ if (same && ! identical_basenames)
+ {
+ long name_max = (errno = 0, pathconf (dest_dirname, _PC_NAME_MAX));
+ if (name_max < 0)
+ {
+ if (errno)
+ {
+ /* Shouldn't happen. */
+ error (1, errno, "%s", dest_dirname);
+ }
+ same = false;
+ }
+ else
+ same = (name_max <= min_baselen
+ && memcmp (source_basename, dest_basename, name_max) == 0);
+ }
+#endif
+
+ free (source_dirname);
+ free (dest_dirname);
+ }
+
+ return same;
+}
diff --git a/gnulib/lib/same.h b/gnulib/lib/same.h
new file mode 100644
index 00000000..39d708cd
--- /dev/null
+++ b/gnulib/lib/same.h
@@ -0,0 +1,25 @@
+/* Determine whether two file names refer to the same file.
+
+ Copyright (C) 1997-2000, 2003-2004, 2009-2010 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/>. */
+
+#ifndef SAME_H_
+# define SAME_H_ 1
+
+# include <stdbool.h>
+
+bool same_name (const char *source, const char *dest);
+
+#endif /* SAME_H_ */
diff --git a/gnulib/lib/save-cwd.c b/gnulib/lib/save-cwd.c
new file mode 100644
index 00000000..7394d50a
--- /dev/null
+++ b/gnulib/lib/save-cwd.c
@@ -0,0 +1,109 @@
+/* save-cwd.c -- Save and restore current working directory.
+
+ Copyright (C) 1995, 1997-1998, 2003-2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "save-cwd.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "chdir-long.h"
+#include "unistd--.h"
+#include "xgetcwd.h"
+
+#if GNULIB_FCNTL_SAFER
+# include "fcntl--.h"
+#else
+# define GNULIB_FCNTL_SAFER 0
+#endif
+
+/* On systems without the fchdir function (WOE), pretend that open
+ always returns -1 so that save_cwd resorts to using xgetcwd.
+ Since chdir_long requires fchdir, use chdir instead. */
+#if !HAVE_FCHDIR
+# undef open
+# define open(File, Flags) (-1)
+# undef fchdir
+# define fchdir(Fd) (abort (), -1)
+# undef chdir_long
+# define chdir_long(Dir) chdir (Dir)
+#endif
+
+/* Record the location of the current working directory in CWD so that
+ the program may change to other directories and later use restore_cwd
+ to return to the recorded location. This function may allocate
+ space using malloc (via xgetcwd) or leave a file descriptor open;
+ use free_cwd to perform the necessary free or close. Upon failure,
+ no memory is allocated, any locally opened file descriptors are
+ closed; return non-zero -- in that case, free_cwd need not be
+ called, but doing so is ok. Otherwise, return zero.
+
+ The `raison d'etre' for this interface is that the working directory
+ is sometimes inaccessible, and getcwd is not robust or as efficient.
+ So, we prefer to use the open/fchdir approach, but fall back on
+ getcwd if necessary.
+
+ Some systems lack fchdir altogether: e.g., OS/2, pre-2001 Cygwin,
+ SCO Xenix. Also, SunOS 4 and Irix 5.3 provide the function, yet it
+ doesn't work for partitions on which auditing is enabled. If
+ you're still using an obsolete system with these problems, please
+ send email to the maintainer of this code. */
+
+int
+save_cwd (struct saved_cwd *cwd)
+{
+ cwd->name = NULL;
+
+ cwd->desc = open (".", O_RDONLY);
+ if (!GNULIB_FCNTL_SAFER)
+ cwd->desc = fd_safer (cwd->desc);
+ if (cwd->desc < 0)
+ {
+ cwd->name = xgetcwd ();
+ return cwd->name ? 0 : -1;
+ }
+
+ return 0;
+}
+
+/* Change to recorded location, CWD, in directory hierarchy.
+ Upon failure, return -1 (errno is set by chdir or fchdir).
+ Upon success, return zero. */
+
+int
+restore_cwd (const struct saved_cwd *cwd)
+{
+ if (0 <= cwd->desc)
+ return fchdir (cwd->desc);
+ else
+ return chdir_long (cwd->name);
+}
+
+void
+free_cwd (struct saved_cwd *cwd)
+{
+ if (cwd->desc >= 0)
+ close (cwd->desc);
+ free (cwd->name);
+}
diff --git a/gnulib/lib/save-cwd.h b/gnulib/lib/save-cwd.h
new file mode 100644
index 00000000..955f846e
--- /dev/null
+++ b/gnulib/lib/save-cwd.h
@@ -0,0 +1,34 @@
+/* Save and restore current working directory.
+
+ Copyright (C) 1995, 1997-1998, 2003, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef SAVE_CWD_H
+# define SAVE_CWD_H 1
+
+struct saved_cwd
+ {
+ int desc;
+ char *name;
+ };
+
+int save_cwd (struct saved_cwd *cwd);
+int restore_cwd (const struct saved_cwd *cwd);
+void free_cwd (struct saved_cwd *cwd);
+
+#endif /* SAVE_CWD_H */
diff --git a/gnulib/lib/savedir.c b/gnulib/lib/savedir.c
new file mode 100644
index 00000000..538f397c
--- /dev/null
+++ b/gnulib/lib/savedir.c
@@ -0,0 +1,130 @@
+/* savedir.c -- save the list of files in a directory in a string
+
+ Copyright (C) 1990, 1997-2001, 2003-2006, 2009-2010 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/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+#include "savedir.h"
+
+#include <sys/types.h>
+
+#include <errno.h>
+
+#include "dirent--.h"
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+
+#ifndef NAME_SIZE_DEFAULT
+# define NAME_SIZE_DEFAULT 512
+#endif
+
+/* Return a freshly allocated string containing the file names
+ in directory DIRP, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if DIRP cannot be read or closed.
+ If DIRP is NULL, return NULL without affecting errno. */
+
+static char *
+savedirstream (DIR *dirp)
+{
+ char *name_space;
+ size_t allocated = NAME_SIZE_DEFAULT;
+ size_t used = 0;
+ int save_errno;
+
+ if (dirp == NULL)
+ return NULL;
+
+ name_space = xmalloc (allocated);
+
+ for (;;)
+ {
+ struct dirent const *dp;
+ char const *entry;
+
+ errno = 0;
+ dp = readdir (dirp);
+ if (! dp)
+ break;
+
+ /* Skip "", ".", and "..". "" is returned by at least one buggy
+ implementation: Solaris 2.4 readdir on NFS file systems. */
+ entry = dp->d_name;
+ if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0')
+ {
+ size_t entry_size = _D_EXACT_NAMLEN (dp) + 1;
+ if (used + entry_size < used)
+ xalloc_die ();
+ if (allocated <= used + entry_size)
+ {
+ do
+ {
+ if (2 * allocated < allocated)
+ xalloc_die ();
+ allocated *= 2;
+ }
+ while (allocated <= used + entry_size);
+
+ name_space = xrealloc (name_space, allocated);
+ }
+ memcpy (name_space + used, entry, entry_size);
+ used += entry_size;
+ }
+ }
+ name_space[used] = '\0';
+ save_errno = errno;
+ if (closedir (dirp) != 0)
+ save_errno = errno;
+ if (save_errno != 0)
+ {
+ free (name_space);
+ errno = save_errno;
+ return NULL;
+ }
+ return name_space;
+}
+
+/* Return a freshly allocated string containing the file names
+ in directory DIR, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if DIR cannot be opened, read, or closed. */
+
+char *
+savedir (char const *dir)
+{
+ return savedirstream (opendir (dir));
+}
+
+/* Return a freshly allocated string containing the file names
+ in directory FD, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if FD cannot be read or closed. */
+
+char *
+fdsavedir (int fd)
+{
+ return savedirstream (fdopendir (fd));
+}
diff --git a/gnulib/lib/savedir.h b/gnulib/lib/savedir.h
new file mode 100644
index 00000000..fb11f90b
--- /dev/null
+++ b/gnulib/lib/savedir.h
@@ -0,0 +1,27 @@
+/* Save the list of files in a directory in a string.
+
+ Copyright (C) 1997, 1999, 2001, 2003, 2005, 2009-2010 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/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#if !defined SAVEDIR_H_
+# define SAVEDIR_H_
+
+char *savedir (char const *dir);
+char *fdsavedir (int fd);
+
+#endif
diff --git a/gnulib/lib/savewd.c b/gnulib/lib/savewd.c
new file mode 100644
index 00000000..e111207b
--- /dev/null
+++ b/gnulib/lib/savewd.c
@@ -0,0 +1,305 @@
+/* Save and restore the working directory, possibly using a child process.
+
+ Copyright (C) 2006-2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "savewd.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "dirname.h"
+#include "fcntl-safer.h"
+
+/* Save the working directory into *WD, if it hasn't been saved
+ already. Return true if a child has been forked to do the real
+ work. */
+static bool
+savewd_save (struct savewd *wd)
+{
+ switch (wd->state)
+ {
+ case INITIAL_STATE:
+ /* Save the working directory, or prepare to fall back if possible. */
+ {
+ int fd = open_safer (".", O_RDONLY);
+ if (0 <= fd)
+ {
+ wd->state = FD_STATE;
+ wd->val.fd = fd;
+ break;
+ }
+ if (errno != EACCES && errno != ESTALE)
+ {
+ wd->state = ERROR_STATE;
+ wd->val.errnum = errno;
+ break;
+ }
+ }
+ wd->state = FORKING_STATE;
+ wd->val.child = -1;
+ /* Fall through. */
+ case FORKING_STATE:
+ if (wd->val.child < 0)
+ {
+ /* "Save" the initial working directory by forking a new
+ subprocess that will attempt all the work from the chdir
+ until until the next savewd_restore. */
+ wd->val.child = fork ();
+ if (wd->val.child != 0)
+ {
+ if (0 < wd->val.child)
+ return true;
+ wd->state = ERROR_STATE;
+ wd->val.errnum = errno;
+ }
+ }
+ break;
+
+ case FD_STATE:
+ case FD_POST_CHDIR_STATE:
+ case ERROR_STATE:
+ case FINAL_STATE:
+ break;
+
+ default:
+ assert (false);
+ }
+
+ return false;
+}
+
+int
+savewd_chdir (struct savewd *wd, char const *dir, int options,
+ int open_result[2])
+{
+ int fd = -1;
+ int result = 0;
+
+ /* Open the directory if requested, or if avoiding a race condition
+ is requested and possible. */
+ if (open_result
+ || (options & (HAVE_WORKING_O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0)))
+ {
+ fd = open (dir,
+ (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
+ | (options & SAVEWD_CHDIR_NOFOLLOW ? O_NOFOLLOW : 0)));
+
+ if (open_result)
+ {
+ open_result[0] = fd;
+ open_result[1] = errno;
+ }
+
+ if (fd < 0 && (errno != EACCES || (options & SAVEWD_CHDIR_READABLE)))
+ result = -1;
+ }
+
+ if (result == 0 && ! (0 <= fd && options & SAVEWD_CHDIR_SKIP_READABLE))
+ {
+ if (savewd_save (wd))
+ {
+ open_result = NULL;
+ result = -2;
+ }
+ else
+ {
+ result = (fd < 0 ? chdir (dir) : fchdir (fd));
+
+ if (result == 0)
+ switch (wd->state)
+ {
+ case FD_STATE:
+ wd->state = FD_POST_CHDIR_STATE;
+ break;
+
+ case ERROR_STATE:
+ case FD_POST_CHDIR_STATE:
+ case FINAL_STATE:
+ break;
+
+ case FORKING_STATE:
+ assert (wd->val.child == 0);
+ break;
+
+ default:
+ assert (false);
+ }
+ }
+ }
+
+ if (0 <= fd && ! open_result)
+ {
+ int e = errno;
+ close (fd);
+ errno = e;
+ }
+
+ return result;
+}
+
+int
+savewd_restore (struct savewd *wd, int status)
+{
+ switch (wd->state)
+ {
+ case INITIAL_STATE:
+ case FD_STATE:
+ /* The working directory is the desired directory, so there's no
+ work to do. */
+ break;
+
+ case FD_POST_CHDIR_STATE:
+ /* Restore the working directory using fchdir. */
+ if (fchdir (wd->val.fd) == 0)
+ {
+ wd->state = FD_STATE;
+ break;
+ }
+ else
+ {
+ int chdir_errno = errno;
+ close (wd->val.fd);
+ wd->state = ERROR_STATE;
+ wd->val.errnum = chdir_errno;
+ }
+ /* Fall through. */
+ case ERROR_STATE:
+ /* Report an error if asked to restore the working directory. */
+ errno = wd->val.errnum;
+ return -1;
+
+ case FORKING_STATE:
+ /* "Restore" the working directory by waiting for the subprocess
+ to finish. */
+ {
+ pid_t child = wd->val.child;
+ if (child == 0)
+ _exit (status);
+ if (0 < child)
+ {
+ int child_status;
+ while (waitpid (child, &child_status, 0) < 0)
+ assert (errno == EINTR);
+ wd->val.child = -1;
+ if (! WIFEXITED (child_status))
+ raise (WTERMSIG (child_status));
+ return WEXITSTATUS (child_status);
+ }
+ }
+ break;
+
+ default:
+ assert (false);
+ }
+
+ return 0;
+}
+
+void
+savewd_finish (struct savewd *wd)
+{
+ switch (wd->state)
+ {
+ case INITIAL_STATE:
+ case ERROR_STATE:
+ break;
+
+ case FD_STATE:
+ case FD_POST_CHDIR_STATE:
+ close (wd->val.fd);
+ break;
+
+ case FORKING_STATE:
+ assert (wd->val.child < 0);
+ break;
+
+ default:
+ assert (false);
+ }
+
+ wd->state = FINAL_STATE;
+}
+
+/* Return true if the actual work is currently being done by a
+ subprocess.
+
+ A true return means that the caller and the subprocess should
+ resynchronize later with savewd_restore, using only their own
+ memory to decide when to resynchronize; they should not consult the
+ file system to decide, because that might lead to race conditions.
+ This is why savewd_chdir is broken out into another function;
+ savewd_chdir's callers _can_ inspect the file system to decide
+ whether to call savewd_chdir. */
+static inline bool
+savewd_delegating (struct savewd const *wd)
+{
+ return wd->state == FORKING_STATE && 0 < wd->val.child;
+}
+
+int
+savewd_process_files (int n_files, char **file,
+ int (*act) (char *, struct savewd *, void *),
+ void *options)
+{
+ int i = 0;
+ int last_relative;
+ int exit_status = EXIT_SUCCESS;
+ struct savewd wd;
+ savewd_init (&wd);
+
+ for (last_relative = n_files - 1; 0 <= last_relative; last_relative--)
+ if (! IS_ABSOLUTE_FILE_NAME (file[last_relative]))
+ break;
+
+ for (; i < last_relative; i++)
+ {
+ if (! savewd_delegating (&wd))
+ {
+ int s = act (file[i], &wd, options);
+ if (exit_status < s)
+ exit_status = s;
+ }
+
+ if (! IS_ABSOLUTE_FILE_NAME (file[i + 1]))
+ {
+ int r = savewd_restore (&wd, exit_status);
+ if (exit_status < r)
+ exit_status = r;
+ }
+ }
+
+ savewd_finish (&wd);
+
+ for (; i < n_files; i++)
+ {
+ int s = act (file[i], &wd, options);
+ if (exit_status < s)
+ exit_status = s;
+ }
+
+ return exit_status;
+}
diff --git a/gnulib/lib/savewd.h b/gnulib/lib/savewd.h
new file mode 100644
index 00000000..5ec703db
--- /dev/null
+++ b/gnulib/lib/savewd.h
@@ -0,0 +1,148 @@
+/* Save and restore the working directory, possibly using a subprocess.
+
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef SAVEWD_H
+# define SAVEWD_H 1
+
+#include <stdbool.h>
+#include <sys/types.h>
+
+/* A saved working directory. The member names and constants defined
+ by this structure are private to the savewd module. */
+struct savewd
+{
+ /* The state of this object. */
+ enum
+ {
+ /* This object has been created but does not yet represent
+ the working directory. */
+ INITIAL_STATE,
+
+ /* val.fd is the original working directory's file descriptor.
+ It is still the working directory. */
+ FD_STATE,
+
+ /* Like FD_STATE, but the working directory has changed, so
+ restoring it will require a fchdir. */
+ FD_POST_CHDIR_STATE,
+
+ /* Fork and let the subprocess do the work. val.child is 0 in a
+ child, negative in a childless parent, and the child process
+ ID in a parent with a child. */
+ FORKING_STATE,
+
+ /* A serious problem argues against further efforts. val.errnum
+ contains the error number (e.g., EIO). */
+ ERROR_STATE,
+
+ /* savewd_finish has been called, so the application no longer
+ cares whether the working directory is saved, and there is no
+ more work to do. */
+ FINAL_STATE
+ } state;
+
+ /* The object's value. */
+ union
+ {
+ int fd;
+ int errnum;
+ pid_t child;
+ } val;
+};
+
+/* Initialize a saved working directory object. */
+static inline void
+savewd_init (struct savewd *wd)
+{
+ wd->state = INITIAL_STATE;
+}
+
+
+/* Options for savewd_chdir. */
+enum
+ {
+ /* Do not follow symbolic links, if supported. */
+ SAVEWD_CHDIR_NOFOLLOW = 1,
+
+ /* The directory should be readable, so fail if it happens to be
+ discovered that the directory is not readable. (Unreadable
+ directories are not necessarily diagnosed, though.) */
+ SAVEWD_CHDIR_READABLE = 2,
+
+ /* Do not chdir if the directory is readable; simply succeed
+ without invoking chdir if the directory was opened. */
+ SAVEWD_CHDIR_SKIP_READABLE = 4
+ };
+
+/* Change the directory, and if successful, record into *WD the fact
+ that the process chdired into DIR. A process using this module
+ should use savewd_chdir rather than chdir or fchdir. Obey the
+ options specified in OPTIONS.
+
+ If OPEN_RESULT is not null, store into OPEN_RESULT[0] a file
+ descriptor that accesses DIR if a file descriptor is successfully
+ obtained. Store -1 otherwise, setting OPEN_RESULT[1] to the error
+ number. Store through OPEN_RESULT regardless of whether the chdir
+ is successful. However, when -2 is returned, the contents of
+ OPEN_RESULT are indeterminate since the file descriptor is closed
+ in the parent.
+
+ Return -2 if a subprocess was spun off to do the real work, -1
+ (setting errno) if unsuccessful, 0 if successful. */
+int savewd_chdir (struct savewd *wd, char const *dir, int options,
+ int open_result[2]);
+
+/* Restore the working directory from *WD. STATUS indicates the exit
+ status corresponding to the work done since the last save; this is
+ used when the caller is in a subprocess. Return 0 if successful,
+ -1 (setting errno) on our failure, a positive subprocess exit
+ status if the working directory was restored in the parent but the
+ subprocess failed. */
+int savewd_restore (struct savewd *wd, int status);
+
+/* Return WD's error number, or 0 if WD is not in an error state. */
+static inline int
+savewd_errno (struct savewd const *wd)
+{
+ return (wd->state == ERROR_STATE ? wd->val.errnum : 0);
+}
+
+/* Deallocate any resources associated with WD. A program that chdirs
+ should restore before finishing. */
+void savewd_finish (struct savewd *wd);
+
+/* Process N_FILES file names, FILE[0] through FILE[N_FILES - 1].
+ For each file name F, call ACT (F, WD, OPTIONS); ACT should invoke
+ savewd_chdir as needed, and should return an exit status. WD
+ represents the working directory; it may be in an error state when
+ ACT is called.
+
+ Save and restore the working directory as needed by the file name
+ vector; assume that ACT does not require access to any relative
+ file names other than its first argument, and that it is OK if the
+ working directory is changed when this function returns. Some
+ actions may be applied in a subprocess.
+
+ Return the maximum exit status that any call to ACT returned, or
+ EXIT_SUCCESS (i.e., 0) if no calls were made. */
+int savewd_process_files (int n_files, char **file,
+ int (*act) (char *, struct savewd *, void *),
+ void *options);
+
+#endif
diff --git a/gnulib/lib/scandir.c b/gnulib/lib/scandir.c
new file mode 100644
index 00000000..498134f2
--- /dev/null
+++ b/gnulib/lib/scandir.c
@@ -0,0 +1,181 @@
+/* Copyright (C) 1992-1998, 2000, 2002-2003, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#if _LIBC
+# include <bits/libc-lock.h>
+#endif
+
+#if ! defined __builtin_expect && __GNUC__ < 3
+# define __builtin_expect(expr, expected) (expr)
+#endif
+
+#undef select
+
+#if _LIBC
+# ifndef SCANDIR
+# define SCANDIR scandir
+# define READDIR __readdir
+# define DIRENT_TYPE struct dirent
+# endif
+#else
+# define SCANDIR scandir
+# define READDIR readdir
+# define DIRENT_TYPE struct dirent
+# define __opendir opendir
+# define __closedir closedir
+# define __set_errno(val) errno = (val)
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary recursion in fchdir.c and opendir_safer.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use opendir_safer. */
+# undef opendir
+# undef closedir
+#endif
+
+#ifndef SCANDIR_CANCEL
+# define SCANDIR_CANCEL
+struct scandir_cancel_struct
+{
+ DIR *dp;
+ void *v;
+ size_t cnt;
+};
+
+# if _LIBC
+static void
+cancel_handler (void *arg)
+{
+ struct scandir_cancel_struct *cp = arg;
+ size_t i;
+ void **v = cp->v;
+
+ for (i = 0; i < cp->cnt; ++i)
+ free (v[i]);
+ free (v);
+ (void) __closedir (cp->dp);
+}
+# endif
+#endif
+
+
+int
+SCANDIR (const char *dir,
+ DIRENT_TYPE ***namelist,
+ int (*select) (const DIRENT_TYPE *),
+ int (*cmp) (const DIRENT_TYPE **, const DIRENT_TYPE **))
+{
+ DIR *dp = __opendir (dir);
+ DIRENT_TYPE **v = NULL;
+ size_t vsize = 0;
+ struct scandir_cancel_struct c;
+ DIRENT_TYPE *d;
+ int save;
+
+ if (dp == NULL)
+ return -1;
+
+ save = errno;
+ __set_errno (0);
+
+ c.dp = dp;
+ c.v = NULL;
+ c.cnt = 0;
+#if _LIBC
+ __libc_cleanup_push (cancel_handler, &c);
+#endif
+
+ while ((d = READDIR (dp)) != NULL)
+ {
+ int use_it = select == NULL;
+
+ if (! use_it)
+ {
+ use_it = select (d);
+ /* The select function might have changed errno. It was
+ zero before and it need to be again to make the latter
+ tests work. */
+ __set_errno (0);
+ }
+
+ if (use_it)
+ {
+ DIRENT_TYPE *vnew;
+ size_t dsize;
+
+ /* Ignore errors from select or readdir */
+ __set_errno (0);
+
+ if (__builtin_expect (c.cnt == vsize, 0))
+ {
+ DIRENT_TYPE **new;
+ if (vsize == 0)
+ vsize = 10;
+ else
+ vsize *= 2;
+ new = (DIRENT_TYPE **) realloc (v, vsize * sizeof (*v));
+ if (new == NULL)
+ break;
+ v = new;
+ c.v = (void *) v;
+ }
+
+ dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d;
+ vnew = (DIRENT_TYPE *) malloc (dsize);
+ if (vnew == NULL)
+ break;
+
+ v[c.cnt++] = (DIRENT_TYPE *) memcpy (vnew, d, dsize);
+ }
+ }
+
+ if (__builtin_expect (errno, 0) != 0)
+ {
+ save = errno;
+
+ while (c.cnt > 0)
+ free (v[--c.cnt]);
+ free (v);
+ c.cnt = -1;
+ }
+ else
+ {
+ /* Sort the list if we have a comparison function to sort with. */
+ if (cmp != NULL)
+ qsort (v, c.cnt, sizeof (*v), (int (*) (const void *, const void *)) cmp);
+
+ *namelist = v;
+ }
+
+#if _LIBC
+ __libc_cleanup_pop (0);
+#endif
+
+ (void) __closedir (dp);
+ __set_errno (save);
+
+ return c.cnt;
+}
diff --git a/gnulib/lib/sched.in.h b/gnulib/lib/sched.in.h
new file mode 100644
index 00000000..a164133b
--- /dev/null
+++ b/gnulib/lib/sched.in.h
@@ -0,0 +1,47 @@
+/* Replacement <sched.h> for platforms that lack it.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#ifndef _GL_SCHED_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SCHED_H@
+# @INCLUDE_NEXT@ @NEXT_SCHED_H@
+#endif
+
+#ifndef _GL_SCHED_H
+#define _GL_SCHED_H
+
+#if !@HAVE_STRUCT_SCHED_PARAM@
+
+struct sched_param
+{
+ int sched_priority;
+};
+
+#endif
+
+#if !(defined SCHED_FIFO && defined SCHED_RR && defined SCHED_OTHER)
+# define SCHED_FIFO 1
+# define SCHED_RR 2
+# define SCHED_OTHER 0
+#endif
+
+#endif /* _GL_SCHED_H */
+#endif /* _GL_SCHED_H */
diff --git a/gnulib/lib/se-context.in.h b/gnulib/lib/se-context.in.h
new file mode 100644
index 00000000..cb7419a5
--- /dev/null
+++ b/gnulib/lib/se-context.in.h
@@ -0,0 +1,28 @@
+#ifndef SELINUX_CONTEXT_H
+# define SELINUX_CONTEXT_H
+
+# include <errno.h>
+
+/* The definition of _GL_UNUSED_PARAMETER is copied here. */
+
+typedef int context_t;
+static inline context_t context_new (char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return 0; }
+static inline char *context_str (context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return (void *) 0; }
+static inline void context_free (context_t c _GL_UNUSED_PARAMETER) {}
+
+static inline int context_user_set (context_t sc _GL_UNUSED_PARAMETER,
+ char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int context_role_set (context_t sc _GL_UNUSED_PARAMETER,
+ char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int context_range_set (context_t sc _GL_UNUSED_PARAMETER,
+ char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int context_type_set (context_t sc _GL_UNUSED_PARAMETER,
+ char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+
+#endif
diff --git a/gnulib/lib/se-selinux.in.h b/gnulib/lib/se-selinux.in.h
new file mode 100644
index 00000000..76f7c1bf
--- /dev/null
+++ b/gnulib/lib/se-selinux.in.h
@@ -0,0 +1,75 @@
+#ifndef _GL_SELINUX_SELINUX_H
+# define _GL_SELINUX_SELINUX_H
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+# if HAVE_SELINUX_SELINUX_H
+
+#@INCLUDE_NEXT@ @NEXT_SELINUX_SELINUX_H@
+
+# else
+
+# include <sys/types.h>
+# include <errno.h>
+
+/* The definition of _GL_UNUSED_PARAMETER is copied here. */
+
+typedef unsigned short security_class_t;
+# define security_context_t char*
+# define is_selinux_enabled() 0
+
+static inline int getcon (security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline void freecon (security_context_t con _GL_UNUSED_PARAMETER) {}
+
+
+static inline int getfscreatecon (security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int setfscreatecon (security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int matchpathcon (char const *file _GL_UNUSED_PARAMETER,
+ mode_t m _GL_UNUSED_PARAMETER,
+ security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int getfilecon (char const *file _GL_UNUSED_PARAMETER,
+ security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int lgetfilecon (char const *file _GL_UNUSED_PARAMETER,
+ security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int fgetfilecon (int fd,
+ security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int setfilecon (char const *file _GL_UNUSED_PARAMETER,
+ security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int lsetfilecon (char const *file _GL_UNUSED_PARAMETER,
+ security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int fsetfilecon (int fd _GL_UNUSED_PARAMETER,
+ security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+
+static inline int security_check_context
+ (security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int security_check_context_raw
+ (security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int setexeccon (security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int security_compute_create
+ (security_context_t scon _GL_UNUSED_PARAMETER,
+ security_context_t tcon _GL_UNUSED_PARAMETER,
+ security_class_t tclass _GL_UNUSED_PARAMETER,
+ security_context_t *newcon _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int matchpathcon_init_prefix
+ (char const *path _GL_UNUSED_PARAMETER,
+ char const *prefix _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+
+# endif
+#endif /* _GL_SELINUX_SELINUX_H */
diff --git a/gnulib/lib/search.in.h b/gnulib/lib/search.in.h
new file mode 100644
index 00000000..cec7ebe9
--- /dev/null
+++ b/gnulib/lib/search.in.h
@@ -0,0 +1,131 @@
+/* A GNU-like <search.h>.
+
+ Copyright (C) 2007-2010 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/>. */
+
+#ifndef _GL_SEARCH_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SEARCH_H@
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+# @INCLUDE_NEXT@ @NEXT_SEARCH_H@
+#endif
+
+#ifndef _GL_SEARCH_H
+#define _GL_SEARCH_H
+
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_TSEARCH@
+# if @REPLACE_TSEARCH@
+# define tsearch rpl_tsearch
+# define tfind rpl_tfind
+# define tdelete rpl_tdelete
+# define twalk rpl_twalk
+# endif
+# if !@HAVE_TSEARCH@ || @REPLACE_TSEARCH@
+
+/* See <http://www.opengroup.org/susv3xbd/search.h.html>,
+ <http://www.opengroup.org/susv3xsh/tsearch.html>
+ for details. */
+
+# if !@HAVE_TSEARCH@
+typedef enum
+{
+ preorder,
+ postorder,
+ endorder,
+ leaf
+}
+VISIT;
+# endif
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+ If one is found, it is returned. Otherwise, a new element equal to KEY
+ is inserted in the tree and is returned. */
+extern void * tsearch (const void *key, void **vrootp,
+ int (*compar) (const void *, const void *))
+ _GL_ARG_NONNULL ((1, 2, 3));
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+ If one is found, it is returned. Otherwise, NULL is returned. */
+extern void * tfind (const void *key, void *const *vrootp,
+ int (*compar) (const void *, const void *))
+ _GL_ARG_NONNULL ((1, 2, 3));
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+ If one is found, it is removed from the tree, and its parent node is
+ returned. Otherwise, NULL is returned. */
+extern void * tdelete (const void *key, void **vrootp,
+ int (*compar) (const void *, const void *))
+ _GL_ARG_NONNULL ((1, 2, 3));
+
+/* Perform a depth-first, left-to-right traversal of the tree VROOT.
+ The ACTION function is called:
+ - for non-leaf nodes: 3 times, before the left subtree traversal,
+ after the left subtree traversal but before the right subtree traversal,
+ and after the right subtree traversal,
+ - for leaf nodes: once.
+ The arguments passed to ACTION are:
+ 1. the node; it can be casted to a 'const void * const *', i.e. into a
+ pointer to the key,
+ 2. an indicator which visit of the node this is,
+ 3. the level of the node in the tree (0 for the root). */
+extern void twalk (const void *vroot,
+ void (*action) (const void *, VISIT, int))
+ _GL_ARG_NONNULL ((2));
+
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef tsearch
+# if HAVE_RAW_DECL_TSEARCH
+_GL_WARN_ON_USE (tsearch, "tsearch is unportable - "
+ "use gnulib module tsearch for portability");
+# endif
+# undef tfind
+# if HAVE_RAW_DECL_TFIND
+_GL_WARN_ON_USE (tfind, "tfind is unportable - "
+ "use gnulib module tsearch for portability");
+# endif
+# undef tdelete
+# if HAVE_RAW_DECL_TDELETE
+_GL_WARN_ON_USE (tdelete, "tdelete is unportable - "
+ "use gnulib module tsearch for portability");
+# endif
+# undef twalk
+# if HAVE_RAW_DECL_TWALK
+_GL_WARN_ON_USE (twalk, "twalk is unportable - "
+ "use gnulib module tsearch for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_SEARCH_H */
+#endif /* _GL_SEARCH_H */
diff --git a/gnulib/lib/select.c b/gnulib/lib/select.c
new file mode 100644
index 00000000..35645669
--- /dev/null
+++ b/gnulib/lib/select.c
@@ -0,0 +1,489 @@
+/* Emulation for select(2)
+ Contributed by Paolo Bonzini.
+
+ Copyright 2008-2010 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+#include <alloca.h>
+#include <assert.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Win32. */
+
+#include <sys/types.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <limits.h>
+
+#include <winsock2.h>
+#include <windows.h>
+#include <io.h>
+#include <stdio.h>
+#include <conio.h>
+#include <time.h>
+
+struct bitset {
+ unsigned char in[FD_SETSIZE / CHAR_BIT];
+ unsigned char out[FD_SETSIZE / CHAR_BIT];
+};
+
+/* Declare data structures for ntdll functions. */
+typedef struct _FILE_PIPE_LOCAL_INFORMATION {
+ ULONG NamedPipeType;
+ ULONG NamedPipeConfiguration;
+ ULONG MaximumInstances;
+ ULONG CurrentInstances;
+ ULONG InboundQuota;
+ ULONG ReadDataAvailable;
+ ULONG OutboundQuota;
+ ULONG WriteQuotaAvailable;
+ ULONG NamedPipeState;
+ ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+
+typedef struct _IO_STATUS_BLOCK
+{
+ union {
+ DWORD Status;
+ PVOID Pointer;
+ } u;
+ ULONG_PTR Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef enum _FILE_INFORMATION_CLASS {
+ FilePipeLocalInformation = 24
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef DWORD (WINAPI *PNtQueryInformationFile)
+ (HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS);
+
+#ifndef PIPE_BUF
+#define PIPE_BUF 512
+#endif
+
+#define IsConsoleHandle(h) (((long) (h) & 3) == 3)
+
+static BOOL
+IsSocketHandle(HANDLE h)
+{
+ WSANETWORKEVENTS ev;
+
+ if (IsConsoleHandle (h))
+ return FALSE;
+
+ /* Under Wine, it seems that getsockopt returns 0 for pipes too.
+ WSAEnumNetworkEvents instead distinguishes the two correctly. */
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
+ return ev.lNetworkEvents != 0xDEADBEEF;
+}
+
+/* Compute output fd_sets for libc descriptor FD (whose Win32 handle is H). */
+
+static int
+win32_poll_handle (HANDLE h, int fd, struct bitset *rbits, struct bitset *wbits,
+ struct bitset *xbits)
+{
+ BOOL read, write, except;
+ int i, ret;
+ INPUT_RECORD *irbuffer;
+ DWORD avail, nbuffer;
+ BOOL bRet;
+ IO_STATUS_BLOCK iosb;
+ FILE_PIPE_LOCAL_INFORMATION fpli;
+ static PNtQueryInformationFile NtQueryInformationFile;
+ static BOOL once_only;
+
+ read = write = except = FALSE;
+ switch (GetFileType (h))
+ {
+ case FILE_TYPE_DISK:
+ read = TRUE;
+ write = TRUE;
+ break;
+
+ case FILE_TYPE_PIPE:
+ if (!once_only)
+ {
+ NtQueryInformationFile = (PNtQueryInformationFile)
+ GetProcAddress (GetModuleHandle ("ntdll.dll"),
+ "NtQueryInformationFile");
+ once_only = TRUE;
+ }
+
+ if (PeekNamedPipe (h, NULL, 0, NULL, &avail, NULL) != 0)
+ {
+ if (avail)
+ read = TRUE;
+ }
+
+ else
+ {
+ /* It was the write-end of the pipe. Check if it is writable.
+ If NtQueryInformationFile fails, optimistically assume the pipe is
+ writable. This could happen on Win9x, where NtQueryInformationFile
+ is not available, or if we inherit a pipe that doesn't permit
+ FILE_READ_ATTRIBUTES access on the write end (I think this should
+ not happen since WinXP SP2; WINE seems fine too). Otherwise,
+ ensure that enough space is available for atomic writes. */
+ memset (&iosb, 0, sizeof (iosb));
+ memset (&fpli, 0, sizeof (fpli));
+
+ if (!NtQueryInformationFile
+ || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli),
+ FilePipeLocalInformation)
+ || fpli.WriteQuotaAvailable >= PIPE_BUF
+ || (fpli.OutboundQuota < PIPE_BUF &&
+ fpli.WriteQuotaAvailable == fpli.OutboundQuota))
+ write = TRUE;
+ }
+ break;
+
+ case FILE_TYPE_CHAR:
+ write = TRUE;
+ if (!(rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ break;
+
+ ret = WaitForSingleObject (h, 0);
+ if (ret == WAIT_OBJECT_0)
+ {
+ if (!IsConsoleHandle (h))
+ {
+ read = TRUE;
+ break;
+ }
+
+ nbuffer = avail = 0;
+ bRet = GetNumberOfConsoleInputEvents (h, &nbuffer);
+
+ /* Screen buffers handles are filtered earlier. */
+ assert (bRet);
+ if (nbuffer == 0)
+ {
+ except = TRUE;
+ break;
+ }
+
+ irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD));
+ bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail);
+ if (!bRet || avail == 0)
+ {
+ except = TRUE;
+ break;
+ }
+
+ for (i = 0; i < avail; i++)
+ if (irbuffer[i].EventType == KEY_EVENT)
+ read = TRUE;
+ }
+ break;
+
+ default:
+ ret = WaitForSingleObject (h, 0);
+ write = TRUE;
+ if (ret == WAIT_OBJECT_0)
+ read = TRUE;
+
+ break;
+ }
+
+ ret = 0;
+ if (read && (rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ rbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ if (write && (wbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ wbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ if (except && (xbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ xbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ return ret;
+}
+
+int
+rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
+ struct timeval *timeout)
+{
+ static struct timeval tv0;
+ static HANDLE hEvent;
+ HANDLE h, handle_array[FD_SETSIZE + 2];
+ fd_set handle_rfds, handle_wfds, handle_xfds;
+ struct bitset rbits, wbits, xbits;
+ unsigned char anyfds_in[FD_SETSIZE / CHAR_BIT];
+ DWORD ret, wait_timeout, nhandles, nsock, nbuffer;
+ MSG msg;
+ int i, fd, rc;
+
+ if (nfds > FD_SETSIZE)
+ nfds = FD_SETSIZE;
+
+ if (!timeout)
+ wait_timeout = INFINITE;
+ else
+ {
+ wait_timeout = timeout->tv_sec + timeout->tv_usec / 1000;
+
+ /* select is also used as a portable usleep. */
+ if (!rfds && !wfds && !xfds)
+ {
+ Sleep (wait_timeout);
+ return 0;
+ }
+ }
+
+ if (!hEvent)
+ hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
+
+ handle_array[0] = hEvent;
+ nhandles = 1;
+ nsock = 0;
+
+ /* Copy descriptors to bitsets. At the same time, eliminate
+ bits in the "wrong" direction for console input buffers
+ and screen buffers, because screen buffers are waitable
+ and they will block until a character is available. */
+ memset (&rbits, 0, sizeof (rbits));
+ memset (&wbits, 0, sizeof (wbits));
+ memset (&xbits, 0, sizeof (xbits));
+ memset (anyfds_in, 0, sizeof (anyfds_in));
+ if (rfds)
+ for (i = 0; i < rfds->fd_count; i++)
+ {
+ fd = rfds->fd_array[i];
+ h = (HANDLE) _get_osfhandle (fd);
+ if (IsConsoleHandle (h)
+ && !GetNumberOfConsoleInputEvents (h, &nbuffer))
+ continue;
+
+ rbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ rfds = (fd_set *) alloca (sizeof (fd_set));
+
+ if (wfds)
+ for (i = 0; i < wfds->fd_count; i++)
+ {
+ fd = wfds->fd_array[i];
+ h = (HANDLE) _get_osfhandle (fd);
+ if (IsConsoleHandle (h)
+ && GetNumberOfConsoleInputEvents (h, &nbuffer))
+ continue;
+
+ wbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ wfds = (fd_set *) alloca (sizeof (fd_set));
+
+ if (xfds)
+ for (i = 0; i < xfds->fd_count; i++)
+ {
+ fd = xfds->fd_array[i];
+ xbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ xfds = (fd_set *) alloca (sizeof (fd_set));
+
+ /* Zero all the fd_sets, including the application's. */
+ FD_ZERO (rfds);
+ FD_ZERO (wfds);
+ FD_ZERO (xfds);
+ FD_ZERO (&handle_rfds);
+ FD_ZERO (&handle_wfds);
+ FD_ZERO (&handle_xfds);
+
+ /* Classify handles. Create fd sets for sockets, poll the others. */
+ for (i = 0; i < nfds; i++)
+ {
+ if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
+ continue;
+
+ h = (HANDLE) _get_osfhandle (i);
+ if (!h)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (IsSocketHandle (h))
+ {
+ int requested = FD_CLOSE;
+
+ /* See above; socket handles are mapped onto select, but we
+ need to map descriptors to handles. */
+ if (rbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_READ | FD_ACCEPT;
+ FD_SET ((SOCKET) h, rfds);
+ FD_SET ((SOCKET) h, &handle_rfds);
+ }
+ if (wbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_WRITE | FD_CONNECT;
+ FD_SET ((SOCKET) h, wfds);
+ FD_SET ((SOCKET) h, &handle_wfds);
+ }
+ if (xbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_OOB;
+ FD_SET ((SOCKET) h, xfds);
+ FD_SET ((SOCKET) h, &handle_xfds);
+ }
+
+ WSAEventSelect ((SOCKET) h, hEvent, requested);
+ nsock++;
+ }
+ else
+ {
+ handle_array[nhandles++] = h;
+
+ /* Poll now. If we get an event, do not wait below. */
+ if (wait_timeout != 0
+ && win32_poll_handle (h, i, &rbits, &wbits, &xbits))
+ wait_timeout = 0;
+ }
+ }
+
+ if (wait_timeout == 0 || nsock == 0)
+ rc = 0;
+ else
+ {
+ /* See if we need to wait in the loop below. If any select is ready,
+ do MsgWaitForMultipleObjects anyway to dispatch messages, but
+ no need to call select again. */
+ rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0);
+ if (rc == 0)
+ {
+ /* Restore the fd_sets for the other select we do below. */
+ memcpy (&handle_rfds, rfds, sizeof (fd_set));
+ memcpy (&handle_wfds, wfds, sizeof (fd_set));
+ memcpy (&handle_xfds, xfds, sizeof (fd_set));
+ }
+ else
+ wait_timeout = 0;
+ }
+
+ for (;;)
+ {
+ ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE,
+ wait_timeout, QS_ALLINPUT);
+
+ if (ret == WAIT_OBJECT_0 + nhandles)
+ {
+ /* new input of some other kind */
+ BOOL bRet;
+ while ((bRet = PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) != 0)
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ }
+ else
+ break;
+ }
+
+ /* If we haven't done it yet, check the status of the sockets. */
+ if (rc == 0 && nsock > 0)
+ rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0);
+
+ /* Now fill in the results. */
+ FD_ZERO (rfds);
+ FD_ZERO (wfds);
+ FD_ZERO (xfds);
+
+ /* Place a sentinel at the end of the array. */
+ handle_array[nhandles] = NULL;
+ nhandles = 1;
+ for (i = 0; i < nfds; i++)
+ {
+ if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
+ continue;
+
+ h = (HANDLE) _get_osfhandle (i);
+ if (h != handle_array[nhandles])
+ {
+ /* Perform handle->descriptor mapping. Don't update rc, as these
+ results are counted in the return value of Winsock's select. */
+ WSAEventSelect ((SOCKET) h, NULL, 0);
+ if (FD_ISSET (h, &handle_rfds))
+ FD_SET (i, rfds);
+ if (FD_ISSET (h, &handle_wfds))
+ FD_SET (i, wfds);
+ if (FD_ISSET (h, &handle_xfds))
+ FD_SET (i, xfds);
+ }
+ else
+ {
+ /* Not a socket. */
+ nhandles++;
+ win32_poll_handle (h, i, &rbits, &wbits, &xbits);
+ if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ rc++;
+ FD_SET (i, rfds);
+ }
+ if (wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ rc++;
+ FD_SET (i, wfds);
+ }
+ if (xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ rc++;
+ FD_SET (i, xfds);
+ }
+ }
+ }
+
+ return rc;
+}
+
+#else /* ! Native Win32. */
+
+#include <sys/select.h>
+
+#undef select
+
+int
+rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
+ struct timeval *timeout)
+{
+ /* Interix 3.5 has a bug: it does not support nfds == 0. */
+ if (nfds == 0)
+ {
+ nfds = 1;
+ rfds = NULL;
+ wfds = NULL;
+ xfds = NULL;
+ }
+ return select (nfds, rfds, wfds, xfds, timeout);
+}
+
+#endif
diff --git a/gnulib/lib/selinux-at.c b/gnulib/lib/selinux-at.c
new file mode 100644
index 00000000..beac4b08
--- /dev/null
+++ b/gnulib/lib/selinux-at.c
@@ -0,0 +1,72 @@
+/* openat-style fd-relative functions for SE Linux
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "selinux-at.h"
+#include "openat.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "save-cwd.h"
+
+#include "openat-priv.h"
+
+#define AT_FUNC_NAME getfileconat
+#define AT_FUNC_F1 getfilecon
+#define AT_FUNC_POST_FILE_PARAM_DECLS , security_context_t *con
+#define AT_FUNC_POST_FILE_ARGS , con
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+
+#define AT_FUNC_NAME lgetfileconat
+#define AT_FUNC_F1 lgetfilecon
+#define AT_FUNC_POST_FILE_PARAM_DECLS , security_context_t *con
+#define AT_FUNC_POST_FILE_ARGS , con
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+
+#define AT_FUNC_NAME setfileconat
+#define AT_FUNC_F1 setfilecon
+#define AT_FUNC_POST_FILE_PARAM_DECLS , security_context_t con
+#define AT_FUNC_POST_FILE_ARGS , con
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+
+#define AT_FUNC_NAME lsetfileconat
+#define AT_FUNC_F1 lsetfilecon
+#define AT_FUNC_POST_FILE_PARAM_DECLS , security_context_t con
+#define AT_FUNC_POST_FILE_ARGS , con
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
diff --git a/gnulib/lib/selinux-at.h b/gnulib/lib/selinux-at.h
new file mode 100644
index 00000000..9931680e
--- /dev/null
+++ b/gnulib/lib/selinux-at.h
@@ -0,0 +1,52 @@
+/* Prototypes for openat-style fd-relative SELinux functions
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+#include <selinux/selinux.h>
+#include <selinux/context.h>
+
+/* These are the dir-fd-relative variants of the functions without the
+ "at" suffix. For example, getfileconat (AT_FDCWD, file, &c) is usually
+ equivalent to getfilecon (file, &c). The emulation is accomplished
+ by first attempting getfilecon ("/proc/self/fd/DIR_FD/FILE", &c).
+ Failing that, simulate it via save_cwd/fchdir/getfilecon/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero. */
+
+/* dir-fd-relative getfilecon. Set *CON to the SELinux security context
+ of the file specified by DIR_FD and FILE and return the length of *CON.
+ DIR_FD and FILE are interpreted as for fstatat[*]. A non-NULL *CON
+ must be freed with freecon. Upon error, set *CON to NULL, set errno
+ and return -1.
+ [*] with flags=0 here, with flags=AT_SYMLINK_NOFOLLOW for lgetfileconat */
+int getfileconat (int dir_fd, char const *file, security_context_t *con);
+
+/* dir-fd-relative lgetfilecon. This function is just like getfileconat,
+ except when DIR_FD and FILE specify a symlink: lgetfileconat operates on
+ the symlink, while getfileconat operates on the referent of the symlink. */
+int lgetfileconat (int dir_fd, char const *file, security_context_t *con);
+
+/* dir-fd-relative setfilecon. Set the SELinux security context of
+ the file specified by DIR_FD and FILE to CON. DIR_FD and FILE are
+ interpreted as for fstatat[*]. Upon success, return 0.
+ Otherwise, return -1 and set errno. */
+int setfileconat (int dir_fd, char const *file, security_context_t con);
+
+/* dir-fd-relative lsetfilecon. This function is just like setfileconat,
+ except that rather than dereferencing a symlink, this function affects it. */
+/* dir-fd-relative lsetfilecon. This function is just like setfileconat,
+ except when DIR_FD and FILE specify a symlink: lsetfileconat operates on
+ the symlink, while setfileconat operates on the referent of the symlink. */
+int lsetfileconat (int dir_fd, char const *file, security_context_t con);
diff --git a/gnulib/lib/send.c b/gnulib/lib/send.c
new file mode 100644
index 00000000..83e2e8e6
--- /dev/null
+++ b/gnulib/lib/send.c
@@ -0,0 +1,40 @@
+/* send.c --- wrappers for Windows send function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef send
+
+int
+rpl_send (int fd, const void *buf, int len, int flags)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = send (sock, buf, len, flags);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/sendto.c b/gnulib/lib/sendto.c
new file mode 100644
index 00000000..3acf45e0
--- /dev/null
+++ b/gnulib/lib/sendto.c
@@ -0,0 +1,41 @@
+/* sendto.c --- wrappers for Windows sendto function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef sendto
+
+int
+rpl_sendto (int fd, const void *buf, int len, int flags,
+ struct sockaddr *to, int tolen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = sendto (sock, buf, len, flags, to, tolen);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/set-mode-acl.c b/gnulib/lib/set-mode-acl.c
new file mode 100644
index 00000000..c5b4726e
--- /dev/null
+++ b/gnulib/lib/set-mode-acl.c
@@ -0,0 +1,593 @@
+/* set-mode-acl.c - set access control list equivalent to a mode
+
+ Copyright (C) 2002-2003, 2005-2010 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/>.
+
+ Written by Paul Eggert and Andreas Gruenbacher, and Bruno Haible. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include "acl-internal.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+
+/* If DESC is a valid file descriptor use fchmod to change the
+ file's mode to MODE on systems that have fchown. On systems
+ that don't have fchown and if DESC is invalid, use chown on
+ NAME instead.
+ Return 0 if successful. Return -1 and set errno upon failure. */
+
+int
+chmod_or_fchmod (const char *name, int desc, mode_t mode)
+{
+ if (HAVE_FCHMOD && desc != -1)
+ return fchmod (desc, mode);
+ else
+ return chmod (name, mode);
+}
+
+/* Set the access control lists of a file. If DESC is a valid file
+ descriptor, use file descriptor operations where available, else use
+ filename based operations on NAME. If access control lists are not
+ available, fchmod the target file to MODE. Also sets the
+ non-permission bits of the destination file (S_ISUID, S_ISGID, S_ISVTX)
+ to those from MODE if any are set.
+ Return 0 if successful. Return -1 and set errno upon failure. */
+
+int
+qset_acl (char const *name, int desc, mode_t mode)
+{
+#if USE_ACL
+# if HAVE_ACL_GET_FILE
+ /* POSIX 1003.1e draft 17 (abandoned) specific version. */
+ /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+# if MODE_INSIDE_ACL
+ /* Linux, FreeBSD, IRIX, Tru64 */
+
+ /* We must also have acl_from_text and acl_delete_def_file.
+ (acl_delete_def_file could be emulated with acl_init followed
+ by acl_set_file, but acl_set_file with an empty acl is
+ unspecified.) */
+
+# ifndef HAVE_ACL_FROM_TEXT
+# error Must have acl_from_text (see POSIX 1003.1e draft 17).
+# endif
+# ifndef HAVE_ACL_DELETE_DEF_FILE
+# error Must have acl_delete_def_file (see POSIX 1003.1e draft 17).
+# endif
+
+ acl_t acl;
+ int ret;
+
+ if (HAVE_ACL_FROM_MODE) /* Linux */
+ {
+ acl = acl_from_mode (mode);
+ if (!acl)
+ return -1;
+ }
+ else /* FreeBSD, IRIX, Tru64 */
+ {
+ /* If we were to create the ACL using the functions acl_init(),
+ acl_create_entry(), acl_set_tag_type(), acl_set_qualifier(),
+ acl_get_permset(), acl_clear_perm[s](), acl_add_perm(), we
+ would need to create a qualifier. I don't know how to do this.
+ So create it using acl_from_text(). */
+
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+ char acl_text[] = "u::---,g::---,o::---,";
+# else /* FreeBSD, IRIX */
+ char acl_text[] = "u::---,g::---,o::---";
+# endif
+
+ if (mode & S_IRUSR) acl_text[ 3] = 'r';
+ if (mode & S_IWUSR) acl_text[ 4] = 'w';
+ if (mode & S_IXUSR) acl_text[ 5] = 'x';
+ if (mode & S_IRGRP) acl_text[10] = 'r';
+ if (mode & S_IWGRP) acl_text[11] = 'w';
+ if (mode & S_IXGRP) acl_text[12] = 'x';
+ if (mode & S_IROTH) acl_text[17] = 'r';
+ if (mode & S_IWOTH) acl_text[18] = 'w';
+ if (mode & S_IXOTH) acl_text[19] = 'x';
+
+ acl = acl_from_text (acl_text);
+ if (!acl)
+ return -1;
+ }
+ if (HAVE_ACL_SET_FD && desc != -1)
+ ret = acl_set_fd (desc, acl);
+ else
+ ret = acl_set_file (name, ACL_TYPE_ACCESS, acl);
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+ acl_free (acl);
+
+ if (ACL_NOT_WELL_SUPPORTED (errno))
+ return chmod_or_fchmod (name, desc, mode);
+ else
+ {
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ else
+ acl_free (acl);
+
+ if (S_ISDIR (mode) && acl_delete_def_file (name))
+ return -1;
+
+ if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+ {
+ /* We did not call chmod so far, so the special bits have not yet
+ been set. */
+ return chmod_or_fchmod (name, desc, mode);
+ }
+ return 0;
+
+# else /* !MODE_INSIDE_ACL */
+ /* MacOS X */
+
+# if !HAVE_ACL_TYPE_EXTENDED
+# error Must have ACL_TYPE_EXTENDED
+# endif
+
+ /* On MacOS X, acl_get_file (name, ACL_TYPE_ACCESS)
+ and acl_get_file (name, ACL_TYPE_DEFAULT)
+ always return NULL / EINVAL. You have to use
+ acl_get_file (name, ACL_TYPE_EXTENDED)
+ or acl_get_fd (open (name, ...))
+ to retrieve an ACL.
+ On the other hand,
+ acl_set_file (name, ACL_TYPE_ACCESS, acl)
+ and acl_set_file (name, ACL_TYPE_DEFAULT, acl)
+ have the same effect as
+ acl_set_file (name, ACL_TYPE_EXTENDED, acl):
+ Each of these calls sets the file's ACL. */
+
+ acl_t acl;
+ int ret;
+
+ /* Remove the ACL if the file has ACLs. */
+ if (HAVE_ACL_GET_FD && desc != -1)
+ acl = acl_get_fd (desc);
+ else
+ acl = acl_get_file (name, ACL_TYPE_EXTENDED);
+ if (acl)
+ {
+ acl_free (acl);
+
+ acl = acl_init (0);
+ if (acl)
+ {
+ if (HAVE_ACL_SET_FD && desc != -1)
+ ret = acl_set_fd (desc, acl);
+ else
+ ret = acl_set_file (name, ACL_TYPE_EXTENDED, acl);
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+
+ acl_free (acl);
+
+ if (ACL_NOT_WELL_SUPPORTED (saved_errno))
+ return chmod_or_fchmod (name, desc, mode);
+ else
+ {
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ acl_free (acl);
+ }
+ }
+
+ /* Since !MODE_INSIDE_ACL, we have to call chmod explicitly. */
+ return chmod_or_fchmod (name, desc, mode);
+# endif
+
+# elif HAVE_ACL && defined GETACLCNT /* Solaris, Cygwin, not HP-UX */
+
+# if defined ACL_NO_TRIVIAL
+ /* Solaris 10 (newer version), which has additional API declared in
+ <sys/acl.h> (acl_t) and implemented in libsec (acl_set, acl_trivial,
+ acl_fromtext, ...). */
+
+ acl_t *aclp;
+ char acl_text[] = "user::---,group::---,mask:---,other:---";
+ int ret;
+ int saved_errno;
+
+ if (mode & S_IRUSR) acl_text[ 6] = 'r';
+ if (mode & S_IWUSR) acl_text[ 7] = 'w';
+ if (mode & S_IXUSR) acl_text[ 8] = 'x';
+ if (mode & S_IRGRP) acl_text[17] = acl_text[26] = 'r';
+ if (mode & S_IWGRP) acl_text[18] = acl_text[27] = 'w';
+ if (mode & S_IXGRP) acl_text[19] = acl_text[28] = 'x';
+ if (mode & S_IROTH) acl_text[36] = 'r';
+ if (mode & S_IWOTH) acl_text[37] = 'w';
+ if (mode & S_IXOTH) acl_text[38] = 'x';
+
+ if (acl_fromtext (acl_text, &aclp) != 0)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ ret = (desc < 0 ? acl_set (name, aclp) : facl_set (desc, aclp));
+ saved_errno = errno;
+ acl_free (aclp);
+ if (ret < 0)
+ {
+ if (saved_errno == ENOSYS || saved_errno == EOPNOTSUPP)
+ return chmod_or_fchmod (name, desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+
+ if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+ {
+ /* We did not call chmod so far, so the special bits have not yet
+ been set. */
+ return chmod_or_fchmod (name, desc, mode);
+ }
+ return 0;
+
+# else /* Solaris, Cygwin, general case */
+
+# ifdef ACE_GETACL
+ /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
+ file systems (whereas the other ones are used in UFS file systems). */
+
+ /* The flags in the ace_t structure changed in a binary incompatible way
+ when ACL_NO_TRIVIAL etc. were introduced in <sys/acl.h> version 1.15.
+ How to distinguish the two conventions at runtime?
+ We fetch the existing ACL. In the old convention, usually three ACEs have
+ a_flags = ACE_OWNER / ACE_GROUP / ACE_OTHER, in the range 0x0100..0x0400.
+ In the new convention, these values are not used. */
+ int convention;
+
+ {
+ int count;
+ ace_t *entries;
+
+ for (;;)
+ {
+ if (desc != -1)
+ count = facl (desc, ACE_GETACLCNT, 0, NULL);
+ else
+ count = acl (name, ACE_GETACLCNT, 0, NULL);
+ if (count <= 0)
+ {
+ convention = -1;
+ break;
+ }
+ entries = (ace_t *) malloc (count * sizeof (ace_t));
+ if (entries == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ if ((desc != -1
+ ? facl (desc, ACE_GETACL, count, entries)
+ : acl (name, ACE_GETACL, count, entries))
+ == count)
+ {
+ int i;
+
+ convention = 0;
+ for (i = 0; i < count; i++)
+ if (entries[i].a_flags & (ACE_OWNER | ACE_GROUP | ACE_OTHER))
+ {
+ convention = 1;
+ break;
+ }
+ free (entries);
+ break;
+ }
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ free (entries);
+ }
+ }
+
+ if (convention >= 0)
+ {
+ ace_t entries[3];
+ int ret;
+
+ if (convention)
+ {
+ /* Running on Solaris 10. */
+ entries[0].a_type = ALLOW;
+ entries[0].a_flags = ACE_OWNER;
+ entries[0].a_who = 0; /* irrelevant */
+ entries[0].a_access_mask = (mode >> 6) & 7;
+ entries[1].a_type = ALLOW;
+ entries[1].a_flags = ACE_GROUP;
+ entries[1].a_who = 0; /* irrelevant */
+ entries[1].a_access_mask = (mode >> 3) & 7;
+ entries[2].a_type = ALLOW;
+ entries[2].a_flags = ACE_OTHER;
+ entries[2].a_who = 0;
+ entries[2].a_access_mask = mode & 7;
+ }
+ else
+ {
+ /* Running on Solaris 10 (newer version) or Solaris 11. */
+ entries[0].a_type = ACE_ACCESS_ALLOWED_ACE_TYPE;
+ entries[0].a_flags = NEW_ACE_OWNER;
+ entries[0].a_who = 0; /* irrelevant */
+ entries[0].a_access_mask =
+ (mode & 0400 ? NEW_ACE_READ_DATA : 0)
+ | (mode & 0200 ? NEW_ACE_WRITE_DATA : 0)
+ | (mode & 0100 ? NEW_ACE_EXECUTE : 0);
+ entries[1].a_type = ACE_ACCESS_ALLOWED_ACE_TYPE;
+ entries[1].a_flags = NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP;
+ entries[1].a_who = 0; /* irrelevant */
+ entries[1].a_access_mask =
+ (mode & 0040 ? NEW_ACE_READ_DATA : 0)
+ | (mode & 0020 ? NEW_ACE_WRITE_DATA : 0)
+ | (mode & 0010 ? NEW_ACE_EXECUTE : 0);
+ entries[2].a_type = ACE_ACCESS_ALLOWED_ACE_TYPE;
+ entries[2].a_flags = ACE_EVERYONE;
+ entries[2].a_who = 0;
+ entries[2].a_access_mask =
+ (mode & 0004 ? NEW_ACE_READ_DATA : 0)
+ | (mode & 0002 ? NEW_ACE_WRITE_DATA : 0)
+ | (mode & 0001 ? NEW_ACE_EXECUTE : 0);
+ }
+ if (desc != -1)
+ ret = facl (desc, ACE_SETACL,
+ sizeof (entries) / sizeof (ace_t), entries);
+ else
+ ret = acl (name, ACE_SETACL,
+ sizeof (entries) / sizeof (ace_t), entries);
+ if (ret < 0 && errno != EINVAL && errno != ENOTSUP)
+ {
+ if (errno == ENOSYS)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+ }
+# endif
+
+ {
+ aclent_t entries[3];
+ int ret;
+
+ entries[0].a_type = USER_OBJ;
+ entries[0].a_id = 0; /* irrelevant */
+ entries[0].a_perm = (mode >> 6) & 7;
+ entries[1].a_type = GROUP_OBJ;
+ entries[1].a_id = 0; /* irrelevant */
+ entries[1].a_perm = (mode >> 3) & 7;
+ entries[2].a_type = OTHER_OBJ;
+ entries[2].a_id = 0;
+ entries[2].a_perm = mode & 7;
+
+ if (desc != -1)
+ ret = facl (desc, SETACL, sizeof (entries) / sizeof (aclent_t), entries);
+ else
+ ret = acl (name, SETACL, sizeof (entries) / sizeof (aclent_t), entries);
+ if (ret < 0)
+ {
+ if (errno == ENOSYS)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+ }
+
+ if (!MODE_INSIDE_ACL || (mode & (S_ISUID | S_ISGID | S_ISVTX)))
+ {
+ /* We did not call chmod so far, so the special bits have not yet
+ been set. */
+ return chmod_or_fchmod (name, desc, mode);
+ }
+ return 0;
+
+# endif
+
+# elif HAVE_GETACL /* HP-UX */
+
+ struct stat statbuf;
+ struct acl_entry entries[3];
+ int ret;
+
+ if (desc != -1)
+ ret = fstat (desc, &statbuf);
+ else
+ ret = stat (name, &statbuf);
+ if (ret < 0)
+ return -1;
+
+ entries[0].uid = statbuf.st_uid;
+ entries[0].gid = ACL_NSGROUP;
+ entries[0].mode = (mode >> 6) & 7;
+ entries[1].uid = ACL_NSUSER;
+ entries[1].gid = statbuf.st_gid;
+ entries[1].mode = (mode >> 3) & 7;
+ entries[2].uid = ACL_NSUSER;
+ entries[2].gid = ACL_NSGROUP;
+ entries[2].mode = mode & 7;
+
+ if (desc != -1)
+ ret = fsetacl (desc, sizeof (entries) / sizeof (struct acl_entry), entries);
+ else
+ ret = setacl (name, sizeof (entries) / sizeof (struct acl_entry), entries);
+ if (ret < 0)
+ {
+ if (errno == ENOSYS || errno == EOPNOTSUPP)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+
+ if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+ {
+ /* We did not call chmod so far, so the special bits have not yet
+ been set. */
+ return chmod_or_fchmod (name, desc, mode);
+ }
+ return 0;
+
+# elif HAVE_ACLX_GET && defined ACL_AIX_WIP /* AIX */
+
+ acl_type_list_t types;
+ size_t types_size = sizeof (types);
+ acl_type_t type;
+
+ if (aclx_gettypes (name, &types, &types_size) < 0
+ || types.num_entries == 0)
+ return chmod_or_fchmod (name, desc, mode);
+
+ /* XXX Do we need to clear all types of ACLs for the given file, or is it
+ sufficient to clear the first one? */
+ type = types.entries[0];
+ if (type.u64 == ACL_AIXC)
+ {
+ union { struct acl a; char room[128]; } u;
+ int ret;
+
+ u.a.acl_len = (char *) &u.a.acl_ext[0] - (char *) &u.a; /* no entries */
+ u.a.acl_mode = mode & ~(S_IXACL | 0777);
+ u.a.u_access = (mode >> 6) & 7;
+ u.a.g_access = (mode >> 3) & 7;
+ u.a.o_access = mode & 7;
+
+ if (desc != -1)
+ ret = aclx_fput (desc, SET_ACL | SET_MODE_S_BITS,
+ type, &u.a, u.a.acl_len, mode);
+ else
+ ret = aclx_put (name, SET_ACL | SET_MODE_S_BITS,
+ type, &u.a, u.a.acl_len, mode);
+ if (!(ret < 0 && errno == ENOSYS))
+ return ret;
+ }
+ else if (type.u64 == ACL_NFS4)
+ {
+ union { nfs4_acl_int_t a; char room[128]; } u;
+ nfs4_ace_int_t *ace;
+ int ret;
+
+ u.a.aclVersion = NFS4_ACL_INT_STRUCT_VERSION;
+ u.a.aclEntryN = 0;
+ ace = &u.a.aclEntry[0];
+ {
+ ace->flags = ACE4_ID_SPECIAL;
+ ace->aceWho.special_whoid = ACE4_WHO_OWNER;
+ ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
+ ace->aceFlags = 0;
+ ace->aceMask =
+ (mode & 0400 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
+ | (mode & 0200
+ ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
+ | ACE4_ADD_SUBDIRECTORY
+ : 0)
+ | (mode & 0100 ? ACE4_EXECUTE : 0);
+ ace->aceWhoString[0] = '\0';
+ ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
+ ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
+ u.a.aclEntryN++;
+ }
+ {
+ ace->flags = ACE4_ID_SPECIAL;
+ ace->aceWho.special_whoid = ACE4_WHO_GROUP;
+ ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
+ ace->aceFlags = 0;
+ ace->aceMask =
+ (mode & 0040 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
+ | (mode & 0020
+ ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
+ | ACE4_ADD_SUBDIRECTORY
+ : 0)
+ | (mode & 0010 ? ACE4_EXECUTE : 0);
+ ace->aceWhoString[0] = '\0';
+ ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
+ ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
+ u.a.aclEntryN++;
+ }
+ {
+ ace->flags = ACE4_ID_SPECIAL;
+ ace->aceWho.special_whoid = ACE4_WHO_EVERYONE;
+ ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
+ ace->aceFlags = 0;
+ ace->aceMask =
+ (mode & 0004 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
+ | (mode & 0002
+ ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
+ | ACE4_ADD_SUBDIRECTORY
+ : 0)
+ | (mode & 0001 ? ACE4_EXECUTE : 0);
+ ace->aceWhoString[0] = '\0';
+ ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
+ ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
+ u.a.aclEntryN++;
+ }
+ u.a.aclLength = (char *) ace - (char *) &u.a;
+
+ if (desc != -1)
+ ret = aclx_fput (desc, SET_ACL | SET_MODE_S_BITS,
+ type, &u.a, u.a.aclLength, mode);
+ else
+ ret = aclx_put (name, SET_ACL | SET_MODE_S_BITS,
+ type, &u.a, u.a.aclLength, mode);
+ if (!(ret < 0 && errno == ENOSYS))
+ return ret;
+ }
+
+ return chmod_or_fchmod (name, desc, mode);
+
+# elif HAVE_STATACL /* older AIX */
+
+ union { struct acl a; char room[128]; } u;
+ int ret;
+
+ u.a.acl_len = (char *) &u.a.acl_ext[0] - (char *) &u.a; /* no entries */
+ u.a.acl_mode = mode & ~(S_IXACL | 0777);
+ u.a.u_access = (mode >> 6) & 7;
+ u.a.g_access = (mode >> 3) & 7;
+ u.a.o_access = mode & 7;
+
+ if (desc != -1)
+ ret = fchacl (desc, &u.a, u.a.acl_len);
+ else
+ ret = chacl (name, &u.a, u.a.acl_len);
+
+ if (ret < 0 && errno == ENOSYS)
+ return chmod_or_fchmod (name, desc, mode);
+
+ return ret;
+
+# else /* Unknown flavor of ACLs */
+ return chmod_or_fchmod (name, desc, mode);
+# endif
+#else /* !USE_ACL */
+ return chmod_or_fchmod (name, desc, mode);
+#endif
+}
+
+/* As with qset_acl, but also output a diagnostic on failure. */
+
+int
+set_acl (char const *name, int desc, mode_t mode)
+{
+ int r = qset_acl (name, desc, mode);
+ if (r != 0)
+ error (0, errno, _("setting permissions for %s"), quote (name));
+ return r;
+}
diff --git a/gnulib/lib/setenv.c b/gnulib/lib/setenv.c
new file mode 100644
index 00000000..b4c55322
--- /dev/null
+++ b/gnulib/lib/setenv.c
@@ -0,0 +1,383 @@
+/* Copyright (C) 1992, 1995-2003, 2005-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the name == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <alloca.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#if _LIBC || HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if !_LIBC
+# include "malloca.h"
+#endif
+
+#if _LIBC || !HAVE_SETENV
+
+#if !_LIBC
+# define __environ environ
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of `environ'. */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean. */
+#ifdef _LIBC
+# define setenv __setenv
+# define clearenv __clearenv
+# define tfind __tfind
+# define tsearch __tsearch
+#endif
+
+/* In the GNU C library implementation we try to be more clever and
+ allow arbitrarily many changes of the environment given that the used
+ values are from a small set. Outside glibc this will eat up all
+ memory after a while. */
+#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \
+ && defined __GNUC__)
+# define USE_TSEARCH 1
+# include <search.h>
+typedef int (*compar_fn_t) (const void *, const void *);
+
+/* This is a pointer to the root of the search tree with the known
+ values. */
+static void *known_values;
+
+# define KNOWN_VALUE(Str) \
+ ({ \
+ void *value = tfind (Str, &known_values, (compar_fn_t) strcmp); \
+ value != NULL ? *(char **) value : NULL; \
+ })
+# define STORE_VALUE(Str) \
+ tsearch (Str, &known_values, (compar_fn_t) strcmp)
+
+#else
+# undef USE_TSEARCH
+
+# define KNOWN_VALUE(Str) NULL
+# define STORE_VALUE(Str) do { } while (0)
+
+#endif
+
+
+/* If this variable is not a null pointer we allocated the current
+ environment. */
+static char **last_environ;
+
+
+/* This function is used by `setenv' and `putenv'. The difference between
+ the two functions is that for the former must create a new string which
+ is then placed in the environment, while the argument of `putenv'
+ must be used directly. This is all complicated by the fact that we try
+ to reuse values once generated for a `setenv' call since we can never
+ free the strings. */
+int
+__add_to_environ (const char *name, const char *value, const char *combined,
+ int replace)
+{
+ register char **ep;
+ register size_t size;
+ const size_t namelen = strlen (name);
+ const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
+
+ LOCK;
+
+ /* We have to get the pointer now that we have the lock and not earlier
+ since another thread might have created a new environment. */
+ ep = __environ;
+
+ size = 0;
+ if (ep != NULL)
+ {
+ for (; *ep != NULL; ++ep)
+ if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
+ break;
+ else
+ ++size;
+ }
+
+ if (ep == NULL || *ep == NULL)
+ {
+ char **new_environ;
+#ifdef USE_TSEARCH
+ char *new_value;
+#endif
+
+ /* We allocated this space; we can extend it. */
+ new_environ =
+ (char **) (last_environ == NULL
+ ? malloc ((size + 2) * sizeof (char *))
+ : realloc (last_environ, (size + 2) * sizeof (char *)));
+ if (new_environ == NULL)
+ {
+ UNLOCK;
+ return -1;
+ }
+
+ /* If the whole entry is given add it. */
+ if (combined != NULL)
+ /* We must not add the string to the search tree since it belongs
+ to the user. */
+ new_environ[size] = (char *) combined;
+ else
+ {
+ /* See whether the value is already known. */
+#ifdef USE_TSEARCH
+# ifdef _LIBC
+ new_value = (char *) alloca (namelen + 1 + vallen);
+ __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+ value, vallen);
+# else
+ new_value = (char *) malloca (namelen + 1 + vallen);
+ if (new_value == NULL)
+ {
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+ memcpy (new_value, name, namelen);
+ new_value[namelen] = '=';
+ memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+ new_environ[size] = KNOWN_VALUE (new_value);
+ if (new_environ[size] == NULL)
+#endif
+ {
+ new_environ[size] = (char *) malloc (namelen + 1 + vallen);
+ if (new_environ[size] == NULL)
+ {
+#if defined USE_TSEARCH && !defined _LIBC
+ freea (new_value);
+#endif
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+
+#ifdef USE_TSEARCH
+ memcpy (new_environ[size], new_value, namelen + 1 + vallen);
+#else
+ memcpy (new_environ[size], name, namelen);
+ new_environ[size][namelen] = '=';
+ memcpy (&new_environ[size][namelen + 1], value, vallen);
+#endif
+ /* And save the value now. We cannot do this when we remove
+ the string since then we cannot decide whether it is a
+ user string or not. */
+ STORE_VALUE (new_environ[size]);
+ }
+#if defined USE_TSEARCH && !defined _LIBC
+ freea (new_value);
+#endif
+ }
+
+ if (__environ != last_environ)
+ memcpy ((char *) new_environ, (char *) __environ,
+ size * sizeof (char *));
+
+ new_environ[size + 1] = NULL;
+
+ last_environ = __environ = new_environ;
+ }
+ else if (replace)
+ {
+ char *np;
+
+ /* Use the user string if given. */
+ if (combined != NULL)
+ np = (char *) combined;
+ else
+ {
+#ifdef USE_TSEARCH
+ char *new_value;
+# ifdef _LIBC
+ new_value = alloca (namelen + 1 + vallen);
+ __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+ value, vallen);
+# else
+ new_value = malloca (namelen + 1 + vallen);
+ if (new_value == NULL)
+ {
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+ memcpy (new_value, name, namelen);
+ new_value[namelen] = '=';
+ memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+ np = KNOWN_VALUE (new_value);
+ if (np == NULL)
+#endif
+ {
+ np = malloc (namelen + 1 + vallen);
+ if (np == NULL)
+ {
+#if defined USE_TSEARCH && !defined _LIBC
+ freea (new_value);
+#endif
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+
+#ifdef USE_TSEARCH
+ memcpy (np, new_value, namelen + 1 + vallen);
+#else
+ memcpy (np, name, namelen);
+ np[namelen] = '=';
+ memcpy (&np[namelen + 1], value, vallen);
+#endif
+ /* And remember the value. */
+ STORE_VALUE (np);
+ }
+#if defined USE_TSEARCH && !defined _LIBC
+ freea (new_value);
+#endif
+ }
+
+ *ep = np;
+ }
+
+ UNLOCK;
+
+ return 0;
+}
+
+int
+setenv (const char *name, const char *value, int replace)
+{
+ if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ return __add_to_environ (name, value, NULL, replace);
+}
+
+/* The `clearenv' was planned to be added to POSIX.1 but probably
+ never made it. Nevertheless the POSIX.9 standard (POSIX bindings
+ for Fortran 77) requires this function. */
+int
+clearenv (void)
+{
+ LOCK;
+
+ if (__environ == last_environ && __environ != NULL)
+ {
+ /* We allocated this environment so we can free it. */
+ free (__environ);
+ last_environ = NULL;
+ }
+
+ /* Clear the environment pointer removes the whole environment. */
+ __environ = NULL;
+
+ UNLOCK;
+
+ return 0;
+}
+
+#ifdef _LIBC
+static void
+free_mem (void)
+{
+ /* Remove all traces. */
+ clearenv ();
+
+ /* Now remove the search tree. */
+ __tdestroy (known_values, free);
+ known_values = NULL;
+}
+text_set_element (__libc_subfreeres, free_mem);
+
+
+# undef setenv
+# undef clearenv
+weak_alias (__setenv, setenv)
+weak_alias (__clearenv, clearenv)
+#endif
+
+#endif /* _LIBC || !HAVE_SETENV */
+
+/* The rest of this file is called into use when replacing an existing
+ but buggy setenv. Known bugs include failure to diagnose invalid
+ name, and consuming a leading '=' from value. */
+#if HAVE_SETENV
+
+# undef setenv
+# define STREQ(a, b) (strcmp (a, b) == 0)
+
+int
+rpl_setenv (const char *name, const char *value, int replace)
+{
+ int result;
+ if (!name || !*name || strchr (name, '='))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ /* Call the real setenv even if replace is 0, in case implementation
+ has underlying data to update, such as when environ changes. */
+ result = setenv (name, value, replace);
+ if (result == 0 && replace && *value == '=')
+ {
+ char *tmp = getenv (name);
+ if (!STREQ (tmp, value))
+ {
+ int saved_errno;
+ size_t len = strlen (value);
+ tmp = malloca (len + 2);
+ /* Since leading '=' is eaten, double it up. */
+ *tmp = '=';
+ memcpy (tmp + 1, value, len + 1);
+ result = setenv (name, tmp, replace);
+ saved_errno = errno;
+ freea (tmp);
+ errno = saved_errno;
+ }
+ }
+ return result;
+}
+
+#endif /* HAVE_SETENV */
diff --git a/gnulib/lib/setsockopt.c b/gnulib/lib/setsockopt.c
new file mode 100644
index 00000000..24a8d6e5
--- /dev/null
+++ b/gnulib/lib/setsockopt.c
@@ -0,0 +1,56 @@
+/* setsockopt.c --- wrappers for Windows setsockopt function
+
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get struct timeval. */
+#include <sys/time.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef setsockopt
+
+int
+rpl_setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen)
+{
+ int r;
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (level == SOL_SOCKET && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO))
+ {
+ const struct timeval *tv = optval;
+ int milliseconds = tv->tv_sec * 1000 + tv->tv_usec / 1000;
+ optval = &milliseconds;
+ r = setsockopt (sock, level, optname, optval, sizeof (int));
+ }
+ else
+ {
+ r = setsockopt (sock, level, optname, optval, optlen);
+ }
+
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/settime.c b/gnulib/lib/settime.c
new file mode 100644
index 00000000..cb91e8b8
--- /dev/null
+++ b/gnulib/lib/settime.c
@@ -0,0 +1,59 @@
+/* settime -- set the system clock
+
+ Copyright (C) 2002, 2004-2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "timespec.h"
+
+#include <sys/time.h>
+#include <unistd.h>
+
+#include <errno.h>
+
+/* Set the system time. */
+
+int
+settime (struct timespec const *ts)
+{
+#if defined CLOCK_REALTIME && HAVE_CLOCK_SETTIME
+ {
+ int r = clock_settime (CLOCK_REALTIME, ts);
+ if (r == 0 || errno == EPERM)
+ return r;
+ }
+#endif
+
+#if HAVE_SETTIMEOFDAY
+ {
+ struct timeval tv;
+
+ tv.tv_sec = ts->tv_sec;
+ tv.tv_usec = ts->tv_nsec / 1000;
+ return settimeofday (&tv, 0);
+ }
+#elif HAVE_STIME
+ /* This fails to compile on OSF1 V5.1, due to stime requiring
+ a `long int*' and tv_sec is `int'. But that system does provide
+ settimeofday. */
+ return stime (&ts->tv_sec);
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/sh-quote.c b/gnulib/lib/sh-quote.c
new file mode 100644
index 00000000..ae442713
--- /dev/null
+++ b/gnulib/lib/sh-quote.c
@@ -0,0 +1,107 @@
+/* Shell quoting.
+ Copyright (C) 2001-2004, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "sh-quote.h"
+
+#include <string.h>
+
+#include "quotearg.h"
+#include "xalloc.h"
+
+/* Describes quoting for sh compatible shells. */
+static struct quoting_options *sh_quoting_options;
+
+/* Initializes the sh_quoting_options variable. */
+static void
+init_sh_quoting_options ()
+{
+ sh_quoting_options = clone_quoting_options (NULL);
+ set_quoting_style (sh_quoting_options, shell_quoting_style);
+}
+
+/* Returns the number of bytes needed for the quoted string. */
+size_t
+shell_quote_length (const char *string)
+{
+ if (sh_quoting_options == NULL)
+ init_sh_quoting_options ();
+ return quotearg_buffer (NULL, 0, string, strlen (string),
+ sh_quoting_options);
+}
+
+/* Copies the quoted string to p and returns the incremented p.
+ There must be room for shell_quote_length (string) + 1 bytes at p. */
+char *
+shell_quote_copy (char *p, const char *string)
+{
+ if (sh_quoting_options == NULL)
+ init_sh_quoting_options ();
+ return p + quotearg_buffer (p, (size_t)(-1), string, strlen (string),
+ sh_quoting_options);
+}
+
+/* Returns the freshly allocated quoted string. */
+char *
+shell_quote (const char *string)
+{
+ if (sh_quoting_options == NULL)
+ init_sh_quoting_options ();
+ return quotearg_alloc (string, strlen (string), sh_quoting_options);
+}
+
+/* Returns a freshly allocated string containing all argument strings, quoted,
+ separated through spaces. */
+char *
+shell_quote_argv (char **argv)
+{
+ if (*argv != NULL)
+ {
+ char **argp;
+ size_t length;
+ char *command;
+ char *p;
+
+ length = 0;
+ for (argp = argv; ; )
+ {
+ length += shell_quote_length (*argp) + 1;
+ argp++;
+ if (*argp == NULL)
+ break;
+ }
+
+ command = XNMALLOC (length, char);
+
+ p = command;
+ for (argp = argv; ; )
+ {
+ p = shell_quote_copy (p, *argp);
+ argp++;
+ if (*argp == NULL)
+ break;
+ *p++ = ' ';
+ }
+ *p = '\0';
+
+ return command;
+ }
+ else
+ return xstrdup ("");
+}
diff --git a/gnulib/lib/sh-quote.h b/gnulib/lib/sh-quote.h
new file mode 100644
index 00000000..26ca17c5
--- /dev/null
+++ b/gnulib/lib/sh-quote.h
@@ -0,0 +1,36 @@
+/* Shell quoting.
+ Copyright (C) 2001-2002, 2004, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+/* When passing a command to a shell, we must quote the program name and
+ arguments, since Unix shells interpret characters like " ", "'", "<", ">",
+ "$" etc. in a special way. */
+
+#include <stddef.h>
+
+/* Returns the number of bytes needed for the quoted string. */
+extern size_t shell_quote_length (const char *string);
+
+/* Copies the quoted string to p and returns the incremented p.
+ There must be room for shell_quote_length (string) + 1 bytes at p. */
+extern char * shell_quote_copy (char *p, const char *string);
+
+/* Returns the freshly allocated quoted string. */
+extern char * shell_quote (const char *string);
+
+/* Returns a freshly allocated string containing all argument strings, quoted,
+ separated through spaces. */
+extern char * shell_quote_argv (char **argv);
diff --git a/gnulib/lib/sha1.c b/gnulib/lib/sha1.c
new file mode 100644
index 00000000..1ea84f64
--- /dev/null
+++ b/gnulib/lib/sha1.c
@@ -0,0 +1,428 @@
+/* sha1.c - Functions to compute SHA1 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-1.
+
+ Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Scott G. Miller
+ Credits:
+ Robert Klep <robert@ilse.nl> -- Expansion function fix
+*/
+
+#include <config.h>
+
+#include "sha1.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Take a pointer to a 160 bit block of data (five 32 bit ints) and
+ initialize it to the start constants of the SHA1 algorithm. This
+ must be called before using hash in the call to sha1_hash. */
+void
+sha1_init_ctx (struct sha1_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+ ctx->E = 0xc3d2e1f0;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static inline void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 20 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+ set_uint32 (r + 4 * sizeof ctx->E, SWAP (ctx->E));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+ ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3);
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ sha1_process_block (ctx->buffer, size * 4, ctx);
+
+ return sha1_read_ctx (ctx, resbuf);
+}
+
+/* Compute SHA1 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+sha1_stream (FILE *stream, void *resblock)
+{
+ struct sha1_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha1_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha1_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha1_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha1_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha1_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha1_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha1_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha1_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha1_finish_ctx (&ctx, resblock);
+}
+
+void
+sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+# define alignof(type) offsetof (struct { char c; type x; }, x)
+# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ sha1_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ sha1_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between md5.c and sha1.c --- */
+
+/* SHA1 round constants */
+#define K1 0x5a827999
+#define K2 0x6ed9eba1
+#define K3 0x8f1bbcdc
+#define K4 0xca62c1d6
+
+/* Round functions. Note that F2 is the same as F4. */
+#define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) )
+#define F2(B,C,D) (B ^ C ^ D)
+#define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) )
+#define F4(B,C,D) (B ^ C ^ D)
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t a = ctx->A;
+ uint32_t b = ctx->B;
+ uint32_t c = ctx->C;
+ uint32_t d = ctx->D;
+ uint32_t e = ctx->E;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+#define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n))))
+
+#define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \
+ ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \
+ , (x[I&0x0f] = rol(tm, 1)) )
+
+#define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \
+ + F( B, C, D ) \
+ + K \
+ + M; \
+ B = rol( B, 30 ); \
+ } while(0)
+
+ while (words < endp)
+ {
+ uint32_t tm;
+ int t;
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, F1, K1, x[ 0] );
+ R( e, a, b, c, d, F1, K1, x[ 1] );
+ R( d, e, a, b, c, F1, K1, x[ 2] );
+ R( c, d, e, a, b, F1, K1, x[ 3] );
+ R( b, c, d, e, a, F1, K1, x[ 4] );
+ R( a, b, c, d, e, F1, K1, x[ 5] );
+ R( e, a, b, c, d, F1, K1, x[ 6] );
+ R( d, e, a, b, c, F1, K1, x[ 7] );
+ R( c, d, e, a, b, F1, K1, x[ 8] );
+ R( b, c, d, e, a, F1, K1, x[ 9] );
+ R( a, b, c, d, e, F1, K1, x[10] );
+ R( e, a, b, c, d, F1, K1, x[11] );
+ R( d, e, a, b, c, F1, K1, x[12] );
+ R( c, d, e, a, b, F1, K1, x[13] );
+ R( b, c, d, e, a, F1, K1, x[14] );
+ R( a, b, c, d, e, F1, K1, x[15] );
+ R( e, a, b, c, d, F1, K1, M(16) );
+ R( d, e, a, b, c, F1, K1, M(17) );
+ R( c, d, e, a, b, F1, K1, M(18) );
+ R( b, c, d, e, a, F1, K1, M(19) );
+ R( a, b, c, d, e, F2, K2, M(20) );
+ R( e, a, b, c, d, F2, K2, M(21) );
+ R( d, e, a, b, c, F2, K2, M(22) );
+ R( c, d, e, a, b, F2, K2, M(23) );
+ R( b, c, d, e, a, F2, K2, M(24) );
+ R( a, b, c, d, e, F2, K2, M(25) );
+ R( e, a, b, c, d, F2, K2, M(26) );
+ R( d, e, a, b, c, F2, K2, M(27) );
+ R( c, d, e, a, b, F2, K2, M(28) );
+ R( b, c, d, e, a, F2, K2, M(29) );
+ R( a, b, c, d, e, F2, K2, M(30) );
+ R( e, a, b, c, d, F2, K2, M(31) );
+ R( d, e, a, b, c, F2, K2, M(32) );
+ R( c, d, e, a, b, F2, K2, M(33) );
+ R( b, c, d, e, a, F2, K2, M(34) );
+ R( a, b, c, d, e, F2, K2, M(35) );
+ R( e, a, b, c, d, F2, K2, M(36) );
+ R( d, e, a, b, c, F2, K2, M(37) );
+ R( c, d, e, a, b, F2, K2, M(38) );
+ R( b, c, d, e, a, F2, K2, M(39) );
+ R( a, b, c, d, e, F3, K3, M(40) );
+ R( e, a, b, c, d, F3, K3, M(41) );
+ R( d, e, a, b, c, F3, K3, M(42) );
+ R( c, d, e, a, b, F3, K3, M(43) );
+ R( b, c, d, e, a, F3, K3, M(44) );
+ R( a, b, c, d, e, F3, K3, M(45) );
+ R( e, a, b, c, d, F3, K3, M(46) );
+ R( d, e, a, b, c, F3, K3, M(47) );
+ R( c, d, e, a, b, F3, K3, M(48) );
+ R( b, c, d, e, a, F3, K3, M(49) );
+ R( a, b, c, d, e, F3, K3, M(50) );
+ R( e, a, b, c, d, F3, K3, M(51) );
+ R( d, e, a, b, c, F3, K3, M(52) );
+ R( c, d, e, a, b, F3, K3, M(53) );
+ R( b, c, d, e, a, F3, K3, M(54) );
+ R( a, b, c, d, e, F3, K3, M(55) );
+ R( e, a, b, c, d, F3, K3, M(56) );
+ R( d, e, a, b, c, F3, K3, M(57) );
+ R( c, d, e, a, b, F3, K3, M(58) );
+ R( b, c, d, e, a, F3, K3, M(59) );
+ R( a, b, c, d, e, F4, K4, M(60) );
+ R( e, a, b, c, d, F4, K4, M(61) );
+ R( d, e, a, b, c, F4, K4, M(62) );
+ R( c, d, e, a, b, F4, K4, M(63) );
+ R( b, c, d, e, a, F4, K4, M(64) );
+ R( a, b, c, d, e, F4, K4, M(65) );
+ R( e, a, b, c, d, F4, K4, M(66) );
+ R( d, e, a, b, c, F4, K4, M(67) );
+ R( c, d, e, a, b, F4, K4, M(68) );
+ R( b, c, d, e, a, F4, K4, M(69) );
+ R( a, b, c, d, e, F4, K4, M(70) );
+ R( e, a, b, c, d, F4, K4, M(71) );
+ R( d, e, a, b, c, F4, K4, M(72) );
+ R( c, d, e, a, b, F4, K4, M(73) );
+ R( b, c, d, e, a, F4, K4, M(74) );
+ R( a, b, c, d, e, F4, K4, M(75) );
+ R( e, a, b, c, d, F4, K4, M(76) );
+ R( d, e, a, b, c, F4, K4, M(77) );
+ R( c, d, e, a, b, F4, K4, M(78) );
+ R( b, c, d, e, a, F4, K4, M(79) );
+
+ a = ctx->A += a;
+ b = ctx->B += b;
+ c = ctx->C += c;
+ d = ctx->D += d;
+ e = ctx->E += e;
+ }
+}
diff --git a/gnulib/lib/sha1.h b/gnulib/lib/sha1.h
new file mode 100644
index 00000000..f76493af
--- /dev/null
+++ b/gnulib/lib/sha1.h
@@ -0,0 +1,92 @@
+/* Declarations of functions and data types used for SHA1 sum
+ library functions.
+ Copyright (C) 2000, 2001, 2003, 2005, 2006, 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef SHA1_H
+# define SHA1_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+#define SHA1_DIGEST_SIZE 20
+
+/* Structure to save state of computation between the single steps. */
+struct sha1_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+ uint32_t E;
+
+ uint32_t total[2];
+ uint32_t buflen;
+ uint32_t buffer[32];
+};
+
+
+/* Initialize structure containing state of computation. */
+extern void sha1_init_ctx (struct sha1_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void sha1_process_block (const void *buffer, size_t len,
+ struct sha1_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void sha1_process_bytes (const void *buffer, size_t len,
+ struct sha1_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 20 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 20 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf);
+
+
+/* Compute SHA1 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 20 bytes
+ beginning at RESBLOCK. */
+extern int sha1_stream (FILE *stream, void *resblock);
+
+/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha1_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/sha256.c b/gnulib/lib/sha256.c
new file mode 100644
index 00000000..6eb4b44a
--- /dev/null
+++ b/gnulib/lib/sha256.c
@@ -0,0 +1,569 @@
+/* sha256.c - Functions to compute SHA256 and SHA224 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-2.
+
+ Copyright (C) 2005, 2006, 2008, 2009, 2010 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/>. */
+
+/* Written by David Madore, considerably copypasting from
+ Scott G. Miller's sha1.c
+*/
+
+#include <config.h>
+
+#include "sha256.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/*
+ Takes a pointer to a 256 bit block of data (eight 32 bit ints) and
+ intializes it to the start constants of the SHA256 algorithm. This
+ must be called before using hash in the call to sha256_hash
+*/
+void
+sha256_init_ctx (struct sha256_ctx *ctx)
+{
+ ctx->state[0] = 0x6a09e667UL;
+ ctx->state[1] = 0xbb67ae85UL;
+ ctx->state[2] = 0x3c6ef372UL;
+ ctx->state[3] = 0xa54ff53aUL;
+ ctx->state[4] = 0x510e527fUL;
+ ctx->state[5] = 0x9b05688cUL;
+ ctx->state[6] = 0x1f83d9abUL;
+ ctx->state[7] = 0x5be0cd19UL;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+void
+sha224_init_ctx (struct sha256_ctx *ctx)
+{
+ ctx->state[0] = 0xc1059ed8UL;
+ ctx->state[1] = 0x367cd507UL;
+ ctx->state[2] = 0x3070dd17UL;
+ ctx->state[3] = 0xf70e5939UL;
+ ctx->state[4] = 0xffc00b31UL;
+ ctx->state[5] = 0x68581511UL;
+ ctx->state[6] = 0x64f98fa7UL;
+ ctx->state[7] = 0xbefa4fa4UL;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static inline void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 32 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 8; i++)
+ set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+void *
+sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 7; i++)
+ set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+static void
+sha256_conclude_ctx (struct sha256_ctx *ctx)
+{
+ /* Take yet unprocessed bytes into account. */
+ size_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer.
+ Use set_uint32 rather than a simple assignment, to avoid risk of
+ unaligned access. */
+ set_uint32 ((char *) &ctx->buffer[size - 2],
+ SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)));
+ set_uint32 ((char *) &ctx->buffer[size - 1],
+ SWAP (ctx->total[0] << 3));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ sha256_process_block (ctx->buffer, size * 4, ctx);
+}
+
+void *
+sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
+{
+ sha256_conclude_ctx (ctx);
+ return sha256_read_ctx (ctx, resbuf);
+}
+
+void *
+sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
+{
+ sha256_conclude_ctx (ctx);
+ return sha224_read_ctx (ctx, resbuf);
+}
+
+/* Compute SHA256 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 32 bytes
+ beginning at RESBLOCK. */
+int
+sha256_stream (FILE *stream, void *resblock)
+{
+ struct sha256_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha256_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha256_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha256_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha256_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* FIXME: Avoid code duplication */
+int
+sha224_stream (FILE *stream, void *resblock)
+{
+ struct sha256_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha224_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha256_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha256_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha224_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute SHA512 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha256_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha256_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha256_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha256_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha256_finish_ctx (&ctx, resblock);
+}
+
+void *
+sha224_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha256_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha224_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha256_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha224_finish_ctx (&ctx, resblock);
+}
+
+void
+sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+# define alignof(type) offsetof (struct { char c; type x; }, x)
+# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ sha256_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ sha256_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between sha1.c and sha256.c --- */
+
+/* SHA256 round constants */
+#define K(I) sha256_round_constants[I]
+static const uint32_t sha256_round_constants[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
+ 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
+ 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
+ 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
+ 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
+ 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
+ 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
+ 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
+ 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
+ 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
+ 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
+ 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
+ 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL,
+};
+
+/* Round functions. */
+#define F2(A,B,C) ( ( A & B ) | ( C & ( A | B ) ) )
+#define F1(E,F,G) ( G ^ ( E & ( F ^ G ) ) )
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t a = ctx->state[0];
+ uint32_t b = ctx->state[1];
+ uint32_t c = ctx->state[2];
+ uint32_t d = ctx->state[3];
+ uint32_t e = ctx->state[4];
+ uint32_t f = ctx->state[5];
+ uint32_t g = ctx->state[6];
+ uint32_t h = ctx->state[7];
+
+ /* First increment the byte count. FIPS PUB 180-2 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+#define rol(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
+#define S0(x) (rol(x,25)^rol(x,14)^(x>>3))
+#define S1(x) (rol(x,15)^rol(x,13)^(x>>10))
+#define SS0(x) (rol(x,30)^rol(x,19)^rol(x,10))
+#define SS1(x) (rol(x,26)^rol(x,21)^rol(x,7))
+
+#define M(I) ( tm = S1(x[(I-2)&0x0f]) + x[(I-7)&0x0f] \
+ + S0(x[(I-15)&0x0f]) + x[I&0x0f] \
+ , x[I&0x0f] = tm )
+
+#define R(A,B,C,D,E,F,G,H,K,M) do { t0 = SS0(A) + F2(A,B,C); \
+ t1 = H + SS1(E) \
+ + F1(E,F,G) \
+ + K \
+ + M; \
+ D += t1; H = t0 + t1; \
+ } while(0)
+
+ while (words < endp)
+ {
+ uint32_t tm;
+ uint32_t t0, t1;
+ int t;
+ /* FIXME: see sha1.c for a better implementation. */
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, f, g, h, K( 0), x[ 0] );
+ R( h, a, b, c, d, e, f, g, K( 1), x[ 1] );
+ R( g, h, a, b, c, d, e, f, K( 2), x[ 2] );
+ R( f, g, h, a, b, c, d, e, K( 3), x[ 3] );
+ R( e, f, g, h, a, b, c, d, K( 4), x[ 4] );
+ R( d, e, f, g, h, a, b, c, K( 5), x[ 5] );
+ R( c, d, e, f, g, h, a, b, K( 6), x[ 6] );
+ R( b, c, d, e, f, g, h, a, K( 7), x[ 7] );
+ R( a, b, c, d, e, f, g, h, K( 8), x[ 8] );
+ R( h, a, b, c, d, e, f, g, K( 9), x[ 9] );
+ R( g, h, a, b, c, d, e, f, K(10), x[10] );
+ R( f, g, h, a, b, c, d, e, K(11), x[11] );
+ R( e, f, g, h, a, b, c, d, K(12), x[12] );
+ R( d, e, f, g, h, a, b, c, K(13), x[13] );
+ R( c, d, e, f, g, h, a, b, K(14), x[14] );
+ R( b, c, d, e, f, g, h, a, K(15), x[15] );
+ R( a, b, c, d, e, f, g, h, K(16), M(16) );
+ R( h, a, b, c, d, e, f, g, K(17), M(17) );
+ R( g, h, a, b, c, d, e, f, K(18), M(18) );
+ R( f, g, h, a, b, c, d, e, K(19), M(19) );
+ R( e, f, g, h, a, b, c, d, K(20), M(20) );
+ R( d, e, f, g, h, a, b, c, K(21), M(21) );
+ R( c, d, e, f, g, h, a, b, K(22), M(22) );
+ R( b, c, d, e, f, g, h, a, K(23), M(23) );
+ R( a, b, c, d, e, f, g, h, K(24), M(24) );
+ R( h, a, b, c, d, e, f, g, K(25), M(25) );
+ R( g, h, a, b, c, d, e, f, K(26), M(26) );
+ R( f, g, h, a, b, c, d, e, K(27), M(27) );
+ R( e, f, g, h, a, b, c, d, K(28), M(28) );
+ R( d, e, f, g, h, a, b, c, K(29), M(29) );
+ R( c, d, e, f, g, h, a, b, K(30), M(30) );
+ R( b, c, d, e, f, g, h, a, K(31), M(31) );
+ R( a, b, c, d, e, f, g, h, K(32), M(32) );
+ R( h, a, b, c, d, e, f, g, K(33), M(33) );
+ R( g, h, a, b, c, d, e, f, K(34), M(34) );
+ R( f, g, h, a, b, c, d, e, K(35), M(35) );
+ R( e, f, g, h, a, b, c, d, K(36), M(36) );
+ R( d, e, f, g, h, a, b, c, K(37), M(37) );
+ R( c, d, e, f, g, h, a, b, K(38), M(38) );
+ R( b, c, d, e, f, g, h, a, K(39), M(39) );
+ R( a, b, c, d, e, f, g, h, K(40), M(40) );
+ R( h, a, b, c, d, e, f, g, K(41), M(41) );
+ R( g, h, a, b, c, d, e, f, K(42), M(42) );
+ R( f, g, h, a, b, c, d, e, K(43), M(43) );
+ R( e, f, g, h, a, b, c, d, K(44), M(44) );
+ R( d, e, f, g, h, a, b, c, K(45), M(45) );
+ R( c, d, e, f, g, h, a, b, K(46), M(46) );
+ R( b, c, d, e, f, g, h, a, K(47), M(47) );
+ R( a, b, c, d, e, f, g, h, K(48), M(48) );
+ R( h, a, b, c, d, e, f, g, K(49), M(49) );
+ R( g, h, a, b, c, d, e, f, K(50), M(50) );
+ R( f, g, h, a, b, c, d, e, K(51), M(51) );
+ R( e, f, g, h, a, b, c, d, K(52), M(52) );
+ R( d, e, f, g, h, a, b, c, K(53), M(53) );
+ R( c, d, e, f, g, h, a, b, K(54), M(54) );
+ R( b, c, d, e, f, g, h, a, K(55), M(55) );
+ R( a, b, c, d, e, f, g, h, K(56), M(56) );
+ R( h, a, b, c, d, e, f, g, K(57), M(57) );
+ R( g, h, a, b, c, d, e, f, K(58), M(58) );
+ R( f, g, h, a, b, c, d, e, K(59), M(59) );
+ R( e, f, g, h, a, b, c, d, K(60), M(60) );
+ R( d, e, f, g, h, a, b, c, K(61), M(61) );
+ R( c, d, e, f, g, h, a, b, K(62), M(62) );
+ R( b, c, d, e, f, g, h, a, K(63), M(63) );
+
+ a = ctx->state[0] += a;
+ b = ctx->state[1] += b;
+ c = ctx->state[2] += c;
+ d = ctx->state[3] += d;
+ e = ctx->state[4] += e;
+ f = ctx->state[5] += f;
+ g = ctx->state[6] += g;
+ h = ctx->state[7] += h;
+ }
+}
diff --git a/gnulib/lib/sha256.h b/gnulib/lib/sha256.h
new file mode 100644
index 00000000..59df6fc9
--- /dev/null
+++ b/gnulib/lib/sha256.h
@@ -0,0 +1,91 @@
+/* Declarations of functions and data types used for SHA256 and SHA224 sum
+ library functions.
+ Copyright (C) 2005, 2006, 2008, 2009, 2010 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/>. */
+
+#ifndef SHA256_H
+# define SHA256_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Structure to save state of computation between the single steps. */
+struct sha256_ctx
+{
+ uint32_t state[8];
+
+ uint32_t total[2];
+ size_t buflen;
+ uint32_t buffer[32];
+};
+
+enum { SHA224_DIGEST_SIZE = 224 / 8 };
+enum { SHA256_DIGEST_SIZE = 256 / 8 };
+
+/* Initialize structure containing state of computation. */
+extern void sha256_init_ctx (struct sha256_ctx *ctx);
+extern void sha224_init_ctx (struct sha256_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void sha256_process_block (const void *buffer, size_t len,
+ struct sha256_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void sha256_process_bytes (const void *buffer, size_t len,
+ struct sha256_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 32 (28) bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf);
+extern void *sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 32 (28) bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf);
+extern void *sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf);
+
+
+/* Compute SHA256 (SHA224) message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 32 (28) bytes
+ beginning at RESBLOCK. */
+extern int sha256_stream (FILE *stream, void *resblock);
+extern int sha224_stream (FILE *stream, void *resblock);
+
+/* Compute SHA256 (SHA224) message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha256_buffer (const char *buffer, size_t len, void *resblock);
+extern void *sha224_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/sha512.c b/gnulib/lib/sha512.c
new file mode 100644
index 00000000..5c0b2ed1
--- /dev/null
+++ b/gnulib/lib/sha512.c
@@ -0,0 +1,619 @@
+/* sha512.c - Functions to compute SHA512 and SHA384 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-2.
+
+ Copyright (C) 2005, 2006, 2008, 2009, 2010 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/>. */
+
+/* Written by David Madore, considerably copypasting from
+ Scott G. Miller's sha1.c
+*/
+
+#include <config.h>
+
+#include "sha512.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) \
+ u64or (u64or (u64or (u64shl (n, 56), \
+ u64shl (u64and (n, u64lo (0x0000ff00)), 40)), \
+ u64or (u64shl (u64and (n, u64lo (0x00ff0000)), 24), \
+ u64shl (u64and (n, u64lo (0xff000000)), 8))), \
+ u64or (u64or (u64and (u64shr (n, 8), u64lo (0xff000000)), \
+ u64and (u64shr (n, 24), u64lo (0x00ff0000))), \
+ u64or (u64and (u64shr (n, 40), u64lo (0x0000ff00)), \
+ u64shr (n, 56))))
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 128 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 128-byte boundary. */
+static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/*
+ Takes a pointer to a 512 bit block of data (eight 64 bit ints) and
+ intializes it to the start constants of the SHA512 algorithm. This
+ must be called before using hash in the call to sha512_hash
+*/
+void
+sha512_init_ctx (struct sha512_ctx *ctx)
+{
+ ctx->state[0] = u64hilo (0x6a09e667, 0xf3bcc908);
+ ctx->state[1] = u64hilo (0xbb67ae85, 0x84caa73b);
+ ctx->state[2] = u64hilo (0x3c6ef372, 0xfe94f82b);
+ ctx->state[3] = u64hilo (0xa54ff53a, 0x5f1d36f1);
+ ctx->state[4] = u64hilo (0x510e527f, 0xade682d1);
+ ctx->state[5] = u64hilo (0x9b05688c, 0x2b3e6c1f);
+ ctx->state[6] = u64hilo (0x1f83d9ab, 0xfb41bd6b);
+ ctx->state[7] = u64hilo (0x5be0cd19, 0x137e2179);
+
+ ctx->total[0] = ctx->total[1] = u64lo (0);
+ ctx->buflen = 0;
+}
+
+void
+sha384_init_ctx (struct sha512_ctx *ctx)
+{
+ ctx->state[0] = u64hilo (0xcbbb9d5d, 0xc1059ed8);
+ ctx->state[1] = u64hilo (0x629a292a, 0x367cd507);
+ ctx->state[2] = u64hilo (0x9159015a, 0x3070dd17);
+ ctx->state[3] = u64hilo (0x152fecd8, 0xf70e5939);
+ ctx->state[4] = u64hilo (0x67332667, 0xffc00b31);
+ ctx->state[5] = u64hilo (0x8eb44a87, 0x68581511);
+ ctx->state[6] = u64hilo (0xdb0c2e0d, 0x64f98fa7);
+ ctx->state[7] = u64hilo (0x47b5481d, 0xbefa4fa4);
+
+ ctx->total[0] = ctx->total[1] = u64lo (0);
+ ctx->buflen = 0;
+}
+
+/* Copy the value from V into the memory location pointed to by *CP,
+ If your architecture allows unaligned access, this is equivalent to
+ * (__typeof__ (v) *) cp = v */
+static inline void
+set_uint64 (char *cp, u64 v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 64 bytes following RESBUF.
+ The result must be in little endian byte order. */
+void *
+sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 8; i++)
+ set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+void *
+sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 6; i++)
+ set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+static void
+sha512_conclude_ctx (struct sha512_ctx *ctx)
+{
+ /* Take yet unprocessed bytes into account. */
+ size_t bytes = ctx->buflen;
+ size_t size = (bytes < 112) ? 128 / 8 : 128 * 2 / 8;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] = u64plus (ctx->total[0], u64lo (bytes));
+ if (u64lt (ctx->total[0], u64lo (bytes)))
+ ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
+
+ /* Put the 128-bit file length in *bits* at the end of the buffer.
+ Use set_uint64 rather than a simple assignment, to avoid risk of
+ unaligned access. */
+ set_uint64 ((char *) &ctx->buffer[size - 2],
+ SWAP (u64or (u64shl (ctx->total[1], 3),
+ u64shr (ctx->total[0], 61))));
+ set_uint64 ((char *) &ctx->buffer[size - 1],
+ SWAP (u64shl (ctx->total[0], 3)));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes);
+
+ /* Process last bytes. */
+ sha512_process_block (ctx->buffer, size * 8, ctx);
+}
+
+void *
+sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
+{
+ sha512_conclude_ctx (ctx);
+ return sha512_read_ctx (ctx, resbuf);
+}
+
+void *
+sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
+{
+ sha512_conclude_ctx (ctx);
+ return sha384_read_ctx (ctx, resbuf);
+}
+
+/* Compute SHA512 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 64 bytes
+ beginning at RESBLOCK. */
+int
+sha512_stream (FILE *stream, void *resblock)
+{
+ struct sha512_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha512_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 128 == 0
+ */
+ sha512_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha512_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha512_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* FIXME: Avoid code duplication */
+int
+sha384_stream (FILE *stream, void *resblock)
+{
+ struct sha512_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha384_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 128 == 0
+ */
+ sha512_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha512_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha384_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute SHA512 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha512_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha512_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha512_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 128 bytes. */
+ sha512_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha512_finish_ctx (&ctx, resblock);
+}
+
+void *
+sha384_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha512_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha384_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 128 bytes. */
+ sha512_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha384_finish_ctx (&ctx, resblock);
+}
+
+void
+sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 256 - left_over > len ? len : 256 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 128)
+ {
+ sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx);
+
+ ctx->buflen &= 127;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~127],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 128)
+ {
+#if !_STRING_ARCH_unaligned
+# define alignof(type) offsetof (struct { char c; type x; }, x)
+# define UNALIGNED_P(p) (((size_t) p) % alignof (u64) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 128)
+ {
+ sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, ctx);
+ buffer = (const char *) buffer + 128;
+ len -= 128;
+ }
+ else
+#endif
+ {
+ sha512_process_block (buffer, len & ~127, ctx);
+ buffer = (const char *) buffer + (len & ~127);
+ len &= 127;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 128)
+ {
+ sha512_process_block (ctx->buffer, 128, ctx);
+ left_over -= 128;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between sha1.c and sha512.c --- */
+
+/* SHA512 round constants */
+#define K(I) sha512_round_constants[I]
+static u64 const sha512_round_constants[80] = {
+ u64init (0x428a2f98, 0xd728ae22), u64init (0x71374491, 0x23ef65cd),
+ u64init (0xb5c0fbcf, 0xec4d3b2f), u64init (0xe9b5dba5, 0x8189dbbc),
+ u64init (0x3956c25b, 0xf348b538), u64init (0x59f111f1, 0xb605d019),
+ u64init (0x923f82a4, 0xaf194f9b), u64init (0xab1c5ed5, 0xda6d8118),
+ u64init (0xd807aa98, 0xa3030242), u64init (0x12835b01, 0x45706fbe),
+ u64init (0x243185be, 0x4ee4b28c), u64init (0x550c7dc3, 0xd5ffb4e2),
+ u64init (0x72be5d74, 0xf27b896f), u64init (0x80deb1fe, 0x3b1696b1),
+ u64init (0x9bdc06a7, 0x25c71235), u64init (0xc19bf174, 0xcf692694),
+ u64init (0xe49b69c1, 0x9ef14ad2), u64init (0xefbe4786, 0x384f25e3),
+ u64init (0x0fc19dc6, 0x8b8cd5b5), u64init (0x240ca1cc, 0x77ac9c65),
+ u64init (0x2de92c6f, 0x592b0275), u64init (0x4a7484aa, 0x6ea6e483),
+ u64init (0x5cb0a9dc, 0xbd41fbd4), u64init (0x76f988da, 0x831153b5),
+ u64init (0x983e5152, 0xee66dfab), u64init (0xa831c66d, 0x2db43210),
+ u64init (0xb00327c8, 0x98fb213f), u64init (0xbf597fc7, 0xbeef0ee4),
+ u64init (0xc6e00bf3, 0x3da88fc2), u64init (0xd5a79147, 0x930aa725),
+ u64init (0x06ca6351, 0xe003826f), u64init (0x14292967, 0x0a0e6e70),
+ u64init (0x27b70a85, 0x46d22ffc), u64init (0x2e1b2138, 0x5c26c926),
+ u64init (0x4d2c6dfc, 0x5ac42aed), u64init (0x53380d13, 0x9d95b3df),
+ u64init (0x650a7354, 0x8baf63de), u64init (0x766a0abb, 0x3c77b2a8),
+ u64init (0x81c2c92e, 0x47edaee6), u64init (0x92722c85, 0x1482353b),
+ u64init (0xa2bfe8a1, 0x4cf10364), u64init (0xa81a664b, 0xbc423001),
+ u64init (0xc24b8b70, 0xd0f89791), u64init (0xc76c51a3, 0x0654be30),
+ u64init (0xd192e819, 0xd6ef5218), u64init (0xd6990624, 0x5565a910),
+ u64init (0xf40e3585, 0x5771202a), u64init (0x106aa070, 0x32bbd1b8),
+ u64init (0x19a4c116, 0xb8d2d0c8), u64init (0x1e376c08, 0x5141ab53),
+ u64init (0x2748774c, 0xdf8eeb99), u64init (0x34b0bcb5, 0xe19b48a8),
+ u64init (0x391c0cb3, 0xc5c95a63), u64init (0x4ed8aa4a, 0xe3418acb),
+ u64init (0x5b9cca4f, 0x7763e373), u64init (0x682e6ff3, 0xd6b2b8a3),
+ u64init (0x748f82ee, 0x5defb2fc), u64init (0x78a5636f, 0x43172f60),
+ u64init (0x84c87814, 0xa1f0ab72), u64init (0x8cc70208, 0x1a6439ec),
+ u64init (0x90befffa, 0x23631e28), u64init (0xa4506ceb, 0xde82bde9),
+ u64init (0xbef9a3f7, 0xb2c67915), u64init (0xc67178f2, 0xe372532b),
+ u64init (0xca273ece, 0xea26619c), u64init (0xd186b8c7, 0x21c0c207),
+ u64init (0xeada7dd6, 0xcde0eb1e), u64init (0xf57d4f7f, 0xee6ed178),
+ u64init (0x06f067aa, 0x72176fba), u64init (0x0a637dc5, 0xa2c898a6),
+ u64init (0x113f9804, 0xbef90dae), u64init (0x1b710b35, 0x131c471b),
+ u64init (0x28db77f5, 0x23047d84), u64init (0x32caab7b, 0x40c72493),
+ u64init (0x3c9ebe0a, 0x15c9bebc), u64init (0x431d67c4, 0x9c100d4c),
+ u64init (0x4cc5d4be, 0xcb3e42b6), u64init (0x597f299c, 0xfc657e2a),
+ u64init (0x5fcb6fab, 0x3ad6faec), u64init (0x6c44198c, 0x4a475817),
+};
+
+/* Round functions. */
+#define F2(A, B, C) u64or (u64and (A, B), u64and (C, u64or (A, B)))
+#define F1(E, F, G) u64xor (G, u64and (E, u64xor (F, G)))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 128 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
+{
+ u64 const *words = buffer;
+ u64 const *endp = words + len / sizeof (u64);
+ u64 x[16];
+ u64 a = ctx->state[0];
+ u64 b = ctx->state[1];
+ u64 c = ctx->state[2];
+ u64 d = ctx->state[3];
+ u64 e = ctx->state[4];
+ u64 f = ctx->state[5];
+ u64 g = ctx->state[6];
+ u64 h = ctx->state[7];
+
+ /* First increment the byte count. FIPS PUB 180-2 specifies the possible
+ length of the file up to 2^128 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] = u64plus (ctx->total[0], u64lo (len));
+ if (u64lt (ctx->total[0], u64lo (len)))
+ ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
+
+#define S0(x) u64xor (u64rol(x, 63), u64xor (u64rol (x, 56), u64shr (x, 7)))
+#define S1(x) u64xor (u64rol (x, 45), u64xor (u64rol (x, 3), u64shr (x, 6)))
+#define SS0(x) u64xor (u64rol (x, 36), u64xor (u64rol (x, 30), u64rol (x, 25)))
+#define SS1(x) u64xor (u64rol(x, 50), u64xor (u64rol (x, 46), u64rol (x, 23)))
+
+#define M(I) (x[(I) & 15] \
+ = u64plus (x[(I) & 15], \
+ u64plus (S1 (x[((I) - 2) & 15]), \
+ u64plus (x[((I) - 7) & 15], \
+ S0 (x[((I) - 15) & 15])))))
+
+#define R(A, B, C, D, E, F, G, H, K, M) \
+ do \
+ { \
+ u64 t0 = u64plus (SS0 (A), F2 (A, B, C)); \
+ u64 t1 = \
+ u64plus (H, u64plus (SS1 (E), \
+ u64plus (F1 (E, F, G), u64plus (K, M)))); \
+ D = u64plus (D, t1); \
+ H = u64plus (t0, t1); \
+ } \
+ while (0)
+
+ while (words < endp)
+ {
+ int t;
+ /* FIXME: see sha1.c for a better implementation. */
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, f, g, h, K( 0), x[ 0] );
+ R( h, a, b, c, d, e, f, g, K( 1), x[ 1] );
+ R( g, h, a, b, c, d, e, f, K( 2), x[ 2] );
+ R( f, g, h, a, b, c, d, e, K( 3), x[ 3] );
+ R( e, f, g, h, a, b, c, d, K( 4), x[ 4] );
+ R( d, e, f, g, h, a, b, c, K( 5), x[ 5] );
+ R( c, d, e, f, g, h, a, b, K( 6), x[ 6] );
+ R( b, c, d, e, f, g, h, a, K( 7), x[ 7] );
+ R( a, b, c, d, e, f, g, h, K( 8), x[ 8] );
+ R( h, a, b, c, d, e, f, g, K( 9), x[ 9] );
+ R( g, h, a, b, c, d, e, f, K(10), x[10] );
+ R( f, g, h, a, b, c, d, e, K(11), x[11] );
+ R( e, f, g, h, a, b, c, d, K(12), x[12] );
+ R( d, e, f, g, h, a, b, c, K(13), x[13] );
+ R( c, d, e, f, g, h, a, b, K(14), x[14] );
+ R( b, c, d, e, f, g, h, a, K(15), x[15] );
+ R( a, b, c, d, e, f, g, h, K(16), M(16) );
+ R( h, a, b, c, d, e, f, g, K(17), M(17) );
+ R( g, h, a, b, c, d, e, f, K(18), M(18) );
+ R( f, g, h, a, b, c, d, e, K(19), M(19) );
+ R( e, f, g, h, a, b, c, d, K(20), M(20) );
+ R( d, e, f, g, h, a, b, c, K(21), M(21) );
+ R( c, d, e, f, g, h, a, b, K(22), M(22) );
+ R( b, c, d, e, f, g, h, a, K(23), M(23) );
+ R( a, b, c, d, e, f, g, h, K(24), M(24) );
+ R( h, a, b, c, d, e, f, g, K(25), M(25) );
+ R( g, h, a, b, c, d, e, f, K(26), M(26) );
+ R( f, g, h, a, b, c, d, e, K(27), M(27) );
+ R( e, f, g, h, a, b, c, d, K(28), M(28) );
+ R( d, e, f, g, h, a, b, c, K(29), M(29) );
+ R( c, d, e, f, g, h, a, b, K(30), M(30) );
+ R( b, c, d, e, f, g, h, a, K(31), M(31) );
+ R( a, b, c, d, e, f, g, h, K(32), M(32) );
+ R( h, a, b, c, d, e, f, g, K(33), M(33) );
+ R( g, h, a, b, c, d, e, f, K(34), M(34) );
+ R( f, g, h, a, b, c, d, e, K(35), M(35) );
+ R( e, f, g, h, a, b, c, d, K(36), M(36) );
+ R( d, e, f, g, h, a, b, c, K(37), M(37) );
+ R( c, d, e, f, g, h, a, b, K(38), M(38) );
+ R( b, c, d, e, f, g, h, a, K(39), M(39) );
+ R( a, b, c, d, e, f, g, h, K(40), M(40) );
+ R( h, a, b, c, d, e, f, g, K(41), M(41) );
+ R( g, h, a, b, c, d, e, f, K(42), M(42) );
+ R( f, g, h, a, b, c, d, e, K(43), M(43) );
+ R( e, f, g, h, a, b, c, d, K(44), M(44) );
+ R( d, e, f, g, h, a, b, c, K(45), M(45) );
+ R( c, d, e, f, g, h, a, b, K(46), M(46) );
+ R( b, c, d, e, f, g, h, a, K(47), M(47) );
+ R( a, b, c, d, e, f, g, h, K(48), M(48) );
+ R( h, a, b, c, d, e, f, g, K(49), M(49) );
+ R( g, h, a, b, c, d, e, f, K(50), M(50) );
+ R( f, g, h, a, b, c, d, e, K(51), M(51) );
+ R( e, f, g, h, a, b, c, d, K(52), M(52) );
+ R( d, e, f, g, h, a, b, c, K(53), M(53) );
+ R( c, d, e, f, g, h, a, b, K(54), M(54) );
+ R( b, c, d, e, f, g, h, a, K(55), M(55) );
+ R( a, b, c, d, e, f, g, h, K(56), M(56) );
+ R( h, a, b, c, d, e, f, g, K(57), M(57) );
+ R( g, h, a, b, c, d, e, f, K(58), M(58) );
+ R( f, g, h, a, b, c, d, e, K(59), M(59) );
+ R( e, f, g, h, a, b, c, d, K(60), M(60) );
+ R( d, e, f, g, h, a, b, c, K(61), M(61) );
+ R( c, d, e, f, g, h, a, b, K(62), M(62) );
+ R( b, c, d, e, f, g, h, a, K(63), M(63) );
+ R( a, b, c, d, e, f, g, h, K(64), M(64) );
+ R( h, a, b, c, d, e, f, g, K(65), M(65) );
+ R( g, h, a, b, c, d, e, f, K(66), M(66) );
+ R( f, g, h, a, b, c, d, e, K(67), M(67) );
+ R( e, f, g, h, a, b, c, d, K(68), M(68) );
+ R( d, e, f, g, h, a, b, c, K(69), M(69) );
+ R( c, d, e, f, g, h, a, b, K(70), M(70) );
+ R( b, c, d, e, f, g, h, a, K(71), M(71) );
+ R( a, b, c, d, e, f, g, h, K(72), M(72) );
+ R( h, a, b, c, d, e, f, g, K(73), M(73) );
+ R( g, h, a, b, c, d, e, f, K(74), M(74) );
+ R( f, g, h, a, b, c, d, e, K(75), M(75) );
+ R( e, f, g, h, a, b, c, d, K(76), M(76) );
+ R( d, e, f, g, h, a, b, c, K(77), M(77) );
+ R( c, d, e, f, g, h, a, b, K(78), M(78) );
+ R( b, c, d, e, f, g, h, a, K(79), M(79) );
+
+ a = ctx->state[0] = u64plus (ctx->state[0], a);
+ b = ctx->state[1] = u64plus (ctx->state[1], b);
+ c = ctx->state[2] = u64plus (ctx->state[2], c);
+ d = ctx->state[3] = u64plus (ctx->state[3], d);
+ e = ctx->state[4] = u64plus (ctx->state[4], e);
+ f = ctx->state[5] = u64plus (ctx->state[5], f);
+ g = ctx->state[6] = u64plus (ctx->state[6], g);
+ h = ctx->state[7] = u64plus (ctx->state[7], h);
+ }
+}
diff --git a/gnulib/lib/sha512.h b/gnulib/lib/sha512.h
new file mode 100644
index 00000000..ea85194f
--- /dev/null
+++ b/gnulib/lib/sha512.h
@@ -0,0 +1,95 @@
+/* Declarations of functions and data types used for SHA512 and SHA384 sum
+ library functions.
+ Copyright (C) 2005, 2006, 2008, 2009, 2010 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/>. */
+
+#ifndef SHA512_H
+# define SHA512_H 1
+
+# include <stdio.h>
+
+# include "u64.h"
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Structure to save state of computation between the single steps. */
+struct sha512_ctx
+{
+ u64 state[8];
+
+ u64 total[2];
+ size_t buflen;
+ u64 buffer[32];
+};
+
+enum { SHA384_DIGEST_SIZE = 384 / 8 };
+enum { SHA512_DIGEST_SIZE = 512 / 8 };
+
+/* Initialize structure containing state of computation. */
+extern void sha512_init_ctx (struct sha512_ctx *ctx);
+extern void sha384_init_ctx (struct sha512_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 128!!! */
+extern void sha512_process_block (const void *buffer, size_t len,
+ struct sha512_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 128. */
+extern void sha512_process_bytes (const void *buffer, size_t len,
+ struct sha512_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 64 (48) bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf);
+extern void *sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 64 (48) bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf);
+extern void *sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf);
+
+
+/* Compute SHA512 (SHA384) message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 64 (48) bytes
+ beginning at RESBLOCK. */
+extern int sha512_stream (FILE *stream, void *resblock);
+extern int sha384_stream (FILE *stream, void *resblock);
+
+/* Compute SHA512 (SHA384) message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha512_buffer (const char *buffer, size_t len, void *resblock);
+extern void *sha384_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/shutdown.c b/gnulib/lib/shutdown.c
new file mode 100644
index 00000000..251c8901
--- /dev/null
+++ b/gnulib/lib/shutdown.c
@@ -0,0 +1,40 @@
+/* shutdown.c --- wrappers for Windows shutdown function
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef shutdown
+
+int
+rpl_shutdown (int fd, int how)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r = shutdown (sock, how);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
diff --git a/gnulib/lib/sig-handler.h b/gnulib/lib/sig-handler.h
new file mode 100644
index 00000000..6a634c24
--- /dev/null
+++ b/gnulib/lib/sig-handler.h
@@ -0,0 +1,44 @@
+/* Convenience declarations when working with <signal.h>.
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#ifndef _GL_SIG_HANDLER_H
+#define _GL_SIG_HANDLER_H
+
+#include <signal.h>
+
+/* Convenience type when working with signal handlers. */
+typedef void (*sa_handler_t) (int);
+
+/* Return the handler of a signal, as a sa_handler_t value regardless
+ of its true type. The resulting function can be compared to
+ special values like SIG_IGN but it is not portable to call it. */
+static inline sa_handler_t
+get_handler (struct sigaction const *a)
+{
+#ifdef SA_SIGINFO
+ /* POSIX says that special values like SIG_IGN can only occur when
+ action.sa_flags does not contain SA_SIGINFO. But in Linux 2.4,
+ for example, sa_sigaction and sa_handler are aliases and a signal
+ is ignored if sa_sigaction (after casting) equals SIG_IGN. So
+ use (and cast) sa_sigaction in that case. */
+ if (a->sa_flags & SA_SIGINFO)
+ return (sa_handler_t) a->sa_sigaction;
+#endif
+ return a->sa_handler;
+}
+
+#endif /* _GL_SIG_HANDLER_H */
diff --git a/gnulib/lib/sig2str.c b/gnulib/lib/sig2str.c
new file mode 100644
index 00000000..fce22c0d
--- /dev/null
+++ b/gnulib/lib/sig2str.c
@@ -0,0 +1,343 @@
+/* sig2str.c -- convert between signal names and numbers
+
+ Copyright (C) 2002, 2004, 2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include <limits.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "sig2str.h"
+
+#ifndef SIGRTMIN
+# define SIGRTMIN 0
+# undef SIGRTMAX
+#endif
+#ifndef SIGRTMAX
+# define SIGRTMAX (SIGRTMIN - 1)
+#endif
+
+#define NUMNAME(name) { SIG##name, #name }
+
+/* Signal names and numbers. Put the preferred name first. */
+static struct numname { int num; char const name[8]; } numname_table[] =
+ {
+ /* Signals required by POSIX 1003.1-2001 base, listed in
+ traditional numeric order. */
+#ifdef SIGHUP
+ NUMNAME (HUP),
+#endif
+#ifdef SIGINT
+ NUMNAME (INT),
+#endif
+#ifdef SIGQUIT
+ NUMNAME (QUIT),
+#endif
+#ifdef SIGILL
+ NUMNAME (ILL),
+#endif
+#ifdef SIGTRAP
+ NUMNAME (TRAP),
+#endif
+#ifdef SIGABRT
+ NUMNAME (ABRT),
+#endif
+#ifdef SIGFPE
+ NUMNAME (FPE),
+#endif
+#ifdef SIGKILL
+ NUMNAME (KILL),
+#endif
+#ifdef SIGBUS
+ NUMNAME (BUS),
+#endif
+#ifdef SIGSEGV
+ NUMNAME (SEGV),
+#endif
+#ifdef SIGPIPE
+ NUMNAME (PIPE),
+#endif
+#ifdef SIGALRM
+ NUMNAME (ALRM),
+#endif
+#ifdef SIGTERM
+ NUMNAME (TERM),
+#endif
+#ifdef SIGUSR1
+ NUMNAME (USR1),
+#endif
+#ifdef SIGUSR2
+ NUMNAME (USR2),
+#endif
+#ifdef SIGCHLD
+ NUMNAME (CHLD),
+#endif
+#ifdef SIGURG
+ NUMNAME (URG),
+#endif
+#ifdef SIGSTOP
+ NUMNAME (STOP),
+#endif
+#ifdef SIGTSTP
+ NUMNAME (TSTP),
+#endif
+#ifdef SIGCONT
+ NUMNAME (CONT),
+#endif
+#ifdef SIGTTIN
+ NUMNAME (TTIN),
+#endif
+#ifdef SIGTTOU
+ NUMNAME (TTOU),
+#endif
+
+ /* Signals required by POSIX 1003.1-2001 with the XSI extension. */
+#ifdef SIGSYS
+ NUMNAME (SYS),
+#endif
+#ifdef SIGPOLL
+ NUMNAME (POLL),
+#endif
+#ifdef SIGVTALRM
+ NUMNAME (VTALRM),
+#endif
+#ifdef SIGPROF
+ NUMNAME (PROF),
+#endif
+#ifdef SIGXCPU
+ NUMNAME (XCPU),
+#endif
+#ifdef SIGXFSZ
+ NUMNAME (XFSZ),
+#endif
+
+ /* Unix Version 7. */
+#ifdef SIGIOT
+ NUMNAME (IOT), /* Older name for ABRT. */
+#endif
+#ifdef SIGEMT
+ NUMNAME (EMT),
+#endif
+
+ /* USG Unix. */
+#ifdef SIGPHONE
+ NUMNAME (PHONE),
+#endif
+#ifdef SIGWIND
+ NUMNAME (WIND),
+#endif
+
+ /* Unix System V. */
+#ifdef SIGCLD
+ NUMNAME (CLD),
+#endif
+#ifdef SIGPWR
+ NUMNAME (PWR),
+#endif
+
+ /* GNU/Linux 2.2 and Solaris 8. */
+#ifdef SIGCANCEL
+ NUMNAME (CANCEL),
+#endif
+#ifdef SIGLWP
+ NUMNAME (LWP),
+#endif
+#ifdef SIGWAITING
+ NUMNAME (WAITING),
+#endif
+#ifdef SIGFREEZE
+ NUMNAME (FREEZE),
+#endif
+#ifdef SIGTHAW
+ NUMNAME (THAW),
+#endif
+#ifdef SIGLOST
+ NUMNAME (LOST),
+#endif
+#ifdef SIGWINCH
+ NUMNAME (WINCH),
+#endif
+
+ /* GNU/Linux 2.2. */
+#ifdef SIGINFO
+ NUMNAME (INFO),
+#endif
+#ifdef SIGIO
+ NUMNAME (IO),
+#endif
+#ifdef SIGSTKFLT
+ NUMNAME (STKFLT),
+#endif
+
+ /* AIX 5L. */
+#ifdef SIGDANGER
+ NUMNAME (DANGER),
+#endif
+#ifdef SIGGRANT
+ NUMNAME (GRANT),
+#endif
+#ifdef SIGMIGRATE
+ NUMNAME (MIGRATE),
+#endif
+#ifdef SIGMSG
+ NUMNAME (MSG),
+#endif
+#ifdef SIGPRE
+ NUMNAME (PRE),
+#endif
+#ifdef SIGRETRACT
+ NUMNAME (RETRACT),
+#endif
+#ifdef SIGSAK
+ NUMNAME (SAK),
+#endif
+#ifdef SIGSOUND
+ NUMNAME (SOUND),
+#endif
+
+ /* Older AIX versions. */
+#ifdef SIGALRM1
+ NUMNAME (ALRM1), /* unknown; taken from Bash 2.05 */
+#endif
+#ifdef SIGKAP
+ NUMNAME (KAP), /* Older name for SIGGRANT. */
+#endif
+#ifdef SIGVIRT
+ NUMNAME (VIRT), /* unknown; taken from Bash 2.05 */
+#endif
+#ifdef SIGWINDOW
+ NUMNAME (WINDOW), /* Older name for SIGWINCH. */
+#endif
+
+ /* BeOS */
+#ifdef SIGKILLTHR
+ NUMNAME (KILLTHR),
+#endif
+
+ /* Older HP-UX versions. */
+#ifdef SIGDIL
+ NUMNAME (DIL),
+#endif
+
+ /* Korn shell and Bash, of uncertain vintage. */
+ { 0, "EXIT" }
+ };
+
+#define NUMNAME_ENTRIES (sizeof numname_table / sizeof numname_table[0])
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* Convert the signal name SIGNAME to a signal number. Return the
+ signal number if successful, -1 otherwise. */
+
+static int
+str2signum (char const *signame)
+{
+ if (ISDIGIT (*signame))
+ {
+ char *endp;
+ long int n = strtol (signame, &endp, 10);
+ if (! *endp && n <= SIGNUM_BOUND)
+ return n;
+ }
+ else
+ {
+ unsigned int i;
+ for (i = 0; i < NUMNAME_ENTRIES; i++)
+ if (strcmp (numname_table[i].name, signame) == 0)
+ return numname_table[i].num;
+
+ {
+ char *endp;
+ int rtmin = SIGRTMIN;
+ int rtmax = SIGRTMAX;
+
+ if (0 < rtmin && strncmp (signame, "RTMIN", 5) == 0)
+ {
+ long int n = strtol (signame + 5, &endp, 10);
+ if (! *endp && 0 <= n && n <= rtmax - rtmin)
+ return rtmin + n;
+ }
+ else if (0 < rtmax && strncmp (signame, "RTMAX", 5) == 0)
+ {
+ long int n = strtol (signame + 5, &endp, 10);
+ if (! *endp && rtmin - rtmax <= n && n <= 0)
+ return rtmax + n;
+ }
+ }
+ }
+
+ return -1;
+}
+
+/* Convert the signal name SIGNAME to the signal number *SIGNUM.
+ Return 0 if successful, -1 otherwise. */
+
+int
+str2sig (char const *signame, int *signum)
+{
+ *signum = str2signum (signame);
+ return *signum < 0 ? -1 : 0;
+}
+
+/* Convert SIGNUM to a signal name in SIGNAME. SIGNAME must point to
+ a buffer of at least SIG2STR_MAX bytes. Return 0 if successful, -1
+ otherwise. */
+
+int
+sig2str (int signum, char *signame)
+{
+ unsigned int i;
+ for (i = 0; i < NUMNAME_ENTRIES; i++)
+ if (numname_table[i].num == signum)
+ {
+ strcpy (signame, numname_table[i].name);
+ return 0;
+ }
+
+ {
+ int rtmin = SIGRTMIN;
+ int rtmax = SIGRTMAX;
+
+ if (! (rtmin <= signum && signum <= rtmax))
+ return -1;
+
+ if (signum <= rtmin + (rtmax - rtmin) / 2)
+ {
+ int delta = signum - rtmin;
+ sprintf (signame, delta ? "RTMIN+%d" : "RTMIN", delta);
+ }
+ else
+ {
+ int delta = rtmax - signum;
+ sprintf (signame, delta ? "RTMAX-%d" : "RTMAX", delta);
+ }
+
+ return 0;
+ }
+}
diff --git a/gnulib/lib/sig2str.h b/gnulib/lib/sig2str.h
new file mode 100644
index 00000000..a9e71848
--- /dev/null
+++ b/gnulib/lib/sig2str.h
@@ -0,0 +1,43 @@
+/* sig2str.h -- convert between signal names and numbers
+
+ Copyright (C) 2002, 2005, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <signal.h>
+
+/* Don't override system declarations of SIG2STR_MAX, sig2str, str2sig. */
+#ifndef SIG2STR_MAX
+
+# include "intprops.h"
+
+/* Size of a buffer needed to hold a signal name like "HUP". */
+# define SIG2STR_MAX (sizeof "SIGRTMAX" + INT_STRLEN_BOUND (int) - 1)
+
+int sig2str (int, char *);
+int str2sig (char const *, int *);
+
+#endif
+
+/* An upper bound on signal numbers allowed by the system. */
+
+#if defined _sys_nsig
+# define SIGNUM_BOUND (_sys_nsig - 1)
+#elif defined NSIG
+# define SIGNUM_BOUND (NSIG - 1)
+#else
+# define SIGNUM_BOUND 64
+#endif
diff --git a/gnulib/lib/sigaction.c b/gnulib/lib/sigaction.c
new file mode 100644
index 00000000..e14bd964
--- /dev/null
+++ b/gnulib/lib/sigaction.c
@@ -0,0 +1,204 @@
+/* POSIX compatible signal blocking.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Eric Blake <ebb9@byu.net>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/* This implementation of sigaction is tailored to Woe32 behavior:
+ signal() has SysV semantics (ie. the handler is uninstalled before
+ it is invoked). This is an inherent data race if an asynchronous
+ signal is sent twice in a row before we can reinstall our handler,
+ but there's nothing we can do about it. Meanwhile, sigprocmask()
+ is not present, and while we can use the gnulib replacement to
+ provide critical sections, it too suffers from potential data races
+ in the face of an ill-timed asynchronous signal. And we compound
+ the situation by reading static storage in a signal handler, which
+ POSIX warns is not generically async-signal-safe. Oh well.
+
+ Additionally:
+ - We don't implement SA_NOCLDSTOP or SA_NOCLDWAIT, because SIGCHLD
+ is not defined.
+ - We don't implement SA_ONSTACK, because sigaltstack() is not present.
+ - We ignore SA_RESTART, because blocking Win32 calls are not interrupted
+ anyway when an asynchronous signal occurs, and the MSVCRT runtime
+ never sets errno to EINTR.
+ - We don't implement SA_SIGINFO because it is impossible to do so
+ portably.
+
+ POSIX states that an application should not mix signal() and
+ sigaction(). We support the use of signal() within the gnulib
+ sigprocmask() substitute, but all other application code linked
+ with this module should stick with only sigaction(). */
+
+/* Check some of our assumptions. */
+#if defined SIGCHLD || defined HAVE_SIGALTSTACK || defined HAVE_SIGINTERRUPT
+# error "Revisit the assumptions made in the sigaction module"
+#endif
+
+/* Out-of-range substitutes make a good fallback for uncatchable
+ signals. */
+#ifndef SIGKILL
+# define SIGKILL (-1)
+#endif
+#ifndef SIGSTOP
+# define SIGSTOP (-1)
+#endif
+
+/* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias
+ for the signal SIGABRT. Only one signal handler is stored for both
+ SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# undef SIGABRT_COMPAT
+# define SIGABRT_COMPAT 6
+#endif
+
+/* A signal handler. */
+typedef void (*handler_t) (int signal);
+
+/* Set of current actions. If sa_handler for an entry is NULL, then
+ that signal is not currently handled by the sigaction handler. */
+static struct sigaction volatile action_array[NSIG] /* = 0 */;
+
+/* Signal handler that is installed for signals. */
+static void
+sigaction_handler (int sig)
+{
+ handler_t handler;
+ sigset_t mask;
+ sigset_t oldmask;
+ int saved_errno = errno;
+ if (sig < 0 || NSIG <= sig || !action_array[sig].sa_handler)
+ {
+ /* Unexpected situation; be careful to avoid recursive abort. */
+ if (sig == SIGABRT)
+ signal (SIGABRT, SIG_DFL);
+ abort ();
+ }
+
+ /* Reinstall the signal handler when required; otherwise update the
+ bookkeeping so that the user's handler may call sigaction and get
+ accurate results. We know the signal isn't currently blocked, or
+ we wouldn't be in its handler, therefore we know that we are not
+ interrupting a sigaction() call. There is a race where any
+ asynchronous instance of the same signal occurring before we
+ reinstall the handler will trigger the default handler; oh
+ well. */
+ handler = action_array[sig].sa_handler;
+ if ((action_array[sig].sa_flags & SA_RESETHAND) == 0)
+ signal (sig, sigaction_handler);
+ else
+ action_array[sig].sa_handler = NULL;
+
+ /* Block appropriate signals. */
+ mask = action_array[sig].sa_mask;
+ if ((action_array[sig].sa_flags & SA_NODEFER) == 0)
+ sigaddset (&mask, sig);
+ sigprocmask (SIG_BLOCK, &mask, &oldmask);
+
+ /* Invoke the user's handler, then restore prior mask. */
+ errno = saved_errno;
+ handler (sig);
+ saved_errno = errno;
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ errno = saved_errno;
+}
+
+/* Change and/or query the action that will be taken on delivery of
+ signal SIG. If not NULL, ACT describes the new behavior. If not
+ NULL, OACT is set to the prior behavior. Return 0 on success, or
+ set errno and return -1 on failure. */
+int
+sigaction (int sig, const struct sigaction *restrict act,
+ struct sigaction *restrict oact)
+{
+ sigset_t mask;
+ sigset_t oldmask;
+ int saved_errno;
+
+ if (sig < 0 || NSIG <= sig || sig == SIGKILL || sig == SIGSTOP
+ || (act && act->sa_handler == SIG_ERR))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ /* POSIX requires sigaction() to be async-signal-safe. In other
+ words, if an asynchronous signal can occur while we are anywhere
+ inside this function, the user's handler could then call
+ sigaction() recursively and expect consistent results. We meet
+ this rule by using sigprocmask to block all signals before
+ modifying any data structure that could be read from a signal
+ handler; this works since we know that the gnulib sigprocmask
+ replacement does not try to use sigaction() from its handler. */
+ if (!act && !oact)
+ return 0;
+ sigfillset (&mask);
+ sigprocmask (SIG_BLOCK, &mask, &oldmask);
+ if (oact)
+ {
+ if (action_array[sig].sa_handler)
+ *oact = action_array[sig];
+ else
+ {
+ /* Safe to change the handler at will here, since all
+ signals are currently blocked. */
+ oact->sa_handler = signal (sig, SIG_DFL);
+ if (oact->sa_handler == SIG_ERR)
+ goto failure;
+ signal (sig, oact->sa_handler);
+ oact->sa_flags = SA_RESETHAND | SA_NODEFER;
+ sigemptyset (&oact->sa_mask);
+ }
+ }
+
+ if (act)
+ {
+ /* Safe to install the handler before updating action_array,
+ since all signals are currently blocked. */
+ if (act->sa_handler == SIG_DFL || act->sa_handler == SIG_IGN)
+ {
+ if (signal (sig, act->sa_handler) == SIG_ERR)
+ goto failure;
+ action_array[sig].sa_handler = NULL;
+ }
+ else
+ {
+ if (signal (sig, sigaction_handler) == SIG_ERR)
+ goto failure;
+ action_array[sig] = *act;
+ }
+ }
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ return 0;
+
+ failure:
+ saved_errno = errno;
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ errno = saved_errno;
+ return -1;
+}
diff --git a/gnulib/lib/siglist.h b/gnulib/lib/siglist.h
new file mode 100644
index 00000000..e372429a
--- /dev/null
+++ b/gnulib/lib/siglist.h
@@ -0,0 +1,130 @@
+/* Canonical list of all signal names.
+ Copyright (C) 1996, 1997, 1998, 1999, 2008, 2009, 2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+/* This file should be usable for any platform, since it just associates
+ the SIG* macros with text names and descriptions. The actual values
+ come from <bits/signum.h> (via <signal.h>). For any signal macros do not
+ exist on every platform, we can use #ifdef tests here and still use
+ this single common file for all platforms. */
+
+/* This file is included multiple times. */
+
+/* Standard signals */
+#ifdef SIGHUP
+ init_sig (SIGHUP, "HUP", N_("Hangup"))
+#endif
+#ifdef SIGINT
+ init_sig (SIGINT, "INT", N_("Interrupt"))
+#endif
+#ifdef SIGQUIT
+ init_sig (SIGQUIT, "QUIT", N_("Quit"))
+#endif
+#ifdef SIGILL
+ init_sig (SIGILL, "ILL", N_("Illegal instruction"))
+#endif
+#ifdef SIGTRAP
+ init_sig (SIGTRAP, "TRAP", N_("Trace/breakpoint trap"))
+#endif
+#ifdef SIGABRT
+ init_sig (SIGABRT, "ABRT", N_("Aborted"))
+#endif
+#ifdef SIGFPE
+ init_sig (SIGFPE, "FPE", N_("Floating point exception"))
+#endif
+#ifdef SIGKILL
+ init_sig (SIGKILL, "KILL", N_("Killed"))
+#endif
+#ifdef SIGBUS
+ init_sig (SIGBUS, "BUS", N_("Bus error"))
+#endif
+#ifdef SIGSEGV
+ init_sig (SIGSEGV, "SEGV", N_("Segmentation fault"))
+#endif
+#ifdef SIGPIPE
+ init_sig (SIGPIPE, "PIPE", N_("Broken pipe"))
+#endif
+#ifdef SIGALRM
+ init_sig (SIGALRM, "ALRM", N_("Alarm clock"))
+#endif
+#ifdef SIGTERM
+ init_sig (SIGTERM, "TERM", N_("Terminated"))
+#endif
+#ifdef SIGURG
+ init_sig (SIGURG, "URG", N_("Urgent I/O condition"))
+#endif
+#ifdef SIGSTOP
+ init_sig (SIGSTOP, "STOP", N_("Stopped (signal)"))
+#endif
+#ifdef SIGTSTP
+ init_sig (SIGTSTP, "TSTP", N_("Stopped"))
+#endif
+#ifdef SIGCONT
+ init_sig (SIGCONT, "CONT", N_("Continued"))
+#endif
+#ifdef SIGCHLD
+ init_sig (SIGCHLD, "CHLD", N_("Child exited"))
+#endif
+#ifdef SIGTTIN
+ init_sig (SIGTTIN, "TTIN", N_("Stopped (tty input)"))
+#endif
+#ifdef SIGTTOU
+ init_sig (SIGTTOU, "TTOU", N_("Stopped (tty output)"))
+#endif
+#ifdef SIGIO
+ init_sig (SIGIO, "IO", N_("I/O possible"))
+#endif
+#ifdef SIGXCPU
+ init_sig (SIGXCPU, "XCPU", N_("CPU time limit exceeded"))
+#endif
+#ifdef SIGXFSZ
+ init_sig (SIGXFSZ, "XFSZ", N_("File size limit exceeded"))
+#endif
+#ifdef SIGVTALRM
+ init_sig (SIGVTALRM, "VTALRM", N_("Virtual timer expired"))
+#endif
+#ifdef SIGPROF
+ init_sig (SIGPROF, "PROF", N_("Profiling timer expired"))
+#endif
+#ifdef SIGWINCH
+ init_sig (SIGWINCH, "WINCH", N_("Window changed"))
+#endif
+#ifdef SIGUSR1
+ init_sig (SIGUSR1, "USR1", N_("User defined signal 1"))
+#endif
+#ifdef SIGUSR2
+ init_sig (SIGUSR2, "USR2", N_("User defined signal 2"))
+#endif
+
+/* Variations */
+#ifdef SIGEMT
+ init_sig (SIGEMT, "EMT", N_("EMT trap"))
+#endif
+#ifdef SIGSYS
+ init_sig (SIGSYS, "SYS", N_("Bad system call"))
+#endif
+#ifdef SIGSTKFLT
+ init_sig (SIGSTKFLT, "STKFLT", N_("Stack fault"))
+#endif
+#ifdef SIGINFO
+ init_sig (SIGINFO, "INFO", N_("Information request"))
+#elif defined(SIGPWR) && (!defined(SIGLOST) || (SIGPWR != SIGLOST))
+ init_sig (SIGPWR, "PWR", N_("Power failure"))
+#endif
+#ifdef SIGLOST
+ init_sig (SIGLOST, "LOST", N_("Resource lost"))
+#endif
diff --git a/gnulib/lib/signal.in.h b/gnulib/lib/signal.in.h
new file mode 100644
index 00000000..131132ab
--- /dev/null
+++ b/gnulib/lib/signal.in.h
@@ -0,0 +1,249 @@
+/* A GNU-like <signal.h>.
+
+ Copyright (C) 2006-2010 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if defined __need_sig_atomic_t || defined __need_sigset_t
+/* Special invocation convention inside glibc header files. */
+
+# @INCLUDE_NEXT@ @NEXT_SIGNAL_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _GL_SIGNAL_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_SIGNAL_H@
+
+#ifndef _GL_SIGNAL_H
+#define _GL_SIGNAL_H
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Define pid_t, uid_t.
+ Also, mingw defines sigset_t not in <signal.h>, but in <sys/types.h>. */
+#include <sys/types.h>
+
+/* On AIX, sig_atomic_t already includes volatile. C99 requires that
+ 'volatile sig_atomic_t' ignore the extra modifier, but C89 did not.
+ Hence, redefine this to a non-volatile type as needed. */
+#if ! @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+typedef int rpl_sig_atomic_t;
+# undef sig_atomic_t
+# define sig_atomic_t rpl_sig_atomic_t
+#endif
+
+/* A set or mask of signals. */
+#if !@HAVE_SIGSET_T@
+typedef unsigned int sigset_t;
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_SIGNAL_H_SIGPIPE@
+# ifndef SIGPIPE
+/* Define SIGPIPE to a value that does not overlap with other signals. */
+# define SIGPIPE 13
+# define GNULIB_defined_SIGPIPE 1
+/* To actually use SIGPIPE, you also need the gnulib modules 'sigprocmask',
+ 'write', 'stdio'. */
+# endif
+#endif
+
+
+#if @GNULIB_SIGPROCMASK@
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+
+/* Maximum signal number + 1. */
+# ifndef NSIG
+# define NSIG 32
+# endif
+
+/* This code supports only 32 signals. */
+typedef int verify_NSIG_constraint[2 * (NSIG <= 32) - 1];
+
+/* Test whether a given signal is contained in a signal set. */
+extern int sigismember (const sigset_t *set, int sig) _GL_ARG_NONNULL ((1));
+
+/* Initialize a signal set to the empty set. */
+extern int sigemptyset (sigset_t *set) _GL_ARG_NONNULL ((1));
+
+/* Add a signal to a signal set. */
+extern int sigaddset (sigset_t *set, int sig) _GL_ARG_NONNULL ((1));
+
+/* Remove a signal from a signal set. */
+extern int sigdelset (sigset_t *set, int sig) _GL_ARG_NONNULL ((1));
+
+/* Fill a signal set with all possible signals. */
+extern int sigfillset (sigset_t *set) _GL_ARG_NONNULL ((1));
+
+/* Return the set of those blocked signals that are pending. */
+extern int sigpending (sigset_t *set) _GL_ARG_NONNULL ((1));
+
+/* If OLD_SET is not NULL, put the current set of blocked signals in *OLD_SET.
+ Then, if SET is not NULL, affect the current set of blocked signals by
+ combining it with *SET as indicated in OPERATION.
+ In this implementation, you are not allowed to change a signal handler
+ while the signal is blocked. */
+# define SIG_BLOCK 0 /* blocked_set = blocked_set | *set; */
+# define SIG_SETMASK 1 /* blocked_set = *set; */
+# define SIG_UNBLOCK 2 /* blocked_set = blocked_set & ~*set; */
+extern int sigprocmask (int operation, const sigset_t *set, sigset_t *old_set);
+
+# define signal rpl_signal
+/* Install the handler FUNC for signal SIG, and return the previous
+ handler. */
+extern void (*signal (int sig, void (*func) (int))) (int);
+
+# if GNULIB_defined_SIGPIPE
+
+/* Raise signal SIG. */
+# undef raise
+# define raise rpl_raise
+extern int raise (int sig);
+
+# endif
+
+# endif /* !@HAVE_POSIX_SIGNALBLOCKING@ */
+#elif defined GNULIB_POSIXCHECK
+# undef sigaddset
+# if HAVE_RAW_DECL_SIGADDSET
+_GL_WARN_ON_USE (sigaddset, "sigaddset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigdelset
+# if HAVE_RAW_DECL_SIGDELSET
+_GL_WARN_ON_USE (sigdelset, "sigdelset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigemptyset
+# if HAVE_RAW_DECL_SIGEMPTYSET
+_GL_WARN_ON_USE (sigemptyset, "sigemptyset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigfillset
+# if HAVE_RAW_DECL_SIGFILLSET
+_GL_WARN_ON_USE (sigfillset, "sigfillset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigismember
+# if HAVE_RAW_DECL_SIGISMEMBER
+_GL_WARN_ON_USE (sigismember, "sigismember is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigpending
+# if HAVE_RAW_DECL_SIGPENDING
+_GL_WARN_ON_USE (sigpending, "sigpending is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigprocmask
+# if HAVE_RAW_DECL_SIGPROCMASK
+_GL_WARN_ON_USE (sigprocmask, "sigprocmask is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+#endif /* @GNULIB_SIGPROCMASK@ */
+
+
+#if @GNULIB_SIGACTION@
+# if !@HAVE_SIGACTION@
+
+# if !@HAVE_SIGINFO_T@
+/* Present to allow compilation, but unsupported by gnulib. */
+union sigval
+{
+ int sival_int;
+ void *sival_ptr;
+};
+
+/* Present to allow compilation, but unsupported by gnulib. */
+struct siginfo_t
+{
+ int si_signo;
+ int si_code;
+ int si_errno;
+ pid_t si_pid;
+ uid_t si_uid;
+ void *si_addr;
+ int si_status;
+ long si_band;
+ union sigval si_value;
+};
+typedef struct siginfo_t siginfo_t;
+# endif /* !@HAVE_SIGINFO_T@ */
+
+/* We assume that platforms which lack the sigaction() function also lack
+ the 'struct sigaction' type, and vice versa. */
+
+struct sigaction
+{
+ union
+ {
+ void (*_sa_handler) (int);
+ /* Present to allow compilation, but unsupported by gnulib. POSIX
+ says that implementations may, but not must, make sa_sigaction
+ overlap with sa_handler, but we know of no implementation where
+ they do not overlap. */
+ void (*_sa_sigaction) (int, siginfo_t *, void *);
+ } _sa_func;
+ sigset_t sa_mask;
+ /* Not all POSIX flags are supported. */
+ int sa_flags;
+};
+# define sa_handler _sa_func._sa_handler
+# define sa_sigaction _sa_func._sa_sigaction
+/* Unsupported flags are not present. */
+# define SA_RESETHAND 1
+# define SA_NODEFER 2
+# define SA_RESTART 4
+
+extern int sigaction (int, const struct sigaction *restrict,
+ struct sigaction *restrict);
+
+# elif !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+
+# define sa_sigaction sa_handler
+
+# endif /* !@HAVE_SIGACTION@, !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ */
+#elif defined GNULIB_POSIXCHECK
+# undef sigaction
+# if HAVE_RAW_DECL_SIGACTION
+_GL_WARN_ON_USE (sigaction, "sigaction is unportable - "
+ "use the gnulib module sigaction for portability");
+# endif
+#endif
+
+/* Some systems don't have SA_NODEFER. */
+#ifndef SA_NODEFER
+# define SA_NODEFER 0
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_SIGNAL_H */
+#endif /* _GL_SIGNAL_H */
+#endif
diff --git a/gnulib/lib/signbitd.c b/gnulib/lib/signbitd.c
new file mode 100644
index 00000000..3645615e
--- /dev/null
+++ b/gnulib/lib/signbitd.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnand-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitd_OPTIMIZED_MACRO
+# undef gl_signbitd
+#endif
+
+int
+gl_signbitd (double arg)
+{
+#if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { double value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGN_IN_LIBC
+ return copysign (1.0, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnand (arg))
+ return 0;
+ if (arg < 0.0)
+ return 1;
+ else if (arg == 0.0)
+ {
+ /* Distinguish 0.0 and -0.0. */
+ static double plus_zero = 0.0;
+ double arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_DBL) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/signbitf.c b/gnulib/lib/signbitf.c
new file mode 100644
index 00000000..becc7e0c
--- /dev/null
+++ b/gnulib/lib/signbitf.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnanf-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitf_OPTIMIZED_MACRO
+# undef gl_signbitf
+#endif
+
+int
+gl_signbitf (float arg)
+{
+#if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { float value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGNF_IN_LIBC
+ return copysignf (1.0f, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnanf (arg))
+ return 0;
+ if (arg < 0.0f)
+ return 1;
+ else if (arg == 0.0f)
+ {
+ /* Distinguish 0.0f and -0.0f. */
+ static float plus_zero = 0.0f;
+ float arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_FLT) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/signbitl.c b/gnulib/lib/signbitl.c
new file mode 100644
index 00000000..c0dd49fa
--- /dev/null
+++ b/gnulib/lib/signbitl.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnanl-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitl_OPTIMIZED_MACRO
+# undef gl_signbitl
+#endif
+
+int
+gl_signbitl (long double arg)
+{
+#if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { long double value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGNL_IN_LIBC
+ return copysignl (1.0L, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnanl (arg))
+ return 0;
+ if (arg < 0.0L)
+ return 1;
+ else if (arg == 0.0L)
+ {
+ /* Distinguish 0.0L and -0.0L. */
+ static long double plus_zero = 0.0L;
+ long double arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/sigpipe-die.c b/gnulib/lib/sigpipe-die.c
new file mode 100644
index 00000000..8269911b
--- /dev/null
+++ b/gnulib/lib/sigpipe-die.c
@@ -0,0 +1,82 @@
+/* Report a SIGPIPE signal and exit.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+/* Specification. */
+#include "sigpipe-die.h"
+
+#include <signal.h>
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+sigpipe_die (void)
+{
+ error (exit_failure, 0, "%s",
+ _("error writing to a closed pipe or socket"));
+
+ /* Ensure that this function really does not return. */
+ abort ();
+}
+
+static void (*prepare_die_hook) (void);
+
+/* This is the signal handler for SIGPIPE. It is invoked synchronously,
+ therefore it can make library calls to malloc(), gettext(), exit() etc. -
+ although in general it is undefined behaviour to do such calls from
+ within signal handlers. */
+static void
+sigpipe_die_handler (int sig)
+{
+ if (prepare_die_hook != NULL)
+ (*prepare_die_hook) ();
+ sigpipe_die ();
+}
+
+void
+install_sigpipe_die_handler (void (*prepare_die) (void))
+{
+ prepare_die_hook = prepare_die;
+
+ /* Install the handler. */
+ {
+ struct sigaction action;
+
+ action.sa_handler = sigpipe_die_handler;
+ action.sa_flags = 0;
+ sigemptyset (&action.sa_mask);
+ if (sigaction (SIGPIPE, &action, NULL) >= 0)
+ {
+ /* Unblock the signal (just in case). This is needed because if the
+ signal was blocked in the parent process, it is also blocked in
+ this process: the mask of blocked signals is inherited across
+ fork/exec (except for SIGCHLD). */
+ sigset_t sigpipe_set;
+
+ sigemptyset (&sigpipe_set);
+ sigaddset (&sigpipe_set, SIGPIPE);
+ sigprocmask (SIG_UNBLOCK, &sigpipe_set, NULL);
+ }
+ }
+}
diff --git a/gnulib/lib/sigpipe-die.h b/gnulib/lib/sigpipe-die.h
new file mode 100644
index 00000000..26073708
--- /dev/null
+++ b/gnulib/lib/sigpipe-die.h
@@ -0,0 +1,74 @@
+/* Report a SIGPIPE signal and exit.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+/* SIGPIPE is the signal sent to a process calling write() on a pipe with no
+ readers. Together with the signal, the write() call is terminated with
+ return value -1, errno = EPIPE. Note that SIGPIPE is a *synchronous*
+ signal: it occurs only during write(), without delay (unless blocked).
+
+ The default reaction on SIGPIPE, namely terminating the process without
+ an error message, is suitable for programs which only produce output to
+ standard output and don't have side effects.
+
+ When a program has side effects, other than writing to standard output, the
+ suitable behaviour is either
+ (a) to exit with an error message
+ or - in certain cases, for example when writing to subprocesses -
+ (b) to continue the operation without writing to the pipe/socket with
+ no readers.
+
+ This file provides support for (a).
+ For (b), the program needs to know which of the output file descriptors
+ has no readers. This is usually implemented by blocking the SIGPIPE signal
+ and handling an EPIPE error indicator in all affected library calls
+ (write(), send(), fwrite(), fflush(), fclose(), etc.). */
+
+#ifndef _SIGPIPE_DIE_H
+#define _SIGPIPE_DIE_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+# ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+# define __attribute__(x)
+# endif
+# endif
+
+# ifndef ATTRIBUTE_NORETURN
+# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+# endif
+
+/* Emit an error message indicating a SIGPIPE signal, and terminate the
+ process with an error code. */
+extern void sigpipe_die (void) ATTRIBUTE_NORETURN;
+
+/* Install a SIGPIPE handler that invokes PREPARE_DIE and then emits an
+ error message and exits. PREPARE_DIE may be NULL, meaning a no-op. */
+extern void install_sigpipe_die_handler (void (*prepare_die) (void));
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _SIGPIPE_DIE_H */
diff --git a/gnulib/lib/sigprocmask.c b/gnulib/lib/sigprocmask.c
new file mode 100644
index 00000000..016325ec
--- /dev/null
+++ b/gnulib/lib/sigprocmask.c
@@ -0,0 +1,329 @@
+/* POSIX compatible signal blocking.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/* We assume that a platform without POSIX signal blocking functions
+ also does not have the POSIX sigaction() function, only the
+ signal() function. We also assume signal() has SysV semantics,
+ where any handler is uninstalled prior to being invoked. This is
+ true for Woe32 platforms. */
+
+/* We use raw signal(), but also provide a wrapper rpl_signal() so
+ that applications can query or change a blocked signal. */
+#undef signal
+
+/* Provide invalid signal numbers as fallbacks if the uncatchable
+ signals are not defined. */
+#ifndef SIGKILL
+# define SIGKILL (-1)
+#endif
+#ifndef SIGSTOP
+# define SIGSTOP (-1)
+#endif
+
+/* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias
+ for the signal SIGABRT. Only one signal handler is stored for both
+ SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# undef SIGABRT_COMPAT
+# define SIGABRT_COMPAT 6
+#endif
+#ifdef SIGABRT_COMPAT
+# define SIGABRT_COMPAT_MASK (1U << SIGABRT_COMPAT)
+#else
+# define SIGABRT_COMPAT_MASK 0
+#endif
+
+typedef void (*handler_t) (int);
+
+/* Handling of gnulib defined signals. */
+
+#if GNULIB_defined_SIGPIPE
+static handler_t SIGPIPE_handler = SIG_DFL;
+#endif
+
+#if GNULIB_defined_SIGPIPE
+static handler_t
+ext_signal (int sig, handler_t handler)
+{
+ switch (sig)
+ {
+ case SIGPIPE:
+ {
+ handler_t old_handler = SIGPIPE_handler;
+ SIGPIPE_handler = handler;
+ return old_handler;
+ }
+ default: /* System defined signal */
+ return signal (sig, handler);
+ }
+}
+# define signal ext_signal
+#endif
+
+int
+sigismember (const sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ return (*set >> sig) & 1;
+ }
+ else
+ return 0;
+}
+
+int
+sigemptyset (sigset_t *set)
+{
+ *set = 0;
+ return 0;
+}
+
+int
+sigaddset (sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ *set |= 1U << sig;
+ return 0;
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+int
+sigdelset (sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ *set &= ~(1U << sig);
+ return 0;
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+
+int
+sigfillset (sigset_t *set)
+{
+ *set = ((2U << (NSIG - 1)) - 1) & ~ SIGABRT_COMPAT_MASK;
+ return 0;
+}
+
+/* Set of currently blocked signals. */
+static volatile sigset_t blocked_set /* = 0 */;
+
+/* Set of currently blocked and pending signals. */
+static volatile sig_atomic_t pending_array[NSIG] /* = { 0 } */;
+
+/* Signal handler that is installed for blocked signals. */
+static void
+blocked_handler (int sig)
+{
+ /* Reinstall the handler, in case the signal occurs multiple times
+ while blocked. There is an inherent race where an asynchronous
+ signal in between when the kernel uninstalled the handler and
+ when we reinstall it will trigger the default handler; oh
+ well. */
+ signal (sig, blocked_handler);
+ if (sig >= 0 && sig < NSIG)
+ pending_array[sig] = 1;
+}
+
+int
+sigpending (sigset_t *set)
+{
+ sigset_t pending = 0;
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if (pending_array[sig])
+ pending |= 1U << sig;
+ *set = pending;
+ return 0;
+}
+
+/* The previous signal handlers.
+ Only the array elements corresponding to blocked signals are relevant. */
+static volatile handler_t old_handlers[NSIG];
+
+int
+sigprocmask (int operation, const sigset_t *set, sigset_t *old_set)
+{
+ if (old_set != NULL)
+ *old_set = blocked_set;
+
+ if (set != NULL)
+ {
+ sigset_t new_blocked_set;
+ sigset_t to_unblock;
+ sigset_t to_block;
+
+ switch (operation)
+ {
+ case SIG_BLOCK:
+ new_blocked_set = blocked_set | *set;
+ break;
+ case SIG_SETMASK:
+ new_blocked_set = *set;
+ break;
+ case SIG_UNBLOCK:
+ new_blocked_set = blocked_set & ~*set;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+ to_unblock = blocked_set & ~new_blocked_set;
+ to_block = new_blocked_set & ~blocked_set;
+
+ if (to_block != 0)
+ {
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if ((to_block >> sig) & 1)
+ {
+ pending_array[sig] = 0;
+ if ((old_handlers[sig] = signal (sig, blocked_handler)) != SIG_ERR)
+ blocked_set |= 1U << sig;
+ }
+ }
+
+ if (to_unblock != 0)
+ {
+ sig_atomic_t received[NSIG];
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if ((to_unblock >> sig) & 1)
+ {
+ if (signal (sig, old_handlers[sig]) != blocked_handler)
+ /* The application changed a signal handler while the signal
+ was blocked, bypassing our rpl_signal replacement.
+ We don't support this. */
+ abort ();
+ received[sig] = pending_array[sig];
+ blocked_set &= ~(1U << sig);
+ pending_array[sig] = 0;
+ }
+ else
+ received[sig] = 0;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if (received[sig])
+ raise (sig);
+ }
+ }
+ return 0;
+}
+
+/* Install the handler FUNC for signal SIG, and return the previous
+ handler. */
+handler_t
+rpl_signal (int sig, handler_t handler)
+{
+ /* We must provide a wrapper, so that a user can query what handler
+ they installed even if that signal is currently blocked. */
+ if (sig >= 0 && sig < NSIG && sig != SIGKILL && sig != SIGSTOP
+ && handler != SIG_ERR)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ if (blocked_set & (1U << sig))
+ {
+ /* POSIX states that sigprocmask and signal are both
+ async-signal-safe. This is not true of our
+ implementation - there is a slight data race where an
+ asynchronous interrupt on signal A can occur after we
+ install blocked_handler but before we have updated
+ old_handlers for signal B, such that handler A can see
+ stale information if it calls signal(B). Oh well -
+ signal handlers really shouldn't try to manipulate the
+ installed handlers of unrelated signals. */
+ handler_t result = old_handlers[sig];
+ old_handlers[sig] = handler;
+ return result;
+ }
+ else
+ return signal (sig, handler);
+ }
+ else
+ {
+ errno = EINVAL;
+ return SIG_ERR;
+ }
+}
+
+#if GNULIB_defined_SIGPIPE
+/* Raise the signal SIG. */
+int
+rpl_raise (int sig)
+# undef raise
+{
+ switch (sig)
+ {
+ case SIGPIPE:
+ if (blocked_set & (1U << sig))
+ pending_array[sig] = 1;
+ else
+ {
+ handler_t handler = SIGPIPE_handler;
+ if (handler == SIG_DFL)
+ exit (128 + SIGPIPE);
+ else if (handler != SIG_IGN)
+ (*handler) (sig);
+ }
+ return 0;
+ default: /* System defined signal */
+ return raise (sig);
+ }
+}
+#endif
diff --git a/gnulib/lib/sincosl.c b/gnulib/lib/sincosl.c
new file mode 100644
index 00000000..9fae568a
--- /dev/null
+++ b/gnulib/lib/sincosl.c
@@ -0,0 +1,898 @@
+/* Quad-precision floating point trigonometric functions on <-pi/4,pi/4>.
+ Copyright (C) 1999, 2006, 2007, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jj@ultra.linux.cz>
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "trigl.h"
+
+#include <float.h>
+#include <math.h>
+
+static const long double sin_c[] = {
+#define ONE sin_c[0]
+ 1.00000000000000000000000000000000000E+00L, /* 3fff0000000000000000000000000000 */
+
+/* cos x ~ ONE + x^2 ( SCOS1 + SCOS2 * x^2 + ... + SCOS4 * x^6 + SCOS5 * x^8 )
+ x in <0,1/256> */
+#define SCOS1 sin_c[1]
+#define SCOS2 sin_c[2]
+#define SCOS3 sin_c[3]
+#define SCOS4 sin_c[4]
+#define SCOS5 sin_c[5]
+ -5.00000000000000000000000000000000000E-01L, /* bffe0000000000000000000000000000 */
+ 4.16666666666666666666666666556146073E-02L, /* 3ffa5555555555555555555555395023 */
+ -1.38888888888888888888309442601939728E-03L, /* bff56c16c16c16c16c16a566e42c0375 */
+ 2.48015873015862382987049502531095061E-05L, /* 3fefa01a01a019ee02dcf7da2d6d5444 */
+ -2.75573112601362126593516899592158083E-07L, /* bfe927e4f5dce637cb0b54908754bde0 */
+
+/* sin x ~ ONE * x + x^3 ( SIN1 + SIN2 * x^2 + ... + SIN7 * x^12 + SIN8 * x^14 )
+ x in <0,0.1484375> */
+#define SIN1 sin_c[6]
+#define SIN2 sin_c[7]
+#define SIN3 sin_c[8]
+#define SIN4 sin_c[9]
+#define SIN5 sin_c[10]
+#define SIN6 sin_c[11]
+#define SIN7 sin_c[12]
+#define SIN8 sin_c[13]
+ -1.66666666666666666666666666666666538e-01L, /* bffc5555555555555555555555555550 */
+ 8.33333333333333333333333333307532934e-03L, /* 3ff811111111111111111111110e7340 */
+ -1.98412698412698412698412534478712057e-04L, /* bff2a01a01a01a01a01a019e7a626296 */
+ 2.75573192239858906520896496653095890e-06L, /* 3fec71de3a556c7338fa38527474b8f5 */
+ -2.50521083854417116999224301266655662e-08L, /* bfe5ae64567f544e16c7de65c2ea551f */
+ 1.60590438367608957516841576404938118e-10L, /* 3fde6124613a811480538a9a41957115 */
+ -7.64716343504264506714019494041582610e-13L, /* bfd6ae7f3d5aef30c7bc660b060ef365 */
+ 2.81068754939739570236322404393398135e-15L, /* 3fce9510115aabf87aceb2022a9a9180 */
+
+/* sin x ~ ONE * x + x^3 ( SSIN1 + SSIN2 * x^2 + ... + SSIN4 * x^6 + SSIN5 * x^8 )
+ x in <0,1/256> */
+#define SSIN1 sin_c[14]
+#define SSIN2 sin_c[15]
+#define SSIN3 sin_c[16]
+#define SSIN4 sin_c[17]
+#define SSIN5 sin_c[18]
+ -1.66666666666666666666666666666666659E-01L, /* bffc5555555555555555555555555555 */
+ 8.33333333333333333333333333146298442E-03L, /* 3ff81111111111111111111110fe195d */
+ -1.98412698412698412697726277416810661E-04L, /* bff2a01a01a01a01a019e7121e080d88 */
+ 2.75573192239848624174178393552189149E-06L, /* 3fec71de3a556c640c6aaa51aa02ab41 */
+ -2.50521016467996193495359189395805639E-08L, /* bfe5ae644ee90c47dc71839de75b2787 */
+};
+
+static const long double cos_c[] = {
+/* cos x ~ ONE + x^2 ( COS1 + COS2 * x^2 + ... + COS7 * x^12 + COS8 * x^14 )
+ x in <0,0.1484375> */
+#define COS1 cos_c[0]
+#define COS2 cos_c[1]
+#define COS3 cos_c[2]
+#define COS4 cos_c[3]
+#define COS5 cos_c[4]
+#define COS6 cos_c[5]
+#define COS7 cos_c[6]
+#define COS8 cos_c[7]
+ -4.99999999999999999999999999999999759E-01L, /* bffdfffffffffffffffffffffffffffb */
+ 4.16666666666666666666666666651287795E-02L, /* 3ffa5555555555555555555555516f30 */
+ -1.38888888888888888888888742314300284E-03L, /* bff56c16c16c16c16c16c16a463dfd0d */
+ 2.48015873015873015867694002851118210E-05L, /* 3fefa01a01a01a01a0195cebe6f3d3a5 */
+ -2.75573192239858811636614709689300351E-07L, /* bfe927e4fb7789f5aa8142a22044b51f */
+ 2.08767569877762248667431926878073669E-09L, /* 3fe21eed8eff881d1e9262d7adff4373 */
+ -1.14707451049343817400420280514614892E-11L, /* bfda9397496922a9601ed3d4ca48944b */
+ 4.77810092804389587579843296923533297E-14L, /* 3fd2ae5f8197cbcdcaf7c3fb4523414c */
+
+};
+
+#define SINCOSL_COS_HI 0
+#define SINCOSL_COS_LO 1
+#define SINCOSL_SIN_HI 2
+#define SINCOSL_SIN_LO 3
+static const long double sincosl_table[];
+
+long double
+kernel_sinl (long double x, long double y, int iy)
+{
+ long double h, l, z, sin_l, cos_l_m1;
+ int index, sign;
+
+ sign = 1;
+ if (x < 0)
+ {
+ x = -x;
+ sign = -1;
+ }
+
+ if (x < 0.1484375L) /* |x| < 0.1484375 */
+ {
+ /* Argument is small enough to approximate it by a Chebyshev
+ polynomial of degree 17. */
+ if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2^-57 */
+ if (!((int) x))
+ return x; /* generate inexact */
+
+ z = x * x;
+ return x + (x * (z * (SIN1 + z * (SIN2 + z * (SIN3 + z * (SIN4 +
+ z * (SIN5 +
+ z *
+ (SIN6 +
+ z *
+ (SIN7 +
+ z *
+ SIN8)))))))));
+ }
+ else
+ {
+ /* So that we don't have to use too large polynomial, we find
+ l and h such that x = l + h, where fabsl(l) <= 1.0/256 with 83
+ possible values for h. We look up cosl(h) and sinl(h) in
+ pre-computed tables, compute cosl(l) and sinl(l) using a
+ Chebyshev polynomial of degree 10(11) and compute
+ sinl(h+l) = sinl(h)cosl(l) + cosl(h)sinl(l). */
+ x -= 0.1484375L;
+ index = (int) (x * 128L + 0.5L);
+ h = index / 128.0L;
+ if (iy)
+ l = y - (h - x);
+ else
+ l = x - h;
+
+ z = l * l;
+ sin_l =
+ l * (ONE +
+ z * (SSIN1 +
+ z * (SSIN2 + z * (SSIN3 + z * (SSIN4 + z * SSIN5)))));
+ cos_l_m1 =
+ z * (SCOS1 + z * (SCOS2 + z * (SCOS3 + z * (SCOS4 + z * SCOS5))));
+
+ index *= 4;
+ z =
+ sincosl_table[index + SINCOSL_SIN_HI] +
+ (sincosl_table[index + SINCOSL_SIN_LO] +
+ (sincosl_table[index + SINCOSL_SIN_HI] * cos_l_m1) +
+ (sincosl_table[index + SINCOSL_COS_HI] * sin_l));
+ return z * sign;
+ }
+}
+
+long double
+kernel_cosl (long double x, long double y)
+{
+ long double h, l, z, sin_l, cos_l_m1;
+ int index;
+
+ if (x < 0)
+ x = -x;
+
+ if (x < 0.1484375L) /* |x| < 0.1484375 */
+ {
+ /* Argument is small enough to approximate it by a Chebyshev
+ polynomial of degree 16. */
+ if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2^-57 */
+ if (!((int) x))
+ return ONE; /* generate inexact */
+ z = x * x;
+ return ONE + (z * (COS1 + z * (COS2 + z * (COS3 + z * (COS4 +
+ z * (COS5 +
+ z * (COS6 +
+ z *
+ (COS7 +
+ z *
+ COS8))))))));
+ }
+ else
+ {
+ /* So that we don't have to use too large polynomial, we find
+ l and h such that x = l + h, where fabsl(l) <= 1.0/256 with 83
+ possible values for h. We look up cosl(h) and sinl(h) in
+ pre-computed tables, compute cosl(l) and sinl(l) using a
+ Chebyshev polynomial of degree 10(11) and compute
+ sinl(h+l) = sinl(h)cosl(l) + cosl(h)sinl(l). */
+ x -= 0.1484375L;
+ index = (int) (x * 128L + 0.5L);
+ h = index / 128.0L;
+ l = y - (h - x);
+ z = l * l;
+ sin_l =
+ l * (ONE +
+ z * (SSIN1 +
+ z * (SSIN2 + z * (SSIN3 + z * (SSIN4 + z * SSIN5)))));
+ cos_l_m1 =
+ z * (SCOS1 + z * (SCOS2 + z * (SCOS3 + z * (SCOS4 + z * SCOS5))));
+
+ index *= 4;
+ z = sincosl_table [index + SINCOSL_COS_HI]
+ + (sincosl_table [index + SINCOSL_COS_LO]
+ - (sincosl_table [index + SINCOSL_SIN_HI] * sin_l)
+ - (sincosl_table [index + SINCOSL_COS_HI] * cos_l_m1));
+ return z;
+ }
+}
+
+
+/* For 0.1484375 + n/128.0, n=0..82 this table contains
+ first 113 bits of cosine, then at least 113 additional
+ bits and the same for sine.
+ 0.1484375+82.0/128.0 is the smallest number among above defined numbers
+ larger than pi/4.
+ Computed using gmp.
+ */
+
+static const long double sincosl_table[] = {
+
+/* x = 1.48437500000000000000000000000000000e-01L 3ffc3000000000000000000000000000 */
+/* cos(x) = 0.fd2f5320e1b790209b4dda2f98f79caaa7b873aff1014b0fbc5243766d03cb006bc837c4358 */
+ 9.89003367927322909016887196069562069e-01L, /* 3ffefa5ea641c36f2041369bb45f31ef */
+ 2.15663692029265697782289400027743703e-35L, /* 3f8bcaaa7b873aff1014b0fbc5243767 */
+/* sin(x) = 0.25dc50bc95711d0d9787d108fd438cf5959ee0bfb7a1e36e8b1a112968f356657420e9cc9ea */
+ 1.47892995873409608580026675734609314e-01L, /* 3ffc2ee285e4ab88e86cbc3e8847ea1c */
+ 9.74950446464233268291647449768590886e-36L, /* 3f8a9eb2b3dc17f6f43c6dd16342252d */
+
+/* x = 1.56250000000000000000000000000000000e-01 3ffc4000000000000000000000000000 */
+/* cos(x) = 0.fce1a053e621438b6d60c76e8c45bf0a9dc71aa16f922acc10e95144ec796a249813c9cb649 */
+ 9.87817783816471944100503034363211317e-01L, /* 3ffef9c340a7cc428716dac18edd188b */
+ 4.74271307836705897892468107620526395e-35L, /* 3f8cf854ee38d50b7c915660874a8a27 */
+/* sin(x) = 0.27d66258bacd96a3eb335b365c87d59438c5142bb56a489e9b8db9d36234ffdebb6bdc22d8e */
+ 1.55614992773556041209920643203516258e-01L, /* 3ffc3eb312c5d66cb51f599ad9b2e43f */
+ -7.83989563419287980121718050629497270e-36L, /* bf8a4d78e75d7a8952b6ec2c8e48c594 */
+
+/* x = 1.64062500000000000000000000000000000e-01 3ffc5000000000000000000000000000 */
+/* cos(x) = 0.fc8ffa01ba6807417e05962b0d9fdf1fddb0cc4c07d22e19e08019bffa50a6c7acdb40307a3 */
+ 9.86571908399497588757337407495308409e-01L, /* 3ffef91ff40374d00e82fc0b2c561b40 */
+ -2.47327949936985362476252401212720725e-35L, /* bf8c070112799d9fc16e8f30fbff3200 */
+/* sin(x) = 0.29cfd49b8be4f665276cab01cbf0426934906c3dd105473b226e410b1450f62e53ff7c6cce1 */
+ 1.63327491736612850846866172454354370e-01L, /* 3ffc4e7ea4dc5f27b3293b65580e5f82 */
+ 1.81380344301155485770367902300754350e-36L, /* 3f88349a48361ee882a39d913720858a */
+
+/* x = 1.71875000000000000000000000000000000e-01 3ffc6000000000000000000000000000 */
+/* cos(x) = 0.fc3a6170f767ac735d63d99a9d439e1db5e59d3ef153a4265d5855850ed82b536bf361b80e3 */
+ 9.85265817718213816204294709759578994e-01L, /* 3ffef874c2e1eecf58e6bac7b3353a87 */
+ 2.26568029505818066141517497778527952e-35L, /* 3f8be1db5e59d3ef153a4265d5855851 */
+/* sin(x) = 0.2bc89f9f424de5485de7ce03b2514952b9faf5648c3244d4736feb95dbb9da49f3b58a9253b */
+ 1.71030022031395019281347969239834331e-01L, /* 3ffc5e44fcfa126f2a42ef3e701d928a */
+ 7.01395875187487608875416030203241317e-36L, /* 3f8a2a573f5eac9186489a8e6dfd72bb */
+
+/* x = 1.79687500000000000000000000000000000e-01 3ffc7000000000000000000000000000 */
+/* cos(x) = 0.fbe0d7f7fef11e70aa43b8abf4f6a457cea20c8f3f676b47781f9821bbe9ce04b3c7b981c0b */
+ 9.83899591489663972178309351416487245e-01L, /* 3ffef7c1afeffde23ce154877157e9ed */
+ 2.73414318948066207810486330723761265e-35L, /* 3f8c22be75106479fb3b5a3bc0fcc10e */
+/* sin(x) = 0.2dc0bb80b49a97ffb34e8dd1f8db9df7af47ed2dcf58b12c8e7827e048cae929da02c04ecac */
+ 1.78722113535153659375356241864180724e-01L, /* 3ffc6e05dc05a4d4bffd9a746e8fc6dd */
+ -1.52906926517265103202547561260594148e-36L, /* bf8804285c09691853a769b8c3ec0fdc */
+
+/* x = 1.87500000000000000000000000000000000e-01 3ffc8000000000000000000000000000 */
+/* cos(x) = 0.fb835efcf670dd2ce6fe7924697eea13ea358867e9cdb3899b783f4f9f43aa5626e8b67b3bc */
+ 9.82473313101255257487327683243622495e-01L, /* 3ffef706bdf9ece1ba59cdfcf248d2fe */
+ -1.64924358891557584625463868014230342e-35L, /* bf8b5ec15ca779816324c766487c0b06 */
+/* sin(x) = 0.2fb8205f75e56a2b56a1c4792f856258769af396e0189ef72c05e4df59a6b00e4b44a6ea515 */
+ 1.86403296762269884552379983103205261e-01L, /* 3ffc7dc102fbaf2b515ab50e23c97c2b */
+ 1.76460304806826780010586715975331753e-36L, /* 3f882c3b4d79cb700c4f7b9602f26fad */
+
+/* x = 1.95312500000000000000000000000000000e-01 3ffc9000000000000000000000000000 */
+/* cos(x) = 0.fb21f7f5c156696b00ac1fe28ac5fd76674a92b4df80d9c8a46c684399005deccc41386257c */
+ 9.80987069605669190469329896435309665e-01L, /* 3ffef643efeb82acd2d601583fc5158c */
+ -1.90899259410096419886996331536278461e-36L, /* bf8844cc5ab6a5903f931badc9cbde34 */
+/* sin(x) = 0.31aec65df552876f82ece9a2356713246eba6799983d7011b0b3698d6e1da919c15d57c30c1 */
+ 1.94073102892909791156055200214145404e-01L, /* 3ffc8d7632efaa943b7c17674d11ab39 */
+ -9.67304741051998267208945242944928999e-36L, /* bf8a9b7228b30cccf851fdc9e992ce52 */
+
+/* x = 2.03125000000000000000000000000000000e-01 3ffca000000000000000000000000000 */
+/* cos(x) = 0.fabca467fb3cb8f1d069f01d8ea33ade5bfd68296ecd1cc9f7b7609bbcf3676e726c3301334 */
+ 9.79440951715548359998530954502987493e-01L, /* 3ffef57948cff67971e3a0d3e03b1d46 */
+ 4.42878056591560757066844797290067990e-35L, /* 3f8cd6f2dfeb414b7668e64fbdbb04de */
+/* sin(x) = 0.33a4a5a19d86246710f602c44df4fa513f4639ce938477aeeabb82e8e0a7ed583a188879fd4 */
+ 2.01731063801638804725038151164000971e-01L, /* 3ffc9d252d0cec31233887b016226fa8 */
+ -4.27513434754966978435151290617384120e-36L, /* bf896bb02e718c5b1ee21445511f45c8 */
+
+/* x = 2.10937500000000000000000000000000000e-01 3ffcb000000000000000000000000000 */
+/* cos(x) = 0.fa5365e8f1d3ca27be1db5d76ae64d983d7470a4ab0f4ccf65a2b8c67a380df949953a09bc1 */
+ 9.77835053797959793331971572944454549e-01L, /* 3ffef4a6cbd1e3a7944f7c3b6baed5cd */
+ -3.79207422905180416937210853779192702e-35L, /* bf8c933e145c7adaa7859984d2ea39cc */
+/* sin(x) = 0.3599b652f40ec999df12a0a4c8561de159c98d4e54555de518b97f48886f715d8df5f4f093e */
+ 2.09376712085993643711890752724881652e-01L, /* 3ffcaccdb297a0764ccef895052642b1 */
+ -1.59470287344329449965314638482515925e-36L, /* bf880f531b3958d5d5510d73a3405bbc */
+
+/* x = 2.18750000000000000000000000000000000e-01 3ffcc000000000000000000000000000 */
+/* cos(x) = 0.f9e63e1d9e8b6f6f2e296bae5b5ed9c11fd7fa2fe11e09fc7bde901abed24b6365e72f7db4e */
+ 9.76169473868635276723989035435135534e-01L, /* 3ffef3cc7c3b3d16dede5c52d75cb6be */
+ -2.87727974249481583047944860626985460e-35L, /* bf8c31f701402e80f70fb01c210b7f2a */
+/* sin(x) = 0.378df09db8c332ce0d2b53d865582e4526ea336c768f68c32b496c6d11c1cd241bb9f1da523 */
+ 2.17009581095010156760578095826055396e-01L, /* 3ffcbc6f84edc6199670695a9ec32ac1 */
+ 1.07356488794216831812829549198201194e-35L, /* 3f8ac8a4dd466d8ed1ed1865692d8da2 */
+
+/* x = 2.26562500000000000000000000000000000e-01 3ffcd000000000000000000000000000 */
+/* cos(x) = 0.f9752eba9fff6b98842beadab054a932fb0f8d5b875ae63d6b2288d09b148921aeb6e52f61b */
+ 9.74444313585988980349711056045434344e-01L, /* 3ffef2ea5d753ffed7310857d5b560a9 */
+ 3.09947905955053419304514538592548333e-35L, /* 3f8c4997d87c6adc3ad731eb59144685 */
+/* sin(x) = 0.39814cb10513453cb97b21bc1ca6a337b150c21a675ab85503bc09a436a10ab1473934e20c8 */
+ 2.24629204957705292350428549796424820e-01L, /* 3ffccc0a6588289a29e5cbd90de0e535 */
+ 2.42061510849297469844695751870058679e-36L, /* 3f889bd8a8610d33ad5c2a81de04d21b */
+
+/* x = 2.34375000000000000000000000000000000e-01 3ffce000000000000000000000000000 */
+/* cos(x) = 0.f90039843324f9b940416c1984b6cbed1fc733d97354d4265788a86150493ce657cae032674 */
+ 9.72659678244912752670913058267565260e-01L, /* 3ffef20073086649f3728082d833096e */
+ -3.91759231819314904966076958560252735e-35L, /* bf8ca09701c6613465595ecd43babcf5 */
+/* sin(x) = 0.3b73c2bf6b4b9f668ef9499c81f0d965087f1753fa64b086e58cb8470515c18c1412f8c2e02 */
+ 2.32235118611511462413930877746235872e-01L, /* 3ffcdb9e15fb5a5cfb3477ca4ce40f87 */
+ -4.96930483364191020075024624332928910e-36L, /* bf89a6bde03a2b0166d3de469cd1ee3f */
+
+/* x = 2.42187500000000000000000000000000000e-01 3ffcf000000000000000000000000000 */
+/* cos(x) = 0.f887604e2c39dbb20e4ec5825059a789ffc95b275ad9954078ba8a28d3fcfe9cc2c1d49697b */
+ 9.70815676770349462947490545785046027e-01L, /* 3ffef10ec09c5873b7641c9d8b04a0b3 */
+ 2.97458820972393859125277682021202860e-35L, /* 3f8c3c4ffe4ad93ad6ccaa03c5d45147 */
+/* sin(x) = 0.3d654aff15cb457a0fca854698aba33039a8a40626609204472d9d40309b626eccc6dff0ffa */
+ 2.39826857830661564441369251810886574e-01L, /* 3ffceb2a57f8ae5a2bd07e542a34c55d */
+ 2.39867036569896287240938444445071448e-36L, /* 3f88981cd45203133049022396cea018 */
+
+/* x = 2.50000000000000000000000000000000000e-01 3ffd0000000000000000000000000000 */
+/* cos(x) = 0.f80aa4fbef750ba783d33cb95f94f8a41426dbe79edc4a023ef9ec13c944551c0795b84fee1 */
+ 9.68912421710644784144595449494189205e-01L, /* 3ffef01549f7deea174f07a67972bf2a */
+ -5.53634706113461989398873287749326500e-36L, /* bf89d6faf649061848ed7f704184fb0e */
+/* sin(x) = 0.3f55dda9e62aed7513bd7b8e6a3d1635dd5676648d7db525898d7086af9330f03c7f285442a */
+ 2.47403959254522929596848704849389203e-01L, /* 3ffcfaaeed4f31576ba89debdc7351e9 */
+ -7.36487001108599532943597115275811618e-36L, /* bf8a39445531336e50495b4ece51ef2a */
+
+/* x = 2.57812500000000000000000000000000000e-01 3ffd0800000000000000000000000000 */
+/* cos(x) = 0.f78a098069792daabc9ee42591b7c5a68cb1ab822aeb446b3311b4ba5371b8970e2c1547ad7 */
+ 9.66950029230677822008341623610531503e-01L, /* 3ffeef141300d2f25b55793dc84b2370 */
+ -4.38972214432792412062088059990480514e-35L, /* bf8cd2cb9a72a3eea8a5dca667725a2d */
+/* sin(x) = 0.414572fd94556e6473d620271388dd47c0ba050cdb5270112e3e370e8c4705ae006426fb5d5 */
+ 2.54965960415878467487556574864872628e-01L, /* 3ffd0515cbf65155b991cf58809c4e23 */
+ 2.20280377918534721005071688328074154e-35L, /* 3f8bd47c0ba050cdb5270112e3e370e9 */
+
+/* x = 2.65625000000000000000000000000000000e-01 3ffd1000000000000000000000000000 */
+/* cos(x) = 0.f7058fde0788dfc805b8fe88789e4f4253e3c50afe8b22f41159620ab5940ff7df9557c0d1f */
+ 9.64928619104771009581074665315748371e-01L, /* 3ffeee0b1fbc0f11bf900b71fd10f13d */
+ -3.66685832670820775002475545602761113e-35L, /* bf8c85ed60e1d7a80ba6e85f7534efaa */
+/* sin(x) = 0.4334033bcd90d6604f5f36c1d4b84451a87150438275b77470b50e5b968fa7962b5ffb379b7 */
+ 2.62512399769153281450949626395692931e-01L, /* 3ffd0cd00cef364359813d7cdb0752e1 */
+ 3.24923677072031064673177178571821843e-36L, /* 3f89146a1c5410e09d6ddd1c2d4396e6 */
+
+/* x = 2.73437500000000000000000000000000000e-01 3ffd1800000000000000000000000000 */
+/* cos(x) = 0.f67d3a26af7d07aa4bd6d42af8c0067fefb96d5b46c031eff53627f215ea3242edc3f2e13eb */
+ 9.62848314709379699899701093480214365e-01L, /* 3ffeecfa744d5efa0f5497ada855f180 */
+ 4.88986966383343450799422013051821394e-36L, /* 3f899ffbee5b56d1b00c7bfd4d89fc85 */
+/* sin(x) = 0.452186aa5377ab20bbf2524f52e3a06a969f47166ab88cf88c111ad12c55941021ef3317a1a */
+ 2.70042816718585031552755063618827102e-01L, /* 3ffd14861aa94ddeac82efc9493d4b8f */
+ -2.37608892440611310321138680065803162e-35L, /* bf8bf956960b8e99547730773eee52ed */
+
+/* x = 2.81250000000000000000000000000000000e-01 3ffd2000000000000000000000000000 */
+/* cos(x) = 0.f5f10a7bb77d3dfa0c1da8b57842783280d01ce3c0f82bae3b9d623c168d2e7c29977994451 */
+ 9.60709243015561903066659350581313472e-01L, /* 3ffeebe214f76efa7bf4183b516af085 */
+ -5.87011558231583960712013351601221840e-36L, /* bf89f35fcbf8c70fc1f5147118a770fa */
+/* sin(x) = 0.470df5931ae1d946076fe0dcff47fe31bb2ede618ebc607821f8462b639e1f4298b5ae87fd3 */
+ 2.77556751646336325922023446828128568e-01L, /* 3ffd1c37d64c6b8765181dbf8373fd20 */
+ -1.35848595468998128214344668770082997e-36L, /* bf87ce44d1219e71439f87de07b9d49c */
+
+/* x = 2.89062500000000000000000000000000000e-01 3ffd2800000000000000000000000000 */
+/* cos(x) = 0.f561030ddd7a78960ea9f4a32c6521554995667f5547bafee9ec48b3155cdb0f7fd00509713 */
+ 9.58511534581228627301969408154919822e-01L, /* 3ffeeac2061bbaf4f12c1d53e94658ca */
+ 2.50770779371636481145735089393154404e-35L, /* 3f8c0aaa4cab33faaa3dd7f74f624599 */
+/* sin(x) = 0.48f948446abcd6b0f7fccb100e7a1b26eccad880b0d24b59948c7cdd49514d44b933e6985c2 */
+ 2.85053745940547424587763033323252561e-01L, /* 3ffd23e52111aaf35ac3dff32c4039e8 */
+ 2.04269325885902918802700123680403749e-35L, /* 3f8bb26eccad880b0d24b59948c7cdd5 */
+
+/* x = 2.96875000000000000000000000000000000e-01 3ffd3000000000000000000000000000 */
+/* cos(x) = 0.f4cd261d3e6c15bb369c8758630d2ac00b7ace2a51c0631bfeb39ed158ba924cc91e259c195 */
+ 9.56255323543175296975599942263028361e-01L, /* 3ffee99a4c3a7cd82b766d390eb0c61a */
+ 3.21616572190865997051103645135837207e-35L, /* 3f8c56005bd671528e0318dff59cf68b */
+/* sin(x) = 0.4ae37710fad27c8aa9c4cf96c03519b9ce07dc08a1471775499f05c29f86190aaebaeb9716e */
+ 2.92533342023327543624702326493913423e-01L, /* 3ffd2b8ddc43eb49f22aa7133e5b00d4 */
+ 1.93539408668704450308003687950685128e-35L, /* 3f8b9b9ce07dc08a1471775499f05c2a */
+
+/* x = 3.04687500000000000000000000000000000e-01 3ffd3800000000000000000000000000 */
+/* cos(x) = 0.f43575f94d4f6b272f5fb76b14d2a64ab52df1ee8ddf7c651034e5b2889305a9ea9015d758a */
+ 9.53940747608894733981324795987611623e-01L, /* 3ffee86aebf29a9ed64e5ebf6ed629a5 */
+ 2.88075689052478602008395972924657164e-35L, /* 3f8c3255a96f8f746efbe32881a72d94 */
+/* sin(x) = 0.4ccc7a50127e1de0cb6b40c302c651f7bded4f9e7702b0471ae0288d091a37391950907202f */
+ 2.99995083378683051163248282011699944e-01L, /* 3ffd3331e94049f877832dad030c0b19 */
+ 1.35174265535697850139283361475571050e-35L, /* 3f8b1f7bded4f9e7702b0471ae0288d1 */
+
+/* x = 3.12500000000000000000000000000000000e-01 3ffd4000000000000000000000000000 */
+/* cos(x) = 0.f399f500c9e9fd37ae9957263dab8877102beb569f101ee4495350868e5847d181d50d3cca2 */
+ 9.51567948048172202145488217364270962e-01L, /* 3ffee733ea0193d3fa6f5d32ae4c7b57 */
+ 6.36842628598115658308749288799884606e-36L, /* 3f8a0ee2057d6ad3e203dc892a6a10d2 */
+/* sin(x) = 0.4eb44a5da74f600207aaa090f0734e288603ffadb3eb2542a46977b105f8547128036dcf7f0 */
+ 3.07438514580380850670502958201982091e-01L, /* 3ffd3ad129769d3d80081eaa8243c1cd */
+ 1.06515172423204645839241099453417152e-35L, /* 3f8ac510c07ff5b67d64a8548d2ef621 */
+
+/* x = 3.20312500000000000000000000000000000e-01 3ffd4800000000000000000000000000 */
+/* cos(x) = 0.f2faa5a1b74e82fd61fa05f9177380e8e69b7b15a945e8e5ae1124bf3d12b0617e03af4fab5 */
+ 9.49137069684463027665847421762105623e-01L, /* 3ffee5f54b436e9d05fac3f40bf22ee7 */
+ 6.84433965991637152250309190468859701e-37L, /* 3f86d1cd36f62b528bd1cb5c22497e7a */
+/* sin(x) = 0.509adf9a7b9a5a0f638a8fa3a60a199418859f18b37169a644fdb986c21ecb00133853bc35b */
+ 3.14863181319745250865036315126939016e-01L, /* 3ffd426b7e69ee69683d8e2a3e8e9828 */
+ 1.92431240212432926993057705062834160e-35L, /* 3f8b99418859f18b37169a644fdb986c */
+
+/* x = 3.28125000000000000000000000000000000e-01 3ffd5000000000000000000000000000 */
+/* cos(x) = 0.f2578a595224dd2e6bfa2eb2f99cc674f5ea6f479eae2eb580186897ae3f893df1113ca06b8 */
+ 9.46648260886053321846099507295532976e-01L, /* 3ffee4af14b2a449ba5cd7f45d65f33a */
+ -4.32906339663000890941529420498824645e-35L, /* bf8ccc5850ac85c30a8e8a53ff3cbb43 */
+/* sin(x) = 0.5280326c3cf481823ba6bb08eac82c2093f2bce3c4eb4ee3dec7df41c92c8a4226098616075 */
+ 3.22268630433386625687745919893188031e-01L, /* 3ffd4a00c9b0f3d20608ee9aec23ab21 */
+ -1.49505897804759263483853908335500228e-35L, /* bf8b3df6c0d431c3b14b11c213820be3 */
+
+/* x = 3.35937500000000000000000000000000000e-01 3ffd5800000000000000000000000000 */
+/* cos(x) = 0.f1b0a5b406b526d886c55feadc8d0dcc8eb9ae2ac707051771b48e05b25b000009660bdb3e3 */
+ 9.44101673557004345630017691253124860e-01L, /* 3ffee3614b680d6a4db10d8abfd5b91a */
+ 1.03812535240120229609822461172145584e-35L, /* 3f8ab991d735c558e0e0a2ee3691c0b6 */
+/* sin(x) = 0.54643b3da29de9b357155eef0f332fb3e66c83bf4dddd9491c5eb8e103ccd92d6175220ed51 */
+ 3.29654409930860171914317725126463176e-01L, /* 3ffd5190ecf68a77a6cd5c557bbc3ccd */
+ -1.22606996784743214973082192294232854e-35L, /* bf8b04c19937c40b22226b6e3a1471f0 */
+
+/* x = 3.43750000000000000000000000000000000e-01 3ffd6000000000000000000000000000 */
+/* cos(x) = 0.f105fa4d66b607a67d44e042725204435142ac8ad54dfb0907a4f6b56b06d98ee60f19e557a */
+ 9.41497463127881068644511236053670815e-01L, /* 3ffee20bf49acd6c0f4cfa89c084e4a4 */
+ 3.20709366603165602071590241054884900e-36L, /* 3f8910d450ab22b5537ec241e93dad5b */
+/* sin(x) = 0.5646f27e8bd65cbe3a5d61ff06572290ee826d9674a00246b05ae26753cdfc90d9ce81a7d02 */
+ 3.37020069022253076261281754173810024e-01L, /* 3ffd591bc9fa2f5972f8e97587fc195d */
+ -2.21435756148839473677777545049890664e-35L, /* bf8bd6f117d92698b5ffdb94fa51d98b */
+
+/* x = 3.51562500000000000000000000000000000e-01 3ffd6800000000000000000000000000 */
+/* cos(x) = 0.f0578ad01ede707fa39c09dc6b984afef74f3dc8d0efb0f4c5a6b13771145b3e0446fe33887 */
+ 9.38835788546265488632578305984712554e-01L, /* 3ffee0af15a03dbce0ff473813b8d731 */
+ -3.98758068773974031348585072752245458e-35L, /* bf8ca808458611b978827859d2ca7644 */
+/* sin(x) = 0.582850a41e1dd46c7f602ea244cdbbbfcdfa8f3189be794dda427ce090b5f85164f1f80ac13 */
+ 3.44365158145698408207172046472223747e-01L, /* 3ffd60a14290787751b1fd80ba891337 */
+ -3.19791885005480924937758467594051927e-36L, /* bf89100c815c339d9061ac896f60c7dc */
+
+/* x = 3.59375000000000000000000000000000000e-01 3ffd7000000000000000000000000000 */
+/* cos(x) = 0.efa559f5ec3aec3a4eb03319278a2d41fcf9189462261125fe6147b078f1daa0b06750a1654 */
+ 9.36116812267055290294237411019508588e-01L, /* 3ffedf4ab3ebd875d8749d6066324f14 */
+ 3.40481591236710658435409862439032162e-35L, /* 3f8c6a0fe7c8c4a31130892ff30a3d84 */
+/* sin(x) = 0.5a084e28e35fda2776dfdbbb5531d74ced2b5d17c0b1afc4647529d50c295e36d8ceec126c1 */
+ 3.51689228994814059222584896955547016e-01L, /* 3ffd682138a38d7f689ddb7f6eed54c7 */
+ 1.75293433418270210567525412802083294e-35L, /* 3f8b74ced2b5d17c0b1afc4647529d51 */
+
+/* x = 3.67187500000000000000000000000000000e-01 3ffd7800000000000000000000000000 */
+/* cos(x) = 0.eeef6a879146af0bf9b95ea2ea0ac0d3e2e4d7e15d93f48cbd41bf8e4fded40bef69e19eafa */
+ 9.33340700242548435655299229469995527e-01L, /* 3ffeddded50f228d5e17f372bd45d416 */
+ -4.75255707251679831124800898831382223e-35L, /* bf8cf960e8d940f513605b9a15f2038e */
+/* sin(x) = 0.5be6e38ce8095542bc14ee9da0d36483e6734bcab2e07624188af5653f114eeb46738fa899d */
+ 3.58991834546065053677710299152868941e-01L, /* 3ffd6f9b8e33a025550af053ba76834e */
+ -2.06772389262723368139416970257112089e-35L, /* bf8bb7c198cb4354d1f89dbe7750a9ac */
+
+/* x = 3.75000000000000000000000000000000000e-01 3ffd8000000000000000000000000000 */
+/* cos(x) = 0.ee35bf5ccac89052cd91ddb734d3a47e262e3b609db604e217053803be0091e76daf28a89b7 */
+ 9.30507621912314291149476792229555481e-01L, /* 3ffedc6b7eb9959120a59b23bb6e69a7 */
+ 2.74541088551732982573335285685416092e-35L, /* 3f8c23f13171db04edb02710b829c01e */
+/* sin(x) = 0.5dc40955d9084f48a94675a2498de5d851320ff5528a6afb3f2e24de240fce6cbed1ba0ccd6 */
+ 3.66272529086047561372909351716264177e-01L, /* 3ffd7710255764213d22a519d6892638 */
+ -1.96768433534936592675897818253108989e-35L, /* bf8ba27aecdf00aad759504c0d1db21e */
+
+/* x = 3.82812500000000000000000000000000000e-01 3ffd8800000000000000000000000000 */
+/* cos(x) = 0.ed785b5c44741b4493c56bcb9d338a151c6f6b85d8f8aca658b28572c162b199680eb9304da */
+ 9.27617750192851909628030798799961350e-01L, /* 3ffedaf0b6b888e83689278ad7973a67 */
+ 7.58520371916345756281201167126854712e-36L, /* 3f8a42a38ded70bb1f1594cb1650ae58 */
+/* sin(x) = 0.5f9fb80f21b53649c432540a50e22c53057ff42ae0fdf1307760dc0093f99c8efeb2fbd7073 */
+ 3.73530868238692946416839752660848112e-01L, /* 3ffd7e7ee03c86d4d92710c950294389 */
+ -1.48023494778986556048879113411517128e-35L, /* bf8b3acfa800bd51f020ecf889f23ff7 */
+
+/* x = 3.90625000000000000000000000000000000e-01 3ffd9000000000000000000000000000 */
+/* cos(x) = 0.ecb7417b8d4ee3fec37aba4073aa48f1f14666006fb431d9671303c8100d10190ec8179c41d */
+ 9.24671261467036098502113014560138771e-01L, /* 3ffed96e82f71a9dc7fd86f57480e755 */
+ -4.14187124860031825108649347251175815e-35L, /* bf8cb87075cccffc825e7134c767e1bf */
+/* sin(x) = 0.6179e84a09a5258a40e9b5face03e525f8b5753cd0105d93fe6298010c3458e84d75fe420e9 */
+ 3.80766408992390192057200703388896675e-01L, /* 3ffd85e7a1282694962903a6d7eb3810 */
+ -2.02009541175208636336924533372496107e-35L, /* bf8bada074a8ac32fefa26c019d67fef */
+
+/* x = 3.98437500000000000000000000000000000e-01 3ffd9800000000000000000000000000 */
+/* cos(x) = 0.ebf274bf0bda4f62447e56a093626798d3013b5942b1abfd155aacc9dc5c6d0806a20d6b9c1 */
+ 9.21668335573351918175411368202712714e-01L, /* 3ffed7e4e97e17b49ec488fcad4126c5 */
+ -1.83587995433957622948710263541479322e-35L, /* bf8b8672cfec4a6bd4e5402eaa553362 */
+/* sin(x) = 0.6352929dd264bd44a02ea766325d8aa8bd9695fc8def3caefba5b94c9a3c873f7b2d3776ead */
+ 3.87978709727025046051079690813741960e-01L, /* 3ffd8d4a4a774992f51280ba9d98c976 */
+ 8.01904783870935075844443278617586301e-36L, /* 3f8a5517b2d2bf91bde795df74b72993 */
+
+/* x = 4.06250000000000000000000000000000000e-01 3ffda000000000000000000000000000 */
+/* cos(x) = 0.eb29f839f201fd13b93796827916a78f15c85230a4e8ea4b21558265a14367e1abb4c30695a */
+ 9.18609155794918267837824977718549863e-01L, /* 3ffed653f073e403fa27726f2d04f22d */
+ 2.97608282778274433460057745798409849e-35L, /* 3f8c3c78ae429185274752590aac132d */
+/* sin(x) = 0.6529afa7d51b129631ec197c0a840a11d7dc5368b0a47956feb285caa8371c4637ef17ef01b */
+ 3.95167330240934236244832640419653657e-01L, /* 3ffd94a6be9f546c4a58c7b065f02a10 */
+ 7.57560031388312550940040194042627704e-36L, /* 3f8a423afb8a6d16148f2adfd650b955 */
+
+/* x = 4.14062500000000000000000000000000000e-01 3ffda800000000000000000000000000 */
+/* cos(x) = 0.ea5dcf0e30cf03e6976ef0b1ec26515fba47383855c3b4055a99b5e86824b2cd1a691fdca7b */
+ 9.15493908848301228563917732180221882e-01L, /* 3ffed4bb9e1c619e07cd2edde163d84d */
+ -3.50775517955306954815090901168305659e-35L, /* bf8c75022dc63e3d51e25fd52b3250bd */
+/* sin(x) = 0.66ff380ba0144109e39a320b0a3fa5fd65ea0585bcbf9b1a769a9b0334576c658139e1a1cbe */
+ 4.02331831777773111217105598880982387e-01L, /* 3ffd9bfce02e805104278e68c82c28ff */
+ -1.95678722882848174723569916504871563e-35L, /* bf8ba029a15fa7a434064e5896564fcd */
+
+/* x = 4.21875000000000000000000000000000000e-01 3ffdb000000000000000000000000000 */
+/* cos(x) = 0.e98dfc6c6be031e60dd3089cbdd18a75b1f6b2c1e97f79225202f03dbea45b07a5ec4efc062 */
+ 9.12322784872117846492029542047341734e-01L, /* 3ffed31bf8d8d7c063cc1ba611397ba3 */
+ 7.86903886556373674267948132178845568e-36L, /* 3f8a4eb63ed6583d2fef244a405e07b8 */
+/* sin(x) = 0.68d32473143327973bc712bcc4ccddc47630d755850c0655243b205934dc49ffed8eb76adcb */
+ 4.09471777053295066122694027011452236e-01L, /* 3ffda34c91cc50cc9e5cef1c4af31333 */
+ 2.23945241468457597921655785729821354e-35L, /* 3f8bdc47630d755850c0655243b20593 */
+
+/* x = 4.29687500000000000000000000000000000e-01 3ffdb800000000000000000000000000 */
+/* cos(x) = 0.e8ba8393eca7821aa563d83491b6101189b3b101c3677f73d7bad7c10f9ee02b7ab4009739a */
+ 9.09095977415431051650381735684476417e-01L, /* 3ffed1750727d94f04354ac7b069236c */
+ 1.20886014028444155733776025085677953e-35L, /* 3f8b01189b3b101c3677f73d7bad7c11 */
+/* sin(x) = 0.6aa56d8e8249db4eb60a761fe3f9e559be456b9e13349ca99b0bfb787f22b95db3b70179615 */
+ 4.16586730282041119259112448831069657e-01L, /* 3ffdaa95b63a09276d3ad829d87f8fe8 */
+ -2.00488106831998813675438269796963612e-35L, /* bf8baa641ba9461eccb635664f404878 */
+
+/* x = 4.37500000000000000000000000000000000e-01 3ffdc000000000000000000000000000 */
+/* cos(x) = 0.e7e367d2956cfb16b6aa11e5419cd0057f5c132a6455bf064297e6a76fe2b72bb630d6d50ff */
+ 9.05813683425936420744516660652700258e-01L, /* 3ffecfc6cfa52ad9f62d6d5423ca833a */
+ -3.60950307605941169775676563004467163e-35L, /* bf8c7fd4051f66acdd5207cdeb40cac5 */
+/* sin(x) = 0.6c760c14c8585a51dbd34660ae6c52ac7036a0b40887a0b63724f8b4414348c3063a637f457 */
+ 4.23676257203938010361683988031102480e-01L, /* 3ffdb1d83053216169476f4d1982b9b1 */
+ 1.40484456388654470329473096579312595e-35L, /* 3f8b2ac7036a0b40887a0b63724f8b44 */
+
+/* x = 4.45312500000000000000000000000000000e-01 3ffdc800000000000000000000000000 */
+/* cos(x) = 0.e708ac84d4172a3e2737662213429e14021074d7e702e77d72a8f1101a7e70410df8273e9aa */
+ 9.02476103237941504925183272675895999e-01L, /* 3ffece115909a82e547c4e6ecc442685 */
+ 2.26282899501344419018306295680210602e-35L, /* 3f8be14021074d7e702e77d72a8f1102 */
+/* sin(x) = 0.6e44f8c36eb10a1c752d093c00f4d47ba446ac4c215d26b0316442f168459e677d06e7249e3 */
+ 4.30739925110803197216321517850849190e-01L, /* 3ffdb913e30dbac42871d4b424f003d3 */
+ 1.54096780001629398850891218396761548e-35L, /* 3f8b47ba446ac4c215d26b0316442f17 */
+
+/* x = 4.53125000000000000000000000000000000e-01 3ffdd000000000000000000000000000 */
+/* cos(x) = 0.e62a551594b970a770b15d41d4c0e483e47aca550111df6966f9e7ac3a94ae49e6a71eb031e */
+ 8.99083440560138456216544929209379307e-01L, /* 3ffecc54aa2b2972e14ee162ba83a982 */
+ -2.06772615490904370666670275154751976e-35L, /* bf8bb7c1b8535aafeee209699061853c */
+/* sin(x) = 0.70122c5ec5028c8cff33abf4fd340ccc382e038379b09cf04f9a52692b10b72586060cbb001 */
+ 4.37777302872755132861618974702796680e-01L, /* 3ffdc048b17b140a3233fcceafd3f4d0 */
+ 9.62794364503442612477117426033922467e-36L, /* 3f8a998705c0706f36139e09f34a4d25 */
+
+/* x = 4.60937500000000000000000000000000000e-01 3ffdd800000000000000000000000000 */
+/* cos(x) = 0.e54864fe33e8575cabf5bd0e5cf1b1a8bc7c0d5f61702450fa6b6539735820dd2603ae355d5 */
+ 8.95635902463170698900570000446256350e-01L, /* 3ffeca90c9fc67d0aeb957eb7a1cb9e3 */
+ 3.73593741659866883088620495542311808e-35L, /* 3f8c8d45e3e06afb0b812287d35b29cc */
+/* sin(x) = 0.71dd9fb1ff4677853acb970a9f6729c6e3aac247b1c57cea66c77413f1f98e8b9e98e49d851 */
+ 4.44787960964527211433056012529525211e-01L, /* 3ffdc7767ec7fd19de14eb2e5c2a7d9d */
+ -1.67187936511493678007508371613954899e-35L, /* bf8b6391c553db84e3a831599388bec1 */
+
+/* x = 4.68750000000000000000000000000000000e-01 3ffde000000000000000000000000000 */
+/* cos(x) = 0.e462dfc670d421ab3d1a15901228f146a0547011202bf5ab01f914431859aef577966bc4fa4 */
+ 8.92133699366994404723900253723788575e-01L, /* 3ffec8c5bf8ce1a843567a342b202452 */
+ -1.10771937602567314732693079264692504e-35L, /* bf8ad72bf571fddbfa814a9fc0dd779d */
+/* sin(x) = 0.73a74b8f52947b681baf6928eb3fb021769bf4779bad0e3aa9b1cdb75ec60aad9fc63ff19d5 */
+ 4.51771471491683776581688750134062870e-01L, /* 3ffdce9d2e3d4a51eda06ebda4a3acff */
+ -1.19387223016472295893794387275284505e-35L, /* bf8afbd12c81710c8a5e38aac9c64914 */
+
+/* x = 4.76562500000000000000000000000000000e-01 3ffde800000000000000000000000000 */
+/* cos(x) = 0.e379c9045f29d517c4808aa497c2057b2b3d109e76c0dc302d4d0698b36e3f0bdbf33d8e952 */
+ 8.88577045028035543317609023116020980e-01L, /* 3ffec6f39208be53aa2f890115492f84 */
+ 4.12354278954664731443813655177022170e-36L, /* 3f895ecacf44279db0370c0b5341a62d */
+/* sin(x) = 0.756f28d011d98528a44a75fc29c779bd734ecdfb582fdb74b68a4c4c4be54cfd0b2d3ad292f */
+ 4.58727408216736592377295028972874773e-01L, /* 3ffdd5bca340476614a29129d7f0a71e */
+ -4.70946994194182908929251719575431779e-36L, /* bf8990a32c4c8129f40922d25d6ceced */
+
+/* x = 4.84375000000000000000000000000000000e-01 3ffdf000000000000000000000000000 */
+/* cos(x) = 0.e28d245c58baef72225e232abc003c4366acd9eb4fc2808c2ab7fe7676cf512ac7f945ae5fb */
+ 8.84966156526143291697296536966647926e-01L, /* 3ffec51a48b8b175dee444bc46557800 */
+ 4.53370570288325630442037826313462165e-35L, /* 3f8ce21b3566cf5a7e14046155bff3b4 */
+/* sin(x) = 0.77353054ca72690d4c6e171fd99e6b39fa8e1ede5f052fd2964534c75340970a3a9cd3c5c32 */
+ 4.65655346585160182681199512507546779e-01L, /* 3ffddcd4c15329c9a43531b85c7f667a */
+ -1.56282598978971872478619772155305961e-35L, /* bf8b4c60571e121a0fad02d69bacb38b */
+
+/* x = 4.92187500000000000000000000000000000e-01 3ffdf800000000000000000000000000 */
+/* cos(x) = 0.e19cf580eeec046aa1422fa74807ecefb2a1911c94e7b5f20a00f70022d940193691e5bd790 */
+ 8.81301254251340599140161908298100173e-01L, /* 3ffec339eb01ddd808d542845f4e9010 */
+ -1.43419192312116687783945619009629445e-35L, /* bf8b3104d5e6ee36b184a0df5ff08ffe */
+/* sin(x) = 0.78f95b0560a9a3bd6df7bd981dc38c61224d08bc20631ea932e605e53b579e9e0767dfcbbcb */
+ 4.72554863751304451146551317808516942e-01L, /* 3ffde3e56c1582a68ef5b7def660770e */
+ 9.31324774957768018850224267625371204e-36L, /* 3f8a8c2449a117840c63d5265cc0bca7 */
+
+/* x = 5.00000000000000000000000000000000000e-01 3ffe0000000000000000000000000000 */
+/* cos(x) = 0.e0a94032dbea7cedbddd9da2fafad98556566b3a89f43eabd72350af3e8b19e801204d8fe2e */
+ 8.77582561890372716116281582603829681e-01L, /* 3ffec1528065b7d4f9db7bbb3b45f5f6 */
+ -2.89484960181363924855192538540698851e-35L, /* bf8c33d54d4ca62bb05e0aa146e57a86 */
+/* sin(x) = 0.7abba1d12c17bfa1d92f0d93f60ded9992f45b4fcaf13cd58b303693d2a0db47db35ae8a3a9 */
+ 4.79425538604203000273287935215571402e-01L, /* 3ffdeaee8744b05efe8764bc364fd838 */
+ -1.38426977616718318950175848639381926e-35L, /* bf8b2666d0ba4b0350ec32a74cfc96c3 */
+
+/* x = 5.07812500000000000000000000000000000e-01 3ffe0400000000000000000000000000 */
+/* cos(x) = 0.dfb20840f3a9b36f7ae2c515342890b5ec583b8366cc2b55029e95094d31112383f2553498b */
+ 8.73810306413054508282556837071377159e-01L, /* 3ffebf641081e75366def5c58a2a6851 */
+ 1.25716864497849302237218128599994785e-35L, /* 3f8b0b5ec583b8366cc2b55029e95095 */
+/* sin(x) = 0.7c7bfdaf13e5ed17212f8a7525bfb113aba6c0741b5362bb8d59282a850b63716bca0c910f0 */
+ 4.86266951793275574311011306895834993e-01L, /* 3ffdf1eff6bc4f97b45c84be29d496ff */
+ -1.12269393250914752644352376448094271e-35L, /* bf8add8a8b27f17c9593a88e54dafaaf */
+
+/* x = 5.15625000000000000000000000000000000e-01 3ffe0800000000000000000000000000 */
+/* cos(x) = 0.deb7518814a7a931bbcc88c109cd41c50bf8bb48f20ae8c36628d1d3d57574f7dc58f27d91c */
+ 8.69984718058417388828915599901466243e-01L, /* 3ffebd6ea310294f526377991182139b */
+ -4.68168638300575626782741319792183837e-35L, /* bf8cf1d7a03a25b86fa8b9e4ceb97161 */
+/* sin(x) = 0.7e3a679daaf25c676542bcb4028d0964172961c921823a4ef0c3a9070d886dbd073f6283699 */
+ 4.93078685753923057265136552753487121e-01L, /* 3ffdf8e99e76abc9719d950af2d00a34 */
+ 7.06498693112535056352301101088624950e-36L, /* 3f8a2c82e52c3924304749de187520e2 */
+
+/* x = 5.23437500000000000000000000000000000e-01 3ffe0c00000000000000000000000000 */
+/* cos(x) = 0.ddb91ff318799172bd2452d0a3889f5169c64a0094bcf0b8aa7dcf0d7640a2eba68955a80be */
+ 8.66106030320656714696616831654267220e-01L, /* 3ffebb723fe630f322e57a48a5a14711 */
+ 2.35610597588322493119667003904687628e-35L, /* 3f8bf5169c64a0094bcf0b8aa7dcf0d7 */
+/* sin(x) = 0.7ff6d8a34bd5e8fa54c97482db5159df1f24e8038419c0b448b9eea8939b5d4dfcf40900257 */
+ 4.99860324733013463819556536946425724e-01L, /* 3ffdffdb628d2f57a3e95325d20b6d45 */
+ 1.94636052312235297538564591686645139e-35L, /* 3f8b9df1f24e8038419c0b448b9eea89 */
+
+/* x = 5.31250000000000000000000000000000000e-01 3ffe1000000000000000000000000000 */
+/* cos(x) = 0.dcb7777ac420705168f31e3eb780ce9c939ecada62843b54522f5407eb7f21e556059fcd734 */
+ 8.62174479934880504367162510253324274e-01L, /* 3ffeb96eeef58840e0a2d1e63c7d6f02 */
+ -3.71556818317533582234562471835771823e-35L, /* bf8c8b1b6309a92cebde255d6e855fc1 */
+/* sin(x) = 0.81b149ce34caa5a4e650f8d09fd4d6aa74206c32ca951a93074c83b2d294d25dbb0f7fdfad2 */
+ 5.06611454814257367642296000893867192e-01L, /* 3ffe0362939c69954b49cca1f1a13faa */
+ -3.10963699824274155702706043065967062e-35L, /* bf8c4aac5efc9e69ab572b67c59be269 */
+
+/* x = 5.39062500000000000000000000000000000e-01 3ffe1400000000000000000000000000 */
+/* cos(x) = 0.dbb25c25b8260c14f6e7bc98ec991b70c65335198b0ab628bad20cc7b229d4dd62183cfa055 */
+ 8.58190306862660347046629564970494649e-01L, /* 3ffeb764b84b704c1829edcf7931d932 */
+ 2.06439574601190798155563653000684861e-35L, /* 3f8bb70c65335198b0ab628bad20cc7b */
+/* sin(x) = 0.8369b434a372da7eb5c8a71fe36ce1e0b2b493f6f5cb2e38bcaec2a556b3678c401940d1c3c */
+ 5.13331663943471218288801270215706878e-01L, /* 3ffe06d3686946e5b4fd6b914e3fc6da */
+ -2.26614796466671970772244932848067224e-35L, /* bf8be1f4d4b6c090a34d1c743513d5ab */
+
+/* x = 5.46875000000000000000000000000000000e-01 3ffe1800000000000000000000000000 */
+/* cos(x) = 0.daa9d20860827063fde51c09e855e9932e1b17143e7244fd267a899d41ae1f3bc6a0ec42e27 */
+ 8.54153754277385385143451785105103176e-01L, /* 3ffeb553a410c104e0c7fbca3813d0ac */
+ -1.68707534013095152873222061722573172e-35L, /* bf8b66cd1e4e8ebc18dbb02d9857662c */
+/* sin(x) = 0.852010f4f0800521378bd8dd614753d080c2e9e0775ffc609947b9132f5357404f464f06a58 */
+ 5.20020541953727004760213699874674730e-01L, /* 3ffe0a4021e9e1000a426f17b1bac28f */
+ -3.32415021330884924833711842866896734e-35L, /* bf8c617bf9e8b0fc45001cfb35c23767 */
+
+/* x = 5.54687500000000000000000000000000000e-01 3ffe1c00000000000000000000000000 */
+/* cos(x) = 0.d99ddd44e44a43d4d4a3a3ed95204106fd54d78e8c7684545c0da0b7c2c72be7a89b7c182ad */
+ 8.50065068549420263957072899177793617e-01L, /* 3ffeb33bba89c89487a9a94747db2a41 */
+ -4.73753917078785974356016104842568442e-35L, /* bf8cf7c81559438b9c4bdd5d1f92fa42 */
+/* sin(x) = 0.86d45935ab396cb4e421e822dee54f3562dfcefeaa782184c23401d231f5ad981a1cc195b18 */
+ 5.26677680590386730710789410624833901e-01L, /* 3ffe0da8b26b5672d969c843d045bdcb */
+ -3.67066148195515214077582496518566735e-35L, /* bf8c8654e901880aac3ef3d9ee5ff16e */
+
+/* x = 5.62500000000000000000000000000000000e-01 3ffe2000000000000000000000000000 */
+/* cos(x) = 0.d88e820b1526311dd561efbc0c1a9a5375eb26f65d246c5744b13ca26a7e0fd42556da843c8 */
+ 8.45924499231067954459723078597493262e-01L, /* 3ffeb11d04162a4c623baac3df781835 */
+ 1.98054947141989878179164342925274053e-35L, /* 3f8ba5375eb26f65d246c5744b13ca27 */
+/* sin(x) = 0.88868625b4e1dbb2313310133022527200c143a5cb16637cb7daf8ade82459ff2e98511f40f */
+ 5.33302673536020173329131103308161529e-01L, /* 3ffe110d0c4b69c3b764626620266045 */
+ -3.42715291319551615996993795226755157e-35L, /* bf8c6c6ff9f5e2d1a74ce41a41283a91 */
+
+/* x = 5.70312500000000000000000000000000000e-01 3ffe2400000000000000000000000000 */
+/* cos(x) = 0.d77bc4985e93a607c9d868b906bbc6bbe3a04258814acb0358468b826fc91bd4d814827f65e */
+ 8.41732299041338366963111794309701085e-01L, /* 3ffeaef78930bd274c0f93b0d1720d78 */
+ -4.30821936750410026005408345400225948e-35L, /* bf8cca20e2fded3bf5a9a7e53dcba3ed */
+/* sin(x) = 0.8a3690fc5bfc11bf9535e2739a8512f448a41251514bbed7fc18d530f9b4650fcbb2861b0aa */
+ 5.39895116435204405041660709903993340e-01L, /* 3ffe146d21f8b7f8237f2a6bc4e7350a */
+ 1.42595803521626714477253741404712093e-35L, /* 3f8b2f448a41251514bbed7fc18d5310 */
+
+/* x = 5.78125000000000000000000000000000000e-01 3ffe2800000000000000000000000000 */
+/* cos(x) = 0.d665a937b4ef2b1f6d51bad6d988a4419c1d7051faf31a9efa151d7631117efac03713f950a */
+ 8.37488723850523685315353348917240617e-01L, /* 3ffeaccb526f69de563edaa375adb311 */
+ 2.72761997872084533045777718677326179e-35L, /* 3f8c220ce0eb828fd798d4f7d0a8ebb2 */
+/* sin(x) = 0.8be472f9776d809af2b88171243d63d66dfceeeb739cc894e023fbc165a0e3f26ff729c5d57 */
+ 5.46454606919203564403349553749411001e-01L, /* 3ffe17c8e5f2eedb0135e57102e2487b */
+ -2.11870230730160315420936523771864858e-35L, /* bf8bc29920311148c63376b1fdc043ea */
+
+/* x = 5.85937500000000000000000000000000000e-01 3ffe2c00000000000000000000000000 */
+/* cos(x) = 0.d54c3441844897fc8f853f0655f1ba695eba9fbfd7439dbb1171d862d9d9146ca5136f825ac */
+ 8.33194032664581363070224042208032321e-01L, /* 3ffeaa98688308912ff91f0a7e0cabe3 */
+ 4.39440050052045486567668031751259899e-35L, /* 3f8cd34af5d4fdfeba1cedd88b8ec317 */
+/* sin(x) = 0.8d902565817ee7839bce3cd128060119492cd36d42d82ada30d7f8bde91324808377ddbf5d4 */
+ 5.52980744630527369849695082681623667e-01L, /* 3ffe1b204acb02fdcf07379c79a2500c */
+ 8.26624790417342895897164123189984127e-37L, /* 3f8719492cd36d42d82ada30d7f8bde9 */
+
+/* x = 5.93750000000000000000000000000000000e-01 3ffe3000000000000000000000000000 */
+/* cos(x) = 0.d42f6a1b9f0168cdf031c2f63c8d9304d86f8d34cb1d5fccb68ca0f2241427fc18d1fd5bbdf */
+ 8.28848487609325734810171790119116638e-01L, /* 3ffea85ed4373e02d19be06385ec791b */
+ 1.43082508100496581719048175506239770e-35L, /* 3f8b304d86f8d34cb1d5fccb68ca0f22 */
+/* sin(x) = 0.8f39a191b2ba6122a3fa4f41d5a3ffd421417d46f19a22230a14f7fcc8fce5c75b4b28b29d1 */
+ 5.59473131247366877384844006003116688e-01L, /* 3ffe1e7343236574c24547f49e83ab48 */
+ -1.28922620524163922306886952100992796e-37L, /* bf845ef5f415c8732eeee7af584019b8 */
+
+/* x = 6.01562500000000000000000000000000000e-01 3ffe3400000000000000000000000000 */
+/* cos(x) = 0.d30f4f392c357ab0661c5fa8a7d9b26627846fef214b1d19a22379ff9eddba087cf410eb097 */
+ 8.24452353914429207485643598212356053e-01L, /* 3ffea61e9e72586af560cc38bf514fb3 */
+ 3.79160239225080026987031418939026741e-35L, /* 3f8c93313c237f790a58e8cd111bcffd */
+/* sin(x) = 0.90e0e0d81ca678796cc92c8ea8c2815bc72ca78abe571bfa8576aacc571e096a33237e0e830 */
+ 5.65931370507905990773159095689276114e-01L, /* 3ffe21c1c1b0394cf0f2d992591d5185 */
+ 1.02202775968053982310991962521535027e-36L, /* 3f875bc72ca78abe571bfa8576aacc57 */
+
+/* x = 6.09375000000000000000000000000000000e-01 3ffe3800000000000000000000000000 */
+/* cos(x) = 0.d1ebe81a95ee752e48a26bcd32d6e922d7eb44b8ad2232f6930795e84b56317269b9dd1dfa6 */
+ 8.20005899897234008255550633876556043e-01L, /* 3ffea3d7d0352bdcea5c9144d79a65ae */
+ -1.72008811955230823416724332297991247e-35L, /* bf8b6dd2814bb4752ddcd096cf86a17b */
+/* sin(x) = 0.9285dc9bc45dd9ea3d02457bcce59c4175aab6ff7929a8d287195525fdace200dba032874fb */
+ 5.72355068234507240384953706824503608e-01L, /* 3ffe250bb93788bbb3d47a048af799cb */
+ 2.12572273479933123944580199464514529e-35L, /* 3f8bc4175aab6ff7929a8d2871955260 */
+
+/* x = 6.17187500000000000000000000000000000e-01 3ffe3c00000000000000000000000000 */
+/* cos(x) = 0.d0c5394d772228195e25736c03574707de0af1ca344b13bd3914bfe27518e9e426f5deff1e1 */
+ 8.15509396946375476876345384201386217e-01L, /* 3ffea18a729aee445032bc4ae6d806af */
+ -4.28589138410712954051679139949341961e-35L, /* bf8cc7c10fa871ae5da76216375a00ec */
+/* sin(x) = 0.94288e48bd0335fc41c4cbd2920497a8f5d1d8185c99fa0081f90c27e2a53ffdd208a0dbe69 */
+ 5.78743832357770354521111378581385347e-01L, /* 3ffe28511c917a066bf8838997a52409 */
+ 1.77998063432551282609698670002456093e-35L, /* 3f8b7a8f5d1d8185c99fa0081f90c27e */
+
+/* x = 6.25000000000000000000000000000000000e-01 3ffe4000000000000000000000000000 */
+/* cos(x) = 0.cf9b476c897c25c5bfe750dd3f308eaf7bcc1ed00179a256870f4200445043dcdb1974b5878 */
+ 8.10963119505217902189534803941080724e-01L, /* 3ffe9f368ed912f84b8b7fcea1ba7e61 */
+ 1.10481292856794436426051402418804358e-35L, /* 3f8ad5ef7983da002f344ad0e1e84009 */
+/* sin(x) = 0.95c8ef544210ec0b91c49bd2aa09e8515fa61a156ebb10f5f8c232a6445b61ebf3c2ec268f9 */
+ 5.85097272940462154805399314150080459e-01L, /* 3ffe2b91dea88421d817238937a55414 */
+ -1.78164576278056195136525335403380464e-35L, /* bf8b7aea059e5ea9144ef0a073dcd59c */
+
+/* x = 6.32812500000000000000000000000000000e-01 3ffe4400000000000000000000000000 */
+/* cos(x) = 0.ce6e171f92f2e27f32225327ec440ddaefae248413efc0e58ceee1ae369aabe73f88c87ed1a */
+ 8.06367345055103913698795406077297399e-01L, /* 3ffe9cdc2e3f25e5c4fe6444a64fd888 */
+ 1.04235088143133625463876245029180850e-35L, /* 3f8abb5df5c490827df81cb19ddc35c7 */
+/* sin(x) = 0.9766f93cd18413a6aafc1cfc6fc28abb6817bf94ce349901ae3f48c3215d3eb60acc5f78903 */
+ 5.91415002201316315087000225758031236e-01L, /* 3ffe2ecdf279a308274d55f839f8df85 */
+ 8.07390238063560077355762466502569603e-36L, /* 3f8a576d02f7f299c6932035c7e91864 */
+
+/* x = 6.40625000000000000000000000000000000e-01 3ffe4800000000000000000000000000 */
+/* cos(x) = 0.cd3dad1b5328a2e459f993f4f5108819faccbc4eeba9604e81c7adad51cc8a2561631a06826 */
+ 8.01722354098418450607492605652964208e-01L, /* 3ffe9a7b5a36a65145c8b3f327e9ea21 */
+ 6.09487851305233089325627939458963741e-36L, /* 3f8a033f599789dd752c09d038f5b5aa */
+/* sin(x) = 0.9902a58a45e27bed68412b426b675ed503f54d14c8172e0d373f42cadf04daf67319a7f94be */
+ 5.97696634538701531238647618967334337e-01L, /* 3ffe32054b148bc4f7dad0825684d6cf */
+ -2.49527608940873714527427941350461554e-35L, /* bf8c0957e0559759bf468f964605e9a9 */
+
+/* x = 6.48437500000000000000000000000000000e-01 3ffe4c00000000000000000000000000 */
+/* cos(x) = 0.cc0a0e21709883a3ff00911e11a07ee3bd7ea2b04e081be99be0264791170761ae64b8b744a */
+ 7.97028430141468342004642741431945296e-01L, /* 3ffe98141c42e1310747fe01223c2341 */
+ -8.35364432831812599727083251866305534e-37L, /* bf871c42815d4fb1f7e416641fd9b86f */
+/* sin(x) = 0.9a9bedcdf01b38d993f3d7820781de292033ead73b89e28f39313dbe3a6e463f845b5fa8490 */
+ 6.03941786554156657267270287527367726e-01L, /* 3ffe3537db9be03671b327e7af040f04 */
+ -2.54578992328947177770363936132309779e-35L, /* bf8c0eb6fe60a94623b0eb863676120e */
+
+/* x = 6.56250000000000000000000000000000000e-01 3ffe5000000000000000000000000000 */
+/* cos(x) = 0.cad33f00658fe5e8204bbc0f3a66a0e6a773f87987a780b243d7be83b3db1448ca0e0e62787 */
+ 7.92285859677178543141501323781709399e-01L, /* 3ffe95a67e00cb1fcbd04097781e74cd */
+ 2.47519558228473167879248891673807645e-35L, /* 3f8c07353b9fc3cc3d3c05921ebdf41e */
+/* sin(x) = 0.9c32cba2b14156ef05256c4f857991ca6a547cd7ceb1ac8a8e62a282bd7b9183648a462bd04 */
+ 6.10150077075791371273742393566183220e-01L, /* 3ffe386597456282adde0a4ad89f0af3 */
+ 1.33842237929938963780969418369150532e-35L, /* 3f8b1ca6a547cd7ceb1ac8a8e62a282c */
+
+/* x = 6.64062500000000000000000000000000000e-01 3ffe5400000000000000000000000000 */
+/* cos(x) = 0.c99944936cf48c8911ff93fe64b3ddb7981e414bdaf6aae1203577de44878c62bc3bc9cf7b9 */
+ 7.87494932167606083931328295965533034e-01L, /* 3ffe93328926d9e9191223ff27fcc968 */
+ -2.57915385618070637156514241185180920e-35L, /* bf8c12433f0df5a1284aa8f6fe54410e */
+/* sin(x) = 0.9dc738ad14204e689ac582d0f85826590feece34886cfefe2e08cf2bb8488d55424dc9d3525 */
+ 6.16321127181550943005700433761731837e-01L, /* 3ffe3b8e715a28409cd1358b05a1f0b0 */
+ 2.88497530050197716298085892460478666e-35L, /* 3f8c32c87f7671a44367f7f17046795e */
+
+/* x = 6.71875000000000000000000000000000000e-01 3ffe5800000000000000000000000000 */
+/* cos(x) = 0.c85c23c26ed7b6f014ef546c47929682122876bfbf157de0aff3c4247d820c746e32cd4174f */
+ 7.82655940026272796930787447428139026e-01L, /* 3ffe90b84784ddaf6de029dea8d88f25 */
+ 1.69332045679237919427807771288506254e-35L, /* 3f8b682122876bfbf157de0aff3c4248 */
+/* sin(x) = 0.9f592e9b66a9cf906a3c7aa3c10199849040c45ec3f0a747597311038101780c5f266059dbf */
+ 6.22454560222343683041926705090443330e-01L, /* 3ffe3eb25d36cd539f20d478f5478203 */
+ 1.91974786921147072717621236192269859e-35L, /* 3f8b9849040c45ec3f0a747597311038 */
+
+/* x = 6.79687500000000000000000000000000000e-01 3ffe5c00000000000000000000000000 */
+/* cos(x) = 0.c71be181ecd6875ce2da5615a03cca207d9adcb9dfb0a1d6c40a4f0056437f1a59ccddd06ee */
+ 7.77769178600317903122203513685412863e-01L, /* 3ffe8e37c303d9ad0eb9c5b4ac2b407a */
+ -4.05296033424632846931240580239929672e-35L, /* bf8caefc13291a31027af149dfad87fd */
+/* sin(x) = 0.a0e8a725d33c828c11fa50fd9e9a15ffecfad43f3e534358076b9b0f6865694842b1e8c67dc */
+ 6.28550001845029662028004327939032867e-01L, /* 3ffe41d14e4ba679051823f4a1fb3d34 */
+ 1.65507421184028099672784511397428852e-35L, /* 3f8b5ffecfad43f3e534358076b9b0f7 */
+
+/* x = 6.87500000000000000000000000000000000e-01 3ffe6000000000000000000000000000 */
+/* cos(x) = 0.c5d882d2ee48030c7c07d28e981e34804f82ed4cf93655d2365389b716de6ad44676a1cc5da */
+ 7.72834946152471544810851845913425178e-01L, /* 3ffe8bb105a5dc900618f80fa51d303c */
+ 3.94975229341211664237241534741146939e-35L, /* 3f8ca4027c176a67c9b2ae91b29c4db9 */
+/* sin(x) = 0.a2759c0e79c35582527c32b55f5405c182c66160cb1d9eb7bb0b7cdf4ad66f317bda4332914 */
+ 6.34607080015269296850309914203671436e-01L, /* 3ffe44eb381cf386ab04a4f8656abea8 */
+ 4.33025916939968369326060156455927002e-36L, /* 3f897060b1985832c767adeec2df37d3 */
+
+/* x = 6.95312500000000000000000000000000000e-01 3ffe6400000000000000000000000000 */
+/* cos(x) = 0.c4920cc2ec38fb891b38827db08884fc66371ac4c2052ca8885b981bbcfd3bb7b093ee31515 */
+ 7.67853543842850365879920759114193964e-01L, /* 3ffe89241985d871f712367104fb6111 */
+ 3.75100035267325597157244776081706979e-36L, /* 3f893f198dc6b130814b2a2216e606ef */
+/* sin(x) = 0.a400072188acf49cd6b173825e038346f105e1301afe642bcc364cea455e21e506e3e927ed8 */
+ 6.40625425040230409188409779413961021e-01L, /* 3ffe48000e431159e939ad62e704bc07 */
+ 2.46542747294664049615806500747173281e-36L, /* 3f88a37882f0980d7f3215e61b267523 */
+
+/* x = 7.03125000000000000000000000000000000e-01 3ffe6800000000000000000000000000 */
+/* cos(x) = 0.c348846bbd3631338ffe2bfe9dd1381a35b4e9c0c51b4c13fe376bad1bf5caacc4542be0aa9 */
+ 7.62825275710576250507098753625429792e-01L, /* 3ffe869108d77a6c62671ffc57fd3ba2 */
+ 4.22067411888601505004748939382325080e-35L, /* 3f8cc0d1ada74e0628da609ff1bb5d69 */
+/* sin(x) = 0.a587e23555bb08086d02b9c662cdd29316c3e9bd08d93793634a21b1810cce73bdb97a99b9e */
+ 6.46604669591152370524042159882800763e-01L, /* 3ffe4b0fc46aab761010da05738cc59c */
+ -3.41742981816219412415674365946079826e-35L, /* bf8c6b6749e0b217b9364364e5aef274 */
+
+/* x = 7.10937500000000000000000000000000000e-01 3ffe6c00000000000000000000000000 */
+/* cos(x) = 0.c1fbeef380e4ffdd5a613ec8722f643ffe814ec2343e53adb549627224fdc9f2a7b77d3d69f */
+ 7.57750448655219342240234832230493361e-01L, /* 3ffe83f7dde701c9ffbab4c27d90e45f */
+ -2.08767968311222650582659938787920125e-35L, /* bf8bbc0017eb13dcbc1ac524ab69d8de */
+/* sin(x) = 0.a70d272a76a8d4b6da0ec90712bb748b96dabf88c3079246f3db7eea6e58ead4ed0e2843303 */
+ 6.52544448725765956407573982284767763e-01L, /* 3ffe4e1a4e54ed51a96db41d920e2577 */
+ -8.61758060284379660697102362141557170e-36L, /* bf8a6e8d24a80ee79f0db721849022b2 */
+
+/* x = 7.18750000000000000000000000000000000e-01 3ffe7000000000000000000000000000 */
+/* cos(x) = 0.c0ac518c8b6ae710ba37a3eeb90cb15aebcb8bed4356fb507a48a6e97de9aa6d9660116b436 */
+ 7.52629372418066476054541324847143116e-01L, /* 3ffe8158a31916d5ce21746f47dd7219 */
+ 3.71306958657663189665450864311104571e-35L, /* 3f8c8ad75e5c5f6a1ab7da83d245374c */
+/* sin(x) = 0.a88fcfebd9a8dd47e2f3c76ef9e2439920f7e7fbe735f8bcc985491ec6f12a2d4214f8cfa99 */
+ 6.58444399910567541589583954884041989e-01L, /* 3ffe511f9fd7b351ba8fc5e78eddf3c5 */
+ -4.54412944084300330523721391865787219e-35L, /* bf8ce336f840c020c6503a19b3d5b70a */
+
+/* x = 7.26562500000000000000000000000000000e-01 3ffe7400000000000000000000000000 */
+/* cos(x) = 0.bf59b17550a4406875969296567cf3e3b4e483061877c02811c6cae85fad5a6c3da58f49292 */
+ 7.47462359563216166669700384714767552e-01L, /* 3ffe7eb362eaa14880d0eb2d252cacfa */
+ -9.11094340926220027288083639048016945e-36L, /* bf8a8389636f9f3cf107fafdc726a2f4 */
+/* sin(x) = 0.aa0fd66eddb921232c28520d3911b8a03193b47f187f1471ac216fbcd5bb81029294d3a73f1 */
+ 6.64304163042946276515506587432846246e-01L, /* 3ffe541facddbb7242465850a41a7223 */
+ 4.26004843895378210155889028714676019e-35L, /* 3f8cc5018c9da3f8c3f8a38d610b7de7 */
+
+/* x = 7.34375000000000000000000000000000000e-01 3ffe7800000000000000000000000000 */
+/* cos(x) = 0.be0413f84f2a771c614946a88cbf4da1d75a5560243de8f2283fefa0ea4a48468a52d51d8b3 */
+ 7.42249725458501306991347253449610537e-01L, /* 3ffe7c0827f09e54ee38c2928d51197f */
+ -3.78925270049800913539923473871287550e-35L, /* bf8c92f1452d54fede10b86ebe0082f9 */
+/* sin(x) = 0.ab8d34b36acd987210ed343ec65d7e3adc2e7109fce43d55c8d57dfdf55b9e01d2cc1f1b9ec */
+ 6.70123380473162894654531583500648495e-01L, /* 3ffe571a6966d59b30e421da687d8cbb */
+ -1.33165852952743729897634069393684656e-36L, /* bf87c523d18ef6031bc2aa372a82020b */
+
+/* x = 7.42187500000000000000000000000000000e-01 3ffe7c00000000000000000000000000 */
+/* cos(x) = 0.bcab7e6bfb2a14a9b122c574a376bec98ab14808c64a4e731b34047e217611013ac99c0f25d */
+ 7.36991788256240741057089385586450844e-01L, /* 3ffe7956fcd7f654295362458ae946ed */
+ 4.72358938637974850573747497460125519e-35L, /* 3f8cf64c558a404632527398d9a023f1 */
+/* sin(x) = 0.ad07e4c409d08c4fa3a9057bb0ac24b8636e74e76f51e09bd6b2319707cbd9f5e254643897a */
+ 6.75901697026178809189642203142423973e-01L, /* 3ffe5a0fc98813a1189f47520af76158 */
+ 2.76252586616364878801928456702948857e-35L, /* 3f8c25c31b73a73b7a8f04deb5918cb8 */
+
+/* x = 7.50000000000000000000000000000000000e-01 3ffe8000000000000000000000000000 */
+/* cos(x) = 0.bb4ff632a908f73ec151839cb9d993b4e0bfb8f20e7e44e6e4aee845e35575c3106dbe6fd06 */
+ 7.31688868873820886311838753000084529e-01L, /* 3ffe769fec655211ee7d82a3073973b3 */
+ 1.48255637548931697184991710293198620e-35L, /* 3f8b3b4e0bfb8f20e7e44e6e4aee845e */
+/* sin(x) = 0.ae7fe0b5fc786b2d966e1d6af140a488476747c2646425fc7533f532cd044cb10a971a49a6a */
+ 6.81638760023334166733241952779893908e-01L, /* 3ffe5cffc16bf8f0d65b2cdc3ad5e281 */
+ 2.74838775935027549024224114338667371e-35L, /* 3f8c24423b3a3e1323212fe3a99fa996 */
+
+/* x = 7.57812500000000000000000000000000000e-01 3ffe8400000000000000000000000000 */
+/* cos(x) = 0.b9f180ba77dd0751628e135a9508299012230f14becacdd14c3f8862d122de5b56d55b53360 */
+ 7.26341290974108590410147630237598973e-01L, /* 3ffe73e30174efba0ea2c51c26b52a10 */
+ 3.12683579338351123545814364980658990e-35L, /* 3f8c4c80911878a5f6566e8a61fc4317 */
+/* sin(x) = 0.aff522a954f2ba16d9defdc416e33f5e9a5dfd5a6c228e0abc4d521327ff6e2517a7b3851dd */
+ 6.87334219303873534951703613035647220e-01L, /* 3ffe5fea4552a9e5742db3bdfb882dc6 */
+ 4.76739454455410744997012795035529128e-35L, /* 3f8cfaf4d2efead361147055e26a9099 */
+
+/* x = 7.65625000000000000000000000000000000e-01 3ffe8800000000000000000000000000 */
+/* cos(x) = 0.b890237d3bb3c284b614a0539016bfa1053730bbdf940fa895e185f8e58884d3dda15e63371 */
+ 7.20949380945696418043812784148447688e-01L, /* 3ffe712046fa776785096c2940a7202d */
+ 4.78691285733673379499536326050811832e-35L, /* 3f8cfd0829b985defca07d44af0c2fc7 */
+/* sin(x) = 0.b167a4c90d63c4244cf5493b7cc23bd3c3c1225e078baa0c53d6d400b926281f537a1a260e6 */
+ 6.92987727246317910281815490823048210e-01L, /* 3ffe62cf49921ac7884899ea9276f984 */
+ 4.50089871077663557180849219529189918e-35L, /* 3f8cde9e1e0912f03c5d50629eb6a006 */
+
+/* x = 7.73437500000000000000000000000000000e-01 3ffe8c00000000000000000000000000 */
+/* cos(x) = 0.b72be40067aaf2c050dbdb7a14c3d7d4f203f6b3f0224a4afe55d6ec8e92b508fd5c5984b3b */
+ 7.15513467882981573520620561289896903e-01L, /* 3ffe6e57c800cf55e580a1b7b6f42988 */
+ -3.02191815581445336509438104625489192e-35L, /* bf8c41586fe04a607eedada80d51489c */
+/* sin(x) = 0.b2d7614b1f3aaa24df2d6e20a77e1ca3e6d838c03e29c1bcb026e6733324815fadc9eb89674 */
+ 6.98598938789681741301929277107891591e-01L, /* 3ffe65aec2963e755449be5adc414efc */
+ 2.15465226809256290914423429408722521e-35L, /* 3f8bca3e6d838c03e29c1bcb026e6733 */
+
+/* x = 7.81250000000000000000000000000000000e-01 3ffe9000000000000000000000000000 */
+/* cos(x) = 0.b5c4c7d4f7dae915ac786ccf4b1a498d3e73b6e5e74fe7519d9c53ee6d6b90e881bddfc33e1 */
+ 7.10033883566079674974121643959490219e-01L, /* 3ffe6b898fa9efb5d22b58f0d99e9635 */
+ -4.09623224763692443220896752907902465e-35L, /* bf8cb3960c6248d0c580c573131d608d */
+/* sin(x) = 0.b44452709a59752905913765434a59d111f0433eb2b133f7d103207e2aeb4aae111ddc385b3 */
+ 7.04167511454533672780059509973942844e-01L, /* 3ffe6888a4e134b2ea520b226eca8695 */
+ -2.87259372740393348676633610275598640e-35L, /* bf8c3177707de60a6a76604177e6fc0f */
+
+/* x = 7.89062500000000000000000000000000000e-01 3ffe9400000000000000000000000000 */
+/* cos(x) = 0.b45ad4975b1294cadca4cf40ec8f22a68cd14b175835239a37e63acb85e8e9505215df18140 */
+ 7.04510962440574606164129481545916976e-01L, /* 3ffe68b5a92eb6252995b9499e81d91e */
+ 2.60682037357042658395360726992048803e-35L, /* 3f8c1534668a58bac1a91cd1bf31d65c */
+/* sin(x) = 0.b5ae7285bc10cf515753847e8f8b7a30e0a580d929d770103509880680f7b8b0e8ad23b65d8 */
+ 7.09693105363899724959669028139035515e-01L, /* 3ffe6b5ce50b78219ea2aea708fd1f17 */
+ -4.37026016974122945368562319136420097e-36L, /* bf8973c7d69fc9b58a23fbf2bd9dfe60 */
+};
diff --git a/gnulib/lib/sinl.c b/gnulib/lib/sinl.c
new file mode 100644
index 00000000..d8a0e7a1
--- /dev/null
+++ b/gnulib/lib/sinl.c
@@ -0,0 +1,104 @@
+/* s_sinl.c -- long double version of s_sin.c.
+ * Conversion to long double by Jakub Jelinek, jj@ultra.linux.cz.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+/* sinl(x)
+ * Return sine function of x.
+ *
+ * kernel function:
+ * __kernel_sinl ... sine function on [-pi/4,pi/4]
+ * __kernel_cosl ... cose function on [-pi/4,pi/4]
+ * __ieee754_rem_pio2l ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "trigl.h"
+
+long double
+sinl (long double x)
+{
+ long double y[2], z = 0.0L;
+ int n;
+
+ /* sinl(NaN) is NaN */
+ if (isnanl (x))
+ return x;
+
+ /* |x| ~< pi/4 */
+ if (x >= -0.7853981633974483096156608458198757210492 &&
+ x <= 0.7853981633974483096156608458198757210492)
+ return kernel_sinl (x, z, 0);
+
+ /* sinl(Inf) is NaN, sinl(0) is 0 */
+ else if (x + x == x)
+ return x - x; /* NaN */
+
+ /* argument reduction needed */
+ else
+ {
+ n = ieee754_rem_pio2l (x, y);
+ switch (n & 3)
+ {
+ case 0:
+ return kernel_sinl (y[0], y[1], 1);
+ case 1:
+ return kernel_cosl (y[0], y[1]);
+ case 2:
+ return -kernel_sinl (y[0], y[1], 1);
+ default:
+ return -kernel_cosl (y[0], y[1]);
+ }
+ }
+}
+
+#if 0
+int
+main (void)
+{
+ printf ("%.16Lg\n", sinl(0.7853981633974483096156608458198757210492));
+ printf ("%.16Lg\n", sinl(0.7853981633974483096156608458198757210492 *29));
+ printf ("%.16Lg\n", sinl(0.7853981633974483096156608458198757210492 *2));
+ printf ("%.16Lg\n", sinl(0.7853981633974483096156608458198757210492 *30));
+ printf ("%.16Lg\n", sinl(0.7853981633974483096156608458198757210492 *4));
+ printf ("%.16Lg\n", sinl(0.7853981633974483096156608458198757210492 *32));
+ printf ("%.16Lg\n", sinl(0.7853981633974483096156608458198757210492 *2/3));
+ printf ("%.16Lg\n", sinl(0.7853981633974483096156608458198757210492 *4/3));
+}
+#endif
diff --git a/gnulib/lib/size_max.h b/gnulib/lib/size_max.h
new file mode 100644
index 00000000..3dc06b3d
--- /dev/null
+++ b/gnulib/lib/size_max.h
@@ -0,0 +1,31 @@
+/* size_max.h -- declare SIZE_MAX through system headers
+ Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef GNULIB_SIZE_MAX_H
+#define GNULIB_SIZE_MAX_H
+
+/* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */
+# include <limits.h>
+/* Get SIZE_MAX declaration on systems like glibc 2. */
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+/* On systems where these include files don't define it, SIZE_MAX is defined
+ in config.h. */
+
+#endif /* GNULIB_SIZE_MAX_H */
diff --git a/gnulib/lib/sleep.c b/gnulib/lib/sleep.c
new file mode 100644
index 00000000..213e5bd2
--- /dev/null
+++ b/gnulib/lib/sleep.c
@@ -0,0 +1,75 @@
+/* Pausing execution of the current thread.
+ Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <limits.h>
+
+#include "verify.h"
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+unsigned int
+sleep (unsigned int seconds)
+{
+ unsigned int remaining;
+
+ /* Sleep for 1 second many times, because
+ 1. Sleep is not interruptiple by Ctrl-C,
+ 2. we want to avoid arithmetic overflow while multiplying with 1000. */
+ for (remaining = seconds; remaining > 0; remaining--)
+ Sleep (1000);
+
+ return remaining;
+}
+
+#elif HAVE_SLEEP
+
+# undef sleep
+
+/* Guarantee unlimited sleep and a reasonable return value. Cygwin
+ 1.5.x rejects attempts to sleep more than 49.7 days (2**32
+ milliseconds), but uses uninitialized memory which results in a
+ garbage answer. */
+unsigned int
+rpl_sleep (unsigned int seconds)
+{
+ /* This requires int larger than 16 bits. */
+ verify (UINT_MAX / 49 / 24 / 60 / 60);
+ const unsigned int limit = 49 * 24 * 60 * 60;
+ while (limit < seconds)
+ {
+ unsigned int result;
+ seconds -= limit;
+ result = sleep (limit);
+ if (result)
+ return seconds + result;
+ }
+ return sleep (seconds);
+}
+
+#else /* !HAVE_SLEEP */
+
+ #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib."
+
+#endif
diff --git a/gnulib/lib/snprintf.c b/gnulib/lib/snprintf.c
new file mode 100644
index 00000000..2ff22b84
--- /dev/null
+++ b/gnulib/lib/snprintf.c
@@ -0,0 +1,72 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Paul Eggert.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vasnprintf.h"
+
+/* Print formatted output to string STR. Similar to sprintf, but
+ additional length SIZE limit how much is written into STR. Returns
+ string length of formatted string (which may be larger than SIZE).
+ STR may be NULL, in which case nothing will be written. On error,
+ return a negative value. */
+int
+snprintf (char *str, size_t size, const char *format, ...)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf = size;
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ if (size)
+ {
+ size_t pruned_len = (len < size ? len : size - 1);
+ memcpy (str, output, pruned_len);
+ str[pruned_len] = '\0';
+ }
+
+ free (output);
+ }
+
+ if (INT_MAX < len)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/socket.c b/gnulib/lib/socket.c
new file mode 100644
index 00000000..63e0aaea
--- /dev/null
+++ b/gnulib/lib/socket.c
@@ -0,0 +1,49 @@
+/* socket.c --- wrappers for Windows socket function
+
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#include "sockets.h"
+
+int
+rpl_socket (int domain, int type, int protocol)
+{
+ SOCKET fh;
+
+ gl_sockets_startup (SOCKETS_1_1);
+
+ /* We have to use WSASocket() to create non-overlapped IO sockets.
+ Overlapped IO sockets cannot be used with read/write. */
+ fh = WSASocket (domain, type, protocol, NULL, 0, 0);
+
+ if (fh == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ return SOCKET_TO_FD (fh);
+}
diff --git a/gnulib/lib/sockets.c b/gnulib/lib/sockets.c
new file mode 100644
index 00000000..b946c7e6
--- /dev/null
+++ b/gnulib/lib/sockets.c
@@ -0,0 +1,118 @@
+/* sockets.c --- wrappers for Windows socket functions
+
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Simon Josefsson */
+
+#include <config.h>
+
+/* Specification. */
+#include "sockets.h"
+
+#if WINDOWS_SOCKETS
+
+/* This includes winsock2.h on MinGW. */
+# include <sys/socket.h>
+
+# include "close-hook.h"
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+# include "w32sock.h"
+
+static int
+close_fd_maybe_socket (int fd, const struct close_hook *remaining_list)
+{
+ SOCKET sock;
+ WSANETWORKEVENTS ev;
+
+ /* Test whether fd refers to a socket. */
+ sock = FD_TO_SOCKET (fd);
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents (sock, NULL, &ev);
+ if (ev.lNetworkEvents != 0xDEADBEEF)
+ {
+ /* fd refers to a socket. */
+ /* FIXME: other applications, like squid, use an undocumented
+ _free_osfhnd free function. But this is not enough: The 'osfile'
+ flags for fd also needs to be cleared, but it is hard to access it.
+ Instead, here we just close twice the file descriptor. */
+ if (closesocket (sock))
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ {
+ /* This call frees the file descriptor and does a
+ CloseHandle ((HANDLE) _get_osfhandle (fd)), which fails. */
+ _close (fd);
+ return 0;
+ }
+ }
+ else
+ /* Some other type of file descriptor. */
+ return execute_close_hooks (fd, remaining_list);
+}
+
+static struct close_hook close_sockets_hook;
+
+static int initialized_sockets_version /* = 0 */;
+
+#endif /* WINDOWS_SOCKETS */
+
+int
+gl_sockets_startup (int version _GL_UNUSED)
+{
+#if WINDOWS_SOCKETS
+ if (version > initialized_sockets_version)
+ {
+ WSADATA data;
+ int err;
+
+ err = WSAStartup (version, &data);
+ if (err != 0)
+ return 1;
+
+ if (data.wVersion < version)
+ return 2;
+
+ if (initialized_sockets_version == 0)
+ register_close_hook (close_fd_maybe_socket, &close_sockets_hook);
+
+ initialized_sockets_version = version;
+ }
+#endif
+
+ return 0;
+}
+
+int
+gl_sockets_cleanup (void)
+{
+#if WINDOWS_SOCKETS
+ int err;
+
+ initialized_sockets_version = 0;
+
+ unregister_close_hook (&close_sockets_hook);
+
+ err = WSACleanup ();
+ if (err != 0)
+ return 1;
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/sockets.h b/gnulib/lib/sockets.h
new file mode 100644
index 00000000..921bf6f7
--- /dev/null
+++ b/gnulib/lib/sockets.h
@@ -0,0 +1,51 @@
+/* sockets.h - wrappers for Windows socket functions
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson */
+
+#ifndef SOCKETS_H
+# define SOCKETS_H 1
+
+#define SOCKETS_1_0 0x100 /* don't use - does not work on Windows XP */
+#define SOCKETS_1_1 0x101
+#define SOCKETS_2_0 0x200 /* don't use - does not work on Windows XP */
+#define SOCKETS_2_1 0x201
+#define SOCKETS_2_2 0x202
+
+int gl_sockets_startup (int version);
+int gl_sockets_cleanup (void);
+
+/* This function is useful it you create a socket using gnulib's
+ Winsock wrappers but needs to pass on the socket handle to some
+ other library that only accepts sockets. */
+#if WINDOWS_SOCKETS
+
+#include <sys/socket.h>
+
+static inline SOCKET
+gl_fd_to_handle (int fd)
+{
+ return _get_osfhandle (fd);
+}
+
+#else
+
+#define gl_fd_to_handle(x) (x)
+
+#endif /* WINDOWS_SOCKETS */
+
+#endif /* SOCKETS_H */
diff --git a/gnulib/lib/spawn.c b/gnulib/lib/spawn.c
new file mode 100644
index 00000000..8f82a892
--- /dev/null
+++ b/gnulib/lib/spawn.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include "spawn_int.h"
+
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+posix_spawn (pid_t *pid, const char *path,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[])
+{
+ return __spawni (pid, path, file_actions, attrp, argv, envp, 0);
+}
diff --git a/gnulib/lib/spawn.in.h b/gnulib/lib/spawn.in.h
new file mode 100644
index 00000000..84ba93c1
--- /dev/null
+++ b/gnulib/lib/spawn.in.h
@@ -0,0 +1,548 @@
+/* Definitions for POSIX spawn interface.
+ Copyright (C) 2000, 2003-2004, 2008-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _GL_SPAWN_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SPAWN_H@
+# @INCLUDE_NEXT@ @NEXT_SPAWN_H@
+#endif
+
+#ifndef _GL_SPAWN_H
+#define _GL_SPAWN_H
+
+/* Get definitions of 'struct sched_param' and 'sigset_t'.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <sched.h>
+# include <signal.h>
+#endif
+
+#include <sys/types.h>
+
+#ifndef __THROW
+# define __THROW
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+# define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# define _Restrict_ __restrict
+# else
+# define _Restrict_
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax. Don't trust
+ sys/cdefs.h's definition of __restrict_arr, though, as it
+ mishandles gcc -ansi -pedantic. */
+#ifndef _Restrict_arr_
+# if ((199901L <= __STDC_VERSION__ \
+ || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
+ && !__STRICT_ANSI__)) \
+ && !defined __GNUG__)
+# define _Restrict_arr_ _Restrict_
+# else
+# define _Restrict_arr_
+# endif
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Data structure to contain attributes for thread creation. */
+#if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_t rpl_posix_spawnattr_t
+#endif
+#if @REPLACE_POSIX_SPAWN@ || !@HAVE_POSIX_SPAWNATTR_T@
+typedef struct
+{
+ short int _flags;
+ pid_t _pgrp;
+ sigset_t _sd;
+ sigset_t _ss;
+ struct sched_param _sp;
+ int _policy;
+ int __pad[16];
+} posix_spawnattr_t;
+#endif
+
+
+/* Data structure to contain information about the actions to be
+ performed in the new process with respect to file descriptors. */
+#if @REPLACE_POSIX_SPAWN@
+# define posix_spawn_file_actions_t rpl_posix_spawn_file_actions_t
+#endif
+#if @REPLACE_POSIX_SPAWN@ || !@HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+typedef struct
+{
+ int _allocated;
+ int _used;
+ struct __spawn_action *_actions;
+ int __pad[16];
+} posix_spawn_file_actions_t;
+#endif
+
+
+/* Flags to be set in the `posix_spawnattr_t'. */
+#if @REPLACE_POSIX_SPAWN@
+/* Use the values from the system, for better compatibility. */
+/* But this implementation does not support AIX extensions. */
+# undef POSIX_SPAWN_FORK_HANDLERS
+#else
+# define POSIX_SPAWN_RESETIDS 0x01
+# define POSIX_SPAWN_SETPGROUP 0x02
+# define POSIX_SPAWN_SETSIGDEF 0x04
+# define POSIX_SPAWN_SETSIGMASK 0x08
+# define POSIX_SPAWN_SETSCHEDPARAM 0x10
+# define POSIX_SPAWN_SETSCHEDULER 0x20
+#endif
+/* A GNU extension. Use the next free bit position. */
+#define POSIX_SPAWN_USEVFORK \
+ ((POSIX_SPAWN_RESETIDS | (POSIX_SPAWN_RESETIDS - 1) \
+ | POSIX_SPAWN_SETPGROUP | (POSIX_SPAWN_SETPGROUP - 1) \
+ | POSIX_SPAWN_SETSIGDEF | (POSIX_SPAWN_SETSIGDEF - 1) \
+ | POSIX_SPAWN_SETSIGMASK | (POSIX_SPAWN_SETSIGMASK - 1) \
+ | POSIX_SPAWN_SETSCHEDPARAM | (POSIX_SPAWN_SETSCHEDPARAM - 1) \
+ | POSIX_SPAWN_SETSCHEDULER | (POSIX_SPAWN_SETSCHEDULER - 1)) \
+ + 1)
+typedef int verify_POSIX_SPAWN_USEVFORK_no_overlap
+ [2 * (((POSIX_SPAWN_RESETIDS | POSIX_SPAWN_SETPGROUP
+ | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK
+ | POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER)
+ & POSIX_SPAWN_USEVFORK) == 0) - 1];
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_POSIX_SPAWN@
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS.
+
+ This function is a possible cancellation points and therefore not
+ marked with __THROW. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawn rpl_posix_spawn
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_])
+ _GL_ARG_NONNULL ((2, 5, 6));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn
+# if HAVE_RAW_DECL_POSIX_SPAWN
+_GL_WARN_ON_USE (posix_spawn, "posix_spawn is unportable - "
+ "use gnulib module posix_spawn for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNP@
+/* Similar to `posix_spawn' but search for FILE in the PATH.
+
+ This function is a possible cancellation points and therefore not
+ marked with __THROW. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnp rpl_posix_spawnp
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnp (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[])
+ _GL_ARG_NONNULL ((2, 5, 6));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnp
+# if HAVE_RAW_DECL_POSIX_SPAWNP
+_GL_WARN_ON_USE (posix_spawnp, "posix_spawnp is unportable - "
+ "use gnulib module posix_spawnp for portability");
+# endif
+#endif
+
+
+#if @GNULIB_POSIX_SPAWNATTR_INIT@
+/* Initialize data structure with attributes for `spawn' to default values. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_init rpl_posix_spawnattr_init
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_init (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_init
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_INIT
+_GL_WARN_ON_USE (posix_spawnattr_init, "posix_spawnattr_init is unportable - "
+ "use gnulib module posix_spawnattr_init for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_DESTROY@
+/* Free resources associated with ATTR. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_destroy rpl_posix_spawnattr_destroy
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_destroy (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_destroy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_DESTROY
+_GL_WARN_ON_USE (posix_spawnattr_destroy, "posix_spawnattr_destroy is unportable - "
+ "use gnulib module posix_spawnattr_destroy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+/* Store signal mask for signals with default handling from ATTR in
+ SIGDEFAULT. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_getsigdefault rpl_posix_spawnattr_getsigdefault
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getsigdefault (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getsigdefault
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSIGDEFAULT
+_GL_WARN_ON_USE (posix_spawnattr_getsigdefault, "posix_spawnattr_getsigdefault is unportable - "
+ "use gnulib module posix_spawnattr_getsigdefault for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_setsigdefault rpl_posix_spawnattr_setsigdefault
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setsigdefault (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setsigdefault
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSIGDEFAULT
+_GL_WARN_ON_USE (posix_spawnattr_setsigdefault, "posix_spawnattr_setsigdefault is unportable - "
+ "use gnulib module posix_spawnattr_setsigdefault for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+/* Store signal mask for the new process from ATTR in SIGMASK. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_getsigmask rpl_posix_spawnattr_getsigmask
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getsigmask (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getsigmask
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSIGMASK
+_GL_WARN_ON_USE (posix_spawnattr_getsigmask, "posix_spawnattr_getsigmask is unportable - "
+ "use gnulib module posix_spawnattr_getsigmask for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+/* Set signal mask for the new process in ATTR to SIGMASK. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_setsigmask rpl_posix_spawnattr_setsigmask
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setsigmask (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setsigmask
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSIGMASK
+_GL_WARN_ON_USE (posix_spawnattr_setsigmask, "posix_spawnattr_setsigmask is unportable - "
+ "use gnulib module posix_spawnattr_setsigmask for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+/* Get flag word from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_getflags rpl_posix_spawnattr_getflags
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getflags (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getflags
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETFLAGS
+_GL_WARN_ON_USE (posix_spawnattr_getflags, "posix_spawnattr_getflags is unportable - "
+ "use gnulib module posix_spawnattr_getflags for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+/* Store flags in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_setflags rpl_posix_spawnattr_setflags
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setflags (posix_spawnattr_t *__attr,
+ short int __flags)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setflags
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETFLAGS
+_GL_WARN_ON_USE (posix_spawnattr_setflags, "posix_spawnattr_setflags is unportable - "
+ "use gnulib module posix_spawnattr_setflags for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+/* Get process group ID from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_getpgroup rpl_posix_spawnattr_getpgroup
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getpgroup (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getpgroup
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETPGROUP
+_GL_WARN_ON_USE (posix_spawnattr_getpgroup, "posix_spawnattr_getpgroup is unportable - "
+ "use gnulib module posix_spawnattr_getpgroup for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+/* Store process group ID in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_setpgroup rpl_posix_spawnattr_setpgroup
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setpgroup (posix_spawnattr_t *__attr,
+ pid_t __pgroup)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setpgroup
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETPGROUP
+_GL_WARN_ON_USE (posix_spawnattr_setpgroup, "posix_spawnattr_setpgroup is unportable - "
+ "use gnulib module posix_spawnattr_setpgroup for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+/* Get scheduling policy from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_getschedpolicy rpl_posix_spawnattr_getschedpolicy
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getschedpolicy (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getschedpolicy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPOLICY
+_GL_WARN_ON_USE (posix_spawnattr_getschedpolicy, "posix_spawnattr_getschedpolicy is unportable - "
+ "use gnulib module posix_spawnattr_getschedpolicy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+/* Store scheduling policy in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_setschedpolicy rpl_posix_spawnattr_setschedpolicy
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setschedpolicy (posix_spawnattr_t *__attr,
+ int __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setschedpolicy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPOLICY
+_GL_WARN_ON_USE (posix_spawnattr_setschedpolicy, "posix_spawnattr_setschedpolicy is unportable - "
+ "use gnulib module posix_spawnattr_setschedpolicy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+/* Get scheduling parameters from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_getschedparam rpl_posix_spawnattr_getschedparam
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getschedparam (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getschedparam
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPARAM
+_GL_WARN_ON_USE (posix_spawnattr_getschedparam, "posix_spawnattr_getschedparam is unportable - "
+ "use gnulib module posix_spawnattr_getschedparam for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+/* Store scheduling parameters in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_setschedparam rpl_posix_spawnattr_setschedparam
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setschedparam (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setschedparam
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPARAM
+_GL_WARN_ON_USE (posix_spawnattr_setschedparam, "posix_spawnattr_setschedparam is unportable - "
+ "use gnulib module posix_spawnattr_setschedparam for portability");
+# endif
+#endif
+
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+/* Initialize data structure for file attribute for `spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawn_file_actions_init rpl_posix_spawn_file_actions_init
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_init (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_init
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_INIT
+_GL_WARN_ON_USE (posix_spawn_file_actions_init, "posix_spawn_file_actions_init is unportable - "
+ "use gnulib module posix_spawn_file_actions_init for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+/* Free resources associated with FILE-ACTIONS. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawn_file_actions_destroy rpl_posix_spawn_file_actions_destroy
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_destroy
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_DESTROY
+_GL_WARN_ON_USE (posix_spawn_file_actions_destroy, "posix_spawn_file_actions_destroy is unportable - "
+ "use gnulib module posix_spawn_file_actions_destroy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `open' for the given file during the `spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawn_file_actions_addopen rpl_posix_spawn_file_actions_addopen
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path,
+ int __oflag, mode_t __mode)
+ __THROW _GL_ARG_NONNULL ((1, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_addopen
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
+_GL_WARN_ON_USE (posix_spawn_file_actions_addopen, "posix_spawn_file_actions_addopen is unportable - "
+ "use gnulib module posix_spawn_file_actions_addopen for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `close' for the given file descriptor during the `spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawn_file_actions_addclose rpl_posix_spawn_file_actions_addclose
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *__file_actions,
+ int __fd)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_addclose
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
+_GL_WARN_ON_USE (posix_spawn_file_actions_addclose, "posix_spawn_file_actions_addclose is unportable - "
+ "use gnulib module posix_spawn_file_actions_addclose for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `dup2' for the given file descriptors during the `spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# define posix_spawn_file_actions_adddup2 rpl_posix_spawn_file_actions_adddup2
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd)
+ __THROW _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_adddup2
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+_GL_WARN_ON_USE (posix_spawn_file_actions_adddup2, "posix_spawn_file_actions_adddup2 is unportable - "
+ "use gnulib module posix_spawn_file_actions_adddup2 for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_SPAWN_H */
+#endif /* _GL_SPAWN_H */
diff --git a/gnulib/lib/spawn_faction_addclose.c b/gnulib/lib/spawn_faction_addclose.c
new file mode 100644
index 00000000..f89209f7
--- /dev/null
+++ b/gnulib/lib/spawn_faction_addclose.c
@@ -0,0 +1,59 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#include "spawn_int.h"
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `close' for the given file descriptor during the `spawn' call. */
+int
+posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *file_actions,
+ int fd)
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+ struct __spawn_action *rec;
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || fd >= maxfd)
+ return EBADF;
+
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ /* This can only mean we ran out of memory. */
+ return ENOMEM;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_close;
+ rec->action.open_action.fd = fd;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawn_faction_adddup2.c b/gnulib/lib/spawn_faction_adddup2.c
new file mode 100644
index 00000000..6ba9108b
--- /dev/null
+++ b/gnulib/lib/spawn_faction_adddup2.c
@@ -0,0 +1,60 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#include "spawn_int.h"
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `dup2' for the given file descriptors during the `spawn' call. */
+int
+posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *file_actions,
+ int fd, int newfd)
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+ struct __spawn_action *rec;
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || newfd < 0 || fd >= maxfd || newfd >= maxfd)
+ return EBADF;
+
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ /* This can only mean we ran out of memory. */
+ return ENOMEM;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_dup2;
+ rec->action.dup2_action.fd = fd;
+ rec->action.dup2_action.newfd = newfd;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawn_faction_addopen.c b/gnulib/lib/spawn_faction_addopen.c
new file mode 100644
index 00000000..231d4be3
--- /dev/null
+++ b/gnulib/lib/spawn_faction_addopen.c
@@ -0,0 +1,63 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#include "spawn_int.h"
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `open' for the given file during the `spawn' call. */
+int
+posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions,
+ int fd, const char *path, int oflag,
+ mode_t mode)
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+ struct __spawn_action *rec;
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || fd >= maxfd)
+ return EBADF;
+
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ /* This can only mean we ran out of memory. */
+ return ENOMEM;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_open;
+ rec->action.open_action.fd = fd;
+ rec->action.open_action.path = path;
+ rec->action.open_action.oflag = oflag;
+ rec->action.open_action.mode = mode;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawn_faction_destroy.c b/gnulib/lib/spawn_faction_destroy.c
new file mode 100644
index 00000000..d3b8251f
--- /dev/null
+++ b/gnulib/lib/spawn_faction_destroy.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <stdlib.h>
+
+/* Initialize data structure for file attribute for `spawn' call. */
+int
+posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *file_actions)
+{
+ /* Free the memory allocated. */
+ free (file_actions->_actions);
+ return 0;
+}
diff --git a/gnulib/lib/spawn_faction_init.c b/gnulib/lib/spawn_faction_init.c
new file mode 100644
index 00000000..b2d7540c
--- /dev/null
+++ b/gnulib/lib/spawn_faction_init.c
@@ -0,0 +1,56 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "spawn_int.h"
+
+
+/* Function used to increase the size of the allocated array. This
+ function is called from the `add'-functions. */
+int
+__posix_spawn_file_actions_realloc (posix_spawn_file_actions_t *file_actions)
+{
+ int newalloc = file_actions->_allocated + 8;
+ void *newmem = realloc (file_actions->_actions,
+ newalloc * sizeof (struct __spawn_action));
+
+ if (newmem == NULL)
+ /* Not enough memory. */
+ return ENOMEM;
+
+ file_actions->_actions = (struct __spawn_action *) newmem;
+ file_actions->_allocated = newalloc;
+
+ return 0;
+}
+
+
+/* Initialize data structure for file attribute for `spawn' call. */
+int
+posix_spawn_file_actions_init (posix_spawn_file_actions_t *file_actions)
+{
+ /* Simply clear all the elements. */
+ memset (file_actions, '\0', sizeof (*file_actions));
+ return 0;
+}
diff --git a/gnulib/lib/spawn_int.h b/gnulib/lib/spawn_int.h
new file mode 100644
index 00000000..e04da6bf
--- /dev/null
+++ b/gnulib/lib/spawn_int.h
@@ -0,0 +1,62 @@
+/* Copyright (C) 2000, 2008, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <sys/types.h>
+
+/* Data structure to contain the action information. */
+struct __spawn_action
+{
+ enum
+ {
+ spawn_do_close,
+ spawn_do_dup2,
+ spawn_do_open
+ } tag;
+
+ union
+ {
+ struct
+ {
+ int fd;
+ } close_action;
+ struct
+ {
+ int fd;
+ int newfd;
+ } dup2_action;
+ struct
+ {
+ int fd;
+ const char *path;
+ int oflag;
+ mode_t mode;
+ } open_action;
+ } action;
+};
+
+#if !_LIBC
+# define __posix_spawn_file_actions_realloc gl_posix_spawn_file_actions_realloc
+#endif
+extern int __posix_spawn_file_actions_realloc (posix_spawn_file_actions_t *
+ file_actions);
+
+#if !_LIBC
+# define __spawni gl_posix_spawn_internal
+#endif
+extern int __spawni (pid_t *pid, const char *path,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[], int use_path);
diff --git a/gnulib/lib/spawnattr_destroy.c b/gnulib/lib/spawnattr_destroy.c
new file mode 100644
index 00000000..896064d1
--- /dev/null
+++ b/gnulib/lib/spawnattr_destroy.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+/* Initialize data structure for file attribute for `spawn' call. */
+int
+posix_spawnattr_destroy (posix_spawnattr_t *attr)
+{
+ /* Nothing to do in the moment. */
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getdefault.c b/gnulib/lib/spawnattr_getdefault.c
new file mode 100644
index 00000000..529d59f7
--- /dev/null
+++ b/gnulib/lib/spawnattr_getdefault.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Store signal mask for signals with default handling from ATTR in
+ SIGDEFAULT. */
+int
+posix_spawnattr_getsigdefault (const posix_spawnattr_t *attr,
+ sigset_t *sigdefault)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (sigdefault, &attr->_sd, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getflags.c b/gnulib/lib/spawnattr_getflags.c
new file mode 100644
index 00000000..d4929f8d
--- /dev/null
+++ b/gnulib/lib/spawnattr_getflags.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Get flag word from the attribute structure. */
+int
+posix_spawnattr_getflags (const posix_spawnattr_t *attr, short int *flags)
+{
+ /* Copy the flag word. */
+ *flags = attr->_flags;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getpgroup.c b/gnulib/lib/spawnattr_getpgroup.c
new file mode 100644
index 00000000..71071aa7
--- /dev/null
+++ b/gnulib/lib/spawnattr_getpgroup.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Get process group ID from the attribute structure. */
+int
+posix_spawnattr_getpgroup (const posix_spawnattr_t *attr, pid_t *pgroup)
+{
+ /* Copy the process group ID. */
+ *pgroup = attr->_pgrp;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getschedparam.c b/gnulib/lib/spawnattr_getschedparam.c
new file mode 100644
index 00000000..4ac9c458
--- /dev/null
+++ b/gnulib/lib/spawnattr_getschedparam.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 2000, 2008, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+/* Get scheduling parameters from the attribute structure. */
+int
+posix_spawnattr_getschedparam (const posix_spawnattr_t *attr,
+ struct sched_param *schedparam)
+{
+ /* Copy the scheduling parameters. */
+ *schedparam = attr->_sp;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getschedpolicy.c b/gnulib/lib/spawnattr_getschedpolicy.c
new file mode 100644
index 00000000..c94a9320
--- /dev/null
+++ b/gnulib/lib/spawnattr_getschedpolicy.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Get scheduling policy from the attribute structure. */
+int
+posix_spawnattr_getschedpolicy (const posix_spawnattr_t *attr,
+ int *schedpolicy)
+{
+ /* Copy the scheduling policy. */
+ *schedpolicy = attr->_policy;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getsigmask.c b/gnulib/lib/spawnattr_getsigmask.c
new file mode 100644
index 00000000..9c40e7f3
--- /dev/null
+++ b/gnulib/lib/spawnattr_getsigmask.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Store signal mask for the new process from ATTR in SIGMASK. */
+int
+posix_spawnattr_getsigmask (const posix_spawnattr_t *attr,
+ sigset_t *sigmask)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (sigmask, &attr->_ss, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_init.c b/gnulib/lib/spawnattr_init.c
new file mode 100644
index 00000000..1441f3c3
--- /dev/null
+++ b/gnulib/lib/spawnattr_init.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Initialize data structure for file attribute for `spawn' call. */
+int
+posix_spawnattr_init (posix_spawnattr_t *attr)
+{
+ /* All elements have to be initialized to the default values which
+ is generally zero. */
+ memset (attr, '\0', sizeof (*attr));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setdefault.c b/gnulib/lib/spawnattr_setdefault.c
new file mode 100644
index 00000000..a364247b
--- /dev/null
+++ b/gnulib/lib/spawnattr_setdefault.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT. */
+int
+posix_spawnattr_setsigdefault (posix_spawnattr_t *attr,
+ const sigset_t *sigdefault)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (&attr->_sd, sigdefault, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setflags.c b/gnulib/lib/spawnattr_setflags.c
new file mode 100644
index 00000000..bd8a79ca
--- /dev/null
+++ b/gnulib/lib/spawnattr_setflags.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 2000, 2004, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <string.h>
+
+#define ALL_FLAGS (POSIX_SPAWN_RESETIDS \
+ | POSIX_SPAWN_SETPGROUP \
+ | POSIX_SPAWN_SETSIGDEF \
+ | POSIX_SPAWN_SETSIGMASK \
+ | POSIX_SPAWN_SETSCHEDPARAM \
+ | POSIX_SPAWN_SETSCHEDULER \
+ | POSIX_SPAWN_USEVFORK)
+
+/* Store flags in the attribute structure. */
+int
+posix_spawnattr_setflags (posix_spawnattr_t *attr, short int flags)
+{
+ /* Check no invalid bits are set. */
+ if (flags & ~ALL_FLAGS)
+ return EINVAL;
+
+ /* Store the flag word. */
+ attr->_flags = flags;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setpgroup.c b/gnulib/lib/spawnattr_setpgroup.c
new file mode 100644
index 00000000..a3584506
--- /dev/null
+++ b/gnulib/lib/spawnattr_setpgroup.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Store process group ID in the attribute structure. */
+int
+posix_spawnattr_setpgroup (posix_spawnattr_t *attr, pid_t pgroup)
+{
+ /* Store the process group ID. */
+ attr->_pgrp = pgroup;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setschedparam.c b/gnulib/lib/spawnattr_setschedparam.c
new file mode 100644
index 00000000..4e832c7e
--- /dev/null
+++ b/gnulib/lib/spawnattr_setschedparam.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+/* Store scheduling parameters in the attribute structure. */
+int
+posix_spawnattr_setschedparam (posix_spawnattr_t *attr,
+ const struct sched_param *schedparam)
+{
+ /* Store the scheduling parameters. */
+ attr->_sp = *schedparam;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setschedpolicy.c b/gnulib/lib/spawnattr_setschedpolicy.c
new file mode 100644
index 00000000..b12da4b5
--- /dev/null
+++ b/gnulib/lib/spawnattr_setschedpolicy.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+
+/* Store scheduling policy in the attribute structure. */
+int
+posix_spawnattr_setschedpolicy (posix_spawnattr_t *attr, int schedpolicy)
+{
+ if (schedpolicy != SCHED_OTHER && schedpolicy != SCHED_FIFO
+ && schedpolicy != SCHED_RR)
+ return EINVAL;
+
+ /* Store the policy. */
+ attr->_policy = schedpolicy;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setsigmask.c b/gnulib/lib/spawnattr_setsigmask.c
new file mode 100644
index 00000000..7c3f333c
--- /dev/null
+++ b/gnulib/lib/spawnattr_setsigmask.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Set signal mask for the new process in ATTR to SIGMASK. */
+int
+posix_spawnattr_setsigmask (posix_spawnattr_t *attr,
+ const sigset_t *sigmask)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (&attr->_ss, sigmask, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawni.c b/gnulib/lib/spawni.c
new file mode 100644
index 00000000..048d9cfc
--- /dev/null
+++ b/gnulib/lib/spawni.c
@@ -0,0 +1,374 @@
+/* Guts of POSIX spawn interface. Generic POSIX.1 version.
+ Copyright (C) 2000-2006, 2008-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+#include "spawn_int.h"
+
+#include <alloca.h>
+#include <errno.h>
+
+#include <fcntl.h>
+#ifndef O_LARGEFILE
+# define O_LARGEFILE 0
+#endif
+
+#if _LIBC || HAVE_PATHS_H
+# include <paths.h>
+#else
+# define _PATH_BSHELL "/bin/sh"
+#endif
+
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if _LIBC
+# include <not-cancel.h>
+#else
+# define close_not_cancel close
+# define open_not_cancel open
+#endif
+
+#if _LIBC
+# include <local-setxid.h>
+#else
+# if !HAVE_SETEUID
+# define seteuid(id) setresuid (-1, id, -1)
+# endif
+# if !HAVE_SETEGID
+# define setegid(id) setresgid (-1, id, -1)
+# endif
+# define local_seteuid(id) seteuid (id)
+# define local_setegid(id) setegid (id)
+#endif
+
+#if _LIBC
+# define alloca __alloca
+# define execve __execve
+# define dup2 __dup2
+# define fork __fork
+# define getgid __getgid
+# define getuid __getuid
+# define sched_setparam __sched_setparam
+# define sched_setscheduler __sched_setscheduler
+# define setpgid __setpgid
+# define sigaction __sigaction
+# define sigismember __sigismember
+# define sigprocmask __sigprocmask
+# define strchrnul __strchrnul
+# define vfork __vfork
+#else
+# undef internal_function
+# define internal_function /* empty */
+#endif
+
+
+/* The Unix standard contains a long explanation of the way to signal
+ an error after the fork() was successful. Since no new wait status
+ was wanted there is no way to signal an error using one of the
+ available methods. The committee chose to signal an error by a
+ normal program exit with the exit code 127. */
+#define SPAWN_ERROR 127
+
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Native Woe32 API. */
+int
+__spawni (pid_t *pid, const char *file,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[], int use_path)
+{
+ /* Not yet implemented. */
+ return ENOSYS;
+}
+
+#else
+
+
+/* The file is accessible but it is not an executable file. Invoke
+ the shell to interpret it as a script. */
+static void
+internal_function
+script_execute (const char *file, char *const argv[], char *const envp[])
+{
+ /* Count the arguments. */
+ int argc = 0;
+ while (argv[argc++])
+ ;
+
+ /* Construct an argument list for the shell. */
+ {
+ char **new_argv = (char **) alloca ((argc + 1) * sizeof (char *));
+ new_argv[0] = (char *) _PATH_BSHELL;
+ new_argv[1] = (char *) file;
+ while (argc > 1)
+ {
+ new_argv[argc] = argv[argc - 1];
+ --argc;
+ }
+
+ /* Execute the shell. */
+ execve (new_argv[0], new_argv, envp);
+ }
+}
+
+
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+__spawni (pid_t *pid, const char *file,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[], int use_path)
+{
+ pid_t new_pid;
+ char *path, *p, *name;
+ size_t len;
+ size_t pathlen;
+
+ /* Do this once. */
+ short int flags = attrp == NULL ? 0 : attrp->_flags;
+
+ /* Avoid gcc warning
+ "variable 'flags' might be clobbered by 'longjmp' or 'vfork'" */
+ (void) &flags;
+
+ /* Generate the new process. */
+#if HAVE_VFORK
+ if ((flags & POSIX_SPAWN_USEVFORK) != 0
+ /* If no major work is done, allow using vfork. Note that we
+ might perform the path searching. But this would be done by
+ a call to execvp(), too, and such a call must be OK according
+ to POSIX. */
+ || ((flags & (POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF
+ | POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER
+ | POSIX_SPAWN_SETPGROUP | POSIX_SPAWN_RESETIDS)) == 0
+ && file_actions == NULL))
+ new_pid = vfork ();
+ else
+#endif
+ new_pid = fork ();
+
+ if (new_pid != 0)
+ {
+ if (new_pid < 0)
+ return errno;
+
+ /* The call was successful. Store the PID if necessary. */
+ if (pid != NULL)
+ *pid = new_pid;
+
+ return 0;
+ }
+
+ /* Set signal mask. */
+ if ((flags & POSIX_SPAWN_SETSIGMASK) != 0
+ && sigprocmask (SIG_SETMASK, &attrp->_ss, NULL) != 0)
+ _exit (SPAWN_ERROR);
+
+ /* Set signal default action. */
+ if ((flags & POSIX_SPAWN_SETSIGDEF) != 0)
+ {
+ /* We have to iterate over all signals. This could possibly be
+ done better but it requires system specific solutions since
+ the sigset_t data type can be very different on different
+ architectures. */
+ int sig;
+ struct sigaction sa;
+
+ memset (&sa, '\0', sizeof (sa));
+ sa.sa_handler = SIG_DFL;
+
+ for (sig = 1; sig <= NSIG; ++sig)
+ if (sigismember (&attrp->_sd, sig) != 0
+ && sigaction (sig, &sa, NULL) != 0)
+ _exit (SPAWN_ERROR);
+
+ }
+
+#if (_LIBC ? defined _POSIX_PRIORITY_SCHEDULING : HAVE_SCHED_SETPARAM && HAVE_SCHED_SETSCHEDULER)
+ /* Set the scheduling algorithm and parameters. */
+ if ((flags & (POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER))
+ == POSIX_SPAWN_SETSCHEDPARAM)
+ {
+ if (sched_setparam (0, &attrp->_sp) == -1)
+ _exit (SPAWN_ERROR);
+ }
+ else if ((flags & POSIX_SPAWN_SETSCHEDULER) != 0)
+ {
+ if (sched_setscheduler (0, attrp->_policy,
+ (flags & POSIX_SPAWN_SETSCHEDPARAM) != 0
+ ? &attrp->_sp : NULL) == -1)
+ _exit (SPAWN_ERROR);
+ }
+#endif
+
+ /* Set the process group ID. */
+ if ((flags & POSIX_SPAWN_SETPGROUP) != 0
+ && setpgid (0, attrp->_pgrp) != 0)
+ _exit (SPAWN_ERROR);
+
+ /* Set the effective user and group IDs. */
+ if ((flags & POSIX_SPAWN_RESETIDS) != 0
+ && (local_seteuid (getuid ()) != 0
+ || local_setegid (getgid ()) != 0))
+ _exit (SPAWN_ERROR);
+
+ /* Execute the file actions. */
+ if (file_actions != NULL)
+ {
+ int cnt;
+
+ for (cnt = 0; cnt < file_actions->_used; ++cnt)
+ {
+ struct __spawn_action *action = &file_actions->_actions[cnt];
+
+ switch (action->tag)
+ {
+ case spawn_do_close:
+ if (close_not_cancel (action->action.close_action.fd) != 0)
+ /* Signal the error. */
+ _exit (SPAWN_ERROR);
+ break;
+
+ case spawn_do_open:
+ {
+ int new_fd = open_not_cancel (action->action.open_action.path,
+ action->action.open_action.oflag
+ | O_LARGEFILE,
+ action->action.open_action.mode);
+
+ if (new_fd == -1)
+ /* The `open' call failed. */
+ _exit (SPAWN_ERROR);
+
+ /* Make sure the desired file descriptor is used. */
+ if (new_fd != action->action.open_action.fd)
+ {
+ if (dup2 (new_fd, action->action.open_action.fd)
+ != action->action.open_action.fd)
+ /* The `dup2' call failed. */
+ _exit (SPAWN_ERROR);
+
+ if (close_not_cancel (new_fd) != 0)
+ /* The `close' call failed. */
+ _exit (SPAWN_ERROR);
+ }
+ }
+ break;
+
+ case spawn_do_dup2:
+ if (dup2 (action->action.dup2_action.fd,
+ action->action.dup2_action.newfd)
+ != action->action.dup2_action.newfd)
+ /* The `dup2' call failed. */
+ _exit (SPAWN_ERROR);
+ break;
+ }
+ }
+ }
+
+ if (! use_path || strchr (file, '/') != NULL)
+ {
+ /* The FILE parameter is actually a path. */
+ execve (file, argv, envp);
+
+ if (errno == ENOEXEC)
+ script_execute (file, argv, envp);
+
+ /* Oh, oh. `execve' returns. This is bad. */
+ _exit (SPAWN_ERROR);
+ }
+
+ /* We have to search for FILE on the path. */
+ path = getenv ("PATH");
+ if (path == NULL)
+ {
+#if HAVE_CONFSTR
+ /* There is no `PATH' in the environment.
+ The default search path is the current directory
+ followed by the path `confstr' returns for `_CS_PATH'. */
+ len = confstr (_CS_PATH, (char *) NULL, 0);
+ path = (char *) alloca (1 + len);
+ path[0] = ':';
+ (void) confstr (_CS_PATH, path + 1, len);
+#else
+ /* Pretend that the PATH contains only the current directory. */
+ path = "";
+#endif
+ }
+
+ len = strlen (file) + 1;
+ pathlen = strlen (path);
+ name = alloca (pathlen + len + 1);
+ /* Copy the file name at the top. */
+ name = (char *) memcpy (name + pathlen + 1, file, len);
+ /* And add the slash. */
+ *--name = '/';
+
+ p = path;
+ do
+ {
+ char *startp;
+
+ path = p;
+ p = strchrnul (path, ':');
+
+ if (p == path)
+ /* Two adjacent colons, or a colon at the beginning or the end
+ of `PATH' means to search the current directory. */
+ startp = name + 1;
+ else
+ startp = (char *) memcpy (name - (p - path), path, p - path);
+
+ /* Try to execute this name. If it works, execv will not return. */
+ execve (startp, argv, envp);
+
+ if (errno == ENOEXEC)
+ script_execute (startp, argv, envp);
+
+ switch (errno)
+ {
+ case EACCES:
+ case ENOENT:
+ case ESTALE:
+ case ENOTDIR:
+ /* Those errors indicate the file is missing or not executable
+ by us, in which case we want to just try the next path
+ directory. */
+ break;
+
+ default:
+ /* Some other error means we found an executable file, but
+ something went wrong executing it; return the error to our
+ caller. */
+ _exit (SPAWN_ERROR);
+ }
+ }
+ while (*p++ != '\0');
+
+ /* Return with an error. */
+ _exit (SPAWN_ERROR);
+}
+
+#endif
diff --git a/gnulib/lib/spawnp.c b/gnulib/lib/spawnp.c
new file mode 100644
index 00000000..e7d28bf2
--- /dev/null
+++ b/gnulib/lib/spawnp.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include "spawn_int.h"
+
+/* Spawn a new process executing FILE with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+posix_spawnp (pid_t *pid, const char *file,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[])
+{
+ return __spawni (pid, file, file_actions, attrp, argv, envp, 1);
+}
diff --git a/gnulib/lib/sprintf.c b/gnulib/lib/sprintf.c
new file mode 100644
index 00000000..c01d191f
--- /dev/null
+++ b/gnulib/lib/sprintf.c
@@ -0,0 +1,80 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "vasnprintf.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* Print formatted output to string STR.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+sprintf (char *str, const char *format, ...)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf;
+ va_list args;
+
+ /* vasnprintf fails with EOVERFLOW when the buffer size argument is larger
+ than INT_MAX (if that fits into a 'size_t' at all).
+ Also note that glibc's iconv fails with E2BIG when we pass a length that
+ is so large that str + lenbuf wraps around, i.e.
+ (uintptr_t) (str + lenbuf) < (uintptr_t) str.
+ Therefore set lenbuf = min (SIZE_MAX, INT_MAX, - (uintptr_t) str - 1). */
+ lenbuf = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX);
+ if (lenbuf > ~ (uintptr_t) str)
+ lenbuf = ~ (uintptr_t) str;
+
+ va_start (args, format);
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ /* len is near SIZE_MAX. */
+ free (output);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/sqrtl.c b/gnulib/lib/sqrtl.c
new file mode 100644
index 00000000..8c492f2b
--- /dev/null
+++ b/gnulib/lib/sqrtl.c
@@ -0,0 +1,59 @@
+/* Emulation for sqrtl.
+ Contributed by Paolo Bonzini
+
+ Copyright 2002, 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+/* A simple Newton-Raphson method. */
+long double
+sqrtl(long double x)
+{
+ long double delta, y;
+ int exponent;
+
+ /* Check for NaN */
+ if (isnanl (x))
+ return x;
+
+ /* Check for negative numbers */
+ if (x < 0.0L)
+ return (long double) sqrt(-1);
+
+ /* Check for zero and infinites */
+ if (x + x == x)
+ return x;
+
+ frexpl (x, &exponent);
+ y = ldexpl (x, -exponent / 2);
+
+ do
+ {
+ delta = y;
+ y = (y + x / y) * 0.5L;
+ delta -= y;
+ }
+ while (delta != 0.0L);
+
+ return y;
+}
diff --git a/gnulib/lib/stat-macros.h b/gnulib/lib/stat-macros.h
new file mode 100644
index 00000000..690216c7
--- /dev/null
+++ b/gnulib/lib/stat-macros.h
@@ -0,0 +1,3 @@
+/* All the mode bits that can be affected by chmod. */
+#define CHMOD_MODE_BITS \
+ (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)
diff --git a/gnulib/lib/stat-time.h b/gnulib/lib/stat-time.h
new file mode 100644
index 00000000..16300485
--- /dev/null
+++ b/gnulib/lib/stat-time.h
@@ -0,0 +1,187 @@
+/* stat-related time functions.
+
+ Copyright (C) 2005, 2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef STAT_TIME_H
+#define STAT_TIME_H 1
+
+#include <sys/stat.h>
+#include <time.h>
+
+/* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type
+ struct timespec, if available. If not, then STAT_TIMESPEC_NS (ST,
+ ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST,
+ if available. ST_XTIM can be st_atim, st_ctim, st_mtim, or st_birthtim
+ for access, status change, data modification, or birth (creation)
+ time respectively.
+
+ These macros are private to stat-time.h. */
+#if defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
+# ifdef TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC
+# define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim)
+# else
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.tv_nsec)
+# endif
+#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
+# define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim##espec)
+#elif defined HAVE_STRUCT_STAT_ST_ATIMENSEC
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim##ensec)
+#elif defined HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.st__tim.tv_nsec)
+#endif
+
+/* Return the nanosecond component of *ST's access time. */
+static inline long int
+get_stat_atime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_atim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_atim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's status change time. */
+static inline long int
+get_stat_ctime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_ctim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_ctim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's data modification time. */
+static inline long int
+get_stat_mtime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_mtim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_mtim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's birth time. */
+static inline long int
+get_stat_birthtime_ns (struct stat const *st)
+{
+# if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
+ return STAT_TIMESPEC (st, st_birthtim).tv_nsec;
+# elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
+ return STAT_TIMESPEC_NS (st, st_birthtim);
+# else
+ /* Avoid a "parameter unused" warning. */
+ (void) st;
+ return 0;
+# endif
+}
+
+/* Return *ST's access time. */
+static inline struct timespec
+get_stat_atime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_atim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_atime;
+ t.tv_nsec = get_stat_atime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's status change time. */
+static inline struct timespec
+get_stat_ctime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_ctim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_ctime;
+ t.tv_nsec = get_stat_ctime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's data modification time. */
+static inline struct timespec
+get_stat_mtime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_mtim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_mtime;
+ t.tv_nsec = get_stat_mtime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's birth time, if available; otherwise return a value
+ with negative tv_nsec. */
+static inline struct timespec
+get_stat_birthtime (struct stat const *st)
+{
+ struct timespec t;
+
+#if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC)
+ t = STAT_TIMESPEC (st, st_birthtim);
+#elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
+ t.tv_sec = st->st_birthtime;
+ t.tv_nsec = st->st_birthtimensec;
+#elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Woe32 native platforms (but not Cygwin) put the "file creation
+ time" in st_ctime (!). See
+ <http://msdn2.microsoft.com/de-de/library/14h5k7ff(VS.80).aspx>. */
+ t.tv_sec = st->st_ctime;
+ t.tv_nsec = 0;
+#else
+ /* Birth time is not supported. Set tv_sec to avoid undefined behavior. */
+ t.tv_sec = -1;
+ t.tv_nsec = -1;
+ /* Avoid a "parameter unused" warning. */
+ (void) st;
+#endif
+
+#if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC)
+ /* FreeBSD and NetBSD sometimes signal the absence of knowledge by
+ using zero. Attempt to work around this problem. Alas, this can
+ report failure even for valid time stamps. Also, NetBSD
+ sometimes returns junk in the birth time fields; work around this
+ bug if it it is detected. There's no need to detect negative
+ tv_nsec junk as negative tv_nsec already indicates an error. */
+ if (t.tv_sec == 0 || 1000000000 <= t.tv_nsec)
+ t.tv_nsec = -1;
+#endif
+
+ return t;
+}
+
+#endif
diff --git a/gnulib/lib/stat.c b/gnulib/lib/stat.c
new file mode 100644
index 00000000..875317bf
--- /dev/null
+++ b/gnulib/lib/stat.c
@@ -0,0 +1,104 @@
+/* Work around platform bugs in stat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+/* Get the original definition of stat. It might be defined as a macro. */
+#define __need_system_sys_stat_h
+#include <sys/types.h>
+#include <sys/stat.h>
+#undef __need_system_sys_stat_h
+
+static inline int
+orig_stat (const char *filename, struct stat *buf)
+{
+ return stat (filename, buf);
+}
+
+/* Specification. */
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <string.h>
+
+/* Store information about NAME into ST. Work around bugs with
+ trailing slashes. Mingw has other bugs (such as st_ino always
+ being 0 on success) which this wrapper does not work around. But
+ at least this implementation provides the ability to emulate fchdir
+ correctly. */
+
+int
+rpl_stat (char const *name, struct stat *st)
+{
+ int result = orig_stat (name, st);
+#if REPLACE_FUNC_STAT_FILE
+ /* Solaris 9 mistakenly succeeds when given a non-directory with a
+ trailing slash. */
+ if (result == 0 && !S_ISDIR (st->st_mode))
+ {
+ size_t len = strlen (name);
+ if (ISSLASH (name[len - 1]))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+#endif /* REPLACE_FUNC_STAT_FILE */
+#if REPLACE_FUNC_STAT_DIR
+ if (result == -1 && errno == ENOENT)
+ {
+ /* Due to mingw's oddities, there are some directories (like
+ c:\) where stat() only succeeds with a trailing slash, and
+ other directories (like c:\windows) where stat() only
+ succeeds without a trailing slash. But we want the two to be
+ synonymous, since chdir() manages either style. Likewise, Mingw also
+ reports ENOENT for names longer than PATH_MAX, when we want
+ ENAMETOOLONG, and for stat("file/"), when we want ENOTDIR.
+ Fortunately, mingw PATH_MAX is small enough for stack
+ allocation. */
+ char fixed_name[PATH_MAX + 1] = {0};
+ size_t len = strlen (name);
+ bool check_dir = false;
+ if (PATH_MAX <= len)
+ errno = ENAMETOOLONG;
+ else if (len)
+ {
+ strcpy (fixed_name, name);
+ if (ISSLASH (fixed_name[len - 1]))
+ {
+ check_dir = true;
+ while (len && ISSLASH (fixed_name[len - 1]))
+ fixed_name[--len] = '\0';
+ if (!len)
+ fixed_name[0] = '/';
+ }
+ else
+ fixed_name[len++] = '/';
+ result = orig_stat (fixed_name, st);
+ if (result == 0 && check_dir && !S_ISDIR (st->st_mode))
+ {
+ result = -1;
+ errno = ENOTDIR;
+ }
+ }
+ }
+#endif /* REPLACE_FUNC_STAT_DIR */
+ return result;
+}
diff --git a/gnulib/lib/stdarg.in.h b/gnulib/lib/stdarg.in.h
new file mode 100644
index 00000000..9a8d0293
--- /dev/null
+++ b/gnulib/lib/stdarg.in.h
@@ -0,0 +1,35 @@
+/* Substitute for and wrapper around <stdarg.h>.
+ Copyright (C) 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_STDARG_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDARG_H@
+
+#ifndef _GL_STDARG_H
+#define _GL_STDARG_H
+
+#ifndef va_copy
+# define va_copy(a,b) ((a) = (b))
+#endif
+
+#endif /* _GL_STDARG_H */
+#endif /* _GL_STDARG_H */
diff --git a/gnulib/lib/stdbool.in.h b/gnulib/lib/stdbool.in.h
new file mode 100644
index 00000000..881faf3c
--- /dev/null
+++ b/gnulib/lib/stdbool.in.h
@@ -0,0 +1,119 @@
+/* Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_STDBOOL_H
+#define _GL_STDBOOL_H
+
+/* ISO C 99 <stdbool.h> for platforms that lack it. */
+
+/* Usage suggestions:
+
+ Programs that use <stdbool.h> should be aware of some limitations
+ and standards compliance issues.
+
+ Standards compliance:
+
+ - <stdbool.h> must be #included before 'bool', 'false', 'true'
+ can be used.
+
+ - You cannot assume that sizeof (bool) == 1.
+
+ - Programs should not undefine the macros bool, true, and false,
+ as C99 lists that as an "obsolescent feature".
+
+ Limitations of this substitute, when used in a C89 environment:
+
+ - <stdbool.h> must be #included before the '_Bool' type can be used.
+
+ - You cannot assume that _Bool is a typedef; it might be a macro.
+
+ - Bit-fields of type 'bool' are not supported. Portable code
+ should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
+
+ - In C99, casts and automatic conversions to '_Bool' or 'bool' are
+ performed in such a way that every nonzero value gets converted
+ to 'true', and zero gets converted to 'false'. This doesn't work
+ with this substitute. With this substitute, only the values 0 and 1
+ give the expected result when converted to _Bool' or 'bool'.
+
+ Also, it is suggested that programs use 'bool' rather than '_Bool';
+ this isn't required, but 'bool' is more common. */
+
+
+/* 7.16. Boolean type and values */
+
+/* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
+ definitions below, but temporarily we have to #undef them. */
+#if defined __BEOS__ && !defined __HAIKU__
+# include <OS.h> /* defines bool but not _Bool */
+# undef false
+# undef true
+#endif
+
+/* For the sake of symbolic names in gdb, we define true and false as
+ enum constants, not only as macros.
+ It is tempting to write
+ typedef enum { false = 0, true = 1 } _Bool;
+ so that gdb prints values of type 'bool' symbolically. But if we do
+ this, values of type '_Bool' may promote to 'int' or 'unsigned int'
+ (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
+ (see ISO C 99 6.3.1.1.(2)). So we add a negative value to the
+ enum; this ensures that '_Bool' promotes to 'int'. */
+#if defined __cplusplus || (defined __BEOS__ && !defined __HAIKU__)
+ /* A compiler known to have 'bool'. */
+ /* If the compiler already has both 'bool' and '_Bool', we can assume they
+ are the same types. */
+# if !@HAVE__BOOL@
+typedef bool _Bool;
+# endif
+#else
+# if !defined __GNUC__
+ /* If @HAVE__BOOL@:
+ Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
+ the built-in _Bool type is used. See
+ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
+ Similar bugs are likely with other compilers as well; this file
+ wouldn't be used if <stdbool.h> was working.
+ So we override the _Bool type.
+ If !@HAVE__BOOL@:
+ Need to define _Bool ourselves. As 'signed char' or as an enum type?
+ Use of a typedef, with SunPRO C, leads to a stupid
+ "warning: _Bool is a keyword in ISO C99".
+ Use of an enum type, with IRIX cc, leads to a stupid
+ "warning(1185): enumerated type mixed with another type".
+ Even the existence of an enum type, without a typedef,
+ "Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
+ The only benefit of the enum, debuggability, is not important
+ with these compilers. So use 'signed char' and no enum. */
+# define _Bool signed char
+# else
+ /* With this compiler, trust the _Bool type if the compiler has it. */
+# if !@HAVE__BOOL@
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+# endif
+# endif
+#endif
+#define bool _Bool
+
+/* The other macros must be usable in preprocessor directives. */
+#define false 0
+#define true 1
+#define __bool_true_false_are_defined 1
+
+#endif /* _GL_STDBOOL_H */
diff --git a/gnulib/lib/stddef.in.h b/gnulib/lib/stddef.in.h
new file mode 100644
index 00000000..4bfd8668
--- /dev/null
+++ b/gnulib/lib/stddef.in.h
@@ -0,0 +1,86 @@
+/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
+
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake. */
+
+/*
+ * POSIX 2008 <stddef.h> for platforms that have issues.
+ * <http://www.opengroup.org/susv3xbd/stddef.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if defined __need_wchar_t || defined __need_size_t \
+ || defined __need_ptrdiff_t || defined __need_NULL \
+ || defined __need_wint_t
+/* Special invocation convention inside gcc header files. In
+ particular, gcc provides a version of <stddef.h> that blindly
+ redefines NULL even when __need_wint_t was defined, even though
+ wint_t is not normally provided by <stddef.h>. Hence, we must
+ remember if special invocation has ever been used to obtain wint_t,
+ in which case we need to clean up NULL yet again. */
+
+# if !(defined _GL_STDDEF_H && defined _GL_STDDEF_WINT_T)
+# ifdef __need_wint_t
+# undef _GL_STDDEF_H
+# define _GL_STDDEF_WINT_T
+# endif
+# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+# endif
+
+#else
+/* Normal invocation convention. */
+
+# ifndef _GL_STDDEF_H
+
+/* The include_next requires a split double-inclusion guard. */
+
+# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+
+# ifndef _GL_STDDEF_H
+# define _GL_STDDEF_H
+
+/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
+#if @REPLACE_NULL@
+# undef NULL
+# ifdef __cplusplus
+ /* ISO C++ says that the macro NULL must expand to an integer constant
+ expression, hence '((void *) 0)' is not allowed in C++. */
+# if __GNUG__ >= 3
+ /* GNU C++ has a __null macro that behaves like an integer ('int' or
+ 'long') but has the same size as a pointer. Use that, to avoid
+ warnings. */
+# define NULL __null
+# else
+# define NULL 0L
+# endif
+# else
+# define NULL ((void *) 0)
+# endif
+#endif
+
+/* Some platforms lack wchar_t. */
+#if !@HAVE_WCHAR_T@
+# define wchar_t int
+#endif
+
+# endif /* _GL_STDDEF_H */
+# endif /* _GL_STDDEF_H */
+#endif /* __need_XXX */
diff --git a/gnulib/lib/stdint.in.h b/gnulib/lib/stdint.in.h
new file mode 100644
index 00000000..3e8ba977
--- /dev/null
+++ b/gnulib/lib/stdint.in.h
@@ -0,0 +1,567 @@
+/* Copyright (C) 2001-2002, 2004-2010 Free Software Foundation, Inc.
+ Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
+ This file is part of gnulib.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/*
+ * ISO C 99 <stdint.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/stdint.h.html>
+ */
+
+#ifndef _GL_STDINT_H
+
+/* When including a system file that in turn includes <inttypes.h>,
+ use the system <inttypes.h>, not our substitute. This avoids
+ problems with (for example) VMS, whose <sys/bitypes.h> includes
+ <inttypes.h>. */
+#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* Get those types that are already defined in other system include
+ files, so that we can "#define int8_t signed char" below without
+ worrying about a later system include file containing a "typedef
+ signed char int8_t;" that will get messed up by our macro. Our
+ macros should all be consistent with the system versions, except
+ for the "fast" types and macros, which we recommend against using
+ in public interfaces due to compiler differences. */
+
+#if @HAVE_STDINT_H@
+# if defined __sgi && ! defined __c99
+ /* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users
+ with "This header file is to be used only for c99 mode compilations"
+ diagnostics. */
+# define __STDINT_H__
+# endif
+ /* Other systems may have an incomplete or buggy <stdint.h>.
+ Include it before <inttypes.h>, since any "#include <stdint.h>"
+ in <inttypes.h> would reinclude us, skipping our contents because
+ _GL_STDINT_H is defined.
+ The include_next requires a split double-inclusion guard. */
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#endif
+
+#if ! defined _GL_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+#define _GL_STDINT_H
+
+/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
+ IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
+ AIX 5.2 <sys/types.h> isn't needed and causes troubles.
+ MacOS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
+ relies on the system <stdint.h> definitions, so include
+ <sys/types.h> after @NEXT_STDINT_H@. */
+#if @HAVE_SYS_TYPES_H@ && ! defined _AIX
+# include <sys/types.h>
+#endif
+
+/* Get LONG_MIN, LONG_MAX, ULONG_MAX. */
+#include <limits.h>
+
+#if @HAVE_INTTYPES_H@
+ /* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines
+ int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__.
+ <inttypes.h> also defines intptr_t and uintptr_t. */
+# include <inttypes.h>
+#elif @HAVE_SYS_INTTYPES_H@
+ /* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and
+ the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */
+# include <sys/inttypes.h>
+#endif
+
+#if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__
+ /* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines
+ int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is
+ included by <sys/types.h>. */
+# include <sys/bitypes.h>
+#endif
+
+#undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* Minimum and maximum values for a integer type under the usual assumption.
+ Return an unspecified value if BITS == 0, adding a check to pacify
+ picky compilers. */
+
+#define _STDINT_MIN(signed, bits, zero) \
+ ((signed) ? (- ((zero) + 1) << ((bits) ? (bits) - 1 : 0)) : (zero))
+
+#define _STDINT_MAX(signed, bits, zero) \
+ ((signed) \
+ ? ~ _STDINT_MIN (signed, bits, zero) \
+ : /* The expression for the unsigned case. The subtraction of (signed) \
+ is a nop in the unsigned case and avoids "signed integer overflow" \
+ warnings in the signed case. */ \
+ ((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
+
+/* 7.18.1.1. Exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. */
+
+#undef int8_t
+#undef uint8_t
+typedef signed char gl_int8_t;
+typedef unsigned char gl_uint8_t;
+#define int8_t gl_int8_t
+#define uint8_t gl_uint8_t
+
+#undef int16_t
+#undef uint16_t
+typedef short int gl_int16_t;
+typedef unsigned short int gl_uint16_t;
+#define int16_t gl_int16_t
+#define uint16_t gl_uint16_t
+
+#undef int32_t
+#undef uint32_t
+typedef int gl_int32_t;
+typedef unsigned int gl_uint32_t;
+#define int32_t gl_int32_t
+#define uint32_t gl_uint32_t
+
+/* Do not undefine int64_t if gnulib is not being used with 64-bit
+ types, since otherwise it breaks platforms like Tandem/NSK. */
+#if LONG_MAX >> 31 >> 31 == 1
+# undef int64_t
+typedef long int gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+#elif defined _MSC_VER
+# undef int64_t
+typedef __int64 gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+#elif @HAVE_LONG_LONG_INT@
+# undef int64_t
+typedef long long int gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+#endif
+
+#if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# undef uint64_t
+typedef unsigned long int gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+#elif defined _MSC_VER
+# undef uint64_t
+typedef unsigned __int64 gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+#elif @HAVE_UNSIGNED_LONG_LONG_INT@
+# undef uint64_t
+typedef unsigned long long int gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+#endif
+
+/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */
+#define _UINT8_T
+#define _UINT32_T
+#define _UINT64_T
+
+
+/* 7.18.1.2. Minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+ are the same as the corresponding N_t types. */
+
+#undef int_least8_t
+#undef uint_least8_t
+#undef int_least16_t
+#undef uint_least16_t
+#undef int_least32_t
+#undef uint_least32_t
+#undef int_least64_t
+#undef uint_least64_t
+#define int_least8_t int8_t
+#define uint_least8_t uint8_t
+#define int_least16_t int16_t
+#define uint_least16_t uint16_t
+#define int_least32_t int32_t
+#define uint_least32_t uint32_t
+#ifdef GL_INT64_T
+# define int_least64_t int64_t
+#endif
+#ifdef GL_UINT64_T
+# define uint_least64_t uint64_t
+#endif
+
+/* 7.18.1.3. Fastest minimum-width integer types */
+
+/* Note: Other <stdint.h> substitutes may define these types differently.
+ It is not recommended to use these types in public header files. */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+ are taken from the same list of types. Assume that 'long int'
+ is fast enough for all narrower integers. */
+
+#undef int_fast8_t
+#undef uint_fast8_t
+#undef int_fast16_t
+#undef uint_fast16_t
+#undef int_fast32_t
+#undef uint_fast32_t
+#undef int_fast64_t
+#undef uint_fast64_t
+typedef long int gl_int_fast8_t;
+typedef unsigned long int gl_uint_fast8_t;
+typedef long int gl_int_fast16_t;
+typedef unsigned long int gl_uint_fast16_t;
+typedef long int gl_int_fast32_t;
+typedef unsigned long int gl_uint_fast32_t;
+#define int_fast8_t gl_int_fast8_t
+#define uint_fast8_t gl_uint_fast8_t
+#define int_fast16_t gl_int_fast16_t
+#define uint_fast16_t gl_uint_fast16_t
+#define int_fast32_t gl_int_fast32_t
+#define uint_fast32_t gl_uint_fast32_t
+#ifdef GL_INT64_T
+# define int_fast64_t int64_t
+#endif
+#ifdef GL_UINT64_T
+# define uint_fast64_t uint64_t
+#endif
+
+/* 7.18.1.4. Integer types capable of holding object pointers */
+
+#undef intptr_t
+#undef uintptr_t
+typedef long int gl_intptr_t;
+typedef unsigned long int gl_uintptr_t;
+#define intptr_t gl_intptr_t
+#define uintptr_t gl_uintptr_t
+
+/* 7.18.1.5. Greatest-width integer types */
+
+/* Note: These types are compiler dependent. It may be unwise to use them in
+ public header files. */
+
+#undef intmax_t
+#if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+typedef long long int gl_intmax_t;
+# define intmax_t gl_intmax_t
+#elif defined GL_INT64_T
+# define intmax_t int64_t
+#else
+typedef long int gl_intmax_t;
+# define intmax_t gl_intmax_t
+#endif
+
+#undef uintmax_t
+#if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+typedef unsigned long long int gl_uintmax_t;
+# define uintmax_t gl_uintmax_t
+#elif defined GL_UINT64_T
+# define uintmax_t uint64_t
+#else
+typedef unsigned long int gl_uintmax_t;
+# define uintmax_t gl_uintmax_t
+#endif
+
+/* Verify that intmax_t and uintmax_t have the same size. Too much code
+ breaks if this is not the case. If this check fails, the reason is likely
+ to be found in the autoconf macros. */
+typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) - 1];
+
+/* 7.18.2. Limits of specified-width integer types */
+
+#if ! defined __cplusplus || defined __STDC_LIMIT_MACROS
+
+/* 7.18.2.1. Limits of exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. */
+
+#undef INT8_MIN
+#undef INT8_MAX
+#undef UINT8_MAX
+#define INT8_MIN (~ INT8_MAX)
+#define INT8_MAX 127
+#define UINT8_MAX 255
+
+#undef INT16_MIN
+#undef INT16_MAX
+#undef UINT16_MAX
+#define INT16_MIN (~ INT16_MAX)
+#define INT16_MAX 32767
+#define UINT16_MAX 65535
+
+#undef INT32_MIN
+#undef INT32_MAX
+#undef UINT32_MAX
+#define INT32_MIN (~ INT32_MAX)
+#define INT32_MAX 2147483647
+#define UINT32_MAX 4294967295U
+
+#undef INT64_MIN
+#undef INT64_MAX
+#ifdef GL_INT64_T
+/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
+ evaluates the latter incorrectly in preprocessor expressions. */
+# define INT64_MIN (- INTMAX_C (1) << 63)
+# define INT64_MAX INTMAX_C (9223372036854775807)
+#endif
+
+#undef UINT64_MAX
+#ifdef GL_UINT64_T
+# define UINT64_MAX UINTMAX_C (18446744073709551615)
+#endif
+
+/* 7.18.2.2. Limits of minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+ are the same as the corresponding N_t types. */
+
+#undef INT_LEAST8_MIN
+#undef INT_LEAST8_MAX
+#undef UINT_LEAST8_MAX
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_LEAST8_MAX INT8_MAX
+#define UINT_LEAST8_MAX UINT8_MAX
+
+#undef INT_LEAST16_MIN
+#undef INT_LEAST16_MAX
+#undef UINT_LEAST16_MAX
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST16_MAX INT16_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+
+#undef INT_LEAST32_MIN
+#undef INT_LEAST32_MAX
+#undef UINT_LEAST32_MAX
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST32_MAX INT32_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+
+#undef INT_LEAST64_MIN
+#undef INT_LEAST64_MAX
+#ifdef GL_INT64_T
+# define INT_LEAST64_MIN INT64_MIN
+# define INT_LEAST64_MAX INT64_MAX
+#endif
+
+#undef UINT_LEAST64_MAX
+#ifdef GL_UINT64_T
+# define UINT_LEAST64_MAX UINT64_MAX
+#endif
+
+/* 7.18.2.3. Limits of fastest minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+ are taken from the same list of types. */
+
+#undef INT_FAST8_MIN
+#undef INT_FAST8_MAX
+#undef UINT_FAST8_MAX
+#define INT_FAST8_MIN LONG_MIN
+#define INT_FAST8_MAX LONG_MAX
+#define UINT_FAST8_MAX ULONG_MAX
+
+#undef INT_FAST16_MIN
+#undef INT_FAST16_MAX
+#undef UINT_FAST16_MAX
+#define INT_FAST16_MIN LONG_MIN
+#define INT_FAST16_MAX LONG_MAX
+#define UINT_FAST16_MAX ULONG_MAX
+
+#undef INT_FAST32_MIN
+#undef INT_FAST32_MAX
+#undef UINT_FAST32_MAX
+#define INT_FAST32_MIN LONG_MIN
+#define INT_FAST32_MAX LONG_MAX
+#define UINT_FAST32_MAX ULONG_MAX
+
+#undef INT_FAST64_MIN
+#undef INT_FAST64_MAX
+#ifdef GL_INT64_T
+# define INT_FAST64_MIN INT64_MIN
+# define INT_FAST64_MAX INT64_MAX
+#endif
+
+#undef UINT_FAST64_MAX
+#ifdef GL_UINT64_T
+# define UINT_FAST64_MAX UINT64_MAX
+#endif
+
+/* 7.18.2.4. Limits of integer types capable of holding object pointers */
+
+#undef INTPTR_MIN
+#undef INTPTR_MAX
+#undef UINTPTR_MAX
+#define INTPTR_MIN LONG_MIN
+#define INTPTR_MAX LONG_MAX
+#define UINTPTR_MAX ULONG_MAX
+
+/* 7.18.2.5. Limits of greatest-width integer types */
+
+#undef INTMAX_MIN
+#undef INTMAX_MAX
+#ifdef INT64_MAX
+# define INTMAX_MIN INT64_MIN
+# define INTMAX_MAX INT64_MAX
+#else
+# define INTMAX_MIN INT32_MIN
+# define INTMAX_MAX INT32_MAX
+#endif
+
+#undef UINTMAX_MAX
+#ifdef UINT64_MAX
+# define UINTMAX_MAX UINT64_MAX
+#else
+# define UINTMAX_MAX UINT32_MAX
+#endif
+
+/* 7.18.3. Limits of other integer types */
+
+/* ptrdiff_t limits */
+#undef PTRDIFF_MIN
+#undef PTRDIFF_MAX
+#if @APPLE_UNIVERSAL_BUILD@
+# ifdef _LP64
+# define PTRDIFF_MIN _STDINT_MIN (1, 64, 0l)
+# define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l)
+# else
+# define PTRDIFF_MIN _STDINT_MIN (1, 32, 0)
+# define PTRDIFF_MAX _STDINT_MAX (1, 32, 0)
+# endif
+#else
+# define PTRDIFF_MIN \
+ _STDINT_MIN (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+# define PTRDIFF_MAX \
+ _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+#endif
+
+/* sig_atomic_t limits */
+#undef SIG_ATOMIC_MIN
+#undef SIG_ATOMIC_MAX
+#define SIG_ATOMIC_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+ 0@SIG_ATOMIC_T_SUFFIX@)
+#define SIG_ATOMIC_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+ 0@SIG_ATOMIC_T_SUFFIX@)
+
+
+/* size_t limit */
+#undef SIZE_MAX
+#if @APPLE_UNIVERSAL_BUILD@
+# ifdef _LP64
+# define SIZE_MAX _STDINT_MAX (0, 64, 0ul)
+# else
+# define SIZE_MAX _STDINT_MAX (0, 32, 0ul)
+# endif
+#else
+# define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
+#endif
+
+/* wchar_t limits */
+/* Get WCHAR_MIN, WCHAR_MAX.
+ This include is not on the top, above, because on OSF/1 4.0 we have a sequence of nested
+ includes <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
+ <stdint.h> and assumes its types are already defined. */
+#if ! (defined WCHAR_MIN && defined WCHAR_MAX)
+# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+# include <wchar.h>
+# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+#endif
+#undef WCHAR_MIN
+#undef WCHAR_MAX
+#define WCHAR_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+#define WCHAR_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+
+/* wint_t limits */
+#undef WINT_MIN
+#undef WINT_MAX
+#define WINT_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+#define WINT_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+
+#endif /* !defined __cplusplus || defined __STDC_LIMIT_MACROS */
+
+/* 7.18.4. Macros for integer constants */
+
+#if ! defined __cplusplus || defined __STDC_CONSTANT_MACROS
+
+/* 7.18.4.1. Macros for minimum-width integer constants */
+/* According to ISO C 99 Technical Corrigendum 1 */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */
+
+#undef INT8_C
+#undef UINT8_C
+#define INT8_C(x) x
+#define UINT8_C(x) x
+
+#undef INT16_C
+#undef UINT16_C
+#define INT16_C(x) x
+#define UINT16_C(x) x
+
+#undef INT32_C
+#undef UINT32_C
+#define INT32_C(x) x
+#define UINT32_C(x) x ## U
+
+#undef INT64_C
+#undef UINT64_C
+#if LONG_MAX >> 31 >> 31 == 1
+# define INT64_C(x) x##L
+#elif defined _MSC_VER
+# define INT64_C(x) x##i64
+#elif @HAVE_LONG_LONG_INT@
+# define INT64_C(x) x##LL
+#endif
+#if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# define UINT64_C(x) x##UL
+#elif defined _MSC_VER
+# define UINT64_C(x) x##ui64
+#elif @HAVE_UNSIGNED_LONG_LONG_INT@
+# define UINT64_C(x) x##ULL
+#endif
+
+/* 7.18.4.2. Macros for greatest-width integer constants */
+
+#undef INTMAX_C
+#if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define INTMAX_C(x) x##LL
+#elif defined GL_INT64_T
+# define INTMAX_C(x) INT64_C(x)
+#else
+# define INTMAX_C(x) x##L
+#endif
+
+#undef UINTMAX_C
+#if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define UINTMAX_C(x) x##ULL
+#elif defined GL_UINT64_T
+# define UINTMAX_C(x) UINT64_C(x)
+#else
+# define UINTMAX_C(x) x##UL
+#endif
+
+#endif /* !defined __cplusplus || defined __STDC_CONSTANT_MACROS */
+
+#endif /* _GL_STDINT_H */
+#endif /* !defined _GL_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
diff --git a/gnulib/lib/stdio--.h b/gnulib/lib/stdio--.h
new file mode 100644
index 00000000..b8323089
--- /dev/null
+++ b/gnulib/lib/stdio--.h
@@ -0,0 +1,41 @@
+/* Like stdio.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stdio.h>
+#include "stdio-safer.h"
+
+#if GNULIB_FOPEN_SAFER
+# undef fopen
+# define fopen fopen_safer
+#endif
+
+#if GNULIB_FREOPEN_SAFER
+# undef freopen
+# define freopen freopen_safer
+#endif
+
+#if GNULIB_TMPFILE_SAFER
+# undef tmpfile
+# define tmpfile tmpfile_safer
+#endif
+
+#if GNULIB_POPEN_SAFER
+# undef popen
+# define popen popen_safer
+#endif
diff --git a/gnulib/lib/stdio-impl.h b/gnulib/lib/stdio-impl.h
new file mode 100644
index 00000000..7d719efe
--- /dev/null
+++ b/gnulib/lib/stdio-impl.h
@@ -0,0 +1,94 @@
+/* Implementation details of FILE streams.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Many stdio implementations have the same logic and therefore can share
+ the same implementation of stdio extension API, except that some fields
+ have different naming conventions, or their access requires some casts. */
+
+
+/* BSD stdio derived implementations. */
+
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+
+# if defined __DragonFly__ /* DragonFly */
+ /* See <http://www.dragonflybsd.org/cvsweb/src/lib/libc/stdio/priv_stdio.h?rev=HEAD&content-type=text/x-cvsweb-markup>. */
+# define fp_ ((struct { struct __FILE_public pub; \
+ struct { unsigned char *_base; int _size; } _bf; \
+ void *cookie; \
+ void *_close; \
+ void *_read; \
+ void *_seek; \
+ void *_write; \
+ struct { unsigned char *_base; int _size; } _ub; \
+ int _ur; \
+ unsigned char _ubuf[3]; \
+ unsigned char _nbuf[1]; \
+ struct { unsigned char *_base; int _size; } _lb; \
+ int _blksize; \
+ fpos_t _offset; \
+ /* More fields, not relevant here. */ \
+ } *) fp)
+ /* See <http://www.dragonflybsd.org/cvsweb/src/include/stdio.h?rev=HEAD&content-type=text/x-cvsweb-markup>. */
+# define _p pub._p
+# define _flags pub._flags
+# define _r pub._r
+# define _w pub._w
+# else
+# define fp_ fp
+# endif
+
+# if defined __NetBSD__ || defined __OpenBSD__ /* NetBSD, OpenBSD */
+ /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
+ and <http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup> */
+ struct __sfileext
+ {
+ struct __sbuf _ub; /* ungetc buffer */
+ /* More fields, not relevant here. */
+ };
+# define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
+# else /* FreeBSD, DragonFly, MacOS X, Cygwin */
+# define fp_ub fp_->_ub
+# endif
+
+# define HASUB(fp) (fp_ub._base != NULL)
+
+#endif
+
+
+/* SystemV derived implementations. */
+
+#if defined _IOERR
+
+# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
+# define fp_ ((struct { unsigned char *_ptr; \
+ unsigned char *_base; \
+ unsigned char *_end; \
+ long _cnt; \
+ int _file; \
+ unsigned int _flag; \
+ } *) fp)
+# else
+# define fp_ fp
+# endif
+
+# if defined _SCO_DS /* OpenServer */
+# define _cnt __cnt
+# define _ptr __ptr
+# define _base __base
+# define _flag __flag
+# endif
+
+#endif
diff --git a/gnulib/lib/stdio-safer.h b/gnulib/lib/stdio-safer.h
new file mode 100644
index 00000000..9a7c4da5
--- /dev/null
+++ b/gnulib/lib/stdio-safer.h
@@ -0,0 +1,36 @@
+/* Invoke stdio functions, but avoid some glitches.
+
+ Copyright (C) 2001, 2003, 2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stdio.h>
+
+#if GNULIB_FOPEN_SAFER
+FILE *fopen_safer (char const *, char const *);
+#endif
+
+#if GNULIB_FREOPEN_SAFER
+FILE *freopen_safer (char const *, char const *, FILE *);
+#endif
+
+#if GNULIB_POPEN_SAFER
+FILE *popen_safer (char const *, char const *);
+#endif
+
+#if GNULIB_TMPFILE_SAFER
+FILE *tmpfile_safer (void);
+#endif
diff --git a/gnulib/lib/stdio-write.c b/gnulib/lib/stdio-write.c
new file mode 100644
index 00000000..f7da9e42
--- /dev/null
+++ b/gnulib/lib/stdio-write.c
@@ -0,0 +1,150 @@
+/* POSIX compatible FILE stream write function.
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Replace these functions only if module 'sigpipe' is requested. */
+#if GNULIB_SIGPIPE
+
+/* On native Windows platforms, SIGPIPE does not exist. When write() is
+ called on a pipe with no readers, WriteFile() fails with error
+ GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
+ error EINVAL. This write() function is at the basis of the function
+ which flushes the buffer of a FILE stream. */
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <signal.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# define CALL_WITH_SIGPIPE_EMULATION(RETTYPE, EXPRESSION, FAILED) \
+ if (ferror (stream)) \
+ return (EXPRESSION); \
+ else \
+ { \
+ RETTYPE ret; \
+ SetLastError (0); \
+ ret = (EXPRESSION); \
+ if (FAILED && GetLastError () == ERROR_NO_DATA && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0 \
+ && GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_PIPE)\
+ { \
+ /* Try to raise signal SIGPIPE. */ \
+ raise (SIGPIPE); \
+ /* If it is currently blocked or ignored, change errno from \
+ EINVAL to EPIPE. */ \
+ errno = EPIPE; \
+ } \
+ } \
+ return ret; \
+ }
+
+# if !REPLACE_PRINTF_POSIX /* avoid collision with printf.c */
+# if !DEPENDS_ON_LIBINTL /* avoid collision with intl/printf.c */
+int
+printf (const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stdout, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+# endif
+
+# if !REPLACE_FPRINTF_POSIX /* avoid collision with fprintf.c */
+int
+fprintf (FILE *stream, const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stream, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+# if !REPLACE_VPRINTF_POSIX /* avoid collision with vprintf.c */
+int
+vprintf (const char *format, va_list args)
+{
+ return vfprintf (stdout, format, args);
+}
+# endif
+
+# if !REPLACE_VFPRINTF_POSIX /* avoid collision with vfprintf.c */
+int
+vfprintf (FILE *stream, const char *format, va_list args)
+#undef vfprintf
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, vfprintf (stream, format, args), ret == EOF)
+}
+# endif
+
+int
+putchar (int c)
+{
+ return fputc (c, stdout);
+}
+
+int
+fputc (int c, FILE *stream)
+#undef fputc
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, fputc (c, stream), ret == EOF)
+}
+
+int
+fputs (const char *string, FILE *stream)
+#undef fputs
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, fputs (string, stream), ret == EOF)
+}
+
+int
+puts (const char *string)
+#undef puts
+{
+ FILE *stream = stdout;
+ CALL_WITH_SIGPIPE_EMULATION (int, puts (string), ret == EOF)
+}
+
+size_t
+fwrite (const void *ptr, size_t s, size_t n, FILE *stream)
+#undef fwrite
+{
+ CALL_WITH_SIGPIPE_EMULATION (size_t, fwrite (ptr, s, n, stream), ret < n)
+}
+
+# endif
+#endif
diff --git a/gnulib/lib/stdio.in.h b/gnulib/lib/stdio.in.h
new file mode 100644
index 00000000..91740f2b
--- /dev/null
+++ b/gnulib/lib/stdio.in.h
@@ -0,0 +1,675 @@
+/* A GNU-like <stdio.h>.
+
+ Copyright (C) 2004, 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if defined __need_FILE || defined __need___FILE
+/* Special invocation convention inside glibc header files. */
+
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _GL_STDIO_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#ifndef _GL_STDIO_H
+#define _GL_STDIO_H
+
+/* Get va_list. Needed on many systems, including glibc 2.8. */
+#include <stdarg.h>
+
+#include <stddef.h>
+
+/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8. */
+#include <sys/types.h>
+
+#ifndef __attribute__
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable __attribute__ only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(Spec) /* empty */
+# endif
+#endif
+
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_DPRINTF@
+# if @REPLACE_DPRINTF@
+# define dprintf rpl_dprintf
+# endif
+# if @REPLACE_DPRINTF@ || !@HAVE_DPRINTF@
+extern int dprintf (int fd, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3))) _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef dprintf
+# if HAVE_RAW_DECL_DPRINTF
+_GL_WARN_ON_USE (dprintf, "dprintf is unportable - "
+ "use gnulib module dprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_FCLOSE@
+# if @REPLACE_FCLOSE@
+# define fclose rpl_fclose
+ /* Close STREAM and its underlying file descriptor. */
+extern int fclose (FILE *stream) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fclose
+/* Assume fclose is always declared. */
+_GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - "
+ "use gnulib module fclose for portable POSIX compliance");
+#endif
+
+#if @GNULIB_FFLUSH@
+# if @REPLACE_FFLUSH@
+# define fflush rpl_fflush
+ /* Flush all pending data on STREAM according to POSIX rules. Both
+ output and seekable input streams are supported.
+ Note! LOSS OF DATA can occur if fflush is applied on an input stream
+ that is _not_seekable_ or on an update stream that is _not_seekable_
+ and in which the most recent operation was input. Seekability can
+ be tested with lseek(fileno(fp),0,SEEK_CUR). */
+ extern int fflush (FILE *gl_stream);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fflush
+/* Assume fflush is always declared. */
+_GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
+ "use gnulib module fflush for portable POSIX compliance");
+#endif
+
+/* It is very rare that the developer ever has full control of stdin,
+ so any use of gets warrants an unconditional warning. Assume it is
+ always declared, since it is required by C89. */
+#undef gets
+_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+
+#if @GNULIB_FOPEN@
+# if @REPLACE_FOPEN@
+# undef fopen
+# define fopen rpl_fopen
+extern FILE * fopen (const char *filename, const char *mode)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fopen
+/* Assume fopen is always declared. */
+_GL_WARN_ON_USE (fopen, "fopen on Win32 platforms is not POSIX compatible - "
+ "use gnulib module fopen for portability");
+#endif
+
+#if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
+# if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \
+ || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@)
+# define fprintf rpl_fprintf
+# define GNULIB_overrides_fprintf 1
+extern int fprintf (FILE *fp, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)))
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#endif
+#if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_fprintf
+# undef fprintf
+# endif
+/* Assume fprintf is always declared. */
+_GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - "
+ "use gnulib module fprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_FPURGE@
+# if @REPLACE_FPURGE@
+# define fpurge rpl_fpurge
+# endif
+# if @REPLACE_FPURGE@ || !@HAVE_DECL_FPURGE@
+ /* Discard all pending buffered I/O data on STREAM.
+ STREAM must not be wide-character oriented.
+ When discarding pending output, the file position is set back to where it
+ was before the write calls. When discarding pending input, the file
+ position is advanced to match the end of the previously read input.
+ Return 0 if successful. Upon error, return -1 and set errno. */
+ extern int fpurge (FILE *gl_stream) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fpurge
+# if HAVE_RAW_DECL_FPURGE
+_GL_WARN_ON_USE (fpurge, "fpurge is not always present - "
+ "use gnulib module fpurge for portability");
+# endif
+#endif
+
+#if @GNULIB_FPUTC@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
+# undef fputc
+# define fputc rpl_fputc
+extern int fputc (int c, FILE *stream) _GL_ARG_NONNULL ((2));
+#endif
+
+#if @GNULIB_FPUTS@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
+# undef fputs
+# define fputs rpl_fputs
+extern int fputs (const char *string, FILE *stream) _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_FREOPEN@
+# if @REPLACE_FREOPEN@
+# undef freopen
+# define freopen rpl_freopen
+extern FILE * freopen (const char *filename, const char *mode, FILE *stream)
+ _GL_ARG_NONNULL ((2, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef freopen
+/* Assume freopen is always declared. */
+_GL_WARN_ON_USE (freopen, "freopen on Win32 platforms is not POSIX compatible - "
+ "use gnulib module freopen for portability");
+#endif
+
+
+/* Set up the following warnings, based on which modules are in use.
+ GNU Coding Standards discourage the use of fseek, since it imposes
+ an arbitrary limitation on some 32-bit hosts. Remember that the
+ fseek module depends on the fseeko module, so we only have three
+ cases to consider:
+
+ 1. The developer is not using either module. Issue a warning under
+ GNULIB_POSIXCHECK for both functions, to remind them that both
+ functions have bugs on some systems. _GL_NO_LARGE_FILES has no
+ impact on this warning.
+
+ 2. The developer is using both modules. They may be unaware of the
+ arbitrary limitations of fseek, so issue a warning under
+ GNULIB_POSIXCHECK. On the other hand, they may be using both
+ modules intentionally, so the developer can define
+ _GL_NO_LARGE_FILES in the compilation units where the use of fseek
+ is safe, to silence the warning.
+
+ 3. The developer is using the fseeko module, but not fseek. Gnulib
+ guarantees that fseek will still work around platform bugs in that
+ case, but we presume that the developer is aware of the pitfalls of
+ fseek and was trying to avoid it, so issue a warning even when
+ GNULIB_POSIXCHECK is undefined. Again, _GL_NO_LARGE_FILES can be
+ defined to silence the warning in particular compilation units.
+
+ Most gnulib clients that perform stream operations should fall into
+ category 3. */
+
+#if @GNULIB_FSEEK@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+# define _GL_FSEEK_WARN /* Category 2, above. */
+# undef fseek
+# endif
+# if @REPLACE_FSEEK@
+# undef fseek
+# define fseek rpl_fseek
+extern int fseek (FILE *fp, long offset, int whence) _GL_ARG_NONNULL ((1));
+# endif
+#endif
+
+#if @GNULIB_FSEEKO@
+# if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES
+# define _GL_FSEEK_WARN /* Category 3, above. */
+# undef fseek
+# endif
+# if @REPLACE_FSEEKO@
+/* Provide fseek, fseeko functions that are aware of a preceding
+ fflush(), and which detect pipes. */
+# undef fseeko
+# define fseeko rpl_fseeko
+extern int fseeko (FILE *fp, off_t offset, int whence) _GL_ARG_NONNULL ((1));
+# if !@GNULIB_FSEEK@
+# undef fseek
+# define fseek rpl_fseek
+static inline int _GL_ARG_NONNULL ((1))
+rpl_fseek (FILE *fp, long offset, int whence)
+{
+ return fseeko (fp, offset, whence);
+}
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FSEEK_WARN /* Category 1, above. */
+# undef fseek
+# undef fseeko
+# if HAVE_RAW_DECL_FSEEKO
+_GL_WARN_ON_USE (fseeko, "fseeko is unportable - "
+ "use gnulib module fseeko for portability");
+# endif
+#endif
+
+#ifdef _GL_FSEEK_WARN
+# undef _GL_FSEEK_WARN
+/* Here, either fseek is undefined (but C89 guarantees that it is
+ declared), or it is defined as rpl_fseek (declared above). */
+_GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB "
+ "on 32-bit platforms - "
+ "use fseeko function for handling of large files");
+#endif
+
+
+/* ftell, ftello. See the comments on fseek/fseeko. */
+
+#if @GNULIB_FTELL@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+# define _GL_FTELL_WARN /* Category 2, above. */
+# undef ftell
+# endif
+# if @REPLACE_FTELL@
+# undef ftell
+# define ftell rpl_ftell
+extern long ftell (FILE *fp) _GL_ARG_NONNULL ((1));
+# endif
+#endif
+
+#if @GNULIB_FTELLO@
+# if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES
+# define _GL_FTELL_WARN /* Category 3, above. */
+# undef ftell
+# endif
+# if @REPLACE_FTELLO@
+# undef ftello
+# define ftello rpl_ftello
+extern off_t ftello (FILE *fp) _GL_ARG_NONNULL ((1));
+# if !@GNULIB_FTELL@
+# undef ftell
+# define ftell rpl_ftell
+static inline long _GL_ARG_NONNULL ((1))
+rpl_ftell (FILE *f)
+{
+ return ftello (f);
+}
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FTELL_WARN /* Category 1, above. */
+# undef ftell
+# undef ftello
+# if HAVE_RAW_DECL_FTELLO
+_GL_WARN_ON_USE (ftello, "ftello is unportable - "
+ "use gnulib module ftello for portability");
+# endif
+#endif
+
+#ifdef _GL_FTELL_WARN
+# undef _GL_FTELL_WARN
+/* Here, either ftell is undefined (but C89 guarantees that it is
+ declared), or it is defined as rpl_ftell (declared above). */
+_GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB "
+ "on 32-bit platforms - "
+ "use ftello function for handling of large files");
+#endif
+
+
+#if @GNULIB_FWRITE@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
+# undef fwrite
+# define fwrite rpl_fwrite
+extern size_t fwrite (const void *ptr, size_t s, size_t n, FILE *stream)
+ _GL_ARG_NONNULL ((1, 4));
+#endif
+
+#if @GNULIB_GETDELIM@
+# if @REPLACE_GETDELIM@
+# undef getdelim
+# define getdelim rpl_getdelim
+# endif
+# if !@HAVE_DECL_GETDELIM@ || @REPLACE_GETDELIM@
+/* Read input, up to (and including) the next occurrence of DELIMITER, from
+ STREAM, store it in *LINEPTR (and NUL-terminate it).
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+extern ssize_t getdelim (char **lineptr, size_t *linesize, int delimiter,
+ FILE *stream)
+ _GL_ARG_NONNULL ((1, 2, 4));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getdelim
+# if HAVE_RAW_DECL_GETDELIM
+_GL_WARN_ON_USE (getdelim, "getdelim is unportable - "
+ "use gnulib module getdelim for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLINE@
+# if @REPLACE_GETLINE@
+# undef getline
+# define getline rpl_getline
+# endif
+# if !@HAVE_DECL_GETLINE@ || @REPLACE_GETLINE@
+/* Read a line, up to (and including) the next newline, from STREAM, store it
+ in *LINEPTR (and NUL-terminate it).
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+extern ssize_t getline (char **lineptr, size_t *linesize, FILE *stream)
+ _GL_ARG_NONNULL ((1, 2, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getline
+# if HAVE_RAW_DECL_GETLINE
+_GL_WARN_ON_USE (getline, "getline is unportable - "
+ "use gnulib module getline for portability");
+# endif
+#endif
+
+#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
+# if @REPLACE_OBSTACK_PRINTF@
+# define obstack_printf rpl_obstack_printf
+# define obstack_vprintf rpl_obstack_vprintf
+# endif
+# if @REPLACE_OBSTACK_PRINTF@ || !@HAVE_DECL_OBSTACK_PRINTF@
+ struct obstack;
+ /* Grow an obstack with formatted output. Return the number of
+ bytes added to OBS. No trailing nul byte is added, and the
+ object should be closed with obstack_finish before use. Upon
+ memory allocation error, call obstack_alloc_failed_handler. Upon
+ other error, return -1. */
+ extern int obstack_printf (struct obstack *obs, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3))) _GL_ARG_NONNULL ((1, 2));
+ extern int obstack_vprintf (struct obstack *obs, const char *format,
+ va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0))) _GL_ARG_NONNULL ((1, 2));
+# endif
+#endif
+
+#if @GNULIB_PERROR@
+# if @REPLACE_PERROR@
+# define perror rpl_perror
+/* Print a message to standard error, describing the value of ERRNO,
+ (if STRING is not NULL and not empty) prefixed with STRING and ": ",
+ and terminated with a newline. */
+extern void perror (const char *string);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef perror
+/* Assume perror is always declared. */
+_GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - "
+ "use gnulib module perror for portability");
+#endif
+
+#if @GNULIB_POPEN@
+# if @REPLACE_POPEN@
+# undef popen
+# define popen rpl_popen
+extern FILE *popen (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef popen
+# if HAVE_RAW_DECL_POPEN
+_GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
+ "use gnulib module popen or pipe for more portability");
+# endif
+#endif
+
+#if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
+# if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
+ || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@)
+/* Don't break __attribute__((format(printf,M,N))). */
+# define printf __printf__
+# define GNULIB_overrides_printf 1
+extern int printf (const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 1, 2))) _GL_ARG_NONNULL ((1));
+# endif
+#endif
+#if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_printf
+# undef printf
+# endif
+/* Assume printf is always declared. */
+_GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - "
+ "use gnulib module printf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_PUTC@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
+# undef putc
+# define putc rpl_fputc
+extern int putc (int c, FILE *stream) _GL_ARG_NONNULL ((2));
+#endif
+
+#if @GNULIB_PUTCHAR@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
+# undef putchar
+# define putchar rpl_putchar
+extern int putchar (int c);
+#endif
+
+#if @GNULIB_PUTS@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
+# undef puts
+# define puts rpl_puts
+extern int puts (const char *string) _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_REMOVE@
+# if @REPLACE_REMOVE@
+# undef remove
+# define remove rpl_remove
+extern int remove (const char *name) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef remove
+/* Assume remove is always declared. */
+_GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - "
+ "use gnulib module remove for more portability");
+#endif
+
+#if @GNULIB_RENAME@
+# if @REPLACE_RENAME@
+# undef rename
+# define rename rpl_rename
+extern int rename (const char *old_filename, const char *new_filename)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rename
+/* Assume rename is always declared. */
+_GL_WARN_ON_USE (rename, "rename is buggy on some platforms - "
+ "use gnulib module rename for more portability");
+#endif
+
+#if @GNULIB_RENAMEAT@
+# if @REPLACE_RENAMEAT@
+# undef renameat
+# define renameat rpl_renameat
+# endif
+# if !@HAVE_RENAMEAT@ || @REPLACE_RENAMEAT@
+extern int renameat (int fd1, char const *file1, int fd2, char const *file2)
+ _GL_ARG_NONNULL ((2, 4));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef renameat
+# if HAVE_RAW_DECL_RENAMEAT
+_GL_WARN_ON_USE (renameat, "renameat is not portable - "
+ "use gnulib module renameat for portability");
+# endif
+#endif
+
+#if @GNULIB_SNPRINTF@
+# if @REPLACE_SNPRINTF@
+# define snprintf rpl_snprintf
+# endif
+# if @REPLACE_SNPRINTF@ || !@HAVE_DECL_SNPRINTF@
+extern int snprintf (char *str, size_t size, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)))
+ _GL_ARG_NONNULL ((3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef snprintf
+# if HAVE_RAW_DECL_SNPRINTF
+_GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
+ "use gnulib module snprintf for portability");
+# endif
+#endif
+
+/* Some people would argue that sprintf should be handled like gets
+ (for example, OpenBSD issues a link warning for both functions),
+ since both can cause security holes due to buffer overruns.
+ However, we believe that sprintf can be used safely, and is more
+ efficient than snprintf in those safe cases; and as proof of our
+ belief, we use sprintf in several gnulib modules. So this header
+ intentionally avoids adding a warning to sprintf except when
+ GNULIB_POSIXCHECK is defined. */
+
+#if @GNULIB_SPRINTF_POSIX@
+# if @REPLACE_SPRINTF@
+# define sprintf rpl_sprintf
+extern int sprintf (char *str, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)))
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sprintf
+/* Assume sprintf is always declared. */
+_GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - "
+ "use gnulib module sprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VASPRINTF@
+# if @REPLACE_VASPRINTF@
+# define asprintf rpl_asprintf
+# define vasprintf rpl_vasprintf
+# endif
+# if @REPLACE_VASPRINTF@ || !@HAVE_VASPRINTF@
+ /* Write formatted output to a string dynamically allocated with malloc().
+ If the memory allocation succeeds, store the address of the string in
+ *RESULT and return the number of resulting bytes, excluding the trailing
+ NUL. Upon memory allocation error, or some other error, return -1. */
+ extern int asprintf (char **result, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3))) _GL_ARG_NONNULL ((1, 2));
+ extern int vasprintf (char **result, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0))) _GL_ARG_NONNULL ((1, 2));
+# endif
+#endif
+
+#if @GNULIB_VDPRINTF@
+# if @REPLACE_VDPRINTF@
+# define vdprintf rpl_vdprintf
+# endif
+# if @REPLACE_VDPRINTF@ || !@HAVE_VDPRINTF@
+extern int vdprintf (int fd, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0))) _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vdprintf
+# if HAVE_RAW_DECL_VDPRINTF
+_GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - "
+ "use gnulib module vdprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@
+# if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \
+ || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@)
+# define vfprintf rpl_vfprintf
+# define GNULIB_overrides_vfprintf 1
+extern int vfprintf (FILE *fp, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0)))
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#endif
+#if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vfprintf
+# undef vfprintf
+# endif
+/* Assume vfprintf is always declared. */
+_GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - "
+ "use gnulib module vfprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
+# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \
+ || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@)
+# define vprintf rpl_vprintf
+# define GNULIB_overrides_vprintf 1
+extern int vprintf (const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 1, 0))) _GL_ARG_NONNULL ((1));
+# endif
+#endif
+#if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vprintf
+# undef vprintf
+# endif
+/* Assume vprintf is always declared. */
+_GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - "
+ "use gnulib module vprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VSNPRINTF@
+# if @REPLACE_VSNPRINTF@
+# define vsnprintf rpl_vsnprintf
+# endif
+# if @REPLACE_VSNPRINTF@ || !@HAVE_DECL_VSNPRINTF@
+extern int vsnprintf (char *str, size_t size, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 3, 0)))
+ _GL_ARG_NONNULL ((3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsnprintf
+# if HAVE_RAW_DECL_VSNPRINTF
+_GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - "
+ "use gnulib module vsnprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VSPRINTF_POSIX@
+# if @REPLACE_VSPRINTF@
+# define vsprintf rpl_vsprintf
+extern int vsprintf (char *str, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0)))
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsprintf
+/* Assume vsprintf is always declared. */
+_GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - "
+ "use gnulib module vsprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_STDIO_H */
+#endif /* _GL_STDIO_H */
+#endif
diff --git a/gnulib/lib/stdlib--.h b/gnulib/lib/stdlib--.h
new file mode 100644
index 00000000..368eb56a
--- /dev/null
+++ b/gnulib/lib/stdlib--.h
@@ -0,0 +1,36 @@
+/* Like stdlib.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005-2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stdlib.h>
+#include "stdlib-safer.h"
+
+#undef mkstemp
+#define mkstemp mkstemp_safer
+
+#if GNULIB_MKOSTEMP
+# define mkostemp mkostemp_safer
+#endif
+
+#if GNULIB_MKOSTEMPS
+# define mkostemps mkostemps_safer
+#endif
+
+#if GNULIB_MKSTEMPS
+# define mkstemps mkstemps_safer
+#endif
diff --git a/gnulib/lib/stdlib-safer.h b/gnulib/lib/stdlib-safer.h
new file mode 100644
index 00000000..ff0cadc0
--- /dev/null
+++ b/gnulib/lib/stdlib-safer.h
@@ -0,0 +1,32 @@
+/* Invoke stdlib.h functions, but avoid some glitches.
+
+ Copyright (C) 2005, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+int mkstemp_safer (char *);
+
+#if GNULIB_MKOSTEMP
+int mkostemp_safer (char *, int);
+#endif
+
+#if GNULIB_MKOSTEMPS
+int mkostemps_safer (char *, int, int);
+#endif
+
+#if GNULIB_MKSTEMPS
+int mkstemps_safer (char *, int);
+#endif
diff --git a/gnulib/lib/stdlib.in.h b/gnulib/lib/stdlib.in.h
new file mode 100644
index 00000000..7f86496f
--- /dev/null
+++ b/gnulib/lib/stdlib.in.h
@@ -0,0 +1,497 @@
+/* A GNU-like <stdlib.h>.
+
+ Copyright (C) 1995, 2001-2004, 2006-2010 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if defined __need_malloc_and_calloc
+/* Special invocation convention inside glibc header files. */
+
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _GL_STDLIB_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#ifndef _GL_STDLIB_H
+#define _GL_STDLIB_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* Solaris declares getloadavg() in <sys/loadavg.h>. */
+#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@
+# include <sys/loadavg.h>
+#endif
+
+/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
+ from <stdlib.h> if _REENTRANT is defined. Include it always. */
+#if @HAVE_RANDOM_H@
+# include <random.h>
+#endif
+
+#if !@HAVE_STRUCT_RANDOM_DATA@ || (@GNULIB_RANDOM_R@ && !@HAVE_RANDOM_R@) \
+ || defined GNULIB_POSIXCHECK
+# include <stdint.h>
+#endif
+
+#if !@HAVE_STRUCT_RANDOM_DATA@
+struct random_data
+{
+ int32_t *fptr; /* Front pointer. */
+ int32_t *rptr; /* Rear pointer. */
+ int32_t *state; /* Array of state values. */
+ int rand_type; /* Type of random number generator. */
+ int rand_deg; /* Degree of random number generator. */
+ int rand_sep; /* Distance between front and rear. */
+ int32_t *end_ptr; /* Pointer behind state table. */
+};
+#endif
+
+#if (@GNULIB_MKSTEMP@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__
+/* On MacOS X 10.3, only <unistd.h> declares mkstemp. */
+/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
+/* But avoid namespace pollution on glibc systems. */
+# include <unistd.h>
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Some systems do not define EXIT_*, despite otherwise supporting C89. */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+/* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere
+ with proper operation of xargs. */
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#elif EXIT_FAILURE != 1
+# undef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_ATOLL@
+# if !@HAVE_ATOLL@
+/* Parse a signed decimal integer.
+ Returns the value of the integer. Errors are not detected. */
+extern long long atoll (const char *string) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef atoll
+# if HAVE_RAW_DECL_ATOLL
+_GL_WARN_ON_USE (atoll, "atoll is unportable - "
+ "use gnulib module atoll for portability");
+# endif
+#endif
+
+#if @GNULIB_CALLOC_POSIX@
+# if !@HAVE_CALLOC_POSIX@
+# undef calloc
+# define calloc rpl_calloc
+extern void * calloc (size_t nmemb, size_t size);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef calloc
+/* Assume calloc is always declared. */
+_GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
+ "use gnulib module calloc-posix for portability");
+#endif
+
+#if @GNULIB_CANONICALIZE_FILE_NAME@
+# if @REPLACE_CANONICALIZE_FILE_NAME@
+# define canonicalize_file_name rpl_canonicalize_file_name
+# endif
+# if !@HAVE_CANONICALIZE_FILE_NAME@ || @REPLACE_CANONICALIZE_FILE_NAME@
+extern char *canonicalize_file_name (const char *name) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef canonicalize_file_name
+# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+_GL_WARN_ON_USE (canonicalize_file_name, "canonicalize_file_name is unportable - "
+ "use gnulib module canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLOADAVG@
+# if !@HAVE_DECL_GETLOADAVG@
+/* Store max(NELEM,3) load average numbers in LOADAVG[].
+ The three numbers are the load average of the last 1 minute, the last 5
+ minutes, and the last 15 minutes, respectively.
+ LOADAVG is an array of NELEM numbers. */
+extern int getloadavg (double loadavg[], int nelem) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getloadavg
+# if HAVE_RAW_DECL_GETLOADAVG
+_GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
+ "use gnulib module getloadavg for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSUBOPT@
+/* Assuming *OPTIONP is a comma separated list of elements of the form
+ "token" or "token=value", getsubopt parses the first of these elements.
+ If the first element refers to a "token" that is member of the given
+ NULL-terminated array of tokens:
+ - It replaces the comma with a NUL byte, updates *OPTIONP to point past
+ the first option and the comma, sets *VALUEP to the value of the
+ element (or NULL if it doesn't contain an "=" sign),
+ - It returns the index of the "token" in the given array of tokens.
+ Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined.
+ For more details see the POSIX:2001 specification.
+ http://www.opengroup.org/susv3xsh/getsubopt.html */
+# if !@HAVE_GETSUBOPT@
+extern int getsubopt (char **optionp, char *const *tokens, char **valuep)
+ _GL_ARG_NONNULL ((1, 2, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getsubopt
+# if HAVE_RAW_DECL_GETSUBOPT
+_GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - "
+ "use gnulib module getsubopt for portability");
+# endif
+#endif
+
+#if @GNULIB_MALLOC_POSIX@
+# if !@HAVE_MALLOC_POSIX@
+# undef malloc
+# define malloc rpl_malloc
+extern void * malloc (size_t size);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef malloc
+/* Assume malloc is always declared. */
+_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
+ "use gnulib module malloc-posix for portability");
+#endif
+
+#if @GNULIB_MKDTEMP@
+# if !@HAVE_MKDTEMP@
+/* Create a unique temporary directory from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the directory name unique.
+ Returns TEMPLATE, or a null pointer if it cannot get a unique name.
+ The directory is created mode 700. */
+extern char * mkdtemp (char * /*template*/) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkdtemp
+# if HAVE_RAW_DECL_MKDTEMP
+_GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - "
+ "use gnulib module mkdtemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMP@
+# if !@HAVE_MKOSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ The file is then created, with the specified flags, ensuring it didn't exist
+ before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+extern int mkostemp (char * /*template*/, int /*flags*/) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemp
+# if HAVE_RAW_DECL_MKOSTEMP
+_GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - "
+ "use gnulib module mkostemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMPS@
+# if !@HAVE_MKOSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE before a suffix of length
+ SUFFIXLEN must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ The file is then created, with the specified flags, ensuring it didn't exist
+ before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+extern int mkostemps (char * /*template*/, int /*suffixlen*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemps
+# if HAVE_RAW_DECL_MKOSTEMPS
+_GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - "
+ "use gnulib module mkostemps for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMP@
+# if @REPLACE_MKSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The file is then created, ensuring it didn't exist before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# define mkstemp rpl_mkstemp
+extern int mkstemp (char * /*template*/) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemp
+# if HAVE_RAW_DECL_MKSTEMP
+_GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - "
+ "use gnulib module mkstemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMPS@
+# if !@HAVE_MKSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE prior to a suffix of length
+ SUFFIXLEN must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The file is then created, ensuring it didn't exist before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+extern int mkstemps (char * /*template*/, int /*suffixlen*/)
+ _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemps
+# if HAVE_RAW_DECL_MKSTEMPS
+_GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
+ "use gnulib module mkstemps for portability");
+# endif
+#endif
+
+#if @GNULIB_PUTENV@
+# if @REPLACE_PUTENV@
+# undef putenv
+# define putenv rpl_putenv
+extern int putenv (char *string) _GL_ARG_NONNULL ((1));
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+
+# ifndef RAND_MAX
+# define RAND_MAX 2147483647
+# endif
+
+int srandom_r (unsigned int seed, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2));
+int initstate_r (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2, 4));
+int setstate_r (char *arg_state, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((1, 2));
+int random_r (struct random_data *buf, int32_t *result)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef random_r
+# if HAVE_RAW_DECL_RANDOM_R
+_GL_WARN_ON_USE (random_r, "random_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+# undef initstate_r
+# if HAVE_RAW_DECL_INITSTATE_R
+_GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+# undef srandom_r
+# if HAVE_RAW_DECL_SRANDOM_R
+_GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+# undef setstate_r
+# if HAVE_RAW_DECL_SETSTATE_R
+_GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_REALLOC_POSIX@
+# if !@HAVE_REALLOC_POSIX@
+# undef realloc
+# define realloc rpl_realloc
+extern void * realloc (void *ptr, size_t size);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef realloc
+/* Assume realloc is always declared. */
+_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
+ "use gnulib module realloc-posix for portability");
+#endif
+
+#if @GNULIB_REALPATH@
+# if @REPLACE_REALPATH@
+# define realpath rpl_realpath
+# endif
+# if !@HAVE_REALPATH@ || @REPLACE_REALPATH@
+extern char *realpath (const char *name, char *resolved) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef realpath
+# if HAVE_RAW_DECL_REALPATH
+_GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module "
+ "canonicalize or canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_RPMATCH@
+# if !@HAVE_RPMATCH@
+/* Test a user response to a question.
+ Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */
+extern int rpmatch (const char *response) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rpmatch
+# if HAVE_RAW_DECL_RPMATCH
+_GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
+ "use gnulib module rpmatch for portability");
+# endif
+#endif
+
+#if @GNULIB_SETENV@
+# if @REPLACE_SETENV@
+# undef setenv
+# define setenv rpl_setenv
+# endif
+# if !@HAVE_SETENV@ || @REPLACE_SETENV@
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value. */
+extern int setenv (const char *name, const char *value, int replace)
+ _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setenv
+# if HAVE_RAW_DECL_SETENV
+_GL_WARN_ON_USE (setenv, "setenv is unportable - "
+ "use gnulib module setenv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOD@
+# if @REPLACE_STRTOD@
+# define strtod rpl_strtod
+# endif
+# if !@HAVE_STRTOD@ || @REPLACE_STRTOD@
+ /* Parse a double from STRING, updating ENDP if appropriate. */
+extern double strtod (const char *str, char **endp) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtod
+# if HAVE_RAW_DECL_STRTOD
+_GL_WARN_ON_USE (strtod, "strtod is unportable - "
+ "use gnulib module strtod for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLL@
+# if !@HAVE_STRTOLL@
+/* Parse a signed integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
+ to ERANGE. */
+extern long long strtoll (const char *string, char **endptr, int base)
+ _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoll
+# if HAVE_RAW_DECL_STRTOLL
+_GL_WARN_ON_USE (strtoll, "strtoll is unportable - "
+ "use gnulib module strtoll for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOULL@
+# if !@HAVE_STRTOULL@
+/* Parse an unsigned integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is ULLONG_MAX, and errno is set to
+ ERANGE. */
+extern unsigned long long strtoull (const char *string, char **endptr, int base)
+ _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoull
+# if HAVE_RAW_DECL_STRTOULL
+_GL_WARN_ON_USE (strtoull, "strtoull is unportable - "
+ "use gnulib module strtoull for portability");
+# endif
+#endif
+
+#if @GNULIB_UNSETENV@
+# if @REPLACE_UNSETENV@
+# undef unsetenv
+# define unsetenv rpl_unsetenv
+# endif
+# if !@HAVE_UNSETENV@ || @REPLACE_UNSETENV@
+/* Remove the variable NAME from the environment. */
+extern int unsetenv (const char *name) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef unsetenv
+# if HAVE_RAW_DECL_UNSETENV
+_GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
+ "use gnulib module unsetenv for portability");
+# endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_STDLIB_H */
+#endif /* _GL_STDLIB_H */
+#endif
diff --git a/gnulib/lib/stpcpy.c b/gnulib/lib/stpcpy.c
new file mode 100644
index 00000000..196461f9
--- /dev/null
+++ b/gnulib/lib/stpcpy.c
@@ -0,0 +1,49 @@
+/* stpcpy.c -- copy a string and return pointer to end of new string
+ Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2010 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ 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 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#undef __stpcpy
+#ifdef _LIBC
+# undef stpcpy
+#endif
+
+#ifndef weak_alias
+# define __stpcpy stpcpy
+#endif
+
+/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */
+char *
+__stpcpy (char *dest, const char *src)
+{
+ register char *d = dest;
+ register const char *s = src;
+
+ do
+ *d++ = *s;
+ while (*s++ != '\0');
+
+ return d - 1;
+}
+#ifdef weak_alias
+weak_alias (__stpcpy, stpcpy)
+#endif
diff --git a/gnulib/lib/stpncpy.c b/gnulib/lib/stpncpy.c
new file mode 100644
index 00000000..ca53ebbd
--- /dev/null
+++ b/gnulib/lib/stpncpy.c
@@ -0,0 +1,92 @@
+/* Copyright (C) 1993, 1995-1997, 2002-2003, 2005-2007, 2009-2010 Free Software
+ * Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ 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 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/>. */
+
+/* This is almost copied from strncpy.c, written by Torbjorn Granlund. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#ifndef weak_alias
+# define __stpncpy stpncpy
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+ last non-NUL byte written into DST. */
+char *
+__stpncpy (char *dest, const char *src, size_t n)
+{
+ char c;
+ char *s = dest;
+
+ if (n >= 4)
+ {
+ size_t n4 = n >> 2;
+
+ for (;;)
+ {
+ c = *src++;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ c = *src++;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ c = *src++;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ c = *src++;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ if (--n4 == 0)
+ goto last_chars;
+ }
+ n -= dest - s;
+ goto zero_fill;
+ }
+
+ last_chars:
+ n &= 3;
+ if (n == 0)
+ return dest;
+
+ for (;;)
+ {
+ c = *src++;
+ --n;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ if (n == 0)
+ return dest;
+ }
+
+ zero_fill:
+ while (n-- > 0)
+ dest[n] = '\0';
+
+ return dest - 1;
+}
+#ifdef weak_alias
+weak_alias (__stpncpy, stpncpy)
+#endif
diff --git a/gnulib/lib/str-kmp.h b/gnulib/lib/str-kmp.h
new file mode 100644
index 00000000..76668cf8
--- /dev/null
+++ b/gnulib/lib/str-kmp.h
@@ -0,0 +1,150 @@
+/* Substring search in a NUL terminated string of 'char' elements,
+ using the Knuth-Morris-Pratt algorithm.
+ Copyright (C) 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Before including this file, you need to define:
+ CANON_ELEMENT(c) A macro that canonicalizes an element right after
+ it has been fetched from one of the two strings.
+ The argument is an 'unsigned char'; the result
+ must be an 'unsigned char' as well. */
+
+/* Knuth-Morris-Pratt algorithm.
+ See http://en.wikipedia.org/wiki/Knuth-Morris-Pratt_algorithm
+ Return a boolean indicating success:
+ Return true and set *RESULTP if the search was completed.
+ Return false if it was aborted because not enough memory was available. */
+static bool
+knuth_morris_pratt_unibyte (const char *haystack, const char *needle,
+ const char **resultp)
+{
+ size_t m = strlen (needle);
+
+ /* Allocate the table. */
+ size_t *table = (size_t *) nmalloca (m, sizeof (size_t));
+ if (table == NULL)
+ return false;
+ /* Fill the table.
+ For 0 < i < m:
+ 0 < table[i] <= i is defined such that
+ forall 0 < x < table[i]: needle[x..i-1] != needle[0..i-1-x],
+ and table[i] is as large as possible with this property.
+ This implies:
+ 1) For 0 < i < m:
+ If table[i] < i,
+ needle[table[i]..i-1] = needle[0..i-1-table[i]].
+ 2) For 0 < i < m:
+ rhaystack[0..i-1] == needle[0..i-1]
+ and exists h, i <= h < m: rhaystack[h] != needle[h]
+ implies
+ forall 0 <= x < table[i]: rhaystack[x..x+m-1] != needle[0..m-1].
+ table[0] remains uninitialized. */
+ {
+ size_t i, j;
+
+ /* i = 1: Nothing to verify for x = 0. */
+ table[1] = 1;
+ j = 0;
+
+ for (i = 2; i < m; i++)
+ {
+ /* Here: j = i-1 - table[i-1].
+ The inequality needle[x..i-1] != needle[0..i-1-x] is known to hold
+ for x < table[i-1], by induction.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ unsigned char b = CANON_ELEMENT ((unsigned char) needle[i - 1]);
+
+ for (;;)
+ {
+ /* Invariants: The inequality needle[x..i-1] != needle[0..i-1-x]
+ is known to hold for x < i-1-j.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ if (b == CANON_ELEMENT ((unsigned char) needle[j]))
+ {
+ /* Set table[i] := i-1-j. */
+ table[i] = i - ++j;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for x = i-1-j, because
+ needle[i-1] != needle[j] = needle[i-1-x]. */
+ if (j == 0)
+ {
+ /* The inequality holds for all possible x. */
+ table[i] = i;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for i-1-j < x < i-1-j+table[j], because for these x:
+ needle[x..i-2]
+ = needle[x-(i-1-j)..j-1]
+ != needle[0..j-1-(x-(i-1-j))] (by definition of table[j])
+ = needle[0..i-2-x],
+ hence needle[x..i-1] != needle[0..i-1-x].
+ Furthermore
+ needle[i-1-j+table[j]..i-2]
+ = needle[table[j]..j-1]
+ = needle[0..j-1-table[j]] (by definition of table[j]). */
+ j = j - table[j];
+ }
+ /* Here: j = i - table[i]. */
+ }
+ }
+
+ /* Search, using the table to accelerate the processing. */
+ {
+ size_t j;
+ const char *rhaystack;
+ const char *phaystack;
+
+ *resultp = NULL;
+ j = 0;
+ rhaystack = haystack;
+ phaystack = haystack;
+ /* Invariant: phaystack = rhaystack + j. */
+ while (*phaystack != '\0')
+ if (CANON_ELEMENT ((unsigned char) needle[j])
+ == CANON_ELEMENT ((unsigned char) *phaystack))
+ {
+ j++;
+ phaystack++;
+ if (j == m)
+ {
+ /* The entire needle has been found. */
+ *resultp = rhaystack;
+ break;
+ }
+ }
+ else if (j > 0)
+ {
+ /* Found a match of needle[0..j-1], mismatch at needle[j]. */
+ rhaystack += table[j];
+ j -= table[j];
+ }
+ else
+ {
+ /* Found a mismatch at needle[0] already. */
+ rhaystack++;
+ phaystack++;
+ }
+ }
+
+ freea (table);
+ return true;
+}
+
+#undef CANON_ELEMENT
diff --git a/gnulib/lib/str-two-way.h b/gnulib/lib/str-two-way.h
new file mode 100644
index 00000000..3f67741b
--- /dev/null
+++ b/gnulib/lib/str-two-way.h
@@ -0,0 +1,429 @@
+/* Byte-wise substring search, using the Two-Way algorithm.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Eric Blake <ebb9@byu.net>, 2008.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Before including this file, you need to include <config.h> and
+ <string.h>, and define:
+ RESULT_TYPE A macro that expands to the return type.
+ AVAILABLE(h, h_l, j, n_l)
+ A macro that returns nonzero if there are
+ at least N_L bytes left starting at H[J].
+ H is 'unsigned char *', H_L, J, and N_L
+ are 'size_t'; H_L is an lvalue. For
+ NUL-terminated searches, H_L can be
+ modified each iteration to avoid having
+ to compute the end of H up front.
+
+ For case-insensitivity, you may optionally define:
+ CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L
+ characters of P1 and P2 are equal.
+ CANON_ELEMENT(c) A macro that canonicalizes an element right after
+ it has been fetched from one of the two strings.
+ The argument is an 'unsigned char'; the result
+ must be an 'unsigned char' as well.
+
+ This file undefines the macros documented above, and defines
+ LONG_NEEDLE_THRESHOLD.
+*/
+
+#include <limits.h>
+#include <stdint.h>
+
+/* We use the Two-Way string matching algorithm, which guarantees
+ linear complexity with constant space. Additionally, for long
+ needles, we also use a bad character shift table similar to the
+ Boyer-Moore algorithm to achieve improved (potentially sub-linear)
+ performance.
+
+ See http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260
+ and http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm
+*/
+
+/* Point at which computing a bad-byte shift table is likely to be
+ worthwhile. Small needles should not compute a table, since it
+ adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a
+ speedup no greater than a factor of NEEDLE_LEN. The larger the
+ needle, the better the potential performance gain. On the other
+ hand, on non-POSIX systems with CHAR_BIT larger than eight, the
+ memory required for the table is prohibitive. */
+#if CHAR_BIT < 10
+# define LONG_NEEDLE_THRESHOLD 32U
+#else
+# define LONG_NEEDLE_THRESHOLD SIZE_MAX
+#endif
+
+#ifndef MAX
+# define MAX(a, b) ((a < b) ? (b) : (a))
+#endif
+
+#ifndef CANON_ELEMENT
+# define CANON_ELEMENT(c) c
+#endif
+#ifndef CMP_FUNC
+# define CMP_FUNC memcmp
+#endif
+
+/* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN.
+ Return the index of the first byte in the right half, and set
+ *PERIOD to the global period of the right half.
+
+ The global period of a string is the smallest index (possibly its
+ length) at which all remaining bytes in the string are repetitions
+ of the prefix (the last repetition may be a subset of the prefix).
+
+ When NEEDLE is factored into two halves, a local period is the
+ length of the smallest word that shares a suffix with the left half
+ and shares a prefix with the right half. All factorizations of a
+ non-empty NEEDLE have a local period of at least 1 and no greater
+ than NEEDLE_LEN.
+
+ A critical factorization has the property that the local period
+ equals the global period. All strings have at least one critical
+ factorization with the left half smaller than the global period.
+
+ Given an ordered alphabet, a critical factorization can be computed
+ in linear time, with 2 * NEEDLE_LEN comparisons, by computing the
+ larger of two ordered maximal suffixes. The ordered maximal
+ suffixes are determined by lexicographic comparison of
+ periodicity. */
+static size_t
+critical_factorization (const unsigned char *needle, size_t needle_len,
+ size_t *period)
+{
+ /* Index of last byte of left half, or SIZE_MAX. */
+ size_t max_suffix, max_suffix_rev;
+ size_t j; /* Index into NEEDLE for current candidate suffix. */
+ size_t k; /* Offset into current period. */
+ size_t p; /* Intermediate period. */
+ unsigned char a, b; /* Current comparison bytes. */
+
+ /* Invariants:
+ 0 <= j < NEEDLE_LEN - 1
+ -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed)
+ min(max_suffix, max_suffix_rev) < global period of NEEDLE
+ 1 <= p <= global period of NEEDLE
+ p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j]
+ 1 <= k <= p
+ */
+
+ /* Perform lexicographic search. */
+ max_suffix = SIZE_MAX;
+ j = 0;
+ k = p = 1;
+ while (j + k < needle_len)
+ {
+ a = CANON_ELEMENT (needle[j + k]);
+ b = CANON_ELEMENT (needle[max_suffix + k]);
+ if (a < b)
+ {
+ /* Suffix is smaller, period is entire prefix so far. */
+ j += k;
+ k = 1;
+ p = j - max_suffix;
+ }
+ else if (a == b)
+ {
+ /* Advance through repetition of the current period. */
+ if (k != p)
+ ++k;
+ else
+ {
+ j += p;
+ k = 1;
+ }
+ }
+ else /* b < a */
+ {
+ /* Suffix is larger, start over from current location. */
+ max_suffix = j++;
+ k = p = 1;
+ }
+ }
+ *period = p;
+
+ /* Perform reverse lexicographic search. */
+ max_suffix_rev = SIZE_MAX;
+ j = 0;
+ k = p = 1;
+ while (j + k < needle_len)
+ {
+ a = CANON_ELEMENT (needle[j + k]);
+ b = CANON_ELEMENT (needle[max_suffix_rev + k]);
+ if (b < a)
+ {
+ /* Suffix is smaller, period is entire prefix so far. */
+ j += k;
+ k = 1;
+ p = j - max_suffix_rev;
+ }
+ else if (a == b)
+ {
+ /* Advance through repetition of the current period. */
+ if (k != p)
+ ++k;
+ else
+ {
+ j += p;
+ k = 1;
+ }
+ }
+ else /* a < b */
+ {
+ /* Suffix is larger, start over from current location. */
+ max_suffix_rev = j++;
+ k = p = 1;
+ }
+ }
+
+ /* Choose the longer suffix. Return the first byte of the right
+ half, rather than the last byte of the left half. */
+ if (max_suffix_rev + 1 < max_suffix + 1)
+ return max_suffix + 1;
+ *period = p;
+ return max_suffix_rev + 1;
+}
+
+/* Return the first location of non-empty NEEDLE within HAYSTACK, or
+ NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
+ method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD.
+ Performance is guaranteed to be linear, with an initialization cost
+ of 2 * NEEDLE_LEN comparisons.
+
+ If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
+ most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching.
+ If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
+ HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */
+static RETURN_TYPE
+two_way_short_needle (const unsigned char *haystack, size_t haystack_len,
+ const unsigned char *needle, size_t needle_len)
+{
+ size_t i; /* Index into current byte of NEEDLE. */
+ size_t j; /* Index into current window of HAYSTACK. */
+ size_t period; /* The period of the right half of needle. */
+ size_t suffix; /* The index of the right half of needle. */
+
+ /* Factor the needle into two halves, such that the left half is
+ smaller than the global period, and the right half is
+ periodic (with a period as large as NEEDLE_LEN - suffix). */
+ suffix = critical_factorization (needle, needle_len, &period);
+
+ /* Perform the search. Each iteration compares the right half
+ first. */
+ if (CMP_FUNC (needle, needle + period, suffix) == 0)
+ {
+ /* Entire needle is periodic; a mismatch can only advance by the
+ period, so use memory to avoid rescanning known occurrences
+ of the period. */
+ size_t memory = 0;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Scan for matches in right half. */
+ i = MAX (suffix, memory);
+ while (i < needle_len && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (memory < i + 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i + 1 < memory + 1)
+ return (RETURN_TYPE) (haystack + j);
+ /* No match, so remember how many repetitions of period
+ on the right half were scanned. */
+ j += period;
+ memory = needle_len - period;
+ }
+ else
+ {
+ j += i - suffix + 1;
+ memory = 0;
+ }
+ }
+ }
+ else
+ {
+ /* The two halves of needle are distinct; no extra memory is
+ required, and any mismatch results in a maximal shift. */
+ period = MAX (suffix, needle_len - suffix) + 1;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Scan for matches in right half. */
+ i = suffix;
+ while (i < needle_len && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i == SIZE_MAX)
+ return (RETURN_TYPE) (haystack + j);
+ j += period;
+ }
+ else
+ j += i - suffix + 1;
+ }
+ }
+ return NULL;
+}
+
+/* Return the first location of non-empty NEEDLE within HAYSTACK, or
+ NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
+ method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN.
+ Performance is guaranteed to be linear, with an initialization cost
+ of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations.
+
+ If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
+ most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching,
+ and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible.
+ If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
+ HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and
+ sublinear performance is not possible. */
+static RETURN_TYPE
+two_way_long_needle (const unsigned char *haystack, size_t haystack_len,
+ const unsigned char *needle, size_t needle_len)
+{
+ size_t i; /* Index into current byte of NEEDLE. */
+ size_t j; /* Index into current window of HAYSTACK. */
+ size_t period; /* The period of the right half of needle. */
+ size_t suffix; /* The index of the right half of needle. */
+ size_t shift_table[1U << CHAR_BIT]; /* See below. */
+
+ /* Factor the needle into two halves, such that the left half is
+ smaller than the global period, and the right half is
+ periodic (with a period as large as NEEDLE_LEN - suffix). */
+ suffix = critical_factorization (needle, needle_len, &period);
+
+ /* Populate shift_table. For each possible byte value c,
+ shift_table[c] is the distance from the last occurrence of c to
+ the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE.
+ shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */
+ for (i = 0; i < 1U << CHAR_BIT; i++)
+ shift_table[i] = needle_len;
+ for (i = 0; i < needle_len; i++)
+ shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1;
+
+ /* Perform the search. Each iteration compares the right half
+ first. */
+ if (CMP_FUNC (needle, needle + period, suffix) == 0)
+ {
+ /* Entire needle is periodic; a mismatch can only advance by the
+ period, so use memory to avoid rescanning known occurrences
+ of the period. */
+ size_t memory = 0;
+ size_t shift;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Check the last byte first; if it does not match, then
+ shift to the next possible match location. */
+ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
+ if (0 < shift)
+ {
+ if (memory && shift < period)
+ {
+ /* Since needle is periodic, but the last period has
+ a byte out of place, there can be no match until
+ after the mismatch. */
+ shift = needle_len - period;
+ memory = 0;
+ }
+ j += shift;
+ continue;
+ }
+ /* Scan for matches in right half. The last byte has
+ already been matched, by virtue of the shift table. */
+ i = MAX (suffix, memory);
+ while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len - 1 <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (memory < i + 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i + 1 < memory + 1)
+ return (RETURN_TYPE) (haystack + j);
+ /* No match, so remember how many repetitions of period
+ on the right half were scanned. */
+ j += period;
+ memory = needle_len - period;
+ }
+ else
+ {
+ j += i - suffix + 1;
+ memory = 0;
+ }
+ }
+ }
+ else
+ {
+ /* The two halves of needle are distinct; no extra memory is
+ required, and any mismatch results in a maximal shift. */
+ size_t shift;
+ period = MAX (suffix, needle_len - suffix) + 1;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Check the last byte first; if it does not match, then
+ shift to the next possible match location. */
+ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
+ if (0 < shift)
+ {
+ j += shift;
+ continue;
+ }
+ /* Scan for matches in right half. The last byte has
+ already been matched, by virtue of the shift table. */
+ i = suffix;
+ while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len - 1 <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i == SIZE_MAX)
+ return (RETURN_TYPE) (haystack + j);
+ j += period;
+ }
+ else
+ j += i - suffix + 1;
+ }
+ }
+ return NULL;
+}
+
+#undef AVAILABLE
+#undef CANON_ELEMENT
+#undef CMP_FUNC
+#undef MAX
+#undef RETURN_TYPE
diff --git a/gnulib/lib/strcasecmp.c b/gnulib/lib/strcasecmp.c
new file mode 100644
index 00000000..ab196718
--- /dev/null
+++ b/gnulib/lib/strcasecmp.c
@@ -0,0 +1,63 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2.
+ Note: This function does not work with multibyte strings! */
+
+int
+strcasecmp (const char *s1, const char *s2)
+{
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/gnulib/lib/strcasestr.c b/gnulib/lib/strcasestr.c
new file mode 100644
index 00000000..e1b497c6
--- /dev/null
+++ b/gnulib/lib/strcasestr.c
@@ -0,0 +1,83 @@
+/* Case-insensitive searching in a string.
+ Copyright (C) 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <strings.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Two-Way algorithm. */
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#define CANON_ELEMENT(c) TOLOWER (c)
+#define CMP_FUNC(p1, p2, l) \
+ strncasecmp ((const char *) (p1), (const char *) (p2), l)
+#include "str-two-way.h"
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using
+ case-insensitive comparison. This function gives unspecified
+ results in multibyte locales. */
+char *
+strcasestr (const char *haystack_start, const char *needle_start)
+{
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
+
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
+ {
+ ok &= (TOLOWER ((unsigned char) *haystack)
+ == TOLOWER ((unsigned char) *needle));
+ haystack++;
+ needle++;
+ }
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
+ needle_len = needle - needle_start;
+ haystack = haystack_start + 1;
+ haystack_len = needle_len - 1;
+
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/gnulib/lib/strchrnul.c b/gnulib/lib/strchrnul.c
new file mode 100644
index 00000000..f834d343
--- /dev/null
+++ b/gnulib/lib/strchrnul.c
@@ -0,0 +1,142 @@
+/* Searching in a string.
+ Copyright (C) 2003, 2007, 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Find the first occurrence of C in S or the final NUL byte. */
+char *
+strchrnul (const char *s, int c_in)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned char c;
+
+ c = (unsigned char) c_in;
+ if (!c)
+ return rawmemchr (s, 0);
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ (size_t) char_ptr % sizeof (longword) != 0;
+ ++char_ptr)
+ if (!*char_ptr || *char_ptr == c)
+ return (char *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will
+ test a longword at a time. The tricky part is testing if *any of
+ the four* bytes in the longword in question are equal to NUL or
+ c. We first use an xor with repeated_c. This reduces the task
+ to testing whether *any of the four* bytes in longword1 or
+ longword2 is zero.
+
+ Let's consider longword1. We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ The test whether any byte in longword1 or longword2 is zero is equivalent
+ to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine
+ this into a single test, whether (tmp1 | tmp2) is nonzero.
+
+ This test can read more than one byte beyond the end of a string,
+ depending on where the terminating NUL is encountered. However,
+ this is considered safe since the initialization phase ensured
+ that the read will be aligned, therefore, the read will not cross
+ page boundaries and will not cause a fault. */
+
+ while (1)
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+ longword longword2 = *longword_ptr;
+
+ if (((((longword1 - repeated_one) & ~longword1)
+ | ((longword2 - repeated_one) & ~longword2))
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that one of the sizeof (longword) bytes
+ starting at char_ptr is == 0 or == c. On little-endian machines,
+ we could determine the first such byte without any further memory
+ accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines.
+ Choose code that works in both cases. */
+
+ char_ptr = (unsigned char *) longword_ptr;
+ while (*char_ptr && (*char_ptr != c))
+ char_ptr++;
+ return (char *) char_ptr;
+}
diff --git a/gnulib/lib/strchrnul.valgrind b/gnulib/lib/strchrnul.valgrind
new file mode 100644
index 00000000..b14fa130
--- /dev/null
+++ b/gnulib/lib/strchrnul.valgrind
@@ -0,0 +1,12 @@
+# Suppress a valgrind message about use of uninitialized memory in strchrnul().
+# This use is OK because it provides only a speedup.
+{
+ strchrnul-value4
+ Memcheck:Value4
+ fun:strchrnul
+}
+{
+ strchrnul-value8
+ Memcheck:Value8
+ fun:strchrnul
+}
diff --git a/gnulib/lib/strcspn.c b/gnulib/lib/strcspn.c
new file mode 100644
index 00000000..a807a490
--- /dev/null
+++ b/gnulib/lib/strcspn.c
@@ -0,0 +1,41 @@
+/* Copyright (C) 1991, 1994, 1996-1997, 2002-2003, 2005-2006, 2009-2010 Free
+ * Software Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ 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 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/>. */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <string.h>
+
+#undef strcspn
+
+/* Return the length of the maximum initial segment of S
+ which contains no characters from REJECT. */
+size_t
+strcspn (const char *s, const char *reject)
+{
+ size_t count = 0;
+
+ while (*s != '\0')
+ if (strchr (reject, *s++) == NULL)
+ ++count;
+ else
+ return count;
+
+ return count;
+}
diff --git a/gnulib/lib/strdup.c b/gnulib/lib/strdup.c
new file mode 100644
index 00000000..bbb69e35
--- /dev/null
+++ b/gnulib/lib/strdup.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 1991, 1996, 1997, 1998, 2002, 2003, 2004, 2006, 2007, 2009,
+ 2010 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Get specification. */
+#include <string.h>
+
+#include <stdlib.h>
+
+#undef __strdup
+#ifdef _LIBC
+# undef strdup
+#endif
+
+#ifndef weak_alias
+# define __strdup strdup
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+char *
+__strdup (const char *s)
+{
+ size_t len = strlen (s) + 1;
+ void *new = malloc (len);
+
+ if (new == NULL)
+ return NULL;
+
+ return (char *) memcpy (new, s, len);
+}
+#ifdef libc_hidden_def
+libc_hidden_def (__strdup)
+#endif
+#ifdef weak_alias
+weak_alias (__strdup, strdup)
+#endif
diff --git a/gnulib/lib/streq.h b/gnulib/lib/streq.h
new file mode 100644
index 00000000..87915988
--- /dev/null
+++ b/gnulib/lib/streq.h
@@ -0,0 +1,176 @@
+/* Optimized string comparison.
+ Copyright (C) 2001-2002, 2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#ifndef _GL_STREQ_H
+#define _GL_STREQ_H
+
+#include <string.h>
+
+/* STREQ allows to optimize string comparison with a small literal string.
+ STREQ (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ is semantically equivalent to
+ strcmp (s, "EUC-KR") == 0
+ just faster. */
+
+/* Help GCC to generate good code for string comparisons with
+ immediate strings. */
+#if defined (__GNUC__) && defined (__OPTIMIZE__)
+
+static inline int
+streq9 (const char *s1, const char *s2)
+{
+ return strcmp (s1 + 9, s2 + 9) == 0;
+}
+
+static inline int
+streq8 (const char *s1, const char *s2, char s28)
+{
+ if (s1[8] == s28)
+ {
+ if (s28 == 0)
+ return 1;
+ else
+ return streq9 (s1, s2);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq7 (const char *s1, const char *s2, char s27, char s28)
+{
+ if (s1[7] == s27)
+ {
+ if (s27 == 0)
+ return 1;
+ else
+ return streq8 (s1, s2, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
+{
+ if (s1[6] == s26)
+ {
+ if (s26 == 0)
+ return 1;
+ else
+ return streq7 (s1, s2, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
+{
+ if (s1[5] == s25)
+ {
+ if (s25 == 0)
+ return 1;
+ else
+ return streq6 (s1, s2, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[4] == s24)
+ {
+ if (s24 == 0)
+ return 1;
+ else
+ return streq5 (s1, s2, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[3] == s23)
+ {
+ if (s23 == 0)
+ return 1;
+ else
+ return streq4 (s1, s2, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[2] == s22)
+ {
+ if (s22 == 0)
+ return 1;
+ else
+ return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[1] == s21)
+ {
+ if (s21 == 0)
+ return 1;
+ else
+ return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[0] == s20)
+ {
+ if (s20 == 0)
+ return 1;
+ else
+ return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+#define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
+
+#else
+
+#define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ (strcmp (s1, s2) == 0)
+
+#endif
+
+#endif /* _GL_STREQ_H */
diff --git a/gnulib/lib/strerror.c b/gnulib/lib/strerror.c
new file mode 100644
index 00000000..b0df7784
--- /dev/null
+++ b/gnulib/lib/strerror.c
@@ -0,0 +1,347 @@
+/* strerror.c --- POSIX compatible system error routine
+
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#if REPLACE_STRERROR
+
+# include <errno.h>
+# include <stdio.h>
+
+# if GNULIB_defined_ESOCK /* native Windows platforms */
+# if HAVE_WINSOCK2_H
+# include <winsock2.h>
+# endif
+# endif
+
+# include "intprops.h"
+
+# undef strerror
+# if ! HAVE_DECL_STRERROR
+# define strerror(n) NULL
+# endif
+
+char *
+rpl_strerror (int n)
+{
+ char const *msg = NULL;
+ /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */
+ switch (n)
+ {
+# if GNULIB_defined_ETXTBSY
+ case ETXTBSY:
+ msg = "Text file busy";
+ break;
+# endif
+
+# if GNULIB_defined_ESOCK /* native Windows platforms */
+ /* EWOULDBLOCK is the same as EAGAIN. */
+ case EINPROGRESS:
+ msg = "Operation now in progress";
+ break;
+ case EALREADY:
+ msg = "Operation already in progress";
+ break;
+ case ENOTSOCK:
+ msg = "Socket operation on non-socket";
+ break;
+ case EDESTADDRREQ:
+ msg = "Destination address required";
+ break;
+ case EMSGSIZE:
+ msg = "Message too long";
+ break;
+ case EPROTOTYPE:
+ msg = "Protocol wrong type for socket";
+ break;
+ case ENOPROTOOPT:
+ msg = "Protocol not available";
+ break;
+ case EPROTONOSUPPORT:
+ msg = "Protocol not supported";
+ break;
+ case ESOCKTNOSUPPORT:
+ msg = "Socket type not supported";
+ break;
+ case EOPNOTSUPP:
+ msg = "Operation not supported";
+ break;
+ case EPFNOSUPPORT:
+ msg = "Protocol family not supported";
+ break;
+ case EAFNOSUPPORT:
+ msg = "Address family not supported by protocol";
+ break;
+ case EADDRINUSE:
+ msg = "Address already in use";
+ break;
+ case EADDRNOTAVAIL:
+ msg = "Cannot assign requested address";
+ break;
+ case ENETDOWN:
+ msg = "Network is down";
+ break;
+ case ENETUNREACH:
+ msg = "Network is unreachable";
+ break;
+ case ENETRESET:
+ msg = "Network dropped connection on reset";
+ break;
+ case ECONNABORTED:
+ msg = "Software caused connection abort";
+ break;
+ case ECONNRESET:
+ msg = "Connection reset by peer";
+ break;
+ case ENOBUFS:
+ msg = "No buffer space available";
+ break;
+ case EISCONN:
+ msg = "Transport endpoint is already connected";
+ break;
+ case ENOTCONN:
+ msg = "Transport endpoint is not connected";
+ break;
+ case ESHUTDOWN:
+ msg = "Cannot send after transport endpoint shutdown";
+ break;
+ case ETOOMANYREFS:
+ msg = "Too many references: cannot splice";
+ break;
+ case ETIMEDOUT:
+ msg = "Connection timed out";
+ break;
+ case ECONNREFUSED:
+ msg = "Connection refused";
+ break;
+ case ELOOP:
+ msg = "Too many levels of symbolic links";
+ break;
+ case EHOSTDOWN:
+ msg = "Host is down";
+ break;
+ case EHOSTUNREACH:
+ msg = "No route to host";
+ break;
+ case EPROCLIM:
+ msg = "Too many processes";
+ break;
+ case EUSERS:
+ msg = "Too many users";
+ break;
+ case EDQUOT:
+ msg = "Disk quota exceeded";
+ break;
+ case ESTALE:
+ msg = "Stale NFS file handle";
+ break;
+ case EREMOTE:
+ msg = "Object is remote";
+ break;
+# if HAVE_WINSOCK2_H
+ /* WSA_INVALID_HANDLE maps to EBADF */
+ /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */
+ /* WSA_INVALID_PARAMETER maps to EINVAL */
+ case WSA_OPERATION_ABORTED:
+ msg = "Overlapped operation aborted";
+ break;
+ case WSA_IO_INCOMPLETE:
+ msg = "Overlapped I/O event object not in signaled state";
+ break;
+ case WSA_IO_PENDING:
+ msg = "Overlapped operations will complete later";
+ break;
+ /* WSAEINTR maps to EINTR */
+ /* WSAEBADF maps to EBADF */
+ /* WSAEACCES maps to EACCES */
+ /* WSAEFAULT maps to EFAULT */
+ /* WSAEINVAL maps to EINVAL */
+ /* WSAEMFILE maps to EMFILE */
+ /* WSAEWOULDBLOCK maps to EWOULDBLOCK */
+ /* WSAEINPROGRESS is EINPROGRESS */
+ /* WSAEALREADY is EALREADY */
+ /* WSAENOTSOCK is ENOTSOCK */
+ /* WSAEDESTADDRREQ is EDESTADDRREQ */
+ /* WSAEMSGSIZE is EMSGSIZE */
+ /* WSAEPROTOTYPE is EPROTOTYPE */
+ /* WSAENOPROTOOPT is ENOPROTOOPT */
+ /* WSAEPROTONOSUPPORT is EPROTONOSUPPORT */
+ /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */
+ /* WSAEOPNOTSUPP is EOPNOTSUPP */
+ /* WSAEPFNOSUPPORT is EPFNOSUPPORT */
+ /* WSAEAFNOSUPPORT is EAFNOSUPPORT */
+ /* WSAEADDRINUSE is EADDRINUSE */
+ /* WSAEADDRNOTAVAIL is EADDRNOTAVAIL */
+ /* WSAENETDOWN is ENETDOWN */
+ /* WSAENETUNREACH is ENETUNREACH */
+ /* WSAENETRESET is ENETRESET */
+ /* WSAECONNABORTED is ECONNABORTED */
+ /* WSAECONNRESET is ECONNRESET */
+ /* WSAENOBUFS is ENOBUFS */
+ /* WSAEISCONN is EISCONN */
+ /* WSAENOTCONN is ENOTCONN */
+ /* WSAESHUTDOWN is ESHUTDOWN */
+ /* WSAETOOMANYREFS is ETOOMANYREFS */
+ /* WSAETIMEDOUT is ETIMEDOUT */
+ /* WSAECONNREFUSED is ECONNREFUSED */
+ /* WSAELOOP is ELOOP */
+ /* WSAENAMETOOLONG maps to ENAMETOOLONG */
+ /* WSAEHOSTDOWN is EHOSTDOWN */
+ /* WSAEHOSTUNREACH is EHOSTUNREACH */
+ /* WSAENOTEMPTY maps to ENOTEMPTY */
+ /* WSAEPROCLIM is EPROCLIM */
+ /* WSAEUSERS is EUSERS */
+ /* WSAEDQUOT is EDQUOT */
+ /* WSAESTALE is ESTALE */
+ /* WSAEREMOTE is EREMOTE */
+ case WSASYSNOTREADY:
+ msg = "Network subsystem is unavailable";
+ break;
+ case WSAVERNOTSUPPORTED:
+ msg = "Winsock.dll version out of range";
+ break;
+ case WSANOTINITIALISED:
+ msg = "Successful WSAStartup not yet performed";
+ break;
+ case WSAEDISCON:
+ msg = "Graceful shutdown in progress";
+ break;
+ case WSAENOMORE: case WSA_E_NO_MORE:
+ msg = "No more results";
+ break;
+ case WSAECANCELLED: case WSA_E_CANCELLED:
+ msg = "Call was canceled";
+ break;
+ case WSAEINVALIDPROCTABLE:
+ msg = "Procedure call table is invalid";
+ break;
+ case WSAEINVALIDPROVIDER:
+ msg = "Service provider is invalid";
+ break;
+ case WSAEPROVIDERFAILEDINIT:
+ msg = "Service provider failed to initialize";
+ break;
+ case WSASYSCALLFAILURE:
+ msg = "System call failure";
+ break;
+ case WSASERVICE_NOT_FOUND:
+ msg = "Service not found";
+ break;
+ case WSATYPE_NOT_FOUND:
+ msg = "Class type not found";
+ break;
+ case WSAEREFUSED:
+ msg = "Database query was refused";
+ break;
+ case WSAHOST_NOT_FOUND:
+ msg = "Host not found";
+ break;
+ case WSATRY_AGAIN:
+ msg = "Nonauthoritative host not found";
+ break;
+ case WSANO_RECOVERY:
+ msg = "Nonrecoverable error";
+ break;
+ case WSANO_DATA:
+ msg = "Valid name, no data record of requested type";
+ break;
+ /* WSA_QOS_* omitted */
+# endif
+# endif
+
+# if GNULIB_defined_ENOMSG
+ case ENOMSG:
+ msg = "No message of desired type";
+ break;
+# endif
+
+# if GNULIB_defined_EIDRM
+ case EIDRM:
+ msg = "Identifier removed";
+ break;
+# endif
+
+# if GNULIB_defined_ENOLINK
+ case ENOLINK:
+ msg = "Link has been severed";
+ break;
+# endif
+
+# if GNULIB_defined_EPROTO
+ case EPROTO:
+ msg = "Protocol error";
+ break;
+# endif
+
+# if GNULIB_defined_EMULTIHOP
+ case EMULTIHOP:
+ msg = "Multihop attempted";
+ break;
+# endif
+
+# if GNULIB_defined_EBADMSG
+ case EBADMSG:
+ msg = "Bad message";
+ break;
+# endif
+
+# if GNULIB_defined_EOVERFLOW
+ case EOVERFLOW:
+ msg = "Value too large for defined data type";
+ break;
+# endif
+
+# if GNULIB_defined_ENOTSUP
+ case ENOTSUP:
+ msg = "Not supported";
+ break;
+# endif
+
+# if GNULIB_defined_ESTALE
+ case ESTALE:
+ msg = "Stale NFS file handle";
+ break;
+# endif
+
+# if GNULIB_defined_ECANCELED
+ case ECANCELED:
+ msg = "Operation canceled";
+ break;
+# endif
+ }
+
+ if (msg)
+ return (char *) msg;
+
+ {
+ char *result = strerror (n);
+
+ if (result == NULL || result[0] == '\0')
+ {
+ static char const fmt[] = "Unknown error (%d)";
+ static char msg_buf[sizeof fmt + INT_STRLEN_BOUND (n)];
+ sprintf (msg_buf, fmt, n);
+ return msg_buf;
+ }
+
+ return result;
+ }
+}
+
+#endif
diff --git a/gnulib/lib/strftime.c b/gnulib/lib/strftime.c
new file mode 100644
index 00000000..01c0c551
--- /dev/null
+++ b/gnulib/lib/strftime.c
@@ -0,0 +1,1465 @@
+/* Copyright (C) 1991-2001, 2003-2007, 2009-2010 Free Software Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ 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/>. */
+
+#ifdef _LIBC
+# define HAVE_STRUCT_ERA_ENTRY 1
+# define HAVE_TM_GMTOFF 1
+# define HAVE_TM_ZONE 1
+# define HAVE_TZNAME 1
+# define HAVE_TZSET 1
+# include "../locale/localeinfo.h"
+#else
+# include <config.h>
+# if FPRINTFTIME
+# include "ignore-value.h"
+# include "fprintftime.h"
+# else
+# include "strftime.h"
+# endif
+#endif
+
+#include <ctype.h>
+#include <time.h>
+
+#if HAVE_TZNAME && !HAVE_DECL_TZNAME
+extern char *tzname[];
+#endif
+
+/* Do multibyte processing if multibytes are supported, unless
+ multibyte sequences are safe in formats. Multibyte sequences are
+ safe if they cannot contain byte sequences that look like format
+ conversion specifications. The multibyte encodings used by the
+ C library on the various platforms (UTF-8, GB2312, GBK, CP936,
+ GB18030, EUC-TW, BIG5, BIG5-HKSCS, CP950, EUC-JP, EUC-KR, CP949,
+ SHIFT_JIS, CP932, JOHAB) are safe for formats, because the byte '%'
+ cannot occur in a multibyte character except in the first byte.
+ But this does not hold for the DEC-HANYU encoding used on OSF/1. */
+#if !defined __osf__
+# define MULTIBYTE_IS_FORMAT_SAFE 1
+#endif
+#define DO_MULTIBYTE (! MULTIBYTE_IS_FORMAT_SAFE)
+
+#if DO_MULTIBYTE
+# include <wchar.h>
+ static const mbstate_t mbstate_zero;
+#endif
+
+#include <limits.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef COMPILE_WIDE
+# include <endian.h>
+# define CHAR_T wchar_t
+# define UCHAR_T unsigned int
+# define L_(Str) L##Str
+# define NLW(Sym) _NL_W##Sym
+
+# define MEMCPY(d, s, n) __wmemcpy (d, s, n)
+# define STRLEN(s) __wcslen (s)
+
+#else
+# define CHAR_T char
+# define UCHAR_T unsigned char
+# define L_(Str) Str
+# define NLW(Sym) Sym
+
+# define MEMCPY(d, s, n) memcpy (d, s, n)
+# define STRLEN(s) strlen (s)
+
+#endif
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that INT_BITS is at least 32.
+
+ ISO C99 says that A >> B is implementation-defined if A < 0. Some
+ implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
+ right in the usual way when A < 0, so SHR falls back on division if
+ ordinary A >> B doesn't seem to be the usual signed shift. */
+#define SHR(a, b) \
+ (-1 >> 1 == -1 \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+/* Bound on length of the string representing an integer type or expression T.
+ Subtract 1 for the sign bit if t is signed; log10 (2.0) < 146/485;
+ add 1 for integer division truncation; add 1 more for a minus sign
+ if needed. */
+#define INT_STRLEN_BOUND(t) \
+ ((sizeof (t) * CHAR_BIT - 1) * 146 / 485 + 2)
+
+#define TM_YEAR_BASE 1900
+
+#ifndef __isleap
+/* Nonzero if YEAR is a leap year (every 4 years,
+ except every 100th isn't, and every 400th is). */
+# define __isleap(year) \
+ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
+#endif
+
+
+#ifdef _LIBC
+# define tzname __tzname
+# define tzset __tzset
+#endif
+
+#if !HAVE_TM_GMTOFF
+/* Portable standalone applications should supply a "time.h" that
+ declares a POSIX-compliant localtime_r, for the benefit of older
+ implementations that lack localtime_r or have a nonstandard one.
+ See the gnulib time_r module for one way to implement this. */
+# undef __gmtime_r
+# undef __localtime_r
+# define __gmtime_r gmtime_r
+# define __localtime_r localtime_r
+#endif
+
+
+#ifndef FPRINTFTIME
+# define FPRINTFTIME 0
+#endif
+
+#if FPRINTFTIME
+# define STREAM_OR_CHAR_T FILE
+# define STRFTIME_ARG(x) /* empty */
+#else
+# define STREAM_OR_CHAR_T CHAR_T
+# define STRFTIME_ARG(x) x,
+#endif
+
+#if FPRINTFTIME
+# define memset_byte(P, Len, Byte) \
+ do { size_t _i; for (_i = 0; _i < Len; _i++) fputc (Byte, P); } while (0)
+# define memset_space(P, Len) memset_byte (P, Len, ' ')
+# define memset_zero(P, Len) memset_byte (P, Len, '0')
+#elif defined COMPILE_WIDE
+# define memset_space(P, Len) (wmemset (P, L' ', Len), (P) += (Len))
+# define memset_zero(P, Len) (wmemset (P, L'0', Len), (P) += (Len))
+#else
+# define memset_space(P, Len) (memset (P, ' ', Len), (P) += (Len))
+# define memset_zero(P, Len) (memset (P, '0', Len), (P) += (Len))
+#endif
+
+#if FPRINTFTIME
+# define advance(P, N)
+#else
+# define advance(P, N) ((P) += (N))
+#endif
+
+#define add(n, f) \
+ do \
+ { \
+ int _n = (n); \
+ int _delta = width - _n; \
+ int _incr = _n + (_delta > 0 ? _delta : 0); \
+ if ((size_t) _incr >= maxsize - i) \
+ return 0; \
+ if (p) \
+ { \
+ if (digits == 0 && _delta > 0) \
+ { \
+ if (pad == L_('0')) \
+ memset_zero (p, _delta); \
+ else \
+ memset_space (p, _delta); \
+ } \
+ f; \
+ advance (p, _n); \
+ } \
+ i += _incr; \
+ } while (0)
+
+#if FPRINTFTIME
+# define add1(C) add (1, fputc (C, p))
+#else
+# define add1(C) add (1, *p = C)
+#endif
+
+#if FPRINTFTIME
+# define cpy(n, s) \
+ add ((n), \
+ do \
+ { \
+ if (to_lowcase) \
+ fwrite_lowcase (p, (s), _n); \
+ else if (to_uppcase) \
+ fwrite_uppcase (p, (s), _n); \
+ else \
+ { \
+ /* We are ignoring the value of fwrite here, in spite of the \
+ fact that technically, that may not be valid: the fwrite \
+ specification in POSIX 2008 defers to that of fputc, which \
+ is intended to be consistent with the one from ISO C, \
+ which permits failure due to ENOMEM *without* setting the \
+ stream's error indicator. */ \
+ ignore_value (fwrite ((s), _n, 1, p)); \
+ } \
+ } \
+ while (0) \
+ )
+#else
+# define cpy(n, s) \
+ add ((n), \
+ if (to_lowcase) \
+ memcpy_lowcase (p, (s), _n LOCALE_ARG); \
+ else if (to_uppcase) \
+ memcpy_uppcase (p, (s), _n LOCALE_ARG); \
+ else \
+ MEMCPY ((void *) p, (void const *) (s), _n))
+#endif
+
+#ifdef COMPILE_WIDE
+# ifndef USE_IN_EXTENDED_LOCALE_MODEL
+# undef __mbsrtowcs_l
+# define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st)
+# endif
+# define widen(os, ws, l) \
+ { \
+ mbstate_t __st; \
+ const char *__s = os; \
+ memset (&__st, '\0', sizeof (__st)); \
+ l = __mbsrtowcs_l (NULL, &__s, 0, &__st, loc); \
+ ws = (wchar_t *) alloca ((l + 1) * sizeof (wchar_t)); \
+ (void) __mbsrtowcs_l (ws, &__s, l, &__st, loc); \
+ }
+#endif
+
+
+#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
+/* We use this code also for the extended locale handling where the
+ function gets as an additional argument the locale which has to be
+ used. To access the values we have to redefine the _NL_CURRENT
+ macro. */
+# define strftime __strftime_l
+# define wcsftime __wcsftime_l
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].string)
+# define LOCALE_ARG , loc
+# define LOCALE_PARAM_PROTO , __locale_t loc
+# define HELPER_LOCALE_ARG , current
+#else
+# define LOCALE_PARAM_PROTO
+# define LOCALE_ARG
+# ifdef _LIBC
+# define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME)
+# else
+# define HELPER_LOCALE_ARG
+# endif
+#endif
+
+#ifdef COMPILE_WIDE
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define TOUPPER(Ch, L) __towupper_l (Ch, L)
+# define TOLOWER(Ch, L) __towlower_l (Ch, L)
+# else
+# define TOUPPER(Ch, L) towupper (Ch)
+# define TOLOWER(Ch, L) towlower (Ch)
+# endif
+#else
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define TOUPPER(Ch, L) __toupper_l (Ch, L)
+# define TOLOWER(Ch, L) __tolower_l (Ch, L)
+# else
+# define TOUPPER(Ch, L) toupper (Ch)
+# define TOLOWER(Ch, L) tolower (Ch)
+# endif
+#endif
+/* We don't use `isdigit' here since the locale dependent
+ interpretation is not what we want here. We only need to accept
+ the arabic digits in the ASCII range. One day there is perhaps a
+ more reliable way to accept other sets of digits. */
+#define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9)
+
+#if FPRINTFTIME
+static void
+fwrite_lowcase (FILE *fp, const CHAR_T *src, size_t len)
+{
+ while (len-- > 0)
+ {
+ fputc (TOLOWER ((UCHAR_T) *src, loc), fp);
+ ++src;
+ }
+}
+
+static void
+fwrite_uppcase (FILE *fp, const CHAR_T *src, size_t len)
+{
+ while (len-- > 0)
+ {
+ fputc (TOUPPER ((UCHAR_T) *src, loc), fp);
+ ++src;
+ }
+}
+#else
+static CHAR_T *
+memcpy_lowcase (CHAR_T *dest, const CHAR_T *src,
+ size_t len LOCALE_PARAM_PROTO)
+{
+ while (len-- > 0)
+ dest[len] = TOLOWER ((UCHAR_T) src[len], loc);
+ return dest;
+}
+
+static CHAR_T *
+memcpy_uppcase (CHAR_T *dest, const CHAR_T *src,
+ size_t len LOCALE_PARAM_PROTO)
+{
+ while (len-- > 0)
+ dest[len] = TOUPPER ((UCHAR_T) src[len], loc);
+ return dest;
+}
+#endif
+
+
+#if ! HAVE_TM_GMTOFF
+/* Yield the difference between *A and *B,
+ measured in seconds, ignoring leap seconds. */
+# define tm_diff ftime_tm_diff
+static int
+tm_diff (const struct tm *a, const struct tm *b)
+{
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid int overflow in leap day calculations,
+ but it's OK to assume that A and B are close to each other. */
+ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3);
+ int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3);
+ int a100 = a4 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 0);
+ int a400 = SHR (a100, 2);
+ int b400 = SHR (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+ int years = a->tm_year - b->tm_year;
+ int days = (365 * years + intervening_leap_days
+ + (a->tm_yday - b->tm_yday));
+ return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+ + (a->tm_min - b->tm_min))
+ + (a->tm_sec - b->tm_sec));
+}
+#endif /* ! HAVE_TM_GMTOFF */
+
+
+
+/* The number of days from the first day of the first ISO week of this
+ year to the year day YDAY with week day WDAY. ISO weeks start on
+ Monday; the first ISO week has the year's first Thursday. YDAY may
+ be as small as YDAY_MINIMUM. */
+#define ISO_WEEK_START_WDAY 1 /* Monday */
+#define ISO_WEEK1_WDAY 4 /* Thursday */
+#define YDAY_MINIMUM (-366)
+#ifdef __GNUC__
+__inline__
+#endif
+static int
+iso_week_days (int yday, int wday)
+{
+ /* Add enough to the first operand of % to make it nonnegative. */
+ int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
+ return (yday
+ - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
+ + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
+}
+
+
+/* When compiling this file, GNU applications can #define my_strftime
+ to a symbol (typically nstrftime) to get an extended strftime with
+ extra arguments UT and NS. Emacs is a special case for now, but
+ this Emacs-specific code can be removed once Emacs's config.h
+ defines my_strftime. */
+#if defined emacs && !defined my_strftime
+# define my_strftime nstrftime
+#endif
+
+#if FPRINTFTIME
+# undef my_strftime
+# define my_strftime fprintftime
+#endif
+
+#ifdef my_strftime
+# define extra_args , ut, ns
+# define extra_args_spec , int ut, int ns
+#else
+# if defined COMPILE_WIDE
+# define my_strftime wcsftime
+# define nl_get_alt_digit _nl_get_walt_digit
+# else
+# define my_strftime strftime
+# define nl_get_alt_digit _nl_get_alt_digit
+# endif
+# define extra_args
+# define extra_args_spec
+/* We don't have this information in general. */
+# define ut 0
+# define ns 0
+#endif
+
+
+/* Just like my_strftime, below, but with one more parameter, UPCASE,
+ to indicate that the result should be converted to upper case. */
+static size_t
+strftime_case_ (bool upcase, STREAM_OR_CHAR_T *s,
+ STRFTIME_ARG (size_t maxsize)
+ const CHAR_T *format,
+ const struct tm *tp extra_args_spec LOCALE_PARAM_PROTO)
+{
+#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
+ struct locale_data *const current = loc->__locales[LC_TIME];
+#endif
+#if FPRINTFTIME
+ size_t maxsize = (size_t) -1;
+#endif
+
+ int hour12 = tp->tm_hour;
+#ifdef _NL_CURRENT
+ /* We cannot make the following values variables since we must delay
+ the evaluation of these values until really needed since some
+ expressions might not be valid in every situation. The `struct tm'
+ might be generated by a strptime() call that initialized
+ only a few elements. Dereference the pointers only if the format
+ requires this. Then it is ok to fail if the pointers are invalid. */
+# define a_wkday \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))
+# define f_wkday \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))
+# define a_month \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))
+# define f_month \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))
+# define ampm \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \
+ ? NLW(PM_STR) : NLW(AM_STR)))
+
+# define aw_len STRLEN (a_wkday)
+# define am_len STRLEN (a_month)
+# define ap_len STRLEN (ampm)
+#endif
+ const char *zone;
+ size_t i = 0;
+ STREAM_OR_CHAR_T *p = s;
+ const CHAR_T *f;
+#if DO_MULTIBYTE && !defined COMPILE_WIDE
+ const char *format_end = NULL;
+#endif
+
+#if ! defined _LIBC && ! HAVE_RUN_TZSET_TEST
+ /* Solaris 2.5.x and 2.6 tzset sometimes modify the storage returned
+ by localtime. On such systems, we must either use the tzset and
+ localtime wrappers to work around the bug (which sets
+ HAVE_RUN_TZSET_TEST) or make a copy of the structure. */
+ struct tm copy = *tp;
+ tp = &copy;
+#endif
+
+ zone = NULL;
+#if HAVE_TM_ZONE
+ /* The POSIX test suite assumes that setting
+ the environment variable TZ to a new value before calling strftime()
+ will influence the result (the %Z format) even if the information in
+ TP is computed with a totally different time zone.
+ This is bogus: though POSIX allows bad behavior like this,
+ POSIX does not require it. Do the right thing instead. */
+ zone = (const char *) tp->tm_zone;
+#endif
+#if HAVE_TZNAME
+ if (ut)
+ {
+ if (! (zone && *zone))
+ zone = "GMT";
+ }
+ else
+ {
+ /* POSIX.1 requires that local time zone information be used as
+ though strftime called tzset. */
+# if HAVE_TZSET
+ tzset ();
+# endif
+ }
+#endif
+
+ if (hour12 > 12)
+ hour12 -= 12;
+ else
+ if (hour12 == 0)
+ hour12 = 12;
+
+ for (f = format; *f != '\0'; ++f)
+ {
+ int pad = 0; /* Padding for number ('-', '_', or 0). */
+ int modifier; /* Field modifier ('E', 'O', or 0). */
+ int digits = 0; /* Max digits for numeric format. */
+ int number_value; /* Numeric value to be printed. */
+ unsigned int u_number_value; /* (unsigned int) number_value. */
+ bool negative_number; /* The number is negative. */
+ bool always_output_a_sign; /* +/- should always be output. */
+ int tz_colon_mask; /* Bitmask of where ':' should appear. */
+ const CHAR_T *subfmt;
+ CHAR_T sign_char;
+ CHAR_T *bufp;
+ CHAR_T buf[1
+ + 2 /* for the two colons in a %::z or %:::z time zone */
+ + (sizeof (int) < sizeof (time_t)
+ ? INT_STRLEN_BOUND (time_t)
+ : INT_STRLEN_BOUND (int))];
+ int width = -1;
+ bool to_lowcase = false;
+ bool to_uppcase = upcase;
+ size_t colons;
+ bool change_case = false;
+ int format_char;
+
+#if DO_MULTIBYTE && !defined COMPILE_WIDE
+ switch (*f)
+ {
+ case L_('%'):
+ break;
+
+ case L_('\b'): case L_('\t'): case L_('\n'):
+ case L_('\v'): case L_('\f'): case L_('\r'):
+ case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'):
+ case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'):
+ case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'):
+ case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'):
+ case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'):
+ case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'):
+ case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'):
+ case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'):
+ case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'):
+ case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'):
+ case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'):
+ case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'):
+ case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'):
+ case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'):
+ case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'):
+ case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'):
+ case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'):
+ case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'):
+ case L_('~'):
+ /* The C Standard requires these 98 characters (plus '%') to
+ be in the basic execution character set. None of these
+ characters can start a multibyte sequence, so they need
+ not be analyzed further. */
+ add1 (*f);
+ continue;
+
+ default:
+ /* Copy this multibyte sequence until we reach its end, find
+ an error, or come back to the initial shift state. */
+ {
+ mbstate_t mbstate = mbstate_zero;
+ size_t len = 0;
+ size_t fsize;
+
+ if (! format_end)
+ format_end = f + strlen (f) + 1;
+ fsize = format_end - f;
+
+ do
+ {
+ size_t bytes = mbrlen (f + len, fsize - len, &mbstate);
+
+ if (bytes == 0)
+ break;
+
+ if (bytes == (size_t) -2)
+ {
+ len += strlen (f + len);
+ break;
+ }
+
+ if (bytes == (size_t) -1)
+ {
+ len++;
+ break;
+ }
+
+ len += bytes;
+ }
+ while (! mbsinit (&mbstate));
+
+ cpy (len, f);
+ f += len - 1;
+ continue;
+ }
+ }
+
+#else /* ! DO_MULTIBYTE */
+
+ /* Either multibyte encodings are not supported, they are
+ safe for formats, so any non-'%' byte can be copied through,
+ or this is the wide character version. */
+ if (*f != L_('%'))
+ {
+ add1 (*f);
+ continue;
+ }
+
+#endif /* ! DO_MULTIBYTE */
+
+ /* Check for flags that can modify a format. */
+ while (1)
+ {
+ switch (*++f)
+ {
+ /* This influences the number formats. */
+ case L_('_'):
+ case L_('-'):
+ case L_('0'):
+ pad = *f;
+ continue;
+
+ /* This changes textual output. */
+ case L_('^'):
+ to_uppcase = true;
+ continue;
+ case L_('#'):
+ change_case = true;
+ continue;
+
+ default:
+ break;
+ }
+ break;
+ }
+
+ /* As a GNU extension we allow to specify the field width. */
+ if (ISDIGIT (*f))
+ {
+ width = 0;
+ do
+ {
+ if (width > INT_MAX / 10
+ || (width == INT_MAX / 10 && *f - L_('0') > INT_MAX % 10))
+ /* Avoid overflow. */
+ width = INT_MAX;
+ else
+ {
+ width *= 10;
+ width += *f - L_('0');
+ }
+ ++f;
+ }
+ while (ISDIGIT (*f));
+ }
+
+ /* Check for modifiers. */
+ switch (*f)
+ {
+ case L_('E'):
+ case L_('O'):
+ modifier = *f++;
+ break;
+
+ default:
+ modifier = 0;
+ break;
+ }
+
+ /* Now do the specified format. */
+ format_char = *f;
+ switch (format_char)
+ {
+#define DO_NUMBER(d, v) \
+ digits = d; \
+ number_value = v; goto do_number
+#define DO_SIGNED_NUMBER(d, negative, v) \
+ digits = d; \
+ negative_number = negative; \
+ u_number_value = v; goto do_signed_number
+
+ /* The mask is not what you might think.
+ When the ordinal i'th bit is set, insert a colon
+ before the i'th digit of the time zone representation. */
+#define DO_TZ_OFFSET(d, negative, mask, v) \
+ digits = d; \
+ negative_number = negative; \
+ tz_colon_mask = mask; \
+ u_number_value = v; goto do_tz_offset
+#define DO_NUMBER_SPACEPAD(d, v) \
+ digits = d; \
+ number_value = v; goto do_number_spacepad
+
+ case L_('%'):
+ if (modifier != 0)
+ goto bad_format;
+ add1 (*f);
+ break;
+
+ case L_('a'):
+ if (modifier != 0)
+ goto bad_format;
+ if (change_case)
+ {
+ to_uppcase = true;
+ to_lowcase = false;
+ }
+#ifdef _NL_CURRENT
+ cpy (aw_len, a_wkday);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case 'A':
+ if (modifier != 0)
+ goto bad_format;
+ if (change_case)
+ {
+ to_uppcase = true;
+ to_lowcase = false;
+ }
+#ifdef _NL_CURRENT
+ cpy (STRLEN (f_wkday), f_wkday);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('b'):
+ case L_('h'):
+ if (change_case)
+ {
+ to_uppcase = true;
+ to_lowcase = false;
+ }
+ if (modifier != 0)
+ goto bad_format;
+#ifdef _NL_CURRENT
+ cpy (am_len, a_month);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('B'):
+ if (modifier != 0)
+ goto bad_format;
+ if (change_case)
+ {
+ to_uppcase = true;
+ to_lowcase = false;
+ }
+#ifdef _NL_CURRENT
+ cpy (STRLEN (f_month), f_month);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('c'):
+ if (modifier == L_('O'))
+ goto bad_format;
+#ifdef _NL_CURRENT
+ if (! (modifier == 'E'
+ && (*(subfmt =
+ (const CHAR_T *) _NL_CURRENT (LC_TIME,
+ NLW(ERA_D_T_FMT)))
+ != '\0')))
+ subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT));
+#else
+ goto underlying_strftime;
+#endif
+
+ subformat:
+ {
+ size_t len = strftime_case_ (to_uppcase,
+ NULL, STRFTIME_ARG ((size_t) -1)
+ subfmt,
+ tp extra_args LOCALE_ARG);
+ add (len, strftime_case_ (to_uppcase, p,
+ STRFTIME_ARG (maxsize - i)
+ subfmt,
+ tp extra_args LOCALE_ARG));
+ }
+ break;
+
+#if !(defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY)
+ underlying_strftime:
+ {
+ /* The relevant information is available only via the
+ underlying strftime implementation, so use that. */
+ char ufmt[5];
+ char *u = ufmt;
+ char ubuf[1024]; /* enough for any single format in practice */
+ size_t len;
+ /* Make sure we're calling the actual underlying strftime.
+ In some cases, config.h contains something like
+ "#define strftime rpl_strftime". */
+# ifdef strftime
+# undef strftime
+ size_t strftime ();
+# endif
+
+ /* The space helps distinguish strftime failure from empty
+ output. */
+ *u++ = ' ';
+ *u++ = '%';
+ if (modifier != 0)
+ *u++ = modifier;
+ *u++ = format_char;
+ *u = '\0';
+ len = strftime (ubuf, sizeof ubuf, ufmt, tp);
+ if (len != 0)
+ cpy (len - 1, ubuf + 1);
+ }
+ break;
+#endif
+
+ case L_('C'):
+ if (modifier == L_('O'))
+ goto bad_format;
+ if (modifier == L_('E'))
+ {
+#if HAVE_STRUCT_ERA_ENTRY
+ struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+ if (era)
+ {
+# ifdef COMPILE_WIDE
+ size_t len = __wcslen (era->era_wname);
+ cpy (len, era->era_wname);
+# else
+ size_t len = strlen (era->era_name);
+ cpy (len, era->era_name);
+# endif
+ break;
+ }
+#else
+ goto underlying_strftime;
+#endif
+ }
+
+ {
+ int century = tp->tm_year / 100 + TM_YEAR_BASE / 100;
+ century -= tp->tm_year % 100 < 0 && 0 < century;
+ DO_SIGNED_NUMBER (2, tp->tm_year < - TM_YEAR_BASE, century);
+ }
+
+ case L_('x'):
+ if (modifier == L_('O'))
+ goto bad_format;
+#ifdef _NL_CURRENT
+ if (! (modifier == L_('E')
+ && (*(subfmt =
+ (const CHAR_T *)_NL_CURRENT (LC_TIME, NLW(ERA_D_FMT)))
+ != L_('\0'))))
+ subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT));
+ goto subformat;
+#else
+ goto underlying_strftime;
+#endif
+ case L_('D'):
+ if (modifier != 0)
+ goto bad_format;
+ subfmt = L_("%m/%d/%y");
+ goto subformat;
+
+ case L_('d'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_mday);
+
+ case L_('e'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER_SPACEPAD (2, tp->tm_mday);
+
+ /* All numeric formats set DIGITS and NUMBER_VALUE (or U_NUMBER_VALUE)
+ and then jump to one of these labels. */
+
+ do_tz_offset:
+ always_output_a_sign = true;
+ goto do_number_body;
+
+ do_number_spacepad:
+ /* Force `_' flag unless overridden by `0' or `-' flag. */
+ if (pad != L_('0') && pad != L_('-'))
+ pad = L_('_');
+
+ do_number:
+ /* Format NUMBER_VALUE according to the MODIFIER flag. */
+ negative_number = number_value < 0;
+ u_number_value = number_value;
+
+ do_signed_number:
+ always_output_a_sign = false;
+ tz_colon_mask = 0;
+
+ do_number_body:
+ /* Format U_NUMBER_VALUE according to the MODIFIER flag.
+ NEGATIVE_NUMBER is nonzero if the original number was
+ negative; in this case it was converted directly to
+ unsigned int (i.e., modulo (UINT_MAX + 1)) without
+ negating it. */
+ if (modifier == L_('O') && !negative_number)
+ {
+#ifdef _NL_CURRENT
+ /* Get the locale specific alternate representation of
+ the number. If none exist NULL is returned. */
+ const CHAR_T *cp = nl_get_alt_digit (u_number_value
+ HELPER_LOCALE_ARG);
+
+ if (cp != NULL)
+ {
+ size_t digitlen = STRLEN (cp);
+ if (digitlen != 0)
+ {
+ cpy (digitlen, cp);
+ break;
+ }
+ }
+#else
+ goto underlying_strftime;
+#endif
+ }
+
+ bufp = buf + sizeof (buf) / sizeof (buf[0]);
+
+ if (negative_number)
+ u_number_value = - u_number_value;
+
+ do
+ {
+ if (tz_colon_mask & 1)
+ *--bufp = ':';
+ tz_colon_mask >>= 1;
+ *--bufp = u_number_value % 10 + L_('0');
+ u_number_value /= 10;
+ }
+ while (u_number_value != 0 || tz_colon_mask != 0);
+
+ do_number_sign_and_padding:
+ if (digits < width)
+ digits = width;
+
+ sign_char = (negative_number ? L_('-')
+ : always_output_a_sign ? L_('+')
+ : 0);
+
+ if (pad == L_('-'))
+ {
+ if (sign_char)
+ add1 (sign_char);
+ }
+ else
+ {
+ int padding = digits - (buf + (sizeof (buf) / sizeof (buf[0]))
+ - bufp) - !!sign_char;
+
+ if (padding > 0)
+ {
+ if (pad == L_('_'))
+ {
+ if ((size_t) padding >= maxsize - i)
+ return 0;
+
+ if (p)
+ memset_space (p, padding);
+ i += padding;
+ width = width > padding ? width - padding : 0;
+ if (sign_char)
+ add1 (sign_char);
+ }
+ else
+ {
+ if ((size_t) digits >= maxsize - i)
+ return 0;
+
+ if (sign_char)
+ add1 (sign_char);
+
+ if (p)
+ memset_zero (p, padding);
+ i += padding;
+ width = 0;
+ }
+ }
+ else
+ {
+ if (sign_char)
+ add1 (sign_char);
+ }
+ }
+
+ cpy (buf + sizeof (buf) / sizeof (buf[0]) - bufp, bufp);
+ break;
+
+ case L_('F'):
+ if (modifier != 0)
+ goto bad_format;
+ subfmt = L_("%Y-%m-%d");
+ goto subformat;
+
+ case L_('H'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_hour);
+
+ case L_('I'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, hour12);
+
+ case L_('k'): /* GNU extension. */
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER_SPACEPAD (2, tp->tm_hour);
+
+ case L_('l'): /* GNU extension. */
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER_SPACEPAD (2, hour12);
+
+ case L_('j'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_SIGNED_NUMBER (3, tp->tm_yday < -1, tp->tm_yday + 1U);
+
+ case L_('M'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_min);
+
+ case L_('m'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_SIGNED_NUMBER (2, tp->tm_mon < -1, tp->tm_mon + 1U);
+
+#ifndef _LIBC
+ case L_('N'): /* GNU extension. */
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ number_value = ns;
+ if (width == -1)
+ width = 9;
+ else
+ {
+ /* Take an explicit width less than 9 as a precision. */
+ int j;
+ for (j = width; j < 9; j++)
+ number_value /= 10;
+ }
+
+ DO_NUMBER (width, number_value);
+#endif
+
+ case L_('n'):
+ add1 (L_('\n'));
+ break;
+
+ case L_('P'):
+ to_lowcase = true;
+#ifndef _NL_CURRENT
+ format_char = L_('p');
+#endif
+ /* FALLTHROUGH */
+
+ case L_('p'):
+ if (change_case)
+ {
+ to_uppcase = false;
+ to_lowcase = true;
+ }
+#ifdef _NL_CURRENT
+ cpy (ap_len, ampm);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('R'):
+ subfmt = L_("%H:%M");
+ goto subformat;
+
+ case L_('r'):
+#ifdef _NL_CURRENT
+ if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME,
+ NLW(T_FMT_AMPM)))
+ == L_('\0'))
+ subfmt = L_("%I:%M:%S %p");
+ goto subformat;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('S'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_sec);
+
+ case L_('s'): /* GNU extension. */
+ {
+ struct tm ltm;
+ time_t t;
+
+ ltm = *tp;
+ t = mktime (&ltm);
+
+ /* Generate string value for T using time_t arithmetic;
+ this works even if sizeof (long) < sizeof (time_t). */
+
+ bufp = buf + sizeof (buf) / sizeof (buf[0]);
+ negative_number = t < 0;
+
+ do
+ {
+ int d = t % 10;
+ t /= 10;
+ *--bufp = (negative_number ? -d : d) + L_('0');
+ }
+ while (t != 0);
+
+ digits = 1;
+ always_output_a_sign = false;
+ goto do_number_sign_and_padding;
+ }
+
+ case L_('X'):
+ if (modifier == L_('O'))
+ goto bad_format;
+#ifdef _NL_CURRENT
+ if (! (modifier == L_('E')
+ && (*(subfmt =
+ (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT)))
+ != L_('\0'))))
+ subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT));
+ goto subformat;
+#else
+ goto underlying_strftime;
+#endif
+ case L_('T'):
+ subfmt = L_("%H:%M:%S");
+ goto subformat;
+
+ case L_('t'):
+ add1 (L_('\t'));
+ break;
+
+ case L_('u'):
+ DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1);
+
+ case L_('U'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7);
+
+ case L_('V'):
+ case L_('g'):
+ case L_('G'):
+ if (modifier == L_('E'))
+ goto bad_format;
+ {
+ /* YEAR is a leap year if and only if (tp->tm_year + TM_YEAR_BASE)
+ is a leap year, except that YEAR and YEAR - 1 both work
+ correctly even when (tp->tm_year + TM_YEAR_BASE) would
+ overflow. */
+ int year = (tp->tm_year
+ + (tp->tm_year < 0
+ ? TM_YEAR_BASE % 400
+ : TM_YEAR_BASE % 400 - 400));
+ int year_adjust = 0;
+ int days = iso_week_days (tp->tm_yday, tp->tm_wday);
+
+ if (days < 0)
+ {
+ /* This ISO week belongs to the previous year. */
+ year_adjust = -1;
+ days = iso_week_days (tp->tm_yday + (365 + __isleap (year - 1)),
+ tp->tm_wday);
+ }
+ else
+ {
+ int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)),
+ tp->tm_wday);
+ if (0 <= d)
+ {
+ /* This ISO week belongs to the next year. */
+ year_adjust = 1;
+ days = d;
+ }
+ }
+
+ switch (*f)
+ {
+ case L_('g'):
+ {
+ int yy = (tp->tm_year % 100 + year_adjust) % 100;
+ DO_NUMBER (2, (0 <= yy
+ ? yy
+ : tp->tm_year < -TM_YEAR_BASE - year_adjust
+ ? -yy
+ : yy + 100));
+ }
+
+ case L_('G'):
+ DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE - year_adjust,
+ (tp->tm_year + (unsigned int) TM_YEAR_BASE
+ + year_adjust));
+
+ default:
+ DO_NUMBER (2, days / 7 + 1);
+ }
+ }
+
+ case L_('W'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7);
+
+ case L_('w'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (1, tp->tm_wday);
+
+ case L_('Y'):
+ if (modifier == 'E')
+ {
+#if HAVE_STRUCT_ERA_ENTRY
+ struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+ if (era)
+ {
+# ifdef COMPILE_WIDE
+ subfmt = era->era_wformat;
+# else
+ subfmt = era->era_format;
+# endif
+ goto subformat;
+ }
+#else
+ goto underlying_strftime;
+#endif
+ }
+ if (modifier == L_('O'))
+ goto bad_format;
+ else
+ DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE,
+ tp->tm_year + (unsigned int) TM_YEAR_BASE);
+
+ case L_('y'):
+ if (modifier == L_('E'))
+ {
+#if HAVE_STRUCT_ERA_ENTRY
+ struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+ if (era)
+ {
+ int delta = tp->tm_year - era->start_date[0];
+ DO_NUMBER (1, (era->offset
+ + delta * era->absolute_direction));
+ }
+#else
+ goto underlying_strftime;
+#endif
+ }
+
+ {
+ int yy = tp->tm_year % 100;
+ if (yy < 0)
+ yy = tp->tm_year < - TM_YEAR_BASE ? -yy : yy + 100;
+ DO_NUMBER (2, yy);
+ }
+
+ case L_('Z'):
+ if (change_case)
+ {
+ to_uppcase = false;
+ to_lowcase = true;
+ }
+
+#if HAVE_TZNAME
+ /* The tzset() call might have changed the value. */
+ if (!(zone && *zone) && tp->tm_isdst >= 0)
+ zone = tzname[tp->tm_isdst != 0];
+#endif
+ if (! zone)
+ zone = "";
+
+#ifdef COMPILE_WIDE
+ {
+ /* The zone string is always given in multibyte form. We have
+ to transform it first. */
+ wchar_t *wczone;
+ size_t len;
+ widen (zone, wczone, len);
+ cpy (len, wczone);
+ }
+#else
+ cpy (strlen (zone), zone);
+#endif
+ break;
+
+ case L_(':'):
+ /* :, ::, and ::: are valid only just before 'z'.
+ :::: etc. are rejected later. */
+ for (colons = 1; f[colons] == L_(':'); colons++)
+ continue;
+ if (f[colons] != L_('z'))
+ goto bad_format;
+ f += colons;
+ goto do_z_conversion;
+
+ case L_('z'):
+ colons = 0;
+
+ do_z_conversion:
+ if (tp->tm_isdst < 0)
+ break;
+
+ {
+ int diff;
+ int hour_diff;
+ int min_diff;
+ int sec_diff;
+#if HAVE_TM_GMTOFF
+ diff = tp->tm_gmtoff;
+#else
+ if (ut)
+ diff = 0;
+ else
+ {
+ struct tm gtm;
+ struct tm ltm;
+ time_t lt;
+
+ ltm = *tp;
+ lt = mktime (&ltm);
+
+ if (lt == (time_t) -1)
+ {
+ /* mktime returns -1 for errors, but -1 is also a
+ valid time_t value. Check whether an error really
+ occurred. */
+ struct tm tm;
+
+ if (! __localtime_r (&lt, &tm)
+ || ((ltm.tm_sec ^ tm.tm_sec)
+ | (ltm.tm_min ^ tm.tm_min)
+ | (ltm.tm_hour ^ tm.tm_hour)
+ | (ltm.tm_mday ^ tm.tm_mday)
+ | (ltm.tm_mon ^ tm.tm_mon)
+ | (ltm.tm_year ^ tm.tm_year)))
+ break;
+ }
+
+ if (! __gmtime_r (&lt, &gtm))
+ break;
+
+ diff = tm_diff (&ltm, &gtm);
+ }
+#endif
+
+ hour_diff = diff / 60 / 60;
+ min_diff = diff / 60 % 60;
+ sec_diff = diff % 60;
+
+ switch (colons)
+ {
+ case 0: /* +hhmm */
+ DO_TZ_OFFSET (5, diff < 0, 0, hour_diff * 100 + min_diff);
+
+ case 1: tz_hh_mm: /* +hh:mm */
+ DO_TZ_OFFSET (6, diff < 0, 04, hour_diff * 100 + min_diff);
+
+ case 2: tz_hh_mm_ss: /* +hh:mm:ss */
+ DO_TZ_OFFSET (9, diff < 0, 024,
+ hour_diff * 10000 + min_diff * 100 + sec_diff);
+
+ case 3: /* +hh if possible, else +hh:mm, else +hh:mm:ss */
+ if (sec_diff != 0)
+ goto tz_hh_mm_ss;
+ if (min_diff != 0)
+ goto tz_hh_mm;
+ DO_TZ_OFFSET (3, diff < 0, 0, hour_diff);
+
+ default:
+ goto bad_format;
+ }
+ }
+
+ case L_('\0'): /* GNU extension: % at end of format. */
+ --f;
+ /* Fall through. */
+ default:
+ /* Unknown format; output the format, including the '%',
+ since this is most likely the right thing to do if a
+ multibyte string has been misparsed. */
+ bad_format:
+ {
+ int flen;
+ for (flen = 1; f[1 - flen] != L_('%'); flen++)
+ continue;
+ cpy (flen, &f[1 - flen]);
+ }
+ break;
+ }
+ }
+
+#if ! FPRINTFTIME
+ if (p && maxsize != 0)
+ *p = L_('\0');
+#endif
+
+ return i;
+}
+
+/* Write information from TP into S according to the format
+ string FORMAT, writing no more that MAXSIZE characters
+ (including the terminating '\0') and returning number of
+ characters written. If S is NULL, nothing will be written
+ anywhere, so to determine how many characters would be
+ written, use NULL for S and (size_t) -1 for MAXSIZE. */
+size_t
+my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
+ const CHAR_T *format,
+ const struct tm *tp extra_args_spec LOCALE_PARAM_PROTO)
+{
+ return strftime_case_ (false, s, STRFTIME_ARG (maxsize)
+ format, tp extra_args LOCALE_ARG);
+}
+
+#if defined _LIBC && ! FPRINTFTIME
+libc_hidden_def (my_strftime)
+#endif
+
+
+#if defined emacs && ! FPRINTFTIME
+/* For Emacs we have a separate interface which corresponds to the normal
+ strftime function plus the ut argument, but without the ns argument. */
+size_t
+emacs_strftimeu (char *s, size_t maxsize, const char *format,
+ const struct tm *tp, int ut)
+{
+ return my_strftime (s, maxsize, format, tp, ut, 0);
+}
+#endif
diff --git a/gnulib/lib/strftime.h b/gnulib/lib/strftime.h
new file mode 100644
index 00000000..bf145404
--- /dev/null
+++ b/gnulib/lib/strftime.h
@@ -0,0 +1,34 @@
+/* declarations for strftime.c
+
+ Copyright (C) 2002, 2004, 2008-2010 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/>. */
+
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Just like strftime, but with two more arguments:
+ POSIX requires that strftime use the local timezone information.
+ When __UTC is nonzero and tm->tm_zone is NULL or the empty string,
+ use UTC instead. Use __NS as the number of nanoseconds in the
+ %N directive. */
+size_t nstrftime (char *, size_t, char const *, struct tm const *,
+ int __utc, int __ns);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/striconv.c b/gnulib/lib/striconv.c
new file mode 100644
index 00000000..35bae576
--- /dev/null
+++ b/gnulib/lib/striconv.c
@@ -0,0 +1,457 @@
+/* Charset conversion.
+ Copyright (C) 2001-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "striconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+/* Get MB_LEN_MAX, CHAR_BIT. */
+# include <limits.h>
+#endif
+
+#include "c-strcase.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+
+#if HAVE_ICONV
+
+int
+mem_cd_iconv (const char *src, size_t srclen, iconv_t cd,
+ char **resultp, size_t *lengthp)
+{
+# define tmpbufsize 4096
+ size_t length;
+ char *result;
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+ /* Set to the initial state. */
+ iconv (cd, NULL, NULL, NULL, NULL);
+# endif
+
+ /* Determine the length we need. */
+ {
+ size_t count = 0;
+ /* The alignment is needed when converting e.g. to glibc's WCHAR_T or
+ libiconv's UCS-4-INTERNAL encoding. */
+ union { unsigned int align; char buf[tmpbufsize]; } tmp;
+# define tmpbuf tmp.buf
+ const char *inptr = src;
+ size_t insize = srclen;
+
+ while (insize > 0)
+ {
+ char *outptr = tmpbuf;
+ size_t outsize = tmpbufsize;
+ size_t res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &insize,
+ &outptr, &outsize);
+
+ if (res == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ ;
+ else if (errno == EINVAL)
+ break;
+ else
+ return -1;
+ }
+# if !defined _LIBICONV_VERSION && !defined __GLIBC__
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. */
+ else if (res > 0)
+ {
+ errno = EILSEQ;
+ return -1;
+ }
+# endif
+ count += outptr - tmpbuf;
+ }
+ /* Avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+ {
+ char *outptr = tmpbuf;
+ size_t outsize = tmpbufsize;
+ size_t res = iconv (cd, NULL, NULL, &outptr, &outsize);
+
+ if (res == (size_t)(-1))
+ return -1;
+ count += outptr - tmpbuf;
+ }
+# endif
+ length = count;
+# undef tmpbuf
+ }
+
+ if (length == 0)
+ {
+ *lengthp = 0;
+ return 0;
+ }
+ if (*resultp != NULL && *lengthp >= length)
+ result = *resultp;
+ else
+ {
+ result = (char *) malloc (length);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+ /* Return to the initial state. */
+ iconv (cd, NULL, NULL, NULL, NULL);
+# endif
+
+ /* Do the conversion for real. */
+ {
+ const char *inptr = src;
+ size_t insize = srclen;
+ char *outptr = result;
+ size_t outsize = length;
+
+ while (insize > 0)
+ {
+ size_t res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &insize,
+ &outptr, &outsize);
+
+ if (res == (size_t)(-1))
+ {
+ if (errno == EINVAL)
+ break;
+ else
+ goto fail;
+ }
+# if !defined _LIBICONV_VERSION && !defined __GLIBC__
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. */
+ else if (res > 0)
+ {
+ errno = EILSEQ;
+ goto fail;
+ }
+# endif
+ }
+ /* Avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+ {
+ size_t res = iconv (cd, NULL, NULL, &outptr, &outsize);
+
+ if (res == (size_t)(-1))
+ goto fail;
+ }
+# endif
+ if (outsize != 0)
+ abort ();
+ }
+
+ *resultp = result;
+ *lengthp = length;
+
+ return 0;
+
+ fail:
+ {
+ if (result != *resultp)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+# undef tmpbufsize
+}
+
+char *
+str_cd_iconv (const char *src, iconv_t cd)
+{
+ /* For most encodings, a trailing NUL byte in the input will be converted
+ to a trailing NUL byte in the output. But not for UTF-7. So that this
+ function is usable for UTF-7, we have to exclude the NUL byte from the
+ conversion and add it by hand afterwards. */
+# if !defined _LIBICONV_VERSION && !defined __GLIBC__
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. For other iconv() implementations,
+ we have to look at the number of irreversible conversions returned;
+ but this information is lost when iconv() returns for an E2BIG reason.
+ Therefore we cannot use the second, faster algorithm. */
+
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconv (src, strlen (src), cd, &result, &length);
+ char *final_result;
+
+ if (retval < 0)
+ {
+ if (result != NULL)
+ abort ();
+ return NULL;
+ }
+
+ /* Add the terminating NUL byte. */
+ final_result =
+ (result != NULL ? realloc (result, length + 1) : malloc (length + 1));
+ if (final_result == NULL)
+ {
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ final_result[length] = '\0';
+
+ return final_result;
+
+# else
+ /* This algorithm is likely faster than the one above. But it may produce
+ iconv() returns for an E2BIG reason, when the output size guess is too
+ small. Therefore it can only be used when we don't need the number of
+ irreversible conversions performed. */
+ char *result;
+ size_t result_size;
+ size_t length;
+ const char *inptr = src;
+ size_t inbytes_remaining = strlen (src);
+
+ /* Make a guess for the worst-case output size, in order to avoid a
+ realloc. It's OK if the guess is wrong as long as it is not zero and
+ doesn't lead to an integer overflow. */
+ result_size = inbytes_remaining;
+ {
+ size_t approx_sqrt_SIZE_MAX = SIZE_MAX >> (sizeof (size_t) * CHAR_BIT / 2);
+ if (result_size <= approx_sqrt_SIZE_MAX / MB_LEN_MAX)
+ result_size *= MB_LEN_MAX;
+ }
+ result_size += 1; /* for the terminating NUL */
+
+ result = (char *) malloc (result_size);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+ /* Set to the initial state. */
+ iconv (cd, NULL, NULL, NULL, NULL);
+# endif
+
+ /* Do the conversion. */
+ {
+ char *outptr = result;
+ size_t outbytes_remaining = result_size - 1;
+
+ for (;;)
+ {
+ /* Here inptr + inbytes_remaining = src + strlen (src),
+ outptr + outbytes_remaining = result + result_size - 1. */
+ size_t res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytes_remaining,
+ &outptr, &outbytes_remaining);
+
+ if (res == (size_t)(-1))
+ {
+ if (errno == EINVAL)
+ break;
+ else if (errno == E2BIG)
+ {
+ size_t used = outptr - result;
+ size_t newsize = result_size * 2;
+ char *newresult;
+
+ if (!(newsize > result_size))
+ {
+ errno = ENOMEM;
+ goto failed;
+ }
+ newresult = (char *) realloc (result, newsize);
+ if (newresult == NULL)
+ {
+ errno = ENOMEM;
+ goto failed;
+ }
+ result = newresult;
+ result_size = newsize;
+ outptr = result + used;
+ outbytes_remaining = result_size - 1 - used;
+ }
+ else
+ goto failed;
+ }
+ else
+ break;
+ }
+ /* Avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+ for (;;)
+ {
+ /* Here outptr + outbytes_remaining = result + result_size - 1. */
+ size_t res = iconv (cd, NULL, NULL, &outptr, &outbytes_remaining);
+
+ if (res == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ {
+ size_t used = outptr - result;
+ size_t newsize = result_size * 2;
+ char *newresult;
+
+ if (!(newsize > result_size))
+ {
+ errno = ENOMEM;
+ goto failed;
+ }
+ newresult = (char *) realloc (result, newsize);
+ if (newresult == NULL)
+ {
+ errno = ENOMEM;
+ goto failed;
+ }
+ result = newresult;
+ result_size = newsize;
+ outptr = result + used;
+ outbytes_remaining = result_size - 1 - used;
+ }
+ else
+ goto failed;
+ }
+ else
+ break;
+ }
+# endif
+
+ /* Add the terminating NUL byte. */
+ *outptr++ = '\0';
+
+ length = outptr - result;
+ }
+
+ /* Give away unused memory. */
+ if (length < result_size)
+ {
+ char *smaller_result = (char *) realloc (result, length);
+
+ if (smaller_result != NULL)
+ result = smaller_result;
+ }
+
+ return result;
+
+ failed:
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ return NULL;
+ }
+
+# endif
+}
+
+#endif
+
+char *
+str_iconv (const char *src, const char *from_codeset, const char *to_codeset)
+{
+ if (*src == '\0' || c_strcasecmp (from_codeset, to_codeset) == 0)
+ {
+ char *result = strdup (src);
+
+ if (result == NULL)
+ errno = ENOMEM;
+ return result;
+ }
+ else
+ {
+#if HAVE_ICONV
+ iconv_t cd;
+ char *result;
+
+ /* Avoid glibc-2.1 bug with EUC-KR. */
+# if (__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) && !defined _LIBICONV_VERSION
+ if (c_strcasecmp (from_codeset, "EUC-KR") == 0
+ || c_strcasecmp (to_codeset, "EUC-KR") == 0)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+# endif
+ cd = iconv_open (to_codeset, from_codeset);
+ if (cd == (iconv_t) -1)
+ return NULL;
+
+ result = str_cd_iconv (src, cd);
+
+ if (result == NULL)
+ {
+ /* Close cd, but preserve the errno from str_cd_iconv. */
+ int saved_errno = errno;
+ iconv_close (cd);
+ errno = saved_errno;
+ }
+ else
+ {
+ if (iconv_close (cd) < 0)
+ {
+ /* Return NULL, but free the allocated memory, and while doing
+ that, preserve the errno from iconv_close. */
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+ return result;
+#else
+ /* This is a different error code than if iconv_open existed but didn't
+ support from_codeset and to_codeset, so that the caller can emit
+ an error message such as
+ "iconv() is not supported. Installing GNU libiconv and
+ then reinstalling this package would fix this." */
+ errno = ENOSYS;
+ return NULL;
+#endif
+ }
+}
diff --git a/gnulib/lib/striconv.h b/gnulib/lib/striconv.h
new file mode 100644
index 00000000..4509fd24
--- /dev/null
+++ b/gnulib/lib/striconv.h
@@ -0,0 +1,76 @@
+/* Charset conversion.
+ Copyright (C) 2001-2004, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _STRICONV_H
+#define _STRICONV_H
+
+#include <stddef.h>
+#if HAVE_ICONV
+#include <iconv.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if HAVE_ICONV
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ The conversion descriptor is passed as CD.
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int mem_cd_iconv (const char *src, size_t srclen, iconv_t cd,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ The conversion descriptor is passed as CD. Both the "from" and the "to"
+ encoding must use a single NUL byte at the end of the string (i.e. not
+ UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char * str_cd_iconv (const char *src, iconv_t cd);
+
+#endif
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char * str_iconv (const char *src,
+ const char *from_codeset, const char *to_codeset);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRICONV_H */
diff --git a/gnulib/lib/striconveh.c b/gnulib/lib/striconveh.c
new file mode 100644
index 00000000..e448a994
--- /dev/null
+++ b/gnulib/lib/striconveh.c
@@ -0,0 +1,1187 @@
+/* Character set conversion with error handling.
+ Copyright (C) 2001-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "striconveh.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+# include "unistr.h"
+#endif
+
+#include "c-strcase.h"
+#include "c-strcaseeq.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+
+#if HAVE_ICONV
+
+/* The caller must provide an iconveh_t, not just an iconv_t, because when a
+ conversion error occurs, we may have to determine the Unicode representation
+ of the inconvertible character. */
+
+int
+iconveh_open (const char *to_codeset, const char *from_codeset, iconveh_t *cdp)
+{
+ iconv_t cd;
+ iconv_t cd1;
+ iconv_t cd2;
+
+ /* Avoid glibc-2.1 bug with EUC-KR. */
+# if (__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) && !defined _LIBICONV_VERSION
+ if (c_strcasecmp (from_codeset, "EUC-KR") == 0
+ || c_strcasecmp (to_codeset, "EUC-KR") == 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+# endif
+
+ cd = iconv_open (to_codeset, from_codeset);
+
+ if (STRCASEEQ (from_codeset, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ cd1 = (iconv_t)(-1);
+ else
+ {
+ cd1 = iconv_open ("UTF-8", from_codeset);
+ if (cd1 == (iconv_t)(-1))
+ {
+ int saved_errno = errno;
+ if (cd != (iconv_t)(-1))
+ iconv_close (cdp->cd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+
+ if (STRCASEEQ (to_codeset, "UTF-8", 'U','T','F','-','8',0,0,0,0)
+# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 || _LIBICONV_VERSION >= 0x0105
+ || c_strcasecmp (to_codeset, "UTF-8//TRANSLIT") == 0
+# endif
+ )
+ cd2 = (iconv_t)(-1);
+ else
+ {
+ cd2 = iconv_open (to_codeset, "UTF-8");
+ if (cd2 == (iconv_t)(-1))
+ {
+ int saved_errno = errno;
+ if (cd1 != (iconv_t)(-1))
+ iconv_close (cd1);
+ if (cd != (iconv_t)(-1))
+ iconv_close (cd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+
+ cdp->cd = cd;
+ cdp->cd1 = cd1;
+ cdp->cd2 = cd2;
+ return 0;
+}
+
+int
+iconveh_close (const iconveh_t *cd)
+{
+ if (cd->cd2 != (iconv_t)(-1) && iconv_close (cd->cd2) < 0)
+ {
+ /* Return -1, but preserve the errno from iconv_close. */
+ int saved_errno = errno;
+ if (cd->cd1 != (iconv_t)(-1))
+ iconv_close (cd->cd1);
+ if (cd->cd != (iconv_t)(-1))
+ iconv_close (cd->cd);
+ errno = saved_errno;
+ return -1;
+ }
+ if (cd->cd1 != (iconv_t)(-1) && iconv_close (cd->cd1) < 0)
+ {
+ /* Return -1, but preserve the errno from iconv_close. */
+ int saved_errno = errno;
+ if (cd->cd != (iconv_t)(-1))
+ iconv_close (cd->cd);
+ errno = saved_errno;
+ return -1;
+ }
+ if (cd->cd != (iconv_t)(-1) && iconv_close (cd->cd) < 0)
+ return -1;
+ return 0;
+}
+
+/* iconv_carefully is like iconv, except that it stops as soon as it encounters
+ a conversion error, and it returns in *INCREMENTED a boolean telling whether
+ it has incremented the input pointers past the error location. */
+# if !defined _LIBICONV_VERSION && !defined __GLIBC__
+/* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. */
+static size_t
+iconv_carefully (iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft,
+ bool *incremented)
+{
+ const char *inptr = *inbuf;
+ const char *inptr_end = inptr + *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outsize = *outbytesleft;
+ const char *inptr_before;
+ size_t res;
+
+ do
+ {
+ size_t insize;
+
+ inptr_before = inptr;
+ res = (size_t)(-1);
+
+ for (insize = 1; inptr + insize <= inptr_end; insize++)
+ {
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &insize,
+ &outptr, &outsize);
+ if (!(res == (size_t)(-1) && errno == EINVAL))
+ break;
+ /* iconv can eat up a shift sequence but give EINVAL while attempting
+ to convert the first character. E.g. libiconv does this. */
+ if (inptr > inptr_before)
+ {
+ res = 0;
+ break;
+ }
+ }
+
+ if (res == 0)
+ {
+ *outbuf = outptr;
+ *outbytesleft = outsize;
+ }
+ }
+ while (res == 0 && inptr < inptr_end);
+
+ *inbuf = inptr;
+ *inbytesleft = inptr_end - inptr;
+ if (res != (size_t)(-1) && res > 0)
+ {
+ /* iconv() has already incremented INPTR. We cannot go back to a
+ previous INPTR, otherwise the state inside CD would become invalid,
+ if FROM_CODESET is a stateful encoding. So, tell the caller that
+ *INBUF has already been incremented. */
+ *incremented = (inptr > inptr_before);
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+ else
+ {
+ *incremented = false;
+ return res;
+ }
+}
+# else
+# define iconv_carefully(cd, inbuf, inbytesleft, outbuf, outbytesleft, incremented) \
+ (*(incremented) = false, \
+ iconv (cd, (ICONV_CONST char **) (inbuf), inbytesleft, outbuf, outbytesleft))
+# endif
+
+/* iconv_carefully_1 is like iconv_carefully, except that it stops after
+ converting one character or one shift sequence. */
+static size_t
+iconv_carefully_1 (iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft,
+ bool *incremented)
+{
+ const char *inptr_before = *inbuf;
+ const char *inptr = inptr_before;
+ const char *inptr_end = inptr_before + *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outsize = *outbytesleft;
+ size_t res = (size_t)(-1);
+ size_t insize;
+
+ for (insize = 1; inptr_before + insize <= inptr_end; insize++)
+ {
+ inptr = inptr_before;
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &insize,
+ &outptr, &outsize);
+ if (!(res == (size_t)(-1) && errno == EINVAL))
+ break;
+ /* iconv can eat up a shift sequence but give EINVAL while attempting
+ to convert the first character. E.g. libiconv does this. */
+ if (inptr > inptr_before)
+ {
+ res = 0;
+ break;
+ }
+ }
+
+ *inbuf = inptr;
+ *inbytesleft = inptr_end - inptr;
+# if !defined _LIBICONV_VERSION && !defined __GLIBC__
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. */
+ if (res != (size_t)(-1) && res > 0)
+ {
+ /* iconv() has already incremented INPTR. We cannot go back to a
+ previous INPTR, otherwise the state inside CD would become invalid,
+ if FROM_CODESET is a stateful encoding. So, tell the caller that
+ *INBUF has already been incremented. */
+ *incremented = (inptr > inptr_before);
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+# endif
+
+ if (res != (size_t)(-1))
+ {
+ *outbuf = outptr;
+ *outbytesleft = outsize;
+ }
+ *incremented = false;
+ return res;
+}
+
+/* utf8conv_carefully is like iconv, except that
+ - it converts from UTF-8 to UTF-8,
+ - it stops as soon as it encounters a conversion error, and it returns
+ in *INCREMENTED a boolean telling whether it has incremented the input
+ pointers past the error location,
+ - if one_character_only is true, it stops after converting one
+ character. */
+static size_t
+utf8conv_carefully (bool one_character_only,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft,
+ bool *incremented)
+{
+ const char *inptr = *inbuf;
+ size_t insize = *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outsize = *outbytesleft;
+ size_t res;
+
+ res = 0;
+ do
+ {
+ ucs4_t uc;
+ int n;
+ int m;
+
+ n = u8_mbtoucr (&uc, (const uint8_t *) inptr, insize);
+ if (n < 0)
+ {
+ errno = (n == -2 ? EINVAL : EILSEQ);
+ n = u8_mbtouc (&uc, (const uint8_t *) inptr, insize);
+ inptr += n;
+ insize -= n;
+ res = (size_t)(-1);
+ *incremented = true;
+ break;
+ }
+ if (outsize == 0)
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ *incremented = false;
+ break;
+ }
+ m = u8_uctomb ((uint8_t *) outptr, uc, outsize);
+ if (m == -2)
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ *incremented = false;
+ break;
+ }
+ inptr += n;
+ insize -= n;
+ if (m == -1)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ *incremented = true;
+ break;
+ }
+ outptr += m;
+ outsize -= m;
+ }
+ while (!one_character_only && insize > 0);
+
+ *inbuf = inptr;
+ *inbytesleft = insize;
+ *outbuf = outptr;
+ *outbytesleft = outsize;
+ return res;
+}
+
+static int
+mem_cd_iconveh_internal (const char *src, size_t srclen,
+ iconv_t cd, iconv_t cd1, iconv_t cd2,
+ enum iconv_ilseq_handler handler,
+ size_t extra_alloc,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ /* When a conversion error occurs, we cannot start using CD1 and CD2 at
+ this point: FROM_CODESET may be a stateful encoding like ISO-2022-KR.
+ Instead, we have to start afresh from the beginning of SRC. */
+ /* Use a temporary buffer, so that for small strings, a single malloc()
+ call will be sufficient. */
+# define tmpbufsize 4096
+ /* The alignment is needed when converting e.g. to glibc's WCHAR_T or
+ libiconv's UCS-4-INTERNAL encoding. */
+ union { unsigned int align; char buf[tmpbufsize]; } tmp;
+# define tmpbuf tmp.buf
+
+ char *initial_result;
+ char *result;
+ size_t allocated;
+ size_t length;
+ size_t last_length = (size_t)(-1); /* only needed if offsets != NULL */
+
+ if (*resultp != NULL && *lengthp >= sizeof (tmpbuf))
+ {
+ initial_result = *resultp;
+ allocated = *lengthp;
+ }
+ else
+ {
+ initial_result = tmpbuf;
+ allocated = sizeof (tmpbuf);
+ }
+ result = initial_result;
+
+ /* Test whether a direct conversion is possible at all. */
+ if (cd == (iconv_t)(-1))
+ goto indirectly;
+
+ if (offsets != NULL)
+ {
+ size_t i;
+
+ for (i = 0; i < srclen; i++)
+ offsets[i] = (size_t)(-1);
+
+ last_length = (size_t)(-1);
+ }
+ length = 0;
+
+ /* First, try a direct conversion, and see whether a conversion error
+ occurs at all. */
+ {
+ const char *inptr = src;
+ size_t insize = srclen;
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+ /* Set to the initial state. */
+ iconv (cd, NULL, NULL, NULL, NULL);
+# endif
+
+ while (insize > 0)
+ {
+ char *outptr = result + length;
+ size_t outsize = allocated - extra_alloc - length;
+ bool incremented;
+ size_t res;
+ bool grow;
+
+ if (offsets != NULL)
+ {
+ if (length != last_length) /* ensure that offset[] be increasing */
+ {
+ offsets[inptr - src] = length;
+ last_length = length;
+ }
+ res = iconv_carefully_1 (cd,
+ &inptr, &insize,
+ &outptr, &outsize,
+ &incremented);
+ }
+ else
+ /* Use iconv_carefully instead of iconv here, because:
+ - If TO_CODESET is UTF-8, we can do the error handling in this
+ loop, no need for a second loop,
+ - With iconv() implementations other than GNU libiconv and GNU
+ libc, if we use iconv() in a big swoop, checking for an E2BIG
+ return, we lose the number of irreversible conversions. */
+ res = iconv_carefully (cd,
+ &inptr, &insize,
+ &outptr, &outsize,
+ &incremented);
+
+ length = outptr - result;
+ grow = (length + extra_alloc > allocated / 2);
+ if (res == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ grow = true;
+ else if (errno == EINVAL)
+ break;
+ else if (errno == EILSEQ && handler != iconveh_error)
+ {
+ if (cd2 == (iconv_t)(-1))
+ {
+ /* TO_CODESET is UTF-8. */
+ /* Error handling can produce up to 1 byte of output. */
+ if (length + 1 + extra_alloc > allocated)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (length + 1 + extra_alloc > allocated)
+ abort ();
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ grow = false;
+ }
+ /* The input is invalid in FROM_CODESET. Eat up one byte
+ and emit a question mark. */
+ if (!incremented)
+ {
+ if (insize == 0)
+ abort ();
+ inptr++;
+ insize--;
+ }
+ result[length] = '?';
+ length++;
+ }
+ else
+ goto indirectly;
+ }
+ else
+ {
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ }
+ if (insize == 0)
+ break;
+ if (grow)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ }
+ }
+ }
+
+ /* Now get the conversion state back to the initial state.
+ But avoid glibc-2.1 bug and Solaris 2.7 bug. */
+#if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) || defined __sun)
+ for (;;)
+ {
+ char *outptr = result + length;
+ size_t outsize = allocated - extra_alloc - length;
+ size_t res;
+
+ res = iconv (cd, NULL, NULL, &outptr, &outsize);
+ length = outptr - result;
+ if (res == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ }
+ else
+ {
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ }
+ else
+ break;
+ }
+#endif
+
+ /* The direct conversion succeeded. */
+ goto done;
+
+ indirectly:
+ /* The direct conversion failed.
+ Use a conversion through UTF-8. */
+ if (offsets != NULL)
+ {
+ size_t i;
+
+ for (i = 0; i < srclen; i++)
+ offsets[i] = (size_t)(-1);
+
+ last_length = (size_t)(-1);
+ }
+ length = 0;
+ {
+ const bool slowly = (offsets != NULL || handler == iconveh_error);
+# define utf8bufsize 4096 /* may also be smaller or larger than tmpbufsize */
+ char utf8buf[utf8bufsize + 1];
+ size_t utf8len = 0;
+ const char *in1ptr = src;
+ size_t in1size = srclen;
+ bool do_final_flush1 = true;
+ bool do_final_flush2 = true;
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+ /* Set to the initial state. */
+ if (cd1 != (iconv_t)(-1))
+ iconv (cd1, NULL, NULL, NULL, NULL);
+ if (cd2 != (iconv_t)(-1))
+ iconv (cd2, NULL, NULL, NULL, NULL);
+# endif
+
+ while (in1size > 0 || do_final_flush1 || utf8len > 0 || do_final_flush2)
+ {
+ char *out1ptr = utf8buf + utf8len;
+ size_t out1size = utf8bufsize - utf8len;
+ bool incremented1;
+ size_t res1;
+ int errno1;
+
+ /* Conversion step 1: from FROM_CODESET to UTF-8. */
+ if (in1size > 0)
+ {
+ if (offsets != NULL
+ && length != last_length) /* ensure that offset[] be increasing */
+ {
+ offsets[in1ptr - src] = length;
+ last_length = length;
+ }
+ if (cd1 != (iconv_t)(-1))
+ {
+ if (slowly)
+ res1 = iconv_carefully_1 (cd1,
+ &in1ptr, &in1size,
+ &out1ptr, &out1size,
+ &incremented1);
+ else
+ res1 = iconv_carefully (cd1,
+ &in1ptr, &in1size,
+ &out1ptr, &out1size,
+ &incremented1);
+ }
+ else
+ {
+ /* FROM_CODESET is UTF-8. */
+ res1 = utf8conv_carefully (slowly,
+ &in1ptr, &in1size,
+ &out1ptr, &out1size,
+ &incremented1);
+ }
+ }
+ else if (do_final_flush1)
+ {
+ /* Now get the conversion state of CD1 back to the initial state.
+ But avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) || defined __sun)
+ if (cd1 != (iconv_t)(-1))
+ res1 = iconv (cd1, NULL, NULL, &out1ptr, &out1size);
+ else
+# endif
+ res1 = 0;
+ do_final_flush1 = false;
+ incremented1 = true;
+ }
+ else
+ {
+ res1 = 0;
+ incremented1 = true;
+ }
+ if (res1 == (size_t)(-1)
+ && !(errno == E2BIG || errno == EINVAL || errno == EILSEQ))
+ {
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ if (res1 == (size_t)(-1)
+ && errno == EILSEQ && handler != iconveh_error)
+ {
+ /* The input is invalid in FROM_CODESET. Eat up one byte and
+ emit a question mark. Room for the question mark was allocated
+ at the end of utf8buf. */
+ if (!incremented1)
+ {
+ if (in1size == 0)
+ abort ();
+ in1ptr++;
+ in1size--;
+ }
+ *out1ptr++ = '?';
+ res1 = 0;
+ }
+ errno1 = errno;
+ utf8len = out1ptr - utf8buf;
+
+ if (offsets != NULL
+ || in1size == 0
+ || utf8len > utf8bufsize / 2
+ || (res1 == (size_t)(-1) && errno1 == E2BIG))
+ {
+ /* Conversion step 2: from UTF-8 to TO_CODESET. */
+ const char *in2ptr = utf8buf;
+ size_t in2size = utf8len;
+
+ while (in2size > 0
+ || (in1size == 0 && !do_final_flush1 && do_final_flush2))
+ {
+ char *out2ptr = result + length;
+ size_t out2size = allocated - extra_alloc - length;
+ bool incremented2;
+ size_t res2;
+ bool grow;
+
+ if (in2size > 0)
+ {
+ if (cd2 != (iconv_t)(-1))
+ res2 = iconv_carefully (cd2,
+ &in2ptr, &in2size,
+ &out2ptr, &out2size,
+ &incremented2);
+ else
+ /* TO_CODESET is UTF-8. */
+ res2 = utf8conv_carefully (false,
+ &in2ptr, &in2size,
+ &out2ptr, &out2size,
+ &incremented2);
+ }
+ else /* in1size == 0 && !do_final_flush1
+ && in2size == 0 && do_final_flush2 */
+ {
+ /* Now get the conversion state of CD1 back to the initial
+ state. But avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) || defined __sun)
+ if (cd2 != (iconv_t)(-1))
+ res2 = iconv (cd2, NULL, NULL, &out2ptr, &out2size);
+ else
+# endif
+ res2 = 0;
+ do_final_flush2 = false;
+ incremented2 = true;
+ }
+
+ length = out2ptr - result;
+ grow = (length + extra_alloc > allocated / 2);
+ if (res2 == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ grow = true;
+ else if (errno == EINVAL)
+ break;
+ else if (errno == EILSEQ && handler != iconveh_error)
+ {
+ /* Error handling can produce up to 10 bytes of ASCII
+ output. But TO_CODESET may be UCS-2, UTF-16 or
+ UCS-4, so use CD2 here as well. */
+ char scratchbuf[10];
+ size_t scratchlen;
+ ucs4_t uc;
+ const char *inptr;
+ size_t insize;
+ size_t res;
+
+ if (incremented2)
+ {
+ if (u8_prev (&uc, (const uint8_t *) in2ptr,
+ (const uint8_t *) utf8buf)
+ == NULL)
+ abort ();
+ }
+ else
+ {
+ int n;
+ if (in2size == 0)
+ abort ();
+ n = u8_mbtouc_unsafe (&uc, (const uint8_t *) in2ptr,
+ in2size);
+ in2ptr += n;
+ in2size -= n;
+ }
+
+ if (handler == iconveh_escape_sequence)
+ {
+ static char hex[16] = "0123456789ABCDEF";
+ scratchlen = 0;
+ scratchbuf[scratchlen++] = '\\';
+ if (uc < 0x10000)
+ scratchbuf[scratchlen++] = 'u';
+ else
+ {
+ scratchbuf[scratchlen++] = 'U';
+ scratchbuf[scratchlen++] = hex[(uc>>28) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>24) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>20) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>16) & 15];
+ }
+ scratchbuf[scratchlen++] = hex[(uc>>12) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>8) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>4) & 15];
+ scratchbuf[scratchlen++] = hex[uc & 15];
+ }
+ else
+ {
+ scratchbuf[0] = '?';
+ scratchlen = 1;
+ }
+
+ inptr = scratchbuf;
+ insize = scratchlen;
+ if (cd2 != (iconv_t)(-1))
+ res = iconv (cd2,
+ (ICONV_CONST char **) &inptr, &insize,
+ &out2ptr, &out2size);
+ else
+ {
+ /* TO_CODESET is UTF-8. */
+ if (out2size >= insize)
+ {
+ memcpy (out2ptr, inptr, insize);
+ out2ptr += insize;
+ out2size -= insize;
+ inptr += insize;
+ insize = 0;
+ res = 0;
+ }
+ else
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ }
+ }
+ length = out2ptr - result;
+ if (res == (size_t)(-1) && errno == E2BIG)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (length + 1 + extra_alloc > allocated)
+ abort ();
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ grow = false;
+
+ out2ptr = result + length;
+ out2size = allocated - extra_alloc - length;
+ if (cd2 != (iconv_t)(-1))
+ res = iconv (cd2,
+ (ICONV_CONST char **) &inptr,
+ &insize,
+ &out2ptr, &out2size);
+ else
+ {
+ /* TO_CODESET is UTF-8. */
+ if (!(out2size >= insize))
+ abort ();
+ memcpy (out2ptr, inptr, insize);
+ out2ptr += insize;
+ out2size -= insize;
+ inptr += insize;
+ insize = 0;
+ res = 0;
+ }
+ length = out2ptr - result;
+ }
+# if !defined _LIBICONV_VERSION && !defined __GLIBC__
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot
+ convert.
+ Only GNU libiconv and GNU libc are known to prefer
+ to fail rather than doing a lossy conversion. */
+ if (res != (size_t)(-1) && res > 0)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ }
+# endif
+ if (res == (size_t)(-1))
+ {
+ /* Failure converting the ASCII replacement. */
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ }
+ else
+ {
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ }
+ if (!(in2size > 0
+ || (in1size == 0 && !do_final_flush1 && do_final_flush2)))
+ break;
+ if (grow)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ }
+ }
+
+ /* Move the remaining bytes to the beginning of utf8buf. */
+ if (in2size > 0)
+ memmove (utf8buf, in2ptr, in2size);
+ utf8len = in2size;
+ }
+
+ if (res1 == (size_t)(-1))
+ {
+ if (errno1 == EINVAL)
+ in1size = 0;
+ else if (errno1 == EILSEQ)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = errno1;
+ return -1;
+ }
+ }
+ }
+# undef utf8bufsize
+ }
+
+ done:
+ /* Now the final memory allocation. */
+ if (result == tmpbuf)
+ {
+ size_t memsize = length + extra_alloc;
+ char *memory;
+
+ memory = (char *) malloc (memsize > 0 ? memsize : 1);
+ if (memory != NULL)
+ {
+ memcpy (memory, tmpbuf, length);
+ result = memory;
+ }
+ else
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ else if (result != *resultp && length + extra_alloc < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ size_t memsize = length + extra_alloc;
+ char *memory;
+
+ memory = (char *) realloc (result, memsize > 0 ? memsize : 1);
+ if (memory != NULL)
+ result = memory;
+ }
+ *resultp = result;
+ *lengthp = length;
+ return 0;
+# undef tmpbuf
+# undef tmpbufsize
+}
+
+int
+mem_cd_iconveh (const char *src, size_t srclen,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ return mem_cd_iconveh_internal (src, srclen, cd->cd, cd->cd1, cd->cd2,
+ handler, 0, offsets, resultp, lengthp);
+}
+
+char *
+str_cd_iconveh (const char *src,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler)
+{
+ /* For most encodings, a trailing NUL byte in the input will be converted
+ to a trailing NUL byte in the output. But not for UTF-7. So that this
+ function is usable for UTF-7, we have to exclude the NUL byte from the
+ conversion and add it by hand afterwards. */
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh_internal (src, strlen (src),
+ cd->cd, cd->cd1, cd->cd2, handler, 1,
+ NULL, &result, &length);
+
+ if (retval < 0)
+ {
+ if (result != NULL)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ /* Add the terminating NUL byte. */
+ result[length] = '\0';
+
+ return result;
+}
+
+#endif
+
+int
+mem_iconveh (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ if (srclen == 0)
+ {
+ /* Nothing to convert. */
+ *lengthp = 0;
+ return 0;
+ }
+ else if (offsets == NULL && c_strcasecmp (from_codeset, to_codeset) == 0)
+ {
+ char *result;
+
+ if (*resultp != NULL && *lengthp >= srclen)
+ result = *resultp;
+ else
+ {
+ result = (char *) malloc (srclen);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ memcpy (result, src, srclen);
+ *resultp = result;
+ *lengthp = srclen;
+ return 0;
+ }
+ else
+ {
+#if HAVE_ICONV
+ iconveh_t cd;
+ char *result;
+ size_t length;
+ int retval;
+
+ if (iconveh_open (to_codeset, from_codeset, &cd) < 0)
+ return -1;
+
+ result = *resultp;
+ length = *lengthp;
+ retval = mem_cd_iconveh (src, srclen, &cd, handler, offsets,
+ &result, &length);
+
+ if (retval < 0)
+ {
+ /* Close cd, but preserve the errno from str_cd_iconv. */
+ int saved_errno = errno;
+ iconveh_close (&cd);
+ errno = saved_errno;
+ }
+ else
+ {
+ if (iconveh_close (&cd) < 0)
+ {
+ /* Return -1, but free the allocated memory, and while doing
+ that, preserve the errno from iconveh_close. */
+ int saved_errno = errno;
+ if (result != *resultp && result != NULL)
+ free (result);
+ errno = saved_errno;
+ return -1;
+ }
+ *resultp = result;
+ *lengthp = length;
+ }
+ return retval;
+#else
+ /* This is a different error code than if iconv_open existed but didn't
+ support from_codeset and to_codeset, so that the caller can emit
+ an error message such as
+ "iconv() is not supported. Installing GNU libiconv and
+ then reinstalling this package would fix this." */
+ errno = ENOSYS;
+ return -1;
+#endif
+ }
+}
+
+char *
+str_iconveh (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler)
+{
+ if (*src == '\0' || c_strcasecmp (from_codeset, to_codeset) == 0)
+ {
+ char *result = strdup (src);
+
+ if (result == NULL)
+ errno = ENOMEM;
+ return result;
+ }
+ else
+ {
+#if HAVE_ICONV
+ iconveh_t cd;
+ char *result;
+
+ if (iconveh_open (to_codeset, from_codeset, &cd) < 0)
+ return NULL;
+
+ result = str_cd_iconveh (src, &cd, handler);
+
+ if (result == NULL)
+ {
+ /* Close cd, but preserve the errno from str_cd_iconv. */
+ int saved_errno = errno;
+ iconveh_close (&cd);
+ errno = saved_errno;
+ }
+ else
+ {
+ if (iconveh_close (&cd) < 0)
+ {
+ /* Return NULL, but free the allocated memory, and while doing
+ that, preserve the errno from iconveh_close. */
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+ return result;
+#else
+ /* This is a different error code than if iconv_open existed but didn't
+ support from_codeset and to_codeset, so that the caller can emit
+ an error message such as
+ "iconv() is not supported. Installing GNU libiconv and
+ then reinstalling this package would fix this." */
+ errno = ENOSYS;
+ return NULL;
+#endif
+ }
+}
diff --git a/gnulib/lib/striconveh.h b/gnulib/lib/striconveh.h
new file mode 100644
index 00000000..295a8034
--- /dev/null
+++ b/gnulib/lib/striconveh.h
@@ -0,0 +1,140 @@
+/* Character set conversion with error handling.
+ Copyright (C) 2001-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ 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/>. */
+
+#ifndef _STRICONVEH_H
+#define _STRICONVEH_H
+
+#include <stddef.h>
+#if HAVE_ICONV
+#include <iconv.h>
+#endif
+
+#include "iconveh.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if HAVE_ICONV
+
+/* An conversion descriptor for use by the iconveh functions. */
+typedef struct
+ {
+ /* Conversion descriptor from FROM_CODESET to TO_CODESET, or (iconv_t)(-1)
+ if the system does not support a direct conversion from FROM_CODESET to
+ TO_CODESET. */
+ iconv_t cd;
+ /* Conversion descriptor from FROM_CODESET to UTF-8 (or (iconv_t)(-1) if
+ FROM_CODESET is UTF-8). */
+ iconv_t cd1;
+ /* Conversion descriptor from UTF-8 to TO_CODESET (or (iconv_t)(-1) if
+ TO_CODESET is UTF-8). */
+ iconv_t cd2;
+ }
+ iconveh_t;
+
+/* Open a conversion descriptor for use by the iconveh functions.
+ If successful, fills *CDP and returns 0. Upon failure, return -1 with errno
+ set. */
+extern int
+ iconveh_open (const char *to_codeset, const char *from_codeset,
+ iconveh_t *cdp);
+
+/* Close a conversion descriptor created by iconveh_open().
+ Return value: 0 if successful, otherwise -1 and errno set. */
+extern int
+ iconveh_close (const iconveh_t *cd);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ CD points to the conversion descriptor from FROMCODE to TOCODE, created by
+ the function iconveh_open().
+ 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 (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ mem_cd_iconveh (const char *src, size_t srclen,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ CD points to the conversion descriptor from FROMCODE to TOCODE, created by
+ the function iconveh_open().
+ Both the "from" and the "to" encoding must use a single NUL byte at the end
+ of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ str_cd_iconveh (const char *src,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler);
+
+#endif
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ 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 (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ mem_iconveh (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ str_iconveh (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRICONVEH_H */
diff --git a/gnulib/lib/striconveha.c b/gnulib/lib/striconveha.c
new file mode 100644
index 00000000..ade0ec7e
--- /dev/null
+++ b/gnulib/lib/striconveha.c
@@ -0,0 +1,348 @@
+/* Character set conversion with error handling and autodetection.
+ Copyright (C) 2002, 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "striconveha.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "malloca.h"
+#include "c-strcase.h"
+#include "striconveh.h"
+
+#define SIZEOF(a) (sizeof(a)/sizeof(a[0]))
+
+
+/* Autodetection list. */
+
+struct autodetect_alias
+{
+ struct autodetect_alias *next;
+ const char *name;
+ const char * const *encodings_to_try;
+};
+
+static const char * const autodetect_utf8_try[] =
+{
+ /* Try UTF-8 first. There are very few ISO-8859-1 inputs that would
+ be valid UTF-8, but many UTF-8 inputs are valid ISO-8859-1. */
+ "UTF-8", "ISO-8859-1",
+ NULL
+};
+static const char * const autodetect_jp_try[] =
+{
+ /* Try 7-bit encoding first. If the input contains bytes >= 0x80,
+ it will fail.
+ Try EUC-JP next. Short SHIFT_JIS inputs may come out wrong. This
+ is unavoidable. People will condemn SHIFT_JIS.
+ If we tried SHIFT_JIS first, then some short EUC-JP inputs would
+ come out wrong, and people would condemn EUC-JP and Unix, which
+ would not be good.
+ Finally try SHIFT_JIS. */
+ "ISO-2022-JP-2", "EUC-JP", "SHIFT_JIS",
+ NULL
+};
+static const char * const autodetect_kr_try[] =
+{
+ /* Try 7-bit encoding first. If the input contains bytes >= 0x80,
+ it will fail.
+ Finally try EUC-KR. */
+ "ISO-2022-KR", "EUC-KR",
+ NULL
+};
+
+static struct autodetect_alias autodetect_predefined[] =
+{
+ { &autodetect_predefined[1], "autodetect_utf8", autodetect_utf8_try },
+ { &autodetect_predefined[2], "autodetect_jp", autodetect_jp_try },
+ { NULL, "autodetect_kr", autodetect_kr_try }
+};
+
+static struct autodetect_alias *autodetect_list = &autodetect_predefined[0];
+static struct autodetect_alias **autodetect_list_end =
+ &autodetect_predefined[SIZEOF(autodetect_predefined)-1].next;
+
+int
+uniconv_register_autodetect (const char *name,
+ const char * const *try_in_order)
+{
+ size_t namelen;
+ size_t listlen;
+ size_t memneed;
+ size_t i;
+ char *memory;
+ struct autodetect_alias *new_alias;
+ char *new_name;
+ const char **new_try_in_order;
+
+ /* The TRY_IN_ORDER list must not be empty. */
+ if (try_in_order[0] == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* We must deep-copy NAME and TRY_IN_ORDER, because they may be allocated
+ with dynamic extent. */
+ namelen = strlen (name) + 1;
+ memneed = sizeof (struct autodetect_alias) + namelen + sizeof (char *);
+ for (i = 0; try_in_order[i] != NULL; i++)
+ memneed += sizeof (char *) + strlen (try_in_order[i]) + 1;
+ listlen = i;
+
+ memory = (char *) malloc (memneed);
+ if (memory != NULL)
+ {
+ new_alias = (struct autodetect_alias *) memory;
+ memory += sizeof (struct autodetect_alias);
+
+ new_try_in_order = (const char **) memory;
+ memory += (listlen + 1) * sizeof (char *);
+
+ new_name = (char *) memory;
+ memcpy (new_name, name, namelen);
+ memory += namelen;
+
+ for (i = 0; i < listlen; i++)
+ {
+ size_t len = strlen (try_in_order[i]) + 1;
+ memcpy (memory, try_in_order[i], len);
+ new_try_in_order[i] = (const char *) memory;
+ memory += len;
+ }
+ new_try_in_order[i] = NULL;
+
+ /* Now insert the new alias. */
+ new_alias->name = new_name;
+ new_alias->encodings_to_try = new_try_in_order;
+ new_alias->next = NULL;
+ /* FIXME: Not multithread-safe. */
+ *autodetect_list_end = new_alias;
+ autodetect_list_end = &new_alias->next;
+ return 0;
+ }
+ else
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+}
+
+/* Like mem_iconveha, except no handling of transliteration. */
+static int
+mem_iconveha_notranslit (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ int retval = mem_iconveh (src, srclen, from_codeset, to_codeset, handler,
+ offsets, resultp, lengthp);
+ if (retval >= 0 || errno != EINVAL)
+ return retval;
+ else
+ {
+ struct autodetect_alias *alias;
+
+ /* Unsupported from_codeset or to_codeset. Check whether the caller
+ requested autodetection. */
+ for (alias = autodetect_list; alias != NULL; alias = alias->next)
+ if (strcmp (from_codeset, alias->name) == 0)
+ {
+ const char * const *encodings;
+
+ if (handler != iconveh_error)
+ {
+ /* First try all encodings without any forgiving. */
+ encodings = alias->encodings_to_try;
+ do
+ {
+ retval = mem_iconveha_notranslit (src, srclen,
+ *encodings, to_codeset,
+ iconveh_error, offsets,
+ resultp, lengthp);
+ if (!(retval < 0 && errno == EILSEQ))
+ return retval;
+ encodings++;
+ }
+ while (*encodings != NULL);
+ }
+
+ encodings = alias->encodings_to_try;
+ do
+ {
+ retval = mem_iconveha_notranslit (src, srclen,
+ *encodings, to_codeset,
+ handler, offsets,
+ resultp, lengthp);
+ if (!(retval < 0 && errno == EILSEQ))
+ return retval;
+ encodings++;
+ }
+ while (*encodings != NULL);
+
+ /* Return the last call's result. */
+ return -1;
+ }
+
+ /* It wasn't an autodetection name. */
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+int
+mem_iconveha (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ bool transliterate,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ if (srclen == 0)
+ {
+ /* Nothing to convert. */
+ *lengthp = 0;
+ return 0;
+ }
+
+ /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+ we want to use transliteration. */
+#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 || _LIBICONV_VERSION >= 0x0105
+ if (transliterate)
+ {
+ int retval;
+ size_t len = strlen (to_codeset);
+ char *to_codeset_suffixed = (char *) malloca (len + 10 + 1);
+ memcpy (to_codeset_suffixed, to_codeset, len);
+ memcpy (to_codeset_suffixed + len, "//TRANSLIT", 10 + 1);
+
+ retval = mem_iconveha_notranslit (src, srclen,
+ from_codeset, to_codeset_suffixed,
+ handler, offsets, resultp, lengthp);
+
+ freea (to_codeset_suffixed);
+
+ return retval;
+ }
+ else
+#endif
+ return mem_iconveha_notranslit (src, srclen,
+ from_codeset, to_codeset,
+ handler, offsets, resultp, lengthp);
+}
+
+/* Like str_iconveha, except no handling of transliteration. */
+static char *
+str_iconveha_notranslit (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler)
+{
+ char *result = str_iconveh (src, from_codeset, to_codeset, handler);
+
+ if (result != NULL || errno != EINVAL)
+ return result;
+ else
+ {
+ struct autodetect_alias *alias;
+
+ /* Unsupported from_codeset or to_codeset. Check whether the caller
+ requested autodetection. */
+ for (alias = autodetect_list; alias != NULL; alias = alias->next)
+ if (strcmp (from_codeset, alias->name) == 0)
+ {
+ const char * const *encodings;
+
+ if (handler != iconveh_error)
+ {
+ /* First try all encodings without any forgiving. */
+ encodings = alias->encodings_to_try;
+ do
+ {
+ result = str_iconveha_notranslit (src,
+ *encodings, to_codeset,
+ iconveh_error);
+ if (!(result == NULL && errno == EILSEQ))
+ return result;
+ encodings++;
+ }
+ while (*encodings != NULL);
+ }
+
+ encodings = alias->encodings_to_try;
+ do
+ {
+ result = str_iconveha_notranslit (src,
+ *encodings, to_codeset,
+ handler);
+ if (!(result == NULL && errno == EILSEQ))
+ return result;
+ encodings++;
+ }
+ while (*encodings != NULL);
+
+ /* Return the last call's result. */
+ return NULL;
+ }
+
+ /* It wasn't an autodetection name. */
+ errno = EINVAL;
+ return NULL;
+ }
+}
+
+char *
+str_iconveha (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ bool transliterate,
+ enum iconv_ilseq_handler handler)
+{
+ if (*src == '\0' || c_strcasecmp (from_codeset, to_codeset) == 0)
+ {
+ char *result = strdup (src);
+
+ if (result == NULL)
+ errno = ENOMEM;
+ return result;
+ }
+
+ /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+ we want to use transliteration. */
+#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 || _LIBICONV_VERSION >= 0x0105
+ if (transliterate)
+ {
+ char *result;
+ size_t len = strlen (to_codeset);
+ char *to_codeset_suffixed = (char *) malloca (len + 10 + 1);
+ memcpy (to_codeset_suffixed, to_codeset, len);
+ memcpy (to_codeset_suffixed + len, "//TRANSLIT", 10 + 1);
+
+ result = str_iconveha_notranslit (src, from_codeset, to_codeset_suffixed,
+ handler);
+
+ freea (to_codeset_suffixed);
+
+ return result;
+ }
+ else
+#endif
+ return str_iconveha_notranslit (src, from_codeset, to_codeset, handler);
+}
diff --git a/gnulib/lib/striconveha.h b/gnulib/lib/striconveha.h
new file mode 100644
index 00000000..b7313fbf
--- /dev/null
+++ b/gnulib/lib/striconveha.h
@@ -0,0 +1,95 @@
+/* Character set conversion with error handling and autodetection.
+ Copyright (C) 2002, 2005, 2007-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ 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/>. */
+
+#ifndef _STRICONVEHA_H
+#define _STRICONVEHA_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#include "iconveh.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ The "from" encoding can also be a name defined for autodetection.
+ If TRANSLITERATE is true, transliteration will attempted to avoid conversion
+ errors, for iconv implementations that support this. Usually you'll choose
+ TRANSLITERATE = true if HANDLER != iconveh_error.
+ 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 (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ mem_iconveha (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ bool transliterate,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ The "from" encoding can also be a name defined for autodetection.
+ If TRANSLITERATE is true, transliteration will attempted to avoid conversion
+ errors, for iconv implementations that support this. Usually you'll choose
+ TRANSLITERATE = true if HANDLER != iconveh_error.
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ str_iconveha (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ bool transliterate,
+ enum iconv_ilseq_handler handler);
+
+
+/* In the above, FROM_CODESET can also be one of the following values:
+ "autodetect_utf8" supports ISO-8859-1 and UTF-8
+ "autodetect_jp" supports EUC-JP, ISO-2022-JP-2 and SHIFT_JIS
+ "autodetect_kr" supports EUC-KR and ISO-2022-KR
+ More names can be defined for autodetection. */
+
+/* Registers an encoding name for autodetection.
+ TRY_IN_ORDER is a NULL terminated list of encodings to be tried.
+ Returns 0 upon success, or -1 (with errno set) in case of error.
+ Particular errno values: ENOMEM. */
+extern int
+ uniconv_register_autodetect (const char *name,
+ const char * const *try_in_order);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRICONVEHA_H */
diff --git a/gnulib/lib/string.in.h b/gnulib/lib/string.in.h
new file mode 100644
index 00000000..8749f73d
--- /dev/null
+++ b/gnulib/lib/string.in.h
@@ -0,0 +1,642 @@
+/* A GNU-like <string.h>.
+
+ Copyright (C) 1995-1996, 2001-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_STRING_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#ifndef _GL_STRING_H
+#define _GL_STRING_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MirBSD defines mbslen as a macro. */
+#if @GNULIB_MBSLEN@ && defined __MirBSD__
+# include <wchar.h>
+#endif
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
+# define __attribute__(Spec) /* empty */
+# endif
+/* The attribute __pure__ was added in gcc 2.96. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
+# define __pure__ /* empty */
+# endif
+#endif
+
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return the first instance of C within N bytes of S, or NULL. */
+#if @GNULIB_MEMCHR@
+# if @REPLACE_MEMCHR@
+# define memchr rpl_memchr
+extern void *memchr (void const *__s, int __c, size_t __n)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memchr
+/* Assume memchr is always declared. */
+_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
+ "use gnulib module memchr for portability" );
+#endif
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. */
+#if @GNULIB_MEMMEM@
+# if @REPLACE_MEMMEM@
+# define memmem rpl_memmem
+# endif
+# if ! @HAVE_DECL_MEMMEM@ || @REPLACE_MEMMEM@
+extern void *memmem (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memmem
+# if HAVE_RAW_DECL_MEMMEM
+_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
+ "use gnulib module memmem-simple for portability, "
+ "and module memmem for speed" );
+# endif
+#endif
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+ last written byte. */
+#if @GNULIB_MEMPCPY@
+# if ! @HAVE_MEMPCPY@
+extern void *mempcpy (void *restrict __dest, void const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mempcpy
+# if HAVE_RAW_DECL_MEMPCPY
+_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
+ "use gnulib module mempcpy for portability");
+# endif
+#endif
+
+/* Search backwards through a block for a byte (specified as an int). */
+#if @GNULIB_MEMRCHR@
+# if ! @HAVE_DECL_MEMRCHR@
+extern void *memrchr (void const *, int, size_t)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memrchr
+# if HAVE_RAW_DECL_MEMRCHR
+_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
+ "use gnulib module memrchr for portability");
+# endif
+#endif
+
+/* Find the first occurrence of C in S. More efficient than
+ memchr(S,C,N), at the expense of undefined behavior if C does not
+ occur within N bytes. */
+#if @GNULIB_RAWMEMCHR@
+# if ! @HAVE_RAWMEMCHR@
+extern void *rawmemchr (void const *__s, int __c_in)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rawmemchr
+# if HAVE_RAW_DECL_RAWMEMCHR
+_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
+ "use gnulib module rawmemchr for portability");
+# endif
+#endif
+
+/* Copy SRC to DST, returning the address of the terminating '\0' in DST. */
+#if @GNULIB_STPCPY@
+# if ! @HAVE_STPCPY@
+extern char *stpcpy (char *restrict __dst, char const *restrict __src)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef stpcpy
+# if HAVE_RAW_DECL_STPCPY
+_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
+ "use gnulib module stpcpy for portability");
+# endif
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+ last non-NUL byte written into DST. */
+#if @GNULIB_STPNCPY@
+# if ! @HAVE_STPNCPY@
+# define stpncpy gnu_stpncpy
+extern char *stpncpy (char *restrict __dst, char const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef stpncpy
+# if HAVE_RAW_DECL_STPNCPY
+_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
+ "use gnulib module stpncpy for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strchr() does not work with multibyte strings if the locale encoding is
+ GB18030 and the character to be searched is a digit. */
+# undef strchr
+/* Assume strchr is always declared. */
+_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
+ "in some multibyte locales - "
+ "use mbschr if you care about internationalization");
+#endif
+
+/* Find the first occurrence of C in S or the final NUL byte. */
+#if @GNULIB_STRCHRNUL@
+# if ! @HAVE_STRCHRNUL@
+extern char *strchrnul (char const *__s, int __c_in)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strchrnul
+# if HAVE_RAW_DECL_STRCHRNUL
+_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
+ "use gnulib module strchrnul for portability");
+# endif
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+#if @GNULIB_STRDUP@
+# if @REPLACE_STRDUP@
+# undef strdup
+# define strdup rpl_strdup
+# endif
+# if !(@HAVE_DECL_STRDUP@ || defined strdup) || @REPLACE_STRDUP@
+extern char *strdup (char const *__s) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strdup
+# if HAVE_RAW_DECL_STRDUP
+_GL_WARN_ON_USE (strdup, "strdup is unportable - "
+ "use gnulib module strdup for portability");
+# endif
+#endif
+
+/* Return a newly allocated copy of at most N bytes of STRING. */
+#if @GNULIB_STRNDUP@
+# if @REPLACE_STRNDUP@
+# undef strndup
+# define strndup rpl_strndup
+# endif
+# if @REPLACE_STRNDUP@ || ! @HAVE_DECL_STRNDUP@
+extern char *strndup (char const *__string, size_t __n) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strndup
+# if HAVE_RAW_DECL_STRNDUP
+_GL_WARN_ON_USE (strndup, "strndup is unportable - "
+ "use gnulib module strndup for portability");
+# endif
+#endif
+
+/* Find the length (number of bytes) of STRING, but scan at most
+ MAXLEN bytes. If no '\0' terminator is found in that many bytes,
+ return MAXLEN. */
+#if @GNULIB_STRNLEN@
+# if ! @HAVE_DECL_STRNLEN@
+extern size_t strnlen (char const *__string, size_t __maxlen)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strnlen
+# if HAVE_RAW_DECL_STRNLEN
+_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
+ "use gnulib module strnlen for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strcspn() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it does not work with multibyte strings if the
+ locale encoding is GB18030 and one of the characters to be searched is a
+ digit. */
+# undef strcspn
+/* Assume strcspn is always declared. */
+_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbscspn if you care about internationalization");
+#endif
+
+/* Find the first occurrence in S of any character in ACCEPT. */
+#if @GNULIB_STRPBRK@
+# if ! @HAVE_STRPBRK@
+extern char *strpbrk (char const *__s, char const *__accept)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2));
+# endif
+# if defined GNULIB_POSIXCHECK
+/* strpbrk() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it does not work with multibyte strings if the
+ locale encoding is GB18030 and one of the characters to be searched is a
+ digit. */
+# undef strpbrk
+_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbspbrk if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strpbrk
+# if HAVE_RAW_DECL_STRPBRK
+_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
+ "use gnulib module strpbrk for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strspn() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it cannot work with multibyte strings. */
+# undef strspn
+/* Assume strspn is always declared. */
+_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbsspn if you care about internationalization");
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strrchr() does not work with multibyte strings if the locale encoding is
+ GB18030 and the character to be searched is a digit. */
+# undef strrchr
+/* Assume strrchr is always declared. */
+_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
+ "in some multibyte locales - "
+ "use mbsrchr if you care about internationalization");
+#endif
+
+/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
+ If one is found, overwrite it with a NUL, and advance *STRINGP
+ to point to the next char after it. Otherwise, set *STRINGP to NULL.
+ If *STRINGP was already NULL, nothing happens.
+ Return the old value of *STRINGP.
+
+ This is a variant of strtok() that is multithread-safe and supports
+ empty fields.
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+ Caveat: It doesn't work with multibyte strings unless all of the delimiter
+ characters are ASCII characters < 0x30.
+
+ See also strtok_r(). */
+#if @GNULIB_STRSEP@
+# if ! @HAVE_STRSEP@
+extern char *strsep (char **restrict __stringp, char const *restrict __delim)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef strsep
+_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbssep if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strsep
+# if HAVE_RAW_DECL_STRSEP
+_GL_WARN_ON_USE (strsep, "strsep is unportable - "
+ "use gnulib module strsep for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSTR@
+# if @REPLACE_STRSTR@
+# define strstr rpl_strstr
+extern char *strstr (const char *haystack, const char *needle)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strstr() does not work with multibyte strings if the locale encoding is
+ different from UTF-8:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strstr
+/* Assume strstr is always declared. */
+_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
+ "work correctly on character strings in most "
+ "multibyte locales - "
+ "use mbsstr if you care about internationalization, "
+ "or use strstr if you care about speed");
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison. */
+#if @GNULIB_STRCASESTR@
+# if @REPLACE_STRCASESTR@
+# define strcasestr rpl_strcasestr
+# endif
+# if ! @HAVE_STRCASESTR@ || @REPLACE_STRCASESTR@
+extern char *strcasestr (const char *haystack, const char *needle)
+ __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strcasestr() does not work with multibyte strings:
+ It is a glibc extension, and glibc implements it only for unibyte
+ locales. */
+# undef strcasestr
+# if HAVE_RAW_DECL_STRCASESTR
+_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
+ "strings in multibyte locales - "
+ "use mbscasestr if you care about "
+ "internationalization, or use c-strcasestr if you want "
+ "a locale independent function");
+# endif
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+ If S is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = strtok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+
+ This is a variant of strtok() that is multithread-safe.
+
+ For the POSIX documentation for this function, see:
+ http://www.opengroup.org/susv3xsh/strtok.html
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+ Caveat: It doesn't work with multibyte strings unless all of the delimiter
+ characters are ASCII characters < 0x30.
+
+ See also strsep(). */
+#if @GNULIB_STRTOK_R@
+# if @REPLACE_STRTOK_R@
+# undef strtok_r
+# define strtok_r rpl_strtok_r
+# elif @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
+# undef strtok_r
+# endif
+# if ! @HAVE_DECL_STRTOK_R@ || @REPLACE_STRTOK_R@
+extern char *strtok_r (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr)
+ _GL_ARG_NONNULL ((2, 3));
+# endif
+# if defined GNULIB_POSIXCHECK
+_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbstok_r if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtok_r
+# if HAVE_RAW_DECL_STRTOK_R
+_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
+ "use gnulib module strtok_r for portability");
+# endif
+#endif
+
+
+/* The following functions are not specified by POSIX. They are gnulib
+ extensions. */
+
+#if @GNULIB_MBSLEN@
+/* Return the number of multibyte characters in the character string STRING.
+ This considers multibyte characters, unlike strlen, which counts bytes. */
+# ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */
+# undef mbslen
+# endif
+# if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */
+# define mbslen rpl_mbslen
+# endif
+extern size_t mbslen (const char *string) _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSNLEN@
+/* Return the number of multibyte characters in the character string starting
+ at STRING and ending at STRING + LEN. */
+extern size_t mbsnlen (const char *string, size_t len) _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSCHR@
+/* Locate the first single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING.
+ Unlike strchr(), this function works correctly in multibyte locales with
+ encodings such as GB18030. */
+# define mbschr rpl_mbschr /* avoid collision with HP-UX function */
+extern char * mbschr (const char *string, int c) _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSRCHR@
+/* Locate the last single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING.
+ Unlike strrchr(), this function works correctly in multibyte locales with
+ encodings such as GB18030. */
+# define mbsrchr rpl_mbsrchr /* avoid collision with HP-UX function */
+extern char * mbsrchr (const char *string, int c) _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSSTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK.
+ Unlike strstr(), this function works correctly in multibyte locales with
+ encodings different from UTF-8. */
+extern char * mbsstr (const char *haystack, const char *needle)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASECMP@
+/* Compare the character strings S1 and S2, ignoring case, returning less than,
+ equal to or greater than zero if S1 is lexicographically less than, equal to
+ or greater than S2.
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths!
+ Unlike strcasecmp(), this function works correctly in multibyte locales. */
+extern int mbscasecmp (const char *s1, const char *s2)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSNCASECMP@
+/* Compare the initial segment of the character string S1 consisting of at most
+ N characters with the initial segment of the character string S2 consisting
+ of at most N characters, ignoring case, returning less than, equal to or
+ greater than zero if the initial segment of S1 is lexicographically less
+ than, equal to or greater than the initial segment of S2.
+ Note: This function may, in multibyte locales, return 0 for initial segments
+ of different lengths!
+ Unlike strncasecmp(), this function works correctly in multibyte locales.
+ But beware that N is not a byte count but a character count! */
+extern int mbsncasecmp (const char *s1, const char *s2, size_t n)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPCASECMP@
+/* Compare the initial segment of the character string STRING consisting of
+ at most mbslen (PREFIX) characters with the character string PREFIX,
+ ignoring case, returning less than, equal to or greater than zero if this
+ initial segment is lexicographically less than, equal to or greater than
+ PREFIX.
+ Note: This function may, in multibyte locales, return 0 if STRING is of
+ smaller length than PREFIX!
+ Unlike strncasecmp(), this function works correctly in multibyte
+ locales. */
+extern char * mbspcasecmp (const char *string, const char *prefix)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASESTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK, using case-insensitive comparison.
+ Note: This function may, in multibyte locales, return success even if
+ strlen (haystack) < strlen (needle) !
+ Unlike strcasestr(), this function works correctly in multibyte locales. */
+extern char * mbscasestr (const char *haystack, const char *needle)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCSPN@
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists.
+ Unlike strcspn(), this function works correctly in multibyte locales. */
+extern size_t mbscspn (const char *string, const char *accept)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPBRK@
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the pointer to it, or NULL if none
+ exists.
+ Unlike strpbrk(), this function works correctly in multibyte locales. */
+# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
+extern char * mbspbrk (const char *string, const char *accept)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSSPN@
+/* Find the first occurrence in the character string STRING of any character
+ not in the character string REJECT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists.
+ Unlike strspn(), this function works correctly in multibyte locales. */
+extern size_t mbsspn (const char *string, const char *reject)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSSEP@
+/* Search the next delimiter (multibyte character listed in the character
+ string DELIM) starting at the character string *STRINGP.
+ If one is found, overwrite it with a NUL, and advance *STRINGP to point
+ to the next multibyte character after it. Otherwise, set *STRINGP to NULL.
+ If *STRINGP was already NULL, nothing happens.
+ Return the old value of *STRINGP.
+
+ This is a variant of mbstok_r() that supports empty fields.
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+
+ See also mbstok_r(). */
+extern char * mbssep (char **stringp, const char *delim)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSTOK_R@
+/* Parse the character string STRING into tokens separated by characters in
+ the character string DELIM.
+ If STRING is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = mbstok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+
+ See also mbssep(). */
+extern char * mbstok_r (char *string, const char *delim, char **save_ptr)
+ _GL_ARG_NONNULL ((2, 3));
+#endif
+
+/* Map any int, typically from errno, into an error message. */
+#if @GNULIB_STRERROR@
+# if @REPLACE_STRERROR@
+# undef strerror
+# define strerror rpl_strerror
+extern char *strerror (int);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror
+/* Assume strerror is always declared. */
+_GL_WARN_ON_USE (strerror, "strerror is unportable - "
+ "use gnulib module strerror to guarantee non-NULL result");
+#endif
+
+#if @GNULIB_STRSIGNAL@
+# if @REPLACE_STRSIGNAL@
+# define strsignal rpl_strsignal
+# endif
+# if ! @HAVE_DECL_STRSIGNAL@ || @REPLACE_STRSIGNAL@
+extern char *strsignal (int __sig);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strsignal
+# if HAVE_RAW_DECL_STRSIGNAL
+_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
+ "use gnulib module strsignal for portability");
+# endif
+#endif
+
+#if @GNULIB_STRVERSCMP@
+# if !@HAVE_STRVERSCMP@
+extern int strverscmp (const char *, const char *) _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strverscmp
+# if HAVE_RAW_DECL_STRVERSCMP
+_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
+ "use gnulib module strverscmp for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_STRING_H */
+#endif /* _GL_STRING_H */
diff --git a/gnulib/lib/strings.in.h b/gnulib/lib/strings.in.h
new file mode 100644
index 00000000..09318992
--- /dev/null
+++ b/gnulib/lib/strings.in.h
@@ -0,0 +1,93 @@
+/* A substitute <strings.h>.
+
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_STRINGS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STRINGS_H@
+
+#ifndef _GL_STRINGS_H
+#define _GL_STRINGS_H
+
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2.
+ Note: This function does not work in multibyte locales. */
+#if ! @HAVE_STRCASECMP@
+extern int strcasecmp (char const *s1, char const *s2)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+#if defined GNULIB_POSIXCHECK
+/* strcasecmp() does not work with multibyte strings:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strcasecmp
+# if HAVE_RAW_DECL_STRCASECMP
+_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbscasecmp if you care about "
+ "internationalization, or use c_strcasecmp , "
+ "gnulib module c-strcase) if you want a locale "
+ "independent function");
+# endif
+#endif
+
+/* Compare no more than N bytes of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2.
+ Note: This function cannot work correctly in multibyte locales. */
+#if ! @HAVE_DECL_STRNCASECMP@
+extern int strncasecmp (char const *s1, char const *s2, size_t n)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+#if defined GNULIB_POSIXCHECK
+/* strncasecmp() does not work with multibyte strings:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strncasecmp
+# if HAVE_RAW_DECL_STRNCASECMP
+_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbsncasecmp or mbspcasecmp if you care about "
+ "internationalization, or use c_strncasecmp , "
+ "gnulib module c-strcase) if you want a locale "
+ "independent function");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_STRING_H */
+#endif /* _GL_STRING_H */
diff --git a/gnulib/lib/stripslash.c b/gnulib/lib/stripslash.c
new file mode 100644
index 00000000..3a5996fd
--- /dev/null
+++ b/gnulib/lib/stripslash.c
@@ -0,0 +1,45 @@
+/* stripslash.c -- remove redundant trailing slashes from a file name
+
+ Copyright (C) 1990, 2001, 2003-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+/* Remove trailing slashes from FILE. Return true if a trailing slash
+ was removed. This is useful when using file name completion from a
+ shell that adds a "/" after directory names (such as tcsh and
+ bash), because on symlinks to directories, several system calls
+ have different semantics according to whether a trailing slash is
+ present. */
+
+bool
+strip_trailing_slashes (char *file)
+{
+ char *base = last_component (file);
+ char *base_lim;
+ bool had_slash;
+
+ /* last_component returns "" for file system roots, but we need to turn
+ `///' into `/'. */
+ if (! *base)
+ base = file;
+ base_lim = base + base_len (base);
+ had_slash = (*base_lim != '\0');
+ *base_lim = '\0';
+ return had_slash;
+}
diff --git a/gnulib/lib/strncasecmp.c b/gnulib/lib/strncasecmp.c
new file mode 100644
index 00000000..f4502ac7
--- /dev/null
+++ b/gnulib/lib/strncasecmp.c
@@ -0,0 +1,63 @@
+/* strncasecmp.c -- case insensitive string comparator
+ Copyright (C) 1998-1999, 2005-2007, 2009-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare no more than N bytes of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2.
+ Note: This function cannot work correctly in multibyte locales. */
+
+int
+strncasecmp (const char *s1, const char *s2, size_t n)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || n == 0)
+ return 0;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (--n == 0 || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/gnulib/lib/strndup.c b/gnulib/lib/strndup.c
new file mode 100644
index 00000000..6b01f7df
--- /dev/null
+++ b/gnulib/lib/strndup.c
@@ -0,0 +1,37 @@
+/* A replacement function, for systems that lack strndup.
+
+ Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2005, 2006, 2007, 2009,
+ 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <stdlib.h>
+
+char *
+strndup (char const *s, size_t n)
+{
+ size_t len = strnlen (s, n);
+ char *new = malloc (len + 1);
+
+ if (new == NULL)
+ return NULL;
+
+ new[len] = '\0';
+ return memcpy (new, s, len);
+}
diff --git a/gnulib/lib/strnlen.c b/gnulib/lib/strnlen.c
new file mode 100644
index 00000000..112df49a
--- /dev/null
+++ b/gnulib/lib/strnlen.c
@@ -0,0 +1,31 @@
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <string.h>
+
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+
+size_t
+strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
diff --git a/gnulib/lib/strnlen1.c b/gnulib/lib/strnlen1.c
new file mode 100644
index 00000000..b8cd2bff
--- /dev/null
+++ b/gnulib/lib/strnlen1.c
@@ -0,0 +1,35 @@
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "strnlen1.h"
+
+#include <string.h>
+
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+/* This is the same as strnlen (string, maxlen - 1) + 1. */
+size_t
+strnlen1 (const char *string, size_t maxlen)
+{
+ const char *end = (const char *) memchr (string, '\0', maxlen);
+ if (end != NULL)
+ return end - string + 1;
+ else
+ return maxlen;
+}
diff --git a/gnulib/lib/strnlen1.h b/gnulib/lib/strnlen1.h
new file mode 100644
index 00000000..dfaf62dc
--- /dev/null
+++ b/gnulib/lib/strnlen1.h
@@ -0,0 +1,39 @@
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ Copyright (C) 2005, 2009, 2010 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/>. */
+
+#ifndef _STRNLEN1_H
+#define _STRNLEN1_H
+
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+/* This is the same as strnlen (string, maxlen - 1) + 1. */
+extern size_t strnlen1 (const char *string, size_t maxlen);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRNLEN1_H */
diff --git a/gnulib/lib/strpbrk.c b/gnulib/lib/strpbrk.c
new file mode 100644
index 00000000..72de53a8
--- /dev/null
+++ b/gnulib/lib/strpbrk.c
@@ -0,0 +1,42 @@
+/* Copyright (C) 1991, 1994, 2000, 2002-2003, 2006, 2009-2010 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <string.h>
+
+#undef strpbrk
+
+/* Find the first occurrence in S of any character in ACCEPT. */
+char *
+strpbrk (const char *s, const char *accept)
+{
+ while (*s != '\0')
+ {
+ const char *a = accept;
+ while (*a != '\0')
+ if (*a++ == *s)
+ return (char *) s;
+ ++s;
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/strptime.c b/gnulib/lib/strptime.c
new file mode 100644
index 00000000..ac14620f
--- /dev/null
+++ b/gnulib/lib/strptime.c
@@ -0,0 +1,1139 @@
+/* Copyright (C) 2002, 2004, 2005, 2007, 2009, 2010 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <time.h>
+
+#include <assert.h>
+#include <ctype.h>
+#ifdef _LIBC
+# include <langinfo.h>
+#endif
+#include <limits.h>
+#include <string.h>
+#include <stdbool.h>
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+#endif
+
+#ifndef _LIBC
+enum ptime_locale_status { not, loc, raw };
+#endif
+
+
+
+#define match_char(ch1, ch2) if (ch1 != ch2) return NULL
+#if defined _LIBC && defined __GNUC__ && __GNUC__ >= 2
+# define match_string(cs1, s2) \
+ ({ size_t len = strlen (cs1); \
+ int result = __strncasecmp_l ((cs1), (s2), len, locale) == 0; \
+ if (result) (s2) += len; \
+ result; })
+#else
+/* Oh come on. Get a reasonable compiler. */
+# define match_string(cs1, s2) \
+ (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1))
+#endif
+/* We intentionally do not use isdigit() for testing because this will
+ lead to problems with the wide character version. */
+#define get_number(from, to, n) \
+ do { \
+ int __n = n; \
+ val = 0; \
+ while (*rp == ' ') \
+ ++rp; \
+ if (*rp < '0' || *rp > '9') \
+ return NULL; \
+ do { \
+ val *= 10; \
+ val += *rp++ - '0'; \
+ } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9'); \
+ if (val < from || val > to) \
+ return NULL; \
+ } while (0)
+#ifdef _NL_CURRENT
+# define get_alt_number(from, to, n) \
+ ({ \
+ __label__ do_normal; \
+ \
+ if (*decided != raw) \
+ { \
+ val = _nl_parse_alt_digit (&rp HELPER_LOCALE_ARG); \
+ if (val == -1 && *decided != loc) \
+ { \
+ *decided = loc; \
+ goto do_normal; \
+ } \
+ if (val < from || val > to) \
+ return NULL; \
+ } \
+ else \
+ { \
+ do_normal: \
+ get_number (from, to, n); \
+ } \
+ 0; \
+ })
+#else
+# define get_alt_number(from, to, n) \
+ /* We don't have the alternate representation. */ \
+ get_number(from, to, n)
+#endif
+#define recursive(new_fmt) \
+ (*(new_fmt) != '\0' \
+ && (rp = __strptime_internal (rp, (new_fmt), tm, \
+ decided, era_cnt LOCALE_ARG)) != NULL)
+
+
+#ifdef _LIBC
+/* This is defined in locale/C-time.c in the GNU libc. */
+extern const struct locale_data _nl_C_LC_TIME attribute_hidden;
+
+# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string)
+# define ab_weekday_name \
+ (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string)
+# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string)
+# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string)
+# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
+# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string)
+# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string)
+# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string)
+# define HERE_T_FMT_AMPM \
+ (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string)
+# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string)
+
+# define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n)
+#else
+static char const weekday_name[][10] =
+ {
+ "Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"
+ };
+static char const ab_weekday_name[][4] =
+ {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+ };
+static char const month_name[][10] =
+ {
+ "January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"
+ };
+static char const ab_month_name[][4] =
+ {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y"
+# define HERE_D_FMT "%m/%d/%y"
+# define HERE_AM_STR "AM"
+# define HERE_PM_STR "PM"
+# define HERE_T_FMT_AMPM "%I:%M:%S %p"
+# define HERE_T_FMT "%H:%M:%S"
+
+static const unsigned short int __mon_yday[2][13] =
+ {
+ /* Normal years. */
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+ /* Leap years. */
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+ };
+#endif
+
+#if defined _LIBC
+/* We use this code also for the extended locale handling where the
+ function gets as an additional argument the locale which has to be
+ used. To access the values we have to redefine the _NL_CURRENT
+ macro. */
+# define strptime __strptime_l
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].string)
+# undef _NL_CURRENT_WORD
+# define _NL_CURRENT_WORD(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].word)
+# define LOCALE_PARAM , locale
+# define LOCALE_ARG , locale
+# define LOCALE_PARAM_PROTO , __locale_t locale
+# define LOCALE_PARAM_DECL __locale_t locale;
+# define HELPER_LOCALE_ARG , current
+# define ISSPACE(Ch) __isspace_l (Ch, locale)
+#else
+# define LOCALE_PARAM
+# define LOCALE_ARG
+# define LOCALE_PARAM_DECL
+# define LOCALE_PARAM_PROTO
+# define HELPER_LOCALE_ARG
+# define ISSPACE(Ch) isspace (Ch)
+#endif
+
+
+
+
+#ifndef __isleap
+/* Nonzero if YEAR is a leap year (every 4 years,
+ except every 100th isn't, and every 400th is). */
+# define __isleap(year) \
+ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
+#endif
+
+/* Compute the day of the week. */
+static void
+day_of_the_week (struct tm *tm)
+{
+ /* We know that January 1st 1970 was a Thursday (= 4). Compute the
+ the difference between this data in the one on TM and so determine
+ the weekday. */
+ int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2);
+ int wday = (-473
+ + (365 * (tm->tm_year - 70))
+ + (corr_year / 4)
+ - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0)
+ + (((corr_year / 4) / 25) / 4)
+ + __mon_yday[0][tm->tm_mon]
+ + tm->tm_mday - 1);
+ tm->tm_wday = ((wday % 7) + 7) % 7;
+}
+
+/* Compute the day of the year. */
+static void
+day_of_the_year (struct tm *tm)
+{
+ tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon]
+ + (tm->tm_mday - 1));
+}
+
+
+#ifdef _LIBC
+char *
+internal_function
+#else
+static char *
+#endif
+__strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM)
+ const char *rp;
+ const char *fmt;
+ struct tm *tm;
+ enum ptime_locale_status *decided;
+ int era_cnt;
+ LOCALE_PARAM_DECL
+{
+#ifdef _LIBC
+ struct locale_data *const current = locale->__locales[LC_TIME];
+#endif
+
+ const char *rp_backup;
+ int cnt;
+ size_t val;
+ int have_I, is_pm;
+ int century, want_century;
+ int want_era;
+ int have_wday, want_xday;
+ int have_yday;
+ int have_mon, have_mday;
+ int have_uweek, have_wweek;
+ int week_no;
+ size_t num_eras;
+ struct era_entry *era;
+
+ have_I = is_pm = 0;
+ century = -1;
+ want_century = 0;
+ want_era = 0;
+ era = NULL;
+ week_no = 0;
+
+ have_wday = want_xday = have_yday = have_mon = have_mday = have_uweek = 0;
+ have_wweek = 0;
+
+ while (*fmt != '\0')
+ {
+ /* A white space in the format string matches 0 more or white
+ space in the input string. */
+ if (ISSPACE (*fmt))
+ {
+ while (ISSPACE (*rp))
+ ++rp;
+ ++fmt;
+ continue;
+ }
+
+ /* Any character but `%' must be matched by the same character
+ in the iput string. */
+ if (*fmt != '%')
+ {
+ match_char (*fmt++, *rp++);
+ continue;
+ }
+
+ ++fmt;
+#ifndef _NL_CURRENT
+ /* We need this for handling the `E' modifier. */
+ start_over:
+#endif
+
+ /* Make back up of current processing pointer. */
+ rp_backup = rp;
+
+ switch (*fmt++)
+ {
+ case '%':
+ /* Match the `%' character itself. */
+ match_char ('%', *rp++);
+ break;
+ case 'a':
+ case 'A':
+ /* Match day of week. */
+ for (cnt = 0; cnt < 7; ++cnt)
+ {
+#ifdef _NL_CURRENT
+ if (*decided !=raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),
+ weekday_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),
+ ab_weekday_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ }
+#endif
+ if (*decided != loc
+ && (match_string (weekday_name[cnt], rp)
+ || match_string (ab_weekday_name[cnt], rp)))
+ {
+ *decided = raw;
+ break;
+ }
+ }
+ if (cnt == 7)
+ /* Does not match a weekday name. */
+ return NULL;
+ tm->tm_wday = cnt;
+ have_wday = 1;
+ break;
+ case 'b':
+ case 'B':
+ case 'h':
+ /* Match month name. */
+ for (cnt = 0; cnt < 12; ++cnt)
+ {
+#ifdef _NL_CURRENT
+ if (*decided !=raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),
+ month_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),
+ ab_month_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ }
+#endif
+ if (match_string (month_name[cnt], rp)
+ || match_string (ab_month_name[cnt], rp))
+ {
+ *decided = raw;
+ break;
+ }
+ }
+ if (cnt == 12)
+ /* Does not match a month name. */
+ return NULL;
+ tm->tm_mon = cnt;
+ want_xday = 1;
+ break;
+ case 'c':
+ /* Match locale's date and time format. */
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not &&
+ strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!recursive (HERE_D_T_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'C':
+ /* Match century number. */
+ match_century:
+ get_number (0, 99, 2);
+ century = val;
+ want_xday = 1;
+ break;
+ case 'd':
+ case 'e':
+ /* Match day of month. */
+ get_number (1, 31, 2);
+ tm->tm_mday = val;
+ have_mday = 1;
+ want_xday = 1;
+ break;
+ case 'F':
+ if (!recursive ("%Y-%m-%d"))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'x':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ /* Fall through. */
+ case 'D':
+ /* Match standard day format. */
+ if (!recursive (HERE_D_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'k':
+ case 'H':
+ /* Match hour in 24-hour clock. */
+ get_number (0, 23, 2);
+ tm->tm_hour = val;
+ have_I = 0;
+ break;
+ case 'l':
+ /* Match hour in 12-hour clock. GNU extension. */
+ case 'I':
+ /* Match hour in 12-hour clock. */
+ get_number (1, 12, 2);
+ tm->tm_hour = val % 12;
+ have_I = 1;
+ break;
+ case 'j':
+ /* Match day number of year. */
+ get_number (1, 366, 3);
+ tm->tm_yday = val - 1;
+ have_yday = 1;
+ break;
+ case 'm':
+ /* Match number of month. */
+ get_number (1, 12, 2);
+ tm->tm_mon = val - 1;
+ have_mon = 1;
+ want_xday = 1;
+ break;
+ case 'M':
+ /* Match minute. */
+ get_number (0, 59, 2);
+ tm->tm_min = val;
+ break;
+ case 'n':
+ case 't':
+ /* Match any white space. */
+ while (ISSPACE (*rp))
+ ++rp;
+ break;
+ case 'p':
+ /* Match locale's equivalent of AM/PM. */
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))
+ *decided = loc;
+ is_pm = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!match_string (HERE_AM_STR, rp))
+ {
+ if (match_string (HERE_PM_STR, rp))
+ is_pm = 1;
+ else
+ return NULL;
+ }
+ break;
+ case 'r':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not &&
+ strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),
+ HERE_T_FMT_AMPM))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!recursive (HERE_T_FMT_AMPM))
+ return NULL;
+ break;
+ case 'R':
+ if (!recursive ("%H:%M"))
+ return NULL;
+ break;
+ case 's':
+ {
+ /* The number of seconds may be very high so we cannot use
+ the `get_number' macro. Instead read the number
+ character for character and construct the result while
+ doing this. */
+ time_t secs = 0;
+ if (*rp < '0' || *rp > '9')
+ /* We need at least one digit. */
+ return NULL;
+
+ do
+ {
+ secs *= 10;
+ secs += *rp++ - '0';
+ }
+ while (*rp >= '0' && *rp <= '9');
+
+ if (localtime_r (&secs, tm) == NULL)
+ /* Error in function. */
+ return NULL;
+ }
+ break;
+ case 'S':
+ get_number (0, 61, 2);
+ tm->tm_sec = val;
+ break;
+ case 'X':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, T_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ /* Fall through. */
+ case 'T':
+ if (!recursive (HERE_T_FMT))
+ return NULL;
+ break;
+ case 'u':
+ get_number (1, 7, 1);
+ tm->tm_wday = val % 7;
+ have_wday = 1;
+ break;
+ case 'g':
+ get_number (0, 99, 2);
+ /* XXX This cannot determine any field in TM. */
+ break;
+ case 'G':
+ if (*rp < '0' || *rp > '9')
+ return NULL;
+ /* XXX Ignore the number since we would need some more
+ information to compute a real date. */
+ do
+ ++rp;
+ while (*rp >= '0' && *rp <= '9');
+ break;
+ case 'U':
+ get_number (0, 53, 2);
+ week_no = val;
+ have_uweek = 1;
+ break;
+ case 'W':
+ get_number (0, 53, 2);
+ week_no = val;
+ have_wweek = 1;
+ break;
+ case 'V':
+ get_number (0, 53, 2);
+ /* XXX This cannot determine any field in TM without some
+ information. */
+ break;
+ case 'w':
+ /* Match number of weekday. */
+ get_number (0, 6, 1);
+ tm->tm_wday = val;
+ have_wday = 1;
+ break;
+ case 'y':
+ match_year_in_century:
+ /* Match year within century. */
+ get_number (0, 99, 2);
+ /* The "Year 2000: The Millennium Rollover" paper suggests that
+ values in the range 69-99 refer to the twentieth century. */
+ tm->tm_year = val >= 69 ? val : val + 100;
+ /* Indicate that we want to use the century, if specified. */
+ want_century = 1;
+ want_xday = 1;
+ break;
+ case 'Y':
+ /* Match year including century number. */
+ get_number (0, 9999, 4);
+ tm->tm_year = val - 1900;
+ want_century = 0;
+ want_xday = 1;
+ break;
+ case 'Z':
+ /* XXX How to handle this? */
+ break;
+ case 'z':
+ /* We recognize two formats: if two digits are given, these
+ specify hours. If fours digits are used, minutes are
+ also specified. */
+ {
+ bool neg;
+ int n;
+
+ val = 0;
+ while (*rp == ' ')
+ ++rp;
+ if (*rp != '+' && *rp != '-')
+ return NULL;
+ neg = *rp++ == '-';
+ n = 0;
+ while (n < 4 && *rp >= '0' && *rp <= '9')
+ {
+ val = val * 10 + *rp++ - '0';
+ ++n;
+ }
+ if (n == 2)
+ val *= 100;
+ else if (n != 4)
+ /* Only two or four digits recognized. */
+ return NULL;
+ else
+ {
+ /* We have to convert the minutes into decimal. */
+ if (val % 100 >= 60)
+ return NULL;
+ val = (val / 100) * 100 + ((val % 100) * 50) / 30;
+ }
+ if (val > 1200)
+ return NULL;
+#if defined _LIBC || HAVE_TM_GMTOFF
+ tm->tm_gmtoff = (val * 3600) / 100;
+ if (neg)
+ tm->tm_gmtoff = -tm->tm_gmtoff;
+#endif
+ }
+ break;
+ case 'E':
+#ifdef _NL_CURRENT
+ switch (*fmt++)
+ {
+ case 'c':
+ /* Match locale's alternate date and time format. */
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, D_T_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_D_T_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+ /* The C locale has no era information, so use the
+ normal representation. */
+ if (!recursive (HERE_D_T_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'C':
+ if (*decided != raw)
+ {
+ if (era_cnt >= 0)
+ {
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era != NULL && match_string (era->era_name, rp))
+ {
+ *decided = loc;
+ break;
+ }
+ else
+ return NULL;
+ }
+
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras;
+ ++era_cnt, rp = rp_backup)
+ {
+ era = _nl_select_era_entry (era_cnt
+ HELPER_LOCALE_ARG);
+ if (era != NULL && match_string (era->era_name, rp))
+ {
+ *decided = loc;
+ break;
+ }
+ }
+ if (era_cnt != (int) num_eras)
+ break;
+
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+
+ *decided = raw;
+ }
+ /* The C locale has no era information, so use the
+ normal representation. */
+ goto match_century;
+ case 'y':
+ if (*decided != raw)
+ {
+ get_number(0, 9999, 4);
+ tm->tm_year = val;
+ want_era = 1;
+ want_xday = 1;
+ want_century = 1;
+
+ if (era_cnt >= 0)
+ {
+ assert (*decided == loc);
+
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ bool match = false;
+ if (era != NULL)
+ {
+ int delta = ((tm->tm_year - era->offset)
+ * era->absolute_direction);
+ match = (delta >= 0
+ && delta < (((int64_t) era->stop_date[0]
+ - (int64_t) era->start_date[0])
+ * era->absolute_direction));
+ }
+ if (! match)
+ return NULL;
+
+ break;
+ }
+
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras; ++era_cnt)
+ {
+ era = _nl_select_era_entry (era_cnt
+ HELPER_LOCALE_ARG);
+ if (era != NULL)
+ {
+ int delta = ((tm->tm_year - era->offset)
+ * era->absolute_direction);
+ if (delta >= 0
+ && delta < (((int64_t) era->stop_date[0]
+ - (int64_t) era->start_date[0])
+ * era->absolute_direction))
+ {
+ *decided = loc;
+ break;
+ }
+ }
+ }
+ if (era_cnt != (int) num_eras)
+ break;
+
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+
+ *decided = raw;
+ }
+
+ goto match_year_in_century;
+ case 'Y':
+ if (*decided != raw)
+ {
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras;
+ ++era_cnt, rp = rp_backup)
+ {
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era != NULL && recursive (era->era_format))
+ break;
+ }
+ if (era_cnt == (int) num_eras)
+ {
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ *decided = loc;
+ era_cnt = -1;
+ break;
+ }
+
+ *decided = raw;
+ }
+ get_number (0, 9999, 4);
+ tm->tm_year = val - 1900;
+ want_century = 0;
+ want_xday = 1;
+ break;
+ case 'x':
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, D_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_D_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ if (!recursive (HERE_D_FMT))
+ return NULL;
+ break;
+ case 'X':
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, T_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ if (!recursive (HERE_T_FMT))
+ return NULL;
+ break;
+ default:
+ return NULL;
+ }
+ break;
+#else
+ /* We have no information about the era format. Just use
+ the normal format. */
+ if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y'
+ && *fmt != 'x' && *fmt != 'X')
+ /* This is an illegal format. */
+ return NULL;
+
+ goto start_over;
+#endif
+ case 'O':
+ switch (*fmt++)
+ {
+ case 'd':
+ case 'e':
+ /* Match day of month using alternate numeric symbols. */
+ get_alt_number (1, 31, 2);
+ tm->tm_mday = val;
+ have_mday = 1;
+ want_xday = 1;
+ break;
+ case 'H':
+ /* Match hour in 24-hour clock using alternate numeric
+ symbols. */
+ get_alt_number (0, 23, 2);
+ tm->tm_hour = val;
+ have_I = 0;
+ break;
+ case 'I':
+ /* Match hour in 12-hour clock using alternate numeric
+ symbols. */
+ get_alt_number (1, 12, 2);
+ tm->tm_hour = val % 12;
+ have_I = 1;
+ break;
+ case 'm':
+ /* Match month using alternate numeric symbols. */
+ get_alt_number (1, 12, 2);
+ tm->tm_mon = val - 1;
+ have_mon = 1;
+ want_xday = 1;
+ break;
+ case 'M':
+ /* Match minutes using alternate numeric symbols. */
+ get_alt_number (0, 59, 2);
+ tm->tm_min = val;
+ break;
+ case 'S':
+ /* Match seconds using alternate numeric symbols. */
+ get_alt_number (0, 61, 2);
+ tm->tm_sec = val;
+ break;
+ case 'U':
+ get_alt_number (0, 53, 2);
+ week_no = val;
+ have_uweek = 1;
+ break;
+ case 'W':
+ get_alt_number (0, 53, 2);
+ week_no = val;
+ have_wweek = 1;
+ break;
+ case 'V':
+ get_alt_number (0, 53, 2);
+ /* XXX This cannot determine any field in TM without
+ further information. */
+ break;
+ case 'w':
+ /* Match number of weekday using alternate numeric symbols. */
+ get_alt_number (0, 6, 1);
+ tm->tm_wday = val;
+ have_wday = 1;
+ break;
+ case 'y':
+ /* Match year within century using alternate numeric symbols. */
+ get_alt_number (0, 99, 2);
+ tm->tm_year = val >= 69 ? val : val + 100;
+ want_xday = 1;
+ break;
+ default:
+ return NULL;
+ }
+ break;
+ default:
+ return NULL;
+ }
+ }
+
+ if (have_I && is_pm)
+ tm->tm_hour += 12;
+
+ if (century != -1)
+ {
+ if (want_century)
+ tm->tm_year = tm->tm_year % 100 + (century - 19) * 100;
+ else
+ /* Only the century, but not the year. Strange, but so be it. */
+ tm->tm_year = (century - 19) * 100;
+ }
+
+ if (era_cnt != -1)
+ {
+#ifdef _NL_CURRENT
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era == NULL)
+ return NULL;
+ if (want_era)
+ tm->tm_year = (era->start_date[0]
+ + ((tm->tm_year - era->offset)
+ * era->absolute_direction));
+ else
+ /* Era start year assumed. */
+ tm->tm_year = era->start_date[0];
+#endif
+ }
+ else
+ if (want_era)
+ {
+ /* No era found but we have seen an E modifier. Rectify some
+ values. */
+ if (want_century && century == -1 && tm->tm_year < 69)
+ tm->tm_year += 100;
+ }
+
+ if (want_xday && !have_wday)
+ {
+ if ( !(have_mon && have_mday) && have_yday)
+ {
+ /* We don't have tm_mon and/or tm_mday, compute them. */
+ int t_mon = 0;
+ while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday)
+ t_mon++;
+ if (!have_mon)
+ tm->tm_mon = t_mon - 1;
+ if (!have_mday)
+ tm->tm_mday =
+ (tm->tm_yday
+ - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1);
+ }
+ day_of_the_week (tm);
+ }
+
+ if (want_xday && !have_yday)
+ day_of_the_year (tm);
+
+ if ((have_uweek || have_wweek) && have_wday)
+ {
+ int save_wday = tm->tm_wday;
+ int save_mday = tm->tm_mday;
+ int save_mon = tm->tm_mon;
+ int w_offset = have_uweek ? 0 : 1;
+
+ tm->tm_mday = 1;
+ tm->tm_mon = 0;
+ day_of_the_week (tm);
+ if (have_mday)
+ tm->tm_mday = save_mday;
+ if (have_mon)
+ tm->tm_mon = save_mon;
+
+ if (!have_yday)
+ tm->tm_yday = ((7 - (tm->tm_wday - w_offset)) % 7
+ + (week_no - 1) *7
+ + save_wday - w_offset);
+
+ if (!have_mday || !have_mon)
+ {
+ int t_mon = 0;
+ while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon]
+ <= tm->tm_yday)
+ t_mon++;
+ if (!have_mon)
+ tm->tm_mon = t_mon - 1;
+ if (!have_mday)
+ tm->tm_mday =
+ (tm->tm_yday
+ - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1);
+ }
+
+ tm->tm_wday = save_wday;
+ }
+
+ return (char *) rp;
+}
+
+
+char *
+strptime (buf, format, tm LOCALE_PARAM)
+ const char *restrict buf;
+ const char *restrict format;
+ struct tm *restrict tm;
+ LOCALE_PARAM_DECL
+{
+ enum ptime_locale_status decided;
+
+#ifdef _NL_CURRENT
+ decided = not;
+#else
+ decided = raw;
+#endif
+ return __strptime_internal (buf, format, tm, &decided, -1 LOCALE_ARG);
+}
+
+#ifdef _LIBC
+weak_alias (__strptime_l, strptime_l)
+#endif
diff --git a/gnulib/lib/strsep.c b/gnulib/lib/strsep.c
new file mode 100644
index 00000000..6037f4dd
--- /dev/null
+++ b/gnulib/lib/strsep.c
@@ -0,0 +1,58 @@
+/* Copyright (C) 2004, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+ Written by Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <string.h>
+
+char *
+strsep (char **stringp, const char *delim)
+{
+ char *start = *stringp;
+ char *ptr;
+
+ if (start == NULL)
+ return NULL;
+
+ /* Optimize the case of no delimiters. */
+ if (delim[0] == '\0')
+ {
+ *stringp = NULL;
+ return start;
+ }
+
+ /* Optimize the case of one delimiter. */
+ if (delim[1] == '\0')
+ ptr = strchr (start, delim[0]);
+ else
+ /* The general case. */
+ ptr = strpbrk (start, delim);
+ if (ptr == NULL)
+ {
+ *stringp = NULL;
+ return start;
+ }
+
+ *ptr = '\0';
+ *stringp = ptr + 1;
+
+ return start;
+}
diff --git a/gnulib/lib/strsignal.c b/gnulib/lib/strsignal.c
new file mode 100644
index 00000000..8cd09d2b
--- /dev/null
+++ b/gnulib/lib/strsignal.c
@@ -0,0 +1,196 @@
+/* Copyright (C) 1991, 1994-2002, 2005, 2008-2010 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else /* !_LIBC */
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+# define N_(msgid) gettext_noop (msgid)
+#endif /* _LIBC */
+
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else /* !_LIBC */
+# include "glthread/lock.h"
+# include "glthread/tls.h"
+# define __libc_once_define(CLASS, NAME) gl_once_define (CLASS, NAME)
+# define __libc_once(NAME, INIT) gl_once ((NAME), (INIT))
+# define __libc_key_t gl_tls_key_t
+# define __libc_getspecific(NAME) gl_tls_get ((NAME))
+# define __libc_setspecific(NAME, POINTER) gl_tls_set ((NAME), (POINTER))
+# define __snprintf snprintf
+#endif /* _LIBC */
+
+#ifdef _LIBC
+
+/* Defined in siglist.c. */
+extern const char *const _sys_siglist[];
+extern const char *const _sys_siglist_internal[] attribute_hidden;
+
+#else /* !_LIBC */
+
+/* NetBSD declares sys_siglist in unistd.h. */
+# include <unistd.h>
+
+# define INTUSE(x) (x)
+
+# if HAVE_DECL_SYS_SIGLIST
+# undef _sys_siglist
+# define _sys_siglist sys_siglist
+# else /* !HAVE_DECL_SYS_SIGLIST */
+# ifndef NSIG
+# define NSIG 32
+# endif /* NSIG */
+# if !HAVE_DECL__SYS_SIGLIST
+static const char *_sys_siglist[NSIG];
+# endif
+# endif /* !HAVE_DECL_SYS_SIGLIST */
+
+#endif /* _LIBC */
+
+static __libc_key_t key;
+
+/* If nonzero the key allocation failed and we should better use a
+ static buffer than fail. */
+#define BUFFERSIZ 100
+static char local_buf[BUFFERSIZ];
+static char *static_buf;
+
+/* Destructor for the thread-specific data. */
+static void init (void);
+static void free_key_mem (void *mem);
+static char *getbuffer (void);
+
+
+/* Return a string describing the meaning of the signal number SIGNUM. */
+char *
+strsignal (int signum)
+{
+ const char *desc;
+ __libc_once_define (static, once);
+
+ /* If we have not yet initialized the buffer do it now. */
+ __libc_once (once, init);
+
+ if (
+#ifdef SIGRTMIN
+ (signum >= SIGRTMIN && signum <= SIGRTMAX) ||
+#endif
+ signum < 0 || signum >= NSIG
+ || (desc = INTUSE(_sys_siglist)[signum]) == NULL)
+ {
+ char *buffer = getbuffer ();
+ int len;
+#ifdef SIGRTMIN
+ if (signum >= SIGRTMIN && signum <= SIGRTMAX)
+ len = __snprintf (buffer, BUFFERSIZ - 1, _("Real-time signal %d"),
+ signum - SIGRTMIN);
+ else
+#endif
+ len = __snprintf (buffer, BUFFERSIZ - 1, _("Unknown signal %d"),
+ signum);
+ if (len >= BUFFERSIZ)
+ buffer = NULL;
+ else
+ buffer[len] = '\0';
+
+ return buffer;
+ }
+
+ return (char *) _(desc);
+}
+
+
+/* Initialize buffer. */
+static void
+init (void)
+{
+#ifdef _LIBC
+ if (__libc_key_create (&key, free_key_mem))
+ /* Creating the key failed. This means something really went
+ wrong. In any case use a static buffer which is better than
+ nothing. */
+ static_buf = local_buf;
+#else /* !_LIBC */
+ gl_tls_key_init (key, free_key_mem);
+
+# if !HAVE_DECL_SYS_SIGLIST
+ memset (_sys_siglist, 0, NSIG * sizeof *_sys_siglist);
+
+ /* No need to use a do {} while (0) here since init_sig(...) must expand
+ to a complete statement. (We cannot use the ISO C99 designated array
+ initializer syntax since it is not supported by ANSI C compilers and
+ since some signal numbers might exceed NSIG.) */
+# define init_sig(sig, abbrev, desc) \
+ if (sig >= 0 && sig < NSIG) \
+ _sys_siglist[sig] = desc;
+
+# include "siglist.h"
+
+# undef init_sig
+
+# endif /* !HAVE_DECL_SYS_SIGLIST */
+#endif /* !_LIBC */
+}
+
+
+/* Free the thread specific data, this is done if a thread terminates. */
+static void
+free_key_mem (void *mem)
+{
+ free (mem);
+ __libc_setspecific (key, NULL);
+}
+
+
+/* Return the buffer to be used. */
+static char *
+getbuffer (void)
+{
+ char *result;
+
+ if (static_buf != NULL)
+ result = static_buf;
+ else
+ {
+ /* We don't use the static buffer and so we have a key. Use it
+ to get the thread-specific buffer. */
+ result = __libc_getspecific (key);
+ if (result == NULL)
+ {
+ /* No buffer allocated so far. */
+ result = malloc (BUFFERSIZ);
+ if (result == NULL)
+ /* No more memory available. We use the static buffer. */
+ result = local_buf;
+ else
+ __libc_setspecific (key, result);
+ }
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/strstr.c b/gnulib/lib/strstr.c
new file mode 100644
index 00000000..265fc853
--- /dev/null
+++ b/gnulib/lib/strstr.c
@@ -0,0 +1,83 @@
+/* Copyright (C) 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000, 2004, 2007,
+ 2008, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This particular implementation was written by Eric Blake, 2008. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Specification of strstr. */
+#include <string.h>
+
+#include <stdbool.h>
+
+#ifndef _LIBC
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#include "str-two-way.h"
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK
+ if NEEDLE is empty, otherwise NULL if NEEDLE is not found in
+ HAYSTACK. */
+char *
+strstr (const char *haystack_start, const char *needle_start)
+{
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
+
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
+ ok &= *haystack++ == *needle++;
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
+
+ /* Reduce the size of haystack using strchr, since it has a smaller
+ linear coefficient than the Two-Way algorithm. */
+ needle_len = needle - needle_start;
+ haystack = strchr (haystack_start + 1, *needle_start);
+ if (!haystack || __builtin_expect (needle_len == 1, 0))
+ return (char *) haystack;
+ needle -= needle_len;
+ haystack_len = (haystack > haystack_start + needle_len ? 1
+ : needle_len + haystack_start - haystack);
+
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle, needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle, needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/gnulib/lib/strtod.c b/gnulib/lib/strtod.c
new file mode 100644
index 00000000..371476ee
--- /dev/null
+++ b/gnulib/lib/strtod.c
@@ -0,0 +1,276 @@
+/* Copyright (C) 1991-1992, 1997, 1999, 2003, 2006, 2008-2010 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/>. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the nptr == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <stdlib.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <float.h>
+#include <math.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "c-ctype.h"
+
+/* Convert NPTR to a double. If ENDPTR is not NULL, a pointer to the
+ character after the last one used in the number is put in *ENDPTR. */
+double
+strtod (const char *nptr, char **endptr)
+{
+ const unsigned char *s;
+ bool negative = false;
+
+ /* The number so far. */
+ double num;
+
+ bool got_dot; /* Found a decimal point. */
+ bool got_digit; /* Seen any digits. */
+ bool hex = false; /* Look for hex float exponent. */
+
+ /* The exponent of the number. */
+ long int exponent;
+
+ if (nptr == NULL)
+ {
+ errno = EINVAL;
+ goto noconv;
+ }
+
+ /* Use unsigned char for the ctype routines. */
+ s = (unsigned char *) nptr;
+
+ /* Eat whitespace. */
+ while (isspace (*s))
+ ++s;
+
+ /* Get the sign. */
+ negative = *s == '-';
+ if (*s == '-' || *s == '+')
+ ++s;
+
+ num = 0.0;
+ got_dot = false;
+ got_digit = false;
+ exponent = 0;
+
+ /* Check for hex float. */
+ if (*s == '0' && c_tolower (s[1]) == 'x'
+ && (c_isxdigit (s[2]) || ('.' == s[2] && c_isxdigit (s[3]))))
+ {
+ hex = true;
+ s += 2;
+ for (;; ++s)
+ {
+ if (c_isxdigit (*s))
+ {
+ got_digit = true;
+
+ /* Make sure that multiplication by 16 will not overflow. */
+ if (num > DBL_MAX / 16)
+ /* The value of the digit doesn't matter, since we have already
+ gotten as many digits as can be represented in a `double'.
+ This doesn't necessarily mean the result will overflow.
+ The exponent may reduce it to within range.
+
+ We just need to record that there was another
+ digit so that we can multiply by 16 later. */
+ ++exponent;
+ else
+ num = ((num * 16.0)
+ + (c_tolower (*s) - (c_isdigit (*s) ? '0' : 'a' - 10)));
+
+ /* Keep track of the number of digits after the decimal point.
+ If we just divided by 16 here, we would lose precision. */
+ if (got_dot)
+ --exponent;
+ }
+ else if (!got_dot && *s == '.')
+ /* Record that we have found the decimal point. */
+ got_dot = true;
+ else
+ /* Any other character terminates the number. */
+ break;
+ }
+ }
+
+ /* Not a hex float. */
+ else
+ {
+ for (;; ++s)
+ {
+ if (c_isdigit (*s))
+ {
+ got_digit = true;
+
+ /* Make sure that multiplication by 10 will not overflow. */
+ if (num > DBL_MAX * 0.1)
+ /* The value of the digit doesn't matter, since we have already
+ gotten as many digits as can be represented in a `double'.
+ This doesn't necessarily mean the result will overflow.
+ The exponent may reduce it to within range.
+
+ We just need to record that there was another
+ digit so that we can multiply by 10 later. */
+ ++exponent;
+ else
+ num = (num * 10.0) + (*s - '0');
+
+ /* Keep track of the number of digits after the decimal point.
+ If we just divided by 10 here, we would lose precision. */
+ if (got_dot)
+ --exponent;
+ }
+ else if (!got_dot && *s == '.')
+ /* Record that we have found the decimal point. */
+ got_dot = true;
+ else
+ /* Any other character terminates the number. */
+ break;
+ }
+ }
+
+ if (!got_digit)
+ {
+ /* Check for infinities and NaNs. */
+ if (c_tolower (*s) == 'i'
+ && c_tolower (s[1]) == 'n'
+ && c_tolower (s[2]) == 'f')
+ {
+ s += 3;
+ num = HUGE_VAL;
+ if (c_tolower (*s) == 'i'
+ && c_tolower (s[1]) == 'n'
+ && c_tolower (s[2]) == 'i'
+ && c_tolower (s[3]) == 't'
+ && c_tolower (s[4]) == 'y')
+ s += 5;
+ goto valid;
+ }
+#ifdef NAN
+ else if (c_tolower (*s) == 'n'
+ && c_tolower (s[1]) == 'a'
+ && c_tolower (s[2]) == 'n')
+ {
+ s += 3;
+ num = NAN;
+ /* Since nan(<n-char-sequence>) is implementation-defined,
+ we define it by ignoring <n-char-sequence>. A nicer
+ implementation would populate the bits of the NaN
+ according to interpreting n-char-sequence as a
+ hexadecimal number, but the result is still a NaN. */
+ if (*s == '(')
+ {
+ const unsigned char *p = s + 1;
+ while (c_isalnum (*p))
+ p++;
+ if (*p == ')')
+ s = p + 1;
+ }
+ goto valid;
+ }
+#endif
+ goto noconv;
+ }
+
+ if (c_tolower (*s) == (hex ? 'p' : 'e') && !isspace (s[1]))
+ {
+ /* Get the exponent specified after the `e' or `E'. */
+ int save = errno;
+ char *end;
+ long int value;
+
+ errno = 0;
+ ++s;
+ value = strtol ((char *) s, &end, 10);
+ if (errno == ERANGE && num)
+ {
+ /* The exponent overflowed a `long int'. It is probably a safe
+ assumption that an exponent that cannot be represented by
+ a `long int' exceeds the limits of a `double'. */
+ if (endptr != NULL)
+ *endptr = end;
+ if (value < 0)
+ goto underflow;
+ else
+ goto overflow;
+ }
+ else if (end == (char *) s)
+ /* There was no exponent. Reset END to point to
+ the 'e' or 'E', so *ENDPTR will be set there. */
+ end = (char *) s - 1;
+ errno = save;
+ s = (unsigned char *) end;
+ exponent += value;
+ }
+
+ if (num == 0.0)
+ goto valid;
+
+ if (hex)
+ {
+ /* ldexp takes care of range errors. */
+ num = ldexp (num, exponent);
+ goto valid;
+ }
+
+ /* Multiply NUM by 10 to the EXPONENT power,
+ checking for overflow and underflow. */
+
+ if (exponent < 0)
+ {
+ if (num < DBL_MIN * pow (10.0, (double) -exponent))
+ goto underflow;
+ }
+ else if (exponent > 0)
+ {
+ if (num > DBL_MAX * pow (10.0, (double) -exponent))
+ goto overflow;
+ }
+
+ num *= pow (10.0, (double) exponent);
+
+ valid:
+ if (endptr != NULL)
+ *endptr = (char *) s;
+ return negative ? -num : num;
+
+ overflow:
+ /* Return an overflow error. */
+ if (endptr != NULL)
+ *endptr = (char *) s;
+ errno = ERANGE;
+ return negative ? -HUGE_VAL : HUGE_VAL;
+
+ underflow:
+ /* Return an underflow error. */
+ if (endptr != NULL)
+ *endptr = (char *) s;
+ errno = ERANGE;
+ return negative ? -0.0 : 0.0;
+
+ noconv:
+ /* There was no number. */
+ if (endptr != NULL)
+ *endptr = (char *) nptr;
+ errno = EINVAL;
+ return 0.0;
+}
diff --git a/gnulib/lib/strtoimax.c b/gnulib/lib/strtoimax.c
new file mode 100644
index 00000000..ce873f79
--- /dev/null
+++ b/gnulib/lib/strtoimax.c
@@ -0,0 +1,75 @@
+/* Convert string representation of a number into an intmax_t value.
+
+ Copyright (C) 1999, 2001, 2002, 2003, 2004, 2006, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+/* Verify interface. */
+#include <inttypes.h>
+
+#include <stdlib.h>
+
+#include "verify.h"
+
+#ifdef UNSIGNED
+# ifndef HAVE_DECL_STRTOULL
+"this configure-time declaration test was not run"
+# endif
+# if !HAVE_DECL_STRTOULL && HAVE_UNSIGNED_LONG_LONG_INT
+unsigned long long int strtoull (char const *, char **, int);
+# endif
+
+#else
+
+# ifndef HAVE_DECL_STRTOLL
+"this configure-time declaration test was not run"
+# endif
+# if !HAVE_DECL_STRTOLL && HAVE_LONG_LONG_INT
+long long int strtoll (char const *, char **, int);
+# endif
+#endif
+
+#ifdef UNSIGNED
+# define Have_long_long HAVE_UNSIGNED_LONG_LONG_INT
+# define Int uintmax_t
+# define Unsigned unsigned
+# define strtoimax strtoumax
+# define strtol strtoul
+# define strtoll strtoull
+#else
+# define Have_long_long HAVE_LONG_LONG_INT
+# define Int intmax_t
+# define Unsigned
+#endif
+
+Int
+strtoimax (char const *ptr, char **endptr, int base)
+{
+#if Have_long_long
+ verify (sizeof (Int) == sizeof (Unsigned long int)
+ || sizeof (Int) == sizeof (Unsigned long long int));
+
+ if (sizeof (Int) != sizeof (Unsigned long int))
+ return strtoll (ptr, endptr, base);
+#else
+ verify (sizeof (Int) == sizeof (Unsigned long int));
+#endif
+
+ return strtol (ptr, endptr, base);
+}
diff --git a/gnulib/lib/strtok_r.c b/gnulib/lib/strtok_r.c
new file mode 100644
index 00000000..2d636a5f
--- /dev/null
+++ b/gnulib/lib/strtok_r.c
@@ -0,0 +1,76 @@
+/* Reentrant string tokenizer. Generic version.
+ Copyright (C) 1991, 1996-1999, 2001, 2004, 2007, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#ifdef _LIBC
+# undef strtok_r
+# undef __strtok_r
+#else
+# define __strtok_r strtok_r
+# define __rawmemchr strchr
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+ If S is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = strtok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+*/
+char *
+__strtok_r (char *s, const char *delim, char **save_ptr)
+{
+ char *token;
+
+ if (s == NULL)
+ s = *save_ptr;
+
+ /* Scan leading delimiters. */
+ s += strspn (s, delim);
+ if (*s == '\0')
+ {
+ *save_ptr = s;
+ return NULL;
+ }
+
+ /* Find the end of the token. */
+ token = s;
+ s = strpbrk (token, delim);
+ if (s == NULL)
+ /* This token finishes the string. */
+ *save_ptr = __rawmemchr (token, '\0');
+ else
+ {
+ /* Terminate the token and make *SAVE_PTR point past it. */
+ *s = '\0';
+ *save_ptr = s + 1;
+ }
+ return token;
+}
+#ifdef weak_alias
+libc_hidden_def (__strtok_r)
+weak_alias (__strtok_r, strtok_r)
+#endif
diff --git a/gnulib/lib/strtol.c b/gnulib/lib/strtol.c
new file mode 100644
index 00000000..d1b5bc0c
--- /dev/null
+++ b/gnulib/lib/strtol.c
@@ -0,0 +1,434 @@
+/* Convert string representation of a number into an integer value.
+
+ Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2003, 2005,
+ 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@gnu.org.
+
+ 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 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/>. */
+
+#ifdef _LIBC
+# define USE_NUMBER_GROUPING
+#else
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef USE_NUMBER_GROUPING
+# include "../locale/localeinfo.h"
+#endif
+
+/* Nonzero if we are defining `strtoul' or `strtoull', operating on
+ unsigned integers. */
+#ifndef UNSIGNED
+# define UNSIGNED 0
+# define INT LONG int
+#else
+# define INT unsigned LONG int
+#endif
+
+/* Determine the name. */
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# if UNSIGNED
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol __wcstoull_l
+# else
+# define strtol __wcstoul_l
+# endif
+# else
+# ifdef QUAD
+# define strtol __strtoull_l
+# else
+# define strtol __strtoul_l
+# endif
+# endif
+# else
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol __wcstoll_l
+# else
+# define strtol __wcstol_l
+# endif
+# else
+# ifdef QUAD
+# define strtol __strtoll_l
+# else
+# define strtol __strtol_l
+# endif
+# endif
+# endif
+#else
+# if UNSIGNED
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol wcstoull
+# else
+# define strtol wcstoul
+# endif
+# else
+# ifdef QUAD
+# define strtol strtoull
+# else
+# define strtol strtoul
+# endif
+# endif
+# else
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol wcstoll
+# else
+# define strtol wcstol
+# endif
+# else
+# ifdef QUAD
+# define strtol strtoll
+# endif
+# endif
+# endif
+#endif
+
+/* If QUAD is defined, we are defining `strtoll' or `strtoull',
+ operating on `long long int's. */
+#ifdef QUAD
+# define LONG long long
+# define STRTOL_LONG_MIN LONG_LONG_MIN
+# define STRTOL_LONG_MAX LONG_LONG_MAX
+# define STRTOL_ULONG_MAX ULONG_LONG_MAX
+
+/* The extra casts in the following macros work around compiler bugs,
+ e.g., in Cray C 5.0.3.0. */
+
+/* True if negative values of the signed integer type T use two's
+ complement, ones' complement, or signed magnitude representation,
+ respectively. Much GNU code assumes two's complement, but some
+ people like to be portable to all possible C hosts. */
+# define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+# define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
+# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+
+/* True if the arithmetic type T is signed. */
+# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* The maximum and minimum values for the integer type T. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+# define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+# define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+
+# ifndef ULONG_LONG_MAX
+# define ULONG_LONG_MAX TYPE_MAXIMUM (unsigned long long)
+# endif
+# ifndef LONG_LONG_MAX
+# define LONG_LONG_MAX TYPE_MAXIMUM (long long int)
+# endif
+# ifndef LONG_LONG_MIN
+# define LONG_LONG_MIN TYPE_MINIMUM (long long int)
+# endif
+
+# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
+ /* Work around gcc bug with using this constant. */
+ static const unsigned long long int maxquad = ULONG_LONG_MAX;
+# undef STRTOL_ULONG_MAX
+# define STRTOL_ULONG_MAX maxquad
+# endif
+#else
+# define LONG long
+# define STRTOL_LONG_MIN LONG_MIN
+# define STRTOL_LONG_MAX LONG_MAX
+# define STRTOL_ULONG_MAX ULONG_MAX
+#endif
+
+
+/* We use this code also for the extended locale handling where the
+ function gets as an additional argument the locale which has to be
+ used. To access the values we have to redefine the _NL_CURRENT
+ macro. */
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].string)
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_PROTO , __locale_t loc
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_PROTO
+#endif
+
+#include <wchar.h>
+
+#ifdef USE_WIDE_CHAR
+# include <wctype.h>
+# define L_(Ch) L##Ch
+# define UCHAR_TYPE wint_t
+# define STRING_TYPE wchar_t
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define ISSPACE(Ch) __iswspace_l ((Ch), loc)
+# define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
+# define TOUPPER(Ch) __towupper_l ((Ch), loc)
+# else
+# define ISSPACE(Ch) iswspace (Ch)
+# define ISALPHA(Ch) iswalpha (Ch)
+# define TOUPPER(Ch) towupper (Ch)
+# endif
+#else
+# define L_(Ch) Ch
+# define UCHAR_TYPE unsigned char
+# define STRING_TYPE char
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define ISSPACE(Ch) __isspace_l ((Ch), loc)
+# define ISALPHA(Ch) __isalpha_l ((Ch), loc)
+# define TOUPPER(Ch) __toupper_l ((Ch), loc)
+# else
+# define ISSPACE(Ch) isspace (Ch)
+# define ISALPHA(Ch) isalpha (Ch)
+# define TOUPPER(Ch) toupper (Ch)
+# endif
+#endif
+
+#define INTERNAL(X) INTERNAL1(X)
+#define INTERNAL1(X) __##X##_internal
+#define WEAKNAME(X) WEAKNAME1(X)
+
+#ifdef USE_NUMBER_GROUPING
+/* This file defines a function to check for correct grouping. */
+# include "grouping.h"
+#endif
+
+
+
+/* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
+ If BASE is 0 the base is determined by the presence of a leading
+ zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
+ If BASE is < 2 or > 36, it is reset to 10.
+ If ENDPTR is not NULL, a pointer to the character after the last
+ one converted is stored in *ENDPTR. */
+
+INT
+INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
+ int base, int group LOCALE_PARAM_PROTO)
+{
+ int negative;
+ register unsigned LONG int cutoff;
+ register unsigned int cutlim;
+ register unsigned LONG int i;
+ register const STRING_TYPE *s;
+ register UCHAR_TYPE c;
+ const STRING_TYPE *save, *end;
+ int overflow;
+
+#ifdef USE_NUMBER_GROUPING
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+ struct locale_data *current = loc->__locales[LC_NUMERIC];
+# endif
+ /* The thousands character of the current locale. */
+ wchar_t thousands = L'\0';
+ /* The numeric grouping specification of the current locale,
+ in the format described in <locale.h>. */
+ const char *grouping;
+
+ if (group)
+ {
+ grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
+ if (*grouping <= 0 || *grouping == CHAR_MAX)
+ grouping = NULL;
+ else
+ {
+ /* Figure out the thousands separator character. */
+# if defined _LIBC || defined _HAVE_BTOWC
+ thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
+ if (thousands == WEOF)
+ thousands = L'\0';
+# endif
+ if (thousands == L'\0')
+ grouping = NULL;
+ }
+ }
+ else
+ grouping = NULL;
+#endif
+
+ if (base < 0 || base == 1 || base > 36)
+ {
+ __set_errno (EINVAL);
+ return 0;
+ }
+
+ save = s = nptr;
+
+ /* Skip white space. */
+ while (ISSPACE (*s))
+ ++s;
+ if (*s == L_('\0'))
+ goto noconv;
+
+ /* Check for a sign. */
+ if (*s == L_('-'))
+ {
+ negative = 1;
+ ++s;
+ }
+ else if (*s == L_('+'))
+ {
+ negative = 0;
+ ++s;
+ }
+ else
+ negative = 0;
+
+ /* Recognize number prefix and if BASE is zero, figure it out ourselves. */
+ if (*s == L_('0'))
+ {
+ if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
+ {
+ s += 2;
+ base = 16;
+ }
+ else if (base == 0)
+ base = 8;
+ }
+ else if (base == 0)
+ base = 10;
+
+ /* Save the pointer so we can check later if anything happened. */
+ save = s;
+
+#ifdef USE_NUMBER_GROUPING
+ if (group)
+ {
+ /* Find the end of the digit string and check its grouping. */
+ end = s;
+ for (c = *end; c != L_('\0'); c = *++end)
+ if ((wchar_t) c != thousands
+ && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
+ && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
+ break;
+ if (*s == thousands)
+ end = s;
+ else
+ end = correctly_grouped_prefix (s, end, thousands, grouping);
+ }
+ else
+#endif
+ end = NULL;
+
+ cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base;
+ cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base;
+
+ overflow = 0;
+ i = 0;
+ for (c = *s; c != L_('\0'); c = *++s)
+ {
+ if (s == end)
+ break;
+ if (c >= L_('0') && c <= L_('9'))
+ c -= L_('0');
+ else if (ISALPHA (c))
+ c = TOUPPER (c) - L_('A') + 10;
+ else
+ break;
+ if ((int) c >= base)
+ break;
+ /* Check for overflow. */
+ if (i > cutoff || (i == cutoff && c > cutlim))
+ overflow = 1;
+ else
+ {
+ i *= (unsigned LONG int) base;
+ i += c;
+ }
+ }
+
+ /* Check if anything actually happened. */
+ if (s == save)
+ goto noconv;
+
+ /* Store in ENDPTR the address of one character
+ past the last character we converted. */
+ if (endptr != NULL)
+ *endptr = (STRING_TYPE *) s;
+
+#if !UNSIGNED
+ /* Check for a value that is within the range of
+ `unsigned LONG int', but outside the range of `LONG int'. */
+ if (overflow == 0
+ && i > (negative
+ ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
+ : (unsigned LONG int) STRTOL_LONG_MAX))
+ overflow = 1;
+#endif
+
+ if (overflow)
+ {
+ __set_errno (ERANGE);
+#if UNSIGNED
+ return STRTOL_ULONG_MAX;
+#else
+ return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
+#endif
+ }
+
+ /* Return the result of the appropriate sign. */
+ return negative ? -i : i;
+
+noconv:
+ /* We must handle a special case here: the base is 0 or 16 and the
+ first two characters are '0' and 'x', but the rest are no
+ hexadecimal digits. This is no error case. We return 0 and
+ ENDPTR points to the `x`. */
+ if (endptr != NULL)
+ {
+ if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
+ && save[-2] == L_('0'))
+ *endptr = (STRING_TYPE *) &save[-1];
+ else
+ /* There was no number to convert. */
+ *endptr = (STRING_TYPE *) nptr;
+ }
+
+ return 0L;
+}
+
+/* External user entry point. */
+
+
+INT
+#ifdef weak_function
+weak_function
+#endif
+strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
+ int base LOCALE_PARAM_PROTO)
+{
+ return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
+}
diff --git a/gnulib/lib/strtoll.c b/gnulib/lib/strtoll.c
new file mode 100644
index 00000000..8d25b0c7
--- /dev/null
+++ b/gnulib/lib/strtoll.c
@@ -0,0 +1,33 @@
+/* Function to parse a `long long int' from text.
+ Copyright (C) 1995, 1996, 1997, 1999, 2001, 2009, 2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#define QUAD 1
+
+#include <strtol.c>
+
+#ifdef _LIBC
+# ifdef SHARED
+# include <shlib-compat.h>
+
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
+compat_symbol (libc, __strtoll_internal, __strtoq_internal, GLIBC_2_0);
+# endif
+
+# endif
+weak_alias (strtoll, strtoq)
+#endif
diff --git a/gnulib/lib/strtoul.c b/gnulib/lib/strtoul.c
new file mode 100644
index 00000000..def103ff
--- /dev/null
+++ b/gnulib/lib/strtoul.c
@@ -0,0 +1,19 @@
+/* Copyright (C) 1991, 1997, 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#define UNSIGNED 1
+
+#include "strtol.c"
diff --git a/gnulib/lib/strtoull.c b/gnulib/lib/strtoull.c
new file mode 100644
index 00000000..d4e65e35
--- /dev/null
+++ b/gnulib/lib/strtoull.c
@@ -0,0 +1,27 @@
+/* Function to parse an `unsigned long long int' from text.
+ Copyright (C) 1995, 1996, 1997, 1999, 2009, 2010 Free Software Foundation,
+ Inc.
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@gnu.org.
+
+ 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 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/>. */
+
+#define QUAD 1
+
+#include "strtoul.c"
+
+#ifdef _LIBC
+strong_alias (__strtoull_internal, __strtouq_internal)
+weak_alias (strtoull, strtouq)
+#endif
diff --git a/gnulib/lib/strtoumax.c b/gnulib/lib/strtoumax.c
new file mode 100644
index 00000000..dc395d62
--- /dev/null
+++ b/gnulib/lib/strtoumax.c
@@ -0,0 +1,2 @@
+#define UNSIGNED 1
+#include "strtoimax.c"
diff --git a/gnulib/lib/strverscmp.c b/gnulib/lib/strverscmp.c
new file mode 100644
index 00000000..fd054bdd
--- /dev/null
+++ b/gnulib/lib/strverscmp.c
@@ -0,0 +1,132 @@
+/* Compare strings while treating digits characters numerically.
+ Copyright (C) 1997, 2000, 2002, 2004, 2006, 2009-2010 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <ctype.h>
+
+/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
+ fractional parts, S_Z: idem but with leading Zeroes only */
+#define S_N 0x0
+#define S_I 0x4
+#define S_F 0x8
+#define S_Z 0xC
+
+/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
+#define CMP 2
+#define LEN 3
+
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+#undef __strverscmp
+#undef strverscmp
+
+#ifndef weak_alias
+# define __strverscmp strverscmp
+#endif
+
+/* Compare S1 and S2 as strings holding indices/version numbers,
+ returning less than, equal to or greater than zero if S1 is less than,
+ equal to or greater than S2 (for more info, see the texinfo doc).
+*/
+
+int
+__strverscmp (const char *s1, const char *s2)
+{
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+ int state;
+ int diff;
+
+ /* Symbol(s) 0 [1-9] others (padding)
+ Transition (10) 0 (01) d (00) x (11) - */
+ static const unsigned int next_state[] =
+ {
+ /* state x d 0 - */
+ /* S_N */ S_N, S_I, S_Z, S_N,
+ /* S_I */ S_N, S_I, S_I, S_I,
+ /* S_F */ S_N, S_F, S_F, S_F,
+ /* S_Z */ S_N, S_F, S_Z, S_Z
+ };
+
+ static const int result_type[] =
+ {
+ /* state x/x x/d x/0 x/- d/x d/d d/0 d/-
+ 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
+
+ /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_I */ CMP, -1, -1, CMP, 1, LEN, LEN, CMP,
+ 1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
+ /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_Z */ CMP, 1, 1, CMP, -1, CMP, CMP, CMP,
+ -1, CMP, CMP, CMP
+ };
+
+ if (p1 == p2)
+ return 0;
+
+ c1 = *p1++;
+ c2 = *p2++;
+ /* Hint: '0' is a digit too. */
+ state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0));
+
+ while ((diff = c1 - c2) == 0 && c1 != '\0')
+ {
+ state = next_state[state];
+ c1 = *p1++;
+ c2 = *p2++;
+ state |= (c1 == '0') + (ISDIGIT (c1) != 0);
+ }
+
+ state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))];
+
+ switch (state)
+ {
+ case CMP:
+ return diff;
+
+ case LEN:
+ while (ISDIGIT (*p1++))
+ if (!ISDIGIT (*p2++))
+ return 1;
+
+ return ISDIGIT (*p2) ? -1 : diff;
+
+ default:
+ return state;
+ }
+}
+#ifdef weak_alias
+weak_alias (__strverscmp, strverscmp)
+#endif
diff --git a/gnulib/lib/symlink.c b/gnulib/lib/symlink.c
new file mode 100644
index 00000000..40bbb804
--- /dev/null
+++ b/gnulib/lib/symlink.c
@@ -0,0 +1,57 @@
+/* Stub for symlink().
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+
+
+#if HAVE_SYMLINK
+
+# undef symlink
+
+/* Create a symlink, but reject trailing slash. */
+int
+rpl_symlink (char const *contents, char const *name)
+{
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ struct stat st;
+ if (lstat (name, &st) == 0)
+ errno = EEXIST;
+ return -1;
+ }
+ return symlink (contents, name);
+}
+
+#else /* !HAVE_SYMLINK */
+
+/* The system does not support symlinks. */
+int
+symlink (char const *contents _GL_UNUSED,
+ char const *name _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#endif /* !HAVE_SYMLINK */
diff --git a/gnulib/lib/symlinkat.c b/gnulib/lib/symlinkat.c
new file mode 100644
index 00000000..c01b3228
--- /dev/null
+++ b/gnulib/lib/symlinkat.c
@@ -0,0 +1,102 @@
+/* Create a symlink relative to an open directory.
+ Copyright (C) 2009-2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#if !HAVE_SYMLINK
+/* Mingw lacks symlink, and it is more efficient to provide a trivial
+ wrapper than to go through at-func.c to call rpl_symlink. */
+
+# include <errno.h>
+
+int
+symlinkat (char const *path1 _GL_UNUSED, int fd _GL_UNUSED,
+ char const *path2 _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_SYMLINK */
+
+/* Our openat helper functions expect the directory parameter first,
+ not second. These shims make life easier. */
+
+/* Like symlink, but with arguments reversed. */
+static int
+symlink_reversed (char const *file, char const *contents)
+{
+ return symlink (contents, file);
+}
+
+/* Like symlinkat, but with arguments reversed. */
+
+static int
+symlinkat_reversed (int fd, char const *file, char const *contents);
+
+# define AT_FUNC_NAME symlinkat_reversed
+# define AT_FUNC_F1 symlink_reversed
+# define AT_FUNC_POST_FILE_PARAM_DECLS , char const *contents
+# define AT_FUNC_POST_FILE_ARGS , contents
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+/* Create a symlink FILE, in the directory open on descriptor FD,
+ holding CONTENTS. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then symlink/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+int
+symlinkat (char const *contents, int fd, char const *file)
+{
+ return symlinkat_reversed (fd, file, contents);
+}
+
+#endif /* HAVE_SYMLINK */
+
+/* Gnulib provides a readlink stub for mingw; use it for distinction
+ between EINVAL and ENOENT, rather than always failing with ENOSYS. */
+
+/* POSIX 2008 says that unlike readlink, readlinkat returns 0 for
+ success instead of the buffer length. But this would render
+ readlinkat worthless since readlink does not guarantee a
+ NUL-terminated buffer. Assume this was a bug in POSIX. */
+
+/* Read the contents of symlink FILE into buffer BUF of size LEN, in the
+ directory open on descriptor FD. If possible, do it without changing
+ the working directory. Otherwise, resort to using save_cwd/fchdir,
+ then readlink/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+#define AT_FUNC_NAME readlinkat
+#define AT_FUNC_F1 readlink
+#define AT_FUNC_POST_FILE_PARAM_DECLS , char *buf, size_t len
+#define AT_FUNC_POST_FILE_ARGS , buf, len
+#define AT_FUNC_RESULT ssize_t
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+#undef AT_FUNC_RESULT
diff --git a/gnulib/lib/sys_file.in.h b/gnulib/lib/sys_file.in.h
new file mode 100644
index 00000000..77a7ccbe
--- /dev/null
+++ b/gnulib/lib/sys_file.in.h
@@ -0,0 +1,62 @@
+/* Provide a more complete sys/file.h.
+
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Richard W.M. Jones. */
+#ifndef _GL_SYS_FILE_H
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# if @HAVE_SYS_FILE_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_FILE_H@
+# endif
+
+#ifndef _GL_SYS_FILE_H
+#define _GL_SYS_FILE_H
+
+#ifndef LOCK_SH
+/* Operations for the 'flock' call (same as Linux kernel constants). */
+# define LOCK_SH 1 /* Shared lock. */
+# define LOCK_EX 2 /* Exclusive lock. */
+# define LOCK_UN 8 /* Unlock. */
+
+/* Can be OR'd in to one of the above. */
+# define LOCK_NB 4 /* Don't block when locking. */
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#if @GNULIB_FLOCK@
+/* Apply or remove advisory locks on an open file.
+ Return 0 if successful, otherwise -1 and errno set. */
+# if !@HAVE_FLOCK@
+extern int flock (int fd, int operation);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef flock
+# if HAVE_RAW_DECL_FLOCK
+_GL_WARN_ON_USE (flock, "flock is unportable - "
+ "use gnulib module flock for portability");
+# endif
+#endif
+
+
+#endif /* _GL_SYS_FILE_H */
+#endif /* _GL_SYS_FILE_H */
diff --git a/gnulib/lib/sys_ioctl.in.h b/gnulib/lib/sys_ioctl.in.h
new file mode 100644
index 00000000..05f28da6
--- /dev/null
+++ b/gnulib/lib/sys_ioctl.in.h
@@ -0,0 +1,73 @@
+/* Substitute for and wrapper around <sys/ioctl.h>.
+ Copyright (C) 2008-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_SYS_IOCTL_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SYS_IOCTL_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_IOCTL_H@
+#endif
+
+#ifndef _GL_SYS_IOCTL_H
+#define _GL_SYS_IOCTL_H
+
+/* AIX 5.1 and Solaris 10 declare ioctl() in <unistd.h> and in <stropts.h>,
+ but not in <sys/ioctl.h>.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <unistd.h>
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_IOCTL@
+# if @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+# undef ioctl
+# define ioctl rpl_ioctl
+extern int ioctl (int fd, int request, ... /* {void *,char *} arg */);
+# endif
+#elif @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef ioctl
+# define ioctl ioctl_used_without_requesting_gnulib_module_ioctl
+#elif defined GNULIB_POSIXCHECK
+# undef ioctl
+# if HAVE_RAW_DECL_IOCTL
+_GL_WARN_ON_USE (ioctl, "ioctl does not portably work on sockets - "
+ "use gnulib module ioctl for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_SYS_IOCTL_H */
+#endif /* _GL_SYS_IOCTL_H */
diff --git a/gnulib/lib/sys_select.in.h b/gnulib/lib/sys_select.in.h
new file mode 100644
index 00000000..b506e9fc
--- /dev/null
+++ b/gnulib/lib/sys_select.in.h
@@ -0,0 +1,103 @@
+/* Substitute for <sys/select.h>.
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+/* On OSF/1, <sys/types.h> and <sys/time.h> include <sys/select.h>.
+ Simply delegate to the system's header in this case. */
+#if @HAVE_SYS_SELECT_H@ && defined __osf__ && (defined _SYS_TYPES_H_ && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H) && defined _OSF_SOURCE
+
+# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#elif @HAVE_SYS_SELECT_H@ && defined __osf__ && (defined _SYS_TIME_H_ && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H) && defined _OSF_SOURCE
+
+# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#else
+
+#ifndef _GL_SYS_SELECT_H
+
+#if @HAVE_SYS_SELECT_H@
+
+/* On many platforms, <sys/select.h> assumes prior inclusion of
+ <sys/types.h>. */
+# include <sys/types.h>
+
+/* On OSF/1 4.0, <sys/select.h> provides only a forward declaration
+ of 'struct timeval', and no definition of this type.
+ But avoid namespace pollution on glibc systems. */
+# ifndef __GLIBC__
+# include <sys/time.h>
+# endif
+
+/* On Solaris 10, <sys/select.h> provides an FD_ZERO implementation
+ that relies on memset(), but without including <string.h>.
+ But avoid namespace pollution on glibc systems. */
+# ifndef __GLIBC__
+# include <string.h>
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#endif
+
+#ifndef _GL_SYS_SELECT_H
+#define _GL_SYS_SELECT_H
+
+#if !@HAVE_SYS_SELECT_H@ || @REPLACE_SELECT@
+
+/* A platform that lacks <sys/select.h>. */
+
+# include <sys/socket.h>
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if @GNULIB_SELECT@
+# if @HAVE_WINSOCK2_H@ || @REPLACE_SELECT@
+# undef select
+# define select rpl_select
+extern int rpl_select (int, fd_set *, fd_set *, fd_set *, struct timeval *);
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef select
+# define select select_used_without_requesting_gnulib_module_select
+# elif defined GNULIB_POSIXCHECK
+# undef select
+# if HAVE_RAW_DECL_SELECT
+_GL_WARN_ON_USE (select, "select is not always POSIX compliant - "
+ "use gnulib module select for portability");
+# endif
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+#endif /* _GL_SYS_SELECT_H */
+#endif /* _GL_SYS_SELECT_H */
+#endif /* OSF/1 */
diff --git a/gnulib/lib/sys_socket.in.h b/gnulib/lib/sys_socket.in.h
new file mode 100644
index 00000000..5fbf83df
--- /dev/null
+++ b/gnulib/lib/sys_socket.in.h
@@ -0,0 +1,462 @@
+/* Provide a sys/socket header file for systems lacking it (read: MinGW)
+ and for systems where it is incomplete.
+ Copyright (C) 2005-2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file is supposed to be used on platforms that lack <sys/socket.h>,
+ on platforms where <sys/socket.h> cannot be included standalone, and on
+ platforms where <sys/socket.h> does not provide all necessary definitions.
+ It is intended to provide definitions and prototypes needed by an
+ application. */
+
+#ifndef _GL_SYS_SOCKET_H
+
+#if @HAVE_SYS_SOCKET_H@
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+/* On many platforms, <sys/socket.h> assumes prior inclusion of
+ <sys/types.h>. */
+# include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@
+
+#endif
+
+#ifndef _GL_SYS_SOCKET_H
+#define _GL_SYS_SOCKET_H
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+#if !@HAVE_SA_FAMILY_T@
+typedef unsigned short sa_family_t;
+#endif
+
+#if !@HAVE_STRUCT_SOCKADDR_STORAGE@
+# include <alignof.h>
+/* Code taken from glibc sysdeps/unix/sysv/linux/bits/socket.h on
+ 2009-05-08, licensed under LGPLv2.1+, plus portability fixes. */
+# define __ss_aligntype unsigned long int
+# define _SS_SIZE 256
+# define _SS_PADSIZE \
+ (_SS_SIZE - ((sizeof (sa_family_t) >= alignof (__ss_aligntype) \
+ ? sizeof (sa_family_t) \
+ : alignof (__ss_aligntype)) \
+ + sizeof (__ss_aligntype)))
+
+struct sockaddr_storage
+{
+ sa_family_t ss_family; /* Address family, etc. */
+ __ss_aligntype __ss_align; /* Force desired alignment. */
+ char __ss_padding[_SS_PADSIZE];
+};
+#endif
+
+#if @HAVE_SYS_SOCKET_H@
+
+/* A platform that has <sys/socket.h>. */
+
+/* For shutdown(). */
+# if !defined SHUT_RD
+# define SHUT_RD 0
+# endif
+# if !defined SHUT_WR
+# define SHUT_WR 1
+# endif
+# if !defined SHUT_RDWR
+# define SHUT_RDWR 2
+# endif
+
+#else
+
+# ifdef __CYGWIN__
+# error "Cygwin does have a sys/socket.h, doesn't it?!?"
+# endif
+
+/* A platform that lacks <sys/socket.h>.
+
+ Currently only MinGW is supported. See the gnulib manual regarding
+ Windows sockets. MinGW has the header files winsock2.h and
+ ws2tcpip.h that declare the sys/socket.h definitions we need. Note
+ that you can influence which definitions you get by setting the
+ WINVER symbol before including these two files. For example,
+ getaddrinfo is only available if _WIN32_WINNT >= 0x0501 (that
+ symbol is set indiriectly through WINVER). You can set this by
+ adding AC_DEFINE(WINVER, 0x0501) to configure.ac. Note that your
+ code may not run on older Windows releases then. My Windows 2000
+ box was not able to run the code, for example. The situation is
+ slightly confusing because:
+ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/getaddrinfo_2.asp
+ suggests that getaddrinfo should be available on all Windows
+ releases. */
+
+
+# if @HAVE_WINSOCK2_H@
+# include <winsock2.h>
+# endif
+# if @HAVE_WS2TCPIP_H@
+# include <ws2tcpip.h>
+# endif
+
+/* For shutdown(). */
+# if !defined SHUT_RD && defined SD_RECEIVE
+# define SHUT_RD SD_RECEIVE
+# endif
+# if !defined SHUT_WR && defined SD_SEND
+# define SHUT_WR SD_SEND
+# endif
+# if !defined SHUT_RDWR && defined SD_BOTH
+# define SHUT_RDWR SD_BOTH
+# endif
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+# if @HAVE_WINSOCK2_H@
+/* Include headers needed by the emulation code. */
+# include <sys/types.h>
+# include <io.h>
+
+typedef int socklen_t;
+
+# endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if @HAVE_WINSOCK2_H@
+
+/* Re-define FD_ISSET to avoid a WSA call while we are not using
+ network sockets. */
+static inline int
+rpl_fd_isset (SOCKET fd, fd_set * set)
+{
+ u_int i;
+ if (set == NULL)
+ return 0;
+
+ for (i = 0; i < set->fd_count; i++)
+ if (set->fd_array[i] == fd)
+ return 1;
+
+ return 0;
+}
+
+# undef FD_ISSET
+# define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
+
+# endif
+
+/* Wrap everything else to use libc file descriptors for sockets. */
+
+# if @HAVE_WINSOCK2_H@ && !defined _GL_UNISTD_H
+# undef close
+# define close close_used_without_including_unistd_h
+# endif
+
+# if @HAVE_WINSOCK2_H@ && !defined _GL_UNISTD_H
+# undef gethostname
+# define gethostname gethostname_used_without_including_unistd_h
+# endif
+
+# if @GNULIB_SOCKET@
+# if @HAVE_WINSOCK2_H@
+# undef socket
+# define socket rpl_socket
+extern int rpl_socket (int, int, int protocol);
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef socket
+# define socket socket_used_without_requesting_gnulib_module_socket
+# elif defined GNULIB_POSIXCHECK
+# undef socket
+# if HAVE_RAW_DECL_SOCKET
+_GL_WARN_ON_USE (socket, "socket is not always POSIX compliant - "
+ "use gnulib module socket for portability");
+# endif
+# endif
+
+# if @GNULIB_CONNECT@
+# if @HAVE_WINSOCK2_H@
+# undef connect
+# define connect rpl_connect
+extern int rpl_connect (int, struct sockaddr *, int) _GL_ARG_NONNULL ((2));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef connect
+# define connect socket_used_without_requesting_gnulib_module_connect
+# elif defined GNULIB_POSIXCHECK
+# undef connect
+# if HAVE_RAW_DECL_CONNECT
+_GL_WARN_ON_USE (connect, "connect is not always POSIX compliant - "
+ "use gnulib module connect for portability");
+# endif
+# endif
+
+# if @GNULIB_ACCEPT@
+# if @HAVE_WINSOCK2_H@
+# undef accept
+# define accept rpl_accept
+extern int rpl_accept (int, struct sockaddr *, int *);
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef accept
+# define accept accept_used_without_requesting_gnulib_module_accept
+# elif defined GNULIB_POSIXCHECK
+# undef accept
+# if HAVE_RAW_DECL_ACCEPT
+_GL_WARN_ON_USE (accept, "accept is not always POSIX compliant - "
+ "use gnulib module accept for portability");
+# endif
+# endif
+
+# if @GNULIB_BIND@
+# if @HAVE_WINSOCK2_H@
+# undef bind
+# define bind rpl_bind
+extern int rpl_bind (int, struct sockaddr *, int) _GL_ARG_NONNULL ((2));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef bind
+# define bind bind_used_without_requesting_gnulib_module_bind
+# elif defined GNULIB_POSIXCHECK
+# undef bind
+# if HAVE_RAW_DECL_BIND
+_GL_WARN_ON_USE (bind, "bind is not always POSIX compliant - "
+ "use gnulib module bind for portability");
+# endif
+# endif
+
+# if @GNULIB_GETPEERNAME@
+# if @HAVE_WINSOCK2_H@
+# undef getpeername
+# define getpeername rpl_getpeername
+extern int rpl_getpeername (int, struct sockaddr *, int *)
+ _GL_ARG_NONNULL ((2, 3));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef getpeername
+# define getpeername getpeername_used_without_requesting_gnulib_module_getpeername
+# elif defined GNULIB_POSIXCHECK
+# undef getpeername
+# if HAVE_RAW_DECL_GETPEERNAME
+_GL_WARN_ON_USE (getpeername, "getpeername is not always POSIX compliant - "
+ "use gnulib module getpeername for portability");
+# endif
+# endif
+
+# if @GNULIB_GETSOCKNAME@
+# if @HAVE_WINSOCK2_H@
+# undef getsockname
+# define getsockname rpl_getsockname
+extern int rpl_getsockname (int, struct sockaddr *, int *)
+ _GL_ARG_NONNULL ((2, 3));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef getsockname
+# define getsockname getsockname_used_without_requesting_gnulib_module_getsockname
+# elif defined GNULIB_POSIXCHECK
+# undef getsockname
+# if HAVE_RAW_DECL_GETSOCKNAME
+_GL_WARN_ON_USE (getsockname, "getsockname is not always POSIX compliant - "
+ "use gnulib module getsockname for portability");
+# endif
+# endif
+
+# if @GNULIB_GETSOCKOPT@
+# if @HAVE_WINSOCK2_H@
+# undef getsockopt
+# define getsockopt rpl_getsockopt
+extern int rpl_getsockopt (int, int, int, void *, socklen_t *)
+ _GL_ARG_NONNULL ((4, 5));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef getsockopt
+# define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt
+# elif defined GNULIB_POSIXCHECK
+# undef getsockopt
+# if HAVE_RAW_DECL_GETSOCKOPT
+_GL_WARN_ON_USE (getsockopt, "getsockopt is not always POSIX compliant - "
+ "use gnulib module getsockopt for portability");
+# endif
+# endif
+
+# if @GNULIB_LISTEN@
+# if @HAVE_WINSOCK2_H@
+# undef listen
+# define listen rpl_listen
+extern int rpl_listen (int, int);
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef listen
+# define listen listen_used_without_requesting_gnulib_module_listen
+# elif defined GNULIB_POSIXCHECK
+# undef listen
+# if HAVE_RAW_DECL_LISTEN
+_GL_WARN_ON_USE (listen, "listen is not always POSIX compliant - "
+ "use gnulib module listen for portability");
+# endif
+# endif
+
+# if @GNULIB_RECV@
+# if @HAVE_WINSOCK2_H@
+# undef recv
+# define recv rpl_recv
+extern int rpl_recv (int, void *, int, int) _GL_ARG_NONNULL ((2));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef recv
+# define recv recv_used_without_requesting_gnulib_module_recv
+# elif defined GNULIB_POSIXCHECK
+# undef recv
+# if HAVE_RAW_DECL_RECV
+_GL_WARN_ON_USE (recv, "recv is not always POSIX compliant - "
+ "use gnulib module recv for portability");
+# endif
+# endif
+
+# if @GNULIB_SEND@
+# if @HAVE_WINSOCK2_H@
+# undef send
+# define send rpl_send
+extern int rpl_send (int, const void *, int, int) _GL_ARG_NONNULL ((2));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef send
+# define send send_used_without_requesting_gnulib_module_send
+# elif defined GNULIB_POSIXCHECK
+# undef send
+# if HAVE_RAW_DECL_SEND
+_GL_WARN_ON_USE (send, "send is not always POSIX compliant - "
+ "use gnulib module send for portability");
+# endif
+# endif
+
+# if @GNULIB_RECVFROM@
+# if @HAVE_WINSOCK2_H@
+# undef recvfrom
+# define recvfrom rpl_recvfrom
+extern int rpl_recvfrom (int, void *, int, int, struct sockaddr *, int *)
+ _GL_ARG_NONNULL ((2));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef recvfrom
+# define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom
+# elif defined GNULIB_POSIXCHECK
+# undef recvfrom
+# if HAVE_RAW_DECL_RECVFROM
+_GL_WARN_ON_USE (recvfrom, "recvfrom is not always POSIX compliant - "
+ "use gnulib module recvfrom for portability");
+# endif
+# endif
+
+# if @GNULIB_SENDTO@
+# if @HAVE_WINSOCK2_H@
+# undef sendto
+# define sendto rpl_sendto
+extern int rpl_sendto (int, const void *, int, int, struct sockaddr *, int)
+ _GL_ARG_NONNULL ((2));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef sendto
+# define sendto sendto_used_without_requesting_gnulib_module_sendto
+# elif defined GNULIB_POSIXCHECK
+# undef sendto
+# if HAVE_RAW_DECL_SENDTO
+_GL_WARN_ON_USE (sendto, "sendto is not always POSIX compliant - "
+ "use gnulib module sendto for portability");
+# endif
+# endif
+
+# if @GNULIB_SETSOCKOPT@
+# if @HAVE_WINSOCK2_H@
+# undef setsockopt
+# define setsockopt rpl_setsockopt
+extern int rpl_setsockopt (int, int, int, const void *, socklen_t)
+ _GL_ARG_NONNULL ((4));
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef setsockopt
+# define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt
+# elif defined GNULIB_POSIXCHECK
+# undef setsockopt
+# if HAVE_RAW_DECL_SETSOCKOPT
+_GL_WARN_ON_USE (setsockopt, "setsockopt is not always POSIX compliant - "
+ "use gnulib module setsockopt for portability");
+# endif
+# endif
+
+# if @GNULIB_SHUTDOWN@
+# if @HAVE_WINSOCK2_H@
+# undef shutdown
+# define shutdown rpl_shutdown
+extern int rpl_shutdown (int, int);
+# endif
+# elif @HAVE_WINSOCK2_H@
+# undef shutdown
+# define shutdown shutdown_used_without_requesting_gnulib_module_shutdown
+# elif defined GNULIB_POSIXCHECK
+# undef shutdown
+# if HAVE_RAW_DECL_SHUTDOWN
+_GL_WARN_ON_USE (shutdown, "shutdown is not always POSIX compliant - "
+ "use gnulib module shutdown for portability");
+# endif
+# endif
+
+# if @HAVE_WINSOCK2_H@
+# undef select
+# define select select_used_without_including_sys_select_h
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* HAVE_SYS_SOCKET_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_ACCEPT4@
+/* Accept a connection on a socket, with specific opening flags.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ See also the Linux man page at
+ <http://www.kernel.org/doc/man-pages/online/pages/man2/accept4.2.html>. */
+# if @HAVE_ACCEPT4@
+# define accept4 rpl_accept4
+# endif
+extern int accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags);
+#elif defined GNULIB_POSIXCHECK
+# undef accept4
+# if HAVE_RAW_DECL_ACCEPT4
+_GL_WARN_ON_USE (accept4, "accept4 is unportable - "
+ "use gnulib module accept4 for portability");
+# endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_SYS_SOCKET_H */
+#endif /* _GL_SYS_SOCKET_H */
diff --git a/gnulib/lib/sys_stat.in.h b/gnulib/lib/sys_stat.in.h
new file mode 100644
index 00000000..d79ba2b3
--- /dev/null
+++ b/gnulib/lib/sys_stat.in.h
@@ -0,0 +1,548 @@
+/* Provide a more complete sys/stat header file.
+ Copyright (C) 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake, Paul Eggert, and Jim Meyering. */
+
+/* This file is supposed to be used on platforms where <sys/stat.h> is
+ incomplete. It is intended to provide definitions and prototypes
+ needed by an application. Start with what the system provides. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if defined __need_system_sys_stat_h
+/* Special invocation convention. */
+
+#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _GL_SYS_STAT_H
+
+/* Get nlink_t. */
+#include <sys/types.h>
+
+/* Get struct timespec. */
+#include <time.h>
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@
+
+#ifndef _GL_SYS_STAT_H
+#define _GL_SYS_STAT_H
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Before doing "#define mkdir rpl_mkdir" below, we need to include all
+ headers that may declare mkdir(). */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <io.h>
+#endif
+
+#ifndef S_IFMT
+# define S_IFMT 0170000
+#endif
+
+#if STAT_MACROS_BROKEN
+# undef S_ISBLK
+# undef S_ISCHR
+# undef S_ISDIR
+# undef S_ISFIFO
+# undef S_ISLNK
+# undef S_ISNAM
+# undef S_ISMPB
+# undef S_ISMPC
+# undef S_ISNWK
+# undef S_ISREG
+# undef S_ISSOCK
+#endif
+
+#ifndef S_ISBLK
+# ifdef S_IFBLK
+# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
+# else
+# define S_ISBLK(m) 0
+# endif
+#endif
+
+#ifndef S_ISCHR
+# ifdef S_IFCHR
+# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
+# else
+# define S_ISCHR(m) 0
+# endif
+#endif
+
+#ifndef S_ISDIR
+# ifdef S_IFDIR
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+# else
+# define S_ISDIR(m) 0
+# endif
+#endif
+
+#ifndef S_ISDOOR /* Solaris 2.5 and up */
+# define S_ISDOOR(m) 0
+#endif
+
+#ifndef S_ISFIFO
+# ifdef S_IFIFO
+# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
+# else
+# define S_ISFIFO(m) 0
+# endif
+#endif
+
+#ifndef S_ISLNK
+# ifdef S_IFLNK
+# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
+# else
+# define S_ISLNK(m) 0
+# endif
+#endif
+
+#ifndef S_ISMPB /* V7 */
+# ifdef S_IFMPB
+# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
+# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
+# else
+# define S_ISMPB(m) 0
+# define S_ISMPC(m) 0
+# endif
+#endif
+
+#ifndef S_ISNAM /* Xenix */
+# ifdef S_IFNAM
+# define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM)
+# else
+# define S_ISNAM(m) 0
+# endif
+#endif
+
+#ifndef S_ISNWK /* HP/UX */
+# ifdef S_IFNWK
+# define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
+# else
+# define S_ISNWK(m) 0
+# endif
+#endif
+
+#ifndef S_ISPORT /* Solaris 10 and up */
+# define S_ISPORT(m) 0
+#endif
+
+#ifndef S_ISREG
+# ifdef S_IFREG
+# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+# else
+# define S_ISREG(m) 0
+# endif
+#endif
+
+#ifndef S_ISSOCK
+# ifdef S_IFSOCK
+# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
+# else
+# define S_ISSOCK(m) 0
+# endif
+#endif
+
+
+#ifndef S_TYPEISMQ
+# define S_TYPEISMQ(p) 0
+#endif
+
+#ifndef S_TYPEISTMO
+# define S_TYPEISTMO(p) 0
+#endif
+
+
+#ifndef S_TYPEISSEM
+# ifdef S_INSEM
+# define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM)
+# else
+# define S_TYPEISSEM(p) 0
+# endif
+#endif
+
+#ifndef S_TYPEISSHM
+# ifdef S_INSHD
+# define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD)
+# else
+# define S_TYPEISSHM(p) 0
+# endif
+#endif
+
+/* high performance ("contiguous data") */
+#ifndef S_ISCTG
+# define S_ISCTG(p) 0
+#endif
+
+/* Cray DMF (data migration facility): off line, with data */
+#ifndef S_ISOFD
+# define S_ISOFD(p) 0
+#endif
+
+/* Cray DMF (data migration facility): off line, with no data */
+#ifndef S_ISOFL
+# define S_ISOFL(p) 0
+#endif
+
+/* 4.4BSD whiteout */
+#ifndef S_ISWHT
+# define S_ISWHT(m) 0
+#endif
+
+/* If any of the following are undefined,
+ define them to their de facto standard values. */
+#if !S_ISUID
+# define S_ISUID 04000
+#endif
+#if !S_ISGID
+# define S_ISGID 02000
+#endif
+
+/* S_ISVTX is a common extension to POSIX. */
+#ifndef S_ISVTX
+# define S_ISVTX 01000
+#endif
+
+#if !S_IRUSR && S_IREAD
+# define S_IRUSR S_IREAD
+#endif
+#if !S_IRUSR
+# define S_IRUSR 00400
+#endif
+#if !S_IRGRP
+# define S_IRGRP (S_IRUSR >> 3)
+#endif
+#if !S_IROTH
+# define S_IROTH (S_IRUSR >> 6)
+#endif
+
+#if !S_IWUSR && S_IWRITE
+# define S_IWUSR S_IWRITE
+#endif
+#if !S_IWUSR
+# define S_IWUSR 00200
+#endif
+#if !S_IWGRP
+# define S_IWGRP (S_IWUSR >> 3)
+#endif
+#if !S_IWOTH
+# define S_IWOTH (S_IWUSR >> 6)
+#endif
+
+#if !S_IXUSR && S_IEXEC
+# define S_IXUSR S_IEXEC
+#endif
+#if !S_IXUSR
+# define S_IXUSR 00100
+#endif
+#if !S_IXGRP
+# define S_IXGRP (S_IXUSR >> 3)
+#endif
+#if !S_IXOTH
+# define S_IXOTH (S_IXUSR >> 6)
+#endif
+
+#if !S_IRWXU
+# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
+#endif
+#if !S_IRWXG
+# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
+#endif
+#if !S_IRWXO
+# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
+#endif
+
+/* S_IXUGO is a common extension to POSIX. */
+#if !S_IXUGO
+# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
+#endif
+
+#ifndef S_IRWXUGO
+# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
+#endif
+
+/* Macros for futimens and utimensat. */
+#ifndef UTIME_NOW
+# define UTIME_NOW (-1)
+# define UTIME_OMIT (-2)
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_FCHMODAT@
+# if !@HAVE_FCHMODAT@
+extern int fchmodat (int fd, char const *file, mode_t mode, int flag)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fchmodat
+# if HAVE_RAW_DECL_FCHMODAT
+_GL_WARN_ON_USE (fchmodat, "fchmodat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @REPLACE_FSTAT@
+# define fstat rpl_fstat
+extern int fstat (int fd, struct stat *buf) _GL_ARG_NONNULL ((2));
+#endif
+
+
+#if @GNULIB_FSTATAT@
+# if @REPLACE_FSTATAT@
+# undef fstatat
+# define fstatat rpl_fstatat
+# endif
+# if !@HAVE_FSTATAT@ || @REPLACE_FSTATAT@
+extern int fstatat (int fd, char const *name, struct stat *st, int flags)
+ _GL_ARG_NONNULL ((2, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fstatat
+# if HAVE_RAW_DECL_FSTATAT
+_GL_WARN_ON_USE (fstatat, "fstatat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FUTIMENS@
+# if @REPLACE_FUTIMENS@
+# undef futimens
+# define futimens rpl_futimens
+# endif
+# if !@HAVE_FUTIMENS@ || @REPLACE_FUTIMENS@
+extern int futimens (int fd, struct timespec const times[2]);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef futimens
+# if HAVE_RAW_DECL_FUTIMENS
+_GL_WARN_ON_USE (futimens, "futimens is not portable - "
+ "use gnulib module futimens for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LCHMOD@
+/* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME
+ denotes a symbolic link. */
+# if !@HAVE_LCHMOD@
+/* The lchmod replacement follows symbolic links. Callers should take
+ this into account; lchmod should be applied only to arguments that
+ are known to not be symbolic links. On hosts that lack lchmod,
+ this can lead to race conditions between the check and the
+ invocation of lchmod, but we know of no workarounds that are
+ reliable in general. You might try requesting support for lchmod
+ from your operating system supplier. */
+# define lchmod chmod
+# endif
+# if 0 /* assume already declared */
+extern int lchmod (const char *filename, mode_t mode) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef lchmod
+# if HAVE_RAW_DECL_LCHMOD
+_GL_WARN_ON_USE (lchmod, "lchmod is unportable - "
+ "use gnulib module lchmod for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LSTAT@
+# if ! @HAVE_LSTAT@
+/* mingw does not support symlinks, therefore it does not have lstat. But
+ without links, stat does just fine. */
+# define lstat stat
+# elif @REPLACE_LSTAT@
+# undef lstat
+# define lstat rpl_lstat
+extern int rpl_lstat (const char *name, struct stat *buf)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef lstat
+# if HAVE_RAW_DECL_LSTAT
+_GL_WARN_ON_USE (lstat, "lstat is unportable - "
+ "use gnulib module lstat for portability");
+# endif
+#endif
+
+
+#if @REPLACE_MKDIR@
+# undef mkdir
+# define mkdir rpl_mkdir
+extern int mkdir (char const *name, mode_t mode) _GL_ARG_NONNULL ((1));
+#else
+/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
+ Additionally, it declares _mkdir (and depending on compile flags, an
+ alias mkdir), only in the nonstandard <io.h>, which is included above. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+static inline int
+rpl_mkdir (char const *name, mode_t mode)
+{
+ return _mkdir (name);
+}
+
+# define mkdir rpl_mkdir
+# endif
+#endif
+
+
+#if @GNULIB_MKDIRAT@
+# if !@HAVE_MKDIRAT@
+extern int mkdirat (int fd, char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkdirat
+# if HAVE_RAW_DECL_MKDIRAT
+_GL_WARN_ON_USE (mkdirat, "mkdirat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKFIFO@
+# if @REPLACE_MKFIFO@
+# undef mkfifo
+# define mkfifo rpl_mkfifo
+# endif
+# if !@HAVE_MKFIFO@ || @REPLACE_MKFIFO@
+extern int mkfifo (char const *file, mode_t mode) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkfifo
+# if HAVE_RAW_DECL_MKFIFO
+_GL_WARN_ON_USE (mkfifo, "mkfifo is not portable - "
+ "use gnulib module mkfifo for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKFIFOAT@
+# if !@HAVE_MKFIFOAT@
+extern int mkfifoat (int fd, char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mkfifoat
+# if HAVE_RAW_DECL_MKFIFOAT
+_GL_WARN_ON_USE (mkfifoat, "mkfifoat is not portable - "
+ "use gnulib module mkfifoat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKNOD@
+# if @REPLACE_MKNOD@
+# undef mknod
+# define mknod rpl_mknod
+# endif
+# if !@HAVE_MKNOD@ || @REPLACE_MKNOD@
+extern int mknod (char const *file, mode_t mode, dev_t dev)
+ _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mknod
+# if HAVE_RAW_DECL_MKNOD
+_GL_WARN_ON_USE (mknod, "mknod is not portable - "
+ "use gnulib module mknod for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKNODAT@
+# if !@HAVE_MKNODAT@
+extern int mknodat (int fd, char const *file, mode_t mode, dev_t dev)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mknodat
+# if HAVE_RAW_DECL_MKNODAT
+_GL_WARN_ON_USE (mknodat, "mknodat is not portable - "
+ "use gnulib module mkfifoat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_STAT@
+# if @REPLACE_STAT@
+/* We can't use the object-like #define stat rpl_stat, because of
+ struct stat. This means that rpl_stat will not be used if the user
+ does (stat)(a,b). Oh well. */
+# undef stat
+# ifdef _LARGE_FILES
+ /* With _LARGE_FILES defined, AIX (only) defines stat to stat64,
+ so we have to replace stat64() instead of stat(). */
+# define stat stat64
+# undef stat64
+# define stat64(name, st) rpl_stat (name, st)
+# else /* !_LARGE_FILES */
+# define stat(name, st) rpl_stat (name, st)
+# endif /* !_LARGE_FILES */
+extern int stat (const char *name, struct stat *buf) _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef stat
+# if HAVE_RAW_DECL_STAT
+_GL_WARN_ON_USE (stat, "stat is unportable - "
+ "use gnulib module stat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UTIMENSAT@
+# if @REPLACE_UTIMENSAT@
+# undef utimensat
+# define utimensat rpl_utimensat
+# endif
+# if !@HAVE_UTIMENSAT@ || @REPLACE_UTIMENSAT@
+ extern int utimensat (int fd, char const *name,
+ struct timespec const times[2], int flag)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef utimensat
+# if HAVE_RAW_DECL_UTIMENSAT
+_GL_WARN_ON_USE (utimensat, "utimensat is not portable - "
+ "use gnulib module utimensat for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_SYS_STAT_H */
+#endif /* _GL_SYS_STAT_H */
+#endif
diff --git a/gnulib/lib/sys_time.in.h b/gnulib/lib/sys_time.in.h
new file mode 100644
index 00000000..fe7f6243
--- /dev/null
+++ b/gnulib/lib/sys_time.in.h
@@ -0,0 +1,79 @@
+/* Provide a more complete sys/time.h.
+
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if defined _GL_SYS_TIME_H
+
+/* Simply delegate to the system's header, without adding anything. */
+# if @HAVE_SYS_TIME_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
+# endif
+
+#else
+
+# define _GL_SYS_TIME_H
+
+# if @HAVE_SYS_TIME_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
+# else
+# include <time.h>
+# endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+# if ! @HAVE_STRUCT_TIMEVAL@
+struct timeval
+{
+ time_t tv_sec;
+ long int tv_usec;
+};
+# endif
+
+# if @GNULIB_GETTIMEOFDAY@
+# if @REPLACE_GETTIMEOFDAY@
+# undef gettimeofday
+# define gettimeofday rpl_gettimeofday
+# endif
+# if @REPLACE_GETTIMEOFDAY@ || !@HAVE_GETTIMEOFDAY@
+extern int gettimeofday (struct timeval *restrict, void *restrict)
+ _GL_ARG_NONNULL ((1));
+# endif
+# elif defined GNULIB_POSIXCHECK
+# undef gettimeofday
+# if HAVE_RAW_DECL_GETTIMEOFDAY
+_GL_WARN_ON_USE (gettimeofday, "gettimeofday is unportable - "
+ "use gnulib module gettimeofday for portability");
+# endif
+# endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_SYS_TIME_H */
diff --git a/gnulib/lib/sys_times.in.h b/gnulib/lib/sys_times.in.h
new file mode 100644
index 00000000..57f3a720
--- /dev/null
+++ b/gnulib/lib/sys_times.in.h
@@ -0,0 +1,77 @@
+/* Provide a sys/times.h header file.
+ Copyright (C) 2008-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+/* This file is supposed to be used on platforms where <sys/times.h>
+ is missing. */
+
+#ifndef _GL_SYS_TIMES_H
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+# if @HAVE_SYS_TIMES_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_TIMES_H@
+# endif
+
+# define _GL_SYS_TIMES_H
+
+/* Get clock_t.
+ But avoid namespace pollution on glibc systems. */
+# ifndef __GLIBC__
+# include <time.h>
+# endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !@HAVE_STRUCT_TMS@
+ /* Structure describing CPU time used by a process and its children. */
+ struct tms
+ {
+ clock_t tms_utime; /* User CPU time. */
+ clock_t tms_stime; /* System CPU time. */
+
+ clock_t tms_cutime; /* User CPU time of dead children. */
+ clock_t tms_cstime; /* System CPU time of dead children. */
+ };
+# endif
+
+# if @GNULIB_TIMES@
+# if !@HAVE_TIMES@
+ extern clock_t times (struct tms *buffer) _GL_ARG_NONNULL ((1));
+# endif
+# elif defined GNULIB_POSIXCHECK
+# undef times
+# if HAVE_RAW_DECL_TIMES
+_GL_WARN_ON_USE (times, "times is unportable - "
+ "use gnulib module times for portability");
+# endif
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* _GL_SYS_TIMES_H */
diff --git a/gnulib/lib/sys_utsname.in.h b/gnulib/lib/sys_utsname.in.h
new file mode 100644
index 00000000..c0dabccb
--- /dev/null
+++ b/gnulib/lib/sys_utsname.in.h
@@ -0,0 +1,96 @@
+/* Substitute for <sys/utsname.h>.
+ Copyright (C) 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_SYS_UTSNAME_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if @HAVE_SYS_UTSNAME_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_UTSNAME_H@
+#endif
+
+#define _GL_SYS_UTSNAME_H
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !@HAVE_STRUCT_UTSNAME@
+/* Length of the entries in 'struct utsname' is 256. */
+# define _UTSNAME_LENGTH 256
+
+# ifndef _UTSNAME_NODENAME_LENGTH
+# define _UTSNAME_NODENAME_LENGTH _UTSNAME_LENGTH
+# endif
+# ifndef _UTSNAME_SYSNAME_LENGTH
+# define _UTSNAME_SYSNAME_LENGTH _UTSNAME_LENGTH
+# endif
+# ifndef _UTSNAME_RELEASE_LENGTH
+# define _UTSNAME_RELEASE_LENGTH _UTSNAME_LENGTH
+# endif
+# ifndef _UTSNAME_VERSION_LENGTH
+# define _UTSNAME_VERSION_LENGTH _UTSNAME_LENGTH
+# endif
+# ifndef _UTSNAME_MACHINE_LENGTH
+# define _UTSNAME_MACHINE_LENGTH _UTSNAME_LENGTH
+# endif
+
+/* Structure describing the system and machine. */
+struct utsname
+ {
+ /* Name of this node on the network. */
+ char nodename[_UTSNAME_NODENAME_LENGTH];
+
+ /* Name of the implementation of the operating system. */
+ char sysname[_UTSNAME_SYSNAME_LENGTH];
+ /* Current release level of this implementation. */
+ char release[_UTSNAME_RELEASE_LENGTH];
+ /* Current version level of this release. */
+ char version[_UTSNAME_VERSION_LENGTH];
+
+ /* Name of the hardware type the system is running on. */
+ char machine[_UTSNAME_MACHINE_LENGTH];
+ };
+#endif /* !@HAVE_STRUCT_UTSNAME@ */
+
+
+#if @GNULIB_UNAME@
+# if !@HAVE_UNAME@
+extern int uname (struct utsname *buf) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef uname
+# if HAVE_RAW_DECL_UNAME
+_GL_WARN_ON_USE (uname, "uname is unportable - "
+ "use gnulib module uname for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_SYS_UTSNAME_H */
diff --git a/gnulib/lib/sys_wait.in.h b/gnulib/lib/sys_wait.in.h
new file mode 100644
index 00000000..6699c61f
--- /dev/null
+++ b/gnulib/lib/sys_wait.in.h
@@ -0,0 +1,106 @@
+/* A POSIX-like <sys/wait.h>.
+ Copyright (C) 2001-2003, 2005-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+
+#ifndef _GL_SYS_WAIT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+# @INCLUDE_NEXT@ @NEXT_SYS_WAIT_H@
+#endif
+
+#ifndef _GL_SYS_WAIT_H
+#define _GL_SYS_WAIT_H
+
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+/* Unix API. */
+
+/* The following macros apply to an argument x, that is a status of a process,
+ as returned by waitpid().
+ On nearly all systems, including Linux/x86, WEXITSTATUS are bits 15..8 and
+ WTERMSIG are bits 7..0, while BeOS uses the opposite. Therefore programs
+ have to use the abstract macros. */
+
+/* For valid x, exactly one of WIFSIGNALED(x), WIFEXITED(x), WIFSTOPPED(x)
+ is true. */
+# ifndef WIFSIGNALED
+# define WIFSIGNALED(x) (WTERMSIG (x) != 0 && WTERMSIG(x) != 0x7f)
+# endif
+# ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+# endif
+# ifndef WIFSTOPPED
+# define WIFSTOPPED(x) (WTERMSIG (x) == 0x7f)
+# endif
+
+/* The termination signal. Only to be accessed if WIFSIGNALED(x) is true. */
+# ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+# endif
+
+/* The exit status. Only to be accessed if WIFEXITED(x) is true. */
+# ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+# endif
+
+/* True if the process dumped core. Not standardized by POSIX. */
+# ifndef WCOREDUMP
+# define WCOREDUMP(x) ((x) & 0x80)
+# endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Declarations of functions. */
+
+# ifdef __cplusplus
+}
+# endif
+
+#else
+/* Native Windows API. */
+
+# include <process.h>
+
+# define waitpid(pid,statusp,options) _cwait (statusp, pid, WAIT_CHILD)
+
+/* The following macros apply to an argument x, that is a status of a process,
+ as returned by waitpid() or, equivalently, _cwait() or GetExitCodeProcess().
+ This value is simply an 'int', not composed of bit fields. */
+
+/* When an unhandled fatal signal terminates a process, the exit code is 3. */
+# define WIFSIGNALED(x) ((x) == 3)
+# define WIFEXITED(x) ((x) != 3)
+# define WIFSTOPPED(x) 0
+
+/* The signal that terminated a process is not known posthum. */
+# define WTERMSIG(x) SIGTERM
+
+# define WEXITSTATUS(x) (x)
+
+/* There are no core dumps. */
+# define WCOREDUMP(x) 0
+
+#endif
+
+#endif /* _GL_SYS_WAIT_H */
+#endif /* _GL_SYS_WAIT_H */
diff --git a/gnulib/lib/sysexits.in.h b/gnulib/lib/sysexits.in.h
new file mode 100644
index 00000000..5d5a2193
--- /dev/null
+++ b/gnulib/lib/sysexits.in.h
@@ -0,0 +1,71 @@
+/* exit() exit codes for some BSD system programs.
+ Copyright (C) 2003, 2006-2010 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/>. */
+
+/* Written by Simon Josefsson based on sysexits(3) man page */
+
+#ifndef _GL_SYSEXITS_H
+
+#if @HAVE_SYSEXITS_H@
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+
+/* IRIX 6.5 has an <unistd.h> that defines a macro EX_OK with a nonzero
+ value. Override it. See
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-03/msg00361.html> */
+# ifdef __sgi
+# include <unistd.h>
+# undef EX_OK
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYSEXITS_H@
+
+/* HP-UX 11 <sysexits.h> ends at EX_NOPERM. */
+# ifndef EX_CONFIG
+# define EX_CONFIG 78
+# endif
+
+#endif
+
+#ifndef _GL_SYSEXITS_H
+#define _GL_SYSEXITS_H
+
+#if !@HAVE_SYSEXITS_H@
+
+# define EX_OK 0 /* same value as EXIT_SUCCESS */
+
+# define EX_USAGE 64
+# define EX_DATAERR 65
+# define EX_NOINPUT 66
+# define EX_NOUSER 67
+# define EX_NOHOST 68
+# define EX_UNAVAILABLE 69
+# define EX_SOFTWARE 70
+# define EX_OSERR 71
+# define EX_OSFILE 72
+# define EX_CANTCREAT 73
+# define EX_IOERR 74
+# define EX_TEMPFAIL 75
+# define EX_PROTOCOL 76
+# define EX_NOPERM 77
+# define EX_CONFIG 78
+
+#endif
+
+#endif /* _GL_SYSEXITS_H */
+#endif /* _GL_SYSEXITS_H */
diff --git a/gnulib/lib/t-idcache b/gnulib/lib/t-idcache
new file mode 100755
index 00000000..e4d71af0
--- /dev/null
+++ b/gnulib/lib/t-idcache
@@ -0,0 +1,52 @@
+#!/bin/sh
+# Compare the two halves (user and group) of idcache.c.
+# Once xformed, they'd better be the same:
+
+pwd=`pwd`
+t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
+trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+srcdir=../..
+framework_failure=0
+mkdir -p $tmp || framework_failure=1
+cd $tmp || framework_failure=1
+
+if test $framework_failure = 1; then
+ echo "$0: failure in testing framework" 1>&2
+ (exit 1); exit 1
+fi
+
+# Extract user-oriented functions.
+perl -ne \
+ 'print if /^static struct.*user_alist/ .. /^static struct.*group_alist/' \
+ $srcdir/idcache.c | head -n -3 > u
+# Extract group-oriented functions.
+perl -ne 'print if /^static struct.*group_alist/ .. eof' $srcdir/idcache.c > g
+
+# Convert user-specific strings of "u" into corresponding group-specific strings
+subst='
+s/user_/group_/g;
+s/\buser\b/group/g;
+s/USER/GROUP/g;
+s/\bu\b/g/g;
+s/passwd/group/g;
+s/pw_uid/gr_gid/g;
+s/pwnam/grnam/g;
+s/pwent/grent/g;
+s/getpw/getgr/g;
+s/pw_/gr_/g;
+s/UID/GID/g;
+s/uid/gid/g;
+s/getuser/getgroup/;
+s/login name/group name/;
+s/to be the/to belong to/;
+s/pwd fun/grp fun/;
+'
+
+fail=0
+# Ensure that the transformed "u" is the same as g.
+# Any differences here constitute an error.
+perl -pe "$subst" u | diff -u - g || fail=1
+
+exit $fail
diff --git a/gnulib/lib/tanl.c b/gnulib/lib/tanl.c
new file mode 100644
index 00000000..6a6dc6d8
--- /dev/null
+++ b/gnulib/lib/tanl.c
@@ -0,0 +1,223 @@
+/* s_tanl.c -- long double version of s_tan.c.
+ * Conversion to IEEE quad long double by Jakub Jelinek, jj@ultra.linux.cz.
+ */
+
+/* @(#)s_tan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+/* tanl(x)
+ * Return tangent function of x.
+ *
+ * kernel function:
+ * __kernel_tanl ... tangent function on [-pi/4,pi/4]
+ * __ieee754_rem_pio2l ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "trigl.h"
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ Long double expansions contributed by
+ Stephen L. Moshier <moshier@na-net.ornl.gov>
+*/
+
+/* __kernel_tanl( x, y, k )
+ * kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ * Input k indicates whether tan (if k=1) or
+ * -1/tan (if k= -1) is returned.
+ *
+ * Algorithm
+ * 1. Since tan(-x) = -tan(x), we need only to consider positive x.
+ * 2. if x < 2^-57, return x with inexact if x!=0.
+ * 3. tan(x) is approximated by a rational form x + x^3 / 3 + x^5 R(x^2)
+ * on [0,0.67433].
+ *
+ * Note: tan(x+y) = tan(x) + tan'(x)*y
+ * ~ tan(x) + (1+x*x)*y
+ * Therefore, for better accuracy in computing tan(x+y), let
+ * r = x^3 * R(x^2)
+ * then
+ * tan(x+y) = x + (x^3 / 3 + (x^2 *(r+y)+y))
+ *
+ * 4. For x in [0.67433,pi/4], let y = pi/4 - x, then
+ * tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
+ * = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
+ */
+
+
+static const long double
+ pio4hi = 7.8539816339744830961566084581987569936977E-1L,
+ pio4lo = 2.1679525325309452561992610065108379921906E-35L,
+
+ /* tan x = x + x^3 / 3 + x^5 T(x^2)/U(x^2)
+ 0 <= x <= 0.6743316650390625
+ Peak relative error 8.0e-36 */
+ TH = 3.333333333333333333333333333333333333333E-1L,
+ T0 = -1.813014711743583437742363284336855889393E7L,
+ T1 = 1.320767960008972224312740075083259247618E6L,
+ T2 = -2.626775478255838182468651821863299023956E4L,
+ T3 = 1.764573356488504935415411383687150199315E2L,
+ T4 = -3.333267763822178690794678978979803526092E-1L,
+
+ U0 = -1.359761033807687578306772463253710042010E8L,
+ U1 = 6.494370630656893175666729313065113194784E7L,
+ U2 = -4.180787672237927475505536849168729386782E6L,
+ U3 = 8.031643765106170040139966622980914621521E4L,
+ U4 = -5.323131271912475695157127875560667378597E2L;
+ /* 1.000000000000000000000000000000000000000E0 */
+
+
+static long double
+kernel_tanl (long double x, long double y, int iy)
+{
+ long double z, r, v, w, s, u, u1;
+ int invert = 0, sign;
+
+ sign = 1;
+ if (x < 0)
+ {
+ x = -x;
+ y = -y;
+ sign = -1;
+ }
+
+ if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* x < 2**-57 */
+ {
+ if ((int) x == 0)
+ { /* generate inexact */
+ if (iy == -1 && x == 0.0)
+ return 1.0L / fabs (x);
+ else
+ return (iy == 1) ? x : -1.0L / x;
+ }
+ }
+ if (x >= 0.6743316650390625) /* |x| >= 0.6743316650390625 */
+ {
+ invert = 1;
+
+ z = pio4hi - x;
+ w = pio4lo - y;
+ x = z + w;
+ y = 0.0;
+ }
+ z = x * x;
+ r = T0 + z * (T1 + z * (T2 + z * (T3 + z * T4)));
+ v = U0 + z * (U1 + z * (U2 + z * (U3 + z * (U4 + z))));
+ r = r / v;
+
+ s = z * x;
+ r = y + z * (s * r + y);
+ r += TH * s;
+ w = x + r;
+ if (invert)
+ {
+ v = (long double) iy;
+ w = (v - 2.0 * (x - (w * w / (w + v) - r)));
+ if (sign < 0)
+ w = -w;
+ return w;
+ }
+ if (iy == 1)
+ return w;
+ else
+ { /* if allow error up to 2 ulp,
+ simply return -1.0/(x+r) here */
+ /* compute -1.0/(x+r) accurately */
+ u1 = (double) w;
+ v = r - (u1 - x);
+ z = -1.0 / w;
+ u = (double) z;
+ s = 1.0 + u * u1;
+ return u + z * (s + u * v);
+ }
+}
+
+long double
+tanl (long double x)
+{
+ long double y[2], z = 0.0L;
+ int n;
+
+ /* tanl(NaN) is NaN */
+ if (isnanl (x))
+ return x;
+
+ /* |x| ~< pi/4 */
+ if (x >= -0.7853981633974483096156608458198757210492 &&
+ x <= 0.7853981633974483096156608458198757210492)
+ return kernel_tanl (x, z, 1);
+
+ /* tanl(Inf) is NaN, tanl(0) is 0 */
+ else if (x + x == x)
+ return x - x; /* NaN */
+
+ /* argument reduction needed */
+ else
+ {
+ n = ieee754_rem_pio2l (x, y);
+ /* 1 -- n even, -1 -- n odd */
+ return kernel_tanl (y[0], y[1], 1 - ((n & 1) << 1));
+ }
+}
+
+#if 0
+int
+main (void)
+{
+ printf ("%.16Lg\n", tanl(0.7853981633974483096156608458198757210492));
+ printf ("%.16Lg\n", tanl(-0.7853981633974483096156608458198757210492));
+ printf ("%.16Lg\n", tanl(0.7853981633974483096156608458198757210492 *3));
+ printf ("%.16Lg\n", tanl(-0.7853981633974483096156608458198757210492 *31));
+ printf ("%.16Lg\n", tanl(0.7853981633974483096156608458198757210492 / 2));
+ printf ("%.16Lg\n", tanl(0.7853981633974483096156608458198757210492 * 3/2));
+ printf ("%.16Lg\n", tanl(0.7853981633974483096156608458198757210492 * 5/2));
+}
+#endif
diff --git a/gnulib/lib/tempname.c b/gnulib/lib/tempname.c
new file mode 100644
index 00000000..134908b4
--- /dev/null
+++ b/gnulib/lib/tempname.c
@@ -0,0 +1,311 @@
+/* tempname.c - generate the name of a temporary file.
+
+ Copyright (C) 1991-2003, 2005-2007, 2009-2010 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/>. */
+
+/* Extracted from glibc sysdeps/posix/tempname.c. See also tmpdir.c. */
+
+#if !_LIBC
+# include <config.h>
+# include "tempname.h"
+#endif
+
+#include <sys/types.h>
+#include <assert.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <stdio.h>
+#ifndef P_tmpdir
+# define P_tmpdir "/tmp"
+#endif
+#ifndef TMP_MAX
+# define TMP_MAX 238328
+#endif
+#ifndef __GT_FILE
+# define __GT_FILE 0
+# define __GT_DIR 1
+# define __GT_NOCREATE 2
+#endif
+#if !_LIBC && (GT_FILE != __GT_FILE || GT_DIR != __GT_DIR \
+ || GT_NOCREATE != __GT_NOCREATE)
+# error report this to bug-gnulib@gnu.org
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h>
+#include <sys/time.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include <sys/stat.h>
+
+#if _LIBC
+# define struct_stat64 struct stat64
+#else
+# define struct_stat64 struct stat
+# define __gen_tempname gen_tempname
+# define __getpid getpid
+# define __gettimeofday gettimeofday
+# define __mkdir mkdir
+# define __open open
+# define __open64 open
+# define __lxstat64(version, file, buf) lstat (file, buf)
+# define __xstat64(version, file, buf) stat (file, buf)
+#endif
+
+#if ! (HAVE___SECURE_GETENV || _LIBC)
+# define __secure_getenv getenv
+#endif
+
+#ifdef _LIBC
+# include <hp-timing.h>
+# if HP_TIMING_AVAIL
+# define RANDOM_BITS(Var) \
+ if (__builtin_expect (value == UINT64_C (0), 0)) \
+ { \
+ /* If this is the first time this function is used initialize \
+ the variable we accumulate the value in to some somewhat \
+ random value. If we'd not do this programs at startup time \
+ might have a reduced set of possible names, at least on slow \
+ machines. */ \
+ struct timeval tv; \
+ __gettimeofday (&tv, NULL); \
+ value = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; \
+ } \
+ HP_TIMING_NOW (Var)
+# endif
+#endif
+
+/* Use the widest available unsigned type if uint64_t is not
+ available. The algorithm below extracts a number less than 62**6
+ (approximately 2**35.725) from uint64_t, so ancient hosts where
+ uintmax_t is only 32 bits lose about 3.725 bits of randomness,
+ which is better than not having mkstemp at all. */
+#if !defined UINT64_MAX && !defined uint64_t
+# define uint64_t uintmax_t
+#endif
+
+#if _LIBC
+/* Return nonzero if DIR is an existent directory. */
+static int
+direxists (const char *dir)
+{
+ struct_stat64 buf;
+ return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+}
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+int
+__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
+ int try_tmpdir)
+{
+ const char *d;
+ size_t dlen, plen;
+
+ if (!pfx || !pfx[0])
+ {
+ pfx = "file";
+ plen = 4;
+ }
+ else
+ {
+ plen = strlen (pfx);
+ if (plen > 5)
+ plen = 5;
+ }
+
+ if (try_tmpdir)
+ {
+ d = __secure_getenv ("TMPDIR");
+ if (d != NULL && direxists (d))
+ dir = d;
+ else if (dir != NULL && direxists (dir))
+ /* nothing */ ;
+ else
+ dir = NULL;
+ }
+ if (dir == NULL)
+ {
+ if (direxists (P_tmpdir))
+ dir = P_tmpdir;
+ else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
+ dir = "/tmp";
+ else
+ {
+ __set_errno (ENOENT);
+ return -1;
+ }
+ }
+
+ dlen = strlen (dir);
+ while (dlen > 1 && dir[dlen - 1] == '/')
+ dlen--; /* remove trailing slashes */
+
+ /* check we have room for "${dir}/${pfx}XXXXXX\0" */
+ if (tmpl_len < dlen + 1 + plen + 6 + 1)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx);
+ return 0;
+}
+#endif /* _LIBC */
+
+/* These are the characters used in temporary file names. */
+static const char letters[] =
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
+ The name constructed does not exist at the time of the call to
+ __gen_tempname. TMPL is overwritten with the result.
+
+ KIND may be one of:
+ __GT_NOCREATE: simply verify that the name does not exist
+ at the time of the call.
+ __GT_FILE: create the file using open(O_CREAT|O_EXCL)
+ and return a read-write fd. The file is mode 0600.
+ __GT_DIR: create a directory, which will be mode 0700.
+
+ We use a clever algorithm to get hard-to-predict names. */
+int
+__gen_tempname (char *tmpl, int suffixlen, int flags, int kind)
+{
+ int len;
+ char *XXXXXX;
+ static uint64_t value;
+ uint64_t random_time_bits;
+ unsigned int count;
+ int fd = -1;
+ int save_errno = errno;
+ struct_stat64 st;
+
+ /* A lower bound on the number of temporary files to attempt to
+ generate. The maximum total number of temporary file names that
+ can exist for a given template is 62**6. It should never be
+ necessary to try all these combinations. Instead if a reasonable
+ number of names is tried (we define reasonable as 62**3) fail to
+ give the system administrator the chance to remove the problems. */
+#define ATTEMPTS_MIN (62 * 62 * 62)
+
+ /* The number of times to attempt to generate a temporary file. To
+ conform to POSIX, this must be no smaller than TMP_MAX. */
+#if ATTEMPTS_MIN < TMP_MAX
+ unsigned int attempts = TMP_MAX;
+#else
+ unsigned int attempts = ATTEMPTS_MIN;
+#endif
+
+ len = strlen (tmpl);
+ if (len < 6 + suffixlen || memcmp (&tmpl[len - 6 - suffixlen], "XXXXXX", 6))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ /* This is where the Xs start. */
+ XXXXXX = &tmpl[len - 6 - suffixlen];
+
+ /* Get some more or less random data. */
+#ifdef RANDOM_BITS
+ RANDOM_BITS (random_time_bits);
+#else
+ {
+ struct timeval tv;
+ __gettimeofday (&tv, NULL);
+ random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
+ }
+#endif
+ value += random_time_bits ^ __getpid ();
+
+ for (count = 0; count < attempts; value += 7777, ++count)
+ {
+ uint64_t v = value;
+
+ /* Fill in the random bits. */
+ XXXXXX[0] = letters[v % 62];
+ v /= 62;
+ XXXXXX[1] = letters[v % 62];
+ v /= 62;
+ XXXXXX[2] = letters[v % 62];
+ v /= 62;
+ XXXXXX[3] = letters[v % 62];
+ v /= 62;
+ XXXXXX[4] = letters[v % 62];
+ v /= 62;
+ XXXXXX[5] = letters[v % 62];
+
+ switch (kind)
+ {
+ case __GT_FILE:
+ fd = __open (tmpl,
+ (flags & ~O_ACCMODE)
+ | O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ break;
+
+ case __GT_DIR:
+ fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
+ break;
+
+ case __GT_NOCREATE:
+ /* This case is backward from the other three. __gen_tempname
+ succeeds if __xstat fails because the name does not exist.
+ Note the continue to bypass the common logic at the bottom
+ of the loop. */
+ if (__lxstat64 (_STAT_VER, tmpl, &st) < 0)
+ {
+ if (errno == ENOENT)
+ {
+ __set_errno (save_errno);
+ return 0;
+ }
+ else
+ /* Give up now. */
+ return -1;
+ }
+ continue;
+
+ default:
+ assert (! "invalid KIND in __gen_tempname");
+ abort ();
+ }
+
+ if (fd >= 0)
+ {
+ __set_errno (save_errno);
+ return fd;
+ }
+ else if (errno != EEXIST)
+ return -1;
+ }
+
+ /* We got out of the loop because we ran out of combinations to try. */
+ __set_errno (EEXIST);
+ return -1;
+}
diff --git a/gnulib/lib/tempname.h b/gnulib/lib/tempname.h
new file mode 100644
index 00000000..349bc362
--- /dev/null
+++ b/gnulib/lib/tempname.h
@@ -0,0 +1,50 @@
+/* Create a temporary file or directory.
+
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* header written by Eric Blake */
+
+#ifndef GL_TEMPNAME_H
+# define GL_TEMPNAME_H
+
+# include <stdio.h>
+
+# ifdef __GT_FILE
+# define GT_FILE __GT_FILE
+# define GT_DIR __GT_DIR
+# define GT_NOCREATE __GT_NOCREATE
+# else
+# define GT_FILE 0
+# define GT_DIR 1
+# define GT_NOCREATE 2
+# endif
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
+ The name constructed does not exist at the time of the call to
+ gen_tempname. TMPL is overwritten with the result.
+
+ KIND may be one of:
+ GT_NOCREATE: simply verify that the name does not exist
+ at the time of the call.
+ GT_FILE: create a large file using open(O_CREAT|O_EXCL)
+ and return a read-write fd. The file is mode 0600.
+ GT_DIR: create a directory, which will be mode 0700.
+
+ We use a clever algorithm to get hard-to-predict names. */
+extern int gen_tempname (char *tmpl, int suffixlen, int flags, int kind);
+
+#endif /* GL_TEMPNAME_H */
diff --git a/gnulib/lib/time.in.h b/gnulib/lib/time.in.h
new file mode 100644
index 00000000..984b0b32
--- /dev/null
+++ b/gnulib/lib/time.in.h
@@ -0,0 +1,134 @@
+/* A more-standard <time.h>.
+
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* Don't get in the way of glibc when it includes time.h merely to
+ declare a few standard symbols, rather than to declare all the
+ symbols. Also, Solaris 8 <time.h> eventually includes itself
+ recursively; if that is happening, just include the system <time.h>
+ without adding our own declarations. */
+#if (defined __need_time_t || defined __need_clock_t \
+ || defined __need_timespec \
+ || defined _GL_TIME_H)
+
+# @INCLUDE_NEXT@ @NEXT_TIME_H@
+
+#else
+
+# define _GL_TIME_H
+
+# @INCLUDE_NEXT@ @NEXT_TIME_H@
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3).
+ Or they define it with the wrong member names or define it in <sys/time.h>
+ (e.g., FreeBSD circa 1997). */
+# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
+# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+# include <sys/time.h>
+# else
+# undef timespec
+# define timespec rpl_timespec
+struct timespec
+{
+ time_t tv_sec;
+ long int tv_nsec;
+};
+# endif
+# endif
+
+/* Sleep for at least RQTP seconds unless interrupted, If interrupted,
+ return -1 and store the remaining time into RMTP. See
+ <http://www.opengroup.org/susv3xsh/nanosleep.html>. */
+# if @REPLACE_NANOSLEEP@
+# define nanosleep rpl_nanosleep
+extern int nanosleep (struct timespec const *__rqtp, struct timespec *__rmtp)
+ _GL_ARG_NONNULL ((1));
+# endif
+
+/* Return the 'time_t' representation of TP and normalize TP. */
+# if @REPLACE_MKTIME@
+# define mktime rpl_mktime
+extern time_t mktime (struct tm *__tp) _GL_ARG_NONNULL ((1));
+# endif
+
+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
+ <http://www.opengroup.org/susv3xsh/localtime_r.html> and
+ <http://www.opengroup.org/susv3xsh/gmtime_r.html>. */
+# if @REPLACE_LOCALTIME_R@
+# undef localtime_r
+# define localtime_r rpl_localtime_r
+# undef gmtime_r
+# define gmtime_r rpl_gmtime_r
+extern struct tm *localtime_r (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2));
+extern struct tm *gmtime_r (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+
+/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store
+ the resulting broken-down time into TM. See
+ <http://www.opengroup.org/susv3xsh/strptime.html>. */
+# if @REPLACE_STRPTIME@
+# undef strptime
+# define strptime rpl_strptime
+extern char *strptime (char const *restrict __buf,
+ char const *restrict __format,
+ struct tm *restrict __tm)
+ _GL_ARG_NONNULL ((1, 2, 3));
+# endif
+
+/* Convert TM to a time_t value, assuming UTC. */
+# if @REPLACE_TIMEGM@
+# undef timegm
+# define timegm rpl_timegm
+extern time_t timegm (struct tm *__tm) _GL_ARG_NONNULL ((1));
+# endif
+
+/* Encourage applications to avoid unsafe functions that can overrun
+ buffers when given outlandish struct tm values. Portable
+ applications should use strftime (or even sprintf) instead. */
+# if GNULIB_PORTCHECK
+# undef asctime
+# define asctime eschew_asctime
+# undef asctime_r
+# define asctime_r eschew_asctime_r
+# undef ctime
+# define ctime eschew_ctime
+# undef ctime_r
+# define ctime_r eschew_ctime_r
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/time_r.c b/gnulib/lib/time_r.c
new file mode 100644
index 00000000..c9032694
--- /dev/null
+++ b/gnulib/lib/time_r.c
@@ -0,0 +1,47 @@
+/* Reentrant time functions like localtime_r.
+
+ Copyright (C) 2003, 2006, 2007, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include <time.h>
+
+#include <string.h>
+
+static struct tm *
+copy_tm_result (struct tm *dest, struct tm const *src)
+{
+ if (! src)
+ return 0;
+ *dest = *src;
+ return dest;
+}
+
+
+struct tm *
+gmtime_r (time_t const * restrict t, struct tm * restrict tp)
+{
+ return copy_tm_result (tp, gmtime (t));
+}
+
+struct tm *
+localtime_r (time_t const * restrict t, struct tm * restrict tp)
+{
+ return copy_tm_result (tp, localtime (t));
+}
diff --git a/gnulib/lib/timegm.c b/gnulib/lib/timegm.c
new file mode 100644
index 00000000..badd39cf
--- /dev/null
+++ b/gnulib/lib/timegm.c
@@ -0,0 +1,39 @@
+/* Convert UTC calendar time to simple time. Like mktime but assumes UTC.
+
+ Copyright (C) 1994, 1997, 2003, 2004, 2006, 2007, 2009, 2010 Free Software
+ Foundation, Inc. This file is part of the GNU C Library.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <time.h>
+
+#ifndef _LIBC
+# undef __gmtime_r
+# define __gmtime_r gmtime_r
+# define __mktime_internal mktime_internal
+# include "mktime-internal.h"
+#endif
+
+time_t
+timegm (struct tm *tmp)
+{
+ static time_t gmtime_offset;
+ tmp->tm_isdst = 0;
+ return __mktime_internal (tmp, __gmtime_r, &gmtime_offset);
+}
diff --git a/gnulib/lib/times.c b/gnulib/lib/times.c
new file mode 100644
index 00000000..65f9c748
--- /dev/null
+++ b/gnulib/lib/times.c
@@ -0,0 +1,67 @@
+/* Get process times
+
+ Copyright (C) 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#include <config.h>
+
+/* Get times prototype. */
+#include <sys/times.h>
+
+/* Get round. */
+#include <math.h>
+
+/* Get GetProcessTimes etc. */
+#include <windows.h>
+
+static clock_t
+filetime2clock (FILETIME time)
+{
+ float f;
+
+ /* We have a 64-bit value, in the form of two DWORDS aka unsigned
+ int, counting the number of 100-nanosecond intervals. We need to
+ convert these to clock ticks. Older POSIX uses CLK_TCK to
+ indicate the number of clock ticks per second while modern POSIX
+ uses sysconf(_SC_CLK_TCK). Mingw32 does not appear to have
+ sysconf(_SC_CLK_TCK), but appears to have CLK_TCK = 1000 so we
+ use it. Note that CLOCKS_PER_SEC constant does not apply here,
+ it is for use with the clock function. */
+
+ f = (unsigned long long) time.dwHighDateTime << 32;
+ f += time.dwLowDateTime;
+ f = f * CLK_TCK / 10000000;
+ return (clock_t) round (f);
+}
+
+clock_t
+times (struct tms * buffer)
+{
+ FILETIME creation_time, exit_time, kernel_time, user_time;
+
+ if (GetProcessTimes (GetCurrentProcess (), &creation_time, &exit_time,
+ &kernel_time, &user_time) == 0)
+ return (clock_t) -1;
+
+ buffer->tms_utime = filetime2clock (user_time);
+ buffer->tms_stime = filetime2clock (kernel_time);
+ buffer->tms_cutime = 0;
+ buffer->tms_cstime = 0;
+
+ return filetime2clock (creation_time);
+}
diff --git a/gnulib/lib/timespec.h b/gnulib/lib/timespec.h
new file mode 100644
index 00000000..81b34230
--- /dev/null
+++ b/gnulib/lib/timespec.h
@@ -0,0 +1,39 @@
+/* timespec -- System time interface
+
+ Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2010 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/>. */
+
+#if ! defined TIMESPEC_H
+# define TIMESPEC_H
+
+# include <time.h>
+
+/* Return negative, zero, positive if A < B, A == B, A > B, respectively.
+ Assume the nanosecond components are in range, or close to it. */
+static inline int
+timespec_cmp (struct timespec a, struct timespec b)
+{
+ return (a.tv_sec < b.tv_sec ? -1
+ : a.tv_sec > b.tv_sec ? 1
+ : a.tv_nsec < b.tv_nsec ? -1
+ : a.tv_nsec > b.tv_nsec ? 1
+ : 0);
+}
+
+void gettime (struct timespec *);
+int settime (struct timespec const *);
+
+#endif
diff --git a/gnulib/lib/tmpdir.c b/gnulib/lib/tmpdir.c
new file mode 100644
index 00000000..0170d213
--- /dev/null
+++ b/gnulib/lib/tmpdir.c
@@ -0,0 +1,133 @@
+/* Copyright (C) 1999, 2001-2002, 2006, 2009-2010 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+/* Extracted from sysdeps/posix/tempname.c. */
+
+#include <config.h>
+
+/* Specification. */
+#include "tmpdir.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <stdio.h>
+#ifndef P_tmpdir
+# define P_tmpdir "/tmp"
+#endif
+
+#include <sys/stat.h>
+
+#if _LIBC
+# define struct_stat64 struct stat64
+#else
+# define struct_stat64 struct stat
+# define __xstat64(version, path, buf) stat (path, buf)
+#endif
+
+#if ! (HAVE___SECURE_GETENV || _LIBC)
+# define __secure_getenv getenv
+#endif
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+#endif
+
+
+/* Return nonzero if DIR is an existent directory. */
+static bool
+direxists (const char *dir)
+{
+ struct_stat64 buf;
+ return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+}
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+int
+path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
+ bool try_tmpdir)
+{
+ const char *d;
+ size_t dlen, plen;
+
+ if (!pfx || !pfx[0])
+ {
+ pfx = "file";
+ plen = 4;
+ }
+ else
+ {
+ plen = strlen (pfx);
+ if (plen > 5)
+ plen = 5;
+ }
+
+ if (try_tmpdir)
+ {
+ d = __secure_getenv ("TMPDIR");
+ if (d != NULL && direxists (d))
+ dir = d;
+ else if (dir != NULL && direxists (dir))
+ /* nothing */ ;
+ else
+ dir = NULL;
+ }
+ if (dir == NULL)
+ {
+ if (direxists (P_tmpdir))
+ dir = P_tmpdir;
+ else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
+ dir = "/tmp";
+ else
+ {
+ __set_errno (ENOENT);
+ return -1;
+ }
+ }
+
+ dlen = strlen (dir);
+ while (dlen >= 1 && ISSLASH (dir[dlen - 1]))
+ dlen--; /* remove trailing slashes */
+
+ /* check we have room for "${dir}/${pfx}XXXXXX\0" */
+ if (tmpl_len < dlen + 1 + plen + 6 + 1)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx);
+ return 0;
+}
diff --git a/gnulib/lib/tmpdir.h b/gnulib/lib/tmpdir.h
new file mode 100644
index 00000000..0cafb5b3
--- /dev/null
+++ b/gnulib/lib/tmpdir.h
@@ -0,0 +1,26 @@
+/* Determine a temporary directory.
+ Copyright (C) 2001-2002, 2009-2010 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/>. */
+
+#include <stdbool.h>
+#include <stddef.h>
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+extern int path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, bool try_tmpdir);
diff --git a/gnulib/lib/tmpfile-safer.c b/gnulib/lib/tmpfile-safer.c
new file mode 100644
index 00000000..bee05bc2
--- /dev/null
+++ b/gnulib/lib/tmpfile-safer.c
@@ -0,0 +1,69 @@
+/* Invoke tmpfile, but avoid some glitches.
+ Copyright (C) 2006, 2009-2010 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/>. */
+
+/* Written by Eric Blake, based on ideas from Paul Eggert. */
+
+#include <config.h>
+
+#include "stdio-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include "unistd-safer.h"
+
+#include "binary-io.h"
+
+/* Like tmpfile, but do not return stdin, stdout, or stderr.
+
+ Remember that tmpfile can leave files behind if your program calls _exit,
+ so this function should not be mixed with the close_stdout module. */
+
+FILE *
+tmpfile_safer (void)
+{
+ FILE *fp = tmpfile ();
+
+ if (fp)
+ {
+ int fd = fileno (fp);
+
+ if (0 <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer (fd);
+
+ if (f < 0)
+ {
+ int e = errno;
+ fclose (fp);
+ errno = e;
+ return NULL;
+ }
+
+ /* Keep the temporary file in binary mode, on platforms
+ where that matters. */
+ if (fclose (fp) != 0
+ || ! (fp = fdopen (f, O_BINARY ? "wb+" : "w+")))
+ {
+ int e = errno;
+ close (f);
+ errno = e;
+ return NULL;
+ }
+ }
+ }
+
+ return fp;
+}
diff --git a/gnulib/lib/tmpfile.c b/gnulib/lib/tmpfile.c
new file mode 100644
index 00000000..f01de3a4
--- /dev/null
+++ b/gnulib/lib/tmpfile.c
@@ -0,0 +1,124 @@
+/* Create a temporary file.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Ben Pfaff. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* This replacement is used only on native Windows platforms. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <io.h>
+
+#define WIN32_LEAN_AND_MEAN /* avoid including junk */
+#include <windows.h>
+
+#include "pathmax.h"
+#include "tempname.h"
+#include "tmpdir.h"
+
+/* On Windows, opening a file with _O_TEMPORARY has the effect of passing
+ the FILE_FLAG_DELETE_ON_CLOSE flag to CreateFile(), which has the effect
+ of deleting the file when it is closed - even when the program crashes.
+ But (according to the Cygwin sources) it works only on Windows NT or newer.
+ So we cache the info whether we are running on Windows NT or newer. */
+
+static bool
+supports_delete_on_close ()
+{
+ static int known; /* 1 = yes, -1 = no, 0 = unknown */
+ if (!known)
+ {
+ OSVERSIONINFO v;
+
+ if (GetVersionEx (&v))
+ known = (v.dwPlatformId == VER_PLATFORM_WIN32_NT ? 1 : -1);
+ else
+ known = -1;
+ }
+ return (known > 0);
+}
+
+FILE *
+tmpfile (void)
+{
+ char dir[PATH_MAX];
+ DWORD retval;
+
+ /* Find Windows temporary file directory.
+ We provide this as the directory argument to path_search because Windows
+ defines P_tmpdir to "\\" and will therefore try to put all temporary files
+ in the root directory (unless $TMPDIR is set). */
+ retval = GetTempPath (PATH_MAX, dir);
+ if (retval > 0 && retval < PATH_MAX)
+ {
+ char xtemplate[PATH_MAX];
+
+ if (path_search (xtemplate, PATH_MAX, dir, NULL, true) >= 0)
+ {
+ size_t len = strlen (xtemplate);
+ int o_temporary = (supports_delete_on_close () ? _O_TEMPORARY : 0);
+ int fd;
+
+ do
+ {
+ memcpy (&xtemplate[len - 6], "XXXXXX", 6);
+ if (gen_tempname (xtemplate, 0, 0, GT_NOCREATE) < 0)
+ {
+ fd = -1;
+ break;
+ }
+
+ fd = _open (xtemplate,
+ _O_CREAT | _O_EXCL | o_temporary
+ | _O_RDWR | _O_BINARY,
+ _S_IREAD | _S_IWRITE);
+ }
+ while (fd < 0 && errno == EEXIST);
+
+ if (fd >= 0)
+ {
+ FILE *fp = _fdopen (fd, "w+b");
+
+ if (fp != NULL)
+ return fp;
+ else
+ {
+ int saved_errno = errno;
+ _close (fd);
+ errno = saved_errno;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (retval > 0)
+ errno = ENAMETOOLONG;
+ else
+ /* Ideally this should translate GetLastError () to an errno value. */
+ errno = ENOENT;
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/trigl.c b/gnulib/lib/trigl.c
new file mode 100644
index 00000000..fbd4815d
--- /dev/null
+++ b/gnulib/lib/trigl.c
@@ -0,0 +1,636 @@
+/* Quad-precision floating point argument reduction.
+ Copyright (C) 1999, 2007, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jj@ultra.linux.cz>
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "trigl.h"
+
+#include <float.h>
+#include <math.h>
+
+/* Table of constants for 2/pi, 5628 hexadecimal digits of 2/pi */
+static const int two_over_pi[] = {
+ 0xa2f983, 0x6e4e44, 0x1529fc, 0x2757d1, 0xf534dd, 0xc0db62,
+ 0x95993c, 0x439041, 0xfe5163, 0xabdebb, 0xc561b7, 0x246e3a,
+ 0x424dd2, 0xe00649, 0x2eea09, 0xd1921c, 0xfe1deb, 0x1cb129,
+ 0xa73ee8, 0x8235f5, 0x2ebb44, 0x84e99c, 0x7026b4, 0x5f7e41,
+ 0x3991d6, 0x398353, 0x39f49c, 0x845f8b, 0xbdf928, 0x3b1ff8,
+ 0x97ffde, 0x05980f, 0xef2f11, 0x8b5a0a, 0x6d1f6d, 0x367ecf,
+ 0x27cb09, 0xb74f46, 0x3f669e, 0x5fea2d, 0x7527ba, 0xc7ebe5,
+ 0xf17b3d, 0x0739f7, 0x8a5292, 0xea6bfb, 0x5fb11f, 0x8d5d08,
+ 0x560330, 0x46fc7b, 0x6babf0, 0xcfbc20, 0x9af436, 0x1da9e3,
+ 0x91615e, 0xe61b08, 0x659985, 0x5f14a0, 0x68408d, 0xffd880,
+ 0x4d7327, 0x310606, 0x1556ca, 0x73a8c9, 0x60e27b, 0xc08c6b,
+ 0x47c419, 0xc367cd, 0xdce809, 0x2a8359, 0xc4768b, 0x961ca6,
+ 0xddaf44, 0xd15719, 0x053ea5, 0xff0705, 0x3f7e33, 0xe832c2,
+ 0xde4f98, 0x327dbb, 0xc33d26, 0xef6b1e, 0x5ef89f, 0x3a1f35,
+ 0xcaf27f, 0x1d87f1, 0x21907c, 0x7c246a, 0xfa6ed5, 0x772d30,
+ 0x433b15, 0xc614b5, 0x9d19c3, 0xc2c4ad, 0x414d2c, 0x5d000c,
+ 0x467d86, 0x2d71e3, 0x9ac69b, 0x006233, 0x7cd2b4, 0x97a7b4,
+ 0xd55537, 0xf63ed7, 0x1810a3, 0xfc764d, 0x2a9d64, 0xabd770,
+ 0xf87c63, 0x57b07a, 0xe71517, 0x5649c0, 0xd9d63b, 0x3884a7,
+ 0xcb2324, 0x778ad6, 0x23545a, 0xb91f00, 0x1b0af1, 0xdfce19,
+ 0xff319f, 0x6a1e66, 0x615799, 0x47fbac, 0xd87f7e, 0xb76522,
+ 0x89e832, 0x60bfe6, 0xcdc4ef, 0x09366c, 0xd43f5d, 0xd7de16,
+ 0xde3b58, 0x929bde, 0x2822d2, 0xe88628, 0x4d58e2, 0x32cac6,
+ 0x16e308, 0xcb7de0, 0x50c017, 0xa71df3, 0x5be018, 0x34132e,
+ 0x621283, 0x014883, 0x5b8ef5, 0x7fb0ad, 0xf2e91e, 0x434a48,
+ 0xd36710, 0xd8ddaa, 0x425fae, 0xce616a, 0xa4280a, 0xb499d3,
+ 0xf2a606, 0x7f775c, 0x83c2a3, 0x883c61, 0x78738a, 0x5a8caf,
+ 0xbdd76f, 0x63a62d, 0xcbbff4, 0xef818d, 0x67c126, 0x45ca55,
+ 0x36d9ca, 0xd2a828, 0x8d61c2, 0x77c912, 0x142604, 0x9b4612,
+ 0xc459c4, 0x44c5c8, 0x91b24d, 0xf31700, 0xad43d4, 0xe54929,
+ 0x10d5fd, 0xfcbe00, 0xcc941e, 0xeece70, 0xf53e13, 0x80f1ec,
+ 0xc3e7b3, 0x28f8c7, 0x940593, 0x3e71c1, 0xb3092e, 0xf3450b,
+ 0x9c1288, 0x7b20ab, 0x9fb52e, 0xc29247, 0x2f327b, 0x6d550c,
+ 0x90a772, 0x1fe76b, 0x96cb31, 0x4a1679, 0xe27941, 0x89dff4,
+ 0x9794e8, 0x84e6e2, 0x973199, 0x6bed88, 0x365f5f, 0x0efdbb,
+ 0xb49a48, 0x6ca467, 0x427271, 0x325d8d, 0xb8159f, 0x09e5bc,
+ 0x25318d, 0x3974f7, 0x1c0530, 0x010c0d, 0x68084b, 0x58ee2c,
+ 0x90aa47, 0x02e774, 0x24d6bd, 0xa67df7, 0x72486e, 0xef169f,
+ 0xa6948e, 0xf691b4, 0x5153d1, 0xf20acf, 0x339820, 0x7e4bf5,
+ 0x6863b2, 0x5f3edd, 0x035d40, 0x7f8985, 0x295255, 0xc06437,
+ 0x10d86d, 0x324832, 0x754c5b, 0xd4714e, 0x6e5445, 0xc1090b,
+ 0x69f52a, 0xd56614, 0x9d0727, 0x50045d, 0xdb3bb4, 0xc576ea,
+ 0x17f987, 0x7d6b49, 0xba271d, 0x296996, 0xacccc6, 0x5414ad,
+ 0x6ae290, 0x89d988, 0x50722c, 0xbea404, 0x940777, 0x7030f3,
+ 0x27fc00, 0xa871ea, 0x49c266, 0x3de064, 0x83dd97, 0x973fa3,
+ 0xfd9443, 0x8c860d, 0xde4131, 0x9d3992, 0x8c70dd, 0xe7b717,
+ 0x3bdf08, 0x2b3715, 0xa0805c, 0x93805a, 0x921110, 0xd8e80f,
+ 0xaf806c, 0x4bffdb, 0x0f9038, 0x761859, 0x15a562, 0xbbcb61,
+ 0xb989c7, 0xbd4010, 0x04f2d2, 0x277549, 0xf6b6eb, 0xbb22db,
+ 0xaa140a, 0x2f2689, 0x768364, 0x333b09, 0x1a940e, 0xaa3a51,
+ 0xc2a31d, 0xaeedaf, 0x12265c, 0x4dc26d, 0x9c7a2d, 0x9756c0,
+ 0x833f03, 0xf6f009, 0x8c402b, 0x99316d, 0x07b439, 0x15200c,
+ 0x5bc3d8, 0xc492f5, 0x4badc6, 0xa5ca4e, 0xcd37a7, 0x36a9e6,
+ 0x9492ab, 0x6842dd, 0xde6319, 0xef8c76, 0x528b68, 0x37dbfc,
+ 0xaba1ae, 0x3115df, 0xa1ae00, 0xdafb0c, 0x664d64, 0xb705ed,
+ 0x306529, 0xbf5657, 0x3aff47, 0xb9f96a, 0xf3be75, 0xdf9328,
+ 0x3080ab, 0xf68c66, 0x15cb04, 0x0622fa, 0x1de4d9, 0xa4b33d,
+ 0x8f1b57, 0x09cd36, 0xe9424e, 0xa4be13, 0xb52333, 0x1aaaf0,
+ 0xa8654f, 0xa5c1d2, 0x0f3f0b, 0xcd785b, 0x76f923, 0x048b7b,
+ 0x721789, 0x53a6c6, 0xe26e6f, 0x00ebef, 0x584a9b, 0xb7dac4,
+ 0xba66aa, 0xcfcf76, 0x1d02d1, 0x2df1b1, 0xc1998c, 0x77adc3,
+ 0xda4886, 0xa05df7, 0xf480c6, 0x2ff0ac, 0x9aecdd, 0xbc5c3f,
+ 0x6dded0, 0x1fc790, 0xb6db2a, 0x3a25a3, 0x9aaf00, 0x9353ad,
+ 0x0457b6, 0xb42d29, 0x7e804b, 0xa707da, 0x0eaa76, 0xa1597b,
+ 0x2a1216, 0x2db7dc, 0xfde5fa, 0xfedb89, 0xfdbe89, 0x6c76e4,
+ 0xfca906, 0x70803e, 0x156e85, 0xff87fd, 0x073e28, 0x336761,
+ 0x86182a, 0xeabd4d, 0xafe7b3, 0x6e6d8f, 0x396795, 0x5bbf31,
+ 0x48d784, 0x16df30, 0x432dc7, 0x356125, 0xce70c9, 0xb8cb30,
+ 0xfd6cbf, 0xa200a4, 0xe46c05, 0xa0dd5a, 0x476f21, 0xd21262,
+ 0x845cb9, 0x496170, 0xe0566b, 0x015299, 0x375550, 0xb7d51e,
+ 0xc4f133, 0x5f6e13, 0xe4305d, 0xa92e85, 0xc3b21d, 0x3632a1,
+ 0xa4b708, 0xd4b1ea, 0x21f716, 0xe4698f, 0x77ff27, 0x80030c,
+ 0x2d408d, 0xa0cd4f, 0x99a520, 0xd3a2b3, 0x0a5d2f, 0x42f9b4,
+ 0xcbda11, 0xd0be7d, 0xc1db9b, 0xbd17ab, 0x81a2ca, 0x5c6a08,
+ 0x17552e, 0x550027, 0xf0147f, 0x8607e1, 0x640b14, 0x8d4196,
+ 0xdebe87, 0x2afdda, 0xb6256b, 0x34897b, 0xfef305, 0x9ebfb9,
+ 0x4f6a68, 0xa82a4a, 0x5ac44f, 0xbcf82d, 0x985ad7, 0x95c7f4,
+ 0x8d4d0d, 0xa63a20, 0x5f57a4, 0xb13f14, 0x953880, 0x0120cc,
+ 0x86dd71, 0xb6dec9, 0xf560bf, 0x11654d, 0x6b0701, 0xacb08c,
+ 0xd0c0b2, 0x485551, 0x0efb1e, 0xc37295, 0x3b06a3, 0x3540c0,
+ 0x7bdc06, 0xcc45e0, 0xfa294e, 0xc8cad6, 0x41f3e8, 0xde647c,
+ 0xd8649b, 0x31bed9, 0xc397a4, 0xd45877, 0xc5e369, 0x13daf0,
+ 0x3c3aba, 0x461846, 0x5f7555, 0xf5bdd2, 0xc6926e, 0x5d2eac,
+ 0xed440e, 0x423e1c, 0x87c461, 0xe9fd29, 0xf3d6e7, 0xca7c22,
+ 0x35916f, 0xc5e008, 0x8dd7ff, 0xe26a6e, 0xc6fdb0, 0xc10893,
+ 0x745d7c, 0xb2ad6b, 0x9d6ecd, 0x7b723e, 0x6a11c6, 0xa9cff7,
+ 0xdf7329, 0xbac9b5, 0x5100b7, 0x0db2e2, 0x24ba74, 0x607de5,
+ 0x8ad874, 0x2c150d, 0x0c1881, 0x94667e, 0x162901, 0x767a9f,
+ 0xbefdfd, 0xef4556, 0x367ed9, 0x13d9ec, 0xb9ba8b, 0xfc97c4,
+ 0x27a831, 0xc36ef1, 0x36c594, 0x56a8d8, 0xb5a8b4, 0x0ecccf,
+ 0x2d8912, 0x34576f, 0x89562c, 0xe3ce99, 0xb920d6, 0xaa5e6b,
+ 0x9c2a3e, 0xcc5f11, 0x4a0bfd, 0xfbf4e1, 0x6d3b8e, 0x2c86e2,
+ 0x84d4e9, 0xa9b4fc, 0xd1eeef, 0xc9352e, 0x61392f, 0x442138,
+ 0xc8d91b, 0x0afc81, 0x6a4afb, 0xd81c2f, 0x84b453, 0x8c994e,
+ 0xcc2254, 0xdc552a, 0xd6c6c0, 0x96190b, 0xb8701a, 0x649569,
+ 0x605a26, 0xee523f, 0x0f117f, 0x11b5f4, 0xf5cbfc, 0x2dbc34,
+ 0xeebc34, 0xcc5de8, 0x605edd, 0x9b8e67, 0xef3392, 0xb817c9,
+ 0x9b5861, 0xbc57e1, 0xc68351, 0x103ed8, 0x4871dd, 0xdd1c2d,
+ 0xa118af, 0x462c21, 0xd7f359, 0x987ad9, 0xc0549e, 0xfa864f,
+ 0xfc0656, 0xae79e5, 0x362289, 0x22ad38, 0xdc9367, 0xaae855,
+ 0x382682, 0x9be7ca, 0xa40d51, 0xb13399, 0x0ed7a9, 0x480569,
+ 0xf0b265, 0xa7887f, 0x974c88, 0x36d1f9, 0xb39221, 0x4a827b,
+ 0x21cf98, 0xdc9f40, 0x5547dc, 0x3a74e1, 0x42eb67, 0xdf9dfe,
+ 0x5fd45e, 0xa4677b, 0x7aacba, 0xa2f655, 0x23882b, 0x55ba41,
+ 0x086e59, 0x862a21, 0x834739, 0xe6e389, 0xd49ee5, 0x40fb49,
+ 0xe956ff, 0xca0f1c, 0x8a59c5, 0x2bfa94, 0xc5c1d3, 0xcfc50f,
+ 0xae5adb, 0x86c547, 0x624385, 0x3b8621, 0x94792c, 0x876110,
+ 0x7b4c2a, 0x1a2c80, 0x12bf43, 0x902688, 0x893c78, 0xe4c4a8,
+ 0x7bdbe5, 0xc23ac4, 0xeaf426, 0x8a67f7, 0xbf920d, 0x2ba365,
+ 0xb1933d, 0x0b7cbd, 0xdc51a4, 0x63dd27, 0xdde169, 0x19949a,
+ 0x9529a8, 0x28ce68, 0xb4ed09, 0x209f44, 0xca984e, 0x638270,
+ 0x237c7e, 0x32b90f, 0x8ef5a7, 0xe75614, 0x08f121, 0x2a9db5,
+ 0x4d7e6f, 0x5119a5, 0xabf9b5, 0xd6df82, 0x61dd96, 0x023616,
+ 0x9f3ac4, 0xa1a283, 0x6ded72, 0x7a8d39, 0xa9b882, 0x5c326b,
+ 0x5b2746, 0xed3400, 0x7700d2, 0x55f4fc, 0x4d5901, 0x8071e0,
+ 0xe13f89, 0xb295f3, 0x64a8f1, 0xaea74b, 0x38fc4c, 0xeab2bb,
+ 0x47270b, 0xabc3a7, 0x34ba60, 0x52dd34, 0xf8563a, 0xeb7e8a,
+ 0x31bb36, 0x5895b7, 0x47f7a9, 0x94c3aa, 0xd39225, 0x1e7f3e,
+ 0xd8974e, 0xbba94f, 0xd8ae01, 0xe661b4, 0x393d8e, 0xa523aa,
+ 0x33068e, 0x1633b5, 0x3bb188, 0x1d3a9d, 0x4013d0, 0xcc1be5,
+ 0xf862e7, 0x3bf28f, 0x39b5bf, 0x0bc235, 0x22747e, 0xa247c0,
+ 0xd52d1f, 0x19add3, 0x9094df, 0x9311d0, 0xb42b25, 0x496db2,
+ 0xe264b2, 0x5ef135, 0x3bc6a4, 0x1a4ad0, 0xaac92e, 0x64e886,
+ 0x573091, 0x982cfb, 0x311b1a, 0x08728b, 0xbdcee1, 0x60e142,
+ 0xeb641d, 0xd0bba3, 0xe559d4, 0x597b8c, 0x2a4483, 0xf332ba,
+ 0xf84867, 0x2c8d1b, 0x2fa9b0, 0x50f3dd, 0xf9f573, 0xdb61b4,
+ 0xfe233e, 0x6c41a6, 0xeea318, 0x775a26, 0xbc5e5c, 0xcea708,
+ 0x94dc57, 0xe20196, 0xf1e839, 0xbe4851, 0x5d2d2f, 0x4e9555,
+ 0xd96ec2, 0xe7d755, 0x6304e0, 0xc02e0e, 0xfc40a0, 0xbbf9b3,
+ 0x7125a7, 0x222dfb, 0xf619d8, 0x838c1c, 0x6619e6, 0xb20d55,
+ 0xbb5137, 0x79e809, 0xaf9149, 0x0d73de, 0x0b0da5, 0xce7f58,
+ 0xac1934, 0x724667, 0x7a1a13, 0x9e26bc, 0x4555e7, 0x585cb5,
+ 0x711d14, 0x486991, 0x480d60, 0x56adab, 0xd62f64, 0x96ee0c,
+ 0x212ff3, 0x5d6d88, 0xa67684, 0x95651e, 0xab9e0a, 0x4ddefe,
+ 0x571010, 0x836a39, 0xf8ea31, 0x9e381d, 0xeac8b1, 0xcac96b,
+ 0x37f21e, 0xd505e9, 0x984743, 0x9fc56c, 0x0331b7, 0x3b8bf8,
+ 0x86e56a, 0x8dc343, 0x6230e7, 0x93cfd5, 0x6a8f2d, 0x733005,
+ 0x1af021, 0xa09fcb, 0x7415a1, 0xd56b23, 0x6ff725, 0x2f4bc7,
+ 0xb8a591, 0x7fac59, 0x5c55de, 0x212c38, 0xb13296, 0x5cff50,
+ 0x366262, 0xfa7b16, 0xf4d9a6, 0x2acfe7, 0xf07403, 0xd4d604,
+ 0x6fd916, 0x31b1bf, 0xcbb450, 0x5bd7c8, 0x0ce194, 0x6bd643,
+ 0x4fd91c, 0xdf4543, 0x5f3453, 0xe2b5aa, 0xc9aec8, 0x131485,
+ 0xf9d2bf, 0xbadb9e, 0x76f5b9, 0xaf15cf, 0xca3182, 0x14b56d,
+ 0xe9fe4d, 0x50fc35, 0xf5aed5, 0xa2d0c1, 0xc96057, 0x192eb6,
+ 0xe91d92, 0x07d144, 0xaea3c6, 0x343566, 0x26d5b4, 0x3161e2,
+ 0x37f1a2, 0x209eff, 0x958e23, 0x493798, 0x35f4a6, 0x4bdc02,
+ 0xc2be13, 0xbe80a0, 0x0b72a3, 0x115c5f, 0x1e1bd1, 0x0db4d3,
+ 0x869e85, 0x96976b, 0x2ac91f, 0x8a26c2, 0x3070f0, 0x041412,
+ 0xfc9fa5, 0xf72a38, 0x9c6878, 0xe2aa76, 0x50cfe1, 0x559274,
+ 0x934e38, 0x0a92f7, 0x5533f0, 0xa63db4, 0x399971, 0xe2b755,
+ 0xa98a7c, 0x008f19, 0xac54d2, 0x2ea0b4, 0xf5f3e0, 0x60c849,
+ 0xffd269, 0xae52ce, 0x7a5fdd, 0xe9ce06, 0xfb0ae8, 0xa50cce,
+ 0xea9d3e, 0x3766dd, 0xb834f5, 0x0da090, 0x846f88, 0x4ae3d5,
+ 0x099a03, 0x2eae2d, 0xfcb40a, 0xfb9b33, 0xe281dd, 0x1b16ba,
+ 0xd8c0af, 0xd96b97, 0xb52dc9, 0x9c277f, 0x5951d5, 0x21ccd6,
+ 0xb6496b, 0x584562, 0xb3baf2, 0xa1a5c4, 0x7ca2cf, 0xa9b93d,
+ 0x7b7b89, 0x483d38,
+};
+
+static const long double c[] = {
+/* 93 bits of pi/2 */
+#define PI_2_1 c[0]
+ 1.57079632679489661923132169155131424e+00L, /* 3fff921fb54442d18469898cc5100000 */
+
+/* pi/2 - PI_2_1 */
+#define PI_2_1t c[1]
+ 8.84372056613570112025531863263659260e-29L, /* 3fa1c06e0e68948127044533e63a0106 */
+};
+
+static int kernel_rem_pio2 (double *x, double *y, int e0, int nx, int prec,
+ const int *ipio2);
+
+int
+ieee754_rem_pio2l (long double x, long double *y)
+{
+ long double z, w, t;
+ double tx[8];
+ int exp, n;
+
+ if (x >= -0.78539816339744830961566084581987572104929234984377
+ && x <= 0.78539816339744830961566084581987572104929234984377)
+ /* x in <-pi/4, pi/4> */
+ {
+ y[0] = x;
+ y[1] = 0;
+ return 0;
+ }
+
+ if (x > 0 && x < 2.35619449019234492884698253745962716314787704953131)
+ {
+ /* 113 + 93 bit PI is ok */
+ z = x - PI_2_1;
+ y[0] = z - PI_2_1t;
+ y[1] = (z - y[0]) - PI_2_1t;
+ return 1;
+ }
+
+ if (x < 0 && x > -2.35619449019234492884698253745962716314787704953131)
+ {
+ /* 113 + 93 bit PI is ok */
+ z = x + PI_2_1;
+ y[0] = z + PI_2_1t;
+ y[1] = (z - y[0]) + PI_2_1t;
+ return -1;
+ }
+
+ if (x + x == x) /* x is ±oo */
+ {
+ y[0] = x - x;
+ y[1] = y[0];
+ return 0;
+ }
+
+ /* Handle large arguments.
+ We split the 113 bits of the mantissa into 5 24bit integers
+ stored in a double array. */
+ z = frexp (x, &exp);
+ tx[0] = floorl (z *= 16777216.0);
+ z -= tx[0];
+ tx[1] = floorl (z *= 16777216.0);
+ z -= tx[1];
+ tx[2] = floorl (z *= 16777216.0);
+ z -= tx[2];
+ tx[3] = floorl (z *= 16777216.0);
+ z -= tx[3];
+ tx[4] = floorl (z *= 16777216.0);
+
+ n = kernel_rem_pio2 (tx, tx + 5, exp - 24, tx[4] ? 5 : 4, 3, two_over_pi);
+
+ /* The result is now stored in 3 double values, we need to convert it into
+ two long double values. */
+ t = (long double) tx[6] + (long double) tx[7];
+ w = (long double) tx[5];
+
+ if (x > 0)
+ {
+ y[0] = w + t;
+ y[1] = t - (y[0] - w);
+ return n;
+ }
+ else
+ {
+ y[0] = -(w + t);
+ y[1] = -t - (y[0] + w);
+ return -n;
+ }
+}
+
+/* @(#)k_rem_pio2.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] =
+ "$NetBSD: k_rem_pio2.c,v 1.7 1995/05/10 20:46:25 jtc Exp $";
+#endif
+
+/*
+ * kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
+ * double x[],y[]; int e0,nx,prec; int ipio2[];
+ *
+ * kernel_rem_pio2 return the last three digits of N with
+ * y = x - N*pi/2
+ * so that |y| < pi/2.
+ *
+ * The method is to compute the integer (mod 8) and fraction parts of
+ * (2/pi)*x without doing the full multiplication. In general we
+ * skip the part of the product that are known to be a huge integer (
+ * more accurately, = 0 mod 8 ). Thus the number of operations are
+ * independent of the exponent of the input.
+ *
+ * (2/pi) is represented by an array of 24-bit integers in ipio2[].
+ *
+ * Input parameters:
+ * x[] The input value (must be positive) is broken into nx
+ * pieces of 24-bit integers in double precision format.
+ * x[i] will be the i-th 24 bit of x. The scaled exponent
+ * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
+ * match x's up to 24 bits.
+ *
+ * Example of breaking a double positive z into x[0]+x[1]+x[2]:
+ * e0 = ilogb(z)-23
+ * z = scalbn(z,-e0)
+ * for i = 0,1,2
+ * x[i] = floor(z)
+ * z = (z-x[i])*2**24
+ *
+ *
+ * y[] ouput result in an array of double precision numbers.
+ * The dimension of y[] is:
+ * 24-bit precision 1
+ * 53-bit precision 2
+ * 64-bit precision 2
+ * 113-bit precision 3
+ * The actual value is the sum of them. Thus for 113-bit
+ * precision, one may have to do something like:
+ *
+ * long double t,w,r_head, r_tail;
+ * t = (long double)y[2] + (long double)y[1];
+ * w = (long double)y[0];
+ * r_head = t+w;
+ * r_tail = w - (r_head - t);
+ *
+ * e0 The exponent of x[0]
+ *
+ * nx dimension of x[]
+ *
+ * prec an integer indicating the precision:
+ * 0 24 bits (single)
+ * 1 53 bits (double)
+ * 2 64 bits (extended)
+ * 3 113 bits (quad)
+ *
+ * ipio2[]
+ * integer array, contains the (24*i)-th to (24*i+23)-th
+ * bit of 2/pi after binary point. The corresponding
+ * floating value is
+ *
+ * ipio2[i] * 2^(-24(i+1)).
+ *
+ * External function:
+ * double scalbn(), floor();
+ *
+ *
+ * Here is the description of some local variables:
+ *
+ * jk jk+1 is the initial number of terms of ipio2[] needed
+ * in the computation. The recommended value is 2,3,4,
+ * 6 for single, double, extended,and quad.
+ *
+ * jz local integer variable indicating the number of
+ * terms of ipio2[] used.
+ *
+ * jx nx - 1
+ *
+ * jv index for pointing to the suitable ipio2[] for the
+ * computation. In general, we want
+ * ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
+ * is an integer. Thus
+ * e0-3-24*jv >= 0 or (e0-3)/24 >= jv
+ * Hence jv = max(0,(e0-3)/24).
+ *
+ * jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
+ *
+ * q[] double array with integral value, representing the
+ * 24-bits chunk of the product of x and 2/pi.
+ *
+ * q0 the corresponding exponent of q[0]. Note that the
+ * exponent for q[i] would be q0-24*i.
+ *
+ * PIo2[] double precision array, obtained by cutting pi/2
+ * into 24 bits chunks.
+ *
+ * f[] ipio2[] in floating point
+ *
+ * iq[] integer array by breaking up q[] in 24-bits chunk.
+ *
+ * fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
+ *
+ * ih integer. If >0 it indicates q[] is >= 0.5, hence
+ * it also indicates the *sign* of the result.
+ *
+ */
+
+
+/*
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+static const int init_jk[] = { 2, 3, 4, 6 }; /* initial value for jk */
+static const double PIo2[] = {
+ 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
+ 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
+ 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
+ 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
+ 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
+ 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
+ 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
+ 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
+};
+
+static const double zero = 0.0, one = 1.0, two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
+ twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
+
+static int
+kernel_rem_pio2 (double *x, double *y, int e0, int nx, int prec,
+ const int *ipio2)
+{
+ int jz, jx, jv, jp, jk, carry, n, iq[20], i, j, k, m, q0, ih;
+ double z, fw, f[20], fq[20], q[20];
+
+ /* initialize jk */
+ jk = init_jk[prec];
+ jp = jk;
+
+ /* determine jx,jv,q0, note that 3>q0 */
+ jx = nx - 1;
+ jv = (e0 - 3) / 24;
+ if (jv < 0)
+ jv = 0;
+ q0 = e0 - 24 * (jv + 1);
+
+ /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
+ j = jv - jx;
+ m = jx + jk;
+ for (i = 0; i <= m; i++, j++)
+ f[i] = (j < 0) ? zero : (double) ipio2[j];
+
+ /* compute q[0],q[1],...q[jk] */
+ for (i = 0; i <= jk; i++)
+ {
+ for (j = 0, fw = 0.0; j <= jx; j++)
+ fw += x[j] * f[jx + i - j];
+ q[i] = fw;
+ }
+
+ jz = jk;
+recompute:
+ /* distill q[] into iq[] reversingly */
+ for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--)
+ {
+ fw = (double) ((int) (twon24 * z));
+ iq[i] = (int) (z - two24 * fw);
+ z = q[j - 1] + fw;
+ }
+
+ /* compute n */
+ z = ldexp (z, q0); /* actual value of z */
+ z -= 8.0 * floor (z * 0.125); /* trim off integer >= 8 */
+ n = (int) z;
+ z -= (double) n;
+ ih = 0;
+ if (q0 > 0)
+ { /* need iq[jz-1] to determine n */
+ i = (iq[jz - 1] >> (24 - q0));
+ n += i;
+ iq[jz - 1] -= i << (24 - q0);
+ ih = iq[jz - 1] >> (23 - q0);
+ }
+ else if (q0 == 0)
+ ih = iq[jz - 1] >> 23;
+ else if (z >= 0.5)
+ ih = 2;
+
+ if (ih > 0)
+ { /* q > 0.5 */
+ n += 1;
+ carry = 0;
+ for (i = 0; i < jz; i++)
+ { /* compute 1-q */
+ j = iq[i];
+ if (carry == 0)
+ {
+ if (j != 0)
+ {
+ carry = 1;
+ iq[i] = 0x1000000 - j;
+ }
+ }
+ else
+ iq[i] = 0xffffff - j;
+ }
+ if (q0 > 0)
+ { /* rare case: chance is 1 in 12 */
+ switch (q0)
+ {
+ case 1:
+ iq[jz - 1] &= 0x7fffff;
+ break;
+ case 2:
+ iq[jz - 1] &= 0x3fffff;
+ break;
+ }
+ }
+ if (ih == 2)
+ {
+ z = one - z;
+ if (carry != 0)
+ z -= ldexp (one, q0);
+ }
+ }
+
+ /* check if recomputation is needed */
+ if (z == zero)
+ {
+ j = 0;
+ for (i = jz - 1; i >= jk; i--)
+ j |= iq[i];
+ if (j == 0)
+ { /* need recomputation */
+ for (k = 1; iq[jk - k] == 0; k++); /* k = no. of terms needed */
+
+ for (i = jz + 1; i <= jz + k; i++)
+ { /* add q[jz+1] to q[jz+k] */
+ f[jx + i] = (double) ipio2[jv + i];
+ for (j = 0, fw = 0.0; j <= jx; j++)
+ fw += x[j] * f[jx + i - j];
+ q[i] = fw;
+ }
+ jz += k;
+ goto recompute;
+ }
+ }
+
+ /* chop off zero terms */
+ if (z == 0.0)
+ {
+ jz -= 1;
+ q0 -= 24;
+ while (iq[jz] == 0)
+ {
+ jz--;
+ q0 -= 24;
+ }
+ }
+ else
+ { /* break z into 24-bit if necessary */
+ z = ldexp (z, -q0);
+ if (z >= two24)
+ {
+ fw = (double) ((int) (twon24 * z));
+ iq[jz] = (int) (z - two24 * fw);
+ jz += 1;
+ q0 += 24;
+ iq[jz] = (int) fw;
+ }
+ else
+ iq[jz] = (int) z;
+ }
+
+ /* convert integer "bit" chunk to floating-point value */
+ fw = ldexp (one, q0);
+ for (i = jz; i >= 0; i--)
+ {
+ q[i] = fw * (double) iq[i];
+ fw *= twon24;
+ }
+
+ /* compute PIo2[0,...,jp]*q[jz,...,0] */
+ for (i = jz; i >= 0; i--)
+ {
+ for (fw = 0.0, k = 0; k <= jp && k <= jz - i; k++)
+ fw += PIo2[k] * q[i + k];
+ fq[jz - i] = fw;
+ }
+
+ /* compress fq[] into y[] */
+ switch (prec)
+ {
+ case 0:
+ fw = 0.0;
+ for (i = jz; i >= 0; i--)
+ fw += fq[i];
+ y[0] = (ih == 0) ? fw : -fw;
+ break;
+ case 1:
+ case 2:
+ fw = 0.0;
+ for (i = jz; i >= 0; i--)
+ fw += fq[i];
+ y[0] = (ih == 0) ? fw : -fw;
+ fw = fq[0] - fw;
+ for (i = 1; i <= jz; i++)
+ fw += fq[i];
+ y[1] = (ih == 0) ? fw : -fw;
+ break;
+ case 3: /* painful */
+ for (i = jz; i > 0; i--)
+ {
+ fw = fq[i - 1] + fq[i];
+ fq[i] += fq[i - 1] - fw;
+ fq[i - 1] = fw;
+ }
+ for (i = jz; i > 1; i--)
+ {
+ fw = fq[i - 1] + fq[i];
+ fq[i] += fq[i - 1] - fw;
+ fq[i - 1] = fw;
+ }
+ for (fw = 0.0, i = jz; i >= 2; i--)
+ fw += fq[i];
+ if (ih == 0)
+ {
+ y[0] = fq[0];
+ y[1] = fq[1];
+ y[2] = fw;
+ }
+ else
+ {
+ y[0] = -fq[0];
+ y[1] = -fq[1];
+ y[2] = -fw;
+ }
+ }
+ return n & 7;
+}
diff --git a/gnulib/lib/trigl.h b/gnulib/lib/trigl.h
new file mode 100644
index 00000000..a3841bf4
--- /dev/null
+++ b/gnulib/lib/trigl.h
@@ -0,0 +1,24 @@
+/* Declarations for sinl, cosl, tanl internal functions
+ Contributed by Paolo Bonzini
+
+ Copyright 2002, 2003, 2009, 2010 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ 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/>. */
+
+extern int ieee754_rem_pio2l (long double x, long double *y);
+extern long double kernel_sinl (long double x, long double y, int iy);
+extern long double kernel_cosl (long double x, long double y);
+
diff --git a/gnulib/lib/trim.c b/gnulib/lib/trim.c
new file mode 100644
index 00000000..62f8ebff
--- /dev/null
+++ b/gnulib/lib/trim.c
@@ -0,0 +1,133 @@
+/* Removes leading and/or trailing whitespaces
+ Copyright (C) 2006-2010 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/>. */
+
+/* Written by Davide Angelocola <davide.angelocola@gmail.com> */
+
+#include <config.h>
+
+/* Specification. */
+#include "trim.h"
+
+#include <ctype.h>
+#include <string.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "mbchar.h"
+#include "mbiter.h"
+#include "xalloc.h"
+
+/* Use this to suppress gcc's `...may be used before initialized' warnings. */
+#ifdef lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+char *
+trim2(const char *s, int how)
+{
+ char *d;
+
+ d = strdup(s);
+
+ if (!d)
+ xalloc_die();
+
+ if (MB_CUR_MAX > 1)
+ {
+ mbi_iterator_t i;
+
+ /* Trim leading whitespaces. */
+ if (how != TRIM_TRAILING)
+ {
+ mbi_init (i, d, strlen (d));
+
+ for (; mbi_avail (i) && mb_isspace (mbi_cur (i)); mbi_advance (i))
+ ;
+
+ memmove (d, mbi_cur_ptr (i), strlen (mbi_cur_ptr (i)) + 1);
+ }
+
+ /* Trim trailing whitespaces. */
+ if (how != TRIM_LEADING)
+ {
+ int state = 0;
+ char *r IF_LINT (= NULL); /* used only while state = 2 */
+
+ mbi_init (i, d, strlen (d));
+
+ for (; mbi_avail (i); mbi_advance (i))
+ {
+ if (state == 0 && mb_isspace (mbi_cur (i)))
+ {
+ state = 0;
+ continue;
+ }
+
+ if (state == 0 && !mb_isspace (mbi_cur (i)))
+ {
+ state = 1;
+ continue;
+ }
+
+ if (state == 1 && !mb_isspace (mbi_cur (i)))
+ {
+ state = 1;
+ continue;
+ }
+
+ if (state == 1 && mb_isspace (mbi_cur (i)))
+ {
+ state = 2;
+ r = (char *) mbi_cur_ptr (i);
+ }
+ else if (state == 2 && mb_isspace (mbi_cur (i)))
+ {
+ state = 2;
+ }
+ else
+ {
+ state = 1;
+ }
+ }
+
+ if (state == 2)
+ *r = '\0';
+ }
+ }
+ else
+ {
+ char *p;
+
+ /* Trim leading whitespaces. */
+ if (how != TRIM_TRAILING) {
+ for (p = d; *p && isspace ((unsigned char) *p); p++)
+ ;
+
+ memmove (d, p, strlen (p) + 1);
+ }
+
+ /* Trim trailing whitespaces. */
+ if (how != TRIM_LEADING) {
+ for (p = d + strlen (d) - 1; p >= d && isspace ((unsigned char) *p); p--)
+ *p = '\0';
+ }
+ }
+
+ return d;
+}
+
diff --git a/gnulib/lib/trim.h b/gnulib/lib/trim.h
new file mode 100644
index 00000000..c70a16fb
--- /dev/null
+++ b/gnulib/lib/trim.h
@@ -0,0 +1,33 @@
+/* Removes leading and/or trailing whitespaces
+ Copyright (C) 2006, 2009, 2010 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/>. */
+
+/* Written by Davide Angelocola <davide.angelocola@gmail.com> */
+
+/* Trim mode. */
+#define TRIM_TRAILING 0
+#define TRIM_LEADING 1
+#define TRIM_BOTH 2
+
+/* Removes trailing and leading whitespaces. */
+#define trim(s) trim2(s, TRIM_BOTH)
+
+/* Removes trailing whitespaces. */
+#define trim_trailing(s) trim2(s, TRIM_TRAILING)
+
+/* Removes leading whitespaces. */
+#define trim_leading(s) trim2(s, TRIM_LEADING)
+
+char *trim2(const char *, int);
diff --git a/gnulib/lib/trunc.c b/gnulib/lib/trunc.c
new file mode 100644
index 00000000..31e1e77d
--- /dev/null
+++ b/gnulib/lib/trunc.c
@@ -0,0 +1,93 @@
+/* Round towards zero.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC truncl
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC trunc
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC truncf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define L_(literal) literal##f
+#endif
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+FUNC (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
diff --git a/gnulib/lib/truncf.c b/gnulib/lib/truncf.c
new file mode 100644
index 00000000..06b47f9a
--- /dev/null
+++ b/gnulib/lib/truncf.c
@@ -0,0 +1,20 @@
+/* Round towards zero.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "trunc.c"
diff --git a/gnulib/lib/truncl.c b/gnulib/lib/truncl.c
new file mode 100644
index 00000000..a7070139
--- /dev/null
+++ b/gnulib/lib/truncl.c
@@ -0,0 +1,20 @@
+/* Round towards zero.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_LONG_DOUBLE
+#include "trunc.c"
diff --git a/gnulib/lib/tsearch.c b/gnulib/lib/tsearch.c
new file mode 100644
index 00000000..64c0c256
--- /dev/null
+++ b/gnulib/lib/tsearch.c
@@ -0,0 +1,687 @@
+/* Copyright (C) 1995-1997, 2000, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ Contributed by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>, 1997.
+
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@gnu.org.
+
+ 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 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/>. */
+
+/* Tree search for red/black trees.
+ The algorithm for adding nodes is taken from one of the many "Algorithms"
+ books by Robert Sedgewick, although the implementation differs.
+ The algorithm for deleting nodes can probably be found in a book named
+ "Introduction to Algorithms" by Cormen/Leiserson/Rivest. At least that's
+ the book that my professor took most algorithms from during the "Data
+ Structures" course...
+
+ Totally public domain. */
+
+/* Red/black trees are binary trees in which the edges are colored either red
+ or black. They have the following properties:
+ 1. The number of black edges on every path from the root to a leaf is
+ constant.
+ 2. No two red edges are adjacent.
+ Therefore there is an upper bound on the length of every path, it's
+ O(log n) where n is the number of nodes in the tree. No path can be longer
+ than 1+2*P where P is the length of the shortest path in the tree.
+ Useful for the implementation:
+ 3. If one of the children of a node is NULL, then the other one is red
+ (if it exists).
+
+ In the implementation, not the edges are colored, but the nodes. The color
+ interpreted as the color of the edge leading to this node. The color is
+ meaningless for the root node, but we color the root node black for
+ convenience. All added nodes are red initially.
+
+ Adding to a red/black tree is rather easy. The right place is searched
+ with a usual binary tree search. Additionally, whenever a node N is
+ reached that has two red successors, the successors are colored black and
+ the node itself colored red. This moves red edges up the tree where they
+ pose less of a problem once we get to really insert the new node. Changing
+ N's color to red may violate rule 2, however, so rotations may become
+ necessary to restore the invariants. Adding a new red leaf may violate
+ the same rule, so afterwards an additional check is run and the tree
+ possibly rotated.
+
+ Deleting is hairy. There are mainly two nodes involved: the node to be
+ deleted (n1), and another node that is to be unchained from the tree (n2).
+ If n1 has a successor (the node with a smallest key that is larger than
+ n1), then the successor becomes n2 and its contents are copied into n1,
+ otherwise n1 becomes n2.
+ Unchaining a node may violate rule 1: if n2 is black, one subtree is
+ missing one black edge afterwards. The algorithm must try to move this
+ error upwards towards the root, so that the subtree that does not have
+ enough black edges becomes the whole tree. Once that happens, the error
+ has disappeared. It may not be necessary to go all the way up, since it
+ is possible that rotations and recoloring can fix the error before that.
+
+ Although the deletion algorithm must walk upwards through the tree, we
+ do not store parent pointers in the nodes. Instead, delete allocates a
+ small array of parent pointers and fills it while descending the tree.
+ Since we know that the length of a path is O(log n), where n is the number
+ of nodes, this is likely to use less memory. */
+
+/* Tree rotations look like this:
+ A C
+ / \ / \
+ B C A G
+ / \ / \ --> / \
+ D E F G B F
+ / \
+ D E
+
+ In this case, A has been rotated left. This preserves the ordering of the
+ binary tree. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the rootp == NULL tests below. */
+#define _GL_ARG_NONNULL(params)
+
+/* Specification. */
+#ifdef IN_LIBINTL
+# include "tsearch.h"
+#else
+# include <search.h>
+#endif
+
+#include <stdlib.h>
+
+typedef int (*__compar_fn_t) (const void *, const void *);
+typedef void (*__action_fn_t) (const void *, VISIT, int);
+
+#ifndef weak_alias
+# define __tsearch tsearch
+# define __tfind tfind
+# define __tdelete tdelete
+# define __twalk twalk
+#endif
+
+#ifndef internal_function
+/* Inside GNU libc we mark some function in a special way. In other
+ environments simply ignore the marking. */
+# define internal_function
+#endif
+
+typedef struct node_t
+{
+ /* Callers expect this to be the first element in the structure - do not
+ move! */
+ const void *key;
+ struct node_t *left;
+ struct node_t *right;
+ unsigned int red:1;
+} *node;
+typedef const struct node_t *const_node;
+
+#undef DEBUGGING
+
+#ifdef DEBUGGING
+
+/* Routines to check tree invariants. */
+
+#include <assert.h>
+
+#define CHECK_TREE(a) check_tree(a)
+
+static void
+check_tree_recurse (node p, int d_sofar, int d_total)
+{
+ if (p == NULL)
+ {
+ assert (d_sofar == d_total);
+ return;
+ }
+
+ check_tree_recurse (p->left, d_sofar + (p->left && !p->left->red), d_total);
+ check_tree_recurse (p->right, d_sofar + (p->right && !p->right->red), d_total);
+ if (p->left)
+ assert (!(p->left->red && p->red));
+ if (p->right)
+ assert (!(p->right->red && p->red));
+}
+
+static void
+check_tree (node root)
+{
+ int cnt = 0;
+ node p;
+ if (root == NULL)
+ return;
+ root->red = 0;
+ for(p = root->left; p; p = p->left)
+ cnt += !p->red;
+ check_tree_recurse (root, 0, cnt);
+}
+
+
+#else
+
+#define CHECK_TREE(a)
+
+#endif
+
+/* Possibly "split" a node with two red successors, and/or fix up two red
+ edges in a row. ROOTP is a pointer to the lowest node we visited, PARENTP
+ and GPARENTP pointers to its parent/grandparent. P_R and GP_R contain the
+ comparison values that determined which way was taken in the tree to reach
+ ROOTP. MODE is 1 if we need not do the split, but must check for two red
+ edges between GPARENTP and ROOTP. */
+static void
+maybe_split_for_insert (node *rootp, node *parentp, node *gparentp,
+ int p_r, int gp_r, int mode)
+{
+ node root = *rootp;
+ node *rp, *lp;
+ rp = &(*rootp)->right;
+ lp = &(*rootp)->left;
+
+ /* See if we have to split this node (both successors red). */
+ if (mode == 1
+ || ((*rp) != NULL && (*lp) != NULL && (*rp)->red && (*lp)->red))
+ {
+ /* This node becomes red, its successors black. */
+ root->red = 1;
+ if (*rp)
+ (*rp)->red = 0;
+ if (*lp)
+ (*lp)->red = 0;
+
+ /* If the parent of this node is also red, we have to do
+ rotations. */
+ if (parentp != NULL && (*parentp)->red)
+ {
+ node gp = *gparentp;
+ node p = *parentp;
+ /* There are two main cases:
+ 1. The edge types (left or right) of the two red edges differ.
+ 2. Both red edges are of the same type.
+ There exist two symmetries of each case, so there is a total of
+ 4 cases. */
+ if ((p_r > 0) != (gp_r > 0))
+ {
+ /* Put the child at the top of the tree, with its parent
+ and grandparent as successors. */
+ p->red = 1;
+ gp->red = 1;
+ root->red = 0;
+ if (p_r < 0)
+ {
+ /* Child is left of parent. */
+ p->left = *rp;
+ *rp = p;
+ gp->right = *lp;
+ *lp = gp;
+ }
+ else
+ {
+ /* Child is right of parent. */
+ p->right = *lp;
+ *lp = p;
+ gp->left = *rp;
+ *rp = gp;
+ }
+ *gparentp = root;
+ }
+ else
+ {
+ *gparentp = *parentp;
+ /* Parent becomes the top of the tree, grandparent and
+ child are its successors. */
+ p->red = 0;
+ gp->red = 1;
+ if (p_r < 0)
+ {
+ /* Left edges. */
+ gp->left = p->right;
+ p->right = gp;
+ }
+ else
+ {
+ /* Right edges. */
+ gp->right = p->left;
+ p->left = gp;
+ }
+ }
+ }
+ }
+}
+
+/* Find or insert datum into search tree.
+ KEY is the key to be located, ROOTP is the address of tree root,
+ COMPAR the ordering function. */
+void *
+__tsearch (const void *key, void **vrootp, __compar_fn_t compar)
+{
+ node q;
+ node *parentp = NULL, *gparentp = NULL;
+ node *rootp = (node *) vrootp;
+ node *nextp;
+ int r = 0, p_r = 0, gp_r = 0; /* No they might not, Mr Compiler. */
+
+ if (rootp == NULL)
+ return NULL;
+
+ /* This saves some additional tests below. */
+ if (*rootp != NULL)
+ (*rootp)->red = 0;
+
+ CHECK_TREE (*rootp);
+
+ nextp = rootp;
+ while (*nextp != NULL)
+ {
+ node root = *rootp;
+ r = (*compar) (key, root->key);
+ if (r == 0)
+ return root;
+
+ maybe_split_for_insert (rootp, parentp, gparentp, p_r, gp_r, 0);
+ /* If that did any rotations, parentp and gparentp are now garbage.
+ That doesn't matter, because the values they contain are never
+ used again in that case. */
+
+ nextp = r < 0 ? &root->left : &root->right;
+ if (*nextp == NULL)
+ break;
+
+ gparentp = parentp;
+ parentp = rootp;
+ rootp = nextp;
+
+ gp_r = p_r;
+ p_r = r;
+ }
+
+ q = (struct node_t *) malloc (sizeof (struct node_t));
+ if (q != NULL)
+ {
+ *nextp = q; /* link new node to old */
+ q->key = key; /* initialize new node */
+ q->red = 1;
+ q->left = q->right = NULL;
+
+ if (nextp != rootp)
+ /* There may be two red edges in a row now, which we must avoid by
+ rotating the tree. */
+ maybe_split_for_insert (nextp, rootp, parentp, r, p_r, 1);
+ }
+
+ return q;
+}
+#ifdef weak_alias
+weak_alias (__tsearch, tsearch)
+#endif
+
+
+/* Find datum in search tree.
+ KEY is the key to be located, ROOTP is the address of tree root,
+ COMPAR the ordering function. */
+void *
+__tfind (key, vrootp, compar)
+ const void *key;
+ void *const *vrootp;
+ __compar_fn_t compar;
+{
+ node *rootp = (node *) vrootp;
+
+ if (rootp == NULL)
+ return NULL;
+
+ CHECK_TREE (*rootp);
+
+ while (*rootp != NULL)
+ {
+ node root = *rootp;
+ int r;
+
+ r = (*compar) (key, root->key);
+ if (r == 0)
+ return root;
+
+ rootp = r < 0 ? &root->left : &root->right;
+ }
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__tfind, tfind)
+#endif
+
+
+/* Delete node with given key.
+ KEY is the key to be deleted, ROOTP is the address of the root of tree,
+ COMPAR the comparison function. */
+void *
+__tdelete (const void *key, void **vrootp, __compar_fn_t compar)
+{
+ node p, q, r, retval;
+ int cmp;
+ node *rootp = (node *) vrootp;
+ node root, unchained;
+ /* Stack of nodes so we remember the parents without recursion. It's
+ _very_ unlikely that there are paths longer than 40 nodes. The tree
+ would need to have around 250.000 nodes. */
+ int stacksize = 100;
+ int sp = 0;
+ node *nodestack[100];
+
+ if (rootp == NULL)
+ return NULL;
+ p = *rootp;
+ if (p == NULL)
+ return NULL;
+
+ CHECK_TREE (p);
+
+ while ((cmp = (*compar) (key, (*rootp)->key)) != 0)
+ {
+ if (sp == stacksize)
+ abort ();
+
+ nodestack[sp++] = rootp;
+ p = *rootp;
+ rootp = ((cmp < 0)
+ ? &(*rootp)->left
+ : &(*rootp)->right);
+ if (*rootp == NULL)
+ return NULL;
+ }
+
+ /* This is bogus if the node to be deleted is the root... this routine
+ really should return an integer with 0 for success, -1 for failure
+ and errno = ESRCH or something. */
+ retval = p;
+
+ /* We don't unchain the node we want to delete. Instead, we overwrite
+ it with its successor and unchain the successor. If there is no
+ successor, we really unchain the node to be deleted. */
+
+ root = *rootp;
+
+ r = root->right;
+ q = root->left;
+
+ if (q == NULL || r == NULL)
+ unchained = root;
+ else
+ {
+ node *parent = rootp, *up = &root->right;
+ for (;;)
+ {
+ if (sp == stacksize)
+ abort ();
+ nodestack[sp++] = parent;
+ parent = up;
+ if ((*up)->left == NULL)
+ break;
+ up = &(*up)->left;
+ }
+ unchained = *up;
+ }
+
+ /* We know that either the left or right successor of UNCHAINED is NULL.
+ R becomes the other one, it is chained into the parent of UNCHAINED. */
+ r = unchained->left;
+ if (r == NULL)
+ r = unchained->right;
+ if (sp == 0)
+ *rootp = r;
+ else
+ {
+ q = *nodestack[sp-1];
+ if (unchained == q->right)
+ q->right = r;
+ else
+ q->left = r;
+ }
+
+ if (unchained != root)
+ root->key = unchained->key;
+ if (!unchained->red)
+ {
+ /* Now we lost a black edge, which means that the number of black
+ edges on every path is no longer constant. We must balance the
+ tree. */
+ /* NODESTACK now contains all parents of R. R is likely to be NULL
+ in the first iteration. */
+ /* NULL nodes are considered black throughout - this is necessary for
+ correctness. */
+ while (sp > 0 && (r == NULL || !r->red))
+ {
+ node *pp = nodestack[sp - 1];
+ p = *pp;
+ /* Two symmetric cases. */
+ if (r == p->left)
+ {
+ /* Q is R's brother, P is R's parent. The subtree with root
+ R has one black edge less than the subtree with root Q. */
+ q = p->right;
+ if (q->red)
+ {
+ /* If Q is red, we know that P is black. We rotate P left
+ so that Q becomes the top node in the tree, with P below
+ it. P is colored red, Q is colored black.
+ This action does not change the black edge count for any
+ leaf in the tree, but we will be able to recognize one
+ of the following situations, which all require that Q
+ is black. */
+ q->red = 0;
+ p->red = 1;
+ /* Left rotate p. */
+ p->right = q->left;
+ q->left = p;
+ *pp = q;
+ /* Make sure pp is right if the case below tries to use
+ it. */
+ nodestack[sp++] = pp = &q->left;
+ q = p->right;
+ }
+ /* We know that Q can't be NULL here. We also know that Q is
+ black. */
+ if ((q->left == NULL || !q->left->red)
+ && (q->right == NULL || !q->right->red))
+ {
+ /* Q has two black successors. We can simply color Q red.
+ The whole subtree with root P is now missing one black
+ edge. Note that this action can temporarily make the
+ tree invalid (if P is red). But we will exit the loop
+ in that case and set P black, which both makes the tree
+ valid and also makes the black edge count come out
+ right. If P is black, we are at least one step closer
+ to the root and we'll try again the next iteration. */
+ q->red = 1;
+ r = p;
+ }
+ else
+ {
+ /* Q is black, one of Q's successors is red. We can
+ repair the tree with one operation and will exit the
+ loop afterwards. */
+ if (q->right == NULL || !q->right->red)
+ {
+ /* The left one is red. We perform the same action as
+ in maybe_split_for_insert where two red edges are
+ adjacent but point in different directions:
+ Q's left successor (let's call it Q2) becomes the
+ top of the subtree we are looking at, its parent (Q)
+ and grandparent (P) become its successors. The former
+ successors of Q2 are placed below P and Q.
+ P becomes black, and Q2 gets the color that P had.
+ This changes the black edge count only for node R and
+ its successors. */
+ node q2 = q->left;
+ q2->red = p->red;
+ p->right = q2->left;
+ q->left = q2->right;
+ q2->right = q;
+ q2->left = p;
+ *pp = q2;
+ p->red = 0;
+ }
+ else
+ {
+ /* It's the right one. Rotate P left. P becomes black,
+ and Q gets the color that P had. Q's right successor
+ also becomes black. This changes the black edge
+ count only for node R and its successors. */
+ q->red = p->red;
+ p->red = 0;
+
+ q->right->red = 0;
+
+ /* left rotate p */
+ p->right = q->left;
+ q->left = p;
+ *pp = q;
+ }
+
+ /* We're done. */
+ sp = 1;
+ r = NULL;
+ }
+ }
+ else
+ {
+ /* Comments: see above. */
+ q = p->left;
+ if (q->red)
+ {
+ q->red = 0;
+ p->red = 1;
+ p->left = q->right;
+ q->right = p;
+ *pp = q;
+ nodestack[sp++] = pp = &q->right;
+ q = p->left;
+ }
+ if ((q->right == NULL || !q->right->red)
+ && (q->left == NULL || !q->left->red))
+ {
+ q->red = 1;
+ r = p;
+ }
+ else
+ {
+ if (q->left == NULL || !q->left->red)
+ {
+ node q2 = q->right;
+ q2->red = p->red;
+ p->left = q2->right;
+ q->right = q2->left;
+ q2->left = q;
+ q2->right = p;
+ *pp = q2;
+ p->red = 0;
+ }
+ else
+ {
+ q->red = p->red;
+ p->red = 0;
+ q->left->red = 0;
+ p->left = q->right;
+ q->right = p;
+ *pp = q;
+ }
+ sp = 1;
+ r = NULL;
+ }
+ }
+ --sp;
+ }
+ if (r != NULL)
+ r->red = 0;
+ }
+
+ free (unchained);
+ return retval;
+}
+#ifdef weak_alias
+weak_alias (__tdelete, tdelete)
+#endif
+
+
+/* Walk the nodes of a tree.
+ ROOT is the root of the tree to be walked, ACTION the function to be
+ called at each node. LEVEL is the level of ROOT in the whole tree. */
+static void
+internal_function
+trecurse (const void *vroot, __action_fn_t action, int level)
+{
+ const_node root = (const_node) vroot;
+
+ if (root->left == NULL && root->right == NULL)
+ (*action) (root, leaf, level);
+ else
+ {
+ (*action) (root, preorder, level);
+ if (root->left != NULL)
+ trecurse (root->left, action, level + 1);
+ (*action) (root, postorder, level);
+ if (root->right != NULL)
+ trecurse (root->right, action, level + 1);
+ (*action) (root, endorder, level);
+ }
+}
+
+
+/* Walk the nodes of a tree.
+ ROOT is the root of the tree to be walked, ACTION the function to be
+ called at each node. */
+void
+__twalk (const void *vroot, __action_fn_t action)
+{
+ const_node root = (const_node) vroot;
+
+ CHECK_TREE (root);
+
+ if (root != NULL && action != NULL)
+ trecurse (root, action, 0);
+}
+#ifdef weak_alias
+weak_alias (__twalk, twalk)
+#endif
+
+
+#ifdef _LIBC
+
+/* The standardized functions miss an important functionality: the
+ tree cannot be removed easily. We provide a function to do this. */
+static void
+internal_function
+tdestroy_recurse (node root, __free_fn_t freefct)
+{
+ if (root->left != NULL)
+ tdestroy_recurse (root->left, freefct);
+ if (root->right != NULL)
+ tdestroy_recurse (root->right, freefct);
+ (*freefct) ((void *) root->key);
+ /* Free the node itself. */
+ free (root);
+}
+
+void
+__tdestroy (void *vroot, __free_fn_t freefct)
+{
+ node root = (node) vroot;
+
+ CHECK_TREE (root);
+
+ if (root != NULL)
+ tdestroy_recurse (root, freefct);
+}
+weak_alias (__tdestroy, tdestroy)
+
+#endif /* _LIBC */
diff --git a/gnulib/lib/u64.h b/gnulib/lib/u64.h
new file mode 100644
index 00000000..0d35c554
--- /dev/null
+++ b/gnulib/lib/u64.h
@@ -0,0 +1,159 @@
+/* uint64_t-like operations that work even on hosts lacking uint64_t
+
+ Copyright (C) 2006, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stddef.h>
+#include <stdint.h>
+
+/* Return X rotated left by N bits, where 0 < N < 64. */
+#define u64rol(x, n) u64or (u64shl (x, n), u64shr (x, 64 - n))
+
+#ifdef UINT64_MAX
+
+/* Native implementations are trivial. See below for comments on what
+ these operations do. */
+typedef uint64_t u64;
+# define u64hilo(hi, lo) ((u64) (((u64) (hi) << 32) + (lo)))
+# define u64init(hi, lo) u64hilo (hi, lo)
+# define u64lo(x) ((u64) (x))
+# define u64lt(x, y) ((x) < (y))
+# define u64and(x, y) ((x) & (y))
+# define u64or(x, y) ((x) | (y))
+# define u64xor(x, y) ((x) ^ (y))
+# define u64plus(x, y) ((x) + (y))
+# define u64shl(x, n) ((x) << (n))
+# define u64shr(x, n) ((x) >> (n))
+
+#else
+
+/* u64 is a 64-bit unsigned integer value.
+ u64init (HI, LO), is like u64hilo (HI, LO), but for use in
+ initializer contexts. */
+# ifdef WORDS_BIGENDIAN
+typedef struct { uint32_t hi, lo; } u64;
+# define u64init(hi, lo) { hi, lo }
+# else
+typedef struct { uint32_t lo, hi; } u64;
+# define u64init(hi, lo) { lo, hi }
+# endif
+
+/* Given the high and low-order 32-bit quantities HI and LO, return a u64
+ value representing (HI << 32) + LO. */
+static inline u64
+u64hilo (uint32_t hi, uint32_t lo)
+{
+ u64 r;
+ r.hi = hi;
+ r.lo = lo;
+ return r;
+}
+
+/* Return a u64 value representing LO. */
+static inline u64
+u64lo (uint32_t lo)
+{
+ u64 r;
+ r.hi = 0;
+ r.lo = lo;
+ return r;
+}
+
+/* Return X < Y. */
+static inline int
+u64lt (u64 x, u64 y)
+{
+ return x.hi < y.hi || (x.hi == y.hi && x.lo < y.lo);
+}
+
+/* Return X & Y. */
+static inline u64
+u64and (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi & y.hi;
+ r.lo = x.lo & y.lo;
+ return r;
+}
+
+/* Return X | Y. */
+static inline u64
+u64or (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi | y.hi;
+ r.lo = x.lo | y.lo;
+ return r;
+}
+
+/* Return X ^ Y. */
+static inline u64
+u64xor (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi ^ y.hi;
+ r.lo = x.lo ^ y.lo;
+ return r;
+}
+
+/* Return X + Y. */
+static inline u64
+u64plus (u64 x, u64 y)
+{
+ u64 r;
+ r.lo = x.lo + y.lo;
+ r.hi = x.hi + y.hi + (r.lo < x.lo);
+ return r;
+}
+
+/* Return X << N. */
+static inline u64
+u64shl (u64 x, int n)
+{
+ u64 r;
+ if (n < 32)
+ {
+ r.hi = (x.hi << n) | (x.lo >> (32 - n));
+ r.lo = x.lo << n;
+ }
+ else
+ {
+ r.hi = x.lo << (n - 32);
+ r.lo = 0;
+ }
+ return r;
+}
+
+/* Return X >> N. */
+static inline u64
+u64shr (u64 x, int n)
+{
+ u64 r;
+ if (n < 32)
+ {
+ r.hi = x.hi >> n;
+ r.lo = (x.hi << (32 - n)) | (x.lo >> n);
+ }
+ else
+ {
+ r.hi = 0;
+ r.lo = x.hi >> (n - 32);
+ }
+ return r;
+}
+
+#endif
diff --git a/gnulib/lib/uinttostr.c b/gnulib/lib/uinttostr.c
new file mode 100644
index 00000000..1662985f
--- /dev/null
+++ b/gnulib/lib/uinttostr.c
@@ -0,0 +1,4 @@
+#define inttostr uinttostr
+#define inttype unsigned int
+#define inttype_is_signed 0
+#include "inttostr.c"
diff --git a/gnulib/lib/umaxtostr.c b/gnulib/lib/umaxtostr.c
new file mode 100644
index 00000000..914f388d
--- /dev/null
+++ b/gnulib/lib/umaxtostr.c
@@ -0,0 +1,4 @@
+#define inttostr umaxtostr
+#define inttype uintmax_t
+#define inttype_is_signed 0
+#include "inttostr.c"
diff --git a/gnulib/lib/uname.c b/gnulib/lib/uname.c
new file mode 100644
index 00000000..9b661412
--- /dev/null
+++ b/gnulib/lib/uname.c
@@ -0,0 +1,268 @@
+/* uname replacement.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/utsname.h>
+
+/* This file provides an implementation only for the native Windows API. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <windows.h>
+
+/* Mingw headers don't have all the platform codes. */
+#ifndef VER_PLATFORM_WIN32_CE
+# define VER_PLATFORM_WIN32_CE 3
+#endif
+
+/* Some headers don't have all the processor architecture codes. */
+#ifndef PROCESSOR_ARCHITECTURE_AMD64
+# define PROCESSOR_ARCHITECTURE_AMD64 9
+#endif
+#ifndef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
+# define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
+#endif
+
+/* Mingw headers don't have the latest processor codes. */
+#ifndef PROCESSOR_AMD_X8664
+# define PROCESSOR_AMD_X8664 8664
+#endif
+
+int
+uname (struct utsname *buf)
+{
+ OSVERSIONINFO version;
+ OSVERSIONINFOEX versionex;
+ BOOL have_versionex; /* indicates whether versionex is filled */
+ const char *super_version;
+
+ /* Preparation: Fill version and, if possible, also versionex.
+ But try to call GetVersionEx only once in the common case. */
+ versionex.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
+ have_versionex = GetVersionEx ((OSVERSIONINFO *) &versionex);
+ if (have_versionex)
+ {
+ /* We know that OSVERSIONINFO is a subset of OSVERSIONINFOEX. */
+ memcpy (&version, &versionex, sizeof (OSVERSIONINFO));
+ }
+ else
+ {
+ version.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
+ if (!GetVersionEx (&version))
+ abort ();
+ }
+
+ /* Fill in nodename. */
+ if (gethostname (buf->nodename, sizeof (buf->nodename)) < 0)
+ strcpy (buf->nodename, "localhost");
+
+ /* Determine major-major Windows version. */
+ if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ {
+ /* Windows NT or newer. */
+ super_version = "NT";
+ }
+ else if (version.dwPlatformId == VER_PLATFORM_WIN32_CE)
+ {
+ /* Windows CE or Embedded CE. */
+ super_version = "CE";
+ }
+ else if (version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
+ {
+ /* Windows 95/98/ME. */
+ switch (version.dwMinorVersion)
+ {
+ case 0:
+ super_version = "95";
+ break;
+ case 10:
+ super_version = "98";
+ break;
+ case 90:
+ super_version = "ME";
+ break;
+ default:
+ super_version = "";
+ break;
+ }
+ }
+ else
+ super_version = "";
+
+ /* Fill in sysname. */
+#ifdef __MINGW32__
+ /* Returns a string compatible with the MSYS uname.exe program,
+ so that no further changes are needed to GNU config.guess.
+ For example,
+ $ ./uname.exe -s => MINGW32_NT-5.1
+ */
+ sprintf (buf->sysname, "MINGW32_%s-%u.%u", super_version,
+ (unsigned int) version.dwMajorVersion,
+ (unsigned int) version.dwMinorVersion);
+#else
+ sprintf (buf->sysname, "Windows%s", super_version);
+#endif
+
+ /* Fill in release, version. */
+ /* The MSYS uname.exe programs uses strings from a modified Cygwin runtime:
+ $ ./uname.exe -r => 1.0.11(0.46/3/2)
+ $ ./uname.exe -v => 2008-08-25 23:40
+ There is no point in imitating this behaviour. */
+ if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ {
+ /* Windows NT or newer. */
+ struct windows_version
+ {
+ int major;
+ int minor;
+ unsigned int server_offset;
+ const char *name;
+ };
+
+ /* Storing the workstation and server version names in a single
+ stream does not waste memory when they are the same. These
+ macros abstract the representation. VERSION1 is used if
+ version.wProductType does not matter, VERSION2 if it does. */
+ #define VERSION1(major, minor, name) \
+ { major, minor, 0, name }
+ #define VERSION2(major, minor, workstation, server) \
+ { major, minor, sizeof workstation, workstation "\0" server }
+ static const struct windows_version versions[] =
+ {
+ VERSION2 (3, -1, "Windows NT Workstation", "Windows NT Server"),
+ VERSION2 (4, -1, "Windows NT Workstation", "Windows NT Server"),
+ VERSION1 (5, 0, "Windows 2000"),
+ VERSION1 (5, 1, "Windows XP"),
+ VERSION1 (5, 2, "Windows Server 2003"),
+ VERSION2 (6, 0, "Windows Vista", "Windows Server 2008"),
+ VERSION2 (6, 1, "Windows 7", "Windows Server 2008 R2"),
+ VERSION2 (-1, -1, "Windows", "Windows Server")
+ };
+ const char *base;
+ const struct windows_version *v = versions;
+
+ /* Find a version that matches ours. The last element is a
+ wildcard that always ends the loop. */
+ while ((v->major != version.dwMajorVersion && v->major != -1)
+ || (v->minor != version.dwMinorVersion && v->minor != -1))
+ v++;
+
+ if (have_versionex && versionex.wProductType != VER_NT_WORKSTATION)
+ base = v->name + v->server_offset;
+ else
+ base = v->name;
+ if (v->major == -1 || v->minor == -1)
+ sprintf (buf->release, "%s %u.%u",
+ base,
+ (unsigned int) version.dwMajorVersion,
+ (unsigned int) version.dwMinorVersion);
+ else
+ strcpy (buf->release, base);
+ }
+ else if (version.dwPlatformId == VER_PLATFORM_WIN32_CE)
+ {
+ /* Windows CE or Embedded CE. */
+ sprintf (buf->release, "Windows CE %u.%u",
+ (unsigned int) version.dwMajorVersion,
+ (unsigned int) version.dwMinorVersion);
+ }
+ else
+ {
+ /* Windows 95/98/ME. */
+ sprintf (buf->release, "Windows %s", super_version);
+ }
+ strcpy (buf->version, version.szCSDVersion);
+
+ /* Fill in machine. */
+ {
+ SYSTEM_INFO info;
+
+ GetSystemInfo (&info);
+ /* Check for Windows NT or CE, since the info.wProcessorLevel is
+ garbage on Windows 95. */
+ if (version.dwPlatformId == VER_PLATFORM_WIN32_NT
+ || version.dwPlatformId == VER_PLATFORM_WIN32_CE)
+ {
+ /* Windows NT or newer, or Windows CE or Embedded CE. */
+ switch (info.wProcessorArchitecture)
+ {
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ strcpy (buf->machine, "x86_64");
+ break;
+ case PROCESSOR_ARCHITECTURE_IA64:
+ strcpy (buf->machine, "ia64");
+ break;
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ strcpy (buf->machine, "i386");
+ if (info.wProcessorLevel >= 3)
+ buf->machine[1] =
+ '0' + (info.wProcessorLevel <= 6 ? info.wProcessorLevel : 6);
+ break;
+ case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
+ strcpy (buf->machine, "i686");
+ break;
+ case PROCESSOR_ARCHITECTURE_MIPS:
+ strcpy (buf->machine, "mips");
+ break;
+ case PROCESSOR_ARCHITECTURE_ALPHA:
+ case PROCESSOR_ARCHITECTURE_ALPHA64:
+ strcpy (buf->machine, "alpha");
+ break;
+ case PROCESSOR_ARCHITECTURE_PPC:
+ strcpy (buf->machine, "powerpc");
+ break;
+ case PROCESSOR_ARCHITECTURE_SHX:
+ strcpy (buf->machine, "sh");
+ break;
+ case PROCESSOR_ARCHITECTURE_ARM:
+ strcpy (buf->machine, "arm");
+ break;
+ default:
+ strcpy (buf->machine, "unknown");
+ break;
+ }
+ }
+ else
+ {
+ /* Windows 95/98/ME. */
+ switch (info.dwProcessorType)
+ {
+ case PROCESSOR_AMD_X8664:
+ strcpy (buf->machine, "x86_64");
+ break;
+ case PROCESSOR_INTEL_IA64:
+ strcpy (buf->machine, "ia64");
+ break;
+ default:
+ if (info.dwProcessorType % 100 == 86)
+ sprintf (buf->machine, "i%u",
+ (unsigned int) info.dwProcessorType);
+ else
+ strcpy (buf->machine, "unknown");
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/unicase.h b/gnulib/lib/unicase.h
new file mode 100644
index 00000000..7438ad05
--- /dev/null
+++ b/gnulib/lib/unicase.h
@@ -0,0 +1,457 @@
+/* Unicode character case mappings.
+ Copyright (C) 2002, 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNICASE_H
+#define _UNICASE_H
+
+#include "unitypes.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get uninorm_t. */
+#include "uninorm.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Character case mappings.
+ These mappings are locale and context independent.
+ WARNING! These functions are not sufficient for languages such as German.
+ Better use the functions below that treat an entire string at once and are
+ language aware. */
+
+/* Return the uppercase mapping of a Unicode character. */
+extern ucs4_t
+ uc_toupper (ucs4_t uc);
+
+/* Return the lowercase mapping of a Unicode character. */
+extern ucs4_t
+ uc_tolower (ucs4_t uc);
+
+/* Return the titlecase mapping of a Unicode character. */
+extern ucs4_t
+ uc_totitle (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* String case mappings. */
+
+/* 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. */
+
+/* Return the ISO 639 language code of the current locale.
+ Return "" if it is unknown, or in the "C" locale. */
+extern const char *
+ uc_locale_language (void);
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ 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. */
+
+/* Return 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. */
+extern uint8_t *
+ u8_toupper (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_toupper (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_toupper (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Return 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. */
+extern uint8_t *
+ u8_tolower (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_tolower (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_tolower (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Return the titlecase 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. */
+extern uint8_t *
+ u8_totitle (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_totitle (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_totitle (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* The case-mapping context given by a prefix string. */
+typedef struct casing_prefix_context
+ {
+ /* These fields are private, undocumented. */
+ uint32_t last_char_except_ignorable;
+ uint32_t last_char_normal_or_above;
+ }
+ casing_prefix_context_t;
+/* The case-mapping context of the empty prefix string. */
+extern const casing_prefix_context_t unicase_empty_prefix_context;
+/* Return the case-mapping context of a given prefix string. */
+extern casing_prefix_context_t
+ u8_casing_prefix_context (const uint8_t *s, size_t n);
+extern casing_prefix_context_t
+ u16_casing_prefix_context (const uint16_t *s, size_t n);
+extern casing_prefix_context_t
+ u32_casing_prefix_context (const uint32_t *s, size_t n);
+/* Return the case-mapping context of the prefix concat(A, S), given the
+ case-mapping context of the prefix A. */
+extern casing_prefix_context_t
+ u8_casing_prefixes_context (const uint8_t *s, size_t n,
+ casing_prefix_context_t a_context);
+extern casing_prefix_context_t
+ u16_casing_prefixes_context (const uint16_t *s, size_t n,
+ casing_prefix_context_t a_context);
+extern casing_prefix_context_t
+ u32_casing_prefixes_context (const uint32_t *s, size_t n,
+ casing_prefix_context_t a_context);
+
+/* The case-mapping context given by a suffix string. */
+typedef struct casing_suffix_context
+ {
+ /* These fields are private, undocumented. */
+ uint32_t first_char_except_ignorable;
+ uint32_t bits;
+ }
+ casing_suffix_context_t;
+/* The case-mapping context of the empty suffix string. */
+extern const casing_suffix_context_t unicase_empty_suffix_context;
+/* Return the case-mapping context of a given suffix string. */
+extern casing_suffix_context_t
+ u8_casing_suffix_context (const uint8_t *s, size_t n);
+extern casing_suffix_context_t
+ u16_casing_suffix_context (const uint16_t *s, size_t n);
+extern casing_suffix_context_t
+ u32_casing_suffix_context (const uint32_t *s, size_t n);
+/* Return the case-mapping context of the suffix concat(S, A), given the
+ case-mapping context of the suffix A. */
+extern casing_suffix_context_t
+ u8_casing_suffixes_context (const uint8_t *s, size_t n,
+ casing_suffix_context_t a_context);
+extern casing_suffix_context_t
+ u16_casing_suffixes_context (const uint16_t *s, size_t n,
+ casing_suffix_context_t a_context);
+extern casing_suffix_context_t
+ u32_casing_suffixes_context (const uint32_t *s, size_t n,
+ casing_suffix_context_t a_context);
+
+/* Return the uppercase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern 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);
+extern 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);
+extern 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);
+
+/* Return the lowercase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern 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);
+extern 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);
+extern 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);
+
+/* Return the titlecase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern 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);
+extern 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);
+extern 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);
+
+/* Return the case folded string.
+ Comparing uN_casefold (S1) and uN_casefold (S2) with uN_cmp2() is equivalent
+ to comparing S1 and S2 with uN_casecmp().
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_casefold (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_casefold (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_casefold (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+/* Likewise, for a string that is surrounded by a prefix and a suffix. */
+extern 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);
+extern 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);
+extern 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);
+
+/* Compare 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, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern 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);
+extern 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);
+extern 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);
+extern int
+ ulc_casecmp (const char *s1, size_t n1,
+ const char *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+
+/* Convert the string S of length N to a NUL-terminated byte sequence, in such
+ a way that comparing uN_casexfrm (S1) and uN_casexfrm (S2) with the gnulib
+ function memcmp2() is equivalent to comparing S1 and S2 with uN_casecoll().
+ NF must be either UNINORM_NFC, UNINORM_NFKC, or NULL for no normalization. */
+extern char *
+ u8_casexfrm (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf, char *resultbuf, size_t *lengthp);
+extern char *
+ u16_casexfrm (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf, char *resultbuf, size_t *lengthp);
+extern char *
+ u32_casexfrm (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf, char *resultbuf, size_t *lengthp);
+extern char *
+ ulc_casexfrm (const char *s, size_t n, const char *iso639_language,
+ uninorm_t nf, char *resultbuf, size_t *lengthp);
+
+/* Compare 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, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern 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);
+extern 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);
+extern 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);
+extern int
+ ulc_casecoll (const char *s1, size_t n1,
+ const char *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+
+
+/* Set *RESULTP to true if mapping NFD(S) to upper case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_uppercase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_uppercase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_uppercase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if mapping NFD(S) to lower case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_lowercase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_lowercase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_lowercase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if mapping NFD(S) to title case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_titlecase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_titlecase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_titlecase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if applying case folding to NFD(S) is a no-op, or to
+ false otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_casefolded (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_casefolded (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_casefolded (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *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, return -1 with errno set. */
+extern int
+ u8_is_cased (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_cased (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_cased (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNICASE_H */
diff --git a/gnulib/lib/unicase/cased.c b/gnulib/lib/unicase/cased.c
new file mode 100644
index 00000000..ced6a0e5
--- /dev/null
+++ b/gnulib/lib/unicase/cased.c
@@ -0,0 +1,53 @@
+/* Test whether a Unicode character is cased.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "caseprop.h"
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "cased" if it has the Lowercase
+ or Uppercase property or has a General_Category value of
+ Titlecase_Letter. */
+
+#if 0
+
+#include "unictype.h"
+
+bool
+uc_is_cased (ucs4_t uc)
+{
+ return (uc_is_property_lowercase (uc)
+ || uc_is_property_uppercase (uc)
+ || uc_is_general_category (uc, UC_TITLECASE_LETTER));
+}
+
+#else
+
+#include "unictype/bitmap.h"
+
+/* Define u_casing_property_cased table. */
+#include "cased.h"
+
+bool
+uc_is_cased (ucs4_t uc)
+{
+ return bitmap_lookup (&u_casing_property_cased, uc);
+}
+
+#endif
diff --git a/gnulib/lib/unicase/cased.h b/gnulib/lib/unicase/cased.h
new file mode 100644
index 00000000..ea2c2eaa
--- /dev/null
+++ b/gnulib/lib/unicase/cased.h
@@ -0,0 +1,343 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Casing Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[15 << 4];
+ }
+u_casing_property_cased =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xF7FFFFFF, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFEFFFFF, 0x01FFFFFF, 0x00000003, 0x0000001F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CCF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x007FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF21FBD50, 0x000043E0, 0xFFFFFFFF,
+ 0x00000018, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000018FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unicase/casefold.h b/gnulib/lib/unicase/casefold.h
new file mode 100644
index 00000000..1a4fe926
--- /dev/null
+++ b/gnulib/lib/unicase/casefold.h
@@ -0,0 +1,22 @@
+/* Casefolding of Unicode characters.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "unitypes.h"
+
+/* Return the casefold mapping of a Unicode character. */
+extern ucs4_t
+ uc_tocasefold (ucs4_t uc);
diff --git a/gnulib/lib/unicase/caseprop.h b/gnulib/lib/unicase/caseprop.h
new file mode 100644
index 00000000..391d1692
--- /dev/null
+++ b/gnulib/lib/unicase/caseprop.h
@@ -0,0 +1,32 @@
+/* Case related properties of Unicode characters.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include "unitypes.h"
+
+/* Determine whether a character is "cased" according to the Unicode Standard,
+ <http://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ definition D120. */
+extern bool
+ uc_is_cased (ucs4_t uc);
+
+/* Determine whether a character is "case-ignorable"
+ according to the Unicode Standard,
+ <http://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ definition D121. */
+extern bool
+ uc_is_case_ignorable (ucs4_t uc);
diff --git a/gnulib/lib/unicase/context.h b/gnulib/lib/unicase/context.h
new file mode 100644
index 00000000..a3303d6e
--- /dev/null
+++ b/gnulib/lib/unicase/context.h
@@ -0,0 +1,65 @@
+/* Case-mapping contexts of UTF-8/UTF-16/UTF-32 substring.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* The context of a prefix string combines the information of the "Before C"
+ conditions of the Unicode Standard,
+ <http://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ table 3-14 "Context Specification for Casing".
+
+ casing_prefix_context_t contains the following fields:
+
+ // Helper for evaluating the FINAL_SIGMA condition:
+ // Last character that was not case-ignorable.
+ ucs4_t last_char_except_ignorable;
+
+ // Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions:
+ // Last character that was of combining class 230 ("Above") or 0.
+ ucs4_t last_char_normal_or_above;
+
+ Three bits would be sufficient to carry the context information, but
+ that would require to invoke uc_is_cased and uc_is_property_soft_dotted
+ ahead of time, more often than actually needed. */
+
+
+/* The context of a suffix string combines the information of the "After C"
+ conditions of the Unicode Standard,
+ <http://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ table 3-14 "Context Specification for Casing".
+
+ casing_suffix_context_t contains the following fields:
+
+ // For evaluating the FINAL_SIGMA condition:
+ // First character that was not case-ignorable.
+ ucs4_t first_char_except_ignorable;
+
+ // For evaluating the MORE_ABOVE condition:
+ // Bit 0 is set if the suffix contains a character of combining class
+ // 230 (Above) with no character of combining class 0 or 230 (Above)
+ // before it.
+ //
+ // For evaluating the BEFORE_DOT condition:
+ // Bit 1 is set if the suffix contains a COMBINING DOT ABOVE (U+0307)
+ // with no character of combining class 0 or 230 (Above) before it.
+ //
+ uint32_t bits;
+
+ Three bits would be sufficient to carry the context information, but
+ that would require to invoke uc_is_cased ahead of time, more often than
+ actually needed. */
+#define SCC_MORE_ABOVE_MASK 1
+#define SCC_BEFORE_DOT_MASK 2
diff --git a/gnulib/lib/unicase/empty-prefix-context.c b/gnulib/lib/unicase/empty-prefix-context.c
new file mode 100644
index 00000000..dada1047
--- /dev/null
+++ b/gnulib/lib/unicase/empty-prefix-context.c
@@ -0,0 +1,27 @@
+/* Case-mapping context of empty prefix string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+const casing_prefix_context_t unicase_empty_prefix_context =
+ {
+ 0xFFFD /* last_char_except_ignorable */,
+ 0xFFFD /* last_char_normal_or_above */
+ };
diff --git a/gnulib/lib/unicase/empty-suffix-context.c b/gnulib/lib/unicase/empty-suffix-context.c
new file mode 100644
index 00000000..fc59a6e2
--- /dev/null
+++ b/gnulib/lib/unicase/empty-suffix-context.c
@@ -0,0 +1,27 @@
+/* Case-mapping context of empty suffix string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+const casing_suffix_context_t unicase_empty_suffix_context =
+ {
+ 0xFFFD /* first_char_except_ignorable */,
+ 0 /* bits */
+ };
diff --git a/gnulib/lib/unicase/ignorable.c b/gnulib/lib/unicase/ignorable.c
new file mode 100644
index 00000000..9cfce9fa
--- /dev/null
+++ b/gnulib/lib/unicase/ignorable.c
@@ -0,0 +1,71 @@
+/* Test whether a Unicode character is case-ignorable.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "caseprop.h"
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "case-ignorable" if it has the
+ value MidLetter {or the value MidNumLet} for the Word_Break property or
+ its General_Category is one of Nonspacing_Mark (Mn), Enclosing_Mark (Me),
+ Format (Cf), Modifier_Letter (Lm), or Modifier_Symbol (Sk).
+ The text marked in braces was added in Unicode 5.1.0, see
+ <http://www.unicode.org/versions/Unicode5.1.0/> section "Update of
+ Definition of case-ignorable". */
+/* Since this predicate is only used for the "Before C" and "After C"
+ conditions of FINAL_SIGMA, we exclude the "cased" characters here.
+ This simplifies the evaluation of the regular expressions
+ \p{cased} (\p{case-ignorable})* C
+ and
+ C (\p{case-ignorable})* \p{cased}
+ */
+
+#if 0
+
+#include "unictype.h"
+#include "uniwbrk.h"
+
+bool
+uc_is_case_ignorable (ucs4_t uc)
+{
+ int wbp = uc_wordbreak_property (uc);
+
+ return (wbp == WBP_MIDLETTER || wbp == WBP_MIDNUMLET
+ || uc_is_general_category_withtable (uc, UC_CATEGORY_MASK_Mn
+ | UC_CATEGORY_MASK_Me
+ | UC_CATEGORY_MASK_Cf
+ | UC_CATEGORY_MASK_Lm
+ | UC_CATEGORY_MASK_Sk))
+ && !uc_is_cased (uc);
+}
+
+#else
+
+#include "unictype/bitmap.h"
+
+/* Define u_casing_property_case_ignorable table. */
+#include "ignorable.h"
+
+bool
+uc_is_case_ignorable (ucs4_t uc)
+{
+ return bitmap_lookup (&u_casing_property_case_ignorable, uc);
+}
+
+#endif
diff --git a/gnulib/lib/unicase/ignorable.h b/gnulib/lib/unicase/ignorable.h
new file mode 100644
index 00000000..3b29290f
--- /dev/null
+++ b/gnulib/lib/unicase/ignorable.h
@@ -0,0 +1,544 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Casing Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[30 << 4];
+ }
+u_casing_property_case_ignorable =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 432,
+ 16 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x04004080, 0x40000000, 0x00000001,
+ 0x00000000, 0x0190A100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFE000000, 0xFFFFFFFC, 0xFFFFFFE0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFDF, 0x0030FFFF,
+ 0x000000B0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x02000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00100000,
+ 0x07FF000F, 0x00000000, 0x7FFFF801, 0x00010000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0x00003DFF,
+ 0x00028000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x043FF800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000006, 0x10000000, 0x001E21FE, 0x0002000C,
+ 0x00000002, 0x10000000, 0x0000201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0x90000000, 0x0040201E, 0x0000000C,
+ 0x00000004, 0x00000000, 0x00002001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x90000000, 0x00003040, 0x0000000C,
+ 0x00000000, 0x00000000, 0x0000201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x005C0400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007FC0, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F40, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFF00DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x00002064, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3FB00000, 0x208FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000008, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xC000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x0300F800, 0x00007C90, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00008000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x083EFC00, 0x00000000, 0x00000000,
+ 0x7E000000, 0x00000000, 0x00000000, 0x70000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00200000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0xB0078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000700, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0008FFFF, 0x0000007F, 0x00240000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x04004080, 0x40000000, 0x00000001, 0x00010000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x0E000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF80380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unicase/invariant.h b/gnulib/lib/unicase/invariant.h
new file mode 100644
index 00000000..c65ae23e
--- /dev/null
+++ b/gnulib/lib/unicase/invariant.h
@@ -0,0 +1,45 @@
+/* Internal functions for Unicode character case mappings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#include "unitypes.h"
+#include "uninorm.h"
+
+/* Return true if mapping NFD(S) to via MAPPING is a no-op. */
+extern int
+ u8_is_invariant (const uint8_t *s, size_t n,
+ uint8_t * (*mapping) (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp),
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_invariant (const uint16_t *s, size_t n,
+ uint16_t * (*mapping) (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp),
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_invariant (const uint32_t *s, size_t n,
+ uint32_t * (*mapping) (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp),
+ const char *iso639_language,
+ bool *resultp);
diff --git a/gnulib/lib/unicase/locale-language.c b/gnulib/lib/unicase/locale-language.c
new file mode 100644
index 00000000..2ee65c72
--- /dev/null
+++ b/gnulib/lib/unicase/locale-language.c
@@ -0,0 +1,55 @@
+/* Language code of current locale.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <locale.h>
+#include <string.h>
+
+#include "localename.h"
+
+#include "unicase/locale-languages.h"
+
+const char *
+uc_locale_language (void)
+{
+ const char *locale_name = gl_locale_name (LC_CTYPE, "LC_CTYPE");
+ const char *p;
+
+ /* Find the end of the language portion. */
+ p = locale_name;
+ while (*p != '\0' && *p != '_' && *p != '.' && *p != '@')
+ p++;
+
+ /* Return a statically allocated pointer to the language portion, so that the
+ caller of this function does not need to free() the result.
+ We could use a dynamically built unification table. But given that the
+ set of possible languages is small, it is easier (and excludes ENOMEM
+ error conditions) to allocate the unification table statically. */
+ if (p != locale_name)
+ {
+ const char *language =
+ uc_locale_languages_lookup (locale_name, p - locale_name);
+ if (language != NULL)
+ return language;
+ }
+
+ return "";
+}
diff --git a/gnulib/lib/unicase/locale-languages.gperf b/gnulib/lib/unicase/locale-languages.gperf
new file mode 100644
index 00000000..da0d94e7
--- /dev/null
+++ b/gnulib/lib/unicase/locale-languages.gperf
@@ -0,0 +1,270 @@
+%language=ANSI-C
+%define hash-function-name uc_locale_language_hash
+%define lookup-function-name uc_locale_languages_lookup
+%compare-lengths
+%compare-strncmp
+%readonly-tables
+%pic
+/* List of languages taken from gettext/gettext-tools/src/lang-table.c
+ on 2009-02-07. */
+%%
+"aa", /* Afar" */
+"ab", /* Abkhazian" */
+"ace", /* Achinese" */
+"ae", /* Avestan" */
+"af", /* Afrikaans" */
+"ak", /* Akan" */
+"am", /* Amharic" */
+"an", /* Aragonese" */
+"ang", /* Old English" */
+"ar", /* Arabic" */
+"as", /* Assamese" */
+"ast", /* Asturian" */
+"av", /* Avaric" */
+"awa", /* Awadhi" */
+"ay", /* Aymara" */
+"az", /* Azerbaijani" */
+"ba", /* Bashkir" */
+"bal", /* Baluchi" */
+"ban", /* Balinese" */
+"be", /* Belarusian" */
+"bej", /* Beja" */
+"bem", /* Bemba" */
+"bg", /* Bulgarian" */
+"bh", /* Bihari" */
+"bho", /* Bhojpuri" */
+"bi", /* Bislama" */
+"bik", /* Bikol" */
+"bin", /* Bini" */
+"bm", /* Bambara" */
+"bn", /* Bengali" */
+"bo", /* Tibetan" */
+"br", /* Breton" */
+"bs", /* Bosnian" */
+"bug", /* Buginese" */
+"ca", /* Catalan" */
+"ce", /* Chechen" */
+"ceb", /* Cebuano" */
+"ch", /* Chamorro" */
+"co", /* Corsican" */
+"cr", /* Cree" */
+"crh", /* Crimean Tatar" */
+"cs", /* Czech" */
+"csb", /* Kashubian" */
+"cu", /* Church Slavic" */
+"cv", /* Chuvash" */
+"cy", /* Welsh" */
+"da", /* Danish" */
+"de", /* German" */
+"din", /* Dinka" */
+"doi", /* Dogri" */
+"dv", /* Divehi" */
+"dz", /* Dzongkha" */
+"ee", /* Ewe" */
+"el", /* Greek" */
+"en", /* English" */
+"eo", /* Esperanto" */
+"es", /* Spanish" */
+"et", /* Estonian" */
+"eu", /* Basque" */
+"fa", /* Persian" */
+"ff", /* Fulah" */
+"fi", /* Finnish" */
+"fil", /* Filipino" */
+"fj", /* Fijian" */
+"fo", /* Faroese" */
+"fon", /* Fon" */
+"fr", /* French" */
+"fur", /* Friulian" */
+"fy", /* Western Frisian" */
+"ga", /* Irish" */
+"gd", /* Scottish Gaelic" */
+"gl", /* Galician" */
+"gn", /* Guarani" */
+"gon", /* Gondi" */
+"gsw", /* Swiss German" */
+"gu", /* Gujarati" */
+"gv", /* Manx" */
+"ha", /* Hausa" */
+"he", /* Hebrew" */
+"hi", /* Hindi" */
+"hil", /* Hiligaynon" */
+"hmn", /* Hmong" */
+"ho", /* Hiri Motu" */
+"hr", /* Croatian" */
+"ht", /* Haitian" */
+"hu", /* Hungarian" */
+"hy", /* Armenian" */
+"hz", /* Herero" */
+"ia", /* Interlingua" */
+"id", /* Indonesian" */
+"ie", /* Interlingue" */
+"ig", /* Igbo" */
+"ii", /* Sichuan Yi" */
+"ik", /* Inupiak" */
+"ilo", /* Iloko" */
+"is", /* Icelandic" */
+"it", /* Italian" */
+"iu", /* Inuktitut" */
+"ja", /* Japanese" */
+"jab", /* Hyam" */
+"jv", /* Javanese" */
+"ka", /* Georgian" */
+"kab", /* Kabyle" */
+"kaj", /* Jju" */
+"kam", /* Kamba" */
+"kbd", /* Kabardian" */
+"kcg", /* Tyap" */
+"kdm", /* Kagoma" */
+"kg", /* Kongo" */
+"ki", /* Kikuyu" */
+"kj", /* Kuanyama" */
+"kk", /* Kazakh" */
+"kl", /* Kalaallisut" */
+"km", /* Central Khmer" */
+"kmb", /* Kimbundu" */
+"kn", /* Kannada" */
+"ko", /* Korean" */
+"kr", /* Kanuri" */
+"kru", /* Kurukh" */
+"ks", /* Kashmiri" */
+"ku", /* Kurdish" */
+"kv", /* Komi" */
+"kw", /* Cornish" */
+"ky", /* Kirghiz" */
+"kok", /* Konkani" */
+"la", /* Latin" */
+"lb", /* Letzeburgesch" */
+"lg", /* Ganda" */
+"li", /* Limburgish" */
+"ln", /* Lingala" */
+"lo", /* Laotian" */
+"lt", /* Lithuanian" */
+"lu", /* Luba-Katanga" */
+"lua", /* Luba-Lulua" */
+"luo", /* Luo" */
+"lv", /* Latvian" */
+"mad", /* Madurese" */
+"mag", /* Magahi" */
+"mai", /* Maithili" */
+"mak", /* Makasar" */
+"man", /* Mandingo" */
+"men", /* Mende" */
+"mg", /* Malagasy" */
+"mh", /* Marshallese" */
+"mi", /* Maori" */
+"min", /* Minangkabau" */
+"mk", /* Macedonian" */
+"ml", /* Malayalam" */
+"mn", /* Mongolian" */
+"mni", /* Manipuri" */
+"mo", /* Moldavian" */
+"mos", /* Mossi" */
+"mr", /* Marathi" */
+"ms", /* Malay" */
+"mt", /* Maltese" */
+"mwr", /* Marwari" */
+"my", /* Burmese" */
+"myn", /* Mayan" */
+"na", /* Nauru" */
+"nap", /* Neapolitan" */
+"nah", /* Nahuatl" */
+"nb", /* Norwegian Bokmal" */
+"nd", /* North Ndebele" */
+"nds", /* Low Saxon" */
+"ne", /* Nepali" */
+"ng", /* Ndonga" */
+"nl", /* Dutch" */
+"nn", /* Norwegian Nynorsk" */
+"no", /* Norwegian" */
+"nr", /* South Ndebele" */
+"nso", /* Northern Sotho" */
+"nv", /* Navajo" */
+"ny", /* Nyanja" */
+"nym", /* Nyamwezi" */
+"nyn", /* Nyankole" */
+"oc", /* Occitan" */
+"oj", /* Ojibwa" */
+"om", /* (Afan) Oromo" */
+"or", /* Oriya" */
+"os", /* Ossetian" */
+"pa", /* Punjabi" */
+"pag", /* Pangasinan" */
+"pam", /* Pampanga" */
+"pap", /* Papiamento" */
+"pbb", /* Páez" */
+"pi", /* Pali" */
+"pl", /* Polish" */
+"ps", /* Pashto" */
+"pt", /* Portuguese" */
+"qu", /* Quechua" */
+"raj", /* Rajasthani" */
+"rm", /* Romansh" */
+"rn", /* Kirundi" */
+"ro", /* Romanian" */
+"ru", /* Russian" */
+"rw", /* Kinyarwanda" */
+"sa", /* Sanskrit" */
+"sas", /* Sasak" */
+"sat", /* Santali" */
+"sc", /* Sardinian" */
+"scn", /* Sicilian" */
+"sd", /* Sindhi" */
+"se", /* Northern Sami" */
+"sg", /* Sango" */
+"shn", /* Shan" */
+"si", /* Sinhala" */
+"sid", /* Sidamo" */
+"sk", /* Slovak" */
+"sl", /* Slovenian" */
+"sm", /* Samoan" */
+"sn", /* Shona" */
+"so", /* Somali" */
+"sq", /* Albanian" */
+"sr", /* Serbian" */
+"srr", /* Serer" */
+"ss", /* Siswati" */
+"st", /* Sesotho" */
+"su", /* Sundanese" */
+"suk", /* Sukuma" */
+"sus", /* Susu" */
+"sv", /* Swedish" */
+"sw", /* Swahili" */
+"ta", /* Tamil" */
+"te", /* Telugu" */
+"tem", /* Timne" */
+"tet", /* Tetum" */
+"tg", /* Tajik" */
+"th", /* Thai" */
+"ti", /* Tigrinya" */
+"tiv", /* Tiv" */
+"tk", /* Turkmen" */
+"tl", /* Tagalog" */
+"tn", /* Setswana" */
+"to", /* Tonga" */
+"tr", /* Turkish" */
+"ts", /* Tsonga" */
+"tt", /* Tatar" */
+"tum", /* Tumbuka" */
+"tw", /* Twi" */
+"ty", /* Tahitian" */
+"ug", /* Uighur" */
+"uk", /* Ukrainian" */
+"umb", /* Umbundu" */
+"ur", /* Urdu" */
+"uz", /* Uzbek" */
+"ve", /* Venda" */
+"vi", /* Vietnamese" */
+"vo", /* Volapuk" */
+"wal", /* Walamo" */
+"war", /* Waray" */
+"wen", /* Sorbian" */
+"wo", /* Wolof" */
+"xh", /* Xhosa" */
+"yao", /* Yao" */
+"yi", /* Yiddish" */
+"yo", /* Yoruba" */
+"za", /* Zhuang" */
+"zh", /* Chinese" */
+"zu", /* Zulu" */
+"zap", /* Zapotec" */
diff --git a/gnulib/lib/unicase/simple-mapping.h b/gnulib/lib/unicase/simple-mapping.h
new file mode 100644
index 00000000..83200b49
--- /dev/null
+++ b/gnulib/lib/unicase/simple-mapping.h
@@ -0,0 +1,39 @@
+/* Simple case mapping for Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ucs4_t
+FUNC (ucs4_t uc)
+{
+ unsigned int index1 = uc >> mapping_header_0;
+ if (index1 < mapping_header_1)
+ {
+ int lookup1 = u_mapping.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> mapping_header_2) & mapping_header_3;
+ int lookup2 = u_mapping.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & mapping_header_4);
+ int lookup3 = u_mapping.level3[lookup2 + index3];
+
+ return uc + lookup3;
+ }
+ }
+ }
+ return uc;
+}
diff --git a/gnulib/lib/unicase/special-casing-table.gperf b/gnulib/lib/unicase/special-casing-table.gperf
new file mode 100644
index 00000000..78e8fcdd
--- /dev/null
+++ b/gnulib/lib/unicase/special-casing-table.gperf
@@ -0,0 +1,136 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Special casing rules of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 5.1.0. */
+struct special_casing_rule { char code[3]; };
+%struct-type
+%language=ANSI-C
+%define slot-name code
+%define hash-function-name gl_unicase_special_hash
+%define lookup-function-name gl_unicase_special_lookup
+%compare-lengths
+%compare-strncmp
+%readonly-tables
+%omit-struct-type
+%%
+"\x00\x49\x00", 1, SCC_MORE_ABOVE , { 'l', 't' }, { 0x0049, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\x49\x01", 1, -SCC_BEFORE_DOT , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x02", 1, -SCC_BEFORE_DOT , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x03", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x04", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x4a\x00", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x004A, 0, 0 }, { 0x006A, 0x0307, 0 }, { 0x004A, 0, 0 }, { 0x006A, 0, 0 }
+"\x00\x69\x00", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\x69\x01", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\xcc\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CC, 0, 0 }, { 0x0069, 0x0307, 0x0300 }, { 0x00CC, 0, 0 }, { 0x00EC, 0, 0 }
+"\x00\xcd\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CD, 0, 0 }, { 0x0069, 0x0307, 0x0301 }, { 0x00CD, 0, 0 }, { 0x00ED, 0, 0 }
+"\x00\xdf\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0053, 0 }, { 0x00DF, 0, 0 }, { 0x0053, 0x0073, 0 }, { 0x0073, 0x0073, 0 }
+"\x01\x28\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x0128, 0, 0 }, { 0x0069, 0x0307, 0x0303 }, { 0x0128, 0, 0 }, { 0x0129, 0, 0 }
+"\x01\x2e\x00", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x012E, 0, 0 }, { 0x012F, 0x0307, 0 }, { 0x012E, 0, 0 }, { 0x012F, 0, 0 }
+"\x01\x30\x00", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x01\x30\x01", 1, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x01\x30\x02", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }
+"\x01\x49\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x02BC, 0x004E, 0 }, { 0x0149, 0, 0 }, { 0x02BC, 0x004E, 0 }, { 0x02BC, 0x006E, 0 }
+"\x01\xf0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x004A, 0x030C, 0 }, { 0x01F0, 0, 0 }, { 0x004A, 0x030C, 0 }, { 0x006A, 0x030C, 0 }
+"\x03\x07\x00", 1, SCC_AFTER_SOFT_DOTTED, { 'l', 't' }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x07\x01", 1, SCC_AFTER_I , { 't', 'r' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x07\x02", 0, SCC_AFTER_I , { 'a', 'z' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x90\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x0390, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }
+"\x03\xa3\x00", 0, SCC_FINAL_SIGMA , { '\0', '\0' }, { 0x03A3, 0, 0 }, { 0x03C2, 0, 0 }, { 0x03A3, 0, 0 }, { 0x03C3, 0, 0 }
+"\x03\xb0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x03B0, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }
+"\x05\x87\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0535, 0x0552, 0 }, { 0x0587, 0, 0 }, { 0x0535, 0x0582, 0 }, { 0x0565, 0x0582, 0 }
+"\x1e\x96\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0048, 0x0331, 0 }, { 0x1E96, 0, 0 }, { 0x0048, 0x0331, 0 }, { 0x0068, 0x0331, 0 }
+"\x1e\x97\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0054, 0x0308, 0 }, { 0x1E97, 0, 0 }, { 0x0054, 0x0308, 0 }, { 0x0074, 0x0308, 0 }
+"\x1e\x98\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0057, 0x030A, 0 }, { 0x1E98, 0, 0 }, { 0x0057, 0x030A, 0 }, { 0x0077, 0x030A, 0 }
+"\x1e\x99\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0059, 0x030A, 0 }, { 0x1E99, 0, 0 }, { 0x0059, 0x030A, 0 }, { 0x0079, 0x030A, 0 }
+"\x1e\x9a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0041, 0x02BE, 0 }, { 0x1E9A, 0, 0 }, { 0x0041, 0x02BE, 0 }, { 0x0061, 0x02BE, 0 }
+"\x1e\x9e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1E9E, 0, 0 }, { 0x00DF, 0, 0 }, { 0x1E9E, 0, 0 }, { 0x0073, 0x0073, 0 }
+"\x1f\x50\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0 }, { 0x1F50, 0, 0 }, { 0x03A5, 0x0313, 0 }, { 0x03C5, 0x0313, 0 }
+"\x1f\x52\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0300 }, { 0x1F52, 0, 0 }, { 0x03A5, 0x0313, 0x0300 }, { 0x03C5, 0x0313, 0x0300 }
+"\x1f\x54\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0301 }, { 0x1F54, 0, 0 }, { 0x03A5, 0x0313, 0x0301 }, { 0x03C5, 0x0313, 0x0301 }
+"\x1f\x56\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0342 }, { 0x1F56, 0, 0 }, { 0x03A5, 0x0313, 0x0342 }, { 0x03C5, 0x0313, 0x0342 }
+"\x1f\x80\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }
+"\x1f\x81\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }
+"\x1f\x82\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }
+"\x1f\x83\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }
+"\x1f\x84\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }
+"\x1f\x85\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }
+"\x1f\x86\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }
+"\x1f\x87\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }
+"\x1f\x88\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }
+"\x1f\x89\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }
+"\x1f\x8a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }
+"\x1f\x8b\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }
+"\x1f\x8c\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }
+"\x1f\x8d\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }
+"\x1f\x8e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }
+"\x1f\x8f\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }
+"\x1f\x90\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }
+"\x1f\x91\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }
+"\x1f\x92\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }
+"\x1f\x93\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }
+"\x1f\x94\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }
+"\x1f\x95\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }
+"\x1f\x96\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }
+"\x1f\x97\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }
+"\x1f\x98\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }
+"\x1f\x99\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }
+"\x1f\x9a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }
+"\x1f\x9b\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }
+"\x1f\x9c\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }
+"\x1f\x9d\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }
+"\x1f\x9e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }
+"\x1f\x9f\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }
+"\x1f\xa0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }
+"\x1f\xa1\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }
+"\x1f\xa2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }
+"\x1f\xa3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }
+"\x1f\xa4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }
+"\x1f\xa5\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }
+"\x1f\xa6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }
+"\x1f\xa7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }
+"\x1f\xa8\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }
+"\x1f\xa9\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }
+"\x1f\xaa\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }
+"\x1f\xab\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }
+"\x1f\xac\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }
+"\x1f\xad\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }
+"\x1f\xae\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }
+"\x1f\xaf\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }
+"\x1f\xb2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FBA, 0x0399, 0 }, { 0x1FB2, 0, 0 }, { 0x1FBA, 0x0345, 0 }, { 0x1F70, 0x03B9, 0 }
+"\x1f\xb3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }
+"\x1f\xb4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0386, 0x0399, 0 }, { 0x1FB4, 0, 0 }, { 0x0386, 0x0345, 0 }, { 0x03AC, 0x03B9, 0 }
+"\x1f\xb6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0 }, { 0x1FB6, 0, 0 }, { 0x0391, 0x0342, 0 }, { 0x03B1, 0x0342, 0 }
+"\x1f\xb7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0x0399 }, { 0x1FB7, 0, 0 }, { 0x0391, 0x0342, 0x0345 }, { 0x03B1, 0x0342, 0x03B9 }
+"\x1f\xbc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }
+"\x1f\xc2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FCA, 0x0399, 0 }, { 0x1FC2, 0, 0 }, { 0x1FCA, 0x0345, 0 }, { 0x1F74, 0x03B9, 0 }
+"\x1f\xc3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }
+"\x1f\xc4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0389, 0x0399, 0 }, { 0x1FC4, 0, 0 }, { 0x0389, 0x0345, 0 }, { 0x03AE, 0x03B9, 0 }
+"\x1f\xc6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0 }, { 0x1FC6, 0, 0 }, { 0x0397, 0x0342, 0 }, { 0x03B7, 0x0342, 0 }
+"\x1f\xc7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0x0399 }, { 0x1FC7, 0, 0 }, { 0x0397, 0x0342, 0x0345 }, { 0x03B7, 0x0342, 0x03B9 }
+"\x1f\xcc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }
+"\x1f\xd2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0300 }, { 0x1FD2, 0, 0 }, { 0x0399, 0x0308, 0x0300 }, { 0x03B9, 0x0308, 0x0300 }
+"\x1f\xd3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x1FD3, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }
+"\x1f\xd6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0342, 0 }, { 0x1FD6, 0, 0 }, { 0x0399, 0x0342, 0 }, { 0x03B9, 0x0342, 0 }
+"\x1f\xd7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0342 }, { 0x1FD7, 0, 0 }, { 0x0399, 0x0308, 0x0342 }, { 0x03B9, 0x0308, 0x0342 }
+"\x1f\xe2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0300 }, { 0x1FE2, 0, 0 }, { 0x03A5, 0x0308, 0x0300 }, { 0x03C5, 0x0308, 0x0300 }
+"\x1f\xe3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x1FE3, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }
+"\x1f\xe4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A1, 0x0313, 0 }, { 0x1FE4, 0, 0 }, { 0x03A1, 0x0313, 0 }, { 0x03C1, 0x0313, 0 }
+"\x1f\xe6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0342, 0 }, { 0x1FE6, 0, 0 }, { 0x03A5, 0x0342, 0 }, { 0x03C5, 0x0342, 0 }
+"\x1f\xe7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0342 }, { 0x1FE7, 0, 0 }, { 0x03A5, 0x0308, 0x0342 }, { 0x03C5, 0x0308, 0x0342 }
+"\x1f\xf2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FFA, 0x0399, 0 }, { 0x1FF2, 0, 0 }, { 0x1FFA, 0x0345, 0 }, { 0x1F7C, 0x03B9, 0 }
+"\x1f\xf3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }
+"\x1f\xf4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x038F, 0x0399, 0 }, { 0x1FF4, 0, 0 }, { 0x038F, 0x0345, 0 }, { 0x03CE, 0x03B9, 0 }
+"\x1f\xf6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0 }, { 0x1FF6, 0, 0 }, { 0x03A9, 0x0342, 0 }, { 0x03C9, 0x0342, 0 }
+"\x1f\xf7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0x0399 }, { 0x1FF7, 0, 0 }, { 0x03A9, 0x0342, 0x0345 }, { 0x03C9, 0x0342, 0x03B9 }
+"\x1f\xfc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }
+"\xfb\x00\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0 }, { 0xFB00, 0, 0 }, { 0x0046, 0x0066, 0 }, { 0x0066, 0x0066, 0 }
+"\xfb\x01\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0049, 0 }, { 0xFB01, 0, 0 }, { 0x0046, 0x0069, 0 }, { 0x0066, 0x0069, 0 }
+"\xfb\x02\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x004C, 0 }, { 0xFB02, 0, 0 }, { 0x0046, 0x006C, 0 }, { 0x0066, 0x006C, 0 }
+"\xfb\x03\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x0049 }, { 0xFB03, 0, 0 }, { 0x0046, 0x0066, 0x0069 }, { 0x0066, 0x0066, 0x0069 }
+"\xfb\x04\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x004C }, { 0xFB04, 0, 0 }, { 0x0046, 0x0066, 0x006C }, { 0x0066, 0x0066, 0x006C }
+"\xfb\x05\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB05, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }
+"\xfb\x06\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB06, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }
+"\xfb\x13\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0546, 0 }, { 0xFB13, 0, 0 }, { 0x0544, 0x0576, 0 }, { 0x0574, 0x0576, 0 }
+"\xfb\x14\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0535, 0 }, { 0xFB14, 0, 0 }, { 0x0544, 0x0565, 0 }, { 0x0574, 0x0565, 0 }
+"\xfb\x15\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053B, 0 }, { 0xFB15, 0, 0 }, { 0x0544, 0x056B, 0 }, { 0x0574, 0x056B, 0 }
+"\xfb\x16\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x054E, 0x0546, 0 }, { 0xFB16, 0, 0 }, { 0x054E, 0x0576, 0 }, { 0x057E, 0x0576, 0 }
+"\xfb\x17\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053D, 0 }, { 0xFB17, 0, 0 }, { 0x0544, 0x056D, 0 }, { 0x0574, 0x056D, 0 }
diff --git a/gnulib/lib/unicase/special-casing.c b/gnulib/lib/unicase/special-casing.c
new file mode 100644
index 00000000..95b6c824
--- /dev/null
+++ b/gnulib/lib/unicase/special-casing.c
@@ -0,0 +1,25 @@
+/* Special casing table.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "special-casing.h"
+
+#include <string.h>
+
+#include "unicase/special-casing-table.h"
diff --git a/gnulib/lib/unicase/special-casing.h b/gnulib/lib/unicase/special-casing.h
new file mode 100644
index 00000000..33911cfc
--- /dev/null
+++ b/gnulib/lib/unicase/special-casing.h
@@ -0,0 +1,60 @@
+/* Special casing table.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* A special casing context.
+ A context is negated through x -> -x. */
+enum
+{
+ SCC_ALWAYS = 0,
+ SCC_FINAL_SIGMA = 1,
+ SCC_AFTER_SOFT_DOTTED = 2,
+ SCC_MORE_ABOVE = 3,
+ SCC_BEFORE_DOT = 4,
+ SCC_AFTER_I = 5
+};
+
+struct special_casing_rule
+{
+ /* The first two bytes are the code, in big-endian order. The third byte
+ only distinguishes different rules pertaining to the same code. */
+ /*unsigned*/ char code[3];
+
+ /* True when this rule is not the last one for the given code. */
+ /*bool*/ unsigned int has_next : 1;
+
+ /* Context. */
+ signed int context : 7;
+
+ /* Language, or an empty string. */
+ char language[2];
+
+ /* Mapping to upper case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short upper[3];
+
+ /* Mapping to lower case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short lower[3];
+
+ /* Mapping to title case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short title[3];
+
+ /* Casefolding mapping. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short casefold[3];
+};
+
+extern const struct special_casing_rule *
+ gl_unicase_special_lookup (const char *str, unsigned int len);
diff --git a/gnulib/lib/unicase/tocasefold.c b/gnulib/lib/unicase/tocasefold.c
new file mode 100644
index 00000000..1ba79bd3
--- /dev/null
+++ b/gnulib/lib/unicase/tocasefold.c
@@ -0,0 +1,27 @@
+/* Casefold mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "casefold.h"
+
+/* Define u_mapping table. */
+#include "tocasefold.h"
+
+#define FUNC uc_tocasefold
+#include "simple-mapping.h"
diff --git a/gnulib/lib/unicase/tocasefold.h b/gnulib/lib/unicase/tocasefold.h
new file mode 100644
index 00000000..59f26814
--- /dev/null
+++ b/gnulib/lib/unicase/tocasefold.h
@@ -0,0 +1,567 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-case.c for Unicode 5.1.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[26 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, -1, 640, 768,
+ 896, 1024, 1152, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1280, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 1408, 1536, 1664, 1792,
+ -1, -1, 1920, 2048, -1, -1, -1, -1,
+ -1, 2176, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2304, 2432, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2560, 2688, 2816, 2944,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3072, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3200, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 775, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -121, 1, 0, 1, 0, 1, 0, -268,
+ 0, 210, 1, 0, 1, 0, 206, 1,
+ 0, 205, 205, 1, 0, 0, 79, 202,
+ 203, 1, 0, 205, 207, 0, 211, 209,
+ 1, 0, 0, 0, 211, 213, 0, 214,
+ 1, 0, 1, 0, 1, 0, 218, 1,
+ 0, 218, 0, 0, 1, 0, 218, 1,
+ 0, 217, 217, 1, 0, 1, 0, 219,
+ 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 1, 0, 2,
+ 1, 0, 2, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 2, 1, 0, 1, 0, -97, -56,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -130, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 10795, 1, 0, -163, 10792, 0,
+ 0, 1, 0, -195, 69, 71, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 116, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 38, 0,
+ 37, 37, 37, 0, 64, 0, 63, 63,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 0, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 8,
+ -30, -25, 0, 0, 0, -15, -22, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -54, -48, 0, 0, -60, -64, 0, 1,
+ 0, -7, 1, 0, 0, -130, -130, -130,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 15, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, -58, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -8, 0, -8, 0, -8, 0, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -74, -74, 0, 0, -7173, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -86, -86, -86, -86, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -100, -100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -112, -112, -7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -128, -128, -126, -126, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7517, 0,
+ 0, 0, -8383, -8262, 0, 0, 0, 0,
+ 0, 0, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, -10743, -3814, -10727, 0, 0, 1,
+ 0, 1, 0, 1, 0, -10780, -10749, -10783,
+ 0, 0, 1, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0, -35332, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unicase/tolower.c b/gnulib/lib/unicase/tolower.c
new file mode 100644
index 00000000..c69f691d
--- /dev/null
+++ b/gnulib/lib/unicase/tolower.c
@@ -0,0 +1,27 @@
+/* Lowercase mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+/* Define u_mapping table. */
+#include "tolower.h"
+
+#define FUNC uc_tolower
+#include "simple-mapping.h"
diff --git a/gnulib/lib/unicase/tolower.h b/gnulib/lib/unicase/tolower.h
new file mode 100644
index 00000000..e7b4b293
--- /dev/null
+++ b/gnulib/lib/unicase/tolower.h
@@ -0,0 +1,567 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-case.c for Unicode 5.1.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[26 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, -1, 640, 768,
+ 896, 1024, 1152, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1280, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 1408, 1536, 1664, 1792,
+ -1, -1, 1920, 2048, -1, -1, -1, -1,
+ -1, 2176, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2304, 2432, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2560, 2688, 2816, 2944,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3072, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3200, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -199, 0, 1, 0, 1, 0, 1, 0,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -121, 1, 0, 1, 0, 1, 0, 0,
+ 0, 210, 1, 0, 1, 0, 206, 1,
+ 0, 205, 205, 1, 0, 0, 79, 202,
+ 203, 1, 0, 205, 207, 0, 211, 209,
+ 1, 0, 0, 0, 211, 213, 0, 214,
+ 1, 0, 1, 0, 1, 0, 218, 1,
+ 0, 218, 0, 0, 1, 0, 218, 1,
+ 0, 217, 217, 1, 0, 1, 0, 219,
+ 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 1, 0, 2,
+ 1, 0, 2, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 2, 1, 0, 1, 0, -97, -56,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -130, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 10795, 1, 0, -163, 10792, 0,
+ 0, 1, 0, -195, 69, 71, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 38, 0,
+ 37, 37, 37, 0, 64, 0, 63, 63,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 0, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, -60, 0, 0, 1,
+ 0, -7, 1, 0, 0, -130, -130, -130,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 15, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7615, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -8, 0, -8, 0, -8, 0, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -74, -74, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -86, -86, -86, -86, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -100, -100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -112, -112, -7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -128, -128, -126, -126, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7517, 0,
+ 0, 0, -8383, -8262, 0, 0, 0, 0,
+ 0, 0, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, -10743, -3814, -10727, 0, 0, 1,
+ 0, 1, 0, 1, 0, -10780, -10749, -10783,
+ 0, 0, 1, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0, -35332, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unicase/totitle.c b/gnulib/lib/unicase/totitle.c
new file mode 100644
index 00000000..ced1b69c
--- /dev/null
+++ b/gnulib/lib/unicase/totitle.c
@@ -0,0 +1,27 @@
+/* Titlecase mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+/* Define u_mapping table. */
+#include "totitle.h"
+
+#define FUNC uc_totitle
+#include "simple-mapping.h"
diff --git a/gnulib/lib/unicase/totitle.h b/gnulib/lib/unicase/totitle.h
new file mode 100644
index 00000000..66104371
--- /dev/null
+++ b/gnulib/lib/unicase/totitle.h
@@ -0,0 +1,615 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-case.c for Unicode 5.1.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[29 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, 640, 768, 896,
+ 1024, 1152, 1280, 1408, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1536, -1, 1664, 1792, 1920, 2048,
+ -1, -1, 2176, 2304, -1, -1, -1, -1,
+ -1, 2432, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2560, 2688, 2816, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2944, 3072, 3200, 3328,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3456, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3584, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 743, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, 0,
+ -32, -32, -32, -32, -32, -32, -32, 121,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -232, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, -300,
+ 195, 0, 0, -1, 0, -1, 0, 0,
+ -1, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, -1, 0, 0, 97, 0, 0,
+ 0, -1, 163, 0, 0, 0, 130, 0,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ -1, 0, 0, 0, 0, -1, 0, 0,
+ -1, 0, 0, 0, -1, 0, -1, 0,
+ 0, -1, 0, 0, 0, -1, 0, 56,
+ 0, 0, 0, 0, 1, 0, -1, 1,
+ 0, -1, 1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, -79, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 1, 0, -1, 0, -1, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, -1, 0, 0, 0, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 10783, 10780, 0, -210, -206, 0, -205, -205,
+ 0, -202, 0, -203, 0, 0, 0, 0,
+ -205, 0, 0, -207, 0, 0, 0, 0,
+ -209, -211, 0, 10743, 0, 0, 0, -211,
+ 0, 10749, -213, 0, 0, -214, 0, 0,
+ 0, 0, 0, 0, 0, 10727, 0, 0,
+ -218, 0, 0, -218, 0, 0, 0, 0,
+ -218, -69, -217, -217, -71, 0, 0, 0,
+ 0, 0, -219, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 84, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, 0, 0, -1,
+ 0, 0, 0, 130, 130, 130, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -38, -37, -37, -37,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -31, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -64, -63, -63, 0,
+ -62, -57, 0, 0, 0, -47, -54, -8,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ -86, -80, 7, 0, 0, -96, 0, 0,
+ -1, 0, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -80, -80, -80, -80, -80, -80, -80, -80,
+ -80, -80, -80, -80, -80, -80, -80, -80,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, -15,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 35332, 0, 0, 0, 3814, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ 0, 0, 0, -59, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 0, 8, 0, 8, 0, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 74, 86, 86, 86, 86, 100, 100,
+ 128, 128, 112, 112, 126, 126, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7205, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 0, 0, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -28, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -16, -16, -16, -16, -16, -16, -16, -16,
+ -16, -16, -16, -16, -16, -16, -16, -16,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, 0,
+ 0, -1, 0, 0, 0, -10795, -10792, 0,
+ -1, 0, -1, 0, -1, 0, 0, 0,
+ 0, 0, 0, -1, 0, 0, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1, 0, -1, 0, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unicase/toupper.c b/gnulib/lib/unicase/toupper.c
new file mode 100644
index 00000000..9642b706
--- /dev/null
+++ b/gnulib/lib/unicase/toupper.c
@@ -0,0 +1,27 @@
+/* Uppercase mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+/* Define u_mapping table. */
+#include "toupper.h"
+
+#define FUNC uc_toupper
+#include "simple-mapping.h"
diff --git a/gnulib/lib/unicase/toupper.h b/gnulib/lib/unicase/toupper.h
new file mode 100644
index 00000000..e5194f40
--- /dev/null
+++ b/gnulib/lib/unicase/toupper.h
@@ -0,0 +1,615 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-case.c for Unicode 5.1.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[29 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, 640, 768, 896,
+ 1024, 1152, 1280, 1408, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1536, -1, 1664, 1792, 1920, 2048,
+ -1, -1, 2176, 2304, -1, -1, -1, -1,
+ -1, 2432, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2560, 2688, 2816, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2944, 3072, 3200, 3328,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3456, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3584, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 743, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, 0,
+ -32, -32, -32, -32, -32, -32, -32, 121,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -232, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, -300,
+ 195, 0, 0, -1, 0, -1, 0, 0,
+ -1, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, -1, 0, 0, 97, 0, 0,
+ 0, -1, 163, 0, 0, 0, 130, 0,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ -1, 0, 0, 0, 0, -1, 0, 0,
+ -1, 0, 0, 0, -1, 0, -1, 0,
+ 0, -1, 0, 0, 0, -1, 0, 56,
+ 0, 0, 0, 0, 0, -1, -2, 0,
+ -1, -2, 0, -1, -2, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, -79, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, -2, 0, -1, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, -1, 0, 0, 0, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 10783, 10780, 0, -210, -206, 0, -205, -205,
+ 0, -202, 0, -203, 0, 0, 0, 0,
+ -205, 0, 0, -207, 0, 0, 0, 0,
+ -209, -211, 0, 10743, 0, 0, 0, -211,
+ 0, 10749, -213, 0, 0, -214, 0, 0,
+ 0, 0, 0, 0, 0, 10727, 0, 0,
+ -218, 0, 0, -218, 0, 0, 0, 0,
+ -218, -69, -217, -217, -71, 0, 0, 0,
+ 0, 0, -219, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 84, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, 0, 0, -1,
+ 0, 0, 0, 130, 130, 130, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -38, -37, -37, -37,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -31, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -64, -63, -63, 0,
+ -62, -57, 0, 0, 0, -47, -54, -8,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ -86, -80, 7, 0, 0, -96, 0, 0,
+ -1, 0, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -80, -80, -80, -80, -80, -80, -80, -80,
+ -80, -80, -80, -80, -80, -80, -80, -80,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, -15,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 35332, 0, 0, 0, 3814, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ 0, 0, 0, -59, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 0, 8, 0, 8, 0, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 74, 86, 86, 86, 86, 100, 100,
+ 128, 128, 112, 112, 126, 126, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7205, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 0, 0, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -28, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -16, -16, -16, -16, -16, -16, -16, -16,
+ -16, -16, -16, -16, -16, -16, -16, -16,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, 0,
+ 0, -1, 0, 0, 0, -10795, -10792, 0,
+ -1, 0, -1, 0, -1, 0, 0, 0,
+ 0, 0, 0, -1, 0, 0, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1, 0, -1, 0, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unicase/u-casecmp.h b/gnulib/lib/unicase/u-casecmp.h
new file mode 100644
index 00000000..88c308b4
--- /dev/null
+++ b/gnulib/lib/unicase/u-casecmp.h
@@ -0,0 +1,69 @@
+/* Case and normalization insensitive comparison of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const SRC_UNIT *s1, size_t n1, const SRC_UNIT *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp)
+{
+ UNIT buf1[2048 / sizeof (UNIT)];
+ UNIT buf2[2048 / sizeof (UNIT)];
+ UNIT *norms1;
+ size_t norms1_length;
+ UNIT *norms2;
+ size_t norms2_length;
+ int cmp;
+
+ /* Optimization: There is no need to do canonical composition of each string.
+ Decomposition is enough. */
+ if (nf != NULL)
+ nf = uninorm_decomposing_form (nf);
+
+ /* Case-fold and normalize S1. */
+ norms1_length = sizeof (buf1) / sizeof (UNIT);
+ norms1 = U_CASEFOLD (s1, n1, iso639_language, nf, buf1, &norms1_length);
+ if (norms1 == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Case-fold and normalize S2. */
+ norms2_length = sizeof (buf2) / sizeof (UNIT);
+ norms2 = U_CASEFOLD (s2, n2, iso639_language, nf, buf2, &norms2_length);
+ if (norms2 == NULL)
+ {
+ if (norms1 != buf1)
+ {
+ int saved_errno = errno;
+ free (norms1);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare the normalized strings. */
+ cmp = U_CMP2 (norms1, norms1_length, norms2, norms2_length);
+ if (cmp > 0)
+ cmp = 1;
+ else if (cmp < 0)
+ cmp = -1;
+
+ if (norms2 != buf2)
+ free (norms2);
+ if (norms1 != buf1)
+ free (norms1);
+ *resultp = cmp;
+ return 0;
+}
diff --git a/gnulib/lib/unicase/u-casecoll.h b/gnulib/lib/unicase/u-casecoll.h
new file mode 100644
index 00000000..700d49b1
--- /dev/null
+++ b/gnulib/lib/unicase/u-casecoll.h
@@ -0,0 +1,68 @@
+/* Locale dependent, case and normalization insensitive comparison of Unicode
+ strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp)
+{
+ char buf1[2048];
+ char buf2[2048];
+ char *transformed1;
+ size_t transformed1_length;
+ char *transformed2;
+ size_t transformed2_length;
+ int cmp;
+
+ /* Normalize and transform S1. */
+ transformed1_length = sizeof (buf1);
+ transformed1 =
+ U_CASEXFRM (s1, n1, iso639_language, nf, buf1, &transformed1_length);
+ if (transformed1 == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Normalize and transform S2. */
+ transformed2_length = sizeof (buf2);
+ transformed2 =
+ U_CASEXFRM (s2, n2, iso639_language, nf, buf2, &transformed2_length);
+ if (transformed2 == NULL)
+ {
+ if (transformed1 != buf1)
+ {
+ int saved_errno = errno;
+ free (transformed1);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare the transformed strings. */
+ cmp = memcmp2 (transformed1, transformed1_length,
+ transformed2, transformed2_length);
+ if (cmp < 0)
+ cmp = -1;
+ else if (cmp > 0)
+ cmp = 1;
+
+ if (transformed2 != buf2)
+ free (transformed2);
+ if (transformed1 != buf1)
+ free (transformed1);
+ *resultp = cmp;
+ return 0;
+}
diff --git a/gnulib/lib/unicase/u-casefold.h b/gnulib/lib/unicase/u-casefold.h
new file mode 100644
index 00000000..b0dc89a6
--- /dev/null
+++ b/gnulib/lib/unicase/u-casefold.h
@@ -0,0 +1,28 @@
+/* Casefolding mapping for Unicode strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ return U_CT_CASEFOLD (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u-casemap.h b/gnulib/lib/unicase/u-casemap.h
new file mode 100644
index 00000000..b5b4d2fc
--- /dev/null
+++ b/gnulib/lib/unicase/u-casemap.h
@@ -0,0 +1,416 @@
+/* Case mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ /* The result being accumulated. */
+ UNIT *result;
+ size_t length;
+ size_t allocated;
+
+ /* Initialize the accumulator. */
+ if (nf != NULL || resultbuf == NULL)
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ else
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ length = 0;
+
+ {
+ const UNIT *s_end = s + n;
+
+ /* Helper for evaluating the FINAL_SIGMA condition:
+ Last character that was not case-ignorable. */
+ ucs4_t last_char_except_ignorable =
+ prefix_context.last_char_except_ignorable;
+
+ /* Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions:
+ Last character that was of combining class 230 ("Above") or 0. */
+ ucs4_t last_char_normal_or_above =
+ prefix_context.last_char_normal_or_above;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ ucs4_t mapped_uc[3];
+ unsigned int mapped_count;
+
+ if (uc < 0x10000)
+ {
+ /* Look first in the special-casing table. */
+ char code[3];
+
+ code[0] = (uc >> 8) & 0xff;
+ code[1] = uc & 0xff;
+
+ for (code[2] = 0; ; code[2]++)
+ {
+ const struct special_casing_rule *rule =
+ gl_unicase_special_lookup (code, 3);
+
+ if (rule == NULL)
+ break;
+
+ /* Test if the condition applies. */
+ /* Does the language apply? */
+ if (rule->language[0] == '\0'
+ || (iso639_language != NULL
+ && iso639_language[0] == rule->language[0]
+ && iso639_language[1] == rule->language[1]))
+ {
+ /* Does the context apply? */
+ int context = rule->context;
+ bool applies;
+
+ if (context < 0)
+ context = - context;
+ switch (context)
+ {
+ case SCC_ALWAYS:
+ applies = true;
+ break;
+
+ case SCC_FINAL_SIGMA:
+ /* "Before" condition: preceded by a sequence
+ consisting of a cased letter and a case-ignorable
+ sequence.
+ "After" condition: not followed by a sequence
+ consisting of a case-ignorable sequence and then a
+ cased letter. */
+ /* Test the "before" condition. */
+ applies = uc_is_cased (last_char_except_ignorable);
+ /* Test the "after" condition. */
+ if (applies)
+ {
+ const UNIT *s2 = s + count;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ /* Our uc_is_case_ignorable function is
+ known to return false for all cased
+ characters. So we can call
+ uc_is_case_ignorable first. */
+ if (!uc_is_case_ignorable (uc2))
+ {
+ applies = ! uc_is_cased (uc2);
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ! uc_is_cased (suffix_context.first_char_except_ignorable);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_SOFT_DOTTED:
+ /* "Before" condition: There is a Soft_Dotted character
+ before it, with no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = uc_is_property_soft_dotted (last_char_normal_or_above);
+ break;
+
+ case SCC_MORE_ABOVE:
+ /* "After" condition: followed by a character of
+ combining class 230 (Above) with no intervening
+ character of combining class 0 or 230 (Above). */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A)
+ {
+ applies = true;
+ break;
+ }
+ if (ccc == UC_CCC_NR)
+ break;
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_MORE_ABOVE_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_BEFORE_DOT:
+ /* "After" condition: followed by COMBINING DOT ABOVE
+ (U+0307). Any sequence of characters with a
+ combining class that is neither 0 nor 230 may
+ intervene between the current character and the
+ combining dot above. */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ if (uc2 == 0x0307) /* COMBINING DOT ABOVE */
+ {
+ applies = true;
+ break;
+ }
+ {
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_BEFORE_DOT_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_I:
+ /* "Before" condition: There is an uppercase I before
+ it, and there is no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = (last_char_normal_or_above == 'I');
+ break;
+
+ default:
+ abort ();
+ }
+ if (rule->context < 0)
+ applies = !applies;
+
+ if (applies)
+ {
+ /* The rule applies.
+ Look up the mapping (0 to 3 characters). */
+ const unsigned short *mapped_in_rule =
+ (const unsigned short *)((const char *)rule + offset_in_rule);
+
+ if (mapped_in_rule[0] == 0)
+ mapped_count = 0;
+ else
+ {
+ mapped_uc[0] = mapped_in_rule[0];
+ if (mapped_in_rule[1] == 0)
+ mapped_count = 1;
+ else
+ {
+ mapped_uc[1] = mapped_in_rule[1];
+ if (mapped_in_rule[2] == 0)
+ mapped_count = 2;
+ else
+ {
+ mapped_uc[2] = mapped_in_rule[2];
+ mapped_count = 3;
+ }
+ }
+ }
+ goto found_mapping;
+ }
+ }
+
+ /* Optimization: Save a hash table lookup in the next round. */
+ if (!rule->has_next)
+ break;
+ }
+ }
+
+ /* No special-cased mapping. So use the locale and context independent
+ mapping. */
+ mapped_uc[0] = single_character_map (uc);
+ mapped_count = 1;
+
+ found_mapping:
+ /* Found the mapping: uc maps to mapped_uc[0..mapped_count-1]. */
+ {
+ unsigned int i;
+
+ for (i = 0; i < mapped_count; i++)
+ {
+ ucs4_t muc = mapped_uc[i];
+
+ /* Append muc to the result accumulator. */
+ if (length < allocated)
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret >= 0)
+ {
+ length += ret;
+ goto done_appending;
+ }
+ }
+ {
+ size_t old_allocated = allocated;
+ size_t new_allocated = 2 * old_allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (new_allocated < old_allocated) /* integer overflow? */
+ abort ();
+ {
+ UNIT *larger_result;
+ if (result == NULL)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ else if (result == resultbuf)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ U_CPY (larger_result, resultbuf, length);
+ }
+ else
+ {
+ larger_result =
+ (UNIT *) realloc (result, new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ result = larger_result;
+ allocated = new_allocated;
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret < 0)
+ abort ();
+ length += ret;
+ goto done_appending;
+ }
+ }
+ }
+ done_appending: ;
+ }
+ }
+
+ if (!uc_is_case_ignorable (uc))
+ last_char_except_ignorable = uc;
+
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ last_char_normal_or_above = uc;
+ }
+
+ s += count;
+ }
+ }
+
+ if (nf != NULL)
+ {
+ /* Finally, normalize the result. */
+ UNIT *normalized_result;
+
+ normalized_result = U_NORMALIZE (nf, result, length, resultbuf, lengthp);
+ if (normalized_result == NULL)
+ goto fail;
+
+ free (result);
+ return normalized_result;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ UNIT *memory;
+
+ memory = (UNIT *) realloc (result, length * sizeof (UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+
+ fail:
+ if (result != resultbuf)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unicase/u-casexfrm.h b/gnulib/lib/unicase/u-casexfrm.h
new file mode 100644
index 00000000..5c7430c0
--- /dev/null
+++ b/gnulib/lib/unicase/u-casexfrm.h
@@ -0,0 +1,88 @@
+/* Locale dependent transformation for case insensitive comparison of Unicode
+ strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+char *
+FUNC (const UNIT *s, size_t n, const char *iso639_language, uninorm_t nf,
+ char *resultbuf, size_t *lengthp)
+{
+ UNIT foldedsbuf[2048 / sizeof (UNIT)];
+ UNIT *foldeds;
+ size_t foldeds_length;
+ char convsbuf[2048];
+ char *convs;
+ size_t convs_length;
+ char *result;
+
+ /* Casefold and normalize the Unicode string. */
+ foldeds_length = sizeof (foldedsbuf) / sizeof (UNIT);
+ foldeds = U_CASEFOLD (s, n, iso639_language, nf, foldedsbuf, &foldeds_length);
+ if (foldeds == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ /* Convert it to locale encoding. */
+ convs_length = sizeof (convsbuf) - 1;
+ convs = U_CONV_TO_ENCODING (locale_charset (),
+ iconveh_error,
+ foldeds, foldeds_length,
+ NULL,
+ convsbuf, &convs_length);
+ if (convs == NULL)
+ {
+ if (foldeds != foldedsbuf)
+ {
+ int saved_errno = errno;
+ free (foldeds);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (foldeds != foldedsbuf)
+ free (foldeds);
+
+ /* Ensure one more byte is available. */
+ if (convs != convsbuf)
+ {
+ char *memory = (char *) realloc (convs, convs_length + 1);
+ if (memory == NULL)
+ {
+ free (convs);
+ errno = ENOMEM;
+ return NULL;
+ }
+ convs = memory;
+ }
+
+ /* Apply locale dependent transformations for comparison. */
+ result = memxfrm (convs, convs_length, resultbuf, lengthp);
+ if (result == NULL)
+ {
+ if (convs != convsbuf)
+ {
+ int saved_errno = errno;
+ free (convs);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (convs != convsbuf)
+ free (convs);
+ return result;
+}
diff --git a/gnulib/lib/unicase/u-ct-casefold.h b/gnulib/lib/unicase/u-ct-casefold.h
new file mode 100644
index 00000000..e11d0a81
--- /dev/null
+++ b/gnulib/lib/unicase/u-ct-casefold.h
@@ -0,0 +1,107 @@
+/* Casefolding mapping for Unicode substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ /* Implement the three definitions of caseless matching, as described in
+ Unicode 5.0, section "Default caseless matching":
+ - If no normalization is requested, simply apply the casefolding.
+ X -> toCasefold(X).
+ - If canonical normalization is requested, apply it, and apply an NFD
+ before.
+ X -> NFD(toCasefold(NFD(X))).
+ - If compatibility normalization is requested, apply it twice, apply
+ the normalization after each, and apply an NFD before:
+ X -> NFKD(toCasefold(NFKD(toCasefold(NFD(X))))). */
+ if (nf == NULL)
+ /* X -> toCasefold(X) */
+ return U_CASEMAP (s, n, prefix_context, suffix_context, iso639_language,
+ uc_tocasefold, offsetof (struct special_casing_rule, casefold[0]),
+ NULL,
+ resultbuf, lengthp);
+ else
+ {
+ uninorm_t nfd = uninorm_decomposing_form (nf);
+ /* X -> nf(toCasefold(NFD(X))) or
+ X -> nf(toCasefold(nfd(toCasefold(NFD(X))))) */
+ int repeat = (uninorm_is_compat_decomposing (nf) ? 2 : 1);
+ UNIT tmpbuf1[2048 / sizeof (UNIT)];
+ UNIT tmpbuf2[2048 / sizeof (UNIT)];
+ UNIT *tmp1;
+ size_t tmp1_length;
+ UNIT *tmp2;
+ size_t tmp2_length;
+
+ tmp1_length = sizeof (tmpbuf1) / sizeof (UNIT);
+ tmp1 = U_NORMALIZE (UNINORM_NFD, s, n, tmpbuf1, &tmp1_length);
+ if (tmp1 == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ do
+ {
+ tmp2_length = sizeof (tmpbuf2) / sizeof (UNIT);
+ tmp2 = U_CASEMAP (tmp1, tmp1_length,
+ prefix_context, suffix_context, iso639_language,
+ uc_tocasefold, offsetof (struct special_casing_rule, casefold[0]),
+ NULL,
+ tmpbuf2, &tmp2_length);
+ if (tmp2 == NULL)
+ {
+ int saved_errno = errno;
+ if (tmp1 != tmpbuf1)
+ free (tmp1);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (tmp1 != tmpbuf1)
+ free (tmp1);
+
+ if (repeat > 1)
+ {
+ tmp1_length = sizeof (tmpbuf1) / sizeof (UNIT);
+ tmp1 = U_NORMALIZE (nfd, tmp2, tmp2_length,
+ tmpbuf1, &tmp1_length);
+ }
+ else
+ /* Last run through this loop. */
+ tmp1 = U_NORMALIZE (nf, tmp2, tmp2_length,
+ resultbuf, lengthp);
+ if (tmp1 == NULL)
+ {
+ int saved_errno = errno;
+ if (tmp2 != tmpbuf2)
+ free (tmp2);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (tmp2 != tmpbuf2)
+ free (tmp2);
+ }
+ while (--repeat > 0);
+
+ return tmp1;
+ }
+}
diff --git a/gnulib/lib/unicase/u-ct-totitle.h b/gnulib/lib/unicase/u-ct-totitle.h
new file mode 100644
index 00000000..8892a5df
--- /dev/null
+++ b/gnulib/lib/unicase/u-ct-totitle.h
@@ -0,0 +1,501 @@
+/* Titlecase mapping for UTF-8/UTF-16/UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Quoting the Unicode standard, section "Default Case Algorithms":
+ Find the word boundaries in X according to Unicode Standard Annex #29,
+ “Text Boundaries.” For each word boundary, find the first cased character
+ F following the word boundary. If F exists, map F to Titlecase_Mapping(F);
+ then map all characters C between F and the following word boundary to
+ Lowercase_Mapping(C). */
+
+UNIT *
+FUNC (const UNIT *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ /* The result being accumulated. */
+ UNIT *result;
+ size_t length;
+ size_t allocated;
+ /* An array containing the word break positions. */
+ char *wordbreaks;
+
+ /* Initialize the accumulator. */
+ if (nf != NULL || resultbuf == NULL)
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ else
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ length = 0;
+
+ /* Initialize the word breaks array. */
+ if (n > 0)
+ {
+ wordbreaks = (char *) malloc (n);
+ if (wordbreaks == NULL)
+ {
+ errno = ENOMEM;
+ goto fail2;
+ }
+ U_WORDBREAKS (s, n, wordbreaks);
+ }
+ else
+ wordbreaks = NULL;
+
+ {
+ const UNIT *s_end = s + n;
+ const char *wp = wordbreaks;
+
+ /* When considering the string as segmented by word boundaries: For each
+ such segment:
+ - In the first part, we are searching for the first cased character.
+ In this state, in_word_first_part = true, and no conversion takes
+ place.
+ - In the second part, we are converting every character: the first
+ among these characters to title case, the other ones to lower case.
+ In this state, in_word_first_part = false. */
+ bool in_word_first_part = true;
+
+ /* Helper for evaluating the FINAL_SIGMA condition:
+ Last character that was not case-ignorable. */
+ ucs4_t last_char_except_ignorable =
+ prefix_context.last_char_except_ignorable;
+
+ /* Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions:
+ Last character that was of combining class 230 ("Above") or 0. */
+ ucs4_t last_char_normal_or_above =
+ prefix_context.last_char_normal_or_above;
+
+ while (s < s_end)
+ {
+ /* Fetch the next character. */
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ ucs4_t (*single_character_map) (ucs4_t);
+ size_t offset_in_rule; /* offset in 'struct special_casing_rule' */
+
+ ucs4_t mapped_uc[3];
+ unsigned int mapped_count;
+
+ if (*wp)
+ /* Crossing a word boundary. */
+ in_word_first_part = true;
+
+ /* Determine single_character_map, offset_in_rule.
+ There are three possibilities:
+ - uc should not be converted.
+ - uc should be titlecased.
+ - uc should be lowercased. */
+ if (in_word_first_part)
+ {
+ if (uc_is_cased (uc))
+ {
+ /* uc is to be titlecased. */
+ single_character_map = uc_totitle;
+ offset_in_rule = offsetof (struct special_casing_rule, title[0]);
+ in_word_first_part = false;
+ }
+ else
+ {
+ /* uc is not converted. */
+ single_character_map = NULL;
+ offset_in_rule = 0;
+ }
+ }
+ else
+ {
+ /* uc is to be lowercased. */
+ single_character_map = uc_tolower;
+ offset_in_rule = offsetof (struct special_casing_rule, lower[0]);
+ }
+
+ /* Actually map uc. */
+ if (single_character_map == NULL)
+ {
+ mapped_uc[0] = uc;
+ mapped_count = 1;
+ goto found_mapping;
+ }
+
+ if (uc < 0x10000)
+ {
+ /* Look first in the special-casing table. */
+ char code[3];
+
+ code[0] = (uc >> 8) & 0xff;
+ code[1] = uc & 0xff;
+
+ for (code[2] = 0; ; code[2]++)
+ {
+ const struct special_casing_rule *rule =
+ gl_unicase_special_lookup (code, 3);
+
+ if (rule == NULL)
+ break;
+
+ /* Test if the condition applies. */
+ /* Does the language apply? */
+ if (rule->language[0] == '\0'
+ || (iso639_language != NULL
+ && iso639_language[0] == rule->language[0]
+ && iso639_language[1] == rule->language[1]))
+ {
+ /* Does the context apply? */
+ int context = rule->context;
+ bool applies;
+
+ if (context < 0)
+ context = - context;
+ switch (context)
+ {
+ case SCC_ALWAYS:
+ applies = true;
+ break;
+
+ case SCC_FINAL_SIGMA:
+ /* "Before" condition: preceded by a sequence
+ consisting of a cased letter and a case-ignorable
+ sequence.
+ "After" condition: not followed by a sequence
+ consisting of a case-ignorable sequence and then a
+ cased letter. */
+ /* Test the "before" condition. */
+ applies = uc_is_cased (last_char_except_ignorable);
+ /* Test the "after" condition. */
+ if (applies)
+ {
+ const UNIT *s2 = s + count;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ /* Our uc_is_case_ignorable function is
+ known to return false for all cased
+ characters. So we can call
+ uc_is_case_ignorable first. */
+ if (!uc_is_case_ignorable (uc2))
+ {
+ applies = ! uc_is_cased (uc2);
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ! uc_is_cased (suffix_context.first_char_except_ignorable);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_SOFT_DOTTED:
+ /* "Before" condition: There is a Soft_Dotted character
+ before it, with no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = uc_is_property_soft_dotted (last_char_normal_or_above);
+ break;
+
+ case SCC_MORE_ABOVE:
+ /* "After" condition: followed by a character of
+ combining class 230 (Above) with no intervening
+ character of combining class 0 or 230 (Above). */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A)
+ {
+ applies = true;
+ break;
+ }
+ if (ccc == UC_CCC_NR)
+ break;
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_MORE_ABOVE_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_BEFORE_DOT:
+ /* "After" condition: followed by COMBINING DOT ABOVE
+ (U+0307). Any sequence of characters with a
+ combining class that is neither 0 nor 230 may
+ intervene between the current character and the
+ combining dot above. */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ if (uc2 == 0x0307) /* COMBINING DOT ABOVE */
+ {
+ applies = true;
+ break;
+ }
+ {
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_BEFORE_DOT_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_I:
+ /* "Before" condition: There is an uppercase I before
+ it, and there is no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = (last_char_normal_or_above == 'I');
+ break;
+
+ default:
+ abort ();
+ }
+ if (rule->context < 0)
+ applies = !applies;
+
+ if (applies)
+ {
+ /* The rule applies.
+ Look up the mapping (0 to 3 characters). */
+ const unsigned short *mapped_in_rule =
+ (const unsigned short *)((const char *)rule + offset_in_rule);
+
+ if (mapped_in_rule[0] == 0)
+ mapped_count = 0;
+ else
+ {
+ mapped_uc[0] = mapped_in_rule[0];
+ if (mapped_in_rule[1] == 0)
+ mapped_count = 1;
+ else
+ {
+ mapped_uc[1] = mapped_in_rule[1];
+ if (mapped_in_rule[2] == 0)
+ mapped_count = 2;
+ else
+ {
+ mapped_uc[2] = mapped_in_rule[2];
+ mapped_count = 3;
+ }
+ }
+ }
+ goto found_mapping;
+ }
+ }
+
+ /* Optimization: Save a hash table lookup in the next round. */
+ if (!rule->has_next)
+ break;
+ }
+ }
+
+ /* No special-cased mapping. So use the locale and context independent
+ mapping. */
+ mapped_uc[0] = single_character_map (uc);
+ mapped_count = 1;
+
+ found_mapping:
+ /* Found the mapping: uc maps to mapped_uc[0..mapped_count-1]. */
+ {
+ unsigned int i;
+
+ for (i = 0; i < mapped_count; i++)
+ {
+ ucs4_t muc = mapped_uc[i];
+
+ /* Append muc to the result accumulator. */
+ if (length < allocated)
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail1;
+ }
+ if (ret >= 0)
+ {
+ length += ret;
+ goto done_appending;
+ }
+ }
+ {
+ size_t old_allocated = allocated;
+ size_t new_allocated = 2 * old_allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (new_allocated < old_allocated) /* integer overflow? */
+ abort ();
+ {
+ UNIT *larger_result;
+ if (result == NULL)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail1;
+ }
+ }
+ else if (result == resultbuf)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail1;
+ }
+ U_CPY (larger_result, resultbuf, length);
+ }
+ else
+ {
+ larger_result =
+ (UNIT *) realloc (result, new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail1;
+ }
+ }
+ result = larger_result;
+ allocated = new_allocated;
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail1;
+ }
+ if (ret < 0)
+ abort ();
+ length += ret;
+ goto done_appending;
+ }
+ }
+ }
+ done_appending: ;
+ }
+ }
+
+ if (!uc_is_case_ignorable (uc))
+ last_char_except_ignorable = uc;
+
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ last_char_normal_or_above = uc;
+ }
+
+ s += count;
+ wp += count;
+ }
+ }
+
+ free (wordbreaks);
+
+ if (nf != NULL)
+ {
+ /* Finally, normalize the result. */
+ UNIT *normalized_result;
+
+ normalized_result = U_NORMALIZE (nf, result, length, resultbuf, lengthp);
+ if (normalized_result == NULL)
+ goto fail2;
+
+ free (result);
+ return normalized_result;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail2;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ UNIT *memory;
+
+ memory = (UNIT *) realloc (result, length * sizeof (UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+
+ fail1:
+ {
+ int saved_errno = errno;
+ free (wordbreaks);
+ errno = saved_errno;
+ }
+ fail2:
+ if (result != resultbuf)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unicase/u-is-cased.h b/gnulib/lib/unicase/u-is-cased.h
new file mode 100644
index 00000000..c187a30e
--- /dev/null
+++ b/gnulib/lib/unicase/u-is-cased.h
@@ -0,0 +1,128 @@
+/* Test whether case matters for a Unicode string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ UNIT normsbuf[2048 / sizeof (UNIT)];
+ UNIT *norms;
+ size_t norms_length;
+ UNIT mappedbuf[2048 / sizeof (UNIT)];
+ UNIT *mapped_toupper;
+ UNIT *mapped_tolower;
+ UNIT *mapped_totitle;
+ size_t mapped_length;
+
+ /* Apply canonical decomposition to S. */
+ norms_length = sizeof (normsbuf) / sizeof (UNIT);
+ norms = U_NORMALIZE (UNINORM_NFD, s, n, normsbuf, &norms_length);
+ if (norms == NULL)
+ /* errno is set here. */
+ return -1;
+
+ mapped_length = sizeof (mappedbuf) / sizeof (UNIT);
+
+ /* Apply toupper mapping. */
+ mapped_toupper = U_TOUPPER (norms, norms_length, iso639_language, NULL,
+ mappedbuf, &mapped_length);
+ if (mapped_toupper == NULL)
+ goto fail;
+
+ /* Compare. */
+ if (!(mapped_length == norms_length
+ && U_CMP (mapped_toupper, norms, norms_length) == 0))
+ {
+ if (mapped_toupper != mappedbuf)
+ free (mapped_toupper);
+ goto yes;
+ }
+
+ /* Apply tolower mapping. */
+ mapped_tolower = U_TOLOWER (norms, norms_length, iso639_language, NULL,
+ mapped_toupper, &mapped_length);
+ if (mapped_tolower == NULL)
+ {
+ if (mapped_toupper != mappedbuf)
+ {
+ int saved_errno = errno;
+ free (mapped_toupper);
+ errno = saved_errno;
+ }
+ goto fail;
+ }
+
+ if (mapped_toupper != mapped_tolower && mapped_toupper != mappedbuf)
+ free (mapped_toupper);
+
+ /* Compare. */
+ if (!(mapped_length == norms_length
+ && U_CMP (mapped_tolower, norms, norms_length) == 0))
+ {
+ if (mapped_tolower != mappedbuf)
+ free (mapped_tolower);
+ goto yes;
+ }
+
+ /* Apply totitle mapping. */
+ mapped_totitle = U_TOTITLE (norms, norms_length, iso639_language, NULL,
+ mapped_tolower, &mapped_length);
+ if (mapped_totitle == NULL)
+ {
+ if (mapped_tolower != mappedbuf)
+ {
+ int saved_errno = errno;
+ free (mapped_tolower);
+ errno = saved_errno;
+ }
+ goto fail;
+ }
+
+ if (mapped_tolower != mapped_totitle && mapped_tolower != mappedbuf)
+ free (mapped_tolower);
+
+ /* Compare. */
+ if (!(mapped_length == norms_length
+ && U_CMP (mapped_totitle, norms, norms_length) == 0))
+ {
+ if (mapped_totitle != mappedbuf)
+ free (mapped_totitle);
+ goto yes;
+ }
+
+ if (mapped_totitle != mappedbuf)
+ free (mapped_totitle);
+ if (norms != normsbuf)
+ free (norms);
+ *resultp = false;
+ return 0;
+
+ yes:
+ if (norms != normsbuf)
+ free (norms);
+ *resultp = true;
+ return 0;
+
+ fail:
+ if (norms != normsbuf)
+ {
+ int saved_errno = errno;
+ free (norms);
+ errno = saved_errno;
+ }
+ return -1;
+}
diff --git a/gnulib/lib/unicase/u-is-invariant.h b/gnulib/lib/unicase/u-is-invariant.h
new file mode 100644
index 00000000..541dd8df
--- /dev/null
+++ b/gnulib/lib/unicase/u-is-invariant.h
@@ -0,0 +1,64 @@
+/* Test whether a Unicode string is invariant under a given case mapping.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s, size_t n,
+ UNIT * (*mapping) (const UNIT *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp),
+ const char *iso639_language,
+ bool *resultp)
+{
+ UNIT normsbuf[2048 / sizeof (UNIT)];
+ UNIT *norms;
+ size_t norms_length;
+ UNIT mappedbuf[2048 / sizeof (UNIT)];
+ UNIT *mapped;
+ size_t mapped_length;
+
+ /* Apply canonical decomposition to S. */
+ norms_length = sizeof (normsbuf) / sizeof (UNIT);
+ norms = U_NORMALIZE (UNINORM_NFD, s, n, normsbuf, &norms_length);
+ if (norms == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Apply mapping. */
+ mapped_length = sizeof (mappedbuf) / sizeof (UNIT);
+ mapped = mapping (norms, norms_length, iso639_language, NULL,
+ mappedbuf, &mapped_length);
+ if (mapped == NULL)
+ {
+ if (norms != normsbuf)
+ {
+ int saved_errno = errno;
+ free (norms);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare. */
+ *resultp = (mapped_length == norms_length
+ && U_CMP (mapped, norms, norms_length) == 0);
+
+ if (mapped != mappedbuf)
+ free (mapped);
+ if (norms != normsbuf)
+ free (norms);
+ return 0;
+}
diff --git a/gnulib/lib/unicase/u-prefix-context.h b/gnulib/lib/unicase/u-prefix-context.h
new file mode 100644
index 00000000..2f2d9e7c
--- /dev/null
+++ b/gnulib/lib/unicase/u-prefix-context.h
@@ -0,0 +1,92 @@
+/* Case-mapping context of prefix UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+casing_prefix_context_t
+FUNC1 (const UNIT *s, size_t n)
+{
+ return FUNC2 (s, n, unicase_empty_prefix_context);
+}
+
+casing_prefix_context_t
+FUNC2 (const UNIT *s, size_t n, casing_prefix_context_t a_context)
+{
+#if 0
+ /* Forward iteration. Slow for long strings. */
+ casing_prefix_context_t context = a_context;
+ const UNIT *s_end = s + n;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ if (!uc_is_case_ignorable (uc))
+ context.last_char_except_ignorable = uc;
+
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ context.last_char_normal_or_above = uc;
+ }
+
+ s += count;
+ }
+
+ return context;
+#else
+ /* Iterate backwards, only as far as needed. */
+ casing_prefix_context_t context;
+ ucs4_t last_char_except_ignorable = (ucs4_t)(-1);
+ ucs4_t last_char_normal_or_above = (ucs4_t)(-1);
+ const UNIT *p = s + n;
+
+ for (;;)
+ {
+ ucs4_t uc;
+ p = U_PREV (&uc, p, s);
+ if (p == NULL)
+ break;
+
+ if (last_char_except_ignorable == (ucs4_t)(-1))
+ {
+ if (!uc_is_case_ignorable (uc))
+ last_char_except_ignorable = uc;
+ }
+
+ if (last_char_normal_or_above == (ucs4_t)(-1))
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ last_char_normal_or_above = uc;
+ }
+
+ if (last_char_except_ignorable != (ucs4_t)(-1)
+ && last_char_normal_or_above != (ucs4_t)(-1))
+ break;
+ }
+ context.last_char_except_ignorable =
+ (last_char_except_ignorable != (ucs4_t)(-1)
+ ? last_char_except_ignorable
+ : a_context.last_char_except_ignorable);
+ context.last_char_normal_or_above =
+ (last_char_normal_or_above != (ucs4_t)(-1)
+ ? last_char_normal_or_above
+ : a_context.last_char_normal_or_above);
+
+ return context;
+#endif
+}
diff --git a/gnulib/lib/unicase/u-suffix-context.h b/gnulib/lib/unicase/u-suffix-context.h
new file mode 100644
index 00000000..7085fce5
--- /dev/null
+++ b/gnulib/lib/unicase/u-suffix-context.h
@@ -0,0 +1,90 @@
+/* Case-mapping context of suffix UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+casing_suffix_context_t
+FUNC1 (const UNIT *s, size_t n)
+{
+ return FUNC2 (s, n, unicase_empty_suffix_context);
+}
+
+casing_suffix_context_t
+FUNC2 (const UNIT *s, size_t n, casing_suffix_context_t a_context)
+{
+ casing_suffix_context_t context;
+ /* Evaluate all three conditions in a single pass through the string S.
+ The three variables are -1 as long as the value of the condition has
+ not been determined. */
+ ucs4_t first_char_except_ignorable = (ucs4_t)(-1);
+ int scc_MORE_ABOVE = -1;
+ int scc_BEFORE_DOT = -1;
+ const UNIT *s_end = s + n;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ if (first_char_except_ignorable == (ucs4_t)(-1))
+ {
+ if (!uc_is_case_ignorable (uc))
+ first_char_except_ignorable = uc;
+ }
+
+ if (scc_MORE_ABOVE < 0)
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A)
+ scc_MORE_ABOVE = SCC_MORE_ABOVE_MASK;
+ else if (ccc == UC_CCC_NR)
+ scc_MORE_ABOVE = 0;
+ }
+
+ if (scc_BEFORE_DOT < 0)
+ {
+ if (uc == 0x0307) /* COMBINING DOT ABOVE */
+ scc_BEFORE_DOT = SCC_BEFORE_DOT_MASK;
+ else
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ scc_BEFORE_DOT = 0;
+ }
+ }
+
+ if (first_char_except_ignorable != (ucs4_t)(-1)
+ && (scc_MORE_ABOVE | scc_BEFORE_DOT) >= 0)
+ /* All conditions have been determined. */
+ break;
+
+ s += count;
+ }
+
+ /* For those conditions that have not been determined so far, use the
+ value from the argument context. */
+ context.first_char_except_ignorable =
+ (first_char_except_ignorable != (ucs4_t)(-1)
+ ? first_char_except_ignorable
+ : a_context.first_char_except_ignorable);
+ context.bits =
+ (scc_MORE_ABOVE >= 0
+ ? scc_MORE_ABOVE
+ : a_context.bits & SCC_MORE_ABOVE_MASK)
+ | (scc_BEFORE_DOT >= 0
+ ? scc_BEFORE_DOT
+ : a_context.bits & SCC_BEFORE_DOT_MASK);
+ return context;
+}
diff --git a/gnulib/lib/unicase/u-totitle.h b/gnulib/lib/unicase/u-totitle.h
new file mode 100644
index 00000000..658c95fd
--- /dev/null
+++ b/gnulib/lib/unicase/u-totitle.h
@@ -0,0 +1,28 @@
+/* Titlecase mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ return U_CT_TOTITLE (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u16-casecmp.c b/gnulib/lib/unicase/u16-casecmp.c
new file mode 100644
index 00000000..e6780a99
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casecmp.c
@@ -0,0 +1,35 @@
+/* Case and normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u16_casecmp
+#define UNIT uint16_t
+#define SRC_UNIT uint16_t
+#define U_CASEFOLD u16_casefold
+#define U_CMP2 u16_cmp2
+#include "u-casecmp.h"
diff --git a/gnulib/lib/unicase/u16-casecoll.c b/gnulib/lib/unicase/u16-casecoll.c
new file mode 100644
index 00000000..986bdb85
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casecoll.c
@@ -0,0 +1,32 @@
+/* Locale dependent, case and normalization insensitive comparison of UTF-16
+ strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u16_casecoll
+#define UNIT uint16_t
+#define U_CASEXFRM u16_casexfrm
+#include "u-casecoll.h"
diff --git a/gnulib/lib/unicase/u16-casefold.c b/gnulib/lib/unicase/u16-casefold.c
new file mode 100644
index 00000000..037d51fa
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casefold.c
@@ -0,0 +1,26 @@
+/* Casefolding mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u16_casefold
+#define UNIT uint16_t
+#define U_CT_CASEFOLD u16_ct_casefold
+#include "u-casefold.h"
diff --git a/gnulib/lib/unicase/u16-casemap.c b/gnulib/lib/unicase/u16-casemap.c
new file mode 100644
index 00000000..b8021e7f
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casemap.c
@@ -0,0 +1,40 @@
+/* Case mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicasemap.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u16_casemap
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#define U_UCTOMB u16_uctomb
+#define U_CPY u16_cpy
+#define U_NORMALIZE u16_normalize
+#include "u-casemap.h"
diff --git a/gnulib/lib/unicase/u16-casexfrm.c b/gnulib/lib/unicase/u16-casexfrm.c
new file mode 100644
index 00000000..661902fc
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casexfrm.c
@@ -0,0 +1,35 @@
+/* Locale dependent transformation for case insensitive comparison of UTF-16
+ strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "memxfrm.h"
+
+#define FUNC u16_casexfrm
+#define UNIT uint16_t
+#define U_CASEFOLD u16_casefold
+#define U_CONV_TO_ENCODING u16_conv_to_encoding
+#include "u-casexfrm.h"
diff --git a/gnulib/lib/unicase/u16-ct-casefold.c b/gnulib/lib/unicase/u16-ct-casefold.c
new file mode 100644
index 00000000..65e49e75
--- /dev/null
+++ b/gnulib/lib/unicase/u16-ct-casefold.c
@@ -0,0 +1,35 @@
+/* Casefolding mapping for UTF-16 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+#include "casefold.h"
+
+#define FUNC u16_ct_casefold
+#define UNIT uint16_t
+#define U_CASEMAP u16_casemap
+#define U_NORMALIZE u16_normalize
+#include "u-ct-casefold.h"
diff --git a/gnulib/lib/unicase/u16-ct-tolower.c b/gnulib/lib/unicase/u16-ct-tolower.c
new file mode 100644
index 00000000..2b09c7e1
--- /dev/null
+++ b/gnulib/lib/unicase/u16-ct-tolower.c
@@ -0,0 +1,40 @@
+/* Lowercase mapping for UTF-16 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+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)
+{
+ return u16_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u16-ct-totitle.c b/gnulib/lib/unicase/u16-ct-totitle.c
new file mode 100644
index 00000000..095bd9f4
--- /dev/null
+++ b/gnulib/lib/unicase/u16-ct-totitle.c
@@ -0,0 +1,43 @@
+/* Titlecase mapping for UTF-16 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uniwbrk.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u16_ct_totitle
+#define UNIT uint16_t
+#define U_WORDBREAKS u16_wordbreaks
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#define U_UCTOMB u16_uctomb
+#define U_CPY u16_cpy
+#define U_NORMALIZE u16_normalize
+#include "u-ct-totitle.h"
diff --git a/gnulib/lib/unicase/u16-ct-toupper.c b/gnulib/lib/unicase/u16-ct-toupper.c
new file mode 100644
index 00000000..d26f6c5a
--- /dev/null
+++ b/gnulib/lib/unicase/u16-ct-toupper.c
@@ -0,0 +1,40 @@
+/* Uppercase mapping for UTF-16 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+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)
+{
+ return u16_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u16-is-cased.c b/gnulib/lib/unicase/u16-is-cased.c
new file mode 100644
index 00000000..385c01a7
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-cased.c
@@ -0,0 +1,36 @@
+/* Test whether case matters for an UTF-16 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u16_is_cased
+#define UNIT uint16_t
+#define U_NORMALIZE u16_normalize
+#define U_TOUPPER u16_toupper
+#define U_TOLOWER u16_tolower
+#define U_TOTITLE u16_totitle
+#define U_CMP u16_cmp
+#include "u-is-cased.h"
diff --git a/gnulib/lib/unicase/u16-is-casefolded.c b/gnulib/lib/unicase/u16-is-casefolded.c
new file mode 100644
index 00000000..dd3b6c17
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-casefolded.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-16 string is already case-folded.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u16_is_casefolded (const uint16_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u16_is_invariant (s, n, u16_casefold, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u16-is-invariant.c b/gnulib/lib/unicase/u16-is-invariant.c
new file mode 100644
index 00000000..a7f40da3
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-invariant.c
@@ -0,0 +1,34 @@
+/* Test whether an UTF-16 string is invariant under a given case mapping.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase/invariant.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u16_is_invariant
+#define UNIT uint16_t
+#define U_NORMALIZE u16_normalize
+#define U_CMP u16_cmp
+#include "u-is-invariant.h"
diff --git a/gnulib/lib/unicase/u16-is-lowercase.c b/gnulib/lib/unicase/u16-is-lowercase.c
new file mode 100644
index 00000000..de51a04a
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-lowercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-16 string is entirely lower case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u16_is_lowercase (const uint16_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u16_is_invariant (s, n, u16_tolower, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u16-is-titlecase.c b/gnulib/lib/unicase/u16-is-titlecase.c
new file mode 100644
index 00000000..4192aad3
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-titlecase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-16 string is entirely title case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u16_is_titlecase (const uint16_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u16_is_invariant (s, n, u16_totitle, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u16-is-uppercase.c b/gnulib/lib/unicase/u16-is-uppercase.c
new file mode 100644
index 00000000..509c9bb0
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-uppercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-16 string is entirely upper case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u16_is_uppercase (const uint16_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u16_is_invariant (s, n, u16_toupper, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u16-prefix-context.c b/gnulib/lib/unicase/u16-prefix-context.c
new file mode 100644
index 00000000..85d1d05b
--- /dev/null
+++ b/gnulib/lib/unicase/u16-prefix-context.c
@@ -0,0 +1,33 @@
+/* Case-mapping context of prefix UTF-16 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u16_casing_prefix_context
+#define FUNC2 u16_casing_prefixes_context
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#define U_PREV u16_prev
+#include "u-prefix-context.h"
diff --git a/gnulib/lib/unicase/u16-suffix-context.c b/gnulib/lib/unicase/u16-suffix-context.c
new file mode 100644
index 00000000..8f41cb42
--- /dev/null
+++ b/gnulib/lib/unicase/u16-suffix-context.c
@@ -0,0 +1,32 @@
+/* Case-mapping context of suffix UTF-16 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u16_casing_suffix_context
+#define FUNC2 u16_casing_suffixes_context
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#include "u-suffix-context.h"
diff --git a/gnulib/lib/unicase/u16-tolower.c b/gnulib/lib/unicase/u16-tolower.c
new file mode 100644
index 00000000..c931cca9
--- /dev/null
+++ b/gnulib/lib/unicase/u16-tolower.c
@@ -0,0 +1,39 @@
+/* Lowercase mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint16_t *
+u16_tolower (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp)
+{
+ return u16_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u16-totitle.c b/gnulib/lib/unicase/u16-totitle.c
new file mode 100644
index 00000000..f7c59462
--- /dev/null
+++ b/gnulib/lib/unicase/u16-totitle.c
@@ -0,0 +1,27 @@
+/* Titlecase mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u16_totitle
+#define UNIT uint16_t
+#define U_CT_TOTITLE u16_ct_totitle
+#include "u-totitle.h"
+
diff --git a/gnulib/lib/unicase/u16-toupper.c b/gnulib/lib/unicase/u16-toupper.c
new file mode 100644
index 00000000..12e888aa
--- /dev/null
+++ b/gnulib/lib/unicase/u16-toupper.c
@@ -0,0 +1,39 @@
+/* Uppercase mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint16_t *
+u16_toupper (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp)
+{
+ return u16_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u32-casecmp.c b/gnulib/lib/unicase/u32-casecmp.c
new file mode 100644
index 00000000..7b67bb1c
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casecmp.c
@@ -0,0 +1,35 @@
+/* Case and normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u32_casecmp
+#define UNIT uint32_t
+#define SRC_UNIT uint32_t
+#define U_CASEFOLD u32_casefold
+#define U_CMP2 u32_cmp2
+#include "u-casecmp.h"
diff --git a/gnulib/lib/unicase/u32-casecoll.c b/gnulib/lib/unicase/u32-casecoll.c
new file mode 100644
index 00000000..6d1d772d
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casecoll.c
@@ -0,0 +1,32 @@
+/* Locale dependent, case and normalization insensitive comparison of UTF-32
+ strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u32_casecoll
+#define UNIT uint32_t
+#define U_CASEXFRM u32_casexfrm
+#include "u-casecoll.h"
diff --git a/gnulib/lib/unicase/u32-casefold.c b/gnulib/lib/unicase/u32-casefold.c
new file mode 100644
index 00000000..d1a13410
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casefold.c
@@ -0,0 +1,26 @@
+/* Casefolding mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u32_casefold
+#define UNIT uint32_t
+#define U_CT_CASEFOLD u32_ct_casefold
+#include "u-casefold.h"
diff --git a/gnulib/lib/unicase/u32-casemap.c b/gnulib/lib/unicase/u32-casemap.c
new file mode 100644
index 00000000..6c8213ca
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casemap.c
@@ -0,0 +1,40 @@
+/* Case mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicasemap.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u32_casemap
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#define U_UCTOMB u32_uctomb
+#define U_CPY u32_cpy
+#define U_NORMALIZE u32_normalize
+#include "u-casemap.h"
diff --git a/gnulib/lib/unicase/u32-casexfrm.c b/gnulib/lib/unicase/u32-casexfrm.c
new file mode 100644
index 00000000..bd54497b
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casexfrm.c
@@ -0,0 +1,35 @@
+/* Locale dependent transformation for case insensitive comparison of UTF-32
+ strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "memxfrm.h"
+
+#define FUNC u32_casexfrm
+#define UNIT uint32_t
+#define U_CASEFOLD u32_casefold
+#define U_CONV_TO_ENCODING u32_conv_to_encoding
+#include "u-casexfrm.h"
diff --git a/gnulib/lib/unicase/u32-ct-casefold.c b/gnulib/lib/unicase/u32-ct-casefold.c
new file mode 100644
index 00000000..f360cce7
--- /dev/null
+++ b/gnulib/lib/unicase/u32-ct-casefold.c
@@ -0,0 +1,35 @@
+/* Casefolding mapping for UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+#include "casefold.h"
+
+#define FUNC u32_ct_casefold
+#define UNIT uint32_t
+#define U_CASEMAP u32_casemap
+#define U_NORMALIZE u32_normalize
+#include "u-ct-casefold.h"
diff --git a/gnulib/lib/unicase/u32-ct-tolower.c b/gnulib/lib/unicase/u32-ct-tolower.c
new file mode 100644
index 00000000..7df6a563
--- /dev/null
+++ b/gnulib/lib/unicase/u32-ct-tolower.c
@@ -0,0 +1,40 @@
+/* Lowercase mapping for UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+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)
+{
+ return u32_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u32-ct-totitle.c b/gnulib/lib/unicase/u32-ct-totitle.c
new file mode 100644
index 00000000..d9f51bb7
--- /dev/null
+++ b/gnulib/lib/unicase/u32-ct-totitle.c
@@ -0,0 +1,43 @@
+/* Titlecase mapping for UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uniwbrk.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u32_ct_totitle
+#define UNIT uint32_t
+#define U_WORDBREAKS u32_wordbreaks
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#define U_UCTOMB u32_uctomb
+#define U_CPY u32_cpy
+#define U_NORMALIZE u32_normalize
+#include "u-ct-totitle.h"
diff --git a/gnulib/lib/unicase/u32-ct-toupper.c b/gnulib/lib/unicase/u32-ct-toupper.c
new file mode 100644
index 00000000..e6165564
--- /dev/null
+++ b/gnulib/lib/unicase/u32-ct-toupper.c
@@ -0,0 +1,40 @@
+/* Uppercase mapping for UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+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)
+{
+ return u32_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u32-is-cased.c b/gnulib/lib/unicase/u32-is-cased.c
new file mode 100644
index 00000000..e836dc15
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-cased.c
@@ -0,0 +1,36 @@
+/* Test whether case matters for an UTF-32 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u32_is_cased
+#define UNIT uint32_t
+#define U_NORMALIZE u32_normalize
+#define U_TOUPPER u32_toupper
+#define U_TOLOWER u32_tolower
+#define U_TOTITLE u32_totitle
+#define U_CMP u32_cmp
+#include "u-is-cased.h"
diff --git a/gnulib/lib/unicase/u32-is-casefolded.c b/gnulib/lib/unicase/u32-is-casefolded.c
new file mode 100644
index 00000000..6c2bbb0e
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-casefolded.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-32 string is already case-folded.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u32_is_casefolded (const uint32_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u32_is_invariant (s, n, u32_casefold, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u32-is-invariant.c b/gnulib/lib/unicase/u32-is-invariant.c
new file mode 100644
index 00000000..aea4c61e
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-invariant.c
@@ -0,0 +1,34 @@
+/* Test whether an UTF-32 string is invariant under a given case mapping.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase/invariant.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u32_is_invariant
+#define UNIT uint32_t
+#define U_NORMALIZE u32_normalize
+#define U_CMP u32_cmp
+#include "u-is-invariant.h"
diff --git a/gnulib/lib/unicase/u32-is-lowercase.c b/gnulib/lib/unicase/u32-is-lowercase.c
new file mode 100644
index 00000000..cc2fa2dc
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-lowercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-32 string is entirely lower case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u32_is_lowercase (const uint32_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u32_is_invariant (s, n, u32_tolower, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u32-is-titlecase.c b/gnulib/lib/unicase/u32-is-titlecase.c
new file mode 100644
index 00000000..ee48fc73
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-titlecase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-32 string is entirely title case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u32_is_titlecase (const uint32_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u32_is_invariant (s, n, u32_totitle, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u32-is-uppercase.c b/gnulib/lib/unicase/u32-is-uppercase.c
new file mode 100644
index 00000000..369a68b9
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-uppercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-32 string is entirely upper case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u32_is_uppercase (const uint32_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u32_is_invariant (s, n, u32_toupper, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u32-prefix-context.c b/gnulib/lib/unicase/u32-prefix-context.c
new file mode 100644
index 00000000..f77c4169
--- /dev/null
+++ b/gnulib/lib/unicase/u32-prefix-context.c
@@ -0,0 +1,33 @@
+/* Case-mapping context of prefix UTF-32 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u32_casing_prefix_context
+#define FUNC2 u32_casing_prefixes_context
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#define U_PREV u32_prev
+#include "u-prefix-context.h"
diff --git a/gnulib/lib/unicase/u32-suffix-context.c b/gnulib/lib/unicase/u32-suffix-context.c
new file mode 100644
index 00000000..a62a67be
--- /dev/null
+++ b/gnulib/lib/unicase/u32-suffix-context.c
@@ -0,0 +1,32 @@
+/* Case-mapping context of suffix UTF-32 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u32_casing_suffix_context
+#define FUNC2 u32_casing_suffixes_context
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#include "u-suffix-context.h"
diff --git a/gnulib/lib/unicase/u32-tolower.c b/gnulib/lib/unicase/u32-tolower.c
new file mode 100644
index 00000000..b9c53eda
--- /dev/null
+++ b/gnulib/lib/unicase/u32-tolower.c
@@ -0,0 +1,39 @@
+/* Lowercase mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint32_t *
+u32_tolower (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp)
+{
+ return u32_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u32-totitle.c b/gnulib/lib/unicase/u32-totitle.c
new file mode 100644
index 00000000..d144ae75
--- /dev/null
+++ b/gnulib/lib/unicase/u32-totitle.c
@@ -0,0 +1,26 @@
+/* Titlecase mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u32_totitle
+#define UNIT uint32_t
+#define U_CT_TOTITLE u32_ct_totitle
+#include "u-totitle.h"
diff --git a/gnulib/lib/unicase/u32-toupper.c b/gnulib/lib/unicase/u32-toupper.c
new file mode 100644
index 00000000..d58c8e24
--- /dev/null
+++ b/gnulib/lib/unicase/u32-toupper.c
@@ -0,0 +1,39 @@
+/* Uppercase mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint32_t *
+u32_toupper (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp)
+{
+ return u32_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u8-casecmp.c b/gnulib/lib/unicase/u8-casecmp.c
new file mode 100644
index 00000000..4edbfc35
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casecmp.c
@@ -0,0 +1,35 @@
+/* Case and normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u8_casecmp
+#define UNIT uint8_t
+#define SRC_UNIT uint8_t
+#define U_CASEFOLD u8_casefold
+#define U_CMP2 u8_cmp2
+#include "u-casecmp.h"
diff --git a/gnulib/lib/unicase/u8-casecoll.c b/gnulib/lib/unicase/u8-casecoll.c
new file mode 100644
index 00000000..694011c9
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casecoll.c
@@ -0,0 +1,32 @@
+/* Locale dependent, case and normalization insensitive comparison of UTF-8
+ strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u8_casecoll
+#define UNIT uint8_t
+#define U_CASEXFRM u8_casexfrm
+#include "u-casecoll.h"
diff --git a/gnulib/lib/unicase/u8-casefold.c b/gnulib/lib/unicase/u8-casefold.c
new file mode 100644
index 00000000..e3c91771
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casefold.c
@@ -0,0 +1,107 @@
+/* Casefolding mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u8_casefold
+#define UNIT uint8_t
+#define U_CT_CASEFOLD u8_ct_casefold
+#include "u-casefold.h"
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the case folded input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_casefold ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unicase/u8-casemap.c b/gnulib/lib/unicase/u8-casemap.c
new file mode 100644
index 00000000..9e4d0c09
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casemap.c
@@ -0,0 +1,40 @@
+/* Case mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicasemap.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u8_casemap
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_UCTOMB u8_uctomb
+#define U_CPY u8_cpy
+#define U_NORMALIZE u8_normalize
+#include "u-casemap.h"
diff --git a/gnulib/lib/unicase/u8-casexfrm.c b/gnulib/lib/unicase/u8-casexfrm.c
new file mode 100644
index 00000000..b3e0c664
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casexfrm.c
@@ -0,0 +1,35 @@
+/* Locale dependent transformation for case insensitive comparison of UTF-8
+ strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "memxfrm.h"
+
+#define FUNC u8_casexfrm
+#define UNIT uint8_t
+#define U_CASEFOLD u8_casefold
+#define U_CONV_TO_ENCODING u8_conv_to_encoding
+#include "u-casexfrm.h"
diff --git a/gnulib/lib/unicase/u8-ct-casefold.c b/gnulib/lib/unicase/u8-ct-casefold.c
new file mode 100644
index 00000000..45bacfc5
--- /dev/null
+++ b/gnulib/lib/unicase/u8-ct-casefold.c
@@ -0,0 +1,35 @@
+/* Casefolding mapping for UTF-8 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+#include "casefold.h"
+
+#define FUNC u8_ct_casefold
+#define UNIT uint8_t
+#define U_CASEMAP u8_casemap
+#define U_NORMALIZE u8_normalize
+#include "u-ct-casefold.h"
diff --git a/gnulib/lib/unicase/u8-ct-tolower.c b/gnulib/lib/unicase/u8-ct-tolower.c
new file mode 100644
index 00000000..1b0ee33c
--- /dev/null
+++ b/gnulib/lib/unicase/u8-ct-tolower.c
@@ -0,0 +1,40 @@
+/* Lowercase mapping for UTF-8 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+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)
+{
+ return u8_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u8-ct-totitle.c b/gnulib/lib/unicase/u8-ct-totitle.c
new file mode 100644
index 00000000..7bcdc0dc
--- /dev/null
+++ b/gnulib/lib/unicase/u8-ct-totitle.c
@@ -0,0 +1,43 @@
+/* Titlecase mapping for UTF-8 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uniwbrk.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u8_ct_totitle
+#define UNIT uint8_t
+#define U_WORDBREAKS u8_wordbreaks
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_UCTOMB u8_uctomb
+#define U_CPY u8_cpy
+#define U_NORMALIZE u8_normalize
+#include "u-ct-totitle.h"
diff --git a/gnulib/lib/unicase/u8-ct-toupper.c b/gnulib/lib/unicase/u8-ct-toupper.c
new file mode 100644
index 00000000..c22b25af
--- /dev/null
+++ b/gnulib/lib/unicase/u8-ct-toupper.c
@@ -0,0 +1,40 @@
+/* Uppercase mapping for UTF-8 substrings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+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)
+{
+ return u8_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u8-is-cased.c b/gnulib/lib/unicase/u8-is-cased.c
new file mode 100644
index 00000000..56fc9c7c
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-cased.c
@@ -0,0 +1,36 @@
+/* Test whether case matters for an UTF-8 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u8_is_cased
+#define UNIT uint8_t
+#define U_NORMALIZE u8_normalize
+#define U_TOUPPER u8_toupper
+#define U_TOLOWER u8_tolower
+#define U_TOTITLE u8_totitle
+#define U_CMP u8_cmp
+#include "u-is-cased.h"
diff --git a/gnulib/lib/unicase/u8-is-casefolded.c b/gnulib/lib/unicase/u8-is-casefolded.c
new file mode 100644
index 00000000..007a5126
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-casefolded.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-8 string is already case-folded.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u8_is_casefolded (const uint8_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u8_is_invariant (s, n, u8_casefold, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u8-is-invariant.c b/gnulib/lib/unicase/u8-is-invariant.c
new file mode 100644
index 00000000..4794e567
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-invariant.c
@@ -0,0 +1,34 @@
+/* Test whether an UTF-8 string is invariant under a given case mapping.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase/invariant.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u8_is_invariant
+#define UNIT uint8_t
+#define U_NORMALIZE u8_normalize
+#define U_CMP u8_cmp
+#include "u-is-invariant.h"
diff --git a/gnulib/lib/unicase/u8-is-lowercase.c b/gnulib/lib/unicase/u8-is-lowercase.c
new file mode 100644
index 00000000..8501614e
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-lowercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-8 string is entirely lower case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u8_is_lowercase (const uint8_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u8_is_invariant (s, n, u8_tolower, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u8-is-titlecase.c b/gnulib/lib/unicase/u8-is-titlecase.c
new file mode 100644
index 00000000..6357a34e
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-titlecase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-8 string is entirely title case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u8_is_titlecase (const uint8_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u8_is_invariant (s, n, u8_totitle, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u8-is-uppercase.c b/gnulib/lib/unicase/u8-is-uppercase.c
new file mode 100644
index 00000000..817579f3
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-uppercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-8 string is entirely upper case.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u8_is_uppercase (const uint8_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u8_is_invariant (s, n, u8_toupper, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u8-prefix-context.c b/gnulib/lib/unicase/u8-prefix-context.c
new file mode 100644
index 00000000..3f620577
--- /dev/null
+++ b/gnulib/lib/unicase/u8-prefix-context.c
@@ -0,0 +1,33 @@
+/* Case-mapping context of prefix UTF-8 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u8_casing_prefix_context
+#define FUNC2 u8_casing_prefixes_context
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_PREV u8_prev
+#include "u-prefix-context.h"
diff --git a/gnulib/lib/unicase/u8-suffix-context.c b/gnulib/lib/unicase/u8-suffix-context.c
new file mode 100644
index 00000000..1ec43f98
--- /dev/null
+++ b/gnulib/lib/unicase/u8-suffix-context.c
@@ -0,0 +1,32 @@
+/* Case-mapping context of suffix UTF-8 string.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u8_casing_suffix_context
+#define FUNC2 u8_casing_suffixes_context
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#include "u-suffix-context.h"
diff --git a/gnulib/lib/unicase/u8-tolower.c b/gnulib/lib/unicase/u8-tolower.c
new file mode 100644
index 00000000..f657feb3
--- /dev/null
+++ b/gnulib/lib/unicase/u8-tolower.c
@@ -0,0 +1,120 @@
+/* Lowercase mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint8_t *
+u8_tolower (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ return u8_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the lower case of the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_tolower ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unicase/u8-totitle.c b/gnulib/lib/unicase/u8-totitle.c
new file mode 100644
index 00000000..e63cda9e
--- /dev/null
+++ b/gnulib/lib/unicase/u8-totitle.c
@@ -0,0 +1,107 @@
+/* Titlecase mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u8_totitle
+#define UNIT uint8_t
+#define U_CT_TOTITLE u8_ct_totitle
+#include "u-totitle.h"
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the upper case of the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_toupper ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unicase/u8-toupper.c b/gnulib/lib/unicase/u8-toupper.c
new file mode 100644
index 00000000..7429e525
--- /dev/null
+++ b/gnulib/lib/unicase/u8-toupper.c
@@ -0,0 +1,120 @@
+/* Uppercase mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint8_t *
+u8_toupper (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ return u8_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the upper case of the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_toupper ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unicase/ulc-casecmp.c b/gnulib/lib/unicase/ulc-casecmp.c
new file mode 100644
index 00000000..1f343cd5
--- /dev/null
+++ b/gnulib/lib/unicase/ulc-casecmp.c
@@ -0,0 +1,74 @@
+/* Case and normalization insensitive comparison of strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "uninorm.h"
+#include "uniconv.h"
+#include "unistr.h"
+
+static uint8_t *
+ulc_u8_casefold (const char *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ uint8_t convbuf[2048 / sizeof (uint8_t)];
+ uint8_t *conv;
+ size_t conv_length;
+ uint8_t *result;
+
+ /* Convert the string to UTF-8. */
+ conv_length = sizeof (convbuf) / sizeof (uint8_t);
+ conv =
+ u8_conv_from_encoding (locale_charset (), iconveh_error, s, n, NULL,
+ convbuf, &conv_length);
+ if (conv == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ /* Case-fold and normalize. */
+ result = u8_casefold (conv, conv_length, iso639_language, nf,
+ resultbuf, lengthp);
+ if (result == NULL)
+ {
+ if (conv != convbuf)
+ {
+ int saved_errno = errno;
+ free (conv);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (conv != convbuf)
+ free (conv);
+ return result;
+}
+
+#define FUNC ulc_casecmp
+#define UNIT uint8_t
+#define SRC_UNIT char
+#define U_CASEFOLD ulc_u8_casefold
+#define U_CMP2 u8_cmp2
+#include "u-casecmp.h"
diff --git a/gnulib/lib/unicase/ulc-casecoll.c b/gnulib/lib/unicase/ulc-casecoll.c
new file mode 100644
index 00000000..9645e147
--- /dev/null
+++ b/gnulib/lib/unicase/ulc-casecoll.c
@@ -0,0 +1,31 @@
+/* Locale dependent, case and normalization insensitive comparison of strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC ulc_casecoll
+#define UNIT char
+#define U_CASEXFRM ulc_casexfrm
+#include "u-casecoll.h"
diff --git a/gnulib/lib/unicase/ulc-casexfrm.c b/gnulib/lib/unicase/ulc-casexfrm.c
new file mode 100644
index 00000000..89982116
--- /dev/null
+++ b/gnulib/lib/unicase/ulc-casexfrm.c
@@ -0,0 +1,64 @@
+/* Locale dependent transformation for case insensitive comparison of strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "uniconv.h"
+
+char *
+ulc_casexfrm (const char *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ char *resultbuf, size_t *lengthp)
+{
+ uint8_t convbuf[2048 / sizeof (uint8_t)];
+ uint8_t *conv;
+ size_t conv_length;
+ char *result;
+
+ /* Convert the string to UTF-8. */
+ conv_length = sizeof (convbuf) / sizeof (uint8_t);
+ conv =
+ u8_conv_from_encoding (locale_charset (), iconveh_error, s, n, NULL,
+ convbuf, &conv_length);
+ if (conv == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ /* Case-fold and normalize. */
+ result = u8_casexfrm (conv, conv_length, iso639_language, nf,
+ resultbuf, lengthp);
+ if (result == NULL)
+ {
+ if (conv != convbuf)
+ {
+ int saved_errno = errno;
+ free (conv);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (conv != convbuf)
+ free (conv);
+ return result;
+}
diff --git a/gnulib/lib/unicase/unicasemap.h b/gnulib/lib/unicase/unicasemap.h
new file mode 100644
index 00000000..01880834
--- /dev/null
+++ b/gnulib/lib/unicase/unicasemap.h
@@ -0,0 +1,52 @@
+/* Case mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+#include "unitypes.h"
+#include "unicase.h"
+#include "uninorm.h"
+
+extern uint8_t *
+ u8_casemap (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+
+extern uint16_t *
+ u16_casemap (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+
+extern uint32_t *
+ u32_casemap (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
diff --git a/gnulib/lib/unicodeio.c b/gnulib/lib/unicodeio.c
new file mode 100644
index 00000000..6f1f61d2
--- /dev/null
+++ b/gnulib/lib/unicodeio.c
@@ -0,0 +1,214 @@
+/* Unicode character output to streams with locale dependent encoding.
+
+ Copyright (C) 2000-2003, 2006, 2008-2010 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/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicodeio.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include <error.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#include "localcharset.h"
+#include "unistr.h"
+#include "ignore-value.h"
+
+/* When we pass a Unicode character to iconv(), we must pass it in a
+ suitable encoding. The standardized Unicode encodings are
+ UTF-8, UCS-2, UCS-4, UTF-16, UTF-16BE, UTF-16LE, UTF-7.
+ UCS-2 supports only characters up to \U0000FFFF.
+ UTF-16 and variants support only characters up to \U0010FFFF.
+ UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order
+ mark. glibc currently interprets it as big endian without byte order
+ mark, but this is not backed by an RFC.
+ So we use UTF-8. It supports characters up to \U7FFFFFFF and is
+ unambiguously defined. */
+
+/* Luckily, the encoding's name is platform independent. */
+#define UTF8_NAME "UTF-8"
+
+/* Converts the Unicode character CODE to its multibyte representation
+ in the current locale and calls the SUCCESS callback on the resulting
+ byte sequence. If an error occurs, invokes the FAILURE callback instead,
+ passing it CODE and an English error string.
+ Returns whatever the callback returned.
+ Assumes that the locale doesn't change between two calls. */
+long
+unicode_to_mb (unsigned int code,
+ long (*success) (const char *buf, size_t buflen,
+ void *callback_arg),
+ long (*failure) (unsigned int code, const char *msg,
+ void *callback_arg),
+ void *callback_arg)
+{
+ static int initialized;
+ static int is_utf8;
+#if HAVE_ICONV
+ static iconv_t utf8_to_local;
+#endif
+
+ char inbuf[6];
+ int count;
+
+ if (!initialized)
+ {
+ const char *charset = locale_charset ();
+
+ is_utf8 = !strcmp (charset, UTF8_NAME);
+#if HAVE_ICONV
+ if (!is_utf8)
+ {
+ utf8_to_local = iconv_open (charset, UTF8_NAME);
+ if (utf8_to_local == (iconv_t)(-1))
+ /* For an unknown encoding, assume ASCII. */
+ utf8_to_local = iconv_open ("ASCII", UTF8_NAME);
+ }
+#endif
+ initialized = 1;
+ }
+
+ /* Test whether the utf8_to_local converter is available at all. */
+ if (!is_utf8)
+ {
+#if HAVE_ICONV
+ if (utf8_to_local == (iconv_t)(-1))
+ return failure (code, N_("iconv function not usable"), callback_arg);
+#else
+ return failure (code, N_("iconv function not available"), callback_arg);
+#endif
+ }
+
+ /* Convert the character to UTF-8. */
+ count = u8_uctomb ((unsigned char *) inbuf, code, sizeof (inbuf));
+ if (count < 0)
+ return failure (code, N_("character out of range"), callback_arg);
+
+#if HAVE_ICONV
+ if (!is_utf8)
+ {
+ char outbuf[25];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ inptr = inbuf;
+ inbytesleft = count;
+ outptr = outbuf;
+ outbytesleft = sizeof (outbuf);
+
+ /* Convert the character from UTF-8 to the locale's charset. */
+ res = iconv (utf8_to_local,
+ (ICONV_CONST char **)&inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (inbytesleft > 0 || res == (size_t)(-1)
+ /* Irix iconv() inserts a NUL byte if it cannot convert. */
+# if !defined _LIBICONV_VERSION && (defined sgi || defined __sgi)
+ || (res > 0 && code != 0 && outptr - outbuf == 1 && *outbuf == '\0')
+# endif
+ )
+ return failure (code, NULL, callback_arg);
+
+ /* Avoid glibc-2.1 bug and Solaris 7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
+
+ /* Get back to the initial shift state. */
+ res = iconv (utf8_to_local, NULL, NULL, &outptr, &outbytesleft);
+ if (res == (size_t)(-1))
+ return failure (code, NULL, callback_arg);
+# endif
+
+ return success (outbuf, outptr - outbuf, callback_arg);
+ }
+#endif
+
+ /* At this point, is_utf8 is true, so no conversion is needed. */
+ return success (inbuf, count, callback_arg);
+}
+
+/* Simple success callback that outputs the converted string.
+ The STREAM is passed as callback_arg. */
+long
+fwrite_success_callback (const char *buf, size_t buflen, void *callback_arg)
+{
+ FILE *stream = (FILE *) callback_arg;
+
+ /* The return value of fwrite can be ignored here, because under normal
+ conditions (STREAM is an open stream and not wide-character oriented)
+ when fwrite() returns a value != buflen it also sets STREAM's error
+ indicator. */
+ ignore_value (fwrite (buf, 1, buflen, stream));
+ return 0;
+}
+
+/* Simple failure callback that displays an error and exits. */
+static long
+exit_failure_callback (unsigned int code, const char *msg,
+ void *callback_arg _GL_UNUSED)
+{
+ if (msg == NULL)
+ error (1, 0, _("cannot convert U+%04X to local character set"), code);
+ else
+ error (1, 0, _("cannot convert U+%04X to local character set: %s"), code,
+ gettext (msg));
+ return -1;
+}
+
+/* Simple failure callback that displays a fallback representation in plain
+ ASCII, using the same notation as ISO C99 strings. */
+static long
+fallback_failure_callback (unsigned int code,
+ const char *msg _GL_UNUSED,
+ void *callback_arg)
+{
+ FILE *stream = (FILE *) callback_arg;
+
+ if (code < 0x10000)
+ fprintf (stream, "\\u%04X", code);
+ else
+ fprintf (stream, "\\U%08X", code);
+ return -1;
+}
+
+/* Outputs the Unicode character CODE to the output stream STREAM.
+ Upon failure, exit if exit_on_error is true, otherwise output a fallback
+ notation. */
+void
+print_unicode_char (FILE *stream, unsigned int code, int exit_on_error)
+{
+ unicode_to_mb (code, fwrite_success_callback,
+ exit_on_error
+ ? exit_failure_callback
+ : fallback_failure_callback,
+ stream);
+}
diff --git a/gnulib/lib/unicodeio.h b/gnulib/lib/unicodeio.h
new file mode 100644
index 00000000..3dd52cf0
--- /dev/null
+++ b/gnulib/lib/unicodeio.h
@@ -0,0 +1,48 @@
+/* Unicode character output to streams with locale dependent encoding.
+
+ Copyright (C) 2000-2003, 2005, 2008-2010 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/>. */
+
+#ifndef UNICODEIO_H
+# define UNICODEIO_H
+
+# include <stddef.h>
+# include <stdio.h>
+
+/* Converts the Unicode character CODE to its multibyte representation
+ in the current locale and calls the SUCCESS callback on the resulting
+ byte sequence. If an error occurs, invokes the FAILURE callback instead,
+ passing it CODE and an English error string.
+ Returns whatever the callback returned.
+ Assumes that the locale doesn't change between two calls. */
+extern long unicode_to_mb (unsigned int code,
+ long (*success) (const char *buf, size_t buflen,
+ void *callback_arg),
+ long (*failure) (unsigned int code, const char *msg,
+ void *callback_arg),
+ void *callback_arg);
+
+/* Outputs the Unicode character CODE to the output stream STREAM.
+ Upon failure, exit if exit_on_error is true, otherwise output a fallback
+ notation. */
+extern void print_unicode_char (FILE *stream, unsigned int code,
+ int exit_on_error);
+
+/* Simple success callback that outputs the converted string.
+ The STREAM is passed as callback_arg. */
+extern long fwrite_success_callback (const char *buf, size_t buflen,
+ void *callback_arg);
+
+#endif
diff --git a/gnulib/lib/uniconv.h b/gnulib/lib/uniconv.h
new file mode 100644
index 00000000..aa055db4
--- /dev/null
+++ b/gnulib/lib/uniconv.h
@@ -0,0 +1,172 @@
+/* Conversions between Unicode and legacy encodings.
+ Copyright (C) 2002, 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNICONV_H
+#define _UNICONV_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+/* Get enum iconv_ilseq_handler. */
+#include "iconveh.h"
+
+/* Get uniconv_register_autodetect() declaration. */
+#include "striconveha.h"
+
+/* Get locale_charset() declaration. */
+#include "localcharset.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Converts an entire string, possibly including NUL bytes, from one encoding
+ to a Unicode encoding.
+ Converts a memory region given in encoding FROMCODE. FROMCODE is as for
+ iconv_open(3).
+ 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 (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ RESULTBUF and *LENGTHP should initially 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. */
+extern 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);
+extern 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);
+extern 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 Unicode string, possibly including NUL units, from a
+ Unicode encoding to a given encoding.
+ Converts a memory region to encoding TOCODE. TOCODE is as for
+ iconv_open(3).
+ 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 (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ RESULTBUF and *LENGTHP should initially 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 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. */
+extern 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);
+extern 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);
+extern 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 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. */
+extern uint8_t *
+ u8_strconv_from_encoding (const char *string,
+ const char *fromcode,
+ enum iconv_ilseq_handler handler);
+extern uint16_t *
+ u16_strconv_from_encoding (const char *string,
+ const char *fromcode,
+ enum iconv_ilseq_handler handler);
+extern uint32_t *
+ u32_strconv_from_encoding (const char *string,
+ const char *fromcode,
+ 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. */
+extern char *
+ u8_strconv_to_encoding (const uint8_t *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler);
+extern char *
+ u16_strconv_to_encoding (const uint16_t *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler);
+extern char *
+ u32_strconv_to_encoding (const uint32_t *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler);
+
+/* 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. */
+extern uint8_t *
+ u8_strconv_from_locale (const char *string);
+extern uint16_t *
+ u16_strconv_from_locale (const char *string);
+extern uint32_t *
+ u32_strconv_from_locale (const char *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. */
+extern char *
+ u8_strconv_to_locale (const uint8_t *string);
+extern char *
+ u16_strconv_to_locale (const uint16_t *string);
+extern char *
+ u32_strconv_to_locale (const uint32_t *string);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNICONV_H */
diff --git a/gnulib/lib/uniconv/u-conv-from-enc.h b/gnulib/lib/uniconv/u-conv-from-enc.h
new file mode 100644
index 00000000..457bd0f8
--- /dev/null
+++ b/gnulib/lib/uniconv/u-conv-from-enc.h
@@ -0,0 +1,91 @@
+/* Conversion to UTF-16/UTF-32 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const char *fromcode,
+ enum iconv_ilseq_handler handler,
+ const char *src, size_t srclen,
+ size_t *offsets,
+ UNIT *resultbuf, size_t *lengthp)
+{
+#if HAVE_UTF_NAME
+ char *result = (char *) resultbuf;
+ size_t length = *lengthp * sizeof (UNIT);
+
+ if (mem_iconveha (src, srclen, fromcode, UTF_NAME, true, handler,
+ offsets, &result, &length) < 0)
+ return NULL;
+ if (offsets != NULL)
+ {
+ /* Convert 'char *' offsets to 'UNIT *' offsets. */
+ size_t *offsets_end = offsets + srclen;
+ size_t *o;
+
+ for (o = offsets; o < offsets_end; o++)
+ if (*o != (size_t)(-1))
+ *o = *o / sizeof (UNIT);
+ }
+ if ((length % sizeof (UNIT)) != 0)
+ abort ();
+ *lengthp = length / sizeof (UNIT);
+ return (UNIT *) result;
+#else
+ uint8_t *utf8_string;
+ size_t utf8_length;
+ UNIT *result;
+
+ utf8_string =
+ u8_conv_from_encoding (fromcode, handler, src, srclen, offsets,
+ NULL, &utf8_length);
+ if (utf8_string == NULL)
+ return NULL;
+ result = U8_TO_U (utf8_string, utf8_length, resultbuf, lengthp);
+ if (result == NULL)
+ {
+ int saved_errno = errno;
+ free (utf8_string);
+ errno = saved_errno;
+ return NULL;
+ }
+ if (offsets != NULL)
+ {
+ size_t length = *lengthp;
+ size_t *offsets_end = offsets + srclen;
+ size_t *o;
+ size_t off8 = 0; /* offset into utf8_string */
+ size_t offunit = 0; /* offset into result */
+
+ for (o = offsets; o < offsets_end; o++)
+ if (*o != (size_t)(-1))
+ {
+ while (off8 < *o)
+ {
+ int count8 = u8_mblen (utf8_string + off8, utf8_length - off8);
+ int countunit = U_MBLEN (result + offunit, length - offunit);
+ if (count8 < 0 || countunit < 0)
+ abort ();
+ off8 += count8;
+ offunit += countunit;
+ }
+ if (*o != off8)
+ abort ();
+ *o = offunit;
+ }
+ }
+ free (utf8_string);
+ return result;
+#endif
+}
diff --git a/gnulib/lib/uniconv/u-conv-to-enc.h b/gnulib/lib/uniconv/u-conv-to-enc.h
new file mode 100644
index 00000000..43d82c77
--- /dev/null
+++ b/gnulib/lib/uniconv/u-conv-to-enc.h
@@ -0,0 +1,156 @@
+/* Conversion from UTF-16/UTF-32 to legacy encodings.
+ Copyright (C) 2002, 2006-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+char *
+FUNC (const char *tocode,
+ enum iconv_ilseq_handler handler,
+ const UNIT *src, size_t srclen,
+ size_t *offsets,
+ char *resultbuf, size_t *lengthp)
+{
+#if HAVE_UTF_NAME
+ size_t *scaled_offsets;
+ char *result;
+ size_t length;
+
+ if (offsets != NULL && srclen > 0)
+ {
+ scaled_offsets =
+ (size_t *) malloc (srclen * sizeof (UNIT) * sizeof (size_t));
+ if (scaled_offsets == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ else
+ scaled_offsets = NULL;
+
+ result = resultbuf;
+ length = *lengthp;
+ if (mem_iconveha ((const char *) src, srclen * sizeof (UNIT),
+ UTF_NAME, tocode,
+ handler == iconveh_question_mark, handler,
+ scaled_offsets, &result, &length) < 0)
+ {
+ int saved_errno = errno;
+ free (scaled_offsets);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (offsets != NULL)
+ {
+ /* Convert scaled_offsets[srclen * sizeof (UNIT)] to
+ offsets[srclen]. */
+ size_t i;
+
+ for (i = 0; i < srclen; i++)
+ offsets[i] = scaled_offsets[i * sizeof (UNIT)];
+ free (scaled_offsets);
+ }
+
+ if (result == NULL) /* when (resultbuf == NULL && length == 0) */
+ {
+ result = (char *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ *lengthp = length;
+ return result;
+#else
+ uint8_t tmpbuf[4096];
+ size_t tmpbufsize = SIZEOF (tmpbuf);
+ uint8_t *utf8_src;
+ size_t utf8_srclen;
+ size_t *scaled_offsets;
+ char *result;
+
+ utf8_src = U_TO_U8 (src, srclen, tmpbuf, &tmpbufsize);
+ if (utf8_src == NULL)
+ return NULL;
+ utf8_srclen = tmpbufsize;
+
+ if (offsets != NULL && utf8_srclen > 0)
+ {
+ scaled_offsets = (size_t *) malloc (utf8_srclen * sizeof (size_t));
+ if (scaled_offsets == NULL)
+ {
+ if (utf8_src != tmpbuf)
+ free (utf8_src);
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ else
+ scaled_offsets = NULL;
+
+ result = u8_conv_to_encoding (tocode, handler, utf8_src, utf8_srclen,
+ scaled_offsets, resultbuf, lengthp);
+ if (result == NULL)
+ {
+ int saved_errno = errno;
+ free (scaled_offsets);
+ if (utf8_src != tmpbuf)
+ free (utf8_src);
+ errno = saved_errno;
+ return NULL;
+ }
+ if (offsets != NULL)
+ {
+ size_t iunit; /* offset into src */
+ size_t i8; /* offset into utf8_src */
+
+ for (iunit = 0; iunit < srclen; iunit++)
+ offsets[iunit] = (size_t)(-1);
+
+ iunit = 0;
+ i8 = 0;
+ while (iunit < srclen && i8 < utf8_srclen)
+ {
+ int countunit;
+ int count8;
+
+ offsets[iunit] = scaled_offsets[i8];
+
+ countunit = U_MBLEN (src + iunit, srclen - iunit);
+ count8 = u8_mblen (utf8_src + i8, utf8_srclen - i8);
+ if (countunit < 0 || count8 < 0)
+ abort ();
+ iunit += countunit;
+ i8 += count8;
+ }
+ /* Check that utf8_src has been traversed entirely. */
+ if (i8 < utf8_srclen)
+ abort ();
+ /* Check that src has been traversed entirely, except possibly for an
+ incomplete sequence of units at the end. */
+ if (iunit < srclen)
+ {
+ offsets[iunit] = *lengthp;
+ if (!(U_MBLEN (src + iunit, srclen - iunit) < 0))
+ abort ();
+ }
+ free (scaled_offsets);
+ }
+ if (utf8_src != tmpbuf)
+ free (utf8_src);
+ return result;
+#endif
+}
diff --git a/gnulib/lib/uniconv/u-strconv-from-enc.h b/gnulib/lib/uniconv/u-strconv-from-enc.h
new file mode 100644
index 00000000..df91c384
--- /dev/null
+++ b/gnulib/lib/uniconv/u-strconv-from-enc.h
@@ -0,0 +1,40 @@
+/* Conversion to UTF-8/UTF-16/UTF-32 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const char *string,
+ const char *fromcode,
+ enum iconv_ilseq_handler handler)
+{
+ UNIT *result;
+ size_t length;
+
+ result =
+ U_CONV_FROM_ENCODING (fromcode, handler,
+ string, strlen (string) + 1, NULL,
+ NULL, &length);
+ if (result == NULL)
+ return NULL;
+ /* Verify the result has exactly one NUL unit, at the end. */
+ if (!(length > 0 && result[length-1] == 0
+ && U_STRLEN (result) == length-1))
+ {
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ return result;
+}
diff --git a/gnulib/lib/uniconv/u-strconv-to-enc.h b/gnulib/lib/uniconv/u-strconv-to-enc.h
new file mode 100644
index 00000000..c15182f1
--- /dev/null
+++ b/gnulib/lib/uniconv/u-strconv-to-enc.h
@@ -0,0 +1,63 @@
+/* Conversion from UTF-16/UTF-32 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+char *
+FUNC (const UNIT *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler)
+{
+#if HAVE_UTF_NAME
+ char *result = NULL;
+ size_t length = 0;
+
+ if (mem_iconveha ((const char *) string, (U_STRLEN (string) + 1) * sizeof (UNIT),
+ UTF_NAME, tocode,
+ handler == iconveh_question_mark, handler,
+ NULL, &result, &length) < 0)
+ return NULL;
+ /* Verify the result has exactly one NUL byte, at the end. */
+ if (!(length > 0 && result[length-1] == '\0' && strlen (result) == length-1))
+ {
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ return result;
+#else
+ uint8_t tmpbuf[4096];
+ size_t tmpbufsize = SIZEOF (tmpbuf);
+ uint8_t *utf8_string;
+ char *result;
+
+ utf8_string = U_TO_U8 (string, U_STRLEN (string) + 1, tmpbuf, &tmpbufsize);
+ if (utf8_string == NULL)
+ return NULL;
+ result = u8_strconv_to_encoding (utf8_string, tocode, handler);
+ if (result == NULL)
+ {
+ if (utf8_string != tmpbuf)
+ {
+ int saved_errno = errno;
+ free (utf8_string);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+ if (utf8_string != tmpbuf)
+ free (utf8_string);
+ return result;
+#endif
+}
diff --git a/gnulib/lib/uniconv/u16-conv-from-enc.c b/gnulib/lib/uniconv/u16-conv-from-enc.c
new file mode 100644
index 00000000..dc4c21d2
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-conv-from-enc.c
@@ -0,0 +1,47 @@
+/* Conversion to UTF-16 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+/* Name of UTF-16 encoding with machine dependent endianness and alignment. */
+#if defined _LIBICONV_VERSION || (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+# ifdef WORDS_BIGENDIAN
+# define UTF16_NAME "UTF-16BE"
+# else
+# define UTF16_NAME "UTF-16LE"
+# endif
+#endif
+
+#define FUNC u16_conv_from_encoding
+#define UNIT uint16_t
+#define U8_TO_U u8_to_u16
+#define U_MBLEN u16_mblen
+#if defined UTF16_NAME
+# define UTF_NAME UTF16_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-conv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u16-conv-to-enc.c b/gnulib/lib/uniconv/u16-conv-to-enc.c
new file mode 100644
index 00000000..cce454d5
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-conv-to-enc.c
@@ -0,0 +1,177 @@
+/* Conversion from UTF-16 to legacy encodings.
+ Copyright (C) 2002, 2006-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
+
+/* Name of UTF-16 encoding with machine dependent endianness and alignment. */
+#if defined _LIBICONV_VERSION || (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+# ifdef WORDS_BIGENDIAN
+# define UTF16_NAME "UTF-16BE"
+# else
+# define UTF16_NAME "UTF-16LE"
+# endif
+#endif
+
+
+#if !defined UTF16_NAME
+
+/* A variant of u16_to_u8 that treats an incomplete sequence of units at the
+ end as a harmless no-op, rather than reporting it as an EILSEQ error. */
+
+#define FUNC u16_to_u8_lenient
+#define SRC_UNIT uint16_t
+#define DST_UNIT uint8_t
+
+static DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u16_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (count == -2)
+ /* Incomplete sequence of units. */
+ break;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 6 > allocated)
+ allocated = length + 6;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
+
+#undef DST_UNIT
+#undef SRC_UNIT
+#undef FUNC
+
+#endif
+
+
+#define FUNC u16_conv_to_encoding
+#define UNIT uint16_t
+#define U_TO_U8 u16_to_u8_lenient
+#define U_MBLEN u16_mblen
+#if defined UTF16_NAME
+# define UTF_NAME UTF16_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-conv-to-enc.h"
diff --git a/gnulib/lib/uniconv/u16-strconv-from-enc.c b/gnulib/lib/uniconv/u16-strconv-from-enc.c
new file mode 100644
index 00000000..ebdd62e0
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-strconv-from-enc.c
@@ -0,0 +1,34 @@
+/* Conversion to UTF-16 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+
+#define FUNC u16_strconv_from_encoding
+#define UNIT uint16_t
+#define U_CONV_FROM_ENCODING u16_conv_from_encoding
+#define U_STRLEN u16_strlen
+#include "u-strconv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u16-strconv-from-locale.c b/gnulib/lib/uniconv/u16-strconv-from-locale.c
new file mode 100644
index 00000000..c6695d1f
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-strconv-from-locale.c
@@ -0,0 +1,29 @@
+/* Conversion to UTF-16 from the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+uint16_t *
+u16_strconv_from_locale (const char *string)
+{
+ const char *encoding = locale_charset ();
+ return u16_strconv_from_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u16-strconv-to-enc.c b/gnulib/lib/uniconv/u16-strconv-to-enc.c
new file mode 100644
index 00000000..c8e00e76
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-strconv-to-enc.c
@@ -0,0 +1,50 @@
+/* Conversion from UTF-16 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
+
+/* Name of UTF-16 encoding with machine dependent endianness and alignment. */
+#if defined _LIBICONV_VERSION || (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+# ifdef WORDS_BIGENDIAN
+# define UTF16_NAME "UTF-16BE"
+# else
+# define UTF16_NAME "UTF-16LE"
+# endif
+#endif
+
+#define FUNC u16_strconv_to_encoding
+#define UNIT uint16_t
+#define U_TO_U8 u16_to_u8
+#define U_STRLEN u16_strlen
+#if defined UTF16_NAME
+# define UTF_NAME UTF16_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-strconv-to-enc.h"
diff --git a/gnulib/lib/uniconv/u16-strconv-to-locale.c b/gnulib/lib/uniconv/u16-strconv-to-locale.c
new file mode 100644
index 00000000..74fcbed3
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-strconv-to-locale.c
@@ -0,0 +1,29 @@
+/* Conversion from UTF-16 to the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+char *
+u16_strconv_to_locale (const uint16_t *string)
+{
+ const char *encoding = locale_charset ();
+ return u16_strconv_to_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u32-conv-from-enc.c b/gnulib/lib/uniconv/u32-conv-from-enc.c
new file mode 100644
index 00000000..f5c6e8e1
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-conv-from-enc.c
@@ -0,0 +1,46 @@
+/* Conversion to UTF-32 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+/* Name of UTF-32 or UCS-4 encoding with machine dependent endianness and
+ alignment. */
+#if defined _LIBICONV_VERSION
+# define UTF32_NAME "UCS-4-INTERNAL"
+#elif (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+# define UTF32_NAME "WCHAR_T"
+#endif
+
+#define FUNC u32_conv_from_encoding
+#define UNIT uint32_t
+#define U8_TO_U u8_to_u32
+#define U_MBLEN u32_mblen
+#if defined UTF32_NAME
+# define UTF_NAME UTF32_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-conv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u32-conv-to-enc.c b/gnulib/lib/uniconv/u32-conv-to-enc.c
new file mode 100644
index 00000000..7bfc9f46
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-conv-to-enc.c
@@ -0,0 +1,49 @@
+/* Conversion from UTF-32 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
+
+/* Name of UTF-32 or UCS-4 encoding with machine dependent endianness and
+ alignment. */
+#if defined _LIBICONV_VERSION
+# define UTF32_NAME "UCS-4-INTERNAL"
+#elif (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+# define UTF32_NAME "WCHAR_T"
+#endif
+
+#define FUNC u32_conv_to_encoding
+#define UNIT uint32_t
+#define U_TO_U8 u32_to_u8
+#define U_MBLEN u32_mblen
+#if defined UTF32_NAME
+# define UTF_NAME UTF32_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-conv-to-enc.h"
diff --git a/gnulib/lib/uniconv/u32-strconv-from-enc.c b/gnulib/lib/uniconv/u32-strconv-from-enc.c
new file mode 100644
index 00000000..65ff600b
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-strconv-from-enc.c
@@ -0,0 +1,34 @@
+/* Conversion to UTF-32 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+
+#define FUNC u32_strconv_from_encoding
+#define UNIT uint32_t
+#define U_CONV_FROM_ENCODING u32_conv_from_encoding
+#define U_STRLEN u32_strlen
+#include "u-strconv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u32-strconv-from-locale.c b/gnulib/lib/uniconv/u32-strconv-from-locale.c
new file mode 100644
index 00000000..103e41b6
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-strconv-from-locale.c
@@ -0,0 +1,29 @@
+/* Conversion to UTF-32 from the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+uint32_t *
+u32_strconv_from_locale (const char *string)
+{
+ const char *encoding = locale_charset ();
+ return u32_strconv_from_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u32-strconv-to-enc.c b/gnulib/lib/uniconv/u32-strconv-to-enc.c
new file mode 100644
index 00000000..fd45013e
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-strconv-to-enc.c
@@ -0,0 +1,49 @@
+/* Conversion from UTF-32 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
+
+/* Name of UTF-32 or UCS-4 encoding with machine dependent endianness and
+ alignment. */
+#if defined _LIBICONV_VERSION
+# define UTF32_NAME "UCS-4-INTERNAL"
+#elif (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+# define UTF32_NAME "WCHAR_T"
+#endif
+
+#define FUNC u32_strconv_to_encoding
+#define UNIT uint32_t
+#define U_TO_U8 u32_to_u8
+#define U_STRLEN u32_strlen
+#if defined UTF32_NAME
+# define UTF_NAME UTF32_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-strconv-to-enc.h"
diff --git a/gnulib/lib/uniconv/u32-strconv-to-locale.c b/gnulib/lib/uniconv/u32-strconv-to-locale.c
new file mode 100644
index 00000000..57cc47ed
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-strconv-to-locale.c
@@ -0,0 +1,29 @@
+/* Conversion from UTF-32 to the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+char *
+u32_strconv_to_locale (const uint32_t *string)
+{
+ const char *encoding = locale_charset ();
+ return u32_strconv_to_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u8-conv-from-enc.c b/gnulib/lib/uniconv/u8-conv-from-enc.c
new file mode 100644
index 00000000..88d666cc
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-conv-from-enc.c
@@ -0,0 +1,105 @@
+/* Conversion to UTF-8 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-strcaseeq.h"
+#include "striconveha.h"
+#include "unistr.h"
+
+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)
+{
+ if (STRCASEEQ (fromcode, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ {
+ /* Conversion from UTF-8 to UTF-8. No need to go through iconv(). */
+ uint8_t *result;
+
+ if (u8_check ((const uint8_t *) src, srclen))
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+
+ if (offsets != NULL)
+ {
+ size_t i;
+
+ for (i = 0; i < srclen; )
+ {
+ int count = u8_mblen ((const uint8_t *) src + i, srclen - i);
+ /* We can rely on count > 0 because of the previous u8_check. */
+ if (count <= 0)
+ abort ();
+ offsets[i] = i;
+ i++;
+ while (--count > 0)
+ offsets[i++] = (size_t)(-1);
+ }
+ }
+
+ /* Memory allocation. */
+ if (resultbuf != NULL && *lengthp >= srclen)
+ result = resultbuf;
+ else
+ {
+ result = (uint8_t *) malloc (srclen > 0 ? srclen : 1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+
+ memcpy ((char *) result, src, srclen);
+ *lengthp = srclen;
+ return result;
+ }
+ else
+ {
+ char *result = (char *) resultbuf;
+ size_t length = *lengthp;
+
+ if (mem_iconveha (src, srclen, fromcode, "UTF-8", true, handler,
+ offsets, &result, &length) < 0)
+ return NULL;
+
+ if (result == NULL) /* when (resultbuf == NULL && length == 0) */
+ {
+ result = (char *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ *lengthp = length;
+ return (uint8_t *) result;
+ }
+}
diff --git a/gnulib/lib/uniconv/u8-conv-to-enc.c b/gnulib/lib/uniconv/u8-conv-to-enc.c
new file mode 100644
index 00000000..cacf2596
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-conv-to-enc.c
@@ -0,0 +1,92 @@
+/* Conversion from UTF-8 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-strcaseeq.h"
+#include "striconveha.h"
+#include "unistr.h"
+
+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)
+{
+ if (STRCASEEQ (tocode, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ {
+ char *result;
+
+ /* Conversion from UTF-8 to UTF-8. No need to go through iconv(). */
+#if CONFIG_UNICODE_SAFETY
+ if (u8_check (src, srclen))
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+#endif
+
+ /* Memory allocation. */
+ if (resultbuf != NULL && *lengthp >= srclen)
+ result = resultbuf;
+ else
+ {
+ result = (char *) malloc (srclen > 0 ? srclen : 1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+
+ memcpy (result, (const char *) src, srclen);
+ *lengthp = srclen;
+ return result;
+ }
+ else
+ {
+ char *result = resultbuf;
+ size_t length = *lengthp;
+
+ if (mem_iconveha ((const char *) src, srclen,
+ "UTF-8", tocode,
+ handler == iconveh_question_mark, handler,
+ offsets, &result, &length) < 0)
+ return NULL;
+
+ if (result == NULL) /* when (resultbuf == NULL && length == 0) */
+ {
+ result = (char *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ *lengthp = length;
+ return result;
+ }
+}
diff --git a/gnulib/lib/uniconv/u8-strconv-from-enc.c b/gnulib/lib/uniconv/u8-strconv-from-enc.c
new file mode 100644
index 00000000..e1776661
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-strconv-from-enc.c
@@ -0,0 +1,34 @@
+/* Conversion to UTF-8 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+
+#define FUNC u8_strconv_from_encoding
+#define UNIT uint8_t
+#define U_CONV_FROM_ENCODING u8_conv_from_encoding
+#define U_STRLEN u8_strlen
+#include "u-strconv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u8-strconv-from-locale.c b/gnulib/lib/uniconv/u8-strconv-from-locale.c
new file mode 100644
index 00000000..e149ce3a
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-strconv-from-locale.c
@@ -0,0 +1,29 @@
+/* Conversion to UTF-8 from the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+uint8_t *
+u8_strconv_from_locale (const char *string)
+{
+ const char *encoding = locale_charset ();
+ return u8_strconv_from_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u8-strconv-to-enc.c b/gnulib/lib/uniconv/u8-strconv-to-enc.c
new file mode 100644
index 00000000..d593cf1b
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-strconv-to-enc.c
@@ -0,0 +1,79 @@
+/* Conversion from UTF-8 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-strcaseeq.h"
+#include "striconveha.h"
+#include "unistr.h"
+
+char *
+u8_strconv_to_encoding (const uint8_t *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler)
+{
+ char *result;
+ size_t length;
+
+ if (STRCASEEQ (tocode, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ {
+ /* Conversion from UTF-8 to UTF-8. No need to go through iconv(). */
+ length = u8_strlen (string) + 1;
+#if CONFIG_UNICODE_SAFETY
+ if (u8_check (string, length))
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+#endif
+ result = (char *) malloc (length);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ memcpy (result, (const char *) string, length);
+ return result;
+ }
+ else
+ {
+ result = NULL;
+ length = 0;
+ if (mem_iconveha ((const char *) string, u8_strlen (string) + 1,
+ "UTF-8", tocode,
+ handler == iconveh_question_mark, handler,
+ NULL, &result, &length) < 0)
+ return NULL;
+ /* Verify the result has exactly one NUL byte, at the end. */
+ if (!(length > 0 && result[length-1] == '\0'
+ && strlen (result) == length-1))
+ {
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ return result;
+ }
+}
diff --git a/gnulib/lib/uniconv/u8-strconv-to-locale.c b/gnulib/lib/uniconv/u8-strconv-to-locale.c
new file mode 100644
index 00000000..8bdc812f
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-strconv-to-locale.c
@@ -0,0 +1,29 @@
+/* Conversion from UTF-8 to the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+char *
+u8_strconv_to_locale (const uint8_t *string)
+{
+ const char *encoding = locale_charset ();
+ return u8_strconv_to_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/unictype.h b/gnulib/lib/unictype.h
new file mode 100644
index 00000000..a5e59e61
--- /dev/null
+++ b/gnulib/lib/unictype.h
@@ -0,0 +1,717 @@
+/* Unicode character classification and properties.
+ Copyright (C) 2002, 2005-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNICTYPE_H
+#define _UNICTYPE_H
+
+#include "unitypes.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Field 1 of Unicode Character Database: Character name.
+ See "uniname.h". */
+
+/* ========================================================================= */
+
+/* Field 2 of Unicode Character Database: General category. */
+
+/* Data type denoting a General category value. This is not just a bitmask,
+ but rather a bitmask and a pointer to the lookup table, so that programs
+ that use only the predefined bitmasks (i.e. don't combine bitmasks with &
+ and |) don't have a link-time dependency towards the big general table. */
+typedef struct
+{
+ uint32_t bitmask : 31;
+ /*bool*/ unsigned int generic : 1;
+ union
+ {
+ const void *table; /* when generic is 0 */
+ bool (*lookup_fn) (ucs4_t uc, uint32_t bitmask); /* when generic is 1 */
+ } lookup;
+}
+uc_general_category_t;
+
+/* Bits and bit masks denoting General category values. UnicodeData-3.2.0.html
+ says a 32-bit integer will always suffice to represent them.
+ These bit masks can only be used with the uc_is_general_category_withtable
+ function. */
+enum
+{
+ UC_CATEGORY_MASK_L = 0x0000001f,
+ UC_CATEGORY_MASK_Lu = 0x00000001,
+ UC_CATEGORY_MASK_Ll = 0x00000002,
+ UC_CATEGORY_MASK_Lt = 0x00000004,
+ UC_CATEGORY_MASK_Lm = 0x00000008,
+ UC_CATEGORY_MASK_Lo = 0x00000010,
+ UC_CATEGORY_MASK_M = 0x000000e0,
+ UC_CATEGORY_MASK_Mn = 0x00000020,
+ UC_CATEGORY_MASK_Mc = 0x00000040,
+ UC_CATEGORY_MASK_Me = 0x00000080,
+ UC_CATEGORY_MASK_N = 0x00000700,
+ UC_CATEGORY_MASK_Nd = 0x00000100,
+ UC_CATEGORY_MASK_Nl = 0x00000200,
+ UC_CATEGORY_MASK_No = 0x00000400,
+ UC_CATEGORY_MASK_P = 0x0003f800,
+ UC_CATEGORY_MASK_Pc = 0x00000800,
+ UC_CATEGORY_MASK_Pd = 0x00001000,
+ UC_CATEGORY_MASK_Ps = 0x00002000,
+ UC_CATEGORY_MASK_Pe = 0x00004000,
+ UC_CATEGORY_MASK_Pi = 0x00008000,
+ UC_CATEGORY_MASK_Pf = 0x00010000,
+ UC_CATEGORY_MASK_Po = 0x00020000,
+ UC_CATEGORY_MASK_S = 0x003c0000,
+ UC_CATEGORY_MASK_Sm = 0x00040000,
+ UC_CATEGORY_MASK_Sc = 0x00080000,
+ UC_CATEGORY_MASK_Sk = 0x00100000,
+ UC_CATEGORY_MASK_So = 0x00200000,
+ UC_CATEGORY_MASK_Z = 0x01c00000,
+ UC_CATEGORY_MASK_Zs = 0x00400000,
+ UC_CATEGORY_MASK_Zl = 0x00800000,
+ UC_CATEGORY_MASK_Zp = 0x01000000,
+ UC_CATEGORY_MASK_C = 0x3e000000,
+ UC_CATEGORY_MASK_Cc = 0x02000000,
+ UC_CATEGORY_MASK_Cf = 0x04000000,
+ UC_CATEGORY_MASK_Cs = 0x08000000,
+ UC_CATEGORY_MASK_Co = 0x10000000,
+ UC_CATEGORY_MASK_Cn = 0x20000000
+};
+
+/* Predefined General category values. */
+extern const uc_general_category_t UC_CATEGORY_L;
+extern const uc_general_category_t UC_CATEGORY_Lu;
+extern const uc_general_category_t UC_CATEGORY_Ll;
+extern const uc_general_category_t UC_CATEGORY_Lt;
+extern const uc_general_category_t UC_CATEGORY_Lm;
+extern const uc_general_category_t UC_CATEGORY_Lo;
+extern const uc_general_category_t UC_CATEGORY_M;
+extern const uc_general_category_t UC_CATEGORY_Mn;
+extern const uc_general_category_t UC_CATEGORY_Mc;
+extern const uc_general_category_t UC_CATEGORY_Me;
+extern const uc_general_category_t UC_CATEGORY_N;
+extern const uc_general_category_t UC_CATEGORY_Nd;
+extern const uc_general_category_t UC_CATEGORY_Nl;
+extern const uc_general_category_t UC_CATEGORY_No;
+extern const uc_general_category_t UC_CATEGORY_P;
+extern const uc_general_category_t UC_CATEGORY_Pc;
+extern const uc_general_category_t UC_CATEGORY_Pd;
+extern const uc_general_category_t UC_CATEGORY_Ps;
+extern const uc_general_category_t UC_CATEGORY_Pe;
+extern const uc_general_category_t UC_CATEGORY_Pi;
+extern const uc_general_category_t UC_CATEGORY_Pf;
+extern const uc_general_category_t UC_CATEGORY_Po;
+extern const uc_general_category_t UC_CATEGORY_S;
+extern const uc_general_category_t UC_CATEGORY_Sm;
+extern const uc_general_category_t UC_CATEGORY_Sc;
+extern const uc_general_category_t UC_CATEGORY_Sk;
+extern const uc_general_category_t UC_CATEGORY_So;
+extern const uc_general_category_t UC_CATEGORY_Z;
+extern const uc_general_category_t UC_CATEGORY_Zs;
+extern const uc_general_category_t UC_CATEGORY_Zl;
+extern const uc_general_category_t UC_CATEGORY_Zp;
+extern const uc_general_category_t UC_CATEGORY_C;
+extern const uc_general_category_t UC_CATEGORY_Cc;
+extern const uc_general_category_t UC_CATEGORY_Cf;
+extern const uc_general_category_t UC_CATEGORY_Cs;
+extern const uc_general_category_t UC_CATEGORY_Co;
+extern const uc_general_category_t UC_CATEGORY_Cn;
+/* Non-public. */
+extern const uc_general_category_t _UC_CATEGORY_NONE;
+
+/* Alias names for predefined General category values. */
+#define UC_LETTER UC_CATEGORY_L
+#define UC_UPPERCASE_LETTER UC_CATEGORY_Lu
+#define UC_LOWERCASE_LETTER UC_CATEGORY_Ll
+#define UC_TITLECASE_LETTER UC_CATEGORY_Lt
+#define UC_MODIFIER_LETTER UC_CATEGORY_Lm
+#define UC_OTHER_LETTER UC_CATEGORY_Lo
+#define UC_MARK UC_CATEGORY_M
+#define UC_NON_SPACING_MARK UC_CATEGORY_Mn
+#define UC_COMBINING_SPACING_MARK UC_CATEGORY_Mc
+#define UC_ENCLOSING_MARK UC_CATEGORY_Me
+#define UC_NUMBER UC_CATEGORY_N
+#define UC_DECIMAL_DIGIT_NUMBER UC_CATEGORY_Nd
+#define UC_LETTER_NUMBER UC_CATEGORY_Nl
+#define UC_OTHER_NUMBER UC_CATEGORY_No
+#define UC_PUNCTUATION UC_CATEGORY_P
+#define UC_CONNECTOR_PUNCTUATION UC_CATEGORY_Pc
+#define UC_DASH_PUNCTUATION UC_CATEGORY_Pd
+#define UC_OPEN_PUNCTUATION UC_CATEGORY_Ps /* a.k.a. UC_START_PUNCTUATION */
+#define UC_CLOSE_PUNCTUATION UC_CATEGORY_Pe /* a.k.a. UC_END_PUNCTUATION */
+#define UC_INITIAL_QUOTE_PUNCTUATION UC_CATEGORY_Pi
+#define UC_FINAL_QUOTE_PUNCTUATION UC_CATEGORY_Pf
+#define UC_OTHER_PUNCTUATION UC_CATEGORY_Po
+#define UC_SYMBOL UC_CATEGORY_S
+#define UC_MATH_SYMBOL UC_CATEGORY_Sm
+#define UC_CURRENCY_SYMBOL UC_CATEGORY_Sc
+#define UC_MODIFIER_SYMBOL UC_CATEGORY_Sk
+#define UC_OTHER_SYMBOL UC_CATEGORY_So
+#define UC_SEPARATOR UC_CATEGORY_Z
+#define UC_SPACE_SEPARATOR UC_CATEGORY_Zs
+#define UC_LINE_SEPARATOR UC_CATEGORY_Zl
+#define UC_PARAGRAPH_SEPARATOR UC_CATEGORY_Zp
+#define UC_OTHER UC_CATEGORY_C
+#define UC_CONTROL UC_CATEGORY_Cc
+#define UC_FORMAT UC_CATEGORY_Cf
+#define UC_SURROGATE UC_CATEGORY_Cs /* all of them are invalid characters */
+#define UC_PRIVATE_USE UC_CATEGORY_Co
+#define UC_UNASSIGNED UC_CATEGORY_Cn /* some of them are invalid characters */
+
+/* Return the union of two general categories.
+ This corresponds to the unions of the two sets of characters. */
+extern uc_general_category_t
+ uc_general_category_or (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return the intersection of two general categories as bit masks.
+ This *does*not* correspond to the intersection of the two sets of
+ characters. */
+extern uc_general_category_t
+ uc_general_category_and (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return 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. */
+extern uc_general_category_t
+ uc_general_category_and_not (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return the name of a general category. */
+extern const char *
+ uc_general_category_name (uc_general_category_t category);
+
+/* Return the general category given by name, e.g. "Lu". */
+extern uc_general_category_t
+ uc_general_category_byname (const char *category_name);
+
+/* Return the general category of a Unicode character. */
+extern uc_general_category_t
+ uc_general_category (ucs4_t uc);
+
+/* Test whether a Unicode character belongs to a given category.
+ The CATEGORY argument can be the combination of several predefined
+ general categories. */
+extern bool
+ uc_is_general_category (ucs4_t uc, uc_general_category_t category);
+/* Likewise. This function uses a big table comprising all categories. */
+extern bool
+ uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask);
+
+/* ========================================================================= */
+
+/* Field 3 of Unicode Character Database: Canonical combining class. */
+
+/* The possible results of uc_combining_class (0..255) are described in
+ UCD.html. The list here is not definitive; more values can be added
+ in future versions. */
+enum
+{
+ UC_CCC_NR = 0, /* Not Reordered */
+ UC_CCC_OV = 1, /* Overlay */
+ UC_CCC_NK = 7, /* Nukta */
+ UC_CCC_KV = 8, /* Kana Voicing */
+ UC_CCC_VR = 9, /* Virama */
+ UC_CCC_ATBL = 200, /* Attached Below Left */
+ UC_CCC_ATB = 202, /* Attached Below */
+ UC_CCC_ATAR = 216, /* Attached Above Right */
+ UC_CCC_BL = 218, /* Below Left */
+ UC_CCC_B = 220, /* Below */
+ UC_CCC_BR = 222, /* Below Right */
+ UC_CCC_L = 224, /* Left */
+ UC_CCC_R = 226, /* Right */
+ UC_CCC_AL = 228, /* Above Left */
+ UC_CCC_A = 230, /* Above */
+ UC_CCC_AR = 232, /* Above Right */
+ UC_CCC_DB = 233, /* Double Below */
+ UC_CCC_DA = 234, /* Double Above */
+ UC_CCC_IS = 240 /* Iota Subscript */
+};
+
+/* Return the canonical combining class of a Unicode character. */
+extern int
+ uc_combining_class (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Field 4 of Unicode Character Database: Bidirectional category. */
+
+enum
+{
+ UC_BIDI_L, /* Left-to-Right */
+ UC_BIDI_LRE, /* Left-to-Right Embedding */
+ UC_BIDI_LRO, /* Left-to-Right Override */
+ UC_BIDI_R, /* Right-to-Left */
+ UC_BIDI_AL, /* Right-to-Left Arabic */
+ UC_BIDI_RLE, /* Right-to-Left Embedding */
+ UC_BIDI_RLO, /* Right-to-Left Override */
+ UC_BIDI_PDF, /* Pop Directional Format */
+ UC_BIDI_EN, /* European Number */
+ UC_BIDI_ES, /* European Number Separator */
+ UC_BIDI_ET, /* European Number Terminator */
+ UC_BIDI_AN, /* Arabic Number */
+ UC_BIDI_CS, /* Common Number Separator */
+ UC_BIDI_NSM, /* Non-Spacing Mark */
+ UC_BIDI_BN, /* Boundary Neutral */
+ UC_BIDI_B, /* Paragraph Separator */
+ UC_BIDI_S, /* Segment Separator */
+ UC_BIDI_WS, /* Whitespace */
+ UC_BIDI_ON /* Other Neutral */
+};
+
+/* Return the name of a bidirectional category. */
+extern const char *
+ uc_bidi_category_name (int category);
+
+/* Return the bidirectional category given by name, e.g. "LRE". */
+extern int
+ uc_bidi_category_byname (const char *category_name);
+
+/* Return the bidirectional category of a Unicode character. */
+extern int
+ uc_bidi_category (ucs4_t uc);
+
+/* Test whether a Unicode character belongs to a given bidirectional
+ category. */
+extern bool
+ uc_is_bidi_category (ucs4_t uc, int category);
+
+/* ========================================================================= */
+
+/* Field 5 of Unicode Character Database: Character decomposition mapping.
+ See "uninorm.h". */
+
+/* ========================================================================= */
+
+/* Field 6 of Unicode Character Database: Decimal digit value. */
+
+/* Return the decimal digit value of a Unicode character. */
+extern int
+ uc_decimal_value (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Field 7 of Unicode Character Database: Digit value. */
+
+/* Return the digit value of a Unicode character. */
+extern int
+ uc_digit_value (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Field 8 of Unicode Character Database: Numeric value. */
+
+/* Return the numeric value of a Unicode character. */
+typedef struct
+{
+ int numerator;
+ int denominator;
+}
+uc_fraction_t;
+extern uc_fraction_t
+ uc_numeric_value (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Field 9 of Unicode Character Database: Mirrored. */
+
+/* Return the mirrored character of a Unicode character UC in *PUC. */
+extern bool
+ uc_mirror_char (ucs4_t uc, ucs4_t *puc);
+
+/* ========================================================================= */
+
+/* Field 10 of Unicode Character Database: Unicode 1.0 Name.
+ Not available in this library. */
+
+/* ========================================================================= */
+
+/* Field 11 of Unicode Character Database: ISO 10646 comment.
+ Not available in this library. */
+
+/* ========================================================================= */
+
+/* Field 12, 13, 14 of Unicode Character Database: Uppercase mapping,
+ lowercase mapping, titlecase mapping. See "unicase.h". */
+
+/* ========================================================================= */
+
+/* Common API for properties. */
+
+/* Data type denoting a property. This is not just a number, but rather a
+ pointer to the test functions, so that programs that use only few of the
+ properties don't have a link-time dependency towards all the tables. */
+typedef struct
+{
+ bool (*test_fn) (ucs4_t uc);
+}
+uc_property_t;
+
+/* Predefined properties. */
+/* General. */
+extern const uc_property_t UC_PROPERTY_WHITE_SPACE;
+extern const uc_property_t UC_PROPERTY_ALPHABETIC;
+extern const uc_property_t UC_PROPERTY_OTHER_ALPHABETIC;
+extern const uc_property_t UC_PROPERTY_NOT_A_CHARACTER;
+extern const uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT;
+extern const uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT;
+extern const uc_property_t UC_PROPERTY_DEPRECATED;
+extern const uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION;
+extern const uc_property_t UC_PROPERTY_VARIATION_SELECTOR;
+extern const uc_property_t UC_PROPERTY_PRIVATE_USE;
+extern const uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE;
+/* Case. */
+extern const uc_property_t UC_PROPERTY_UPPERCASE;
+extern const uc_property_t UC_PROPERTY_OTHER_UPPERCASE;
+extern const uc_property_t UC_PROPERTY_LOWERCASE;
+extern const uc_property_t UC_PROPERTY_OTHER_LOWERCASE;
+extern const uc_property_t UC_PROPERTY_TITLECASE;
+extern const uc_property_t UC_PROPERTY_SOFT_DOTTED;
+/* Identifiers. */
+extern const uc_property_t UC_PROPERTY_ID_START;
+extern const uc_property_t UC_PROPERTY_OTHER_ID_START;
+extern const uc_property_t UC_PROPERTY_ID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_XID_START;
+extern const uc_property_t UC_PROPERTY_XID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE;
+extern const uc_property_t UC_PROPERTY_PATTERN_SYNTAX;
+/* Shaping and rendering. */
+extern const uc_property_t UC_PROPERTY_JOIN_CONTROL;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_BASE;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_EXTEND;
+extern const uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_LINK;
+/* Bidi. */
+extern const uc_property_t UC_PROPERTY_BIDI_CONTROL;
+extern const uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT;
+extern const uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT;
+extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT;
+extern const uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT;
+extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT;
+extern const uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_WHITESPACE;
+extern const uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK;
+extern const uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL;
+extern const uc_property_t UC_PROPERTY_BIDI_PDF;
+extern const uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE;
+extern const uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL;
+/* Numeric. */
+extern const uc_property_t UC_PROPERTY_HEX_DIGIT;
+extern const uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT;
+/* CJK. */
+extern const uc_property_t UC_PROPERTY_IDEOGRAPHIC;
+extern const uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH;
+extern const uc_property_t UC_PROPERTY_RADICAL;
+extern const uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR;
+extern const uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR;
+/* Misc. */
+extern const uc_property_t UC_PROPERTY_ZERO_WIDTH;
+extern const uc_property_t UC_PROPERTY_SPACE;
+extern const uc_property_t UC_PROPERTY_NON_BREAK;
+extern const uc_property_t UC_PROPERTY_ISO_CONTROL;
+extern const uc_property_t UC_PROPERTY_FORMAT_CONTROL;
+extern const uc_property_t UC_PROPERTY_DASH;
+extern const uc_property_t UC_PROPERTY_HYPHEN;
+extern const uc_property_t UC_PROPERTY_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_LINE_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_QUOTATION_MARK;
+extern const uc_property_t UC_PROPERTY_SENTENCE_TERMINAL;
+extern const uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_CURRENCY_SYMBOL;
+extern const uc_property_t UC_PROPERTY_MATH;
+extern const uc_property_t UC_PROPERTY_OTHER_MATH;
+extern const uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_LEFT_OF_PAIR;
+extern const uc_property_t UC_PROPERTY_COMBINING;
+extern const uc_property_t UC_PROPERTY_COMPOSITE;
+extern const uc_property_t UC_PROPERTY_DECIMAL_DIGIT;
+extern const uc_property_t UC_PROPERTY_NUMERIC;
+extern const uc_property_t UC_PROPERTY_DIACRITIC;
+extern const uc_property_t UC_PROPERTY_EXTENDER;
+extern const uc_property_t UC_PROPERTY_IGNORABLE_CONTROL;
+
+/* Return the property given by name, e.g. "White space". */
+extern uc_property_t
+ uc_property_byname (const char *property_name);
+
+/* Test whether a property is valid. */
+#define uc_property_is_valid(property) ((property).test_fn != NULL)
+
+/* Test whether a Unicode character has a given property. */
+extern bool
+ uc_is_property (ucs4_t uc, uc_property_t property);
+extern bool uc_is_property_white_space (ucs4_t uc);
+extern bool uc_is_property_alphabetic (ucs4_t uc);
+extern bool uc_is_property_other_alphabetic (ucs4_t uc);
+extern bool uc_is_property_not_a_character (ucs4_t uc);
+extern bool uc_is_property_default_ignorable_code_point (ucs4_t uc);
+extern bool uc_is_property_other_default_ignorable_code_point (ucs4_t uc);
+extern bool uc_is_property_deprecated (ucs4_t uc);
+extern bool uc_is_property_logical_order_exception (ucs4_t uc);
+extern bool uc_is_property_variation_selector (ucs4_t uc);
+extern bool uc_is_property_private_use (ucs4_t uc);
+extern bool uc_is_property_unassigned_code_value (ucs4_t uc);
+extern bool uc_is_property_uppercase (ucs4_t uc);
+extern bool uc_is_property_other_uppercase (ucs4_t uc);
+extern bool uc_is_property_lowercase (ucs4_t uc);
+extern bool uc_is_property_other_lowercase (ucs4_t uc);
+extern bool uc_is_property_titlecase (ucs4_t uc);
+extern bool uc_is_property_soft_dotted (ucs4_t uc);
+extern bool uc_is_property_id_start (ucs4_t uc);
+extern bool uc_is_property_other_id_start (ucs4_t uc);
+extern bool uc_is_property_id_continue (ucs4_t uc);
+extern bool uc_is_property_other_id_continue (ucs4_t uc);
+extern bool uc_is_property_xid_start (ucs4_t uc);
+extern bool uc_is_property_xid_continue (ucs4_t uc);
+extern bool uc_is_property_pattern_white_space (ucs4_t uc);
+extern bool uc_is_property_pattern_syntax (ucs4_t uc);
+extern bool uc_is_property_join_control (ucs4_t uc);
+extern bool uc_is_property_grapheme_base (ucs4_t uc);
+extern bool uc_is_property_grapheme_extend (ucs4_t uc);
+extern bool uc_is_property_other_grapheme_extend (ucs4_t uc);
+extern bool uc_is_property_grapheme_link (ucs4_t uc);
+extern bool uc_is_property_bidi_control (ucs4_t uc);
+extern bool uc_is_property_bidi_left_to_right (ucs4_t uc);
+extern bool uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc);
+extern bool uc_is_property_bidi_arabic_right_to_left (ucs4_t uc);
+extern bool uc_is_property_bidi_european_digit (ucs4_t uc);
+extern bool uc_is_property_bidi_eur_num_separator (ucs4_t uc);
+extern bool uc_is_property_bidi_eur_num_terminator (ucs4_t uc);
+extern bool uc_is_property_bidi_arabic_digit (ucs4_t uc);
+extern bool uc_is_property_bidi_common_separator (ucs4_t uc);
+extern bool uc_is_property_bidi_block_separator (ucs4_t uc);
+extern bool uc_is_property_bidi_segment_separator (ucs4_t uc);
+extern bool uc_is_property_bidi_whitespace (ucs4_t uc);
+extern bool uc_is_property_bidi_non_spacing_mark (ucs4_t uc);
+extern bool uc_is_property_bidi_boundary_neutral (ucs4_t uc);
+extern bool uc_is_property_bidi_pdf (ucs4_t uc);
+extern bool uc_is_property_bidi_embedding_or_override (ucs4_t uc);
+extern bool uc_is_property_bidi_other_neutral (ucs4_t uc);
+extern bool uc_is_property_hex_digit (ucs4_t uc);
+extern bool uc_is_property_ascii_hex_digit (ucs4_t uc);
+extern bool uc_is_property_ideographic (ucs4_t uc);
+extern bool uc_is_property_unified_ideograph (ucs4_t uc);
+extern bool uc_is_property_radical (ucs4_t uc);
+extern bool uc_is_property_ids_binary_operator (ucs4_t uc);
+extern bool uc_is_property_ids_trinary_operator (ucs4_t uc);
+extern bool uc_is_property_zero_width (ucs4_t uc);
+extern bool uc_is_property_space (ucs4_t uc);
+extern bool uc_is_property_non_break (ucs4_t uc);
+extern bool uc_is_property_iso_control (ucs4_t uc);
+extern bool uc_is_property_format_control (ucs4_t uc);
+extern bool uc_is_property_dash (ucs4_t uc);
+extern bool uc_is_property_hyphen (ucs4_t uc);
+extern bool uc_is_property_punctuation (ucs4_t uc);
+extern bool uc_is_property_line_separator (ucs4_t uc);
+extern bool uc_is_property_paragraph_separator (ucs4_t uc);
+extern bool uc_is_property_quotation_mark (ucs4_t uc);
+extern bool uc_is_property_sentence_terminal (ucs4_t uc);
+extern bool uc_is_property_terminal_punctuation (ucs4_t uc);
+extern bool uc_is_property_currency_symbol (ucs4_t uc);
+extern bool uc_is_property_math (ucs4_t uc);
+extern bool uc_is_property_other_math (ucs4_t uc);
+extern bool uc_is_property_paired_punctuation (ucs4_t uc);
+extern bool uc_is_property_left_of_pair (ucs4_t uc);
+extern bool uc_is_property_combining (ucs4_t uc);
+extern bool uc_is_property_composite (ucs4_t uc);
+extern bool uc_is_property_decimal_digit (ucs4_t uc);
+extern bool uc_is_property_numeric (ucs4_t uc);
+extern bool uc_is_property_diacritic (ucs4_t uc);
+extern bool uc_is_property_extender (ucs4_t uc);
+extern bool uc_is_property_ignorable_control (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Subdivision of the Unicode characters into scripts. */
+
+typedef struct
+{
+ unsigned int code : 21;
+ unsigned int start : 1;
+ unsigned int end : 1;
+}
+uc_interval_t;
+typedef struct
+{
+ unsigned int nintervals;
+ const uc_interval_t *intervals;
+ const char *name;
+}
+uc_script_t;
+
+/* Return the script of a Unicode character. */
+extern const uc_script_t *
+ uc_script (ucs4_t uc);
+
+/* Return the script given by name, e.g. "HAN". */
+extern const uc_script_t *
+ uc_script_byname (const char *script_name);
+
+/* Test whether a Unicode character belongs to a given script. */
+extern bool
+ uc_is_script (ucs4_t uc, const uc_script_t *script);
+
+/* Get the list of all scripts. */
+extern void
+ uc_all_scripts (const uc_script_t **scripts, size_t *count);
+
+/* ========================================================================= */
+
+/* Subdivision of the Unicode character range into blocks. */
+
+typedef struct
+{
+ ucs4_t start;
+ ucs4_t end;
+ const char *name;
+}
+uc_block_t;
+
+/* Return the block a character belongs to. */
+extern const uc_block_t *
+ uc_block (ucs4_t uc);
+
+/* Test whether a Unicode character belongs to a given block. */
+extern bool
+ uc_is_block (ucs4_t uc, const uc_block_t *block);
+
+/* Get the list of all blocks. */
+extern void
+ uc_all_blocks (const uc_block_t **blocks, size_t *count);
+
+/* ========================================================================= */
+
+/* Properties taken from language standards. */
+
+/* Test whether a Unicode character is considered whitespace in ISO C 99. */
+extern bool
+ uc_is_c_whitespace (ucs4_t uc);
+
+/* Test whether a Unicode character is considered whitespace in Java. */
+extern bool
+ uc_is_java_whitespace (ucs4_t uc);
+
+enum
+{
+ UC_IDENTIFIER_START, /* valid as first or subsequent character */
+ UC_IDENTIFIER_VALID, /* valid as subsequent character only */
+ UC_IDENTIFIER_INVALID, /* not valid */
+ UC_IDENTIFIER_IGNORABLE /* ignorable (Java only) */
+};
+
+/* Return the categorization of a Unicode character w.r.t. the ISO C 99
+ identifier syntax. */
+extern int
+ uc_c_ident_category (ucs4_t uc);
+
+/* Return the categorization of a Unicode character w.r.t. the Java
+ identifier syntax. */
+extern int
+ uc_java_ident_category (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Like ISO C <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. */
+
+/* Test for any character for which 'uc_is_alpha' or 'uc_is_digit' is true. */
+extern bool
+ uc_is_alnum (ucs4_t uc);
+
+/* Test 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. */
+extern bool
+ uc_is_alpha (ucs4_t uc);
+
+/* Test for any control character. */
+extern bool
+ uc_is_cntrl (ucs4_t uc);
+
+/* Test for any character that corresponds to a decimal-digit character. */
+extern bool
+ uc_is_digit (ucs4_t uc);
+
+/* Test for any character for which 'uc_is_print' is true and 'uc_is_space'
+ is false. */
+extern bool
+ uc_is_graph (ucs4_t uc);
+
+/* Test 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. */
+extern bool
+ uc_is_lower (ucs4_t uc);
+
+/* Test for any printing character. */
+extern bool
+ uc_is_print (ucs4_t uc);
+
+/* Test 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. */
+extern bool
+ uc_is_punct (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. */
+extern bool
+ uc_is_space (ucs4_t uc);
+
+/* Test for any character that corresponds to an uppercase letter or is one
+ of a locale-specific set of character for which none of 'uc_is_cntrl',
+ 'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true. */
+extern bool
+ uc_is_upper (ucs4_t uc);
+
+/* Test for any character that corresponds to a hexadecimal-digit
+ character. */
+extern bool
+ uc_is_xdigit (ucs4_t uc);
+
+/* GNU extension. */
+/* Test for any character that corresponds to a standard blank character or
+ a locale-specific set of characters for which 'uc_is_alnum' is false. */
+extern bool
+ uc_is_blank (ucs4_t uc);
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNICTYPE_H */
diff --git a/gnulib/lib/unictype/3level.h b/gnulib/lib/unictype/3level.h
new file mode 100644
index 00000000..0c7b2d8d
--- /dev/null
+++ b/gnulib/lib/unictype/3level.h
@@ -0,0 +1,327 @@
+/* Copyright (C) 2000-2001, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Bruno Haible <haible@clisp.cons.org>, 2000.
+
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ 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 2, 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+/* Construction of sparse 3-level tables.
+ See wchar-lookup.h or coll-lookup.h for their structure and the
+ meaning of p and q.
+
+ Before including this file, set
+ TABLE to the name of the structure to be defined
+ ELEMENT to the type of every entry
+ DEFAULT to the default value for empty entries
+ ITERATE if you want the TABLE_iterate function to be defined
+ NO_FINALIZE if you don't want the TABLE_finalize function to be defined
+
+ This will define
+
+ struct TABLE;
+ void TABLE_init (struct TABLE *t);
+ ELEMENT TABLE_get (struct TABLE *t, uint32_t wc);
+ void TABLE_add (struct TABLE *t, uint32_t wc, ELEMENT value);
+ void TABLE_iterate (struct TABLE *t,
+ void (*fn) (uint32_t wc, ELEMENT value));
+ void TABLE_finalize (struct TABLE *t);
+*/
+
+#define CONCAT(a,b) CONCAT1(a,b)
+#define CONCAT1(a,b) a##b
+
+struct TABLE
+{
+ /* Parameters. */
+ unsigned int p;
+ unsigned int q;
+ /* Working representation. */
+ size_t level1_alloc;
+ size_t level1_size;
+ uint32_t *level1;
+ size_t level2_alloc;
+ size_t level2_size;
+ uint32_t *level2;
+ size_t level3_alloc;
+ size_t level3_size;
+ ELEMENT *level3;
+ /* Compressed representation. */
+ size_t result_size;
+ char *result;
+};
+
+/* Initialize. Assumes t->p and t->q have already been set. */
+static inline void
+CONCAT(TABLE,_init) (struct TABLE *t)
+{
+ t->level1 = NULL;
+ t->level1_alloc = t->level1_size = 0;
+ t->level2 = NULL;
+ t->level2_alloc = t->level2_size = 0;
+ t->level3 = NULL;
+ t->level3_alloc = t->level3_size = 0;
+}
+
+/* Marker for an empty slot. This has the value 0xFFFFFFFF, regardless
+ whether 'int' is 16 bit, 32 bit, or 64 bit. */
+#define EMPTY ((uint32_t) ~0)
+
+/* Retrieve an entry. */
+static inline ELEMENT
+CONCAT(TABLE,_get) (struct TABLE *t, uint32_t wc)
+{
+ uint32_t index1 = wc >> (t->q + t->p);
+ if (index1 < t->level1_size)
+ {
+ uint32_t lookup1 = t->level1[index1];
+ if (lookup1 != EMPTY)
+ {
+ uint32_t index2 = ((wc >> t->p) & ((1 << t->q) - 1))
+ + (lookup1 << t->q);
+ uint32_t lookup2 = t->level2[index2];
+ if (lookup2 != EMPTY)
+ {
+ uint32_t index3 = (wc & ((1 << t->p) - 1))
+ + (lookup2 << t->p);
+ ELEMENT lookup3 = t->level3[index3];
+
+ return lookup3;
+ }
+ }
+ }
+ return DEFAULT;
+}
+
+/* Add one entry. */
+static void
+CONCAT(TABLE,_add) (struct TABLE *t, uint32_t wc, ELEMENT value)
+{
+ uint32_t index1 = wc >> (t->q + t->p);
+ uint32_t index2 = (wc >> t->p) & ((1 << t->q) - 1);
+ uint32_t index3 = wc & ((1 << t->p) - 1);
+ size_t i, i1, i2;
+
+ if (value == CONCAT(TABLE,_get) (t, wc))
+ return;
+
+ if (index1 >= t->level1_size)
+ {
+ if (index1 >= t->level1_alloc)
+ {
+ size_t alloc = 2 * t->level1_alloc;
+ if (alloc <= index1)
+ alloc = index1 + 1;
+ t->level1 = (uint32_t *) xrealloc ((char *) t->level1,
+ alloc * sizeof (uint32_t));
+ t->level1_alloc = alloc;
+ }
+ while (index1 >= t->level1_size)
+ t->level1[t->level1_size++] = EMPTY;
+ }
+
+ if (t->level1[index1] == EMPTY)
+ {
+ if (t->level2_size == t->level2_alloc)
+ {
+ size_t alloc = 2 * t->level2_alloc + 1;
+ t->level2 = (uint32_t *) xrealloc ((char *) t->level2,
+ (alloc << t->q) * sizeof (uint32_t));
+ t->level2_alloc = alloc;
+ }
+ i1 = t->level2_size << t->q;
+ i2 = (t->level2_size + 1) << t->q;
+ for (i = i1; i < i2; i++)
+ t->level2[i] = EMPTY;
+ t->level1[index1] = t->level2_size++;
+ }
+
+ index2 += t->level1[index1] << t->q;
+
+ if (t->level2[index2] == EMPTY)
+ {
+ if (t->level3_size == t->level3_alloc)
+ {
+ size_t alloc = 2 * t->level3_alloc + 1;
+ t->level3 = (ELEMENT *) xrealloc ((char *) t->level3,
+ (alloc << t->p) * sizeof (ELEMENT));
+ t->level3_alloc = alloc;
+ }
+ i1 = t->level3_size << t->p;
+ i2 = (t->level3_size + 1) << t->p;
+ for (i = i1; i < i2; i++)
+ t->level3[i] = DEFAULT;
+ t->level2[index2] = t->level3_size++;
+ }
+
+ index3 += t->level2[index2] << t->p;
+
+ t->level3[index3] = value;
+}
+
+#ifdef ITERATE
+/* Apply a function to all entries in the table. */
+static void
+CONCAT(TABLE,_iterate) (struct TABLE *t,
+ void (*fn) (uint32_t wc, ELEMENT value))
+{
+ uint32_t index1;
+ for (index1 = 0; index1 < t->level1_size; index1++)
+ {
+ uint32_t lookup1 = t->level1[index1];
+ if (lookup1 != EMPTY)
+ {
+ uint32_t lookup1_shifted = lookup1 << t->q;
+ uint32_t index2;
+ for (index2 = 0; index2 < (1 << t->q); index2++)
+ {
+ uint32_t lookup2 = t->level2[index2 + lookup1_shifted];
+ if (lookup2 != EMPTY)
+ {
+ uint32_t lookup2_shifted = lookup2 << t->p;
+ uint32_t index3;
+ for (index3 = 0; index3 < (1 << t->p); index3++)
+ {
+ ELEMENT lookup3 = t->level3[index3 + lookup2_shifted];
+ if (lookup3 != DEFAULT)
+ fn ((((index1 << t->q) + index2) << t->p) + index3,
+ lookup3);
+ }
+ }
+ }
+ }
+ }
+}
+#endif
+
+#ifndef NO_FINALIZE
+/* Finalize and shrink. */
+static void
+CONCAT(TABLE,_finalize) (struct TABLE *t)
+{
+ size_t i, j, k;
+ uint32_t reorder3[t->level3_size];
+ uint32_t reorder2[t->level2_size];
+ uint32_t level1_offset, level2_offset, level3_offset, last_offset;
+
+ /* Uniquify level3 blocks. */
+ k = 0;
+ for (j = 0; j < t->level3_size; j++)
+ {
+ for (i = 0; i < k; i++)
+ if (memcmp (&t->level3[i << t->p], &t->level3[j << t->p],
+ (1 << t->p) * sizeof (ELEMENT)) == 0)
+ break;
+ /* Relocate block j to block i. */
+ reorder3[j] = i;
+ if (i == k)
+ {
+ if (i != j)
+ memcpy (&t->level3[i << t->p], &t->level3[j << t->p],
+ (1 << t->p) * sizeof (ELEMENT));
+ k++;
+ }
+ }
+ t->level3_size = k;
+
+ for (i = 0; i < (t->level2_size << t->q); i++)
+ if (t->level2[i] != EMPTY)
+ t->level2[i] = reorder3[t->level2[i]];
+
+ /* Uniquify level2 blocks. */
+ k = 0;
+ for (j = 0; j < t->level2_size; j++)
+ {
+ for (i = 0; i < k; i++)
+ if (memcmp (&t->level2[i << t->q], &t->level2[j << t->q],
+ (1 << t->q) * sizeof (uint32_t)) == 0)
+ break;
+ /* Relocate block j to block i. */
+ reorder2[j] = i;
+ if (i == k)
+ {
+ if (i != j)
+ memcpy (&t->level2[i << t->q], &t->level2[j << t->q],
+ (1 << t->q) * sizeof (uint32_t));
+ k++;
+ }
+ }
+ t->level2_size = k;
+
+ for (i = 0; i < t->level1_size; i++)
+ if (t->level1[i] != EMPTY)
+ t->level1[i] = reorder2[t->level1[i]];
+
+ /* Create and fill the resulting compressed representation. */
+ last_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t)
+ + (t->level2_size << t->q) * sizeof (uint32_t)
+ + (t->level3_size << t->p) * sizeof (ELEMENT);
+ t->result_size = (last_offset + 3) & ~3ul;
+ t->result = (char *) xmalloc (t->result_size);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t)
+ + (t->level2_size << t->q) * sizeof (uint32_t);
+
+ ((uint32_t *) t->result)[0] = t->q + t->p;
+ ((uint32_t *) t->result)[1] = t->level1_size;
+ ((uint32_t *) t->result)[2] = t->p;
+ ((uint32_t *) t->result)[3] = (1 << t->q) - 1;
+ ((uint32_t *) t->result)[4] = (1 << t->p) - 1;
+
+ for (i = 0; i < t->level1_size; i++)
+ ((uint32_t *) (t->result + level1_offset))[i] =
+ (t->level1[i] == EMPTY
+ ? 0
+ : (t->level1[i] << t->q) * sizeof (uint32_t) + level2_offset);
+
+ for (i = 0; i < (t->level2_size << t->q); i++)
+ ((uint32_t *) (t->result + level2_offset))[i] =
+ (t->level2[i] == EMPTY
+ ? 0
+ : (t->level2[i] << t->p) * sizeof (ELEMENT) + level3_offset);
+
+ for (i = 0; i < (t->level3_size << t->p); i++)
+ ((ELEMENT *) (t->result + level3_offset))[i] = t->level3[i];
+
+ if (last_offset < t->result_size)
+ memset (t->result + last_offset, 0, t->result_size - last_offset);
+
+ if (t->level1_alloc > 0)
+ free (t->level1);
+ if (t->level2_alloc > 0)
+ free (t->level2);
+ if (t->level3_alloc > 0)
+ free (t->level3);
+}
+#endif
+
+#undef EMPTY
+#undef TABLE
+#undef ELEMENT
+#undef DEFAULT
+#undef ITERATE
+#undef NO_FINALIZE
diff --git a/gnulib/lib/unictype/3levelbit.h b/gnulib/lib/unictype/3levelbit.h
new file mode 100644
index 00000000..9ebc762c
--- /dev/null
+++ b/gnulib/lib/unictype/3levelbit.h
@@ -0,0 +1,317 @@
+/* Copyright (C) 2000-2002, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Bruno Haible <haible@clisp.cons.org>, 2000.
+
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ See glibc/locale/programs/ld-ctype.c.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ 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 2, 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, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+/* Construction of sparse 3-level tables.
+ See wchar-lookup.h for their structure and the meaning of p and q.
+
+ Before including this file, set
+ TABLE to the name of the structure to be defined
+ ITERATE if you want the TABLE_iterate function to be defined
+ NO_FINALIZE if you don't want the TABLE_finalize function to be defined
+
+ This will define
+
+ struct TABLE;
+ void TABLE_init (struct TABLE *t);
+ int TABLE_get (struct TABLE *t, uint32_t wc);
+ void TABLE_add (struct TABLE *t, uint32_t wc);
+ void TABLE_iterate (struct TABLE *t, void (*fn) (uint32_t wc));
+ void TABLE_finalize (struct TABLE *t);
+*/
+
+#define CONCAT(a,b) CONCAT1(a,b)
+#define CONCAT1(a,b) a##b
+
+struct TABLE
+{
+ /* Parameters. */
+ unsigned int p;
+ unsigned int q;
+ /* Working representation. */
+ size_t level1_alloc;
+ size_t level1_size;
+ uint32_t *level1;
+ size_t level2_alloc;
+ size_t level2_size;
+ uint32_t *level2;
+ size_t level3_alloc;
+ size_t level3_size;
+ uint32_t *level3;
+ /* Compressed representation. */
+ size_t result_size;
+ char *result;
+};
+
+/* Initialize. Assumes t->p and t->q have already been set. */
+static inline void
+CONCAT(TABLE,_init) (struct TABLE *t)
+{
+ t->level1 = NULL;
+ t->level1_alloc = t->level1_size = 0;
+ t->level2 = NULL;
+ t->level2_alloc = t->level2_size = 0;
+ t->level3 = NULL;
+ t->level3_alloc = t->level3_size = 0;
+}
+
+/* Marker for an empty slot. This has the value 0xFFFFFFFF, regardless
+ whether 'int' is 16 bit, 32 bit, or 64 bit. */
+#define EMPTY ((uint32_t) ~0)
+
+/* Retrieve an entry. */
+static inline int
+CONCAT(TABLE,_get) (struct TABLE *t, uint32_t wc)
+{
+ uint32_t index1 = wc >> (t->q + t->p + 5);
+ if (index1 < t->level1_size)
+ {
+ uint32_t lookup1 = t->level1[index1];
+ if (lookup1 != EMPTY)
+ {
+ uint32_t index2 = ((wc >> (t->p + 5)) & ((1 << t->q) - 1))
+ + (lookup1 << t->q);
+ uint32_t lookup2 = t->level2[index2];
+ if (lookup2 != EMPTY)
+ {
+ uint32_t index3 = ((wc >> 5) & ((1 << t->p) - 1))
+ + (lookup2 << t->p);
+ uint32_t lookup3 = t->level3[index3];
+ uint32_t index4 = wc & 0x1f;
+
+ return (lookup3 >> index4) & 1;
+ }
+ }
+ }
+ return 0;
+}
+
+/* Add one entry. */
+static void
+CONCAT(TABLE,_add) (struct TABLE *t, uint32_t wc)
+{
+ uint32_t index1 = wc >> (t->q + t->p + 5);
+ uint32_t index2 = (wc >> (t->p + 5)) & ((1 << t->q) - 1);
+ uint32_t index3 = (wc >> 5) & ((1 << t->p) - 1);
+ uint32_t index4 = wc & 0x1f;
+ size_t i, i1, i2;
+
+ if (index1 >= t->level1_size)
+ {
+ if (index1 >= t->level1_alloc)
+ {
+ size_t alloc = 2 * t->level1_alloc;
+ if (alloc <= index1)
+ alloc = index1 + 1;
+ t->level1 = (uint32_t *) xrealloc ((char *) t->level1,
+ alloc * sizeof (uint32_t));
+ t->level1_alloc = alloc;
+ }
+ while (index1 >= t->level1_size)
+ t->level1[t->level1_size++] = EMPTY;
+ }
+
+ if (t->level1[index1] == EMPTY)
+ {
+ if (t->level2_size == t->level2_alloc)
+ {
+ size_t alloc = 2 * t->level2_alloc + 1;
+ t->level2 = (uint32_t *) xrealloc ((char *) t->level2,
+ (alloc << t->q) * sizeof (uint32_t));
+ t->level2_alloc = alloc;
+ }
+ i1 = t->level2_size << t->q;
+ i2 = (t->level2_size + 1) << t->q;
+ for (i = i1; i < i2; i++)
+ t->level2[i] = EMPTY;
+ t->level1[index1] = t->level2_size++;
+ }
+
+ index2 += t->level1[index1] << t->q;
+
+ if (t->level2[index2] == EMPTY)
+ {
+ if (t->level3_size == t->level3_alloc)
+ {
+ size_t alloc = 2 * t->level3_alloc + 1;
+ t->level3 = (uint32_t *) xrealloc ((char *) t->level3,
+ (alloc << t->p) * sizeof (uint32_t));
+ t->level3_alloc = alloc;
+ }
+ i1 = t->level3_size << t->p;
+ i2 = (t->level3_size + 1) << t->p;
+ for (i = i1; i < i2; i++)
+ t->level3[i] = 0;
+ t->level2[index2] = t->level3_size++;
+ }
+
+ index3 += t->level2[index2] << t->p;
+
+ t->level3[index3] |= (uint32_t)1 << index4;
+}
+
+#ifdef ITERATE
+/* Apply a function to all entries in the table. */
+static void
+CONCAT(TABLE,_iterate) (struct TABLE *t, void (*fn) (uint32_t wc))
+{
+ uint32_t index1;
+ for (index1 = 0; index1 < t->level1_size; index1++)
+ {
+ uint32_t lookup1 = t->level1[index1];
+ if (lookup1 != EMPTY)
+ {
+ uint32_t lookup1_shifted = lookup1 << t->q;
+ uint32_t index2;
+ for (index2 = 0; index2 < (1 << t->q); index2++)
+ {
+ uint32_t lookup2 = t->level2[index2 + lookup1_shifted];
+ if (lookup2 != EMPTY)
+ {
+ uint32_t lookup2_shifted = lookup2 << t->p;
+ uint32_t index3;
+ for (index3 = 0; index3 < (1 << t->p); index3++)
+ {
+ uint32_t lookup3 = t->level3[index3 + lookup2_shifted];
+ uint32_t index4;
+ for (index4 = 0; index4 < 32; index4++)
+ if ((lookup3 >> index4) & 1)
+ fn ((((((index1 << t->q) + index2) << t->p) + index3) << 5) + index4);
+ }
+ }
+ }
+ }
+ }
+}
+#endif
+
+#ifndef NO_FINALIZE
+/* Finalize and shrink. */
+static void
+CONCAT(TABLE,_finalize) (struct TABLE *t)
+{
+ size_t i, j, k;
+ uint32_t reorder3[t->level3_size];
+ uint32_t reorder2[t->level2_size];
+ uint32_t level1_offset, level2_offset, level3_offset;
+
+ /* Uniquify level3 blocks. */
+ k = 0;
+ for (j = 0; j < t->level3_size; j++)
+ {
+ for (i = 0; i < k; i++)
+ if (memcmp (&t->level3[i << t->p], &t->level3[j << t->p],
+ (1 << t->p) * sizeof (uint32_t)) == 0)
+ break;
+ /* Relocate block j to block i. */
+ reorder3[j] = i;
+ if (i == k)
+ {
+ if (i != j)
+ memcpy (&t->level3[i << t->p], &t->level3[j << t->p],
+ (1 << t->p) * sizeof (uint32_t));
+ k++;
+ }
+ }
+ t->level3_size = k;
+
+ for (i = 0; i < (t->level2_size << t->q); i++)
+ if (t->level2[i] != EMPTY)
+ t->level2[i] = reorder3[t->level2[i]];
+
+ /* Uniquify level2 blocks. */
+ k = 0;
+ for (j = 0; j < t->level2_size; j++)
+ {
+ for (i = 0; i < k; i++)
+ if (memcmp (&t->level2[i << t->q], &t->level2[j << t->q],
+ (1 << t->q) * sizeof (uint32_t)) == 0)
+ break;
+ /* Relocate block j to block i. */
+ reorder2[j] = i;
+ if (i == k)
+ {
+ if (i != j)
+ memcpy (&t->level2[i << t->q], &t->level2[j << t->q],
+ (1 << t->q) * sizeof (uint32_t));
+ k++;
+ }
+ }
+ t->level2_size = k;
+
+ for (i = 0; i < t->level1_size; i++)
+ if (t->level1[i] != EMPTY)
+ t->level1[i] = reorder2[t->level1[i]];
+
+ /* Create and fill the resulting compressed representation. */
+ t->result_size =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t)
+ + (t->level2_size << t->q) * sizeof (uint32_t)
+ + (t->level3_size << t->p) * sizeof (uint32_t);
+ t->result = (char *) xmalloc (t->result_size);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t)
+ + (t->level2_size << t->q) * sizeof (uint32_t);
+
+ ((uint32_t *) t->result)[0] = t->q + t->p + 5;
+ ((uint32_t *) t->result)[1] = t->level1_size;
+ ((uint32_t *) t->result)[2] = t->p + 5;
+ ((uint32_t *) t->result)[3] = (1 << t->q) - 1;
+ ((uint32_t *) t->result)[4] = (1 << t->p) - 1;
+
+ for (i = 0; i < t->level1_size; i++)
+ ((uint32_t *) (t->result + level1_offset))[i] =
+ (t->level1[i] == EMPTY
+ ? 0
+ : (t->level1[i] << t->q) * sizeof (uint32_t) + level2_offset);
+
+ for (i = 0; i < (t->level2_size << t->q); i++)
+ ((uint32_t *) (t->result + level2_offset))[i] =
+ (t->level2[i] == EMPTY
+ ? 0
+ : (t->level2[i] << t->p) * sizeof (uint32_t) + level3_offset);
+
+ for (i = 0; i < (t->level3_size << t->p); i++)
+ ((uint32_t *) (t->result + level3_offset))[i] = t->level3[i];
+
+ if (t->level1_alloc > 0)
+ free (t->level1);
+ if (t->level2_alloc > 0)
+ free (t->level2);
+ if (t->level3_alloc > 0)
+ free (t->level3);
+}
+#endif
+
+#undef EMPTY
+#undef TABLE
+#undef ITERATE
+#undef NO_FINALIZE
diff --git a/gnulib/lib/unictype/bidi_byname.c b/gnulib/lib/unictype/bidi_byname.c
new file mode 100644
index 00000000..868f05dc
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_byname.c
@@ -0,0 +1,171 @@
+/* Bidi categories of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+int
+uc_bidi_category_byname (const char *category_name)
+{
+ switch (category_name[0])
+ {
+ case 'A':
+ switch (category_name[1])
+ {
+ case 'L':
+ if (category_name[2] == '\0')
+ return UC_BIDI_AL;
+ break;
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_AN;
+ break;
+ }
+ break;
+ case 'B':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_B;
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_BN;
+ break;
+ }
+ break;
+ case 'C':
+ switch (category_name[1])
+ {
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_CS;
+ break;
+ }
+ break;
+ case 'E':
+ switch (category_name[1])
+ {
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_EN;
+ break;
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ES;
+ break;
+ case 'T':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ET;
+ break;
+ }
+ break;
+ case 'L':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_L;
+ case 'R':
+ switch (category_name[2])
+ {
+ case 'E':
+ if (category_name[3] == '\0')
+ return UC_BIDI_LRE;
+ break;
+ case 'O':
+ if (category_name[3] == '\0')
+ return UC_BIDI_LRO;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'N':
+ switch (category_name[1])
+ {
+ case 'S':
+ switch (category_name[2])
+ {
+ case 'M':
+ if (category_name[3] == '\0')
+ return UC_BIDI_NSM;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'O':
+ switch (category_name[1])
+ {
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ON;
+ break;
+ }
+ break;
+ case 'P':
+ switch (category_name[1])
+ {
+ case 'D':
+ switch (category_name[2])
+ {
+ case 'F':
+ if (category_name[3] == '\0')
+ return UC_BIDI_PDF;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'R':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_R;
+ case 'L':
+ switch (category_name[2])
+ {
+ case 'E':
+ if (category_name[3] == '\0')
+ return UC_BIDI_RLE;
+ break;
+ case 'O':
+ if (category_name[3] == '\0')
+ return UC_BIDI_RLO;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'S':
+ if (category_name[1] == '\0')
+ return UC_BIDI_S;
+ break;
+ case 'W':
+ switch (category_name[1])
+ {
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_WS;
+ break;
+ }
+ break;
+ }
+ /* Invalid category name. */
+ return -1;
+}
diff --git a/gnulib/lib/unictype/bidi_name.c b/gnulib/lib/unictype/bidi_name.c
new file mode 100644
index 00000000..28bb4baa
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_name.c
@@ -0,0 +1,35 @@
+/* Bidi categories of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static const char u_bidi_category_name[19][4] =
+{
+ "L", "LRE", "LRO", "R", "AL", "RLE", "RLO", "PDF", "EN", "ES",
+ "ET", "AN", "CS", "NSM", "BN", "B", "S", "WS", "ON"
+};
+
+const char *
+uc_bidi_category_name (int category)
+{
+ if (category >= 0 && category < sizeof (u_bidi_category_name) / sizeof (u_bidi_category_name[0]))
+ return u_bidi_category_name[category];
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/bidi_of.c b/gnulib/lib/unictype/bidi_of.c
new file mode 100644
index 00000000..4a293a87
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_of.c
@@ -0,0 +1,52 @@
+/* Bidi categories of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_bidi_category table. */
+#include "bidi_of.h"
+
+int
+uc_bidi_category (ucs4_t uc)
+{
+ unsigned int index1 = uc >> bidi_category_header_0;
+ if (index1 < bidi_category_header_1)
+ {
+ int lookup1 = u_bidi_category.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> bidi_category_header_2) & bidi_category_header_3;
+ int lookup2 = u_bidi_category.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = ((uc & bidi_category_header_4) + lookup2) * 5;
+ /* level3 contains 5-bit values, packed into 16-bit words. */
+ unsigned int lookup3 =
+ ((u_bidi_category.level3[index3>>4]
+ | (u_bidi_category.level3[(index3>>4)+1] << 16))
+ >> (index3 % 16))
+ & 0x1f;
+
+ return lookup3;
+ }
+ }
+ }
+ return UC_BIDI_L;
+}
diff --git a/gnulib/lib/unictype/bidi_of.h b/gnulib/lib/unictype/bidi_of.h
new file mode 100644
index 00000000..9f6875be
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_of.h
@@ -0,0 +1,789 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Bidi categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define bidi_category_header_0 16
+#define bidi_category_header_1 17
+#define bidi_category_header_2 7
+#define bidi_category_header_3 511
+#define bidi_category_header_4 127
+static const
+struct
+ {
+ int level1[17];
+ short level2[4 << 9];
+ unsigned short level3[101 * 40 + 1];
+ }
+u_bidi_category =
+{
+ {
+ 0, 512, 1024, 1024, 1024, 1024, 1024, 1024,
+ 1024, 1024, 1024, 1024, 1024, 1024, 1536, 1024,
+ 1024
+ },
+ {
+ 0, 128, -1, -1, -1, 256, 384, 512,
+ -1, 640, -1, 768, 896, 1024, 1152, 1280,
+ 1408, 1408, 1536, 1664, 1792, 1920, 2048, 2176,
+ 2304, 2432, 2560, 2688, 2816, 2944, 3072, 3200,
+ 3328, 3456, -1, -1, -1, -1, 3584, 3712,
+ -1, -1, -1, -1, -1, 3840, 3968, 4096,
+ 4224, 4352, 4480, 4608, 4736, -1, 4864, 4992,
+ 5120, -1, -1, 5248, -1, -1, -1, 5376,
+ 5504, 5632, 5760, 5888, 6016, 6144, 6272, 6400,
+ 6528, 6656, 6144, 6144, 6144, 6784, 6912, 7040,
+ -1, -1, 6144, 6144, 6144, 6144, 7168, -1,
+ -1, 7296, -1, 7424, 7552, 7680, 6144, 7808,
+ 7936, 8064, -1, 8192, 8320, 8448, 8576, 8704,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8832, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8960, -1, -1, 9088, -1, 9216, 9344,
+ 9472, 9600, 9728, -1, 9856, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 9984, 10112,
+ 10112, 10112, 10240, 10368, 10496, 10624, 10752, 10880,
+ -1, -1, 11008, 11136, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 1408, 1408, 11264, 1408, 11392, 1408, 1408, 1408,
+ 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 11520, 11648, 11776, -1, 11904, -1,
+ -1, -1, -1, -1, -1, -1, -1, 12032,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 12160, 12288, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 12416,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 12416,
+ 12544, 12544, 12672, 12800, 12544, 12544, 12544, 12544,
+ 12544, 12544, 12544, 12544, 12544, 12544, 12544, 12544,
+ 12544, 12544, 12544, 12544, 12544, 12544, 12544, 12544,
+ 12544, 12544, 12544, 12544, 12544, 12544, 12544, 12544,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 12416
+ },
+ {
+ 0x39ce, 0x9ce7, 0x0e73, 0x183e, 0x739f, 0x39ce, 0x9ce7, 0xce73,
+ 0xf739, 0x83de, 0x4a51, 0x94a5, 0x5294, 0xc4ca, 0x6312, 0x2108,
+ 0x1084, 0x0842, 0x2931, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x94a5, 0x0012, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x74a5,
+ 0x39ce, 0x9ee7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0x2a4c, 0x94a5, 0x5294, 0x2902, 0x949d, 0x214a,
+ 0x8124, 0x1294, 0x2901, 0x94a5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4000, 0x004a, 0x0000, 0x4800, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4800, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0xa400,
+ 0x5294, 0x294a, 0x9025, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0x0000, 0x2520, 0x0000, 0x0000, 0x0480,
+ 0x0000, 0x2520, 0x0090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0004, 0x0000, 0x0000,
+ 0x8000, 0x5ad6, 0xad6b, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0048, 0x0000, 0xb5a3, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x68da, 0xb5a3, 0xdad1, 0x6368, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0xad6b, 0x8845, 0x4494, 0xc229, 0x9488, 0xb5ad, 0x5ad6, 0xad6b,
+ 0x4235, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xd690,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x235a, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5a9, 0x2108, 0x108d, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x4842, 0xad6b, 0xd6b5, 0x6b56, 0xb5ad, 0x08d6,
+ 0x4d69, 0xd6b6, 0x211a, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x7108, 0x11a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x4235,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x4842, 0xad6b, 0xd6b5, 0x6b5a, 0x108d,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0xd68c, 0x6b5a, 0xb5ad, 0x8636, 0x5294, 0x318e, 0x18c6,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0x35a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0xb5a0, 0x5ad6, 0x0d6b, 0x0000,
+ 0x001a, 0xb5a0, 0x00d6, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x01a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0xb5a0, 0x00d6, 0x0000, 0x0000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x2800, 0x0005, 0x0000, 0x0000, 0x0000,
+ 0x35a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0x35a0, 0x0000, 0x0d68, 0xd680,
+ 0x001a, 0x01a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x01ad, 0x1a00, 0x0000, 0x0000, 0x0000,
+ 0x35a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0xb5a0, 0x1ad6, 0x0d68, 0x0000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0140, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x01a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x6800, 0xb5a0, 0x00d6, 0x0000, 0x0000,
+ 0x001a, 0x0000, 0x4000, 0x0003, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x0000, 0x0000, 0x0000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa529, 0x5294, 0x0049, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6b40, 0x000d, 0x4000, 0x0d6b, 0xd6b4,
+ 0x001a, 0x0000, 0x5a00, 0x0003, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5200, 0x294a, 0x04a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x4a40, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5a0, 0x00d6, 0x0000, 0x0000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0034,
+ 0x0000, 0xb400, 0x40d6, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01a0,
+ 0x5ad0, 0xad6b, 0x0035, 0x5000, 0x0000, 0x0000, 0xad68, 0xd6b5,
+ 0x035a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01a0,
+ 0x5ad0, 0xad6b, 0xd681, 0x0000, 0x0000, 0x0000, 0xad00, 0xd6b5,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad00,
+ 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x1a00, 0xa068, 0x2949, 0x0025, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xb5a0, 0x5ad6, 0xad6b, 0xd6b5, 0x035a,
+ 0xb5ad, 0x40d6, 0x006b, 0x0000, 0x0000, 0xb5ad, 0x5ad6, 0xa06b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x0000, 0x0000, 0x4000, 0x0003, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b5a, 0xb40d,
+ 0x5ad6, 0xa06b, 0x0035, 0x035a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xad00, 0x0001, 0x6b40, 0x000d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xb5a0, 0x00d6, 0x0000, 0x0000, 0x0000,
+ 0x3400, 0x5a00, 0x0003, 0x0000, 0x001a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6800, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2900, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x00d6, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400,
+ 0x00d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xb400, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xb400, 0x0006, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xad68, 0xd6b5, 0x001a, 0x0000, 0x4000, 0xa003, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x0006, 0x0000, 0x0500, 0x001a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x0002, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0xd6ca, 0x045a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0001, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x35ad, 0x0000, 0x0d68, 0x0000, 0x0000, 0x3400,
+ 0x0000, 0xa000, 0x06b5, 0x0000, 0x0012, 0x2520, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9480, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d68,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xb5ad, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x40d0, 0xad6b, 0xd035, 0x0000, 0x3400, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xd680, 0x6b5a, 0xb5ad, 0x0006, 0x0000, 0x0000, 0x0000,
+ 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xb400, 0x1ad6, 0xad00, 0x0001, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd000, 0x6b5a, 0xb5ad,
+ 0x4006, 0x006b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b40,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x9024, 0x0252, 0x0000, 0x0000, 0x0000,
+ 0x94a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x94a4, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x94a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x04a4,
+ 0xc631, 0x6318, 0x318c, 0xe746, 0x181c, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0xf194, 0x7285, 0x6184, 0x294a,
+ 0xa4a5, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa4c9, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x8ca5, 0x39ce, 0x08e7,
+ 0x8421, 0xe738, 0x739c, 0x0008, 0x1080, 0x0842, 0x24a5, 0x04a5,
+ 0x2108, 0x1084, 0x0842, 0x24a5, 0x04a5, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x14a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0x000d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0252, 0xa529, 0x5204, 0x0002, 0x0000, 0x0000, 0x8120, 0x1294,
+ 0x0000, 0x9480, 0x4a52, 0x2409, 0x4090, 0x0002, 0x0280, 0x0000,
+ 0x0000, 0x0000, 0x0948, 0x0000, 0x4a52, 0x0129, 0x0000, 0x2948,
+ 0x0025, 0x0000, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x2652, 0xa525, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0x2529, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x8129, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x0094, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x0004, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x004a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x0894, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x0421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2948, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x0025, 0x4a52, 0xa529, 0x5294, 0x094a, 0x94a4, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x0001, 0x4a52, 0x0009, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a40, 0x8129, 0x5294, 0x2002, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x4094, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x094a,
+ 0x9024, 0x4a52, 0x8000, 0x5204, 0x294a, 0x04a5, 0x4a40, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0129, 0x5200,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a40,
+ 0xa529, 0x5294, 0x294a, 0x04a5, 0x4a52, 0xa529, 0x5294, 0x204a,
+ 0x0001, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x0001, 0x4a52, 0x0129, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa400,
+ 0x5294, 0x004a, 0x0000, 0x0000, 0x0000, 0x4000, 0x294a, 0x94a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0012,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x2902, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0x2529, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x094a, 0x0000,
+ 0x4a51, 0x0129, 0x5200, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x0012, 0x0000, 0x0000, 0xd6b4, 0x6b5a, 0x0012,
+ 0x8000, 0x0094, 0x0000, 0x94a4, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0x2935, 0x0001, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x04a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x04a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a40,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000, 0x0000, 0x2000,
+ 0x94a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5290, 0x004a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9480, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x0004, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x94a4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6800, 0x35ad, 0x0009, 0x0000, 0xd000, 0x949a,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x0252, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3400, 0x4000, 0x0003, 0x0680, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5a00, 0x5203, 0x094a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa520, 0x0094, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4000, 0xad6b, 0xd6b5, 0x001a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad68, 0xd6b5,
+ 0x6b5a, 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xd6b5, 0x035a, 0x35a0,
+ 0x5a00, 0x0003, 0x0000, 0x0000, 0x8000, 0x0006, 0x0000, 0xd000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x1b46, 0x8c63, 0xc631, 0x2318, 0x318d, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x9488, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7,
+ 0xce73, 0xe739, 0x739c, 0x1084, 0x0842, 0x8421, 0x4210, 0x2124,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0x4a52, 0xa529, 0x5294,
+ 0x4212, 0x2108, 0xb5ad, 0x5ad6, 0x8423, 0x4210, 0x2108, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x324c, 0x9922, 0x5294, 0x294a, 0x54a5, 0xa652, 0xa524,
+ 0x5224, 0x4929, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x7108,
+ 0x4a40, 0x94a5, 0x5294, 0xc4ca, 0x6312, 0x2108, 0x1084, 0x0842,
+ 0x2931, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2900, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x94a5, 0x4a52, 0x2529,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x494a, 0x9529,
+ 0x5202, 0x294a, 0x04a5, 0x39ce, 0x9ce7, 0x4e73, 0x294a, 0x73a5,
+ 0x0240, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x004a, 0x0000, 0x4a52, 0xa529, 0x5294,
+ 0x094a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001a,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0x90c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0xb5a3, 0x5a36, 0x631b, 0xd18c, 0x6b5a, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0xad18, 0x31b5, 0x68c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xad68, 0x0001, 0x0000, 0x0000, 0x9ce7, 0xce73, 0xd6b9, 0x6b5a,
+ 0x35ad, 0x5a00, 0xad6b, 0x06b5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6b4, 0x001a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0xb652, 0x24d6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4200, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x094a, 0x0000, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7380,
+ 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739,
+ 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7,
+ 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c,
+ 0x0000
+ }
+};
diff --git a/gnulib/lib/unictype/bidi_test.c b/gnulib/lib/unictype/bidi_test.c
new file mode 100644
index 00000000..0a9fa5c9
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_test.c
@@ -0,0 +1,27 @@
+/* Bidi categories of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_bidi_category (ucs4_t uc, int category)
+{
+ return (uc_bidi_category (uc) == category);
+}
diff --git a/gnulib/lib/unictype/bitmap.h b/gnulib/lib/unictype/bitmap.h
new file mode 100644
index 00000000..4e743c5e
--- /dev/null
+++ b/gnulib/lib/unictype/bitmap.h
@@ -0,0 +1,47 @@
+/* Three-level bitmap lookup.
+ Copyright (C) 2000-2002, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2000-2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+static inline int bitmap_lookup (const void *table, ucs4_t uc);
+
+/* These values are currently hardcoded into gen-ctype.c. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+
+static inline int
+bitmap_lookup (const void *table, ucs4_t uc)
+{
+ unsigned int index1 = uc >> header_0;
+ if (index1 < ((const int *) table)[0])
+ {
+ int lookup1 = ((const int *) table)[1 + index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> header_2) & header_3;
+ int lookup2 = ((const short *) table)[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc >> 5) & header_4;
+ unsigned int lookup3 = ((const int *) table)[lookup2 + index3];
+
+ return (lookup3 >> (uc & 0x1f)) & 1;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unictype/block_test.c b/gnulib/lib/unictype/block_test.c
new file mode 100644
index 00000000..04722b49
--- /dev/null
+++ b/gnulib/lib/unictype/block_test.c
@@ -0,0 +1,31 @@
+/* Blocks of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_block (ucs4_t uc, const uc_block_t *block)
+{
+ if (block != NULL)
+ return ((ucs4_t) (uc - block->start) <= block->end - block->start);
+ else
+ return false;
+}
+
diff --git a/gnulib/lib/unictype/blocks.c b/gnulib/lib/unictype/blocks.c
new file mode 100644
index 00000000..e83e5469
--- /dev/null
+++ b/gnulib/lib/unictype/blocks.c
@@ -0,0 +1,62 @@
+/* Blocks of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "blocks.h"
+
+const uc_block_t *
+uc_block (ucs4_t uc)
+{
+ unsigned int first_index;
+ unsigned int last_index;
+
+ if (uc < blocks_level1_threshold)
+ {
+ unsigned int index1 = uc >> blocks_level1_shift;
+ first_index = blocks_level1[2 * index1];
+ last_index = blocks_level1[2 * index1 + 1];
+ }
+ else
+ {
+ first_index = blocks_upper_first_index;
+ last_index = blocks_upper_last_index;
+ }
+ /* We know that the relevant blocks are blocks[i] with
+ first_index <= i < last_index. Now perform a binary search. */
+ while (first_index < last_index)
+ {
+ unsigned int mid_index = (first_index + last_index) / 2;
+ if (blocks[mid_index].end < uc)
+ first_index = mid_index + 1;
+ else if (uc < blocks[mid_index].start)
+ last_index = mid_index;
+ else
+ return &blocks[mid_index];
+ }
+ return NULL;
+}
+
+void
+uc_all_blocks (const uc_block_t **blocksp, size_t *countp)
+{
+ *blocksp = blocks;
+ *countp = sizeof (blocks) / sizeof (blocks[0]);
+}
diff --git a/gnulib/lib/unictype/blocks.h b/gnulib/lib/unictype/blocks.h
new file mode 100644
index 00000000..2585b58c
--- /dev/null
+++ b/gnulib/lib/unictype/blocks.h
@@ -0,0 +1,952 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Unicode blocks. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+static const uc_block_t blocks[] =
+{
+ { 0x0000, 0x007F, "Basic Latin" },
+ { 0x0080, 0x00FF, "Latin-1 Supplement" },
+ { 0x0100, 0x017F, "Latin Extended-A" },
+ { 0x0180, 0x024F, "Latin Extended-B" },
+ { 0x0250, 0x02AF, "IPA Extensions" },
+ { 0x02B0, 0x02FF, "Spacing Modifier Letters" },
+ { 0x0300, 0x036F, "Combining Diacritical Marks" },
+ { 0x0370, 0x03FF, "Greek and Coptic" },
+ { 0x0400, 0x04FF, "Cyrillic" },
+ { 0x0500, 0x052F, "Cyrillic Supplement" },
+ { 0x0530, 0x058F, "Armenian" },
+ { 0x0590, 0x05FF, "Hebrew" },
+ { 0x0600, 0x06FF, "Arabic" },
+ { 0x0700, 0x074F, "Syriac" },
+ { 0x0750, 0x077F, "Arabic Supplement" },
+ { 0x0780, 0x07BF, "Thaana" },
+ { 0x07C0, 0x07FF, "NKo" },
+ { 0x0900, 0x097F, "Devanagari" },
+ { 0x0980, 0x09FF, "Bengali" },
+ { 0x0A00, 0x0A7F, "Gurmukhi" },
+ { 0x0A80, 0x0AFF, "Gujarati" },
+ { 0x0B00, 0x0B7F, "Oriya" },
+ { 0x0B80, 0x0BFF, "Tamil" },
+ { 0x0C00, 0x0C7F, "Telugu" },
+ { 0x0C80, 0x0CFF, "Kannada" },
+ { 0x0D00, 0x0D7F, "Malayalam" },
+ { 0x0D80, 0x0DFF, "Sinhala" },
+ { 0x0E00, 0x0E7F, "Thai" },
+ { 0x0E80, 0x0EFF, "Lao" },
+ { 0x0F00, 0x0FFF, "Tibetan" },
+ { 0x1000, 0x109F, "Myanmar" },
+ { 0x10A0, 0x10FF, "Georgian" },
+ { 0x1100, 0x11FF, "Hangul Jamo" },
+ { 0x1200, 0x137F, "Ethiopic" },
+ { 0x1380, 0x139F, "Ethiopic Supplement" },
+ { 0x13A0, 0x13FF, "Cherokee" },
+ { 0x1400, 0x167F, "Unified Canadian Aboriginal Syllabics" },
+ { 0x1680, 0x169F, "Ogham" },
+ { 0x16A0, 0x16FF, "Runic" },
+ { 0x1700, 0x171F, "Tagalog" },
+ { 0x1720, 0x173F, "Hanunoo" },
+ { 0x1740, 0x175F, "Buhid" },
+ { 0x1760, 0x177F, "Tagbanwa" },
+ { 0x1780, 0x17FF, "Khmer" },
+ { 0x1800, 0x18AF, "Mongolian" },
+ { 0x1900, 0x194F, "Limbu" },
+ { 0x1950, 0x197F, "Tai Le" },
+ { 0x1980, 0x19DF, "New Tai Lue" },
+ { 0x19E0, 0x19FF, "Khmer Symbols" },
+ { 0x1A00, 0x1A1F, "Buginese" },
+ { 0x1B00, 0x1B7F, "Balinese" },
+ { 0x1B80, 0x1BBF, "Sundanese" },
+ { 0x1C00, 0x1C4F, "Lepcha" },
+ { 0x1C50, 0x1C7F, "Ol Chiki" },
+ { 0x1D00, 0x1D7F, "Phonetic Extensions" },
+ { 0x1D80, 0x1DBF, "Phonetic Extensions Supplement" },
+ { 0x1DC0, 0x1DFF, "Combining Diacritical Marks Supplement" },
+ { 0x1E00, 0x1EFF, "Latin Extended Additional" },
+ { 0x1F00, 0x1FFF, "Greek Extended" },
+ { 0x2000, 0x206F, "General Punctuation" },
+ { 0x2070, 0x209F, "Superscripts and Subscripts" },
+ { 0x20A0, 0x20CF, "Currency Symbols" },
+ { 0x20D0, 0x20FF, "Combining Diacritical Marks for Symbols" },
+ { 0x2100, 0x214F, "Letterlike Symbols" },
+ { 0x2150, 0x218F, "Number Forms" },
+ { 0x2190, 0x21FF, "Arrows" },
+ { 0x2200, 0x22FF, "Mathematical Operators" },
+ { 0x2300, 0x23FF, "Miscellaneous Technical" },
+ { 0x2400, 0x243F, "Control Pictures" },
+ { 0x2440, 0x245F, "Optical Character Recognition" },
+ { 0x2460, 0x24FF, "Enclosed Alphanumerics" },
+ { 0x2500, 0x257F, "Box Drawing" },
+ { 0x2580, 0x259F, "Block Elements" },
+ { 0x25A0, 0x25FF, "Geometric Shapes" },
+ { 0x2600, 0x26FF, "Miscellaneous Symbols" },
+ { 0x2700, 0x27BF, "Dingbats" },
+ { 0x27C0, 0x27EF, "Miscellaneous Mathematical Symbols-A" },
+ { 0x27F0, 0x27FF, "Supplemental Arrows-A" },
+ { 0x2800, 0x28FF, "Braille Patterns" },
+ { 0x2900, 0x297F, "Supplemental Arrows-B" },
+ { 0x2980, 0x29FF, "Miscellaneous Mathematical Symbols-B" },
+ { 0x2A00, 0x2AFF, "Supplemental Mathematical Operators" },
+ { 0x2B00, 0x2BFF, "Miscellaneous Symbols and Arrows" },
+ { 0x2C00, 0x2C5F, "Glagolitic" },
+ { 0x2C60, 0x2C7F, "Latin Extended-C" },
+ { 0x2C80, 0x2CFF, "Coptic" },
+ { 0x2D00, 0x2D2F, "Georgian Supplement" },
+ { 0x2D30, 0x2D7F, "Tifinagh" },
+ { 0x2D80, 0x2DDF, "Ethiopic Extended" },
+ { 0x2DE0, 0x2DFF, "Cyrillic Extended-A" },
+ { 0x2E00, 0x2E7F, "Supplemental Punctuation" },
+ { 0x2E80, 0x2EFF, "CJK Radicals Supplement" },
+ { 0x2F00, 0x2FDF, "Kangxi Radicals" },
+ { 0x2FF0, 0x2FFF, "Ideographic Description Characters" },
+ { 0x3000, 0x303F, "CJK Symbols and Punctuation" },
+ { 0x3040, 0x309F, "Hiragana" },
+ { 0x30A0, 0x30FF, "Katakana" },
+ { 0x3100, 0x312F, "Bopomofo" },
+ { 0x3130, 0x318F, "Hangul Compatibility Jamo" },
+ { 0x3190, 0x319F, "Kanbun" },
+ { 0x31A0, 0x31BF, "Bopomofo Extended" },
+ { 0x31C0, 0x31EF, "CJK Strokes" },
+ { 0x31F0, 0x31FF, "Katakana Phonetic Extensions" },
+ { 0x3200, 0x32FF, "Enclosed CJK Letters and Months" },
+ { 0x3300, 0x33FF, "CJK Compatibility" },
+ { 0x3400, 0x4DBF, "CJK Unified Ideographs Extension A" },
+ { 0x4DC0, 0x4DFF, "Yijing Hexagram Symbols" },
+ { 0x4E00, 0x9FFF, "CJK Unified Ideographs" },
+ { 0xA000, 0xA48F, "Yi Syllables" },
+ { 0xA490, 0xA4CF, "Yi Radicals" },
+ { 0xA500, 0xA63F, "Vai" },
+ { 0xA640, 0xA69F, "Cyrillic Extended-B" },
+ { 0xA700, 0xA71F, "Modifier Tone Letters" },
+ { 0xA720, 0xA7FF, "Latin Extended-D" },
+ { 0xA800, 0xA82F, "Syloti Nagri" },
+ { 0xA840, 0xA87F, "Phags-pa" },
+ { 0xA880, 0xA8DF, "Saurashtra" },
+ { 0xA900, 0xA92F, "Kayah Li" },
+ { 0xA930, 0xA95F, "Rejang" },
+ { 0xAA00, 0xAA5F, "Cham" },
+ { 0xAC00, 0xD7AF, "Hangul Syllables" },
+ { 0xD800, 0xDB7F, "High Surrogates" },
+ { 0xDB80, 0xDBFF, "High Private Use Surrogates" },
+ { 0xDC00, 0xDFFF, "Low Surrogates" },
+ { 0xE000, 0xF8FF, "Private Use Area" },
+ { 0xF900, 0xFAFF, "CJK Compatibility Ideographs" },
+ { 0xFB00, 0xFB4F, "Alphabetic Presentation Forms" },
+ { 0xFB50, 0xFDFF, "Arabic Presentation Forms-A" },
+ { 0xFE00, 0xFE0F, "Variation Selectors" },
+ { 0xFE10, 0xFE1F, "Vertical Forms" },
+ { 0xFE20, 0xFE2F, "Combining Half Marks" },
+ { 0xFE30, 0xFE4F, "CJK Compatibility Forms" },
+ { 0xFE50, 0xFE6F, "Small Form Variants" },
+ { 0xFE70, 0xFEFF, "Arabic Presentation Forms-B" },
+ { 0xFF00, 0xFFEF, "Halfwidth and Fullwidth Forms" },
+ { 0xFFF0, 0xFFFF, "Specials" },
+ { 0x10000, 0x1007F, "Linear B Syllabary" },
+ { 0x10080, 0x100FF, "Linear B Ideograms" },
+ { 0x10100, 0x1013F, "Aegean Numbers" },
+ { 0x10140, 0x1018F, "Ancient Greek Numbers" },
+ { 0x10190, 0x101CF, "Ancient Symbols" },
+ { 0x101D0, 0x101FF, "Phaistos Disc" },
+ { 0x10280, 0x1029F, "Lycian" },
+ { 0x102A0, 0x102DF, "Carian" },
+ { 0x10300, 0x1032F, "Old Italic" },
+ { 0x10330, 0x1034F, "Gothic" },
+ { 0x10380, 0x1039F, "Ugaritic" },
+ { 0x103A0, 0x103DF, "Old Persian" },
+ { 0x10400, 0x1044F, "Deseret" },
+ { 0x10450, 0x1047F, "Shavian" },
+ { 0x10480, 0x104AF, "Osmanya" },
+ { 0x10800, 0x1083F, "Cypriot Syllabary" },
+ { 0x10900, 0x1091F, "Phoenician" },
+ { 0x10920, 0x1093F, "Lydian" },
+ { 0x10A00, 0x10A5F, "Kharoshthi" },
+ { 0x12000, 0x123FF, "Cuneiform" },
+ { 0x12400, 0x1247F, "Cuneiform Numbers and Punctuation" },
+ { 0x1D000, 0x1D0FF, "Byzantine Musical Symbols" },
+ { 0x1D100, 0x1D1FF, "Musical Symbols" },
+ { 0x1D200, 0x1D24F, "Ancient Greek Musical Notation" },
+ { 0x1D300, 0x1D35F, "Tai Xuan Jing Symbols" },
+ { 0x1D360, 0x1D37F, "Counting Rod Numerals" },
+ { 0x1D400, 0x1D7FF, "Mathematical Alphanumeric Symbols" },
+ { 0x1F000, 0x1F02F, "Mahjong Tiles" },
+ { 0x1F030, 0x1F09F, "Domino Tiles" },
+ { 0x20000, 0x2A6DF, "CJK Unified Ideographs Extension B" },
+ { 0x2F800, 0x2FA1F, "CJK Compatibility Ideographs Supplement" },
+ { 0xE0000, 0xE007F, "Tags" },
+ { 0xE0100, 0xE01EF, "Variation Selectors Supplement" },
+ { 0xF0000, 0xFFFFF, "Supplementary Private Use Area-A" },
+ { 0x100000, 0x10FFFF, "Supplementary Private Use Area-B" }
+};
+#define blocks_level1_shift 8
+#define blocks_level1_threshold 0x30000
+static const uint8_t blocks_level1[768 * 2] =
+{
+ 0, 2,
+ 2, 4,
+ 3, 6,
+ 6, 8,
+ 8, 9,
+ 9, 12,
+ 12, 13,
+ 13, 17,
+ 17, 17,
+ 17, 19,
+ 19, 21,
+ 21, 23,
+ 23, 25,
+ 25, 27,
+ 27, 29,
+ 29, 30,
+ 30, 32,
+ 32, 33,
+ 33, 34,
+ 33, 36,
+ 36, 37,
+ 36, 37,
+ 36, 39,
+ 39, 44,
+ 44, 45,
+ 45, 49,
+ 49, 50,
+ 50, 52,
+ 52, 54,
+ 54, 57,
+ 57, 58,
+ 58, 59,
+ 59, 63,
+ 63, 66,
+ 66, 67,
+ 67, 68,
+ 68, 71,
+ 71, 74,
+ 74, 75,
+ 75, 78,
+ 78, 79,
+ 79, 81,
+ 81, 82,
+ 82, 83,
+ 83, 86,
+ 86, 90,
+ 90, 92,
+ 92, 94,
+ 94, 97,
+ 97, 103,
+ 103, 104,
+ 104, 105,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 106,
+ 105, 107,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 107, 108,
+ 108, 109,
+ 108, 109,
+ 108, 109,
+ 108, 109,
+ 108, 110,
+ 110, 111,
+ 110, 112,
+ 112, 114,
+ 114, 117,
+ 117, 119,
+ 119, 120,
+ 120, 120,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 120, 121,
+ 121, 122,
+ 121, 122,
+ 121, 122,
+ 121, 123,
+ 123, 124,
+ 123, 124,
+ 123, 124,
+ 123, 124,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 124, 125,
+ 125, 126,
+ 125, 126,
+ 126, 128,
+ 127, 128,
+ 127, 128,
+ 128, 134,
+ 134, 136,
+ 136, 138,
+ 138, 142,
+ 142, 144,
+ 144, 148,
+ 148, 151,
+ 151, 151,
+ 151, 151,
+ 151, 151,
+ 151, 152,
+ 152, 154,
+ 154, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 155,
+ 155, 156,
+ 155, 156,
+ 155, 156,
+ 155, 156,
+ 156, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 157,
+ 157, 158,
+ 158, 159,
+ 159, 160,
+ 160, 162,
+ 162, 163,
+ 162, 163,
+ 162, 163,
+ 162, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 163,
+ 163, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 165,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 165, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 166,
+ 166, 167,
+ 166, 167,
+ 166, 167,
+ 167, 167,
+ 167, 167,
+ 167, 167,
+ 167, 167,
+ 167, 167
+};
+#define blocks_upper_first_index 167
+#define blocks_upper_last_index 171
diff --git a/gnulib/lib/unictype/categ_C.c b/gnulib/lib/unictype/categ_C.c
new file mode 100644
index 00000000..3c3860df
--- /dev/null
+++ b/gnulib/lib/unictype/categ_C.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_C table. */
+#include "categ_C.h"
+
+const uc_general_category_t UC_CATEGORY_C =
+ { UC_CATEGORY_MASK_C, 0, { &u_categ_C } };
diff --git a/gnulib/lib/unictype/categ_C.h b/gnulib/lib/unictype/categ_C.h
new file mode 100644
index 00000000..0209db2e
--- /dev/null
+++ b/gnulib/lib/unictype/categ_C.h
@@ -0,0 +1,890 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[5 << 7];
+ /*unsigned*/ int level3[52 << 4];
+ }
+u_categ_C =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 512,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384
+ },
+ {
+ 18 + 640 * sizeof (short) / sizeof (int) + 0,
+ 18 + 640 * sizeof (short) / sizeof (int) + 16,
+ 18 + 640 * sizeof (short) / sizeof (int) + 32,
+ 18 + 640 * sizeof (short) / sizeof (int) + 48,
+ 18 + 640 * sizeof (short) / sizeof (int) + 64,
+ 18 + 640 * sizeof (short) / sizeof (int) + 80,
+ 18 + 640 * sizeof (short) / sizeof (int) + 96,
+ 18 + 640 * sizeof (short) / sizeof (int) + 112,
+ 18 + 640 * sizeof (short) / sizeof (int) + 128,
+ 18 + 640 * sizeof (short) / sizeof (int) + 144,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 176,
+ 18 + 640 * sizeof (short) / sizeof (int) + 192,
+ 18 + 640 * sizeof (short) / sizeof (int) + 208,
+ 18 + 640 * sizeof (short) / sizeof (int) + 224,
+ 18 + 640 * sizeof (short) / sizeof (int) + 240,
+ 18 + 640 * sizeof (short) / sizeof (int) + 256,
+ 18 + 640 * sizeof (short) / sizeof (int) + 272,
+ 18 + 640 * sizeof (short) / sizeof (int) + 288,
+ 18 + 640 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 336,
+ 18 + 640 * sizeof (short) / sizeof (int) + 352,
+ 18 + 640 * sizeof (short) / sizeof (int) + 368,
+ 18 + 640 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 432,
+ 18 + 640 * sizeof (short) / sizeof (int) + 448,
+ 18 + 640 * sizeof (short) / sizeof (int) + 464,
+ 18 + 640 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 528,
+ 18 + 640 * sizeof (short) / sizeof (int) + 544,
+ 18 + 640 * sizeof (short) / sizeof (int) + 560,
+ 18 + 640 * sizeof (short) / sizeof (int) + 576,
+ 18 + 640 * sizeof (short) / sizeof (int) + 592,
+ 18 + 640 * sizeof (short) / sizeof (int) + 608,
+ 18 + 640 * sizeof (short) / sizeof (int) + 624,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 640,
+ 18 + 640 * sizeof (short) / sizeof (int) + 656,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 672,
+ 18 + 640 * sizeof (short) / sizeof (int) + 688,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 704,
+ 18 + 640 * sizeof (short) / sizeof (int) + 720,
+ 18 + 640 * sizeof (short) / sizeof (int) + 736,
+ 18 + 640 * sizeof (short) / sizeof (int) + 752,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 768,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 784,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 800,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 816,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512
+ },
+ {
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFFF, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x83000000,
+ 0x0000280F, 0x00000004, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0001FFF0, 0x01800000, 0x00000001,
+ 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800,
+ 0x3000003F, 0x00000001, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x0000C000, 0x00000000, 0x00001800, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000001, 0x0C000000, 0x00E0C000, 0x07F80000,
+ 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF8000030,
+ 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F,
+ 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030,
+ 0x00066011, 0x0C120200, 0x4F3FC660, 0xFFFC0030,
+ 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F,
+ 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030,
+ 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030,
+ 0x00022013, 0x1C000200, 0xFF7FC220, 0x01C00030,
+ 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF,
+ 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF,
+ 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000100, 0x0001E000,
+ 0x0100F000, 0x20000000, 0xFFE02000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3C000000, 0x00000000, 0x0000FFC0, 0xE0000000,
+ 0x00000000, 0x00000000, 0x7C000000, 0x00000000,
+ 0x00000000, 0x000000F8, 0x00000000, 0xFC000000,
+ 0x00000000, 0x00000000, 0xC280C200, 0x00000000,
+ 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000,
+ 0x00C20000, 0x00000000, 0x78000000, 0xE0000000,
+ 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFF800000,
+ 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000,
+ 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000,
+ 0x00000000, 0x00300000, 0xC0000000, 0xFC00FC00,
+ 0xFC008000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0xFFFFF800, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000,
+ 0x00000000, 0x0000FC00, 0x3C00FC00, 0x00000000,
+ 0x30000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0000F000, 0xE0000000,
+ 0x00000000, 0xFC003800, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x07000000, 0x00001C00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x3FFFFF80,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000,
+ 0x00000000, 0x00200000, 0x10300020, 0x80230000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x000CFFFF,
+ 0xFFE08000, 0xFFC00000, 0x0000FFFF, 0xFFFE0000,
+ 0x00000000, 0x00000000, 0x00070000, 0x00000000,
+ 0x0000FE00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFF00,
+ 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xE0000000, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0x00000C21, 0x00000100, 0x80B85000, 0x00000001,
+ 0x00E00000, 0x80010000, 0x0000E800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFE0E000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x80000000, 0xC0010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x01FFF800,
+ 0x00000000, 0x0000FFC0, 0x00000000, 0xFFFF7FC0,
+ 0xFF800000, 0x80808080, 0x80808080, 0x00000000,
+ 0x00000000, 0xFFFE0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x04000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0xF000FFFF,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0x0001C000, 0x00000000, 0x00000000,
+ 0x00008000, 0xFF000000, 0x00000000, 0x0000FFF0,
+ 0x80000000, 0x00000000, 0x0000FFF0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0xFFFFFF80, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00003,
+ 0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFE000, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0xFC003FE0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x7FF00000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFF800000, 0x0C00C000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFF0, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000C000, 0x00000000, 0x0000F800,
+ 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF,
+ 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x0007FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFFF, 0x00000000,
+ 0x00030000, 0x00000000, 0xFFFFFF00, 0xC000FFFF,
+ 0xFC000000, 0x0000FF80, 0x00080000, 0x0020F080,
+ 0x00000000, 0x00000000, 0x00000000, 0xE0000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0xE3030303, 0xCFFF8080,
+ 0x00001000, 0x48000080, 0xC000C000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x00000078, 0x00700000, 0x00000000, 0x00000000,
+ 0xF000F800, 0xFFFFFFFF, 0x0000FFFF, 0xC0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0x00000000, 0xFFFE0000, 0xFFFFFFFF,
+ 0x80000000, 0x0000FFF0, 0xFFFFF800, 0xFFFFFFFF,
+ 0x40000000, 0x00000000, 0xFFC000F0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFC00, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000002C0, 0x6E400000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x7C000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x01100F90, 0x78F00000, 0xFE00FF00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF8000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF0FFF8,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x00000000, 0x00000180, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFC0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00200000, 0x00000000,
+ 0x20000000, 0x1400219B, 0x00000010, 0x00000000,
+ 0x20201840, 0x84000000, 0x000203A0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000000C0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003000, 0x00000000,
+ 0x00000000, 0x0000F000, 0x00000000, 0x00000000,
+ 0xFFF00000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xC0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Cc.c b/gnulib/lib/unictype/categ_Cc.c
new file mode 100644
index 00000000..653848db
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cc.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Cc table. */
+#include "categ_Cc.h"
+
+const uc_general_category_t UC_CATEGORY_Cc =
+ { UC_CATEGORY_MASK_Cc, 0, { &u_categ_Cc } };
diff --git a/gnulib/lib/unictype/categ_Cc.h b/gnulib/lib/unictype/categ_Cc.h
new file mode 100644
index 00000000..17104cdd
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cc.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_categ_Cc =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Cf.c b/gnulib/lib/unictype/categ_Cf.c
new file mode 100644
index 00000000..fd53e7a8
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cf.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Cf table. */
+#include "categ_Cf.h"
+
+const uc_general_category_t UC_CATEGORY_Cf =
+ { UC_CATEGORY_MASK_Cf, 0, { &u_categ_Cf } };
diff --git a/gnulib/lib/unictype/categ_Cf.h b/gnulib/lib/unictype/categ_Cf.h
new file mode 100644
index 00000000..5b67fb45
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cf.h
@@ -0,0 +1,452 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_categ_Cf =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300000, 0x00000000, 0x00000000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0E000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Cn.c b/gnulib/lib/unictype/categ_Cn.c
new file mode 100644
index 00000000..63242dc0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cn.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Cn table. */
+#include "categ_Cn.h"
+
+const uc_general_category_t UC_CATEGORY_Cn =
+ { UC_CATEGORY_MASK_Cn, 0, { &u_categ_Cn } };
diff --git a/gnulib/lib/unictype/categ_Cn.h b/gnulib/lib/unictype/categ_Cn.h
new file mode 100644
index 00000000..d8288041
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cn.h
@@ -0,0 +1,1014 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[6 << 7];
+ /*unsigned*/ int level3[51 << 4];
+ }
+u_categ_Cn =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 512,
+ 18 * sizeof (int) / sizeof (short) + 640,
+ 18 * sizeof (int) / sizeof (short) + 640
+ },
+ {
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 0,
+ 18 + 768 * sizeof (short) / sizeof (int) + 16,
+ 18 + 768 * sizeof (short) / sizeof (int) + 32,
+ 18 + 768 * sizeof (short) / sizeof (int) + 48,
+ 18 + 768 * sizeof (short) / sizeof (int) + 64,
+ 18 + 768 * sizeof (short) / sizeof (int) + 80,
+ 18 + 768 * sizeof (short) / sizeof (int) + 96,
+ 18 + 768 * sizeof (short) / sizeof (int) + 112,
+ 18 + 768 * sizeof (short) / sizeof (int) + 128,
+ 18 + 768 * sizeof (short) / sizeof (int) + 144,
+ 18 + 768 * sizeof (short) / sizeof (int) + 160,
+ 18 + 768 * sizeof (short) / sizeof (int) + 176,
+ 18 + 768 * sizeof (short) / sizeof (int) + 192,
+ 18 + 768 * sizeof (short) / sizeof (int) + 208,
+ 18 + 768 * sizeof (short) / sizeof (int) + 224,
+ 18 + 768 * sizeof (short) / sizeof (int) + 240,
+ 18 + 768 * sizeof (short) / sizeof (int) + 256,
+ 18 + 768 * sizeof (short) / sizeof (int) + 272,
+ 18 + 768 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 304,
+ 18 + 768 * sizeof (short) / sizeof (int) + 320,
+ 18 + 768 * sizeof (short) / sizeof (int) + 336,
+ 18 + 768 * sizeof (short) / sizeof (int) + 352,
+ 18 + 768 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 416,
+ 18 + 768 * sizeof (short) / sizeof (int) + 432,
+ 18 + 768 * sizeof (short) / sizeof (int) + 448,
+ 18 + 768 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 496,
+ 18 + 768 * sizeof (short) / sizeof (int) + 512,
+ 18 + 768 * sizeof (short) / sizeof (int) + 528,
+ 18 + 768 * sizeof (short) / sizeof (int) + 544,
+ 18 + 768 * sizeof (short) / sizeof (int) + 560,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 608,
+ 18 + 768 * sizeof (short) / sizeof (int) + 624,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 640,
+ 18 + 768 * sizeof (short) / sizeof (int) + 656,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 672,
+ 18 + 768 * sizeof (short) / sizeof (int) + 688,
+ 18 + 768 * sizeof (short) / sizeof (int) + 704,
+ 18 + 768 * sizeof (short) / sizeof (int) + 720,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 736,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 752,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 768,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 784,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 800
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x83000000,
+ 0x0000280F, 0x00000004, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0001FFF0, 0x01800000, 0x00000001,
+ 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800,
+ 0x30000030, 0x00000001, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00001800, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000001, 0x0C000000, 0x00E0C000, 0x07F80000,
+ 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF8000030,
+ 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F,
+ 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030,
+ 0x00066011, 0x0C120200, 0x4F3FC660, 0xFFFC0030,
+ 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F,
+ 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030,
+ 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030,
+ 0x00022013, 0x1C000200, 0xFF7FC220, 0x01C00030,
+ 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF,
+ 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF,
+ 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000100, 0x0001E000,
+ 0x0100F000, 0x20000000, 0xFFE02000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3C000000, 0x00000000, 0x0000FFC0, 0xE0000000,
+ 0x00000000, 0x00000000, 0x7C000000, 0x00000000,
+ 0x00000000, 0x000000F8, 0x00000000, 0xFC000000,
+ 0x00000000, 0x00000000, 0xC280C200, 0x00000000,
+ 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000,
+ 0x00C20000, 0x00000000, 0x78000000, 0xE0000000,
+ 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFF800000,
+ 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000,
+ 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFC00FC00,
+ 0xFC008000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0xFFFFF800, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000,
+ 0x00000000, 0x0000FC00, 0x3C00FC00, 0x00000000,
+ 0x30000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0000F000, 0xE0000000,
+ 0x00000000, 0xFC003800, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x07000000, 0x00001C00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x3FFFFF80,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000,
+ 0x00000000, 0x00200000, 0x10300020, 0x80230000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C03E0,
+ 0xFFE08000, 0xFFC00000, 0x0000FFFF, 0xFFFE0000,
+ 0x00000000, 0x00000000, 0x00070000, 0x00000000,
+ 0x0000FE00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFF00,
+ 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xE0000000, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0x00000C21, 0x00000100, 0x80B85000, 0x00000001,
+ 0x00E00000, 0x80010000, 0x0000E800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFE0E000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x80000000, 0xC0010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x01FFF800,
+ 0x00000000, 0x0000FFC0, 0x00000000, 0xFFFF7FC0,
+ 0xFF800000, 0x80808080, 0x80808080, 0x00000000,
+ 0x00000000, 0xFFFE0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x04000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0xF000FFFF,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0x0001C000, 0x00000000, 0x00000000,
+ 0x00008000, 0xFF000000, 0x00000000, 0x0000FFF0,
+ 0x80000000, 0x00000000, 0x0000FFF0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0xFFFFFF80, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00003,
+ 0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFE000, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0xFC003FE0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x7FF00000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFF800000, 0x0C00C000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFF0, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x0000C000, 0x00000000, 0x0000F800,
+ 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF,
+ 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x0007FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFFF, 0x00000000,
+ 0x00030000, 0x00000000, 0xFFFFFF00, 0xC000FFFF,
+ 0xFC000000, 0x0000FF80, 0x00080000, 0x0020F080,
+ 0x00000000, 0x00000000, 0x00000000, 0x60000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0xE3030303, 0xC1FF8080,
+ 0x00001000, 0x48000080, 0xC000C000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x00000078, 0x00700000, 0x00000000, 0x00000000,
+ 0xF000F800, 0xFFFFFFFF, 0x0000FFFF, 0xC0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0x00000000, 0xFFFE0000, 0xFFFFFFFF,
+ 0x80000000, 0x0000FFF0, 0xFFFFF800, 0xFFFFFFFF,
+ 0x40000000, 0x00000000, 0xFFC000F0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFC00, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000002C0, 0x6E400000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x7C000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x01100F90, 0x78F00000, 0xFE00FF00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF8000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF0FFF8,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x00000000, 0x00000180, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFC0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00200000, 0x00000000,
+ 0x20000000, 0x1400219B, 0x00000010, 0x00000000,
+ 0x20201840, 0x84000000, 0x000203A0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000000C0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003000, 0x00000000,
+ 0x00000000, 0x0000F000, 0x00000000, 0x00000000,
+ 0xFFF00000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xC0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFD, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Co.c b/gnulib/lib/unictype/categ_Co.c
new file mode 100644
index 00000000..3452a17e
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Co.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Co table. */
+#include "categ_Co.h"
+
+const uc_general_category_t UC_CATEGORY_Co =
+ { UC_CATEGORY_MASK_Co, 0, { &u_categ_Co } };
diff --git a/gnulib/lib/unictype/categ_Co.h b/gnulib/lib/unictype/categ_Co.h
new file mode 100644
index 00000000..a5b8ce9b
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Co.h
@@ -0,0 +1,310 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Co =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 32
+ },
+ {
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Cs.c b/gnulib/lib/unictype/categ_Cs.c
new file mode 100644
index 00000000..cd94733d
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cs.c
@@ -0,0 +1,30 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static bool
+uc_is_category_Cs (ucs4_t uc)
+{
+ return (uc >= 0xd800 && uc < 0xe000);
+}
+
+const uc_general_category_t UC_CATEGORY_Cs =
+ { UC_CATEGORY_MASK_Cs, 1, { &uc_is_category_Cs } };
diff --git a/gnulib/lib/unictype/categ_Cs.h b/gnulib/lib/unictype/categ_Cs.h
new file mode 100644
index 00000000..99b37d15
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cs.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_categ_Cs =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_L.c b/gnulib/lib/unictype/categ_L.c
new file mode 100644
index 00000000..4b7f16d8
--- /dev/null
+++ b/gnulib/lib/unictype/categ_L.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_L table. */
+#include "categ_L.h"
+
+const uc_general_category_t UC_CATEGORY_L =
+ { UC_CATEGORY_MASK_L, 0, { &u_categ_L } };
diff --git a/gnulib/lib/unictype/categ_L.h b/gnulib/lib/unictype/categ_L.h
new file mode 100644
index 00000000..558b5945
--- /dev/null
+++ b/gnulib/lib/unictype/categ_L.h
@@ -0,0 +1,580 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[42 << 4];
+ }
+u_categ_L =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000000, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFE, 0x000007FF, 0xFFFEC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xF8060003,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x00030003,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x00000003,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x00020003,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x00000000,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x00000003,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x00000003,
+ 0xFFFDDFE0, 0x23FFFDFF, 0x00000000, 0xFC000003,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x000DFFFF, 0x0000007F, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x3000005F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF,
+ 0x00000F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062,
+ 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000007FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000005FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0x000003FF, 0x000000FE, 0x00000000,
+ 0x007FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000,
+ 0xFFFFFFF8, 0x0000C001, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF3FFBD50, 0x000043E0, 0x00000000,
+ 0x00000018, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000060, 0x183E0000, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000019FF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000003FD, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x0000FF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Ll.c b/gnulib/lib/unictype/categ_Ll.c
new file mode 100644
index 00000000..e7e752ef
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Ll.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Ll table. */
+#include "categ_Ll.h"
+
+const uc_general_category_t UC_CATEGORY_Ll =
+ { UC_CATEGORY_MASK_Ll, 0, { &u_categ_Ll } };
diff --git a/gnulib/lib/unictype/categ_Ll.h b/gnulib/lib/unictype/categ_Ll.h
new file mode 100644
index 00000000..dd8194b0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Ll.h
@@ -0,0 +1,335 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_categ_Ll =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0x80000000, 0xFF7FFFFF,
+ 0xAAAAAAAA, 0x55AAAAAA, 0xAAAAAB55, 0xD4AAAAAA,
+ 0x4E243129, 0xE6512D2A, 0xB5555240, 0xAA29AAAA,
+ 0xAAAAAAAA, 0x93FAAAAA, 0xFFFFAA85, 0xFFFFFFFF,
+ 0xFFEFFFFF, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x388A0000,
+ 0x00010000, 0xFFFFF000, 0xAAE37FFF, 0x192FAAAA,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0x0000000A, 0x00000000, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00000FFF, 0x00000000, 0xFEFFFFFC,
+ 0x07FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0xBFEAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x003F00FF, 0x00FF00FF, 0x00FF003F, 0x3FFF00FF,
+ 0x00FF00FF, 0x40DF00FF, 0x00CF00DC, 0x00DC00FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0008C400, 0x32108000, 0x000043C0, 0x00000000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x1FDA1562,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000001A,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AA8,
+ 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAABAAA8, 0xAAAAAAAA, 0x95FEAAAA,
+ 0x000010AA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFF00, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFC000000, 0x000FFFFF, 0xFFDFC000, 0x000000FF,
+ 0x0FFFFFFC, 0xEBC00000, 0x0000FFEF, 0xFFFFFC00,
+ 0xC000000F, 0x00FFFFFF, 0xFFFC0000, 0x00000FFF,
+ 0xFFFFFFC0, 0xFC000000, 0x000FFFFF, 0xFFFFC000,
+ 0x000000FF, 0x0FFFFFFC, 0xFFC00000, 0x0000FFFF,
+ 0xFFFFFC00, 0x0000003F, 0xF7FFFFFC, 0xF0000003,
+ 0x0FDFFFFF, 0xFFC00000, 0x003F7FFF, 0xFFFF0000,
+ 0x0000FDFF, 0xFFFFFC00, 0x00000BF7, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Lm.c b/gnulib/lib/unictype/categ_Lm.c
new file mode 100644
index 00000000..fc016026
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lm.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Lm table. */
+#include "categ_Lm.h"
+
+const uc_general_category_t UC_CATEGORY_Lm =
+ { UC_CATEGORY_MASK_Lm, 0, { &u_categ_Lm } };
diff --git a/gnulib/lib/unictype/categ_Lm.h b/gnulib/lib/unictype/categ_Lm.h
new file mode 100644
index 00000000..a781af61
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lm.h
@@ -0,0 +1,216 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[16 << 4];
+ }
+u_categ_Lm =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 160,
+ 2 + 128 * sizeof (short) / sizeof (int) + 176,
+ 2 + 128 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 240
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000000, 0x04100000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x02000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000060,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x04300000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x01000003,
+ 0xF8000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00008000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x083E0000, 0x00000000, 0x00000000,
+ 0x60000000, 0x00000000, 0x00000000, 0x70000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00200000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Lo.c b/gnulib/lib/unictype/categ_Lo.c
new file mode 100644
index 00000000..57ae6116
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lo.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Lo table. */
+#include "categ_Lo.h"
+
+const uc_general_category_t UC_CATEGORY_Lo =
+ { UC_CATEGORY_MASK_Lo, 0, { &u_categ_Lo } };
diff --git a/gnulib/lib/unictype/categ_Lo.h b/gnulib/lib/unictype/categ_Lo.h
new file mode 100644
index 00000000..75bec147
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lo.h
@@ -0,0 +1,568 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[39 << 4];
+ }
+u_categ_Lo =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x08000000, 0x0000000F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00100000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFE, 0x000007FE, 0xFFFEC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C000,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x000007FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xF8040003,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x00030003,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x00000003,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x00020003,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x00000000,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x00000003,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x00000003,
+ 0xFFFDDFE0, 0x23FFFDFF, 0x00000000, 0xFC000003,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x000DFFFF, 0x0000003F, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x3000001F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF,
+ 0x00000F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062,
+ 0x00004003, 0x00000000, 0xFFFF0000, 0x07FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000007FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFF7, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000005FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0x000003FF, 0x000000FE, 0x00000000,
+ 0x007FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000,
+ 0xFFFFFFF8, 0x0000C001, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x00FFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x01E00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0x0000003F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x00000040, 0x10000000, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0x807FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x87FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFDFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF0FFF, 0x00000C00, 0x00000000, 0x00004000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0000000, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFEFFC0,
+ 0x3FFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000003FD, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x0000FF0F, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Lt.c b/gnulib/lib/unictype/categ_Lt.c
new file mode 100644
index 00000000..9de263d7
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lt.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Lt table. */
+#include "categ_Lt.h"
+
+const uc_general_category_t UC_CATEGORY_Lt =
+ { UC_CATEGORY_MASK_Lt, 0, { &u_categ_Lt } };
diff --git a/gnulib/lib/unictype/categ_Lt.h b/gnulib/lib/unictype/categ_Lt.h
new file mode 100644
index 00000000..227ff2af
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lt.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_categ_Lt =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000920, 0x00040000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF00FF00, 0x1000FF00, 0x00001000, 0x10000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Lu.c b/gnulib/lib/unictype/categ_Lu.c
new file mode 100644
index 00000000..6000421b
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lu.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Lu table. */
+#include "categ_Lu.h"
+
+const uc_general_category_t UC_CATEGORY_Lu =
+ { UC_CATEGORY_MASK_Lu, 0, { &u_categ_Lu } };
diff --git a/gnulib/lib/unictype/categ_Lu.h b/gnulib/lib/unictype/categ_Lu.h
new file mode 100644
index 00000000..9674e161
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lu.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_categ_Lu =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x7F7FFFFF, 0x00000000,
+ 0x55555555, 0xAA555555, 0x555554AA, 0x2B555555,
+ 0xB1DBCED6, 0x11AED2D5, 0x4AAAA490, 0x55D25555,
+ 0x55555555, 0x6C055555, 0x0000557A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00450000,
+ 0xFFFED740, 0x00000FFB, 0x551C8000, 0xE6905555,
+ 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555,
+ 0x55555401, 0x55555555, 0x55552AAB, 0x55555555,
+ 0x55555555, 0xFFFE0005, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x55555555, 0x55555555, 0x55555555, 0x55555555,
+ 0x40155555, 0x55555555, 0x55555555, 0x55555555,
+ 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00,
+ 0x00000000, 0x0F000000, 0x0F000F00, 0x0F001F00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E273884, 0xC00F3D50, 0x00000020, 0x00000000,
+ 0x00000008, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x0024EA9D,
+ 0x55555555, 0x55555555, 0x55555555, 0x00000005,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555555, 0x00001554,
+ 0x00555555, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55545554, 0x55555555, 0x6A005555,
+ 0x00000855, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000000FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FFFFFF, 0xFFF00000, 0x00003FFF, 0xFFFFFF00,
+ 0xD0000003, 0x003FDE64, 0xFFFF0000, 0x000003FF,
+ 0x1FDFE7B0, 0x7B000000, 0x0001FC5F, 0xFFFFF000,
+ 0x0000003F, 0x03FFFFFF, 0xFFF00000, 0x00003FFF,
+ 0xFFFFFF00, 0xF0000003, 0x003FFFFF, 0xFFFF0000,
+ 0x000003FF, 0xFFFFFF00, 0x00000001, 0x07FFFFFC,
+ 0xF0000000, 0x001FFFFF, 0xFFC00000, 0x00007FFF,
+ 0xFFFF0000, 0x000001FF, 0x00000400, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_M.c b/gnulib/lib/unictype/categ_M.c
new file mode 100644
index 00000000..8e6ff700
--- /dev/null
+++ b/gnulib/lib/unictype/categ_M.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_M table. */
+#include "categ_M.h"
+
+const uc_general_category_t UC_CATEGORY_M =
+ { UC_CATEGORY_MASK_M, 0, { &u_categ_M } };
diff --git a/gnulib/lib/unictype/categ_M.h b/gnulib/lib/unictype/categ_M.h
new file mode 100644
index 00000000..6e0b3772
--- /dev/null
+++ b/gnulib/lib/unictype/categ_M.h
@@ -0,0 +1,528 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[26 << 4];
+ }
+u_categ_M =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0x7FFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0xDFC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000E, 0xD0000000, 0x001E3FFF, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x0080399F, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x00023987, 0x00230000,
+ 0x0000000E, 0xD0000000, 0x00003BBF, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x00C0399F, 0x0000000C,
+ 0x00000004, 0xC0000000, 0x00803DC7, 0x00000000,
+ 0x0000000E, 0xC0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xD0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00803DDF, 0x0000000C,
+ 0x0000000C, 0x00000000, 0xFF5F8400, 0x000C0000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0xC2A00000, 0x00000000, 0xFFFE0000,
+ 0xFEFF00DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x7FFFF800, 0xC3C00000, 0x001E3F9D,
+ 0x0000BFFC, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0xFFC00000, 0x200FFFFF, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0FFF0FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x00000301, 0x00000000,
+ 0x0F800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0xFFF00000, 0x0000001F, 0x000FF800,
+ 0x00000007, 0x000007FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00FFFFF0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xC000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x000000F8, 0x00000000, 0x00000000,
+ 0x00000003, 0xFFF00000, 0x0000001F, 0x00000000,
+ 0x00000000, 0x00003FC0, 0x000FFF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x007FFE00, 0x00003008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E3E0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Mc.c b/gnulib/lib/unictype/categ_Mc.c
new file mode 100644
index 00000000..f4cca6bd
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Mc.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Mc table. */
+#include "categ_Mc.h"
+
+const uc_general_category_t UC_CATEGORY_Mc =
+ { UC_CATEGORY_MASK_Mc, 0, { &u_categ_Mc } };
diff --git a/gnulib/lib/unictype/categ_Mc.h b/gnulib/lib/unictype/categ_Mc.h
new file mode 100644
index 00000000..dfddaa79
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Mc.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_categ_Mc =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000008, 0xC0000000, 0x00001E01, 0x00000000,
+ 0x0000000C, 0xC0000000, 0x00801981, 0x00000000,
+ 0x00000008, 0xC0000000, 0x00000001, 0x00000000,
+ 0x00000008, 0xC0000000, 0x00001A01, 0x00000000,
+ 0x0000000C, 0x40000000, 0x00801981, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00801DC6, 0x00000000,
+ 0x0000000E, 0x00000000, 0x0000001E, 0x00000000,
+ 0x0000000C, 0x40000000, 0x00600D9F, 0x00000000,
+ 0x0000000C, 0xC0000000, 0x00801DC1, 0x00000000,
+ 0x0000000C, 0x00000000, 0xFF038000, 0x000C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x19021800, 0x00C00000, 0x00003F9C,
+ 0x00009F98, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0400000, 0x000001BF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x01FB0E78, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x00000301, 0x00000000,
+ 0x0E000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000010, 0xE8200000, 0x0000001B, 0x00000000,
+ 0x00000004, 0x000004C2, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300FF0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000098, 0x00000000, 0x00000000,
+ 0x00000003, 0xFFF00000, 0x0000000F, 0x00000000,
+ 0x00000000, 0x00000000, 0x000C0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00198000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007E060,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Me.c b/gnulib/lib/unictype/categ_Me.c
new file mode 100644
index 00000000..62b1ad9a
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Me.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Me table. */
+#include "categ_Me.h"
+
+const uc_general_category_t UC_CATEGORY_Me =
+ { UC_CATEGORY_MASK_Me, 0, { &u_categ_Me } };
diff --git a/gnulib/lib/unictype/categ_Me.h b/gnulib/lib/unictype/categ_Me.h
new file mode 100644
index 00000000..7bf325ae
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Me.h
@@ -0,0 +1,168 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[4 << 4];
+ }
+u_categ_Me =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000300, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x40000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x0000001D,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00070000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Mn.c b/gnulib/lib/unictype/categ_Mn.c
new file mode 100644
index 00000000..edcf3c50
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Mn.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Mn table. */
+#include "categ_Mn.h"
+
+const uc_general_category_t UC_CATEGORY_Mn =
+ { UC_CATEGORY_MASK_Mn, 0, { &u_categ_Mn } };
diff --git a/gnulib/lib/unictype/categ_Mn.h b/gnulib/lib/unictype/categ_Mn.h
new file mode 100644
index 00000000..576279ac
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Mn.h
@@ -0,0 +1,528 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[26 << 4];
+ }
+u_categ_Mn =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0x7FFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000006, 0x10000000, 0x001E21FE, 0x0000000C,
+ 0x00000002, 0x10000000, 0x0000201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0x90000000, 0x0040201E, 0x0000000C,
+ 0x00000004, 0x00000000, 0x00002001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x90000000, 0x00003040, 0x0000000C,
+ 0x00000000, 0x00000000, 0x0000201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x005C0400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFF00DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x00002064, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3F800000, 0x200FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xC000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x1FFF0000, 0x0001FFE2,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30008000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_N.c b/gnulib/lib/unictype/categ_N.c
new file mode 100644
index 00000000..e326ff22
--- /dev/null
+++ b/gnulib/lib/unictype/categ_N.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_N table. */
+#include "categ_N.h"
+
+const uc_general_category_t UC_CATEGORY_N =
+ { UC_CATEGORY_MASK_N, 0, { &u_categ_N } };
diff --git a/gnulib/lib/unictype/categ_N.h b/gnulib/lib/unictype/categ_N.h
new file mode 100644
index 00000000..9eb241d0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_N.h
@@ -0,0 +1,403 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[30 << 4];
+ }
+u_categ_N =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x720C0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F0FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x7F00FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x003FFFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FFFFE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0001C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF03FF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF03FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F10000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFF80000, 0xFFFFFFFF,
+ 0x000001E7, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x070003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003C0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0xFFFE0000, 0x00000000,
+ 0x000003FF, 0xFFFE0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF80, 0x000FFFFF, 0xFFFFFFFF, 0x01FFFFFF,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000F, 0x00000402, 0x00000000,
+ 0x00000000, 0x00000000, 0x003E0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03C00000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000000FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Nd.c b/gnulib/lib/unictype/categ_Nd.c
new file mode 100644
index 00000000..c6b02580
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Nd.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Nd table. */
+#include "categ_Nd.h"
+
+const uc_general_category_t UC_CATEGORY_Nd =
+ { UC_CATEGORY_MASK_Nd, 0, { &u_categ_Nd } };
diff --git a/gnulib/lib/unictype/categ_Nd.h b/gnulib/lib/unictype/categ_Nd.h
new file mode 100644
index 00000000..986cec7b
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Nd.h
@@ -0,0 +1,351 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[17 << 4];
+ }
+u_categ_Nd =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF03FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Nl.c b/gnulib/lib/unictype/categ_Nl.c
new file mode 100644
index 00000000..50a39bb0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Nl.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Nl table. */
+#include "categ_Nl.h"
+
+const uc_general_category_t UC_CATEGORY_Nl =
+ { UC_CATEGORY_MASK_Nl, 0, { &u_categ_Nl } };
diff --git a/gnulib/lib/unictype/categ_Nl.h b/gnulib/lib/unictype/categ_Nl.h
new file mode 100644
index 00000000..9b4ce70c
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Nl.h
@@ -0,0 +1,307 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[6 << 4];
+ }
+u_categ_Nl =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0001C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x000001E7, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x070003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000402, 0x00000000,
+ 0x00000000, 0x00000000, 0x003E0000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_No.c b/gnulib/lib/unictype/categ_No.c
new file mode 100644
index 00000000..f36899d7
--- /dev/null
+++ b/gnulib/lib/unictype/categ_No.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_No table. */
+#include "categ_No.h"
+
+const uc_general_category_t UC_CATEGORY_No =
+ { UC_CATEGORY_MASK_No, 0, { &u_categ_No } };
diff --git a/gnulib/lib/unictype/categ_No.h b/gnulib/lib/unictype/categ_No.h
new file mode 100644
index 00000000..b6ae929e
--- /dev/null
+++ b/gnulib/lib/unictype/categ_No.h
@@ -0,0 +1,355 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[18 << 4];
+ }
+u_categ_No =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x720C0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00070000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x003F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000FFC00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FFFFE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F10000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFF80000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003C0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0xFFFE0000, 0x00000000,
+ 0x000003FF, 0xFFFE0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF80, 0x000FFFFF, 0x00000000, 0x01E00000,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03C00000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000000FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_P.c b/gnulib/lib/unictype/categ_P.c
new file mode 100644
index 00000000..14f94ad4
--- /dev/null
+++ b/gnulib/lib/unictype/categ_P.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_P table. */
+#include "categ_P.h"
+
+const uc_general_category_t UC_CATEGORY_P =
+ { UC_CATEGORY_MASK_P, 0, { &u_categ_P } };
diff --git a/gnulib/lib/unictype/categ_P.h b/gnulib/lib/unictype/categ_P.h
new file mode 100644
index 00000000..474eda9d
--- /dev/null
+++ b/gnulib/lib/unictype/categ_P.h
@@ -0,0 +1,403 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[30 << 4];
+ }
+u_categ_P =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x8C00F7EE, 0xB8000001, 0x28000000,
+ 0x00000000, 0x88800802, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x40000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000000,
+ 0x00000600, 0x40000000, 0x00000049, 0x00180000,
+ 0xC8003600, 0x00000000, 0x00000000, 0x00003C00,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100000,
+ 0x00000000, 0x00000000, 0x0C008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0007FFF0, 0x3C000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x001F0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FC00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000001FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x00000000, 0x00600000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07700000, 0x00000000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF8000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFF00FF, 0x7FFBFFEF, 0x60000000,
+ 0x00006000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000600, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x003FFF00,
+ 0x00000000, 0x00000000, 0x00000060, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01FFFFF8, 0x00000000, 0x0F000000, 0x30000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xDE000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00017FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFF3FF0E, 0x20010000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x40080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00F00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x00000000,
+ 0x00000000, 0x0000C000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xF0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0xFFFF0000, 0xFFF7FFFF, 0x00000D0B,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8C00F7EE, 0xB8000001, 0xA8000000, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x01FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pc.c b/gnulib/lib/unictype/categ_Pc.c
new file mode 100644
index 00000000..a0c9ff81
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pc.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pc table. */
+#include "categ_Pc.h"
+
+const uc_general_category_t UC_CATEGORY_Pc =
+ { UC_CATEGORY_MASK_Pc, 0, { &u_categ_Pc } };
diff --git a/gnulib/lib/unictype/categ_Pc.h b/gnulib/lib/unictype/categ_Pc.h
new file mode 100644
index 00000000..e2e11363
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pc.h
@@ -0,0 +1,164 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Pc =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32
+ },
+ {
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00100001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00180000, 0x0000E000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pd.c b/gnulib/lib/unictype/categ_Pd.c
new file mode 100644
index 00000000..8e666338
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pd.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pd table. */
+#include "categ_Pd.h"
+
+const uc_general_category_t UC_CATEGORY_Pd =
+ { UC_CATEGORY_MASK_Pd, 0, { &u_categ_Pd } };
diff --git a/gnulib/lib/unictype/categ_Pd.h b/gnulib/lib/unictype/categ_Pd.h
new file mode 100644
index 00000000..91830943
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pd.h
@@ -0,0 +1,180 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_categ_Pd =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96
+ },
+ {
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x40000000, 0x00000000, 0x00000000,
+ 0x00000040, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x04800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x10000000, 0x00010000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00060000, 0x01000000, 0x00000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pe.c b/gnulib/lib/unictype/categ_Pe.c
new file mode 100644
index 00000000..f911f38a
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pe.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pe table. */
+#include "categ_Pe.h"
+
+const uc_general_category_t UC_CATEGORY_Pe =
+ { UC_CATEGORY_MASK_Pe, 0, { &u_categ_Pe } };
diff --git a/gnulib/lib/unictype/categ_Pe.h b/gnulib/lib/unictype/categ_Pe.h
new file mode 100644
index 00000000..a85dcae5
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pe.h
@@ -0,0 +1,196 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_categ_Pe =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144,
+ 2 + 128 * sizeof (short) / sizeof (int) + 160
+ },
+ {
+ 0x00000000, 0x00000200, 0x20000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x28000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x10000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x40000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x002AAA00,
+ 0x00000000, 0x00000000, 0x00000040, 0x0000AA80,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01555550, 0x00000000, 0x0A000000, 0x20000000,
+ 0x00000000, 0x000002A8, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xCAA2AA00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01000000, 0x55400000, 0x54000115, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000200, 0x20000000, 0x20000000, 0x00000009,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pf.c b/gnulib/lib/unictype/categ_Pf.c
new file mode 100644
index 00000000..c49b52be
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pf.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pf table. */
+#include "categ_Pf.h"
+
+const uc_general_category_t UC_CATEGORY_Pf =
+ { UC_CATEGORY_MASK_Pf, 0, { &u_categ_Pf } };
diff --git a/gnulib/lib/unictype/categ_Pf.h b/gnulib/lib/unictype/categ_Pf.h
new file mode 100644
index 00000000..74aa60ad
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pf.h
@@ -0,0 +1,164 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Pf =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x08000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x22000000, 0x04000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x20002428, 0x00000002, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pi.c b/gnulib/lib/unictype/categ_Pi.c
new file mode 100644
index 00000000..bf555000
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pi.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pi table. */
+#include "categ_Pi.h"
+
+const uc_general_category_t UC_CATEGORY_Pi =
+ { UC_CATEGORY_MASK_Pi, 0, { &u_categ_Pi } };
diff --git a/gnulib/lib/unictype/categ_Pi.h b/gnulib/lib/unictype/categ_Pi.h
new file mode 100644
index 00000000..7b8caf17
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pi.h
@@ -0,0 +1,164 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Pi =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x99000000, 0x02000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x10001214, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Po.c b/gnulib/lib/unictype/categ_Po.c
new file mode 100644
index 00000000..71cc4b0c
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Po.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Po table. */
+#include "categ_Po.h"
+
+const uc_general_category_t UC_CATEGORY_Po =
+ { UC_CATEGORY_MASK_Po, 0, { &u_categ_Po } };
diff --git a/gnulib/lib/unictype/categ_Po.h b/gnulib/lib/unictype/categ_Po.h
new file mode 100644
index 00000000..37d7fb09
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Po.h
@@ -0,0 +1,387 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[26 << 4];
+ }
+u_categ_Po =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x8C00D4EE, 0x10000001, 0x00000000,
+ 0x00000000, 0x80800002, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x40000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000000,
+ 0x00000200, 0x00000000, 0x00000049, 0x00180000,
+ 0xC8003600, 0x00000000, 0x00000000, 0x00003C00,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100000,
+ 0x00000000, 0x00000000, 0x0C008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0007FFF0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x001F0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FC00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000001FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x00000000, 0x00600000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07700000, 0x00000000,
+ 0x000007BF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF8000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00C00000, 0x79FF00FF, 0x7FEBFF8E, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xDE000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xCB7FC9C3, 0x00017C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000E, 0x20000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x40080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00F00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x00000000,
+ 0x00000000, 0x0000C000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xF0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x027F0000, 0x00010000, 0x80F71E60, 0x00000D03,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8C00D4EE, 0x10000001, 0x00000000, 0x00000032,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x01FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Ps.c b/gnulib/lib/unictype/categ_Ps.c
new file mode 100644
index 00000000..ce49d393
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Ps.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Ps table. */
+#include "categ_Ps.h"
+
+const uc_general_category_t UC_CATEGORY_Ps =
+ { UC_CATEGORY_MASK_Ps, 0, { &u_categ_Ps } };
diff --git a/gnulib/lib/unictype/categ_Ps.h b/gnulib/lib/unictype/categ_Ps.h
new file mode 100644
index 00000000..25d10cf0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Ps.h
@@ -0,0 +1,196 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_categ_Ps =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144,
+ 2 + 128 * sizeof (short) / sizeof (int) + 160
+ },
+ {
+ 0x00000000, 0x00000100, 0x08000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x14000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x08000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x44000000, 0x00000000, 0x00000020, 0x20000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00155500,
+ 0x00000000, 0x00000000, 0x00000020, 0x00005540,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00AAAAA8, 0x00000000, 0x05000000, 0x10000000,
+ 0x00000000, 0x00000154, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x25515500, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00800000, 0xAAA00000, 0x2A00008A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000100, 0x08000000, 0x88000000, 0x00000004,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_S.c b/gnulib/lib/unictype/categ_S.c
new file mode 100644
index 00000000..1661bb25
--- /dev/null
+++ b/gnulib/lib/unictype/categ_S.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_S table. */
+#include "categ_S.h"
+
+const uc_general_category_t UC_CATEGORY_S =
+ { UC_CATEGORY_MASK_S, 0, { &u_categ_S } };
diff --git a/gnulib/lib/unictype/categ_S.h b/gnulib/lib/unictype/categ_S.h
new file mode 100644
index 00000000..e3638381
--- /dev/null
+++ b/gnulib/lib/unictype/categ_S.h
@@ -0,0 +1,427 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[36 << 4];
+ }
+u_categ_S =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ 3 + 256 * sizeof (short) / sizeof (int) + 480,
+ 3 + 256 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 512,
+ 3 + 256 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 544,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x70000810, 0x40000000, 0x50000001,
+ 0x00000000, 0x0153D3FC, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC003C, 0xFFFFAFE0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00200000,
+ 0x00000030, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C9C0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x60000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x040C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00060000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFCF8000E, 0x01500000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x0000DFBF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000001,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FF007FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x00000000, 0x00000000, 0x00040010, 0x1C000000,
+ 0x00001C00, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xC1D0037B, 0x0C0042AF, 0x0000BC1F, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFF9FF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x1FFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFF3DE, 0xFFFFFEFF, 0x7F47AFFF, 0x000000FE,
+ 0xFF100000, 0x7FFEFFFF, 0xFFFF179F, 0xFFFF003F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFE000007, 0xFFFFFFFF, 0xF0FFFFFF, 0xCFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x001F1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000007E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0x000C0010, 0xC0C00001, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFC30000, 0x00000000, 0xFFFFFFFF, 0x0000000F,
+ 0x7FFFFFFF, 0xFFFFFC00, 0x0001000F, 0xFFFFFFFF,
+ 0xFFFFFC00, 0x0001FFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x007FFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000600, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000F00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000274,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x70000810, 0x40000000, 0x50000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30007F7F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0xFF800000, 0x00000000, 0xFE000000,
+ 0x0FFF03FF, 0x00000000, 0xFFFF0000, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0x00001C1F,
+ 0xFFFFF018, 0xFFFFC3FF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000002, 0x08000000,
+ 0x00200000, 0x00200000, 0x00008000, 0x00008000,
+ 0x00000200, 0x00000200, 0x00000008, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Sc.c b/gnulib/lib/unictype/categ_Sc.c
new file mode 100644
index 00000000..f5933fa5
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sc.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Sc table. */
+#include "categ_Sc.h"
+
+const uc_general_category_t UC_CATEGORY_Sc =
+ { UC_CATEGORY_MASK_Sc, 0, { &u_categ_Sc } };
diff --git a/gnulib/lib/unictype/categ_Sc.h b/gnulib/lib/unictype/categ_Sc.h
new file mode 100644
index 00000000..c6690f11
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sc.h
@@ -0,0 +1,188 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_categ_Sc =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128
+ },
+ {
+ 0x00000000, 0x00000010, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000003C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000063
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Sk.c b/gnulib/lib/unictype/categ_Sk.c
new file mode 100644
index 00000000..3ff45524
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sk.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Sk table. */
+#include "categ_Sk.h"
+
+const uc_general_category_t UC_CATEGORY_Sk =
+ { UC_CATEGORY_MASK_Sk, 0, { &u_categ_Sk } };
diff --git a/gnulib/lib/unictype/categ_Sk.h b/gnulib/lib/unictype/categ_Sk.h
new file mode 100644
index 00000000..dc755970
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sk.h
@@ -0,0 +1,176 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[6 << 4];
+ }
+u_categ_Sk =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80
+ },
+ {
+ 0x00000000, 0x00000000, 0x40000000, 0x00000001,
+ 0x00000000, 0x01108100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC003C, 0xFFFFAFE0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00200000,
+ 0x00000030, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x007FFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000600, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000008
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Sm.c b/gnulib/lib/unictype/categ_Sm.c
new file mode 100644
index 00000000..f1f09f10
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sm.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Sm table. */
+#include "categ_Sm.h"
+
+const uc_general_category_t UC_CATEGORY_Sm =
+ { UC_CATEGORY_MASK_Sm, 0, { &u_categ_Sm } };
diff --git a/gnulib/lib/unictype/categ_Sm.h b/gnulib/lib/unictype/categ_Sm.h
new file mode 100644
index 00000000..ffb7cb3d
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sm.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_categ_Sm =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x70000800, 0x00000000, 0x50000000,
+ 0x00000000, 0x00021000, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00400000,
+ 0x000001C0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00040010, 0x1C000000,
+ 0x00001C00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000081F, 0x00000000,
+ 0x0C1F0000, 0x00004049, 0x0014C000, 0xFFF00000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000F00, 0x00000003, 0x00000000, 0x10000000,
+ 0xF8000000, 0x000FFFFF, 0xF0000000, 0x00000003,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00800000, 0x00000002, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00008000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF179F, 0xFFFF003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFE000007, 0xFFFFFFFF, 0xF0FFFFFF, 0xCFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFFFF0000, 0x00001F9F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000074,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x70000800, 0x00000000, 0x50000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00001E04,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000002, 0x08000000,
+ 0x00200000, 0x00200000, 0x00008000, 0x00008000,
+ 0x00000200, 0x00000200, 0x00000008, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_So.c b/gnulib/lib/unictype/categ_So.c
new file mode 100644
index 00000000..691dcc2f
--- /dev/null
+++ b/gnulib/lib/unictype/categ_So.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_So table. */
+#include "categ_So.h"
+
+const uc_general_category_t UC_CATEGORY_So =
+ { UC_CATEGORY_MASK_So, 0, { &u_categ_So } };
diff --git a/gnulib/lib/unictype/categ_So.h b/gnulib/lib/unictype/categ_So.h
new file mode 100644
index 00000000..f0fa49f0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_So.h
@@ -0,0 +1,403 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[30 << 4];
+ }
+u_categ_So =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x004142C0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x60000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x05F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00060000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFCF8000E, 0x01500000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x0000DFBF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000001,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FF007FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC1D0037B, 0x0C0042AF, 0x0000B400, 0x00000000,
+ 0xF3E00000, 0xFFFFBFB6, 0xFFEB3FFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFF0FF, 0xFFFFF9FC, 0xFFFFFFFF, 0xEFFFFFFF,
+ 0x07FFFFFF, 0xFFF00000, 0x0FFFFFFF, 0x000000FC,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFF7FFFFF, 0xFFFFFFFD, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF7FFF,
+ 0x3FFFFFFF, 0x1FFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFF3DE, 0xFFFFFEFF, 0x7F47AFFF, 0x000000FE,
+ 0xFF100000, 0x7FFEFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0000FFFF, 0x001F0060, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000007E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0x000C0010, 0xC0C00001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFC30000, 0x00000000, 0xFFFFFFFF, 0x0000000F,
+ 0x7FFFFFFF, 0xFFFFFC00, 0x0001000F, 0xFFFFFFFF,
+ 0xFFFFFC00, 0x0001FFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000F00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30006110,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0xFF800000, 0x00000000, 0xFE000000,
+ 0x0FFF03FF, 0x00000000, 0xFFFF0000, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0x00001C1F,
+ 0xFFFFF018, 0xFFFFC3FF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Z.c b/gnulib/lib/unictype/categ_Z.c
new file mode 100644
index 00000000..569d82a9
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Z.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Z table. */
+#include "categ_Z.h"
+
+const uc_general_category_t UC_CATEGORY_Z =
+ { UC_CATEGORY_MASK_Z, 0, { &u_categ_Z } };
diff --git a/gnulib/lib/unictype/categ_Z.h b/gnulib/lib/unictype/categ_Z.h
new file mode 100644
index 00000000..fa41dd60
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Z.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_categ_Z =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00008300, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Zl.c b/gnulib/lib/unictype/categ_Zl.c
new file mode 100644
index 00000000..58b075ec
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zl.c
@@ -0,0 +1,30 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static bool
+uc_is_category_Zl (ucs4_t uc)
+{
+ return (uc == 0x2028);
+}
+
+const uc_general_category_t UC_CATEGORY_Zl =
+ { UC_CATEGORY_MASK_Zl, 1, { &uc_is_category_Zl } };
diff --git a/gnulib/lib/unictype/categ_Zl.h b/gnulib/lib/unictype/categ_Zl.h
new file mode 100644
index 00000000..1ddb0077
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zl.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_categ_Zl =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Zp.c b/gnulib/lib/unictype/categ_Zp.c
new file mode 100644
index 00000000..3cc8c6c4
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zp.c
@@ -0,0 +1,30 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static bool
+uc_is_category_Zp (ucs4_t uc)
+{
+ return (uc == 0x2029);
+}
+
+const uc_general_category_t UC_CATEGORY_Zp =
+ { UC_CATEGORY_MASK_Zp, 1, { &uc_is_category_Zp } };
diff --git a/gnulib/lib/unictype/categ_Zp.h b/gnulib/lib/unictype/categ_Zp.h
new file mode 100644
index 00000000..3ee4da9d
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zp.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_categ_Zp =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Zs.c b/gnulib/lib/unictype/categ_Zs.c
new file mode 100644
index 00000000..b4cfed6f
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zs.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Zs table. */
+#include "categ_Zs.h"
+
+const uc_general_category_t UC_CATEGORY_Zs =
+ { UC_CATEGORY_MASK_Zs, 0, { &u_categ_Zs } };
diff --git a/gnulib/lib/unictype/categ_Zs.h b/gnulib/lib/unictype/categ_Zs.h
new file mode 100644
index 00000000..7dbf3424
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zs.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_categ_Zs =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00008000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_and.c b/gnulib/lib/unictype/categ_and.c
new file mode 100644
index 00000000..67a06fa4
--- /dev/null
+++ b/gnulib/lib/unictype/categ_and.c
@@ -0,0 +1,45 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+uc_general_category_t
+uc_general_category_and (uc_general_category_t category1,
+ uc_general_category_t category2)
+{
+ uint32_t bitmask;
+ uc_general_category_t result;
+
+ bitmask = category1.bitmask & category2.bitmask;
+
+ if (bitmask == category1.bitmask)
+ return category1;
+
+ if (bitmask == category2.bitmask)
+ return category2;
+
+ if (bitmask == 0)
+ return _UC_CATEGORY_NONE;
+
+ result.bitmask = bitmask;
+ result.generic = 1;
+ result.lookup.lookup_fn = &uc_is_general_category_withtable;
+ return result;
+}
diff --git a/gnulib/lib/unictype/categ_and_not.c b/gnulib/lib/unictype/categ_and_not.c
new file mode 100644
index 00000000..b550cccc
--- /dev/null
+++ b/gnulib/lib/unictype/categ_and_not.c
@@ -0,0 +1,42 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+uc_general_category_t
+uc_general_category_and_not (uc_general_category_t category1,
+ uc_general_category_t category2)
+{
+ uint32_t bitmask;
+ uc_general_category_t result;
+
+ bitmask = category1.bitmask & ~category2.bitmask;
+
+ if (bitmask == category1.bitmask)
+ return category1;
+
+ if (bitmask == 0)
+ return _UC_CATEGORY_NONE;
+
+ result.bitmask = bitmask;
+ result.generic = 1;
+ result.lookup.lookup_fn = &uc_is_general_category_withtable;
+ return result;
+}
diff --git a/gnulib/lib/unictype/categ_byname.c b/gnulib/lib/unictype/categ_byname.c
new file mode 100644
index 00000000..fb75b675
--- /dev/null
+++ b/gnulib/lib/unictype/categ_byname.c
@@ -0,0 +1,105 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+uc_general_category_t
+uc_general_category_byname (const char *category_name)
+{
+ if (category_name[0] != '\0'
+ && (category_name[1] == '\0' || category_name[2] == '\0'))
+ switch (category_name[0])
+ {
+ case 'L':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_L;
+ case 'u': return UC_CATEGORY_Lu;
+ case 'l': return UC_CATEGORY_Ll;
+ case 't': return UC_CATEGORY_Lt;
+ case 'm': return UC_CATEGORY_Lm;
+ case 'o': return UC_CATEGORY_Lo;
+ }
+ break;
+ case 'M':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_M;
+ case 'n': return UC_CATEGORY_Mn;
+ case 'c': return UC_CATEGORY_Mc;
+ case 'e': return UC_CATEGORY_Me;
+ }
+ break;
+ case 'N':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_N;
+ case 'd': return UC_CATEGORY_Nd;
+ case 'l': return UC_CATEGORY_Nl;
+ case 'o': return UC_CATEGORY_No;
+ }
+ break;
+ case 'P':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_P;
+ case 'c': return UC_CATEGORY_Pc;
+ case 'd': return UC_CATEGORY_Pd;
+ case 's': return UC_CATEGORY_Ps;
+ case 'e': return UC_CATEGORY_Pe;
+ case 'i': return UC_CATEGORY_Pi;
+ case 'f': return UC_CATEGORY_Pf;
+ case 'o': return UC_CATEGORY_Po;
+ }
+ break;
+ case 'S':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_S;
+ case 'm': return UC_CATEGORY_Sm;
+ case 'c': return UC_CATEGORY_Sc;
+ case 'k': return UC_CATEGORY_Sk;
+ case 'o': return UC_CATEGORY_So;
+ }
+ break;
+ case 'Z':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_Z;
+ case 's': return UC_CATEGORY_Zs;
+ case 'l': return UC_CATEGORY_Zl;
+ case 'p': return UC_CATEGORY_Zp;
+ }
+ break;
+ case 'C':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_C;
+ case 'c': return UC_CATEGORY_Cc;
+ case 'f': return UC_CATEGORY_Cf;
+ case 's': return UC_CATEGORY_Cs;
+ case 'o': return UC_CATEGORY_Co;
+ case 'n': return UC_CATEGORY_Cn;
+ }
+ break;
+ }
+ /* Invalid category name. */
+ return _UC_CATEGORY_NONE;
+}
diff --git a/gnulib/lib/unictype/categ_name.c b/gnulib/lib/unictype/categ_name.c
new file mode 100644
index 00000000..1243e2f0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_name.c
@@ -0,0 +1,77 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static const char u_category_name[30][3] =
+{
+ "Lu", "Ll", "Lt", "Lm", "Lo", "Mn", "Mc", "Me", "Nd", "Nl",
+ "No", "Pc", "Pd", "Ps", "Pe", "Pi", "Pf", "Po", "Sm", "Sc",
+ "Sk", "So", "Zs", "Zl", "Zp", "Cc", "Cf", "Cs", "Co", "Cn"
+};
+
+const char *
+uc_general_category_name (uc_general_category_t category)
+{
+ uint32_t bitmask = category.bitmask;
+ /* bitmask should consist of a single bit. */
+ if (bitmask != 0)
+ {
+ if ((bitmask & (bitmask - 1)) == 0)
+ {
+ int bit;
+ /* Take log2 using a variant of Robert Harley's method.
+ Found by Bruno Haible 1996. */
+ uint32_t n = bitmask;
+ static const char ord2_tab[64] =
+ {
+ -1, 0, 1, 12, 2, 6, -1, 13, 3, -1, 7, -1, -1, -1, -1, 14,
+ 10, 4, -1, -1, 8, -1, -1, 25, -1, -1, -1, -1, -1, 21, 27, 15,
+ 31, 11, 5, -1, -1, -1, -1, -1, 9, -1, -1, 24, -1, -1, 20, 26,
+ 30, -1, -1, -1, -1, 23, -1, 19, 29, -1, 22, 18, 28, 17, 16, -1
+ };
+ n += n << 4;
+ n += n << 6;
+ n = (n << 16) - n;
+ bit = ord2_tab[n >> 26];
+
+ if (bit < sizeof (u_category_name) / sizeof (u_category_name[0]))
+ return u_category_name[bit];
+ }
+ else
+ {
+ if (bitmask == UC_CATEGORY_MASK_L)
+ return "L";
+ if (bitmask == UC_CATEGORY_MASK_M)
+ return "M";
+ if (bitmask == UC_CATEGORY_MASK_N)
+ return "N";
+ if (bitmask == UC_CATEGORY_MASK_P)
+ return "P";
+ if (bitmask == UC_CATEGORY_MASK_S)
+ return "S";
+ if (bitmask == UC_CATEGORY_MASK_Z)
+ return "Z";
+ if (bitmask == UC_CATEGORY_MASK_C)
+ return "C";
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/categ_none.c b/gnulib/lib/unictype/categ_none.c
new file mode 100644
index 00000000..39bc8b24
--- /dev/null
+++ b/gnulib/lib/unictype/categ_none.c
@@ -0,0 +1,30 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static bool
+always_false (ucs4_t uc, uint32_t bitmask)
+{
+ return false;
+}
+
+const uc_general_category_t _UC_CATEGORY_NONE =
+ { 0, 1, { &always_false } };
diff --git a/gnulib/lib/unictype/categ_of.c b/gnulib/lib/unictype/categ_of.c
new file mode 100644
index 00000000..66cca8d0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_of.c
@@ -0,0 +1,81 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_category table. */
+#include "categ_of.h"
+
+static inline int
+lookup_withtable (ucs4_t uc)
+{
+ unsigned int index1 = uc >> category_header_0;
+ if (index1 < category_header_1)
+ {
+ int lookup1 = u_category.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> category_header_2) & category_header_3;
+ int lookup2 = u_category.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = ((uc & category_header_4) + lookup2) * 5;
+ /* level3 contains 5-bit values, packed into 16-bit words. */
+ unsigned int lookup3 =
+ ((u_category.level3[index3>>4]
+ | (u_category.level3[(index3>>4)+1] << 16))
+ >> (index3 % 16))
+ & 0x1f;
+
+ return lookup3;
+ }
+ }
+ return 29; /* = log2(UC_CATEGORY_MASK_Cn) */
+ }
+ return -1;
+}
+
+bool
+uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask)
+{
+ int bit = lookup_withtable (uc);
+
+ if (bit >= 0)
+ return ((bitmask >> bit) & 1);
+ else
+ return false;
+}
+
+uc_general_category_t
+uc_general_category (ucs4_t uc)
+{
+ int bit = lookup_withtable (uc);
+ uc_general_category_t result;
+
+ if (bit >= 0)
+ {
+ result.bitmask = 1 << bit;
+ result.generic = 1;
+ result.lookup.lookup_fn = &uc_is_general_category_withtable;
+ return result;
+ }
+ else
+ return _UC_CATEGORY_NONE;
+}
diff --git a/gnulib/lib/unictype/categ_of.h b/gnulib/lib/unictype/categ_of.h
new file mode 100644
index 00000000..3df7e0c9
--- /dev/null
+++ b/gnulib/lib/unictype/categ_of.h
@@ -0,0 +1,1088 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define category_header_0 16
+#define category_header_1 17
+#define category_header_2 7
+#define category_header_3 511
+#define category_header_4 127
+static const
+struct
+ {
+ int level1[17];
+ short level2[5 << 9];
+ unsigned short level3[148 * 40 + 1];
+ }
+u_category =
+{
+ {
+ 0, 512, 1024, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1536, 2048,
+ 2048
+ },
+ {
+ 0, 128, 256, 384, 512, 640, 768, 896,
+ 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920,
+ -1, -1, 2048, 2176, 2304, 2432, 2560, 2688,
+ 2816, 2944, 3072, 3200, 3328, 3456, 3584, 3712,
+ 3840, 3968, 4096, 4224, 4352, 4480, 4608, 4736,
+ 4864, 4992, 4992, 4992, 5120, 5248, 5376, 5504,
+ 5632, 5760, 5888, 6016, 6144, -1, 6272, 6400,
+ 6528, -1, 6656, 6784, 6912, 7040, 7168, 7296,
+ 7424, 7552, 7680, 7808, 7936, 7936, 8064, 8192,
+ 8320, 8448, 8576, 8704, 8832, 8960, 9088, 9216,
+ 8576, 8576, 7936, 9344, 7936, 7936, 9472, -1,
+ 9600, 9728, 9856, 9984, 10112, 10240, 8576, 10368,
+ 10496, 10624, 10752, 10880, 11008, 11136, 8576, 8576,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 11264, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 11392,
+ 11520, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 11648, 4992, 4992, 11776, 11904, 12032, 12160,
+ 12288, 12416, 12544, -1, 12672, -1, -1, -1,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 12800,
+ 12928, 12928, 12928, 12928, 12928, 12928, 12928, 12928,
+ 12928, 12928, 12928, 12928, 12928, 12928, 12928, 12928,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 4992, 4992, 13184, 13312, 13440, 13568,
+ 4992, 4992, 13696, 13824, 13952, 14080, 14208, 14336,
+ 14464, 14592, 14720, 14848, -1, 14976, 15104, 15232,
+ 15360, 15488, -1, -1, -1, -1, -1, -1,
+ 15616, -1, 15744, -1, 15872, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4992, 4992, 4992, 4992, 4992, 4992, 16000, -1,
+ 16128, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8576, 16256, 16384, 16512, 16640, -1, 16768, -1,
+ 16896, 17024, 17152, 17280, 17408, 17536, 17664, 17792,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 17920, 18048, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 4992, 4992, 4992,
+ 4992, 4992, 4992, 4992, 4992, 18176, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4992, 4992, 4992, 4992, 18304, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 18432, -1, 18560, 18688, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 13056,
+ 13056, 13056, 13056, 13056, 13056, 13056, 13056, 18816
+ },
+ {
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xc636, 0x6338, 0xcd8c, 0x1945, 0x8c59, 0x2108,
+ 0x1084, 0x0842, 0x28c5, 0x8ca5, 0x0011, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x1680, 0x5d1d, 0x8434, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x2684, 0xcc9d,
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xce36, 0x6739, 0xb4ad, 0x2786, 0xa575, 0x2a55,
+ 0x4345, 0x548d, 0xa805, 0x8a94, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0800, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2190, 0x1084, 0x0842,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x0108, 0x1004, 0x0040, 0x0401, 0x4010, 0x2100, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x0008, 0x1004, 0x0840,
+ 0x8001, 0x0200, 0x0100, 0x1000, 0x0002, 0x0400, 0x0200, 0x2000,
+ 0x0084, 0x0040, 0x8020, 0x0200, 0x0100, 0x0084, 0x0002, 0x0001,
+ 0x4010, 0x2000, 0x0204, 0x0842, 0x1084, 0x4402, 0x2200, 0x1100,
+ 0x0040, 0x0401, 0x4010, 0x0100, 0x1004, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8801, 0x0200, 0x2000, 0x0080, 0x0802,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x4210, 0x2108, 0x1000, 0x0800, 0x0401, 0x0000, 0x2008, 0x0080,
+ 0x0802, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4240, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x5063, 0xe94a, 0x6318, 0x318c,
+ 0x18c6, 0x5063, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x8c63, 0x2831,
+ 0x94a5, 0x3a52, 0xa0e8, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x8020, 0x2830, 0xbd08, 0x108f, 0xec42,
+ 0xf7bd, 0x294e, 0x0088, 0x0e80, 0x003a, 0x0001, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x7400, 0x0000, 0x0000, 0x1000, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0042, 0x0021, 0x4200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8421, 0x8200, 0x0104, 0x1080, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802,
+ 0xd420, 0x4a52, 0xe729, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x0400, 0x4010, 0x0100, 0x1004,
+ 0x0840, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x7bd0, 0xbdef, 0xdef7, 0xef7b, 0x001d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x7de8, 0x18c4, 0x8c63, 0x843d, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x3d08, 0xdeb2, 0xef7b, 0x94bd, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x2b0a, 0x94b1, 0x4a58, 0xbd2c, 0xdef7,
+ 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0xde90, 0xef7b, 0x9084, 0x7b18, 0xbdef, 0xdef7, 0xef7b,
+ 0x6b5a, 0xbbdd, 0x3294, 0x19c6, 0xad63, 0x94a5, 0x4a52, 0xa529,
+ 0xd894, 0x8c7b, 0x109d, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0x8421, 0x5290,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xe94a, 0x2108, 0x1084,
+ 0x0842, 0x18c5, 0x2123, 0x1085, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x4912, 0xa529, 0x5294, 0x29f4, 0x94a5, 0xc652,
+ 0xa528, 0x5296, 0x210a, 0x2108, 0x1084, 0x0842, 0x4211, 0x256a,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0xd763, 0x10a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xde94,
+ 0x2109, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, 0x5294, 0x294a, 0xf485,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0x4211,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x5290, 0x294a, 0x94a5, 0x4632, 0x318d, 0xde8e, 0xef7b,
+ 0x14bd, 0x0843, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x5ef4, 0x3188, 0x94a6, 0x4a52, 0xc529, 0x6318,
+ 0xef4a, 0x94a4, 0x7a52, 0x84ef, 0x4210, 0x2108, 0x9484, 0x2312,
+ 0x0842, 0x8421, 0x4210, 0x9071, 0x7bde, 0xbdef, 0x4277, 0x2108,
+ 0x18bd, 0x09d3, 0x8421, 0x4210, 0x277a, 0x77a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x93a4,
+ 0x3bde, 0x8421, 0x5ef4, 0x3188, 0x94a6, 0x7a52, 0xa637, 0x6377,
+ 0xe90a, 0xf7bd, 0x7bde, 0xbd37, 0x4ef7, 0x2748, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0xcc84, 0x94a9, 0x4a52, 0xded5, 0xef7b,
+ 0x14bd, 0x09d3, 0x8421, 0xde90, 0x277b, 0x77a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4,
+ 0x09d2, 0x84e9, 0x5ef4, 0x31ba, 0x94a6, 0x7bde, 0xa52f, 0x52f7,
+ 0xef4a, 0xf4bd, 0x7bde, 0x9def, 0x4210, 0xe93a, 0xf7bd, 0x3bde,
+ 0x0842, 0x8421, 0x4210, 0x10a5, 0x4a42, 0xbdef, 0xdef7, 0xef7b,
+ 0x14bd, 0x09d3, 0x8421, 0x4210, 0x2748, 0x7484, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4,
+ 0x09d2, 0x8421, 0x5ef4, 0x3188, 0x94a6, 0x4a52, 0xc52f, 0x6374,
+ 0xef4a, 0xf7a4, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0xf67d, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x18bd, 0x09d3, 0x8421, 0x4210, 0x277a, 0x77a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4,
+ 0x09d2, 0x8421, 0x5ef4, 0x2988, 0x94a6, 0x7a52, 0xa637, 0x6377,
+ 0xef4a, 0xf7bd, 0x7bde, 0xbd31, 0x4ef7, 0x2748, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0xf495, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x17bd, 0x09d2, 0x8421, 0xde90, 0x213b, 0x13a4, 0x4842, 0x9def,
+ 0x4e90, 0x213a, 0x77bd, 0x7a42, 0x84ef, 0xde90, 0x213b, 0x1084,
+ 0x0842, 0x8421, 0xdef4, 0x31bb, 0x98c5, 0xbbde, 0xa631, 0x631b,
+ 0xef4a, 0xf7a4, 0x7bde, 0xbd37, 0xdef7, 0xef7b, 0xf7bd, 0x3bde,
+ 0x0842, 0x8421, 0x4210, 0xa94a, 0x6b5a, 0x75ad, 0xded6, 0xef7b,
+ 0x18dd, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x1084,
+ 0x09d2, 0x8421, 0xdef4, 0x2949, 0x18c5, 0x7a63, 0xa529, 0x5297,
+ 0xef4a, 0xf7bd, 0x4bde, 0x84e9, 0xdef4, 0xef7b, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0xf7bd, 0x7bde, 0x4aef, 0xa529, 0xaa94,
+ 0x1bbd, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x1084,
+ 0x09d2, 0x8421, 0x5ef4, 0x2988, 0x18c6, 0x7a63, 0xa631, 0x531b,
+ 0xef4a, 0xf7bd, 0x8dde, 0xbde9, 0xdef7, 0xe93b, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0xd6bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1bbd, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0xdef4, 0x3189, 0x94a6, 0xba52, 0xa631, 0x631b,
+ 0xef4a, 0xf7bd, 0x7bde, 0xbd37, 0xdef7, 0xef7b, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0x294a, 0x54a5, 0xbdef, 0x4212, 0x2108,
+ 0x1bbd, 0x09d3, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9,
+ 0x4213, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x7484,
+ 0x0842, 0x8421, 0xd210, 0xef49, 0x1084, 0x0842, 0xbde9, 0xde97,
+ 0x377b, 0x94c6, 0x7a52, 0xc6e9, 0x6318, 0x318c, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0x1bbd, 0x7b13, 0xbdef, 0xdef7, 0xef7b,
+ 0x109d, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x10a4,
+ 0x4a52, 0xa529, 0xde94, 0x9f7b, 0x1084, 0xc842, 0xa528, 0x5294,
+ 0x894a, 0x2108, 0x1084, 0x0842, 0xd8c5, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x909d, 0x7a4e, 0xa427, 0xde93, 0xef49, 0xf7bd, 0x084e, 0x9d21,
+ 0x4210, 0x2108, 0x109d, 0x49d2, 0xbd27, 0xd213, 0x2109, 0x10a4,
+ 0x4a52, 0xa529, 0x52f4, 0xef48, 0x1084, 0xfa42, 0xa5e8, 0x5294,
+ 0xef4a, 0x2108, 0x1084, 0x0842, 0x4ef5, 0xef48, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6a4, 0x631a, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6b5a, 0xa5ad,
+ 0x5ad4, 0xad6b, 0x2108, 0x1084, 0x0842, 0xa529, 0x5294, 0x294a,
+ 0x4b55, 0xb52d, 0xd734, 0x319c, 0x1084, 0x0842, 0x9d21, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0xef7a, 0x94bd, 0x4a52, 0xa529, 0x5294, 0x314a,
+ 0x94a5, 0x6252, 0x8429, 0xd210, 0xef7b, 0x94a5, 0x4a52, 0xbd29,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0xad7a, 0xd6b5, 0x6b5a, 0xb5a9, 0x5ad6,
+ 0xad7b, 0xc631, 0x7b18, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x6310, 0x294a, 0x94c5,
+ 0x4a52, 0xa629, 0x6314, 0x214a, 0x2108, 0x1084, 0x0842, 0x18c5,
+ 0x8c63, 0x1084, 0x8842, 0xa531, 0x4210, 0x2948, 0x1885, 0x0863,
+ 0xc631, 0x6318, 0x210c, 0x94a4, 0x0852, 0x8421, 0x4210, 0x2108,
+ 0x1484, 0x4a63, 0xc631, 0x6318, 0x310a, 0x2108, 0x1084, 0x0842,
+ 0xdef5, 0xad7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xbdef, 0xdef7,
+ 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x3890, 0xef7a,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0x277b, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x9084, 0x7bde, 0x84ef, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213,
+ 0xef48, 0x1084, 0x0842, 0xa4e9, 0x4213, 0xef48, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0xa421, 0x4213, 0xef48, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13a4,
+ 0x4842, 0x84ef, 0x4210, 0xe908, 0x13a4, 0x4842, 0x84ef, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x84e9, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13a4, 0x4842, 0x84ef,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0x2f7b, 0xc635, 0x6318,
+ 0x518c, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xef7a,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0xdef6, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x7a42, 0xbdef, 0xdef7, 0xef7b,
+ 0x109d, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2462, 0x1084, 0x0842, 0xbde9, 0xdef7, 0xef7b,
+ 0x1096, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0xe690, 0xef7a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x1890, 0x4a63, 0xf7a9, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x213a, 0x9484, 0x7a52, 0xbdef,
+ 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9484,
+ 0x6252, 0xbdec, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x9484, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x213a, 0x97a4, 0x7bd2, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0xb5a2, 0xa529, 0x5294, 0x318a, 0x18c6, 0x4c63, 0xa631, 0x5294,
+ 0x294a, 0x94a5, 0x6312, 0x311c, 0x49c6, 0xef4a, 0x2108, 0x1084,
+ 0x0842, 0xdef5, 0xef7b, 0x294a, 0x94a5, 0x4a52, 0xdef5, 0xef7b,
+ 0xc631, 0x2318, 0x318b, 0x52c6, 0xed8a, 0x2108, 0x1084, 0x0842,
+ 0xdef5, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, 0x0841, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xde90, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xef7a, 0x14a5, 0x8c63, 0xc529, 0xd318, 0xef7b, 0x14c6,
+ 0x8c63, 0xa631, 0xd294, 0xef7b, 0xf7b5, 0x231e, 0x0842, 0x8421,
+ 0x4210, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0xef48, 0x1084, 0x7a42, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0xef7b, 0x18c6,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x1086, 0x0842, 0xc621, 0xdef4,
+ 0xef7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0x8c7b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xc529,
+ 0xd318, 0x8c7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x94a5, 0x0862, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x4c52, 0xa529, 0x5314, 0x318c, 0x14c6, 0x0863, 0x8421, 0xd210,
+ 0xef7b, 0x2108, 0x1084, 0x0842, 0x18c5, 0x8c63, 0xd6b1, 0x6b5a,
+ 0xb5ad, 0x52d6, 0x294a, 0x94a5, 0x6b52, 0xb5ad, 0x5ad6, 0xef7b,
+ 0x18a5, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x94c4, 0x8a52, 0xa531, 0xde98, 0x213b, 0x2108,
+ 0x1084, 0x0842, 0xdef5, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x8c62, 0xc631, 0x5318, 0x294a, 0x94a5,
+ 0x4c62, 0xbd29, 0x18f7, 0x8c63, 0x2108, 0x1084, 0x0842, 0xdef5,
+ 0x2109, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x6321, 0x318c, 0x8c46,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x3084, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8463, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2308, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x3184, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xbde9, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0x297b,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x4200, 0x2108,
+ 0x1084, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802,
+ 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x00ef,
+ 0x0000, 0xef40, 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x8421,
+ 0x4210, 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x00ef, 0x0000,
+ 0xef40, 0x8421, 0x4210, 0x1d08, 0xd074, 0x0741, 0x8421, 0x4210,
+ 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x2108, 0x1084, 0xef42,
+ 0x8421, 0x4210, 0x4208, 0x2108, 0x1084, 0x8421, 0x4210, 0x4208,
+ 0x2108, 0x1084, 0x8421, 0x4210, 0x4208, 0x2108, 0x1084, 0x8421,
+ 0x7a10, 0x0008, 0x2000, 0xa068, 0x8694, 0x7a10, 0x0008, 0x2000,
+ 0xa528, 0x8421, 0x7bd0, 0x0008, 0xd000, 0xa529, 0x8421, 0x4210,
+ 0x0008, 0x0000, 0xa528, 0x87bd, 0x7a10, 0x0008, 0x2000, 0xed28,
+ 0x5ad6, 0xad6b, 0xd6b5, 0xad5a, 0xd6b5, 0x318c, 0x58c6, 0x0f8c,
+ 0xf7b6, 0x7b60, 0xc631, 0x6318, 0x178c, 0xad6b, 0xb6b5, 0xc631,
+ 0x6318, 0xf18c, 0x18c1, 0x5c63, 0xc62b, 0x9b28, 0x318b, 0x18c6,
+ 0x8c63, 0xca31, 0x62b8, 0x318c, 0x18c6, 0xb463, 0x6b5a, 0x7bad,
+ 0xbdef, 0xad6b, 0xd6b5, 0xf42a, 0x94ae, 0x4a52, 0x2949, 0x0b9b,
+ 0x294a, 0x94a5, 0x4a52, 0x2949, 0xeb9b, 0x8c63, 0x7a31, 0xbdef,
+ 0xdef7, 0xef7b, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0x6739, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x39ce, 0x9ca7, 0x4a73,
+ 0xa529, 0x5294, 0x294a, 0xf7a5, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x82b5, 0x6b5a, 0xb505, 0x0006, 0x0840, 0x8000, 0x4150, 0x15ad,
+ 0x0000, 0xad40, 0xd6b5, 0x2a0a, 0xa0a8, 0x0002, 0x0d40, 0x0000,
+ 0x0810, 0x2421, 0x1ad4, 0x0002, 0x4a52, 0x4129, 0x2108, 0x5954,
+ 0xa86b, 0x77bd, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0x2529, 0x5210, 0xa94a, 0xdef7, 0xef7b, 0x4a52, 0x6b29, 0xb5ad,
+ 0x594a, 0xad6b, 0x56b2, 0xab59, 0xb5ac, 0x5ad6, 0xacab, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0x94ab, 0xcab5, 0x6b2a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0xa52a, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0xd6b5, 0x6b5a, 0x52ad, 0x594a, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd652, 0x6b5a, 0xb5ad, 0x5ab9, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x2ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x2956, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0x6b59, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x2ad6, 0x94a5, 0xd652, 0x6b5a,
+ 0xbdad, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xded6,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0x5529, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0xa52a, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb595, 0x5ad6, 0xad6b, 0xd655, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0x52ad, 0x294a, 0x94a5,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0x956b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xef6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xef7b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6bd, 0x7b5a, 0xb5ad, 0x5ef6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6,
+ 0xaf6b, 0xd6b5, 0x7bde, 0xb5ed, 0x5ad6, 0xed6b, 0xd6bd, 0x6b5a,
+ 0xcdad, 0xd735, 0x735c, 0x35cd, 0x9cd7, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x7b55, 0xb5ef,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6bd,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0x4a52, 0x9b29, 0x5293, 0x2eca,
+ 0xef7b, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x6529,
+ 0xcd73, 0xd735, 0x735c, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0xca52, 0x9ae6, 0xae6b, 0xe6b9, 0x6b9a, 0xb9ae, 0x9ae6, 0x4e6b,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0xcd94, 0x2735, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd94a, 0x949c,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x6b29, 0x5295, 0x294a,
+ 0xef7b, 0xd6b5, 0x7b5a, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe800, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0xe842, 0x0020, 0x4200,
+ 0x0100, 0x1004, 0x0000, 0x803d, 0x4010, 0x2108, 0x1084, 0xef46,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x6a10,
+ 0xb5ad, 0xded6, 0xef7b, 0xf7bd, 0x7bde, 0x3def, 0x18c6, 0x8c55,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0xbdef, 0xdef7, 0xef7b, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842,
+ 0xbdef, 0xdef7, 0x1f7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9,
+ 0xdef7, 0xef7b, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x1084,
+ 0x0842, 0x84e9, 0x4210, 0xe908, 0x1084, 0x0842, 0x84e9, 0x4210,
+ 0xe908, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x3e31, 0x60f8, 0xf18c, 0xf8c1, 0x8c60, 0xc631, 0x6318, 0x3164,
+ 0xf8b2, 0x8c60, 0x360f, 0x5cd7, 0xcd73, 0x18c5, 0x1c63, 0xf7b1,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5af6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b,
+ 0xc636, 0x0758, 0xcd49, 0xd735, 0x735c, 0xd5cd, 0x5cda, 0xcd73,
+ 0xc735, 0x739a, 0xa535, 0x5294, 0x294a, 0x5295, 0x294a, 0x8c6c,
+ 0x4631, 0x29ad, 0x41a5, 0xad62, 0x109d, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9,
+ 0x4a14, 0x20c7, 0x108c, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x3890, 0x20c6,
+ 0xf7bd, 0x09de, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x109d,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0x2ab5, 0x54a5, 0xb5ad,
+ 0x5ad6, 0xad6b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0xbd21, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda,
+ 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xed6b, 0x294a, 0x94a5, 0x4a52, 0x5ad5, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7,
+ 0xef7b, 0x2955, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0x294a, 0x94a5, 0x4a52, 0x5ad5, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x2955,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x4842, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7bd2, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0642, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x3210, 0x8c62, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x2108, 0x1084, 0x0842, 0xd211, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x83bd, 0x0200,
+ 0x2008, 0x0080, 0x2902, 0x9ce7, 0x7bd8, 0xbdef, 0x5ef7, 0x1c4a,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0xbd08,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x631d,
+ 0x318c, 0x18c6, 0x8294, 0x0200, 0x2008, 0x0080, 0x0802, 0x8021,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8423, 0x4210, 0x0108, 0x1004, 0x0800,
+ 0x8020, 0x0200, 0x8308, 0x1052, 0xef7a, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x4277, 0x2108,
+ 0x1484, 0x4842, 0x8421, 0x4290, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x4a63, 0xb531, 0xdad6, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x6312, 0xbd8c, 0xdef7, 0xef7b,
+ 0x10c6, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x8c62, 0xc631, 0x6318, 0x318c, 0x18c6, 0x7a53, 0xbdef, 0xdef7,
+ 0x8c7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, 0x5294, 0x8c4a, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa529, 0x5294,
+ 0x294a, 0x18a5, 0x7bd3, 0xbdef, 0xdef7, 0x8f7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x5294, 0x314a, 0x14a6,
+ 0x4a63, 0xbde9, 0xdef7, 0xef7b, 0x9084, 0x0842, 0x8421, 0x5210,
+ 0xef4c, 0x2108, 0x1084, 0x0842, 0x1ef5, 0x8c63, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7,
+ 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c,
+ 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0xde90, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x8421, 0x4210, 0xbde8, 0xdef7, 0xef7b, 0xf7bd, 0x4210, 0xbd08,
+ 0xdef7, 0x2149, 0x1084, 0x0842, 0x4421, 0x4212, 0x2108, 0x1084,
+ 0x0842, 0x84e9, 0x4210, 0xe93a, 0x7484, 0x3a42, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xf484,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0x77bd, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x7348, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13bd, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x3210, 0xef6b,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0xc631, 0x6318, 0x2e6c,
+ 0xdef6, 0xef7b, 0x94a5, 0x4a52, 0xbde9, 0xdef7, 0xef7b, 0xb191,
+ 0x9ab5, 0xae6b, 0xe6b9, 0x6b9a, 0xb9ae, 0x62e6, 0x2e6c, 0x18c6,
+ 0x5ad7, 0xc631, 0x631e, 0xac8c, 0xe6b9, 0x8b9a, 0x4a31, 0xa526,
+ 0x71ec, 0xd8c6, 0xef7b, 0x1084, 0x3a42, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xd77a,
+ 0xc63d, 0x6338, 0xcd8c, 0x1945, 0x8c59, 0x2108, 0x1084, 0x0842,
+ 0x28c5, 0x8ca5, 0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x1680, 0x5d1d, 0x8434, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x2684, 0x6c9d, 0x362e, 0x2317,
+ 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x18c8, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0xe908, 0x13bd, 0x0842, 0xbd21, 0x4213,
+ 0x2108, 0x13bd, 0x0842, 0xbd21, 0x4213, 0xef7a, 0x4a73, 0xe75a,
+ 0x55ec, 0x294a, 0xed6b, 0xf7bd, 0x7bde, 0x5def, 0x5d6b, 0xef6b,
+ 0x1084, 0x0842, 0x8421, 0xd210, 0x2109, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x84e9, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4e90, 0x2748, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0xef48, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0xef7b,
+ 0xd631, 0x7bde, 0x4a57, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x7bd5, 0xb5af, 0x5ad6, 0xad6b, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x9494, 0xaa52, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0xdeaa, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0xdad6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef4b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xef7a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0xf7a4, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xe908, 0x294a, 0x7bd5, 0xbdef, 0xdef7, 0xef7b, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1124, 0x0842, 0x8421, 0xdea4,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x8f48, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7bd2, 0x84ef, 0x4210,
+ 0x2108, 0xa531, 0x5294, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xef48, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x4842, 0xa4ef, 0x4213, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x4842, 0xa427, 0x4ef7, 0x277a, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8842, 0x4a52,
+ 0xdef5, 0x8f7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0xdef4, 0x8f7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x94a4, 0x4bd2, 0xbde9, 0x5ef7, 0x294a, 0x1084, 0x09d2, 0x9d21,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x7bd2, 0xa5ef, 0xde94, 0x2f7b, 0x294a, 0x94a5, 0xbd52, 0xdef7,
+ 0xef7b, 0xc631, 0x6318, 0xb18c, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0xe908, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xc631, 0x7bd8, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x8d5a,
+ 0xa529, 0x5ad4, 0x318d, 0x18c6, 0xb5ad, 0x5ad6, 0x52eb, 0x294a,
+ 0x94a5, 0x4b5a, 0xa529, 0x5294, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5296, 0xad4a, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef6b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x96b5, 0x6a52, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7, 0xef7b, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0xf54a, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0840, 0x8421, 0x7a10, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8400, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x0084, 0x003a, 0x83bd, 0x01de, 0x1de8, 0x0000, 0x003a, 0x0000,
+ 0x4000, 0x2108, 0xd0f4, 0x0843, 0x8421, 0x43d0, 0x2108, 0x1084,
+ 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4000, 0x0007, 0xde80, 0x0001, 0x0000, 0x3a00, 0x0000,
+ 0x0000, 0x087a, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x0008, 0x0074, 0xe800, 0x0000, 0x3a00, 0xbde8, 0x0003,
+ 0x0000, 0x87a0, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4000, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0840, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8400, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4000, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x00ef, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8640, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1904, 0x0842, 0x0021, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1900, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x6410, 0x2108,
+ 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6400, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x9042, 0x8421, 0x0210, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x9000, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x4108, 0x1086, 0x0842, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x1086, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x0421, 0x4219, 0x2108, 0xd080,
+ 0x423b, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0xbde9, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xef48, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xf75d, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7,
+ 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c,
+ 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xef79,
+ 0x0000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_or.c b/gnulib/lib/unictype/categ_or.c
new file mode 100644
index 00000000..9118418d
--- /dev/null
+++ b/gnulib/lib/unictype/categ_or.c
@@ -0,0 +1,42 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+uc_general_category_t
+uc_general_category_or (uc_general_category_t category1,
+ uc_general_category_t category2)
+{
+ uint32_t bitmask;
+ uc_general_category_t result;
+
+ bitmask = category1.bitmask | category2.bitmask;
+
+ if (bitmask == category1.bitmask)
+ return category1;
+
+ if (bitmask == category2.bitmask)
+ return category2;
+
+ result.bitmask = bitmask;
+ result.generic = 1;
+ result.lookup.lookup_fn = &uc_is_general_category_withtable;
+ return result;
+}
diff --git a/gnulib/lib/unictype/categ_test.c b/gnulib/lib/unictype/categ_test.c
new file mode 100644
index 00000000..dd935e77
--- /dev/null
+++ b/gnulib/lib/unictype/categ_test.c
@@ -0,0 +1,32 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+bool
+uc_is_general_category (ucs4_t uc, uc_general_category_t category)
+{
+ if (category.generic)
+ return category.lookup.lookup_fn (uc, category.bitmask);
+ else
+ return bitmap_lookup (category.lookup.table, uc);
+}
diff --git a/gnulib/lib/unictype/combining.c b/gnulib/lib/unictype/combining.c
new file mode 100644
index 00000000..dfddc906
--- /dev/null
+++ b/gnulib/lib/unictype/combining.c
@@ -0,0 +1,47 @@
+/* Combining classes of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_combclass table. */
+#include "combining.h"
+
+int
+uc_combining_class (ucs4_t uc)
+{
+ unsigned int index1 = uc >> combclass_header_0;
+ if (index1 < combclass_header_1)
+ {
+ int lookup1 = u_combclass.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> combclass_header_2) & combclass_header_3;
+ int lookup2 = u_combclass.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & combclass_header_4);
+ unsigned int lookup3 = u_combclass.level3[lookup2 + index3];
+
+ return lookup3;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unictype/combining.h b/gnulib/lib/unictype/combining.h
new file mode 100644
index 00000000..5f1c8be5
--- /dev/null
+++ b/gnulib/lib/unictype/combining.h
@@ -0,0 +1,839 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Combining class of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define combclass_header_0 16
+#define combclass_header_1 2
+#define combclass_header_2 7
+#define combclass_header_3 511
+#define combclass_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ unsigned char level3[43 << 7];
+ }
+u_combclass =
+{
+ { 0, 512 },
+ {
+ -1, -1, -1, -1, -1, -1, 0, -1,
+ -1, 128, -1, 256, 384, 512, 640, 768,
+ -1, -1, 896, 1024, 1024, 1024, 1024, 1152,
+ 1280, 1024, 1152, 1408, 1536, 1664, 1792, 1920,
+ 2048, 2176, -1, -1, -1, -1, 2304, -1,
+ -1, -1, -1, -1, -1, -1, 2432, 2560,
+ -1, 2688, 2816, -1, 2944, -1, 3072, 3200,
+ 3328, -1, -1, 3456, -1, -1, -1, -1,
+ -1, 3584, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3712, -1, -1, -1, -1,
+ 3840, 3968, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 4096, -1, -1, -1,
+ 4224, 4352, 4480, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 4608, -1,
+ -1, -1, -1, -1, 4736, -1, -1, -1,
+ -1, -1, -1, 4864, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 4992, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 5120, 5248, 5376, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 232, 220, 220,
+ 220, 220, 232, 216, 220, 220, 220, 220,
+ 220, 202, 202, 220, 220, 220, 220, 202,
+ 202, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 1, 1, 1, 1,
+ 1, 220, 220, 220, 220, 230, 230, 230,
+ 230, 230, 230, 230, 230, 240, 230, 220,
+ 220, 220, 230, 230, 230, 220, 220, 0,
+ 230, 230, 230, 220, 220, 220, 220, 230,
+ 232, 220, 220, 230, 233, 234, 234, 233,
+ 234, 234, 233, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 220, 230, 230, 230, 230, 220, 230,
+ 230, 230, 222, 220, 230, 230, 230, 230,
+ 230, 230, 220, 220, 220, 220, 220, 220,
+ 230, 230, 220, 230, 230, 222, 228, 230,
+ 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 19, 20, 21, 22, 0, 23,
+ 0, 24, 25, 0, 230, 220, 0, 18,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 30, 31, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 27, 28, 29, 30, 31,
+ 32, 33, 34, 230, 230, 220, 220, 230,
+ 230, 230, 230, 230, 220, 230, 230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230,
+ 230, 230, 230, 230, 230, 0, 0, 230,
+ 230, 230, 230, 220, 230, 0, 0, 230,
+ 230, 0, 220, 230, 230, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 36, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 220, 230, 230, 220, 230, 230, 220,
+ 220, 220, 230, 220, 220, 230, 220, 230,
+ 230, 230, 220, 230, 220, 230, 220, 230,
+ 220, 230, 230, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 230, 230, 230, 230,
+ 230, 230, 220, 230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 230, 220, 230, 230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 84, 91, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 103, 103, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 107, 107, 107, 107, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 118, 118, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 122, 122, 122, 122, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 220, 220, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 220,
+ 0, 216, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 129, 130, 0, 132, 0, 0, 0,
+ 0, 0, 130, 130, 130, 130, 0, 0,
+ 130, 0, 230, 230, 9, 0, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 220, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7,
+ 0, 9, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 228, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 222, 230, 220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 220, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 220, 230, 230, 230,
+ 230, 230, 230, 230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 220, 230, 230, 230, 230, 230,
+ 230, 230, 220, 230, 230, 234, 214, 220,
+ 202, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 220,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 1, 1, 230, 230, 230, 230,
+ 1, 1, 1, 230, 230, 0, 0, 0,
+ 0, 230, 0, 0, 0, 1, 1, 230,
+ 220, 230, 1, 1, 220, 220, 220, 220,
+ 230, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 218, 228, 232, 222, 224, 224,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 230, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 220, 220, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 1, 220, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 216, 216, 1,
+ 1, 1, 0, 0, 0, 226, 216, 216,
+ 216, 216, 216, 0, 0, 0, 0, 0,
+ 0, 0, 0, 220, 220, 220, 220, 220,
+ 220, 220, 220, 0, 0, 230, 230, 230,
+ 230, 230, 220, 220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 230, 230, 230, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 230, 230, 230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_alnum.c b/gnulib/lib/unictype/ctype_alnum.c
new file mode 100644
index 00000000..aaf74848
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_alnum.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_alnum table. */
+#include "ctype_alnum.h"
+
+bool
+uc_is_alnum (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_alnum, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_alnum.h b/gnulib/lib/unictype/ctype_alnum.h
new file mode 100644
index 00000000..c27ae78b
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_alnum.h
@@ -0,0 +1,588 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[44 << 4];
+ }
+u_is_alnum =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFE, 0x000007FF, 0xFFFEC3FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9FFFC060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x043007FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xF806FFC3,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x0003FFC3,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001CFFC0,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x0000FFC3,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x0002FFC3,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x0000FFC0,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x0000FFC3,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x0000FFC3,
+ 0xFFFDDFE0, 0x23FFFDFF, 0x00000000, 0xFC00FFC3,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FBF, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000,
+ 0x00000001, 0x000003FF, 0xFFFFFEFF, 0x00001FFF,
+ 0x00000F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F03FF, 0xFFE1C062,
+ 0x03FF4003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x000003FF,
+ 0x03FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000005FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x00000000, 0xFFFFFFC0, 0x001F3FFF,
+ 0xFFFFFFFF, 0x000003FF, 0x03FF00FE, 0x00000000,
+ 0x007FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x03FF0FE0, 0x00000000,
+ 0xFFFFFFF8, 0x03FFC001, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0000000F, 0xFFFFE3FF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF3FFBF50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0x80007FFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000019FF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x03FF0000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF003F, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x03FF0FF7, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x03FF0000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_alpha.c b/gnulib/lib/unictype/ctype_alpha.c
new file mode 100644
index 00000000..8c64b6d6
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_alpha.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_alpha table. */
+#include "ctype_alpha.h"
+
+bool
+uc_is_alpha (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_alpha, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_alpha.h b/gnulib/lib/unictype/ctype_alpha.h
new file mode 100644
index 00000000..087c7d5b
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_alpha.h
@@ -0,0 +1,588 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[44 << 4];
+ }
+u_is_alpha =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFE, 0x000007FF, 0xFFFEC3FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9FFFC060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x043007FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xF806FFC3,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x0003FFC3,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001CFFC0,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x0000FFC3,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x0002FFC3,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x0000FFC0,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x0000FFC3,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x0000FFC3,
+ 0xFFFDDFE0, 0x23FFFDFF, 0x00000000, 0xFC00FFC3,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FBF, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000,
+ 0x00000001, 0x000003FF, 0xFFFFFEFF, 0x00001FFF,
+ 0x00000F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F03FF, 0xFFE1C062,
+ 0x03FF4003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x000003FF,
+ 0x03FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000005FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x00000000, 0xFFFFFFC0, 0x001F3FFF,
+ 0xFFFFFFFF, 0x000003FF, 0x03FF00FE, 0x00000000,
+ 0x007FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x03FF0FE0, 0x00000000,
+ 0xFFFFFFF8, 0x03FFC001, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0000000F, 0xFFFFE3FF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF3FFBF50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0x80007FFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000019FF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x03FF0000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF003F, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x03FF0FF7, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x03FF0000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_blank.c b/gnulib/lib/unictype/ctype_blank.c
new file mode 100644
index 00000000..5e2ea542
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_blank.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_blank table. */
+#include "ctype_blank.h"
+
+bool
+uc_is_blank (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_blank, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_blank.h b/gnulib/lib/unictype/ctype_blank.h
new file mode 100644
index 00000000..0506e469
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_blank.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_is_blank =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000200, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000077F, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_cntrl.c b/gnulib/lib/unictype/ctype_cntrl.c
new file mode 100644
index 00000000..13869c51
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_cntrl.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_cntrl table. */
+#include "ctype_cntrl.h"
+
+bool
+uc_is_cntrl (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_cntrl, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_cntrl.h b/gnulib/lib/unictype/ctype_cntrl.h
new file mode 100644
index 00000000..e911b0d4
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_cntrl.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_is_cntrl =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000300, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_digit.c b/gnulib/lib/unictype/ctype_digit.c
new file mode 100644
index 00000000..ec444d49
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_digit.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_digit table. */
+#include "ctype_digit.h"
+
+bool
+uc_is_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_digit, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_digit.h b/gnulib/lib/unictype/ctype_digit.h
new file mode 100644
index 00000000..82d7d2c4
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_digit.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_is_digit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_graph.c b/gnulib/lib/unictype/ctype_graph.c
new file mode 100644
index 00000000..474211be
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_graph.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_graph table. */
+#include "ctype_graph.h"
+
+bool
+uc_is_graph (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_graph, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_graph.h b/gnulib/lib/unictype/ctype_graph.h
new file mode 100644
index 00000000..0a00010f
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_graph.h
@@ -0,0 +1,890 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[5 << 7];
+ /*unsigned*/ int level3[52 << 4];
+ }
+u_is_graph =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 512,
+ 18 * sizeof (int) / sizeof (short) + 512
+ },
+ {
+ 18 + 640 * sizeof (short) / sizeof (int) + 0,
+ 18 + 640 * sizeof (short) / sizeof (int) + 16,
+ 18 + 640 * sizeof (short) / sizeof (int) + 32,
+ 18 + 640 * sizeof (short) / sizeof (int) + 48,
+ 18 + 640 * sizeof (short) / sizeof (int) + 64,
+ 18 + 640 * sizeof (short) / sizeof (int) + 80,
+ 18 + 640 * sizeof (short) / sizeof (int) + 96,
+ 18 + 640 * sizeof (short) / sizeof (int) + 112,
+ 18 + 640 * sizeof (short) / sizeof (int) + 128,
+ 18 + 640 * sizeof (short) / sizeof (int) + 144,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 176,
+ 18 + 640 * sizeof (short) / sizeof (int) + 192,
+ 18 + 640 * sizeof (short) / sizeof (int) + 208,
+ 18 + 640 * sizeof (short) / sizeof (int) + 224,
+ 18 + 640 * sizeof (short) / sizeof (int) + 240,
+ 18 + 640 * sizeof (short) / sizeof (int) + 256,
+ 18 + 640 * sizeof (short) / sizeof (int) + 272,
+ 18 + 640 * sizeof (short) / sizeof (int) + 288,
+ 18 + 640 * sizeof (short) / sizeof (int) + 304,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 336,
+ 18 + 640 * sizeof (short) / sizeof (int) + 352,
+ 18 + 640 * sizeof (short) / sizeof (int) + 368,
+ 18 + 640 * sizeof (short) / sizeof (int) + 384,
+ 18 + 640 * sizeof (short) / sizeof (int) + 400,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 416,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 432,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 448,
+ 18 + 640 * sizeof (short) / sizeof (int) + 464,
+ 18 + 640 * sizeof (short) / sizeof (int) + 480,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 528,
+ 18 + 640 * sizeof (short) / sizeof (int) + 544,
+ 18 + 640 * sizeof (short) / sizeof (int) + 560,
+ 18 + 640 * sizeof (short) / sizeof (int) + 576,
+ 18 + 640 * sizeof (short) / sizeof (int) + 592,
+ 18 + 640 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 624,
+ 18 + 640 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 656,
+ 18 + 640 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 688,
+ 18 + 640 * sizeof (short) / sizeof (int) + 704,
+ 18 + 640 * sizeof (short) / sizeof (int) + 720,
+ 18 + 640 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 768,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 816
+ },
+ {
+ 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7CFFFFFF,
+ 0xFFFFD7F0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0xFE7FFFFF, 0xFFFFFFFE,
+ 0xFFFE06FF, 0xFFFFFFFF, 0xFFFF00FF, 0x001F07FF,
+ 0xCFFFFFCF, 0xFFFFFFFE, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFBFFF, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFE, 0xF3FFFFFF, 0xFF1F3FFF, 0xF807FFFF,
+ 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x07FFFFCF,
+ 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0,
+ 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0002FFCF,
+ 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x0003FFCF,
+ 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x07FFFFC0,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0xFF00FFCF,
+ 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF,
+ 0xFFFDDFEC, 0xE3FFFDFF, 0x00803DDF, 0xFE3FFFCF,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x001C0000,
+ 0xFFFFFFFE, 0x87FFFFFF, 0x0FFFFFFF, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFF0FFF, 0xDFFFFFFF, 0x001FDFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xC3FFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x87FFFFFF, 0x1FFFFFFF,
+ 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF,
+ 0x1FFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF,
+ 0x001FDFFF, 0x007FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x03FF03FF,
+ 0x03FF3FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000007FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFF1, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF03FF, 0xC3FF03FF, 0xFFFFFFFF,
+ 0xCFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0FFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0x03FFC7FF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xF8FFFFFF, 0xFFFFE3FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xC000007F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF,
+ 0xFFFFF880, 0xFFFFFCFF, 0x7FFFFFFF, 0xFFF3FC1F,
+ 0x001F7FFF, 0x003FFFFF, 0xFFFF0000, 0x0001FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF8FFFF, 0xFFFFFFFF,
+ 0xFFFF01FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x1FFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFF3DE, 0xFFFFFEFF, 0x7F47AFFF, 0xFFFFFFFE,
+ 0xFF1FFFFF, 0x7FFEFFFF, 0xFFFF17FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x001F1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE0007FF,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0001FFFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xFE7FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF7FFF, 0x00FFFFFF, 0xFFFFFFFF, 0xFFFF000F,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xF00FFFFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC01F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x800FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0xF3FF3FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x3FFF0000,
+ 0x03FFFFFF, 0xFFFF007F, 0xFFF7FFFF, 0xFFDF0F7F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x9FFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x3E007F7F,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0xFFFFFF87, 0xFF8FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFF07FF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF000F, 0x000007FF, 0x00000000,
+ 0xBFFFFFFF, 0xFFFFFFFF, 0x003FFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x83FFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x870FFFFF, 0x01FF00FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000F0007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_lower.c b/gnulib/lib/unictype/ctype_lower.c
new file mode 100644
index 00000000..8e1e118d
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_lower.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_lower table. */
+#include "ctype_lower.h"
+
+bool
+uc_is_lower (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_lower, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_lower.h b/gnulib/lib/unictype/ctype_lower.h
new file mode 100644
index 00000000..32f602c9
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_lower.h
@@ -0,0 +1,327 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_is_lower =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE,
+ 0x00000000, 0x00200000, 0x80000000, 0xFF7FFFFF,
+ 0xAAAAAAAA, 0x54AAAAAA, 0xAAAAA955, 0xD4AAAAAA,
+ 0x46241129, 0xA251212A, 0xB5555B60, 0xAA2CAAAA,
+ 0xAAAAAAAA, 0x100AAAA8, 0x0ADBAA84, 0x20268B09,
+ 0x00041F09, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000020, 0x388A0000,
+ 0x00000000, 0xFFFEF000, 0xAAE37FFF, 0x0927AAAA,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0x0000000A, 0x00000000, 0xFFFFFFFE,
+ 0x0000007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x22000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x082AAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x003F00FF, 0x00FF00FF, 0x00AA003F, 0x3FFF00FF,
+ 0x00FF00FF, 0x400B00FF, 0x00030008, 0x00080023,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00004000, 0xFFFF0000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x00481562,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000000A,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AA8,
+ 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAA8AAA8, 0xAAAAAAAA, 0x9400AAAA,
+ 0x000010AA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFF00, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_print.c b/gnulib/lib/unictype/ctype_print.c
new file mode 100644
index 00000000..8e53e0f0
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_print.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_print table. */
+#include "ctype_print.h"
+
+bool
+uc_is_print (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_print, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_print.h b/gnulib/lib/unictype/ctype_print.h
new file mode 100644
index 00000000..73df0b9d
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_print.h
@@ -0,0 +1,890 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[5 << 7];
+ /*unsigned*/ int level3[52 << 4];
+ }
+u_is_print =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 512,
+ 18 * sizeof (int) / sizeof (short) + 512
+ },
+ {
+ 18 + 640 * sizeof (short) / sizeof (int) + 0,
+ 18 + 640 * sizeof (short) / sizeof (int) + 16,
+ 18 + 640 * sizeof (short) / sizeof (int) + 32,
+ 18 + 640 * sizeof (short) / sizeof (int) + 48,
+ 18 + 640 * sizeof (short) / sizeof (int) + 64,
+ 18 + 640 * sizeof (short) / sizeof (int) + 80,
+ 18 + 640 * sizeof (short) / sizeof (int) + 96,
+ 18 + 640 * sizeof (short) / sizeof (int) + 112,
+ 18 + 640 * sizeof (short) / sizeof (int) + 128,
+ 18 + 640 * sizeof (short) / sizeof (int) + 144,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 176,
+ 18 + 640 * sizeof (short) / sizeof (int) + 192,
+ 18 + 640 * sizeof (short) / sizeof (int) + 208,
+ 18 + 640 * sizeof (short) / sizeof (int) + 224,
+ 18 + 640 * sizeof (short) / sizeof (int) + 240,
+ 18 + 640 * sizeof (short) / sizeof (int) + 256,
+ 18 + 640 * sizeof (short) / sizeof (int) + 272,
+ 18 + 640 * sizeof (short) / sizeof (int) + 288,
+ 18 + 640 * sizeof (short) / sizeof (int) + 304,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 336,
+ 18 + 640 * sizeof (short) / sizeof (int) + 352,
+ 18 + 640 * sizeof (short) / sizeof (int) + 368,
+ 18 + 640 * sizeof (short) / sizeof (int) + 384,
+ 18 + 640 * sizeof (short) / sizeof (int) + 400,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 416,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 432,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 448,
+ 18 + 640 * sizeof (short) / sizeof (int) + 464,
+ 18 + 640 * sizeof (short) / sizeof (int) + 480,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 528,
+ 18 + 640 * sizeof (short) / sizeof (int) + 544,
+ 18 + 640 * sizeof (short) / sizeof (int) + 560,
+ 18 + 640 * sizeof (short) / sizeof (int) + 576,
+ 18 + 640 * sizeof (short) / sizeof (int) + 592,
+ 18 + 640 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 624,
+ 18 + 640 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 656,
+ 18 + 640 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 688,
+ 18 + 640 * sizeof (short) / sizeof (int) + 704,
+ 18 + 640 * sizeof (short) / sizeof (int) + 720,
+ 18 + 640 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 768,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 816
+ },
+ {
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7CFFFFFF,
+ 0xFFFFD7F0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0xFE7FFFFF, 0xFFFFFFFE,
+ 0xFFFE06FF, 0xFFFFFFFF, 0xFFFF00FF, 0x001F07FF,
+ 0xCFFFFFCF, 0xFFFFFFFE, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFBFFF, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFE, 0xF3FFFFFF, 0xFF1F3FFF, 0xF807FFFF,
+ 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x07FFFFCF,
+ 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0,
+ 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0002FFCF,
+ 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x0003FFCF,
+ 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x07FFFFC0,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0xFF00FFCF,
+ 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF,
+ 0xFFFDDFEC, 0xE3FFFDFF, 0x00803DDF, 0xFE3FFFCF,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x001C0000,
+ 0xFFFFFFFE, 0x87FFFFFF, 0x0FFFFFFF, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFF0FFF, 0xDFFFFFFF, 0x001FDFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xC3FFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x87FFFFFF, 0x1FFFFFFF,
+ 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF,
+ 0x001FDFFF, 0x007FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x03FF03FF,
+ 0x03FF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000007FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFF1, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF03FF, 0xC3FF03FF, 0xFFFFFFFF,
+ 0xCFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0FFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0x03FFC7FF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xF8FFFFFF, 0xFFFFE3FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xC000007F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF,
+ 0xFFFFFFFF, 0xFFFFFCFF, 0xFFFFFFFF, 0xFFF3FC1F,
+ 0x001F7FFF, 0x003FFFFF, 0xFFFF0000, 0x0001FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF8FFFF, 0xFFFFFFFF,
+ 0xFFFF01FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x1FFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFF3DE, 0xFFFFFEFF, 0x7F47AFFF, 0xFFFFFFFE,
+ 0xFF1FFFFF, 0x7FFEFFFF, 0xFFFF17FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x001F1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE0007FF,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0001FFFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xFE7FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF7FFF, 0x00FFFFFF, 0xFFFFFFFF, 0xFFFF000F,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xF00FFFFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC01F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x800FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0xF3FF3FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x3FFF0000,
+ 0x03FFFFFF, 0xFFFF007F, 0xFFF7FFFF, 0xFFDF0F7F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x9FFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x3E007F7F,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0xFFFFFF87, 0xFF8FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFF07FF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF000F, 0x000007FF, 0x00000000,
+ 0xBFFFFFFF, 0xFFFFFFFF, 0x003FFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x83FFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x870FFFFF, 0x01FF00FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000F0007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_punct.c b/gnulib/lib/unictype/ctype_punct.c
new file mode 100644
index 00000000..8071a265
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_punct.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_punct table. */
+#include "ctype_punct.h"
+
+bool
+uc_is_punct (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_punct, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_punct.h b/gnulib/lib/unictype/ctype_punct.h
new file mode 100644
index 00000000..ce4a0107
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_punct.h
@@ -0,0 +1,734 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[45 << 4];
+ }
+u_is_punct =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384
+ },
+ {
+ 18 + 512 * sizeof (short) / sizeof (int) + 0,
+ 18 + 512 * sizeof (short) / sizeof (int) + 16,
+ 18 + 512 * sizeof (short) / sizeof (int) + 32,
+ 18 + 512 * sizeof (short) / sizeof (int) + 48,
+ 18 + 512 * sizeof (short) / sizeof (int) + 64,
+ 18 + 512 * sizeof (short) / sizeof (int) + 80,
+ 18 + 512 * sizeof (short) / sizeof (int) + 96,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 160,
+ 18 + 512 * sizeof (short) / sizeof (int) + 176,
+ 18 + 512 * sizeof (short) / sizeof (int) + 192,
+ 18 + 512 * sizeof (short) / sizeof (int) + 208,
+ 18 + 512 * sizeof (short) / sizeof (int) + 224,
+ 18 + 512 * sizeof (short) / sizeof (int) + 240,
+ 18 + 512 * sizeof (short) / sizeof (int) + 256,
+ 18 + 512 * sizeof (short) / sizeof (int) + 272,
+ 18 + 512 * sizeof (short) / sizeof (int) + 288,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 336,
+ 18 + 512 * sizeof (short) / sizeof (int) + 352,
+ 18 + 512 * sizeof (short) / sizeof (int) + 368,
+ 18 + 512 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 416,
+ 18 + 512 * sizeof (short) / sizeof (int) + 432,
+ 18 + 512 * sizeof (short) / sizeof (int) + 448,
+ 18 + 512 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 480,
+ 18 + 512 * sizeof (short) / sizeof (int) + 496,
+ 18 + 512 * sizeof (short) / sizeof (int) + 512,
+ 18 + 512 * sizeof (short) / sizeof (int) + 528,
+ 18 + 512 * sizeof (short) / sizeof (int) + 544,
+ 18 + 512 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 576,
+ 18 + 512 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 624,
+ 18 + 512 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 704
+ },
+ {
+ 0x00000000, 0xFC00FFFE, 0xF8000001, 0x78000001,
+ 0x00000000, 0xFBDFFBFF, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC003C, 0xFFFFAFE0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFDF, 0x4020FFFF,
+ 0x000000B0, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003FC, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000000,
+ 0xFFFE0600, 0xFFFFFFFF, 0x000000FF, 0x00180000,
+ 0xCFFFFFCF, 0x00000000, 0x7FFFF800, 0x00013C00,
+ 0x00000000, 0x00000000, 0xFFD00000, 0x60003F9F,
+ 0x0002BFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x03CFF800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000E, 0xD0000000, 0x001E3FFF, 0x0001003C,
+ 0x0000000E, 0xD0000000, 0x0080399F, 0x07FC000C,
+ 0x0000000E, 0xD0000000, 0x00023987, 0x00230000,
+ 0x0000000E, 0xD0000000, 0x00003BBF, 0x0002000C,
+ 0x0000000E, 0xD0000000, 0x00C0399F, 0x0001000C,
+ 0x00000004, 0xC0000000, 0x00803DC7, 0x07FF0000,
+ 0x0000000E, 0xC0000000, 0x00603DDF, 0xFF00000C,
+ 0x0000000C, 0xD0000000, 0x00603DDF, 0x0006000C,
+ 0x0000000C, 0xC0000000, 0x00803DDF, 0x023F000C,
+ 0x0000000C, 0x00000000, 0xFF5F8400, 0x001C0000,
+ 0x00000000, 0x80008000, 0x0C008040, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0xFFFFFFFE, 0xFFFFFC00, 0x00000000, 0xFFFE0000,
+ 0xFEFF00FF, 0xDFFFFFFF, 0x001FDFFF, 0x00000000,
+ 0x00000000, 0x7FFFF800, 0xC3C0FC00, 0x001E3F9D,
+ 0xC000BFFC, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x1FFFFFFF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x001C0000, 0x007C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0xFFF00000, 0x2F7FFFFF, 0x03FF0000,
+ 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0FFF0FFF, 0x00000031, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0xC0000301, 0xFFFFFFFF,
+ 0xCF800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0xFFF00000, 0xFC00001F, 0x1FFFFFFF,
+ 0x00000007, 0x000007FE, 0x00000000, 0x00000000,
+ 0x00000000, 0xF8FFFFF0, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xC000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0xFFFFF880, 0xFFFFFCFF, 0x7FFFFFFF, 0x7FF1FC1F,
+ 0x00007FFF, 0x003FFFFF, 0xFFFF0000, 0x0001FFFF,
+ 0xC1D0037B, 0x0C0040AF, 0xFFF8BC1F, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x1FFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFF3DE, 0xFFFFFEFF, 0x7F47AFFF, 0xFFFFFFFE,
+ 0xFF1FFFFF, 0x7FFEFFFF, 0xFFFF17FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x001F1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFE0007E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x00017FFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFF1E, 0xE0C1FC01, 0x00000000, 0x00000000,
+ 0x1E000000, 0x00000001, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0x00000000, 0xFFFFFFFF, 0x0000000F,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x700F8000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x007FFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000600, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000FF8, 0x00000000, 0x00F00000,
+ 0x00000003, 0xFFF00000, 0x0000C01F, 0x00000000,
+ 0x00000000, 0x0000FFC0, 0x800FFF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x007FFE00, 0xF0003008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30000000,
+ 0x03FFFFFF, 0xFFFF007F, 0xFFF7FFFF, 0x00000F7F,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0xFC00FFFE, 0xF8000001, 0xF8000001, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x3E007F7F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF87, 0xFF8FFFFF, 0x00000000, 0xFFE00000,
+ 0x0FFF07FF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000F, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x83C00000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000F06E, 0x87000000, 0x01FF00FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000002, 0x08000000,
+ 0x00200000, 0x00200000, 0x00008000, 0x00008000,
+ 0x00000200, 0x00000200, 0x00000008, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_space.c b/gnulib/lib/unictype/ctype_space.c
new file mode 100644
index 00000000..93ad8730
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_space.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_space table. */
+#include "ctype_space.h"
+
+bool
+uc_is_space (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_space, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_space.h b/gnulib/lib/unictype/ctype_space.h
new file mode 100644
index 00000000..90108b99
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_space.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_is_space =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003E00, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000077F, 0x00000300, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_upper.c b/gnulib/lib/unictype/ctype_upper.c
new file mode 100644
index 00000000..9348fcc3
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_upper.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_upper table. */
+#include "ctype_upper.h"
+
+bool
+uc_is_upper (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_upper, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_upper.h b/gnulib/lib/unictype/ctype_upper.h
new file mode 100644
index 00000000..4f3a7806
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_upper.h
@@ -0,0 +1,327 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_is_upper =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x7F7FFFFF, 0x00000000,
+ 0x55555555, 0xAA555555, 0x555554AA, 0x2B555555,
+ 0xB1DBCED6, 0x11AED2D5, 0x4AAAADB0, 0x55D65555,
+ 0x55555555, 0x6C055555, 0x0000557A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00450000,
+ 0xFFFED740, 0x00000FFB, 0x55008000, 0xE6905555,
+ 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555,
+ 0x55555401, 0x55555555, 0x55552AAB, 0x55555555,
+ 0x55555555, 0xFFFE0005, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x55555555, 0x55555555, 0x55555555, 0x55555555,
+ 0x40155555, 0x55555555, 0x55555555, 0x55555555,
+ 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00,
+ 0xFF00FF00, 0x1F00FF00, 0x0F001F00, 0x1F001F00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00040C40, 0x00000000, 0x0000FFFF,
+ 0x00000008, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x0024EA9D,
+ 0x55555555, 0x55555555, 0x55555555, 0x00000005,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555555, 0x00001554,
+ 0x00555555, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55545554, 0x55555555, 0x6A005555,
+ 0x00000855, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000000FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_xdigit.c b/gnulib/lib/unictype/ctype_xdigit.c
new file mode 100644
index 00000000..e5400088
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_xdigit.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_xdigit table. */
+#include "ctype_xdigit.h"
+
+bool
+uc_is_xdigit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_xdigit, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_xdigit.h b/gnulib/lib/unictype/ctype_xdigit.h
new file mode 100644
index 00000000..320f806b
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_xdigit.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_is_xdigit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x0000007E, 0x0000007E,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/decdigit.c b/gnulib/lib/unictype/decdigit.c
new file mode 100644
index 00000000..79f8339c
--- /dev/null
+++ b/gnulib/lib/unictype/decdigit.c
@@ -0,0 +1,49 @@
+/* Values of decimal digit Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_decdigit table. */
+#include "decdigit.h"
+
+int
+uc_decimal_value (ucs4_t uc)
+{
+ unsigned int index1 = uc >> decdigit_header_0;
+ if (index1 < decdigit_header_1)
+ {
+ int lookup1 = u_decdigit.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> decdigit_header_2) & decdigit_header_3;
+ int lookup2 = u_decdigit.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & decdigit_header_4) + lookup2;
+ /* level3 contains 4-bit values. */
+ unsigned int lookup3 =
+ (u_decdigit.level3[index3>>1] >> ((index3 % 2) * 4)) & 0x0f;
+
+ return (int) lookup3 - 1;
+ }
+ }
+ }
+ return -1;
+}
diff --git a/gnulib/lib/unictype/decdigit.h b/gnulib/lib/unictype/decdigit.h
new file mode 100644
index 00000000..08dcc401
--- /dev/null
+++ b/gnulib/lib/unictype/decdigit.h
@@ -0,0 +1,247 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Decimal digit values of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define decdigit_header_0 16
+#define decdigit_header_1 2
+#define decdigit_header_2 7
+#define decdigit_header_3 511
+#define decdigit_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ unsigned char level3[12 << 6];
+ }
+u_decdigit =
+{
+ { 0, 512 },
+ {
+ 0, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 128, 256, -1, 384,
+ -1, -1, 512, 512, 512, 512, 512, 512,
+ 512, 512, 512, -1, 640, 640, 768, -1,
+ 384, 896, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 128,
+ 896, -1, 1024, 640, -1, -1, 640, 0,
+ 1152, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 768, -1, -1, -1,
+ -1, 640, 1280, -1, 640, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 896, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 768, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1408,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21,
+ 0x43, 0x65, 0x87, 0xa9, 0x21, 0x43, 0x65, 0x87,
+ 0xa9, 0x21, 0x43, 0x65, 0x87, 0xa9, 0x21, 0x43,
+ 0x65, 0x87, 0xa9, 0x21, 0x43, 0x65, 0x87, 0xa9
+ }
+};
diff --git a/gnulib/lib/unictype/digit.c b/gnulib/lib/unictype/digit.c
new file mode 100644
index 00000000..ba999a29
--- /dev/null
+++ b/gnulib/lib/unictype/digit.c
@@ -0,0 +1,49 @@
+/* Values of digit Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_digit table. */
+#include "digit.h"
+
+int
+uc_digit_value (ucs4_t uc)
+{
+ unsigned int index1 = uc >> digit_header_0;
+ if (index1 < digit_header_1)
+ {
+ int lookup1 = u_digit.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> digit_header_2) & digit_header_3;
+ int lookup2 = u_digit.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & digit_header_4) + lookup2;
+ /* level3 contains 4-bit values. */
+ unsigned int lookup3 =
+ (u_digit.level3[index3>>1] >> ((index3 % 2) * 4)) & 0x0f;
+
+ return (int) lookup3 - 1;
+ }
+ }
+ }
+ return -1;
+}
diff --git a/gnulib/lib/unictype/digit.h b/gnulib/lib/unictype/digit.h
new file mode 100644
index 00000000..d3f29617
--- /dev/null
+++ b/gnulib/lib/unictype/digit.h
@@ -0,0 +1,311 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Digit values of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define digit_header_0 16
+#define digit_header_1 2
+#define digit_header_2 7
+#define digit_header_3 511
+#define digit_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ unsigned char level3[20 << 6];
+ }
+u_digit =
+{
+ { 0, 512 },
+ {
+ 0, 128, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 256, 384, -1, 512,
+ -1, -1, 640, 640, 640, 640, 640, 640,
+ 640, 640, 640, -1, 768, 768, 896, -1,
+ 512, 1024, -1, -1, -1, -1, 1152, -1,
+ -1, -1, -1, -1, -1, -1, -1, 256,
+ 1024, -1, 1280, 768, -1, -1, 768, 0,
+ 1408, -1, -1, -1, -1, -1, -1, -1,
+ 1536, 1664, -1, -1, -1, -1, -1, -1,
+ 1792, 1920, -1, -1, -1, -1, 2048, 2176,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 896, -1, -1, -1,
+ -1, 768, 1664, -1, 768, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1024, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 896, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2304, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 2432,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x43, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x65, 0x87,
+ 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x32, 0x54, 0x76, 0x98, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x32, 0x54, 0x76, 0x98, 0x0a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x32, 0x54, 0x76, 0x98,
+ 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x43, 0x65, 0x87, 0xa9, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x32, 0x54, 0x76, 0x98, 0x0a,
+ 0x32, 0x54, 0x76, 0x98, 0x0a, 0x32, 0x54, 0x76,
+ 0x98, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x32, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21,
+ 0x43, 0x65, 0x87, 0xa9, 0x21, 0x43, 0x65, 0x87,
+ 0xa9, 0x21, 0x43, 0x65, 0x87, 0xa9, 0x21, 0x43,
+ 0x65, 0x87, 0xa9, 0x21, 0x43, 0x65, 0x87, 0xa9
+ }
+};
diff --git a/gnulib/lib/unictype/identsyntaxmap.h b/gnulib/lib/unictype/identsyntaxmap.h
new file mode 100644
index 00000000..5ff13fca
--- /dev/null
+++ b/gnulib/lib/unictype/identsyntaxmap.h
@@ -0,0 +1,42 @@
+/* Three-level bitmap lookup.
+ Copyright (C) 2000-2002, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2000-2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+static inline int identsyntax_lookup (ucs4_t uc);
+
+static inline int
+identsyntax_lookup (ucs4_t uc)
+{
+ unsigned int index1 = uc >> identsyntax_header_0;
+ if (index1 < identsyntax_header_1)
+ {
+ int lookup1 = TABLE.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> identsyntax_header_2) & identsyntax_header_3;
+ int lookup2 = TABLE.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & identsyntax_header_4) + lookup2;
+ /* level3 contains 2-bit values. */
+ unsigned int lookup3 = TABLE.level3[index3 >> 3];
+
+ return (lookup3 >> (2 * (index3 & 7))) & 3;
+ }
+ }
+ }
+ return UC_IDENTIFIER_INVALID;
+}
diff --git a/gnulib/lib/unictype/mirror.c b/gnulib/lib/unictype/mirror.c
new file mode 100644
index 00000000..066d9d34
--- /dev/null
+++ b/gnulib/lib/unictype/mirror.c
@@ -0,0 +1,49 @@
+/* Mirrored Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_mirror table. */
+#include "mirror.h"
+
+bool
+uc_mirror_char (ucs4_t uc, ucs4_t *puc)
+{
+ unsigned int index1 = uc >> mirror_header_0;
+ if (index1 < mirror_header_1)
+ {
+ int lookup1 = u_mirror.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> mirror_header_2) & mirror_header_3;
+ int lookup2 = u_mirror.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & mirror_header_4);
+ int lookup3 = u_mirror.level3[lookup2 + index3];
+
+ *puc = uc + lookup3;
+ return (lookup3 != 0);
+ }
+ }
+ }
+ *puc = uc;
+ return false;
+}
diff --git a/gnulib/lib/unictype/mirror.h b/gnulib/lib/unictype/mirror.h
new file mode 100644
index 00000000..d55f153a
--- /dev/null
+++ b/gnulib/lib/unictype/mirror.h
@@ -0,0 +1,503 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Mirrored Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define mirror_header_0 16
+#define mirror_header_1 2
+#define mirror_header_2 7
+#define mirror_header_3 511
+#define mirror_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[22 << 7];
+ }
+u_mirror =
+{
+ { 0, 512 },
+ {
+ 0, 128, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 256, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 384, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 512, 640, 768, -1, 896, 1024, 1152, -1,
+ -1, -1, -1, -1, -1, -1, 1280, 1408,
+ -1, -1, -1, 1536, 1664, 1792, -1, -1,
+ -1, -1, -1, -1, 1920, -1, -1, -1,
+ 2048, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2176, -1, 2304, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2432, 2560, 2688,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, -2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, -2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, -2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 61635, 61634, 61633, 61632, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 59746, 59745, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, -1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 57021, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 56828, 56827, 56826, 56825, 0, 0, 0,
+ 3, 56820, 3, -3, 56817, -3, 0, 0,
+ 0, 56812, 0, 0, 0, 56808, 56807, 0,
+ 0, 0, 56803, 56802, 56801, 56800, 0, 56798,
+ 56797, 56796, 56795, 0, 56793, 0, 56791, 0,
+ 0, 0, 0, 56786, 56785, 56784, 56783, 56782,
+ 56781, 56780, 56779, 56778, 0, 0, 0, 0,
+ 0, 56772, 0, 56770, 1, -1, 56767, 56766,
+ 56765, 56764, 56763, 138, 56761, 56760, 56759, 56758,
+ 56757, 56756, 56755, 56754, 56753, 0, 0, 0,
+ 0, 0, 1, -1, 1, -1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 56734,
+ 56733, 0, 56731, 0, 1, -1, 1, -1,
+ 56725, 56724, 1, -1, 0, 0, 56719, 56718,
+ 56717, 56716, 56715, 56714, 56713, 56712, 1, -1,
+ 1, -1, 1, -1, 1, -1, 56703, 56702,
+ 56701, 56700, 1, -1, 56697, 56696, 1, -1,
+ 56693, 56692, 56691, 56690, 56689, 0, 0, 1,
+ -1, 1, -1, 0, 0, 0, 0, 0,
+ 56677, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, -1, 0, 0, 56663, 56662,
+ 56661, 56660, 56659, 56658, 56657, 56656, 56655, 56654,
+ 1, -1, 1, -1, 1, -1, 1, -1,
+ 56645, 0, 0, 0, 0, 0, 56639, 56638,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, -1, 1, -1, -138, 0, 0,
+ 1, -1, 0, 0, 0, 0, 1, -1,
+ 1, -1, 1, -1, 1, -1, 1, -1,
+ 56605, 56604, 56603, 56602, 56601, 56600, 56599, 56598,
+ 56597, 56596, 56595, 56594, 56593, 56592, 0, 0,
+ 1, -1, 56587, 56586, 56585, 56584, 56583, 56582,
+ 56581, 56580, 56579, 56578, 56577, 56576, 56575, 56574,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, -1, 1, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 56541, 56540, 0, 0, 0, 0, 0, 0,
+ 0, 1, -1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 55445, 55444, 55443, 55442, 55441, 55440, 55439, 55438,
+ 55437, 55436, 55435, 55434, 55433, 55432, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 55357, 0, 0, 55354, 55353, 55352, 55351, 0,
+ 55349, 55348, 0, 0, 55345, 0, 0, 0,
+ 0, 0, 0, 55338, 55337, 55336, 55335, 0,
+ 0, 0, 0, 0, 55329, 55328, 55327, 0,
+ 0, 0, 55323, 55322, 55321, 55320, 55319, 55318,
+ 55317, 55316, 55315, 55314, 55313, 55312, 55311, 55310,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 54906, 54905, 54904, 54903, 54902,
+ 54901, 54900, 54899, 54898, 54897, 54896, 54895, 54894,
+ 54893, 54892, 54891, 54890, 54889, 54888, 54887, 54886,
+ 54885, 0, 0, 54882, 54881, 54880, 54879, 54878,
+ 54877, 54876, 54875, 54874, 54873, 54872, 54871, 54870,
+ 54869, 54868, 54867, 54866, 54865, 54864, 54863, 54862,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 54853, 0, 0, 0, 0, 0, 0, 0,
+ 54845, 54844, 54843, 54842, 54841, 54840, 0, 0,
+ 0, 54836, 0, 0, 0, 0, 54831, 54830,
+ 54829, 54828, 54827, 0, 54825, 54824, 0, 0,
+ 54821, 54820, 54819, 54818, 54817, 0, 0, 0,
+ 0, 54812, 0, 54810, 54809, 54808, 0, 0,
+ 54805, 54804, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 54793, 54792, 54791, 54790,
+ 54789, 54788, 0, 0, 54785, 54784, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 54771, 54770, 54769, 54768, 54767, 54766,
+ 54765, 54764, 54763, 54762, 54761, 54760, 54759, 54758,
+ 54757, 54756, 54755, 54754, 54753, 0, 54751, 54750,
+ 54749, 54748, 0, 0, 54745, 0, 54743, 0,
+ 0, 54740, 0, 54738, 54737, 54736, 54735, 0,
+ 0, 0, 0, 0, 54729, 54728, 0, 0,
+ 0, 0, 0, 0, 54721, 54720, 54719, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 54694,
+ 54693, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 54681, 54680, 0, 0,
+ 0, 0, 54675, 54674, 54673, 54672, 0, 54670,
+ 54669, 0, 0, 54666, 54665, 0, 0, 0,
+ 0, 54660, 54659, 54658, 54657, 54656, 54655, 54654,
+ 54653, 54652, 54651, 54650, 54649, 54648, 54647, 54646,
+ 54645, 54644, 54643, 54642, 54641, 54640, 54639, 54638,
+ 54637, 54636, 54635, 54634, 54633, 54632, 54631, 54630,
+ 54629, 54628, 54627, 54626, 54625, 54624, 54623, 54622,
+ 54621, 54620, 54619, 54618, 0, 0, 54615, 54614,
+ 54613, 54612, 54611, 54610, 54609, 54608, 0, 54606,
+ 54605, 54604, 54603, 54602, 54601, 54600, 54599, 54598,
+ 54597, 54596, 54595, 54594, 54593, 54592, 54591, 54590,
+ 54589, 54588, 54587, 54586, 54585, 54584, 54583, 54582,
+ 54581, 54580, 54579, 54578, 54577, 54576, 54575, 54574,
+ 54573, 54572, 54571, 54570, 54569, 54568, 54567, 0,
+ 0, 0, 0, 0, 54561, 0, 54559, 0,
+ 0, 0, 54555, 54554, 54553, 54552, 54551, 0,
+ 0, 0, 0, 0, 54545, 54544, 54543, 0,
+ 0, 0, 0, 54538, 0, 0, 0, 54534,
+ 54533, 54532, 54531, 54530, 0, 54528, 0, 0,
+ 0, 0, 53755, 53754, 53753, 53752, 0, 0,
+ 0, 53748, 53747, 0, 53745, 53744, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 53729, 53728, 0, 0,
+ 53725, 53724, 53723, 53722, 53721, 53720, 53719, 53718,
+ 53717, 53716, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, -1, 1, -1, 1, -1, 1, -1,
+ 1, -1, 0, 0, 1, -1, 1, -1,
+ 1, -1, 1, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 420, 419, 418, 417, 416, 415, 0,
+ 0, 0, 0, 0, 409, 408, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 245, 244, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 225, 0, 223, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 194, 0, 192, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 162, 0, 160, 0, 158,
+ 157, 0, 155, 154, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -55006, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -55064, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -55122,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -55180, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -55238, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unictype/numeric.c b/gnulib/lib/unictype/numeric.c
new file mode 100644
index 00000000..9eb4630c
--- /dev/null
+++ b/gnulib/lib/unictype/numeric.c
@@ -0,0 +1,55 @@
+/* Values of numeric Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_numeric_values and u_numeric tables. */
+#include "numeric.h"
+
+uc_fraction_t
+uc_numeric_value (ucs4_t uc)
+{
+ unsigned int index1 = uc >> numeric_header_0;
+ if (index1 < numeric_header_1)
+ {
+ int lookup1 = u_numeric.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> numeric_header_2) & numeric_header_3;
+ int lookup2 = u_numeric.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = ((uc & numeric_header_4) + lookup2) * 7;
+ /* level3 contains 7-bit values, packed into 16-bit words. */
+ unsigned int lookup3 =
+ ((u_numeric.level3[index3>>4]
+ | (u_numeric.level3[(index3>>4)+1] << 16))
+ >> (index3 % 16))
+ & 0x7f;
+
+ return u_numeric_values[lookup3];
+ }
+ }
+ }
+ {
+ const uc_fraction_t default_value = { 0, 0 };
+ return default_value;
+ }
+}
diff --git a/gnulib/lib/unictype/numeric.h b/gnulib/lib/unictype/numeric.h
new file mode 100644
index 00000000..382a093c
--- /dev/null
+++ b/gnulib/lib/unictype/numeric.h
@@ -0,0 +1,635 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Numeric values of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+static const uc_fraction_t u_numeric_values[108] =
+{
+ { 0, 0 },
+ { 0, 1 },
+ { 1, 1 },
+ { 2, 1 },
+ { 3, 1 },
+ { 4, 1 },
+ { 5, 1 },
+ { 6, 1 },
+ { 7, 1 },
+ { 8, 1 },
+ { 9, 1 },
+ { 10, 1 },
+ { 11, 1 },
+ { 12, 1 },
+ { 13, 1 },
+ { 14, 1 },
+ { 15, 1 },
+ { 16, 1 },
+ { 17, 1 },
+ { 18, 1 },
+ { 19, 1 },
+ { 20, 1 },
+ { 21, 1 },
+ { 22, 1 },
+ { 23, 1 },
+ { 24, 1 },
+ { 25, 1 },
+ { 26, 1 },
+ { 27, 1 },
+ { 28, 1 },
+ { 29, 1 },
+ { 30, 1 },
+ { 31, 1 },
+ { 32, 1 },
+ { 33, 1 },
+ { 34, 1 },
+ { 35, 1 },
+ { 36, 1 },
+ { 37, 1 },
+ { 38, 1 },
+ { 39, 1 },
+ { 40, 1 },
+ { 41, 1 },
+ { 42, 1 },
+ { 43, 1 },
+ { 44, 1 },
+ { 45, 1 },
+ { 46, 1 },
+ { 47, 1 },
+ { 48, 1 },
+ { 49, 1 },
+ { 50, 1 },
+ { 60, 1 },
+ { 70, 1 },
+ { 80, 1 },
+ { 90, 1 },
+ { 100, 1 },
+ { 200, 1 },
+ { 300, 1 },
+ { 400, 1 },
+ { 500, 1 },
+ { 600, 1 },
+ { 700, 1 },
+ { 800, 1 },
+ { 900, 1 },
+ { 1000, 1 },
+ { 2000, 1 },
+ { 3000, 1 },
+ { 4000, 1 },
+ { 5000, 1 },
+ { 6000, 1 },
+ { 7000, 1 },
+ { 8000, 1 },
+ { 9000, 1 },
+ { 10000, 1 },
+ { 20000, 1 },
+ { 30000, 1 },
+ { 40000, 1 },
+ { 50000, 1 },
+ { 60000, 1 },
+ { 70000, 1 },
+ { 80000, 1 },
+ { 90000, 1 },
+ { 100000, 1 },
+ { -1, 2 },
+ { 1, 2 },
+ { 3, 2 },
+ { 5, 2 },
+ { 7, 2 },
+ { 9, 2 },
+ { 11, 2 },
+ { 13, 2 },
+ { 15, 2 },
+ { 17, 2 },
+ { 1, 3 },
+ { 2, 3 },
+ { 1, 4 },
+ { 3, 4 },
+ { 1, 5 },
+ { 2, 5 },
+ { 3, 5 },
+ { 4, 5 },
+ { 1, 6 },
+ { 5, 6 },
+ { 1, 8 },
+ { 3, 8 },
+ { 5, 8 },
+ { 7, 8 }
+};
+#define numeric_header_0 16
+#define numeric_header_1 3
+#define numeric_header_2 7
+#define numeric_header_3 511
+#define numeric_header_4 127
+static const
+struct
+ {
+ int level1[3];
+ short level2[3 << 9];
+ unsigned short level3[44 * 56 + 1];
+ }
+u_numeric =
+{
+ { 0, 512, 1024 },
+ {
+ 0, 128, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 256, 384, -1, 512,
+ -1, -1, 640, 768, 640, 640, 640, 896,
+ 1024, 640, 1152, -1, 1280, 1280, 1408, -1,
+ 512, 1536, -1, -1, -1, -1, 1664, -1,
+ -1, -1, -1, -1, -1, 1792, -1, 1920,
+ 1536, -1, 2048, 1280, -1, -1, 1280, 0,
+ 2176, -1, -1, -1, -1, -1, -1, -1,
+ 2304, 2432, 2560, 2688, -1, -1, -1, -1,
+ 2816, 2944, -1, -1, -1, -1, 3072, 3200,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 3328, -1, -1, -1, -1, -1, -1,
+ 3456, -1, -1, 3584, 3712, 3840, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 3968, -1, -1, -1,
+ -1, 1280, 2432, -1, 1280, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 4096, 4224, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1536, -1,
+ -1, -1, 4352, 4480, -1, -1, 4608, 4736,
+ -1, 3968, -1, -1, -1, -1, -1, -1,
+ -1, -1, 4864, -1, 4992, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 5120, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 5248, -1,
+ -1, -1, -1, -1, -1, -1, -1, 5376,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 5504, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30,
+ 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc000, 0x0080, 0x0000,
+ 0x0000, 0x0001, 0xae00, 0x0186, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910,
+ 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x0000, 0x2000, 0x1018, 0x800a, 0x0008, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x5c0b, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x0000, 0x0000, 0x0000, 0x0100, 0x80c1, 0x1820, 0x0010,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x5c0b, 0x5c10, 0x030d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080,
+ 0x1c30, 0x0910, 0xd545, 0xc57a, 0xb566, 0x6e5b, 0x0a97, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc101,
+ 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x80c1, 0x3050,
+ 0x101c, 0xc509, 0xf2a2, 0xcd49, 0x3568, 0x0ddb, 0x04a7, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2648, 0x0014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000,
+ 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304,
+ 0xc142, 0x4070, 0x1424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910,
+ 0x0005, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0001, 0x5000, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000,
+ 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbc0, 0x8f15, 0x65c9, 0x19f3,
+ 0x569d, 0x05af, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xa305, 0xc331,
+ 0x82f1, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xa305, 0xc331, 0x82f1,
+ 0xa2c1, 0x0012, 0xcc38, 0x539c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xa305, 0x78e1,
+ 0x2240, 0x0992, 0x22a5, 0x1018, 0x860a, 0x2203, 0x58a1, 0x1a30,
+ 0x078e, 0x2224, 0x5099, 0x822a, 0xa101, 0x3860, 0x1220, 0x058a,
+ 0xe1a3, 0x4078, 0x9222, 0xa509, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8040, 0x70d1,
+ 0x203c, 0xc911, 0x5284, 0x0c11, 0x0508, 0x01c3, 0x5091, 0x022c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0800, 0x8406, 0xe182, 0x4880, 0x1628,
+ 0x0182, 0x60a1, 0x2038, 0x8a12, 0x6085, 0x2840, 0x0e18, 0x8488,
+ 0x0162, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0x0002,
+ 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc100, 0x5080,
+ 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8b00, 0x07ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000,
+ 0x4060, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0182, 0x60a1,
+ 0x2038, 0x8a12, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xcb00, 0x9305, 0x6cd1, 0x1d38, 0x07cf,
+ 0x1214, 0x488d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0182, 0x60a1, 0x2038, 0x8a12, 0x0005, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9280, 0x84e9, 0xa94a,
+ 0xac56, 0xeb96, 0x8b05, 0x66c9, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080,
+ 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000,
+ 0x0000, 0x0000, 0x0160, 0x0000, 0x0300, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0380, 0x00e0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5800, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0304, 0xc142, 0x4070, 0x1424, 0xca8b,
+ 0x3527, 0xd5a3, 0x376c, 0x4e5c, 0xe3b7, 0x7cf5, 0x603f, 0x3850,
+ 0x1624, 0x478d, 0x5264, 0x64b9, 0x9d36, 0x684f, 0x0a54, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaae0, 0x30c0, 0x15e3, 0x869d,
+ 0x0cc5, 0x0bc7, 0x0d16, 0x198b, 0x178e, 0x3a54, 0x0217, 0x6081,
+ 0x1830, 0x0c0c, 0xc58b, 0xb162, 0xccf8, 0xb366, 0x4e19, 0xe3c7,
+ 0x78f1, 0x60bc, 0x30d1, 0x56ab, 0x61bf, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc302, 0x0662,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x1b80, 0x0000, 0x0000, 0x0000,
+ 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xc100, 0x5160, 0x01c1, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0800, 0x1516, 0x001c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0182, 0xb0a1, 0xe0a8, 0x0082,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4203, 0x70c1, 0x2440, 0x8414, 0xe182, 0x4880, 0x0a28, 0x0386,
+ 0xa122, 0x0c10, 0x0508, 0x01c3, 0x5091, 0x0608, 0x8284, 0x4061,
+ 0x1420, 0x070c, 0x4244, 0x1821, 0x0810, 0x0305, 0x2000, 0x1018,
+ 0x0508, 0x8103, 0x2850, 0x0a14, 0x0407, 0x9102, 0x2848, 0x0a14,
+ 0x80c5, 0x3050, 0x041c, 0x4203, 0x60a1, 0x0030, 0x8200, 0xf781,
+ 0xf67b, 0xd17e, 0x3360, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xe545, 0x9a93,
+ 0x6ad1, 0x1bb6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0404, 0x4203, 0x70c1, 0x2440, 0x0114, 0x80c1,
+ 0x3050, 0x101c, 0x4509, 0x3040, 0x1420, 0x070c, 0x4244, 0x1011,
+ 0x080c, 0xc305, 0x9101, 0x0450, 0x0304, 0xc142, 0x4070, 0x1424,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_alphabetic.c b/gnulib/lib/unictype/pr_alphabetic.c
new file mode 100644
index 00000000..f94c71a9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_alphabetic.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_alphabetic table. */
+#include "pr_alphabetic.h"
+
+bool
+uc_is_property_alphabetic (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_alphabetic, uc);
+}
+
+const uc_property_t UC_PROPERTY_ALPHABETIC =
+ { &uc_is_property_alphabetic };
diff --git a/gnulib/lib/unictype/pr_alphabetic.h b/gnulib/lib/unictype/pr_alphabetic.h
new file mode 100644
index 00000000..09ea6c84
--- /dev/null
+++ b/gnulib/lib/unictype/pr_alphabetic.h
@@ -0,0 +1,588 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[44 << 4];
+ }
+u_property_alphabetic =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0xBFFF0000, 0xFFFF00B6, 0x000707FF,
+ 0x07FF0000, 0xFFFFFFFE, 0x7EFFFFFF, 0xFFFFC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x1FEFFFFF, 0x9C00E1FE,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFC00, 0x043007FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFE, 0xE3FFFFFF, 0xFF011FFF, 0xF806000F,
+ 0xFFF99FEE, 0xE3C5FDFF, 0xB080599F, 0x0003000F,
+ 0xFFF987EE, 0xC36DFDFF, 0x5E021987, 0x003F0000,
+ 0xFFFBBFEE, 0xE3EDFDFF, 0x00011BBF, 0x0000000F,
+ 0xFFF99FEE, 0xE3EDFDFF, 0xB0C0199F, 0x0002000F,
+ 0xD63DC7EC, 0xC3FFC718, 0x00811DC7, 0x00000000,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03601DDF, 0x0000000F,
+ 0xFFFDDFEC, 0xE3EFFDFF, 0x40601DDF, 0x0000000F,
+ 0xFFFDDFEC, 0xE3FFFDFF, 0x00801DDF, 0xFC00000F,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F807F, 0x000C0000,
+ 0xFFFFFFFE, 0x07FFFFFF, 0x0000207F, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x3000205F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFF0F03, 0x1FFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xF97FFFFF, 0xFFFF0000, 0xFFFFC1E7,
+ 0x0000407F, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x87FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x000FDFFF, 0x000FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFCFFFFF, 0x108001FF, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000007FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x01FF0FFF, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF03FF, 0x000003FF, 0x00000000,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFEFFFFF, 0x00000FEF, 0x00000000,
+ 0xFFFFFFFF, 0x0000C3FF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0xFC00E000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF3FFBD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000019FF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFC00, 0xFFFF07FF, 0x0007FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0x00003FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ascii_hex_digit.c b/gnulib/lib/unictype/pr_ascii_hex_digit.c
new file mode 100644
index 00000000..4bad897b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ascii_hex_digit.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ascii_hex_digit table. */
+#include "pr_ascii_hex_digit.h"
+
+bool
+uc_is_property_ascii_hex_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ascii_hex_digit, uc);
+}
+
+const uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT =
+ { &uc_is_property_ascii_hex_digit };
diff --git a/gnulib/lib/unictype/pr_ascii_hex_digit.h b/gnulib/lib/unictype/pr_ascii_hex_digit.h
new file mode 100644
index 00000000..d7884ca1
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ascii_hex_digit.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_ascii_hex_digit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x0000007E, 0x0000007E,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_arabic_digit.c b/gnulib/lib/unictype/pr_bidi_arabic_digit.c
new file mode 100644
index 00000000..8bcea66b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_arabic_digit.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_arabic_digit table. */
+#include "pr_bidi_arabic_digit.h"
+
+bool
+uc_is_property_bidi_arabic_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_arabic_digit, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_arabic_digit (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_AN);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT =
+ { &uc_is_property_bidi_arabic_digit };
diff --git a/gnulib/lib/unictype/pr_bidi_arabic_digit.h b/gnulib/lib/unictype/pr_bidi_arabic_digit.h
new file mode 100644
index 00000000..999dda38
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_arabic_digit.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_arabic_digit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x0000000F, 0x00000000, 0x00000000, 0x00001BFF,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c b/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c
new file mode 100644
index 00000000..834d67ac
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_arabic_right_to_left table. */
+#include "pr_bidi_arabic_right_to_left.h"
+
+bool
+uc_is_property_bidi_arabic_right_to_left (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_arabic_right_to_left, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_arabic_right_to_left (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_AL);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT =
+ { &uc_is_property_bidi_arabic_right_to_left };
diff --git a/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h b/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h
new file mode 100644
index 00000000..4a566d6f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_bidi_arabic_right_to_left =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64
+ },
+ {
+ 0xF8002930, 0xFFFFFFFF, 0x800007FF, 0xFFFEE000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0xFC00C060,
+ 0xFFFD7FFF, 0x0000FFFF, 0xFFFFF800, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xDFFF0000,
+ 0xFC000000, 0x0000FF80, 0x00080000, 0xFFFFF080,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_block_separator.c b/gnulib/lib/unictype/pr_bidi_block_separator.c
new file mode 100644
index 00000000..bec778db
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_block_separator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_block_separator table. */
+#include "pr_bidi_block_separator.h"
+
+bool
+uc_is_property_bidi_block_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_block_separator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_block_separator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_B);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR =
+ { &uc_is_property_bidi_block_separator };
diff --git a/gnulib/lib/unictype/pr_bidi_block_separator.h b/gnulib/lib/unictype/pr_bidi_block_separator.h
new file mode 100644
index 00000000..e82d2d45
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_block_separator.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_bidi_block_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x70002400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_boundary_neutral.c b/gnulib/lib/unictype/pr_bidi_boundary_neutral.c
new file mode 100644
index 00000000..f64ae859
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_boundary_neutral.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_boundary_neutral table. */
+#include "pr_bidi_boundary_neutral.h"
+
+bool
+uc_is_property_bidi_boundary_neutral (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_boundary_neutral, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_boundary_neutral (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_BN);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL =
+ { &uc_is_property_bidi_boundary_neutral };
diff --git a/gnulib/lib/unictype/pr_bidi_boundary_neutral.h b/gnulib/lib/unictype/pr_bidi_boundary_neutral.h
new file mode 100644
index 00000000..8bc59e87
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_boundary_neutral.h
@@ -0,0 +1,590 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_bidi_boundary_neutral =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 18 + 512 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 48,
+ 18 + 512 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 96,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 96
+ },
+ {
+ 0x0FFFC1FF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFDF, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC1FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_common_separator.c b/gnulib/lib/unictype/pr_bidi_common_separator.c
new file mode 100644
index 00000000..2989ca6a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_common_separator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_common_separator table. */
+#include "pr_bidi_common_separator.h"
+
+bool
+uc_is_property_bidi_common_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_common_separator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_common_separator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_CS);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR =
+ { &uc_is_property_bidi_common_separator };
diff --git a/gnulib/lib/unictype/pr_bidi_common_separator.h b/gnulib/lib/unictype/pr_bidi_common_separator.h
new file mode 100644
index 00000000..67dedbb2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_common_separator.h
@@ -0,0 +1,168 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[4 << 4];
+ }
+u_property_bidi_common_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48
+ },
+ {
+ 0x00000000, 0x0400D000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00250000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0400D000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_control.c b/gnulib/lib/unictype/pr_bidi_control.c
new file mode 100644
index 00000000..6bb0adf1
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_control.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_control table. */
+#include "pr_bidi_control.h"
+
+bool
+uc_is_property_bidi_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_control, uc);
+}
+
+const uc_property_t UC_PROPERTY_BIDI_CONTROL =
+ { &uc_is_property_bidi_control };
diff --git a/gnulib/lib/unictype/pr_bidi_control.h b/gnulib/lib/unictype/pr_bidi_control.h
new file mode 100644
index 00000000..b676a970
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_control.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_control =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x0000C000, 0x00007C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_embedding_or_override.c b/gnulib/lib/unictype/pr_bidi_embedding_or_override.c
new file mode 100644
index 00000000..3af5785c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_embedding_or_override.c
@@ -0,0 +1,49 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_embedding_or_override table. */
+#include "pr_bidi_embedding_or_override.h"
+
+bool
+uc_is_property_bidi_embedding_or_override (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_embedding_or_override, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_embedding_or_override (ucs4_t uc)
+{
+ int category = uc_bidi_category (uc);
+ return (category == UC_BIDI_LRE || category == UC_BIDI_LRO
+ || category == UC_BIDI_RLE || category == UC_BIDI_RLO);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE =
+ { &uc_is_property_bidi_embedding_or_override };
diff --git a/gnulib/lib/unictype/pr_bidi_embedding_or_override.h b/gnulib/lib/unictype/pr_bidi_embedding_or_override.h
new file mode 100644
index 00000000..d14a500f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_embedding_or_override.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_embedding_or_override =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00006C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_eur_num_separator.c b/gnulib/lib/unictype/pr_bidi_eur_num_separator.c
new file mode 100644
index 00000000..97a74b3b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_eur_num_separator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_eur_num_separator table. */
+#include "pr_bidi_eur_num_separator.h"
+
+bool
+uc_is_property_bidi_eur_num_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_eur_num_separator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_eur_num_separator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_ES);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR =
+ { &uc_is_property_bidi_eur_num_separator };
diff --git a/gnulib/lib/unictype/pr_bidi_eur_num_separator.h b/gnulib/lib/unictype/pr_bidi_eur_num_separator.h
new file mode 100644
index 00000000..a18c2493
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_eur_num_separator.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_bidi_eur_num_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64
+ },
+ {
+ 0x00000000, 0x00002800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0C000000,
+ 0x00000C00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00040000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000000C,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00002800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_eur_num_terminator.c b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.c
new file mode 100644
index 00000000..7376c426
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_eur_num_terminator table. */
+#include "pr_bidi_eur_num_terminator.h"
+
+bool
+uc_is_property_bidi_eur_num_terminator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_eur_num_terminator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_eur_num_terminator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_ET);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR =
+ { &uc_is_property_bidi_eur_num_terminator };
diff --git a/gnulib/lib/unictype/pr_bidi_eur_num_terminator.h b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.h
new file mode 100644
index 00000000..5228108b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.h
@@ -0,0 +1,188 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_bidi_eur_num_terminator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128
+ },
+ {
+ 0x00000000, 0x00000038, 0x00000000, 0x00000000,
+ 0x00000000, 0x0003003C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000600, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00000000, 0x001F0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00004000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000600,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000038, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000063
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_european_digit.c b/gnulib/lib/unictype/pr_bidi_european_digit.c
new file mode 100644
index 00000000..f727dcae
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_european_digit.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_european_digit table. */
+#include "pr_bidi_european_digit.h"
+
+bool
+uc_is_property_bidi_european_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_european_digit, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_european_digit (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_EN);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT =
+ { &uc_is_property_bidi_european_digit };
diff --git a/gnulib/lib/unictype/pr_bidi_european_digit.h b/gnulib/lib/unictype/pr_bidi_european_digit.h
new file mode 100644
index 00000000..27d81bd2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_european_digit.h
@@ -0,0 +1,307 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[6 << 4];
+ }
+u_property_bidi_european_digit =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x020C0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F10000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0FFFFF00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c
new file mode 100644
index 00000000..42e836f6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_hebrew_right_to_left table. */
+#include "pr_bidi_hebrew_right_to_left.h"
+
+bool
+uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_hebrew_right_to_left, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_R);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT =
+ { &uc_is_property_bidi_hebrew_right_to_left };
diff --git a/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h
new file mode 100644
index 00000000..652f5ba2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h
@@ -0,0 +1,315 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_bidi_hebrew_right_to_left =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00010000, 0x40000000, 0xFFFFFF49, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFC3007FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xA0000000, 0xFFFFFDFF, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF0F91, 0x78FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_left_to_right.c b/gnulib/lib/unictype/pr_bidi_left_to_right.c
new file mode 100644
index 00000000..3da97ebe
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_left_to_right.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_left_to_right table. */
+#include "pr_bidi_left_to_right.h"
+
+bool
+uc_is_property_bidi_left_to_right (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_left_to_right, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_left_to_right (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_L);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT =
+ { &uc_is_property_bidi_left_to_right };
diff --git a/gnulib/lib/unictype/pr_bidi_left_to_right.h b/gnulib/lib/unictype/pr_bidi_left_to_right.h
new file mode 100644
index 00000000..73ee442a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_left_to_right.h
@@ -0,0 +1,706 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[38 << 4];
+ }
+u_property_bidi_left_to_right =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 18 + 512 * sizeof (short) / sizeof (int) + 0,
+ 18 + 512 * sizeof (short) / sizeof (int) + 16,
+ 18 + 512 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 48,
+ 18 + 512 * sizeof (short) / sizeof (int) + 64,
+ 18 + 512 * sizeof (short) / sizeof (int) + 80,
+ 18 + 512 * sizeof (short) / sizeof (int) + 96,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 160,
+ 18 + 512 * sizeof (short) / sizeof (int) + 176,
+ 18 + 512 * sizeof (short) / sizeof (int) + 192,
+ 18 + 512 * sizeof (short) / sizeof (int) + 208,
+ 18 + 512 * sizeof (short) / sizeof (int) + 224,
+ 18 + 512 * sizeof (short) / sizeof (int) + 240,
+ 18 + 512 * sizeof (short) / sizeof (int) + 256,
+ 18 + 512 * sizeof (short) / sizeof (int) + 272,
+ 18 + 512 * sizeof (short) / sizeof (int) + 288,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 336,
+ 18 + 512 * sizeof (short) / sizeof (int) + 352,
+ 18 + 512 * sizeof (short) / sizeof (int) + 368,
+ 18 + 512 * sizeof (short) / sizeof (int) + 384,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 416,
+ 18 + 512 * sizeof (short) / sizeof (int) + 432,
+ 18 + 512 * sizeof (short) / sizeof (int) + 448,
+ 18 + 512 * sizeof (short) / sizeof (int) + 464,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 496,
+ 18 + 512 * sizeof (short) / sizeof (int) + 512,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 528,
+ 18 + 512 * sizeof (short) / sizeof (int) + 544,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 560,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 576,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 592,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 592
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xF9FFFFFF, 0x00030003, 0x0000401F,
+ 0x00000000, 0x00000000, 0x00000000, 0xBFCF0000,
+ 0xFFFFFF4F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC07, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0000FBFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF9, 0xEFFFFFFF, 0xFFE1DE01, 0xFFFFFFF3,
+ 0xFFFFFFFD, 0xEFFFFFFF, 0xFFFFDFE1, 0xFFF3FFF3,
+ 0xFFFFFFF9, 0xEFFFFFFF, 0xFFFDC679, 0xFFDCFFFF,
+ 0xFFFFFFF9, 0xEFFFFFFF, 0xFFFFDE41, 0xFFFDFFF3,
+ 0xFFFFFFFD, 0x6FFFFFFF, 0xFFBFDFE1, 0xFFFFFFF3,
+ 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFDFFE, 0xF807FFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFF9FC23E, 0x80FFFFF3,
+ 0xFFFFFFFF, 0xEFFFFFFF, 0xFFFFCFFF, 0xFFF9FFF3,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFDFE1, 0xFFFFFFF3,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFA3FBFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x780DFFFF, 0xFFFF807F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xE40DFFFF, 0xFFFFC0FF, 0xFFFFFFFF,
+ 0xFCFFFFFF, 0xC15FFFFF, 0xFFFFFFFF, 0x8001FFFF,
+ 0x0100FF20, 0xE0000000, 0xFFFFFFBF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x99021FFF, 0x3CFFFFFF, 0xFFE1FFFE,
+ 0xFFFFDF9B, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFC00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE7FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFE3FFFF, 0xFFE3FFFF, 0xFFF3FFFF, 0xFFF3FFFF,
+ 0xFFFFFFFF, 0xC07FFFFF, 0xD7F001BF, 0xFC00FFFF,
+ 0xFFFF8000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFDFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xF1FBFE78, 0xFFFFFFCE, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x00000000,
+ 0xFE7FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFF0, 0xE82FFFFF, 0xFFFFFFFB, 0xFFF007FF,
+ 0xFFFFFFFC, 0xFFFFFCC3, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFF300FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x3FFFFF80,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x5FFFFFFF, 0x1FFF1FFC, 0x9FFF1FFF,
+ 0x00004000, 0x00000000, 0x00000000, 0x800E0000,
+ 0xFFFF8000, 0xFFC00000, 0x0000FFFF, 0xFFFE0000,
+ 0x3E2FFC84, 0xF3FFBD50, 0x0007C3E0, 0xFFFFFFFF,
+ 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00200000, 0x00000000, 0x00000000, 0xFFFFFF00,
+ 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xE0001000, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0x00000C21, 0x00000100, 0x80B85000, 0x00000001,
+ 0x00E00000, 0x80010000, 0x0000E800, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFE0E000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x01FFF81F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
+ 0x00000000, 0xFFFE0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x04000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0xF000FFFF,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE1FFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFF0,
+ 0x9FFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x8FFFFFFF,
+ 0xFFFFFFFF, 0x0001FFFF, 0xFFFF0FFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF87FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0000FFFF, 0x00000000, 0xFFFFFF80, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0FF07FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFEFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFF7BB, 0xFFFFF09F, 0xFFFFFFFF, 0xFF0FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFC03F, 0xFFFC007F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFF9981FF, 0xFFFFEFF7, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x1FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00008080,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFD, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xF000F800, 0xFFFFFFFF, 0xFFFFFFFF, 0xDFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0007FC7F,
+ 0xFFFFF018, 0xFFFFC3FF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00003FFF, 0x00000000,
+ 0x00000000, 0x0000F000, 0x00000000, 0x00000000,
+ 0xFFF00000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_non_spacing_mark.c b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.c
new file mode 100644
index 00000000..df470bb3
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_non_spacing_mark table. */
+#include "pr_bidi_non_spacing_mark.h"
+
+bool
+uc_is_property_bidi_non_spacing_mark (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_non_spacing_mark, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_non_spacing_mark (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_NSM);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK =
+ { &uc_is_property_bidi_non_spacing_mark };
diff --git a/gnulib/lib/unictype/pr_bidi_non_spacing_mark.h b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.h
new file mode 100644
index 00000000..6d3c6c23
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.h
@@ -0,0 +1,528 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[26 << 4];
+ }
+u_property_bidi_non_spacing_mark =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0x7FFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0xDFC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000006, 0x10000000, 0x001E21FE, 0x0000000C,
+ 0x00000002, 0x10000000, 0x0000201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0x90000000, 0x0040201E, 0x0000000C,
+ 0x00000004, 0x00000000, 0x00002001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x10000000, 0x00003000, 0x0000000C,
+ 0x00000000, 0x00000000, 0x0000201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x005C0400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFF00DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x00002064, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3F800000, 0x200FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xC000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_other_neutral.c b/gnulib/lib/unictype/pr_bidi_other_neutral.c
new file mode 100644
index 00000000..0f63bca6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_other_neutral.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_other_neutral table. */
+#include "pr_bidi_other_neutral.h"
+
+bool
+uc_is_property_bidi_other_neutral (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_other_neutral, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_other_neutral (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_ON);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL =
+ { &uc_is_property_bidi_other_neutral };
diff --git a/gnulib/lib/unictype/pr_bidi_other_neutral.h b/gnulib/lib/unictype/pr_bidi_other_neutral.h
new file mode 100644
index 00000000..2df9ce52
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_other_neutral.h
@@ -0,0 +1,407 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[31 << 4];
+ }
+u_property_bidi_other_neutral =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0xF80007C6, 0xF8000001, 0x78000001,
+ 0x00000000, 0xF9D0DBC2, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x06000000, 0xFFFCFFFC, 0xFFFFBFE0,
+ 0x00000000, 0x00000000, 0x00000000, 0x40300000,
+ 0x000000B0, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C0C0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03C00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x05F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00060000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x3C000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000031, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0xFFFF0000, 0xFFE000FF, 0x7FFFFFEF, 0x70000000,
+ 0x00007000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC1D0037B, 0x0C0002AF, 0xFFF83C1F, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFF3FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0xF8000000,
+ 0xFFDFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0x000000FF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x1FFFEFFF, 0x0000000F, 0x00000000,
+ 0xFFFFF3DE, 0xFFFFFEFF, 0x7F47AFFF, 0xFFFFFFFE,
+ 0xFF1FFFFF, 0x7FFEFFFF, 0xFFFF17FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x001F1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFE0007E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0001FFFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFF1E, 0xE0C10001, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000001, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x0000000F,
+ 0x60000000, 0x00000000, 0xFFFF0000, 0x70000000,
+ 0x00000000, 0xFFFE0000, 0x0000F000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07800000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0xC0080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000F00, 0x00000000, 0x00F00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x03FF0000, 0xFFFF0000, 0x7FD2FFFF, 0x00000973,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xF80007C6, 0xF8000001, 0xF8000001, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x3E007F1C,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFF07FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_pdf.c b/gnulib/lib/unictype/pr_bidi_pdf.c
new file mode 100644
index 00000000..7e8ace2c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_pdf.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_pdf table. */
+#include "pr_bidi_pdf.h"
+
+bool
+uc_is_property_bidi_pdf (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_pdf, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_pdf (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_PDF);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_PDF =
+ { &uc_is_property_bidi_pdf };
diff --git a/gnulib/lib/unictype/pr_bidi_pdf.h b/gnulib/lib/unictype/pr_bidi_pdf.h
new file mode 100644
index 00000000..cef93250
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_pdf.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_pdf =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00001000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_segment_separator.c b/gnulib/lib/unictype/pr_bidi_segment_separator.c
new file mode 100644
index 00000000..6452b079
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_segment_separator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_segment_separator table. */
+#include "pr_bidi_segment_separator.h"
+
+bool
+uc_is_property_bidi_segment_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_segment_separator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_segment_separator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_S);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR =
+ { &uc_is_property_bidi_segment_separator };
diff --git a/gnulib/lib/unictype/pr_bidi_segment_separator.h b/gnulib/lib/unictype/pr_bidi_segment_separator.h
new file mode 100644
index 00000000..09b018e3
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_segment_separator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_segment_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x80000A00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_whitespace.c b/gnulib/lib/unictype/pr_bidi_whitespace.c
new file mode 100644
index 00000000..ef22a3e3
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_whitespace.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_whitespace table. */
+#include "pr_bidi_whitespace.h"
+
+bool
+uc_is_property_bidi_whitespace (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_whitespace, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_whitespace (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_WS);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_WHITESPACE =
+ { &uc_is_property_bidi_whitespace };
diff --git a/gnulib/lib/unictype/pr_bidi_whitespace.h b/gnulib/lib/unictype/pr_bidi_whitespace.h
new file mode 100644
index 00000000..2053057c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_whitespace.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_bidi_whitespace =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00001000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00000100, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_byname.c b/gnulib/lib/unictype/pr_byname.c
new file mode 100644
index 00000000..89d59b90
--- /dev/null
+++ b/gnulib/lib/unictype/pr_byname.c
@@ -0,0 +1,59 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <string.h>
+
+/* Get gperf generated lookup function. */
+#include "unictype/pr_byname.h"
+
+static const uc_property_t UC_PROPERTY_NONE = { NULL };
+
+uc_property_t
+uc_property_byname (const char *property_name)
+{
+ char buf[MAX_WORD_LENGTH + 1];
+ const char *cp;
+ char *bp;
+ unsigned int count;
+ const struct named_property *found;
+
+ for (cp = property_name, bp = buf, count = MAX_WORD_LENGTH + 1; ; cp++, bp++)
+ {
+ unsigned char c = (unsigned char) *cp;
+ if (c >= 0x80)
+ goto invalid;
+ if (c >= 'A' && c <= 'Z')
+ c += 'a' - 'A';
+ else if (c == ' ' || c == '-')
+ c = '_';
+ *bp = c;
+ if (c == '\0')
+ break;
+ if (--count == 0)
+ goto invalid;
+ }
+ found = uc_property_lookup (buf, bp - buf);
+ if (found != NULL)
+ return found->property;
+ invalid:
+ return UC_PROPERTY_NONE;
+}
diff --git a/gnulib/lib/unictype/pr_byname.gperf b/gnulib/lib/unictype/pr_byname.gperf
new file mode 100644
index 00000000..5d3daa0d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_byname.gperf
@@ -0,0 +1,89 @@
+struct named_property { const char *name; uc_property_t property; };
+%struct-type
+%language=ANSI-C
+%define hash-function-name properties_hash
+%define lookup-function-name uc_property_lookup
+%7bit
+%readonly-tables
+%global-table
+%define word-array-name properties
+%%
+white_space, { &uc_is_property_white_space }
+alphabetic, { &uc_is_property_alphabetic }
+other_alphabetic, { &uc_is_property_other_alphabetic }
+not_a_character, { &uc_is_property_not_a_character }
+default_ignorable_code_point, { &uc_is_property_default_ignorable_code_point }
+other_default_ignorable_code_point, { &uc_is_property_other_default_ignorable_code_point }
+deprecated, { &uc_is_property_deprecated }
+logical_order_exception, { &uc_is_property_logical_order_exception }
+variation_selector, { &uc_is_property_variation_selector }
+private_use, { &uc_is_property_private_use }
+unassigned_code_value, { &uc_is_property_unassigned_code_value }
+uppercase, { &uc_is_property_uppercase }
+other_uppercase, { &uc_is_property_other_uppercase }
+lowercase, { &uc_is_property_lowercase }
+other_lowercase, { &uc_is_property_other_lowercase }
+titlecase, { &uc_is_property_titlecase }
+soft_dotted, { &uc_is_property_soft_dotted }
+id_start, { &uc_is_property_id_start }
+other_id_start, { &uc_is_property_other_id_start }
+id_continue, { &uc_is_property_id_continue }
+other_id_continue, { &uc_is_property_other_id_continue }
+xid_start, { &uc_is_property_xid_start }
+xid_continue, { &uc_is_property_xid_continue }
+pattern_white_space, { &uc_is_property_pattern_white_space }
+pattern_syntax, { &uc_is_property_pattern_syntax }
+join_control, { &uc_is_property_join_control }
+grapheme_base, { &uc_is_property_grapheme_base }
+grapheme_extend, { &uc_is_property_grapheme_extend }
+other_grapheme_extend, { &uc_is_property_other_grapheme_extend }
+grapheme_link, { &uc_is_property_grapheme_link }
+bidi_control, { &uc_is_property_bidi_control }
+bidi_left_to_right, { &uc_is_property_bidi_left_to_right }
+bidi_hebrew_right_to_left, { &uc_is_property_bidi_hebrew_right_to_left }
+bidi_arabic_right_to_left, { &uc_is_property_bidi_arabic_right_to_left }
+bidi_european_digit, { &uc_is_property_bidi_european_digit }
+bidi_eur_num_separator, { &uc_is_property_bidi_eur_num_separator }
+bidi_eur_num_terminator, { &uc_is_property_bidi_eur_num_terminator }
+bidi_arabic_digit, { &uc_is_property_bidi_arabic_digit }
+bidi_common_separator, { &uc_is_property_bidi_common_separator }
+bidi_block_separator, { &uc_is_property_bidi_block_separator }
+bidi_segment_separator, { &uc_is_property_bidi_segment_separator }
+bidi_whitespace, { &uc_is_property_bidi_whitespace }
+bidi_non_spacing_mark, { &uc_is_property_bidi_non_spacing_mark }
+bidi_boundary_neutral, { &uc_is_property_bidi_boundary_neutral }
+bidi_pdf, { &uc_is_property_bidi_pdf }
+bidi_embedding_or_override, { &uc_is_property_bidi_embedding_or_override }
+bidi_other_neutral, { &uc_is_property_bidi_other_neutral }
+hex_digit, { &uc_is_property_hex_digit }
+ascii_hex_digit, { &uc_is_property_ascii_hex_digit }
+ideographic, { &uc_is_property_ideographic }
+unified_ideograph, { &uc_is_property_unified_ideograph }
+radical, { &uc_is_property_radical }
+ids_binary_operator, { &uc_is_property_ids_binary_operator }
+ids_trinary_operator, { &uc_is_property_ids_trinary_operator }
+zero_width, { &uc_is_property_zero_width }
+space, { &uc_is_property_space }
+non_break, { &uc_is_property_non_break }
+iso_control, { &uc_is_property_iso_control }
+format_control, { &uc_is_property_format_control }
+dash, { &uc_is_property_dash }
+hyphen, { &uc_is_property_hyphen }
+punctuation, { &uc_is_property_punctuation }
+line_separator, { &uc_is_property_line_separator }
+paragraph_separator, { &uc_is_property_paragraph_separator }
+quotation_mark, { &uc_is_property_quotation_mark }
+sentence_terminal, { &uc_is_property_sentence_terminal }
+terminal_punctuation, { &uc_is_property_terminal_punctuation }
+currency_symbol, { &uc_is_property_currency_symbol }
+math, { &uc_is_property_math }
+other_math, { &uc_is_property_other_math }
+paired_punctuation, { &uc_is_property_paired_punctuation }
+left_of_pair, { &uc_is_property_left_of_pair }
+combining, { &uc_is_property_combining }
+composite, { &uc_is_property_composite }
+decimal_digit, { &uc_is_property_decimal_digit }
+numeric, { &uc_is_property_numeric }
+diacritic, { &uc_is_property_diacritic }
+extender, { &uc_is_property_extender }
+ignorable_control, { &uc_is_property_ignorable_control }
diff --git a/gnulib/lib/unictype/pr_combining.c b/gnulib/lib/unictype/pr_combining.c
new file mode 100644
index 00000000..631a1b2f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_combining.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_combining table. */
+#include "pr_combining.h"
+
+bool
+uc_is_property_combining (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_combining, uc);
+}
+
+const uc_property_t UC_PROPERTY_COMBINING =
+ { &uc_is_property_combining };
diff --git a/gnulib/lib/unictype/pr_combining.h b/gnulib/lib/unictype/pr_combining.h
new file mode 100644
index 00000000..f17c6a50
--- /dev/null
+++ b/gnulib/lib/unictype/pr_combining.h
@@ -0,0 +1,528 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[26 << 4];
+ }
+u_property_combining =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0x7FFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0xDFC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000E, 0xD0000000, 0x001E3FFF, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x0080399F, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x00023987, 0x00230000,
+ 0x0000000E, 0xD0000000, 0x00003BBF, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x00C0399F, 0x0000000C,
+ 0x00000004, 0xC0000000, 0x00803DC7, 0x00000000,
+ 0x0000000E, 0xC0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xD0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00803DDF, 0x0000000C,
+ 0x0000000C, 0x00000000, 0xFF5F8400, 0x000C0000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0xC2A00000, 0x00000000, 0xFFFE0000,
+ 0xFEFF00DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x7FFFF800, 0xC3C00000, 0x001E3F9D,
+ 0x0000BFFC, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0xFFC00000, 0x200FFFFF, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0FFF0FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x00000301, 0x00000000,
+ 0x0F800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0xFFF00000, 0x0000001F, 0x000FF800,
+ 0x00000007, 0x000007FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00FFFFF0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xC000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x000000F8, 0x00000000, 0x00000000,
+ 0x00000003, 0xFFF00000, 0x0000001F, 0x00000000,
+ 0x00000000, 0x00003FC0, 0x000FFF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x007FFE00, 0x00003008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E3E0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_composite.c b/gnulib/lib/unictype/pr_composite.c
new file mode 100644
index 00000000..0aae82a4
--- /dev/null
+++ b/gnulib/lib/unictype/pr_composite.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_composite table. */
+#include "pr_composite.h"
+
+bool
+uc_is_property_composite (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_composite, uc);
+}
+
+const uc_property_t UC_PROPERTY_COMPOSITE =
+ { &uc_is_property_composite };
diff --git a/gnulib/lib/unictype/pr_composite.h b/gnulib/lib/unictype/pr_composite.h
new file mode 100644
index 00000000..43639b56
--- /dev/null
+++ b/gnulib/lib/unictype/pr_composite.h
@@ -0,0 +1,375 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[23 << 4];
+ }
+u_property_composite =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x70000000, 0x3E7EFFBF, 0xBE7EFFBF,
+ 0xFFFCFFFF, 0xFEFDFF3F, 0xFFF3F3F9, 0x7FFFFF3F,
+ 0x00000000, 0x00018003, 0xDFFFFFF0, 0xFF3FFFCF,
+ 0xCFFFFFFF, 0x000FFFC0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x0001D760, 0x0001FC00, 0x00187C00, 0x00000000,
+ 0x0200708B, 0x02000000, 0x708B0000, 0x00C00000,
+ 0x00000000, 0x00000000, 0xFCCF0006, 0x033FFCFC,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000007C, 0x00000000, 0x01E00000,
+ 0x00000000, 0x00000000, 0x00080005, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00120200, 0xFF000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xB0001800, 0x00000000,
+ 0x00000000, 0x00480000, 0x4E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x30001900, 0x00000000,
+ 0x00100000, 0x00000000, 0x00001C00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000100, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000D81, 0x00000000,
+ 0x00000000, 0x00000000, 0x00001C00, 0x00000000,
+ 0x00000000, 0x00000000, 0x74000000, 0x00000000,
+ 0x00000000, 0x00080000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00080000, 0x30000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x10842008, 0x03E80200,
+ 0x20080002, 0x02001084, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000040, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00045540, 0x28000000, 0x0000000B, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x1555FFFF,
+ 0xFFFFFFFF, 0x17DFFFFF, 0xE7C7F5DE, 0x15DC37F7,
+ 0x00000000, 0x10D80060, 0x00800380, 0x00000000,
+ 0x00000000, 0x00000100, 0x00000000, 0x00000000,
+ 0x0040026B, 0x08000007, 0xFFF80000, 0x0DEE0DEE,
+ 0x0C000000, 0x00004000, 0x0000E000, 0x00000000,
+ 0x00001210, 0x0001B050, 0x00000292, 0x0333E005,
+ 0x00000333, 0x0000F000, 0x00000000, 0x00003C0F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFE00,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0x00700000,
+ 0x00000000, 0x00000000, 0x10000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555000, 0x36DB02A5,
+ 0xC0100000, 0x55555000, 0x36DB02A5, 0xC7900000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0x7FFFC000,
+ 0x00000000, 0xFFFE0000, 0x0000FFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000001F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xA0F8007F, 0x5F7FFC00, 0x0000FFDB, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0FFFFC00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFF0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x1FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xAA820000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FE00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x0000001F,
+ 0x00000000, 0xF8000000, 0x00000001, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_currency_symbol.c b/gnulib/lib/unictype/pr_currency_symbol.c
new file mode 100644
index 00000000..1f37bb5b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_currency_symbol.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_currency_symbol table. */
+#include "pr_currency_symbol.h"
+
+bool
+uc_is_property_currency_symbol (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_currency_symbol, uc);
+}
+
+#else
+
+bool
+uc_is_property_currency_symbol (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Sc);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_CURRENCY_SYMBOL =
+ { &uc_is_property_currency_symbol };
diff --git a/gnulib/lib/unictype/pr_currency_symbol.h b/gnulib/lib/unictype/pr_currency_symbol.h
new file mode 100644
index 00000000..8815876d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_currency_symbol.h
@@ -0,0 +1,188 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_currency_symbol =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128
+ },
+ {
+ 0x00000000, 0x00000010, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000003C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000063
+ }
+};
diff --git a/gnulib/lib/unictype/pr_dash.c b/gnulib/lib/unictype/pr_dash.c
new file mode 100644
index 00000000..033dc6c6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_dash.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_dash table. */
+#include "pr_dash.h"
+
+bool
+uc_is_property_dash (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_dash, uc);
+}
+
+const uc_property_t UC_PROPERTY_DASH =
+ { &uc_is_property_dash };
diff --git a/gnulib/lib/unictype/pr_dash.h b/gnulib/lib/unictype/pr_dash.h
new file mode 100644
index 00000000..70e67e02
--- /dev/null
+++ b/gnulib/lib/unictype/pr_dash.h
@@ -0,0 +1,184 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_dash =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112
+ },
+ {
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x40000000, 0x00000000, 0x00000000,
+ 0x00000040, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003F0000, 0x00000000, 0x00080000, 0x08000000,
+ 0x00000800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00040000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x04800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x10000000, 0x00010000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00060000, 0x01000000, 0x00000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_decimal_digit.c b/gnulib/lib/unictype/pr_decimal_digit.c
new file mode 100644
index 00000000..de31d249
--- /dev/null
+++ b/gnulib/lib/unictype/pr_decimal_digit.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_decimal_digit table. */
+#include "pr_decimal_digit.h"
+
+bool
+uc_is_property_decimal_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_decimal_digit, uc);
+}
+
+#else
+
+bool
+uc_is_property_decimal_digit (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Nd);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_DECIMAL_DIGIT =
+ { &uc_is_property_decimal_digit };
diff --git a/gnulib/lib/unictype/pr_decimal_digit.h b/gnulib/lib/unictype/pr_decimal_digit.h
new file mode 100644
index 00000000..d73e8bc5
--- /dev/null
+++ b/gnulib/lib/unictype/pr_decimal_digit.h
@@ -0,0 +1,351 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[17 << 4];
+ }
+u_property_decimal_digit =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF03FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_default_ignorable_code_point.c b/gnulib/lib/unictype/pr_default_ignorable_code_point.c
new file mode 100644
index 00000000..ce0e8166
--- /dev/null
+++ b/gnulib/lib/unictype/pr_default_ignorable_code_point.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_default_ignorable_code_point table. */
+#include "pr_default_ignorable_code_point.h"
+
+bool
+uc_is_property_default_ignorable_code_point (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_default_ignorable_code_point, uc);
+}
+
+const uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT =
+ { &uc_is_property_default_ignorable_code_point };
diff --git a/gnulib/lib/unictype/pr_default_ignorable_code_point.h b/gnulib/lib/unictype/pr_default_ignorable_code_point.h
new file mode 100644
index 00000000..df57db55
--- /dev/null
+++ b/gnulib/lib/unictype/pr_default_ignorable_code_point.h
@@ -0,0 +1,464 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[10 << 4];
+ }
+u_property_default_ignorable_code_point =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300000, 0x00000000, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000010,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x01FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_deprecated.c b/gnulib/lib/unictype/pr_deprecated.c
new file mode 100644
index 00000000..9f8cf618
--- /dev/null
+++ b/gnulib/lib/unictype/pr_deprecated.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_deprecated table. */
+#include "pr_deprecated.h"
+
+bool
+uc_is_property_deprecated (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_deprecated, uc);
+}
+
+const uc_property_t UC_PROPERTY_DEPRECATED =
+ { &uc_is_property_deprecated };
diff --git a/gnulib/lib/unictype/pr_deprecated.h b/gnulib/lib/unictype/pr_deprecated.h
new file mode 100644
index 00000000..ee69bbf5
--- /dev/null
+++ b/gnulib/lib/unictype/pr_deprecated.h
@@ -0,0 +1,312 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[4 << 4];
+ }
+u_property_deprecated =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000008, 0x00080000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FC00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_diacritic.c b/gnulib/lib/unictype/pr_diacritic.c
new file mode 100644
index 00000000..cb23950b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_diacritic.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_diacritic table. */
+#include "pr_diacritic.h"
+
+bool
+uc_is_property_diacritic (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_diacritic, uc);
+}
+
+const uc_property_t UC_PROPERTY_DIACRITIC =
+ { &uc_is_property_diacritic };
diff --git a/gnulib/lib/unictype/pr_diacritic.h b/gnulib/lib/unictype/pr_diacritic.h
new file mode 100644
index 00000000..4a8390be
--- /dev/null
+++ b/gnulib/lib/unictype/pr_diacritic.h
@@ -0,0 +1,367 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[21 << 4];
+ }
+u_property_diacritic =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x40000000, 0x00000001,
+ 0x00000000, 0x01908100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xE0FF7FFF, 0x04300007,
+ 0x00000030, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x02000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFB, 0x00000016, 0x00000000,
+ 0x00000000, 0x00000000, 0x0187F800, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00001C61,
+ 0x00000000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x003FF800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x10000000, 0x001E2000, 0x00020000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000400, 0x00000000,
+ 0x00000000, 0x00000000, 0x00005F80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00001F00, 0x00000000,
+ 0x03000000, 0xC2A00000, 0x00000000, 0x00000000,
+ 0x000000DC, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x06800000, 0x00000000, 0x00000000,
+ 0x0000BF80, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x200FFE00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00100000, 0x00000010, 0x000FF800,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000,
+ 0x00000000, 0x00C00000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x000007FF,
+ 0x00000000, 0x00000000, 0x0000FFF0, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x1E000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xB0008000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00007800, 0x00080000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000001, 0x00010000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_extender.c b/gnulib/lib/unictype/pr_extender.c
new file mode 100644
index 00000000..5e5a69c8
--- /dev/null
+++ b/gnulib/lib/unictype/pr_extender.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_extender table. */
+#include "pr_extender.h"
+
+bool
+uc_is_property_extender (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_extender, uc);
+}
+
+const uc_property_t UC_PROPERTY_EXTENDER =
+ { &uc_is_property_extender };
diff --git a/gnulib/lib/unictype/pr_extender.h b/gnulib/lib/unictype/pr_extender.h
new file mode 100644
index 00000000..70d9582b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_extender.h
@@ -0,0 +1,192 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[10 << 4];
+ }
+u_property_extender =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00800000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00030000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00400000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x003E0000, 0x00000000, 0x00000000,
+ 0x60000000, 0x00000000, 0x00000000, 0x70000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00200000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_format_control.c b/gnulib/lib/unictype/pr_format_control.c
new file mode 100644
index 00000000..aca189e4
--- /dev/null
+++ b/gnulib/lib/unictype/pr_format_control.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_format_control table. */
+#include "pr_format_control.h"
+
+bool
+uc_is_property_format_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_format_control, uc);
+}
+
+const uc_property_t UC_PROPERTY_FORMAT_CONTROL =
+ { &uc_is_property_format_control };
diff --git a/gnulib/lib/unictype/pr_format_control.h b/gnulib/lib/unictype/pr_format_control.h
new file mode 100644
index 00000000..fde6b409
--- /dev/null
+++ b/gnulib/lib/unictype/pr_format_control.h
@@ -0,0 +1,444 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_format_control =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000800, 0x00000000, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_grapheme_base.c b/gnulib/lib/unictype/pr_grapheme_base.c
new file mode 100644
index 00000000..1d6530c8
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_base.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_grapheme_base table. */
+#include "pr_grapheme_base.h"
+
+bool
+uc_is_property_grapheme_base (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_grapheme_base, uc);
+}
+
+const uc_property_t UC_PROPERTY_GRAPHEME_BASE =
+ { &uc_is_property_grapheme_base };
diff --git a/gnulib/lib/unictype/pr_grapheme_base.h b/gnulib/lib/unictype/pr_grapheme_base.h
new file mode 100644
index 00000000..6926dfd4
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_base.h
@@ -0,0 +1,616 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[51 << 4];
+ }
+u_property_grapheme_base =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ 4 + 384 * sizeof (short) / sizeof (int) + 720,
+ 4 + 384 * sizeof (short) / sizeof (int) + 736,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 768,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0x00000000, 0xFFFFDFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x7CFF0000,
+ 0xFFFFD7F0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC07, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0xFE7FFFFF, 0xFFFFFFFE,
+ 0x000006FF, 0x40000000, 0xFFFF0049, 0x001F07FF,
+ 0xC800FFC0, 0xFFFFFFFE, 0x000007FF, 0xFFFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0xFFFFC260,
+ 0xFFFD3FFF, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x07F007FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0xE3FFFFFF, 0xFF011E01, 0xF807FFF3,
+ 0xFFF99FEC, 0xA3C5FDFF, 0xB0005981, 0x07FFFFC3,
+ 0xFFF987E8, 0xC36DFDFF, 0x5E000001, 0x001CFFC0,
+ 0xFFFBBFE8, 0xE3EDFDFF, 0x00011A01, 0x0002FFC3,
+ 0xFFF99FEC, 0x23EDFDFF, 0xB0001981, 0x0003FFC3,
+ 0xD63DC7E8, 0x83FFC718, 0x00011DC6, 0x07FFFFC0,
+ 0xFFFDDFEE, 0x23EFFDFF, 0x0300001E, 0xFF00FFC3,
+ 0xFFFDDFEC, 0x63EFFDFF, 0x40000D9B, 0x0006FFC3,
+ 0xFFFDDFEC, 0xA3FFFDFF, 0x00001DC1, 0xFE3FFFC3,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0x7F03007F, 0x001C0000,
+ 0xFFFFFFFE, 0x800DFFFF, 0x0FFF807F, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000,
+ 0xFCFFFFFF, 0xFD5FFFFF, 0xFFFFFEFF, 0x80001FFF,
+ 0x00000F20, 0xC0000000, 0x001FDFBF, 0x00000000,
+ 0xFFFFFFFF, 0x99021FFF, 0x3CFFFFFF, 0xFFE1FFFE,
+ 0xC3FFDF9B, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x1FFFFFFF,
+ 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF,
+ 0x0003DFFF, 0x0063FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0xC04FFFFF, 0x1FF001BF, 0x03FF03FF,
+ 0x03FF47FF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000005FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x01FB0E78, 0xFFFFFFF1, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF03FF, 0xC3FF03FF, 0xFFFFFFFF,
+ 0xCE7FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0xE82FFFFF, 0xFFFF0FFB, 0x1FF007FF,
+ 0xFFFFFFFC, 0x03FFC4C3, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xF8300FFF, 0xFFFFE3FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF,
+ 0xFFFF07FF, 0xFFFF80FF, 0xFFFFFFFF, 0xFFF30000,
+ 0x001F7FFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF8FFFF, 0xFFFFFFFF,
+ 0xFFFF01FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x1FFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFF3DE, 0xFFFFFEFF, 0x7F47AFFF, 0xFFFFFFFE,
+ 0xFF1FFFFF, 0x7FFEFFFF, 0xFFFF17FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x001F1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE0007FF,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0xFFFFFFFF, 0x0001FFFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFFFF, 0xFFFF03FF, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xF87FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF7FFF, 0x00FFFFFF, 0xFFFFFFFF, 0xFFFF000F,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xC0087FFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x00000F9F, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC00F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFC03F, 0x800C007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x001981FF, 0xF3FF2FF7, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x3FFF0000,
+ 0x03FF0000, 0xFFFF0000, 0xFFF7FFFF, 0xFFDF0F7F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x30007F7F,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0xFFFFFF87, 0xFF8FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFF07FF, 0x00000000, 0xFFFF0000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF000F, 0x000007FF, 0x00000000,
+ 0xBFFFFFFF, 0xFFFFFFFF, 0x003FFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x83FFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x01FF00FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000F0007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0x00003C5F,
+ 0xFFFFF018, 0xFFFFC3FF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_grapheme_extend.c b/gnulib/lib/unictype/pr_grapheme_extend.c
new file mode 100644
index 00000000..1a952971
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_extend.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_grapheme_extend table. */
+#include "pr_grapheme_extend.h"
+
+bool
+uc_is_property_grapheme_extend (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_grapheme_extend, uc);
+}
+
+const uc_property_t UC_PROPERTY_GRAPHEME_EXTEND =
+ { &uc_is_property_grapheme_extend };
diff --git a/gnulib/lib/unictype/pr_grapheme_extend.h b/gnulib/lib/unictype/pr_grapheme_extend.h
new file mode 100644
index 00000000..2cd1ca6a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_extend.h
@@ -0,0 +1,528 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[26 << 4];
+ }
+u_property_grapheme_extend =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0x7FFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0xDFC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000006, 0x10000000, 0x001E21FE, 0x0000000C,
+ 0x00000002, 0x50000000, 0x0080201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0xD0000000, 0x00C0201E, 0x0000000C,
+ 0x00000004, 0x40000000, 0x00802001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x90000000, 0x00603044, 0x0000000C,
+ 0x00000000, 0x40000000, 0x0080201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x805C8400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFF00DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x00002064, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3F800000, 0x200FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xC000007F,
+ 0x00003000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807C3A0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_grapheme_link.c b/gnulib/lib/unictype/pr_grapheme_link.c
new file mode 100644
index 00000000..b3a499c5
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_link.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_grapheme_link table. */
+#include "pr_grapheme_link.h"
+
+bool
+uc_is_property_grapheme_link (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_grapheme_link, uc);
+}
+
+const uc_property_t UC_PROPERTY_GRAPHEME_LINK =
+ { &uc_is_property_grapheme_link };
diff --git a/gnulib/lib/unictype/pr_grapheme_link.h b/gnulib/lib/unictype/pr_grapheme_link.h
new file mode 100644
index 00000000..14379753
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_link.h
@@ -0,0 +1,319 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_grapheme_link =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000400, 0x00000000,
+ 0x00000000, 0x04000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x06000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00100000, 0x00100000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00040000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000,
+ 0x00000040, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_hex_digit.c b/gnulib/lib/unictype/pr_hex_digit.c
new file mode 100644
index 00000000..ce5a73a9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_hex_digit.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_hex_digit table. */
+#include "pr_hex_digit.h"
+
+bool
+uc_is_property_hex_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_hex_digit, uc);
+}
+
+const uc_property_t UC_PROPERTY_HEX_DIGIT =
+ { &uc_is_property_hex_digit };
diff --git a/gnulib/lib/unictype/pr_hex_digit.h b/gnulib/lib/unictype/pr_hex_digit.h
new file mode 100644
index 00000000..8bbe5f1d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_hex_digit.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_hex_digit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x0000007E, 0x0000007E,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x0000007E, 0x0000007E, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_hyphen.c b/gnulib/lib/unictype/pr_hyphen.c
new file mode 100644
index 00000000..c2a5d0f6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_hyphen.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_hyphen table. */
+#include "pr_hyphen.h"
+
+bool
+uc_is_property_hyphen (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_hyphen, uc);
+}
+
+const uc_property_t UC_PROPERTY_HYPHEN =
+ { &uc_is_property_hyphen };
diff --git a/gnulib/lib/unictype/pr_hyphen.h b/gnulib/lib/unictype/pr_hyphen.h
new file mode 100644
index 00000000..f52c26fc
--- /dev/null
+++ b/gnulib/lib/unictype/pr_hyphen.h
@@ -0,0 +1,180 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_hyphen =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96
+ },
+ {
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000040, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00030000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000020,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_id_continue.c b/gnulib/lib/unictype/pr_id_continue.c
new file mode 100644
index 00000000..0115c467
--- /dev/null
+++ b/gnulib/lib/unictype/pr_id_continue.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_id_continue table. */
+#include "pr_id_continue.h"
+
+bool
+uc_is_property_id_continue (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_id_continue, uc);
+}
+
+const uc_property_t UC_PROPERTY_ID_CONTINUE =
+ { &uc_is_property_id_continue };
diff --git a/gnulib/lib/unictype/pr_id_continue.h b/gnulib/lib/unictype/pr_id_continue.h
new file mode 100644
index 00000000..9c55e7f3
--- /dev/null
+++ b/gnulib/lib/unictype/pr_id_continue.h
@@ -0,0 +1,732 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[45 << 4];
+ }
+u_property_id_continue =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ 16 * sizeof (int) / sizeof (short) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 384
+ },
+ {
+ 16 + 512 * sizeof (short) / sizeof (int) + 0,
+ 16 + 512 * sizeof (short) / sizeof (int) + 16,
+ 16 + 512 * sizeof (short) / sizeof (int) + 32,
+ 16 + 512 * sizeof (short) / sizeof (int) + 48,
+ 16 + 512 * sizeof (short) / sizeof (int) + 64,
+ 16 + 512 * sizeof (short) / sizeof (int) + 80,
+ 16 + 512 * sizeof (short) / sizeof (int) + 96,
+ 16 + 512 * sizeof (short) / sizeof (int) + 112,
+ 16 + 512 * sizeof (short) / sizeof (int) + 128,
+ 16 + 512 * sizeof (short) / sizeof (int) + 144,
+ 16 + 512 * sizeof (short) / sizeof (int) + 160,
+ 16 + 512 * sizeof (short) / sizeof (int) + 176,
+ 16 + 512 * sizeof (short) / sizeof (int) + 192,
+ 16 + 512 * sizeof (short) / sizeof (int) + 208,
+ 16 + 512 * sizeof (short) / sizeof (int) + 224,
+ 16 + 512 * sizeof (short) / sizeof (int) + 240,
+ 16 + 512 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 320,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 336,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 352,
+ 16 + 512 * sizeof (short) / sizeof (int) + 368,
+ 16 + 512 * sizeof (short) / sizeof (int) + 384,
+ 16 + 512 * sizeof (short) / sizeof (int) + 400,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 432,
+ 16 + 512 * sizeof (short) / sizeof (int) + 448,
+ 16 + 512 * sizeof (short) / sizeof (int) + 464,
+ 16 + 512 * sizeof (short) / sizeof (int) + 480,
+ 16 + 512 * sizeof (short) / sizeof (int) + 496,
+ 16 + 512 * sizeof (short) / sizeof (int) + 512,
+ 16 + 512 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 544,
+ 16 + 512 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 576,
+ 16 + 512 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 608,
+ 16 + 512 * sizeof (short) / sizeof (int) + 624,
+ 16 + 512 * sizeof (short) / sizeof (int) + 640,
+ 16 + 512 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x87FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04A00400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3CDFFFFF,
+ 0xFFFFD7C0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFCFB, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x027FFFFF, 0xFFFFFFFE,
+ 0xFFFE00FF, 0xBFFFFFFF, 0xFFFF00B6, 0x000707FF,
+ 0x07FF0000, 0xFFFFFFFE, 0x7FFFFFFF, 0xFFFFC3FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x9FEFFFFF, 0x9FFFFDFF,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x043FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFE, 0xF3FFFFFF, 0xFF1F3FFF, 0xF806FFCF,
+ 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x0003FFCF,
+ 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0,
+ 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0000FFCF,
+ 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x0002FFCF,
+ 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x0000FFC0,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0x0000FFCF,
+ 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0000FFCF,
+ 0xFFFDDFEC, 0xE3FFFDFF, 0x00803DDF, 0xFC00FFCF,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x000C0000,
+ 0xFFFFFFFE, 0x07FFFFFF, 0x03FF7FFF, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000,
+ 0x03000001, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFF0FDF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF03FF, 0xFFFFFFFF,
+ 0x03FFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x87FFFFFF, 0x0003FE00,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x001FDFFF, 0x001FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFCFFFFF, 0x308FFFFF, 0x000003FF,
+ 0x03FF3800, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000007FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFC0, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF03FF, 0x03FF03FF, 0x00000000,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF0FFF, 0x000FF800,
+ 0xFFFFFFFF, 0x03FFC7FF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFE3FF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xC000007F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x80000000, 0x00100001, 0x80020000,
+ 0x001F0000, 0x00000000, 0x1FFF0000, 0x0001FFE2,
+ 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0x000000E0, 0x1F3EFFFE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xFE7FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0xB000FFFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000019FF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFFFFF, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF001F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0x000FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0x03FF3FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x0000FFFF, 0x0018007F, 0x0000E000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x03FF0000, 0x87FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x870FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E3E0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_id_start.c b/gnulib/lib/unictype/pr_id_start.c
new file mode 100644
index 00000000..ec349dd9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_id_start.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_id_start table. */
+#include "pr_id_start.h"
+
+bool
+uc_is_property_id_start (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_id_start, uc);
+}
+
+const uc_property_t UC_PROPERTY_ID_START =
+ { &uc_is_property_id_start };
diff --git a/gnulib/lib/unictype/pr_id_start.h b/gnulib/lib/unictype/pr_id_start.h
new file mode 100644
index 00000000..178d718c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_id_start.h
@@ -0,0 +1,580 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[42 << 4];
+ }
+u_property_id_start =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000000, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFE, 0x000007FF, 0xFFFEC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xF8060003,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x00030003,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x00000003,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x00020003,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x00000000,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x00000003,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x00000003,
+ 0xFFFDDFE0, 0x23FFFDFF, 0x00000000, 0xFC000003,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x000DFFFF, 0x0000007F, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x3000005F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF,
+ 0x00000F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062,
+ 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000005FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0x000003FF, 0x000000FE, 0x00000000,
+ 0x007FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000,
+ 0xFFFFFFF8, 0x0000C001, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xF87FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000019FF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ideographic.c b/gnulib/lib/unictype/pr_ideographic.c
new file mode 100644
index 00000000..266034cd
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ideographic.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ideographic table. */
+#include "pr_ideographic.h"
+
+bool
+uc_is_property_ideographic (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ideographic, uc);
+}
+
+const uc_property_t UC_PROPERTY_IDEOGRAPHIC =
+ { &uc_is_property_ideographic };
diff --git a/gnulib/lib/unictype/pr_ideographic.h b/gnulib/lib/unictype/pr_ideographic.h
new file mode 100644
index 00000000..b0b2db2f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ideographic.h
@@ -0,0 +1,316 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_ideographic =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ 4 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 32,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 64,
+ 4 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1
+ },
+ {
+ 0x000000C0, 0x070003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ids_binary_operator.c b/gnulib/lib/unictype/pr_ids_binary_operator.c
new file mode 100644
index 00000000..25e12a31
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ids_binary_operator.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ids_binary_operator table. */
+#include "pr_ids_binary_operator.h"
+
+bool
+uc_is_property_ids_binary_operator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ids_binary_operator, uc);
+}
+
+const uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR =
+ { &uc_is_property_ids_binary_operator };
diff --git a/gnulib/lib/unictype/pr_ids_binary_operator.h b/gnulib/lib/unictype/pr_ids_binary_operator.h
new file mode 100644
index 00000000..2d7f4011
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ids_binary_operator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_ids_binary_operator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0FF30000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ids_trinary_operator.c b/gnulib/lib/unictype/pr_ids_trinary_operator.c
new file mode 100644
index 00000000..2a852211
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ids_trinary_operator.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ids_trinary_operator table. */
+#include "pr_ids_trinary_operator.h"
+
+bool
+uc_is_property_ids_trinary_operator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ids_trinary_operator, uc);
+}
+
+const uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR =
+ { &uc_is_property_ids_trinary_operator };
diff --git a/gnulib/lib/unictype/pr_ids_trinary_operator.h b/gnulib/lib/unictype/pr_ids_trinary_operator.h
new file mode 100644
index 00000000..f4e57d87
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ids_trinary_operator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_ids_trinary_operator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C0000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ignorable_control.c b/gnulib/lib/unictype/pr_ignorable_control.c
new file mode 100644
index 00000000..7b042444
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ignorable_control.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ignorable_control table. */
+#include "pr_ignorable_control.h"
+
+bool
+uc_is_property_ignorable_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ignorable_control, uc);
+}
+
+const uc_property_t UC_PROPERTY_IGNORABLE_CONTROL =
+ { &uc_is_property_ignorable_control };
diff --git a/gnulib/lib/unictype/pr_ignorable_control.h b/gnulib/lib/unictype/pr_ignorable_control.h
new file mode 100644
index 00000000..426c5f71
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ignorable_control.h
@@ -0,0 +1,452 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_ignorable_control =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x0FFFC1FE, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFDF, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300000, 0x00000000, 0x00000000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0E000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_iso_control.c b/gnulib/lib/unictype/pr_iso_control.c
new file mode 100644
index 00000000..bba66088
--- /dev/null
+++ b/gnulib/lib/unictype/pr_iso_control.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_iso_control table. */
+#include "pr_iso_control.h"
+
+bool
+uc_is_property_iso_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_iso_control, uc);
+}
+
+#else
+
+bool
+uc_is_property_iso_control (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Cc);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_ISO_CONTROL =
+ { &uc_is_property_iso_control };
diff --git a/gnulib/lib/unictype/pr_iso_control.h b/gnulib/lib/unictype/pr_iso_control.h
new file mode 100644
index 00000000..09537917
--- /dev/null
+++ b/gnulib/lib/unictype/pr_iso_control.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_iso_control =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_join_control.c b/gnulib/lib/unictype/pr_join_control.c
new file mode 100644
index 00000000..8cf37065
--- /dev/null
+++ b/gnulib/lib/unictype/pr_join_control.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_join_control table. */
+#include "pr_join_control.h"
+
+bool
+uc_is_property_join_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_join_control, uc);
+}
+
+#else
+
+bool
+uc_is_property_join_control (ucs4_t uc)
+{
+ return (uc >= 0x200C && uc <= 0x200D);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_JOIN_CONTROL =
+ { &uc_is_property_join_control };
diff --git a/gnulib/lib/unictype/pr_join_control.h b/gnulib/lib/unictype/pr_join_control.h
new file mode 100644
index 00000000..649a1689
--- /dev/null
+++ b/gnulib/lib/unictype/pr_join_control.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_join_control =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_left_of_pair.c b/gnulib/lib/unictype/pr_left_of_pair.c
new file mode 100644
index 00000000..344e3f04
--- /dev/null
+++ b/gnulib/lib/unictype/pr_left_of_pair.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_left_of_pair table. */
+#include "pr_left_of_pair.h"
+
+bool
+uc_is_property_left_of_pair (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_left_of_pair, uc);
+}
+
+const uc_property_t UC_PROPERTY_LEFT_OF_PAIR =
+ { &uc_is_property_left_of_pair };
diff --git a/gnulib/lib/unictype/pr_left_of_pair.h b/gnulib/lib/unictype/pr_left_of_pair.h
new file mode 100644
index 00000000..af7ee2cb
--- /dev/null
+++ b/gnulib/lib/unictype/pr_left_of_pair.h
@@ -0,0 +1,184 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_left_of_pair =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112
+ },
+ {
+ 0x00000000, 0x00000100, 0x08000000, 0x08000000,
+ 0x00000000, 0x00000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x14000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x08000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xDD000000, 0x02000000, 0x00000020, 0x20000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x25515500, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAA00000, 0x2A00000A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000100, 0x08000000, 0x08000000, 0x00000004,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_line_separator.c b/gnulib/lib/unictype/pr_line_separator.c
new file mode 100644
index 00000000..72c19646
--- /dev/null
+++ b/gnulib/lib/unictype/pr_line_separator.c
@@ -0,0 +1,55 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_line_separator table. */
+#include "pr_line_separator.h"
+
+bool
+uc_is_property_line_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_line_separator, uc);
+}
+
+#elif 0
+
+bool
+uc_is_property_line_separator (ucs4_t uc)
+{
+ return uc_is_category_Zl (uc);
+}
+
+#else
+
+bool
+uc_is_property_line_separator (ucs4_t uc)
+{
+ return (uc == 0x2028);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_LINE_SEPARATOR =
+ { &uc_is_property_line_separator };
diff --git a/gnulib/lib/unictype/pr_line_separator.h b/gnulib/lib/unictype/pr_line_separator.h
new file mode 100644
index 00000000..56dd92b2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_line_separator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_line_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_logical_order_exception.c b/gnulib/lib/unictype/pr_logical_order_exception.c
new file mode 100644
index 00000000..720e951b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_logical_order_exception.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_logical_order_exception table. */
+#include "pr_logical_order_exception.h"
+
+bool
+uc_is_property_logical_order_exception (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_logical_order_exception, uc);
+}
+
+const uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION =
+ { &uc_is_property_logical_order_exception };
diff --git a/gnulib/lib/unictype/pr_logical_order_exception.h b/gnulib/lib/unictype/pr_logical_order_exception.h
new file mode 100644
index 00000000..c8894ad0
--- /dev/null
+++ b/gnulib/lib/unictype/pr_logical_order_exception.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_logical_order_exception =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x0000001F, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_lowercase.c b/gnulib/lib/unictype/pr_lowercase.c
new file mode 100644
index 00000000..1dbbba28
--- /dev/null
+++ b/gnulib/lib/unictype/pr_lowercase.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_lowercase table. */
+#include "pr_lowercase.h"
+
+bool
+uc_is_property_lowercase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_lowercase, uc);
+}
+
+const uc_property_t UC_PROPERTY_LOWERCASE =
+ { &uc_is_property_lowercase };
diff --git a/gnulib/lib/unictype/pr_lowercase.h b/gnulib/lib/unictype/pr_lowercase.h
new file mode 100644
index 00000000..3443aeca
--- /dev/null
+++ b/gnulib/lib/unictype/pr_lowercase.h
@@ -0,0 +1,339 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[14 << 4];
+ }
+u_property_lowercase =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0x80000000, 0xFF7FFFFF,
+ 0xAAAAAAAA, 0x55AAAAAA, 0xAAAAAB55, 0xD4AAAAAA,
+ 0x4E243129, 0xE6512D2A, 0xB5555240, 0xAA29AAAA,
+ 0xAAAAAAAA, 0x93FAAAAA, 0xFFFFAA85, 0xFFFFFFFF,
+ 0xFFEFFFFF, 0x01FFFFFF, 0x00000003, 0x0000001F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3C8A0000,
+ 0x00010000, 0xFFFFF000, 0xAAE37FFF, 0x192FAAAA,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0x0000000A, 0x00000000, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0xBFEAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x003F00FF, 0x00FF00FF, 0x00FF003F, 0x3FFF00FF,
+ 0x00FF00FF, 0x40DF00FF, 0x00CF00DC, 0x00DC00FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0008C400, 0x32108000, 0x000043C0, 0xFFFF0000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x3FDA1562,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000001A,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AA8,
+ 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAABAAA8, 0xAAAAAAAA, 0x95FFAAAA,
+ 0x000010AA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFF00, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFC000000, 0x000FFFFF, 0xFFDFC000, 0x000000FF,
+ 0x0FFFFFFC, 0xEBC00000, 0x0000FFEF, 0xFFFFFC00,
+ 0xC000000F, 0x00FFFFFF, 0xFFFC0000, 0x00000FFF,
+ 0xFFFFFFC0, 0xFC000000, 0x000FFFFF, 0xFFFFC000,
+ 0x000000FF, 0x0FFFFFFC, 0xFFC00000, 0x0000FFFF,
+ 0xFFFFFC00, 0x0000003F, 0xF7FFFFFC, 0xF0000003,
+ 0x0FDFFFFF, 0xFFC00000, 0x003F7FFF, 0xFFFF0000,
+ 0x0000FDFF, 0xFFFFFC00, 0x00000BF7, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_math.c b/gnulib/lib/unictype/pr_math.c
new file mode 100644
index 00000000..35bde045
--- /dev/null
+++ b/gnulib/lib/unictype/pr_math.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_math table. */
+#include "pr_math.h"
+
+bool
+uc_is_property_math (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_math, uc);
+}
+
+const uc_property_t UC_PROPERTY_MATH =
+ { &uc_is_property_math };
diff --git a/gnulib/lib/unictype/pr_math.h b/gnulib/lib/unictype/pr_math.h
new file mode 100644
index 00000000..dd3ae7e5
--- /dev/null
+++ b/gnulib/lib/unictype/pr_math.h
@@ -0,0 +1,335 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_property_math =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x70000800, 0x40000000, 0x50000000,
+ 0x00000000, 0x00021000, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00270000, 0x00730000,
+ 0x000001C0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00400000, 0x001C0000, 0x00040011, 0x7C00001E,
+ 0x00007C00, 0x00000000, 0x1FFF0000, 0x0000F862,
+ 0x3E2FFC04, 0xF1FBB310, 0x00000BFF, 0x00000000,
+ 0xFFFF0000, 0xF0C37EFF, 0x2FFFFFFF, 0xFFF00030,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000F00, 0x00000003, 0x00000000, 0x10000000,
+ 0xF8000000, 0x00BFFFFF, 0xF0010000, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF0FFC003, 0x000F8CC3, 0xFF001F94,
+ 0x00000060, 0x00000000, 0x00000005, 0x0000E00F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF17FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFFFF0000, 0x00001F9F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000017E,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x70000800, 0x50000000, 0x50000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00001E04,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_non_break.c b/gnulib/lib/unictype/pr_non_break.c
new file mode 100644
index 00000000..7ef84ff1
--- /dev/null
+++ b/gnulib/lib/unictype/pr_non_break.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_non_break table. */
+#include "pr_non_break.h"
+
+bool
+uc_is_property_non_break (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_non_break, uc);
+}
+
+const uc_property_t UC_PROPERTY_NON_BREAK =
+ { &uc_is_property_non_break };
diff --git a/gnulib/lib/unictype/pr_non_break.h b/gnulib/lib/unictype/pr_non_break.h
new file mode 100644
index 00000000..0525fb97
--- /dev/null
+++ b/gnulib/lib/unictype/pr_non_break.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_non_break =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xF0008000, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00041100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00020080, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_not_a_character.c b/gnulib/lib/unictype/pr_not_a_character.c
new file mode 100644
index 00000000..b8b96c3b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_not_a_character.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_not_a_character table. */
+#include "pr_not_a_character.h"
+
+bool
+uc_is_property_not_a_character (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_not_a_character, uc);
+}
+
+const uc_property_t UC_PROPERTY_NOT_A_CHARACTER =
+ { &uc_is_property_not_a_character };
diff --git a/gnulib/lib/unictype/pr_not_a_character.h b/gnulib/lib/unictype/pr_not_a_character.h
new file mode 100644
index 00000000..267df707
--- /dev/null
+++ b/gnulib/lib/unictype/pr_not_a_character.h
@@ -0,0 +1,306 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_not_a_character =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 16
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_numeric.c b/gnulib/lib/unictype/pr_numeric.c
new file mode 100644
index 00000000..7fe7633c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_numeric.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_numeric table. */
+#include "pr_numeric.h"
+
+bool
+uc_is_property_numeric (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_numeric, uc);
+}
+
+const uc_property_t UC_PROPERTY_NUMERIC =
+ { &uc_is_property_numeric };
diff --git a/gnulib/lib/unictype/pr_numeric.h b/gnulib/lib/unictype/pr_numeric.h
new file mode 100644
index 00000000..14aaa03b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_numeric.h
@@ -0,0 +1,540 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[32 << 4];
+ }
+u_property_numeric =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x720C0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F0FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x7F00FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x003FFFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FFFFE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0001C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF03FF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF03FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F10000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFF80000, 0xFFFFFFFF,
+ 0x000001EF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x070003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003C0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0xFFFE0000, 0x00000000,
+ 0x000003FF, 0xFFFE0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x01080800,
+ 0x00000000, 0x00040000, 0x000A0000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF80, 0x000FFFFF, 0xFFFFFFFF, 0x01FFFFFF,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000F, 0x00000402, 0x00000000,
+ 0x00000000, 0x00000000, 0x003E0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03C00000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000000FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFF3FFFF, 0xFF3FFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00010000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_alphabetic.c b/gnulib/lib/unictype/pr_other_alphabetic.c
new file mode 100644
index 00000000..398288f6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_alphabetic.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_alphabetic table. */
+#include "pr_other_alphabetic.h"
+
+bool
+uc_is_property_other_alphabetic (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_alphabetic, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_ALPHABETIC =
+ { &uc_is_property_other_alphabetic };
diff --git a/gnulib/lib/unictype/pr_other_alphabetic.h b/gnulib/lib/unictype/pr_other_alphabetic.h
new file mode 100644
index 00000000..c0c42717
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_alphabetic.h
@@ -0,0 +1,359 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[19 << 4];
+ }
+u_property_other_alphabetic =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000020, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xBFFF0000, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0x7EFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0x1FC00000, 0x0000219E,
+ 0x00020000, 0xFFFF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000E, 0xC0000000, 0x00001FFF, 0x0000000C,
+ 0x0000000E, 0xC0000000, 0x0080199F, 0x0000000C,
+ 0x0000000E, 0xC0000000, 0x00021987, 0x00230000,
+ 0x0000000E, 0xC0000000, 0x00001BBF, 0x0000000C,
+ 0x0000000E, 0xC0000000, 0x00C0199F, 0x0000000C,
+ 0x00000004, 0xC0000000, 0x00801DC7, 0x00000000,
+ 0x0000000E, 0xC0000000, 0x00601DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00601DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00801DDF, 0x0000000C,
+ 0x0000000C, 0x00000000, 0xFF5F8000, 0x000C0000,
+ 0x00000000, 0x07F20000, 0x00002000, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFE0000,
+ 0xFEFF0003, 0x1FFFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x797FF800, 0xC3C00000, 0x001E0185,
+ 0x0000007C, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000C0000, 0x000C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0xFFC00000, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x01FF0FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x00000301, 0x00000000,
+ 0x0F800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0xFFE00000, 0x0000000F, 0x00000000,
+ 0x00000007, 0x000003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x003FFFF0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x000000F8, 0x00000000, 0x00000000,
+ 0x00000003, 0xFFF00000, 0x0000000F, 0x00000000,
+ 0x00000000, 0x000007C0, 0x0007FF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x007FFE00, 0x00003008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000F06E, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_default_ignorable_code_point.c b/gnulib/lib/unictype/pr_other_default_ignorable_code_point.c
new file mode 100644
index 00000000..1f651957
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_default_ignorable_code_point.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_default_ignorable_code_point table. */
+#include "pr_other_default_ignorable_code_point.h"
+
+bool
+uc_is_property_other_default_ignorable_code_point (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_default_ignorable_code_point, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT =
+ { &uc_is_property_other_default_ignorable_code_point };
diff --git a/gnulib/lib/unictype/pr_other_default_ignorable_code_point.h b/gnulib/lib/unictype/pr_other_default_ignorable_code_point.h
new file mode 100644
index 00000000..621cf4ce
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_default_ignorable_code_point.h
@@ -0,0 +1,324 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_other_default_ignorable_code_point =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 64,
+ 16 + 256 * sizeof (short) / sizeof (int) + 80,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000010,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x01FF0000,
+ 0xFFFFFFFD, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_grapheme_extend.c b/gnulib/lib/unictype/pr_other_grapheme_extend.c
new file mode 100644
index 00000000..209e19fc
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_grapheme_extend.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_grapheme_extend table. */
+#include "pr_other_grapheme_extend.h"
+
+bool
+uc_is_property_other_grapheme_extend (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_grapheme_extend, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND =
+ { &uc_is_property_other_grapheme_extend };
diff --git a/gnulib/lib/unictype/pr_other_grapheme_extend.h b/gnulib/lib/unictype/pr_other_grapheme_extend.h
new file mode 100644
index 00000000..cbf3b98a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_grapheme_extend.h
@@ -0,0 +1,307 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[6 << 4];
+ }
+u_property_other_grapheme_extend =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00600004, 0x00000000,
+ 0x00000000, 0x40000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80008000, 0x00000000,
+ 0x00003000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007C020,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_id_continue.c b/gnulib/lib/unictype/pr_other_id_continue.c
new file mode 100644
index 00000000..aeb00cc8
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_id_continue.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_id_continue table. */
+#include "pr_other_id_continue.h"
+
+bool
+uc_is_property_other_id_continue (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_id_continue, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE =
+ { &uc_is_property_other_id_continue };
diff --git a/gnulib/lib/unictype/pr_other_id_continue.h b/gnulib/lib/unictype/pr_other_id_continue.h
new file mode 100644
index 00000000..78e2b638
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_id_continue.h
@@ -0,0 +1,164 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_property_other_id_continue =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00800000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003FE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_id_start.c b/gnulib/lib/unictype/pr_other_id_start.c
new file mode 100644
index 00000000..40d09bce
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_id_start.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_id_start table. */
+#include "pr_other_id_start.h"
+
+bool
+uc_is_property_other_id_start (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_id_start, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_ID_START =
+ { &uc_is_property_other_id_start };
diff --git a/gnulib/lib/unictype/pr_other_id_start.h b/gnulib/lib/unictype/pr_other_id_start.h
new file mode 100644
index 00000000..233f80f3
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_id_start.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_other_id_start =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01000000, 0x00004000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_lowercase.c b/gnulib/lib/unictype/pr_other_lowercase.c
new file mode 100644
index 00000000..8126f3c9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_lowercase.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_lowercase table. */
+#include "pr_other_lowercase.h"
+
+bool
+uc_is_property_other_lowercase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_lowercase, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_LOWERCASE =
+ { &uc_is_property_other_lowercase };
diff --git a/gnulib/lib/unictype/pr_other_lowercase.h b/gnulib/lib/unictype/pr_other_lowercase.h
new file mode 100644
index 00000000..78119089
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_lowercase.h
@@ -0,0 +1,176 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[6 << 4];
+ }
+u_property_other_lowercase =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x01FF0000, 0x00000003, 0x0000001F,
+ 0x00000000, 0x00000000, 0x00000020, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x01000003,
+ 0xF8000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_math.c b/gnulib/lib/unictype/pr_other_math.c
new file mode 100644
index 00000000..30a864db
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_math.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_math table. */
+#include "pr_other_math.h"
+
+bool
+uc_is_property_other_math (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_math, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_MATH =
+ { &uc_is_property_other_math };
diff --git a/gnulib/lib/unictype/pr_other_math.h b/gnulib/lib/unictype/pr_other_math.h
new file mode 100644
index 00000000..116311d9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_math.h
@@ -0,0 +1,323 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[10 << 4];
+ }
+u_property_other_math =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x40000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00270000, 0x00330000,
+ 0x00400000, 0x001C0000, 0x00000001, 0x6000001E,
+ 0x00006000, 0x00000000, 0x1FFF0000, 0x0000F862,
+ 0x3E2FFC04, 0xF1FBB310, 0x000003E0, 0x00000000,
+ 0xF3E00000, 0xF0C33EB6, 0x2FEB3FFF, 0x00000030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00B00000, 0x00010000, 0x00000004,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF07FC003, 0x000F8CC1, 0x00001F94,
+ 0x00000060, 0x00000000, 0x00000005, 0x0000600F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000060, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01FFFFF8, 0x00000000, 0x0F000000, 0x30000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000010A,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x50000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_uppercase.c b/gnulib/lib/unictype/pr_other_uppercase.c
new file mode 100644
index 00000000..9c6b1deb
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_uppercase.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_uppercase table. */
+#include "pr_other_uppercase.h"
+
+bool
+uc_is_property_other_uppercase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_uppercase, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_UPPERCASE =
+ { &uc_is_property_other_uppercase };
diff --git a/gnulib/lib/unictype/pr_other_uppercase.h b/gnulib/lib/unictype/pr_other_uppercase.h
new file mode 100644
index 00000000..be01f4d7
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_uppercase.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_other_uppercase =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_paired_punctuation.c b/gnulib/lib/unictype/pr_paired_punctuation.c
new file mode 100644
index 00000000..1faa2cdf
--- /dev/null
+++ b/gnulib/lib/unictype/pr_paired_punctuation.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_paired_punctuation table. */
+#include "pr_paired_punctuation.h"
+
+bool
+uc_is_property_paired_punctuation (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_paired_punctuation, uc);
+}
+
+const uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION =
+ { &uc_is_property_paired_punctuation };
diff --git a/gnulib/lib/unictype/pr_paired_punctuation.h b/gnulib/lib/unictype/pr_paired_punctuation.h
new file mode 100644
index 00000000..7723d322
--- /dev/null
+++ b/gnulib/lib/unictype/pr_paired_punctuation.h
@@ -0,0 +1,184 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_paired_punctuation =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112
+ },
+ {
+ 0x00000000, 0x00000300, 0x28000000, 0x28000000,
+ 0x00000000, 0x08000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x3C000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF000000, 0x06000000, 0x00000060, 0x60000000,
+ 0x00006000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000600, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xEFF3FF00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFE00000, 0x7E00001F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000300, 0x28000000, 0x28000000, 0x0000000C,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_paragraph_separator.c b/gnulib/lib/unictype/pr_paragraph_separator.c
new file mode 100644
index 00000000..dc7260dd
--- /dev/null
+++ b/gnulib/lib/unictype/pr_paragraph_separator.c
@@ -0,0 +1,55 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_paragraph_separator table. */
+#include "pr_paragraph_separator.h"
+
+bool
+uc_is_property_paragraph_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_paragraph_separator, uc);
+}
+
+#elif 0
+
+bool
+uc_is_property_paragraph_separator (ucs4_t uc)
+{
+ return uc_is_category_Zp (uc);
+}
+
+#else
+
+bool
+uc_is_property_paragraph_separator (ucs4_t uc)
+{
+ return (uc == 0x2029);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR =
+ { &uc_is_property_paragraph_separator };
diff --git a/gnulib/lib/unictype/pr_paragraph_separator.h b/gnulib/lib/unictype/pr_paragraph_separator.h
new file mode 100644
index 00000000..72c2a85e
--- /dev/null
+++ b/gnulib/lib/unictype/pr_paragraph_separator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_paragraph_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_pattern_syntax.c b/gnulib/lib/unictype/pr_pattern_syntax.c
new file mode 100644
index 00000000..bd46e3f1
--- /dev/null
+++ b/gnulib/lib/unictype/pr_pattern_syntax.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_pattern_syntax table. */
+#include "pr_pattern_syntax.h"
+
+bool
+uc_is_property_pattern_syntax (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_pattern_syntax, uc);
+}
+
+const uc_property_t UC_PROPERTY_PATTERN_SYNTAX =
+ { &uc_is_property_pattern_syntax };
diff --git a/gnulib/lib/unictype/pr_pattern_syntax.h b/gnulib/lib/unictype/pr_pattern_syntax.h
new file mode 100644
index 00000000..f3990657
--- /dev/null
+++ b/gnulib/lib/unictype/pr_pattern_syntax.h
@@ -0,0 +1,188 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_pattern_syntax =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128
+ },
+ {
+ 0x00000000, 0xFC00FFFE, 0x78000001, 0x78000001,
+ 0x00000000, 0x88435AFE, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0x7FFF00FF, 0x7FEFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFF00000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF0E, 0x00010001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000060, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_pattern_white_space.c b/gnulib/lib/unictype/pr_pattern_white_space.c
new file mode 100644
index 00000000..6c4465c8
--- /dev/null
+++ b/gnulib/lib/unictype/pr_pattern_white_space.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_pattern_white_space table. */
+#include "pr_pattern_white_space.h"
+
+bool
+uc_is_property_pattern_white_space (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_pattern_white_space, uc);
+}
+
+const uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE =
+ { &uc_is_property_pattern_white_space };
diff --git a/gnulib/lib/unictype/pr_pattern_white_space.h b/gnulib/lib/unictype/pr_pattern_white_space.h
new file mode 100644
index 00000000..559d08f6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_pattern_white_space.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_pattern_white_space =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003E00, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C000, 0x00000300, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_private_use.c b/gnulib/lib/unictype/pr_private_use.c
new file mode 100644
index 00000000..815ac9b6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_private_use.c
@@ -0,0 +1,49 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_private_use table. */
+#include "pr_private_use.h"
+
+bool
+uc_is_property_private_use (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_private_use, uc);
+}
+
+#else
+
+bool
+uc_is_property_private_use (ucs4_t uc)
+{
+ return (uc >= 0xE000 && uc <= 0xF8FF)
+ || (uc >= 0xF0000 && uc <= 0xFFFFD)
+ || (uc >= 0x100000 && uc <= 0x10FFFD);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_PRIVATE_USE =
+ { &uc_is_property_private_use };
diff --git a/gnulib/lib/unictype/pr_private_use.h b/gnulib/lib/unictype/pr_private_use.h
new file mode 100644
index 00000000..e18b60e2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_private_use.h
@@ -0,0 +1,310 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_property_private_use =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 32
+ },
+ {
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_punctuation.c b/gnulib/lib/unictype/pr_punctuation.c
new file mode 100644
index 00000000..39f0cfaf
--- /dev/null
+++ b/gnulib/lib/unictype/pr_punctuation.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_punctuation table. */
+#include "pr_punctuation.h"
+
+bool
+uc_is_property_punctuation (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_punctuation, uc);
+}
+
+#else
+
+bool
+uc_is_property_punctuation (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_P);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_PUNCTUATION =
+ { &uc_is_property_punctuation };
diff --git a/gnulib/lib/unictype/pr_punctuation.h b/gnulib/lib/unictype/pr_punctuation.h
new file mode 100644
index 00000000..cfa6649b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_punctuation.h
@@ -0,0 +1,403 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[30 << 4];
+ }
+u_property_punctuation =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x8C00F7EE, 0xB8000001, 0x28000000,
+ 0x00000000, 0x88800802, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x40000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000000,
+ 0x00000600, 0x40000000, 0x00000049, 0x00180000,
+ 0xC8003600, 0x00000000, 0x00000000, 0x00003C00,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100000,
+ 0x00000000, 0x00000000, 0x0C008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0007FFF0, 0x3C000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x001F0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FC00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000001FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x00000000, 0x00600000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07700000, 0x00000000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF8000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFF00FF, 0x7FFBFFEF, 0x60000000,
+ 0x00006000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000600, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x003FFF00,
+ 0x00000000, 0x00000000, 0x00000060, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01FFFFF8, 0x00000000, 0x0F000000, 0x30000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xDE000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00017FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFF3FF0E, 0x20010000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x40080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00F00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x00000000,
+ 0x00000000, 0x0000C000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xF0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0xFFFF0000, 0xFFF7FFFF, 0x00000D0B,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8C00F7EE, 0xB8000001, 0xA8000000, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x01FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_quotation_mark.c b/gnulib/lib/unictype/pr_quotation_mark.c
new file mode 100644
index 00000000..13e3239a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_quotation_mark.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_quotation_mark table. */
+#include "pr_quotation_mark.h"
+
+bool
+uc_is_property_quotation_mark (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_quotation_mark, uc);
+}
+
+const uc_property_t UC_PROPERTY_QUOTATION_MARK =
+ { &uc_is_property_quotation_mark };
diff --git a/gnulib/lib/unictype/pr_quotation_mark.h b/gnulib/lib/unictype/pr_quotation_mark.h
new file mode 100644
index 00000000..e334761b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_quotation_mark.h
@@ -0,0 +1,168 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[4 << 4];
+ }
+u_property_quotation_mark =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48
+ },
+ {
+ 0x00000000, 0x00000084, 0x00000000, 0x00000000,
+ 0x00000000, 0x08000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF000000, 0x06000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xE000F000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001E, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000084, 0x00000000, 0x00000000, 0x0000000C,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_radical.c b/gnulib/lib/unictype/pr_radical.c
new file mode 100644
index 00000000..3d82389c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_radical.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_radical table. */
+#include "pr_radical.h"
+
+bool
+uc_is_property_radical (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_radical, uc);
+}
+
+const uc_property_t UC_PROPERTY_RADICAL =
+ { &uc_is_property_radical };
diff --git a/gnulib/lib/unictype/pr_radical.h b/gnulib/lib/unictype/pr_radical.h
new file mode 100644
index 00000000..e4b54c1d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_radical.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_radical =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_sentence_terminal.c b/gnulib/lib/unictype/pr_sentence_terminal.c
new file mode 100644
index 00000000..81a94da9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_sentence_terminal.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_sentence_terminal table. */
+#include "pr_sentence_terminal.h"
+
+bool
+uc_is_property_sentence_terminal (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_sentence_terminal, uc);
+}
+
+const uc_property_t UC_PROPERTY_SENTENCE_TERMINAL =
+ { &uc_is_property_sentence_terminal };
diff --git a/gnulib/lib/unictype/pr_sentence_terminal.h b/gnulib/lib/unictype/pr_sentence_terminal.h
new file mode 100644
index 00000000..fd5bfbfa
--- /dev/null
+++ b/gnulib/lib/unictype/pr_sentence_terminal.h
@@ -0,0 +1,220 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[17 << 4];
+ }
+u_property_sentence_terminal =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 176,
+ 2 + 128 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 208,
+ 2 + 128 * sizeof (short) / sizeof (int) + 224,
+ 2 + 128 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 256
+ },
+ {
+ 0x00000000, 0x80004002, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x50000000, 0x00000000,
+ 0x00000200, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x00000007, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000C00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000184,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00004000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000208, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xCC000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x18000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x30000000, 0x00000380, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00004000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00C00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00C40000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80004002, 0x00000000, 0x00000000, 0x00000002,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_soft_dotted.c b/gnulib/lib/unictype/pr_soft_dotted.c
new file mode 100644
index 00000000..b4a5c8ba
--- /dev/null
+++ b/gnulib/lib/unictype/pr_soft_dotted.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_soft_dotted table. */
+#include "pr_soft_dotted.h"
+
+bool
+uc_is_property_soft_dotted (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_soft_dotted, uc);
+}
+
+const uc_property_t UC_PROPERTY_SOFT_DOTTED =
+ { &uc_is_property_soft_dotted };
diff --git a/gnulib/lib/unictype/pr_soft_dotted.h b/gnulib/lib/unictype/pr_soft_dotted.h
new file mode 100644
index 00000000..63423710
--- /dev/null
+++ b/gnulib/lib/unictype/pr_soft_dotted.h
@@ -0,0 +1,319 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_soft_dotted =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000600,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000200, 0x00000100,
+ 0x20000000, 0x00040000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00080000,
+ 0x00000000, 0x00000000, 0x01400000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000004,
+ 0x00400000, 0x00000110, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000300, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000C, 0x00C00000, 0x00000000,
+ 0x00000C00, 0xC0000000, 0x00000000, 0x000C0000,
+ 0x00000000, 0x000000C0, 0x0C000000, 0x00000000,
+ 0x0000C000, 0x00000000, 0x0000000C, 0x00C00000,
+ 0x00000000, 0x00000C00, 0xC0000000, 0x00000000,
+ 0x000C0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_space.c b/gnulib/lib/unictype/pr_space.c
new file mode 100644
index 00000000..b34b366f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_space.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_space table. */
+#include "pr_space.h"
+
+bool
+uc_is_property_space (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_space, uc);
+}
+
+#else
+
+bool
+uc_is_property_space (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Zs);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_SPACE =
+ { &uc_is_property_space };
diff --git a/gnulib/lib/unictype/pr_space.h b/gnulib/lib/unictype/pr_space.h
new file mode 100644
index 00000000..b86a6a49
--- /dev/null
+++ b/gnulib/lib/unictype/pr_space.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_space =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00008000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_terminal_punctuation.c b/gnulib/lib/unictype/pr_terminal_punctuation.c
new file mode 100644
index 00000000..5843a347
--- /dev/null
+++ b/gnulib/lib/unictype/pr_terminal_punctuation.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_terminal_punctuation table. */
+#include "pr_terminal_punctuation.h"
+
+bool
+uc_is_property_terminal_punctuation (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_terminal_punctuation, uc);
+}
+
+const uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION =
+ { &uc_is_property_terminal_punctuation };
diff --git a/gnulib/lib/unictype/pr_terminal_punctuation.h b/gnulib/lib/unictype/pr_terminal_punctuation.h
new file mode 100644
index 00000000..d6cd379e
--- /dev/null
+++ b/gnulib/lib/unictype/pr_terminal_punctuation.h
@@ -0,0 +1,371 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[22 << 4];
+ }
+u_property_terminal_punctuation =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x8C005002, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x40000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000200, 0x00000000, 0x00000008, 0x00000000,
+ 0x88001000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x000017FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0C000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0007E100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000C00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000001FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x04700000, 0x00000000,
+ 0x0000033C, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xEC000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF8000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x30000000, 0x00000380, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00004000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000006, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00C00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00F70000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8C005002, 0x00000000, 0x00000000, 0x00000012,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_test.c b/gnulib/lib/unictype/pr_test.c
new file mode 100644
index 00000000..e1068394
--- /dev/null
+++ b/gnulib/lib/unictype/pr_test.c
@@ -0,0 +1,27 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_property (ucs4_t uc, uc_property_t property)
+{
+ return property.test_fn (uc);
+}
diff --git a/gnulib/lib/unictype/pr_titlecase.c b/gnulib/lib/unictype/pr_titlecase.c
new file mode 100644
index 00000000..93a6a886
--- /dev/null
+++ b/gnulib/lib/unictype/pr_titlecase.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_titlecase table. */
+#include "pr_titlecase.h"
+
+bool
+uc_is_property_titlecase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_titlecase, uc);
+}
+
+#else
+
+bool
+uc_is_property_titlecase (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Lt);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_TITLECASE =
+ { &uc_is_property_titlecase };
diff --git a/gnulib/lib/unictype/pr_titlecase.h b/gnulib/lib/unictype/pr_titlecase.h
new file mode 100644
index 00000000..35dc74ef
--- /dev/null
+++ b/gnulib/lib/unictype/pr_titlecase.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_titlecase =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000920, 0x00040000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF00FF00, 0x1000FF00, 0x00001000, 0x10000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_unassigned_code_value.c b/gnulib/lib/unictype/pr_unassigned_code_value.c
new file mode 100644
index 00000000..b7baf1b2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_unassigned_code_value.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_unassigned_code_value table. */
+#include "pr_unassigned_code_value.h"
+
+bool
+uc_is_property_unassigned_code_value (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_unassigned_code_value, uc);
+}
+
+const uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE =
+ { &uc_is_property_unassigned_code_value };
diff --git a/gnulib/lib/unictype/pr_unassigned_code_value.h b/gnulib/lib/unictype/pr_unassigned_code_value.h
new file mode 100644
index 00000000..5b12cf6d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_unassigned_code_value.h
@@ -0,0 +1,884 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[5 << 7];
+ /*unsigned*/ int level3[51 << 4];
+ }
+u_property_unassigned_code_value =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ 16 * sizeof (int) / sizeof (short) + 256,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 512
+ },
+ {
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 0,
+ 16 + 640 * sizeof (short) / sizeof (int) + 16,
+ 16 + 640 * sizeof (short) / sizeof (int) + 32,
+ 16 + 640 * sizeof (short) / sizeof (int) + 48,
+ 16 + 640 * sizeof (short) / sizeof (int) + 64,
+ 16 + 640 * sizeof (short) / sizeof (int) + 80,
+ 16 + 640 * sizeof (short) / sizeof (int) + 96,
+ 16 + 640 * sizeof (short) / sizeof (int) + 112,
+ 16 + 640 * sizeof (short) / sizeof (int) + 128,
+ 16 + 640 * sizeof (short) / sizeof (int) + 144,
+ 16 + 640 * sizeof (short) / sizeof (int) + 160,
+ 16 + 640 * sizeof (short) / sizeof (int) + 176,
+ 16 + 640 * sizeof (short) / sizeof (int) + 192,
+ 16 + 640 * sizeof (short) / sizeof (int) + 208,
+ 16 + 640 * sizeof (short) / sizeof (int) + 224,
+ 16 + 640 * sizeof (short) / sizeof (int) + 240,
+ 16 + 640 * sizeof (short) / sizeof (int) + 256,
+ 16 + 640 * sizeof (short) / sizeof (int) + 272,
+ 16 + 640 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 304,
+ 16 + 640 * sizeof (short) / sizeof (int) + 320,
+ 16 + 640 * sizeof (short) / sizeof (int) + 336,
+ 16 + 640 * sizeof (short) / sizeof (int) + 352,
+ 16 + 640 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 416,
+ 16 + 640 * sizeof (short) / sizeof (int) + 432,
+ 16 + 640 * sizeof (short) / sizeof (int) + 448,
+ 16 + 640 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 496,
+ 16 + 640 * sizeof (short) / sizeof (int) + 512,
+ 16 + 640 * sizeof (short) / sizeof (int) + 528,
+ 16 + 640 * sizeof (short) / sizeof (int) + 544,
+ 16 + 640 * sizeof (short) / sizeof (int) + 560,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 608,
+ 16 + 640 * sizeof (short) / sizeof (int) + 624,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 640,
+ 16 + 640 * sizeof (short) / sizeof (int) + 656,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 672,
+ 16 + 640 * sizeof (short) / sizeof (int) + 688,
+ 16 + 640 * sizeof (short) / sizeof (int) + 704,
+ 16 + 640 * sizeof (short) / sizeof (int) + 720,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 736,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 768,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 784,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 752,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 752,
+ 16 + 640 * sizeof (short) / sizeof (int) + 800,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 752
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x83000000,
+ 0x0000280F, 0x00000004, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0001FFF0, 0x01800000, 0x00000001,
+ 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800,
+ 0x30000030, 0x00000001, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00001800, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000001, 0x0C000000, 0x00E0C000, 0x07F80000,
+ 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF8000030,
+ 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F,
+ 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030,
+ 0x00066011, 0x0C120200, 0x4F3FC660, 0xFFFC0030,
+ 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F,
+ 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030,
+ 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030,
+ 0x00022013, 0x1C000200, 0xFF7FC220, 0x01C00030,
+ 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF,
+ 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF,
+ 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000100, 0x0001E000,
+ 0x0100F000, 0x20000000, 0xFFE02000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3C000000, 0x00000000, 0x0000FFC0, 0xE0000000,
+ 0x00000000, 0x00000000, 0x7C000000, 0x00000000,
+ 0x00000000, 0x000000F8, 0x00000000, 0xFC000000,
+ 0x00000000, 0x00000000, 0xC280C200, 0x00000000,
+ 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000,
+ 0x00C20000, 0x00000000, 0x78000000, 0xE0000000,
+ 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFF800000,
+ 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000,
+ 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFC00FC00,
+ 0xFC008000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0xFFFFF800, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000,
+ 0x00000000, 0x0000FC00, 0x3C00FC00, 0x00000000,
+ 0x30000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0000F000, 0xE0000000,
+ 0x00000000, 0xFC003800, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x07000000, 0x00001C00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x3FFFFF80,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000,
+ 0x00000000, 0x00200000, 0x10300020, 0x80230000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C03E0,
+ 0xFFE08000, 0xFFC00000, 0x0000FFFF, 0xFFFE0000,
+ 0x00000000, 0x00000000, 0x00070000, 0x00000000,
+ 0x0000FE00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFF00,
+ 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xE0000000, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0x00000C21, 0x00000100, 0x80B85000, 0x00000001,
+ 0x00E00000, 0x80010000, 0x0000E800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFE0E000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x80000000, 0xC0010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x01FFF800,
+ 0x00000000, 0x0000FFC0, 0x00000000, 0xFFFF7FC0,
+ 0xFF800000, 0x80808080, 0x80808080, 0x00000000,
+ 0x00000000, 0xFFFE0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x04000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0xF000FFFF,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0x0001C000, 0x00000000, 0x00000000,
+ 0x00008000, 0xFF000000, 0x00000000, 0x0000FFF0,
+ 0x80000000, 0x00000000, 0x0000FFF0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0xFFFFFF80, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00003,
+ 0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFE000, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0xFC003FE0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x7FF00000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFF800000, 0x0C00C000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFF0, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x0000C000, 0x00000000, 0x0000F800,
+ 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF,
+ 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x0007FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFFF, 0x00000000,
+ 0x00030000, 0x00000000, 0x0000FF00, 0xC0000000,
+ 0xFC000000, 0x0000FF80, 0x00080000, 0x0020F080,
+ 0x00000000, 0x00000000, 0x00000000, 0x60000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0xE3030303, 0x01FF8080,
+ 0x00001000, 0x48000080, 0xC000C000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x00000078, 0x00700000, 0x00000000, 0x00000000,
+ 0xF000F800, 0xFFFFFFFF, 0x0000FFFF, 0xC0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0x00000000, 0xFFFE0000, 0xFFFFFFFF,
+ 0x80000000, 0x0000FFF0, 0xFFFFF800, 0xFFFFFFFF,
+ 0x40000000, 0x00000000, 0xFFC000F0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFC00, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000002C0, 0x6E400000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x7C000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x01100F90, 0x78F00000, 0xFE00FF00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF8000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF0FFF8,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x00000000, 0x00000180, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFC0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00200000, 0x00000000,
+ 0x20000000, 0x1400219B, 0x00000010, 0x00000000,
+ 0x20201840, 0x84000000, 0x000203A0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000000C0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003000, 0x00000000,
+ 0x00000000, 0x0000F000, 0x00000000, 0x00000000,
+ 0xFFF00000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xC0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFD, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_unified_ideograph.c b/gnulib/lib/unictype/pr_unified_ideograph.c
new file mode 100644
index 00000000..b08494ff
--- /dev/null
+++ b/gnulib/lib/unictype/pr_unified_ideograph.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_unified_ideograph table. */
+#include "pr_unified_ideograph.h"
+
+bool
+uc_is_property_unified_ideograph (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_unified_ideograph, uc);
+}
+
+const uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH =
+ { &uc_is_property_unified_ideograph };
diff --git a/gnulib/lib/unictype/pr_unified_ideograph.h b/gnulib/lib/unictype/pr_unified_ideograph.h
new file mode 100644
index 00000000..353ee4f0
--- /dev/null
+++ b/gnulib/lib/unictype/pr_unified_ideograph.h
@@ -0,0 +1,304 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_unified_ideograph =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ 4 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0x801AC000, 0x0000039A, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_uppercase.c b/gnulib/lib/unictype/pr_uppercase.c
new file mode 100644
index 00000000..d373393a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_uppercase.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_uppercase table. */
+#include "pr_uppercase.h"
+
+bool
+uc_is_property_uppercase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_uppercase, uc);
+}
+
+const uc_property_t UC_PROPERTY_UPPERCASE =
+ { &uc_is_property_uppercase };
diff --git a/gnulib/lib/unictype/pr_uppercase.h b/gnulib/lib/unictype/pr_uppercase.h
new file mode 100644
index 00000000..14b2bde3
--- /dev/null
+++ b/gnulib/lib/unictype/pr_uppercase.h
@@ -0,0 +1,335 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_property_uppercase =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x7F7FFFFF, 0x00000000,
+ 0x55555555, 0xAA555555, 0x555554AA, 0x2B555555,
+ 0xB1DBCED6, 0x11AED2D5, 0x4AAAA490, 0x55D25555,
+ 0x55555555, 0x6C055555, 0x0000557A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00450000,
+ 0xFFFED740, 0x00000FFB, 0x551C8000, 0xE6905555,
+ 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555,
+ 0x55555401, 0x55555555, 0x55552AAB, 0x55555555,
+ 0x55555555, 0xFFFE0005, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x55555555, 0x55555555, 0x55555555, 0x55555555,
+ 0x40155555, 0x55555555, 0x55555555, 0x55555555,
+ 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00,
+ 0x00000000, 0x0F000000, 0x0F000F00, 0x0F001F00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E273884, 0xC00F3D50, 0x00000020, 0x0000FFFF,
+ 0x00000008, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x0024EA9D,
+ 0x55555555, 0x55555555, 0x55555555, 0x00000005,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555555, 0x00001554,
+ 0x00555555, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55545554, 0x55555555, 0x6A005555,
+ 0x00000855, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000000FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FFFFFF, 0xFFF00000, 0x00003FFF, 0xFFFFFF00,
+ 0xD0000003, 0x003FDE64, 0xFFFF0000, 0x000003FF,
+ 0x1FDFE7B0, 0x7B000000, 0x0001FC5F, 0xFFFFF000,
+ 0x0000003F, 0x03FFFFFF, 0xFFF00000, 0x00003FFF,
+ 0xFFFFFF00, 0xF0000003, 0x003FFFFF, 0xFFFF0000,
+ 0x000003FF, 0xFFFFFF00, 0x00000001, 0x07FFFFFC,
+ 0xF0000000, 0x001FFFFF, 0xFFC00000, 0x00007FFF,
+ 0xFFFF0000, 0x000001FF, 0x00000400, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_variation_selector.c b/gnulib/lib/unictype/pr_variation_selector.c
new file mode 100644
index 00000000..d7604d6d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_variation_selector.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_variation_selector table. */
+#include "pr_variation_selector.h"
+
+bool
+uc_is_property_variation_selector (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_variation_selector, uc);
+}
+
+const uc_property_t UC_PROPERTY_VARIATION_SELECTOR =
+ { &uc_is_property_variation_selector };
diff --git a/gnulib/lib/unictype/pr_variation_selector.h b/gnulib/lib/unictype/pr_variation_selector.h
new file mode 100644
index 00000000..ba644eb6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_variation_selector.h
@@ -0,0 +1,308 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_property_variation_selector =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 16,
+ 16 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_white_space.c b/gnulib/lib/unictype/pr_white_space.c
new file mode 100644
index 00000000..18dc4ec2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_white_space.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_white_space table. */
+#include "pr_white_space.h"
+
+bool
+uc_is_property_white_space (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_white_space, uc);
+}
+
+const uc_property_t UC_PROPERTY_WHITE_SPACE =
+ { &uc_is_property_white_space };
diff --git a/gnulib/lib/unictype/pr_white_space.h b/gnulib/lib/unictype/pr_white_space.h
new file mode 100644
index 00000000..519b35a3
--- /dev/null
+++ b/gnulib/lib/unictype/pr_white_space.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_white_space =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003E00, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00008300, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_xid_continue.c b/gnulib/lib/unictype/pr_xid_continue.c
new file mode 100644
index 00000000..67faae13
--- /dev/null
+++ b/gnulib/lib/unictype/pr_xid_continue.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_xid_continue table. */
+#include "pr_xid_continue.h"
+
+bool
+uc_is_property_xid_continue (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_xid_continue, uc);
+}
+
+const uc_property_t UC_PROPERTY_XID_CONTINUE =
+ { &uc_is_property_xid_continue };
diff --git a/gnulib/lib/unictype/pr_xid_continue.h b/gnulib/lib/unictype/pr_xid_continue.h
new file mode 100644
index 00000000..79913a78
--- /dev/null
+++ b/gnulib/lib/unictype/pr_xid_continue.h
@@ -0,0 +1,732 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[45 << 4];
+ }
+u_property_xid_continue =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ 16 * sizeof (int) / sizeof (short) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 384
+ },
+ {
+ 16 + 512 * sizeof (short) / sizeof (int) + 0,
+ 16 + 512 * sizeof (short) / sizeof (int) + 16,
+ 16 + 512 * sizeof (short) / sizeof (int) + 32,
+ 16 + 512 * sizeof (short) / sizeof (int) + 48,
+ 16 + 512 * sizeof (short) / sizeof (int) + 64,
+ 16 + 512 * sizeof (short) / sizeof (int) + 80,
+ 16 + 512 * sizeof (short) / sizeof (int) + 96,
+ 16 + 512 * sizeof (short) / sizeof (int) + 112,
+ 16 + 512 * sizeof (short) / sizeof (int) + 128,
+ 16 + 512 * sizeof (short) / sizeof (int) + 144,
+ 16 + 512 * sizeof (short) / sizeof (int) + 160,
+ 16 + 512 * sizeof (short) / sizeof (int) + 176,
+ 16 + 512 * sizeof (short) / sizeof (int) + 192,
+ 16 + 512 * sizeof (short) / sizeof (int) + 208,
+ 16 + 512 * sizeof (short) / sizeof (int) + 224,
+ 16 + 512 * sizeof (short) / sizeof (int) + 240,
+ 16 + 512 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 320,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 336,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 352,
+ 16 + 512 * sizeof (short) / sizeof (int) + 368,
+ 16 + 512 * sizeof (short) / sizeof (int) + 384,
+ 16 + 512 * sizeof (short) / sizeof (int) + 400,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 432,
+ 16 + 512 * sizeof (short) / sizeof (int) + 448,
+ 16 + 512 * sizeof (short) / sizeof (int) + 464,
+ 16 + 512 * sizeof (short) / sizeof (int) + 480,
+ 16 + 512 * sizeof (short) / sizeof (int) + 496,
+ 16 + 512 * sizeof (short) / sizeof (int) + 512,
+ 16 + 512 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 544,
+ 16 + 512 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 576,
+ 16 + 512 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 608,
+ 16 + 512 * sizeof (short) / sizeof (int) + 624,
+ 16 + 512 * sizeof (short) / sizeof (int) + 640,
+ 16 + 512 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x87FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04A00400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x38DFFFFF,
+ 0xFFFFD7C0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFCFB, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x027FFFFF, 0xFFFFFFFE,
+ 0xFFFE00FF, 0xBFFFFFFF, 0xFFFF00B6, 0x000707FF,
+ 0x07FF0000, 0xFFFFFFFE, 0x7FFFFFFF, 0xFFFFC3FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x9FEFFFFF, 0x9FFFFDFF,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x043FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFE, 0xF3FFFFFF, 0xFF1F3FFF, 0xF806FFCF,
+ 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x0003FFCF,
+ 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0,
+ 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0000FFCF,
+ 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x0002FFCF,
+ 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x0000FFC0,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0x0000FFCF,
+ 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0000FFCF,
+ 0xFFFDDFEC, 0xE3FFFDFF, 0x00803DDF, 0xFC00FFCF,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x000C0000,
+ 0xFFFFFFFE, 0x07FFFFFF, 0x03FF7FFF, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000,
+ 0x03000001, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFF0FDF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF03FF, 0xFFFFFFFF,
+ 0x03FFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x87FFFFFF, 0x0003FE00,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x001FDFFF, 0x001FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFCFFFFF, 0x308FFFFF, 0x000003FF,
+ 0x03FF3800, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000007FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFC0, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF03FF, 0x03FF03FF, 0x00000000,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF0FFF, 0x000FF800,
+ 0xFFFFFFFF, 0x03FFC7FF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFE3FF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xC000007F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x80000000, 0x00100001, 0x80020000,
+ 0x001F0000, 0x00000000, 0x1FFF0000, 0x0001FFE2,
+ 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0x000000E0, 0x1F3EFFFE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE67FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0xB000FFFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000019FF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFFFFF, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF001F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0x000FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0x03FF3FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFF0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x03FF0000,
+ 0x0000FFFF, 0x0018007F, 0x0000E000, 0xAA8A0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x03FF0000, 0x87FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x870FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E3E0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_xid_start.c b/gnulib/lib/unictype/pr_xid_start.c
new file mode 100644
index 00000000..b9b496f7
--- /dev/null
+++ b/gnulib/lib/unictype/pr_xid_start.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_xid_start table. */
+#include "pr_xid_start.h"
+
+bool
+uc_is_property_xid_start (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_xid_start, uc);
+}
+
+const uc_property_t UC_PROPERTY_XID_START =
+ { &uc_is_property_xid_start };
diff --git a/gnulib/lib/unictype/pr_xid_start.h b/gnulib/lib/unictype/pr_xid_start.h
new file mode 100644
index 00000000..97fc7107
--- /dev/null
+++ b/gnulib/lib/unictype/pr_xid_start.h
@@ -0,0 +1,580 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[42 << 4];
+ }
+u_property_xid_start =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000000, 0x38DF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE000F, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFE, 0x000007FF, 0xFFFEC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xF8060003,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x00030003,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x00000003,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x00020003,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x00000000,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x00000003,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x00000003,
+ 0xFFFDDFE0, 0x23FFFDFF, 0x00000000, 0xFC000003,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x0005FFFF, 0x0000007F, 0x00000000,
+ 0xFEF02596, 0x2005ECAE, 0x3000005F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF,
+ 0x00000F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062,
+ 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x83FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF07, 0xFFFFFFFF, 0x03FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x007F9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0x000005FF, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0x000003FF, 0x000000FE, 0x00000000,
+ 0x007FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000,
+ 0xFFFFFFF8, 0x0000C001, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0x3FFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000001F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFC,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000019FF, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF07FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFF0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xAA8A0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0x3FFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_zero_width.c b/gnulib/lib/unictype/pr_zero_width.c
new file mode 100644
index 00000000..903e0039
--- /dev/null
+++ b/gnulib/lib/unictype/pr_zero_width.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_zero_width table. */
+#include "pr_zero_width.h"
+
+bool
+uc_is_property_zero_width (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_zero_width, uc);
+}
+
+const uc_property_t UC_PROPERTY_ZERO_WIDTH =
+ { &uc_is_property_zero_width };
diff --git a/gnulib/lib/unictype/pr_zero_width.h b/gnulib/lib/unictype/pr_zero_width.h
new file mode 100644
index 00000000..96047b53
--- /dev/null
+++ b/gnulib/lib/unictype/pr_zero_width.h
@@ -0,0 +1,452 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_zero_width =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300000, 0x00000000, 0x00000000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0E000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/scripts.c b/gnulib/lib/unictype/scripts.c
new file mode 100644
index 00000000..822c3c56
--- /dev/null
+++ b/gnulib/lib/unictype/scripts.c
@@ -0,0 +1,75 @@
+/* Scripts of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <string.h>
+
+#include "scripts.h"
+#include "unictype/scripts_byname.h"
+
+const uc_script_t *
+uc_script (ucs4_t uc)
+{
+ unsigned int index1 = uc >> script_header_0;
+ if (index1 < script_header_1)
+ {
+ int lookup1 = u_script.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> script_header_2) & script_header_3;
+ int lookup2 = u_script.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & script_header_4);
+ unsigned char lookup3 = u_script.level3[lookup2 + index3];
+
+ if (lookup3 != 0xff)
+ return &scripts[lookup3];
+ }
+ }
+ }
+ return NULL;
+}
+
+const uc_script_t *
+uc_script_byname (const char *script_name)
+{
+ const struct named_script *found;
+
+ found = uc_script_lookup (script_name, strlen (script_name));
+ if (found != NULL)
+ return &scripts[found->index];
+ else
+ return NULL;
+}
+
+bool
+uc_is_script (ucs4_t uc, const uc_script_t *script)
+{
+ return uc_script (uc) == script;
+}
+
+void
+uc_all_scripts (const uc_script_t **scriptsp, size_t *countp)
+{
+ *scriptsp = scripts;
+ *countp = sizeof (scripts) / sizeof (scripts[0]);
+}
diff --git a/gnulib/lib/unictype/scripts.h b/gnulib/lib/unictype/scripts.h
new file mode 100644
index 00000000..1d465aee
--- /dev/null
+++ b/gnulib/lib/unictype/scripts.h
@@ -0,0 +1,3704 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Unicode scripts. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+static const uc_interval_t script_common_intervals[] =
+{
+ { 0x0000, 1, 0 }, { 0x0040, 0, 1 },
+ { 0x005B, 1, 0 }, { 0x0060, 0, 1 },
+ { 0x007B, 1, 0 }, { 0x00A9, 0, 1 },
+ { 0x00AB, 1, 0 }, { 0x00B9, 0, 1 },
+ { 0x00BB, 1, 0 }, { 0x00BF, 0, 1 },
+ { 0x00D7, 1, 1 },
+ { 0x00F7, 1, 1 },
+ { 0x02B9, 1, 0 }, { 0x02DF, 0, 1 },
+ { 0x02E5, 1, 0 }, { 0x02FF, 0, 1 },
+ { 0x0374, 1, 1 },
+ { 0x037E, 1, 1 },
+ { 0x0385, 1, 1 },
+ { 0x0387, 1, 1 },
+ { 0x0589, 1, 1 },
+ { 0x0600, 1, 0 }, { 0x0603, 0, 1 },
+ { 0x060C, 1, 1 },
+ { 0x061B, 1, 1 },
+ { 0x061F, 1, 1 },
+ { 0x0640, 1, 1 },
+ { 0x0660, 1, 0 }, { 0x0669, 0, 1 },
+ { 0x06DD, 1, 1 },
+ { 0x0964, 1, 0 }, { 0x0965, 0, 1 },
+ { 0x0970, 1, 1 },
+ { 0x0CF1, 1, 0 }, { 0x0CF2, 0, 1 },
+ { 0x0E3F, 1, 1 },
+ { 0x10FB, 1, 1 },
+ { 0x16EB, 1, 0 }, { 0x16ED, 0, 1 },
+ { 0x1735, 1, 0 }, { 0x1736, 0, 1 },
+ { 0x1802, 1, 0 }, { 0x1803, 0, 1 },
+ { 0x1805, 1, 1 },
+ { 0x2000, 1, 0 }, { 0x200B, 0, 1 },
+ { 0x200E, 1, 0 }, { 0x2064, 0, 1 },
+ { 0x206A, 1, 0 }, { 0x2070, 0, 1 },
+ { 0x2074, 1, 0 }, { 0x207E, 0, 1 },
+ { 0x2080, 1, 0 }, { 0x208E, 0, 1 },
+ { 0x20A0, 1, 0 }, { 0x20B5, 0, 1 },
+ { 0x2100, 1, 0 }, { 0x2125, 0, 1 },
+ { 0x2127, 1, 0 }, { 0x2129, 0, 1 },
+ { 0x212C, 1, 0 }, { 0x2131, 0, 1 },
+ { 0x2133, 1, 0 }, { 0x214D, 0, 1 },
+ { 0x214F, 1, 1 },
+ { 0x2153, 1, 0 }, { 0x215F, 0, 1 },
+ { 0x2190, 1, 0 }, { 0x23E7, 0, 1 },
+ { 0x2400, 1, 0 }, { 0x2426, 0, 1 },
+ { 0x2440, 1, 0 }, { 0x244A, 0, 1 },
+ { 0x2460, 1, 0 }, { 0x269D, 0, 1 },
+ { 0x26A0, 1, 0 }, { 0x26BC, 0, 1 },
+ { 0x26C0, 1, 0 }, { 0x26C3, 0, 1 },
+ { 0x2701, 1, 0 }, { 0x2704, 0, 1 },
+ { 0x2706, 1, 0 }, { 0x2709, 0, 1 },
+ { 0x270C, 1, 0 }, { 0x2727, 0, 1 },
+ { 0x2729, 1, 0 }, { 0x274B, 0, 1 },
+ { 0x274D, 1, 1 },
+ { 0x274F, 1, 0 }, { 0x2752, 0, 1 },
+ { 0x2756, 1, 1 },
+ { 0x2758, 1, 0 }, { 0x275E, 0, 1 },
+ { 0x2761, 1, 0 }, { 0x2794, 0, 1 },
+ { 0x2798, 1, 0 }, { 0x27AF, 0, 1 },
+ { 0x27B1, 1, 0 }, { 0x27BE, 0, 1 },
+ { 0x27C0, 1, 0 }, { 0x27CA, 0, 1 },
+ { 0x27CC, 1, 1 },
+ { 0x27D0, 1, 0 }, { 0x27FF, 0, 1 },
+ { 0x2900, 1, 0 }, { 0x2B4C, 0, 1 },
+ { 0x2B50, 1, 0 }, { 0x2B54, 0, 1 },
+ { 0x2E00, 1, 0 }, { 0x2E30, 0, 1 },
+ { 0x2FF0, 1, 0 }, { 0x2FFB, 0, 1 },
+ { 0x3000, 1, 0 }, { 0x3004, 0, 1 },
+ { 0x3006, 1, 1 },
+ { 0x3008, 1, 0 }, { 0x3020, 0, 1 },
+ { 0x3030, 1, 0 }, { 0x3037, 0, 1 },
+ { 0x303C, 1, 0 }, { 0x303F, 0, 1 },
+ { 0x309B, 1, 0 }, { 0x309C, 0, 1 },
+ { 0x30A0, 1, 1 },
+ { 0x30FB, 1, 0 }, { 0x30FC, 0, 1 },
+ { 0x3190, 1, 0 }, { 0x319F, 0, 1 },
+ { 0x31C0, 1, 0 }, { 0x31E3, 0, 1 },
+ { 0x3220, 1, 0 }, { 0x3243, 0, 1 },
+ { 0x3250, 1, 0 }, { 0x325F, 0, 1 },
+ { 0x327F, 1, 0 }, { 0x32CF, 0, 1 },
+ { 0x3358, 1, 0 }, { 0x33FF, 0, 1 },
+ { 0x4DC0, 1, 0 }, { 0x4DFF, 0, 1 },
+ { 0xA700, 1, 0 }, { 0xA721, 0, 1 },
+ { 0xA788, 1, 0 }, { 0xA78A, 0, 1 },
+ { 0xFD3E, 1, 0 }, { 0xFD3F, 0, 1 },
+ { 0xFDFD, 1, 1 },
+ { 0xFE10, 1, 0 }, { 0xFE19, 0, 1 },
+ { 0xFE30, 1, 0 }, { 0xFE52, 0, 1 },
+ { 0xFE54, 1, 0 }, { 0xFE66, 0, 1 },
+ { 0xFE68, 1, 0 }, { 0xFE6B, 0, 1 },
+ { 0xFEFF, 1, 1 },
+ { 0xFF01, 1, 0 }, { 0xFF20, 0, 1 },
+ { 0xFF3B, 1, 0 }, { 0xFF40, 0, 1 },
+ { 0xFF5B, 1, 0 }, { 0xFF65, 0, 1 },
+ { 0xFF70, 1, 1 },
+ { 0xFF9E, 1, 0 }, { 0xFF9F, 0, 1 },
+ { 0xFFE0, 1, 0 }, { 0xFFE6, 0, 1 },
+ { 0xFFE8, 1, 0 }, { 0xFFEE, 0, 1 },
+ { 0xFFF9, 1, 0 }, { 0xFFFD, 0, 1 },
+ { 0x10100, 1, 0 }, { 0x10102, 0, 1 },
+ { 0x10107, 1, 0 }, { 0x10133, 0, 1 },
+ { 0x10137, 1, 0 }, { 0x1013F, 0, 1 },
+ { 0x10190, 1, 0 }, { 0x1019B, 0, 1 },
+ { 0x101D0, 1, 0 }, { 0x101FC, 0, 1 },
+ { 0x1D000, 1, 0 }, { 0x1D0F5, 0, 1 },
+ { 0x1D100, 1, 0 }, { 0x1D126, 0, 1 },
+ { 0x1D129, 1, 0 }, { 0x1D166, 0, 1 },
+ { 0x1D16A, 1, 0 }, { 0x1D17A, 0, 1 },
+ { 0x1D183, 1, 0 }, { 0x1D184, 0, 1 },
+ { 0x1D18C, 1, 0 }, { 0x1D1A9, 0, 1 },
+ { 0x1D1AE, 1, 0 }, { 0x1D1DD, 0, 1 },
+ { 0x1D300, 1, 0 }, { 0x1D356, 0, 1 },
+ { 0x1D360, 1, 0 }, { 0x1D371, 0, 1 },
+ { 0x1D400, 1, 0 }, { 0x1D454, 0, 1 },
+ { 0x1D456, 1, 0 }, { 0x1D49C, 0, 1 },
+ { 0x1D49E, 1, 0 }, { 0x1D49F, 0, 1 },
+ { 0x1D4A2, 1, 1 },
+ { 0x1D4A5, 1, 0 }, { 0x1D4A6, 0, 1 },
+ { 0x1D4A9, 1, 0 }, { 0x1D4AC, 0, 1 },
+ { 0x1D4AE, 1, 0 }, { 0x1D4B9, 0, 1 },
+ { 0x1D4BB, 1, 1 },
+ { 0x1D4BD, 1, 0 }, { 0x1D4C3, 0, 1 },
+ { 0x1D4C5, 1, 0 }, { 0x1D505, 0, 1 },
+ { 0x1D507, 1, 0 }, { 0x1D50A, 0, 1 },
+ { 0x1D50D, 1, 0 }, { 0x1D514, 0, 1 },
+ { 0x1D516, 1, 0 }, { 0x1D51C, 0, 1 },
+ { 0x1D51E, 1, 0 }, { 0x1D539, 0, 1 },
+ { 0x1D53B, 1, 0 }, { 0x1D53E, 0, 1 },
+ { 0x1D540, 1, 0 }, { 0x1D544, 0, 1 },
+ { 0x1D546, 1, 1 },
+ { 0x1D54A, 1, 0 }, { 0x1D550, 0, 1 },
+ { 0x1D552, 1, 0 }, { 0x1D6A5, 0, 1 },
+ { 0x1D6A8, 1, 0 }, { 0x1D7CB, 0, 1 },
+ { 0x1D7CE, 1, 0 }, { 0x1D7FF, 0, 1 },
+ { 0x1F000, 1, 0 }, { 0x1F02B, 0, 1 },
+ { 0x1F030, 1, 0 }, { 0x1F093, 0, 1 },
+ { 0xE0001, 1, 1 },
+ { 0xE0020, 1, 0 }, { 0xE007F, 0, 1 }
+};
+static const uc_interval_t script_latin_intervals[] =
+{
+ { 0x0041, 1, 0 }, { 0x005A, 0, 1 },
+ { 0x0061, 1, 0 }, { 0x007A, 0, 1 },
+ { 0x00AA, 1, 1 },
+ { 0x00BA, 1, 1 },
+ { 0x00C0, 1, 0 }, { 0x00D6, 0, 1 },
+ { 0x00D8, 1, 0 }, { 0x00F6, 0, 1 },
+ { 0x00F8, 1, 0 }, { 0x02B8, 0, 1 },
+ { 0x02E0, 1, 0 }, { 0x02E4, 0, 1 },
+ { 0x1D00, 1, 0 }, { 0x1D25, 0, 1 },
+ { 0x1D2C, 1, 0 }, { 0x1D5C, 0, 1 },
+ { 0x1D62, 1, 0 }, { 0x1D65, 0, 1 },
+ { 0x1D6B, 1, 0 }, { 0x1D77, 0, 1 },
+ { 0x1D79, 1, 0 }, { 0x1DBE, 0, 1 },
+ { 0x1E00, 1, 0 }, { 0x1EFF, 0, 1 },
+ { 0x2071, 1, 1 },
+ { 0x207F, 1, 1 },
+ { 0x2090, 1, 0 }, { 0x2094, 0, 1 },
+ { 0x212A, 1, 0 }, { 0x212B, 0, 1 },
+ { 0x2132, 1, 1 },
+ { 0x214E, 1, 1 },
+ { 0x2160, 1, 0 }, { 0x2188, 0, 1 },
+ { 0x2C60, 1, 0 }, { 0x2C6F, 0, 1 },
+ { 0x2C71, 1, 0 }, { 0x2C7D, 0, 1 },
+ { 0xA722, 1, 0 }, { 0xA787, 0, 1 },
+ { 0xA78B, 1, 0 }, { 0xA78C, 0, 1 },
+ { 0xA7FB, 1, 0 }, { 0xA7FF, 0, 1 },
+ { 0xFB00, 1, 0 }, { 0xFB06, 0, 1 },
+ { 0xFF21, 1, 0 }, { 0xFF3A, 0, 1 },
+ { 0xFF41, 1, 0 }, { 0xFF5A, 0, 1 }
+};
+static const uc_interval_t script_greek_intervals[] =
+{
+ { 0x0370, 1, 0 }, { 0x0373, 0, 1 },
+ { 0x0375, 1, 0 }, { 0x0377, 0, 1 },
+ { 0x037A, 1, 0 }, { 0x037D, 0, 1 },
+ { 0x0384, 1, 1 },
+ { 0x0386, 1, 1 },
+ { 0x0388, 1, 0 }, { 0x038A, 0, 1 },
+ { 0x038C, 1, 1 },
+ { 0x038E, 1, 0 }, { 0x03A1, 0, 1 },
+ { 0x03A3, 1, 0 }, { 0x03E1, 0, 1 },
+ { 0x03F0, 1, 0 }, { 0x03FF, 0, 1 },
+ { 0x1D26, 1, 0 }, { 0x1D2A, 0, 1 },
+ { 0x1D5D, 1, 0 }, { 0x1D61, 0, 1 },
+ { 0x1D66, 1, 0 }, { 0x1D6A, 0, 1 },
+ { 0x1DBF, 1, 1 },
+ { 0x1F00, 1, 0 }, { 0x1F15, 0, 1 },
+ { 0x1F18, 1, 0 }, { 0x1F1D, 0, 1 },
+ { 0x1F20, 1, 0 }, { 0x1F45, 0, 1 },
+ { 0x1F48, 1, 0 }, { 0x1F4D, 0, 1 },
+ { 0x1F50, 1, 0 }, { 0x1F57, 0, 1 },
+ { 0x1F59, 1, 1 },
+ { 0x1F5B, 1, 1 },
+ { 0x1F5D, 1, 1 },
+ { 0x1F5F, 1, 0 }, { 0x1F7D, 0, 1 },
+ { 0x1F80, 1, 0 }, { 0x1FB4, 0, 1 },
+ { 0x1FB6, 1, 0 }, { 0x1FC4, 0, 1 },
+ { 0x1FC6, 1, 0 }, { 0x1FD3, 0, 1 },
+ { 0x1FD6, 1, 0 }, { 0x1FDB, 0, 1 },
+ { 0x1FDD, 1, 0 }, { 0x1FEF, 0, 1 },
+ { 0x1FF2, 1, 0 }, { 0x1FF4, 0, 1 },
+ { 0x1FF6, 1, 0 }, { 0x1FFE, 0, 1 },
+ { 0x2126, 1, 1 },
+ { 0x10140, 1, 0 }, { 0x1018A, 0, 1 },
+ { 0x1D200, 1, 0 }, { 0x1D245, 0, 1 }
+};
+static const uc_interval_t script_cyrillic_intervals[] =
+{
+ { 0x0400, 1, 0 }, { 0x0523, 0, 1 },
+ { 0x1D2B, 1, 1 },
+ { 0x1D78, 1, 1 },
+ { 0x2DE0, 1, 0 }, { 0x2DFF, 0, 1 },
+ { 0xA640, 1, 0 }, { 0xA65F, 0, 1 },
+ { 0xA662, 1, 0 }, { 0xA673, 0, 1 },
+ { 0xA67C, 1, 0 }, { 0xA697, 0, 1 }
+};
+static const uc_interval_t script_armenian_intervals[] =
+{
+ { 0x0531, 1, 0 }, { 0x0556, 0, 1 },
+ { 0x0559, 1, 0 }, { 0x055F, 0, 1 },
+ { 0x0561, 1, 0 }, { 0x0587, 0, 1 },
+ { 0x058A, 1, 1 },
+ { 0xFB13, 1, 0 }, { 0xFB17, 0, 1 }
+};
+static const uc_interval_t script_hebrew_intervals[] =
+{
+ { 0x0591, 1, 0 }, { 0x05C7, 0, 1 },
+ { 0x05D0, 1, 0 }, { 0x05EA, 0, 1 },
+ { 0x05F0, 1, 0 }, { 0x05F4, 0, 1 },
+ { 0xFB1D, 1, 0 }, { 0xFB36, 0, 1 },
+ { 0xFB38, 1, 0 }, { 0xFB3C, 0, 1 },
+ { 0xFB3E, 1, 1 },
+ { 0xFB40, 1, 0 }, { 0xFB41, 0, 1 },
+ { 0xFB43, 1, 0 }, { 0xFB44, 0, 1 },
+ { 0xFB46, 1, 0 }, { 0xFB4F, 0, 1 }
+};
+static const uc_interval_t script_arabic_intervals[] =
+{
+ { 0x0606, 1, 0 }, { 0x060B, 0, 1 },
+ { 0x060D, 1, 0 }, { 0x061A, 0, 1 },
+ { 0x061E, 1, 1 },
+ { 0x0621, 1, 0 }, { 0x063F, 0, 1 },
+ { 0x0641, 1, 0 }, { 0x064A, 0, 1 },
+ { 0x0656, 1, 0 }, { 0x065E, 0, 1 },
+ { 0x066A, 1, 0 }, { 0x066F, 0, 1 },
+ { 0x0671, 1, 0 }, { 0x06DC, 0, 1 },
+ { 0x06DE, 1, 0 }, { 0x06FF, 0, 1 },
+ { 0x0750, 1, 0 }, { 0x077F, 0, 1 },
+ { 0xFB50, 1, 0 }, { 0xFBB1, 0, 1 },
+ { 0xFBD3, 1, 0 }, { 0xFD3D, 0, 1 },
+ { 0xFD50, 1, 0 }, { 0xFD8F, 0, 1 },
+ { 0xFD92, 1, 0 }, { 0xFDC7, 0, 1 },
+ { 0xFDF0, 1, 0 }, { 0xFDFC, 0, 1 },
+ { 0xFE70, 1, 0 }, { 0xFE74, 0, 1 },
+ { 0xFE76, 1, 0 }, { 0xFEFC, 0, 1 }
+};
+static const uc_interval_t script_syriac_intervals[] =
+{
+ { 0x0700, 1, 0 }, { 0x070D, 0, 1 },
+ { 0x070F, 1, 0 }, { 0x074A, 0, 1 },
+ { 0x074D, 1, 0 }, { 0x074F, 0, 1 }
+};
+static const uc_interval_t script_thaana_intervals[] =
+{
+ { 0x0780, 1, 0 }, { 0x07B1, 0, 1 }
+};
+static const uc_interval_t script_devanagari_intervals[] =
+{
+ { 0x0901, 1, 0 }, { 0x0939, 0, 1 },
+ { 0x093C, 1, 0 }, { 0x094D, 0, 1 },
+ { 0x0950, 1, 1 },
+ { 0x0953, 1, 0 }, { 0x0954, 0, 1 },
+ { 0x0958, 1, 0 }, { 0x0963, 0, 1 },
+ { 0x0966, 1, 0 }, { 0x096F, 0, 1 },
+ { 0x0971, 1, 0 }, { 0x0972, 0, 1 },
+ { 0x097B, 1, 0 }, { 0x097F, 0, 1 }
+};
+static const uc_interval_t script_bengali_intervals[] =
+{
+ { 0x0981, 1, 0 }, { 0x0983, 0, 1 },
+ { 0x0985, 1, 0 }, { 0x098C, 0, 1 },
+ { 0x098F, 1, 0 }, { 0x0990, 0, 1 },
+ { 0x0993, 1, 0 }, { 0x09A8, 0, 1 },
+ { 0x09AA, 1, 0 }, { 0x09B0, 0, 1 },
+ { 0x09B2, 1, 1 },
+ { 0x09B6, 1, 0 }, { 0x09B9, 0, 1 },
+ { 0x09BC, 1, 0 }, { 0x09C4, 0, 1 },
+ { 0x09C7, 1, 0 }, { 0x09C8, 0, 1 },
+ { 0x09CB, 1, 0 }, { 0x09CE, 0, 1 },
+ { 0x09D7, 1, 1 },
+ { 0x09DC, 1, 0 }, { 0x09DD, 0, 1 },
+ { 0x09DF, 1, 0 }, { 0x09E3, 0, 1 },
+ { 0x09E6, 1, 0 }, { 0x09FA, 0, 1 }
+};
+static const uc_interval_t script_gurmukhi_intervals[] =
+{
+ { 0x0A01, 1, 0 }, { 0x0A03, 0, 1 },
+ { 0x0A05, 1, 0 }, { 0x0A0A, 0, 1 },
+ { 0x0A0F, 1, 0 }, { 0x0A10, 0, 1 },
+ { 0x0A13, 1, 0 }, { 0x0A28, 0, 1 },
+ { 0x0A2A, 1, 0 }, { 0x0A30, 0, 1 },
+ { 0x0A32, 1, 0 }, { 0x0A33, 0, 1 },
+ { 0x0A35, 1, 0 }, { 0x0A36, 0, 1 },
+ { 0x0A38, 1, 0 }, { 0x0A39, 0, 1 },
+ { 0x0A3C, 1, 1 },
+ { 0x0A3E, 1, 0 }, { 0x0A42, 0, 1 },
+ { 0x0A47, 1, 0 }, { 0x0A48, 0, 1 },
+ { 0x0A4B, 1, 0 }, { 0x0A4D, 0, 1 },
+ { 0x0A51, 1, 1 },
+ { 0x0A59, 1, 0 }, { 0x0A5C, 0, 1 },
+ { 0x0A5E, 1, 1 },
+ { 0x0A66, 1, 0 }, { 0x0A75, 0, 1 }
+};
+static const uc_interval_t script_gujarati_intervals[] =
+{
+ { 0x0A81, 1, 0 }, { 0x0A83, 0, 1 },
+ { 0x0A85, 1, 0 }, { 0x0A8D, 0, 1 },
+ { 0x0A8F, 1, 0 }, { 0x0A91, 0, 1 },
+ { 0x0A93, 1, 0 }, { 0x0AA8, 0, 1 },
+ { 0x0AAA, 1, 0 }, { 0x0AB0, 0, 1 },
+ { 0x0AB2, 1, 0 }, { 0x0AB3, 0, 1 },
+ { 0x0AB5, 1, 0 }, { 0x0AB9, 0, 1 },
+ { 0x0ABC, 1, 0 }, { 0x0AC5, 0, 1 },
+ { 0x0AC7, 1, 0 }, { 0x0AC9, 0, 1 },
+ { 0x0ACB, 1, 0 }, { 0x0ACD, 0, 1 },
+ { 0x0AD0, 1, 1 },
+ { 0x0AE0, 1, 0 }, { 0x0AE3, 0, 1 },
+ { 0x0AE6, 1, 0 }, { 0x0AEF, 0, 1 },
+ { 0x0AF1, 1, 1 }
+};
+static const uc_interval_t script_oriya_intervals[] =
+{
+ { 0x0B01, 1, 0 }, { 0x0B03, 0, 1 },
+ { 0x0B05, 1, 0 }, { 0x0B0C, 0, 1 },
+ { 0x0B0F, 1, 0 }, { 0x0B10, 0, 1 },
+ { 0x0B13, 1, 0 }, { 0x0B28, 0, 1 },
+ { 0x0B2A, 1, 0 }, { 0x0B30, 0, 1 },
+ { 0x0B32, 1, 0 }, { 0x0B33, 0, 1 },
+ { 0x0B35, 1, 0 }, { 0x0B39, 0, 1 },
+ { 0x0B3C, 1, 0 }, { 0x0B44, 0, 1 },
+ { 0x0B47, 1, 0 }, { 0x0B48, 0, 1 },
+ { 0x0B4B, 1, 0 }, { 0x0B4D, 0, 1 },
+ { 0x0B56, 1, 0 }, { 0x0B57, 0, 1 },
+ { 0x0B5C, 1, 0 }, { 0x0B5D, 0, 1 },
+ { 0x0B5F, 1, 0 }, { 0x0B63, 0, 1 },
+ { 0x0B66, 1, 0 }, { 0x0B71, 0, 1 }
+};
+static const uc_interval_t script_tamil_intervals[] =
+{
+ { 0x0B82, 1, 0 }, { 0x0B83, 0, 1 },
+ { 0x0B85, 1, 0 }, { 0x0B8A, 0, 1 },
+ { 0x0B8E, 1, 0 }, { 0x0B90, 0, 1 },
+ { 0x0B92, 1, 0 }, { 0x0B95, 0, 1 },
+ { 0x0B99, 1, 0 }, { 0x0B9A, 0, 1 },
+ { 0x0B9C, 1, 1 },
+ { 0x0B9E, 1, 0 }, { 0x0B9F, 0, 1 },
+ { 0x0BA3, 1, 0 }, { 0x0BA4, 0, 1 },
+ { 0x0BA8, 1, 0 }, { 0x0BAA, 0, 1 },
+ { 0x0BAE, 1, 0 }, { 0x0BB9, 0, 1 },
+ { 0x0BBE, 1, 0 }, { 0x0BC2, 0, 1 },
+ { 0x0BC6, 1, 0 }, { 0x0BC8, 0, 1 },
+ { 0x0BCA, 1, 0 }, { 0x0BCD, 0, 1 },
+ { 0x0BD0, 1, 1 },
+ { 0x0BD7, 1, 1 },
+ { 0x0BE6, 1, 0 }, { 0x0BFA, 0, 1 }
+};
+static const uc_interval_t script_telugu_intervals[] =
+{
+ { 0x0C01, 1, 0 }, { 0x0C03, 0, 1 },
+ { 0x0C05, 1, 0 }, { 0x0C0C, 0, 1 },
+ { 0x0C0E, 1, 0 }, { 0x0C10, 0, 1 },
+ { 0x0C12, 1, 0 }, { 0x0C28, 0, 1 },
+ { 0x0C2A, 1, 0 }, { 0x0C33, 0, 1 },
+ { 0x0C35, 1, 0 }, { 0x0C39, 0, 1 },
+ { 0x0C3D, 1, 0 }, { 0x0C44, 0, 1 },
+ { 0x0C46, 1, 0 }, { 0x0C48, 0, 1 },
+ { 0x0C4A, 1, 0 }, { 0x0C4D, 0, 1 },
+ { 0x0C55, 1, 0 }, { 0x0C56, 0, 1 },
+ { 0x0C58, 1, 0 }, { 0x0C59, 0, 1 },
+ { 0x0C60, 1, 0 }, { 0x0C63, 0, 1 },
+ { 0x0C66, 1, 0 }, { 0x0C6F, 0, 1 },
+ { 0x0C78, 1, 0 }, { 0x0C7F, 0, 1 }
+};
+static const uc_interval_t script_kannada_intervals[] =
+{
+ { 0x0C82, 1, 0 }, { 0x0C83, 0, 1 },
+ { 0x0C85, 1, 0 }, { 0x0C8C, 0, 1 },
+ { 0x0C8E, 1, 0 }, { 0x0C90, 0, 1 },
+ { 0x0C92, 1, 0 }, { 0x0CA8, 0, 1 },
+ { 0x0CAA, 1, 0 }, { 0x0CB3, 0, 1 },
+ { 0x0CB5, 1, 0 }, { 0x0CB9, 0, 1 },
+ { 0x0CBC, 1, 0 }, { 0x0CC4, 0, 1 },
+ { 0x0CC6, 1, 0 }, { 0x0CC8, 0, 1 },
+ { 0x0CCA, 1, 0 }, { 0x0CCD, 0, 1 },
+ { 0x0CD5, 1, 0 }, { 0x0CD6, 0, 1 },
+ { 0x0CDE, 1, 1 },
+ { 0x0CE0, 1, 0 }, { 0x0CE3, 0, 1 },
+ { 0x0CE6, 1, 0 }, { 0x0CEF, 0, 1 }
+};
+static const uc_interval_t script_malayalam_intervals[] =
+{
+ { 0x0D02, 1, 0 }, { 0x0D03, 0, 1 },
+ { 0x0D05, 1, 0 }, { 0x0D0C, 0, 1 },
+ { 0x0D0E, 1, 0 }, { 0x0D10, 0, 1 },
+ { 0x0D12, 1, 0 }, { 0x0D28, 0, 1 },
+ { 0x0D2A, 1, 0 }, { 0x0D39, 0, 1 },
+ { 0x0D3D, 1, 0 }, { 0x0D44, 0, 1 },
+ { 0x0D46, 1, 0 }, { 0x0D48, 0, 1 },
+ { 0x0D4A, 1, 0 }, { 0x0D4D, 0, 1 },
+ { 0x0D57, 1, 1 },
+ { 0x0D60, 1, 0 }, { 0x0D63, 0, 1 },
+ { 0x0D66, 1, 0 }, { 0x0D75, 0, 1 },
+ { 0x0D79, 1, 0 }, { 0x0D7F, 0, 1 }
+};
+static const uc_interval_t script_sinhala_intervals[] =
+{
+ { 0x0D82, 1, 0 }, { 0x0D83, 0, 1 },
+ { 0x0D85, 1, 0 }, { 0x0D96, 0, 1 },
+ { 0x0D9A, 1, 0 }, { 0x0DB1, 0, 1 },
+ { 0x0DB3, 1, 0 }, { 0x0DBB, 0, 1 },
+ { 0x0DBD, 1, 1 },
+ { 0x0DC0, 1, 0 }, { 0x0DC6, 0, 1 },
+ { 0x0DCA, 1, 1 },
+ { 0x0DCF, 1, 0 }, { 0x0DD4, 0, 1 },
+ { 0x0DD6, 1, 1 },
+ { 0x0DD8, 1, 0 }, { 0x0DDF, 0, 1 },
+ { 0x0DF2, 1, 0 }, { 0x0DF4, 0, 1 }
+};
+static const uc_interval_t script_thai_intervals[] =
+{
+ { 0x0E01, 1, 0 }, { 0x0E3A, 0, 1 },
+ { 0x0E40, 1, 0 }, { 0x0E5B, 0, 1 }
+};
+static const uc_interval_t script_lao_intervals[] =
+{
+ { 0x0E81, 1, 0 }, { 0x0E82, 0, 1 },
+ { 0x0E84, 1, 1 },
+ { 0x0E87, 1, 0 }, { 0x0E88, 0, 1 },
+ { 0x0E8A, 1, 1 },
+ { 0x0E8D, 1, 1 },
+ { 0x0E94, 1, 0 }, { 0x0E97, 0, 1 },
+ { 0x0E99, 1, 0 }, { 0x0E9F, 0, 1 },
+ { 0x0EA1, 1, 0 }, { 0x0EA3, 0, 1 },
+ { 0x0EA5, 1, 1 },
+ { 0x0EA7, 1, 1 },
+ { 0x0EAA, 1, 0 }, { 0x0EAB, 0, 1 },
+ { 0x0EAD, 1, 0 }, { 0x0EB9, 0, 1 },
+ { 0x0EBB, 1, 0 }, { 0x0EBD, 0, 1 },
+ { 0x0EC0, 1, 0 }, { 0x0EC4, 0, 1 },
+ { 0x0EC6, 1, 1 },
+ { 0x0EC8, 1, 0 }, { 0x0ECD, 0, 1 },
+ { 0x0ED0, 1, 0 }, { 0x0ED9, 0, 1 },
+ { 0x0EDC, 1, 0 }, { 0x0EDD, 0, 1 }
+};
+static const uc_interval_t script_tibetan_intervals[] =
+{
+ { 0x0F00, 1, 0 }, { 0x0F47, 0, 1 },
+ { 0x0F49, 1, 0 }, { 0x0F6C, 0, 1 },
+ { 0x0F71, 1, 0 }, { 0x0F8B, 0, 1 },
+ { 0x0F90, 1, 0 }, { 0x0F97, 0, 1 },
+ { 0x0F99, 1, 0 }, { 0x0FBC, 0, 1 },
+ { 0x0FBE, 1, 0 }, { 0x0FCC, 0, 1 },
+ { 0x0FCE, 1, 0 }, { 0x0FD4, 0, 1 }
+};
+static const uc_interval_t script_myanmar_intervals[] =
+{
+ { 0x1000, 1, 0 }, { 0x1099, 0, 1 },
+ { 0x109E, 1, 0 }, { 0x109F, 0, 1 }
+};
+static const uc_interval_t script_georgian_intervals[] =
+{
+ { 0x10A0, 1, 0 }, { 0x10C5, 0, 1 },
+ { 0x10D0, 1, 0 }, { 0x10FA, 0, 1 },
+ { 0x10FC, 1, 1 },
+ { 0x2D00, 1, 0 }, { 0x2D25, 0, 1 }
+};
+static const uc_interval_t script_hangul_intervals[] =
+{
+ { 0x1100, 1, 0 }, { 0x1159, 0, 1 },
+ { 0x115F, 1, 0 }, { 0x11A2, 0, 1 },
+ { 0x11A8, 1, 0 }, { 0x11F9, 0, 1 },
+ { 0x3131, 1, 0 }, { 0x318E, 0, 1 },
+ { 0x3200, 1, 0 }, { 0x321E, 0, 1 },
+ { 0x3260, 1, 0 }, { 0x327E, 0, 1 },
+ { 0xAC00, 1, 0 }, { 0xD7A3, 0, 1 },
+ { 0xFFA0, 1, 0 }, { 0xFFBE, 0, 1 },
+ { 0xFFC2, 1, 0 }, { 0xFFC7, 0, 1 },
+ { 0xFFCA, 1, 0 }, { 0xFFCF, 0, 1 },
+ { 0xFFD2, 1, 0 }, { 0xFFD7, 0, 1 },
+ { 0xFFDA, 1, 0 }, { 0xFFDC, 0, 1 }
+};
+static const uc_interval_t script_ethiopic_intervals[] =
+{
+ { 0x1200, 1, 0 }, { 0x1248, 0, 1 },
+ { 0x124A, 1, 0 }, { 0x124D, 0, 1 },
+ { 0x1250, 1, 0 }, { 0x1256, 0, 1 },
+ { 0x1258, 1, 1 },
+ { 0x125A, 1, 0 }, { 0x125D, 0, 1 },
+ { 0x1260, 1, 0 }, { 0x1288, 0, 1 },
+ { 0x128A, 1, 0 }, { 0x128D, 0, 1 },
+ { 0x1290, 1, 0 }, { 0x12B0, 0, 1 },
+ { 0x12B2, 1, 0 }, { 0x12B5, 0, 1 },
+ { 0x12B8, 1, 0 }, { 0x12BE, 0, 1 },
+ { 0x12C0, 1, 1 },
+ { 0x12C2, 1, 0 }, { 0x12C5, 0, 1 },
+ { 0x12C8, 1, 0 }, { 0x12D6, 0, 1 },
+ { 0x12D8, 1, 0 }, { 0x1310, 0, 1 },
+ { 0x1312, 1, 0 }, { 0x1315, 0, 1 },
+ { 0x1318, 1, 0 }, { 0x135A, 0, 1 },
+ { 0x135F, 1, 0 }, { 0x137C, 0, 1 },
+ { 0x1380, 1, 0 }, { 0x1399, 0, 1 },
+ { 0x2D80, 1, 0 }, { 0x2D96, 0, 1 },
+ { 0x2DA0, 1, 0 }, { 0x2DA6, 0, 1 },
+ { 0x2DA8, 1, 0 }, { 0x2DAE, 0, 1 },
+ { 0x2DB0, 1, 0 }, { 0x2DB6, 0, 1 },
+ { 0x2DB8, 1, 0 }, { 0x2DBE, 0, 1 },
+ { 0x2DC0, 1, 0 }, { 0x2DC6, 0, 1 },
+ { 0x2DC8, 1, 0 }, { 0x2DCE, 0, 1 },
+ { 0x2DD0, 1, 0 }, { 0x2DD6, 0, 1 },
+ { 0x2DD8, 1, 0 }, { 0x2DDE, 0, 1 }
+};
+static const uc_interval_t script_cherokee_intervals[] =
+{
+ { 0x13A0, 1, 0 }, { 0x13F4, 0, 1 }
+};
+static const uc_interval_t script_canadian_aboriginal_intervals[] =
+{
+ { 0x1401, 1, 0 }, { 0x1676, 0, 1 }
+};
+static const uc_interval_t script_ogham_intervals[] =
+{
+ { 0x1680, 1, 0 }, { 0x169C, 0, 1 }
+};
+static const uc_interval_t script_runic_intervals[] =
+{
+ { 0x16A0, 1, 0 }, { 0x16EA, 0, 1 },
+ { 0x16EE, 1, 0 }, { 0x16F0, 0, 1 }
+};
+static const uc_interval_t script_khmer_intervals[] =
+{
+ { 0x1780, 1, 0 }, { 0x17DD, 0, 1 },
+ { 0x17E0, 1, 0 }, { 0x17E9, 0, 1 },
+ { 0x17F0, 1, 0 }, { 0x17F9, 0, 1 },
+ { 0x19E0, 1, 0 }, { 0x19FF, 0, 1 }
+};
+static const uc_interval_t script_mongolian_intervals[] =
+{
+ { 0x1800, 1, 0 }, { 0x1801, 0, 1 },
+ { 0x1804, 1, 1 },
+ { 0x1806, 1, 0 }, { 0x180E, 0, 1 },
+ { 0x1810, 1, 0 }, { 0x1819, 0, 1 },
+ { 0x1820, 1, 0 }, { 0x1877, 0, 1 },
+ { 0x1880, 1, 0 }, { 0x18AA, 0, 1 }
+};
+static const uc_interval_t script_hiragana_intervals[] =
+{
+ { 0x3041, 1, 0 }, { 0x3096, 0, 1 },
+ { 0x309D, 1, 0 }, { 0x309F, 0, 1 }
+};
+static const uc_interval_t script_katakana_intervals[] =
+{
+ { 0x30A1, 1, 0 }, { 0x30FA, 0, 1 },
+ { 0x30FD, 1, 0 }, { 0x30FF, 0, 1 },
+ { 0x31F0, 1, 0 }, { 0x31FF, 0, 1 },
+ { 0x32D0, 1, 0 }, { 0x32FE, 0, 1 },
+ { 0x3300, 1, 0 }, { 0x3357, 0, 1 },
+ { 0xFF66, 1, 0 }, { 0xFF6F, 0, 1 },
+ { 0xFF71, 1, 0 }, { 0xFF9D, 0, 1 }
+};
+static const uc_interval_t script_bopomofo_intervals[] =
+{
+ { 0x3105, 1, 0 }, { 0x312D, 0, 1 },
+ { 0x31A0, 1, 0 }, { 0x31B7, 0, 1 }
+};
+static const uc_interval_t script_han_intervals[] =
+{
+ { 0x2E80, 1, 0 }, { 0x2E99, 0, 1 },
+ { 0x2E9B, 1, 0 }, { 0x2EF3, 0, 1 },
+ { 0x2F00, 1, 0 }, { 0x2FD5, 0, 1 },
+ { 0x3005, 1, 1 },
+ { 0x3007, 1, 1 },
+ { 0x3021, 1, 0 }, { 0x3029, 0, 1 },
+ { 0x3038, 1, 0 }, { 0x303B, 0, 1 },
+ { 0x3400, 1, 0 }, { 0x4DB5, 0, 1 },
+ { 0x4E00, 1, 0 }, { 0x9FC3, 0, 1 },
+ { 0xF900, 1, 0 }, { 0xFA2D, 0, 1 },
+ { 0xFA30, 1, 0 }, { 0xFA6A, 0, 1 },
+ { 0xFA70, 1, 0 }, { 0xFAD9, 0, 1 },
+ { 0x20000, 1, 0 }, { 0x2A6D6, 0, 1 },
+ { 0x2F800, 1, 0 }, { 0x2FA1D, 0, 1 }
+};
+static const uc_interval_t script_yi_intervals[] =
+{
+ { 0xA000, 1, 0 }, { 0xA48C, 0, 1 },
+ { 0xA490, 1, 0 }, { 0xA4C6, 0, 1 }
+};
+static const uc_interval_t script_old_italic_intervals[] =
+{
+ { 0x10300, 1, 0 }, { 0x1031E, 0, 1 },
+ { 0x10320, 1, 0 }, { 0x10323, 0, 1 }
+};
+static const uc_interval_t script_gothic_intervals[] =
+{
+ { 0x10330, 1, 0 }, { 0x1034A, 0, 1 }
+};
+static const uc_interval_t script_deseret_intervals[] =
+{
+ { 0x10400, 1, 0 }, { 0x1044F, 0, 1 }
+};
+static const uc_interval_t script_inherited_intervals[] =
+{
+ { 0x0300, 1, 0 }, { 0x036F, 0, 1 },
+ { 0x064B, 1, 0 }, { 0x0655, 0, 1 },
+ { 0x0670, 1, 1 },
+ { 0x0951, 1, 0 }, { 0x0952, 0, 1 },
+ { 0x1DC0, 1, 0 }, { 0x1DE6, 0, 1 },
+ { 0x1DFE, 1, 0 }, { 0x1DFF, 0, 1 },
+ { 0x200C, 1, 0 }, { 0x200D, 0, 1 },
+ { 0x20D0, 1, 0 }, { 0x20F0, 0, 1 },
+ { 0x302A, 1, 0 }, { 0x302F, 0, 1 },
+ { 0x3099, 1, 0 }, { 0x309A, 0, 1 },
+ { 0xFE00, 1, 0 }, { 0xFE0F, 0, 1 },
+ { 0xFE20, 1, 0 }, { 0xFE26, 0, 1 },
+ { 0x101FD, 1, 1 },
+ { 0x1D167, 1, 0 }, { 0x1D169, 0, 1 },
+ { 0x1D17B, 1, 0 }, { 0x1D182, 0, 1 },
+ { 0x1D185, 1, 0 }, { 0x1D18B, 0, 1 },
+ { 0x1D1AA, 1, 0 }, { 0x1D1AD, 0, 1 },
+ { 0xE0100, 1, 0 }, { 0xE01EF, 0, 1 }
+};
+static const uc_interval_t script_tagalog_intervals[] =
+{
+ { 0x1700, 1, 0 }, { 0x170C, 0, 1 },
+ { 0x170E, 1, 0 }, { 0x1714, 0, 1 }
+};
+static const uc_interval_t script_hanunoo_intervals[] =
+{
+ { 0x1720, 1, 0 }, { 0x1734, 0, 1 }
+};
+static const uc_interval_t script_buhid_intervals[] =
+{
+ { 0x1740, 1, 0 }, { 0x1753, 0, 1 }
+};
+static const uc_interval_t script_tagbanwa_intervals[] =
+{
+ { 0x1760, 1, 0 }, { 0x176C, 0, 1 },
+ { 0x176E, 1, 0 }, { 0x1770, 0, 1 },
+ { 0x1772, 1, 0 }, { 0x1773, 0, 1 }
+};
+static const uc_interval_t script_limbu_intervals[] =
+{
+ { 0x1900, 1, 0 }, { 0x191C, 0, 1 },
+ { 0x1920, 1, 0 }, { 0x192B, 0, 1 },
+ { 0x1930, 1, 0 }, { 0x193B, 0, 1 },
+ { 0x1940, 1, 1 },
+ { 0x1944, 1, 0 }, { 0x194F, 0, 1 }
+};
+static const uc_interval_t script_tai_le_intervals[] =
+{
+ { 0x1950, 1, 0 }, { 0x196D, 0, 1 },
+ { 0x1970, 1, 0 }, { 0x1974, 0, 1 }
+};
+static const uc_interval_t script_linear_b_intervals[] =
+{
+ { 0x10000, 1, 0 }, { 0x1000B, 0, 1 },
+ { 0x1000D, 1, 0 }, { 0x10026, 0, 1 },
+ { 0x10028, 1, 0 }, { 0x1003A, 0, 1 },
+ { 0x1003C, 1, 0 }, { 0x1003D, 0, 1 },
+ { 0x1003F, 1, 0 }, { 0x1004D, 0, 1 },
+ { 0x10050, 1, 0 }, { 0x1005D, 0, 1 },
+ { 0x10080, 1, 0 }, { 0x100FA, 0, 1 }
+};
+static const uc_interval_t script_ugaritic_intervals[] =
+{
+ { 0x10380, 1, 0 }, { 0x1039D, 0, 1 },
+ { 0x1039F, 1, 1 }
+};
+static const uc_interval_t script_shavian_intervals[] =
+{
+ { 0x10450, 1, 0 }, { 0x1047F, 0, 1 }
+};
+static const uc_interval_t script_osmanya_intervals[] =
+{
+ { 0x10480, 1, 0 }, { 0x1049D, 0, 1 },
+ { 0x104A0, 1, 0 }, { 0x104A9, 0, 1 }
+};
+static const uc_interval_t script_cypriot_intervals[] =
+{
+ { 0x10800, 1, 0 }, { 0x10805, 0, 1 },
+ { 0x10808, 1, 1 },
+ { 0x1080A, 1, 0 }, { 0x10835, 0, 1 },
+ { 0x10837, 1, 0 }, { 0x10838, 0, 1 },
+ { 0x1083C, 1, 1 },
+ { 0x1083F, 1, 1 }
+};
+static const uc_interval_t script_braille_intervals[] =
+{
+ { 0x2800, 1, 0 }, { 0x28FF, 0, 1 }
+};
+static const uc_interval_t script_buginese_intervals[] =
+{
+ { 0x1A00, 1, 0 }, { 0x1A1B, 0, 1 },
+ { 0x1A1E, 1, 0 }, { 0x1A1F, 0, 1 }
+};
+static const uc_interval_t script_coptic_intervals[] =
+{
+ { 0x03E2, 1, 0 }, { 0x03EF, 0, 1 },
+ { 0x2C80, 1, 0 }, { 0x2CEA, 0, 1 },
+ { 0x2CF9, 1, 0 }, { 0x2CFF, 0, 1 }
+};
+static const uc_interval_t script_new_tai_lue_intervals[] =
+{
+ { 0x1980, 1, 0 }, { 0x19A9, 0, 1 },
+ { 0x19B0, 1, 0 }, { 0x19C9, 0, 1 },
+ { 0x19D0, 1, 0 }, { 0x19D9, 0, 1 },
+ { 0x19DE, 1, 0 }, { 0x19DF, 0, 1 }
+};
+static const uc_interval_t script_glagolitic_intervals[] =
+{
+ { 0x2C00, 1, 0 }, { 0x2C2E, 0, 1 },
+ { 0x2C30, 1, 0 }, { 0x2C5E, 0, 1 }
+};
+static const uc_interval_t script_tifinagh_intervals[] =
+{
+ { 0x2D30, 1, 0 }, { 0x2D65, 0, 1 },
+ { 0x2D6F, 1, 1 }
+};
+static const uc_interval_t script_syloti_nagri_intervals[] =
+{
+ { 0xA800, 1, 0 }, { 0xA82B, 0, 1 }
+};
+static const uc_interval_t script_old_persian_intervals[] =
+{
+ { 0x103A0, 1, 0 }, { 0x103C3, 0, 1 },
+ { 0x103C8, 1, 0 }, { 0x103D5, 0, 1 }
+};
+static const uc_interval_t script_kharoshthi_intervals[] =
+{
+ { 0x10A00, 1, 0 }, { 0x10A03, 0, 1 },
+ { 0x10A05, 1, 0 }, { 0x10A06, 0, 1 },
+ { 0x10A0C, 1, 0 }, { 0x10A13, 0, 1 },
+ { 0x10A15, 1, 0 }, { 0x10A17, 0, 1 },
+ { 0x10A19, 1, 0 }, { 0x10A33, 0, 1 },
+ { 0x10A38, 1, 0 }, { 0x10A3A, 0, 1 },
+ { 0x10A3F, 1, 0 }, { 0x10A47, 0, 1 },
+ { 0x10A50, 1, 0 }, { 0x10A58, 0, 1 }
+};
+static const uc_interval_t script_balinese_intervals[] =
+{
+ { 0x1B00, 1, 0 }, { 0x1B4B, 0, 1 },
+ { 0x1B50, 1, 0 }, { 0x1B7C, 0, 1 }
+};
+static const uc_interval_t script_cuneiform_intervals[] =
+{
+ { 0x12000, 1, 0 }, { 0x1236E, 0, 1 },
+ { 0x12400, 1, 0 }, { 0x12462, 0, 1 },
+ { 0x12470, 1, 0 }, { 0x12473, 0, 1 }
+};
+static const uc_interval_t script_phoenician_intervals[] =
+{
+ { 0x10900, 1, 0 }, { 0x10919, 0, 1 },
+ { 0x1091F, 1, 1 }
+};
+static const uc_interval_t script_phags_pa_intervals[] =
+{
+ { 0xA840, 1, 0 }, { 0xA877, 0, 1 }
+};
+static const uc_interval_t script_nko_intervals[] =
+{
+ { 0x07C0, 1, 0 }, { 0x07FA, 0, 1 }
+};
+static const uc_interval_t script_sundanese_intervals[] =
+{
+ { 0x1B80, 1, 0 }, { 0x1BAA, 0, 1 },
+ { 0x1BAE, 1, 0 }, { 0x1BB9, 0, 1 }
+};
+static const uc_interval_t script_lepcha_intervals[] =
+{
+ { 0x1C00, 1, 0 }, { 0x1C37, 0, 1 },
+ { 0x1C3B, 1, 0 }, { 0x1C49, 0, 1 },
+ { 0x1C4D, 1, 0 }, { 0x1C4F, 0, 1 }
+};
+static const uc_interval_t script_ol_chiki_intervals[] =
+{
+ { 0x1C50, 1, 0 }, { 0x1C7F, 0, 1 }
+};
+static const uc_interval_t script_vai_intervals[] =
+{
+ { 0xA500, 1, 0 }, { 0xA62B, 0, 1 }
+};
+static const uc_interval_t script_saurashtra_intervals[] =
+{
+ { 0xA880, 1, 0 }, { 0xA8C4, 0, 1 },
+ { 0xA8CE, 1, 0 }, { 0xA8D9, 0, 1 }
+};
+static const uc_interval_t script_kayah_li_intervals[] =
+{
+ { 0xA900, 1, 0 }, { 0xA92F, 0, 1 }
+};
+static const uc_interval_t script_rejang_intervals[] =
+{
+ { 0xA930, 1, 0 }, { 0xA953, 0, 1 },
+ { 0xA95F, 1, 1 }
+};
+static const uc_interval_t script_lycian_intervals[] =
+{
+ { 0x10280, 1, 0 }, { 0x1029C, 0, 1 }
+};
+static const uc_interval_t script_carian_intervals[] =
+{
+ { 0x102A0, 1, 0 }, { 0x102D0, 0, 1 }
+};
+static const uc_interval_t script_lydian_intervals[] =
+{
+ { 0x10920, 1, 0 }, { 0x10939, 0, 1 },
+ { 0x1093F, 1, 1 }
+};
+static const uc_interval_t script_cham_intervals[] =
+{
+ { 0xAA00, 1, 0 }, { 0xAA36, 0, 1 },
+ { 0xAA40, 1, 0 }, { 0xAA4D, 0, 1 },
+ { 0xAA50, 1, 0 }, { 0xAA59, 0, 1 },
+ { 0xAA5C, 1, 0 }, { 0xAA5F, 0, 1 }
+};
+static const uc_script_t scripts[77] =
+{
+ {
+ sizeof (script_common_intervals) / sizeof (uc_interval_t),
+ script_common_intervals,
+ "Common"
+ },
+ {
+ sizeof (script_latin_intervals) / sizeof (uc_interval_t),
+ script_latin_intervals,
+ "Latin"
+ },
+ {
+ sizeof (script_greek_intervals) / sizeof (uc_interval_t),
+ script_greek_intervals,
+ "Greek"
+ },
+ {
+ sizeof (script_cyrillic_intervals) / sizeof (uc_interval_t),
+ script_cyrillic_intervals,
+ "Cyrillic"
+ },
+ {
+ sizeof (script_armenian_intervals) / sizeof (uc_interval_t),
+ script_armenian_intervals,
+ "Armenian"
+ },
+ {
+ sizeof (script_hebrew_intervals) / sizeof (uc_interval_t),
+ script_hebrew_intervals,
+ "Hebrew"
+ },
+ {
+ sizeof (script_arabic_intervals) / sizeof (uc_interval_t),
+ script_arabic_intervals,
+ "Arabic"
+ },
+ {
+ sizeof (script_syriac_intervals) / sizeof (uc_interval_t),
+ script_syriac_intervals,
+ "Syriac"
+ },
+ {
+ sizeof (script_thaana_intervals) / sizeof (uc_interval_t),
+ script_thaana_intervals,
+ "Thaana"
+ },
+ {
+ sizeof (script_devanagari_intervals) / sizeof (uc_interval_t),
+ script_devanagari_intervals,
+ "Devanagari"
+ },
+ {
+ sizeof (script_bengali_intervals) / sizeof (uc_interval_t),
+ script_bengali_intervals,
+ "Bengali"
+ },
+ {
+ sizeof (script_gurmukhi_intervals) / sizeof (uc_interval_t),
+ script_gurmukhi_intervals,
+ "Gurmukhi"
+ },
+ {
+ sizeof (script_gujarati_intervals) / sizeof (uc_interval_t),
+ script_gujarati_intervals,
+ "Gujarati"
+ },
+ {
+ sizeof (script_oriya_intervals) / sizeof (uc_interval_t),
+ script_oriya_intervals,
+ "Oriya"
+ },
+ {
+ sizeof (script_tamil_intervals) / sizeof (uc_interval_t),
+ script_tamil_intervals,
+ "Tamil"
+ },
+ {
+ sizeof (script_telugu_intervals) / sizeof (uc_interval_t),
+ script_telugu_intervals,
+ "Telugu"
+ },
+ {
+ sizeof (script_kannada_intervals) / sizeof (uc_interval_t),
+ script_kannada_intervals,
+ "Kannada"
+ },
+ {
+ sizeof (script_malayalam_intervals) / sizeof (uc_interval_t),
+ script_malayalam_intervals,
+ "Malayalam"
+ },
+ {
+ sizeof (script_sinhala_intervals) / sizeof (uc_interval_t),
+ script_sinhala_intervals,
+ "Sinhala"
+ },
+ {
+ sizeof (script_thai_intervals) / sizeof (uc_interval_t),
+ script_thai_intervals,
+ "Thai"
+ },
+ {
+ sizeof (script_lao_intervals) / sizeof (uc_interval_t),
+ script_lao_intervals,
+ "Lao"
+ },
+ {
+ sizeof (script_tibetan_intervals) / sizeof (uc_interval_t),
+ script_tibetan_intervals,
+ "Tibetan"
+ },
+ {
+ sizeof (script_myanmar_intervals) / sizeof (uc_interval_t),
+ script_myanmar_intervals,
+ "Myanmar"
+ },
+ {
+ sizeof (script_georgian_intervals) / sizeof (uc_interval_t),
+ script_georgian_intervals,
+ "Georgian"
+ },
+ {
+ sizeof (script_hangul_intervals) / sizeof (uc_interval_t),
+ script_hangul_intervals,
+ "Hangul"
+ },
+ {
+ sizeof (script_ethiopic_intervals) / sizeof (uc_interval_t),
+ script_ethiopic_intervals,
+ "Ethiopic"
+ },
+ {
+ sizeof (script_cherokee_intervals) / sizeof (uc_interval_t),
+ script_cherokee_intervals,
+ "Cherokee"
+ },
+ {
+ sizeof (script_canadian_aboriginal_intervals) / sizeof (uc_interval_t),
+ script_canadian_aboriginal_intervals,
+ "Canadian_Aboriginal"
+ },
+ {
+ sizeof (script_ogham_intervals) / sizeof (uc_interval_t),
+ script_ogham_intervals,
+ "Ogham"
+ },
+ {
+ sizeof (script_runic_intervals) / sizeof (uc_interval_t),
+ script_runic_intervals,
+ "Runic"
+ },
+ {
+ sizeof (script_khmer_intervals) / sizeof (uc_interval_t),
+ script_khmer_intervals,
+ "Khmer"
+ },
+ {
+ sizeof (script_mongolian_intervals) / sizeof (uc_interval_t),
+ script_mongolian_intervals,
+ "Mongolian"
+ },
+ {
+ sizeof (script_hiragana_intervals) / sizeof (uc_interval_t),
+ script_hiragana_intervals,
+ "Hiragana"
+ },
+ {
+ sizeof (script_katakana_intervals) / sizeof (uc_interval_t),
+ script_katakana_intervals,
+ "Katakana"
+ },
+ {
+ sizeof (script_bopomofo_intervals) / sizeof (uc_interval_t),
+ script_bopomofo_intervals,
+ "Bopomofo"
+ },
+ {
+ sizeof (script_han_intervals) / sizeof (uc_interval_t),
+ script_han_intervals,
+ "Han"
+ },
+ {
+ sizeof (script_yi_intervals) / sizeof (uc_interval_t),
+ script_yi_intervals,
+ "Yi"
+ },
+ {
+ sizeof (script_old_italic_intervals) / sizeof (uc_interval_t),
+ script_old_italic_intervals,
+ "Old_Italic"
+ },
+ {
+ sizeof (script_gothic_intervals) / sizeof (uc_interval_t),
+ script_gothic_intervals,
+ "Gothic"
+ },
+ {
+ sizeof (script_deseret_intervals) / sizeof (uc_interval_t),
+ script_deseret_intervals,
+ "Deseret"
+ },
+ {
+ sizeof (script_inherited_intervals) / sizeof (uc_interval_t),
+ script_inherited_intervals,
+ "Inherited"
+ },
+ {
+ sizeof (script_tagalog_intervals) / sizeof (uc_interval_t),
+ script_tagalog_intervals,
+ "Tagalog"
+ },
+ {
+ sizeof (script_hanunoo_intervals) / sizeof (uc_interval_t),
+ script_hanunoo_intervals,
+ "Hanunoo"
+ },
+ {
+ sizeof (script_buhid_intervals) / sizeof (uc_interval_t),
+ script_buhid_intervals,
+ "Buhid"
+ },
+ {
+ sizeof (script_tagbanwa_intervals) / sizeof (uc_interval_t),
+ script_tagbanwa_intervals,
+ "Tagbanwa"
+ },
+ {
+ sizeof (script_limbu_intervals) / sizeof (uc_interval_t),
+ script_limbu_intervals,
+ "Limbu"
+ },
+ {
+ sizeof (script_tai_le_intervals) / sizeof (uc_interval_t),
+ script_tai_le_intervals,
+ "Tai_Le"
+ },
+ {
+ sizeof (script_linear_b_intervals) / sizeof (uc_interval_t),
+ script_linear_b_intervals,
+ "Linear_B"
+ },
+ {
+ sizeof (script_ugaritic_intervals) / sizeof (uc_interval_t),
+ script_ugaritic_intervals,
+ "Ugaritic"
+ },
+ {
+ sizeof (script_shavian_intervals) / sizeof (uc_interval_t),
+ script_shavian_intervals,
+ "Shavian"
+ },
+ {
+ sizeof (script_osmanya_intervals) / sizeof (uc_interval_t),
+ script_osmanya_intervals,
+ "Osmanya"
+ },
+ {
+ sizeof (script_cypriot_intervals) / sizeof (uc_interval_t),
+ script_cypriot_intervals,
+ "Cypriot"
+ },
+ {
+ sizeof (script_braille_intervals) / sizeof (uc_interval_t),
+ script_braille_intervals,
+ "Braille"
+ },
+ {
+ sizeof (script_buginese_intervals) / sizeof (uc_interval_t),
+ script_buginese_intervals,
+ "Buginese"
+ },
+ {
+ sizeof (script_coptic_intervals) / sizeof (uc_interval_t),
+ script_coptic_intervals,
+ "Coptic"
+ },
+ {
+ sizeof (script_new_tai_lue_intervals) / sizeof (uc_interval_t),
+ script_new_tai_lue_intervals,
+ "New_Tai_Lue"
+ },
+ {
+ sizeof (script_glagolitic_intervals) / sizeof (uc_interval_t),
+ script_glagolitic_intervals,
+ "Glagolitic"
+ },
+ {
+ sizeof (script_tifinagh_intervals) / sizeof (uc_interval_t),
+ script_tifinagh_intervals,
+ "Tifinagh"
+ },
+ {
+ sizeof (script_syloti_nagri_intervals) / sizeof (uc_interval_t),
+ script_syloti_nagri_intervals,
+ "Syloti_Nagri"
+ },
+ {
+ sizeof (script_old_persian_intervals) / sizeof (uc_interval_t),
+ script_old_persian_intervals,
+ "Old_Persian"
+ },
+ {
+ sizeof (script_kharoshthi_intervals) / sizeof (uc_interval_t),
+ script_kharoshthi_intervals,
+ "Kharoshthi"
+ },
+ {
+ sizeof (script_balinese_intervals) / sizeof (uc_interval_t),
+ script_balinese_intervals,
+ "Balinese"
+ },
+ {
+ sizeof (script_cuneiform_intervals) / sizeof (uc_interval_t),
+ script_cuneiform_intervals,
+ "Cuneiform"
+ },
+ {
+ sizeof (script_phoenician_intervals) / sizeof (uc_interval_t),
+ script_phoenician_intervals,
+ "Phoenician"
+ },
+ {
+ sizeof (script_phags_pa_intervals) / sizeof (uc_interval_t),
+ script_phags_pa_intervals,
+ "Phags_Pa"
+ },
+ {
+ sizeof (script_nko_intervals) / sizeof (uc_interval_t),
+ script_nko_intervals,
+ "Nko"
+ },
+ {
+ sizeof (script_sundanese_intervals) / sizeof (uc_interval_t),
+ script_sundanese_intervals,
+ "Sundanese"
+ },
+ {
+ sizeof (script_lepcha_intervals) / sizeof (uc_interval_t),
+ script_lepcha_intervals,
+ "Lepcha"
+ },
+ {
+ sizeof (script_ol_chiki_intervals) / sizeof (uc_interval_t),
+ script_ol_chiki_intervals,
+ "Ol_Chiki"
+ },
+ {
+ sizeof (script_vai_intervals) / sizeof (uc_interval_t),
+ script_vai_intervals,
+ "Vai"
+ },
+ {
+ sizeof (script_saurashtra_intervals) / sizeof (uc_interval_t),
+ script_saurashtra_intervals,
+ "Saurashtra"
+ },
+ {
+ sizeof (script_kayah_li_intervals) / sizeof (uc_interval_t),
+ script_kayah_li_intervals,
+ "Kayah_Li"
+ },
+ {
+ sizeof (script_rejang_intervals) / sizeof (uc_interval_t),
+ script_rejang_intervals,
+ "Rejang"
+ },
+ {
+ sizeof (script_lycian_intervals) / sizeof (uc_interval_t),
+ script_lycian_intervals,
+ "Lycian"
+ },
+ {
+ sizeof (script_carian_intervals) / sizeof (uc_interval_t),
+ script_carian_intervals,
+ "Carian"
+ },
+ {
+ sizeof (script_lydian_intervals) / sizeof (uc_interval_t),
+ script_lydian_intervals,
+ "Lydian"
+ },
+ {
+ sizeof (script_cham_intervals) / sizeof (uc_interval_t),
+ script_cham_intervals,
+ "Cham"
+ }
+};
+#define script_header_0 16
+#define script_header_1 15
+#define script_header_2 7
+#define script_header_3 511
+#define script_header_4 127
+static const
+struct
+ {
+ int level1[15];
+ short level2[4 << 9];
+ unsigned char level3[138 << 7];
+ }
+u_script =
+{
+ {
+ 0, 512, 1024, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1536
+ },
+ {
+ 0, 128, 256, 256, 256, 384, 512, 640,
+ 768, 768, 896, 1024, 1152, 1280, 1408, 1536,
+ -1, -1, 1664, 1792, 1920, 2048, 2176, 2304,
+ 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328,
+ 3456, 3584, 3712, 3840, 3968, 4096, 4224, 4352,
+ 4480, 4608, 4608, 4608, 4736, 4864, 4992, 5120,
+ 5248, 5376, 5504, 5632, 5760, -1, 5888, 6016,
+ 6144, -1, 6272, 6400, 256, 256, 6528, 6656,
+ 6784, 6912, 7040, 7168, 7296, 7296, 7296, 7424,
+ 7552, 7296, 7296, 7296, 7296, 7680, 7808, 7936,
+ 8064, 8064, 7296, 7296, 7296, 7296, 8192, -1,
+ 8320, 8448, 8576, 8704, 8832, 8960, 9088, 9216,
+ 9344, 9472, 9600, 9728, 9856, 9984, 10112, 7296,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 10240, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 10368,
+ 10496, 10496, 10496, 10496, 10496, 10496, 10496, 10496,
+ 10496, 10624, 10752, 10752, 10880, 11008, 11136, 11264,
+ 11392, 11520, 11648, -1, 11776, -1, -1, -1,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 11904,
+ 11904, 11904, 11904, 11904, 11904, 11904, 11904, 12032,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 9088, 9088, 12160, 12288, 12416, 12544,
+ 12672, 12672, 12800, 12928, 13056, 13184, 13312, 13440,
+ 13568, 13696, 13824, 13952, -1, 14080, 14208, 14336,
+ 14464, 14592, -1, -1, -1, -1, -1, -1,
+ 14720, -1, 14848, -1, 14976, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15232, -1,
+ 15360, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7296, 15488, 15616, 15744, 15872, -1, 16000, -1,
+ 16128, 16256, 16384, 7296, 7296, 16512, 7296, 16640,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 16768, 16896, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 17024, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9088, 9088, 9088, 9088, 17152, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 17280, -1, 17408, 17536, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 2, 2, 2, 2, 0, 2, 2, 2,
+ 255, 255, 2, 2, 2, 2, 0, 255,
+ 255, 255, 255, 255, 2, 0, 2, 0,
+ 2, 2, 2, 255, 2, 255, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 255, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 255,
+ 255, 4, 4, 4, 4, 4, 4, 4,
+ 255, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 255, 0, 4, 255, 255, 255, 255, 255,
+ 255, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 255, 255, 255, 255, 255,
+ 5, 5, 5, 5, 5, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 255, 255, 6, 6,
+ 6, 6, 6, 6, 0, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 0, 255, 255, 6, 0,
+ 255, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 0, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 6, 6, 6, 6, 6,
+ 40, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 0, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 255, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 255, 255, 7, 7, 7,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 255, 255, 255, 255, 255,
+ 255, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 255, 255, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 255, 255,
+ 9, 40, 40, 9, 9, 255, 255, 255,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 9, 9, 255, 255, 255, 255, 255,
+ 255, 255, 255, 9, 9, 9, 9, 9,
+ 255, 10, 10, 10, 255, 10, 10, 10,
+ 10, 10, 10, 10, 10, 255, 255, 10,
+ 10, 255, 255, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 255, 10, 10, 10, 10, 10, 10,
+ 10, 255, 10, 255, 255, 255, 10, 10,
+ 10, 10, 255, 255, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 255, 255, 10,
+ 10, 255, 255, 10, 10, 10, 10, 255,
+ 255, 255, 255, 255, 255, 255, 255, 10,
+ 255, 255, 255, 255, 10, 10, 255, 10,
+ 10, 10, 10, 10, 255, 255, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 255, 255, 255, 255, 255,
+ 255, 11, 11, 11, 255, 11, 11, 11,
+ 11, 11, 11, 255, 255, 255, 255, 11,
+ 11, 255, 255, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 255, 11, 11, 11, 11, 11, 11,
+ 11, 255, 11, 11, 255, 11, 11, 255,
+ 11, 11, 255, 255, 11, 255, 11, 11,
+ 11, 11, 11, 255, 255, 255, 255, 11,
+ 11, 255, 255, 11, 11, 11, 255, 255,
+ 255, 11, 255, 255, 255, 255, 255, 255,
+ 255, 11, 11, 11, 11, 255, 11, 255,
+ 255, 255, 255, 255, 255, 255, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 12, 12, 12, 255, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 255, 12,
+ 12, 12, 255, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 255, 12, 12, 12, 12, 12, 12,
+ 12, 255, 12, 12, 255, 12, 12, 12,
+ 12, 12, 255, 255, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 255, 12,
+ 12, 12, 255, 12, 12, 12, 255, 255,
+ 12, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 12, 12, 12, 12, 255, 255, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 255, 12, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 13, 13, 13, 255, 13, 13, 13,
+ 13, 13, 13, 13, 13, 255, 255, 13,
+ 13, 255, 255, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 255, 13, 13, 13, 13, 13, 13,
+ 13, 255, 13, 13, 255, 13, 13, 13,
+ 13, 13, 255, 255, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 255, 255, 13,
+ 13, 255, 255, 13, 13, 13, 255, 255,
+ 255, 255, 255, 255, 255, 255, 13, 13,
+ 255, 255, 255, 255, 13, 13, 255, 13,
+ 13, 13, 13, 13, 255, 255, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 14, 14, 255, 14, 14, 14,
+ 14, 14, 14, 255, 255, 255, 14, 14,
+ 14, 255, 14, 14, 14, 14, 255, 255,
+ 255, 14, 14, 255, 14, 255, 14, 14,
+ 255, 255, 255, 14, 14, 255, 255, 255,
+ 14, 14, 14, 255, 255, 255, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 255, 255, 255, 255, 14, 14,
+ 14, 14, 14, 255, 255, 255, 14, 14,
+ 14, 255, 14, 14, 14, 14, 255, 255,
+ 14, 255, 255, 255, 255, 255, 255, 14,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 255, 255, 255, 255, 255,
+ 255, 15, 15, 15, 255, 15, 15, 15,
+ 15, 15, 15, 15, 15, 255, 15, 15,
+ 15, 255, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 255, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 255, 15, 15, 15,
+ 15, 15, 255, 255, 255, 15, 15, 15,
+ 15, 15, 15, 15, 15, 255, 15, 15,
+ 15, 255, 15, 15, 15, 15, 255, 255,
+ 255, 255, 255, 255, 255, 15, 15, 255,
+ 15, 15, 255, 255, 255, 255, 255, 255,
+ 15, 15, 15, 15, 255, 255, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 255, 255, 16, 16, 255, 16, 16, 16,
+ 16, 16, 16, 16, 16, 255, 16, 16,
+ 16, 255, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 255, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 255, 16, 16, 16,
+ 16, 16, 255, 255, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 255, 16, 16,
+ 16, 255, 16, 16, 16, 16, 255, 255,
+ 255, 255, 255, 255, 255, 16, 16, 255,
+ 255, 255, 255, 255, 255, 255, 16, 255,
+ 16, 16, 16, 16, 255, 255, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 255, 0, 0, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 17, 17, 255, 17, 17, 17,
+ 17, 17, 17, 17, 17, 255, 17, 17,
+ 17, 255, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 255, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 255, 255, 255, 17, 17, 17,
+ 17, 17, 17, 17, 17, 255, 17, 17,
+ 17, 255, 17, 17, 17, 17, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 17,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 17, 17, 17, 17, 255, 255, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 255, 255,
+ 255, 17, 17, 17, 17, 17, 17, 17,
+ 255, 255, 18, 18, 255, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 255,
+ 255, 255, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 255, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 255, 18, 255, 255,
+ 18, 18, 18, 18, 18, 18, 18, 255,
+ 255, 255, 18, 255, 255, 255, 255, 18,
+ 18, 18, 18, 18, 18, 255, 18, 255,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 18, 18, 18, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 255, 255, 255, 255, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 20, 20, 255, 20, 255, 255, 20,
+ 20, 255, 20, 255, 255, 20, 255, 255,
+ 255, 255, 255, 255, 20, 20, 20, 20,
+ 255, 20, 20, 20, 20, 20, 20, 20,
+ 255, 20, 20, 20, 255, 20, 255, 20,
+ 255, 255, 20, 20, 255, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 255, 20, 20, 20, 255, 255,
+ 20, 20, 20, 20, 20, 255, 20, 255,
+ 20, 20, 20, 20, 20, 20, 255, 255,
+ 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 255, 255, 20, 20, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 255, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 255, 255, 255,
+ 255, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 255, 255, 255, 255,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 255, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 255, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 255, 21, 21,
+ 21, 21, 21, 21, 21, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 255, 255, 255, 255, 22, 22,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 0, 23, 255, 255, 255,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 255, 255, 255, 255, 255, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 255, 255, 255, 255, 255,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 255, 255, 255, 255, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 255, 255, 255, 255, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 255, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 255, 255, 255, 255, 255, 255,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 255, 255, 255,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 0, 0, 0, 29, 29,
+ 29, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 255, 41, 41,
+ 41, 41, 41, 41, 41, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 0, 0, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 255, 44, 44,
+ 44, 255, 44, 44, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 255, 255,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 255, 255, 255, 255, 255, 255,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 255, 255, 255, 255, 255, 255,
+ 31, 31, 0, 0, 31, 0, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 255,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 255, 255, 255, 255, 255, 255,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 255, 255, 255,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 255, 255, 255, 255,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 255, 255, 255, 255,
+ 45, 255, 255, 255, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 255, 255,
+ 46, 46, 46, 46, 46, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 255, 255, 255, 255, 255, 255,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 255, 255, 255, 255, 255, 255,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 255, 255, 255, 255, 55, 55,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 255, 255, 53, 53,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 255, 255, 255, 255,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 255, 255, 255,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 255, 255, 255, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 255, 255, 255, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 255, 255, 255, 67, 67, 67,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2, 2,
+ 2, 2, 2, 3, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 2, 2,
+ 2, 2, 1, 1, 1, 1, 2, 2,
+ 2, 2, 2, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 3, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 40, 40,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 255, 2, 255, 2, 255, 2, 255, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 255, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 255, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 255, 255, 2, 2,
+ 2, 2, 2, 2, 255, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 255, 255, 2, 2, 2, 255, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 40, 40, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 255, 255,
+ 255, 255, 0, 0, 0, 0, 0, 0,
+ 0, 1, 255, 255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 1, 1, 1, 1, 1, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0,
+ 255, 255, 255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 255, 255,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 255, 255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 0, 255, 0,
+ 0, 0, 0, 255, 255, 255, 0, 255,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 0, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 255, 255,
+ 0, 0, 0, 0, 0, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 255,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 255,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 255, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 255, 255,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 54, 54, 54, 54, 54, 54, 54,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 57,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 255, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 35, 0, 35,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 40, 40, 40, 40, 40, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 35, 35, 35, 0, 0, 0, 0,
+ 255, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 255,
+ 255, 40, 40, 0, 0, 32, 32, 32,
+ 0, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 0, 0, 33, 33, 33,
+ 255, 255, 255, 255, 255, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 255, 255,
+ 255, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 255,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 255, 255, 255,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 255, 255, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 255, 255, 255, 255,
+ 255, 255, 255, 255, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 1, 1, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 1, 1, 1, 1, 1,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 72,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 255, 255,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 255, 255, 76, 76, 76, 76,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 1, 1, 1, 1, 1, 1, 1, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 4, 4, 4, 4, 4,
+ 255, 255, 255, 255, 255, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 255,
+ 5, 5, 5, 5, 5, 255, 5, 255,
+ 5, 5, 255, 5, 5, 255, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 0, 0,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 255, 255, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 0, 255, 255,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 40, 40, 40, 40, 40, 40, 40, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 6, 6, 6, 6, 6, 255, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 255, 255, 0,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 0, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 0, 0,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 255,
+ 255, 255, 24, 24, 24, 24, 24, 24,
+ 255, 255, 24, 24, 24, 24, 24, 24,
+ 255, 255, 24, 24, 24, 24, 24, 24,
+ 255, 255, 24, 24, 24, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 0, 0, 0, 0, 0, 255, 255,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 255, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 255,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 255, 47, 47, 255, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 255, 255,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 255, 255, 255, 255, 255,
+ 0, 0, 0, 255, 255, 255, 255, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 40, 255, 255,
+ 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 255, 255, 255,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 255,
+ 37, 37, 37, 37, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 255, 48,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 255, 255, 255, 255,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 255, 255,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 51, 51, 51, 51, 51, 51, 255, 255,
+ 51, 255, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 255, 51,
+ 51, 255, 255, 255, 51, 255, 255, 51,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 255, 255, 255, 255, 255, 63,
+ 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 255, 255, 255, 255, 255, 75,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 60, 60, 60, 60, 255, 60, 60, 255,
+ 255, 255, 255, 255, 60, 60, 60, 60,
+ 60, 60, 60, 60, 255, 60, 60, 60,
+ 255, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 255, 255, 255, 255,
+ 60, 60, 60, 255, 255, 255, 255, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 62, 62, 62, 62, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 40,
+ 40, 40, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 40, 40, 40, 40, 40,
+ 40, 40, 40, 0, 0, 40, 40, 40,
+ 40, 40, 40, 40, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 40, 40, 40, 40, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 255, 255, 0, 255, 255, 0, 0, 255,
+ 255, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 0,
+ 0, 0, 0, 255, 255, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 0, 255,
+ 0, 0, 0, 0, 0, 255, 0, 255,
+ 255, 255, 0, 0, 0, 0, 0, 0,
+ 0, 255, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 0, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255
+ }
+};
diff --git a/gnulib/lib/unictype/scripts_byname.gperf b/gnulib/lib/unictype/scripts_byname.gperf
new file mode 100644
index 00000000..c3ebfaea
--- /dev/null
+++ b/gnulib/lib/unictype/scripts_byname.gperf
@@ -0,0 +1,89 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Unicode scripts. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+struct named_script { const char *name; unsigned int index; };
+%struct-type
+%language=ANSI-C
+%define hash-function-name scripts_hash
+%define lookup-function-name uc_script_lookup
+%readonly-tables
+%global-table
+%define word-array-name script_names
+%%
+Common, 0
+Latin, 1
+Greek, 2
+Cyrillic, 3
+Armenian, 4
+Hebrew, 5
+Arabic, 6
+Syriac, 7
+Thaana, 8
+Devanagari, 9
+Bengali, 10
+Gurmukhi, 11
+Gujarati, 12
+Oriya, 13
+Tamil, 14
+Telugu, 15
+Kannada, 16
+Malayalam, 17
+Sinhala, 18
+Thai, 19
+Lao, 20
+Tibetan, 21
+Myanmar, 22
+Georgian, 23
+Hangul, 24
+Ethiopic, 25
+Cherokee, 26
+Canadian_Aboriginal, 27
+Ogham, 28
+Runic, 29
+Khmer, 30
+Mongolian, 31
+Hiragana, 32
+Katakana, 33
+Bopomofo, 34
+Han, 35
+Yi, 36
+Old_Italic, 37
+Gothic, 38
+Deseret, 39
+Inherited, 40
+Tagalog, 41
+Hanunoo, 42
+Buhid, 43
+Tagbanwa, 44
+Limbu, 45
+Tai_Le, 46
+Linear_B, 47
+Ugaritic, 48
+Shavian, 49
+Osmanya, 50
+Cypriot, 51
+Braille, 52
+Buginese, 53
+Coptic, 54
+New_Tai_Lue, 55
+Glagolitic, 56
+Tifinagh, 57
+Syloti_Nagri, 58
+Old_Persian, 59
+Kharoshthi, 60
+Balinese, 61
+Cuneiform, 62
+Phoenician, 63
+Phags_Pa, 64
+Nko, 65
+Sundanese, 66
+Lepcha, 67
+Ol_Chiki, 68
+Vai, 69
+Saurashtra, 70
+Kayah_Li, 71
+Rejang, 72
+Lycian, 73
+Carian, 74
+Lydian, 75
+Cham, 76
diff --git a/gnulib/lib/unictype/sy_c_ident.c b/gnulib/lib/unictype/sy_c_ident.c
new file mode 100644
index 00000000..3d898416
--- /dev/null
+++ b/gnulib/lib/unictype/sy_c_ident.c
@@ -0,0 +1,31 @@
+/* Syntax properties of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "sy_c_ident.h"
+#define TABLE u_c_ident
+#include "identsyntaxmap.h"
+
+int
+uc_c_ident_category (ucs4_t uc)
+{
+ return identsyntax_lookup (uc);
+}
diff --git a/gnulib/lib/unictype/sy_c_ident.h b/gnulib/lib/unictype/sy_c_ident.h
new file mode 100644
index 00000000..74d96edb
--- /dev/null
+++ b/gnulib/lib/unictype/sy_c_ident.h
@@ -0,0 +1,140 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Language syntax properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define identsyntax_header_0 12
+#define identsyntax_header_1 14
+#define identsyntax_header_2 7
+#define identsyntax_header_3 31
+#define identsyntax_header_4 127
+static const
+struct
+ {
+ int level1[14];
+ short level2[9 << 5];
+ unsigned short level3[39 * 16];
+ }
+u_c_ident =
+{
+ {
+ 0, 32, 64, 96, 128, 160, 160, 160,
+ 160, 192, 224, 160, 160, 256
+ },
+ {
+ 0, 128, 256, 384, 512, 640, 768, 896,
+ 1024, 1152, 1280, 1408, 1536, 1664, -1, -1,
+ -1, -1, 1792, 1920, 2048, 2176, 2304, 2432,
+ 2560, 2688, 2816, -1, 2944, 3072, 3200, 3328,
+ -1, 3456, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 256, 3584, 3712, 3840,
+ 3968, -1, 4096, 4224, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4352, 4480, 4608, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 4736,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 4864,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x5555, 0xaaa5,
+ 0x0002, 0x0000, 0x0000, 0x2a80, 0x0002, 0x0000, 0x0000, 0xaa80,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaa8a, 0x22aa, 0xaa8a,
+ 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x000a,
+ 0x0000, 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa8, 0x0000, 0x0228,
+ 0xaaa0, 0xaaaa, 0xaaa0, 0xaaaa, 0xa800, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaa8a,
+ 0x8aaa, 0x0880, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8000, 0x8000, 0x888a, 0x0008, 0x0000, 0xaa00, 0xaaaa,
+ 0x0002, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0002, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xaaa0, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2800, 0xa828, 0x0000, 0x0000, 0x0000, 0x0a00, 0xa000, 0xaaa0,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0002, 0x0000,
+ 0x0000, 0x0000, 0x8000, 0xaaa2, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x2020,
+ 0xaa82, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xaa80, 0xaa80, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0002, 0x0000, 0x0000, 0xaa80,
+ 0x0000, 0x0000, 0xaa80, 0xaaaa, 0x0000, 0xaaa0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x800a,
+ 0x0000, 0x8000, 0x0000, 0xa800, 0x02aa, 0xa008, 0x0000, 0xaaa0,
+ 0x0202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0,
+ 0x0000, 0xa000, 0xaa80, 0x0000, 0x0a00, 0x0000, 0xaaaa, 0xaaaa,
+ 0x0202, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0a88, 0x0aa0,
+ 0x2800, 0xa028, 0xaaaa, 0x20aa, 0x0a00, 0x0000, 0xaaa0, 0xaaaa,
+ 0x028a, 0x2a80, 0x0028, 0x0000, 0x0000, 0x0008, 0x8208, 0x0aa0,
+ 0x2a80, 0xa028, 0xaaaa, 0x8802, 0x0aaa, 0x0000, 0xa8aa, 0xaaaa,
+ 0x0202, 0x2200, 0x0020, 0x0000, 0x0000, 0x0008, 0x0208, 0x02a0,
+ 0x2000, 0xa020, 0xaaa8, 0xaaaa, 0x0aa8, 0x0000, 0xaaaa, 0xaaaa,
+ 0x0202, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0a08, 0x02a0,
+ 0x2a00, 0xa028, 0xaaaa, 0x20aa, 0x0aa0, 0x0000, 0xaaaa, 0xaaaa,
+ 0x020a, 0x0a80, 0xa008, 0x0882, 0xa82a, 0x0a80, 0x2000, 0x0aa0,
+ 0x0a80, 0xa008, 0xaaaa, 0xaaaa, 0x2aaa, 0x0000, 0xaaaa, 0xaaaa,
+ 0x0202, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0200, 0x0aa0,
+ 0x0800, 0xa008, 0xaaaa, 0xaaaa, 0x0aa0, 0x0000, 0xaaaa, 0xaaaa,
+ 0x020a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0200, 0x0aa0,
+ 0x0800, 0xa008, 0xaaaa, 0x8aaa, 0x0aa0, 0x0000, 0xaaaa, 0xaaaa,
+ 0x020a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0000, 0x0aa0,
+ 0x0a00, 0xa008, 0xaaaa, 0xaaaa, 0x0aa0, 0x0000, 0xaaaa, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80,
+ 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x2882, 0xa288, 0x00aa, 0x0002, 0x2202, 0x820a, 0x0000, 0xa020,
+ 0x8800, 0xa000, 0x0000, 0xa0a0, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaa8, 0xaaaa, 0xaaaa, 0xaaa0, 0x0000, 0x0000, 0x2200, 0x0aa2,
+ 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0xaaa0, 0x0002, 0x0000,
+ 0x0800, 0xaa00, 0x2000, 0x0002, 0x0000, 0xa000, 0x0002, 0xaaa2,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xa000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xaa00, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa0,
+ 0x0000, 0x0000, 0xa000, 0xa000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xa000, 0xa000, 0x0000, 0x2222, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x8800,
+ 0x080a, 0xa800, 0x0a00, 0xaa00, 0x0000, 0xa800, 0x080a, 0xa800,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x2aaa,
+ 0xaaa8, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x2aaa,
+ 0x2a8a, 0x000a, 0xa200, 0xa000, 0x88aa, 0x0008, 0x0020, 0xaaa8,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xaa80, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x02aa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0002, 0xaaa0, 0xaaaa, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xaa00, 0xa82a, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xa82a,
+ 0x02aa, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa
+ }
+};
diff --git a/gnulib/lib/unictype/sy_c_whitespace.c b/gnulib/lib/unictype/sy_c_whitespace.c
new file mode 100644
index 00000000..989838f4
--- /dev/null
+++ b/gnulib/lib/unictype/sy_c_whitespace.c
@@ -0,0 +1,27 @@
+/* Syntax properties of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_c_whitespace (ucs4_t uc)
+{
+ return (uc == ' ' || (uc <= 0x000D && uc >= 0x0009));
+}
diff --git a/gnulib/lib/unictype/sy_c_whitespace.h b/gnulib/lib/unictype/sy_c_whitespace.h
new file mode 100644
index 00000000..132b3b45
--- /dev/null
+++ b/gnulib/lib/unictype/sy_c_whitespace.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Language syntax properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_c_whitespace =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003E00, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/sy_java_ident.c b/gnulib/lib/unictype/sy_java_ident.c
new file mode 100644
index 00000000..1defc2b3
--- /dev/null
+++ b/gnulib/lib/unictype/sy_java_ident.c
@@ -0,0 +1,31 @@
+/* Syntax properties of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "sy_java_ident.h"
+#define TABLE u_java_ident
+#include "identsyntaxmap.h"
+
+int
+uc_java_ident_category (ucs4_t uc)
+{
+ return identsyntax_lookup (uc);
+}
diff --git a/gnulib/lib/unictype/sy_java_ident.h b/gnulib/lib/unictype/sy_java_ident.h
new file mode 100644
index 00000000..bad2b036
--- /dev/null
+++ b/gnulib/lib/unictype/sy_java_ident.h
@@ -0,0 +1,343 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Language syntax properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define identsyntax_header_0 12
+#define identsyntax_header_1 225
+#define identsyntax_header_2 7
+#define identsyntax_header_3 31
+#define identsyntax_header_4 127
+static const
+struct
+ {
+ int level1[225];
+ short level2[16 << 5];
+ unsigned short level3[113 * 16];
+ }
+u_java_ident =
+{
+ {
+ 0, 32, 64, 96, 128, 160, 160, 160,
+ 160, 192, 224, 160, 160, 256, -1, 288,
+ 320, -1, 352, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 384, -1, -1,
+ 160, 160, 160, 160, 160, 160, 160, 160,
+ 160, 160, 416, -1, -1, -1, -1, 448,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 480
+ },
+ {
+ 0, 128, 256, 256, 256, 384, 512, 640,
+ 256, 768, 896, 1024, 1152, 1280, 1408, 1536,
+ -1, -1, 1664, 1792, 1920, 2048, 2176, 2304,
+ 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328,
+ 3456, 3584, 3712, 3840, 3968, 4096, 4224, 4352,
+ 4480, 256, 256, 256, 4608, 4736, 4864, 4992,
+ 5120, 5248, 5376, 5504, 5632, -1, 5760, 5888,
+ 6016, -1, 256, 6144, 256, 256, 6272, 6400,
+ 6528, 6656, 6784, 6912, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7040, 7168, 7296, 7424, 7552, -1, -1, -1,
+ 7680, 7808, 7936, 8064, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 8192, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 8320,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 8448, 256, 256, 8576, 8704, 8832, 8960,
+ 9088, 9216, 9344, -1, 9472, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 9600,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 256, 256, 9728, 9856, 9984, 10112,
+ 256, 256, 10240, 10368, 10496, 10624, 10752, 10880,
+ 11008, 11136, 11264, 11392, -1, 11520, 11648, 11776,
+ 256, 11904, -1, -1, -1, -1, -1, -1,
+ 12032, -1, 12160, -1, 12288, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 12416, -1,
+ 12544, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 12672, 12800, 12928, -1, -1, -1,
+ 13056, 13184, 13312, 256, 256, 13440, 13568, 13696,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 13824, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 13952, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 14080, -1, 14208, 14336, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0xffff, 0xfaab, 0xffff, 0xaaff, 0xa8aa, 0xaaaa, 0x5555, 0xaaa5,
+ 0x0002, 0x0000, 0x0000, 0x2a80, 0x0002, 0x0000, 0x0000, 0xea80,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xa00a, 0xae8a, 0xa2aa, 0xaa8a,
+ 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0aa0, 0x0000, 0xaaa0, 0xaaaa, 0xa800, 0x88aa, 0xaaaa, 0xaaaa,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x0800, 0xa00a,
+ 0x8aaa, 0x0880, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000,
+ 0x5560, 0x000a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, 0x0002, 0x0000,
+ 0x0000, 0x0000, 0x8000, 0xaaa2, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaaa, 0x5556, 0x5555, 0x5555, 0x5555, 0x5555, 0x6555,
+ 0x6596, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xaa80, 0xaa80, 0xaaaa,
+ 0xaaff, 0xaa2a, 0x5555, 0xaa95, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5540, 0x5555, 0x9555, 0x5555, 0x0aa5, 0x0001, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5200, 0x6d55, 0x4155, 0x0559, 0x5555, 0x2805,
+ 0xaaaa, 0xeaaa, 0x0004, 0x0000, 0x0000, 0x0000, 0x5555, 0x5555,
+ 0x5555, 0x0295, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5000, 0x5555, 0xaaa1, 0xaaaa,
+ 0x5555, 0x0005, 0x0000, 0x0000, 0x0000, 0x5540, 0xa055, 0xaa8a,
+ 0x0056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51a0,
+ 0x5555, 0xa555, 0xa954, 0x0000, 0x5a50, 0x5555, 0xaa82, 0x002a,
+ 0x0256, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0a88, 0x51a0,
+ 0x6955, 0x8569, 0x6aaa, 0x20aa, 0x5a50, 0x5555, 0xaa00, 0xaaaa,
+ 0x0256, 0x2a80, 0x0028, 0x0000, 0x0000, 0x0008, 0x8208, 0x59a0,
+ 0x6a95, 0xa569, 0xaaa6, 0x8802, 0x5aaa, 0x5555, 0xa405, 0xaaaa,
+ 0x0256, 0x2000, 0x0020, 0x0000, 0x0000, 0x0008, 0x0208, 0x51a0,
+ 0x6555, 0xa565, 0xaaa8, 0xaaaa, 0x5a50, 0x5555, 0xaaa2, 0xaaaa,
+ 0x0256, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0208, 0x51a0,
+ 0x6955, 0xa569, 0x5aaa, 0x20aa, 0x5a50, 0x5555, 0xaaa2, 0xaaaa,
+ 0x021a, 0x0a80, 0xa008, 0x0882, 0xa82a, 0x0a80, 0x0000, 0x5aa0,
+ 0x5a95, 0xa559, 0x6aa8, 0xaaaa, 0x5aaa, 0x5555, 0xaaaa, 0xaaa2,
+ 0x0256, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0200, 0x52a0,
+ 0x5955, 0xa559, 0x96aa, 0xaaa0, 0x5a50, 0x5555, 0xaaaa, 0xaaaa,
+ 0x025a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0200, 0x51a0,
+ 0x5955, 0xa559, 0x96aa, 0x8aaa, 0x5a50, 0x5555, 0xaaaa, 0xaaaa,
+ 0x025a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0000, 0x52a0,
+ 0x5955, 0xa559, 0x6aaa, 0xaaaa, 0x5a50, 0x5555, 0xaaaa, 0x000a,
+ 0x025a, 0x0000, 0x8000, 0x000a, 0x0000, 0x0000, 0x0020, 0xa200,
+ 0x8000, 0x6a9a, 0x9955, 0x5555, 0xaaaa, 0xaaaa, 0xaa5a, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5504, 0x2a95,
+ 0x4000, 0x9555, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x2882, 0xa288, 0x00aa, 0x0002, 0x2202, 0x020a, 0x5504, 0xa165,
+ 0x8800, 0xa555, 0x5555, 0xa0a5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaa8, 0xaaaa, 0xaaaa, 0xaaa5, 0x5555, 0xaaa5, 0x66aa, 0x5aa6,
+ 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0xa800, 0x5556, 0x5555,
+ 0x5955, 0xaa00, 0x5555, 0x5556, 0x5555, 0x5555, 0x5555, 0xa955,
+ 0x9aaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5540, 0x5555, 0x1555,
+ 0x5555, 0xaaa5, 0x5000, 0x5005, 0x4151, 0x0555, 0x0154, 0x0000,
+ 0x5550, 0x4555, 0x5555, 0xaaa5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xa000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa880,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2aa0, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xa008, 0x8000, 0xa008, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xa008, 0x0000, 0x0000, 0x0000, 0x0000, 0xa008, 0x8000,
+ 0xa008, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xa008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6a80, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2800, 0x8000, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0xaa80, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a80, 0xaaa8, 0xaaaa,
+ 0x0000, 0x0800, 0xa950, 0xaaaa, 0x0000, 0x0000, 0xa950, 0xaaaa,
+ 0x0000, 0x0000, 0xaa50, 0xaaaa, 0x0000, 0x0800, 0xaa58, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f00, 0x5555,
+ 0x5555, 0x5555, 0x2a55, 0xa42a, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xa56a, 0x5555, 0xaaa5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa84, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xa800, 0x5555, 0xaa55, 0x5555, 0xaa55,
+ 0x5aaa, 0x5555, 0x0000, 0x0000, 0x0000, 0xa000, 0xa800, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa0, 0x5555, 0x5555,
+ 0x0001, 0xaaa5, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x4000, 0xaa55, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0155, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5500, 0x5555,
+ 0x0155, 0xaa00, 0x5555, 0xaaa5, 0xaaaa, 0x556a, 0xaa55, 0xaaaa,
+ 0x0015, 0x0000, 0x0000, 0x0000, 0x5554, 0x0a95, 0x5555, 0xaaa5,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5500, 0x5555, 0x5555, 0xaaaa,
+ 0x5555, 0x02a5, 0x5555, 0x0005, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x9555, 0xaaaa, 0xaaaa, 0x5aaa,
+ 0x0000, 0x0000, 0xa000, 0xa000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xa000, 0xa000, 0x0000, 0x2222, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x8800,
+ 0x080a, 0xa800, 0x0a00, 0xaa00, 0x0000, 0xa800, 0x080a, 0xa800,
+ 0xaaaa, 0xffea, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffa, 0xaaaa, 0x2aaa,
+ 0xaaa8, 0xaaaa, 0xa8aa, 0xaaaa, 0xabff, 0xfffa, 0xaaa2, 0x2aaa,
+ 0xaaaa, 0xaaaa, 0xa800, 0xaaaa, 0x0000, 0x0000, 0xa000, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x5555, 0xa955, 0x56a6, 0x5555, 0xaaa9, 0xaaaa,
+ 0x2a8a, 0x000a, 0xa200, 0xa002, 0x88aa, 0x2008, 0x0000, 0x00a0,
+ 0x02aa, 0x8aa0, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaa8, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0002, 0xa000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x2aaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x8000, 0xaaaa, 0x8000, 0x8000, 0x8000, 0x8000,
+ 0x8000, 0x8000, 0x8000, 0x8000, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x2aaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x02aa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0002, 0x5550, 0xa002, 0xa800,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8000, 0x0296, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080,
+ 0x02aa, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0002, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8000, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0xa800, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0xa800, 0x0000, 0x0000, 0x5555, 0xaa05, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x4000, 0xaaaa, 0x25aa,
+ 0x0000, 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x2aaa, 0x0000, 0x000a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xa828, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x002a,
+ 0x1010, 0x0040, 0x0000, 0x0000, 0x5540, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa,
+ 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5500, 0x5555,
+ 0xa955, 0xaaaa, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x5555, 0x0005, 0x0000, 0x0000, 0x5000, 0xa555, 0x0000, 0x0000,
+ 0x4000, 0x5555, 0xaa55, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5554, 0x9555, 0xaaaa,
+ 0x0040, 0xa500, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xaaa0, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x8000, 0xaaaa, 0x002a, 0x12aa, 0x0000, 0x0008, 0x8000, 0x8800,
+ 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa0, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x002a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x000a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0xa800,
+ 0x5555, 0x5555, 0xaaaa, 0xaaaa, 0x9555, 0xaaaa, 0xa82a, 0xaaaa,
+ 0xaaaa, 0x02aa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaa2, 0x0800, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe800,
+ 0xa8aa, 0xaaaa, 0x5555, 0xaaa5, 0x0002, 0x0000, 0x0000, 0x2a80,
+ 0x0002, 0x0000, 0x0000, 0xaa80, 0x0aaa, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000,
+ 0x000a, 0x000a, 0x000a, 0xa80a, 0x82a0, 0xaaaa, 0xaaaa, 0xaafe,
+ 0x0000, 0x0200, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x2080,
+ 0x0000, 0xa000, 0x0000, 0xa000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xa6aa,
+ 0x0000, 0x0000, 0x0000, 0xa800, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xaaa8, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x8000, 0xaaaa, 0xaaaa, 0x0000, 0x0000,
+ 0x0000, 0xaa80, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xa000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xaa00, 0x0000, 0xa002, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xa000, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xa000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x28a8,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0xa000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xaaa0,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x9654, 0x55aa, 0x0200, 0x0002, 0x0000, 0x0000, 0xaa00, 0x6a95,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x56aa, 0x56a5, 0xffd5, 0x557f,
+ 0x5695, 0xaa55, 0xaaaa, 0xaaaa, 0xaaaa, 0xa55a, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xa95a, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0800, 0x828a, 0x0802, 0x0000, 0x0220,
+ 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2000, 0x0280, 0x0800, 0x0800, 0x0000, 0x0000, 0x0000, 0x8020,
+ 0x8800, 0x000a, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0000, 0x0000, 0x0000,
+ 0x0008, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0080,
+ 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000,
+ 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000,
+ 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000,
+ 0x0080, 0x5a00, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaae, 0xaaaa, 0xaaaa, 0xaaaa, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0xaaaa, 0xaaaa
+ }
+};
diff --git a/gnulib/lib/unictype/sy_java_whitespace.c b/gnulib/lib/unictype/sy_java_whitespace.c
new file mode 100644
index 00000000..34d3afde
--- /dev/null
+++ b/gnulib/lib/unictype/sy_java_whitespace.c
@@ -0,0 +1,27 @@
+/* Syntax properties of Unicode characters.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_java_whitespace (ucs4_t uc)
+{
+ return (uc == ' ' || (uc <= 0x000D && uc >= 0x0009 && uc != 0x000B));
+}
diff --git a/gnulib/lib/unictype/sy_java_whitespace.h b/gnulib/lib/unictype/sy_java_whitespace.h
new file mode 100644
index 00000000..d0547a0e
--- /dev/null
+++ b/gnulib/lib/unictype/sy_java_whitespace.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Language syntax properties of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_java_whitespace =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003600, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unilbrk.h b/gnulib/lib/unilbrk.h
new file mode 100644
index 00000000..49032520
--- /dev/null
+++ b/gnulib/lib/unilbrk.h
@@ -0,0 +1,110 @@
+/* Line breaking of Unicode strings.
+ Copyright (C) 2001-2003, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNILBRK_H
+#define _UNILBRK_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+/* Get locale_charset() declaration. */
+#include "localcharset.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* These functions are locale dependent. The encoding argument identifies
+ the encoding (e.g. "ISO-8859-2" for Polish). */
+
+
+/* Line breaking. */
+
+enum
+{
+ UC_BREAK_UNDEFINED,
+ UC_BREAK_PROHIBITED,
+ UC_BREAK_POSSIBLE,
+ UC_BREAK_MANDATORY,
+ UC_BREAK_HYPHENATION
+};
+
+/* Determine the line break points in S, and store the result at p[0..n-1].
+ p[i] = UC_BREAK_MANDATORY means that s[i] is a line break character.
+ p[i] = UC_BREAK_POSSIBLE means that a line break may be inserted between
+ s[i-1] and s[i].
+ p[i] = UC_BREAK_HYPHENATION means that a hyphen and a line break may be
+ inserted between s[i-1] and s[i]. But beware of language dependent
+ hyphenation rules.
+ p[i] = UC_BREAK_PROHIBITED means that s[i-1] and s[i] must not be separated.
+ */
+extern void
+ u8_possible_linebreaks (const uint8_t *s, size_t n,
+ const char *encoding, char *p);
+extern void
+ u16_possible_linebreaks (const uint16_t *s, size_t n,
+ const char *encoding, char *p);
+extern void
+ u32_possible_linebreaks (const uint32_t *s, size_t n,
+ const char *encoding, char *p);
+extern void
+ ulc_possible_linebreaks (const char *s, size_t n,
+ const char *encoding, char *p);
+
+/* Choose the best line breaks, assuming the uc_width function.
+ 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, they can be given
+ as AT_END_COLUMNS.
+ o is an optional override; if o[i] != UC_BREAK_UNDEFINED, o[i] takes
+ precedence over p[i] as returned by the *_possible_linebreaks function.
+ The given ENCODING is used for disambiguating widths in uc_width.
+ Return the column after the end of the string, and store the result at
+ p[0..n-1].
+ */
+extern int
+ u8_width_linebreaks (const uint8_t *s, size_t n, int width,
+ int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p);
+extern int
+ u16_width_linebreaks (const uint16_t *s, size_t n, int width,
+ int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p);
+extern int
+ u32_width_linebreaks (const uint32_t *s, size_t n, int width,
+ int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p);
+extern int
+ ulc_width_linebreaks (const char *s, size_t n, int width,
+ int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNILBRK_H */
diff --git a/gnulib/lib/unilbrk/lbrkprop1.h b/gnulib/lib/unilbrk/lbrkprop1.h
new file mode 100644
index 00000000..c19b1d38
--- /dev/null
+++ b/gnulib/lib/unilbrk/lbrkprop1.h
@@ -0,0 +1,33 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Line breaking properties of Unicode characters. */
+/* Generated automatically by gen-lbrk for Unicode 5.1.0. */
+
+/* Copyright (C) 2000-2002, 2004, 2008-2010 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/>. */
+
+#define lbrkprop_header_0 16
+#define lbrkprop_header_1 15
+#define lbrkprop_header_2 7
+#define lbrkprop_header_3 511
+#define lbrkprop_header_4 127
+
+typedef struct
+ {
+ int level1[15];
+ int level2[4 << 9];
+ unsigned char level3[142 << 7];
+ }
+lbrkprop_t;
+extern const lbrkprop_t unilbrkprop;
diff --git a/gnulib/lib/unilbrk/lbrkprop2.h b/gnulib/lib/unilbrk/lbrkprop2.h
new file mode 100644
index 00000000..04d837fa
--- /dev/null
+++ b/gnulib/lib/unilbrk/lbrkprop2.h
@@ -0,0 +1,2558 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Line breaking properties of Unicode characters. */
+/* Generated automatically by gen-lbrk for Unicode 5.1.0. */
+
+/* Copyright (C) 2000-2002, 2004, 2008-2010 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/>. */
+
+const lbrkprop_t unilbrkprop =
+{
+ {
+ 0, 512, 1024, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1536
+ },
+ {
+ 0, 128, 256, 256, 256, 384, 512, 640,
+ 256, 768, 896, 1024, 1152, 1280, 1408, 1536,
+ -1, -1, 1664, 1792, 1920, 2048, 2176, 2304,
+ 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328,
+ 3456, 3584, 3712, 3840, 3968, 4096, 4224, 4352,
+ 4480, 256, 256, 256, 4608, 4736, 4864, 4992,
+ 5120, 5248, 5376, 5504, 5632, -1, 5760, 5888,
+ 6016, -1, 256, 6144, 256, 256, 6272, 6400,
+ 6528, 6656, 6784, 6912, 7040, 7168, 7296, 7424,
+ 7552, 7680, 7808, 7936, 8064, 8192, 8320, 8448,
+ 256, 256, 256, 8576, 256, 256, 8704, -1,
+ 8832, 8960, 9088, 9216, 9344, 9472, 9600, 9728,
+ 9856, 9984, 10112, 10240, 10368, 10496, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 10624, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 10752,
+ 10880, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 11008, 256, 256, 11136, 11264, 256, 11392,
+ 11520, 11648, 11776, -1, 11904, -1, -1, -1,
+ 12032, 12160, 12288, 12416, 12544, 12672, 12800, 12032,
+ 12160, 12288, 12416, 12544, 12672, 12800, 12032, 12160,
+ 12288, 12416, 12544, 12672, 12800, 12032, 12160, 12288,
+ 12416, 12544, 12672, 12800, 12032, 12160, 12288, 12416,
+ 12544, 12672, 12800, 12032, 12160, 12288, 12416, 12544,
+ 12672, 12800, 12032, 12160, 12288, 12416, 12544, 12672,
+ 12800, 12032, 12160, 12288, 12416, 12544, 12672, 12800,
+ 12032, 12160, 12288, 12416, 12544, 12672, 12800, 12032,
+ 12160, 12288, 12416, 12544, 12672, 12800, 12032, 12160,
+ 12288, 12416, 12544, 12672, 12800, 12032, 12160, 12288,
+ 12416, 12544, 12672, 12800, 12032, 12160, 12288, 12928,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 9600, 9600, 13056, 13184, 13312, 13440,
+ 256, 256, 13568, 13696, 13824, 13952, 14080, 14208,
+ 14336, 14464, 14592, 14720, -1, 14848, 14976, 15104,
+ 256, 15232, -1, -1, -1, -1, -1, -1,
+ 15360, -1, 15488, -1, 15616, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 15744, -1,
+ 15872, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 16000, 16128, 16256, 16384, -1, 16512, -1,
+ 16640, 16768, 16896, 256, 256, 17024, 256, 17152,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 17280, 17408, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 17536, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9600, 9600, 9600, 9600, 17664, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 17792, -1, 17920, 18048, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_BA, LBP_BK, LBP_BK, LBP_BK, LBP_BK, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_SP, LBP_EX, LBP_QU, LBP_AL, LBP_PR, LBP_PO, LBP_AL, LBP_QU,
+ LBP_OP, LBP_CL, LBP_AL, LBP_PR, LBP_IS, LBP_HY, LBP_IS, LBP_SY,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_IS, LBP_IS, LBP_AL, LBP_AL, LBP_AL, LBP_EX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_PR, LBP_CL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_BA, LBP_CL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BK, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_GL, LBP_OP, LBP_PO, LBP_PR, LBP_PR, LBP_PR, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AL, LBP_AI, LBP_QU, LBP_AL, LBP_BA, LBP_AL, LBP_AL,
+ LBP_PO, LBP_PR, LBP_AI, LBP_AI, LBP_BB, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_QU, LBP_AI, LBP_AI, LBP_AI, LBP_OP,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_BB, LBP_AI, LBP_AI, LBP_AI, LBP_BB, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_BB,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_GL, LBP_GL, LBP_GL,
+ LBP_GL, LBP_GL, LBP_GL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_IS, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_IS, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM,
+ LBP_AL, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_EX, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_PO, LBP_PO, LBP_PO, LBP_IS, LBP_IS, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_EX, LBP_XX, LBP_XX, LBP_EX, LBP_EX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_PO, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_EX, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_IS, LBP_EX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM,
+ LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_PR, LBP_PR, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM,
+ LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_XX, LBP_PR, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM,
+ LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_PR, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_PR,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_XX, LBP_SA,
+ LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_XX, LBP_SA, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_SA,
+ LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_AL, LBP_BB, LBP_BB,
+ LBP_GL, LBP_BB, LBP_BB, LBP_BA, LBP_GL, LBP_EX, LBP_EX, LBP_EX,
+ LBP_EX, LBP_EX, LBP_GL, LBP_AL, LBP_EX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_CM, LBP_AL, LBP_CM,
+ LBP_AL, LBP_CM, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_BA, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_BB, LBP_BB, LBP_BA, LBP_BB, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_JL,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_AL, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_BA, LBP_BA, LBP_NS, LBP_SA,
+ LBP_BA, LBP_AL, LBP_BA, LBP_PR, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_EX, LBP_EX, LBP_BA, LBP_BA, LBP_BB, LBP_AL,
+ LBP_EX, LBP_EX, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_EX, LBP_EX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA,
+ LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BB, LBP_AL, LBP_XX,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_GL,
+ LBP_BA, LBP_BA, LBP_BA, LBP_ZW, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_BA, LBP_GL, LBP_BA, LBP_BA, LBP_B2, LBP_AI, LBP_AI, LBP_AL,
+ LBP_QU, LBP_QU, LBP_OP, LBP_QU, LBP_QU, LBP_QU, LBP_OP, LBP_QU,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_IN, LBP_IN, LBP_IN, LBP_BA,
+ LBP_BK, LBP_BK, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL,
+ LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO,
+ LBP_AL, LBP_QU, LBP_QU, LBP_AI, LBP_NS, LBP_NS, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_IS, LBP_OP, LBP_CL, LBP_NS,
+ LBP_NS, LBP_NS, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_AL,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_BA,
+ LBP_WJ, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AI,
+ LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PO,
+ LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR,
+ LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_PR, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AI, LBP_PR, LBP_PR, LBP_AL, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL,
+ LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_XX,
+ LBP_XX, LBP_AL, LBP_EX, LBP_EX, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_EX, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_EX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU,
+ LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_BA, LBP_BA,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_BA,
+ LBP_OP, LBP_BA, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_AL, LBP_AL,
+ LBP_QU, LBP_QU, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_EX, LBP_AL,
+ LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_CL, LBP_CL, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_NS, LBP_OP, LBP_CL, LBP_CL,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID,
+ LBP_XX, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS,
+ LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_ID,
+ LBP_NS, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS,
+ LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_ID,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX,
+ LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS,
+ LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_EX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BB, LBP_BB, LBP_EX, LBP_EX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_AL, LBP_BA, LBP_BA, LBP_BA,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_IS, LBP_CL, LBP_CL, LBP_IS, LBP_IS, LBP_EX, LBP_EX, LBP_OP,
+ LBP_CL, LBP_IN, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_OP,
+ LBP_CL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_CL, LBP_ID, LBP_CL, LBP_XX, LBP_NS, LBP_NS, LBP_EX, LBP_EX,
+ LBP_ID, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_ID, LBP_PR, LBP_PO, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_WJ,
+ LBP_XX, LBP_EX, LBP_ID, LBP_ID, LBP_PR, LBP_PO, LBP_ID, LBP_ID,
+ LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_CL, LBP_ID, LBP_CL, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_EX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_ID, LBP_CL, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_ID, LBP_CL, LBP_ID, LBP_OP,
+ LBP_CL, LBP_CL, LBP_OP, LBP_CL, LBP_CL, LBP_NS, LBP_AL, LBP_NS,
+ LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS,
+ LBP_NS, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_NS, LBP_NS,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_PO, LBP_PR, LBP_ID, LBP_ID, LBP_ID, LBP_PR, LBP_PR, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CB, LBP_AI, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX
+ }
+};
diff --git a/gnulib/lib/unilbrk/lbrktables.c b/gnulib/lib/unilbrk/lbrktables.c
new file mode 100644
index 00000000..fbc89311
--- /dev/null
+++ b/gnulib/lib/unilbrk/lbrktables.c
@@ -0,0 +1,63 @@
+/* Line breaking auxiliary tables.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk/lbrktables.h"
+
+/* Define unilbrkprop, table of line breaking properties. */
+#include "unilbrk/lbrkprop2.h"
+
+const unsigned char unilbrk_table[24][24] =
+{
+ /* after */
+ /* WJ GL B2 BA BB HY CL EX IN NS OP QU IS NU PO PR SY AL H2 H3 ID JL JV JT */
+/* WJ */ { P, I, I, I, I, I, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, },
+/* GL */ { P, I, I, I, I, I, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, },
+/* B2 */ { P, I, P, I, D, I, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* BA */ { P, D, D, I, D, I, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* BB */ { P, I, I, I, I, I, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, },
+/* HY */ { P, D, D, I, D, I, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, },
+/* CL */ { P, I, D, I, D, I, P, P, D, P, D, I, P, D, I, I, P, D, D, D, D, D, D, D, },
+/* EX */ { P, I, D, I, D, I, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* IN */ { P, I, D, I, D, I, P, P, I, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* NS */ { P, I, D, I, D, I, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* OP */ { P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, },
+/* QU */ { P, I, I, I, I, I, P, P, I, I, P, I, P, I, I, I, P, I, I, I, I, I, I, I, },
+/* IS */ { P, I, D, I, D, I, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, },
+/* NU */ { P, I, D, I, D, I, P, P, I, I, D, I, P, I, I, I, P, I, D, D, D, D, D, D, },
+/* PO */ { P, I, D, I, D, I, P, P, D, I, I, I, P, I, D, D, P, I, D, D, D, D, D, D, },
+/* PR */ { P, I, D, I, D, I, P, P, D, I, I, I, P, I, D, D, P, I, I, I, I, I, I, I, },
+/* SY */ { P, I, D, I, D, I, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, },
+/* AL */ { P, I, D, I, D, I, P, P, I, I, D, I, P, I, D, D, P, I, D, D, D, D, D, D, },
+/* H2 */ { P, I, D, I, D, I, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, I, I, },
+/* H3 */ { P, I, D, I, D, I, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, I, },
+/* ID */ { P, I, D, I, D, I, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, D, },
+/* JL */ { P, I, D, I, D, I, P, P, I, I, D, I, P, D, I, D, P, D, I, I, D, I, I, D, },
+/* JV */ { P, I, D, I, D, I, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, I, I, },
+/* JT */ { P, I, D, I, D, I, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, I, },
+/* "" */
+/* before */
+};
+/* Note: The (IS,AL) entry has been changed from I to D. In other words, the
+ rule "Do not break between numeric punctuation and alphabetics" is not
+ implemented here. We want to break before the HTML tag in strings like
+ "<P>Some sentence.</P>" */
+/* Note: The (B2,B2) entry should probably be D instead of P. */
+/* Note: The (PR,ID) entry should probably be D instead of I. */
+/* Note: The (WJ,*) and (GL,*) entries should probably be P instead of I. */
diff --git a/gnulib/lib/unilbrk/lbrktables.h b/gnulib/lib/unilbrk/lbrktables.h
new file mode 100644
index 00000000..e86c49ff
--- /dev/null
+++ b/gnulib/lib/unilbrk/lbrktables.h
@@ -0,0 +1,94 @@
+/* Line breaking auxiliary tables.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "unitypes.h"
+
+/* Line breaking classification. */
+
+enum
+{
+ /* Values >= 24 are resolved at run time. */
+ LBP_BK = 24, /* mandatory break */
+/*LBP_CR, carriage return - not used here because it's a DOSism */
+/*LBP_LF, line feed - not used here because it's a DOSism */
+ LBP_CM = 25, /* attached characters and combining marks */
+/*LBP_NL, next line - not used here because it's equivalent to LBP_BK */
+/*LBP_SG, surrogates - not used here because they are not characters */
+ LBP_WJ = 0, /* word joiner */
+ LBP_ZW = 26, /* zero width space */
+ LBP_GL = 1, /* non-breaking (glue) */
+ LBP_SP = 27, /* space */
+ LBP_B2 = 2, /* break opportunity before and after */
+ LBP_BA = 3, /* break opportunity after */
+ LBP_BB = 4, /* break opportunity before */
+ LBP_HY = 5, /* hyphen */
+ LBP_CB = 28, /* contingent break opportunity */
+ LBP_CL = 6, /* closing punctuation */
+ LBP_EX = 7, /* exclamation/interrogation */
+ LBP_IN = 8, /* inseparable */
+ LBP_NS = 9, /* non starter */
+ LBP_OP = 10, /* opening punctuation */
+ LBP_QU = 11, /* ambiguous quotation */
+ LBP_IS = 12, /* infix separator (numeric) */
+ LBP_NU = 13, /* numeric */
+ LBP_PO = 14, /* postfix (numeric) */
+ LBP_PR = 15, /* prefix (numeric) */
+ LBP_SY = 16, /* symbols allowing breaks */
+ LBP_AI = 29, /* ambiguous (alphabetic or ideograph) */
+ LBP_AL = 17, /* ordinary alphabetic and symbol characters */
+ LBP_H2 = 18, /* Hangul LV syllable */
+ LBP_H3 = 19, /* Hangul LVT syllable */
+ LBP_ID = 20, /* ideographic */
+ LBP_JL = 21, /* Hangul L Jamo */
+ LBP_JV = 22, /* Hangul V Jamo */
+ LBP_JT = 23, /* Hangul T Jamo */
+ LBP_SA = 30, /* complex context (South East Asian) */
+ LBP_XX = 31 /* unknown */
+};
+
+#include "lbrkprop1.h"
+
+static inline unsigned char
+unilbrkprop_lookup (ucs4_t uc)
+{
+ unsigned int index1 = uc >> lbrkprop_header_0;
+ if (index1 < lbrkprop_header_1)
+ {
+ int lookup1 = unilbrkprop.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> lbrkprop_header_2) & lbrkprop_header_3;
+ int lookup2 = unilbrkprop.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = uc & lbrkprop_header_4;
+ return unilbrkprop.level3[lookup2 + index3];
+ }
+ }
+ }
+ return LBP_XX;
+}
+
+/* Table indexed by two line breaking classifications. */
+#define D 1 /* direct break opportunity, empty in table 7.3 of UTR #14 */
+#define I 2 /* indirect break opportunity, '%' in table 7.3 of UTR #14 */
+#define P 3 /* prohibited break, '^' in table 7.3 of UTR #14 */
+
+extern const unsigned char unilbrk_table[24][24];
+
+/* We don't support line breaking of complex-context dependent characters
+ (Thai, Lao, Myanmar, Khmer) yet, because it requires dictionary lookup. */
diff --git a/gnulib/lib/unilbrk/u16-possible-linebreaks.c b/gnulib/lib/unilbrk/u16-possible-linebreaks.c
new file mode 100644
index 00000000..25b9851a
--- /dev/null
+++ b/gnulib/lib/unilbrk/u16-possible-linebreaks.c
@@ -0,0 +1,164 @@
+/* Line breaking of UTF-16 strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unilbrk/lbrktables.h"
+#include "uniwidth/cjk.h"
+#include "unistr.h"
+
+void
+u16_possible_linebreaks (const uint16_t *s, size_t n, const char *encoding, char *p)
+{
+ int LBP_AI_REPLACEMENT = (is_cjk_encoding (encoding) ? LBP_ID : LBP_AL);
+ const uint16_t *s_end = s + n;
+ int last_prop = LBP_BK; /* line break property of last non-space character */
+ char *seen_space = NULL; /* Was a space seen after the last non-space character? */
+ char *seen_space2 = NULL; /* At least two spaces after the last non-space? */
+
+ /* Don't break inside multibyte characters. */
+ memset (p, UC_BREAK_PROHIBITED, n);
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = u16_mbtouc_unsafe (&uc, s, s_end - s);
+ int prop = unilbrkprop_lookup (uc);
+
+ if (prop == LBP_BK)
+ {
+ /* Mandatory break. */
+ *p = UC_BREAK_MANDATORY;
+ last_prop = LBP_BK;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else
+ {
+ char *q;
+
+ /* Resolve property values whose behaviour is not fixed. */
+ switch (prop)
+ {
+ case LBP_AI:
+ /* Resolve ambiguous. */
+ prop = LBP_AI_REPLACEMENT;
+ break;
+ case LBP_CB:
+ /* This is arbitrary. */
+ prop = LBP_ID;
+ break;
+ case LBP_SA:
+ /* We don't handle complex scripts yet.
+ Treat LBP_SA like LBP_XX. */
+ case LBP_XX:
+ /* This is arbitrary. */
+ prop = LBP_AL;
+ break;
+ }
+
+ /* Deal with spaces and combining characters. */
+ q = p;
+ if (prop == LBP_SP)
+ {
+ /* Don't break just before a space. */
+ *p = UC_BREAK_PROHIBITED;
+ seen_space2 = seen_space;
+ seen_space = p;
+ }
+ else if (prop == LBP_ZW)
+ {
+ /* Don't break just before a zero-width space. */
+ *p = UC_BREAK_PROHIBITED;
+ last_prop = LBP_ZW;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else if (prop == LBP_CM)
+ {
+ /* Don't break just before a combining character, except immediately after a
+ zero-width space. */
+ if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *p = UC_BREAK_POSSIBLE;
+ /* A combining character turns a preceding space into LBP_ID. */
+ last_prop = LBP_ID;
+ }
+ else
+ {
+ *p = UC_BREAK_PROHIBITED;
+ /* A combining character turns a preceding space into LBP_ID. */
+ if (seen_space != NULL)
+ {
+ q = seen_space;
+ seen_space = seen_space2;
+ prop = LBP_ID;
+ goto lookup_via_table;
+ }
+ }
+ }
+ else
+ {
+ lookup_via_table:
+ /* prop must be usable as an index for table 7.3 of UTR #14. */
+ if (!(prop >= 0 && prop < sizeof (unilbrk_table) / sizeof (unilbrk_table[0])))
+ abort ();
+
+ if (last_prop == LBP_BK)
+ {
+ /* Don't break at the beginning of a line. */
+ *q = UC_BREAK_PROHIBITED;
+ }
+ else if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *q = UC_BREAK_POSSIBLE;
+ }
+ else
+ {
+ switch (unilbrk_table [last_prop] [prop])
+ {
+ case D:
+ *q = UC_BREAK_POSSIBLE;
+ break;
+ case I:
+ *q = (seen_space != NULL ? UC_BREAK_POSSIBLE : UC_BREAK_PROHIBITED);
+ break;
+ case P:
+ *q = UC_BREAK_PROHIBITED;
+ break;
+ default:
+ abort ();
+ }
+ }
+ last_prop = prop;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ }
+
+ s += count;
+ p += count;
+ }
+}
diff --git a/gnulib/lib/unilbrk/u16-width-linebreaks.c b/gnulib/lib/unilbrk/u16-width-linebreaks.c
new file mode 100644
index 00000000..152178e5
--- /dev/null
+++ b/gnulib/lib/unilbrk/u16-width-linebreaks.c
@@ -0,0 +1,108 @@
+/* Line breaking of UTF-16 strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include "unistr.h"
+#include "uniwidth.h"
+
+int
+u16_width_linebreaks (const uint16_t *s, size_t n,
+ int width, int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p)
+{
+ const uint16_t *s_end;
+ char *last_p;
+ int last_column;
+ int piece_width;
+
+ u16_possible_linebreaks (s, n, encoding, p);
+
+ s_end = s + n;
+ last_p = NULL;
+ last_column = start_column;
+ piece_width = 0;
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = u16_mbtouc_unsafe (&uc, s, s_end - s);
+
+ /* Respect the override. */
+ if (o != NULL && *o != UC_BREAK_UNDEFINED)
+ *p = *o;
+
+ if (*p == UC_BREAK_POSSIBLE || *p == UC_BREAK_MANDATORY)
+ {
+ /* An atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+ }
+
+ if (*p == UC_BREAK_MANDATORY)
+ {
+ /* uc is a line break character. */
+ /* Start a new piece at column 0. */
+ last_p = NULL;
+ last_column = 0;
+ piece_width = 0;
+ }
+ else
+ {
+ /* uc is not a line break character. */
+ int w;
+
+ if (*p == UC_BREAK_POSSIBLE)
+ {
+ /* Start a new piece. */
+ last_p = p;
+ last_column += piece_width;
+ piece_width = 0;
+ /* No line break for the moment, may be turned into
+ UC_BREAK_POSSIBLE later, via last_p. */
+ }
+
+ *p = UC_BREAK_PROHIBITED;
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ piece_width += w;
+ }
+
+ s += count;
+ p += count;
+ if (o != NULL)
+ o += count;
+ }
+
+ /* The last atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width + at_end_columns > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+
+ return last_column + piece_width;
+}
diff --git a/gnulib/lib/unilbrk/u32-possible-linebreaks.c b/gnulib/lib/unilbrk/u32-possible-linebreaks.c
new file mode 100644
index 00000000..c375a0c7
--- /dev/null
+++ b/gnulib/lib/unilbrk/u32-possible-linebreaks.c
@@ -0,0 +1,158 @@
+/* Line breaking of UTF-32 strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "unilbrk/lbrktables.h"
+#include "uniwidth/cjk.h"
+
+void
+u32_possible_linebreaks (const uint32_t *s, size_t n, const char *encoding, char *p)
+{
+ int LBP_AI_REPLACEMENT = (is_cjk_encoding (encoding) ? LBP_ID : LBP_AL);
+ const uint32_t *s_end = s + n;
+ int last_prop = LBP_BK; /* line break property of last non-space character */
+ char *seen_space = NULL; /* Was a space seen after the last non-space character? */
+ char *seen_space2 = NULL; /* At least two spaces after the last non-space? */
+
+ while (s < s_end)
+ {
+ ucs4_t uc = *s;
+ int prop = unilbrkprop_lookup (uc);
+
+ if (prop == LBP_BK)
+ {
+ /* Mandatory break. */
+ *p = UC_BREAK_MANDATORY;
+ last_prop = LBP_BK;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else
+ {
+ char *q;
+
+ /* Resolve property values whose behaviour is not fixed. */
+ switch (prop)
+ {
+ case LBP_AI:
+ /* Resolve ambiguous. */
+ prop = LBP_AI_REPLACEMENT;
+ break;
+ case LBP_CB:
+ /* This is arbitrary. */
+ prop = LBP_ID;
+ break;
+ case LBP_SA:
+ /* We don't handle complex scripts yet.
+ Treat LBP_SA like LBP_XX. */
+ case LBP_XX:
+ /* This is arbitrary. */
+ prop = LBP_AL;
+ break;
+ }
+
+ /* Deal with spaces and combining characters. */
+ q = p;
+ if (prop == LBP_SP)
+ {
+ /* Don't break just before a space. */
+ *p = UC_BREAK_PROHIBITED;
+ seen_space2 = seen_space;
+ seen_space = p;
+ }
+ else if (prop == LBP_ZW)
+ {
+ /* Don't break just before a zero-width space. */
+ *p = UC_BREAK_PROHIBITED;
+ last_prop = LBP_ZW;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else if (prop == LBP_CM)
+ {
+ /* Don't break just before a combining character, except immediately after a
+ zero-width space. */
+ if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *p = UC_BREAK_POSSIBLE;
+ /* A combining character turns a preceding space into LBP_ID. */
+ last_prop = LBP_ID;
+ }
+ else
+ {
+ *p = UC_BREAK_PROHIBITED;
+ /* A combining character turns a preceding space into LBP_ID. */
+ if (seen_space != NULL)
+ {
+ q = seen_space;
+ seen_space = seen_space2;
+ prop = LBP_ID;
+ goto lookup_via_table;
+ }
+ }
+ }
+ else
+ {
+ lookup_via_table:
+ /* prop must be usable as an index for table 7.3 of UTR #14. */
+ if (!(prop >= 0 && prop < sizeof (unilbrk_table) / sizeof (unilbrk_table[0])))
+ abort ();
+
+ if (last_prop == LBP_BK)
+ {
+ /* Don't break at the beginning of a line. */
+ *q = UC_BREAK_PROHIBITED;
+ }
+ else if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *q = UC_BREAK_POSSIBLE;
+ }
+ else
+ {
+ switch (unilbrk_table [last_prop] [prop])
+ {
+ case D:
+ *q = UC_BREAK_POSSIBLE;
+ break;
+ case I:
+ *q = (seen_space != NULL ? UC_BREAK_POSSIBLE : UC_BREAK_PROHIBITED);
+ break;
+ case P:
+ *q = UC_BREAK_PROHIBITED;
+ break;
+ default:
+ abort ();
+ }
+ }
+ last_prop = prop;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ }
+
+ s++;
+ p++;
+ }
+}
diff --git a/gnulib/lib/unilbrk/u32-width-linebreaks.c b/gnulib/lib/unilbrk/u32-width-linebreaks.c
new file mode 100644
index 00000000..c5803dbf
--- /dev/null
+++ b/gnulib/lib/unilbrk/u32-width-linebreaks.c
@@ -0,0 +1,106 @@
+/* Line breaking of UTF-32 strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include "uniwidth.h"
+
+int
+u32_width_linebreaks (const uint32_t *s, size_t n,
+ int width, int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p)
+{
+ const uint32_t *s_end;
+ char *last_p;
+ int last_column;
+ int piece_width;
+
+ u32_possible_linebreaks (s, n, encoding, p);
+
+ s_end = s + n;
+ last_p = NULL;
+ last_column = start_column;
+ piece_width = 0;
+ while (s < s_end)
+ {
+ ucs4_t uc = *s;
+
+ /* Respect the override. */
+ if (o != NULL && *o != UC_BREAK_UNDEFINED)
+ *p = *o;
+
+ if (*p == UC_BREAK_POSSIBLE || *p == UC_BREAK_MANDATORY)
+ {
+ /* An atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+ }
+
+ if (*p == UC_BREAK_MANDATORY)
+ {
+ /* uc is a line break character. */
+ /* Start a new piece at column 0. */
+ last_p = NULL;
+ last_column = 0;
+ piece_width = 0;
+ }
+ else
+ {
+ /* uc is not a line break character. */
+ int w;
+
+ if (*p == UC_BREAK_POSSIBLE)
+ {
+ /* Start a new piece. */
+ last_p = p;
+ last_column += piece_width;
+ piece_width = 0;
+ /* No line break for the moment, may be turned into
+ UC_BREAK_POSSIBLE later, via last_p. */
+ }
+
+ *p = UC_BREAK_PROHIBITED;
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ piece_width += w;
+ }
+
+ s++;
+ p++;
+ if (o != NULL)
+ o++;
+ }
+
+ /* The last atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width + at_end_columns > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+
+ return last_column + piece_width;
+}
diff --git a/gnulib/lib/unilbrk/u8-possible-linebreaks.c b/gnulib/lib/unilbrk/u8-possible-linebreaks.c
new file mode 100644
index 00000000..d65335ea
--- /dev/null
+++ b/gnulib/lib/unilbrk/u8-possible-linebreaks.c
@@ -0,0 +1,261 @@
+/* Line breaking of UTF-8 strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unilbrk/lbrktables.h"
+#include "uniwidth/cjk.h"
+#include "unistr.h"
+
+void
+u8_possible_linebreaks (const uint8_t *s, size_t n, const char *encoding, char *p)
+{
+ int LBP_AI_REPLACEMENT = (is_cjk_encoding (encoding) ? LBP_ID : LBP_AL);
+ const uint8_t *s_end = s + n;
+ int last_prop = LBP_BK; /* line break property of last non-space character */
+ char *seen_space = NULL; /* Was a space seen after the last non-space character? */
+ char *seen_space2 = NULL; /* At least two spaces after the last non-space? */
+
+ /* Don't break inside multibyte characters. */
+ memset (p, UC_BREAK_PROHIBITED, n);
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = u8_mbtouc_unsafe (&uc, s, s_end - s);
+ int prop = unilbrkprop_lookup (uc);
+
+ if (prop == LBP_BK)
+ {
+ /* Mandatory break. */
+ *p = UC_BREAK_MANDATORY;
+ last_prop = LBP_BK;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else
+ {
+ char *q;
+
+ /* Resolve property values whose behaviour is not fixed. */
+ switch (prop)
+ {
+ case LBP_AI:
+ /* Resolve ambiguous. */
+ prop = LBP_AI_REPLACEMENT;
+ break;
+ case LBP_CB:
+ /* This is arbitrary. */
+ prop = LBP_ID;
+ break;
+ case LBP_SA:
+ /* We don't handle complex scripts yet.
+ Treat LBP_SA like LBP_XX. */
+ case LBP_XX:
+ /* This is arbitrary. */
+ prop = LBP_AL;
+ break;
+ }
+
+ /* Deal with spaces and combining characters. */
+ q = p;
+ if (prop == LBP_SP)
+ {
+ /* Don't break just before a space. */
+ *p = UC_BREAK_PROHIBITED;
+ seen_space2 = seen_space;
+ seen_space = p;
+ }
+ else if (prop == LBP_ZW)
+ {
+ /* Don't break just before a zero-width space. */
+ *p = UC_BREAK_PROHIBITED;
+ last_prop = LBP_ZW;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else if (prop == LBP_CM)
+ {
+ /* Don't break just before a combining character, except immediately after a
+ zero-width space. */
+ if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *p = UC_BREAK_POSSIBLE;
+ /* A combining character turns a preceding space into LBP_ID. */
+ last_prop = LBP_ID;
+ }
+ else
+ {
+ *p = UC_BREAK_PROHIBITED;
+ /* A combining character turns a preceding space into LBP_ID. */
+ if (seen_space != NULL)
+ {
+ q = seen_space;
+ seen_space = seen_space2;
+ prop = LBP_ID;
+ goto lookup_via_table;
+ }
+ }
+ }
+ else
+ {
+ lookup_via_table:
+ /* prop must be usable as an index for table 7.3 of UTR #14. */
+ if (!(prop >= 0 && prop < sizeof (unilbrk_table) / sizeof (unilbrk_table[0])))
+ abort ();
+
+ if (last_prop == LBP_BK)
+ {
+ /* Don't break at the beginning of a line. */
+ *q = UC_BREAK_PROHIBITED;
+ }
+ else if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *q = UC_BREAK_POSSIBLE;
+ }
+ else
+ {
+ switch (unilbrk_table [last_prop] [prop])
+ {
+ case D:
+ *q = UC_BREAK_POSSIBLE;
+ break;
+ case I:
+ *q = (seen_space != NULL ? UC_BREAK_POSSIBLE : UC_BREAK_PROHIBITED);
+ break;
+ case P:
+ *q = UC_BREAK_PROHIBITED;
+ break;
+ default:
+ abort ();
+ }
+ }
+ last_prop = prop;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ }
+
+ s += count;
+ p += count;
+ }
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ if (argc == 1)
+ {
+ /* Display all the break opportunities in the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ u8_possible_linebreaks ((uint8_t *) input, length, "UTF-8", breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case UC_BREAK_POSSIBLE:
+ /* U+2027 in UTF-8 encoding */
+ putc (0xe2, stdout); putc (0x80, stdout); putc (0xa7, stdout);
+ break;
+ case UC_BREAK_MANDATORY:
+ /* U+21B2 (or U+21B5) in UTF-8 encoding */
+ putc (0xe2, stdout); putc (0x86, stdout); putc (0xb2, stdout);
+ break;
+ case UC_BREAK_PROHIBITED:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unilbrk/u8-width-linebreaks.c b/gnulib/lib/unilbrk/u8-width-linebreaks.c
new file mode 100644
index 00000000..fffe62a2
--- /dev/null
+++ b/gnulib/lib/unilbrk/u8-width-linebreaks.c
@@ -0,0 +1,204 @@
+/* Line breaking of UTF-8 strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include "unistr.h"
+#include "uniwidth.h"
+
+int
+u8_width_linebreaks (const uint8_t *s, size_t n,
+ int width, int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p)
+{
+ const uint8_t *s_end;
+ char *last_p;
+ int last_column;
+ int piece_width;
+
+ u8_possible_linebreaks (s, n, encoding, p);
+
+ s_end = s + n;
+ last_p = NULL;
+ last_column = start_column;
+ piece_width = 0;
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = u8_mbtouc_unsafe (&uc, s, s_end - s);
+
+ /* Respect the override. */
+ if (o != NULL && *o != UC_BREAK_UNDEFINED)
+ *p = *o;
+
+ if (*p == UC_BREAK_POSSIBLE || *p == UC_BREAK_MANDATORY)
+ {
+ /* An atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+ }
+
+ if (*p == UC_BREAK_MANDATORY)
+ {
+ /* uc is a line break character. */
+ /* Start a new piece at column 0. */
+ last_p = NULL;
+ last_column = 0;
+ piece_width = 0;
+ }
+ else
+ {
+ /* uc is not a line break character. */
+ int w;
+
+ if (*p == UC_BREAK_POSSIBLE)
+ {
+ /* Start a new piece. */
+ last_p = p;
+ last_column += piece_width;
+ piece_width = 0;
+ /* No line break for the moment, may be turned into
+ UC_BREAK_POSSIBLE later, via last_p. */
+ }
+
+ *p = UC_BREAK_PROHIBITED;
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ piece_width += w;
+ }
+
+ s += count;
+ p += count;
+ if (o != NULL)
+ o += count;
+ }
+
+ /* The last atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width + at_end_columns > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+
+ return last_column + piece_width;
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ if (argc == 2)
+ {
+ /* Insert line breaks for a given width. */
+ int width = atoi (argv[1]);
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ u8_width_linebreaks ((uint8_t *) input, length, width, 0, 0, NULL, "UTF-8", breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case UC_BREAK_POSSIBLE:
+ putc ('\n', stdout);
+ break;
+ case UC_BREAK_MANDATORY:
+ break;
+ case UC_BREAK_PROHIBITED:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unilbrk/ulc-common.c b/gnulib/lib/unilbrk/ulc-common.c
new file mode 100644
index 00000000..1ed9c82f
--- /dev/null
+++ b/gnulib/lib/unilbrk/ulc-common.c
@@ -0,0 +1,51 @@
+/* Line breaking auxiliary functions.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk/ulc-common.h"
+
+#include "c-ctype.h"
+#include "c-strcaseeq.h"
+
+int
+is_utf8_encoding (const char *encoding)
+{
+ if (STRCASEEQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
+ return 1;
+ return 0;
+}
+
+#if C_CTYPE_ASCII
+
+/* Tests whether a string is entirely ASCII. Returns 1 if yes.
+ Returns 0 if the string is in an 8-bit encoding or an ISO-2022 encoding. */
+int
+is_all_ascii (const char *s, size_t n)
+{
+ for (; n > 0; s++, n--)
+ {
+ unsigned char c = (unsigned char) *s;
+
+ if (!(c_isprint (c) || c_isspace (c)))
+ return 0;
+ }
+ return 1;
+}
+
+#endif /* C_CTYPE_ASCII */
diff --git a/gnulib/lib/unilbrk/ulc-common.h b/gnulib/lib/unilbrk/ulc-common.h
new file mode 100644
index 00000000..bd3c6e44
--- /dev/null
+++ b/gnulib/lib/unilbrk/ulc-common.h
@@ -0,0 +1,31 @@
+/* Line breaking auxiliary functions.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "c-ctype.h"
+
+#define is_utf8_encoding unilbrk_is_utf8_encoding
+extern int is_utf8_encoding (const char *encoding);
+
+#if C_CTYPE_ASCII
+
+# define is_all_ascii unilbrk_is_all_ascii
+extern int is_all_ascii (const char *s, size_t n);
+
+#endif /* C_CTYPE_ASCII */
diff --git a/gnulib/lib/unilbrk/ulc-possible-linebreaks.c b/gnulib/lib/unilbrk/ulc-possible-linebreaks.c
new file mode 100644
index 00000000..eed59b46
--- /dev/null
+++ b/gnulib/lib/unilbrk/ulc-possible-linebreaks.c
@@ -0,0 +1,212 @@
+/* Line breaking of strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "uniconv.h"
+#include "unilbrk/ulc-common.h"
+
+/* Line breaking of a string in an arbitrary encoding.
+
+ We convert the input string to Unicode.
+
+ The standardized Unicode encodings are UTF-8, UCS-2, UCS-4, UTF-16,
+ UTF-16BE, UTF-16LE, UTF-7. UCS-2 supports only characters up to
+ \U0000FFFF. UTF-16 and variants support only characters up to
+ \U0010FFFF. UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order mark.
+ glibc currently interprets it as big endian without byte order mark,
+ but this is not backed by an RFC. So we use UTF-8. It supports
+ characters up to \U7FFFFFFF and is unambiguously defined. */
+
+void
+ulc_possible_linebreaks (const char *s, size_t n, const char *encoding,
+ char *p)
+{
+ if (n > 0)
+ {
+ if (is_utf8_encoding (encoding))
+ u8_possible_linebreaks ((const uint8_t *) s, n, encoding, p);
+ else
+ {
+ /* Convert the string to UTF-8 and build a translation table
+ from offsets into s to offsets into the translated string. */
+ size_t *offsets = (size_t *) malloc (n * sizeof (size_t));
+
+ if (offsets != NULL)
+ {
+ uint8_t *t;
+ size_t m;
+
+ t = u8_conv_from_encoding (encoding, iconveh_question_mark,
+ s, n, offsets, NULL, &m);
+ if (t != NULL)
+ {
+ char *q = (char *) (m > 0 ? malloc (m) : NULL);
+
+ if (m == 0 || q != NULL)
+ {
+ size_t i;
+
+ /* Determine the possible line breaks of the UTF-8
+ string. */
+ u8_possible_linebreaks (t, m, encoding, q);
+
+ /* Translate the result back to the original string. */
+ memset (p, UC_BREAK_PROHIBITED, n);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ p[i] = q[offsets[i]];
+
+ free (q);
+ free (t);
+ free (offsets);
+ return;
+ }
+ free (t);
+ }
+ free (offsets);
+ }
+
+ /* Impossible to convert. */
+#if C_CTYPE_ASCII
+ if (is_all_ascii (s, n))
+ {
+ /* ASCII is a subset of UTF-8. */
+ u8_possible_linebreaks ((const uint8_t *) s, n, encoding, p);
+ return;
+ }
+#endif
+ /* We have a non-ASCII string and cannot convert it.
+ Don't produce line breaks except those already present in the
+ input string. All we assume here is that the encoding is
+ minimally ASCII compatible. */
+ {
+ const char *s_end = s + n;
+ while (s < s_end)
+ {
+ *p = (*s == '\n' ? UC_BREAK_MANDATORY : UC_BREAK_PROHIBITED);
+ s++;
+ p++;
+ }
+ }
+ }
+ }
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <locale.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_CTYPE, "");
+ if (argc == 1)
+ {
+ /* Display all the break opportunities in the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ ulc_possible_linebreaks (input, length, locale_charset (), breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case UC_BREAK_POSSIBLE:
+ putc ('|', stdout);
+ break;
+ case UC_BREAK_MANDATORY:
+ break;
+ case UC_BREAK_PROHIBITED:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unilbrk/ulc-width-linebreaks.c b/gnulib/lib/unilbrk/ulc-width-linebreaks.c
new file mode 100644
index 00000000..16b38816
--- /dev/null
+++ b/gnulib/lib/unilbrk/ulc-width-linebreaks.c
@@ -0,0 +1,231 @@
+/* Line breaking of strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "uniconv.h"
+#include "unilbrk/ulc-common.h"
+
+/* Line breaking of a string in an arbitrary encoding.
+
+ We convert the input string to Unicode.
+
+ The standardized Unicode encodings are UTF-8, UCS-2, UCS-4, UTF-16,
+ UTF-16BE, UTF-16LE, UTF-7. UCS-2 supports only characters up to
+ \U0000FFFF. UTF-16 and variants support only characters up to
+ \U0010FFFF. UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order mark.
+ glibc currently interprets it as big endian without byte order mark,
+ but this is not backed by an RFC. So we use UTF-8. It supports
+ characters up to \U7FFFFFFF and is unambiguously defined. */
+
+int
+ulc_width_linebreaks (const char *s, size_t n,
+ int width, int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p)
+{
+ if (n > 0)
+ {
+ if (is_utf8_encoding (encoding))
+ return u8_width_linebreaks ((const uint8_t *) s, n, width, start_column, at_end_columns, o, encoding, p);
+ else
+ {
+ /* Convert the string to UTF-8 and build a translation table
+ from offsets into s to offsets into the translated string. */
+ size_t *offsets = (size_t *) malloc (n * sizeof (size_t));
+
+ if (offsets != NULL)
+ {
+ uint8_t *t;
+ size_t m;
+
+ t = u8_conv_from_encoding (encoding, iconveh_question_mark,
+ s, n, offsets, NULL, &m);
+ if (t != NULL)
+ {
+ char *memory =
+ (char *) (m > 0 ? malloc (m + (o != NULL ? m : 0)) : NULL);
+
+ if (m == 0 || memory != NULL)
+ {
+ char *q = (char *) memory;
+ char *o8 = (o != NULL ? (char *) (q + m) : NULL);
+ int res_column;
+ size_t i;
+
+ /* Translate the overrides to the UTF-8 string. */
+ if (o != NULL)
+ {
+ memset (o8, UC_BREAK_UNDEFINED, m);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ o8[offsets[i]] = o[i];
+ }
+
+ /* Determine the line breaks of the UTF-8 string. */
+ res_column =
+ u8_width_linebreaks (t, m, width, start_column, at_end_columns, o8, encoding, q);
+
+ /* Translate the result back to the original string. */
+ memset (p, UC_BREAK_PROHIBITED, n);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ p[i] = q[offsets[i]];
+
+ free (memory);
+ free (t);
+ free (offsets);
+ return res_column;
+ }
+ free (t);
+ }
+ free (offsets);
+ }
+ /* Impossible to convert. */
+#if C_CTYPE_ASCII
+ if (is_all_ascii (s, n))
+ {
+ /* ASCII is a subset of UTF-8. */
+ return u8_width_linebreaks ((const uint8_t *) s, n, width, start_column, at_end_columns, o, encoding, p);
+ }
+#endif
+ /* We have a non-ASCII string and cannot convert it.
+ Don't produce line breaks except those already present in the
+ input string. All we assume here is that the encoding is
+ minimally ASCII compatible. */
+ {
+ const char *s_end = s + n;
+ while (s < s_end)
+ {
+ *p = ((o != NULL && *o == UC_BREAK_MANDATORY) || *s == '\n'
+ ? UC_BREAK_MANDATORY
+ : UC_BREAK_PROHIBITED);
+ s++;
+ p++;
+ if (o != NULL)
+ o++;
+ }
+ /* We cannot compute widths in this case. */
+ }
+ }
+ }
+ return start_column;
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <locale.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_CTYPE, "");
+ if (argc == 2)
+ {
+ /* Insert line breaks for a given width. */
+ int width = atoi (argv[1]);
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ ulc_width_linebreaks (input, length, width, 0, 0, NULL, locale_charset (), breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case UC_BREAK_POSSIBLE:
+ putc ('\n', stdout);
+ break;
+ case UC_BREAK_MANDATORY:
+ break;
+ case UC_BREAK_PROHIBITED:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/uniname.h b/gnulib/lib/uniname.h
new file mode 100644
index 00000000..1d0f81c1
--- /dev/null
+++ b/gnulib/lib/uniname.h
@@ -0,0 +1,45 @@
+/* Association between Unicode characters and their names.
+ Copyright (C) 2000-2002, 2005, 2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNINAME_H
+#define _UNINAME_H
+
+#include "unitypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Required size of buffer for a Unicode character name. */
+#define UNINAME_MAX 256
+
+/* Looks up the name of a Unicode character, in uppercase ASCII.
+ Returns the filled buf, or NULL if the character does not have a name. */
+extern char *
+ unicode_character_name (ucs4_t uc, char *buf);
+
+/* 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. */
+extern ucs4_t
+ unicode_name_character (const char *name);
+#define UNINAME_INVALID ((ucs4_t) 0xFFFF)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNINAME_H */
diff --git a/gnulib/lib/uniname/gen-uninames.lisp b/gnulib/lib/uniname/gen-uninames.lisp
new file mode 100755
index 00000000..d08e93f0
--- /dev/null
+++ b/gnulib/lib/uniname/gen-uninames.lisp
@@ -0,0 +1,301 @@
+#!/usr/local/bin/clisp -C
+
+;;; Creation of gnulib's uninames.h from the UnicodeData.txt table.
+;;; Bruno Haible 2000-12-28
+
+(defparameter add-comments nil)
+
+(defstruct unicode-char
+ (code nil :type integer)
+ (name nil :type string)
+ word-indices
+ word-indices-index
+)
+
+(defstruct word-list
+ (hashed nil :type hash-table)
+ (sorted nil :type list)
+ size ; number of characters total
+ length ; number of words
+)
+
+(defun main (inputfile outputfile)
+ (declare (type string inputfile outputfile))
+ #+UNICODE (setq *default-file-encoding* charset:utf-8)
+ (let ((all-chars '()))
+ ;; Read all characters and names from the input file.
+ (with-open-file (istream inputfile :direction :input)
+ (loop
+ (let ((line (read-line istream nil nil)))
+ (unless line (return))
+ (let* ((i1 (position #\; line))
+ (i2 (position #\; line :start (1+ i1)))
+ (code-string (subseq line 0 i1))
+ (code (parse-integer code-string :radix 16))
+ (name-string (subseq line (1+ i1) i2)))
+ ; Ignore characters whose name starts with "<".
+ (unless (eql (char name-string 0) #\<)
+ ; Also ignore Hangul syllables; they are treated specially.
+ (unless (<= #xAC00 code #xD7A3)
+ ; Also ignore CJK compatibility ideographs; they are treated
+ ; specially as well.
+ (unless (or (<= #xF900 code #xFA2D) (<= #xFA30 code #xFA6A)
+ (<= #xFA70 code #xFAD9) (<= #x2F800 code #x2FA1D))
+ ; Transform the code so that it fits in 16 bits. In
+ ; Unicode 5.1 the following ranges are used.
+ ; 0x00000..0x04DFF >>12= 0x00..0x04 -> 0x0..0x4
+ ; 0x0A000..0x0AAFF >>12= 0x0A -> 0x5
+ ; 0x0F900..0x0FFFF >>12= 0x0F -> 0x6
+ ; 0x10000..0x10A58 >>12= 0x10 -> 0x7
+ ; 0x12000..0x12473 >>12= 0x12 -> 0x8
+ ; 0x1D000..0x1D7FF >>12= 0x1D -> 0x9
+ ; 0x1F000..0x1F093 >>12= 0x1F -> 0xA
+ ; 0x2F800..0x2FAFF >>12= 0x2F -> 0xB
+ ; 0xE0000..0xE00FF >>12= 0xE0 -> 0xC
+ (flet ((transform (x)
+ (dpb
+ (case (ash x -12)
+ ((#x00 #x01 #x02 #x03 #x04) (ash x -12))
+ (#x0A 5)
+ (#x0F 6)
+ (#x10 7)
+ (#x12 8)
+ (#x1D 9)
+ (#x1F #xA)
+ (#x2F #xB)
+ (#xE0 #xC)
+ (t (error "Update the transform function for 0x~5,'0X" x))
+ )
+ (byte 8 12)
+ x
+ )) )
+ (push (make-unicode-char :code (transform code)
+ :name name-string)
+ all-chars
+ ) ) ) ) )
+ ) ) ) )
+ (setq all-chars (nreverse all-chars))
+ ;; Split into words.
+ (let ((words-by-length (make-array 0 :adjustable t)))
+ (dolist (name (list* "HANGUL SYLLABLE" "CJK COMPATIBILITY" (mapcar #'unicode-char-name all-chars)))
+ (let ((i1 0))
+ (loop
+ (when (>= i1 (length name)) (return))
+ (let ((i2 (or (position #\Space name :start i1) (length name))))
+ (let* ((word (subseq name i1 i2))
+ (len (length word)))
+ (when (>= len (length words-by-length))
+ (adjust-array words-by-length (1+ len))
+ )
+ (unless (aref words-by-length len)
+ (setf (aref words-by-length len)
+ (make-word-list
+ :hashed (make-hash-table :test #'equal)
+ :sorted '()
+ ) ) )
+ (let ((word-list (aref words-by-length len)))
+ (unless (gethash word (word-list-hashed word-list))
+ (setf (gethash word (word-list-hashed word-list)) t)
+ (push word (word-list-sorted word-list))
+ ) )
+ )
+ (setq i1 (1+ i2))
+ ) ) ) )
+ ;; Sort the word lists.
+ (dotimes (len (length words-by-length))
+ (unless (aref words-by-length len)
+ (setf (aref words-by-length len)
+ (make-word-list
+ :hashed (make-hash-table :test #'equal)
+ :sorted '()
+ ) ) )
+ (let ((word-list (aref words-by-length len)))
+ (setf (word-list-sorted word-list)
+ (sort (word-list-sorted word-list) #'string<)
+ )
+ (setf (word-list-size word-list)
+ (reduce #'+ (mapcar #'length (word-list-sorted word-list)))
+ )
+ (setf (word-list-length word-list)
+ (length (word-list-sorted word-list))
+ ) ) )
+ ;; Output the tables.
+ (with-open-file (ostream outputfile :direction :output
+ #+UNICODE :external-format #+UNICODE charset:ascii)
+ (format ostream "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */~%")
+ (format ostream "/*~%")
+ (format ostream " * ~A~%" (file-namestring outputfile))
+ (format ostream " *~%")
+ (format ostream " * Unicode character name table.~%")
+ (format ostream " * Generated automatically by the gen-uninames utility.~%")
+ (format ostream " */~%")
+ (format ostream "~%")
+ (format ostream "static const char unicode_name_words[~D] = {~%"
+ (let ((sum 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (incf sum (word-list-size word-list))
+ ) )
+ sum
+ ) )
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (dolist (word (word-list-sorted word-list))
+ (format ostream " ~{ '~C',~}~%" (coerce word 'list))
+ ) ) )
+ (format ostream "};~%")
+ (format ostream "#define UNICODE_CHARNAME_NUM_WORDS ~D~%"
+ (let ((sum 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (incf sum (word-list-length word-list))
+ ) )
+ sum
+ ) )
+ #| ; Redundant data
+ (format ostream "static const uint16_t unicode_name_word_offsets[~D] = {~%"
+ (let ((sum 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (incf sum (word-list-length word-list))
+ ) )
+ sum
+ ) )
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (when (word-list-sorted word-list)
+ (format ostream " ")
+ (do ((l (word-list-sorted word-list) (cdr l))
+ (offset 0 (+ offset (length (car l)))))
+ ((endp l))
+ (format ostream "~<~% ~0,79:; ~D,~>" offset)
+ )
+ (format ostream "~%")
+ ) ) )
+ (format ostream "};~%")
+ |#
+ (format ostream "static const struct { uint16_t extra_offset; uint16_t ind_offset; } unicode_name_by_length[~D] = {~%"
+ (1+ (length words-by-length))
+ )
+ (let ((extra-offset 0)
+ (ind-offset 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (format ostream " { ~D, ~D },~%" extra-offset ind-offset)
+ (incf extra-offset (word-list-size word-list))
+ (incf ind-offset (word-list-length word-list))
+ ) )
+ (format ostream " { ~D, ~D }~%" extra-offset ind-offset)
+ )
+ (format ostream "};~%")
+ (let ((ind-offset 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (dolist (word (word-list-sorted word-list))
+ (setf (gethash word (word-list-hashed word-list)) ind-offset)
+ (incf ind-offset)
+ ) ) ) )
+ (dolist (word '("HANGUL" "SYLLABLE" "CJK" "COMPATIBILITY"))
+ (format ostream "#define UNICODE_CHARNAME_WORD_~A ~D~%" word
+ (gethash word (word-list-hashed (aref words-by-length (length word))))
+ ) )
+ ;; Compute the word-indices for every unicode-char.
+ (dolist (uc all-chars)
+ (let ((name (unicode-char-name uc))
+ (indices '()))
+ (let ((i1 0))
+ (loop
+ (when (>= i1 (length name)) (return))
+ (let ((i2 (or (position #\Space name :start i1) (length name))))
+ (let* ((word (subseq name i1 i2))
+ (len (length word)))
+ (push (gethash word (word-list-hashed (aref words-by-length len)))
+ indices
+ )
+ )
+ (setq i1 (1+ i2))
+ ) ) )
+ (setf (unicode-char-word-indices uc)
+ (coerce (nreverse indices) 'vector)
+ )
+ ) )
+ ;; Sort the list of unicode-chars by word-indices.
+ (setq all-chars
+ (sort all-chars
+ (lambda (vec1 vec2)
+ (let ((len1 (length vec1))
+ (len2 (length vec2)))
+ (do ((i 0 (1+ i)))
+ (nil)
+ (if (< i len2)
+ (if (< i len1)
+ (cond ((< (aref vec1 i) (aref vec2 i)) (return t))
+ ((> (aref vec1 i) (aref vec2 i)) (return nil))
+ )
+ (return t)
+ )
+ (return nil)
+ ) ) ) )
+ :key #'unicode-char-word-indices
+ ) )
+ ;; Output the word-indices.
+ (format ostream "static const uint16_t unicode_names[~D] = {~%"
+ (reduce #'+ (mapcar (lambda (uc) (length (unicode-char-word-indices uc))) all-chars))
+ )
+ (let ((i 0))
+ (dolist (uc all-chars)
+ (format ostream " ~{ ~D,~}"
+ (maplist (lambda (r) (+ (* 2 (car r)) (if (cdr r) 1 0)))
+ (coerce (unicode-char-word-indices uc) 'list)
+ )
+ )
+ (when add-comments
+ (format ostream "~40T/* ~A */" (unicode-char-name uc))
+ )
+ (format ostream "~%")
+ (setf (unicode-char-word-indices-index uc) i)
+ (incf i (length (unicode-char-word-indices uc)))
+ ) )
+ (format ostream "};~%")
+ (format ostream "static const struct { uint16_t code; uint32_t name:24; }~%")
+ (format ostream "#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)~%__attribute__((__packed__))~%#endif~%")
+ (format ostream "unicode_name_to_code[~D] = {~%"
+ (length all-chars)
+ )
+ (dolist (uc all-chars)
+ (format ostream " { 0x~4,'0X, ~D },"
+ (unicode-char-code uc)
+ (unicode-char-word-indices-index uc)
+ )
+ (when add-comments
+ (format ostream "~21T/* ~A */" (unicode-char-name uc))
+ )
+ (format ostream "~%")
+ )
+ (format ostream "};~%")
+ (format ostream "static const struct { uint16_t code; uint32_t name:24; }~%")
+ (format ostream "#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)~%__attribute__((__packed__))~%#endif~%")
+ (format ostream "unicode_code_to_name[~D] = {~%"
+ (length all-chars)
+ )
+ (dolist (uc (sort (copy-list all-chars) #'< :key #'unicode-char-code))
+ (format ostream " { 0x~4,'0X, ~D },"
+ (unicode-char-code uc)
+ (unicode-char-word-indices-index uc)
+ )
+ (when add-comments
+ (format ostream "~21T/* ~A */" (unicode-char-name uc))
+ )
+ (format ostream "~%")
+ )
+ (format ostream "};~%")
+ (format ostream "#define UNICODE_CHARNAME_MAX_LENGTH ~D~%"
+ (reduce #'max (mapcar (lambda (uc) (length (unicode-char-name uc))) all-chars))
+ )
+ (format ostream "#define UNICODE_CHARNAME_MAX_WORDS ~D~%"
+ (reduce #'max (mapcar (lambda (uc) (length (unicode-char-word-indices uc))) all-chars))
+ )
+ )
+) ) )
+
+(main (first *args*) (second *args*))
diff --git a/gnulib/lib/uniname/uniname.c b/gnulib/lib/uniname/uniname.c
new file mode 100644
index 00000000..cf2be15c
--- /dev/null
+++ b/gnulib/lib/uniname/uniname.c
@@ -0,0 +1,516 @@
+/* Association between Unicode characters and their names.
+ Copyright (C) 2000-2002, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniname.h"
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+
+/* Table of Unicode character names, derived from UnicodeData.txt.
+ This table is generated in a way to minimize the memory footprint:
+ 1. its compiled size is small (less than 350 KB),
+ 2. it resides entirely in the text or read-only data segment of the
+ executable or shared library: the table contains only immediate
+ integers, no pointers, and the functions don't do heap allocation.
+ */
+#include "uninames.h"
+/* It contains:
+ static const char unicode_name_words[36303] = ...;
+ #define UNICODE_CHARNAME_NUM_WORDS 6260
+ static const struct { uint16_t extra_offset; uint16_t ind_offset; } unicode_name_by_length[26] = ...;
+ #define UNICODE_CHARNAME_WORD_HANGUL 3902
+ #define UNICODE_CHARNAME_WORD_SYLLABLE 4978
+ #define UNICODE_CHARNAME_WORD_CJK 417
+ #define UNICODE_CHARNAME_WORD_COMPATIBILITY 6107
+ static const uint16_t unicode_names[68940] = ...;
+ static const struct { uint16_t code; uint32_t name:24; } unicode_name_to_code[16626] = ...;
+ static const struct { uint16_t code; uint32_t name:24; } unicode_code_to_name[16626] = ...;
+ #define UNICODE_CHARNAME_MAX_LENGTH 83
+ #define UNICODE_CHARNAME_MAX_WORDS 13
+*/
+
+/* Returns the word with a given index. */
+static const char *
+unicode_name_word (unsigned int index, unsigned int *lengthp)
+{
+ unsigned int i1;
+ unsigned int i2;
+ unsigned int i;
+
+ assert (index < UNICODE_CHARNAME_NUM_WORDS);
+
+ /* Binary search for i with
+ unicode_name_by_length[i].ind_offset <= index
+ and
+ index < unicode_name_by_length[i+1].ind_offset
+ */
+
+ i1 = 0;
+ i2 = SIZEOF (unicode_name_by_length) - 1;
+ while (i2 - i1 > 1)
+ {
+ unsigned int i = (i1 + i2) >> 1;
+ if (unicode_name_by_length[i].ind_offset <= index)
+ i1 = i;
+ else
+ i2 = i;
+ }
+ i = i1;
+ assert (unicode_name_by_length[i].ind_offset <= index
+ && index < unicode_name_by_length[i+1].ind_offset);
+ *lengthp = i;
+ return &unicode_name_words[unicode_name_by_length[i].extra_offset
+ + (index-unicode_name_by_length[i].ind_offset)*i];
+}
+
+/* Looks up the index of a word. */
+static int
+unicode_name_word_lookup (const char *word, unsigned int length)
+{
+ if (length > 0 && length < SIZEOF (unicode_name_by_length) - 1)
+ {
+ /* Binary search among the words of given length. */
+ unsigned int extra_offset = unicode_name_by_length[length].extra_offset;
+ unsigned int i0 = unicode_name_by_length[length].ind_offset;
+ unsigned int i1 = i0;
+ unsigned int i2 = unicode_name_by_length[length+1].ind_offset;
+ while (i2 - i1 > 0)
+ {
+ unsigned int i = (i1 + i2) >> 1;
+ const char *p = &unicode_name_words[extra_offset + (i-i0)*length];
+ const char *w = word;
+ unsigned int n = length;
+ for (;;)
+ {
+ if (*p < *w)
+ {
+ if (i1 == i)
+ return -1;
+ /* Note here: i1 < i < i2. */
+ i1 = i;
+ break;
+ }
+ if (*p > *w)
+ {
+ /* Note here: i1 <= i < i2. */
+ i2 = i;
+ break;
+ }
+ p++; w++; n--;
+ if (n == 0)
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+/* Auxiliary tables for Hangul syllable names, see the Unicode 3.0 book,
+ sections 3.11 and 4.4. */
+static const char jamo_initial_short_name[19][3] =
+{
+ "G", "GG", "N", "D", "DD", "R", "M", "B", "BB", "S", "SS", "", "J", "JJ",
+ "C", "K", "T", "P", "H"
+};
+static const char jamo_medial_short_name[21][4] =
+{
+ "A", "AE", "YA", "YAE", "EO", "E", "YEO", "YE", "O", "WA", "WAE", "OE", "YO",
+ "U", "WEO", "WE", "WI", "YU", "EU", "YI", "I"
+};
+static const char jamo_final_short_name[28][3] =
+{
+ "", "G", "GG", "GS", "N", "NI", "NH", "D", "L", "LG", "LM", "LB", "LS", "LT",
+ "LP", "LH", "M", "B", "BS", "S", "SS", "NG", "J", "C", "K", "T", "P", "H"
+};
+
+/* Looks up the name of a Unicode character, in uppercase ASCII.
+ Returns the filled buf, or NULL if the character does not have a name. */
+char *
+unicode_character_name (ucs4_t c, char *buf)
+{
+ if (c >= 0xAC00 && c <= 0xD7A3)
+ {
+ /* Special case for Hangul syllables. Keeps the tables small. */
+ char *ptr;
+ unsigned int tmp;
+ unsigned int index1;
+ unsigned int index2;
+ unsigned int index3;
+ const char *q;
+
+ /* buf needs to have at least 16 + 7 bytes here. */
+ memcpy (buf, "HANGUL SYLLABLE ", 16);
+ ptr = buf + 16;
+
+ tmp = c - 0xAC00;
+ index3 = tmp % 28; tmp = tmp / 28;
+ index2 = tmp % 21; tmp = tmp / 21;
+ index1 = tmp;
+
+ q = jamo_initial_short_name[index1];
+ while (*q != '\0')
+ *ptr++ = *q++;
+ q = jamo_medial_short_name[index2];
+ while (*q != '\0')
+ *ptr++ = *q++;
+ q = jamo_final_short_name[index3];
+ while (*q != '\0')
+ *ptr++ = *q++;
+ *ptr = '\0';
+ return buf;
+ }
+ else if ((c >= 0xF900 && c <= 0xFA2D) || (c >= 0xFA30 && c <= 0xFA6A)
+ || (c >= 0xFA70 && c <= 0xFAD9) || (c >= 0x2F800 && c <= 0x2FA1D))
+ {
+ /* Special case for CJK compatibility ideographs. Keeps the tables
+ small. */
+ char *ptr;
+ int i;
+
+ /* buf needs to have at least 28 + 5 bytes here. */
+ memcpy (buf, "CJK COMPATIBILITY IDEOGRAPH-", 28);
+ ptr = buf + 28;
+
+ for (i = (c < 0x10000 ? 12 : 16); i >= 0; i -= 4)
+ {
+ unsigned int x = (c >> i) & 0xf;
+ *ptr++ = (x < 10 ? '0' : 'A' - 10) + x;
+ }
+ *ptr = '\0';
+ return buf;
+ }
+ else
+ {
+ const uint16_t *words;
+
+ /* Transform the code so that it fits in 16 bits. */
+ switch (c >> 12)
+ {
+ case 0x00: case 0x01: case 0x02: case 0x03: case 0x04:
+ break;
+ case 0x0A:
+ c -= 0x05000;
+ break;
+ case 0x0F:
+ c -= 0x09000;
+ break;
+ case 0x10:
+ c -= 0x09000;
+ break;
+ case 0x12:
+ c -= 0x0A000;
+ break;
+ case 0x1D:
+ c -= 0x14000;
+ break;
+ case 0x1F:
+ c -= 0x15000;
+ break;
+ case 0x2F:
+ c -= 0x24000;
+ break;
+ case 0xE0:
+ c -= 0xD4000;
+ break;
+ default:
+ return NULL;
+ }
+
+ {
+ /* Binary search in unicode_code_to_name. */
+ unsigned int i1 = 0;
+ unsigned int i2 = SIZEOF (unicode_code_to_name);
+ for (;;)
+ {
+ unsigned int i = (i1 + i2) >> 1;
+ if (unicode_code_to_name[i].code == c)
+ {
+ words = &unicode_names[unicode_code_to_name[i].name];
+ break;
+ }
+ else if (unicode_code_to_name[i].code < c)
+ {
+ if (i1 == i)
+ {
+ words = NULL;
+ break;
+ }
+ /* Note here: i1 < i < i2. */
+ i1 = i;
+ }
+ else if (unicode_code_to_name[i].code > c)
+ {
+ if (i2 == i)
+ {
+ words = NULL;
+ break;
+ }
+ /* Note here: i1 <= i < i2. */
+ i2 = i;
+ }
+ }
+ }
+ if (words != NULL)
+ {
+ /* Found it in unicode_code_to_name. Now concatenate the words. */
+ /* buf needs to have at least UNICODE_CHARNAME_MAX_LENGTH bytes. */
+ char *ptr = buf;
+ for (;;)
+ {
+ unsigned int wordlen;
+ const char *word = unicode_name_word (*words>>1, &wordlen);
+ do
+ *ptr++ = *word++;
+ while (--wordlen > 0);
+ if ((*words & 1) == 0)
+ break;
+ *ptr++ = ' ';
+ words++;
+ }
+ *ptr = '\0';
+ return buf;
+ }
+ return NULL;
+ }
+}
+
+/* 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. */
+ucs4_t
+unicode_name_character (const char *name)
+{
+ unsigned int len = strlen (name);
+ if (len > 1 && len <= UNICODE_CHARNAME_MAX_LENGTH)
+ {
+ /* Test for "word1 word2 ..." syntax. */
+ char buf[UNICODE_CHARNAME_MAX_LENGTH];
+ char *ptr = buf;
+ for (;;)
+ {
+ char c = *name++;
+ if (!(c >= ' ' && c <= '~'))
+ break;
+ *ptr++ = (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c);
+ if (--len == 0)
+ goto filled_buf;
+ }
+ if (false)
+ filled_buf:
+ {
+ /* Convert the constituents to uint16_t words. */
+ uint16_t words[UNICODE_CHARNAME_MAX_WORDS];
+ uint16_t *wordptr = words;
+ {
+ const char *p1 = buf;
+ for (;;)
+ {
+ {
+ int word;
+ const char *p2 = p1;
+ while (p2 < ptr && *p2 != ' ')
+ p2++;
+ word = unicode_name_word_lookup (p1, p2 - p1);
+ if (word < 0)
+ break;
+ if (wordptr == &words[UNICODE_CHARNAME_MAX_WORDS])
+ break;
+ *wordptr++ = word;
+ if (p2 == ptr)
+ goto filled_words;
+ p1 = p2 + 1;
+ }
+ /* Special case for Hangul syllables. Keeps the tables small. */
+ if (wordptr == &words[2]
+ && words[0] == UNICODE_CHARNAME_WORD_HANGUL
+ && words[1] == UNICODE_CHARNAME_WORD_SYLLABLE)
+ {
+ /* Split the last word [p1..ptr) into three parts:
+ 1) [BCDGHJKMNPRST]
+ 2) [AEIOUWY]
+ 3) [BCDGHIJKLMNPST]
+ */
+ const char *p2;
+ const char *p3;
+ const char *p4;
+
+ p2 = p1;
+ while (p2 < ptr
+ && (*p2 == 'B' || *p2 == 'C' || *p2 == 'D'
+ || *p2 == 'G' || *p2 == 'H' || *p2 == 'J'
+ || *p2 == 'K' || *p2 == 'M' || *p2 == 'N'
+ || *p2 == 'P' || *p2 == 'R' || *p2 == 'S'
+ || *p2 == 'T'))
+ p2++;
+ p3 = p2;
+ while (p3 < ptr
+ && (*p3 == 'A' || *p3 == 'E' || *p3 == 'I'
+ || *p3 == 'O' || *p3 == 'U' || *p3 == 'W'
+ || *p3 == 'Y'))
+ p3++;
+ p4 = p3;
+ while (p4 < ptr
+ && (*p4 == 'B' || *p4 == 'C' || *p4 == 'D'
+ || *p4 == 'G' || *p4 == 'H' || *p4 == 'I'
+ || *p4 == 'J' || *p4 == 'K' || *p4 == 'L'
+ || *p4 == 'M' || *p4 == 'N' || *p4 == 'P'
+ || *p4 == 'S' || *p4 == 'T'))
+ p4++;
+ if (p4 == ptr)
+ {
+ unsigned int n1 = p2 - p1;
+ unsigned int n2 = p3 - p2;
+ unsigned int n3 = p4 - p3;
+
+ if (n1 <= 2 && (n2 >= 1 && n2 <= 3) && n3 <= 2)
+ {
+ unsigned int index1;
+
+ for (index1 = 0; index1 < 19; index1++)
+ if (memcmp(jamo_initial_short_name[index1], p1, n1) == 0
+ && jamo_initial_short_name[index1][n1] == '\0')
+ {
+ unsigned int index2;
+
+ for (index2 = 0; index2 < 21; index2++)
+ if (memcmp(jamo_medial_short_name[index2], p2, n2) == 0
+ && jamo_medial_short_name[index2][n2] == '\0')
+ {
+ unsigned int index3;
+
+ for (index3 = 0; index3 < 28; index3++)
+ if (memcmp(jamo_final_short_name[index3], p3, n3) == 0
+ && jamo_final_short_name[index3][n3] == '\0')
+ {
+ return 0xAC00 + (index1 * 21 + index2) * 28 + index3;
+ }
+ break;
+ }
+ break;
+ }
+ }
+ }
+ }
+ /* Special case for CJK compatibility ideographs. Keeps the
+ tables small. */
+ if (wordptr == &words[2]
+ && words[0] == UNICODE_CHARNAME_WORD_CJK
+ && words[1] == UNICODE_CHARNAME_WORD_COMPATIBILITY
+ && p1 + 14 <= ptr
+ && p1 + 15 >= ptr
+ && memcmp (p1, "IDEOGRAPH-", 10) == 0)
+ {
+ const char *p2 = p1 + 10;
+
+ if (*p2 != '0')
+ {
+ unsigned int c = 0;
+
+ for (;;)
+ {
+ if (*p2 >= '0' && *p2 <= '9')
+ c += (*p2 - '0');
+ else if (*p2 >= 'A' && *p2 <= 'F')
+ c += (*p2 - 'A' + 10);
+ else
+ break;
+ p2++;
+ if (p2 == ptr)
+ {
+ if ((c >= 0xF900 && c <= 0xFA2D)
+ || (c >= 0xFA30 && c <= 0xFA6A)
+ || (c >= 0xFA70 && c <= 0xFAD9)
+ || (c >= 0x2F800 && c <= 0x2FA1D))
+ return c;
+ else
+ break;
+ }
+ c = c << 4;
+ }
+ }
+ }
+ }
+ }
+ if (false)
+ filled_words:
+ {
+ /* Multiply by 2, to simplify later comparisons. */
+ unsigned int words_length = wordptr - words;
+ {
+ int i = words_length - 1;
+ words[i] = 2 * words[i];
+ for (; --i >= 0; )
+ words[i] = 2 * words[i] + 1;
+ }
+ /* Binary search in unicode_name_to_code. */
+ {
+ unsigned int i1 = 0;
+ unsigned int i2 = SIZEOF (unicode_name_to_code);
+ for (;;)
+ {
+ unsigned int i = (i1 + i2) >> 1;
+ const uint16_t *w = words;
+ const uint16_t *p = &unicode_names[unicode_name_to_code[i].name];
+ unsigned int n = words_length;
+ for (;;)
+ {
+ if (*p < *w)
+ {
+ if (i1 == i)
+ goto name_not_found;
+ /* Note here: i1 < i < i2. */
+ i1 = i;
+ break;
+ }
+ else if (*p > *w)
+ {
+ if (i2 == i)
+ goto name_not_found;
+ /* Note here: i1 <= i < i2. */
+ i2 = i;
+ break;
+ }
+ p++; w++; n--;
+ if (n == 0)
+ {
+ unsigned int c = unicode_name_to_code[i].code;
+
+ /* Undo the transformation to 16-bit space. */
+ static const unsigned int offset[13] =
+ {
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x05000, 0x09000, 0x09000, 0x0A000, 0x14000,
+ 0x15000, 0x24000, 0xD4000
+ };
+ return c + offset[c >> 12];
+ }
+ }
+ }
+ }
+ name_not_found: ;
+ }
+ }
+ }
+ return UNINAME_INVALID;
+}
diff --git a/gnulib/lib/uniname/uninames.h b/gnulib/lib/uniname/uninames.h
new file mode 100644
index 00000000..7b6db1f1
--- /dev/null
+++ b/gnulib/lib/uniname/uninames.h
@@ -0,0 +1,61495 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/*
+ * uninames.h
+ *
+ * Unicode character name table.
+ * Generated automatically by the gen-uninames utility.
+ */
+
+static const char unicode_name_words[39544] = {
+ 'A',
+ 'B',
+ 'C',
+ 'D',
+ 'E',
+ 'F',
+ 'G',
+ 'H',
+ 'I',
+ 'J',
+ 'K',
+ 'L',
+ 'M',
+ 'N',
+ 'O',
+ 'P',
+ 'Q',
+ 'R',
+ 'S',
+ 'T',
+ 'U',
+ 'V',
+ 'W',
+ 'X',
+ 'Y',
+ 'Z',
+ '-', 'A',
+ 'A', '2',
+ 'A', '3',
+ 'A', 'A',
+ 'A', 'B',
+ 'A', 'C',
+ 'A', 'D',
+ 'A', 'E',
+ 'A', 'G',
+ 'A', 'H',
+ 'A', 'I',
+ 'A', 'K',
+ 'A', 'L',
+ 'A', 'M',
+ 'A', 'N',
+ 'A', 'O',
+ 'A', 'P',
+ 'A', 'Q',
+ 'A', 'S',
+ 'A', 'T',
+ 'A', 'U',
+ 'A', 'V',
+ 'A', 'X',
+ 'A', 'Y',
+ 'B', 'A',
+ 'B', 'E',
+ 'B', 'H',
+ 'B', 'I',
+ 'B', 'O',
+ 'B', 'Q',
+ 'B', 'U',
+ 'B', 'Y',
+ 'C', 'A',
+ 'C', 'C',
+ 'C', 'D',
+ 'C', 'E',
+ 'C', 'H',
+ 'C', 'I',
+ 'C', 'M',
+ 'C', 'O',
+ 'C', 'U',
+ 'C', 'Y',
+ 'D', '2',
+ 'D', 'A',
+ 'D', 'B',
+ 'D', 'E',
+ 'D', 'I',
+ 'D', 'L',
+ 'D', 'M',
+ 'D', 'O',
+ 'D', 'U',
+ 'D', 'V',
+ 'D', 'Z',
+ 'E', '2',
+ 'E', 'A',
+ 'E', 'E',
+ 'E', 'F',
+ 'E', 'H',
+ 'E', 'I',
+ 'E', 'K',
+ 'E', 'L',
+ 'E', 'M',
+ 'E', 'N',
+ 'E', 'O',
+ 'E', 'P',
+ 'E', 'R',
+ 'E', 'S',
+ 'E', 'T',
+ 'E', 'U',
+ 'E', 'V',
+ 'E', 'W',
+ 'E', 'X',
+ 'F', 'A',
+ 'F', 'E',
+ 'F', 'F',
+ 'F', 'I',
+ 'F', 'L',
+ 'F', 'M',
+ 'F', 'O',
+ 'F', 'U',
+ 'F', 'Y',
+ 'G', '2',
+ 'G', 'A',
+ 'G', 'B',
+ 'G', 'E',
+ 'G', 'G',
+ 'G', 'I',
+ 'G', 'N',
+ 'G', 'O',
+ 'G', 'U',
+ 'G', 'V',
+ 'G', 'Y',
+ 'H', 'A',
+ 'H', 'E',
+ 'H', 'G',
+ 'H', 'I',
+ 'H', 'K',
+ 'H', 'O',
+ 'H', 'P',
+ 'H', 'U',
+ 'H', 'V',
+ 'H', 'Z',
+ 'I', 'B',
+ 'I', 'E',
+ 'I', 'F',
+ 'I', 'G',
+ 'I', 'H',
+ 'I', 'I',
+ 'I', 'J',
+ 'I', 'L',
+ 'I', 'M',
+ 'I', 'N',
+ 'I', 'O',
+ 'I', 'P',
+ 'I', 'R',
+ 'I', 'S',
+ 'I', 'T',
+ 'I', 'U',
+ 'I', 'X',
+ 'I', 'Y',
+ 'J', 'A',
+ 'J', 'E',
+ 'J', 'I',
+ 'J', 'O',
+ 'J', 'U',
+ 'J', 'Y',
+ 'K', '2',
+ 'K', 'A',
+ 'K', 'B',
+ 'K', 'E',
+ 'K', 'G',
+ 'K', 'I',
+ 'K', 'K',
+ 'K', 'L',
+ 'K', 'M',
+ 'K', 'O',
+ 'K', 'T',
+ 'K', 'U',
+ 'K', 'V',
+ 'K', 'W',
+ 'L', 'A',
+ 'L', 'D',
+ 'L', 'E',
+ 'L', 'H',
+ 'L', 'I',
+ 'L', 'J',
+ 'L', 'L',
+ 'L', 'M',
+ 'L', 'N',
+ 'L', 'O',
+ 'L', 'S',
+ 'L', 'U',
+ 'L', 'V',
+ 'L', 'X',
+ 'L', 'Y',
+ 'L', 'Z',
+ 'M', 'A',
+ 'M', 'B',
+ 'M', 'E',
+ 'M', 'G',
+ 'M', 'H',
+ 'M', 'I',
+ 'M', 'L',
+ 'M', 'M',
+ 'M', 'O',
+ 'M', 'S',
+ 'M', 'U',
+ 'M', 'V',
+ 'M', 'W',
+ 'M', 'Y',
+ 'N', 'A',
+ 'N', 'D',
+ 'N', 'E',
+ 'N', 'F',
+ 'N', 'G',
+ 'N', 'H',
+ 'N', 'I',
+ 'N', 'J',
+ 'N', 'M',
+ 'N', 'N',
+ 'N', 'O',
+ 'N', 'S',
+ 'N', 'U',
+ 'N', 'V',
+ 'N', 'W',
+ 'O', 'A',
+ 'O', 'B',
+ 'O', 'E',
+ 'O', 'F',
+ 'O', 'H',
+ 'O', 'I',
+ 'O', 'L',
+ 'O', 'M',
+ 'O', 'N',
+ 'O', 'O',
+ 'O', 'P',
+ 'O', 'R',
+ 'O', 'S',
+ 'O', 'T',
+ 'O', 'U',
+ 'O', 'V',
+ 'O', 'W',
+ 'O', 'X',
+ 'O', 'Y',
+ 'P', '2',
+ 'P', 'A',
+ 'P', 'C',
+ 'P', 'D',
+ 'P', 'E',
+ 'P', 'F',
+ 'P', 'G',
+ 'P', 'H',
+ 'P', 'I',
+ 'P', 'M',
+ 'P', 'O',
+ 'P', 'R',
+ 'P', 'S',
+ 'P', 'U',
+ 'P', 'V',
+ 'P', 'W',
+ 'P', 'Y',
+ 'P', 'Z',
+ 'Q', 'A',
+ 'Q', 'E',
+ 'Q', 'I',
+ 'Q', 'O',
+ 'Q', 'P',
+ 'Q', 'U',
+ 'Q', 'Y',
+ 'R', 'A',
+ 'R', 'E',
+ 'R', 'I',
+ 'R', 'O',
+ 'R', 'R',
+ 'R', 'U',
+ 'R', 'Y',
+ 'S', 'A',
+ 'S', 'E',
+ 'S', 'G',
+ 'S', 'H',
+ 'S', 'I',
+ 'S', 'K',
+ 'S', 'O',
+ 'S', 'P',
+ 'S', 'R',
+ 'S', 'S',
+ 'S', 'T',
+ 'S', 'U',
+ 'S', 'V',
+ 'S', 'W',
+ 'S', 'Y',
+ 'S', 'Z',
+ 'T', 'A',
+ 'T', 'C',
+ 'T', 'E',
+ 'T', 'H',
+ 'T', 'I',
+ 'T', 'N',
+ 'T', 'O',
+ 'T', 'R',
+ 'T', 'S',
+ 'T', 'T',
+ 'T', 'U',
+ 'T', 'Z',
+ 'U', '2',
+ 'U', 'A',
+ 'U', 'B',
+ 'U', 'C',
+ 'U', 'D',
+ 'U', 'E',
+ 'U', 'K',
+ 'U', 'M',
+ 'U', 'N',
+ 'U', 'O',
+ 'U', 'P',
+ 'U', 'R',
+ 'U', 'S',
+ 'U', 'U',
+ 'U', 'Y',
+ 'V', 'A',
+ 'V', 'E',
+ 'V', 'I',
+ 'V', 'O',
+ 'V', 'U',
+ 'V', 'Y',
+ 'W', 'A',
+ 'W', 'B',
+ 'W', 'E',
+ 'W', 'G',
+ 'W', 'I',
+ 'W', 'O',
+ 'W', 'U',
+ 'W', 'V',
+ 'X', 'A',
+ 'X', 'E',
+ 'X', 'G',
+ 'X', 'I',
+ 'X', 'O',
+ 'X', 'U',
+ 'X', 'Y',
+ 'Y', 'A',
+ 'Y', 'E',
+ 'Y', 'I',
+ 'Y', 'N',
+ 'Y', 'O',
+ 'Y', 'R',
+ 'Y', 'U',
+ 'Y', 'V',
+ 'Y', 'Y',
+ 'Z', 'A',
+ 'Z', 'E',
+ 'Z', 'H',
+ 'Z', 'I',
+ 'Z', 'O',
+ 'Z', 'U',
+ 'Z', 'Y',
+ '-', 'U', 'M',
+ 'A', '-', 'O',
+ 'A', '-', 'U',
+ 'A', 'A', 'I',
+ 'A', 'A', 'J',
+ 'A', 'A', 'K',
+ 'A', 'A', 'M',
+ 'A', 'A', 'W',
+ 'A', 'A', 'Y',
+ 'A', 'B', '2',
+ 'A', 'D', 'I',
+ 'A', 'D', 'O',
+ 'A', 'G', 'E',
+ 'A', 'I', 'N',
+ 'A', 'I', 'R',
+ 'A', 'L', 'F',
+ 'A', 'L', 'I',
+ 'A', 'L', 'L',
+ 'A', 'N', 'D',
+ 'A', 'N', 'G',
+ 'A', 'N', 'N',
+ 'A', 'N', 'O',
+ 'A', 'P', 'L',
+ 'A', 'R', 'C',
+ 'A', 'R', 'E',
+ 'A', 'R', 'M',
+ 'A', 'S', 'H',
+ 'A', 'U', 'E',
+ 'A', 'W', 'E',
+ 'A', 'X', 'E',
+ 'A', 'Y', 'B',
+ 'A', 'Z', 'U',
+ 'B', 'A', 'A',
+ 'B', 'A', 'D',
+ 'B', 'A', 'G',
+ 'B', 'A', 'L',
+ 'B', 'A', 'N',
+ 'B', 'A', 'P',
+ 'B', 'A', 'R',
+ 'B', 'A', 'T',
+ 'B', 'A', 'X',
+ 'B', 'B', 'A',
+ 'B', 'B', 'E',
+ 'B', 'B', 'I',
+ 'B', 'B', 'O',
+ 'B', 'B', 'U',
+ 'B', 'B', 'Y',
+ 'B', 'E', 'E',
+ 'B', 'E', 'H',
+ 'B', 'E', 'I',
+ 'B', 'E', 'N',
+ 'B', 'E', 'P',
+ 'B', 'E', 'T',
+ 'B', 'E', 'X',
+ 'B', 'H', 'A',
+ 'B', 'H', 'E',
+ 'B', 'H', 'I',
+ 'B', 'H', 'O',
+ 'B', 'H', 'U',
+ 'B', 'I', 'B',
+ 'B', 'I', 'E',
+ 'B', 'I', 'G',
+ 'B', 'I', 'P',
+ 'B', 'I', 'T',
+ 'B', 'I', 'X',
+ 'B', 'L', 'A',
+ 'B', 'O', 'A',
+ 'B', 'O', 'O',
+ 'B', 'O', 'P',
+ 'B', 'O', 'T',
+ 'B', 'O', 'W',
+ 'B', 'O', 'X',
+ 'B', 'U', 'O',
+ 'B', 'U', 'P',
+ 'B', 'U', 'R',
+ 'B', 'U', 'T',
+ 'B', 'U', 'X',
+ 'B', 'W', 'A',
+ 'B', 'W', 'E',
+ 'B', 'W', 'I',
+ 'B', 'X', 'G',
+ 'B', 'Y', 'P',
+ 'B', 'Y', 'R',
+ 'B', 'Y', 'T',
+ 'B', 'Y', 'X',
+ 'C', 'A', 'A',
+ 'C', 'A', 'L',
+ 'C', 'A', 'N',
+ 'C', 'A', 'P',
+ 'C', 'A', 'T',
+ 'C', 'A', 'X',
+ 'C', 'C', 'A',
+ 'C', 'C', 'E',
+ 'C', 'C', 'I',
+ 'C', 'C', 'O',
+ 'C', 'C', 'U',
+ 'C', 'E', 'E',
+ 'C', 'E', 'N',
+ 'C', 'E', 'P',
+ 'C', 'E', 'X',
+ 'C', 'H', 'A',
+ 'C', 'H', 'E',
+ 'C', 'H', 'I',
+ 'C', 'H', 'O',
+ 'C', 'H', 'U',
+ 'C', 'H', 'Y',
+ 'C', 'I', 'E',
+ 'C', 'I', 'I',
+ 'C', 'I', 'L',
+ 'C', 'I', 'P',
+ 'C', 'I', 'T',
+ 'C', 'I', 'X',
+ 'C', 'J', 'K',
+ 'C', 'O', 'A',
+ 'C', 'O', 'N',
+ 'C', 'O', 'O',
+ 'C', 'O', 'P',
+ 'C', 'O', 'T',
+ 'C', 'O', 'W',
+ 'C', 'O', 'X',
+ 'C', 'U', 'M',
+ 'C', 'U', 'O',
+ 'C', 'U', 'P',
+ 'C', 'U', 'R',
+ 'C', 'U', 'T',
+ 'C', 'U', 'X',
+ 'C', 'W', 'A',
+ 'C', 'W', 'E',
+ 'C', 'W', 'I',
+ 'C', 'W', 'O',
+ 'C', 'Y', 'A',
+ 'C', 'Y', 'P',
+ 'C', 'Y', 'R',
+ 'C', 'Y', 'T',
+ 'C', 'Y', 'X',
+ 'D', 'A', 'A',
+ 'D', 'A', 'D',
+ 'D', 'A', 'G',
+ 'D', 'A', 'L',
+ 'D', 'A', 'M',
+ 'D', 'A', 'P',
+ 'D', 'A', 'R',
+ 'D', 'A', 'T',
+ 'D', 'A', 'X',
+ 'D', 'A', 'Y',
+ 'D', 'D', 'A',
+ 'D', 'D', 'E',
+ 'D', 'D', 'I',
+ 'D', 'D', 'O',
+ 'D', 'D', 'U',
+ 'D', 'E', 'E',
+ 'D', 'E', 'I',
+ 'D', 'E', 'K',
+ 'D', 'E', 'L',
+ 'D', 'E', 'P',
+ 'D', 'E', 'X',
+ 'D', 'H', 'A',
+ 'D', 'H', 'E',
+ 'D', 'H', 'I',
+ 'D', 'H', 'O',
+ 'D', 'H', 'U',
+ 'D', 'I', 'B',
+ 'D', 'I', 'E',
+ 'D', 'I', 'M',
+ 'D', 'I', 'N',
+ 'D', 'I', 'P',
+ 'D', 'I', 'T',
+ 'D', 'I', 'X',
+ 'D', 'J', 'A',
+ 'D', 'J', 'E',
+ 'D', 'L', 'A',
+ 'D', 'L', 'E',
+ 'D', 'L', 'I',
+ 'D', 'L', 'O',
+ 'D', 'L', 'U',
+ 'D', 'O', 'A',
+ 'D', 'O', 'G',
+ 'D', 'O', 'N',
+ 'D', 'O', 'O',
+ 'D', 'O', 'P',
+ 'D', 'O', 'T',
+ 'D', 'O', 'X',
+ 'D', 'R', 'Y',
+ 'D', 'U', 'B',
+ 'D', 'U', 'G',
+ 'D', 'U', 'H',
+ 'D', 'U', 'L',
+ 'D', 'U', 'M',
+ 'D', 'U', 'N',
+ 'D', 'U', 'O',
+ 'D', 'U', 'P',
+ 'D', 'U', 'R',
+ 'D', 'U', 'T',
+ 'D', 'U', 'X',
+ 'D', 'W', 'A',
+ 'D', 'W', 'E',
+ 'D', 'W', 'O',
+ 'D', 'Y', 'O',
+ 'D', 'Z', 'A',
+ 'D', 'Z', 'E',
+ 'D', 'Z', 'I',
+ 'D', 'Z', 'O',
+ 'D', 'Z', 'U',
+ 'E', 'A', 'R',
+ 'E', 'A', 'T',
+ 'E', 'C', 'H',
+ 'E', 'D', 'D',
+ 'E', 'E', 'N',
+ 'E', 'G', 'G',
+ 'E', 'I', 'E',
+ 'E', 'I', 'S',
+ 'E', 'K', 'S',
+ 'E', 'N', 'D',
+ 'E', 'N', 'G',
+ 'E', 'N', 'N',
+ 'E', 'O', 'H',
+ 'E', 'R', 'A',
+ 'E', 'R', 'G',
+ 'E', 'R', 'R',
+ 'E', 'R', 'S',
+ 'E', 'S', 'H',
+ 'E', 'S', 'O',
+ 'E', 'T', 'A',
+ 'E', 'T', 'H',
+ 'E', 'W', 'E',
+ 'E', 'X', 'O',
+ 'E', 'Y', 'E',
+ 'E', 'Z', 'H',
+ 'F', 'A', 'A',
+ 'F', 'A', 'N',
+ 'F', 'A', 'P',
+ 'F', 'A', 'T',
+ 'F', 'A', 'X',
+ 'F', 'E', 'E',
+ 'F', 'E', 'H',
+ 'F', 'E', 'I',
+ 'F', 'F', 'I',
+ 'F', 'F', 'L',
+ 'F', 'I', 'I',
+ 'F', 'I', 'P',
+ 'F', 'I', 'T',
+ 'F', 'I', 'X',
+ 'F', 'L', 'A',
+ 'F', 'L', 'Y',
+ 'F', 'O', 'O',
+ 'F', 'O', 'P',
+ 'F', 'O', 'R',
+ 'F', 'O', 'X',
+ 'F', 'U', 'P',
+ 'F', 'U', 'R',
+ 'F', 'U', 'T',
+ 'F', 'U', 'X',
+ 'F', 'W', 'A',
+ 'F', 'W', 'E',
+ 'F', 'W', 'I',
+ 'F', 'Y', 'A',
+ 'F', 'Y', 'P',
+ 'F', 'Y', 'T',
+ 'F', 'Y', 'X',
+ 'G', 'A', '2',
+ 'G', 'A', 'A',
+ 'G', 'A', 'D',
+ 'G', 'A', 'F',
+ 'G', 'A', 'G',
+ 'G', 'A', 'L',
+ 'G', 'A', 'M',
+ 'G', 'A', 'N',
+ 'G', 'A', 'P',
+ 'G', 'A', 'R',
+ 'G', 'A', 'T',
+ 'G', 'A', 'X',
+ 'G', 'A', 'Y',
+ 'G', 'B', 'A',
+ 'G', 'B', 'E',
+ 'G', 'B', 'I',
+ 'G', 'B', 'O',
+ 'G', 'B', 'U',
+ 'G', 'E', 'E',
+ 'G', 'E', 'N',
+ 'G', 'E', 'P',
+ 'G', 'E', 'R',
+ 'G', 'E', 'T',
+ 'G', 'E', 'X',
+ 'G', 'G', 'A',
+ 'G', 'G', 'E',
+ 'G', 'G', 'I',
+ 'G', 'G', 'O',
+ 'G', 'G', 'U',
+ 'G', 'H', 'A',
+ 'G', 'H', 'E',
+ 'G', 'H', 'I',
+ 'G', 'H', 'O',
+ 'G', 'H', 'U',
+ 'G', 'H', 'Z',
+ 'G', 'I', '4',
+ 'G', 'I', 'E',
+ 'G', 'I', 'M',
+ 'G', 'I', 'P',
+ 'G', 'I', 'T',
+ 'G', 'I', 'X',
+ 'G', 'J', 'E',
+ 'G', 'L', 'A',
+ 'G', 'O', 'A',
+ 'G', 'O', 'O',
+ 'G', 'O', 'P',
+ 'G', 'O', 'T',
+ 'G', 'O', 'X',
+ 'G', 'P', 'A',
+ 'G', 'R', 'U',
+ 'G', 'U', '2',
+ 'G', 'U', 'D',
+ 'G', 'U', 'G',
+ 'G', 'U', 'L',
+ 'G', 'U', 'M',
+ 'G', 'U', 'O',
+ 'G', 'U', 'P',
+ 'G', 'U', 'R',
+ 'G', 'U', 'T',
+ 'G', 'U', 'X',
+ 'G', 'W', 'A',
+ 'G', 'W', 'E',
+ 'G', 'W', 'I',
+ 'G', 'Y', 'A',
+ 'G', 'Y', 'E',
+ 'G', 'Y', 'I',
+ 'G', 'Y', 'O',
+ 'G', 'Y', 'U',
+ 'H', 'A', 'A',
+ 'H', 'A', 'E',
+ 'H', 'A', 'H',
+ 'H', 'A', 'L',
+ 'H', 'A', 'N',
+ 'H', 'A', 'P',
+ 'H', 'A', 'R',
+ 'H', 'A', 'T',
+ 'H', 'A', 'X',
+ 'H', 'E', 'E',
+ 'H', 'E', 'H',
+ 'H', 'E', 'I',
+ 'H', 'E', 'N',
+ 'H', 'E', 'P',
+ 'H', 'E', 'T',
+ 'H', 'E', 'X',
+ 'H', 'H', 'A',
+ 'H', 'H', 'E',
+ 'H', 'H', 'I',
+ 'H', 'H', 'O',
+ 'H', 'H', 'U',
+ 'H', 'I', 'E',
+ 'H', 'I', 'I',
+ 'H', 'I', 'N',
+ 'H', 'I', 'P',
+ 'H', 'I', 'T',
+ 'H', 'L', 'A',
+ 'H', 'L', 'E',
+ 'H', 'L', 'I',
+ 'H', 'L', 'O',
+ 'H', 'L', 'U',
+ 'H', 'L', 'Y',
+ 'H', 'M', 'A',
+ 'H', 'M', 'I',
+ 'H', 'M', 'O',
+ 'H', 'M', 'U',
+ 'H', 'M', 'Y',
+ 'H', 'N', 'A',
+ 'H', 'N', 'E',
+ 'H', 'N', 'I',
+ 'H', 'O', 'A',
+ 'H', 'O', 'E',
+ 'H', 'O', 'N',
+ 'H', 'O', 'O',
+ 'H', 'O', 'P',
+ 'H', 'O', 'T',
+ 'H', 'O', 'X',
+ 'H', 'P', 'A',
+ 'H', 'T', 'A',
+ 'H', 'U', 'N',
+ 'H', 'U', 'O',
+ 'H', 'W', 'A',
+ 'H', 'W', 'E',
+ 'H', 'W', 'I',
+ 'H', 'W', 'O',
+ 'H', 'W', 'U',
+ 'H', 'X', 'A',
+ 'H', 'X', 'E',
+ 'H', 'X', 'I',
+ 'H', 'X', 'O',
+ 'H', 'Z', 'G',
+ 'H', 'Z', 'T',
+ 'H', 'Z', 'W',
+ 'H', 'Z', 'Z',
+ 'I', '-', 'A',
+ 'I', '-', 'O',
+ 'I', '-', 'U',
+ 'I', 'A', 'N',
+ 'I', 'C', 'E',
+ 'I', 'E', 'P',
+ 'I', 'E', 'T',
+ 'I', 'E', 'X',
+ 'I', 'G', 'I',
+ 'I', 'L', '2',
+ 'I', 'N', 'G',
+ 'I', 'N', 'I',
+ 'I', 'N', 'N',
+ 'I', 'N', 'Y',
+ 'I', 'O', 'R',
+ 'I', 'R', 'I',
+ 'I', 'S', 'H',
+ 'I', 'S', 'S',
+ 'J', 'A', 'A',
+ 'J', 'A', 'R',
+ 'J', 'E', 'E',
+ 'J', 'E', 'H',
+ 'J', 'E', 'R',
+ 'J', 'H', 'A',
+ 'J', 'H', 'O',
+ 'J', 'I', 'A',
+ 'J', 'I', 'E',
+ 'J', 'I', 'L',
+ 'J', 'I', 'P',
+ 'J', 'I', 'T',
+ 'J', 'I', 'X',
+ 'J', 'J', 'A',
+ 'J', 'J', 'E',
+ 'J', 'J', 'I',
+ 'J', 'J', 'O',
+ 'J', 'J', 'U',
+ 'J', 'J', 'Y',
+ 'J', 'O', 'A',
+ 'J', 'O', 'O',
+ 'J', 'O', 'P',
+ 'J', 'O', 'T',
+ 'J', 'O', 'X',
+ 'J', 'O', 'Y',
+ 'J', 'U', 'O',
+ 'J', 'U', 'P',
+ 'J', 'U', 'R',
+ 'J', 'U', 'T',
+ 'J', 'U', 'X',
+ 'J', 'W', 'A',
+ 'J', 'Y', 'P',
+ 'J', 'Y', 'R',
+ 'J', 'Y', 'T',
+ 'J', 'Y', 'X',
+ 'K', 'A', '2',
+ 'K', 'A', 'A',
+ 'K', 'A', 'B',
+ 'K', 'A', 'F',
+ 'K', 'A', 'H',
+ 'K', 'A', 'I',
+ 'K', 'A', 'K',
+ 'K', 'A', 'L',
+ 'K', 'A', 'N',
+ 'K', 'A', 'P',
+ 'K', 'A', 'T',
+ 'K', 'A', 'X',
+ 'K', 'A', 'Y',
+ 'K', 'E', 'E',
+ 'K', 'E', 'H',
+ 'K', 'E', 'N',
+ 'K', 'E', 'P',
+ 'K', 'E', 'T',
+ 'K', 'E', 'X',
+ 'K', 'E', 'Y',
+ 'K', 'H', 'A',
+ 'K', 'H', 'E',
+ 'K', 'H', 'I',
+ 'K', 'H', 'O',
+ 'K', 'H', 'U',
+ 'K', 'H', 'Z',
+ 'K', 'I', 'D',
+ 'K', 'I', 'E',
+ 'K', 'I', 'H',
+ 'K', 'I', 'I',
+ 'K', 'I', 'N',
+ 'K', 'I', 'P',
+ 'K', 'I', 'T',
+ 'K', 'I', 'X',
+ 'K', 'J', 'E',
+ 'K', 'K', 'A',
+ 'K', 'K', 'E',
+ 'K', 'K', 'I',
+ 'K', 'K', 'O',
+ 'K', 'K', 'U',
+ 'K', 'L', 'A',
+ 'K', 'O', 'A',
+ 'K', 'O', 'H',
+ 'K', 'O', 'N',
+ 'K', 'O', 'O',
+ 'K', 'O', 'P',
+ 'K', 'O', 'T',
+ 'K', 'O', 'X',
+ 'K', 'P', 'A',
+ 'K', 'P', 'E',
+ 'K', 'P', 'I',
+ 'K', 'P', 'O',
+ 'K', 'P', 'U',
+ 'K', 'R', 'A',
+ 'K', 'S', 'I',
+ 'K', 'U', '3',
+ 'K', 'U', '4',
+ 'K', 'U', '7',
+ 'K', 'U', 'L',
+ 'K', 'U', 'N',
+ 'K', 'U', 'O',
+ 'K', 'U', 'P',
+ 'K', 'U', 'R',
+ 'K', 'U', 'T',
+ 'K', 'U', 'X',
+ 'K', 'V', 'A',
+ 'K', 'W', 'A',
+ 'K', 'W', 'E',
+ 'K', 'W', 'I',
+ 'K', 'W', 'O',
+ 'K', 'X', 'A',
+ 'K', 'X', 'E',
+ 'K', 'X', 'I',
+ 'K', 'X', 'O',
+ 'K', 'X', 'U',
+ 'K', 'Y', 'A',
+ 'K', 'Y', 'E',
+ 'K', 'Y', 'I',
+ 'K', 'Y', 'O',
+ 'K', 'Y', 'U',
+ 'L', 'A', 'A',
+ 'L', 'A', 'E',
+ 'L', 'A', 'L',
+ 'L', 'A', 'M',
+ 'L', 'A', 'O',
+ 'L', 'A', 'P',
+ 'L', 'A', 'S',
+ 'L', 'A', 'T',
+ 'L', 'A', 'W',
+ 'L', 'A', 'X',
+ 'L', 'C', 'E',
+ 'L', 'C', 'I',
+ 'L', 'D', '2',
+ 'L', 'E', 'E',
+ 'L', 'E', 'G',
+ 'L', 'E', 'K',
+ 'L', 'E', 'O',
+ 'L', 'E', 'P',
+ 'L', 'E', 'X',
+ 'L', 'H', 'A',
+ 'L', 'H', 'E',
+ 'L', 'H', 'I',
+ 'L', 'H', 'O',
+ 'L', 'H', 'U',
+ 'L', 'I', 'D',
+ 'L', 'I', 'E',
+ 'L', 'I', 'I',
+ 'L', 'I', 'L',
+ 'L', 'I', 'P',
+ 'L', 'I', 'T',
+ 'L', 'I', 'X',
+ 'L', 'J', 'E',
+ 'L', 'L', 'A',
+ 'L', 'O', 'A',
+ 'L', 'O', 'G',
+ 'L', 'O', 'O',
+ 'L', 'O', 'P',
+ 'L', 'O', 'T',
+ 'L', 'O', 'W',
+ 'L', 'O', 'X',
+ 'L', 'U', '2',
+ 'L', 'U', '3',
+ 'L', 'U', 'E',
+ 'L', 'U', 'H',
+ 'L', 'U', 'L',
+ 'L', 'U', 'M',
+ 'L', 'U', 'O',
+ 'L', 'U', 'P',
+ 'L', 'U', 'R',
+ 'L', 'U', 'T',
+ 'L', 'U', 'X',
+ 'L', 'W', 'A',
+ 'L', 'W', 'E',
+ 'L', 'W', 'I',
+ 'L', 'W', 'O',
+ 'L', 'Y', 'P',
+ 'L', 'Y', 'R',
+ 'L', 'Y', 'T',
+ 'L', 'Y', 'X',
+ 'L', 'Y', 'Y',
+ 'M', 'A', '2',
+ 'M', 'A', 'A',
+ 'M', 'A', 'H',
+ 'M', 'A', 'I',
+ 'M', 'A', 'N',
+ 'M', 'A', 'P',
+ 'M', 'A', 'R',
+ 'M', 'A', 'T',
+ 'M', 'A', 'X',
+ 'M', 'A', 'Y',
+ 'M', 'B', '2',
+ 'M', 'B', '3',
+ 'M', 'B', '4',
+ 'M', 'B', 'A',
+ 'M', 'B', 'E',
+ 'M', 'B', 'I',
+ 'M', 'B', 'O',
+ 'M', 'B', 'U',
+ 'M', 'E', 'D',
+ 'M', 'E', 'E',
+ 'M', 'E', 'M',
+ 'M', 'E', 'N',
+ 'M', 'E', 'S',
+ 'M', 'E', 'X',
+ 'M', 'G', 'A',
+ 'M', 'G', 'E',
+ 'M', 'G', 'O',
+ 'M', 'G', 'U',
+ 'M', 'H', 'Z',
+ 'M', 'I', 'D',
+ 'M', 'I', 'E',
+ 'M', 'I', 'G',
+ 'M', 'I', 'I',
+ 'M', 'I', 'L',
+ 'M', 'I', 'M',
+ 'M', 'I', 'N',
+ 'M', 'I', 'P',
+ 'M', 'I', 'T',
+ 'M', 'I', 'X',
+ 'M', 'L', 'A',
+ 'M', 'O', 'A',
+ 'M', 'O', 'L',
+ 'M', 'O', 'N',
+ 'M', 'O', 'O',
+ 'M', 'O', 'P',
+ 'M', 'O', 'T',
+ 'M', 'O', 'X',
+ 'M', 'P', 'A',
+ 'M', 'U', 'E',
+ 'M', 'U', 'G',
+ 'M', 'U', 'M',
+ 'M', 'U', 'O',
+ 'M', 'U', 'P',
+ 'M', 'U', 'R',
+ 'M', 'U', 'T',
+ 'M', 'U', 'X',
+ 'M', 'W', 'A',
+ 'M', 'W', 'E',
+ 'M', 'W', 'I',
+ 'M', 'W', 'O',
+ 'M', 'Y', 'A',
+ 'M', 'Y', 'P',
+ 'M', 'Y', 'T',
+ 'M', 'Y', 'X',
+ 'N', 'A', '2',
+ 'N', 'A', 'A',
+ 'N', 'A', 'G',
+ 'N', 'A', 'H',
+ 'N', 'A', 'M',
+ 'N', 'A', 'P',
+ 'N', 'A', 'R',
+ 'N', 'A', 'X',
+ 'N', 'B', 'A',
+ 'N', 'B', 'I',
+ 'N', 'B', 'O',
+ 'N', 'B', 'U',
+ 'N', 'B', 'Y',
+ 'N', 'D', 'A',
+ 'N', 'D', 'E',
+ 'N', 'D', 'I',
+ 'N', 'D', 'O',
+ 'N', 'D', 'U',
+ 'N', 'E', 'E',
+ 'N', 'E', 'N',
+ 'N', 'E', 'O',
+ 'N', 'E', 'P',
+ 'N', 'E', 'T',
+ 'N', 'E', 'W',
+ 'N', 'E', 'X',
+ 'N', 'G', 'A',
+ 'N', 'G', 'E',
+ 'N', 'G', 'G',
+ 'N', 'G', 'I',
+ 'N', 'G', 'O',
+ 'N', 'G', 'U',
+ 'N', 'H', 'A',
+ 'N', 'I', '2',
+ 'N', 'I', 'A',
+ 'N', 'I', 'B',
+ 'N', 'I', 'E',
+ 'N', 'I', 'I',
+ 'N', 'I', 'M',
+ 'N', 'I', 'P',
+ 'N', 'I', 'T',
+ 'N', 'I', 'X',
+ 'N', 'J', 'A',
+ 'N', 'J', 'E',
+ 'N', 'J', 'I',
+ 'N', 'J', 'O',
+ 'N', 'J', 'U',
+ 'N', 'J', 'Y',
+ 'N', 'K', 'O',
+ 'N', 'N', 'A',
+ 'N', 'N', 'G',
+ 'N', 'N', 'O',
+ 'N', 'O', 'A',
+ 'N', 'O', 'O',
+ 'N', 'O', 'P',
+ 'N', 'O', 'R',
+ 'N', 'O', 'T',
+ 'N', 'O', 'W',
+ 'N', 'O', 'X',
+ 'N', 'R', 'A',
+ 'N', 'R', 'E',
+ 'N', 'R', 'O',
+ 'N', 'R', 'U',
+ 'N', 'R', 'Y',
+ 'N', 'U', 'E',
+ 'N', 'U', 'M',
+ 'N', 'U', 'N',
+ 'N', 'U', 'O',
+ 'N', 'U', 'P',
+ 'N', 'U', 'R',
+ 'N', 'U', 'T',
+ 'N', 'U', 'X',
+ 'N', 'W', 'A',
+ 'N', 'W', 'E',
+ 'N', 'Y', 'A',
+ 'N', 'Y', 'D',
+ 'N', 'Y', 'E',
+ 'N', 'Y', 'I',
+ 'N', 'Y', 'O',
+ 'N', 'Y', 'U',
+ 'N', 'Z', 'A',
+ 'N', 'Z', 'E',
+ 'N', 'Z', 'I',
+ 'N', 'Z', 'U',
+ 'N', 'Z', 'Y',
+ 'O', '-', 'E',
+ 'O', '-', 'O',
+ 'O', '-', 'U',
+ 'O', 'A', 'K',
+ 'O', 'A', 'Y',
+ 'O', 'C', 'R',
+ 'O', 'D', 'D',
+ 'O', 'H', 'M',
+ 'O', 'I', 'L',
+ 'O', 'L', 'D',
+ 'O', 'L', 'E',
+ 'O', 'N', 'E',
+ 'O', 'N', 'G',
+ 'O', 'N', 'N',
+ 'O', 'N', 'U',
+ 'O', 'O', 'N',
+ 'O', 'O', 'U',
+ 'O', 'T', 'T',
+ 'O', 'T', 'U',
+ 'O', 'U', 'T',
+ 'P', 'A', 'A',
+ 'P', 'A', 'D',
+ 'P', 'A', 'N',
+ 'P', 'A', 'P',
+ 'P', 'A', 'R',
+ 'P', 'A', 'T',
+ 'P', 'A', 'W',
+ 'P', 'A', 'X',
+ 'P', 'E', 'E',
+ 'P', 'E', 'H',
+ 'P', 'E', 'R',
+ 'P', 'E', 'S',
+ 'P', 'H', 'A',
+ 'P', 'H', 'E',
+ 'P', 'H', 'I',
+ 'P', 'H', 'O',
+ 'P', 'H', 'U',
+ 'P', 'I', 'E',
+ 'P', 'I', 'G',
+ 'P', 'I', 'I',
+ 'P', 'I', 'P',
+ 'P', 'I', 'T',
+ 'P', 'I', 'X',
+ 'P', 'L', 'A',
+ 'P', 'O', 'A',
+ 'P', 'O', 'O',
+ 'P', 'O', 'P',
+ 'P', 'O', 'T',
+ 'P', 'O', 'X',
+ 'P', 'P', 'A',
+ 'P', 'P', 'M',
+ 'P', 'S', 'I',
+ 'P', 'T', 'E',
+ 'P', 'U', '2',
+ 'P', 'U', 'O',
+ 'P', 'U', 'P',
+ 'P', 'U', 'R',
+ 'P', 'U', 'T',
+ 'P', 'U', 'X',
+ 'P', 'W', 'A',
+ 'P', 'W', 'E',
+ 'P', 'W', 'I',
+ 'P', 'W', 'O',
+ 'P', 'Y', 'P',
+ 'P', 'Y', 'R',
+ 'P', 'Y', 'T',
+ 'P', 'Y', 'X',
+ 'Q', 'A', 'A',
+ 'Q', 'A', 'F',
+ 'Q', 'A', 'I',
+ 'Q', 'A', 'Q',
+ 'Q', 'A', 'R',
+ 'Q', 'A', 'U',
+ 'Q', 'E', 'E',
+ 'Q', 'H', 'A',
+ 'Q', 'H', 'E',
+ 'Q', 'H', 'I',
+ 'Q', 'H', 'O',
+ 'Q', 'H', 'U',
+ 'Q', 'I', 'E',
+ 'Q', 'I', 'I',
+ 'Q', 'I', 'P',
+ 'Q', 'I', 'T',
+ 'Q', 'I', 'X',
+ 'Q', 'O', 'A',
+ 'Q', 'O', 'F',
+ 'Q', 'O', 'O',
+ 'Q', 'O', 'P',
+ 'Q', 'O', 'T',
+ 'Q', 'O', 'X',
+ 'Q', 'U', 'A',
+ 'Q', 'U', 'E',
+ 'Q', 'U', 'I',
+ 'Q', 'U', 'K',
+ 'Q', 'U', 'O',
+ 'Q', 'U', 'P',
+ 'Q', 'U', 'R',
+ 'Q', 'U', 'T',
+ 'Q', 'U', 'U',
+ 'Q', 'U', 'V',
+ 'Q', 'U', 'X',
+ 'Q', 'W', 'A',
+ 'Q', 'W', 'E',
+ 'Q', 'W', 'I',
+ 'Q', 'Y', 'A',
+ 'Q', 'Y', 'E',
+ 'Q', 'Y', 'I',
+ 'Q', 'Y', 'O',
+ 'Q', 'Y', 'P',
+ 'Q', 'Y', 'R',
+ 'Q', 'Y', 'T',
+ 'Q', 'Y', 'U',
+ 'Q', 'Y', 'X',
+ 'R', 'A', '2',
+ 'R', 'A', '3',
+ 'R', 'A', 'A',
+ 'R', 'A', 'B',
+ 'R', 'A', 'D',
+ 'R', 'A', 'E',
+ 'R', 'A', 'M',
+ 'R', 'A', 'N',
+ 'R', 'A', 'P',
+ 'R', 'A', 'T',
+ 'R', 'A', 'X',
+ 'R', 'A', 'Y',
+ 'R', 'D', 'O',
+ 'R', 'E', 'D',
+ 'R', 'E', 'E',
+ 'R', 'E', 'H',
+ 'R', 'E', 'P',
+ 'R', 'E', 'X',
+ 'R', 'H', 'A',
+ 'R', 'H', 'O',
+ 'R', 'I', 'I',
+ 'R', 'I', 'N',
+ 'R', 'I', 'P',
+ 'R', 'J', 'E',
+ 'R', 'O', '2',
+ 'R', 'O', 'A',
+ 'R', 'O', 'C',
+ 'R', 'O', 'D',
+ 'R', 'O', 'O',
+ 'R', 'O', 'P',
+ 'R', 'O', 'T',
+ 'R', 'O', 'X',
+ 'R', 'R', 'A',
+ 'R', 'R', 'E',
+ 'R', 'R', 'O',
+ 'R', 'R', 'U',
+ 'R', 'R', 'Y',
+ 'R', 'U', 'A',
+ 'R', 'U', 'B',
+ 'R', 'U', 'M',
+ 'R', 'U', 'N',
+ 'R', 'U', 'O',
+ 'R', 'U', 'P',
+ 'R', 'U', 'R',
+ 'R', 'U', 'T',
+ 'R', 'U', 'X',
+ 'R', 'W', 'A',
+ 'R', 'Y', 'A',
+ 'R', 'Y', 'P',
+ 'R', 'Y', 'R',
+ 'R', 'Y', 'T',
+ 'R', 'Y', 'X',
+ 'R', 'Y', 'Y',
+ 'S', '-', 'W',
+ 'S', 'A', 'A',
+ 'S', 'A', 'D',
+ 'S', 'A', 'G',
+ 'S', 'A', 'L',
+ 'S', 'A', 'N',
+ 'S', 'A', 'P',
+ 'S', 'A', 'R',
+ 'S', 'A', 'T',
+ 'S', 'A', 'W',
+ 'S', 'A', 'X',
+ 'S', 'A', 'Y',
+ 'S', 'E', 'E',
+ 'S', 'E', 'H',
+ 'S', 'E', 'P',
+ 'S', 'E', 'T',
+ 'S', 'E', 'X',
+ 'S', 'H', '2',
+ 'S', 'H', 'A',
+ 'S', 'H', 'E',
+ 'S', 'H', 'I',
+ 'S', 'H', 'O',
+ 'S', 'H', 'U',
+ 'S', 'H', 'Y',
+ 'S', 'I', 'E',
+ 'S', 'I', 'G',
+ 'S', 'I', 'I',
+ 'S', 'I', 'N',
+ 'S', 'I', 'P',
+ 'S', 'I', 'T',
+ 'S', 'I', 'X',
+ 'S', 'J', 'E',
+ 'S', 'K', 'W',
+ 'S', 'N', 'A',
+ 'S', 'O', 'A',
+ 'S', 'O', 'F',
+ 'S', 'O', 'N',
+ 'S', 'O', 'O',
+ 'S', 'O', 'P',
+ 'S', 'O', 'T',
+ 'S', 'O', 'U',
+ 'S', 'O', 'W',
+ 'S', 'O', 'X',
+ 'S', 'S', 'A',
+ 'S', 'S', 'E',
+ 'S', 'S', 'I',
+ 'S', 'S', 'O',
+ 'S', 'S', 'U',
+ 'S', 'S', 'Y',
+ 'S', 'T', '2',
+ 'S', 'U', 'A',
+ 'S', 'U', 'D',
+ 'S', 'U', 'M',
+ 'S', 'U', 'N',
+ 'S', 'U', 'O',
+ 'S', 'U', 'P',
+ 'S', 'U', 'R',
+ 'S', 'U', 'T',
+ 'S', 'U', 'X',
+ 'S', 'W', 'A',
+ 'S', 'W', 'E',
+ 'S', 'W', 'G',
+ 'S', 'W', 'I',
+ 'S', 'W', 'O',
+ 'S', 'W', 'Z',
+ 'S', 'Y', 'A',
+ 'S', 'Y', 'P',
+ 'S', 'Y', 'R',
+ 'S', 'Y', 'T',
+ 'S', 'Y', 'X',
+ 'S', 'Z', 'A',
+ 'S', 'Z', 'E',
+ 'S', 'Z', 'I',
+ 'S', 'Z', 'O',
+ 'S', 'Z', 'U',
+ 'S', 'Z', 'Z',
+ 'T', 'A', '2',
+ 'T', 'A', 'A',
+ 'T', 'A', 'B',
+ 'T', 'A', 'G',
+ 'T', 'A', 'H',
+ 'T', 'A', 'I',
+ 'T', 'A', 'K',
+ 'T', 'A', 'M',
+ 'T', 'A', 'N',
+ 'T', 'A', 'O',
+ 'T', 'A', 'P',
+ 'T', 'A', 'R',
+ 'T', 'A', 'T',
+ 'T', 'A', 'U',
+ 'T', 'A', 'V',
+ 'T', 'A', 'W',
+ 'T', 'A', 'X',
+ 'T', 'E', 'E',
+ 'T', 'E', 'H',
+ 'T', 'E', 'N',
+ 'T', 'E', 'P',
+ 'T', 'E', 'T',
+ 'T', 'E', 'X',
+ 'T', 'H', 'A',
+ 'T', 'H', 'E',
+ 'T', 'H', 'I',
+ 'T', 'H', 'O',
+ 'T', 'H', 'U',
+ 'T', 'H', 'Z',
+ 'T', 'I', 'E',
+ 'T', 'I', 'I',
+ 'T', 'I', 'L',
+ 'T', 'I', 'P',
+ 'T', 'I', 'R',
+ 'T', 'I', 'T',
+ 'T', 'I', 'X',
+ 'T', 'J', 'E',
+ 'T', 'L', 'A',
+ 'T', 'L', 'E',
+ 'T', 'L', 'I',
+ 'T', 'L', 'O',
+ 'T', 'L', 'U',
+ 'T', 'L', 'V',
+ 'T', 'O', 'A',
+ 'T', 'O', 'N',
+ 'T', 'O', 'O',
+ 'T', 'O', 'P',
+ 'T', 'O', 'T',
+ 'T', 'O', 'X',
+ 'T', 'R', 'I',
+ 'T', 'S', 'A',
+ 'T', 'S', 'E',
+ 'T', 'S', 'I',
+ 'T', 'S', 'O',
+ 'T', 'S', 'U',
+ 'T', 'S', 'V',
+ 'T', 'T', '2',
+ 'T', 'T', 'A',
+ 'T', 'T', 'E',
+ 'T', 'T', 'H',
+ 'T', 'T', 'I',
+ 'T', 'T', 'O',
+ 'T', 'T', 'U',
+ 'T', 'U', 'K',
+ 'T', 'U', 'M',
+ 'T', 'U', 'O',
+ 'T', 'U', 'P',
+ 'T', 'U', 'R',
+ 'T', 'U', 'T',
+ 'T', 'U', 'X',
+ 'T', 'W', 'A',
+ 'T', 'W', 'E',
+ 'T', 'W', 'I',
+ 'T', 'W', 'O',
+ 'T', 'Y', 'A',
+ 'T', 'Y', 'E',
+ 'T', 'Y', 'I',
+ 'T', 'Y', 'O',
+ 'T', 'Y', 'R',
+ 'T', 'Z', 'A',
+ 'T', 'Z', 'E',
+ 'T', 'Z', 'I',
+ 'T', 'Z', 'O',
+ 'T', 'Z', 'U',
+ 'U', '-', 'A',
+ 'U', '-', 'U',
+ 'U', 'E', 'E',
+ 'U', 'E', 'Y',
+ 'U', 'K', 'U',
+ 'U', 'L', 'U',
+ 'U', 'N', 'A',
+ 'U', 'N', 'N',
+ 'U', 'O', 'N',
+ 'U', 'O', 'P',
+ 'U', 'O', 'X',
+ 'U', 'R', '2',
+ 'U', 'R', '4',
+ 'U', 'R', 'A',
+ 'U', 'R', 'I',
+ 'U', 'R', 'N',
+ 'U', 'R', 'U',
+ 'U', 'S', 'E',
+ 'U', 'S', 'H',
+ 'U', 'U', 'U',
+ 'U', 'Z', '3',
+ 'U', 'Z', 'U',
+ 'V', 'A', 'A',
+ 'V', 'A', 'I',
+ 'V', 'A', 'P',
+ 'V', 'A', 'T',
+ 'V', 'A', 'V',
+ 'V', 'A', 'X',
+ 'V', 'E', 'E',
+ 'V', 'E', 'H',
+ 'V', 'E', 'P',
+ 'V', 'E', 'W',
+ 'V', 'E', 'X',
+ 'V', 'I', 'E',
+ 'V', 'I', 'N',
+ 'V', 'I', 'P',
+ 'V', 'I', 'T',
+ 'V', 'I', 'X',
+ 'V', 'O', 'O',
+ 'V', 'O', 'P',
+ 'V', 'O', 'T',
+ 'V', 'O', 'U',
+ 'V', 'O', 'W',
+ 'V', 'O', 'X',
+ 'V', 'U', 'P',
+ 'V', 'U', 'R',
+ 'V', 'U', 'T',
+ 'V', 'U', 'X',
+ 'V', 'W', 'A',
+ 'V', 'Y', 'P',
+ 'V', 'Y', 'R',
+ 'V', 'Y', 'T',
+ 'V', 'Y', 'X',
+ 'W', 'A', 'A',
+ 'W', 'A', 'E',
+ 'W', 'A', 'N',
+ 'W', 'A', 'P',
+ 'W', 'A', 'T',
+ 'W', 'A', 'U',
+ 'W', 'A', 'W',
+ 'W', 'A', 'X',
+ 'W', 'E', 'E',
+ 'W', 'E', 'N',
+ 'W', 'E', 'O',
+ 'W', 'E', 'P',
+ 'W', 'E', 'X',
+ 'W', 'I', 'I',
+ 'W', 'I', 'N',
+ 'W', 'O', 'A',
+ 'W', 'O', 'E',
+ 'W', 'O', 'N',
+ 'W', 'O', 'O',
+ 'W', 'O', 'P',
+ 'W', 'O', 'X',
+ 'W', 'U', 'N',
+ 'W', 'U', 'O',
+ 'X', 'A', 'A',
+ 'X', 'A', 'N',
+ 'X', 'E', 'E',
+ 'X', 'E', 'H',
+ 'X', 'I', 'E',
+ 'X', 'I', 'P',
+ 'X', 'I', 'T',
+ 'X', 'I', 'X',
+ 'X', 'O', 'A',
+ 'X', 'O', 'P',
+ 'X', 'O', 'R',
+ 'X', 'O', 'T',
+ 'X', 'O', 'X',
+ 'X', 'U', 'O',
+ 'X', 'V', 'A',
+ 'X', 'W', 'A',
+ 'X', 'W', 'E',
+ 'X', 'W', 'I',
+ 'X', 'Y', 'A',
+ 'X', 'Y', 'E',
+ 'X', 'Y', 'I',
+ 'X', 'Y', 'O',
+ 'X', 'Y', 'P',
+ 'X', 'Y', 'R',
+ 'X', 'Y', 'T',
+ 'X', 'Y', 'U',
+ 'X', 'Y', 'X',
+ 'Y', 'A', 'A',
+ 'Y', 'A', 'B',
+ 'Y', 'A', 'D',
+ 'Y', 'A', 'E',
+ 'Y', 'A', 'F',
+ 'Y', 'A', 'G',
+ 'Y', 'A', 'H',
+ 'Y', 'A', 'J',
+ 'Y', 'A', 'K',
+ 'Y', 'A', 'L',
+ 'Y', 'A', 'M',
+ 'Y', 'A', 'N',
+ 'Y', 'A', 'P',
+ 'Y', 'A', 'Q',
+ 'Y', 'A', 'R',
+ 'Y', 'A', 'S',
+ 'Y', 'A', 'T',
+ 'Y', 'A', 'V',
+ 'Y', 'A', 'W',
+ 'Y', 'A', 'Y',
+ 'Y', 'A', 'Z',
+ 'Y', 'E', 'A',
+ 'Y', 'E', 'E',
+ 'Y', 'E', 'H',
+ 'Y', 'E', 'N',
+ 'Y', 'E', 'O',
+ 'Y', 'E', 'R',
+ 'Y', 'E', 'W',
+ 'Y', 'E', 'Y',
+ 'Y', 'I', 'E',
+ 'Y', 'I', 'G',
+ 'Y', 'I', 'I',
+ 'Y', 'I', 'N',
+ 'Y', 'I', 'P',
+ 'Y', 'I', 'T',
+ 'Y', 'I', 'X',
+ 'Y', 'O', 'A',
+ 'Y', 'O', 'D',
+ 'Y', 'O', 'O',
+ 'Y', 'O', 'P',
+ 'Y', 'O', 'T',
+ 'Y', 'O', 'X',
+ 'Y', 'U', 'O',
+ 'Y', 'U', 'P',
+ 'Y', 'U', 'R',
+ 'Y', 'U', 'S',
+ 'Y', 'U', 'T',
+ 'Y', 'U', 'X',
+ 'Y', 'W', 'A',
+ 'Y', 'W', 'E',
+ 'Y', 'W', 'I',
+ 'Y', 'W', 'O',
+ 'Y', 'Y', 'A',
+ 'Y', 'Y', 'P',
+ 'Y', 'Y', 'R',
+ 'Y', 'Y', 'T',
+ 'Y', 'Y', 'X',
+ 'Z', 'A', 'A',
+ 'Z', 'A', 'G',
+ 'Z', 'A', 'H',
+ 'Z', 'A', 'I',
+ 'Z', 'A', 'L',
+ 'Z', 'A', 'P',
+ 'Z', 'A', 'T',
+ 'Z', 'A', 'X',
+ 'Z', 'E', '2',
+ 'Z', 'E', 'E',
+ 'Z', 'E', 'N',
+ 'Z', 'E', 'P',
+ 'Z', 'E', 'X',
+ 'Z', 'H', 'A',
+ 'Z', 'H', 'E',
+ 'Z', 'H', 'I',
+ 'Z', 'H', 'O',
+ 'Z', 'H', 'U',
+ 'Z', 'H', 'Y',
+ 'Z', 'I', '3',
+ 'Z', 'I', 'B',
+ 'Z', 'I', 'E',
+ 'Z', 'I', 'G',
+ 'Z', 'I', 'P',
+ 'Z', 'I', 'T',
+ 'Z', 'I', 'X',
+ 'Z', 'J', 'E',
+ 'Z', 'L', 'A',
+ 'Z', 'O', 'A',
+ 'Z', 'O', 'O',
+ 'Z', 'O', 'P',
+ 'Z', 'O', 'T',
+ 'Z', 'O', 'X',
+ 'Z', 'R', 'A',
+ 'Z', 'U', '5',
+ 'Z', 'U', 'M',
+ 'Z', 'U', 'O',
+ 'Z', 'U', 'P',
+ 'Z', 'U', 'R',
+ 'Z', 'U', 'T',
+ 'Z', 'U', 'X',
+ 'Z', 'W', 'A',
+ 'Z', 'Y', 'P',
+ 'Z', 'Y', 'R',
+ 'Z', 'Y', 'T',
+ 'Z', 'Y', 'X',
+ 'Z', 'Z', 'A',
+ 'Z', 'Z', 'E',
+ 'Z', 'Z', 'I',
+ 'Z', 'Z', 'O',
+ 'Z', 'Z', 'U',
+ 'Z', 'Z', 'Y',
+ 'A', 'A', 'R', 'U',
+ 'A', 'D', 'A', 'K',
+ 'A', 'D', 'E', 'G',
+ 'A', 'E', 'S', 'C',
+ 'A', 'H', 'A', 'D',
+ 'A', 'H', 'S', 'A',
+ 'A', 'I', 'L', 'M',
+ 'A', 'I', 'N', 'N',
+ 'A', 'I', 'N', 'U',
+ 'A', 'L', 'A', 'N',
+ 'A', 'L', 'E', 'F',
+ 'A', 'L', 'F', 'A',
+ 'A', 'L', 'L', 'I',
+ 'A', 'L', 'L', 'O',
+ 'A', 'L', 'P', 'A',
+ 'A', 'L', 'T', 'A',
+ 'A', 'M', 'A', 'R',
+ 'A', 'M', 'B', 'A',
+ 'A', 'M', 'P', 'S',
+ 'A', 'N', 'H', 'U',
+ 'A', 'N', 'K', 'H',
+ 'A', 'P', 'I', 'N',
+ 'A', 'P', 'L', 'I',
+ 'A', 'R', 'A', 'D',
+ 'A', 'R', 'C', 'H',
+ 'A', 'R', 'G', 'I',
+ 'A', 'R', 'M', 'Y',
+ 'A', 'S', 'A', 'T',
+ 'A', 'S', 'H', '2',
+ 'A', 'S', 'H', '9',
+ 'A', 'T', 'O', 'M',
+ 'A', 'U', 'N', 'N',
+ 'A', 'Y', 'A', 'H',
+ 'A', 'Y', 'E', 'R',
+ 'A', 'Y', 'I', 'N',
+ 'B', '0', '0', '1',
+ 'B', '0', '0', '2',
+ 'B', '0', '0', '3',
+ 'B', '0', '0', '4',
+ 'B', '0', '0', '5',
+ 'B', '0', '0', '6',
+ 'B', '0', '0', '7',
+ 'B', '0', '0', '8',
+ 'B', '0', '0', '9',
+ 'B', '0', '1', '0',
+ 'B', '0', '1', '1',
+ 'B', '0', '1', '2',
+ 'B', '0', '1', '3',
+ 'B', '0', '1', '4',
+ 'B', '0', '1', '5',
+ 'B', '0', '1', '6',
+ 'B', '0', '1', '7',
+ 'B', '0', '1', '8',
+ 'B', '0', '1', '9',
+ 'B', '0', '2', '0',
+ 'B', '0', '2', '1',
+ 'B', '0', '2', '2',
+ 'B', '0', '2', '3',
+ 'B', '0', '2', '4',
+ 'B', '0', '2', '5',
+ 'B', '0', '2', '6',
+ 'B', '0', '2', '7',
+ 'B', '0', '2', '8',
+ 'B', '0', '2', '9',
+ 'B', '0', '3', '0',
+ 'B', '0', '3', '1',
+ 'B', '0', '3', '2',
+ 'B', '0', '3', '3',
+ 'B', '0', '3', '4',
+ 'B', '0', '3', '6',
+ 'B', '0', '3', '7',
+ 'B', '0', '3', '8',
+ 'B', '0', '3', '9',
+ 'B', '0', '4', '0',
+ 'B', '0', '4', '1',
+ 'B', '0', '4', '2',
+ 'B', '0', '4', '3',
+ 'B', '0', '4', '4',
+ 'B', '0', '4', '5',
+ 'B', '0', '4', '6',
+ 'B', '0', '4', '7',
+ 'B', '0', '4', '8',
+ 'B', '0', '4', '9',
+ 'B', '0', '5', '0',
+ 'B', '0', '5', '1',
+ 'B', '0', '5', '2',
+ 'B', '0', '5', '3',
+ 'B', '0', '5', '4',
+ 'B', '0', '5', '5',
+ 'B', '0', '5', '6',
+ 'B', '0', '5', '7',
+ 'B', '0', '5', '8',
+ 'B', '0', '5', '9',
+ 'B', '0', '6', '0',
+ 'B', '0', '6', '1',
+ 'B', '0', '6', '2',
+ 'B', '0', '6', '3',
+ 'B', '0', '6', '4',
+ 'B', '0', '6', '5',
+ 'B', '0', '6', '6',
+ 'B', '0', '6', '7',
+ 'B', '0', '6', '8',
+ 'B', '0', '6', '9',
+ 'B', '0', '7', '0',
+ 'B', '0', '7', '1',
+ 'B', '0', '7', '2',
+ 'B', '0', '7', '3',
+ 'B', '0', '7', '4',
+ 'B', '0', '7', '5',
+ 'B', '0', '7', '6',
+ 'B', '0', '7', '7',
+ 'B', '0', '7', '8',
+ 'B', '0', '7', '9',
+ 'B', '0', '8', '0',
+ 'B', '0', '8', '1',
+ 'B', '0', '8', '2',
+ 'B', '0', '8', '3',
+ 'B', '0', '8', '5',
+ 'B', '0', '8', '6',
+ 'B', '0', '8', '7',
+ 'B', '0', '8', '9',
+ 'B', '0', '9', '0',
+ 'B', '0', '9', '1',
+ 'B', '1', '0', '0',
+ 'B', '1', '0', '2',
+ 'B', '1', '0', '4',
+ 'B', '1', '0', '5',
+ 'B', '1', '2', '0',
+ 'B', '1', '2', '1',
+ 'B', '1', '2', '2',
+ 'B', '1', '2', '3',
+ 'B', '1', '2', '5',
+ 'B', '1', '2', '7',
+ 'B', '1', '2', '8',
+ 'B', '1', '3', '0',
+ 'B', '1', '3', '1',
+ 'B', '1', '3', '2',
+ 'B', '1', '3', '3',
+ 'B', '1', '3', '5',
+ 'B', '1', '4', '0',
+ 'B', '1', '4', '1',
+ 'B', '1', '4', '2',
+ 'B', '1', '4', '5',
+ 'B', '1', '4', '6',
+ 'B', '1', '5', '0',
+ 'B', '1', '5', '1',
+ 'B', '1', '5', '2',
+ 'B', '1', '5', '3',
+ 'B', '1', '5', '4',
+ 'B', '1', '5', '5',
+ 'B', '1', '5', '6',
+ 'B', '1', '5', '7',
+ 'B', '1', '5', '8',
+ 'B', '1', '5', '9',
+ 'B', '1', '6', '0',
+ 'B', '1', '6', '1',
+ 'B', '1', '6', '2',
+ 'B', '1', '6', '3',
+ 'B', '1', '6', '4',
+ 'B', '1', '6', '5',
+ 'B', '1', '6', '6',
+ 'B', '1', '6', '7',
+ 'B', '1', '6', '8',
+ 'B', '1', '6', '9',
+ 'B', '1', '7', '0',
+ 'B', '1', '7', '1',
+ 'B', '1', '7', '2',
+ 'B', '1', '7', '3',
+ 'B', '1', '7', '4',
+ 'B', '1', '7', '6',
+ 'B', '1', '7', '7',
+ 'B', '1', '7', '8',
+ 'B', '1', '7', '9',
+ 'B', '1', '8', '0',
+ 'B', '1', '8', '1',
+ 'B', '1', '8', '2',
+ 'B', '1', '8', '3',
+ 'B', '1', '8', '4',
+ 'B', '1', '8', '5',
+ 'B', '1', '8', '9',
+ 'B', '1', '9', '0',
+ 'B', '1', '9', '1',
+ 'B', '2', '0', '0',
+ 'B', '2', '0', '1',
+ 'B', '2', '0', '2',
+ 'B', '2', '0', '3',
+ 'B', '2', '0', '4',
+ 'B', '2', '0', '5',
+ 'B', '2', '0', '6',
+ 'B', '2', '0', '7',
+ 'B', '2', '0', '8',
+ 'B', '2', '0', '9',
+ 'B', '2', '1', '0',
+ 'B', '2', '1', '1',
+ 'B', '2', '1', '2',
+ 'B', '2', '1', '3',
+ 'B', '2', '1', '4',
+ 'B', '2', '1', '5',
+ 'B', '2', '1', '6',
+ 'B', '2', '1', '7',
+ 'B', '2', '1', '8',
+ 'B', '2', '1', '9',
+ 'B', '2', '2', '0',
+ 'B', '2', '2', '1',
+ 'B', '2', '2', '2',
+ 'B', '2', '2', '5',
+ 'B', '2', '2', '6',
+ 'B', '2', '2', '7',
+ 'B', '2', '2', '8',
+ 'B', '2', '2', '9',
+ 'B', '2', '3', '0',
+ 'B', '2', '3', '1',
+ 'B', '2', '3', '2',
+ 'B', '2', '3', '3',
+ 'B', '2', '3', '4',
+ 'B', '2', '3', '6',
+ 'B', '2', '4', '0',
+ 'B', '2', '4', '1',
+ 'B', '2', '4', '2',
+ 'B', '2', '4', '3',
+ 'B', '2', '4', '5',
+ 'B', '2', '4', '6',
+ 'B', '2', '4', '7',
+ 'B', '2', '4', '8',
+ 'B', '2', '4', '9',
+ 'B', '2', '5', '0',
+ 'B', '2', '5', '1',
+ 'B', '2', '5', '2',
+ 'B', '2', '5', '3',
+ 'B', '2', '5', '4',
+ 'B', '2', '5', '5',
+ 'B', '2', '5', '6',
+ 'B', '2', '5', '7',
+ 'B', '2', '5', '8',
+ 'B', '2', '5', '9',
+ 'B', '3', '0', '5',
+ 'B', 'A', 'C', 'K',
+ 'B', 'A', 'G', '3',
+ 'B', 'A', 'G', 'A',
+ 'B', 'A', 'H', 'T',
+ 'B', 'A', 'N', '2',
+ 'B', 'A', 'N', 'D',
+ 'B', 'A', 'N', 'G',
+ 'B', 'A', 'N', 'K',
+ 'B', 'A', 'R', 'B',
+ 'B', 'A', 'R', 'S',
+ 'B', 'A', 'S', 'E',
+ 'B', 'B', 'A', 'P',
+ 'B', 'B', 'A', 'T',
+ 'B', 'B', 'A', 'X',
+ 'B', 'B', 'E', 'P',
+ 'B', 'B', 'E', 'X',
+ 'B', 'B', 'I', 'E',
+ 'B', 'B', 'I', 'P',
+ 'B', 'B', 'I', 'T',
+ 'B', 'B', 'I', 'X',
+ 'B', 'B', 'O', 'P',
+ 'B', 'B', 'O', 'T',
+ 'B', 'B', 'O', 'X',
+ 'B', 'B', 'U', 'O',
+ 'B', 'B', 'U', 'P',
+ 'B', 'B', 'U', 'R',
+ 'B', 'B', 'U', 'T',
+ 'B', 'B', 'U', 'X',
+ 'B', 'B', 'Y', 'P',
+ 'B', 'B', 'Y', 'T',
+ 'B', 'B', 'Y', 'X',
+ 'B', 'C', 'A', 'D',
+ 'B', 'E', 'A', 'M',
+ 'B', 'E', 'A', 'N',
+ 'B', 'E', 'A', 'T',
+ 'B', 'E', 'E', 'H',
+ 'B', 'E', 'L', 'L',
+ 'B', 'E', 'L', 'T',
+ 'B', 'E', 'N', 'D',
+ 'B', 'E', 'T', 'A',
+ 'B', 'E', 'T', 'H',
+ 'B', 'H', 'E', 'E',
+ 'B', 'H', 'O', 'O',
+ 'B', 'I', 'E', 'P',
+ 'B', 'I', 'E', 'T',
+ 'B', 'I', 'E', 'X',
+ 'B', 'I', 'R', 'D',
+ 'B', 'I', 'R', 'U',
+ 'B', 'K', 'A', '-',
+ 'B', 'L', 'U', 'E',
+ 'B', 'O', 'A', 'R',
+ 'B', 'O', 'A', 'T',
+ 'B', 'O', 'D', 'Y',
+ 'B', 'O', 'L', 'D',
+ 'B', 'O', 'L', 'T',
+ 'B', 'O', 'N', 'E',
+ 'B', 'R', 'D', 'A',
+ 'B', 'U', 'K', 'Y',
+ 'B', 'U', 'L', 'L',
+ 'B', 'U', 'O', 'N',
+ 'B', 'U', 'O', 'P',
+ 'B', 'U', 'O', 'X',
+ 'B', 'U', 'R', '2',
+ 'B', 'U', 'R', 'U',
+ 'B', 'U', 'R', 'X',
+ 'B', 'W', 'E', 'E',
+ 'B', 'Y', 'R', 'X',
+ 'B', 'Z', 'H', 'I',
+ 'C', '-', '1', '8',
+ 'C', '-', '3', '9',
+ 'C', 'A', 'A', 'I',
+ 'C', 'A', 'D', 'A',
+ 'C', 'A', 'L', 'C',
+ 'C', 'A', 'L', 'L',
+ 'C', 'A', 'N', 'G',
+ 'C', 'A', 'P', 'O',
+ 'C', 'A', 'R', 'E',
+ 'C', 'A', 'R', 'T',
+ 'C', 'A', 'V', 'E',
+ 'C', 'A', 'Y', 'N',
+ 'C', 'C', 'A', 'A',
+ 'C', 'C', 'E', 'E',
+ 'C', 'C', 'H', 'A',
+ 'C', 'C', 'H', 'E',
+ 'C', 'C', 'H', 'I',
+ 'C', 'C', 'H', 'O',
+ 'C', 'C', 'H', 'U',
+ 'C', 'E', 'D', 'I',
+ 'C', 'E', 'N', 'T',
+ 'C', 'H', 'A', 'A',
+ 'C', 'H', 'A', 'D',
+ 'C', 'H', 'A', 'M',
+ 'C', 'H', 'A', 'N',
+ 'C', 'H', 'A', 'P',
+ 'C', 'H', 'A', 'R',
+ 'C', 'H', 'A', 'T',
+ 'C', 'H', 'A', 'X',
+ 'C', 'H', 'E', 'E',
+ 'C', 'H', 'E', 'H',
+ 'C', 'H', 'E', 'N',
+ 'C', 'H', 'E', 'P',
+ 'C', 'H', 'E', 'T',
+ 'C', 'H', 'E', 'X',
+ 'C', 'H', 'H', 'A',
+ 'C', 'H', 'I', 'N',
+ 'C', 'H', 'O', 'A',
+ 'C', 'H', 'O', 'E',
+ 'C', 'H', 'O', 'P',
+ 'C', 'H', 'O', 'T',
+ 'C', 'H', 'O', 'X',
+ 'C', 'H', 'U', 'O',
+ 'C', 'H', 'U', 'P',
+ 'C', 'H', 'U', 'R',
+ 'C', 'H', 'U', 'X',
+ 'C', 'H', 'W', 'A',
+ 'C', 'H', 'Y', 'P',
+ 'C', 'H', 'Y', 'R',
+ 'C', 'H', 'Y', 'T',
+ 'C', 'H', 'Y', 'X',
+ 'C', 'I', 'E', 'P',
+ 'C', 'I', 'E', 'T',
+ 'C', 'I', 'E', 'X',
+ 'C', 'I', 'T', 'Y',
+ 'C', 'L', 'A', 'N',
+ 'C', 'L', 'A', 'W',
+ 'C', 'L', 'E', 'F',
+ 'C', 'L', 'U', 'B',
+ 'C', 'O', 'D', 'A',
+ 'C', 'O', 'L', 'L',
+ 'C', 'O', 'M', 'B',
+ 'C', 'O', 'P', 'Y',
+ 'C', 'R', 'O', 'P',
+ 'C', 'U', 'B', 'E',
+ 'C', 'U', 'O', 'P',
+ 'C', 'U', 'O', 'X',
+ 'C', 'U', 'R', 'L',
+ 'C', 'U', 'R', 'X',
+ 'C', 'W', 'A', 'A',
+ 'C', 'W', 'I', 'I',
+ 'C', 'W', 'O', 'O',
+ 'C', 'Y', 'R', 'X',
+ 'D', 'A', 'E', 'G',
+ 'D', 'A', 'G', 'S',
+ 'D', 'A', 'I', 'R',
+ 'D', 'A', 'M', 'P',
+ 'D', 'A', 'N', 'G',
+ 'D', 'A', 'R', 'K',
+ 'D', 'A', 'R', 'T',
+ 'D', 'A', 'S', 'H',
+ 'D', 'A', 'T', 'A',
+ 'D', 'A', 'T', 'E',
+ 'D', 'D', 'A', 'A',
+ 'D', 'D', 'A', 'L',
+ 'D', 'D', 'A', 'P',
+ 'D', 'D', 'A', 'T',
+ 'D', 'D', 'A', 'X',
+ 'D', 'D', 'D', 'A',
+ 'D', 'D', 'E', 'E',
+ 'D', 'D', 'E', 'P',
+ 'D', 'D', 'E', 'X',
+ 'D', 'D', 'H', 'A',
+ 'D', 'D', 'H', 'O',
+ 'D', 'D', 'I', 'E',
+ 'D', 'D', 'I', 'P',
+ 'D', 'D', 'I', 'T',
+ 'D', 'D', 'I', 'X',
+ 'D', 'D', 'O', 'A',
+ 'D', 'D', 'O', 'P',
+ 'D', 'D', 'O', 'T',
+ 'D', 'D', 'O', 'X',
+ 'D', 'D', 'U', 'O',
+ 'D', 'D', 'U', 'P',
+ 'D', 'D', 'U', 'R',
+ 'D', 'D', 'U', 'T',
+ 'D', 'D', 'U', 'X',
+ 'D', 'D', 'W', 'A',
+ 'D', 'E', 'A', 'D',
+ 'D', 'E', 'E', 'L',
+ 'D', 'E', 'E', 'R',
+ 'D', 'E', 'H', 'I',
+ 'D', 'E', 'K', 'A',
+ 'D', 'E', 'L', 'T',
+ 'D', 'E', 'N', 'G',
+ 'D', 'E', 'S', 'I',
+ 'D', 'E', 'Z', 'H',
+ 'D', 'H', 'A', 'L',
+ 'D', 'H', 'E', 'E',
+ 'D', 'H', 'H', 'A',
+ 'D', 'H', 'H', 'E',
+ 'D', 'H', 'H', 'I',
+ 'D', 'H', 'H', 'O',
+ 'D', 'H', 'H', 'U',
+ 'D', 'H', 'O', 'O',
+ 'D', 'I', 'E', 'P',
+ 'D', 'I', 'E', 'X',
+ 'D', 'I', 'G', 'A',
+ 'D', 'I', 'M', '2',
+ 'D', 'I', 'N', 'G',
+ 'D', 'I', 'S', 'C',
+ 'D', 'I', 'S', 'H',
+ 'D', 'K', 'A', 'R',
+ 'D', 'L', 'E', 'E',
+ 'D', 'O', '-', 'O',
+ 'D', 'O', 'E', 'S',
+ 'D', 'O', 'I', 'T',
+ 'D', 'O', 'N', 'G',
+ 'D', 'O', 'O', 'R',
+ 'D', 'O', 'R', 'U',
+ 'D', 'O', 'T', 'S',
+ 'D', 'O', 'V', 'E',
+ 'D', 'O', 'W', 'N',
+ 'D', 'R', 'I', 'L',
+ 'D', 'R', 'U', 'M',
+ 'D', 'U', 'B', '2',
+ 'D', 'U', 'N', '3',
+ 'D', 'U', 'N', '4',
+ 'D', 'U', 'N', 'G',
+ 'D', 'U', 'O', 'X',
+ 'D', 'U', 'R', '2',
+ 'D', 'U', 'R', 'X',
+ 'D', 'Y', 'E', 'H',
+ 'D', 'Z', 'E', 'E',
+ 'D', 'Z', 'H', 'A',
+ 'D', 'Z', 'H', 'E',
+ 'D', 'Z', 'J', 'E',
+ 'D', 'Z', 'W', 'E',
+ 'D', 'Z', 'Z', 'E',
+ 'E', 'A', 'S', 'E',
+ 'E', 'A', 'S', 'T',
+ 'E', 'D', 'I', 'N',
+ 'E', 'G', 'I', 'R',
+ 'E', 'N', 'O', 'S',
+ 'E', 'O', '-', 'O',
+ 'E', 'O', '-', 'U',
+ 'E', 'R', 'E', 'N',
+ 'E', 'S', 'H', '2',
+ 'E', 'U', '-', 'U',
+ 'E', 'U', 'R', 'O',
+ 'E', 'V', 'E', 'N',
+ 'E', 'Z', 'E', 'N',
+ 'F', 'A', 'A', 'I',
+ 'F', 'A', 'C', 'E',
+ 'F', 'A', 'N', 'G',
+ 'F', 'E', 'E', 'D',
+ 'F', 'E', 'H', 'U',
+ 'F', 'E', 'N', 'G',
+ 'F', 'E', 'O', 'H',
+ 'F', 'I', 'L', 'E',
+ 'F', 'I', 'L', 'L',
+ 'F', 'I', 'R', 'E',
+ 'F', 'I', 'S', 'H',
+ 'F', 'I', 'T', 'A',
+ 'F', 'I', 'V', 'E',
+ 'F', 'L', 'A', 'G',
+ 'F', 'L', 'A', 'T',
+ 'F', 'L', 'I', 'P',
+ 'F', 'O', 'O', 'T',
+ 'F', 'O', 'R', 'K',
+ 'F', 'O', 'R', 'M',
+ 'F', 'O', 'U', 'R',
+ 'F', 'R', 'E', 'E',
+ 'F', 'R', 'O', 'G',
+ 'F', 'R', 'O', 'M',
+ 'F', 'U', 'L', 'L',
+ 'F', 'U', 'R', 'X',
+ 'F', 'U', 'S', 'A',
+ 'F', 'U', 'S', 'E',
+ 'F', 'W', 'A', 'A',
+ 'F', 'W', 'E', 'E',
+ 'G', 'A', 'B', 'A',
+ 'G', 'A', 'L', 'I',
+ 'G', 'A', 'M', 'L',
+ 'G', 'A', 'N', '2',
+ 'G', 'A', 'R', '3',
+ 'G', 'A', 'T', 'E',
+ 'G', 'B', 'E', 'E',
+ 'G', 'B', 'E', 'N',
+ 'G', 'B', 'O', 'N',
+ 'G', 'B', 'O', 'O',
+ 'G', 'C', 'A', 'N',
+ 'G', 'C', 'I', 'G',
+ 'G', 'D', 'A', 'N',
+ 'G', 'E', 'A', 'R',
+ 'G', 'E', 'B', 'A',
+ 'G', 'E', 'B', 'O',
+ 'G', 'E', 'D', 'E',
+ 'G', 'E', 'T', 'A',
+ 'G', 'G', 'A', 'A',
+ 'G', 'G', 'A', 'P',
+ 'G', 'G', 'A', 'T',
+ 'G', 'G', 'A', 'X',
+ 'G', 'G', 'E', 'E',
+ 'G', 'G', 'E', 'P',
+ 'G', 'G', 'E', 'T',
+ 'G', 'G', 'E', 'X',
+ 'G', 'G', 'I', 'E',
+ 'G', 'G', 'I', 'T',
+ 'G', 'G', 'I', 'X',
+ 'G', 'G', 'O', 'P',
+ 'G', 'G', 'O', 'T',
+ 'G', 'G', 'O', 'X',
+ 'G', 'G', 'U', 'O',
+ 'G', 'G', 'U', 'P',
+ 'G', 'G', 'U', 'R',
+ 'G', 'G', 'U', 'T',
+ 'G', 'G', 'U', 'X',
+ 'G', 'G', 'W', 'A',
+ 'G', 'G', 'W', 'E',
+ 'G', 'G', 'W', 'I',
+ 'G', 'H', 'A', 'D',
+ 'G', 'H', 'A', 'N',
+ 'G', 'H', 'E', 'E',
+ 'G', 'H', 'H', 'A',
+ 'G', 'H', 'W', 'A',
+ 'G', 'I', 'B', 'A',
+ 'G', 'I', 'E', 'P',
+ 'G', 'I', 'E', 'T',
+ 'G', 'I', 'E', 'X',
+ 'G', 'I', 'G', 'A',
+ 'G', 'I', 'R', '2',
+ 'G', 'I', 'R', '3',
+ 'G', 'I', 'S', 'H',
+ 'G', 'O', 'A', 'L',
+ 'G', 'O', 'L', 'D',
+ 'G', 'O', 'N', 'G',
+ 'G', 'O', 'R', 'A',
+ 'G', 'O', 'R', 'T',
+ 'G', 'R', 'A', 'M',
+ 'G', 'S', 'U', 'M',
+ 'G', 'T', 'E', 'R',
+ 'G', 'U', 'E', 'H',
+ 'G', 'U', 'N', 'U',
+ 'G', 'U', 'O', 'P',
+ 'G', 'U', 'O', 'T',
+ 'G', 'U', 'O', 'X',
+ 'G', 'U', 'R', '7',
+ 'G', 'U', 'R', 'X',
+ 'G', 'W', 'A', 'A',
+ 'G', 'W', 'E', 'E',
+ 'G', 'Y', 'A', 'A',
+ 'G', 'Y', 'A', 'S',
+ 'G', 'Y', 'E', 'E',
+ 'G', 'Y', 'F', 'U',
+ 'G', 'Y', 'O', 'N',
+ 'H', 'A', 'G', 'L',
+ 'H', 'A', 'I', 'R',
+ 'H', 'A', 'L', 'F',
+ 'H', 'A', 'N', 'D',
+ 'H', 'A', 'R', 'D',
+ 'H', 'A', 'T', 'E',
+ 'H', 'A', 'V', 'E',
+ 'H', 'E', 'A', 'D',
+ 'H', 'E', 'L', 'M',
+ 'H', 'E', 'M', 'P',
+ 'H', 'E', 'N', 'G',
+ 'H', 'E', 'R', 'U',
+ 'H', 'E', 'T', 'A',
+ 'H', 'E', 'T', 'H',
+ 'H', 'H', 'A', 'A',
+ 'H', 'H', 'E', 'E',
+ 'H', 'H', 'W', 'A',
+ 'H', 'I', 'D', 'E',
+ 'H', 'I', 'E', 'X',
+ 'H', 'I', 'G', 'H',
+ 'H', 'I', 'Z', 'B',
+ 'H', 'L', 'A', 'P',
+ 'H', 'L', 'A', 'T',
+ 'H', 'L', 'A', 'X',
+ 'H', 'L', 'E', 'P',
+ 'H', 'L', 'E', 'X',
+ 'H', 'L', 'I', 'E',
+ 'H', 'L', 'I', 'P',
+ 'H', 'L', 'I', 'T',
+ 'H', 'L', 'I', 'X',
+ 'H', 'L', 'O', 'P',
+ 'H', 'L', 'O', 'X',
+ 'H', 'L', 'U', 'O',
+ 'H', 'L', 'U', 'P',
+ 'H', 'L', 'U', 'R',
+ 'H', 'L', 'U', 'T',
+ 'H', 'L', 'U', 'X',
+ 'H', 'L', 'Y', 'P',
+ 'H', 'L', 'Y', 'R',
+ 'H', 'L', 'Y', 'T',
+ 'H', 'L', 'Y', 'X',
+ 'H', 'M', 'A', 'P',
+ 'H', 'M', 'A', 'T',
+ 'H', 'M', 'A', 'X',
+ 'H', 'M', 'I', 'E',
+ 'H', 'M', 'I', 'P',
+ 'H', 'M', 'I', 'T',
+ 'H', 'M', 'I', 'X',
+ 'H', 'M', 'O', 'P',
+ 'H', 'M', 'O', 'T',
+ 'H', 'M', 'O', 'X',
+ 'H', 'M', 'U', 'O',
+ 'H', 'M', 'U', 'P',
+ 'H', 'M', 'U', 'R',
+ 'H', 'M', 'U', 'T',
+ 'H', 'M', 'U', 'X',
+ 'H', 'M', 'Y', 'P',
+ 'H', 'M', 'Y', 'R',
+ 'H', 'M', 'Y', 'X',
+ 'H', 'N', 'A', 'P',
+ 'H', 'N', 'A', 'T',
+ 'H', 'N', 'A', 'X',
+ 'H', 'N', 'E', 'P',
+ 'H', 'N', 'E', 'X',
+ 'H', 'N', 'I', 'E',
+ 'H', 'N', 'I', 'P',
+ 'H', 'N', 'I', 'T',
+ 'H', 'N', 'I', 'X',
+ 'H', 'N', 'O', 'P',
+ 'H', 'N', 'O', 'T',
+ 'H', 'N', 'O', 'X',
+ 'H', 'N', 'U', 'O',
+ 'H', 'N', 'U', 'T',
+ 'H', 'O', 'O', 'K',
+ 'H', 'O', 'O', 'N',
+ 'H', 'O', 'R', 'I',
+ 'H', 'O', 'R', 'N',
+ 'H', 'O', 'T', 'A',
+ 'H', 'O', 'U', 'R',
+ 'H', 'P', 'W', 'G',
+ 'H', 'U', 'B', '2',
+ 'H', 'U', 'L', '2',
+ 'H', 'U', 'N', 'G',
+ 'H', 'U', 'O', 'P',
+ 'H', 'U', 'O', 'T',
+ 'H', 'U', 'O', 'X',
+ 'H', 'W', 'E', 'E',
+ 'H', 'X', 'A', 'P',
+ 'H', 'X', 'A', 'T',
+ 'H', 'X', 'A', 'X',
+ 'H', 'X', 'E', 'P',
+ 'H', 'X', 'E', 'X',
+ 'H', 'X', 'I', 'E',
+ 'H', 'X', 'I', 'P',
+ 'H', 'X', 'I', 'T',
+ 'H', 'X', 'I', 'X',
+ 'H', 'X', 'O', 'P',
+ 'H', 'X', 'O', 'T',
+ 'H', 'X', 'O', 'X',
+ 'H', 'X', 'U', 'O',
+ 'H', 'X', 'W', 'G',
+ 'H', 'Z', 'W', 'G',
+ 'H', 'Z', 'Z', 'P',
+ 'H', 'Z', 'Z', 'Z',
+ 'I', '-', 'E', 'U',
+ 'I', '-', 'Y', 'A',
+ 'I', 'D', 'I', 'M',
+ 'I', 'D', 'L', 'E',
+ 'I', 'F', 'I', 'N',
+ 'I', 'L', 'U', 'T',
+ 'I', 'L', 'U', 'Y',
+ 'I', 'M', 'I', 'N',
+ 'I', 'N', 'C', 'H',
+ 'I', 'N', 'N', 'N',
+ 'I', 'N', 'T', 'I',
+ 'I', 'O', 'T', 'A',
+ 'I', 'S', 'A', 'Z',
+ 'I', 'S', 'O', 'N',
+ 'I', 'T', 'E', 'M',
+ 'I', 'U', 'J', 'A',
+ 'I', 'W', 'A', 'Z',
+ 'I', 'Z', 'H', 'E',
+ 'J', 'A', 'D', 'E',
+ 'J', 'E', 'E', 'M',
+ 'J', 'E', 'R', 'A',
+ 'J', 'H', 'A', 'N',
+ 'J', 'H', 'E', 'H',
+ 'J', 'I', 'E', 'P',
+ 'J', 'I', 'E', 'T',
+ 'J', 'I', 'E', 'X',
+ 'J', 'J', 'E', 'E',
+ 'J', 'J', 'I', 'E',
+ 'J', 'J', 'I', 'P',
+ 'J', 'J', 'I', 'T',
+ 'J', 'J', 'I', 'X',
+ 'J', 'J', 'O', 'P',
+ 'J', 'J', 'O', 'T',
+ 'J', 'J', 'O', 'X',
+ 'J', 'J', 'U', 'O',
+ 'J', 'J', 'U', 'P',
+ 'J', 'J', 'U', 'R',
+ 'J', 'J', 'U', 'T',
+ 'J', 'J', 'U', 'X',
+ 'J', 'J', 'Y', 'P',
+ 'J', 'J', 'Y', 'T',
+ 'J', 'J', 'Y', 'X',
+ 'J', 'O', 'I', 'N',
+ 'J', 'O', 'N', 'A',
+ 'J', 'O', 'N', 'G',
+ 'J', 'U', 'L', 'Y',
+ 'J', 'U', 'N', 'E',
+ 'J', 'U', 'N', 'O',
+ 'J', 'U', 'O', 'P',
+ 'J', 'U', 'O', 'T',
+ 'J', 'U', 'O', 'X',
+ 'J', 'U', 'R', 'X',
+ 'J', 'Y', 'R', 'X',
+ 'K', 'A', 'A', 'F',
+ 'K', 'A', 'A', 'I',
+ 'K', 'A', 'B', 'A',
+ 'K', 'A', 'D', '2',
+ 'K', 'A', 'D', '3',
+ 'K', 'A', 'D', '4',
+ 'K', 'A', 'D', '5',
+ 'K', 'A', 'K', 'O',
+ 'K', 'A', 'M', '2',
+ 'K', 'A', 'M', '4',
+ 'K', 'A', 'N', 'A',
+ 'K', 'A', 'N', 'G',
+ 'K', 'A', 'P', 'A',
+ 'K', 'A', 'P', 'H',
+ 'K', 'A', 'P', 'O',
+ 'K', 'A', 'T', 'O',
+ 'K', 'A', 'U', 'N',
+ 'K', 'C', 'A', 'L',
+ 'K', 'H', 'A', 'A',
+ 'K', 'H', 'A', 'H',
+ 'K', 'H', 'A', 'I',
+ 'K', 'H', 'A', 'N',
+ 'K', 'H', 'A', 'R',
+ 'K', 'H', 'E', 'E',
+ 'K', 'H', 'E', 'I',
+ 'K', 'H', 'H', 'A',
+ 'K', 'H', 'O', 'N',
+ 'K', 'H', 'O', 'T',
+ 'K', 'I', 'C', 'K',
+ 'K', 'I', 'E', 'P',
+ 'K', 'I', 'E', 'X',
+ 'K', 'I', 'N', 'G',
+ 'K', 'I', 'R', 'O',
+ 'K', 'I', 'S', 'H',
+ 'K', 'K', 'E', 'E',
+ 'K', 'O', 'E', 'T',
+ 'K', 'O', 'M', 'I',
+ 'K', 'O', 'T', 'O',
+ 'K', 'P', 'A', 'N',
+ 'K', 'P', 'E', 'E',
+ 'K', 'P', 'E', 'N',
+ 'K', 'P', 'O', 'O',
+ 'K', 'S', 'S', 'A',
+ 'K', 'U', 'N', 'G',
+ 'K', 'U', 'O', 'P',
+ 'K', 'U', 'O', 'X',
+ 'K', 'U', 'R', 'T',
+ 'K', 'U', 'R', 'X',
+ 'K', 'U', 'U', 'H',
+ 'K', 'W', 'A', 'A',
+ 'K', 'W', 'E', 'E',
+ 'K', 'W', 'I', 'I',
+ 'K', 'W', 'O', 'O',
+ 'K', 'X', 'A', 'A',
+ 'K', 'X', 'E', 'E',
+ 'K', 'X', 'W', 'A',
+ 'K', 'X', 'W', 'E',
+ 'K', 'X', 'W', 'I',
+ 'K', 'Y', 'A', 'A',
+ 'K', 'Y', 'E', 'E',
+ 'L', 'A', 'A', 'I',
+ 'L', 'A', 'A', 'N',
+ 'L', 'A', 'C', 'A',
+ 'L', 'A', 'C', 'K',
+ 'L', 'A', 'E', 'V',
+ 'L', 'A', 'G', 'U',
+ 'L', 'A', 'K', 'E',
+ 'L', 'A', 'M', 'D',
+ 'L', 'A', 'M', 'E',
+ 'L', 'A', 'S', 'T',
+ 'L', 'A', 'T', 'E',
+ 'L', 'A', 'Z', 'Y',
+ 'L', 'D', 'A', 'N',
+ 'L', 'E', 'A', 'F',
+ 'L', 'E', 'E', 'K',
+ 'L', 'E', 'F', 'T',
+ 'L', 'E', 'G', 'S',
+ 'L', 'E', 'S', 'S',
+ 'L', 'E', 'Z', 'H',
+ 'L', 'H', 'A', 'A',
+ 'L', 'H', 'A', 'G',
+ 'L', 'H', 'E', 'E',
+ 'L', 'H', 'I', 'I',
+ 'L', 'H', 'O', 'O',
+ 'L', 'I', 'E', 'P',
+ 'L', 'I', 'E', 'T',
+ 'L', 'I', 'E', 'X',
+ 'L', 'I', 'F', 'E',
+ 'L', 'I', 'L', 'Y',
+ 'L', 'I', 'N', 'E',
+ 'L', 'I', 'N', 'G',
+ 'L', 'I', 'N', 'K',
+ 'L', 'I', 'R', 'A',
+ 'L', 'I', 'S', 'H',
+ 'L', 'I', 'W', 'N',
+ 'L', 'L', 'L', 'A',
+ 'L', 'O', 'G', 'R',
+ 'L', 'O', 'L', 'L',
+ 'L', 'O', 'N', 'G',
+ 'L', 'O', 'O', 'P',
+ 'L', 'O', 'O', 'T',
+ 'L', 'U', 'I', 'S',
+ 'L', 'U', 'O', 'P',
+ 'L', 'U', 'O', 'T',
+ 'L', 'U', 'O', 'X',
+ 'L', 'U', 'R', 'X',
+ 'L', 'W', 'A', 'A',
+ 'L', 'W', 'I', 'I',
+ 'L', 'W', 'O', 'O',
+ 'L', 'Y', 'R', 'X',
+ 'M', 'A', 'A', 'I',
+ 'M', 'A', 'D', 'U',
+ 'M', 'A', 'L', 'E',
+ 'M', 'A', 'R', 'E',
+ 'M', 'A', 'R', 'K',
+ 'M', 'A', 'S', 'H',
+ 'M', 'A', 'S', 'U',
+ 'M', 'B', 'E', 'E',
+ 'M', 'B', 'O', 'O',
+ 'M', 'C', 'H', 'U',
+ 'M', 'D', 'U', 'N',
+ 'M', 'E', 'A', 'T',
+ 'M', 'E', 'E', 'M',
+ 'M', 'E', 'E', 'T',
+ 'M', 'E', 'G', 'A',
+ 'M', 'E', 'R', 'I',
+ 'M', 'E', 'S', 'H',
+ 'M', 'E', 'S', 'I',
+ 'M', 'E', 'S', 'O',
+ 'M', 'E', 'T', 'A',
+ 'M', 'G', 'A', 'P',
+ 'M', 'G', 'A', 'T',
+ 'M', 'G', 'A', 'X',
+ 'M', 'G', 'B', 'A',
+ 'M', 'G', 'B', 'E',
+ 'M', 'G', 'B', 'I',
+ 'M', 'G', 'B', 'O',
+ 'M', 'G', 'B', 'U',
+ 'M', 'G', 'E', 'P',
+ 'M', 'G', 'E', 'X',
+ 'M', 'G', 'I', 'E',
+ 'M', 'G', 'O', 'P',
+ 'M', 'G', 'O', 'T',
+ 'M', 'G', 'O', 'X',
+ 'M', 'G', 'U', 'O',
+ 'M', 'G', 'U', 'P',
+ 'M', 'G', 'U', 'R',
+ 'M', 'G', 'U', 'T',
+ 'M', 'G', 'U', 'X',
+ 'M', 'I', 'E', 'P',
+ 'M', 'I', 'E', 'X',
+ 'M', 'I', 'I', 'N',
+ 'M', 'I', 'L', 'L',
+ 'M', 'I', 'M', 'E',
+ 'M', 'I', 'N', 'Y',
+ 'M', 'I', 'R', 'I',
+ 'M', 'N', 'A', 'S',
+ 'M', 'O', 'O', 'N',
+ 'M', 'U', 'A', 'N',
+ 'M', 'U', 'C', 'H',
+ 'M', 'U', 'I', 'N',
+ 'M', 'U', 'O', 'P',
+ 'M', 'U', 'O', 'T',
+ 'M', 'U', 'O', 'X',
+ 'M', 'U', 'O', 'Y',
+ 'M', 'U', 'R', 'X',
+ 'M', 'U', 'S', 'H',
+ 'M', 'W', 'A', 'A',
+ 'M', 'W', 'E', 'E',
+ 'M', 'W', 'I', 'I',
+ 'M', 'W', 'O', 'O',
+ 'N', 'A', 'A', 'I',
+ 'N', 'A', 'G', 'A',
+ 'N', 'A', 'M', '2',
+ 'N', 'A', 'M', 'E',
+ 'N', 'A', 'N', 'A',
+ 'N', 'A', 'N', 'D',
+ 'N', 'A', 'N', 'O',
+ 'N', 'A', 'O', 'S',
+ 'N', 'A', 'U', 'D',
+ 'N', 'B', 'A', 'P',
+ 'N', 'B', 'A', 'T',
+ 'N', 'B', 'A', 'X',
+ 'N', 'B', 'I', 'E',
+ 'N', 'B', 'I', 'P',
+ 'N', 'B', 'I', 'T',
+ 'N', 'B', 'I', 'X',
+ 'N', 'B', 'O', 'P',
+ 'N', 'B', 'O', 'T',
+ 'N', 'B', 'O', 'X',
+ 'N', 'B', 'U', 'P',
+ 'N', 'B', 'U', 'R',
+ 'N', 'B', 'U', 'T',
+ 'N', 'B', 'U', 'X',
+ 'N', 'B', 'Y', 'P',
+ 'N', 'B', 'Y', 'R',
+ 'N', 'B', 'Y', 'T',
+ 'N', 'B', 'Y', 'X',
+ 'N', 'D', 'A', 'P',
+ 'N', 'D', 'A', 'T',
+ 'N', 'D', 'A', 'X',
+ 'N', 'D', 'E', 'E',
+ 'N', 'D', 'E', 'P',
+ 'N', 'D', 'E', 'X',
+ 'N', 'D', 'I', 'E',
+ 'N', 'D', 'I', 'P',
+ 'N', 'D', 'I', 'T',
+ 'N', 'D', 'I', 'X',
+ 'N', 'D', 'O', 'O',
+ 'N', 'D', 'O', 'P',
+ 'N', 'D', 'O', 'T',
+ 'N', 'D', 'O', 'X',
+ 'N', 'D', 'U', 'P',
+ 'N', 'D', 'U', 'R',
+ 'N', 'D', 'U', 'T',
+ 'N', 'D', 'U', 'X',
+ 'N', 'E', 'X', 'T',
+ 'N', 'G', 'A', 'A',
+ 'N', 'G', 'A', 'I',
+ 'N', 'G', 'A', 'N',
+ 'N', 'G', 'A', 'P',
+ 'N', 'G', 'A', 'S',
+ 'N', 'G', 'A', 'T',
+ 'N', 'G', 'A', 'X',
+ 'N', 'G', 'E', 'N',
+ 'N', 'G', 'E', 'P',
+ 'N', 'G', 'E', 'X',
+ 'N', 'G', 'G', 'A',
+ 'N', 'G', 'G', 'E',
+ 'N', 'G', 'G', 'I',
+ 'N', 'G', 'G', 'O',
+ 'N', 'G', 'G', 'U',
+ 'N', 'G', 'I', 'E',
+ 'N', 'G', 'I', 'I',
+ 'N', 'G', 'K', 'A',
+ 'N', 'G', 'O', 'N',
+ 'N', 'G', 'O', 'O',
+ 'N', 'G', 'O', 'P',
+ 'N', 'G', 'O', 'T',
+ 'N', 'G', 'O', 'X',
+ 'N', 'G', 'U', 'E',
+ 'N', 'G', 'U', 'O',
+ 'N', 'H', 'J', 'A',
+ 'N', 'H', 'U', 'E',
+ 'N', 'I', 'E', 'P',
+ 'N', 'I', 'E', 'X',
+ 'N', 'I', 'N', 'E',
+ 'N', 'I', 'O', 'N',
+ 'N', 'J', 'E', 'E',
+ 'N', 'J', 'I', 'E',
+ 'N', 'J', 'I', 'P',
+ 'N', 'J', 'I', 'T',
+ 'N', 'J', 'I', 'X',
+ 'N', 'J', 'O', 'O',
+ 'N', 'J', 'O', 'P',
+ 'N', 'J', 'O', 'T',
+ 'N', 'J', 'O', 'X',
+ 'N', 'J', 'U', 'O',
+ 'N', 'J', 'U', 'P',
+ 'N', 'J', 'U', 'R',
+ 'N', 'J', 'U', 'X',
+ 'N', 'J', 'Y', 'P',
+ 'N', 'J', 'Y', 'R',
+ 'N', 'J', 'Y', 'T',
+ 'N', 'J', 'Y', 'X',
+ 'N', 'N', 'G', 'A',
+ 'N', 'N', 'G', 'I',
+ 'N', 'N', 'G', 'O',
+ 'N', 'N', 'N', 'A',
+ 'N', 'N', 'Y', 'A',
+ 'N', 'O', 'D', 'E',
+ 'N', 'O', 'O', 'N',
+ 'N', 'O', 'S', 'E',
+ 'N', 'O', 'T', 'E',
+ 'N', 'R', 'A', 'P',
+ 'N', 'R', 'A', 'T',
+ 'N', 'R', 'A', 'X',
+ 'N', 'R', 'E', 'P',
+ 'N', 'R', 'E', 'T',
+ 'N', 'R', 'E', 'X',
+ 'N', 'R', 'O', 'P',
+ 'N', 'R', 'O', 'X',
+ 'N', 'R', 'U', 'P',
+ 'N', 'R', 'U', 'R',
+ 'N', 'R', 'U', 'T',
+ 'N', 'R', 'U', 'X',
+ 'N', 'R', 'Y', 'P',
+ 'N', 'R', 'Y', 'R',
+ 'N', 'R', 'Y', 'T',
+ 'N', 'R', 'Y', 'X',
+ 'N', 'U', '1', '1',
+ 'N', 'U', 'L', 'L',
+ 'N', 'U', 'O', 'P',
+ 'N', 'U', 'O', 'X',
+ 'N', 'U', 'R', 'X',
+ 'N', 'U', 'U', 'N',
+ 'N', 'W', 'A', 'A',
+ 'N', 'Y', 'A', 'A',
+ 'N', 'Y', 'C', 'A',
+ 'N', 'Y', 'E', 'E',
+ 'N', 'Y', 'E', 'H',
+ 'N', 'Y', 'E', 'T',
+ 'N', 'Y', 'I', 'E',
+ 'N', 'Y', 'I', 'P',
+ 'N', 'Y', 'I', 'S',
+ 'N', 'Y', 'I', 'T',
+ 'N', 'Y', 'I', 'X',
+ 'N', 'Y', 'J', 'A',
+ 'N', 'Y', 'O', 'A',
+ 'N', 'Y', 'O', 'O',
+ 'N', 'Y', 'O', 'P',
+ 'N', 'Y', 'O', 'T',
+ 'N', 'Y', 'O', 'X',
+ 'N', 'Y', 'U', 'O',
+ 'N', 'Y', 'U', 'P',
+ 'N', 'Y', 'U', 'T',
+ 'N', 'Y', 'U', 'X',
+ 'N', 'Y', 'W', 'A',
+ 'N', 'Z', 'A', 'P',
+ 'N', 'Z', 'A', 'T',
+ 'N', 'Z', 'A', 'X',
+ 'N', 'Z', 'E', 'X',
+ 'N', 'Z', 'I', 'E',
+ 'N', 'Z', 'I', 'P',
+ 'N', 'Z', 'I', 'T',
+ 'N', 'Z', 'I', 'X',
+ 'N', 'Z', 'O', 'P',
+ 'N', 'Z', 'O', 'X',
+ 'N', 'Z', 'U', 'O',
+ 'N', 'Z', 'U', 'P',
+ 'N', 'Z', 'U', 'R',
+ 'N', 'Z', 'U', 'X',
+ 'N', 'Z', 'Y', 'P',
+ 'N', 'Z', 'Y', 'R',
+ 'N', 'Z', 'Y', 'T',
+ 'N', 'Z', 'Y', 'X',
+ 'O', '-', 'E', 'O',
+ 'O', '-', 'Y', 'E',
+ 'O', 'B', 'O', 'L',
+ 'O', 'K', 'T', 'O',
+ 'O', 'N', 'S', 'U',
+ 'O', 'O', 'M', 'U',
+ 'O', 'O', 'Z', 'E',
+ 'O', 'P', 'E', 'N',
+ 'O', 'V', 'E', 'R',
+ 'O', 'X', 'I', 'A',
+ 'P', 'A', 'A', 'I',
+ 'P', 'A', 'G', 'E',
+ 'P', 'A', 'L', 'M',
+ 'P', 'A', 'N', 'G',
+ 'P', 'A', 'R', 'A',
+ 'P', 'A', 'R', 'T',
+ 'P', 'A', 'T', 'H',
+ 'P', 'A', 'W', 'N',
+ 'P', 'E', 'E', 'P',
+ 'P', 'E', 'S', 'O',
+ 'P', 'H', 'A', 'A',
+ 'P', 'H', 'A', 'N',
+ 'P', 'H', 'A', 'R',
+ 'P', 'H', 'E', 'E',
+ 'P', 'H', 'O', 'A',
+ 'P', 'H', 'U', 'R',
+ 'P', 'H', 'W', 'A',
+ 'P', 'I', 'C', 'K',
+ 'P', 'I', 'E', 'P',
+ 'P', 'I', 'E', 'X',
+ 'P', 'I', 'K', 'O',
+ 'P', 'I', 'N', 'G',
+ 'P', 'I', 'W', 'R',
+ 'P', 'L', 'A', 'K',
+ 'P', 'L', 'O', 'W',
+ 'P', 'L', 'U', 'K',
+ 'P', 'L', 'U', 'M',
+ 'P', 'L', 'U', 'S',
+ 'P', 'O', 'L', 'E',
+ 'P', 'O', 'L', 'I',
+ 'P', 'R', 'A', 'M',
+ 'P', 'U', 'N', 'G',
+ 'P', 'U', 'O', 'P',
+ 'P', 'U', 'O', 'X',
+ 'P', 'U', 'R', 'X',
+ 'P', 'W', 'A', 'A',
+ 'P', 'W', 'E', 'E',
+ 'P', 'W', 'I', 'I',
+ 'P', 'W', 'O', 'O',
+ 'P', 'Y', 'R', 'X',
+ 'Q', 'A', 'A', 'F',
+ 'Q', 'A', 'A', 'I',
+ 'Q', 'A', 'L', 'A',
+ 'Q', 'A', 'P', 'H',
+ 'Q', 'H', 'A', 'A',
+ 'Q', 'H', 'E', 'E',
+ 'Q', 'H', 'W', 'A',
+ 'Q', 'H', 'W', 'E',
+ 'Q', 'H', 'W', 'I',
+ 'Q', 'I', 'E', 'P',
+ 'Q', 'I', 'E', 'T',
+ 'Q', 'I', 'E', 'X',
+ 'Q', 'O', 'P', 'A',
+ 'Q', 'U', 'A', 'D',
+ 'Q', 'U', 'O', 'P',
+ 'Q', 'U', 'O', 'T',
+ 'Q', 'U', 'O', 'X',
+ 'Q', 'U', 'R', 'X',
+ 'Q', 'U', 'U', 'V',
+ 'Q', 'W', 'A', 'A',
+ 'Q', 'W', 'E', 'E',
+ 'Q', 'Y', 'A', 'A',
+ 'Q', 'Y', 'E', 'E',
+ 'Q', 'Y', 'R', 'X',
+ 'R', 'A', 'A', 'I',
+ 'R', 'A', 'D', 'I',
+ 'R', 'A', 'F', 'E',
+ 'R', 'A', 'I', 'N',
+ 'R', 'A', 'M', 'S',
+ 'R', 'A', 'Y', 'S',
+ 'R', 'D', 'E', 'L',
+ 'R', 'E', 'I', 'D',
+ 'R', 'E', 'M', 'U',
+ 'R', 'E', 'P', 'A',
+ 'R', 'E', 'S', 'H',
+ 'R', 'E', 'S', 'T',
+ 'R', 'G', 'Y', 'A',
+ 'R', 'I', 'A', 'L',
+ 'R', 'I', 'C', 'E',
+ 'R', 'I', 'E', 'L',
+ 'R', 'I', 'N', 'G',
+ 'R', 'I', 'R', 'A',
+ 'R', 'I', 'S', 'H',
+ 'R', 'J', 'E', 'S',
+ 'R', 'N', 'A', 'M',
+ 'R', 'O', 'A', 'R',
+ 'R', 'O', 'O', 'F',
+ 'R', 'O', 'O', 'K',
+ 'R', 'O', 'O', 'T',
+ 'R', 'O', 'S', 'H',
+ 'R', 'R', 'A', 'X',
+ 'R', 'R', 'E', 'H',
+ 'R', 'R', 'E', 'P',
+ 'R', 'R', 'E', 'T',
+ 'R', 'R', 'E', 'X',
+ 'R', 'R', 'O', 'P',
+ 'R', 'R', 'O', 'T',
+ 'R', 'R', 'O', 'X',
+ 'R', 'R', 'U', 'O',
+ 'R', 'R', 'U', 'P',
+ 'R', 'R', 'U', 'R',
+ 'R', 'R', 'U', 'T',
+ 'R', 'R', 'U', 'X',
+ 'R', 'R', 'Y', 'P',
+ 'R', 'R', 'Y', 'R',
+ 'R', 'R', 'Y', 'T',
+ 'R', 'R', 'Y', 'X',
+ 'R', 'U', 'I', 'S',
+ 'R', 'U', 'L', 'E',
+ 'R', 'U', 'O', 'P',
+ 'R', 'U', 'O', 'X',
+ 'R', 'U', 'R', 'X',
+ 'R', 'U', 'S', 'I',
+ 'R', 'W', 'A', 'A',
+ 'R', 'Y', 'R', 'X',
+ 'S', 'A', '-', 'I',
+ 'S', 'A', 'A', 'I',
+ 'S', 'A', 'D', 'E',
+ 'S', 'A', 'G', 'A',
+ 'S', 'A', 'I', 'L',
+ 'S', 'A', 'L', 'A',
+ 'S', 'A', 'L', 'T',
+ 'S', 'A', 'P', 'A',
+ 'S', 'A', 'R', 'A',
+ 'S', 'A', 'R', 'I',
+ 'S', 'B', 'U', 'B',
+ 'S', 'C', 'A', 'N',
+ 'S', 'C', 'W', 'A',
+ 'S', 'E', 'A', 'L',
+ 'S', 'E', 'E', 'N',
+ 'S', 'E', 'L', 'F',
+ 'S', 'E', 'M', 'K',
+ 'S', 'G', 'A', 'B',
+ 'S', 'G', 'A', 'W',
+ 'S', 'G', 'O', 'R',
+ 'S', 'G', 'R', 'A',
+ 'S', 'H', 'A', '3',
+ 'S', 'H', 'A', '6',
+ 'S', 'H', 'A', 'A',
+ 'S', 'H', 'A', 'D',
+ 'S', 'H', 'A', 'N',
+ 'S', 'H', 'A', 'P',
+ 'S', 'H', 'A', 'T',
+ 'S', 'H', 'A', 'X',
+ 'S', 'H', 'E', 'E',
+ 'S', 'H', 'E', 'I',
+ 'S', 'H', 'E', 'N',
+ 'S', 'H', 'E', 'P',
+ 'S', 'H', 'E', 'T',
+ 'S', 'H', 'E', 'X',
+ 'S', 'H', 'H', 'A',
+ 'S', 'H', 'I', 'D',
+ 'S', 'H', 'I', 'I',
+ 'S', 'H', 'I', 'M',
+ 'S', 'H', 'I', 'N',
+ 'S', 'H', 'I', 'P',
+ 'S', 'H', 'I', 'R',
+ 'S', 'H', 'O', 'A',
+ 'S', 'H', 'O', 'E',
+ 'S', 'H', 'O', 'G',
+ 'S', 'H', 'O', 'O',
+ 'S', 'H', 'O', 'P',
+ 'S', 'H', 'O', 'T',
+ 'S', 'H', 'O', 'X',
+ 'S', 'H', 'T', 'A',
+ 'S', 'H', 'U', '2',
+ 'S', 'H', 'U', 'O',
+ 'S', 'H', 'U', 'P',
+ 'S', 'H', 'U', 'R',
+ 'S', 'H', 'U', 'T',
+ 'S', 'H', 'U', 'X',
+ 'S', 'H', 'W', 'A',
+ 'S', 'H', 'W', 'E',
+ 'S', 'H', 'W', 'I',
+ 'S', 'H', 'W', 'O',
+ 'S', 'H', 'Y', 'A',
+ 'S', 'H', 'Y', 'P',
+ 'S', 'H', 'Y', 'R',
+ 'S', 'H', 'Y', 'T',
+ 'S', 'H', 'Y', 'X',
+ 'S', 'I', 'B', 'E',
+ 'S', 'I', 'E', 'P',
+ 'S', 'I', 'E', 'X',
+ 'S', 'I', 'G', '4',
+ 'S', 'I', 'G', 'N',
+ 'S', 'I', 'K', '2',
+ 'S', 'I', 'K', 'I',
+ 'S', 'I', 'L', 'K',
+ 'S', 'I', 'M', 'A',
+ 'S', 'I', 'N', 'E',
+ 'S', 'I', 'O', 'S',
+ 'S', 'K', 'I', 'N',
+ 'S', 'K', 'W', 'A',
+ 'S', 'L', 'U', 'R',
+ 'S', 'N', 'A', 'P',
+ 'S', 'O', 'F', 'T',
+ 'S', 'P', 'O', 'T',
+ 'S', 'P', 'W', 'A',
+ 'S', 'S', 'A', 'A',
+ 'S', 'S', 'A', 'P',
+ 'S', 'S', 'A', 'T',
+ 'S', 'S', 'A', 'X',
+ 'S', 'S', 'E', 'E',
+ 'S', 'S', 'E', 'P',
+ 'S', 'S', 'E', 'X',
+ 'S', 'S', 'I', 'E',
+ 'S', 'S', 'I', 'P',
+ 'S', 'S', 'I', 'T',
+ 'S', 'S', 'I', 'X',
+ 'S', 'S', 'O', 'P',
+ 'S', 'S', 'O', 'T',
+ 'S', 'S', 'O', 'X',
+ 'S', 'S', 'U', 'P',
+ 'S', 'S', 'U', 'T',
+ 'S', 'S', 'U', 'X',
+ 'S', 'S', 'Y', 'P',
+ 'S', 'S', 'Y', 'R',
+ 'S', 'S', 'Y', 'T',
+ 'S', 'S', 'Y', 'X',
+ 'S', 'T', 'A', 'N',
+ 'S', 'T', 'A', 'R',
+ 'S', 'T', 'E', 'M',
+ 'S', 'T', 'E', 'P',
+ 'S', 'T', 'O', 'P',
+ 'S', 'T', 'W', 'A',
+ 'S', 'U', 'D', '2',
+ 'S', 'U', 'I', 'T',
+ 'S', 'U', 'K', 'U',
+ 'S', 'U', 'N', 'G',
+ 'S', 'U', 'O', 'P',
+ 'S', 'U', 'O', 'X',
+ 'S', 'U', 'R', '9',
+ 'S', 'U', 'R', 'E',
+ 'S', 'U', 'R', 'X',
+ 'S', 'W', 'A', 'A',
+ 'S', 'W', 'I', 'I',
+ 'S', 'W', 'O', 'O',
+ 'S', 'Y', 'R', 'X',
+ 'S', 'Z', 'A', 'A',
+ 'S', 'Z', 'E', 'E',
+ 'S', 'Z', 'W', 'A',
+ 'S', 'Z', 'W', 'G',
+ 'T', 'A', 'A', 'I',
+ 'T', 'A', 'C', 'K',
+ 'T', 'A', 'I', 'L',
+ 'T', 'A', 'K', '4',
+ 'T', 'A', 'K', 'E',
+ 'T', 'A', 'L', 'L',
+ 'T', 'A', 'P', 'E',
+ 'T', 'A', 'W', 'A',
+ 'T', 'C', 'H', 'E',
+ 'T', 'E', '-', 'U',
+ 'T', 'E', 'N', 'S',
+ 'T', 'E', 'N', 'T',
+ 'T', 'E', 'N', 'U',
+ 'T', 'E', 'S', 'H',
+ 'T', 'E', 'T', 'H',
+ 'T', 'E', 'X', 'T',
+ 'T', 'H', 'A', 'A',
+ 'T', 'H', 'A', 'I',
+ 'T', 'H', 'A', 'L',
+ 'T', 'H', 'A', 'N',
+ 'T', 'H', 'E', 'E',
+ 'T', 'H', 'E', 'H',
+ 'T', 'H', 'E', 'N',
+ 'T', 'H', 'E', 'S',
+ 'T', 'H', 'E', 'Y',
+ 'T', 'H', 'I', 'I',
+ 'T', 'H', 'I', 'N',
+ 'T', 'H', 'O', 'A',
+ 'T', 'H', 'O', 'O',
+ 'T', 'H', 'W', 'A',
+ 'T', 'I', 'C', 'K',
+ 'T', 'I', 'E', 'P',
+ 'T', 'I', 'E', 'X',
+ 'T', 'I', 'L', 'E',
+ 'T', 'I', 'M', 'E',
+ 'T', 'I', 'N', 'G',
+ 'T', 'I', 'N', 'Y',
+ 'T', 'I', 'W', 'N',
+ 'T', 'L', 'E', 'E',
+ 'T', 'L', 'H', 'A',
+ 'T', 'L', 'H', 'E',
+ 'T', 'L', 'H', 'I',
+ 'T', 'L', 'H', 'O',
+ 'T', 'L', 'H', 'U',
+ 'T', 'O', 'D', 'O',
+ 'T', 'O', 'N', 'E',
+ 'T', 'O', 'N', 'G',
+ 'T', 'R', 'E', 'E',
+ 'T', 'R', 'I', 'A',
+ 'T', 'R', 'U', 'E',
+ 'T', 'S', 'A', 'A',
+ 'T', 'S', 'E', 'E',
+ 'T', 'S', 'H', 'A',
+ 'T', 'S', 'H', 'E',
+ 'T', 'S', 'S', 'E',
+ 'T', 'S', 'W', 'A',
+ 'T', 'S', 'W', 'E',
+ 'T', 'T', 'A', 'A',
+ 'T', 'T', 'E', 'E',
+ 'T', 'T', 'E', 'H',
+ 'T', 'T', 'H', 'A',
+ 'T', 'T', 'H', 'E',
+ 'T', 'T', 'H', 'I',
+ 'T', 'T', 'H', 'O',
+ 'T', 'T', 'S', 'A',
+ 'T', 'T', 'S', 'E',
+ 'T', 'T', 'S', 'I',
+ 'T', 'T', 'S', 'O',
+ 'T', 'T', 'S', 'U',
+ 'T', 'U', 'G', '2',
+ 'T', 'U', 'O', 'P',
+ 'T', 'U', 'O', 'T',
+ 'T', 'U', 'O', 'X',
+ 'T', 'U', 'R', 'N',
+ 'T', 'U', 'R', 'X',
+ 'T', 'W', 'A', 'A',
+ 'T', 'W', 'I', 'I',
+ 'T', 'W', 'O', 'O',
+ 'T', 'Y', 'P', 'E',
+ 'T', 'Z', 'A', 'A',
+ 'T', 'Z', 'E', 'E',
+ 'T', 'Z', 'I', 'R',
+ 'T', 'Z', 'O', 'A',
+ 'U', '-', 'A', 'E',
+ 'U', '-', 'Y', 'E',
+ 'U', 'A', 'T', 'H',
+ 'U', 'D', 'U', 'G',
+ 'U', 'M', 'U', 'M',
+ 'U', 'N', 'D', 'O',
+ 'U', 'N', 'I', 'T',
+ 'U', 'R', 'I', '3',
+ 'U', 'R', 'U', 'S',
+ 'U', 'R', 'U', 'Z',
+ 'U', 'S', 'E', 'D',
+ 'U', 'S', 'H', '2',
+ 'U', 'S', 'H', 'X',
+ 'U', 'S', 'S', 'U',
+ 'U', 'U', 'U', '2',
+ 'U', 'U', 'U', '3',
+ 'U', 'U', 'U', 'U',
+ 'V', 'A', 'N', 'E',
+ 'V', 'E', 'D', 'E',
+ 'V', 'E', 'N', 'D',
+ 'V', 'E', 'R', 'Y',
+ 'V', 'I', 'D', 'A',
+ 'V', 'I', 'E', 'P',
+ 'V', 'I', 'E', 'T',
+ 'V', 'I', 'E', 'X',
+ 'V', 'I', 'N', 'E',
+ 'V', 'O', 'I', 'D',
+ 'V', 'U', 'R', 'X',
+ 'V', 'Y', 'R', 'X',
+ 'W', 'A', 'E', 'N',
+ 'W', 'A', 'L', 'K',
+ 'W', 'A', 'L', 'L',
+ 'W', 'A', 'V', 'E',
+ 'W', 'A', 'V', 'Y',
+ 'W', 'E', 'E', 'N',
+ 'W', 'E', 'L', 'L',
+ 'W', 'E', 'S', 'T',
+ 'W', 'I', 'D', 'E',
+ 'W', 'I', 'N', 'D',
+ 'W', 'I', 'N', 'E',
+ 'W', 'I', 'T', 'H',
+ 'W', 'O', 'O', 'D',
+ 'W', 'O', 'O', 'L',
+ 'W', 'O', 'O', 'N',
+ 'W', 'O', 'R', 'D',
+ 'W', 'O', 'R', 'K',
+ 'W', 'R', 'A', 'P',
+ 'W', 'U', 'O', 'P',
+ 'W', 'U', 'O', 'X',
+ 'W', 'Y', 'N', 'N',
+ 'X', 'I', 'E', 'P',
+ 'X', 'I', 'E', 'T',
+ 'X', 'I', 'E', 'X',
+ 'X', 'U', 'O', 'X',
+ 'X', 'W', 'A', 'A',
+ 'X', 'W', 'E', 'E',
+ 'X', 'Y', 'A', 'A',
+ 'X', 'Y', 'E', 'E',
+ 'X', 'Y', 'R', 'X',
+ 'Y', 'A', '-', 'O',
+ 'Y', 'A', 'A', 'I',
+ 'Y', 'A', 'B', 'H',
+ 'Y', 'A', 'C', 'H',
+ 'Y', 'A', 'D', 'D',
+ 'Y', 'A', 'D', 'H',
+ 'Y', 'A', 'G', 'H',
+ 'Y', 'A', 'G', 'N',
+ 'Y', 'A', 'H', 'H',
+ 'Y', 'A', 'K', 'H',
+ 'Y', 'A', 'N', 'G',
+ 'Y', 'A', 'R', 'R',
+ 'Y', 'A', 'S', 'H',
+ 'Y', 'A', 'S', 'S',
+ 'Y', 'A', 'T', 'H',
+ 'Y', 'A', 'T', 'I',
+ 'Y', 'A', 'T', 'T',
+ 'Y', 'A', 'Z', 'H',
+ 'Y', 'A', 'Z', 'Z',
+ 'Y', 'E', 'A', 'R',
+ 'Y', 'E', 'R', 'I',
+ 'Y', 'E', 'R', 'U',
+ 'Y', 'F', 'E', 'N',
+ 'Y', 'I', '-', 'U',
+ 'Y', 'I', 'E', 'P',
+ 'Y', 'I', 'E', 'T',
+ 'Y', 'I', 'E', 'X',
+ 'Y', 'I', 'N', 'G',
+ 'Y', 'I', 'W', 'N',
+ 'Y', 'O', '-', 'I',
+ 'Y', 'O', '-', 'O',
+ 'Y', 'O', 'G', 'H',
+ 'Y', 'O', 'M', 'O',
+ 'Y', 'O', 'R', 'I',
+ 'Y', 'U', '-', 'A',
+ 'Y', 'U', '-', 'E',
+ 'Y', 'U', '-', 'I',
+ 'Y', 'U', '-', 'U',
+ 'Y', 'U', 'A', 'N',
+ 'Y', 'U', 'D', 'H',
+ 'Y', 'U', 'O', 'P',
+ 'Y', 'U', 'O', 'T',
+ 'Y', 'U', 'O', 'X',
+ 'Y', 'U', 'R', 'X',
+ 'Y', 'W', 'A', 'A',
+ 'Y', 'W', 'I', 'I',
+ 'Y', 'W', 'O', 'O',
+ 'Y', 'Y', 'R', 'X',
+ 'Z', 'A', 'I', 'N',
+ 'Z', 'A', 'M', 'X',
+ 'Z', 'A', 'T', 'A',
+ 'Z', 'E', 'R', 'O',
+ 'Z', 'E', 'T', 'A',
+ 'Z', 'H', 'A', 'A',
+ 'Z', 'H', 'A', 'P',
+ 'Z', 'H', 'A', 'R',
+ 'Z', 'H', 'A', 'T',
+ 'Z', 'H', 'A', 'X',
+ 'Z', 'H', 'E', 'E',
+ 'Z', 'H', 'E', 'P',
+ 'Z', 'H', 'E', 'T',
+ 'Z', 'H', 'E', 'X',
+ 'Z', 'H', 'O', 'O',
+ 'Z', 'H', 'O', 'P',
+ 'Z', 'H', 'O', 'T',
+ 'Z', 'H', 'O', 'X',
+ 'Z', 'H', 'U', 'O',
+ 'Z', 'H', 'U', 'P',
+ 'Z', 'H', 'U', 'R',
+ 'Z', 'H', 'U', 'T',
+ 'Z', 'H', 'U', 'X',
+ 'Z', 'H', 'W', 'A',
+ 'Z', 'H', 'W', 'E',
+ 'Z', 'H', 'Y', 'P',
+ 'Z', 'H', 'Y', 'R',
+ 'Z', 'H', 'Y', 'T',
+ 'Z', 'H', 'Y', 'X',
+ 'Z', 'I', 'D', 'A',
+ 'Z', 'I', 'E', 'P',
+ 'Z', 'I', 'E', 'X',
+ 'Z', 'I', 'Z', '2',
+ 'Z', 'U', 'O', 'P',
+ 'Z', 'U', 'O', 'X',
+ 'Z', 'U', 'R', 'X',
+ 'Z', 'Y', 'R', 'X',
+ 'Z', 'Z', 'A', 'A',
+ 'Z', 'Z', 'A', 'P',
+ 'Z', 'Z', 'A', 'T',
+ 'Z', 'Z', 'A', 'X',
+ 'Z', 'Z', 'E', 'E',
+ 'Z', 'Z', 'E', 'P',
+ 'Z', 'Z', 'E', 'X',
+ 'Z', 'Z', 'I', 'E',
+ 'Z', 'Z', 'I', 'P',
+ 'Z', 'Z', 'I', 'T',
+ 'Z', 'Z', 'I', 'X',
+ 'Z', 'Z', 'O', 'P',
+ 'Z', 'Z', 'O', 'X',
+ 'Z', 'Z', 'U', 'P',
+ 'Z', 'Z', 'U', 'R',
+ 'Z', 'Z', 'U', 'X',
+ 'Z', 'Z', 'Y', 'P',
+ 'Z', 'Z', 'Y', 'R',
+ 'Z', 'Z', 'Y', 'T',
+ 'Z', 'Z', 'Y', 'X',
+ '-', 'C', 'H', 'A', 'L',
+ '-', 'C', 'H', 'A', 'R',
+ '-', 'D', 'Z', 'U', 'D',
+ '-', 'P', 'H', 'R', 'U',
+ 'A', 'B', 'O', 'V', 'E',
+ 'A', 'C', 'U', 'T', 'E',
+ 'A', 'D', 'D', 'A', 'K',
+ 'A', 'F', 'T', 'E', 'R',
+ 'A', 'G', 'A', 'I', 'N',
+ 'A', 'G', 'O', 'G', 'I',
+ 'A', 'H', 'S', 'D', 'A',
+ 'A', 'K', 'A', 'R', 'A',
+ 'A', 'K', 'B', 'A', 'R',
+ 'A', 'L', 'A', 'P', 'H',
+ 'A', 'L', 'E', 'P', 'H',
+ 'A', 'L', 'E', 'U', 'T',
+ 'A', 'L', 'G', 'I', 'Z',
+ 'A', 'L', 'I', 'F', 'U',
+ 'A', 'L', 'L', 'A', 'H',
+ 'A', 'L', 'P', 'H', 'A',
+ 'A', 'N', 'G', 'L', 'E',
+ 'A', 'N', 'P', 'E', 'A',
+ 'A', 'N', 'S', 'H', 'E',
+ 'A', 'N', 'S', 'U', 'Z',
+ 'A', 'P', 'A', 'R', 'T',
+ 'A', 'P', 'E', 'S', 'O',
+ 'A', 'P', 'R', 'I', 'L',
+ 'A', 'R', 'A', 'E', 'A',
+ 'A', 'R', 'E', 'P', 'A',
+ 'A', 'R', 'G', 'O', 'N',
+ 'A', 'R', 'I', 'E', 'S',
+ 'A', 'R', 'K', 'A', 'B',
+ 'A', 'R', 'R', 'A', 'Y',
+ 'A', 'R', 'R', 'O', 'W',
+ 'A', 'S', 'A', 'L', '2',
+ 'A', 'T', 'N', 'A', 'H',
+ 'A', 'T', 'T', 'A', 'K',
+ 'A', 'T', 'T', 'I', 'C',
+ 'B', '1', '0', '5', 'F',
+ 'B', '1', '0', '5', 'M',
+ 'B', '1', '0', '6', 'F',
+ 'B', '1', '0', '6', 'M',
+ 'B', '1', '0', '7', 'F',
+ 'B', '1', '0', '7', 'M',
+ 'B', '1', '0', '8', 'F',
+ 'B', '1', '0', '8', 'M',
+ 'B', '1', '0', '9', 'F',
+ 'B', '1', '0', '9', 'M',
+ 'B', 'A', 'L', 'A', 'G',
+ 'B', 'A', 'R', 'A', '2',
+ 'B', 'A', 'S', 'S', 'A',
+ 'B', 'B', 'I', 'E', 'P',
+ 'B', 'B', 'I', 'E', 'T',
+ 'B', 'B', 'I', 'E', 'X',
+ 'B', 'B', 'U', 'O', 'P',
+ 'B', 'B', 'U', 'O', 'X',
+ 'B', 'B', 'U', 'R', 'X',
+ 'B', 'E', 'E', 'T', 'A',
+ 'B', 'E', 'G', 'I', 'N',
+ 'B', 'E', 'H', 'E', 'H',
+ 'B', 'E', 'I', 'T', 'H',
+ 'B', 'E', 'L', 'O', 'W',
+ 'B', 'E', 'N', 'D', 'E',
+ 'B', 'E', 'O', 'R', 'C',
+ 'B', 'H', 'E', 'T', 'H',
+ 'B', 'I', 'N', 'D', 'I',
+ 'B', 'I', 'R', 'G', 'A',
+ 'B', 'I', 'S', 'A', 'H',
+ 'B', 'L', 'A', 'C', 'K',
+ 'B', 'L', 'A', 'D', 'E',
+ 'B', 'L', 'A', 'N', 'K',
+ 'B', 'L', 'O', 'C', 'K',
+ 'B', 'L', 'O', 'O', 'D',
+ 'B', 'R', 'A', 'C', 'E',
+ 'B', 'R', 'E', 'V', 'E',
+ 'B', 'R', 'O', 'A', 'D',
+ 'B', 'R', 'U', 'S', 'H',
+ 'B', 'S', 'D', 'U', 'S',
+ 'B', 'S', 'K', 'A', '-',
+ 'B', 'S', 'K', 'U', 'R',
+ 'B', 'S', 'T', 'A', 'R',
+ 'B', 'U', 'H', 'I', 'D',
+ 'B', 'U', 'L', 'L', 'S',
+ 'B', 'U', 'L', 'U', 'G',
+ 'B', 'U', 'M', 'P', 'Y',
+ 'B', 'Z', 'U', 'N', 'G',
+ 'C', 'A', 'L', 'Y', 'A',
+ 'C', 'A', 'R', 'E', 'T',
+ 'C', 'A', 'R', 'I', 'K',
+ 'C', 'A', 'R', 'O', 'N',
+ 'C', 'A', 'U', 'D', 'A',
+ 'C', 'C', 'H', 'A', 'A',
+ 'C', 'C', 'H', 'E', 'E',
+ 'C', 'E', 'A', 'L', 'C',
+ 'C', 'E', 'C', 'E', 'K',
+ 'C', 'E', 'I', 'R', 'T',
+ 'C', 'E', 'R', 'E', 'S',
+ 'C', 'H', 'A', 'D', 'A',
+ 'C', 'H', 'A', 'I', 'R',
+ 'C', 'H', 'A', 'N', 'G',
+ 'C', 'H', 'E', 'C', 'K',
+ 'C', 'H', 'E', 'S', 'S',
+ 'C', 'H', 'I', 'K', 'I',
+ 'C', 'H', 'I', 'L', 'D',
+ 'C', 'H', 'I', 'N', 'G',
+ 'C', 'H', 'O', 'K', 'E',
+ 'C', 'H', 'R', 'O', 'A',
+ 'C', 'H', 'U', 'L', 'A',
+ 'C', 'H', 'U', 'O', 'P',
+ 'C', 'H', 'U', 'O', 'T',
+ 'C', 'H', 'U', 'O', 'X',
+ 'C', 'H', 'U', 'R', 'X',
+ 'C', 'H', 'Y', 'R', 'X',
+ 'C', 'I', 'E', 'U', 'C',
+ 'C', 'L', 'E', 'A', 'R',
+ 'C', 'L', 'I', 'C', 'K',
+ 'C', 'L', 'I', 'F', 'F',
+ 'C', 'L', 'O', 'S', 'E',
+ 'C', 'L', 'O', 'T', 'H',
+ 'C', 'L', 'O', 'U', 'D',
+ 'C', 'O', 'E', 'N', 'G',
+ 'C', 'O', 'L', 'O', 'N',
+ 'C', 'O', 'L', 'O', 'R',
+ 'C', 'O', 'M', 'E', 'T',
+ 'C', 'O', 'M', 'M', 'A',
+ 'C', 'O', 'V', 'E', 'R',
+ 'C', 'R', 'O', 'I', 'X',
+ 'C', 'R', 'O', 'S', 'S',
+ 'C', 'U', 'B', 'E', 'D',
+ 'C', 'U', 'R', 'L', 'Y',
+ 'C', 'U', 'R', 'V', 'E',
+ 'D', 'A', 'A', 'S', 'U',
+ 'D', 'A', 'E', 'N', 'G',
+ 'D', 'A', 'G', 'A', 'Z',
+ 'D', 'A', 'H', 'A', 'L',
+ 'D', 'A', 'I', 'N', 'G',
+ 'D', 'A', 'L', 'D', 'A',
+ 'D', 'A', 'L', 'E', 'T',
+ 'D', 'A', 'M', 'M', 'A',
+ 'D', 'A', 'N', 'D', 'A',
+ 'D', 'A', 'R', 'A', '3',
+ 'D', 'A', 'R', 'A', '4',
+ 'D', 'A', 'R', 'G', 'A',
+ 'D', 'A', 'S', 'I', 'A',
+ 'D', 'A', 'V', 'I', 'D',
+ 'D', 'D', 'D', 'H', 'A',
+ 'D', 'D', 'I', 'E', 'P',
+ 'D', 'D', 'I', 'E', 'X',
+ 'D', 'D', 'U', 'O', 'P',
+ 'D', 'D', 'U', 'O', 'X',
+ 'D', 'D', 'U', 'R', 'X',
+ 'D', 'E', 'A', 'T', 'H',
+ 'D', 'E', 'B', 'I', 'T',
+ 'D', 'E', 'L', 'T', 'A',
+ 'D', 'E', 'R', 'E', 'T',
+ 'D', 'E', 'U', 'N', 'G',
+ 'D', 'E', 'X', 'I', 'A',
+ 'D', 'H', 'H', 'E', 'E',
+ 'D', 'H', 'H', 'O', 'O',
+ 'D', 'I', 'F', 'A', 'T',
+ 'D', 'I', 'G', 'I', 'T',
+ 'D', 'I', 'P', 'L', 'I',
+ 'D', 'I', 'P', 'T', 'E',
+ 'D', 'I', 'T', 'T', 'O',
+ 'D', 'J', 'E', 'R', 'V',
+ 'D', 'O', 'B', 'R', 'O',
+ 'D', 'O', 'O', 'N', 'G',
+ 'D', 'O', 'U', 'B', 'T',
+ 'D', 'R', 'I', 'V', 'E',
+ 'D', 'R', 'O', 'P', 'S',
+ 'D', 'U', 'G', 'U', 'D',
+ 'D', 'Z', 'E', 'L', 'O',
+ 'E', 'A', 'G', 'L', 'E',
+ 'E', 'A', 'R', 'L', 'Y',
+ 'E', 'A', 'R', 'T', 'H',
+ 'E', 'E', 'K', 'A', 'A',
+ 'E', 'H', 'W', 'A', 'Z',
+ 'E', 'I', 'G', 'H', 'T',
+ 'E', 'J', 'E', 'C', 'T',
+ 'E', 'K', 'A', 'R', 'A',
+ 'E', 'L', 'I', 'F', 'I',
+ 'E', 'M', 'P', 'T', 'Y',
+ 'E', 'N', 'D', 'E', 'P',
+ 'E', 'N', 'T', 'E', 'R',
+ 'E', 'O', '-', 'E', 'U',
+ 'E', 'O', 'L', 'H', 'X',
+ 'E', 'Q', 'U', 'A', 'L',
+ 'E', 'Q', 'U', 'I', 'D',
+ 'E', 'R', 'A', 'S', 'E',
+ 'E', 'R', 'I', 'N', '2',
+ 'E', 'S', '-', 'T', 'E',
+ 'E', 'S', 'A', 'S', 'A',
+ 'E', 'S', 'H', '1', '6',
+ 'E', 'S', 'H', '2', '1',
+ 'E', 'S', 'H', 'E', '3',
+ 'E', 'T', 'H', 'E', 'L',
+ 'E', 'U', '-', 'E', 'U',
+ 'E', 'U', 'L', 'E', 'R',
+ 'E', 'X', 'I', 'S', 'T',
+ 'F', 'A', 'A', 'F', 'U',
+ 'F', 'A', 'I', 'H', 'U',
+ 'F', 'A', 'R', 'S', 'I',
+ 'F', 'A', 'T', 'H', 'A',
+ 'F', 'E', 'A', 'R', 'N',
+ 'F', 'E', 'E', 'N', 'G',
+ 'F', 'E', 'N', 'C', 'E',
+ 'F', 'I', 'E', 'L', 'D',
+ 'F', 'I', 'F', 'T', 'H',
+ 'F', 'I', 'F', 'T', 'Y',
+ 'F', 'I', 'G', 'H', 'T',
+ 'F', 'I', 'N', 'A', 'L',
+ 'F', 'I', 'R', 'S', 'T',
+ 'F', 'L', 'O', 'O', 'R',
+ 'F', 'L', 'U', 'T', 'E',
+ 'F', 'O', 'L', 'L', 'Y',
+ 'F', 'O', 'R', 'C', 'E',
+ 'F', 'O', 'R', 'M', 'S',
+ 'F', 'O', 'R', 'T', 'E',
+ 'F', 'O', 'R', 'T', 'Y',
+ 'F', 'R', 'A', 'M', 'E',
+ 'F', 'R', 'A', 'N', 'C',
+ 'F', 'R', 'I', 'T', 'U',
+ 'F', 'R', 'O', 'W', 'N',
+ 'G', 'A', 'A', 'F', 'U',
+ 'G', 'A', 'D', 'O', 'L',
+ 'G', 'A', 'L', 'A', 'M',
+ 'G', 'A', 'M', 'A', 'L',
+ 'G', 'A', 'M', 'L', 'A',
+ 'G', 'A', 'M', 'M', 'A',
+ 'G', 'A', 'N', 'M', 'A',
+ 'G', 'A', 'R', 'O', 'N',
+ 'G', 'E', 'S', 'H', '2',
+ 'G', 'E', 'S', 'H', 'U',
+ 'G', 'G', 'I', 'E', 'P',
+ 'G', 'G', 'I', 'E', 'X',
+ 'G', 'G', 'U', 'O', 'P',
+ 'G', 'G', 'U', 'O', 'T',
+ 'G', 'G', 'U', 'O', 'X',
+ 'G', 'G', 'U', 'R', 'X',
+ 'G', 'G', 'W', 'A', 'A',
+ 'G', 'G', 'W', 'E', 'E',
+ 'G', 'H', 'A', 'I', 'N',
+ 'G', 'H', 'O', 'S', 'T',
+ 'G', 'I', 'D', 'I', 'M',
+ 'G', 'I', 'M', 'E', 'L',
+ 'G', 'I', 'N', 'I', 'I',
+ 'G', 'I', 'S', 'A', 'L',
+ 'G', 'N', 'Y', 'I', 'S',
+ 'G', 'O', 'I', 'N', 'G',
+ 'G', 'O', 'R', 'G', 'I',
+ 'G', 'R', 'A', 'C', 'E',
+ 'G', 'R', 'A', 'I', 'N',
+ 'G', 'R', 'A', 'S', 'S',
+ 'G', 'R', 'A', 'V', 'E',
+ 'G', 'R', 'E', 'A', 'T',
+ 'G', 'R', 'E', 'E', 'K',
+ 'G', 'R', 'E', 'E', 'N',
+ 'G', 'R', 'O', 'U', 'P',
+ 'G', 'U', 'R', 'U', 'N',
+ 'H', 'A', '-', 'H', 'A',
+ 'H', 'A', 'A', 'R', 'U',
+ 'H', 'A', 'E', 'G', 'L',
+ 'H', 'A', 'I', 'T', 'U',
+ 'H', 'A', 'M', 'Z', 'A',
+ 'H', 'A', 'N', 'D', 'S',
+ 'H', 'A', 'S', 'E', 'R',
+ 'H', 'A', 'T', 'A', 'F',
+ 'H', 'A', 'T', 'H', 'I',
+ 'H', 'B', 'A', 'S', 'A',
+ 'H', 'E', 'A', 'R', 'T',
+ 'H', 'E', 'A', 'V', 'Y',
+ 'H', 'I', 'D', 'E', 'T',
+ 'H', 'I', 'E', 'U', 'H',
+ 'H', 'I', 'R', 'I', 'Q',
+ 'H', 'L', 'I', 'E', 'P',
+ 'H', 'L', 'I', 'E', 'X',
+ 'H', 'L', 'U', 'O', 'P',
+ 'H', 'L', 'U', 'O', 'X',
+ 'H', 'L', 'U', 'R', 'X',
+ 'H', 'L', 'Y', 'R', 'X',
+ 'H', 'M', 'I', 'E', 'P',
+ 'H', 'M', 'I', 'E', 'X',
+ 'H', 'M', 'U', 'O', 'P',
+ 'H', 'M', 'U', 'O', 'X',
+ 'H', 'M', 'U', 'R', 'X',
+ 'H', 'M', 'Y', 'R', 'X',
+ 'H', 'N', 'I', 'E', 'P',
+ 'H', 'N', 'I', 'E', 'T',
+ 'H', 'N', 'I', 'E', 'X',
+ 'H', 'N', 'U', 'O', 'X',
+ 'H', 'O', 'L', 'A', 'M',
+ 'H', 'O', 'O', 'R', 'U',
+ 'H', 'O', 'R', 'S', 'E',
+ 'H', 'O', 'U', 'S', 'E',
+ 'H', 'U', 'M', 'A', 'N',
+ 'H', 'U', 'R', 'A', 'N',
+ 'H', 'W', 'A', 'I', 'R',
+ 'H', 'X', 'I', 'E', 'P',
+ 'H', 'X', 'I', 'E', 'T',
+ 'H', 'X', 'I', 'E', 'X',
+ 'H', 'X', 'U', 'O', 'P',
+ 'H', 'X', 'U', 'O', 'T',
+ 'H', 'X', 'U', 'O', 'X',
+ 'H', 'Z', 'Z', 'Z', 'G',
+ 'I', 'A', 'U', 'D', 'A',
+ 'I', 'C', 'H', 'O', 'S',
+ 'I', 'C', 'H', 'O', 'U',
+ 'I', 'E', 'U', 'N', 'G',
+ 'I', 'G', 'G', 'W', 'S',
+ 'I', 'K', 'A', 'R', 'A',
+ 'I', 'M', 'A', 'G', 'E',
+ 'I', 'M', 'I', 'N', '3',
+ 'I', 'N', 'D', 'E', 'X',
+ 'I', 'N', 'N', 'E', 'R',
+ 'J', 'E', 'R', 'A', 'N',
+ 'J', 'J', 'I', 'E', 'P',
+ 'J', 'J', 'I', 'E', 'T',
+ 'J', 'J', 'I', 'E', 'X',
+ 'J', 'J', 'U', 'O', 'P',
+ 'J', 'J', 'U', 'O', 'X',
+ 'J', 'J', 'U', 'R', 'X',
+ 'J', 'O', 'K', 'E', 'R',
+ 'J', 'U', 'D', 'G', 'E',
+ 'J', 'U', 'E', 'U', 'I',
+ 'K', 'A', 'A', 'F', 'U',
+ 'K', 'A', 'I', 'R', 'I',
+ 'K', 'A', 'P', 'A', 'L',
+ 'K', 'A', 'P', 'P', 'A',
+ 'K', 'A', 'R', 'E', 'N',
+ 'K', 'A', 'S', 'R', 'A',
+ 'K', 'A', 'U', 'N', 'A',
+ 'K', 'A', 'Y', 'A', 'H',
+ 'K', 'E', 'E', 'N', 'G',
+ 'K', 'E', 'E', 'S', 'U',
+ 'K', 'E', 'H', 'E', 'H',
+ 'K', 'E', 'N', 'A', 'T',
+ 'K', 'E', 'S', 'H', '2',
+ 'K', 'E', 'T', 'T', 'I',
+ 'K', 'H', 'A', 'N', 'G',
+ 'K', 'H', 'A', 'P', 'H',
+ 'K', 'H', 'M', 'E', 'R',
+ 'K', 'H', 'U', 'A', 'T',
+ 'K', 'H', 'W', 'A', 'I',
+ 'K', 'I', 'S', 'A', 'L',
+ 'K', 'N', 'I', 'F', 'E',
+ 'K', 'O', 'M', 'B', 'U',
+ 'K', 'O', 'O', 'P', 'O',
+ 'K', 'O', 'P', 'P', 'A',
+ 'K', 'U', 'S', 'M', 'A',
+ 'K', 'X', 'W', 'A', 'A',
+ 'K', 'X', 'W', 'E', 'E',
+ 'L', 'A', 'A', 'M', 'U',
+ 'L', 'A', 'B', 'O', 'R',
+ 'L', 'A', 'G', 'A', 'B',
+ 'L', 'A', 'G', 'A', 'R',
+ 'L', 'A', 'G', 'U', 'S',
+ 'L', 'A', 'M', 'D', 'A',
+ 'L', 'A', 'M', 'E', 'D',
+ 'L', 'A', 'R', 'G', 'E',
+ 'L', 'A', 'T', 'I', 'K',
+ 'L', 'A', 'T', 'I', 'N',
+ 'L', 'A', 'U', 'L', 'A',
+ 'L', 'E', 'M', 'O', 'I',
+ 'L', 'E', 'N', 'G', 'A',
+ 'L', 'E', 'V', 'E', 'L',
+ 'L', 'I', 'B', 'R', 'A',
+ 'L', 'I', 'G', 'H', 'T',
+ 'L', 'I', 'M', 'B', 'U',
+ 'L', 'I', 'M', 'I', 'T',
+ 'L', 'I', 'M', 'M', 'U',
+ 'L', 'I', 'N', 'E', 'S',
+ 'L', 'I', 'T', 'R', 'A',
+ 'L', 'O', 'N', 'G', 'A',
+ 'L', 'O', 'T', 'U', 'S',
+ 'L', 'O', 'U', 'R', 'E',
+ 'L', 'O', 'W', '-', '9',
+ 'L', 'O', 'W', 'E', 'R',
+ 'L', 'U', 'G', 'A', 'L',
+ 'M', 'A', 'D', 'D', 'A',
+ 'M', 'A', 'H', 'H', 'A',
+ 'M', 'A', 'I', 'R', 'U',
+ 'M', 'A', 'N', 'N', 'A',
+ 'M', 'A', 'P', 'I', 'Q',
+ 'M', 'A', 'Q', 'A', 'F',
+ 'M', 'A', 'R', 'C', 'H',
+ 'M', 'A', 'S', 'H', '2',
+ 'M', 'E', 'E', 'M', 'U',
+ 'M', 'E', 'I', 'Z', 'I',
+ 'M', 'E', 'L', 'O', 'N',
+ 'M', 'E', 'T', 'A', 'L',
+ 'M', 'E', 'T', 'E', 'G',
+ 'M', 'E', 'Z', 'Z', 'O',
+ 'M', 'G', 'B', 'E', 'E',
+ 'M', 'G', 'B', 'O', 'O',
+ 'M', 'G', 'I', 'E', 'X',
+ 'M', 'G', 'U', 'O', 'P',
+ 'M', 'G', 'U', 'O', 'X',
+ 'M', 'G', 'U', 'R', 'X',
+ 'M', 'I', 'C', 'R', 'O',
+ 'M', 'I', 'E', 'U', 'M',
+ 'M', 'I', 'K', 'R', 'I',
+ 'M', 'I', 'L', 'L', 'E',
+ 'M', 'I', 'N', 'U', 'S',
+ 'M', 'I', 'R', 'E', 'D',
+ 'M', 'I', 'S', 'R', 'A',
+ 'M', 'N', 'Y', 'A', 'M',
+ 'M', 'O', 'D', 'E', 'L',
+ 'M', 'O', 'N', 'T', 'H',
+ 'M', 'O', 'U', 'N', 'D',
+ 'M', 'O', 'U', 'T', 'H',
+ 'M', 'O', 'V', 'E', 'D',
+ 'M', 'U', 'L', 'T', 'I',
+ 'M', 'U', 'N', 'A', 'H',
+ 'M', 'U', 'R', 'D', 'A',
+ 'M', 'U', 'S', 'H', '3',
+ 'M', 'U', 'S', 'I', 'C',
+ 'N', '-', 'A', 'R', 'Y',
+ 'N', 'A', 'B', 'L', 'A',
+ 'N', 'A', 'G', 'A', 'R',
+ 'N', 'A', 'G', 'R', 'I',
+ 'N', 'A', 'I', 'R', 'A',
+ 'N', 'A', 'S', 'H', 'I',
+ 'N', 'B', 'I', 'E', 'P',
+ 'N', 'B', 'I', 'E', 'X',
+ 'N', 'B', 'U', 'R', 'X',
+ 'N', 'B', 'Y', 'R', 'X',
+ 'N', 'D', 'I', 'E', 'X',
+ 'N', 'D', 'O', 'L', 'E',
+ 'N', 'D', 'U', 'R', 'X',
+ 'N', 'G', 'A', 'A', 'I',
+ 'N', 'G', 'G', 'E', 'E',
+ 'N', 'G', 'G', 'E', 'N',
+ 'N', 'G', 'G', 'O', 'O',
+ 'N', 'G', 'I', 'E', 'P',
+ 'N', 'G', 'I', 'E', 'X',
+ 'N', 'G', 'O', 'E', 'H',
+ 'N', 'G', 'U', 'O', 'T',
+ 'N', 'G', 'U', 'O', 'X',
+ 'N', 'I', 'E', 'U', 'N',
+ 'N', 'I', 'G', 'H', 'T',
+ 'N', 'I', 'S', 'A', 'G',
+ 'N', 'J', 'I', 'E', 'P',
+ 'N', 'J', 'I', 'E', 'T',
+ 'N', 'J', 'I', 'E', 'X',
+ 'N', 'J', 'U', 'O', 'X',
+ 'N', 'J', 'U', 'R', 'X',
+ 'N', 'J', 'Y', 'R', 'X',
+ 'N', 'N', 'G', 'A', 'A',
+ 'N', 'N', 'G', 'I', 'I',
+ 'N', 'N', 'G', 'O', 'O',
+ 'N', 'O', 'O', 'N', 'U',
+ 'N', 'O', 'R', 'T', 'H',
+ 'N', 'O', 'T', 'C', 'H',
+ 'N', 'O', 'T', 'E', 'S',
+ 'N', 'O', 'T', 'T', 'O',
+ 'N', 'R', 'U', 'R', 'X',
+ 'N', 'R', 'Y', 'R', 'X',
+ 'N', 'U', 'K', 'T', 'A',
+ 'N', 'U', 'N', 'U', 'Z',
+ 'N', 'Y', 'I', 'E', 'P',
+ 'N', 'Y', 'I', 'E', 'T',
+ 'N', 'Y', 'I', 'E', 'X',
+ 'N', 'Y', 'U', 'O', 'P',
+ 'N', 'Y', 'U', 'O', 'X',
+ 'N', 'Z', 'I', 'E', 'P',
+ 'N', 'Z', 'I', 'E', 'X',
+ 'N', 'Z', 'U', 'O', 'X',
+ 'N', 'Z', 'U', 'R', 'X',
+ 'N', 'Z', 'Y', 'R', 'X',
+ 'O', 'B', 'O', 'L', 'S',
+ 'O', 'G', 'H', 'A', 'M',
+ 'O', 'J', 'E', 'O', 'N',
+ 'O', 'K', 'A', 'R', 'A',
+ 'O', 'L', 'I', 'V', 'E',
+ 'O', 'M', 'E', 'G', 'A',
+ 'O', 'N', 'K', 'A', 'R',
+ 'O', 'R', 'I', 'Y', 'A',
+ 'O', 'T', 'H', 'A', 'L',
+ 'O', 'U', 'N', 'C', 'E',
+ 'O', 'U', 'T', 'E', 'R',
+ 'O', 'X', 'E', 'I', 'A',
+ 'P', 'A', 'A', 'T', 'U',
+ 'P', 'A', 'D', 'M', 'A',
+ 'P', 'A', 'N', 'T', 'I',
+ 'P', 'A', 'P', 'E', 'R',
+ 'P', 'A', 'S', 'E', 'Q',
+ 'P', 'A', 'S', 'U', 'Q',
+ 'P', 'A', 'T', 'A', 'H',
+ 'P', 'A', 'T', 'A', 'K',
+ 'P', 'A', 'Z', 'E', 'R',
+ 'P', 'E', 'A', 'C', 'E',
+ 'P', 'E', 'D', 'A', 'L',
+ 'P', 'E', 'E', 'Z', 'I',
+ 'P', 'E', 'H', 'E', 'H',
+ 'P', 'E', 'I', 'T', 'H',
+ 'P', 'E', 'N', 'N', 'Y',
+ 'P', 'E', 'N', 'S', 'U',
+ 'P', 'E', 'P', 'E', 'T',
+ 'P', 'E', 'S', 'H', '2',
+ 'P', 'H', 'U', 'N', 'G',
+ 'P', 'I', 'A', 'N', 'O',
+ 'P', 'I', 'E', 'C', 'E',
+ 'P', 'I', 'E', 'U', 'P',
+ 'P', 'I', 'R', 'I', 'G',
+ 'P', 'L', 'A', 'C', 'E',
+ 'P', 'L', 'A', 'N', 'E',
+ 'P', 'L', 'U', 'T', 'O',
+ 'P', 'O', 'I', 'N', 'T',
+ 'P', 'O', 'N', 'D', 'O',
+ 'P', 'O', 'U', 'N', 'D',
+ 'P', 'O', 'W', 'E', 'R',
+ 'P', 'R', 'I', 'M', 'E',
+ 'P', 'R', 'I', 'N', 'T',
+ 'P', 'R', 'O', 'O', 'F',
+ 'P', 'R', 'O', 'V', 'E',
+ 'P', 'S', 'I', 'L', 'I',
+ 'Q', 'A', 'A', 'F', 'U',
+ 'Q', 'A', 'D', 'M', 'A',
+ 'Q', 'A', 'T', 'A', 'N',
+ 'Q', 'H', 'W', 'A', 'A',
+ 'Q', 'H', 'W', 'E', 'E',
+ 'Q', 'U', 'E', 'E', 'N',
+ 'Q', 'U', 'I', 'L', 'L',
+ 'Q', 'U', 'O', 'T', 'E',
+ 'R', 'A', 'I', 'D', 'A',
+ 'R', 'A', 'I', 'D', 'O',
+ 'R', 'A', 'N', 'G', 'E',
+ 'R', 'A', 'S', 'H', 'A',
+ 'R', 'A', 'T', 'I', 'O',
+ 'R', 'B', 'A', 'S', 'A',
+ 'R', 'E', 'A', 'C', 'H',
+ 'R', 'E', 'L', 'A', 'A',
+ 'R', 'E', 'V', 'I', 'A',
+ 'R', 'E', 'V', 'M', 'A',
+ 'R', 'G', 'Y', 'A', 'N',
+ 'R', 'I', 'C', 'E', 'M',
+ 'R', 'I', 'E', 'U', 'L',
+ 'R', 'I', 'G', 'H', 'T',
+ 'R', 'I', 'T', 'S', 'I',
+ 'R', 'I', 'V', 'E', 'R',
+ 'R', 'N', 'O', 'O', 'N',
+ 'R', 'O', 'B', 'A', 'T',
+ 'R', 'O', 'M', 'A', 'N',
+ 'R', 'O', 'U', 'N', 'D',
+ 'R', 'R', 'U', 'O', 'X',
+ 'R', 'R', 'U', 'R', 'X',
+ 'R', 'R', 'Y', 'R', 'X',
+ 'R', 'T', 'A', 'G', 'S',
+ 'R', 'U', 'M', 'A', 'I',
+ 'R', 'U', 'N', 'I', 'C',
+ 'R', 'U', 'P', 'E', 'E',
+ 'R', 'U', 'P', 'I', 'I',
+ 'R', 'W', 'A', 'H', 'A',
+ 'S', 'A', 'D', 'H', 'E',
+ 'S', 'A', 'F', 'H', 'A',
+ 'S', 'A', 'L', 'A', 'M',
+ 'S', 'A', 'L', 'L', 'A',
+ 'S', 'A', 'M', 'K', 'A',
+ 'S', 'A', 'M', 'P', 'I',
+ 'S', 'A', 'N', 'A', 'H',
+ 'S', 'A', 'S', 'A', 'K',
+ 'S', 'A', 'U', 'I', 'L',
+ 'S', 'B', 'R', 'U', 'L',
+ 'S', 'C', 'H', 'W', 'A',
+ 'S', 'D', 'O', 'N', 'G',
+ 'S', 'E', 'E', 'N', 'U',
+ 'S', 'E', 'G', 'N', 'O',
+ 'S', 'E', 'G', 'O', 'L',
+ 'S', 'E', 'N', 'T', 'I',
+ 'S', 'E', 'N', 'T', 'O',
+ 'S', 'E', 'V', 'E', 'N',
+ 'S', 'H', 'A', 'B', '6',
+ 'S', 'H', 'A', 'D', 'E',
+ 'S', 'H', 'A', 'N', 'G',
+ 'S', 'H', 'A', 'R', '2',
+ 'S', 'H', 'A', 'R', 'P',
+ 'S', 'H', 'A', 'R', 'U',
+ 'S', 'H', 'C', 'H', 'A',
+ 'S', 'H', 'E', 'E', 'N',
+ 'S', 'H', 'E', 'E', 'P',
+ 'S', 'H', 'E', 'G', '9',
+ 'S', 'H', 'E', 'L', 'F',
+ 'S', 'H', 'E', 'L', 'L',
+ 'S', 'H', 'E', 'S', 'H',
+ 'S', 'H', 'E', 'V', 'A',
+ 'S', 'H', 'I', 'F', 'T',
+ 'S', 'H', 'I', 'I', 'N',
+ 'S', 'H', 'I', 'M', 'A',
+ 'S', 'H', 'I', 'T', 'A',
+ 'S', 'H', 'O', 'G', 'I',
+ 'S', 'H', 'O', 'O', 'T',
+ 'S', 'H', 'O', 'R', 'T',
+ 'S', 'H', 'U', 'O', 'P',
+ 'S', 'H', 'U', 'O', 'X',
+ 'S', 'H', 'U', 'R', 'X',
+ 'S', 'H', 'W', 'A', 'A',
+ 'S', 'H', 'W', 'I', 'I',
+ 'S', 'H', 'W', 'O', 'O',
+ 'S', 'H', 'Y', 'R', 'X',
+ 'S', 'I', 'G', 'E', 'L',
+ 'S', 'I', 'G', 'M', 'A',
+ 'S', 'I', 'G', 'N', 'S',
+ 'S', 'I', 'L', 'A', '3',
+ 'S', 'I', 'X', 'T', 'H',
+ 'S', 'I', 'X', 'T', 'Y',
+ 'S', 'K', 'U', 'L', 'L',
+ 'S', 'L', 'A', 'S', 'H',
+ 'S', 'L', 'A', 'V', 'E',
+ 'S', 'L', 'I', 'C', 'E',
+ 'S', 'L', 'I', 'N', 'G',
+ 'S', 'L', 'O', 'P', 'E',
+ 'S', 'L', 'O', 'V', 'O',
+ 'S', 'M', 'A', 'L', 'L',
+ 'S', 'M', 'A', 'S', 'H',
+ 'S', 'M', 'E', 'A', 'R',
+ 'S', 'M', 'I', 'L', 'E',
+ 'S', 'N', 'A', 'K', 'E',
+ 'S', 'N', 'O', 'U', 'T',
+ 'S', 'O', 'U', 'N', 'D',
+ 'S', 'O', 'U', 'T', 'H',
+ 'S', 'P', 'A', 'C', 'E',
+ 'S', 'P', 'A', 'D', 'E',
+ 'S', 'P', 'E', 'A', 'R',
+ 'S', 'P', 'I', 'C', 'E',
+ 'S', 'P', 'O', 'O', 'N',
+ 'S', 'Q', 'U', 'A', 'T',
+ 'S', 'S', 'I', 'E', 'P',
+ 'S', 'S', 'I', 'E', 'X',
+ 'S', 'S', 'Y', 'R', 'X',
+ 'S', 'T', 'A', 'F', 'F',
+ 'S', 'T', 'A', 'N', 'D',
+ 'S', 'T', 'A', 'R', 'K',
+ 'S', 'T', 'A', 'R', 'T',
+ 'S', 'T', 'E', 'A', 'M',
+ 'S', 'T', 'I', 'L', 'E',
+ 'S', 'T', 'I', 'L', 'L',
+ 'S', 'T', 'O', 'C', 'K',
+ 'S', 'T', 'O', 'N', 'E',
+ 'S', 'T', 'O', 'V', 'E',
+ 'S', 'T', 'U', 'D', 'Y',
+ 'S', 'U', 'H', 'U', 'R',
+ 'S', 'U', 'K', 'U', 'N',
+ 'S', 'W', 'A', 'S', 'H',
+ 'S', 'W', 'E', 'E', 'T',
+ 'S', 'W', 'O', 'R', 'D',
+ 'S', 'W', 'U', 'N', 'G',
+ 'S', 'Y', 'R', 'M', 'A',
+ 'T', 'A', 'B', 'L', 'E',
+ 'T', 'A', 'M', 'I', 'L',
+ 'T', 'A', 'P', 'E', 'R',
+ 'T', 'C', 'H', 'E', 'H',
+ 'T', 'E', 'G', 'E', 'H',
+ 'T', 'E', 'H', 'E', 'H',
+ 'T', 'E', 'I', 'W', 'S',
+ 'T', 'E', 'V', 'I', 'R',
+ 'T', 'H', 'E', 'M', 'A',
+ 'T', 'H', 'E', 'R', 'E',
+ 'T', 'H', 'E', 'T', 'A',
+ 'T', 'H', 'I', 'G', 'H',
+ 'T', 'H', 'I', 'R', 'D',
+ 'T', 'H', 'I', 'T', 'A',
+ 'T', 'H', 'O', 'N', 'G',
+ 'T', 'H', 'O', 'R', 'N',
+ 'T', 'H', 'R', 'E', 'E',
+ 'T', 'H', 'U', 'N', 'G',
+ 'T', 'H', 'U', 'R', 'S',
+ 'T', 'H', 'W', 'A', 'A',
+ 'T', 'I', 'A', 'R', 'A',
+ 'T', 'I', 'G', 'E', 'R',
+ 'T', 'I', 'G', 'H', 'T',
+ 'T', 'I', 'L', 'D', 'E',
+ 'T', 'I', 'M', 'E', 'S',
+ 'T', 'I', 'N', 'N', 'E',
+ 'T', 'I', 'P', 'P', 'I',
+ 'T', 'I', 'T', 'L', 'O',
+ 'T', 'I', 'W', 'A', 'Z',
+ 'T', 'L', 'H', 'E', 'E',
+ 'T', 'O', 'N', 'A', 'L',
+ 'T', 'O', 'N', 'O', 'S',
+ 'T', 'O', 'O', 'T', 'H',
+ 'T', 'O', 'T', 'A', 'L',
+ 'T', 'R', 'A', 'C', 'K',
+ 'T', 'R', 'A', 'D', 'E',
+ 'T', 'R', 'I', 'O', 'N',
+ 'T', 'R', 'U', 'N', 'K',
+ 'T', 'R', 'U', 'T', 'H',
+ 'T', 'S', 'A', 'D', 'I',
+ 'T', 'S', 'E', 'R', 'E',
+ 'T', 'S', 'H', 'E', 'G',
+ 'T', 'S', 'H', 'E', 'S',
+ 'T', 'T', 'S', 'E', 'E',
+ 'T', 'T', 'T', 'H', 'A',
+ 'T', 'U', 'N', 'N', 'Y',
+ 'T', 'U', 'R', 'O', '2',
+ 'T', 'U', 'U', 'M', 'U',
+ 'U', 'D', 'A', 'A', 'T',
+ 'U', 'K', 'A', 'R', 'A',
+ 'U', 'M', 'B', 'I', 'N',
+ 'U', 'N', 'C', 'I', 'A',
+ 'U', 'N', 'D', 'E', 'R',
+ 'U', 'N', 'I', 'O', 'N',
+ 'U', 'N', 'I', 'T', 'Y',
+ 'U', 'P', 'P', 'E', 'R',
+ 'U', 'R', 'U', 'D', 'A',
+ 'U', 'S', 'S', 'U', '3',
+ 'U', 'T', 'U', 'K', 'I',
+ 'V', 'A', 'A', 'V', 'U',
+ 'V', 'A', 'R', 'I', 'A',
+ 'V', 'A', 'R', 'Y', 'S',
+ 'V', 'A', 'S', 'I', 'S',
+ 'V', 'A', 'T', 'H', 'Y',
+ 'V', 'E', 'R', 'G', 'E',
+ 'V', 'E', 'R', 'S', 'E',
+ 'V', 'E', 'S', 'T', 'A',
+ 'V', 'I', 'R', 'G', 'A',
+ 'V', 'I', 'R', 'G', 'O',
+ 'V', 'O', 'C', 'A', 'L',
+ 'V', 'O', 'W', 'E', 'L',
+ 'V', 'Z', 'M', 'E', 'T',
+ 'W', 'A', 'A', 'V', 'U',
+ 'W', 'A', 'S', 'L', 'A',
+ 'W', 'A', 'T', 'C', 'H',
+ 'W', 'A', 'T', 'E', 'R',
+ 'W', 'A', 'T', 'T', 'O',
+ 'W', 'H', 'E', 'A', 'T',
+ 'W', 'H', 'E', 'E', 'L',
+ 'W', 'H', 'I', 'T', 'E',
+ 'W', 'H', 'O', 'L', 'E',
+ 'W', 'I', 'D', 'T', 'H',
+ 'W', 'I', 'N', 'D', 'U',
+ 'W', 'I', 'N', 'J', 'A',
+ 'W', 'O', 'M', 'A', 'N',
+ 'W', 'R', 'O', 'N', 'G',
+ 'W', 'U', 'N', 'J', 'O',
+ 'X', 'I', 'R', 'O', 'N',
+ 'Y', 'A', '-', 'Y', 'O',
+ 'Y', 'A', 'A', 'D', 'O',
+ 'Y', 'A', 'A', 'R', 'U',
+ 'Y', 'A', 'D', 'D', 'H',
+ 'Y', 'A', 'G', 'H', 'H',
+ 'Y', 'A', 'K', 'H', 'H',
+ 'Y', 'E', 'O', '-', 'O',
+ 'Y', 'E', 'O', '-', 'U',
+ 'Y', 'E', 'R', 'A', 'H',
+ 'Y', 'E', 'S', 'T', 'U',
+ 'Y', 'E', 'T', 'I', 'V',
+ 'Y', 'I', 'Z', 'E', 'T',
+ 'Y', 'O', '-', 'Y', 'A',
+ 'Y', 'U', '-', 'E', 'O',
+ 'Y', 'U', '-', 'Y', 'E',
+ 'Z', 'A', 'Q', 'E', 'F',
+ 'Z', 'A', 'R', 'Q', 'A',
+ 'Z', 'A', 'Y', 'I', 'N',
+ 'Z', 'H', 'A', 'I', 'N',
+ 'Z', 'H', 'U', 'O', 'P',
+ 'Z', 'H', 'U', 'O', 'X',
+ 'Z', 'H', 'U', 'R', 'X',
+ 'Z', 'H', 'Y', 'R', 'X',
+ 'Z', 'I', 'L', 'D', 'E',
+ 'Z', 'I', 'N', 'O', 'R',
+ 'Z', 'L', 'A', 'M', 'A',
+ 'Z', 'U', 'B', 'U', 'R',
+ 'Z', 'Y', 'G', 'O', 'S',
+ 'Z', 'Z', 'I', 'E', 'P',
+ 'Z', 'Z', 'I', 'E', 'T',
+ 'Z', 'Z', 'I', 'E', 'X',
+ 'Z', 'Z', 'U', 'R', 'X',
+ 'Z', 'Z', 'Y', 'R', 'X',
+ '-', 'K', 'H', 'Y', 'I', 'L',
+ '-', 'K', 'H', 'Y', 'U', 'D',
+ 'A', 'C', 'C', 'E', 'N', 'T',
+ 'A', 'E', 'G', 'E', 'A', 'N',
+ 'A', 'I', 'H', 'V', 'U', 'S',
+ 'A', 'I', 'K', 'A', 'R', 'A',
+ 'A', 'L', 'A', 'Y', 'H', 'E',
+ 'A', 'L', 'M', 'O', 'S', 'T',
+ 'A', 'M', 'O', 'U', 'N', 'T',
+ 'A', 'N', 'C', 'H', 'O', 'R',
+ 'A', 'N', 'C', 'O', 'R', 'A',
+ 'A', 'P', 'A', 'A', 'T', 'O',
+ 'A', 'P', 'L', 'O', 'U', 'N',
+ 'A', 'R', 'A', 'B', 'I', 'C',
+ 'A', 'R', 'A', 'E', 'A', 'E',
+ 'A', 'R', 'L', 'A', 'U', 'G',
+ 'A', 'R', 'M', 'O', 'U', 'R',
+ 'A', 'R', 'O', 'U', 'N', 'D',
+ 'A', 'R', 'O', 'U', 'R', 'A',
+ 'A', 'R', 'R', 'I', 'V', 'E',
+ 'A', 'R', 'R', 'O', 'W', 'S',
+ 'A', 'R', 'S', 'E', 'O', 'S',
+ 'A', 'R', 'T', 'A', 'B', 'E',
+ 'A', 'R', 'U', 'H', 'U', 'A',
+ 'A', 'S', 'C', 'E', 'N', 'T',
+ 'A', 'S', 'H', 'G', 'A', 'B',
+ 'A', 'S', 'Y', 'U', 'R', 'A',
+ 'A', 'U', 'G', 'U', 'S', 'T',
+ 'A', 'U', 'T', 'U', 'M', 'N',
+ 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'B', 'A', 'D', 'G', 'E', 'R',
+ 'B', 'A', 'H', 'A', 'R', '2',
+ 'B', 'A', 'I', 'M', 'A', 'I',
+ 'B', 'A', 'L', 'L', 'O', 'T',
+ 'B', 'A', 'L', 'U', 'D', 'A',
+ 'B', 'A', 'M', 'B', 'O', 'O',
+ 'B', 'A', 'N', 'T', 'O', 'C',
+ 'B', 'A', 'R', 'L', 'E', 'Y',
+ 'B', 'A', 'R', 'R', 'E', 'D',
+ 'B', 'A', 'R', 'R', 'E', 'E',
+ 'B', 'E', 'A', 'M', 'E', 'D',
+ 'B', 'E', 'F', 'O', 'R', 'E',
+ 'B', 'E', 'R', 'B', 'E', 'R',
+ 'B', 'E', 'S', 'I', 'D', 'E',
+ 'B', 'E', 'Y', 'Y', 'A', 'L',
+ 'B', 'I', 'N', 'A', 'R', 'Y',
+ 'B', 'I', 'S', 'H', 'O', 'P',
+ 'B', 'I', 'T', 'I', 'N', 'G',
+ 'B', 'I', 'T', 'T', 'E', 'R',
+ 'B', 'O', 'R', 'U', 'T', 'O',
+ 'B', 'O', 'T', 'T', 'O', 'M',
+ 'B', 'O', 'W', 'T', 'I', 'E',
+ 'B', 'R', 'A', 'N', 'C', 'H',
+ 'B', 'R', 'E', 'A', 'T', 'H',
+ 'B', 'R', 'E', 'V', 'I', 'S',
+ 'B', 'R', 'I', 'D', 'G', 'E',
+ 'B', 'R', 'O', 'K', 'E', 'N',
+ 'B', 'R', 'O', 'N', 'Z', 'E',
+ 'B', 'U', 'C', 'K', 'L', 'E',
+ 'B', 'U', 'L', 'L', 'E', 'T',
+ 'C', 'A', 'M', 'N', 'U', 'C',
+ 'C', 'A', 'N', 'C', 'E', 'L',
+ 'C', 'A', 'N', 'C', 'E', 'R',
+ 'C', 'A', 'N', 'D', 'R', 'A',
+ 'C', 'A', 'R', 'I', 'A', 'N',
+ 'C', 'A', 'T', 'A', 'W', 'A',
+ 'C', 'E', 'N', 'T', 'R', 'E',
+ 'C', 'E', 'R', '-', 'W', 'A',
+ 'C', 'H', 'A', 'M', 'K', 'O',
+ 'C', 'H', 'A', 'N', 'G', 'E',
+ 'C', 'H', 'I', 'L', 'L', 'U',
+ 'C', 'H', 'I', 'R', 'E', 'T',
+ 'C', 'H', 'I', 'R', 'O', 'N',
+ 'C', 'H', 'R', 'I', 'V', 'I',
+ 'C', 'H', 'R', 'O', 'M', 'A',
+ 'C', 'H', 'U', 'R', 'C', 'H',
+ 'C', 'I', 'R', 'C', 'L', 'E',
+ 'C', 'L', 'E', 'F', '-', '1',
+ 'C', 'L', 'E', 'F', '-', '2',
+ 'C', 'L', 'I', 'V', 'I', 'S',
+ 'C', 'L', 'O', 'S', 'E', 'D',
+ 'C', 'O', 'F', 'F', 'I', 'N',
+ 'C', 'O', 'L', 'U', 'M', 'N',
+ 'C', 'O', 'M', 'I', 'N', 'G',
+ 'C', 'O', 'M', 'M', 'O', 'N',
+ 'C', 'O', 'P', 'T', 'I', 'C',
+ 'C', 'O', 'R', 'N', 'E', 'R',
+ 'C', 'O', 'R', 'P', 'S', 'E',
+ 'C', 'R', 'E', 'D', 'I', 'T',
+ 'C', 'U', 'R', 'V', 'E', 'D',
+ 'D', 'A', 'A', 'D', 'H', 'U',
+ 'D', 'A', 'G', 'E', 'S', 'H',
+ 'D', 'A', 'G', 'G', 'E', 'R',
+ 'D', 'A', 'L', 'A', 'T', 'H',
+ 'D', 'A', 'M', 'A', 'R', 'U',
+ 'D', 'A', 'S', 'E', 'I', 'A',
+ 'D', 'A', 'S', 'H', 'E', 'D',
+ 'D', 'D', 'A', 'H', 'A', 'L',
+ 'D', 'E', 'G', 'R', 'E', 'E',
+ 'D', 'E', 'L', 'E', 'T', 'E',
+ 'D', 'E', 'N', 'N', 'E', 'N',
+ 'D', 'E', 'N', 'T', 'A', 'L',
+ 'D', 'E', 'V', 'I', 'C', 'E',
+ 'D', 'H', 'A', 'A', 'L', 'U',
+ 'D', 'H', 'A', 'R', 'M', 'A',
+ 'D', 'I', 'E', 'S', 'I', 'S',
+ 'D', 'I', 'G', 'R', 'A', 'M',
+ 'D', 'I', 'P', 'P', 'E', 'R',
+ 'D', 'I', 'R', 'E', 'C', 'T',
+ 'D', 'I', 'V', 'I', 'D', 'E',
+ 'D', 'J', 'E', 'R', 'V', 'I',
+ 'D', 'O', 'L', 'I', 'U', 'M',
+ 'D', 'O', 'L', 'L', 'A', 'R',
+ 'D', 'O', 'M', 'A', 'I', 'N',
+ 'D', 'O', 'M', 'I', 'N', 'O',
+ 'D', 'O', 'T', 'S', '-', '1',
+ 'D', 'O', 'T', 'S', '-', '2',
+ 'D', 'O', 'T', 'S', '-', '3',
+ 'D', 'O', 'T', 'S', '-', '4',
+ 'D', 'O', 'T', 'S', '-', '5',
+ 'D', 'O', 'T', 'S', '-', '6',
+ 'D', 'O', 'T', 'S', '-', '7',
+ 'D', 'O', 'T', 'S', '-', '8',
+ 'D', 'O', 'T', 'T', 'E', 'D',
+ 'D', 'O', 'U', 'B', 'L', 'E',
+ 'D', 'R', 'A', 'G', 'O', 'N',
+ 'D', 'U', 'T', 'I', 'E', 'S',
+ 'E', 'I', 'G', 'H', 'T', 'H',
+ 'E', 'I', 'G', 'H', 'T', 'Y',
+ 'E', 'L', 'E', 'V', 'E', 'N',
+ 'E', 'N', 'D', 'I', 'N', 'G',
+ 'E', 'Q', 'U', 'A', 'L', 'S',
+ 'E', 'S', 'C', 'A', 'P', 'E',
+ 'E', 'T', 'E', 'R', 'O', 'N',
+ 'E', 'X', 'C', 'E', 'S', 'S',
+ 'E', 'X', 'I', 'S', 'T', 'S',
+ 'E', 'Y', 'A', 'N', 'N', 'A',
+ 'F', 'A', 'C', 'E', '-', '1',
+ 'F', 'A', 'C', 'E', '-', '2',
+ 'F', 'A', 'C', 'E', '-', '3',
+ 'F', 'A', 'C', 'E', '-', '4',
+ 'F', 'A', 'C', 'E', '-', '5',
+ 'F', 'A', 'C', 'E', '-', '6',
+ 'F', 'A', 'C', 'T', 'O', 'R',
+ 'F', 'A', 'M', 'I', 'L', 'Y',
+ 'F', 'A', 'T', 'H', 'E', 'R',
+ 'F', 'E', 'M', 'A', 'L', 'E',
+ 'F', 'H', 'T', 'O', 'R', 'A',
+ 'F', 'I', 'F', 'T', 'H', 'S',
+ 'F', 'I', 'G', 'U', 'R', 'E',
+ 'F', 'I', 'L', 'L', 'E', 'D',
+ 'F', 'I', 'L', 'L', 'E', 'R',
+ 'F', 'I', 'N', 'I', 'T', 'E',
+ 'F', 'L', 'A', 'G', '-', '1',
+ 'F', 'L', 'A', 'G', '-', '2',
+ 'F', 'L', 'A', 'G', '-', '3',
+ 'F', 'L', 'A', 'G', '-', '4',
+ 'F', 'L', 'A', 'G', '-', '5',
+ 'F', 'L', 'E', 'X', 'U', 'S',
+ 'F', 'L', 'I', 'G', 'H', 'T',
+ 'F', 'L', 'O', 'R', 'A', 'L',
+ 'F', 'L', 'O', 'W', 'E', 'R',
+ 'F', 'O', 'R', 'C', 'E', 'S',
+ 'F', 'O', 'R', 'K', 'E', 'D',
+ 'F', 'O', 'U', 'R', 'T', 'H',
+ 'F', 'R', 'E', 'N', 'C', 'H',
+ 'F', 'T', 'H', 'O', 'R', 'A',
+ 'G', 'A', 'N', 'G', 'I', 'A',
+ 'G', 'A', 'P', 'P', 'E', 'D',
+ 'G', 'A', 'S', 'H', 'A', 'N',
+ 'G', 'E', 'D', 'O', 'L', 'A',
+ 'G', 'E', 'M', 'I', 'N', 'I',
+ 'G', 'E', 'N', 'I', 'K', 'I',
+ 'G', 'E', 'N', 'T', 'L', 'E',
+ 'G', 'E', 'R', 'E', 'S', 'H',
+ 'G', 'E', 'R', 'M', 'A', 'N',
+ 'G', 'H', 'A', 'I', 'N', 'U',
+ 'G', 'H', 'A', 'M', 'A', 'L',
+ 'G', 'H', 'U', 'N', 'N', 'A',
+ 'G', 'L', 'E', 'I', 'C', 'H',
+ 'G', 'O', 'R', 'G', 'O', 'N',
+ 'G', 'O', 'T', 'H', 'I', 'C',
+ 'G', 'R', 'A', 'M', 'M', 'A',
+ 'G', 'R', 'A', 'T', 'E', 'R',
+ 'G', 'R', 'O', 'U', 'N', 'D',
+ 'G', 'U', 'R', 'A', 'M', 'U',
+ 'G', 'U', 'R', 'U', 'S', 'H',
+ 'H', '-', 'T', 'Y', 'P', 'E',
+ 'H', 'A', 'F', 'U', 'K', 'H',
+ 'H', 'A', 'G', 'L', 'A', 'Z',
+ 'H', 'A', 'M', 'M', 'E', 'R',
+ 'H', 'A', 'N', 'G', 'U', 'L',
+ 'H', 'E', 'A', 'D', 'E', 'D',
+ 'H', 'E', 'A', 'V', 'E', 'N',
+ 'H', 'E', 'B', 'R', 'E', 'W',
+ 'H', 'E', 'I', 'S', 'E', 'I',
+ 'H', 'E', 'L', 'M', 'E', 'T',
+ 'H', 'E', 'R', 'M', 'E', 'S',
+ 'H', 'E', 'R', 'U', 'T', 'U',
+ 'H', 'I', 'D', 'I', 'N', 'G',
+ 'H', 'U', 'I', 'I', 'T', 'O',
+ 'H', 'Y', 'P', 'H', 'E', 'N',
+ 'I', '-', 'B', 'E', 'A', 'M',
+ 'I', 'L', 'I', 'M', 'M', 'U',
+ 'I', 'N', 'G', 'W', 'A', 'Z',
+ 'I', 'N', 'I', 'N', 'G', 'U',
+ 'I', 'N', 'S', 'E', 'C', 'T',
+ 'I', 'N', 'S', 'I', 'D', 'E',
+ 'I', 'S', 'A', 'K', 'I', 'A',
+ 'I', 'S', 'S', 'H', 'A', 'R',
+ 'I', 'T', 'A', 'L', 'I', 'C',
+ 'I', 'Y', 'A', 'N', 'N', 'A',
+ 'J', 'O', 'I', 'N', 'E', 'D',
+ 'J', 'O', 'I', 'N', 'E', 'R',
+ 'J', 'O', 'Y', 'O', 'U', 'S',
+ 'K', 'A', 'N', 'A', 'K', 'O',
+ 'K', 'A', 'N', 'G', 'X', 'I',
+ 'K', 'A', 'S', 'K', 'A', 'L',
+ 'K', 'A', 'T', 'A', 'V', 'A',
+ 'K', 'A', 'V', 'Y', 'K', 'A',
+ 'K', 'A', 'Z', 'A', 'K', 'H',
+ 'K', 'E', 'F', 'U', 'L', 'A',
+ 'K', 'E', 'L', 'V', 'I', 'N',
+ 'K', 'E', 'M', 'P', 'L', 'I',
+ 'K', 'E', 'M', 'P', 'U', 'L',
+ 'K', 'E', 'Y', 'C', 'A', 'P',
+ 'K', 'H', 'A', 'N', 'D', 'A',
+ 'K', 'H', 'O', 'M', 'U', 'T',
+ 'K', 'I', 'S', 'I', 'M', '5',
+ 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'K', 'L', 'A', 'S', 'M', 'A',
+ 'K', 'L', 'I', 'T', 'O', 'N',
+ 'K', 'N', 'I', 'G', 'H', 'T',
+ 'K', 'O', 'R', 'E', 'A', 'N',
+ 'K', 'O', 'R', 'U', 'N', 'A',
+ 'K', 'U', 'S', 'H', 'U', '2',
+ 'K', 'W', 'U', '3', '1', '8',
+ 'K', 'Y', 'U', 'R', 'I', 'I',
+ 'L', '-', 'T', 'Y', 'P', 'E',
+ 'L', 'A', 'H', 'S', 'H', 'U',
+ 'L', 'A', 'M', 'A', 'D', 'H',
+ 'L', 'A', 'M', 'B', 'D', 'A',
+ 'L', 'A', 'R', 'G', 'E', 'R',
+ 'L', 'A', 'U', 'K', 'A', 'Z',
+ 'L', 'E', 'A', 'D', 'E', 'R',
+ 'L', 'E', 'G', 'I', 'O', 'N',
+ 'L', 'E', 'I', 'M', 'M', 'A',
+ 'L', 'E', 'N', 'G', 'T', 'H',
+ 'L', 'E', 'P', 'C', 'H', 'A',
+ 'L', 'E', 'S', 'S', 'E', 'R',
+ 'L', 'E', 'T', 'T', 'E', 'R',
+ 'L', 'I', 'L', 'I', 'T', 'H',
+ 'L', 'I', 'M', 'M', 'U', '2',
+ 'L', 'I', 'M', 'M', 'U', '4',
+ 'L', 'I', 'N', 'E', '-', '1',
+ 'L', 'I', 'N', 'E', '-', '3',
+ 'L', 'I', 'N', 'E', '-', '7',
+ 'L', 'I', 'N', 'E', '-', '9',
+ 'L', 'I', 'N', 'E', 'A', 'R',
+ 'L', 'I', 'Q', 'U', 'I', 'D',
+ 'L', 'I', 'T', 'T', 'L', 'E',
+ 'L', 'U', 'N', 'A', 'T', 'E',
+ 'L', 'Y', 'C', 'I', 'A', 'N',
+ 'L', 'Y', 'D', 'I', 'A', 'N',
+ 'M', 'A', 'C', 'R', 'O', 'N',
+ 'M', 'A', 'D', 'D', 'A', 'H',
+ 'M', 'A', 'I', 'D', 'E', 'N',
+ 'M', 'A', 'N', 'C', 'H', 'U',
+ 'M', 'A', 'N', 'N', 'A', 'Z',
+ 'M', 'A', 'R', 'K', '-', '1',
+ 'M', 'A', 'R', 'K', '-', '2',
+ 'M', 'A', 'R', 'K', '-', '3',
+ 'M', 'A', 'R', 'K', '-', '4',
+ 'M', 'A', 'R', 'K', 'E', 'R',
+ 'M', 'A', 'R', 'U', 'K', 'U',
+ 'M', 'A', 'S', 'O', 'R', 'A',
+ 'M', 'A', 'T', 'R', 'I', 'X',
+ 'M', 'A', 'X', 'I', 'M', 'A',
+ 'M', 'E', 'D', 'I', 'A', 'L',
+ 'M', 'E', 'D', 'I', 'U', 'M',
+ 'M', 'E', 'G', 'A', 'L', 'I',
+ 'M', 'E', 'M', 'B', 'E', 'R',
+ 'M', 'E', 'R', 'K', 'H', 'A',
+ 'M', 'E', 'T', 'R', 'I', 'A',
+ 'M', 'I', 'D', 'D', 'L', 'E',
+ 'M', 'I', 'K', 'R', 'O', 'N',
+ 'M', 'I', 'L', 'L', 'E', 'T',
+ 'M', 'I', 'N', 'I', 'M', 'A',
+ 'M', 'O', 'D', 'E', 'L', 'S',
+ 'M', 'O', 'D', 'U', 'L', 'O',
+ 'M', 'O', 'R', 'T', 'A', 'R',
+ 'M', 'O', 'T', 'H', 'E', 'R',
+ 'M', 'U', 'C', 'A', 'A', 'D',
+ 'M', 'U', 'N', 'S', 'U', 'B',
+ 'M', 'U', 'Q', 'D', 'A', 'M',
+ 'M', 'U', 'R', 'G', 'U', '2',
+ 'N', '-', 'C', 'R', 'E', 'E',
+ 'N', 'A', 'R', 'R', 'O', 'W',
+ 'N', 'A', 'U', 'D', 'I', 'Z',
+ 'N', 'A', 'U', 'T', 'H', 'S',
+ 'N', 'A', 'X', 'I', 'A', 'N',
+ 'N', 'E', 'N', 'A', 'N', 'O',
+ 'N', 'E', 'S', 'T', 'E', 'D',
+ 'N', 'E', 'U', 'T', 'E', 'R',
+ 'N', 'I', 'N', 'D', 'A', '2',
+ 'N', 'I', 'N', 'E', 'T', 'Y',
+ 'N', 'I', 'R', 'U', 'G', 'U',
+ 'N', 'O', 'K', 'H', 'U', 'K',
+ 'N', 'O', 'R', 'M', 'A', 'L',
+ 'N', 'U', 'B', 'I', 'A', 'N',
+ 'N', 'U', 'M', 'B', 'E', 'R',
+ 'N', 'U', 'M', 'E', 'R', 'O',
+ 'O', 'B', 'E', 'L', 'O', 'S',
+ 'O', 'B', 'E', 'L', 'U', 'S',
+ 'O', 'B', 'J', 'E', 'C', 'T',
+ 'O', 'G', 'O', 'N', 'E', 'K',
+ 'O', 'L', 'I', 'G', 'O', 'N',
+ 'O', 'M', 'A', 'L', 'O', 'N',
+ 'O', 'P', 'E', 'N', '-', 'P',
+ 'O', 'P', 'P', 'O', 'S', 'E',
+ 'O', 'P', 'T', 'I', 'O', 'N',
+ 'O', 'R', 'C', 'H', 'I', 'D',
+ 'O', 'R', 'I', 'G', 'I', 'N',
+ 'O', 'R', 'N', 'A', 'T', 'E',
+ 'O', 'T', 'T', 'A', 'V', 'A',
+ 'O', 'U', 'N', 'K', 'I', 'A',
+ 'O', 'X', 'E', 'I', 'A', 'I',
+ 'O', 'Y', 'A', 'N', 'N', 'A',
+ 'P', 'A', 'I', 'R', 'E', 'D',
+ 'P', 'A', 'L', 'L', 'A', 'S',
+ 'P', 'A', 'L', 'U', 'T', 'A',
+ 'P', 'A', 'M', 'A', 'D', 'A',
+ 'P', 'A', 'S', 'H', 'T', 'A',
+ 'P', 'E', 'N', 'C', 'I', 'L',
+ 'P', 'E', 'N', 'I', 'H', 'I',
+ 'P', 'E', 'O', 'R', 'T', 'H',
+ 'P', 'E', 'R', 'S', 'O', 'N',
+ 'P', 'E', 'R', 'T', 'H', 'O',
+ 'P', 'E', 'S', 'E', 'T', 'A',
+ 'P', 'H', 'N', 'A', 'E', 'K',
+ 'P', 'H', 'R', 'A', 'S', 'E',
+ 'P', 'I', 'A', 'S', 'M', 'A',
+ 'P', 'I', 'K', 'U', 'R', 'U',
+ 'P', 'I', 'P', 'I', 'N', 'G',
+ 'P', 'I', 'S', 'C', 'E', 'S',
+ 'P', 'L', 'A', 'N', 'C', 'K',
+ 'P', 'L', 'O', 'P', 'H', 'U',
+ 'P', 'L', 'U', 'M', 'E', 'D',
+ 'P', 'O', 'E', 'T', 'I', 'C',
+ 'P', 'O', 'E', 'T', 'R', 'Y',
+ 'P', 'O', 'I', 'N', 'T', 'O',
+ 'P', 'O', 'K', 'O', 'J', 'I',
+ 'P', 'O', 'S', 'T', 'A', 'L',
+ 'P', 'O', 'W', 'E', 'R', 'S',
+ 'P', 'R', 'O', 'T', 'O', 'S',
+ 'P', 'S', 'I', 'L', 'O', 'N',
+ 'P', 'T', 'H', 'A', 'H', 'A',
+ 'P', 'U', 'R', 'I', 'T', 'Y',
+ 'Q', 'A', 'M', 'A', 'T', 'S',
+ 'Q', 'A', 'R', 'N', 'E', 'Y',
+ 'Q', 'E', 'T', 'A', 'N', 'A',
+ 'Q', 'U', 'B', 'U', 'T', 'S',
+ 'R', '-', 'C', 'R', 'E', 'E',
+ 'R', 'A', 'I', 'S', 'E', 'D',
+ 'R', 'A', 'M', 'B', 'A', 'T',
+ 'R', 'A', 'S', 'O', 'U', 'L',
+ 'R', 'E', 'C', 'O', 'R', 'D',
+ 'R', 'E', 'J', 'A', 'N', 'G',
+ 'R', 'E', 'P', 'E', 'A', 'T',
+ 'R', 'E', 'T', 'U', 'R', 'N',
+ 'R', 'H', 'O', 'T', 'I', 'C',
+ 'R', 'I', 'K', 'R', 'I', 'K',
+ 'R', 'I', 'S', 'I', 'N', 'G',
+ 'R', 'I', 'T', 'U', 'A', 'L',
+ 'R', 'N', 'Y', 'I', 'N', 'G',
+ 'R', 'U', 'N', 'O', 'U', 'T',
+ 'S', 'A', 'A', 'D', 'H', 'U',
+ 'S', 'A', 'J', 'D', 'A', 'H',
+ 'S', 'A', 'M', 'E', 'K', 'H',
+ 'S', 'A', 'M', 'Y', 'O', 'K',
+ 'S', 'A', 'N', 'G', 'A', '2',
+ 'S', 'A', 'N', 'N', 'Y', 'A',
+ 'S', 'A', 'T', 'U', 'R', 'N',
+ 'S', 'A', 'Y', 'I', 'S', 'I',
+ 'S', 'C', 'A', 'L', 'E', 'S',
+ 'S', 'C', 'H', 'E', 'M', 'A',
+ 'S', 'C', 'R', 'E', 'E', 'N',
+ 'S', 'C', 'R', 'I', 'P', 'T',
+ 'S', 'E', 'C', 'O', 'N', 'D',
+ 'S', 'E', 'C', 'R', 'E', 'T',
+ 'S', 'E', 'C', 'T', 'O', 'R',
+ 'S', 'E', 'I', 'S', 'M', 'A',
+ 'S', 'E', 'R', 'I', 'F', 'S',
+ 'S', 'E', 'S', 'A', 'M', 'E',
+ 'S', 'H', 'A', 'D', 'D', 'A',
+ 'S', 'H', 'A', 'K', 'T', 'I',
+ 'S', 'H', 'A', 'P', 'E', 'S',
+ 'S', 'H', 'E', 'E', 'N', 'U',
+ 'S', 'H', 'E', 'Q', 'E', 'L',
+ 'S', 'H', 'E', 'S', 'H', '2',
+ 'S', 'H', 'I', 'E', 'L', 'D',
+ 'S', 'H', 'I', 'N', 'I', 'G',
+ 'S', 'H', 'O', 'R', 'T', 'S',
+ 'S', 'H', 'U', 'B', 'U', 'R',
+ 'S', 'I', 'C', 'K', 'L', 'E',
+ 'S', 'I', 'N', 'D', 'H', 'I',
+ 'S', 'I', 'N', 'G', 'L', 'E',
+ 'S', 'I', 'X', 'T', 'H', 'S',
+ 'S', 'K', 'E', 'W', 'E', 'D',
+ 'S', 'L', 'O', 'W', 'L', 'Y',
+ 'S', 'O', 'U', 'R', 'C', 'E',
+ 'S', 'O', 'W', 'I', 'L', 'O',
+ 'S', 'P', 'A', 'T', 'H', 'I',
+ 'S', 'P', 'E', 'E', 'C', 'H',
+ 'S', 'P', 'I', 'R', 'A', 'L',
+ 'S', 'P', 'I', 'R', 'I', 'T',
+ 'S', 'P', 'O', 'K', 'E', 'D',
+ 'S', 'P', 'R', 'I', 'N', 'G',
+ 'S', 'P', 'R', 'O', 'U', 'T',
+ 'S', 'P', 'U', 'N', 'G', 'S',
+ 'S', 'Q', 'U', 'A', 'R', 'E',
+ 'S', 'Q', 'U', 'I', 'S', 'H',
+ 'S', 'T', 'I', 'G', 'M', 'A',
+ 'S', 'T', 'I', 'M', 'M', 'E',
+ 'S', 'T', 'R', 'A', 'I', 'F',
+ 'S', 'T', 'R', 'E', 'S', 'S',
+ 'S', 'T', 'R', 'I', 'D', 'E',
+ 'S', 'T', 'R', 'O', 'K', 'E',
+ 'S', 'U', 'B', 'I', 'T', 'O',
+ 'S', 'U', 'B', 'S', 'E', 'T',
+ 'S', 'U', 'M', 'A', 'S', 'H',
+ 'S', 'U', 'M', 'M', 'E', 'R',
+ 'S', 'U', 'R', 'A', 'N', 'G',
+ 'S', 'W', 'O', 'R', 'D', 'S',
+ 'S', 'Y', 'L', 'O', 'T', 'I',
+ 'S', 'Y', 'M', 'B', 'O', 'L',
+ 'S', 'Y', 'N', 'A', 'F', 'I',
+ 'S', 'Y', 'O', 'U', 'W', 'A',
+ 'S', 'Y', 'R', 'I', 'A', 'C',
+ 'T', 'A', '-', 'R', 'O', 'L',
+ 'T', 'A', 'I', 'L', 'E', 'D',
+ 'T', 'A', 'L', 'E', 'N', 'T',
+ 'T', 'A', 'L', 'I', 'N', 'G',
+ 'T', 'A', 'M', 'I', 'N', 'G',
+ 'T', 'A', 'N', 'N', 'E', 'D',
+ 'T', 'A', 'U', 'R', 'U', 'S',
+ 'T', 'E', 'D', 'U', 'N', 'G',
+ 'T', 'E', 'L', 'E', 'I', 'A',
+ 'T', 'E', 'L', 'O', 'U', 'S',
+ 'T', 'E', 'L', 'U', 'G', 'U',
+ 'T', 'E', 'M', 'P', 'U', 'S',
+ 'T', 'E', 'N', 'U', 'T', 'O',
+ 'T', 'H', 'A', 'A', 'L', 'U',
+ 'T', 'H', 'A', 'A', 'N', 'A',
+ 'T', 'H', 'A', 'H', 'A', 'N',
+ 'T', 'H', 'A', 'N', 'N', 'A',
+ 'T', 'H', 'E', 'T', 'H', 'E',
+ 'T', 'H', 'I', 'R', 'D', 'S',
+ 'T', 'H', 'I', 'R', 'T', 'Y',
+ 'T', 'H', 'I', 'U', 'T', 'H',
+ 'T', 'H', 'R', 'E', 'A', 'D',
+ 'T', 'H', 'Y', 'O', 'O', 'M',
+ 'T', 'I', 'K', 'E', 'U', 'T',
+ 'T', 'I', 'P', 'E', 'H', 'A',
+ 'T', 'O', 'N', 'E', '-', '1',
+ 'T', 'O', 'N', 'E', '-', '2',
+ 'T', 'O', 'N', 'E', '-', '3',
+ 'T', 'O', 'N', 'E', '-', '4',
+ 'T', 'O', 'N', 'E', '-', '5',
+ 'T', 'O', 'N', 'E', '-', '6',
+ 'T', 'O', 'N', 'G', 'U', 'E',
+ 'T', 'O', 'P', 'B', 'A', 'R',
+ 'T', 'R', 'I', 'P', 'L', 'E',
+ 'T', 'R', 'I', 'P', 'L', 'I',
+ 'T', 'R', 'I', 'P', 'O', 'D',
+ 'T', 'R', 'I', 'T', 'O', 'S',
+ 'T', 'S', 'H', 'O', 'O', 'K',
+ 'T', 'S', 'H', 'U', 'G', 'S',
+ 'T', 'T', 'E', 'H', 'E', 'H',
+ 'T', 'U', 'A', 'R', 'E', 'G',
+ 'T', 'U', 'G', 'R', 'I', 'K',
+ 'T', 'U', 'R', 'B', 'A', 'N',
+ 'T', 'U', 'R', 'N', 'E', 'D',
+ 'T', 'U', 'R', 'T', 'L', 'E',
+ 'T', 'V', 'R', 'I', 'D', 'O',
+ 'T', 'W', 'E', 'L', 'V', 'E',
+ 'T', 'W', 'E', 'N', 'T', 'Y',
+ 'T', 'Y', 'P', 'E', '-', '1',
+ 'T', 'Y', 'P', 'E', '-', '2',
+ 'T', 'Y', 'P', 'E', '-', '3',
+ 'T', 'Y', 'P', 'E', '-', '4',
+ 'T', 'Y', 'P', 'E', '-', '5',
+ 'T', 'Y', 'P', 'E', '-', '6',
+ 'T', 'Y', 'P', 'E', '-', '7',
+ 'U', 'D', 'A', 'T', 'T', 'A',
+ 'U', 'I', 'G', 'H', 'U', 'R',
+ 'U', 'P', 'T', 'U', 'R', 'N',
+ 'U', 'P', 'W', 'A', 'R', 'D',
+ 'U', 'R', 'A', 'N', 'U', 'S',
+ 'U', 'S', 'H', 'U', 'M', 'X',
+ 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'V', 'A', 'L', 'L', 'E', 'Y',
+ 'V', 'A', 'R', 'E', 'I', 'A',
+ 'V', 'A', 'R', 'I', 'K', 'A',
+ 'V', 'E', 'C', 'T', 'O', 'R',
+ 'V', 'E', 'S', 'S', 'E', 'L',
+ 'V', 'I', 'R', 'A', 'M', 'A',
+ 'V', 'I', 'R', 'I', 'A', 'M',
+ 'V', 'O', 'I', 'C', 'E', 'D',
+ 'V', 'O', 'L', 'U', 'M', 'E',
+ 'V', 'R', 'A', 'C', 'H', 'Y',
+ 'V', 'U', 'L', 'G', 'A', 'R',
+ 'W', 'E', 'A', 'P', 'O', 'N',
+ 'W', 'E', 'I', 'G', 'H', 'T',
+ 'W', 'I', 'G', 'G', 'L', 'Y',
+ 'W', 'I', 'N', 'T', 'E', 'R',
+ 'W', 'O', 'L', 'O', 'S', 'O',
+ 'W', 'R', 'E', 'A', 'T', 'H',
+ 'X', 'E', 'S', 'T', 'E', 'S',
+ 'Y', '-', 'C', 'R', 'E', 'E',
+ 'Y', 'A', 'K', 'A', 'S', 'H',
+ 'Y', 'E', 'L', 'L', 'O', 'W',
+ 'Y', 'F', 'E', 'S', 'I', 'S',
+ 'Y', 'O', '-', 'Y', 'A', 'E',
+ 'Y', 'O', '-', 'Y', 'E', 'O',
+ 'Y', 'P', 'S', 'I', 'L', 'I',
+ 'Y', 'U', '-', 'Y', 'E', 'O',
+ 'Z', 'E', 'M', 'L', 'J', 'A',
+ 'Z', 'E', 'M', 'L', 'Y', 'A',
+ 'Z', 'I', 'G', 'Z', 'A', 'G',
+ 'Z', 'Q', 'A', 'P', 'H', 'A',
+ 'A', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'B', 'A', 'F', 'I', 'L', 'I',
+ 'A', 'B', 'Y', 'S', 'M', 'A', 'L',
+ 'A', 'C', 'A', 'D', 'E', 'M', 'Y',
+ 'A', 'C', 'C', 'O', 'U', 'N', 'T',
+ 'A', 'D', 'V', 'A', 'N', 'C', 'E',
+ 'A', 'E', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'F', 'G', 'H', 'A', 'N', 'I',
+ 'A', 'F', 'R', 'I', 'C', 'A', 'N',
+ 'A', 'H', 'A', 'G', 'G', 'A', 'R',
+ 'A', 'I', 'V', 'I', 'L', 'I', 'K',
+ 'A', 'I', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'L', 'E', 'M', 'B', 'I', 'C',
+ 'A', 'L', 'I', 'G', 'N', 'E', 'D',
+ 'A', 'L', 'L', 'A', 'H', 'O', 'U',
+ 'A', 'N', 'G', 'U', 'L', 'A', 'R',
+ 'A', 'N', 'N', 'U', 'I', 'T', 'Y',
+ 'A', 'P', 'O', 'T', 'H', 'E', 'S',
+ 'A', 'R', 'A', 'E', 'A', '-', 'I',
+ 'A', 'R', 'A', 'E', 'A', '-', 'U',
+ 'A', 'R', 'C', 'H', 'A', 'I', 'C',
+ 'A', 'R', 'K', 'T', 'I', 'K', 'O',
+ 'A', 'U', 'S', 'T', 'R', 'A', 'L',
+ 'A', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'V', 'E', 'R', 'A', 'G', 'E',
+ 'B', 'A', 'A', 'R', 'E', 'R', 'U',
+ 'B', 'A', 'I', 'R', 'K', 'A', 'N',
+ 'B', 'A', 'M', 'B', 'O', 'O', 'S',
+ 'B', 'A', 'R', 'L', 'I', 'N', 'E',
+ 'B', 'A', 'R', 'R', 'E', 'K', 'H',
+ 'B', 'A', 'R', 'R', 'I', 'E', 'R',
+ 'B', 'A', 'S', 'H', 'K', 'I', 'R',
+ 'B', 'A', 'T', 'H', 'T', 'U', 'B',
+ 'B', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'B', 'E', 'C', 'A', 'U', 'S', 'E',
+ 'B', 'E', 'E', 'H', 'I', 'V', 'E',
+ 'B', 'E', 'N', 'G', 'A', 'L', 'I',
+ 'B', 'E', 'N', 'Z', 'E', 'N', 'E',
+ 'B', 'E', 'T', 'W', 'E', 'E', 'N',
+ 'B', 'I', 'N', 'D', 'I', 'N', 'G',
+ 'B', 'J', 'A', 'R', 'K', 'A', 'N',
+ 'B', 'L', 'E', 'N', 'D', 'E', 'D',
+ 'B', 'R', 'A', 'C', 'K', 'E', 'T',
+ 'B', 'R', 'A', 'I', 'L', 'L', 'E',
+ 'B', 'R', 'A', 'K', 'C', 'E', 'T',
+ 'B', 'R', 'I', 'S', 'T', 'L', 'E',
+ 'B', 'U', 'U', 'M', 'I', 'S', 'H',
+ 'C', 'A', 'E', 'S', 'U', 'R', 'A',
+ 'C', 'A', 'P', 'I', 'T', 'A', 'L',
+ 'C', 'A', 'P', 'T', 'I', 'V', 'E',
+ 'C', 'A', 'R', 'R', 'I', 'E', 'R',
+ 'C', 'A', 'U', 'T', 'I', 'O', 'N',
+ 'C', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'C', 'E', 'D', 'I', 'L', 'L', 'A',
+ 'C', 'E', 'I', 'L', 'I', 'N', 'G',
+ 'C', 'E', 'L', 'S', 'I', 'U', 'S',
+ 'C', 'E', 'N', 'T', 'R', 'E', 'D',
+ 'C', 'H', 'A', 'M', 'I', 'L', 'I',
+ 'C', 'H', 'A', 'R', 'I', 'O', 'T',
+ 'C', 'H', 'E', 'V', 'R', 'O', 'N',
+ 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'C', 'H', 'I', 'N', 'E', 'S', 'E',
+ 'C', 'H', 'R', 'O', 'N', 'O', 'N',
+ 'C', 'H', 'R', 'O', 'N', 'O', 'U',
+ 'C', 'I', 'R', 'C', 'L', 'E', 'D',
+ 'C', 'I', 'R', 'C', 'L', 'E', 'S',
+ 'C', 'L', 'O', 'S', 'I', 'N', 'G',
+ 'C', 'L', 'O', 'S', 'U', 'R', 'E',
+ 'C', 'L', 'O', 'T', 'H', 'E', 'S',
+ 'C', 'L', 'U', 'S', 'T', 'E', 'R',
+ 'C', 'O', 'M', 'P', 'A', 'R', 'E',
+ 'C', 'O', 'N', 'I', 'C', 'A', 'L',
+ 'C', 'O', 'N', 'T', 'A', 'C', 'T',
+ 'C', 'O', 'N', 'T', 'A', 'I', 'N',
+ 'C', 'O', 'N', 'T', 'O', 'U', 'R',
+ 'C', 'O', 'N', 'T', 'R', 'O', 'L',
+ 'C', 'O', 'R', 'N', 'E', 'R', 'S',
+ 'C', 'O', 'R', 'O', 'N', 'I', 'S',
+ 'C', 'O', 'R', 'R', 'E', 'C', 'T',
+ 'C', 'O', 'U', 'N', 'C', 'I', 'L',
+ 'C', 'R', 'O', 'S', 'S', 'E', 'D',
+ 'C', 'U', 'R', 'R', 'E', 'N', 'T',
+ 'C', 'U', 'R', 'V', 'I', 'N', 'G',
+ 'C', 'W', 'E', 'O', 'R', 'T', 'H',
+ 'C', 'Y', 'P', 'E', 'R', 'U', 'S',
+ 'C', 'Y', 'P', 'R', 'I', 'O', 'T',
+ 'D', 'A', 'G', 'A', 'L', 'G', 'A',
+ 'D', 'A', 'N', 'T', 'A', 'J', 'A',
+ 'D', 'A', 'P', '-', 'B', 'E', 'I',
+ 'D', 'A', 'P', '-', 'P', 'I', 'I',
+ 'D', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'D', 'E', 'C', 'A', 'Y', 'E', 'D',
+ 'D', 'E', 'C', 'I', 'M', 'A', 'L',
+ 'D', 'E', 'L', 'P', 'H', 'I', 'C',
+ 'D', 'E', 'S', 'E', 'R', 'E', 'T',
+ 'D', 'H', 'A', 'L', 'A', 'T', 'H',
+ 'D', 'I', 'A', 'M', 'O', 'N', 'D',
+ 'D', 'I', 'A', 'R', 'G', 'O', 'N',
+ 'D', 'I', 'G', 'A', 'M', 'M', 'A',
+ 'D', 'I', 'G', 'R', 'A', 'P', 'H',
+ 'D', 'I', 'M', 'I', 'D', 'I', 'A',
+ 'D', 'I', 'M', 'M', 'I', 'N', 'G',
+ 'D', 'I', 'N', 'G', 'B', 'A', 'T',
+ 'D', 'I', 'P', 'L', 'O', 'U', 'N',
+ 'D', 'I', 'S', 'I', 'M', 'O', 'U',
+ 'D', 'I', 'V', 'I', 'D', 'E', 'D',
+ 'D', 'I', 'V', 'I', 'D', 'E', 'R',
+ 'D', 'I', 'V', 'I', 'D', 'E', 'S',
+ 'D', 'I', 'V', 'O', 'R', 'C', 'E',
+ 'D', 'O', 'T', 'L', 'E', 'S', 'S',
+ 'D', 'O', 'T', 'S', '-', '1', '2',
+ 'D', 'O', 'T', 'S', '-', '1', '3',
+ 'D', 'O', 'T', 'S', '-', '1', '4',
+ 'D', 'O', 'T', 'S', '-', '1', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3',
+ 'D', 'O', 'T', 'S', '-', '2', '4',
+ 'D', 'O', 'T', 'S', '-', '2', '5',
+ 'D', 'O', 'T', 'S', '-', '2', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4',
+ 'D', 'O', 'T', 'S', '-', '3', '5',
+ 'D', 'O', 'T', 'S', '-', '3', '6',
+ 'D', 'O', 'T', 'S', '-', '3', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '7', '8',
+ 'D', 'O', 'U', 'B', 'L', 'E', 'D',
+ 'D', 'R', 'A', 'C', 'H', 'M', 'A',
+ 'E', 'A', 'B', 'H', 'A', 'D', 'H',
+ 'E', 'A', 'D', 'H', 'A', 'D', 'H',
+ 'E', 'A', 'R', 'T', 'H', 'L', 'Y',
+ 'E', 'A', 'S', 'T', 'E', 'R', 'N',
+ 'E', 'B', 'E', 'F', 'I', 'L', 'I',
+ 'E', 'E', 'Y', 'A', 'N', 'N', 'A',
+ 'E', 'I', 'G', 'H', 'T', 'H', 'S',
+ 'E', 'L', 'A', 'F', 'R', 'O', 'N',
+ 'E', 'L', 'E', 'M', 'E', 'N', 'T',
+ 'E', 'L', 'L', 'I', 'P', 'S', 'E',
+ 'E', 'N', 'A', 'R', 'X', 'I', 'S',
+ 'E', 'N', 'Q', 'U', 'I', 'R', 'Y',
+ 'E', 'P', 'S', 'I', 'L', 'O', 'N',
+ 'E', 'T', 'N', 'A', 'H', 'T', 'A',
+ 'E', 'V', 'E', 'N', 'I', 'N', 'G',
+ 'F', 'A', 'I', 'L', 'U', 'R', 'E',
+ 'F', 'A', 'L', 'L', 'I', 'N', 'G',
+ 'F', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'F', 'E', 'A', 'T', 'H', 'E', 'R',
+ 'F', 'E', 'R', 'M', 'A', 'T', 'A',
+ 'F', 'I', 'F', 'T', 'E', 'E', 'N',
+ 'F', 'I', 'S', 'H', 'E', 'Y', 'E',
+ 'F', 'O', 'N', 'G', 'M', 'A', 'N',
+ 'F', 'O', 'R', 'K', 'I', 'N', 'G',
+ 'F', 'R', 'A', 'K', 'T', 'U', 'R',
+ 'F', 'U', 'N', 'E', 'R', 'A', 'L',
+ 'G', 'A', 'A', 'H', 'L', 'A', 'A',
+ 'G', 'A', 'R', 'M', 'E', 'N', 'T',
+ 'G', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'G', 'E', 'N', 'E', 'R', 'I', 'C',
+ 'G', 'E', 'S', 'H', 'T', 'I', 'N',
+ 'G', 'I', 'R', 'U', 'D', 'A', 'A',
+ 'G', 'L', 'A', 'G', 'O', 'L', 'I',
+ 'G', 'L', 'O', 'T', 'T', 'A', 'L',
+ 'G', 'R', 'E', 'A', 'T', 'E', 'R',
+ 'G', 'U', 'A', 'R', 'A', 'N', 'I',
+ 'H', 'A', 'F', 'U', 'K', 'H', 'A',
+ 'H', 'A', 'L', 'A', 'N', 'T', 'A',
+ 'H', 'A', 'L', 'B', 'E', 'R', 'D',
+ 'H', 'A', 'N', 'U', 'N', 'O', 'O',
+ 'H', 'A', 'R', 'P', 'O', 'O', 'N',
+ 'H', 'A', 'S', 'A', 'N', 'T', 'A',
+ 'H', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'H', 'E', '-', 'G', 'O', 'A', 'T',
+ 'H', 'E', 'A', 'D', 'I', 'N', 'G',
+ 'H', 'E', 'R', 'A', 'E', 'U', 'M',
+ 'H', 'E', 'X', 'A', 'G', 'O', 'N',
+ 'H', 'O', 'L', 'D', 'I', 'N', 'G',
+ 'H', 'R', 'Y', 'V', 'N', 'I', 'A',
+ 'H', 'U', 'N', 'D', 'R', 'E', 'D',
+ 'I', '-', 'A', 'R', 'A', 'E', 'A',
+ 'I', 'B', 'I', 'F', 'I', 'L', 'I',
+ 'I', 'C', 'H', 'A', 'D', 'I', 'N',
+ 'I', 'I', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'L', 'I', 'M', 'M', 'U', '3',
+ 'I', 'L', 'I', 'M', 'M', 'U', '4',
+ 'I', 'M', 'I', 'S', 'E', 'O', 'S',
+ 'I', 'N', 'H', 'I', 'B', 'I', 'T',
+ 'I', 'N', 'I', 'T', 'I', 'A', 'L',
+ 'I', 'N', 'S', 'U', 'L', 'A', 'R',
+ 'I', 'N', 'V', 'E', 'R', 'S', 'E',
+ 'I', 'O', 'D', 'H', 'A', 'D', 'H',
+ 'I', 'O', 'T', 'A', 'T', 'E', 'D',
+ 'I', 'Z', 'H', 'I', 'T', 'S', 'A',
+ 'J', 'A', 'N', 'U', 'A', 'R', 'Y',
+ 'J', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'J', 'E', 'G', 'O', 'G', 'A', 'N',
+ 'J', 'U', 'P', 'I', 'T', 'E', 'R',
+ 'K', 'A', 'K', 'A', 'B', 'A', 'T',
+ 'K', 'A', 'N', 'N', 'A', 'D', 'A',
+ 'K', 'A', 'N', 'T', 'A', 'J', 'A',
+ 'K', 'A', 'R', 'A', 'T', 'T', 'O',
+ 'K', 'A', 'R', 'O', 'R', 'I', 'I',
+ 'K', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'K', 'E', 'E', 'P', 'I', 'N', 'G',
+ 'K', 'E', 'M', 'B', 'A', 'N', 'G',
+ 'K', 'E', 'N', 'T', 'I', 'M', 'A',
+ 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'K', 'I', 'N', 'S', 'H', 'I', 'P',
+ 'K', 'I', 'R', 'G', 'H', 'I', 'Z',
+ 'K', 'O', 'M', 'B', 'U', 'V', 'A',
+ 'K', 'O', 'O', 'M', 'U', 'U', 'T',
+ 'K', 'O', 'R', 'A', 'N', 'I', 'C',
+ 'K', 'O', 'R', 'O', 'N', 'I', 'S',
+ 'K', 'R', 'A', 'T', 'I', 'M', 'A',
+ 'K', 'U', 'R', 'O', 'O', 'N', 'E',
+ 'K', 'Y', 'A', 'T', 'H', 'O', 'S',
+ 'K', 'Y', 'L', 'I', 'S', 'M', 'A',
+ 'L', 'A', 'T', 'E', 'R', 'A', 'L',
+ 'L', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'L', 'E', 'A', 'T', 'H', 'E', 'R',
+ 'L', 'E', 'G', 'E', 'T', 'O', 'S',
+ 'L', 'I', 'M', 'I', 'T', 'E', 'D',
+ 'L', 'I', 'N', 'K', 'I', 'N', 'G',
+ 'L', 'J', 'U', 'D', 'I', 'J', 'E',
+ 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ 'L', 'O', 'Z', 'E', 'N', 'G', 'E',
+ 'L', 'Y', 'G', 'I', 'S', 'M', 'A',
+ 'M', 'A', 'H', 'J', 'O', 'N', 'G',
+ 'M', 'A', 'I', 'K', 'U', 'R', 'O',
+ 'M', 'A', 'I', 'M', 'U', 'A', 'N',
+ 'M', 'A', 'K', 'S', 'U', 'R', 'A',
+ 'M', 'A', 'L', 'A', 'K', 'O', 'N',
+ 'M', 'A', 'L', 'T', 'E', 'S', 'E',
+ 'M', 'A', 'N', 'S', 'Y', 'O', 'N',
+ 'M', 'A', 'R', 'B', 'U', 'T', 'A',
+ 'M', 'A', 'R', 'C', 'A', 'T', 'O',
+ 'M', 'A', 'S', 'S', 'I', 'N', 'G',
+ 'M', 'A', 'T', 'T', 'O', 'C', 'K',
+ 'M', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'M', 'E', 'A', 'S', 'U', 'R', 'E',
+ 'M', 'E', 'E', 'T', 'O', 'R', 'U',
+ 'M', 'E', 'G', 'A', 'T', 'O', 'N',
+ 'M', 'E', 'R', 'C', 'U', 'R', 'Y',
+ 'M', 'I', 'D', 'L', 'I', 'N', 'E',
+ 'M', 'I', 'K', 'U', 'R', 'O', 'N',
+ 'M', 'O', 'D', 'E', 'S', 'T', 'Y',
+ 'M', 'O', 'R', 'N', 'I', 'N', 'G',
+ 'M', 'U', 'S', 'I', 'C', 'A', 'L',
+ 'M', 'Y', 'A', 'N', 'M', 'A', 'R',
+ 'M', 'Y', 'S', 'L', 'I', 'T', 'E',
+ 'N', 'A', 'S', 'K', 'A', 'P', 'I',
+ 'N', 'A', 'T', 'U', 'R', 'A', 'L',
+ 'N', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'N', 'E', 'G', 'A', 'T', 'E', 'D',
+ 'N', 'E', 'I', 'T', 'H', 'E', 'R',
+ 'N', 'E', 'P', 'T', 'U', 'N', 'E',
+ 'N', 'E', 'U', 'T', 'R', 'A', 'L',
+ 'N', 'E', 'W', 'L', 'I', 'N', 'E',
+ 'N', 'G', 'E', 'A', 'D', 'A', 'L',
+ 'N', 'I', 'K', 'A', 'H', 'I', 'T',
+ 'N', 'O', 'M', 'I', 'N', 'A', 'L',
+ 'N', 'O', 'T', 'C', 'H', 'E', 'D',
+ 'N', 'U', 'M', 'E', 'R', 'A', 'L',
+ 'N', 'U', 'M', 'E', 'R', 'I', 'C',
+ 'N', 'U', 'N', 'A', 'V', 'I', 'K',
+ 'N', 'U', 'N', 'A', 'V', 'U', 'T',
+ 'N', 'U', 'T', 'I', 'L', 'L', 'U',
+ 'N', 'Y', 'I', 'N', '-', 'D', 'O',
+ 'O', 'B', 'L', 'I', 'Q', 'U', 'E',
+ 'O', 'B', 'O', 'F', 'I', 'L', 'I',
+ 'O', 'C', 'T', 'O', 'B', 'E', 'R',
+ 'O', 'M', 'I', 'C', 'R', 'O', 'N',
+ 'O', 'N', 'E', 'S', 'E', 'L', 'F',
+ 'O', 'O', 'Y', 'A', 'N', 'N', 'A',
+ 'O', 'P', 'E', 'N', 'I', 'N', 'G',
+ 'O', 'R', 'D', 'I', 'N', 'A', 'L',
+ 'O', 'S', 'M', 'A', 'N', 'Y', 'A',
+ 'O', 'T', 'H', 'A', 'L', 'A', 'N',
+ 'O', 'U', 'T', 'L', 'I', 'N', 'E',
+ 'O', 'V', 'E', 'R', 'B', 'A', 'R',
+ 'O', 'V', 'E', 'R', 'L', 'A', 'Y',
+ 'P', 'A', 'C', 'K', 'I', 'N', 'G',
+ 'P', 'A', 'L', 'A', 'T', 'A', 'L',
+ 'P', 'A', 'L', 'A', 'U', 'N', 'G',
+ 'P', 'A', 'L', 'L', 'A', 'W', 'A',
+ 'P', 'A', 'M', 'A', 'A', 'E', 'H',
+ 'P', 'A', 'M', 'E', 'P', 'E', 'T',
+ 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'P', 'A', 'N', 'Y', 'I', 'K', 'U',
+ 'P', 'A', 'N', 'Y', 'U', 'K', 'U',
+ 'P', 'A', 'P', 'Y', 'R', 'U', 'S',
+ 'P', 'A', 'R', 'E', 'R', 'E', 'N',
+ 'P', 'A', 'R', 'T', 'I', 'A', 'L',
+ 'P', 'A', 'T', 'T', 'E', 'R', 'N',
+ 'P', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'P', 'A', 'Y', 'E', 'R', 'O', 'K',
+ 'P', 'E', 'R', 'C', 'E', 'N', 'T',
+ 'P', 'E', 'R', 'S', 'I', 'A', 'N',
+ 'P', 'E', 'T', 'A', 'S', 'M', 'A',
+ 'P', 'E', 'T', 'A', 'S', 'T', 'I',
+ 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'P', 'H', 'I', 'N', 'T', 'H', 'U',
+ 'P', 'H', 'U', 'T', 'H', 'A', 'O',
+ 'P', 'I', 'L', 'C', 'R', 'O', 'W',
+ 'P', 'L', 'A', 'G', 'I', 'O', 'S',
+ 'P', 'O', 'D', 'A', 'T', 'U', 'S',
+ 'P', 'O', 'I', 'N', 'T', 'E', 'D',
+ 'P', 'O', 'I', 'N', 'T', 'E', 'R',
+ 'P', 'R', 'E', 'C', 'E', 'D', 'E',
+ 'P', 'R', 'E', 'F', 'A', 'C', 'E',
+ 'P', 'R', 'I', 'V', 'A', 'T', 'E',
+ 'P', 'R', 'O', 'D', 'U', 'C', 'T',
+ 'P', 'U', 'S', 'H', 'I', 'N', 'G',
+ 'Q', 'U', 'A', 'R', 'T', 'E', 'R',
+ 'R', 'A', 'D', 'I', 'C', 'A', 'L',
+ 'R', 'A', 'K', 'H', 'A', 'N', 'G',
+ 'R', 'A', 'P', 'I', 'S', 'M', 'A',
+ 'R', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'R', 'E', 'A', 'H', 'M', 'U', 'K',
+ 'R', 'E', 'L', 'E', 'A', 'S', 'E',
+ 'R', 'E', 'R', 'E', 'K', 'A', 'N',
+ 'R', 'E', 'T', 'R', 'E', 'A', 'T',
+ 'R', 'E', 'V', 'E', 'R', 'S', 'E',
+ 'R', 'G', 'Y', 'I', 'N', 'G', 'S',
+ 'R', 'I', 'T', 'T', 'O', 'R', 'U',
+ 'R', 'O', 'S', 'E', 'T', 'T', 'E',
+ 'R', 'O', 'T', 'A', 'T', 'E', 'D',
+ 'R', 'O', 'T', 'U', 'N', 'D', 'A',
+ 'R', 'O', 'U', 'N', 'D', 'E', 'D',
+ 'R', 'U', 'U', 'B', 'U', 'R', 'U',
+ 'S', 'A', 'I', 'K', 'U', 'R', 'U',
+ 'S', 'A', 'L', 'T', 'I', 'R', 'E',
+ 'S', 'A', 'M', 'P', 'H', 'A', 'O',
+ 'S', 'A', 'N', 'Y', 'A', 'K', 'A',
+ 'S', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'S', 'C', 'H', 'O', 'L', 'A', 'R',
+ 'S', 'C', 'R', 'U', 'P', 'L', 'E',
+ 'S', 'E', 'A', 'G', 'U', 'L', 'L',
+ 'S', 'E', 'C', 'T', 'I', 'O', 'N',
+ 'S', 'E', 'G', 'M', 'E', 'N', 'T',
+ 'S', 'E', 'M', 'K', 'A', 'T', 'H',
+ 'S', 'E', 'R', 'V', 'I', 'C', 'E',
+ 'S', 'E', 'V', 'E', 'N', 'T', 'Y',
+ 'S', 'E', 'X', 'T', 'A', 'N', 'S',
+ 'S', 'E', 'X', 'T', 'I', 'L', 'E',
+ 'S', 'E', 'X', 'T', 'U', 'L', 'A',
+ 'S', 'H', 'A', 'P', 'I', 'N', 'G',
+ 'S', 'H', 'A', 'V', 'I', 'A', 'N',
+ 'S', 'H', 'E', 'S', 'H', 'I', 'G',
+ 'S', 'H', 'T', 'A', 'P', 'I', 'C',
+ 'S', 'H', 'U', 'F', 'F', 'L', 'E',
+ 'S', 'I', 'L', 'I', 'Q', 'U', 'A',
+ 'S', 'I', 'M', 'I', 'L', 'A', 'R',
+ 'S', 'I', 'N', 'H', 'A', 'L', 'A',
+ 'S', 'I', 'N', 'K', 'I', 'N', 'G',
+ 'S', 'I', 'R', 'I', 'N', 'G', 'U',
+ 'S', 'I', 'X', 'T', 'E', 'E', 'N',
+ 'S', 'K', 'L', 'I', 'R', 'O', 'N',
+ 'S', 'L', 'A', 'N', 'T', 'E', 'D',
+ 'S', 'L', 'O', 'P', 'I', 'N', 'G',
+ 'S', 'M', 'A', 'L', 'L', 'E', 'R',
+ 'S', 'M', 'I', 'L', 'I', 'N', 'G',
+ 'S', 'N', 'O', 'W', 'M', 'A', 'N',
+ 'S', 'O', 'C', 'I', 'E', 'T', 'Y',
+ 'S', 'O', 'G', 'D', 'I', 'A', 'N',
+ 'S', 'O', 'L', 'I', 'D', 'U', 'S',
+ 'S', 'P', 'A', 'C', 'I', 'N', 'G',
+ 'S', 'P', 'A', 'R', 'K', 'L', 'E',
+ 'S', 'P', 'E', 'C', 'I', 'A', 'L',
+ 'S', 'P', 'I', 'D', 'E', 'R', 'Y',
+ 'S', 'P', 'I', 'R', 'A', 'N', 'T',
+ 'S', 'P', 'R', 'I', 'N', 'G', 'S',
+ 'S', 'Q', 'U', 'A', 'R', 'E', 'D',
+ 'S', 'Q', 'U', 'A', 'R', 'E', 'S',
+ 'S', 'T', 'A', 'T', 'E', 'R', 'S',
+ 'S', 'T', 'A', 'U', 'R', 'O', 'S',
+ 'S', 'T', 'A', 'V', 'R', 'O', 'S',
+ 'S', 'T', 'A', 'V', 'R', 'O', 'U',
+ 'S', 'T', 'R', 'O', 'K', 'E', 'S',
+ 'S', 'U', 'B', 'J', 'E', 'C', 'T',
+ 'S', 'U', 'B', 'U', 'N', 'I', 'T',
+ 'S', 'U', 'C', 'C', 'E', 'E', 'D',
+ 'S', 'U', 'R', 'F', 'A', 'C', 'E',
+ 'S', 'Y', 'N', 'A', 'G', 'M', 'A',
+ 'S', 'Y', 'N', 'E', 'V', 'M', 'A',
+ 'T', 'A', 'A', 'L', 'U', 'J', 'A',
+ 'T', 'A', 'G', 'A', 'L', 'O', 'G',
+ 'T', 'A', 'I', 'S', 'Y', 'O', 'U',
+ 'T', 'A', 'L', 'E', 'N', 'T', 'S',
+ 'T', 'A', 'T', 'W', 'E', 'E', 'L',
+ 'T', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'T', 'C', 'H', 'E', 'H', 'E', 'H',
+ 'T', 'E', 'L', 'I', 'S', 'H', 'A',
+ 'T', 'E', 'S', 'S', 'E', 'R', 'A',
+ 'T', 'H', '-', 'C', 'R', 'E', 'E',
+ 'T', 'H', 'E', 'S', 'E', 'O', 'S',
+ 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'T', 'H', 'R', 'E', 'E', '-', 'D',
+ 'T', 'H', 'R', 'O', 'U', 'G', 'H',
+ 'T', 'H', 'U', 'N', 'D', 'E', 'R',
+ 'T', 'I', 'B', 'E', 'T', 'A', 'N',
+ 'T', 'I', 'N', 'A', 'G', 'M', 'A',
+ 'T', 'R', 'I', 'G', 'R', 'A', 'M',
+ 'T', 'R', 'I', 'I', 'S', 'A', 'P',
+ 'T', 'R', 'I', 'S', 'E', 'M', 'E',
+ 'T', 'T', 'U', 'D', 'D', 'A', 'G',
+ 'U', '-', 'E', 'O', '-', 'E', 'U',
+ 'U', 'B', 'A', 'D', 'A', 'M', 'A',
+ 'U', 'B', 'U', 'F', 'I', 'L', 'I',
+ 'U', 'P', 'R', 'I', 'G', 'H', 'T',
+ 'U', 'P', 'S', 'I', 'L', 'O', 'N',
+ 'U', 'P', 'W', 'A', 'R', 'D', 'S',
+ 'U', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'V', 'A', 'R', 'E', 'I', 'A', 'I',
+ 'V', 'A', 'R', 'I', 'A', 'N', 'T',
+ 'V', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'V', 'I', 'C', 'T', 'O', 'R', 'Y',
+ 'V', 'I', 'L', 'L', 'A', 'G', 'E',
+ 'V', 'I', 'S', 'A', 'R', 'G', 'A',
+ 'V', 'O', 'C', 'A', 'L', 'I', 'C',
+ 'V', 'O', 'I', 'C', 'I', 'N', 'G',
+ 'V', 'O', 'L', 'T', 'A', 'G', 'E',
+ 'W', 'A', 'I', 'T', 'I', 'N', 'G',
+ 'W', 'A', 'R', 'N', 'I', 'N', 'G',
+ 'W', 'A', 'S', 'T', 'I', 'N', 'G',
+ 'W', 'E', 'S', 'T', 'E', 'R', 'N',
+ 'W', 'H', 'E', 'E', 'L', 'E', 'D',
+ 'W', 'R', 'I', 'T', 'I', 'N', 'G',
+ 'Y', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'Y', 'I', 'D', 'D', 'I', 'S', 'H',
+ 'Y', 'P', 'O', 'R', 'R', 'O', 'I',
+ 'Z', 'H', 'I', 'V', 'E', 'T', 'E',
+ 'A', 'C', 'T', 'I', 'V', 'A', 'T', 'E',
+ 'A', 'C', 'T', 'U', 'A', 'L', 'L', 'Y',
+ 'A', 'E', 'E', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'I', 'R', 'P', 'L', 'A', 'N', 'E',
+ 'A', 'K', 'H', 'M', 'I', 'M', 'I', 'C',
+ 'A', 'L', 'L', 'I', 'A', 'N', 'C', 'E',
+ 'A', 'L', 'V', 'E', 'O', 'L', 'A', 'R',
+ 'A', 'N', 'G', 'S', 'T', 'R', 'O', 'M',
+ 'A', 'N', 'U', 'D', 'A', 'T', 'T', 'A',
+ 'A', 'N', 'U', 'S', 'V', 'A', 'R', 'A',
+ 'A', 'P', 'O', 'D', 'E', 'R', 'M', 'A',
+ 'A', 'P', 'O', 'D', 'E', 'X', 'I', 'A',
+ 'A', 'P', 'O', 'T', 'H', 'E', 'M', 'A',
+ 'A', 'P', 'P', 'R', 'O', 'A', 'C', 'H',
+ 'A', 'Q', 'U', 'A', 'R', 'I', 'U', 'S',
+ 'A', 'R', 'A', 'E', 'A', '-', 'E', 'O',
+ 'A', 'R', 'C', 'H', 'A', 'I', 'O', 'N',
+ 'A', 'R', 'G', 'O', 'T', 'E', 'R', 'I',
+ 'A', 'R', 'I', 'S', 'T', 'E', 'R', 'A',
+ 'A', 'R', 'M', 'E', 'N', 'I', 'A', 'N',
+ 'A', 'R', 'O', 'U', 'S', 'I', 'N', 'G',
+ 'A', 'S', 'S', 'A', 'L', 'L', 'A', 'M',
+ 'A', 'S', 'S', 'Y', 'R', 'I', 'A', 'N',
+ 'A', 'S', 'T', 'E', 'R', 'I', 'S', 'K',
+ 'A', 'S', 'T', 'E', 'R', 'I', 'S', 'M',
+ 'A', 'T', 'T', 'H', 'A', 'C', 'A', 'N',
+ 'A', 'V', 'A', 'G', 'R', 'A', 'H', 'A',
+ 'B', 'A', 'L', 'I', 'N', 'E', 'S', 'E',
+ 'B', 'E', 'L', 'G', 'T', 'H', 'O', 'R',
+ 'B', 'E', 'R', 'K', 'A', 'N', 'A', 'N',
+ 'B', 'E', 'V', 'E', 'R', 'A', 'G', 'E',
+ 'B', 'I', 'D', 'E', 'N', 'T', 'A', 'L',
+ 'B', 'I', 'L', 'A', 'B', 'I', 'A', 'L',
+ 'B', 'O', 'P', 'O', 'M', 'O', 'F', 'O',
+ 'B', 'O', 'U', 'N', 'D', 'A', 'R', 'Y',
+ 'B', 'U', 'G', 'I', 'N', 'E', 'S', 'E',
+ 'B', 'U', 'L', 'L', 'S', 'E', 'Y', 'E',
+ 'B', 'U', 'S', 'S', 'Y', 'E', 'R', 'U',
+ 'C', 'A', 'D', 'U', 'C', 'E', 'U', 'S',
+ 'C', 'A', 'N', 'A', 'D', 'I', 'A', 'N',
+ 'C', 'A', 'R', 'R', 'I', 'A', 'G', 'E',
+ 'C', 'A', 'U', 'L', 'D', 'R', 'O', 'N',
+ 'C', 'H', 'A', 'M', 'I', 'L', 'O', 'N',
+ 'C', 'H', 'A', 'T', 'T', 'A', 'W', 'A',
+ 'C', 'H', 'E', 'R', 'O', 'K', 'E', 'E',
+ 'C', 'H', 'O', 'R', 'E', 'V', 'M', 'A',
+ 'C', 'H', 'O', 'S', 'E', 'O', 'N', 'G',
+ 'C', 'I', 'R', 'C', 'U', 'L', 'A', 'R',
+ 'C', 'I', 'V', 'I', 'L', 'I', 'A', 'N',
+ 'C', 'L', 'I', 'M', 'A', 'C', 'U', 'S',
+ 'C', 'L', 'I', 'N', 'G', 'I', 'N', 'G',
+ 'C', 'O', 'N', 'F', 'L', 'I', 'C', 'T',
+ 'C', 'O', 'N', 'S', 'T', 'A', 'N', 'T',
+ 'C', 'O', 'N', 'T', 'A', 'I', 'N', 'S',
+ 'C', 'O', 'U', 'N', 'T', 'I', 'N', 'G',
+ 'C', 'R', 'E', 'A', 'T', 'I', 'V', 'E',
+ 'C', 'R', 'E', 'S', 'C', 'E', 'N', 'T',
+ 'C', 'R', 'O', 'S', 'S', 'I', 'N', 'G',
+ 'C', 'R', 'U', 'Z', 'E', 'I', 'R', 'O',
+ 'C', 'U', 'R', 'R', 'E', 'N', 'C', 'Y',
+ 'C', 'U', 'S', 'T', 'O', 'M', 'E', 'R',
+ 'C', 'Y', 'R', 'E', 'N', 'A', 'I', 'C',
+ 'C', 'Y', 'R', 'I', 'L', 'L', 'I', 'C',
+ 'D', 'A', 'M', 'M', 'A', 'T', 'A', 'N',
+ 'D', 'A', 'P', '-', 'B', 'U', 'O', 'N',
+ 'D', 'A', 'P', '-', 'M', 'U', 'O', 'Y',
+ 'D', 'A', 'P', '-', 'P', 'R', 'A', 'M',
+ 'D', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'D', 'D', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'D', 'E', 'C', 'E', 'M', 'B', 'E', 'R',
+ 'D', 'E', 'C', 'R', 'E', 'A', 'S', 'E',
+ 'D', 'E', 'N', 'A', 'R', 'I', 'U', 'S',
+ 'D', 'E', 'Y', 'T', 'E', 'R', 'O', 'S',
+ 'D', 'E', 'Y', 'T', 'E', 'R', 'O', 'U',
+ 'D', 'I', 'A', 'G', 'O', 'N', 'A', 'L',
+ 'D', 'I', 'A', 'M', 'E', 'T', 'E', 'R',
+ 'D', 'I', 'A', 'S', 'T', 'O', 'L', 'I',
+ 'D', 'I', 'A', 'T', 'O', 'N', 'O', 'N',
+ 'D', 'I', 'F', 'O', 'N', 'I', 'A', 'S',
+ 'D', 'I', 'G', 'O', 'R', 'G', 'O', 'N',
+ 'D', 'I', 'G', 'R', 'A', 'M', 'M', 'A',
+ 'D', 'I', 'R', 'E', 'C', 'T', 'L', 'Y',
+ 'D', 'I', 'V', 'I', 'S', 'I', 'O', 'N',
+ 'D', 'O', 'D', 'E', 'K', 'A', 'T', 'A',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '6', '7', '8',
+ 'D', 'O', 'T', 'T', 'E', 'D', '-', 'L',
+ 'D', 'O', 'T', 'T', 'E', 'D', '-', 'N',
+ 'D', 'O', 'T', 'T', 'E', 'D', '-', 'P',
+ 'D', 'R', 'A', 'C', 'H', 'M', 'A', 'S',
+ 'D', 'R', 'A', 'F', 'T', 'I', 'N', 'G',
+ 'D', 'R', 'A', 'U', 'G', 'H', 'T', 'S',
+ 'D', 'R', 'A', 'W', 'I', 'N', 'G', 'S',
+ 'D', 'U', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'D', 'V', 'I', 'S', 'V', 'A', 'R', 'A',
+ 'E', 'I', 'G', 'H', 'T', 'E', 'E', 'N',
+ 'E', 'L', 'E', 'C', 'T', 'R', 'I', 'C',
+ 'E', 'L', 'L', 'I', 'P', 'S', 'I', 'S',
+ 'E', 'M', 'P', 'H', 'A', 'S', 'I', 'S',
+ 'E', 'M', 'P', 'H', 'A', 'T', 'I', 'C',
+ 'E', 'N', 'T', 'E', 'R', 'I', 'N', 'G',
+ 'E', 'N', 'V', 'E', 'L', 'O', 'P', 'E',
+ 'E', 'P', 'E', 'G', 'E', 'R', 'M', 'A',
+ 'E', 'S', 'U', 'K', 'U', 'U', 'D', 'O',
+ 'E', 'T', 'E', 'R', 'N', 'I', 'T', 'Y',
+ 'E', 'T', 'H', 'I', 'O', 'P', 'I', 'C',
+ 'E', 'X', 'T', 'E', 'N', 'D', 'E', 'D',
+ 'F', 'A', 'T', 'H', 'A', 'T', 'A', 'N',
+ 'F', 'E', 'B', 'R', 'U', 'A', 'R', 'Y',
+ 'F', 'E', 'M', 'I', 'N', 'I', 'N', 'E',
+ 'F', 'E', 'S', 'T', 'I', 'V', 'A', 'L',
+ 'F', 'I', 'G', 'U', 'R', 'E', '-', '1',
+ 'F', 'I', 'G', 'U', 'R', 'E', '-', '2',
+ 'F', 'I', 'G', 'U', 'R', 'E', '-', '3',
+ 'F', 'I', 'N', 'G', 'E', 'R', 'E', 'D',
+ 'F', 'I', 'S', 'H', 'H', 'O', 'O', 'K',
+ 'F', 'L', 'A', 'T', 'N', 'E', 'S', 'S',
+ 'F', 'L', 'O', 'R', 'E', 'T', 'T', 'E',
+ 'F', 'L', 'O', 'U', 'R', 'I', 'S', 'H',
+ 'F', 'O', 'O', 'T', 'N', 'O', 'T', 'E',
+ 'F', 'O', 'U', 'R', 'T', 'E', 'E', 'N',
+ 'F', 'R', 'A', 'C', 'T', 'I', 'O', 'N',
+ 'F', 'R', 'A', 'G', 'M', 'E', 'N', 'T',
+ 'F', 'R', 'A', 'G', 'R', 'A', 'N', 'T',
+ 'F', 'R', 'O', 'W', 'N', 'I', 'N', 'G',
+ 'F', 'U', 'L', 'L', 'N', 'E', 'S', 'S',
+ 'F', 'U', 'N', 'C', 'T', 'I', 'O', 'N',
+ 'G', 'A', 'R', 'S', 'H', 'U', 'N', 'I',
+ 'G', 'A', 'U', 'N', 'T', 'L', 'E', 'T',
+ 'G', 'E', 'N', 'I', 'T', 'I', 'V', 'E',
+ 'G', 'E', 'O', 'R', 'G', 'I', 'A', 'N',
+ 'G', 'R', 'A', 'P', 'H', 'E', 'M', 'E',
+ 'G', 'U', 'J', 'A', 'R', 'A', 'T', 'I',
+ 'G', 'U', 'R', 'M', 'U', 'K', 'H', 'I',
+ 'H', 'A', 'N', '-', 'A', 'K', 'A', 'T',
+ 'H', 'A', 'N', 'G', 'Z', 'H', 'O', 'U',
+ 'H', 'A', 'R', 'D', 'N', 'E', 'S', 'S',
+ 'H', 'A', 'R', 'K', 'L', 'E', 'A', 'N',
+ 'H', 'A', 'R', 'M', 'O', 'N', 'I', 'C',
+ 'H', 'E', 'A', 'V', 'E', 'N', 'L', 'Y',
+ 'H', 'E', 'X', 'A', 'G', 'R', 'A', 'M',
+ 'H', 'I', 'R', 'A', 'G', 'A', 'N', 'A',
+ 'H', 'U', 'A', 'R', 'A', 'D', 'D', 'O',
+ 'I', 'D', 'E', 'O', 'G', 'R', 'A', 'M',
+ 'I', 'L', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'M', 'I', 'F', 'O', 'N', 'O', 'N',
+ 'I', 'N', 'C', 'R', 'E', 'A', 'S', 'E',
+ 'I', 'N', 'D', 'I', 'R', 'E', 'C', 'T',
+ 'I', 'N', 'F', 'I', 'N', 'I', 'T', 'Y',
+ 'I', 'N', 'H', 'E', 'R', 'E', 'N', 'T',
+ 'I', 'N', 'T', 'E', 'G', 'R', 'A', 'L',
+ 'I', 'N', 'T', 'E', 'R', 'E', 'S', 'T',
+ 'I', 'N', 'T', 'E', 'R', 'I', 'O', 'R',
+ 'I', 'N', 'V', 'E', 'R', 'T', 'E', 'D',
+ 'I', 'O', 'T', 'I', 'F', 'I', 'E', 'D',
+ 'I', 'R', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'S', '-', 'P', 'I', 'L', 'L', 'A',
+ 'I', 'S', 'O', 'L', 'A', 'T', 'E', 'D',
+ 'J', 'A', 'P', 'A', 'N', 'E', 'S', 'E',
+ 'J', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'K', 'A', 'S', 'R', 'A', 'T', 'A', 'N',
+ 'K', 'A', 'T', 'A', 'K', 'A', 'N', 'A',
+ 'K', 'A', 'T', 'H', 'I', 'S', 'T', 'I',
+ 'K', 'E', 'Y', 'B', 'O', 'A', 'R', 'D',
+ 'K', 'O', 'N', 'T', 'E', 'V', 'M', 'A',
+ 'K', 'O', 'U', 'F', 'I', 'S', 'M', 'A',
+ 'K', 'R', 'E', 'M', 'A', 'S', 'T', 'I',
+ 'L', '-', 'S', 'H', 'A', 'P', 'E', 'D',
+ 'L', 'A', 'N', 'G', 'U', 'A', 'G', 'E',
+ 'L', 'A', 'T', 'I', 'N', 'A', 'T', 'E',
+ 'L', 'I', 'G', 'A', 'T', 'U', 'R', 'E',
+ 'L', 'O', 'C', 'A', 'T', 'I', 'O', 'N',
+ 'L', 'O', 'C', 'A', 'T', 'I', 'V', 'E',
+ 'L', 'O', 'G', 'O', 'T', 'Y', 'P', 'E',
+ 'L', 'O', 'R', 'R', 'A', 'I', 'N', 'E',
+ 'M', 'A', 'H', 'A', 'P', 'A', 'K', 'H',
+ 'M', 'A', 'I', 'M', 'A', 'L', 'A', 'I',
+ 'M', 'A', 'I', 'Y', 'A', 'M', 'O', 'K',
+ 'M', 'A', 'N', 'A', 'C', 'L', 'E', 'S',
+ 'M', 'A', 'N', 'G', 'A', 'L', 'A', 'M',
+ 'M', 'A', 'R', 'R', 'I', 'A', 'G', 'E',
+ 'M', 'A', 'R', 'R', 'Y', 'I', 'N', 'G',
+ 'M', 'A', 'R', 'T', 'Y', 'R', 'I', 'A',
+ 'M', 'E', 'A', 'S', 'U', 'R', 'E', 'D',
+ 'M', 'E', 'D', 'I', 'C', 'I', 'N', 'E',
+ 'M', 'E', 'T', 'R', 'E', 'T', 'E', 'S',
+ 'M', 'E', 'T', 'R', 'I', 'C', 'A', 'L',
+ 'M', 'I', 'L', 'L', 'I', 'O', 'N', 'S',
+ 'M', 'I', 'N', 'I', 'S', 'T', 'E', 'R',
+ 'M', 'O', 'D', 'I', 'F', 'I', 'E', 'R',
+ 'M', 'O', 'H', 'A', 'M', 'M', 'A', 'D',
+ 'M', 'O', 'N', 'O', 'G', 'R', 'A', 'M',
+ 'M', 'O', 'U', 'N', 'T', 'A', 'I', 'N',
+ 'M', 'U', 'L', 'T', 'I', 'M', 'A', 'P',
+ 'M', 'U', 'L', 'T', 'I', 'P', 'L', 'E',
+ 'M', 'U', 'L', 'T', 'I', 'S', 'E', 'T',
+ 'N', 'A', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'N', 'E', 'G', 'A', 'T', 'I', 'O', 'N',
+ 'N', 'E', 'G', 'A', 'T', 'I', 'V', 'E',
+ 'N', 'I', 'K', 'H', 'A', 'H', 'I', 'T',
+ 'N', 'I', 'N', 'E', 'T', 'E', 'E', 'N',
+ 'N', 'O', '-', 'B', 'R', 'E', 'A', 'K',
+ 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'N', 'O', 'T', 'E', 'H', 'E', 'A', 'D',
+ 'N', 'O', 'V', 'E', 'M', 'B', 'E', 'R',
+ 'O', 'M', 'I', 'S', 'S', 'I', 'O', 'N',
+ 'O', 'N', 'E', '-', 'L', 'I', 'N', 'E',
+ 'O', 'P', 'E', 'R', 'A', 'T', 'O', 'R',
+ 'O', 'P', 'P', 'O', 'S', 'I', 'N', 'G',
+ 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L',
+ 'O', 'R', 'N', 'A', 'M', 'E', 'N', 'T',
+ 'O', 'R', 'T', 'H', 'O', 'D', 'O', 'X',
+ 'O', 'U', 'T', 'L', 'I', 'N', 'E', 'D',
+ 'O', 'V', 'E', 'R', 'L', 'A', 'I', 'D',
+ 'O', 'V', 'E', 'R', 'L', 'I', 'N', 'E',
+ 'O', 'V', 'E', 'R', 'R', 'I', 'D', 'E',
+ 'P', 'A', 'A', 'S', 'E', 'N', 'T', 'O',
+ 'P', 'A', 'I', 'R', 'T', 'H', 'R', 'A',
+ 'P', 'A', 'L', 'O', 'C', 'H', 'K', 'A',
+ 'P', 'A', 'M', 'E', 'N', 'E', 'N', 'G',
+ 'P', 'A', 'M', 'U', 'D', 'P', 'O', 'D',
+ 'P', 'A', 'N', 'G', 'H', 'U', 'L', 'U',
+ 'P', 'A', 'N', 'O', 'L', 'O', 'N', 'G',
+ 'P', 'A', 'N', 'Y', 'A', 'K', 'R', 'A',
+ 'P', 'A', 'N', 'Y', 'E', 'C', 'E', 'K',
+ 'P', 'A', 'R', 'A', 'L', 'L', 'E', 'L',
+ 'P', 'A', 'R', 'I', 'C', 'H', 'O', 'N',
+ 'P', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'P', 'E', 'D', 'E', 'S', 'T', 'A', 'L',
+ 'P', 'E', 'L', 'A', 'S', 'T', 'O', 'N',
+ 'P', 'E', 'N', 'T', 'A', 'G', 'O', 'N',
+ 'P', 'E', 'R', 'F', 'E', 'C', 'T', 'A',
+ 'P', 'E', 'T', 'A', 'L', 'L', 'E', 'D',
+ 'P', 'H', 'A', 'A', 'R', 'K', 'A', 'A',
+ 'P', 'H', 'A', 'G', 'S', '-', 'P', 'A',
+ 'P', 'H', 'A', 'I', 'S', 'T', 'O', 'S',
+ 'P', 'I', 'N', 'W', 'H', 'E', 'E', 'L',
+ 'P', 'L', 'A', 'S', 'T', 'I', 'C', 'S',
+ 'P', 'L', 'E', 'T', 'H', 'R', 'O', 'N',
+ 'P', 'N', 'E', 'U', 'M', 'A', 'T', 'A',
+ 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'P', 'O', 'K', 'R', 'Y', 'T', 'I', 'E',
+ 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'A', 'M', '-', 'B', 'E', 'I',
+ 'P', 'R', 'A', 'M', '-', 'P', 'I', 'I',
+ 'P', 'R', 'E', 'C', 'E', 'D', 'E', 'D',
+ 'P', 'R', 'E', 'C', 'E', 'D', 'E', 'S',
+ 'P', 'R', 'E', 'V', 'I', 'O', 'U', 'S',
+ 'P', 'R', 'O', 'F', 'O', 'U', 'N', 'D',
+ 'P', 'R', 'O', 'G', 'R', 'E', 'S', 'S',
+ 'P', 'R', 'O', 'P', 'E', 'R', 'T', 'Y',
+ 'Q', 'A', 'I', 'R', 'T', 'H', 'R', 'A',
+ 'Q', 'U', 'A', 'D', 'R', 'A', 'N', 'T',
+ 'Q', 'U', 'A', 'R', 'T', 'E', 'R', 'S',
+ 'Q', 'U', 'E', 'S', 'T', 'I', 'O', 'N',
+ 'Q', 'U', 'I', 'N', 'C', 'U', 'N', 'X',
+ 'R', 'E', 'C', 'O', 'R', 'D', 'E', 'R',
+ 'R', 'E', 'C', 'Y', 'C', 'L', 'E', 'D',
+ 'R', 'E', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'R', 'E', 'L', 'I', 'G', 'I', 'O', 'N',
+ 'R', 'E', 'N', 'T', 'O', 'G', 'E', 'N',
+ 'R', 'E', 'P', 'E', 'A', 'T', 'E', 'D',
+ 'R', 'E', 'S', 'O', 'U', 'R', 'C', 'E',
+ 'R', 'E', 'S', 'P', 'O', 'N', 'S', 'E',
+ 'R', 'E', 'V', 'E', 'R', 'S', 'E', 'D',
+ 'R', 'U', 'K', 'K', 'A', 'K', 'H', 'A',
+ 'S', '-', 'S', 'H', 'A', 'P', 'E', 'D',
+ 'S', 'A', 'L', 'T', 'I', 'L', 'L', 'O',
+ 'S', 'A', 'N', 'T', 'I', 'I', 'M', 'U',
+ 'S', 'A', 'N', 'Y', 'O', 'O', 'G', 'A',
+ 'S', 'A', 'X', 'I', 'M', 'A', 'T', 'A',
+ 'S', 'C', 'I', 'S', 'S', 'O', 'R', 'S',
+ 'S', 'C', 'O', 'R', 'P', 'I', 'U', 'S',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R',
+ 'S', 'E', 'M', 'I', 'S', 'O', 'F', 'T',
+ 'S', 'E', 'M', 'U', 'N', 'C', 'I', 'A',
+ 'S', 'H', 'A', 'D', 'O', 'W', 'E', 'D',
+ 'S', 'H', 'A', 'M', 'R', 'O', 'C', 'K',
+ 'S', 'H', 'E', '-', 'G', 'O', 'A', 'T',
+ 'S', 'H', 'E', 'S', 'H', 'L', 'A', 'M',
+ 'S', 'I', 'C', 'K', 'N', 'E', 'S', 'S',
+ 'S', 'I', 'D', 'E', 'W', 'A', 'Y', 'S',
+ 'S', 'I', 'M', 'A', 'N', 'S', 'I', 'S',
+ 'S', 'I', 'X', '-', 'L', 'I', 'N', 'E',
+ 'S', 'L', 'A', 'V', 'O', 'N', 'I', 'C',
+ 'S', 'Q', 'U', 'I', 'G', 'G', 'L', 'E',
+ 'S', 'Q', 'U', 'I', 'R', 'R', 'E', 'L',
+ 'S', 'T', 'A', 'C', 'C', 'A', 'T', 'O',
+ 'S', 'T', 'A', 'L', 'L', 'I', 'O', 'N',
+ 'S', 'T', 'A', 'N', 'D', 'A', 'R', 'D',
+ 'S', 'T', 'O', 'P', 'P', 'A', 'G', 'E',
+ 'S', 'T', 'O', 'P', 'P', 'I', 'N', 'G',
+ 'S', 'T', 'R', 'A', 'I', 'G', 'H', 'T',
+ 'S', 'T', 'R', 'A', 'I', 'N', 'E', 'R',
+ 'S', 'T', 'R', 'A', 'T', 'I', 'A', 'N',
+ 'S', 'T', 'R', 'E', 'N', 'G', 'T', 'H',
+ 'S', 'T', 'R', 'I', 'C', 'T', 'L', 'Y',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '1',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '2',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '3',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '4',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '5',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '6',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '7',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '8',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '9',
+ 'S', 'U', 'B', 'G', 'R', 'O', 'U', 'P',
+ 'S', 'U', 'C', 'C', 'E', 'E', 'D', 'S',
+ 'S', 'U', 'I', 'T', 'A', 'B', 'L', 'E',
+ 'S', 'U', 'P', 'E', 'R', 'S', 'E', 'T',
+ 'S', 'U', 'R', 'R', 'O', 'U', 'N', 'D',
+ 'S', 'W', 'A', 'P', 'P', 'I', 'N', 'G',
+ 'S', 'Y', 'L', 'L', 'A', 'B', 'L', 'E',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '6',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '8',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '9',
+ 'S', 'Y', 'M', 'M', 'E', 'T', 'R', 'Y',
+ 'T', 'A', 'G', 'B', 'A', 'N', 'W', 'A',
+ 'T', 'A', 'I', 'L', 'L', 'E', 'S', 'S',
+ 'T', 'A', 'T', 'T', 'O', 'O', 'E', 'D',
+ 'T', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'T', 'E', 'S', 'S', 'A', 'R', 'O', 'N',
+ 'T', 'E', 'T', 'A', 'R', 'T', 'O', 'S',
+ 'T', 'E', 'T', 'R', 'A', 'P', 'L', 'I',
+ 'T', 'H', 'E', 'S', 'P', 'I', 'A', 'N',
+ 'T', 'H', 'I', 'R', 'T', 'E', 'E', 'N',
+ 'T', 'H', 'O', 'U', 'S', 'A', 'N', 'D',
+ 'T', 'H', 'U', 'R', 'I', 'S', 'A', 'Z',
+ 'T', 'I', 'F', 'I', 'N', 'A', 'G', 'H',
+ 'T', 'I', 'R', 'O', 'N', 'I', 'A', 'N',
+ 'T', 'O', 'G', 'E', 'T', 'H', 'E', 'R',
+ 'T', 'O', 'R', 'C', 'U', 'L', 'U', 'S',
+ 'T', 'O', 'R', 'T', 'O', 'I', 'S', 'E',
+ 'T', 'R', 'E', 'A', 'D', 'I', 'N', 'G',
+ 'T', 'R', 'E', 'S', 'I', 'L', 'L', 'O',
+ 'T', 'R', 'I', 'A', 'N', 'G', 'L', 'E',
+ 'T', 'R', 'I', 'C', 'O', 'L', 'O', 'N',
+ 'T', 'R', 'I', 'S', 'I', 'M', 'O', 'U',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'N',
+ 'T', 'R', 'Y', 'B', 'L', 'I', 'O', 'N',
+ 'T', 'T', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'T', 'T', 'U', 'D', 'D', 'A', 'A', 'G',
+ 'T', 'V', 'I', 'M', 'A', 'D', 'U', 'R',
+ 'T', 'W', 'O', '-', 'L', 'I', 'N', 'E',
+ 'U', 'G', 'A', 'R', 'I', 'T', 'I', 'C',
+ 'U', 'I', 'L', 'L', 'E', 'A', 'N', 'N',
+ 'U', 'M', 'B', 'R', 'E', 'L', 'L', 'A',
+ 'U', 'N', 'D', 'E', 'R', 'B', 'A', 'R',
+ 'U', 'N', 'D', 'E', 'R', 'D', 'O', 'T',
+ 'U', 'N', 'D', 'E', 'R', 'T', 'I', 'E',
+ 'V', 'A', 'S', 'T', 'N', 'E', 'S', 'S',
+ 'V', 'E', 'R', 'S', 'I', 'C', 'L', 'E',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L',
+ 'V', 'I', 'E', 'W', 'D', 'A', 'T', 'A',
+ 'W', 'A', 'N', 'D', 'E', 'R', 'E', 'R',
+ 'W', 'A', 'S', 'A', 'L', 'L', 'A', 'M',
+ 'Y', 'A', 'M', 'A', 'K', 'K', 'A', 'N',
+ 'Y', 'E', 'S', 'I', 'E', 'U', 'N', 'G',
+ 'Y', 'O', 'U', 'T', 'H', 'F', 'U', 'L',
+ 'Z', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'Z', 'W', 'A', 'R', 'A', 'K', 'A', 'Y',
+ 'A', 'A', 'B', 'A', 'A', 'F', 'I', 'L', 'I',
+ 'A', 'B', 'K', 'H', 'A', 'S', 'I', 'A', 'N',
+ 'A', 'B', 'U', 'N', 'D', 'A', 'N', 'C', 'E',
+ 'A', 'D', 'D', 'R', 'E', 'S', 'S', 'E', 'D',
+ 'A', 'L', '-', 'L', 'A', 'K', 'U', 'N', 'A',
+ 'A', 'L', 'P', 'A', 'P', 'R', 'A', 'N', 'A',
+ 'A', 'L', 'T', 'E', 'R', 'N', 'A', 'T', 'E',
+ 'A', 'M', 'P', 'E', 'R', 'S', 'A', 'N', 'D',
+ 'A', 'N', 'T', 'I', 'F', 'O', 'N', 'I', 'A',
+ 'A', 'R', '-', 'R', 'A', 'H', 'E', 'E', 'M',
+ 'A', 'R', '-', 'R', 'A', 'H', 'M', 'A', 'N',
+ 'A', 'R', 'R', 'O', 'W', 'H', 'E', 'A', 'D',
+ 'A', 'S', 'C', 'E', 'N', 'D', 'I', 'N', 'G',
+ 'A', 'S', 'P', 'I', 'R', 'A', 'T', 'E', 'D',
+ 'A', 'S', 'S', 'E', 'R', 'T', 'I', 'O', 'N',
+ 'A', 'S', 'T', 'E', 'R', 'I', 'S', 'K', 'S',
+ 'A', 'T', 'T', 'E', 'N', 'T', 'I', 'O', 'N',
+ 'B', 'A', 'C', 'K', 'S', 'L', 'A', 'S', 'H',
+ 'B', 'A', 'C', 'K', 'S', 'P', 'A', 'C', 'E',
+ 'B', 'E', 'G', 'I', 'N', 'N', 'I', 'N', 'G',
+ 'B', 'I', 'N', 'O', 'C', 'U', 'L', 'A', 'R',
+ 'B', 'I', 'O', 'H', 'A', 'Z', 'A', 'R', 'D',
+ 'B', 'I', 'S', 'E', 'C', 'T', 'I', 'N', 'G',
+ 'B', 'I', 'S', 'M', 'I', 'L', 'L', 'A', 'H',
+ 'B', 'L', 'A', 'C', 'K', 'F', 'O', 'O', 'T',
+ 'B', 'O', 'O', 'M', 'E', 'R', 'A', 'N', 'G',
+ 'B', 'R', 'A', 'N', 'C', 'H', 'I', 'N', 'G',
+ 'B', 'Y', 'Z', 'A', 'N', 'T', 'I', 'N', 'E',
+ 'C', 'A', 'P', 'R', 'I', 'C', 'O', 'R', 'N',
+ 'C', 'A', 'R', 'P', 'E', 'N', 'T', 'R', 'Y',
+ 'C', 'A', 'R', 'Y', 'S', 'T', 'I', 'A', 'N',
+ 'C', 'E', 'N', 'T', 'U', 'R', 'I', 'A', 'L',
+ 'C', 'H', 'A', 'R', 'A', 'C', 'T', 'E', 'R',
+ 'C', 'H', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'C', 'L', 'O', 'C', 'K', 'W', 'I', 'S', 'E',
+ 'C', 'L', 'O', 'S', 'E', 'N', 'E', 'S', 'S',
+ 'C', 'O', 'M', 'B', 'I', 'N', 'I', 'N', 'G',
+ 'C', 'O', 'M', 'P', 'L', 'E', 'T', 'E', 'D',
+ 'C', 'O', 'N', 'G', 'R', 'U', 'E', 'N', 'T',
+ 'C', 'O', 'N', 'J', 'U', 'G', 'A', 'T', 'E',
+ 'C', 'O', 'N', 'S', 'O', 'N', 'A', 'N', 'T',
+ 'C', 'O', 'N', 'S', 'T', 'A', 'N', 'C', 'Y',
+ 'C', 'O', 'N', 'T', 'O', 'U', 'R', 'E', 'D',
+ 'C', 'O', 'P', 'R', 'O', 'D', 'U', 'C', 'T',
+ 'C', 'O', 'P', 'Y', 'R', 'I', 'G', 'H', 'T',
+ 'C', 'R', 'E', 'S', 'C', 'E', 'N', 'D', 'O',
+ 'C', 'U', 'A', 'T', 'R', 'I', 'L', 'L', 'O',
+ 'C', 'U', 'N', 'E', 'I', 'F', 'O', 'R', 'M',
+ 'D', 'A', 'H', 'Y', 'A', 'A', 'U', 'S', 'H',
+ 'D', 'A', 'R', 'K', 'E', 'N', 'I', 'N', 'G',
+ 'D', 'E', 'L', 'I', 'M', 'I', 'T', 'E', 'R',
+ 'D', 'E', 'N', 'T', 'I', 'S', 'T', 'R', 'Y',
+ 'D', 'E', 'P', 'A', 'R', 'T', 'I', 'N', 'G',
+ 'D', 'E', 'P', 'A', 'R', 'T', 'U', 'R', 'E',
+ 'D', 'E', 'S', 'C', 'E', 'N', 'D', 'E', 'R',
+ 'D', 'I', 'A', 'E', 'R', 'E', 'S', 'I', 'S',
+ 'D', 'I', 'A', 'L', 'E', 'C', 'T', '-', 'P',
+ 'D', 'I', 'A', 'L', 'Y', 'T', 'I', 'K', 'A',
+ 'D', 'I', 'A', 'T', 'O', 'N', 'I', 'K', 'I',
+ 'D', 'I', 'F', 'T', 'O', 'G', 'G', 'O', 'S',
+ 'D', 'I', 'G', 'R', 'A', 'M', 'M', 'O', 'S',
+ 'D', 'I', 'M', 'E', 'N', 'S', 'I', 'O', 'N',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '5', '6', '7', '8',
+ 'D', 'O', 'W', 'N', 'W', 'A', 'R', 'D', 'S',
+ 'D', 'U', 'P', 'O', 'N', 'D', 'I', 'U', 'S',
+ 'E', 'D', 'I', 'T', 'O', 'R', 'I', 'A', 'L',
+ 'E', 'E', 'B', 'E', 'E', 'F', 'I', 'L', 'I',
+ 'E', 'M', 'B', 'E', 'D', 'D', 'I', 'N', 'G',
+ 'E', 'N', 'C', 'L', 'O', 'S', 'I', 'N', 'G',
+ 'E', 'N', 'C', 'L', 'O', 'S', 'U', 'R', 'E',
+ 'E', 'N', 'D', 'E', 'A', 'V', 'O', 'U', 'R',
+ 'E', 'N', 'D', 'O', 'F', 'O', 'N', 'O', 'N',
+ 'E', 'S', 'T', 'I', 'M', 'A', 'T', 'E', 'D',
+ 'E', 'S', 'T', 'I', 'M', 'A', 'T', 'E', 'S',
+ 'E', 'X', 'C', 'E', 'L', 'L', 'E', 'N', 'T',
+ 'E', 'X', 'T', 'E', 'N', 'S', 'I', 'O', 'N',
+ 'E', 'X', 'T', 'R', 'A', '-', 'L', 'O', 'W',
+ 'E', 'Y', 'B', 'E', 'Y', 'F', 'I', 'L', 'I',
+ 'F', 'A', 'C', 'S', 'I', 'M', 'I', 'L', 'E',
+ 'F', 'A', 'N', 'E', 'R', 'O', 'S', 'I', 'S',
+ 'F', 'I', 'N', 'A', 'N', 'C', 'I', 'A', 'L',
+ 'F', 'I', 'V', 'E', '-', 'L', 'I', 'N', 'E',
+ 'F', 'L', 'A', 'T', 'T', 'E', 'N', 'E', 'D',
+ 'F', 'O', 'L', 'L', 'O', 'W', 'I', 'N', 'G',
+ 'F', 'O', 'O', 'T', 'S', 'T', 'O', 'O', 'L',
+ 'F', 'O', 'S', 'T', 'E', 'R', 'I', 'N', 'G',
+ 'F', 'O', 'U', 'R', '-', 'L', 'I', 'N', 'E',
+ 'F', 'R', 'E', 'T', 'B', 'O', 'A', 'R', 'D',
+ 'F', 'R', 'I', 'C', 'A', 'T', 'I', 'V', 'E',
+ 'F', 'U', 'L', 'L', 'W', 'I', 'D', 'T', 'H',
+ 'G', 'A', 'T', 'H', 'E', 'R', 'I', 'N', 'G',
+ 'G', 'E', 'O', 'M', 'E', 'T', 'R', 'I', 'C',
+ 'G', 'E', 'R', 'S', 'H', 'A', 'Y', 'I', 'M',
+ 'G', 'L', 'I', 'S', 'S', 'A', 'N', 'D', 'O',
+ 'G', 'N', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'G', 'O', 'R', 'G', 'O', 'T', 'E', 'R', 'I',
+ 'G', 'R', 'E', 'A', 'T', 'N', 'E', 'S', 'S',
+ 'G', 'R', 'E', 'G', 'O', 'R', 'I', 'A', 'N',
+ 'G', 'U', 'R', 'A', 'M', 'U', 'T', 'O', 'N',
+ 'H', 'A', 'L', 'F', 'W', 'I', 'D', 'T', 'H',
+ 'H', 'E', 'K', 'U', 'T', 'A', 'A', 'R', 'U',
+ 'H', 'E', 'R', 'M', 'I', 'T', 'I', 'A', 'N',
+ 'H', 'O', 'U', 'R', 'G', 'L', 'A', 'S', 'S',
+ 'I', 'C', 'H', 'I', 'M', 'A', 'T', 'O', 'S',
+ 'I', 'D', 'E', 'N', 'T', 'I', 'C', 'A', 'L',
+ 'I', 'D', 'E', 'O', 'G', 'R', 'A', 'P', 'H',
+ 'I', 'L', 'U', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'M', 'I', 'F', 'T', 'H', 'O', 'R', 'A',
+ 'I', 'N', 'C', 'L', 'U', 'D', 'I', 'N', 'G',
+ 'I', 'N', 'C', 'R', 'E', 'A', 'S', 'E', 'S',
+ 'I', 'N', 'C', 'R', 'E', 'M', 'E', 'N', 'T',
+ 'I', 'N', 'D', 'I', 'C', 'A', 'T', 'O', 'R',
+ 'I', 'N', 'F', 'L', 'U', 'E', 'N', 'C', 'E',
+ 'I', 'N', 'N', 'O', 'C', 'E', 'N', 'C', 'E',
+ 'I', 'N', 'S', 'E', 'R', 'T', 'I', 'O', 'N',
+ 'I', 'N', 'V', 'I', 'S', 'I', 'B', 'L', 'E',
+ 'I', 'R', 'U', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'T', 'E', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'J', 'E', 'R', 'U', 'S', 'A', 'L', 'E', 'M',
+ 'J', 'O', 'N', 'G', 'S', 'E', 'O', 'N', 'G',
+ 'J', 'U', 'N', 'G', 'S', 'E', 'O', 'N', 'G',
+ 'K', 'A', 'T', 'A', 'V', 'A', 'S', 'M', 'A',
+ 'K', 'E', 'M', 'P', 'H', 'R', 'E', 'N', 'G',
+ 'K', 'E', 'N', 'T', 'I', 'M', 'A', 'T', 'A',
+ 'K', 'I', 'R', 'O', 'W', 'A', 'T', 'T', 'O',
+ 'K', 'R', 'A', 'T', 'I', 'M', 'A', 'T', 'A',
+ 'K', 'U', 'R', 'U', 'Z', 'E', 'I', 'R', 'O',
+ 'L', 'A', 'B', 'O', 'U', 'R', 'I', 'N', 'G',
+ 'L', 'A', 'R', 'Y', 'N', 'G', 'E', 'A', 'L',
+ 'L', 'E', 'F', 'T', '-', 'H', 'A', 'N', 'D',
+ 'L', 'E', 'F', 'T', '-', 'S', 'I', 'D', 'E',
+ 'L', 'E', 'F', 'T', '-', 'S', 'T', 'E', 'M',
+ 'L', 'E', 'F', 'T', 'W', 'A', 'R', 'D', 'S',
+ 'L', 'E', 'S', 'S', '-', 'T', 'H', 'A', 'N',
+ 'L', 'H', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'L', 'I', 'A', 'B', 'I', 'L', 'I', 'T', 'Y',
+ 'L', 'I', 'G', 'H', 'T', 'N', 'I', 'N', 'G',
+ 'M', 'A', 'H', 'A', 'P', 'R', 'A', 'N', 'A',
+ 'M', 'A', 'I', 'T', 'A', 'I', 'K', 'H', 'U',
+ 'M', 'A', 'L', 'A', 'Y', 'A', 'L', 'A', 'M',
+ 'M', 'A', 'S', 'C', 'U', 'L', 'I', 'N', 'E',
+ 'M', 'A', 'T', 'E', 'R', 'I', 'A', 'L', 'S',
+ 'M', 'E', 'S', 'S', 'E', 'N', 'I', 'A', 'N',
+ 'M', 'E', 'T', 'O', 'B', 'E', 'L', 'U', 'S',
+ 'M', 'I', 'R', 'I', 'B', 'A', 'A', 'R', 'U',
+ 'M', 'O', 'N', 'G', 'O', 'L', 'I', 'A', 'N',
+ 'M', 'O', 'N', 'O', 'C', 'U', 'L', 'A', 'R',
+ 'M', 'O', 'N', 'O', 'G', 'R', 'A', 'P', 'H',
+ 'M', 'O', 'N', 'O', 'S', 'P', 'A', 'C', 'E',
+ 'M', 'U', 'K', 'P', 'H', 'R', 'E', 'N', 'G',
+ 'M', 'U', 'U', 'R', 'D', 'H', 'A', 'J', 'A',
+ 'N', 'I', 'G', 'G', 'A', 'H', 'I', 'T', 'A',
+ 'N', 'I', 'G', 'I', 'D', 'A', 'E', 'S', 'H',
+ 'N', 'I', 'G', 'I', 'D', 'A', 'M', 'I', 'N',
+ 'N', 'O', 'R', 'T', 'H', 'W', 'E', 'S', 'T',
+ 'N', 'U', 'M', 'E', 'R', 'A', 'T', 'O', 'R',
+ 'O', 'A', 'B', 'O', 'A', 'F', 'I', 'L', 'I',
+ 'O', 'O', 'B', 'O', 'O', 'F', 'I', 'L', 'I',
+ 'O', 'Y', 'R', 'A', 'N', 'I', 'S', 'M', 'A',
+ 'P', 'A', 'A', '-', 'P', 'I', 'L', 'L', 'A',
+ 'P', 'A', 'I', 'Y', 'A', 'N', 'N', 'O', 'I',
+ 'P', 'A', 'M', 'I', 'N', 'G', 'K', 'A', 'L',
+ 'P', 'A', 'M', 'U', 'N', 'G', 'K', 'A', 'H',
+ 'P', 'A', 'N', 'G', 'L', 'A', 'Y', 'A', 'R',
+ 'P', 'A', 'N', 'G', 'W', 'I', 'S', 'A', 'D',
+ 'P', 'A', 'R', 'A', 'G', 'R', 'A', 'P', 'H',
+ 'P', 'E', 'N', 'T', 'A', 'S', 'E', 'M', 'E',
+ 'P', 'E', 'R', 'F', 'E', 'C', 'T', 'U', 'M',
+ 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T',
+ 'P', 'I', 'A', 'S', 'U', 'T', 'O', 'R', 'U',
+ 'P', 'I', 'T', 'C', 'H', 'F', 'O', 'R', 'K',
+ 'P', 'I', 'Z', 'Z', 'I', 'C', 'A', 'T', 'O',
+ 'P', 'O', 'R', 'R', 'E', 'C', 'T', 'U', 'S',
+ 'P', 'R', 'A', 'M', '-', 'B', 'U', 'O', 'N',
+ 'P', 'R', 'A', 'M', '-', 'M', 'U', 'O', 'Y',
+ 'P', 'R', 'E', 'C', 'E', 'D', 'I', 'N', 'G',
+ 'P', 'R', 'O', 'L', 'O', 'N', 'G', 'E', 'D',
+ 'P', 'R', 'O', 'P', 'E', 'L', 'L', 'E', 'R',
+ 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'N',
+ 'Q', 'U', 'A', 'D', 'R', 'U', 'P', 'L', 'E',
+ 'Q', 'U', 'I', 'N', 'A', 'R', 'I', 'U', 'S',
+ 'Q', 'U', 'O', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'Q', 'U', 'S', 'H', 'S', 'H', 'A', 'Y', 'A',
+ 'R', 'E', 'C', 'E', 'P', 'T', 'I', 'V', 'E',
+ 'R', 'E', 'C', 'O', 'R', 'D', 'I', 'N', 'G',
+ 'R', 'E', 'C', 'T', 'A', 'N', 'G', 'L', 'E',
+ 'R', 'E', 'C', 'Y', 'C', 'L', 'I', 'N', 'G',
+ 'R', 'E', 'F', 'E', 'R', 'E', 'N', 'C', 'E',
+ 'R', 'E', 'P', 'R', 'E', 'S', 'E', 'N', 'T',
+ 'R', 'E', 'S', 'I', 'D', 'E', 'N', 'C', 'E',
+ 'R', 'E', 'S', 'U', 'P', 'I', 'N', 'U', 'S',
+ 'R', 'E', 'T', 'R', 'O', 'F', 'L', 'E', 'X',
+ 'R', 'I', 'G', 'H', 'T', 'H', 'A', 'N', 'D',
+ 'S', 'A', 'M', 'A', 'R', 'I', 'T', 'A', 'N',
+ 'S', 'C', 'A', 'N', 'D', 'I', 'C', 'U', 'S',
+ 'S', 'E', 'B', 'A', 'T', 'B', 'E', 'I', 'T',
+ 'S', 'E', 'M', 'I', 'C', 'O', 'L', 'O', 'N',
+ 'S', 'E', 'M', 'I', 'V', 'O', 'W', 'E', 'L',
+ 'S', 'E', 'P', 'A', 'R', 'A', 'T', 'O', 'R',
+ 'S', 'E', 'P', 'T', 'E', 'M', 'B', 'E', 'R',
+ 'S', 'E', 'V', 'E', 'N', 'T', 'E', 'E', 'N',
+ 'S', 'E', 'V', 'E', 'R', 'A', 'N', 'C', 'E',
+ 'S', 'H', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'S', 'H', 'O', 'R', 'T', 'E', 'N', 'E', 'R',
+ 'S', 'I', 'X', 'T', 'E', 'E', 'N', 'T', 'H',
+ 'S', 'N', 'O', 'W', 'F', 'L', 'A', 'K', 'E',
+ 'S', 'P', 'H', 'E', 'R', 'I', 'C', 'A', 'L',
+ 'S', 'P', 'L', 'I', 'T', 'T', 'I', 'N', 'G',
+ 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'S', 'T', 'R', 'E', 'T', 'C', 'H', 'E', 'D',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '1', '0',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '1', '1',
+ 'S', 'U', 'B', 'J', 'O', 'I', 'N', 'E', 'D',
+ 'S', 'U', 'B', 'L', 'I', 'N', 'E', 'A', 'R',
+ 'S', 'U', 'B', 'S', 'C', 'R', 'I', 'P', 'T',
+ 'S', 'U', 'M', 'M', 'A', 'T', 'I', 'O', 'N',
+ 'S', 'U', 'N', 'D', 'A', 'N', 'E', 'S', 'E',
+ 'S', 'U', 'P', 'E', 'R', 'V', 'I', 'S', 'E',
+ 'S', 'Y', 'L', 'L', 'A', 'B', 'I', 'C', 'S',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '1',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '4',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '5',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '6',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '8',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '9',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '1',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '4',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '5',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '6',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '9',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '6',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '8',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '9',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '5',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '8',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '9',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '1',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '4',
+ 'S', 'Y', 'M', 'M', 'E', 'T', 'R', 'I', 'C',
+ 'S', 'Y', 'N', 'D', 'E', 'S', 'M', 'O', 'S',
+ 'S', 'Y', 'R', 'M', 'A', 'T', 'I', 'K', 'I',
+ 'T', 'A', 'K', 'H', 'A', 'L', 'L', 'U', 'S',
+ 'T', 'E', 'L', 'E', 'G', 'R', 'A', 'P', 'H',
+ 'T', 'E', 'L', 'E', 'P', 'H', 'O', 'N', 'E',
+ 'T', 'E', 'T', 'R', 'A', 'G', 'R', 'A', 'M',
+ 'T', 'E', 'T', 'R', 'A', 'S', 'E', 'M', 'E',
+ 'T', 'H', 'E', 'R', 'E', 'F', 'O', 'R', 'E',
+ 'T', 'H', 'O', 'U', 'S', 'A', 'N', 'D', 'S',
+ 'T', 'R', 'A', 'P', 'E', 'Z', 'I', 'U', 'M',
+ 'T', 'R', 'E', 'M', 'O', 'L', 'O', '-', '1',
+ 'T', 'R', 'E', 'M', 'O', 'L', 'O', '-', '2',
+ 'T', 'R', 'E', 'M', 'O', 'L', 'O', '-', '3',
+ 'T', 'R', 'I', 'F', 'O', 'N', 'I', 'A', 'S',
+ 'T', 'R', 'I', 'G', 'O', 'R', 'G', 'O', 'N',
+ 'T', 'R', 'U', 'N', 'C', 'A', 'T', 'E', 'D',
+ 'T', 'U', 'R', 'N', 'S', 'T', 'I', 'L', 'E',
+ 'T', 'U', 'T', 'E', 'Y', 'A', 'S', 'A', 'T',
+ 'U', 'K', 'R', 'A', 'I', 'N', 'I', 'A', 'N',
+ 'U', 'N', 'D', 'E', 'R', 'L', 'I', 'N', 'E',
+ 'U', 'N', 'I', 'V', 'E', 'R', 'S', 'A', 'L',
+ 'U', 'N', 'M', 'A', 'R', 'R', 'I', 'E', 'D',
+ 'V', 'A', 'R', 'I', 'A', 'T', 'I', 'O', 'N',
+ 'V', 'I', 'S', 'A', 'R', 'G', 'A', 'Y', 'A',
+ 'V', 'O', 'I', 'C', 'E', 'L', 'E', 'S', 'S',
+ 'W', 'A', 'S', 'S', 'A', 'L', 'L', 'A', 'M',
+ 'W', 'E', 'S', 'T', '-', 'C', 'R', 'E', 'E',
+ 'W', 'O', 'R', 'D', 'S', 'P', 'A', 'C', 'E',
+ 'Y', 'P', 'O', 'K', 'R', 'I', 'S', 'I', 'S',
+ 'A', 'C', 'R', 'O', 'P', 'H', 'O', 'N', 'I', 'C',
+ 'A', 'E', 'D', 'A', '-', 'P', 'I', 'L', 'L', 'A',
+ 'A', 'E', 'L', 'A', '-', 'P', 'I', 'L', 'L', 'A',
+ 'A', 'L', 'P', 'A', 'P', 'R', 'A', 'A', 'N', 'A',
+ 'A', 'N', 'G', 'K', 'H', 'A', 'N', 'K', 'H', 'U',
+ 'A', 'N', 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'N', 'T', 'I', 'K', 'E', 'N', 'O', 'M', 'A',
+ 'A', 'N', 'U', 'S', 'V', 'A', 'R', 'A', 'Y', 'A',
+ 'A', 'P', 'O', 'S', 'T', 'R', 'O', 'F', 'O', 'I',
+ 'A', 'P', 'O', 'S', 'T', 'R', 'O', 'F', 'O', 'S',
+ 'A', 'P', 'O', 'S', 'T', 'R', 'O', 'P', 'H', 'E',
+ 'A', 'P', 'P', 'R', 'O', 'A', 'C', 'H', 'E', 'S',
+ 'A', 'R', 'P', 'E', 'G', 'G', 'I', 'A', 'T', 'O',
+ 'A', 'R', 'R', 'O', 'W', '-', 'T', 'A', 'I', 'L',
+ 'A', 'S', 'T', 'E', 'R', 'I', 'S', 'C', 'U', 'S',
+ 'A', 'T', 'H', 'A', 'P', 'A', 'S', 'C', 'A', 'N',
+ 'A', 'U', 'R', 'A', 'M', 'A', 'Z', 'D', 'A', 'A',
+ 'B', 'A', 'R', 'I', 'Y', 'O', 'O', 'S', 'A', 'N',
+ 'B', 'A', 'T', 'H', 'A', 'M', 'A', 'S', 'A', 'T',
+ 'B', 'I', 'B', 'L', 'E', '-', 'C', 'R', 'E', 'E',
+ 'C', 'E', 'N', 'T', 'R', 'E', 'L', 'I', 'N', 'E',
+ 'C', 'H', 'A', 'R', 'A', 'C', 'T', 'E', 'R', 'S',
+ 'C', 'I', 'R', 'C', 'U', 'M', 'F', 'L', 'E', 'X',
+ 'C', 'O', 'M', 'M', 'E', 'R', 'C', 'I', 'A', 'L',
+ 'C', 'O', 'M', 'P', 'L', 'E', 'M', 'E', 'N', 'T',
+ 'C', 'O', 'M', 'P', 'L', 'E', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'M', 'P', 'L', 'I', 'A', 'N', 'C', 'E',
+ 'C', 'O', 'N', 'J', 'O', 'I', 'N', 'I', 'N', 'G',
+ 'C', 'O', 'N', 'T', 'A', 'I', 'N', 'I', 'N', 'G',
+ 'C', 'O', 'N', 'T', 'E', 'N', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'N', 'T', 'I', 'N', 'U', 'O', 'U', 'S',
+ 'C', 'R', 'O', 'S', 'S', 'B', 'O', 'N', 'E', 'S',
+ 'C', 'R', 'O', 'S', 'S', 'H', 'A', 'T', 'C', 'H',
+ 'D', 'A', 'G', 'B', 'A', 'S', 'I', 'N', 'N', 'A',
+ 'D', 'E', 'F', 'I', 'N', 'I', 'T', 'I', 'O', 'N',
+ 'D', 'E', 'S', 'C', 'E', 'N', 'D', 'I', 'N', 'G',
+ 'D', 'E', 'V', 'A', 'N', 'A', 'G', 'A', 'R', 'I',
+ 'D', 'I', 'F', 'F', 'E', 'R', 'E', 'N', 'C', 'E',
+ 'D', 'I', 'F', 'F', 'I', 'C', 'U', 'L', 'T', 'Y',
+ 'D', 'I', 'S', 'P', 'E', 'R', 'S', 'I', 'O', 'N',
+ 'D', 'I', 'S', 'T', 'O', 'R', 'T', 'I', 'O', 'N',
+ 'D', 'I', 'V', 'E', 'R', 'G', 'E', 'N', 'C', 'E',
+ 'D', 'I', 'V', 'I', 'N', 'A', 'T', 'I', 'O', 'N',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '6', '7', '8',
+ 'E', 'K', 'S', 'T', 'R', 'E', 'P', 'T', 'O', 'N',
+ 'E', 'L', 'E', 'C', 'T', 'R', 'I', 'C', 'A', 'L',
+ 'E', 'M', 'B', 'R', 'O', 'I', 'D', 'E', 'R', 'Y',
+ 'E', 'N', 'A', 'R', 'M', 'O', 'N', 'I', 'O', 'S',
+ 'E', 'N', 'C', 'O', 'U', 'N', 'T', 'E', 'R', 'S',
+ 'E', 'N', 'T', 'E', 'R', 'P', 'R', 'I', 'S', 'E',
+ 'E', 'N', 'T', 'H', 'U', 'S', 'I', 'A', 'S', 'M',
+ 'E', 'P', 'I', 'D', 'A', 'U', 'R', 'E', 'A', 'N',
+ 'E', 'P', 'I', 'G', 'R', 'A', 'P', 'H', 'I', 'C',
+ 'E', 'Q', 'U', 'I', 'V', 'A', 'L', 'E', 'N', 'T',
+ 'E', 'X', 'H', 'A', 'U', 'S', 'T', 'I', 'O', 'N',
+ 'E', 'X', 'T', 'R', 'A', '-', 'H', 'I', 'G', 'H',
+ 'F', 'A', 'H', 'R', 'E', 'N', 'H', 'E', 'I', 'T',
+ 'F', 'E', 'L', 'L', 'O', 'W', 'S', 'H', 'I', 'P',
+ 'F', 'I', 'X', 'E', 'D', '-', 'F', 'O', 'R', 'M',
+ 'F', 'O', 'R', 'M', 'A', 'T', 'T', 'I', 'N', 'G',
+ 'F', 'U', 'N', 'C', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'G', 'B', 'A', 'K', 'U', 'R', 'U', 'N', 'E', 'N',
+ 'G', 'E', 'M', 'I', 'N', 'A', 'T', 'I', 'O', 'N',
+ 'G', 'L', 'A', 'G', 'O', 'L', 'I', 'T', 'I', 'C',
+ 'G', 'O', 'R', 'T', 'H', 'M', 'I', 'K', 'O', 'N',
+ 'H', 'E', 'R', 'M', 'I', 'O', 'N', 'I', 'A', 'N',
+ 'H', 'O', 'M', 'O', 'T', 'H', 'E', 'T', 'I', 'C',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L',
+ 'H', 'Y', 'S', 'T', 'E', 'R', 'E', 'S', 'I', 'S',
+ 'I', 'E', 'U', 'N', 'G', '-', 'S', 'I', 'O', 'S',
+ 'I', 'M', 'I', 'D', 'I', 'A', 'R', 'G', 'O', 'N',
+ 'I', 'M', 'I', 'F', 'T', 'H', 'O', 'R', 'O', 'N',
+ 'I', 'M', 'P', 'E', 'R', 'F', 'E', 'C', 'T', 'A',
+ 'I', 'N', 'C', 'O', 'M', 'P', 'L', 'E', 'T', 'E',
+ 'I', 'N', 'D', 'U', 'S', 'T', 'R', 'I', 'A', 'L',
+ 'K', 'H', 'A', 'K', 'A', 'S', 'S', 'I', 'A', 'N',
+ 'K', 'H', 'A', 'R', 'O', 'S', 'H', 'T', 'H', 'I',
+ 'K', 'I', 'R', 'O', 'G', 'U', 'R', 'A', 'M', 'U',
+ 'K', 'U', 'N', 'D', 'D', 'A', 'L', 'I', 'Y', 'A',
+ 'L', 'A', 'J', 'A', 'N', 'Y', 'A', 'L', 'A', 'N',
+ 'L', 'E', 'N', 'G', 'T', 'H', 'E', 'N', 'E', 'R',
+ 'L', 'E', 'N', 'T', 'I', 'C', 'U', 'L', 'A', 'R',
+ 'L', 'I', 'M', 'I', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'M', 'E', 'M', 'B', 'E', 'R', 'S', 'H', 'I', 'P',
+ 'M', 'I', 'E', 'U', 'M', '-', 'S', 'I', 'O', 'S',
+ 'M', 'O', 'N', 'O', 'F', 'O', 'N', 'I', 'A', 'S',
+ 'M', 'O', 'N', 'O', 'S', 'T', 'A', 'B', 'L', 'E',
+ 'M', 'O', 'O', 'S', 'E', '-', 'C', 'R', 'E', 'E',
+ 'M', 'U', '-', 'G', 'A', 'A', 'H', 'L', 'A', 'A',
+ 'N', 'A', 'A', 'S', 'I', 'K', 'Y', 'A', 'Y', 'A',
+ 'N', 'A', 'N', 'G', 'M', 'O', 'N', 'T', 'H', 'O',
+ 'N', 'I', 'E', 'U', 'N', '-', 'S', 'I', 'O', 'S',
+ 'N', 'O', 'N', '-', 'J', 'O', 'I', 'N', 'E', 'R',
+ 'N', 'O', 'N', 'F', 'O', 'R', 'K', 'I', 'N', 'G',
+ 'O', 'P', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'O', 'P', 'P', 'R', 'E', 'S', 'S', 'I', 'O', 'N',
+ 'O', 'R', 'T', 'H', 'O', 'G', 'O', 'N', 'A', 'L',
+ 'P', 'A', 'M', 'P', 'H', 'Y', 'L', 'I', 'A', 'N',
+ 'P', 'A', 'N', 'A', 'E', 'L', 'A', 'E', 'N', 'G',
+ 'P', 'A', 'N', 'E', 'U', 'L', 'E', 'U', 'N', 'G',
+ 'P', 'A', 'R', 'A', 'P', 'H', 'R', 'A', 'S', 'E',
+ 'P', 'A', 'T', 'H', 'A', 'M', 'A', 'S', 'A', 'T',
+ 'P', 'E', 'D', 'E', 'S', 'T', 'R', 'I', 'A', 'N',
+ 'P', 'E', 'R', 'C', 'U', 'S', 'S', 'I', 'V', 'E',
+ 'P', 'H', 'A', 'R', 'Y', 'N', 'G', 'E', 'A', 'L',
+ 'P', 'H', 'I', 'L', 'I', 'P', 'P', 'I', 'N', 'E',
+ 'P', 'H', 'O', 'E', 'N', 'I', 'C', 'I', 'A', 'N',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S',
+ 'P', 'L', 'U', 'S', '-', 'M', 'I', 'N', 'U', 'S',
+ 'P', 'O', 'S', 'S', 'E', 'S', 'S', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'J', 'E', 'C', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'J', 'E', 'C', 'T', 'I', 'V', 'E',
+ 'P', 'R', 'O', 'L', 'A', 'T', 'I', 'O', 'N', 'E',
+ 'P', 'R', 'O', 'P', 'O', 'R', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'T', 'O', 'V', 'A', 'R', 'Y', 'S',
+ 'Q', 'U', 'A', 'T', 'E', 'R', 'N', 'I', 'O', 'N',
+ 'Q', 'U', 'E', 'S', 'T', 'I', 'O', 'N', 'E', 'D',
+ 'R', 'E', 'G', 'I', 'S', 'T', 'E', 'R', 'E', 'D',
+ 'R', 'E', 'L', 'A', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'R', 'E', 'S', 'I', 'S', 'T', 'A', 'N', 'C', 'E',
+ 'R', 'E', 'S', 'O', 'L', 'U', 'T', 'I', 'O', 'N',
+ 'R', 'E', 'V', 'O', 'L', 'U', 'T', 'I', 'O', 'N',
+ 'R', 'I', 'E', 'U', 'L', '-', 'S', 'I', 'O', 'S',
+ 'R', 'I', 'G', 'H', 'T', '-', 'H', 'A', 'N', 'D',
+ 'R', 'I', 'G', 'H', 'T', '-', 'S', 'I', 'D', 'E',
+ 'R', 'I', 'G', 'H', 'T', 'W', 'A', 'R', 'D', 'S',
+ 'S', 'A', 'N', 'S', '-', 'S', 'E', 'R', 'I', 'F',
+ 'S', 'A', 'U', 'R', 'A', 'S', 'H', 'T', 'R', 'A',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9',
+ 'S', 'E', 'M', 'I', 'B', 'R', 'E', 'V', 'I', 'S',
+ 'S', 'E', 'M', 'I', 'C', 'I', 'R', 'C', 'L', 'E',
+ 'S', 'E', 'M', 'I', 'D', 'I', 'R', 'E', 'C', 'T',
+ 'S', 'E', 'M', 'I', 'M', 'I', 'N', 'I', 'M', 'A',
+ 'S', 'E', 'S', 'T', 'E', 'R', 'T', 'I', 'U', 'S',
+ 'S', 'H', 'A', 'L', 'S', 'H', 'E', 'L', 'E', 'T',
+ 'S', 'H', 'O', 'U', 'L', 'D', 'E', 'R', 'E', 'D',
+ 'S', 'I', 'M', 'P', 'L', 'I', 'F', 'I', 'E', 'D',
+ 'S', 'I', 'O', 'S', '-', 'C', 'I', 'E', 'U', 'C',
+ 'S', 'I', 'O', 'S', '-', 'H', 'I', 'E', 'U', 'H',
+ 'S', 'I', 'O', 'S', '-', 'I', 'E', 'U', 'N', 'G',
+ 'S', 'I', 'O', 'S', '-', 'M', 'I', 'E', 'U', 'M',
+ 'S', 'I', 'O', 'S', '-', 'N', 'I', 'E', 'U', 'N',
+ 'S', 'I', 'O', 'S', '-', 'P', 'I', 'E', 'U', 'P',
+ 'S', 'I', 'O', 'S', '-', 'R', 'I', 'E', 'U', 'L',
+ 'S', 'I', 'X', '-', 'P', 'E', 'R', '-', 'E', 'M',
+ 'S', 'I', 'X', '-', 'S', 'T', 'R', 'I', 'N', 'G',
+ 'S', 'S', 'A', 'N', 'G', 'A', 'R', 'A', 'E', 'A',
+ 'S', 'S', 'A', 'N', 'G', 'C', 'I', 'E', 'U', 'C',
+ 'S', 'S', 'A', 'N', 'G', 'H', 'I', 'E', 'U', 'H',
+ 'S', 'S', 'A', 'N', 'G', 'I', 'E', 'U', 'N', 'G',
+ 'S', 'S', 'A', 'N', 'G', 'N', 'I', 'E', 'U', 'N',
+ 'S', 'S', 'A', 'N', 'G', 'P', 'I', 'E', 'U', 'P',
+ 'S', 'S', 'A', 'N', 'G', 'R', 'I', 'E', 'U', 'L',
+ 'S', 'T', 'A', 'N', 'D', 'S', 'T', 'I', 'L', 'L',
+ 'S', 'U', 'B', 'P', 'U', 'N', 'C', 'T', 'I', 'S',
+ 'S', 'U', 'B', 'S', 'T', 'I', 'T', 'U', 'T', 'E',
+ 'S', 'U', 'P', 'E', 'R', 'F', 'I', 'X', 'E', 'D',
+ 'S', 'U', 'S', 'P', 'E', 'N', 'S', 'I', 'O', 'N',
+ 'T', 'A', 'B', 'U', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'T', 'A', 'W', 'E', 'L', 'L', 'E', 'M', 'E', 'T',
+ 'T', 'E', 'R', 'M', 'I', 'N', 'A', 'T', 'O', 'R',
+ 'T', 'E', 'T', 'R', 'A', 'S', 'I', 'M', 'O', 'U',
+ 'T', 'H', 'I', 'R', 'T', 'Y', '-', 'O', 'N', 'E',
+ 'T', 'H', 'R', 'E', 'E', '-', 'L', 'I', 'N', 'E',
+ 'T', 'R', 'I', 'A', 'N', 'G', 'U', 'L', 'A', 'R',
+ 'T', 'R', 'I', 'F', 'O', 'L', 'I', 'A', 'T', 'E',
+ 'T', 'R', 'I', 'G', 'R', 'A', 'M', 'M', 'O', 'S',
+ 'T', 'R', 'O', 'E', 'Z', 'E', 'N', 'I', 'A', 'N',
+ 'T', 'R', 'O', 'K', 'U', 'T', 'A', 'S', 'T', 'I',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'O', 'N', 'E',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'S', 'I', 'X',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'T', 'W', 'O',
+ 'T', 'W', 'O', '-', 'H', 'E', 'A', 'D', 'E', 'D',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', 'L', 'Y',
+ 'V', 'I', 'S', 'I', 'G', 'O', 'T', 'H', 'I', 'C',
+ 'W', 'H', 'E', 'E', 'L', 'C', 'H', 'A', 'I', 'R',
+ 'W', 'O', 'O', 'D', 'S', '-', 'C', 'R', 'E', 'E',
+ 'A', 'C', 'K', 'N', 'O', 'W', 'L', 'E', 'D', 'G', 'E',
+ 'A', 'E', 'S', 'C', 'U', 'L', 'A', 'P', 'I', 'U', 'S',
+ 'A', 'G', 'G', 'R', 'A', 'V', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'L', 'T', 'E', 'R', 'N', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'L', 'T', 'E', 'R', 'N', 'A', 'T', 'I', 'V', 'E',
+ 'A', 'P', 'P', 'L', 'I', 'C', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'P', 'P', 'R', 'O', 'X', 'I', 'M', 'A', 'T', 'E',
+ 'B', 'A', 'C', 'K', '-', 'T', 'I', 'L', 'T', 'E', 'D',
+ 'C', 'A', 'N', 'D', 'R', 'A', 'B', 'I', 'N', 'D', 'U',
+ 'C', 'I', 'E', 'U', 'C', '-', 'I', 'E', 'U', 'N', 'G',
+ 'C', 'I', 'R', 'C', 'U', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'L', 'U', 'B', '-', 'S', 'P', 'O', 'K', 'E', 'D',
+ 'C', 'O', 'M', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'N', 'J', 'U', 'N', 'C', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'N', 'S', 'E', 'C', 'U', 'T', 'I', 'V', 'E',
+ 'C', 'O', 'N', 'T', 'R', 'A', 'C', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'N', 'T', 'R', 'A', 'R', 'I', 'E', 'T', 'Y',
+ 'C', 'O', 'R', 'P', 'O', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'R', 'R', 'E', 'S', 'P', 'O', 'N', 'D', 'S',
+ 'C', 'O', 'U', 'N', 'T', 'E', 'R', 'B', 'O', 'R', 'E',
+ 'C', 'O', 'U', 'N', 'T', 'E', 'R', 'S', 'I', 'N', 'K',
+ 'D', 'A', 'H', 'Y', 'A', 'A', 'U', 'S', 'H', '-', '2',
+ 'D', 'E', 'C', 'R', 'E', 'S', 'C', 'E', 'N', 'D', 'O',
+ 'D', 'E', 'L', 'I', 'V', 'E', 'R', 'A', 'N', 'C', 'E',
+ 'D', 'E', 'N', 'O', 'M', 'I', 'N', 'A', 'T', 'O', 'R',
+ 'D', 'E', 'R', 'E', 'T', '-', 'H', 'I', 'D', 'E', 'T',
+ 'D', 'E', 'S', 'C', 'R', 'I', 'P', 'T', 'I', 'O', 'N',
+ 'D', 'E', 'V', 'E', 'L', 'O', 'P', 'M', 'E', 'N', 'T',
+ 'D', 'I', 'A', 'E', 'R', 'E', 'S', 'I', 'Z', 'E', 'D',
+ 'D', 'I', 'M', 'E', 'N', 'S', 'I', 'O', 'N', 'A', 'L',
+ 'D', 'I', 'R', 'E', 'C', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'D', 'I', 'S', 'T', 'I', 'N', 'G', 'U', 'I', 'S', 'H',
+ 'D', 'O', 'A', 'C', 'H', 'A', 'S', 'H', 'M', 'E', 'E',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '6', '7', '8',
+ 'D', 'O', 'U', 'B', 'L', 'E', '-', 'L', 'I', 'N', 'E',
+ 'E', 'A', 'M', 'H', 'A', 'N', 'C', 'H', 'O', 'L', 'L',
+ 'E', 'K', 'F', 'O', 'N', 'I', 'T', 'I', 'K', 'O', 'N',
+ 'E', 'N', 'L', 'A', 'R', 'G', 'E', 'M', 'E', 'N', 'T',
+ 'E', 'Q', 'U', 'I', 'A', 'N', 'G', 'U', 'L', 'A', 'R',
+ 'E', 'X', 'C', 'L', 'A', 'M', 'A', 'T', 'I', 'O', 'N',
+ 'F', 'I', 'N', 'G', 'E', 'R', 'N', 'A', 'I', 'L', 'S',
+ 'F', 'O', 'U', 'R', '-', 'P', 'E', 'R', '-', 'E', 'M',
+ 'F', 'O', 'U', 'R', '-', 'S', 'T', 'R', 'I', 'N', 'G',
+ 'G', 'A', 'Y', 'A', 'N', 'U', 'K', 'I', 'T', 'T', 'A',
+ 'G', 'U', 'A', 'R', 'D', 'E', 'D', 'N', 'E', 'S', 'S',
+ 'H', 'A', 'U', 'P', 'T', 'S', 'T', 'I', 'M', 'M', 'E',
+ 'H', 'B', 'A', 'S', 'A', '-', 'E', 'S', 'A', 'S', 'A',
+ 'H', 'I', 'E', 'U', 'H', '-', 'M', 'I', 'E', 'U', 'M',
+ 'H', 'I', 'E', 'U', 'H', '-', 'N', 'I', 'E', 'U', 'N',
+ 'H', 'I', 'E', 'U', 'H', '-', 'P', 'I', 'E', 'U', 'P',
+ 'H', 'I', 'E', 'U', 'H', '-', 'R', 'I', 'E', 'U', 'L',
+ 'H', 'Y', 'P', 'H', 'E', 'N', 'A', 'T', 'I', 'O', 'N',
+ 'I', 'D', 'E', 'O', 'G', 'R', 'A', 'P', 'H', 'I', 'C',
+ 'I', 'E', 'U', 'N', 'G', '-', 'C', 'I', 'E', 'U', 'C',
+ 'I', 'E', 'U', 'N', 'G', '-', 'M', 'I', 'E', 'U', 'M',
+ 'I', 'E', 'U', 'N', 'G', '-', 'P', 'I', 'E', 'U', 'P',
+ 'I', 'M', 'P', 'E', 'R', 'F', 'E', 'C', 'T', 'U', 'M',
+ 'I', 'N', 'D', 'E', 'P', 'E', 'N', 'D', 'E', 'N', 'T',
+ 'I', 'N', 'F', 'O', 'R', 'M', 'A', 'T', 'I', 'O', 'N',
+ 'I', 'N', 'T', 'E', 'G', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'I', 'N', 'T', 'E', 'R', 'C', 'A', 'L', 'A', 'T', 'E',
+ 'I', 'N', 'T', 'E', 'R', 'L', 'I', 'N', 'E', 'A', 'R',
+ 'I', 'N', 'T', 'E', 'R', 'L', 'O', 'C', 'K', 'E', 'D',
+ 'I', 'N', 'T', 'E', 'R', 'R', 'O', 'B', 'A', 'N', 'G',
+ 'J', 'I', 'H', 'V', 'A', 'M', 'U', 'L', 'I', 'Y', 'A',
+ 'K', 'I', 'R', 'O', 'M', 'E', 'E', 'T', 'O', 'R', 'U',
+ 'K', 'I', 'Y', 'E', 'O', 'K', '-', 'S', 'I', 'O', 'S',
+ 'L', 'A', 'K', 'K', 'H', 'A', 'N', 'G', 'Y', 'A', 'O',
+ 'L', 'E', 'F', 'T', '-', 'S', 'H', 'A', 'D', 'E', 'D',
+ 'M', 'A', 'H', 'A', 'A', 'P', 'R', 'A', 'A', 'N', 'A',
+ 'M', 'I', 'E', 'U', 'M', '-', 'H', 'I', 'E', 'U', 'H',
+ 'M', 'I', 'E', 'U', 'M', '-', 'P', 'I', 'E', 'U', 'P',
+ 'M', 'I', 'E', 'U', 'M', '-', 'R', 'I', 'E', 'U', 'L',
+ 'M', 'O', 'N', 'O', 'G', 'R', 'A', 'M', 'M', 'O', 'S',
+ 'M', 'U', 'L', 'T', 'I', 'O', 'C', 'U', 'L', 'A', 'R',
+ 'M', 'U', 'U', 'S', 'I', 'K', 'A', 'T', 'O', 'A', 'N',
+ 'N', 'A', 'A', 'K', 'S', 'I', 'K', 'Y', 'A', 'Y', 'A',
+ 'N', 'E', 'B', 'E', 'N', 'S', 'T', 'I', 'M', 'M', 'E',
+ 'N', 'I', 'E', 'U', 'N', '-', 'C', 'I', 'E', 'U', 'C',
+ 'N', 'I', 'E', 'U', 'N', '-', 'H', 'I', 'E', 'U', 'H',
+ 'N', 'I', 'E', 'U', 'N', '-', 'P', 'I', 'E', 'U', 'P',
+ 'O', 'B', 'S', 'T', 'R', 'U', 'C', 'T', 'I', 'O', 'N',
+ 'O', 'P', 'E', 'N', '-', 'H', 'E', 'A', 'D', 'E', 'D',
+ 'O', 'V', 'E', 'R', 'L', 'A', 'P', 'P', 'I', 'N', 'G',
+ 'P', 'A', 'L', 'A', 'T', 'A', 'L', 'I', 'Z', 'E', 'D',
+ 'P', 'A', 'R', 'A', 'G', 'R', 'A', 'P', 'H', 'O', 'S',
+ 'P', 'A', 'R', 'A', 'K', 'A', 'L', 'E', 'S', 'M', 'A',
+ 'P', 'A', 'R', 'A', 'K', 'L', 'I', 'T', 'I', 'K', 'I',
+ 'P', 'A', 'R', 'E', 'N', 'T', 'H', 'E', 'S', 'I', 'S',
+ 'P', 'A', 'R', 'T', 'N', 'E', 'R', 'S', 'H', 'I', 'P',
+ 'P', 'E', 'N', 'E', 'T', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'P', 'E', 'R', 'I', 'S', 'P', 'O', 'M', 'E', 'N', 'I',
+ 'P', 'E', 'R', 'S', 'P', 'E', 'C', 'T', 'I', 'V', 'E',
+ 'P', 'I', 'E', 'U', 'P', '-', 'C', 'I', 'E', 'U', 'C',
+ 'P', 'I', 'E', 'U', 'P', '-', 'H', 'I', 'E', 'U', 'H',
+ 'P', 'I', 'E', 'U', 'P', '-', 'N', 'I', 'E', 'U', 'N',
+ 'P', 'I', 'E', 'U', 'P', '-', 'R', 'I', 'E', 'U', 'L',
+ 'P', 'U', 'N', 'C', 'T', 'U', 'A', 'T', 'I', 'O', 'N',
+ 'R', 'A', 'D', 'I', 'O', 'A', 'C', 'T', 'I', 'V', 'E',
+ 'R', 'A', 'H', 'M', 'A', 'T', 'U', 'L', 'L', 'A', 'H',
+ 'R', 'E', 'C', 'T', 'A', 'N', 'G', 'U', 'L', 'A', 'R',
+ 'R', 'E', 'C', 'T', 'I', 'L', 'I', 'N', 'E', 'A', 'R',
+ 'R', 'E', 'P', 'L', 'A', 'C', 'E', 'M', 'E', 'N', 'T',
+ 'R', 'I', 'E', 'U', 'L', '-', 'H', 'I', 'E', 'U', 'H',
+ 'R', 'I', 'E', 'U', 'L', '-', 'M', 'I', 'E', 'U', 'M',
+ 'R', 'I', 'E', 'U', 'L', '-', 'N', 'I', 'E', 'U', 'N',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'I', 'E', 'U', 'P',
+ 'R', 'I', 'N', 'F', 'O', 'R', 'Z', 'A', 'N', 'D', 'O',
+ 'S', 'A', 'C', 'R', 'I', 'F', 'I', 'C', 'I', 'A', 'L',
+ 'S', 'A', 'G', 'I', 'T', 'T', 'A', 'R', 'I', 'U', 'S',
+ 'S', 'A', 'L', 'L', 'A', 'L', 'L', 'A', 'H', 'O', 'U',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '9',
+ 'S', 'E', 'M', 'I', '-', 'V', 'O', 'I', 'C', 'E', 'D',
+ 'S', 'E', 'M', 'I', 'S', 'E', 'X', 'T', 'I', 'L', 'E',
+ 'S', 'I', 'N', 'G', 'L', 'E', '-', 'L', 'I', 'N', 'E',
+ 'S', 'I', 'O', 'S', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'S', 'I', 'O', 'S', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'S', 'S', 'A', 'N', 'G', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'S', 'S', 'A', 'N', 'G', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'S', 'U', 'P', 'E', 'R', 'S', 'C', 'R', 'I', 'P', 'T',
+ 'S', 'U', 'P', 'R', 'A', 'L', 'I', 'N', 'E', 'A', 'R',
+ 'S', 'Y', 'N', 'C', 'H', 'R', 'O', 'N', 'O', 'U', 'S',
+ 'T', 'E', 'T', 'R', 'A', 'F', 'O', 'N', 'I', 'A', 'S',
+ 'T', 'H', 'A', 'N', 'T', 'H', 'A', 'K', 'H', 'A', 'T',
+ 'T', 'H', 'E', 'M', 'A', 'T', 'I', 'S', 'M', 'O', 'S',
+ 'T', 'O', 'A', 'N', 'D', 'A', 'K', 'H', 'I', 'A', 'T',
+ 'T', 'O', 'P', '-', 'L', 'I', 'G', 'H', 'T', 'E', 'D',
+ 'T', 'R', 'A', 'N', 'S', 'V', 'E', 'R', 'S', 'A', 'L',
+ 'T', 'R', 'I', 'T', 'I', 'M', 'O', 'R', 'I', 'O', 'N',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'F', 'I', 'V', 'E',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'F', 'O', 'U', 'R',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'N', 'I', 'N', 'E',
+ 'U', 'N', 'A', 'S', 'P', 'I', 'R', 'A', 'T', 'E', 'D',
+ 'U', 'P', '-', 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'U', 'P', 'A', 'D', 'H', 'M', 'A', 'N', 'I', 'Y', 'A',
+ 'W', 'I', 'D', 'E', '-', 'H', 'E', 'A', 'D', 'E', 'D',
+ 'Y', 'E', 'O', 'R', 'I', 'N', 'H', 'I', 'E', 'U', 'H',
+ 'A', 'B', 'B', 'R', 'E', 'V', 'I', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'C', 'C', 'U', 'M', 'U', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'C', 'U', 'T', 'E', '-', 'M', 'A', 'C', 'R', 'O', 'N',
+ 'A', 'K', 'T', 'I', 'E', 'S', 'E', 'L', 'S', 'K', 'A', 'B',
+ 'A', 'M', 'A', 'L', 'G', 'A', 'M', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'N', 'A', 'T', 'R', 'I', 'C', 'H', 'I', 'S', 'M', 'A',
+ 'A', 'R', 'A', 'B', 'I', 'C', '-', 'I', 'N', 'D', 'I', 'C',
+ 'A', 'S', 'T', 'R', 'O', 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ 'A', 'U', 'G', 'M', 'E', 'N', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'U', 'R', 'A', 'M', 'A', 'Z', 'D', 'A', 'A', '-', '2',
+ 'A', 'U', 'R', 'A', 'M', 'A', 'Z', 'D', 'A', 'A', 'H', 'A',
+ 'B', 'L', 'A', 'C', 'K', '-', 'L', 'E', 'T', 'T', 'E', 'R',
+ 'B', 'R', 'E', 'A', 'K', 'T', 'H', 'R', 'O', 'U', 'G', 'H',
+ 'B', 'R', 'E', 'V', 'E', '-', 'M', 'A', 'C', 'R', 'O', 'N',
+ 'C', '-', 'S', 'I', 'M', 'P', 'L', 'I', 'F', 'I', 'E', 'D',
+ 'C', 'A', 'N', 'C', 'E', 'L', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'A', 'N', 'T', 'I', 'L', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'S', 'I', 'O', 'S',
+ 'C', 'R', 'O', 'S', 'S', 'E', 'D', '-', 'T', 'A', 'I', 'L',
+ 'C', 'Y', 'L', 'I', 'N', 'D', 'R', 'I', 'C', 'I', 'T', 'Y',
+ 'D', 'E', 'C', 'I', 'S', 'I', 'V', 'E', 'N', 'E', 'S', 'S',
+ 'D', 'I', 'F', 'F', 'E', 'R', 'E', 'N', 'T', 'I', 'A', 'L',
+ 'D', 'I', 'F', 'F', 'I', 'C', 'U', 'L', 'T', 'I', 'E', 'S',
+ 'D', 'I', 'M', 'I', 'N', 'I', 'S', 'H', 'M', 'E', 'N', 'T',
+ 'D', 'I', 'M', 'I', 'N', 'U', 'T', 'I', 'O', 'N', '-', '1',
+ 'D', 'I', 'M', 'I', 'N', 'U', 'T', 'I', 'O', 'N', '-', '2',
+ 'D', 'I', 'M', 'I', 'N', 'U', 'T', 'I', 'O', 'N', '-', '3',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '6', '7', '8',
+ 'D', 'O', 'U', 'B', 'L', 'E', '-', 'E', 'N', 'D', 'E', 'D',
+ 'E', 'R', 'R', 'O', 'R', '-', 'B', 'A', 'R', 'R', 'E', 'D',
+ 'F', 'L', 'E', 'U', 'R', '-', 'D', 'E', '-', 'L', 'I', 'S',
+ 'F', 'R', 'O', 'N', 'T', '-', 'T', 'I', 'L', 'T', 'E', 'D',
+ 'G', 'A', 'E', 'T', 'T', 'A', '-', 'P', 'I', 'L', 'L', 'A',
+ 'G', 'R', 'A', 'V', 'E', '-', 'M', 'A', 'C', 'R', 'O', 'N',
+ 'G', 'R', 'E', 'A', 'T', 'E', 'R', '-', 'T', 'H', 'A', 'N',
+ 'G', 'R', 'O', 'N', 'T', 'H', 'I', 'S', 'M', 'A', 'T', 'A',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', 'L', 'Y',
+ 'H', 'Y', 'P', 'H', 'E', 'N', '-', 'M', 'I', 'N', 'U', 'S',
+ 'H', 'Y', 'P', 'O', 'D', 'I', 'A', 'S', 'T', 'O', 'L', 'E',
+ 'I', 'C', 'E', 'L', 'A', 'N', 'D', 'I', 'C', '-', 'Y', 'R',
+ 'I', 'E', 'U', 'N', 'G', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'I', 'E', 'U', 'N', 'G', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'I', 'N', 'S', 'T', 'R', 'U', 'M', 'E', 'N', 'T', 'A', 'L',
+ 'I', 'N', 'T', 'E', 'R', 'S', 'E', 'C', 'T', 'I', 'N', 'G',
+ 'I', 'N', 'T', 'E', 'R', 'S', 'E', 'C', 'T', 'I', 'O', 'N',
+ 'J', '-', 'S', 'I', 'M', 'P', 'L', 'I', 'F', 'I', 'E', 'D',
+ 'K', 'I', 'Y', 'E', 'O', 'K', '-', 'R', 'I', 'E', 'U', 'L',
+ 'M', 'A', 'C', 'R', 'O', 'N', '-', 'A', 'C', 'U', 'T', 'E',
+ 'M', 'A', 'C', 'R', 'O', 'N', '-', 'B', 'R', 'E', 'V', 'E',
+ 'M', 'A', 'C', 'R', 'O', 'N', '-', 'G', 'R', 'A', 'V', 'E',
+ 'M', 'A', 'T', 'H', 'E', 'M', 'A', 'T', 'I', 'C', 'A', 'L',
+ 'M', 'I', 'D', 'D', 'L', 'E', '-', 'W', 'E', 'L', 'S', 'H',
+ 'M', 'I', 'E', 'U', 'M', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'N', 'A', 'S', 'A', 'L', 'I', 'Z', 'A', 'T', 'I', 'O', 'N',
+ 'N', 'I', 'E', 'U', 'N', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'N', 'I', 'E', 'U', 'N', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'N', 'O', 'N', '-', 'B', 'R', 'E', 'A', 'K', 'I', 'N', 'G',
+ 'P', 'I', 'E', 'U', 'P', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'P', 'I', 'E', 'U', 'P', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'P', 'O', 'S', 'T', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'E', 'S', 'C', 'R', 'I', 'P', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'E', 'S', 'E', 'N', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'P', 'O', 'R', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'Q', 'U', 'I', 'N', 'D', 'I', 'C', 'E', 'S', 'I', 'M', 'A',
+ 'R', 'I', 'E', 'U', 'L', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'R', 'I', 'E', 'U', 'L', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'R', 'I', 'G', 'H', 'T', '-', 'S', 'H', 'A', 'D', 'E', 'D',
+ 'R', 'O', 'U', 'N', 'D', '-', 'T', 'I', 'P', 'P', 'E', 'D',
+ 'R', 'U', 'L', 'E', '-', 'D', 'E', 'L', 'A', 'Y', 'E', 'D',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '6',
+ 'S', 'E', 'M', 'I', 'C', 'I', 'R', 'C', 'U', 'L', 'A', 'R',
+ 'S', 'I', 'O', 'S', '-', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'S', 'I', 'O', 'S', '-', 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'S', 'I', 'O', 'S', '-', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'S', 'I', 'O', 'S', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'S', 'I', 'X', 'T', 'Y', '-', 'F', 'O', 'U', 'R', 'T', 'H',
+ 'S', 'O', 'U', 'T', 'H', '-', 'S', 'L', 'A', 'V', 'E', 'Y',
+ 'S', 'P', 'R', 'E', 'C', 'H', 'G', 'E', 'S', 'A', 'N', 'G',
+ 'S', 'T', 'R', 'A', 'G', 'G', 'I', 'S', 'M', 'A', 'T', 'A',
+ 'S', 'T', 'R', 'A', 'I', 'G', 'H', 'T', 'N', 'E', 'S', 'S',
+ 'S', 'U', 'B', 'S', 'T', 'I', 'T', 'U', 'T', 'I', 'O', 'N',
+ 'S', 'U', 'P', 'E', 'R', 'I', 'M', 'P', 'O', 'S', 'E', 'D',
+ 'T', 'H', 'R', 'E', 'E', '-', 'P', 'E', 'R', '-', 'E', 'M',
+ 'T', 'H', 'U', 'N', 'D', 'E', 'R', 'S', 'T', 'O', 'R', 'M',
+ 'T', 'I', 'K', 'E', 'U', 'T', '-', 'R', 'I', 'E', 'U', 'L',
+ 'T', 'R', 'A', 'N', 'S', 'M', 'I', 'S', 'S', 'I', 'O', 'N',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'E', 'I', 'G', 'H', 'T',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'S', 'E', 'V', 'E', 'N',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'T', 'H', 'R', 'E', 'E',
+ 'W', 'E', 'D', 'G', 'E', '-', 'T', 'A', 'I', 'L', 'E', 'D',
+ 'X', 'S', 'H', 'A', 'A', 'Y', 'A', 'T', 'H', 'I', 'Y', 'A',
+ 'Y', 'O', 'U', 'T', 'H', 'F', 'U', 'L', 'N', 'E', 'S', 'S',
+ 'A', 'N', 'T', 'I', 'C', 'L', 'O', 'C', 'K', 'W', 'I', 'S', 'E',
+ 'A', 'P', 'P', 'R', 'O', 'X', 'I', 'M', 'A', 'T', 'E', 'L', 'Y',
+ 'A', 'R', 'G', 'O', 'S', 'Y', 'N', 'T', 'H', 'E', 'T', 'O', 'N',
+ 'A', 'V', 'A', 'K', 'R', 'A', 'H', 'A', 'S', 'A', 'N', 'Y', 'A',
+ 'C', 'H', 'I', 'E', 'U', 'C', 'H', '-', 'H', 'I', 'E', 'U', 'H',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'C', 'I', 'E', 'U', 'C',
+ 'C', 'H', 'R', 'Y', 'S', 'A', 'N', 'T', 'H', 'E', 'M', 'U', 'M',
+ 'C', 'O', 'M', 'P', 'A', 'T', 'I', 'B', 'I', 'L', 'I', 'T', 'Y',
+ 'C', 'O', 'N', 'C', 'A', 'V', 'E', '-', 'S', 'I', 'D', 'E', 'D',
+ 'C', 'O', 'N', 'T', 'E', 'M', 'P', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'R', 'Y', 'P', 'T', 'O', 'G', 'R', 'A', 'M', 'M', 'I', 'C',
+ 'D', 'E', 'F', 'E', 'C', 'T', 'I', 'V', 'E', 'N', 'E', 'S', 'S',
+ 'D', 'I', 'S', 'C', 'O', 'N', 'T', 'I', 'N', 'U', 'O', 'U', 'S',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '6', '7', '8',
+ 'D', 'O', 'U', 'B', 'L', 'E', '-', 'S', 'T', 'R', 'U', 'C', 'K',
+ 'D', 'O', 'W', 'N', '-', 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'D', 'R', 'O', 'P', '-', 'S', 'H', 'A', 'D', 'O', 'W', 'E', 'D',
+ 'E', 'G', 'Y', 'P', 'T', 'O', 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ 'E', 'M', 'B', 'E', 'L', 'L', 'I', 'S', 'H', 'M', 'E', 'N', 'T',
+ 'E', 'U', 'R', 'O', '-', 'C', 'U', 'R', 'R', 'E', 'N', 'C', 'Y',
+ 'G', 'E', 'O', 'M', 'E', 'T', 'R', 'I', 'C', 'A', 'L', 'L', 'Y',
+ 'I', 'E', 'U', 'N', 'G', '-', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'I', 'E', 'U', 'N', 'G', '-', 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'I', 'E', 'U', 'N', 'G', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'I', 'E', 'U', 'N', 'G', '-', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'I', 'E', 'U', 'N', 'G', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'I', 'N', 'T', 'E', 'R', 'P', 'O', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'I', 'N', 'T', 'E', 'R', 'S', 'Y', 'L', 'L', 'A', 'B', 'I', 'C',
+ 'J', 'U', 'D', 'E', 'O', '-', 'S', 'P', 'A', 'N', 'I', 'S', 'H',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'M', 'I', 'E', 'U', 'M',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'P', 'I', 'E', 'U', 'P',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'R', 'I', 'E', 'U', 'L',
+ 'L', 'A', 'B', 'I', 'A', 'L', 'I', 'Z', 'A', 'T', 'I', 'O', 'N',
+ 'L', 'E', 'F', 'T', '-', 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'L', 'E', 'F', 'T', '-', 'T', 'O', '-', 'R', 'I', 'G', 'H', 'T',
+ 'M', 'I', 'E', 'U', 'M', '-', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'M', 'I', 'E', 'U', 'M', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'M', 'I', 'N', 'U', 'S', '-', 'O', 'R', '-', 'P', 'L', 'U', 'S',
+ 'M', 'O', 'R', 'P', 'H', 'O', 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ 'N', 'I', 'E', 'U', 'N', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'N', 'I', 'E', 'U', 'N', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'O', 'P', 'E', 'N', '-', 'O', 'U', 'T', 'L', 'I', 'N', 'E', 'D',
+ 'P', 'A', 'R', 'A', 'L', 'L', 'E', 'L', 'O', 'G', 'R', 'A', 'M',
+ 'P', 'A', 'R', 'E', 'N', 'T', 'H', 'E', 'S', 'I', 'Z', 'E', 'D',
+ 'P', 'A', 'R', 'E', 'S', 'T', 'I', 'G', 'M', 'E', 'N', 'O', 'N',
+ 'P', 'E', 'R', 'P', 'E', 'N', 'D', 'I', 'C', 'U', 'L', 'A', 'R',
+ 'P', 'H', 'I', 'E', 'U', 'P', 'H', '-', 'P', 'I', 'E', 'U', 'P',
+ 'P', 'I', 'E', 'U', 'P', '-', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'P', 'I', 'E', 'U', 'P', '-', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'P', 'I', 'E', 'U', 'P', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'P', 'R', 'E', 'P', 'O', 'N', 'D', 'E', 'R', 'A', 'N', 'C', 'E',
+ 'R', 'I', 'E', 'U', 'L', '-', 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'R', 'I', 'E', 'U', 'L', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'R', 'I', 'G', 'H', 'T', '-', 'T', 'O', '-', 'L', 'E', 'F', 'T',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'A', 'R',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'Y', 'R',
+ 'S', 'T', 'A', 'C', 'C', 'A', 'T', 'I', 'S', 'S', 'I', 'M', 'O',
+ 'S', 'T', 'R', 'I', 'K', 'E', 'T', 'H', 'R', 'O', 'U', 'G', 'H',
+ 'T', 'E', 'T', 'A', 'R', 'T', 'I', 'M', 'O', 'R', 'I', 'O', 'N',
+ 'T', 'H', 'E', 'R', 'M', 'O', 'D', 'Y', 'N', 'A', 'M', 'I', 'C',
+ 'T', 'H', 'I', 'R', 'T', 'Y', '-', 'S', 'E', 'C', 'O', 'N', 'D',
+ 'T', 'I', 'K', 'E', 'U', 'T', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'T', 'R', 'A', 'N', 'S', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'E', 'I', 'G', 'H', 'T', 'H',
+ 'V', 'O', 'W', 'E', 'L', '-', 'C', 'A', 'R', 'R', 'I', 'E', 'R',
+ 'Y', 'E', 'S', 'I', 'E', 'U', 'N', 'G', '-', 'S', 'I', 'O', 'S',
+ 'Y', 'P', 'O', 'G', 'E', 'G', 'R', 'A', 'M', 'M', 'E', 'N', 'I',
+ 'Y', 'U', 'U', 'K', 'A', 'L', 'E', 'A', 'P', 'I', 'N', 'T', 'U',
+ 'A', 'F', 'O', 'R', 'E', 'M', 'E', 'N', 'T', 'I', 'O', 'N', 'E', 'D',
+ 'A', 'R', 'O', 'U', 'N', 'D', '-', 'P', 'R', 'O', 'F', 'I', 'L', 'E',
+ 'A', 'S', 'Y', 'M', 'P', 'T', 'O', 'T', 'I', 'C', 'A', 'L', 'L', 'Y',
+ 'B', 'A', 'L', 'L', 'O', 'O', 'N', '-', 'S', 'P', 'O', 'K', 'E', 'D',
+ 'B', 'O', 'T', 'T', 'O', 'M', '-', 'L', 'I', 'G', 'H', 'T', 'E', 'D',
+ 'C', 'O', 'N', 'G', 'R', 'A', 'T', 'U', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'G', 'O', 'R', 'G', 'O', 'S', 'Y', 'N', 'T', 'H', 'E', 'T', 'O', 'N',
+ 'I', 'D', 'E', 'N', 'T', 'I', 'F', 'I', 'C', 'A', 'T', 'I', 'O', 'N',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'A', 'R',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'Y', 'R',
+ 'M', 'U', 'L', 'T', 'I', 'P', 'L', 'I', 'C', 'A', 'T', 'I', 'O', 'N',
+ 'P', 'A', 'L', 'A', 'T', 'A', 'L', 'I', 'Z', 'A', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'S', 'G', 'E', 'G', 'R', 'A', 'M', 'M', 'E', 'N', 'I',
+ 'R', 'I', 'G', 'H', 'T', '-', 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'R', 'I', 'G', 'H', 'T', '-', 'S', 'H', 'A', 'D', 'O', 'W', 'E', 'D',
+ 'S', 'E', 'S', 'Q', 'U', 'I', 'Q', 'U', 'A', 'D', 'R', 'A', 'T', 'E',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'O', 'S', 'S',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'S', 'O', 'L',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'T', 'Y', 'R',
+ 'S', 'I', 'O', 'S', '-', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'T', 'R', 'I', 'A', 'N', 'G', 'L', 'E', '-', 'R', 'O', 'U', 'N', 'D',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'L', 'Y', 'G', 'I', 'S', 'M', 'A',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'S', 'Y', 'N', 'A', 'G', 'M', 'A',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '6',
+ 'A', 'C', 'C', 'E', 'N', 'T', '-', 'S', 'T', 'A', 'C', 'C', 'A', 'T', 'O',
+ 'A', 'N', 'T', 'I', 'K', 'E', 'N', 'O', 'K', 'Y', 'L', 'I', 'S', 'M', 'A',
+ 'A', 'N', 'T', 'I', 'R', 'E', 'S', 'T', 'R', 'I', 'C', 'T', 'I', 'O', 'N',
+ 'B', 'L', 'A', 'C', 'K', '-', 'F', 'E', 'A', 'T', 'H', 'E', 'R', 'E', 'D',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'S', 'I', 'O', 'S',
+ 'C', 'H', 'I', 'E', 'U', 'C', 'H', '-', 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'C', 'O', 'N', 'C', 'A', 'V', 'E', '-', 'P', 'O', 'I', 'N', 'T', 'E', 'D',
+ 'H', 'I', 'G', 'H', '-', 'R', 'E', 'V', 'E', 'R', 'S', 'E', 'D', '-', '9',
+ 'J', 'A', 'L', 'L', 'A', 'J', 'A', 'L', 'A', 'L', 'O', 'U', 'H', 'O', 'U',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'K', 'R', 'A', 'T', 'I', 'M', 'O', 'K', 'O', 'U', 'F', 'I', 'S', 'M', 'A',
+ 'K', 'R', 'A', 'T', 'I', 'M', 'O', 'Y', 'P', 'O', 'R', 'R', 'O', 'O', 'N',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'O', 'S', 'S',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'S', 'O', 'L',
+ 'M', 'I', 'E', 'U', 'M', '-', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'P', 'E', 'T', 'A', 'S', 'T', 'O', 'K', 'O', 'U', 'F', 'I', 'S', 'M', 'A',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'L', 'Y', 'G', 'I', 'S', 'M', 'A',
+ 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'S', 'Y', 'N', 'A', 'G', 'M', 'A',
+ 'R', 'I', 'E', 'U', 'L', '-', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'M', 'A', 'D', 'R',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'N', 'A', 'U', 'D',
+ 'T', 'E', 'A', 'R', 'D', 'R', 'O', 'P', '-', 'B', 'A', 'R', 'B', 'E', 'D',
+ 'T', 'E', 'A', 'R', 'D', 'R', 'O', 'P', '-', 'S', 'P', 'O', 'K', 'E', 'D',
+ 'T', 'R', 'I', 'A', 'N', 'G', 'L', 'E', '-', 'H', 'E', 'A', 'D', 'E', 'D',
+ 'W', 'H', 'I', 'T', 'E', '-', 'F', 'E', 'A', 'T', 'H', 'E', 'R', 'E', 'D',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'C', 'I', 'E', 'U', 'C',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '6',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'M', 'A', 'D', 'R',
+ 'M', 'A', 'R', 'C', 'A', 'T', 'O', '-', 'S', 'T', 'A', 'C', 'C', 'A', 'T', 'O',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S', '-', 'C', 'I', 'E', 'U', 'C',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S', '-', 'P', 'I', 'E', 'U', 'P',
+ 'R', 'I', 'E', 'U', 'L', '-', 'M', 'I', 'E', 'U', 'M', '-', 'S', 'I', 'O', 'S',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S',
+ 'T', 'E', 'A', 'R', 'D', 'R', 'O', 'P', '-', 'S', 'H', 'A', 'N', 'K', 'E', 'D',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'N',
+ 'Y', 'E', 'S', 'I', 'E', 'U', 'N', 'G', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'A', 'C', 'U', 'T', 'E', '-', 'G', 'R', 'A', 'V', 'E', '-', 'A', 'C', 'U', 'T', 'E',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'G', 'R', 'A', 'V', 'E', '-', 'A', 'C', 'U', 'T', 'E', '-', 'G', 'R', 'A', 'V', 'E',
+ 'I', 'E', 'U', 'N', 'G', '-', 'S', 'S', 'A', 'N', 'G', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'K', 'A', 'T', 'A', 'K', 'A', 'N', 'A', '-', 'H', 'I', 'R', 'A', 'G', 'A', 'N', 'A',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'R', 'I', 'E', 'U', 'L', '-', 'K', 'I', 'Y', 'E', 'O', 'K', '-', 'S', 'I', 'O', 'S',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'I', 'E', 'U', 'P', '-', 'H', 'I', 'E', 'U', 'H',
+ 'R', 'I', 'E', 'U', 'L', '-', 'Y', 'E', 'O', 'R', 'I', 'N', 'H', 'I', 'E', 'U', 'H',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'H', 'A', 'G', 'A', 'L', 'L',
+ 'S', 'I', 'O', 'S', '-', 'P', 'I', 'E', 'U', 'P', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'S', 'O', 'F', 'T', 'W', 'A', 'R', 'E', '-', 'F', 'U', 'N', 'C', 'T', 'I', 'O', 'N',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'S', 'S', 'A', 'N', 'G', 'C', 'I', 'E', 'U', 'C',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'S', 'S', 'A', 'N', 'G', 'P', 'I', 'E', 'U', 'P',
+ 'K', 'I', 'Y', 'E', 'O', 'K', '-', 'S', 'I', 'O', 'S', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'H', 'A', 'G', 'A', 'L', 'L',
+ 'P', 'A', 'R', 'T', 'I', 'A', 'L', 'L', 'Y', '-', 'R', 'E', 'C', 'Y', 'C', 'L', 'E', 'D',
+ 'R', 'I', 'E', 'U', 'L', '-', 'M', 'I', 'E', 'U', 'M', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'R', 'I', 'E', 'U', 'L', '-', 'T', 'I', 'K', 'E', 'U', 'T', '-', 'H', 'I', 'E', 'U', 'H',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'B', 'J', 'A', 'R', 'K', 'A', 'N',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'P', 'A', 'R', 'A', 'K', 'A', 'L', 'E', 'S', 'M', 'A',
+ 'O', 'P', 'E', 'N', '-', 'C', 'I', 'R', 'C', 'U', 'I', 'T', '-', 'O', 'U', 'T', 'P', 'U', 'T',
+ 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'P', 'A', 'R', 'A', 'K', 'A', 'L', 'E', 'S', 'M', 'A',
+ 'R', 'I', 'E', 'U', 'L', '-', 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'P', 'I', 'E', 'U', 'P',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'A', 'N', 'T', 'I', 'C', 'L', 'O', 'C', 'K', 'W', 'I', 'S', 'E', '-', 'R', 'O', 'T', 'A', 'T', 'E', 'D',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'S', 'S', 'A', 'N', 'G', 'C', 'I', 'E', 'U', 'C',
+ 'B', 'Y', 'E', 'L', 'O', 'R', 'U', 'S', 'S', 'I', 'A', 'N', '-', 'U', 'K', 'R', 'A', 'I', 'N', 'I', 'A', 'N',
+ 'P', 'A', 'S', 'S', 'I', 'V', 'E', '-', 'P', 'U', 'L', 'L', '-', 'U', 'P', '-', 'O', 'U', 'T', 'P', 'U', 'T',
+ 'P', 'A', 'S', 'S', 'I', 'V', 'E', '-', 'P', 'U', 'L', 'L', '-', 'D', 'O', 'W', 'N', '-', 'O', 'U', 'T', 'P', 'U', 'T',
+};
+#define UNICODE_CHARNAME_NUM_WORDS 6710
+static const struct { uint16_t extra_offset; uint16_t ind_offset; } unicode_name_by_length[26] = {
+ { 0, 0 },
+ { 0, 0 },
+ { 26, 26 },
+ { 658, 342 },
+ { 4468, 1612 },
+ { 10756, 3184 },
+ { 14596, 3952 },
+ { 17782, 4483 },
+ { 20883, 4926 },
+ { 24251, 5347 },
+ { 27446, 5702 },
+ { 29846, 5942 },
+ { 32629, 6195 },
+ { 35689, 6450 },
+ { 36599, 6520 },
+ { 37607, 6592 },
+ { 38012, 6619 },
+ { 38956, 6678 },
+ { 39177, 6691 },
+ { 39357, 6701 },
+ { 39414, 6704 },
+ { 39434, 6705 },
+ { 39476, 6707 },
+ { 39520, 6709 },
+ { 39520, 6709 },
+ { 39544, 6710 }
+};
+#define UNICODE_CHARNAME_WORD_HANGUL 4143
+#define UNICODE_CHARNAME_WORD_SYLLABLE 5292
+#define UNICODE_CHARNAME_WORD_CJK 454
+#define UNICODE_CHARNAME_WORD_COMPATIBILITY 6457
+static const uint16_t unicode_names[75152] = {
+ 23, 3, 761, 8774,
+ 37, 275, 10642,
+ 47, 275, 1, 11203, 826,
+ 51, 10365, 753, 11680,
+ 51, 10365, 4849, 6989, 9050,
+ 51, 10365, 4849, 9045, 9050,
+ 51, 10365, 5782,
+ 51, 10365, 6031, 6610,
+ 51, 10365, 7421, 13188,
+ 51, 10365, 7443, 6989, 9050,
+ 51, 10365, 7443, 9045, 9050,
+ 51, 10365, 8131, 13188,
+ 51, 10365, 8675, 8590,
+ 51, 10365, 8675, 11734,
+ 51, 10365, 8675, 11908,
+ 51, 10365, 11751, 11908,
+ 63, 9128,
+ 175, 3992,
+ 175, 5496,
+ 175, 7608,
+ 177, 3992,
+ 177, 5496,
+ 177, 7608,
+ 435, 6573, 385, 9798,
+ 435, 6573, 3232,
+ 435, 6573, 6689, 2170,
+ 435, 6573, 6689, 2540,
+ 435, 6573, 6689, 2778,
+ 435, 6573, 6689, 4200,
+ 435, 6573, 6689, 4214,
+ 435, 6573, 6689, 5190,
+ 435, 6573, 6689, 6260,
+ 435, 6573, 6689, 6722,
+ 435, 6573, 6689, 7508,
+ 435, 6573, 6689, 7694,
+ 435, 6573, 7430,
+ 435, 6573, 8405, 68,
+ 435, 6573, 8405, 76,
+ 435, 6573, 8405, 90,
+ 435, 6573, 8405, 176,
+ 435, 6573, 8405, 180,
+ 435, 6573, 8405, 264,
+ 435, 6573, 8405, 280,
+ 435, 6573, 8405, 282,
+ 435, 6573, 8405, 332,
+ 435, 6573, 8405, 336,
+ 435, 6573, 8405, 340,
+ 435, 6573, 8405, 350,
+ 435, 6573, 8405, 354,
+ 435, 6573, 8405, 424,
+ 435, 6573, 8405, 430,
+ 435, 6573, 8405, 452,
+ 435, 6573, 8405, 586,
+ 435, 6573, 8405, 588,
+ 435, 6573, 8405, 608,
+ 435, 6573, 8405, 692,
+ 435, 6573, 8405, 694,
+ 435, 6573, 8405, 696,
+ 435, 6573, 8405, 698,
+ 435, 6573, 8405, 722,
+ 435, 6573, 8405, 1096,
+ 435, 6573, 8405, 1120,
+ 435, 6573, 8405, 1492,
+ 435, 6573, 8405, 1732,
+ 435, 6573, 8405, 2182,
+ 435, 6573, 8405, 2814,
+ 435, 6573, 9299, 10654,
+ 435, 6573, 10426,
+ 435, 6573, 11691, 10654,
+ 435, 6573, 12133, 8153, 8488,
+ 435, 6573, 12133, 8488,
+ 445, 6121, 1045, 8318,
+ 601, 3713, 4849, 4117, 3713, 4849, 9326,
+ 601, 3713, 4849, 4117, 3713, 7443, 9326,
+ 601, 3713, 7443, 4117, 3713, 4849, 9326,
+ 601, 3713, 7443, 4117, 3713, 7443, 9326,
+ 601, 4117, 6434,
+ 601, 4117, 6435, 6121, 3716,
+ 601, 4117, 6505, 6434,
+ 601, 4117, 7821, 6434,
+ 601, 4117, 8153, 6434,
+ 601, 4197, 5878,
+ 601, 5876,
+ 601, 5877, 6121, 8057, 6376,
+ 601, 6435, 9785, 8056,
+ 601, 7443, 10001, 10154,
+ 601, 10716,
+ 601, 10717, 9043, 2779, 11649, 3714,
+ 657, 9617, 134,
+ 657, 9617, 152,
+ 657, 9617, 216,
+ 657, 9617, 298,
+ 657, 9617, 310,
+ 657, 9617, 340,
+ 657, 9617, 374,
+ 657, 9617, 442,
+ 657, 9617, 576,
+ 657, 9617, 632,
+ 657, 9617, 660,
+ 657, 9617, 670,
+ 657, 9617, 832,
+ 657, 9617, 886,
+ 657, 9617, 902,
+ 657, 9617, 946,
+ 657, 9617, 950,
+ 657, 9617, 1242,
+ 657, 9617, 1294,
+ 657, 9617, 1406,
+ 657, 9617, 1538,
+ 657, 9617, 1636,
+ 657, 9617, 1782,
+ 657, 9617, 1844,
+ 657, 9617, 1940,
+ 657, 9617, 2262,
+ 657, 9617, 2278,
+ 657, 9617, 2324,
+ 657, 9617, 2526,
+ 657, 9617, 2570,
+ 657, 9617, 2656,
+ 657, 9617, 2860,
+ 657, 9617, 2890,
+ 657, 9617, 3074,
+ 657, 9617, 3182,
+ 657, 9617, 3194,
+ 657, 9617, 3196,
+ 657, 9617, 3748,
+ 657, 9617, 3962,
+ 657, 9617, 4040,
+ 657, 9617, 4292,
+ 657, 9617, 4298,
+ 657, 9617, 4572,
+ 657, 9617, 4576,
+ 657, 9617, 4582,
+ 657, 9617, 4646,
+ 657, 9617, 4666,
+ 657, 9617, 5064,
+ 657, 9617, 5304,
+ 657, 9617, 5318,
+ 657, 9617, 5356,
+ 657, 9617, 5674,
+ 657, 9617, 5712,
+ 657, 9617, 5726,
+ 657, 9617, 7896,
+ 657, 10585, 0,
+ 657, 10585, 8,
+ 657, 10585, 16,
+ 657, 10585, 28,
+ 657, 10585, 84,
+ 657, 10585, 90,
+ 657, 10585, 96,
+ 657, 10585, 100,
+ 657, 10585, 102,
+ 657, 10585, 106,
+ 657, 10585, 108,
+ 657, 10585, 112,
+ 657, 10585, 114,
+ 657, 10585, 116,
+ 657, 10585, 122,
+ 657, 10585, 126,
+ 657, 10585, 130,
+ 657, 10585, 132,
+ 657, 10585, 134,
+ 657, 10585, 138,
+ 657, 10585, 142,
+ 657, 10585, 144,
+ 657, 10585, 150,
+ 657, 10585, 152,
+ 657, 10585, 194,
+ 657, 10585, 196,
+ 657, 10585, 202,
+ 657, 10585, 208,
+ 657, 10585, 210,
+ 657, 10585, 212,
+ 657, 10585, 216,
+ 657, 10585, 220,
+ 657, 10585, 224,
+ 657, 10585, 228,
+ 657, 10585, 230,
+ 657, 10585, 236,
+ 657, 10585, 238,
+ 657, 10585, 246,
+ 657, 10585, 258,
+ 657, 10585, 278,
+ 657, 10585, 284,
+ 657, 10585, 288,
+ 657, 10585, 296,
+ 657, 10585, 298,
+ 657, 10585, 300,
+ 657, 10585, 302,
+ 657, 10585, 306,
+ 657, 10585, 310,
+ 657, 10585, 314,
+ 657, 10585, 322,
+ 657, 10585, 326,
+ 657, 10585, 332,
+ 657, 10585, 336,
+ 657, 10585, 340,
+ 657, 10585, 350,
+ 657, 10585, 354,
+ 657, 10585, 360,
+ 657, 10585, 364,
+ 657, 10585, 368,
+ 657, 10585, 374,
+ 657, 10585, 380,
+ 657, 10585, 384,
+ 657, 10585, 390,
+ 657, 10585, 392,
+ 657, 10585, 396,
+ 657, 10585, 404,
+ 657, 10585, 412,
+ 657, 10585, 416,
+ 657, 10585, 442,
+ 657, 10585, 448,
+ 657, 10585, 456,
+ 657, 10585, 462,
+ 657, 10585, 476,
+ 657, 10585, 480,
+ 657, 10585, 486,
+ 657, 10585, 492,
+ 657, 10585, 500,
+ 657, 10585, 502,
+ 657, 10585, 506,
+ 657, 10585, 508,
+ 657, 10585, 510,
+ 657, 10585, 512,
+ 657, 10585, 516,
+ 657, 10585, 520,
+ 657, 10585, 522,
+ 657, 10585, 524,
+ 657, 10585, 526,
+ 657, 10585, 532,
+ 657, 10585, 536,
+ 657, 10585, 546,
+ 657, 10585, 552,
+ 657, 10585, 556,
+ 657, 10585, 560,
+ 657, 10585, 564,
+ 657, 10585, 568,
+ 657, 10585, 576,
+ 657, 10585, 598,
+ 657, 10585, 610,
+ 657, 10585, 614,
+ 657, 10585, 616,
+ 657, 10585, 618,
+ 657, 10585, 620,
+ 657, 10585, 622,
+ 657, 10585, 626,
+ 657, 10585, 632,
+ 657, 10585, 634,
+ 657, 10585, 644,
+ 657, 10585, 646,
+ 657, 10585, 650,
+ 657, 10585, 656,
+ 657, 10585, 660,
+ 657, 10585, 664,
+ 657, 10585, 668,
+ 657, 10585, 670,
+ 657, 10585, 672,
+ 657, 10585, 676,
+ 657, 10585, 678,
+ 657, 10585, 680,
+ 657, 10585, 682,
+ 657, 10585, 758,
+ 657, 10585, 762,
+ 657, 10585, 764,
+ 657, 10585, 766,
+ 657, 10585, 768,
+ 657, 10585, 770,
+ 657, 10585, 772,
+ 657, 10585, 774,
+ 657, 10585, 776,
+ 657, 10585, 786,
+ 657, 10585, 790,
+ 657, 10585, 804,
+ 657, 10585, 808,
+ 657, 10585, 810,
+ 657, 10585, 812,
+ 657, 10585, 820,
+ 657, 10585, 822,
+ 657, 10585, 826,
+ 657, 10585, 828,
+ 657, 10585, 830,
+ 657, 10585, 832,
+ 657, 10585, 834,
+ 657, 10585, 836,
+ 657, 10585, 846,
+ 657, 10585, 848,
+ 657, 10585, 850,
+ 657, 10585, 852,
+ 657, 10585, 860,
+ 657, 10585, 862,
+ 657, 10585, 864,
+ 657, 10585, 880,
+ 657, 10585, 882,
+ 657, 10585, 884,
+ 657, 10585, 886,
+ 657, 10585, 890,
+ 657, 10585, 892,
+ 657, 10585, 894,
+ 657, 10585, 896,
+ 657, 10585, 902,
+ 657, 10585, 904,
+ 657, 10585, 906,
+ 657, 10585, 916,
+ 657, 10585, 918,
+ 657, 10585, 922,
+ 657, 10585, 926,
+ 657, 10585, 928,
+ 657, 10585, 930,
+ 657, 10585, 932,
+ 657, 10585, 934,
+ 657, 10585, 946,
+ 657, 10585, 948,
+ 657, 10585, 950,
+ 657, 10585, 952,
+ 657, 10585, 964,
+ 657, 10585, 968,
+ 657, 10585, 970,
+ 657, 10585, 974,
+ 657, 10585, 976,
+ 657, 10585, 978,
+ 657, 10585, 980,
+ 657, 10585, 982,
+ 657, 10585, 992,
+ 657, 10585, 994,
+ 657, 10585, 1008,
+ 657, 10585, 1014,
+ 657, 10585, 1016,
+ 657, 10585, 1018,
+ 657, 10585, 1042,
+ 657, 10585, 1044,
+ 657, 10585, 1046,
+ 657, 10585, 1062,
+ 657, 10585, 1064,
+ 657, 10585, 1066,
+ 657, 10585, 1068,
+ 657, 10585, 1070,
+ 657, 10585, 1144,
+ 657, 10585, 1146,
+ 657, 10585, 1148,
+ 657, 10585, 1162,
+ 657, 10585, 1164,
+ 657, 10585, 1166,
+ 657, 10585, 1174,
+ 657, 10585, 1178,
+ 657, 10585, 1180,
+ 657, 10585, 1182,
+ 657, 10585, 1184,
+ 657, 10585, 1186,
+ 657, 10585, 1196,
+ 657, 10585, 1198,
+ 657, 10585, 1200,
+ 657, 10585, 1218,
+ 657, 10585, 1222,
+ 657, 10585, 1224,
+ 657, 10585, 1242,
+ 657, 10585, 1246,
+ 657, 10585, 1248,
+ 657, 10585, 1250,
+ 657, 10585, 1252,
+ 657, 10585, 1254,
+ 657, 10585, 1256,
+ 657, 10585, 1258,
+ 657, 10585, 1274,
+ 657, 10585, 1278,
+ 657, 10585, 1280,
+ 657, 10585, 1282,
+ 657, 10585, 1292,
+ 657, 10585, 1294,
+ 657, 10585, 1296,
+ 657, 10585, 1312,
+ 657, 10585, 1314,
+ 657, 10585, 1316,
+ 657, 10585, 1318,
+ 657, 10585, 1320,
+ 657, 10585, 1348,
+ 657, 10585, 1352,
+ 657, 10585, 1354,
+ 657, 10585, 1364,
+ 657, 10585, 1368,
+ 657, 10585, 1380,
+ 657, 10585, 1388,
+ 657, 10585, 1390,
+ 657, 10585, 1392,
+ 657, 10585, 1394,
+ 657, 10585, 1396,
+ 657, 10585, 1398,
+ 657, 10585, 1400,
+ 657, 10585, 1402,
+ 657, 10585, 1404,
+ 657, 10585, 1406,
+ 657, 10585, 1408,
+ 657, 10585, 1410,
+ 657, 10585, 1412,
+ 657, 10585, 1414,
+ 657, 10585, 1416,
+ 657, 10585, 1426,
+ 657, 10585, 1428,
+ 657, 10585, 1430,
+ 657, 10585, 1438,
+ 657, 10585, 1450,
+ 657, 10585, 1452,
+ 657, 10585, 1454,
+ 657, 10585, 1456,
+ 657, 10585, 1476,
+ 657, 10585, 1478,
+ 657, 10585, 1480,
+ 657, 10585, 1518,
+ 657, 10585, 1522,
+ 657, 10585, 1524,
+ 657, 10585, 1526,
+ 657, 10585, 1532,
+ 657, 10585, 1534,
+ 657, 10585, 1536,
+ 657, 10585, 1538,
+ 657, 10585, 1544,
+ 657, 10585, 1546,
+ 657, 10585, 1548,
+ 657, 10585, 1552,
+ 657, 10585, 1554,
+ 657, 10585, 1556,
+ 657, 10585, 1558,
+ 657, 10585, 1560,
+ 657, 10585, 1564,
+ 657, 10585, 1566,
+ 657, 10585, 1568,
+ 657, 10585, 1570,
+ 657, 10585, 1590,
+ 657, 10585, 1592,
+ 657, 10585, 1594,
+ 657, 10585, 1604,
+ 657, 10585, 1606,
+ 657, 10585, 1608,
+ 657, 10585, 1626,
+ 657, 10585, 1634,
+ 657, 10585, 1636,
+ 657, 10585, 1638,
+ 657, 10585, 1662,
+ 657, 10585, 1664,
+ 657, 10585, 1666,
+ 657, 10585, 1692,
+ 657, 10585, 1694,
+ 657, 10585, 1696,
+ 657, 10585, 1698,
+ 657, 10585, 1700,
+ 657, 10585, 1742,
+ 657, 10585, 1746,
+ 657, 10585, 1750,
+ 657, 10585, 1766,
+ 657, 10585, 1768,
+ 657, 10585, 1782,
+ 657, 10585, 1788,
+ 657, 10585, 1790,
+ 657, 10585, 1792,
+ 657, 10585, 1804,
+ 657, 10585, 1806,
+ 657, 10585, 1810,
+ 657, 10585, 1824,
+ 657, 10585, 1826,
+ 657, 10585, 1828,
+ 657, 10585, 1830,
+ 657, 10585, 1832,
+ 657, 10585, 1842,
+ 657, 10585, 1844,
+ 657, 10585, 1846,
+ 657, 10585, 1848,
+ 657, 10585, 1862,
+ 657, 10585, 1866,
+ 657, 10585, 1868,
+ 657, 10585, 1898,
+ 657, 10585, 1900,
+ 657, 10585, 1902,
+ 657, 10585, 1904,
+ 657, 10585, 1906,
+ 657, 10585, 1912,
+ 657, 10585, 1924,
+ 657, 10585, 1926,
+ 657, 10585, 1928,
+ 657, 10585, 1940,
+ 657, 10585, 1942,
+ 657, 10585, 1944,
+ 657, 10585, 1954,
+ 657, 10585, 1956,
+ 657, 10585, 1958,
+ 657, 10585, 1960,
+ 657, 10585, 1962,
+ 657, 10585, 1974,
+ 657, 10585, 1976,
+ 657, 10585, 1978,
+ 657, 10585, 1990,
+ 657, 10585, 1994,
+ 657, 10585, 1996,
+ 657, 10585, 1998,
+ 657, 10585, 2000,
+ 657, 10585, 2002,
+ 657, 10585, 2004,
+ 657, 10585, 2006,
+ 657, 10585, 2008,
+ 657, 10585, 2010,
+ 657, 10585, 2012,
+ 657, 10585, 2014,
+ 657, 10585, 2022,
+ 657, 10585, 2028,
+ 657, 10585, 2030,
+ 657, 10585, 2032,
+ 657, 10585, 2038,
+ 657, 10585, 2050,
+ 657, 10585, 2056,
+ 657, 10585, 2058,
+ 657, 10585, 2060,
+ 657, 10585, 2066,
+ 657, 10585, 2068,
+ 657, 10585, 2070,
+ 657, 10585, 2072,
+ 657, 10585, 2086,
+ 657, 10585, 2090,
+ 657, 10585, 2094,
+ 657, 10585, 2096,
+ 657, 10585, 2098,
+ 657, 10585, 2100,
+ 657, 10585, 2102,
+ 657, 10585, 2104,
+ 657, 10585, 2112,
+ 657, 10585, 2114,
+ 657, 10585, 2116,
+ 657, 10585, 2118,
+ 657, 10585, 2120,
+ 657, 10585, 2132,
+ 657, 10585, 2134,
+ 657, 10585, 2136,
+ 657, 10585, 2138,
+ 657, 10585, 2140,
+ 657, 10585, 2142,
+ 657, 10585, 2144,
+ 657, 10585, 2146,
+ 657, 10585, 2194,
+ 657, 10585, 2198,
+ 657, 10585, 2202,
+ 657, 10585, 2222,
+ 657, 10585, 2228,
+ 657, 10585, 2230,
+ 657, 10585, 2232,
+ 657, 10585, 2240,
+ 657, 10585, 2242,
+ 657, 10585, 2244,
+ 657, 10585, 2256,
+ 657, 10585, 2258,
+ 657, 10585, 2260,
+ 657, 10585, 2262,
+ 657, 10585, 2264,
+ 657, 10585, 2274,
+ 657, 10585, 2276,
+ 657, 10585, 2278,
+ 657, 10585, 2280,
+ 657, 10585, 2306,
+ 657, 10585, 2310,
+ 657, 10585, 2312,
+ 657, 10585, 2314,
+ 657, 10585, 2322,
+ 657, 10585, 2324,
+ 657, 10585, 2326,
+ 657, 10585, 2336,
+ 657, 10585, 2338,
+ 657, 10585, 2340,
+ 657, 10585, 2342,
+ 657, 10585, 2348,
+ 657, 10585, 2364,
+ 657, 10585, 2366,
+ 657, 10585, 2368,
+ 657, 10585, 2372,
+ 657, 10585, 2390,
+ 657, 10585, 2392,
+ 657, 10585, 2394,
+ 657, 10585, 2406,
+ 657, 10585, 2408,
+ 657, 10585, 2432,
+ 657, 10585, 2434,
+ 657, 10585, 2436,
+ 657, 10585, 2438,
+ 657, 10585, 2440,
+ 657, 10585, 2442,
+ 657, 10585, 2444,
+ 657, 10585, 2446,
+ 657, 10585, 2456,
+ 657, 10585, 2458,
+ 657, 10585, 2460,
+ 657, 10585, 2462,
+ 657, 10585, 2464,
+ 657, 10585, 2470,
+ 657, 10585, 2472,
+ 657, 10585, 2474,
+ 657, 10585, 2476,
+ 657, 10585, 2492,
+ 657, 10585, 2496,
+ 657, 10585, 2500,
+ 657, 10585, 2508,
+ 657, 10585, 2512,
+ 657, 10585, 2516,
+ 657, 10585, 2518,
+ 657, 10585, 2522,
+ 657, 10585, 2524,
+ 657, 10585, 2526,
+ 657, 10585, 2528,
+ 657, 10585, 2536,
+ 657, 10585, 2538,
+ 657, 10585, 2540,
+ 657, 10585, 2556,
+ 657, 10585, 2558,
+ 657, 10585, 2564,
+ 657, 10585, 2566,
+ 657, 10585, 2568,
+ 657, 10585, 2570,
+ 657, 10585, 2572,
+ 657, 10585, 2574,
+ 657, 10585, 2576,
+ 657, 10585, 2588,
+ 657, 10585, 2590,
+ 657, 10585, 2592,
+ 657, 10585, 2594,
+ 657, 10585, 2596,
+ 657, 10585, 2612,
+ 657, 10585, 2614,
+ 657, 10585, 2616,
+ 657, 10585, 2618,
+ 657, 10585, 2652,
+ 657, 10585, 2656,
+ 657, 10585, 2664,
+ 657, 10585, 2672,
+ 657, 10585, 2676,
+ 657, 10585, 2690,
+ 657, 10585, 2696,
+ 657, 10585, 2700,
+ 657, 10585, 2702,
+ 657, 10585, 2724,
+ 657, 10585, 2726,
+ 657, 10585, 2728,
+ 657, 10585, 2762,
+ 657, 10585, 2764,
+ 657, 10585, 2766,
+ 657, 10585, 2768,
+ 657, 10585, 2770,
+ 657, 10585, 2818,
+ 657, 10585, 2820,
+ 657, 10585, 2848,
+ 657, 10585, 2850,
+ 657, 10585, 2854,
+ 657, 10585, 2860,
+ 657, 10585, 2864,
+ 657, 10585, 2866,
+ 657, 10585, 2870,
+ 657, 10585, 2872,
+ 657, 10585, 2874,
+ 657, 10585, 2878,
+ 657, 10585, 2880,
+ 657, 10585, 2886,
+ 657, 10585, 2888,
+ 657, 10585, 2890,
+ 657, 10585, 2892,
+ 657, 10585, 2894,
+ 657, 10585, 2898,
+ 657, 10585, 2900,
+ 657, 10585, 2902,
+ 657, 10585, 2904,
+ 657, 10585, 2912,
+ 657, 10585, 2914,
+ 657, 10585, 2920,
+ 657, 10585, 2928,
+ 657, 10585, 2930,
+ 657, 10585, 2944,
+ 657, 10585, 2946,
+ 657, 10585, 2950,
+ 657, 10585, 2960,
+ 657, 10585, 2962,
+ 657, 10585, 2964,
+ 657, 10585, 2966,
+ 657, 10585, 2970,
+ 657, 10585, 2974,
+ 657, 10585, 2976,
+ 657, 10585, 2978,
+ 657, 10585, 2996,
+ 657, 10585, 2998,
+ 657, 10585, 3000,
+ 657, 10585, 3004,
+ 657, 10585, 3064,
+ 657, 10585, 3072,
+ 657, 10585, 3074,
+ 657, 10585, 3076,
+ 657, 10585, 3084,
+ 657, 10585, 3086,
+ 657, 10585, 3088,
+ 657, 10585, 3090,
+ 657, 10585, 3092,
+ 657, 10585, 3094,
+ 657, 10585, 3098,
+ 657, 10585, 3100,
+ 657, 10585, 3112,
+ 657, 10585, 3114,
+ 657, 10585, 3116,
+ 657, 10585, 3118,
+ 657, 10585, 3130,
+ 657, 10585, 3132,
+ 657, 10585, 3134,
+ 657, 10585, 3142,
+ 657, 10585, 3144,
+ 657, 10585, 3146,
+ 657, 10585, 3148,
+ 657, 10585, 3152,
+ 657, 10585, 3154,
+ 657, 10585, 3156,
+ 657, 10585, 3162,
+ 657, 10585, 3166,
+ 657, 10585, 3168,
+ 657, 10585, 3170,
+ 657, 10585, 3180,
+ 657, 10585, 3182,
+ 657, 10585, 3184,
+ 657, 10585, 3192,
+ 657, 10585, 3194,
+ 657, 10585, 3196,
+ 657, 10585, 3198,
+ 657, 10585, 3200,
+ 657, 10585, 3204,
+ 657, 10585, 3206,
+ 657, 10585, 3208,
+ 657, 10585, 3210,
+ 657, 10585, 3212,
+ 657, 10585, 3214,
+ 657, 10585, 3216,
+ 657, 10585, 3218,
+ 657, 10585, 3220,
+ 657, 10585, 3222,
+ 657, 10585, 3718,
+ 657, 10585, 3720,
+ 657, 10585, 3722,
+ 657, 10585, 3724,
+ 657, 10585, 3726,
+ 657, 10585, 3728,
+ 657, 10585, 3730,
+ 657, 10585, 3732,
+ 657, 10585, 3734,
+ 657, 10585, 3736,
+ 657, 10585, 3738,
+ 657, 10585, 3740,
+ 657, 10585, 3742,
+ 657, 10585, 3744,
+ 657, 10585, 3746,
+ 657, 10585, 3748,
+ 657, 10585, 3750,
+ 657, 10585, 3752,
+ 657, 10585, 3754,
+ 657, 10585, 3756,
+ 657, 10585, 3782,
+ 657, 10585, 3784,
+ 657, 10585, 3786,
+ 657, 10585, 3816,
+ 657, 10585, 3818,
+ 657, 10585, 3824,
+ 657, 10585, 3828,
+ 657, 10585, 3882,
+ 657, 10585, 3886,
+ 657, 10585, 3888,
+ 657, 10585, 3896,
+ 657, 10585, 3898,
+ 657, 10585, 3900,
+ 657, 10585, 3910,
+ 657, 10585, 3912,
+ 657, 10585, 3914,
+ 657, 10585, 3916,
+ 657, 10585, 3918,
+ 657, 10585, 3920,
+ 657, 10585, 3922,
+ 657, 10585, 3926,
+ 657, 10585, 3928,
+ 657, 10585, 3930,
+ 657, 10585, 3932,
+ 657, 10585, 3934,
+ 657, 10585, 3936,
+ 657, 10585, 3938,
+ 657, 10585, 3962,
+ 657, 10585, 3964,
+ 657, 10585, 3968,
+ 657, 10585, 3976,
+ 657, 10585, 4002,
+ 657, 10585, 4004,
+ 657, 10585, 4006,
+ 657, 10585, 4012,
+ 657, 10585, 4014,
+ 657, 10585, 4020,
+ 657, 10585, 4022,
+ 657, 10585, 4024,
+ 657, 10585, 4026,
+ 657, 10585, 4030,
+ 657, 10585, 4032,
+ 657, 10585, 4034,
+ 657, 10585, 4036,
+ 657, 10585, 4038,
+ 657, 10585, 4040,
+ 657, 10585, 4042,
+ 657, 10585, 4044,
+ 657, 10585, 4082,
+ 657, 10585, 4084,
+ 657, 10585, 4130,
+ 657, 10585, 4134,
+ 657, 10585, 4224,
+ 657, 10585, 4272,
+ 657, 10585, 4274,
+ 657, 10585, 4276,
+ 657, 10585, 4280,
+ 657, 10585, 4282,
+ 657, 10585, 4284,
+ 657, 10585, 4286,
+ 657, 10585, 4288,
+ 657, 10585, 4290,
+ 657, 10585, 4292,
+ 657, 10585, 4294,
+ 657, 10585, 4296,
+ 657, 10585, 4298,
+ 657, 10585, 4300,
+ 657, 10585, 4302,
+ 657, 10585, 4304,
+ 657, 10585, 4306,
+ 657, 10585, 4326,
+ 657, 10585, 4328,
+ 657, 10585, 4330,
+ 657, 10585, 4360,
+ 657, 10585, 4362,
+ 657, 10585, 4364,
+ 657, 10585, 4368,
+ 657, 10585, 4420,
+ 657, 10585, 4426,
+ 657, 10585, 4428,
+ 657, 10585, 4430,
+ 657, 10585, 4432,
+ 657, 10585, 4434,
+ 657, 10585, 4436,
+ 657, 10585, 4438,
+ 657, 10585, 4440,
+ 657, 10585, 4442,
+ 657, 10585, 4444,
+ 657, 10585, 4446,
+ 657, 10585, 4448,
+ 657, 10585, 4450,
+ 657, 10585, 4452,
+ 657, 10585, 4454,
+ 657, 10585, 4456,
+ 657, 10585, 4458,
+ 657, 10585, 4460,
+ 657, 10585, 4462,
+ 657, 10585, 4464,
+ 657, 10585, 4466,
+ 657, 10585, 4468,
+ 657, 10585, 4470,
+ 657, 10585, 4472,
+ 657, 10585, 4474,
+ 657, 10585, 4476,
+ 657, 10585, 4478,
+ 657, 10585, 4480,
+ 657, 10585, 4482,
+ 657, 10585, 4484,
+ 657, 10585, 4486,
+ 657, 10585, 4488,
+ 657, 10585, 4490,
+ 657, 10585, 4492,
+ 657, 10585, 4494,
+ 657, 10585, 4496,
+ 657, 10585, 4498,
+ 657, 10585, 4500,
+ 657, 10585, 4502,
+ 657, 10585, 4504,
+ 657, 10585, 4506,
+ 657, 10585, 4508,
+ 657, 10585, 4510,
+ 657, 10585, 4512,
+ 657, 10585, 4514,
+ 657, 10585, 4516,
+ 657, 10585, 4518,
+ 657, 10585, 4520,
+ 657, 10585, 4522,
+ 657, 10585, 4524,
+ 657, 10585, 4526,
+ 657, 10585, 4528,
+ 657, 10585, 4550,
+ 657, 10585, 4552,
+ 657, 10585, 4554,
+ 657, 10585, 4558,
+ 657, 10585, 4560,
+ 657, 10585, 4562,
+ 657, 10585, 4564,
+ 657, 10585, 4566,
+ 657, 10585, 4568,
+ 657, 10585, 4570,
+ 657, 10585, 4572,
+ 657, 10585, 4574,
+ 657, 10585, 4576,
+ 657, 10585, 4578,
+ 657, 10585, 4580,
+ 657, 10585, 4582,
+ 657, 10585, 4638,
+ 657, 10585, 4640,
+ 657, 10585, 4642,
+ 657, 10585, 4646,
+ 657, 10585, 4648,
+ 657, 10585, 4650,
+ 657, 10585, 4652,
+ 657, 10585, 4654,
+ 657, 10585, 4656,
+ 657, 10585, 4658,
+ 657, 10585, 4660,
+ 657, 10585, 4662,
+ 657, 10585, 4664,
+ 657, 10585, 4666,
+ 657, 10585, 4668,
+ 657, 10585, 4670,
+ 657, 10585, 4672,
+ 657, 10585, 4674,
+ 657, 10585, 4688,
+ 657, 10585, 4690,
+ 657, 10585, 4692,
+ 657, 10585, 4694,
+ 657, 10585, 4696,
+ 657, 10585, 4756,
+ 657, 10585, 4758,
+ 657, 10585, 4786,
+ 657, 10585, 4788,
+ 657, 10585, 4792,
+ 657, 10585, 4866,
+ 657, 10585, 4868,
+ 657, 10585, 4870,
+ 657, 10585, 4902,
+ 657, 10585, 4904,
+ 657, 10585, 4906,
+ 657, 10585, 4908,
+ 657, 10585, 4916,
+ 657, 10585, 4958,
+ 657, 10585, 4960,
+ 657, 10585, 4962,
+ 657, 10585, 4974,
+ 657, 10585, 4976,
+ 657, 10585, 4978,
+ 657, 10585, 4980,
+ 657, 10585, 4982,
+ 657, 10585, 4984,
+ 657, 10585, 4986,
+ 657, 10585, 4988,
+ 657, 10585, 4990,
+ 657, 10585, 4992,
+ 657, 10585, 4994,
+ 657, 10585, 4996,
+ 657, 10585, 4998,
+ 657, 10585, 5020,
+ 657, 10585, 5022,
+ 657, 10585, 5024,
+ 657, 10585, 5028,
+ 657, 10585, 5058,
+ 657, 10585, 5060,
+ 657, 10585, 5062,
+ 657, 10585, 5064,
+ 657, 10585, 5066,
+ 657, 10585, 5068,
+ 657, 10585, 5070,
+ 657, 10585, 5072,
+ 657, 10585, 5074,
+ 657, 10585, 5076,
+ 657, 10585, 5078,
+ 657, 10585, 5080,
+ 657, 10585, 5082,
+ 657, 10585, 5084,
+ 657, 10585, 5086,
+ 657, 10585, 5088,
+ 657, 10585, 5090,
+ 657, 10585, 5092,
+ 657, 10585, 5094,
+ 657, 10585, 5096,
+ 657, 10585, 5098,
+ 657, 10585, 5102,
+ 657, 10585, 5104,
+ 657, 10585, 5106,
+ 657, 10585, 5108,
+ 657, 10585, 5110,
+ 657, 10585, 5112,
+ 657, 10585, 5116,
+ 657, 10585, 5118,
+ 657, 10585, 5120,
+ 657, 10585, 5122,
+ 657, 10585, 5124,
+ 657, 10585, 5126,
+ 657, 10585, 5128,
+ 657, 10585, 5138,
+ 657, 10585, 5142,
+ 657, 10585, 5144,
+ 657, 10585, 5148,
+ 657, 10585, 5150,
+ 657, 10585, 5162,
+ 657, 10585, 5172,
+ 657, 10585, 5174,
+ 657, 10585, 5176,
+ 657, 10585, 5180,
+ 657, 10585, 5186,
+ 657, 10585, 5188,
+ 657, 10585, 5196,
+ 657, 10585, 5198,
+ 657, 10585, 5200,
+ 657, 10585, 5202,
+ 657, 10585, 5206,
+ 657, 10585, 5208,
+ 657, 10585, 5210,
+ 657, 10585, 5212,
+ 657, 10585, 5214,
+ 657, 10585, 5216,
+ 657, 10585, 5218,
+ 657, 10585, 5220,
+ 657, 10585, 5222,
+ 657, 10585, 5224,
+ 657, 10585, 5226,
+ 657, 10585, 5246,
+ 657, 10585, 5248,
+ 657, 10585, 5250,
+ 657, 10585, 5252,
+ 657, 10585, 5254,
+ 657, 10585, 5256,
+ 657, 10585, 5258,
+ 657, 10585, 5260,
+ 657, 10585, 5262,
+ 657, 10585, 5264,
+ 657, 10585, 5266,
+ 657, 10585, 5268,
+ 657, 10585, 5270,
+ 657, 10585, 5272,
+ 657, 10585, 5274,
+ 657, 10585, 5276,
+ 657, 10585, 5282,
+ 657, 10585, 5284,
+ 657, 10585, 5286,
+ 657, 10585, 5302,
+ 657, 10585, 5304,
+ 657, 10585, 5308,
+ 657, 10585, 5310,
+ 657, 10585, 5318,
+ 657, 10585, 5320,
+ 657, 10585, 5322,
+ 657, 10585, 5324,
+ 657, 10585, 5326,
+ 657, 10585, 5328,
+ 657, 10585, 5330,
+ 657, 10585, 5334,
+ 657, 10585, 5336,
+ 657, 10585, 5338,
+ 657, 10585, 5340,
+ 657, 10585, 5342,
+ 657, 10585, 5344,
+ 657, 10585, 5346,
+ 657, 10585, 5348,
+ 657, 10585, 5350,
+ 657, 10585, 5352,
+ 657, 10585, 5354,
+ 657, 10585, 5356,
+ 657, 10585, 5358,
+ 657, 10585, 5360,
+ 657, 10585, 5362,
+ 657, 10585, 5364,
+ 657, 10585, 5366,
+ 657, 10585, 5368,
+ 657, 10585, 5426,
+ 657, 10585, 5428,
+ 657, 10585, 5454,
+ 657, 10585, 5456,
+ 657, 10585, 5458,
+ 657, 10585, 5468,
+ 657, 10585, 5488,
+ 657, 10585, 5490,
+ 657, 10585, 5492,
+ 657, 10585, 5498,
+ 657, 10585, 5500,
+ 657, 10585, 5502,
+ 657, 10585, 5504,
+ 657, 10585, 5516,
+ 657, 10585, 5570,
+ 657, 10585, 5574,
+ 657, 10585, 5576,
+ 657, 10585, 5578,
+ 657, 10585, 5580,
+ 657, 10585, 5582,
+ 657, 10585, 5584,
+ 657, 10585, 5586,
+ 657, 10585, 5588,
+ 657, 10585, 5590,
+ 657, 10585, 5592,
+ 657, 10585, 5594,
+ 657, 10585, 5596,
+ 657, 10585, 5598,
+ 657, 10585, 5600,
+ 657, 10585, 5602,
+ 657, 10585, 5608,
+ 657, 10585, 5610,
+ 657, 10585, 5612,
+ 657, 10585, 5618,
+ 657, 10585, 5672,
+ 657, 10585, 5674,
+ 657, 10585, 5676,
+ 657, 10585, 5684,
+ 657, 10585, 5686,
+ 657, 10585, 5688,
+ 657, 10585, 5712,
+ 657, 10585, 5714,
+ 657, 10585, 5716,
+ 657, 10585, 5722,
+ 657, 10585, 5724,
+ 657, 10585, 5726,
+ 657, 10585, 5728,
+ 657, 10585, 5730,
+ 657, 10585, 5742,
+ 657, 10585, 5744,
+ 657, 10585, 5746,
+ 657, 10585, 5748,
+ 657, 10585, 5752,
+ 657, 10585, 5754,
+ 657, 10585, 5788,
+ 657, 10585, 5790,
+ 657, 10585, 5792,
+ 657, 10585, 5796,
+ 657, 10585, 5798,
+ 657, 10585, 5800,
+ 657, 10585, 5802,
+ 657, 10585, 5804,
+ 657, 10585, 5806,
+ 657, 10585, 5808,
+ 657, 10585, 5810,
+ 657, 10585, 5812,
+ 657, 10585, 5814,
+ 657, 10585, 5816,
+ 657, 10585, 5818,
+ 657, 10585, 5820,
+ 657, 10585, 5822,
+ 657, 10585, 5824,
+ 657, 10585, 5826,
+ 657, 10585, 5848,
+ 657, 10585, 5850,
+ 657, 10585, 5856,
+ 657, 10585, 5864,
+ 657, 10585, 5936,
+ 657, 10585, 5938,
+ 657, 10585, 6014,
+ 657, 10585, 6016,
+ 657, 10585, 6018,
+ 657, 10585, 6022,
+ 657, 10585, 6084,
+ 657, 10585, 6086,
+ 657, 10585, 6088,
+ 657, 10585, 6094,
+ 657, 10585, 6096,
+ 657, 10585, 6134,
+ 657, 10585, 6136,
+ 657, 10585, 6140,
+ 657, 10585, 6142,
+ 657, 10585, 6144,
+ 657, 10585, 6146,
+ 657, 10585, 6156,
+ 657, 10585, 6206,
+ 657, 10585, 6208,
+ 657, 10585, 6210,
+ 657, 10585, 6238,
+ 657, 10585, 6240,
+ 657, 10585, 6242,
+ 657, 10585, 6244,
+ 657, 10585, 6252,
+ 657, 10585, 6266,
+ 657, 10585, 6270,
+ 657, 10585, 6272,
+ 657, 10585, 6276,
+ 657, 10585, 6278,
+ 657, 10585, 6280,
+ 657, 10585, 6284,
+ 657, 10585, 6286,
+ 657, 10585, 6288,
+ 657, 10585, 6290,
+ 657, 10585, 6292,
+ 657, 10585, 6294,
+ 657, 10585, 6296,
+ 657, 10585, 6298,
+ 657, 10585, 6304,
+ 657, 10585, 6306,
+ 657, 10585, 6308,
+ 657, 10585, 6310,
+ 657, 10585, 6314,
+ 657, 10585, 6316,
+ 657, 10585, 6320,
+ 657, 10585, 6322,
+ 657, 10585, 6324,
+ 657, 10585, 6326,
+ 657, 10585, 6330,
+ 657, 10585, 6332,
+ 657, 10585, 6334,
+ 657, 10585, 6338,
+ 657, 10585, 6340,
+ 657, 10585, 6342,
+ 657, 10585, 6344,
+ 657, 10585, 6346,
+ 657, 10585, 6348,
+ 657, 10585, 6350,
+ 657, 10585, 6352,
+ 657, 10585, 6354,
+ 657, 10585, 6356,
+ 657, 10585, 6358,
+ 657, 10585, 6360,
+ 657, 10585, 6362,
+ 657, 10585, 6364,
+ 657, 10585, 6366,
+ 657, 10585, 6470,
+ 657, 10585, 6472,
+ 657, 10585, 6474,
+ 657, 10585, 6476,
+ 657, 10585, 6478,
+ 657, 10585, 6480,
+ 657, 10585, 6584,
+ 657, 10585, 6586,
+ 657, 10585, 6588,
+ 657, 10585, 6590,
+ 657, 10585, 6592,
+ 657, 10585, 6660,
+ 657, 10585, 6662,
+ 657, 10585, 6664,
+ 657, 10585, 6666,
+ 657, 10585, 6668,
+ 657, 10585, 6834,
+ 657, 10585, 6836,
+ 657, 10585, 6838,
+ 657, 10585, 6840,
+ 657, 10585, 6842,
+ 657, 10585, 6844,
+ 657, 10585, 6916,
+ 657, 10585, 6918,
+ 657, 10585, 6920,
+ 657, 10585, 6922,
+ 657, 10585, 6924,
+ 657, 10585, 6926,
+ 657, 10585, 6928,
+ 657, 10585, 6930,
+ 657, 10585, 6932,
+ 657, 10585, 6934,
+ 657, 10585, 6936,
+ 657, 10585, 6938,
+ 657, 10585, 6940,
+ 657, 10585, 6942,
+ 657, 10585, 6944,
+ 657, 10585, 6946,
+ 657, 10585, 6962,
+ 657, 10585, 6964,
+ 657, 10585, 6966,
+ 657, 10585, 6968,
+ 657, 10585, 6970,
+ 657, 10585, 6972,
+ 657, 10585, 6998,
+ 657, 10585, 7000,
+ 657, 10585, 7002,
+ 657, 10585, 7004,
+ 657, 10585, 7006,
+ 657, 10585, 7008,
+ 657, 10585, 7156,
+ 657, 10585, 7158,
+ 657, 10585, 7160,
+ 657, 10585, 7162,
+ 657, 10585, 7212,
+ 657, 10585, 7214,
+ 657, 10585, 7216,
+ 657, 10585, 7218,
+ 657, 10585, 7220,
+ 657, 10585, 7224,
+ 657, 10585, 7234,
+ 657, 10585, 7236,
+ 657, 10585, 7240,
+ 657, 10585, 7242,
+ 657, 10585, 7250,
+ 657, 10585, 7252,
+ 657, 10585, 7254,
+ 657, 10585, 7256,
+ 657, 10585, 7258,
+ 657, 10585, 7260,
+ 657, 10585, 7278,
+ 657, 10585, 7280,
+ 657, 10585, 7286,
+ 657, 10585, 7288,
+ 657, 10585, 7290,
+ 657, 10585, 7292,
+ 657, 10585, 7294,
+ 657, 10585, 7296,
+ 657, 10585, 7298,
+ 657, 10585, 7300,
+ 657, 10585, 7302,
+ 657, 10585, 7304,
+ 657, 10585, 7456,
+ 657, 10585, 7458,
+ 657, 10585, 7460,
+ 657, 10585, 7552,
+ 657, 10585, 7554,
+ 657, 10585, 7556,
+ 657, 10585, 7564,
+ 657, 10585, 7620,
+ 657, 10585, 7622,
+ 657, 10585, 7624,
+ 657, 10585, 7876,
+ 657, 10585, 7878,
+ 657, 10585, 7880,
+ 657, 10585, 7882,
+ 657, 10585, 7894,
+ 657, 10585, 7896,
+ 657, 10585, 7898,
+ 657, 10585, 7900,
+ 657, 10585, 7902,
+ 705, 8694,
+ 719, 6741, 568,
+ 719, 13042,
+ 721, 6121, 1044,
+ 729, 11635, 8775, 601, 5707, 1546,
+ 729, 11635, 8775, 601, 5877, 1546,
+ 729, 11635, 8775, 601, 5877, 9546,
+ 729, 11635, 8775, 601, 5877, 10804,
+ 729, 11635, 8775, 601, 6543, 7708,
+ 729, 11635, 8775, 991, 7636,
+ 729, 11635, 8775, 991, 7708,
+ 729, 11635, 8775, 991, 10804,
+ 729, 11635, 8775, 1547, 10666,
+ 729, 11635, 8775, 1547, 10804,
+ 729, 11635, 8775, 2412,
+ 729, 11635, 8775, 4117, 5707, 7636,
+ 729, 11635, 8775, 4117, 5877, 1546,
+ 729, 11635, 8775, 4117, 5877, 10666,
+ 729, 11635, 8775, 4117, 6543, 7708,
+ 729, 11635, 8775, 4614,
+ 729, 11635, 8775, 4615, 10666,
+ 729, 11635, 8775, 4849, 5707, 7636,
+ 729, 11635, 8775, 5496,
+ 729, 11635, 8775, 5497, 601, 6542,
+ 729, 11635, 8775, 5497, 990,
+ 729, 11635, 8775, 5497, 1546,
+ 729, 11635, 8775, 5497, 2091, 6740,
+ 729, 11635, 8775, 5497, 4117, 6542,
+ 729, 11635, 8775, 5497, 6610,
+ 729, 11635, 8775, 5497, 6674,
+ 729, 11635, 8775, 5497, 6740,
+ 729, 11635, 8775, 5497, 7580,
+ 729, 11635, 8775, 5497, 8056,
+ 729, 11635, 8775, 5497, 8122,
+ 729, 11635, 8775, 5497, 9158,
+ 729, 11635, 8775, 5497, 9811, 6434,
+ 729, 11635, 8775, 5497, 10468,
+ 729, 11635, 8775, 5497, 10728,
+ 729, 11635, 8775, 5497, 10959, 6434,
+ 729, 11635, 8775, 5497, 11097, 6434,
+ 729, 11635, 8775, 5497, 11098,
+ 729, 11635, 8775, 5497, 11765, 6434,
+ 729, 11635, 8775, 5497, 12472,
+ 729, 11635, 8775, 5831, 10804,
+ 729, 11635, 8775, 6406,
+ 729, 11635, 8775, 6407, 10666,
+ 729, 11635, 8775, 6617, 760,
+ 729, 11635, 8775, 6675, 7636,
+ 729, 11635, 8775, 6675, 10666,
+ 729, 11635, 8775, 7316,
+ 729, 11635, 8775, 7317, 10666,
+ 729, 11635, 8775, 7415, 5496,
+ 729, 11635, 8775, 7415, 10666,
+ 729, 11635, 8775, 7581, 760,
+ 729, 11635, 8775, 7637, 7708,
+ 729, 11635, 8775, 7709, 10804,
+ 729, 11635, 8775, 7884,
+ 729, 11635, 8775, 8057, 1546,
+ 729, 11635, 8775, 8057, 5830,
+ 729, 11635, 8775, 8057, 7636,
+ 729, 11635, 8775, 8057, 10666,
+ 729, 11635, 8775, 8057, 10728,
+ 729, 11635, 8775, 8057, 10804,
+ 729, 11635, 8775, 8308,
+ 729, 11635, 8775, 8747, 5496,
+ 729, 11635, 8775, 9159, 10666,
+ 729, 11635, 8775, 9271, 10666,
+ 729, 11635, 8775, 9811, 6074,
+ 729, 11635, 8775, 10729, 760,
+ 729, 11635, 8775, 10959, 6074,
+ 729, 11635, 8775, 11097, 6074,
+ 729, 11635, 8775, 11225, 10666,
+ 729, 11635, 8775, 11765, 6074,
+ 729, 11635, 8775, 12473, 10804,
+ 730,
+ 789, 8774,
+ 807, 9633, 9718,
+ 807, 9718,
+ 827, 10145, 601, 6909, 721, 4117, 11649, 7100,
+ 827, 10145, 601, 6909, 721, 4849, 4117, 7100,
+ 827, 10145, 601, 6909, 721, 4849, 7100,
+ 827, 10145, 601, 6909, 721, 7443, 4117, 7100,
+ 827, 10145, 601, 6909, 721, 7443, 7100,
+ 827, 10145, 601, 6909, 721, 11649, 7100,
+ 827, 10145, 601, 7101, 721, 4117, 11649, 6908,
+ 827, 10145, 601, 7101, 721, 4849, 4117, 6908,
+ 827, 10145, 601, 7101, 721, 4849, 6908,
+ 827, 10145, 601, 7101, 721, 7443, 4117, 6908,
+ 827, 10145, 601, 7101, 721, 7443, 6908,
+ 827, 10145, 601, 7101, 721, 11649, 6908,
+ 827, 10145, 601, 8153, 721, 4849, 8716,
+ 827, 10145, 601, 8153, 721, 7443, 8716,
+ 827, 10145, 601, 8153, 721, 11649, 8716,
+ 827, 10145, 601, 8717, 721, 4849, 8152,
+ 827, 10145, 601, 8717, 721, 7443, 8152,
+ 827, 10145, 601, 8717, 721, 11649, 8152,
+ 827, 10145, 4117, 6909, 721, 601, 11649, 7100,
+ 827, 10145, 4117, 6909, 721, 4849, 601, 7100,
+ 827, 10145, 4117, 6909, 721, 4849, 7100,
+ 827, 10145, 4117, 6909, 721, 7443, 601, 7100,
+ 827, 10145, 4117, 6909, 721, 7443, 7100,
+ 827, 10145, 4117, 6909, 721, 11649, 7100,
+ 827, 10145, 4117, 7101, 721, 601, 11649, 6908,
+ 827, 10145, 4117, 7101, 721, 4849, 601, 6908,
+ 827, 10145, 4117, 7101, 721, 4849, 6908,
+ 827, 10145, 4117, 7101, 721, 7443, 601, 6908,
+ 827, 10145, 4117, 7101, 721, 7443, 6908,
+ 827, 10145, 4117, 7101, 721, 11649, 6908,
+ 827, 10145, 4117, 8153, 721, 4849, 8716,
+ 827, 10145, 4117, 8153, 721, 7443, 8716,
+ 827, 10145, 4117, 8153, 721, 11649, 8716,
+ 827, 10145, 4117, 8717, 721, 4849, 8152,
+ 827, 10145, 4117, 8717, 721, 7443, 8152,
+ 827, 10145, 4117, 8717, 721, 11649, 8152,
+ 827, 10145, 4849, 601, 6909, 721, 7443, 4117, 7100,
+ 827, 10145, 4849, 4117, 6909, 721, 7443, 601, 7100,
+ 827, 10145, 4849, 6909, 721, 7443, 601, 7100,
+ 827, 10145, 4849, 6909, 721, 7443, 4117, 7100,
+ 827, 10145, 4849, 6909, 721, 7443, 10677, 7100,
+ 827, 10145, 4849, 7101, 721, 7443, 601, 6908,
+ 827, 10145, 4849, 7101, 721, 7443, 4117, 6908,
+ 827, 10145, 4849, 7101, 721, 7443, 10677, 6908,
+ 827, 10145, 6909, 600,
+ 827, 10145, 6909, 601, 721, 4848,
+ 827, 10145, 6909, 601, 721, 7101, 4116,
+ 827, 10145, 6909, 601, 721, 7442,
+ 827, 10145, 6909, 601, 721, 11648,
+ 827, 10145, 6909, 4116,
+ 827, 10145, 6909, 4117, 721, 4848,
+ 827, 10145, 6909, 4117, 721, 7442,
+ 827, 10145, 6909, 4117, 721, 11648,
+ 827, 10145, 6909, 4848,
+ 827, 10145, 6909, 4849, 721, 7101, 7442,
+ 827, 10145, 6909, 7442,
+ 827, 10145, 6909, 8153, 3993, 10676,
+ 827, 10145, 6909, 8153, 3993, 11648,
+ 827, 10145, 6909, 8849, 3993, 10676,
+ 827, 10145, 6909, 8849, 3993, 11648,
+ 827, 10145, 6909, 10676,
+ 827, 10145, 6909, 10677, 721, 4848,
+ 827, 10145, 6909, 10677, 721, 7442,
+ 827, 10145, 6909, 10677, 721, 11648,
+ 827, 10145, 6909, 11191, 3993, 10676,
+ 827, 10145, 6909, 11191, 3993, 11648,
+ 827, 10145, 6909, 11648,
+ 827, 10145, 7101, 600,
+ 827, 10145, 7101, 601, 721, 4848,
+ 827, 10145, 7101, 601, 721, 6909, 4116,
+ 827, 10145, 7101, 601, 721, 7442,
+ 827, 10145, 7101, 601, 721, 11648,
+ 827, 10145, 7101, 731, 601, 721, 4848,
+ 827, 10145, 7101, 731, 601, 721, 7442,
+ 827, 10145, 7101, 731, 4117, 721, 4848,
+ 827, 10145, 7101, 731, 4117, 721, 7442,
+ 827, 10145, 7101, 4116,
+ 827, 10145, 7101, 4117, 721, 4848,
+ 827, 10145, 7101, 4117, 721, 7442,
+ 827, 10145, 7101, 4117, 721, 11648,
+ 827, 10145, 7101, 4848,
+ 827, 10145, 7101, 4849, 721, 6909, 7442,
+ 827, 10145, 7101, 7442,
+ 827, 10145, 7101, 8153, 3993, 10676,
+ 827, 10145, 7101, 8153, 3993, 11648,
+ 827, 10145, 7101, 8849, 3993, 10676,
+ 827, 10145, 7101, 8849, 3993, 11648,
+ 827, 10145, 7101, 10001, 6622,
+ 827, 10145, 7101, 10001, 7773, 4849, 569, 7121, 7442,
+ 827, 10145, 7101, 10001, 7773, 7443, 569, 7121, 4848,
+ 827, 10145, 7101, 10676,
+ 827, 10145, 7101, 10677, 721, 4848,
+ 827, 10145, 7101, 10677, 721, 7442,
+ 827, 10145, 7101, 10677, 721, 11648,
+ 827, 10145, 7101, 11191, 3993, 10676,
+ 827, 10145, 7101, 11191, 3993, 11648,
+ 827, 10145, 7101, 11648,
+ 827, 10145, 7443, 601, 6909, 721, 4849, 4117, 7100,
+ 827, 10145, 7443, 4117, 6909, 721, 4849, 601, 7100,
+ 827, 10145, 7443, 6909, 721, 4849, 601, 7100,
+ 827, 10145, 7443, 6909, 721, 4849, 4117, 7100,
+ 827, 10145, 7443, 6909, 721, 4849, 10677, 7100,
+ 827, 10145, 7443, 7101, 721, 4849, 601, 6908,
+ 827, 10145, 7443, 7101, 721, 4849, 4117, 6908,
+ 827, 10145, 7443, 7101, 721, 4849, 10677, 6908,
+ 827, 10145, 8153, 601, 721, 4848,
+ 827, 10145, 8153, 601, 721, 7442,
+ 827, 10145, 8153, 601, 721, 11648,
+ 827, 10145, 8153, 4117, 721, 4848,
+ 827, 10145, 8153, 4117, 721, 7442,
+ 827, 10145, 8153, 4117, 721, 11648,
+ 827, 10145, 8153, 10676,
+ 827, 10145, 8153, 10677, 721, 4848,
+ 827, 10145, 8153, 10677, 721, 7442,
+ 827, 10145, 8153, 10677, 721, 11648,
+ 827, 10145, 8153, 11648,
+ 827, 10145, 10677, 6909, 721, 4849, 7100,
+ 827, 10145, 10677, 6909, 721, 7443, 7100,
+ 827, 10145, 10677, 6909, 721, 11649, 7100,
+ 827, 10145, 10677, 7101, 721, 4849, 6908,
+ 827, 10145, 10677, 7101, 721, 7443, 6908,
+ 827, 10145, 10677, 7101, 721, 11649, 6908,
+ 827, 10145, 10677, 8153, 721, 4849, 8716,
+ 827, 10145, 10677, 8153, 721, 7443, 8716,
+ 827, 10145, 10677, 8153, 721, 11649, 8716,
+ 827, 10145, 10677, 8717, 721, 4849, 8152,
+ 827, 10145, 10677, 8717, 721, 7443, 8152,
+ 827, 10145, 10677, 8717, 721, 11649, 8152,
+ 889, 2412,
+ 909, 8759, 6,
+ 909, 8759, 14,
+ 909, 8759, 26,
+ 909, 8759, 30,
+ 909, 8759, 32,
+ 909, 8759, 36,
+ 909, 8759, 38,
+ 909, 8759, 240,
+ 909, 8759, 248,
+ 909, 8759, 254,
+ 909, 8759, 466,
+ 909, 8759, 472,
+ 909, 8759, 494,
+ 909, 8759, 528,
+ 909, 8759, 538,
+ 909, 8759, 544,
+ 909, 8759, 550,
+ 909, 8759, 554,
+ 909, 8759, 566,
+ 909, 8759, 628,
+ 909, 8759, 642,
+ 909, 8759, 844,
+ 909, 8759, 1458,
+ 909, 8759, 1460,
+ 909, 8759, 1462,
+ 909, 8759, 1464,
+ 909, 8759, 2602,
+ 909, 8759, 2608,
+ 909, 8759, 2630,
+ 909, 8759, 4542,
+ 909, 8759, 4584,
+ 909, 8759, 4586,
+ 909, 8759, 4588,
+ 909, 8759, 4590,
+ 909, 8759, 5872,
+ 909, 8759, 6974,
+ 909, 9617, 826,
+ 909, 9617, 920,
+ 909, 9617, 1036,
+ 909, 9617, 1093, 2170,
+ 909, 9617, 1093, 2778,
+ 909, 9617, 1093, 7694,
+ 909, 9617, 1132,
+ 909, 9617, 1136,
+ 909, 9617, 2025, 2170,
+ 909, 9617, 2025, 2778,
+ 909, 9617, 2025, 4214,
+ 909, 9617, 2025, 7694,
+ 909, 9617, 2166,
+ 909, 9617, 2201, 2170,
+ 909, 9617, 2201, 2778,
+ 909, 9617, 2386,
+ 909, 9617, 2390,
+ 909, 9617, 2586,
+ 909, 9617, 3794,
+ 909, 9617, 3805, 429, 6604,
+ 909, 9617, 3806,
+ 909, 9617, 3940,
+ 909, 9617, 4194,
+ 909, 9617, 4208,
+ 909, 9617, 4390,
+ 909, 9617, 4398,
+ 909, 9617, 4536,
+ 909, 9617, 4628,
+ 909, 9617, 4835, 2170,
+ 909, 9617, 4835, 2778,
+ 909, 9617, 4835, 4214,
+ 909, 9617, 4835, 7694,
+ 909, 9617, 4895, 2170,
+ 909, 9617, 4895, 2778,
+ 909, 9617, 4940,
+ 909, 9617, 4950,
+ 909, 9617, 5012,
+ 909, 9617, 5524,
+ 909, 9617, 5646,
+ 909, 9617, 5764,
+ 909, 9617, 6101, 2170,
+ 909, 9617, 6101, 2778,
+ 909, 9617, 6113, 2170,
+ 909, 9617, 6113, 2778,
+ 909, 9617, 6521, 2170,
+ 909, 9617, 6521, 2778,
+ 909, 9617, 6578,
+ 909, 9617, 6600,
+ 909, 9617, 6670,
+ 909, 9617, 6852,
+ 909, 9617, 6873, 2170,
+ 909, 9617, 6873, 2778,
+ 909, 9617, 6873, 7694,
+ 909, 9617, 6907, 2170,
+ 909, 9617, 6907, 2778,
+ 909, 9617, 7057, 2170,
+ 909, 9617, 7057, 2778,
+ 909, 9617, 7185, 2170,
+ 909, 9617, 7185, 2778,
+ 909, 9617, 7526,
+ 909, 9617, 7593, 2170,
+ 909, 9617, 7593, 2778,
+ 909, 9617, 7600,
+ 909, 9617, 7603, 2170,
+ 909, 9617, 7603, 2778,
+ 909, 9617, 7662,
+ 909, 9617, 7704,
+ 909, 9617, 7813, 2170,
+ 909, 9617, 7813, 2778,
+ 909, 9617, 7974,
+ 909, 9617, 8484,
+ 909, 9617, 8486,
+ 909, 9617, 8576,
+ 909, 9617, 8640,
+ 909, 9617, 8681, 2170,
+ 909, 9617, 8681, 2778,
+ 909, 9617, 8681, 7694,
+ 909, 9617, 8735, 2170,
+ 909, 9617, 8735, 2778,
+ 909, 9617, 8824,
+ 909, 9617, 8870,
+ 909, 9617, 9102,
+ 909, 9617, 9948,
+ 909, 9617, 11488,
+ 909, 9617, 11803, 4389, 5969, 7736,
+ 909, 9617, 11803, 4536,
+ 909, 9617, 11803, 6100,
+ 909, 9617, 11803, 7816,
+ 909, 9617, 11803, 8946,
+ 909, 9617, 12419, 1092,
+ 909, 9617, 12419, 1170,
+ 909, 9617, 12419, 2504,
+ 909, 9617, 12419, 3788,
+ 909, 9617, 12419, 3850,
+ 909, 9617, 12419, 4172,
+ 909, 9617, 12419, 4196,
+ 909, 9617, 12419, 4218,
+ 909, 9617, 12419, 4244,
+ 909, 9617, 12419, 4342,
+ 909, 9617, 12419, 4844,
+ 909, 9617, 12419, 4894,
+ 909, 9617, 12419, 5632,
+ 909, 9617, 12419, 5764,
+ 909, 9617, 12419, 6116,
+ 909, 9617, 12419, 6952,
+ 909, 9617, 12419, 7532,
+ 909, 9617, 12419, 7726,
+ 909, 9617, 12419, 8154,
+ 909, 9617, 12419, 8730,
+ 909, 9617, 12419, 8793, 9426,
+ 909, 9617, 12419, 8870,
+ 909, 9617, 12495, 4172,
+ 909, 9617, 12495, 7726,
+ 909, 9617, 12495, 8154,
+ 909, 9617, 12495, 8870,
+ 1009, 8178,
+ 1009, 8180,
+ 1009, 8182,
+ 1009, 8184,
+ 1009, 8186,
+ 1009, 8188,
+ 1045, 5444,
+ 1045, 6376,
+ 1045, 7172,
+ 1045, 10374,
+ 1109, 429, 7394,
+ 1177, 718,
+ 1429, 9730,
+ 1429, 9912,
+ 1635, 5758,
+ 1741, 247, 380,
+ 1741, 247, 412,
+ 1741, 323, 332,
+ 1741, 5965, 1859, 170,
+ 1741, 5965, 1859, 564,
+ 1741, 5965, 1859, 2684,
+ 1741, 5965, 1859, 8034,
+ 1741, 6689, 2170,
+ 1741, 6689, 2540,
+ 1741, 6689, 2778,
+ 1741, 6689, 4200,
+ 1741, 6689, 4214,
+ 1741, 6689, 5190,
+ 1741, 6689, 6260,
+ 1741, 6689, 6722,
+ 1741, 6689, 7508,
+ 1741, 6689, 7694,
+ 1741, 7803, 5759, 0,
+ 1741, 7803, 5759, 8,
+ 1741, 7803, 5759, 16,
+ 1741, 7803, 5759, 28,
+ 1741, 7803, 5759, 40,
+ 1741, 7803, 5759, 48,
+ 1741, 7803, 5759, 58,
+ 1741, 7803, 5759, 72,
+ 1741, 7803, 5759, 78,
+ 1741, 7803, 5759, 98,
+ 1741, 7803, 5759, 168,
+ 1741, 7803, 5759, 266,
+ 1741, 7803, 5759, 606,
+ 1741, 7803, 5759, 668,
+ 1741, 7803, 5759, 1859, 1588,
+ 1741, 7803, 5759, 1859, 1658,
+ 1741, 8405, 28,
+ 1741, 8405, 108,
+ 1741, 8405, 130,
+ 1741, 8405, 150,
+ 1741, 8405, 209, 2646,
+ 1741, 8405, 209, 5846,
+ 1741, 8405, 247, 2646,
+ 1741, 8405, 247, 5846,
+ 1741, 8405, 322,
+ 1741, 8405, 351, 4878,
+ 1741, 8405, 351, 4898,
+ 1741, 8405, 380,
+ 1741, 8405, 412,
+ 1741, 8405, 480,
+ 1741, 8405, 537, 2646,
+ 1741, 8405, 537, 5846,
+ 1741, 8405, 568,
+ 1741, 8405, 632,
+ 1741, 8405, 660,
+ 1741, 8405, 1619, 2646,
+ 1741, 8405, 1619, 5846,
+ 1741, 8405, 2038,
+ 1741, 8405, 2134,
+ 1741, 8405, 2219, 2646,
+ 1741, 8405, 2219, 5846,
+ 1741, 8405, 2685, 2646,
+ 1741, 8405, 2685, 5846,
+ 1741, 10154,
+ 1741, 11134,
+ 1741, 11227, 5759, 350,
+ 1741, 11227, 5759, 2134,
+ 1741, 12421, 4926,
+ 1764,
+ 1809, 4876,
+ 1809, 8153, 7391, 11195, 4926,
+ 1809, 9898,
+ 2027, 2643, 1817, 5759, 1734,
+ 2027, 2643, 1817, 5759, 4826,
+ 2027, 2643, 1817, 5965, 8442,
+ 2027, 2643, 1817, 5965, 8444,
+ 2027, 2643, 1817, 6689, 2170,
+ 2027, 2643, 1817, 6689, 2540,
+ 2027, 2643, 1817, 6689, 2778,
+ 2027, 2643, 1817, 6689, 4200,
+ 2027, 2643, 1817, 6689, 4214,
+ 2027, 2643, 1817, 6689, 5190,
+ 2027, 2643, 1817, 6689, 6260,
+ 2027, 2643, 1817, 6689, 6722,
+ 2027, 2643, 1817, 6689, 7508,
+ 2027, 2643, 1817, 6689, 7694,
+ 2027, 2643, 1817, 7803, 5759, 8,
+ 2027, 2643, 1817, 7803, 5759, 28,
+ 2027, 2643, 1817, 7803, 5759, 40,
+ 2027, 2643, 1817, 7803, 5759, 58,
+ 2027, 2643, 1817, 7803, 5759, 66,
+ 2027, 2643, 1817, 7803, 5759, 98,
+ 2027, 2643, 1817, 7803, 5759, 266,
+ 2027, 2643, 1817, 7803, 5759, 290,
+ 2027, 2643, 1817, 7803, 5759, 422,
+ 2027, 2643, 1817, 7803, 5759, 458,
+ 2027, 2643, 1817, 7803, 5759, 590,
+ 2027, 2643, 1817, 7803, 5759, 606,
+ 2027, 2643, 1817, 7803, 5759, 608,
+ 2027, 2643, 1817, 7803, 5759, 700,
+ 2027, 2643, 1817, 7803, 5759, 2156,
+ 2027, 2643, 1817, 7803, 5759, 2806,
+ 2027, 2643, 1817, 7803, 5759, 7803, 11238,
+ 2027, 2643, 1817, 8405, 1809, 100,
+ 2027, 2643, 1817, 8405, 1809, 138,
+ 2027, 2643, 1817, 8405, 1809, 196,
+ 2027, 2643, 1817, 8405, 1809, 236,
+ 2027, 2643, 1817, 8405, 1809, 306,
+ 2027, 2643, 1817, 8405, 1809, 332,
+ 2027, 2643, 1817, 8405, 1809, 364,
+ 2027, 2643, 1817, 8405, 1809, 392,
+ 2027, 2643, 1817, 8405, 1809, 462,
+ 2027, 2643, 1817, 8405, 1809, 496,
+ 2027, 2643, 1817, 8405, 1809, 524,
+ 2027, 2643, 1817, 8405, 1809, 556,
+ 2027, 2643, 1817, 8405, 1809, 610,
+ 2027, 2643, 1817, 8405, 1809, 638,
+ 2027, 2643, 1817, 8405, 1809, 652,
+ 2027, 2643, 1817, 8405, 1809, 1702,
+ 2027, 2643, 1817, 8405, 1809, 2030,
+ 2027, 2643, 1817, 8405, 1809, 2212,
+ 2027, 2643, 1817, 8405, 1809, 2678,
+ 2027, 2643, 1817, 8405, 1809, 2732,
+ 2027, 2643, 1817, 8405, 1809, 2980,
+ 2027, 2643, 1817, 8405, 4423, 100,
+ 2027, 2643, 1817, 8405, 4423, 138,
+ 2027, 2643, 1817, 8405, 4423, 196,
+ 2027, 2643, 1817, 8405, 4423, 236,
+ 2027, 2643, 1817, 8405, 4423, 306,
+ 2027, 2643, 1817, 8405, 4423, 332,
+ 2027, 2643, 1817, 8405, 4423, 364,
+ 2027, 2643, 1817, 8405, 4423, 392,
+ 2027, 2643, 1817, 8405, 4423, 462,
+ 2027, 2643, 1817, 8405, 4423, 496,
+ 2027, 2643, 1817, 8405, 4423, 524,
+ 2027, 2643, 1817, 8405, 4423, 556,
+ 2027, 2643, 1817, 8405, 4423, 610,
+ 2027, 2643, 1817, 8405, 4423, 638,
+ 2027, 2643, 1817, 8405, 4423, 652,
+ 2027, 2643, 1817, 8405, 4423, 1702,
+ 2027, 2643, 1817, 8405, 4423, 2030,
+ 2027, 2643, 1817, 8405, 4423, 2212,
+ 2027, 2643, 1817, 8405, 4423, 2678,
+ 2027, 2643, 1817, 8405, 4423, 2732,
+ 2027, 2643, 1817, 8405, 4423, 2980,
+ 2027, 2643, 1817, 8405, 6789, 2,
+ 2027, 2643, 1817, 8405, 6789, 6,
+ 2027, 2643, 1817, 8405, 6789, 20,
+ 2027, 2643, 1817, 8405, 6789, 24,
+ 2027, 2643, 1817, 8405, 6789, 26,
+ 2027, 2643, 1817, 8405, 6789, 42,
+ 2027, 2643, 1817, 8405, 6789, 400,
+ 2027, 8701, 5758,
+ 2075, 1809, 5965, 11424,
+ 2075, 4423, 5965, 11424,
+ 2075, 6616,
+ 2075, 6689, 2170,
+ 2075, 6689, 2540,
+ 2075, 6689, 2778,
+ 2075, 6689, 4200,
+ 2075, 6689, 4214,
+ 2075, 6689, 5190,
+ 2075, 6689, 6260,
+ 2075, 6689, 6722,
+ 2075, 6689, 7508,
+ 2075, 6689, 7694,
+ 2075, 8405, 0,
+ 2075, 8405, 8,
+ 2075, 8405, 16,
+ 2075, 8405, 26,
+ 2075, 8405, 28,
+ 2075, 8405, 40,
+ 2075, 8405, 100,
+ 2075, 8405, 138,
+ 2075, 8405, 162,
+ 2075, 8405, 196,
+ 2075, 8405, 236,
+ 2075, 8405, 292,
+ 2075, 8405, 306,
+ 2075, 8405, 332,
+ 2075, 8405, 364,
+ 2075, 8405, 392,
+ 2075, 8405, 393, 8936,
+ 2075, 8405, 440,
+ 2075, 8405, 462,
+ 2075, 8405, 510,
+ 2075, 8405, 524,
+ 2075, 8405, 556,
+ 2075, 8405, 622,
+ 2075, 8405, 652,
+ 2075, 8405, 884,
+ 2075, 8405, 1228,
+ 2075, 8405, 2126,
+ 2075, 8405, 2127, 8936,
+ 2075, 8405, 2438,
+ 2075, 8405, 4679, 292,
+ 2075, 8405, 4679, 510,
+ 2075, 8405, 4679, 884,
+ 2075, 8405, 11470,
+ 2075, 8775, 441, 8104,
+ 2075, 8775, 11636,
+ 2075, 10767, 4895, 1809, 5964,
+ 2075, 10767, 4895, 4423, 5964,
+ 2075, 10767, 4895, 8649, 5964,
+ 2075, 10767, 4895, 11475, 5964,
+ 2075, 10767, 7551, 1809, 5964,
+ 2075, 10767, 7551, 4423, 5964,
+ 2075, 10767, 7551, 8649, 5964,
+ 2075, 10767, 8153, 1045, 6376,
+ 2075, 10767, 12511, 4926,
+ 2075, 11672,
+ 2075, 12017, 4926,
+ 2088,
+ 2091, 1, 8763, 428,
+ 2091, 1, 10579, 428,
+ 2091, 81, 9263, 428,
+ 2091, 5758,
+ 2091, 5972,
+ 2091, 6569, 4926,
+ 2091, 6741, 568,
+ 2091, 7708,
+ 2091, 7919, 6741, 568,
+ 2091, 8521, 10573, 428,
+ 2091, 8521, 10573, 429, 445, 6741, 568,
+ 2091, 8745, 6989, 429, 445, 6741, 568,
+ 2091, 8745, 10379, 429, 445, 6741, 568,
+ 2091, 10411, 568,
+ 2091, 11041, 568,
+ 2091, 11098,
+ 2091, 11621, 568,
+ 2091, 12472,
+ 2091, 13045, 6741, 568,
+ 2159, 825, 2690,
+ 2159, 3771, 8020,
+ 2159, 3992,
+ 2159, 4210,
+ 2159, 4530,
+ 2159, 6564,
+ 2159, 7921, 429, 6568,
+ 2159, 8009, 3711, 13054,
+ 2159, 8153, 10728,
+ 2159, 9973, 8975, 8524,
+ 2159, 10267, 4210,
+ 2163, 5758,
+ 2167, 8325, 8405, 0,
+ 2167, 8325, 8405, 8,
+ 2167, 8325, 8405, 16,
+ 2167, 8325, 8405, 28,
+ 2167, 8325, 8405, 40,
+ 2167, 8325, 8405, 102,
+ 2167, 8325, 8405, 142,
+ 2167, 8325, 8405, 164,
+ 2167, 8325, 8405, 172,
+ 2167, 8325, 8405, 174,
+ 2167, 8325, 8405, 176,
+ 2167, 8325, 8405, 182,
+ 2167, 8325, 8405, 184,
+ 2167, 8325, 8405, 238,
+ 2167, 8325, 8405, 266,
+ 2167, 8325, 8405, 306,
+ 2167, 8325, 8405, 310,
+ 2167, 8325, 8405, 326,
+ 2167, 8325, 8405, 468,
+ 2167, 8325, 8405, 560,
+ 2167, 8325, 8405, 606,
+ 2167, 8325, 8405, 612,
+ 2167, 8325, 8405, 672,
+ 2167, 8325, 8405, 886,
+ 2167, 8325, 8405, 1106,
+ 2167, 8325, 8405, 1122,
+ 2167, 8325, 8405, 1124,
+ 2167, 8325, 8405, 1614,
+ 2167, 8325, 8405, 2214,
+ 2167, 8325, 8405, 2518,
+ 2167, 8325, 8405, 2680,
+ 2167, 8325, 9513, 2170,
+ 2167, 8325, 9513, 2670,
+ 2167, 8325, 9513, 4200,
+ 2167, 8325, 9513, 6784,
+ 2167, 9583, 5759, 0,
+ 2167, 9583, 5759, 16,
+ 2167, 9583, 5759, 40,
+ 2167, 9583, 5759, 100,
+ 2167, 9583, 5759, 116,
+ 2167, 9583, 5759, 138,
+ 2167, 9583, 5759, 144,
+ 2167, 9583, 5759, 152,
+ 2167, 9583, 5759, 196,
+ 2167, 9583, 5759, 216,
+ 2167, 9583, 5759, 230,
+ 2167, 9583, 5759, 236,
+ 2167, 9583, 5759, 292,
+ 2167, 9583, 5759, 296,
+ 2167, 9583, 5759, 306,
+ 2167, 9583, 5759, 326,
+ 2167, 9583, 5759, 332,
+ 2167, 9583, 5759, 364,
+ 2167, 9583, 5759, 374,
+ 2167, 9583, 5759, 384,
+ 2167, 9583, 5759, 392,
+ 2167, 9583, 5759, 416,
+ 2167, 9583, 5759, 462,
+ 2167, 9583, 5759, 510,
+ 2167, 9583, 5759, 520,
+ 2167, 9583, 5759, 524,
+ 2167, 9583, 5759, 556,
+ 2167, 9583, 5759, 576,
+ 2167, 9583, 5759, 610,
+ 2167, 9583, 5759, 614,
+ 2167, 9583, 5759, 638,
+ 2167, 9583, 5759, 652,
+ 2167, 9583, 5759, 670,
+ 2167, 9583, 5759, 2516,
+ 2167, 9583, 5759, 2566,
+ 2167, 9583, 5759, 2678,
+ 2167, 9583, 5759, 3700,
+ 2167, 9583, 5759, 9058,
+ 2167, 9583, 5759, 10790,
+ 2167, 9583, 5759, 11436,
+ 2167, 9583, 5759, 11926,
+ 2167, 9583, 5759, 12408,
+ 2167, 9583, 5759, 12410,
+ 2167, 9583, 5759, 12896,
+ 2167, 9583, 6129, 9178,
+ 2167, 9583, 8525, 2170,
+ 2167, 9583, 8525, 2670,
+ 2167, 9583, 8525, 2778,
+ 2167, 9583, 8525, 8876,
+ 2167, 9583, 8525, 9344,
+ 2171, 1045, 5387, 2779, 4113, 12132,
+ 2171, 1045, 8392,
+ 2209, 2671, 10625, 5758,
+ 2209, 5758,
+ 2209, 7171, 5758,
+ 2241, 11945, 11632,
+ 2511, 7172,
+ 2541, 9601, 6505, 5830,
+ 2541, 10425, 6505, 721, 7821, 10194,
+ 2586,
+ 2639, 1809, 4876,
+ 2639, 4223, 5836,
+ 2639, 4849, 6627, 9050,
+ 2639, 4849, 8745, 9050,
+ 2639, 4849, 12114,
+ 2639, 5445, 5758,
+ 2639, 6610,
+ 2639, 6616,
+ 2639, 6689, 2170,
+ 2639, 6689, 2540,
+ 2639, 6689, 2778,
+ 2639, 6689, 4200,
+ 2639, 6689, 4214,
+ 2639, 6689, 5190,
+ 2639, 6689, 6260,
+ 2639, 6689, 6722,
+ 2639, 6689, 7508,
+ 2639, 6689, 7694,
+ 2639, 6875, 7908,
+ 2639, 7089, 7593, 8405, 0,
+ 2639, 7089, 7593, 8405, 2,
+ 2639, 7089, 7593, 8405, 4,
+ 2639, 7089, 7593, 8405, 6,
+ 2639, 7089, 7593, 8405, 8,
+ 2639, 7089, 7593, 8405, 10,
+ 2639, 7089, 7593, 8405, 12,
+ 2639, 7089, 7593, 8405, 14,
+ 2639, 7089, 7593, 8405, 16,
+ 2639, 7089, 7593, 8405, 18,
+ 2639, 7089, 7593, 8405, 20,
+ 2639, 7089, 7593, 8405, 22,
+ 2639, 7089, 7593, 8405, 24,
+ 2639, 7089, 7593, 8405, 26,
+ 2639, 7089, 7593, 8405, 28,
+ 2639, 7089, 7593, 8405, 30,
+ 2639, 7089, 7593, 8405, 32,
+ 2639, 7089, 7593, 8405, 34,
+ 2639, 7089, 7593, 8405, 36,
+ 2639, 7089, 7593, 8405, 38,
+ 2639, 7089, 7593, 8405, 40,
+ 2639, 7089, 7593, 8405, 42,
+ 2639, 7089, 7593, 8405, 44,
+ 2639, 7089, 7593, 8405, 46,
+ 2639, 7089, 7593, 8405, 48,
+ 2639, 7089, 7593, 8405, 50,
+ 2639, 7089, 9063, 8405, 0,
+ 2639, 7089, 9063, 8405, 2,
+ 2639, 7089, 9063, 8405, 4,
+ 2639, 7089, 9063, 8405, 6,
+ 2639, 7089, 9063, 8405, 8,
+ 2639, 7089, 9063, 8405, 10,
+ 2639, 7089, 9063, 8405, 12,
+ 2639, 7089, 9063, 8405, 14,
+ 2639, 7089, 9063, 8405, 16,
+ 2639, 7089, 9063, 8405, 18,
+ 2639, 7089, 9063, 8405, 20,
+ 2639, 7089, 9063, 8405, 22,
+ 2639, 7089, 9063, 8405, 24,
+ 2639, 7089, 9063, 8405, 26,
+ 2639, 7089, 9063, 8405, 28,
+ 2639, 7089, 9063, 8405, 30,
+ 2639, 7089, 9063, 8405, 32,
+ 2639, 7089, 9063, 8405, 34,
+ 2639, 7089, 9063, 8405, 36,
+ 2639, 7089, 9063, 8405, 38,
+ 2639, 7089, 9063, 8405, 40,
+ 2639, 7089, 9063, 8405, 42,
+ 2639, 7089, 9063, 8405, 44,
+ 2639, 7089, 9063, 8405, 46,
+ 2639, 7089, 9063, 8405, 48,
+ 2639, 7089, 9063, 8405, 50,
+ 2639, 7443, 6627, 9050,
+ 2639, 7443, 8745, 9050,
+ 2639, 7443, 12114,
+ 2639, 7608,
+ 2639, 7708,
+ 2639, 8129, 5758,
+ 2639, 8167, 5758,
+ 2639, 8525, 5758,
+ 2639, 9581, 5758,
+ 2639, 9633, 9718,
+ 2639, 9718,
+ 2639, 9898,
+ 2639, 10469, 4926,
+ 2639, 10677, 4876,
+ 2639, 10708,
+ 2639, 11099, 5758,
+ 2639, 11195, 4926,
+ 2639, 11224,
+ 2639, 11424,
+ 2639, 11449, 7908,
+ 2639, 11451, 90,
+ 2639, 12017, 4926,
+ 2639, 12473, 5758,
+ 2639, 12478,
+ 2643, 337, 8405, 0,
+ 2643, 337, 8405, 8,
+ 2643, 337, 8405, 16,
+ 2643, 337, 8405, 28,
+ 2643, 337, 8405, 40,
+ 2643, 337, 8405, 72,
+ 2643, 337, 8405, 162,
+ 2643, 337, 8405, 166,
+ 2643, 337, 8405, 196,
+ 2643, 337, 8405, 236,
+ 2643, 337, 8405, 306,
+ 2643, 337, 8405, 332,
+ 2643, 337, 8405, 364,
+ 2643, 337, 8405, 392,
+ 2643, 337, 8405, 440,
+ 2643, 337, 8405, 462,
+ 2643, 337, 8405, 496,
+ 2643, 337, 8405, 524,
+ 2643, 337, 8405, 556,
+ 2643, 337, 8405, 590,
+ 2643, 337, 8405, 610,
+ 2643, 337, 8405, 638,
+ 2643, 337, 8405, 652,
+ 2643, 337, 8405, 738,
+ 2643, 337, 8405, 1612,
+ 2643, 337, 8405, 2030,
+ 2643, 337, 8405, 2212,
+ 2643, 337, 8405, 2678,
+ 2643, 337, 8405, 2732,
+ 2643, 337, 8405, 5978,
+ 2643, 337, 8405, 8834,
+ 2643, 337, 8405, 8836,
+ 2643, 337, 8405, 8838,
+ 2643, 337, 8405, 8840,
+ 2643, 337, 8405, 8842,
+ 2691, 5387, 10256,
+ 2725, 731, 10763, 6435, 6121, 7172,
+ 2725, 731, 12901, 6434,
+ 2725, 731, 12901, 6435, 6121, 5444,
+ 2725, 4389, 10260,
+ 2725, 4849, 3958,
+ 2725, 4849, 4389, 9050,
+ 2725, 4849, 8076,
+ 2725, 6627, 9050,
+ 2725, 7443, 3958,
+ 2725, 7443, 4389, 9050,
+ 2725, 7443, 8076,
+ 2725, 8745, 9050,
+ 2725, 10637, 7533, 9050,
+ 2725, 12114,
+ 2779, 1045, 8392,
+ 2779, 1045, 12132,
+ 2779, 4113, 5387, 2171, 1045, 12132,
+ 2779, 8329, 9734,
+ 2779, 9437, 445, 10374,
+ 2779, 9437, 721, 10374,
+ 2779, 10725, 8993, 11876,
+ 2779, 11913, 8167, 7570,
+ 2779, 12491, 9437, 444,
+ 2779, 12491, 9437, 720,
+ 2847, 4223, 5836,
+ 2847, 6616,
+ 2847, 6689, 2170,
+ 2847, 6689, 2540,
+ 2847, 6689, 2778,
+ 2847, 6689, 4200,
+ 2847, 6689, 4214,
+ 2847, 6689, 5190,
+ 2847, 6689, 6260,
+ 2847, 6689, 6722,
+ 2847, 6689, 7508,
+ 2847, 6689, 7694,
+ 2847, 8775, 1140,
+ 2847, 8775, 2052,
+ 2847, 8775, 2634,
+ 2847, 8775, 3708,
+ 2847, 8775, 3986,
+ 2847, 8775, 4100,
+ 2847, 8775, 4680,
+ 2847, 8775, 4784,
+ 2847, 8775, 5944,
+ 2847, 8775, 5966,
+ 2847, 8775, 6700,
+ 2847, 8775, 6776,
+ 2847, 8775, 7032,
+ 2847, 10469, 4926,
+ 2847, 10585, 0,
+ 2847, 10585, 8,
+ 2847, 10585, 16,
+ 2847, 10585, 28,
+ 2847, 10585, 40,
+ 2847, 10585, 80,
+ 2847, 10585, 100,
+ 2847, 10585, 102,
+ 2847, 10585, 106,
+ 2847, 10585, 108,
+ 2847, 10585, 112,
+ 2847, 10585, 116,
+ 2847, 10585, 122,
+ 2847, 10585, 126,
+ 2847, 10585, 130,
+ 2847, 10585, 132,
+ 2847, 10585, 138,
+ 2847, 10585, 142,
+ 2847, 10585, 144,
+ 2847, 10585, 150,
+ 2847, 10585, 152,
+ 2847, 10585, 162,
+ 2847, 10585, 176,
+ 2847, 10585, 196,
+ 2847, 10585, 198,
+ 2847, 10585, 202,
+ 2847, 10585, 208,
+ 2847, 10585, 210,
+ 2847, 10585, 216,
+ 2847, 10585, 220,
+ 2847, 10585, 224,
+ 2847, 10585, 228,
+ 2847, 10585, 230,
+ 2847, 10585, 236,
+ 2847, 10585, 238,
+ 2847, 10585, 242,
+ 2847, 10585, 246,
+ 2847, 10585, 250,
+ 2847, 10585, 274,
+ 2847, 10585, 292,
+ 2847, 10585, 294,
+ 2847, 10585, 296,
+ 2847, 10585, 298,
+ 2847, 10585, 300,
+ 2847, 10585, 306,
+ 2847, 10585, 310,
+ 2847, 10585, 314,
+ 2847, 10585, 322,
+ 2847, 10585, 326,
+ 2847, 10585, 332,
+ 2847, 10585, 336,
+ 2847, 10585, 340,
+ 2847, 10585, 350,
+ 2847, 10585, 354,
+ 2847, 10585, 364,
+ 2847, 10585, 368,
+ 2847, 10585, 374,
+ 2847, 10585, 380,
+ 2847, 10585, 384,
+ 2847, 10585, 392,
+ 2847, 10585, 396,
+ 2847, 10585, 400,
+ 2847, 10585, 404,
+ 2847, 10585, 412,
+ 2847, 10585, 416,
+ 2847, 10585, 438,
+ 2847, 10585, 440,
+ 2847, 10585, 462,
+ 2847, 10585, 468,
+ 2847, 10585, 476,
+ 2847, 10585, 480,
+ 2847, 10585, 486,
+ 2847, 10585, 510,
+ 2847, 10585, 512,
+ 2847, 10585, 514,
+ 2847, 10585, 516,
+ 2847, 10585, 520,
+ 2847, 10585, 524,
+ 2847, 10585, 526,
+ 2847, 10585, 532,
+ 2847, 10585, 536,
+ 2847, 10585, 546,
+ 2847, 10585, 556,
+ 2847, 10585, 560,
+ 2847, 10585, 564,
+ 2847, 10585, 568,
+ 2847, 10585, 576,
+ 2847, 10585, 596,
+ 2847, 10585, 610,
+ 2847, 10585, 612,
+ 2847, 10585, 614,
+ 2847, 10585, 616,
+ 2847, 10585, 618,
+ 2847, 10585, 622,
+ 2847, 10585, 626,
+ 2847, 10585, 630,
+ 2847, 10585, 632,
+ 2847, 10585, 634,
+ 2847, 10585, 652,
+ 2847, 10585, 654,
+ 2847, 10585, 656,
+ 2847, 10585, 660,
+ 2847, 10585, 664,
+ 2847, 10585, 670,
+ 2847, 10585, 672,
+ 2847, 10585, 676,
+ 2847, 10585, 678,
+ 2847, 10585, 680,
+ 2847, 10585, 778,
+ 2847, 10585, 792,
+ 2847, 10585, 794,
+ 2847, 10585, 796,
+ 2847, 10585, 798,
+ 2847, 10585, 800,
+ 2847, 10585, 818,
+ 2847, 10585, 876,
+ 2847, 10585, 914,
+ 2847, 10585, 984,
+ 2847, 10585, 996,
+ 2847, 10585, 998,
+ 2847, 10585, 1000,
+ 2847, 10585, 1002,
+ 2847, 10585, 1004,
+ 2847, 10585, 1040,
+ 2847, 10585, 1098,
+ 2847, 10585, 1150,
+ 2847, 10585, 1172,
+ 2847, 10585, 1228,
+ 2847, 10585, 1230,
+ 2847, 10585, 1232,
+ 2847, 10585, 1234,
+ 2847, 10585, 1236,
+ 2847, 10585, 1238,
+ 2847, 10585, 1240,
+ 2847, 10585, 1290,
+ 2847, 10585, 1346,
+ 2847, 10585, 1356,
+ 2847, 10585, 1362,
+ 2847, 10585, 1384,
+ 2847, 10585, 1422,
+ 2847, 10585, 1424,
+ 2847, 10585, 1436,
+ 2847, 10585, 1506,
+ 2847, 10585, 1542,
+ 2847, 10585, 1588,
+ 2847, 10585, 1598,
+ 2847, 10585, 1660,
+ 2847, 10585, 1668,
+ 2847, 10585, 1670,
+ 2847, 10585, 1672,
+ 2847, 10585, 1674,
+ 2847, 10585, 1676,
+ 2847, 10585, 1758,
+ 2847, 10585, 1802,
+ 2847, 10585, 1878,
+ 2847, 10585, 1880,
+ 2847, 10585, 1882,
+ 2847, 10585, 1884,
+ 2847, 10585, 1886,
+ 2847, 10585, 1890,
+ 2847, 10585, 1938,
+ 2847, 10585, 2006,
+ 2847, 10585, 2008,
+ 2847, 10585, 2010,
+ 2847, 10585, 2012,
+ 2847, 10585, 2014,
+ 2847, 10585, 2016,
+ 2847, 10585, 2062,
+ 2847, 10585, 2064,
+ 2847, 10585, 2066,
+ 2847, 10585, 2068,
+ 2847, 10585, 2070,
+ 2847, 10585, 2084,
+ 2847, 10585, 2126,
+ 2847, 10585, 2130,
+ 2847, 10585, 2132,
+ 2847, 10585, 2134,
+ 2847, 10585, 2136,
+ 2847, 10585, 2178,
+ 2847, 10585, 2204,
+ 2847, 10585, 2238,
+ 2847, 10585, 2402,
+ 2847, 10585, 2430,
+ 2847, 10585, 2504,
+ 2847, 10585, 2516,
+ 2847, 10585, 2518,
+ 2847, 10585, 2520,
+ 2847, 10585, 2522,
+ 2847, 10585, 2524,
+ 2847, 10585, 2554,
+ 2847, 10585, 2666,
+ 2847, 10585, 2678,
+ 2847, 10585, 2680,
+ 2847, 10585, 2682,
+ 2847, 10585, 2684,
+ 2847, 10585, 2686,
+ 2847, 10585, 2722,
+ 2847, 10585, 2856,
+ 2847, 10585, 2876,
+ 2847, 10585, 2910,
+ 2847, 10585, 2922,
+ 2847, 10585, 2924,
+ 2847, 10585, 2934,
+ 2847, 10585, 2940,
+ 2847, 10585, 2942,
+ 2847, 10585, 2948,
+ 2847, 10585, 3050,
+ 2847, 10585, 3082,
+ 2847, 10585, 3138,
+ 2847, 10585, 3146,
+ 2847, 10585, 3148,
+ 2847, 10585, 3150,
+ 2847, 10585, 3152,
+ 2847, 10585, 3154,
+ 2847, 10585, 3178,
+ 2847, 10585, 3778,
+ 2847, 10585, 3780,
+ 2847, 10585, 4068,
+ 2847, 10585, 4070,
+ 2847, 10585, 4072,
+ 2847, 10585, 4074,
+ 2847, 10585, 4076,
+ 2847, 10585, 4078,
+ 2847, 10585, 4080,
+ 2847, 10585, 4246,
+ 2847, 10585, 4248,
+ 2847, 10585, 4250,
+ 2847, 10585, 4252,
+ 2847, 10585, 4774,
+ 2847, 10585, 4776,
+ 2847, 10585, 4778,
+ 2847, 10585, 4780,
+ 2847, 10585, 4932,
+ 2847, 10585, 4934,
+ 2847, 10585, 4964,
+ 2847, 10585, 4966,
+ 2847, 10585, 4968,
+ 2847, 10585, 4970,
+ 2847, 10585, 4972,
+ 2847, 10585, 5100,
+ 2847, 10585, 5114,
+ 2847, 10585, 5136,
+ 2847, 10585, 5146,
+ 2847, 10585, 5152,
+ 2847, 10585, 5154,
+ 2847, 10585, 5156,
+ 2847, 10585, 5158,
+ 2847, 10585, 5160,
+ 2847, 10585, 5168,
+ 2847, 10585, 5194,
+ 2847, 10585, 5204,
+ 2847, 10585, 5296,
+ 2847, 10585, 5316,
+ 2847, 10585, 5678,
+ 2847, 10585, 5710,
+ 2847, 10585, 5914,
+ 2847, 10585, 5930,
+ 2847, 10585, 6108,
+ 2847, 10585, 6126,
+ 2847, 10585, 6274,
+ 2847, 10585, 6282,
+ 2847, 10585, 6682,
+ 2847, 10585, 6684,
+ 2847, 10585, 7152,
+ 2847, 10585, 7154,
+ 2847, 10585, 7223, 150,
+ 2847, 10585, 7223, 196,
+ 2847, 10585, 7223, 306,
+ 2847, 10585, 7223, 364,
+ 2847, 10585, 7223, 2554,
+ 2847, 10585, 7228,
+ 2847, 10585, 7230,
+ 2847, 10585, 7232,
+ 2847, 10585, 11674,
+ 2941, 5758,
+ 2972,
+ 3055, 5758,
+ 3071, 6178,
+ 3245, 8774,
+ 3264,
+ 3285, 8774,
+ 3769, 8774,
+ 3839, 2812,
+ 3849, 428,
+ 3871, 5758,
+ 3873, 5758,
+ 3879, 6689, 2170,
+ 3879, 6689, 2540,
+ 3879, 6689, 2778,
+ 3879, 6689, 4200,
+ 3879, 6689, 4214,
+ 3879, 6689, 5190,
+ 3879, 6689, 6260,
+ 3879, 6689, 6722,
+ 3879, 6689, 7508,
+ 3879, 6689, 7694,
+ 3879, 7803, 5759, 16,
+ 3879, 7803, 5759, 28,
+ 3879, 7803, 5759, 40,
+ 3879, 7803, 5759, 58,
+ 3879, 7803, 5759, 72,
+ 3879, 7803, 5759, 92,
+ 3879, 7803, 5759, 168,
+ 3879, 7803, 5759, 266,
+ 3879, 7803, 5759, 426,
+ 3879, 7803, 5759, 590,
+ 3879, 8405, 0,
+ 3879, 8405, 8,
+ 3879, 8405, 16,
+ 3879, 8405, 28,
+ 3879, 8405, 40,
+ 3879, 8405, 72,
+ 3879, 8405, 100,
+ 3879, 8405, 138,
+ 3879, 8405, 216,
+ 3879, 8405, 236,
+ 3879, 8405, 292,
+ 3879, 8405, 306,
+ 3879, 8405, 332,
+ 3879, 8405, 364,
+ 3879, 8405, 392,
+ 3879, 8405, 462,
+ 3879, 8405, 510,
+ 3879, 8405, 524,
+ 3879, 8405, 556,
+ 3879, 8405, 610,
+ 3879, 8405, 652,
+ 3879, 8405, 766,
+ 3879, 8405, 792,
+ 3879, 8405, 884,
+ 3879, 8405, 974,
+ 3879, 8405, 996,
+ 3879, 8405, 1260,
+ 3879, 8405, 1512,
+ 3879, 8405, 1612,
+ 3879, 8405, 1948,
+ 3879, 8405, 2030,
+ 3879, 8405, 2042,
+ 3879, 8405, 2106,
+ 3879, 8405, 2212,
+ 3879, 8405, 2246,
+ 3879, 8405, 2566,
+ 3879, 8405, 2678,
+ 3879, 8405, 3902,
+ 3879, 8405, 5178,
+ 3879, 8405, 5182,
+ 3879, 8405, 5184,
+ 3879, 8405, 6789, 12,
+ 3879, 8405, 6789, 20,
+ 3879, 8405, 6789, 22,
+ 3879, 8405, 6789, 26,
+ 3879, 8405, 6789, 30,
+ 3879, 8405, 6789, 34,
+ 3879, 8405, 6789, 38,
+ 3879, 8405, 6789, 48,
+ 3879, 8405, 6789, 124,
+ 3879, 8405, 6789, 400,
+ 3879, 8405, 6789, 542,
+ 3879, 10775, 5759, 332,
+ 3879, 10775, 5759, 510,
+ 3879, 10775, 5759, 622,
+ 3879, 10775, 5759, 652,
+ 3879, 10775, 5759, 6789, 14,
+ 3879, 10775, 5759, 6789, 24,
+ 3879, 10775, 5759, 6789, 400,
+ 3879, 12133, 6646,
+ 3879, 12133, 8153, 6646,
+ 3879, 12133, 8732,
+ 3879, 12133, 8849, 6646,
+ 3961, 5566,
+ 3989, 7512,
+ 4103, 2091, 6798,
+ 4103, 2091, 7396,
+ 4103, 2091, 8122,
+ 4103, 2091, 8123, 6121, 10489, 10355, 7580,
+ 4103, 2091, 9113, 89, 8466,
+ 4103, 2091, 9113, 89, 8521, 10572,
+ 4103, 2091, 9113, 89, 8521, 10573, 445, 6740,
+ 4103, 2091, 9604,
+ 4103, 2091, 9605, 445, 6740,
+ 4103, 2091, 9750,
+ 4103, 2091, 9751, 445, 6740,
+ 4107, 5758,
+ 4117, 4197, 5878,
+ 4117, 5876,
+ 4117, 5877, 6121, 8057, 6490,
+ 4117, 7443, 10001, 10154,
+ 4117, 10716,
+ 4153, 8781, 6622,
+ 4171, 5758,
+ 4201, 1045, 4926,
+ 4201, 1045, 12132,
+ 4215, 1045, 4926,
+ 4215, 1045, 12132,
+ 4215, 11907, 9898,
+ 4215, 13047, 9898,
+ 4215, 13233, 9898,
+ 4223, 5836,
+ 4223, 6510,
+ 4223, 7327, 4676,
+ 4228,
+ 4260,
+ 4269, 4926,
+ 4387, 7608,
+ 4401, 8774,
+ 4423, 9831, 5758,
+ 4676,
+ 4686,
+ 4837, 9615, 5012,
+ 4849, 721, 7443, 5876,
+ 4849, 721, 7443, 8153, 11378,
+ 4849, 731, 11099, 9050,
+ 4849, 1809, 11715, 9050,
+ 4849, 2171, 8159, 6510,
+ 4849, 2171, 9615, 6510,
+ 4849, 3713, 601, 7443, 3713, 601, 9326,
+ 4849, 3713, 601, 7443, 3713, 4117, 9326,
+ 4849, 3713, 4117, 7443, 3713, 601, 9326,
+ 4849, 3713, 4117, 7443, 3713, 4117, 9326,
+ 4849, 4197, 5878,
+ 4849, 4201, 9259, 6510,
+ 4849, 4389, 6505, 8056,
+ 4849, 4389, 6510,
+ 4849, 5876,
+ 4849, 6409, 9050,
+ 4849, 6409, 9051, 6121, 1044,
+ 4849, 6435, 6121, 7593, 8056,
+ 4849, 6435, 6121, 9095, 5444,
+ 4849, 6505, 10637, 7533, 9050,
+ 4849, 6505, 11677, 9050,
+ 4849, 6627, 9050,
+ 4849, 6627, 9051, 7121, 4530,
+ 4849, 6627, 9051, 7773, 4530,
+ 4849, 6627, 9051, 8473, 7370,
+ 4849, 6792,
+ 4849, 7327, 4676,
+ 4849, 7443, 6105, 6434,
+ 4849, 7443, 6434,
+ 4849, 7443, 6435, 6121, 8153, 10677, 8758,
+ 4849, 7443, 6435, 6121, 8758,
+ 4849, 7443, 6435, 6121, 10677, 8758,
+ 4849, 7443, 6435, 9785, 7593, 8056,
+ 4849, 7443, 6505, 6434,
+ 4849, 7443, 7821, 6434,
+ 4849, 7443, 8153, 6434,
+ 4849, 7443, 8153, 6435, 6121, 8758,
+ 4849, 7443, 8153, 6435, 6121, 10677, 8758,
+ 4849, 7443, 12103, 6434,
+ 4849, 7509, 9259, 6510,
+ 4849, 7695, 9259, 6510,
+ 4849, 7695, 10467, 6510,
+ 4849, 7821, 6627, 9050,
+ 4849, 7821, 8077, 9050,
+ 4849, 7821, 8745, 9050,
+ 4849, 7821, 10637, 7533, 9050,
+ 4849, 7821, 11677, 9050,
+ 4849, 7821, 12114,
+ 4849, 8077, 9050,
+ 4849, 8151, 12877, 9050,
+ 4849, 8153, 6409, 9050,
+ 4849, 8153, 8933, 6778,
+ 4849, 8153, 11195, 4926,
+ 4849, 8153, 12114,
+ 4849, 8521, 8191, 11793, 9610,
+ 4849, 8631, 10371, 9050,
+ 4849, 8717, 11195, 4926,
+ 4849, 8745, 9050,
+ 4849, 8745, 9051, 6121, 5935, 275, 2725, 8076,
+ 4849, 8745, 9051, 6121, 5935, 275, 8005, 8076,
+ 4849, 8745, 9051, 6121, 7412,
+ 4849, 8745, 9051, 6121, 10666,
+ 4849, 8745, 9051, 7121, 8076,
+ 4849, 8745, 9051, 7773, 8076,
+ 4849, 8745, 9051, 10982,
+ 4849, 8933, 6778,
+ 4849, 9074,
+ 4849, 10346,
+ 4849, 10493, 753, 10794,
+ 4849, 10523, 41, 9050,
+ 4849, 10637, 7533, 9050,
+ 4849, 10643, 7991, 10677, 760,
+ 4849, 10677, 761, 6121, 7412,
+ 4849, 10677, 827, 4876,
+ 4849, 11793, 9610,
+ 4849, 12114,
+ 4849, 12115, 7121, 4530,
+ 4849, 12115, 7773, 4530,
+ 4849, 12115, 10982,
+ 4849, 12877, 9050,
+ 4849, 13029, 9050,
+ 4877, 11228,
+ 4877, 12057, 2091, 11049, 2681, 5446,
+ 4877, 12057, 6121, 12139, 5403, 7939, 5446,
+ 4877, 12057, 6121, 12857, 5403, 7939, 5446,
+ 4883, 5758,
+ 4895, 3993, 4221, 4849, 8467, 429, 8153, 10676,
+ 4895, 4849, 5876,
+ 4895, 4849, 7443, 6434,
+ 4895, 4849, 7443, 8153, 6434,
+ 4895, 7443, 5876,
+ 4895, 10016,
+ 4895, 11097, 6434,
+ 4895, 11097, 6435, 4221, 760,
+ 4895, 11097, 8153, 6434,
+ 4895, 11097, 8153, 6435, 4221, 760,
+ 4895, 11097, 10531, 6434,
+ 4895, 11765, 6434,
+ 4895, 11765, 6435, 4221, 760,
+ 4895, 11765, 8153, 6434,
+ 4895, 11765, 8153, 6435, 4221, 760,
+ 4895, 11765, 10531, 6434,
+ 4923, 721, 8197, 5758,
+ 4923, 5758,
+ 4923, 6121, 8759, 721, 4923, 721, 8197, 5758,
+ 4923, 6121, 8759, 5758,
+ 4931, 4926,
+ 5003, 5758,
+ 5006,
+ 5017, 11098,
+ 5017, 12472,
+ 5050,
+ 5131, 5392,
+ 5385, 826,
+ 5385, 8037, 6505, 5830,
+ 5385, 8037, 6622,
+ 5385, 8037, 9898,
+ 5385, 8037, 13233, 9898,
+ 5385, 8762,
+ 5385, 10578,
+ 5395, 8008,
+ 5401, 11891, 4926,
+ 5409, 5758,
+ 5445, 5758,
+ 5445, 5759, 275, 4849, 4389, 8056,
+ 5445, 5759, 275, 7443, 4389, 8056,
+ 5445, 5759, 275, 10642,
+ 5445, 5759, 6121, 1045, 6490,
+ 5445, 5759, 6121, 6505, 10642,
+ 5445, 5759, 6121, 7593, 8057, 6376,
+ 5445, 5759, 6121, 7709, 6376,
+ 5445, 5759, 6121, 7709, 6490,
+ 5445, 5759, 6121, 11261, 2778,
+ 5445, 5759, 6121, 11449, 7909, 6376,
+ 5445, 5759, 6377, 8167, 5758,
+ 5545, 5758,
+ 5551, 275, 6741, 568,
+ 5551, 6376,
+ 5551, 6741, 568,
+ 5551, 7382,
+ 5551, 10374,
+ 5769, 6104,
+ 5781, 8306,
+ 5831, 429, 6656,
+ 5831, 721, 9964,
+ 5831, 8166,
+ 5831, 10374,
+ 5887, 6704,
+ 5909, 6689, 2170,
+ 5909, 6689, 2540,
+ 5909, 6689, 2778,
+ 5909, 6689, 4200,
+ 5909, 6689, 4214,
+ 5909, 6689, 5190,
+ 5909, 6689, 6260,
+ 5909, 6689, 6722,
+ 5909, 6689, 7508,
+ 5909, 6689, 7694,
+ 5909, 9971, 8775, 3702,
+ 5909, 10759, 29, 722,
+ 5909, 10759, 109, 7968,
+ 5909, 10759, 151, 988,
+ 5909, 10759, 151, 6562,
+ 5909, 10759, 209, 196,
+ 5909, 10759, 209, 1142,
+ 5909, 10759, 247, 1386,
+ 5909, 10759, 247, 8518,
+ 5909, 10759, 323, 1582,
+ 5909, 10759, 351, 4878,
+ 5909, 10759, 351, 6582,
+ 5909, 10759, 354,
+ 5909, 10759, 381, 364,
+ 5909, 10759, 413, 416,
+ 5909, 10759, 413, 2018,
+ 5909, 10759, 481, 2234,
+ 5909, 10759, 517, 2448,
+ 5909, 10759, 520,
+ 5909, 10759, 537, 536,
+ 5909, 10759, 537, 2580,
+ 5909, 10759, 537, 5614,
+ 5909, 10759, 537, 5630,
+ 5909, 10759, 569, 2650,
+ 5909, 10759, 569, 7344,
+ 5909, 10759, 633, 6098,
+ 5909, 10759, 661, 3022,
+ 5909, 10759, 661, 6212,
+ 5909, 10759, 891, 3880,
+ 5909, 10759, 891, 3908,
+ 5909, 10759, 891, 6566,
+ 5909, 10759, 891, 6576,
+ 5909, 10759, 1619, 4738,
+ 5909, 10759, 1619, 4750,
+ 5909, 10759, 1619, 7050,
+ 5909, 10759, 1619, 7052,
+ 5909, 10759, 1619, 9618,
+ 5909, 10759, 1859, 170,
+ 5909, 10759, 1859, 2684,
+ 5909, 10759, 1859, 2730,
+ 5909, 10759, 1859, 9938,
+ 5909, 10759, 1859, 10228,
+ 5909, 10759, 2039, 2040,
+ 5909, 10759, 2219, 5412,
+ 5909, 10759, 2219, 7366,
+ 5909, 10759, 2219, 9652,
+ 5909, 10759, 2685, 5912,
+ 5909, 10759, 2685, 7690,
+ 5909, 10759, 2685, 7696,
+ 5909, 10759, 2685, 8812,
+ 5909, 10759, 2685, 9592,
+ 5909, 10759, 2685, 11694,
+ 5909, 10759, 5637, 0,
+ 5909, 10759, 5637, 8,
+ 5909, 10759, 5637, 16,
+ 5909, 10759, 5637, 28,
+ 5909, 10759, 5637, 40,
+ 5909, 10759, 5637, 58,
+ 5909, 10759, 5637, 66,
+ 5909, 10759, 5637, 73, 9446,
+ 5909, 10759, 5637, 73, 10312,
+ 5909, 10759, 5637, 78,
+ 5909, 10759, 5637, 266,
+ 5909, 10759, 5637, 590,
+ 5909, 10759, 5637, 606,
+ 5909, 10759, 5637, 2804,
+ 5909, 10759, 8358,
+ 5909, 10759, 9290,
+ 5909, 10759, 9590,
+ 5909, 10759, 10314,
+ 5909, 10759, 10358,
+ 5909, 10759, 10684,
+ 5909, 10759, 11108,
+ 5909, 10759, 11152,
+ 5909, 10759, 11412,
+ 5909, 10759, 12072,
+ 5909, 10759, 12362,
+ 5927, 7608,
+ 5946,
+ 5972,
+ 6051, 8774,
+ 6081, 5017, 11098,
+ 6081, 5017, 12472,
+ 6105, 3992,
+ 6105, 6435, 10441, 10015, 4848,
+ 6105, 6435, 10441, 10015, 7442,
+ 6107, 1809, 4876,
+ 6107, 3992,
+ 6107, 4876,
+ 6107, 10388,
+ 6113, 8781, 6622,
+ 6129, 8330,
+ 6261, 7825, 7608,
+ 6261, 7825, 8330,
+ 6261, 7825, 10363, 7608,
+ 6261, 7825, 11698,
+ 6379, 6408,
+ 6379, 7908,
+ 6408,
+ 6409, 6121, 37, 8318,
+ 6409, 6121, 10666,
+ 6428,
+ 6435, 10441, 10959, 5919, 9131, 11096,
+ 6435, 10441, 10959, 5919, 9131, 11764,
+ 6435, 10441, 11765, 5919, 9131, 9810,
+ 6435, 10441, 11765, 5919, 9131, 10958,
+ 6505, 2048,
+ 6505, 2587, 6121, 5528,
+ 6505, 3949, 5842,
+ 6505, 4202,
+ 6505, 4215, 9601, 5830,
+ 6505, 4849, 10441, 6992,
+ 6505, 5013, 8406,
+ 6505, 5830,
+ 6505, 6081, 7593, 8744,
+ 6505, 6571, 4760,
+ 6505, 6571, 5404,
+ 6505, 6571, 5564,
+ 6505, 6571, 7410,
+ 6505, 6571, 7996,
+ 6505, 6571, 8368,
+ 6505, 6907, 5842,
+ 6505, 7085, 8056,
+ 6505, 7085, 8744,
+ 6505, 7121, 4849, 10642,
+ 6505, 7121, 7443, 10642,
+ 6505, 7443, 10441, 6992,
+ 6505, 7547, 7370,
+ 6505, 7593, 5830,
+ 6505, 7593, 8744,
+ 6505, 7593, 9158,
+ 6505, 7593, 9438,
+ 6505, 7611, 5842,
+ 6505, 7773, 4849, 10642,
+ 6505, 7773, 7443, 10642,
+ 6505, 8006,
+ 6505, 8037, 7821, 5830,
+ 6505, 8056,
+ 6505, 8057, 6121, 2779, 7821, 4112,
+ 6505, 8057, 6121, 4117, 6434,
+ 6505, 8057, 6121, 7821, 1045, 7442,
+ 6505, 8463, 7593, 8744,
+ 6505, 8463, 8744,
+ 6505, 8463, 9158,
+ 6505, 8463, 9438,
+ 6505, 8744,
+ 6505, 9158,
+ 6505, 9159, 5842,
+ 6505, 9159, 6121, 4117, 6434,
+ 6505, 9159, 7173, 7821, 46,
+ 6505, 9338,
+ 6505, 9438,
+ 6505, 9711, 4178,
+ 6505, 10143, 1860,
+ 6505, 10143, 4760,
+ 6505, 10194,
+ 6505, 10420,
+ 6505, 10502,
+ 6505, 10677, 9264,
+ 6505, 10677, 11202,
+ 6505, 11036,
+ 6505, 11097, 8022,
+ 6505, 11202,
+ 6505, 11354,
+ 6505, 11387, 11205, 8774,
+ 6505, 11649, 9264,
+ 6505, 11765, 6434,
+ 6505, 11765, 8022,
+ 6505, 11765, 10716,
+ 6505, 12383, 7593, 10642,
+ 6505, 12383, 10642,
+ 6505, 12931, 7593, 10642,
+ 6505, 12931, 10642,
+ 6505, 12967, 7593, 10642,
+ 6505, 12967, 9602,
+ 6505, 12967, 10642,
+ 6505, 12984,
+ 6505, 13067, 7593, 10642,
+ 6505, 13067, 9602,
+ 6505, 13067, 10420,
+ 6505, 13067, 10642,
+ 6509, 8774,
+ 6516,
+ 6531, 7803, 5759, 16,
+ 6531, 7803, 5759, 40,
+ 6531, 8405, 0,
+ 6531, 8405, 16,
+ 6531, 8405, 40,
+ 6531, 8405, 100,
+ 6531, 8405, 138,
+ 6531, 8405, 216,
+ 6531, 8405, 236,
+ 6531, 8405, 306,
+ 6531, 8405, 332,
+ 6531, 8405, 364,
+ 6531, 8405, 392,
+ 6531, 8405, 462,
+ 6531, 8405, 510,
+ 6531, 8405, 524,
+ 6531, 8405, 556,
+ 6531, 8405, 622,
+ 6531, 8405, 652,
+ 6531, 8405, 2030,
+ 6542,
+ 6543, 11061, 7382,
+ 6546,
+ 6560,
+ 6569, 4926,
+ 6597, 8677, 8774,
+ 6603, 600,
+ 6606,
+ 6610,
+ 6611, 5758,
+ 6611, 8166,
+ 6614,
+ 6616,
+ 6623, 429, 10308,
+ 6623, 429, 11068,
+ 6627, 9051, 10982,
+ 6627, 9437, 444,
+ 6627, 9437, 720,
+ 6643, 8774,
+ 6675, 6741, 568,
+ 6689, 2170,
+ 6689, 2171, 4223, 5836,
+ 6689, 2540,
+ 6689, 2541, 4223, 5836,
+ 6689, 2778,
+ 6689, 2779, 4223, 5836,
+ 6689, 4200,
+ 6689, 4201, 4223, 5836,
+ 6689, 4214,
+ 6689, 4215, 4223, 5836,
+ 6689, 5190,
+ 6689, 5191, 4223, 5836,
+ 6689, 6260,
+ 6689, 6722,
+ 6689, 6723, 4223, 5836,
+ 6689, 7508,
+ 6689, 7509, 4223, 5836,
+ 6689, 7694,
+ 6689, 7695, 4223, 5836,
+ 6695, 4926,
+ 6716,
+ 6717, 8272,
+ 6723, 8737, 9898,
+ 6723, 9601, 6505, 5830,
+ 6723, 9601, 10433, 5830,
+ 6723, 9601, 12141, 6505, 5830,
+ 6723, 10425, 10385, 6505, 10194,
+ 6723, 13233, 11187, 9898,
+ 6725, 8774,
+ 6731, 2510,
+ 6731, 2511, 6121, 4849, 6435, 6376,
+ 6731, 2511, 6121, 7443, 6435, 6376,
+ 6731, 2511, 6121, 7593, 8057, 6376,
+ 6731, 2511, 6121, 9546,
+ 6735, 8774,
+ 6741, 569, 115, 11472,
+ 6741, 569, 445, 10452,
+ 6741, 569, 445, 10574,
+ 6741, 569, 445, 11098,
+ 6741, 569, 445, 12472,
+ 6741, 721, 10411, 568,
+ 6745, 569, 2681, 4848,
+ 6745, 569, 2681, 7442,
+ 6763, 9956,
+ 6771, 8774,
+ 6791, 9615, 5012,
+ 6812,
+ 6857, 8774,
+ 6875, 7908,
+ 6879, 477, 8774,
+ 6879, 727, 8798,
+ 6879, 1583, 8774,
+ 6879, 2171, 4389, 5758,
+ 6879, 2171, 4389, 5759, 10707, 4212,
+ 6879, 2217, 8774,
+ 6879, 2413, 6121, 8759, 8774,
+ 6879, 2413, 8774,
+ 6879, 2779, 7307, 5758,
+ 6879, 2779, 8819, 5758,
+ 6879, 3775, 8774,
+ 6879, 4201, 7307, 5758,
+ 6879, 4215, 7307, 5758,
+ 6879, 5375, 5758,
+ 6879, 5388,
+ 6879, 6197, 5758,
+ 6879, 6261, 5758,
+ 6879, 6654,
+ 6879, 6655, 721, 5388,
+ 6879, 6655, 721, 7782,
+ 6879, 6655, 721, 12120,
+ 6879, 7023, 8774,
+ 6879, 7111, 5758,
+ 6879, 7121, 9513, 5758,
+ 6879, 7398,
+ 6879, 7399, 721, 5388,
+ 6879, 7399, 721, 7782,
+ 6879, 7399, 721, 12120,
+ 6879, 7593, 8151, 8427, 7569, 8774,
+ 6879, 7593, 8405, 384,
+ 6879, 7593, 8405, 416,
+ 6879, 7593, 8405, 476,
+ 6879, 7593, 8405, 644,
+ 6879, 7593, 8405, 888,
+ 6879, 7593, 8405, 1128,
+ 6879, 7593, 8405, 1129, 6121, 5388,
+ 6879, 7593, 8405, 1129, 6121, 5389, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 6654,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7398,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7724,
+ 6879, 7593, 8405, 1129, 6121, 7782,
+ 6879, 7593, 8405, 1129, 6121, 7783, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 12120,
+ 6879, 7593, 8405, 1129, 6121, 12121, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 13036,
+ 6879, 7593, 8405, 2216,
+ 6879, 7593, 8405, 2250,
+ 6879, 7593, 8405, 2412,
+ 6879, 7593, 8405, 2413, 6121, 6654,
+ 6879, 7593, 8405, 2413, 6121, 7398,
+ 6879, 7593, 8405, 2490,
+ 6879, 7593, 8405, 2522,
+ 6879, 7593, 8405, 2658,
+ 6879, 7593, 8405, 3774,
+ 6879, 7593, 8405, 4408,
+ 6879, 7593, 8405, 4614,
+ 6879, 7593, 8405, 4615, 6121, 5388,
+ 6879, 7593, 8405, 4615, 6121, 6654,
+ 6879, 7593, 8405, 4615, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 4615, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 4615, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 4615, 6121, 7398,
+ 6879, 7593, 8405, 4615, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 4615, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 4615, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 4615, 6121, 7724,
+ 6879, 7593, 8405, 4615, 6121, 7782,
+ 6879, 7593, 8405, 4615, 6121, 8432,
+ 6879, 7593, 8405, 4615, 6121, 8924,
+ 6879, 7593, 8405, 4615, 6121, 10808,
+ 6879, 7593, 8405, 4615, 6121, 10809, 721, 5388,
+ 6879, 7593, 8405, 4615, 6121, 10809, 721, 7724,
+ 6879, 7593, 8405, 4615, 6121, 10809, 721, 7782,
+ 6879, 7593, 8405, 4615, 6121, 10809, 721, 12120,
+ 6879, 7593, 8405, 4615, 6121, 12120,
+ 6879, 7593, 8405, 6262,
+ 6879, 7593, 8405, 6406,
+ 6879, 7593, 8405, 6407, 6121, 5388,
+ 6879, 7593, 8405, 6407, 6121, 5389, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 6654,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7398,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7724,
+ 6879, 7593, 8405, 6407, 6121, 7782,
+ 6879, 7593, 8405, 6407, 6121, 7783, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 8432,
+ 6879, 7593, 8405, 6407, 6121, 8924,
+ 6879, 7593, 8405, 6407, 6121, 12120,
+ 6879, 7593, 8405, 6407, 6121, 12121, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 13036,
+ 6879, 7593, 8405, 6674,
+ 6879, 7593, 8405, 6789, 7568,
+ 6879, 7593, 8405, 6824,
+ 6879, 7593, 8405, 7022,
+ 6879, 7593, 8405, 7062,
+ 6879, 7593, 8405, 7080,
+ 6879, 7593, 8405, 7316,
+ 6879, 7593, 8405, 7317, 6121, 5388,
+ 6879, 7593, 8405, 7317, 6121, 5389, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 6654,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7398,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7724,
+ 6879, 7593, 8405, 7317, 6121, 7782,
+ 6879, 7593, 8405, 7317, 6121, 7783, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 12120,
+ 6879, 7593, 8405, 7317, 6121, 12121, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 13036,
+ 6879, 7593, 8405, 7484,
+ 6879, 7593, 8405, 7568,
+ 6879, 7593, 8405, 7682,
+ 6879, 7593, 8405, 8748,
+ 6879, 7593, 8405, 9007, 7062,
+ 6879, 7593, 8405, 9007, 7484,
+ 6879, 7593, 8405, 9162,
+ 6879, 7593, 8405, 9270,
+ 6879, 7593, 8405, 9271, 6121, 5388,
+ 6879, 7593, 8405, 9271, 6121, 6654,
+ 6879, 7593, 8405, 9271, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 9271, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 9271, 6121, 7398,
+ 6879, 7593, 8405, 9271, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 9271, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 9271, 6121, 7724,
+ 6879, 7593, 8405, 9271, 6121, 7782,
+ 6879, 7593, 8405, 9530,
+ 6879, 7593, 8405, 9531, 6121, 5388,
+ 6879, 7593, 8405, 9531, 6121, 6654,
+ 6879, 7593, 8405, 9531, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 9531, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 9531, 6121, 7398,
+ 6879, 7593, 8405, 9531, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 9531, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 9531, 6121, 7724,
+ 6879, 7593, 8405, 9531, 6121, 7782,
+ 6879, 7593, 8405, 9808,
+ 6879, 7593, 8405, 9809, 6121, 5388,
+ 6879, 7593, 8405, 9809, 6121, 6654,
+ 6879, 7593, 8405, 9809, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 9809, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 9809, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 9809, 6121, 7398,
+ 6879, 7593, 8405, 9809, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 9809, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 9809, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 9809, 6121, 7724,
+ 6879, 7593, 8405, 9809, 6121, 7782,
+ 6879, 7593, 8405, 9809, 6121, 8432,
+ 6879, 7593, 8405, 9809, 6121, 8924,
+ 6879, 7593, 8405, 9809, 6121, 10808,
+ 6879, 7593, 8405, 9809, 6121, 10809, 721, 5388,
+ 6879, 7593, 8405, 9809, 6121, 10809, 721, 7724,
+ 6879, 7593, 8405, 9809, 6121, 10809, 721, 7782,
+ 6879, 7593, 8405, 9809, 6121, 10809, 721, 12120,
+ 6879, 7593, 8405, 9809, 6121, 12120,
+ 6879, 7593, 8405, 11709, 9162,
+ 6879, 7593, 10489, 8151, 8427, 7569, 8774,
+ 6879, 7593, 10489, 8427, 7569, 8774,
+ 6879, 7683, 8774,
+ 6879, 7695, 7307, 5758,
+ 6879, 7695, 10467, 5758,
+ 6879, 7724,
+ 6879, 7782,
+ 6879, 7801, 10365, 10586,
+ 6879, 7801, 10365, 10588,
+ 6879, 7801, 10365, 10590,
+ 6879, 7801, 10365, 10592,
+ 6879, 7801, 10365, 10594,
+ 6879, 7801, 10365, 10596,
+ 6879, 7801, 10365, 10598,
+ 6879, 7801, 10365, 10600,
+ 6879, 7801, 10365, 10602,
+ 6879, 7801, 10365, 11270,
+ 6879, 7801, 10365, 11272,
+ 6879, 7801, 10365, 11274,
+ 6879, 7801, 10365, 11276,
+ 6879, 7801, 10365, 11278,
+ 6879, 7801, 10365, 11280,
+ 6879, 7801, 10365, 11282,
+ 6879, 7801, 10365, 11284,
+ 6879, 7801, 10365, 11286,
+ 6879, 7801, 10365, 11288,
+ 6879, 7801, 10365, 11290,
+ 6879, 7801, 10365, 11292,
+ 6879, 7801, 10365, 11294,
+ 6879, 7801, 10365, 11296,
+ 6879, 7801, 10365, 11298,
+ 6879, 7801, 10365, 11334,
+ 6879, 7801, 10365, 11336,
+ 6879, 7801, 10365, 11338,
+ 6879, 7801, 10365, 11340,
+ 6879, 7801, 10365, 11342,
+ 6879, 7941, 5758,
+ 6879, 7949, 5758,
+ 6879, 8269, 5758,
+ 6879, 8405, 3086,
+ 6879, 8405, 7062,
+ 6879, 8405, 7484,
+ 6879, 8405, 7593, 9063, 476,
+ 6879, 8405, 7593, 9063, 2250,
+ 6879, 8405, 7593, 9063, 2412,
+ 6879, 8405, 7593, 9063, 6824,
+ 6879, 8405, 7593, 9063, 7080,
+ 6879, 8405, 8748,
+ 6879, 8405, 9007, 7062,
+ 6879, 8405, 9162,
+ 6879, 8427, 7569, 8774,
+ 6879, 8427, 9271, 8774,
+ 6879, 8555, 5758,
+ 6879, 8787, 5758,
+ 6879, 8941, 5758,
+ 6879, 9063, 1583, 8774,
+ 6879, 9063, 7683, 8774,
+ 6879, 9063, 8151, 8427, 7569, 8774,
+ 6879, 9063, 8405, 384,
+ 6879, 9063, 8405, 416,
+ 6879, 9063, 8405, 476,
+ 6879, 9063, 8405, 644,
+ 6879, 9063, 8405, 888,
+ 6879, 9063, 8405, 1128,
+ 6879, 9063, 8405, 1129, 6121, 5388,
+ 6879, 9063, 8405, 1129, 6121, 6654,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7398,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 12120,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7724,
+ 6879, 9063, 8405, 1129, 6121, 7782,
+ 6879, 9063, 8405, 1129, 6121, 13064,
+ 6879, 9063, 8405, 2216,
+ 6879, 9063, 8405, 2250,
+ 6879, 9063, 8405, 2412,
+ 6879, 9063, 8405, 2413, 6121, 6654,
+ 6879, 9063, 8405, 2490,
+ 6879, 9063, 8405, 2522,
+ 6879, 9063, 8405, 2658,
+ 6879, 9063, 8405, 3774,
+ 6879, 9063, 8405, 4408,
+ 6879, 9063, 8405, 4614,
+ 6879, 9063, 8405, 4615, 6121, 5388,
+ 6879, 9063, 8405, 4615, 6121, 6654,
+ 6879, 9063, 8405, 4615, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 4615, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 4615, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 4615, 6121, 7398,
+ 6879, 9063, 8405, 4615, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 4615, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 4615, 6121, 7399, 721, 12120,
+ 6879, 9063, 8405, 4615, 6121, 7724,
+ 6879, 9063, 8405, 4615, 6121, 7782,
+ 6879, 9063, 8405, 4615, 6121, 8432,
+ 6879, 9063, 8405, 4615, 6121, 8924,
+ 6879, 9063, 8405, 4615, 6121, 10808,
+ 6879, 9063, 8405, 6262,
+ 6879, 9063, 8405, 6406,
+ 6879, 9063, 8405, 6407, 6121, 5388,
+ 6879, 9063, 8405, 6407, 6121, 6654,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7398,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 12120,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7724,
+ 6879, 9063, 8405, 6407, 6121, 7782,
+ 6879, 9063, 8405, 6407, 6121, 8432,
+ 6879, 9063, 8405, 6407, 6121, 8924,
+ 6879, 9063, 8405, 6407, 6121, 13064,
+ 6879, 9063, 8405, 6674,
+ 6879, 9063, 8405, 6824,
+ 6879, 9063, 8405, 7022,
+ 6879, 9063, 8405, 7080,
+ 6879, 9063, 8405, 7316,
+ 6879, 9063, 8405, 7317, 6121, 5388,
+ 6879, 9063, 8405, 7317, 6121, 6654,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7398,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 12120,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7724,
+ 6879, 9063, 8405, 7317, 6121, 7782,
+ 6879, 9063, 8405, 7317, 6121, 13064,
+ 6879, 9063, 8405, 7568,
+ 6879, 9063, 8405, 7682,
+ 6879, 9063, 8405, 9007, 7484,
+ 6879, 9063, 8405, 9270,
+ 6879, 9063, 8405, 9271, 6121, 5388,
+ 6879, 9063, 8405, 9271, 6121, 6654,
+ 6879, 9063, 8405, 9271, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 9271, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 9271, 6121, 7398,
+ 6879, 9063, 8405, 9271, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 9271, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 9271, 6121, 7724,
+ 6879, 9063, 8405, 9271, 6121, 7782,
+ 6879, 9063, 8405, 9530,
+ 6879, 9063, 8405, 9531, 6121, 5388,
+ 6879, 9063, 8405, 9531, 6121, 6654,
+ 6879, 9063, 8405, 9531, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 9531, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 9531, 6121, 7398,
+ 6879, 9063, 8405, 9531, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 9531, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 9531, 6121, 7724,
+ 6879, 9063, 8405, 9531, 6121, 7782,
+ 6879, 9063, 8405, 9808,
+ 6879, 9063, 8405, 9809, 6121, 5388,
+ 6879, 9063, 8405, 9809, 6121, 6654,
+ 6879, 9063, 8405, 9809, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 9809, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 9809, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 9809, 6121, 7724,
+ 6879, 9063, 8405, 9809, 6121, 7782,
+ 6879, 9063, 8405, 9809, 6121, 8432,
+ 6879, 9063, 8405, 9809, 6121, 8924,
+ 6879, 9063, 8405, 9809, 6121, 10808,
+ 6879, 9063, 8405, 11709, 9162,
+ 6879, 9063, 8427, 7569, 8774,
+ 6879, 9063, 10489, 8151, 8427, 7569, 8774,
+ 6879, 9063, 10489, 8427, 7569, 8774,
+ 6879, 9245, 5758,
+ 6879, 9412,
+ 6879, 9419, 3717, 5758,
+ 6879, 9483, 8396,
+ 6879, 9513, 5758,
+ 6879, 9809, 6121, 4531, 8774,
+ 6879, 9809, 6121, 6379, 721, 4531, 8774,
+ 6879, 9809, 6121, 10805, 721, 4531, 8774,
+ 6879, 10331, 5758,
+ 6879, 10469, 4926,
+ 6879, 10489, 8427, 9271, 8774,
+ 6879, 10651, 3717, 5758,
+ 6879, 10809, 721, 5388,
+ 6879, 10809, 721, 7782,
+ 6879, 10809, 721, 12120,
+ 6879, 10809, 7724,
+ 6879, 11261, 7593, 8405, 888,
+ 6879, 11261, 7593, 8405, 2216,
+ 6879, 11261, 7593, 8405, 2412,
+ 6879, 11261, 7593, 8405, 3774,
+ 6879, 11261, 7593, 8405, 6824,
+ 6879, 11405, 6443, 2171, 4388,
+ 6879, 11405, 6443, 2171, 9244,
+ 6879, 11405, 6443, 2171, 9345, 9736,
+ 6879, 11405, 6443, 2171, 9345, 9764,
+ 6879, 11405, 6443, 2171, 9614,
+ 6879, 11405, 6443, 2171, 10625, 9736,
+ 6879, 11405, 6443, 2171, 10625, 9764,
+ 6879, 11405, 6443, 2671, 5010,
+ 6879, 11405, 6443, 2671, 9736,
+ 6879, 11405, 6443, 2671, 9764,
+ 6879, 11405, 6443, 2671, 10625, 9736,
+ 6879, 11405, 6443, 4200,
+ 6879, 11405, 6443, 4201, 9344,
+ 6879, 11405, 6443, 4201, 9345, 9736,
+ 6879, 11405, 6443, 4201, 9345, 9764,
+ 6879, 11405, 6443, 4201, 9736,
+ 6879, 11405, 6443, 4201, 9764,
+ 6879, 11405, 6443, 4201, 10624,
+ 6879, 11405, 6443, 4201, 10625, 9764,
+ 6879, 11405, 6443, 6784,
+ 6879, 11405, 6443, 6785, 9736,
+ 6879, 11405, 6443, 6785, 9764,
+ 6879, 11405, 6443, 6785, 10624,
+ 6879, 11405, 6443, 6785, 10625, 9736,
+ 6879, 11405, 8505, 4201, 9344,
+ 6879, 11405, 9153, 4201, 5010,
+ 6879, 11405, 9337, 2171, 10436,
+ 6879, 11405, 9975, 2779, 10138,
+ 6879, 11405, 10549, 6785, 5010,
+ 6879, 11405, 10621, 2170,
+ 6879, 11405, 10621, 2171, 9344,
+ 6879, 11405, 10621, 2171, 10624,
+ 6879, 11405, 10621, 2670,
+ 6879, 11405, 10621, 2778,
+ 6879, 11405, 10621, 4201, 9344,
+ 6879, 11405, 10621, 4201, 10624,
+ 6879, 11405, 10621, 6784,
+ 6879, 11405, 10621, 7695, 9344,
+ 6879, 11405, 10621, 8820,
+ 6879, 11405, 10755, 4201, 9344,
+ 6879, 11405, 11117, 2670,
+ 6879, 11405, 11617, 2778,
+ 6879, 11405, 11617, 2779, 10138,
+ 6879, 11405, 11617, 4201, 9344,
+ 6879, 11405, 11645, 2170,
+ 6879, 11405, 11645, 2670,
+ 6879, 11405, 11645, 6784,
+ 6879, 11405, 11865, 2670,
+ 6879, 11405, 11865, 2671, 10707, 4212,
+ 6879, 11405, 11865, 4200,
+ 6879, 11405, 11865, 4201, 9344,
+ 6879, 11405, 11865, 6784,
+ 6879, 11405, 11865, 6785, 10707, 4212,
+ 6879, 12120,
+ 6879, 12489, 10365, 10586,
+ 6879, 12489, 10365, 10588,
+ 6879, 12489, 10365, 10592,
+ 6879, 12489, 10365, 10594,
+ 6879, 12489, 10365, 10598,
+ 6879, 12489, 10365, 10600,
+ 6879, 12489, 10365, 11272,
+ 6879, 12489, 10365, 11274,
+ 6879, 12489, 10365, 11276,
+ 6879, 12489, 10365, 11278,
+ 6879, 12489, 10365, 11284,
+ 6879, 12489, 10365, 11286,
+ 6879, 12489, 10365, 11288,
+ 6879, 12489, 10365, 11296,
+ 6879, 12489, 10365, 11298,
+ 6879, 12489, 10365, 11300,
+ 6879, 12489, 10365, 11302,
+ 6879, 12489, 10365, 11304,
+ 6879, 12489, 10365, 11306,
+ 6879, 12489, 10365, 11308,
+ 6879, 12489, 10365, 11310,
+ 6879, 12489, 10365, 11312,
+ 6879, 12489, 10365, 11314,
+ 6879, 12489, 10365, 11316,
+ 6879, 12489, 10365, 11318,
+ 6879, 12489, 10365, 11320,
+ 6879, 12489, 10365, 11322,
+ 6879, 12489, 10365, 11324,
+ 6879, 12489, 10365, 11326,
+ 6879, 12489, 10365, 11328,
+ 6879, 12489, 10365, 11330,
+ 6879, 12489, 10365, 11332,
+ 6879, 12489, 10365, 11334,
+ 6879, 12489, 10365, 11336,
+ 6879, 12489, 10365, 11338,
+ 6879, 12489, 10365, 11340,
+ 6879, 12489, 10365, 11342,
+ 6879, 13036,
+ 6879, 13064,
+ 6909, 4215, 13047, 9898,
+ 6909, 5385, 8037, 6622,
+ 6909, 6505, 6906,
+ 6909, 6505, 8083, 9811, 721, 11765, 6434,
+ 6909, 6505, 8083, 10959, 721, 11765, 6434,
+ 6909, 6569, 4926,
+ 6909, 6723, 9601, 12141, 6505, 5830,
+ 6909, 6723, 13233, 11187, 9898,
+ 6909, 6879, 6622,
+ 6909, 6907, 12017, 4927, 10380,
+ 6909, 7121, 13069, 7821, 11765, 6434,
+ 6909, 7271, 4153, 6434,
+ 6909, 7607, 4153, 6434,
+ 6909, 7773, 13069, 7821, 11765, 6434,
+ 6909, 7971, 46,
+ 6909, 8097, 13235, 11765, 6434,
+ 6909, 8153, 6617, 11195, 4927, 10380,
+ 6909, 8153, 8869, 6617, 11195, 4927, 10380,
+ 6909, 8717, 6617, 11195, 4927, 10380,
+ 6909, 8717, 8869, 6617, 11195, 4927, 10380,
+ 6909, 9085, 11242,
+ 6909, 9722,
+ 6909, 9898,
+ 6909, 10385, 6505, 5830,
+ 6909, 10677, 760,
+ 6909, 11765, 6434,
+ 6909, 12017, 4927, 10380,
+ 6909, 12387, 11765, 6434,
+ 6909, 12539, 11765, 6434,
+ 6909, 12895, 11765, 6434,
+ 6909, 12967, 6409, 9051, 10380,
+ 6909, 12967, 6409, 11195, 4927, 10380,
+ 6909, 13061, 46,
+ 6909, 13067, 6409, 9051, 10380,
+ 6909, 13067, 6409, 11195, 4927, 10380,
+ 6909, 13191, 7271, 4153, 6434,
+ 6909, 13191, 7607, 4153, 6434,
+ 6909, 13191, 11765, 6434,
+ 6909, 13199, 6505, 11765, 6434,
+ 6909, 13233, 9898,
+ 6909, 13233, 10433, 9898,
+ 6909, 13235, 11765, 6434,
+ 6909, 13351, 11765, 6434,
+ 6954,
+ 6989, 428,
+ 6989, 429, 445, 12903, 6741, 568,
+ 7031, 341, 5759, 940,
+ 7031, 341, 5759, 5740,
+ 7031, 341, 5965, 6540,
+ 7031, 341, 5965, 6541, 8596,
+ 7031, 341, 5965, 8596,
+ 7031, 341, 6689, 2170,
+ 7031, 341, 6689, 2540,
+ 7031, 341, 6689, 2778,
+ 7031, 341, 6689, 4200,
+ 7031, 341, 6689, 4214,
+ 7031, 341, 6689, 5190,
+ 7031, 341, 6689, 6260,
+ 7031, 341, 6689, 6722,
+ 7031, 341, 6689, 7508,
+ 7031, 341, 6689, 7694,
+ 7031, 341, 7803, 8,
+ 7031, 341, 7803, 28,
+ 7031, 341, 7803, 40,
+ 7031, 341, 7803, 162,
+ 7031, 341, 7803, 590,
+ 7031, 341, 8405, 0,
+ 7031, 341, 8405, 16,
+ 7031, 341, 8405, 100,
+ 7031, 341, 8405, 116,
+ 7031, 341, 8405, 138,
+ 7031, 341, 8405, 216,
+ 7031, 341, 8405, 236,
+ 7031, 341, 8405, 306,
+ 7031, 341, 8405, 332,
+ 7031, 341, 8405, 364,
+ 7031, 341, 8405, 392,
+ 7031, 341, 8405, 426,
+ 7031, 341, 8405, 440,
+ 7031, 341, 8405, 462,
+ 7031, 341, 8405, 510,
+ 7031, 341, 8405, 524,
+ 7031, 341, 8405, 556,
+ 7031, 341, 8405, 610,
+ 7031, 341, 8405, 622,
+ 7031, 341, 8405, 652,
+ 7031, 341, 8405, 670,
+ 7031, 341, 8405, 1434,
+ 7031, 341, 8405, 1612,
+ 7031, 341, 8405, 2030,
+ 7031, 341, 8405, 2126,
+ 7031, 341, 8405, 2212,
+ 7031, 341, 8405, 2516,
+ 7031, 341, 8405, 2678,
+ 7049, 5759, 1763, 2722,
+ 7049, 5759, 4740,
+ 7049, 5759, 6388,
+ 7049, 5759, 6608,
+ 7049, 5759, 7450,
+ 7049, 5759, 7976,
+ 7049, 5759, 7992,
+ 7049, 5759, 8025, 2227, 4794,
+ 7049, 5759, 8583, 5014,
+ 7049, 5759, 8663, 8666,
+ 7049, 5759, 8918,
+ 7049, 5759, 9382,
+ 7049, 5759, 9408,
+ 7049, 5759, 9506,
+ 7049, 5759, 9624,
+ 7049, 5759, 9794,
+ 7049, 5759, 9902,
+ 7049, 5759, 11438,
+ 7049, 5759, 11440,
+ 7049, 5759, 12088,
+ 7049, 5759, 12366,
+ 7049, 5759, 12906,
+ 7049, 5759, 13038,
+ 7049, 6689, 2170,
+ 7049, 6689, 2540,
+ 7049, 6689, 2778,
+ 7049, 6689, 4200,
+ 7049, 6689, 4214,
+ 7049, 6689, 5190,
+ 7049, 6689, 6260,
+ 7049, 6689, 6722,
+ 7049, 6689, 7508,
+ 7049, 6689, 7694,
+ 7049, 7803, 5759, 8,
+ 7049, 7803, 5759, 16,
+ 7049, 7803, 5759, 40,
+ 7049, 7803, 5759, 48,
+ 7049, 7803, 5759, 58,
+ 7049, 7803, 5759, 66,
+ 7049, 7803, 5759, 72,
+ 7049, 7803, 5759, 92,
+ 7049, 7803, 5759, 258,
+ 7049, 7803, 5759, 266,
+ 7049, 7803, 5759, 426,
+ 7049, 7803, 5759, 440,
+ 7049, 7803, 5759, 582,
+ 7049, 7803, 5759, 606,
+ 7049, 7803, 5759, 652,
+ 7049, 7803, 5759, 668,
+ 7049, 7803, 10259, 58,
+ 7049, 7803, 10259, 86,
+ 7049, 8405, 100,
+ 7049, 8405, 116,
+ 7049, 8405, 130,
+ 7049, 8405, 138,
+ 7049, 8405, 150,
+ 7049, 8405, 236,
+ 7049, 8405, 306,
+ 7049, 8405, 322,
+ 7049, 8405, 332,
+ 7049, 8405, 350,
+ 7049, 8405, 380,
+ 7049, 8405, 412,
+ 7049, 8405, 480,
+ 7049, 8405, 496,
+ 7049, 8405, 516,
+ 7049, 8405, 524,
+ 7049, 8405, 556,
+ 7049, 8405, 568,
+ 7049, 8405, 616,
+ 7049, 8405, 660,
+ 7049, 8405, 884,
+ 7049, 8405, 890,
+ 7049, 8405, 1612,
+ 7049, 8405, 1618,
+ 7049, 8405, 2038,
+ 7049, 8405, 2080,
+ 7049, 8405, 2134,
+ 7049, 8405, 2212,
+ 7049, 8405, 2218,
+ 7049, 8405, 2516,
+ 7049, 8405, 2572,
+ 7049, 8405, 2678,
+ 7049, 8405, 2684,
+ 7049, 8405, 5994,
+ 7049, 8405, 6000,
+ 7049, 8775, 783, 2426,
+ 7049, 8775, 783, 4768,
+ 7049, 8775, 965, 2426,
+ 7049, 8775, 965, 4768,
+ 7049, 8775, 1763, 6441, 782,
+ 7049, 8775, 1763, 6441, 2226,
+ 7049, 8775, 1763, 6441, 2552,
+ 7049, 8775, 1763, 6441, 3814,
+ 7049, 8775, 1763, 6441, 5026,
+ 7049, 8775, 1763, 6441, 5450,
+ 7049, 8775, 1763, 6441, 10446,
+ 7049, 8775, 1763, 6441, 10448,
+ 7049, 8775, 1763, 6441, 11178,
+ 7049, 8775, 1763, 6441, 11180,
+ 7049, 8775, 2227, 2426,
+ 7049, 8775, 2227, 4768,
+ 7049, 8775, 3815, 2426,
+ 7049, 8775, 3815, 4768,
+ 7049, 8775, 5027, 2426,
+ 7049, 8775, 5027, 4768,
+ 7049, 8775, 5451, 2426,
+ 7049, 8775, 5451, 4768,
+ 7049, 8775, 9143, 2426,
+ 7049, 8775, 9143, 4768,
+ 7049, 8775, 9145, 2426,
+ 7049, 8775, 9145, 4768,
+ 7049, 8775, 9981, 2426,
+ 7049, 8775, 9981, 4768,
+ 7049, 8775, 9983, 2426,
+ 7049, 8775, 9983, 4768,
+ 7049, 8775, 9985, 2426,
+ 7049, 8775, 9985, 4768,
+ 7049, 8775, 10447, 2426,
+ 7049, 8775, 10447, 4768,
+ 7049, 8775, 10449, 2426,
+ 7049, 8775, 10449, 4768,
+ 7049, 8775, 11179, 2426,
+ 7049, 8775, 11179, 4768,
+ 7049, 8775, 11181, 2426,
+ 7049, 8775, 11181, 4768,
+ 7049, 8775, 11380,
+ 7049, 8775, 11716,
+ 7049, 9971, 8775, 5548,
+ 7049, 12053, 7803, 360,
+ 7049, 12053, 7803, 498,
+ 7049, 12053, 7803, 500,
+ 7049, 12053, 7803, 506,
+ 7049, 12053, 7803, 522,
+ 7049, 12053, 7803, 1850,
+ 7049, 12053, 7803, 2282,
+ 7049, 12053, 7803, 2286,
+ 7049, 12053, 7803, 2288,
+ 7049, 12053, 7803, 2292,
+ 7049, 12053, 7803, 2308,
+ 7049, 12053, 7803, 2321, 6031, 2170,
+ 7049, 12053, 7803, 2321, 6031, 2778,
+ 7049, 12053, 7803, 2334,
+ 7049, 12053, 7803, 2344,
+ 7049, 12053, 7803, 2478,
+ 7049, 12053, 7803, 5506,
+ 7085, 601, 5876,
+ 7085, 4117, 5876,
+ 7085, 4849, 10643, 10374,
+ 7085, 8056,
+ 7085, 8849, 10677, 761, 10374,
+ 7089, 6622,
+ 7089, 7593, 8405, 0,
+ 7089, 7593, 8405, 1, 6121, 1045, 6376,
+ 7089, 7593, 8405, 1, 6121, 1045, 6377, 721, 8432,
+ 7089, 7593, 8405, 1, 6121, 1045, 6490,
+ 7089, 7593, 8405, 1, 6121, 4531, 6376,
+ 7089, 7593, 8405, 1, 6121, 5551, 6376,
+ 7089, 7593, 8405, 1, 6121, 5551, 6377, 721, 6378,
+ 7089, 7593, 8405, 1, 6121, 5551, 6490,
+ 7089, 7593, 8405, 1, 6121, 6378,
+ 7089, 7593, 8405, 1, 6121, 6516,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 1045, 6490,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 4531, 6376,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 6378,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 6874,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 7708,
+ 7089, 7593, 8405, 1, 6121, 6546,
+ 7089, 7593, 8405, 1, 6121, 6874,
+ 7089, 7593, 8405, 1, 6121, 7443, 4389, 5550,
+ 7089, 7593, 8405, 1, 6121, 7708,
+ 7089, 7593, 8405, 1, 6121, 8153, 6874,
+ 7089, 7593, 8405, 1, 6121, 8432,
+ 7089, 7593, 8405, 1, 6121, 8534,
+ 7089, 7593, 8405, 1, 6121, 8758,
+ 7089, 7593, 8405, 1, 6121, 10267, 6516,
+ 7089, 7593, 8405, 1, 6121, 10804,
+ 7089, 7593, 8405, 1, 6121, 10805, 721, 8432,
+ 7089, 7593, 8405, 1, 6121, 11215, 4530,
+ 7089, 7593, 8405, 1, 6121, 11448,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 1045, 6490,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 4531, 6376,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 6378,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 6874,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 7708,
+ 7089, 7593, 8405, 2,
+ 7089, 7593, 8405, 3, 6121, 1045, 6376,
+ 7089, 7593, 8405, 3, 6121, 1045, 6490,
+ 7089, 7593, 8405, 3, 6121, 4530,
+ 7089, 7593, 8405, 3, 6121, 4877, 6490,
+ 7089, 7593, 8405, 3, 6121, 8473, 7708,
+ 7089, 7593, 8405, 3, 6121, 8758,
+ 7089, 7593, 8405, 3, 6121, 8846,
+ 7089, 7593, 8405, 3, 6121, 9553, 4530,
+ 7089, 7593, 8405, 4,
+ 7089, 7593, 8405, 5, 6121, 1045, 6376,
+ 7089, 7593, 8405, 5, 6121, 3966,
+ 7089, 7593, 8405, 5, 6121, 4530,
+ 7089, 7593, 8405, 5, 6121, 6378,
+ 7089, 7593, 8405, 5, 6121, 6546,
+ 7089, 7593, 8405, 5, 6121, 8758,
+ 7089, 7593, 8405, 5, 6121, 9072,
+ 7089, 7593, 8405, 5, 6121, 9073, 721, 6378,
+ 7089, 7593, 8405, 5, 6121, 11448,
+ 7089, 7593, 8405, 6,
+ 7089, 7593, 8405, 7, 6121, 1045, 6376,
+ 7089, 7593, 8405, 7, 6121, 1045, 6490,
+ 7089, 7593, 8405, 7, 6121, 3966,
+ 7089, 7593, 8405, 7, 6121, 4530,
+ 7089, 7593, 8405, 7, 6121, 4531, 721, 5878,
+ 7089, 7593, 8405, 7, 6121, 4877, 6490,
+ 7089, 7593, 8405, 7, 6121, 5878,
+ 7089, 7593, 8405, 7, 6121, 6546,
+ 7089, 7593, 8405, 7, 6121, 8473, 7708,
+ 7089, 7593, 8405, 7, 6121, 8758,
+ 7089, 7593, 8405, 7, 6121, 8846,
+ 7089, 7593, 8405, 7, 6121, 9072,
+ 7089, 7593, 8405, 7, 6121, 9553, 4530,
+ 7089, 7593, 8405, 7, 6121, 11449, 6490,
+ 7089, 7593, 8405, 8,
+ 7089, 7593, 8405, 9, 6121, 1045, 6376,
+ 7089, 7593, 8405, 9, 6121, 1045, 6490,
+ 7089, 7593, 8405, 9, 6121, 4531, 6376,
+ 7089, 7593, 8405, 9, 6121, 6378,
+ 7089, 7593, 8405, 9, 6121, 6516,
+ 7089, 7593, 8405, 9, 6121, 6546,
+ 7089, 7593, 8405, 9, 6121, 6874,
+ 7089, 7593, 8405, 9, 6121, 7272,
+ 7089, 7593, 8405, 9, 6121, 7708,
+ 7089, 7593, 8405, 9, 6121, 7709, 6490,
+ 7089, 7593, 8405, 9, 6121, 8153, 6874,
+ 7089, 7593, 8405, 9, 6121, 8432,
+ 7089, 7593, 8405, 9, 6121, 8433, 721, 6378,
+ 7089, 7593, 8405, 9, 6121, 8433, 721, 6874,
+ 7089, 7593, 8405, 9, 6121, 8534,
+ 7089, 7593, 8405, 9, 6121, 8758,
+ 7089, 7593, 8405, 9, 6121, 9072,
+ 7089, 7593, 8405, 9, 6121, 9073, 721, 6516,
+ 7089, 7593, 8405, 9, 6121, 10267, 6516,
+ 7089, 7593, 8405, 9, 6121, 10804,
+ 7089, 7593, 8405, 9, 6121, 11215, 4530,
+ 7089, 7593, 8405, 9, 6121, 11448,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 1045, 6490,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 4531, 6376,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 6378,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 6874,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 7708,
+ 7089, 7593, 8405, 9, 6121, 11449, 6490,
+ 7089, 7593, 8405, 10,
+ 7089, 7593, 8405, 11, 6121, 1045, 6376,
+ 7089, 7593, 8405, 11, 6121, 4530,
+ 7089, 7593, 8405, 11, 6121, 8473, 7708,
+ 7089, 7593, 8405, 11, 6121, 9553, 4530,
+ 7089, 7593, 8405, 12,
+ 7089, 7593, 8405, 13, 6121, 1045, 6376,
+ 7089, 7593, 8405, 13, 6121, 4530,
+ 7089, 7593, 8405, 13, 6121, 6378,
+ 7089, 7593, 8405, 13, 6121, 6516,
+ 7089, 7593, 8405, 13, 6121, 6546,
+ 7089, 7593, 8405, 13, 6121, 8432,
+ 7089, 7593, 8405, 13, 6121, 8758,
+ 7089, 7593, 8405, 13, 6121, 9072,
+ 7089, 7593, 8405, 13, 6121, 9553, 4530,
+ 7089, 7593, 8405, 13, 6121, 11448,
+ 7089, 7593, 8405, 14,
+ 7089, 7593, 8405, 15, 6121, 1045, 6376,
+ 7089, 7593, 8405, 15, 6121, 1045, 6490,
+ 7089, 7593, 8405, 15, 6121, 4530,
+ 7089, 7593, 8405, 15, 6121, 4877, 6490,
+ 7089, 7593, 8405, 15, 6121, 6517, 6490,
+ 7089, 7593, 8405, 15, 6121, 6546,
+ 7089, 7593, 8405, 15, 6121, 8758,
+ 7089, 7593, 8405, 15, 6121, 9072,
+ 7089, 7593, 8405, 15, 6121, 10802,
+ 7089, 7593, 8405, 15, 6121, 10804,
+ 7089, 7593, 8405, 15, 6121, 11448,
+ 7089, 7593, 8405, 16,
+ 7089, 7593, 8405, 17, 6121, 1045, 6490,
+ 7089, 7593, 8405, 17, 6121, 4531, 6376,
+ 7089, 7593, 8405, 17, 6121, 6378,
+ 7089, 7593, 8405, 17, 6121, 6516,
+ 7089, 7593, 8405, 17, 6121, 6546,
+ 7089, 7593, 8405, 17, 6121, 6874,
+ 7089, 7593, 8405, 17, 6121, 7708,
+ 7089, 7593, 8405, 17, 6121, 7709, 6490,
+ 7089, 7593, 8405, 17, 6121, 8153, 6874,
+ 7089, 7593, 8405, 17, 6121, 8432,
+ 7089, 7593, 8405, 17, 6121, 8534,
+ 7089, 7593, 8405, 17, 6121, 8758,
+ 7089, 7593, 8405, 17, 6121, 10267, 6516,
+ 7089, 7593, 8405, 17, 6121, 10804,
+ 7089, 7593, 8405, 17, 6121, 10805, 721, 6378,
+ 7089, 7593, 8405, 17, 6121, 11215, 4530,
+ 7089, 7593, 8405, 17, 6121, 11448,
+ 7089, 7593, 8405, 18,
+ 7089, 7593, 8405, 19, 6121, 6546,
+ 7089, 7593, 8405, 19, 6121, 8758,
+ 7089, 7593, 8405, 19, 6121, 11448,
+ 7089, 7593, 8405, 19, 6121, 12426,
+ 7089, 7593, 8405, 20,
+ 7089, 7593, 8405, 21, 6121, 1045, 6490,
+ 7089, 7593, 8405, 21, 6121, 4530,
+ 7089, 7593, 8405, 21, 6121, 4877, 6490,
+ 7089, 7593, 8405, 21, 6121, 6378,
+ 7089, 7593, 8405, 21, 6121, 6546,
+ 7089, 7593, 8405, 21, 6121, 8758,
+ 7089, 7593, 8405, 21, 6121, 8759, 721, 10001, 8758,
+ 7089, 7593, 8405, 21, 6121, 9072,
+ 7089, 7593, 8405, 21, 6121, 9553, 4530,
+ 7089, 7593, 8405, 21, 6121, 10001, 8758,
+ 7089, 7593, 8405, 21, 6121, 10802,
+ 7089, 7593, 8405, 22,
+ 7089, 7593, 8405, 23, 6121, 760,
+ 7089, 7593, 8405, 23, 6121, 1045, 6490,
+ 7089, 7593, 8405, 23, 6121, 1045, 6491, 721, 8432,
+ 7089, 7593, 8405, 23, 6121, 3770,
+ 7089, 7593, 8405, 23, 6121, 3966,
+ 7089, 7593, 8405, 23, 6121, 4423, 8758,
+ 7089, 7593, 8405, 23, 6121, 4877, 6490,
+ 7089, 7593, 8405, 23, 6121, 6378,
+ 7089, 7593, 8405, 23, 6121, 6546,
+ 7089, 7593, 8405, 23, 6121, 8153, 760,
+ 7089, 7593, 8405, 23, 6121, 8473, 1044,
+ 7089, 7593, 8405, 23, 6121, 8473, 7708,
+ 7089, 7593, 8405, 23, 6121, 8758,
+ 7089, 7593, 8405, 23, 6121, 9072,
+ 7089, 7593, 8405, 23, 6121, 9553, 4530,
+ 7089, 7593, 8405, 23, 6121, 11215, 4530,
+ 7089, 7593, 8405, 23, 6121, 11449, 6490,
+ 7089, 7593, 8405, 24,
+ 7089, 7593, 8405, 25, 6121, 1045, 6376,
+ 7089, 7593, 8405, 25, 6121, 1045, 6490,
+ 7089, 7593, 8405, 25, 6121, 4530,
+ 7089, 7593, 8405, 25, 6121, 6378,
+ 7089, 7593, 8405, 25, 6121, 8473, 7708,
+ 7089, 7593, 8405, 25, 6121, 9553, 4530,
+ 7089, 7593, 8405, 26,
+ 7089, 7593, 8405, 27, 6121, 1045, 6376,
+ 7089, 7593, 8405, 27, 6121, 1045, 6490,
+ 7089, 7593, 8405, 27, 6121, 3966,
+ 7089, 7593, 8405, 27, 6121, 4849, 4530,
+ 7089, 7593, 8405, 27, 6121, 4877, 6490,
+ 7089, 7593, 8405, 27, 6121, 4895, 7443, 1760,
+ 7089, 7593, 8405, 27, 6121, 6378,
+ 7089, 7593, 8405, 27, 6121, 6546,
+ 7089, 7593, 8405, 27, 6121, 6874,
+ 7089, 7593, 8405, 27, 6121, 7708,
+ 7089, 7593, 8405, 27, 6121, 8473, 7708,
+ 7089, 7593, 8405, 27, 6121, 9072,
+ 7089, 7593, 8405, 27, 6121, 9553, 4530,
+ 7089, 7593, 8405, 27, 6121, 11215, 4530,
+ 7089, 7593, 8405, 27, 6121, 11449, 6490,
+ 7089, 7593, 8405, 27, 10451, 115, 11424,
+ 7089, 7593, 8405, 28,
+ 7089, 7593, 8405, 29, 6121, 1045, 6376,
+ 7089, 7593, 8405, 29, 6121, 1045, 6377, 721, 8432,
+ 7089, 7593, 8405, 29, 6121, 1045, 6490,
+ 7089, 7593, 8405, 29, 6121, 1809, 5551, 8318,
+ 7089, 7593, 8405, 29, 6121, 4531, 6376,
+ 7089, 7593, 8405, 29, 6121, 4536,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 1045, 6490,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 4531, 6376,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 6874,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 7708,
+ 7089, 7593, 8405, 29, 6121, 4895, 8759, 9548,
+ 7089, 7593, 8405, 29, 6121, 4896,
+ 7089, 7593, 8405, 29, 6121, 6378,
+ 7089, 7593, 8405, 29, 6121, 6516,
+ 7089, 7593, 8405, 29, 6121, 6546,
+ 7089, 7593, 8405, 29, 6121, 6874,
+ 7089, 7593, 8405, 29, 6121, 7708,
+ 7089, 7593, 8405, 29, 6121, 7709, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 7709, 721, 8432,
+ 7089, 7593, 8405, 29, 6121, 7709, 721, 10804,
+ 7089, 7593, 8405, 29, 6121, 8153, 6378,
+ 7089, 7593, 8405, 29, 6121, 8153, 6874,
+ 7089, 7593, 8405, 29, 6121, 8432,
+ 7089, 7593, 8405, 29, 6121, 8433, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 8433, 721, 6874,
+ 7089, 7593, 8405, 29, 6121, 8534,
+ 7089, 7593, 8405, 29, 6121, 8535, 721, 8432,
+ 7089, 7593, 8405, 29, 6121, 8758,
+ 7089, 7593, 8405, 29, 6121, 8759, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 10267, 6516,
+ 7089, 7593, 8405, 29, 6121, 10804,
+ 7089, 7593, 8405, 29, 6121, 10805, 721, 8432,
+ 7089, 7593, 8405, 29, 6121, 11448,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 1045, 6490,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 4531, 6376,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 6874,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 7708,
+ 7089, 7593, 8405, 30,
+ 7089, 7593, 8405, 31, 6121, 1045, 6376,
+ 7089, 7593, 8405, 31, 6121, 4530,
+ 7089, 7593, 8405, 31, 6121, 6378,
+ 7089, 7593, 8405, 31, 6121, 8473, 7708,
+ 7089, 7593, 8405, 31, 6121, 8758,
+ 7089, 7593, 8405, 31, 6121, 8759, 9785, 10802,
+ 7089, 7593, 8405, 31, 6121, 9553, 4530,
+ 7089, 7593, 8405, 31, 6121, 10196,
+ 7089, 7593, 8405, 31, 6121, 10533, 5878,
+ 7089, 7593, 8405, 32,
+ 7089, 7593, 8405, 33, 6121, 4530,
+ 7089, 7593, 8405, 33, 6121, 4531, 5878,
+ 7089, 7593, 8405, 33, 6121, 8759, 9785, 10802,
+ 7089, 7593, 8405, 33, 6121, 10001, 8758,
+ 7089, 7593, 8405, 34,
+ 7089, 7593, 8405, 35, 6121, 1045, 6376,
+ 7089, 7593, 8405, 35, 6121, 1045, 6490,
+ 7089, 7593, 8405, 35, 6121, 1045, 6491, 721, 8432,
+ 7089, 7593, 8405, 35, 6121, 4877, 6490,
+ 7089, 7593, 8405, 35, 6121, 4895, 1760,
+ 7089, 7593, 8405, 35, 6121, 5878,
+ 7089, 7593, 8405, 35, 6121, 6378,
+ 7089, 7593, 8405, 35, 6121, 6546,
+ 7089, 7593, 8405, 35, 6121, 8153, 6874,
+ 7089, 7593, 8405, 35, 6121, 8473, 7708,
+ 7089, 7593, 8405, 35, 6121, 8758,
+ 7089, 7593, 8405, 35, 6121, 9072,
+ 7089, 7593, 8405, 35, 6121, 9553, 4530,
+ 7089, 7593, 8405, 35, 6121, 10190,
+ 7089, 7593, 8405, 35, 6121, 10191, 721, 8473, 7708,
+ 7089, 7593, 8405, 35, 6121, 10267, 6516,
+ 7089, 7593, 8405, 35, 9642,
+ 7089, 7593, 8405, 36,
+ 7089, 7593, 8405, 37, 6121, 1045, 6376,
+ 7089, 7593, 8405, 37, 6121, 1045, 6490,
+ 7089, 7593, 8405, 37, 6121, 1045, 6491, 721, 1045, 6376,
+ 7089, 7593, 8405, 37, 6121, 4530,
+ 7089, 7593, 8405, 37, 6121, 6378,
+ 7089, 7593, 8405, 37, 6121, 6379, 721, 1045, 6376,
+ 7089, 7593, 8405, 37, 6121, 6546,
+ 7089, 7593, 8405, 37, 6121, 6547, 721, 1045, 6376,
+ 7089, 7593, 8405, 37, 6121, 6617, 6490,
+ 7089, 7593, 8405, 37, 6121, 7653, 5878,
+ 7089, 7593, 8405, 37, 6121, 8473, 7708,
+ 7089, 7593, 8405, 37, 6121, 9072,
+ 7089, 7593, 8405, 37, 6121, 9553, 4530,
+ 7089, 7593, 8405, 37, 6121, 11448,
+ 7089, 7593, 8405, 38,
+ 7089, 7593, 8405, 39, 6121, 1045, 6376,
+ 7089, 7593, 8405, 39, 6121, 1045, 6490,
+ 7089, 7593, 8405, 39, 6121, 3966,
+ 7089, 7593, 8405, 39, 6121, 4530,
+ 7089, 7593, 8405, 39, 6121, 4877, 6490,
+ 7089, 7593, 8405, 39, 6121, 6546,
+ 7089, 7593, 8405, 39, 6121, 6617, 6490,
+ 7089, 7593, 8405, 39, 6121, 8473, 7708,
+ 7089, 7593, 8405, 39, 6121, 8758,
+ 7089, 7593, 8405, 39, 6121, 9072,
+ 7089, 7593, 8405, 39, 6121, 9553, 4530,
+ 7089, 7593, 8405, 39, 6121, 10001, 8758,
+ 7089, 7593, 8405, 39, 6121, 10804,
+ 7089, 7593, 8405, 39, 6121, 11215, 4530,
+ 7089, 7593, 8405, 39, 6121, 11449, 6490,
+ 7089, 7593, 8405, 40,
+ 7089, 7593, 8405, 41, 760,
+ 7089, 7593, 8405, 41, 6121, 1045, 6490,
+ 7089, 7593, 8405, 41, 6121, 4531, 6376,
+ 7089, 7593, 8405, 41, 6121, 4536,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 1045, 6490,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 4531, 6376,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 6378,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 6874,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 7708,
+ 7089, 7593, 8405, 41, 6121, 5551, 6376,
+ 7089, 7593, 8405, 41, 6121, 6378,
+ 7089, 7593, 8405, 41, 6121, 6516,
+ 7089, 7593, 8405, 41, 6121, 6546,
+ 7089, 7593, 8405, 41, 6121, 6874,
+ 7089, 7593, 8405, 41, 6121, 7708,
+ 7089, 7593, 8405, 41, 6121, 7709, 721, 6378,
+ 7089, 7593, 8405, 41, 6121, 7709, 6490,
+ 7089, 7593, 8405, 41, 6121, 8153, 6378,
+ 7089, 7593, 8405, 41, 6121, 8153, 6874,
+ 7089, 7593, 8405, 41, 6121, 8432,
+ 7089, 7593, 8405, 41, 6121, 8433, 721, 10804,
+ 7089, 7593, 8405, 41, 6121, 8534,
+ 7089, 7593, 8405, 41, 6121, 10267, 6516,
+ 7089, 7593, 8405, 41, 6121, 10804,
+ 7089, 7593, 8405, 41, 6121, 10805, 721, 6378,
+ 7089, 7593, 8405, 41, 6121, 10805, 721, 6546,
+ 7089, 7593, 8405, 41, 6121, 10805, 721, 6874,
+ 7089, 7593, 8405, 41, 6121, 10805, 721, 8432,
+ 7089, 7593, 8405, 41, 6121, 10805, 6490,
+ 7089, 7593, 8405, 41, 6121, 11215, 4530,
+ 7089, 7593, 8405, 41, 6121, 11448,
+ 7089, 7593, 8405, 41, 6121, 11449, 6490,
+ 7089, 7593, 8405, 42,
+ 7089, 7593, 8405, 43, 6121, 1045, 6490,
+ 7089, 7593, 8405, 43, 6121, 3966,
+ 7089, 7593, 8405, 43, 6121, 4530,
+ 7089, 7593, 8405, 43, 6121, 7443, 4530,
+ 7089, 7593, 8405, 43, 6121, 7708,
+ 7089, 7593, 8405, 43, 6121, 9553, 4530,
+ 7089, 7593, 8405, 43, 6121, 10001, 8758,
+ 7089, 7593, 8405, 44,
+ 7089, 7593, 8405, 45, 6121, 1045, 6376,
+ 7089, 7593, 8405, 45, 6121, 1045, 6490,
+ 7089, 7593, 8405, 45, 6121, 4530,
+ 7089, 7593, 8405, 45, 6121, 5551, 6376,
+ 7089, 7593, 8405, 45, 6121, 6378,
+ 7089, 7593, 8405, 45, 6121, 6874,
+ 7089, 7593, 8405, 45, 6121, 10804,
+ 7089, 7593, 8405, 45, 6121, 11448,
+ 7089, 7593, 8405, 46,
+ 7089, 7593, 8405, 47, 6121, 1045, 6376,
+ 7089, 7593, 8405, 47, 6121, 9553, 4530,
+ 7089, 7593, 8405, 47, 6121, 10804,
+ 7089, 7593, 8405, 48,
+ 7089, 7593, 8405, 49, 6121, 1045, 6376,
+ 7089, 7593, 8405, 49, 6121, 1045, 6490,
+ 7089, 7593, 8405, 49, 6121, 4530,
+ 7089, 7593, 8405, 49, 6121, 4531, 6376,
+ 7089, 7593, 8405, 49, 6121, 4896,
+ 7089, 7593, 8405, 49, 6121, 5551, 6376,
+ 7089, 7593, 8405, 49, 6121, 6378,
+ 7089, 7593, 8405, 49, 6121, 6874,
+ 7089, 7593, 8405, 49, 6121, 7708,
+ 7089, 7593, 8405, 49, 6121, 8432,
+ 7089, 7593, 8405, 49, 6121, 8758,
+ 7089, 7593, 8405, 49, 6121, 10804,
+ 7089, 7593, 8405, 49, 6121, 11448,
+ 7089, 7593, 8405, 50,
+ 7089, 7593, 8405, 51, 6121, 1045, 6376,
+ 7089, 7593, 8405, 51, 6121, 1045, 6490,
+ 7089, 7593, 8405, 51, 6121, 3966,
+ 7089, 7593, 8405, 51, 6121, 4530,
+ 7089, 7593, 8405, 51, 6121, 4877, 6490,
+ 7089, 7593, 8405, 51, 6121, 6378,
+ 7089, 7593, 8405, 51, 6121, 6546,
+ 7089, 7593, 8405, 51, 6121, 7653, 5878,
+ 7089, 7593, 8405, 51, 6121, 8473, 7708,
+ 7089, 7593, 8405, 51, 6121, 8758,
+ 7089, 7593, 8405, 51, 6121, 9553, 4530,
+ 7089, 7593, 8405, 51, 6121, 10802,
+ 7089, 7593, 8405, 51, 6121, 11215, 4530,
+ 7089, 7593, 8405, 51, 6121, 11448,
+ 7089, 7593, 8405, 58,
+ 7089, 7593, 8405, 66,
+ 7089, 7593, 8405, 67, 6121, 6378,
+ 7089, 7593, 8405, 67, 6121, 8432,
+ 7089, 7593, 8405, 82,
+ 7089, 7593, 8405, 92,
+ 7089, 7593, 8405, 94,
+ 7089, 7593, 8405, 95, 6121, 11649, 760,
+ 7089, 7593, 8405, 98,
+ 7089, 7593, 8405, 141, 9164,
+ 7089, 7593, 8405, 156,
+ 7089, 7593, 8405, 157, 6121, 6546,
+ 7089, 7593, 8405, 157, 9164,
+ 7089, 7593, 8405, 157, 9165, 6121, 3966,
+ 7089, 7593, 8405, 186,
+ 7089, 7593, 8405, 252,
+ 7089, 7593, 8405, 282,
+ 7089, 7593, 8405, 342,
+ 7089, 7593, 8405, 353, 9164,
+ 7089, 7593, 8405, 363, 9164,
+ 7089, 7593, 8405, 406,
+ 7089, 7593, 8405, 432,
+ 7089, 7593, 8405, 440,
+ 7089, 7593, 8405, 450,
+ 7089, 7593, 8405, 505, 9164,
+ 7089, 7593, 8405, 559, 9165, 6121, 3966,
+ 7089, 7593, 8405, 563, 6121, 13018,
+ 7089, 7593, 8405, 573, 9164,
+ 7089, 7593, 8405, 578,
+ 7089, 7593, 8405, 590,
+ 7089, 7593, 8405, 594,
+ 7089, 7593, 8405, 620,
+ 7089, 7593, 8405, 912,
+ 7089, 7593, 8405, 1058,
+ 7089, 7593, 8405, 1110,
+ 7089, 7593, 8405, 1124,
+ 7089, 7593, 8405, 1125, 6121, 3966,
+ 7089, 7593, 8405, 1125, 6121, 9553, 4530,
+ 7089, 7593, 8405, 1125, 6121, 11215, 4530,
+ 7089, 7593, 8405, 1130,
+ 7089, 7593, 8405, 1138,
+ 7089, 7593, 8405, 1139, 6121, 3966,
+ 7089, 7593, 8405, 1139, 6121, 5878,
+ 7089, 7593, 8405, 1139, 6121, 6546,
+ 7089, 7593, 8405, 1139, 6121, 11215, 4530,
+ 7089, 7593, 8405, 1139, 10488,
+ 7089, 7593, 8405, 1678,
+ 7089, 7593, 8405, 1822,
+ 7089, 7593, 8405, 1952,
+ 7089, 7593, 8405, 2108,
+ 7089, 7593, 8405, 2216,
+ 7089, 7593, 8405, 2452,
+ 7089, 7593, 8405, 2453, 9642,
+ 7089, 7593, 8405, 2725, 4389, 28,
+ 7089, 7593, 8405, 2760,
+ 7089, 7593, 8405, 4065, 9164,
+ 7089, 7593, 8405, 4187, 9164,
+ 7089, 7593, 8405, 4389, 14,
+ 7089, 7593, 8405, 4404,
+ 7089, 7593, 8405, 4405, 6121, 4530,
+ 7089, 7593, 8405, 4614,
+ 7089, 7593, 8405, 4615, 6121, 8758,
+ 7089, 7593, 8405, 4854,
+ 7089, 7593, 8405, 4895, 36,
+ 7089, 7593, 8405, 4895, 37, 6121, 1045, 6376,
+ 7089, 7593, 8405, 4895, 37, 6121, 4423, 8758,
+ 7089, 7593, 8405, 4895, 37, 6121, 10001, 8758,
+ 7089, 7593, 8405, 5385, 8,
+ 7089, 7593, 8405, 5385, 9, 6121, 11215, 4530,
+ 7089, 7593, 8405, 5385, 28,
+ 7089, 7593, 8405, 5385, 29, 6121, 11215, 4530,
+ 7089, 7593, 8405, 5527, 4536,
+ 7089, 7593, 8405, 5901, 9164,
+ 7089, 7593, 8405, 5965, 2540,
+ 7089, 7593, 8405, 5965, 2778,
+ 7089, 7593, 8405, 5965, 4200,
+ 7089, 7593, 8405, 6078,
+ 7089, 7593, 8405, 6220,
+ 7089, 7593, 8405, 6406,
+ 7089, 7593, 8405, 6407, 6121, 11215, 4530,
+ 7089, 7593, 8405, 6674,
+ 7089, 7593, 8405, 6824,
+ 7089, 7593, 8405, 7494,
+ 7089, 7593, 8405, 7495, 6121, 4530,
+ 7089, 7593, 8405, 7495, 6121, 11215, 4530,
+ 7089, 7593, 8405, 7519, 36,
+ 7089, 7593, 8405, 7619, 10489, 1124,
+ 7089, 7593, 8405, 7692,
+ 7089, 7593, 8405, 7693, 6121, 8758,
+ 7089, 7593, 8405, 7693, 6121, 8759, 9785, 10802,
+ 7089, 7593, 8405, 7981, 28,
+ 7089, 7593, 8405, 8005, 4389, 28,
+ 7089, 7593, 8405, 8017, 22,
+ 7089, 7593, 8405, 8065, 5385, 8,
+ 7089, 7593, 8405, 8065, 7316,
+ 7089, 7593, 8405, 8065, 10489, 5385, 8,
+ 7089, 7593, 8405, 8387, 6121, 8758,
+ 7089, 7593, 8405, 8679, 12,
+ 7089, 7593, 8405, 8869, 0,
+ 7089, 7593, 8405, 8869, 8,
+ 7089, 7593, 8405, 8869, 12,
+ 7089, 7593, 8405, 8869, 14,
+ 7089, 7593, 8405, 8869, 15, 6121, 10190,
+ 7089, 7593, 8405, 8869, 15, 6121, 10191, 721, 5878,
+ 7089, 7593, 8405, 8869, 16,
+ 7089, 7593, 8405, 8869, 20,
+ 7089, 7593, 8405, 8869, 22,
+ 7089, 7593, 8405, 8869, 24,
+ 7089, 7593, 8405, 8869, 25, 6121, 4895, 1760,
+ 7089, 7593, 8405, 8869, 34,
+ 7089, 7593, 8405, 8869, 35, 6121, 4530,
+ 7089, 7593, 8405, 8869, 35, 6121, 4895, 1760,
+ 7089, 7593, 8405, 8869, 35, 6121, 5878,
+ 7089, 7593, 8405, 8869, 38,
+ 7089, 7593, 8405, 8869, 42,
+ 7089, 7593, 8405, 8869, 44,
+ 7089, 7593, 8405, 8869, 48,
+ 7089, 7593, 8405, 8869, 66,
+ 7089, 7593, 8405, 8869, 426,
+ 7089, 7593, 8405, 8869, 5385, 8,
+ 7089, 7593, 8405, 8869, 6406,
+ 7089, 7593, 8405, 8869, 6674,
+ 7089, 7593, 8405, 8869, 9365, 12,
+ 7089, 7593, 8405, 9185, 16,
+ 7089, 7593, 8405, 9185, 18,
+ 7089, 7593, 8405, 9185, 19, 6121, 8758,
+ 7089, 7593, 8405, 9185, 19, 6121, 8759, 721, 4530,
+ 7089, 7593, 8405, 9313, 5836,
+ 7089, 7593, 8405, 9365, 6,
+ 7089, 7593, 8405, 9365, 10,
+ 7089, 7593, 8405, 9365, 12,
+ 7089, 7593, 8405, 9365, 34,
+ 7089, 7593, 8405, 9365, 36,
+ 7089, 7593, 8405, 9365, 38,
+ 7089, 7593, 8405, 9808,
+ 7089, 7593, 8405, 9809, 6121, 8758,
+ 7089, 7593, 8405, 10489, 4,
+ 7089, 7593, 8405, 10489, 5, 6121, 1044,
+ 7089, 7593, 8405, 10489, 8,
+ 7089, 7593, 8405, 10489, 35, 6121, 10190,
+ 7089, 7593, 8405, 10489, 5385, 8,
+ 7089, 7593, 8405, 10489, 5385, 9, 6121, 4530,
+ 7089, 7593, 8405, 10489, 5385, 9, 6121, 11215, 4530,
+ 7089, 7593, 8405, 10494,
+ 7089, 7593, 8405, 10523, 28,
+ 7089, 7593, 8405, 10523, 29, 6121, 8758,
+ 7089, 7593, 8405, 10523, 40,
+ 7089, 7593, 8405, 10523, 5385, 28,
+ 7089, 7593, 8405, 10523, 8869, 24,
+ 7089, 7593, 8405, 10523, 11941, 40,
+ 7089, 7593, 8405, 10609, 2216,
+ 7089, 7593, 8405, 10640,
+ 7089, 7593, 8405, 10786,
+ 7089, 7593, 8405, 10787, 6121, 6616,
+ 7089, 7593, 8405, 11879, 50,
+ 7089, 7593, 8405, 12507, 42,
+ 7089, 7593, 8405, 12507, 344,
+ 7089, 7593, 8405, 12935, 710,
+ 7089, 7593, 8405, 12935, 3244,
+ 7089, 7593, 9063, 8405, 17, 6121, 8758,
+ 7089, 7593, 9063, 8405, 41, 6121, 8758,
+ 7089, 7593, 10301, 200,
+ 7089, 7593, 10301, 202,
+ 7089, 7593, 10301, 204,
+ 7089, 7593, 10301, 268,
+ 7089, 7593, 10301, 426,
+ 7089, 7593, 10301, 544,
+ 7089, 7593, 10301, 1156,
+ 7089, 7593, 10301, 1158,
+ 7089, 7593, 10301, 4895, 37, 38,
+ 7089, 8405, 662,
+ 7089, 8405, 710,
+ 7089, 8405, 2779, 6121, 8758,
+ 7089, 8405, 6138,
+ 7089, 8405, 7593, 9063, 0,
+ 7089, 8405, 7593, 9063, 2,
+ 7089, 8405, 7593, 9063, 4,
+ 7089, 8405, 7593, 9063, 6,
+ 7089, 8405, 7593, 9063, 8,
+ 7089, 8405, 7593, 9063, 10,
+ 7089, 8405, 7593, 9063, 12,
+ 7089, 8405, 7593, 9063, 13, 6121, 4530,
+ 7089, 8405, 7593, 9063, 14,
+ 7089, 8405, 7593, 9063, 16,
+ 7089, 8405, 7593, 9063, 18,
+ 7089, 8405, 7593, 9063, 20,
+ 7089, 8405, 7593, 9063, 22,
+ 7089, 8405, 7593, 9063, 23, 6121, 8758,
+ 7089, 8405, 7593, 9063, 24,
+ 7089, 8405, 7593, 9063, 26,
+ 7089, 8405, 7593, 9063, 28,
+ 7089, 8405, 7593, 9063, 30,
+ 7089, 8405, 7593, 9063, 34,
+ 7089, 8405, 7593, 9063, 36,
+ 7089, 8405, 7593, 9063, 38,
+ 7089, 8405, 7593, 9063, 40,
+ 7089, 8405, 7593, 9063, 42,
+ 7089, 8405, 7593, 9063, 44,
+ 7089, 8405, 7593, 9063, 48,
+ 7089, 8405, 7593, 9063, 50,
+ 7089, 8405, 7593, 9063, 66,
+ 7089, 8405, 7593, 9063, 426,
+ 7089, 8405, 7593, 9063, 450,
+ 7089, 8405, 7593, 9063, 1130,
+ 7089, 8405, 7593, 9063, 1138,
+ 7089, 8405, 7593, 9063, 2452,
+ 7089, 8405, 7593, 9063, 5385, 28,
+ 7089, 8405, 7593, 9063, 7981, 2,
+ 7089, 8405, 7593, 9063, 8869, 8,
+ 7089, 8405, 7593, 9063, 8869, 34,
+ 7089, 8405, 7593, 9063, 10267, 34,
+ 7089, 8405, 7593, 9063, 10489, 26,
+ 7089, 8405, 7593, 9063, 10489, 34,
+ 7089, 8405, 8107, 6598,
+ 7089, 8405, 8921, 11089, 9728,
+ 7089, 8405, 9313, 5836,
+ 7089, 8405, 9313, 5837, 6121, 8758,
+ 7089, 8405, 9423, 6598,
+ 7089, 8405, 9865, 6598,
+ 7089, 8405, 9915, 11720,
+ 7089, 8405, 9917, 6598,
+ 7089, 8405, 9917, 11720,
+ 7089, 8405, 10267, 9313, 5836,
+ 7089, 8405, 10267, 9313, 5837, 6121, 8758,
+ 7089, 8405, 10489, 1125, 4896,
+ 7089, 8405, 10489, 9313, 5837, 6121, 8758,
+ 7089, 8405, 11215, 6598,
+ 7089, 8405, 11251, 4,
+ 7089, 8405, 11723, 8921, 11008,
+ 7089, 9063, 8405, 0,
+ 7089, 9063, 8405, 1, 6121, 1045, 6376,
+ 7089, 9063, 8405, 1, 6121, 1045, 6377, 721, 8432,
+ 7089, 9063, 8405, 1, 6121, 1045, 6490,
+ 7089, 9063, 8405, 1, 6121, 4531, 6376,
+ 7089, 9063, 8405, 1, 6121, 5551, 6376,
+ 7089, 9063, 8405, 1, 6121, 5551, 6377, 721, 6378,
+ 7089, 9063, 8405, 1, 6121, 5551, 6490,
+ 7089, 9063, 8405, 1, 6121, 6378,
+ 7089, 9063, 8405, 1, 6121, 6516,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 1045, 6490,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 4531, 6376,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 6378,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 6874,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 7708,
+ 7089, 9063, 8405, 1, 6121, 6546,
+ 7089, 9063, 8405, 1, 6121, 6874,
+ 7089, 9063, 8405, 1, 6121, 7708,
+ 7089, 9063, 8405, 1, 6121, 8153, 6874,
+ 7089, 9063, 8405, 1, 6121, 8432,
+ 7089, 9063, 8405, 1, 6121, 8534,
+ 7089, 9063, 8405, 1, 6121, 8758,
+ 7089, 9063, 8405, 1, 6121, 10267, 6516,
+ 7089, 9063, 8405, 1, 6121, 10804,
+ 7089, 9063, 8405, 1, 6121, 10805, 721, 8432,
+ 7089, 9063, 8405, 1, 6121, 11448,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 1045, 6490,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 4531, 6376,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 6378,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 6874,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 7708,
+ 7089, 9063, 8405, 2,
+ 7089, 9063, 8405, 3, 6121, 1045, 6376,
+ 7089, 9063, 8405, 3, 6121, 1045, 6490,
+ 7089, 9063, 8405, 3, 6121, 4530,
+ 7089, 9063, 8405, 3, 6121, 4877, 6490,
+ 7089, 9063, 8405, 3, 6121, 8758,
+ 7089, 9063, 8405, 3, 6121, 8846,
+ 7089, 9063, 8405, 4,
+ 7089, 9063, 8405, 5, 6121, 1045, 6376,
+ 7089, 9063, 8405, 5, 6121, 4530,
+ 7089, 9063, 8405, 5, 6121, 6378,
+ 7089, 9063, 8405, 5, 6121, 6546,
+ 7089, 9063, 8405, 5, 6121, 8758,
+ 7089, 9063, 8405, 5, 6121, 9072,
+ 7089, 9063, 8405, 5, 6121, 9073, 721, 6378,
+ 7089, 9063, 8405, 5, 6121, 11448,
+ 7089, 9063, 8405, 6,
+ 7089, 9063, 8405, 7, 6121, 1045, 6376,
+ 7089, 9063, 8405, 7, 6121, 1045, 6490,
+ 7089, 9063, 8405, 7, 6121, 4530,
+ 7089, 9063, 8405, 7, 6121, 4877, 6490,
+ 7089, 9063, 8405, 7, 6121, 6546,
+ 7089, 9063, 8405, 7, 6121, 7593, 8405, 50,
+ 7089, 9063, 8405, 7, 6121, 7593, 8405, 51, 6121, 6546,
+ 7089, 9063, 8405, 7, 6121, 8758,
+ 7089, 9063, 8405, 7, 6121, 8846,
+ 7089, 9063, 8405, 7, 6121, 9072,
+ 7089, 9063, 8405, 7, 6121, 11449, 6490,
+ 7089, 9063, 8405, 8,
+ 7089, 9063, 8405, 9, 6121, 1045, 6376,
+ 7089, 9063, 8405, 9, 6121, 1045, 6490,
+ 7089, 9063, 8405, 9, 6121, 4531, 6376,
+ 7089, 9063, 8405, 9, 6121, 6378,
+ 7089, 9063, 8405, 9, 6121, 6516,
+ 7089, 9063, 8405, 9, 6121, 6546,
+ 7089, 9063, 8405, 9, 6121, 6874,
+ 7089, 9063, 8405, 9, 6121, 7708,
+ 7089, 9063, 8405, 9, 6121, 7709, 6490,
+ 7089, 9063, 8405, 9, 6121, 8153, 6874,
+ 7089, 9063, 8405, 9, 6121, 8432,
+ 7089, 9063, 8405, 9, 6121, 8433, 721, 6378,
+ 7089, 9063, 8405, 9, 6121, 8433, 721, 6874,
+ 7089, 9063, 8405, 9, 6121, 8534,
+ 7089, 9063, 8405, 9, 6121, 8758,
+ 7089, 9063, 8405, 9, 6121, 9072,
+ 7089, 9063, 8405, 9, 6121, 9073, 721, 6516,
+ 7089, 9063, 8405, 9, 6121, 10267, 6516,
+ 7089, 9063, 8405, 9, 6121, 10804,
+ 7089, 9063, 8405, 9, 6121, 11448,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 1045, 6490,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 4531, 6376,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 6378,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 6874,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 7708,
+ 7089, 9063, 8405, 9, 6121, 11449, 6490,
+ 7089, 9063, 8405, 10,
+ 7089, 9063, 8405, 11, 6121, 1045, 6376,
+ 7089, 9063, 8405, 11, 6121, 4530,
+ 7089, 9063, 8405, 12,
+ 7089, 9063, 8405, 13, 6121, 1045, 6376,
+ 7089, 9063, 8405, 13, 6121, 4530,
+ 7089, 9063, 8405, 13, 6121, 6378,
+ 7089, 9063, 8405, 13, 6121, 6516,
+ 7089, 9063, 8405, 13, 6121, 6546,
+ 7089, 9063, 8405, 13, 6121, 8432,
+ 7089, 9063, 8405, 13, 6121, 8758,
+ 7089, 9063, 8405, 13, 6121, 9072,
+ 7089, 9063, 8405, 13, 6121, 11448,
+ 7089, 9063, 8405, 14,
+ 7089, 9063, 8405, 15, 6121, 1045, 6376,
+ 7089, 9063, 8405, 15, 6121, 1045, 6490,
+ 7089, 9063, 8405, 15, 6121, 6517, 6490,
+ 7089, 9063, 8405, 15, 6121, 6546,
+ 7089, 9063, 8405, 15, 6121, 8758,
+ 7089, 9063, 8405, 15, 6121, 9072,
+ 7089, 9063, 8405, 15, 6121, 10802,
+ 7089, 9063, 8405, 15, 6121, 10804,
+ 7089, 9063, 8405, 15, 6121, 11448,
+ 7089, 9063, 8405, 16,
+ 7089, 9063, 8405, 17, 6121, 1045, 6376,
+ 7089, 9063, 8405, 17, 6121, 1045, 6490,
+ 7089, 9063, 8405, 17, 6121, 4531, 6376,
+ 7089, 9063, 8405, 17, 6121, 6378,
+ 7089, 9063, 8405, 17, 6121, 6516,
+ 7089, 9063, 8405, 17, 6121, 6546,
+ 7089, 9063, 8405, 17, 6121, 6874,
+ 7089, 9063, 8405, 17, 6121, 7708,
+ 7089, 9063, 8405, 17, 6121, 7709, 6490,
+ 7089, 9063, 8405, 17, 6121, 8153, 6874,
+ 7089, 9063, 8405, 17, 6121, 8432,
+ 7089, 9063, 8405, 17, 6121, 8534,
+ 7089, 9063, 8405, 17, 6121, 8758,
+ 7089, 9063, 8405, 17, 6121, 10267, 6516,
+ 7089, 9063, 8405, 17, 6121, 10804,
+ 7089, 9063, 8405, 17, 6121, 10805, 721, 6378,
+ 7089, 9063, 8405, 17, 6121, 11448,
+ 7089, 9063, 8405, 18,
+ 7089, 9063, 8405, 19, 6121, 8758,
+ 7089, 9063, 8405, 19, 6121, 11448,
+ 7089, 9063, 8405, 20,
+ 7089, 9063, 8405, 21, 6121, 1045, 6490,
+ 7089, 9063, 8405, 21, 6121, 4530,
+ 7089, 9063, 8405, 21, 6121, 4877, 6490,
+ 7089, 9063, 8405, 21, 6121, 6378,
+ 7089, 9063, 8405, 21, 6121, 6546,
+ 7089, 9063, 8405, 21, 6121, 8758,
+ 7089, 9063, 8405, 21, 6121, 8759, 721, 10001, 8758,
+ 7089, 9063, 8405, 21, 6121, 9072,
+ 7089, 9063, 8405, 21, 6121, 10001, 8758,
+ 7089, 9063, 8405, 21, 6121, 10802,
+ 7089, 9063, 8405, 22,
+ 7089, 9063, 8405, 23, 6121, 760,
+ 7089, 9063, 8405, 23, 6121, 1045, 6490,
+ 7089, 9063, 8405, 23, 6121, 1045, 6491, 721, 8432,
+ 7089, 9063, 8405, 23, 6121, 4423, 8758,
+ 7089, 9063, 8405, 23, 6121, 4877, 6490,
+ 7089, 9063, 8405, 23, 6121, 6378,
+ 7089, 9063, 8405, 23, 6121, 6546,
+ 7089, 9063, 8405, 23, 6121, 7593, 8405, 18,
+ 7089, 9063, 8405, 23, 6121, 8153, 760,
+ 7089, 9063, 8405, 23, 6121, 8473, 1044,
+ 7089, 9063, 8405, 23, 6121, 8473, 7708,
+ 7089, 9063, 8405, 23, 6121, 8758,
+ 7089, 9063, 8405, 23, 6121, 9072,
+ 7089, 9063, 8405, 23, 6121, 11449, 6490,
+ 7089, 9063, 8405, 24,
+ 7089, 9063, 8405, 25, 6121, 1045, 6376,
+ 7089, 9063, 8405, 25, 6121, 1045, 6490,
+ 7089, 9063, 8405, 25, 6121, 4530,
+ 7089, 9063, 8405, 25, 6121, 6378,
+ 7089, 9063, 8405, 26,
+ 7089, 9063, 8405, 27, 6121, 1045, 6376,
+ 7089, 9063, 8405, 27, 6121, 1045, 6490,
+ 7089, 9063, 8405, 27, 6121, 4849, 4530,
+ 7089, 9063, 8405, 27, 6121, 4877, 6490,
+ 7089, 9063, 8405, 27, 6121, 4895, 7443, 1760,
+ 7089, 9063, 8405, 27, 6121, 6378,
+ 7089, 9063, 8405, 27, 6121, 6546,
+ 7089, 9063, 8405, 27, 6121, 6874,
+ 7089, 9063, 8405, 27, 6121, 7593, 8405, 18,
+ 7089, 9063, 8405, 27, 6121, 7708,
+ 7089, 9063, 8405, 27, 6121, 9072,
+ 7089, 9063, 8405, 27, 6121, 11449, 6490,
+ 7089, 9063, 8405, 28,
+ 7089, 9063, 8405, 29, 6121, 1045, 6376,
+ 7089, 9063, 8405, 29, 6121, 1045, 6377, 721, 8432,
+ 7089, 9063, 8405, 29, 6121, 1045, 6490,
+ 7089, 9063, 8405, 29, 6121, 4531, 6376,
+ 7089, 9063, 8405, 29, 6121, 4536,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 1045, 6490,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 4531, 6376,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 6874,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 7708,
+ 7089, 9063, 8405, 29, 6121, 4895, 8759, 9548,
+ 7089, 9063, 8405, 29, 6121, 4896,
+ 7089, 9063, 8405, 29, 6121, 6378,
+ 7089, 9063, 8405, 29, 6121, 6516,
+ 7089, 9063, 8405, 29, 6121, 6546,
+ 7089, 9063, 8405, 29, 6121, 6874,
+ 7089, 9063, 8405, 29, 6121, 7708,
+ 7089, 9063, 8405, 29, 6121, 7709, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 7709, 721, 8432,
+ 7089, 9063, 8405, 29, 6121, 7709, 721, 10804,
+ 7089, 9063, 8405, 29, 6121, 8153, 6378,
+ 7089, 9063, 8405, 29, 6121, 8153, 6874,
+ 7089, 9063, 8405, 29, 6121, 8432,
+ 7089, 9063, 8405, 29, 6121, 8433, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 8433, 721, 6874,
+ 7089, 9063, 8405, 29, 6121, 8473, 7708,
+ 7089, 9063, 8405, 29, 6121, 8534,
+ 7089, 9063, 8405, 29, 6121, 8535, 721, 8432,
+ 7089, 9063, 8405, 29, 6121, 8758,
+ 7089, 9063, 8405, 29, 6121, 8759, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 10267, 6516,
+ 7089, 9063, 8405, 29, 6121, 10804,
+ 7089, 9063, 8405, 29, 6121, 10805, 721, 8432,
+ 7089, 9063, 8405, 29, 6121, 11448,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 1045, 6490,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 4531, 6376,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 6874,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 7708,
+ 7089, 9063, 8405, 30,
+ 7089, 9063, 8405, 31, 6121, 1045, 6376,
+ 7089, 9063, 8405, 31, 6121, 4530,
+ 7089, 9063, 8405, 31, 6121, 6378,
+ 7089, 9063, 8405, 31, 6121, 8758,
+ 7089, 9063, 8405, 31, 6121, 8759, 9785, 10802,
+ 7089, 9063, 8405, 31, 6121, 10196,
+ 7089, 9063, 8405, 31, 6121, 10533, 5878,
+ 7089, 9063, 8405, 32,
+ 7089, 9063, 8405, 33, 6121, 8759, 9785, 10802,
+ 7089, 9063, 8405, 33, 6121, 10001, 8758,
+ 7089, 9063, 8405, 34,
+ 7089, 9063, 8405, 35, 6121, 1045, 6376,
+ 7089, 9063, 8405, 35, 6121, 1045, 6490,
+ 7089, 9063, 8405, 35, 6121, 1045, 6491, 721, 8432,
+ 7089, 9063, 8405, 35, 6121, 4877, 6490,
+ 7089, 9063, 8405, 35, 6121, 5878,
+ 7089, 9063, 8405, 35, 6121, 6378,
+ 7089, 9063, 8405, 35, 6121, 6546,
+ 7089, 9063, 8405, 35, 6121, 8153, 6874,
+ 7089, 9063, 8405, 35, 6121, 8758,
+ 7089, 9063, 8405, 35, 6121, 9072,
+ 7089, 9063, 8405, 35, 6121, 10267, 6516,
+ 7089, 9063, 8405, 35, 9642,
+ 7089, 9063, 8405, 36,
+ 7089, 9063, 8405, 37, 6121, 1045, 6376,
+ 7089, 9063, 8405, 37, 6121, 1045, 6490,
+ 7089, 9063, 8405, 37, 6121, 1045, 6491, 721, 1045, 6376,
+ 7089, 9063, 8405, 37, 6121, 6378,
+ 7089, 9063, 8405, 37, 6121, 6379, 721, 1045, 6376,
+ 7089, 9063, 8405, 37, 6121, 6546,
+ 7089, 9063, 8405, 37, 6121, 6547, 721, 1045, 6376,
+ 7089, 9063, 8405, 37, 6121, 6617, 6490,
+ 7089, 9063, 8405, 37, 6121, 9072,
+ 7089, 9063, 8405, 37, 6121, 11448,
+ 7089, 9063, 8405, 38,
+ 7089, 9063, 8405, 39, 6121, 1045, 6376,
+ 7089, 9063, 8405, 39, 6121, 1045, 6490,
+ 7089, 9063, 8405, 39, 6121, 4530,
+ 7089, 9063, 8405, 39, 6121, 4877, 6490,
+ 7089, 9063, 8405, 39, 6121, 6546,
+ 7089, 9063, 8405, 39, 6121, 6617, 6490,
+ 7089, 9063, 8405, 39, 6121, 8758,
+ 7089, 9063, 8405, 39, 6121, 9072,
+ 7089, 9063, 8405, 39, 6121, 10001, 8758,
+ 7089, 9063, 8405, 39, 6121, 11215, 4530,
+ 7089, 9063, 8405, 39, 6121, 11449, 6490,
+ 7089, 9063, 8405, 40,
+ 7089, 9063, 8405, 41, 760,
+ 7089, 9063, 8405, 41, 6121, 1045, 6490,
+ 7089, 9063, 8405, 41, 6121, 4531, 6376,
+ 7089, 9063, 8405, 41, 6121, 4536,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 1045, 6490,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 4531, 6376,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 6378,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 6874,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 7708,
+ 7089, 9063, 8405, 41, 6121, 5551, 6376,
+ 7089, 9063, 8405, 41, 6121, 6378,
+ 7089, 9063, 8405, 41, 6121, 6516,
+ 7089, 9063, 8405, 41, 6121, 6546,
+ 7089, 9063, 8405, 41, 6121, 6874,
+ 7089, 9063, 8405, 41, 6121, 7708,
+ 7089, 9063, 8405, 41, 6121, 7709, 721, 6378,
+ 7089, 9063, 8405, 41, 6121, 7709, 6490,
+ 7089, 9063, 8405, 41, 6121, 8153, 6378,
+ 7089, 9063, 8405, 41, 6121, 8153, 6874,
+ 7089, 9063, 8405, 41, 6121, 8432,
+ 7089, 9063, 8405, 41, 6121, 8433, 721, 10804,
+ 7089, 9063, 8405, 41, 6121, 8534,
+ 7089, 9063, 8405, 41, 6121, 10267, 6516,
+ 7089, 9063, 8405, 41, 6121, 10804,
+ 7089, 9063, 8405, 41, 6121, 10805, 721, 6378,
+ 7089, 9063, 8405, 41, 6121, 10805, 721, 6546,
+ 7089, 9063, 8405, 41, 6121, 10805, 721, 6874,
+ 7089, 9063, 8405, 41, 6121, 10805, 721, 8432,
+ 7089, 9063, 8405, 41, 6121, 10805, 6490,
+ 7089, 9063, 8405, 41, 6121, 11448,
+ 7089, 9063, 8405, 41, 6121, 11449, 6490,
+ 7089, 9063, 8405, 42,
+ 7089, 9063, 8405, 43, 6121, 1045, 6490,
+ 7089, 9063, 8405, 43, 6121, 4530,
+ 7089, 9063, 8405, 43, 6121, 7708,
+ 7089, 9063, 8405, 43, 6121, 10001, 8758,
+ 7089, 9063, 8405, 44,
+ 7089, 9063, 8405, 45, 6121, 1045, 6376,
+ 7089, 9063, 8405, 45, 6121, 1045, 6490,
+ 7089, 9063, 8405, 45, 6121, 4530,
+ 7089, 9063, 8405, 45, 6121, 6378,
+ 7089, 9063, 8405, 45, 6121, 6874,
+ 7089, 9063, 8405, 45, 6121, 10804,
+ 7089, 9063, 8405, 45, 6121, 11448,
+ 7089, 9063, 8405, 46,
+ 7089, 9063, 8405, 47, 6121, 1045, 6376,
+ 7089, 9063, 8405, 47, 6121, 10804,
+ 7089, 9063, 8405, 48,
+ 7089, 9063, 8405, 49, 6121, 1045, 6376,
+ 7089, 9063, 8405, 49, 6121, 1045, 6490,
+ 7089, 9063, 8405, 49, 6121, 4530,
+ 7089, 9063, 8405, 49, 6121, 4531, 6376,
+ 7089, 9063, 8405, 49, 6121, 4896,
+ 7089, 9063, 8405, 49, 6121, 6378,
+ 7089, 9063, 8405, 49, 6121, 6874,
+ 7089, 9063, 8405, 49, 6121, 7708,
+ 7089, 9063, 8405, 49, 6121, 8432,
+ 7089, 9063, 8405, 49, 6121, 8758,
+ 7089, 9063, 8405, 49, 6121, 10804,
+ 7089, 9063, 8405, 49, 6121, 11448,
+ 7089, 9063, 8405, 50,
+ 7089, 9063, 8405, 51, 6121, 1045, 6376,
+ 7089, 9063, 8405, 51, 6121, 1045, 6490,
+ 7089, 9063, 8405, 51, 6121, 4530,
+ 7089, 9063, 8405, 51, 6121, 4877, 6490,
+ 7089, 9063, 8405, 51, 6121, 6378,
+ 7089, 9063, 8405, 51, 6121, 6546,
+ 7089, 9063, 8405, 51, 6121, 8758,
+ 7089, 9063, 8405, 51, 6121, 10802,
+ 7089, 9063, 8405, 51, 6121, 11448,
+ 7089, 9063, 8405, 58,
+ 7089, 9063, 8405, 66,
+ 7089, 9063, 8405, 67, 6121, 6378,
+ 7089, 9063, 8405, 67, 6121, 8432,
+ 7089, 9063, 8405, 82,
+ 7089, 9063, 8405, 92,
+ 7089, 9063, 8405, 94,
+ 7089, 9063, 8405, 95, 6121, 11649, 760,
+ 7089, 9063, 8405, 98,
+ 7089, 9063, 8405, 156,
+ 7089, 9063, 8405, 157, 6121, 6546,
+ 7089, 9063, 8405, 186,
+ 7089, 9063, 8405, 282,
+ 7089, 9063, 8405, 342,
+ 7089, 9063, 8405, 406,
+ 7089, 9063, 8405, 432,
+ 7089, 9063, 8405, 440,
+ 7089, 9063, 8405, 450,
+ 7089, 9063, 8405, 578,
+ 7089, 9063, 8405, 620,
+ 7089, 9063, 8405, 912,
+ 7089, 9063, 8405, 1110,
+ 7089, 9063, 8405, 1124,
+ 7089, 9063, 8405, 1130,
+ 7089, 9063, 8405, 1138,
+ 7089, 9063, 8405, 1139, 6121, 6546,
+ 7089, 9063, 8405, 1139, 10488,
+ 7089, 9063, 8405, 2453, 9642,
+ 7089, 9063, 8405, 4389, 14,
+ 7089, 9063, 8405, 4404,
+ 7089, 9063, 8405, 4614,
+ 7089, 9063, 8405, 5385, 8,
+ 7089, 9063, 8405, 5385, 28,
+ 7089, 9063, 8405, 5965, 2540,
+ 7089, 9063, 8405, 5965, 2778,
+ 7089, 9063, 8405, 5965, 4200,
+ 7089, 9063, 8405, 6078,
+ 7089, 9063, 8405, 6138,
+ 7089, 9063, 8405, 6220,
+ 7089, 9063, 8405, 6406,
+ 7089, 9063, 8405, 6824,
+ 7089, 9063, 8405, 6960,
+ 7089, 9063, 8405, 7494,
+ 7089, 9063, 8405, 7519, 36,
+ 7089, 9063, 8405, 7593, 33, 6121, 4531, 5878,
+ 7089, 9063, 8405, 7692,
+ 7089, 9063, 8405, 7693, 6121, 8758,
+ 7089, 9063, 8405, 7693, 6121, 8759, 9785, 10802,
+ 7089, 9063, 8405, 8017, 22,
+ 7089, 9063, 8405, 8869, 0,
+ 7089, 9063, 8405, 8869, 22,
+ 7089, 9063, 8405, 8869, 24,
+ 7089, 9063, 8405, 8869, 42,
+ 7089, 9063, 8405, 8869, 9365, 12,
+ 7089, 9063, 8405, 8983, 6,
+ 7089, 9063, 8405, 9313, 5836,
+ 7089, 9063, 8405, 9365, 6,
+ 7089, 9063, 8405, 9365, 10,
+ 7089, 9063, 8405, 9365, 12,
+ 7089, 9063, 8405, 9365, 34,
+ 7089, 9063, 8405, 9365, 36,
+ 7089, 9063, 8405, 9365, 38,
+ 7089, 9063, 8405, 9808,
+ 7089, 9063, 8405, 10489, 5, 6121, 1044,
+ 7089, 9063, 8405, 10489, 8,
+ 7089, 9063, 8405, 10494,
+ 7089, 9063, 8405, 10640,
+ 7089, 9063, 8405, 10786,
+ 7089, 9063, 8405, 10787, 6121, 6616,
+ 7089, 9063, 8405, 11879, 50,
+ 7089, 9063, 8405, 12507, 42,
+ 7089, 9063, 8405, 12507, 344,
+ 7089, 9063, 8405, 12935, 710,
+ 7089, 9063, 8405, 12935, 3244,
+ 7089, 9063, 10301, 268,
+ 7089, 9063, 10301, 426,
+ 7089, 11261, 7593, 8405, 0,
+ 7089, 11261, 7593, 8405, 8,
+ 7089, 11261, 7593, 8405, 16,
+ 7089, 11261, 7593, 8405, 18,
+ 7089, 11261, 7593, 8405, 28,
+ 7089, 11261, 7593, 8405, 34,
+ 7089, 11261, 7593, 8405, 40,
+ 7089, 11261, 7593, 8405, 42,
+ 7089, 11261, 7593, 8405, 46,
+ 7089, 11261, 7593, 8405, 7494,
+ 7089, 11619, 8405, 17, 7112,
+ 7089, 11619, 8405, 9007, 24,
+ 7089, 11619, 8405, 10267, 24,
+ 7089, 11619, 8405, 10489, 10,
+ 7089, 11619, 8405, 10489, 30,
+ 7098,
+ 7101, 4849, 10637, 7533, 9051, 10380,
+ 7101, 7443, 10637, 7533, 9051, 10380,
+ 7101, 7512,
+ 7101, 10677, 760,
+ 7103, 5759, 1802,
+ 7103, 5759, 5620,
+ 7103, 5759, 11076,
+ 7103, 5759, 11130,
+ 7103, 6689, 2170,
+ 7103, 6689, 2540,
+ 7103, 6689, 2778,
+ 7103, 6689, 4200,
+ 7103, 6689, 4214,
+ 7103, 6689, 5190,
+ 7103, 6689, 6260,
+ 7103, 6689, 6722,
+ 7103, 6689, 7508,
+ 7103, 6689, 7694,
+ 7103, 7593, 8405, 306,
+ 7103, 7593, 8405, 332,
+ 7103, 7593, 8405, 364,
+ 7103, 7593, 8405, 392,
+ 7103, 7593, 8405, 462,
+ 7103, 7593, 8405, 510,
+ 7103, 7593, 8405, 556,
+ 7103, 7593, 8405, 2030,
+ 7103, 7593, 8405, 9870,
+ 7103, 7803, 5759, 0,
+ 7103, 7803, 5759, 8,
+ 7103, 7803, 5759, 16,
+ 7103, 7803, 5759, 28,
+ 7103, 7803, 5759, 40,
+ 7103, 7803, 5759, 72,
+ 7103, 7803, 5759, 92,
+ 7103, 7803, 5759, 162,
+ 7103, 7803, 5759, 440,
+ 7103, 8405, 100,
+ 7103, 8405, 116,
+ 7103, 8405, 138,
+ 7103, 8405, 216,
+ 7103, 8405, 236,
+ 7103, 8405, 292,
+ 7103, 8405, 306,
+ 7103, 8405, 332,
+ 7103, 8405, 364,
+ 7103, 8405, 392,
+ 7103, 8405, 462,
+ 7103, 8405, 510,
+ 7103, 8405, 524,
+ 7103, 8405, 556,
+ 7103, 8405, 622,
+ 7103, 8405, 652,
+ 7103, 8405, 792,
+ 7103, 8405, 884,
+ 7103, 8405, 996,
+ 7103, 8405, 1260,
+ 7103, 8405, 1512,
+ 7103, 8405, 1612,
+ 7103, 8405, 2030,
+ 7103, 8405, 2212,
+ 7103, 8405, 2516,
+ 7103, 8405, 2566,
+ 7103, 8405, 2678,
+ 7103, 8405, 3028,
+ 7103, 10469, 4926,
+ 7103, 11257, 8405, 510,
+ 7103, 11257, 8405, 622,
+ 7103, 11257, 8405, 652,
+ 7103, 12017, 4926,
+ 7103, 13033, 8404,
+ 7121, 2171, 8159, 6510,
+ 7121, 2171, 9615, 6510,
+ 7121, 4201, 9259, 6510,
+ 7121, 4389, 6510,
+ 7121, 4389, 8056,
+ 7121, 4389, 9367, 7821, 8056,
+ 7121, 4849, 10465, 9947, 730,
+ 7121, 4849, 10642,
+ 7121, 4849, 12857, 12901, 6434,
+ 7121, 6507, 10502,
+ 7121, 7443, 8077, 6121, 1044,
+ 7121, 7443, 8570,
+ 7121, 7443, 10465, 9947, 730,
+ 7121, 7443, 10513, 7821, 8744,
+ 7121, 7443, 10642,
+ 7121, 7443, 12857, 10763, 6434,
+ 7121, 7443, 12933, 7821, 8744,
+ 7121, 7509, 9259, 6510,
+ 7121, 7695, 9259, 6510,
+ 7121, 7695, 10467, 6510,
+ 7165, 5758,
+ 7173, 5758,
+ 7173, 5759, 275, 10642,
+ 7173, 5759, 6121, 1045, 6490,
+ 7173, 5759, 6121, 6617, 6376,
+ 7173, 5759, 6121, 8649, 4112,
+ 7173, 5759, 6121, 9279, 4112,
+ 7173, 7708,
+ 7199, 4205, 5758,
+ 7199, 7519, 5758,
+ 7199, 9491, 5758,
+ 7201, 7711, 10374,
+ 7201, 7768,
+ 7201, 7769, 10375, 6121, 1044,
+ 7201, 7769, 10375, 6121, 5444,
+ 7201, 7821, 10677, 760,
+ 7201, 8745, 7769, 10374,
+ 7201, 8745, 12493, 10374,
+ 7201, 9095, 1045, 10374,
+ 7201, 9095, 5445, 10374,
+ 7201, 9095, 7711, 10374,
+ 7201, 9437, 444,
+ 7201, 9437, 720,
+ 7201, 9610,
+ 7201, 10780,
+ 7201, 11262,
+ 7201, 12492,
+ 7202,
+ 7209, 5758,
+ 7271, 4153, 721, 7607, 6113, 6434,
+ 7271, 4153, 6434,
+ 7271, 4153, 6435, 721, 7607, 4153, 6434,
+ 7271, 4153, 6435, 6121, 4530,
+ 7271, 4153, 6435, 9967, 7271, 6113, 6434,
+ 7271, 4153, 6435, 9967, 7607, 4153, 6434,
+ 7271, 4153, 6505, 6434,
+ 7271, 4153, 7821, 6434,
+ 7271, 4153, 8153, 6434,
+ 7271, 6113, 721, 7607, 4153, 6434,
+ 7271, 6113, 6434,
+ 7271, 6113, 6435, 569, 4895, 760,
+ 7271, 6113, 6435, 569, 8076,
+ 7271, 6113, 6435, 721, 7271, 4153, 6434,
+ 7271, 6113, 6435, 6121, 4530,
+ 7271, 6113, 6435, 9967, 7271, 4153, 6434,
+ 7271, 6113, 6505, 6434,
+ 7271, 6113, 7821, 6434,
+ 7271, 6113, 8153, 6434,
+ 7309, 7609, 4926,
+ 7309, 8405, 444,
+ 7309, 8405, 602,
+ 7309, 8405, 2174,
+ 7309, 8405, 3236,
+ 7309, 8405, 3952,
+ 7309, 8405, 3982,
+ 7309, 8405, 4348,
+ 7309, 8405, 4600,
+ 7309, 8405, 4900,
+ 7309, 8405, 5018,
+ 7309, 8405, 5192,
+ 7309, 8405, 5604,
+ 7309, 8405, 5628,
+ 7309, 8405, 6044,
+ 7309, 8405, 6488,
+ 7309, 8405, 6558,
+ 7309, 8405, 6774,
+ 7309, 8405, 7356,
+ 7309, 8405, 7712,
+ 7309, 8405, 8752,
+ 7309, 8405, 9246,
+ 7309, 8405, 9248,
+ 7309, 8405, 9368,
+ 7309, 8405, 9504,
+ 7309, 8405, 10662,
+ 7309, 8405, 12008,
+ 7309, 9283, 4926,
+ 7309, 10489, 9283, 4926,
+ 7321, 73, 8399, 4926,
+ 7321, 93, 8399, 4926,
+ 7321, 5759, 7282,
+ 7321, 5759, 8916,
+ 7321, 5759, 9824,
+ 7321, 5759, 9870,
+ 7321, 5759, 9904,
+ 7321, 5759, 11900,
+ 7321, 6689, 2170,
+ 7321, 6689, 2540,
+ 7321, 6689, 2778,
+ 7321, 6689, 4200,
+ 7321, 6689, 4214,
+ 7321, 6689, 5190,
+ 7321, 6689, 6260,
+ 7321, 6689, 6722,
+ 7321, 6689, 7508,
+ 7321, 6689, 7694,
+ 7321, 7803, 5759, 8,
+ 7321, 7803, 5759, 16,
+ 7321, 7803, 5759, 28,
+ 7321, 7803, 5759, 40,
+ 7321, 7803, 5759, 58,
+ 7321, 7803, 5759, 72,
+ 7321, 7803, 5759, 92,
+ 7321, 7803, 5759, 266,
+ 7321, 7803, 5759, 606,
+ 7321, 7803, 5759, 9827, 22,
+ 7321, 7803, 5759, 9827, 34,
+ 7321, 7803, 5759, 9827, 344,
+ 7321, 7803, 5759, 9827, 518,
+ 7321, 8322,
+ 7321, 8405, 0,
+ 7321, 8405, 8,
+ 7321, 8405, 16,
+ 7321, 8405, 28,
+ 7321, 8405, 40,
+ 7321, 8405, 58,
+ 7321, 8405, 72,
+ 7321, 8405, 92,
+ 7321, 8405, 100,
+ 7321, 8405, 116,
+ 7321, 8405, 138,
+ 7321, 8405, 216,
+ 7321, 8405, 236,
+ 7321, 8405, 266,
+ 7321, 8405, 292,
+ 7321, 8405, 306,
+ 7321, 8405, 332,
+ 7321, 8405, 364,
+ 7321, 8405, 392,
+ 7321, 8405, 462,
+ 7321, 8405, 510,
+ 7321, 8405, 524,
+ 7321, 8405, 556,
+ 7321, 8405, 606,
+ 7321, 8405, 610,
+ 7321, 8405, 622,
+ 7321, 8405, 652,
+ 7321, 8405, 792,
+ 7321, 8405, 884,
+ 7321, 8405, 974,
+ 7321, 8405, 996,
+ 7321, 8405, 1260,
+ 7321, 8405, 1512,
+ 7321, 8405, 1612,
+ 7321, 8405, 1796,
+ 7321, 8405, 2030,
+ 7321, 8405, 2076,
+ 7321, 8405, 2126,
+ 7321, 8405, 2212,
+ 7321, 8405, 2410,
+ 7321, 8405, 2438,
+ 7321, 8405, 2516,
+ 7321, 8405, 2566,
+ 7321, 8405, 2678,
+ 7321, 8405, 2746,
+ 7321, 8405, 3110,
+ 7321, 8405, 4016,
+ 7321, 8405, 5994,
+ 7321, 8405, 9827, 22,
+ 7321, 8405, 9827, 34,
+ 7321, 8405, 9827, 344,
+ 7321, 8405, 9827, 518,
+ 7325, 5758,
+ 7349, 8774,
+ 7377, 429, 10263, 5758,
+ 7380,
+ 7387, 5758,
+ 7390,
+ 7393, 8677, 8774,
+ 7424,
+ 7443, 731, 12473, 9050,
+ 7443, 1809, 11715, 9050,
+ 7443, 2171, 8159, 6510,
+ 7443, 4197, 5878,
+ 7443, 4389, 6505, 8056,
+ 7443, 4389, 6510,
+ 7443, 5876,
+ 7443, 6408,
+ 7443, 6409, 6121, 730,
+ 7443, 6409, 6121, 10959, 8963, 6434,
+ 7443, 6409, 8151, 12877, 8450,
+ 7443, 6409, 9050,
+ 7443, 6409, 9051, 6121, 1044,
+ 7443, 6409, 9817, 6121, 8744,
+ 7443, 6409, 12877, 8450,
+ 7443, 6435, 6121, 7593, 8056,
+ 7443, 6435, 6121, 9095, 5444,
+ 7443, 6505, 10637, 7533, 9050,
+ 7443, 6505, 11677, 9050,
+ 7443, 6627, 9050,
+ 7443, 6627, 9051, 7121, 4530,
+ 7443, 6627, 9051, 7773, 4530,
+ 7443, 6627, 9051, 8473, 7370,
+ 7443, 6792,
+ 7443, 7327, 4676,
+ 7443, 7821, 6627, 9050,
+ 7443, 7821, 8077, 9050,
+ 7443, 7821, 8745, 9050,
+ 7443, 7821, 10637, 7533, 9050,
+ 7443, 7821, 11677, 9050,
+ 7443, 7821, 12114,
+ 7443, 8077, 9050,
+ 7443, 8151, 12877, 9050,
+ 7443, 8153, 6409, 9050,
+ 7443, 8153, 6435, 6121, 9645, 4398,
+ 7443, 8153, 8933, 6778,
+ 7443, 8153, 11195, 4926,
+ 7443, 8153, 12114,
+ 7443, 8521, 8191, 11793, 9610,
+ 7443, 8631, 10371, 9050,
+ 7443, 8717, 11195, 4926,
+ 7443, 8745, 9050,
+ 7443, 8745, 9051, 6121, 5935, 275, 2725, 8076,
+ 7443, 8745, 9051, 6121, 5935, 275, 8005, 8076,
+ 7443, 8745, 9051, 6121, 7412,
+ 7443, 8745, 9051, 6121, 10666,
+ 7443, 8745, 9051, 7121, 8076,
+ 7443, 8745, 9051, 7773, 8076,
+ 7443, 8745, 9051, 10982,
+ 7443, 8933, 6778,
+ 7443, 9074,
+ 7443, 10493, 753, 10794,
+ 7443, 10523, 41, 9050,
+ 7443, 10637, 7533, 9050,
+ 7443, 10642,
+ 7443, 10643, 6377, 4849, 10642,
+ 7443, 10677, 761, 6121, 7412,
+ 7443, 10677, 827, 4876,
+ 7443, 11793, 9610,
+ 7443, 12114,
+ 7443, 12115, 7121, 4530,
+ 7443, 12115, 7773, 4530,
+ 7443, 12115, 10982,
+ 7443, 12877, 9050,
+ 7443, 13029, 9050,
+ 7453, 89, 5758,
+ 7453, 7765, 5758,
+ 7453, 9167, 9679, 5758,
+ 7453, 9513, 2170,
+ 7453, 9513, 2171, 9344,
+ 7453, 9513, 2171, 9345, 10624,
+ 7453, 9513, 2171, 10624,
+ 7453, 9513, 2171, 10625, 5, 6,
+ 7453, 9513, 2540,
+ 7453, 9513, 2541, 4839, 4212,
+ 7453, 9513, 2670,
+ 7453, 9513, 2671, 10624,
+ 7453, 9513, 2778,
+ 7453, 9513, 4200,
+ 7453, 9513, 4201, 9344,
+ 7453, 9513, 4201, 10624,
+ 7453, 9513, 4214,
+ 7453, 9513, 5190,
+ 7453, 9513, 6722,
+ 7453, 9513, 6784,
+ 7453, 9513, 6785, 6715, 4212,
+ 7453, 9513, 6785, 10624,
+ 7453, 9513, 7508,
+ 7453, 9513, 7694,
+ 7453, 9513, 8162,
+ 7453, 9513, 8874,
+ 7453, 9513, 10489, 2171, 9344,
+ 7453, 9675, 5758,
+ 7453, 9679, 5758,
+ 7453, 9691, 5758,
+ 7453, 9995, 5758,
+ 7453, 10511, 5758,
+ 7453, 10757, 5758,
+ 7453, 10961, 5758,
+ 7453, 11193, 5758,
+ 7453, 11797, 5758,
+ 7467, 6623, 12132,
+ 7467, 7935, 8774,
+ 7467, 8405, 4,
+ 7467, 8405, 6,
+ 7467, 8405, 8,
+ 7467, 8405, 12,
+ 7467, 8405, 28,
+ 7467, 8405, 32,
+ 7467, 8405, 42,
+ 7467, 8405, 44,
+ 7467, 8405, 46,
+ 7467, 8405, 48,
+ 7467, 8405, 50,
+ 7467, 8405, 63, 0,
+ 7467, 8405, 426,
+ 7467, 8405, 438,
+ 7467, 8405, 447, 28,
+ 7467, 8405, 662,
+ 7467, 8405, 878,
+ 7467, 8405, 1090,
+ 7467, 8405, 1110,
+ 7467, 8405, 1130,
+ 7467, 8405, 1220,
+ 7467, 8405, 1244,
+ 7467, 8405, 1486,
+ 7467, 8405, 1494,
+ 7467, 8405, 3230,
+ 7467, 8405, 3840,
+ 7467, 8405, 4185, 4189, 199, 10,
+ 7467, 8405, 4265, 4381, 12,
+ 7467, 8405, 4617, 283, 1501, 16,
+ 7467, 8405, 4625, 1114,
+ 7467, 8405, 4731, 20,
+ 7467, 8405, 5828,
+ 7467, 8405, 6059, 603, 40,
+ 7467, 8405, 6401, 6738,
+ 7467, 8405, 6415, 0,
+ 7467, 8405, 6554,
+ 7467, 8405, 6635, 3979, 6,
+ 7467, 8405, 6721, 167, 8,
+ 7467, 8405, 6891, 14,
+ 7467, 8405, 6997, 18,
+ 7467, 8405, 7028,
+ 7467, 8405, 7419, 2383, 5533, 34,
+ 7467, 8405, 7567, 13213, 36,
+ 7467, 8405, 7719, 2699, 2789, 38,
+ 7467, 8405, 7835, 6139, 44,
+ 7467, 8405, 8283, 14,
+ 7467, 8405, 8312,
+ 7467, 8405, 8391, 4829, 4891, 22,
+ 7467, 8405, 8441, 1861, 24,
+ 7467, 8405, 8501, 2129, 5057, 26,
+ 7467, 8405, 8540,
+ 7467, 8405, 8579, 8575, 30,
+ 7467, 8405, 8727, 36,
+ 7467, 8405, 9132,
+ 7467, 8405, 9543, 6759, 28,
+ 7467, 8405, 9911, 6495, 9047, 2,
+ 7467, 8405, 10132,
+ 7467, 8405, 10134,
+ 7467, 8405, 10136,
+ 7467, 8405, 10627, 7699, 7692,
+ 7467, 8405, 12482,
+ 7467, 8405, 13013, 0,
+ 7467, 8405, 13014,
+ 7467, 8405, 13057, 66,
+ 7467, 8405, 13058,
+ 7467, 8405, 13073, 28,
+ 7467, 8405, 13075, 36,
+ 7467, 8405, 13077, 38,
+ 7467, 8405, 13211, 28,
+ 7467, 8405, 13227, 24,
+ 7467, 8405, 13229, 26,
+ 7467, 8405, 13339, 24,
+ 7467, 8405, 13377, 14,
+ 7467, 8405, 13391, 14,
+ 7467, 8405, 13399, 2,
+ 7467, 8717, 12132,
+ 7467, 9909, 8774,
+ 7467, 10349, 12132,
+ 7467, 10657, 8774,
+ 7469, 5758,
+ 7551, 601, 5876,
+ 7551, 601, 5877, 6121, 10666,
+ 7551, 601, 5877, 6377, 7551, 4117, 5876,
+ 7551, 4117, 5876,
+ 7551, 4117, 5877, 6121, 9546,
+ 7551, 4849, 5876,
+ 7551, 11765, 6435, 6377, 11097, 6434,
+ 7579, 721, 11466,
+ 7588,
+ 7593, 175, 3992,
+ 7593, 2857, 6121, 10666,
+ 7593, 4223, 5836,
+ 7593, 4849, 6627, 9050,
+ 7593, 4849, 10637, 7533, 9050,
+ 7593, 4849, 12114,
+ 7593, 5445, 5758,
+ 7593, 6610,
+ 7593, 6616,
+ 7593, 7443, 6627, 9050,
+ 7593, 7443, 10637, 7533, 9050,
+ 7593, 7443, 12114,
+ 7593, 7453, 9513, 2170,
+ 7593, 7453, 9513, 2171, 9344,
+ 7593, 7453, 9513, 2171, 10624,
+ 7593, 7453, 9513, 2540,
+ 7593, 7453, 9513, 2670,
+ 7593, 7453, 9513, 2778,
+ 7593, 7453, 9513, 4200,
+ 7593, 7453, 9513, 4201, 9344,
+ 7593, 7453, 9513, 4214,
+ 7593, 7453, 9513, 5190,
+ 7593, 7453, 9513, 6722,
+ 7593, 7453, 9513, 6784,
+ 7593, 7453, 9513, 7508,
+ 7593, 7453, 9513, 7694,
+ 7593, 7453, 9513, 8162,
+ 7593, 7453, 9513, 8874,
+ 7593, 7708,
+ 7593, 8129, 5758,
+ 7593, 8167, 5758,
+ 7593, 8525, 5758,
+ 7593, 9263, 428,
+ 7593, 9263, 429, 6121, 9546,
+ 7593, 9263, 429, 6121, 10677, 761, 91, 1109, 429, 11649, 8758,
+ 7593, 9581, 5758,
+ 7593, 9633, 9718,
+ 7593, 9898,
+ 7593, 9959, 89, 8466,
+ 7593, 9959, 6121, 9546,
+ 7593, 9959, 6121, 10677, 761, 91, 1109, 429, 11649, 8758,
+ 7593, 10469, 4926,
+ 7593, 10708,
+ 7593, 11099, 5758,
+ 7593, 11224,
+ 7593, 11451, 90,
+ 7593, 12017, 4926,
+ 7593, 12043, 6616,
+ 7593, 12473, 5758,
+ 7593, 12478,
+ 7595, 9610,
+ 7598,
+ 7605, 11201, 10782,
+ 7607, 4153, 6434,
+ 7607, 4153, 6435, 569, 8076,
+ 7607, 4153, 6435, 721, 7607, 6113, 6434,
+ 7607, 4153, 6435, 6121, 4530,
+ 7607, 4153, 6435, 9967, 7271, 4153, 6434,
+ 7607, 4153, 6505, 6434,
+ 7607, 4153, 7821, 6434,
+ 7607, 4153, 8153, 6434,
+ 7607, 6113, 6434,
+ 7607, 6113, 6435, 721, 7271, 6113, 6434,
+ 7607, 6113, 6435, 6121, 4530,
+ 7607, 6113, 6505, 6434,
+ 7607, 6113, 7821, 6434,
+ 7607, 6113, 8153, 6434,
+ 7608,
+ 7619, 6505, 11765, 6434,
+ 7627, 429, 8298,
+ 7627, 429, 11886,
+ 7659, 3992,
+ 7665, 89, 6377, 5758,
+ 7665, 93, 8399, 4926,
+ 7665, 436,
+ 7665, 973, 5758,
+ 7665, 5759, 8916,
+ 7665, 5759, 9824,
+ 7665, 5759, 9870,
+ 7665, 6197, 5758,
+ 7665, 6673, 5758,
+ 7665, 6689, 2170,
+ 7665, 6689, 2540,
+ 7665, 6689, 2778,
+ 7665, 6689, 4200,
+ 7665, 6689, 4214,
+ 7665, 6689, 5190,
+ 7665, 6689, 6260,
+ 7665, 6689, 6722,
+ 7665, 6689, 7508,
+ 7665, 6689, 7694,
+ 7665, 7183, 5758,
+ 7665, 7469, 5758,
+ 7665, 7803, 5759, 8,
+ 7665, 7803, 5759, 16,
+ 7665, 7803, 5759, 28,
+ 7665, 7803, 5759, 40,
+ 7665, 7803, 5759, 58,
+ 7665, 7803, 5759, 72,
+ 7665, 7803, 5759, 92,
+ 7665, 7803, 5759, 162,
+ 7665, 7803, 5759, 266,
+ 7665, 7803, 5759, 440,
+ 7665, 7803, 5759, 606,
+ 7665, 8081, 5758,
+ 7665, 8405, 0,
+ 7665, 8405, 8,
+ 7665, 8405, 16,
+ 7665, 8405, 28,
+ 7665, 8405, 40,
+ 7665, 8405, 58,
+ 7665, 8405, 72,
+ 7665, 8405, 92,
+ 7665, 8405, 116,
+ 7665, 8405, 162,
+ 7665, 8405, 236,
+ 7665, 8405, 266,
+ 7665, 8405, 292,
+ 7665, 8405, 306,
+ 7665, 8405, 332,
+ 7665, 8405, 364,
+ 7665, 8405, 392,
+ 7665, 8405, 440,
+ 7665, 8405, 462,
+ 7665, 8405, 510,
+ 7665, 8405, 524,
+ 7665, 8405, 556,
+ 7665, 8405, 606,
+ 7665, 8405, 610,
+ 7665, 8405, 652,
+ 7665, 8405, 1796,
+ 7665, 8405, 2030,
+ 7665, 8405, 2076,
+ 7665, 8405, 2126,
+ 7665, 8405, 2438,
+ 7665, 8405, 2516,
+ 7665, 8405, 2566,
+ 7665, 8405, 2746,
+ 7665, 8405, 4888,
+ 7665, 8405, 5234,
+ 7665, 8525, 2171, 9344,
+ 7665, 8525, 2171, 10624,
+ 7665, 8525, 2670,
+ 7665, 8525, 5758,
+ 7681, 4103, 2091, 6764,
+ 7681, 8174,
+ 7695, 1045, 12132,
+ 7695, 11097, 7944,
+ 7695, 11765, 7944,
+ 7695, 11913, 8167, 7570,
+ 7695, 11943, 6408,
+ 7707, 11861, 11242,
+ 7708,
+ 7709, 6121, 1045, 6376,
+ 7709, 6121, 1045, 6490,
+ 7709, 6121, 5551, 6376,
+ 7709, 10374,
+ 7709, 10375, 6121, 1045, 6376,
+ 7709, 10375, 6121, 8649, 4112,
+ 7709, 10375, 6377, 11097, 6434,
+ 7709, 10375, 6377, 11765, 6434,
+ 7711, 6121, 4849, 4389, 6504,
+ 7711, 6121, 7443, 4389, 6504,
+ 7729, 8654,
+ 7733, 4927, 5758,
+ 7768,
+ 7769, 6121, 7173, 5758,
+ 7769, 6121, 9437, 444,
+ 7769, 6121, 9546,
+ 7769, 6377, 761, 6377, 12492,
+ 7769, 6377, 12492,
+ 7769, 7991, 721, 8329, 6121, 7768,
+ 7773, 2171, 8159, 6510,
+ 7773, 4389, 6510,
+ 7773, 4389, 8056,
+ 7773, 4389, 9367, 7821, 8056,
+ 7773, 4849, 445, 7121, 7443, 6627, 9051, 9664,
+ 7773, 4849, 8077, 6121, 1044,
+ 7773, 4849, 10465, 9947, 730,
+ 7773, 4849, 10642,
+ 7773, 6507, 10502,
+ 7773, 7443, 445, 7121, 4849, 6627, 9051, 9664,
+ 7773, 7443, 8570,
+ 7773, 7443, 10465, 9947, 730,
+ 7773, 7443, 10513, 7821, 8744,
+ 7773, 7443, 10642,
+ 7773, 7443, 12933, 7821, 8744,
+ 7794,
+ 7798,
+ 7810,
+ 7819, 429, 8112,
+ 7821, 601, 10441, 6992,
+ 7821, 2048,
+ 7821, 2587, 6121, 5528,
+ 7821, 3949, 5842,
+ 7821, 4117, 10441, 6992,
+ 7821, 4202,
+ 7821, 4215, 9601, 5830,
+ 7821, 4849, 10441, 6992,
+ 7821, 5830,
+ 7821, 6081, 7593, 8744,
+ 7821, 6571, 4760,
+ 7821, 6571, 5404,
+ 7821, 6571, 5564,
+ 7821, 6571, 7410,
+ 7821, 6571, 7996,
+ 7821, 6571, 8368,
+ 7821, 6907, 5842,
+ 7821, 7085, 8744,
+ 7821, 7443, 10441, 6992,
+ 7821, 7547, 7370,
+ 7821, 7593, 5830,
+ 7821, 7593, 8744,
+ 7821, 7593, 9438,
+ 7821, 7611, 5842,
+ 7821, 8022,
+ 7821, 8056,
+ 7821, 8057, 6121, 1045, 7442,
+ 7821, 8057, 6121, 2779, 4112,
+ 7821, 8057, 6121, 4117, 6434,
+ 7821, 8057, 6121, 7121, 4849, 10464,
+ 7821, 8057, 6121, 7121, 7443, 10464,
+ 7821, 8057, 6121, 7773, 4849, 10464,
+ 7821, 8057, 6121, 7773, 7443, 10464,
+ 7821, 8463, 5830,
+ 7821, 8463, 7593, 8744,
+ 7821, 8463, 8744,
+ 7821, 8463, 9158,
+ 7821, 8463, 9438,
+ 7821, 8691, 1044,
+ 7821, 8744,
+ 7821, 8745, 6121, 7121, 4849, 10464,
+ 7821, 8745, 6121, 7121, 7443, 10464,
+ 7821, 8745, 6121, 7773, 4849, 10464,
+ 7821, 8745, 6121, 7773, 7443, 10464,
+ 7821, 8745, 6121, 8037, 10677, 4876,
+ 7821, 8745, 6121, 9645, 9118,
+ 7821, 8745, 6121, 10677, 10739, 4876,
+ 7821, 8745, 6121, 11097, 5934,
+ 7821, 8745, 6121, 11765, 5934,
+ 7821, 8745, 11461, 6505, 7593, 8744,
+ 7821, 9158,
+ 7821, 9159, 5842,
+ 7821, 9159, 6121, 9079, 1044,
+ 7821, 9159, 11461, 6505, 7593, 9158,
+ 7821, 9338,
+ 7821, 9711, 4178,
+ 7821, 10143, 1860,
+ 7821, 10143, 4760,
+ 7821, 10194,
+ 7821, 10209, 4178,
+ 7821, 10420,
+ 7821, 10502,
+ 7821, 10643, 11461, 7593, 7821, 10642,
+ 7821, 10677, 760,
+ 7821, 10677, 9264,
+ 7821, 10677, 11202,
+ 7821, 11036,
+ 7821, 11202,
+ 7821, 11354,
+ 7821, 11364,
+ 7821, 11649, 9264,
+ 7821, 12383, 7593, 10642,
+ 7821, 12383, 10642,
+ 7821, 12383, 10643, 6121, 1044,
+ 7821, 12917, 9158,
+ 7821, 12917, 9159, 6121, 11097, 5934,
+ 7821, 12917, 9159, 6121, 11765, 5934,
+ 7821, 12931, 7593, 10642,
+ 7821, 12931, 10642,
+ 7821, 12967, 7593, 10642,
+ 7821, 12967, 9602,
+ 7821, 12967, 10642,
+ 7821, 12984,
+ 7821, 13067, 7593, 10642,
+ 7821, 13067, 9602,
+ 7821, 13067, 10420,
+ 7821, 13067, 10642,
+ 7911, 1049, 9467, 6791, 9748,
+ 7911, 6129, 11229, 1044,
+ 7911, 6129, 11229, 4876,
+ 7911, 6569, 4926,
+ 7911, 8423, 9467, 6791, 9748,
+ 7911, 8525, 2170,
+ 7911, 8525, 2171, 9344,
+ 7911, 8525, 2171, 10624,
+ 7911, 8525, 2540,
+ 7911, 8525, 2541, 9344,
+ 7911, 8525, 2541, 10624,
+ 7911, 8525, 2670,
+ 7911, 8525, 2671, 10624,
+ 7911, 8525, 2778,
+ 7911, 8525, 2779, 9344,
+ 7911, 8525, 2779, 10624,
+ 7911, 8525, 4200,
+ 7911, 8525, 4201, 9344,
+ 7911, 8525, 4201, 10624,
+ 7911, 8525, 4214,
+ 7911, 8525, 4215, 9344,
+ 7911, 8525, 4215, 10624,
+ 7911, 8525, 5190,
+ 7911, 8525, 5191, 9344,
+ 7911, 8525, 5191, 10624,
+ 7911, 8525, 6722,
+ 7911, 8525, 6723, 9344,
+ 7911, 8525, 6723, 10624,
+ 7911, 8525, 6784,
+ 7911, 8525, 6785, 10624,
+ 7911, 8525, 6804,
+ 7911, 8525, 6805, 10624,
+ 7911, 8525, 7508,
+ 7911, 8525, 7509, 9344,
+ 7911, 8525, 7509, 10624,
+ 7911, 8525, 7576,
+ 7911, 8525, 7577, 10624,
+ 7911, 8525, 7694,
+ 7911, 8525, 7695, 9344,
+ 7911, 8525, 7695, 10624,
+ 7911, 8525, 8160,
+ 7911, 8525, 8161, 10624,
+ 7911, 8525, 8514,
+ 7911, 8525, 8515, 10624,
+ 7911, 8525, 8820,
+ 7911, 8525, 8821, 10624,
+ 7911, 8525, 8876,
+ 7911, 8525, 8877, 10624,
+ 7911, 8525, 9672,
+ 7911, 8525, 9673, 10624,
+ 7911, 8931, 3717, 6052,
+ 7911, 8931, 6791, 9748,
+ 7911, 8931, 7687, 9748,
+ 7911, 8931, 8233, 9748,
+ 7911, 8931, 8681, 9748,
+ 7911, 9467, 7687, 9748,
+ 7911, 9467, 8681, 9748,
+ 7919, 6741, 445, 6741, 568,
+ 7919, 6741, 568,
+ 7919, 6741, 569, 6121, 11449, 7908,
+ 7922,
+ 7931, 1109, 429, 3288,
+ 7931, 2396,
+ 7931, 3997, 11228,
+ 7931, 4201, 9601, 5830,
+ 7931, 4223, 5836,
+ 7931, 4927, 5241, 8260,
+ 7931, 5759, 5521, 8995, 3262,
+ 7931, 5759, 7176,
+ 7931, 5759, 7476,
+ 7931, 5759, 7486,
+ 7931, 5759, 7917, 9894,
+ 7931, 5759, 8715, 10708,
+ 7931, 5759, 8715, 12523, 1894,
+ 7931, 5759, 11350,
+ 7931, 5759, 12137, 7916,
+ 7931, 5759, 12159, 7917, 11396,
+ 7931, 5879, 10204,
+ 7931, 6616,
+ 7931, 6644,
+ 7931, 6645, 8461, 4212,
+ 7931, 6645, 10275, 4212,
+ 7931, 6731, 8037, 1809, 5836,
+ 7931, 6731, 8037, 4423, 5836,
+ 7931, 6772,
+ 7931, 6773, 6121, 2779, 4112,
+ 7931, 6773, 8461, 4212,
+ 7931, 6773, 10275, 4212,
+ 7931, 6895, 6376,
+ 7931, 6895, 6490,
+ 7931, 7026,
+ 7931, 7027, 8461, 4212,
+ 7931, 7027, 10275, 4212,
+ 7931, 7377, 429, 8658,
+ 7931, 7593, 1809, 4942,
+ 7931, 7593, 1809, 5648,
+ 7931, 7593, 2918,
+ 7931, 7593, 3052,
+ 7931, 7593, 4423, 1739, 3244,
+ 7931, 7593, 4423, 2640,
+ 7931, 7593, 4423, 3052,
+ 7931, 7593, 4423, 4630,
+ 7931, 7593, 4423, 4943, 9363, 4212,
+ 7931, 7593, 4423, 4943, 10275, 4212,
+ 7931, 7593, 4423, 5240,
+ 7931, 7593, 4423, 5648,
+ 7931, 7593, 4423, 6254,
+ 7931, 7593, 4423, 7124,
+ 7931, 7593, 4423, 7695, 4112,
+ 7931, 7593, 4423, 9185, 4399, 429, 4736,
+ 7931, 7593, 4423, 9645, 6260,
+ 7931, 7593, 4423, 9807, 12139, 6260,
+ 7931, 7593, 4423, 10301, 2285, 6121, 1739, 6121, 3245, 9448,
+ 7931, 7593, 4423, 10301, 2485, 6121, 1739, 6121, 3245, 9448,
+ 7931, 7593, 4423, 10301, 3245, 6121, 1739, 6121, 3052,
+ 7931, 7593, 6644,
+ 7931, 7593, 6772,
+ 7931, 7593, 7026,
+ 7931, 7633, 429, 2451, 173, 4424,
+ 7931, 7650,
+ 7931, 7651, 8461, 4212,
+ 7931, 7651, 10275, 4212,
+ 7931, 7803, 5759, 1045, 6490,
+ 7931, 7803, 5759, 7593, 43, 6376,
+ 7931, 7803, 5759, 10267, 7593, 43, 6376,
+ 7931, 8405, 8,
+ 7931, 8405, 9, 6789, 4212,
+ 7931, 8405, 9, 8461, 4212,
+ 7931, 8405, 9, 9363, 4212,
+ 7931, 8405, 9, 10275, 4212,
+ 7931, 8405, 40,
+ 7931, 8405, 41, 6121, 6895, 6376,
+ 7931, 8405, 41, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 41, 6789, 4212,
+ 7931, 8405, 41, 10275, 4212,
+ 7931, 8405, 66,
+ 7931, 8405, 400,
+ 7931, 8405, 401, 6789, 4212,
+ 7931, 8405, 401, 8461, 4212,
+ 7931, 8405, 401, 9363, 4212,
+ 7931, 8405, 401, 10275, 4212,
+ 7931, 8405, 426,
+ 7931, 8405, 427, 6789, 4212,
+ 7931, 8405, 427, 10275, 4212,
+ 7931, 8405, 612,
+ 7931, 8405, 613, 6789, 4212,
+ 7931, 8405, 613, 10275, 4212,
+ 7931, 8405, 664,
+ 7931, 8405, 665, 6789, 4212,
+ 7931, 8405, 665, 10275, 4212,
+ 7931, 8405, 710,
+ 7931, 8405, 711, 6121, 2779, 4113, 6376,
+ 7931, 8405, 711, 6121, 2779, 4113, 11877, 6376,
+ 7931, 8405, 711, 6121, 7695, 4113, 6376,
+ 7931, 8405, 711, 6121, 7695, 4113, 10441, 10959, 6376,
+ 7931, 8405, 711, 6789, 4212,
+ 7931, 8405, 711, 8461, 4212,
+ 7931, 8405, 711, 9363, 4212,
+ 7931, 8405, 711, 10275, 4212,
+ 7931, 8405, 780,
+ 7931, 8405, 781, 6121, 1045, 6491, 721, 7695, 4113, 6376,
+ 7931, 8405, 781, 6121, 2779, 4113, 6491, 721, 1045, 6376,
+ 7931, 8405, 781, 6121, 7593, 42,
+ 7931, 8405, 781, 6121, 7695, 4113, 10441, 9811, 6490,
+ 7931, 8405, 781, 6121, 7695, 4113, 10441, 9811, 6491, 721, 2779, 4113, 6376,
+ 7931, 8405, 781, 6121, 7695, 4113, 12477, 6490,
+ 7931, 8405, 781, 6121, 10267, 7593, 43, 6490,
+ 7931, 8405, 781, 6789, 4212,
+ 7931, 8405, 781, 8461, 4212,
+ 7931, 8405, 781, 9363, 4212,
+ 7931, 8405, 781, 10275, 4212,
+ 7931, 8405, 956,
+ 7931, 8405, 957, 6121, 1045, 6490,
+ 7931, 8405, 957, 6789, 4212,
+ 7931, 8405, 957, 8461, 4212,
+ 7931, 8405, 957, 9363, 4212,
+ 7931, 8405, 957, 10275, 4212,
+ 7931, 8405, 960,
+ 7931, 8405, 961, 6121, 1045, 6490,
+ 7931, 8405, 961, 6121, 1045, 6491, 721, 7593, 2640,
+ 7931, 8405, 961, 6121, 2779, 4113, 11877, 6491, 721, 7593, 2640,
+ 7931, 8405, 961, 6121, 4215, 4113, 6376,
+ 7931, 8405, 961, 6121, 5550,
+ 7931, 8405, 961, 6121, 7695, 4113, 6377, 10958,
+ 7931, 8405, 961, 6121, 10267, 42,
+ 7931, 8405, 961, 6121, 10267, 7593, 43, 6490,
+ 7931, 8405, 961, 6789, 4212,
+ 7931, 8405, 961, 10275, 4212,
+ 7931, 8405, 1056,
+ 7931, 8405, 1057, 6789, 4212,
+ 7931, 8405, 1057, 10275, 4212,
+ 7931, 8405, 1152,
+ 7931, 8405, 1153, 6121, 1045, 6490,
+ 7931, 8405, 1153, 6121, 1045, 7189, 6490,
+ 7931, 8405, 1153, 6121, 2779, 4113, 6490,
+ 7931, 8405, 1153, 6121, 7695, 4113, 6490,
+ 7931, 8405, 1153, 6121, 7695, 4113, 10441, 9811, 6490,
+ 7931, 8405, 1153, 6789, 4212,
+ 7931, 8405, 1153, 8461, 4212,
+ 7931, 8405, 1153, 9363, 4212,
+ 7931, 8405, 1153, 10275, 4212,
+ 7931, 8405, 1208,
+ 7931, 8405, 1209, 6121, 2779, 4113, 6490,
+ 7931, 8405, 1209, 6121, 5550,
+ 7931, 8405, 1209, 6121, 7695, 4113, 6376,
+ 7931, 8405, 1209, 6789, 4212,
+ 7931, 8405, 1209, 8461, 4212,
+ 7931, 8405, 1209, 9363, 4212,
+ 7931, 8405, 1209, 10275, 4212,
+ 7931, 8405, 1342,
+ 7931, 8405, 1343, 6121, 2779, 4113, 6376,
+ 7931, 8405, 1343, 6121, 2779, 4113, 10677, 6376,
+ 7931, 8405, 1343, 6121, 6895, 6376,
+ 7931, 8405, 1343, 6121, 7593, 7931, 8405, 2641, 721, 2779, 4112,
+ 7931, 8405, 1343, 6121, 7593, 7931, 8405, 2641, 6376,
+ 7931, 8405, 1343, 6121, 7593, 7931, 8405, 2641, 6490,
+ 7931, 8405, 1343, 6121, 7695, 4113, 6376,
+ 7931, 8405, 1343, 6121, 7695, 4113, 10441, 9811, 6490,
+ 7931, 8405, 1343, 6121, 10173, 12403, 6689, 4215, 6490,
+ 7931, 8405, 1343, 6789, 4212,
+ 7931, 8405, 1343, 8461, 4212,
+ 7931, 8405, 1343, 9363, 4212,
+ 7931, 8405, 1343, 10275, 4212,
+ 7931, 8405, 1358,
+ 7931, 8405, 1359, 4340,
+ 7931, 8405, 1359, 4341, 6121, 6895, 6376,
+ 7931, 8405, 1359, 4341, 6789, 4212,
+ 7931, 8405, 1359, 4341, 8461, 4212,
+ 7931, 8405, 1359, 4341, 9363, 4212,
+ 7931, 8405, 1359, 4341, 10275, 4212,
+ 7931, 8405, 1359, 6121, 3053, 6376,
+ 7931, 8405, 1359, 6121, 3053, 6377, 6789, 4212,
+ 7931, 8405, 1359, 6121, 3053, 6377, 10275, 4212,
+ 7931, 8405, 1359, 6121, 10267, 42,
+ 7931, 8405, 1359, 6789, 4212,
+ 7931, 8405, 1359, 8461, 4212,
+ 7931, 8405, 1359, 9363, 4212,
+ 7931, 8405, 1359, 10275, 4212,
+ 7931, 8405, 1359, 11948,
+ 7931, 8405, 1359, 11949, 6789, 4212,
+ 7931, 8405, 1359, 11949, 8461, 4212,
+ 7931, 8405, 1359, 11949, 9363, 4212,
+ 7931, 8405, 1359, 11949, 10275, 4212,
+ 7931, 8405, 1508,
+ 7931, 8405, 1509, 6789, 4212,
+ 7931, 8405, 1509, 10275, 4212,
+ 7931, 8405, 1578,
+ 7931, 8405, 1579, 6121, 1045, 6376,
+ 7931, 8405, 1579, 6121, 2779, 4113, 6376,
+ 7931, 8405, 1579, 6121, 5550,
+ 7931, 8405, 1579, 6121, 7695, 4113, 6490,
+ 7931, 8405, 1579, 6789, 4212,
+ 7931, 8405, 1579, 8461, 4212,
+ 7931, 8405, 1579, 9363, 4212,
+ 7931, 8405, 1579, 10275, 4212,
+ 7931, 8405, 1738,
+ 7931, 8405, 1739, 6121, 760,
+ 7931, 8405, 1739, 6121, 1045, 6376,
+ 7931, 8405, 1739, 6121, 7593, 42,
+ 7931, 8405, 1739, 6121, 7695, 4113, 6376,
+ 7931, 8405, 1739, 6121, 7695, 4113, 6490,
+ 7931, 8405, 1739, 6789, 4212,
+ 7931, 8405, 1739, 8461, 4212,
+ 7931, 8405, 1739, 9363, 4212,
+ 7931, 8405, 1739, 10275, 4212,
+ 7931, 8405, 2206,
+ 7931, 8405, 2207, 6789, 4212,
+ 7931, 8405, 2207, 8461, 4212,
+ 7931, 8405, 2207, 9363, 4212,
+ 7931, 8405, 2207, 10275, 4212,
+ 7931, 8405, 2284,
+ 7931, 8405, 2285, 6121, 1045, 6376,
+ 7931, 8405, 2285, 6121, 7695, 4113, 6376,
+ 7931, 8405, 2285, 6789, 4212,
+ 7931, 8405, 2285, 8461, 4212,
+ 7931, 8405, 2285, 9363, 4212,
+ 7931, 8405, 2285, 10275, 4212,
+ 7931, 8405, 2404,
+ 7931, 8405, 2405, 6121, 1045, 6490,
+ 7931, 8405, 2405, 6121, 1045, 6491, 721, 1045, 6376,
+ 7931, 8405, 2405, 6121, 2779, 4113, 6376,
+ 7931, 8405, 2405, 6121, 2779, 4113, 11877, 6376,
+ 7931, 8405, 2405, 6121, 4215, 4113, 6376,
+ 7931, 8405, 2405, 6121, 5550,
+ 7931, 8405, 2405, 6121, 6895, 6376,
+ 7931, 8405, 2405, 6121, 7593, 42,
+ 7931, 8405, 2405, 6121, 7593, 43, 6490,
+ 7931, 8405, 2405, 6121, 7593, 7931, 8405, 2641, 721, 2779, 4112,
+ 7931, 8405, 2405, 6121, 8758,
+ 7931, 8405, 2405, 6121, 10267, 42,
+ 7931, 8405, 2405, 6789, 4212,
+ 7931, 8405, 2405, 10275, 4212,
+ 7931, 8405, 2484,
+ 7931, 8405, 2485, 6121, 2779, 4113, 6490,
+ 7931, 8405, 2485, 6121, 7695, 4113, 6376,
+ 7931, 8405, 2485, 6789, 4212,
+ 7931, 8405, 2485, 8461, 4212,
+ 7931, 8405, 2485, 9363, 4212,
+ 7931, 8405, 2485, 10275, 4212,
+ 7931, 8405, 2640,
+ 7931, 8405, 2641, 6121, 7695, 4113, 6376,
+ 7931, 8405, 2641, 6789, 4212,
+ 7931, 8405, 2641, 8461, 4212,
+ 7931, 8405, 2641, 9363, 4212,
+ 7931, 8405, 2641, 10275, 4212,
+ 7931, 8405, 2668,
+ 7931, 8405, 2669, 6121, 5550,
+ 7931, 8405, 2669, 6121, 7695, 4113, 6377, 10958,
+ 7931, 8405, 2669, 6789, 4212,
+ 7931, 8405, 2669, 8461, 4212,
+ 7931, 8405, 2669, 9363, 4212,
+ 7931, 8405, 2669, 9456,
+ 7931, 8405, 2669, 9457, 4340,
+ 7931, 8405, 2669, 9457, 6789, 4212,
+ 7931, 8405, 2669, 9457, 10275, 4212,
+ 7931, 8405, 2669, 10275, 4212,
+ 7931, 8405, 2858,
+ 7931, 8405, 2859, 6789, 4212,
+ 7931, 8405, 2859, 8461, 4212,
+ 7931, 8405, 2859, 9363, 4212,
+ 7931, 8405, 2859, 10275, 4212,
+ 7931, 8405, 2918,
+ 7931, 8405, 2919, 6121, 1045, 6376,
+ 7931, 8405, 2919, 6121, 2779, 4113, 6376,
+ 7931, 8405, 2919, 6121, 5550,
+ 7931, 8405, 2919, 6121, 6895, 6376,
+ 7931, 8405, 2919, 6121, 6895, 6377, 6789, 4212,
+ 7931, 8405, 2919, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 2919, 6121, 10173, 12403, 6689, 2779, 6376,
+ 7931, 8405, 2919, 6121, 10173, 12403, 6689, 7695, 6376,
+ 7931, 8405, 2919, 6789, 4212,
+ 7931, 8405, 2919, 10275, 4212,
+ 7931, 8405, 3052,
+ 7931, 8405, 3053, 6121, 5878,
+ 7931, 8405, 3053, 6121, 6895, 6376,
+ 7931, 8405, 3053, 6121, 6895, 6377, 6789, 4212,
+ 7931, 8405, 3053, 6121, 6895, 6377, 8461, 4212,
+ 7931, 8405, 3053, 6121, 6895, 6377, 9363, 4212,
+ 7931, 8405, 3053, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 3053, 6121, 7593, 42,
+ 7931, 8405, 3053, 6121, 7695, 4113, 6490,
+ 7931, 8405, 3053, 6789, 4212,
+ 7931, 8405, 3053, 7982,
+ 7931, 8405, 3053, 7983, 6121, 6895, 6376,
+ 7931, 8405, 3053, 7983, 6121, 6895, 6377, 6789, 4212,
+ 7931, 8405, 3053, 7983, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 3053, 7983, 6121, 10173, 12403, 6689, 2779, 6376,
+ 7931, 8405, 3053, 7983, 6121, 10173, 12403, 6689, 7695, 6376,
+ 7931, 8405, 3053, 7983, 6789, 4212,
+ 7931, 8405, 3053, 7983, 10275, 4212,
+ 7931, 8405, 3053, 8461, 4212,
+ 7931, 8405, 3053, 9363, 4212,
+ 7931, 8405, 3053, 10275, 4212,
+ 7931, 8405, 3124,
+ 7931, 8405, 3125, 6789, 4212,
+ 7931, 8405, 3125, 8461, 4212,
+ 7931, 8405, 3125, 9363, 4212,
+ 7931, 8405, 3125, 10275, 4212,
+ 7931, 8405, 3244,
+ 7931, 8405, 3245, 6121, 6107, 6895, 6376,
+ 7931, 8405, 3245, 6121, 6107, 6895, 6490,
+ 7931, 8405, 3245, 6121, 6895, 6376,
+ 7931, 8405, 3245, 6121, 6895, 6377, 6789, 4212,
+ 7931, 8405, 3245, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 3245, 6121, 6895, 6490,
+ 7931, 8405, 3245, 6121, 6895, 6491, 6789, 4212,
+ 7931, 8405, 3245, 6121, 6895, 6491, 10275, 4212,
+ 7931, 8405, 3245, 6121, 7125, 6376,
+ 7931, 8405, 3245, 6121, 7125, 6377, 6789, 4212,
+ 7931, 8405, 3245, 6121, 7125, 6377, 10275, 4212,
+ 7931, 8405, 3245, 6121, 10173, 12403, 6689, 2779, 6376,
+ 7931, 8405, 3245, 6121, 10173, 12403, 6689, 7695, 6376,
+ 7931, 8405, 3245, 6789, 4212,
+ 7931, 8405, 3245, 7808,
+ 7931, 8405, 3245, 7809, 6789, 4212,
+ 7931, 8405, 3245, 7809, 10275, 4212,
+ 7931, 8405, 3245, 9448,
+ 7931, 8405, 3245, 9449, 6789, 4212,
+ 7931, 8405, 3245, 9449, 10275, 4212,
+ 7931, 8405, 3245, 10275, 4212,
+ 7931, 8405, 3766,
+ 7931, 8405, 3767, 6789, 4212,
+ 7931, 8405, 3767, 8461, 4212,
+ 7931, 8405, 3767, 9363, 4212,
+ 7931, 8405, 3767, 10275, 4212,
+ 7931, 8405, 4000,
+ 7931, 8405, 4001, 6789, 4212,
+ 7931, 8405, 4001, 10275, 4212,
+ 7931, 8405, 4136,
+ 7931, 8405, 4137, 6789, 4212,
+ 7931, 8405, 4137, 8461, 4212,
+ 7931, 8405, 4137, 9363, 4212,
+ 7931, 8405, 4137, 10275, 4212,
+ 7931, 8405, 4356,
+ 7931, 8405, 4357, 6789, 4212,
+ 7931, 8405, 4357, 8461, 4212,
+ 7931, 8405, 4357, 9363, 4212,
+ 7931, 8405, 4357, 10275, 4212,
+ 7931, 8405, 4423, 6894,
+ 7931, 8405, 4423, 6895, 2918,
+ 7931, 8405, 4423, 6895, 3052,
+ 7931, 8405, 4423, 6895, 3244,
+ 7931, 8405, 4630,
+ 7931, 8405, 4631, 6789, 4212,
+ 7931, 8405, 4631, 8461, 4212,
+ 7931, 8405, 4631, 9363, 4212,
+ 7931, 8405, 4631, 10275, 4212,
+ 7931, 8405, 4736,
+ 7931, 8405, 4737, 6789, 4212,
+ 7931, 8405, 4737, 8461, 4212,
+ 7931, 8405, 4737, 9363, 4212,
+ 7931, 8405, 4737, 10275, 4212,
+ 7931, 8405, 4942,
+ 7931, 8405, 4943, 6121, 1045, 6376,
+ 7931, 8405, 4943, 6121, 1045, 6490,
+ 7931, 8405, 4943, 6789, 4212,
+ 7931, 8405, 4943, 8461, 4212,
+ 7931, 8405, 4943, 9363, 4212,
+ 7931, 8405, 4943, 10275, 4212,
+ 7931, 8405, 5240,
+ 7931, 8405, 5241, 6121, 1045, 6490,
+ 7931, 8405, 5241, 6121, 2779, 4113, 6490,
+ 7931, 8405, 5241, 6121, 5550,
+ 7931, 8405, 5241, 6121, 7593, 42,
+ 7931, 8405, 5241, 6121, 7593, 2640,
+ 7931, 8405, 5241, 6121, 7695, 4113, 6376,
+ 7931, 8405, 5241, 6789, 4212,
+ 7931, 8405, 5241, 8260,
+ 7931, 8405, 5241, 8261, 6789, 4212,
+ 7931, 8405, 5241, 8261, 10275, 4212,
+ 7931, 8405, 5241, 8461, 4212,
+ 7931, 8405, 5241, 9363, 4212,
+ 7931, 8405, 5241, 10275, 4212,
+ 7931, 8405, 5298,
+ 7931, 8405, 5299, 6789, 4212,
+ 7931, 8405, 5299, 8461, 4212,
+ 7931, 8405, 5299, 9363, 4212,
+ 7931, 8405, 5299, 10275, 4212,
+ 7931, 8405, 5572,
+ 7931, 8405, 5573, 6789, 4212,
+ 7931, 8405, 5573, 10275, 4212,
+ 7931, 8405, 5648,
+ 7931, 8405, 5649, 6121, 1045, 6491, 721, 1045, 6376,
+ 7931, 8405, 5649, 6121, 2779, 4113, 11877, 6376,
+ 7931, 8405, 5649, 6121, 4215, 4113, 6376,
+ 7931, 8405, 5649, 6121, 7593, 7931, 8405, 2641, 721, 2779, 4112,
+ 7931, 8405, 5649, 6121, 7695, 4113, 6490,
+ 7931, 8405, 5649, 6121, 7695, 4113, 6491, 721, 7695, 4113, 6376,
+ 7931, 8405, 5649, 6121, 10173, 12403, 6689, 4215, 6376,
+ 7931, 8405, 5649, 6121, 10267, 42,
+ 7931, 8405, 5649, 6789, 4212,
+ 7931, 8405, 5649, 8461, 4212,
+ 7931, 8405, 5649, 9363, 4212,
+ 7931, 8405, 5649, 10275, 4212,
+ 7931, 8405, 5910,
+ 7931, 8405, 5911, 6789, 4212,
+ 7931, 8405, 5911, 10275, 4212,
+ 7931, 8405, 5916,
+ 7931, 8405, 5917, 6789, 4212,
+ 7931, 8405, 5917, 8461, 4212,
+ 7931, 8405, 5917, 9363, 4212,
+ 7931, 8405, 5917, 10275, 4212,
+ 7931, 8405, 5992,
+ 7931, 8405, 5993, 6789, 4212,
+ 7931, 8405, 5993, 8461, 4212,
+ 7931, 8405, 5993, 9363, 4212,
+ 7931, 8405, 5993, 10275, 4212,
+ 7931, 8405, 6254,
+ 7931, 8405, 6255, 6789, 4212,
+ 7931, 8405, 6255, 10275, 4212,
+ 7931, 8405, 6486,
+ 7931, 8405, 6487, 6789, 4212,
+ 7931, 8405, 6487, 8461, 4212,
+ 7931, 8405, 6487, 9363, 4212,
+ 7931, 8405, 6487, 10275, 4212,
+ 7931, 8405, 6636,
+ 7931, 8405, 6637, 6789, 4212,
+ 7931, 8405, 6637, 10275, 4212,
+ 7931, 8405, 6771, 3052,
+ 7931, 8405, 6771, 3053, 6121, 2779, 4113, 6376,
+ 7931, 8405, 6771, 3053, 6121, 7695, 4113, 6376,
+ 7931, 8405, 6771, 3053, 6121, 10173, 12403, 6689, 2779, 6376,
+ 7931, 8405, 6771, 3053, 6121, 10173, 12403, 6689, 4215, 6490,
+ 7931, 8405, 6771, 3053, 6121, 10173, 12403, 6689, 7695, 6376,
+ 7931, 8405, 6771, 3053, 6121, 10267, 42,
+ 7931, 8405, 6771, 3053, 6789, 4212,
+ 7931, 8405, 6771, 3053, 8461, 4212,
+ 7931, 8405, 6771, 3053, 9363, 4212,
+ 7931, 8405, 6771, 3053, 10275, 4212,
+ 7931, 8405, 6850,
+ 7931, 8405, 6851, 6121, 1045, 6490,
+ 7931, 8405, 6851, 6789, 4212,
+ 7931, 8405, 6851, 8461, 4212,
+ 7931, 8405, 6851, 9363, 4212,
+ 7931, 8405, 6851, 10275, 4212,
+ 7931, 8405, 6894,
+ 7931, 8405, 6895, 10275, 4212,
+ 7931, 8405, 7036,
+ 7931, 8405, 7037, 6121, 1045, 6376,
+ 7931, 8405, 7037, 6121, 2779, 4113, 6376,
+ 7931, 8405, 7037, 6121, 7695, 4113, 6376,
+ 7931, 8405, 7037, 6121, 7695, 4113, 6490,
+ 7931, 8405, 7037, 6121, 7695, 4113, 10441, 9811, 6490,
+ 7931, 8405, 7037, 6789, 4212,
+ 7931, 8405, 7037, 8461, 4212,
+ 7931, 8405, 7037, 9363, 4212,
+ 7931, 8405, 7037, 10275, 4212,
+ 7931, 8405, 7238,
+ 7931, 8405, 7239, 6789, 4212,
+ 7931, 8405, 7239, 8461, 4212,
+ 7931, 8405, 7239, 9363, 4212,
+ 7931, 8405, 7239, 10275, 4212,
+ 7931, 8405, 7354,
+ 7931, 8405, 7355, 6789, 4212,
+ 7931, 8405, 7355, 8461, 4212,
+ 7931, 8405, 7355, 9363, 4212,
+ 7931, 8405, 7355, 10275, 4212,
+ 7931, 8405, 7448,
+ 7931, 8405, 7449, 6789, 4212,
+ 7931, 8405, 7449, 8461, 4212,
+ 7931, 8405, 7449, 9363, 4212,
+ 7931, 8405, 7449, 10275, 4212,
+ 7931, 8405, 7524,
+ 7931, 8405, 7525, 6121, 1045, 6490,
+ 7931, 8405, 7525, 6789, 4212,
+ 7931, 8405, 7525, 8461, 4212,
+ 7931, 8405, 7525, 9363, 4212,
+ 7931, 8405, 7525, 10275, 4212,
+ 7931, 8405, 7653, 1578,
+ 7931, 8405, 7668,
+ 7931, 8405, 7669, 6121, 1045, 6376,
+ 7931, 8405, 7669, 6789, 4212,
+ 7931, 8405, 7669, 8461, 4212,
+ 7931, 8405, 7669, 9363, 4212,
+ 7931, 8405, 7669, 10275, 4212,
+ 7931, 8405, 7672,
+ 7931, 8405, 7673, 6789, 4212,
+ 7931, 8405, 7673, 8461, 4212,
+ 7931, 8405, 7673, 9363, 4212,
+ 7931, 8405, 7673, 10275, 4212,
+ 7931, 8405, 8098,
+ 7931, 8405, 8099, 6789, 4212,
+ 7931, 8405, 8099, 10275, 4212,
+ 7931, 8405, 8860,
+ 7931, 8405, 8861, 6789, 4212,
+ 7931, 8405, 8861, 8461, 4212,
+ 7931, 8405, 8861, 9363, 4212,
+ 7931, 8405, 8861, 10275, 4212,
+ 7931, 8405, 8895, 8345, 9405, 3245, 9449, 8461, 4212,
+ 7931, 8405, 8895, 8345, 9405, 3245, 9449, 9363, 4212,
+ 7931, 8405, 9185, 780,
+ 7931, 8405, 9185, 1152,
+ 7931, 8405, 9185, 2284,
+ 7931, 8405, 9405, 426,
+ 7931, 8405, 9405, 427, 6789, 4212,
+ 7931, 8405, 9405, 427, 10275, 4212,
+ 7931, 8405, 9405, 664,
+ 7931, 8405, 9405, 665, 6789, 4212,
+ 7931, 8405, 9405, 665, 10275, 4212,
+ 7931, 8405, 9770,
+ 7931, 8405, 9771, 6789, 4212,
+ 7931, 8405, 9771, 8461, 4212,
+ 7931, 8405, 9771, 9363, 4212,
+ 7931, 8405, 9771, 10275, 4212,
+ 7931, 8405, 12355, 3244,
+ 7931, 8435, 6376,
+ 7931, 8525, 5758,
+ 7931, 8601, 7793, 5758,
+ 7931, 8692,
+ 7931, 8693, 8461, 4212,
+ 7931, 8693, 10275, 4212,
+ 7931, 8849, 1045, 12133, 4926,
+ 7931, 9151, 11228,
+ 7931, 9581, 5758,
+ 7931, 9645, 4423, 5837, 6121, 8205, 8036,
+ 7931, 9766,
+ 7931, 9767, 6121, 10175, 6376,
+ 7931, 9978,
+ 7931, 9979, 10275, 4212,
+ 7931, 10174,
+ 7931, 10175, 10275, 4212,
+ 7931, 10199, 8450,
+ 7931, 10267, 6644,
+ 7931, 10280,
+ 7931, 10281, 10275, 4212,
+ 7931, 10301, 711, 6121, 3053, 6789, 4212,
+ 7931, 10301, 711, 6121, 3053, 10275, 4212,
+ 7931, 10301, 711, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 711, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 711, 6121, 4631, 6121, 4943, 6789, 4212,
+ 7931, 10301, 711, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 711, 6121, 4631, 9363, 4212,
+ 7931, 10301, 711, 6121, 4631, 10275, 4212,
+ 7931, 10301, 711, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 711, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 711, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 711, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 711, 6121, 4943, 9363, 4212,
+ 7931, 10301, 711, 6121, 4943, 10275, 4212,
+ 7931, 10301, 781, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 781, 6121, 1343, 9363, 4212,
+ 7931, 10301, 781, 6121, 1343, 10275, 4212,
+ 7931, 10301, 781, 6121, 1359, 8461, 4212,
+ 7931, 10301, 781, 6121, 1359, 9363, 4212,
+ 7931, 10301, 781, 6121, 2405, 6789, 4212,
+ 7931, 10301, 781, 6121, 3053, 6789, 4212,
+ 7931, 10301, 781, 6121, 3053, 10275, 4212,
+ 7931, 10301, 781, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 781, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 781, 6121, 4631, 9363, 4212,
+ 7931, 10301, 781, 6121, 4631, 10275, 4212,
+ 7931, 10301, 781, 6121, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 781, 6121, 4737, 9363, 4212,
+ 7931, 10301, 781, 6121, 4737, 10275, 4212,
+ 7931, 10301, 781, 6121, 4943, 6789, 4212,
+ 7931, 10301, 781, 6121, 4943, 8461, 4212,
+ 7931, 10301, 781, 6121, 4943, 9363, 4212,
+ 7931, 10301, 781, 6121, 4943, 10275, 4212,
+ 7931, 10301, 781, 6121, 5241, 6789, 4212,
+ 7931, 10301, 781, 6121, 6255, 6789, 4212,
+ 7931, 10301, 957, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 957, 6121, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 957, 6121, 1343, 9363, 4212,
+ 7931, 10301, 957, 6121, 1343, 10275, 4212,
+ 7931, 10301, 957, 6121, 2405, 6789, 4212,
+ 7931, 10301, 957, 6121, 2405, 10275, 4212,
+ 7931, 10301, 957, 6121, 3053, 6789, 4212,
+ 7931, 10301, 957, 6121, 3053, 10275, 4212,
+ 7931, 10301, 957, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 957, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 957, 6121, 4631, 9363, 4212,
+ 7931, 10301, 957, 6121, 4631, 10275, 4212,
+ 7931, 10301, 957, 6121, 4737, 6121, 4943, 6789, 4212,
+ 7931, 10301, 957, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 957, 6121, 4737, 9363, 4212,
+ 7931, 10301, 957, 6121, 4737, 10275, 4212,
+ 7931, 10301, 957, 6121, 4943, 9363, 4212,
+ 7931, 10301, 957, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1153, 6121, 1343, 9363, 4212,
+ 7931, 10301, 1153, 6121, 1343, 10275, 4212,
+ 7931, 10301, 1153, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1153, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1153, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1153, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1153, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1153, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1153, 6121, 4737, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1153, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1153, 6121, 4737, 9363, 4212,
+ 7931, 10301, 1153, 6121, 4737, 10275, 4212,
+ 7931, 10301, 1153, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1153, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1153, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1343, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1343, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1343, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1343, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1343, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1343, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1343, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1343, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1359, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1359, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1359, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1359, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1359, 6121, 4943, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1359, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1359, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1359, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1359, 6121, 12355, 3245, 9363, 4212,
+ 7931, 10301, 1579, 6121, 1343, 9363, 4212,
+ 7931, 10301, 1579, 6121, 1343, 10275, 4212,
+ 7931, 10301, 1579, 6121, 1739, 6789, 4212,
+ 7931, 10301, 1579, 6121, 1739, 8461, 4212,
+ 7931, 10301, 1579, 6121, 1739, 9363, 4212,
+ 7931, 10301, 1579, 6121, 1739, 10275, 4212,
+ 7931, 10301, 1579, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1579, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1579, 6121, 3245, 6789, 4212,
+ 7931, 10301, 1579, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1579, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1579, 6121, 3245, 10275, 4212,
+ 7931, 10301, 1579, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1579, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1579, 6121, 4737, 9363, 4212,
+ 7931, 10301, 1579, 6121, 4737, 10275, 4212,
+ 7931, 10301, 1579, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1579, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1579, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1579, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1579, 6121, 4943, 8461, 4212,
+ 7931, 10301, 1579, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1579, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1739, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1739, 6121, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1739, 6121, 1343, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1739, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1739, 6121, 1343, 9363, 4212,
+ 7931, 10301, 1739, 6121, 1343, 10275, 4212,
+ 7931, 10301, 1739, 6121, 1359, 9363, 4212,
+ 7931, 10301, 1739, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 6895, 6377, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 6895, 6377, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 6895, 6491, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 6895, 6491, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 7125, 6377, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 7125, 6377, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 10275, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 4631, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1739, 6121, 4737, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4737, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4737, 10275, 4212,
+ 7931, 10301, 1739, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4943, 8461, 4212,
+ 7931, 10301, 1739, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2285, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2285, 6121, 1343, 10275, 4212,
+ 7931, 10301, 2285, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2285, 6121, 3053, 10275, 4212,
+ 7931, 10301, 2285, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2285, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 2285, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 2285, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2285, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2285, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 2285, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2285, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2405, 6121, 12355, 3245, 10275, 4212,
+ 7931, 10301, 2485, 6121, 1343, 6121, 1343, 6789, 4212,
+ 7931, 10301, 2485, 6121, 1343, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2485, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2485, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2485, 6121, 1343, 10275, 4212,
+ 7931, 10301, 2485, 6121, 2405, 6789, 4212,
+ 7931, 10301, 2485, 6121, 2405, 10275, 4212,
+ 7931, 10301, 2485, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2485, 6121, 3053, 10275, 4212,
+ 7931, 10301, 2485, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2485, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 2485, 6121, 4737, 9363, 4212,
+ 7931, 10301, 2485, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 2485, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2485, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2485, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2641, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2641, 6121, 1343, 10275, 4212,
+ 7931, 10301, 2641, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2641, 6121, 3053, 10275, 4212,
+ 7931, 10301, 2641, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2641, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 2641, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 2641, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2641, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2641, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2641, 6121, 4943, 8461, 4212,
+ 7931, 10301, 2641, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2641, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2669, 6121, 1343, 6121, 4631, 6789, 4212,
+ 7931, 10301, 2669, 6121, 1343, 6121, 4631, 9363, 4212,
+ 7931, 10301, 2669, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2669, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2669, 6121, 1343, 10275, 4212,
+ 7931, 10301, 2669, 6121, 1359, 8461, 4212,
+ 7931, 10301, 2669, 6121, 1359, 9363, 4212,
+ 7931, 10301, 2669, 6121, 2405, 6789, 4212,
+ 7931, 10301, 2669, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2669, 6121, 3053, 10275, 4212,
+ 7931, 10301, 2669, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2669, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 2669, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4631, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4631, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4631, 10275, 4212,
+ 7931, 10301, 2669, 6121, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4737, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4737, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4737, 10275, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 4631, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 4737, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4943, 8461, 4212,
+ 7931, 10301, 2669, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2669, 6121, 5241, 6789, 4212,
+ 7931, 10301, 2669, 6121, 6255, 6789, 4212,
+ 7931, 10301, 3053, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 1343, 9363, 4212,
+ 7931, 10301, 3053, 6121, 1343, 10275, 4212,
+ 7931, 10301, 3053, 6121, 1359, 8461, 4212,
+ 7931, 10301, 3053, 6121, 1359, 9363, 4212,
+ 7931, 10301, 3053, 6121, 2405, 6789, 4212,
+ 7931, 10301, 3053, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 3053, 10275, 4212,
+ 7931, 10301, 3053, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 3053, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 3053, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 4631, 9363, 4212,
+ 7931, 10301, 3053, 6121, 4631, 10275, 4212,
+ 7931, 10301, 3053, 6121, 4737, 9363, 4212,
+ 7931, 10301, 3053, 6121, 4737, 10275, 4212,
+ 7931, 10301, 3053, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 3053, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 3053, 6121, 4943, 6789, 4212,
+ 7931, 10301, 3053, 6121, 4943, 8461, 4212,
+ 7931, 10301, 3053, 6121, 4943, 9363, 4212,
+ 7931, 10301, 3053, 6121, 4943, 10275, 4212,
+ 7931, 10301, 3053, 6121, 5241, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6255, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 9, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 9, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 9, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 41, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 41, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 67, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 67, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 427, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 427, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 665, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 665, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 1343, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 1343, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 1359, 8461, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 1359, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 2405, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 2919, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 2919, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3053, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3245, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3245, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4631, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4631, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4737, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4943, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4943, 8461, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4943, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4943, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 5241, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 6255, 6789, 4212,
+ 7931, 10301, 3125, 6121, 4943, 8461, 4212,
+ 7931, 10301, 3125, 6121, 4943, 9363, 4212,
+ 7931, 10301, 3125, 6121, 4943, 10275, 4212,
+ 7931, 10301, 3245, 6121, 10175, 6789, 4212,
+ 7931, 10301, 3245, 6121, 10175, 10275, 4212,
+ 7931, 10301, 3245, 9449, 6121, 12355, 3245, 6789, 4212,
+ 7931, 10301, 3245, 9449, 6121, 12355, 3245, 10275, 4212,
+ 7931, 10301, 4631, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4631, 6121, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 4631, 6121, 1343, 9363, 4212,
+ 7931, 10301, 4631, 6121, 1343, 10275, 4212,
+ 7931, 10301, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4631, 6121, 3053, 10275, 4212,
+ 7931, 10301, 4631, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 4631, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 4631, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 4631, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 4631, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4631, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4631, 6121, 4943, 10275, 4212,
+ 7931, 10301, 4737, 6121, 1343, 10275, 4212,
+ 7931, 10301, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4737, 6121, 3053, 10275, 4212,
+ 7931, 10301, 4737, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 4737, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 4737, 6121, 4631, 9363, 4212,
+ 7931, 10301, 4737, 6121, 4631, 10275, 4212,
+ 7931, 10301, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4737, 6121, 4943, 10275, 4212,
+ 7931, 10301, 4943, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4943, 6121, 1343, 6121, 4631, 9363, 4212,
+ 7931, 10301, 4943, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 4943, 6121, 1343, 10275, 4212,
+ 7931, 10301, 4943, 6121, 3053, 10275, 4212,
+ 7931, 10301, 4943, 6121, 3245, 6789, 4212,
+ 7931, 10301, 4943, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 4943, 6121, 4631, 6121, 1343, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4943, 6121, 4631, 6121, 4737, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4631, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4631, 10275, 4212,
+ 7931, 10301, 4943, 6121, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4943, 6121, 4737, 6121, 4631, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4737, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4737, 10275, 4212,
+ 7931, 10301, 4943, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4943, 10275, 4212,
+ 7931, 10301, 5241, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5241, 6121, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5241, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5241, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5241, 6121, 1343, 10275, 4212,
+ 7931, 10301, 5241, 6121, 1359, 8461, 4212,
+ 7931, 10301, 5241, 6121, 1359, 9363, 4212,
+ 7931, 10301, 5241, 6121, 2405, 6789, 4212,
+ 7931, 10301, 5241, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5241, 6121, 3053, 10275, 4212,
+ 7931, 10301, 5241, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5241, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 1343, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 4943, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4631, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4631, 10275, 4212,
+ 7931, 10301, 5241, 6121, 4737, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4737, 10275, 4212,
+ 7931, 10301, 5241, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4943, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4943, 8461, 4212,
+ 7931, 10301, 5241, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4943, 10275, 4212,
+ 7931, 10301, 5241, 6121, 5241, 6789, 4212,
+ 7931, 10301, 5241, 6121, 6255, 6789, 4212,
+ 7931, 10301, 5475, 6061, 89, 9411, 5837, 5759, 10275, 4212,
+ 7931, 10301, 5649, 6121, 1343, 6121, 4631, 9363, 4212,
+ 7931, 10301, 5649, 6121, 1343, 8461, 4212,
+ 7931, 10301, 5649, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5649, 6121, 1343, 10275, 4212,
+ 7931, 10301, 5649, 6121, 1359, 8461, 4212,
+ 7931, 10301, 5649, 6121, 1359, 9363, 4212,
+ 7931, 10301, 5649, 6121, 2405, 6789, 4212,
+ 7931, 10301, 5649, 6121, 2405, 10275, 4212,
+ 7931, 10301, 5649, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5649, 6121, 3053, 10275, 4212,
+ 7931, 10301, 5649, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5649, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 5649, 6121, 4631, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4631, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4631, 8461, 4212,
+ 7931, 10301, 5649, 6121, 4631, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4631, 10275, 4212,
+ 7931, 10301, 5649, 6121, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4737, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4737, 8461, 4212,
+ 7931, 10301, 5649, 6121, 4737, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4737, 10275, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 4631, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4943, 8461, 4212,
+ 7931, 10301, 5649, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4943, 10275, 4212,
+ 7931, 10301, 5911, 6121, 12355, 3245, 10275, 4212,
+ 7931, 10301, 5917, 6121, 1359, 8461, 4212,
+ 7931, 10301, 5917, 6121, 2405, 6789, 4212,
+ 7931, 10301, 5917, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5917, 6121, 3053, 10275, 4212,
+ 7931, 10301, 5917, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5917, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 5917, 6121, 4631, 10275, 4212,
+ 7931, 10301, 5917, 6121, 4943, 6789, 4212,
+ 7931, 10301, 5917, 6121, 4943, 8461, 4212,
+ 7931, 10301, 5917, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5917, 6121, 4943, 10275, 4212,
+ 7931, 10301, 5917, 6121, 5241, 6789, 4212,
+ 7931, 10301, 5917, 6121, 6255, 6789, 4212,
+ 7931, 10301, 6393, 10275, 4212,
+ 7931, 10301, 6405, 10275, 4212,
+ 7931, 10301, 6851, 6121, 3053, 6789, 4212,
+ 7931, 10301, 6851, 6121, 3053, 10275, 4212,
+ 7931, 10301, 6851, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 6851, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 6851, 6121, 4631, 9363, 4212,
+ 7931, 10301, 6851, 6121, 4631, 10275, 4212,
+ 7931, 10301, 6851, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 6851, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 6851, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 6851, 6121, 4943, 9363, 4212,
+ 7931, 10301, 6851, 6121, 4943, 10275, 4212,
+ 7931, 10301, 7479, 10275, 4212,
+ 7931, 10301, 7481, 6061, 89, 9411, 5837, 5759, 10275, 4212,
+ 7931, 10301, 7481, 10275, 4212,
+ 7931, 10301, 7525, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 7525, 6121, 1343, 6121, 4943, 6789, 4212,
+ 7931, 10301, 7525, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 7525, 6121, 1343, 6789, 4212,
+ 7931, 10301, 7525, 6121, 1343, 8461, 4212,
+ 7931, 10301, 7525, 6121, 1343, 9363, 4212,
+ 7931, 10301, 7525, 6121, 1343, 10275, 4212,
+ 7931, 10301, 7525, 6121, 1359, 8461, 4212,
+ 7931, 10301, 7525, 6121, 1359, 9363, 4212,
+ 7931, 10301, 7525, 6121, 2405, 6789, 4212,
+ 7931, 10301, 7525, 6121, 2405, 10275, 4212,
+ 7931, 10301, 7525, 6121, 3053, 6789, 4212,
+ 7931, 10301, 7525, 6121, 3053, 10275, 4212,
+ 7931, 10301, 7525, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 7525, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 7525, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4631, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4631, 8461, 4212,
+ 7931, 10301, 7525, 6121, 4631, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4631, 10275, 4212,
+ 7931, 10301, 7525, 6121, 4737, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4737, 8461, 4212,
+ 7931, 10301, 7525, 6121, 4737, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4737, 10275, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6121, 4737, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6121, 4737, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4943, 8461, 4212,
+ 7931, 10301, 7525, 6121, 4943, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4943, 10275, 4212,
+ 7931, 10301, 7917, 10275, 4212,
+ 7931, 10301, 8635, 10275, 4212,
+ 7931, 10301, 8693, 6121, 6645, 8461, 4212,
+ 7931, 10301, 8693, 6121, 6645, 10275, 4212,
+ 7931, 10301, 8693, 6121, 6773, 8461, 4212,
+ 7931, 10301, 8693, 6121, 6773, 10275, 4212,
+ 7931, 10301, 8693, 6121, 7027, 8461, 4212,
+ 7931, 10301, 8693, 6121, 7027, 10275, 4212,
+ 7931, 10301, 8693, 6121, 9979, 10275, 4212,
+ 7931, 10301, 8693, 6121, 10281, 10275, 4212,
+ 7931, 10301, 8693, 6121, 12355, 3245, 10275, 4212,
+ 7931, 10301, 8895, 9405, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 8895, 9405, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 9363, 4212,
+ 7931, 10301, 8895, 9405, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 10341, 10275, 4212,
+ 7931, 10301, 10683, 10275, 4212,
+ 7931, 10301, 10741, 10715, 10712,
+ 7931, 10301, 12159, 7917, 10682,
+ 7931, 10301, 13202,
+ 7931, 10469, 4926,
+ 7931, 10489, 6644,
+ 7931, 10692,
+ 7931, 11224,
+ 7931, 11261, 3244,
+ 7931, 11363, 11228,
+ 7971, 46,
+ 7971, 826,
+ 7971, 827, 6121, 46,
+ 7971, 827, 6121, 6568,
+ 7985, 8159, 7274,
+ 7985, 11241, 7274,
+ 8005, 731, 12901, 6434,
+ 8005, 4389, 10260,
+ 8005, 4849, 3958,
+ 8005, 4849, 4389, 9050,
+ 8005, 4849, 8076,
+ 8005, 6627, 9050,
+ 8005, 7443, 3958,
+ 8005, 7443, 4389, 9050,
+ 8005, 7443, 8076,
+ 8005, 8745, 9050,
+ 8005, 8745, 9051, 5387, 2725, 8745, 9050,
+ 8005, 10637, 7533, 9050,
+ 8005, 12114,
+ 8006,
+ 8007, 6121, 4849, 4389, 6504,
+ 8007, 6121, 7443, 4389, 6504,
+ 8017, 760,
+ 8017, 8057, 6121, 11141, 6434,
+ 8022,
+ 8023, 10374,
+ 8027, 2638,
+ 8028,
+ 8033, 8405, 0,
+ 8033, 8405, 2,
+ 8033, 8405, 6,
+ 8033, 8405, 8,
+ 8033, 8405, 12,
+ 8033, 8405, 16,
+ 8033, 8405, 20,
+ 8033, 8405, 22,
+ 8033, 8405, 24,
+ 8033, 8405, 26,
+ 8033, 8405, 28,
+ 8033, 8405, 30,
+ 8033, 8405, 32,
+ 8033, 8405, 34,
+ 8033, 8405, 36,
+ 8033, 8405, 38,
+ 8033, 8405, 40,
+ 8033, 8405, 46,
+ 8033, 8405, 54,
+ 8033, 8405, 136,
+ 8033, 8405, 158,
+ 8033, 8405, 214,
+ 8033, 8405, 266,
+ 8033, 8405, 304,
+ 8033, 8405, 334,
+ 8033, 8405, 366,
+ 8033, 8405, 394,
+ 8033, 8405, 400,
+ 8033, 8405, 410,
+ 8033, 8405, 460,
+ 8033, 8405, 518,
+ 8033, 8405, 530,
+ 8033, 8405, 542,
+ 8033, 8405, 544,
+ 8033, 8405, 574,
+ 8033, 8405, 606,
+ 8033, 8405, 1756,
+ 8033, 8405, 1872,
+ 8033, 8405, 1874,
+ 8033, 8405, 1876,
+ 8033, 8405, 2514,
+ 8033, 8405, 2578,
+ 8033, 8405, 2744,
+ 8033, 8405, 2838,
+ 8033, 8405, 3832,
+ 8033, 8405, 3834,
+ 8033, 8405, 6068,
+ 8033, 8405, 6070,
+ 8033, 8405, 6072,
+ 8037, 4877, 8774,
+ 8048,
+ 8057, 6121, 719, 835, 7773, 4849, 10465, 6504,
+ 8057, 6121, 2779, 11649, 9745, 569, 2681, 7442,
+ 8057, 6121, 4849, 4389, 6504,
+ 8057, 6121, 7121, 4389, 6504,
+ 8057, 6121, 7443, 4389, 6504,
+ 8057, 6121, 7593, 8057, 569, 2681, 7442,
+ 8057, 6121, 7773, 4389, 6504,
+ 8057, 6121, 7773, 7443, 10465, 6504,
+ 8057, 6121, 10677, 4192,
+ 8057, 6121, 11649, 760,
+ 8057, 6121, 12879, 46,
+ 8057, 9177, 115, 11649, 761, 721, 2725, 4389, 9177, 115, 10677, 760,
+ 8065, 7769, 6121, 8688,
+ 8065, 7769, 6121, 8689, 721, 7595, 9610,
+ 8065, 8762,
+ 8065, 8763, 445, 6741, 568,
+ 8065, 10578,
+ 8065, 10579, 445, 6741, 568,
+ 8065, 12493, 6121, 8688,
+ 8066,
+ 8075, 2167, 8523, 4223, 5836,
+ 8075, 2167, 8523, 7793, 9178,
+ 8075, 2167, 8523, 8121, 10469, 4926,
+ 8075, 2167, 8523, 10255, 10469, 4926,
+ 8075, 4223, 5836,
+ 8075, 7593, 8405, 28,
+ 8075, 7593, 8405, 202,
+ 8075, 7593, 8405, 374,
+ 8075, 7593, 8405, 404,
+ 8075, 7593, 8405, 476,
+ 8075, 7593, 8405, 516,
+ 8075, 7593, 8405, 582,
+ 8075, 7593, 8405, 986,
+ 8075, 7593, 8405, 1102,
+ 8075, 7593, 8405, 1154,
+ 8075, 7593, 8405, 1616,
+ 8075, 7593, 8405, 1680,
+ 8075, 7593, 8405, 2167, 8075, 236,
+ 8075, 7593, 8405, 2167, 8075, 710,
+ 8075, 7593, 8405, 2167, 8075, 1020,
+ 8075, 7593, 8405, 2167, 8075, 1124,
+ 8075, 7593, 8405, 2167, 8075, 1352,
+ 8075, 7593, 8405, 2167, 8075, 1360,
+ 8075, 7593, 8405, 2167, 8075, 2180,
+ 8075, 7593, 8405, 2167, 8075, 4534,
+ 8075, 7593, 8405, 2167, 8075, 5680,
+ 8075, 7593, 8405, 2167, 8075, 7542,
+ 8075, 7593, 8405, 2167, 8075, 8238,
+ 8075, 7593, 8405, 2167, 8523, 2036,
+ 8075, 7593, 8405, 2167, 8523, 2132,
+ 8075, 7593, 8405, 2167, 8523, 2916,
+ 8075, 7593, 8405, 2167, 8523, 7542,
+ 8075, 7593, 8405, 2180,
+ 8075, 7593, 8405, 2250,
+ 8075, 7593, 8405, 2560,
+ 8075, 7593, 8405, 2658,
+ 8075, 7593, 8405, 3246,
+ 8075, 7593, 8405, 4394,
+ 8075, 7593, 8405, 4534,
+ 8075, 7593, 8405, 4722,
+ 8075, 7593, 8405, 4746,
+ 8075, 7593, 8405, 5680,
+ 8075, 7593, 8405, 5766,
+ 8075, 7593, 8405, 6082,
+ 8075, 7593, 8405, 6258,
+ 8075, 7593, 8405, 6640,
+ 8075, 7593, 8405, 6824,
+ 8075, 7593, 8405, 6976,
+ 8075, 7593, 8405, 7090,
+ 8075, 7593, 8405, 7484,
+ 8075, 7593, 8405, 7542,
+ 8075, 7593, 8405, 8238,
+ 8075, 7593, 8405, 8816,
+ 8075, 7593, 8405, 9127, 5680,
+ 8075, 7593, 8405, 9861, 4746,
+ 8075, 7593, 8405, 10295, 236,
+ 8075, 7593, 8405, 10807, 404,
+ 8075, 7593, 8405, 10807, 3244,
+ 8075, 7593, 8405, 10807, 4534,
+ 8075, 7593, 8405, 10807, 4722,
+ 8075, 7593, 8405, 12921, 404,
+ 8075, 7593, 8405, 12921, 1102,
+ 8075, 8775, 375, 516,
+ 8075, 8775, 477, 516,
+ 8075, 8775, 1582,
+ 8075, 8775, 1617, 516,
+ 8075, 8775, 2659, 516,
+ 8075, 8775, 7543, 5766,
+ 8075, 8775, 9738,
+ 8075, 9063, 8405, 28,
+ 8075, 9063, 8405, 202,
+ 8075, 9063, 8405, 374,
+ 8075, 9063, 8405, 404,
+ 8075, 9063, 8405, 476,
+ 8075, 9063, 8405, 516,
+ 8075, 9063, 8405, 582,
+ 8075, 9063, 8405, 986,
+ 8075, 9063, 8405, 1102,
+ 8075, 9063, 8405, 1154,
+ 8075, 9063, 8405, 1616,
+ 8075, 9063, 8405, 1680,
+ 8075, 9063, 8405, 2167, 8075, 236,
+ 8075, 9063, 8405, 2167, 8075, 710,
+ 8075, 9063, 8405, 2167, 8075, 1020,
+ 8075, 9063, 8405, 2167, 8075, 1124,
+ 8075, 9063, 8405, 2167, 8075, 1352,
+ 8075, 9063, 8405, 2167, 8075, 1360,
+ 8075, 9063, 8405, 2167, 8075, 2180,
+ 8075, 9063, 8405, 2167, 8075, 4534,
+ 8075, 9063, 8405, 2167, 8075, 5680,
+ 8075, 9063, 8405, 2167, 8075, 7542,
+ 8075, 9063, 8405, 2167, 8075, 8238,
+ 8075, 9063, 8405, 2167, 8523, 2036,
+ 8075, 9063, 8405, 2167, 8523, 2132,
+ 8075, 9063, 8405, 2167, 8523, 2916,
+ 8075, 9063, 8405, 2167, 8523, 7542,
+ 8075, 9063, 8405, 2180,
+ 8075, 9063, 8405, 2250,
+ 8075, 9063, 8405, 2560,
+ 8075, 9063, 8405, 2658,
+ 8075, 9063, 8405, 3246,
+ 8075, 9063, 8405, 4394,
+ 8075, 9063, 8405, 4534,
+ 8075, 9063, 8405, 4722,
+ 8075, 9063, 8405, 4746,
+ 8075, 9063, 8405, 5680,
+ 8075, 9063, 8405, 5766,
+ 8075, 9063, 8405, 6082,
+ 8075, 9063, 8405, 6258,
+ 8075, 9063, 8405, 6640,
+ 8075, 9063, 8405, 6824,
+ 8075, 9063, 8405, 6976,
+ 8075, 9063, 8405, 7090,
+ 8075, 9063, 8405, 7484,
+ 8075, 9063, 8405, 7542,
+ 8075, 9063, 8405, 8238,
+ 8075, 9063, 8405, 8816,
+ 8075, 9063, 8405, 9127, 5680,
+ 8075, 9063, 8405, 9861, 4746,
+ 8075, 9063, 8405, 10295, 236,
+ 8075, 9063, 8405, 10807, 404,
+ 8075, 9063, 8405, 10807, 3244,
+ 8075, 9063, 8405, 10807, 4534,
+ 8075, 9063, 8405, 10807, 4722,
+ 8075, 9063, 8405, 12921, 404,
+ 8075, 9063, 8405, 12921, 1102,
+ 8075, 10203, 2171, 4388,
+ 8075, 12977, 9178,
+ 8083, 5833, 11163, 5759, 10380,
+ 8088,
+ 8097, 1809, 4876,
+ 8097, 10388,
+ 8097, 13235, 11765, 6434,
+ 8101, 5758,
+ 8101, 9076,
+ 8101, 11626,
+ 8117, 1177, 6716,
+ 8117, 1177, 6957, 6716,
+ 8117, 1177, 8403, 3070,
+ 8117, 1177, 8403, 6178,
+ 8117, 1177, 9251, 6956,
+ 8117, 1177, 9251, 8290,
+ 8117, 1177, 9315, 3070,
+ 8117, 1177, 9315, 6178,
+ 8117, 1177, 10239, 6716,
+ 8121, 9129, 8775, 4213, 2778,
+ 8129, 5758,
+ 8133, 5941, 10677, 3696,
+ 8133, 5941, 11649, 3696,
+ 8133, 5941, 13086,
+ 8133, 5941, 13088,
+ 8133, 5941, 13090,
+ 8133, 5941, 13092,
+ 8133, 5941, 13094,
+ 8133, 5941, 13096,
+ 8133, 5941, 13098,
+ 8133, 5941, 13100,
+ 8133, 5941, 13102,
+ 8133, 5941, 13104,
+ 8133, 5941, 13106,
+ 8133, 5941, 13108,
+ 8133, 5941, 13110,
+ 8133, 5941, 13112,
+ 8133, 5941, 13114,
+ 8133, 5941, 13116,
+ 8133, 5941, 13118,
+ 8133, 5941, 13120,
+ 8133, 5941, 13122,
+ 8133, 5941, 13124,
+ 8133, 5941, 13126,
+ 8133, 5941, 13128,
+ 8133, 5941, 13130,
+ 8133, 5941, 13132,
+ 8133, 5941, 13134,
+ 8133, 5941, 13136,
+ 8133, 5941, 13138,
+ 8133, 5941, 13140,
+ 8133, 5941, 13142,
+ 8133, 5941, 13144,
+ 8133, 5941, 13146,
+ 8133, 5941, 13148,
+ 8133, 5941, 13150,
+ 8133, 5941, 13152,
+ 8133, 5941, 13154,
+ 8133, 5941, 13156,
+ 8133, 5941, 13158,
+ 8133, 5941, 13160,
+ 8133, 5941, 13162,
+ 8133, 5941, 13164,
+ 8133, 5941, 13166,
+ 8133, 5941, 13168,
+ 8133, 5941, 13170,
+ 8133, 5941, 13172,
+ 8133, 5941, 13174,
+ 8133, 5941, 13176,
+ 8133, 5941, 13178,
+ 8133, 5941, 13180,
+ 8133, 5941, 13182,
+ 8133, 5941, 13240,
+ 8133, 5941, 13242,
+ 8133, 5941, 13244,
+ 8133, 5941, 13246,
+ 8133, 5941, 13248,
+ 8133, 5941, 13250,
+ 8133, 5941, 13252,
+ 8133, 5941, 13254,
+ 8133, 5941, 13256,
+ 8133, 5941, 13258,
+ 8133, 5941, 13260,
+ 8133, 5941, 13262,
+ 8133, 5941, 13264,
+ 8133, 5941, 13266,
+ 8133, 5941, 13268,
+ 8133, 5941, 13270,
+ 8133, 5941, 13272,
+ 8133, 5941, 13274,
+ 8133, 5941, 13276,
+ 8133, 5941, 13278,
+ 8133, 5941, 13280,
+ 8133, 5941, 13282,
+ 8133, 5941, 13284,
+ 8133, 5941, 13286,
+ 8133, 5941, 13288,
+ 8133, 5941, 13290,
+ 8133, 5941, 13292,
+ 8133, 5941, 13294,
+ 8133, 5941, 13296,
+ 8133, 5941, 13298,
+ 8133, 5941, 13300,
+ 8133, 5941, 13302,
+ 8133, 5941, 13304,
+ 8133, 5941, 13306,
+ 8133, 5941, 13308,
+ 8133, 5941, 13310,
+ 8133, 5941, 13312,
+ 8133, 5941, 13314,
+ 8133, 5941, 13316,
+ 8133, 5941, 13318,
+ 8133, 5941, 13320,
+ 8133, 5941, 13322,
+ 8133, 5941, 13324,
+ 8133, 5941, 13326,
+ 8133, 5941, 13328,
+ 8133, 5941, 13330,
+ 8133, 5941, 13332,
+ 8133, 5941, 13334,
+ 8133, 5941, 13336,
+ 8151, 6622,
+ 8151, 6778,
+ 8151, 8056,
+ 8151, 8528,
+ 8151, 8744,
+ 8151, 13029, 8450,
+ 8151, 13067, 6408,
+ 8153, 601, 5876,
+ 8153, 1809, 4876,
+ 8153, 4117, 5876,
+ 8153, 4849, 731, 12473, 9050,
+ 8153, 5444,
+ 8153, 6107, 10388,
+ 8153, 6379, 7908,
+ 8153, 6611, 6740,
+ 8153, 7119, 11195, 4926,
+ 8153, 7390,
+ 8153, 7391, 11195, 4926,
+ 8153, 7443, 731, 11099, 9050,
+ 8153, 7768,
+ 8153, 8088,
+ 8153, 8509, 11098,
+ 8153, 8509, 11099, 6121, 10666,
+ 8153, 8509, 12472,
+ 8153, 8745, 7768,
+ 8153, 8745, 12492,
+ 8153, 8759, 2091, 5758,
+ 8153, 8762,
+ 8153, 9095, 6689, 2170,
+ 8153, 9095, 6689, 2540,
+ 8153, 9095, 6689, 2778,
+ 8153, 9095, 6689, 4200,
+ 8153, 9095, 6689, 4214,
+ 8153, 9095, 6689, 5190,
+ 8153, 9095, 6689, 6722,
+ 8153, 9095, 6689, 7508,
+ 8153, 9095, 6689, 7694,
+ 8153, 9095, 8525, 2670,
+ 8153, 9437, 444,
+ 8153, 9437, 720,
+ 8153, 9525, 8306,
+ 8153, 9719, 10374,
+ 8153, 10260,
+ 8153, 10452,
+ 8153, 10469, 4926,
+ 8153, 10574,
+ 8153, 10578,
+ 8153, 10677, 761, 4849, 11378,
+ 8153, 10677, 761, 8153, 4849, 11378,
+ 8153, 10677, 761, 8153, 7443, 11378,
+ 8153, 10677, 4876,
+ 8153, 12017, 4926,
+ 8153, 12492,
+ 8153, 13201, 11195, 4926,
+ 8159, 5244,
+ 8167, 5758,
+ 8167, 5759, 721, 9705, 10410,
+ 8167, 5759, 721, 9705, 10411, 6121, 7709, 6376,
+ 8167, 5759, 6121, 1045, 6490,
+ 8167, 5759, 6121, 2779, 4113, 6377, 721, 2779, 4113, 6490,
+ 8167, 5759, 6121, 6537, 6376,
+ 8167, 5759, 6377, 5445, 5758,
+ 8167, 5759, 6377, 7709, 10374,
+ 8167, 5759, 6377, 11097, 6434,
+ 8167, 5759, 6377, 11765, 6434,
+ 8167, 6121, 9898,
+ 8167, 6610,
+ 8172,
+ 8197, 5758,
+ 8203, 3992,
+ 8203, 7608,
+ 8209, 5401, 10260,
+ 8225, 6906,
+ 8226,
+ 8227, 12133, 4926,
+ 8228,
+ 8231, 12108,
+ 8233, 5566,
+ 8235, 6809, 5758,
+ 8246,
+ 8255, 7359, 5758,
+ 8263, 7630,
+ 8267, 8405, 1104,
+ 8267, 8405, 1510,
+ 8267, 8405, 3234,
+ 8267, 8405, 3980,
+ 8267, 8405, 4324,
+ 8267, 8405, 4384,
+ 8267, 8405, 4622,
+ 8267, 8405, 5191, 9344,
+ 8267, 8405, 6056,
+ 8267, 8405, 6768,
+ 8267, 8405, 6960,
+ 8267, 8405, 6984,
+ 8267, 8405, 7064,
+ 8267, 8405, 7078,
+ 8267, 8405, 7130,
+ 8267, 8405, 7322,
+ 8267, 8405, 7416,
+ 8267, 8405, 7490,
+ 8267, 8405, 7674,
+ 8267, 8405, 7828,
+ 8267, 8405, 7912,
+ 8267, 8405, 8502,
+ 8267, 8405, 8514,
+ 8267, 8405, 8822,
+ 8267, 8405, 9018,
+ 8267, 8405, 10394,
+ 8267, 8405, 10462,
+ 8285, 721, 5424,
+ 8285, 721, 8712,
+ 8287, 8153, 1045, 5965, 4926,
+ 8287, 8206,
+ 8287, 8405, 0,
+ 8287, 8405, 8,
+ 8287, 8405, 16,
+ 8287, 8405, 28,
+ 8287, 8405, 40,
+ 8287, 8405, 66,
+ 8287, 8405, 178,
+ 8287, 8405, 188,
+ 8287, 8405, 426,
+ 8287, 8405, 622,
+ 8287, 8405, 626,
+ 8287, 8405, 630,
+ 8287, 8405, 652,
+ 8287, 8405, 654,
+ 8287, 8405, 656,
+ 8287, 8405, 660,
+ 8287, 8405, 664,
+ 8287, 8405, 2908,
+ 8287, 8405, 2926,
+ 8287, 8405, 3012,
+ 8287, 8405, 3056,
+ 8287, 8405, 5770,
+ 8287, 8405, 6216,
+ 8287, 8405, 6230,
+ 8287, 8405, 6422,
+ 8287, 8405, 6594,
+ 8287, 8405, 6912,
+ 8287, 8405, 6982,
+ 8287, 8405, 7166,
+ 8287, 8405, 7244,
+ 8287, 8405, 7372,
+ 8287, 8405, 7440,
+ 8287, 8405, 7862,
+ 8287, 8405, 7866,
+ 8287, 8405, 7932,
+ 8287, 8405, 8362,
+ 8287, 8405, 8828,
+ 8287, 8405, 8950,
+ 8287, 8405, 8956,
+ 8287, 8405, 9086,
+ 8287, 8405, 9400,
+ 8287, 8405, 9562,
+ 8287, 8405, 9588,
+ 8287, 8405, 9780,
+ 8287, 8405, 10686,
+ 8287, 8405, 11248,
+ 8287, 8405, 11682,
+ 8287, 8405, 11696,
+ 8287, 8405, 11728,
+ 8287, 8405, 11758,
+ 8287, 8405, 11804,
+ 8287, 8405, 11812,
+ 8287, 8405, 11814,
+ 8287, 8405, 11824,
+ 8287, 8405, 11826,
+ 8287, 8405, 11828,
+ 8287, 8405, 11830,
+ 8287, 8405, 11832,
+ 8287, 8405, 12070,
+ 8287, 8405, 12080,
+ 8287, 8405, 12094,
+ 8287, 8405, 12096,
+ 8287, 8405, 12124,
+ 8287, 8405, 12144,
+ 8287, 8405, 12146,
+ 8287, 8405, 12150,
+ 8287, 8405, 12346,
+ 8287, 8405, 12348,
+ 8287, 8405, 12350,
+ 8287, 8405, 12352,
+ 8287, 8405, 12388,
+ 8287, 8405, 12514,
+ 8287, 8405, 12518,
+ 8287, 8405, 12520,
+ 8287, 8405, 12532,
+ 8287, 8405, 12534,
+ 8287, 8405, 12958,
+ 8287, 8405, 12960,
+ 8287, 8405, 12972,
+ 8287, 8405, 12978,
+ 8287, 8405, 12998,
+ 8287, 8405, 13004,
+ 8287, 8405, 13006,
+ 8287, 8405, 13008,
+ 8287, 8405, 13034,
+ 8287, 8405, 13204,
+ 8287, 8405, 13348,
+ 8287, 8405, 13354,
+ 8287, 8405, 13366,
+ 8287, 8405, 13368,
+ 8287, 8405, 13370,
+ 8287, 8405, 13374,
+ 8287, 8405, 13386,
+ 8287, 8717, 1045, 5965, 4926,
+ 8287, 9945, 5770,
+ 8287, 9945, 6594,
+ 8287, 9945, 6912,
+ 8287, 9945, 6982,
+ 8287, 9945, 7166,
+ 8287, 9945, 7244,
+ 8287, 9945, 7372,
+ 8287, 9945, 7440,
+ 8287, 9945, 8206,
+ 8287, 9945, 8362,
+ 8287, 9945, 8828,
+ 8287, 9945, 9086,
+ 8287, 9945, 9400,
+ 8287, 9945, 9562,
+ 8287, 9945, 9588,
+ 8287, 9945, 9780,
+ 8287, 9945, 10686,
+ 8287, 9945, 11248,
+ 8287, 9945, 11652,
+ 8287, 9945, 11728,
+ 8287, 9945, 11804,
+ 8287, 9945, 11806,
+ 8287, 9945, 11808,
+ 8287, 9945, 11810,
+ 8287, 9945, 11812,
+ 8287, 9945, 11814,
+ 8287, 9945, 11816,
+ 8287, 9945, 11824,
+ 8287, 9945, 11826,
+ 8287, 9945, 11828,
+ 8287, 9945, 11830,
+ 8287, 9945, 11832,
+ 8287, 9945, 11834,
+ 8287, 9945, 11902,
+ 8287, 9945, 12044,
+ 8287, 9945, 12046,
+ 8287, 9945, 12048,
+ 8287, 9945, 12080,
+ 8287, 9945, 12098,
+ 8287, 9945, 12124,
+ 8287, 9945, 12128,
+ 8287, 9945, 12144,
+ 8287, 9945, 12148,
+ 8287, 9945, 12346,
+ 8287, 9945, 12348,
+ 8287, 9945, 12350,
+ 8287, 9945, 12352,
+ 8287, 9945, 12388,
+ 8287, 9945, 12424,
+ 8287, 9945, 12484,
+ 8287, 9945, 12486,
+ 8287, 9945, 12512,
+ 8287, 9945, 12514,
+ 8287, 9945, 12518,
+ 8287, 9945, 12520,
+ 8287, 9945, 12858,
+ 8287, 9945, 12860,
+ 8287, 9945, 12862,
+ 8287, 9945, 12864,
+ 8287, 9945, 12908,
+ 8287, 9945, 12910,
+ 8287, 9945, 12942,
+ 8287, 9945, 12946,
+ 8287, 9945, 12948,
+ 8287, 9945, 12950,
+ 8287, 9945, 12958,
+ 8287, 9945, 12960,
+ 8287, 9945, 12962,
+ 8287, 9945, 12992,
+ 8287, 9945, 12994,
+ 8287, 9945, 12996,
+ 8287, 9945, 12998,
+ 8287, 9945, 13026,
+ 8287, 9945, 13078,
+ 8287, 9945, 13192,
+ 8287, 9945, 13194,
+ 8287, 9945, 13196,
+ 8287, 9945, 13204,
+ 8287, 9945, 13218,
+ 8287, 9945, 13238,
+ 8287, 9945, 13342,
+ 8287, 9945, 13344,
+ 8287, 9945, 13358,
+ 8287, 9945, 13366,
+ 8287, 9945, 13368,
+ 8287, 9945, 13378,
+ 8287, 9945, 13382,
+ 8287, 9945, 13384,
+ 8287, 9945, 13386,
+ 8287, 9945, 13408,
+ 8287, 9945, 13412,
+ 8287, 11071, 5770,
+ 8287, 11071, 6594,
+ 8287, 11071, 6912,
+ 8287, 11071, 6982,
+ 8287, 11071, 7166,
+ 8287, 11071, 7244,
+ 8287, 11071, 7372,
+ 8287, 11071, 7440,
+ 8287, 11071, 8362,
+ 8287, 11071, 8828,
+ 8287, 11071, 9086,
+ 8287, 11071, 9400,
+ 8287, 11071, 9562,
+ 8287, 11071, 9588,
+ 8287, 11071, 9780,
+ 8287, 11071, 10686,
+ 8287, 11071, 11248,
+ 8287, 11071, 11682,
+ 8287, 11071, 11696,
+ 8287, 11071, 11728,
+ 8287, 11071, 11758,
+ 8287, 11071, 11814,
+ 8287, 11071, 11816,
+ 8287, 11071, 11828,
+ 8287, 11071, 11834,
+ 8287, 11071, 12032,
+ 8287, 11071, 12034,
+ 8287, 11071, 12036,
+ 8287, 11071, 12038,
+ 8287, 11071, 12070,
+ 8287, 11071, 12078,
+ 8287, 11071, 12080,
+ 8287, 11071, 12082,
+ 8287, 11071, 12094,
+ 8287, 11071, 12096,
+ 8287, 11071, 12126,
+ 8287, 11071, 12130,
+ 8287, 11071, 12144,
+ 8287, 11071, 12146,
+ 8287, 11071, 12148,
+ 8287, 11071, 12150,
+ 8287, 11071, 12346,
+ 8287, 11071, 12348,
+ 8287, 11071, 12350,
+ 8287, 11071, 12388,
+ 8287, 11071, 12484,
+ 8287, 11071, 12496,
+ 8287, 11071, 12508,
+ 8287, 11071, 12512,
+ 8287, 11071, 12514,
+ 8287, 11071, 12532,
+ 8287, 11071, 12534,
+ 8287, 11071, 12884,
+ 8287, 11071, 12944,
+ 8287, 11071, 12958,
+ 8287, 11071, 12960,
+ 8287, 11071, 12970,
+ 8287, 11071, 12972,
+ 8287, 11071, 12978,
+ 8287, 11071, 12980,
+ 8287, 11071, 12992,
+ 8287, 11071, 12996,
+ 8287, 11071, 13002,
+ 8287, 11071, 13004,
+ 8287, 11071, 13006,
+ 8287, 11071, 13008,
+ 8287, 11071, 13026,
+ 8287, 11071, 13034,
+ 8287, 11071, 13204,
+ 8287, 11071, 13214,
+ 8287, 11071, 13224,
+ 8287, 11071, 13346,
+ 8287, 11071, 13348,
+ 8287, 11071, 13354,
+ 8287, 11071, 13362,
+ 8287, 11071, 13370,
+ 8287, 11071, 13372,
+ 8287, 11071, 13374,
+ 8287, 11071, 13388,
+ 8287, 11071, 13394,
+ 8287, 11071, 13396,
+ 8287, 11071, 13406,
+ 8287, 11073, 0,
+ 8287, 11073, 8,
+ 8287, 11073, 16,
+ 8287, 11073, 28,
+ 8287, 11073, 40,
+ 8287, 11073, 66,
+ 8287, 11073, 178,
+ 8287, 11073, 188,
+ 8287, 11073, 426,
+ 8287, 11073, 622,
+ 8287, 11073, 626,
+ 8287, 11073, 630,
+ 8287, 11073, 652,
+ 8287, 11073, 654,
+ 8287, 11073, 656,
+ 8287, 11073, 660,
+ 8287, 11073, 664,
+ 8287, 11073, 686,
+ 8287, 11073, 688,
+ 8287, 11073, 1466,
+ 8287, 11073, 1468,
+ 8287, 11073, 1470,
+ 8287, 11073, 2148,
+ 8287, 11073, 2150,
+ 8287, 11073, 2152,
+ 8287, 11073, 2800,
+ 8287, 11073, 2802,
+ 8287, 11073, 2908,
+ 8287, 11073, 2926,
+ 8287, 11073, 3012,
+ 8287, 11073, 3056,
+ 8287, 11073, 4160,
+ 8287, 11073, 4162,
+ 8287, 11073, 4168,
+ 8287, 11073, 4592,
+ 8287, 11073, 4594,
+ 8287, 11073, 5370,
+ 8287, 11073, 5372,
+ 8287, 11073, 6040,
+ 8287, 11073, 6042,
+ 8287, 11073, 6158,
+ 8287, 11073, 6204,
+ 8287, 11073, 6216,
+ 8287, 11073, 6218,
+ 8287, 11073, 6226,
+ 8287, 11073, 6228,
+ 8287, 11073, 6230,
+ 8287, 11073, 6232,
+ 8287, 11073, 6422,
+ 8287, 11073, 6736,
+ 8287, 11073, 6760,
+ 8287, 11073, 7838,
+ 8287, 11073, 7850,
+ 8287, 11073, 7852,
+ 8287, 11073, 7862,
+ 8287, 11073, 7864,
+ 8287, 11073, 7866,
+ 8287, 11073, 8206,
+ 8287, 11073, 8950,
+ 8287, 11073, 8952,
+ 8287, 11073, 8956,
+ 8287, 11073, 9002,
+ 8287, 11073, 9004,
+ 8287, 11073, 9346,
+ 8287, 11073, 9800,
+ 8287, 11073, 9882,
+ 8287, 11073, 11822,
+ 8293, 4927, 7121, 1044,
+ 8293, 4927, 7773, 1044,
+ 8293, 4927, 8455, 8056,
+ 8293, 7383, 2535, 1044,
+ 8293, 7383, 5522,
+ 8293, 7383, 5699, 1044,
+ 8293, 7383, 6901, 7342,
+ 8293, 7383, 6901, 7502,
+ 8293, 7383, 6901, 8620,
+ 8293, 7383, 6914,
+ 8293, 7383, 6948,
+ 8293, 7383, 6949, 6899, 1177, 2852,
+ 8293, 7383, 7148,
+ 8293, 7383, 7342,
+ 8293, 7383, 7502,
+ 8293, 7383, 7536,
+ 8293, 7383, 7742,
+ 8293, 7383, 8087, 445, 7132,
+ 8293, 7383, 8620,
+ 8293, 7383, 8621, 7404,
+ 8293, 7383, 8626,
+ 8293, 7383, 12957, 8910,
+ 8293, 7909, 2168,
+ 8293, 7909, 4054,
+ 8293, 7909, 4604,
+ 8293, 7909, 6439, 8280,
+ 8293, 7909, 6652,
+ 8293, 7909, 7192,
+ 8293, 7909, 7346,
+ 8293, 7909, 7402,
+ 8293, 7909, 7432,
+ 8293, 7909, 7502,
+ 8293, 7909, 7676,
+ 8293, 7909, 7855, 785, 6222,
+ 8293, 7909, 7858,
+ 8293, 7909, 7869, 6816,
+ 8293, 7909, 7869, 7404,
+ 8293, 7909, 7870,
+ 8293, 7909, 7886,
+ 8293, 7909, 8252,
+ 8293, 7909, 8253, 8492,
+ 8293, 7909, 8468,
+ 8293, 7909, 8469, 8346,
+ 8293, 7909, 8568,
+ 8293, 7909, 8623, 5398,
+ 8293, 7909, 8830,
+ 8293, 7909, 9272,
+ 8293, 7909, 9773, 8244,
+ 8293, 7909, 9773, 8624,
+ 8293, 7909, 10310,
+ 8293, 7909, 11016,
+ 8293, 7909, 11798,
+ 8293, 8405, 238,
+ 8293, 8405, 239, 6121, 7132,
+ 8293, 8405, 468,
+ 8293, 8405, 469, 6121, 5522,
+ 8293, 8405, 469, 6121, 8086,
+ 8293, 8405, 788,
+ 8293, 8405, 789, 6121, 5522,
+ 8293, 8405, 789, 6121, 8086,
+ 8293, 8405, 1366,
+ 8293, 8405, 1578,
+ 8293, 8405, 1579, 6121, 5522,
+ 8293, 8405, 1579, 6121, 8086,
+ 8293, 8405, 1892,
+ 8293, 8405, 1893, 6121, 8086,
+ 8293, 8405, 2110,
+ 8293, 8405, 2111, 6121, 8086,
+ 8293, 8405, 2318,
+ 8293, 8405, 2319, 6121, 8086,
+ 8293, 8405, 2660,
+ 8293, 8405, 2661, 6121, 8086,
+ 8293, 8405, 2674,
+ 8293, 8405, 2675, 6121, 8086,
+ 8293, 8405, 2852,
+ 8293, 8405, 2853, 6121, 6948,
+ 8293, 8405, 2853, 6121, 8086,
+ 8293, 8405, 3080,
+ 8293, 8405, 3081, 6121, 6914,
+ 8293, 8405, 3081, 6121, 8086,
+ 8293, 8405, 3244,
+ 8293, 8405, 3245, 6121, 7132,
+ 8293, 8405, 3245, 6121, 7342,
+ 8293, 8405, 3245, 6121, 8620,
+ 8293, 8405, 3292,
+ 8293, 8405, 5538,
+ 8293, 8405, 5539, 6121, 8086,
+ 8293, 8405, 5698,
+ 8293, 8405, 5699, 6121, 2535, 1044,
+ 8293, 8405, 5699, 6121, 5699, 1044,
+ 8293, 8405, 5699, 6121, 8086,
+ 8293, 8405, 5699, 6121, 8087, 721, 2535, 1044,
+ 8293, 8405, 5699, 6121, 8087, 721, 5699, 1044,
+ 8293, 8405, 6115, 238,
+ 8293, 8405, 6115, 1578,
+ 8293, 8405, 6115, 2660,
+ 8293, 8405, 6115, 3244,
+ 8293, 8405, 6115, 5538,
+ 8293, 8405, 6115, 6642,
+ 8293, 8405, 6115, 6789, 1892,
+ 8293, 8405, 6115, 7082,
+ 8293, 8405, 6642,
+ 8293, 8405, 6643, 6121, 8086,
+ 8293, 8405, 6789, 468,
+ 8293, 8405, 6789, 469, 6121, 8086,
+ 8293, 8405, 6789, 1578,
+ 8293, 8405, 6789, 1579, 6121, 8086,
+ 8293, 8405, 6789, 1892,
+ 8293, 8405, 6789, 2110,
+ 8293, 8405, 6789, 7740,
+ 8293, 8405, 6856,
+ 8293, 8405, 6857, 6121, 8086,
+ 8293, 8405, 7082,
+ 8293, 8405, 7083, 6121, 8086,
+ 8293, 8405, 7740,
+ 8293, 8405, 7741, 6121, 8086,
+ 8293, 8405, 7872,
+ 8293, 8405, 7873, 6121, 8086,
+ 8293, 8405, 8660,
+ 8293, 8405, 8661, 6121, 8086,
+ 8293, 8405, 11893, 3292,
+ 8293, 8405, 11893, 5445, 5758,
+ 8293, 10301, 3245, 7082,
+ 8293, 10301, 9847, 2853, 3080,
+ 8293, 10301, 9847, 3081, 3081, 7342,
+ 8293, 10301, 9847, 8153, 2852,
+ 8293, 10301, 9847, 8153, 3080,
+ 8293, 12133, 2111, 9318,
+ 8293, 12133, 2551, 7340,
+ 8293, 12133, 7134,
+ 8293, 12133, 7338,
+ 8293, 12133, 8252,
+ 8293, 12133, 11016,
+ 8306,
+ 8307, 6121, 10804,
+ 8307, 8022,
+ 8337, 9617, 151, 2090,
+ 8337, 9617, 228,
+ 8337, 9617, 229, 8722,
+ 8337, 9617, 720,
+ 8337, 9617, 742,
+ 8337, 9617, 806,
+ 8337, 9617, 824,
+ 8337, 9617, 920,
+ 8337, 9617, 1036,
+ 8337, 9617, 1044,
+ 8337, 9617, 1048,
+ 8337, 9617, 1090,
+ 8337, 9617, 1092,
+ 8337, 9617, 1136,
+ 8337, 9617, 1170,
+ 8337, 9617, 1182,
+ 8337, 9617, 1474,
+ 8337, 9617, 1504,
+ 8337, 9617, 1780,
+ 8337, 9617, 1860,
+ 8337, 9617, 2024,
+ 8337, 9617, 2090,
+ 8337, 9617, 2166,
+ 8337, 9617, 2170,
+ 8337, 9617, 2224,
+ 8337, 9617, 2390,
+ 8337, 9617, 2392,
+ 8337, 9617, 2400,
+ 8337, 9617, 2454,
+ 8337, 9617, 2502,
+ 8337, 9617, 2504,
+ 8337, 9617, 2586,
+ 8337, 9617, 2670,
+ 8337, 9617, 2778,
+ 8337, 9617, 2779, 6896,
+ 8337, 9617, 2834,
+ 8337, 9617, 3762,
+ 8337, 9617, 3788,
+ 8337, 9617, 3794,
+ 8337, 9617, 3798,
+ 8337, 9617, 3800,
+ 8337, 9617, 3805, 429, 6604,
+ 8337, 9617, 3806,
+ 8337, 9617, 3850,
+ 8337, 9617, 3852,
+ 8337, 9617, 3940,
+ 8337, 9617, 3942,
+ 8337, 9617, 3944,
+ 8337, 9617, 4052,
+ 8337, 9617, 4094,
+ 8337, 9617, 4108,
+ 8337, 9617, 4117, 826,
+ 8337, 9617, 4120,
+ 8337, 9617, 4172,
+ 8337, 9617, 4178,
+ 8337, 9617, 4180,
+ 8337, 9617, 4194,
+ 8337, 9617, 4196,
+ 8337, 9617, 4208,
+ 8337, 9617, 4218,
+ 8337, 9617, 4244,
+ 8337, 9617, 4342,
+ 8337, 9617, 4386,
+ 8337, 9617, 4389, 5969, 7736,
+ 8337, 9617, 4390,
+ 8337, 9617, 4398,
+ 8337, 9617, 4402,
+ 8337, 9617, 4530,
+ 8337, 9617, 4536,
+ 8337, 9617, 4608,
+ 8337, 9617, 4628,
+ 8337, 9617, 4824,
+ 8337, 9617, 4834,
+ 8337, 9617, 4844,
+ 8337, 9617, 4846,
+ 8337, 9617, 4850,
+ 8337, 9617, 4872,
+ 8337, 9617, 4876,
+ 8337, 9617, 4894,
+ 8337, 9617, 4895, 8756,
+ 8337, 9617, 4940,
+ 8337, 9617, 5012,
+ 8337, 9617, 5242,
+ 8337, 9617, 5385, 826,
+ 8337, 9617, 5438,
+ 8337, 9617, 5524,
+ 8337, 9617, 5546,
+ 8337, 9617, 5562,
+ 8337, 9617, 5632,
+ 8337, 9617, 5646,
+ 8337, 9617, 5650,
+ 8337, 9617, 5764,
+ 8337, 9617, 5772,
+ 8337, 9617, 5834,
+ 8337, 9617, 5836,
+ 8337, 9617, 5884,
+ 8337, 9617, 5940,
+ 8337, 9617, 5968,
+ 8337, 9617, 6100,
+ 8337, 9617, 6101, 10970,
+ 8337, 9617, 6112,
+ 8337, 9617, 6116,
+ 8337, 9617, 6118,
+ 8337, 9617, 6130,
+ 8337, 9617, 6132,
+ 8337, 9617, 6384,
+ 8337, 9617, 6434,
+ 8337, 9617, 6504,
+ 8337, 9617, 6512,
+ 8337, 9617, 6520,
+ 8337, 9617, 6574,
+ 8337, 9617, 6600,
+ 8337, 9617, 6612,
+ 8337, 9617, 6618,
+ 8337, 9617, 6670,
+ 8337, 9617, 6716,
+ 8337, 9617, 6722,
+ 8337, 9617, 6734,
+ 8337, 9617, 6780,
+ 8337, 9617, 6786,
+ 8337, 9617, 6794,
+ 8337, 9617, 6852,
+ 8337, 9617, 6870,
+ 8337, 9617, 6872,
+ 8337, 9617, 6906,
+ 8337, 9617, 6952,
+ 8337, 9617, 7056,
+ 8337, 9617, 7144,
+ 8337, 9617, 7184,
+ 8337, 9617, 7186,
+ 8337, 9617, 7388,
+ 8337, 9617, 7443, 5385, 826,
+ 8337, 9617, 7446,
+ 8337, 9617, 7526,
+ 8337, 9617, 7532,
+ 8337, 9617, 7548,
+ 8337, 9617, 7551, 8785, 3788,
+ 8337, 9617, 7551, 8824,
+ 8337, 9617, 7580,
+ 8337, 9617, 7582,
+ 8337, 9617, 7584,
+ 8337, 9617, 7592,
+ 8337, 9617, 7602,
+ 8337, 9617, 7604,
+ 8337, 9617, 7612,
+ 8337, 9617, 7616,
+ 8337, 9617, 7628,
+ 8337, 9617, 7634,
+ 8337, 9617, 7642,
+ 8337, 9617, 7654,
+ 8337, 9617, 7662,
+ 8337, 9617, 7704,
+ 8337, 9617, 7726,
+ 8337, 9617, 7730,
+ 8337, 9617, 7812,
+ 8337, 9617, 7816,
+ 8337, 9617, 7820,
+ 8337, 9617, 7830,
+ 8337, 9617, 7832,
+ 8337, 9617, 7942,
+ 8337, 9617, 7964,
+ 8337, 9617, 7974,
+ 8337, 9617, 8000,
+ 8337, 9617, 8008,
+ 8337, 9617, 8078,
+ 8337, 9617, 8118,
+ 8337, 9617, 8151, 5896,
+ 8337, 9617, 8151, 6600,
+ 8337, 9617, 8153, 46,
+ 8337, 9617, 8154,
+ 8337, 9617, 8194,
+ 8337, 9617, 8303, 10970,
+ 8337, 9617, 8316,
+ 8337, 9617, 8476,
+ 8337, 9617, 8484,
+ 8337, 9617, 8542,
+ 8337, 9617, 8678,
+ 8337, 9617, 8680,
+ 8337, 9617, 8730,
+ 8337, 9617, 8734,
+ 8337, 9617, 8740,
+ 8337, 9617, 8744,
+ 8337, 9617, 8793, 9426,
+ 8337, 9617, 8844,
+ 8337, 9617, 8852,
+ 8337, 9617, 8866,
+ 8337, 9617, 8870,
+ 8337, 9617, 8906,
+ 8337, 9617, 8928,
+ 8337, 9617, 8946,
+ 8337, 9617, 9056,
+ 8337, 9617, 9102,
+ 8337, 9617, 9106,
+ 8337, 9617, 9274,
+ 8337, 9617, 9282,
+ 8337, 9617, 9322,
+ 8337, 9617, 9426,
+ 8337, 9617, 9480,
+ 8337, 9617, 9532,
+ 8337, 9617, 9608,
+ 8337, 9617, 9658,
+ 8337, 9617, 9822,
+ 8337, 9617, 9934,
+ 8337, 9617, 10206,
+ 8337, 9617, 10336,
+ 8337, 9617, 10344,
+ 8337, 9617, 10456,
+ 8337, 9617, 10520,
+ 8337, 9617, 10542,
+ 8337, 9617, 10970,
+ 8337, 9617, 11488,
+ 8337, 9617, 11606,
+ 8337, 9617, 11946,
+ 8337, 9617, 12155, 6118,
+ 8349, 5758,
+ 8371, 10539, 8774,
+ 8389, 5912,
+ 8389, 5913, 445, 6741, 568,
+ 8401, 5759, 2388,
+ 8401, 5759, 7282,
+ 8401, 6689, 2170,
+ 8401, 6689, 2540,
+ 8401, 6689, 2778,
+ 8401, 6689, 4200,
+ 8401, 6689, 4214,
+ 8401, 6689, 5190,
+ 8401, 6689, 6260,
+ 8401, 6689, 6722,
+ 8401, 6689, 7508,
+ 8401, 6689, 7694,
+ 8401, 7803, 5759, 8,
+ 8401, 7803, 5759, 16,
+ 8401, 7803, 5759, 28,
+ 8401, 7803, 5759, 40,
+ 8401, 7803, 5759, 58,
+ 8401, 7803, 5759, 440,
+ 8401, 7803, 5759, 606,
+ 8401, 8405, 0,
+ 8401, 8405, 100,
+ 8401, 8405, 116,
+ 8401, 8405, 138,
+ 8401, 8405, 196,
+ 8401, 8405, 216,
+ 8401, 8405, 236,
+ 8401, 8405, 292,
+ 8401, 8405, 306,
+ 8401, 8405, 332,
+ 8401, 8405, 364,
+ 8401, 8405, 392,
+ 8401, 8405, 462,
+ 8401, 8405, 510,
+ 8401, 8405, 524,
+ 8401, 8405, 556,
+ 8401, 8405, 610,
+ 8401, 8405, 622,
+ 8401, 8405, 652,
+ 8401, 8405, 814,
+ 8401, 8405, 884,
+ 8401, 8405, 974,
+ 8401, 8405, 1080,
+ 8401, 8405, 1168,
+ 8401, 8405, 1286,
+ 8401, 8405, 1390,
+ 8401, 8405, 1612,
+ 8401, 8405, 1652,
+ 8401, 8405, 1930,
+ 8401, 8405, 2030,
+ 8401, 8405, 2126,
+ 8401, 8405, 2212,
+ 8401, 8405, 2234,
+ 8401, 8405, 2516,
+ 8401, 8405, 2678,
+ 8401, 8405, 2732,
+ 8401, 8405, 2746,
+ 8401, 8405, 5978,
+ 8401, 8405, 5994,
+ 8401, 10775, 5759, 20,
+ 8401, 10775, 5759, 22,
+ 8401, 10775, 5759, 24,
+ 8401, 10775, 5759, 26,
+ 8401, 10775, 5759, 30,
+ 8401, 10775, 5759, 34,
+ 8401, 10775, 5759, 38,
+ 8401, 10775, 5759, 4720,
+ 8401, 10775, 5759, 9522,
+ 8401, 11257, 8405, 510,
+ 8401, 11257, 8405, 652,
+ 8401, 12133, 5301, 8827, 8782,
+ 8401, 12133, 8038,
+ 8401, 12133, 8782,
+ 8401, 12133, 8856,
+ 8401, 12133, 8857, 8038,
+ 8421, 3, 8775, 3328,
+ 8421, 3, 8775, 3330,
+ 8421, 3, 8775, 3336,
+ 8421, 3, 8775, 3360,
+ 8421, 3, 8775, 3384,
+ 8421, 3, 8775, 3388,
+ 8421, 3, 8775, 3402,
+ 8421, 3, 8775, 3416,
+ 8421, 3, 8775, 3418,
+ 8421, 3, 8775, 3448,
+ 8421, 3, 8775, 3454,
+ 8421, 3, 8775, 3456,
+ 8421, 3, 8775, 3460,
+ 8421, 3, 8775, 3464,
+ 8421, 3, 10247, 3471, 1860,
+ 8421, 3, 10247, 3473, 7830,
+ 8421, 3, 10247, 3475, 4052,
+ 8421, 3, 10247, 3477, 6742,
+ 8421, 3, 10247, 3479, 7816,
+ 8421, 3, 10247, 3481, 7978,
+ 8421, 3, 10247, 3483, 7314,
+ 8421, 3, 10247, 3485, 7614,
+ 8421, 3, 10247, 3487, 9134,
+ 8421, 3, 10247, 3493, 2164,
+ 8421, 3, 10247, 3495, 6118,
+ 8421, 3, 10247, 3496,
+ 8421, 3, 10247, 3503, 8018,
+ 8421, 3, 10247, 3505, 4342,
+ 8421, 3, 10247, 3506,
+ 8421, 3, 10247, 3509, 6124,
+ 8421, 3, 10247, 3510,
+ 8421, 3, 10247, 3512,
+ 8421, 3, 10247, 3515, 4536,
+ 8421, 3, 10247, 3516,
+ 8421, 3, 10247, 3518,
+ 8421, 3, 10247, 3520,
+ 8421, 3, 10247, 3526,
+ 8421, 3, 10247, 3528,
+ 8421, 3, 10247, 3531, 6604,
+ 8421, 3, 10247, 3532,
+ 8421, 3, 10247, 3534,
+ 8421, 3, 10247, 3537, 9300,
+ 8421, 3, 10247, 3539, 7936,
+ 8421, 3, 10247, 3540,
+ 8421, 3, 10247, 3542,
+ 8421, 3, 10247, 3544,
+ 8421, 3, 10247, 3546,
+ 8421, 3, 10247, 3548,
+ 8421, 3, 10247, 3550,
+ 8421, 3, 10247, 3552,
+ 8421, 3, 10247, 3554,
+ 8421, 3, 10247, 3556,
+ 8421, 3, 10247, 3559, 7182,
+ 8421, 3, 10247, 3560,
+ 8421, 3, 10247, 3563, 5968,
+ 8421, 3, 10247, 3564,
+ 8421, 3, 10247, 3566,
+ 8421, 3, 10247, 3568,
+ 8421, 3, 10247, 3570,
+ 8421, 3, 10247, 3572,
+ 8421, 3, 10247, 3574,
+ 8421, 3, 10247, 3576,
+ 8421, 3, 10247, 3578,
+ 8421, 3, 10247, 3580,
+ 8421, 3, 10247, 3582,
+ 8421, 3, 10247, 3584,
+ 8421, 3, 10247, 3587, 8296,
+ 8421, 3, 10247, 3629, 11000,
+ 8421, 3, 10247, 3635, 9030,
+ 8421, 3, 10247, 3645, 7612,
+ 8421, 3, 10247, 3647, 6434,
+ 8421, 3, 10247, 3648,
+ 8421, 3, 10247, 3651, 7656,
+ 8421, 3, 10247, 3652,
+ 8421, 3, 10247, 3654,
+ 8421, 3, 10247, 3657, 9841, 9082,
+ 8421, 3, 10247, 3659, 9082,
+ 8421, 3, 10247, 3661, 9083, 6806,
+ 8421, 3, 10247, 3663, 7818,
+ 8421, 3, 10247, 3664,
+ 8421, 3, 10247, 3666,
+ 8421, 3, 10247, 3670,
+ 8421, 3, 10247, 3672,
+ 8421, 3, 10247, 3676,
+ 8421, 3, 10247, 3678,
+ 8421, 3, 10247, 3680,
+ 8421, 3, 10247, 3683, 3990,
+ 8421, 3, 10247, 3684,
+ 8421, 3, 10247, 3686,
+ 8421, 3, 10247, 3688,
+ 8421, 3, 10247, 3690,
+ 8421, 3, 10247, 3692,
+ 8421, 3, 10247, 6445, 4924,
+ 8421, 3, 10247, 6447, 10536,
+ 8421, 3, 10247, 6449, 1132,
+ 8421, 3, 10247, 6451, 2386,
+ 8421, 3, 10247, 6453, 10516,
+ 8421, 3, 10247, 6455, 9332,
+ 8421, 3, 10247, 6457, 2562,
+ 8421, 3, 10247, 6459, 3796,
+ 8421, 3, 10247, 6461, 920,
+ 8421, 3, 10247, 6463, 3812,
+ 8421, 3, 10247, 8915, 3522,
+ 8421, 3, 10247, 8915, 3588,
+ 8421, 3, 10247, 8915, 3590,
+ 8421, 3, 10247, 8915, 3592,
+ 8421, 3, 10247, 8915, 3594,
+ 8421, 3, 10247, 8915, 3596,
+ 8421, 3, 10247, 8915, 3598,
+ 8421, 3, 10247, 8915, 3600,
+ 8421, 3, 10247, 8915, 3602,
+ 8421, 3, 10247, 8915, 3604,
+ 8421, 3, 10247, 8915, 3606,
+ 8421, 3, 10247, 8915, 3608,
+ 8421, 3, 10247, 8915, 3610,
+ 8421, 3, 10247, 8915, 3612,
+ 8421, 3, 10247, 8915, 3614,
+ 8421, 3, 10247, 8915, 3616,
+ 8421, 3, 10247, 8915, 3618,
+ 8421, 3, 10247, 8915, 3620,
+ 8421, 3, 10247, 8915, 3622,
+ 8421, 3, 10247, 8915, 3624,
+ 8421, 3, 10247, 8915, 3626,
+ 8421, 3, 10247, 8915, 3630,
+ 8421, 3, 10247, 8915, 3632,
+ 8421, 3, 10247, 8915, 3636,
+ 8421, 3, 10247, 8915, 3638,
+ 8421, 3, 10247, 8915, 3640,
+ 8421, 3, 10247, 8915, 3642,
+ 8421, 3, 10247, 8915, 3674,
+ 8421, 3, 10247, 8915, 3694,
+ 8421, 3, 10343, 3489, 4726,
+ 8421, 3, 10343, 3491, 8334,
+ 8421, 3, 10343, 3499, 6424,
+ 8421, 3, 10343, 3501, 4948,
+ 8421, 3, 10343, 3525, 7754,
+ 8421, 3, 10343, 3669, 6692,
+ 8421, 3, 10585, 3295, 138,
+ 8421, 3, 10585, 3297, 516,
+ 8421, 3, 10585, 3299, 462,
+ 8421, 3, 10585, 3301, 560,
+ 8421, 3, 10585, 3303, 568,
+ 8421, 3, 10585, 3305, 392,
+ 8421, 3, 10585, 3307, 144,
+ 8421, 3, 10585, 3309, 0,
+ 8421, 3, 10585, 3311, 526,
+ 8421, 3, 10585, 3313, 40,
+ 8421, 3, 10585, 3315, 480,
+ 8421, 3, 10585, 3317, 536,
+ 8421, 3, 10585, 3319, 368,
+ 8421, 3, 10585, 3321, 150,
+ 8421, 3, 10585, 3323, 380,
+ 8421, 3, 10585, 3325, 496,
+ 8421, 3, 10585, 3327, 670,
+ 8421, 3, 10585, 3333, 678,
+ 8421, 3, 10585, 3335, 500,
+ 8421, 3, 10585, 3339, 384,
+ 8421, 3, 10585, 3341, 396,
+ 8421, 3, 10585, 3343, 54,
+ 8421, 3, 10585, 3345, 520,
+ 8421, 3, 10585, 3347, 512,
+ 8421, 3, 10585, 3349, 16,
+ 8421, 3, 10585, 3351, 2254,
+ 8421, 3, 10585, 3353, 404,
+ 8421, 3, 10585, 3355, 524,
+ 8421, 3, 10585, 3357, 502,
+ 8421, 3, 10585, 3359, 2376,
+ 8421, 3, 10585, 3363, 298,
+ 8421, 3, 10585, 3365, 564,
+ 8421, 3, 10585, 3367, 8,
+ 8421, 3, 10585, 3369, 476,
+ 8421, 3, 10585, 3371, 630,
+ 8421, 3, 10585, 3373, 532,
+ 8421, 3, 10585, 3375, 632,
+ 8421, 3, 10585, 3377, 56,
+ 8421, 3, 10585, 3379, 310,
+ 8421, 3, 10585, 3381, 142,
+ 8421, 3, 10585, 3383, 294,
+ 8421, 3, 10585, 3387, 2122,
+ 8421, 3, 10585, 3391, 486,
+ 8421, 3, 10585, 3393, 152,
+ 8421, 3, 10585, 3395, 412,
+ 8421, 3, 10585, 3397, 514,
+ 8421, 3, 10585, 3399, 622,
+ 8421, 3, 10585, 3401, 416,
+ 8421, 3, 10585, 3405, 292,
+ 8421, 3, 10585, 3407, 546,
+ 8421, 3, 10585, 3409, 556,
+ 8421, 3, 10585, 3411, 510,
+ 8421, 3, 10585, 3413, 28,
+ 8421, 3, 10585, 3415, 2252,
+ 8421, 3, 10585, 3421, 300,
+ 8421, 3, 10585, 3423, 2632,
+ 8421, 3, 10585, 3425, 314,
+ 8421, 3, 10585, 3427, 2422,
+ 8421, 3, 10585, 3429, 576,
+ 8421, 3, 10585, 3431, 322,
+ 8421, 3, 10585, 3433, 1074,
+ 8421, 3, 10585, 3435, 468,
+ 8421, 3, 10585, 3437, 374,
+ 8421, 3, 10585, 3439, 672,
+ 8421, 3, 10585, 3441, 626,
+ 8421, 3, 10585, 3443, 2374,
+ 8421, 3, 10585, 3445, 306,
+ 8421, 3, 10585, 3447, 498,
+ 8421, 3, 10585, 3451, 364,
+ 8421, 3, 10585, 3453, 326,
+ 8421, 3, 10585, 3459, 92,
+ 8421, 3, 10585, 3463, 2774,
+ 8421, 3, 10585, 3467, 1076,
+ 8421, 3, 10585, 3469, 2778,
+ 8429, 8405, 0,
+ 8429, 8405, 2,
+ 8429, 8405, 6,
+ 8429, 8405, 8,
+ 8429, 8405, 12,
+ 8429, 8405, 14,
+ 8429, 8405, 16,
+ 8429, 8405, 18,
+ 8429, 8405, 20,
+ 8429, 8405, 22,
+ 8429, 8405, 24,
+ 8429, 8405, 26,
+ 8429, 8405, 30,
+ 8429, 8405, 32,
+ 8429, 8405, 34,
+ 8429, 8405, 36,
+ 8429, 8405, 38,
+ 8429, 8405, 40,
+ 8429, 8405, 44,
+ 8429, 8405, 46,
+ 8429, 8405, 50,
+ 8429, 8405, 80,
+ 8429, 8405, 104,
+ 8429, 8405, 176,
+ 8429, 8405, 316,
+ 8429, 8405, 378,
+ 8429, 8405, 410,
+ 8429, 8405, 562,
+ 8429, 8405, 574,
+ 8431, 8405, 0,
+ 8431, 8405, 2,
+ 8431, 8405, 4,
+ 8431, 8405, 6,
+ 8431, 8405, 8,
+ 8431, 8405, 10,
+ 8431, 8405, 12,
+ 8431, 8405, 16,
+ 8431, 8405, 20,
+ 8431, 8405, 22,
+ 8431, 8405, 24,
+ 8431, 8405, 26,
+ 8431, 8405, 28,
+ 8431, 8405, 32,
+ 8431, 8405, 34,
+ 8431, 8405, 36,
+ 8431, 8405, 38,
+ 8431, 8405, 40,
+ 8431, 8405, 42,
+ 8431, 8405, 48,
+ 8431, 8405, 80,
+ 8431, 8405, 176,
+ 8431, 8405, 360,
+ 8431, 8405, 410,
+ 8431, 8405, 542,
+ 8431, 8405, 574,
+ 8431, 11859, 4926,
+ 8432,
+ 8463, 4849, 6627, 9051, 10380,
+ 8463, 4849, 12115, 10380,
+ 8463, 6505, 8056,
+ 8463, 7443, 6627, 9051, 10380,
+ 8463, 7443, 12115, 10380,
+ 8463, 7512,
+ 8463, 7593, 7821, 8056,
+ 8463, 7821, 8056,
+ 8463, 10677, 760,
+ 8463, 10997, 4849, 12115, 10380,
+ 8463, 10997, 7443, 12115, 10380,
+ 8463, 12505, 7608,
+ 8463, 12967, 6409, 9051, 10380,
+ 8463, 13067, 6409, 9051, 10380,
+ 8473, 1044,
+ 8480,
+ 8483, 2779, 2584,
+ 8499, 10363, 7608,
+ 8510,
+ 8521, 10573, 428,
+ 8521, 10573, 429, 445, 6741, 568,
+ 8525, 2671, 4223, 5836,
+ 8525, 5758,
+ 8525, 8163, 4223, 5836,
+ 8525, 8875, 4223, 5836,
+ 8525, 8877, 4223, 5836,
+ 8525, 9287, 4223, 5836,
+ 8525, 9701, 4223, 5836,
+ 8525, 10151, 4223, 5836,
+ 8525, 10201, 4223, 5836,
+ 8525, 10361, 4223, 5836,
+ 8525, 10623, 4223, 5836,
+ 8525, 11233, 4223, 5836,
+ 8527, 5758,
+ 8533, 12143, 10758,
+ 8534,
+ 8545, 1610,
+ 8551, 4849, 12114,
+ 8551, 7443, 12114,
+ 8562,
+ 8570,
+ 8581, 5758,
+ 8592,
+ 8595, 9956,
+ 8595, 9957, 5387, 2779, 476,
+ 8609, 4926,
+ 8609, 4927, 4178,
+ 8631, 8151, 12953, 8450,
+ 8631, 8744,
+ 8631, 12953, 8450,
+ 8639, 7803, 5759, 8,
+ 8639, 7803, 5759, 16,
+ 8639, 7803, 5759, 28,
+ 8639, 7803, 5759, 40,
+ 8639, 7803, 5759, 72,
+ 8639, 7803, 5759, 92,
+ 8639, 7803, 5759, 160,
+ 8639, 7803, 5759, 188,
+ 8639, 8405, 0,
+ 8639, 8405, 100,
+ 8639, 8405, 116,
+ 8639, 8405, 138,
+ 8639, 8405, 216,
+ 8639, 8405, 236,
+ 8639, 8405, 292,
+ 8639, 8405, 306,
+ 8639, 8405, 332,
+ 8639, 8405, 364,
+ 8639, 8405, 392,
+ 8639, 8405, 462,
+ 8639, 8405, 510,
+ 8639, 8405, 524,
+ 8639, 8405, 556,
+ 8639, 8405, 622,
+ 8639, 8405, 652,
+ 8639, 8405, 1878,
+ 8639, 8405, 2006,
+ 8639, 8405, 2030,
+ 8639, 8405, 2126,
+ 8639, 8405, 5152,
+ 8639, 8405, 5312,
+ 8639, 8916,
+ 8639, 9665, 4926,
+ 8639, 10775, 5759, 14,
+ 8639, 10775, 5759, 26,
+ 8639, 10775, 5759, 34,
+ 8639, 10775, 5759, 400,
+ 8643, 8774,
+ 8649, 10001, 9967, 7607, 4153, 6434,
+ 8649, 10001, 9967, 9279, 10000,
+ 8668,
+ 8672,
+ 8679, 7593, 8,
+ 8679, 7593, 12,
+ 8679, 7593, 22,
+ 8679, 7593, 28,
+ 8679, 9063, 2,
+ 8679, 9063, 8,
+ 8679, 9063, 10,
+ 8679, 9063, 14,
+ 8679, 9063, 16,
+ 8679, 9063, 22,
+ 8679, 9063, 24,
+ 8679, 9063, 30,
+ 8679, 9063, 34,
+ 8684,
+ 8691, 1044,
+ 8717, 7119, 11195, 4926,
+ 8717, 12967, 6409, 11195, 4926,
+ 8717, 13067, 6409, 11195, 4926,
+ 8717, 13201, 11195, 4926,
+ 8745, 1, 5387, 24,
+ 8745, 5, 5387, 312,
+ 8745, 21, 2162,
+ 8745, 25, 2162,
+ 8745, 25, 5387, 36,
+ 8745, 25, 5387, 37, 9732,
+ 8745, 25, 6624,
+ 8745, 25, 9732,
+ 8745, 43, 5387, 24,
+ 8745, 78,
+ 8745, 92,
+ 8745, 110,
+ 8745, 118,
+ 8745, 120,
+ 8745, 128,
+ 8745, 129, 6624,
+ 8745, 129, 9732,
+ 8745, 130,
+ 8745, 138,
+ 8745, 140,
+ 8745, 146,
+ 8745, 148,
+ 8745, 149, 6624,
+ 8745, 149, 9732,
+ 8745, 190,
+ 8745, 206,
+ 8745, 218,
+ 8745, 234,
+ 8745, 236,
+ 8745, 240,
+ 8745, 248,
+ 8745, 254,
+ 8745, 274,
+ 8745, 286,
+ 8745, 306,
+ 8745, 308,
+ 8745, 312,
+ 8745, 316,
+ 8745, 318,
+ 8745, 320,
+ 8745, 321, 6624,
+ 8745, 321, 9062,
+ 8745, 321, 9732,
+ 8745, 324,
+ 8745, 328,
+ 8745, 330,
+ 8745, 346,
+ 8745, 348,
+ 8745, 358,
+ 8745, 364,
+ 8745, 366,
+ 8745, 367, 7592,
+ 8745, 370,
+ 8745, 376,
+ 8745, 378,
+ 8745, 379, 6624,
+ 8745, 379, 9732,
+ 8745, 382,
+ 8745, 385, 0,
+ 8745, 385, 10,
+ 8745, 385, 12,
+ 8745, 385, 22,
+ 8745, 385, 24,
+ 8745, 385, 36,
+ 8745, 385, 42,
+ 8745, 385, 44,
+ 8745, 386,
+ 8745, 387, 4946,
+ 8745, 388,
+ 8745, 389, 4946,
+ 8745, 392,
+ 8745, 398,
+ 8745, 408,
+ 8745, 414,
+ 8745, 418,
+ 8745, 420,
+ 8745, 452,
+ 8745, 462,
+ 8745, 463, 3260,
+ 8745, 464,
+ 8745, 470,
+ 8745, 474,
+ 8745, 478,
+ 8745, 482,
+ 8745, 484,
+ 8745, 488,
+ 8745, 490,
+ 8745, 540,
+ 8745, 548,
+ 8745, 624,
+ 8745, 760,
+ 8745, 856,
+ 8745, 860,
+ 8745, 928,
+ 8745, 1117, 5047, 7142,
+ 8745, 1117, 5047, 8294,
+ 8745, 1117, 5047, 8778,
+ 8745, 1117, 5047, 9762,
+ 8745, 1118,
+ 8745, 1212,
+ 8745, 1270,
+ 8745, 1298,
+ 8745, 1422,
+ 8745, 1432,
+ 8745, 1622,
+ 8745, 1668,
+ 8745, 1800,
+ 8745, 1908,
+ 8745, 1918,
+ 8745, 1934,
+ 8745, 1946,
+ 8745, 2248,
+ 8745, 2382,
+ 8745, 2383, 5387, 36,
+ 8745, 2383, 5387, 37, 9732,
+ 8745, 2688,
+ 8745, 2720,
+ 8745, 2816,
+ 8745, 3224,
+ 8745, 3790,
+ 8745, 4062,
+ 8745, 4110,
+ 8745, 4208,
+ 8745, 4332,
+ 8745, 4532,
+ 8745, 4612,
+ 8745, 4732,
+ 8745, 4762,
+ 8745, 4849, 5385, 827, 10374,
+ 8745, 4946,
+ 8745, 5008,
+ 8745, 5052,
+ 8745, 5378,
+ 8745, 5380,
+ 8745, 5408,
+ 8745, 5430,
+ 8745, 5534,
+ 8745, 5552,
+ 8745, 5566,
+ 8745, 6121, 2725, 4389, 6504,
+ 8745, 6121, 4849, 4389, 6504,
+ 8745, 6121, 7121, 4849, 10001, 4389, 6504,
+ 8745, 6121, 7121, 7443, 10001, 4389, 6504,
+ 8745, 6121, 7443, 4389, 6504,
+ 8745, 6121, 7773, 4849, 569, 7121, 7443, 4192,
+ 8745, 6121, 7773, 4849, 10001, 4389, 6504,
+ 8745, 6121, 7773, 7443, 569, 7121, 4849, 4192,
+ 8745, 6121, 7773, 7443, 10001, 4389, 6504,
+ 8745, 6121, 8005, 4389, 6504,
+ 8745, 6121, 10001, 11469, 4192,
+ 8745, 6121, 10677, 4192,
+ 8745, 6121, 10779, 9544,
+ 8745, 6121, 11649, 4192,
+ 8745, 6121, 11707, 11469, 4192,
+ 8745, 6234,
+ 8745, 6410,
+ 8745, 6482,
+ 8745, 6630,
+ 8745, 6718,
+ 8745, 6826,
+ 8745, 6828,
+ 8745, 6858,
+ 8745, 6892,
+ 8745, 6950,
+ 8745, 6958,
+ 8745, 6989, 428,
+ 8745, 6989, 429, 445, 2091, 6741, 568,
+ 8745, 6989, 429, 445, 6741, 568,
+ 8745, 7018,
+ 8745, 7034,
+ 8745, 7060,
+ 8745, 7126,
+ 8745, 7128,
+ 8745, 7276,
+ 8745, 7330,
+ 8745, 7352,
+ 8745, 7360,
+ 8745, 7384,
+ 8745, 7443, 5385, 827, 10374,
+ 8745, 7470,
+ 8745, 7504,
+ 8745, 7506,
+ 8745, 7814,
+ 8745, 7840,
+ 8745, 7842,
+ 8745, 7926,
+ 8745, 7950,
+ 8745, 8002,
+ 8745, 8274,
+ 8745, 8300,
+ 8745, 8304,
+ 8745, 8314,
+ 8745, 8372,
+ 8745, 8378,
+ 8745, 8452,
+ 8745, 8572,
+ 8745, 8588,
+ 8745, 8604,
+ 8745, 9016,
+ 8745, 9308,
+ 8745, 9388,
+ 8745, 9390,
+ 8745, 9416,
+ 8745, 9438,
+ 8745, 9444,
+ 8745, 9454,
+ 8745, 9468,
+ 8745, 9470,
+ 8745, 9476,
+ 8745, 9636,
+ 8745, 9646,
+ 8745, 9648,
+ 8745, 9698,
+ 8745, 9926,
+ 8745, 10166,
+ 8745, 10244,
+ 8745, 10379, 428,
+ 8745, 10379, 429, 445, 2091, 6741, 568,
+ 8745, 10379, 429, 445, 6741, 568,
+ 8745, 10392,
+ 8745, 10480,
+ 8745, 10496,
+ 8745, 11028,
+ 8745, 11032,
+ 8745, 11080,
+ 8745, 11084,
+ 8745, 11120,
+ 8745, 11170,
+ 8745, 11668,
+ 8745, 11918,
+ 8745, 12068,
+ 8755, 10385, 7821, 5830,
+ 8763, 428,
+ 8763, 429, 445, 6741, 568,
+ 8763, 429, 445, 6741, 569, 6121, 1045, 6376,
+ 8763, 429, 6121, 2091, 6741, 568,
+ 8763, 429, 6377, 2091, 6741, 568,
+ 8763, 429, 6377, 7709, 10374,
+ 8763, 429, 6377, 7919, 6741, 568,
+ 8763, 429, 6377, 8167, 5758,
+ 8763, 6121, 1044,
+ 8763, 6121, 5445, 5759, 6490,
+ 8763, 6121, 13061, 5759, 6490,
+ 8763, 6377, 8762,
+ 8763, 6377, 10578,
+ 8763, 6377, 11765, 6434,
+ 8773, 7207, 5759, 9328,
+ 8773, 7207, 5759, 9870,
+ 8773, 7207, 5759, 10148,
+ 8773, 7207, 7803, 5759, 0,
+ 8773, 7207, 7803, 5759, 8,
+ 8773, 7207, 7803, 5759, 16,
+ 8773, 7207, 7803, 5759, 40,
+ 8773, 7207, 7803, 5759, 440,
+ 8773, 7207, 8405, 0,
+ 8773, 7207, 8405, 8,
+ 8773, 7207, 8405, 16,
+ 8773, 7207, 8405, 28,
+ 8773, 7207, 8405, 40,
+ 8773, 7207, 8405, 108,
+ 8773, 7207, 8405, 130,
+ 8773, 7207, 8405, 150,
+ 8773, 7207, 8405, 228,
+ 8773, 7207, 8405, 246,
+ 8773, 7207, 8405, 298,
+ 8773, 7207, 8405, 322,
+ 8773, 7207, 8405, 350,
+ 8773, 7207, 8405, 380,
+ 8773, 7207, 8405, 412,
+ 8773, 7207, 8405, 480,
+ 8773, 7207, 8405, 516,
+ 8773, 7207, 8405, 536,
+ 8773, 7207, 8405, 568,
+ 8773, 7207, 8405, 798,
+ 8773, 7207, 8405, 890,
+ 8773, 7207, 8405, 980,
+ 8773, 7207, 8405, 1002,
+ 8773, 7207, 8405, 1266,
+ 8773, 7207, 8405, 1514,
+ 8773, 7207, 8405, 1618,
+ 8773, 7207, 8405, 2218,
+ 8773, 7207, 8405, 2442,
+ 8773, 7207, 8405, 2684,
+ 8773, 7207, 8405, 2754,
+ 8773, 7207, 8405, 4018,
+ 8773, 7207, 8405, 6000,
+ 8773, 7207, 8603, 8442,
+ 8773, 7207, 8603, 8444,
+ 8773, 7207, 8603, 8446,
+ 8773, 7207, 8603, 8448,
+ 8775, 1177, 1109, 429, 5904,
+ 8775, 1177, 1109, 429, 8462,
+ 8775, 1177, 1109, 429, 12886,
+ 8775, 1177, 1109, 429, 12887, 6510,
+ 8775, 1177, 3768,
+ 8775, 1177, 3995, 4881, 8168,
+ 8775, 1177, 4191, 11228,
+ 8775, 1177, 4213, 4182,
+ 8775, 1177, 4877, 4182,
+ 8775, 1177, 5280,
+ 8775, 1177, 6053, 11228,
+ 8775, 1177, 6883, 11228,
+ 8775, 1177, 7539, 274,
+ 8775, 1177, 7539, 2186,
+ 8775, 1177, 7608,
+ 8775, 1177, 7633, 429, 5904,
+ 8775, 1177, 7633, 429, 9334,
+ 8775, 1177, 8026,
+ 8775, 1177, 8102,
+ 8775, 1177, 8103, 4213, 2778,
+ 8775, 1177, 8109, 9117, 2170,
+ 8775, 1177, 8109, 9117, 2778,
+ 8775, 1177, 8109, 9117, 4214,
+ 8775, 1177, 8109, 9117, 7694,
+ 8775, 1177, 8168,
+ 8775, 1177, 8637, 11228,
+ 8775, 1177, 9268,
+ 8775, 1177, 9502,
+ 8775, 1177, 9933, 8642,
+ 8775, 1177, 10357, 11884,
+ 8775, 1177, 10677, 11846,
+ 8775, 1177, 10730,
+ 8775, 1177, 11219, 8724,
+ 8775, 1177, 11649, 11846,
+ 8775, 1177, 11840,
+ 8775, 1177, 11841, 4213, 2778,
+ 8775, 1177, 11884,
+ 8775, 1177, 12359, 4598,
+ 8781, 1109, 429, 11162,
+ 8781, 2779, 10677, 4113, 6376,
+ 8781, 2779, 10677, 4113, 6490,
+ 8781, 6611, 8721, 4848,
+ 8781, 6611, 8721, 7442,
+ 8781, 6751, 6376,
+ 8781, 6751, 6490,
+ 8781, 6905, 6376,
+ 8781, 6905, 6490,
+ 8781, 7198,
+ 8781, 7427, 6376,
+ 8781, 7427, 6490,
+ 8781, 7472,
+ 8781, 7695, 4113, 6376,
+ 8781, 7695, 4113, 6490,
+ 8781, 8151, 7889, 8996,
+ 8781, 8151, 7889, 11648,
+ 8781, 8405, 8,
+ 8781, 8405, 238,
+ 8781, 8405, 468,
+ 8781, 8405, 1920,
+ 8781, 8405, 2110,
+ 8781, 8405, 2662,
+ 8781, 8405, 2918,
+ 8781, 8405, 3776,
+ 8781, 8405, 4410,
+ 8781, 8405, 4724,
+ 8781, 8405, 5476,
+ 8781, 8405, 5554,
+ 8781, 8405, 5698,
+ 8781, 8405, 5902,
+ 8781, 8405, 5903, 10214,
+ 8781, 8405, 6236,
+ 8781, 8405, 6237, 238,
+ 8781, 8405, 6254,
+ 8781, 8405, 6394,
+ 8781, 8405, 6789, 9668,
+ 8781, 8405, 6820,
+ 8781, 8405, 6821, 10214,
+ 8781, 8405, 7474,
+ 8781, 8405, 8090,
+ 8781, 8405, 8384,
+ 8781, 8405, 9185, 8091, 5554,
+ 8781, 8405, 9583, 6496,
+ 8781, 8405, 9583, 8258,
+ 8781, 8405, 9583, 9156,
+ 8781, 8405, 9668,
+ 8781, 8405, 9717, 198,
+ 8781, 8405, 9717, 7046,
+ 8781, 8405, 9717, 7874,
+ 8781, 8405, 10489, 468,
+ 8781, 8405, 12355, 6394,
+ 8781, 8617, 6376,
+ 8781, 8617, 6490,
+ 8781, 8617, 8150,
+ 8781, 8965, 6376,
+ 8781, 8965, 6490,
+ 8781, 8965, 8150,
+ 8781, 9024,
+ 8781, 9525, 4877, 6376,
+ 8781, 9525, 4877, 6490,
+ 8781, 10179, 1044,
+ 8781, 10235, 8530,
+ 8781, 10235, 11118,
+ 8781, 10235, 11432,
+ 8781, 10490,
+ 8781, 11196,
+ 8781, 11259, 4223, 5836,
+ 8781, 11259, 6610,
+ 8781, 11259, 6611, 8721, 7442,
+ 8781, 11649, 6610,
+ 8781, 11914,
+ 8781, 12031, 8150,
+ 8781, 12357, 4223, 5836,
+ 8781, 12357, 6610,
+ 8781, 12357, 6611, 8721, 4848,
+ 8781, 12391, 4926,
+ 8794,
+ 8803, 73, 8399, 4926,
+ 8803, 5759, 7756,
+ 8803, 5759, 8916,
+ 8803, 5759, 9824,
+ 8803, 5759, 9870,
+ 8803, 5759, 9904,
+ 8803, 5759, 11900,
+ 8803, 6689, 2170,
+ 8803, 6689, 2540,
+ 8803, 6689, 2778,
+ 8803, 6689, 4200,
+ 8803, 6689, 4214,
+ 8803, 6689, 5190,
+ 8803, 6689, 6260,
+ 8803, 6689, 6722,
+ 8803, 6689, 7508,
+ 8803, 6689, 7694,
+ 8803, 7803, 5759, 8,
+ 8803, 7803, 5759, 16,
+ 8803, 7803, 5759, 28,
+ 8803, 7803, 5759, 40,
+ 8803, 7803, 5759, 58,
+ 8803, 7803, 5759, 72,
+ 8803, 7803, 5759, 92,
+ 8803, 7803, 5759, 162,
+ 8803, 7803, 5759, 266,
+ 8803, 7803, 5759, 440,
+ 8803, 7803, 5759, 606,
+ 8803, 7803, 5759, 9827, 22,
+ 8803, 7803, 5759, 9827, 34,
+ 8803, 7803, 5759, 9827, 344,
+ 8803, 7803, 5759, 9827, 518,
+ 8803, 8399, 4926,
+ 8803, 8405, 0,
+ 8803, 8405, 8,
+ 8803, 8405, 16,
+ 8803, 8405, 28,
+ 8803, 8405, 40,
+ 8803, 8405, 58,
+ 8803, 8405, 72,
+ 8803, 8405, 92,
+ 8803, 8405, 100,
+ 8803, 8405, 116,
+ 8803, 8405, 138,
+ 8803, 8405, 162,
+ 8803, 8405, 216,
+ 8803, 8405, 236,
+ 8803, 8405, 266,
+ 8803, 8405, 292,
+ 8803, 8405, 306,
+ 8803, 8405, 332,
+ 8803, 8405, 364,
+ 8803, 8405, 392,
+ 8803, 8405, 440,
+ 8803, 8405, 462,
+ 8803, 8405, 510,
+ 8803, 8405, 524,
+ 8803, 8405, 556,
+ 8803, 8405, 606,
+ 8803, 8405, 610,
+ 8803, 8405, 652,
+ 8803, 8405, 792,
+ 8803, 8405, 884,
+ 8803, 8405, 974,
+ 8803, 8405, 996,
+ 8803, 8405, 1080,
+ 8803, 8405, 1260,
+ 8803, 8405, 1512,
+ 8803, 8405, 1612,
+ 8803, 8405, 1796,
+ 8803, 8405, 2030,
+ 8803, 8405, 2076,
+ 8803, 8405, 2126,
+ 8803, 8405, 2212,
+ 8803, 8405, 2438,
+ 8803, 8405, 2516,
+ 8803, 8405, 2566,
+ 8803, 8405, 2678,
+ 8803, 8405, 2732,
+ 8803, 8405, 2746,
+ 8803, 8405, 4016,
+ 8803, 8405, 5994,
+ 8803, 8405, 9827, 22,
+ 8803, 8405, 9827, 34,
+ 8803, 8405, 9827, 344,
+ 8803, 8405, 9827, 518,
+ 8803, 10203, 6689, 2171, 1177, 2161, 8611, 429, 4214,
+ 8803, 10203, 6689, 2171, 1177, 4173, 8611, 429, 4214,
+ 8803, 10203, 6689, 2779, 1177, 2161, 8611, 429, 4214,
+ 8803, 10203, 6689, 2779, 1177, 4173, 8611, 429, 4214,
+ 8803, 10203, 6689, 6261, 1177, 2161, 8611, 429, 4214,
+ 8803, 10203, 6689, 7695, 1177, 2161, 8611, 429, 4214,
+ 8803, 10203, 6689, 7695, 1177, 4173, 8611, 429, 4214,
+ 8811, 7650,
+ 8811, 8405, 568,
+ 8811, 8405, 678,
+ 8811, 8405, 748,
+ 8811, 8405, 1338,
+ 8811, 8405, 1982,
+ 8811, 8405, 2378,
+ 8811, 8405, 3006,
+ 8811, 8405, 3120,
+ 8811, 8405, 3240,
+ 8811, 8405, 4412,
+ 8811, 8405, 4734,
+ 8811, 8405, 5906,
+ 8811, 8405, 5988,
+ 8811, 8405, 6402,
+ 8811, 8405, 6766,
+ 8811, 8405, 6814,
+ 8811, 8405, 7016,
+ 8811, 8405, 7070,
+ 8811, 8405, 7140,
+ 8811, 8405, 7268,
+ 8811, 8405, 7400,
+ 8811, 8405, 7498,
+ 8811, 8405, 7780,
+ 8811, 8405, 7806,
+ 8811, 8405, 8084,
+ 8811, 8405, 8110,
+ 8811, 8405, 8256,
+ 8811, 8405, 8656,
+ 8811, 8405, 8698,
+ 8811, 8405, 8808,
+ 8811, 8405, 9986,
+ 8811, 8405, 10278,
+ 8811, 8405, 10414,
+ 8811, 8405, 10612,
+ 8811, 8405, 10690,
+ 8811, 8405, 10760,
+ 8811, 8405, 11020,
+ 8811, 8405, 11100,
+ 8811, 8405, 11236,
+ 8811, 8968,
+ 8811, 9254,
+ 8811, 9348,
+ 8811, 9526,
+ 8811, 9804,
+ 8811, 10694,
+ 8811, 10964,
+ 8811, 10986,
+ 8811, 11144,
+ 8811, 11146,
+ 8849, 5444,
+ 8849, 6611, 10374,
+ 8849, 7390,
+ 8849, 7708,
+ 8849, 8509, 11098,
+ 8849, 8509, 12472,
+ 8849, 9719, 7995, 10476,
+ 8849, 10260,
+ 8849, 10677, 761, 6121, 11649, 8758,
+ 8849, 10677, 761, 7443, 11378,
+ 8849, 10677, 761, 7995, 10476,
+ 8849, 10677, 761, 10794,
+ 8849, 11649, 761, 6121, 8153, 10677, 8758,
+ 8849, 11649, 761, 6121, 8849, 10677, 8758,
+ 8865, 5758,
+ 8869, 2091, 5758,
+ 8869, 6408,
+ 8869, 6879, 7593, 8405, 4614,
+ 8869, 7593, 10,
+ 8869, 9063, 10,
+ 8869, 10708,
+ 8869, 11767, 9063, 12,
+ 8869, 11767, 9063, 22,
+ 8869, 11767, 9063, 48,
+ 8875, 9601, 6505, 5830,
+ 8900,
+ 8913, 445, 6623, 9610,
+ 8923, 10260,
+ 8927, 10203, 2171, 4388,
+ 8927, 10203, 2171, 6782,
+ 8927, 10203, 2171, 7574,
+ 8927, 10203, 2171, 7686,
+ 8927, 10203, 2171, 8158,
+ 8927, 10203, 2171, 9614,
+ 8927, 10203, 2779, 8200,
+ 8927, 10203, 2779, 8818,
+ 8927, 10203, 4201, 8718,
+ 8927, 10203, 4201, 9258,
+ 8927, 10203, 4215, 8200,
+ 8927, 10203, 7509, 9258,
+ 8927, 10203, 7695, 8200,
+ 8927, 10203, 7695, 9258,
+ 8927, 10203, 7695, 10466,
+ 8939, 9610,
+ 8975, 428,
+ 8981, 5758,
+ 8990,
+ 9011, 5758,
+ 9034,
+ 9039, 93, 8399, 4926,
+ 9039, 5759, 7282,
+ 9039, 5759, 8916,
+ 9039, 5759, 9824,
+ 9039, 5759, 9870,
+ 9039, 5759, 9904,
+ 9039, 5759, 11900,
+ 9039, 6689, 2170,
+ 9039, 6689, 2540,
+ 9039, 6689, 2778,
+ 9039, 6689, 4200,
+ 9039, 6689, 4214,
+ 9039, 6689, 5190,
+ 9039, 6689, 6260,
+ 9039, 6689, 6722,
+ 9039, 6689, 7508,
+ 9039, 6689, 7694,
+ 9039, 7469, 4926,
+ 9039, 7469, 5758,
+ 9039, 7803, 5759, 8,
+ 9039, 7803, 5759, 16,
+ 9039, 7803, 5759, 28,
+ 9039, 7803, 5759, 40,
+ 9039, 7803, 5759, 58,
+ 9039, 7803, 5759, 72,
+ 9039, 7803, 5759, 92,
+ 9039, 7803, 5759, 266,
+ 9039, 7803, 5759, 606,
+ 9039, 7803, 5759, 9827, 22,
+ 9039, 7803, 5759, 9827, 34,
+ 9039, 7803, 5759, 9827, 344,
+ 9039, 7803, 5759, 9827, 518,
+ 9039, 8322,
+ 9039, 8405, 0,
+ 9039, 8405, 8,
+ 9039, 8405, 16,
+ 9039, 8405, 28,
+ 9039, 8405, 40,
+ 9039, 8405, 58,
+ 9039, 8405, 72,
+ 9039, 8405, 92,
+ 9039, 8405, 100,
+ 9039, 8405, 116,
+ 9039, 8405, 138,
+ 9039, 8405, 216,
+ 9039, 8405, 236,
+ 9039, 8405, 266,
+ 9039, 8405, 292,
+ 9039, 8405, 306,
+ 9039, 8405, 332,
+ 9039, 8405, 364,
+ 9039, 8405, 392,
+ 9039, 8405, 462,
+ 9039, 8405, 510,
+ 9039, 8405, 511, 6121, 7121, 10000,
+ 9039, 8405, 511, 6121, 8473, 10000,
+ 9039, 8405, 524,
+ 9039, 8405, 556,
+ 9039, 8405, 606,
+ 9039, 8405, 652,
+ 9039, 8405, 792,
+ 9039, 8405, 884,
+ 9039, 8405, 974,
+ 9039, 8405, 996,
+ 9039, 8405, 1260,
+ 9039, 8405, 1512,
+ 9039, 8405, 1612,
+ 9039, 8405, 2030,
+ 9039, 8405, 2076,
+ 9039, 8405, 2126,
+ 9039, 8405, 2212,
+ 9039, 8405, 2410,
+ 9039, 8405, 2438,
+ 9039, 8405, 2516,
+ 9039, 8405, 2566,
+ 9039, 8405, 2678,
+ 9039, 8405, 2746,
+ 9039, 8405, 3110,
+ 9039, 8405, 4016,
+ 9039, 8405, 5994,
+ 9039, 8405, 8357, 556,
+ 9039, 8405, 9827, 22,
+ 9039, 8405, 9827, 34,
+ 9039, 8405, 9827, 344,
+ 9039, 8405, 9827, 518,
+ 9039, 9971, 11143, 2170,
+ 9039, 9971, 11143, 2171, 4853, 5913, 2681, 11932,
+ 9039, 9971, 11143, 2778,
+ 9039, 9971, 11143, 4214,
+ 9039, 9971, 11143, 7694,
+ 9039, 9971, 11933, 9700,
+ 9041, 5550,
+ 9041, 5551, 6121, 8056,
+ 9042,
+ 9053, 9575, 6508,
+ 9053, 9575, 8134,
+ 9053, 9575, 8136,
+ 9053, 9575, 8138,
+ 9053, 9575, 8140,
+ 9053, 9575, 8142,
+ 9053, 9575, 8144,
+ 9053, 9575, 8146,
+ 9053, 9575, 8148,
+ 9053, 9575, 9186,
+ 9053, 9575, 9188,
+ 9053, 9575, 9190,
+ 9053, 9575, 9192,
+ 9053, 9575, 9194,
+ 9053, 9575, 9196,
+ 9053, 9575, 9198,
+ 9053, 9575, 9200,
+ 9053, 9575, 9202,
+ 9053, 9575, 9204,
+ 9053, 9575, 9206,
+ 9053, 9575, 9208,
+ 9053, 9575, 9210,
+ 9053, 9575, 9212,
+ 9053, 9575, 9214,
+ 9053, 9575, 9216,
+ 9053, 9575, 9218,
+ 9053, 9575, 9220,
+ 9053, 9575, 9222,
+ 9053, 9575, 9224,
+ 9053, 9575, 9226,
+ 9053, 9575, 9228,
+ 9053, 9575, 9230,
+ 9053, 9575, 9232,
+ 9053, 9575, 9234,
+ 9053, 9575, 9236,
+ 9053, 9575, 9238,
+ 9053, 9575, 9240,
+ 9053, 9575, 10020,
+ 9053, 9575, 10022,
+ 9053, 9575, 10024,
+ 9053, 9575, 10026,
+ 9053, 9575, 10028,
+ 9053, 9575, 10030,
+ 9053, 9575, 10032,
+ 9053, 9575, 10034,
+ 9053, 9575, 10036,
+ 9053, 9575, 10038,
+ 9053, 9575, 10040,
+ 9053, 9575, 10042,
+ 9053, 9575, 10044,
+ 9053, 9575, 10046,
+ 9053, 9575, 10048,
+ 9053, 9575, 10050,
+ 9053, 9575, 10052,
+ 9053, 9575, 10054,
+ 9053, 9575, 10056,
+ 9053, 9575, 10058,
+ 9053, 9575, 10060,
+ 9053, 9575, 10062,
+ 9053, 9575, 10064,
+ 9053, 9575, 10066,
+ 9053, 9575, 10068,
+ 9053, 9575, 10070,
+ 9053, 9575, 10072,
+ 9053, 9575, 10074,
+ 9053, 9575, 10076,
+ 9053, 9575, 10078,
+ 9053, 9575, 10080,
+ 9053, 9575, 10082,
+ 9053, 9575, 10084,
+ 9053, 9575, 10086,
+ 9053, 9575, 10088,
+ 9053, 9575, 10090,
+ 9053, 9575, 10092,
+ 9053, 9575, 10094,
+ 9053, 9575, 10096,
+ 9053, 9575, 10098,
+ 9053, 9575, 10100,
+ 9053, 9575, 10102,
+ 9053, 9575, 10104,
+ 9053, 9575, 10106,
+ 9053, 9575, 10108,
+ 9053, 9575, 10110,
+ 9053, 9575, 10112,
+ 9053, 9575, 10114,
+ 9053, 9575, 10116,
+ 9053, 9575, 10118,
+ 9053, 9575, 10120,
+ 9053, 9575, 10122,
+ 9053, 9575, 10124,
+ 9053, 9575, 10126,
+ 9053, 9575, 10128,
+ 9053, 9575, 10130,
+ 9053, 9575, 10818,
+ 9053, 9575, 10820,
+ 9053, 9575, 10822,
+ 9053, 9575, 10824,
+ 9053, 9575, 10826,
+ 9053, 9575, 10828,
+ 9053, 9575, 10830,
+ 9053, 9575, 10832,
+ 9053, 9575, 10834,
+ 9053, 9575, 10836,
+ 9053, 9575, 10838,
+ 9053, 9575, 10840,
+ 9053, 9575, 10842,
+ 9053, 9575, 10844,
+ 9053, 9575, 10846,
+ 9053, 9575, 10848,
+ 9053, 9575, 10850,
+ 9053, 9575, 10852,
+ 9053, 9575, 10854,
+ 9053, 9575, 10856,
+ 9053, 9575, 10858,
+ 9053, 9575, 10860,
+ 9053, 9575, 10862,
+ 9053, 9575, 10864,
+ 9053, 9575, 10866,
+ 9053, 9575, 10868,
+ 9053, 9575, 10870,
+ 9053, 9575, 10872,
+ 9053, 9575, 10874,
+ 9053, 9575, 10876,
+ 9053, 9575, 10878,
+ 9053, 9575, 10880,
+ 9053, 9575, 10882,
+ 9053, 9575, 10884,
+ 9053, 9575, 10886,
+ 9053, 9575, 10888,
+ 9053, 9575, 10890,
+ 9053, 9575, 10892,
+ 9053, 9575, 10894,
+ 9053, 9575, 10896,
+ 9053, 9575, 10898,
+ 9053, 9575, 10900,
+ 9053, 9575, 10902,
+ 9053, 9575, 10904,
+ 9053, 9575, 10906,
+ 9053, 9575, 10908,
+ 9053, 9575, 10910,
+ 9053, 9575, 10912,
+ 9053, 9575, 10914,
+ 9053, 9575, 10916,
+ 9053, 9575, 10918,
+ 9053, 9575, 10920,
+ 9053, 9575, 10922,
+ 9053, 9575, 10924,
+ 9053, 9575, 10926,
+ 9053, 9575, 10928,
+ 9053, 9575, 10930,
+ 9053, 9575, 10932,
+ 9053, 9575, 10934,
+ 9053, 9575, 10936,
+ 9053, 9575, 10938,
+ 9053, 9575, 10940,
+ 9053, 9575, 10942,
+ 9053, 9575, 10944,
+ 9053, 9575, 10946,
+ 9053, 9575, 10948,
+ 9053, 9575, 10950,
+ 9053, 9575, 10952,
+ 9053, 9575, 10954,
+ 9053, 9575, 10956,
+ 9053, 9575, 11490,
+ 9053, 9575, 11492,
+ 9053, 9575, 11494,
+ 9053, 9575, 11496,
+ 9053, 9575, 11498,
+ 9053, 9575, 11500,
+ 9053, 9575, 11502,
+ 9053, 9575, 11504,
+ 9053, 9575, 11506,
+ 9053, 9575, 11508,
+ 9053, 9575, 11510,
+ 9053, 9575, 11512,
+ 9053, 9575, 11514,
+ 9053, 9575, 11516,
+ 9053, 9575, 11518,
+ 9053, 9575, 11520,
+ 9053, 9575, 11522,
+ 9053, 9575, 11524,
+ 9053, 9575, 11526,
+ 9053, 9575, 11528,
+ 9053, 9575, 11530,
+ 9053, 9575, 11532,
+ 9053, 9575, 11534,
+ 9053, 9575, 11536,
+ 9053, 9575, 11538,
+ 9053, 9575, 11540,
+ 9053, 9575, 11542,
+ 9053, 9575, 11544,
+ 9053, 9575, 11546,
+ 9053, 9575, 11548,
+ 9053, 9575, 11550,
+ 9053, 9575, 11552,
+ 9053, 9575, 11554,
+ 9053, 9575, 11556,
+ 9053, 9575, 11558,
+ 9053, 9575, 11560,
+ 9053, 9575, 11562,
+ 9053, 9575, 11564,
+ 9053, 9575, 11566,
+ 9053, 9575, 11568,
+ 9053, 9575, 11570,
+ 9053, 9575, 11572,
+ 9053, 9575, 11574,
+ 9053, 9575, 11576,
+ 9053, 9575, 11578,
+ 9053, 9575, 11580,
+ 9053, 9575, 11582,
+ 9053, 9575, 11584,
+ 9053, 9575, 11586,
+ 9053, 9575, 11588,
+ 9053, 9575, 11590,
+ 9053, 9575, 11592,
+ 9053, 9575, 11594,
+ 9053, 9575, 11596,
+ 9053, 9575, 11598,
+ 9053, 9575, 11600,
+ 9053, 9575, 11950,
+ 9053, 9575, 11952,
+ 9053, 9575, 11954,
+ 9053, 9575, 11956,
+ 9053, 9575, 11958,
+ 9053, 9575, 11960,
+ 9053, 9575, 11962,
+ 9053, 9575, 11964,
+ 9053, 9575, 11966,
+ 9053, 9575, 11968,
+ 9053, 9575, 11970,
+ 9053, 9575, 11972,
+ 9053, 9575, 11974,
+ 9053, 9575, 11976,
+ 9053, 9575, 11978,
+ 9053, 9575, 11980,
+ 9053, 9575, 11982,
+ 9053, 9575, 11984,
+ 9053, 9575, 11986,
+ 9053, 9575, 11988,
+ 9053, 9575, 11990,
+ 9053, 9575, 11992,
+ 9053, 9575, 11994,
+ 9053, 9575, 11996,
+ 9053, 9575, 11998,
+ 9053, 9575, 12000,
+ 9053, 9575, 12002,
+ 9053, 9575, 12004,
+ 9053, 9575, 12444,
+ 9053, 9575, 12446,
+ 9053, 9575, 12448,
+ 9053, 9575, 12450,
+ 9053, 9575, 12452,
+ 9053, 9575, 12454,
+ 9053, 9575, 12456,
+ 9053, 9575, 12458,
+ 9053, 9575, 12926,
+ 9069, 5758,
+ 9072,
+ 9095, 1045, 10374,
+ 9095, 3992,
+ 9095, 5385, 8037, 6723, 9601, 5830,
+ 9095, 5444,
+ 9095, 5551, 10374,
+ 9095, 6689, 2170,
+ 9095, 6689, 2540,
+ 9095, 6689, 2778,
+ 9095, 6689, 4200,
+ 9095, 6689, 4214,
+ 9095, 6689, 5190,
+ 9095, 6689, 6260,
+ 9095, 6689, 6722,
+ 9095, 6689, 7508,
+ 9095, 6689, 7694,
+ 9095, 6909, 7821, 11765, 6434,
+ 9095, 7089, 7593, 8405, 0,
+ 9095, 7089, 7593, 8405, 2,
+ 9095, 7089, 7593, 8405, 4,
+ 9095, 7089, 7593, 8405, 6,
+ 9095, 7089, 7593, 8405, 8,
+ 9095, 7089, 7593, 8405, 10,
+ 9095, 7089, 7593, 8405, 12,
+ 9095, 7089, 7593, 8405, 14,
+ 9095, 7089, 7593, 8405, 16,
+ 9095, 7089, 7593, 8405, 18,
+ 9095, 7089, 7593, 8405, 20,
+ 9095, 7089, 7593, 8405, 22,
+ 9095, 7089, 7593, 8405, 24,
+ 9095, 7089, 7593, 8405, 26,
+ 9095, 7089, 7593, 8405, 28,
+ 9095, 7089, 7593, 8405, 30,
+ 9095, 7089, 7593, 8405, 32,
+ 9095, 7089, 7593, 8405, 34,
+ 9095, 7089, 7593, 8405, 36,
+ 9095, 7089, 7593, 8405, 38,
+ 9095, 7089, 7593, 8405, 40,
+ 9095, 7089, 7593, 8405, 42,
+ 9095, 7089, 7593, 8405, 44,
+ 9095, 7089, 7593, 8405, 46,
+ 9095, 7089, 7593, 8405, 48,
+ 9095, 7089, 7593, 8405, 50,
+ 9095, 7089, 9063, 8405, 0,
+ 9095, 7089, 9063, 8405, 2,
+ 9095, 7089, 9063, 8405, 4,
+ 9095, 7089, 9063, 8405, 6,
+ 9095, 7089, 9063, 8405, 8,
+ 9095, 7089, 9063, 8405, 10,
+ 9095, 7089, 9063, 8405, 12,
+ 9095, 7089, 9063, 8405, 14,
+ 9095, 7089, 9063, 8405, 16,
+ 9095, 7089, 9063, 8405, 18,
+ 9095, 7089, 9063, 8405, 20,
+ 9095, 7089, 9063, 8405, 22,
+ 9095, 7089, 9063, 8405, 24,
+ 9095, 7089, 9063, 8405, 26,
+ 9095, 7089, 9063, 8405, 28,
+ 9095, 7089, 9063, 8405, 30,
+ 9095, 7089, 9063, 8405, 32,
+ 9095, 7089, 9063, 8405, 34,
+ 9095, 7089, 9063, 8405, 36,
+ 9095, 7089, 9063, 8405, 38,
+ 9095, 7089, 9063, 8405, 40,
+ 9095, 7089, 9063, 8405, 42,
+ 9095, 7089, 9063, 8405, 44,
+ 9095, 7089, 9063, 8405, 46,
+ 9095, 7089, 9063, 8405, 48,
+ 9095, 7089, 9063, 8405, 50,
+ 9095, 7172,
+ 9095, 7710,
+ 9095, 7821, 5830,
+ 9095, 7821, 8022,
+ 9095, 8022,
+ 9095, 8166,
+ 9095, 8287, 5770,
+ 9095, 8287, 5771, 0,
+ 9095, 8287, 6594,
+ 9095, 8287, 6595, 0,
+ 9095, 8287, 6912,
+ 9095, 8287, 6913, 0,
+ 9095, 8287, 6982,
+ 9095, 8287, 6983, 0,
+ 9095, 8287, 6983, 40,
+ 9095, 8287, 7166,
+ 9095, 8287, 7167, 0,
+ 9095, 8287, 7244,
+ 9095, 8287, 7245, 0,
+ 9095, 8287, 7372,
+ 9095, 8287, 7373, 0,
+ 9095, 8287, 7440,
+ 9095, 8287, 7441, 0,
+ 9095, 8287, 8362,
+ 9095, 8287, 8363, 0,
+ 9095, 8287, 8828,
+ 9095, 8287, 8829, 0,
+ 9095, 8287, 9086,
+ 9095, 8287, 9087, 0,
+ 9095, 8287, 9400,
+ 9095, 8287, 9401, 0,
+ 9095, 8287, 9588,
+ 9095, 8287, 9589, 0,
+ 9095, 8287, 9780,
+ 9095, 8287, 9781, 0,
+ 9095, 8371, 10759, 7014,
+ 9095, 8371, 10759, 8040,
+ 9095, 8525, 2670,
+ 9095, 8525, 6784,
+ 9095, 8525, 6804,
+ 9095, 8525, 6805, 2170,
+ 9095, 8525, 6805, 2540,
+ 9095, 8525, 6805, 2778,
+ 9095, 8525, 6805, 4200,
+ 9095, 8525, 6805, 4214,
+ 9095, 8525, 6805, 5190,
+ 9095, 8525, 6805, 6722,
+ 9095, 8525, 6805, 7508,
+ 9095, 8525, 6805, 7694,
+ 9095, 8525, 8162,
+ 9095, 8525, 8820,
+ 9095, 8525, 8821, 2170,
+ 9095, 8525, 8821, 2540,
+ 9095, 8525, 8821, 2778,
+ 9095, 8525, 8821, 4200,
+ 9095, 8525, 8821, 4214,
+ 9095, 8525, 8821, 5190,
+ 9095, 8525, 8821, 6722,
+ 9095, 8525, 8821, 7508,
+ 9095, 8525, 8821, 7694,
+ 9095, 8525, 8874,
+ 9095, 8525, 8876,
+ 9095, 8525, 8877, 2170,
+ 9095, 8525, 8877, 2540,
+ 9095, 8525, 8877, 2778,
+ 9095, 8525, 8877, 4200,
+ 9095, 8525, 8877, 4214,
+ 9095, 8525, 8877, 5190,
+ 9095, 8525, 8877, 6722,
+ 9095, 8525, 8877, 7508,
+ 9095, 8525, 8877, 7694,
+ 9095, 8525, 9286,
+ 9095, 8525, 9700,
+ 9095, 8525, 10150,
+ 9095, 8525, 10200,
+ 9095, 8525, 10360,
+ 9095, 8525, 10622,
+ 9095, 8525, 11232,
+ 9095, 8609, 4926,
+ 9095, 9633, 9718,
+ 9095, 9899, 10374,
+ 9095, 10017, 5758,
+ 9095, 10017, 7580,
+ 9095, 10283, 0,
+ 9095, 10283, 8,
+ 9095, 10283, 16,
+ 9095, 10283, 28,
+ 9095, 10283, 40,
+ 9095, 10283, 236,
+ 9095, 10283, 238,
+ 9095, 10283, 242,
+ 9095, 10283, 246,
+ 9095, 10283, 250,
+ 9095, 10283, 306,
+ 9095, 10283, 310,
+ 9095, 10283, 314,
+ 9095, 10283, 322,
+ 9095, 10283, 326,
+ 9095, 10283, 364,
+ 9095, 10283, 368,
+ 9095, 10283, 374,
+ 9095, 10283, 380,
+ 9095, 10283, 384,
+ 9095, 10283, 392,
+ 9095, 10283, 396,
+ 9095, 10283, 404,
+ 9095, 10283, 412,
+ 9095, 10283, 416,
+ 9095, 10283, 510,
+ 9095, 10283, 512,
+ 9095, 10283, 514,
+ 9095, 10283, 516,
+ 9095, 10283, 520,
+ 9095, 10283, 524,
+ 9095, 10283, 526,
+ 9095, 10283, 532,
+ 9095, 10283, 536,
+ 9095, 10283, 546,
+ 9095, 10283, 556,
+ 9095, 10283, 560,
+ 9095, 10283, 564,
+ 9095, 10283, 568,
+ 9095, 10283, 576,
+ 9095, 10283, 622,
+ 9095, 10283, 626,
+ 9095, 10283, 630,
+ 9095, 10283, 632,
+ 9095, 10283, 652,
+ 9095, 10283, 660,
+ 9095, 10283, 664,
+ 9095, 10410,
+ 9095, 10643, 4116,
+ 9095, 10677, 760,
+ 9095, 11043, 1808,
+ 9095, 11043, 2170,
+ 9095, 11043, 2540,
+ 9095, 11043, 2586,
+ 9095, 11043, 2670,
+ 9095, 11043, 2778,
+ 9095, 11043, 3956,
+ 9095, 11043, 4194,
+ 9095, 11043, 4200,
+ 9095, 11043, 4214,
+ 9095, 11043, 4396,
+ 9095, 11043, 4422,
+ 9095, 11043, 4620,
+ 9095, 11043, 4848,
+ 9095, 11043, 4922,
+ 9095, 11043, 5012,
+ 9095, 11043, 5046,
+ 9095, 11043, 5190,
+ 9095, 11043, 5540,
+ 9095, 11043, 6122,
+ 9095, 11043, 6716,
+ 9095, 11043, 6722,
+ 9095, 11043, 7072,
+ 9095, 11043, 7146,
+ 9095, 11043, 7246,
+ 9095, 11043, 7392,
+ 9095, 11043, 7442,
+ 9095, 11043, 7508,
+ 9095, 11043, 7640,
+ 9095, 11043, 7646,
+ 9095, 11043, 7694,
+ 9095, 11043, 7812,
+ 9095, 11043, 8036,
+ 9095, 11043, 8196,
+ 9095, 11043, 8682,
+ 9095, 11043, 9122,
+ 9095, 11043, 9714,
+ 9095, 11043, 9724,
+ 9095, 11043, 9862,
+ 9095, 11043, 10328,
+ 9095, 11043, 10478,
+ 9095, 11043, 10484,
+ 9095, 11043, 10576,
+ 9095, 11043, 10726,
+ 9095, 11043, 10980,
+ 9095, 11043, 10992,
+ 9095, 11043, 11266,
+ 9095, 11043, 11612,
+ 9095, 11043, 13050,
+ 9095, 11098,
+ 9095, 11649, 761, 6121, 7272,
+ 9095, 12472,
+ 9095, 12990,
+ 9095, 13061, 5759, 6121, 11449, 7908,
+ 9095, 13411, 10017, 5758,
+ 9109, 7666,
+ 9115, 10260,
+ 9127, 8770,
+ 9137, 10585, 0,
+ 9137, 10585, 8,
+ 9137, 10585, 16,
+ 9137, 10585, 28,
+ 9137, 10585, 40,
+ 9137, 10585, 292,
+ 9137, 10585, 298,
+ 9137, 10585, 306,
+ 9137, 10585, 310,
+ 9137, 10585, 314,
+ 9137, 10585, 322,
+ 9137, 10585, 326,
+ 9137, 10585, 332,
+ 9137, 10585, 336,
+ 9137, 10585, 340,
+ 9137, 10585, 350,
+ 9137, 10585, 354,
+ 9137, 10585, 364,
+ 9137, 10585, 368,
+ 9137, 10585, 374,
+ 9137, 10585, 380,
+ 9137, 10585, 384,
+ 9137, 10585, 392,
+ 9137, 10585, 396,
+ 9137, 10585, 404,
+ 9137, 10585, 412,
+ 9137, 10585, 416,
+ 9137, 10585, 462,
+ 9137, 10585, 468,
+ 9137, 10585, 476,
+ 9137, 10585, 480,
+ 9137, 10585, 486,
+ 9137, 10585, 510,
+ 9137, 10585, 512,
+ 9137, 10585, 514,
+ 9137, 10585, 516,
+ 9137, 10585, 520,
+ 9137, 10585, 524,
+ 9137, 10585, 526,
+ 9137, 10585, 532,
+ 9137, 10585, 536,
+ 9137, 10585, 546,
+ 9137, 10585, 556,
+ 9137, 10585, 560,
+ 9137, 10585, 564,
+ 9137, 10585, 568,
+ 9137, 10585, 576,
+ 9137, 10585, 622,
+ 9137, 10585, 626,
+ 9137, 10585, 630,
+ 9137, 10585, 632,
+ 9137, 10585, 638,
+ 9137, 10585, 640,
+ 9137, 10585, 670,
+ 9137, 10585, 678,
+ 9151, 11229, 1611, 8774,
+ 9155, 7593, 8405, 14,
+ 9155, 7593, 8405, 98,
+ 9155, 7593, 8405, 164,
+ 9155, 7593, 8405, 172,
+ 9155, 7593, 8405, 174,
+ 9155, 7593, 8405, 176,
+ 9155, 7593, 8405, 182,
+ 9155, 7593, 8405, 184,
+ 9155, 7593, 8405, 192,
+ 9155, 7593, 8405, 432,
+ 9155, 7593, 8405, 454,
+ 9155, 7593, 8405, 634,
+ 9155, 7593, 8405, 778,
+ 9155, 7593, 8405, 984,
+ 9155, 7593, 8405, 1110,
+ 9155, 7593, 8405, 1124,
+ 9155, 7593, 8405, 1130,
+ 9155, 7593, 8405, 1226,
+ 9155, 7593, 8405, 1506,
+ 9155, 7593, 8405, 1596,
+ 9155, 7593, 8405, 2204,
+ 9155, 7593, 8405, 2666,
+ 9155, 7593, 8405, 2856,
+ 9155, 7593, 8405, 3050,
+ 9155, 7593, 8405, 3138,
+ 9155, 7593, 8405, 3890,
+ 9155, 7593, 8405, 4895, 0,
+ 9155, 7593, 8405, 4895, 8,
+ 9155, 7593, 8405, 4895, 16,
+ 9155, 7593, 8405, 4895, 28,
+ 9155, 7593, 8405, 4895, 70,
+ 9155, 7593, 8405, 4895, 440,
+ 9155, 7593, 8405, 5914,
+ 9155, 7593, 8405, 6274,
+ 9155, 7593, 8405, 7551, 0,
+ 9155, 7593, 8405, 7551, 8,
+ 9155, 7593, 8405, 7551, 16,
+ 9155, 7593, 8405, 7551, 28,
+ 9155, 7593, 8405, 7551, 70,
+ 9155, 7593, 8405, 7551, 440,
+ 9155, 9063, 8405, 14,
+ 9155, 9063, 8405, 98,
+ 9155, 9063, 8405, 164,
+ 9155, 9063, 8405, 172,
+ 9155, 9063, 8405, 174,
+ 9155, 9063, 8405, 176,
+ 9155, 9063, 8405, 182,
+ 9155, 9063, 8405, 184,
+ 9155, 9063, 8405, 192,
+ 9155, 9063, 8405, 432,
+ 9155, 9063, 8405, 454,
+ 9155, 9063, 8405, 634,
+ 9155, 9063, 8405, 778,
+ 9155, 9063, 8405, 984,
+ 9155, 9063, 8405, 1110,
+ 9155, 9063, 8405, 1124,
+ 9155, 9063, 8405, 1130,
+ 9155, 9063, 8405, 1226,
+ 9155, 9063, 8405, 1506,
+ 9155, 9063, 8405, 1596,
+ 9155, 9063, 8405, 2204,
+ 9155, 9063, 8405, 2666,
+ 9155, 9063, 8405, 2856,
+ 9155, 9063, 8405, 3050,
+ 9155, 9063, 8405, 3138,
+ 9155, 9063, 8405, 3890,
+ 9155, 9063, 8405, 4895, 0,
+ 9155, 9063, 8405, 4895, 8,
+ 9155, 9063, 8405, 4895, 16,
+ 9155, 9063, 8405, 4895, 28,
+ 9155, 9063, 8405, 4895, 70,
+ 9155, 9063, 8405, 4895, 440,
+ 9155, 9063, 8405, 5914,
+ 9155, 9063, 8405, 6274,
+ 9155, 9063, 8405, 7551, 0,
+ 9155, 9063, 8405, 7551, 8,
+ 9155, 9063, 8405, 7551, 16,
+ 9155, 9063, 8405, 7551, 28,
+ 9155, 9063, 8405, 7551, 70,
+ 9155, 9063, 8405, 7551, 440,
+ 9159, 6121, 2725, 4389, 6504,
+ 9159, 6121, 4849, 4389, 6504,
+ 9159, 6121, 7443, 4389, 6504,
+ 9159, 6121, 8005, 4389, 6504,
+ 9159, 10374,
+ 9171, 9095, 11767, 6689, 2170,
+ 9171, 9095, 11767, 6689, 2540,
+ 9171, 9095, 11767, 6689, 2778,
+ 9171, 9095, 11767, 6689, 4200,
+ 9171, 9095, 11767, 6689, 4214,
+ 9171, 9095, 11767, 6689, 5190,
+ 9171, 9095, 11767, 6689, 6722,
+ 9171, 9095, 11767, 6689, 7508,
+ 9171, 9095, 11767, 6689, 7694,
+ 9171, 9095, 11767, 8525, 2670,
+ 9171, 10357, 9095, 6689, 2170,
+ 9171, 10357, 9095, 6689, 2540,
+ 9171, 10357, 9095, 6689, 2778,
+ 9171, 10357, 9095, 6689, 4200,
+ 9171, 10357, 9095, 6689, 4214,
+ 9171, 10357, 9095, 6689, 5190,
+ 9171, 10357, 9095, 6689, 6722,
+ 9171, 10357, 9095, 6689, 7508,
+ 9171, 10357, 9095, 6689, 7694,
+ 9171, 10357, 9095, 8525, 2670,
+ 9171, 10357, 9095, 11767, 6689, 2170,
+ 9171, 10357, 9095, 11767, 6689, 2540,
+ 9171, 10357, 9095, 11767, 6689, 2778,
+ 9171, 10357, 9095, 11767, 6689, 4200,
+ 9171, 10357, 9095, 11767, 6689, 4214,
+ 9171, 10357, 9095, 11767, 6689, 5190,
+ 9171, 10357, 9095, 11767, 6689, 6722,
+ 9171, 10357, 9095, 11767, 6689, 7508,
+ 9171, 10357, 9095, 11767, 6689, 7694,
+ 9171, 10357, 9095, 11767, 8525, 2670,
+ 9180,
+ 9183, 8774,
+ 9243, 4923, 5758,
+ 9243, 8197, 5758,
+ 9245, 5758,
+ 9263, 428,
+ 9263, 429, 6121, 1045, 6376,
+ 9263, 429, 6121, 2779, 11649, 9744,
+ 9263, 429, 6121, 4895, 11649, 8758,
+ 9263, 429, 6121, 9546,
+ 9263, 429, 6121, 10666,
+ 9263, 429, 6121, 10677, 761, 91, 1109, 429, 11649, 8758,
+ 9263, 429, 9537, 9810,
+ 9263, 429, 9537, 10958,
+ 9279, 10001, 9967, 7271, 4153, 6434,
+ 9279, 10001, 9967, 8649, 10000,
+ 9288,
+ 9292,
+ 9297, 2830,
+ 9317, 5758,
+ 9325, 5759, 10400,
+ 9325, 7803, 5759, 16,
+ 9325, 7803, 5759, 40,
+ 9325, 8405, 0,
+ 9325, 8405, 16,
+ 9325, 8405, 40,
+ 9325, 8405, 100,
+ 9325, 8405, 138,
+ 9325, 8405, 216,
+ 9325, 8405, 236,
+ 9325, 8405, 306,
+ 9325, 8405, 332,
+ 9325, 8405, 364,
+ 9325, 8405, 392,
+ 9325, 8405, 462,
+ 9325, 8405, 510,
+ 9325, 8405, 524,
+ 9325, 8405, 556,
+ 9325, 8405, 622,
+ 9325, 8405, 652,
+ 9325, 8405, 2030,
+ 9343, 5758,
+ 9361, 7931, 4213, 9680,
+ 9361, 11345, 10582,
+ 9367, 7821, 8056,
+ 9367, 8022,
+ 9380,
+ 9385, 73, 8399, 4926,
+ 9385, 5759, 7282,
+ 9385, 5759, 8916,
+ 9385, 5759, 9824,
+ 9385, 5759, 9870,
+ 9385, 5759, 9904,
+ 9385, 5759, 12066,
+ 9385, 5759, 12384,
+ 9385, 6689, 2170,
+ 9385, 6689, 2540,
+ 9385, 6689, 2778,
+ 9385, 6689, 4200,
+ 9385, 6689, 4214,
+ 9385, 6689, 5190,
+ 9385, 6689, 6260,
+ 9385, 6689, 6722,
+ 9385, 6689, 7508,
+ 9385, 6689, 7694,
+ 9385, 7803, 5759, 8,
+ 9385, 7803, 5759, 16,
+ 9385, 7803, 5759, 28,
+ 9385, 7803, 5759, 40,
+ 9385, 7803, 5759, 58,
+ 9385, 7803, 5759, 72,
+ 9385, 7803, 5759, 92,
+ 9385, 7803, 5759, 162,
+ 9385, 7803, 5759, 266,
+ 9385, 7803, 5759, 440,
+ 9385, 7803, 5759, 606,
+ 9385, 7803, 5759, 9827, 22,
+ 9385, 7803, 5759, 9827, 34,
+ 9385, 7803, 5759, 9827, 344,
+ 9385, 7803, 5759, 9827, 518,
+ 9385, 8399, 4926,
+ 9385, 8405, 0,
+ 9385, 8405, 8,
+ 9385, 8405, 16,
+ 9385, 8405, 28,
+ 9385, 8405, 40,
+ 9385, 8405, 58,
+ 9385, 8405, 72,
+ 9385, 8405, 92,
+ 9385, 8405, 100,
+ 9385, 8405, 116,
+ 9385, 8405, 138,
+ 9385, 8405, 162,
+ 9385, 8405, 196,
+ 9385, 8405, 216,
+ 9385, 8405, 236,
+ 9385, 8405, 266,
+ 9385, 8405, 292,
+ 9385, 8405, 306,
+ 9385, 8405, 332,
+ 9385, 8405, 364,
+ 9385, 8405, 392,
+ 9385, 8405, 440,
+ 9385, 8405, 462,
+ 9385, 8405, 510,
+ 9385, 8405, 524,
+ 9385, 8405, 556,
+ 9385, 8405, 606,
+ 9385, 8405, 610,
+ 9385, 8405, 652,
+ 9385, 8405, 792,
+ 9385, 8405, 884,
+ 9385, 8405, 974,
+ 9385, 8405, 996,
+ 9385, 8405, 1260,
+ 9385, 8405, 1512,
+ 9385, 8405, 1612,
+ 9385, 8405, 1796,
+ 9385, 8405, 2030,
+ 9385, 8405, 2076,
+ 9385, 8405, 2126,
+ 9385, 8405, 2212,
+ 9385, 8405, 2438,
+ 9385, 8405, 2516,
+ 9385, 8405, 2566,
+ 9385, 8405, 2678,
+ 9385, 8405, 2746,
+ 9385, 8405, 4016,
+ 9385, 8405, 5994,
+ 9385, 8405, 9827, 22,
+ 9385, 8405, 9827, 34,
+ 9385, 8405, 9827, 344,
+ 9385, 8405, 9827, 518,
+ 9431, 11103, 5758,
+ 9437, 444,
+ 9437, 445, 6121, 1045, 6376,
+ 9437, 445, 6121, 8153, 9546,
+ 9437, 445, 6121, 8153, 10666,
+ 9437, 445, 6121, 8473, 5832,
+ 9437, 445, 6121, 11649, 3992,
+ 9437, 445, 12105, 9437, 720,
+ 9437, 720,
+ 9437, 721, 6121, 1045, 6376,
+ 9437, 721, 6121, 8153, 9546,
+ 9437, 721, 6121, 8153, 10666,
+ 9437, 721, 6121, 8473, 5832,
+ 9437, 721, 6121, 10666,
+ 9437, 721, 6121, 11649, 3992,
+ 9438,
+ 9439, 9177, 115, 11649, 5606,
+ 9443, 5941, 2171, 429, 9020,
+ 9443, 5941, 2171, 429, 9096,
+ 9443, 5941, 2171, 429, 11446,
+ 9443, 5941, 2401, 8154,
+ 9443, 5941, 2541, 429, 9020,
+ 9443, 5941, 2541, 429, 9096,
+ 9443, 5941, 2541, 429, 11446,
+ 9443, 5941, 2779, 429, 9020,
+ 9443, 5941, 2779, 429, 9096,
+ 9443, 5941, 2779, 429, 11446,
+ 9443, 5941, 3696,
+ 9443, 5941, 4153, 6116,
+ 9443, 5941, 4201, 429, 9020,
+ 9443, 5941, 4201, 429, 9096,
+ 9443, 5941, 4201, 429, 11446,
+ 9443, 5941, 4215, 429, 9020,
+ 9443, 5941, 4215, 429, 9096,
+ 9443, 5941, 4215, 429, 11446,
+ 9443, 5941, 5191, 429, 9020,
+ 9443, 5941, 5191, 429, 9096,
+ 9443, 5941, 5191, 429, 11446,
+ 9443, 5941, 5442,
+ 9443, 5941, 6113, 6116,
+ 9443, 5941, 6723, 429, 9020,
+ 9443, 5941, 6723, 429, 9096,
+ 9443, 5941, 6723, 429, 11446,
+ 9443, 5941, 6881, 8154,
+ 9443, 5941, 7010,
+ 9443, 5941, 7271, 6116,
+ 9443, 5941, 7509, 429, 9020,
+ 9443, 5941, 7509, 429, 9096,
+ 9443, 5941, 7509, 429, 11446,
+ 9443, 5941, 7607, 6116,
+ 9443, 5941, 7695, 429, 9020,
+ 9443, 5941, 7695, 429, 9096,
+ 9443, 5941, 7695, 429, 11446,
+ 9443, 5941, 7821, 8154,
+ 9443, 5941, 7960,
+ 9443, 5941, 7974,
+ 9443, 5941, 8546,
+ 9443, 5941, 8738,
+ 9443, 5941, 8766,
+ 9443, 5941, 8934,
+ 9443, 5941, 12912,
+ 9453, 6622,
+ 9472,
+ 9475, 11649, 10154,
+ 9483, 8775, 5, 3946,
+ 9483, 8775, 11, 3946,
+ 9483, 8775, 11, 3947, 8553, 3254,
+ 9483, 8775, 11, 3947, 8553, 6468,
+ 9483, 8775, 13, 3946,
+ 9483, 8775, 13, 3947, 8553, 3254,
+ 9483, 8775, 13, 3947, 8553, 6468,
+ 9483, 8775, 47, 10366,
+ 9483, 8775, 50,
+ 9483, 8775, 139, 3846,
+ 9483, 8775, 570,
+ 9483, 8775, 933, 5942,
+ 9483, 8775, 961, 7500,
+ 9483, 8775, 1109, 429, 8750,
+ 9483, 8775, 1109, 2690,
+ 9483, 8775, 1109, 3760,
+ 9483, 8775, 1109, 5776,
+ 9483, 8775, 1109, 8584,
+ 9483, 8775, 2171, 9345, 13031, 5244,
+ 9483, 8775, 2171, 9345, 13031, 5540,
+ 9483, 8775, 2211, 11838,
+ 9483, 8775, 3950,
+ 9483, 8775, 3984,
+ 9483, 8775, 3985, 718,
+ 9483, 8775, 4121, 8058,
+ 9483, 8775, 4121, 8060,
+ 9483, 8775, 4205, 600,
+ 9483, 8775, 4205, 4116,
+ 9483, 8775, 4227, 6504,
+ 9483, 8775, 4227, 7820,
+ 9483, 8775, 4389, 5244,
+ 9483, 8775, 4389, 5540,
+ 9483, 8775, 4389, 7351, 4926,
+ 9483, 8775, 4849, 8641, 5758,
+ 9483, 8775, 5013, 10367, 6504,
+ 9483, 8775, 5013, 10367, 7820,
+ 9483, 8775, 5281, 10366,
+ 9483, 8775, 5445, 10366,
+ 9483, 8775, 6020,
+ 9483, 8775, 6021, 600,
+ 9483, 8775, 6021, 7580,
+ 9483, 8775, 6093, 10366,
+ 9483, 8775, 6121, 12018,
+ 9483, 8775, 6485, 2690,
+ 9483, 8775, 6485, 3760,
+ 9483, 8775, 6485, 5776,
+ 9483, 8775, 6485, 8584,
+ 9483, 8775, 6514,
+ 9483, 8775, 6516,
+ 9483, 8775, 6620,
+ 9483, 8775, 6789, 9022,
+ 9483, 8775, 6802,
+ 9483, 8775, 6869, 5245, 413, 7580,
+ 9483, 8775, 6869, 5245, 7580,
+ 9483, 8775, 7112,
+ 9483, 8775, 7113, 10423, 5540,
+ 9483, 8775, 7113, 11659, 5540,
+ 9483, 8775, 7150,
+ 9483, 8775, 7191, 5540,
+ 9483, 8775, 7351, 601, 4926,
+ 9483, 8775, 7351, 4926,
+ 9483, 8775, 7368,
+ 9483, 8775, 7443, 8641, 5758,
+ 9483, 8775, 7500,
+ 9483, 8775, 7519, 600,
+ 9483, 8775, 7519, 4116,
+ 9483, 8775, 7551, 9022,
+ 9483, 8775, 7796,
+ 9483, 8775, 7823, 5244,
+ 9483, 8775, 7823, 5540,
+ 9483, 8775, 8011, 4926,
+ 9483, 8775, 8012,
+ 9483, 8775, 8013, 5540,
+ 9483, 8775, 8057, 47, 10366,
+ 9483, 8775, 8062,
+ 9483, 8775, 8073, 5942,
+ 9483, 8775, 8097, 9022,
+ 9483, 8775, 8101, 7580,
+ 9483, 8775, 8153, 4204,
+ 9483, 8775, 8153, 7518,
+ 9483, 8775, 8153, 9022,
+ 9483, 8775, 8159, 5244,
+ 9483, 8775, 8159, 5540,
+ 9483, 8775, 8458,
+ 9483, 8775, 8478,
+ 9483, 8775, 8479, 5540,
+ 9483, 8775, 8479, 6504,
+ 9483, 8775, 8553, 3254,
+ 9483, 8775, 8553, 6468,
+ 9483, 8775, 8641, 4112,
+ 9483, 8775, 8717, 9022,
+ 9483, 8775, 8745, 2,
+ 9483, 8775, 8745, 10367, 6504,
+ 9483, 8775, 8745, 10367, 7820,
+ 9483, 8775, 8760,
+ 9483, 8775, 8805, 11167, 925, 11739, 10422,
+ 9483, 8775, 8805, 11167, 925, 11739, 10423, 12438,
+ 9483, 8775, 8805, 11167, 925, 11739, 11658,
+ 9483, 8775, 8805, 12051, 925, 11739, 10422,
+ 9483, 8775, 8805, 12051, 925, 11739, 11658,
+ 9483, 8775, 8805, 12051, 925, 11739, 11659, 12438,
+ 9483, 8775, 8805, 12051, 925, 11739, 11659, 12440,
+ 9483, 8775, 8805, 12051, 925, 11739, 11659, 12442,
+ 9483, 8775, 9050,
+ 9483, 8775, 9060,
+ 9483, 8775, 9105, 10367, 6504,
+ 9483, 8775, 9105, 10367, 7820,
+ 9483, 8775, 9284,
+ 9483, 8775, 9285, 6490,
+ 9483, 8775, 9491, 600,
+ 9483, 8775, 9491, 4116,
+ 9483, 8775, 9598,
+ 9483, 8775, 9615, 5244,
+ 9483, 8775, 9615, 5540,
+ 9483, 8775, 9615, 5965, 4204,
+ 9483, 8775, 9615, 5965, 7518,
+ 9483, 8775, 9633, 6789, 9022,
+ 9483, 8775, 9950,
+ 9483, 8775, 10189, 11366,
+ 9483, 8775, 10189, 11368,
+ 9483, 8775, 10189, 11370,
+ 9483, 8775, 10267, 6020,
+ 9483, 8775, 10349, 9467, 5540,
+ 9483, 8775, 10367, 6504,
+ 9483, 8775, 10373, 7626,
+ 9483, 8775, 10381, 10554,
+ 9483, 8775, 10381, 10556,
+ 9483, 8775, 10381, 10558,
+ 9483, 8775, 10381, 10560,
+ 9483, 8775, 10381, 10562,
+ 9483, 8775, 10381, 10564,
+ 9483, 8775, 10381, 10566,
+ 9483, 8775, 10381, 10568,
+ 9483, 8775, 10381, 10570,
+ 9483, 8775, 10381, 11252,
+ 9483, 8775, 10381, 11254,
+ 9483, 8775, 10483, 10182,
+ 9483, 8775, 10483, 10184,
+ 9483, 8775, 10483, 10186,
+ 9483, 8775, 10527, 7626,
+ 9483, 8775, 10634,
+ 9483, 8775, 10635, 11212,
+ 9483, 8775, 10643, 10367, 601, 6504,
+ 9483, 8775, 10643, 10367, 601, 7443, 6504,
+ 9483, 8775, 10643, 10367, 601, 7443, 7820,
+ 9483, 8775, 10643, 10367, 601, 7820,
+ 9483, 8775, 10643, 10367, 4117, 6504,
+ 9483, 8775, 10643, 10367, 4117, 7820,
+ 9483, 8775, 10643, 10367, 4849, 6504,
+ 9483, 8775, 10643, 10367, 4849, 7820,
+ 9483, 8775, 10643, 10367, 7443, 6504,
+ 9483, 8775, 10643, 10367, 7443, 7820,
+ 9483, 8775, 10659, 7626,
+ 9483, 8775, 10767, 601, 824,
+ 9483, 8775, 10767, 2418,
+ 9483, 8775, 10767, 3772,
+ 9483, 8775, 10767, 4104,
+ 9483, 8775, 10767, 4117, 824,
+ 9483, 8775, 10767, 4206,
+ 9483, 8775, 10767, 5779, 11174,
+ 9483, 8775, 10767, 5832,
+ 9483, 8775, 10767, 7116,
+ 9483, 8775, 10767, 7596,
+ 9483, 8775, 10767, 7908,
+ 9483, 8775, 10767, 8153, 8844,
+ 9483, 8775, 10767, 8210,
+ 9483, 8775, 10767, 8212,
+ 9483, 8775, 10767, 8214,
+ 9483, 8775, 10767, 8216,
+ 9483, 8775, 10767, 8218,
+ 9483, 8775, 10767, 8806,
+ 9483, 8775, 10767, 8849, 8844,
+ 9483, 8775, 10767, 9458,
+ 9483, 8775, 10767, 10236,
+ 9483, 8775, 10767, 10534,
+ 9483, 8775, 10767, 11366,
+ 9483, 8775, 10767, 11368,
+ 9483, 8775, 10767, 11370,
+ 9483, 8775, 10767, 12407, 1044,
+ 9483, 8775, 10767, 12871, 5832,
+ 9483, 8775, 10767, 13016,
+ 9483, 8775, 10767, 13184,
+ 9483, 8775, 10767, 13340,
+ 9483, 8775, 10784,
+ 9483, 8775, 10995, 7626,
+ 9483, 8775, 11005, 7626,
+ 9483, 8775, 11019, 600,
+ 9483, 8775, 11019, 4116,
+ 9483, 8775, 11027, 5, 3946,
+ 9483, 8775, 11027, 11, 3946,
+ 9483, 8775, 11176,
+ 9483, 8775, 11177, 8220,
+ 9483, 8775, 11220,
+ 9483, 8775, 11221, 8220,
+ 9483, 8775, 11241, 5244,
+ 9483, 8775, 11241, 5540,
+ 9483, 8775, 11429, 600,
+ 9483, 8775, 11429, 4116,
+ 9483, 8775, 11789, 5540,
+ 9483, 8775, 11789, 6504,
+ 9483, 8775, 11789, 7820,
+ 9483, 8775, 11795, 5540,
+ 9483, 8775, 11795, 6504,
+ 9483, 8775, 11795, 7820,
+ 9483, 8775, 11821, 11006,
+ 9483, 8775, 11857, 7626,
+ 9483, 8775, 11928,
+ 9483, 8775, 12023, 11006,
+ 9483, 8775, 12028,
+ 9483, 8775, 12092,
+ 9483, 8775, 12115, 10366,
+ 9483, 8775, 12152,
+ 9483, 8775, 12531, 3254,
+ 9483, 8775, 12531, 6468,
+ 9483, 8775, 12867, 5244,
+ 9483, 8775, 12867, 5540,
+ 9483, 8775, 13025, 5244,
+ 9483, 8775, 13025, 5540,
+ 9483, 8775, 13081, 10367, 4117, 6504,
+ 9483, 8775, 13081, 10367, 4117, 7820,
+ 9485, 5671, 6689, 2170,
+ 9485, 5671, 6689, 2540,
+ 9485, 5671, 6689, 2778,
+ 9485, 5671, 6689, 4200,
+ 9485, 5671, 6689, 4214,
+ 9485, 5671, 6689, 5190,
+ 9485, 5671, 6689, 6260,
+ 9485, 5671, 6689, 6722,
+ 9485, 5671, 6689, 7508,
+ 9485, 5671, 6689, 7694,
+ 9485, 5759, 1045, 6490,
+ 9485, 5759, 3278,
+ 9485, 5759, 5671, 8834,
+ 9485, 5759, 5671, 8836,
+ 9485, 5759, 5671, 8840,
+ 9485, 5759, 5671, 8842,
+ 9485, 5759, 5671, 9125, 8834,
+ 9485, 5759, 5671, 9125, 8836,
+ 9485, 5759, 5671, 9125, 10159, 5964,
+ 9485, 5759, 7465, 9555, 8840,
+ 9485, 5759, 8425, 9664,
+ 9485, 5759, 8916,
+ 9485, 5759, 9664,
+ 9485, 5759, 9824,
+ 9485, 5759, 9839, 2273, 7025, 8832,
+ 9485, 5759, 9839, 2273, 7025, 8834,
+ 9485, 5759, 9839, 2273, 7025, 8836,
+ 9485, 5759, 9839, 2273, 7025, 8838,
+ 9485, 5759, 9839, 2273, 7025, 8840,
+ 9485, 5759, 9870,
+ 9485, 5965, 4927, 5657, 7025, 311, 2218,
+ 9485, 5965, 4927, 5657, 7025, 6902,
+ 9485, 6689, 2170,
+ 9485, 6689, 2540,
+ 9485, 6689, 2778,
+ 9485, 6689, 4200,
+ 9485, 6689, 4214,
+ 9485, 6689, 5190,
+ 9485, 6689, 6260,
+ 9485, 6689, 6722,
+ 9485, 6689, 7508,
+ 9485, 6689, 7694,
+ 9485, 7803, 5759, 8,
+ 9485, 7803, 5759, 9, 6376,
+ 9485, 7803, 5759, 16,
+ 9485, 7803, 5759, 40,
+ 9485, 7803, 5759, 58,
+ 9485, 7803, 5759, 72,
+ 9485, 7803, 5759, 266,
+ 9485, 7803, 5759, 606,
+ 9485, 7803, 5759, 1937, 28,
+ 9485, 7803, 5759, 1937, 266,
+ 9485, 7803, 5759, 4263, 7025, 16,
+ 9485, 7803, 5759, 5657, 7025, 188,
+ 9485, 7803, 5759, 5671, 8,
+ 9485, 7803, 5759, 5671, 9, 6376,
+ 9485, 7803, 5759, 5671, 58,
+ 9485, 7803, 5759, 5671, 6789, 48,
+ 9485, 7803, 5759, 5885, 58,
+ 9485, 7803, 5759, 7031, 40,
+ 9485, 7803, 5759, 7031, 162,
+ 9485, 7803, 5759, 7031, 426,
+ 9485, 7803, 5759, 9827, 22,
+ 9485, 7803, 5759, 9827, 34,
+ 9485, 7803, 5759, 9827, 344,
+ 9485, 7803, 5759, 9827, 518,
+ 9485, 7803, 5759, 9839, 2273, 7025, 188,
+ 9485, 7803, 5759, 9839, 2273, 7025, 590,
+ 9485, 8405, 0,
+ 9485, 8405, 8,
+ 9485, 8405, 16,
+ 9485, 8405, 28,
+ 9485, 8405, 40,
+ 9485, 8405, 92,
+ 9485, 8405, 100,
+ 9485, 8405, 116,
+ 9485, 8405, 138,
+ 9485, 8405, 216,
+ 9485, 8405, 236,
+ 9485, 8405, 266,
+ 9485, 8405, 292,
+ 9485, 8405, 306,
+ 9485, 8405, 332,
+ 9485, 8405, 364,
+ 9485, 8405, 392,
+ 9485, 8405, 462,
+ 9485, 8405, 510,
+ 9485, 8405, 524,
+ 9485, 8405, 556,
+ 9485, 8405, 606,
+ 9485, 8405, 622,
+ 9485, 8405, 652,
+ 9485, 8405, 792,
+ 9485, 8405, 884,
+ 9485, 8405, 974,
+ 9485, 8405, 996,
+ 9485, 8405, 1260,
+ 9485, 8405, 1512,
+ 9485, 8405, 1612,
+ 9485, 8405, 1796,
+ 9485, 8405, 1937, 8,
+ 9485, 8405, 1937, 766,
+ 9485, 8405, 1937, 768,
+ 9485, 8405, 1937, 1512,
+ 9485, 8405, 1937, 2030,
+ 9485, 8405, 2030,
+ 9485, 8405, 2076,
+ 9485, 8405, 2126,
+ 9485, 8405, 2212,
+ 9485, 8405, 2516,
+ 9485, 8405, 2566,
+ 9485, 8405, 2678,
+ 9485, 8405, 2746,
+ 9485, 8405, 4016,
+ 9485, 8405, 5236,
+ 9485, 8405, 5657, 7025, 2516,
+ 9485, 8405, 5671, 0,
+ 9485, 8405, 5671, 100,
+ 9485, 8405, 5671, 116,
+ 9485, 8405, 5671, 138,
+ 9485, 8405, 5671, 196,
+ 9485, 8405, 5671, 216,
+ 9485, 8405, 5671, 236,
+ 9485, 8405, 5671, 306,
+ 9485, 8405, 5671, 392,
+ 9485, 8405, 5671, 670,
+ 9485, 8405, 5671, 1612,
+ 9485, 8405, 5671, 2126,
+ 9485, 8405, 5671, 2212,
+ 9485, 8405, 5671, 2678,
+ 9485, 8405, 5994,
+ 9485, 8405, 6877, 524,
+ 9485, 8405, 7465, 9555, 196,
+ 9485, 8405, 9253, 2273, 7025, 2076,
+ 9485, 8405, 9253, 2273, 7025, 3102,
+ 9485, 8405, 9253, 2273, 7025, 4322,
+ 9485, 8405, 9827, 22,
+ 9485, 8405, 9827, 34,
+ 9485, 8405, 9827, 344,
+ 9485, 8405, 9827, 518,
+ 9485, 8405, 9839, 2273, 7025, 2266,
+ 9485, 8405, 9839, 2273, 7025, 2678,
+ 9485, 8775, 5671, 2170,
+ 9485, 8775, 5671, 12016,
+ 9485, 8775, 10218,
+ 9485, 8775, 10304,
+ 9485, 8775, 10768,
+ 9485, 8775, 13040,
+ 9485, 10775, 5759, 1937, 8461, 332,
+ 9485, 10775, 5759, 1937, 8461, 364,
+ 9485, 10775, 5759, 1937, 8461, 392,
+ 9485, 10775, 5759, 5671, 8461, 622,
+ 9485, 10775, 5759, 8461, 236,
+ 9485, 10775, 5759, 8461, 510,
+ 9485, 10775, 5759, 8461, 622,
+ 9485, 10775, 5759, 8461, 652,
+ 9495, 8153, 10677, 761, 8153, 7443, 11378,
+ 9497, 1, 8763, 429, 2089, 6741, 568,
+ 9497, 1, 10579, 429, 2089, 6741, 568,
+ 9497, 11099, 2089, 6741, 568,
+ 9497, 11099, 2089, 11621, 568,
+ 9497, 11099, 2089, 12472,
+ 9497, 12473, 2089, 6741, 568,
+ 9497, 12473, 2089, 11098,
+ 9497, 12473, 2089, 11621, 568,
+ 9497, 12903, 2089, 9855, 6741, 568,
+ 9498,
+ 9509, 6689, 8696,
+ 9511, 7121, 13069, 7821, 11765, 6434,
+ 9511, 7773, 13069, 7821, 11765, 6434,
+ 9525, 6409, 9537, 600,
+ 9525, 6409, 9537, 4116,
+ 9541, 6689, 2170,
+ 9541, 6689, 2540,
+ 9541, 6689, 2778,
+ 9541, 6689, 4200,
+ 9541, 6689, 4214,
+ 9541, 6689, 5190,
+ 9541, 6689, 6260,
+ 9541, 6689, 6722,
+ 9541, 6689, 7508,
+ 9541, 6689, 7694,
+ 9541, 8405, 0,
+ 9541, 8405, 8,
+ 9541, 8405, 16,
+ 9541, 8405, 28,
+ 9541, 8405, 40,
+ 9541, 8405, 58,
+ 9541, 8405, 100,
+ 9541, 8405, 162,
+ 9541, 8405, 196,
+ 9541, 8405, 216,
+ 9541, 8405, 236,
+ 9541, 8405, 292,
+ 9541, 8405, 440,
+ 9541, 8405, 510,
+ 9541, 8405, 524,
+ 9541, 8405, 556,
+ 9541, 8405, 638,
+ 9541, 8405, 652,
+ 9541, 8405, 996,
+ 9541, 8405, 1612,
+ 9541, 8405, 2918,
+ 9541, 8405, 3244,
+ 9541, 8405, 3854,
+ 9541, 8405, 4050,
+ 9541, 8405, 4698,
+ 9541, 8405, 4820,
+ 9541, 8405, 5000,
+ 9541, 8405, 5288,
+ 9541, 8405, 5470,
+ 9541, 8405, 7540,
+ 9573, 12432,
+ 9581, 5758,
+ 9595, 5758,
+ 9615, 5244,
+ 9617, 8775, 8004,
+ 9633, 7709, 10375, 6377, 11097, 6434,
+ 9633, 7709, 10375, 6377, 11765, 6434,
+ 9633, 9718,
+ 9633, 9719, 6121, 11649, 8758,
+ 9633, 9719, 10374,
+ 9633, 9719, 11183, 8762,
+ 9641, 6909, 6505, 6907, 8022,
+ 9641, 8225, 6907, 8022,
+ 9641, 9063, 32,
+ 9650,
+ 9660,
+ 9665, 5758,
+ 9666,
+ 9671, 4926,
+ 9676,
+ 9683, 8405, 70,
+ 9683, 8405, 260,
+ 9683, 8405, 438,
+ 9683, 8405, 444,
+ 9683, 8405, 536,
+ 9683, 8405, 600,
+ 9683, 8405, 706,
+ 9683, 8405, 708,
+ 9683, 8405, 712,
+ 9683, 8405, 732,
+ 9683, 8405, 736,
+ 9683, 8405, 740,
+ 9683, 8405, 802,
+ 9683, 8405, 1090,
+ 9683, 8405, 1092,
+ 9683, 8405, 1100,
+ 9683, 8405, 1120,
+ 9683, 8405, 1150,
+ 9683, 8405, 1210,
+ 9683, 8405, 1472,
+ 9683, 8405, 1474,
+ 9683, 8405, 2110,
+ 9683, 8405, 2154,
+ 9683, 8405, 2164,
+ 9683, 8405, 2186,
+ 9683, 8405, 2726,
+ 9683, 8405, 2884,
+ 9683, 8405, 2938,
+ 9683, 8405, 3048,
+ 9683, 8405, 3060,
+ 9683, 8405, 3178,
+ 9683, 8405, 4048,
+ 9683, 8405, 4548,
+ 9683, 8405, 4754,
+ 9683, 8405, 4892,
+ 9683, 8405, 5004,
+ 9683, 8405, 5382,
+ 9683, 8405, 5406,
+ 9683, 8405, 5560,
+ 9683, 8405, 5854,
+ 9683, 8405, 5922,
+ 9683, 8405, 6124,
+ 9683, 8405, 6432,
+ 9683, 8405, 6886,
+ 9683, 8405, 7012,
+ 9683, 8405, 7684,
+ 9683, 8405, 8054,
+ 9683, 8405, 9466,
+ 9689, 9610,
+ 9693, 445, 11098,
+ 9693, 445, 12472,
+ 9693, 6377, 11099, 6377, 8167, 5758,
+ 9693, 6377, 12473, 6377, 8167, 5758,
+ 9693, 7173, 9692,
+ 9695, 5759, 10702,
+ 9695, 5759, 11392,
+ 9695, 5759, 11418,
+ 9695, 7803, 5759, 4087, 9406,
+ 9695, 7803, 5759, 4087, 10272,
+ 9695, 7803, 5759, 4087, 11150,
+ 9695, 7803, 5759, 4087, 11406,
+ 9695, 7803, 5759, 4087, 12024,
+ 9695, 7803, 5759, 4087, 12468,
+ 9695, 7803, 5759, 7043, 10272,
+ 9695, 7803, 5759, 7043, 11150,
+ 9695, 7803, 5759, 7043, 11406,
+ 9695, 7803, 5759, 7059, 4056,
+ 9695, 7803, 5759, 9406,
+ 9695, 7803, 5759, 9407, 1339, 4087, 11408,
+ 9695, 7803, 5759, 9407, 1339, 11408,
+ 9695, 7803, 5759, 9407, 1339, 12024,
+ 9695, 7803, 5759, 11408,
+ 9695, 7803, 5759, 12024,
+ 9695, 7803, 5759, 12468,
+ 9695, 8405, 3259, 9032,
+ 9695, 8405, 7962,
+ 9695, 8405, 8176,
+ 9695, 8405, 8326,
+ 9695, 8405, 8558,
+ 9695, 8405, 8904,
+ 9695, 8405, 8966,
+ 9695, 8405, 8978,
+ 9695, 8405, 8988,
+ 9695, 8405, 9012,
+ 9695, 8405, 9141, 9424,
+ 9695, 8405, 9141, 9492,
+ 9695, 8405, 9141, 9656,
+ 9695, 8405, 9256,
+ 9695, 8405, 9280,
+ 9695, 8405, 9330,
+ 9695, 8405, 9352,
+ 9695, 8405, 9387, 11692,
+ 9695, 8405, 9464,
+ 9695, 8405, 9534,
+ 9695, 8405, 9622,
+ 9695, 8405, 9655, 9146,
+ 9695, 8405, 9655, 9302,
+ 9695, 8405, 9655, 9376,
+ 9695, 8405, 9655, 9988,
+ 9695, 8405, 9759, 9656,
+ 9695, 8405, 9759, 10499, 12090,
+ 9695, 8405, 9759, 11692,
+ 9695, 8405, 9812,
+ 9695, 8405, 9818,
+ 9695, 8405, 9844,
+ 9695, 8405, 9856,
+ 9695, 8405, 10248,
+ 9695, 8405, 10270,
+ 9695, 8405, 11044,
+ 9695, 8405, 11064,
+ 9695, 8405, 11133, 9424,
+ 9695, 8405, 11133, 9492,
+ 9695, 8405, 11133, 9656,
+ 9695, 8405, 11411, 9032,
+ 9695, 8405, 11411, 9070,
+ 9695, 8405, 11411, 9146,
+ 9695, 8405, 11411, 9302,
+ 9695, 8405, 11411, 9376,
+ 9695, 8405, 11411, 9392,
+ 9695, 8405, 11411, 9576,
+ 9695, 8405, 11411, 9768,
+ 9695, 8405, 11411, 9988,
+ 9695, 8405, 11411, 10652,
+ 9695, 8405, 12077, 9032,
+ 9695, 8405, 12077, 9070,
+ 9695, 8405, 12077, 9146,
+ 9695, 8405, 12077, 9302,
+ 9695, 8405, 12077, 9376,
+ 9695, 8405, 12077, 9392,
+ 9695, 8405, 12077, 9576,
+ 9695, 8405, 12077, 9768,
+ 9695, 8405, 12077, 9988,
+ 9695, 8405, 12077, 10652,
+ 9695, 12133, 11670,
+ 9701, 9601, 9898,
+ 9705, 6741, 569, 445, 11098,
+ 9705, 6741, 569, 445, 11099, 6121, 1045, 8318,
+ 9705, 6741, 569, 445, 12472,
+ 9705, 6741, 569, 445, 12473, 6121, 1045, 8318,
+ 9707, 7085, 444,
+ 9707, 7085, 720,
+ 9709, 5912,
+ 9709, 5913, 445, 6741, 568,
+ 9712,
+ 9718,
+ 9719, 6121, 9546,
+ 9722,
+ 9733, 1045, 10374,
+ 9733, 4215, 1045, 12132,
+ 9733, 5444,
+ 9733, 7172,
+ 9733, 7593, 8056,
+ 9733, 7710,
+ 9733, 8649, 10001, 7580,
+ 9733, 8744,
+ 9733, 9279, 10001, 7580,
+ 9733, 9898,
+ 9753, 10260,
+ 9761, 5759, 8916,
+ 9761, 7803, 5759, 16,
+ 9761, 7803, 5759, 40,
+ 9761, 8405, 0,
+ 9761, 8405, 16,
+ 9761, 8405, 40,
+ 9761, 8405, 100,
+ 9761, 8405, 138,
+ 9761, 8405, 216,
+ 9761, 8405, 236,
+ 9761, 8405, 306,
+ 9761, 8405, 332,
+ 9761, 8405, 364,
+ 9761, 8405, 392,
+ 9761, 8405, 462,
+ 9761, 8405, 524,
+ 9761, 8405, 556,
+ 9761, 8405, 622,
+ 9761, 8405, 652,
+ 9761, 8405, 2030,
+ 9783, 12369, 11765, 10716,
+ 9783, 13049, 11765, 10716,
+ 9789, 327, 521, 1612,
+ 9789, 327, 521, 1613, 3831, 1915, 858,
+ 9789, 4927, 723, 7045, 4376,
+ 9789, 4927, 723, 7045, 4382,
+ 9789, 4927, 887, 1904,
+ 9789, 4927, 1307, 7463, 4376,
+ 9789, 4927, 1307, 7463, 4382,
+ 9789, 4927, 2417, 3895, 8743, 5668,
+ 9789, 4927, 2733, 6374,
+ 9789, 4927, 3067, 1905, 7745, 5669, 364,
+ 9789, 4927, 3793, 5709, 3067, 1904,
+ 9789, 4927, 4355, 3067, 1905, 685, 4355, 7745, 364,
+ 9789, 4927, 4355, 3067, 1905, 685, 5559, 3759, 364,
+ 9789, 4927, 4355, 3067, 1905, 11377, 0,
+ 9789, 4927, 4355, 7744,
+ 9789, 4927, 5141, 6539, 2133, 3174,
+ 9789, 4927, 5141, 6539, 5659, 7462,
+ 9789, 4927, 5307, 5668,
+ 9789, 4927, 5307, 7744,
+ 9789, 4927, 5307, 7745, 5668,
+ 9789, 4927, 5543, 4351, 5668,
+ 9789, 4927, 5668,
+ 9789, 4927, 6523, 7462,
+ 9789, 4927, 6525, 5709, 225, 1905, 7436,
+ 9789, 4927, 6527, 3067, 1904,
+ 9789, 4927, 6543, 3067, 1905, 5421, 5669, 364,
+ 9789, 4927, 6543, 6373, 7463, 369, 4895, 858,
+ 9789, 4927, 6543, 6373, 7463, 3831, 1915, 858,
+ 9789, 4927, 7179, 3067, 225, 1905, 7436,
+ 9789, 4927, 7493, 5668,
+ 9789, 4927, 7745, 5668,
+ 9789, 4927, 8564,
+ 9789, 4927, 9099, 3067, 1905, 5655, 364,
+ 9789, 4927, 9099, 3809, 8653, 3067, 1905, 5655, 364,
+ 9789, 4927, 9320,
+ 9789, 4927, 9363, 3067, 1905, 4939, 364,
+ 9789, 4927, 9363, 3809, 8653, 3067, 1905, 4939, 364,
+ 9789, 4927, 10795, 7745, 6528,
+ 9789, 4927, 12955, 7744,
+ 9789, 5759, 1301, 859, 9634,
+ 9789, 5759, 1301, 1889, 9634,
+ 9789, 5759, 1753, 2733, 858,
+ 9789, 5759, 1755, 7462,
+ 9789, 5759, 1865, 7746,
+ 9789, 5759, 2133, 3175, 1983, 138,
+ 9789, 5759, 2547, 4842,
+ 9789, 5759, 3035, 7746,
+ 9789, 5759, 4937, 858,
+ 9789, 5759, 5531, 1985, 4256,
+ 9789, 5759, 5531, 1985, 4352,
+ 9789, 5759, 5531, 1985, 5531, 4096,
+ 9789, 5759, 5531, 1985, 6862,
+ 9789, 5759, 5531, 4097, 4256,
+ 9789, 5759, 5531, 4097, 4352,
+ 9789, 5759, 5531, 4097, 5531, 1984,
+ 9789, 5759, 5531, 4097, 6862,
+ 9789, 5759, 5557, 547, 2031, 516,
+ 9789, 5759, 5559, 3758,
+ 9789, 5759, 6179, 7462,
+ 9789, 6689, 2170,
+ 9789, 6689, 2540,
+ 9789, 6689, 2778,
+ 9789, 6689, 4200,
+ 9789, 6689, 4214,
+ 9789, 6689, 4389, 2170,
+ 9789, 6689, 4389, 2540,
+ 9789, 6689, 4389, 2778,
+ 9789, 6689, 4389, 4200,
+ 9789, 6689, 4389, 4214,
+ 9789, 6689, 4389, 5190,
+ 9789, 6689, 4389, 6260,
+ 9789, 6689, 4389, 6722,
+ 9789, 6689, 4389, 7508,
+ 9789, 6689, 4389, 7694,
+ 9789, 6689, 5190,
+ 9789, 6689, 6260,
+ 9789, 6689, 6722,
+ 9789, 6689, 7508,
+ 9789, 6689, 7694,
+ 9789, 7803, 5759, 8,
+ 9789, 7803, 5759, 16,
+ 9789, 7803, 5759, 28,
+ 9789, 7803, 5759, 40,
+ 9789, 7803, 5759, 58,
+ 9789, 7803, 5759, 162,
+ 9789, 7803, 5759, 266,
+ 9789, 7803, 5759, 440,
+ 9789, 7803, 5759, 606,
+ 9789, 7803, 5759, 9827, 22,
+ 9789, 7803, 5759, 9827, 34,
+ 9789, 7803, 5759, 9827, 344,
+ 9789, 7803, 5759, 9827, 518,
+ 9789, 7803, 5759, 10489, 16,
+ 9789, 7803, 5759, 10489, 266,
+ 9789, 8405, 0,
+ 9789, 8405, 52,
+ 9789, 8405, 100,
+ 9789, 8405, 116,
+ 9789, 8405, 138,
+ 9789, 8405, 216,
+ 9789, 8405, 236,
+ 9789, 8405, 292,
+ 9789, 8405, 306,
+ 9789, 8405, 332,
+ 9789, 8405, 364,
+ 9789, 8405, 392,
+ 9789, 8405, 462,
+ 9789, 8405, 510,
+ 9789, 8405, 524,
+ 9789, 8405, 556,
+ 9789, 8405, 622,
+ 9789, 8405, 652,
+ 9789, 8405, 670,
+ 9789, 8405, 792,
+ 9789, 8405, 884,
+ 9789, 8405, 974,
+ 9789, 8405, 996,
+ 9789, 8405, 1080,
+ 9789, 8405, 1260,
+ 9789, 8405, 1612,
+ 9789, 8405, 1642,
+ 9789, 8405, 2030,
+ 9789, 8405, 2076,
+ 9789, 8405, 2126,
+ 9789, 8405, 2212,
+ 9789, 8405, 2438,
+ 9789, 8405, 2516,
+ 9789, 8405, 2566,
+ 9789, 8405, 2678,
+ 9789, 8405, 2732,
+ 9789, 8405, 2746,
+ 9789, 8405, 3146,
+ 9789, 8405, 4016,
+ 9789, 8405, 4140,
+ 9789, 8405, 4782,
+ 9789, 8405, 5978,
+ 9789, 8405, 5994,
+ 9789, 8405, 11631, 510,
+ 9789, 8775, 2089, 112,
+ 9789, 8775, 2089, 113, 3831, 7904,
+ 9789, 8775, 2089, 113, 4353, 7904,
+ 9789, 8775, 2089, 113, 5307, 7904,
+ 9789, 8775, 2399, 2420,
+ 9789, 8775, 2399, 2421, 5543, 4350,
+ 9789, 8775, 4119, 112,
+ 9789, 8775, 5421, 462,
+ 9789, 8775, 7333, 4258,
+ 9789, 10307, 5759, 3877, 7462,
+ 9789, 10307, 5759, 4859, 7462,
+ 9789, 10585, 436,
+ 9789, 11257, 8405, 0,
+ 9789, 11257, 8405, 52,
+ 9789, 11257, 8405, 100,
+ 9789, 11257, 8405, 116,
+ 9789, 11257, 8405, 138,
+ 9789, 11257, 8405, 216,
+ 9789, 11257, 8405, 236,
+ 9789, 11257, 8405, 292,
+ 9789, 11257, 8405, 306,
+ 9789, 11257, 8405, 332,
+ 9789, 11257, 8405, 364,
+ 9789, 11257, 8405, 392,
+ 9789, 11257, 8405, 462,
+ 9789, 11257, 8405, 510,
+ 9789, 11257, 8405, 524,
+ 9789, 11257, 8405, 556,
+ 9789, 11257, 8405, 622,
+ 9789, 11257, 8405, 652,
+ 9789, 11257, 8405, 670,
+ 9789, 11257, 8405, 792,
+ 9789, 11257, 8405, 884,
+ 9789, 11257, 8405, 974,
+ 9789, 11257, 8405, 996,
+ 9789, 11257, 8405, 1080,
+ 9789, 11257, 8405, 1260,
+ 9789, 11257, 8405, 1612,
+ 9789, 11257, 8405, 2030,
+ 9789, 11257, 8405, 2076,
+ 9789, 11257, 8405, 2126,
+ 9789, 11257, 8405, 2212,
+ 9789, 11257, 8405, 2516,
+ 9789, 11257, 8405, 2566,
+ 9789, 11257, 8405, 2678,
+ 9789, 11257, 8405, 2732,
+ 9789, 11257, 8405, 2746,
+ 9789, 11257, 8405, 3146,
+ 9789, 11257, 8405, 4016,
+ 9789, 11257, 8405, 4140,
+ 9789, 11257, 8405, 4782,
+ 9789, 11257, 8405, 5978,
+ 9789, 11257, 8405, 5994,
+ 9789, 11257, 8405, 11631, 510,
+ 9789, 11257, 8405, 11631, 622,
+ 9789, 11257, 8405, 11631, 652,
+ 9789, 12405, 5759, 5661, 4255, 6371, 7462,
+ 9789, 12405, 5759, 7497, 8858,
+ 9789, 12405, 5759, 7907, 462,
+ 9789, 12423, 5759, 3845, 5892,
+ 9789, 12423, 5759, 5641, 6368,
+ 9789, 12423, 5759, 6909, 3764,
+ 9789, 12423, 5759, 7101, 3764,
+ 9793, 1177, 4194,
+ 9793, 1177, 4830,
+ 9793, 1177, 6116,
+ 9793, 1177, 6716,
+ 9793, 1177, 7812,
+ 9793, 1177, 8290,
+ 9793, 1177, 9786,
+ 9793, 1177, 10344,
+ 9811, 2779, 8289, 6434,
+ 9811, 6434,
+ 9811, 6435, 569, 760,
+ 9811, 6435, 4221, 760,
+ 9811, 6435, 6121, 2697, 11096,
+ 9811, 6435, 6121, 2697, 11764,
+ 9811, 6435, 6121, 8153, 8758,
+ 9811, 6435, 6121, 11649, 8758,
+ 9811, 6435, 11097, 429, 10959, 6434,
+ 9811, 6505, 6434,
+ 9811, 7821, 6434,
+ 9811, 7821, 6435, 439, 10416,
+ 9811, 7821, 6435, 439, 10417, 6121, 10677, 760,
+ 9811, 7821, 6435, 439, 10417, 6121, 11649, 760,
+ 9811, 7821, 6435, 4221, 760,
+ 9811, 7821, 8153, 6434,
+ 9811, 7821, 8153, 6435, 439, 10416,
+ 9811, 7924,
+ 9811, 8097, 6434,
+ 9811, 8153, 6434,
+ 9811, 8561, 7944,
+ 9811, 8849, 6434,
+ 9811, 9327, 6121, 3713, 4849, 569, 760,
+ 9811, 9327, 6121, 3713, 4849, 4221, 760,
+ 9811, 9327, 6121, 3713, 4849, 7991, 9811, 9327, 6121, 3713, 7442,
+ 9811, 9327, 6121, 3713, 4849, 7991, 10959, 9327, 6121, 3713, 7442,
+ 9811, 9327, 6121, 3713, 7443, 569, 760,
+ 9811, 9327, 6121, 3713, 7443, 4221, 760,
+ 9811, 9327, 6121, 3713, 11096,
+ 9811, 9327, 6121, 3713, 11764,
+ 9811, 11191, 6434,
+ 9811, 11875, 6435, 4221, 7593, 8056,
+ 9821, 4390,
+ 9835, 5758,
+ 9843, 4390,
+ 9853, 7931, 4213, 9680,
+ 9853, 11345, 10582,
+ 9858,
+ 9867, 5758,
+ 9880,
+ 9891, 4223, 5836,
+ 9891, 6616,
+ 9891, 7593, 8405, 116,
+ 9891, 7593, 8405, 130,
+ 9891, 7593, 8405, 138,
+ 9891, 7593, 8405, 166,
+ 9891, 7593, 8405, 186,
+ 9891, 7593, 8405, 246,
+ 9891, 7593, 8405, 292,
+ 9891, 7593, 8405, 430,
+ 9891, 7593, 8405, 510,
+ 9891, 7593, 8405, 568,
+ 9891, 7593, 8405, 616,
+ 9891, 7593, 8405, 656,
+ 9891, 7593, 8405, 670,
+ 9891, 7593, 8405, 744,
+ 9891, 7593, 8405, 784,
+ 9891, 7593, 8405, 884,
+ 9891, 7593, 8405, 1094,
+ 9891, 7593, 8405, 1152,
+ 9891, 7593, 8405, 1276,
+ 9891, 7593, 8405, 1488,
+ 9891, 7593, 8405, 1600,
+ 9891, 7593, 8405, 1602,
+ 9891, 7593, 8405, 1894,
+ 9891, 7593, 8405, 2092,
+ 9891, 7593, 8405, 2206,
+ 9891, 7593, 8405, 2404,
+ 9891, 7593, 8405, 2506,
+ 9891, 7593, 8405, 2516,
+ 9891, 7593, 8405, 2862,
+ 9891, 7593, 8405, 2958,
+ 9891, 7593, 8405, 3148,
+ 9891, 7593, 8405, 3892,
+ 9891, 7593, 8405, 4314,
+ 9891, 7593, 8405, 4636,
+ 9891, 7593, 8405, 4886,
+ 9891, 7593, 8405, 5434,
+ 9891, 7593, 8405, 5948,
+ 9891, 7593, 8405, 6214,
+ 9891, 7593, 10301, 1095, 6214,
+ 9891, 7593, 10301, 1895, 1094,
+ 9891, 7593, 10301, 1895, 1488,
+ 9891, 7593, 10301, 1895, 2092,
+ 9891, 7593, 10301, 1895, 2958,
+ 9891, 7593, 10301, 2863, 2092,
+ 9891, 8306,
+ 9891, 9063, 8405, 116,
+ 9891, 9063, 8405, 130,
+ 9891, 9063, 8405, 138,
+ 9891, 9063, 8405, 166,
+ 9891, 9063, 8405, 186,
+ 9891, 9063, 8405, 246,
+ 9891, 9063, 8405, 292,
+ 9891, 9063, 8405, 430,
+ 9891, 9063, 8405, 510,
+ 9891, 9063, 8405, 568,
+ 9891, 9063, 8405, 616,
+ 9891, 9063, 8405, 656,
+ 9891, 9063, 8405, 670,
+ 9891, 9063, 8405, 744,
+ 9891, 9063, 8405, 784,
+ 9891, 9063, 8405, 884,
+ 9891, 9063, 8405, 1094,
+ 9891, 9063, 8405, 1152,
+ 9891, 9063, 8405, 1276,
+ 9891, 9063, 8405, 1488,
+ 9891, 9063, 8405, 1600,
+ 9891, 9063, 8405, 1602,
+ 9891, 9063, 8405, 1894,
+ 9891, 9063, 8405, 2092,
+ 9891, 9063, 8405, 2206,
+ 9891, 9063, 8405, 2404,
+ 9891, 9063, 8405, 2506,
+ 9891, 9063, 8405, 2516,
+ 9891, 9063, 8405, 2862,
+ 9891, 9063, 8405, 2958,
+ 9891, 9063, 8405, 3148,
+ 9891, 9063, 8405, 3892,
+ 9891, 9063, 8405, 4314,
+ 9891, 9063, 8405, 4636,
+ 9891, 9063, 8405, 4886,
+ 9891, 9063, 8405, 5434,
+ 9891, 9063, 8405, 5948,
+ 9891, 9063, 8405, 6214,
+ 9891, 10157, 4926,
+ 9891, 10339, 8405, 4849, 4389, 5550,
+ 9891, 10469, 4926,
+ 9891, 11424,
+ 9891, 12017, 4926,
+ 9891, 12391, 4926,
+ 9898,
+ 9899, 10374,
+ 9900,
+ 9907, 3229, 3228,
+ 9907, 5759, 2811, 7438,
+ 9907, 5759, 2811, 8030,
+ 9907, 5759, 6502,
+ 9907, 5759, 6556,
+ 9907, 5759, 8768,
+ 9907, 5759, 9628,
+ 9907, 6545, 5762,
+ 9907, 6545, 9570,
+ 9907, 6545, 11156,
+ 9907, 6689, 2170,
+ 9907, 6689, 2540,
+ 9907, 6689, 2778,
+ 9907, 6689, 4200,
+ 9907, 6689, 4214,
+ 9907, 6689, 5190,
+ 9907, 6689, 6260,
+ 9907, 6689, 6722,
+ 9907, 6689, 7508,
+ 9907, 6689, 7694,
+ 9907, 7334,
+ 9907, 7803, 5759, 333, 7094,
+ 9907, 7803, 5759, 333, 7095, 8796,
+ 9907, 7803, 5759, 511, 5536,
+ 9907, 7803, 5759, 511, 5537, 8796,
+ 9907, 7803, 5759, 2810,
+ 9907, 7803, 5759, 2811, 5638,
+ 9907, 7803, 5759, 5844,
+ 9907, 7803, 5759, 5845, 4602,
+ 9907, 7803, 5759, 7362,
+ 9907, 7803, 5759, 7363, 8796,
+ 9907, 7803, 5759, 8788,
+ 9907, 7803, 5759, 8789, 5536,
+ 9907, 7803, 5759, 8789, 5537, 8796,
+ 9907, 7803, 5759, 8789, 8796,
+ 9907, 7803, 5759, 8796,
+ 9907, 7826,
+ 9907, 8405, 100,
+ 9907, 8405, 101, 9396,
+ 9907, 8405, 116,
+ 9907, 8405, 117, 4822,
+ 9907, 8405, 138,
+ 9907, 8405, 139, 4920,
+ 9907, 8405, 139, 7195, 10704,
+ 9907, 8405, 139, 7195, 11106,
+ 9907, 8405, 165, 7488,
+ 9907, 8405, 216,
+ 9907, 8405, 217, 4346,
+ 9907, 8405, 236,
+ 9907, 8405, 292,
+ 9907, 8405, 293, 4632,
+ 9907, 8405, 306,
+ 9907, 8405, 307, 11106,
+ 9907, 8405, 332,
+ 9907, 8405, 333, 7094,
+ 9907, 8405, 333, 7095, 8796,
+ 9907, 8405, 364,
+ 9907, 8405, 392,
+ 9907, 8405, 393, 8632,
+ 9907, 8405, 462,
+ 9907, 8405, 463, 7020,
+ 9907, 8405, 510,
+ 9907, 8405, 511, 5536,
+ 9907, 8405, 511, 5537, 8796,
+ 9907, 8405, 524,
+ 9907, 8405, 525, 5626,
+ 9907, 8405, 525, 5634,
+ 9907, 8405, 556,
+ 9907, 8405, 557, 5888,
+ 9907, 8405, 557, 7086,
+ 9907, 8405, 557, 7195, 11106,
+ 9907, 8405, 613, 7488,
+ 9907, 8405, 622,
+ 9907, 8405, 652,
+ 9907, 8405, 1579, 7488,
+ 9907, 8405, 2030,
+ 9907, 8405, 2126,
+ 9907, 8405, 3129, 7488,
+ 9907, 8405, 4753, 7488,
+ 9907, 8405, 6037, 7488,
+ 9907, 8405, 6390,
+ 9907, 8405, 6391, 8796,
+ 9907, 8405, 6726,
+ 9907, 8405, 6986,
+ 9907, 8405, 6987, 8796,
+ 9907, 8405, 7312,
+ 9907, 8405, 7313, 8796,
+ 9907, 8405, 7760,
+ 9907, 8405, 7761, 8796,
+ 9907, 8405, 7914,
+ 9907, 8405, 7957, 7488,
+ 9907, 8566,
+ 9907, 9483, 8775, 3986,
+ 9907, 9483, 8775, 3987, 4266,
+ 9907, 9483, 8775, 3987, 8768,
+ 9907, 9483, 8775, 4060,
+ 9907, 9483, 8775, 4090,
+ 9907, 9483, 8775, 4106,
+ 9907, 9483, 8775, 4128,
+ 9907, 9483, 8775, 6632,
+ 9907, 9483, 8775, 6638,
+ 9907, 9483, 8775, 6678,
+ 9907, 9483, 8775, 10767, 4344,
+ 9907, 9483, 8775, 10767, 6492,
+ 9907, 9483, 8775, 10767, 6732,
+ 9907, 9483, 8775, 10767, 7670,
+ 9907, 9483, 8775, 10767, 8350,
+ 9907, 9483, 8775, 10767, 8351, 6121, 9378,
+ 9907, 9483, 8775, 10767, 8352,
+ 9907, 9483, 8775, 10767, 8353, 6121, 9378,
+ 9907, 9483, 8775, 10767, 9378,
+ 9907, 9483, 8775, 11091, 5385, 5396,
+ 9907, 9483, 8775, 11091, 5385, 5432,
+ 9907, 9483, 8775, 11091, 5385, 5452,
+ 9907, 9483, 8775, 11091, 8065, 5436,
+ 9907, 9483, 8775, 11091, 8065, 5440,
+ 9907, 9483, 8775, 11761, 5385, 958,
+ 9907, 9483, 8775, 11761, 5385, 1052,
+ 9907, 9483, 8775, 11761, 8065, 2644,
+ 9907, 9483, 8775, 11761, 8065, 2758,
+ 9907, 10398,
+ 9919, 6789, 8405, 14,
+ 9919, 6789, 8405, 20,
+ 9919, 6789, 8405, 30,
+ 9919, 6789, 8405, 38,
+ 9919, 8405, 0,
+ 9919, 8405, 2,
+ 9919, 8405, 4,
+ 9919, 8405, 6,
+ 9919, 8405, 8,
+ 9919, 8405, 10,
+ 9919, 8405, 12,
+ 9919, 8405, 14,
+ 9919, 8405, 16,
+ 9919, 8405, 18,
+ 9919, 8405, 20,
+ 9919, 8405, 22,
+ 9919, 8405, 24,
+ 9919, 8405, 26,
+ 9919, 8405, 28,
+ 9919, 8405, 30,
+ 9919, 8405, 32,
+ 9919, 8405, 34,
+ 9919, 8405, 36,
+ 9919, 8405, 38,
+ 9919, 8405, 40,
+ 9919, 8405, 42,
+ 9919, 8405, 46,
+ 9919, 8405, 50,
+ 9919, 8405, 72,
+ 9919, 8405, 78,
+ 9919, 8405, 80,
+ 9919, 8405, 92,
+ 9919, 8405, 112,
+ 9919, 8405, 124,
+ 9919, 8405, 162,
+ 9919, 8405, 166,
+ 9919, 8405, 168,
+ 9919, 8405, 176,
+ 9919, 8405, 182,
+ 9919, 8405, 226,
+ 9919, 8405, 230,
+ 9919, 8405, 264,
+ 9919, 8405, 272,
+ 9919, 8405, 280,
+ 9919, 8405, 286,
+ 9919, 8405, 296,
+ 9919, 8405, 400,
+ 9919, 8405, 436,
+ 9919, 8405, 440,
+ 9919, 8405, 450,
+ 9919, 8405, 530,
+ 9919, 8405, 674,
+ 9919, 8405, 676,
+ 9919, 8405, 722,
+ 9919, 8405, 724,
+ 9919, 8405, 1110,
+ 9919, 8405, 1112,
+ 9919, 8405, 1490,
+ 9919, 8405, 2034,
+ 9919, 8405, 2172,
+ 9919, 8405, 2174,
+ 9919, 8405, 2814,
+ 9919, 8405, 3238,
+ 9919, 8405, 3286,
+ 9919, 8405, 4610,
+ 9923, 1109, 429, 9664,
+ 9923, 7803, 5759, 8,
+ 9923, 7803, 5759, 16,
+ 9923, 7803, 5759, 28,
+ 9923, 7803, 5759, 40,
+ 9923, 7803, 5759, 66,
+ 9923, 8405, 0,
+ 9923, 8405, 100,
+ 9923, 8405, 116,
+ 9923, 8405, 138,
+ 9923, 8405, 216,
+ 9923, 8405, 236,
+ 9923, 8405, 292,
+ 9923, 8405, 306,
+ 9923, 8405, 332,
+ 9923, 8405, 364,
+ 9923, 8405, 392,
+ 9923, 8405, 462,
+ 9923, 8405, 510,
+ 9923, 8405, 524,
+ 9923, 8405, 556,
+ 9923, 8405, 610,
+ 9923, 8405, 652,
+ 9923, 8405, 1946,
+ 9923, 8405, 2030,
+ 9923, 8405, 2096,
+ 9923, 8405, 2126,
+ 9923, 8405, 5166,
+ 9923, 8405, 5294,
+ 9923, 9556,
+ 9924,
+ 9928,
+ 9931, 11269, 0,
+ 9931, 11269, 4,
+ 9931, 11269, 8,
+ 9931, 11269, 10,
+ 9931, 11269, 16,
+ 9931, 11269, 20,
+ 9931, 11269, 22,
+ 9931, 11269, 24,
+ 9931, 11269, 26,
+ 9931, 11269, 28,
+ 9931, 11269, 30,
+ 9931, 11269, 32,
+ 9931, 11269, 34,
+ 9931, 11269, 36,
+ 9931, 11269, 38,
+ 9931, 11269, 48,
+ 9931, 11269, 58,
+ 9931, 11269, 72,
+ 9931, 11269, 80,
+ 9931, 11269, 116,
+ 9931, 11269, 122,
+ 9931, 11269, 126,
+ 9931, 11269, 130,
+ 9931, 11269, 176,
+ 9931, 11269, 196,
+ 9931, 11269, 198,
+ 9931, 11269, 202,
+ 9931, 11269, 208,
+ 9931, 11269, 244,
+ 9931, 11269, 266,
+ 9931, 11269, 274,
+ 9931, 11269, 306,
+ 9931, 11269, 310,
+ 9931, 11269, 314,
+ 9931, 11269, 322,
+ 9931, 11269, 330,
+ 9931, 11269, 332,
+ 9931, 11269, 336,
+ 9931, 11269, 338,
+ 9931, 11269, 340,
+ 9931, 11269, 350,
+ 9931, 11269, 364,
+ 9931, 11269, 368,
+ 9931, 11269, 372,
+ 9931, 11269, 374,
+ 9931, 11269, 380,
+ 9931, 11269, 392,
+ 9931, 11269, 396,
+ 9931, 11269, 400,
+ 9931, 11269, 402,
+ 9931, 11269, 404,
+ 9931, 11269, 412,
+ 9931, 11269, 438,
+ 9931, 11269, 440,
+ 9931, 11269, 462,
+ 9931, 11269, 468,
+ 9931, 11269, 476,
+ 9931, 11269, 480,
+ 9931, 11269, 496,
+ 9931, 11269, 500,
+ 9931, 11269, 502,
+ 9931, 11269, 510,
+ 9931, 11269, 512,
+ 9931, 11269, 514,
+ 9931, 11269, 516,
+ 9931, 11269, 524,
+ 9931, 11269, 526,
+ 9931, 11269, 530,
+ 9931, 11269, 532,
+ 9931, 11269, 536,
+ 9931, 11269, 550,
+ 9931, 11269, 556,
+ 9931, 11269, 560,
+ 9931, 11269, 562,
+ 9931, 11269, 564,
+ 9931, 11269, 568,
+ 9931, 11269, 622,
+ 9931, 11269, 626,
+ 9931, 11269, 630,
+ 9931, 11269, 632,
+ 9931, 11269, 652,
+ 9931, 11269, 654,
+ 9931, 11269, 656,
+ 9931, 11269, 660,
+ 9931, 11269, 690,
+ 9931, 11269, 854,
+ 9931, 11269, 889, 5758,
+ 9931, 11269, 898,
+ 9931, 11269, 914,
+ 9931, 11269, 936,
+ 9931, 11269, 938,
+ 9931, 11269, 940,
+ 9931, 11269, 942,
+ 9931, 11269, 1140,
+ 9931, 11269, 1160,
+ 9931, 11269, 1172,
+ 9931, 11269, 1574,
+ 9931, 11269, 1630,
+ 9931, 11269, 1660,
+ 9931, 11269, 1704,
+ 9931, 11269, 1706,
+ 9931, 11269, 1708,
+ 9931, 11269, 1710,
+ 9931, 11269, 1732,
+ 9931, 11269, 1770,
+ 9931, 11269, 1774,
+ 9931, 11269, 1776,
+ 9931, 11269, 1784,
+ 9931, 11269, 1802,
+ 9931, 11269, 1834,
+ 9931, 11269, 1836,
+ 9931, 11269, 1838,
+ 9931, 11269, 1840,
+ 9931, 11269, 1854,
+ 9931, 11269, 1916,
+ 9931, 11269, 1938,
+ 9931, 11269, 1964,
+ 9931, 11269, 1966,
+ 9931, 11269, 1968,
+ 9931, 11269, 1970,
+ 9931, 11269, 1982,
+ 9931, 11269, 2030,
+ 9931, 11269, 2036,
+ 9931, 11269, 2038,
+ 9931, 11269, 2052,
+ 9931, 11269, 2078,
+ 9931, 11269, 2084,
+ 9931, 11269, 2122,
+ 9931, 11269, 2124,
+ 9931, 11269, 2188,
+ 9931, 11269, 2226,
+ 9931, 11269, 2238,
+ 9931, 11269, 2266,
+ 9931, 11269, 2268,
+ 9931, 11269, 2270,
+ 9931, 11269, 2272,
+ 9931, 11269, 2282,
+ 9931, 11269, 2286,
+ 9931, 11269, 2308,
+ 9931, 11269, 2320,
+ 9931, 11269, 2378,
+ 9931, 11269, 2414,
+ 9931, 11269, 2430,
+ 9931, 11269, 2482,
+ 9931, 11269, 2516,
+ 9931, 11269, 2518,
+ 9931, 11269, 2520,
+ 9931, 11269, 2522,
+ 9931, 11269, 2532,
+ 9931, 11269, 2554,
+ 9931, 11269, 2598,
+ 9931, 11269, 2600,
+ 9931, 11269, 2604,
+ 9931, 11269, 2606,
+ 9931, 11269, 2634,
+ 9931, 11269, 2678,
+ 9931, 11269, 2680,
+ 9931, 11269, 2682,
+ 9931, 11269, 2684,
+ 9931, 11269, 2692,
+ 9931, 11269, 2722,
+ 9931, 11269, 2746,
+ 9931, 11269, 2748,
+ 9931, 11269, 2750,
+ 9931, 11269, 2752,
+ 9931, 11269, 2754,
+ 9931, 11269, 2772,
+ 9931, 11269, 2774,
+ 9931, 11269, 2776,
+ 9931, 11269, 2778,
+ 9931, 11269, 2780,
+ 9931, 11269, 2782,
+ 9931, 11269, 2784,
+ 9931, 11269, 2786,
+ 9931, 11269, 2906,
+ 9931, 11269, 2932,
+ 9931, 11269, 2942,
+ 9931, 11269, 3006,
+ 9931, 11269, 3068,
+ 9931, 11269, 3082,
+ 9931, 11269, 3102,
+ 9931, 11269, 3104,
+ 9931, 11269, 3106,
+ 9931, 11269, 3108,
+ 9931, 11269, 3836,
+ 9931, 11269, 3970,
+ 9931, 11269, 3972,
+ 9931, 11269, 3974,
+ 9931, 11269, 4176,
+ 9931, 11269, 4223, 5836,
+ 9931, 11269, 4230,
+ 9931, 11269, 4700,
+ 9931, 11269, 4796,
+ 9931, 11269, 4800,
+ 9931, 11269, 4802,
+ 9931, 11269, 4818,
+ 9931, 11269, 4856,
+ 9931, 11269, 4862,
+ 9931, 11269, 4864,
+ 9931, 11269, 4910,
+ 9931, 11269, 4912,
+ 9931, 11269, 4914,
+ 9931, 11269, 4918,
+ 9931, 11269, 5032,
+ 9931, 11269, 5036,
+ 9931, 11269, 5038,
+ 9931, 11269, 5040,
+ 9931, 11269, 5132,
+ 9931, 11269, 5134,
+ 9931, 11269, 5164,
+ 9931, 11269, 5170,
+ 9931, 11269, 5228,
+ 9931, 11269, 5230,
+ 9931, 11269, 5232,
+ 9931, 11269, 5290,
+ 9931, 11269, 5390,
+ 9931, 11269, 5460,
+ 9931, 11269, 5464,
+ 9931, 11269, 5466,
+ 9931, 11269, 5472,
+ 9931, 11269, 5518,
+ 9931, 11269, 5616,
+ 9931, 11269, 5622,
+ 9931, 11269, 5666,
+ 9931, 11269, 5694,
+ 9931, 11269, 5710,
+ 9931, 11269, 5732,
+ 9931, 11269, 5734,
+ 9931, 11269, 5736,
+ 9931, 11269, 5738,
+ 9931, 11269, 5858,
+ 9931, 11269, 5860,
+ 9931, 11269, 5862,
+ 9931, 11269, 5874,
+ 9931, 11269, 5906,
+ 9931, 11269, 5924,
+ 9931, 11269, 5930,
+ 9931, 11269, 5952,
+ 9931, 11269, 5954,
+ 9931, 11269, 5956,
+ 9931, 11269, 5958,
+ 9931, 11269, 5994,
+ 9931, 11269, 5996,
+ 9931, 11269, 5998,
+ 9931, 11269, 6000,
+ 9931, 11269, 6024,
+ 9931, 11269, 6026,
+ 9931, 11269, 6028,
+ 9931, 11269, 6160,
+ 9931, 11269, 6246,
+ 9931, 11269, 6248,
+ 9931, 11269, 6250,
+ 9931, 11269, 6789, 2725, 4389, 5550,
+ 9931, 11269, 6789, 4117, 5876,
+ 9931, 11269, 6789, 5444,
+ 9931, 11269, 6789, 5550,
+ 9931, 11269, 6789, 6378,
+ 9931, 11269, 6789, 6874,
+ 9931, 11269, 6789, 7443, 4389, 5550,
+ 9931, 11269, 6789, 7551, 11649, 8758,
+ 9931, 11269, 6789, 8005, 4389, 5550,
+ 9931, 11269, 6789, 8153, 6378,
+ 9931, 11269, 6789, 8153, 7551, 10677, 9744,
+ 9931, 11269, 6789, 8473, 1044,
+ 9931, 11269, 7226,
+ 9931, 11269, 7262,
+ 9931, 11269, 7264,
+ 9931, 11269, 7266,
+ 9931, 11269, 7558,
+ 9931, 11269, 7560,
+ 9931, 11269, 7562,
+ 9931, 11269, 7700,
+ 9931, 11269, 8461, 22,
+ 9931, 11269, 8461, 34,
+ 9931, 11269, 8497, 2680,
+ 9931, 11269, 8497, 2682,
+ 9931, 11269, 8497, 5924,
+ 9931, 11269, 8629, 512,
+ 9931, 11269, 8671, 24,
+ 9931, 11269, 8671, 236,
+ 9931, 11269, 8671, 238,
+ 9931, 11269, 8671, 242,
+ 9931, 11269, 8671, 246,
+ 9931, 11269, 8671, 296,
+ 9931, 11269, 8671, 300,
+ 9931, 11269, 8671, 562,
+ 9931, 11269, 8671, 656,
+ 9931, 11269, 8671, 2516,
+ 9931, 11269, 8671, 2518,
+ 9931, 11269, 8671, 2520,
+ 9931, 11269, 8671, 2522,
+ 9931, 11269, 8943, 44,
+ 9931, 11269, 8943, 440,
+ 9931, 11269, 8943, 914,
+ 9931, 11269, 8943, 1660,
+ 9931, 11269, 8943, 1802,
+ 9931, 11269, 8943, 1938,
+ 9931, 11269, 8943, 2084,
+ 9931, 11269, 8943, 2238,
+ 9931, 11269, 8943, 2554,
+ 9931, 11269, 8943, 2722,
+ 9931, 11269, 8943, 3082,
+ 9931, 11269, 8943, 5460,
+ 9931, 11269, 8987, 2,
+ 9931, 11269, 9067, 14,
+ 9931, 11269, 9067, 16,
+ 9931, 11269, 9067, 30,
+ 9931, 11269, 9067, 50,
+ 9931, 11269, 9067, 144,
+ 9931, 11269, 9067, 162,
+ 9931, 11269, 9067, 216,
+ 9931, 11269, 9067, 220,
+ 9931, 11269, 9067, 224,
+ 9931, 11269, 9067, 228,
+ 9931, 11269, 9067, 230,
+ 9931, 11269, 9067, 242,
+ 9931, 11269, 9067, 292,
+ 9931, 11269, 9067, 294,
+ 9931, 11269, 9067, 296,
+ 9931, 11269, 9067, 298,
+ 9931, 11269, 9067, 300,
+ 9931, 11269, 9067, 316,
+ 9931, 11269, 9067, 332,
+ 9931, 11269, 9067, 336,
+ 9931, 11269, 9067, 340,
+ 9931, 11269, 9067, 350,
+ 9931, 11269, 9067, 354,
+ 9931, 11269, 9067, 364,
+ 9931, 11269, 9067, 368,
+ 9931, 11269, 9067, 374,
+ 9931, 11269, 9067, 380,
+ 9931, 11269, 9067, 384,
+ 9931, 11269, 9067, 392,
+ 9931, 11269, 9067, 396,
+ 9931, 11269, 9067, 400,
+ 9931, 11269, 9067, 404,
+ 9931, 11269, 9067, 412,
+ 9931, 11269, 9067, 416,
+ 9931, 11269, 9067, 462,
+ 9931, 11269, 9067, 468,
+ 9931, 11269, 9067, 476,
+ 9931, 11269, 9067, 480,
+ 9931, 11269, 9067, 486,
+ 9931, 11269, 9067, 510,
+ 9931, 11269, 9067, 512,
+ 9931, 11269, 9067, 514,
+ 9931, 11269, 9067, 516,
+ 9931, 11269, 9067, 520,
+ 9931, 11269, 9067, 524,
+ 9931, 11269, 9067, 526,
+ 9931, 11269, 9067, 530,
+ 9931, 11269, 9067, 532,
+ 9931, 11269, 9067, 536,
+ 9931, 11269, 9067, 546,
+ 9931, 11269, 9067, 622,
+ 9931, 11269, 9067, 626,
+ 9931, 11269, 9067, 630,
+ 9931, 11269, 9067, 632,
+ 9931, 11269, 9067, 634,
+ 9931, 11269, 9067, 652,
+ 9931, 11269, 9067, 654,
+ 9931, 11269, 9067, 656,
+ 9931, 11269, 9067, 660,
+ 9931, 11269, 9067, 664,
+ 9931, 11269, 9067, 670,
+ 9931, 11269, 9067, 672,
+ 9931, 11269, 9067, 676,
+ 9931, 11269, 9067, 678,
+ 9931, 11269, 9067, 680,
+ 9931, 11269, 9067, 884,
+ 9931, 11269, 9067, 886,
+ 9931, 11269, 9067, 888,
+ 9931, 11269, 9067, 890,
+ 9931, 11269, 9067, 892,
+ 9931, 11269, 9067, 984,
+ 9931, 11269, 9067, 1024,
+ 9931, 11269, 9067, 1026,
+ 9931, 11269, 9067, 1028,
+ 9931, 11269, 9067, 1030,
+ 9931, 11269, 9067, 1032,
+ 9931, 11269, 9067, 1080,
+ 9931, 11269, 9067, 1082,
+ 9931, 11269, 9067, 1084,
+ 9931, 11269, 9067, 1086,
+ 9931, 11269, 9067, 1088,
+ 9931, 11269, 9067, 1238,
+ 9931, 11269, 9067, 1260,
+ 9931, 11269, 9067, 1262,
+ 9931, 11269, 9067, 1264,
+ 9931, 11269, 9067, 1266,
+ 9931, 11269, 9067, 1268,
+ 9931, 11269, 9067, 1356,
+ 9931, 11269, 9067, 1440,
+ 9931, 11269, 9067, 1442,
+ 9931, 11269, 9067, 1444,
+ 9931, 11269, 9067, 1446,
+ 9931, 11269, 9067, 1448,
+ 9931, 11269, 9067, 1506,
+ 9931, 11269, 9067, 1528,
+ 9931, 11269, 9067, 1530,
+ 9931, 11269, 9067, 1532,
+ 9931, 11269, 9067, 1534,
+ 9931, 11269, 9067, 1536,
+ 9931, 11269, 9067, 1612,
+ 9931, 11269, 9067, 1614,
+ 9931, 11269, 9067, 1616,
+ 9931, 11269, 9067, 1618,
+ 9931, 11269, 9067, 1620,
+ 9931, 11269, 9067, 1642,
+ 9931, 11269, 9067, 1644,
+ 9931, 11269, 9067, 1646,
+ 9931, 11269, 9067, 1648,
+ 9931, 11269, 9067, 1650,
+ 9931, 11269, 9067, 1758,
+ 9931, 11269, 9067, 1770,
+ 9931, 11269, 9067, 1772,
+ 9931, 11269, 9067, 1774,
+ 9931, 11269, 9067, 1776,
+ 9931, 11269, 9067, 1778,
+ 9931, 11269, 9067, 1890,
+ 9931, 11269, 9067, 2016,
+ 9931, 11269, 9067, 2204,
+ 9931, 11269, 9067, 2402,
+ 9931, 11269, 9067, 2504,
+ 9931, 11269, 9067, 2516,
+ 9931, 11269, 9067, 2518,
+ 9931, 11269, 9067, 2520,
+ 9931, 11269, 9067, 2522,
+ 9931, 11269, 9067, 2524,
+ 9931, 11269, 9067, 2678,
+ 9931, 11269, 9067, 2680,
+ 9931, 11269, 9067, 2682,
+ 9931, 11269, 9067, 2684,
+ 9931, 11269, 9067, 2686,
+ 9931, 11269, 9067, 2706,
+ 9931, 11269, 9067, 2708,
+ 9931, 11269, 9067, 2710,
+ 9931, 11269, 9067, 2712,
+ 9931, 11269, 9067, 2714,
+ 9931, 11269, 9067, 2732,
+ 9931, 11269, 9067, 2734,
+ 9931, 11269, 9067, 2736,
+ 9931, 11269, 9067, 2738,
+ 9931, 11269, 9067, 2740,
+ 9931, 11269, 9067, 2746,
+ 9931, 11269, 9067, 2748,
+ 9931, 11269, 9067, 2752,
+ 9931, 11269, 9067, 2754,
+ 9931, 11269, 9067, 2756,
+ 9931, 11269, 9067, 2922,
+ 9931, 11269, 9067, 3050,
+ 9931, 11269, 9067, 3138,
+ 9931, 11269, 9067, 3890,
+ 9931, 11269, 9067, 4098,
+ 9931, 11269, 9067, 4138,
+ 9931, 11269, 9067, 4318,
+ 9931, 11269, 9067, 4556,
+ 9931, 11269, 9067, 4644,
+ 9931, 11269, 9067, 4744,
+ 9931, 11269, 9067, 4766,
+ 9931, 11269, 9067, 4860,
+ 9931, 11269, 9067, 5678,
+ 9931, 11269, 9067, 5914,
+ 9931, 11269, 9067, 5950,
+ 9931, 11269, 9067, 5952,
+ 9931, 11269, 9067, 5954,
+ 9931, 11269, 9067, 5956,
+ 9931, 11269, 9067, 5958,
+ 9931, 11269, 9067, 5960,
+ 9931, 11269, 9067, 5976,
+ 9931, 11269, 9067, 5990,
+ 9931, 11269, 9067, 6002,
+ 9931, 11269, 9067, 6004,
+ 9931, 11269, 9067, 6006,
+ 9931, 11269, 9067, 6008,
+ 9931, 11269, 9067, 6010,
+ 9931, 11269, 9067, 7720,
+ 9931, 11269, 9067, 7748,
+ 9931, 11269, 9067, 9363, 50,
+ 9931, 11269, 9313, 5836,
+ 9931, 11269, 9489, 2480,
+ 9931, 11269, 9489, 2544,
+ 9931, 11269, 9489, 2906,
+ 9931, 11269, 9489, 2942,
+ 9931, 11269, 9489, 3970,
+ 9931, 11269, 9489, 4796,
+ 9931, 11269, 9489, 5032,
+ 9931, 11269, 9489, 5290,
+ 9931, 11269, 9489, 5644,
+ 9931, 11269, 9489, 5774,
+ 9931, 11269, 9489, 5784,
+ 9931, 11269, 9489, 5838,
+ 9931, 11269, 9489, 5858,
+ 9931, 11269, 9489, 6024,
+ 9931, 11269, 9489, 6246,
+ 9931, 11269, 9517, 14,
+ 9931, 11269, 9517, 236,
+ 9931, 11269, 9517, 238,
+ 9931, 11269, 9517, 242,
+ 9931, 11269, 9517, 246,
+ 9931, 11269, 9517, 1338,
+ 9931, 11269, 9517, 1382,
+ 9931, 11269, 9517, 1424,
+ 9931, 11269, 9519, 14,
+ 9931, 11269, 9777, 562,
+ 9931, 11269, 9777, 2678,
+ 9931, 11269, 9777, 2680,
+ 9931, 11269, 9777, 2682,
+ 9931, 11269, 9777, 2684,
+ 9931, 11269, 9777, 5906,
+ 9931, 11269, 9777, 5924,
+ 9931, 11269, 9777, 5930,
+ 9931, 11269, 10743, 0,
+ 9931, 11269, 10743, 8,
+ 9931, 11269, 10743, 16,
+ 9931, 11269, 10743, 28,
+ 9931, 11269, 10743, 36,
+ 9931, 11269, 10743, 306,
+ 9931, 11269, 10743, 310,
+ 9931, 11269, 10743, 314,
+ 9931, 11269, 10743, 322,
+ 9931, 11269, 10743, 392,
+ 9931, 11269, 10743, 396,
+ 9931, 11269, 10743, 404,
+ 9931, 11269, 10743, 412,
+ 9931, 11269, 10743, 622,
+ 9931, 11269, 10743, 626,
+ 9931, 11269, 10743, 630,
+ 9931, 11269, 10743, 632,
+ 9931, 11269, 11399, 22,
+ 9931, 11269, 11399, 24,
+ 9931, 11269, 11399, 30,
+ 9931, 11269, 11399, 34,
+ 9931, 11269, 11399, 48,
+ 9931, 11269, 11399, 332,
+ 9931, 11269, 11399, 336,
+ 9931, 11269, 11399, 350,
+ 9931, 11269, 11399, 510,
+ 9931, 11269, 11399, 512,
+ 9931, 11269, 11399, 514,
+ 9931, 11269, 11399, 516,
+ 9931, 11269, 11399, 622,
+ 9931, 11269, 11399, 626,
+ 9931, 11269, 11399, 630,
+ 9931, 11269, 11399, 632,
+ 9931, 11269, 11399, 936,
+ 9931, 11269, 11399, 938,
+ 9931, 11269, 11399, 940,
+ 9931, 11269, 11399, 942,
+ 9931, 11269, 11399, 1704,
+ 9931, 11269, 11399, 1706,
+ 9931, 11269, 11399, 1708,
+ 9931, 11269, 11399, 1710,
+ 9931, 11269, 11399, 1834,
+ 9931, 11269, 11399, 1836,
+ 9931, 11269, 11399, 1838,
+ 9931, 11269, 11399, 1840,
+ 9931, 11269, 11399, 1964,
+ 9931, 11269, 11399, 1966,
+ 9931, 11269, 11399, 1968,
+ 9931, 11269, 11399, 1970,
+ 9931, 11269, 11399, 2122,
+ 9931, 11269, 11399, 2124,
+ 9931, 11269, 11399, 2266,
+ 9931, 11269, 11399, 2268,
+ 9931, 11269, 11399, 2270,
+ 9931, 11269, 11399, 2272,
+ 9931, 11269, 11399, 2598,
+ 9931, 11269, 11399, 2600,
+ 9931, 11269, 11399, 2604,
+ 9931, 11269, 11399, 2606,
+ 9931, 11269, 11399, 2772,
+ 9931, 11269, 11399, 2774,
+ 9931, 11269, 11399, 2776,
+ 9931, 11269, 11399, 2778,
+ 9931, 11269, 11399, 2906,
+ 9931, 11269, 11399, 2932,
+ 9931, 11269, 11399, 2942,
+ 9931, 11269, 11399, 3102,
+ 9931, 11269, 11399, 3104,
+ 9931, 11269, 11399, 3106,
+ 9931, 11269, 11399, 3108,
+ 9931, 11269, 11399, 3970,
+ 9931, 11269, 11399, 3972,
+ 9931, 11269, 11399, 3974,
+ 9931, 11269, 11399, 4230,
+ 9931, 11269, 11399, 4796,
+ 9931, 11269, 11399, 4800,
+ 9931, 11269, 11399, 4802,
+ 9931, 11269, 11399, 4910,
+ 9931, 11269, 11399, 4912,
+ 9931, 11269, 11399, 4914,
+ 9931, 11269, 11399, 5032,
+ 9931, 11269, 11399, 5036,
+ 9931, 11269, 11399, 5038,
+ 9931, 11269, 11399, 5290,
+ 9931, 11269, 11399, 5460,
+ 9931, 11269, 11399, 5464,
+ 9931, 11269, 11399, 5466,
+ 9931, 11269, 11399, 5616,
+ 9931, 11269, 11399, 5732,
+ 9931, 11269, 11399, 5734,
+ 9931, 11269, 11399, 5736,
+ 9931, 11269, 11399, 5738,
+ 9931, 11269, 11399, 5858,
+ 9931, 11269, 11399, 5860,
+ 9931, 11269, 11399, 5862,
+ 9931, 11269, 11399, 6024,
+ 9931, 11269, 11399, 6026,
+ 9931, 11269, 11399, 6028,
+ 9931, 11269, 11399, 6246,
+ 9931, 11269, 11399, 6248,
+ 9931, 11269, 11399, 6250,
+ 9931, 11269, 11399, 7558,
+ 9931, 11269, 11399, 7560,
+ 9931, 11269, 11399, 7562,
+ 9931, 11269, 11399, 7700,
+ 9931, 11269, 11435, 24,
+ 9931, 11269, 11435, 36,
+ 9931, 11269, 11443, 48,
+ 9931, 11269, 11689, 534,
+ 9931, 11269, 11883, 562,
+ 9931, 11269, 11883, 2678,
+ 9931, 11269, 11883, 2680,
+ 9931, 11269, 11883, 2682,
+ 9931, 11269, 11883, 2684,
+ 9931, 11269, 12869, 1580,
+ 9931, 11269, 12869, 1600,
+ 9931, 11269, 12869, 1628,
+ 9931, 11269, 12869, 1656,
+ 9941, 8405, 0,
+ 9941, 8405, 8,
+ 9941, 8405, 16,
+ 9941, 8405, 28,
+ 9941, 8405, 36,
+ 9941, 8405, 40,
+ 9941, 8405, 42,
+ 9941, 8405, 138,
+ 9941, 8405, 142,
+ 9941, 8405, 144,
+ 9941, 8405, 150,
+ 9941, 8405, 152,
+ 9941, 8405, 154,
+ 9941, 8405, 216,
+ 9941, 8405, 220,
+ 9941, 8405, 224,
+ 9941, 8405, 228,
+ 9941, 8405, 230,
+ 9941, 8405, 232,
+ 9941, 8405, 236,
+ 9941, 8405, 238,
+ 9941, 8405, 242,
+ 9941, 8405, 246,
+ 9941, 8405, 250,
+ 9941, 8405, 252,
+ 9941, 8405, 306,
+ 9941, 8405, 332,
+ 9941, 8405, 336,
+ 9941, 8405, 340,
+ 9941, 8405, 350,
+ 9941, 8405, 354,
+ 9941, 8405, 356,
+ 9941, 8405, 364,
+ 9941, 8405, 368,
+ 9941, 8405, 374,
+ 9941, 8405, 380,
+ 9941, 8405, 384,
+ 9941, 8405, 392,
+ 9941, 8405, 396,
+ 9941, 8405, 404,
+ 9941, 8405, 412,
+ 9941, 8405, 416,
+ 9941, 8405, 418,
+ 9941, 8405, 524,
+ 9941, 8405, 526,
+ 9941, 8405, 532,
+ 9941, 8405, 536,
+ 9941, 8405, 546,
+ 9941, 8405, 548,
+ 9941, 8405, 556,
+ 9941, 8405, 560,
+ 9941, 8405, 564,
+ 9941, 8405, 622,
+ 9941, 8405, 626,
+ 9941, 8405, 630,
+ 9941, 8405, 632,
+ 9941, 8405, 634,
+ 9941, 8405, 636,
+ 9941, 8405, 652,
+ 9941, 8405, 654,
+ 9941, 8405, 656,
+ 9941, 8405, 660,
+ 9941, 8405, 664,
+ 9941, 8405, 666,
+ 9941, 8405, 1024,
+ 9941, 8405, 1412,
+ 9941, 8405, 1986,
+ 9941, 8405, 2328,
+ 9941, 8405, 2330,
+ 9941, 8405, 2332,
+ 9941, 8405, 2336,
+ 9941, 8405, 2344,
+ 9941, 8405, 2346,
+ 9941, 8405, 2706,
+ 9941, 8405, 2708,
+ 9941, 8405, 2710,
+ 9941, 8405, 2712,
+ 9941, 8405, 2714,
+ 9941, 8405, 2716,
+ 9941, 8405, 2732,
+ 9941, 8405, 2734,
+ 9941, 8405, 2736,
+ 9941, 8405, 2738,
+ 9941, 8405, 2740,
+ 9941, 8405, 2742,
+ 9959, 89, 8466,
+ 9959, 89, 8521, 10572,
+ 9959, 89, 8521, 10573, 445, 6741, 568,
+ 9959, 6121, 4895, 11649, 8758,
+ 9959, 6121, 9546,
+ 9959, 6121, 10677, 761, 91, 1109, 429, 11649, 8758,
+ 9961, 2429, 5895, 6689, 2170,
+ 9961, 2429, 5895, 6689, 2540,
+ 9961, 2429, 5895, 6689, 2778,
+ 9961, 2429, 5895, 6689, 4200,
+ 9961, 2429, 5895, 6689, 4214,
+ 9961, 2429, 5895, 6689, 5190,
+ 9961, 2429, 5895, 6689, 6722,
+ 9961, 2429, 5895, 6689, 7508,
+ 9961, 2429, 5895, 6689, 7694,
+ 9961, 2429, 6053, 6689, 2170,
+ 9961, 2429, 6053, 6689, 2540,
+ 9961, 2429, 6053, 6689, 2778,
+ 9961, 2429, 6053, 6689, 4200,
+ 9961, 2429, 6053, 6689, 4214,
+ 9961, 2429, 6053, 6689, 5190,
+ 9961, 2429, 6053, 6689, 6722,
+ 9961, 2429, 6053, 6689, 7508,
+ 9961, 2429, 6053, 6689, 7694,
+ 9969, 5758,
+ 9971, 5758,
+ 9977, 7593, 8405, 0,
+ 9977, 7593, 8405, 1, 6121, 6516,
+ 9977, 7593, 8405, 1, 6121, 10804,
+ 9977, 7593, 8405, 8,
+ 9977, 7593, 8405, 9, 6121, 10804,
+ 9977, 7593, 8405, 16,
+ 9977, 7593, 8405, 17, 6121, 6874,
+ 9977, 7593, 8405, 17, 6121, 8432,
+ 9977, 7593, 8405, 17, 6121, 10804,
+ 9977, 7593, 8405, 28,
+ 9977, 7593, 8405, 29, 6121, 10804,
+ 9977, 7593, 8405, 40,
+ 9977, 7593, 8405, 41, 6121, 8153, 6378,
+ 9977, 7593, 8405, 41, 6121, 8432,
+ 9977, 7593, 8405, 41, 6121, 10804,
+ 9977, 7593, 8405, 102,
+ 9977, 7593, 8405, 142,
+ 9977, 7593, 8405, 164,
+ 9977, 7593, 8405, 172,
+ 9977, 7593, 8405, 173, 6121, 4530,
+ 9977, 7593, 8405, 173, 6121, 5878,
+ 9977, 7593, 8405, 173, 6121, 8473, 4530,
+ 9977, 7593, 8405, 174,
+ 9977, 7593, 8405, 175, 6121, 5878,
+ 9977, 7593, 8405, 176,
+ 9977, 7593, 8405, 177, 6121, 4530,
+ 9977, 7593, 8405, 177, 6121, 5878,
+ 9977, 7593, 8405, 177, 6121, 8473, 4530,
+ 9977, 7593, 8405, 177, 6121, 10802,
+ 9977, 7593, 8405, 182,
+ 9977, 7593, 8405, 183, 6121, 5934,
+ 9977, 7593, 8405, 184,
+ 9977, 7593, 8405, 185, 6121, 10802,
+ 9977, 7593, 8405, 236,
+ 9977, 7593, 8405, 237, 6121, 4530,
+ 9977, 7593, 8405, 237, 6121, 8758,
+ 9977, 7593, 8405, 237, 6121, 10802,
+ 9977, 7593, 8405, 258,
+ 9977, 7593, 8405, 259, 6121, 6516,
+ 9977, 7593, 8405, 259, 6121, 6874,
+ 9977, 7593, 8405, 276,
+ 9977, 7593, 8405, 294,
+ 9977, 7593, 8405, 306,
+ 9977, 7593, 8405, 307, 6121, 4530,
+ 9977, 7593, 8405, 307, 6121, 8758,
+ 9977, 7593, 8405, 307, 6121, 10677, 8758,
+ 9977, 7593, 8405, 307, 6121, 10802,
+ 9977, 7593, 8405, 448,
+ 9977, 7593, 8405, 468,
+ 9977, 7593, 8405, 469, 6121, 8473, 4530,
+ 9977, 7593, 8405, 496,
+ 9977, 7593, 8405, 560,
+ 9977, 7593, 8405, 561, 6121, 8473, 4530,
+ 9977, 7593, 8405, 561, 6121, 10802,
+ 9977, 7593, 8405, 592,
+ 9977, 7593, 8405, 612,
+ 9977, 7593, 8405, 626,
+ 9977, 7593, 8405, 652,
+ 9977, 7593, 8405, 656,
+ 9977, 7593, 8405, 658,
+ 9977, 7593, 8405, 664,
+ 9977, 7593, 8405, 672,
+ 9977, 7593, 8405, 673, 6121, 10802,
+ 9977, 7593, 8405, 673, 6121, 10804,
+ 9977, 7593, 8405, 807, 3096,
+ 9977, 7593, 8405, 886,
+ 9977, 7593, 8405, 887, 6121, 10677, 8758,
+ 9977, 7593, 8405, 887, 6121, 10802,
+ 9977, 7593, 8405, 887, 6121, 10804,
+ 9977, 7593, 8405, 1022,
+ 9977, 7593, 8405, 1074,
+ 9977, 7593, 8405, 1082,
+ 9977, 7593, 8405, 1262,
+ 9977, 7593, 8405, 1263, 6121, 8473, 4530,
+ 9977, 7593, 8405, 1263, 6121, 8758,
+ 9977, 7593, 8405, 1263, 6121, 8759, 721, 4530,
+ 9977, 7593, 8405, 1263, 6121, 8896,
+ 9977, 7593, 8405, 1263, 6121, 10802,
+ 9977, 7593, 8405, 1284,
+ 9977, 7593, 8405, 1442,
+ 9977, 7593, 8405, 1640,
+ 9977, 7593, 8405, 1680,
+ 9977, 7593, 8405, 1770,
+ 9977, 7593, 8405, 1794,
+ 9977, 7593, 8405, 2064,
+ 9977, 7593, 8405, 2250,
+ 9977, 7593, 8405, 2410,
+ 9977, 7593, 8405, 2516,
+ 9977, 7593, 8405, 2734,
+ 9977, 7593, 8405, 2774,
+ 9977, 7593, 8405, 3012,
+ 9977, 7593, 8405, 3038,
+ 9977, 7593, 8405, 3148,
+ 9977, 7593, 8405, 3149, 6121, 6516,
+ 9977, 7593, 8405, 3149, 6121, 10802,
+ 9977, 7593, 8405, 3149, 6121, 10804,
+ 9977, 7593, 8405, 3862,
+ 9977, 7593, 8405, 4142,
+ 9977, 7593, 8405, 4146,
+ 9977, 7593, 8405, 4148,
+ 9977, 7593, 8405, 4198,
+ 9977, 7593, 8405, 4393, 5758,
+ 9977, 7593, 8405, 4614,
+ 9977, 7593, 8405, 4771, 142,
+ 9977, 7593, 8405, 4771, 1022,
+ 9977, 7593, 8405, 4771, 1794,
+ 9977, 7593, 8405, 4771, 2064,
+ 9977, 7593, 8405, 4771, 2542,
+ 9977, 7593, 8405, 4771, 2704,
+ 9977, 7593, 8405, 4771, 3172,
+ 9977, 7593, 8405, 4771, 4144,
+ 9977, 7593, 8405, 5690,
+ 9977, 7593, 8405, 5734,
+ 9977, 7593, 8405, 5781, 142,
+ 9977, 7593, 8405, 5781, 172,
+ 9977, 7593, 8405, 5781, 174,
+ 9977, 7593, 8405, 5781, 5758,
+ 9977, 7593, 8405, 5890,
+ 9977, 7593, 8405, 5980,
+ 9977, 7593, 8405, 5982,
+ 9977, 7593, 8405, 5986,
+ 9977, 7593, 8405, 6200,
+ 9977, 7593, 8405, 6201, 6121, 3697, 3058,
+ 9977, 7593, 8405, 6201, 6121, 10804,
+ 9977, 7593, 8405, 6302,
+ 9977, 7593, 8405, 6399, 306,
+ 9977, 7593, 8405, 6519, 7316,
+ 9977, 7593, 8405, 6696,
+ 9977, 7593, 8405, 6710,
+ 9977, 7593, 8405, 7062,
+ 9977, 7593, 8405, 7316,
+ 9977, 7593, 8405, 7317, 6121, 7716,
+ 9977, 7593, 8405, 7455, 7316,
+ 9977, 7593, 8405, 7494,
+ 9977, 7593, 8405, 7495, 6121, 10804,
+ 9977, 7593, 8405, 7522,
+ 9977, 7593, 8405, 7551, 16,
+ 9977, 7593, 8405, 7551, 17, 6121, 5878,
+ 9977, 7593, 8405, 7551, 40,
+ 9977, 7593, 8405, 7981, 28,
+ 9977, 7593, 8405, 7981, 29, 6121, 10804,
+ 9977, 7593, 8405, 8065, 8425, 3096,
+ 9977, 7593, 8405, 8153, 11125, 28,
+ 9977, 7593, 8405, 8425, 3096,
+ 9977, 7593, 8405, 8960,
+ 9977, 7593, 8405, 9029, 306,
+ 9977, 7593, 8405, 9049, 3096,
+ 9977, 7593, 8405, 9372,
+ 9977, 7593, 8405, 9373, 6121, 8153, 6875, 7908,
+ 9977, 7593, 8405, 9501, 3058,
+ 9977, 7593, 8405, 10269, 0,
+ 9977, 7593, 8405, 10269, 8,
+ 9977, 7593, 8405, 10269, 807, 3096,
+ 9977, 7593, 8405, 10269, 3038,
+ 9977, 7593, 8405, 10269, 8065, 8425, 3096,
+ 9977, 7593, 8405, 10269, 8425, 3096,
+ 9977, 7593, 8405, 10396,
+ 9977, 7593, 8405, 10489, 664,
+ 9977, 7593, 8405, 10489, 672,
+ 9977, 7593, 8405, 10489, 1082,
+ 9977, 7593, 8405, 10509, 5758,
+ 9977, 7593, 8405, 10545, 40,
+ 9977, 7593, 8405, 10545, 41, 6121, 8758,
+ 9977, 7593, 8405, 10697, 236,
+ 9977, 7593, 8405, 10697, 886,
+ 9977, 7593, 8405, 10697, 887, 6121, 10802,
+ 9977, 7593, 8405, 10697, 1082,
+ 9977, 7593, 8405, 10735, 28,
+ 9977, 7593, 8405, 11125, 28,
+ 9977, 7593, 8405, 11127, 592,
+ 9977, 7593, 8405, 11383, 258,
+ 9977, 7593, 8405, 11665, 886,
+ 9977, 7593, 8405, 13415, 16,
+ 9977, 7593, 10301, 1, 258,
+ 9977, 7593, 10301, 177, 1262,
+ 9977, 7593, 10301, 561, 2734,
+ 9977, 8342,
+ 9977, 8405, 7593, 9063, 172,
+ 9977, 8405, 10396,
+ 9977, 8405, 12087, 28,
+ 9977, 9063, 8405, 0,
+ 9977, 9063, 8405, 1, 6121, 6516,
+ 9977, 9063, 8405, 1, 6121, 10804,
+ 9977, 9063, 8405, 8,
+ 9977, 9063, 8405, 9, 6121, 10804,
+ 9977, 9063, 8405, 16,
+ 9977, 9063, 8405, 17, 6121, 6874,
+ 9977, 9063, 8405, 17, 6121, 8432,
+ 9977, 9063, 8405, 17, 6121, 10804,
+ 9977, 9063, 8405, 28,
+ 9977, 9063, 8405, 29, 6121, 10804,
+ 9977, 9063, 8405, 40,
+ 9977, 9063, 8405, 41, 6121, 8153, 6378,
+ 9977, 9063, 8405, 41, 6121, 8432,
+ 9977, 9063, 8405, 41, 6121, 10804,
+ 9977, 9063, 8405, 102,
+ 9977, 9063, 8405, 142,
+ 9977, 9063, 8405, 164,
+ 9977, 9063, 8405, 172,
+ 9977, 9063, 8405, 173, 6121, 4530,
+ 9977, 9063, 8405, 173, 6121, 5878,
+ 9977, 9063, 8405, 173, 6121, 8473, 4530,
+ 9977, 9063, 8405, 174,
+ 9977, 9063, 8405, 175, 6121, 5878,
+ 9977, 9063, 8405, 176,
+ 9977, 9063, 8405, 177, 6121, 4530,
+ 9977, 9063, 8405, 177, 6121, 5878,
+ 9977, 9063, 8405, 177, 6121, 8473, 4530,
+ 9977, 9063, 8405, 177, 6121, 10802,
+ 9977, 9063, 8405, 182,
+ 9977, 9063, 8405, 183, 6121, 5934,
+ 9977, 9063, 8405, 184,
+ 9977, 9063, 8405, 185, 6121, 10802,
+ 9977, 9063, 8405, 236,
+ 9977, 9063, 8405, 237, 6121, 4530,
+ 9977, 9063, 8405, 237, 6121, 8758,
+ 9977, 9063, 8405, 237, 6121, 10802,
+ 9977, 9063, 8405, 258,
+ 9977, 9063, 8405, 259, 6121, 6516,
+ 9977, 9063, 8405, 259, 6121, 6874,
+ 9977, 9063, 8405, 276,
+ 9977, 9063, 8405, 294,
+ 9977, 9063, 8405, 306,
+ 9977, 9063, 8405, 307, 6121, 4530,
+ 9977, 9063, 8405, 307, 6121, 8758,
+ 9977, 9063, 8405, 307, 6121, 10677, 8758,
+ 9977, 9063, 8405, 307, 6121, 10802,
+ 9977, 9063, 8405, 448,
+ 9977, 9063, 8405, 468,
+ 9977, 9063, 8405, 469, 6121, 8473, 4530,
+ 9977, 9063, 8405, 496,
+ 9977, 9063, 8405, 560,
+ 9977, 9063, 8405, 561, 6121, 8473, 4530,
+ 9977, 9063, 8405, 561, 6121, 10802,
+ 9977, 9063, 8405, 592,
+ 9977, 9063, 8405, 612,
+ 9977, 9063, 8405, 626,
+ 9977, 9063, 8405, 652,
+ 9977, 9063, 8405, 656,
+ 9977, 9063, 8405, 658,
+ 9977, 9063, 8405, 664,
+ 9977, 9063, 8405, 672,
+ 9977, 9063, 8405, 673, 6121, 10802,
+ 9977, 9063, 8405, 673, 6121, 10804,
+ 9977, 9063, 8405, 807, 3096,
+ 9977, 9063, 8405, 886,
+ 9977, 9063, 8405, 887, 6121, 10677, 8758,
+ 9977, 9063, 8405, 887, 6121, 10802,
+ 9977, 9063, 8405, 887, 6121, 10804,
+ 9977, 9063, 8405, 1022,
+ 9977, 9063, 8405, 1074,
+ 9977, 9063, 8405, 1082,
+ 9977, 9063, 8405, 1262,
+ 9977, 9063, 8405, 1263, 6121, 8473, 4530,
+ 9977, 9063, 8405, 1263, 6121, 8758,
+ 9977, 9063, 8405, 1263, 6121, 8759, 721, 4530,
+ 9977, 9063, 8405, 1263, 6121, 8896,
+ 9977, 9063, 8405, 1263, 6121, 10802,
+ 9977, 9063, 8405, 1284,
+ 9977, 9063, 8405, 1442,
+ 9977, 9063, 8405, 1640,
+ 9977, 9063, 8405, 1680,
+ 9977, 9063, 8405, 1770,
+ 9977, 9063, 8405, 1794,
+ 9977, 9063, 8405, 2064,
+ 9977, 9063, 8405, 2250,
+ 9977, 9063, 8405, 2410,
+ 9977, 9063, 8405, 2516,
+ 9977, 9063, 8405, 2734,
+ 9977, 9063, 8405, 2774,
+ 9977, 9063, 8405, 3012,
+ 9977, 9063, 8405, 3038,
+ 9977, 9063, 8405, 3148,
+ 9977, 9063, 8405, 3149, 6121, 6516,
+ 9977, 9063, 8405, 3149, 6121, 10802,
+ 9977, 9063, 8405, 3149, 6121, 10804,
+ 9977, 9063, 8405, 3862,
+ 9977, 9063, 8405, 4142,
+ 9977, 9063, 8405, 4146,
+ 9977, 9063, 8405, 4148,
+ 9977, 9063, 8405, 4198,
+ 9977, 9063, 8405, 4393, 5758,
+ 9977, 9063, 8405, 4614,
+ 9977, 9063, 8405, 4771, 142,
+ 9977, 9063, 8405, 4771, 1022,
+ 9977, 9063, 8405, 4771, 1794,
+ 9977, 9063, 8405, 4771, 2064,
+ 9977, 9063, 8405, 4771, 2542,
+ 9977, 9063, 8405, 4771, 2704,
+ 9977, 9063, 8405, 4771, 3172,
+ 9977, 9063, 8405, 4771, 4144,
+ 9977, 9063, 8405, 5690,
+ 9977, 9063, 8405, 5734,
+ 9977, 9063, 8405, 5781, 142,
+ 9977, 9063, 8405, 5781, 172,
+ 9977, 9063, 8405, 5781, 174,
+ 9977, 9063, 8405, 5781, 5758,
+ 9977, 9063, 8405, 5890,
+ 9977, 9063, 8405, 5980,
+ 9977, 9063, 8405, 5982,
+ 9977, 9063, 8405, 5986,
+ 9977, 9063, 8405, 6200,
+ 9977, 9063, 8405, 6201, 6121, 3697, 3058,
+ 9977, 9063, 8405, 6201, 6121, 10804,
+ 9977, 9063, 8405, 6302,
+ 9977, 9063, 8405, 6399, 306,
+ 9977, 9063, 8405, 6519, 7316,
+ 9977, 9063, 8405, 6696,
+ 9977, 9063, 8405, 6710,
+ 9977, 9063, 8405, 7062,
+ 9977, 9063, 8405, 7316,
+ 9977, 9063, 8405, 7317, 6121, 7716,
+ 9977, 9063, 8405, 7455, 7316,
+ 9977, 9063, 8405, 7494,
+ 9977, 9063, 8405, 7495, 6121, 10804,
+ 9977, 9063, 8405, 7522,
+ 9977, 9063, 8405, 7551, 16,
+ 9977, 9063, 8405, 7551, 17, 6121, 5878,
+ 9977, 9063, 8405, 7551, 40,
+ 9977, 9063, 8405, 7981, 28,
+ 9977, 9063, 8405, 7981, 29, 6121, 10804,
+ 9977, 9063, 8405, 8065, 8425, 3096,
+ 9977, 9063, 8405, 8153, 11125, 28,
+ 9977, 9063, 8405, 8425, 3096,
+ 9977, 9063, 8405, 8960,
+ 9977, 9063, 8405, 9029, 306,
+ 9977, 9063, 8405, 9049, 3096,
+ 9977, 9063, 8405, 9372,
+ 9977, 9063, 8405, 9373, 6121, 8153, 6875, 7908,
+ 9977, 9063, 8405, 9501, 3058,
+ 9977, 9063, 8405, 10269, 0,
+ 9977, 9063, 8405, 10269, 8,
+ 9977, 9063, 8405, 10269, 807, 3096,
+ 9977, 9063, 8405, 10269, 3038,
+ 9977, 9063, 8405, 10269, 8065, 8425, 3096,
+ 9977, 9063, 8405, 10269, 8425, 3096,
+ 9977, 9063, 8405, 10489, 664,
+ 9977, 9063, 8405, 10489, 672,
+ 9977, 9063, 8405, 10489, 1082,
+ 9977, 9063, 8405, 10509, 5758,
+ 9977, 9063, 8405, 10545, 40,
+ 9977, 9063, 8405, 10545, 41, 6121, 8758,
+ 9977, 9063, 8405, 10697, 236,
+ 9977, 9063, 8405, 10697, 886,
+ 9977, 9063, 8405, 10697, 887, 6121, 10802,
+ 9977, 9063, 8405, 10697, 1082,
+ 9977, 9063, 8405, 10735, 28,
+ 9977, 9063, 8405, 11125, 28,
+ 9977, 9063, 8405, 11127, 592,
+ 9977, 9063, 8405, 11383, 258,
+ 9977, 9063, 8405, 11665, 886,
+ 9977, 9063, 8405, 13415, 16,
+ 9977, 9063, 10301, 1, 258,
+ 9977, 9063, 10301, 177, 1262,
+ 9977, 9063, 10301, 561, 2734,
+ 9977, 9578,
+ 9977, 11363, 5758,
+ 10003, 5758,
+ 10017, 5758,
+ 10017, 7580,
+ 10017, 7710,
+ 10141, 7383, 11765, 6434,
+ 10153, 6434,
+ 10157, 8774,
+ 10162,
+ 10171, 4223, 5836,
+ 10171, 6610,
+ 10171, 6616,
+ 10171, 6689, 2170,
+ 10171, 6689, 2540,
+ 10171, 6689, 2778,
+ 10171, 6689, 4200,
+ 10171, 6689, 4214,
+ 10171, 6689, 5190,
+ 10171, 6689, 6722,
+ 10171, 6689, 7508,
+ 10171, 6689, 7694,
+ 10171, 7723, 4927, 4790,
+ 10171, 7723, 4927, 6676,
+ 10171, 7723, 4927, 6686,
+ 10171, 7723, 4927, 6910,
+ 10171, 7723, 4927, 7038,
+ 10171, 7723, 4927, 7551, 8646,
+ 10171, 7723, 4927, 7860,
+ 10171, 7723, 4927, 8046,
+ 10171, 7723, 4927, 8646,
+ 10171, 7723, 4927, 11934,
+ 10171, 8525, 2670,
+ 10171, 8525, 2671, 10624,
+ 10171, 8525, 6784,
+ 10171, 8525, 6804,
+ 10171, 8525, 7576,
+ 10171, 8525, 8160,
+ 10171, 8525, 8514,
+ 10171, 8525, 8820,
+ 10171, 8525, 8876,
+ 10171, 8525, 9344,
+ 10171, 8525, 9672,
+ 10171, 9607, 6610,
+ 10171, 9665, 4926,
+ 10171, 10469, 4926,
+ 10171, 10585, 100,
+ 10171, 10585, 102,
+ 10171, 10585, 106,
+ 10171, 10585, 108,
+ 10171, 10585, 112,
+ 10171, 10585, 116,
+ 10171, 10585, 122,
+ 10171, 10585, 126,
+ 10171, 10585, 130,
+ 10171, 10585, 132,
+ 10171, 10585, 138,
+ 10171, 10585, 142,
+ 10171, 10585, 144,
+ 10171, 10585, 150,
+ 10171, 10585, 152,
+ 10171, 10585, 196,
+ 10171, 10585, 198,
+ 10171, 10585, 202,
+ 10171, 10585, 208,
+ 10171, 10585, 210,
+ 10171, 10585, 216,
+ 10171, 10585, 220,
+ 10171, 10585, 224,
+ 10171, 10585, 228,
+ 10171, 10585, 230,
+ 10171, 10585, 236,
+ 10171, 10585, 238,
+ 10171, 10585, 242,
+ 10171, 10585, 246,
+ 10171, 10585, 250,
+ 10171, 10585, 292,
+ 10171, 10585, 294,
+ 10171, 10585, 296,
+ 10171, 10585, 298,
+ 10171, 10585, 300,
+ 10171, 10585, 306,
+ 10171, 10585, 310,
+ 10171, 10585, 314,
+ 10171, 10585, 322,
+ 10171, 10585, 326,
+ 10171, 10585, 332,
+ 10171, 10585, 336,
+ 10171, 10585, 340,
+ 10171, 10585, 350,
+ 10171, 10585, 354,
+ 10171, 10585, 364,
+ 10171, 10585, 368,
+ 10171, 10585, 374,
+ 10171, 10585, 380,
+ 10171, 10585, 384,
+ 10171, 10585, 392,
+ 10171, 10585, 396,
+ 10171, 10585, 404,
+ 10171, 10585, 412,
+ 10171, 10585, 416,
+ 10171, 10585, 462,
+ 10171, 10585, 468,
+ 10171, 10585, 476,
+ 10171, 10585, 480,
+ 10171, 10585, 486,
+ 10171, 10585, 496,
+ 10171, 10585, 498,
+ 10171, 10585, 500,
+ 10171, 10585, 502,
+ 10171, 10585, 506,
+ 10171, 10585, 510,
+ 10171, 10585, 512,
+ 10171, 10585, 514,
+ 10171, 10585, 516,
+ 10171, 10585, 520,
+ 10171, 10585, 524,
+ 10171, 10585, 526,
+ 10171, 10585, 532,
+ 10171, 10585, 536,
+ 10171, 10585, 546,
+ 10171, 10585, 556,
+ 10171, 10585, 560,
+ 10171, 10585, 564,
+ 10171, 10585, 568,
+ 10171, 10585, 576,
+ 10171, 10585, 610,
+ 10171, 10585, 612,
+ 10171, 10585, 614,
+ 10171, 10585, 616,
+ 10171, 10585, 618,
+ 10171, 10585, 622,
+ 10171, 10585, 626,
+ 10171, 10585, 630,
+ 10171, 10585, 632,
+ 10171, 10585, 634,
+ 10171, 10585, 638,
+ 10171, 10585, 640,
+ 10171, 10585, 644,
+ 10171, 10585, 646,
+ 10171, 10585, 648,
+ 10171, 10585, 652,
+ 10171, 10585, 654,
+ 10171, 10585, 656,
+ 10171, 10585, 660,
+ 10171, 10585, 664,
+ 10171, 10585, 670,
+ 10171, 10585, 672,
+ 10171, 10585, 676,
+ 10171, 10585, 678,
+ 10171, 10585, 680,
+ 10171, 10585, 748,
+ 10171, 10585, 778,
+ 10171, 10585, 816,
+ 10171, 10585, 838,
+ 10171, 10585, 840,
+ 10171, 10585, 842,
+ 10171, 10585, 854,
+ 10171, 10585, 866,
+ 10171, 10585, 868,
+ 10171, 10585, 870,
+ 10171, 10585, 872,
+ 10171, 10585, 874,
+ 10171, 10585, 876,
+ 10171, 10585, 884,
+ 10171, 10585, 886,
+ 10171, 10585, 888,
+ 10171, 10585, 890,
+ 10171, 10585, 892,
+ 10171, 10585, 910,
+ 10171, 10585, 936,
+ 10171, 10585, 954,
+ 10171, 10585, 974,
+ 10171, 10585, 976,
+ 10171, 10585, 978,
+ 10171, 10585, 980,
+ 10171, 10585, 982,
+ 10171, 10585, 984,
+ 10171, 10585, 1034,
+ 10171, 10585, 1072,
+ 10171, 10585, 1140,
+ 10171, 10585, 1150,
+ 10171, 10585, 1188,
+ 10171, 10585, 1190,
+ 10171, 10585, 1192,
+ 10171, 10585, 1194,
+ 10171, 10585, 1204,
+ 10171, 10585, 1238,
+ 10171, 10585, 1250,
+ 10171, 10585, 1252,
+ 10171, 10585, 1254,
+ 10171, 10585, 1256,
+ 10171, 10585, 1258,
+ 10171, 10585, 1288,
+ 10171, 10585, 1322,
+ 10171, 10585, 1324,
+ 10171, 10585, 1326,
+ 10171, 10585, 1328,
+ 10171, 10585, 1330,
+ 10171, 10585, 1332,
+ 10171, 10585, 1334,
+ 10171, 10585, 1336,
+ 10171, 10585, 1338,
+ 10171, 10585, 1356,
+ 10171, 10585, 1370,
+ 10171, 10585, 1372,
+ 10171, 10585, 1374,
+ 10171, 10585, 1376,
+ 10171, 10585, 1378,
+ 10171, 10585, 1418,
+ 10171, 10585, 1502,
+ 10171, 10585, 1506,
+ 10171, 10585, 1540,
+ 10171, 10585, 1562,
+ 10171, 10585, 1574,
+ 10171, 10585, 1598,
+ 10171, 10585, 1654,
+ 10171, 10585, 1704,
+ 10171, 10585, 1706,
+ 10171, 10585, 1708,
+ 10171, 10585, 1712,
+ 10171, 10585, 1714,
+ 10171, 10585, 1716,
+ 10171, 10585, 1718,
+ 10171, 10585, 1720,
+ 10171, 10585, 1722,
+ 10171, 10585, 1724,
+ 10171, 10585, 1726,
+ 10171, 10585, 1728,
+ 10171, 10585, 1730,
+ 10171, 10585, 1732,
+ 10171, 10585, 1758,
+ 10171, 10585, 1798,
+ 10171, 10585, 1834,
+ 10171, 10585, 1854,
+ 10171, 10585, 1890,
+ 10171, 10585, 1932,
+ 10171, 10585, 1964,
+ 10171, 10585, 1966,
+ 10171, 10585, 1968,
+ 10171, 10585, 1972,
+ 10171, 10585, 1982,
+ 10171, 10585, 2016,
+ 10171, 10585, 2082,
+ 10171, 10585, 2122,
+ 10171, 10585, 2126,
+ 10171, 10585, 2130,
+ 10171, 10585, 2132,
+ 10171, 10585, 2134,
+ 10171, 10585, 2136,
+ 10171, 10585, 2188,
+ 10171, 10585, 2204,
+ 10171, 10585, 2212,
+ 10171, 10585, 2214,
+ 10171, 10585, 2216,
+ 10171, 10585, 2218,
+ 10171, 10585, 2220,
+ 10171, 10585, 2236,
+ 10171, 10585, 2266,
+ 10171, 10585, 2268,
+ 10171, 10585, 2270,
+ 10171, 10585, 2282,
+ 10171, 10585, 2294,
+ 10171, 10585, 2296,
+ 10171, 10585, 2298,
+ 10171, 10585, 2300,
+ 10171, 10585, 2302,
+ 10171, 10585, 2304,
+ 10171, 10585, 2316,
+ 10171, 10585, 2350,
+ 10171, 10585, 2352,
+ 10171, 10585, 2354,
+ 10171, 10585, 2356,
+ 10171, 10585, 2358,
+ 10171, 10585, 2360,
+ 10171, 10585, 2362,
+ 10171, 10585, 2370,
+ 10171, 10585, 2378,
+ 10171, 10585, 2402,
+ 10171, 10585, 2424,
+ 10171, 10585, 2466,
+ 10171, 10585, 2468,
+ 10171, 10585, 2482,
+ 10171, 10585, 2504,
+ 10171, 10585, 2516,
+ 10171, 10585, 2518,
+ 10171, 10585, 2520,
+ 10171, 10585, 2522,
+ 10171, 10585, 2524,
+ 10171, 10585, 2548,
+ 10171, 10585, 2566,
+ 10171, 10585, 2568,
+ 10171, 10585, 2570,
+ 10171, 10585, 2572,
+ 10171, 10585, 2574,
+ 10171, 10585, 2598,
+ 10171, 10585, 2620,
+ 10171, 10585, 2622,
+ 10171, 10585, 2624,
+ 10171, 10585, 2626,
+ 10171, 10585, 2628,
+ 10171, 10585, 2634,
+ 10171, 10585, 2666,
+ 10171, 10585, 2678,
+ 10171, 10585, 2680,
+ 10171, 10585, 2682,
+ 10171, 10585, 2684,
+ 10171, 10585, 2686,
+ 10171, 10585, 2718,
+ 10171, 10585, 2732,
+ 10171, 10585, 2734,
+ 10171, 10585, 2736,
+ 10171, 10585, 2738,
+ 10171, 10585, 2740,
+ 10171, 10585, 2772,
+ 10171, 10585, 2790,
+ 10171, 10585, 2792,
+ 10171, 10585, 2794,
+ 10171, 10585, 2796,
+ 10171, 10585, 2798,
+ 10171, 10585, 2844,
+ 10171, 10585, 2856,
+ 10171, 10585, 2896,
+ 10171, 10585, 2906,
+ 10171, 10585, 2922,
+ 10171, 10585, 2936,
+ 10171, 10585, 2952,
+ 10171, 10585, 2956,
+ 10171, 10585, 2968,
+ 10171, 10585, 2982,
+ 10171, 10585, 2984,
+ 10171, 10585, 2986,
+ 10171, 10585, 2988,
+ 10171, 10585, 2990,
+ 10171, 10585, 2992,
+ 10171, 10585, 2994,
+ 10171, 10585, 3002,
+ 10171, 10585, 3006,
+ 10171, 10585, 3050,
+ 10171, 10585, 3078,
+ 10171, 10585, 3120,
+ 10171, 10585, 3138,
+ 10171, 10585, 3146,
+ 10171, 10585, 3148,
+ 10171, 10585, 3150,
+ 10171, 10585, 3152,
+ 10171, 10585, 3154,
+ 10171, 10585, 3176,
+ 10171, 10585, 3202,
+ 10171, 10585, 3212,
+ 10171, 10585, 3214,
+ 10171, 10585, 3216,
+ 10171, 10585, 3218,
+ 10171, 10585, 3220,
+ 10171, 10585, 3826,
+ 10171, 10585, 3856,
+ 10171, 10585, 3858,
+ 10171, 10585, 3860,
+ 10171, 10585, 3862,
+ 10171, 10585, 3864,
+ 10171, 10585, 3866,
+ 10171, 10585, 3868,
+ 10171, 10585, 3874,
+ 10171, 10585, 3890,
+ 10171, 10585, 3906,
+ 10171, 10585, 3924,
+ 10171, 10585, 3998,
+ 10171, 10585, 4010,
+ 10171, 10585, 4028,
+ 10171, 10585, 4046,
+ 10171, 10585, 4232,
+ 10171, 10585, 4270,
+ 10171, 10585, 4278,
+ 10171, 10585, 4308,
+ 10171, 10585, 4310,
+ 10171, 10585, 4312,
+ 10171, 10585, 4370,
+ 10171, 10585, 4372,
+ 10171, 10585, 4374,
+ 10171, 10585, 4378,
+ 10171, 10585, 4412,
+ 10171, 10585, 4414,
+ 10171, 10585, 4416,
+ 10171, 10585, 4796,
+ 10171, 10585, 4798,
+ 10171, 10585, 4804,
+ 10171, 10585, 4806,
+ 10171, 10585, 4808,
+ 10171, 10585, 4810,
+ 10171, 10585, 4812,
+ 10171, 10585, 4814,
+ 10171, 10585, 4816,
+ 10171, 10585, 5034,
+ 10171, 10585, 5292,
+ 10171, 10585, 5296,
+ 10171, 10585, 5314,
+ 10171, 10585, 5332,
+ 10171, 10585, 5410,
+ 10171, 10585, 5416,
+ 10171, 10585, 5418,
+ 10171, 10585, 5422,
+ 10171, 10585, 5462,
+ 10171, 10585, 5478,
+ 10171, 10585, 5480,
+ 10171, 10585, 5482,
+ 10171, 10585, 5484,
+ 10171, 10585, 5486,
+ 10171, 10585, 5508,
+ 10171, 10585, 5510,
+ 10171, 10585, 5512,
+ 10171, 10585, 5514,
+ 10171, 10585, 5666,
+ 10171, 10585, 5678,
+ 10171, 10585, 5704,
+ 10171, 10585, 5732,
+ 10171, 10585, 5786,
+ 10171, 10585, 5794,
+ 10171, 10585, 5866,
+ 10171, 10585, 5868,
+ 10171, 10585, 5870,
+ 10171, 10585, 5906,
+ 10171, 10585, 5914,
+ 10171, 10585, 5928,
+ 10171, 10585, 5932,
+ 10171, 10585, 5974,
+ 10171, 10585, 5976,
+ 10171, 10585, 5984,
+ 10171, 10585, 6032,
+ 10171, 10585, 6034,
+ 10171, 10585, 6038,
+ 10171, 10585, 6148,
+ 10171, 10585, 6150,
+ 10171, 10585, 6152,
+ 10171, 10585, 6154,
+ 10171, 10585, 6264,
+ 10171, 10585, 6274,
+ 10171, 10585, 6300,
+ 10171, 10585, 6328,
+ 10171, 10585, 6336,
+ 10171, 10585, 6550,
+ 10171, 10585, 6552,
+ 10171, 10585, 6846,
+ 10171, 10585, 6848,
+ 10171, 10585, 7066,
+ 10171, 10585, 7068,
+ 10171, 10585, 7406,
+ 10171, 10585, 7408,
+ 10171, 10585, 9313, 0,
+ 10171, 10585, 9313, 8,
+ 10171, 10585, 9313, 16,
+ 10171, 10585, 9313, 28,
+ 10171, 10585, 9313, 40,
+ 10171, 10585, 9313, 58,
+ 10171, 10585, 9313, 162,
+ 10171, 10585, 9313, 422,
+ 10171, 10585, 9313, 622,
+ 10171, 10585, 11223, 838,
+ 10171, 10585, 11223, 1188,
+ 10171, 10585, 11223, 1964,
+ 10171, 10585, 11223, 2266,
+ 10171, 10585, 11723, 0,
+ 10171, 10585, 11723, 8,
+ 10171, 10585, 11723, 16,
+ 10171, 10585, 11723, 28,
+ 10171, 10585, 11723, 40,
+ 10171, 10585, 11723, 58,
+ 10171, 10585, 11723, 162,
+ 10171, 10767, 11639, 4926,
+ 10171, 11163, 11228,
+ 10171, 11224,
+ 10171, 11400,
+ 10173, 12403, 6689, 2170,
+ 10173, 12403, 6689, 2540,
+ 10173, 12403, 6689, 2778,
+ 10173, 12403, 6689, 4200,
+ 10173, 12403, 6689, 4214,
+ 10173, 12403, 6689, 5190,
+ 10173, 12403, 6689, 6260,
+ 10173, 12403, 6689, 6722,
+ 10173, 12403, 6689, 7508,
+ 10173, 12403, 6689, 7694,
+ 10179, 9539, 11054,
+ 10192,
+ 10203, 7580,
+ 10203, 11143, 2170,
+ 10213, 11894,
+ 10221, 7593, 8405, 80,
+ 10221, 7593, 8405, 176,
+ 10221, 7593, 8405, 238,
+ 10221, 7593, 8405, 274,
+ 10221, 7593, 8405, 438,
+ 10221, 7593, 8405, 596,
+ 10221, 7593, 8405, 626,
+ 10221, 7593, 8405, 756,
+ 10221, 7593, 8405, 858,
+ 10221, 7593, 8405, 900,
+ 10221, 7593, 8405, 1038,
+ 10221, 7593, 8405, 1216,
+ 10221, 7593, 8405, 1340,
+ 10221, 7593, 8405, 1350,
+ 10221, 7593, 8405, 1380,
+ 10221, 7593, 8405, 1420,
+ 10221, 7593, 8405, 1520,
+ 10221, 7593, 8405, 1588,
+ 10221, 7593, 8405, 1744,
+ 10221, 7593, 8405, 1860,
+ 10221, 7593, 8405, 1992,
+ 10221, 7593, 8405, 2196,
+ 10221, 7593, 8405, 2290,
+ 10221, 7593, 8405, 2384,
+ 10221, 7593, 8405, 2490,
+ 10221, 7593, 8405, 2648,
+ 10221, 7593, 8405, 2654,
+ 10221, 7593, 8405, 2868,
+ 10221, 7593, 8405, 2954,
+ 10221, 7593, 8405, 3140,
+ 10221, 7593, 8405, 3884,
+ 10221, 7593, 8405, 3904,
+ 10221, 7593, 8405, 4316,
+ 10221, 7593, 8405, 4634,
+ 10221, 7593, 8405, 4742,
+ 10221, 7593, 8405, 5414,
+ 10221, 7593, 8405, 5698,
+ 10221, 7593, 8405, 6268,
+ 10221, 8405, 80,
+ 10221, 8405, 176,
+ 10221, 8405, 202,
+ 10221, 8405, 238,
+ 10221, 8405, 274,
+ 10221, 8405, 438,
+ 10221, 8405, 596,
+ 10221, 8405, 626,
+ 10221, 8405, 658,
+ 10221, 8405, 710,
+ 10221, 8405, 756,
+ 10221, 8405, 858,
+ 10221, 8405, 900,
+ 10221, 8405, 1038,
+ 10221, 8405, 1216,
+ 10221, 8405, 1340,
+ 10221, 8405, 1350,
+ 10221, 8405, 1380,
+ 10221, 8405, 1420,
+ 10221, 8405, 1520,
+ 10221, 8405, 1588,
+ 10221, 8405, 1744,
+ 10221, 8405, 1860,
+ 10221, 8405, 1992,
+ 10221, 8405, 2196,
+ 10221, 8405, 2290,
+ 10221, 8405, 2384,
+ 10221, 8405, 2490,
+ 10221, 8405, 2648,
+ 10221, 8405, 2654,
+ 10221, 8405, 2868,
+ 10221, 8405, 2954,
+ 10221, 8405, 3140,
+ 10221, 8405, 3884,
+ 10221, 8405, 3904,
+ 10221, 8405, 4316,
+ 10221, 8405, 4634,
+ 10221, 8405, 4742,
+ 10221, 8405, 5414,
+ 10221, 8405, 5698,
+ 10221, 8405, 6268,
+ 10221, 8405, 6728,
+ 10221, 8405, 8869, 1216,
+ 10221, 9063, 8405, 80,
+ 10221, 9063, 8405, 176,
+ 10221, 9063, 8405, 238,
+ 10221, 9063, 8405, 274,
+ 10221, 9063, 8405, 438,
+ 10221, 9063, 8405, 596,
+ 10221, 9063, 8405, 626,
+ 10221, 9063, 8405, 756,
+ 10221, 9063, 8405, 858,
+ 10221, 9063, 8405, 900,
+ 10221, 9063, 8405, 1038,
+ 10221, 9063, 8405, 1216,
+ 10221, 9063, 8405, 1340,
+ 10221, 9063, 8405, 1350,
+ 10221, 9063, 8405, 1380,
+ 10221, 9063, 8405, 1420,
+ 10221, 9063, 8405, 1520,
+ 10221, 9063, 8405, 1588,
+ 10221, 9063, 8405, 1744,
+ 10221, 9063, 8405, 1860,
+ 10221, 9063, 8405, 1992,
+ 10221, 9063, 8405, 2196,
+ 10221, 9063, 8405, 2290,
+ 10221, 9063, 8405, 2384,
+ 10221, 9063, 8405, 2490,
+ 10221, 9063, 8405, 2648,
+ 10221, 9063, 8405, 2654,
+ 10221, 9063, 8405, 2868,
+ 10221, 9063, 8405, 2954,
+ 10221, 9063, 8405, 3140,
+ 10221, 9063, 8405, 3884,
+ 10221, 9063, 8405, 3904,
+ 10221, 9063, 8405, 4316,
+ 10221, 9063, 8405, 4634,
+ 10221, 9063, 8405, 4742,
+ 10221, 9063, 8405, 5414,
+ 10221, 9063, 8405, 5698,
+ 10221, 9063, 8405, 6268,
+ 10221, 11163, 11228,
+ 10225, 436,
+ 10225, 5759, 7282,
+ 10225, 5759, 8916,
+ 10225, 5759, 9824,
+ 10225, 5759, 9870,
+ 10225, 5759, 9904,
+ 10225, 5759, 11900,
+ 10225, 6689, 2170,
+ 10225, 6689, 2540,
+ 10225, 6689, 2778,
+ 10225, 6689, 4200,
+ 10225, 6689, 4214,
+ 10225, 6689, 5190,
+ 10225, 6689, 6260,
+ 10225, 6689, 6722,
+ 10225, 6689, 7508,
+ 10225, 6689, 7694,
+ 10225, 7469, 5758,
+ 10225, 7803, 5759, 8,
+ 10225, 7803, 5759, 16,
+ 10225, 7803, 5759, 28,
+ 10225, 7803, 5759, 40,
+ 10225, 7803, 5759, 58,
+ 10225, 7803, 5759, 72,
+ 10225, 7803, 5759, 92,
+ 10225, 7803, 5759, 266,
+ 10225, 7803, 5759, 606,
+ 10225, 7803, 5759, 8031, 8,
+ 10225, 7803, 5759, 8031, 28,
+ 10225, 7803, 5759, 9827, 22,
+ 10225, 7803, 5759, 9827, 34,
+ 10225, 7803, 5759, 9827, 344,
+ 10225, 7803, 5759, 9827, 518,
+ 10225, 7803, 8031, 8,
+ 10225, 7803, 8031, 28,
+ 10225, 8405, 0,
+ 10225, 8405, 8,
+ 10225, 8405, 16,
+ 10225, 8405, 28,
+ 10225, 8405, 40,
+ 10225, 8405, 58,
+ 10225, 8405, 72,
+ 10225, 8405, 92,
+ 10225, 8405, 100,
+ 10225, 8405, 116,
+ 10225, 8405, 138,
+ 10225, 8405, 216,
+ 10225, 8405, 236,
+ 10225, 8405, 266,
+ 10225, 8405, 292,
+ 10225, 8405, 306,
+ 10225, 8405, 332,
+ 10225, 8405, 364,
+ 10225, 8405, 392,
+ 10225, 8405, 462,
+ 10225, 8405, 510,
+ 10225, 8405, 524,
+ 10225, 8405, 556,
+ 10225, 8405, 606,
+ 10225, 8405, 610,
+ 10225, 8405, 652,
+ 10225, 8405, 792,
+ 10225, 8405, 884,
+ 10225, 8405, 974,
+ 10225, 8405, 996,
+ 10225, 8405, 1260,
+ 10225, 8405, 1512,
+ 10225, 8405, 1612,
+ 10225, 8405, 1796,
+ 10225, 8405, 2030,
+ 10225, 8405, 2076,
+ 10225, 8405, 2126,
+ 10225, 8405, 2212,
+ 10225, 8405, 2516,
+ 10225, 8405, 2566,
+ 10225, 8405, 2678,
+ 10225, 8405, 2746,
+ 10225, 8405, 4016,
+ 10225, 8405, 5994,
+ 10225, 8405, 9827, 22,
+ 10225, 8405, 9827, 34,
+ 10225, 8405, 9827, 344,
+ 10225, 8405, 9827, 518,
+ 10227, 171, 7318,
+ 10227, 1496,
+ 10227, 2826,
+ 10227, 5759, 3227, 6498,
+ 10227, 5759, 6498,
+ 10227, 5759, 7282,
+ 10227, 5759, 7758,
+ 10227, 5759, 8916,
+ 10227, 5759, 8944,
+ 10227, 5759, 9824,
+ 10227, 6380,
+ 10227, 6689, 2170,
+ 10227, 6689, 2540,
+ 10227, 6689, 2778,
+ 10227, 6689, 4200,
+ 10227, 6689, 4214,
+ 10227, 6689, 5190,
+ 10227, 6689, 6260,
+ 10227, 6689, 6722,
+ 10227, 6689, 7508,
+ 10227, 6689, 7694,
+ 10227, 7714,
+ 10227, 7803, 5759, 16,
+ 10227, 7803, 5759, 40,
+ 10227, 7803, 5759, 58,
+ 10227, 7803, 5759, 72,
+ 10227, 7803, 5759, 92,
+ 10227, 7803, 5759, 162,
+ 10227, 7803, 5759, 266,
+ 10227, 7803, 5759, 440,
+ 10227, 7803, 5759, 606,
+ 10227, 8405, 0,
+ 10227, 8405, 16,
+ 10227, 8405, 40,
+ 10227, 8405, 58,
+ 10227, 8405, 72,
+ 10227, 8405, 92,
+ 10227, 8405, 100,
+ 10227, 8405, 116,
+ 10227, 8405, 138,
+ 10227, 8405, 162,
+ 10227, 8405, 196,
+ 10227, 8405, 216,
+ 10227, 8405, 236,
+ 10227, 8405, 266,
+ 10227, 8405, 292,
+ 10227, 8405, 306,
+ 10227, 8405, 332,
+ 10227, 8405, 364,
+ 10227, 8405, 392,
+ 10227, 8405, 440,
+ 10227, 8405, 462,
+ 10227, 8405, 510,
+ 10227, 8405, 524,
+ 10227, 8405, 556,
+ 10227, 8405, 606,
+ 10227, 8405, 610,
+ 10227, 8405, 652,
+ 10227, 8405, 670,
+ 10227, 8405, 792,
+ 10227, 8405, 884,
+ 10227, 8405, 974,
+ 10227, 8405, 996,
+ 10227, 8405, 1260,
+ 10227, 8405, 1512,
+ 10227, 8405, 1612,
+ 10227, 8405, 1796,
+ 10227, 8405, 2030,
+ 10227, 8405, 2076,
+ 10227, 8405, 2126,
+ 10227, 8405, 2212,
+ 10227, 8405, 2438,
+ 10227, 8405, 2516,
+ 10227, 8405, 2678,
+ 10227, 8405, 2746,
+ 10227, 8405, 4016,
+ 10227, 8405, 4320,
+ 10227, 8405, 4748,
+ 10227, 8405, 5994,
+ 10231, 9513, 2170,
+ 10231, 9513, 2540,
+ 10231, 9513, 2670,
+ 10231, 9513, 2778,
+ 10231, 9513, 4200,
+ 10231, 9513, 4214,
+ 10231, 9513, 5190,
+ 10231, 9513, 6722,
+ 10231, 9513, 7508,
+ 10231, 9513, 7694,
+ 10231, 9513, 8820,
+ 10231, 9513, 8876,
+ 10241, 1177, 2681, 3276,
+ 10241, 1177, 2681, 6110,
+ 10241, 1177, 2681, 8192,
+ 10241, 1177, 2681, 8251, 6116,
+ 10241, 1177, 2681, 8333, 4830,
+ 10241, 1177, 2681, 8971, 7812,
+ 10241, 1177, 2681, 9395, 7639, 10344,
+ 10241, 1177, 2681, 9893, 9786,
+ 10241, 1177, 2681, 9934,
+ 10241, 1177, 2681, 9953, 4194,
+ 10241, 1177, 2681, 9963, 8290,
+ 10241, 1177, 2681, 10323, 8436,
+ 10241, 1177, 2681, 10680,
+ 10241, 1177, 2681, 11199, 6716,
+ 10241, 1177, 6131, 439, 2681, 9148,
+ 10241, 1177, 6383, 11454,
+ 10241, 1177, 6868,
+ 10241, 1177, 6877, 7388,
+ 10241, 1177, 6877, 8790,
+ 10241, 1177, 6877, 11732,
+ 10241, 1177, 6877, 13000,
+ 10241, 1177, 6995, 7738,
+ 10241, 1177, 7187, 9118,
+ 10241, 1177, 7348,
+ 10241, 1177, 7593, 8790,
+ 10241, 1177, 7593, 13000,
+ 10241, 1177, 7987, 11454,
+ 10241, 1177, 7999, 9784,
+ 10241, 1177, 8071, 569, 4944,
+ 10241, 1177, 8642,
+ 10241, 1177, 9341, 10632,
+ 10241, 1177, 9478,
+ 10241, 1177, 9613, 8898,
+ 10241, 1177, 9630,
+ 10241, 1177, 9832,
+ 10241, 1177, 9878,
+ 10241, 1177, 9954,
+ 10241, 1177, 9992,
+ 10241, 1177, 10146,
+ 10241, 1177, 10252,
+ 10241, 1177, 10458,
+ 10241, 1177, 10638,
+ 10241, 1177, 10689, 6796,
+ 10241, 1177, 10698,
+ 10241, 1177, 10793, 429, 2681, 7100,
+ 10241, 1177, 10998,
+ 10241, 1177, 11013, 10632,
+ 10241, 1177, 11056,
+ 10241, 1177, 11058,
+ 10241, 1177, 11247, 6416,
+ 10241, 1177, 11481, 91, 2681, 10732,
+ 10241, 1177, 11482,
+ 10241, 1177, 11614,
+ 10241, 1177, 11628,
+ 10241, 1177, 11678,
+ 10241, 1177, 11702,
+ 10241, 1177, 11704,
+ 10241, 1177, 11756,
+ 10241, 1177, 11836,
+ 10241, 1177, 11930,
+ 10241, 1177, 11938,
+ 10241, 1177, 12100,
+ 10241, 1177, 12414,
+ 10241, 1177, 12918,
+ 10243, 8405, 0,
+ 10243, 8405, 8,
+ 10243, 8405, 16,
+ 10243, 8405, 26,
+ 10243, 8405, 28,
+ 10243, 8405, 40,
+ 10243, 8405, 100,
+ 10243, 8405, 102,
+ 10243, 8405, 106,
+ 10243, 8405, 108,
+ 10243, 8405, 112,
+ 10243, 8405, 138,
+ 10243, 8405, 142,
+ 10243, 8405, 144,
+ 10243, 8405, 150,
+ 10243, 8405, 152,
+ 10243, 8405, 216,
+ 10243, 8405, 220,
+ 10243, 8405, 224,
+ 10243, 8405, 228,
+ 10243, 8405, 230,
+ 10243, 8405, 236,
+ 10243, 8405, 238,
+ 10243, 8405, 242,
+ 10243, 8405, 246,
+ 10243, 8405, 250,
+ 10243, 8405, 306,
+ 10243, 8405, 310,
+ 10243, 8405, 314,
+ 10243, 8405, 322,
+ 10243, 8405, 326,
+ 10243, 8405, 364,
+ 10243, 8405, 368,
+ 10243, 8405, 374,
+ 10243, 8405, 380,
+ 10243, 8405, 384,
+ 10243, 8405, 392,
+ 10243, 8405, 396,
+ 10243, 8405, 404,
+ 10243, 8405, 412,
+ 10243, 8405, 416,
+ 10243, 8405, 462,
+ 10243, 8405, 468,
+ 10243, 8405, 476,
+ 10243, 8405, 480,
+ 10243, 8405, 486,
+ 10243, 8405, 510,
+ 10243, 8405, 512,
+ 10243, 8405, 514,
+ 10243, 8405, 516,
+ 10243, 8405, 520,
+ 10243, 8405, 524,
+ 10243, 8405, 526,
+ 10243, 8405, 532,
+ 10243, 8405, 536,
+ 10243, 8405, 546,
+ 10243, 8405, 556,
+ 10243, 8405, 560,
+ 10243, 8405, 564,
+ 10243, 8405, 568,
+ 10243, 8405, 576,
+ 10243, 8405, 618,
+ 10243, 8405, 622,
+ 10243, 8405, 626,
+ 10243, 8405, 630,
+ 10243, 8405, 632,
+ 10243, 8405, 652,
+ 10243, 8405, 660,
+ 10243, 8405, 664,
+ 10243, 8405, 670,
+ 10243, 8405, 672,
+ 10243, 8405, 676,
+ 10243, 8405, 678,
+ 10243, 8405, 680,
+ 10243, 8405, 7593, 0,
+ 10243, 8405, 7593, 8,
+ 10243, 8405, 7593, 16,
+ 10243, 8405, 7593, 28,
+ 10243, 8405, 7593, 40,
+ 10243, 8405, 7593, 306,
+ 10243, 8405, 7593, 310,
+ 10243, 8405, 7593, 576,
+ 10243, 8405, 7593, 622,
+ 10243, 8405, 7593, 652,
+ 10243, 8405, 7593, 660,
+ 10243, 8405, 7593, 664,
+ 10243, 8921, 11067, 4926,
+ 10243, 9165, 6224,
+ 10243, 11067, 4926,
+ 10256,
+ 10257, 9495, 6121, 10677, 760,
+ 10260,
+ 10261, 6121, 7711, 5758,
+ 10261, 6121, 7768,
+ 10261, 6121, 8153, 8758,
+ 10261, 6121, 9546,
+ 10261, 6121, 10666,
+ 10261, 6121, 11097, 6435, 6121, 4530,
+ 10261, 6121, 12492,
+ 10261, 7939, 1, 7383, 10374,
+ 10261, 9015, 6121, 7580,
+ 10261, 10982,
+ 10265, 9610,
+ 10267, 2163, 5758,
+ 10267, 4841, 36,
+ 10267, 10469, 4926,
+ 10267, 10670,
+ 10267, 12017, 4926,
+ 10267, 12064,
+ 10277, 11663, 10539, 8774,
+ 10283, 8405, 0,
+ 10283, 8405, 8,
+ 10283, 8405, 16,
+ 10283, 8405, 26,
+ 10283, 8405, 28,
+ 10283, 8405, 40,
+ 10283, 8405, 100,
+ 10283, 8405, 102,
+ 10283, 8405, 106,
+ 10283, 8405, 108,
+ 10283, 8405, 112,
+ 10283, 8405, 138,
+ 10283, 8405, 142,
+ 10283, 8405, 144,
+ 10283, 8405, 150,
+ 10283, 8405, 152,
+ 10283, 8405, 216,
+ 10283, 8405, 220,
+ 10283, 8405, 224,
+ 10283, 8405, 228,
+ 10283, 8405, 230,
+ 10283, 8405, 236,
+ 10283, 8405, 238,
+ 10283, 8405, 242,
+ 10283, 8405, 246,
+ 10283, 8405, 250,
+ 10283, 8405, 306,
+ 10283, 8405, 310,
+ 10283, 8405, 314,
+ 10283, 8405, 322,
+ 10283, 8405, 326,
+ 10283, 8405, 364,
+ 10283, 8405, 368,
+ 10283, 8405, 374,
+ 10283, 8405, 380,
+ 10283, 8405, 384,
+ 10283, 8405, 392,
+ 10283, 8405, 396,
+ 10283, 8405, 404,
+ 10283, 8405, 412,
+ 10283, 8405, 416,
+ 10283, 8405, 462,
+ 10283, 8405, 468,
+ 10283, 8405, 476,
+ 10283, 8405, 480,
+ 10283, 8405, 486,
+ 10283, 8405, 510,
+ 10283, 8405, 512,
+ 10283, 8405, 514,
+ 10283, 8405, 516,
+ 10283, 8405, 520,
+ 10283, 8405, 524,
+ 10283, 8405, 526,
+ 10283, 8405, 532,
+ 10283, 8405, 536,
+ 10283, 8405, 546,
+ 10283, 8405, 556,
+ 10283, 8405, 560,
+ 10283, 8405, 564,
+ 10283, 8405, 568,
+ 10283, 8405, 576,
+ 10283, 8405, 610,
+ 10283, 8405, 612,
+ 10283, 8405, 614,
+ 10283, 8405, 616,
+ 10283, 8405, 618,
+ 10283, 8405, 622,
+ 10283, 8405, 626,
+ 10283, 8405, 630,
+ 10283, 8405, 632,
+ 10283, 8405, 652,
+ 10283, 8405, 660,
+ 10283, 8405, 664,
+ 10283, 8405, 670,
+ 10283, 8405, 672,
+ 10283, 8405, 676,
+ 10283, 8405, 678,
+ 10283, 8405, 680,
+ 10283, 8405, 7593, 0,
+ 10283, 8405, 7593, 8,
+ 10283, 8405, 7593, 16,
+ 10283, 8405, 7593, 28,
+ 10283, 8405, 7593, 40,
+ 10283, 8405, 7593, 236,
+ 10283, 8405, 7593, 238,
+ 10283, 8405, 7593, 242,
+ 10283, 8405, 7593, 246,
+ 10283, 8405, 7593, 250,
+ 10283, 8405, 7593, 306,
+ 10283, 8405, 7593, 310,
+ 10283, 8405, 7593, 326,
+ 10283, 8405, 7593, 384,
+ 10283, 8405, 7593, 416,
+ 10283, 8405, 7593, 510,
+ 10283, 8405, 7593, 512,
+ 10283, 8405, 7593, 514,
+ 10283, 8405, 7593, 516,
+ 10283, 8405, 7593, 520,
+ 10283, 8405, 7593, 532,
+ 10283, 8405, 7593, 546,
+ 10283, 8405, 7593, 568,
+ 10283, 8405, 7593, 576,
+ 10283, 8405, 7593, 622,
+ 10283, 8405, 7593, 652,
+ 10283, 8405, 7593, 660,
+ 10283, 8405, 7593, 664,
+ 10283, 8473, 1044,
+ 10283, 8921, 11067, 4926,
+ 10283, 9165, 4772,
+ 10283, 11067, 4926,
+ 10286,
+ 10297, 2638,
+ 10321, 8774,
+ 10327, 114,
+ 10327, 6408,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 601, 721, 4848,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 601, 721, 7442,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 4117, 721, 4848,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 4117, 721, 7442,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 4849, 721, 600,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 4849, 721, 4116,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 7443, 721, 600,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 7443, 721, 4116,
+ 10327, 6409, 9537, 4848,
+ 10327, 7443, 6409, 6121, 1044,
+ 10333, 2779, 8709, 5387, 4894,
+ 10333, 2779, 8709, 8328,
+ 10333, 4895, 5387, 2779, 8708,
+ 10333, 4895, 5387, 7550,
+ 10333, 6516,
+ 10333, 7551, 5387, 4894,
+ 10333, 9796,
+ 10333, 11164,
+ 10333, 11358,
+ 10339, 8405, 601, 5876,
+ 10339, 8405, 601, 10716,
+ 10339, 8405, 604,
+ 10339, 8405, 1045, 7580,
+ 10339, 8405, 1045, 10677, 760,
+ 10339, 8405, 1045, 11649, 760,
+ 10339, 8405, 1109, 1809, 5964,
+ 10339, 8405, 1109, 4423, 5964,
+ 10339, 8405, 1809, 601, 10716,
+ 10339, 8405, 1809, 4117, 10716,
+ 10339, 8405, 1809, 4849, 6434,
+ 10339, 8405, 1809, 4849, 10716,
+ 10339, 8405, 1809, 5550,
+ 10339, 8405, 1809, 5965, 760,
+ 10339, 8405, 1809, 6379, 7908,
+ 10339, 8405, 1809, 6875, 7908,
+ 10339, 8405, 1809, 7443, 10716,
+ 10339, 8405, 1809, 7708,
+ 10339, 8405, 1809, 8151, 5965, 760,
+ 10339, 8405, 1809, 8151, 11095, 5965, 760,
+ 10339, 8405, 1809, 8432,
+ 10339, 8405, 1809, 10267, 12017, 4926,
+ 10339, 8405, 1809, 10677, 4876,
+ 10339, 8405, 1809, 11095, 5965, 760,
+ 10339, 8405, 1809, 11449, 7908,
+ 10339, 8405, 1911, 5965, 760,
+ 10339, 8405, 1911, 8151, 5965, 760,
+ 10339, 8405, 1911, 8151, 11095, 5965, 760,
+ 10339, 8405, 1911, 11095, 5965, 760,
+ 10339, 8405, 3071, 10799, 5965, 4926,
+ 10339, 8405, 4117, 5876,
+ 10339, 8405, 4117, 10716,
+ 10339, 8405, 4389, 11859, 6610,
+ 10339, 8405, 4423, 5965, 760,
+ 10339, 8405, 4423, 8151, 5965, 760,
+ 10339, 8405, 4423, 8151, 11095, 5965, 760,
+ 10339, 8405, 4423, 11095, 5965, 760,
+ 10339, 8405, 4849, 4389, 5550,
+ 10339, 8405, 4849, 10716,
+ 10339, 8405, 5385, 7530,
+ 10339, 8405, 5445, 5758,
+ 10339, 8405, 6179, 10799, 5965, 4926,
+ 10339, 8405, 6379, 7908,
+ 10339, 8405, 6485, 1809, 5964,
+ 10339, 8405, 6485, 4423, 5964,
+ 10339, 8405, 6610,
+ 10339, 8405, 6623, 7908,
+ 10339, 8405, 6875, 7908,
+ 10339, 8405, 7121, 7443, 8077, 6408,
+ 10339, 8405, 7173, 5758,
+ 10339, 8405, 7390,
+ 10339, 8405, 7443, 4389, 5550,
+ 10339, 8405, 7443, 10716,
+ 10339, 8405, 7530,
+ 10339, 8405, 7551, 8167, 5758,
+ 10339, 8405, 7593, 0,
+ 10339, 8405, 7593, 2,
+ 10339, 8405, 7593, 4,
+ 10339, 8405, 7593, 5, 6121, 3966,
+ 10339, 8405, 7593, 6,
+ 10339, 8405, 7593, 8,
+ 10339, 8405, 7593, 10,
+ 10339, 8405, 7593, 12,
+ 10339, 8405, 7593, 14,
+ 10339, 8405, 7593, 15, 6121, 4530,
+ 10339, 8405, 7593, 17, 6121, 8758,
+ 10339, 8405, 7593, 18,
+ 10339, 8405, 7593, 19, 6121, 12426,
+ 10339, 8405, 7593, 20,
+ 10339, 8405, 7593, 22,
+ 10339, 8405, 7593, 23, 6121, 9553, 4530,
+ 10339, 8405, 7593, 23, 6121, 11215, 4530,
+ 10339, 8405, 7593, 24,
+ 10339, 8405, 7593, 25, 6121, 4530,
+ 10339, 8405, 7593, 27, 6121, 4849, 4530,
+ 10339, 8405, 7593, 27, 6121, 11215, 4530,
+ 10339, 8405, 7593, 28,
+ 10339, 8405, 7593, 30,
+ 10339, 8405, 7593, 34,
+ 10339, 8405, 7593, 36,
+ 10339, 8405, 7593, 37, 6121, 4530,
+ 10339, 8405, 7593, 38,
+ 10339, 8405, 7593, 39, 6121, 9553, 4530,
+ 10339, 8405, 7593, 40,
+ 10339, 8405, 7593, 41, 760,
+ 10339, 8405, 7593, 42,
+ 10339, 8405, 7593, 43, 6121, 4530,
+ 10339, 8405, 7593, 44,
+ 10339, 8405, 7593, 46,
+ 10339, 8405, 7593, 48,
+ 10339, 8405, 7593, 50,
+ 10339, 8405, 7593, 51, 6121, 3966,
+ 10339, 8405, 7593, 51, 6121, 11215, 4530,
+ 10339, 8405, 7593, 710,
+ 10339, 8405, 7593, 888,
+ 10339, 8405, 7593, 1110,
+ 10339, 8405, 7593, 1124,
+ 10339, 8405, 7593, 1130,
+ 10339, 8405, 7593, 1138,
+ 10339, 8405, 7593, 2216,
+ 10339, 8405, 7593, 2725, 4389, 28,
+ 10339, 8405, 7593, 3774,
+ 10339, 8405, 7593, 4614,
+ 10339, 8405, 7593, 5385, 8,
+ 10339, 8405, 7593, 5385, 28,
+ 10339, 8405, 7593, 6406,
+ 10339, 8405, 7593, 6674,
+ 10339, 8405, 7593, 6824,
+ 10339, 8405, 7593, 6879, 2216,
+ 10339, 8405, 7593, 6879, 6824,
+ 10339, 8405, 7593, 7494,
+ 10339, 8405, 7593, 7682,
+ 10339, 8405, 7593, 7981, 28,
+ 10339, 8405, 7593, 8005, 4389, 28,
+ 10339, 8405, 7593, 8679, 12,
+ 10339, 8405, 7593, 8869, 0,
+ 10339, 8405, 7593, 8869, 14,
+ 10339, 8405, 7593, 8869, 16,
+ 10339, 8405, 7593, 8869, 24,
+ 10339, 8405, 7593, 8869, 25, 6121, 4895, 1760,
+ 10339, 8405, 7593, 8869, 34,
+ 10339, 8405, 7593, 8869, 35, 6121, 4530,
+ 10339, 8405, 7593, 8869, 42,
+ 10339, 8405, 7593, 8869, 66,
+ 10339, 8405, 7593, 8869, 5385, 8,
+ 10339, 8405, 7593, 8869, 6406,
+ 10339, 8405, 7593, 9063, 16,
+ 10339, 8405, 7593, 9063, 17, 6121, 8758,
+ 10339, 8405, 7593, 9063, 22,
+ 10339, 8405, 7593, 9063, 26,
+ 10339, 8405, 7593, 9063, 40,
+ 10339, 8405, 7593, 9063, 10267, 34,
+ 10339, 8405, 7593, 9185, 19, 6121, 8758,
+ 10339, 8405, 7593, 9808,
+ 10339, 8405, 7593, 10489, 5385, 8,
+ 10339, 8405, 7593, 10489, 9313, 5836,
+ 10339, 8405, 7593, 10523, 40,
+ 10339, 8405, 8153, 7390,
+ 10339, 8405, 8153, 11424,
+ 10339, 8405, 8432,
+ 10339, 8405, 8473, 6875, 7908,
+ 10339, 8405, 8473, 8153, 6379, 7908,
+ 10339, 8405, 8473, 8153, 6875, 7908,
+ 10339, 8405, 8631, 601, 6434,
+ 10339, 8405, 8631, 4117, 6434,
+ 10339, 8405, 8631, 6610,
+ 10339, 8405, 8631, 10267, 12017, 4926,
+ 10339, 8405, 8631, 12017, 4926,
+ 10339, 8405, 8645, 4530,
+ 10339, 8405, 8755, 721, 1809, 5964,
+ 10339, 8405, 8755, 721, 4423, 5964,
+ 10339, 8405, 8869, 6616,
+ 10339, 8405, 9063, 0,
+ 10339, 8405, 9063, 2,
+ 10339, 8405, 9063, 6,
+ 10339, 8405, 9063, 8,
+ 10339, 8405, 9063, 12,
+ 10339, 8405, 9063, 14,
+ 10339, 8405, 9063, 16,
+ 10339, 8405, 9063, 18,
+ 10339, 8405, 9063, 20,
+ 10339, 8405, 9063, 22,
+ 10339, 8405, 9063, 24,
+ 10339, 8405, 9063, 26,
+ 10339, 8405, 9063, 28,
+ 10339, 8405, 9063, 30,
+ 10339, 8405, 9063, 34,
+ 10339, 8405, 9063, 38,
+ 10339, 8405, 9063, 40,
+ 10339, 8405, 9063, 42,
+ 10339, 8405, 9063, 44,
+ 10339, 8405, 9063, 66,
+ 10339, 8405, 9063, 450,
+ 10339, 8405, 9063, 7981, 2,
+ 10339, 8405, 9063, 10489, 8,
+ 10339, 8405, 9063, 10489, 26,
+ 10339, 8405, 9079, 4849, 4389, 5550,
+ 10339, 8405, 9079, 7443, 4389, 5550,
+ 10339, 8405, 9089, 5965, 3071, 506,
+ 10339, 8405, 9089, 5965, 3071, 520,
+ 10339, 8405, 9089, 5965, 3071, 5432,
+ 10339, 8405, 9089, 5965, 3071, 7514,
+ 10339, 8405, 9089, 5965, 6179, 506,
+ 10339, 8405, 9089, 5965, 6179, 520,
+ 10339, 8405, 9089, 5965, 6179, 5432,
+ 10339, 8405, 9089, 5965, 6179, 7514,
+ 10339, 8405, 9313, 5836,
+ 10339, 8405, 9828,
+ 10339, 8405, 9977, 176,
+ 10339, 8405, 10221, 1992,
+ 10339, 8405, 10489, 6616,
+ 10339, 8405, 10489, 9313, 5836,
+ 10339, 8405, 10677, 4876,
+ 10339, 8405, 10985, 5965, 760,
+ 10339, 8405, 10985, 8151, 5965, 760,
+ 10339, 8405, 10985, 8151, 11095, 5965, 760,
+ 10339, 8405, 10985, 11095, 5965, 760,
+ 10339, 8405, 11424,
+ 10339, 8405, 11449, 7908,
+ 10339, 8405, 11625, 5965, 760,
+ 10339, 8405, 11625, 8151, 5965, 760,
+ 10339, 8405, 11625, 8151, 11095, 5965, 760,
+ 10339, 8405, 11625, 11095, 5965, 760,
+ 10339, 8405, 11859, 6610,
+ 10339, 8405, 12380,
+ 10343, 1177, 3070,
+ 10343, 1177, 6178,
+ 10343, 1177, 6716,
+ 10346,
+ 10350,
+ 10351, 7768,
+ 10351, 13060,
+ 10353, 6689, 8696,
+ 10357, 9095, 6689, 6260,
+ 10357, 9095, 8525, 8162,
+ 10357, 9095, 8525, 8874,
+ 10357, 9095, 8525, 8876,
+ 10357, 9095, 8525, 9286,
+ 10357, 9095, 8525, 9700,
+ 10357, 9095, 8525, 10150,
+ 10357, 9095, 8525, 10200,
+ 10357, 9095, 8525, 10360,
+ 10357, 9095, 8525, 10622,
+ 10357, 9095, 8525, 11232,
+ 10363, 7608,
+ 10379, 428,
+ 10383, 6622,
+ 10385, 6505, 5830,
+ 10385, 6879, 6622,
+ 10385, 7089, 6622,
+ 10385, 7821, 5830,
+ 10388,
+ 10411, 568,
+ 10411, 6121, 7709, 10374,
+ 10411, 6121, 11649, 8758,
+ 10429, 4927, 5668,
+ 10429, 4927, 8153, 5668,
+ 10429, 8153, 4399, 4926,
+ 10429, 8405, 0,
+ 10429, 8405, 8,
+ 10429, 8405, 16,
+ 10429, 8405, 28,
+ 10429, 8405, 40,
+ 10429, 8405, 100,
+ 10429, 8405, 116,
+ 10429, 8405, 138,
+ 10429, 8405, 162,
+ 10429, 8405, 196,
+ 10429, 8405, 216,
+ 10429, 8405, 236,
+ 10429, 8405, 292,
+ 10429, 8405, 306,
+ 10429, 8405, 332,
+ 10429, 8405, 364,
+ 10429, 8405, 392,
+ 10429, 8405, 462,
+ 10429, 8405, 496,
+ 10429, 8405, 510,
+ 10429, 8405, 524,
+ 10429, 8405, 556,
+ 10429, 8405, 622,
+ 10429, 8405, 638,
+ 10429, 8405, 652,
+ 10429, 8405, 670,
+ 10429, 8405, 884,
+ 10429, 8405, 974,
+ 10429, 8405, 1080,
+ 10429, 8405, 1250,
+ 10429, 8405, 1612,
+ 10429, 8405, 2030,
+ 10429, 8405, 2076,
+ 10429, 8405, 2126,
+ 10429, 8405, 2212,
+ 10429, 8405, 2516,
+ 10429, 8405, 2678,
+ 10429, 8405, 2732,
+ 10429, 8405, 2746,
+ 10429, 8405, 3146,
+ 10429, 8405, 5978,
+ 10429, 8405, 5994,
+ 10429, 8405, 7593, 0,
+ 10429, 8405, 8921, 236,
+ 10429, 8405, 10707, 652,
+ 10429, 8405, 10721, 196,
+ 10429, 8405, 11395, 2516,
+ 10429, 8405, 11900,
+ 10429, 8717, 4399, 4926,
+ 10429, 11257, 8405, 510,
+ 10429, 11257, 8405, 622,
+ 10429, 11257, 8405, 652,
+ 10429, 11843, 8405, 510,
+ 10431, 4093, 5759, 457, 3696,
+ 10431, 4093, 5759, 778,
+ 10431, 4093, 5759, 824,
+ 10431, 4093, 5759, 862,
+ 10431, 4093, 5759, 1780,
+ 10431, 4093, 5759, 2386,
+ 10431, 4093, 5759, 2498,
+ 10431, 4093, 5759, 3948,
+ 10431, 4093, 5759, 3954,
+ 10431, 4093, 5759, 4114,
+ 10431, 4093, 5759, 4418,
+ 10431, 4093, 5759, 4536,
+ 10431, 4093, 5759, 4874,
+ 10431, 4093, 5759, 5700,
+ 10431, 4093, 5759, 6090,
+ 10431, 4093, 5759, 6107, 3706,
+ 10431, 4093, 5759, 6434,
+ 10431, 4093, 5759, 6533, 1760,
+ 10431, 4093, 5759, 6574,
+ 10431, 4093, 5759, 6712,
+ 10431, 4093, 5759, 6794,
+ 10431, 4093, 5759, 7379, 5968,
+ 10431, 4093, 5759, 7586,
+ 10431, 4093, 5759, 7593, 742,
+ 10431, 4093, 5759, 7702,
+ 10431, 4093, 5759, 7752,
+ 10431, 4093, 5759, 7830,
+ 10431, 4093, 5759, 8068,
+ 10431, 4093, 5759, 8126,
+ 10431, 4093, 5759, 8270,
+ 10431, 4093, 5759, 8296,
+ 10431, 4093, 5759, 8599, 4398,
+ 10431, 4093, 5759, 8704,
+ 10431, 4093, 5759, 9036,
+ 10431, 4093, 5759, 9064,
+ 10431, 4093, 5759, 9462,
+ 10431, 4093, 5759, 9568,
+ 10431, 4093, 5759, 9638,
+ 10431, 4093, 5759, 10216,
+ 10431, 4093, 5759, 10316,
+ 10431, 4093, 5759, 10546,
+ 10431, 4093, 5759, 10611, 4398,
+ 10431, 4093, 5759, 10744,
+ 10431, 4093, 5759, 10753, 7378,
+ 10431, 4093, 5759, 10767, 9525, 8758,
+ 10431, 4093, 5759, 11718,
+ 10433, 5830,
+ 10445, 11054,
+ 10452,
+ 10453, 445, 6741, 568,
+ 10453, 445, 11621, 568,
+ 10453, 835, 2091, 11621, 568,
+ 10453, 6377, 2091, 6741, 568,
+ 10453, 6377, 2091, 7919, 6741, 568,
+ 10453, 6377, 7919, 6741, 568,
+ 10453, 6377, 8167, 5758,
+ 10453, 6377, 12345, 2091, 6741, 568,
+ 10453, 6377, 12345, 8167, 5758,
+ 10453, 7767, 10476,
+ 10455, 5392,
+ 10461, 4876,
+ 10465, 7121, 4848,
+ 10465, 7121, 7442,
+ 10465, 7773, 4848,
+ 10465, 7773, 4849, 721, 7121, 4849, 721, 7121, 7442,
+ 10465, 7773, 4849, 721, 7121, 7442,
+ 10465, 7773, 4849, 721, 7773, 7443, 721, 7121, 4848,
+ 10465, 7773, 4849, 721, 7773, 7443, 721, 7121, 7442,
+ 10465, 7773, 7442,
+ 10465, 7773, 7443, 721, 7121, 4848,
+ 10465, 7773, 7443, 721, 7121, 4849, 721, 7121, 7442,
+ 10469, 4926,
+ 10469, 12017, 4926,
+ 10470,
+ 10475, 7337, 8774,
+ 10486,
+ 10489, 2091, 5758,
+ 10489, 6408,
+ 10489, 6409, 6121, 10666,
+ 10489, 6731, 2510,
+ 10489, 7390,
+ 10489, 7708,
+ 10489, 7709, 8166,
+ 10489, 8153, 7390,
+ 10489, 8153, 7391, 11195, 4926,
+ 10489, 8153, 8759, 2091, 5758,
+ 10489, 8231, 12108,
+ 10489, 8849, 7390,
+ 10489, 9595, 5758,
+ 10489, 9641, 8225, 6907, 8022,
+ 10489, 10469, 4926,
+ 10489, 11224,
+ 10489, 11767, 9063, 22,
+ 10504,
+ 10513, 7821, 5830,
+ 10513, 7821, 7089, 6622,
+ 10513, 7821, 8056,
+ 10514,
+ 10529, 9898,
+ 10553, 11621, 568,
+ 10574,
+ 10575, 445, 6741, 568,
+ 10575, 445, 11621, 568,
+ 10575, 835, 2091, 11621, 568,
+ 10575, 6377, 2091, 6741, 568,
+ 10575, 6377, 2091, 7919, 6741, 568,
+ 10575, 6377, 7919, 6741, 568,
+ 10575, 6377, 8167, 5758,
+ 10575, 6377, 12345, 2091, 6741, 568,
+ 10575, 6377, 12345, 8167, 5758,
+ 10575, 7767, 10476,
+ 10579, 428,
+ 10579, 429, 445, 6741, 568,
+ 10579, 429, 445, 6741, 569, 6121, 1045, 6376,
+ 10579, 429, 6121, 2091, 6741, 568,
+ 10579, 429, 6377, 2091, 6741, 568,
+ 10579, 429, 6377, 7709, 10374,
+ 10579, 429, 6377, 7919, 6741, 568,
+ 10579, 429, 6377, 8167, 5758,
+ 10579, 6121, 1044,
+ 10579, 6121, 5445, 5759, 6490,
+ 10579, 6121, 13061, 5759, 6490,
+ 10579, 6377, 8762,
+ 10579, 6377, 10578,
+ 10579, 6377, 11097, 6434,
+ 10579, 7991, 721, 8329, 115, 3993, 6121, 8762,
+ 10579, 7991, 8762,
+ 10579, 11183, 9718,
+ 10604,
+ 10607, 7803, 5759, 16,
+ 10607, 7803, 5759, 40,
+ 10607, 8405, 0,
+ 10607, 8405, 16,
+ 10607, 8405, 40,
+ 10607, 8405, 100,
+ 10607, 8405, 138,
+ 10607, 8405, 216,
+ 10607, 8405, 306,
+ 10607, 8405, 332,
+ 10607, 8405, 364,
+ 10607, 8405, 392,
+ 10607, 8405, 462,
+ 10607, 8405, 524,
+ 10607, 8405, 556,
+ 10607, 8405, 622,
+ 10607, 8405, 652,
+ 10607, 8405, 2030,
+ 10629, 8405, 652,
+ 10629, 8405, 656,
+ 10629, 8405, 664,
+ 10629, 8405, 3006,
+ 10629, 8405, 3008,
+ 10629, 8405, 3010,
+ 10629, 8405, 3014,
+ 10629, 8405, 3016,
+ 10629, 8405, 3018,
+ 10629, 8405, 3020,
+ 10629, 8405, 3022,
+ 10629, 8405, 3024,
+ 10629, 8405, 3026,
+ 10629, 8405, 3028,
+ 10629, 8405, 3030,
+ 10629, 8405, 3032,
+ 10629, 8405, 3034,
+ 10629, 8405, 3036,
+ 10629, 8405, 3038,
+ 10629, 8405, 3040,
+ 10629, 8405, 3042,
+ 10629, 8405, 3044,
+ 10629, 8405, 3046,
+ 10629, 8405, 3062,
+ 10629, 8405, 3291, 6170,
+ 10629, 8405, 6162,
+ 10629, 8405, 6164,
+ 10629, 8405, 6166,
+ 10629, 8405, 6168,
+ 10629, 8405, 6170,
+ 10629, 8405, 6174,
+ 10629, 8405, 6176,
+ 10629, 8405, 6180,
+ 10629, 8405, 6182,
+ 10629, 8405, 6184,
+ 10629, 8405, 6186,
+ 10629, 8405, 6190,
+ 10629, 8405, 6192,
+ 10629, 8405, 6194,
+ 10629, 8405, 7844,
+ 10629, 8405, 7846,
+ 10629, 8405, 7848,
+ 10629, 8405, 7989, 8973, 3018,
+ 10629, 8405, 7989, 8973, 3020,
+ 10629, 8405, 8863, 3018,
+ 10629, 8405, 8863, 3022,
+ 10629, 8405, 8863, 3032,
+ 10629, 8405, 8863, 6170,
+ 10629, 8405, 8863, 6172,
+ 10629, 8405, 8863, 6176,
+ 10629, 8405, 8863, 6178,
+ 10629, 8405, 8863, 6192,
+ 10629, 8405, 8985, 6192,
+ 10629, 8405, 11849, 3046,
+ 10629, 10339, 8405, 12965, 4926,
+ 10631, 5759, 186,
+ 10643, 6121, 1045, 6376,
+ 10643, 6121, 8689, 91, 8004,
+ 10643, 6121, 10666,
+ 10644,
+ 10661, 6129, 9178,
+ 10661, 8405, 16,
+ 10661, 8405, 40,
+ 10661, 8405, 246,
+ 10661, 8405, 486,
+ 10661, 8405, 568,
+ 10661, 8405, 632,
+ 10661, 8405, 680,
+ 10661, 8405, 710,
+ 10661, 8405, 1578,
+ 10661, 8405, 1612,
+ 10661, 8405, 1892,
+ 10661, 8405, 2110,
+ 10661, 8405, 2574,
+ 10661, 8405, 2674,
+ 10661, 8405, 3080,
+ 10661, 8405, 3252,
+ 10661, 8405, 3774,
+ 10661, 8405, 4066,
+ 10661, 8405, 4538,
+ 10661, 8405, 5494,
+ 10661, 8405, 5624,
+ 10661, 8405, 5698,
+ 10661, 8405, 6262,
+ 10661, 8405, 6674,
+ 10661, 8405, 6822,
+ 10661, 8405, 6850,
+ 10661, 8405, 7080,
+ 10661, 8405, 7422,
+ 10661, 8405, 7482,
+ 10661, 8405, 8814,
+ 10664,
+ 10665, 6121, 5525, 6706,
+ 10670,
+ 10674,
+ 10677, 761, 6121, 11649, 8758,
+ 10677, 761, 7991, 7443, 10642,
+ 10677, 761, 8153, 4849, 11378,
+ 10677, 761, 8849, 7443, 11378,
+ 10677, 4215, 4112,
+ 10677, 4719, 8641, 4926,
+ 10677, 4719, 8641, 4927, 7121, 4388,
+ 10677, 4719, 8641, 4927, 7773, 4388,
+ 10677, 4719, 8641, 6121, 8921, 7605, 4926,
+ 10677, 4719, 8641, 6121, 8921, 7605, 4927, 7773, 4388,
+ 10677, 4876,
+ 10677, 4877, 6121, 8057, 6376,
+ 10677, 4877, 6121, 8057, 6490,
+ 10677, 4877, 6121, 8473, 1044,
+ 10677, 4877, 10982,
+ 10677, 4923, 6121, 8759, 5758,
+ 10677, 7708,
+ 10677, 8963, 4876,
+ 10677, 10154,
+ 10677, 12043, 11067, 4926,
+ 10679, 8744,
+ 10701, 569, 2681, 9746,
+ 10708,
+ 10719, 5238,
+ 10722,
+ 10737, 5758,
+ 10749, 9483, 8775, 1078,
+ 10749, 9483, 8775, 1135, 12010,
+ 10749, 9483, 8775, 3268,
+ 10749, 9483, 8775, 4619, 2020,
+ 10749, 9483, 8775, 4619, 9884,
+ 10749, 9483, 8775, 5048,
+ 10749, 9483, 8775, 5921, 1583, 9000,
+ 10749, 9483, 8775, 5970,
+ 10749, 9483, 8775, 6203, 726,
+ 10749, 9483, 8775, 6203, 4728,
+ 10749, 9483, 8775, 6387, 3274,
+ 10749, 9483, 8775, 6387, 4952,
+ 10749, 9483, 8775, 6387, 5449, 3274,
+ 10749, 9483, 8775, 6387, 5449, 6866,
+ 10749, 9483, 8775, 6387, 6866,
+ 10749, 9483, 8775, 6387, 8470,
+ 10749, 9483, 8775, 6387, 9886,
+ 10749, 9483, 8775, 6387, 11022,
+ 10749, 9483, 8775, 6419, 1135, 2020,
+ 10749, 9483, 8775, 6419, 12010,
+ 10749, 9483, 8775, 6426,
+ 10749, 9483, 8775, 6581, 7892,
+ 10749, 9483, 8775, 6581, 8366,
+ 10749, 9483, 8775, 6581, 8728,
+ 10749, 9483, 8775, 6690,
+ 10749, 9483, 8775, 6691, 9884,
+ 10749, 9483, 8775, 7092,
+ 10749, 9483, 8775, 7329, 2020,
+ 10749, 9483, 8775, 7329, 6690,
+ 10749, 9483, 8775, 7329, 12010,
+ 10749, 9483, 8775, 7398,
+ 10749, 9483, 8775, 7434,
+ 10749, 9483, 8775, 7660,
+ 10749, 9483, 8775, 7678,
+ 10749, 9483, 8775, 7679, 7928,
+ 10749, 9483, 8775, 7688,
+ 10749, 9483, 8775, 7788,
+ 10749, 9483, 8775, 7837, 8364,
+ 10749, 9483, 8775, 8094,
+ 10749, 9483, 8775, 8115, 3269, 1079, 10018,
+ 10749, 9483, 8775, 8115, 10815, 195, 10018,
+ 10749, 9483, 8775, 8115, 11863, 5377, 10018,
+ 10749, 9483, 8775, 8115, 12085, 9775, 10018,
+ 10749, 9483, 8775, 8115, 12372,
+ 10749, 9483, 8775, 8115, 13020,
+ 10749, 9483, 8775, 8171, 12110,
+ 10749, 9483, 8775, 8171, 12904,
+ 10749, 9483, 8775, 8199, 9703, 8053, 7786,
+ 10749, 9483, 8775, 8237, 17, 8949, 13020,
+ 10749, 9483, 8775, 8237, 5055, 6978,
+ 10749, 9483, 8775, 8237, 8506,
+ 10749, 9483, 8775, 8237, 9451, 8053, 10008,
+ 10749, 9483, 8775, 8237, 9451, 8053, 11684,
+ 10749, 9483, 8775, 8237, 9703, 8053, 8776,
+ 10749, 9483, 8775, 8237, 9703, 10007, 144,
+ 10749, 9483, 8775, 8237, 9884,
+ 10749, 9483, 8775, 8237, 9885, 9999, 6980,
+ 10749, 9483, 8775, 8237, 10811, 144,
+ 10749, 9483, 8775, 8237, 10811, 310,
+ 10749, 9483, 8775, 8237, 10811, 405, 726,
+ 10749, 9483, 8775, 8237, 10811, 405, 4728,
+ 10749, 9483, 8775, 8237, 10811, 462,
+ 10749, 9483, 8775, 8237, 10811, 678,
+ 10749, 9483, 8775, 8237, 10811, 5048,
+ 10749, 9483, 8775, 8237, 11609, 10710,
+ 10749, 9483, 8775, 8249, 8114,
+ 10749, 9483, 8775, 8249, 8948,
+ 10749, 9483, 8775, 8265, 2021, 726,
+ 10749, 9483, 8775, 8265, 2021, 4728,
+ 10749, 9483, 8775, 8265, 9884,
+ 10749, 9483, 8775, 8265, 12989, 6680,
+ 10749, 9483, 8775, 8265, 12989, 9888,
+ 10749, 9483, 8775, 8321, 8801, 11038,
+ 10749, 9483, 8775, 8341, 10648,
+ 10749, 9483, 8775, 8364,
+ 10749, 9483, 8775, 8365, 726,
+ 10749, 9483, 8775, 8365, 4728,
+ 10749, 9483, 8775, 8397, 1079, 9090,
+ 10749, 9483, 8775, 8397, 4159, 9092,
+ 10749, 9483, 8775, 8397, 7735, 9090,
+ 10749, 9483, 8775, 8397, 9359, 9092,
+ 10749, 9483, 8775, 8397, 10615, 9090,
+ 10749, 9483, 8775, 8475, 4618,
+ 10749, 9483, 8775, 8537, 2020,
+ 10749, 9483, 8775, 8537, 9884,
+ 10749, 9483, 8775, 8538,
+ 10749, 9483, 8775, 8557, 9884,
+ 10749, 9483, 8775, 8587, 2020,
+ 10749, 9483, 8775, 8587, 9884,
+ 10749, 9483, 8775, 8614,
+ 10749, 9483, 8775, 8686,
+ 10749, 9483, 8775, 8687, 2020,
+ 10749, 9483, 8775, 8748,
+ 10749, 9483, 8775, 8798,
+ 10749, 9483, 8775, 8850,
+ 10749, 9483, 8775, 8909, 2020,
+ 10749, 9483, 8775, 8909, 6690,
+ 10749, 9483, 8775, 8909, 12010,
+ 10749, 9483, 8775, 8949, 3269, 1079, 10018,
+ 10749, 9483, 8775, 8949, 10815, 195, 10018,
+ 10749, 9483, 8775, 8949, 11863, 5377, 10018,
+ 10749, 9483, 8775, 8949, 12085, 9775, 10018,
+ 10749, 9483, 8775, 8949, 12372,
+ 10749, 9483, 8775, 8954,
+ 10749, 9483, 8775, 9009, 144,
+ 10749, 9483, 8775, 9009, 216,
+ 10749, 9483, 8775, 9009, 310,
+ 10749, 9483, 8775, 9009, 404,
+ 10749, 9483, 8775, 9009, 462,
+ 10749, 9483, 8775, 9009, 678,
+ 10749, 9483, 8775, 9009, 2882,
+ 10749, 9483, 8775, 9080,
+ 10749, 9483, 8775, 9160,
+ 10749, 9483, 8775, 9260,
+ 10749, 9483, 8775, 9267, 1583, 8237, 2882,
+ 10749, 9483, 8775, 9350,
+ 10749, 9483, 8775, 9399, 2021, 726,
+ 10749, 9483, 8775, 9399, 2021, 4728,
+ 10749, 9483, 8775, 9399, 2021, 4954,
+ 10749, 9483, 8775, 9399, 9884,
+ 10749, 9483, 8775, 9412,
+ 10749, 9483, 8775, 9415, 2020,
+ 10749, 9483, 8775, 9415, 3250,
+ 10749, 9483, 8775, 9415, 9884,
+ 10749, 9483, 8775, 9420,
+ 10749, 9483, 8775, 9440,
+ 10749, 9483, 8775, 9584,
+ 10749, 9483, 8775, 9586,
+ 10749, 9483, 8775, 9620,
+ 10749, 9483, 8775, 9740,
+ 10749, 9483, 8775, 9741, 9874,
+ 10749, 9483, 8775, 9755, 2020,
+ 10749, 9483, 8775, 9755, 4957, 9742,
+ 10749, 9483, 8775, 9755, 9884,
+ 10749, 9483, 8775, 9756,
+ 10749, 9483, 8775, 9774,
+ 10749, 9483, 8775, 9790,
+ 10749, 9483, 8775, 9815, 9884,
+ 10749, 9483, 8775, 9848,
+ 10749, 9483, 8775, 9873, 2020,
+ 10749, 9483, 8775, 9873, 9884,
+ 10749, 9483, 8775, 9876,
+ 10749, 9483, 8775, 9936,
+ 10749, 9483, 8775, 9943, 2020,
+ 10749, 9483, 8775, 9943, 9884,
+ 10749, 9483, 8775, 10005, 3269, 7168,
+ 10749, 9483, 8775, 10005, 3269, 8464,
+ 10749, 9483, 8775, 10005, 6690,
+ 10749, 9483, 8775, 10005, 9778,
+ 10749, 9483, 8775, 10010,
+ 10749, 9483, 8775, 10011, 12989, 6680,
+ 10749, 9483, 8775, 10011, 12989, 9889, 726,
+ 10749, 9483, 8775, 10011, 12989, 9889, 4728,
+ 10749, 9483, 8775, 10013, 222,
+ 10749, 9483, 8775, 10164,
+ 10749, 9483, 8775, 10250,
+ 10749, 9483, 8775, 10284,
+ 10749, 9483, 8775, 10288,
+ 10749, 9483, 8775, 10289, 3250,
+ 10749, 9483, 8775, 10290,
+ 10749, 9483, 8775, 10292,
+ 10749, 9483, 8775, 10325, 3249, 8613, 6978,
+ 10749, 9483, 8775, 10325, 3249, 9997, 6978,
+ 10749, 9483, 8775, 10325, 7785, 6978,
+ 10749, 9483, 8775, 10325, 8613, 6978,
+ 10749, 9483, 8775, 10325, 8855, 6978,
+ 10749, 9483, 8775, 10325, 9429, 6978,
+ 10749, 9483, 8775, 10325, 9597, 6978,
+ 10749, 9483, 8775, 10325, 9597, 10617, 6978,
+ 10749, 9483, 8775, 10325, 9997, 6978,
+ 10749, 9483, 8775, 10325, 10617, 6978,
+ 10749, 9483, 8775, 10325, 10617, 9429, 6978,
+ 10749, 9483, 8775, 10325, 11372,
+ 10749, 9483, 8775, 10325, 11743, 6978,
+ 10749, 9483, 8775, 10412,
+ 10749, 9483, 8775, 10418,
+ 10749, 9483, 8775, 10419, 2020,
+ 10749, 9483, 8775, 10500,
+ 10749, 9483, 8775, 10525, 7946,
+ 10749, 9483, 8775, 10525, 7947, 9174,
+ 10749, 9483, 8775, 10525, 7947, 10646,
+ 10749, 9483, 8775, 10525, 7947, 11852,
+ 10749, 9483, 8775, 10525, 9778,
+ 10749, 9483, 8775, 10525, 9779, 9174,
+ 10749, 9483, 8775, 10525, 9779, 10646,
+ 10749, 9483, 8775, 10525, 9779, 11852,
+ 10749, 9483, 8775, 10618,
+ 10749, 9483, 8775, 10649, 2020,
+ 10749, 9483, 8775, 10649, 3250,
+ 10749, 9483, 8775, 10649, 9884,
+ 10749, 9483, 8775, 10813, 450,
+ 10749, 9483, 8775, 10974,
+ 10749, 9483, 8775, 10991, 10008,
+ 10749, 9483, 8775, 10991, 11684,
+ 10749, 9483, 8775, 10991, 12360,
+ 10749, 9483, 8775, 11046,
+ 10749, 9483, 8775, 11074,
+ 10749, 9483, 8775, 11078,
+ 10749, 9483, 8775, 11079, 2021, 726,
+ 10749, 9483, 8775, 11079, 2021, 4728,
+ 10749, 9483, 8775, 11079, 2021, 4954,
+ 10749, 9483, 8775, 11079, 9884,
+ 10749, 9483, 8775, 11082,
+ 10749, 9483, 8775, 11149, 2020,
+ 10749, 9483, 8775, 11149, 9884,
+ 10749, 9483, 8775, 11188,
+ 10749, 9483, 8775, 11189, 2020,
+ 10749, 9483, 8775, 11348,
+ 10749, 9483, 8775, 11374,
+ 10749, 9483, 8775, 11402,
+ 10749, 9483, 8775, 11403, 6690,
+ 10749, 9483, 8775, 11416,
+ 10749, 9483, 8775, 11421, 8801, 11038,
+ 10749, 9483, 8775, 11421, 11347, 2020,
+ 10749, 9483, 8775, 11422,
+ 10749, 9483, 8775, 11423, 2020,
+ 10749, 9483, 8775, 11423, 6690,
+ 10749, 9483, 8775, 11602,
+ 10749, 9483, 8775, 11643, 27, 7928,
+ 10749, 9483, 8775, 11643, 27, 9172,
+ 10749, 9483, 8775, 11654,
+ 10749, 9483, 8775, 11656,
+ 10749, 9483, 8775, 12111, 2020,
+ 10749, 9483, 8775, 12111, 9884,
+ 10749, 9483, 8775, 12112,
+ 10749, 9483, 8775, 12113, 2020,
+ 10749, 9483, 8775, 12113, 9884,
+ 10749, 9483, 8775, 12120,
+ 10749, 9483, 8775, 12365, 1126,
+ 10749, 9483, 8775, 12365, 1134,
+ 10749, 9483, 8775, 12400,
+ 10749, 9483, 8775, 12474,
+ 10749, 9483, 8775, 12872,
+ 10749, 9483, 8775, 12904,
+ 10749, 9483, 8775, 13052,
+ 10749, 9483, 8775, 13082,
+ 10749, 9483, 8775, 13084,
+ 10749, 9483, 8775, 13186,
+ 10749, 9483, 8775, 13206,
+ 10749, 9483, 8775, 13208,
+ 10749, 9483, 8775, 13216,
+ 10749, 9483, 8775, 13220,
+ 10749, 9483, 8775, 13222,
+ 10749, 9483, 8775, 13352,
+ 10749, 9483, 8775, 13400,
+ 10749, 9483, 8775, 13404,
+ 10750,
+ 10759, 2690,
+ 10763, 2725, 11791, 6434,
+ 10763, 5385, 8057, 6434,
+ 10763, 8065, 8057, 6434,
+ 10763, 8241, 8057, 6434,
+ 10763, 9115, 10260,
+ 10763, 10260,
+ 10767, 47, 6376,
+ 10767, 47, 6490,
+ 10767, 283, 6490,
+ 10767, 601, 5877, 6490,
+ 10767, 603, 6376,
+ 10767, 605, 6376,
+ 10767, 1045, 6376,
+ 10767, 1045, 6377, 7442,
+ 10767, 1045, 6490,
+ 10767, 1809, 4876,
+ 10767, 2091, 7709, 6376,
+ 10767, 4117, 5877, 6490,
+ 10767, 4215, 4113, 6376,
+ 10767, 4531, 6376,
+ 10767, 4536,
+ 10767, 4849, 4389, 5551, 6376,
+ 10767, 4849, 4389, 5551, 6490,
+ 10767, 4849, 5877, 6490,
+ 10767, 4849, 6409, 6376,
+ 10767, 4849, 6409, 6490,
+ 10767, 4849, 6435, 6376,
+ 10767, 4849, 6435, 6490,
+ 10767, 4849, 7443, 6435, 6376,
+ 10767, 4849, 7443, 6435, 6490,
+ 10767, 4849, 9327, 6376,
+ 10767, 4849, 10717, 6376,
+ 10767, 4849, 10717, 6490,
+ 10767, 4895, 8153, 9719, 9548,
+ 10767, 4895, 8759, 9548,
+ 10767, 4895, 9719, 9548,
+ 10767, 4895, 10677, 4877, 9548,
+ 10767, 5445, 5759, 6490,
+ 10767, 5551, 6376,
+ 10767, 5551, 6490,
+ 10767, 5551, 9548,
+ 10767, 6115, 8015, 6376,
+ 10767, 6379, 5965, 4926,
+ 10767, 6379, 7908,
+ 10767, 6379, 7909, 6490,
+ 10767, 6516,
+ 10767, 6517, 6490,
+ 10767, 6546,
+ 10767, 6547, 6490,
+ 10767, 6617, 6376,
+ 10767, 6617, 6377, 7442,
+ 10767, 6617, 6490,
+ 10767, 6875, 5965, 4926,
+ 10767, 6875, 7908,
+ 10767, 6875, 7909, 6490,
+ 10767, 6879, 9412,
+ 10767, 6879, 9483, 9796,
+ 10767, 6879, 9483, 11164,
+ 10767, 6879, 9483, 11358,
+ 10767, 6879, 10809, 7724,
+ 10767, 6879, 12120,
+ 10767, 6879, 13036,
+ 10767, 7089, 7593, 8405, 0,
+ 10767, 7089, 7593, 8405, 4,
+ 10767, 7089, 7593, 8405, 5, 9072,
+ 10767, 7089, 7593, 8405, 6,
+ 10767, 7089, 7593, 8405, 8,
+ 10767, 7089, 7593, 8405, 12,
+ 10767, 7089, 7593, 8405, 14,
+ 10767, 7089, 7593, 8405, 16,
+ 10767, 7089, 7593, 8405, 20,
+ 10767, 7089, 7593, 8405, 22,
+ 10767, 7089, 7593, 8405, 24,
+ 10767, 7089, 7593, 8405, 26,
+ 10767, 7089, 7593, 8405, 28,
+ 10767, 7089, 7593, 8405, 34,
+ 10767, 7089, 7593, 8405, 35, 6490,
+ 10767, 7089, 7593, 8405, 35, 9642,
+ 10767, 7089, 7593, 8405, 36,
+ 10767, 7089, 7593, 8405, 38,
+ 10767, 7089, 7593, 8405, 40,
+ 10767, 7089, 7593, 8405, 42,
+ 10767, 7089, 7593, 8405, 46,
+ 10767, 7089, 7593, 8405, 50,
+ 10767, 7089, 7593, 8405, 66,
+ 10767, 7089, 7593, 8405, 82,
+ 10767, 7089, 7593, 8405, 94,
+ 10767, 7089, 7593, 8405, 1130,
+ 10767, 7089, 7593, 8405, 4895, 36,
+ 10767, 7089, 7593, 8405, 9365, 6,
+ 10767, 7089, 7593, 8405, 10997, 5385, 1, 6376,
+ 10767, 7089, 8405, 7593, 9063, 12,
+ 10767, 7089, 8405, 7593, 9063, 22,
+ 10767, 7089, 8405, 7593, 9063, 24,
+ 10767, 7089, 8405, 7593, 9063, 26,
+ 10767, 7089, 8405, 7593, 9063, 34,
+ 10767, 7173, 5759, 6490,
+ 10767, 7443, 4389, 5551, 6376,
+ 10767, 7443, 4389, 5551, 6490,
+ 10767, 7443, 5877, 6490,
+ 10767, 7443, 6435, 6376,
+ 10767, 7443, 6435, 6490,
+ 10767, 7443, 9327, 6376,
+ 10767, 7443, 10717, 721, 601, 10717, 6490,
+ 10767, 7443, 10717, 721, 4117, 10717, 6490,
+ 10767, 7443, 10717, 6376,
+ 10767, 7443, 10717, 6490,
+ 10767, 7551, 8759, 9548,
+ 10767, 7551, 9719, 9548,
+ 10767, 7551, 10677, 4877, 9548,
+ 10767, 7601, 6490,
+ 10767, 7695, 4113, 6376,
+ 10767, 7708,
+ 10767, 7709, 6490,
+ 10767, 7709, 9548,
+ 10767, 7919, 6741, 569, 6376,
+ 10767, 8015, 6376,
+ 10767, 8015, 6490,
+ 10767, 8151, 6379, 7908,
+ 10767, 8151, 6875, 7908,
+ 10767, 8153, 1809, 4876,
+ 10767, 8153, 5551, 6490,
+ 10767, 8153, 6379, 7908,
+ 10767, 8153, 6516,
+ 10767, 8153, 6517, 6490,
+ 10767, 8153, 6875, 7908,
+ 10767, 8153, 7708,
+ 10767, 8153, 7709, 4849, 4388,
+ 10767, 8153, 7709, 7443, 4388,
+ 10767, 8153, 8432,
+ 10767, 8153, 8433, 6490,
+ 10767, 8153, 10267, 6516,
+ 10767, 8153, 10388,
+ 10767, 8153, 10677, 4877, 6376,
+ 10767, 8153, 10677, 4877, 6490,
+ 10767, 8153, 10677, 8759, 9548,
+ 10767, 8153, 11449, 6376,
+ 10767, 8153, 11765, 6435, 6490,
+ 10767, 8167, 5759, 6490,
+ 10767, 8432,
+ 10767, 8433, 4849, 4388,
+ 10767, 8433, 6490,
+ 10767, 8433, 7443, 4388,
+ 10767, 8534,
+ 10767, 8535, 6376,
+ 10767, 8745, 6490,
+ 10767, 8849, 10668,
+ 10767, 8869, 6617, 6376,
+ 10767, 8963, 6376,
+ 10767, 8963, 6490,
+ 10767, 8999, 8774,
+ 10767, 9072,
+ 10767, 9284,
+ 10767, 9633, 9719, 9548,
+ 10767, 9663, 6490,
+ 10767, 9811, 6435, 6490,
+ 10767, 9899, 6376,
+ 10767, 9899, 6490,
+ 10767, 9977, 2671, 10335, 5758,
+ 10767, 9977, 6655, 10438,
+ 10767, 9977, 7399, 10438,
+ 10767, 9977, 7716,
+ 10767, 9977, 7804,
+ 10767, 9977, 8342,
+ 10767, 9977, 8405, 0,
+ 10767, 9977, 8405, 28,
+ 10767, 9977, 8405, 102,
+ 10767, 9977, 8405, 142,
+ 10767, 9977, 8405, 172,
+ 10767, 9977, 8405, 174,
+ 10767, 9977, 8405, 176,
+ 10767, 9977, 8405, 182,
+ 10767, 9977, 8405, 184,
+ 10767, 9977, 8405, 236,
+ 10767, 9977, 8405, 258,
+ 10767, 9977, 8405, 306,
+ 10767, 9977, 8405, 468,
+ 10767, 9977, 8405, 560,
+ 10767, 9977, 8405, 612,
+ 10767, 9977, 8405, 664,
+ 10767, 9977, 8405, 672,
+ 10767, 9977, 8405, 807, 3096,
+ 10767, 9977, 8405, 886,
+ 10767, 9977, 8405, 1262,
+ 10767, 9977, 8405, 2516,
+ 10767, 9977, 8405, 2734,
+ 10767, 9977, 8405, 3038,
+ 10767, 9977, 8405, 3148,
+ 10767, 9977, 8405, 4198,
+ 10767, 9977, 8405, 6696,
+ 10767, 9977, 8405, 6748,
+ 10767, 9977, 8405, 7522,
+ 10767, 9977, 8405, 8425, 3096,
+ 10767, 9977, 8405, 10269, 0,
+ 10767, 9977, 8405, 10269, 807, 3096,
+ 10767, 9977, 8405, 11127, 592,
+ 10767, 9977, 9345, 10335, 5758,
+ 10767, 9977, 9345, 11363, 5758,
+ 10767, 9977, 9578,
+ 10767, 9977, 10335, 5758,
+ 10767, 9977, 10442,
+ 10767, 9977, 10625, 10335, 5758,
+ 10767, 9977, 13062,
+ 10767, 10223, 8330,
+ 10767, 10267, 6516,
+ 10767, 10267, 6517, 6490,
+ 10767, 10267, 8015, 6490,
+ 10767, 10267, 8153, 3273, 6490,
+ 10767, 10301, 4849, 4388,
+ 10767, 10301, 7443, 4388,
+ 10767, 10388,
+ 10767, 10489, 6617, 6376,
+ 10767, 10677, 4877, 6376,
+ 10767, 10677, 4877, 6490,
+ 10767, 10677, 7708,
+ 10767, 10763, 5551, 9548,
+ 10767, 10763, 6435, 6376,
+ 10767, 10804,
+ 10767, 10805, 6490,
+ 10767, 10969, 8056,
+ 10767, 10969, 8057, 10728,
+ 10767, 10969, 8354,
+ 10767, 10969, 8676,
+ 10767, 10969, 8744,
+ 10767, 10969, 8899, 10441, 10642,
+ 10767, 10969, 9158,
+ 10767, 11097, 6435, 9548,
+ 10767, 11097, 9327, 6121, 3713, 10958,
+ 10767, 11215, 4531, 6490,
+ 10767, 11449, 7908,
+ 10767, 11449, 7909, 6490,
+ 10767, 11459, 8432,
+ 10767, 11647, 6376,
+ 10767, 11765, 9327, 6121, 3713, 10958,
+ 10767, 11845, 4926,
+ 10767, 11900,
+ 10767, 12107, 4531, 6490,
+ 10767, 12394,
+ 10767, 12416,
+ 10767, 12470,
+ 10767, 12498,
+ 10767, 12500,
+ 10767, 12502,
+ 10767, 12901, 5551, 9548,
+ 10767, 12901, 6435, 6376,
+ 10767, 13356,
+ 10767, 13360,
+ 10767, 13365, 8921, 7605, 4926,
+ 10767, 13365, 12341, 7605, 4926,
+ 10771, 6121, 1045, 6376,
+ 10783, 5758,
+ 10789, 5759, 0,
+ 10789, 5759, 1, 7711, 0,
+ 10789, 5759, 1, 7711, 236,
+ 10789, 5759, 1, 7711, 750,
+ 10789, 5759, 1, 7711, 1482,
+ 10789, 5759, 1, 7711, 2486,
+ 10789, 5759, 1, 7711, 4241, 5898,
+ 10789, 5759, 1, 7711, 5030,
+ 10789, 5759, 1, 7711, 7077, 4358,
+ 10789, 5759, 8,
+ 10789, 5759, 9, 5387, 9, 2111, 5387, 2110,
+ 10789, 5759, 9, 7711, 2194,
+ 10789, 5759, 16,
+ 10789, 5759, 17, 0,
+ 10789, 5759, 40,
+ 10789, 5759, 41, 41, 40,
+ 10789, 5759, 41, 1304,
+ 10789, 5759, 41, 5387, 41, 41, 10489, 5387, 41, 10488,
+ 10789, 5759, 41, 5387, 41, 463, 5387, 463, 1221, 5387, 1220,
+ 10789, 5759, 41, 5387, 41, 2593, 5387, 2592,
+ 10789, 5759, 54,
+ 10789, 5759, 60,
+ 10789, 5759, 61, 4358,
+ 10789, 5759, 61, 7711, 41, 5445, 41, 5445, 40,
+ 10789, 5759, 61, 7711, 236,
+ 10789, 5759, 61, 7711, 1212,
+ 10789, 5759, 61, 7711, 1483, 4358,
+ 10789, 5759, 61, 7711, 3280,
+ 10789, 5759, 61, 7711, 4125, 4358,
+ 10789, 5759, 61, 7711, 4241, 5898,
+ 10789, 5759, 61, 7711, 4606,
+ 10789, 5759, 61, 7711, 7074,
+ 10789, 5759, 61, 7711, 7534,
+ 10789, 5759, 64,
+ 10789, 5759, 74,
+ 10789, 5759, 75, 7711, 6746,
+ 10789, 5759, 75, 7711, 7545, 5445, 4338,
+ 10789, 5759, 76,
+ 10789, 5759, 77, 7711, 76,
+ 10789, 5759, 77, 7711, 236,
+ 10789, 5759, 77, 7711, 314,
+ 10789, 5759, 77, 7711, 2518,
+ 10789, 5759, 77, 7711, 2836,
+ 10789, 5759, 77, 7711, 4088,
+ 10789, 5759, 77, 7711, 4338,
+ 10789, 5759, 77, 7711, 4706,
+ 10789, 5759, 80,
+ 10789, 5759, 81, 5387, 80,
+ 10789, 5759, 81, 5445, 5043, 9732,
+ 10789, 5759, 81, 5445, 5043, 10377, 81, 5445, 5042,
+ 10789, 5759, 81, 7695, 7710,
+ 10789, 5759, 100,
+ 10789, 5759, 106,
+ 10789, 5759, 107, 7711, 0,
+ 10789, 5759, 107, 7711, 1220,
+ 10789, 5759, 107, 7711, 1483, 4358,
+ 10789, 5759, 112,
+ 10789, 5759, 113, 5387, 113, 60,
+ 10789, 5759, 113, 5387, 113, 596,
+ 10789, 5759, 113, 9967, 112,
+ 10789, 5759, 138,
+ 10789, 5759, 144,
+ 10789, 5759, 152,
+ 10789, 5759, 153, 4358,
+ 10789, 5759, 153, 5387, 152,
+ 10789, 5759, 153, 9684,
+ 10789, 5759, 158,
+ 10789, 5759, 159, 7711, 1, 5445, 237, 5445, 138,
+ 10789, 5759, 159, 7711, 40,
+ 10789, 5759, 159, 7711, 374,
+ 10789, 5759, 159, 7711, 1220,
+ 10789, 5759, 159, 7711, 2488,
+ 10789, 5759, 159, 7711, 2518,
+ 10789, 5759, 172,
+ 10789, 5759, 176,
+ 10789, 5759, 177, 7711, 368,
+ 10789, 5759, 177, 7711, 4240,
+ 10789, 5759, 177, 7711, 4241, 5898,
+ 10789, 5759, 177, 9732,
+ 10789, 5759, 177, 9967, 176,
+ 10789, 5759, 177, 10377, 176,
+ 10789, 5759, 216,
+ 10789, 5759, 217, 4358,
+ 10789, 5759, 224,
+ 10789, 5759, 225, 7711, 8,
+ 10789, 5759, 225, 7711, 40,
+ 10789, 5759, 225, 9967, 224,
+ 10789, 5759, 230,
+ 10789, 5759, 231, 9967, 230,
+ 10789, 5759, 236,
+ 10789, 5759, 237, 4358,
+ 10789, 5759, 237, 5898,
+ 10789, 5759, 242,
+ 10789, 5759, 243, 7711, 40,
+ 10789, 5759, 243, 7711, 736,
+ 10789, 5759, 243, 7711, 750,
+ 10789, 5759, 243, 7711, 1206,
+ 10789, 5759, 243, 7711, 1632,
+ 10789, 5759, 243, 7711, 2110,
+ 10789, 5759, 243, 7711, 2518,
+ 10789, 5759, 243, 7711, 3280,
+ 10789, 5759, 243, 7711, 4094,
+ 10789, 5759, 250,
+ 10789, 5759, 256,
+ 10789, 5759, 262,
+ 10789, 5759, 270,
+ 10789, 5759, 271, 7711, 4241, 5898,
+ 10789, 5759, 272,
+ 10789, 5759, 273, 7711, 5880,
+ 10789, 5759, 273, 9732,
+ 10789, 5759, 273, 9967, 272,
+ 10789, 5759, 273, 10377, 272,
+ 10789, 5759, 274,
+ 10789, 5759, 280,
+ 10789, 5759, 306,
+ 10789, 5759, 307, 7711, 0,
+ 10789, 5759, 307, 7711, 40,
+ 10789, 5759, 307, 7711, 64,
+ 10789, 5759, 307, 7711, 65, 5445, 1682,
+ 10789, 5759, 307, 7711, 106,
+ 10789, 5759, 307, 7711, 216,
+ 10789, 5759, 307, 7711, 224,
+ 10789, 5759, 307, 7711, 230,
+ 10789, 5759, 307, 7711, 272,
+ 10789, 5759, 307, 7711, 314,
+ 10789, 5759, 307, 7711, 340,
+ 10789, 5759, 307, 7711, 354,
+ 10789, 5759, 307, 7711, 368,
+ 10789, 5759, 307, 7711, 369, 5445, 152,
+ 10789, 5759, 307, 7711, 369, 5445, 224,
+ 10789, 5759, 307, 7711, 369, 5445, 560,
+ 10789, 5759, 307, 7711, 374,
+ 10789, 5759, 307, 7711, 375, 5445, 7284,
+ 10789, 5759, 307, 7711, 396,
+ 10789, 5759, 307, 7711, 476,
+ 10789, 5759, 307, 7711, 520,
+ 10789, 5759, 307, 7711, 524,
+ 10789, 5759, 307, 7711, 580,
+ 10789, 5759, 307, 7711, 588,
+ 10789, 5759, 307, 7711, 676,
+ 10789, 5759, 307, 7711, 750,
+ 10789, 5759, 307, 7711, 760,
+ 10789, 5759, 307, 7711, 1212,
+ 10789, 5759, 307, 7711, 1220,
+ 10789, 5759, 307, 7711, 1221, 5445, 5663, 5445, 0,
+ 10789, 5759, 307, 7711, 1482,
+ 10789, 5759, 307, 7711, 1584,
+ 10789, 5759, 307, 7711, 1624,
+ 10789, 5759, 307, 7711, 2110,
+ 10789, 5759, 307, 7711, 2494,
+ 10789, 5759, 307, 7711, 2516,
+ 10789, 5759, 307, 7711, 2518,
+ 10789, 5759, 307, 7711, 2524,
+ 10789, 5759, 307, 7711, 2530,
+ 10789, 5759, 307, 7711, 2654,
+ 10789, 5759, 307, 7711, 2836,
+ 10789, 5759, 307, 7711, 3280,
+ 10789, 5759, 307, 7711, 4166,
+ 10789, 5759, 307, 7711, 4241, 5898,
+ 10789, 5759, 307, 7711, 4334,
+ 10789, 5759, 307, 7711, 4339, 5445, 2494,
+ 10789, 5759, 307, 7711, 4339, 9967, 4338,
+ 10789, 5759, 307, 7711, 4366,
+ 10789, 5759, 307, 7711, 5692,
+ 10789, 5759, 307, 7711, 6049, 7711, 462,
+ 10789, 5759, 307, 7711, 6464,
+ 10789, 5759, 307, 7711, 6746,
+ 10789, 5759, 307, 7711, 7648,
+ 10789, 5759, 314,
+ 10789, 5759, 315, 7711, 40,
+ 10789, 5759, 315, 7711, 588,
+ 10789, 5759, 315, 7711, 750,
+ 10789, 5759, 326,
+ 10789, 5759, 327, 5387, 243, 7711, 3281, 327, 5387, 243, 7711, 3280,
+ 10789, 5759, 332,
+ 10789, 5759, 340,
+ 10789, 5759, 354,
+ 10789, 5759, 355, 7711, 750,
+ 10789, 5759, 364,
+ 10789, 5759, 365, 4358,
+ 10789, 5759, 365, 7711, 5880,
+ 10789, 5759, 368,
+ 10789, 5759, 374,
+ 10789, 5759, 384,
+ 10789, 5759, 385, 5387, 384,
+ 10789, 5759, 392,
+ 10789, 5759, 396,
+ 10789, 5759, 397, 7711, 0,
+ 10789, 5759, 397, 7711, 588,
+ 10789, 5759, 397, 9684,
+ 10789, 5759, 404,
+ 10789, 5759, 405, 7711, 8,
+ 10789, 5759, 416,
+ 10789, 5759, 462,
+ 10789, 5759, 476,
+ 10789, 5759, 477, 7711, 0,
+ 10789, 5759, 477, 7711, 8,
+ 10789, 5759, 477, 7711, 16,
+ 10789, 5759, 477, 7711, 40,
+ 10789, 5759, 477, 7711, 60,
+ 10789, 5759, 477, 7711, 106,
+ 10789, 5759, 477, 7711, 112,
+ 10789, 5759, 477, 7711, 256,
+ 10789, 5759, 477, 7711, 580,
+ 10789, 5759, 477, 9967, 476,
+ 10789, 5759, 510,
+ 10789, 5759, 514,
+ 10789, 5759, 520,
+ 10789, 5759, 524,
+ 10789, 5759, 532,
+ 10789, 5759, 533, 4358,
+ 10789, 5759, 546,
+ 10789, 5759, 547, 5387, 546,
+ 10789, 5759, 556,
+ 10789, 5759, 557, 4358,
+ 10789, 5759, 557, 7711, 242,
+ 10789, 5759, 557, 7711, 374,
+ 10789, 5759, 557, 9898,
+ 10789, 5759, 560,
+ 10789, 5759, 561, 4358,
+ 10789, 5759, 564,
+ 10789, 5759, 565, 5898,
+ 10789, 5759, 576,
+ 10789, 5759, 580,
+ 10789, 5759, 584,
+ 10789, 5759, 588,
+ 10789, 5759, 589, 4358,
+ 10789, 5759, 589, 7711, 41, 5445, 41, 5445, 40,
+ 10789, 5759, 589, 7711, 41, 5445, 41, 5445, 41, 4358,
+ 10789, 5759, 589, 7711, 374,
+ 10789, 5759, 589, 7711, 750,
+ 10789, 5759, 589, 8374,
+ 10789, 5759, 589, 9684,
+ 10789, 5759, 589, 9685, 7711, 750,
+ 10789, 5759, 594,
+ 10789, 5759, 595, 7711, 40,
+ 10789, 5759, 595, 7711, 369, 5445, 138,
+ 10789, 5759, 595, 7711, 5662,
+ 10789, 5759, 595, 7711, 7074,
+ 10789, 5759, 596,
+ 10789, 5759, 597, 4358,
+ 10789, 5759, 602,
+ 10789, 5759, 603, 9684,
+ 10789, 5759, 603, 9967, 602,
+ 10789, 5759, 670,
+ 10789, 5759, 671, 5898,
+ 10789, 5759, 671, 9733, 7711, 1696,
+ 10789, 5759, 676,
+ 10789, 5759, 677, 5387, 676,
+ 10789, 5759, 680,
+ 10789, 5759, 702,
+ 10789, 5759, 703, 7711, 369, 5445, 176,
+ 10789, 5759, 703, 7711, 4241, 5898,
+ 10789, 5759, 703, 7711, 5662,
+ 10789, 5759, 703, 7711, 5880,
+ 10789, 5759, 703, 7711, 6464,
+ 10789, 5759, 736,
+ 10789, 5759, 737, 4703, 5898,
+ 10789, 5759, 737, 5387, 737, 5387, 736,
+ 10789, 5759, 737, 5387, 737, 5387, 737, 9967, 737, 5387, 737, 5387, 736,
+ 10789, 5759, 737, 5387, 737, 6013, 5387, 6013, 6013, 5387, 6013, 2194,
+ 10789, 5759, 737, 6313, 5898,
+ 10789, 5759, 750,
+ 10789, 5759, 754,
+ 10789, 5759, 755, 5387, 754,
+ 10789, 5759, 760,
+ 10789, 5759, 832,
+ 10789, 5759, 958,
+ 10789, 5759, 959, 8361, 7711, 1, 5445, 4928,
+ 10789, 5759, 959, 8361, 7711, 106,
+ 10789, 5759, 959, 8361, 7711, 216,
+ 10789, 5759, 959, 8361, 7711, 217, 5445, 4928,
+ 10789, 5759, 959, 8361, 7711, 224,
+ 10789, 5759, 959, 8361, 7711, 236,
+ 10789, 5759, 959, 8361, 7711, 280,
+ 10789, 5759, 959, 8361, 7711, 281, 5445, 354,
+ 10789, 5759, 959, 8361, 7711, 332,
+ 10789, 5759, 959, 8361, 7711, 354,
+ 10789, 5759, 959, 8361, 7711, 355, 5445, 7138,
+ 10789, 5759, 959, 8361, 7711, 396,
+ 10789, 5759, 959, 8361, 7711, 532,
+ 10789, 5759, 959, 8361, 7711, 581, 5445, 4334,
+ 10789, 5759, 959, 8361, 7711, 1304,
+ 10789, 5759, 959, 8361, 7711, 1584,
+ 10789, 5759, 959, 8361, 7711, 1822,
+ 10789, 5759, 959, 8361, 7711, 2195, 5445, 2194,
+ 10789, 5759, 959, 8361, 7711, 2836,
+ 10789, 5759, 959, 8361, 7711, 3256,
+ 10789, 5759, 959, 8361, 7711, 4334,
+ 10789, 5759, 959, 8361, 7711, 5880,
+ 10789, 5759, 959, 8361, 7711, 6464,
+ 10789, 5759, 962,
+ 10789, 5759, 966,
+ 10789, 5759, 1006,
+ 10789, 5759, 1010,
+ 10789, 5759, 1011, 7711, 2518,
+ 10789, 5759, 1012,
+ 10789, 5759, 1013, 8339, 41, 4359, 4094,
+ 10789, 5759, 1050,
+ 10789, 5759, 1051, 7711, 4166,
+ 10789, 5759, 1052,
+ 10789, 5759, 1054,
+ 10789, 5759, 1060,
+ 10789, 5759, 1202,
+ 10789, 5759, 1203, 5387, 1202,
+ 10789, 5759, 1203, 7711, 1, 5445, 139, 5445, 236,
+ 10789, 5759, 1203, 7711, 1, 5445, 236,
+ 10789, 5759, 1203, 7711, 1, 5445, 1482,
+ 10789, 5759, 1203, 7711, 40,
+ 10789, 5759, 1203, 7711, 80,
+ 10789, 5759, 1203, 7711, 138,
+ 10789, 5759, 1203, 7711, 144,
+ 10789, 5759, 1203, 7711, 172,
+ 10789, 5759, 1203, 7711, 173, 5445, 332,
+ 10789, 5759, 1203, 7711, 176,
+ 10789, 5759, 1203, 7711, 177, 7711, 4241, 5898,
+ 10789, 5759, 1203, 7711, 224,
+ 10789, 5759, 1203, 7711, 237, 5445, 355, 5445, 4166,
+ 10789, 5759, 1203, 7711, 243, 5445, 340,
+ 10789, 5759, 1203, 7711, 332,
+ 10789, 5759, 1203, 7711, 369, 5445, 176,
+ 10789, 5759, 1203, 7711, 374,
+ 10789, 5759, 1203, 7711, 462,
+ 10789, 5759, 1203, 7711, 588,
+ 10789, 5759, 1203, 7711, 589, 5445, 152,
+ 10789, 5759, 1203, 7711, 703, 5899, 5445, 2636,
+ 10789, 5759, 1203, 7711, 736,
+ 10789, 5759, 1203, 7711, 750,
+ 10789, 5759, 1203, 7711, 761, 5445, 510,
+ 10789, 5759, 1203, 7711, 832,
+ 10789, 5759, 1203, 7711, 833, 5445, 510,
+ 10789, 5759, 1203, 7711, 1011, 7711, 2518,
+ 10789, 5759, 1203, 7711, 1050,
+ 10789, 5759, 1203, 7711, 1220,
+ 10789, 5759, 1203, 7711, 1272,
+ 10789, 5759, 1203, 7711, 1273, 5445, 0,
+ 10789, 5759, 1203, 7711, 1344,
+ 10789, 5759, 1203, 7711, 1345, 5445, 332,
+ 10789, 5759, 1203, 7711, 1483, 4358,
+ 10789, 5759, 1203, 7711, 1499, 5445, 251, 5445, 736,
+ 10789, 5759, 1203, 7711, 1584,
+ 10789, 5759, 1203, 7711, 1624,
+ 10789, 5759, 1203, 7711, 1625, 5445, 1736,
+ 10789, 5759, 1203, 7711, 1683, 5445, 80,
+ 10789, 5759, 1203, 7711, 2110,
+ 10789, 5759, 1203, 7711, 2111, 5387, 2110,
+ 10789, 5759, 1203, 7711, 2488,
+ 10789, 5759, 1203, 7711, 2494,
+ 10789, 5759, 1203, 7711, 2518,
+ 10789, 5759, 1203, 7711, 2519, 5445, 2766,
+ 10789, 5759, 1203, 7711, 2584,
+ 10789, 5759, 1203, 7711, 3281, 5445, 1212,
+ 10789, 5759, 1203, 7711, 4241, 5898,
+ 10789, 5759, 1203, 7711, 4335, 5445, 546,
+ 10789, 5759, 1203, 7711, 4544,
+ 10789, 5759, 1203, 7711, 5692,
+ 10789, 5759, 1203, 7711, 5880,
+ 10789, 5759, 1203, 7711, 8338,
+ 10789, 5759, 1206,
+ 10789, 5759, 1207, 5387, 1207, 1221, 5387, 1220,
+ 10789, 5759, 1212,
+ 10789, 5759, 1213, 1207, 5387, 1207, 1221, 5387, 1220,
+ 10789, 5759, 1214,
+ 10789, 5759, 1216,
+ 10789, 5759, 1220,
+ 10789, 5759, 1272,
+ 10789, 5759, 1273, 5387, 1272,
+ 10789, 5759, 1273, 9967, 1272,
+ 10789, 5759, 1302,
+ 10789, 5759, 1303, 4358,
+ 10789, 5759, 1303, 7711, 1584,
+ 10789, 5759, 1303, 7711, 1585, 7711, 1483, 4358,
+ 10789, 5759, 1303, 7711, 2110,
+ 10789, 5759, 1303, 7711, 2489, 5445, 6012,
+ 10789, 5759, 1304,
+ 10789, 5759, 1305, 5387, 1305, 7122,
+ 10789, 5759, 1305, 7711, 1, 5445, 1696,
+ 10789, 5759, 1305, 7711, 1696,
+ 10789, 5759, 1308,
+ 10789, 5759, 1310,
+ 10789, 5759, 1311, 7711, 2518,
+ 10789, 5759, 1316,
+ 10789, 5759, 1344,
+ 10789, 5759, 1482,
+ 10789, 5759, 1483, 514,
+ 10789, 5759, 1483, 1006,
+ 10789, 5759, 1483, 4358,
+ 10789, 5759, 1483, 5387, 1483, 5703, 5387, 5703, 589, 5387, 588,
+ 10789, 5759, 1484,
+ 10789, 5759, 1498,
+ 10789, 5759, 1572,
+ 10789, 5759, 1573, 9967, 1572,
+ 10789, 5759, 1576,
+ 10789, 5759, 1584,
+ 10789, 5759, 1585, 7711, 1483, 4358,
+ 10789, 5759, 1586,
+ 10789, 5759, 1587, 7711, 750,
+ 10789, 5759, 1587, 9967, 1586,
+ 10789, 5759, 1624,
+ 10789, 5759, 1632,
+ 10789, 5759, 1682,
+ 10789, 5759, 1684,
+ 10789, 5759, 1685, 9817, 4212,
+ 10789, 5759, 1686,
+ 10789, 5759, 1688,
+ 10789, 5759, 1689, 4358,
+ 10789, 5759, 1690,
+ 10789, 5759, 1696,
+ 10789, 5759, 1697, 10377, 1696,
+ 10789, 5759, 1736,
+ 10789, 5759, 1737, 7711, 1736,
+ 10789, 5759, 1738,
+ 10789, 5759, 1739, 7711, 1696,
+ 10789, 5759, 1739, 7711, 1697, 5445, 520,
+ 10789, 5759, 1786,
+ 10789, 5759, 1812,
+ 10789, 5759, 1813, 5898,
+ 10789, 5759, 1813, 7711, 76,
+ 10789, 5759, 1813, 7711, 243, 7711, 750,
+ 10789, 5759, 1813, 7711, 272,
+ 10789, 5759, 1813, 7711, 314,
+ 10789, 5759, 1813, 7711, 333, 5445, 736,
+ 10789, 5759, 1813, 7711, 369, 5445, 176,
+ 10789, 5759, 1813, 7711, 396,
+ 10789, 5759, 1813, 7711, 416,
+ 10789, 5759, 1813, 7711, 533, 5445, 736,
+ 10789, 5759, 1813, 7711, 750,
+ 10789, 5759, 1813, 7711, 4166,
+ 10789, 5759, 1813, 7711, 4167, 5898,
+ 10789, 5759, 1813, 7711, 4241, 5898,
+ 10789, 5759, 1813, 7711, 4704,
+ 10789, 5759, 1813, 7711, 4706,
+ 10789, 5759, 1813, 7711, 4707, 5445, 736,
+ 10789, 5759, 1813, 7711, 5761, 5445, 112,
+ 10789, 5759, 1813, 7711, 6012,
+ 10789, 5759, 1813, 7711, 7074,
+ 10789, 5759, 1813, 9684,
+ 10789, 5759, 1813, 9732,
+ 10789, 5759, 1813, 9967, 1812,
+ 10789, 5759, 1813, 10377, 1812,
+ 10789, 5759, 1814,
+ 10789, 5759, 1818,
+ 10789, 5759, 1820,
+ 10789, 5759, 1822,
+ 10789, 5759, 1823, 5387, 1822,
+ 10789, 5759, 1823, 5387, 1823, 1221, 5387, 1220,
+ 10789, 5759, 1852,
+ 10789, 5759, 1856,
+ 10789, 5759, 1864,
+ 10789, 5759, 1896,
+ 10789, 5759, 1922,
+ 10789, 5759, 1950,
+ 10789, 5759, 1951, 4358,
+ 10789, 5759, 1980,
+ 10789, 5759, 1988,
+ 10789, 5759, 1989, 9520,
+ 10789, 5759, 2044,
+ 10789, 5759, 2054,
+ 10789, 5759, 2055, 7711, 1221, 5445, 4241, 5898,
+ 10789, 5759, 2055, 7711, 4241, 5898,
+ 10789, 5759, 2110,
+ 10789, 5759, 2111, 5387, 2110,
+ 10789, 5759, 2111, 5898,
+ 10789, 5759, 2111, 7077, 7711, 1220,
+ 10789, 5759, 2111, 7077, 7711, 2488,
+ 10789, 5759, 2111, 7077, 7711, 2489, 5387, 2111, 7077, 7711, 2488,
+ 10789, 5759, 2111, 7077, 7711, 2836,
+ 10789, 5759, 2111, 7077, 7711, 4928,
+ 10789, 5759, 2111, 9967, 2110,
+ 10789, 5759, 2111, 9967, 2111, 7077, 5387, 7076,
+ 10789, 5759, 2190,
+ 10789, 5759, 2192,
+ 10789, 5759, 2194,
+ 10789, 5759, 2380,
+ 10789, 5759, 2486,
+ 10789, 5759, 2487, 4358,
+ 10789, 5759, 2487, 5387, 2486,
+ 10789, 5759, 2487, 7711, 0,
+ 10789, 5759, 2487, 7711, 152,
+ 10789, 5759, 2487, 7711, 236,
+ 10789, 5759, 2487, 7711, 374,
+ 10789, 5759, 2487, 7711, 580,
+ 10789, 5759, 2487, 7711, 584,
+ 10789, 5759, 2487, 7711, 594,
+ 10789, 5759, 2487, 7711, 602,
+ 10789, 5759, 2487, 7711, 1050,
+ 10789, 5759, 2487, 7711, 1584,
+ 10789, 5759, 2487, 7711, 1696,
+ 10789, 5759, 2487, 7711, 1822,
+ 10789, 5759, 2487, 7711, 2110,
+ 10789, 5759, 2487, 7711, 2488,
+ 10789, 5759, 2487, 7711, 2636,
+ 10789, 5759, 2487, 7711, 2836,
+ 10789, 5759, 2487, 7711, 5692,
+ 10789, 5759, 2487, 9520,
+ 10789, 5759, 2488,
+ 10789, 5759, 2489, 7075, 7711, 3280,
+ 10789, 5759, 2494,
+ 10789, 5759, 2516,
+ 10789, 5759, 2518,
+ 10789, 5759, 2519, 250,
+ 10789, 5759, 2519, 5387, 2519, 1207, 5387, 1207, 1221, 5387, 1220,
+ 10789, 5759, 2519, 5387, 2519, 2637, 5387, 2637, 1221, 5387, 1220,
+ 10789, 5759, 2524,
+ 10789, 5759, 2525, 5387, 10267, 2524,
+ 10789, 5759, 2530,
+ 10789, 5759, 2582,
+ 10789, 5759, 2584,
+ 10789, 5759, 2592,
+ 10789, 5759, 2636,
+ 10789, 5759, 2637, 5387, 2637, 405, 5387, 405, 4095, 5387, 4094,
+ 10789, 5759, 2637, 9732,
+ 10789, 5759, 2638,
+ 10789, 5759, 2639, 7711, 106,
+ 10789, 5759, 2639, 7711, 588,
+ 10789, 5759, 2639, 7711, 1304,
+ 10789, 5759, 2639, 7711, 2518,
+ 10789, 5759, 2639, 7711, 2524,
+ 10789, 5759, 2639, 7711, 6012,
+ 10789, 5759, 2654,
+ 10789, 5759, 2694,
+ 10789, 5759, 2698,
+ 10789, 5759, 2699, 5387, 2698,
+ 10789, 5759, 2699, 5387, 2699, 1207, 5387, 1207, 1221, 5387, 1220,
+ 10789, 5759, 2699, 7711, 5880,
+ 10789, 5759, 2758,
+ 10789, 5759, 2760,
+ 10789, 5759, 2766,
+ 10789, 5759, 2767, 5387, 2767, 671, 5387, 670,
+ 10789, 5759, 2822,
+ 10789, 5759, 2823, 7711, 1, 5445, 236,
+ 10789, 5759, 2823, 7711, 1, 5445, 392,
+ 10789, 5759, 2823, 7711, 76,
+ 10789, 5759, 2823, 7711, 236,
+ 10789, 5759, 2823, 7711, 580,
+ 10789, 5759, 2823, 7711, 581, 5445, 106,
+ 10789, 5759, 2823, 7711, 581, 5445, 736,
+ 10789, 5759, 2823, 7711, 2110,
+ 10789, 5759, 2824,
+ 10789, 5759, 2828,
+ 10789, 5759, 2832,
+ 10789, 5759, 2833, 7711, 0,
+ 10789, 5759, 2833, 7711, 41, 5445, 1304,
+ 10789, 5759, 2833, 7711, 216,
+ 10789, 5759, 2833, 7711, 230,
+ 10789, 5759, 2833, 7711, 236,
+ 10789, 5759, 2833, 7711, 272,
+ 10789, 5759, 2833, 7711, 314,
+ 10789, 5759, 2833, 7711, 462,
+ 10789, 5759, 2833, 7711, 576,
+ 10789, 5759, 2833, 7711, 588,
+ 10789, 5759, 2833, 7711, 760,
+ 10789, 5759, 2833, 7711, 1060,
+ 10789, 5759, 2833, 7711, 1212,
+ 10789, 5759, 2833, 7711, 1220,
+ 10789, 5759, 2833, 7711, 1482,
+ 10789, 5759, 2833, 7711, 1498,
+ 10789, 5759, 2833, 7711, 1822,
+ 10789, 5759, 2833, 7711, 1922,
+ 10789, 5759, 2833, 7711, 2518,
+ 10789, 5759, 2833, 7711, 4241, 5898,
+ 10789, 5759, 2833, 7711, 5756,
+ 10789, 5759, 2833, 7711, 7774,
+ 10789, 5759, 2833, 7711, 7954,
+ 10789, 5759, 2836,
+ 10789, 5759, 2837, 7711, 0,
+ 10789, 5759, 2837, 7711, 326,
+ 10789, 5759, 2837, 7711, 1696,
+ 10789, 5759, 2837, 7711, 5880,
+ 10789, 5759, 2840,
+ 10789, 5759, 2841, 7711, 8338,
+ 10789, 5759, 2842,
+ 10789, 5759, 3122,
+ 10789, 5759, 3136,
+ 10789, 5759, 3158,
+ 10789, 5759, 3160,
+ 10789, 5759, 3161, 4703, 5898,
+ 10789, 5759, 3164,
+ 10789, 5759, 3188,
+ 10789, 5759, 3189, 7711, 0,
+ 10789, 5759, 3190,
+ 10789, 5759, 3242,
+ 10789, 5759, 3256,
+ 10789, 5759, 3257, 7711, 2518,
+ 10789, 5759, 3266,
+ 10789, 5759, 3270,
+ 10789, 5759, 3271, 7711, 1696,
+ 10789, 5759, 3280,
+ 10789, 5759, 3698,
+ 10789, 5759, 3820,
+ 10789, 5759, 4088,
+ 10789, 5759, 4094,
+ 10789, 5759, 4122,
+ 10789, 5759, 4124,
+ 10789, 5759, 4125, 4358,
+ 10789, 5759, 4125, 4359, 4358,
+ 10789, 5759, 4126,
+ 10789, 5759, 4132,
+ 10789, 5759, 4154,
+ 10789, 5759, 4156,
+ 10789, 5759, 4164,
+ 10789, 5759, 4166,
+ 10789, 5759, 4174,
+ 10789, 5759, 4175, 7711, 0,
+ 10789, 5759, 4175, 7711, 1, 5445, 1736,
+ 10789, 5759, 4175, 7711, 1, 5445, 1737, 7711, 1736,
+ 10789, 5759, 4175, 7711, 80,
+ 10789, 5759, 4175, 7711, 236,
+ 10789, 5759, 4175, 7711, 237, 4358,
+ 10789, 5759, 4175, 7711, 332,
+ 10789, 5759, 4175, 7711, 340,
+ 10789, 5759, 4175, 7711, 354,
+ 10789, 5759, 4175, 7711, 580,
+ 10789, 5759, 4175, 7711, 588,
+ 10789, 5759, 4175, 7711, 750,
+ 10789, 5759, 4175, 7711, 1483, 4358,
+ 10789, 5759, 4175, 7711, 1682,
+ 10789, 5759, 4175, 7711, 1737, 7711, 1736,
+ 10789, 5759, 4175, 7711, 4125, 4358,
+ 10789, 5759, 4175, 7711, 4125, 4359, 4358,
+ 10789, 5759, 4175, 7711, 8338,
+ 10789, 5759, 4175, 7711, 8339, 9732,
+ 10789, 5759, 4234,
+ 10789, 5759, 4235, 9967, 4234,
+ 10789, 5759, 4240,
+ 10789, 5759, 4241, 5387, 4240,
+ 10789, 5759, 4241, 5898,
+ 10789, 5759, 4241, 9967, 4240,
+ 10789, 5759, 4242,
+ 10789, 5759, 4334,
+ 10789, 5759, 4335, 4358,
+ 10789, 5759, 4336,
+ 10789, 5759, 4337, 7711, 1, 5445, 1482,
+ 10789, 5759, 4337, 7711, 355, 5445, 1482,
+ 10789, 5759, 4337, 7711, 462,
+ 10789, 5759, 4337, 7711, 1482,
+ 10789, 5759, 4337, 7711, 4241, 5898,
+ 10789, 5759, 4338,
+ 10789, 5759, 4339, 5898,
+ 10789, 5759, 4339, 7711, 750,
+ 10789, 5759, 4339, 7711, 5880,
+ 10789, 5759, 4339, 9967, 4338,
+ 10789, 5759, 4366,
+ 10789, 5759, 4544,
+ 10789, 5759, 4545, 7711, 80,
+ 10789, 5759, 4545, 7711, 588,
+ 10789, 5759, 4545, 7711, 1344,
+ 10789, 5759, 4545, 7711, 4884,
+ 10789, 5759, 4545, 7711, 8338,
+ 10789, 5759, 4546,
+ 10789, 5759, 4596,
+ 10789, 5759, 4597, 5387, 4597, 832,
+ 10789, 5759, 4597, 5387, 4597, 9732,
+ 10789, 5759, 4606,
+ 10789, 5759, 4704,
+ 10789, 5759, 4706,
+ 10789, 5759, 4708,
+ 10789, 5759, 4710,
+ 10789, 5759, 4711, 5387, 4710,
+ 10789, 5759, 4714,
+ 10789, 5759, 4716,
+ 10789, 5759, 4764,
+ 10789, 5759, 4884,
+ 10789, 5759, 4928,
+ 10789, 5759, 5030,
+ 10789, 5759, 5031, 5387, 5030,
+ 10789, 5759, 5031, 5387, 5031, 7711, 1, 5445, 392,
+ 10789, 5759, 5031, 7711, 0,
+ 10789, 5759, 5031, 7711, 670,
+ 10789, 5759, 5031, 7711, 1696,
+ 10789, 5759, 5031, 9967, 5030,
+ 10789, 5759, 5042,
+ 10789, 5759, 5043, 7711, 2525, 5898,
+ 10789, 5759, 5043, 10266,
+ 10789, 5759, 5043, 10377, 5042,
+ 10789, 5759, 5044,
+ 10789, 5759, 5278,
+ 10789, 5759, 5662,
+ 10789, 5759, 5663, 7711, 0,
+ 10789, 5759, 5663, 7711, 40,
+ 10789, 5759, 5663, 7711, 41, 5445, 0,
+ 10789, 5759, 5663, 7711, 396,
+ 10789, 5759, 5663, 7711, 750,
+ 10789, 5759, 5663, 7711, 2766,
+ 10789, 5759, 5663, 7711, 4338,
+ 10789, 5759, 5663, 7711, 5720,
+ 10789, 5759, 5664,
+ 10789, 5759, 5682,
+ 10789, 5759, 5692,
+ 10789, 5759, 5693, 7711, 0,
+ 10789, 5759, 5693, 7711, 272,
+ 10789, 5759, 5696,
+ 10789, 5759, 5697, 7711, 0,
+ 10789, 5759, 5697, 7711, 754,
+ 10789, 5759, 5697, 7711, 1012,
+ 10789, 5759, 5697, 7711, 1220,
+ 10789, 5759, 5697, 7711, 1482,
+ 10789, 5759, 5697, 7711, 1483, 4358,
+ 10789, 5759, 5697, 7711, 1820,
+ 10789, 5759, 5697, 7711, 1950,
+ 10789, 5759, 5697, 7711, 2488,
+ 10789, 5759, 5697, 7711, 6534,
+ 10789, 5759, 5697, 7711, 8374,
+ 10789, 5759, 5702,
+ 10789, 5759, 5703, 5387, 5703, 833, 5387, 832,
+ 10789, 5759, 5703, 5898,
+ 10789, 5759, 5720,
+ 10789, 5759, 5756,
+ 10789, 5759, 5757, 5387, 5757, 5720,
+ 10789, 5759, 5760,
+ 10789, 5759, 5840,
+ 10789, 5759, 5852,
+ 10789, 5759, 5880,
+ 10789, 5759, 6012,
+ 10789, 5759, 6046,
+ 10789, 5759, 6048,
+ 10789, 5759, 6049, 7711, 462,
+ 10789, 5759, 6049, 7711, 8338,
+ 10789, 5759, 6054,
+ 10789, 5759, 6062,
+ 10789, 5759, 6064,
+ 10789, 5759, 6256,
+ 10789, 5759, 6318,
+ 10789, 5759, 6396,
+ 10789, 5759, 6412,
+ 10789, 5759, 6430,
+ 10789, 5759, 6436,
+ 10789, 5759, 6464,
+ 10789, 5759, 6466,
+ 10789, 5759, 6534,
+ 10789, 5759, 6535, 5387, 6534,
+ 10789, 5759, 6648,
+ 10789, 5759, 6650,
+ 10789, 5759, 6708,
+ 10789, 5759, 6746,
+ 10789, 5759, 6818,
+ 10789, 5759, 6854,
+ 10789, 5759, 6860,
+ 10789, 5759, 6884,
+ 10789, 5759, 7040,
+ 10789, 5759, 7054,
+ 10789, 5759, 7074,
+ 10789, 5759, 7075, 7711, 0,
+ 10789, 5759, 7075, 7711, 1, 5445, 139, 5445, 236,
+ 10789, 5759, 7075, 7711, 1, 5445, 1220,
+ 10789, 5759, 7075, 7711, 1, 5445, 1736,
+ 10789, 5759, 7075, 7711, 40,
+ 10789, 5759, 7075, 7711, 41, 5445, 0,
+ 10789, 5759, 7075, 7711, 41, 5445, 41, 5445, 40,
+ 10789, 5759, 7075, 7711, 76,
+ 10789, 5759, 7075, 7711, 80,
+ 10789, 5759, 7075, 7711, 106,
+ 10789, 5759, 7075, 7711, 176,
+ 10789, 5759, 7075, 7711, 216,
+ 10789, 5759, 7075, 7711, 236,
+ 10789, 5759, 7075, 7711, 243, 7711, 2110,
+ 10789, 5759, 7075, 7711, 272,
+ 10789, 5759, 7075, 7711, 273, 5445, 236,
+ 10789, 5759, 7075, 7711, 273, 5445, 354,
+ 10789, 5759, 7075, 7711, 314,
+ 10789, 5759, 7075, 7711, 354,
+ 10789, 5759, 7075, 7711, 368,
+ 10789, 5759, 7075, 7711, 369, 5445, 176,
+ 10789, 5759, 7075, 7711, 396,
+ 10789, 5759, 7075, 7711, 561, 5445, 1, 5445, 547, 5445, 392,
+ 10789, 5759, 7075, 7711, 581, 5445, 736,
+ 10789, 5759, 7075, 7711, 588,
+ 10789, 5759, 7075, 7711, 737, 6313, 5898,
+ 10789, 5759, 7075, 7711, 750,
+ 10789, 5759, 7075, 7711, 966,
+ 10789, 5759, 7075, 7711, 1220,
+ 10789, 5759, 7075, 7711, 1304,
+ 10789, 5759, 7075, 7711, 1305, 5445, 1304,
+ 10789, 5759, 7075, 7711, 1344,
+ 10789, 5759, 7075, 7711, 1483, 4358,
+ 10789, 5759, 7075, 7711, 1632,
+ 10789, 5759, 7075, 7711, 1682,
+ 10789, 5759, 7075, 7711, 1688,
+ 10789, 5759, 7075, 7711, 1689, 5445, 243, 5445, 0,
+ 10789, 5759, 7075, 7711, 1820,
+ 10789, 5759, 7075, 7711, 2519, 5445, 2584,
+ 10789, 5759, 7075, 7711, 2584,
+ 10789, 5759, 7075, 7711, 2638,
+ 10789, 5759, 7075, 7711, 2836,
+ 10789, 5759, 7075, 7711, 4884,
+ 10789, 5759, 7075, 7711, 5030,
+ 10789, 5759, 7075, 7711, 5720,
+ 10789, 5759, 7075, 7711, 5721, 5445, 5720,
+ 10789, 5759, 7075, 7711, 5880,
+ 10789, 5759, 7075, 7711, 7074,
+ 10789, 5759, 7075, 7711, 7545, 5445, 4339, 5445, 6746,
+ 10789, 5759, 7075, 7711, 7545, 5445, 4339, 5898,
+ 10789, 5759, 7075, 9732,
+ 10789, 5759, 7076,
+ 10789, 5759, 7077, 4358,
+ 10789, 5759, 7077, 4359, 5387, 7077, 4359, 2518,
+ 10789, 5759, 7077, 7711, 2518,
+ 10789, 5759, 7077, 7711, 2519, 5445, 2584,
+ 10789, 5759, 7122,
+ 10789, 5759, 7123, 5387, 7122,
+ 10789, 5759, 7123, 9684,
+ 10789, 5759, 7123, 10377, 7122,
+ 10789, 5759, 7138,
+ 10789, 5759, 7196,
+ 10789, 5759, 7197, 4358,
+ 10789, 5759, 7197, 7711, 0,
+ 10789, 5759, 7197, 7711, 1, 5445, 144,
+ 10789, 5759, 7197, 7711, 144,
+ 10789, 5759, 7204,
+ 10789, 5759, 7248,
+ 10789, 5759, 7284,
+ 10789, 5759, 7285, 703, 7711, 106,
+ 10789, 5759, 7285, 703, 7711, 332,
+ 10789, 5759, 7285, 703, 7711, 396,
+ 10789, 5759, 7285, 703, 7711, 580,
+ 10789, 5759, 7285, 703, 7711, 1052,
+ 10789, 5759, 7285, 703, 7711, 1304,
+ 10789, 5759, 7285, 703, 7711, 1483, 4358,
+ 10789, 5759, 7285, 703, 7711, 4706,
+ 10789, 5759, 7285, 703, 7711, 7572,
+ 10789, 5759, 7285, 703, 7711, 7954,
+ 10789, 5759, 7285, 8361, 7711, 106,
+ 10789, 5759, 7285, 8361, 7711, 107, 40,
+ 10789, 5759, 7364,
+ 10789, 5759, 7374,
+ 10789, 5759, 7375, 7711, 588,
+ 10789, 5759, 7375, 7711, 670,
+ 10789, 5759, 7375, 7711, 1586,
+ 10789, 5759, 7375, 10377, 7374,
+ 10789, 5759, 7510,
+ 10789, 5759, 7516,
+ 10789, 5759, 7528,
+ 10789, 5759, 7534,
+ 10789, 5759, 7544,
+ 10789, 5759, 7572,
+ 10789, 5759, 7648,
+ 10789, 5759, 7762,
+ 10789, 5759, 7774,
+ 10789, 5759, 7775, 7711, 40,
+ 10789, 5759, 7778,
+ 10789, 5759, 7890,
+ 10789, 5759, 7954,
+ 10789, 5759, 7966,
+ 10789, 5759, 8242,
+ 10789, 5759, 8276,
+ 10789, 5759, 8338,
+ 10789, 5759, 8339, 5387, 8339, 7075, 7711, 41, 5387, 7075, 7711, 40,
+ 10789, 5759, 8339, 7075, 7711, 41, 5387, 7075, 7711, 40,
+ 10789, 5759, 8360,
+ 10789, 5759, 8361, 5387, 8360,
+ 10789, 5759, 8374,
+ 10789, 5759, 8376,
+ 10789, 5759, 8382,
+ 10789, 5759, 8408,
+ 10789, 5759, 8490,
+ 10789, 5759, 8494,
+ 10789, 5759, 8512,
+ 10789, 5759, 8513, 7711, 80,
+ 10789, 5759, 8513, 7711, 369, 5445, 4241, 5898,
+ 10789, 5759, 8513, 7711, 396,
+ 10789, 5759, 8513, 7711, 581, 5445, 736,
+ 10789, 5759, 8513, 7711, 736,
+ 10789, 5759, 8513, 7711, 737, 5445, 736,
+ 10789, 5759, 8513, 7711, 1304,
+ 10789, 5759, 8513, 7711, 2110,
+ 10789, 5759, 8513, 7711, 2518,
+ 10789, 5759, 8513, 7711, 2519, 5445, 1, 80,
+ 10789, 5759, 8513, 7711, 2519, 5445, 736,
+ 10789, 5759, 8513, 7711, 2519, 5445, 737, 5445, 736,
+ 10789, 5759, 8513, 7711, 2836,
+ 10789, 5759, 8664,
+ 10789, 5759, 8702,
+ 10789, 5759, 8706,
+ 10789, 5759, 8710,
+ 10789, 5759, 8764,
+ 10789, 5759, 8902,
+ 10789, 5759, 9306,
+ 10789, 5759, 9307, 7711, 1696,
+ 10789, 5759, 10518,
+ 10789, 9515, 5759, 2167, 9897, 2171, 7574,
+ 10789, 9515, 5759, 2167, 9897, 2171, 9614,
+ 10789, 9515, 5759, 2171, 3704,
+ 10789, 9515, 5759, 2171, 3822,
+ 10789, 9515, 5759, 2171, 6756,
+ 10789, 9515, 5759, 2171, 6830,
+ 10789, 9515, 5759, 2171, 6832,
+ 10789, 9515, 5759, 2171, 7520,
+ 10789, 9515, 5759, 2171, 7687, 4094,
+ 10789, 9515, 5759, 2171, 7687, 9817, 4213, 0,
+ 10789, 9515, 5759, 2171, 8159, 736,
+ 10789, 9515, 5759, 2171, 9615, 736,
+ 10789, 9515, 5759, 2541, 40,
+ 10789, 9515, 5759, 2541, 736,
+ 10789, 9515, 5759, 2541, 737, 5898,
+ 10789, 9515, 5759, 2541, 4094,
+ 10789, 9515, 5759, 2541, 6830,
+ 10789, 9515, 5759, 2541, 7516,
+ 10789, 9515, 5759, 2541, 9817, 4213, 3282,
+ 10789, 9515, 5759, 2779, 736,
+ 10789, 9515, 5759, 2779, 737, 5898,
+ 10789, 9515, 5759, 2779, 3704,
+ 10789, 9515, 5759, 2779, 3822,
+ 10789, 9515, 5759, 2779, 6756,
+ 10789, 9515, 5759, 2779, 6830,
+ 10789, 9515, 5759, 2779, 6832,
+ 10789, 9515, 5759, 2779, 7516,
+ 10789, 9515, 5759, 2779, 7520,
+ 10789, 9515, 5759, 2779, 8819, 4094,
+ 10789, 9515, 5759, 2779, 8819, 9817, 4213, 0,
+ 10789, 9515, 5759, 4201, 40,
+ 10789, 9515, 5759, 4201, 736,
+ 10789, 9515, 5759, 4201, 737, 5898,
+ 10789, 9515, 5759, 4201, 3704,
+ 10789, 9515, 5759, 4201, 3705, 9817, 4212,
+ 10789, 9515, 5759, 4201, 3822,
+ 10789, 9515, 5759, 4201, 4094,
+ 10789, 9515, 5759, 4201, 6830,
+ 10789, 9515, 5759, 4201, 6832,
+ 10789, 9515, 5759, 4201, 7516,
+ 10789, 9515, 5759, 4201, 7520,
+ 10789, 9515, 5759, 4201, 8719, 4094,
+ 10789, 9515, 5759, 4215, 40,
+ 10789, 9515, 5759, 4215, 736,
+ 10789, 9515, 5759, 4215, 737, 5898,
+ 10789, 9515, 5759, 4215, 3704,
+ 10789, 9515, 5759, 4215, 3705, 9817, 4212,
+ 10789, 9515, 5759, 4215, 3822,
+ 10789, 9515, 5759, 4215, 4094,
+ 10789, 9515, 5759, 4215, 6830,
+ 10789, 9515, 5759, 4215, 6832,
+ 10789, 9515, 5759, 4215, 7516,
+ 10789, 9515, 5759, 4215, 7520,
+ 10789, 9515, 5759, 4215, 9817, 4213, 7106,
+ 10789, 9515, 5759, 4215, 9817, 4213, 7107, 0,
+ 10789, 9515, 5759, 4215, 9817, 4213, 7107, 2,
+ 10789, 9515, 5759, 4215, 9817, 4213, 8410,
+ 10789, 9515, 5759, 5191, 40,
+ 10789, 9515, 5759, 5191, 736,
+ 10789, 9515, 5759, 5191, 4094,
+ 10789, 9515, 5759, 5191, 6830,
+ 10789, 9515, 5759, 5191, 7516,
+ 10789, 9515, 5759, 5191, 9817, 4213, 8310,
+ 10789, 9515, 5759, 5191, 9817, 4213, 8311, 0,
+ 10789, 9515, 5759, 5191, 9817, 4213, 9354,
+ 10789, 9515, 5759, 5191, 9817, 4213, 9356,
+ 10789, 9515, 5759, 6723, 40,
+ 10789, 9515, 5759, 6723, 736,
+ 10789, 9515, 5759, 6723, 4094,
+ 10789, 9515, 5759, 6723, 6830,
+ 10789, 9515, 5759, 6723, 7516,
+ 10789, 9515, 5759, 6723, 9817, 4213, 6066,
+ 10789, 9515, 5759, 6723, 9817, 4213, 7776,
+ 10789, 9515, 5759, 7509, 40,
+ 10789, 9515, 5759, 7509, 736,
+ 10789, 9515, 5759, 7509, 4094,
+ 10789, 9515, 5759, 7509, 6830,
+ 10789, 9515, 5759, 7509, 7516,
+ 10789, 9515, 5759, 7509, 9817, 4213, 4607, 0,
+ 10789, 9515, 5759, 7509, 9817, 4213, 4607, 2,
+ 10789, 9515, 5759, 7509, 9817, 4213, 6990,
+ 10789, 9515, 5759, 7517, 7711, 1213, 5445, 1922,
+ 10789, 9515, 5759, 7517, 7711, 1213, 5445, 4094,
+ 10789, 9515, 5759, 7695, 736,
+ 10789, 9515, 5759, 7695, 737, 5898,
+ 10789, 9515, 5759, 7695, 3704,
+ 10789, 9515, 5759, 7695, 3822,
+ 10789, 9515, 5759, 7695, 3823, 9817, 4212,
+ 10789, 9515, 5759, 7695, 4094,
+ 10789, 9515, 5759, 7695, 6830,
+ 10789, 9515, 5759, 7695, 6832,
+ 10789, 9515, 5759, 7695, 7516,
+ 10789, 9515, 5759, 7695, 7517, 9817, 4212,
+ 10789, 9515, 5759, 7695, 7520,
+ 10789, 9515, 5759, 7695, 7521, 9817, 4212,
+ 10789, 9515, 5759, 7695, 9817, 4213, 6752,
+ 10789, 9515, 5759, 7695, 9817, 4213, 6754,
+ 10789, 9515, 5759, 11136,
+ 10789, 9515, 5759, 11138,
+ 10789, 12133, 5759, 2167, 9897, 6129, 9178,
+ 10789, 12133, 5759, 10001, 6610,
+ 10789, 12133, 5759, 10001, 10644,
+ 10789, 12133, 5759, 10677, 6610,
+ 10797, 8775, 7101, 601, 721, 11648,
+ 10797, 8775, 7101, 601, 721, 11649, 6121, 6104,
+ 10797, 8775, 7101, 601, 721, 11649, 6121, 8056,
+ 10797, 8775, 7101, 601, 721, 11649, 6121, 10642,
+ 10797, 8775, 7101, 4117, 721, 11648,
+ 10797, 8775, 7101, 4117, 721, 11649, 6121, 6104,
+ 10797, 8775, 7101, 4117, 721, 11649, 6121, 8056,
+ 10797, 8775, 7101, 4117, 721, 11649, 6121, 10642,
+ 10797, 8775, 7101, 10677, 721, 2725, 4848,
+ 10797, 8775, 7101, 10677, 721, 2725, 7442,
+ 10797, 8775, 7101, 10677, 721, 6104,
+ 10797, 8775, 7101, 10677, 721, 8005, 4848,
+ 10797, 8775, 7101, 10677, 721, 8005, 7442,
+ 10797, 8775, 7101, 10677, 6121, 8056,
+ 10797, 8775, 7101, 10677, 6121, 10642,
+ 10804,
+ 10817, 8548,
+ 10959, 2779, 8289, 6434,
+ 10959, 6434,
+ 10959, 6435, 569, 760,
+ 10959, 6435, 4221, 760,
+ 10959, 6435, 6121, 2697, 11096,
+ 10959, 6435, 6121, 2697, 11764,
+ 10959, 6435, 6121, 8077, 11096,
+ 10959, 6435, 6121, 8153, 8758,
+ 10959, 6435, 6121, 11649, 8758,
+ 10959, 6435, 11097, 429, 9811, 6434,
+ 10959, 6505, 6434,
+ 10959, 7821, 6434,
+ 10959, 7924,
+ 10959, 8097, 6434,
+ 10959, 8153, 6434,
+ 10959, 8561, 7944,
+ 10959, 8849, 6434,
+ 10959, 8963, 6434,
+ 10959, 9327, 6121, 3713, 4849, 569, 760,
+ 10959, 9327, 6121, 3713, 4849, 4221, 760,
+ 10959, 9327, 6121, 3713, 4849, 7991, 9811, 9327, 6121, 3713, 7442,
+ 10959, 9327, 6121, 3713, 4849, 7991, 10959, 9327, 6121, 3713, 7442,
+ 10959, 9327, 6121, 3713, 7443, 569, 760,
+ 10959, 9327, 6121, 3713, 7443, 4221, 760,
+ 10959, 9327, 6121, 3713, 11096,
+ 10959, 9327, 6121, 3713, 11764,
+ 10959, 11191, 6434,
+ 10963, 9120,
+ 10977, 8774,
+ 10978,
+ 10989, 5758,
+ 11011, 1809, 4876,
+ 11011, 2091, 5758,
+ 11011, 2941, 5758,
+ 11011, 3055, 5758,
+ 11011, 3873, 5758,
+ 11011, 4223, 5836,
+ 11011, 4849, 6627, 9050,
+ 11011, 4849, 7821, 12114,
+ 11011, 4849, 8745, 9050,
+ 11011, 4849, 12114,
+ 11011, 5445, 5758,
+ 11011, 6610,
+ 11011, 6616,
+ 11011, 6689, 2170,
+ 11011, 6689, 2540,
+ 11011, 6689, 2778,
+ 11011, 6689, 4200,
+ 11011, 6689, 4214,
+ 11011, 6689, 5190,
+ 11011, 6689, 6260,
+ 11011, 6689, 6722,
+ 11011, 6689, 7508,
+ 11011, 6689, 7694,
+ 11011, 6875, 7908,
+ 11011, 7089, 7593, 8405, 0,
+ 11011, 7089, 7593, 8405, 2,
+ 11011, 7089, 7593, 8405, 4,
+ 11011, 7089, 7593, 8405, 6,
+ 11011, 7089, 7593, 8405, 8,
+ 11011, 7089, 7593, 8405, 10,
+ 11011, 7089, 7593, 8405, 12,
+ 11011, 7089, 7593, 8405, 14,
+ 11011, 7089, 7593, 8405, 16,
+ 11011, 7089, 7593, 8405, 18,
+ 11011, 7089, 7593, 8405, 20,
+ 11011, 7089, 7593, 8405, 22,
+ 11011, 7089, 7593, 8405, 24,
+ 11011, 7089, 7593, 8405, 26,
+ 11011, 7089, 7593, 8405, 28,
+ 11011, 7089, 7593, 8405, 30,
+ 11011, 7089, 7593, 8405, 32,
+ 11011, 7089, 7593, 8405, 34,
+ 11011, 7089, 7593, 8405, 36,
+ 11011, 7089, 7593, 8405, 38,
+ 11011, 7089, 7593, 8405, 40,
+ 11011, 7089, 7593, 8405, 42,
+ 11011, 7089, 7593, 8405, 44,
+ 11011, 7089, 7593, 8405, 46,
+ 11011, 7089, 7593, 8405, 48,
+ 11011, 7089, 7593, 8405, 50,
+ 11011, 7089, 9063, 8405, 0,
+ 11011, 7089, 9063, 8405, 2,
+ 11011, 7089, 9063, 8405, 4,
+ 11011, 7089, 9063, 8405, 6,
+ 11011, 7089, 9063, 8405, 8,
+ 11011, 7089, 9063, 8405, 10,
+ 11011, 7089, 9063, 8405, 12,
+ 11011, 7089, 9063, 8405, 14,
+ 11011, 7089, 9063, 8405, 16,
+ 11011, 7089, 9063, 8405, 18,
+ 11011, 7089, 9063, 8405, 20,
+ 11011, 7089, 9063, 8405, 22,
+ 11011, 7089, 9063, 8405, 24,
+ 11011, 7089, 9063, 8405, 26,
+ 11011, 7089, 9063, 8405, 28,
+ 11011, 7089, 9063, 8405, 30,
+ 11011, 7089, 9063, 8405, 32,
+ 11011, 7089, 9063, 8405, 34,
+ 11011, 7089, 9063, 8405, 36,
+ 11011, 7089, 9063, 8405, 38,
+ 11011, 7089, 9063, 8405, 40,
+ 11011, 7089, 9063, 8405, 42,
+ 11011, 7089, 9063, 8405, 44,
+ 11011, 7089, 9063, 8405, 46,
+ 11011, 7089, 9063, 8405, 48,
+ 11011, 7089, 9063, 8405, 50,
+ 11011, 7387, 5758,
+ 11011, 7443, 6627, 9050,
+ 11011, 7443, 7821, 12114,
+ 11011, 7443, 8745, 9050,
+ 11011, 7443, 12114,
+ 11011, 7708,
+ 11011, 8017, 760,
+ 11011, 8129, 5758,
+ 11011, 8167, 5758,
+ 11011, 8432,
+ 11011, 8525, 5758,
+ 11011, 9581, 5758,
+ 11011, 9633, 9718,
+ 11011, 9718,
+ 11011, 9898,
+ 11011, 10469, 4926,
+ 11011, 10677, 4876,
+ 11011, 10708,
+ 11011, 11099, 5758,
+ 11011, 11195, 4926,
+ 11011, 11224,
+ 11011, 11424,
+ 11011, 11449, 7908,
+ 11011, 11451, 90,
+ 11011, 12017, 4926,
+ 11011, 12473, 5758,
+ 11011, 12478,
+ 11015, 11740,
+ 11031, 4849, 8077, 9050,
+ 11031, 6505, 8744,
+ 11031, 6801, 7101, 10676,
+ 11031, 7443, 8077, 9050,
+ 11031, 7821, 8056,
+ 11031, 8287, 8206,
+ 11031, 8287, 8405, 0,
+ 11031, 8287, 8405, 8,
+ 11031, 8287, 8405, 16,
+ 11031, 8287, 8405, 28,
+ 11031, 8287, 8405, 40,
+ 11031, 8287, 8405, 66,
+ 11031, 8287, 8405, 178,
+ 11031, 8287, 8405, 188,
+ 11031, 8287, 8405, 426,
+ 11031, 8287, 8405, 622,
+ 11031, 8287, 8405, 626,
+ 11031, 8287, 8405, 630,
+ 11031, 8287, 8405, 652,
+ 11031, 8287, 8405, 654,
+ 11031, 8287, 8405, 656,
+ 11031, 8287, 8405, 660,
+ 11031, 8287, 8405, 664,
+ 11031, 8287, 8405, 2908,
+ 11031, 8287, 8405, 2926,
+ 11031, 8287, 8405, 3012,
+ 11031, 8287, 8405, 3056,
+ 11031, 8287, 8405, 5770,
+ 11031, 8287, 8405, 6594,
+ 11031, 8287, 8405, 6912,
+ 11031, 8287, 8405, 6982,
+ 11031, 8287, 8405, 7166,
+ 11031, 8287, 8405, 7244,
+ 11031, 8287, 8405, 7372,
+ 11031, 8287, 8405, 7440,
+ 11031, 8287, 8405, 8362,
+ 11031, 8287, 8405, 8828,
+ 11031, 8287, 8405, 9086,
+ 11031, 8287, 8405, 9400,
+ 11031, 8287, 8405, 9588,
+ 11031, 8287, 8405, 9780,
+ 11031, 8287, 8405, 11248,
+ 11031, 8287, 8405, 11728,
+ 11031, 8287, 8405, 11758,
+ 11031, 8287, 8405, 11824,
+ 11031, 8287, 8405, 11832,
+ 11031, 8287, 8405, 12070,
+ 11031, 8287, 8405, 12094,
+ 11031, 8287, 8405, 12096,
+ 11031, 8287, 8405, 12144,
+ 11031, 8287, 8405, 12146,
+ 11031, 8287, 8405, 12150,
+ 11031, 8287, 8405, 12350,
+ 11031, 8287, 8405, 12352,
+ 11031, 8287, 8405, 12532,
+ 11031, 8287, 8405, 13006,
+ 11031, 8287, 8405, 13008,
+ 11031, 9811, 6434,
+ 11031, 10283, 8405, 0,
+ 11031, 10283, 8405, 8,
+ 11031, 10283, 8405, 16,
+ 11031, 10283, 8405, 26,
+ 11031, 10283, 8405, 28,
+ 11031, 10283, 8405, 40,
+ 11031, 10283, 8405, 236,
+ 11031, 10283, 8405, 238,
+ 11031, 10283, 8405, 242,
+ 11031, 10283, 8405, 246,
+ 11031, 10283, 8405, 250,
+ 11031, 10283, 8405, 306,
+ 11031, 10283, 8405, 310,
+ 11031, 10283, 8405, 314,
+ 11031, 10283, 8405, 322,
+ 11031, 10283, 8405, 326,
+ 11031, 10283, 8405, 364,
+ 11031, 10283, 8405, 368,
+ 11031, 10283, 8405, 374,
+ 11031, 10283, 8405, 380,
+ 11031, 10283, 8405, 384,
+ 11031, 10283, 8405, 392,
+ 11031, 10283, 8405, 396,
+ 11031, 10283, 8405, 404,
+ 11031, 10283, 8405, 412,
+ 11031, 10283, 8405, 416,
+ 11031, 10283, 8405, 510,
+ 11031, 10283, 8405, 512,
+ 11031, 10283, 8405, 514,
+ 11031, 10283, 8405, 516,
+ 11031, 10283, 8405, 520,
+ 11031, 10283, 8405, 524,
+ 11031, 10283, 8405, 526,
+ 11031, 10283, 8405, 532,
+ 11031, 10283, 8405, 536,
+ 11031, 10283, 8405, 546,
+ 11031, 10283, 8405, 556,
+ 11031, 10283, 8405, 560,
+ 11031, 10283, 8405, 564,
+ 11031, 10283, 8405, 568,
+ 11031, 10283, 8405, 576,
+ 11031, 10283, 8405, 622,
+ 11031, 10283, 8405, 632,
+ 11031, 10283, 8405, 652,
+ 11031, 10283, 8405, 660,
+ 11031, 10283, 8405, 664,
+ 11031, 10283, 8405, 7593, 0,
+ 11031, 10283, 8405, 7593, 8,
+ 11031, 10283, 8405, 7593, 16,
+ 11031, 10283, 8405, 7593, 28,
+ 11031, 10283, 8405, 7593, 40,
+ 11031, 10283, 8405, 7593, 576,
+ 11031, 10283, 8405, 7593, 652,
+ 11031, 10283, 8405, 7593, 660,
+ 11031, 10283, 8405, 7593, 664,
+ 11031, 10283, 8473, 1044,
+ 11031, 10283, 8921, 7605, 4926,
+ 11031, 10283, 12341, 7605, 4926,
+ 11031, 10959, 6434,
+ 11031, 11097, 6434,
+ 11031, 11765, 6434,
+ 11031, 12043, 4223, 5836,
+ 11031, 12043, 6616,
+ 11031, 13365, 11185, 7605, 4926,
+ 11035, 10773, 8456,
+ 11036,
+ 11041, 568,
+ 11041, 569, 721, 9705, 10410,
+ 11041, 6121, 1045, 6376,
+ 11051, 88,
+ 11052,
+ 11061, 8774,
+ 11063, 5444,
+ 11063, 7710,
+ 11063, 11228,
+ 11093, 731, 12901, 6434,
+ 11097, 2779, 8289, 6434,
+ 11097, 6105, 6434,
+ 11097, 6434,
+ 11097, 6435, 569, 760,
+ 11097, 6435, 569, 761, 5387, 11765, 6435, 569, 760,
+ 11097, 6435, 569, 6505, 9158,
+ 11097, 6435, 4221, 760,
+ 11097, 6435, 4221, 761, 569, 6505, 9158,
+ 11097, 6435, 5387, 11765, 6434,
+ 11097, 6435, 6121, 2697, 9810,
+ 11097, 6435, 6121, 2697, 10958,
+ 11097, 6435, 6121, 4530,
+ 11097, 6435, 6121, 4896,
+ 11097, 6435, 6121, 5445, 6490,
+ 11097, 6435, 6121, 5878,
+ 11097, 6435, 6121, 5879, 6121, 8153, 10677, 8758,
+ 11097, 6435, 6121, 5879, 6121, 10677, 8758,
+ 11097, 6435, 6121, 8151, 5832,
+ 11097, 6435, 6121, 8153, 10677, 8758,
+ 11097, 6435, 6121, 8758,
+ 11097, 6435, 6121, 10677, 8758,
+ 11097, 6435, 6377, 7551, 11765, 6434,
+ 11097, 6435, 6377, 7709, 10374,
+ 11097, 6435, 6377, 7919, 6741, 568,
+ 11097, 6435, 6377, 9633, 7709, 10374,
+ 11097, 6435, 6377, 9633, 7919, 6741, 568,
+ 11097, 6435, 9785, 46,
+ 11097, 6435, 9785, 8762,
+ 11097, 6435, 9785, 11098,
+ 11097, 6505, 6434,
+ 11097, 7821, 6434,
+ 11097, 8097, 6434,
+ 11097, 8153, 3993, 6434,
+ 11097, 8153, 6434,
+ 11097, 8153, 6435, 4221, 760,
+ 11097, 8153, 6435, 6121, 8758,
+ 11097, 8153, 6435, 6121, 10677, 8758,
+ 11097, 8153, 11430,
+ 11097, 8561, 7944,
+ 11097, 8849, 3993, 6434,
+ 11097, 8849, 6434,
+ 11097, 9327, 5387, 11765, 9326,
+ 11097, 9327, 6121, 3713, 601, 569, 760,
+ 11097, 9327, 6121, 3713, 601, 4221, 760,
+ 11097, 9327, 6121, 3713, 601, 6377, 4895, 3992,
+ 11097, 9327, 6121, 3713, 601, 6377, 11097, 9327, 6121, 3713, 4116,
+ 11097, 9327, 6121, 3713, 601, 6377, 11765, 9327, 6121, 3713, 600,
+ 11097, 9327, 6121, 3713, 4117, 569, 760,
+ 11097, 9327, 6121, 3713, 4117, 4221, 760,
+ 11097, 9327, 6121, 3713, 4117, 6377, 11765, 9327, 6121, 3713, 4116,
+ 11097, 9327, 6121, 3713, 4117, 6491, 4895, 3992,
+ 11097, 9327, 6121, 3713, 9810,
+ 11097, 9327, 6121, 3713, 10958,
+ 11097, 10531, 6434,
+ 11097, 11191, 6434,
+ 11097, 11430,
+ 11097, 11875, 6435, 4221, 760,
+ 11097, 11875, 6435, 6121, 5878,
+ 11097, 11875, 6435, 6121, 5879, 6121, 8153, 10677, 8758,
+ 11097, 11875, 6435, 6121, 5879, 6121, 10677, 8758,
+ 11097, 11875, 6435, 6121, 8153, 10677, 8758,
+ 11097, 11875, 6435, 6121, 10677, 8758,
+ 11097, 11875, 8849, 3993, 6434,
+ 11097, 12103, 6434,
+ 11099, 445, 6741, 568,
+ 11099, 445, 9705, 6741, 568,
+ 11099, 445, 9705, 6741, 569, 6121, 1045, 6376,
+ 11099, 445, 9705, 6741, 569, 6121, 1045, 6377, 7442,
+ 11099, 445, 9705, 6741, 569, 6121, 1045, 8318,
+ 11099, 445, 11621, 568,
+ 11099, 445, 11896,
+ 11099, 445, 12472,
+ 11099, 721, 2091, 11896,
+ 11099, 721, 12345, 2091, 6741, 568,
+ 11099, 835, 2091, 6741, 568,
+ 11099, 835, 2091, 11621, 568,
+ 11099, 5387, 6741, 568,
+ 11099, 5758,
+ 11099, 6121, 1044,
+ 11099, 6121, 8057, 8318,
+ 11099, 6121, 10469, 4927, 6376,
+ 11099, 6377, 9693, 445, 6740,
+ 11099, 6377, 9693, 6377, 12472,
+ 11099, 6377, 9705, 6741, 6377, 12473, 6377, 9705, 6740,
+ 11099, 6377, 11097, 6434,
+ 11099, 6377, 12007, 6741, 6377, 12472,
+ 11099, 6377, 12473, 6377, 12007, 6740,
+ 11099, 6741, 569, 445, 12472,
+ 11099, 8065, 115, 6628,
+ 11099, 8065, 115, 6629, 6377, 9705, 6740,
+ 11104,
+ 11111, 93, 8399, 4926,
+ 11111, 3997, 4926,
+ 11111, 5759, 8916,
+ 11111, 5759, 9824,
+ 11111, 5759, 9870,
+ 11111, 5759, 9904,
+ 11111, 6689, 2170,
+ 11111, 6689, 2540,
+ 11111, 6689, 2778,
+ 11111, 6689, 4200,
+ 11111, 6689, 4214,
+ 11111, 6689, 5190,
+ 11111, 6689, 6260,
+ 11111, 6689, 6722,
+ 11111, 6689, 7508,
+ 11111, 6689, 7694,
+ 11111, 7803, 5759, 8,
+ 11111, 7803, 5759, 16,
+ 11111, 7803, 5759, 28,
+ 11111, 7803, 5759, 40,
+ 11111, 7803, 5759, 58,
+ 11111, 7803, 5759, 72,
+ 11111, 7803, 5759, 92,
+ 11111, 7803, 5759, 162,
+ 11111, 7803, 5759, 266,
+ 11111, 7803, 5759, 440,
+ 11111, 7803, 5759, 606,
+ 11111, 7803, 5759, 9827, 22,
+ 11111, 7803, 5759, 9827, 34,
+ 11111, 7803, 5759, 9827, 344,
+ 11111, 7803, 5759, 9827, 518,
+ 11111, 8405, 0,
+ 11111, 8405, 8,
+ 11111, 8405, 16,
+ 11111, 8405, 28,
+ 11111, 8405, 40,
+ 11111, 8405, 58,
+ 11111, 8405, 72,
+ 11111, 8405, 92,
+ 11111, 8405, 100,
+ 11111, 8405, 116,
+ 11111, 8405, 138,
+ 11111, 8405, 162,
+ 11111, 8405, 216,
+ 11111, 8405, 236,
+ 11111, 8405, 266,
+ 11111, 8405, 292,
+ 11111, 8405, 306,
+ 11111, 8405, 332,
+ 11111, 8405, 364,
+ 11111, 8405, 392,
+ 11111, 8405, 440,
+ 11111, 8405, 462,
+ 11111, 8405, 510,
+ 11111, 8405, 524,
+ 11111, 8405, 556,
+ 11111, 8405, 606,
+ 11111, 8405, 610,
+ 11111, 8405, 652,
+ 11111, 8405, 792,
+ 11111, 8405, 884,
+ 11111, 8405, 974,
+ 11111, 8405, 996,
+ 11111, 8405, 1260,
+ 11111, 8405, 1512,
+ 11111, 8405, 1612,
+ 11111, 8405, 1796,
+ 11111, 8405, 2030,
+ 11111, 8405, 2076,
+ 11111, 8405, 2126,
+ 11111, 8405, 2212,
+ 11111, 8405, 2438,
+ 11111, 8405, 2516,
+ 11111, 8405, 2566,
+ 11111, 8405, 2678,
+ 11111, 8405, 2746,
+ 11111, 8405, 4016,
+ 11111, 8405, 4888,
+ 11111, 8405, 5994,
+ 11111, 8405, 8045, 20,
+ 11111, 8405, 8045, 22,
+ 11111, 8405, 8045, 26,
+ 11111, 8405, 8045, 344,
+ 11111, 8405, 8045, 410,
+ 11111, 8405, 8045, 518,
+ 11111, 8405, 9827, 22,
+ 11111, 8405, 9827, 34,
+ 11111, 8405, 9827, 344,
+ 11111, 8405, 9827, 518,
+ 11111, 8525, 2171, 9344,
+ 11111, 8525, 2171, 10624,
+ 11111, 8525, 2670,
+ 11111, 10203, 2171, 4388,
+ 11111, 10203, 2171, 9614,
+ 11111, 10203, 7695, 10466,
+ 11113, 9539, 11054,
+ 11123, 4215, 4112,
+ 11123, 4217, 11391, 10507, 2170,
+ 11123, 4217, 11391, 10507, 2778,
+ 11123, 4217, 11391, 10507, 7694,
+ 11123, 4223, 5836,
+ 11123, 5751, 10585, 9921, 8450,
+ 11123, 5963, 5781, 8306,
+ 11123, 6500,
+ 11123, 6610,
+ 11123, 6616,
+ 11123, 6689, 2170,
+ 11123, 6689, 2540,
+ 11123, 6689, 2778,
+ 11123, 6689, 4200,
+ 11123, 6689, 4214,
+ 11123, 6689, 5190,
+ 11123, 6689, 6260,
+ 11123, 6689, 6722,
+ 11123, 6689, 7508,
+ 11123, 6689, 7694,
+ 11123, 7803, 11228,
+ 11123, 8405, 0,
+ 11123, 8405, 8,
+ 11123, 8405, 16,
+ 11123, 8405, 28,
+ 11123, 8405, 40,
+ 11123, 8405, 100,
+ 11123, 8405, 138,
+ 11123, 8405, 162,
+ 11123, 8405, 196,
+ 11123, 8405, 216,
+ 11123, 8405, 292,
+ 11123, 8405, 306,
+ 11123, 8405, 332,
+ 11123, 8405, 364,
+ 11123, 8405, 392,
+ 11123, 8405, 426,
+ 11123, 8405, 462,
+ 11123, 8405, 496,
+ 11123, 8405, 510,
+ 11123, 8405, 524,
+ 11123, 8405, 556,
+ 11123, 8405, 590,
+ 11123, 8405, 622,
+ 11123, 8405, 652,
+ 11123, 8405, 670,
+ 11123, 8405, 717, 4237, 0,
+ 11123, 8405, 717, 4237, 16,
+ 11123, 8405, 717, 4237, 70,
+ 11123, 8405, 717, 4237, 116,
+ 11123, 8405, 717, 4237, 138,
+ 11123, 8405, 717, 4237, 306,
+ 11123, 8405, 717, 4237, 462,
+ 11123, 8405, 717, 4237, 556,
+ 11123, 8405, 717, 4237, 670,
+ 11123, 8405, 717, 4237, 974,
+ 11123, 8405, 717, 4237, 2030,
+ 11123, 8405, 717, 4237, 2076,
+ 11123, 8405, 717, 4237, 2212,
+ 11123, 8405, 717, 4237, 2566,
+ 11123, 8405, 717, 4237, 2746,
+ 11123, 8405, 717, 4237, 3146,
+ 11123, 8405, 717, 4237, 4389, 40,
+ 11123, 8405, 717, 4237, 4389, 652,
+ 11123, 8405, 717, 4237, 5994,
+ 11123, 8405, 717, 4237, 7695, 7972,
+ 11123, 8405, 717, 4237, 7972,
+ 11123, 8405, 717, 4237, 8092,
+ 11123, 8405, 717, 4237, 9138,
+ 11123, 8405, 717, 4237, 9802,
+ 11123, 8405, 717, 4237, 9825, 2170,
+ 11123, 8405, 717, 4237, 9871, 2170,
+ 11123, 8405, 717, 4237, 10267, 9802,
+ 11123, 8405, 722,
+ 11123, 8405, 884,
+ 11123, 8405, 888,
+ 11123, 8405, 1338,
+ 11123, 8405, 1612,
+ 11123, 8405, 1770,
+ 11123, 8405, 2516,
+ 11123, 8405, 2732,
+ 11123, 8405, 3150,
+ 11123, 8405, 3186,
+ 11123, 8405, 5751, 8,
+ 11123, 8405, 5751, 16,
+ 11123, 8405, 5751, 40,
+ 11123, 8405, 5751, 138,
+ 11123, 8405, 5751, 196,
+ 11123, 8405, 5751, 216,
+ 11123, 8405, 5751, 236,
+ 11123, 8405, 5751, 290,
+ 11123, 8405, 5751, 292,
+ 11123, 8405, 5751, 306,
+ 11123, 8405, 5751, 462,
+ 11123, 8405, 5751, 556,
+ 11123, 8405, 5751, 590,
+ 11123, 8405, 5751, 670,
+ 11123, 8405, 5751, 722,
+ 11123, 8405, 5751, 884,
+ 11123, 8405, 5751, 1204,
+ 11123, 8405, 5751, 1338,
+ 11123, 8405, 5751, 2378,
+ 11123, 8405, 5751, 2516,
+ 11123, 8405, 5751, 2732,
+ 11123, 8405, 5751, 3146,
+ 11123, 8405, 5963, 8,
+ 11123, 8405, 5963, 16,
+ 11123, 8405, 5963, 28,
+ 11123, 8405, 5963, 40,
+ 11123, 8405, 5963, 100,
+ 11123, 8405, 5963, 138,
+ 11123, 8405, 5963, 216,
+ 11123, 8405, 5963, 292,
+ 11123, 8405, 5963, 306,
+ 11123, 8405, 5963, 364,
+ 11123, 8405, 5963, 426,
+ 11123, 8405, 5963, 462,
+ 11123, 8405, 5963, 496,
+ 11123, 8405, 5963, 556,
+ 11123, 8405, 5963, 590,
+ 11123, 8405, 5963, 622,
+ 11123, 8405, 5963, 652,
+ 11123, 8405, 5963, 717, 4237, 556,
+ 11123, 8405, 5963, 717, 4237, 3146,
+ 11123, 8405, 5963, 722,
+ 11123, 8405, 5963, 884,
+ 11123, 8405, 5963, 1080,
+ 11123, 8405, 5963, 1204,
+ 11123, 8405, 5963, 1338,
+ 11123, 8405, 5963, 1516,
+ 11123, 8405, 5963, 2046,
+ 11123, 8405, 5963, 2732,
+ 11123, 8405, 5963, 4895, 7803, 5758,
+ 11123, 8405, 8439, 16,
+ 11123, 8405, 8439, 196,
+ 11123, 8405, 8439, 306,
+ 11123, 8405, 8439, 510,
+ 11123, 8405, 8439, 717, 4237, 116,
+ 11123, 8405, 8439, 717, 4237, 556,
+ 11123, 8405, 8439, 717, 4237, 670,
+ 11123, 8405, 8439, 717, 4237, 792,
+ 11123, 8405, 8439, 717, 4237, 944,
+ 11123, 8405, 8439, 717, 4237, 996,
+ 11123, 8405, 8439, 717, 4237, 1260,
+ 11123, 8405, 8439, 717, 4237, 1512,
+ 11123, 8405, 8439, 717, 4237, 1770,
+ 11123, 8405, 8439, 717, 4237, 2030,
+ 11123, 8405, 8439, 717, 4237, 2566,
+ 11123, 8405, 8439, 717, 4237, 2746,
+ 11123, 8405, 8439, 717, 4237, 3146,
+ 11123, 8405, 8439, 717, 4237, 4016,
+ 11123, 8405, 8439, 3146,
+ 11123, 8439, 4223, 5836,
+ 11123, 8439, 6616,
+ 11123, 8516,
+ 11123, 10154,
+ 11163, 11228,
+ 11169, 7337, 5758,
+ 11172,
+ 11173, 6121, 2667, 2724,
+ 11191, 7390,
+ 11191, 10261, 10374,
+ 11195, 4926,
+ 11205, 8775, 1177, 8879, 10434,
+ 11205, 8775, 1177, 8881, 10434,
+ 11205, 8775, 1177, 8883, 10434,
+ 11205, 8775, 1177, 8885, 10434,
+ 11205, 8775, 1177, 8887, 10434,
+ 11205, 8775, 1177, 8889, 10434,
+ 11205, 8775, 1177, 8891, 10434,
+ 11205, 8775, 1177, 9305, 11114,
+ 11207, 4926,
+ 11217, 10265, 9610,
+ 11224,
+ 11242,
+ 11245, 6408,
+ 11245, 6409, 9537, 600,
+ 11245, 6409, 9537, 4848,
+ 11261, 2170,
+ 11261, 2540,
+ 11261, 2778,
+ 11261, 4200,
+ 11261, 4214,
+ 11261, 4849, 12114,
+ 11261, 5190,
+ 11261, 5445, 5758,
+ 11261, 6260,
+ 11261, 6722,
+ 11261, 7172,
+ 11261, 7443, 12114,
+ 11261, 7508,
+ 11261, 7694,
+ 11261, 8167, 5758,
+ 11263, 2724,
+ 11263, 6121, 10260,
+ 11263, 8004,
+ 11265, 5759, 9558,
+ 11265, 5759, 10408,
+ 11265, 5759, 11158,
+ 11265, 5759, 11160,
+ 11265, 6689, 2170,
+ 11265, 6689, 2540,
+ 11265, 6689, 2778,
+ 11265, 6689, 4200,
+ 11265, 6689, 4214,
+ 11265, 6689, 5190,
+ 11265, 6689, 6260,
+ 11265, 6689, 6722,
+ 11265, 6689, 7508,
+ 11265, 6689, 7694,
+ 11265, 7803, 5759, 9560,
+ 11265, 7803, 5759, 9566,
+ 11265, 7803, 5759, 10402,
+ 11265, 7803, 5759, 10404,
+ 11265, 7803, 5759, 11710,
+ 11265, 7803, 5759, 11712,
+ 11265, 8405, 0,
+ 11265, 8405, 8,
+ 11265, 8405, 16,
+ 11265, 8405, 28,
+ 11265, 8405, 40,
+ 11265, 8405, 66,
+ 11265, 8405, 100,
+ 11265, 8405, 116,
+ 11265, 8405, 138,
+ 11265, 8405, 188,
+ 11265, 8405, 196,
+ 11265, 8405, 216,
+ 11265, 8405, 236,
+ 11265, 8405, 292,
+ 11265, 8405, 306,
+ 11265, 8405, 332,
+ 11265, 8405, 364,
+ 11265, 8405, 392,
+ 11265, 8405, 462,
+ 11265, 8405, 496,
+ 11265, 8405, 510,
+ 11265, 8405, 524,
+ 11265, 8405, 556,
+ 11265, 8405, 610,
+ 11265, 8405, 622,
+ 11265, 8405, 638,
+ 11265, 8405, 652,
+ 11265, 8405, 670,
+ 11265, 8405, 1612,
+ 11265, 8405, 2030,
+ 11265, 8405, 2126,
+ 11265, 8405, 2610,
+ 11265, 10775, 5759, 9564,
+ 11265, 10775, 5759, 10406,
+ 11265, 10775, 5759, 11154,
+ 11355, 5758,
+ 11355, 10303, 5758,
+ 11355, 10472,
+ 11357, 1177, 439, 2681, 7790,
+ 11357, 1177, 1550,
+ 11357, 1177, 1749, 445, 7180,
+ 11357, 1177, 3803, 11754,
+ 11357, 1177, 4150,
+ 11357, 1177, 4223, 8056,
+ 11357, 1177, 6702,
+ 11357, 1177, 6865, 569, 4944,
+ 11357, 1177, 6994,
+ 11357, 1177, 7174,
+ 11357, 1177, 7428,
+ 11357, 1177, 7644,
+ 11357, 1177, 7770,
+ 11357, 1177, 7810,
+ 11357, 1177, 7952,
+ 11357, 1177, 8036,
+ 11357, 1177, 8042,
+ 11357, 1177, 8065, 7186,
+ 11357, 1177, 8156,
+ 11357, 1177, 8222,
+ 11357, 1177, 8394,
+ 11357, 1177, 8618,
+ 11357, 1177, 8650,
+ 11357, 1177, 8976,
+ 11357, 1177, 9026,
+ 11357, 1177, 9100,
+ 11357, 1177, 9110,
+ 11357, 1177, 9168,
+ 11357, 1177, 9276,
+ 11357, 1177, 9341, 3696,
+ 11357, 1177, 9395, 7592,
+ 11357, 1177, 9402,
+ 11357, 1177, 9460,
+ 11357, 1177, 9466,
+ 11357, 1177, 9550,
+ 11357, 1177, 9574,
+ 11357, 1177, 9626,
+ 11357, 1177, 9696,
+ 11357, 1177, 9832,
+ 11357, 1177, 10168,
+ 11357, 1177, 10210,
+ 11357, 1177, 10232,
+ 11357, 1177, 10252,
+ 11357, 1177, 10486,
+ 11357, 1177, 10540,
+ 11357, 1177, 10550,
+ 11357, 1177, 10673, 445, 9836,
+ 11357, 1177, 10747, 2186,
+ 11357, 1177, 10764,
+ 11357, 1177, 10776,
+ 11357, 1177, 10792,
+ 11357, 1177, 10800,
+ 11357, 1177, 10972,
+ 11357, 1177, 10998,
+ 11357, 1177, 11002,
+ 11357, 1177, 11012,
+ 11357, 1177, 11013, 274,
+ 11357, 1177, 11024,
+ 11357, 1177, 11086,
+ 11357, 1177, 11210,
+ 11357, 1177, 11234,
+ 11357, 1177, 11454,
+ 11357, 1177, 11456,
+ 11357, 1177, 11462,
+ 11357, 1177, 11486,
+ 11357, 1177, 11610,
+ 11357, 1177, 11622,
+ 11357, 1177, 11702,
+ 11357, 1177, 11752,
+ 11357, 1177, 11888,
+ 11357, 1177, 11916,
+ 11357, 1177, 12012,
+ 11357, 1177, 12026,
+ 11357, 1177, 12118,
+ 11357, 1177, 12392,
+ 11357, 1177, 12430,
+ 11357, 1177, 12434,
+ 11357, 1177, 12436,
+ 11357, 1177, 12898,
+ 11357, 1177, 12923, 445, 11484,
+ 11357, 1177, 12936,
+ 11360,
+ 11387, 11205, 8774,
+ 11389, 12117, 8774,
+ 11391, 11770,
+ 11391, 11772,
+ 11391, 11774,
+ 11391, 11776,
+ 11391, 11778,
+ 11391, 11780,
+ 11391, 11782,
+ 11391, 11784,
+ 11391, 11786,
+ 11391, 12160,
+ 11391, 12162,
+ 11391, 12164,
+ 11391, 12166,
+ 11391, 12168,
+ 11391, 12170,
+ 11391, 12172,
+ 11391, 12174,
+ 11391, 12176,
+ 11391, 12178,
+ 11391, 12180,
+ 11391, 12182,
+ 11391, 12184,
+ 11391, 12186,
+ 11391, 12188,
+ 11391, 12190,
+ 11391, 12192,
+ 11391, 12194,
+ 11391, 12196,
+ 11391, 12198,
+ 11391, 12200,
+ 11391, 12202,
+ 11391, 12204,
+ 11391, 12206,
+ 11391, 12208,
+ 11391, 12210,
+ 11391, 12212,
+ 11391, 12214,
+ 11391, 12216,
+ 11391, 12218,
+ 11391, 12220,
+ 11391, 12222,
+ 11391, 12224,
+ 11391, 12226,
+ 11391, 12228,
+ 11391, 12230,
+ 11391, 12232,
+ 11391, 12234,
+ 11391, 12236,
+ 11391, 12238,
+ 11391, 12240,
+ 11391, 12242,
+ 11391, 12244,
+ 11391, 12246,
+ 11391, 12248,
+ 11391, 12250,
+ 11391, 12252,
+ 11391, 12254,
+ 11391, 12256,
+ 11391, 12258,
+ 11391, 12260,
+ 11391, 12262,
+ 11391, 12264,
+ 11391, 12266,
+ 11391, 12268,
+ 11391, 12270,
+ 11391, 12272,
+ 11391, 12274,
+ 11391, 12276,
+ 11391, 12278,
+ 11391, 12280,
+ 11391, 12282,
+ 11391, 12284,
+ 11391, 12286,
+ 11391, 12288,
+ 11391, 12290,
+ 11391, 12292,
+ 11391, 12294,
+ 11391, 12296,
+ 11391, 12298,
+ 11391, 12300,
+ 11391, 12302,
+ 11391, 12304,
+ 11391, 12306,
+ 11391, 12308,
+ 11391, 12310,
+ 11391, 12312,
+ 11391, 12314,
+ 11391, 12316,
+ 11391, 12318,
+ 11391, 12320,
+ 11391, 12322,
+ 11391, 12324,
+ 11391, 12326,
+ 11391, 12328,
+ 11391, 12330,
+ 11391, 12332,
+ 11391, 12334,
+ 11391, 12336,
+ 11391, 12338,
+ 11391, 12542,
+ 11391, 12544,
+ 11391, 12546,
+ 11391, 12548,
+ 11391, 12550,
+ 11391, 12552,
+ 11391, 12554,
+ 11391, 12556,
+ 11391, 12558,
+ 11391, 12560,
+ 11391, 12562,
+ 11391, 12564,
+ 11391, 12566,
+ 11391, 12568,
+ 11391, 12570,
+ 11391, 12572,
+ 11391, 12574,
+ 11391, 12576,
+ 11391, 12578,
+ 11391, 12580,
+ 11391, 12582,
+ 11391, 12584,
+ 11391, 12586,
+ 11391, 12588,
+ 11391, 12590,
+ 11391, 12592,
+ 11391, 12594,
+ 11391, 12596,
+ 11391, 12598,
+ 11391, 12600,
+ 11391, 12602,
+ 11391, 12604,
+ 11391, 12606,
+ 11391, 12608,
+ 11391, 12610,
+ 11391, 12612,
+ 11391, 12614,
+ 11391, 12616,
+ 11391, 12618,
+ 11391, 12620,
+ 11391, 12622,
+ 11391, 12624,
+ 11391, 12626,
+ 11391, 12628,
+ 11391, 12630,
+ 11391, 12632,
+ 11391, 12634,
+ 11391, 12636,
+ 11391, 12638,
+ 11391, 12640,
+ 11391, 12642,
+ 11391, 12644,
+ 11391, 12646,
+ 11391, 12648,
+ 11391, 12650,
+ 11391, 12652,
+ 11391, 12654,
+ 11391, 12656,
+ 11391, 12658,
+ 11391, 12660,
+ 11391, 12662,
+ 11391, 12664,
+ 11391, 12666,
+ 11391, 12668,
+ 11391, 12670,
+ 11391, 12672,
+ 11391, 12674,
+ 11391, 12676,
+ 11391, 12678,
+ 11391, 12680,
+ 11391, 12682,
+ 11391, 12684,
+ 11391, 12686,
+ 11391, 12688,
+ 11391, 12690,
+ 11391, 12692,
+ 11391, 12694,
+ 11391, 12696,
+ 11391, 12698,
+ 11391, 12700,
+ 11391, 12702,
+ 11391, 12704,
+ 11391, 12706,
+ 11391, 12708,
+ 11391, 12710,
+ 11391, 12712,
+ 11391, 12714,
+ 11391, 12716,
+ 11391, 12718,
+ 11391, 12720,
+ 11391, 12722,
+ 11391, 12724,
+ 11391, 12726,
+ 11391, 12728,
+ 11391, 12730,
+ 11391, 12732,
+ 11391, 12734,
+ 11391, 12736,
+ 11391, 12738,
+ 11391, 12740,
+ 11391, 12742,
+ 11391, 12744,
+ 11391, 12746,
+ 11391, 12748,
+ 11391, 12750,
+ 11391, 12752,
+ 11391, 12754,
+ 11391, 12756,
+ 11391, 12758,
+ 11391, 12760,
+ 11391, 12762,
+ 11391, 12764,
+ 11391, 12766,
+ 11391, 12768,
+ 11391, 12770,
+ 11391, 12772,
+ 11391, 12774,
+ 11391, 12776,
+ 11391, 12778,
+ 11391, 12780,
+ 11391, 12782,
+ 11391, 12784,
+ 11391, 12786,
+ 11391, 12788,
+ 11391, 12790,
+ 11391, 12792,
+ 11391, 12794,
+ 11391, 12796,
+ 11391, 12798,
+ 11391, 12800,
+ 11391, 12802,
+ 11391, 12804,
+ 11391, 12806,
+ 11391, 12808,
+ 11391, 12810,
+ 11391, 12812,
+ 11391, 12814,
+ 11391, 12816,
+ 11391, 12818,
+ 11391, 12820,
+ 11391, 12822,
+ 11391, 12824,
+ 11391, 12826,
+ 11391, 12828,
+ 11391, 12830,
+ 11391, 12832,
+ 11391, 12834,
+ 11391, 12836,
+ 11391, 12838,
+ 11391, 12840,
+ 11391, 12842,
+ 11391, 12844,
+ 11391, 12846,
+ 11391, 12848,
+ 11391, 12850,
+ 11391, 12852,
+ 11391, 12854,
+ 11424,
+ 11427, 2681, 7104,
+ 11445, 1809, 4876,
+ 11445, 10388,
+ 11449, 7908,
+ 11451, 90,
+ 11451, 7173, 5758,
+ 11452,
+ 11465, 11385, 8774,
+ 11475, 5238,
+ 11477, 436,
+ 11477, 5759, 4423, 9721, 1044,
+ 11477, 5759, 7282,
+ 11477, 5759, 8916,
+ 11477, 5759, 9824,
+ 11477, 5759, 9870,
+ 11477, 5759, 9904,
+ 11477, 5759, 11900,
+ 11477, 6379, 7908,
+ 11477, 6646,
+ 11477, 6689, 2170,
+ 11477, 6689, 2540,
+ 11477, 6689, 2778,
+ 11477, 6689, 4200,
+ 11477, 6689, 4214,
+ 11477, 6689, 5190,
+ 11477, 6689, 6260,
+ 11477, 6689, 6722,
+ 11477, 6689, 7508,
+ 11477, 6689, 7694,
+ 11477, 6875, 7908,
+ 11477, 7803, 5759, 8,
+ 11477, 7803, 5759, 16,
+ 11477, 7803, 5759, 28,
+ 11477, 7803, 5759, 40,
+ 11477, 7803, 5759, 58,
+ 11477, 7803, 5759, 72,
+ 11477, 7803, 5759, 92,
+ 11477, 7803, 5759, 266,
+ 11477, 7803, 5759, 606,
+ 11477, 7803, 5759, 7551, 8,
+ 11477, 7803, 5759, 7551, 28,
+ 11477, 7803, 5759, 8031, 8,
+ 11477, 7803, 5759, 8031, 28,
+ 11477, 7803, 5759, 9827, 22,
+ 11477, 7803, 5759, 9827, 34,
+ 11477, 7803, 5759, 9827, 344,
+ 11477, 7803, 5759, 9827, 518,
+ 11477, 8153, 6646,
+ 11477, 8405, 0,
+ 11477, 8405, 8,
+ 11477, 8405, 16,
+ 11477, 8405, 28,
+ 11477, 8405, 40,
+ 11477, 8405, 58,
+ 11477, 8405, 72,
+ 11477, 8405, 92,
+ 11477, 8405, 100,
+ 11477, 8405, 116,
+ 11477, 8405, 138,
+ 11477, 8405, 196,
+ 11477, 8405, 216,
+ 11477, 8405, 236,
+ 11477, 8405, 266,
+ 11477, 8405, 292,
+ 11477, 8405, 306,
+ 11477, 8405, 332,
+ 11477, 8405, 364,
+ 11477, 8405, 392,
+ 11477, 8405, 462,
+ 11477, 8405, 496,
+ 11477, 8405, 510,
+ 11477, 8405, 524,
+ 11477, 8405, 556,
+ 11477, 8405, 606,
+ 11477, 8405, 610,
+ 11477, 8405, 652,
+ 11477, 8405, 670,
+ 11477, 8405, 766,
+ 11477, 8405, 792,
+ 11477, 8405, 884,
+ 11477, 8405, 974,
+ 11477, 8405, 996,
+ 11477, 8405, 1250,
+ 11477, 8405, 1260,
+ 11477, 8405, 1512,
+ 11477, 8405, 1528,
+ 11477, 8405, 1612,
+ 11477, 8405, 1796,
+ 11477, 8405, 2030,
+ 11477, 8405, 2076,
+ 11477, 8405, 2126,
+ 11477, 8405, 2212,
+ 11477, 8405, 2410,
+ 11477, 8405, 2438,
+ 11477, 8405, 2516,
+ 11477, 8405, 2566,
+ 11477, 8405, 2678,
+ 11477, 8405, 2746,
+ 11477, 8405, 3110,
+ 11477, 8405, 4008,
+ 11477, 8405, 4016,
+ 11477, 8405, 4320,
+ 11477, 8405, 4748,
+ 11477, 8405, 4888,
+ 11477, 8405, 5234,
+ 11477, 8405, 5994,
+ 11477, 8405, 6658,
+ 11477, 8405, 7551, 0,
+ 11477, 8405, 7551, 8,
+ 11477, 8405, 7551, 28,
+ 11477, 8405, 8031, 0,
+ 11477, 8405, 8031, 8,
+ 11477, 8405, 8031, 28,
+ 11477, 8405, 9313, 5836,
+ 11477, 8405, 9827, 22,
+ 11477, 8405, 9827, 34,
+ 11477, 8405, 9827, 344,
+ 11477, 8405, 9827, 518,
+ 11477, 8755, 5759, 8892,
+ 11477, 8755, 5759, 9868,
+ 11477, 12391, 5758,
+ 11479, 9042,
+ 11605, 12492,
+ 11621, 568,
+ 11621, 6121, 4215, 4113, 6376,
+ 11641, 7593, 8405, 16,
+ 11641, 7593, 8405, 468,
+ 11641, 7593, 8405, 660,
+ 11641, 7593, 8405, 664,
+ 11641, 7593, 8405, 746,
+ 11641, 7593, 8405, 807, 3096,
+ 11641, 7593, 8405, 2176,
+ 11641, 7593, 8405, 2184,
+ 11641, 7593, 8405, 2516,
+ 11641, 7593, 8405, 2736,
+ 11641, 7593, 8405, 2808,
+ 11641, 7593, 8405, 3810,
+ 11641, 7593, 8405, 4198,
+ 11641, 7593, 8405, 4406,
+ 11641, 7593, 8405, 4626,
+ 11641, 7593, 8405, 4712,
+ 11641, 7593, 8405, 5718,
+ 11641, 7593, 8405, 6076,
+ 11641, 7593, 8405, 6188,
+ 11641, 7593, 8405, 6198,
+ 11641, 7593, 8405, 6200,
+ 11641, 7593, 8405, 6698,
+ 11641, 7593, 8405, 6710,
+ 11641, 7593, 8405, 6810,
+ 11641, 7593, 8405, 7210,
+ 11641, 7593, 8405, 7444,
+ 11641, 7593, 8405, 7590,
+ 11641, 7593, 8405, 7593, 3096,
+ 11641, 7593, 8405, 7593, 3097, 6121, 5878,
+ 11641, 7593, 8405, 7856,
+ 11641, 7593, 8405, 8050,
+ 11641, 7593, 8405, 8124,
+ 11641, 7593, 8405, 8606,
+ 11641, 7593, 8405, 8872,
+ 11641, 7593, 8405, 8958,
+ 11641, 7593, 8405, 9310,
+ 11641, 7593, 8405, 9363, 4626,
+ 11641, 7593, 8405, 9371, 807, 3096,
+ 11641, 7593, 8405, 9371, 7593, 3096,
+ 11641, 7593, 8405, 9372,
+ 11641, 7593, 8405, 9434,
+ 11641, 7593, 8405, 9486,
+ 11641, 7593, 8405, 9686,
+ 11641, 7593, 8405, 9727, 236,
+ 11641, 7593, 8405, 9850,
+ 11641, 7593, 8405, 10299, 9486,
+ 11641, 7593, 8405, 11867, 0,
+ 11641, 9063, 8405, 16,
+ 11641, 9063, 8405, 468,
+ 11641, 9063, 8405, 660,
+ 11641, 9063, 8405, 664,
+ 11641, 9063, 8405, 746,
+ 11641, 9063, 8405, 807, 3096,
+ 11641, 9063, 8405, 2176,
+ 11641, 9063, 8405, 2184,
+ 11641, 9063, 8405, 2516,
+ 11641, 9063, 8405, 2736,
+ 11641, 9063, 8405, 2808,
+ 11641, 9063, 8405, 3810,
+ 11641, 9063, 8405, 4198,
+ 11641, 9063, 8405, 4406,
+ 11641, 9063, 8405, 4626,
+ 11641, 9063, 8405, 4712,
+ 11641, 9063, 8405, 5718,
+ 11641, 9063, 8405, 6076,
+ 11641, 9063, 8405, 6188,
+ 11641, 9063, 8405, 6198,
+ 11641, 9063, 8405, 6200,
+ 11641, 9063, 8405, 6698,
+ 11641, 9063, 8405, 6710,
+ 11641, 9063, 8405, 6810,
+ 11641, 9063, 8405, 7210,
+ 11641, 9063, 8405, 7444,
+ 11641, 9063, 8405, 7590,
+ 11641, 9063, 8405, 7593, 3096,
+ 11641, 9063, 8405, 7593, 3097, 6121, 5878,
+ 11641, 9063, 8405, 7856,
+ 11641, 9063, 8405, 8050,
+ 11641, 9063, 8405, 8124,
+ 11641, 9063, 8405, 8606,
+ 11641, 9063, 8405, 8872,
+ 11641, 9063, 8405, 8958,
+ 11641, 9063, 8405, 9310,
+ 11641, 9063, 8405, 9363, 4626,
+ 11641, 9063, 8405, 9371, 807, 3096,
+ 11641, 9063, 8405, 9371, 7593, 3096,
+ 11641, 9063, 8405, 9372,
+ 11641, 9063, 8405, 9434,
+ 11641, 9063, 8405, 9486,
+ 11641, 9063, 8405, 9686,
+ 11641, 9063, 8405, 9727, 236,
+ 11641, 9063, 8405, 9850,
+ 11641, 9063, 8405, 10299, 9486,
+ 11641, 9063, 8405, 11867, 0,
+ 11646,
+ 11649, 760,
+ 11649, 4877, 10982,
+ 11649, 4923, 6121, 8759, 5758,
+ 11649, 5643, 8412,
+ 11649, 5643, 8414,
+ 11649, 5643, 8416,
+ 11649, 5643, 8418,
+ 11649, 6505, 9338,
+ 11649, 10154,
+ 11651, 8774,
+ 11661, 10256,
+ 11667, 5759, 761, 6376,
+ 11667, 5759, 1045, 6490,
+ 11667, 5759, 6548,
+ 11667, 5759, 8153, 5551, 6490,
+ 11667, 5759, 9824,
+ 11667, 5759, 9870,
+ 11667, 6689, 2170,
+ 11667, 6689, 2778,
+ 11667, 6689, 4214,
+ 11667, 6689, 7694,
+ 11667, 7803, 5759, 8,
+ 11667, 7803, 5759, 16,
+ 11667, 7803, 5759, 28,
+ 11667, 7803, 5759, 40,
+ 11667, 7803, 5759, 9827, 34,
+ 11667, 7803, 8399, 4926,
+ 11667, 8405, 0,
+ 11667, 8405, 100,
+ 11667, 8405, 116,
+ 11667, 8405, 138,
+ 11667, 8405, 216,
+ 11667, 8405, 236,
+ 11667, 8405, 292,
+ 11667, 8405, 306,
+ 11667, 8405, 332,
+ 11667, 8405, 364,
+ 11667, 8405, 392,
+ 11667, 8405, 462,
+ 11667, 8405, 510,
+ 11667, 8405, 524,
+ 11667, 8405, 556,
+ 11667, 8405, 610,
+ 11667, 8405, 652,
+ 11667, 8405, 670,
+ 11667, 8405, 792,
+ 11667, 8405, 884,
+ 11667, 8405, 974,
+ 11667, 8405, 996,
+ 11667, 8405, 1260,
+ 11667, 8405, 1612,
+ 11667, 8405, 1642,
+ 11667, 8405, 2076,
+ 11667, 8405, 2126,
+ 11667, 8405, 2212,
+ 11667, 8405, 2516,
+ 11667, 8405, 2566,
+ 11667, 8405, 2678,
+ 11667, 8405, 2746,
+ 11667, 8405, 4016,
+ 11667, 8405, 5994,
+ 11667, 8405, 7750,
+ 11667, 8525, 2171, 9344,
+ 11667, 8525, 2171, 10624,
+ 11667, 8525, 2670,
+ 11667, 8525, 8876,
+ 11667, 8916,
+ 11667, 12133, 1044,
+ 11667, 12133, 6646,
+ 11667, 12133, 7108,
+ 11667, 12133, 7114,
+ 11667, 12133, 7593, 8056,
+ 11667, 12133, 8056,
+ 11667, 12133, 8153, 6646,
+ 11667, 12133, 9965, 760,
+ 11667, 12133, 10318,
+ 11687, 8774,
+ 11700,
+ 11702,
+ 11725, 8153, 12132,
+ 11725, 8717, 12132,
+ 11727, 6129, 11228,
+ 11727, 8405, 238,
+ 11727, 8405, 468,
+ 11727, 8405, 710,
+ 11727, 8405, 714,
+ 11727, 8405, 788,
+ 11727, 8405, 1366,
+ 11727, 8405, 1578,
+ 11727, 8405, 1892,
+ 11727, 8405, 2110,
+ 11727, 8405, 2318,
+ 11727, 8405, 2658,
+ 11727, 8405, 2674,
+ 11727, 8405, 2916,
+ 11727, 8405, 3080,
+ 11727, 8405, 3126,
+ 11727, 8405, 4058,
+ 11727, 8405, 4238,
+ 11727, 8405, 4832,
+ 11727, 8405, 5568,
+ 11727, 8405, 5624,
+ 11727, 8405, 5652,
+ 11727, 8405, 5698,
+ 11727, 8525, 2170,
+ 11727, 8525, 2171, 9344,
+ 11727, 8525, 2670,
+ 11727, 8525, 8876,
+ 11731, 5758,
+ 11736,
+ 11740,
+ 11745, 10261, 10374,
+ 11747, 6741, 568,
+ 11749, 5758,
+ 11763, 731, 10763, 6434,
+ 11765, 2779, 8289, 6434,
+ 11765, 6105, 6434,
+ 11765, 6434,
+ 11765, 6435, 569, 760,
+ 11765, 6435, 569, 6505, 9158,
+ 11765, 6435, 4221, 760,
+ 11765, 6435, 4221, 761, 569, 6505, 9158,
+ 11765, 6435, 5387, 11097, 6434,
+ 11765, 6435, 6121, 2697, 9810,
+ 11765, 6435, 6121, 2697, 10958,
+ 11765, 6435, 6121, 4530,
+ 11765, 6435, 6121, 4896,
+ 11765, 6435, 6121, 5445, 6490,
+ 11765, 6435, 6121, 5878,
+ 11765, 6435, 6121, 5879, 6121, 8153, 10677, 8758,
+ 11765, 6435, 6121, 5879, 6121, 10677, 8758,
+ 11765, 6435, 6121, 8077, 10958,
+ 11765, 6435, 6121, 8151, 5832,
+ 11765, 6435, 6121, 8153, 10677, 8758,
+ 11765, 6435, 6121, 8758,
+ 11765, 6435, 6121, 10677, 8758,
+ 11765, 6435, 6377, 7551, 11097, 6434,
+ 11765, 6435, 6377, 7709, 10374,
+ 11765, 6435, 6377, 7919, 6741, 568,
+ 11765, 6435, 6377, 9633, 7709, 10374,
+ 11765, 6435, 6377, 9633, 7919, 6741, 568,
+ 11765, 6435, 9785, 46,
+ 11765, 6435, 9785, 10578,
+ 11765, 6435, 9785, 12472,
+ 11765, 7821, 6434,
+ 11765, 7821, 6435, 4221, 6102,
+ 11765, 8097, 6434,
+ 11765, 8153, 3993, 6434,
+ 11765, 8153, 6434,
+ 11765, 8153, 6435, 4221, 760,
+ 11765, 8153, 6435, 6121, 8758,
+ 11765, 8153, 6435, 6121, 10677, 8758,
+ 11765, 8153, 11430,
+ 11765, 8561, 7944,
+ 11765, 8849, 3993, 6434,
+ 11765, 8849, 6434,
+ 11765, 9327, 5387, 11097, 9326,
+ 11765, 9327, 6121, 3713, 601, 569, 760,
+ 11765, 9327, 6121, 3713, 601, 4221, 760,
+ 11765, 9327, 6121, 3713, 601, 6377, 4895, 3992,
+ 11765, 9327, 6121, 3713, 601, 6377, 11097, 9327, 6121, 3713, 600,
+ 11765, 9327, 6121, 3713, 601, 6377, 11765, 9327, 6121, 3713, 4116,
+ 11765, 9327, 6121, 3713, 4117, 569, 760,
+ 11765, 9327, 6121, 3713, 4117, 4221, 760,
+ 11765, 9327, 6121, 3713, 4117, 6377, 11097, 9327, 6121, 3713, 4116,
+ 11765, 9327, 6121, 3713, 4117, 6491, 4895, 3992,
+ 11765, 9327, 6121, 3713, 9810,
+ 11765, 9327, 6121, 3713, 10958,
+ 11765, 10531, 6434,
+ 11765, 11191, 6434,
+ 11765, 11430,
+ 11765, 11875, 6435, 4221, 760,
+ 11765, 11875, 6435, 6121, 5878,
+ 11765, 11875, 6435, 6121, 5879, 6121, 8153, 10677, 8758,
+ 11765, 11875, 6435, 6121, 5879, 6121, 10677, 8758,
+ 11765, 11875, 6435, 6121, 8153, 10677, 8758,
+ 11765, 11875, 6435, 6121, 10677, 8758,
+ 11765, 11875, 8849, 3993, 6434,
+ 11765, 12103, 6434,
+ 11769, 5759, 8916,
+ 11769, 5759, 9824,
+ 11769, 5759, 9870,
+ 11769, 6646,
+ 11769, 6689, 2170,
+ 11769, 6689, 2540,
+ 11769, 6689, 2778,
+ 11769, 6689, 4200,
+ 11769, 6689, 4214,
+ 11769, 6689, 5190,
+ 11769, 6689, 6260,
+ 11769, 6689, 6722,
+ 11769, 6689, 7508,
+ 11769, 6689, 7694,
+ 11769, 7803, 5759, 8,
+ 11769, 7803, 5759, 16,
+ 11769, 7803, 5759, 28,
+ 11769, 7803, 5759, 40,
+ 11769, 7803, 5759, 58,
+ 11769, 7803, 5759, 72,
+ 11769, 7803, 5759, 92,
+ 11769, 7803, 5759, 162,
+ 11769, 7803, 5759, 266,
+ 11769, 7803, 5759, 440,
+ 11769, 7803, 5759, 606,
+ 11769, 7803, 5759, 9827, 22,
+ 11769, 7803, 5759, 9827, 34,
+ 11769, 7803, 5759, 9827, 344,
+ 11769, 7803, 5759, 9827, 518,
+ 11769, 8153, 6646,
+ 11769, 8405, 0,
+ 11769, 8405, 8,
+ 11769, 8405, 16,
+ 11769, 8405, 28,
+ 11769, 8405, 40,
+ 11769, 8405, 58,
+ 11769, 8405, 72,
+ 11769, 8405, 92,
+ 11769, 8405, 100,
+ 11769, 8405, 116,
+ 11769, 8405, 138,
+ 11769, 8405, 162,
+ 11769, 8405, 216,
+ 11769, 8405, 236,
+ 11769, 8405, 266,
+ 11769, 8405, 292,
+ 11769, 8405, 306,
+ 11769, 8405, 332,
+ 11769, 8405, 364,
+ 11769, 8405, 392,
+ 11769, 8405, 440,
+ 11769, 8405, 462,
+ 11769, 8405, 510,
+ 11769, 8405, 524,
+ 11769, 8405, 556,
+ 11769, 8405, 606,
+ 11769, 8405, 610,
+ 11769, 8405, 652,
+ 11769, 8405, 792,
+ 11769, 8405, 884,
+ 11769, 8405, 974,
+ 11769, 8405, 996,
+ 11769, 8405, 1260,
+ 11769, 8405, 1512,
+ 11769, 8405, 1612,
+ 11769, 8405, 1796,
+ 11769, 8405, 2030,
+ 11769, 8405, 2076,
+ 11769, 8405, 2126,
+ 11769, 8405, 2212,
+ 11769, 8405, 2516,
+ 11769, 8405, 2566,
+ 11769, 8405, 2678,
+ 11769, 8405, 2746,
+ 11769, 8405, 4016,
+ 11769, 8405, 5994,
+ 11769, 8405, 9827, 22,
+ 11769, 8405, 9827, 34,
+ 11769, 8405, 9827, 344,
+ 11769, 8405, 9827, 518,
+ 11769, 10775, 5759, 6888,
+ 11793, 9611, 6121, 8005, 8064,
+ 11801, 5385, 826,
+ 11819, 7608,
+ 11859, 8022,
+ 11881, 8774,
+ 11893, 1611, 8774,
+ 11899, 10513, 7821, 11765, 6434,
+ 11905, 10212,
+ 11909, 8774,
+ 11910,
+ 11921, 568,
+ 11922,
+ 11924,
+ 12007, 6741, 569, 445, 11098,
+ 12007, 6741, 569, 445, 12472,
+ 12007, 9705, 6741, 569, 445, 11098,
+ 12007, 9705, 6741, 569, 445, 12472,
+ 12007, 9705, 11099, 445, 6741, 568,
+ 12007, 9705, 12473, 445, 6741, 568,
+ 12015, 568,
+ 12017, 4926,
+ 12017, 10469, 4926,
+ 12021, 7608,
+ 12041, 7382,
+ 12043, 4223, 5836,
+ 12043, 4389, 4193, 7608,
+ 12043, 6616,
+ 12043, 7097, 5965, 4926,
+ 12043, 7608,
+ 12043, 8525, 6260,
+ 12043, 8649, 5965, 4926,
+ 12043, 9099, 4926,
+ 12043, 10161, 5965, 4926,
+ 12043, 10799, 5965, 4926,
+ 12043, 11067, 4926,
+ 12043, 11353, 4877, 4183, 11229, 8774,
+ 12043, 11353, 8775, 1177, 973, 2170,
+ 12043, 11353, 8775, 1177, 973, 2540,
+ 12043, 11353, 8775, 1177, 973, 2670,
+ 12043, 11353, 8775, 1177, 973, 2778,
+ 12043, 11353, 8775, 1177, 973, 4200,
+ 12043, 11353, 8775, 1177, 973, 4214,
+ 12043, 11353, 8775, 1177, 973, 5190,
+ 12043, 11353, 8775, 1177, 973, 6722,
+ 12043, 11353, 8775, 1177, 973, 7508,
+ 12043, 11353, 8775, 1177, 973, 7694,
+ 12043, 11353, 8775, 1177, 973, 8162,
+ 12043, 11353, 8775, 1177, 973, 8820,
+ 12043, 11353, 8775, 1177, 973, 8874,
+ 12043, 11353, 8775, 1177, 973, 8876,
+ 12043, 11353, 8775, 1177, 973, 9286,
+ 12043, 11353, 8775, 1177, 973, 9700,
+ 12043, 11353, 8775, 1177, 973, 10150,
+ 12043, 11353, 8775, 1177, 973, 10200,
+ 12043, 11353, 8775, 1177, 973, 10360,
+ 12043, 11353, 8775, 1177, 973, 10622,
+ 12043, 11353, 8775, 1177, 973, 11232,
+ 12043, 11353, 8775, 1177, 973, 11854,
+ 12043, 11353, 8775, 1177, 973, 11868,
+ 12043, 11353, 8775, 1177, 973, 11870,
+ 12043, 11353, 8775, 1177, 973, 11872,
+ 12043, 11353, 8775, 1177, 973, 12374,
+ 12043, 11353, 8775, 1177, 973, 12376,
+ 12043, 11353, 8775, 1177, 973, 12378,
+ 12043, 11353, 8775, 1177, 973, 12888,
+ 12043, 11353, 8775, 1177, 973, 12890,
+ 12043, 11353, 8775, 1177, 973, 12892,
+ 12043, 11353, 8775, 1177, 1870,
+ 12043, 11353, 8775, 1177, 4541, 2170,
+ 12043, 11353, 8775, 1177, 4541, 2540,
+ 12043, 11353, 8775, 1177, 4541, 2670,
+ 12043, 11353, 8775, 1177, 4541, 2778,
+ 12043, 11353, 8775, 1177, 4541, 4200,
+ 12043, 11353, 8775, 1177, 4541, 4214,
+ 12043, 11353, 8775, 1177, 4541, 5190,
+ 12043, 11353, 8775, 1177, 4541, 6260,
+ 12043, 11353, 8775, 1177, 4541, 6722,
+ 12043, 11353, 8775, 1177, 4541, 7508,
+ 12043, 11353, 8775, 1177, 4541, 7694,
+ 12043, 11353, 8775, 1177, 4541, 8162,
+ 12043, 11353, 8775, 1177, 4541, 8874,
+ 12043, 11353, 8775, 1177, 4541, 8876,
+ 12043, 11353, 8775, 1177, 4541, 9286,
+ 12043, 11353, 8775, 1177, 4541, 9700,
+ 12043, 11353, 8775, 1177, 4541, 10150,
+ 12043, 11353, 8775, 1177, 4541, 10200,
+ 12043, 11353, 8775, 1177, 4541, 10360,
+ 12043, 11353, 8775, 1177, 4541, 10622,
+ 12043, 11353, 8775, 1177, 4541, 11232,
+ 12043, 11353, 8775, 1177, 4541, 11868,
+ 12043, 11353, 8775, 1177, 4541, 11872,
+ 12043, 11353, 8775, 1177, 4541, 12376,
+ 12043, 11353, 8775, 1177, 4541, 12892,
+ 12043, 11353, 8775, 1177, 4682,
+ 12043, 11353, 8775, 1177, 4684,
+ 12043, 11353, 8775, 1177, 6420,
+ 12043, 11353, 8775, 1177, 7136,
+ 12043, 11353, 8775, 1177, 7958,
+ 12043, 11353, 8775, 1177, 9374,
+ 12043, 11353, 8775, 1177, 9528,
+ 12043, 11353, 8775, 1177, 9990,
+ 12043, 11353, 8775, 1177, 10176,
+ 12043, 11353, 8775, 1177, 10368,
+ 12043, 11353, 8775, 1177, 11230,
+ 12043, 11391, 11054,
+ 12043, 11415, 1861, 4926,
+ 12043, 11415, 2171, 4926,
+ 12043, 11415, 2725, 4926,
+ 12043, 11415, 2779, 4926,
+ 12043, 11415, 4215, 4926,
+ 12043, 11415, 6717, 4926,
+ 12043, 11415, 6791, 4926,
+ 12043, 11415, 7687, 4926,
+ 12043, 11415, 7695, 4926,
+ 12043, 11415, 8005, 4926,
+ 12043, 11415, 8233, 4926,
+ 12043, 11415, 8291, 4926,
+ 12043, 11415, 8473, 4926,
+ 12043, 11415, 8681, 4926,
+ 12043, 11415, 9433, 4926,
+ 12043, 11415, 9633, 4926,
+ 12043, 11937, 10759, 4223, 10580,
+ 12043, 11937, 10759, 4849, 569, 7442,
+ 12043, 11937, 10759, 4849, 569, 8473, 721, 7442,
+ 12043, 11937, 10759, 6377, 569, 6490,
+ 12043, 11937, 10759, 6377, 569, 8473, 721, 6490,
+ 12043, 11937, 10759, 10386,
+ 12043, 11937, 10759, 10581, 4221, 4848,
+ 12043, 11937, 10759, 10581, 4221, 6376,
+ 12043, 11937, 10759, 10581, 4221, 6490,
+ 12043, 11937, 10759, 10581, 4221, 7121, 4848,
+ 12043, 11937, 10759, 10581, 4221, 7773, 4848,
+ 12043, 11937, 10759, 10581, 4221, 7773, 7442,
+ 12055, 8724,
+ 12058,
+ 12061, 11415, 7922,
+ 12061, 11415, 11228,
+ 12061, 11415, 11850,
+ 12063, 8197, 721, 4923, 5758,
+ 12064,
+ 12075, 7821, 11765, 6434,
+ 12108,
+ 12117, 5758,
+ 12122,
+ 12133, 7608,
+ 12135, 5758,
+ 12143, 10758,
+ 12156,
+ 12342,
+ 12355, 2170,
+ 12355, 2540,
+ 12355, 2778,
+ 12355, 4200,
+ 12355, 4214,
+ 12355, 4849, 12114,
+ 12355, 5190,
+ 12355, 5445, 5758,
+ 12355, 6260,
+ 12355, 6722,
+ 12355, 7089, 7593, 8405, 16,
+ 12355, 7089, 7593, 8405, 26,
+ 12355, 7172,
+ 12355, 7443, 12114,
+ 12355, 7508,
+ 12355, 7694,
+ 12355, 8167, 5758,
+ 12371, 12492,
+ 12383, 10643, 6121, 4849, 4389, 6504,
+ 12383, 10643, 6121, 7443, 4389, 6504,
+ 12396,
+ 12399, 445, 10780,
+ 12403, 2209, 2671, 10625, 5758,
+ 12403, 2209, 7171, 5758,
+ 12403, 3961, 5566,
+ 12403, 6689, 2170,
+ 12403, 6689, 2540,
+ 12403, 6689, 2778,
+ 12403, 6689, 4200,
+ 12403, 6689, 4214,
+ 12403, 6689, 5190,
+ 12403, 6689, 6260,
+ 12403, 6689, 6722,
+ 12403, 6689, 7508,
+ 12403, 6689, 7694,
+ 12403, 8233, 5566,
+ 12413, 9063, 4,
+ 12413, 9063, 14,
+ 12413, 9063, 16,
+ 12413, 9063, 34,
+ 12413, 9063, 50,
+ 12428,
+ 12461, 10346,
+ 12463, 6505, 8056,
+ 12463, 6505, 8744,
+ 12463, 6505, 9158,
+ 12463, 7821, 8056,
+ 12463, 7821, 8744,
+ 12463, 7821, 9158,
+ 12464,
+ 12467, 10513, 7821, 11765, 6434,
+ 12473, 445, 6741, 568,
+ 12473, 445, 9705, 6741, 568,
+ 12473, 445, 9705, 6741, 569, 6121, 1045, 6376,
+ 12473, 445, 9705, 6741, 569, 6121, 1045, 6377, 4848,
+ 12473, 445, 9705, 6741, 569, 6121, 1045, 8318,
+ 12473, 445, 11098,
+ 12473, 445, 11621, 568,
+ 12473, 445, 11896,
+ 12473, 721, 2091, 11896,
+ 12473, 721, 12345, 2091, 6741, 568,
+ 12473, 835, 2091, 6741, 568,
+ 12473, 835, 2091, 11621, 568,
+ 12473, 5387, 6741, 568,
+ 12473, 5758,
+ 12473, 6121, 1044,
+ 12473, 6121, 8057, 8318,
+ 12473, 6121, 10469, 4927, 6376,
+ 12473, 6377, 9693, 445, 6740,
+ 12473, 6377, 9693, 6377, 11098,
+ 12473, 6377, 9705, 6741, 6377, 11099, 6377, 9705, 6740,
+ 12473, 6377, 11099, 6377, 12007, 6740,
+ 12473, 6377, 11765, 6434,
+ 12473, 6377, 12007, 6741, 6377, 11098,
+ 12473, 6741, 569, 445, 11098,
+ 12473, 7991, 11098,
+ 12473, 8065, 115, 6628,
+ 12473, 8065, 115, 6629, 6377, 9705, 6740,
+ 12473, 12105, 11098,
+ 12478,
+ 12480,
+ 12492,
+ 12493, 6121, 1044,
+ 12493, 6121, 9437, 720,
+ 12493, 6121, 9546,
+ 12493, 6377, 761, 6377, 7768,
+ 12493, 6377, 7768,
+ 12493, 7991, 721, 8329, 6121, 12492,
+ 12505, 3803, 477, 8774,
+ 12505, 3803, 2217, 8774,
+ 12505, 3803, 2413, 8774,
+ 12505, 3803, 6689, 2170,
+ 12505, 3803, 6689, 2540,
+ 12505, 3803, 6689, 2778,
+ 12505, 3803, 6689, 4200,
+ 12505, 3803, 6689, 4214,
+ 12505, 3803, 6689, 5190,
+ 12505, 3803, 6689, 6260,
+ 12505, 3803, 6689, 6722,
+ 12505, 3803, 6689, 7508,
+ 12505, 3803, 6689, 7694,
+ 12505, 3803, 7023, 8774,
+ 12505, 3803, 7202,
+ 12505, 3803, 7593, 0,
+ 12505, 3803, 7593, 2,
+ 12505, 3803, 7593, 4,
+ 12505, 3803, 7593, 6,
+ 12505, 3803, 7593, 8,
+ 12505, 3803, 7593, 10,
+ 12505, 3803, 7593, 12,
+ 12505, 3803, 7593, 14,
+ 12505, 3803, 7593, 16,
+ 12505, 3803, 7593, 18,
+ 12505, 3803, 7593, 20,
+ 12505, 3803, 7593, 22,
+ 12505, 3803, 7593, 24,
+ 12505, 3803, 7593, 26,
+ 12505, 3803, 7593, 28,
+ 12505, 3803, 7593, 30,
+ 12505, 3803, 7593, 32,
+ 12505, 3803, 7593, 34,
+ 12505, 3803, 7593, 36,
+ 12505, 3803, 7593, 38,
+ 12505, 3803, 7593, 40,
+ 12505, 3803, 7593, 42,
+ 12505, 3803, 7593, 44,
+ 12505, 3803, 7593, 46,
+ 12505, 3803, 7593, 48,
+ 12505, 3803, 7593, 50,
+ 12505, 3803, 7593, 384,
+ 12505, 3803, 7593, 416,
+ 12505, 3803, 7593, 476,
+ 12505, 3803, 7593, 644,
+ 12505, 3803, 7593, 888,
+ 12505, 3803, 7593, 1128,
+ 12505, 3803, 7593, 2216,
+ 12505, 3803, 7593, 2250,
+ 12505, 3803, 7593, 2412,
+ 12505, 3803, 7593, 2658,
+ 12505, 3803, 7593, 3774,
+ 12505, 3803, 7593, 4614,
+ 12505, 3803, 7593, 6262,
+ 12505, 3803, 7593, 6406,
+ 12505, 3803, 7593, 6674,
+ 12505, 3803, 7593, 6789, 7568,
+ 12505, 3803, 7593, 6824,
+ 12505, 3803, 7593, 7022,
+ 12505, 3803, 7593, 7080,
+ 12505, 3803, 7593, 7316,
+ 12505, 3803, 7593, 7568,
+ 12505, 3803, 7593, 7682,
+ 12505, 3803, 7593, 9162,
+ 12505, 3803, 7593, 9270,
+ 12505, 3803, 7593, 9530,
+ 12505, 3803, 7593, 9808,
+ 12505, 3803, 7683, 8774,
+ 12505, 3803, 8325, 477, 8774,
+ 12505, 3803, 8325, 2217, 8774,
+ 12505, 3803, 8325, 2413, 8774,
+ 12505, 3803, 8325, 7023, 8774,
+ 12505, 3803, 8325, 7202,
+ 12505, 3803, 8325, 7593, 0,
+ 12505, 3803, 8325, 7593, 2,
+ 12505, 3803, 8325, 7593, 4,
+ 12505, 3803, 8325, 7593, 6,
+ 12505, 3803, 8325, 7593, 8,
+ 12505, 3803, 8325, 7593, 10,
+ 12505, 3803, 8325, 7593, 12,
+ 12505, 3803, 8325, 7593, 14,
+ 12505, 3803, 8325, 7593, 16,
+ 12505, 3803, 8325, 7593, 18,
+ 12505, 3803, 8325, 7593, 20,
+ 12505, 3803, 8325, 7593, 22,
+ 12505, 3803, 8325, 7593, 24,
+ 12505, 3803, 8325, 7593, 26,
+ 12505, 3803, 8325, 7593, 28,
+ 12505, 3803, 8325, 7593, 30,
+ 12505, 3803, 8325, 7593, 32,
+ 12505, 3803, 8325, 7593, 34,
+ 12505, 3803, 8325, 7593, 36,
+ 12505, 3803, 8325, 7593, 38,
+ 12505, 3803, 8325, 7593, 40,
+ 12505, 3803, 8325, 7593, 42,
+ 12505, 3803, 8325, 7593, 44,
+ 12505, 3803, 8325, 7593, 46,
+ 12505, 3803, 8325, 7593, 48,
+ 12505, 3803, 8325, 7593, 50,
+ 12505, 3803, 8325, 7593, 384,
+ 12505, 3803, 8325, 7593, 416,
+ 12505, 3803, 8325, 7593, 476,
+ 12505, 3803, 8325, 7593, 644,
+ 12505, 3803, 8325, 7593, 888,
+ 12505, 3803, 8325, 7593, 1128,
+ 12505, 3803, 8325, 7593, 2216,
+ 12505, 3803, 8325, 7593, 2250,
+ 12505, 3803, 8325, 7593, 2412,
+ 12505, 3803, 8325, 7593, 2658,
+ 12505, 3803, 8325, 7593, 3774,
+ 12505, 3803, 8325, 7593, 4614,
+ 12505, 3803, 8325, 7593, 6262,
+ 12505, 3803, 8325, 7593, 6406,
+ 12505, 3803, 8325, 7593, 6674,
+ 12505, 3803, 8325, 7593, 6789, 7568,
+ 12505, 3803, 8325, 7593, 6824,
+ 12505, 3803, 8325, 7593, 7022,
+ 12505, 3803, 8325, 7593, 7080,
+ 12505, 3803, 8325, 7593, 7316,
+ 12505, 3803, 8325, 7593, 7568,
+ 12505, 3803, 8325, 7593, 7682,
+ 12505, 3803, 8325, 7593, 9270,
+ 12505, 3803, 8325, 7593, 9530,
+ 12505, 3803, 8325, 7593, 9808,
+ 12505, 3803, 8325, 7683, 8774,
+ 12505, 3803, 8325, 9063, 0,
+ 12505, 3803, 8325, 9063, 2,
+ 12505, 3803, 8325, 9063, 4,
+ 12505, 3803, 8325, 9063, 6,
+ 12505, 3803, 8325, 9063, 8,
+ 12505, 3803, 8325, 9063, 10,
+ 12505, 3803, 8325, 9063, 12,
+ 12505, 3803, 8325, 9063, 14,
+ 12505, 3803, 8325, 9063, 16,
+ 12505, 3803, 8325, 9063, 18,
+ 12505, 3803, 8325, 9063, 20,
+ 12505, 3803, 8325, 9063, 22,
+ 12505, 3803, 8325, 9063, 24,
+ 12505, 3803, 8325, 9063, 26,
+ 12505, 3803, 8325, 9063, 28,
+ 12505, 3803, 8325, 9063, 30,
+ 12505, 3803, 8325, 9063, 32,
+ 12505, 3803, 8325, 9063, 34,
+ 12505, 3803, 8325, 9063, 36,
+ 12505, 3803, 8325, 9063, 38,
+ 12505, 3803, 8325, 9063, 40,
+ 12505, 3803, 8325, 9063, 42,
+ 12505, 3803, 8325, 9063, 44,
+ 12505, 3803, 8325, 9063, 46,
+ 12505, 3803, 8325, 9063, 48,
+ 12505, 3803, 8325, 9063, 50,
+ 12505, 3803, 8325, 9063, 384,
+ 12505, 3803, 8325, 9063, 416,
+ 12505, 3803, 8325, 9063, 476,
+ 12505, 3803, 8325, 9063, 644,
+ 12505, 3803, 8325, 9063, 888,
+ 12505, 3803, 8325, 9063, 1128,
+ 12505, 3803, 8325, 9063, 2216,
+ 12505, 3803, 8325, 9063, 2250,
+ 12505, 3803, 8325, 9063, 2412,
+ 12505, 3803, 8325, 9063, 2658,
+ 12505, 3803, 8325, 9063, 3774,
+ 12505, 3803, 8325, 9063, 4614,
+ 12505, 3803, 8325, 9063, 6262,
+ 12505, 3803, 8325, 9063, 6406,
+ 12505, 3803, 8325, 9063, 6674,
+ 12505, 3803, 8325, 9063, 6824,
+ 12505, 3803, 8325, 9063, 7022,
+ 12505, 3803, 8325, 9063, 7080,
+ 12505, 3803, 8325, 9063, 7316,
+ 12505, 3803, 8325, 9063, 7568,
+ 12505, 3803, 8325, 9063, 7682,
+ 12505, 3803, 8325, 9063, 7683, 8774,
+ 12505, 3803, 8325, 9063, 9270,
+ 12505, 3803, 8325, 9063, 9530,
+ 12505, 3803, 8325, 9063, 9808,
+ 12505, 3803, 8325, 9271, 8774,
+ 12505, 3803, 8325, 9573, 12432,
+ 12505, 3803, 8679, 7593, 0,
+ 12505, 3803, 8679, 7593, 2,
+ 12505, 3803, 8679, 7593, 4,
+ 12505, 3803, 8679, 7593, 6,
+ 12505, 3803, 8679, 7593, 8,
+ 12505, 3803, 8679, 7593, 10,
+ 12505, 3803, 8679, 7593, 12,
+ 12505, 3803, 8679, 7593, 14,
+ 12505, 3803, 8679, 7593, 16,
+ 12505, 3803, 8679, 7593, 18,
+ 12505, 3803, 8679, 7593, 20,
+ 12505, 3803, 8679, 7593, 22,
+ 12505, 3803, 8679, 7593, 24,
+ 12505, 3803, 8679, 7593, 26,
+ 12505, 3803, 8679, 7593, 28,
+ 12505, 3803, 8679, 7593, 30,
+ 12505, 3803, 8679, 7593, 32,
+ 12505, 3803, 8679, 7593, 34,
+ 12505, 3803, 8679, 7593, 36,
+ 12505, 3803, 8679, 7593, 38,
+ 12505, 3803, 8679, 7593, 40,
+ 12505, 3803, 8679, 7593, 42,
+ 12505, 3803, 8679, 7593, 44,
+ 12505, 3803, 8679, 7593, 46,
+ 12505, 3803, 8679, 7593, 48,
+ 12505, 3803, 8679, 7593, 50,
+ 12505, 3803, 8679, 9063, 0,
+ 12505, 3803, 8679, 9063, 2,
+ 12505, 3803, 8679, 9063, 4,
+ 12505, 3803, 8679, 9063, 6,
+ 12505, 3803, 8679, 9063, 8,
+ 12505, 3803, 8679, 9063, 10,
+ 12505, 3803, 8679, 9063, 12,
+ 12505, 3803, 8679, 9063, 14,
+ 12505, 3803, 8679, 9063, 16,
+ 12505, 3803, 8679, 9063, 18,
+ 12505, 3803, 8679, 9063, 20,
+ 12505, 3803, 8679, 9063, 22,
+ 12505, 3803, 8679, 9063, 24,
+ 12505, 3803, 8679, 9063, 26,
+ 12505, 3803, 8679, 9063, 28,
+ 12505, 3803, 8679, 9063, 30,
+ 12505, 3803, 8679, 9063, 32,
+ 12505, 3803, 8679, 9063, 34,
+ 12505, 3803, 8679, 9063, 36,
+ 12505, 3803, 8679, 9063, 38,
+ 12505, 3803, 8679, 9063, 40,
+ 12505, 3803, 8679, 9063, 42,
+ 12505, 3803, 8679, 9063, 44,
+ 12505, 3803, 8679, 9063, 46,
+ 12505, 3803, 8679, 9063, 48,
+ 12505, 3803, 8679, 9063, 50,
+ 12505, 3803, 9063, 0,
+ 12505, 3803, 9063, 2,
+ 12505, 3803, 9063, 4,
+ 12505, 3803, 9063, 6,
+ 12505, 3803, 9063, 8,
+ 12505, 3803, 9063, 10,
+ 12505, 3803, 9063, 12,
+ 12505, 3803, 9063, 14,
+ 12505, 3803, 9063, 16,
+ 12505, 3803, 9063, 18,
+ 12505, 3803, 9063, 20,
+ 12505, 3803, 9063, 22,
+ 12505, 3803, 9063, 24,
+ 12505, 3803, 9063, 26,
+ 12505, 3803, 9063, 28,
+ 12505, 3803, 9063, 30,
+ 12505, 3803, 9063, 32,
+ 12505, 3803, 9063, 34,
+ 12505, 3803, 9063, 36,
+ 12505, 3803, 9063, 38,
+ 12505, 3803, 9063, 40,
+ 12505, 3803, 9063, 42,
+ 12505, 3803, 9063, 44,
+ 12505, 3803, 9063, 46,
+ 12505, 3803, 9063, 48,
+ 12505, 3803, 9063, 50,
+ 12505, 3803, 9063, 384,
+ 12505, 3803, 9063, 416,
+ 12505, 3803, 9063, 476,
+ 12505, 3803, 9063, 644,
+ 12505, 3803, 9063, 888,
+ 12505, 3803, 9063, 1128,
+ 12505, 3803, 9063, 2216,
+ 12505, 3803, 9063, 2250,
+ 12505, 3803, 9063, 2412,
+ 12505, 3803, 9063, 2658,
+ 12505, 3803, 9063, 3774,
+ 12505, 3803, 9063, 4614,
+ 12505, 3803, 9063, 6262,
+ 12505, 3803, 9063, 6406,
+ 12505, 3803, 9063, 6674,
+ 12505, 3803, 9063, 6824,
+ 12505, 3803, 9063, 7022,
+ 12505, 3803, 9063, 7080,
+ 12505, 3803, 9063, 7316,
+ 12505, 3803, 9063, 7568,
+ 12505, 3803, 9063, 7682,
+ 12505, 3803, 9063, 7683, 8774,
+ 12505, 3803, 9063, 9162,
+ 12505, 3803, 9063, 9270,
+ 12505, 3803, 9063, 9530,
+ 12505, 3803, 9063, 9808,
+ 12505, 3803, 9271, 8774,
+ 12505, 3803, 9295, 7593, 0,
+ 12505, 3803, 9295, 7593, 2,
+ 12505, 3803, 9295, 7593, 4,
+ 12505, 3803, 9295, 7593, 6,
+ 12505, 3803, 9295, 7593, 8,
+ 12505, 3803, 9295, 7593, 10,
+ 12505, 3803, 9295, 7593, 12,
+ 12505, 3803, 9295, 7593, 14,
+ 12505, 3803, 9295, 7593, 16,
+ 12505, 3803, 9295, 7593, 18,
+ 12505, 3803, 9295, 7593, 20,
+ 12505, 3803, 9295, 7593, 22,
+ 12505, 3803, 9295, 7593, 24,
+ 12505, 3803, 9295, 7593, 26,
+ 12505, 3803, 9295, 7593, 28,
+ 12505, 3803, 9295, 7593, 30,
+ 12505, 3803, 9295, 7593, 32,
+ 12505, 3803, 9295, 7593, 34,
+ 12505, 3803, 9295, 7593, 36,
+ 12505, 3803, 9295, 7593, 38,
+ 12505, 3803, 9295, 7593, 40,
+ 12505, 3803, 9295, 7593, 42,
+ 12505, 3803, 9295, 7593, 44,
+ 12505, 3803, 9295, 7593, 46,
+ 12505, 3803, 9295, 7593, 48,
+ 12505, 3803, 9295, 7593, 50,
+ 12505, 3803, 9295, 9063, 0,
+ 12505, 3803, 9295, 9063, 2,
+ 12505, 3803, 9295, 9063, 4,
+ 12505, 3803, 9295, 9063, 6,
+ 12505, 3803, 9295, 9063, 8,
+ 12505, 3803, 9295, 9063, 10,
+ 12505, 3803, 9295, 9063, 12,
+ 12505, 3803, 9295, 9063, 14,
+ 12505, 3803, 9295, 9063, 16,
+ 12505, 3803, 9295, 9063, 18,
+ 12505, 3803, 9295, 9063, 20,
+ 12505, 3803, 9295, 9063, 22,
+ 12505, 3803, 9295, 9063, 24,
+ 12505, 3803, 9295, 9063, 26,
+ 12505, 3803, 9295, 9063, 28,
+ 12505, 3803, 9295, 9063, 30,
+ 12505, 3803, 9295, 9063, 32,
+ 12505, 3803, 9295, 9063, 34,
+ 12505, 3803, 9295, 9063, 36,
+ 12505, 3803, 9295, 9063, 38,
+ 12505, 3803, 9295, 9063, 40,
+ 12505, 3803, 9295, 9063, 42,
+ 12505, 3803, 9295, 9063, 44,
+ 12505, 3803, 9295, 9063, 46,
+ 12505, 3803, 9295, 9063, 48,
+ 12505, 3803, 9295, 9063, 50,
+ 12505, 3803, 9573, 12432,
+ 12505, 4849, 6409, 9050,
+ 12505, 4849, 7821, 8745, 9050,
+ 12505, 4849, 7821, 10637, 7533, 9050,
+ 12505, 4849, 8153, 6409, 9050,
+ 12505, 4849, 10997, 12114,
+ 12505, 7443, 6409, 9050,
+ 12505, 7443, 7821, 8745, 9050,
+ 12505, 7443, 7821, 10637, 7533, 9050,
+ 12505, 7443, 8153, 6409, 9050,
+ 12505, 7443, 10997, 12114,
+ 12505, 8325, 477, 8774,
+ 12505, 8325, 2217, 8774,
+ 12505, 8325, 2413, 8774,
+ 12505, 8325, 7023, 8774,
+ 12505, 8325, 7202,
+ 12505, 8325, 7593, 0,
+ 12505, 8325, 7593, 2,
+ 12505, 8325, 7593, 4,
+ 12505, 8325, 7593, 6,
+ 12505, 8325, 7593, 8,
+ 12505, 8325, 7593, 10,
+ 12505, 8325, 7593, 12,
+ 12505, 8325, 7593, 16,
+ 12505, 8325, 7593, 18,
+ 12505, 8325, 7593, 20,
+ 12505, 8325, 7593, 22,
+ 12505, 8325, 7593, 24,
+ 12505, 8325, 7593, 26,
+ 12505, 8325, 7593, 28,
+ 12505, 8325, 7593, 30,
+ 12505, 8325, 7593, 32,
+ 12505, 8325, 7593, 34,
+ 12505, 8325, 7593, 36,
+ 12505, 8325, 7593, 38,
+ 12505, 8325, 7593, 40,
+ 12505, 8325, 7593, 42,
+ 12505, 8325, 7593, 44,
+ 12505, 8325, 7593, 46,
+ 12505, 8325, 7593, 48,
+ 12505, 8325, 7593, 50,
+ 12505, 8325, 7593, 384,
+ 12505, 8325, 7593, 416,
+ 12505, 8325, 7593, 476,
+ 12505, 8325, 7593, 644,
+ 12505, 8325, 7593, 888,
+ 12505, 8325, 7593, 1128,
+ 12505, 8325, 7593, 2216,
+ 12505, 8325, 7593, 2250,
+ 12505, 8325, 7593, 2412,
+ 12505, 8325, 7593, 2658,
+ 12505, 8325, 7593, 3774,
+ 12505, 8325, 7593, 4614,
+ 12505, 8325, 7593, 6262,
+ 12505, 8325, 7593, 6406,
+ 12505, 8325, 7593, 6674,
+ 12505, 8325, 7593, 6789, 7568,
+ 12505, 8325, 7593, 6824,
+ 12505, 8325, 7593, 7022,
+ 12505, 8325, 7593, 7080,
+ 12505, 8325, 7593, 7316,
+ 12505, 8325, 7593, 7568,
+ 12505, 8325, 7593, 7682,
+ 12505, 8325, 7593, 9185, 16,
+ 12505, 8325, 7593, 9185, 18,
+ 12505, 8325, 7593, 9270,
+ 12505, 8325, 7593, 9530,
+ 12505, 8325, 7593, 9808,
+ 12505, 8325, 7683, 8774,
+ 12505, 8325, 9063, 0,
+ 12505, 8325, 9063, 2,
+ 12505, 8325, 9063, 4,
+ 12505, 8325, 9063, 6,
+ 12505, 8325, 9063, 8,
+ 12505, 8325, 9063, 10,
+ 12505, 8325, 9063, 12,
+ 12505, 8325, 9063, 14,
+ 12505, 8325, 9063, 16,
+ 12505, 8325, 9063, 18,
+ 12505, 8325, 9063, 20,
+ 12505, 8325, 9063, 22,
+ 12505, 8325, 9063, 24,
+ 12505, 8325, 9063, 26,
+ 12505, 8325, 9063, 28,
+ 12505, 8325, 9063, 30,
+ 12505, 8325, 9063, 32,
+ 12505, 8325, 9063, 34,
+ 12505, 8325, 9063, 36,
+ 12505, 8325, 9063, 38,
+ 12505, 8325, 9063, 40,
+ 12505, 8325, 9063, 42,
+ 12505, 8325, 9063, 44,
+ 12505, 8325, 9063, 46,
+ 12505, 8325, 9063, 48,
+ 12505, 8325, 9063, 50,
+ 12505, 8325, 9063, 384,
+ 12505, 8325, 9063, 416,
+ 12505, 8325, 9063, 476,
+ 12505, 8325, 9063, 644,
+ 12505, 8325, 9063, 888,
+ 12505, 8325, 9063, 1128,
+ 12505, 8325, 9063, 2216,
+ 12505, 8325, 9063, 2250,
+ 12505, 8325, 9063, 2412,
+ 12505, 8325, 9063, 2658,
+ 12505, 8325, 9063, 3774,
+ 12505, 8325, 9063, 4614,
+ 12505, 8325, 9063, 6262,
+ 12505, 8325, 9063, 6406,
+ 12505, 8325, 9063, 6674,
+ 12505, 8325, 9063, 6824,
+ 12505, 8325, 9063, 7022,
+ 12505, 8325, 9063, 7080,
+ 12505, 8325, 9063, 7316,
+ 12505, 8325, 9063, 7568,
+ 12505, 8325, 9063, 7682,
+ 12505, 8325, 9063, 7683, 8774,
+ 12505, 8325, 9063, 9270,
+ 12505, 8325, 9063, 9530,
+ 12505, 8325, 9063, 9808,
+ 12505, 8325, 9271, 8774,
+ 12505, 8325, 9573, 12432,
+ 12505, 8679, 7593, 0,
+ 12505, 8679, 7593, 2,
+ 12505, 8679, 7593, 4,
+ 12505, 8679, 7593, 6,
+ 12505, 8679, 7593, 10,
+ 12505, 8679, 7593, 14,
+ 12505, 8679, 7593, 16,
+ 12505, 8679, 7593, 18,
+ 12505, 8679, 7593, 20,
+ 12505, 8679, 7593, 22,
+ 12505, 8679, 7593, 24,
+ 12505, 8679, 7593, 26,
+ 12505, 8679, 7593, 30,
+ 12505, 8679, 7593, 32,
+ 12505, 8679, 7593, 34,
+ 12505, 8679, 7593, 36,
+ 12505, 8679, 7593, 38,
+ 12505, 8679, 7593, 40,
+ 12505, 8679, 7593, 42,
+ 12505, 8679, 7593, 44,
+ 12505, 8679, 7593, 46,
+ 12505, 8679, 7593, 48,
+ 12505, 8679, 7593, 50,
+ 12505, 8679, 9063, 0,
+ 12505, 8679, 9063, 4,
+ 12505, 8679, 9063, 6,
+ 12505, 8679, 9063, 12,
+ 12505, 8679, 9063, 18,
+ 12505, 8679, 9063, 20,
+ 12505, 8679, 9063, 26,
+ 12505, 8679, 9063, 28,
+ 12505, 8679, 9063, 30,
+ 12505, 8679, 9063, 32,
+ 12505, 8679, 9063, 36,
+ 12505, 8679, 9063, 38,
+ 12505, 8679, 9063, 40,
+ 12505, 8679, 9063, 42,
+ 12505, 8679, 9063, 44,
+ 12505, 8679, 9063, 46,
+ 12505, 8679, 9063, 48,
+ 12505, 8679, 9063, 50,
+ 12505, 9295, 7593, 0,
+ 12505, 9295, 7593, 2,
+ 12505, 9295, 7593, 4,
+ 12505, 9295, 7593, 6,
+ 12505, 9295, 7593, 8,
+ 12505, 9295, 7593, 10,
+ 12505, 9295, 7593, 12,
+ 12505, 9295, 7593, 14,
+ 12505, 9295, 7593, 16,
+ 12505, 9295, 7593, 18,
+ 12505, 9295, 7593, 20,
+ 12505, 9295, 7593, 22,
+ 12505, 9295, 7593, 24,
+ 12505, 9295, 7593, 26,
+ 12505, 9295, 7593, 28,
+ 12505, 9295, 7593, 30,
+ 12505, 9295, 7593, 32,
+ 12505, 9295, 7593, 34,
+ 12505, 9295, 7593, 36,
+ 12505, 9295, 7593, 38,
+ 12505, 9295, 7593, 40,
+ 12505, 9295, 7593, 42,
+ 12505, 9295, 7593, 44,
+ 12505, 9295, 7593, 46,
+ 12505, 9295, 7593, 48,
+ 12505, 9295, 7593, 50,
+ 12505, 9295, 9063, 0,
+ 12505, 9295, 9063, 2,
+ 12505, 9295, 9063, 6,
+ 12505, 9295, 9063, 8,
+ 12505, 9295, 9063, 10,
+ 12505, 9295, 9063, 12,
+ 12505, 9295, 9063, 18,
+ 12505, 9295, 9063, 20,
+ 12505, 9295, 9063, 22,
+ 12505, 9295, 9063, 24,
+ 12505, 9295, 9063, 26,
+ 12505, 9295, 9063, 28,
+ 12505, 9295, 9063, 30,
+ 12505, 9295, 9063, 32,
+ 12505, 9295, 9063, 36,
+ 12505, 9295, 9063, 38,
+ 12505, 9295, 9063, 40,
+ 12505, 9295, 9063, 42,
+ 12505, 9295, 9063, 44,
+ 12505, 9295, 9063, 46,
+ 12505, 9295, 9063, 48,
+ 12505, 11129, 6689, 2170,
+ 12505, 11129, 6689, 2540,
+ 12505, 11129, 6689, 2778,
+ 12505, 11129, 6689, 4200,
+ 12505, 11129, 6689, 4214,
+ 12505, 11129, 6689, 5190,
+ 12505, 11129, 6689, 6260,
+ 12505, 11129, 6689, 6722,
+ 12505, 11129, 6689, 7508,
+ 12505, 11129, 6689, 7694,
+ 12505, 11129, 7593, 0,
+ 12505, 11129, 7593, 2,
+ 12505, 11129, 7593, 4,
+ 12505, 11129, 7593, 6,
+ 12505, 11129, 7593, 8,
+ 12505, 11129, 7593, 10,
+ 12505, 11129, 7593, 12,
+ 12505, 11129, 7593, 14,
+ 12505, 11129, 7593, 16,
+ 12505, 11129, 7593, 18,
+ 12505, 11129, 7593, 20,
+ 12505, 11129, 7593, 22,
+ 12505, 11129, 7593, 24,
+ 12505, 11129, 7593, 26,
+ 12505, 11129, 7593, 28,
+ 12505, 11129, 7593, 30,
+ 12505, 11129, 7593, 32,
+ 12505, 11129, 7593, 34,
+ 12505, 11129, 7593, 36,
+ 12505, 11129, 7593, 38,
+ 12505, 11129, 7593, 40,
+ 12505, 11129, 7593, 42,
+ 12505, 11129, 7593, 44,
+ 12505, 11129, 7593, 46,
+ 12505, 11129, 7593, 48,
+ 12505, 11129, 7593, 50,
+ 12505, 11129, 9063, 0,
+ 12505, 11129, 9063, 2,
+ 12505, 11129, 9063, 4,
+ 12505, 11129, 9063, 6,
+ 12505, 11129, 9063, 8,
+ 12505, 11129, 9063, 10,
+ 12505, 11129, 9063, 12,
+ 12505, 11129, 9063, 14,
+ 12505, 11129, 9063, 16,
+ 12505, 11129, 9063, 18,
+ 12505, 11129, 9063, 20,
+ 12505, 11129, 9063, 22,
+ 12505, 11129, 9063, 24,
+ 12505, 11129, 9063, 26,
+ 12505, 11129, 9063, 28,
+ 12505, 11129, 9063, 30,
+ 12505, 11129, 9063, 32,
+ 12505, 11129, 9063, 34,
+ 12505, 11129, 9063, 36,
+ 12505, 11129, 9063, 38,
+ 12505, 11129, 9063, 40,
+ 12505, 11129, 9063, 42,
+ 12505, 11129, 9063, 44,
+ 12505, 11129, 9063, 46,
+ 12505, 11129, 9063, 48,
+ 12505, 11129, 9063, 50,
+ 12505, 11767, 3803, 477, 8774,
+ 12505, 11767, 3803, 2217, 8774,
+ 12505, 11767, 3803, 2413, 8774,
+ 12505, 11767, 3803, 6689, 2170,
+ 12505, 11767, 3803, 6689, 2540,
+ 12505, 11767, 3803, 6689, 2778,
+ 12505, 11767, 3803, 6689, 4200,
+ 12505, 11767, 3803, 6689, 4214,
+ 12505, 11767, 3803, 6689, 5190,
+ 12505, 11767, 3803, 6689, 6260,
+ 12505, 11767, 3803, 6689, 6722,
+ 12505, 11767, 3803, 6689, 7508,
+ 12505, 11767, 3803, 6689, 7694,
+ 12505, 11767, 3803, 7023, 8774,
+ 12505, 11767, 3803, 7202,
+ 12505, 11767, 3803, 7593, 0,
+ 12505, 11767, 3803, 7593, 2,
+ 12505, 11767, 3803, 7593, 4,
+ 12505, 11767, 3803, 7593, 6,
+ 12505, 11767, 3803, 7593, 8,
+ 12505, 11767, 3803, 7593, 10,
+ 12505, 11767, 3803, 7593, 12,
+ 12505, 11767, 3803, 7593, 14,
+ 12505, 11767, 3803, 7593, 16,
+ 12505, 11767, 3803, 7593, 18,
+ 12505, 11767, 3803, 7593, 20,
+ 12505, 11767, 3803, 7593, 22,
+ 12505, 11767, 3803, 7593, 24,
+ 12505, 11767, 3803, 7593, 26,
+ 12505, 11767, 3803, 7593, 28,
+ 12505, 11767, 3803, 7593, 30,
+ 12505, 11767, 3803, 7593, 32,
+ 12505, 11767, 3803, 7593, 34,
+ 12505, 11767, 3803, 7593, 36,
+ 12505, 11767, 3803, 7593, 38,
+ 12505, 11767, 3803, 7593, 40,
+ 12505, 11767, 3803, 7593, 42,
+ 12505, 11767, 3803, 7593, 44,
+ 12505, 11767, 3803, 7593, 46,
+ 12505, 11767, 3803, 7593, 48,
+ 12505, 11767, 3803, 7593, 50,
+ 12505, 11767, 3803, 7593, 384,
+ 12505, 11767, 3803, 7593, 416,
+ 12505, 11767, 3803, 7593, 476,
+ 12505, 11767, 3803, 7593, 644,
+ 12505, 11767, 3803, 7593, 888,
+ 12505, 11767, 3803, 7593, 1128,
+ 12505, 11767, 3803, 7593, 2216,
+ 12505, 11767, 3803, 7593, 2250,
+ 12505, 11767, 3803, 7593, 2412,
+ 12505, 11767, 3803, 7593, 2658,
+ 12505, 11767, 3803, 7593, 3774,
+ 12505, 11767, 3803, 7593, 4614,
+ 12505, 11767, 3803, 7593, 6262,
+ 12505, 11767, 3803, 7593, 6406,
+ 12505, 11767, 3803, 7593, 6674,
+ 12505, 11767, 3803, 7593, 6789, 7568,
+ 12505, 11767, 3803, 7593, 6824,
+ 12505, 11767, 3803, 7593, 7022,
+ 12505, 11767, 3803, 7593, 7080,
+ 12505, 11767, 3803, 7593, 7316,
+ 12505, 11767, 3803, 7593, 7568,
+ 12505, 11767, 3803, 7593, 7682,
+ 12505, 11767, 3803, 7593, 9270,
+ 12505, 11767, 3803, 7593, 9530,
+ 12505, 11767, 3803, 7593, 9808,
+ 12505, 11767, 3803, 7683, 8774,
+ 12505, 11767, 3803, 8325, 477, 8774,
+ 12505, 11767, 3803, 8325, 2217, 8774,
+ 12505, 11767, 3803, 8325, 2413, 8774,
+ 12505, 11767, 3803, 8325, 7023, 8774,
+ 12505, 11767, 3803, 8325, 7202,
+ 12505, 11767, 3803, 8325, 7593, 0,
+ 12505, 11767, 3803, 8325, 7593, 2,
+ 12505, 11767, 3803, 8325, 7593, 4,
+ 12505, 11767, 3803, 8325, 7593, 6,
+ 12505, 11767, 3803, 8325, 7593, 8,
+ 12505, 11767, 3803, 8325, 7593, 10,
+ 12505, 11767, 3803, 8325, 7593, 12,
+ 12505, 11767, 3803, 8325, 7593, 14,
+ 12505, 11767, 3803, 8325, 7593, 16,
+ 12505, 11767, 3803, 8325, 7593, 18,
+ 12505, 11767, 3803, 8325, 7593, 20,
+ 12505, 11767, 3803, 8325, 7593, 22,
+ 12505, 11767, 3803, 8325, 7593, 24,
+ 12505, 11767, 3803, 8325, 7593, 26,
+ 12505, 11767, 3803, 8325, 7593, 28,
+ 12505, 11767, 3803, 8325, 7593, 30,
+ 12505, 11767, 3803, 8325, 7593, 32,
+ 12505, 11767, 3803, 8325, 7593, 34,
+ 12505, 11767, 3803, 8325, 7593, 36,
+ 12505, 11767, 3803, 8325, 7593, 38,
+ 12505, 11767, 3803, 8325, 7593, 40,
+ 12505, 11767, 3803, 8325, 7593, 42,
+ 12505, 11767, 3803, 8325, 7593, 44,
+ 12505, 11767, 3803, 8325, 7593, 46,
+ 12505, 11767, 3803, 8325, 7593, 48,
+ 12505, 11767, 3803, 8325, 7593, 50,
+ 12505, 11767, 3803, 8325, 7593, 384,
+ 12505, 11767, 3803, 8325, 7593, 416,
+ 12505, 11767, 3803, 8325, 7593, 476,
+ 12505, 11767, 3803, 8325, 7593, 644,
+ 12505, 11767, 3803, 8325, 7593, 888,
+ 12505, 11767, 3803, 8325, 7593, 1128,
+ 12505, 11767, 3803, 8325, 7593, 2216,
+ 12505, 11767, 3803, 8325, 7593, 2250,
+ 12505, 11767, 3803, 8325, 7593, 2412,
+ 12505, 11767, 3803, 8325, 7593, 2658,
+ 12505, 11767, 3803, 8325, 7593, 3774,
+ 12505, 11767, 3803, 8325, 7593, 4614,
+ 12505, 11767, 3803, 8325, 7593, 6262,
+ 12505, 11767, 3803, 8325, 7593, 6406,
+ 12505, 11767, 3803, 8325, 7593, 6674,
+ 12505, 11767, 3803, 8325, 7593, 6789, 7568,
+ 12505, 11767, 3803, 8325, 7593, 6824,
+ 12505, 11767, 3803, 8325, 7593, 7022,
+ 12505, 11767, 3803, 8325, 7593, 7080,
+ 12505, 11767, 3803, 8325, 7593, 7316,
+ 12505, 11767, 3803, 8325, 7593, 7568,
+ 12505, 11767, 3803, 8325, 7593, 7682,
+ 12505, 11767, 3803, 8325, 7593, 9270,
+ 12505, 11767, 3803, 8325, 7593, 9530,
+ 12505, 11767, 3803, 8325, 7593, 9808,
+ 12505, 11767, 3803, 8325, 7683, 8774,
+ 12505, 11767, 3803, 8325, 9063, 0,
+ 12505, 11767, 3803, 8325, 9063, 2,
+ 12505, 11767, 3803, 8325, 9063, 4,
+ 12505, 11767, 3803, 8325, 9063, 6,
+ 12505, 11767, 3803, 8325, 9063, 8,
+ 12505, 11767, 3803, 8325, 9063, 10,
+ 12505, 11767, 3803, 8325, 9063, 12,
+ 12505, 11767, 3803, 8325, 9063, 14,
+ 12505, 11767, 3803, 8325, 9063, 16,
+ 12505, 11767, 3803, 8325, 9063, 18,
+ 12505, 11767, 3803, 8325, 9063, 20,
+ 12505, 11767, 3803, 8325, 9063, 22,
+ 12505, 11767, 3803, 8325, 9063, 24,
+ 12505, 11767, 3803, 8325, 9063, 26,
+ 12505, 11767, 3803, 8325, 9063, 28,
+ 12505, 11767, 3803, 8325, 9063, 30,
+ 12505, 11767, 3803, 8325, 9063, 32,
+ 12505, 11767, 3803, 8325, 9063, 34,
+ 12505, 11767, 3803, 8325, 9063, 36,
+ 12505, 11767, 3803, 8325, 9063, 38,
+ 12505, 11767, 3803, 8325, 9063, 40,
+ 12505, 11767, 3803, 8325, 9063, 42,
+ 12505, 11767, 3803, 8325, 9063, 44,
+ 12505, 11767, 3803, 8325, 9063, 46,
+ 12505, 11767, 3803, 8325, 9063, 48,
+ 12505, 11767, 3803, 8325, 9063, 50,
+ 12505, 11767, 3803, 8325, 9063, 384,
+ 12505, 11767, 3803, 8325, 9063, 416,
+ 12505, 11767, 3803, 8325, 9063, 476,
+ 12505, 11767, 3803, 8325, 9063, 644,
+ 12505, 11767, 3803, 8325, 9063, 888,
+ 12505, 11767, 3803, 8325, 9063, 1128,
+ 12505, 11767, 3803, 8325, 9063, 2216,
+ 12505, 11767, 3803, 8325, 9063, 2250,
+ 12505, 11767, 3803, 8325, 9063, 2412,
+ 12505, 11767, 3803, 8325, 9063, 2658,
+ 12505, 11767, 3803, 8325, 9063, 3774,
+ 12505, 11767, 3803, 8325, 9063, 4614,
+ 12505, 11767, 3803, 8325, 9063, 6262,
+ 12505, 11767, 3803, 8325, 9063, 6406,
+ 12505, 11767, 3803, 8325, 9063, 6674,
+ 12505, 11767, 3803, 8325, 9063, 6824,
+ 12505, 11767, 3803, 8325, 9063, 7022,
+ 12505, 11767, 3803, 8325, 9063, 7080,
+ 12505, 11767, 3803, 8325, 9063, 7316,
+ 12505, 11767, 3803, 8325, 9063, 7568,
+ 12505, 11767, 3803, 8325, 9063, 7682,
+ 12505, 11767, 3803, 8325, 9063, 7683, 8774,
+ 12505, 11767, 3803, 8325, 9063, 9270,
+ 12505, 11767, 3803, 8325, 9063, 9530,
+ 12505, 11767, 3803, 8325, 9063, 9808,
+ 12505, 11767, 3803, 8325, 9271, 8774,
+ 12505, 11767, 3803, 8325, 9573, 12432,
+ 12505, 11767, 3803, 9063, 0,
+ 12505, 11767, 3803, 9063, 2,
+ 12505, 11767, 3803, 9063, 4,
+ 12505, 11767, 3803, 9063, 6,
+ 12505, 11767, 3803, 9063, 8,
+ 12505, 11767, 3803, 9063, 10,
+ 12505, 11767, 3803, 9063, 12,
+ 12505, 11767, 3803, 9063, 14,
+ 12505, 11767, 3803, 9063, 16,
+ 12505, 11767, 3803, 9063, 18,
+ 12505, 11767, 3803, 9063, 20,
+ 12505, 11767, 3803, 9063, 22,
+ 12505, 11767, 3803, 9063, 24,
+ 12505, 11767, 3803, 9063, 26,
+ 12505, 11767, 3803, 9063, 28,
+ 12505, 11767, 3803, 9063, 30,
+ 12505, 11767, 3803, 9063, 32,
+ 12505, 11767, 3803, 9063, 34,
+ 12505, 11767, 3803, 9063, 36,
+ 12505, 11767, 3803, 9063, 38,
+ 12505, 11767, 3803, 9063, 40,
+ 12505, 11767, 3803, 9063, 42,
+ 12505, 11767, 3803, 9063, 44,
+ 12505, 11767, 3803, 9063, 46,
+ 12505, 11767, 3803, 9063, 48,
+ 12505, 11767, 3803, 9063, 50,
+ 12505, 11767, 3803, 9063, 384,
+ 12505, 11767, 3803, 9063, 416,
+ 12505, 11767, 3803, 9063, 476,
+ 12505, 11767, 3803, 9063, 644,
+ 12505, 11767, 3803, 9063, 888,
+ 12505, 11767, 3803, 9063, 1128,
+ 12505, 11767, 3803, 9063, 2216,
+ 12505, 11767, 3803, 9063, 2250,
+ 12505, 11767, 3803, 9063, 2412,
+ 12505, 11767, 3803, 9063, 2658,
+ 12505, 11767, 3803, 9063, 3774,
+ 12505, 11767, 3803, 9063, 4614,
+ 12505, 11767, 3803, 9063, 6262,
+ 12505, 11767, 3803, 9063, 6406,
+ 12505, 11767, 3803, 9063, 6674,
+ 12505, 11767, 3803, 9063, 6824,
+ 12505, 11767, 3803, 9063, 7022,
+ 12505, 11767, 3803, 9063, 7080,
+ 12505, 11767, 3803, 9063, 7316,
+ 12505, 11767, 3803, 9063, 7568,
+ 12505, 11767, 3803, 9063, 7682,
+ 12505, 11767, 3803, 9063, 7683, 8774,
+ 12505, 11767, 3803, 9063, 9270,
+ 12505, 11767, 3803, 9063, 9530,
+ 12505, 11767, 3803, 9063, 9808,
+ 12505, 11767, 3803, 9271, 8774,
+ 12505, 11767, 3803, 9573, 12432,
+ 12505, 11767, 6689, 2170,
+ 12505, 11767, 6689, 2540,
+ 12505, 11767, 6689, 2778,
+ 12505, 11767, 6689, 4200,
+ 12505, 11767, 6689, 4214,
+ 12505, 11767, 6689, 5190,
+ 12505, 11767, 6689, 6260,
+ 12505, 11767, 6689, 6722,
+ 12505, 11767, 6689, 7508,
+ 12505, 11767, 6689, 7694,
+ 12505, 11767, 7593, 0,
+ 12505, 11767, 7593, 2,
+ 12505, 11767, 7593, 4,
+ 12505, 11767, 7593, 6,
+ 12505, 11767, 7593, 8,
+ 12505, 11767, 7593, 10,
+ 12505, 11767, 7593, 12,
+ 12505, 11767, 7593, 14,
+ 12505, 11767, 7593, 16,
+ 12505, 11767, 7593, 18,
+ 12505, 11767, 7593, 20,
+ 12505, 11767, 7593, 22,
+ 12505, 11767, 7593, 24,
+ 12505, 11767, 7593, 26,
+ 12505, 11767, 7593, 28,
+ 12505, 11767, 7593, 30,
+ 12505, 11767, 7593, 32,
+ 12505, 11767, 7593, 34,
+ 12505, 11767, 7593, 36,
+ 12505, 11767, 7593, 38,
+ 12505, 11767, 7593, 40,
+ 12505, 11767, 7593, 42,
+ 12505, 11767, 7593, 44,
+ 12505, 11767, 7593, 46,
+ 12505, 11767, 7593, 48,
+ 12505, 11767, 7593, 50,
+ 12505, 11767, 8325, 7593, 0,
+ 12505, 11767, 8325, 7593, 2,
+ 12505, 11767, 8325, 7593, 4,
+ 12505, 11767, 8325, 7593, 6,
+ 12505, 11767, 8325, 7593, 8,
+ 12505, 11767, 8325, 7593, 10,
+ 12505, 11767, 8325, 7593, 12,
+ 12505, 11767, 8325, 7593, 14,
+ 12505, 11767, 8325, 7593, 16,
+ 12505, 11767, 8325, 7593, 18,
+ 12505, 11767, 8325, 7593, 20,
+ 12505, 11767, 8325, 7593, 22,
+ 12505, 11767, 8325, 7593, 24,
+ 12505, 11767, 8325, 7593, 26,
+ 12505, 11767, 8325, 7593, 28,
+ 12505, 11767, 8325, 7593, 30,
+ 12505, 11767, 8325, 7593, 32,
+ 12505, 11767, 8325, 7593, 34,
+ 12505, 11767, 8325, 7593, 36,
+ 12505, 11767, 8325, 7593, 38,
+ 12505, 11767, 8325, 7593, 40,
+ 12505, 11767, 8325, 7593, 42,
+ 12505, 11767, 8325, 7593, 44,
+ 12505, 11767, 8325, 7593, 46,
+ 12505, 11767, 8325, 7593, 48,
+ 12505, 11767, 8325, 7593, 50,
+ 12505, 11767, 8325, 9063, 0,
+ 12505, 11767, 8325, 9063, 2,
+ 12505, 11767, 8325, 9063, 4,
+ 12505, 11767, 8325, 9063, 6,
+ 12505, 11767, 8325, 9063, 8,
+ 12505, 11767, 8325, 9063, 10,
+ 12505, 11767, 8325, 9063, 12,
+ 12505, 11767, 8325, 9063, 14,
+ 12505, 11767, 8325, 9063, 16,
+ 12505, 11767, 8325, 9063, 18,
+ 12505, 11767, 8325, 9063, 20,
+ 12505, 11767, 8325, 9063, 22,
+ 12505, 11767, 8325, 9063, 24,
+ 12505, 11767, 8325, 9063, 26,
+ 12505, 11767, 8325, 9063, 28,
+ 12505, 11767, 8325, 9063, 30,
+ 12505, 11767, 8325, 9063, 32,
+ 12505, 11767, 8325, 9063, 34,
+ 12505, 11767, 8325, 9063, 36,
+ 12505, 11767, 8325, 9063, 38,
+ 12505, 11767, 8325, 9063, 40,
+ 12505, 11767, 8325, 9063, 42,
+ 12505, 11767, 8325, 9063, 44,
+ 12505, 11767, 8325, 9063, 46,
+ 12505, 11767, 8325, 9063, 48,
+ 12505, 11767, 8325, 9063, 50,
+ 12505, 11767, 9063, 0,
+ 12505, 11767, 9063, 2,
+ 12505, 11767, 9063, 4,
+ 12505, 11767, 9063, 6,
+ 12505, 11767, 9063, 8,
+ 12505, 11767, 9063, 10,
+ 12505, 11767, 9063, 12,
+ 12505, 11767, 9063, 14,
+ 12505, 11767, 9063, 16,
+ 12505, 11767, 9063, 18,
+ 12505, 11767, 9063, 20,
+ 12505, 11767, 9063, 22,
+ 12505, 11767, 9063, 24,
+ 12505, 11767, 9063, 26,
+ 12505, 11767, 9063, 28,
+ 12505, 11767, 9063, 30,
+ 12505, 11767, 9063, 32,
+ 12505, 11767, 9063, 34,
+ 12505, 11767, 9063, 36,
+ 12505, 11767, 9063, 38,
+ 12505, 11767, 9063, 40,
+ 12505, 11767, 9063, 42,
+ 12505, 11767, 9063, 44,
+ 12505, 11767, 9063, 46,
+ 12505, 11767, 9063, 48,
+ 12505, 11767, 9063, 50,
+ 12505, 12929, 6689, 2170,
+ 12505, 12929, 6689, 2540,
+ 12505, 12929, 6689, 2778,
+ 12505, 12929, 6689, 4200,
+ 12505, 12929, 6689, 4214,
+ 12505, 12929, 6689, 5190,
+ 12505, 12929, 6689, 6260,
+ 12505, 12929, 6689, 6722,
+ 12505, 12929, 6689, 7508,
+ 12505, 12929, 6689, 7694,
+ 12505, 12929, 7593, 0,
+ 12505, 12929, 7593, 2,
+ 12505, 12929, 7593, 4,
+ 12505, 12929, 7593, 6,
+ 12505, 12929, 7593, 8,
+ 12505, 12929, 7593, 10,
+ 12505, 12929, 7593, 12,
+ 12505, 12929, 7593, 14,
+ 12505, 12929, 7593, 16,
+ 12505, 12929, 7593, 18,
+ 12505, 12929, 7593, 20,
+ 12505, 12929, 7593, 22,
+ 12505, 12929, 7593, 24,
+ 12505, 12929, 7593, 26,
+ 12505, 12929, 7593, 28,
+ 12505, 12929, 7593, 30,
+ 12505, 12929, 7593, 32,
+ 12505, 12929, 7593, 34,
+ 12505, 12929, 7593, 36,
+ 12505, 12929, 7593, 38,
+ 12505, 12929, 7593, 40,
+ 12505, 12929, 7593, 42,
+ 12505, 12929, 7593, 44,
+ 12505, 12929, 7593, 46,
+ 12505, 12929, 7593, 48,
+ 12505, 12929, 7593, 50,
+ 12505, 12929, 9063, 0,
+ 12505, 12929, 9063, 2,
+ 12505, 12929, 9063, 6,
+ 12505, 12929, 9063, 8,
+ 12505, 12929, 9063, 10,
+ 12505, 12929, 9063, 12,
+ 12505, 12929, 9063, 16,
+ 12505, 12929, 9063, 18,
+ 12505, 12929, 9063, 20,
+ 12505, 12929, 9063, 22,
+ 12505, 12929, 9063, 24,
+ 12505, 12929, 9063, 28,
+ 12505, 12929, 9063, 36,
+ 12505, 12929, 9063, 38,
+ 12505, 12929, 9063, 40,
+ 12505, 12929, 9063, 42,
+ 12505, 12929, 9063, 44,
+ 12505, 12929, 9063, 46,
+ 12505, 12929, 9063, 48,
+ 12517, 8306,
+ 12525, 5882,
+ 12527, 4213, 1177, 10677, 175, 3992,
+ 12527, 4213, 1177, 10677, 177, 3992,
+ 12527, 4213, 1177, 10677, 1809, 4876,
+ 12527, 4213, 1177, 10677, 2779, 1045, 8392,
+ 12527, 4213, 1177, 10677, 4849, 6409, 9050,
+ 12527, 4213, 1177, 10677, 4849, 6505, 11677, 9050,
+ 12527, 4213, 1177, 10677, 4849, 6627, 9050,
+ 12527, 4213, 1177, 10677, 4849, 7821, 8077, 9050,
+ 12527, 4213, 1177, 10677, 4849, 7821, 11677, 9050,
+ 12527, 4213, 1177, 10677, 4849, 8077, 9050,
+ 12527, 4213, 1177, 10677, 4849, 8153, 6409, 9050,
+ 12527, 4213, 1177, 10677, 4849, 8745, 9050,
+ 12527, 4213, 1177, 10677, 4849, 10637, 7533, 9050,
+ 12527, 4213, 1177, 10677, 4849, 12114,
+ 12527, 4213, 1177, 10677, 6107, 1809, 4876,
+ 12527, 4213, 1177, 10677, 6610,
+ 12527, 4213, 1177, 10677, 6616,
+ 12527, 4213, 1177, 10677, 7443, 6409, 9050,
+ 12527, 4213, 1177, 10677, 7443, 6505, 11677, 9050,
+ 12527, 4213, 1177, 10677, 7443, 6627, 9050,
+ 12527, 4213, 1177, 10677, 7443, 7821, 8077, 9050,
+ 12527, 4213, 1177, 10677, 7443, 7821, 11677, 9054,
+ 12527, 4213, 1177, 10677, 7443, 8077, 9050,
+ 12527, 4213, 1177, 10677, 7443, 8153, 6409, 9050,
+ 12527, 4213, 1177, 10677, 7443, 8745, 9050,
+ 12527, 4213, 1177, 10677, 7443, 10637, 7533, 9050,
+ 12527, 4213, 1177, 10677, 7443, 12114,
+ 12527, 4213, 1177, 10677, 10469, 4926,
+ 12527, 4213, 1177, 10677, 11224,
+ 12527, 4213, 1177, 10677, 11649, 10154,
+ 12527, 4213, 1177, 10677, 12017, 4926,
+ 12527, 4213, 1177, 10677, 12043, 4223, 5836,
+ 12527, 4213, 1177, 10677, 12043, 6616,
+ 12529, 568,
+ 12537, 7821, 11765, 6434,
+ 12540,
+ 12874,
+ 12881, 7608,
+ 12882,
+ 12895, 11765, 6434,
+ 12901, 2725, 11791, 6434,
+ 12901, 5385, 8057, 6434,
+ 12901, 8065, 8057, 6434,
+ 12901, 8241, 8057, 6434,
+ 12901, 9115, 10260,
+ 12901, 12056,
+ 12903, 835, 2091, 9855, 6741, 568,
+ 12903, 6741, 445, 6741, 568,
+ 12903, 6741, 568,
+ 12903, 6741, 569, 445, 2681, 6989, 428,
+ 12925, 11385, 8774,
+ 12929, 7201, 11262,
+ 12929, 7593, 476,
+ 12929, 7593, 6824,
+ 12929, 8325, 7593, 6,
+ 12929, 8325, 7593, 8,
+ 12929, 8325, 7593, 16,
+ 12929, 8325, 7593, 18,
+ 12929, 8325, 9063, 6,
+ 12929, 9063, 4,
+ 12929, 9063, 14,
+ 12929, 9063, 26,
+ 12929, 9063, 30,
+ 12929, 9063, 32,
+ 12929, 9063, 34,
+ 12929, 9063, 50,
+ 12929, 9063, 476,
+ 12929, 9063, 6824,
+ 12931, 10643, 6121, 4849, 4389, 6504,
+ 12931, 10643, 6121, 7443, 4389, 6504,
+ 12939, 5758,
+ 12941, 6741, 568,
+ 12941, 11621, 568,
+ 12967, 6409, 9050,
+ 12967, 8083, 6409, 9050,
+ 12967, 8153, 6409, 11195, 4926,
+ 12969, 4926,
+ 12969, 10390,
+ 12969, 10966,
+ 12975, 5758,
+ 12983, 11765, 6434,
+ 12987, 6689, 2170,
+ 12987, 6689, 2540,
+ 12987, 6689, 2778,
+ 12987, 6689, 4200,
+ 12987, 6689, 4214,
+ 12987, 6689, 5190,
+ 12987, 6689, 6722,
+ 12987, 6689, 7508,
+ 12987, 6689, 7694,
+ 12987, 7089, 7593, 8405, 0,
+ 12987, 7089, 7593, 8405, 2,
+ 12987, 7089, 7593, 8405, 4,
+ 12987, 7089, 7593, 8405, 6,
+ 12987, 7089, 7593, 8405, 8,
+ 12987, 7089, 7593, 8405, 10,
+ 12987, 7089, 7593, 8405, 12,
+ 12987, 7089, 7593, 8405, 14,
+ 12987, 7089, 7593, 8405, 16,
+ 12987, 7089, 7593, 8405, 18,
+ 12987, 7089, 7593, 8405, 20,
+ 12987, 7089, 7593, 8405, 22,
+ 12987, 7089, 7593, 8405, 24,
+ 12987, 7089, 7593, 8405, 26,
+ 12987, 7089, 7593, 8405, 28,
+ 12987, 7089, 7593, 8405, 30,
+ 12987, 7089, 7593, 8405, 32,
+ 12987, 7089, 7593, 8405, 34,
+ 12987, 7089, 7593, 8405, 36,
+ 12987, 7089, 7593, 8405, 38,
+ 12987, 7089, 7593, 8405, 40,
+ 12987, 7089, 7593, 8405, 42,
+ 12987, 7089, 7593, 8405, 44,
+ 12987, 7089, 7593, 8405, 46,
+ 12987, 7089, 7593, 8405, 48,
+ 12987, 7089, 7593, 8405, 50,
+ 12987, 8287, 5770,
+ 12987, 8287, 5771, 0,
+ 12987, 8287, 6594,
+ 12987, 8287, 6595, 0,
+ 12987, 8287, 6595, 40,
+ 12987, 8287, 6912,
+ 12987, 8287, 6913, 0,
+ 12987, 8287, 6982,
+ 12987, 8287, 6983, 0,
+ 12987, 8287, 7166,
+ 12987, 8287, 7167, 0,
+ 12987, 8287, 7244,
+ 12987, 8287, 7245, 0,
+ 12987, 8287, 7372,
+ 12987, 8287, 7373, 0,
+ 12987, 8287, 7440,
+ 12987, 8287, 7441, 0,
+ 12987, 8287, 8362,
+ 12987, 8287, 8363, 0,
+ 12987, 8287, 8828,
+ 12987, 8287, 8829, 0,
+ 12987, 8287, 9086,
+ 12987, 8287, 9087, 0,
+ 12987, 8287, 9400,
+ 12987, 8287, 9401, 0,
+ 12987, 8287, 9588,
+ 12987, 8287, 9589, 0,
+ 12987, 8287, 9780,
+ 12987, 8287, 9781, 0,
+ 12987, 8371, 10759, 29, 250,
+ 12987, 8371, 10759, 7310,
+ 12987, 8525, 2670,
+ 12987, 8525, 8162,
+ 12987, 8525, 8874,
+ 12987, 8525, 8876,
+ 12987, 8525, 9286,
+ 12987, 8525, 9700,
+ 12987, 8525, 10150,
+ 12987, 8525, 10200,
+ 12987, 8525, 10360,
+ 12987, 8525, 10622,
+ 12987, 8525, 11232,
+ 12987, 11043, 2170,
+ 12987, 11043, 2540,
+ 12987, 11043, 2586,
+ 12987, 11043, 2670,
+ 12987, 11043, 2778,
+ 12987, 11043, 3842,
+ 12987, 11043, 4194,
+ 12987, 11043, 4200,
+ 12987, 11043, 4214,
+ 12987, 11043, 4396,
+ 12987, 11043, 5012,
+ 12987, 11043, 5046,
+ 12987, 11043, 5190,
+ 12987, 11043, 5540,
+ 12987, 11043, 5650,
+ 12987, 11043, 6122,
+ 12987, 11043, 6716,
+ 12987, 11043, 6722,
+ 12987, 11043, 7072,
+ 12987, 11043, 7146,
+ 12987, 11043, 7428,
+ 12987, 11043, 7508,
+ 12987, 11043, 7640,
+ 12987, 11043, 7646,
+ 12987, 11043, 7694,
+ 12987, 11043, 7812,
+ 12987, 11043, 9714,
+ 12987, 11043, 9724,
+ 12987, 11043, 9862,
+ 12987, 11043, 10180,
+ 12987, 11043, 10484,
+ 12987, 11043, 10992,
+ 12987, 11043, 11208,
+ 12987, 11043, 11266,
+ 12987, 11043, 11612,
+ 12987, 11043, 13050,
+ 12990,
+ 12991, 6121, 36,
+ 13011, 4926,
+ 13011, 10390,
+ 13011, 10966,
+ 13022,
+ 13045, 6741, 568,
+ 13047, 9898,
+ 13061, 46,
+ 13061, 5758,
+ 13061, 5759, 275, 4849, 4389, 8056,
+ 13061, 5759, 275, 7443, 4389, 8056,
+ 13061, 5759, 275, 8153, 8056,
+ 13061, 5759, 275, 10642,
+ 13061, 5759, 6121, 1045, 6376,
+ 13061, 5759, 6121, 10666,
+ 13067, 6409, 9050,
+ 13067, 8083, 6409, 9050,
+ 13067, 8153, 6409, 11195, 4926,
+ 13070,
+ 13191, 7271, 4153, 6434,
+ 13191, 7607, 4153, 6434,
+ 13191, 11765, 6434,
+ 13231, 11765, 6434,
+ 13233, 9898,
+ 13235, 11765, 6434,
+ 13237, 11765, 6434,
+ 13365, 8153, 8306,
+ 13365, 8921, 7605, 4926,
+ 13365, 11185, 7605, 4926,
+ 13365, 12341, 7605, 4926,
+ 13381, 8774,
+ 13393, 7337, 8774,
+ 13403, 8279, 8774,
+ 13403, 8381, 8774,
+ 13417, 8774,
+ 13419, 8774,
+};
+static const struct { uint16_t code; uint32_t name:24; }
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+__attribute__((__packed__))
+#endif
+unicode_name_to_code[18242] = {
+ { 0x2114, 0 },
+ { 0x29CC, 4 },
+ { 0x2327, 7 },
+ { 0x22FF, 12 },
+ { 0x2987, 16 },
+ { 0x2989, 21 },
+ { 0x2981, 26 },
+ { 0x2982, 29 },
+ { 0x2A65, 33 },
+ { 0x2988, 37 },
+ { 0x298A, 42 },
+ { 0x2A64, 47 },
+ { 0x2A20, 51 },
+ { 0x2A21, 55 },
+ { 0x2A1F, 59 },
+ { 0x2A3E, 63 },
+ { 0x23E6, 67 },
+ { 0x2014, 69 },
+ { 0x2001, 71 },
+ { 0x2003, 73 },
+ { 0x2013, 75 },
+ { 0x2000, 77 },
+ { 0x2002, 79 },
+ { 0x1C78, 81 },
+ { 0x1C7D, 85 },
+ { 0x1C51, 88 },
+ { 0x1C56, 92 },
+ { 0x1C52, 96 },
+ { 0x1C55, 100 },
+ { 0x1C54, 104 },
+ { 0x1C59, 108 },
+ { 0x1C50, 112 },
+ { 0x1C58, 116 },
+ { 0x1C57, 120 },
+ { 0x1C53, 124 },
+ { 0x1C7B, 128 },
+ { 0x1C5C, 131 },
+ { 0x1C5E, 135 },
+ { 0x1C5B, 139 },
+ { 0x1C71, 143 },
+ { 0x1C6F, 147 },
+ { 0x1C66, 151 },
+ { 0x1C68, 155 },
+ { 0x1C65, 159 },
+ { 0x1C5A, 163 },
+ { 0x1C6E, 167 },
+ { 0x1C64, 171 },
+ { 0x1C73, 175 },
+ { 0x1C69, 179 },
+ { 0x1C75, 183 },
+ { 0x1C77, 187 },
+ { 0x1C76, 191 },
+ { 0x1C6A, 195 },
+ { 0x1C6B, 199 },
+ { 0x1C6D, 203 },
+ { 0x1C61, 207 },
+ { 0x1C60, 211 },
+ { 0x1C62, 215 },
+ { 0x1C63, 219 },
+ { 0x1C5D, 223 },
+ { 0x1C70, 227 },
+ { 0x1C72, 231 },
+ { 0x1C67, 235 },
+ { 0x1C5F, 239 },
+ { 0x1C74, 243 },
+ { 0x1C6C, 247 },
+ { 0x1C79, 251 },
+ { 0x1C7C, 255 },
+ { 0x1C7A, 258 },
+ { 0x1C7F, 262 },
+ { 0x1C7E, 267 },
+ { 0x27C7, 271 },
+ { 0x2951, 275 },
+ { 0x294D, 282 },
+ { 0x294C, 289 },
+ { 0x294F, 296 },
+ { 0x2195, 303 },
+ { 0x21A8, 306 },
+ { 0x2B0D, 311 },
+ { 0x21F3, 315 },
+ { 0x21D5, 319 },
+ { 0x297E, 323 },
+ { 0x22A5, 326 },
+ { 0x27DF, 328 },
+ { 0x29BD, 333 },
+ { 0x22F0, 337 },
+ { 0x2303, 341 },
+ { 0x2324, 343 },
+ { 0x54BC, 349 },
+ { 0x54B9, 352 },
+ { 0x54A1, 355 },
+ { 0x54B3, 358 },
+ { 0x54C6, 361 },
+ { 0x5491, 364 },
+ { 0x5498, 367 },
+ { 0x54A9, 370 },
+ { 0x54A8, 373 },
+ { 0x54B8, 376 },
+ { 0x549D, 379 },
+ { 0x54B2, 382 },
+ { 0x54A5, 385 },
+ { 0x54C3, 388 },
+ { 0x54BE, 391 },
+ { 0x5494, 394 },
+ { 0x54A3, 397 },
+ { 0x5497, 400 },
+ { 0x54B6, 403 },
+ { 0x54AD, 406 },
+ { 0x54B5, 409 },
+ { 0x5492, 412 },
+ { 0x54BB, 415 },
+ { 0x549A, 418 },
+ { 0x549C, 421 },
+ { 0x549E, 424 },
+ { 0x54AC, 427 },
+ { 0x5490, 430 },
+ { 0x54B0, 433 },
+ { 0x5495, 436 },
+ { 0x54A0, 439 },
+ { 0x54B1, 442 },
+ { 0x54AF, 445 },
+ { 0x54AE, 448 },
+ { 0x54AB, 451 },
+ { 0x54A2, 454 },
+ { 0x54C1, 457 },
+ { 0x549B, 460 },
+ { 0x54BD, 463 },
+ { 0x54A4, 466 },
+ { 0x5496, 469 },
+ { 0x54A6, 472 },
+ { 0x5499, 475 },
+ { 0x54BF, 478 },
+ { 0x549F, 481 },
+ { 0x54B7, 484 },
+ { 0x54AA, 487 },
+ { 0x54C5, 490 },
+ { 0x5493, 493 },
+ { 0x54A7, 496 },
+ { 0x54B4, 499 },
+ { 0x54C0, 502 },
+ { 0x54C2, 505 },
+ { 0x54BA, 508 },
+ { 0x54C4, 511 },
+ { 0x500A, 514 },
+ { 0x5014, 517 },
+ { 0x5002, 520 },
+ { 0x5011, 523 },
+ { 0x500B, 526 },
+ { 0x5008, 529 },
+ { 0x5009, 532 },
+ { 0x5020, 535 },
+ { 0x502A, 538 },
+ { 0x5018, 541 },
+ { 0x5027, 544 },
+ { 0x502E, 547 },
+ { 0x5034, 550 },
+ { 0x52B8, 553 },
+ { 0x52C2, 556 },
+ { 0x52B0, 559 },
+ { 0x52BF, 562 },
+ { 0x52C6, 565 },
+ { 0x52CC, 568 },
+ { 0x5109, 571 },
+ { 0x5112, 574 },
+ { 0x5102, 577 },
+ { 0x510F, 580 },
+ { 0x5116, 583 },
+ { 0x5013, 586 },
+ { 0x50D3, 589 },
+ { 0x50CF, 592 },
+ { 0x50D6, 595 },
+ { 0x50DA, 598 },
+ { 0x50E0, 601 },
+ { 0x51E4, 604 },
+ { 0x51F0, 607 },
+ { 0x51DC, 610 },
+ { 0x51EC, 613 },
+ { 0x51F4, 616 },
+ { 0x5273, 619 },
+ { 0x527E, 622 },
+ { 0x527B, 625 },
+ { 0x5006, 628 },
+ { 0x5003, 631 },
+ { 0x5000, 634 },
+ { 0x5001, 637 },
+ { 0x53E2, 640 },
+ { 0x53EE, 643 },
+ { 0x53F2, 646 },
+ { 0x53F8, 649 },
+ { 0x5201, 652 },
+ { 0x520C, 655 },
+ { 0x51FA, 658 },
+ { 0x5208, 661 },
+ { 0x5210, 664 },
+ { 0x51C1, 667 },
+ { 0x51CC, 670 },
+ { 0x51B9, 673 },
+ { 0x51C9, 676 },
+ { 0x51D0, 679 },
+ { 0x51D6, 682 },
+ { 0x50B7, 685 },
+ { 0x50C2, 688 },
+ { 0x50B0, 691 },
+ { 0x50BF, 694 },
+ { 0x50C5, 697 },
+ { 0x50CB, 700 },
+ { 0x5185, 703 },
+ { 0x518F, 706 },
+ { 0x517F, 709 },
+ { 0x518C, 712 },
+ { 0x5193, 715 },
+ { 0x5012, 718 },
+ { 0x500F, 721 },
+ { 0x5010, 724 },
+ { 0x5041, 727 },
+ { 0x503A, 730 },
+ { 0x5048, 733 },
+ { 0x504C, 736 },
+ { 0x5052, 739 },
+ { 0x53FE, 742 },
+ { 0x540A, 745 },
+ { 0x540E, 748 },
+ { 0x5414, 751 },
+ { 0x53C8, 754 },
+ { 0x53D2, 757 },
+ { 0x53CF, 760 },
+ { 0x53D6, 763 },
+ { 0x53DC, 766 },
+ { 0x5312, 769 },
+ { 0x531C, 772 },
+ { 0x530B, 775 },
+ { 0x5319, 778 },
+ { 0x5320, 781 },
+ { 0x5326, 784 },
+ { 0x5123, 787 },
+ { 0x512E, 790 },
+ { 0x511C, 793 },
+ { 0x512B, 796 },
+ { 0x5132, 799 },
+ { 0x500D, 802 },
+ { 0x50EC, 805 },
+ { 0x50E4, 808 },
+ { 0x50F0, 811 },
+ { 0x50F6, 814 },
+ { 0x50FC, 817 },
+ { 0x5282, 820 },
+ { 0x528B, 823 },
+ { 0x5288, 826 },
+ { 0x5015, 829 },
+ { 0x545F, 832 },
+ { 0x5469, 835 },
+ { 0x546D, 838 },
+ { 0x5473, 841 },
+ { 0x547F, 844 },
+ { 0x5483, 847 },
+ { 0x5489, 850 },
+ { 0x5296, 853 },
+ { 0x52A0, 856 },
+ { 0x528F, 859 },
+ { 0x529D, 862 },
+ { 0x52A4, 865 },
+ { 0x52AA, 868 },
+ { 0x5021, 871 },
+ { 0x501E, 874 },
+ { 0x501F, 877 },
+ { 0x5060, 880 },
+ { 0x506A, 883 },
+ { 0x5058, 886 },
+ { 0x5067, 889 },
+ { 0x506E, 892 },
+ { 0x5074, 895 },
+ { 0x502B, 898 },
+ { 0x5029, 901 },
+ { 0x501C, 904 },
+ { 0x5019, 907 },
+ { 0x5016, 910 },
+ { 0x5017, 913 },
+ { 0x5028, 916 },
+ { 0x5025, 919 },
+ { 0x5026, 922 },
+ { 0x5023, 925 },
+ { 0x502F, 928 },
+ { 0x5031, 931 },
+ { 0x502C, 934 },
+ { 0x502D, 937 },
+ { 0x5035, 940 },
+ { 0x5037, 943 },
+ { 0x5032, 946 },
+ { 0x5033, 949 },
+ { 0x52B9, 952 },
+ { 0x52B6, 955 },
+ { 0x52B7, 958 },
+ { 0x52C3, 961 },
+ { 0x52C1, 964 },
+ { 0x5363, 967 },
+ { 0x536F, 970 },
+ { 0x536B, 973 },
+ { 0x5372, 976 },
+ { 0x5378, 979 },
+ { 0x52B4, 982 },
+ { 0x52B1, 985 },
+ { 0x52AE, 988 },
+ { 0x52AF, 991 },
+ { 0x52C0, 994 },
+ { 0x52BD, 997 },
+ { 0x52BE, 1000 },
+ { 0x52BB, 1003 },
+ { 0x52C7, 1006 },
+ { 0x52C9, 1009 },
+ { 0x52C4, 1012 },
+ { 0x52C5, 1015 },
+ { 0x52CD, 1018 },
+ { 0x52CF, 1021 },
+ { 0x52CA, 1024 },
+ { 0x52CB, 1027 },
+ { 0x510A, 1030 },
+ { 0x5107, 1033 },
+ { 0x5108, 1036 },
+ { 0x513F, 1039 },
+ { 0x5149, 1042 },
+ { 0x5138, 1045 },
+ { 0x5146, 1048 },
+ { 0x514D, 1051 },
+ { 0x5113, 1054 },
+ { 0x5111, 1057 },
+ { 0x5105, 1060 },
+ { 0x5103, 1063 },
+ { 0x5100, 1066 },
+ { 0x5101, 1069 },
+ { 0x5110, 1072 },
+ { 0x510D, 1075 },
+ { 0x510E, 1078 },
+ { 0x510C, 1081 },
+ { 0x5117, 1084 },
+ { 0x5119, 1087 },
+ { 0x5114, 1090 },
+ { 0x5115, 1093 },
+ { 0x50D4, 1096 },
+ { 0x50D1, 1099 },
+ { 0x50D2, 1102 },
+ { 0x50D0, 1105 },
+ { 0x50CD, 1108 },
+ { 0x50CE, 1111 },
+ { 0x50D7, 1114 },
+ { 0x50D5, 1117 },
+ { 0x50DB, 1120 },
+ { 0x50DD, 1123 },
+ { 0x50D8, 1126 },
+ { 0x50D9, 1129 },
+ { 0x50E1, 1132 },
+ { 0x50DE, 1135 },
+ { 0x50DF, 1138 },
+ { 0x51E5, 1141 },
+ { 0x51E2, 1144 },
+ { 0x51E3, 1147 },
+ { 0x51F1, 1150 },
+ { 0x51EE, 1153 },
+ { 0x51EF, 1156 },
+ { 0x521C, 1159 },
+ { 0x5228, 1162 },
+ { 0x5216, 1165 },
+ { 0x5224, 1168 },
+ { 0x522C, 1171 },
+ { 0x51E0, 1174 },
+ { 0x51DD, 1177 },
+ { 0x51DA, 1180 },
+ { 0x51DB, 1183 },
+ { 0x51ED, 1186 },
+ { 0x51EA, 1189 },
+ { 0x51EB, 1192 },
+ { 0x51E8, 1195 },
+ { 0x51F5, 1198 },
+ { 0x51F7, 1201 },
+ { 0x51F2, 1204 },
+ { 0x51F3, 1207 },
+ { 0x5274, 1210 },
+ { 0x5271, 1213 },
+ { 0x5272, 1216 },
+ { 0x527F, 1219 },
+ { 0x527D, 1222 },
+ { 0x5270, 1225 },
+ { 0x526E, 1228 },
+ { 0x51A0, 1231 },
+ { 0x51A9, 1234 },
+ { 0x5199, 1237 },
+ { 0x51A6, 1240 },
+ { 0x51AD, 1243 },
+ { 0x51B3, 1246 },
+ { 0x509A, 1249 },
+ { 0x5093, 1252 },
+ { 0x50A1, 1255 },
+ { 0x50A5, 1258 },
+ { 0x50AA, 1261 },
+ { 0x5172, 1264 },
+ { 0x517A, 1267 },
+ { 0x516A, 1270 },
+ { 0x527C, 1273 },
+ { 0x5279, 1276 },
+ { 0x527A, 1279 },
+ { 0x5277, 1282 },
+ { 0x5250, 1285 },
+ { 0x525B, 1288 },
+ { 0x5248, 1291 },
+ { 0x5258, 1294 },
+ { 0x5007, 1297 },
+ { 0x5004, 1300 },
+ { 0x5005, 1303 },
+ { 0x53E6, 1306 },
+ { 0x53E3, 1309 },
+ { 0x53E0, 1312 },
+ { 0x53E1, 1315 },
+ { 0x541A, 1318 },
+ { 0x5425, 1321 },
+ { 0x5429, 1324 },
+ { 0x542F, 1327 },
+ { 0x53EF, 1330 },
+ { 0x53EC, 1333 },
+ { 0x53ED, 1336 },
+ { 0x53EA, 1339 },
+ { 0x53F3, 1342 },
+ { 0x53F5, 1345 },
+ { 0x53F0, 1348 },
+ { 0x53F1, 1351 },
+ { 0x53F9, 1354 },
+ { 0x53FB, 1357 },
+ { 0x53F6, 1360 },
+ { 0x53F7, 1363 },
+ { 0x5202, 1366 },
+ { 0x51FF, 1369 },
+ { 0x5200, 1372 },
+ { 0x520D, 1375 },
+ { 0x520A, 1378 },
+ { 0x520B, 1381 },
+ { 0x51FD, 1384 },
+ { 0x51FB, 1387 },
+ { 0x51F8, 1390 },
+ { 0x51F9, 1393 },
+ { 0x5209, 1396 },
+ { 0x5206, 1399 },
+ { 0x5207, 1402 },
+ { 0x5204, 1405 },
+ { 0x5211, 1408 },
+ { 0x5213, 1411 },
+ { 0x520E, 1414 },
+ { 0x520F, 1417 },
+ { 0x51C2, 1420 },
+ { 0x51BF, 1423 },
+ { 0x51C0, 1426 },
+ { 0x51CD, 1429 },
+ { 0x51CB, 1432 },
+ { 0x51BD, 1435 },
+ { 0x51BA, 1438 },
+ { 0x51B7, 1441 },
+ { 0x51B8, 1444 },
+ { 0x51CA, 1447 },
+ { 0x51C7, 1450 },
+ { 0x51C8, 1453 },
+ { 0x51C5, 1456 },
+ { 0x51D1, 1459 },
+ { 0x51D3, 1462 },
+ { 0x51CE, 1465 },
+ { 0x51CF, 1468 },
+ { 0x51D7, 1471 },
+ { 0x51D9, 1474 },
+ { 0x51D4, 1477 },
+ { 0x51D5, 1480 },
+ { 0x50B8, 1483 },
+ { 0x50B5, 1486 },
+ { 0x50B6, 1489 },
+ { 0x50C1, 1492 },
+ { 0x5234, 1495 },
+ { 0x523E, 1498 },
+ { 0x523B, 1501 },
+ { 0x5242, 1504 },
+ { 0x50B3, 1507 },
+ { 0x50B1, 1510 },
+ { 0x50AE, 1513 },
+ { 0x50AF, 1516 },
+ { 0x50C0, 1519 },
+ { 0x50BD, 1522 },
+ { 0x50BE, 1525 },
+ { 0x50BB, 1528 },
+ { 0x50C6, 1531 },
+ { 0x50C8, 1534 },
+ { 0x50C3, 1537 },
+ { 0x50C4, 1540 },
+ { 0x50CC, 1543 },
+ { 0x50C9, 1546 },
+ { 0x50CA, 1549 },
+ { 0x5186, 1552 },
+ { 0x5184, 1555 },
+ { 0x507F, 1558 },
+ { 0x5078, 1561 },
+ { 0x5083, 1564 },
+ { 0x5087, 1567 },
+ { 0x508D, 1570 },
+ { 0x5159, 1573 },
+ { 0x5160, 1576 },
+ { 0x5153, 1579 },
+ { 0x515D, 1582 },
+ { 0x5164, 1585 },
+ { 0x5190, 1588 },
+ { 0x518E, 1591 },
+ { 0x5262, 1594 },
+ { 0x526C, 1597 },
+ { 0x5269, 1600 },
+ { 0x5182, 1603 },
+ { 0x5180, 1606 },
+ { 0x517D, 1609 },
+ { 0x517E, 1612 },
+ { 0x5433, 1615 },
+ { 0x543D, 1618 },
+ { 0x5440, 1621 },
+ { 0x5446, 1624 },
+ { 0x518D, 1627 },
+ { 0x518A, 1630 },
+ { 0x518B, 1633 },
+ { 0x5396, 1636 },
+ { 0x539D, 1639 },
+ { 0x5399, 1642 },
+ { 0x53A1, 1645 },
+ { 0x53A7, 1648 },
+ { 0x5188, 1651 },
+ { 0x5194, 1654 },
+ { 0x5196, 1657 },
+ { 0x5191, 1660 },
+ { 0x5192, 1663 },
+ { 0x544C, 1666 },
+ { 0x5457, 1669 },
+ { 0x545B, 1672 },
+ { 0x52F6, 1675 },
+ { 0x52FD, 1678 },
+ { 0x52EF, 1681 },
+ { 0x52FF, 1684 },
+ { 0x5305, 1687 },
+ { 0x5042, 1690 },
+ { 0x503F, 1693 },
+ { 0x5040, 1696 },
+ { 0x503D, 1699 },
+ { 0x503B, 1702 },
+ { 0x5038, 1705 },
+ { 0x5039, 1708 },
+ { 0x5049, 1711 },
+ { 0x5046, 1714 },
+ { 0x5047, 1717 },
+ { 0x5044, 1720 },
+ { 0x504D, 1723 },
+ { 0x504F, 1726 },
+ { 0x504A, 1729 },
+ { 0x504B, 1732 },
+ { 0x5053, 1735 },
+ { 0x5055, 1738 },
+ { 0x5050, 1741 },
+ { 0x5051, 1744 },
+ { 0x5402, 1747 },
+ { 0x53FF, 1750 },
+ { 0x53FC, 1753 },
+ { 0x53FD, 1756 },
+ { 0x540B, 1759 },
+ { 0x5408, 1762 },
+ { 0x5409, 1765 },
+ { 0x5406, 1768 },
+ { 0x540F, 1771 },
+ { 0x5411, 1774 },
+ { 0x540C, 1777 },
+ { 0x540D, 1780 },
+ { 0x5415, 1783 },
+ { 0x5417, 1786 },
+ { 0x5412, 1789 },
+ { 0x5413, 1792 },
+ { 0x53C9, 1795 },
+ { 0x53C6, 1798 },
+ { 0x53C7, 1801 },
+ { 0x53D3, 1804 },
+ { 0x53D1, 1807 },
+ { 0x53D0, 1810 },
+ { 0x53CD, 1813 },
+ { 0x53CE, 1816 },
+ { 0x537D, 1819 },
+ { 0x5386, 1822 },
+ { 0x5382, 1825 },
+ { 0x538A, 1828 },
+ { 0x5390, 1831 },
+ { 0x53CB, 1834 },
+ { 0x53D7, 1837 },
+ { 0x53D9, 1840 },
+ { 0x53D4, 1843 },
+ { 0x53D5, 1846 },
+ { 0x53DD, 1849 },
+ { 0x53DF, 1852 },
+ { 0x53DA, 1855 },
+ { 0x53DB, 1858 },
+ { 0x5313, 1861 },
+ { 0x5310, 1864 },
+ { 0x5311, 1867 },
+ { 0x531D, 1870 },
+ { 0x531B, 1873 },
+ { 0x53AD, 1876 },
+ { 0x53B8, 1879 },
+ { 0x53B4, 1882 },
+ { 0x53BC, 1885 },
+ { 0x53C2, 1888 },
+ { 0x530E, 1891 },
+ { 0x530C, 1894 },
+ { 0x5309, 1897 },
+ { 0x530A, 1900 },
+ { 0x531A, 1903 },
+ { 0x5317, 1906 },
+ { 0x5318, 1909 },
+ { 0x5333, 1912 },
+ { 0x533A, 1915 },
+ { 0x532C, 1918 },
+ { 0x5337, 1921 },
+ { 0x533E, 1924 },
+ { 0x5342, 1927 },
+ { 0x5315, 1930 },
+ { 0x5321, 1933 },
+ { 0x5323, 1936 },
+ { 0x531E, 1939 },
+ { 0x531F, 1942 },
+ { 0x5327, 1945 },
+ { 0x5329, 1948 },
+ { 0x5324, 1951 },
+ { 0x5325, 1954 },
+ { 0x5124, 1957 },
+ { 0x5121, 1960 },
+ { 0x5122, 1963 },
+ { 0x512F, 1966 },
+ { 0x512D, 1969 },
+ { 0x511F, 1972 },
+ { 0x511D, 1975 },
+ { 0x511A, 1978 },
+ { 0x511B, 1981 },
+ { 0x512C, 1984 },
+ { 0x5129, 1987 },
+ { 0x512A, 1990 },
+ { 0x5127, 1993 },
+ { 0x5133, 1996 },
+ { 0x5135, 1999 },
+ { 0x5130, 2002 },
+ { 0x5131, 2005 },
+ { 0x500E, 2008 },
+ { 0x500C, 2011 },
+ { 0x50ED, 2014 },
+ { 0x50EA, 2017 },
+ { 0x50EB, 2020 },
+ { 0x50F3, 2023 },
+ { 0x50F2, 2026 },
+ { 0x50E8, 2029 },
+ { 0x50E5, 2032 },
+ { 0x50E2, 2035 },
+ { 0x50E3, 2038 },
+ { 0x50F1, 2041 },
+ { 0x50EE, 2044 },
+ { 0x50EF, 2047 },
+ { 0x50F7, 2050 },
+ { 0x50F9, 2053 },
+ { 0x50F4, 2056 },
+ { 0x50F5, 2059 },
+ { 0x50FD, 2062 },
+ { 0x50FF, 2065 },
+ { 0x50FA, 2068 },
+ { 0x50FB, 2071 },
+ { 0x5283, 2074 },
+ { 0x5280, 2077 },
+ { 0x5281, 2080 },
+ { 0x528C, 2083 },
+ { 0x528A, 2086 },
+ { 0x5289, 2089 },
+ { 0x5287, 2092 },
+ { 0x5285, 2095 },
+ { 0x5463, 2098 },
+ { 0x5460, 2101 },
+ { 0x545D, 2104 },
+ { 0x545E, 2107 },
+ { 0x546A, 2110 },
+ { 0x5467, 2113 },
+ { 0x5468, 2116 },
+ { 0x5466, 2119 },
+ { 0x546E, 2122 },
+ { 0x5470, 2125 },
+ { 0x546B, 2128 },
+ { 0x546C, 2131 },
+ { 0x5477, 2134 },
+ { 0x5474, 2137 },
+ { 0x5471, 2140 },
+ { 0x5472, 2143 },
+ { 0x5480, 2146 },
+ { 0x547D, 2149 },
+ { 0x547E, 2152 },
+ { 0x547B, 2155 },
+ { 0x5484, 2158 },
+ { 0x5486, 2161 },
+ { 0x5481, 2164 },
+ { 0x5482, 2167 },
+ { 0x548A, 2170 },
+ { 0x548C, 2173 },
+ { 0x5487, 2176 },
+ { 0x5488, 2179 },
+ { 0x5297, 2182 },
+ { 0x5294, 2185 },
+ { 0x5295, 2188 },
+ { 0x52A1, 2191 },
+ { 0x529F, 2194 },
+ { 0x5348, 2197 },
+ { 0x5353, 2200 },
+ { 0x534F, 2203 },
+ { 0x5357, 2206 },
+ { 0x535D, 2209 },
+ { 0x5292, 2212 },
+ { 0x5290, 2215 },
+ { 0x528D, 2218 },
+ { 0x528E, 2221 },
+ { 0x529E, 2224 },
+ { 0x529B, 2227 },
+ { 0x529C, 2230 },
+ { 0x5299, 2233 },
+ { 0x52A5, 2236 },
+ { 0x52A7, 2239 },
+ { 0x52A2, 2242 },
+ { 0x52A3, 2245 },
+ { 0x52AB, 2248 },
+ { 0x52AD, 2251 },
+ { 0x52A8, 2254 },
+ { 0x52A9, 2257 },
+ { 0x52DA, 2260 },
+ { 0x52E0, 2263 },
+ { 0x52D2, 2266 },
+ { 0x52DD, 2269 },
+ { 0x52E3, 2272 },
+ { 0x52E9, 2275 },
+ { 0x5061, 2278 },
+ { 0x505E, 2281 },
+ { 0x505F, 2284 },
+ { 0x506B, 2287 },
+ { 0x5069, 2290 },
+ { 0x505C, 2293 },
+ { 0x5059, 2296 },
+ { 0x5056, 2299 },
+ { 0x5057, 2302 },
+ { 0x5068, 2305 },
+ { 0x5065, 2308 },
+ { 0x5066, 2311 },
+ { 0x5063, 2314 },
+ { 0x506F, 2317 },
+ { 0x5071, 2320 },
+ { 0x506C, 2323 },
+ { 0x506D, 2326 },
+ { 0x5075, 2329 },
+ { 0x5072, 2332 },
+ { 0x5073, 2335 },
+ { 0x501D, 2338 },
+ { 0x501A, 2341 },
+ { 0x501B, 2344 },
+ { 0x5024, 2347 },
+ { 0x5022, 2350 },
+ { 0x5030, 2353 },
+ { 0x5036, 2356 },
+ { 0x5364, 2359 },
+ { 0x5361, 2362 },
+ { 0x5362, 2365 },
+ { 0x5370, 2368 },
+ { 0x536D, 2371 },
+ { 0x536E, 2374 },
+ { 0x536C, 2377 },
+ { 0x5369, 2380 },
+ { 0x536A, 2383 },
+ { 0x5367, 2386 },
+ { 0x5373, 2389 },
+ { 0x5375, 2392 },
+ { 0x5371, 2395 },
+ { 0x5379, 2398 },
+ { 0x537B, 2401 },
+ { 0x5376, 2404 },
+ { 0x5377, 2407 },
+ { 0x52B5, 2410 },
+ { 0x52B2, 2413 },
+ { 0x52B3, 2416 },
+ { 0x52BC, 2419 },
+ { 0x52BA, 2422 },
+ { 0x52C8, 2425 },
+ { 0x52CE, 2428 },
+ { 0x5140, 2431 },
+ { 0x513D, 2434 },
+ { 0x513E, 2437 },
+ { 0x514A, 2440 },
+ { 0x5148, 2443 },
+ { 0x513B, 2446 },
+ { 0x5139, 2449 },
+ { 0x5136, 2452 },
+ { 0x5137, 2455 },
+ { 0x5147, 2458 },
+ { 0x5144, 2461 },
+ { 0x5145, 2464 },
+ { 0x5142, 2467 },
+ { 0x514E, 2470 },
+ { 0x5150, 2473 },
+ { 0x514B, 2476 },
+ { 0x514C, 2479 },
+ { 0x5106, 2482 },
+ { 0x5104, 2485 },
+ { 0x510B, 2488 },
+ { 0x5118, 2491 },
+ { 0x50DC, 2494 },
+ { 0x521D, 2497 },
+ { 0x521A, 2500 },
+ { 0x521B, 2503 },
+ { 0x5229, 2506 },
+ { 0x5226, 2509 },
+ { 0x5227, 2512 },
+ { 0x5218, 2515 },
+ { 0x5214, 2518 },
+ { 0x5215, 2521 },
+ { 0x5225, 2524 },
+ { 0x5222, 2527 },
+ { 0x5223, 2530 },
+ { 0x5220, 2533 },
+ { 0x522D, 2536 },
+ { 0x522F, 2539 },
+ { 0x522A, 2542 },
+ { 0x522B, 2545 },
+ { 0x51E1, 2548 },
+ { 0x51DE, 2551 },
+ { 0x51DF, 2554 },
+ { 0x51E9, 2557 },
+ { 0x51E6, 2560 },
+ { 0x51E7, 2563 },
+ { 0x51F6, 2566 },
+ { 0x526F, 2569 },
+ { 0x51A1, 2572 },
+ { 0x519E, 2575 },
+ { 0x519F, 2578 },
+ { 0x51AA, 2581 },
+ { 0x51A8, 2584 },
+ { 0x519C, 2587 },
+ { 0x519A, 2590 },
+ { 0x5197, 2593 },
+ { 0x5198, 2596 },
+ { 0x51A7, 2599 },
+ { 0x51A5, 2602 },
+ { 0x51A3, 2605 },
+ { 0x51AE, 2608 },
+ { 0x51B0, 2611 },
+ { 0x51AB, 2614 },
+ { 0x51AC, 2617 },
+ { 0x51B4, 2620 },
+ { 0x51B6, 2623 },
+ { 0x51B1, 2626 },
+ { 0x51B2, 2629 },
+ { 0x509B, 2632 },
+ { 0x5098, 2635 },
+ { 0x5099, 2638 },
+ { 0x5096, 2641 },
+ { 0x5094, 2644 },
+ { 0x5091, 2647 },
+ { 0x5092, 2650 },
+ { 0x50A2, 2653 },
+ { 0x509F, 2656 },
+ { 0x50A0, 2659 },
+ { 0x509D, 2662 },
+ { 0x50A6, 2665 },
+ { 0x50A8, 2668 },
+ { 0x50A3, 2671 },
+ { 0x50A4, 2674 },
+ { 0x50AB, 2677 },
+ { 0x50AD, 2680 },
+ { 0x50A9, 2683 },
+ { 0x5173, 2686 },
+ { 0x5170, 2689 },
+ { 0x5171, 2692 },
+ { 0x517B, 2695 },
+ { 0x5179, 2698 },
+ { 0x516E, 2701 },
+ { 0x516B, 2704 },
+ { 0x5168, 2707 },
+ { 0x5169, 2710 },
+ { 0x5178, 2713 },
+ { 0x5176, 2716 },
+ { 0x5177, 2719 },
+ { 0x5175, 2722 },
+ { 0x517C, 2725 },
+ { 0x5278, 2728 },
+ { 0x5275, 2731 },
+ { 0x5276, 2734 },
+ { 0x5251, 2737 },
+ { 0x524E, 2740 },
+ { 0x524F, 2743 },
+ { 0x525C, 2746 },
+ { 0x525A, 2749 },
+ { 0x524C, 2752 },
+ { 0x5249, 2755 },
+ { 0x5246, 2758 },
+ { 0x5247, 2761 },
+ { 0x5259, 2764 },
+ { 0x5256, 2767 },
+ { 0x5257, 2770 },
+ { 0x5254, 2773 },
+ { 0x53E7, 2776 },
+ { 0x53E4, 2779 },
+ { 0x53E5, 2782 },
+ { 0x541E, 2785 },
+ { 0x541B, 2788 },
+ { 0x5418, 2791 },
+ { 0x5419, 2794 },
+ { 0x5426, 2797 },
+ { 0x5423, 2800 },
+ { 0x5424, 2803 },
+ { 0x5421, 2806 },
+ { 0x542A, 2809 },
+ { 0x542C, 2812 },
+ { 0x5427, 2815 },
+ { 0x5428, 2818 },
+ { 0x5430, 2821 },
+ { 0x542D, 2824 },
+ { 0x542E, 2827 },
+ { 0x53EB, 2830 },
+ { 0x53E8, 2833 },
+ { 0x53E9, 2836 },
+ { 0x53F4, 2839 },
+ { 0x53FA, 2842 },
+ { 0x51FE, 2845 },
+ { 0x51FC, 2848 },
+ { 0x5205, 2851 },
+ { 0x5203, 2854 },
+ { 0x5212, 2857 },
+ { 0x51BE, 2860 },
+ { 0x51BB, 2863 },
+ { 0x51BC, 2866 },
+ { 0x51C6, 2869 },
+ { 0x51C3, 2872 },
+ { 0x51C4, 2875 },
+ { 0x51D2, 2878 },
+ { 0x51D8, 2881 },
+ { 0x5235, 2884 },
+ { 0x5232, 2887 },
+ { 0x5233, 2890 },
+ { 0x523F, 2893 },
+ { 0x523D, 2896 },
+ { 0x5231, 2899 },
+ { 0x523C, 2902 },
+ { 0x5239, 2905 },
+ { 0x523A, 2908 },
+ { 0x5237, 2911 },
+ { 0x5243, 2914 },
+ { 0x5245, 2917 },
+ { 0x5240, 2920 },
+ { 0x5241, 2923 },
+ { 0x50B4, 2926 },
+ { 0x50B2, 2929 },
+ { 0x50BC, 2932 },
+ { 0x50B9, 2935 },
+ { 0x50BA, 2938 },
+ { 0x50C7, 2941 },
+ { 0x5080, 2944 },
+ { 0x507D, 2947 },
+ { 0x507E, 2950 },
+ { 0x507B, 2953 },
+ { 0x5079, 2956 },
+ { 0x5076, 2959 },
+ { 0x5077, 2962 },
+ { 0x5084, 2965 },
+ { 0x5081, 2968 },
+ { 0x5082, 2971 },
+ { 0x5088, 2974 },
+ { 0x508A, 2977 },
+ { 0x5085, 2980 },
+ { 0x5086, 2983 },
+ { 0x508E, 2986 },
+ { 0x5090, 2989 },
+ { 0x508B, 2992 },
+ { 0x508C, 2995 },
+ { 0x515A, 2998 },
+ { 0x5157, 3001 },
+ { 0x5158, 3004 },
+ { 0x5161, 3007 },
+ { 0x515F, 3010 },
+ { 0x5156, 3013 },
+ { 0x5154, 3016 },
+ { 0x5151, 3019 },
+ { 0x5152, 3022 },
+ { 0x515E, 3025 },
+ { 0x515B, 3028 },
+ { 0x515C, 3031 },
+ { 0x5165, 3034 },
+ { 0x5167, 3037 },
+ { 0x5162, 3040 },
+ { 0x5163, 3043 },
+ { 0x5263, 3046 },
+ { 0x5260, 3049 },
+ { 0x5261, 3052 },
+ { 0x526D, 3055 },
+ { 0x526B, 3058 },
+ { 0x525E, 3061 },
+ { 0x526A, 3064 },
+ { 0x5267, 3067 },
+ { 0x5268, 3070 },
+ { 0x5266, 3073 },
+ { 0x5183, 3076 },
+ { 0x5181, 3079 },
+ { 0x5437, 3082 },
+ { 0x5434, 3085 },
+ { 0x5431, 3088 },
+ { 0x5432, 3091 },
+ { 0x543E, 3094 },
+ { 0x543B, 3097 },
+ { 0x543C, 3100 },
+ { 0x543A, 3103 },
+ { 0x5441, 3106 },
+ { 0x5443, 3109 },
+ { 0x543F, 3112 },
+ { 0x5447, 3115 },
+ { 0x5449, 3118 },
+ { 0x5444, 3121 },
+ { 0x5445, 3124 },
+ { 0x5397, 3127 },
+ { 0x5394, 3130 },
+ { 0x5395, 3133 },
+ { 0x539E, 3136 },
+ { 0x539B, 3139 },
+ { 0x539C, 3142 },
+ { 0x539A, 3145 },
+ { 0x5398, 3148 },
+ { 0x53A2, 3151 },
+ { 0x53A4, 3154 },
+ { 0x539F, 3157 },
+ { 0x53A0, 3160 },
+ { 0x53A8, 3163 },
+ { 0x53AA, 3166 },
+ { 0x53A5, 3169 },
+ { 0x53A6, 3172 },
+ { 0x5189, 3175 },
+ { 0x5187, 3178 },
+ { 0x5195, 3181 },
+ { 0x5450, 3184 },
+ { 0x544D, 3187 },
+ { 0x544A, 3190 },
+ { 0x544B, 3193 },
+ { 0x5458, 3196 },
+ { 0x5455, 3199 },
+ { 0x5456, 3202 },
+ { 0x5453, 3205 },
+ { 0x545C, 3208 },
+ { 0x5459, 3211 },
+ { 0x545A, 3214 },
+ { 0x52F7, 3217 },
+ { 0x52F4, 3220 },
+ { 0x52F5, 3223 },
+ { 0x52FC, 3226 },
+ { 0x52F2, 3229 },
+ { 0x52F0, 3232 },
+ { 0x52ED, 3235 },
+ { 0x52EE, 3238 },
+ { 0x52FB, 3241 },
+ { 0x52FA, 3244 },
+ { 0x52F9, 3247 },
+ { 0x5300, 3250 },
+ { 0x5302, 3253 },
+ { 0x52FE, 3256 },
+ { 0x5306, 3259 },
+ { 0x5308, 3262 },
+ { 0x5303, 3265 },
+ { 0x5304, 3268 },
+ { 0x503E, 3271 },
+ { 0x503C, 3274 },
+ { 0x5045, 3277 },
+ { 0x5043, 3280 },
+ { 0x504E, 3283 },
+ { 0x5054, 3286 },
+ { 0x5403, 3289 },
+ { 0x5400, 3292 },
+ { 0x5401, 3295 },
+ { 0x5407, 3298 },
+ { 0x5404, 3301 },
+ { 0x5405, 3304 },
+ { 0x5410, 3307 },
+ { 0x5416, 3310 },
+ { 0x537C, 3313 },
+ { 0x5387, 3316 },
+ { 0x5384, 3319 },
+ { 0x5385, 3322 },
+ { 0x5383, 3325 },
+ { 0x5380, 3328 },
+ { 0x5381, 3331 },
+ { 0x537F, 3334 },
+ { 0x538B, 3337 },
+ { 0x538D, 3340 },
+ { 0x5388, 3343 },
+ { 0x5389, 3346 },
+ { 0x5391, 3349 },
+ { 0x5393, 3352 },
+ { 0x538E, 3355 },
+ { 0x538F, 3358 },
+ { 0x53CC, 3361 },
+ { 0x53CA, 3364 },
+ { 0x53D8, 3367 },
+ { 0x53DE, 3370 },
+ { 0x53AE, 3373 },
+ { 0x53AB, 3376 },
+ { 0x53AC, 3379 },
+ { 0x53B9, 3382 },
+ { 0x53B6, 3385 },
+ { 0x53B7, 3388 },
+ { 0x53B5, 3391 },
+ { 0x53B2, 3394 },
+ { 0x53B3, 3397 },
+ { 0x53B0, 3400 },
+ { 0x53BD, 3403 },
+ { 0x53BF, 3406 },
+ { 0x53BA, 3409 },
+ { 0x53BB, 3412 },
+ { 0x53C3, 3415 },
+ { 0x53C5, 3418 },
+ { 0x53C0, 3421 },
+ { 0x53C1, 3424 },
+ { 0x530F, 3427 },
+ { 0x530D, 3430 },
+ { 0x5334, 3433 },
+ { 0x5331, 3436 },
+ { 0x5332, 3439 },
+ { 0x533B, 3442 },
+ { 0x5339, 3445 },
+ { 0x532F, 3448 },
+ { 0x532D, 3451 },
+ { 0x532A, 3454 },
+ { 0x532B, 3457 },
+ { 0x5338, 3460 },
+ { 0x5335, 3463 },
+ { 0x5336, 3466 },
+ { 0x533F, 3469 },
+ { 0x533C, 3472 },
+ { 0x533D, 3475 },
+ { 0x5343, 3478 },
+ { 0x5345, 3481 },
+ { 0x5340, 3484 },
+ { 0x5341, 3487 },
+ { 0x5316, 3490 },
+ { 0x5314, 3493 },
+ { 0x5322, 3496 },
+ { 0x5328, 3499 },
+ { 0x5120, 3502 },
+ { 0x511E, 3505 },
+ { 0x5128, 3508 },
+ { 0x5125, 3511 },
+ { 0x5126, 3514 },
+ { 0x5134, 3517 },
+ { 0x50E9, 3520 },
+ { 0x50E6, 3523 },
+ { 0x50E7, 3526 },
+ { 0x50F8, 3529 },
+ { 0x50FE, 3532 },
+ { 0x5286, 3535 },
+ { 0x5284, 3538 },
+ { 0x5464, 3541 },
+ { 0x5461, 3544 },
+ { 0x5462, 3547 },
+ { 0x5465, 3550 },
+ { 0x546F, 3553 },
+ { 0x5478, 3556 },
+ { 0x5475, 3559 },
+ { 0x5476, 3562 },
+ { 0x547C, 3565 },
+ { 0x5479, 3568 },
+ { 0x547A, 3571 },
+ { 0x5485, 3574 },
+ { 0x548B, 3577 },
+ { 0x5349, 3580 },
+ { 0x5346, 3583 },
+ { 0x5347, 3586 },
+ { 0x5354, 3589 },
+ { 0x5351, 3592 },
+ { 0x5352, 3595 },
+ { 0x5350, 3598 },
+ { 0x534D, 3601 },
+ { 0x534E, 3604 },
+ { 0x534B, 3607 },
+ { 0x5358, 3610 },
+ { 0x535A, 3613 },
+ { 0x5355, 3616 },
+ { 0x5356, 3619 },
+ { 0x535E, 3622 },
+ { 0x5360, 3625 },
+ { 0x535B, 3628 },
+ { 0x535C, 3631 },
+ { 0x5293, 3634 },
+ { 0x5291, 3637 },
+ { 0x529A, 3640 },
+ { 0x5298, 3643 },
+ { 0x52A6, 3646 },
+ { 0x52AC, 3649 },
+ { 0x52DB, 3652 },
+ { 0x52D8, 3655 },
+ { 0x52D9, 3658 },
+ { 0x52E1, 3661 },
+ { 0x52DF, 3664 },
+ { 0x52D6, 3667 },
+ { 0x52D3, 3670 },
+ { 0x52D0, 3673 },
+ { 0x52D1, 3676 },
+ { 0x52DE, 3679 },
+ { 0x52DC, 3682 },
+ { 0x52E4, 3685 },
+ { 0x52E6, 3688 },
+ { 0x52E2, 3691 },
+ { 0x52EA, 3694 },
+ { 0x52EC, 3697 },
+ { 0x52E7, 3700 },
+ { 0x52E8, 3703 },
+ { 0x505D, 3706 },
+ { 0x505A, 3709 },
+ { 0x505B, 3712 },
+ { 0x5064, 3715 },
+ { 0x5062, 3718 },
+ { 0x5070, 3721 },
+ { 0x5368, 3724 },
+ { 0x5365, 3727 },
+ { 0x5366, 3730 },
+ { 0x5374, 3733 },
+ { 0x537A, 3736 },
+ { 0x513C, 3739 },
+ { 0x513A, 3742 },
+ { 0x5143, 3745 },
+ { 0x5141, 3748 },
+ { 0x514F, 3751 },
+ { 0x5219, 3754 },
+ { 0x5217, 3757 },
+ { 0x5221, 3760 },
+ { 0x521E, 3763 },
+ { 0x521F, 3766 },
+ { 0x522E, 3769 },
+ { 0x519D, 3772 },
+ { 0x519B, 3775 },
+ { 0x51A4, 3778 },
+ { 0x51A2, 3781 },
+ { 0x51AF, 3784 },
+ { 0x51B5, 3787 },
+ { 0x5097, 3790 },
+ { 0x5095, 3793 },
+ { 0x509E, 3796 },
+ { 0x509C, 3799 },
+ { 0x50A7, 3802 },
+ { 0x50AC, 3805 },
+ { 0x516F, 3808 },
+ { 0x516C, 3811 },
+ { 0x516D, 3814 },
+ { 0x5174, 3817 },
+ { 0x524D, 3820 },
+ { 0x524A, 3823 },
+ { 0x524B, 3826 },
+ { 0x5255, 3829 },
+ { 0x5252, 3832 },
+ { 0x5253, 3835 },
+ { 0x541F, 3838 },
+ { 0x541C, 3841 },
+ { 0x541D, 3844 },
+ { 0x5422, 3847 },
+ { 0x5420, 3850 },
+ { 0x542B, 3853 },
+ { 0x5230, 3856 },
+ { 0x5238, 3859 },
+ { 0x5236, 3862 },
+ { 0x5244, 3865 },
+ { 0x507C, 3868 },
+ { 0x507A, 3871 },
+ { 0x5089, 3874 },
+ { 0x508F, 3877 },
+ { 0x5155, 3880 },
+ { 0x5166, 3883 },
+ { 0x525F, 3886 },
+ { 0x525D, 3889 },
+ { 0x5264, 3892 },
+ { 0x5265, 3895 },
+ { 0x5438, 3898 },
+ { 0x5435, 3901 },
+ { 0x5436, 3904 },
+ { 0x5439, 3907 },
+ { 0x5442, 3910 },
+ { 0x5448, 3913 },
+ { 0x53A3, 3916 },
+ { 0x53A9, 3919 },
+ { 0x5451, 3922 },
+ { 0x544E, 3925 },
+ { 0x544F, 3928 },
+ { 0x5454, 3931 },
+ { 0x5452, 3934 },
+ { 0x52F3, 3937 },
+ { 0x52F1, 3940 },
+ { 0x52F8, 3943 },
+ { 0x5301, 3946 },
+ { 0x5307, 3949 },
+ { 0x537E, 3952 },
+ { 0x538C, 3955 },
+ { 0x5392, 3958 },
+ { 0x53B1, 3961 },
+ { 0x53AF, 3964 },
+ { 0x53BE, 3967 },
+ { 0x53C4, 3970 },
+ { 0x5330, 3973 },
+ { 0x532E, 3976 },
+ { 0x5344, 3979 },
+ { 0x534C, 3982 },
+ { 0x534A, 3985 },
+ { 0x5359, 3988 },
+ { 0x535F, 3991 },
+ { 0x52D7, 3994 },
+ { 0x52D4, 3997 },
+ { 0x52D5, 4000 },
+ { 0x52E5, 4003 },
+ { 0x52EB, 4006 },
+ { 0x262C, 4009 },
+ { 0x224C, 4011 },
+ { 0x232E, 4014 },
+ { 0x27D1, 4016 },
+ { 0x235D, 4019 },
+ { 0x2355, 4025 },
+ { 0x2351, 4031 },
+ { 0x2361, 4037 },
+ { 0x2372, 4043 },
+ { 0x2352, 4049 },
+ { 0x236B, 4054 },
+ { 0x2362, 4059 },
+ { 0x235B, 4064 },
+ { 0x2364, 4069 },
+ { 0x2374, 4074 },
+ { 0x2366, 4078 },
+ { 0x234E, 4084 },
+ { 0x234A, 4090 },
+ { 0x2371, 4096 },
+ { 0x2373, 4102 },
+ { 0x2378, 4106 },
+ { 0x2367, 4111 },
+ { 0x2395, 4117 },
+ { 0x2353, 4121 },
+ { 0x2354, 4127 },
+ { 0x233B, 4132 },
+ { 0x236F, 4137 },
+ { 0x234C, 4143 },
+ { 0x2360, 4149 },
+ { 0x234D, 4154 },
+ { 0x2338, 4159 },
+ { 0x2341, 4164 },
+ { 0x233C, 4169 },
+ { 0x2339, 4174 },
+ { 0x233A, 4179 },
+ { 0x2350, 4184 },
+ { 0x2370, 4190 },
+ { 0x2342, 4195 },
+ { 0x2357, 4200 },
+ { 0x2347, 4206 },
+ { 0x2343, 4212 },
+ { 0x2348, 4217 },
+ { 0x2344, 4223 },
+ { 0x2363, 4228 },
+ { 0x237A, 4233 },
+ { 0x2376, 4237 },
+ { 0x236A, 4242 },
+ { 0x234B, 4247 },
+ { 0x2359, 4252 },
+ { 0x2375, 4257 },
+ { 0x2379, 4261 },
+ { 0x235E, 4266 },
+ { 0x2358, 4271 },
+ { 0x233F, 4276 },
+ { 0x236D, 4281 },
+ { 0x2368, 4286 },
+ { 0x236C, 4291 },
+ { 0x233E, 4295 },
+ { 0x235F, 4300 },
+ { 0x233D, 4305 },
+ { 0x235C, 4310 },
+ { 0x2349, 4315 },
+ { 0x2365, 4320 },
+ { 0x2336, 4325 },
+ { 0x2337, 4329 },
+ { 0x235A, 4334 },
+ { 0x2377, 4339 },
+ { 0x234F, 4344 },
+ { 0x2340, 4349 },
+ { 0x2356, 4354 },
+ { 0x2345, 4359 },
+ { 0x236E, 4364 },
+ { 0x2346, 4369 },
+ { 0x2369, 4374 },
+ { 0x2312, 4379 },
+ { 0x2136, 4380 },
+ { 0x29F9, 4382 },
+ { 0x29F8, 4385 },
+ { 0x2540, 4387 },
+ { 0x2526, 4395 },
+ { 0x251A, 4403 },
+ { 0x251E, 4410 },
+ { 0x2516, 4418 },
+ { 0x2538, 4425 },
+ { 0x2548, 4432 },
+ { 0x252A, 4440 },
+ { 0x2519, 4448 },
+ { 0x2522, 4455 },
+ { 0x2515, 4463 },
+ { 0x2537, 4470 },
+ { 0x255C, 4477 },
+ { 0x2559, 4484 },
+ { 0x2568, 4491 },
+ { 0x255B, 4498 },
+ { 0x2558, 4505 },
+ { 0x2567, 4512 },
+ { 0x2541, 4519 },
+ { 0x2527, 4527 },
+ { 0x2512, 4535 },
+ { 0x251F, 4542 },
+ { 0x250E, 4550 },
+ { 0x2530, 4557 },
+ { 0x2547, 4564 },
+ { 0x2529, 4572 },
+ { 0x2511, 4580 },
+ { 0x2521, 4587 },
+ { 0x250D, 4595 },
+ { 0x252F, 4602 },
+ { 0x2556, 4609 },
+ { 0x2553, 4616 },
+ { 0x2565, 4623 },
+ { 0x2555, 4630 },
+ { 0x2552, 4637 },
+ { 0x2564, 4644 },
+ { 0x2543, 4651 },
+ { 0x2545, 4660 },
+ { 0x2535, 4669 },
+ { 0x252D, 4677 },
+ { 0x253D, 4685 },
+ { 0x253A, 4693 },
+ { 0x2532, 4701 },
+ { 0x254A, 4709 },
+ { 0x2579, 4717 },
+ { 0x251B, 4721 },
+ { 0x257F, 4727 },
+ { 0x2517, 4734 },
+ { 0x253B, 4740 },
+ { 0x257B, 4746 },
+ { 0x2513, 4750 },
+ { 0x250F, 4756 },
+ { 0x2533, 4762 },
+ { 0x2578, 4768 },
+ { 0x257E, 4772 },
+ { 0x257A, 4779 },
+ { 0x254F, 4783 },
+ { 0x254D, 4789 },
+ { 0x2507, 4795 },
+ { 0x2505, 4801 },
+ { 0x2503, 4807 },
+ { 0x252B, 4811 },
+ { 0x2523, 4817 },
+ { 0x254B, 4823 },
+ { 0x250B, 4829 },
+ { 0x2509, 4835 },
+ { 0x2501, 4841 },
+ { 0x2575, 4845 },
+ { 0x2518, 4849 },
+ { 0x257D, 4855 },
+ { 0x2514, 4862 },
+ { 0x2534, 4868 },
+ { 0x256F, 4874 },
+ { 0x2570, 4881 },
+ { 0x256E, 4888 },
+ { 0x256D, 4895 },
+ { 0x2577, 4902 },
+ { 0x2510, 4906 },
+ { 0x250C, 4912 },
+ { 0x252C, 4918 },
+ { 0x2574, 4924 },
+ { 0x257C, 4928 },
+ { 0x2576, 4935 },
+ { 0x254E, 4939 },
+ { 0x254C, 4945 },
+ { 0x2506, 4951 },
+ { 0x2504, 4957 },
+ { 0x2573, 4963 },
+ { 0x2572, 4968 },
+ { 0x2571, 4977 },
+ { 0x2502, 4986 },
+ { 0x2524, 4990 },
+ { 0x251C, 4996 },
+ { 0x253C, 5002 },
+ { 0x250A, 5008 },
+ { 0x2508, 5014 },
+ { 0x2500, 5020 },
+ { 0x2544, 5024 },
+ { 0x2546, 5033 },
+ { 0x2536, 5042 },
+ { 0x252E, 5050 },
+ { 0x253E, 5058 },
+ { 0x2539, 5066 },
+ { 0x2531, 5074 },
+ { 0x2549, 5082 },
+ { 0x255D, 5090 },
+ { 0x255A, 5096 },
+ { 0x2569, 5102 },
+ { 0x2557, 5108 },
+ { 0x2554, 5114 },
+ { 0x2566, 5120 },
+ { 0x2551, 5126 },
+ { 0x2563, 5130 },
+ { 0x2560, 5136 },
+ { 0x256C, 5142 },
+ { 0x2550, 5148 },
+ { 0x2528, 5152 },
+ { 0x2520, 5159 },
+ { 0x2542, 5166 },
+ { 0x2525, 5173 },
+ { 0x251D, 5180 },
+ { 0x253F, 5187 },
+ { 0x2562, 5194 },
+ { 0x255F, 5201 },
+ { 0x256B, 5208 },
+ { 0x2561, 5215 },
+ { 0x255E, 5222 },
+ { 0x256A, 5229 },
+ { 0x2627, 5236 },
+ { 0x31D4, 5238 },
+ { 0x31D0, 5241 },
+ { 0x31CF, 5244 },
+ { 0x31D2, 5247 },
+ { 0x31E3, 5250 },
+ { 0x31D1, 5253 },
+ { 0x31C0, 5256 },
+ { 0x31D6, 5259 },
+ { 0x31C7, 5262 },
+ { 0x31D5, 5265 },
+ { 0x31DB, 5268 },
+ { 0x31E2, 5271 },
+ { 0x31DC, 5274 },
+ { 0x31DA, 5277 },
+ { 0x31D3, 5280 },
+ { 0x31D9, 5283 },
+ { 0x31C4, 5286 },
+ { 0x31D7, 5289 },
+ { 0x31DD, 5292 },
+ { 0x31C1, 5295 },
+ { 0x31C2, 5298 },
+ { 0x31C3, 5301 },
+ { 0x31C6, 5304 },
+ { 0x31CA, 5307 },
+ { 0x31CD, 5310 },
+ { 0x31C5, 5313 },
+ { 0x31DF, 5316 },
+ { 0x31D8, 5319 },
+ { 0x31DE, 5322 },
+ { 0x31CC, 5325 },
+ { 0x31E0, 5328 },
+ { 0x31C8, 5331 },
+ { 0x31CB, 5334 },
+ { 0x31CE, 5337 },
+ { 0x31C9, 5340 },
+ { 0x31E1, 5343 },
+ { 0x2E86, 5346 },
+ { 0x2EA7, 5349 },
+ { 0x2EA8, 5352 },
+ { 0x2EDD, 5355 },
+ { 0x2EDE, 5359 },
+ { 0x2EDF, 5363 },
+ { 0x2EB8, 5367 },
+ { 0x2EAB, 5370 },
+ { 0x2EB1, 5373 },
+ { 0x2EB2, 5377 },
+ { 0x2EB4, 5381 },
+ { 0x2EB3, 5385 },
+ { 0x2EB9, 5389 },
+ { 0x2EA4, 5392 },
+ { 0x2EA5, 5396 },
+ { 0x2EB7, 5400 },
+ { 0x2E99, 5403 },
+ { 0x2E9C, 5406 },
+ { 0x2ED8, 5409 },
+ { 0x2EAA, 5412 },
+ { 0x2EE3, 5417 },
+ { 0x2ECF, 5420 },
+ { 0x2EA3, 5423 },
+ { 0x2ECA, 5426 },
+ { 0x2E98, 5429 },
+ { 0x2EE1, 5432 },
+ { 0x2EC7, 5435 },
+ { 0x2EA9, 5438 },
+ { 0x2E8E, 5441 },
+ { 0x2E8F, 5445 },
+ { 0x2E91, 5449 },
+ { 0x2E90, 5453 },
+ { 0x2ED1, 5457 },
+ { 0x2ED2, 5461 },
+ { 0x2EBC, 5465 },
+ { 0x2EB5, 5468 },
+ { 0x2E9D, 5471 },
+ { 0x2ED7, 5474 },
+ { 0x2E8B, 5477 },
+ { 0x2EAF, 5480 },
+ { 0x2ECD, 5483 },
+ { 0x2ECE, 5487 },
+ { 0x2EC3, 5491 },
+ { 0x2EC4, 5495 },
+ { 0x2EBA, 5499 },
+ { 0x2EBB, 5503 },
+ { 0x2E9B, 5507 },
+ { 0x2E81, 5510 },
+ { 0x2E9E, 5513 },
+ { 0x2EE4, 5516 },
+ { 0x2EBE, 5519 },
+ { 0x2EBF, 5523 },
+ { 0x2EC0, 5527 },
+ { 0x2E96, 5531 },
+ { 0x2E97, 5535 },
+ { 0x2E88, 5539 },
+ { 0x2E89, 5543 },
+ { 0x2ED5, 5547 },
+ { 0x2ED6, 5551 },
+ { 0x2EB6, 5555 },
+ { 0x2E8C, 5558 },
+ { 0x2E8D, 5562 },
+ { 0x2E92, 5566 },
+ { 0x2E94, 5569 },
+ { 0x2E95, 5573 },
+ { 0x2E87, 5577 },
+ { 0x2EC1, 5580 },
+ { 0x2EA1, 5583 },
+ { 0x2EA2, 5587 },
+ { 0x2EAE, 5591 },
+ { 0x2EBD, 5594 },
+ { 0x2E9F, 5597 },
+ { 0x2E85, 5600 },
+ { 0x2E80, 5603 },
+ { 0x2E82, 5606 },
+ { 0x2E83, 5610 },
+ { 0x2E84, 5614 },
+ { 0x2EAC, 5618 },
+ { 0x2EAD, 5622 },
+ { 0x2E93, 5626 },
+ { 0x2EF1, 5629 },
+ { 0x2EC2, 5632 },
+ { 0x2EA0, 5635 },
+ { 0x2E8A, 5638 },
+ { 0x2EA6, 5641 },
+ { 0x2EC6, 5647 },
+ { 0x2ECC, 5651 },
+ { 0x2EE8, 5655 },
+ { 0x2EE9, 5659 },
+ { 0x2EE0, 5663 },
+ { 0x2EDC, 5667 },
+ { 0x2EC5, 5671 },
+ { 0x2EE6, 5675 },
+ { 0x2ECB, 5679 },
+ { 0x2EEC, 5683 },
+ { 0x2EE5, 5687 },
+ { 0x2EEA, 5691 },
+ { 0x2ED4, 5695 },
+ { 0x2ED0, 5699 },
+ { 0x2EDA, 5703 },
+ { 0x2ED3, 5707 },
+ { 0x2EE7, 5711 },
+ { 0x2EB0, 5715 },
+ { 0x2EDB, 5719 },
+ { 0x2EE2, 5723 },
+ { 0x2EC9, 5727 },
+ { 0x2EEE, 5731 },
+ { 0x2EF0, 5735 },
+ { 0x2EC8, 5739 },
+ { 0x2ED9, 5743 },
+ { 0x2EF3, 5748 },
+ { 0x2EEB, 5752 },
+ { 0x2EED, 5756 },
+ { 0x2EEF, 5760 },
+ { 0x2EF2, 5764 },
+ { 0x2680, 5768 },
+ { 0x2681, 5770 },
+ { 0x2682, 5772 },
+ { 0x2683, 5774 },
+ { 0x2684, 5776 },
+ { 0x2685, 5778 },
+ { 0x2214, 5780 },
+ { 0x02D9, 5782 },
+ { 0x2238, 5784 },
+ { 0x22C5, 5786 },
+ { 0x220E, 5788 },
+ { 0x2200, 5791 },
+ { 0x2668, 5793 },
+ { 0x2615, 5795 },
+ { 0x20AD, 5797 },
+ { 0x0EDD, 5799 },
+ { 0x0EDC, 5802 },
+ { 0x0EC6, 5805 },
+ { 0x0EC8, 5808 },
+ { 0x0ECA, 5812 },
+ { 0x0EC9, 5816 },
+ { 0x0ECB, 5820 },
+ { 0x0ED1, 5824 },
+ { 0x0ED6, 5827 },
+ { 0x0ED2, 5830 },
+ { 0x0ED5, 5833 },
+ { 0x0ED4, 5836 },
+ { 0x0ED9, 5839 },
+ { 0x0ED0, 5842 },
+ { 0x0ED8, 5845 },
+ { 0x0ED7, 5848 },
+ { 0x0ED3, 5851 },
+ { 0x0EB0, 5854 },
+ { 0x0EC0, 5858 },
+ { 0x0EB4, 5862 },
+ { 0x0EC2, 5866 },
+ { 0x0EB8, 5870 },
+ { 0x0EB6, 5874 },
+ { 0x0EB2, 5878 },
+ { 0x0EC4, 5882 },
+ { 0x0EB3, 5886 },
+ { 0x0EC3, 5890 },
+ { 0x0EC1, 5894 },
+ { 0x0EB5, 5898 },
+ { 0x0EB9, 5902 },
+ { 0x0EB7, 5906 },
+ { 0x0EB1, 5910 },
+ { 0x0EBB, 5915 },
+ { 0x0EAD, 5920 },
+ { 0x0E9A, 5923 },
+ { 0x0E88, 5926 },
+ { 0x0E94, 5929 },
+ { 0x0E9D, 5932 },
+ { 0x0E9F, 5936 },
+ { 0x0EAE, 5940 },
+ { 0x0EAB, 5944 },
+ { 0x0E81, 5948 },
+ { 0x0EA3, 5951 },
+ { 0x0EA5, 5955 },
+ { 0x0EA1, 5959 },
+ { 0x0E99, 5962 },
+ { 0x0E9B, 5965 },
+ { 0x0E8A, 5968 },
+ { 0x0EAA, 5972 },
+ { 0x0E95, 5976 },
+ { 0x0EA7, 5979 },
+ { 0x0EA2, 5982 },
+ { 0x0E84, 5985 },
+ { 0x0E82, 5989 },
+ { 0x0E87, 5993 },
+ { 0x0E8D, 5996 },
+ { 0x0E9E, 5999 },
+ { 0x0E9C, 6003 },
+ { 0x0E97, 6007 },
+ { 0x0E96, 6011 },
+ { 0x0EAF, 6015 },
+ { 0x0ECD, 6017 },
+ { 0x0EBC, 6019 },
+ { 0x0EBD, 6023 },
+ { 0x0ECC, 6027 },
+ { 0x264C, 6030 },
+ { 0x005F, 6031 },
+ { 0x301F, 6033 },
+ { 0x204E, 6038 },
+ { 0x19DE, 6040 },
+ { 0x19DF, 6045 },
+ { 0x19C8, 6050 },
+ { 0x19C9, 6055 },
+ { 0x19D1, 6060 },
+ { 0x19D6, 6065 },
+ { 0x19D2, 6070 },
+ { 0x19D5, 6075 },
+ { 0x19D4, 6080 },
+ { 0x19D9, 6085 },
+ { 0x19D0, 6090 },
+ { 0x19D8, 6095 },
+ { 0x19D7, 6100 },
+ { 0x19D3, 6105 },
+ { 0x19B5, 6110 },
+ { 0x19B7, 6116 },
+ { 0x19B3, 6122 },
+ { 0x19B1, 6128 },
+ { 0x19B6, 6134 },
+ { 0x19BA, 6140 },
+ { 0x19B2, 6146 },
+ { 0x19C0, 6152 },
+ { 0x19B8, 6158 },
+ { 0x19BD, 6164 },
+ { 0x19B9, 6170 },
+ { 0x19B4, 6176 },
+ { 0x19BC, 6182 },
+ { 0x19BB, 6188 },
+ { 0x19BE, 6194 },
+ { 0x19BF, 6200 },
+ { 0x19B0, 6206 },
+ { 0x19A5, 6213 },
+ { 0x19A4, 6219 },
+ { 0x199D, 6225 },
+ { 0x19A3, 6231 },
+ { 0x1985, 6237 },
+ { 0x199F, 6243 },
+ { 0x1999, 6249 },
+ { 0x1993, 6255 },
+ { 0x1997, 6261 },
+ { 0x1981, 6267 },
+ { 0x198C, 6273 },
+ { 0x1991, 6279 },
+ { 0x199E, 6285 },
+ { 0x1986, 6291 },
+ { 0x198D, 6297 },
+ { 0x19A8, 6303 },
+ { 0x1987, 6309 },
+ { 0x1998, 6315 },
+ { 0x1992, 6321 },
+ { 0x198B, 6327 },
+ { 0x19A9, 6333 },
+ { 0x19A2, 6339 },
+ { 0x19A1, 6345 },
+ { 0x199A, 6351 },
+ { 0x19A0, 6357 },
+ { 0x1982, 6363 },
+ { 0x199C, 6369 },
+ { 0x1996, 6375 },
+ { 0x1990, 6381 },
+ { 0x1994, 6387 },
+ { 0x1980, 6393 },
+ { 0x1989, 6399 },
+ { 0x198E, 6405 },
+ { 0x199B, 6411 },
+ { 0x1983, 6417 },
+ { 0x198A, 6423 },
+ { 0x19A6, 6429 },
+ { 0x1984, 6435 },
+ { 0x1995, 6441 },
+ { 0x198F, 6447 },
+ { 0x1988, 6453 },
+ { 0x19A7, 6459 },
+ { 0x19C7, 6465 },
+ { 0x19C6, 6471 },
+ { 0x19C5, 6477 },
+ { 0x19C4, 6483 },
+ { 0x19C3, 6489 },
+ { 0x19C1, 6495 },
+ { 0x19C2, 6501 },
+ { 0x20AA, 6507 },
+ { 0x07F5, 6510 },
+ { 0x07F4, 6514 },
+ { 0x07F8, 6518 },
+ { 0x07C1, 6520 },
+ { 0x07C6, 6523 },
+ { 0x07C2, 6526 },
+ { 0x07C5, 6529 },
+ { 0x07C4, 6532 },
+ { 0x07C9, 6535 },
+ { 0x07C0, 6538 },
+ { 0x07C8, 6541 },
+ { 0x07C7, 6544 },
+ { 0x07C3, 6547 },
+ { 0x07CA, 6550 },
+ { 0x07CD, 6553 },
+ { 0x07CC, 6556 },
+ { 0x07D2, 6559 },
+ { 0x07D0, 6562 },
+ { 0x07CE, 6565 },
+ { 0x07D3, 6568 },
+ { 0x07D8, 6571 },
+ { 0x07CB, 6574 },
+ { 0x07DD, 6577 },
+ { 0x07E4, 6580 },
+ { 0x07D6, 6583 },
+ { 0x07DE, 6586 },
+ { 0x07DF, 6589 },
+ { 0x07E1, 6592 },
+ { 0x07E3, 6595 },
+ { 0x07E0, 6598 },
+ { 0x07CF, 6602 },
+ { 0x07D4, 6605 },
+ { 0x07D9, 6608 },
+ { 0x07DB, 6611 },
+ { 0x07D5, 6614 },
+ { 0x07E5, 6617 },
+ { 0x07E6, 6620 },
+ { 0x07D7, 6623 },
+ { 0x07DC, 6626 },
+ { 0x07E2, 6629 },
+ { 0x07E7, 6632 },
+ { 0x07DA, 6636 },
+ { 0x07E8, 6639 },
+ { 0x07EA, 6643 },
+ { 0x07E9, 6647 },
+ { 0x07D1, 6651 },
+ { 0x07F6, 6654 },
+ { 0x07F7, 6658 },
+ { 0x07F0, 6661 },
+ { 0x07EF, 6666 },
+ { 0x07F1, 6671 },
+ { 0x07EE, 6676 },
+ { 0x07EC, 6681 },
+ { 0x07EB, 6686 },
+ { 0x07ED, 6691 },
+ { 0x07F3, 6696 },
+ { 0x07F2, 6701 },
+ { 0x07FA, 6705 },
+ { 0x07F9, 6707 },
+ { 0x22BD, 6710 },
+ { 0x2284, 6711 },
+ { 0x2285, 6715 },
+ { 0x2209, 6719 },
+ { 0x00AC, 6723 },
+ { 0x22AD, 6725 },
+ { 0x237B, 6727 },
+ { 0x2260, 6730 },
+ { 0x2241, 6733 },
+ { 0x2249, 6735 },
+ { 0x22EA, 6739 },
+ { 0x22EC, 6743 },
+ { 0x22E2, 6750 },
+ { 0x22E3, 6757 },
+ { 0x2226, 6764 },
+ { 0x2262, 6767 },
+ { 0x226E, 6770 },
+ { 0x226D, 6772 },
+ { 0x226F, 6775 },
+ { 0x2244, 6777 },
+ { 0x2445, 6781 },
+ { 0x2444, 6784 },
+ { 0x2448, 6787 },
+ { 0x2442, 6789 },
+ { 0x2440, 6791 },
+ { 0x2441, 6793 },
+ { 0x2447, 6795 },
+ { 0x2446, 6799 },
+ { 0x244A, 6803 },
+ { 0x2449, 6806 },
+ { 0x2443, 6810 },
+ { 0x2126, 6813 },
+ { 0x7300, 6815 },
+ { 0x7304, 6819 },
+ { 0x7309, 6823 },
+ { 0x730F, 6827 },
+ { 0x7316, 6831 },
+ { 0x7301, 6835 },
+ { 0x7303, 6839 },
+ { 0x731A, 6843 },
+ { 0x730B, 6847 },
+ { 0x730C, 6851 },
+ { 0x730D, 6855 },
+ { 0x7313, 6859 },
+ { 0x7314, 6863 },
+ { 0x7307, 6867 },
+ { 0x731D, 6871 },
+ { 0x730A, 6875 },
+ { 0x7302, 6879 },
+ { 0x7312, 6883 },
+ { 0x7310, 6887 },
+ { 0x7315, 6891 },
+ { 0x731E, 6895 },
+ { 0x7305, 6899 },
+ { 0x7306, 6903 },
+ { 0x731C, 6907 },
+ { 0x7317, 6911 },
+ { 0x731B, 6915 },
+ { 0x730E, 6919 },
+ { 0x7319, 6923 },
+ { 0x7318, 6927 },
+ { 0x7311, 6931 },
+ { 0x7308, 6935 },
+ { 0x7320, 6939 },
+ { 0x7322, 6943 },
+ { 0x7321, 6947 },
+ { 0x7323, 6951 },
+ { 0x73A0, 6955 },
+ { 0x73A1, 6959 },
+ { 0x73A2, 6963 },
+ { 0x73B2, 6967 },
+ { 0x73A8, 6971 },
+ { 0x73AD, 6975 },
+ { 0x73AE, 6979 },
+ { 0x73AF, 6983 },
+ { 0x73B3, 6987 },
+ { 0x73A5, 6991 },
+ { 0x73A6, 6995 },
+ { 0x73C3, 6999 },
+ { 0x73A9, 7003 },
+ { 0x73AA, 7007 },
+ { 0x73A3, 7011 },
+ { 0x73A4, 7015 },
+ { 0x73BE, 7019 },
+ { 0x73B6, 7023 },
+ { 0x73B7, 7027 },
+ { 0x73B8, 7031 },
+ { 0x73B4, 7035 },
+ { 0x73B5, 7039 },
+ { 0x73B1, 7043 },
+ { 0x73BC, 7047 },
+ { 0x73BD, 7051 },
+ { 0x73BF, 7055 },
+ { 0x73AB, 7059 },
+ { 0x73AC, 7063 },
+ { 0x73BA, 7067 },
+ { 0x73BB, 7071 },
+ { 0x73A7, 7075 },
+ { 0x73B9, 7079 },
+ { 0x73C0, 7083 },
+ { 0x73C1, 7087 },
+ { 0x73C2, 7091 },
+ { 0x73B0, 7095 },
+ { 0x73CE, 7099 },
+ { 0x73CF, 7103 },
+ { 0x73CC, 7107 },
+ { 0x73C8, 7111 },
+ { 0x73CD, 7115 },
+ { 0x73C9, 7119 },
+ { 0x73CA, 7123 },
+ { 0x73CB, 7127 },
+ { 0x73D0, 7131 },
+ { 0x73D1, 7135 },
+ { 0x73D3, 7139 },
+ { 0x73D2, 7143 },
+ { 0x73D4, 7147 },
+ { 0x73D5, 7151 },
+ { 0x2E2B, 7155 },
+ { 0x2024, 7161 },
+ { 0x2031, 7164 },
+ { 0x214C, 7168 },
+ { 0x2030, 7170 },
+ { 0x202C, 7173 },
+ { 0x2216, 7176 },
+ { 0x2736, 7178 },
+ { 0x273E, 7182 },
+ { 0x2609, 7188 },
+ { 0xC05F, 7189 },
+ { 0xC02E, 7192 },
+ { 0xC07B, 7195 },
+ { 0xC05B, 7199 },
+ { 0xC028, 7203 },
+ { 0xC02B, 7206 },
+ { 0xC03A, 7209 },
+ { 0xC02C, 7211 },
+ { 0xC031, 7213 },
+ { 0xC036, 7216 },
+ { 0xC032, 7219 },
+ { 0xC035, 7222 },
+ { 0xC034, 7225 },
+ { 0xC039, 7228 },
+ { 0xC030, 7231 },
+ { 0xC038, 7234 },
+ { 0xC037, 7237 },
+ { 0xC033, 7240 },
+ { 0xC060, 7243 },
+ { 0xC061, 7246 },
+ { 0xC062, 7251 },
+ { 0xC063, 7256 },
+ { 0xC064, 7261 },
+ { 0xC065, 7266 },
+ { 0xC066, 7271 },
+ { 0xC067, 7276 },
+ { 0xC068, 7281 },
+ { 0xC069, 7286 },
+ { 0xC06A, 7291 },
+ { 0xC06B, 7296 },
+ { 0xC06C, 7301 },
+ { 0xC06D, 7306 },
+ { 0xC06E, 7311 },
+ { 0xC06F, 7316 },
+ { 0xC070, 7321 },
+ { 0xC071, 7326 },
+ { 0xC072, 7331 },
+ { 0xC073, 7336 },
+ { 0xC074, 7341 },
+ { 0xC075, 7346 },
+ { 0xC076, 7351 },
+ { 0xC077, 7356 },
+ { 0xC078, 7361 },
+ { 0xC079, 7366 },
+ { 0xC07A, 7371 },
+ { 0xC041, 7376 },
+ { 0xC042, 7381 },
+ { 0xC043, 7386 },
+ { 0xC044, 7391 },
+ { 0xC045, 7396 },
+ { 0xC046, 7401 },
+ { 0xC047, 7406 },
+ { 0xC048, 7411 },
+ { 0xC049, 7416 },
+ { 0xC04A, 7421 },
+ { 0xC04B, 7426 },
+ { 0xC04C, 7431 },
+ { 0xC04D, 7436 },
+ { 0xC04E, 7441 },
+ { 0xC04F, 7446 },
+ { 0xC050, 7451 },
+ { 0xC051, 7456 },
+ { 0xC052, 7461 },
+ { 0xC053, 7466 },
+ { 0xC054, 7471 },
+ { 0xC055, 7476 },
+ { 0xC056, 7481 },
+ { 0xC057, 7486 },
+ { 0xC058, 7491 },
+ { 0xC059, 7496 },
+ { 0xC05A, 7501 },
+ { 0xC07D, 7506 },
+ { 0xC05D, 7510 },
+ { 0xC029, 7514 },
+ { 0xC020, 7517 },
+ { 0xC07E, 7519 },
+ { 0xC024, 7521 },
+ { 0xC03D, 7524 },
+ { 0xC023, 7527 },
+ { 0xC025, 7530 },
+ { 0xC05C, 7533 },
+ { 0xC02F, 7536 },
+ { 0xC02A, 7538 },
+ { 0xC03F, 7540 },
+ { 0xC07C, 7543 },
+ { 0xC026, 7546 },
+ { 0xC03C, 7548 },
+ { 0xC022, 7551 },
+ { 0xC03B, 7554 },
+ { 0xC027, 7556 },
+ { 0xC05E, 7558 },
+ { 0xC040, 7561 },
+ { 0xC021, 7564 },
+ { 0xC03E, 7567 },
+ { 0xC02D, 7570 },
+ { 0x1963, 7572 },
+ { 0x196B, 7576 },
+ { 0x1964, 7580 },
+ { 0x1969, 7584 },
+ { 0x1967, 7588 },
+ { 0x196D, 7592 },
+ { 0x1965, 7596 },
+ { 0x1966, 7600 },
+ { 0x195C, 7604 },
+ { 0x195E, 7608 },
+ { 0x1950, 7612 },
+ { 0x1958, 7616 },
+ { 0x195B, 7620 },
+ { 0x1962, 7624 },
+ { 0x1968, 7628 },
+ { 0x1959, 7632 },
+ { 0x195F, 7636 },
+ { 0x1954, 7640 },
+ { 0x1956, 7644 },
+ { 0x196A, 7648 },
+ { 0x195D, 7652 },
+ { 0x1951, 7656 },
+ { 0x1955, 7660 },
+ { 0x196C, 7664 },
+ { 0x1960, 7668 },
+ { 0x1952, 7672 },
+ { 0x195A, 7676 },
+ { 0x1957, 7680 },
+ { 0x1953, 7684 },
+ { 0x1961, 7688 },
+ { 0x1970, 7692 },
+ { 0x1971, 7696 },
+ { 0x1972, 7700 },
+ { 0x1973, 7704 },
+ { 0x1974, 7708 },
+ { 0x29DD, 7712 },
+ { 0x293C, 7715 },
+ { 0x293A, 7721 },
+ { 0x293D, 7725 },
+ { 0x2320, 7731 },
+ { 0x230F, 7734 },
+ { 0x2E22, 7737 },
+ { 0x231C, 7741 },
+ { 0x23DE, 7744 },
+ { 0x230E, 7747 },
+ { 0x2E23, 7750 },
+ { 0x231D, 7754 },
+ { 0x23B4, 7757 },
+ { 0x23E0, 7760 },
+ { 0x23DC, 7764 },
+ { 0x2025, 7766 },
+ { 0x205A, 7769 },
+ { 0x2E2A, 7772 },
+ { 0x29C9, 7778 },
+ { 0x2A08, 7781 },
+ { 0x2A07, 7785 },
+ { 0x2051, 7789 },
+ { 0x2A75, 7793 },
+ { 0x2A56, 7797 },
+ { 0x2A55, 7801 },
+ { 0x560E, 7805 },
+ { 0x560D, 7808 },
+ { 0x5621, 7810 },
+ { 0x5626, 7813 },
+ { 0x5622, 7816 },
+ { 0x5625, 7819 },
+ { 0x5624, 7822 },
+ { 0x5629, 7825 },
+ { 0x5620, 7828 },
+ { 0x5628, 7831 },
+ { 0x5627, 7834 },
+ { 0x5623, 7837 },
+ { 0x5618, 7840 },
+ { 0x5616, 7843 },
+ { 0x5619, 7846 },
+ { 0x5617, 7849 },
+ { 0x561A, 7852 },
+ { 0x561E, 7855 },
+ { 0x561F, 7858 },
+ { 0x561C, 7861 },
+ { 0x5615, 7864 },
+ { 0x561D, 7867 },
+ { 0x561B, 7870 },
+ { 0x5613, 7873 },
+ { 0x5614, 7876 },
+ { 0x560F, 7879 },
+ { 0x5549, 7882 },
+ { 0x55E1, 7885 },
+ { 0x5524, 7888 },
+ { 0x55BA, 7891 },
+ { 0x5595, 7894 },
+ { 0x554A, 7897 },
+ { 0x5552, 7900 },
+ { 0x55EA, 7903 },
+ { 0x552C, 7906 },
+ { 0x55C3, 7909 },
+ { 0x559D, 7912 },
+ { 0x5566, 7915 },
+ { 0x55FF, 7918 },
+ { 0x553F, 7921 },
+ { 0x55D7, 7924 },
+ { 0x55B0, 7927 },
+ { 0x5560, 7930 },
+ { 0x55F9, 7933 },
+ { 0x5539, 7936 },
+ { 0x55D1, 7939 },
+ { 0x55AA, 7942 },
+ { 0x5500, 7945 },
+ { 0x55E2, 7948 },
+ { 0x5558, 7951 },
+ { 0x55F1, 7954 },
+ { 0x5531, 7957 },
+ { 0x55C9, 7960 },
+ { 0x55A2, 7963 },
+ { 0x556D, 7966 },
+ { 0x5606, 7969 },
+ { 0x5545, 7972 },
+ { 0x55DD, 7975 },
+ { 0x55B6, 7978 },
+ { 0x554C, 7981 },
+ { 0x55E4, 7984 },
+ { 0x5526, 7987 },
+ { 0x55BD, 7990 },
+ { 0x5597, 7993 },
+ { 0x5525, 7996 },
+ { 0x5567, 7999 },
+ { 0x5600, 8002 },
+ { 0x5540, 8005 },
+ { 0x55D8, 8008 },
+ { 0x55B1, 8011 },
+ { 0x556A, 8014 },
+ { 0x5603, 8017 },
+ { 0x5543, 8020 },
+ { 0x55DB, 8023 },
+ { 0x55B4, 8026 },
+ { 0x555E, 8029 },
+ { 0x55F7, 8032 },
+ { 0x5537, 8035 },
+ { 0x55CF, 8038 },
+ { 0x55A8, 8041 },
+ { 0x556E, 8044 },
+ { 0x5608, 8047 },
+ { 0x5546, 8050 },
+ { 0x55DE, 8053 },
+ { 0x55B7, 8056 },
+ { 0x556F, 8059 },
+ { 0x5609, 8062 },
+ { 0x560B, 8065 },
+ { 0x5547, 8068 },
+ { 0x55DF, 8071 },
+ { 0x55B8, 8074 },
+ { 0x55BB, 8077 },
+ { 0x5571, 8080 },
+ { 0x5550, 8083 },
+ { 0x55E8, 8086 },
+ { 0x552A, 8089 },
+ { 0x55C1, 8092 },
+ { 0x559B, 8095 },
+ { 0x555F, 8098 },
+ { 0x55F8, 8101 },
+ { 0x5538, 8104 },
+ { 0x55D0, 8107 },
+ { 0x55A9, 8110 },
+ { 0x5562, 8113 },
+ { 0x55FB, 8116 },
+ { 0x553B, 8119 },
+ { 0x55D3, 8122 },
+ { 0x55AC, 8125 },
+ { 0x555A, 8128 },
+ { 0x55F3, 8131 },
+ { 0x5533, 8134 },
+ { 0x55CB, 8137 },
+ { 0x55A4, 8140 },
+ { 0x5596, 8143 },
+ { 0x5559, 8146 },
+ { 0x55F2, 8149 },
+ { 0x5532, 8152 },
+ { 0x55CA, 8155 },
+ { 0x55A3, 8158 },
+ { 0x554E, 8161 },
+ { 0x55E6, 8164 },
+ { 0x5528, 8167 },
+ { 0x55BF, 8170 },
+ { 0x5599, 8173 },
+ { 0x5569, 8176 },
+ { 0x5602, 8179 },
+ { 0x5542, 8182 },
+ { 0x55DA, 8185 },
+ { 0x55B3, 8188 },
+ { 0x5564, 8191 },
+ { 0x55FD, 8194 },
+ { 0x553D, 8197 },
+ { 0x55D5, 8200 },
+ { 0x55AE, 8203 },
+ { 0x5507, 8206 },
+ { 0x5551, 8209 },
+ { 0x55E9, 8212 },
+ { 0x552B, 8215 },
+ { 0x55C2, 8218 },
+ { 0x559C, 8221 },
+ { 0x5578, 8224 },
+ { 0x551A, 8227 },
+ { 0x558B, 8230 },
+ { 0x5514, 8233 },
+ { 0x555C, 8236 },
+ { 0x55F5, 8239 },
+ { 0x5535, 8242 },
+ { 0x55CD, 8245 },
+ { 0x55A6, 8248 },
+ { 0x5585, 8251 },
+ { 0x5501, 8254 },
+ { 0x550C, 8257 },
+ { 0x557D, 8260 },
+ { 0x5557, 8263 },
+ { 0x55EF, 8266 },
+ { 0x5530, 8269 },
+ { 0x55C7, 8272 },
+ { 0x55A1, 8275 },
+ { 0x5520, 8278 },
+ { 0x5607, 8281 },
+ { 0x5591, 8284 },
+ { 0x554D, 8287 },
+ { 0x5502, 8290 },
+ { 0x55E5, 8293 },
+ { 0x5527, 8296 },
+ { 0x55BE, 8299 },
+ { 0x5573, 8302 },
+ { 0x5598, 8305 },
+ { 0x551B, 8308 },
+ { 0x558C, 8311 },
+ { 0x556B, 8314 },
+ { 0x551E, 8317 },
+ { 0x558F, 8320 },
+ { 0x5554, 8323 },
+ { 0x55EC, 8326 },
+ { 0x552E, 8329 },
+ { 0x55C5, 8332 },
+ { 0x559F, 8335 },
+ { 0x5512, 8338 },
+ { 0x5583, 8341 },
+ { 0x5553, 8344 },
+ { 0x55EB, 8347 },
+ { 0x552D, 8350 },
+ { 0x55C4, 8353 },
+ { 0x559E, 8356 },
+ { 0x5521, 8359 },
+ { 0x5592, 8362 },
+ { 0x5561, 8365 },
+ { 0x55FA, 8368 },
+ { 0x553A, 8371 },
+ { 0x55D2, 8374 },
+ { 0x55AB, 8377 },
+ { 0x5522, 8380 },
+ { 0x5568, 8383 },
+ { 0x5601, 8386 },
+ { 0x5541, 8389 },
+ { 0x55D9, 8392 },
+ { 0x55B2, 8395 },
+ { 0x5593, 8398 },
+ { 0x5570, 8401 },
+ { 0x560A, 8404 },
+ { 0x5548, 8407 },
+ { 0x55E0, 8410 },
+ { 0x55B9, 8413 },
+ { 0x5572, 8416 },
+ { 0x5505, 8419 },
+ { 0x5576, 8422 },
+ { 0x5513, 8425 },
+ { 0x5584, 8428 },
+ { 0x5516, 8431 },
+ { 0x5563, 8434 },
+ { 0x55FC, 8437 },
+ { 0x553C, 8440 },
+ { 0x55D4, 8443 },
+ { 0x55AD, 8446 },
+ { 0x5587, 8449 },
+ { 0x550E, 8452 },
+ { 0x555B, 8455 },
+ { 0x55F4, 8458 },
+ { 0x5534, 8461 },
+ { 0x55CC, 8464 },
+ { 0x55A5, 8467 },
+ { 0x557F, 8470 },
+ { 0x550D, 8473 },
+ { 0x557E, 8476 },
+ { 0x554F, 8479 },
+ { 0x5503, 8482 },
+ { 0x55E7, 8485 },
+ { 0x5529, 8488 },
+ { 0x55C0, 8491 },
+ { 0x5574, 8494 },
+ { 0x559A, 8497 },
+ { 0x551D, 8500 },
+ { 0x558E, 8503 },
+ { 0x5518, 8506 },
+ { 0x5565, 8509 },
+ { 0x55FE, 8512 },
+ { 0x553E, 8515 },
+ { 0x55D6, 8518 },
+ { 0x55AF, 8521 },
+ { 0x5589, 8524 },
+ { 0x5506, 8527 },
+ { 0x5577, 8530 },
+ { 0x5510, 8533 },
+ { 0x555D, 8536 },
+ { 0x55F6, 8539 },
+ { 0x5536, 8542 },
+ { 0x55CE, 8545 },
+ { 0x55A7, 8548 },
+ { 0x5581, 8551 },
+ { 0x550B, 8554 },
+ { 0x55F0, 8557 },
+ { 0x55C8, 8560 },
+ { 0x557C, 8563 },
+ { 0x5555, 8566 },
+ { 0x5509, 8569 },
+ { 0x55ED, 8572 },
+ { 0x557A, 8575 },
+ { 0x5508, 8578 },
+ { 0x5579, 8581 },
+ { 0x5556, 8584 },
+ { 0x55EE, 8587 },
+ { 0x552F, 8590 },
+ { 0x55C6, 8593 },
+ { 0x55A0, 8596 },
+ { 0x5515, 8599 },
+ { 0x5586, 8602 },
+ { 0x554B, 8605 },
+ { 0x55E3, 8608 },
+ { 0x556C, 8611 },
+ { 0x5604, 8614 },
+ { 0x5544, 8617 },
+ { 0x55DC, 8620 },
+ { 0x55B5, 8623 },
+ { 0x55BC, 8626 },
+ { 0x551C, 8629 },
+ { 0x558D, 8632 },
+ { 0x5523, 8635 },
+ { 0x5594, 8638 },
+ { 0x5517, 8641 },
+ { 0x5588, 8644 },
+ { 0x550F, 8647 },
+ { 0x5580, 8650 },
+ { 0x5504, 8653 },
+ { 0x5575, 8656 },
+ { 0x5519, 8659 },
+ { 0x558A, 8662 },
+ { 0x5511, 8665 },
+ { 0x5582, 8668 },
+ { 0x550A, 8671 },
+ { 0x557B, 8674 },
+ { 0x562B, 8677 },
+ { 0x5610, 8681 },
+ { 0x5611, 8685 },
+ { 0x562A, 8689 },
+ { 0x5612, 8693 },
+ { 0x551F, 8697 },
+ { 0x5605, 8700 },
+ { 0x5590, 8703 },
+ { 0x560C, 8706 },
+ { 0x20A9, 8709 },
+ { 0x22BB, 8711 },
+ { 0x00A5, 8712 },
+ { 0x262F, 8714 },
+ { 0x2135, 8716 },
+ { 0x2625, 8718 },
+ { 0x269B, 8719 },
+ { 0x237E, 8721 },
+ { 0x2106, 8723 },
+ { 0x2105, 8725 },
+ { 0x20B5, 8727 },
+ { 0x00A2, 8729 },
+ { 0x5A51, 8731 },
+ { 0x5A56, 8734 },
+ { 0x5A52, 8737 },
+ { 0x5A55, 8740 },
+ { 0x5A54, 8743 },
+ { 0x5A59, 8746 },
+ { 0x5A50, 8749 },
+ { 0x5A58, 8752 },
+ { 0x5A57, 8755 },
+ { 0x5A53, 8758 },
+ { 0x5A2A, 8761 },
+ { 0x5A2F, 8765 },
+ { 0x5A2D, 8769 },
+ { 0x5A29, 8773 },
+ { 0x5A30, 8777 },
+ { 0x5A31, 8781 },
+ { 0x5A2C, 8785 },
+ { 0x5A2B, 8789 },
+ { 0x5A2E, 8793 },
+ { 0x5A32, 8797 },
+ { 0x5A00, 8801 },
+ { 0x5A03, 8804 },
+ { 0x5A01, 8807 },
+ { 0x5A05, 8810 },
+ { 0x5A02, 8813 },
+ { 0x5A04, 8816 },
+ { 0x5A1D, 8819 },
+ { 0x5A15, 8822 },
+ { 0x5A08, 8825 },
+ { 0x5A28, 8828 },
+ { 0x5A0E, 8831 },
+ { 0x5A06, 8834 },
+ { 0x5A24, 8837 },
+ { 0x5A20, 8840 },
+ { 0x5A18, 8843 },
+ { 0x5A1A, 8846 },
+ { 0x5A23, 8849 },
+ { 0x5A27, 8852 },
+ { 0x5A13, 8855 },
+ { 0x5A25, 8858 },
+ { 0x5A22, 8861 },
+ { 0x5A21, 8864 },
+ { 0x5A1E, 8867 },
+ { 0x5A0C, 8870 },
+ { 0x5A19, 8873 },
+ { 0x5A16, 8876 },
+ { 0x5A09, 8879 },
+ { 0x5A0F, 8882 },
+ { 0x5A07, 8885 },
+ { 0x5A1F, 8888 },
+ { 0x5A0B, 8891 },
+ { 0x5A11, 8894 },
+ { 0x5A17, 8897 },
+ { 0x5A1C, 8900 },
+ { 0x5A1B, 8903 },
+ { 0x5A26, 8906 },
+ { 0x5A14, 8909 },
+ { 0x5A0D, 8912 },
+ { 0x5A0A, 8915 },
+ { 0x5A12, 8918 },
+ { 0x5A10, 8921 },
+ { 0x5A41, 8924 },
+ { 0x5A40, 8928 },
+ { 0x5A4A, 8932 },
+ { 0x5A46, 8936 },
+ { 0x5A47, 8940 },
+ { 0x5A49, 8944 },
+ { 0x5A45, 8948 },
+ { 0x5A48, 8952 },
+ { 0x5A44, 8956 },
+ { 0x5A42, 8960 },
+ { 0x5A4B, 8964 },
+ { 0x5A35, 8968 },
+ { 0x5A34, 8972 },
+ { 0x5A36, 8976 },
+ { 0x5A33, 8980 },
+ { 0x5A4D, 8984 },
+ { 0x5A4C, 8989 },
+ { 0x5A43, 8994 },
+ { 0x5A5D, 8999 },
+ { 0x5A5E, 9002 },
+ { 0x5A5C, 9006 },
+ { 0x5A5F, 9009 },
+ { 0x221B, 9013 },
+ { 0x2593, 9015 },
+ { 0x22AE, 9017 },
+ { 0x22AC, 9020 },
+ { 0x2224, 9023 },
+ { 0x2AEE, 9026 },
+ { 0x220C, 9033 },
+ { 0x22EB, 9038 },
+ { 0x22ED, 9044 },
+ { 0x2280, 9052 },
+ { 0x22E0, 9055 },
+ { 0x2281, 9060 },
+ { 0x22E1, 9063 },
+ { 0x20AB, 9068 },
+ { 0x297F, 9070 },
+ { 0x22A4, 9073 },
+ { 0x2AF1, 9075 },
+ { 0x22F1, 9080 },
+ { 0x2304, 9084 },
+ { 0x2671, 9086 },
+ { 0x20AC, 9089 },
+ { 0x2E2D, 9091 },
+ { 0x2059, 9094 },
+ { 0x205B, 9097 },
+ { 0x2058, 9100 },
+ { 0x2725, 9103 },
+ { 0x2723, 9106 },
+ { 0x2722, 9109 },
+ { 0x002E, 9112 },
+ { 0x2588, 9114 },
+ { 0x27D7, 9116 },
+ { 0x23DB, 9119 },
+ { 0x2699, 9120 },
+ { 0x3013, 9121 },
+ { 0x200A, 9123 },
+ { 0x2388, 9125 },
+ { 0x26A1, 9127 },
+ { 0x2A1D, 9130 },
+ { 0x26B5, 9131 },
+ { 0x263E, 9132 },
+ { 0x27DB, 9135 },
+ { 0x27DA, 9139 },
+ { 0x2993, 9144 },
+ { 0x2E1C, 9148 },
+ { 0x258F, 9152 },
+ { 0x258E, 9156 },
+ { 0x294E, 9160 },
+ { 0x294A, 9167 },
+ { 0x294B, 9174 },
+ { 0x2950, 9181 },
+ { 0x297C, 9188 },
+ { 0x258B, 9191 },
+ { 0x25D6, 9195 },
+ { 0x258C, 9199 },
+ { 0x22A3, 9202 },
+ { 0x3008, 9204 },
+ { 0x2991, 9207 },
+ { 0x2B30, 9212 },
+ { 0x2B32, 9217 },
+ { 0x2997, 9222 },
+ { 0x3010, 9227 },
+ { 0x007B, 9231 },
+ { 0x23A9, 9234 },
+ { 0x23A7, 9239 },
+ { 0x23A8, 9244 },
+ { 0x230A, 9249 },
+ { 0x27D5, 9251 },
+ { 0x21AD, 9254 },
+ { 0x2194, 9258 },
+ { 0x21FC, 9261 },
+ { 0x21AE, 9268 },
+ { 0x21F9, 9273 },
+ { 0x2948, 9279 },
+ { 0x2B0C, 9285 },
+ { 0x2B04, 9289 },
+ { 0x21D4, 9293 },
+ { 0x21CE, 9297 },
+ { 0x2904, 9303 },
+ { 0x21FF, 9310 },
+ { 0x2589, 9314 },
+ { 0x258D, 9318 },
+ { 0x258A, 9322 },
+ { 0x2983, 9326 },
+ { 0x300E, 9330 },
+ { 0x301A, 9334 },
+ { 0x3018, 9338 },
+ { 0x3016, 9343 },
+ { 0x2985, 9347 },
+ { 0x300C, 9350 },
+ { 0x2E04, 9353 },
+ { 0x300A, 9357 },
+ { 0x29DA, 9361 },
+ { 0x201C, 9365 },
+ { 0x2E28, 9369 },
+ { 0x22C9, 9372 },
+ { 0x2E0C, 9377 },
+ { 0x2018, 9381 },
+ { 0x005B, 9385 },
+ { 0x298D, 9388 },
+ { 0x298F, 9396 },
+ { 0x2045, 9404 },
+ { 0x298B, 9409 },
+ { 0x23A3, 9414 },
+ { 0x23A1, 9419 },
+ { 0x23A2, 9424 },
+ { 0x29D8, 9428 },
+ { 0x2308, 9431 },
+ { 0x27DC, 9433 },
+ { 0x27C5, 9435 },
+ { 0x2E26, 9439 },
+ { 0x3014, 9443 },
+ { 0x29CF, 9447 },
+ { 0x2E20, 9452 },
+ { 0x23B8, 9457 },
+ { 0x22CB, 9461 },
+ { 0x0028, 9464 },
+ { 0x239D, 9466 },
+ { 0x239B, 9470 },
+ { 0x239C, 9474 },
+ { 0x2E02, 9477 },
+ { 0x2E09, 9480 },
+ { 0x2028, 9483 },
+ { 0x2A14, 9485 },
+ { 0x2A12, 9491 },
+ { 0x2A13, 9498 },
+ { 0x20A4, 9505 },
+ { 0x2AE6, 9507 },
+ { 0x27DE, 9515 },
+ { 0x27F7, 9518 },
+ { 0x27FA, 9522 },
+ { 0x27DD, 9527 },
+ { 0x27CC, 9530 },
+ { 0x27F5, 9532 },
+ { 0x27FB, 9535 },
+ { 0x27F8, 9540 },
+ { 0x27FD, 9544 },
+ { 0x2B33, 9550 },
+ { 0x27F6, 9554 },
+ { 0x27FC, 9557 },
+ { 0x27F9, 9562 },
+ { 0x27FE, 9566 },
+ { 0x27FF, 9572 },
+ { 0x26A5, 9576 },
+ { 0x2642, 9580 },
+ { 0x26A7, 9582 },
+ { 0x26A6, 9590 },
+ { 0x303C, 9594 },
+ { 0x20A5, 9596 },
+ { 0x29FF, 9598 },
+ { 0x226A, 9599 },
+ { 0x226B, 9601 },
+ { 0x22BC, 9603 },
+ { 0x2398, 9604 },
+ { 0x2423, 9606 },
+ { 0x272B, 9608 },
+ { 0x271B, 9612 },
+ { 0x2732, 9615 },
+ { 0x273C, 9618 },
+ { 0x27C3, 9622 },
+ { 0x27C4, 9624 },
+ { 0x2E19, 9626 },
+ { 0x303D, 9628 },
+ { 0x20B1, 9631 },
+ { 0x002B, 9633 },
+ { 0x2A2D, 9635 },
+ { 0x2A2E, 9641 },
+ { 0x2A39, 9647 },
+ { 0x2A25, 9651 },
+ { 0x2A28, 9656 },
+ { 0x2A22, 9661 },
+ { 0x2A24, 9667 },
+ { 0x2A26, 9672 },
+ { 0x2A27, 9677 },
+ { 0x2A23, 9682 },
+ { 0x2A72, 9688 },
+ { 0x6DFC, 9693 },
+ { 0x2256, 9695 },
+ { 0x02DA, 9699 },
+ { 0x2257, 9701 },
+ { 0x2E30, 9704 },
+ { 0x2218, 9706 },
+ { 0x223F, 9708 },
+ { 0x00AD, 9710 },
+ { 0x2721, 9712 },
+ { 0x262A, 9715 },
+ { 0x225B, 9718 },
+ { 0x22C6, 9720 },
+ { 0x2707, 9722 },
+ { 0x0E51, 9724 },
+ { 0x0E56, 9727 },
+ { 0x0E52, 9730 },
+ { 0x0E55, 9733 },
+ { 0x0E54, 9736 },
+ { 0x0E59, 9739 },
+ { 0x0E50, 9742 },
+ { 0x0E58, 9745 },
+ { 0x0E57, 9748 },
+ { 0x0E53, 9751 },
+ { 0x0E3F, 9754 },
+ { 0x0E2D, 9758 },
+ { 0x0E1A, 9762 },
+ { 0x0E14, 9766 },
+ { 0x0E0E, 9770 },
+ { 0x0E1D, 9774 },
+ { 0x0E1F, 9778 },
+ { 0x0E2B, 9782 },
+ { 0x0E2E, 9786 },
+ { 0x0E01, 9790 },
+ { 0x0E25, 9794 },
+ { 0x0E2C, 9798 },
+ { 0x0E26, 9802 },
+ { 0x0E21, 9805 },
+ { 0x0E19, 9809 },
+ { 0x0E13, 9813 },
+ { 0x0E1B, 9817 },
+ { 0x0E23, 9821 },
+ { 0x0E24, 9825 },
+ { 0x0E0B, 9828 },
+ { 0x0E2A, 9832 },
+ { 0x0E29, 9836 },
+ { 0x0E28, 9840 },
+ { 0x0E15, 9844 },
+ { 0x0E0F, 9848 },
+ { 0x0E27, 9852 },
+ { 0x0E22, 9856 },
+ { 0x0E0D, 9860 },
+ { 0x0E08, 9864 },
+ { 0x0E0C, 9868 },
+ { 0x0E0A, 9872 },
+ { 0x0E09, 9876 },
+ { 0x0E02, 9880 },
+ { 0x0E05, 9884 },
+ { 0x0E03, 9888 },
+ { 0x0E04, 9892 },
+ { 0x0E06, 9896 },
+ { 0x0E48, 9900 },
+ { 0x0E49, 9904 },
+ { 0x0E4A, 9908 },
+ { 0x0E4B, 9912 },
+ { 0x0E31, 9916 },
+ { 0x0E07, 9920 },
+ { 0x0E1E, 9924 },
+ { 0x0E1C, 9928 },
+ { 0x0E20, 9932 },
+ { 0x0E10, 9936 },
+ { 0x0E18, 9940 },
+ { 0x0E16, 9944 },
+ { 0x0E17, 9948 },
+ { 0x0E12, 9952 },
+ { 0x0E11, 9956 },
+ { 0x0E30, 9960 },
+ { 0x0E40, 9964 },
+ { 0x0E34, 9968 },
+ { 0x0E42, 9972 },
+ { 0x0E38, 9976 },
+ { 0x0E32, 9980 },
+ { 0x0E41, 9984 },
+ { 0x0E43, 9988 },
+ { 0x0E44, 9993 },
+ { 0x0E33, 9998 },
+ { 0x0E35, 10002 },
+ { 0x0E36, 10006 },
+ { 0x0E39, 10010 },
+ { 0x0E37, 10014 },
+ { 0x0E5B, 10018 },
+ { 0x0E4F, 10021 },
+ { 0x0E3A, 10024 },
+ { 0x0E46, 10027 },
+ { 0x0E4D, 10030 },
+ { 0x0E4E, 10033 },
+ { 0x0E47, 10036 },
+ { 0x0E2F, 10039 },
+ { 0x0E5A, 10042 },
+ { 0x0E45, 10045 },
+ { 0x0E4C, 10048 },
+ { 0x2009, 10051 },
+ { 0x29FE, 10053 },
+ { 0x22A8, 10054 },
+ { 0x238C, 10055 },
+ { 0x22D8, 10057 },
+ { 0x22D9, 10060 },
+ { 0x301C, 10063 },
+ { 0x2B3F, 10065 },
+ { 0x2933, 10070 },
+ { 0x6E4F, 10075 },
+ { 0x3030, 10078 },
+ { 0x2307, 10080 },
+ { 0x6E4B, 10082 },
+ { 0x2670, 10084 },
+ { 0x2060, 10087 },
+ { 0x200B, 10089 },
+ { 0x200D, 10092 },
+ { 0x6EFF, 10095 },
+ { 0x200C, 10099 },
+ { 0x299F, 10102 },
+ { 0x00B4, 10104 },
+ { 0x2220, 10106 },
+ { 0x299E, 10107 },
+ { 0x29A4, 10111 },
+ { 0x2648, 10114 },
+ { 0x2936, 10115 },
+ { 0x2937, 10121 },
+ { 0x2934, 10127 },
+ { 0x2935, 10133 },
+ { 0x2712, 10139 },
+ { 0x2600, 10141 },
+ { 0x2663, 10145 },
+ { 0x2691, 10148 },
+ { 0x2726, 10150 },
+ { 0x261A, 10154 },
+ { 0x26B8, 10158 },
+ { 0x2605, 10161 },
+ { 0x2B1D, 10163 },
+ { 0x265A, 10167 },
+ { 0x265F, 10170 },
+ { 0x265C, 10173 },
+ { 0x265B, 10176 },
+ { 0x265D, 10179 },
+ { 0x265E, 10182 },
+ { 0x2665, 10185 },
+ { 0x2B24, 10188 },
+ { 0x2B1B, 10191 },
+ { 0x25E3, 10194 },
+ { 0x25E2, 10198 },
+ { 0x261B, 10202 },
+ { 0x2617, 10206 },
+ { 0x2B51, 10209 },
+ { 0x25AA, 10212 },
+ { 0x2B29, 10215 },
+ { 0x2B2A, 10218 },
+ { 0x2660, 10221 },
+ { 0x25E4, 10224 },
+ { 0x25E5, 10228 },
+ { 0x29D3, 10232 },
+ { 0x272C, 10234 },
+ { 0x25CF, 10238 },
+ { 0x2689, 10240 },
+ { 0x29ED, 10246 },
+ { 0x2688, 10251 },
+ { 0x25FE, 10257 },
+ { 0x25FC, 10261 },
+ { 0x2B25, 10264 },
+ { 0x2B27, 10267 },
+ { 0x25A0, 10270 },
+ { 0x25C6, 10272 },
+ { 0x2666, 10274 },
+ { 0x29EA, 10277 },
+ { 0x2756, 10282 },
+ { 0x2B22, 10287 },
+ { 0x29EB, 10289 },
+ { 0x263B, 10291 },
+ { 0x26C2, 10294 },
+ { 0x26C3, 10297 },
+ { 0x273F, 10300 },
+ { 0x2B1F, 10302 },
+ { 0x2702, 10304 },
+ { 0x2B2E, 10306 },
+ { 0x25AE, 10309 },
+ { 0x29D7, 10312 },
+ { 0x204C, 10314 },
+ { 0x25AC, 10317 },
+ { 0x260E, 10319 },
+ { 0x267B, 10321 },
+ { 0x2B2C, 10325 },
+ { 0x27A1, 10328 },
+ { 0x204D, 10331 },
+ { 0x27A4, 10334 },
+ { 0x25B4, 10337 },
+ { 0x25B2, 10341 },
+ { 0x25BE, 10344 },
+ { 0x25BC, 10348 },
+ { 0x25C2, 10351 },
+ { 0x25C4, 10355 },
+ { 0x25C0, 10358 },
+ { 0x25B0, 10361 },
+ { 0x25B8, 10363 },
+ { 0x25BA, 10367 },
+ { 0x2B53, 10370 },
+ { 0x25B6, 10373 },
+ { 0x2422, 10376 },
+ { 0x02D8, 10378 },
+ { 0x1752, 10379 },
+ { 0x1753, 10383 },
+ { 0x1740, 10387 },
+ { 0x1741, 10390 },
+ { 0x1742, 10393 },
+ { 0x174A, 10396 },
+ { 0x1747, 10399 },
+ { 0x1744, 10402 },
+ { 0x1751, 10405 },
+ { 0x1743, 10408 },
+ { 0x174E, 10411 },
+ { 0x174B, 10414 },
+ { 0x1748, 10417 },
+ { 0x1749, 10420 },
+ { 0x174D, 10423 },
+ { 0x1750, 10426 },
+ { 0x1746, 10429 },
+ { 0x174F, 10432 },
+ { 0x174C, 10435 },
+ { 0x1745, 10438 },
+ { 0x2038, 10441 },
+ { 0x2041, 10442 },
+ { 0x02C7, 10445 },
+ { 0x26B3, 10446 },
+ { 0x2713, 10447 },
+ { 0x239A, 10449 },
+ { 0x2050, 10452 },
+ { 0x2601, 10454 },
+ { 0x003A, 10455 },
+ { 0x20A1, 10456 },
+ { 0x2254, 10458 },
+ { 0x2604, 10460 },
+ { 0x002C, 10461 },
+ { 0x2628, 10462 },
+ { 0x2629, 10465 },
+ { 0x23AA, 10468 },
+ { 0x22CE, 10471 },
+ { 0x22CF, 10474 },
+ { 0x2138, 10477 },
+ { 0x225C, 10479 },
+ { 0x0031, 10482 },
+ { 0x2488, 10484 },
+ { 0x0036, 10488 },
+ { 0x248D, 10490 },
+ { 0x0032, 10494 },
+ { 0x2489, 10496 },
+ { 0x0035, 10500 },
+ { 0x248C, 10502 },
+ { 0x0034, 10506 },
+ { 0x248B, 10508 },
+ { 0x0039, 10512 },
+ { 0x2490, 10514 },
+ { 0x0030, 10518 },
+ { 0x0038, 10520 },
+ { 0x248F, 10522 },
+ { 0x0037, 10526 },
+ { 0x248E, 10528 },
+ { 0x0033, 10532 },
+ { 0x248A, 10534 },
+ { 0x3003, 10538 },
+ { 0x2641, 10540 },
+ { 0x23DA, 10541 },
+ { 0x2733, 10543 },
+ { 0x2734, 10546 },
+ { 0x2735, 10550 },
+ { 0x2737, 10554 },
+ { 0x2741, 10559 },
+ { 0x274A, 10564 },
+ { 0x23CF, 10568 },
+ { 0x2205, 10570 },
+ { 0x29B4, 10572 },
+ { 0x29B3, 10578 },
+ { 0x29B2, 10584 },
+ { 0x29B1, 10590 },
+ { 0x2386, 10594 },
+ { 0x225D, 10596 },
+ { 0x22DE, 10600 },
+ { 0x22DF, 10604 },
+ { 0x22DC, 10608 },
+ { 0x22DD, 10612 },
+ { 0x22D5, 10616 },
+ { 0x232B, 10620 },
+ { 0x2326, 10624 },
+ { 0x2107, 10628 },
+ { 0x262B, 10630 },
+ { 0x263D, 10632 },
+ { 0x2322, 10635 },
+ { 0x2137, 10636 },
+ { 0x0060, 10638 },
+ { 0x03D6, 10640 },
+ { 0x0387, 10643 },
+ { 0x03D7, 10646 },
+ { 0x7175, 10649 },
+ { 0x7176, 10653 },
+ { 0x03D5, 10659 },
+ { 0x03FC, 10662 },
+ { 0x03F1, 10667 },
+ { 0x717D, 10670 },
+ { 0x7177, 10674 },
+ { 0x03D0, 10678 },
+ { 0x7180, 10681 },
+ { 0x717F, 10685 },
+ { 0x717C, 10689 },
+ { 0x1FFD, 10692 },
+ { 0x7179, 10694 },
+ { 0x718A, 10697 },
+ { 0x1FFE, 10700 },
+ { 0x1FDE, 10702 },
+ { 0x1FDD, 10706 },
+ { 0x1FDF, 10710 },
+ { 0x03F0, 10714 },
+ { 0x7183, 10717 },
+ { 0x0375, 10720 },
+ { 0x1FBF, 10724 },
+ { 0x1FCE, 10726 },
+ { 0x1FCD, 10730 },
+ { 0x1FCF, 10734 },
+ { 0x037C, 10738 },
+ { 0x03BC, 10744 },
+ { 0x03BD, 10748 },
+ { 0x03C0, 10752 },
+ { 0x03BE, 10756 },
+ { 0x03C7, 10760 },
+ { 0x03B7, 10764 },
+ { 0x1F75, 10768 },
+ { 0x1FC4, 10774 },
+ { 0x1F21, 10782 },
+ { 0x1F25, 10788 },
+ { 0x1F95, 10796 },
+ { 0x1F23, 10806 },
+ { 0x1F93, 10814 },
+ { 0x1F27, 10824 },
+ { 0x1F97, 10832 },
+ { 0x1F91, 10842 },
+ { 0x1F20, 10850 },
+ { 0x1F24, 10856 },
+ { 0x1F94, 10864 },
+ { 0x1F22, 10874 },
+ { 0x1F92, 10882 },
+ { 0x1F26, 10892 },
+ { 0x1F96, 10900 },
+ { 0x1F90, 10910 },
+ { 0x03AE, 10918 },
+ { 0x1F74, 10924 },
+ { 0x1FC2, 10930 },
+ { 0x1FC6, 10938 },
+ { 0x1FC7, 10944 },
+ { 0x1FC3, 10952 },
+ { 0x03C6, 10958 },
+ { 0x03C8, 10962 },
+ { 0x03C1, 10966 },
+ { 0x1FE5, 10970 },
+ { 0x1FE4, 10976 },
+ { 0x03FB, 10982 },
+ { 0x03F8, 10986 },
+ { 0x03C4, 10990 },
+ { 0x03B2, 10994 },
+ { 0x0371, 10998 },
+ { 0x03B9, 11002 },
+ { 0x1F77, 11006 },
+ { 0x1F31, 11012 },
+ { 0x1F35, 11018 },
+ { 0x1F33, 11026 },
+ { 0x1F37, 11034 },
+ { 0x1F30, 11042 },
+ { 0x1F34, 11048 },
+ { 0x1F32, 11056 },
+ { 0x1F36, 11064 },
+ { 0x03AF, 11072 },
+ { 0x1F76, 11078 },
+ { 0x1FD1, 11084 },
+ { 0x1FD0, 11090 },
+ { 0x03CA, 11096 },
+ { 0x1FD3, 11102 },
+ { 0x0390, 11110 },
+ { 0x1FD2, 11118 },
+ { 0x1FD7, 11126 },
+ { 0x1FD6, 11134 },
+ { 0x03B6, 11140 },
+ { 0x03B1, 11144 },
+ { 0x1F71, 11148 },
+ { 0x1FB4, 11154 },
+ { 0x1F01, 11162 },
+ { 0x1F05, 11168 },
+ { 0x1F85, 11176 },
+ { 0x1F03, 11186 },
+ { 0x1F83, 11194 },
+ { 0x1F07, 11204 },
+ { 0x1F87, 11212 },
+ { 0x1F81, 11222 },
+ { 0x1F00, 11230 },
+ { 0x1F04, 11236 },
+ { 0x1F84, 11244 },
+ { 0x1F02, 11254 },
+ { 0x1F82, 11262 },
+ { 0x1F06, 11272 },
+ { 0x1F86, 11280 },
+ { 0x1F80, 11290 },
+ { 0x03AC, 11298 },
+ { 0x1F70, 11304 },
+ { 0x1FB2, 11310 },
+ { 0x1FB1, 11318 },
+ { 0x1FB0, 11324 },
+ { 0x1FB6, 11330 },
+ { 0x1FB7, 11336 },
+ { 0x1FB3, 11344 },
+ { 0x03B4, 11350 },
+ { 0x03C2, 11354 },
+ { 0x03B3, 11359 },
+ { 0x03BA, 11363 },
+ { 0x03DF, 11367 },
+ { 0x03BB, 11371 },
+ { 0x03C9, 11375 },
+ { 0x1F7D, 11379 },
+ { 0x1FF4, 11385 },
+ { 0x1F61, 11393 },
+ { 0x1F65, 11399 },
+ { 0x1FA5, 11407 },
+ { 0x1F63, 11417 },
+ { 0x1FA3, 11425 },
+ { 0x1F67, 11435 },
+ { 0x1FA7, 11443 },
+ { 0x1FA1, 11453 },
+ { 0x1F60, 11461 },
+ { 0x1F64, 11467 },
+ { 0x1FA4, 11475 },
+ { 0x1F62, 11485 },
+ { 0x1FA2, 11493 },
+ { 0x1F66, 11503 },
+ { 0x1FA6, 11511 },
+ { 0x1FA0, 11521 },
+ { 0x03CE, 11529 },
+ { 0x1F7C, 11535 },
+ { 0x1FF2, 11541 },
+ { 0x1FF6, 11549 },
+ { 0x1FF7, 11555 },
+ { 0x1FF3, 11563 },
+ { 0x03E1, 11569 },
+ { 0x03C3, 11573 },
+ { 0x03B8, 11577 },
+ { 0x03DB, 11581 },
+ { 0x03D9, 11585 },
+ { 0x0373, 11590 },
+ { 0x03DD, 11595 },
+ { 0x03B5, 11599 },
+ { 0x1F73, 11603 },
+ { 0x1F11, 11609 },
+ { 0x1F15, 11615 },
+ { 0x1F13, 11623 },
+ { 0x1F10, 11631 },
+ { 0x1F14, 11637 },
+ { 0x1F12, 11645 },
+ { 0x03AD, 11653 },
+ { 0x1F72, 11659 },
+ { 0x03BF, 11665 },
+ { 0x1F79, 11669 },
+ { 0x1F41, 11675 },
+ { 0x1F45, 11681 },
+ { 0x1F43, 11689 },
+ { 0x1F40, 11697 },
+ { 0x1F44, 11703 },
+ { 0x1F42, 11711 },
+ { 0x03CC, 11719 },
+ { 0x1F78, 11725 },
+ { 0x03C5, 11731 },
+ { 0x1F7B, 11735 },
+ { 0x1F51, 11741 },
+ { 0x1F55, 11747 },
+ { 0x1F53, 11755 },
+ { 0x1F57, 11763 },
+ { 0x1F50, 11771 },
+ { 0x1F54, 11777 },
+ { 0x1F52, 11785 },
+ { 0x1F56, 11793 },
+ { 0x03CD, 11801 },
+ { 0x1F7A, 11807 },
+ { 0x1FE1, 11813 },
+ { 0x1FE0, 11819 },
+ { 0x03CB, 11825 },
+ { 0x1FE3, 11831 },
+ { 0x03B0, 11839 },
+ { 0x1FE2, 11847 },
+ { 0x1FE7, 11855 },
+ { 0x1FE6, 11863 },
+ { 0x0377, 11869 },
+ { 0x037D, 11874 },
+ { 0x037B, 11881 },
+ { 0x03D1, 11887 },
+ { 0x717E, 11890 },
+ { 0x7178, 11894 },
+ { 0x0384, 11898 },
+ { 0x1FEF, 11900 },
+ { 0x9200, 11902 },
+ { 0x9201, 11906 },
+ { 0x9202, 11910 },
+ { 0x9203, 11914 },
+ { 0x9204, 11918 },
+ { 0x9205, 11922 },
+ { 0x9206, 11926 },
+ { 0x9207, 11930 },
+ { 0x9208, 11934 },
+ { 0x9209, 11938 },
+ { 0x920A, 11942 },
+ { 0x920B, 11946 },
+ { 0x920C, 11950 },
+ { 0x920D, 11954 },
+ { 0x920E, 11958 },
+ { 0x920F, 11962 },
+ { 0x9210, 11966 },
+ { 0x9211, 11970 },
+ { 0x9212, 11974 },
+ { 0x9213, 11978 },
+ { 0x9214, 11982 },
+ { 0x9215, 11986 },
+ { 0x9216, 11990 },
+ { 0x9217, 11994 },
+ { 0x9218, 11998 },
+ { 0x9219, 12002 },
+ { 0x921A, 12006 },
+ { 0x921B, 12010 },
+ { 0x921C, 12014 },
+ { 0x7187, 12018 },
+ { 0x7186, 12021 },
+ { 0x7188, 12024 },
+ { 0x03F3, 12027 },
+ { 0x03DE, 12030 },
+ { 0x03E0, 12033 },
+ { 0x1D28, 12036 },
+ { 0x1D2A, 12041 },
+ { 0x1D29, 12046 },
+ { 0x1D26, 12051 },
+ { 0x1D27, 12056 },
+ { 0x03DA, 12061 },
+ { 0x03D8, 12064 },
+ { 0x03DC, 12068 },
+ { 0x03F2, 12071 },
+ { 0x03F5, 12075 },
+ { 0x7184, 12079 },
+ { 0x717A, 12082 },
+ { 0x7185, 12085 },
+ { 0x03CF, 12088 },
+ { 0x03F4, 12092 },
+ { 0x03FE, 12096 },
+ { 0x039C, 12102 },
+ { 0x039D, 12106 },
+ { 0x03A0, 12110 },
+ { 0x039E, 12114 },
+ { 0x03A7, 12118 },
+ { 0x0397, 12122 },
+ { 0x1FCB, 12126 },
+ { 0x1F29, 12132 },
+ { 0x1F2D, 12138 },
+ { 0x1F9D, 12146 },
+ { 0x1F2B, 12156 },
+ { 0x1F9B, 12164 },
+ { 0x1F2F, 12174 },
+ { 0x1F9F, 12182 },
+ { 0x1F99, 12192 },
+ { 0x1F28, 12200 },
+ { 0x1F2C, 12206 },
+ { 0x1F9C, 12214 },
+ { 0x1F2A, 12224 },
+ { 0x1F9A, 12232 },
+ { 0x1F2E, 12242 },
+ { 0x1F9E, 12250 },
+ { 0x1F98, 12260 },
+ { 0x0389, 12268 },
+ { 0x1FCA, 12274 },
+ { 0x1FCC, 12280 },
+ { 0x03A6, 12286 },
+ { 0x03A8, 12290 },
+ { 0x03A1, 12294 },
+ { 0x1FEC, 12298 },
+ { 0x03FA, 12304 },
+ { 0x03F7, 12308 },
+ { 0x03A4, 12312 },
+ { 0x0392, 12316 },
+ { 0x0370, 12320 },
+ { 0x0399, 12324 },
+ { 0x1FDB, 12328 },
+ { 0x1F39, 12334 },
+ { 0x1F3D, 12340 },
+ { 0x1F3B, 12348 },
+ { 0x1F3F, 12356 },
+ { 0x1F38, 12364 },
+ { 0x1F3C, 12370 },
+ { 0x1F3A, 12378 },
+ { 0x1F3E, 12386 },
+ { 0x038A, 12394 },
+ { 0x1FDA, 12400 },
+ { 0x1FD9, 12406 },
+ { 0x1FD8, 12412 },
+ { 0x03AA, 12418 },
+ { 0x0396, 12424 },
+ { 0x0391, 12428 },
+ { 0x1FBB, 12432 },
+ { 0x1F09, 12438 },
+ { 0x1F0D, 12444 },
+ { 0x1F8D, 12452 },
+ { 0x1F0B, 12462 },
+ { 0x1F8B, 12470 },
+ { 0x1F0F, 12480 },
+ { 0x1F8F, 12488 },
+ { 0x1F89, 12498 },
+ { 0x1F08, 12506 },
+ { 0x1F0C, 12512 },
+ { 0x1F8C, 12520 },
+ { 0x1F0A, 12530 },
+ { 0x1F8A, 12538 },
+ { 0x1F0E, 12548 },
+ { 0x1F8E, 12556 },
+ { 0x1F88, 12566 },
+ { 0x0386, 12574 },
+ { 0x1FBA, 12580 },
+ { 0x1FB9, 12586 },
+ { 0x1FB8, 12592 },
+ { 0x1FBC, 12598 },
+ { 0x0394, 12604 },
+ { 0x0393, 12608 },
+ { 0x039A, 12612 },
+ { 0x039B, 12616 },
+ { 0x03A9, 12620 },
+ { 0x1FFB, 12624 },
+ { 0x1F69, 12630 },
+ { 0x1F6D, 12636 },
+ { 0x1FAD, 12644 },
+ { 0x1F6B, 12654 },
+ { 0x1FAB, 12662 },
+ { 0x1F6F, 12672 },
+ { 0x1FAF, 12680 },
+ { 0x1FA9, 12690 },
+ { 0x1F68, 12698 },
+ { 0x1F6C, 12704 },
+ { 0x1FAC, 12712 },
+ { 0x1F6A, 12722 },
+ { 0x1FAA, 12730 },
+ { 0x1F6E, 12740 },
+ { 0x1FAE, 12748 },
+ { 0x1FA8, 12758 },
+ { 0x038F, 12766 },
+ { 0x1FFA, 12772 },
+ { 0x1FFC, 12778 },
+ { 0x03A3, 12784 },
+ { 0x0398, 12788 },
+ { 0x0372, 12792 },
+ { 0x0395, 12797 },
+ { 0x1FC9, 12801 },
+ { 0x1F19, 12807 },
+ { 0x1F1D, 12813 },
+ { 0x1F1B, 12821 },
+ { 0x1F18, 12829 },
+ { 0x1F1C, 12835 },
+ { 0x1F1A, 12843 },
+ { 0x0388, 12851 },
+ { 0x1FC8, 12857 },
+ { 0x039F, 12863 },
+ { 0x1FF9, 12867 },
+ { 0x1F49, 12873 },
+ { 0x1F4D, 12879 },
+ { 0x1F4B, 12887 },
+ { 0x1F48, 12895 },
+ { 0x1F4C, 12901 },
+ { 0x1F4A, 12909 },
+ { 0x038C, 12917 },
+ { 0x1FF8, 12923 },
+ { 0x03A5, 12929 },
+ { 0x1FEB, 12933 },
+ { 0x1F59, 12939 },
+ { 0x1F5D, 12945 },
+ { 0x1F5B, 12953 },
+ { 0x1F5F, 12961 },
+ { 0x038E, 12969 },
+ { 0x1FEA, 12975 },
+ { 0x1FE9, 12981 },
+ { 0x1FE8, 12987 },
+ { 0x03AB, 12993 },
+ { 0x0376, 12999 },
+ { 0x03F9, 13004 },
+ { 0x03FF, 13009 },
+ { 0x03FD, 13016 },
+ { 0x717B, 13022 },
+ { 0x1FBD, 13025 },
+ { 0x7182, 13027 },
+ { 0x9245, 13031 },
+ { 0x0374, 13034 },
+ { 0x03D2, 13037 },
+ { 0x03D3, 13042 },
+ { 0x03D4, 13049 },
+ { 0x7181, 13056 },
+ { 0x037E, 13059 },
+ { 0x03F6, 13062 },
+ { 0x7189, 13067 },
+ { 0x1FEE, 13071 },
+ { 0x1FED, 13075 },
+ { 0x1FC1, 13079 },
+ { 0x0385, 13083 },
+ { 0x1D6A, 13086 },
+ { 0x1D69, 13091 },
+ { 0x1D68, 13096 },
+ { 0x1D66, 13101 },
+ { 0x1D67, 13106 },
+ { 0x7141, 13111 },
+ { 0x7142, 13116 },
+ { 0x7152, 13121 },
+ { 0x714B, 13127 },
+ { 0x7140, 13133 },
+ { 0x7154, 13138 },
+ { 0x714D, 13144 },
+ { 0x7157, 13150 },
+ { 0x7150, 13155 },
+ { 0x7149, 13160 },
+ { 0x7155, 13165 },
+ { 0x7143, 13171 },
+ { 0x7145, 13175 },
+ { 0x7153, 13180 },
+ { 0x714C, 13186 },
+ { 0x714F, 13192 },
+ { 0x7148, 13197 },
+ { 0x7146, 13202 },
+ { 0x714E, 13207 },
+ { 0x7144, 13213 },
+ { 0x7151, 13217 },
+ { 0x714A, 13222 },
+ { 0x7147, 13227 },
+ { 0x7156, 13232 },
+ { 0x7170, 13238 },
+ { 0x7173, 13243 },
+ { 0x7158, 13248 },
+ { 0x715D, 13253 },
+ { 0x7174, 13258 },
+ { 0x7159, 13263 },
+ { 0x716A, 13267 },
+ { 0x7171, 13272 },
+ { 0x7164, 13277 },
+ { 0x715C, 13281 },
+ { 0x716E, 13285 },
+ { 0x7172, 13290 },
+ { 0x7169, 13295 },
+ { 0x716B, 13299 },
+ { 0x7165, 13304 },
+ { 0x716F, 13308 },
+ { 0x7163, 13313 },
+ { 0x715B, 13317 },
+ { 0x715E, 13321 },
+ { 0x716C, 13326 },
+ { 0x715A, 13331 },
+ { 0x7162, 13335 },
+ { 0x7168, 13339 },
+ { 0x7160, 13343 },
+ { 0x7161, 13347 },
+ { 0x715F, 13353 },
+ { 0x716D, 13357 },
+ { 0x7166, 13362 },
+ { 0x7167, 13366 },
+ { 0x1FC0, 13372 },
+ { 0x921D, 13374 },
+ { 0x921E, 13378 },
+ { 0x921F, 13382 },
+ { 0x9220, 13386 },
+ { 0x9221, 13390 },
+ { 0x9222, 13394 },
+ { 0x9223, 13398 },
+ { 0x9224, 13402 },
+ { 0x9225, 13406 },
+ { 0x9226, 13410 },
+ { 0x9227, 13414 },
+ { 0x9228, 13418 },
+ { 0x9229, 13422 },
+ { 0x922A, 13426 },
+ { 0x922B, 13430 },
+ { 0x922C, 13434 },
+ { 0x922D, 13438 },
+ { 0x922E, 13442 },
+ { 0x922F, 13446 },
+ { 0x9230, 13450 },
+ { 0x9231, 13454 },
+ { 0x9232, 13458 },
+ { 0x9233, 13462 },
+ { 0x9234, 13466 },
+ { 0x9235, 13470 },
+ { 0x9236, 13474 },
+ { 0x9237, 13478 },
+ { 0x9238, 13482 },
+ { 0x9239, 13486 },
+ { 0x923A, 13490 },
+ { 0x923B, 13494 },
+ { 0x923C, 13498 },
+ { 0x923D, 13502 },
+ { 0x923E, 13506 },
+ { 0x923F, 13510 },
+ { 0x9240, 13514 },
+ { 0x9241, 13518 },
+ { 0x037A, 13522 },
+ { 0x1FBE, 13524 },
+ { 0x2724, 13526 },
+ { 0x271C, 13530 },
+ { 0x2764, 13534 },
+ { 0x27A6, 13537 },
+ { 0x27A5, 13544 },
+ { 0x2714, 13551 },
+ { 0x2738, 13554 },
+ { 0x274B, 13560 },
+ { 0x271A, 13565 },
+ { 0x2763, 13568 },
+ { 0x27AD, 13573 },
+ { 0x279A, 13579 },
+ { 0x2798, 13583 },
+ { 0x27AE, 13587 },
+ { 0x2718, 13593 },
+ { 0x27A0, 13596 },
+ { 0x275E, 13601 },
+ { 0x275D, 13607 },
+ { 0x275C, 13614 },
+ { 0x275B, 13620 },
+ { 0x2746, 13627 },
+ { 0x2748, 13630 },
+ { 0x2731, 13632 },
+ { 0x272E, 13634 },
+ { 0x275A, 13638 },
+ { 0x2799, 13641 },
+ { 0x2762, 13644 },
+ { 0x2794, 13648 },
+ { 0x279C, 13652 },
+ { 0x27BD, 13656 },
+ { 0x2770, 13660 },
+ { 0x276E, 13665 },
+ { 0x2716, 13671 },
+ { 0x2771, 13674 },
+ { 0x276F, 13679 },
+ { 0x27B9, 13685 },
+ { 0x27B7, 13690 },
+ { 0x27B8, 13695 },
+ { 0x27A8, 13699 },
+ { 0x273D, 13704 },
+ { 0x2743, 13707 },
+ { 0x279E, 13711 },
+ { 0x27BB, 13715 },
+ { 0x2302, 13719 },
+ { 0x22B7, 13720 },
+ { 0x2253, 13722 },
+ { 0x592E, 13728 },
+ { 0x592F, 13732 },
+ { 0x592C, 13736 },
+ { 0x592D, 13740 },
+ { 0x592B, 13745 },
+ { 0x5901, 13749 },
+ { 0x5906, 13753 },
+ { 0x5902, 13757 },
+ { 0x5905, 13761 },
+ { 0x5904, 13765 },
+ { 0x5909, 13769 },
+ { 0x5900, 13773 },
+ { 0x5908, 13777 },
+ { 0x5907, 13781 },
+ { 0x5903, 13785 },
+ { 0x5927, 13789 },
+ { 0x592A, 13793 },
+ { 0x5928, 13797 },
+ { 0x5929, 13801 },
+ { 0x5926, 13805 },
+ { 0x5922, 13809 },
+ { 0x5924, 13813 },
+ { 0x5919, 13817 },
+ { 0x5921, 13821 },
+ { 0x5918, 13825 },
+ { 0x590C, 13829 },
+ { 0x591F, 13833 },
+ { 0x590A, 13837 },
+ { 0x591C, 13841 },
+ { 0x5917, 13845 },
+ { 0x5914, 13849 },
+ { 0x5923, 13853 },
+ { 0x5925, 13857 },
+ { 0x5915, 13861 },
+ { 0x591A, 13865 },
+ { 0x590E, 13869 },
+ { 0x5912, 13873 },
+ { 0x5920, 13877 },
+ { 0x591D, 13881 },
+ { 0x591B, 13885 },
+ { 0x5910, 13889 },
+ { 0x5913, 13893 },
+ { 0x590B, 13897 },
+ { 0x590D, 13901 },
+ { 0x5911, 13905 },
+ { 0x5916, 13909 },
+ { 0x590F, 13913 },
+ { 0x591E, 13917 },
+ { 0x17D7, 13921 },
+ { 0x17D4, 13925 },
+ { 0x17CF, 13928 },
+ { 0x17D2, 13931 },
+ { 0x17CC, 13934 },
+ { 0x17CB, 13937 },
+ { 0x17D8, 13940 },
+ { 0x17D6, 13943 },
+ { 0x17D9, 13948 },
+ { 0x17D0, 13952 },
+ { 0x17D1, 13956 },
+ { 0x17CE, 13959 },
+ { 0x17DA, 13962 },
+ { 0x17C6, 13965 },
+ { 0x17C7, 13968 },
+ { 0x17CA, 13971 },
+ { 0x17DD, 13974 },
+ { 0x17D5, 13977 },
+ { 0x17D3, 13980 },
+ { 0x17C9, 13983 },
+ { 0x17CD, 13986 },
+ { 0x17DC, 13989 },
+ { 0x17C8, 13992 },
+ { 0x17E1, 13995 },
+ { 0x17E6, 13998 },
+ { 0x17E2, 14001 },
+ { 0x17E5, 14004 },
+ { 0x17E4, 14007 },
+ { 0x17E9, 14010 },
+ { 0x17E0, 14013 },
+ { 0x17E8, 14016 },
+ { 0x17E7, 14019 },
+ { 0x17E3, 14022 },
+ { 0x17C1, 14025 },
+ { 0x17B7, 14029 },
+ { 0x17BB, 14033 },
+ { 0x17B9, 14037 },
+ { 0x17B6, 14041 },
+ { 0x17C2, 14045 },
+ { 0x17C3, 14049 },
+ { 0x17C5, 14053 },
+ { 0x17C0, 14057 },
+ { 0x17B8, 14061 },
+ { 0x17BE, 14065 },
+ { 0x17C4, 14069 },
+ { 0x17BD, 14073 },
+ { 0x17BC, 14077 },
+ { 0x17BF, 14081 },
+ { 0x17BA, 14085 },
+ { 0x17B5, 14089 },
+ { 0x17B4, 14093 },
+ { 0x1794, 14097 },
+ { 0x1785, 14100 },
+ { 0x1787, 14103 },
+ { 0x178A, 14106 },
+ { 0x178C, 14109 },
+ { 0x17A0, 14112 },
+ { 0x1780, 14115 },
+ { 0x1782, 14118 },
+ { 0x17A1, 14121 },
+ { 0x179B, 14124 },
+ { 0x1798, 14127 },
+ { 0x1793, 14130 },
+ { 0x1796, 14133 },
+ { 0x17A2, 14136 },
+ { 0x179A, 14139 },
+ { 0x179F, 14142 },
+ { 0x178F, 14145 },
+ { 0x1791, 14148 },
+ { 0x179C, 14151 },
+ { 0x1799, 14154 },
+ { 0x1786, 14157 },
+ { 0x1788, 14160 },
+ { 0x1781, 14163 },
+ { 0x1783, 14166 },
+ { 0x1784, 14169 },
+ { 0x178E, 14172 },
+ { 0x1789, 14175 },
+ { 0x1795, 14178 },
+ { 0x1797, 14181 },
+ { 0x179D, 14184 },
+ { 0x179E, 14187 },
+ { 0x1790, 14190 },
+ { 0x1792, 14193 },
+ { 0x178B, 14196 },
+ { 0x178D, 14199 },
+ { 0x19F3, 14202 },
+ { 0x19E3, 14206 },
+ { 0x19FA, 14210 },
+ { 0x19EA, 14214 },
+ { 0x17F3, 14218 },
+ { 0x17F2, 14223 },
+ { 0x17F0, 14228 },
+ { 0x17F4, 14233 },
+ { 0x17F1, 14238 },
+ { 0x17F5, 14243 },
+ { 0x17F8, 14248 },
+ { 0x17F7, 14253 },
+ { 0x17F9, 14258 },
+ { 0x17F6, 14263 },
+ { 0x19F2, 14268 },
+ { 0x19E2, 14272 },
+ { 0x19F4, 14276 },
+ { 0x19E4, 14280 },
+ { 0x19F1, 14284 },
+ { 0x19E1, 14288 },
+ { 0x19F5, 14292 },
+ { 0x19E5, 14296 },
+ { 0x19FD, 14300 },
+ { 0x19ED, 14304 },
+ { 0x19FC, 14308 },
+ { 0x19EC, 14312 },
+ { 0x19FE, 14316 },
+ { 0x19EE, 14320 },
+ { 0x19FB, 14324 },
+ { 0x19EB, 14328 },
+ { 0x19FF, 14332 },
+ { 0x19EF, 14336 },
+ { 0x19F8, 14340 },
+ { 0x19E8, 14344 },
+ { 0x19F7, 14348 },
+ { 0x19E7, 14352 },
+ { 0x19F9, 14356 },
+ { 0x19E9, 14360 },
+ { 0x19F6, 14364 },
+ { 0x19E6, 14368 },
+ { 0x19F0, 14372 },
+ { 0x19E0, 14375 },
+ { 0x17DB, 14378 },
+ { 0x17AD, 14382 },
+ { 0x17AF, 14386 },
+ { 0x17A5, 14390 },
+ { 0x17A7, 14394 },
+ { 0x17AB, 14398 },
+ { 0x17AE, 14402 },
+ { 0x17A4, 14406 },
+ { 0x17B0, 14410 },
+ { 0x17A3, 14414 },
+ { 0x17B3, 14418 },
+ { 0x17A6, 14422 },
+ { 0x17B1, 14426 },
+ { 0x17B2, 14432 },
+ { 0x17A8, 14438 },
+ { 0x17A9, 14442 },
+ { 0x17AC, 14446 },
+ { 0x17AA, 14450 },
+ { 0x27D8, 14454 },
+ { 0x27D9, 14457 },
+ { 0x2A1E, 14460 },
+ { 0x25EF, 14464 },
+ { 0x2AFC, 14466 },
+ { 0x271D, 14471 },
+ { 0x0061, 14473 },
+ { 0x0227, 14477 },
+ { 0x01E1, 14484 },
+ { 0x1EA1, 14493 },
+ { 0x1EA3, 14500 },
+ { 0x00E5, 14507 },
+ { 0x01FB, 14514 },
+ { 0x1E01, 14523 },
+ { 0x00E1, 14530 },
+ { 0x0103, 14536 },
+ { 0x1EB7, 14542 },
+ { 0x1EB3, 14551 },
+ { 0x1EAF, 14560 },
+ { 0x1EB1, 14568 },
+ { 0x1EB5, 14576 },
+ { 0x01CE, 14584 },
+ { 0x00E0, 14590 },
+ { 0x1E9A, 14596 },
+ { 0x00E3, 14604 },
+ { 0x0201, 14610 },
+ { 0x0101, 14617 },
+ { 0x0105, 14623 },
+ { 0x2C65, 14629 },
+ { 0x0203, 14635 },
+ { 0x00E4, 14642 },
+ { 0x01DF, 14648 },
+ { 0x1D8F, 14656 },
+ { 0x00E2, 14663 },
+ { 0x1EAD, 14669 },
+ { 0x1EA9, 14678 },
+ { 0x1EA5, 14687 },
+ { 0x1EA7, 14695 },
+ { 0x1EAB, 14703 },
+ { 0x0062, 14711 },
+ { 0x1E03, 14715 },
+ { 0x1E05, 14722 },
+ { 0x0253, 14729 },
+ { 0x1E07, 14735 },
+ { 0x1D6C, 14742 },
+ { 0x0180, 14749 },
+ { 0x0183, 14755 },
+ { 0x1D80, 14761 },
+ { 0x0063, 14768 },
+ { 0x010B, 14772 },
+ { 0x0255, 14779 },
+ { 0x0188, 14785 },
+ { 0x0107, 14791 },
+ { 0x010D, 14797 },
+ { 0x023C, 14803 },
+ { 0x00E7, 14809 },
+ { 0x1E09, 14815 },
+ { 0x0109, 14823 },
+ { 0x0064, 14829 },
+ { 0x1E0B, 14833 },
+ { 0x1E0D, 14840 },
+ { 0x0221, 14847 },
+ { 0x0257, 14853 },
+ { 0x1D91, 14859 },
+ { 0x1E0F, 14867 },
+ { 0x0256, 14874 },
+ { 0x010F, 14880 },
+ { 0x1D6D, 14886 },
+ { 0x0111, 14893 },
+ { 0x018C, 14899 },
+ { 0x1E11, 14905 },
+ { 0x1D81, 14911 },
+ { 0x1E13, 14918 },
+ { 0x0065, 14925 },
+ { 0x0117, 14929 },
+ { 0x1EB9, 14936 },
+ { 0x1EBB, 14943 },
+ { 0x00E9, 14950 },
+ { 0x0115, 14956 },
+ { 0x011B, 14962 },
+ { 0x00E8, 14968 },
+ { 0x2C78, 14974 },
+ { 0x1EBD, 14980 },
+ { 0x1E1B, 14986 },
+ { 0x0205, 14993 },
+ { 0x0113, 15000 },
+ { 0x1E17, 15006 },
+ { 0x1E15, 15014 },
+ { 0x0119, 15022 },
+ { 0x0247, 15028 },
+ { 0x0229, 15034 },
+ { 0x1E1D, 15040 },
+ { 0x0207, 15048 },
+ { 0x00EB, 15055 },
+ { 0x1D92, 15061 },
+ { 0x00EA, 15068 },
+ { 0x1EC7, 15074 },
+ { 0x1EC3, 15083 },
+ { 0x1EBF, 15092 },
+ { 0x1EC1, 15100 },
+ { 0x1EC5, 15108 },
+ { 0x1E19, 15116 },
+ { 0x0066, 15123 },
+ { 0x1E1F, 15127 },
+ { 0x0192, 15134 },
+ { 0x1D6E, 15140 },
+ { 0x1D82, 15147 },
+ { 0x0067, 15154 },
+ { 0x0121, 15158 },
+ { 0x0260, 15165 },
+ { 0x01F5, 15171 },
+ { 0x011F, 15177 },
+ { 0x01E7, 15183 },
+ { 0x1E21, 15189 },
+ { 0x01E5, 15195 },
+ { 0x0123, 15201 },
+ { 0x1D83, 15207 },
+ { 0x011D, 15214 },
+ { 0x0068, 15220 },
+ { 0x1E23, 15224 },
+ { 0x1E25, 15231 },
+ { 0x0266, 15238 },
+ { 0x1E96, 15244 },
+ { 0x1E2B, 15251 },
+ { 0x021F, 15258 },
+ { 0x0127, 15264 },
+ { 0x1E29, 15270 },
+ { 0x2C68, 15276 },
+ { 0x1E27, 15282 },
+ { 0x0125, 15288 },
+ { 0x0069, 15294 },
+ { 0x1ECB, 15298 },
+ { 0x1EC9, 15305 },
+ { 0x00ED, 15312 },
+ { 0x012D, 15318 },
+ { 0x01D0, 15324 },
+ { 0x00EC, 15330 },
+ { 0x0129, 15336 },
+ { 0x1E2D, 15342 },
+ { 0x0209, 15349 },
+ { 0x012B, 15356 },
+ { 0x012F, 15362 },
+ { 0x0268, 15368 },
+ { 0x020B, 15374 },
+ { 0x00EF, 15381 },
+ { 0x1E2F, 15387 },
+ { 0x1D96, 15395 },
+ { 0x00EE, 15402 },
+ { 0x006A, 15408 },
+ { 0x01F0, 15412 },
+ { 0x0249, 15418 },
+ { 0x0135, 15424 },
+ { 0x029D, 15430 },
+ { 0x006B, 15436 },
+ { 0x1E33, 15440 },
+ { 0x0199, 15447 },
+ { 0x1E35, 15453 },
+ { 0x1E31, 15460 },
+ { 0x01E9, 15466 },
+ { 0x5741, 15472 },
+ { 0x5745, 15478 },
+ { 0x0137, 15487 },
+ { 0x1D84, 15493 },
+ { 0x5743, 15500 },
+ { 0x2C6A, 15507 },
+ { 0x006C, 15513 },
+ { 0x019A, 15517 },
+ { 0x1E37, 15523 },
+ { 0x1E39, 15530 },
+ { 0x026C, 15539 },
+ { 0x0234, 15545 },
+ { 0x5749, 15551 },
+ { 0x1E3B, 15558 },
+ { 0x013A, 15565 },
+ { 0x013E, 15571 },
+ { 0x2C61, 15577 },
+ { 0x0140, 15584 },
+ { 0x026B, 15591 },
+ { 0x0142, 15598 },
+ { 0x013C, 15604 },
+ { 0x1D85, 15610 },
+ { 0x026D, 15617 },
+ { 0x1E3D, 15624 },
+ { 0x006D, 15631 },
+ { 0x1E41, 15635 },
+ { 0x1E43, 15642 },
+ { 0x0271, 15649 },
+ { 0x1E3F, 15655 },
+ { 0x1D6F, 15661 },
+ { 0x1D86, 15668 },
+ { 0x006E, 15675 },
+ { 0x1E45, 15679 },
+ { 0x1E47, 15686 },
+ { 0x0235, 15693 },
+ { 0x0272, 15699 },
+ { 0x1E49, 15706 },
+ { 0x019E, 15713 },
+ { 0x0144, 15721 },
+ { 0x0148, 15727 },
+ { 0x01F9, 15733 },
+ { 0x00F1, 15739 },
+ { 0x1D70, 15745 },
+ { 0x0146, 15752 },
+ { 0x1D87, 15758 },
+ { 0x0273, 15765 },
+ { 0x1E4B, 15772 },
+ { 0x0149, 15779 },
+ { 0x006F, 15786 },
+ { 0x022F, 15790 },
+ { 0x0231, 15797 },
+ { 0x1ECD, 15806 },
+ { 0x2C7A, 15813 },
+ { 0x1ECF, 15821 },
+ { 0x01A1, 15828 },
+ { 0x1EE3, 15834 },
+ { 0x1EDF, 15843 },
+ { 0x1EDB, 15852 },
+ { 0x1EDD, 15860 },
+ { 0x1EE1, 15868 },
+ { 0x574B, 15876 },
+ { 0x574D, 15884 },
+ { 0x00F3, 15890 },
+ { 0x014F, 15896 },
+ { 0x01D2, 15902 },
+ { 0x00F2, 15908 },
+ { 0x00F5, 15914 },
+ { 0x1E4D, 15920 },
+ { 0x022D, 15928 },
+ { 0x1E4F, 15936 },
+ { 0x0151, 15944 },
+ { 0x020D, 15951 },
+ { 0x014D, 15958 },
+ { 0x1E53, 15964 },
+ { 0x1E51, 15972 },
+ { 0x01EB, 15980 },
+ { 0x01ED, 15986 },
+ { 0x00F8, 15994 },
+ { 0x01FF, 16000 },
+ { 0x020F, 16008 },
+ { 0x00F6, 16015 },
+ { 0x022B, 16021 },
+ { 0x00F4, 16029 },
+ { 0x1ED9, 16035 },
+ { 0x1ED5, 16044 },
+ { 0x1ED1, 16053 },
+ { 0x1ED3, 16061 },
+ { 0x1ED7, 16069 },
+ { 0x0070, 16077 },
+ { 0x1E57, 16081 },
+ { 0x01A5, 16088 },
+ { 0x1E55, 16094 },
+ { 0x1D71, 16100 },
+ { 0x1D7D, 16107 },
+ { 0x5751, 16113 },
+ { 0x1D88, 16121 },
+ { 0x5753, 16128 },
+ { 0x5755, 16134 },
+ { 0x0071, 16141 },
+ { 0x02A0, 16145 },
+ { 0x024B, 16151 },
+ { 0x5757, 16158 },
+ { 0x5759, 16166 },
+ { 0x0072, 16173 },
+ { 0x1E59, 16177 },
+ { 0x1E5B, 16184 },
+ { 0x1E5D, 16191 },
+ { 0x1E5F, 16200 },
+ { 0x027C, 16207 },
+ { 0x027D, 16214 },
+ { 0x0155, 16220 },
+ { 0x0159, 16226 },
+ { 0x0211, 16232 },
+ { 0x1D72, 16239 },
+ { 0x024D, 16246 },
+ { 0x0157, 16252 },
+ { 0x1D89, 16258 },
+ { 0x027E, 16265 },
+ { 0x1D73, 16271 },
+ { 0x0213, 16280 },
+ { 0x575B, 16287 },
+ { 0x0073, 16292 },
+ { 0x1E61, 16296 },
+ { 0x1E63, 16303 },
+ { 0x1E69, 16310 },
+ { 0x0282, 16320 },
+ { 0x015B, 16326 },
+ { 0x1E65, 16332 },
+ { 0x0161, 16341 },
+ { 0x1E67, 16347 },
+ { 0x0219, 16356 },
+ { 0x023F, 16363 },
+ { 0x1D74, 16370 },
+ { 0x015F, 16377 },
+ { 0x1D8A, 16383 },
+ { 0x015D, 16390 },
+ { 0x0074, 16396 },
+ { 0x1E6B, 16400 },
+ { 0x1E6D, 16407 },
+ { 0x0236, 16414 },
+ { 0x01AD, 16420 },
+ { 0x1E6F, 16426 },
+ { 0x0165, 16433 },
+ { 0x021B, 16439 },
+ { 0x1D75, 16446 },
+ { 0x0167, 16453 },
+ { 0x0163, 16459 },
+ { 0x01AB, 16465 },
+ { 0x2C66, 16472 },
+ { 0x1E97, 16479 },
+ { 0x0288, 16485 },
+ { 0x1E71, 16492 },
+ { 0x0075, 16499 },
+ { 0x0289, 16503 },
+ { 0x1EE5, 16508 },
+ { 0x1EE7, 16515 },
+ { 0x01B0, 16522 },
+ { 0x1EF1, 16528 },
+ { 0x1EED, 16537 },
+ { 0x1EE9, 16546 },
+ { 0x1EEB, 16554 },
+ { 0x1EEF, 16562 },
+ { 0x016F, 16570 },
+ { 0x00FA, 16577 },
+ { 0x016D, 16583 },
+ { 0x01D4, 16589 },
+ { 0x00F9, 16595 },
+ { 0x0169, 16601 },
+ { 0x1E79, 16607 },
+ { 0x1E75, 16615 },
+ { 0x0171, 16622 },
+ { 0x0215, 16629 },
+ { 0x016B, 16636 },
+ { 0x1E7B, 16642 },
+ { 0x0173, 16650 },
+ { 0x0217, 16656 },
+ { 0x00FC, 16663 },
+ { 0x01D8, 16669 },
+ { 0x01DA, 16677 },
+ { 0x01DC, 16685 },
+ { 0x01D6, 16693 },
+ { 0x1E73, 16701 },
+ { 0x1D99, 16708 },
+ { 0x00FB, 16715 },
+ { 0x1E77, 16721 },
+ { 0x0076, 16728 },
+ { 0x1E7F, 16732 },
+ { 0x2C74, 16739 },
+ { 0x028B, 16745 },
+ { 0x2C71, 16751 },
+ { 0x1E7D, 16758 },
+ { 0x1D8C, 16764 },
+ { 0x575F, 16771 },
+ { 0x0077, 16778 },
+ { 0x1E87, 16782 },
+ { 0x1E89, 16789 },
+ { 0x2C73, 16796 },
+ { 0x1E98, 16802 },
+ { 0x1E83, 16809 },
+ { 0x1E81, 16815 },
+ { 0x1E85, 16821 },
+ { 0x0175, 16827 },
+ { 0x0078, 16833 },
+ { 0x1E8B, 16837 },
+ { 0x1D8D, 16844 },
+ { 0x1E8D, 16851 },
+ { 0x0079, 16857 },
+ { 0x1E8F, 16861 },
+ { 0x1EF5, 16868 },
+ { 0x01B4, 16875 },
+ { 0x1EF7, 16881 },
+ { 0x1EFF, 16888 },
+ { 0x1E99, 16894 },
+ { 0x00FD, 16901 },
+ { 0x1EF3, 16907 },
+ { 0x1EF9, 16913 },
+ { 0x0233, 16919 },
+ { 0x024F, 16925 },
+ { 0x00FF, 16931 },
+ { 0x0177, 16937 },
+ { 0x007A, 16943 },
+ { 0x017C, 16947 },
+ { 0x1E93, 16954 },
+ { 0x0291, 16961 },
+ { 0x0225, 16967 },
+ { 0x1E95, 16973 },
+ { 0x017A, 16980 },
+ { 0x017E, 16986 },
+ { 0x0240, 16992 },
+ { 0x1D76, 16999 },
+ { 0x01B6, 17006 },
+ { 0x1D8E, 17012 },
+ { 0x2C6C, 17019 },
+ { 0x0290, 17025 },
+ { 0x1E91, 17032 },
+ { 0x5733, 17038 },
+ { 0x00E6, 17042 },
+ { 0x01FD, 17046 },
+ { 0x01E3, 17052 },
+ { 0x5735, 17058 },
+ { 0x5737, 17062 },
+ { 0x5739, 17066 },
+ { 0x573B, 17070 },
+ { 0x573D, 17077 },
+ { 0x0238, 17081 },
+ { 0x01F3, 17086 },
+ { 0x01C6, 17090 },
+ { 0x02A3, 17096 },
+ { 0x02A5, 17101 },
+ { 0x576B, 17108 },
+ { 0x0195, 17112 },
+ { 0x576D, 17116 },
+ { 0x01C9, 17120 },
+ { 0x02AA, 17124 },
+ { 0x02AB, 17129 },
+ { 0x01CC, 17134 },
+ { 0x01A3, 17138 },
+ { 0x574F, 17142 },
+ { 0x0223, 17146 },
+ { 0x0239, 17150 },
+ { 0x02A8, 17155 },
+ { 0x1D7A, 17162 },
+ { 0x02A6, 17168 },
+ { 0x5729, 17173 },
+ { 0x1D6B, 17177 },
+ { 0x5778, 17181 },
+ { 0x5761, 17185 },
+ { 0x576F, 17189 },
+ { 0x5771, 17193 },
+ { 0x014B, 17197 },
+ { 0x0283, 17201 },
+ { 0x0286, 17205 },
+ { 0x1D8B, 17211 },
+ { 0x1D98, 17218 },
+ { 0x00F0, 17225 },
+ { 0x0292, 17229 },
+ { 0x0293, 17233 },
+ { 0x01BA, 17239 },
+ { 0x01EF, 17245 },
+ { 0x1D9A, 17251 },
+ { 0x01B9, 17258 },
+ { 0x0138, 17263 },
+ { 0x5772, 17267 },
+ { 0x5773, 17271 },
+ { 0x5774, 17275 },
+ { 0x0278, 17279 },
+ { 0x5775, 17283 },
+ { 0x575D, 17287 },
+ { 0x1D16, 17292 },
+ { 0x5777, 17298 },
+ { 0x02A4, 17302 },
+ { 0x02A9, 17307 },
+ { 0x2C76, 17312 },
+ { 0x5727, 17317 },
+ { 0x0267, 17321 },
+ { 0x0269, 17327 },
+ { 0x1D7C, 17331 },
+ { 0x026E, 17337 },
+ { 0x017F, 17341 },
+ { 0x1E9B, 17346 },
+ { 0x1E9D, 17354 },
+ { 0x1E9C, 17362 },
+ { 0x025B, 17370 },
+ { 0x1D93, 17375 },
+ { 0x0254, 17383 },
+ { 0x1D97, 17388 },
+ { 0x0264, 17396 },
+ { 0x02A7, 17401 },
+ { 0x0185, 17406 },
+ { 0x01A8, 17411 },
+ { 0x01BD, 17416 },
+ { 0x5769, 17421 },
+ { 0x021D, 17425 },
+ { 0x0251, 17429 },
+ { 0x1D90, 17433 },
+ { 0x1E9F, 17440 },
+ { 0x0263, 17444 },
+ { 0x0259, 17448 },
+ { 0x025A, 17452 },
+ { 0x1D95, 17458 },
+ { 0x00DF, 17465 },
+ { 0x0285, 17470 },
+ { 0x00FE, 17476 },
+ { 0x5765, 17480 },
+ { 0x5767, 17486 },
+ { 0x0275, 17494 },
+ { 0x1D17, 17499 },
+ { 0x5747, 17505 },
+ { 0x029A, 17510 },
+ { 0x0277, 17516 },
+ { 0x025E, 17521 },
+ { 0x019B, 17528 },
+ { 0x0261, 17534 },
+ { 0x0250, 17539 },
+ { 0x01DD, 17544 },
+ { 0x1D77, 17549 },
+ { 0x0265, 17554 },
+ { 0x02AE, 17559 },
+ { 0x02AF, 17566 },
+ { 0x1D09, 17575 },
+ { 0x029E, 17580 },
+ { 0x5781, 17585 },
+ { 0x026F, 17590 },
+ { 0x0270, 17595 },
+ { 0x0279, 17603 },
+ { 0x027B, 17608 },
+ { 0x027A, 17615 },
+ { 0x2C79, 17623 },
+ { 0x0287, 17630 },
+ { 0x028C, 17635 },
+ { 0x028D, 17640 },
+ { 0x028E, 17645 },
+ { 0x1D02, 17650 },
+ { 0x1D14, 17655 },
+ { 0x1D08, 17660 },
+ { 0x0252, 17666 },
+ { 0x018D, 17671 },
+ { 0x577F, 17676 },
+ { 0x0131, 17682 },
+ { 0x0237, 17687 },
+ { 0x025F, 17692 },
+ { 0x0284, 17699 },
+ { 0x0242, 17708 },
+ { 0x577A, 17713 },
+ { 0x577C, 17718 },
+ { 0x1D79, 17723 },
+ { 0x5783, 17728 },
+ { 0x5785, 17733 },
+ { 0x5787, 17738 },
+ { 0x028A, 17743 },
+ { 0x1D7F, 17747 },
+ { 0x2184, 17753 },
+ { 0x573F, 17758 },
+ { 0x0258, 17765 },
+ { 0x027F, 17770 },
+ { 0x025C, 17777 },
+ { 0x025D, 17783 },
+ { 0x1D94, 17791 },
+ { 0x578C, 17800 },
+ { 0x1D11, 17804 },
+ { 0x1D13, 17809 },
+ { 0x1D1D, 17816 },
+ { 0x1D12, 17821 },
+ { 0x1D1F, 17827 },
+ { 0x1D1E, 17833 },
+ { 0x2C77, 17839 },
+ { 0x572B, 17844 },
+ { 0x572D, 17848 },
+ { 0x572F, 17852 },
+ { 0x5763, 17858 },
+ { 0x1EFD, 17863 },
+ { 0x1EFB, 17868 },
+ { 0x5725, 17873 },
+ { 0x5723, 17878 },
+ { 0x1D7B, 17883 },
+ { 0x1D7E, 17890 },
+ { 0x6B00, 17897 },
+ { 0x6B01, 17901 },
+ { 0x6B02, 17905 },
+ { 0x0133, 17909 },
+ { 0x0153, 17913 },
+ { 0x6B06, 17917 },
+ { 0x6B03, 17921 },
+ { 0x6B04, 17925 },
+ { 0x6B05, 17929 },
+ { 0x01A6, 17935 },
+ { 0x1D25, 17938 },
+ { 0x01BB, 17941 },
+ { 0x01BF, 17946 },
+ { 0x1D00, 17949 },
+ { 0x0299, 17954 },
+ { 0x1D04, 17959 },
+ { 0x1D05, 17964 },
+ { 0x1D07, 17969 },
+ { 0x5730, 17974 },
+ { 0x0262, 17979 },
+ { 0x029B, 17984 },
+ { 0x029C, 17991 },
+ { 0x026A, 17996 },
+ { 0x1D0A, 18001 },
+ { 0x1D0B, 18006 },
+ { 0x029F, 18011 },
+ { 0x1D0C, 18016 },
+ { 0x1D0D, 18023 },
+ { 0x0274, 18028 },
+ { 0x1D0F, 18033 },
+ { 0x1D18, 18038 },
+ { 0x0280, 18043 },
+ { 0x5731, 18048 },
+ { 0x1D1B, 18053 },
+ { 0x1D1C, 18058 },
+ { 0x1D20, 18063 },
+ { 0x1D21, 18068 },
+ { 0x028F, 18073 },
+ { 0x1D22, 18078 },
+ { 0x1D01, 18083 },
+ { 0x0276, 18088 },
+ { 0x1D15, 18093 },
+ { 0x1D06, 18098 },
+ { 0x1D23, 18103 },
+ { 0x5776, 18108 },
+ { 0x1D10, 18113 },
+ { 0x1D03, 18119 },
+ { 0x2C7B, 18125 },
+ { 0x1D1A, 18131 },
+ { 0x0281, 18137 },
+ { 0x1D0E, 18143 },
+ { 0x1D19, 18149 },
+ { 0x01C0, 18155 },
+ { 0x1D24, 18159 },
+ { 0x0294, 18164 },
+ { 0x02A1, 18168 },
+ { 0x01C1, 18174 },
+ { 0x01C2, 18178 },
+ { 0x02AD, 18182 },
+ { 0x0298, 18186 },
+ { 0x02AC, 18190 },
+ { 0x0296, 18194 },
+ { 0x01BE, 18199 },
+ { 0x01AA, 18206 },
+ { 0x02A2, 18211 },
+ { 0x01C3, 18218 },
+ { 0x0297, 18222 },
+ { 0x0295, 18226 },
+ { 0x0041, 18231 },
+ { 0x0226, 18235 },
+ { 0x01E0, 18242 },
+ { 0x1EA0, 18251 },
+ { 0x1EA2, 18258 },
+ { 0x00C5, 18265 },
+ { 0x01FA, 18272 },
+ { 0x1E00, 18281 },
+ { 0x00C1, 18288 },
+ { 0x0102, 18294 },
+ { 0x1EB6, 18300 },
+ { 0x1EB2, 18309 },
+ { 0x1EAE, 18318 },
+ { 0x1EB0, 18326 },
+ { 0x1EB4, 18334 },
+ { 0x01CD, 18342 },
+ { 0x00C0, 18348 },
+ { 0x00C3, 18354 },
+ { 0x0200, 18360 },
+ { 0x0100, 18367 },
+ { 0x0104, 18373 },
+ { 0x023A, 18379 },
+ { 0x0202, 18385 },
+ { 0x00C4, 18392 },
+ { 0x01DE, 18398 },
+ { 0x00C2, 18406 },
+ { 0x1EAC, 18412 },
+ { 0x1EA8, 18421 },
+ { 0x1EA4, 18430 },
+ { 0x1EA6, 18438 },
+ { 0x1EAA, 18446 },
+ { 0x0042, 18454 },
+ { 0x1E02, 18458 },
+ { 0x1E04, 18465 },
+ { 0x0181, 18472 },
+ { 0x1E06, 18478 },
+ { 0x0243, 18485 },
+ { 0x0182, 18491 },
+ { 0x0043, 18497 },
+ { 0x010A, 18501 },
+ { 0x0187, 18508 },
+ { 0x0106, 18514 },
+ { 0x010C, 18520 },
+ { 0x023B, 18526 },
+ { 0x00C7, 18532 },
+ { 0x1E08, 18538 },
+ { 0x0108, 18546 },
+ { 0x0044, 18552 },
+ { 0x1E0A, 18556 },
+ { 0x1E0C, 18563 },
+ { 0x018A, 18570 },
+ { 0x1E0E, 18576 },
+ { 0x010E, 18583 },
+ { 0x01F2, 18589 },
+ { 0x01C5, 18597 },
+ { 0x0110, 18607 },
+ { 0x018B, 18613 },
+ { 0x1E10, 18619 },
+ { 0x1E12, 18625 },
+ { 0x0045, 18632 },
+ { 0x0116, 18636 },
+ { 0x1EB8, 18643 },
+ { 0x1EBA, 18650 },
+ { 0x00C9, 18657 },
+ { 0x0114, 18663 },
+ { 0x011A, 18669 },
+ { 0x00C8, 18675 },
+ { 0x1EBC, 18681 },
+ { 0x1E1A, 18687 },
+ { 0x0204, 18694 },
+ { 0x0112, 18701 },
+ { 0x1E16, 18707 },
+ { 0x1E14, 18715 },
+ { 0x0118, 18723 },
+ { 0x0246, 18729 },
+ { 0x0228, 18735 },
+ { 0x1E1C, 18741 },
+ { 0x0206, 18749 },
+ { 0x00CB, 18756 },
+ { 0x00CA, 18762 },
+ { 0x1EC6, 18768 },
+ { 0x1EC2, 18777 },
+ { 0x1EBE, 18786 },
+ { 0x1EC0, 18794 },
+ { 0x1EC4, 18802 },
+ { 0x1E18, 18810 },
+ { 0x0046, 18817 },
+ { 0x1E1E, 18821 },
+ { 0x0191, 18828 },
+ { 0x0047, 18834 },
+ { 0x0120, 18838 },
+ { 0x0193, 18845 },
+ { 0x01F4, 18851 },
+ { 0x011E, 18857 },
+ { 0x01E6, 18863 },
+ { 0x1E20, 18869 },
+ { 0x01E4, 18875 },
+ { 0x0122, 18881 },
+ { 0x011C, 18887 },
+ { 0x0048, 18893 },
+ { 0x1E22, 18897 },
+ { 0x1E24, 18904 },
+ { 0x1E2A, 18911 },
+ { 0x021E, 18918 },
+ { 0x0126, 18924 },
+ { 0x1E28, 18930 },
+ { 0x2C67, 18936 },
+ { 0x1E26, 18942 },
+ { 0x0124, 18948 },
+ { 0x0049, 18954 },
+ { 0x0130, 18958 },
+ { 0x1ECA, 18965 },
+ { 0x1EC8, 18972 },
+ { 0x00CD, 18979 },
+ { 0x012C, 18985 },
+ { 0x01CF, 18991 },
+ { 0x00CC, 18997 },
+ { 0x0128, 19003 },
+ { 0x1E2C, 19009 },
+ { 0x0208, 19016 },
+ { 0x012A, 19023 },
+ { 0x012E, 19029 },
+ { 0x0197, 19035 },
+ { 0x020A, 19041 },
+ { 0x00CF, 19048 },
+ { 0x1E2E, 19054 },
+ { 0x00CE, 19062 },
+ { 0x004A, 19068 },
+ { 0x0248, 19072 },
+ { 0x0134, 19078 },
+ { 0x004B, 19084 },
+ { 0x1E32, 19088 },
+ { 0x0198, 19095 },
+ { 0x1E34, 19101 },
+ { 0x1E30, 19108 },
+ { 0x01E8, 19114 },
+ { 0x5740, 19120 },
+ { 0x5744, 19126 },
+ { 0x0136, 19135 },
+ { 0x5742, 19141 },
+ { 0x2C69, 19148 },
+ { 0x004C, 19154 },
+ { 0x023D, 19158 },
+ { 0x1E36, 19164 },
+ { 0x1E38, 19171 },
+ { 0x5748, 19180 },
+ { 0x1E3A, 19187 },
+ { 0x0139, 19194 },
+ { 0x013D, 19200 },
+ { 0x01C8, 19206 },
+ { 0x2C60, 19214 },
+ { 0x013F, 19221 },
+ { 0x2C62, 19228 },
+ { 0x0141, 19235 },
+ { 0x013B, 19241 },
+ { 0x1E3C, 19247 },
+ { 0x004D, 19254 },
+ { 0x1E40, 19258 },
+ { 0x1E42, 19265 },
+ { 0x2C6E, 19272 },
+ { 0x1E3E, 19278 },
+ { 0x004E, 19284 },
+ { 0x1E44, 19288 },
+ { 0x1E46, 19295 },
+ { 0x019D, 19302 },
+ { 0x1E48, 19309 },
+ { 0x0220, 19316 },
+ { 0x0143, 19324 },
+ { 0x0147, 19330 },
+ { 0x01F8, 19336 },
+ { 0x01CB, 19342 },
+ { 0x00D1, 19350 },
+ { 0x0145, 19356 },
+ { 0x1E4A, 19362 },
+ { 0x004F, 19369 },
+ { 0x022E, 19373 },
+ { 0x0230, 19380 },
+ { 0x1ECC, 19389 },
+ { 0x1ECE, 19396 },
+ { 0x01A0, 19403 },
+ { 0x1EE2, 19409 },
+ { 0x1EDE, 19418 },
+ { 0x1EDA, 19427 },
+ { 0x1EDC, 19435 },
+ { 0x1EE0, 19443 },
+ { 0x574A, 19451 },
+ { 0x574C, 19459 },
+ { 0x00D3, 19465 },
+ { 0x014E, 19471 },
+ { 0x01D1, 19477 },
+ { 0x00D2, 19483 },
+ { 0x00D5, 19489 },
+ { 0x1E4C, 19495 },
+ { 0x022C, 19503 },
+ { 0x1E4E, 19511 },
+ { 0x0150, 19519 },
+ { 0x020C, 19526 },
+ { 0x014C, 19533 },
+ { 0x1E52, 19539 },
+ { 0x1E50, 19547 },
+ { 0x019F, 19555 },
+ { 0x01EA, 19562 },
+ { 0x01EC, 19568 },
+ { 0x00D8, 19576 },
+ { 0x01FE, 19582 },
+ { 0x020E, 19590 },
+ { 0x00D6, 19597 },
+ { 0x022A, 19603 },
+ { 0x00D4, 19611 },
+ { 0x1ED8, 19617 },
+ { 0x1ED4, 19626 },
+ { 0x1ED0, 19635 },
+ { 0x1ED2, 19643 },
+ { 0x1ED6, 19651 },
+ { 0x0050, 19659 },
+ { 0x1E56, 19663 },
+ { 0x01A4, 19670 },
+ { 0x1E54, 19676 },
+ { 0x2C63, 19682 },
+ { 0x5750, 19688 },
+ { 0x5752, 19696 },
+ { 0x5754, 19702 },
+ { 0x0051, 19709 },
+ { 0x5756, 19713 },
+ { 0x5758, 19721 },
+ { 0x0052, 19728 },
+ { 0x1E58, 19732 },
+ { 0x1E5A, 19739 },
+ { 0x1E5C, 19746 },
+ { 0x1E5E, 19755 },
+ { 0x2C64, 19762 },
+ { 0x0154, 19768 },
+ { 0x0158, 19774 },
+ { 0x0210, 19780 },
+ { 0x024C, 19787 },
+ { 0x0156, 19793 },
+ { 0x0212, 19799 },
+ { 0x575A, 19806 },
+ { 0x0053, 19811 },
+ { 0x1E60, 19815 },
+ { 0x1E62, 19822 },
+ { 0x1E68, 19829 },
+ { 0x015A, 19839 },
+ { 0x1E64, 19845 },
+ { 0x0160, 19854 },
+ { 0x1E66, 19860 },
+ { 0x0218, 19869 },
+ { 0x015E, 19876 },
+ { 0x015C, 19882 },
+ { 0x0054, 19888 },
+ { 0x1E6A, 19892 },
+ { 0x1E6C, 19899 },
+ { 0x01AC, 19906 },
+ { 0x1E6E, 19912 },
+ { 0x0164, 19919 },
+ { 0x021A, 19925 },
+ { 0x0166, 19932 },
+ { 0x0162, 19938 },
+ { 0x023E, 19944 },
+ { 0x01AE, 19951 },
+ { 0x1E70, 19958 },
+ { 0x0055, 19965 },
+ { 0x0244, 19969 },
+ { 0x1EE4, 19974 },
+ { 0x1EE6, 19981 },
+ { 0x01AF, 19988 },
+ { 0x1EF0, 19994 },
+ { 0x1EEC, 20003 },
+ { 0x1EE8, 20012 },
+ { 0x1EEA, 20020 },
+ { 0x1EEE, 20028 },
+ { 0x016E, 20036 },
+ { 0x00DA, 20043 },
+ { 0x016C, 20049 },
+ { 0x01D3, 20055 },
+ { 0x00D9, 20061 },
+ { 0x0168, 20067 },
+ { 0x1E78, 20073 },
+ { 0x1E74, 20081 },
+ { 0x0170, 20088 },
+ { 0x0214, 20095 },
+ { 0x016A, 20102 },
+ { 0x1E7A, 20108 },
+ { 0x0172, 20116 },
+ { 0x0216, 20122 },
+ { 0x00DC, 20129 },
+ { 0x01D7, 20135 },
+ { 0x01D9, 20143 },
+ { 0x01DB, 20151 },
+ { 0x01D5, 20159 },
+ { 0x1E72, 20167 },
+ { 0x00DB, 20174 },
+ { 0x1E76, 20180 },
+ { 0x0056, 20187 },
+ { 0x1E7E, 20191 },
+ { 0x01B2, 20198 },
+ { 0x1E7C, 20204 },
+ { 0x575E, 20210 },
+ { 0x0057, 20217 },
+ { 0x1E86, 20221 },
+ { 0x1E88, 20228 },
+ { 0x2C72, 20235 },
+ { 0x1E82, 20241 },
+ { 0x1E80, 20247 },
+ { 0x1E84, 20253 },
+ { 0x0174, 20259 },
+ { 0x0058, 20265 },
+ { 0x1E8A, 20269 },
+ { 0x1E8C, 20276 },
+ { 0x0059, 20282 },
+ { 0x1E8E, 20286 },
+ { 0x1EF4, 20293 },
+ { 0x01B3, 20300 },
+ { 0x1EF6, 20306 },
+ { 0x1EFE, 20313 },
+ { 0x00DD, 20319 },
+ { 0x1EF2, 20325 },
+ { 0x1EF8, 20331 },
+ { 0x0232, 20337 },
+ { 0x024E, 20343 },
+ { 0x0178, 20349 },
+ { 0x0176, 20355 },
+ { 0x005A, 20361 },
+ { 0x017B, 20365 },
+ { 0x1E92, 20372 },
+ { 0x0224, 20379 },
+ { 0x1E94, 20385 },
+ { 0x0179, 20392 },
+ { 0x017D, 20398 },
+ { 0x01B5, 20404 },
+ { 0x2C6B, 20410 },
+ { 0x1E90, 20416 },
+ { 0x5732, 20422 },
+ { 0x00C6, 20426 },
+ { 0x01FC, 20430 },
+ { 0x01E2, 20436 },
+ { 0x5734, 20442 },
+ { 0x5736, 20446 },
+ { 0x5738, 20450 },
+ { 0x573A, 20454 },
+ { 0x573C, 20461 },
+ { 0x01F1, 20465 },
+ { 0x01C4, 20469 },
+ { 0x576A, 20475 },
+ { 0x576C, 20479 },
+ { 0x01C7, 20483 },
+ { 0x01CA, 20487 },
+ { 0x01A2, 20491 },
+ { 0x574E, 20495 },
+ { 0x0222, 20499 },
+ { 0x5728, 20503 },
+ { 0x5760, 20507 },
+ { 0x576E, 20511 },
+ { 0x014A, 20515 },
+ { 0x01A9, 20519 },
+ { 0x00D0, 20523 },
+ { 0x01B7, 20527 },
+ { 0x01EE, 20531 },
+ { 0x01B8, 20537 },
+ { 0x575C, 20542 },
+ { 0x2C75, 20547 },
+ { 0x5726, 20552 },
+ { 0x0196, 20556 },
+ { 0x0190, 20560 },
+ { 0x0186, 20565 },
+ { 0x0184, 20570 },
+ { 0x01A7, 20575 },
+ { 0x01BC, 20580 },
+ { 0x5768, 20585 },
+ { 0x01F7, 20589 },
+ { 0x021C, 20593 },
+ { 0x2C6D, 20597 },
+ { 0x0194, 20601 },
+ { 0x01F6, 20605 },
+ { 0x018F, 20609 },
+ { 0x1E9E, 20613 },
+ { 0x024A, 20618 },
+ { 0x00DE, 20626 },
+ { 0x5764, 20630 },
+ { 0x5766, 20636 },
+ { 0x5746, 20644 },
+ { 0x2C6F, 20649 },
+ { 0x5780, 20654 },
+ { 0x019C, 20659 },
+ { 0x0245, 20664 },
+ { 0x577E, 20669 },
+ { 0x0189, 20675 },
+ { 0x0241, 20680 },
+ { 0x5779, 20685 },
+ { 0x577B, 20690 },
+ { 0x577D, 20695 },
+ { 0x5782, 20700 },
+ { 0x5784, 20705 },
+ { 0x5786, 20710 },
+ { 0x01B1, 20715 },
+ { 0x573E, 20719 },
+ { 0x018E, 20726 },
+ { 0x578B, 20731 },
+ { 0x572A, 20735 },
+ { 0x572C, 20739 },
+ { 0x572E, 20743 },
+ { 0x5762, 20749 },
+ { 0x1EFC, 20754 },
+ { 0x1EFA, 20759 },
+ { 0x5724, 20764 },
+ { 0x5722, 20769 },
+ { 0x0132, 20774 },
+ { 0x0152, 20778 },
+ { 0x2090, 20782 },
+ { 0x2091, 20787 },
+ { 0x1D62, 20792 },
+ { 0x2C7C, 20797 },
+ { 0x2092, 20802 },
+ { 0x1D63, 20807 },
+ { 0x1D64, 20812 },
+ { 0x1D65, 20817 },
+ { 0x2093, 20822 },
+ { 0x2094, 20827 },
+ { 0x57FE, 20832 },
+ { 0x57FF, 20837 },
+ { 0x57FD, 20842 },
+ { 0x57FB, 20847 },
+ { 0x57FC, 20852 },
+ { 0x264E, 20857 },
+ { 0x2772, 20858 },
+ { 0x2773, 20864 },
+ { 0x2591, 20870 },
+ { 0x2758, 20872 },
+ { 0x1940, 20875 },
+ { 0x193B, 20878 },
+ { 0x193A, 20881 },
+ { 0x1939, 20884 },
+ { 0x1947, 20887 },
+ { 0x194C, 20890 },
+ { 0x1948, 20893 },
+ { 0x194B, 20896 },
+ { 0x194A, 20899 },
+ { 0x194F, 20902 },
+ { 0x1946, 20905 },
+ { 0x194E, 20908 },
+ { 0x194D, 20911 },
+ { 0x1949, 20914 },
+ { 0x1930, 20917 },
+ { 0x1938, 20921 },
+ { 0x1936, 20925 },
+ { 0x1934, 20929 },
+ { 0x1935, 20933 },
+ { 0x1937, 20937 },
+ { 0x1933, 20941 },
+ { 0x1931, 20945 },
+ { 0x1932, 20949 },
+ { 0x1920, 20953 },
+ { 0x1927, 20957 },
+ { 0x1921, 20961 },
+ { 0x1928, 20965 },
+ { 0x1922, 20969 },
+ { 0x1924, 20973 },
+ { 0x1926, 20977 },
+ { 0x1923, 20981 },
+ { 0x1925, 20985 },
+ { 0x1912, 20989 },
+ { 0x1906, 20992 },
+ { 0x190D, 20995 },
+ { 0x1903, 20998 },
+ { 0x191C, 21001 },
+ { 0x1908, 21004 },
+ { 0x1901, 21007 },
+ { 0x1917, 21010 },
+ { 0x1914, 21013 },
+ { 0x190F, 21016 },
+ { 0x1910, 21019 },
+ { 0x1916, 21022 },
+ { 0x191B, 21025 },
+ { 0x190B, 21028 },
+ { 0x1918, 21031 },
+ { 0x1915, 21034 },
+ { 0x1913, 21037 },
+ { 0x1907, 21040 },
+ { 0x190E, 21043 },
+ { 0x1904, 21046 },
+ { 0x1909, 21049 },
+ { 0x1902, 21052 },
+ { 0x1905, 21055 },
+ { 0x1911, 21058 },
+ { 0x1919, 21061 },
+ { 0x191A, 21064 },
+ { 0x190C, 21067 },
+ { 0x190A, 21070 },
+ { 0x1945, 21073 },
+ { 0x192A, 21076 },
+ { 0x192B, 21080 },
+ { 0x1929, 21084 },
+ { 0x1944, 21088 },
+ { 0x1900, 21091 },
+ { 0x2581, 21094 },
+ { 0x2582, 21098 },
+ { 0x2585, 21102 },
+ { 0x2584, 21106 },
+ { 0x25E1, 21109 },
+ { 0x25DB, 21112 },
+ { 0x25DF, 21117 },
+ { 0x25FA, 21122 },
+ { 0x293F, 21125 },
+ { 0x2703, 21130 },
+ { 0x27D3, 21133 },
+ { 0x270E, 21138 },
+ { 0x25DE, 21141 },
+ { 0x2751, 21146 },
+ { 0x25FF, 21151 },
+ { 0x293E, 21154 },
+ { 0x274F, 21159 },
+ { 0x2587, 21164 },
+ { 0x2583, 21168 },
+ { 0x2586, 21172 },
+ { 0x00B5, 21176 },
+ { 0x2212, 21178 },
+ { 0x2A3A, 21180 },
+ { 0x2A2A, 21184 },
+ { 0x2A29, 21189 },
+ { 0x2A2C, 21194 },
+ { 0x2A2B, 21199 },
+ { 0x2242, 21204 },
+ { 0x266D, 21206 },
+ { 0x266F, 21209 },
+ { 0x266E, 21212 },
+ { 0x2A09, 21215 },
+ { 0x22C3, 21218 },
+ { 0x2A03, 21220 },
+ { 0x2A04, 21225 },
+ { 0x2AFF, 21230 },
+ { 0x2A06, 21234 },
+ { 0x2A05, 21238 },
+ { 0x2A00, 21242 },
+ { 0x2A01, 21246 },
+ { 0x2A02, 21250 },
+ { 0x22C1, 21254 },
+ { 0x22C0, 21257 },
+ { 0x220F, 21260 },
+ { 0x2210, 21262 },
+ { 0x2211, 21264 },
+ { 0x22C2, 21266 },
+ { 0x2207, 21268 },
+ { 0x20A6, 21269 },
+ { 0x2922, 21271 },
+ { 0x2197, 21277 },
+ { 0x2928, 21280 },
+ { 0x2924, 21287 },
+ { 0x2931, 21292 },
+ { 0x292E, 21299 },
+ { 0x2B08, 21306 },
+ { 0x2B00, 21310 },
+ { 0x21D7, 21314 },
+ { 0x2921, 21318 },
+ { 0x2196, 21324 },
+ { 0x21B8, 21327 },
+ { 0x21F1, 21333 },
+ { 0x2927, 21338 },
+ { 0x2923, 21345 },
+ { 0x2932, 21350 },
+ { 0x2B09, 21357 },
+ { 0x2B01, 21361 },
+ { 0x21D6, 21365 },
+ { 0x1680, 21369 },
+ { 0x1696, 21372 },
+ { 0x1692, 21375 },
+ { 0x1691, 21378 },
+ { 0x1690, 21381 },
+ { 0x1689, 21384 },
+ { 0x1687, 21387 },
+ { 0x168C, 21390 },
+ { 0x1698, 21393 },
+ { 0x1682, 21396 },
+ { 0x168B, 21399 },
+ { 0x1685, 21402 },
+ { 0x168F, 21405 },
+ { 0x1684, 21408 },
+ { 0x1686, 21411 },
+ { 0x1681, 21414 },
+ { 0x168A, 21417 },
+ { 0x1683, 21420 },
+ { 0x169A, 21423 },
+ { 0x1688, 21426 },
+ { 0x168E, 21429 },
+ { 0x1695, 21432 },
+ { 0x1693, 21435 },
+ { 0x1694, 21438 },
+ { 0x168D, 21441 },
+ { 0x1697, 21444 },
+ { 0x1699, 21447 },
+ { 0x169B, 21450 },
+ { 0x169C, 21453 },
+ { 0x0B56, 21457 },
+ { 0x0B57, 21461 },
+ { 0x0B3C, 21465 },
+ { 0x0B4D, 21468 },
+ { 0x0B03, 21471 },
+ { 0x0B02, 21474 },
+ { 0x0B3D, 21477 },
+ { 0x0B01, 21480 },
+ { 0x0B67, 21483 },
+ { 0x0B6C, 21486 },
+ { 0x0B68, 21489 },
+ { 0x0B6B, 21492 },
+ { 0x0B6A, 21495 },
+ { 0x0B6F, 21498 },
+ { 0x0B66, 21501 },
+ { 0x0B6E, 21504 },
+ { 0x0B6D, 21507 },
+ { 0x0B69, 21510 },
+ { 0x0B47, 21513 },
+ { 0x0B3F, 21517 },
+ { 0x0B4B, 21521 },
+ { 0x0B41, 21525 },
+ { 0x0B3E, 21529 },
+ { 0x0B48, 21533 },
+ { 0x0B4C, 21537 },
+ { 0x0B40, 21541 },
+ { 0x0B42, 21545 },
+ { 0x0B62, 21549 },
+ { 0x0B43, 21554 },
+ { 0x0B63, 21559 },
+ { 0x0B44, 21564 },
+ { 0x0B70, 21569 },
+ { 0x0B05, 21571 },
+ { 0x0B0F, 21574 },
+ { 0x0B07, 21577 },
+ { 0x0B13, 21580 },
+ { 0x0B09, 21583 },
+ { 0x0B06, 21586 },
+ { 0x0B10, 21589 },
+ { 0x0B14, 21592 },
+ { 0x0B2C, 21595 },
+ { 0x0B1A, 21598 },
+ { 0x0B26, 21601 },
+ { 0x0B17, 21604 },
+ { 0x0B39, 21607 },
+ { 0x0B08, 21610 },
+ { 0x0B1C, 21613 },
+ { 0x0B15, 21616 },
+ { 0x0B32, 21619 },
+ { 0x0B2E, 21622 },
+ { 0x0B28, 21625 },
+ { 0x0B2A, 21628 },
+ { 0x0B30, 21631 },
+ { 0x0B38, 21634 },
+ { 0x0B24, 21637 },
+ { 0x0B0A, 21640 },
+ { 0x0B35, 21643 },
+ { 0x0B71, 21646 },
+ { 0x0B2F, 21649 },
+ { 0x0B2D, 21652 },
+ { 0x0B1B, 21655 },
+ { 0x0B21, 21658 },
+ { 0x0B27, 21661 },
+ { 0x0B18, 21664 },
+ { 0x0B1D, 21667 },
+ { 0x0B16, 21670 },
+ { 0x0B33, 21673 },
+ { 0x0B19, 21676 },
+ { 0x0B23, 21679 },
+ { 0x0B1E, 21682 },
+ { 0x0B2B, 21685 },
+ { 0x0B5D, 21688 },
+ { 0x0B5C, 21691 },
+ { 0x0B36, 21694 },
+ { 0x0B37, 21697 },
+ { 0x0B25, 21700 },
+ { 0x0B1F, 21703 },
+ { 0x0B5F, 21706 },
+ { 0x0B22, 21709 },
+ { 0x0B20, 21712 },
+ { 0x0B0C, 21715 },
+ { 0x0B0B, 21719 },
+ { 0x0B61, 21723 },
+ { 0x0B60, 21727 },
+ { 0x2125, 21731 },
+ { 0x262E, 21733 },
+ { 0x2318, 21735 },
+ { 0x2647, 21739 },
+ { 0x00A3, 21740 },
+ { 0x2032, 21742 },
+ { 0x2399, 21743 },
+ { 0x2236, 21746 },
+ { 0x2994, 21747 },
+ { 0x2E1D, 21751 },
+ { 0x2595, 21755 },
+ { 0x297D, 21759 },
+ { 0x25D7, 21762 },
+ { 0x2590, 21766 },
+ { 0x22A2, 21769 },
+ { 0x221F, 21771 },
+ { 0x22BE, 21773 },
+ { 0x237C, 21777 },
+ { 0x2E01, 21783 },
+ { 0x3009, 21788 },
+ { 0x2992, 21791 },
+ { 0x299C, 21796 },
+ { 0x2E00, 21801 },
+ { 0x21F4, 21805 },
+ { 0x27F4, 21810 },
+ { 0x2998, 21815 },
+ { 0x3011, 21820 },
+ { 0x007D, 21824 },
+ { 0x23AD, 21827 },
+ { 0x23AB, 21832 },
+ { 0x23AC, 21837 },
+ { 0x230B, 21842 },
+ { 0x27D6, 21844 },
+ { 0x2984, 21847 },
+ { 0x300F, 21851 },
+ { 0x301B, 21855 },
+ { 0x3019, 21859 },
+ { 0x3017, 21864 },
+ { 0x2986, 21868 },
+ { 0x300D, 21871 },
+ { 0x2E05, 21874 },
+ { 0x300B, 21878 },
+ { 0x2970, 21882 },
+ { 0x29DB, 21888 },
+ { 0x201D, 21892 },
+ { 0x2E29, 21896 },
+ { 0x22CA, 21899 },
+ { 0x2E0D, 21904 },
+ { 0x2019, 21908 },
+ { 0x005D, 21912 },
+ { 0x2990, 21915 },
+ { 0x298E, 21923 },
+ { 0x2046, 21931 },
+ { 0x298C, 21936 },
+ { 0x23A6, 21941 },
+ { 0x23A4, 21946 },
+ { 0x23A5, 21951 },
+ { 0x29D9, 21955 },
+ { 0x2309, 21958 },
+ { 0x27C6, 21960 },
+ { 0x2E27, 21964 },
+ { 0x3015, 21968 },
+ { 0x22BF, 21972 },
+ { 0x29CE, 21974 },
+ { 0x2E21, 21979 },
+ { 0x23B9, 21984 },
+ { 0x22CC, 21988 },
+ { 0x0029, 21991 },
+ { 0x23A0, 21993 },
+ { 0x239E, 21997 },
+ { 0x239F, 22001 },
+ { 0x2E03, 22004 },
+ { 0x2E0A, 22007 },
+ { 0x719A, 22010 },
+ { 0x7191, 22013 },
+ { 0x7194, 22016 },
+ { 0x2160, 22020 },
+ { 0x216D, 22023 },
+ { 0x2188, 22027 },
+ { 0x216F, 22032 },
+ { 0x2180, 22036 },
+ { 0x2165, 22042 },
+ { 0x2185, 22045 },
+ { 0x2169, 22050 },
+ { 0x2182, 22053 },
+ { 0x2161, 22057 },
+ { 0x2164, 22060 },
+ { 0x216E, 22063 },
+ { 0x2181, 22067 },
+ { 0x2163, 22071 },
+ { 0x2168, 22074 },
+ { 0x2167, 22077 },
+ { 0x216C, 22080 },
+ { 0x2186, 22083 },
+ { 0x2187, 22088 },
+ { 0x2166, 22092 },
+ { 0x2162, 22095 },
+ { 0x216A, 22098 },
+ { 0x216B, 22101 },
+ { 0x2183, 22104 },
+ { 0x7190, 22109 },
+ { 0x7193, 22112 },
+ { 0x7195, 22115 },
+ { 0x7196, 22118 },
+ { 0x7192, 22121 },
+ { 0x719B, 22124 },
+ { 0x7199, 22127 },
+ { 0x7197, 22130 },
+ { 0x7198, 22133 },
+ { 0x16ED, 22136 },
+ { 0x16EE, 22139 },
+ { 0x16CD, 22142 },
+ { 0x16D1, 22145 },
+ { 0x16C2, 22148 },
+ { 0x16B5, 22151 },
+ { 0x16AE, 22154 },
+ { 0x16E9, 22157 },
+ { 0x16A1, 22160 },
+ { 0x16A5, 22163 },
+ { 0x16EA, 22166 },
+ { 0x16A4, 22169 },
+ { 0x16CE, 22172 },
+ { 0x16AA, 22175 },
+ { 0x16AF, 22179 },
+ { 0x16B0, 22182 },
+ { 0x16A9, 22185 },
+ { 0x16A3, 22189 },
+ { 0x16B3, 22192 },
+ { 0x16E0, 22195 },
+ { 0x16B6, 22198 },
+ { 0x16A7, 22201 },
+ { 0x16B8, 22204 },
+ { 0x16C4, 22207 },
+ { 0x16DD, 22210 },
+ { 0x16E1, 22213 },
+ { 0x16AB, 22216 },
+ { 0x16E3, 22219 },
+ { 0x16A0, 22222 },
+ { 0x16B7, 22228 },
+ { 0x16C1, 22233 },
+ { 0x16C7, 22239 },
+ { 0x16B4, 22243 },
+ { 0x16E5, 22247 },
+ { 0x16A2, 22250 },
+ { 0x16C9, 22255 },
+ { 0x16A8, 22259 },
+ { 0x16E4, 22263 },
+ { 0x16DE, 22266 },
+ { 0x16D6, 22271 },
+ { 0x16BB, 22276 },
+ { 0x16C3, 22280 },
+ { 0x16B2, 22284 },
+ { 0x16B1, 22287 },
+ { 0x16CB, 22293 },
+ { 0x16CF, 22298 },
+ { 0x16B9, 22304 },
+ { 0x16BA, 22309 },
+ { 0x16DC, 22313 },
+ { 0x16DA, 22316 },
+ { 0x16D7, 22322 },
+ { 0x16BE, 22327 },
+ { 0x16D5, 22333 },
+ { 0x16C8, 22336 },
+ { 0x16CA, 22341 },
+ { 0x16E2, 22345 },
+ { 0x16DF, 22348 },
+ { 0x16D2, 22353 },
+ { 0x16DB, 22359 },
+ { 0x16C0, 22362 },
+ { 0x16D4, 22365 },
+ { 0x16A6, 22368 },
+ { 0x16E8, 22373 },
+ { 0x16C6, 22376 },
+ { 0x16E7, 22380 },
+ { 0x16C5, 22383 },
+ { 0x16E6, 22387 },
+ { 0x16AD, 22390 },
+ { 0x16CC, 22394 },
+ { 0x16D0, 22398 },
+ { 0x16AC, 22402 },
+ { 0x16D9, 22406 },
+ { 0x16BF, 22410 },
+ { 0x16D8, 22414 },
+ { 0x16BD, 22418 },
+ { 0x16BC, 22422 },
+ { 0x16D3, 22426 },
+ { 0x16EB, 22430 },
+ { 0x16F0, 22433 },
+ { 0x16EC, 22436 },
+ { 0x16EF, 22439 },
+ { 0x20A8, 22442 },
+ { 0x2AE0, 22444 },
+ { 0x2AE8, 22447 },
+ { 0x2AE9, 22452 },
+ { 0x2ADF, 22459 },
+ { 0x2AE7, 22462 },
+ { 0x2ADE, 22467 },
+ { 0x2944, 22470 },
+ { 0x2620, 22476 },
+ { 0x2333, 22479 },
+ { 0x6E58, 22480 },
+ { 0x2A61, 22483 },
+ { 0x6E52, 22487 },
+ { 0x6E5B, 22490 },
+ { 0x6E5D, 22494 },
+ { 0x6E59, 22499 },
+ { 0x6E62, 22502 },
+ { 0x6E55, 22505 },
+ { 0x6E50, 22507 },
+ { 0x6E5C, 22509 },
+ { 0x6E5E, 22513 },
+ { 0x6E5A, 22518 },
+ { 0x2170, 22521 },
+ { 0x217D, 22525 },
+ { 0x217F, 22530 },
+ { 0x2175, 22535 },
+ { 0x2179, 22539 },
+ { 0x2171, 22543 },
+ { 0x2174, 22547 },
+ { 0x217E, 22551 },
+ { 0x2173, 22556 },
+ { 0x2178, 22560 },
+ { 0x2177, 22564 },
+ { 0x217C, 22568 },
+ { 0x2176, 22572 },
+ { 0x2172, 22576 },
+ { 0x217A, 22580 },
+ { 0x217B, 22584 },
+ { 0x02DC, 22588 },
+ { 0x6E69, 22590 },
+ { 0x6E66, 22593 },
+ { 0x6E5F, 22596 },
+ { 0x220A, 22599 },
+ { 0x22F7, 22602 },
+ { 0x22F4, 22607 },
+ { 0x6E6A, 22618 },
+ { 0x6E68, 22621 },
+ { 0x6E61, 22624 },
+ { 0x220D, 22626 },
+ { 0x22FE, 22630 },
+ { 0x22FC, 22634 },
+ { 0x6E56, 22644 },
+ { 0x6E60, 22647 },
+ { 0x6E64, 22649 },
+ { 0x6E54, 22652 },
+ { 0x6E6B, 22654 },
+ { 0x6E57, 22657 },
+ { 0x6E51, 22660 },
+ { 0x6E65, 22663 },
+ { 0x6E63, 22666 },
+ { 0x2A33, 22668 },
+ { 0x2323, 22670 },
+ { 0x2117, 22671 },
+ { 0x2198, 22674 },
+ { 0x21F2, 22677 },
+ { 0x2929, 22682 },
+ { 0x2925, 22689 },
+ { 0x292D, 22694 },
+ { 0x2B0A, 22701 },
+ { 0x2B02, 22705 },
+ { 0x21D8, 22709 },
+ { 0x2199, 22713 },
+ { 0x292A, 22716 },
+ { 0x2926, 22723 },
+ { 0x2B0B, 22728 },
+ { 0x2B03, 22732 },
+ { 0x21D9, 22736 },
+ { 0x0020, 22740 },
+ { 0x27A7, 22741 },
+ { 0x269A, 22745 },
+ { 0x2695, 22748 },
+ { 0x2053, 22751 },
+ { 0x0BF8, 22753 },
+ { 0x0BD7, 22757 },
+ { 0x0BD0, 22761 },
+ { 0x0BF3, 22763 },
+ { 0x0BCD, 22766 },
+ { 0x0B83, 22769 },
+ { 0x0B82, 22772 },
+ { 0x0BF5, 22775 },
+ { 0x0BF6, 22778 },
+ { 0x0BE7, 22781 },
+ { 0x0BEC, 22784 },
+ { 0x0BE8, 22787 },
+ { 0x0BEB, 22790 },
+ { 0x0BEA, 22793 },
+ { 0x0BEF, 22796 },
+ { 0x0BE6, 22799 },
+ { 0x0BEE, 22802 },
+ { 0x0BED, 22805 },
+ { 0x0BE9, 22808 },
+ { 0x0BF4, 22811 },
+ { 0x0BF9, 22814 },
+ { 0x0BC6, 22817 },
+ { 0x0BBF, 22821 },
+ { 0x0BCA, 22825 },
+ { 0x0BC1, 22829 },
+ { 0x0BBE, 22833 },
+ { 0x0BC8, 22837 },
+ { 0x0BCC, 22841 },
+ { 0x0BC7, 22845 },
+ { 0x0BC0, 22849 },
+ { 0x0BCB, 22853 },
+ { 0x0BC2, 22857 },
+ { 0x0BF7, 22861 },
+ { 0x0B85, 22864 },
+ { 0x0B8E, 22867 },
+ { 0x0B87, 22870 },
+ { 0x0B92, 22873 },
+ { 0x0B89, 22876 },
+ { 0x0B86, 22879 },
+ { 0x0B90, 22882 },
+ { 0x0B94, 22885 },
+ { 0x0B9A, 22888 },
+ { 0x0B8F, 22891 },
+ { 0x0BB9, 22894 },
+ { 0x0B88, 22897 },
+ { 0x0B9C, 22900 },
+ { 0x0B95, 22903 },
+ { 0x0BB2, 22906 },
+ { 0x0BAE, 22909 },
+ { 0x0BA8, 22912 },
+ { 0x0B93, 22915 },
+ { 0x0BAA, 22918 },
+ { 0x0BB0, 22921 },
+ { 0x0BB8, 22924 },
+ { 0x0BA4, 22927 },
+ { 0x0B8A, 22930 },
+ { 0x0BB5, 22933 },
+ { 0x0BAF, 22936 },
+ { 0x0BB3, 22939 },
+ { 0x0B99, 22942 },
+ { 0x0BA3, 22945 },
+ { 0x0B9E, 22948 },
+ { 0x0BB1, 22951 },
+ { 0x0BB6, 22954 },
+ { 0x0BB7, 22957 },
+ { 0x0B9F, 22960 },
+ { 0x0BB4, 22963 },
+ { 0x0BA9, 22966 },
+ { 0x0BF1, 22969 },
+ { 0x0BF2, 22973 },
+ { 0x0BF0, 22977 },
+ { 0x0BFA, 22980 },
+ { 0x2204, 22983 },
+ { 0x2203, 22987 },
+ { 0x2056, 22989 },
+ { 0x2B31, 22992 },
+ { 0x21F6, 22995 },
+ { 0x2A76, 22998 },
+ { 0x27C0, 23002 },
+ { 0x2745, 23005 },
+ { 0x007E, 23008 },
+ { 0x2E1E, 23009 },
+ { 0x2E1F, 23013 },
+ { 0x2E1B, 23017 },
+ { 0x223C, 23021 },
+ { 0x2A6A, 23023 },
+ { 0x2A6B, 23028 },
+ { 0x2B49, 23033 },
+ { 0x2972, 23038 },
+ { 0x29D4, 23043 },
+ { 0x29D5, 23048 },
+ { 0x2330, 23053 },
+ { 0x2122, 23055 },
+ { 0x222A, 23058 },
+ { 0x2A41, 23059 },
+ { 0x2A45, 23063 },
+ { 0x2A42, 23067 },
+ { 0x2A48, 23070 },
+ { 0x2A46, 23075 },
+ { 0x2A4A, 23078 },
+ { 0x2594, 23084 },
+ { 0x2580, 23088 },
+ { 0x25E0, 23091 },
+ { 0x25DA, 23094 },
+ { 0x23B0, 23099 },
+ { 0x27D4, 23107 },
+ { 0x25DC, 23112 },
+ { 0x25F8, 23117 },
+ { 0x2701, 23120 },
+ { 0x23B1, 23123 },
+ { 0x2710, 23131 },
+ { 0x25DD, 23134 },
+ { 0x2752, 23139 },
+ { 0x25F9, 23144 },
+ { 0x2750, 23147 },
+ { 0x26B6, 23152 },
+ { 0x264D, 23153 },
+ { 0x231A, 23154 },
+ { 0x2638, 23155 },
+ { 0x261D, 23158 },
+ { 0x2711, 23162 },
+ { 0x263C, 23164 },
+ { 0x2667, 23168 },
+ { 0x261F, 23171 },
+ { 0x2690, 23175 },
+ { 0x2727, 23177 },
+ { 0x261C, 23181 },
+ { 0x2606, 23185 },
+ { 0x2B1E, 23187 },
+ { 0x2654, 23191 },
+ { 0x2659, 23194 },
+ { 0x2656, 23197 },
+ { 0x2655, 23200 },
+ { 0x2657, 23203 },
+ { 0x2658, 23206 },
+ { 0x2661, 23209 },
+ { 0x2B1C, 23212 },
+ { 0x261E, 23215 },
+ { 0x2616, 23219 },
+ { 0x2B52, 23222 },
+ { 0x25AB, 23225 },
+ { 0x2B2B, 23228 },
+ { 0x2664, 23231 },
+ { 0x25E6, 23234 },
+ { 0x25CB, 23236 },
+ { 0x2686, 23238 },
+ { 0x2687, 23243 },
+ { 0x29EC, 23248 },
+ { 0x25F5, 23253 },
+ { 0x25F6, 23259 },
+ { 0x25F4, 23265 },
+ { 0x25F7, 23271 },
+ { 0x2B50, 23277 },
+ { 0x25FD, 23280 },
+ { 0x25FB, 23284 },
+ { 0x2B26, 23287 },
+ { 0x2B28, 23290 },
+ { 0x6E46, 23293 },
+ { 0x25A1, 23296 },
+ { 0x25F1, 23298 },
+ { 0x25F2, 23304 },
+ { 0x25F0, 23310 },
+ { 0x25F3, 23316 },
+ { 0x2385, 23322 },
+ { 0x25A2, 23328 },
+ { 0x25EB, 23333 },
+ { 0x27E4, 23339 },
+ { 0x27E5, 23344 },
+ { 0x25A3, 23349 },
+ { 0x25C7, 23355 },
+ { 0x2662, 23357 },
+ { 0x27D0, 23360 },
+ { 0x25C8, 23365 },
+ { 0x2B21, 23371 },
+ { 0x263A, 23373 },
+ { 0x26C0, 23376 },
+ { 0x26C1, 23379 },
+ { 0x2740, 23382 },
+ { 0x2639, 23384 },
+ { 0x2B20, 23387 },
+ { 0x2704, 23389 },
+ { 0x27C1, 23391 },
+ { 0x2AFE, 23397 },
+ { 0x2B2F, 23400 },
+ { 0x25AF, 23403 },
+ { 0x29D6, 23406 },
+ { 0x25AD, 23408 },
+ { 0x260F, 23410 },
+ { 0x23E2, 23412 },
+ { 0x2B2D, 23414 },
+ { 0x25B5, 23417 },
+ { 0x25B3, 23421 },
+ { 0x25EC, 23424 },
+ { 0x27E1, 23429 },
+ { 0x27E2, 23432 },
+ { 0x27E3, 23438 },
+ { 0x25BF, 23444 },
+ { 0x25BD, 23448 },
+ { 0x25C3, 23451 },
+ { 0x25C5, 23455 },
+ { 0x25C1, 23458 },
+ { 0x25B1, 23461 },
+ { 0x25B9, 23463 },
+ { 0x25BB, 23467 },
+ { 0x2B54, 23470 },
+ { 0x25B7, 23473 },
+ { 0x713C, 23476 },
+ { 0x7101, 23481 },
+ { 0x7100, 23485 },
+ { 0x7102, 23489 },
+ { 0x713D, 23492 },
+ { 0x7107, 23497 },
+ { 0x7119, 23500 },
+ { 0x7122, 23504 },
+ { 0x710C, 23508 },
+ { 0x711E, 23511 },
+ { 0x7127, 23515 },
+ { 0x7110, 23519 },
+ { 0x712B, 23522 },
+ { 0x7108, 23526 },
+ { 0x711A, 23529 },
+ { 0x7123, 23533 },
+ { 0x710B, 23537 },
+ { 0x711D, 23540 },
+ { 0x7126, 23544 },
+ { 0x710A, 23548 },
+ { 0x711C, 23551 },
+ { 0x7125, 23555 },
+ { 0x710F, 23559 },
+ { 0x7121, 23562 },
+ { 0x712A, 23566 },
+ { 0x710E, 23570 },
+ { 0x7120, 23573 },
+ { 0x7129, 23577 },
+ { 0x7114, 23581 },
+ { 0x712F, 23584 },
+ { 0x7113, 23588 },
+ { 0x712E, 23591 },
+ { 0x710D, 23595 },
+ { 0x711F, 23598 },
+ { 0x7128, 23602 },
+ { 0x7115, 23606 },
+ { 0x7130, 23609 },
+ { 0x7109, 23613 },
+ { 0x711B, 23616 },
+ { 0x7124, 23620 },
+ { 0x7117, 23624 },
+ { 0x7132, 23627 },
+ { 0x7118, 23631 },
+ { 0x7133, 23634 },
+ { 0x7112, 23638 },
+ { 0x712D, 23641 },
+ { 0x7111, 23645 },
+ { 0x712C, 23648 },
+ { 0x7116, 23652 },
+ { 0x7131, 23655 },
+ { 0x7137, 23659 },
+ { 0x7138, 23663 },
+ { 0x713A, 23667 },
+ { 0x713B, 23671 },
+ { 0x7139, 23675 },
+ { 0x713F, 23679 },
+ { 0x713E, 23683 },
+ { 0x224A, 23687 },
+ { 0x2248, 23692 },
+ { 0x2A6F, 23695 },
+ { 0x2693, 23701 },
+ { 0x06DD, 23702 },
+ { 0x0608, 23706 },
+ { 0x060D, 23708 },
+ { 0x066D, 23711 },
+ { 0x06D4, 23715 },
+ { 0x0658, 23718 },
+ { 0x0613, 23722 },
+ { 0x060F, 23727 },
+ { 0x0603, 23730 },
+ { 0x0601, 23733 },
+ { 0x0611, 23736 },
+ { 0x06FD, 23740 },
+ { 0x06FE, 23744 },
+ { 0x0614, 23749 },
+ { 0x0612, 23752 },
+ { 0x0610, 23756 },
+ { 0x6E73, 23761 },
+ { 0x060C, 23764 },
+ { 0x064F, 23766 },
+ { 0x6E79, 23768 },
+ { 0x6E78, 23772 },
+ { 0x06EA, 23776 },
+ { 0x06EB, 23781 },
+ { 0x064E, 23786 },
+ { 0x065E, 23788 },
+ { 0x6E77, 23793 },
+ { 0x6E76, 23797 },
+ { 0x0654, 23801 },
+ { 0x0655, 23804 },
+ { 0x0650, 23807 },
+ { 0x6E7B, 23809 },
+ { 0x6E7A, 23813 },
+ { 0x06E9, 23817 },
+ { 0x06ED, 23821 },
+ { 0x06E3, 23825 },
+ { 0x06E5, 23829 },
+ { 0x06E6, 23832 },
+ { 0x06D9, 23835 },
+ { 0x0615, 23840 },
+ { 0x06E7, 23844 },
+ { 0x06DA, 23848 },
+ { 0x06D8, 23852 },
+ { 0x06E2, 23858 },
+ { 0x06E8, 23864 },
+ { 0x06DC, 23868 },
+ { 0x0617, 23872 },
+ { 0x06E4, 23876 },
+ { 0x06DB, 23880 },
+ { 0x06E1, 23885 },
+ { 0x06DF, 23892 },
+ { 0x06E0, 23897 },
+ { 0x06D7, 23903 },
+ { 0x06D6, 23913 },
+ { 0x0616, 23923 },
+ { 0x0619, 23932 },
+ { 0x0618, 23935 },
+ { 0x061A, 23938 },
+ { 0x06DE, 23941 },
+ { 0x0652, 23947 },
+ { 0x6E7F, 23949 },
+ { 0x6E7E, 23953 },
+ { 0x065C, 23957 },
+ { 0x065A, 23962 },
+ { 0x065B, 23968 },
+ { 0x06D0, 23975 },
+ { 0x6BE5, 23978 },
+ { 0x6BE7, 23983 },
+ { 0x6BE6, 23988 },
+ { 0x6BE4, 23993 },
+ { 0x06C7, 23998 },
+ { 0x0677, 24001 },
+ { 0x6BDD, 24007 },
+ { 0x6BD8, 24015 },
+ { 0x6BD7, 24020 },
+ { 0x06D5, 24025 },
+ { 0x06AD, 24028 },
+ { 0x6BD4, 24031 },
+ { 0x6BD6, 24036 },
+ { 0x6BD5, 24041 },
+ { 0x6BD3, 24046 },
+ { 0x06C6, 24051 },
+ { 0x6BDA, 24054 },
+ { 0x6BD9, 24059 },
+ { 0x06CB, 24064 },
+ { 0x6BDF, 24067 },
+ { 0x6BDE, 24072 },
+ { 0x06C8, 24077 },
+ { 0x6BDC, 24080 },
+ { 0x6BDB, 24085 },
+ { 0x0639, 24090 },
+ { 0x075D, 24093 },
+ { 0x075F, 24100 },
+ { 0x06A0, 24108 },
+ { 0x075E, 24115 },
+ { 0x6ECA, 24124 },
+ { 0x6ECC, 24129 },
+ { 0x6ECB, 24134 },
+ { 0x6EC9, 24139 },
+ { 0x0628, 24144 },
+ { 0x0751, 24147 },
+ { 0x0754, 24157 },
+ { 0x0756, 24167 },
+ { 0x0752, 24173 },
+ { 0x0753, 24182 },
+ { 0x0750, 24195 },
+ { 0x0755, 24203 },
+ { 0x6E90, 24211 },
+ { 0x6E92, 24216 },
+ { 0x6E91, 24221 },
+ { 0x6E8F, 24226 },
+ { 0x0636, 24231 },
+ { 0x06FB, 24234 },
+ { 0x6EBE, 24240 },
+ { 0x6EC0, 24245 },
+ { 0x6EBF, 24250 },
+ { 0x6EBD, 24255 },
+ { 0x062F, 24260 },
+ { 0x068A, 24263 },
+ { 0x068B, 24269 },
+ { 0x0759, 24278 },
+ { 0x0690, 24289 },
+ { 0x0689, 24296 },
+ { 0x068F, 24301 },
+ { 0x06EE, 24309 },
+ { 0x075A, 24315 },
+ { 0x6EAA, 24323 },
+ { 0x6EA9, 24328 },
+ { 0x068E, 24333 },
+ { 0x6B87, 24336 },
+ { 0x6B86, 24341 },
+ { 0x0641, 24346 },
+ { 0x06A3, 24349 },
+ { 0x06A2, 24355 },
+ { 0x0760, 24362 },
+ { 0x06A5, 24369 },
+ { 0x0761, 24376 },
+ { 0x6ED2, 24385 },
+ { 0x6ED4, 24390 },
+ { 0x6ED3, 24395 },
+ { 0x6ED1, 24400 },
+ { 0x06AF, 24405 },
+ { 0x06B2, 24408 },
+ { 0x06B0, 24415 },
+ { 0x06B4, 24420 },
+ { 0x6B93, 24427 },
+ { 0x6B95, 24432 },
+ { 0x6B94, 24437 },
+ { 0x6B92, 24442 },
+ { 0x062D, 24447 },
+ { 0x0757, 24450 },
+ { 0x0682, 24457 },
+ { 0x0681, 24465 },
+ { 0x076F, 24471 },
+ { 0x0772, 24482 },
+ { 0x076E, 24491 },
+ { 0x0685, 24500 },
+ { 0x0758, 24507 },
+ { 0x077C, 24516 },
+ { 0x6EA2, 24525 },
+ { 0x6EA4, 24530 },
+ { 0x6EA3, 24535 },
+ { 0x6EA1, 24540 },
+ { 0x0647, 24545 },
+ { 0x06C1, 24548 },
+ { 0x06C2, 24552 },
+ { 0x6BA7, 24559 },
+ { 0x6BA9, 24565 },
+ { 0x6BA8, 24571 },
+ { 0x6BA6, 24577 },
+ { 0x06C0, 24583 },
+ { 0x6BA5, 24589 },
+ { 0x6BA4, 24597 },
+ { 0x06FF, 24605 },
+ { 0x6EEA, 24611 },
+ { 0x6EEC, 24616 },
+ { 0x6EEB, 24621 },
+ { 0x6EE9, 24626 },
+ { 0x06BE, 24631 },
+ { 0x6BAB, 24635 },
+ { 0x6BAD, 24641 },
+ { 0x6BAC, 24647 },
+ { 0x6BAA, 24653 },
+ { 0x0698, 24659 },
+ { 0x6B8B, 24662 },
+ { 0x6B8A, 24667 },
+ { 0x0643, 24672 },
+ { 0x06AC, 24675 },
+ { 0x077F, 24681 },
+ { 0x06AB, 24688 },
+ { 0x06AE, 24693 },
+ { 0x6EDA, 24700 },
+ { 0x6EDC, 24705 },
+ { 0x6EDB, 24710 },
+ { 0x6ED9, 24715 },
+ { 0x0644, 24720 },
+ { 0x076A, 24723 },
+ { 0x06B6, 24728 },
+ { 0x06B5, 24734 },
+ { 0x06B7, 24740 },
+ { 0x06B8, 24747 },
+ { 0x6EDE, 24754 },
+ { 0x6EE0, 24759 },
+ { 0x6EDF, 24764 },
+ { 0x6EDD, 24769 },
+ { 0x067E, 24774 },
+ { 0x6B57, 24777 },
+ { 0x6B59, 24782 },
+ { 0x6B58, 24787 },
+ { 0x6B56, 24792 },
+ { 0x0642, 24797 },
+ { 0x06A7, 24800 },
+ { 0x06A8, 24806 },
+ { 0x6ED6, 24813 },
+ { 0x6ED8, 24818 },
+ { 0x6ED7, 24823 },
+ { 0x6ED5, 24828 },
+ { 0x0631, 24833 },
+ { 0x0694, 24836 },
+ { 0x0696, 24842 },
+ { 0x0697, 24851 },
+ { 0x076B, 24858 },
+ { 0x0699, 24866 },
+ { 0x0693, 24873 },
+ { 0x076C, 24878 },
+ { 0x0692, 24884 },
+ { 0x0695, 24890 },
+ { 0x0771, 24897 },
+ { 0x075B, 24908 },
+ { 0x06EF, 24913 },
+ { 0x6EAE, 24919 },
+ { 0x6EAD, 24924 },
+ { 0x0635, 24929 },
+ { 0x069D, 24932 },
+ { 0x069E, 24939 },
+ { 0x6EBA, 24946 },
+ { 0x6EBC, 24951 },
+ { 0x6EBB, 24956 },
+ { 0x6EB9, 24961 },
+ { 0x0637, 24966 },
+ { 0x069F, 24969 },
+ { 0x6EC2, 24976 },
+ { 0x6EC4, 24981 },
+ { 0x6EC3, 24986 },
+ { 0x6EC1, 24991 },
+ { 0x062A, 24996 },
+ { 0x067C, 24999 },
+ { 0x067D, 25004 },
+ { 0x6E96, 25012 },
+ { 0x6E98, 25017 },
+ { 0x6E97, 25022 },
+ { 0x0629, 25027 },
+ { 0x06C3, 25031 },
+ { 0x6E94, 25036 },
+ { 0x6E93, 25042 },
+ { 0x6E95, 25048 },
+ { 0x06A4, 25053 },
+ { 0x6B6B, 25056 },
+ { 0x6B6D, 25061 },
+ { 0x6B6C, 25066 },
+ { 0x6B6A, 25071 },
+ { 0x0648, 25076 },
+ { 0x06CF, 25079 },
+ { 0x06CA, 25085 },
+ { 0x06C4, 25092 },
+ { 0x0624, 25097 },
+ { 0x6E86, 25103 },
+ { 0x6E85, 25111 },
+ { 0x0778, 25119 },
+ { 0x0779, 25128 },
+ { 0x6EEE, 25137 },
+ { 0x6EED, 25142 },
+ { 0x064A, 25147 },
+ { 0x06CD, 25150 },
+ { 0x0626, 25155 },
+ { 0x6E8A, 25161 },
+ { 0x6E8C, 25169 },
+ { 0x6E8B, 25177 },
+ { 0x6E89, 25185 },
+ { 0x06CE, 25193 },
+ { 0x06D1, 25199 },
+ { 0x6EF2, 25206 },
+ { 0x06D2, 25211 },
+ { 0x06D3, 25215 },
+ { 0x6BB1, 25222 },
+ { 0x6BB0, 25231 },
+ { 0x077A, 25240 },
+ { 0x077B, 25250 },
+ { 0x6BAF, 25260 },
+ { 0x6BAE, 25266 },
+ { 0x6EF4, 25272 },
+ { 0x6EF3, 25277 },
+ { 0x6EF1, 25282 },
+ { 0x0638, 25287 },
+ { 0x6EC6, 25290 },
+ { 0x6EC8, 25295 },
+ { 0x6EC7, 25300 },
+ { 0x6EC5, 25305 },
+ { 0x0627, 25310 },
+ { 0x0672, 25313 },
+ { 0x0673, 25320 },
+ { 0x0623, 25327 },
+ { 0x6E84, 25333 },
+ { 0x6E83, 25341 },
+ { 0x0625, 25349 },
+ { 0x6E88, 25355 },
+ { 0x6E87, 25363 },
+ { 0x0622, 25371 },
+ { 0x6E82, 25377 },
+ { 0x6E81, 25385 },
+ { 0x0773, 25393 },
+ { 0x0774, 25402 },
+ { 0x6E8E, 25411 },
+ { 0x0671, 25416 },
+ { 0x6B51, 25420 },
+ { 0x6B50, 25426 },
+ { 0x0649, 25432 },
+ { 0x6EF0, 25436 },
+ { 0x6EEF, 25442 },
+ { 0x6E8D, 25448 },
+ { 0x067B, 25453 },
+ { 0x6B53, 25456 },
+ { 0x6B55, 25461 },
+ { 0x6B54, 25466 },
+ { 0x6B52, 25471 },
+ { 0x0688, 25476 },
+ { 0x6B89, 25479 },
+ { 0x6B88, 25484 },
+ { 0x0684, 25489 },
+ { 0x6B73, 25492 },
+ { 0x6B75, 25497 },
+ { 0x6B74, 25502 },
+ { 0x6B72, 25507 },
+ { 0x06B3, 25512 },
+ { 0x6B97, 25515 },
+ { 0x6B99, 25520 },
+ { 0x6B98, 25525 },
+ { 0x6B96, 25530 },
+ { 0x0674, 25535 },
+ { 0x0676, 25539 },
+ { 0x0678, 25544 },
+ { 0x0675, 25549 },
+ { 0x062C, 25554 },
+ { 0x6E9E, 25557 },
+ { 0x6EA0, 25562 },
+ { 0x6E9F, 25567 },
+ { 0x6E9D, 25572 },
+ { 0x062E, 25577 },
+ { 0x6EA6, 25580 },
+ { 0x6EA8, 25585 },
+ { 0x6EA7, 25590 },
+ { 0x6EA5, 25595 },
+ { 0x0645, 25600 },
+ { 0x0765, 25603 },
+ { 0x0766, 25609 },
+ { 0x6EE2, 25615 },
+ { 0x6EE4, 25620 },
+ { 0x6EE3, 25625 },
+ { 0x6EE1, 25630 },
+ { 0x0646, 25635 },
+ { 0x06B9, 25638 },
+ { 0x0767, 25644 },
+ { 0x06BC, 25651 },
+ { 0x0769, 25656 },
+ { 0x0768, 25662 },
+ { 0x06BD, 25668 },
+ { 0x6EE6, 25675 },
+ { 0x06BA, 25680 },
+ { 0x6B9F, 25684 },
+ { 0x6B9E, 25690 },
+ { 0x6EE8, 25696 },
+ { 0x6EE7, 25701 },
+ { 0x6EE5, 25706 },
+ { 0x0683, 25711 },
+ { 0x6B77, 25714 },
+ { 0x6B79, 25719 },
+ { 0x6B78, 25724 },
+ { 0x6B76, 25729 },
+ { 0x0691, 25734 },
+ { 0x6B8D, 25737 },
+ { 0x6B8C, 25742 },
+ { 0x0633, 25747 },
+ { 0x069A, 25750 },
+ { 0x076D, 25759 },
+ { 0x075C, 25767 },
+ { 0x0770, 25774 },
+ { 0x069B, 25785 },
+ { 0x069C, 25792 },
+ { 0x077D, 25803 },
+ { 0x077E, 25812 },
+ { 0x6EB2, 25818 },
+ { 0x6EB4, 25823 },
+ { 0x6EB3, 25828 },
+ { 0x6EB1, 25833 },
+ { 0x0630, 25838 },
+ { 0x6EAC, 25841 },
+ { 0x6EAB, 25846 },
+ { 0x062B, 25851 },
+ { 0x6E9A, 25854 },
+ { 0x6E9C, 25859 },
+ { 0x6E9B, 25864 },
+ { 0x6E99, 25869 },
+ { 0x0679, 25874 },
+ { 0x6B67, 25877 },
+ { 0x6B69, 25882 },
+ { 0x6B68, 25887 },
+ { 0x6B66, 25892 },
+ { 0x0632, 25897 },
+ { 0x6EB0, 25900 },
+ { 0x6EAF, 25905 },
+ { 0x0680, 25910 },
+ { 0x6B5B, 25913 },
+ { 0x6B5D, 25918 },
+ { 0x6B5C, 25923 },
+ { 0x6B5A, 25928 },
+ { 0x068C, 25933 },
+ { 0x6B85, 25936 },
+ { 0x6B84, 25941 },
+ { 0x06CC, 25946 },
+ { 0x063E, 25950 },
+ { 0x063F, 25958 },
+ { 0x0775, 25966 },
+ { 0x0777, 25976 },
+ { 0x0776, 25986 },
+ { 0x063D, 25996 },
+ { 0x6BFD, 26003 },
+ { 0x6BFF, 26009 },
+ { 0x6BFE, 26015 },
+ { 0x6BFC, 26021 },
+ { 0x063A, 26027 },
+ { 0x06FC, 26030 },
+ { 0x6ECE, 26036 },
+ { 0x6ED0, 26041 },
+ { 0x6ECF, 26046 },
+ { 0x6ECD, 26051 },
+ { 0x0621, 26056 },
+ { 0x6E80, 26059 },
+ { 0x06A9, 26064 },
+ { 0x0762, 26067 },
+ { 0x063B, 26073 },
+ { 0x0763, 26080 },
+ { 0x063C, 26087 },
+ { 0x0764, 26094 },
+ { 0x6B8F, 26103 },
+ { 0x6B91, 26108 },
+ { 0x6B90, 26113 },
+ { 0x6B8E, 26118 },
+ { 0x06B1, 26123 },
+ { 0x6B9B, 26126 },
+ { 0x6B9D, 26131 },
+ { 0x6B9C, 26136 },
+ { 0x6B9A, 26141 },
+ { 0x06A6, 26146 },
+ { 0x6B6F, 26149 },
+ { 0x6B71, 26154 },
+ { 0x6B70, 26159 },
+ { 0x6B6E, 26164 },
+ { 0x06BB, 26169 },
+ { 0x6BA1, 26172 },
+ { 0x6BA3, 26177 },
+ { 0x6BA2, 26182 },
+ { 0x6BA0, 26187 },
+ { 0x0634, 26192 },
+ { 0x06FA, 26195 },
+ { 0x6EB6, 26201 },
+ { 0x6EB8, 26206 },
+ { 0x6EB7, 26211 },
+ { 0x6EB5, 26216 },
+ { 0x06AA, 26221 },
+ { 0x0686, 26225 },
+ { 0x06BF, 26228 },
+ { 0x6B7B, 26234 },
+ { 0x6B7D, 26239 },
+ { 0x6B7C, 26244 },
+ { 0x6B7A, 26249 },
+ { 0x067F, 26254 },
+ { 0x6B63, 26257 },
+ { 0x6B65, 26262 },
+ { 0x6B64, 26267 },
+ { 0x6B62, 26272 },
+ { 0x068D, 26277 },
+ { 0x6B83, 26280 },
+ { 0x6B82, 26285 },
+ { 0x067A, 26290 },
+ { 0x6B5F, 26293 },
+ { 0x6B61, 26298 },
+ { 0x6B60, 26303 },
+ { 0x6B5E, 26308 },
+ { 0x6BE9, 26313 },
+ { 0x6BE8, 26322 },
+ { 0x066E, 26331 },
+ { 0x06A1, 26335 },
+ { 0x066F, 26339 },
+ { 0x06C5, 26343 },
+ { 0x6BE1, 26347 },
+ { 0x6BE0, 26353 },
+ { 0x06C9, 26359 },
+ { 0x6BE3, 26363 },
+ { 0x6BE2, 26369 },
+ { 0x0687, 26375 },
+ { 0x6B7F, 26378 },
+ { 0x6B81, 26383 },
+ { 0x6B80, 26388 },
+ { 0x6B7E, 26393 },
+ { 0x0670, 26398 },
+ { 0x0653, 26402 },
+ { 0x0600, 26405 },
+ { 0x060E, 26408 },
+ { 0x0651, 26412 },
+ { 0x6E7D, 26414 },
+ { 0x6E7C, 26418 },
+ { 0x061E, 26422 },
+ { 0x066B, 26427 },
+ { 0x066A, 26430 },
+ { 0x06EC, 26433 },
+ { 0x0640, 26440 },
+ { 0x6E71, 26442 },
+ { 0x064C, 26447 },
+ { 0x6E72, 26449 },
+ { 0x064B, 26453 },
+ { 0x6E70, 26455 },
+ { 0x0602, 26459 },
+ { 0x0657, 26462 },
+ { 0x064D, 26465 },
+ { 0x6E74, 26467 },
+ { 0x6D14, 26471 },
+ { 0x6CF8, 26478 },
+ { 0x6D13, 26485 },
+ { 0x6CF7, 26493 },
+ { 0x6D75, 26501 },
+ { 0x6DC4, 26510 },
+ { 0x6CBA, 26519 },
+ { 0x6C29, 26526 },
+ { 0x6DB6, 26533 },
+ { 0x6D78, 26542 },
+ { 0x6D76, 26552 },
+ { 0x6D77, 26561 },
+ { 0x6CBB, 26570 },
+ { 0x6C2A, 26577 },
+ { 0x6DC2, 26584 },
+ { 0x6C9D, 26593 },
+ { 0x6C06, 26600 },
+ { 0x6CE2, 26607 },
+ { 0x6CA0, 26614 },
+ { 0x6C6A, 26621 },
+ { 0x6C6F, 26628 },
+ { 0x6C0A, 26635 },
+ { 0x6C6E, 26642 },
+ { 0x6C09, 26650 },
+ { 0x6C9C, 26658 },
+ { 0x6C05, 26665 },
+ { 0x6D9E, 26672 },
+ { 0x6C9E, 26681 },
+ { 0x6C07, 26688 },
+ { 0x6C6C, 26695 },
+ { 0x6CE1, 26702 },
+ { 0x6C9F, 26709 },
+ { 0x6C08, 26716 },
+ { 0x6C6D, 26723 },
+ { 0x6C6B, 26730 },
+ { 0x6DAB, 26737 },
+ { 0x6D6E, 26746 },
+ { 0x6CB5, 26756 },
+ { 0x6C23, 26763 },
+ { 0x6D2C, 26770 },
+ { 0x6D10, 26777 },
+ { 0x6D24, 26784 },
+ { 0x6D08, 26791 },
+ { 0x6D23, 26798 },
+ { 0x6D07, 26806 },
+ { 0x6CB4, 26814 },
+ { 0x6C22, 26821 },
+ { 0x6D6F, 26828 },
+ { 0x6D70, 26837 },
+ { 0x6CB6, 26846 },
+ { 0x6C24, 26853 },
+ { 0x6CB7, 26860 },
+ { 0x6C25, 26867 },
+ { 0x6CBF, 26874 },
+ { 0x6C2E, 26881 },
+ { 0x6C7D, 26888 },
+ { 0x6C32, 26895 },
+ { 0x6C7C, 26902 },
+ { 0x6C31, 26910 },
+ { 0x6CBE, 26918 },
+ { 0x6C2D, 26925 },
+ { 0x6D7C, 26932 },
+ { 0x6D7D, 26941 },
+ { 0x6CC0, 26950 },
+ { 0x6C2F, 26957 },
+ { 0x6DC1, 26964 },
+ { 0x6CC1, 26973 },
+ { 0x6C30, 26980 },
+ { 0x6D1C, 26987 },
+ { 0x6D00, 26994 },
+ { 0x6D1B, 27001 },
+ { 0x6CFF, 27009 },
+ { 0x6DBF, 27017 },
+ { 0x6CA9, 27026 },
+ { 0x6C17, 27033 },
+ { 0x6D5A, 27040 },
+ { 0x6D5B, 27049 },
+ { 0x6CAA, 27059 },
+ { 0x6C18, 27066 },
+ { 0x6C54, 27073 },
+ { 0x6C53, 27080 },
+ { 0x6CD7, 27088 },
+ { 0x6C51, 27095 },
+ { 0x6D93, 27102 },
+ { 0x6D94, 27111 },
+ { 0x6CD8, 27120 },
+ { 0x6C52, 27127 },
+ { 0x6CD9, 27134 },
+ { 0x6CC5, 27142 },
+ { 0x6C39, 27149 },
+ { 0x6C81, 27156 },
+ { 0x6CEB, 27163 },
+ { 0x6CC7, 27170 },
+ { 0x6C3B, 27177 },
+ { 0x6C84, 27184 },
+ { 0x6C3E, 27191 },
+ { 0x6C80, 27198 },
+ { 0x6C83, 27205 },
+ { 0x6C3D, 27213 },
+ { 0x6C37, 27221 },
+ { 0x6CC4, 27228 },
+ { 0x6C38, 27235 },
+ { 0x6CC6, 27242 },
+ { 0x6C3A, 27249 },
+ { 0x6DB7, 27256 },
+ { 0x6DBB, 27265 },
+ { 0x6DC3, 27274 },
+ { 0x6C82, 27283 },
+ { 0x6CEC, 27290 },
+ { 0x6CC8, 27297 },
+ { 0x6C3C, 27304 },
+ { 0x6D81, 27311 },
+ { 0x6D82, 27320 },
+ { 0x6D80, 27330 },
+ { 0x6DB5, 27339 },
+ { 0x6CCA, 27348 },
+ { 0x6C40, 27355 },
+ { 0x6CCD, 27362 },
+ { 0x6C87, 27369 },
+ { 0x6C44, 27376 },
+ { 0x6EF8, 27383 },
+ { 0x6EF7, 27393 },
+ { 0x6EFA, 27403 },
+ { 0x6EF9, 27413 },
+ { 0x6EF6, 27423 },
+ { 0x6EF5, 27433 },
+ { 0x6EFC, 27443 },
+ { 0x6C86, 27450 },
+ { 0x6C43, 27458 },
+ { 0x6EFB, 27466 },
+ { 0x6DAC, 27473 },
+ { 0x6D84, 27482 },
+ { 0x6D83, 27491 },
+ { 0x6DBC, 27500 },
+ { 0x6DBA, 27509 },
+ { 0x6CC9, 27518 },
+ { 0x6C3F, 27525 },
+ { 0x6D85, 27532 },
+ { 0x6D86, 27541 },
+ { 0x6CCB, 27550 },
+ { 0x6C41, 27557 },
+ { 0x6D87, 27564 },
+ { 0x6D88, 27573 },
+ { 0x6DAD, 27582 },
+ { 0x6C85, 27591 },
+ { 0x6CED, 27598 },
+ { 0x6CCC, 27605 },
+ { 0x6C42, 27612 },
+ { 0x6CC2, 27619 },
+ { 0x6C33, 27626 },
+ { 0x6C7F, 27633 },
+ { 0x6C36, 27640 },
+ { 0x6C7E, 27647 },
+ { 0x6C35, 27655 },
+ { 0x6D7E, 27663 },
+ { 0x6DB4, 27672 },
+ { 0x6DB2, 27681 },
+ { 0x6D7F, 27690 },
+ { 0x6CC3, 27699 },
+ { 0x6C34, 27706 },
+ { 0x6C5C, 27713 },
+ { 0x6D64, 27721 },
+ { 0x6D65, 27730 },
+ { 0x6DA9, 27739 },
+ { 0x6CB1, 27748 },
+ { 0x6C20, 27755 },
+ { 0x6D2B, 27762 },
+ { 0x6D0F, 27769 },
+ { 0x6D22, 27776 },
+ { 0x6D06, 27783 },
+ { 0x6D21, 27790 },
+ { 0x6D05, 27798 },
+ { 0x6CB2, 27806 },
+ { 0x6D66, 27813 },
+ { 0x6DC5, 27822 },
+ { 0x6CB3, 27831 },
+ { 0x6C21, 27838 },
+ { 0x6CB8, 27845 },
+ { 0x6C26, 27852 },
+ { 0x6D12, 27859 },
+ { 0x6CF6, 27866 },
+ { 0x6D11, 27873 },
+ { 0x6CF5, 27881 },
+ { 0x6D71, 27889 },
+ { 0x6D72, 27898 },
+ { 0x6D74, 27907 },
+ { 0x6D73, 27916 },
+ { 0x6D3A, 27925 },
+ { 0x6D33, 27932 },
+ { 0x6C27, 27939 },
+ { 0x6D51, 27946 },
+ { 0x6D52, 27955 },
+ { 0x6D53, 27964 },
+ { 0x6CA2, 27973 },
+ { 0x6C0C, 27980 },
+ { 0x6CE4, 27987 },
+ { 0x6CA5, 27994 },
+ { 0x6C70, 28001 },
+ { 0x6C75, 28008 },
+ { 0x6C10, 28015 },
+ { 0x6C74, 28022 },
+ { 0x6C0F, 28030 },
+ { 0x6D9F, 28038 },
+ { 0x6DA0, 28047 },
+ { 0x6D50, 28057 },
+ { 0x6CA1, 28066 },
+ { 0x6C0B, 28073 },
+ { 0x6DA1, 28080 },
+ { 0x6DA2, 28089 },
+ { 0x6D54, 28099 },
+ { 0x6CA3, 28108 },
+ { 0x6C0D, 28115 },
+ { 0x6D56, 28122 },
+ { 0x6DA3, 28131 },
+ { 0x6DA4, 28140 },
+ { 0x6D55, 28150 },
+ { 0x6D57, 28159 },
+ { 0x6C72, 28168 },
+ { 0x6CE3, 28175 },
+ { 0x6CA4, 28182 },
+ { 0x6C0E, 28189 },
+ { 0x6C73, 28196 },
+ { 0x6C71, 28203 },
+ { 0x6DAE, 28210 },
+ { 0x6CDB, 28219 },
+ { 0x6C56, 28226 },
+ { 0x6CF1, 28233 },
+ { 0x6CDE, 28240 },
+ { 0x6C91, 28247 },
+ { 0x6C96, 28254 },
+ { 0x6C5A, 28261 },
+ { 0x6C95, 28268 },
+ { 0x6C59, 28276 },
+ { 0x6DAF, 28284 },
+ { 0x6CDA, 28293 },
+ { 0x6C55, 28300 },
+ { 0x6CDC, 28307 },
+ { 0x6C57, 28314 },
+ { 0x6DB0, 28321 },
+ { 0x6D9C, 28330 },
+ { 0x6D9D, 28339 },
+ { 0x6C93, 28348 },
+ { 0x6CF0, 28355 },
+ { 0x6CDD, 28362 },
+ { 0x6C58, 28369 },
+ { 0x6C94, 28376 },
+ { 0x6C92, 28383 },
+ { 0x6BF7, 28390 },
+ { 0x6BF8, 28400 },
+ { 0x6BF6, 28410 },
+ { 0x6BF1, 28420 },
+ { 0x6BF0, 28430 },
+ { 0x6BED, 28440 },
+ { 0x6BEC, 28450 },
+ { 0x6BF3, 28460 },
+ { 0x6BF2, 28470 },
+ { 0x6BF5, 28480 },
+ { 0x6BF4, 28490 },
+ { 0x6C98, 28500 },
+ { 0x6C01, 28510 },
+ { 0x6CE0, 28520 },
+ { 0x6C9B, 28530 },
+ { 0x6C64, 28540 },
+ { 0x6BEF, 28550 },
+ { 0x6BEE, 28560 },
+ { 0x6C69, 28570 },
+ { 0x6C04, 28580 },
+ { 0x6BEB, 28590 },
+ { 0x6C68, 28600 },
+ { 0x6C03, 28611 },
+ { 0x6BEA, 28622 },
+ { 0x6C97, 28632 },
+ { 0x6C00, 28642 },
+ { 0x6C99, 28652 },
+ { 0x6C66, 28662 },
+ { 0x6CDF, 28672 },
+ { 0x6C9A, 28682 },
+ { 0x6C02, 28692 },
+ { 0x6C67, 28702 },
+ { 0x6C65, 28712 },
+ { 0x6D3B, 28722 },
+ { 0x6CB9, 28729 },
+ { 0x6C28, 28736 },
+ { 0x6D3C, 28743 },
+ { 0x6D3D, 28750 },
+ { 0x6C90, 28757 },
+ { 0x6C5D, 28766 },
+ { 0x6DBE, 28775 },
+ { 0x6DA6, 28784 },
+ { 0x6CA7, 28794 },
+ { 0x6C15, 28801 },
+ { 0x6D1E, 28808 },
+ { 0x6D02, 28815 },
+ { 0x6D1D, 28822 },
+ { 0x6D01, 28830 },
+ { 0x6D58, 28838 },
+ { 0x6D59, 28847 },
+ { 0x6DA5, 28856 },
+ { 0x6DA7, 28865 },
+ { 0x6CA8, 28875 },
+ { 0x6C16, 28882 },
+ { 0x6C1A, 28889 },
+ { 0x6D20, 28896 },
+ { 0x6D04, 28903 },
+ { 0x6D1F, 28910 },
+ { 0x6D03, 28918 },
+ { 0x6CAB, 28926 },
+ { 0x6C19, 28933 },
+ { 0x6CAC, 28940 },
+ { 0x6C1B, 28947 },
+ { 0x6D8B, 28954 },
+ { 0x6D89, 28963 },
+ { 0x6D8A, 28972 },
+ { 0x6CCF, 28981 },
+ { 0x6C46, 28988 },
+ { 0x6C4A, 28995 },
+ { 0x6C88, 29002 },
+ { 0x6C49, 29009 },
+ { 0x6D8C, 29017 },
+ { 0x6DC0, 29026 },
+ { 0x6D92, 29035 },
+ { 0x6D8D, 29044 },
+ { 0x6CCE, 29053 },
+ { 0x6C45, 29060 },
+ { 0x6DB9, 29067 },
+ { 0x6D8E, 29076 },
+ { 0x6D8F, 29085 },
+ { 0x6CD0, 29094 },
+ { 0x6C47, 29101 },
+ { 0x6DB1, 29108 },
+ { 0x6C89, 29117 },
+ { 0x6CD1, 29124 },
+ { 0x6C48, 29131 },
+ { 0x6DB3, 29138 },
+ { 0x6D96, 29147 },
+ { 0x6D95, 29157 },
+ { 0x6CD3, 29166 },
+ { 0x6C4C, 29173 },
+ { 0x6CEF, 29180 },
+ { 0x6CD6, 29187 },
+ { 0x6C8A, 29194 },
+ { 0x6C8F, 29201 },
+ { 0x6C50, 29208 },
+ { 0x6C8E, 29215 },
+ { 0x6C4F, 29223 },
+ { 0x6DBD, 29231 },
+ { 0x6DB8, 29240 },
+ { 0x6DC7, 29249 },
+ { 0x6D99, 29258 },
+ { 0x6D97, 29268 },
+ { 0x6D98, 29277 },
+ { 0x6CD2, 29286 },
+ { 0x6C4B, 29293 },
+ { 0x6CD4, 29300 },
+ { 0x6C4D, 29307 },
+ { 0x6D9A, 29314 },
+ { 0x6D9B, 29323 },
+ { 0x6C8C, 29333 },
+ { 0x6CEE, 29340 },
+ { 0x6CD5, 29347 },
+ { 0x6C4E, 29354 },
+ { 0x6C8D, 29361 },
+ { 0x6C8B, 29368 },
+ { 0x6DF1, 29375 },
+ { 0x6D5C, 29385 },
+ { 0x6D35, 29394 },
+ { 0x6CAE, 29401 },
+ { 0x6C1D, 29408 },
+ { 0x6CE8, 29415 },
+ { 0x6D31, 29422 },
+ { 0x6D2A, 29429 },
+ { 0x6D0E, 29436 },
+ { 0x6D18, 29443 },
+ { 0x6CFC, 29450 },
+ { 0x6D17, 29457 },
+ { 0x6CFB, 29465 },
+ { 0x6D5D, 29473 },
+ { 0x6D5E, 29482 },
+ { 0x6D34, 29492 },
+ { 0x6CAD, 29499 },
+ { 0x6C1C, 29506 },
+ { 0x6DC6, 29513 },
+ { 0x6DA8, 29522 },
+ { 0x6D36, 29532 },
+ { 0x6CAF, 29539 },
+ { 0x6C1E, 29546 },
+ { 0x6D5F, 29553 },
+ { 0x6D60, 29562 },
+ { 0x6D61, 29571 },
+ { 0x6D62, 29580 },
+ { 0x6D63, 29589 },
+ { 0x6CE7, 29598 },
+ { 0x6CB0, 29605 },
+ { 0x6C1F, 29612 },
+ { 0x6C5B, 29619 },
+ { 0x6CE6, 29627 },
+ { 0x6C76, 29634 },
+ { 0x6C7B, 29641 },
+ { 0x6C14, 29648 },
+ { 0x6C7A, 29655 },
+ { 0x6C13, 29663 },
+ { 0x6C11, 29671 },
+ { 0x6C78, 29678 },
+ { 0x6CE5, 29685 },
+ { 0x6CA6, 29692 },
+ { 0x6C12, 29699 },
+ { 0x6C79, 29706 },
+ { 0x6C77, 29713 },
+ { 0x6DF3, 29720 },
+ { 0x6DF2, 29725 },
+ { 0x6D16, 29730 },
+ { 0x6CFA, 29737 },
+ { 0x6D15, 29744 },
+ { 0x6CF9, 29752 },
+ { 0x6CBC, 29760 },
+ { 0x6C2B, 29767 },
+ { 0x6D7A, 29774 },
+ { 0x6D7B, 29783 },
+ { 0x6D79, 29793 },
+ { 0x6CBD, 29802 },
+ { 0x6C2C, 29809 },
+ { 0x6DF5, 29816 },
+ { 0x6DF0, 29821 },
+ { 0x6DF9, 29831 },
+ { 0x6DAA, 29836 },
+ { 0x6D67, 29845 },
+ { 0x6D68, 29854 },
+ { 0x6D26, 29863 },
+ { 0x6D38, 29870 },
+ { 0x6D2E, 29877 },
+ { 0x6D0A, 29884 },
+ { 0x6CEA, 29891 },
+ { 0x6D32, 29898 },
+ { 0x6D29, 29905 },
+ { 0x6D0D, 29912 },
+ { 0x6D1A, 29919 },
+ { 0x6CFE, 29926 },
+ { 0x6D19, 29933 },
+ { 0x6CFD, 29941 },
+ { 0x6D69, 29949 },
+ { 0x6D25, 29958 },
+ { 0x6D37, 29965 },
+ { 0x6D2D, 29972 },
+ { 0x6D09, 29979 },
+ { 0x6D27, 29986 },
+ { 0x6D39, 29993 },
+ { 0x6D2F, 30000 },
+ { 0x6D0B, 30007 },
+ { 0x6D6A, 30014 },
+ { 0x6D6B, 30023 },
+ { 0x6D6C, 30032 },
+ { 0x6D6D, 30041 },
+ { 0x6D28, 30050 },
+ { 0x6CE9, 30057 },
+ { 0x6D30, 30064 },
+ { 0x6D0C, 30071 },
+ { 0x6DF7, 30078 },
+ { 0x6DF6, 30083 },
+ { 0x6CF3, 30088 },
+ { 0x6C61, 30095 },
+ { 0x6CF2, 30102 },
+ { 0x6C60, 30109 },
+ { 0x6CF4, 30116 },
+ { 0x6C62, 30123 },
+ { 0x6C5E, 30130 },
+ { 0x6C5F, 30137 },
+ { 0x6C63, 30144 },
+ { 0x6BFA, 30152 },
+ { 0x6BFB, 30165 },
+ { 0x6BF9, 30178 },
+ { 0x6DF4, 30191 },
+ { 0x6DF8, 30196 },
+ { 0x6DFD, 30201 },
+ { 0x6DFA, 30206 },
+ { 0x6DFB, 30211 },
+ { 0x061F, 30214 },
+ { 0x065D, 30217 },
+ { 0x0659, 30220 },
+ { 0x061B, 30222 },
+ { 0x0656, 30224 },
+ { 0x066C, 30227 },
+ { 0x2717, 30230 },
+ { 0x2610, 30232 },
+ { 0x2612, 30234 },
+ { 0x2611, 30238 },
+ { 0x266B, 30242 },
+ { 0x266C, 30245 },
+ { 0x293B, 30248 },
+ { 0x2321, 30252 },
+ { 0x230D, 30255 },
+ { 0x2E24, 30258 },
+ { 0x231E, 30262 },
+ { 0x23DF, 30265 },
+ { 0x230C, 30268 },
+ { 0x2E25, 30271 },
+ { 0x231F, 30275 },
+ { 0x23B5, 30278 },
+ { 0x23B6, 30281 },
+ { 0x23E1, 30288 },
+ { 0x23DD, 30292 },
+ { 0x22C8, 30294 },
+ { 0x29D1, 30295 },
+ { 0x29D2, 30300 },
+ { 0x00A6, 30305 },
+ { 0x238B, 30307 },
+ { 0x2022, 30312 },
+ { 0x2219, 30313 },
+ { 0xC07F, 30315 },
+ { 0x264B, 30317 },
+ { 0x72A0, 30318 },
+ { 0x72A9, 30321 },
+ { 0x72A2, 30324 },
+ { 0x72BA, 30327 },
+ { 0x72C0, 30330 },
+ { 0x72B9, 30333 },
+ { 0x72BC, 30336 },
+ { 0x72A3, 30339 },
+ { 0x72AA, 30342 },
+ { 0x72B5, 30345 },
+ { 0x72AB, 30348 },
+ { 0x72B7, 30351 },
+ { 0x72A8, 30354 },
+ { 0x72A5, 30357 },
+ { 0x72B0, 30360 },
+ { 0x72AD, 30363 },
+ { 0x72B2, 30366 },
+ { 0x72B4, 30369 },
+ { 0x72A7, 30372 },
+ { 0x72AC, 30375 },
+ { 0x72CF, 30378 },
+ { 0x72C1, 30381 },
+ { 0x72C5, 30384 },
+ { 0x72BD, 30387 },
+ { 0x72A6, 30390 },
+ { 0x72CA, 30393 },
+ { 0x72BE, 30396 },
+ { 0x72C4, 30399 },
+ { 0x72B3, 30402 },
+ { 0x72A1, 30405 },
+ { 0x72C9, 30408 },
+ { 0x72AE, 30411 },
+ { 0x72B8, 30414 },
+ { 0x72C2, 30417 },
+ { 0x72C7, 30420 },
+ { 0x72BF, 30423 },
+ { 0x72CE, 30426 },
+ { 0x72CB, 30429 },
+ { 0x72CC, 30432 },
+ { 0x72CD, 30435 },
+ { 0x72AF, 30438 },
+ { 0x72C3, 30441 },
+ { 0x72B6, 30444 },
+ { 0x72A4, 30447 },
+ { 0x72B1, 30450 },
+ { 0x72C6, 30453 },
+ { 0x72C8, 30456 },
+ { 0x72D0, 30459 },
+ { 0x72BB, 30462 },
+ { 0x2104, 30465 },
+ { 0x26B7, 30468 },
+ { 0x25D5, 30469 },
+ { 0x29C3, 30477 },
+ { 0x25D0, 30485 },
+ { 0x25D2, 30490 },
+ { 0x25D1, 30495 },
+ { 0x29C2, 30500 },
+ { 0x25D3, 30507 },
+ { 0x25D4, 30512 },
+ { 0x25CD, 30518 },
+ { 0x29B5, 30522 },
+ { 0x29BB, 30526 },
+ { 0x29BA, 30530 },
+ { 0x2A4C, 30542 },
+ { 0x2A50, 30546 },
+ { 0x2ACF, 30553 },
+ { 0x2AD1, 30555 },
+ { 0x2AD0, 30560 },
+ { 0x2AD2, 30562 },
+ { 0x2A4D, 30567 },
+ { 0x26B0, 30571 },
+ { 0x2CF9, 30572 },
+ { 0x2CFC, 30577 },
+ { 0x2CFA, 30582 },
+ { 0x2CFB, 30588 },
+ { 0x2CFE, 30594 },
+ { 0x2C9F, 30597 },
+ { 0x2CAB, 30601 },
+ { 0x2C99, 30605 },
+ { 0x2C9B, 30609 },
+ { 0x2CA1, 30613 },
+ { 0x2CA3, 30617 },
+ { 0x2CA9, 30621 },
+ { 0x03EF, 30625 },
+ { 0x2C89, 30629 },
+ { 0x03E5, 30633 },
+ { 0x2CAD, 30637 },
+ { 0x2C9D, 30641 },
+ { 0x2CCF, 30645 },
+ { 0x2CB5, 30651 },
+ { 0x2CD9, 30657 },
+ { 0x2CC7, 30663 },
+ { 0x2CD5, 30669 },
+ { 0x2CD3, 30675 },
+ { 0x2CBF, 30681 },
+ { 0x2CCD, 30687 },
+ { 0x2CC5, 30693 },
+ { 0x2CDB, 30699 },
+ { 0x2CD7, 30705 },
+ { 0x2CDF, 30711 },
+ { 0x2CE1, 30717 },
+ { 0x2CE3, 30723 },
+ { 0x2CDD, 30729 },
+ { 0x2CB1, 30735 },
+ { 0x2CAF, 30739 },
+ { 0x2C8B, 30743 },
+ { 0x2CA7, 30747 },
+ { 0x2C81, 30751 },
+ { 0x2C8F, 30755 },
+ { 0x03E9, 30759 },
+ { 0x2C95, 30763 },
+ { 0x03E7, 30767 },
+ { 0x03E3, 30771 },
+ { 0x2CA5, 30775 },
+ { 0x2C83, 30779 },
+ { 0x2C8D, 30783 },
+ { 0x2C87, 30787 },
+ { 0x2C85, 30791 },
+ { 0x2C93, 30795 },
+ { 0x2C97, 30799 },
+ { 0x2CC1, 30803 },
+ { 0x03ED, 30807 },
+ { 0x03EB, 30811 },
+ { 0x2C91, 30815 },
+ { 0x2CC3, 30819 },
+ { 0x2CC9, 30824 },
+ { 0x2CD1, 30829 },
+ { 0x2CBB, 30834 },
+ { 0x2CB3, 30839 },
+ { 0x2CCB, 30844 },
+ { 0x2CB9, 30849 },
+ { 0x2CBD, 30854 },
+ { 0x2CB7, 30859 },
+ { 0x2CE5, 30864 },
+ { 0x2CE6, 30868 },
+ { 0x2CE4, 30872 },
+ { 0x2CE9, 30875 },
+ { 0x2CE8, 30879 },
+ { 0x2CEA, 30883 },
+ { 0x2CE7, 30887 },
+ { 0x2C9E, 30890 },
+ { 0x2CAA, 30894 },
+ { 0x2C98, 30898 },
+ { 0x2C9A, 30902 },
+ { 0x2CA0, 30906 },
+ { 0x2CA2, 30910 },
+ { 0x2CA8, 30914 },
+ { 0x03EE, 30918 },
+ { 0x2C88, 30922 },
+ { 0x03E4, 30926 },
+ { 0x2CAC, 30930 },
+ { 0x2C9C, 30934 },
+ { 0x2CCE, 30938 },
+ { 0x2CB4, 30944 },
+ { 0x2CD8, 30950 },
+ { 0x2CC6, 30956 },
+ { 0x2CD4, 30962 },
+ { 0x2CD2, 30968 },
+ { 0x2CBE, 30974 },
+ { 0x2CCC, 30980 },
+ { 0x2CC4, 30986 },
+ { 0x2CDA, 30992 },
+ { 0x2CD6, 30998 },
+ { 0x2CDE, 31004 },
+ { 0x2CE0, 31010 },
+ { 0x2CE2, 31016 },
+ { 0x2CDC, 31022 },
+ { 0x2CB0, 31028 },
+ { 0x2CAE, 31032 },
+ { 0x2C8A, 31036 },
+ { 0x2CA6, 31040 },
+ { 0x2C80, 31044 },
+ { 0x2C8E, 31048 },
+ { 0x03E8, 31052 },
+ { 0x2C94, 31056 },
+ { 0x03E6, 31060 },
+ { 0x03E2, 31064 },
+ { 0x2CA4, 31068 },
+ { 0x2C82, 31072 },
+ { 0x2C8C, 31076 },
+ { 0x2C86, 31080 },
+ { 0x2C84, 31084 },
+ { 0x2C92, 31088 },
+ { 0x2C96, 31092 },
+ { 0x2CC0, 31096 },
+ { 0x03EC, 31100 },
+ { 0x03EA, 31104 },
+ { 0x2C90, 31108 },
+ { 0x2CC2, 31112 },
+ { 0x2CC8, 31117 },
+ { 0x2CD0, 31122 },
+ { 0x2CBA, 31127 },
+ { 0x2CB2, 31132 },
+ { 0x2CCA, 31137 },
+ { 0x2CB8, 31142 },
+ { 0x2CBC, 31147 },
+ { 0x2CB6, 31152 },
+ { 0x2CFD, 31157 },
+ { 0x2CFF, 31161 },
+ { 0x2761, 31164 },
+ { 0x2020, 31169 },
+ { 0x6E4D, 31170 },
+ { 0x6E49, 31173 },
+ { 0x279F, 31175 },
+ { 0x00B0, 31179 },
+ { 0x2103, 31181 },
+ { 0x2109, 31183 },
+ { 0x9305, 31185 },
+ { 0x9302, 31188 },
+ { 0x268D, 31192 },
+ { 0x268E, 31196 },
+ { 0x9304, 31200 },
+ { 0x9303, 31204 },
+ { 0x268F, 31208 },
+ { 0x268C, 31212 },
+ { 0x9301, 31216 },
+ { 0x2393, 31220 },
+ { 0x0024, 31225 },
+ { 0xA062, 31227 },
+ { 0xA030, 31231 },
+ { 0xA063, 31235 },
+ { 0xA064, 31238 },
+ { 0xA065, 31241 },
+ { 0xA066, 31244 },
+ { 0xA067, 31247 },
+ { 0xA068, 31250 },
+ { 0xA069, 31253 },
+ { 0xA06A, 31256 },
+ { 0xA06B, 31259 },
+ { 0xA06C, 31262 },
+ { 0xA06D, 31265 },
+ { 0xA06E, 31268 },
+ { 0xA06F, 31271 },
+ { 0xA070, 31274 },
+ { 0xA071, 31277 },
+ { 0xA072, 31280 },
+ { 0xA073, 31283 },
+ { 0xA074, 31286 },
+ { 0xA075, 31289 },
+ { 0xA076, 31292 },
+ { 0xA077, 31295 },
+ { 0xA078, 31298 },
+ { 0xA079, 31301 },
+ { 0xA07A, 31304 },
+ { 0xA07B, 31307 },
+ { 0xA07C, 31310 },
+ { 0xA07D, 31313 },
+ { 0xA07E, 31316 },
+ { 0xA07F, 31319 },
+ { 0xA080, 31322 },
+ { 0xA081, 31325 },
+ { 0xA082, 31328 },
+ { 0xA083, 31331 },
+ { 0xA084, 31334 },
+ { 0xA085, 31337 },
+ { 0xA086, 31340 },
+ { 0xA087, 31343 },
+ { 0xA088, 31346 },
+ { 0xA089, 31349 },
+ { 0xA08A, 31352 },
+ { 0xA08B, 31355 },
+ { 0xA08C, 31358 },
+ { 0xA08D, 31361 },
+ { 0xA08E, 31364 },
+ { 0xA08F, 31367 },
+ { 0xA090, 31370 },
+ { 0xA091, 31373 },
+ { 0xA092, 31376 },
+ { 0xA093, 31379 },
+ { 0xA031, 31382 },
+ { 0xA032, 31385 },
+ { 0xA033, 31388 },
+ { 0xA034, 31391 },
+ { 0xA035, 31394 },
+ { 0xA036, 31397 },
+ { 0xA037, 31400 },
+ { 0xA038, 31403 },
+ { 0xA039, 31406 },
+ { 0xA03A, 31409 },
+ { 0xA03B, 31412 },
+ { 0xA03C, 31415 },
+ { 0xA03D, 31418 },
+ { 0xA03E, 31421 },
+ { 0xA03F, 31424 },
+ { 0xA040, 31427 },
+ { 0xA041, 31430 },
+ { 0xA042, 31433 },
+ { 0xA043, 31436 },
+ { 0xA044, 31439 },
+ { 0xA045, 31442 },
+ { 0xA046, 31445 },
+ { 0xA047, 31448 },
+ { 0xA048, 31451 },
+ { 0xA049, 31454 },
+ { 0xA04A, 31457 },
+ { 0xA04B, 31460 },
+ { 0xA04C, 31463 },
+ { 0xA04D, 31466 },
+ { 0xA04E, 31469 },
+ { 0xA04F, 31472 },
+ { 0xA050, 31475 },
+ { 0xA051, 31478 },
+ { 0xA052, 31481 },
+ { 0xA053, 31484 },
+ { 0xA054, 31487 },
+ { 0xA055, 31490 },
+ { 0xA056, 31493 },
+ { 0xA057, 31496 },
+ { 0xA058, 31499 },
+ { 0xA059, 31502 },
+ { 0xA05A, 31505 },
+ { 0xA05B, 31508 },
+ { 0xA05C, 31511 },
+ { 0xA05D, 31514 },
+ { 0xA05E, 31517 },
+ { 0xA05F, 31520 },
+ { 0xA060, 31523 },
+ { 0xA061, 31526 },
+ { 0x205C, 31529 },
+ { 0x2999, 31531 },
+ { 0x25CC, 31533 },
+ { 0x2E13, 31535 },
+ { 0x2B1A, 31537 },
+ { 0x2E08, 31539 },
+ { 0x2E16, 31542 },
+ { 0x2AEB, 31545 },
+ { 0x2017, 31548 },
+ { 0x2AEA, 31551 },
+ { 0x2995, 31554 },
+ { 0x29FA, 31559 },
+ { 0x6E4C, 31561 },
+ { 0x02DD, 31564 },
+ { 0x2A74, 31567 },
+ { 0x201E, 31570 },
+ { 0x2033, 31574 },
+ { 0x301E, 31576 },
+ { 0x2996, 31580 },
+ { 0x22D3, 31585 },
+ { 0x2021, 31587 },
+ { 0x2AA1, 31589 },
+ { 0x2AA3, 31592 },
+ { 0x2AA2, 31597 },
+ { 0x2A4F, 31600 },
+ { 0x2A4E, 31603 },
+ { 0x2AEC, 31606 },
+ { 0x22D0, 31610 },
+ { 0x24F5, 31612 },
+ { 0x24FA, 31616 },
+ { 0x24F6, 31620 },
+ { 0x24F9, 31624 },
+ { 0x24F8, 31628 },
+ { 0x24FD, 31632 },
+ { 0x24FC, 31636 },
+ { 0x24FB, 31640 },
+ { 0x24F7, 31644 },
+ { 0x24FE, 31648 },
+ { 0x2A54, 31652 },
+ { 0x2A53, 31655 },
+ { 0x2E17, 31658 },
+ { 0x2AFD, 31661 },
+ { 0x222C, 31664 },
+ { 0x2ABB, 31666 },
+ { 0x2047, 31668 },
+ { 0x2ABC, 31671 },
+ { 0x22D1, 31673 },
+ { 0x2AE3, 31675 },
+ { 0x2AE5, 31680 },
+ { 0x22AB, 31686 },
+ { 0x2016, 31692 },
+ { 0x203C, 31695 },
+ { 0x22D2, 31698 },
+ { 0x201F, 31700 },
+ { 0x266A, 31704 },
+ { 0x003D, 31706 },
+ { 0x29E3, 31708 },
+ { 0x29E4, 31713 },
+ { 0x2A66, 31721 },
+ { 0x2A77, 31726 },
+ { 0x2AAE, 31736 },
+ { 0x2A71, 31741 },
+ { 0x2A73, 31746 },
+ { 0x2B40, 31751 },
+ { 0x2971, 31756 },
+ { 0x2A6E, 31761 },
+ { 0x2255, 31764 },
+ { 0x2239, 31766 },
+ { 0x2640, 31767 },
+ { 0x2012, 31769 },
+ { 0x2007, 31771 },
+ { 0x2A0D, 31773 },
+ { 0x2766, 31776 },
+ { 0x2698, 31778 },
+ { 0x2055, 31779 },
+ { 0x22A9, 31782 },
+ { 0x2E10, 31783 },
+ { 0x221C, 31785 },
+ { 0x20A3, 31787 },
+ { 0x264A, 31790 },
+ { 0x20B0, 31791 },
+ { 0x29E6, 31794 },
+ { 0x7339, 31796 },
+ { 0x733E, 31799 },
+ { 0x7330, 31802 },
+ { 0x7333, 31805 },
+ { 0x7332, 31808 },
+ { 0x7337, 31811 },
+ { 0x7336, 31814 },
+ { 0x734A, 31817 },
+ { 0x733F, 31821 },
+ { 0x7346, 31824 },
+ { 0x7348, 31827 },
+ { 0x7347, 31830 },
+ { 0x733A, 31833 },
+ { 0x733B, 31836 },
+ { 0x733C, 31839 },
+ { 0x7349, 31842 },
+ { 0x7342, 31845 },
+ { 0x7343, 31848 },
+ { 0x7344, 31851 },
+ { 0x7345, 31854 },
+ { 0x7334, 31857 },
+ { 0x733D, 31860 },
+ { 0x7341, 31863 },
+ { 0x7338, 31866 },
+ { 0x7331, 31869 },
+ { 0x7340, 31872 },
+ { 0x7335, 31875 },
+ { 0x2692, 31878 },
+ { 0x262D, 31881 },
+ { 0x302F, 31884 },
+ { 0x3164, 31889 },
+ { 0x314F, 31891 },
+ { 0x3154, 31894 },
+ { 0x3163, 31897 },
+ { 0x3157, 31900 },
+ { 0x315C, 31903 },
+ { 0x3150, 31906 },
+ { 0x3153, 31909 },
+ { 0x3161, 31912 },
+ { 0x315A, 31915 },
+ { 0x3158, 31918 },
+ { 0x315E, 31921 },
+ { 0x315F, 31924 },
+ { 0x3151, 31927 },
+ { 0x3156, 31930 },
+ { 0x3162, 31933 },
+ { 0x315B, 31936 },
+ { 0x3160, 31939 },
+ { 0x3159, 31942 },
+ { 0x315D, 31945 },
+ { 0x3152, 31948 },
+ { 0x3155, 31951 },
+ { 0x3145, 31954 },
+ { 0x3189, 31957 },
+ { 0x318C, 31960 },
+ { 0x318D, 31963 },
+ { 0x3148, 31966 },
+ { 0x314E, 31969 },
+ { 0x3147, 31972 },
+ { 0x3141, 31975 },
+ { 0x3134, 31978 },
+ { 0x3142, 31981 },
+ { 0x3139, 31984 },
+ { 0x3187, 31987 },
+ { 0x318B, 31990 },
+ { 0x318E, 31993 },
+ { 0x3131, 31996 },
+ { 0x3137, 31999 },
+ { 0x3188, 32002 },
+ { 0x318A, 32005 },
+ { 0x314A, 32008 },
+ { 0x314B, 32011 },
+ { 0x317F, 32014 },
+ { 0x314D, 32017 },
+ { 0x314C, 32020 },
+ { 0x3181, 32023 },
+ { 0x3146, 32026 },
+ { 0x316F, 32029 },
+ { 0x3167, 32032 },
+ { 0x3144, 32035 },
+ { 0x313D, 32038 },
+ { 0x317E, 32041 },
+ { 0x317B, 32044 },
+ { 0x317D, 32047 },
+ { 0x3149, 32050 },
+ { 0x3185, 32053 },
+ { 0x3180, 32056 },
+ { 0x3165, 32059 },
+ { 0x3143, 32062 },
+ { 0x3133, 32065 },
+ { 0x316E, 32068 },
+ { 0x3135, 32071 },
+ { 0x3136, 32074 },
+ { 0x3176, 32077 },
+ { 0x3140, 32080 },
+ { 0x313B, 32083 },
+ { 0x313C, 32086 },
+ { 0x317A, 32089 },
+ { 0x317C, 32092 },
+ { 0x3132, 32095 },
+ { 0x3138, 32098 },
+ { 0x3186, 32101 },
+ { 0x3166, 32104 },
+ { 0x3172, 32107 },
+ { 0x3173, 32110 },
+ { 0x313A, 32113 },
+ { 0x316A, 32116 },
+ { 0x3171, 32119 },
+ { 0x3178, 32122 },
+ { 0x3170, 32125 },
+ { 0x3168, 32128 },
+ { 0x3177, 32131 },
+ { 0x316C, 32134 },
+ { 0x313F, 32137 },
+ { 0x313E, 32140 },
+ { 0x3182, 32143 },
+ { 0x3184, 32146 },
+ { 0x316B, 32149 },
+ { 0x3183, 32152 },
+ { 0x3174, 32155 },
+ { 0x3175, 32158 },
+ { 0x3169, 32161 },
+ { 0x316D, 32164 },
+ { 0x3179, 32167 },
+ { 0x302E, 32170 },
+ { 0x1109, 32175 },
+ { 0x110C, 32178 },
+ { 0x1112, 32181 },
+ { 0x110B, 32184 },
+ { 0x1106, 32187 },
+ { 0x1102, 32190 },
+ { 0x1107, 32193 },
+ { 0x1105, 32196 },
+ { 0x115F, 32199 },
+ { 0x1100, 32202 },
+ { 0x1103, 32205 },
+ { 0x110E, 32208 },
+ { 0x110F, 32211 },
+ { 0x1140, 32214 },
+ { 0x1111, 32217 },
+ { 0x1110, 32220 },
+ { 0x114C, 32223 },
+ { 0x110A, 32226 },
+ { 0x1145, 32229 },
+ { 0x1121, 32232 },
+ { 0x1136, 32235 },
+ { 0x113B, 32238 },
+ { 0x1135, 32241 },
+ { 0x1131, 32244 },
+ { 0x112E, 32247 },
+ { 0x1132, 32250 },
+ { 0x1130, 32253 },
+ { 0x110D, 32256 },
+ { 0x1158, 32259 },
+ { 0x1147, 32262 },
+ { 0x1114, 32265 },
+ { 0x1108, 32268 },
+ { 0x1119, 32271 },
+ { 0x114D, 32274 },
+ { 0x1148, 32277 },
+ { 0x1143, 32280 },
+ { 0x1144, 32283 },
+ { 0x111C, 32286 },
+ { 0x1116, 32289 },
+ { 0x1127, 32292 },
+ { 0x111F, 32295 },
+ { 0x111A, 32298 },
+ { 0x1118, 32301 },
+ { 0x112D, 32304 },
+ { 0x112F, 32307 },
+ { 0x1101, 32310 },
+ { 0x1104, 32313 },
+ { 0x1159, 32316 },
+ { 0x113C, 32319 },
+ { 0x1141, 32322 },
+ { 0x1142, 32325 },
+ { 0x1113, 32328 },
+ { 0x1115, 32331 },
+ { 0x111E, 32334 },
+ { 0x1120, 32337 },
+ { 0x1137, 32340 },
+ { 0x1138, 32343 },
+ { 0x113A, 32346 },
+ { 0x1139, 32349 },
+ { 0x1153, 32352 },
+ { 0x114E, 32355 },
+ { 0x1149, 32358 },
+ { 0x1146, 32361 },
+ { 0x114B, 32364 },
+ { 0x114A, 32367 },
+ { 0x111D, 32370 },
+ { 0x112B, 32373 },
+ { 0x111B, 32376 },
+ { 0x1156, 32379 },
+ { 0x1128, 32382 },
+ { 0x112A, 32385 },
+ { 0x1129, 32388 },
+ { 0x1117, 32391 },
+ { 0x1134, 32394 },
+ { 0x113E, 32397 },
+ { 0x1152, 32400 },
+ { 0x1154, 32403 },
+ { 0x1157, 32406 },
+ { 0x1125, 32409 },
+ { 0x1150, 32412 },
+ { 0x1126, 32415 },
+ { 0x1124, 32418 },
+ { 0x113D, 32421 },
+ { 0x1122, 32424 },
+ { 0x1123, 32427 },
+ { 0x1133, 32430 },
+ { 0x1155, 32433 },
+ { 0x114F, 32436 },
+ { 0x112C, 32439 },
+ { 0x113F, 32442 },
+ { 0x1151, 32445 },
+ { 0x11BA, 32448 },
+ { 0x11BD, 32451 },
+ { 0x11C2, 32454 },
+ { 0x11BC, 32457 },
+ { 0x11B7, 32460 },
+ { 0x11AB, 32463 },
+ { 0x11B8, 32466 },
+ { 0x11AF, 32469 },
+ { 0x11A8, 32472 },
+ { 0x11AE, 32475 },
+ { 0x11BE, 32478 },
+ { 0x11BF, 32481 },
+ { 0x11EB, 32484 },
+ { 0x11C1, 32487 },
+ { 0x11C0, 32490 },
+ { 0x11F0, 32493 },
+ { 0x11BB, 32496 },
+ { 0x11DD, 32499 },
+ { 0x11C7, 32502 },
+ { 0x11B9, 32505 },
+ { 0x11B3, 32508 },
+ { 0x11EA, 32511 },
+ { 0x11E9, 32514 },
+ { 0x11EE, 32517 },
+ { 0x11D0, 32520 },
+ { 0x11F7, 32523 },
+ { 0x11F5, 32526 },
+ { 0x11F8, 32529 },
+ { 0x11F6, 32532 },
+ { 0x11AA, 32535 },
+ { 0x11E1, 32538 },
+ { 0x11DC, 32541 },
+ { 0x11DB, 32544 },
+ { 0x11AC, 32547 },
+ { 0x11AD, 32550 },
+ { 0x11E5, 32553 },
+ { 0x11E3, 32556 },
+ { 0x11B6, 32559 },
+ { 0x11B1, 32562 },
+ { 0x11CD, 32565 },
+ { 0x11B2, 32568 },
+ { 0x11E7, 32571 },
+ { 0x11E8, 32574 },
+ { 0x11A9, 32577 },
+ { 0x11F9, 32580 },
+ { 0x11EC, 32583 },
+ { 0x11C3, 32586 },
+ { 0x11DA, 32589 },
+ { 0x11C5, 32592 },
+ { 0x11C6, 32595 },
+ { 0x11B0, 32598 },
+ { 0x11CE, 32601 },
+ { 0x11CB, 32604 },
+ { 0x11EF, 32607 },
+ { 0x11E2, 32610 },
+ { 0x11E6, 32613 },
+ { 0x11E0, 32616 },
+ { 0x11DF, 32619 },
+ { 0x11C8, 32622 },
+ { 0x11C9, 32625 },
+ { 0x11F3, 32628 },
+ { 0x11E4, 32631 },
+ { 0x11D8, 32634 },
+ { 0x11D7, 32637 },
+ { 0x11B5, 32640 },
+ { 0x11B4, 32643 },
+ { 0x11CA, 32646 },
+ { 0x11F1, 32649 },
+ { 0x11F4, 32652 },
+ { 0x11DE, 32655 },
+ { 0x11D6, 32658 },
+ { 0x11D2, 32661 },
+ { 0x11D3, 32664 },
+ { 0x11F2, 32667 },
+ { 0x11ED, 32670 },
+ { 0x11CC, 32673 },
+ { 0x11D4, 32676 },
+ { 0x11D9, 32679 },
+ { 0x11C4, 32682 },
+ { 0x11D1, 32685 },
+ { 0x11CF, 32688 },
+ { 0x11D5, 32691 },
+ { 0x1161, 32694 },
+ { 0x1166, 32697 },
+ { 0x1175, 32700 },
+ { 0x1169, 32703 },
+ { 0x116E, 32706 },
+ { 0x1162, 32709 },
+ { 0x1165, 32712 },
+ { 0x1173, 32715 },
+ { 0x116C, 32718 },
+ { 0x116A, 32721 },
+ { 0x1170, 32724 },
+ { 0x1171, 32727 },
+ { 0x1163, 32730 },
+ { 0x1168, 32733 },
+ { 0x1174, 32736 },
+ { 0x116D, 32739 },
+ { 0x1172, 32742 },
+ { 0x1176, 32745 },
+ { 0x1177, 32748 },
+ { 0x1198, 32751 },
+ { 0x119A, 32754 },
+ { 0x119B, 32757 },
+ { 0x1180, 32760 },
+ { 0x1182, 32763 },
+ { 0x1183, 32766 },
+ { 0x1189, 32769 },
+ { 0x118D, 32772 },
+ { 0x116B, 32775 },
+ { 0x116F, 32778 },
+ { 0x1164, 32781 },
+ { 0x1167, 32784 },
+ { 0x117A, 32787 },
+ { 0x117B, 32790 },
+ { 0x1195, 32793 },
+ { 0x119C, 32796 },
+ { 0x1199, 32799 },
+ { 0x117F, 32802 },
+ { 0x1181, 32805 },
+ { 0x118A, 32808 },
+ { 0x118C, 32811 },
+ { 0x1178, 32814 },
+ { 0x1197, 32817 },
+ { 0x1188, 32820 },
+ { 0x1187, 32823 },
+ { 0x118E, 32826 },
+ { 0x1190, 32829 },
+ { 0x1194, 32832 },
+ { 0x1193, 32835 },
+ { 0x119E, 32838 },
+ { 0x117C, 32841 },
+ { 0x1196, 32844 },
+ { 0x1179, 32847 },
+ { 0x117D, 32850 },
+ { 0x117E, 32853 },
+ { 0x1184, 32856 },
+ { 0x118F, 32859 },
+ { 0x1192, 32862 },
+ { 0x1160, 32865 },
+ { 0x1185, 32868 },
+ { 0x1186, 32871 },
+ { 0x1191, 32874 },
+ { 0x11A1, 32877 },
+ { 0x11A0, 32880 },
+ { 0x119D, 32883 },
+ { 0x118B, 32886 },
+ { 0x119F, 32889 },
+ { 0x11A2, 32892 },
+ { 0x05C5, 32895 },
+ { 0x05C4, 32899 },
+ { 0x05AF, 32903 },
+ { 0x05C2, 32907 },
+ { 0x05BF, 32911 },
+ { 0x05C1, 32914 },
+ { 0x05B2, 32918 },
+ { 0x05B1, 32922 },
+ { 0x05B3, 32926 },
+ { 0x05B4, 32930 },
+ { 0x05B9, 32933 },
+ { 0x05BA, 32936 },
+ { 0x05BD, 32942 },
+ { 0x05B7, 32945 },
+ { 0x05B6, 32948 },
+ { 0x05B0, 32951 },
+ { 0x05B5, 32954 },
+ { 0x05BC, 32957 },
+ { 0x05B8, 32962 },
+ { 0x05C7, 32965 },
+ { 0x05BB, 32969 },
+ { 0x6B1E, 32972 },
+ { 0x05AB, 32976 },
+ { 0x05AD, 32979 },
+ { 0x05AC, 32982 },
+ { 0x05A2, 32985 },
+ { 0x05A7, 32989 },
+ { 0x05A3, 32992 },
+ { 0x05A1, 32995 },
+ { 0x05A8, 32998 },
+ { 0x0597, 33001 },
+ { 0x0592, 33004 },
+ { 0x059B, 33007 },
+ { 0x05AA, 33010 },
+ { 0x059A, 33015 },
+ { 0x0595, 33018 },
+ { 0x0594, 33022 },
+ { 0x0598, 33026 },
+ { 0x05AE, 33029 },
+ { 0x059C, 33032 },
+ { 0x059D, 33035 },
+ { 0x05A5, 33039 },
+ { 0x05A6, 33042 },
+ { 0x0599, 33046 },
+ { 0x059F, 33049 },
+ { 0x0596, 33053 },
+ { 0x0591, 33056 },
+ { 0x05A0, 33059 },
+ { 0x05A9, 33063 },
+ { 0x05A4, 33067 },
+ { 0x059E, 33070 },
+ { 0x0593, 33073 },
+ { 0x05D4, 33076 },
+ { 0x6B34, 33079 },
+ { 0x05E4, 33084 },
+ { 0x6B4E, 33087 },
+ { 0x6B44, 33092 },
+ { 0x05D1, 33097 },
+ { 0x6B4C, 33100 },
+ { 0x6B31, 33105 },
+ { 0x05D7, 33110 },
+ { 0x05DB, 33113 },
+ { 0x6B4D, 33116 },
+ { 0x6B3B, 33121 },
+ { 0x05DE, 33126 },
+ { 0x6B3E, 33129 },
+ { 0x05E0, 33134 },
+ { 0x6B40, 33137 },
+ { 0x05E7, 33142 },
+ { 0x6B47, 33145 },
+ { 0x05EA, 33150 },
+ { 0x6B4A, 33153 },
+ { 0x05D8, 33158 },
+ { 0x6B38, 33161 },
+ { 0x05D5, 33166 },
+ { 0x6B4B, 33169 },
+ { 0x6B35, 33174 },
+ { 0x05D9, 33179 },
+ { 0x6B1D, 33182 },
+ { 0x6B39, 33187 },
+ { 0x05D0, 33192 },
+ { 0x6B30, 33195 },
+ { 0x6B2E, 33200 },
+ { 0x6B2F, 33205 },
+ { 0x05E2, 33210 },
+ { 0x05E8, 33213 },
+ { 0x6B48, 33216 },
+ { 0x05E9, 33221 },
+ { 0x6B2B, 33224 },
+ { 0x6B2A, 33230 },
+ { 0x6B49, 33236 },
+ { 0x6B2D, 33241 },
+ { 0x6B2C, 33249 },
+ { 0x6B23, 33257 },
+ { 0x6B24, 33261 },
+ { 0x6B28, 33265 },
+ { 0x6B21, 33269 },
+ { 0x6B27, 33273 },
+ { 0x6B22, 33277 },
+ { 0x6B26, 33281 },
+ { 0x6B25, 33286 },
+ { 0x05D3, 33290 },
+ { 0x6B33, 33293 },
+ { 0x05E3, 33298 },
+ { 0x6B43, 33302 },
+ { 0x05DA, 33308 },
+ { 0x6B3A, 33312 },
+ { 0x05DD, 33318 },
+ { 0x05DF, 33322 },
+ { 0x05E5, 33326 },
+ { 0x05D2, 33330 },
+ { 0x6B32, 33333 },
+ { 0x05DC, 33338 },
+ { 0x6B3C, 33341 },
+ { 0x05E6, 33346 },
+ { 0x6B46, 33349 },
+ { 0x05D6, 33354 },
+ { 0x6B36, 33357 },
+ { 0x05E1, 33362 },
+ { 0x6B41, 33365 },
+ { 0x6B20, 33370 },
+ { 0x6B29, 33374 },
+ { 0x6B4F, 33379 },
+ { 0x05F1, 33383 },
+ { 0x6B1F, 33388 },
+ { 0x05F0, 33394 },
+ { 0x05F2, 33399 },
+ { 0x05C6, 33404 },
+ { 0x05C3, 33408 },
+ { 0x05BE, 33412 },
+ { 0x05C0, 33415 },
+ { 0x05F3, 33418 },
+ { 0x05F4, 33421 },
+ { 0x2010, 33424 },
+ { 0x2E1A, 33425 },
+ { 0x2043, 33428 },
+ { 0x2F4F, 33430 },
+ { 0x2F21, 33434 },
+ { 0x2F22, 33437 },
+ { 0x2F7D, 33441 },
+ { 0x2F44, 33444 },
+ { 0x2F24, 33447 },
+ { 0x2F38, 33450 },
+ { 0x2F5C, 33453 },
+ { 0x2F5D, 33456 },
+ { 0x2F02, 33459 },
+ { 0x2F32, 33462 },
+ { 0x2F7F, 33465 },
+ { 0x2FB7, 33468 },
+ { 0x2F6C, 33471 },
+ { 0x2FB6, 33474 },
+ { 0x2F51, 33477 },
+ { 0x2F0E, 33480 },
+ { 0x2F78, 33483 },
+ { 0x2F07, 33486 },
+ { 0x2F08, 33489 },
+ { 0x2F79, 33492 },
+ { 0x2F46, 33495 },
+ { 0x2F7C, 33498 },
+ { 0x2F00, 33501 },
+ { 0x2F97, 33504 },
+ { 0x2F41, 33507 },
+ { 0x2FCF, 33510 },
+ { 0x2F9A, 33513 },
+ { 0x2F9B, 33516 },
+ { 0x2F48, 33519 },
+ { 0x2F92, 33522 },
+ { 0x2F47, 33525 },
+ { 0x2F17, 33528 },
+ { 0x2F06, 33531 },
+ { 0x2F36, 33534 },
+ { 0x2F64, 33538 },
+ { 0x2F96, 33541 },
+ { 0x2FC3, 33544 },
+ { 0x2FAD, 33547 },
+ { 0x2F88, 33550 },
+ { 0x2F9D, 33553 },
+ { 0x2F66, 33556 },
+ { 0x2FBB, 33561 },
+ { 0x2F9E, 33564 },
+ { 0x2F73, 33567 },
+ { 0x2FA2, 33570 },
+ { 0x2F52, 33573 },
+ { 0x2F56, 33576 },
+ { 0x2FC5, 33579 },
+ { 0x2F6B, 33582 },
+ { 0x2F3E, 33585 },
+ { 0x2F0C, 33588 },
+ { 0x2FCE, 33592 },
+ { 0x2FD1, 33595 },
+ { 0x2FAF, 33598 },
+ { 0x2F5B, 33601 },
+ { 0x2F55, 33604 },
+ { 0x2FC2, 33607 },
+ { 0x2F9C, 33610 },
+ { 0x2FCC, 33613 },
+ { 0x2FA8, 33616 },
+ { 0x2FA6, 33619 },
+ { 0x2FBD, 33622 },
+ { 0x2F59, 33625 },
+ { 0x2F3F, 33630 },
+ { 0x2FB8, 33633 },
+ { 0x2FC7, 33636 },
+ { 0x2F05, 33639 },
+ { 0x2F93, 33642 },
+ { 0x2F28, 33645 },
+ { 0x2F5F, 33648 },
+ { 0x2F4B, 33651 },
+ { 0x2F2A, 33654 },
+ { 0x2FB4, 33657 },
+ { 0x2FB2, 33660 },
+ { 0x2F09, 33663 },
+ { 0x2F63, 33666 },
+ { 0x2F01, 33669 },
+ { 0x2FA7, 33672 },
+ { 0x2F35, 33675 },
+ { 0x2F81, 33679 },
+ { 0x2F49, 33682 },
+ { 0x2FD0, 33685 },
+ { 0x2F10, 33688 },
+ { 0x2F7E, 33692 },
+ { 0x2FAC, 33695 },
+ { 0x2F76, 33698 },
+ { 0x2F27, 33701 },
+ { 0x2FC4, 33704 },
+ { 0x2F19, 33707 },
+ { 0x2F83, 33710 },
+ { 0x2F77, 33713 },
+ { 0x2F6A, 33716 },
+ { 0x2F3B, 33719 },
+ { 0x2F4C, 33722 },
+ { 0x2FBC, 33725 },
+ { 0x2F61, 33728 },
+ { 0x2F4A, 33731 },
+ { 0x2FA1, 33734 },
+ { 0x2F8F, 33737 },
+ { 0x2F91, 33741 },
+ { 0x2FB5, 33744 },
+ { 0x2FA3, 33747 },
+ { 0x2F2F, 33750 },
+ { 0x2F13, 33753 },
+ { 0x2F1C, 33756 },
+ { 0x2F6E, 33759 },
+ { 0x2FCA, 33762 },
+ { 0x2F8E, 33765 },
+ { 0x2F80, 33768 },
+ { 0x2F26, 33771 },
+ { 0x2F1A, 33774 },
+ { 0x2F8A, 33777 },
+ { 0x2F0D, 33780 },
+ { 0x2F4D, 33783 },
+ { 0x2F1F, 33786 },
+ { 0x2F0B, 33789 },
+ { 0x2F0A, 33792 },
+ { 0x2F65, 33795 },
+ { 0x2FBE, 33798 },
+ { 0x2FD5, 33801 },
+ { 0x2FC1, 33804 },
+ { 0x2F72, 33807 },
+ { 0x2F8B, 33810 },
+ { 0x2F3C, 33813 },
+ { 0x2FBA, 33816 },
+ { 0x2F11, 33819 },
+ { 0x2F60, 33822 },
+ { 0x2FA9, 33825 },
+ { 0x2F1D, 33828 },
+ { 0x2F12, 33831 },
+ { 0x2F15, 33834 },
+ { 0x2F2E, 33839 },
+ { 0x2F7A, 33842 },
+ { 0x2F99, 33845 },
+ { 0x2F37, 33848 },
+ { 0x2FAB, 33851 },
+ { 0x2F33, 33856 },
+ { 0x2F03, 33860 },
+ { 0x2FAA, 33863 },
+ { 0x2F5A, 33866 },
+ { 0x2F29, 33869 },
+ { 0x2F39, 33872 },
+ { 0x2FB3, 33875 },
+ { 0x2F6D, 33878 },
+ { 0x2F14, 33881 },
+ { 0x2F74, 33884 },
+ { 0x2F53, 33887 },
+ { 0x2F6F, 33890 },
+ { 0x2F62, 33893 },
+ { 0x2F0F, 33896 },
+ { 0x2F8C, 33899 },
+ { 0x2FD2, 33902 },
+ { 0x2F71, 33905 },
+ { 0x2F54, 33908 },
+ { 0x2FC6, 33911 },
+ { 0x2F69, 33914 },
+ { 0x2F25, 33917 },
+ { 0x2FAE, 33920 },
+ { 0x2F84, 33923 },
+ { 0x2F98, 33926 },
+ { 0x2F75, 33929 },
+ { 0x2F9F, 33932 },
+ { 0x2F40, 33935 },
+ { 0x2F2B, 33938 },
+ { 0x2F43, 33941 },
+ { 0x2F68, 33944 },
+ { 0x2F34, 33948 },
+ { 0x2F58, 33952 },
+ { 0x2FD3, 33956 },
+ { 0x2F57, 33959 },
+ { 0x2F16, 33962 },
+ { 0x2F8D, 33966 },
+ { 0x2FC9, 33969 },
+ { 0x2F85, 33972 },
+ { 0x2F87, 33975 },
+ { 0x2F42, 33978 },
+ { 0x2F04, 33981 },
+ { 0x2F94, 33984 },
+ { 0x2F70, 33987 },
+ { 0x2F2C, 33990 },
+ { 0x2F45, 33993 },
+ { 0x2FB1, 33996 },
+ { 0x2F86, 34000 },
+ { 0x2FCD, 34003 },
+ { 0x2F31, 34006 },
+ { 0x2FD4, 34009 },
+ { 0x2F95, 34012 },
+ { 0x2F4E, 34015 },
+ { 0x2FC8, 34018 },
+ { 0x2F3A, 34021 },
+ { 0x2F90, 34024 },
+ { 0x2F50, 34027 },
+ { 0x2F23, 34030 },
+ { 0x2F7B, 34033 },
+ { 0x2F3D, 34036 },
+ { 0x2FB0, 34039 },
+ { 0x2FA0, 34042 },
+ { 0x2F30, 34045 },
+ { 0x2F1B, 34048 },
+ { 0x2F20, 34051 },
+ { 0x2FA5, 34054 },
+ { 0x2FC0, 34057 },
+ { 0x2FB9, 34060 },
+ { 0x2F82, 34063 },
+ { 0x2F2D, 34066 },
+ { 0x2F5E, 34069 },
+ { 0x2F67, 34072 },
+ { 0x2F89, 34075 },
+ { 0x2F1E, 34078 },
+ { 0x2F18, 34081 },
+ { 0x2FCB, 34084 },
+ { 0x2FA4, 34087 },
+ { 0x2FBF, 34090 },
+ { 0x212A, 34094 },
+ { 0x327F, 34096 },
+ { 0x2AAB, 34099 },
+ { 0x2AAD, 34101 },
+ { 0x1C36, 34106 },
+ { 0x1C37, 34109 },
+ { 0x1C41, 34112 },
+ { 0x1C46, 34115 },
+ { 0x1C42, 34118 },
+ { 0x1C45, 34121 },
+ { 0x1C44, 34124 },
+ { 0x1C49, 34127 },
+ { 0x1C40, 34130 },
+ { 0x1C48, 34133 },
+ { 0x1C47, 34136 },
+ { 0x1C43, 34139 },
+ { 0x1C2C, 34142 },
+ { 0x1C27, 34146 },
+ { 0x1C28, 34150 },
+ { 0x1C2A, 34154 },
+ { 0x1C26, 34158 },
+ { 0x1C29, 34162 },
+ { 0x1C2B, 34166 },
+ { 0x1C23, 34170 },
+ { 0x1C13, 34173 },
+ { 0x1C06, 34176 },
+ { 0x1C0C, 34179 },
+ { 0x1C11, 34182 },
+ { 0x1C03, 34185 },
+ { 0x1C1D, 34188 },
+ { 0x1C08, 34191 },
+ { 0x1C00, 34194 },
+ { 0x1C1C, 34197 },
+ { 0x1C15, 34200 },
+ { 0x1C0D, 34203 },
+ { 0x1C0E, 34206 },
+ { 0x1C1B, 34209 },
+ { 0x1C20, 34212 },
+ { 0x1C0A, 34215 },
+ { 0x1C1F, 34218 },
+ { 0x1C22, 34221 },
+ { 0x1C1A, 34224 },
+ { 0x1C14, 34227 },
+ { 0x1C07, 34230 },
+ { 0x1C4F, 34233 },
+ { 0x1C19, 34236 },
+ { 0x1C12, 34239 },
+ { 0x1C04, 34242 },
+ { 0x1C1E, 34245 },
+ { 0x1C02, 34248 },
+ { 0x1C01, 34251 },
+ { 0x1C16, 34254 },
+ { 0x1C05, 34257 },
+ { 0x1C09, 34260 },
+ { 0x1C10, 34263 },
+ { 0x1C0F, 34266 },
+ { 0x1C21, 34269 },
+ { 0x1C0B, 34272 },
+ { 0x1C17, 34275 },
+ { 0x1C4D, 34278 },
+ { 0x1C18, 34281 },
+ { 0x1C4E, 34284 },
+ { 0x1C2D, 34287 },
+ { 0x1C2F, 34291 },
+ { 0x1C2E, 34295 },
+ { 0x1C30, 34299 },
+ { 0x1C31, 34303 },
+ { 0x1C32, 34307 },
+ { 0x1C33, 34311 },
+ { 0x1C35, 34315 },
+ { 0x1C34, 34319 },
+ { 0x1C25, 34323 },
+ { 0x1C24, 34327 },
+ { 0x1C3C, 34331 },
+ { 0x1C3D, 34336 },
+ { 0x1C3B, 34339 },
+ { 0x1C3F, 34342 },
+ { 0x1C3E, 34345 },
+ { 0x7050, 34349 },
+ { 0x7051, 34353 },
+ { 0x7052, 34357 },
+ { 0x7053, 34361 },
+ { 0x7054, 34365 },
+ { 0x7055, 34369 },
+ { 0x7056, 34373 },
+ { 0x7057, 34377 },
+ { 0x7058, 34381 },
+ { 0x7059, 34385 },
+ { 0x705A, 34389 },
+ { 0x705B, 34393 },
+ { 0x705C, 34397 },
+ { 0x705D, 34401 },
+ { 0x7080, 34405 },
+ { 0x7081, 34410 },
+ { 0x7082, 34415 },
+ { 0x7083, 34420 },
+ { 0x708E, 34425 },
+ { 0x708F, 34430 },
+ { 0x7090, 34435 },
+ { 0x7091, 34440 },
+ { 0x7092, 34445 },
+ { 0x7095, 34450 },
+ { 0x7096, 34455 },
+ { 0x7097, 34460 },
+ { 0x709A, 34464 },
+ { 0x709B, 34469 },
+ { 0x709C, 34474 },
+ { 0x709D, 34478 },
+ { 0x709E, 34483 },
+ { 0x709F, 34487 },
+ { 0x70A0, 34491 },
+ { 0x70A1, 34496 },
+ { 0x70A2, 34500 },
+ { 0x70A3, 34504 },
+ { 0x70A5, 34508 },
+ { 0x70A6, 34512 },
+ { 0x70A7, 34516 },
+ { 0x70A8, 34521 },
+ { 0x70A9, 34525 },
+ { 0x70AA, 34529 },
+ { 0x70AB, 34534 },
+ { 0x70AC, 34539 },
+ { 0x70AD, 34543 },
+ { 0x70AE, 34547 },
+ { 0x70AF, 34551 },
+ { 0x70B0, 34555 },
+ { 0x70B1, 34559 },
+ { 0x70B2, 34563 },
+ { 0x70B3, 34567 },
+ { 0x70B4, 34571 },
+ { 0x70B5, 34575 },
+ { 0x70B6, 34580 },
+ { 0x70B7, 34584 },
+ { 0x70B8, 34589 },
+ { 0x70B9, 34593 },
+ { 0x70BA, 34597 },
+ { 0x70BB, 34601 },
+ { 0x70BC, 34605 },
+ { 0x70BD, 34609 },
+ { 0x70BE, 34613 },
+ { 0x70BF, 34617 },
+ { 0x70C0, 34621 },
+ { 0x70C1, 34625 },
+ { 0x70C2, 34629 },
+ { 0x70C3, 34633 },
+ { 0x70C4, 34638 },
+ { 0x70C5, 34643 },
+ { 0x70C6, 34648 },
+ { 0x70C7, 34653 },
+ { 0x70C8, 34658 },
+ { 0x70C9, 34662 },
+ { 0x70CA, 34667 },
+ { 0x70CB, 34671 },
+ { 0x70CC, 34675 },
+ { 0x70CD, 34681 },
+ { 0x70CE, 34686 },
+ { 0x70CF, 34692 },
+ { 0x70D0, 34697 },
+ { 0x70D1, 34701 },
+ { 0x70D3, 34705 },
+ { 0x70D4, 34709 },
+ { 0x70D5, 34713 },
+ { 0x70D6, 34717 },
+ { 0x70D7, 34721 },
+ { 0x70D8, 34725 },
+ { 0x70D9, 34730 },
+ { 0x70DA, 34734 },
+ { 0x70DB, 34738 },
+ { 0x70DC, 34742 },
+ { 0x70DD, 34746 },
+ { 0x7084, 34750 },
+ { 0x7085, 34755 },
+ { 0x7086, 34760 },
+ { 0x7087, 34765 },
+ { 0x7088, 34770 },
+ { 0x7089, 34775 },
+ { 0x708A, 34780 },
+ { 0x708B, 34785 },
+ { 0x708C, 34790 },
+ { 0x708D, 34795 },
+ { 0x70DE, 34800 },
+ { 0x70DF, 34805 },
+ { 0x70E0, 34810 },
+ { 0x70E1, 34815 },
+ { 0x70E2, 34820 },
+ { 0x70E3, 34825 },
+ { 0x70E4, 34830 },
+ { 0x70E5, 34835 },
+ { 0x70E6, 34840 },
+ { 0x70E7, 34845 },
+ { 0x70E8, 34850 },
+ { 0x70E9, 34855 },
+ { 0x70EA, 34860 },
+ { 0x70EB, 34865 },
+ { 0x70EC, 34870 },
+ { 0x70ED, 34875 },
+ { 0x70EE, 34880 },
+ { 0x70EF, 34885 },
+ { 0x70F0, 34890 },
+ { 0x70F1, 34895 },
+ { 0x70F2, 34900 },
+ { 0x70F3, 34905 },
+ { 0x70F4, 34910 },
+ { 0x70F5, 34915 },
+ { 0x70F6, 34920 },
+ { 0x70F7, 34925 },
+ { 0x70F8, 34930 },
+ { 0x70F9, 34935 },
+ { 0x70FA, 34940 },
+ { 0x7093, 34945 },
+ { 0x7094, 34950 },
+ { 0x7098, 34955 },
+ { 0x7099, 34960 },
+ { 0x70A4, 34965 },
+ { 0x70D2, 34970 },
+ { 0x7005, 34975 },
+ { 0x702B, 34980 },
+ { 0x701E, 34985 },
+ { 0x7033, 34990 },
+ { 0x7035, 34995 },
+ { 0x7019, 35000 },
+ { 0x7007, 35005 },
+ { 0x7000, 35010 },
+ { 0x702E, 35015 },
+ { 0x7004, 35020 },
+ { 0x7021, 35025 },
+ { 0x7030, 35030 },
+ { 0x7015, 35035 },
+ { 0x7008, 35040 },
+ { 0x7017, 35045 },
+ { 0x7023, 35050 },
+ { 0x703C, 35055 },
+ { 0x703F, 35060 },
+ { 0x7025, 35065 },
+ { 0x7018, 35070 },
+ { 0x701A, 35075 },
+ { 0x7040, 35080 },
+ { 0x702C, 35085 },
+ { 0x7029, 35090 },
+ { 0x7002, 35095 },
+ { 0x7046, 35100 },
+ { 0x701B, 35105 },
+ { 0x702D, 35110 },
+ { 0x7026, 35115 },
+ { 0x7049, 35120 },
+ { 0x700D, 35125 },
+ { 0x7034, 35130 },
+ { 0x7001, 35135 },
+ { 0x7020, 35140 },
+ { 0x7039, 35145 },
+ { 0x702F, 35150 },
+ { 0x703A, 35155 },
+ { 0x7041, 35160 },
+ { 0x7010, 35165 },
+ { 0x7006, 35170 },
+ { 0x700B, 35175 },
+ { 0x7045, 35180 },
+ { 0x7022, 35185 },
+ { 0x7009, 35190 },
+ { 0x701C, 35195 },
+ { 0x702A, 35200 },
+ { 0x7037, 35205 },
+ { 0x701D, 35210 },
+ { 0x700A, 35215 },
+ { 0x7031, 35220 },
+ { 0x7032, 35225 },
+ { 0x7028, 35230 },
+ { 0x7003, 35235 },
+ { 0x7047, 35240 },
+ { 0x700E, 35245 },
+ { 0x704B, 35250 },
+ { 0x7011, 35255 },
+ { 0x704A, 35260 },
+ { 0x7036, 35265 },
+ { 0x7012, 35270 },
+ { 0x7043, 35275 },
+ { 0x701F, 35280 },
+ { 0x7016, 35285 },
+ { 0x703D, 35290 },
+ { 0x7038, 35295 },
+ { 0x7048, 35300 },
+ { 0x700F, 35305 },
+ { 0x7024, 35310 },
+ { 0x7014, 35315 },
+ { 0x7013, 35320 },
+ { 0x7042, 35325 },
+ { 0x704C, 35330 },
+ { 0x7044, 35335 },
+ { 0x704D, 35340 },
+ { 0x7280, 35345 },
+ { 0x7282, 35348 },
+ { 0x7285, 35351 },
+ { 0x7281, 35354 },
+ { 0x7284, 35357 },
+ { 0x729B, 35360 },
+ { 0x7286, 35363 },
+ { 0x728A, 35366 },
+ { 0x728B, 35369 },
+ { 0x728D, 35372 },
+ { 0x728E, 35375 },
+ { 0x728F, 35378 },
+ { 0x7293, 35381 },
+ { 0x728C, 35384 },
+ { 0x7295, 35387 },
+ { 0x7296, 35390 },
+ { 0x7297, 35393 },
+ { 0x7292, 35396 },
+ { 0x7287, 35399 },
+ { 0x729C, 35402 },
+ { 0x7288, 35405 },
+ { 0x7299, 35408 },
+ { 0x7283, 35411 },
+ { 0x729A, 35414 },
+ { 0x7294, 35417 },
+ { 0x7290, 35420 },
+ { 0x7291, 35423 },
+ { 0x7289, 35426 },
+ { 0x7298, 35429 },
+ { 0x7920, 35432 },
+ { 0x7921, 35435 },
+ { 0x7939, 35438 },
+ { 0x7923, 35441 },
+ { 0x7924, 35444 },
+ { 0x7931, 35447 },
+ { 0x7922, 35450 },
+ { 0x7926, 35453 },
+ { 0x7928, 35456 },
+ { 0x7929, 35459 },
+ { 0x792A, 35462 },
+ { 0x792B, 35465 },
+ { 0x792C, 35468 },
+ { 0x7932, 35471 },
+ { 0x792D, 35474 },
+ { 0x7933, 35477 },
+ { 0x792F, 35480 },
+ { 0x7930, 35483 },
+ { 0x7925, 35486 },
+ { 0x7927, 35489 },
+ { 0x7935, 35492 },
+ { 0x7936, 35495 },
+ { 0x7937, 35498 },
+ { 0x7938, 35501 },
+ { 0x792E, 35504 },
+ { 0x7934, 35507 },
+ { 0x793F, 35510 },
+ { 0x00AF, 35513 },
+ { 0x2774, 35514 },
+ { 0x2768, 35519 },
+ { 0x26AB, 35523 },
+ { 0x2775, 35526 },
+ { 0x2769, 35531 },
+ { 0x2592, 35535 },
+ { 0x26AC, 35537 },
+ { 0x26AA, 35541 },
+ { 0x2759, 35544 },
+ { 0x276A, 35547 },
+ { 0x276B, 35552 },
+ { 0x205F, 35557 },
+ { 0x276C, 35560 },
+ { 0x276D, 35565 },
+ { 0x00B7, 35570 },
+ { 0x22A7, 35572 },
+ { 0x2A0A, 35573 },
+ { 0x202F, 35576 },
+ { 0x26B2, 35579 },
+ { 0x22B2, 35580 },
+ { 0x22B4, 35583 },
+ { 0x2491, 35589 },
+ { 0x0023, 35593 },
+ { 0x2492, 35595 },
+ { 0x2493, 35599 },
+ { 0x249B, 35603 },
+ { 0x2496, 35607 },
+ { 0x2497, 35611 },
+ { 0x2499, 35615 },
+ { 0x2495, 35619 },
+ { 0x249A, 35623 },
+ { 0x2494, 35627 },
+ { 0x2498, 35631 },
+ { 0x2116, 35635 },
+ { 0x6FFC, 35637 },
+ { 0x02DB, 35640 },
+ { 0x2325, 35641 },
+ { 0x6D3E, 35643 },
+ { 0x6D3F, 35646 },
+ { 0x26B4, 35649 },
+ { 0x270F, 35650 },
+ { 0x20A7, 35651 },
+ { 0x2653, 35653 },
+ { 0x210E, 35654 },
+ { 0x210F, 35656 },
+ { 0x3012, 35661 },
+ { 0x3020, 35663 },
+ { 0x2E07, 35666 },
+ { 0x2E0B, 35670 },
+ { 0x2E06, 35672 },
+ { 0x5949, 35675 },
+ { 0x5947, 35679 },
+ { 0x594B, 35683 },
+ { 0x5948, 35687 },
+ { 0x594A, 35691 },
+ { 0x594C, 35695 },
+ { 0x594E, 35699 },
+ { 0x594D, 35703 },
+ { 0x5946, 35707 },
+ { 0x5937, 35710 },
+ { 0x5939, 35713 },
+ { 0x5934, 35716 },
+ { 0x5931, 35719 },
+ { 0x5941, 35722 },
+ { 0x593A, 35725 },
+ { 0x5930, 35728 },
+ { 0x593E, 35731 },
+ { 0x5938, 35734 },
+ { 0x5935, 35737 },
+ { 0x5936, 35740 },
+ { 0x593D, 35743 },
+ { 0x593C, 35746 },
+ { 0x5933, 35749 },
+ { 0x5940, 35752 },
+ { 0x593F, 35755 },
+ { 0x5942, 35758 },
+ { 0x5944, 35761 },
+ { 0x5932, 35764 },
+ { 0x593B, 35767 },
+ { 0x5943, 35770 },
+ { 0x5945, 35773 },
+ { 0x5953, 35776 },
+ { 0x595F, 35778 },
+ { 0x5952, 35781 },
+ { 0x5950, 35785 },
+ { 0x5951, 35789 },
+ { 0x594F, 35793 },
+ { 0x23CE, 35797 },
+ { 0x2930, 35799 },
+ { 0x292B, 35805 },
+ { 0x2644, 35810 },
+ { 0x2696, 35811 },
+ { 0x212F, 35812 },
+ { 0x210A, 35815 },
+ { 0x2113, 35818 },
+ { 0x2134, 35821 },
+ { 0x212C, 35824 },
+ { 0x2130, 35827 },
+ { 0x2131, 35830 },
+ { 0x210B, 35833 },
+ { 0x2110, 35836 },
+ { 0x2112, 35839 },
+ { 0x2133, 35842 },
+ { 0x2118, 35845 },
+ { 0x211B, 35848 },
+ { 0x2314, 35851 },
+ { 0x6E45, 35852 },
+ { 0x201A, 35854 },
+ { 0x2039, 35858 },
+ { 0x203A, 35863 },
+ { 0x201B, 35868 },
+ { 0x33DF, 35872 },
+ { 0x33C6, 35876 },
+ { 0x33C0, 35880 },
+ { 0x33C1, 35883 },
+ { 0x33A7, 35886 },
+ { 0x33A8, 35890 },
+ { 0x33A5, 35895 },
+ { 0x33A1, 35898 },
+ { 0x33DE, 35901 },
+ { 0x33C2, 35905 },
+ { 0x3373, 35907 },
+ { 0x33C3, 35909 },
+ { 0x33C4, 35911 },
+ { 0x33C5, 35913 },
+ { 0x339D, 35915 },
+ { 0x33A4, 35917 },
+ { 0x33A0, 35920 },
+ { 0x33C7, 35923 },
+ { 0x3372, 35925 },
+ { 0x33C8, 35927 },
+ { 0x3397, 35929 },
+ { 0x3377, 35931 },
+ { 0x3379, 35933 },
+ { 0x3378, 35936 },
+ { 0x32CE, 35939 },
+ { 0x3399, 35941 },
+ { 0x3387, 35943 },
+ { 0x33C9, 35945 },
+ { 0x33CA, 35947 },
+ { 0x32CC, 35949 },
+ { 0x33CB, 35951 },
+ { 0x3390, 35953 },
+ { 0x33CC, 35955 },
+ { 0x337A, 35957 },
+ { 0x3384, 35959 },
+ { 0x3385, 35961 },
+ { 0x338F, 35963 },
+ { 0x33CD, 35965 },
+ { 0x3398, 35967 },
+ { 0x339E, 35969 },
+ { 0x33A6, 35971 },
+ { 0x33CE, 35974 },
+ { 0x33A2, 35977 },
+ { 0x33CF, 35980 },
+ { 0x33B8, 35982 },
+ { 0x33BE, 35984 },
+ { 0x33D0, 35986 },
+ { 0x33D1, 35988 },
+ { 0x33D3, 35990 },
+ { 0x3383, 35992 },
+ { 0x3386, 35994 },
+ { 0x33D4, 35996 },
+ { 0x338E, 35999 },
+ { 0x3396, 36001 },
+ { 0x339C, 36003 },
+ { 0x33A3, 36005 },
+ { 0x339F, 36008 },
+ { 0x33B3, 36011 },
+ { 0x3382, 36013 },
+ { 0x338C, 36016 },
+ { 0x338D, 36019 },
+ { 0x3395, 36022 },
+ { 0x339B, 36025 },
+ { 0x33B2, 36028 },
+ { 0x33B6, 36031 },
+ { 0x33BC, 36034 },
+ { 0x33B7, 36037 },
+ { 0x33B9, 36039 },
+ { 0x33BD, 36042 },
+ { 0x33BF, 36044 },
+ { 0x3381, 36047 },
+ { 0x338B, 36049 },
+ { 0x339A, 36051 },
+ { 0x33B1, 36053 },
+ { 0x33B5, 36055 },
+ { 0x33BB, 36057 },
+ { 0x3375, 36059 },
+ { 0x33A9, 36061 },
+ { 0x3380, 36063 },
+ { 0x3376, 36066 },
+ { 0x338A, 36068 },
+ { 0x33D7, 36070 },
+ { 0x33D8, 36072 },
+ { 0x33DA, 36074 },
+ { 0x33B0, 36076 },
+ { 0x33B4, 36078 },
+ { 0x33BA, 36080 },
+ { 0x33DB, 36082 },
+ { 0x33DC, 36084 },
+ { 0x33DD, 36086 },
+ { 0x3374, 36088 },
+ { 0x3388, 36090 },
+ { 0x2293, 36092 },
+ { 0x2294, 36094 },
+ { 0x337E, 36096 },
+ { 0x337B, 36100 },
+ { 0x337C, 36104 },
+ { 0x337D, 36108 },
+ { 0x32CD, 36112 },
+ { 0x33FF, 36114 },
+ { 0x3393, 36116 },
+ { 0x33AC, 36118 },
+ { 0x333F, 36120 },
+ { 0x3371, 36122 },
+ { 0x3391, 36124 },
+ { 0x33AA, 36126 },
+ { 0x33D2, 36128 },
+ { 0x3392, 36130 },
+ { 0x33D5, 36132 },
+ { 0x33D6, 36134 },
+ { 0x33AB, 36136 },
+ { 0x33D9, 36138 },
+ { 0x33AD, 36140 },
+ { 0x33AE, 36142 },
+ { 0x33AF, 36146 },
+ { 0x3394, 36151 },
+ { 0x3327, 36153 },
+ { 0x3306, 36155 },
+ { 0x3303, 36157 },
+ { 0x3331, 36159 },
+ { 0x3325, 36161 },
+ { 0x3326, 36163 },
+ { 0x23CD, 36165 },
+ { 0x3310, 36167 },
+ { 0x3342, 36169 },
+ { 0x3305, 36171 },
+ { 0x3389, 36173 },
+ { 0x3314, 36175 },
+ { 0x2ACD, 36177 },
+ { 0x334B, 36182 },
+ { 0x3349, 36184 },
+ { 0x3328, 36186 },
+ { 0x3309, 36188 },
+ { 0x330A, 36190 },
+ { 0x3337, 36192 },
+ { 0x3330, 36194 },
+ { 0x3355, 36196 },
+ { 0x3352, 36198 },
+ { 0x221A, 36200 },
+ { 0x2B12, 36202 },
+ { 0x25E7, 36207 },
+ { 0x2B15, 36212 },
+ { 0x25EA, 36219 },
+ { 0x25E8, 36226 },
+ { 0x25A7, 36231 },
+ { 0x25E9, 36239 },
+ { 0x25A8, 36246 },
+ { 0x2B14, 36254 },
+ { 0x2B13, 36261 },
+ { 0x25A9, 36266 },
+ { 0x25A5, 36271 },
+ { 0x29E0, 36275 },
+ { 0x25A4, 36279 },
+ { 0x25A6, 36283 },
+ { 0x3350, 36288 },
+ { 0x3302, 36290 },
+ { 0x333C, 36292 },
+ { 0x3324, 36294 },
+ { 0x3308, 36296 },
+ { 0x330F, 36298 },
+ { 0x330E, 36300 },
+ { 0x3311, 36302 },
+ { 0x332A, 36304 },
+ { 0x3341, 36306 },
+ { 0x3335, 36308 },
+ { 0x228F, 36310 },
+ { 0x22E4, 36313 },
+ { 0x2291, 36320 },
+ { 0x330B, 36326 },
+ { 0x331C, 36328 },
+ { 0x331E, 36330 },
+ { 0x3345, 36332 },
+ { 0x3344, 36334 },
+ { 0x3329, 36336 },
+ { 0x332C, 36338 },
+ { 0x333B, 36340 },
+ { 0x333A, 36342 },
+ { 0x3340, 36344 },
+ { 0x2ACE, 36346 },
+ { 0x3353, 36351 },
+ { 0x3322, 36353 },
+ { 0x3323, 36355 },
+ { 0x3357, 36357 },
+ { 0x334E, 36359 },
+ { 0x334F, 36361 },
+ { 0x3300, 36363 },
+ { 0x3301, 36365 },
+ { 0x333E, 36367 },
+ { 0x3318, 36369 },
+ { 0x3339, 36371 },
+ { 0x3333, 36373 },
+ { 0x3304, 36375 },
+ { 0x331D, 36377 },
+ { 0x3312, 36379 },
+ { 0x3346, 36381 },
+ { 0x3338, 36383 },
+ { 0x332F, 36385 },
+ { 0x333D, 36387 },
+ { 0x332D, 36389 },
+ { 0x3313, 36391 },
+ { 0x330C, 36393 },
+ { 0x330D, 36395 },
+ { 0x331B, 36397 },
+ { 0x2311, 36399 },
+ { 0x3343, 36401 },
+ { 0x3347, 36403 },
+ { 0x334D, 36405 },
+ { 0x334C, 36407 },
+ { 0x3348, 36409 },
+ { 0x3351, 36411 },
+ { 0x3354, 36413 },
+ { 0x331F, 36415 },
+ { 0x3321, 36417 },
+ { 0x3334, 36419 },
+ { 0x3307, 36421 },
+ { 0x3332, 36423 },
+ { 0x2290, 36425 },
+ { 0x22E5, 36428 },
+ { 0x2292, 36435 },
+ { 0x332B, 36441 },
+ { 0x3356, 36443 },
+ { 0x3320, 36445 },
+ { 0x3319, 36447 },
+ { 0x3336, 36449 },
+ { 0x3317, 36451 },
+ { 0x331A, 36453 },
+ { 0x334A, 36455 },
+ { 0x332E, 36457 },
+ { 0x3315, 36459 },
+ { 0x337F, 36461 },
+ { 0x3316, 36463 },
+ { 0x2729, 36465 },
+ { 0x2282, 36469 },
+ { 0x2286, 36471 },
+ { 0x2AC3, 36476 },
+ { 0x228A, 36484 },
+ { 0x2ACB, 36490 },
+ { 0x2AC7, 36496 },
+ { 0x2AC9, 36501 },
+ { 0x2AC5, 36507 },
+ { 0x2ABD, 36512 },
+ { 0x2ABF, 36515 },
+ { 0x2AC1, 36520 },
+ { 0x2AD5, 36525 },
+ { 0x2AD3, 36528 },
+ { 0x2979, 36531 },
+ { 0x5806, 36535 },
+ { 0x580B, 36539 },
+ { 0x5802, 36543 },
+ { 0x5823, 36547 },
+ { 0x5826, 36552 },
+ { 0x5824, 36557 },
+ { 0x5825, 36562 },
+ { 0x5827, 36567 },
+ { 0x5800, 36572 },
+ { 0x5804, 36576 },
+ { 0x5801, 36580 },
+ { 0x5805, 36584 },
+ { 0x5803, 36588 },
+ { 0x581B, 36592 },
+ { 0x580C, 36596 },
+ { 0x5816, 36600 },
+ { 0x5809, 36604 },
+ { 0x5822, 36608 },
+ { 0x580E, 36612 },
+ { 0x5807, 36616 },
+ { 0x581F, 36620 },
+ { 0x581D, 36624 },
+ { 0x5818, 36628 },
+ { 0x5819, 36632 },
+ { 0x581E, 36636 },
+ { 0x5821, 36640 },
+ { 0x5814, 36644 },
+ { 0x581C, 36648 },
+ { 0x580D, 36652 },
+ { 0x5812, 36656 },
+ { 0x5817, 36660 },
+ { 0x580A, 36664 },
+ { 0x580F, 36668 },
+ { 0x5808, 36672 },
+ { 0x581A, 36676 },
+ { 0x5820, 36680 },
+ { 0x5815, 36684 },
+ { 0x5810, 36688 },
+ { 0x5813, 36692 },
+ { 0x5811, 36696 },
+ { 0x5828, 36700 },
+ { 0x5829, 36704 },
+ { 0x582A, 36708 },
+ { 0x582B, 36712 },
+ { 0x2403, 36716 },
+ { 0x2419, 36721 },
+ { 0x2404, 36726 },
+ { 0x2417, 36731 },
+ { 0x2407, 36737 },
+ { 0x2410, 36740 },
+ { 0x241C, 36745 },
+ { 0x240C, 36749 },
+ { 0x240A, 36753 },
+ { 0x2400, 36757 },
+ { 0x241F, 36760 },
+ { 0x241D, 36764 },
+ { 0x240F, 36768 },
+ { 0x240E, 36772 },
+ { 0x2420, 36776 },
+ { 0x2402, 36779 },
+ { 0x2401, 36784 },
+ { 0x2418, 36789 },
+ { 0x2421, 36792 },
+ { 0x2425, 36795 },
+ { 0x2411, 36800 },
+ { 0x2412, 36805 },
+ { 0x2414, 36810 },
+ { 0x2413, 36815 },
+ { 0x241B, 36820 },
+ { 0x241E, 36823 },
+ { 0x2405, 36827 },
+ { 0x2424, 36830 },
+ { 0x240D, 36833 },
+ { 0x2415, 36837 },
+ { 0x240B, 36841 },
+ { 0x2408, 36845 },
+ { 0x214F, 36848 },
+ { 0x2409, 36852 },
+ { 0x241A, 36856 },
+ { 0x2426, 36859 },
+ { 0x2406, 36864 },
+ { 0x2416, 36867 },
+ { 0x0700, 36871 },
+ { 0x0743, 36875 },
+ { 0x0744, 36880 },
+ { 0x0706, 36885 },
+ { 0x0707, 36889 },
+ { 0x073D, 36893 },
+ { 0x073E, 36896 },
+ { 0x073A, 36899 },
+ { 0x073B, 36902 },
+ { 0x0749, 36905 },
+ { 0x0736, 36907 },
+ { 0x0737, 36910 },
+ { 0x073F, 36913 },
+ { 0x0745, 36915 },
+ { 0x0746, 36919 },
+ { 0x0739, 36923 },
+ { 0x0738, 36927 },
+ { 0x0725, 36931 },
+ { 0x0717, 36934 },
+ { 0x0726, 36937 },
+ { 0x0721, 36940 },
+ { 0x0722, 36943 },
+ { 0x072C, 36946 },
+ { 0x0718, 36949 },
+ { 0x0712, 36952 },
+ { 0x071A, 36955 },
+ { 0x071F, 36958 },
+ { 0x0729, 36961 },
+ { 0x072A, 36964 },
+ { 0x072B, 36967 },
+ { 0x071B, 36970 },
+ { 0x071C, 36973 },
+ { 0x071D, 36977 },
+ { 0x071E, 36980 },
+ { 0x0719, 36984 },
+ { 0x0710, 36987 },
+ { 0x0724, 36990 },
+ { 0x0713, 36994 },
+ { 0x0714, 36997 },
+ { 0x0728, 37001 },
+ { 0x0715, 37004 },
+ { 0x0720, 37007 },
+ { 0x0716, 37010 },
+ { 0x072D, 37015 },
+ { 0x072E, 37019 },
+ { 0x072F, 37023 },
+ { 0x0723, 37027 },
+ { 0x074F, 37030 },
+ { 0x074E, 37034 },
+ { 0x074D, 37038 },
+ { 0x0727, 37042 },
+ { 0x0711, 37046 },
+ { 0x0730, 37050 },
+ { 0x0731, 37053 },
+ { 0x0732, 37056 },
+ { 0x0733, 37059 },
+ { 0x0734, 37062 },
+ { 0x0735, 37065 },
+ { 0x074A, 37068 },
+ { 0x0747, 37070 },
+ { 0x0748, 37074 },
+ { 0x0740, 37078 },
+ { 0x070B, 37081 },
+ { 0x070C, 37084 },
+ { 0x070D, 37087 },
+ { 0x0742, 37090 },
+ { 0x0741, 37092 },
+ { 0x0702, 37094 },
+ { 0x0704, 37098 },
+ { 0x0709, 37101 },
+ { 0x0705, 37106 },
+ { 0x070A, 37109 },
+ { 0x073C, 37111 },
+ { 0x0701, 37114 },
+ { 0x0703, 37118 },
+ { 0x0708, 37121 },
+ { 0x070F, 37126 },
+ { 0x2649, 37129 },
+ { 0x0C56, 37130 },
+ { 0x0C7F, 37134 },
+ { 0x0C4D, 37137 },
+ { 0x0C03, 37140 },
+ { 0x0C02, 37143 },
+ { 0x0C3D, 37146 },
+ { 0x0C01, 37149 },
+ { 0x0C67, 37152 },
+ { 0x0C6C, 37155 },
+ { 0x0C68, 37158 },
+ { 0x0C6B, 37161 },
+ { 0x0C6A, 37164 },
+ { 0x0C6F, 37167 },
+ { 0x0C66, 37170 },
+ { 0x0C6E, 37173 },
+ { 0x0C6D, 37176 },
+ { 0x0C69, 37179 },
+ { 0x0C46, 37182 },
+ { 0x0C3F, 37186 },
+ { 0x0C4A, 37190 },
+ { 0x0C41, 37194 },
+ { 0x0C3E, 37198 },
+ { 0x0C48, 37202 },
+ { 0x0C4C, 37206 },
+ { 0x0C47, 37210 },
+ { 0x0C40, 37214 },
+ { 0x0C4B, 37218 },
+ { 0x0C42, 37222 },
+ { 0x0C62, 37226 },
+ { 0x0C43, 37231 },
+ { 0x0C63, 37236 },
+ { 0x0C44, 37241 },
+ { 0x0C55, 37246 },
+ { 0x0C05, 37249 },
+ { 0x0C0E, 37252 },
+ { 0x0C07, 37255 },
+ { 0x0C12, 37258 },
+ { 0x0C09, 37261 },
+ { 0x0C06, 37264 },
+ { 0x0C10, 37267 },
+ { 0x0C14, 37270 },
+ { 0x0C2C, 37273 },
+ { 0x0C1A, 37276 },
+ { 0x0C26, 37279 },
+ { 0x0C0F, 37282 },
+ { 0x0C17, 37285 },
+ { 0x0C39, 37288 },
+ { 0x0C08, 37291 },
+ { 0x0C1C, 37294 },
+ { 0x0C15, 37297 },
+ { 0x0C32, 37300 },
+ { 0x0C2E, 37303 },
+ { 0x0C28, 37306 },
+ { 0x0C13, 37309 },
+ { 0x0C2A, 37312 },
+ { 0x0C30, 37315 },
+ { 0x0C38, 37318 },
+ { 0x0C24, 37321 },
+ { 0x0C0A, 37324 },
+ { 0x0C35, 37327 },
+ { 0x0C2F, 37330 },
+ { 0x0C2D, 37333 },
+ { 0x0C1B, 37336 },
+ { 0x0C21, 37339 },
+ { 0x0C27, 37342 },
+ { 0x0C59, 37345 },
+ { 0x0C18, 37348 },
+ { 0x0C1D, 37351 },
+ { 0x0C16, 37354 },
+ { 0x0C33, 37357 },
+ { 0x0C19, 37360 },
+ { 0x0C23, 37363 },
+ { 0x0C1E, 37366 },
+ { 0x0C2B, 37369 },
+ { 0x0C31, 37372 },
+ { 0x0C36, 37375 },
+ { 0x0C37, 37378 },
+ { 0x0C25, 37381 },
+ { 0x0C58, 37384 },
+ { 0x0C1F, 37387 },
+ { 0x0C22, 37390 },
+ { 0x0C20, 37393 },
+ { 0x0C0C, 37396 },
+ { 0x0C0B, 37400 },
+ { 0x0C61, 37404 },
+ { 0x0C60, 37408 },
+ { 0x0C79, 37412 },
+ { 0x0C7C, 37421 },
+ { 0x0C7A, 37430 },
+ { 0x0C7D, 37439 },
+ { 0x0C78, 37448 },
+ { 0x0C7B, 37457 },
+ { 0x0C7E, 37466 },
+ { 0x07B0, 37475 },
+ { 0x07A0, 37477 },
+ { 0x07A1, 37480 },
+ { 0x0784, 37483 },
+ { 0x0780, 37486 },
+ { 0x07B1, 37489 },
+ { 0x0783, 37492 },
+ { 0x0794, 37495 },
+ { 0x079C, 37498 },
+ { 0x07A2, 37501 },
+ { 0x0799, 37504 },
+ { 0x079A, 37507 },
+ { 0x078C, 37510 },
+ { 0x0798, 37513 },
+ { 0x0787, 37516 },
+ { 0x078A, 37519 },
+ { 0x078E, 37522 },
+ { 0x0786, 37525 },
+ { 0x078D, 37528 },
+ { 0x0789, 37531 },
+ { 0x0782, 37534 },
+ { 0x07A4, 37537 },
+ { 0x0790, 37540 },
+ { 0x0788, 37543 },
+ { 0x07A5, 37546 },
+ { 0x079F, 37549 },
+ { 0x078B, 37552 },
+ { 0x07A3, 37555 },
+ { 0x079E, 37558 },
+ { 0x079D, 37561 },
+ { 0x079B, 37564 },
+ { 0x0791, 37567 },
+ { 0x0796, 37570 },
+ { 0x0795, 37573 },
+ { 0x0793, 37576 },
+ { 0x0792, 37579 },
+ { 0x0797, 37582 },
+ { 0x078F, 37585 },
+ { 0x0785, 37588 },
+ { 0x0781, 37591 },
+ { 0x07A6, 37594 },
+ { 0x07AC, 37596 },
+ { 0x07A8, 37598 },
+ { 0x07AE, 37600 },
+ { 0x07AA, 37602 },
+ { 0x07A7, 37604 },
+ { 0x07A9, 37606 },
+ { 0x07AD, 37608 },
+ { 0x07AF, 37610 },
+ { 0x07AB, 37612 },
+ { 0x29FB, 37614 },
+ { 0x2AF6, 37616 },
+ { 0x2034, 37619 },
+ { 0x224B, 37621 },
+ { 0x2AF7, 37623 },
+ { 0x2AF8, 37626 },
+ { 0x2AFB, 37629 },
+ { 0x222D, 37633 },
+ { 0x2AF5, 37635 },
+ { 0x22AA, 37641 },
+ { 0x2AF4, 37646 },
+ { 0x2980, 37651 },
+ { 0x2A68, 37655 },
+ { 0x2A69, 37662 },
+ { 0x20AE, 37669 },
+ { 0x2319, 37671 },
+ { 0x29A2, 37674 },
+ { 0x2129, 37676 },
+ { 0x214E, 37681 },
+ { 0x2132, 37684 },
+ { 0x214B, 37687 },
+ { 0x2141, 37689 },
+ { 0x2142, 37693 },
+ { 0x2144, 37697 },
+ { 0x2739, 37701 },
+ { 0x2645, 37705 },
+ { 0x2A2F, 37706 },
+ { 0x2230, 37710 },
+ { 0x00BD, 37712 },
+ { 0x2155, 37716 },
+ { 0x2159, 37720 },
+ { 0x2153, 37724 },
+ { 0x215B, 37728 },
+ { 0x00BC, 37732 },
+ { 0x2156, 37736 },
+ { 0x2154, 37740 },
+ { 0x215A, 37744 },
+ { 0x215D, 37748 },
+ { 0x2158, 37752 },
+ { 0x215E, 37756 },
+ { 0x2157, 37760 },
+ { 0x215C, 37764 },
+ { 0x00BE, 37768 },
+ { 0x2240, 37772 },
+ { 0x2100, 37774 },
+ { 0x060B, 37776 },
+ { 0x2697, 37778 },
+ { 0x20B3, 37779 },
+ { 0x2235, 37781 },
+ { 0x09D7, 37782 },
+ { 0x09BC, 37786 },
+ { 0x09CD, 37789 },
+ { 0x0983, 37792 },
+ { 0x0982, 37795 },
+ { 0x09BD, 37798 },
+ { 0x0981, 37801 },
+ { 0x09E7, 37804 },
+ { 0x09EC, 37807 },
+ { 0x09E8, 37810 },
+ { 0x09EB, 37813 },
+ { 0x09EA, 37816 },
+ { 0x09EF, 37819 },
+ { 0x09E6, 37822 },
+ { 0x09EE, 37825 },
+ { 0x09ED, 37828 },
+ { 0x09E9, 37831 },
+ { 0x09F2, 37834 },
+ { 0x09F3, 37837 },
+ { 0x09C7, 37840 },
+ { 0x09BF, 37844 },
+ { 0x09CB, 37848 },
+ { 0x09C1, 37852 },
+ { 0x09BE, 37856 },
+ { 0x09C8, 37860 },
+ { 0x09CC, 37864 },
+ { 0x09C0, 37868 },
+ { 0x09C2, 37872 },
+ { 0x09E2, 37876 },
+ { 0x09C3, 37881 },
+ { 0x09E3, 37886 },
+ { 0x09C4, 37891 },
+ { 0x09FA, 37896 },
+ { 0x0985, 37898 },
+ { 0x098F, 37901 },
+ { 0x0987, 37904 },
+ { 0x0993, 37907 },
+ { 0x0989, 37910 },
+ { 0x0986, 37913 },
+ { 0x0990, 37916 },
+ { 0x0994, 37919 },
+ { 0x09AC, 37922 },
+ { 0x099A, 37925 },
+ { 0x09A6, 37928 },
+ { 0x0997, 37931 },
+ { 0x09B9, 37934 },
+ { 0x0988, 37937 },
+ { 0x099C, 37940 },
+ { 0x0995, 37943 },
+ { 0x09B2, 37946 },
+ { 0x09AE, 37949 },
+ { 0x09A8, 37952 },
+ { 0x09AA, 37955 },
+ { 0x09B0, 37958 },
+ { 0x09F1, 37961 },
+ { 0x09F0, 37967 },
+ { 0x09B8, 37973 },
+ { 0x09A4, 37976 },
+ { 0x098A, 37979 },
+ { 0x09AF, 37982 },
+ { 0x09AD, 37985 },
+ { 0x099B, 37988 },
+ { 0x09A1, 37991 },
+ { 0x09A7, 37994 },
+ { 0x0998, 37997 },
+ { 0x099D, 38000 },
+ { 0x0996, 38003 },
+ { 0x0999, 38006 },
+ { 0x09A3, 38009 },
+ { 0x099E, 38012 },
+ { 0x09AB, 38015 },
+ { 0x09DD, 38018 },
+ { 0x09DC, 38021 },
+ { 0x09B6, 38024 },
+ { 0x09B7, 38027 },
+ { 0x09A5, 38030 },
+ { 0x099F, 38033 },
+ { 0x09DF, 38036 },
+ { 0x09A2, 38039 },
+ { 0x09A0, 38042 },
+ { 0x09CE, 38045 },
+ { 0x098C, 38049 },
+ { 0x098B, 38053 },
+ { 0x09E1, 38057 },
+ { 0x09E0, 38061 },
+ { 0x09F4, 38065 },
+ { 0x09F8, 38069 },
+ { 0x09F5, 38077 },
+ { 0x09F7, 38081 },
+ { 0x09F6, 38085 },
+ { 0x09F9, 38089 },
+ { 0x232C, 38093 },
+ { 0x23E3, 38095 },
+ { 0x226C, 38099 },
+ { 0x2800, 38100 },
+ { 0x2801, 38103 },
+ { 0x2802, 38106 },
+ { 0x2804, 38109 },
+ { 0x2808, 38112 },
+ { 0x2810, 38115 },
+ { 0x2820, 38118 },
+ { 0x2840, 38121 },
+ { 0x2880, 38124 },
+ { 0x2803, 38127 },
+ { 0x2805, 38130 },
+ { 0x2809, 38133 },
+ { 0x2811, 38136 },
+ { 0x2821, 38139 },
+ { 0x2841, 38142 },
+ { 0x2881, 38145 },
+ { 0x2806, 38148 },
+ { 0x280A, 38151 },
+ { 0x2812, 38154 },
+ { 0x2822, 38157 },
+ { 0x2842, 38160 },
+ { 0x2882, 38163 },
+ { 0x280C, 38166 },
+ { 0x2814, 38169 },
+ { 0x2824, 38172 },
+ { 0x2844, 38175 },
+ { 0x2884, 38178 },
+ { 0x2818, 38181 },
+ { 0x2828, 38184 },
+ { 0x2848, 38187 },
+ { 0x2888, 38190 },
+ { 0x2830, 38193 },
+ { 0x2850, 38196 },
+ { 0x2890, 38199 },
+ { 0x2860, 38202 },
+ { 0x28A0, 38205 },
+ { 0x28C0, 38208 },
+ { 0x2807, 38211 },
+ { 0x280B, 38214 },
+ { 0x2813, 38217 },
+ { 0x2823, 38220 },
+ { 0x2843, 38223 },
+ { 0x2883, 38226 },
+ { 0x280D, 38229 },
+ { 0x2815, 38232 },
+ { 0x2825, 38235 },
+ { 0x2845, 38238 },
+ { 0x2885, 38241 },
+ { 0x2819, 38244 },
+ { 0x2829, 38247 },
+ { 0x2849, 38250 },
+ { 0x2889, 38253 },
+ { 0x2831, 38256 },
+ { 0x2851, 38259 },
+ { 0x2891, 38262 },
+ { 0x2861, 38265 },
+ { 0x28A1, 38268 },
+ { 0x28C1, 38271 },
+ { 0x280E, 38274 },
+ { 0x2816, 38277 },
+ { 0x2826, 38280 },
+ { 0x2846, 38283 },
+ { 0x2886, 38286 },
+ { 0x281A, 38289 },
+ { 0x282A, 38292 },
+ { 0x284A, 38295 },
+ { 0x288A, 38298 },
+ { 0x2832, 38301 },
+ { 0x2852, 38304 },
+ { 0x2892, 38307 },
+ { 0x2862, 38310 },
+ { 0x28A2, 38313 },
+ { 0x28C2, 38316 },
+ { 0x281C, 38319 },
+ { 0x282C, 38322 },
+ { 0x284C, 38325 },
+ { 0x288C, 38328 },
+ { 0x2834, 38331 },
+ { 0x2854, 38334 },
+ { 0x2894, 38337 },
+ { 0x2864, 38340 },
+ { 0x28A4, 38343 },
+ { 0x28C4, 38346 },
+ { 0x2838, 38349 },
+ { 0x2858, 38352 },
+ { 0x2898, 38355 },
+ { 0x2868, 38358 },
+ { 0x28A8, 38361 },
+ { 0x28C8, 38364 },
+ { 0x2870, 38367 },
+ { 0x28B0, 38370 },
+ { 0x28D0, 38373 },
+ { 0x28E0, 38376 },
+ { 0x280F, 38379 },
+ { 0x2817, 38382 },
+ { 0x2827, 38385 },
+ { 0x2847, 38388 },
+ { 0x2887, 38391 },
+ { 0x281B, 38394 },
+ { 0x282B, 38397 },
+ { 0x284B, 38400 },
+ { 0x288B, 38403 },
+ { 0x2833, 38406 },
+ { 0x2853, 38409 },
+ { 0x2893, 38412 },
+ { 0x2863, 38415 },
+ { 0x28A3, 38418 },
+ { 0x28C3, 38421 },
+ { 0x281D, 38424 },
+ { 0x282D, 38427 },
+ { 0x284D, 38430 },
+ { 0x288D, 38433 },
+ { 0x2835, 38436 },
+ { 0x2855, 38439 },
+ { 0x2895, 38442 },
+ { 0x2865, 38445 },
+ { 0x28A5, 38448 },
+ { 0x28C5, 38451 },
+ { 0x2839, 38454 },
+ { 0x2859, 38457 },
+ { 0x2899, 38460 },
+ { 0x2869, 38463 },
+ { 0x28A9, 38466 },
+ { 0x28C9, 38469 },
+ { 0x2871, 38472 },
+ { 0x28B1, 38475 },
+ { 0x28D1, 38478 },
+ { 0x28E1, 38481 },
+ { 0x281E, 38484 },
+ { 0x282E, 38487 },
+ { 0x284E, 38490 },
+ { 0x288E, 38493 },
+ { 0x2836, 38496 },
+ { 0x2856, 38499 },
+ { 0x2896, 38502 },
+ { 0x2866, 38505 },
+ { 0x28A6, 38508 },
+ { 0x28C6, 38511 },
+ { 0x283A, 38514 },
+ { 0x285A, 38517 },
+ { 0x289A, 38520 },
+ { 0x286A, 38523 },
+ { 0x28AA, 38526 },
+ { 0x28CA, 38529 },
+ { 0x2872, 38532 },
+ { 0x28B2, 38535 },
+ { 0x28D2, 38538 },
+ { 0x28E2, 38541 },
+ { 0x283C, 38544 },
+ { 0x285C, 38547 },
+ { 0x289C, 38550 },
+ { 0x286C, 38553 },
+ { 0x28AC, 38556 },
+ { 0x28CC, 38559 },
+ { 0x2874, 38562 },
+ { 0x28B4, 38565 },
+ { 0x28D4, 38568 },
+ { 0x28E4, 38571 },
+ { 0x2878, 38574 },
+ { 0x28B8, 38577 },
+ { 0x28D8, 38580 },
+ { 0x28E8, 38583 },
+ { 0x28F0, 38586 },
+ { 0x281F, 38589 },
+ { 0x282F, 38592 },
+ { 0x284F, 38595 },
+ { 0x288F, 38598 },
+ { 0x2837, 38601 },
+ { 0x2857, 38604 },
+ { 0x2897, 38607 },
+ { 0x2867, 38610 },
+ { 0x28A7, 38613 },
+ { 0x28C7, 38616 },
+ { 0x283B, 38619 },
+ { 0x285B, 38622 },
+ { 0x289B, 38625 },
+ { 0x286B, 38628 },
+ { 0x28AB, 38631 },
+ { 0x28CB, 38634 },
+ { 0x2873, 38637 },
+ { 0x28B3, 38640 },
+ { 0x28D3, 38643 },
+ { 0x28E3, 38646 },
+ { 0x283D, 38649 },
+ { 0x285D, 38652 },
+ { 0x289D, 38655 },
+ { 0x286D, 38658 },
+ { 0x28AD, 38661 },
+ { 0x28CD, 38664 },
+ { 0x2875, 38667 },
+ { 0x28B5, 38670 },
+ { 0x28D5, 38673 },
+ { 0x28E5, 38676 },
+ { 0x2879, 38679 },
+ { 0x28B9, 38682 },
+ { 0x28D9, 38685 },
+ { 0x28E9, 38688 },
+ { 0x28F1, 38691 },
+ { 0x283E, 38694 },
+ { 0x285E, 38697 },
+ { 0x289E, 38700 },
+ { 0x286E, 38703 },
+ { 0x28AE, 38706 },
+ { 0x28CE, 38709 },
+ { 0x2876, 38712 },
+ { 0x28B6, 38715 },
+ { 0x28D6, 38718 },
+ { 0x28E6, 38721 },
+ { 0x287A, 38724 },
+ { 0x28BA, 38727 },
+ { 0x28DA, 38730 },
+ { 0x28EA, 38733 },
+ { 0x28F2, 38736 },
+ { 0x287C, 38739 },
+ { 0x28BC, 38742 },
+ { 0x28DC, 38745 },
+ { 0x28EC, 38748 },
+ { 0x28F4, 38751 },
+ { 0x28F8, 38754 },
+ { 0x283F, 38757 },
+ { 0x285F, 38760 },
+ { 0x289F, 38763 },
+ { 0x286F, 38766 },
+ { 0x28AF, 38769 },
+ { 0x28CF, 38772 },
+ { 0x2877, 38775 },
+ { 0x28B7, 38778 },
+ { 0x28D7, 38781 },
+ { 0x28E7, 38784 },
+ { 0x287B, 38787 },
+ { 0x28BB, 38790 },
+ { 0x28DB, 38793 },
+ { 0x28EB, 38796 },
+ { 0x28F3, 38799 },
+ { 0x287D, 38802 },
+ { 0x28BD, 38805 },
+ { 0x28DD, 38808 },
+ { 0x28ED, 38811 },
+ { 0x28F5, 38814 },
+ { 0x28F9, 38817 },
+ { 0x287E, 38820 },
+ { 0x28BE, 38823 },
+ { 0x28DE, 38826 },
+ { 0x28EE, 38829 },
+ { 0x28F6, 38832 },
+ { 0x28FA, 38835 },
+ { 0x28FC, 38838 },
+ { 0x287F, 38841 },
+ { 0x28BF, 38844 },
+ { 0x28DF, 38847 },
+ { 0x28EF, 38850 },
+ { 0x28F7, 38853 },
+ { 0x28FB, 38856 },
+ { 0x28FD, 38859 },
+ { 0x28FE, 38862 },
+ { 0x28FF, 38865 },
+ { 0x2621, 38868 },
+ { 0x00B8, 38870 },
+ { 0x2299, 38871 },
+ { 0x229D, 38874 },
+ { 0x2742, 38876 },
+ { 0x2295, 38882 },
+ { 0x229A, 38884 },
+ { 0x2460, 38887 },
+ { 0x2465, 38890 },
+ { 0x2461, 38893 },
+ { 0x2464, 38896 },
+ { 0x2463, 38899 },
+ { 0x2468, 38902 },
+ { 0x24EA, 38905 },
+ { 0x2467, 38908 },
+ { 0x2466, 38911 },
+ { 0x2462, 38914 },
+ { 0x27B2, 38917 },
+ { 0x24D0, 38922 },
+ { 0x24D1, 38927 },
+ { 0x24D2, 38932 },
+ { 0x24D3, 38937 },
+ { 0x24D4, 38942 },
+ { 0x24D5, 38947 },
+ { 0x24D6, 38952 },
+ { 0x24D7, 38957 },
+ { 0x24D8, 38962 },
+ { 0x24D9, 38967 },
+ { 0x24DA, 38972 },
+ { 0x24DB, 38977 },
+ { 0x24DC, 38982 },
+ { 0x24DD, 38987 },
+ { 0x24DE, 38992 },
+ { 0x24DF, 38997 },
+ { 0x24E0, 39002 },
+ { 0x24E1, 39007 },
+ { 0x24E2, 39012 },
+ { 0x24E3, 39017 },
+ { 0x24E4, 39022 },
+ { 0x24E5, 39027 },
+ { 0x24E6, 39032 },
+ { 0x24E7, 39037 },
+ { 0x24E8, 39042 },
+ { 0x24E9, 39047 },
+ { 0x24B6, 39052 },
+ { 0x24B7, 39057 },
+ { 0x24B8, 39062 },
+ { 0x24B9, 39067 },
+ { 0x24BA, 39072 },
+ { 0x24BB, 39077 },
+ { 0x24BC, 39082 },
+ { 0x24BD, 39087 },
+ { 0x24BE, 39092 },
+ { 0x24BF, 39097 },
+ { 0x24C0, 39102 },
+ { 0x24C1, 39107 },
+ { 0x24C2, 39112 },
+ { 0x24C3, 39117 },
+ { 0x24C4, 39122 },
+ { 0x24C5, 39127 },
+ { 0x24C6, 39132 },
+ { 0x24C7, 39137 },
+ { 0x24C8, 39142 },
+ { 0x24C9, 39147 },
+ { 0x24CA, 39152 },
+ { 0x24CB, 39157 },
+ { 0x24CC, 39162 },
+ { 0x24CD, 39167 },
+ { 0x24CE, 39172 },
+ { 0x24CF, 39177 },
+ { 0x2296, 39182 },
+ { 0x2297, 39184 },
+ { 0x272A, 39186 },
+ { 0x29BE, 39189 },
+ { 0x29BF, 39192 },
+ { 0x229C, 39194 },
+ { 0x3266, 39196 },
+ { 0x3274, 39199 },
+ { 0x3268, 39203 },
+ { 0x3276, 39206 },
+ { 0x326D, 39210 },
+ { 0x327B, 39213 },
+ { 0x3267, 39217 },
+ { 0x3275, 39220 },
+ { 0x327E, 39224 },
+ { 0x3264, 39228 },
+ { 0x3272, 39231 },
+ { 0x3261, 39235 },
+ { 0x326F, 39238 },
+ { 0x3265, 39242 },
+ { 0x3273, 39245 },
+ { 0x3263, 39249 },
+ { 0x3271, 39252 },
+ { 0x3260, 39256 },
+ { 0x326E, 39259 },
+ { 0x3262, 39263 },
+ { 0x3270, 39266 },
+ { 0x3269, 39270 },
+ { 0x3277, 39273 },
+ { 0x326A, 39277 },
+ { 0x3278, 39280 },
+ { 0x326C, 39284 },
+ { 0x327A, 39287 },
+ { 0x326B, 39291 },
+ { 0x3279, 39294 },
+ { 0x327D, 39298 },
+ { 0x327C, 39302 },
+ { 0x2469, 39306 },
+ { 0x32BF, 39309 },
+ { 0x32B5, 39312 },
+ { 0x32B6, 39315 },
+ { 0x32BB, 39319 },
+ { 0x32B7, 39323 },
+ { 0x32BA, 39327 },
+ { 0x32B9, 39331 },
+ { 0x32BE, 39335 },
+ { 0x32BD, 39339 },
+ { 0x32BC, 39343 },
+ { 0x32B8, 39347 },
+ { 0x246A, 39351 },
+ { 0x325A, 39354 },
+ { 0x325B, 39357 },
+ { 0x32B1, 39361 },
+ { 0x325C, 39365 },
+ { 0x325F, 39369 },
+ { 0x325E, 39373 },
+ { 0x32B4, 39377 },
+ { 0x32B3, 39381 },
+ { 0x32B2, 39385 },
+ { 0x325D, 39389 },
+ { 0x246B, 39393 },
+ { 0x2473, 39396 },
+ { 0x3251, 39399 },
+ { 0x3256, 39403 },
+ { 0x3252, 39407 },
+ { 0x3255, 39411 },
+ { 0x3254, 39415 },
+ { 0x3259, 39419 },
+ { 0x3258, 39423 },
+ { 0x3257, 39427 },
+ { 0x3253, 39431 },
+ { 0x246E, 39435 },
+ { 0x246F, 39438 },
+ { 0x2471, 39441 },
+ { 0x246D, 39444 },
+ { 0x2472, 39447 },
+ { 0x246C, 39450 },
+ { 0x2470, 39453 },
+ { 0x3036, 39456 },
+ { 0x29B8, 39459 },
+ { 0x229B, 39462 },
+ { 0x2A38, 39465 },
+ { 0x2298, 39468 },
+ { 0x32D0, 39471 },
+ { 0x32D3, 39474 },
+ { 0x32D1, 39477 },
+ { 0x32D4, 39480 },
+ { 0x32D2, 39483 },
+ { 0x32E9, 39486 },
+ { 0x32EC, 39489 },
+ { 0x32EA, 39492 },
+ { 0x32ED, 39495 },
+ { 0x32EB, 39498 },
+ { 0x32D5, 39501 },
+ { 0x32D8, 39504 },
+ { 0x32D6, 39507 },
+ { 0x32D9, 39510 },
+ { 0x32D7, 39513 },
+ { 0x32EE, 39516 },
+ { 0x32F1, 39519 },
+ { 0x32EF, 39522 },
+ { 0x32F2, 39525 },
+ { 0x32F0, 39528 },
+ { 0x32E4, 39531 },
+ { 0x32E7, 39534 },
+ { 0x32E5, 39537 },
+ { 0x32E8, 39540 },
+ { 0x32E6, 39543 },
+ { 0x32F6, 39546 },
+ { 0x32F9, 39549 },
+ { 0x32F7, 39552 },
+ { 0x32FA, 39555 },
+ { 0x32F8, 39558 },
+ { 0x32DA, 39561 },
+ { 0x32DD, 39564 },
+ { 0x32DB, 39567 },
+ { 0x32DE, 39570 },
+ { 0x32DC, 39573 },
+ { 0x32DF, 39576 },
+ { 0x32E2, 39579 },
+ { 0x32E0, 39582 },
+ { 0x32E3, 39585 },
+ { 0x32E1, 39588 },
+ { 0x32FB, 39591 },
+ { 0x32FD, 39594 },
+ { 0x32FC, 39597 },
+ { 0x32FE, 39600 },
+ { 0x32F3, 39603 },
+ { 0x32F5, 39606 },
+ { 0x32F4, 39609 },
+ { 0x29B7, 39612 },
+ { 0x238A, 39614 },
+ { 0x29B6, 39617 },
+ { 0x32A6, 39620 },
+ { 0x3280, 39623 },
+ { 0x3285, 39626 },
+ { 0x3290, 39629 },
+ { 0x3289, 39632 },
+ { 0x3281, 39635 },
+ { 0x32A2, 39638 },
+ { 0x328B, 39641 },
+ { 0x3284, 39644 },
+ { 0x3283, 39647 },
+ { 0x3292, 39650 },
+ { 0x32A4, 39653 },
+ { 0x32A0, 39656 },
+ { 0x32A7, 39659 },
+ { 0x329A, 39662 },
+ { 0x328A, 39665 },
+ { 0x3294, 39668 },
+ { 0x3288, 39671 },
+ { 0x32A1, 39674 },
+ { 0x328D, 39677 },
+ { 0x328F, 39680 },
+ { 0x3287, 39683 },
+ { 0x3298, 39686 },
+ { 0x328E, 39689 },
+ { 0x32B0, 39692 },
+ { 0x329E, 39695 },
+ { 0x32A8, 39698 },
+ { 0x3286, 39701 },
+ { 0x3291, 39704 },
+ { 0x32AB, 39707 },
+ { 0x3282, 39710 },
+ { 0x328C, 39713 },
+ { 0x32A5, 39716 },
+ { 0x329B, 39719 },
+ { 0x3299, 39722 },
+ { 0x32A3, 39725 },
+ { 0x3293, 39728 },
+ { 0x3295, 39731 },
+ { 0x32AF, 39734 },
+ { 0x32A9, 39737 },
+ { 0x32AA, 39740 },
+ { 0x32AE, 39743 },
+ { 0x329C, 39746 },
+ { 0x329F, 39749 },
+ { 0x329D, 39752 },
+ { 0x3296, 39755 },
+ { 0x32AC, 39758 },
+ { 0x32AD, 39761 },
+ { 0x3297, 39764 },
+ { 0x29C0, 39767 },
+ { 0x2389, 39769 },
+ { 0x29C1, 39774 },
+ { 0x29B9, 39776 },
+ { 0x2A36, 39778 },
+ { 0x29BC, 39784 },
+ { 0x2332, 39788 },
+ { 0x222E, 39790 },
+ { 0x2694, 39792 },
+ { 0x7800, 39794 },
+ { 0x7801, 39797 },
+ { 0x7802, 39800 },
+ { 0x7803, 39803 },
+ { 0x7804, 39806 },
+ { 0x7805, 39809 },
+ { 0x7808, 39812 },
+ { 0x780A, 39815 },
+ { 0x780B, 39818 },
+ { 0x780C, 39821 },
+ { 0x780D, 39824 },
+ { 0x780E, 39827 },
+ { 0x780F, 39830 },
+ { 0x7810, 39833 },
+ { 0x7811, 39836 },
+ { 0x7812, 39839 },
+ { 0x7813, 39842 },
+ { 0x7814, 39845 },
+ { 0x7815, 39848 },
+ { 0x7816, 39851 },
+ { 0x7817, 39854 },
+ { 0x7818, 39857 },
+ { 0x7819, 39860 },
+ { 0x781A, 39863 },
+ { 0x781B, 39866 },
+ { 0x781C, 39869 },
+ { 0x781D, 39872 },
+ { 0x781E, 39875 },
+ { 0x781F, 39878 },
+ { 0x7820, 39881 },
+ { 0x7821, 39884 },
+ { 0x7822, 39887 },
+ { 0x7823, 39890 },
+ { 0x7824, 39893 },
+ { 0x7825, 39896 },
+ { 0x7826, 39899 },
+ { 0x7827, 39902 },
+ { 0x7828, 39905 },
+ { 0x7829, 39908 },
+ { 0x782A, 39911 },
+ { 0x782B, 39914 },
+ { 0x782C, 39917 },
+ { 0x782D, 39920 },
+ { 0x782E, 39923 },
+ { 0x782F, 39926 },
+ { 0x7830, 39929 },
+ { 0x7831, 39932 },
+ { 0x7832, 39935 },
+ { 0x7833, 39938 },
+ { 0x7834, 39941 },
+ { 0x7835, 39944 },
+ { 0x7837, 39947 },
+ { 0x7838, 39950 },
+ { 0x783C, 39953 },
+ { 0x783F, 39956 },
+ { 0x2396, 39959 },
+ { 0x7438, 39963 },
+ { 0x7434, 39967 },
+ { 0x7441, 39971 },
+ { 0x744A, 39975 },
+ { 0x744B, 39979 },
+ { 0x744C, 39983 },
+ { 0x7449, 39987 },
+ { 0x7445, 39991 },
+ { 0x744F, 39995 },
+ { 0x744E, 39999 },
+ { 0x7435, 40003 },
+ { 0x7436, 40007 },
+ { 0x743A, 40011 },
+ { 0x743C, 40015 },
+ { 0x744D, 40019 },
+ { 0x7447, 40023 },
+ { 0x7443, 40027 },
+ { 0x7440, 40031 },
+ { 0x743E, 40035 },
+ { 0x743F, 40039 },
+ { 0x7439, 40043 },
+ { 0x743B, 40047 },
+ { 0x7442, 40051 },
+ { 0x7437, 40055 },
+ { 0x7446, 40059 },
+ { 0x743D, 40063 },
+ { 0x742A, 40067 },
+ { 0x7429, 40072 },
+ { 0x7428, 40077 },
+ { 0x742C, 40082 },
+ { 0x742B, 40087 },
+ { 0x742D, 40092 },
+ { 0x7444, 40097 },
+ { 0x7448, 40101 },
+ { 0x7430, 40105 },
+ { 0x742F, 40110 },
+ { 0x742E, 40115 },
+ { 0x7432, 40120 },
+ { 0x7431, 40125 },
+ { 0x7433, 40130 },
+ { 0x7410, 40135 },
+ { 0x740C, 40139 },
+ { 0x7419, 40143 },
+ { 0x7422, 40147 },
+ { 0x7423, 40151 },
+ { 0x7424, 40155 },
+ { 0x7421, 40159 },
+ { 0x741D, 40163 },
+ { 0x7427, 40167 },
+ { 0x7426, 40171 },
+ { 0x740D, 40175 },
+ { 0x740E, 40179 },
+ { 0x7412, 40183 },
+ { 0x7414, 40187 },
+ { 0x7425, 40191 },
+ { 0x741F, 40195 },
+ { 0x741B, 40199 },
+ { 0x7418, 40203 },
+ { 0x7416, 40207 },
+ { 0x7417, 40211 },
+ { 0x7411, 40215 },
+ { 0x7413, 40219 },
+ { 0x741A, 40223 },
+ { 0x740F, 40227 },
+ { 0x741E, 40231 },
+ { 0x7415, 40235 },
+ { 0x7402, 40239 },
+ { 0x7401, 40244 },
+ { 0x7400, 40249 },
+ { 0x7404, 40254 },
+ { 0x7403, 40259 },
+ { 0x7405, 40264 },
+ { 0x741C, 40269 },
+ { 0x7420, 40273 },
+ { 0x7408, 40277 },
+ { 0x7407, 40282 },
+ { 0x7406, 40287 },
+ { 0x740A, 40292 },
+ { 0x7409, 40297 },
+ { 0x740B, 40302 },
+ { 0x2B18, 40307 },
+ { 0x2B16, 40312 },
+ { 0x2B17, 40317 },
+ { 0x2B19, 40322 },
+ { 0x22C4, 40327 },
+ { 0x2780, 40329 },
+ { 0x2785, 40334 },
+ { 0x2781, 40339 },
+ { 0x2784, 40344 },
+ { 0x2783, 40349 },
+ { 0x2788, 40354 },
+ { 0x2787, 40359 },
+ { 0x2786, 40364 },
+ { 0x2782, 40369 },
+ { 0x2789, 40374 },
+ { 0x2776, 40379 },
+ { 0x277B, 40384 },
+ { 0x2777, 40389 },
+ { 0x277A, 40394 },
+ { 0x2779, 40399 },
+ { 0x277E, 40404 },
+ { 0x277D, 40409 },
+ { 0x277C, 40414 },
+ { 0x2778, 40419 },
+ { 0x277F, 40424 },
+ { 0x278A, 40429 },
+ { 0x278F, 40435 },
+ { 0x278B, 40441 },
+ { 0x278E, 40447 },
+ { 0x278D, 40453 },
+ { 0x2792, 40459 },
+ { 0x2791, 40465 },
+ { 0x2790, 40471 },
+ { 0x278C, 40477 },
+ { 0x2793, 40483 },
+ { 0x2223, 40489 },
+ { 0x26AE, 40490 },
+ { 0x26A3, 40492 },
+ { 0x26A2, 40495 },
+ { 0x20AF, 40498 },
+ { 0x2208, 40500 },
+ { 0x22F5, 40502 },
+ { 0x22F9, 40507 },
+ { 0x22F2, 40513 },
+ { 0x22F6, 40519 },
+ { 0x22F8, 40523 },
+ { 0x22F3, 40527 },
+ { 0x27D2, 40537 },
+ { 0x2AD9, 40541 },
+ { 0x292F, 40545 },
+ { 0x292C, 40551 },
+ { 0x25C9, 40556 },
+ { 0x2ADC, 40557 },
+ { 0x26B1, 40558 },
+ { 0x20B2, 40560 },
+ { 0x1734, 40562 },
+ { 0x1732, 40565 },
+ { 0x1733, 40569 },
+ { 0x1720, 40573 },
+ { 0x1721, 40576 },
+ { 0x1722, 40579 },
+ { 0x172A, 40582 },
+ { 0x1727, 40585 },
+ { 0x1724, 40588 },
+ { 0x1731, 40591 },
+ { 0x1723, 40594 },
+ { 0x172E, 40597 },
+ { 0x172B, 40600 },
+ { 0x1728, 40603 },
+ { 0x1729, 40606 },
+ { 0x172D, 40609 },
+ { 0x1730, 40612 },
+ { 0x1726, 40615 },
+ { 0x172F, 40618 },
+ { 0x172C, 40621 },
+ { 0x1725, 40624 },
+ { 0x20B4, 40627 },
+ { 0x206C, 40629 },
+ { 0x206A, 40633 },
+ { 0x25D9, 40636 },
+ { 0x25D8, 40639 },
+ { 0x2643, 40641 },
+ { 0x0CD6, 40642 },
+ { 0x0CBC, 40646 },
+ { 0x0CCD, 40649 },
+ { 0x0C83, 40652 },
+ { 0x0C82, 40655 },
+ { 0x0CBD, 40658 },
+ { 0x0CF1, 40661 },
+ { 0x0CF2, 40664 },
+ { 0x0CE7, 40667 },
+ { 0x0CEC, 40670 },
+ { 0x0CE8, 40673 },
+ { 0x0CEB, 40676 },
+ { 0x0CEA, 40679 },
+ { 0x0CEF, 40682 },
+ { 0x0CE6, 40685 },
+ { 0x0CEE, 40688 },
+ { 0x0CED, 40691 },
+ { 0x0CE9, 40694 },
+ { 0x0CC6, 40697 },
+ { 0x0CBF, 40701 },
+ { 0x0CCA, 40705 },
+ { 0x0CC1, 40709 },
+ { 0x0CBE, 40713 },
+ { 0x0CC8, 40717 },
+ { 0x0CCC, 40721 },
+ { 0x0CC7, 40725 },
+ { 0x0CC0, 40729 },
+ { 0x0CCB, 40733 },
+ { 0x0CC2, 40737 },
+ { 0x0CE2, 40741 },
+ { 0x0CC3, 40746 },
+ { 0x0CE3, 40751 },
+ { 0x0CC4, 40756 },
+ { 0x0CD5, 40761 },
+ { 0x0C85, 40764 },
+ { 0x0C8E, 40767 },
+ { 0x0C87, 40770 },
+ { 0x0C92, 40773 },
+ { 0x0C89, 40776 },
+ { 0x0C86, 40779 },
+ { 0x0C90, 40782 },
+ { 0x0C94, 40785 },
+ { 0x0CAC, 40788 },
+ { 0x0C9A, 40791 },
+ { 0x0CA6, 40794 },
+ { 0x0C8F, 40797 },
+ { 0x0CDE, 40800 },
+ { 0x0C97, 40803 },
+ { 0x0CB9, 40806 },
+ { 0x0C88, 40809 },
+ { 0x0C9C, 40812 },
+ { 0x0C95, 40815 },
+ { 0x0CB2, 40818 },
+ { 0x0CAE, 40821 },
+ { 0x0CA8, 40824 },
+ { 0x0C93, 40827 },
+ { 0x0CAA, 40830 },
+ { 0x0CB0, 40833 },
+ { 0x0CB8, 40836 },
+ { 0x0CA4, 40839 },
+ { 0x0C8A, 40842 },
+ { 0x0CB5, 40845 },
+ { 0x0CAF, 40848 },
+ { 0x0CAD, 40851 },
+ { 0x0C9B, 40854 },
+ { 0x0CA1, 40857 },
+ { 0x0CA7, 40860 },
+ { 0x0C98, 40863 },
+ { 0x0C9D, 40866 },
+ { 0x0C96, 40869 },
+ { 0x0CB3, 40872 },
+ { 0x0C99, 40875 },
+ { 0x0CA3, 40878 },
+ { 0x0C9E, 40881 },
+ { 0x0CAB, 40884 },
+ { 0x0CB1, 40887 },
+ { 0x0CB6, 40890 },
+ { 0x0CB7, 40893 },
+ { 0x0CA5, 40896 },
+ { 0x0C9F, 40899 },
+ { 0x0CA2, 40902 },
+ { 0x0CA0, 40905 },
+ { 0x0C8C, 40908 },
+ { 0x0C8B, 40912 },
+ { 0x0CE1, 40916 },
+ { 0x0CE0, 40920 },
+ { 0x32CF, 40924 },
+ { 0x2228, 40927 },
+ { 0x2A52, 40929 },
+ { 0x2A62, 40934 },
+ { 0x2A63, 40939 },
+ { 0x2A5B, 40944 },
+ { 0x2A5D, 40949 },
+ { 0x2A59, 40954 },
+ { 0x2227, 40959 },
+ { 0x2A51, 40961 },
+ { 0x2A5E, 40966 },
+ { 0x2A60, 40971 },
+ { 0x2A5A, 40976 },
+ { 0x2A5F, 40981 },
+ { 0x2A5C, 40985 },
+ { 0x25CA, 40990 },
+ { 0x27E0, 40991 },
+ { 0xA010, 40996 },
+ { 0xA019, 41001 },
+ { 0xA007, 41006 },
+ { 0xA004, 41011 },
+ { 0xA015, 41015 },
+ { 0xA01E, 41020 },
+ { 0xA00C, 41025 },
+ { 0xA011, 41030 },
+ { 0xA01A, 41035 },
+ { 0xA008, 41040 },
+ { 0xA02B, 41045 },
+ { 0xA000, 41048 },
+ { 0xA014, 41052 },
+ { 0xA01D, 41057 },
+ { 0xA00B, 41062 },
+ { 0xA013, 41067 },
+ { 0xA01C, 41072 },
+ { 0xA00A, 41077 },
+ { 0xA018, 41082 },
+ { 0xA021, 41087 },
+ { 0xA00F, 41092 },
+ { 0xA022, 41097 },
+ { 0xA002, 41100 },
+ { 0xA017, 41104 },
+ { 0xA020, 41109 },
+ { 0xA00E, 41114 },
+ { 0xA005, 41119 },
+ { 0xA02A, 41123 },
+ { 0xA003, 41126 },
+ { 0xA016, 41130 },
+ { 0xA01F, 41135 },
+ { 0xA00D, 41140 },
+ { 0xA001, 41145 },
+ { 0xA012, 41149 },
+ { 0xA01B, 41154 },
+ { 0xA009, 41159 },
+ { 0xA006, 41164 },
+ { 0xA028, 41168 },
+ { 0xA024, 41171 },
+ { 0xA023, 41174 },
+ { 0xA026, 41177 },
+ { 0xA027, 41180 },
+ { 0xA029, 41183 },
+ { 0xA025, 41186 },
+ { 0x2720, 41189 },
+ { 0x263F, 41191 },
+ { 0x22EF, 41192 },
+ { 0x9121, 41195 },
+ { 0x9122, 41199 },
+ { 0x9123, 41203 },
+ { 0x9124, 41209 },
+ { 0x911E, 41215 },
+ { 0x911F, 41219 },
+ { 0x9120, 41225 },
+ { 0x9143, 41231 },
+ { 0x918E, 41235 },
+ { 0x910A, 41238 },
+ { 0x9196, 41242 },
+ { 0x9135, 41245 },
+ { 0x9109, 41249 },
+ { 0x91A8, 41253 },
+ { 0x9176, 41258 },
+ { 0x9174, 41262 },
+ { 0x9178, 41266 },
+ { 0x917A, 41270 },
+ { 0x9164, 41274 },
+ { 0x9142, 41280 },
+ { 0x91DD, 41286 },
+ { 0x910C, 41290 },
+ { 0x91B4, 41293 },
+ { 0x91B5, 41296 },
+ { 0x9125, 41300 },
+ { 0x9126, 41304 },
+ { 0x912C, 41308 },
+ { 0x912D, 41312 },
+ { 0x91C0, 41316 },
+ { 0x91BF, 41320 },
+ { 0x915E, 41324 },
+ { 0x913C, 41328 },
+ { 0x91B0, 41332 },
+ { 0x9106, 41337 },
+ { 0x9153, 41342 },
+ { 0x9152, 41347 },
+ { 0x9159, 41352 },
+ { 0x9144, 41356 },
+ { 0x9197, 41360 },
+ { 0x919A, 41363 },
+ { 0x9199, 41367 },
+ { 0x9157, 41371 },
+ { 0x91B3, 41375 },
+ { 0x9175, 41379 },
+ { 0x9173, 41383 },
+ { 0x9177, 41387 },
+ { 0x9179, 41391 },
+ { 0x9114, 41395 },
+ { 0x915C, 41398 },
+ { 0x91CF, 41401 },
+ { 0x9102, 41404 },
+ { 0x9191, 41408 },
+ { 0x9195, 41411 },
+ { 0x9194, 41417 },
+ { 0x91B7, 41422 },
+ { 0x91C1, 41425 },
+ { 0x91C2, 41430 },
+ { 0x9190, 41435 },
+ { 0x913A, 41438 },
+ { 0x91AF, 41442 },
+ { 0x91AE, 41447 },
+ { 0x918F, 41451 },
+ { 0x9107, 41454 },
+ { 0x910B, 41459 },
+ { 0x9130, 41462 },
+ { 0x9131, 41466 },
+ { 0x9105, 41470 },
+ { 0x91D3, 41474 },
+ { 0x915D, 41477 },
+ { 0x913B, 41481 },
+ { 0x9112, 41485 },
+ { 0x91B8, 41489 },
+ { 0x91C3, 41492 },
+ { 0x9145, 41496 },
+ { 0x91D5, 41501 },
+ { 0x9134, 41504 },
+ { 0x9104, 41508 },
+ { 0x91A9, 41512 },
+ { 0x912B, 41516 },
+ { 0x912A, 41520 },
+ { 0x9101, 41524 },
+ { 0x9160, 41528 },
+ { 0x913E, 41532 },
+ { 0x91B6, 41536 },
+ { 0x91BB, 41539 },
+ { 0x91C5, 41542 },
+ { 0x91BC, 41546 },
+ { 0x9136, 41550 },
+ { 0x9137, 41554 },
+ { 0x9108, 41558 },
+ { 0x9100, 41562 },
+ { 0x91D2, 41566 },
+ { 0x9147, 41570 },
+ { 0x9146, 41575 },
+ { 0x918D, 41580 },
+ { 0x91C7, 41583 },
+ { 0x91C9, 41590 },
+ { 0x91C8, 41598 },
+ { 0x91CA, 41605 },
+ { 0x91CB, 41612 },
+ { 0x91CC, 41619 },
+ { 0x91CD, 41627 },
+ { 0x91CE, 41635 },
+ { 0x9115, 41643 },
+ { 0x9113, 41646 },
+ { 0x915B, 41649 },
+ { 0x915A, 41654 },
+ { 0x9110, 41659 },
+ { 0x9111, 41662 },
+ { 0x912E, 41666 },
+ { 0x912F, 41670 },
+ { 0x91D4, 41674 },
+ { 0x915F, 41677 },
+ { 0x913D, 41681 },
+ { 0x9133, 41685 },
+ { 0x9132, 41690 },
+ { 0x9103, 41695 },
+ { 0x91D7, 41700 },
+ { 0x916A, 41703 },
+ { 0x916B, 41707 },
+ { 0x916C, 41711 },
+ { 0x9198, 41715 },
+ { 0x9129, 41719 },
+ { 0x9158, 41724 },
+ { 0x9116, 41728 },
+ { 0x919B, 41732 },
+ { 0x919C, 41736 },
+ { 0x919D, 41740 },
+ { 0x919E, 41744 },
+ { 0x919F, 41748 },
+ { 0x91A0, 41752 },
+ { 0x91A1, 41756 },
+ { 0x91A2, 41760 },
+ { 0x91A3, 41764 },
+ { 0x91A4, 41768 },
+ { 0x91A5, 41772 },
+ { 0x910D, 41776 },
+ { 0x910E, 41780 },
+ { 0x910F, 41784 },
+ { 0x911B, 41788 },
+ { 0x91D8, 41792 },
+ { 0x91DC, 41795 },
+ { 0x9149, 41799 },
+ { 0x9151, 41805 },
+ { 0x9150, 41812 },
+ { 0x9148, 41819 },
+ { 0x914F, 41825 },
+ { 0x914E, 41831 },
+ { 0x914B, 41837 },
+ { 0x914A, 41843 },
+ { 0x914D, 41849 },
+ { 0x914C, 41855 },
+ { 0x9117, 41861 },
+ { 0x91AB, 41865 },
+ { 0x9186, 41870 },
+ { 0x9189, 41874 },
+ { 0x9185, 41878 },
+ { 0x91AA, 41882 },
+ { 0x9187, 41887 },
+ { 0x91AD, 41891 },
+ { 0x9165, 41896 },
+ { 0x9182, 41900 },
+ { 0x9188, 41904 },
+ { 0x917B, 41908 },
+ { 0x918A, 41912 },
+ { 0x916E, 41917 },
+ { 0x916F, 41921 },
+ { 0x9170, 41925 },
+ { 0x9171, 41929 },
+ { 0x9172, 41933 },
+ { 0x917D, 41937 },
+ { 0x918B, 41941 },
+ { 0x917F, 41946 },
+ { 0x91AC, 41950 },
+ { 0x917C, 41954 },
+ { 0x9167, 41958 },
+ { 0x9168, 41962 },
+ { 0x9169, 41966 },
+ { 0x916D, 41970 },
+ { 0x9166, 41975 },
+ { 0x917E, 41980 },
+ { 0x9181, 41984 },
+ { 0x9180, 41988 },
+ { 0x9192, 41992 },
+ { 0x911A, 41995 },
+ { 0x9119, 41999 },
+ { 0x91B1, 42003 },
+ { 0x91B2, 42007 },
+ { 0x91D0, 42011 },
+ { 0x91D1, 42016 },
+ { 0x91D9, 42021 },
+ { 0x91DA, 42024 },
+ { 0x91D6, 42028 },
+ { 0x91DB, 42031 },
+ { 0x9161, 42035 },
+ { 0x913F, 42039 },
+ { 0x9183, 42043 },
+ { 0x9184, 42047 },
+ { 0x91C4, 42051 },
+ { 0x91BA, 42055 },
+ { 0x91B9, 42059 },
+ { 0x91C6, 42063 },
+ { 0x91BE, 42067 },
+ { 0x91BD, 42071 },
+ { 0x911C, 42075 },
+ { 0x9118, 42079 },
+ { 0x9193, 42083 },
+ { 0x911D, 42086 },
+ { 0x91A6, 42090 },
+ { 0x91A7, 42093 },
+ { 0x9156, 42096 },
+ { 0x918C, 42100 },
+ { 0x9138, 42103 },
+ { 0x9139, 42107 },
+ { 0x9163, 42111 },
+ { 0x9141, 42115 },
+ { 0x9162, 42119 },
+ { 0x9140, 42123 },
+ { 0x9155, 42127 },
+ { 0x9154, 42133 },
+ { 0x1091, 42139 },
+ { 0x1096, 42143 },
+ { 0x1092, 42147 },
+ { 0x1095, 42151 },
+ { 0x1094, 42155 },
+ { 0x1099, 42159 },
+ { 0x1090, 42163 },
+ { 0x1098, 42167 },
+ { 0x1097, 42171 },
+ { 0x1093, 42175 },
+ { 0x1037, 42179 },
+ { 0x103A, 42183 },
+ { 0x1087, 42186 },
+ { 0x1088, 42190 },
+ { 0x1089, 42194 },
+ { 0x108A, 42198 },
+ { 0x108B, 42202 },
+ { 0x108C, 42207 },
+ { 0x108D, 42212 },
+ { 0x108F, 42218 },
+ { 0x104A, 42223 },
+ { 0x1039, 42227 },
+ { 0x104B, 42230 },
+ { 0x1038, 42233 },
+ { 0x1069, 42236 },
+ { 0x106A, 42242 },
+ { 0x106B, 42248 },
+ { 0x106C, 42254 },
+ { 0x106D, 42260 },
+ { 0x1036, 42266 },
+ { 0x1064, 42269 },
+ { 0x1063, 42276 },
+ { 0x1041, 42282 },
+ { 0x1046, 42285 },
+ { 0x1042, 42288 },
+ { 0x1045, 42291 },
+ { 0x1044, 42294 },
+ { 0x1049, 42297 },
+ { 0x1040, 42300 },
+ { 0x1048, 42303 },
+ { 0x1047, 42306 },
+ { 0x1043, 42309 },
+ { 0x1031, 42312 },
+ { 0x1035, 42316 },
+ { 0x102D, 42321 },
+ { 0x102F, 42325 },
+ { 0x102C, 42329 },
+ { 0x1032, 42333 },
+ { 0x102E, 42337 },
+ { 0x1030, 42341 },
+ { 0x1034, 42345 },
+ { 0x1033, 42350 },
+ { 0x1071, 42355 },
+ { 0x1062, 42361 },
+ { 0x1084, 42367 },
+ { 0x1085, 42372 },
+ { 0x1083, 42378 },
+ { 0x1086, 42383 },
+ { 0x102B, 42389 },
+ { 0x1073, 42394 },
+ { 0x1074, 42399 },
+ { 0x1072, 42404 },
+ { 0x1058, 42409 },
+ { 0x1056, 42414 },
+ { 0x1059, 42419 },
+ { 0x1057, 42424 },
+ { 0x1067, 42429 },
+ { 0x1068, 42436 },
+ { 0x1021, 42443 },
+ { 0x1027, 42446 },
+ { 0x1023, 42449 },
+ { 0x1029, 42452 },
+ { 0x1025, 42455 },
+ { 0x102A, 42458 },
+ { 0x1017, 42461 },
+ { 0x1005, 42464 },
+ { 0x1012, 42467 },
+ { 0x1002, 42470 },
+ { 0x101F, 42473 },
+ { 0x1024, 42476 },
+ { 0x1007, 42479 },
+ { 0x1000, 42482 },
+ { 0x101C, 42485 },
+ { 0x1019, 42488 },
+ { 0x1014, 42491 },
+ { 0x1015, 42494 },
+ { 0x101B, 42497 },
+ { 0x101E, 42500 },
+ { 0x1010, 42503 },
+ { 0x1026, 42506 },
+ { 0x101D, 42509 },
+ { 0x101A, 42512 },
+ { 0x1018, 42515 },
+ { 0x1006, 42518 },
+ { 0x100D, 42521 },
+ { 0x1013, 42524 },
+ { 0x1003, 42527 },
+ { 0x1008, 42530 },
+ { 0x1001, 42533 },
+ { 0x1020, 42536 },
+ { 0x1028, 42539 },
+ { 0x105C, 42543 },
+ { 0x105D, 42547 },
+ { 0x105B, 42551 },
+ { 0x105A, 42555 },
+ { 0x1004, 42559 },
+ { 0x100F, 42562 },
+ { 0x1009, 42565 },
+ { 0x1016, 42568 },
+ { 0x1050, 42571 },
+ { 0x1051, 42574 },
+ { 0x1011, 42577 },
+ { 0x100B, 42580 },
+ { 0x100E, 42583 },
+ { 0x100A, 42586 },
+ { 0x1061, 42589 },
+ { 0x1022, 42594 },
+ { 0x107F, 42598 },
+ { 0x1078, 42602 },
+ { 0x107B, 42606 },
+ { 0x107E, 42610 },
+ { 0x1077, 42614 },
+ { 0x1081, 42618 },
+ { 0x1075, 42622 },
+ { 0x107C, 42626 },
+ { 0x1079, 42630 },
+ { 0x1076, 42634 },
+ { 0x107A, 42638 },
+ { 0x107D, 42642 },
+ { 0x1080, 42646 },
+ { 0x100C, 42650 },
+ { 0x103F, 42653 },
+ { 0x108E, 42657 },
+ { 0x106E, 42662 },
+ { 0x106F, 42668 },
+ { 0x1070, 42674 },
+ { 0x1054, 42680 },
+ { 0x1052, 42684 },
+ { 0x1055, 42688 },
+ { 0x1053, 42692 },
+ { 0x1066, 42696 },
+ { 0x1065, 42702 },
+ { 0x109E, 42708 },
+ { 0x109F, 42712 },
+ { 0x104F, 42716 },
+ { 0x104C, 42719 },
+ { 0x104D, 42722 },
+ { 0x104E, 42725 },
+ { 0x1060, 42728 },
+ { 0x105F, 42734 },
+ { 0x105E, 42740 },
+ { 0x1082, 42746 },
+ { 0x103E, 42752 },
+ { 0x103C, 42757 },
+ { 0x103D, 42762 },
+ { 0x103B, 42767 },
+ { 0x22AF, 42772 },
+ { 0x2288, 42779 },
+ { 0x2289, 42786 },
+ { 0x2270, 42793 },
+ { 0x2274, 42798 },
+ { 0x2278, 42803 },
+ { 0x2271, 42807 },
+ { 0x2279, 42812 },
+ { 0x2275, 42816 },
+ { 0x2247, 42821 },
+ { 0x2646, 42827 },
+ { 0x206F, 42828 },
+ { 0x27AF, 42831 },
+ { 0x27B1, 42837 },
+ { 0x29A6, 42843 },
+ { 0x29A7, 42847 },
+ { 0x74A1, 42851 },
+ { 0x74A6, 42854 },
+ { 0x74A2, 42857 },
+ { 0x74A5, 42860 },
+ { 0x74A4, 42863 },
+ { 0x74A9, 42866 },
+ { 0x74A0, 42869 },
+ { 0x74A8, 42872 },
+ { 0x74A7, 42875 },
+ { 0x74A3, 42878 },
+ { 0x7496, 42881 },
+ { 0x7497, 42884 },
+ { 0x7498, 42887 },
+ { 0x7499, 42890 },
+ { 0x749A, 42893 },
+ { 0x749B, 42896 },
+ { 0x7481, 42899 },
+ { 0x749C, 42902 },
+ { 0x748D, 42905 },
+ { 0x748C, 42908 },
+ { 0x7494, 42911 },
+ { 0x7483, 42914 },
+ { 0x749D, 42917 },
+ { 0x7487, 42920 },
+ { 0x7488, 42923 },
+ { 0x7482, 42926 },
+ { 0x7484, 42929 },
+ { 0x7495, 42932 },
+ { 0x748A, 42935 },
+ { 0x7485, 42938 },
+ { 0x7493, 42941 },
+ { 0x7480, 42944 },
+ { 0x748B, 42947 },
+ { 0x7486, 42950 },
+ { 0x748F, 42953 },
+ { 0x7490, 42956 },
+ { 0x7491, 42959 },
+ { 0x7492, 42962 },
+ { 0x748E, 42965 },
+ { 0x7489, 42968 },
+ { 0x2202, 42971 },
+ { 0x0025, 42973 },
+ { 0x00B6, 42975 },
+ { 0x2669, 42977 },
+ { 0x23B7, 42979 },
+ { 0x2B41, 42982 },
+ { 0x2B47, 42988 },
+ { 0x005C, 42994 },
+ { 0x29F7, 42996 },
+ { 0x29F5, 43001 },
+ { 0x27C8, 43004 },
+ { 0x2765, 43008 },
+ { 0x2767, 43013 },
+ { 0x213A, 43017 },
+ { 0x2613, 43020 },
+ { 0x2108, 43021 },
+ { 0x00A7, 43022 },
+ { 0x2313, 43024 },
+ { 0x2120, 43025 },
+ { 0x26B9, 43027 },
+ { 0x746D, 43028 },
+ { 0x7466, 43031 },
+ { 0x746A, 43034 },
+ { 0x7479, 43037 },
+ { 0x7455, 43040 },
+ { 0x7473, 43043 },
+ { 0x7469, 43046 },
+ { 0x7471, 43049 },
+ { 0x747A, 43052 },
+ { 0x7478, 43055 },
+ { 0x7468, 43058 },
+ { 0x7477, 43061 },
+ { 0x745A, 43064 },
+ { 0x747D, 43067 },
+ { 0x7470, 43070 },
+ { 0x7467, 43073 },
+ { 0x747B, 43076 },
+ { 0x7453, 43079 },
+ { 0x745C, 43082 },
+ { 0x747E, 43085 },
+ { 0x7472, 43088 },
+ { 0x746F, 43091 },
+ { 0x7474, 43094 },
+ { 0x7476, 43097 },
+ { 0x746C, 43100 },
+ { 0x7451, 43103 },
+ { 0x745D, 43106 },
+ { 0x7462, 43109 },
+ { 0x7458, 43112 },
+ { 0x747F, 43115 },
+ { 0x745F, 43118 },
+ { 0x745B, 43121 },
+ { 0x7459, 43124 },
+ { 0x7452, 43127 },
+ { 0x7464, 43130 },
+ { 0x7465, 43133 },
+ { 0x7475, 43136 },
+ { 0x7450, 43139 },
+ { 0x746E, 43142 },
+ { 0x7456, 43145 },
+ { 0x745E, 43148 },
+ { 0x746B, 43151 },
+ { 0x747C, 43154 },
+ { 0x7463, 43157 },
+ { 0x7461, 43160 },
+ { 0x7454, 43163 },
+ { 0x7457, 43166 },
+ { 0x7460, 43169 },
+ { 0x29E2, 43172 },
+ { 0x2A9D, 43174 },
+ { 0x2A9E, 43177 },
+ { 0x2A9F, 43180 },
+ { 0x2AA0, 43186 },
+ { 0x2A6C, 43192 },
+ { 0x0DCA, 43195 },
+ { 0x0D83, 43198 },
+ { 0x0D82, 43201 },
+ { 0x0DDA, 43204 },
+ { 0x0DD3, 43209 },
+ { 0x0DD6, 43214 },
+ { 0x0DD1, 43219 },
+ { 0x0DF3, 43224 },
+ { 0x0DF2, 43229 },
+ { 0x0DD2, 43234 },
+ { 0x0DD4, 43239 },
+ { 0x0DD0, 43244 },
+ { 0x0DDB, 43249 },
+ { 0x0DD9, 43254 },
+ { 0x0DDD, 43258 },
+ { 0x0DDC, 43265 },
+ { 0x0DDE, 43271 },
+ { 0x0DCF, 43277 },
+ { 0x0DDF, 43281 },
+ { 0x0DD8, 43285 },
+ { 0x0DB9, 43289 },
+ { 0x0D85, 43293 },
+ { 0x0D91, 43296 },
+ { 0x0D89, 43299 },
+ { 0x0D94, 43302 },
+ { 0x0D8B, 43305 },
+ { 0x0D86, 43308 },
+ { 0x0D87, 43311 },
+ { 0x0D93, 43314 },
+ { 0x0D96, 43317 },
+ { 0x0DBD, 43320 },
+ { 0x0DB1, 43324 },
+ { 0x0DC3, 43328 },
+ { 0x0D92, 43332 },
+ { 0x0DC6, 43335 },
+ { 0x0DC4, 43338 },
+ { 0x0D8A, 43341 },
+ { 0x0D9E, 43344 },
+ { 0x0DB8, 43348 },
+ { 0x0D95, 43351 },
+ { 0x0DBB, 43354 },
+ { 0x0DB3, 43357 },
+ { 0x0D9F, 43361 },
+ { 0x0DA6, 43365 },
+ { 0x0DAC, 43369 },
+ { 0x0DC1, 43373 },
+ { 0x0DA5, 43377 },
+ { 0x0DA4, 43382 },
+ { 0x0D8C, 43386 },
+ { 0x0DC0, 43389 },
+ { 0x0DBA, 43392 },
+ { 0x0D88, 43395 },
+ { 0x0D8F, 43398 },
+ { 0x0D8D, 43401 },
+ { 0x0D90, 43404 },
+ { 0x0D8E, 43407 },
+ { 0x0DC5, 43410 },
+ { 0x0DAB, 43414 },
+ { 0x0DC2, 43418 },
+ { 0x0DB6, 43422 },
+ { 0x0DA0, 43426 },
+ { 0x0DAF, 43430 },
+ { 0x0D9C, 43434 },
+ { 0x0DA2, 43438 },
+ { 0x0D9A, 43442 },
+ { 0x0DB4, 43446 },
+ { 0x0DAD, 43450 },
+ { 0x0DA9, 43454 },
+ { 0x0DA7, 43458 },
+ { 0x0DB7, 43462 },
+ { 0x0DA1, 43466 },
+ { 0x0DB0, 43470 },
+ { 0x0D9D, 43474 },
+ { 0x0DA3, 43478 },
+ { 0x0D9B, 43482 },
+ { 0x0DB5, 43486 },
+ { 0x0DAE, 43490 },
+ { 0x0DAA, 43494 },
+ { 0x0DA8, 43498 },
+ { 0x0DF4, 43502 },
+ { 0x273A, 43505 },
+ { 0x2A95, 43508 },
+ { 0x2A97, 43513 },
+ { 0x2A96, 43521 },
+ { 0x2A98, 43526 },
+ { 0x2A57, 43534 },
+ { 0x2A58, 43537 },
+ { 0x2AAA, 43540 },
+ { 0x2AAC, 43542 },
+ { 0x2603, 43547 },
+ { 0x002F, 43548 },
+ { 0x29F6, 43549 },
+ { 0x2747, 43552 },
+ { 0x22A1, 43553 },
+ { 0x2E2C, 43556 },
+ { 0x229E, 43560 },
+ { 0x229F, 43562 },
+ { 0x29C7, 43564 },
+ { 0x22A0, 43567 },
+ { 0x29C4, 43569 },
+ { 0x29C8, 43573 },
+ { 0x29C5, 43575 },
+ { 0x29C6, 43579 },
+ { 0x222F, 43581 },
+ { 0x1714, 43583 },
+ { 0x1712, 43586 },
+ { 0x1713, 43590 },
+ { 0x1700, 43594 },
+ { 0x1701, 43597 },
+ { 0x1702, 43600 },
+ { 0x170A, 43603 },
+ { 0x1707, 43606 },
+ { 0x1704, 43609 },
+ { 0x1711, 43612 },
+ { 0x1703, 43615 },
+ { 0x170E, 43618 },
+ { 0x170B, 43621 },
+ { 0x1708, 43624 },
+ { 0x1709, 43627 },
+ { 0x1710, 43630 },
+ { 0x1706, 43633 },
+ { 0x170F, 43636 },
+ { 0x170C, 43639 },
+ { 0x1705, 43642 },
+ { 0x27A2, 43645 },
+ { 0x27A3, 43649 },
+ { 0x0FBE, 43653 },
+ { 0x0FBF, 43657 },
+ { 0x0F3D, 43664 },
+ { 0x0F3C, 43669 },
+ { 0x0F38, 43674 },
+ { 0x0F3B, 43678 },
+ { 0x0F3A, 43683 },
+ { 0x0F11, 43688 },
+ { 0x0F39, 43694 },
+ { 0x0F07, 43698 },
+ { 0x0F0A, 43705 },
+ { 0x0F03, 43711 },
+ { 0x0F02, 43720 },
+ { 0x0F01, 43729 },
+ { 0x0F14, 43736 },
+ { 0x0F35, 43740 },
+ { 0x0F37, 43746 },
+ { 0x0F0E, 43752 },
+ { 0x0FD2, 43756 },
+ { 0x0F10, 43760 },
+ { 0x0F12, 43765 },
+ { 0x0F0D, 43770 },
+ { 0x0F34, 43773 },
+ { 0x0FD0, 43777 },
+ { 0x0F09, 43784 },
+ { 0x0F06, 43789 },
+ { 0x0F13, 43797 },
+ { 0x0F36, 43805 },
+ { 0x0FD1, 43813 },
+ { 0x0F08, 43820 },
+ { 0x0F0F, 43824 },
+ { 0x0F85, 43828 },
+ { 0x0F05, 43831 },
+ { 0x0FD4, 43838 },
+ { 0x0F84, 43847 },
+ { 0x0F04, 43850 },
+ { 0x0FD3, 43857 },
+ { 0x0F0C, 43866 },
+ { 0x0F0B, 43871 },
+ { 0x0F8A, 43875 },
+ { 0x0F8B, 43880 },
+ { 0x0F88, 43885 },
+ { 0x0F86, 43890 },
+ { 0x0F3F, 43894 },
+ { 0x0F82, 43898 },
+ { 0x0F83, 43904 },
+ { 0x0F3E, 43908 },
+ { 0x0F89, 43912 },
+ { 0x0F1D, 43916 },
+ { 0x0FCF, 43921 },
+ { 0x0FCE, 43926 },
+ { 0x0F1E, 43932 },
+ { 0x0F1A, 43937 },
+ { 0x0F1C, 43942 },
+ { 0x0F1F, 43947 },
+ { 0x0F1B, 43953 },
+ { 0x0F7E, 43958 },
+ { 0x0F7F, 43964 },
+ { 0x0F87, 43968 },
+ { 0x0F21, 43972 },
+ { 0x0F26, 43975 },
+ { 0x0F22, 43978 },
+ { 0x0F25, 43981 },
+ { 0x0F24, 43984 },
+ { 0x0F2A, 43987 },
+ { 0x0F2F, 43991 },
+ { 0x0F2B, 43995 },
+ { 0x0F2E, 43999 },
+ { 0x0F2D, 44003 },
+ { 0x0F32, 44007 },
+ { 0x0F33, 44011 },
+ { 0x0F31, 44015 },
+ { 0x0F30, 44019 },
+ { 0x0F2C, 44023 },
+ { 0x0F29, 44027 },
+ { 0x0F20, 44030 },
+ { 0x0F28, 44033 },
+ { 0x0F27, 44036 },
+ { 0x0F23, 44039 },
+ { 0x0F7A, 44042 },
+ { 0x0F72, 44046 },
+ { 0x0F7C, 44050 },
+ { 0x0F74, 44054 },
+ { 0x0F71, 44058 },
+ { 0x0F7B, 44062 },
+ { 0x0F73, 44066 },
+ { 0x0F7D, 44070 },
+ { 0x0F75, 44074 },
+ { 0x0F78, 44078 },
+ { 0x0F76, 44083 },
+ { 0x0F79, 44088 },
+ { 0x0F77, 44093 },
+ { 0x0F80, 44098 },
+ { 0x0F81, 44103 },
+ { 0x0F68, 44108 },
+ { 0x0F60, 44111 },
+ { 0x0F56, 44114 },
+ { 0x0F45, 44117 },
+ { 0x0F51, 44120 },
+ { 0x0F42, 44123 },
+ { 0x0F67, 44126 },
+ { 0x0F47, 44129 },
+ { 0x0F40, 44132 },
+ { 0x0F63, 44135 },
+ { 0x0F58, 44138 },
+ { 0x0F53, 44141 },
+ { 0x0F54, 44144 },
+ { 0x0F62, 44147 },
+ { 0x0F66, 44150 },
+ { 0x0F4F, 44153 },
+ { 0x0F5D, 44156 },
+ { 0x0F61, 44159 },
+ { 0x0F5F, 44162 },
+ { 0x0F57, 44165 },
+ { 0x0F46, 44168 },
+ { 0x0F4C, 44171 },
+ { 0x0F52, 44174 },
+ { 0x0F5B, 44177 },
+ { 0x0F43, 44180 },
+ { 0x0F41, 44183 },
+ { 0x0F6B, 44186 },
+ { 0x0F44, 44189 },
+ { 0x0F4E, 44192 },
+ { 0x0F49, 44195 },
+ { 0x0F55, 44198 },
+ { 0x0F6C, 44201 },
+ { 0x0F64, 44204 },
+ { 0x0F65, 44207 },
+ { 0x0F50, 44210 },
+ { 0x0F59, 44213 },
+ { 0x0F4A, 44216 },
+ { 0x0F5E, 44219 },
+ { 0x0F4D, 44222 },
+ { 0x0F5C, 44225 },
+ { 0x0F69, 44228 },
+ { 0x0F5A, 44231 },
+ { 0x0F4B, 44234 },
+ { 0x0F6A, 44237 },
+ { 0x0FC9, 44241 },
+ { 0x0FCC, 44245 },
+ { 0x0FCB, 44251 },
+ { 0x0FCA, 44257 },
+ { 0x0FC5, 44263 },
+ { 0x0FC7, 44267 },
+ { 0x0FC4, 44273 },
+ { 0x0FC8, 44277 },
+ { 0x0FC6, 44281 },
+ { 0x0F15, 44285 },
+ { 0x0F16, 44290 },
+ { 0x0F00, 44295 },
+ { 0x0FB8, 44298 },
+ { 0x0FB0, 44302 },
+ { 0x0FA6, 44306 },
+ { 0x0F95, 44310 },
+ { 0x0FA1, 44314 },
+ { 0x0F92, 44318 },
+ { 0x0FB7, 44322 },
+ { 0x0F97, 44326 },
+ { 0x0F90, 44330 },
+ { 0x0FB3, 44334 },
+ { 0x0FA8, 44338 },
+ { 0x0FA3, 44342 },
+ { 0x0FA4, 44346 },
+ { 0x0FB2, 44350 },
+ { 0x0FB6, 44354 },
+ { 0x0F9F, 44358 },
+ { 0x0FAD, 44362 },
+ { 0x0FB1, 44366 },
+ { 0x0FAF, 44370 },
+ { 0x0FA7, 44374 },
+ { 0x0F96, 44378 },
+ { 0x0F9C, 44382 },
+ { 0x0FA2, 44386 },
+ { 0x0FAB, 44390 },
+ { 0x0F93, 44394 },
+ { 0x0F91, 44398 },
+ { 0x0F94, 44402 },
+ { 0x0F9E, 44406 },
+ { 0x0F99, 44410 },
+ { 0x0FA5, 44414 },
+ { 0x0FB4, 44418 },
+ { 0x0FB5, 44422 },
+ { 0x0FA0, 44426 },
+ { 0x0FA9, 44430 },
+ { 0x0F9A, 44434 },
+ { 0x0FAE, 44438 },
+ { 0x0F9D, 44442 },
+ { 0x0FAC, 44446 },
+ { 0x0FB9, 44450 },
+ { 0x0FAA, 44454 },
+ { 0x0F9B, 44458 },
+ { 0x0FBC, 44462 },
+ { 0x0FBA, 44467 },
+ { 0x0FBB, 44472 },
+ { 0x0F17, 44477 },
+ { 0x0F19, 44484 },
+ { 0x0F18, 44489 },
+ { 0x0FC2, 44494 },
+ { 0x0FC3, 44499 },
+ { 0x0FC0, 44504 },
+ { 0x0FC1, 44509 },
+ { 0x2632, 44514 },
+ { 0x2631, 44517 },
+ { 0x2634, 44520 },
+ { 0x2637, 44523 },
+ { 0x2635, 44526 },
+ { 0x2630, 44529 },
+ { 0x2633, 44532 },
+ { 0x2636, 44535 },
+ { 0x219F, 44538 },
+ { 0x2191, 44542 },
+ { 0x2912, 44544 },
+ { 0x21A5, 44548 },
+ { 0x21B0, 44552 },
+ { 0x21B1, 44557 },
+ { 0x21DE, 44562 },
+ { 0x2909, 44567 },
+ { 0x21C5, 44572 },
+ { 0x2B06, 44578 },
+ { 0x21E7, 44581 },
+ { 0x21EB, 44584 },
+ { 0x21ED, 44589 },
+ { 0x21EC, 44597 },
+ { 0x21EA, 44605 },
+ { 0x21EE, 44610 },
+ { 0x21EF, 44614 },
+ { 0x2E15, 44620 },
+ { 0x21E1, 44622 },
+ { 0x21D1, 44625 },
+ { 0x21C8, 44628 },
+ { 0x290A, 44631 },
+ { 0x2958, 44634 },
+ { 0x2960, 44641 },
+ { 0x2963, 44648 },
+ { 0x296E, 44659 },
+ { 0x2954, 44670 },
+ { 0x295C, 44677 },
+ { 0x21BF, 44684 },
+ { 0x21BE, 44689 },
+ { 0x27F0, 44694 },
+ { 0x2949, 44697 },
+ { 0x270C, 44703 },
+ { 0x26A0, 44705 },
+ { 0x270D, 44707 },
+ { 0x206D, 44709 },
+ { 0x206B, 44713 },
+ { 0x2708, 44716 },
+ { 0x212B, 44717 },
+ { 0x2652, 44719 },
+ { 0x0589, 44720 },
+ { 0x055D, 44723 },
+ { 0x056E, 44725 },
+ { 0x0581, 44729 },
+ { 0x0564, 44733 },
+ { 0x0567, 44737 },
+ { 0x0568, 44741 },
+ { 0x0570, 44745 },
+ { 0x0571, 44749 },
+ { 0x0585, 44753 },
+ { 0x057C, 44757 },
+ { 0x0569, 44761 },
+ { 0x0578, 44765 },
+ { 0x0575, 44769 },
+ { 0x0566, 44773 },
+ { 0x0561, 44777 },
+ { 0x0562, 44781 },
+ { 0x0579, 44785 },
+ { 0x0565, 44789 },
+ { 0x0586, 44793 },
+ { 0x0563, 44797 },
+ { 0x056B, 44801 },
+ { 0x0584, 44805 },
+ { 0x056F, 44809 },
+ { 0x0574, 44813 },
+ { 0x0576, 44817 },
+ { 0x057A, 44821 },
+ { 0x0580, 44825 },
+ { 0x057D, 44829 },
+ { 0x0577, 44833 },
+ { 0x057E, 44837 },
+ { 0x056D, 44841 },
+ { 0x056A, 44845 },
+ { 0x0573, 44849 },
+ { 0x0572, 44853 },
+ { 0x057B, 44857 },
+ { 0x056C, 44861 },
+ { 0x0583, 44865 },
+ { 0x057F, 44869 },
+ { 0x0582, 44873 },
+ { 0x0587, 44877 },
+ { 0x6B14, 44882 },
+ { 0x6B15, 44887 },
+ { 0x6B13, 44892 },
+ { 0x6B17, 44897 },
+ { 0x6B16, 44902 },
+ { 0x058A, 44907 },
+ { 0x053E, 44909 },
+ { 0x0551, 44913 },
+ { 0x0534, 44917 },
+ { 0x0537, 44921 },
+ { 0x0538, 44925 },
+ { 0x0540, 44929 },
+ { 0x0541, 44933 },
+ { 0x0555, 44937 },
+ { 0x054C, 44941 },
+ { 0x0539, 44945 },
+ { 0x0548, 44949 },
+ { 0x0545, 44953 },
+ { 0x0536, 44957 },
+ { 0x0531, 44961 },
+ { 0x0532, 44965 },
+ { 0x0549, 44969 },
+ { 0x0535, 44973 },
+ { 0x0556, 44977 },
+ { 0x0533, 44981 },
+ { 0x053B, 44985 },
+ { 0x0554, 44989 },
+ { 0x053F, 44993 },
+ { 0x0544, 44997 },
+ { 0x0546, 45001 },
+ { 0x054A, 45005 },
+ { 0x0550, 45009 },
+ { 0x054D, 45013 },
+ { 0x0547, 45017 },
+ { 0x054E, 45021 },
+ { 0x053D, 45025 },
+ { 0x053A, 45029 },
+ { 0x0543, 45033 },
+ { 0x0542, 45037 },
+ { 0x054B, 45041 },
+ { 0x053C, 45045 },
+ { 0x0553, 45049 },
+ { 0x054F, 45053 },
+ { 0x0552, 45057 },
+ { 0x055B, 45061 },
+ { 0x0559, 45064 },
+ { 0x055E, 45070 },
+ { 0x055A, 45073 },
+ { 0x055C, 45075 },
+ { 0x055F, 45078 },
+ { 0x002A, 45081 },
+ { 0x2217, 45082 },
+ { 0x2042, 45084 },
+ { 0x1B44, 45085 },
+ { 0x1B00, 45088 },
+ { 0x1B01, 45092 },
+ { 0x1B04, 45096 },
+ { 0x1B02, 45099 },
+ { 0x1B03, 45102 },
+ { 0x1B34, 45105 },
+ { 0x1B5E, 45108 },
+ { 0x1B5F, 45111 },
+ { 0x1B5D, 45114 },
+ { 0x1B51, 45117 },
+ { 0x1B56, 45120 },
+ { 0x1B52, 45123 },
+ { 0x1B55, 45126 },
+ { 0x1B54, 45129 },
+ { 0x1B59, 45132 },
+ { 0x1B50, 45135 },
+ { 0x1B58, 45138 },
+ { 0x1B57, 45141 },
+ { 0x1B53, 45144 },
+ { 0x1B5A, 45147 },
+ { 0x1B3C, 45149 },
+ { 0x1B3D, 45154 },
+ { 0x1B3A, 45160 },
+ { 0x1B3B, 45165 },
+ { 0x1B36, 45171 },
+ { 0x1B37, 45175 },
+ { 0x1B38, 45180 },
+ { 0x1B39, 45184 },
+ { 0x1B42, 45189 },
+ { 0x1B43, 45193 },
+ { 0x1B3E, 45198 },
+ { 0x1B3F, 45202 },
+ { 0x1B41, 45207 },
+ { 0x1B40, 45213 },
+ { 0x1B35, 45218 },
+ { 0x1B5C, 45222 },
+ { 0x1B29, 45224 },
+ { 0x1B2A, 45227 },
+ { 0x1B18, 45231 },
+ { 0x1B19, 45234 },
+ { 0x1B24, 45238 },
+ { 0x1B25, 45241 },
+ { 0x1B1F, 45245 },
+ { 0x1B20, 45250 },
+ { 0x1B48, 45255 },
+ { 0x1B15, 45259 },
+ { 0x1B16, 45262 },
+ { 0x1B33, 45266 },
+ { 0x1B1A, 45269 },
+ { 0x1B1B, 45272 },
+ { 0x1B13, 45276 },
+ { 0x1B14, 45279 },
+ { 0x1B2E, 45283 },
+ { 0x1B0D, 45286 },
+ { 0x1B0E, 45290 },
+ { 0x1B2B, 45295 },
+ { 0x1B26, 45298 },
+ { 0x1B21, 45301 },
+ { 0x1B27, 45305 },
+ { 0x1B28, 45308 },
+ { 0x1B2D, 45312 },
+ { 0x1B0B, 45315 },
+ { 0x1B0C, 45319 },
+ { 0x1B32, 45324 },
+ { 0x1B30, 45327 },
+ { 0x1B31, 45331 },
+ { 0x1B22, 45335 },
+ { 0x1B23, 45338 },
+ { 0x1B1D, 45342 },
+ { 0x1B1E, 45346 },
+ { 0x1B49, 45351 },
+ { 0x1B2F, 45355 },
+ { 0x1B2C, 45358 },
+ { 0x1B45, 45361 },
+ { 0x1B17, 45365 },
+ { 0x1B1C, 45368 },
+ { 0x1B4A, 45371 },
+ { 0x1B46, 45375 },
+ { 0x1B47, 45379 },
+ { 0x1B05, 45383 },
+ { 0x1B06, 45386 },
+ { 0x1B0F, 45390 },
+ { 0x1B07, 45393 },
+ { 0x1B08, 45396 },
+ { 0x1B11, 45400 },
+ { 0x1B12, 45403 },
+ { 0x1B09, 45407 },
+ { 0x1B0A, 45410 },
+ { 0x1B10, 45414 },
+ { 0x1B4B, 45417 },
+ { 0x1B5B, 45421 },
+ { 0x1B64, 45423 },
+ { 0x1B6A, 45427 },
+ { 0x1B65, 45432 },
+ { 0x1B62, 45437 },
+ { 0x1B66, 45441 },
+ { 0x1B61, 45445 },
+ { 0x1B63, 45449 },
+ { 0x1B67, 45453 },
+ { 0x1B69, 45457 },
+ { 0x1B68, 45461 },
+ { 0x1B73, 45465 },
+ { 0x1B72, 45470 },
+ { 0x1B6C, 45475 },
+ { 0x1B6B, 45480 },
+ { 0x1B6E, 45485 },
+ { 0x1B71, 45490 },
+ { 0x1B6D, 45497 },
+ { 0x1B70, 45502 },
+ { 0x1B6F, 45509 },
+ { 0x1B78, 45514 },
+ { 0x1B7C, 45520 },
+ { 0x1B79, 45526 },
+ { 0x1B7A, 45532 },
+ { 0x1B7B, 45538 },
+ { 0x1B75, 45544 },
+ { 0x1B74, 45550 },
+ { 0x1B77, 45556 },
+ { 0x1B76, 45562 },
+ { 0x1B60, 45568 },
+ { 0x31B7, 45570 },
+ { 0x31B6, 45574 },
+ { 0x31B4, 45578 },
+ { 0x31B5, 45582 },
+ { 0x311A, 45586 },
+ { 0x3105, 45589 },
+ { 0x3118, 45592 },
+ { 0x3109, 45595 },
+ { 0x311C, 45598 },
+ { 0x3108, 45601 },
+ { 0x310D, 45604 },
+ { 0x310F, 45607 },
+ { 0x3127, 45610 },
+ { 0x3110, 45613 },
+ { 0x310E, 45616 },
+ { 0x310C, 45619 },
+ { 0x3107, 45622 },
+ { 0x310B, 45625 },
+ { 0x311B, 45628 },
+ { 0x3106, 45631 },
+ { 0x3111, 45634 },
+ { 0x3116, 45637 },
+ { 0x3119, 45640 },
+ { 0x310A, 45643 },
+ { 0x3128, 45646 },
+ { 0x312A, 45649 },
+ { 0x3112, 45652 },
+ { 0x3117, 45655 },
+ { 0x311E, 45658 },
+ { 0x31B0, 45661 },
+ { 0x3122, 45664 },
+ { 0x3120, 45667 },
+ { 0x31A0, 45670 },
+ { 0x3114, 45673 },
+ { 0x31A4, 45676 },
+ { 0x311D, 45679 },
+ { 0x311F, 45682 },
+ { 0x3123, 45685 },
+ { 0x3126, 45688 },
+ { 0x312C, 45691 },
+ { 0x31A3, 45694 },
+ { 0x312D, 45697 },
+ { 0x31AC, 45700 },
+ { 0x31A8, 45703 },
+ { 0x3129, 45706 },
+ { 0x31A2, 45709 },
+ { 0x312B, 45712 },
+ { 0x31B1, 45715 },
+ { 0x31A6, 45718 },
+ { 0x3121, 45721 },
+ { 0x3115, 45724 },
+ { 0x3113, 45727 },
+ { 0x31A1, 45730 },
+ { 0x3124, 45733 },
+ { 0x31A9, 45736 },
+ { 0x3125, 45739 },
+ { 0x31A5, 45742 },
+ { 0x31AA, 45745 },
+ { 0x31AD, 45748 },
+ { 0x31B2, 45751 },
+ { 0x31A7, 45754 },
+ { 0x31AB, 45757 },
+ { 0x31AE, 45760 },
+ { 0x31AF, 45763 },
+ { 0x31B3, 45766 },
+ { 0x1A1F, 45769 },
+ { 0x1A19, 45773 },
+ { 0x1A17, 45777 },
+ { 0x1A1A, 45781 },
+ { 0x1A18, 45785 },
+ { 0x1A1B, 45789 },
+ { 0x1A15, 45793 },
+ { 0x1A05, 45796 },
+ { 0x1A0C, 45799 },
+ { 0x1A09, 45802 },
+ { 0x1A01, 45805 },
+ { 0x1A16, 45808 },
+ { 0x1A0D, 45811 },
+ { 0x1A00, 45814 },
+ { 0x1A12, 45817 },
+ { 0x1A06, 45820 },
+ { 0x1A0A, 45823 },
+ { 0x1A04, 45826 },
+ { 0x1A11, 45829 },
+ { 0x1A14, 45832 },
+ { 0x1A08, 45835 },
+ { 0x1A13, 45838 },
+ { 0x1A10, 45841 },
+ { 0x1A07, 45844 },
+ { 0x1A02, 45847 },
+ { 0x1A0B, 45850 },
+ { 0x1A0E, 45853 },
+ { 0x1A03, 45856 },
+ { 0x1A0F, 45859 },
+ { 0x1A1E, 45862 },
+ { 0x25CE, 45864 },
+ { 0x2624, 45865 },
+ { 0x140A, 45866 },
+ { 0x14A1, 45869 },
+ { 0x1401, 45872 },
+ { 0x155D, 45875 },
+ { 0x1403, 45878 },
+ { 0x1483, 45881 },
+ { 0x14EA, 45884 },
+ { 0x14BB, 45887 },
+ { 0x14D0, 45890 },
+ { 0x1405, 45893 },
+ { 0x1449, 45896 },
+ { 0x1585, 45899 },
+ { 0x1550, 45902 },
+ { 0x1505, 45905 },
+ { 0x1466, 45908 },
+ { 0x153E, 45911 },
+ { 0x140B, 45914 },
+ { 0x141C, 45917 },
+ { 0x142E, 45920 },
+ { 0x1490, 45923 },
+ { 0x1489, 45926 },
+ { 0x148B, 45929 },
+ { 0x148D, 45932 },
+ { 0x142B, 45935 },
+ { 0x1559, 45938 },
+ { 0x1553, 45941 },
+ { 0x1555, 45944 },
+ { 0x1557, 45947 },
+ { 0x157D, 45950 },
+ { 0x1404, 45953 },
+ { 0x142C, 45956 },
+ { 0x1472, 45959 },
+ { 0x146B, 45962 },
+ { 0x146D, 45965 },
+ { 0x146F, 45968 },
+ { 0x1484, 45971 },
+ { 0x14DA, 45974 },
+ { 0x14D3, 45977 },
+ { 0x15A6, 45980 },
+ { 0x14D5, 45983 },
+ { 0x14D7, 45986 },
+ { 0x14AA, 45989 },
+ { 0x14A3, 45992 },
+ { 0x14BD, 45995 },
+ { 0x14A5, 45998 },
+ { 0x14A7, 46001 },
+ { 0x14C7, 46004 },
+ { 0x14C0, 46007 },
+ { 0x1595, 46010 },
+ { 0x14D2, 46013 },
+ { 0x14C2, 46016 },
+ { 0x14C4, 46019 },
+ { 0x142D, 46022 },
+ { 0x1406, 46025 },
+ { 0x1438, 46028 },
+ { 0x142F, 46031 },
+ { 0x1431, 46034 },
+ { 0x1433, 46037 },
+ { 0x1583, 46040 },
+ { 0x157F, 46043 },
+ { 0x1581, 46046 },
+ { 0x154B, 46049 },
+ { 0x1542, 46052 },
+ { 0x1546, 46055 },
+ { 0x1548, 46058 },
+ { 0x14F4, 46061 },
+ { 0x14ED, 46064 },
+ { 0x1525, 46067 },
+ { 0x14EF, 46070 },
+ { 0x14F1, 46073 },
+ { 0x1507, 46076 },
+ { 0x1455, 46079 },
+ { 0x144C, 46082 },
+ { 0x156A, 46085 },
+ { 0x144E, 46088 },
+ { 0x1450, 46091 },
+ { 0x1417, 46094 },
+ { 0x140C, 46097 },
+ { 0x140E, 46100 },
+ { 0x1412, 46103 },
+ { 0x152D, 46106 },
+ { 0x1526, 46109 },
+ { 0x1528, 46112 },
+ { 0x152A, 46115 },
+ { 0x1402, 46118 },
+ { 0x1491, 46121 },
+ { 0x166D, 46124 },
+ { 0x148C, 46128 },
+ { 0x148E, 46131 },
+ { 0x149C, 46134 },
+ { 0x1492, 46137 },
+ { 0x1494, 46140 },
+ { 0x1498, 46143 },
+ { 0x155A, 46146 },
+ { 0x1556, 46149 },
+ { 0x1558, 46152 },
+ { 0x1473, 46155 },
+ { 0x146E, 46158 },
+ { 0x1470, 46161 },
+ { 0x147E, 46164 },
+ { 0x1474, 46167 },
+ { 0x1476, 46170 },
+ { 0x147A, 46173 },
+ { 0x14DB, 46176 },
+ { 0x15A4, 46179 },
+ { 0x15A0, 46182 },
+ { 0x15A2, 46185 },
+ { 0x14D6, 46188 },
+ { 0x14D8, 46191 },
+ { 0x14E6, 46194 },
+ { 0x14DC, 46197 },
+ { 0x14DE, 46200 },
+ { 0x14E2, 46203 },
+ { 0x14AB, 46206 },
+ { 0x14A6, 46209 },
+ { 0x14A8, 46212 },
+ { 0x14B6, 46215 },
+ { 0x14AC, 46218 },
+ { 0x14AE, 46221 },
+ { 0x14B2, 46224 },
+ { 0x14C8, 46227 },
+ { 0x1593, 46230 },
+ { 0x158F, 46233 },
+ { 0x1591, 46236 },
+ { 0x14C3, 46239 },
+ { 0x1596, 46242 },
+ { 0x14C5, 46245 },
+ { 0x14CB, 46248 },
+ { 0x14C9, 46251 },
+ { 0x1439, 46254 },
+ { 0x1432, 46257 },
+ { 0x1434, 46260 },
+ { 0x1444, 46263 },
+ { 0x143A, 46266 },
+ { 0x143C, 46269 },
+ { 0x1440, 46272 },
+ { 0x1584, 46275 },
+ { 0x166F, 46278 },
+ { 0x1580, 46281 },
+ { 0x1582, 46284 },
+ { 0x154C, 46287 },
+ { 0x1547, 46290 },
+ { 0x1549, 46293 },
+ { 0x14F5, 46296 },
+ { 0x1515, 46299 },
+ { 0x1510, 46302 },
+ { 0x1511, 46305 },
+ { 0x1513, 46308 },
+ { 0x14F0, 46311 },
+ { 0x14F2, 46314 },
+ { 0x1500, 46317 },
+ { 0x14F6, 46320 },
+ { 0x14F8, 46323 },
+ { 0x14FC, 46326 },
+ { 0x1456, 46329 },
+ { 0x1566, 46332 },
+ { 0x155E, 46335 },
+ { 0x1560, 46338 },
+ { 0x1564, 46341 },
+ { 0x144F, 46344 },
+ { 0x1451, 46347 },
+ { 0x146A, 46350 },
+ { 0x1467, 46353 },
+ { 0x156F, 46356 },
+ { 0x1468, 46359 },
+ { 0x1469, 46362 },
+ { 0x1461, 46365 },
+ { 0x1457, 46368 },
+ { 0x1459, 46371 },
+ { 0x145D, 46374 },
+ { 0x1573, 46377 },
+ { 0x1570, 46380 },
+ { 0x1571, 46383 },
+ { 0x1572, 46386 },
+ { 0x1419, 46389 },
+ { 0x1410, 46392 },
+ { 0x1414, 46395 },
+ { 0x152E, 46398 },
+ { 0x1529, 46401 },
+ { 0x152B, 46404 },
+ { 0x1539, 46407 },
+ { 0x152F, 46410 },
+ { 0x1531, 46413 },
+ { 0x1535, 46416 },
+ { 0x148A, 46419 },
+ { 0x149E, 46422 },
+ { 0x1496, 46425 },
+ { 0x149A, 46428 },
+ { 0x1554, 46431 },
+ { 0x166E, 46434 },
+ { 0x155B, 46438 },
+ { 0x146C, 46441 },
+ { 0x1480, 46444 },
+ { 0x1478, 46447 },
+ { 0x147C, 46450 },
+ { 0x14D4, 46453 },
+ { 0x15A5, 46456 },
+ { 0x15A1, 46459 },
+ { 0x15A3, 46462 },
+ { 0x14E8, 46465 },
+ { 0x14E0, 46468 },
+ { 0x14E4, 46471 },
+ { 0x14A4, 46474 },
+ { 0x14B8, 46477 },
+ { 0x14B0, 46480 },
+ { 0x14B4, 46483 },
+ { 0x14C1, 46486 },
+ { 0x1594, 46489 },
+ { 0x1670, 46492 },
+ { 0x1590, 46495 },
+ { 0x1592, 46498 },
+ { 0x1675, 46501 },
+ { 0x1671, 46504 },
+ { 0x1673, 46507 },
+ { 0x14CD, 46510 },
+ { 0x1430, 46513 },
+ { 0x1446, 46516 },
+ { 0x143E, 46519 },
+ { 0x1442, 46522 },
+ { 0x157E, 46525 },
+ { 0x1545, 46528 },
+ { 0x154E, 46531 },
+ { 0x14EE, 46534 },
+ { 0x1516, 46537 },
+ { 0x1512, 46540 },
+ { 0x1514, 46543 },
+ { 0x1521, 46546 },
+ { 0x1517, 46549 },
+ { 0x1519, 46552 },
+ { 0x151D, 46555 },
+ { 0x1502, 46558 },
+ { 0x14FA, 46561 },
+ { 0x14FE, 46564 },
+ { 0x144D, 46567 },
+ { 0x1567, 46570 },
+ { 0x1562, 46573 },
+ { 0x1565, 46576 },
+ { 0x1589, 46579 },
+ { 0x1586, 46582 },
+ { 0x1587, 46585 },
+ { 0x1588, 46588 },
+ { 0x156E, 46591 },
+ { 0x156B, 46594 },
+ { 0x156C, 46597 },
+ { 0x156D, 46600 },
+ { 0x1463, 46603 },
+ { 0x145B, 46606 },
+ { 0x145F, 46609 },
+ { 0x1527, 46612 },
+ { 0x153B, 46615 },
+ { 0x1533, 46618 },
+ { 0x1537, 46621 },
+ { 0x1422, 46624 },
+ { 0x142A, 46630 },
+ { 0x1429, 46635 },
+ { 0x1424, 46639 },
+ { 0x141F, 46643 },
+ { 0x1420, 46647 },
+ { 0x1423, 46651 },
+ { 0x1428, 46657 },
+ { 0x1421, 46663 },
+ { 0x1425, 46669 },
+ { 0x1426, 46674 },
+ { 0x1427, 46681 },
+ { 0x158E, 46686 },
+ { 0x1676, 46689 },
+ { 0x1672, 46692 },
+ { 0x1674, 46695 },
+ { 0x1523, 46698 },
+ { 0x151B, 46701 },
+ { 0x151F, 46704 },
+ { 0x1568, 46707 },
+ { 0x14EC, 46710 },
+ { 0x1552, 46714 },
+ { 0x155F, 46718 },
+ { 0x1561, 46722 },
+ { 0x1563, 46726 },
+ { 0x1543, 46730 },
+ { 0x14BF, 46734 },
+ { 0x15C3, 46738 },
+ { 0x15C0, 46742 },
+ { 0x15C1, 46746 },
+ { 0x15C2, 46750 },
+ { 0x161A, 46754 },
+ { 0x1615, 46758 },
+ { 0x14A2, 46762 },
+ { 0x1541, 46766 },
+ { 0x159A, 46770 },
+ { 0x1597, 46774 },
+ { 0x1598, 46778 },
+ { 0x1599, 46782 },
+ { 0x141D, 46786 },
+ { 0x1407, 46790 },
+ { 0x148F, 46794 },
+ { 0x1471, 46798 },
+ { 0x14D9, 46802 },
+ { 0x14A9, 46806 },
+ { 0x14C6, 46810 },
+ { 0x1435, 46814 },
+ { 0x14F3, 46818 },
+ { 0x1452, 46822 },
+ { 0x152C, 46826 },
+ { 0x1448, 46830 },
+ { 0x15AF, 46834 },
+ { 0x144B, 46838 },
+ { 0x1409, 46842 },
+ { 0x15EE, 46846 },
+ { 0x1646, 46850 },
+ { 0x1454, 46854 },
+ { 0x1408, 46858 },
+ { 0x15F4, 46862 },
+ { 0x15F1, 46866 },
+ { 0x15F3, 46870 },
+ { 0x15F0, 46874 },
+ { 0x15EF, 46878 },
+ { 0x1437, 46882 },
+ { 0x161B, 46886 },
+ { 0x1617, 46890 },
+ { 0x1619, 46894 },
+ { 0x1616, 46898 },
+ { 0x1614, 46902 },
+ { 0x1601, 46906 },
+ { 0x1627, 46910 },
+ { 0x1624, 46914 },
+ { 0x1626, 46918 },
+ { 0x1623, 46922 },
+ { 0x1622, 46926 },
+ { 0x160D, 46930 },
+ { 0x160A, 46934 },
+ { 0x160C, 46938 },
+ { 0x1609, 46942 },
+ { 0x1608, 46946 },
+ { 0x1607, 46950 },
+ { 0x1604, 46954 },
+ { 0x14D1, 46958 },
+ { 0x1606, 46962 },
+ { 0x1603, 46966 },
+ { 0x1602, 46970 },
+ { 0x15ED, 46974 },
+ { 0x15EA, 46978 },
+ { 0x15EC, 46982 },
+ { 0x15E9, 46986 },
+ { 0x15E8, 46990 },
+ { 0x15CF, 46994 },
+ { 0x15CC, 46998 },
+ { 0x15CE, 47002 },
+ { 0x15CB, 47006 },
+ { 0x15CA, 47010 },
+ { 0x1653, 47014 },
+ { 0x1650, 47018 },
+ { 0x165A, 47022 },
+ { 0x1652, 47026 },
+ { 0x164F, 47030 },
+ { 0x164E, 47034 },
+ { 0x15D5, 47038 },
+ { 0x15D2, 47042 },
+ { 0x15D4, 47046 },
+ { 0x15D1, 47050 },
+ { 0x15D0, 47054 },
+ { 0x1613, 47058 },
+ { 0x1610, 47062 },
+ { 0x1612, 47066 },
+ { 0x160F, 47070 },
+ { 0x160E, 47074 },
+ { 0x1645, 47078 },
+ { 0x1642, 47082 },
+ { 0x1644, 47086 },
+ { 0x1641, 47090 },
+ { 0x1640, 47094 },
+ { 0x1666, 47098 },
+ { 0x1663, 47102 },
+ { 0x1665, 47106 },
+ { 0x1662, 47110 },
+ { 0x1661, 47114 },
+ { 0x1453, 47118 },
+ { 0x162D, 47122 },
+ { 0x162A, 47126 },
+ { 0x162C, 47130 },
+ { 0x1629, 47134 },
+ { 0x1628, 47138 },
+ { 0x164D, 47142 },
+ { 0x164A, 47146 },
+ { 0x164C, 47150 },
+ { 0x1649, 47154 },
+ { 0x1648, 47158 },
+ { 0x15F2, 47162 },
+ { 0x15C9, 47166 },
+ { 0x15C6, 47170 },
+ { 0x15C8, 47174 },
+ { 0x15C5, 47178 },
+ { 0x15C4, 47182 },
+ { 0x1436, 47186 },
+ { 0x15DB, 47190 },
+ { 0x15D8, 47194 },
+ { 0x15DA, 47198 },
+ { 0x15D7, 47202 },
+ { 0x15D6, 47206 },
+ { 0x1618, 47210 },
+ { 0x1621, 47214 },
+ { 0x161E, 47218 },
+ { 0x1620, 47222 },
+ { 0x161D, 47226 },
+ { 0x161C, 47230 },
+ { 0x15FA, 47234 },
+ { 0x15F7, 47238 },
+ { 0x15F9, 47242 },
+ { 0x15F6, 47246 },
+ { 0x15F5, 47250 },
+ { 0x1600, 47254 },
+ { 0x15FD, 47258 },
+ { 0x15FF, 47262 },
+ { 0x15FC, 47266 },
+ { 0x15FB, 47270 },
+ { 0x1625, 47274 },
+ { 0x1633, 47278 },
+ { 0x1630, 47282 },
+ { 0x1632, 47286 },
+ { 0x162F, 47290 },
+ { 0x162E, 47294 },
+ { 0x160B, 47298 },
+ { 0x1605, 47302 },
+ { 0x15EB, 47306 },
+ { 0x15CD, 47310 },
+ { 0x1651, 47314 },
+ { 0x1659, 47318 },
+ { 0x1656, 47322 },
+ { 0x1658, 47326 },
+ { 0x1655, 47330 },
+ { 0x1654, 47334 },
+ { 0x15E1, 47338 },
+ { 0x15DE, 47342 },
+ { 0x15E0, 47346 },
+ { 0x15DD, 47350 },
+ { 0x15DC, 47354 },
+ { 0x163F, 47358 },
+ { 0x163C, 47362 },
+ { 0x163E, 47366 },
+ { 0x163B, 47370 },
+ { 0x163A, 47374 },
+ { 0x1660, 47378 },
+ { 0x165D, 47382 },
+ { 0x165F, 47386 },
+ { 0x165C, 47390 },
+ { 0x165B, 47394 },
+ { 0x15E7, 47398 },
+ { 0x15E4, 47402 },
+ { 0x15E6, 47406 },
+ { 0x15E3, 47410 },
+ { 0x15E2, 47414 },
+ { 0x15D3, 47418 },
+ { 0x1611, 47422 },
+ { 0x1643, 47426 },
+ { 0x1664, 47430 },
+ { 0x162B, 47434 },
+ { 0x164B, 47438 },
+ { 0x15C7, 47442 },
+ { 0x15D9, 47446 },
+ { 0x161F, 47450 },
+ { 0x15F8, 47454 },
+ { 0x15FE, 47458 },
+ { 0x1631, 47462 },
+ { 0x1657, 47466 },
+ { 0x15DF, 47470 },
+ { 0x163D, 47474 },
+ { 0x1639, 47478 },
+ { 0x1636, 47482 },
+ { 0x1638, 47486 },
+ { 0x1635, 47490 },
+ { 0x1634, 47494 },
+ { 0x165E, 47498 },
+ { 0x15E5, 47502 },
+ { 0x166C, 47506 },
+ { 0x1669, 47510 },
+ { 0x166B, 47514 },
+ { 0x1668, 47518 },
+ { 0x1667, 47522 },
+ { 0x1637, 47526 },
+ { 0x166A, 47530 },
+ { 0x1647, 47534 },
+ { 0x141E, 47539 },
+ { 0x150B, 47543 },
+ { 0x150A, 47547 },
+ { 0x141B, 47551 },
+ { 0x1416, 47555 },
+ { 0x14A0, 47559 },
+ { 0x1482, 47563 },
+ { 0x14BA, 47567 },
+ { 0x14CF, 47571 },
+ { 0x150F, 47575 },
+ { 0x150E, 47579 },
+ { 0x150C, 47583 },
+ { 0x150D, 47587 },
+ { 0x1504, 47591 },
+ { 0x1465, 47595 },
+ { 0x153D, 47599 },
+ { 0x157B, 47603 },
+ { 0x1579, 47607 },
+ { 0x1574, 47611 },
+ { 0x1575, 47615 },
+ { 0x1577, 47619 },
+ { 0x157A, 47623 },
+ { 0x1576, 47627 },
+ { 0x1578, 47631 },
+ { 0x157C, 47635 },
+ { 0x15AE, 47639 },
+ { 0x15AC, 47643 },
+ { 0x15A7, 47647 },
+ { 0x15A8, 47651 },
+ { 0x15AA, 47655 },
+ { 0x15AD, 47659 },
+ { 0x15A9, 47663 },
+ { 0x15AB, 47667 },
+ { 0x15B3, 47671 },
+ { 0x15B0, 47675 },
+ { 0x15B1, 47679 },
+ { 0x15B2, 47683 },
+ { 0x1508, 47687 },
+ { 0x15BF, 47691 },
+ { 0x15BC, 47695 },
+ { 0x15BD, 47699 },
+ { 0x15BE, 47703 },
+ { 0x15BB, 47707 },
+ { 0x15B8, 47711 },
+ { 0x15B9, 47715 },
+ { 0x15BA, 47719 },
+ { 0x15B7, 47723 },
+ { 0x15B4, 47727 },
+ { 0x15B5, 47731 },
+ { 0x15B6, 47735 },
+ { 0x14EB, 47739 },
+ { 0x14BC, 47743 },
+ { 0x144A, 47747 },
+ { 0x1551, 47751 },
+ { 0x1540, 47755 },
+ { 0x154D, 47759 },
+ { 0x1544, 47763 },
+ { 0x154A, 47767 },
+ { 0x158D, 47771 },
+ { 0x158A, 47775 },
+ { 0x158B, 47779 },
+ { 0x158C, 47783 },
+ { 0x1418, 47787 },
+ { 0x140D, 47791 },
+ { 0x140F, 47795 },
+ { 0x1413, 47799 },
+ { 0x149D, 47803 },
+ { 0x1493, 47807 },
+ { 0x1495, 47811 },
+ { 0x1499, 47815 },
+ { 0x147F, 47819 },
+ { 0x1475, 47823 },
+ { 0x1477, 47827 },
+ { 0x147B, 47831 },
+ { 0x14E7, 47835 },
+ { 0x14DD, 47839 },
+ { 0x14DF, 47843 },
+ { 0x14E3, 47847 },
+ { 0x14B7, 47851 },
+ { 0x14AD, 47855 },
+ { 0x14AF, 47859 },
+ { 0x14B3, 47863 },
+ { 0x14CC, 47867 },
+ { 0x14CA, 47871 },
+ { 0x1445, 47875 },
+ { 0x143B, 47879 },
+ { 0x143D, 47883 },
+ { 0x1441, 47887 },
+ { 0x1501, 47891 },
+ { 0x14F7, 47895 },
+ { 0x14F9, 47899 },
+ { 0x14FD, 47903 },
+ { 0x1462, 47907 },
+ { 0x1458, 47911 },
+ { 0x145A, 47915 },
+ { 0x145E, 47919 },
+ { 0x141A, 47923 },
+ { 0x1411, 47927 },
+ { 0x1415, 47931 },
+ { 0x153A, 47935 },
+ { 0x1530, 47939 },
+ { 0x1532, 47943 },
+ { 0x1536, 47947 },
+ { 0x149F, 47951 },
+ { 0x1497, 47955 },
+ { 0x149B, 47959 },
+ { 0x155C, 47963 },
+ { 0x1481, 47967 },
+ { 0x1479, 47971 },
+ { 0x147D, 47975 },
+ { 0x14E9, 47979 },
+ { 0x14E1, 47983 },
+ { 0x14E5, 47987 },
+ { 0x14B9, 47991 },
+ { 0x14B1, 47995 },
+ { 0x14B5, 47999 },
+ { 0x14CE, 48003 },
+ { 0x1447, 48007 },
+ { 0x143F, 48011 },
+ { 0x1443, 48015 },
+ { 0x154F, 48019 },
+ { 0x1522, 48023 },
+ { 0x1518, 48027 },
+ { 0x151A, 48031 },
+ { 0x151E, 48035 },
+ { 0x1503, 48039 },
+ { 0x14FB, 48043 },
+ { 0x14FF, 48047 },
+ { 0x1464, 48051 },
+ { 0x145C, 48055 },
+ { 0x1460, 48059 },
+ { 0x153C, 48063 },
+ { 0x1534, 48067 },
+ { 0x1538, 48071 },
+ { 0x1524, 48075 },
+ { 0x151C, 48079 },
+ { 0x1520, 48083 },
+ { 0x1569, 48087 },
+ { 0x14BE, 48091 },
+ { 0x1506, 48095 },
+ { 0x153F, 48099 },
+ { 0x1509, 48103 },
+ { 0x159F, 48107 },
+ { 0x159E, 48111 },
+ { 0x159B, 48115 },
+ { 0x159C, 48119 },
+ { 0x159D, 48123 },
+ { 0x1488, 48127 },
+ { 0x1485, 48131 },
+ { 0x1486, 48135 },
+ { 0x1487, 48139 },
+ { 0x13A0, 48143 },
+ { 0x13A1, 48146 },
+ { 0x13A2, 48149 },
+ { 0x13A3, 48152 },
+ { 0x13CD, 48155 },
+ { 0x13A4, 48158 },
+ { 0x13A5, 48161 },
+ { 0x13D3, 48164 },
+ { 0x13D5, 48167 },
+ { 0x13D7, 48170 },
+ { 0x13D9, 48173 },
+ { 0x13DA, 48176 },
+ { 0x13DB, 48179 },
+ { 0x13A6, 48182 },
+ { 0x13A8, 48185 },
+ { 0x13A9, 48188 },
+ { 0x13AA, 48191 },
+ { 0x13AB, 48194 },
+ { 0x13AC, 48197 },
+ { 0x13AD, 48200 },
+ { 0x13AE, 48203 },
+ { 0x13AF, 48206 },
+ { 0x13B0, 48209 },
+ { 0x13B1, 48212 },
+ { 0x13B2, 48215 },
+ { 0x13A7, 48218 },
+ { 0x13B3, 48221 },
+ { 0x13B4, 48224 },
+ { 0x13B5, 48227 },
+ { 0x13B6, 48230 },
+ { 0x13B7, 48233 },
+ { 0x13B8, 48236 },
+ { 0x13B9, 48239 },
+ { 0x13BA, 48242 },
+ { 0x13BB, 48245 },
+ { 0x13BC, 48248 },
+ { 0x13BD, 48251 },
+ { 0x13BE, 48254 },
+ { 0x13C1, 48257 },
+ { 0x13C2, 48260 },
+ { 0x13C3, 48263 },
+ { 0x13C4, 48266 },
+ { 0x13C5, 48269 },
+ { 0x13CC, 48272 },
+ { 0x13CE, 48275 },
+ { 0x13CF, 48278 },
+ { 0x13D0, 48281 },
+ { 0x13D1, 48284 },
+ { 0x13D2, 48287 },
+ { 0x13D4, 48290 },
+ { 0x13D6, 48293 },
+ { 0x13D8, 48296 },
+ { 0x13E9, 48299 },
+ { 0x13EA, 48302 },
+ { 0x13EB, 48305 },
+ { 0x13EC, 48308 },
+ { 0x13ED, 48311 },
+ { 0x13EE, 48314 },
+ { 0x13EF, 48317 },
+ { 0x13F0, 48320 },
+ { 0x13F1, 48323 },
+ { 0x13F2, 48326 },
+ { 0x13F3, 48329 },
+ { 0x13F4, 48332 },
+ { 0x13DC, 48335 },
+ { 0x13BF, 48338 },
+ { 0x13C0, 48341 },
+ { 0x13C6, 48344 },
+ { 0x13C7, 48347 },
+ { 0x13C8, 48350 },
+ { 0x13C9, 48353 },
+ { 0x13CA, 48356 },
+ { 0x13CB, 48359 },
+ { 0x13DD, 48362 },
+ { 0x13DE, 48365 },
+ { 0x13DF, 48368 },
+ { 0x13E0, 48371 },
+ { 0x13E1, 48374 },
+ { 0x13E2, 48377 },
+ { 0x13E3, 48380 },
+ { 0x13E4, 48383 },
+ { 0x13E5, 48386 },
+ { 0x13E6, 48389 },
+ { 0x13E7, 48392 },
+ { 0x13E8, 48395 },
+ { 0x220B, 48398 },
+ { 0x22B3, 48401 },
+ { 0x22B5, 48405 },
+ { 0x22FA, 48412 },
+ { 0x22FD, 48417 },
+ { 0x22FB, 48420 },
+ { 0x9369, 48429 },
+ { 0x936E, 48434 },
+ { 0x936A, 48439 },
+ { 0x936D, 48444 },
+ { 0x936C, 48449 },
+ { 0x9371, 48454 },
+ { 0x9370, 48459 },
+ { 0x936F, 48464 },
+ { 0x936B, 48469 },
+ { 0x9360, 48474 },
+ { 0x9365, 48479 },
+ { 0x9361, 48484 },
+ { 0x9364, 48489 },
+ { 0x9363, 48494 },
+ { 0x9368, 48499 },
+ { 0x9367, 48504 },
+ { 0x9366, 48509 },
+ { 0x9362, 48514 },
+ { 0x20A2, 48519 },
+ { 0x00A4, 48521 },
+ { 0x0430, 48523 },
+ { 0x04D1, 48527 },
+ { 0x04D3, 48533 },
+ { 0x044D, 48539 },
+ { 0x04ED, 48543 },
+ { 0x0438, 48549 },
+ { 0x045D, 48553 },
+ { 0x04E3, 48559 },
+ { 0x04E5, 48565 },
+ { 0x043E, 48571 },
+ { 0x04E7, 48575 },
+ { 0x0443, 48581 },
+ { 0x04F3, 48585 },
+ { 0x04EF, 48592 },
+ { 0x04F1, 48598 },
+ { 0x0431, 48604 },
+ { 0x0434, 48608 },
+ { 0x0444, 48612 },
+ { 0x043B, 48616 },
+ { 0x0513, 48620 },
+ { 0x04C6, 48626 },
+ { 0x0521, 48632 },
+ { 0x043C, 48639 },
+ { 0x04CE, 48643 },
+ { 0x043D, 48649 },
+ { 0x04C8, 48653 },
+ { 0x04CA, 48659 },
+ { 0x0523, 48665 },
+ { 0x04A3, 48672 },
+ { 0x0440, 48678 },
+ { 0x048F, 48682 },
+ { 0x0441, 48688 },
+ { 0x04AB, 48692 },
+ { 0x0445, 48698 },
+ { 0x04FD, 48702 },
+ { 0x04FF, 48708 },
+ { 0x04B3, 48714 },
+ { 0x0435, 48720 },
+ { 0x04D7, 48724 },
+ { 0x0450, 48730 },
+ { 0x0451, 48736 },
+ { 0x0458, 48740 },
+ { 0x043A, 48744 },
+ { 0x04C4, 48748 },
+ { 0x049F, 48754 },
+ { 0x049D, 48760 },
+ { 0x049B, 48767 },
+ { 0x047F, 48773 },
+ { 0x043F, 48777 },
+ { 0x04A7, 48781 },
+ { 0x051B, 48788 },
+ { 0x0442, 48792 },
+ { 0x568B, 48796 },
+ { 0x04AD, 48803 },
+ { 0x0479, 48809 },
+ { 0x0432, 48813 },
+ { 0x051D, 48817 },
+ { 0x044F, 48821 },
+ { 0x0457, 48825 },
+ { 0x565F, 48829 },
+ { 0x044E, 48833 },
+ { 0x0437, 48837 },
+ { 0x0499, 48841 },
+ { 0x04DF, 48847 },
+ { 0x046B, 48853 },
+ { 0x0447, 48858 },
+ { 0x04B9, 48862 },
+ { 0x04B7, 48869 },
+ { 0x04F5, 48875 },
+ { 0x0452, 48881 },
+ { 0x5681, 48885 },
+ { 0x0455, 48889 },
+ { 0x0433, 48893 },
+ { 0x0495, 48897 },
+ { 0x0493, 48904 },
+ { 0x04FB, 48910 },
+ { 0x0491, 48918 },
+ { 0x04F7, 48924 },
+ { 0x0453, 48930 },
+ { 0x5695, 48934 },
+ { 0x045C, 48938 },
+ { 0x046F, 48942 },
+ { 0x0515, 48946 },
+ { 0x0459, 48950 },
+ { 0x045A, 48954 },
+ { 0x0471, 48958 },
+ { 0x0517, 48962 },
+ { 0x0448, 48966 },
+ { 0x0446, 48970 },
+ { 0x568D, 48974 },
+ { 0x0519, 48978 },
+ { 0x0463, 48982 },
+ { 0x0436, 48986 },
+ { 0x04C2, 48990 },
+ { 0x0497, 48996 },
+ { 0x04DD, 49002 },
+ { 0x5687, 49008 },
+ { 0x045F, 49012 },
+ { 0x5683, 49016 },
+ { 0x5689, 49020 },
+ { 0x0473, 49024 },
+ { 0x044A, 49028 },
+ { 0x5647, 49033 },
+ { 0x0501, 49037 },
+ { 0x0503, 49042 },
+ { 0x0509, 49047 },
+ { 0x050B, 49052 },
+ { 0x050D, 49057 },
+ { 0x050F, 49062 },
+ { 0x0505, 49067 },
+ { 0x0507, 49072 },
+ { 0x04BB, 49077 },
+ { 0x5697, 49081 },
+ { 0x5663, 49085 },
+ { 0x5665, 49090 },
+ { 0x5667, 49095 },
+ { 0x044C, 49100 },
+ { 0x5693, 49105 },
+ { 0x045B, 49109 },
+ { 0x5691, 49113 },
+ { 0x568F, 49117 },
+ { 0x044B, 49121 },
+ { 0x5651, 49125 },
+ { 0x04F9, 49132 },
+ { 0x5685, 49138 },
+ { 0x051F, 49142 },
+ { 0x564D, 49147 },
+ { 0x5649, 49152 },
+ { 0x5643, 49156 },
+ { 0x0481, 49160 },
+ { 0x0461, 49164 },
+ { 0x047D, 49168 },
+ { 0x047B, 49174 },
+ { 0x04D9, 49179 },
+ { 0x04DB, 49183 },
+ { 0x0449, 49189 },
+ { 0x0439, 49193 },
+ { 0x048B, 49198 },
+ { 0x045E, 49205 },
+ { 0x04E9, 49210 },
+ { 0x04EB, 49215 },
+ { 0x5659, 49222 },
+ { 0x566D, 49228 },
+ { 0x0467, 49234 },
+ { 0x5641, 49239 },
+ { 0x04A1, 49243 },
+ { 0x565B, 49248 },
+ { 0x0475, 49253 },
+ { 0x0477, 49257 },
+ { 0x564F, 49265 },
+ { 0x5657, 49270 },
+ { 0x0465, 49275 },
+ { 0x046D, 49280 },
+ { 0x5653, 49286 },
+ { 0x565D, 49291 },
+ { 0x0469, 49298 },
+ { 0x04CF, 49304 },
+ { 0x5655, 49308 },
+ { 0x0511, 49313 },
+ { 0x5645, 49318 },
+ { 0x048D, 49323 },
+ { 0x04AF, 49328 },
+ { 0x04B1, 49333 },
+ { 0x04A9, 49340 },
+ { 0x04BD, 49345 },
+ { 0x04BF, 49350 },
+ { 0x04E1, 49357 },
+ { 0x566B, 49362 },
+ { 0x5669, 49367 },
+ { 0x564B, 49372 },
+ { 0x0454, 49377 },
+ { 0x04CC, 49382 },
+ { 0x0456, 49387 },
+ { 0x04D5, 49392 },
+ { 0x04A5, 49397 },
+ { 0x04B5, 49402 },
+ { 0x567E, 49407 },
+ { 0x1D2B, 49409 },
+ { 0x04C0, 49414 },
+ { 0x566E, 49417 },
+ { 0x0410, 49421 },
+ { 0x04D0, 49425 },
+ { 0x04D2, 49431 },
+ { 0x042D, 49437 },
+ { 0x04EC, 49441 },
+ { 0x0418, 49447 },
+ { 0x040D, 49451 },
+ { 0x04E2, 49457 },
+ { 0x04E4, 49463 },
+ { 0x041E, 49469 },
+ { 0x04E6, 49473 },
+ { 0x0423, 49479 },
+ { 0x04F2, 49483 },
+ { 0x04EE, 49490 },
+ { 0x04F0, 49496 },
+ { 0x0411, 49502 },
+ { 0x0414, 49506 },
+ { 0x0424, 49510 },
+ { 0x041B, 49514 },
+ { 0x0512, 49518 },
+ { 0x04C5, 49524 },
+ { 0x0520, 49530 },
+ { 0x041C, 49537 },
+ { 0x04CD, 49541 },
+ { 0x041D, 49547 },
+ { 0x04C7, 49551 },
+ { 0x04C9, 49557 },
+ { 0x0522, 49563 },
+ { 0x04A2, 49570 },
+ { 0x0420, 49576 },
+ { 0x048E, 49580 },
+ { 0x0421, 49586 },
+ { 0x04AA, 49590 },
+ { 0x0425, 49596 },
+ { 0x04FC, 49600 },
+ { 0x04FE, 49606 },
+ { 0x04B2, 49612 },
+ { 0x0415, 49618 },
+ { 0x04D6, 49622 },
+ { 0x0400, 49628 },
+ { 0x0401, 49634 },
+ { 0x0408, 49638 },
+ { 0x041A, 49642 },
+ { 0x04C3, 49646 },
+ { 0x049E, 49652 },
+ { 0x049C, 49658 },
+ { 0x049A, 49665 },
+ { 0x047E, 49671 },
+ { 0x041F, 49675 },
+ { 0x04A6, 49679 },
+ { 0x051A, 49686 },
+ { 0x0422, 49690 },
+ { 0x568A, 49694 },
+ { 0x04AC, 49701 },
+ { 0x0478, 49707 },
+ { 0x0412, 49711 },
+ { 0x051C, 49715 },
+ { 0x042F, 49719 },
+ { 0x0407, 49723 },
+ { 0x565E, 49727 },
+ { 0x042E, 49731 },
+ { 0x0417, 49735 },
+ { 0x0498, 49739 },
+ { 0x04DE, 49745 },
+ { 0x046A, 49751 },
+ { 0x0427, 49756 },
+ { 0x04B8, 49760 },
+ { 0x04B6, 49767 },
+ { 0x04F4, 49773 },
+ { 0x0402, 49779 },
+ { 0x5680, 49783 },
+ { 0x0405, 49787 },
+ { 0x0413, 49791 },
+ { 0x0494, 49795 },
+ { 0x0492, 49802 },
+ { 0x04FA, 49808 },
+ { 0x0490, 49816 },
+ { 0x04F6, 49822 },
+ { 0x0403, 49828 },
+ { 0x5694, 49832 },
+ { 0x040C, 49836 },
+ { 0x046E, 49840 },
+ { 0x0514, 49844 },
+ { 0x0409, 49848 },
+ { 0x040A, 49852 },
+ { 0x0470, 49856 },
+ { 0x0516, 49860 },
+ { 0x0428, 49864 },
+ { 0x0426, 49868 },
+ { 0x568C, 49872 },
+ { 0x0518, 49876 },
+ { 0x0462, 49880 },
+ { 0x0416, 49884 },
+ { 0x04C1, 49888 },
+ { 0x0496, 49894 },
+ { 0x04DC, 49900 },
+ { 0x5686, 49906 },
+ { 0x040F, 49910 },
+ { 0x5682, 49914 },
+ { 0x5688, 49918 },
+ { 0x0472, 49922 },
+ { 0x042A, 49926 },
+ { 0x5646, 49931 },
+ { 0x0500, 49935 },
+ { 0x0502, 49940 },
+ { 0x0508, 49945 },
+ { 0x050A, 49950 },
+ { 0x050C, 49955 },
+ { 0x050E, 49960 },
+ { 0x0504, 49965 },
+ { 0x0506, 49970 },
+ { 0x04BA, 49975 },
+ { 0x5696, 49979 },
+ { 0x5662, 49983 },
+ { 0x5664, 49988 },
+ { 0x5666, 49993 },
+ { 0x042C, 49998 },
+ { 0x5692, 50003 },
+ { 0x040B, 50007 },
+ { 0x5690, 50011 },
+ { 0x568E, 50015 },
+ { 0x042B, 50019 },
+ { 0x5650, 50023 },
+ { 0x04F8, 50030 },
+ { 0x5684, 50036 },
+ { 0x051E, 50040 },
+ { 0x564C, 50045 },
+ { 0x5648, 50050 },
+ { 0x5642, 50054 },
+ { 0x0480, 50058 },
+ { 0x0460, 50062 },
+ { 0x047C, 50066 },
+ { 0x047A, 50072 },
+ { 0x04D8, 50077 },
+ { 0x04DA, 50081 },
+ { 0x0429, 50087 },
+ { 0x0419, 50091 },
+ { 0x048A, 50096 },
+ { 0x040E, 50103 },
+ { 0x04E8, 50108 },
+ { 0x04EA, 50113 },
+ { 0x5658, 50120 },
+ { 0x566C, 50126 },
+ { 0x0466, 50132 },
+ { 0x5640, 50137 },
+ { 0x04A0, 50141 },
+ { 0x565A, 50146 },
+ { 0x0474, 50151 },
+ { 0x0476, 50155 },
+ { 0x564E, 50163 },
+ { 0x5656, 50168 },
+ { 0x0464, 50173 },
+ { 0x046C, 50178 },
+ { 0x5652, 50184 },
+ { 0x565C, 50189 },
+ { 0x0468, 50196 },
+ { 0x5654, 50202 },
+ { 0x0510, 50207 },
+ { 0x5644, 50212 },
+ { 0x048C, 50217 },
+ { 0x04AE, 50222 },
+ { 0x04B0, 50227 },
+ { 0x04A8, 50234 },
+ { 0x04BC, 50239 },
+ { 0x04BE, 50244 },
+ { 0x04E0, 50251 },
+ { 0x566A, 50256 },
+ { 0x5668, 50261 },
+ { 0x564A, 50266 },
+ { 0x0404, 50271 },
+ { 0x04CB, 50276 },
+ { 0x0406, 50281 },
+ { 0x04D4, 50286 },
+ { 0x04A4, 50291 },
+ { 0x04B4, 50296 },
+ { 0x567F, 50301 },
+ { 0x0482, 50303 },
+ { 0x2300, 50306 },
+ { 0x00F7, 50308 },
+ { 0x2215, 50310 },
+ { 0x22C7, 50312 },
+ { 0x279B, 50314 },
+ { 0x2301, 50318 },
+ { 0x2383, 50320 },
+ { 0x2709, 50322 },
+ { 0x1362, 50323 },
+ { 0x1365, 50326 },
+ { 0x1363, 50328 },
+ { 0x1369, 50330 },
+ { 0x136E, 50333 },
+ { 0x136A, 50336 },
+ { 0x136D, 50339 },
+ { 0x136C, 50342 },
+ { 0x1371, 50345 },
+ { 0x1370, 50348 },
+ { 0x136F, 50351 },
+ { 0x136B, 50354 },
+ { 0x1399, 50357 },
+ { 0x1391, 50361 },
+ { 0x1394, 50365 },
+ { 0x1397, 50369 },
+ { 0x1395, 50373 },
+ { 0x1393, 50377 },
+ { 0x1390, 50382 },
+ { 0x1396, 50386 },
+ { 0x1392, 50390 },
+ { 0x1398, 50394 },
+ { 0x1372, 50398 },
+ { 0x137C, 50401 },
+ { 0x1376, 50405 },
+ { 0x1375, 50408 },
+ { 0x1377, 50411 },
+ { 0x1379, 50414 },
+ { 0x137A, 50417 },
+ { 0x1374, 50420 },
+ { 0x1373, 50423 },
+ { 0x137B, 50426 },
+ { 0x1378, 50429 },
+ { 0x1366, 50432 },
+ { 0x1360, 50435 },
+ { 0x1367, 50438 },
+ { 0x1260, 50441 },
+ { 0x1265, 50444 },
+ { 0x1262, 50447 },
+ { 0x1266, 50450 },
+ { 0x1261, 50453 },
+ { 0x1278, 50456 },
+ { 0x127D, 50459 },
+ { 0x127A, 50462 },
+ { 0x127E, 50465 },
+ { 0x1279, 50468 },
+ { 0x12F0, 50471 },
+ { 0x12F5, 50474 },
+ { 0x12F2, 50477 },
+ { 0x12F6, 50480 },
+ { 0x12F1, 50483 },
+ { 0x1348, 50486 },
+ { 0x134D, 50489 },
+ { 0x134A, 50492 },
+ { 0x134E, 50495 },
+ { 0x1349, 50498 },
+ { 0x1308, 50501 },
+ { 0x130D, 50504 },
+ { 0x130A, 50507 },
+ { 0x130E, 50510 },
+ { 0x1309, 50513 },
+ { 0x1200, 50516 },
+ { 0x1205, 50519 },
+ { 0x1202, 50522 },
+ { 0x1206, 50525 },
+ { 0x1201, 50528 },
+ { 0x1300, 50531 },
+ { 0x1305, 50534 },
+ { 0x1302, 50537 },
+ { 0x1306, 50540 },
+ { 0x1301, 50543 },
+ { 0x12A8, 50546 },
+ { 0x12AD, 50549 },
+ { 0x12AA, 50552 },
+ { 0x12AE, 50555 },
+ { 0x12A9, 50558 },
+ { 0x1208, 50561 },
+ { 0x120D, 50564 },
+ { 0x120A, 50567 },
+ { 0x120E, 50570 },
+ { 0x1209, 50573 },
+ { 0x1218, 50576 },
+ { 0x121D, 50579 },
+ { 0x121A, 50582 },
+ { 0x121E, 50585 },
+ { 0x1219, 50588 },
+ { 0x1290, 50591 },
+ { 0x1295, 50594 },
+ { 0x1292, 50597 },
+ { 0x1296, 50600 },
+ { 0x1291, 50603 },
+ { 0x1350, 50606 },
+ { 0x1355, 50609 },
+ { 0x1352, 50612 },
+ { 0x1356, 50615 },
+ { 0x1351, 50618 },
+ { 0x1240, 50621 },
+ { 0x1245, 50624 },
+ { 0x1242, 50627 },
+ { 0x1246, 50630 },
+ { 0x1241, 50633 },
+ { 0x1228, 50636 },
+ { 0x122D, 50639 },
+ { 0x122A, 50642 },
+ { 0x122E, 50645 },
+ { 0x1229, 50648 },
+ { 0x1230, 50651 },
+ { 0x1235, 50654 },
+ { 0x1232, 50657 },
+ { 0x1236, 50660 },
+ { 0x1231, 50663 },
+ { 0x1270, 50666 },
+ { 0x1275, 50669 },
+ { 0x1272, 50672 },
+ { 0x1276, 50675 },
+ { 0x1271, 50678 },
+ { 0x1268, 50681 },
+ { 0x126D, 50684 },
+ { 0x126A, 50687 },
+ { 0x126E, 50690 },
+ { 0x1269, 50693 },
+ { 0x12C8, 50696 },
+ { 0x12CD, 50699 },
+ { 0x12CA, 50702 },
+ { 0x12CE, 50705 },
+ { 0x12C9, 50708 },
+ { 0x1280, 50711 },
+ { 0x1285, 50714 },
+ { 0x1282, 50717 },
+ { 0x1286, 50720 },
+ { 0x1281, 50723 },
+ { 0x12E8, 50726 },
+ { 0x12ED, 50729 },
+ { 0x12EA, 50732 },
+ { 0x12EE, 50735 },
+ { 0x12E9, 50738 },
+ { 0x12D8, 50741 },
+ { 0x12DD, 50744 },
+ { 0x12DA, 50747 },
+ { 0x12DE, 50750 },
+ { 0x12D9, 50753 },
+ { 0x1263, 50756 },
+ { 0x1264, 50759 },
+ { 0x2D85, 50762 },
+ { 0x1267, 50765 },
+ { 0x1387, 50768 },
+ { 0x1385, 50771 },
+ { 0x127B, 50774 },
+ { 0x2DA8, 50777 },
+ { 0x2DAD, 50780 },
+ { 0x2DAA, 50783 },
+ { 0x2DAE, 50786 },
+ { 0x2DA9, 50789 },
+ { 0x127C, 50792 },
+ { 0x1328, 50795 },
+ { 0x132D, 50798 },
+ { 0x132A, 50801 },
+ { 0x132E, 50804 },
+ { 0x1329, 50807 },
+ { 0x2D87, 50810 },
+ { 0x127F, 50813 },
+ { 0x12F3, 50816 },
+ { 0x12F8, 50819 },
+ { 0x12FD, 50822 },
+ { 0x12FA, 50825 },
+ { 0x12FE, 50828 },
+ { 0x12F9, 50831 },
+ { 0x12F4, 50834 },
+ { 0x2D8C, 50837 },
+ { 0x12F7, 50840 },
+ { 0x134B, 50843 },
+ { 0x134C, 50846 },
+ { 0x134F, 50849 },
+ { 0x138B, 50852 },
+ { 0x1389, 50855 },
+ { 0x135A, 50858 },
+ { 0x130B, 50861 },
+ { 0x130C, 50864 },
+ { 0x1318, 50867 },
+ { 0x131D, 50870 },
+ { 0x131A, 50873 },
+ { 0x131E, 50876 },
+ { 0x1319, 50879 },
+ { 0x130F, 50882 },
+ { 0x1310, 50885 },
+ { 0x1315, 50888 },
+ { 0x1312, 50891 },
+ { 0x2DD8, 50894 },
+ { 0x2DDD, 50897 },
+ { 0x2DDA, 50900 },
+ { 0x2DDE, 50903 },
+ { 0x2DD9, 50906 },
+ { 0x1203, 50909 },
+ { 0x1204, 50912 },
+ { 0x1210, 50915 },
+ { 0x1215, 50918 },
+ { 0x1212, 50921 },
+ { 0x1216, 50924 },
+ { 0x1211, 50927 },
+ { 0x1207, 50930 },
+ { 0x1303, 50933 },
+ { 0x1304, 50936 },
+ { 0x2D8E, 50939 },
+ { 0x1307, 50942 },
+ { 0x12AB, 50945 },
+ { 0x12AC, 50948 },
+ { 0x12AF, 50951 },
+ { 0x12B0, 50954 },
+ { 0x12B5, 50957 },
+ { 0x12B2, 50960 },
+ { 0x12B8, 50963 },
+ { 0x12BD, 50966 },
+ { 0x12BA, 50969 },
+ { 0x12BE, 50972 },
+ { 0x12B9, 50975 },
+ { 0x2DC8, 50978 },
+ { 0x2DCD, 50981 },
+ { 0x2DCA, 50984 },
+ { 0x2DCE, 50987 },
+ { 0x2DC9, 50990 },
+ { 0x120B, 50993 },
+ { 0x120C, 50996 },
+ { 0x2D80, 50999 },
+ { 0x120F, 51002 },
+ { 0x121B, 51005 },
+ { 0x121C, 51008 },
+ { 0x2D81, 51011 },
+ { 0x121F, 51014 },
+ { 0x1383, 51017 },
+ { 0x1381, 51020 },
+ { 0x1359, 51023 },
+ { 0x1293, 51026 },
+ { 0x1294, 51029 },
+ { 0x2D88, 51032 },
+ { 0x1297, 51035 },
+ { 0x1298, 51038 },
+ { 0x129D, 51041 },
+ { 0x129A, 51044 },
+ { 0x129E, 51047 },
+ { 0x1299, 51050 },
+ { 0x1353, 51053 },
+ { 0x1354, 51056 },
+ { 0x1330, 51059 },
+ { 0x1335, 51062 },
+ { 0x1332, 51065 },
+ { 0x1336, 51068 },
+ { 0x1331, 51071 },
+ { 0x2D92, 51074 },
+ { 0x1357, 51077 },
+ { 0x138F, 51080 },
+ { 0x138D, 51083 },
+ { 0x1243, 51086 },
+ { 0x1244, 51089 },
+ { 0x1250, 51092 },
+ { 0x1255, 51095 },
+ { 0x1252, 51098 },
+ { 0x1256, 51101 },
+ { 0x1251, 51104 },
+ { 0x1247, 51107 },
+ { 0x1248, 51110 },
+ { 0x124D, 51113 },
+ { 0x124A, 51116 },
+ { 0x2DC0, 51119 },
+ { 0x2DC5, 51122 },
+ { 0x2DC2, 51125 },
+ { 0x2DC6, 51128 },
+ { 0x2DC1, 51131 },
+ { 0x122B, 51134 },
+ { 0x122C, 51137 },
+ { 0x2D82, 51140 },
+ { 0x122F, 51143 },
+ { 0x1358, 51146 },
+ { 0x1233, 51149 },
+ { 0x1234, 51152 },
+ { 0x1238, 51155 },
+ { 0x123D, 51158 },
+ { 0x123A, 51161 },
+ { 0x123E, 51164 },
+ { 0x1239, 51167 },
+ { 0x2D83, 51170 },
+ { 0x2DA0, 51173 },
+ { 0x2DA5, 51176 },
+ { 0x2DA2, 51179 },
+ { 0x2DA6, 51182 },
+ { 0x2DA1, 51185 },
+ { 0x1237, 51188 },
+ { 0x1220, 51191 },
+ { 0x1225, 51194 },
+ { 0x1222, 51197 },
+ { 0x1226, 51200 },
+ { 0x1221, 51203 },
+ { 0x1273, 51206 },
+ { 0x1274, 51209 },
+ { 0x1320, 51212 },
+ { 0x1325, 51215 },
+ { 0x1322, 51218 },
+ { 0x1326, 51221 },
+ { 0x1321, 51224 },
+ { 0x2D86, 51227 },
+ { 0x1338, 51230 },
+ { 0x133D, 51233 },
+ { 0x133A, 51236 },
+ { 0x133E, 51239 },
+ { 0x1339, 51242 },
+ { 0x1277, 51245 },
+ { 0x1340, 51248 },
+ { 0x1345, 51251 },
+ { 0x1342, 51254 },
+ { 0x1346, 51257 },
+ { 0x1341, 51260 },
+ { 0x126B, 51263 },
+ { 0x126C, 51266 },
+ { 0x126F, 51269 },
+ { 0x12CB, 51272 },
+ { 0x12CC, 51275 },
+ { 0x12CF, 51278 },
+ { 0x1283, 51281 },
+ { 0x1284, 51284 },
+ { 0x1287, 51287 },
+ { 0x1288, 51290 },
+ { 0x128D, 51293 },
+ { 0x128A, 51296 },
+ { 0x2DD0, 51299 },
+ { 0x2DD5, 51302 },
+ { 0x2DD2, 51305 },
+ { 0x2DD6, 51308 },
+ { 0x2DD1, 51311 },
+ { 0x12EB, 51314 },
+ { 0x12EC, 51317 },
+ { 0x12EF, 51320 },
+ { 0x12DB, 51323 },
+ { 0x12DC, 51326 },
+ { 0x12E0, 51329 },
+ { 0x12E5, 51332 },
+ { 0x12E2, 51335 },
+ { 0x12E6, 51338 },
+ { 0x12E1, 51341 },
+ { 0x2D8B, 51344 },
+ { 0x12DF, 51347 },
+ { 0x2DB0, 51350 },
+ { 0x2DB5, 51353 },
+ { 0x2DB2, 51356 },
+ { 0x2DB6, 51359 },
+ { 0x2DB1, 51362 },
+ { 0x1386, 51365 },
+ { 0x2DAB, 51368 },
+ { 0x2DAC, 51371 },
+ { 0x2DB8, 51374 },
+ { 0x2DBD, 51377 },
+ { 0x2DBA, 51380 },
+ { 0x2DBE, 51383 },
+ { 0x2DB9, 51386 },
+ { 0x132B, 51389 },
+ { 0x132C, 51392 },
+ { 0x2D90, 51395 },
+ { 0x132F, 51398 },
+ { 0x12FB, 51401 },
+ { 0x12FC, 51404 },
+ { 0x2D8D, 51407 },
+ { 0x12FF, 51410 },
+ { 0x138A, 51413 },
+ { 0x131B, 51416 },
+ { 0x131C, 51419 },
+ { 0x2D93, 51422 },
+ { 0x2D96, 51425 },
+ { 0x2D94, 51428 },
+ { 0x1313, 51431 },
+ { 0x1314, 51434 },
+ { 0x2DDB, 51437 },
+ { 0x2DDC, 51440 },
+ { 0x1213, 51443 },
+ { 0x1214, 51446 },
+ { 0x1217, 51449 },
+ { 0x12B3, 51452 },
+ { 0x12B4, 51455 },
+ { 0x12BB, 51458 },
+ { 0x12BC, 51461 },
+ { 0x12C0, 51464 },
+ { 0x12C5, 51467 },
+ { 0x12C2, 51470 },
+ { 0x2DCB, 51473 },
+ { 0x2DCC, 51476 },
+ { 0x1382, 51479 },
+ { 0x129B, 51482 },
+ { 0x129C, 51485 },
+ { 0x2D89, 51488 },
+ { 0x129F, 51491 },
+ { 0x1333, 51494 },
+ { 0x1334, 51497 },
+ { 0x2D91, 51500 },
+ { 0x1337, 51503 },
+ { 0x138E, 51506 },
+ { 0x1253, 51509 },
+ { 0x1254, 51512 },
+ { 0x1258, 51515 },
+ { 0x125D, 51518 },
+ { 0x125A, 51521 },
+ { 0x124B, 51524 },
+ { 0x124C, 51527 },
+ { 0x2DC3, 51530 },
+ { 0x2DC4, 51533 },
+ { 0x123B, 51536 },
+ { 0x123C, 51539 },
+ { 0x2D84, 51542 },
+ { 0x123F, 51545 },
+ { 0x2DA3, 51548 },
+ { 0x2DA4, 51551 },
+ { 0x1223, 51554 },
+ { 0x1224, 51557 },
+ { 0x1227, 51560 },
+ { 0x1323, 51563 },
+ { 0x1324, 51566 },
+ { 0x2D8F, 51569 },
+ { 0x1327, 51572 },
+ { 0x133B, 51575 },
+ { 0x133C, 51578 },
+ { 0x133F, 51581 },
+ { 0x1343, 51584 },
+ { 0x1344, 51587 },
+ { 0x1347, 51590 },
+ { 0x128B, 51593 },
+ { 0x128C, 51596 },
+ { 0x2DD3, 51599 },
+ { 0x2DD4, 51602 },
+ { 0x12E3, 51605 },
+ { 0x12E4, 51608 },
+ { 0x12E7, 51611 },
+ { 0x2DB3, 51614 },
+ { 0x2DB4, 51617 },
+ { 0x2DBB, 51620 },
+ { 0x2DBC, 51623 },
+ { 0x131F, 51626 },
+ { 0x2D95, 51629 },
+ { 0x12C3, 51632 },
+ { 0x12C4, 51635 },
+ { 0x125B, 51638 },
+ { 0x125C, 51641 },
+ { 0x12A0, 51644 },
+ { 0x12A5, 51648 },
+ { 0x12A2, 51652 },
+ { 0x12A6, 51656 },
+ { 0x12A1, 51660 },
+ { 0x12A3, 51664 },
+ { 0x12A4, 51668 },
+ { 0x2D8A, 51672 },
+ { 0x12A7, 51676 },
+ { 0x1384, 51680 },
+ { 0x1388, 51684 },
+ { 0x1380, 51688 },
+ { 0x138C, 51692 },
+ { 0x12D0, 51696 },
+ { 0x12D5, 51700 },
+ { 0x12D2, 51704 },
+ { 0x12D6, 51708 },
+ { 0x12D1, 51712 },
+ { 0x12D3, 51716 },
+ { 0x12D4, 51720 },
+ { 0x135F, 51724 },
+ { 0x1368, 51728 },
+ { 0x1364, 51731 },
+ { 0x1361, 51733 },
+ { 0x06F1, 51735 },
+ { 0x06F6, 51739 },
+ { 0x06F2, 51743 },
+ { 0x06F5, 51747 },
+ { 0x06F4, 51751 },
+ { 0x06F9, 51755 },
+ { 0x06F0, 51759 },
+ { 0x06F8, 51763 },
+ { 0x06F7, 51767 },
+ { 0x06F3, 51771 },
+ { 0x00AA, 51775 },
+ { 0x23E5, 51778 },
+ { 0x2044, 51779 },
+ { 0x215F, 51781 },
+ { 0x2061, 51784 },
+ { 0x2D00, 51786 },
+ { 0x2D04, 51790 },
+ { 0x2D21, 51794 },
+ { 0x2D08, 51798 },
+ { 0x2D0D, 51802 },
+ { 0x2D13, 51806 },
+ { 0x2D23, 51810 },
+ { 0x2D01, 51814 },
+ { 0x2D1A, 51818 },
+ { 0x2D1C, 51822 },
+ { 0x2D03, 51826 },
+ { 0x2D02, 51830 },
+ { 0x2D20, 51834 },
+ { 0x2D24, 51838 },
+ { 0x2D22, 51842 },
+ { 0x2D25, 51846 },
+ { 0x2D1B, 51850 },
+ { 0x2D09, 51854 },
+ { 0x2D0A, 51858 },
+ { 0x2D0B, 51862 },
+ { 0x2D0C, 51866 },
+ { 0x2D0E, 51870 },
+ { 0x2D17, 51874 },
+ { 0x2D10, 51878 },
+ { 0x2D11, 51882 },
+ { 0x2D07, 51886 },
+ { 0x2D12, 51890 },
+ { 0x2D05, 51894 },
+ { 0x2D1E, 51898 },
+ { 0x2D06, 51902 },
+ { 0x2D1D, 51906 },
+ { 0x2D19, 51910 },
+ { 0x2D16, 51914 },
+ { 0x2D1F, 51918 },
+ { 0x2D15, 51922 },
+ { 0x2D14, 51926 },
+ { 0x2D18, 51930 },
+ { 0x2D0F, 51934 },
+ { 0x10D0, 51938 },
+ { 0x10D4, 51941 },
+ { 0x10F6, 51944 },
+ { 0x10F1, 51947 },
+ { 0x10D8, 51950 },
+ { 0x10DD, 51953 },
+ { 0x10E3, 51956 },
+ { 0x10F3, 51959 },
+ { 0x10F7, 51962 },
+ { 0x10FA, 51965 },
+ { 0x10D1, 51968 },
+ { 0x10EA, 51971 },
+ { 0x10EC, 51974 },
+ { 0x10D3, 51977 },
+ { 0x10D2, 51980 },
+ { 0x10F0, 51983 },
+ { 0x10F4, 51986 },
+ { 0x10F2, 51989 },
+ { 0x10F5, 51992 },
+ { 0x10EB, 51995 },
+ { 0x10D9, 51998 },
+ { 0x10DA, 52001 },
+ { 0x10DB, 52004 },
+ { 0x10DC, 52007 },
+ { 0x10DE, 52010 },
+ { 0x10E7, 52013 },
+ { 0x10E0, 52016 },
+ { 0x10E1, 52019 },
+ { 0x10D7, 52022 },
+ { 0x10E2, 52025 },
+ { 0x10D5, 52028 },
+ { 0x10EE, 52031 },
+ { 0x10D6, 52034 },
+ { 0x10ED, 52037 },
+ { 0x10E9, 52040 },
+ { 0x10E6, 52043 },
+ { 0x10EF, 52046 },
+ { 0x10E5, 52049 },
+ { 0x10E4, 52052 },
+ { 0x10E8, 52055 },
+ { 0x10DF, 52058 },
+ { 0x10F8, 52061 },
+ { 0x10F9, 52064 },
+ { 0x10A0, 52068 },
+ { 0x10A4, 52072 },
+ { 0x10C1, 52076 },
+ { 0x10A8, 52080 },
+ { 0x10AD, 52084 },
+ { 0x10B3, 52088 },
+ { 0x10C3, 52092 },
+ { 0x10A1, 52096 },
+ { 0x10BA, 52100 },
+ { 0x10BC, 52104 },
+ { 0x10A3, 52108 },
+ { 0x10A2, 52112 },
+ { 0x10C0, 52116 },
+ { 0x10C4, 52120 },
+ { 0x10C2, 52124 },
+ { 0x10C5, 52128 },
+ { 0x10BB, 52132 },
+ { 0x10A9, 52136 },
+ { 0x10AA, 52140 },
+ { 0x10AB, 52144 },
+ { 0x10AC, 52148 },
+ { 0x10AE, 52152 },
+ { 0x10B7, 52156 },
+ { 0x10B0, 52160 },
+ { 0x10B1, 52164 },
+ { 0x10A7, 52168 },
+ { 0x10B2, 52172 },
+ { 0x10A5, 52176 },
+ { 0x10BE, 52180 },
+ { 0x10A6, 52184 },
+ { 0x10BD, 52188 },
+ { 0x10B9, 52192 },
+ { 0x10B6, 52196 },
+ { 0x10BF, 52200 },
+ { 0x10B5, 52204 },
+ { 0x10B4, 52208 },
+ { 0x10B8, 52212 },
+ { 0x10AF, 52216 },
+ { 0x10FB, 52220 },
+ { 0x0AD0, 52223 },
+ { 0x0ABC, 52225 },
+ { 0x0ACD, 52228 },
+ { 0x0A83, 52231 },
+ { 0x0A82, 52234 },
+ { 0x0ABD, 52237 },
+ { 0x0A81, 52240 },
+ { 0x0AE7, 52243 },
+ { 0x0AEC, 52246 },
+ { 0x0AE8, 52249 },
+ { 0x0AEB, 52252 },
+ { 0x0AEA, 52255 },
+ { 0x0AEF, 52258 },
+ { 0x0AE6, 52261 },
+ { 0x0AEE, 52264 },
+ { 0x0AED, 52267 },
+ { 0x0AE9, 52270 },
+ { 0x0AF1, 52273 },
+ { 0x0AC7, 52276 },
+ { 0x0ABF, 52280 },
+ { 0x0ACB, 52284 },
+ { 0x0AC1, 52288 },
+ { 0x0ABE, 52292 },
+ { 0x0AC8, 52296 },
+ { 0x0ACC, 52300 },
+ { 0x0AC0, 52304 },
+ { 0x0AC2, 52308 },
+ { 0x0AC5, 52312 },
+ { 0x0AC9, 52317 },
+ { 0x0AE2, 52322 },
+ { 0x0AC3, 52327 },
+ { 0x0AE3, 52332 },
+ { 0x0AC4, 52337 },
+ { 0x0A8D, 52342 },
+ { 0x0A91, 52346 },
+ { 0x0A85, 52350 },
+ { 0x0A8F, 52353 },
+ { 0x0A87, 52356 },
+ { 0x0A93, 52359 },
+ { 0x0A89, 52362 },
+ { 0x0A86, 52365 },
+ { 0x0A90, 52368 },
+ { 0x0A94, 52371 },
+ { 0x0AAC, 52374 },
+ { 0x0A9A, 52377 },
+ { 0x0AA6, 52380 },
+ { 0x0A97, 52383 },
+ { 0x0AB9, 52386 },
+ { 0x0A88, 52389 },
+ { 0x0A9C, 52392 },
+ { 0x0A95, 52395 },
+ { 0x0AB2, 52398 },
+ { 0x0AAE, 52401 },
+ { 0x0AA8, 52404 },
+ { 0x0AAA, 52407 },
+ { 0x0AB0, 52410 },
+ { 0x0AB8, 52413 },
+ { 0x0AA4, 52416 },
+ { 0x0A8A, 52419 },
+ { 0x0AB5, 52422 },
+ { 0x0AAF, 52425 },
+ { 0x0AAD, 52428 },
+ { 0x0A9B, 52431 },
+ { 0x0AA1, 52434 },
+ { 0x0AA7, 52437 },
+ { 0x0A98, 52440 },
+ { 0x0A9D, 52443 },
+ { 0x0A96, 52446 },
+ { 0x0AB3, 52449 },
+ { 0x0A99, 52452 },
+ { 0x0AA3, 52455 },
+ { 0x0A9E, 52458 },
+ { 0x0AAB, 52461 },
+ { 0x0AB6, 52464 },
+ { 0x0AB7, 52467 },
+ { 0x0AA5, 52470 },
+ { 0x0A9F, 52473 },
+ { 0x0AA2, 52476 },
+ { 0x0AA0, 52479 },
+ { 0x0A8C, 52482 },
+ { 0x0A8B, 52486 },
+ { 0x0AE1, 52490 },
+ { 0x0AE0, 52494 },
+ { 0x0A74, 52498 },
+ { 0x0A72, 52501 },
+ { 0x0A73, 52503 },
+ { 0x0A01, 52505 },
+ { 0x0A02, 52509 },
+ { 0x0A3C, 52512 },
+ { 0x0A51, 52515 },
+ { 0x0A4D, 52518 },
+ { 0x0A75, 52521 },
+ { 0x0A03, 52524 },
+ { 0x0A71, 52527 },
+ { 0x0A67, 52529 },
+ { 0x0A6C, 52532 },
+ { 0x0A68, 52535 },
+ { 0x0A6B, 52538 },
+ { 0x0A6A, 52541 },
+ { 0x0A6F, 52544 },
+ { 0x0A66, 52547 },
+ { 0x0A6E, 52550 },
+ { 0x0A6D, 52553 },
+ { 0x0A69, 52556 },
+ { 0x0A70, 52559 },
+ { 0x0A3F, 52561 },
+ { 0x0A41, 52565 },
+ { 0x0A3E, 52569 },
+ { 0x0A48, 52573 },
+ { 0x0A4C, 52577 },
+ { 0x0A47, 52581 },
+ { 0x0A40, 52585 },
+ { 0x0A4B, 52589 },
+ { 0x0A42, 52593 },
+ { 0x0A05, 52597 },
+ { 0x0A07, 52600 },
+ { 0x0A09, 52603 },
+ { 0x0A06, 52606 },
+ { 0x0A10, 52609 },
+ { 0x0A14, 52612 },
+ { 0x0A2C, 52615 },
+ { 0x0A1A, 52618 },
+ { 0x0A26, 52621 },
+ { 0x0A0F, 52624 },
+ { 0x0A5E, 52627 },
+ { 0x0A17, 52630 },
+ { 0x0A39, 52633 },
+ { 0x0A08, 52636 },
+ { 0x0A1C, 52639 },
+ { 0x0A15, 52642 },
+ { 0x0A32, 52645 },
+ { 0x0A2E, 52648 },
+ { 0x0A28, 52651 },
+ { 0x0A13, 52654 },
+ { 0x0A2A, 52657 },
+ { 0x0A30, 52660 },
+ { 0x0A38, 52663 },
+ { 0x0A24, 52666 },
+ { 0x0A0A, 52669 },
+ { 0x0A35, 52672 },
+ { 0x0A2F, 52675 },
+ { 0x0A5B, 52678 },
+ { 0x0A2D, 52681 },
+ { 0x0A1B, 52684 },
+ { 0x0A21, 52687 },
+ { 0x0A27, 52690 },
+ { 0x0A18, 52693 },
+ { 0x0A1D, 52696 },
+ { 0x0A16, 52699 },
+ { 0x0A33, 52702 },
+ { 0x0A19, 52705 },
+ { 0x0A23, 52708 },
+ { 0x0A1E, 52711 },
+ { 0x0A2B, 52714 },
+ { 0x0A5C, 52717 },
+ { 0x0A36, 52720 },
+ { 0x0A25, 52723 },
+ { 0x0A1F, 52726 },
+ { 0x0A22, 52729 },
+ { 0x0A5A, 52732 },
+ { 0x0A59, 52735 },
+ { 0x0A20, 52738 },
+ { 0x3021, 52741 },
+ { 0x3026, 52744 },
+ { 0x3038, 52747 },
+ { 0x3022, 52750 },
+ { 0x3025, 52753 },
+ { 0x3024, 52756 },
+ { 0x3029, 52759 },
+ { 0x3028, 52762 },
+ { 0x3027, 52765 },
+ { 0x3023, 52768 },
+ { 0x303A, 52771 },
+ { 0x3039, 52774 },
+ { 0x4DC6, 52777 },
+ { 0x4DEF, 52781 },
+ { 0x4DE4, 52785 },
+ { 0x4DF8, 52789 },
+ { 0x4DF9, 52794 },
+ { 0x4DDC, 52799 },
+ { 0x4DF3, 52804 },
+ { 0x4DF2, 52810 },
+ { 0x4DF1, 52815 },
+ { 0x4DDD, 52819 },
+ { 0x4DC0, 52824 },
+ { 0x4DF5, 52829 },
+ { 0x4DF7, 52834 },
+ { 0x4DC1, 52838 },
+ { 0x4DD1, 52843 },
+ { 0x4DFE, 52849 },
+ { 0x4DD5, 52853 },
+ { 0x4DE1, 52856 },
+ { 0x4DD9, 52860 },
+ { 0x4DCD, 52864 },
+ { 0x4DDB, 52868 },
+ { 0x4DFC, 52872 },
+ { 0x4DDA, 52876 },
+ { 0x4DCA, 52880 },
+ { 0x4DC8, 52883 },
+ { 0x4DFD, 52887 },
+ { 0x4DFF, 52891 },
+ { 0x4DD4, 52895 },
+ { 0x4DEB, 52899 },
+ { 0x4DD7, 52904 },
+ { 0x4DC7, 52907 },
+ { 0x4DCE, 52911 },
+ { 0x4DED, 52914 },
+ { 0x4DE0, 52918 },
+ { 0x4DC4, 52921 },
+ { 0x4DD2, 52924 },
+ { 0x4DC5, 52927 },
+ { 0x4DE8, 52930 },
+ { 0x4DDF, 52933 },
+ { 0x4DE9, 52936 },
+ { 0x4DE2, 52939 },
+ { 0x4DC9, 52942 },
+ { 0x4DC3, 52945 },
+ { 0x4DF6, 52949 },
+ { 0x4DE3, 52952 },
+ { 0x4DD0, 52958 },
+ { 0x4DEC, 52961 },
+ { 0x4DDE, 52965 },
+ { 0x4DD8, 52968 },
+ { 0x4DD6, 52971 },
+ { 0x4DC2, 52975 },
+ { 0x4DFA, 52981 },
+ { 0x4DCF, 52984 },
+ { 0x4DCC, 52987 },
+ { 0x4DFB, 52990 },
+ { 0x4DE5, 52993 },
+ { 0x4DEE, 52996 },
+ { 0x4DF0, 52999 },
+ { 0x4DCB, 53002 },
+ { 0x4DE7, 53005 },
+ { 0x4DF4, 53008 },
+ { 0x4DE6, 53011 },
+ { 0x4DEA, 53014 },
+ { 0x4DD3, 53017 },
+ { 0x3042, 53020 },
+ { 0x3048, 53023 },
+ { 0x3044, 53026 },
+ { 0x3093, 53029 },
+ { 0x304A, 53032 },
+ { 0x3046, 53035 },
+ { 0x3070, 53038 },
+ { 0x3079, 53041 },
+ { 0x3073, 53044 },
+ { 0x307C, 53047 },
+ { 0x3076, 53050 },
+ { 0x3060, 53053 },
+ { 0x3067, 53056 },
+ { 0x3062, 53059 },
+ { 0x3069, 53062 },
+ { 0x3065, 53065 },
+ { 0x304C, 53068 },
+ { 0x3052, 53071 },
+ { 0x304E, 53074 },
+ { 0x3054, 53077 },
+ { 0x3050, 53080 },
+ { 0x306F, 53083 },
+ { 0x3078, 53086 },
+ { 0x3072, 53089 },
+ { 0x307B, 53092 },
+ { 0x3075, 53095 },
+ { 0x304B, 53098 },
+ { 0x3051, 53101 },
+ { 0x304D, 53104 },
+ { 0x3053, 53107 },
+ { 0x304F, 53110 },
+ { 0x307E, 53113 },
+ { 0x3081, 53116 },
+ { 0x307F, 53119 },
+ { 0x3082, 53122 },
+ { 0x3080, 53125 },
+ { 0x306A, 53128 },
+ { 0x306D, 53131 },
+ { 0x306B, 53134 },
+ { 0x306E, 53137 },
+ { 0x306C, 53140 },
+ { 0x3071, 53143 },
+ { 0x307A, 53146 },
+ { 0x3074, 53149 },
+ { 0x307D, 53152 },
+ { 0x3077, 53155 },
+ { 0x3089, 53158 },
+ { 0x308C, 53161 },
+ { 0x308A, 53164 },
+ { 0x308D, 53167 },
+ { 0x308B, 53170 },
+ { 0x3055, 53173 },
+ { 0x305B, 53176 },
+ { 0x3057, 53179 },
+ { 0x305D, 53182 },
+ { 0x3059, 53185 },
+ { 0x305F, 53188 },
+ { 0x3066, 53191 },
+ { 0x3061, 53194 },
+ { 0x3068, 53197 },
+ { 0x3064, 53200 },
+ { 0x3094, 53203 },
+ { 0x308F, 53206 },
+ { 0x3091, 53209 },
+ { 0x3090, 53212 },
+ { 0x3092, 53215 },
+ { 0x3084, 53218 },
+ { 0x3088, 53221 },
+ { 0x3086, 53224 },
+ { 0x3056, 53227 },
+ { 0x305C, 53230 },
+ { 0x3058, 53233 },
+ { 0x305E, 53236 },
+ { 0x305A, 53239 },
+ { 0x3041, 53242 },
+ { 0x3047, 53246 },
+ { 0x3043, 53250 },
+ { 0x3049, 53254 },
+ { 0x3045, 53258 },
+ { 0x3095, 53262 },
+ { 0x3096, 53266 },
+ { 0x3063, 53270 },
+ { 0x308E, 53274 },
+ { 0x3083, 53278 },
+ { 0x3087, 53282 },
+ { 0x3085, 53286 },
+ { 0x309E, 53290 },
+ { 0x309F, 53294 },
+ { 0x309D, 53297 },
+ { 0x221E, 53300 },
+ { 0x29DE, 53301 },
+ { 0x222B, 53306 },
+ { 0x2A18, 53307 },
+ { 0x2A1A, 53311 },
+ { 0x2A0E, 53314 },
+ { 0x2A1B, 53318 },
+ { 0x2A1C, 53321 },
+ { 0x2A17, 53324 },
+ { 0x2A19, 53330 },
+ { 0x2A15, 53333 },
+ { 0x2A0F, 53338 },
+ { 0x23AE, 53342 },
+ { 0x2A3C, 53344 },
+ { 0x2127, 53346 },
+ { 0x223E, 53349 },
+ { 0x00BF, 53352 },
+ { 0x2054, 53355 },
+ { 0x00A1, 53357 },
+ { 0x2E18, 53360 },
+ { 0x3004, 53362 },
+ { 0x30A2, 53366 },
+ { 0x30A8, 53369 },
+ { 0x30A4, 53372 },
+ { 0x30F3, 53375 },
+ { 0x30AA, 53378 },
+ { 0x30A6, 53381 },
+ { 0x30D0, 53384 },
+ { 0x30D9, 53387 },
+ { 0x30D3, 53390 },
+ { 0x30DC, 53393 },
+ { 0x30D6, 53396 },
+ { 0x30C0, 53399 },
+ { 0x30C7, 53402 },
+ { 0x30C2, 53405 },
+ { 0x30C9, 53408 },
+ { 0x30C5, 53411 },
+ { 0x30AC, 53414 },
+ { 0x30B2, 53417 },
+ { 0x30AE, 53420 },
+ { 0x30B4, 53423 },
+ { 0x30B0, 53426 },
+ { 0x30CF, 53429 },
+ { 0x30D8, 53432 },
+ { 0x30D2, 53435 },
+ { 0x30DB, 53438 },
+ { 0x30D5, 53441 },
+ { 0x30AB, 53444 },
+ { 0x30B1, 53447 },
+ { 0x30AD, 53450 },
+ { 0x30B3, 53453 },
+ { 0x30AF, 53456 },
+ { 0x30DE, 53459 },
+ { 0x30E1, 53462 },
+ { 0x30DF, 53465 },
+ { 0x30E2, 53468 },
+ { 0x30E0, 53471 },
+ { 0x30CA, 53474 },
+ { 0x30CD, 53477 },
+ { 0x30CB, 53480 },
+ { 0x30CE, 53483 },
+ { 0x30CC, 53486 },
+ { 0x30D1, 53489 },
+ { 0x30DA, 53492 },
+ { 0x30D4, 53495 },
+ { 0x30DD, 53498 },
+ { 0x30D7, 53501 },
+ { 0x30E9, 53504 },
+ { 0x30EC, 53507 },
+ { 0x30EA, 53510 },
+ { 0x30ED, 53513 },
+ { 0x30EB, 53516 },
+ { 0x30B5, 53519 },
+ { 0x30BB, 53522 },
+ { 0x30B7, 53525 },
+ { 0x30BD, 53528 },
+ { 0x30B9, 53531 },
+ { 0x30BF, 53534 },
+ { 0x30C6, 53537 },
+ { 0x30C1, 53540 },
+ { 0x30C8, 53543 },
+ { 0x30C4, 53546 },
+ { 0x30F7, 53549 },
+ { 0x30F9, 53552 },
+ { 0x30F8, 53555 },
+ { 0x30FA, 53558 },
+ { 0x30F4, 53561 },
+ { 0x30EF, 53564 },
+ { 0x30F1, 53567 },
+ { 0x30F0, 53570 },
+ { 0x30F2, 53573 },
+ { 0x30E4, 53576 },
+ { 0x30E8, 53579 },
+ { 0x30E6, 53582 },
+ { 0x30B6, 53585 },
+ { 0x30BC, 53588 },
+ { 0x30B8, 53591 },
+ { 0x30BE, 53594 },
+ { 0x30BA, 53597 },
+ { 0x30A1, 53600 },
+ { 0x30A7, 53604 },
+ { 0x30A3, 53608 },
+ { 0x30A9, 53612 },
+ { 0x30A5, 53616 },
+ { 0x31F5, 53620 },
+ { 0x31F8, 53624 },
+ { 0x31F6, 53628 },
+ { 0x31F9, 53632 },
+ { 0x31F7, 53636 },
+ { 0x30F5, 53640 },
+ { 0x30F6, 53644 },
+ { 0x31F0, 53648 },
+ { 0x31FA, 53652 },
+ { 0x31F4, 53656 },
+ { 0x31FB, 53660 },
+ { 0x31FE, 53664 },
+ { 0x31FC, 53668 },
+ { 0x31FF, 53672 },
+ { 0x31FD, 53676 },
+ { 0x31F1, 53680 },
+ { 0x31F2, 53684 },
+ { 0x31F3, 53688 },
+ { 0x30C3, 53692 },
+ { 0x30EE, 53696 },
+ { 0x30E3, 53700 },
+ { 0x30E7, 53704 },
+ { 0x30E5, 53708 },
+ { 0x30FB, 53712 },
+ { 0x30FE, 53715 },
+ { 0x30FF, 53719 },
+ { 0x30FD, 53722 },
+ { 0x2328, 53725 },
+ { 0xC001, 53726 },
+ { 0x26AD, 53728 },
+ { 0x225E, 53730 },
+ { 0x2221, 53732 },
+ { 0x29A9, 53734 },
+ { 0x29A8, 53746 },
+ { 0x29AB, 53758 },
+ { 0x29AA, 53770 },
+ { 0x29AD, 53782 },
+ { 0x29AF, 53794 },
+ { 0x29AC, 53806 },
+ { 0x29AE, 53818 },
+ { 0x299B, 53830 },
+ { 0x299D, 53834 },
+ { 0x23D5, 53839 },
+ { 0x23D6, 53844 },
+ { 0x23D4, 53848 },
+ { 0x23D2, 53853 },
+ { 0x23D1, 53857 },
+ { 0x23D3, 53859 },
+ { 0x23D7, 53863 },
+ { 0x23D9, 53865 },
+ { 0x23D8, 53867 },
+ { 0x02D4, 53869 },
+ { 0x02C4, 53873 },
+ { 0x5770, 53877 },
+ { 0x5718, 53880 },
+ { 0x5717, 53884 },
+ { 0x5719, 53889 },
+ { 0x02FC, 53894 },
+ { 0x02FA, 53899 },
+ { 0x02F0, 53904 },
+ { 0x02EF, 53909 },
+ { 0x02FF, 53914 },
+ { 0x02F1, 53919 },
+ { 0x02F3, 53924 },
+ { 0x02E8, 53928 },
+ { 0x02CF, 53933 },
+ { 0x02CE, 53938 },
+ { 0x02F2, 53943 },
+ { 0x02F7, 53948 },
+ { 0x570B, 53952 },
+ { 0x5710, 53958 },
+ { 0x02CD, 53965 },
+ { 0x571F, 53969 },
+ { 0x02CC, 53975 },
+ { 0x5715, 53980 },
+ { 0x5788, 53986 },
+ { 0x02E7, 53991 },
+ { 0x570A, 53996 },
+ { 0x570F, 54002 },
+ { 0x5714, 54009 },
+ { 0x02EA, 54015 },
+ { 0x02D5, 54021 },
+ { 0x02C5, 54025 },
+ { 0x02D1, 54029 },
+ { 0x02E6, 54034 },
+ { 0x5709, 54039 },
+ { 0x570E, 54045 },
+ { 0x5713, 54052 },
+ { 0x02BF, 54058 },
+ { 0x02C2, 54063 },
+ { 0x02FE, 54067 },
+ { 0x02D6, 54071 },
+ { 0x02EB, 54075 },
+ { 0x02CA, 54081 },
+ { 0x02FB, 54085 },
+ { 0x02F9, 54090 },
+ { 0x5789, 54095 },
+ { 0x02DF, 54098 },
+ { 0x02CB, 54102 },
+ { 0x571A, 54106 },
+ { 0x02D7, 54112 },
+ { 0x02B9, 54116 },
+ { 0x02BE, 54119 },
+ { 0x02C3, 54124 },
+ { 0x02FD, 54128 },
+ { 0x578A, 54131 },
+ { 0x1D43, 54136 },
+ { 0x1D47, 54140 },
+ { 0x1D9C, 54144 },
+ { 0x1D9D, 54148 },
+ { 0x1D48, 54154 },
+ { 0x1D49, 54158 },
+ { 0x1DA0, 54162 },
+ { 0x1D4D, 54166 },
+ { 0x02B0, 54170 },
+ { 0x02B1, 54174 },
+ { 0x1DA4, 54180 },
+ { 0x02B2, 54186 },
+ { 0x1DA8, 54190 },
+ { 0x1D4F, 54196 },
+ { 0x02E1, 54200 },
+ { 0x1DAA, 54204 },
+ { 0x1DA9, 54211 },
+ { 0x1D50, 54218 },
+ { 0x1DAC, 54222 },
+ { 0x1DAE, 54228 },
+ { 0x1DAF, 54235 },
+ { 0x1D52, 54242 },
+ { 0x1D56, 54246 },
+ { 0x02B3, 54250 },
+ { 0x02E2, 54254 },
+ { 0x1DB3, 54258 },
+ { 0x1D57, 54264 },
+ { 0x1DB5, 54268 },
+ { 0x1D58, 54275 },
+ { 0x1DB6, 54279 },
+ { 0x1D5B, 54284 },
+ { 0x1DB9, 54288 },
+ { 0x02B7, 54294 },
+ { 0x02E3, 54298 },
+ { 0x02B8, 54302 },
+ { 0x1DBB, 54306 },
+ { 0x1DBD, 54310 },
+ { 0x1DBC, 54316 },
+ { 0x1D5C, 54323 },
+ { 0x1D61, 54327 },
+ { 0x1D51, 54331 },
+ { 0x1DB4, 54335 },
+ { 0x1D9E, 54339 },
+ { 0x1DBE, 54343 },
+ { 0x1DB2, 54347 },
+ { 0x1D54, 54351 },
+ { 0x1D5D, 54357 },
+ { 0x1DA5, 54361 },
+ { 0x1D4B, 54365 },
+ { 0x1D53, 54370 },
+ { 0x1D45, 54375 },
+ { 0x1D5F, 54379 },
+ { 0x02E0, 54383 },
+ { 0x1D60, 54387 },
+ { 0x1D5E, 54392 },
+ { 0x1D4A, 54397 },
+ { 0x1DBF, 54401 },
+ { 0x1DB1, 54405 },
+ { 0x1D55, 54410 },
+ { 0x1DA2, 54416 },
+ { 0x1D44, 54421 },
+ { 0x1DA3, 54426 },
+ { 0x1D4E, 54431 },
+ { 0x1D5A, 54436 },
+ { 0x1DAD, 54441 },
+ { 0x02B4, 54449 },
+ { 0x02B5, 54454 },
+ { 0x1DBA, 54461 },
+ { 0x1D46, 54466 },
+ { 0x1D4C, 54471 },
+ { 0x1D9B, 54477 },
+ { 0x1DA6, 54482 },
+ { 0x1DA7, 54487 },
+ { 0x1DAB, 54494 },
+ { 0x1DB0, 54499 },
+ { 0x1DB8, 54504 },
+ { 0x02B6, 54509 },
+ { 0x1DA1, 54515 },
+ { 0x1DB7, 54522 },
+ { 0x1D9F, 54526 },
+ { 0x02E4, 54532 },
+ { 0x1D59, 54538 },
+ { 0x02BA, 54543 },
+ { 0x02EE, 54547 },
+ { 0x02C9, 54551 },
+ { 0x02F4, 54554 },
+ { 0x02F6, 54559 },
+ { 0x02F5, 54565 },
+ { 0x571B, 54571 },
+ { 0x571C, 54576 },
+ { 0x02F8, 54581 },
+ { 0x571E, 54585 },
+ { 0x571D, 54591 },
+ { 0x02DE, 54596 },
+ { 0x5721, 54600 },
+ { 0x5720, 54606 },
+ { 0x02BB, 54612 },
+ { 0x1D2C, 54616 },
+ { 0x1D2E, 54620 },
+ { 0x1D30, 54624 },
+ { 0x1D31, 54628 },
+ { 0x1D33, 54632 },
+ { 0x1D34, 54636 },
+ { 0x1D35, 54640 },
+ { 0x1D36, 54644 },
+ { 0x1D37, 54648 },
+ { 0x1D38, 54652 },
+ { 0x1D39, 54656 },
+ { 0x1D3A, 54660 },
+ { 0x1D3C, 54664 },
+ { 0x1D3E, 54668 },
+ { 0x1D3F, 54672 },
+ { 0x1D40, 54676 },
+ { 0x1D41, 54680 },
+ { 0x2C7D, 54684 },
+ { 0x1D42, 54688 },
+ { 0x1D2D, 54692 },
+ { 0x1D3D, 54696 },
+ { 0x1D2F, 54700 },
+ { 0x1D32, 54705 },
+ { 0x1D3B, 54710 },
+ { 0x02D3, 54715 },
+ { 0x02D2, 54721 },
+ { 0x5704, 54727 },
+ { 0x5706, 54733 },
+ { 0x5700, 54739 },
+ { 0x5702, 54745 },
+ { 0x5705, 54751 },
+ { 0x5707, 54757 },
+ { 0x5701, 54763 },
+ { 0x5703, 54769 },
+ { 0x02C0, 54775 },
+ { 0x02EC, 54779 },
+ { 0x1D78, 54782 },
+ { 0x10FC, 54786 },
+ { 0x02BD, 54790 },
+ { 0x02C1, 54794 },
+ { 0x02C8, 54799 },
+ { 0x02E9, 54803 },
+ { 0x570C, 54808 },
+ { 0x5711, 54814 },
+ { 0x5716, 54821 },
+ { 0x02BC, 54827 },
+ { 0x02C6, 54830 },
+ { 0x02E5, 54834 },
+ { 0x5708, 54839 },
+ { 0x570D, 54845 },
+ { 0x5712, 54852 },
+ { 0x02D0, 54858 },
+ { 0x02ED, 54862 },
+ { 0x268B, 54865 },
+ { 0x268A, 54868 },
+ { 0x9300, 54871 },
+ { 0x22B8, 54874 },
+ { 0x228C, 54875 },
+ { 0x228E, 54876 },
+ { 0x228D, 54878 },
+ { 0x206E, 54880 },
+ { 0x24FF, 54883 },
+ { 0x24EB, 54887 },
+ { 0x24EC, 54891 },
+ { 0x24F4, 54895 },
+ { 0x24EF, 54899 },
+ { 0x24F0, 54903 },
+ { 0x24F2, 54907 },
+ { 0x24EE, 54911 },
+ { 0x24F3, 54915 },
+ { 0x24ED, 54919 },
+ { 0x24F1, 54923 },
+ { 0x00A0, 54927 },
+ { 0x22B6, 54929 },
+ { 0x2626, 54931 },
+ { 0x272D, 54933 },
+ { 0x2719, 54936 },
+ { 0x271F, 54939 },
+ { 0x269D, 54942 },
+ { 0x203E, 54945 },
+ { 0x2225, 54946 },
+ { 0x2AF3, 54948 },
+ { 0x2AF2, 54952 },
+ { 0x5876, 54956 },
+ { 0x5877, 54959 },
+ { 0x5875, 54963 },
+ { 0x585D, 54967 },
+ { 0x5860, 54970 },
+ { 0x585E, 54973 },
+ { 0x5861, 54976 },
+ { 0x585F, 54979 },
+ { 0x584E, 54982 },
+ { 0x5844, 54985 },
+ { 0x584A, 54988 },
+ { 0x5866, 54991 },
+ { 0x5864, 54994 },
+ { 0x5842, 54997 },
+ { 0x585C, 55000 },
+ { 0x5846, 55003 },
+ { 0x5840, 55006 },
+ { 0x5859, 55009 },
+ { 0x584F, 55012 },
+ { 0x584B, 55015 },
+ { 0x584C, 55018 },
+ { 0x5862, 55021 },
+ { 0x5858, 55024 },
+ { 0x585B, 55027 },
+ { 0x5848, 55030 },
+ { 0x5853, 55033 },
+ { 0x5863, 55036 },
+ { 0x5857, 55039 },
+ { 0x5855, 55042 },
+ { 0x5845, 55045 },
+ { 0x586B, 55048 },
+ { 0x5852, 55051 },
+ { 0x5865, 55054 },
+ { 0x5841, 55057 },
+ { 0x5843, 55060 },
+ { 0x586C, 55063 },
+ { 0x5847, 55066 },
+ { 0x584D, 55069 },
+ { 0x585A, 55072 },
+ { 0x5849, 55075 },
+ { 0x5850, 55078 },
+ { 0x5869, 55081 },
+ { 0x5854, 55084 },
+ { 0x5851, 55087 },
+ { 0x586A, 55090 },
+ { 0x5856, 55093 },
+ { 0x586F, 55097 },
+ { 0x586D, 55101 },
+ { 0x5870, 55105 },
+ { 0x586E, 55109 },
+ { 0x5873, 55113 },
+ { 0x5874, 55116 },
+ { 0x5871, 55120 },
+ { 0x5867, 55124 },
+ { 0x5868, 55128 },
+ { 0x5872, 55132 },
+ { 0x71F7, 55136 },
+ { 0x71F1, 55141 },
+ { 0x71DA, 55145 },
+ { 0x71EC, 55149 },
+ { 0x71E0, 55153 },
+ { 0x71ED, 55157 },
+ { 0x71DF, 55161 },
+ { 0x71DC, 55165 },
+ { 0x71E4, 55169 },
+ { 0x71EF, 55173 },
+ { 0x71EA, 55177 },
+ { 0x71E9, 55181 },
+ { 0x71F6, 55185 },
+ { 0x71E8, 55189 },
+ { 0x71F3, 55193 },
+ { 0x71FC, 55197 },
+ { 0x71D9, 55202 },
+ { 0x71EB, 55206 },
+ { 0x71D4, 55211 },
+ { 0x71EE, 55215 },
+ { 0x71F8, 55219 },
+ { 0x71F2, 55223 },
+ { 0x71E5, 55228 },
+ { 0x71FB, 55232 },
+ { 0x71D8, 55237 },
+ { 0x71F0, 55241 },
+ { 0x71D5, 55245 },
+ { 0x71E6, 55249 },
+ { 0x71E3, 55253 },
+ { 0x71F9, 55257 },
+ { 0x71D6, 55261 },
+ { 0x71D1, 55265 },
+ { 0x71DB, 55270 },
+ { 0x71E7, 55274 },
+ { 0x71D3, 55278 },
+ { 0x71DE, 55282 },
+ { 0x71F4, 55286 },
+ { 0x71F5, 55290 },
+ { 0x71D7, 55294 },
+ { 0x71DD, 55298 },
+ { 0x71FA, 55302 },
+ { 0x71D2, 55306 },
+ { 0x71E1, 55311 },
+ { 0x71E2, 55315 },
+ { 0x71FD, 55320 },
+ { 0x71D0, 55326 },
+ { 0x272F, 55330 },
+ { 0x2316, 55332 },
+ { 0x227A, 55334 },
+ { 0x227C, 55335 },
+ { 0x227E, 55339 },
+ { 0x22E8, 55343 },
+ { 0x2AB5, 55348 },
+ { 0x2AB9, 55353 },
+ { 0x2AB7, 55359 },
+ { 0x2AB3, 55364 },
+ { 0x2AB1, 55368 },
+ { 0x2AAF, 55374 },
+ { 0x22B0, 55379 },
+ { 0x2397, 55382 },
+ { 0x214A, 55384 },
+ { 0x2596, 55386 },
+ { 0x2597, 55389 },
+ { 0x2598, 55392 },
+ { 0x2599, 55395 },
+ { 0x259A, 55404 },
+ { 0x259B, 55410 },
+ { 0x259C, 55419 },
+ { 0x259D, 55428 },
+ { 0x259E, 55431 },
+ { 0x259F, 55437 },
+ { 0x003F, 55446 },
+ { 0x2048, 55448 },
+ { 0x26BB, 55451 },
+ { 0x267C, 55452 },
+ { 0x211F, 55455 },
+ { 0x2310, 55456 },
+ { 0x29A3, 55459 },
+ { 0x29A5, 55461 },
+ { 0x29B0, 55465 },
+ { 0x2035, 55468 },
+ { 0x223D, 55470 },
+ { 0x22CD, 55472 },
+ { 0x2036, 55475 },
+ { 0x301D, 55478 },
+ { 0x2AED, 55483 },
+ { 0x2E11, 55488 },
+ { 0x2037, 55491 },
+ { 0x204B, 55494 },
+ { 0x2619, 55497 },
+ { 0x2E2E, 55502 },
+ { 0x204F, 55505 },
+ { 0x2143, 55507 },
+ { 0x264F, 55511 },
+ { 0x2730, 55512 },
+ { 0x271E, 55515 },
+ { 0x274D, 55519 },
+ { 0x2618, 55522 },
+ { 0x5673, 55523 },
+ { 0x2263, 55525 },
+ { 0x227B, 55528 },
+ { 0x227D, 55529 },
+ { 0x227F, 55533 },
+ { 0x22E9, 55537 },
+ { 0x2AB6, 55542 },
+ { 0x2ABA, 55547 },
+ { 0x2AB8, 55553 },
+ { 0x2AB4, 55558 },
+ { 0x2AB2, 55562 },
+ { 0x2AB0, 55568 },
+ { 0x22B1, 55573 },
+ { 0x2283, 55576 },
+ { 0x2287, 55578 },
+ { 0x2AC4, 55583 },
+ { 0x228B, 55591 },
+ { 0x2ACC, 55597 },
+ { 0x2AC8, 55603 },
+ { 0x2ACA, 55608 },
+ { 0x2AC6, 55614 },
+ { 0x2ABE, 55619 },
+ { 0x2AC0, 55622 },
+ { 0x2AC2, 55627 },
+ { 0x2AD4, 55632 },
+ { 0x2AD6, 55635 },
+ { 0x297B, 55638 },
+ { 0x2AD8, 55642 },
+ { 0x2AD7, 55650 },
+ { 0x27C9, 55653 },
+ { 0x232F, 55656 },
+ { 0x1772, 55657 },
+ { 0x1773, 55661 },
+ { 0x1760, 55665 },
+ { 0x1761, 55668 },
+ { 0x1762, 55671 },
+ { 0x176A, 55674 },
+ { 0x1767, 55677 },
+ { 0x1764, 55680 },
+ { 0x1763, 55683 },
+ { 0x176E, 55686 },
+ { 0x176B, 55689 },
+ { 0x1768, 55692 },
+ { 0x1769, 55695 },
+ { 0x1770, 55698 },
+ { 0x1766, 55701 },
+ { 0x176F, 55704 },
+ { 0x176C, 55707 },
+ { 0x1765, 55710 },
+ { 0x2D30, 55713 },
+ { 0x2D49, 55716 },
+ { 0x2D53, 55719 },
+ { 0x2D44, 55722 },
+ { 0x2D31, 55725 },
+ { 0x2D37, 55728 },
+ { 0x2D3C, 55731 },
+ { 0x2D33, 55734 },
+ { 0x2D40, 55737 },
+ { 0x2D36, 55740 },
+ { 0x2D3D, 55743 },
+ { 0x2D4D, 55746 },
+ { 0x2D4E, 55749 },
+ { 0x2D4F, 55752 },
+ { 0x2D52, 55755 },
+ { 0x2D47, 55758 },
+ { 0x2D54, 55761 },
+ { 0x2D59, 55764 },
+ { 0x2D5C, 55767 },
+ { 0x2D60, 55770 },
+ { 0x2D61, 55773 },
+ { 0x2D62, 55776 },
+ { 0x2D63, 55779 },
+ { 0x2D3B, 55782 },
+ { 0x2D58, 55785 },
+ { 0x2D32, 55789 },
+ { 0x2D5E, 55792 },
+ { 0x2D39, 55795 },
+ { 0x2D38, 55798 },
+ { 0x2D56, 55801 },
+ { 0x2D43, 55804 },
+ { 0x2D45, 55807 },
+ { 0x2D55, 55810 },
+ { 0x2D5B, 55813 },
+ { 0x2D5A, 55816 },
+ { 0x2D5D, 55819 },
+ { 0x2D5F, 55822 },
+ { 0x2D4A, 55825 },
+ { 0x2D65, 55828 },
+ { 0x2D3A, 55831 },
+ { 0x2D34, 55834 },
+ { 0x2D3F, 55837 },
+ { 0x2D41, 55840 },
+ { 0x2D35, 55845 },
+ { 0x2D42, 55850 },
+ { 0x2D3E, 55854 },
+ { 0x2D48, 55858 },
+ { 0x2D57, 55862 },
+ { 0x2D50, 55866 },
+ { 0x2D46, 55870 },
+ { 0x2D51, 55874 },
+ { 0x2D4C, 55878 },
+ { 0x2D4B, 55882 },
+ { 0x2D64, 55886 },
+ { 0x2D6F, 55890 },
+ { 0x204A, 55895 },
+ { 0x29CA, 55898 },
+ { 0x29CD, 55902 },
+ { 0x29CB, 55907 },
+ { 0x205D, 55910 },
+ { 0x739F, 55911 },
+ { 0x739B, 55914 },
+ { 0x739C, 55917 },
+ { 0x7385, 55920 },
+ { 0x7394, 55923 },
+ { 0x739A, 55926 },
+ { 0x7386, 55929 },
+ { 0x7391, 55932 },
+ { 0x7393, 55935 },
+ { 0x738B, 55938 },
+ { 0x7383, 55941 },
+ { 0x738E, 55944 },
+ { 0x7390, 55947 },
+ { 0x739D, 55950 },
+ { 0x7389, 55953 },
+ { 0x738A, 55956 },
+ { 0x7380, 55959 },
+ { 0x7381, 55962 },
+ { 0x738F, 55965 },
+ { 0x7388, 55968 },
+ { 0x7396, 55971 },
+ { 0x7395, 55974 },
+ { 0x738C, 55977 },
+ { 0x7387, 55980 },
+ { 0x7384, 55983 },
+ { 0x7382, 55986 },
+ { 0x7399, 55989 },
+ { 0x738D, 55992 },
+ { 0x7397, 55995 },
+ { 0x7392, 55998 },
+ { 0x7398, 56001 },
+ { 0x2602, 56004 },
+ { 0x2614, 56005 },
+ { 0x203F, 56009 },
+ { 0x2123, 56010 },
+ { 0x27CA, 56011 },
+ { 0x29D0, 56016 },
+ { 0x2AE4, 56021 },
+ { 0x2AE2, 56026 },
+ { 0x205E, 56031 },
+ { 0x3031, 56034 },
+ { 0x3035, 56038 },
+ { 0x3033, 56044 },
+ { 0x3032, 56050 },
+ { 0x3034, 56057 },
+ { 0x007C, 56066 },
+ { 0x2AEF, 56068 },
+ { 0x2AF0, 56073 },
+ { 0x237F, 56078 },
+ { 0x23D0, 56083 },
+ { 0x26A8, 56086 },
+ { 0x2E2F, 56091 },
+ { 0x299A, 56093 },
+ { 0x22EE, 56096 },
+ { 0x303B, 56098 },
+ { 0x2317, 56102 },
+ { 0x2101, 56104 },
+ { 0x0026, 56108 },
+ { 0x260A, 56109 },
+ { 0x22A6, 56111 },
+ { 0x2623, 56112 },
+ { 0x902F, 56114 },
+ { 0x900E, 56118 },
+ { 0x9085, 56123 },
+ { 0x9046, 56127 },
+ { 0x901A, 56132 },
+ { 0x9040, 56137 },
+ { 0x9079, 56141 },
+ { 0x9030, 56147 },
+ { 0x907D, 56151 },
+ { 0x907C, 56156 },
+ { 0x909C, 56161 },
+ { 0x909E, 56166 },
+ { 0x909A, 56171 },
+ { 0x90A1, 56177 },
+ { 0x909F, 56183 },
+ { 0x909D, 56188 },
+ { 0x909B, 56193 },
+ { 0x90A0, 56198 },
+ { 0x9033, 56203 },
+ { 0x900D, 56209 },
+ { 0x9097, 56214 },
+ { 0x90C8, 56218 },
+ { 0x90C9, 56223 },
+ { 0x90CA, 56228 },
+ { 0x9086, 56233 },
+ { 0x9080, 56237 },
+ { 0x902E, 56242 },
+ { 0x9048, 56246 },
+ { 0x9004, 56251 },
+ { 0x9003, 56256 },
+ { 0x9000, 56261 },
+ { 0x9025, 56265 },
+ { 0x9066, 56269 },
+ { 0x902D, 56273 },
+ { 0x9078, 56277 },
+ { 0x9014, 56282 },
+ { 0x9019, 56286 },
+ { 0x906A, 56290 },
+ { 0x9001, 56295 },
+ { 0x90D0, 56299 },
+ { 0x90D2, 56306 },
+ { 0x90D3, 56313 },
+ { 0x90D1, 56320 },
+ { 0x90CE, 56327 },
+ { 0x90CF, 56332 },
+ { 0x9060, 56337 },
+ { 0x9074, 56342 },
+ { 0x90C5, 56347 },
+ { 0x90CB, 56354 },
+ { 0x90BC, 56361 },
+ { 0x90C7, 56367 },
+ { 0x90C3, 56372 },
+ { 0x90C4, 56379 },
+ { 0x90C6, 56386 },
+ { 0x90BE, 56393 },
+ { 0x9034, 56400 },
+ { 0x90B9, 56405 },
+ { 0x90BD, 56412 },
+ { 0x90BF, 56418 },
+ { 0x90C2, 56424 },
+ { 0x90C1, 56431 },
+ { 0x90BA, 56438 },
+ { 0x90C0, 56444 },
+ { 0x90BB, 56450 },
+ { 0x90CC, 56456 },
+ { 0x90D8, 56462 },
+ { 0x90D9, 56467 },
+ { 0x908F, 56472 },
+ { 0x90F5, 56478 },
+ { 0x9016, 56484 },
+ { 0x9091, 56489 },
+ { 0x9090, 56495 },
+ { 0x90AC, 56501 },
+ { 0x9037, 56507 },
+ { 0x9024, 56512 },
+ { 0x907F, 56516 },
+ { 0x90F4, 56521 },
+ { 0x908B, 56526 },
+ { 0x908A, 56532 },
+ { 0x908C, 56538 },
+ { 0x908E, 56544 },
+ { 0x908D, 56550 },
+ { 0x9057, 56556 },
+ { 0x9047, 56561 },
+ { 0x9015, 56566 },
+ { 0x905B, 56571 },
+ { 0x9020, 56575 },
+ { 0x9059, 56580 },
+ { 0x9026, 56585 },
+ { 0x9017, 56590 },
+ { 0x9029, 56594 },
+ { 0x9069, 56598 },
+ { 0x90E8, 56603 },
+ { 0x900F, 56607 },
+ { 0x9087, 56611 },
+ { 0x9058, 56615 },
+ { 0x9006, 56620 },
+ { 0x9005, 56625 },
+ { 0x90D4, 56630 },
+ { 0x90D6, 56637 },
+ { 0x90D7, 56644 },
+ { 0x90D5, 56651 },
+ { 0x90CD, 56658 },
+ { 0x9050, 56663 },
+ { 0x90EC, 56667 },
+ { 0x90EB, 56672 },
+ { 0x90ED, 56677 },
+ { 0x90EF, 56682 },
+ { 0x90E9, 56687 },
+ { 0x90EE, 56692 },
+ { 0x90EA, 56697 },
+ { 0x9056, 56702 },
+ { 0x9099, 56706 },
+ { 0x9055, 56710 },
+ { 0x90B6, 56714 },
+ { 0x903F, 56721 },
+ { 0x904F, 56725 },
+ { 0x90F3, 56731 },
+ { 0x90F1, 56737 },
+ { 0x901B, 56743 },
+ { 0x9089, 56748 },
+ { 0x9083, 56752 },
+ { 0x9082, 56757 },
+ { 0x9081, 56762 },
+ { 0x9061, 56767 },
+ { 0x905D, 56771 },
+ { 0x9041, 56775 },
+ { 0x9049, 56779 },
+ { 0x903C, 56783 },
+ { 0x907E, 56787 },
+ { 0x901F, 56791 },
+ { 0x9065, 56796 },
+ { 0x902B, 56801 },
+ { 0x902A, 56807 },
+ { 0x9013, 56812 },
+ { 0x9031, 56816 },
+ { 0x9027, 56820 },
+ { 0x9021, 56824 },
+ { 0x9053, 56829 },
+ { 0x9084, 56833 },
+ { 0x9022, 56838 },
+ { 0x9023, 56843 },
+ { 0x9018, 56847 },
+ { 0x9067, 56851 },
+ { 0x903B, 56856 },
+ { 0x90DA, 56861 },
+ { 0x90DB, 56867 },
+ { 0x90DC, 56873 },
+ { 0x90DD, 56878 },
+ { 0x9092, 56883 },
+ { 0x9095, 56887 },
+ { 0x9094, 56893 },
+ { 0x9093, 56900 },
+ { 0x90E6, 56907 },
+ { 0x9068, 56912 },
+ { 0x90B7, 56916 },
+ { 0x9007, 56920 },
+ { 0x903A, 56924 },
+ { 0x9042, 56928 },
+ { 0x904A, 56933 },
+ { 0x900C, 56937 },
+ { 0x90A3, 56941 },
+ { 0x90A5, 56948 },
+ { 0x90B1, 56955 },
+ { 0x90A2, 56961 },
+ { 0x90A6, 56967 },
+ { 0x90AA, 56973 },
+ { 0x90AB, 56979 },
+ { 0x90B3, 56985 },
+ { 0x90A4, 56992 },
+ { 0x90A8, 56998 },
+ { 0x90A9, 57004 },
+ { 0x90A7, 57011 },
+ { 0x90B2, 57016 },
+ { 0x901E, 57022 },
+ { 0x9038, 57026 },
+ { 0x904D, 57030 },
+ { 0x901D, 57035 },
+ { 0x90E2, 57039 },
+ { 0x90E3, 57044 },
+ { 0x90E4, 57050 },
+ { 0x90E5, 57056 },
+ { 0x90DE, 57062 },
+ { 0x90DF, 57067 },
+ { 0x90E0, 57073 },
+ { 0x90E1, 57079 },
+ { 0x9088, 57085 },
+ { 0x9063, 57089 },
+ { 0x9043, 57094 },
+ { 0x9036, 57099 },
+ { 0x90E7, 57104 },
+ { 0x907B, 57109 },
+ { 0x90B0, 57113 },
+ { 0x90AF, 57118 },
+ { 0x90AE, 57123 },
+ { 0x9035, 57128 },
+ { 0x907A, 57132 },
+ { 0x9010, 57136 },
+ { 0x904E, 57140 },
+ { 0x90F2, 57146 },
+ { 0x90F0, 57152 },
+ { 0x901C, 57158 },
+ { 0x9032, 57163 },
+ { 0x9075, 57167 },
+ { 0x902C, 57172 },
+ { 0x9039, 57177 },
+ { 0x905A, 57181 },
+ { 0x9008, 57186 },
+ { 0x9096, 57190 },
+ { 0x900A, 57194 },
+ { 0x900B, 57198 },
+ { 0x905C, 57203 },
+ { 0x90AD, 57207 },
+ { 0x9052, 57213 },
+ { 0x9011, 57219 },
+ { 0x9051, 57223 },
+ { 0x9012, 57228 },
+ { 0x9064, 57233 },
+ { 0x90B4, 57237 },
+ { 0x90B5, 57243 },
+ { 0x9098, 57249 },
+ { 0x90B8, 57253 },
+ { 0x905F, 57257 },
+ { 0x903D, 57262 },
+ { 0x9009, 57267 },
+ { 0x905E, 57271 },
+ { 0x903E, 57276 },
+ { 0x9002, 57281 },
+ { 0x9076, 57285 },
+ { 0x9077, 57290 },
+ { 0x9028, 57295 },
+ { 0x9045, 57299 },
+ { 0x9044, 57303 },
+ { 0x9073, 57307 },
+ { 0x9072, 57311 },
+ { 0x906D, 57315 },
+ { 0x9070, 57319 },
+ { 0x9062, 57323 },
+ { 0x904C, 57327 },
+ { 0x9054, 57331 },
+ { 0x904B, 57335 },
+ { 0x906C, 57339 },
+ { 0x9071, 57343 },
+ { 0x906B, 57347 },
+ { 0x906E, 57351 },
+ { 0x906F, 57355 },
+ { 0x2651, 57359 },
+ { 0x2040, 57360 },
+ { 0x21B7, 57362 },
+ { 0x21BB, 57366 },
+ { 0x2941, 57370 },
+ { 0x27F3, 57374 },
+ { 0x2232, 57378 },
+ { 0x2231, 57381 },
+ { 0x033D, 57383 },
+ { 0x0353, 57386 },
+ { 0x1DD0, 57389 },
+ { 0x031D, 57392 },
+ { 0x1DD1, 57396 },
+ { 0x1DD2, 57399 },
+ { 0x0307, 57402 },
+ { 0x0358, 57405 },
+ { 0x0323, 57409 },
+ { 0x0332, 57412 },
+ { 0x034A, 57415 },
+ { 0x031E, 57419 },
+ { 0x20DC, 57423 },
+ { 0x0309, 57427 },
+ { 0x031B, 57430 },
+ { 0x0351, 57432 },
+ { 0x031C, 57437 },
+ { 0x0318, 57442 },
+ { 0x031A, 57446 },
+ { 0x0349, 57450 },
+ { 0x20D6, 57454 },
+ { 0x20EE, 57458 },
+ { 0x20E1, 57462 },
+ { 0x034D, 57467 },
+ { 0x20D0, 57472 },
+ { 0x1DFE, 57476 },
+ { 0x0354, 57480 },
+ { 0x20EB, 57484 },
+ { 0x0336, 57489 },
+ { 0x0338, 57493 },
+ { 0x20D2, 57497 },
+ { 0x031F, 57502 },
+ { 0x030A, 57506 },
+ { 0x0325, 57509 },
+ { 0x20D8, 57512 },
+ { 0x20E9, 57515 },
+ { 0x0341, 57519 },
+ { 0x0301, 57523 },
+ { 0x0317, 57526 },
+ { 0x0306, 57530 },
+ { 0x032E, 57532 },
+ { 0x030C, 57535 },
+ { 0x032C, 57537 },
+ { 0x0313, 57540 },
+ { 0x0315, 57543 },
+ { 0x0326, 57547 },
+ { 0x0340, 57550 },
+ { 0x0300, 57554 },
+ { 0x0316, 57557 },
+ { 0x0343, 57561 },
+ { 0x9242, 57564 },
+ { 0x9244, 57568 },
+ { 0x9243, 57572 },
+ { 0x0344, 57576 },
+ { 0x0342, 57580 },
+ { 0x0345, 57583 },
+ { 0x0363, 57586 },
+ { 0x0368, 57591 },
+ { 0x1DD7, 57596 },
+ { 0x0369, 57602 },
+ { 0x0364, 57607 },
+ { 0x1DDA, 57612 },
+ { 0x036A, 57617 },
+ { 0x0365, 57622 },
+ { 0x1DDC, 57627 },
+ { 0x1DDD, 57632 },
+ { 0x036B, 57637 },
+ { 0x1DE0, 57642 },
+ { 0x0366, 57647 },
+ { 0x036C, 57652 },
+ { 0x1DCA, 57657 },
+ { 0x1DE3, 57663 },
+ { 0x1DE4, 57669 },
+ { 0x036D, 57674 },
+ { 0x0367, 57679 },
+ { 0x036E, 57684 },
+ { 0x036F, 57689 },
+ { 0x1DE6, 57694 },
+ { 0x1DD4, 57699 },
+ { 0x1DD5, 57704 },
+ { 0x1DD6, 57709 },
+ { 0x1DD9, 57714 },
+ { 0x1DE5, 57719 },
+ { 0x1DD8, 57725 },
+ { 0x1DD3, 57731 },
+ { 0x1DDB, 57739 },
+ { 0x1DDE, 57745 },
+ { 0x1DDF, 57751 },
+ { 0x1DE1, 57757 },
+ { 0x1DE2, 57763 },
+ { 0x0320, 57769 },
+ { 0x0357, 57773 },
+ { 0x0339, 57778 },
+ { 0x0319, 57783 },
+ { 0x20D7, 57787 },
+ { 0x20EF, 57791 },
+ { 0x20D1, 57795 },
+ { 0x0356, 57799 },
+ { 0x1DFF, 57806 },
+ { 0x0350, 57813 },
+ { 0x0355, 57817 },
+ { 0x0335, 57821 },
+ { 0x0337, 57825 },
+ { 0x20D3, 57829 },
+ { 0x1DC2, 57834 },
+ { 0x20DB, 57837 },
+ { 0x0303, 57841 },
+ { 0x0330, 57843 },
+ { 0x0334, 57846 },
+ { 0x034C, 57849 },
+ { 0x0346, 57854 },
+ { 0x032A, 57857 },
+ { 0x1DC1, 57860 },
+ { 0x1DC0, 57864 },
+ { 0x0333, 57868 },
+ { 0x035A, 57872 },
+ { 0x030B, 57876 },
+ { 0x035D, 57880 },
+ { 0x035C, 57883 },
+ { 0x030F, 57887 },
+ { 0x0360, 57891 },
+ { 0x6E22, 57894 },
+ { 0x6E23, 57899 },
+ { 0x035E, 57904 },
+ { 0x035F, 57907 },
+ { 0x0361, 57911 },
+ { 0x033F, 57915 },
+ { 0x030E, 57918 },
+ { 0x0348, 57923 },
+ { 0x20E6, 57928 },
+ { 0x1DCD, 57933 },
+ { 0x0362, 57937 },
+ { 0x0347, 57942 },
+ { 0x0304, 57946 },
+ { 0x6E24, 57948 },
+ { 0x0331, 57952 },
+ { 0x6E25, 57955 },
+ { 0x0328, 57959 },
+ { 0x1DCE, 57961 },
+ { 0x033B, 57964 },
+ { 0x20E8, 57967 },
+ { 0x0312, 57970 },
+ { 0x035B, 57974 },
+ { 0x1DCF, 57977 },
+ { 0x20E7, 57980 },
+ { 0x0327, 57983 },
+ { 0x0352, 57985 },
+ { 0x20E5, 57987 },
+ { 0x033C, 57991 },
+ { 0x034E, 57994 },
+ { 0x20F0, 57998 },
+ { 0x0359, 58001 },
+ { 0x5670, 58004 },
+ { 0x0485, 58009 },
+ { 0x0486, 58013 },
+ { 0x0483, 58017 },
+ { 0x566F, 58020 },
+ { 0x567C, 58023 },
+ { 0x2DF6, 58026 },
+ { 0x2DEA, 58030 },
+ { 0x2DE0, 58034 },
+ { 0x2DE3, 58038 },
+ { 0x2DE7, 58042 },
+ { 0x2DE8, 58046 },
+ { 0x2DE9, 58050 },
+ { 0x2DEC, 58054 },
+ { 0x2DED, 58058 },
+ { 0x2DEF, 58062 },
+ { 0x2DF7, 58066 },
+ { 0x2DE6, 58070 },
+ { 0x2DEB, 58074 },
+ { 0x2DEE, 58078 },
+ { 0x2DE1, 58082 },
+ { 0x2DFB, 58086 },
+ { 0x2DE5, 58090 },
+ { 0x2DFE, 58094 },
+ { 0x2DF1, 58099 },
+ { 0x2DE2, 58103 },
+ { 0x2DF2, 58107 },
+ { 0x2DF0, 58111 },
+ { 0x2DFA, 58115 },
+ { 0x2DE4, 58119 },
+ { 0x2DF4, 58123 },
+ { 0x2DF8, 58127 },
+ { 0x2DF5, 58131 },
+ { 0x2DF3, 58135 },
+ { 0x2DFD, 58139 },
+ { 0x2DFC, 58144 },
+ { 0x2DFF, 58149 },
+ { 0x2DF9, 58155 },
+ { 0x5671, 58160 },
+ { 0x0488, 58165 },
+ { 0x567D, 58170 },
+ { 0x0489, 58173 },
+ { 0x0487, 58177 },
+ { 0x5672, 58180 },
+ { 0x0484, 58185 },
+ { 0x034F, 58188 },
+ { 0x0311, 58191 },
+ { 0x032F, 58194 },
+ { 0x033A, 58198 },
+ { 0x032B, 58202 },
+ { 0x6E20, 58207 },
+ { 0x6E21, 58211 },
+ { 0x0305, 58215 },
+ { 0x0314, 58217 },
+ { 0x030D, 58221 },
+ { 0x0329, 58225 },
+ { 0x033E, 58229 },
+ { 0x20D9, 58232 },
+ { 0x20D5, 58236 },
+ { 0x0308, 58240 },
+ { 0x0324, 58242 },
+ { 0x20DD, 58245 },
+ { 0x20E0, 58248 },
+ { 0x20E3, 58252 },
+ { 0x20E2, 58255 },
+ { 0x20DE, 58258 },
+ { 0x20E4, 58261 },
+ { 0x20DF, 58266 },
+ { 0x20EA, 58269 },
+ { 0x20ED, 58273 },
+ { 0x0322, 58279 },
+ { 0x0302, 58283 },
+ { 0x032D, 58286 },
+ { 0x6E26, 58290 },
+ { 0x034B, 58293 },
+ { 0x20EC, 58296 },
+ { 0x1DC3, 58302 },
+ { 0x0310, 58305 },
+ { 0x0321, 58307 },
+ { 0x1DC7, 58311 },
+ { 0x1DCB, 58313 },
+ { 0x1DC5, 58315 },
+ { 0x1DC4, 58317 },
+ { 0x1DCC, 58319 },
+ { 0x1DC6, 58321 },
+ { 0x20DA, 58323 },
+ { 0x20D4, 58327 },
+ { 0x1DC9, 58331 },
+ { 0x1DC8, 58333 },
+ { 0x3099, 58335 },
+ { 0x309A, 58340 },
+ { 0x2A6D, 58345 },
+ { 0x00A9, 58349 },
+ { 0x8000, 58351 },
+ { 0x8001, 58354 },
+ { 0x8004, 58359 },
+ { 0x8002, 58364 },
+ { 0x8005, 58369 },
+ { 0x8008, 58374 },
+ { 0x8003, 58379 },
+ { 0x8007, 58385 },
+ { 0x8006, 58390 },
+ { 0x808A, 58396 },
+ { 0x808C, 58399 },
+ { 0x808B, 58407 },
+ { 0x813F, 58412 },
+ { 0x8140, 58415 },
+ { 0x830B, 58419 },
+ { 0x830D, 58422 },
+ { 0x830C, 58427 },
+ { 0x8310, 58431 },
+ { 0x830E, 58441 },
+ { 0x830F, 58452 },
+ { 0x8009, 58460 },
+ { 0x800A, 58463 },
+ { 0x8015, 58466 },
+ { 0x8014, 58470 },
+ { 0x800F, 58479 },
+ { 0x800D, 58484 },
+ { 0x8010, 58489 },
+ { 0x800B, 58495 },
+ { 0x800C, 58500 },
+ { 0x800E, 58506 },
+ { 0x8011, 58512 },
+ { 0x8012, 58517 },
+ { 0x8013, 58522 },
+ { 0x801C, 58527 },
+ { 0x801D, 58530 },
+ { 0x801E, 58533 },
+ { 0x801F, 58538 },
+ { 0x8020, 58545 },
+ { 0x8021, 58548 },
+ { 0x8024, 58553 },
+ { 0x8026, 58558 },
+ { 0x8027, 58563 },
+ { 0x8028, 58568 },
+ { 0x8022, 58573 },
+ { 0x8023, 58578 },
+ { 0x8025, 58583 },
+ { 0x802D, 58588 },
+ { 0x802E, 58591 },
+ { 0x8031, 58596 },
+ { 0x8030, 58602 },
+ { 0x802F, 58611 },
+ { 0x8040, 58616 },
+ { 0x8049, 58619 },
+ { 0x804A, 58622 },
+ { 0x804B, 58627 },
+ { 0x804C, 58632 },
+ { 0x804D, 58638 },
+ { 0x804E, 58641 },
+ { 0x804F, 58647 },
+ { 0x8050, 58653 },
+ { 0x8055, 58658 },
+ { 0x8072, 58661 },
+ { 0x807A, 58664 },
+ { 0x807C, 58667 },
+ { 0x807B, 58671 },
+ { 0x807D, 58676 },
+ { 0x808D, 58680 },
+ { 0x808E, 58683 },
+ { 0x8093, 58692 },
+ { 0x8090, 58697 },
+ { 0x808F, 58702 },
+ { 0x8091, 58707 },
+ { 0x8092, 58712 },
+ { 0x8096, 58717 },
+ { 0x8097, 58720 },
+ { 0x809A, 58723 },
+ { 0x8098, 58728 },
+ { 0x8099, 58733 },
+ { 0x809D, 58739 },
+ { 0x809B, 58743 },
+ { 0x809C, 58748 },
+ { 0x80B5, 58753 },
+ { 0x80B6, 58756 },
+ { 0x8100, 58760 },
+ { 0x8101, 58763 },
+ { 0x8102, 58768 },
+ { 0x8103, 58773 },
+ { 0x8116, 58778 },
+ { 0x8117, 58781 },
+ { 0x8129, 58786 },
+ { 0x812B, 58789 },
+ { 0x812A, 58793 },
+ { 0x812D, 58797 },
+ { 0x8136, 58800 },
+ { 0x812E, 58805 },
+ { 0x8130, 58810 },
+ { 0x8132, 58815 },
+ { 0x8133, 58820 },
+ { 0x8134, 58825 },
+ { 0x8135, 58830 },
+ { 0x812F, 58835 },
+ { 0x8131, 58840 },
+ { 0x8137, 58845 },
+ { 0x8141, 58848 },
+ { 0x8145, 58851 },
+ { 0x814B, 58854 },
+ { 0x814C, 58857 },
+ { 0x814E, 58863 },
+ { 0x814F, 58866 },
+ { 0x8152, 58871 },
+ { 0x8150, 58875 },
+ { 0x8151, 58880 },
+ { 0x8154, 58885 },
+ { 0x8155, 58888 },
+ { 0x8157, 58891 },
+ { 0x8158, 58894 },
+ { 0x8187, 58899 },
+ { 0x8159, 58904 },
+ { 0x815A, 58909 },
+ { 0x815F, 58916 },
+ { 0x8162, 58921 },
+ { 0x8167, 58926 },
+ { 0x816B, 58931 },
+ { 0x816E, 58936 },
+ { 0x8170, 58941 },
+ { 0x8172, 58946 },
+ { 0x8173, 58951 },
+ { 0x8174, 58956 },
+ { 0x8175, 58961 },
+ { 0x8176, 58968 },
+ { 0x8177, 58975 },
+ { 0x8178, 58982 },
+ { 0x8179, 58987 },
+ { 0x817A, 58994 },
+ { 0x817C, 58999 },
+ { 0x817D, 59004 },
+ { 0x817E, 59009 },
+ { 0x8188, 59014 },
+ { 0x8189, 59019 },
+ { 0x818C, 59024 },
+ { 0x815C, 59029 },
+ { 0x815E, 59034 },
+ { 0x8163, 59039 },
+ { 0x8165, 59044 },
+ { 0x8166, 59049 },
+ { 0x816D, 59058 },
+ { 0x816F, 59063 },
+ { 0x8171, 59068 },
+ { 0x817B, 59073 },
+ { 0x817F, 59078 },
+ { 0x8180, 59083 },
+ { 0x8181, 59088 },
+ { 0x8183, 59093 },
+ { 0x8184, 59098 },
+ { 0x8186, 59103 },
+ { 0x818B, 59108 },
+ { 0x815B, 59113 },
+ { 0x8161, 59118 },
+ { 0x8164, 59123 },
+ { 0x8168, 59129 },
+ { 0x8169, 59134 },
+ { 0x816A, 59141 },
+ { 0x816C, 59148 },
+ { 0x8182, 59153 },
+ { 0x818A, 59158 },
+ { 0x815D, 59165 },
+ { 0x8160, 59170 },
+ { 0x8185, 59175 },
+ { 0x81A0, 59180 },
+ { 0x81A2, 59183 },
+ { 0x81A3, 59188 },
+ { 0x81A1, 59193 },
+ { 0x81AA, 59198 },
+ { 0x81AB, 59201 },
+ { 0x81B7, 59213 },
+ { 0x81F7, 59216 },
+ { 0x81FB, 59219 },
+ { 0x81FC, 59222 },
+ { 0x8220, 59227 },
+ { 0x8222, 59230 },
+ { 0x8221, 59234 },
+ { 0x8228, 59239 },
+ { 0x822A, 59242 },
+ { 0x822C, 59245 },
+ { 0x822D, 59248 },
+ { 0x823E, 59253 },
+ { 0x8248, 59256 },
+ { 0x8249, 59259 },
+ { 0x824A, 59264 },
+ { 0x824B, 59269 },
+ { 0x824C, 59273 },
+ { 0x824D, 59276 },
+ { 0x8261, 59281 },
+ { 0x827A, 59284 },
+ { 0x827F, 59287 },
+ { 0x8280, 59290 },
+ { 0x8284, 59295 },
+ { 0x8285, 59300 },
+ { 0x8287, 59305 },
+ { 0x8281, 59310 },
+ { 0x8282, 59315 },
+ { 0x8283, 59320 },
+ { 0x8286, 59325 },
+ { 0x8288, 59330 },
+ { 0x8289, 59335 },
+ { 0x828F, 59340 },
+ { 0x8291, 59343 },
+ { 0x8292, 59346 },
+ { 0x8293, 59349 },
+ { 0x82DB, 59352 },
+ { 0x82DC, 59355 },
+ { 0x82E2, 59359 },
+ { 0x82E3, 59362 },
+ { 0x82EB, 59367 },
+ { 0x82EF, 59370 },
+ { 0x82ED, 59374 },
+ { 0x82EE, 59379 },
+ { 0x82EC, 59384 },
+ { 0x82FC, 59388 },
+ { 0x82FD, 59391 },
+ { 0x82FE, 59395 },
+ { 0x82FF, 59398 },
+ { 0x8305, 59402 },
+ { 0x8311, 59405 },
+ { 0x8312, 59408 },
+ { 0x8313, 59411 },
+ { 0x8319, 59414 },
+ { 0x8317, 59418 },
+ { 0x8318, 59427 },
+ { 0x8316, 59437 },
+ { 0x8315, 59442 },
+ { 0x8314, 59447 },
+ { 0x831A, 59451 },
+ { 0x831B, 59455 },
+ { 0x831D, 59461 },
+ { 0x8321, 59464 },
+ { 0x831F, 59469 },
+ { 0x8320, 59476 },
+ { 0x831E, 59481 },
+ { 0x8326, 59486 },
+ { 0x8327, 59489 },
+ { 0x8328, 59493 },
+ { 0x832A, 59496 },
+ { 0x8329, 59500 },
+ { 0x835D, 59505 },
+ { 0x835E, 59508 },
+ { 0x835F, 59512 },
+ { 0x8363, 59518 },
+ { 0x8364, 59521 },
+ { 0x836A, 59526 },
+ { 0x8016, 59529 },
+ { 0x8019, 59532 },
+ { 0x8018, 59539 },
+ { 0x801A, 59545 },
+ { 0x801B, 59550 },
+ { 0x8017, 59555 },
+ { 0x8038, 59560 },
+ { 0x803A, 59563 },
+ { 0x803C, 59568 },
+ { 0x803D, 59575 },
+ { 0x803B, 59588 },
+ { 0x8039, 59600 },
+ { 0x8041, 59605 },
+ { 0x8044, 59608 },
+ { 0x8045, 59611 },
+ { 0x8047, 59616 },
+ { 0x8053, 59619 },
+ { 0x8056, 59622 },
+ { 0x8057, 59625 },
+ { 0x805A, 59633 },
+ { 0x805B, 59639 },
+ { 0x805C, 59645 },
+ { 0x805D, 59653 },
+ { 0x8060, 59659 },
+ { 0x8061, 59665 },
+ { 0x8062, 59671 },
+ { 0x8064, 59679 },
+ { 0x8065, 59685 },
+ { 0x8066, 59691 },
+ { 0x8068, 59699 },
+ { 0x806A, 59705 },
+ { 0x806C, 59711 },
+ { 0x805F, 59719 },
+ { 0x8063, 59725 },
+ { 0x8067, 59731 },
+ { 0x8069, 59737 },
+ { 0x806D, 59745 },
+ { 0x8058, 59751 },
+ { 0x805E, 59757 },
+ { 0x806B, 59763 },
+ { 0x8059, 59769 },
+ { 0x806E, 59775 },
+ { 0x806F, 59778 },
+ { 0x8073, 59781 },
+ { 0x8074, 59784 },
+ { 0x8075, 59787 },
+ { 0x8077, 59792 },
+ { 0x8078, 59795 },
+ { 0x807E, 59802 },
+ { 0x807F, 59805 },
+ { 0x8081, 59810 },
+ { 0x8083, 59813 },
+ { 0x8084, 59816 },
+ { 0x80B7, 59819 },
+ { 0x80ED, 59822 },
+ { 0x80B8, 59827 },
+ { 0x80B9, 59836 },
+ { 0x80BA, 59843 },
+ { 0x80EA, 59850 },
+ { 0x80BC, 59855 },
+ { 0x80C3, 59860 },
+ { 0x80C4, 59865 },
+ { 0x80C7, 59870 },
+ { 0x80C8, 59875 },
+ { 0x80C9, 59882 },
+ { 0x80CA, 59887 },
+ { 0x80CD, 59895 },
+ { 0x80D1, 59900 },
+ { 0x80D4, 59909 },
+ { 0x80DD, 59916 },
+ { 0x80DE, 59921 },
+ { 0x80DF, 59928 },
+ { 0x80E2, 59933 },
+ { 0x80EB, 59938 },
+ { 0x80EC, 59943 },
+ { 0x80BB, 59950 },
+ { 0x80BD, 59958 },
+ { 0x80BF, 59963 },
+ { 0x80C0, 59968 },
+ { 0x80C1, 59975 },
+ { 0x80C2, 59980 },
+ { 0x80C5, 59987 },
+ { 0x80C6, 59994 },
+ { 0x80CC, 59999 },
+ { 0x80CE, 60004 },
+ { 0x80CF, 60009 },
+ { 0x80D2, 60016 },
+ { 0x80D3, 60021 },
+ { 0x80D6, 60028 },
+ { 0x80D7, 60034 },
+ { 0x80D8, 60043 },
+ { 0x80DA, 60048 },
+ { 0x80DB, 60053 },
+ { 0x80DC, 60060 },
+ { 0x80E0, 60067 },
+ { 0x80E1, 60072 },
+ { 0x80E3, 60079 },
+ { 0x80E4, 60084 },
+ { 0x80E5, 60089 },
+ { 0x80E6, 60094 },
+ { 0x80E8, 60101 },
+ { 0x80BE, 60106 },
+ { 0x80CB, 60113 },
+ { 0x80D0, 60119 },
+ { 0x80D5, 60126 },
+ { 0x80E7, 60131 },
+ { 0x80E9, 60136 },
+ { 0x80D9, 60141 },
+ { 0x80F0, 60146 },
+ { 0x80F1, 60149 },
+ { 0x80F2, 60157 },
+ { 0x80F3, 60160 },
+ { 0x80F5, 60169 },
+ { 0x80F6, 60172 },
+ { 0x80FB, 60175 },
+ { 0x8104, 60178 },
+ { 0x8105, 60181 },
+ { 0x8106, 60186 },
+ { 0x8118, 60191 },
+ { 0x811D, 60194 },
+ { 0x8119, 60198 },
+ { 0x811A, 60203 },
+ { 0x811B, 60211 },
+ { 0x811C, 60216 },
+ { 0x811E, 60223 },
+ { 0x8121, 60226 },
+ { 0x811F, 60232 },
+ { 0x8120, 60239 },
+ { 0x8122, 60244 },
+ { 0x8123, 60247 },
+ { 0x8124, 60250 },
+ { 0x8125, 60255 },
+ { 0x812C, 60258 },
+ { 0x8146, 60261 },
+ { 0x8148, 60264 },
+ { 0x8147, 60268 },
+ { 0x814A, 60272 },
+ { 0x8149, 60276 },
+ { 0x814D, 60287 },
+ { 0x8156, 60290 },
+ { 0x818D, 60293 },
+ { 0x818E, 60296 },
+ { 0x818F, 60301 },
+ { 0x8195, 60304 },
+ { 0x8196, 60307 },
+ { 0x8197, 60313 },
+ { 0x8198, 60316 },
+ { 0x8199, 60321 },
+ { 0x81A4, 60326 },
+ { 0x81A5, 60329 },
+ { 0x81AC, 60332 },
+ { 0x81AD, 60335 },
+ { 0x81AE, 60338 },
+ { 0x81AF, 60343 },
+ { 0x81B0, 60346 },
+ { 0x81B1, 60349 },
+ { 0x81B2, 60353 },
+ { 0x81B3, 60356 },
+ { 0x81B4, 60359 },
+ { 0x81F2, 60364 },
+ { 0x81F3, 60367 },
+ { 0x81F4, 60372 },
+ { 0x81F5, 60375 },
+ { 0x81F6, 60380 },
+ { 0x81F8, 60387 },
+ { 0x81FD, 60390 },
+ { 0x8211, 60393 },
+ { 0x81FE, 60397 },
+ { 0x8203, 60402 },
+ { 0x8204, 60409 },
+ { 0x8208, 60414 },
+ { 0x8209, 60419 },
+ { 0x820B, 60426 },
+ { 0x820C, 60433 },
+ { 0x820D, 60438 },
+ { 0x820E, 60443 },
+ { 0x81FF, 60450 },
+ { 0x8200, 60455 },
+ { 0x8201, 60460 },
+ { 0x8202, 60466 },
+ { 0x8205, 60472 },
+ { 0x8206, 60477 },
+ { 0x8207, 60482 },
+ { 0x820F, 60489 },
+ { 0x8210, 60496 },
+ { 0x820A, 60501 },
+ { 0x8215, 60506 },
+ { 0x8214, 60510 },
+ { 0x8212, 60514 },
+ { 0x8213, 60519 },
+ { 0x8216, 60524 },
+ { 0x821B, 60527 },
+ { 0x821C, 60530 },
+ { 0x821D, 60533 },
+ { 0x821E, 60536 },
+ { 0x821F, 60541 },
+ { 0x8223, 60549 },
+ { 0x8224, 60552 },
+ { 0x8225, 60555 },
+ { 0x8229, 60558 },
+ { 0x822B, 60561 },
+ { 0x822E, 60564 },
+ { 0x822F, 60567 },
+ { 0x823F, 60571 },
+ { 0x8246, 60574 },
+ { 0x8245, 60577 },
+ { 0x824E, 60581 },
+ { 0x824F, 60584 },
+ { 0x8251, 60587 },
+ { 0x8250, 60595 },
+ { 0x8263, 60601 },
+ { 0x826A, 60604 },
+ { 0x8269, 60609 },
+ { 0x8264, 60613 },
+ { 0x8266, 60619 },
+ { 0x8267, 60625 },
+ { 0x8268, 60636 },
+ { 0x8265, 60642 },
+ { 0x826B, 60648 },
+ { 0x826C, 60653 },
+ { 0x827B, 60661 },
+ { 0x827C, 60664 },
+ { 0x827D, 60667 },
+ { 0x8290, 60670 },
+ { 0x8295, 60673 },
+ { 0x82A8, 60676 },
+ { 0x82A7, 60680 },
+ { 0x8296, 60685 },
+ { 0x8297, 60690 },
+ { 0x8299, 60695 },
+ { 0x829D, 60700 },
+ { 0x82A2, 60705 },
+ { 0x82A3, 60710 },
+ { 0x82A4, 60715 },
+ { 0x82A5, 60720 },
+ { 0x8298, 60725 },
+ { 0x829A, 60730 },
+ { 0x829B, 60735 },
+ { 0x829C, 60740 },
+ { 0x829E, 60745 },
+ { 0x829F, 60750 },
+ { 0x82A1, 60755 },
+ { 0x82A6, 60760 },
+ { 0x82A0, 60765 },
+ { 0x8294, 60770 },
+ { 0x82A9, 60774 },
+ { 0x82AA, 60777 },
+ { 0x82AC, 60783 },
+ { 0x82AD, 60786 },
+ { 0x82BA, 60789 },
+ { 0x82BB, 60792 },
+ { 0x82BC, 60796 },
+ { 0x82BD, 60807 },
+ { 0x82D7, 60818 },
+ { 0x82D8, 60821 },
+ { 0x82DD, 60827 },
+ { 0x82E4, 60830 },
+ { 0x82E7, 60833 },
+ { 0x82E9, 60836 },
+ { 0x82F0, 60839 },
+ { 0x82F1, 60842 },
+ { 0x82F2, 60853 },
+ { 0x82F3, 60857 },
+ { 0x82F4, 60860 },
+ { 0x82F9, 60865 },
+ { 0x82F5, 60870 },
+ { 0x82F6, 60875 },
+ { 0x82F7, 60880 },
+ { 0x82F8, 60885 },
+ { 0x82FB, 60890 },
+ { 0x8300, 60893 },
+ { 0x8301, 60896 },
+ { 0x8303, 60899 },
+ { 0x8304, 60904 },
+ { 0x8302, 60915 },
+ { 0x8307, 60920 },
+ { 0x8308, 60923 },
+ { 0x8309, 60926 },
+ { 0x830A, 60929 },
+ { 0x832B, 60937 },
+ { 0x832C, 60940 },
+ { 0x832D, 60947 },
+ { 0x832E, 60954 },
+ { 0x832F, 60959 },
+ { 0x8331, 60964 },
+ { 0x8333, 60969 },
+ { 0x8332, 60976 },
+ { 0x8330, 60983 },
+ { 0x8334, 60988 },
+ { 0x8335, 60991 },
+ { 0x8337, 60994 },
+ { 0x8338, 60997 },
+ { 0x834C, 61002 },
+ { 0x833C, 61009 },
+ { 0x8340, 61014 },
+ { 0x8341, 61019 },
+ { 0x8343, 61024 },
+ { 0x8345, 61029 },
+ { 0x8348, 61034 },
+ { 0x834B, 61039 },
+ { 0x834D, 61044 },
+ { 0x833A, 61049 },
+ { 0x833B, 61054 },
+ { 0x833D, 61059 },
+ { 0x833F, 61064 },
+ { 0x8342, 61069 },
+ { 0x8344, 61074 },
+ { 0x8346, 61079 },
+ { 0x8347, 61084 },
+ { 0x8349, 61089 },
+ { 0x833E, 61094 },
+ { 0x834A, 61100 },
+ { 0x834E, 61105 },
+ { 0x8339, 61110 },
+ { 0x8351, 61115 },
+ { 0x8352, 61118 },
+ { 0x8353, 61123 },
+ { 0x8354, 61128 },
+ { 0x8355, 61133 },
+ { 0x835A, 61138 },
+ { 0x835B, 61141 },
+ { 0x835C, 61146 },
+ { 0x8360, 61149 },
+ { 0x8362, 61152 },
+ { 0x8365, 61155 },
+ { 0x8366, 61158 },
+ { 0x8367, 61161 },
+ { 0x8368, 61166 },
+ { 0x836B, 61169 },
+ { 0x836C, 61172 },
+ { 0x836E, 61177 },
+ { 0x8029, 61180 },
+ { 0x802B, 61183 },
+ { 0x802C, 61186 },
+ { 0x8033, 61191 },
+ { 0x8034, 61194 },
+ { 0x8035, 61197 },
+ { 0x803E, 61202 },
+ { 0x8042, 61205 },
+ { 0x8054, 61208 },
+ { 0x8076, 61211 },
+ { 0x8079, 61214 },
+ { 0x8080, 61217 },
+ { 0x8085, 61220 },
+ { 0x8086, 61223 },
+ { 0x8087, 61227 },
+ { 0x8088, 61232 },
+ { 0x8089, 61235 },
+ { 0x8094, 61238 },
+ { 0x8095, 61241 },
+ { 0x809E, 61244 },
+ { 0x80A0, 61247 },
+ { 0x80A1, 61250 },
+ { 0x80A2, 61253 },
+ { 0x80A3, 61258 },
+ { 0x80A4, 61265 },
+ { 0x80A5, 61274 },
+ { 0x80A9, 61279 },
+ { 0x80AA, 61284 },
+ { 0x80AF, 61290 },
+ { 0x80B1, 61295 },
+ { 0x80B2, 61300 },
+ { 0x80B3, 61305 },
+ { 0x80B4, 61310 },
+ { 0x80A6, 61315 },
+ { 0x80AB, 61320 },
+ { 0x80AE, 61326 },
+ { 0x80B0, 61331 },
+ { 0x80A7, 61338 },
+ { 0x80A8, 61344 },
+ { 0x80AC, 61351 },
+ { 0x80AD, 61356 },
+ { 0x80EE, 61362 },
+ { 0x80EF, 61365 },
+ { 0x80F7, 61370 },
+ { 0x80F9, 61373 },
+ { 0x80F8, 61378 },
+ { 0x80FA, 61382 },
+ { 0x80FC, 61387 },
+ { 0x8108, 61390 },
+ { 0x8109, 61393 },
+ { 0x810A, 61397 },
+ { 0x810B, 61400 },
+ { 0x810E, 61407 },
+ { 0x810F, 61414 },
+ { 0x810D, 61419 },
+ { 0x810C, 61424 },
+ { 0x8111, 61430 },
+ { 0x8115, 61433 },
+ { 0x8113, 61437 },
+ { 0x8114, 61442 },
+ { 0x8112, 61447 },
+ { 0x8126, 61452 },
+ { 0x8138, 61455 },
+ { 0x8139, 61458 },
+ { 0x813D, 61463 },
+ { 0x813A, 61468 },
+ { 0x813C, 61473 },
+ { 0x813B, 61478 },
+ { 0x813E, 61483 },
+ { 0x8142, 61486 },
+ { 0x8143, 61489 },
+ { 0x8144, 61495 },
+ { 0x8153, 61501 },
+ { 0x8190, 61504 },
+ { 0x8191, 61507 },
+ { 0x8192, 61510 },
+ { 0x8193, 61513 },
+ { 0x8194, 61516 },
+ { 0x819A, 61521 },
+ { 0x819B, 61524 },
+ { 0x81A7, 61527 },
+ { 0x81FA, 61530 },
+ { 0x8226, 61533 },
+ { 0x8232, 61536 },
+ { 0x8236, 61539 },
+ { 0x8237, 61544 },
+ { 0x8233, 61553 },
+ { 0x8235, 61558 },
+ { 0x8234, 61563 },
+ { 0x8238, 61568 },
+ { 0x8240, 61573 },
+ { 0x8242, 61576 },
+ { 0x8241, 61582 },
+ { 0x8243, 61586 },
+ { 0x8247, 61591 },
+ { 0x8262, 61594 },
+ { 0x82AE, 61597 },
+ { 0x82AF, 61600 },
+ { 0x82B5, 61605 },
+ { 0x82B6, 61610 },
+ { 0x82B2, 61617 },
+ { 0x82B0, 61622 },
+ { 0x82B4, 61627 },
+ { 0x82B1, 61632 },
+ { 0x82B3, 61637 },
+ { 0x82B7, 61642 },
+ { 0x82BF, 61645 },
+ { 0x82C3, 61648 },
+ { 0x82C4, 61651 },
+ { 0x82C5, 61656 },
+ { 0x82C6, 61661 },
+ { 0x82C7, 61664 },
+ { 0x82C8, 61669 },
+ { 0x82CA, 61674 },
+ { 0x82CB, 61679 },
+ { 0x82CC, 61684 },
+ { 0x82CD, 61689 },
+ { 0x82CF, 61695 },
+ { 0x82D0, 61700 },
+ { 0x82D1, 61705 },
+ { 0x82C9, 61710 },
+ { 0x82CE, 61715 },
+ { 0x82D3, 61720 },
+ { 0x82D5, 61723 },
+ { 0x82D4, 61731 },
+ { 0x82D9, 61735 },
+ { 0x82DE, 61738 },
+ { 0x82DF, 61741 },
+ { 0x82E0, 61747 },
+ { 0x82E5, 61750 },
+ { 0x82EA, 61753 },
+ { 0x82FA, 61756 },
+ { 0x8306, 61759 },
+ { 0x831C, 61762 },
+ { 0x8323, 61765 },
+ { 0x8325, 61768 },
+ { 0x8324, 61773 },
+ { 0x8336, 61778 },
+ { 0x8357, 61781 },
+ { 0x8356, 61784 },
+ { 0x8361, 61787 },
+ { 0x8369, 61790 },
+ { 0x802A, 61793 },
+ { 0x8032, 61796 },
+ { 0x8036, 61799 },
+ { 0x8037, 61802 },
+ { 0x8046, 61805 },
+ { 0x8048, 61808 },
+ { 0x8051, 61811 },
+ { 0x8052, 61814 },
+ { 0x8070, 61819 },
+ { 0x8071, 61822 },
+ { 0x8082, 61825 },
+ { 0x809F, 61828 },
+ { 0x80F4, 61831 },
+ { 0x8107, 61834 },
+ { 0x8110, 61837 },
+ { 0x8127, 61840 },
+ { 0x819F, 61843 },
+ { 0x81A6, 61846 },
+ { 0x81B8, 61849 },
+ { 0x81B9, 61852 },
+ { 0x81BA, 61857 },
+ { 0x81BB, 61866 },
+ { 0x81BC, 61873 },
+ { 0x81E5, 61880 },
+ { 0x81E6, 61885 },
+ { 0x81E7, 61892 },
+ { 0x81BD, 61901 },
+ { 0x81BE, 61906 },
+ { 0x81C1, 61911 },
+ { 0x81C3, 61916 },
+ { 0x81C4, 61921 },
+ { 0x81C8, 61926 },
+ { 0x81CA, 61931 },
+ { 0x81CC, 61938 },
+ { 0x81CD, 61943 },
+ { 0x81CE, 61950 },
+ { 0x81CF, 61957 },
+ { 0x81D6, 61962 },
+ { 0x81D8, 61967 },
+ { 0x81D9, 61972 },
+ { 0x81DB, 61979 },
+ { 0x81E4, 61984 },
+ { 0x81E8, 61995 },
+ { 0x81E9, 62002 },
+ { 0x81BF, 62007 },
+ { 0x81C0, 62014 },
+ { 0x81C2, 62019 },
+ { 0x81C5, 62024 },
+ { 0x81C6, 62029 },
+ { 0x81C7, 62034 },
+ { 0x81C9, 62041 },
+ { 0x81CB, 62046 },
+ { 0x81D0, 62052 },
+ { 0x81D1, 62057 },
+ { 0x81D2, 62062 },
+ { 0x81D3, 62067 },
+ { 0x81D7, 62076 },
+ { 0x81DC, 62081 },
+ { 0x81E1, 62088 },
+ { 0x81E2, 62093 },
+ { 0x81EA, 62098 },
+ { 0x81D5, 62103 },
+ { 0x81DA, 62108 },
+ { 0x81DF, 62113 },
+ { 0x81E0, 62118 },
+ { 0x81E3, 62125 },
+ { 0x81D4, 62130 },
+ { 0x81DD, 62135 },
+ { 0x81DE, 62144 },
+ { 0x81EB, 62152 },
+ { 0x81EC, 62156 },
+ { 0x81EF, 62159 },
+ { 0x81F0, 62163 },
+ { 0x81ED, 62171 },
+ { 0x81EE, 62176 },
+ { 0x8217, 62183 },
+ { 0x8218, 62186 },
+ { 0x821A, 62191 },
+ { 0x8219, 62195 },
+ { 0x8227, 62200 },
+ { 0x8239, 62203 },
+ { 0x823D, 62206 },
+ { 0x823A, 62210 },
+ { 0x823B, 62215 },
+ { 0x823C, 62222 },
+ { 0x8244, 62227 },
+ { 0x8260, 62230 },
+ { 0x826D, 62233 },
+ { 0x826F, 62236 },
+ { 0x8274, 62242 },
+ { 0x8275, 62248 },
+ { 0x8277, 62254 },
+ { 0x8270, 62260 },
+ { 0x8271, 62266 },
+ { 0x8272, 62272 },
+ { 0x8273, 62279 },
+ { 0x8276, 62285 },
+ { 0x826E, 62291 },
+ { 0x8278, 62297 },
+ { 0x8279, 62303 },
+ { 0x827E, 62310 },
+ { 0x828A, 62313 },
+ { 0x828C, 62316 },
+ { 0x828D, 62321 },
+ { 0x828B, 62326 },
+ { 0x828E, 62331 },
+ { 0x82B8, 62336 },
+ { 0x82B9, 62339 },
+ { 0x82BE, 62342 },
+ { 0x82C0, 62345 },
+ { 0x82D6, 62348 },
+ { 0x82E1, 62351 },
+ { 0x82E6, 62354 },
+ { 0x8322, 62357 },
+ { 0x834F, 62360 },
+ { 0x8350, 62363 },
+ { 0x8359, 62368 },
+ { 0x836D, 62371 },
+ { 0x803F, 62374 },
+ { 0x8043, 62377 },
+ { 0x80FD, 62380 },
+ { 0x8128, 62383 },
+ { 0x819C, 62386 },
+ { 0x819E, 62389 },
+ { 0x819D, 62401 },
+ { 0x81A8, 62411 },
+ { 0x81A9, 62414 },
+ { 0x81B5, 62419 },
+ { 0x81B6, 62422 },
+ { 0x81F1, 62425 },
+ { 0x81F9, 62428 },
+ { 0x8230, 62431 },
+ { 0x8231, 62434 },
+ { 0x8252, 62437 },
+ { 0x8253, 62440 },
+ { 0x8257, 62445 },
+ { 0x8258, 62453 },
+ { 0x825E, 62458 },
+ { 0x8254, 62465 },
+ { 0x8255, 62470 },
+ { 0x8256, 62477 },
+ { 0x8259, 62482 },
+ { 0x825A, 62487 },
+ { 0x825B, 62492 },
+ { 0x825C, 62500 },
+ { 0x825D, 62507 },
+ { 0x825F, 62516 },
+ { 0x82AB, 62521 },
+ { 0x82C1, 62524 },
+ { 0x82D2, 62527 },
+ { 0x82DA, 62530 },
+ { 0x82E8, 62533 },
+ { 0x8358, 62536 },
+ { 0x80FE, 62539 },
+ { 0x80FF, 62542 },
+ { 0x82C2, 62547 },
+ { 0x8461, 62550 },
+ { 0x8462, 62557 },
+ { 0x844F, 62564 },
+ { 0x8434, 62569 },
+ { 0x8458, 62574 },
+ { 0x8415, 62579 },
+ { 0x841E, 62584 },
+ { 0x842C, 62589 },
+ { 0x845A, 62594 },
+ { 0x845D, 62600 },
+ { 0x845F, 62608 },
+ { 0x8460, 62614 },
+ { 0x8411, 62620 },
+ { 0x8404, 62625 },
+ { 0x844E, 62630 },
+ { 0x840B, 62636 },
+ { 0x841A, 62641 },
+ { 0x8428, 62646 },
+ { 0x8440, 62651 },
+ { 0x8400, 62658 },
+ { 0x844A, 62663 },
+ { 0x8450, 62669 },
+ { 0x8435, 62674 },
+ { 0x8459, 62679 },
+ { 0x8416, 62684 },
+ { 0x841F, 62689 },
+ { 0x8423, 62694 },
+ { 0x842D, 62699 },
+ { 0x845B, 62704 },
+ { 0x845E, 62710 },
+ { 0x8410, 62718 },
+ { 0x8403, 62723 },
+ { 0x844D, 62728 },
+ { 0x8454, 62734 },
+ { 0x8455, 62739 },
+ { 0x8439, 62746 },
+ { 0x840A, 62751 },
+ { 0x8419, 62756 },
+ { 0x8422, 62761 },
+ { 0x8427, 62766 },
+ { 0x8431, 62771 },
+ { 0x845C, 62776 },
+ { 0x840F, 62782 },
+ { 0x8402, 62787 },
+ { 0x844C, 62792 },
+ { 0x8452, 62798 },
+ { 0x8453, 62803 },
+ { 0x8438, 62810 },
+ { 0x8409, 62815 },
+ { 0x8418, 62820 },
+ { 0x8421, 62825 },
+ { 0x8426, 62830 },
+ { 0x8430, 62835 },
+ { 0x843C, 62840 },
+ { 0x843E, 62847 },
+ { 0x843F, 62855 },
+ { 0x843D, 62863 },
+ { 0x8414, 62870 },
+ { 0x8407, 62875 },
+ { 0x840E, 62880 },
+ { 0x841D, 62885 },
+ { 0x842B, 62890 },
+ { 0x8446, 62895 },
+ { 0x8449, 62902 },
+ { 0x8447, 62910 },
+ { 0x8448, 62917 },
+ { 0x8413, 62924 },
+ { 0x8406, 62929 },
+ { 0x840D, 62934 },
+ { 0x841C, 62939 },
+ { 0x842A, 62944 },
+ { 0x8444, 62949 },
+ { 0x8445, 62956 },
+ { 0x8412, 62963 },
+ { 0x8405, 62968 },
+ { 0x840C, 62973 },
+ { 0x841B, 62978 },
+ { 0x8429, 62983 },
+ { 0x8442, 62988 },
+ { 0x8443, 62996 },
+ { 0x8441, 63004 },
+ { 0x8433, 63011 },
+ { 0x8432, 63019 },
+ { 0x8401, 63027 },
+ { 0x844B, 63032 },
+ { 0x8451, 63038 },
+ { 0x8436, 63043 },
+ { 0x8437, 63048 },
+ { 0x8408, 63055 },
+ { 0x8417, 63060 },
+ { 0x8420, 63065 },
+ { 0x8424, 63070 },
+ { 0x8425, 63075 },
+ { 0x842E, 63082 },
+ { 0x842F, 63087 },
+ { 0x843A, 63094 },
+ { 0x843B, 63101 },
+ { 0x8457, 63108 },
+ { 0x8456, 63112 },
+ { 0x8470, 63116 },
+ { 0x8472, 63123 },
+ { 0x8473, 63128 },
+ { 0x8471, 63133 },
+ { 0x23CA, 63138 },
+ { 0x23C8, 63144 },
+ { 0x23C2, 63152 },
+ { 0x23C5, 63160 },
+ { 0x23C9, 63168 },
+ { 0x23C7, 63174 },
+ { 0x23C1, 63182 },
+ { 0x23C4, 63190 },
+ { 0x23CB, 63198 },
+ { 0x23BE, 63205 },
+ { 0x23C6, 63212 },
+ { 0x23CC, 63218 },
+ { 0x23BF, 63225 },
+ { 0x23C0, 63232 },
+ { 0x23C3, 63238 },
+ { 0x00A8, 63244 },
+ { 0x2331, 63245 },
+ { 0x21A1, 63247 },
+ { 0x2193, 63251 },
+ { 0x2913, 63253 },
+ { 0x21A7, 63257 },
+ { 0x21B2, 63261 },
+ { 0x21B3, 63266 },
+ { 0x21B5, 63271 },
+ { 0x21DF, 63276 },
+ { 0x2908, 63281 },
+ { 0x21F5, 63286 },
+ { 0x2B07, 63292 },
+ { 0x21E9, 63295 },
+ { 0x2E14, 63298 },
+ { 0x21E3, 63300 },
+ { 0x21D3, 63303 },
+ { 0x21CA, 63306 },
+ { 0x290B, 63309 },
+ { 0x21AF, 63312 },
+ { 0x2959, 63315 },
+ { 0x2961, 63322 },
+ { 0x296F, 63329 },
+ { 0x2965, 63340 },
+ { 0x2955, 63351 },
+ { 0x295D, 63358 },
+ { 0x21C3, 63365 },
+ { 0x21C2, 63370 },
+ { 0x27F1, 63375 },
+ { 0x2E0E, 63378 },
+ { 0x212E, 63380 },
+ { 0x2259, 63382 },
+ { 0x213B, 63383 },
+ { 0x6F3F, 63385 },
+ { 0x6FE2, 63388 },
+ { 0x6FE6, 63391 },
+ { 0x6FE5, 63394 },
+ { 0x6FE0, 63397 },
+ { 0x6F0E, 63400 },
+ { 0x6F5B, 63403 },
+ { 0x6F5F, 63407 },
+ { 0x6F3B, 63411 },
+ { 0x6F08, 63415 },
+ { 0x6F0B, 63418 },
+ { 0x6F1A, 63421 },
+ { 0x6F0C, 63423 },
+ { 0x6F11, 63425 },
+ { 0x6F16, 63428 },
+ { 0x6F12, 63431 },
+ { 0x6F15, 63434 },
+ { 0x6F14, 63437 },
+ { 0x6F19, 63440 },
+ { 0x6F10, 63443 },
+ { 0x6F18, 63446 },
+ { 0x6F17, 63449 },
+ { 0x6F13, 63452 },
+ { 0x6F40, 63455 },
+ { 0x6F41, 63458 },
+ { 0x6F42, 63463 },
+ { 0x6F43, 63468 },
+ { 0x6F44, 63473 },
+ { 0x6F45, 63478 },
+ { 0x6F46, 63483 },
+ { 0x6F47, 63488 },
+ { 0x6F48, 63493 },
+ { 0x6F49, 63498 },
+ { 0x6F4A, 63503 },
+ { 0x6F4B, 63508 },
+ { 0x6F4C, 63513 },
+ { 0x6F4D, 63518 },
+ { 0x6F4E, 63523 },
+ { 0x6F4F, 63528 },
+ { 0x6F50, 63533 },
+ { 0x6F51, 63538 },
+ { 0x6F52, 63543 },
+ { 0x6F53, 63548 },
+ { 0x6F54, 63553 },
+ { 0x6F55, 63558 },
+ { 0x6F56, 63563 },
+ { 0x6F57, 63568 },
+ { 0x6F58, 63573 },
+ { 0x6F59, 63578 },
+ { 0x6F5A, 63583 },
+ { 0x6F21, 63588 },
+ { 0x6F22, 63593 },
+ { 0x6F23, 63598 },
+ { 0x6F24, 63603 },
+ { 0x6F25, 63608 },
+ { 0x6F26, 63613 },
+ { 0x6F27, 63618 },
+ { 0x6F28, 63623 },
+ { 0x6F29, 63628 },
+ { 0x6F2A, 63633 },
+ { 0x6F2B, 63638 },
+ { 0x6F2C, 63643 },
+ { 0x6F2D, 63648 },
+ { 0x6F2E, 63653 },
+ { 0x6F2F, 63658 },
+ { 0x6F30, 63663 },
+ { 0x6F31, 63668 },
+ { 0x6F32, 63673 },
+ { 0x6F33, 63678 },
+ { 0x6F34, 63683 },
+ { 0x6F35, 63688 },
+ { 0x6F36, 63693 },
+ { 0x6F37, 63698 },
+ { 0x6F38, 63703 },
+ { 0x6F39, 63708 },
+ { 0x6F3A, 63713 },
+ { 0x6FE1, 63718 },
+ { 0x6F5D, 63721 },
+ { 0x6F60, 63725 },
+ { 0x6F3D, 63729 },
+ { 0x6F09, 63733 },
+ { 0x6F5E, 63736 },
+ { 0x6FE4, 63738 },
+ { 0x6F04, 63741 },
+ { 0x6F1D, 63744 },
+ { 0x6FE3, 63747 },
+ { 0x6F03, 63749 },
+ { 0x6F05, 63752 },
+ { 0x6F3C, 63755 },
+ { 0x6F0F, 63758 },
+ { 0x6F0A, 63760 },
+ { 0x6F1F, 63762 },
+ { 0x6F5C, 63765 },
+ { 0x6F06, 63768 },
+ { 0x6F1C, 63770 },
+ { 0x6F02, 63773 },
+ { 0x6F1B, 63776 },
+ { 0x6F07, 63778 },
+ { 0x6F3E, 63780 },
+ { 0x6F20, 63783 },
+ { 0x6F01, 63786 },
+ { 0x6F1E, 63789 },
+ { 0x6F0D, 63792 },
+ { 0x223A, 63794 },
+ { 0x6F62, 63796 },
+ { 0x6FED, 63800 },
+ { 0x6FE8, 63803 },
+ { 0x6F63, 63807 },
+ { 0x6FEE, 63811 },
+ { 0x6FA0, 63814 },
+ { 0x6FC2, 63817 },
+ { 0x6FC7, 63821 },
+ { 0x6FDC, 63825 },
+ { 0x6FCC, 63829 },
+ { 0x6FD3, 63833 },
+ { 0x6FC3, 63837 },
+ { 0x6FC6, 63841 },
+ { 0x6FDA, 63845 },
+ { 0x6FCF, 63849 },
+ { 0x6FCD, 63853 },
+ { 0x6FD5, 63857 },
+ { 0x6FD6, 63861 },
+ { 0x6FC4, 63865 },
+ { 0x6FCB, 63869 },
+ { 0x6FDB, 63873 },
+ { 0x6FD2, 63877 },
+ { 0x6FD7, 63881 },
+ { 0x6FCE, 63885 },
+ { 0x6FD4, 63889 },
+ { 0x6FC5, 63893 },
+ { 0x6FCA, 63897 },
+ { 0x6FB5, 63901 },
+ { 0x6FB8, 63905 },
+ { 0x6FBE, 63909 },
+ { 0x6FB7, 63913 },
+ { 0x6FB1, 63917 },
+ { 0x6FA4, 63921 },
+ { 0x6FB2, 63925 },
+ { 0x6FA9, 63929 },
+ { 0x6FA1, 63933 },
+ { 0x6FA7, 63937 },
+ { 0x6FBA, 63941 },
+ { 0x6FBB, 63945 },
+ { 0x6FBD, 63949 },
+ { 0x6FBC, 63953 },
+ { 0x6FB6, 63957 },
+ { 0x6FB4, 63961 },
+ { 0x6FAD, 63965 },
+ { 0x6FB9, 63969 },
+ { 0x6FB3, 63973 },
+ { 0x6FA3, 63977 },
+ { 0x6FA5, 63981 },
+ { 0x6FA6, 63985 },
+ { 0x6FB0, 63989 },
+ { 0x6FAB, 63993 },
+ { 0x6FAC, 63997 },
+ { 0x6FA2, 64001 },
+ { 0x6FA8, 64005 },
+ { 0x6FAA, 64009 },
+ { 0x6FAF, 64013 },
+ { 0x6FAE, 64017 },
+ { 0x6FEA, 64021 },
+ { 0x6F71, 64024 },
+ { 0x6F74, 64028 },
+ { 0x6F72, 64032 },
+ { 0x6F9D, 64036 },
+ { 0x6F75, 64040 },
+ { 0x6F73, 64044 },
+ { 0x6F8A, 64048 },
+ { 0x6F8D, 64052 },
+ { 0x6F8B, 64056 },
+ { 0x6F8E, 64060 },
+ { 0x6F8C, 64064 },
+ { 0x6F76, 64068 },
+ { 0x6F79, 64072 },
+ { 0x6F77, 64076 },
+ { 0x6F7A, 64080 },
+ { 0x6F78, 64084 },
+ { 0x6F8F, 64088 },
+ { 0x6F92, 64092 },
+ { 0x6F90, 64096 },
+ { 0x6F93, 64100 },
+ { 0x6F91, 64104 },
+ { 0x6F85, 64108 },
+ { 0x6F88, 64112 },
+ { 0x6F86, 64116 },
+ { 0x6F89, 64120 },
+ { 0x6F87, 64124 },
+ { 0x6F97, 64128 },
+ { 0x6F9A, 64132 },
+ { 0x6F98, 64136 },
+ { 0x6F9B, 64140 },
+ { 0x6F99, 64144 },
+ { 0x6F7B, 64148 },
+ { 0x6F7E, 64152 },
+ { 0x6F7C, 64156 },
+ { 0x6F7F, 64160 },
+ { 0x6F7D, 64164 },
+ { 0x6F80, 64168 },
+ { 0x6F83, 64172 },
+ { 0x6F81, 64176 },
+ { 0x6F84, 64180 },
+ { 0x6F82, 64184 },
+ { 0x6F9C, 64188 },
+ { 0x6F66, 64192 },
+ { 0x6F94, 64196 },
+ { 0x6F96, 64200 },
+ { 0x6F95, 64204 },
+ { 0x6F67, 64208 },
+ { 0x6F6A, 64213 },
+ { 0x6F68, 64218 },
+ { 0x6F6B, 64223 },
+ { 0x6F69, 64228 },
+ { 0x6F6F, 64233 },
+ { 0x6F6C, 64238 },
+ { 0x6F6E, 64243 },
+ { 0x6F6D, 64248 },
+ { 0x6F65, 64253 },
+ { 0x6F9E, 64257 },
+ { 0x6F9F, 64262 },
+ { 0x6FEC, 64267 },
+ { 0x6FE9, 64270 },
+ { 0x6FEB, 64273 },
+ { 0x6F61, 64276 },
+ { 0x6F64, 64280 },
+ { 0x6F70, 64283 },
+ { 0x22B9, 64288 },
+ { 0x231B, 64291 },
+ { 0x2261, 64292 },
+ { 0x29E5, 64294 },
+ { 0x2A67, 64299 },
+ { 0x29E1, 64303 },
+ { 0x2206, 64305 },
+ { 0x2380, 64306 },
+ { 0x2064, 64308 },
+ { 0x2062, 64310 },
+ { 0x2063, 64312 },
+ { 0x2939, 64314 },
+ { 0x219E, 64318 },
+ { 0x219C, 64322 },
+ { 0x2190, 64325 },
+ { 0x21E4, 64327 },
+ { 0x21B9, 64331 },
+ { 0x291D, 64340 },
+ { 0x21A4, 64345 },
+ { 0x291F, 64349 },
+ { 0x21C6, 64356 },
+ { 0x2B11, 64361 },
+ { 0x2B10, 64366 },
+ { 0x21A9, 64371 },
+ { 0x21AB, 64375 },
+ { 0x2946, 64379 },
+ { 0x21A2, 64384 },
+ { 0x2B3A, 64388 },
+ { 0x2B39, 64396 },
+ { 0x2B38, 64403 },
+ { 0x21FA, 64408 },
+ { 0x219A, 64414 },
+ { 0x21F7, 64418 },
+ { 0x2943, 64423 },
+ { 0x2973, 64429 },
+ { 0x2B4A, 64434 },
+ { 0x2B4B, 64440 },
+ { 0x2B42, 64446 },
+ { 0x2B3E, 64453 },
+ { 0x297A, 64457 },
+ { 0x2977, 64461 },
+ { 0x2B05, 64465 },
+ { 0x21E6, 64468 },
+ { 0x21E0, 64471 },
+ { 0x290C, 64474 },
+ { 0x21D0, 64478 },
+ { 0x2906, 64481 },
+ { 0x21CD, 64486 },
+ { 0x2902, 64491 },
+ { 0x291B, 64497 },
+ { 0x21C7, 64500 },
+ { 0x290E, 64503 },
+ { 0x21DA, 64507 },
+ { 0x21CB, 64510 },
+ { 0x2952, 64515 },
+ { 0x295A, 64522 },
+ { 0x296A, 64529 },
+ { 0x2962, 64537 },
+ { 0x2966, 64548 },
+ { 0x2956, 64559 },
+ { 0x295E, 64566 },
+ { 0x2967, 64573 },
+ { 0x296B, 64584 },
+ { 0x21BC, 64592 },
+ { 0x21BD, 64597 },
+ { 0x21DC, 64602 },
+ { 0x2B45, 64605 },
+ { 0x2919, 64608 },
+ { 0x2B36, 64610 },
+ { 0x2B3B, 64615 },
+ { 0x2B3D, 64620 },
+ { 0x2B3C, 64629 },
+ { 0x2B35, 64637 },
+ { 0x2B34, 64644 },
+ { 0x2B37, 64650 },
+ { 0x21FD, 64655 },
+ { 0x2264, 64658 },
+ { 0x2A7D, 64662 },
+ { 0x2A81, 64667 },
+ { 0x2A83, 64675 },
+ { 0x2A7F, 64684 },
+ { 0x2272, 64692 },
+ { 0x2A85, 64696 },
+ { 0x2276, 64699 },
+ { 0x2A89, 64702 },
+ { 0x2A87, 64706 },
+ { 0x2268, 64712 },
+ { 0x22E6, 64717 },
+ { 0x2266, 64722 },
+ { 0x003C, 64726 },
+ { 0x22D6, 64728 },
+ { 0x2A79, 64731 },
+ { 0x2A7B, 64735 },
+ { 0x2A8D, 64740 },
+ { 0x2A8F, 64745 },
+ { 0x2A93, 64750 },
+ { 0x2976, 64759 },
+ { 0x2A8B, 64763 },
+ { 0x2A91, 64769 },
+ { 0x22DA, 64775 },
+ { 0x2AA6, 64780 },
+ { 0x2AA8, 64784 },
+ { 0x2607, 64791 },
+ { 0x0D57, 64792 },
+ { 0x0D79, 64796 },
+ { 0x0D4D, 64799 },
+ { 0x0D03, 64802 },
+ { 0x0D02, 64805 },
+ { 0x0D3D, 64808 },
+ { 0x0D67, 64811 },
+ { 0x0D6C, 64814 },
+ { 0x0D68, 64817 },
+ { 0x0D6B, 64820 },
+ { 0x0D6A, 64823 },
+ { 0x0D6F, 64826 },
+ { 0x0D66, 64829 },
+ { 0x0D6E, 64832 },
+ { 0x0D6D, 64835 },
+ { 0x0D69, 64838 },
+ { 0x0D46, 64841 },
+ { 0x0D3F, 64845 },
+ { 0x0D4A, 64849 },
+ { 0x0D41, 64853 },
+ { 0x0D3E, 64857 },
+ { 0x0D48, 64861 },
+ { 0x0D4C, 64865 },
+ { 0x0D47, 64869 },
+ { 0x0D40, 64873 },
+ { 0x0D4B, 64877 },
+ { 0x0D42, 64881 },
+ { 0x0D62, 64885 },
+ { 0x0D43, 64890 },
+ { 0x0D63, 64895 },
+ { 0x0D44, 64900 },
+ { 0x0D05, 64905 },
+ { 0x0D0E, 64908 },
+ { 0x0D07, 64911 },
+ { 0x0D12, 64914 },
+ { 0x0D09, 64917 },
+ { 0x0D06, 64920 },
+ { 0x0D10, 64923 },
+ { 0x0D14, 64926 },
+ { 0x0D2C, 64929 },
+ { 0x0D1A, 64932 },
+ { 0x0D26, 64935 },
+ { 0x0D0F, 64938 },
+ { 0x0D17, 64941 },
+ { 0x0D39, 64944 },
+ { 0x0D08, 64947 },
+ { 0x0D1C, 64950 },
+ { 0x0D15, 64953 },
+ { 0x0D32, 64956 },
+ { 0x0D2E, 64959 },
+ { 0x0D28, 64962 },
+ { 0x0D13, 64965 },
+ { 0x0D2A, 64968 },
+ { 0x0D30, 64971 },
+ { 0x0D38, 64974 },
+ { 0x0D24, 64977 },
+ { 0x0D0A, 64980 },
+ { 0x0D35, 64983 },
+ { 0x0D2F, 64986 },
+ { 0x0D2D, 64989 },
+ { 0x0D1B, 64992 },
+ { 0x0D21, 64995 },
+ { 0x0D27, 64998 },
+ { 0x0D18, 65001 },
+ { 0x0D1D, 65004 },
+ { 0x0D16, 65007 },
+ { 0x0D33, 65010 },
+ { 0x0D19, 65013 },
+ { 0x0D23, 65016 },
+ { 0x0D1E, 65019 },
+ { 0x0D2B, 65022 },
+ { 0x0D31, 65025 },
+ { 0x0D36, 65028 },
+ { 0x0D37, 65031 },
+ { 0x0D25, 65034 },
+ { 0x0D1F, 65037 },
+ { 0x0D22, 65040 },
+ { 0x0D34, 65043 },
+ { 0x0D20, 65046 },
+ { 0x0D7F, 65049 },
+ { 0x0D7D, 65053 },
+ { 0x0D7B, 65057 },
+ { 0x0D7E, 65061 },
+ { 0x0D7A, 65065 },
+ { 0x0D7C, 65069 },
+ { 0x0D0C, 65073 },
+ { 0x0D0B, 65077 },
+ { 0x0D61, 65081 },
+ { 0x0D60, 65085 },
+ { 0x0D71, 65089 },
+ { 0x0D72, 65093 },
+ { 0x0D70, 65097 },
+ { 0x0D74, 65100 },
+ { 0x0D73, 65104 },
+ { 0x0D75, 65108 },
+ { 0x00BA, 65112 },
+ { 0x1805, 65115 },
+ { 0x180B, 65118 },
+ { 0x180C, 65123 },
+ { 0x180D, 65128 },
+ { 0x1803, 65133 },
+ { 0x1807, 65136 },
+ { 0x1806, 65141 },
+ { 0x1800, 65145 },
+ { 0x1804, 65147 },
+ { 0x1802, 65149 },
+ { 0x1811, 65151 },
+ { 0x1816, 65154 },
+ { 0x1812, 65157 },
+ { 0x1815, 65160 },
+ { 0x1814, 65163 },
+ { 0x1819, 65166 },
+ { 0x1810, 65169 },
+ { 0x1818, 65172 },
+ { 0x1817, 65175 },
+ { 0x1813, 65178 },
+ { 0x180E, 65181 },
+ { 0x1820, 65184 },
+ { 0x1821, 65187 },
+ { 0x1822, 65190 },
+ { 0x1823, 65193 },
+ { 0x1824, 65196 },
+ { 0x182A, 65199 },
+ { 0x1833, 65202 },
+ { 0x1827, 65205 },
+ { 0x1839, 65208 },
+ { 0x182D, 65211 },
+ { 0x1835, 65214 },
+ { 0x183A, 65217 },
+ { 0x182F, 65220 },
+ { 0x182E, 65223 },
+ { 0x1828, 65226 },
+ { 0x1825, 65229 },
+ { 0x182B, 65232 },
+ { 0x182C, 65235 },
+ { 0x1837, 65238 },
+ { 0x1830, 65241 },
+ { 0x1832, 65244 },
+ { 0x1826, 65247 },
+ { 0x1838, 65250 },
+ { 0x1836, 65253 },
+ { 0x183D, 65256 },
+ { 0x1887, 65259 },
+ { 0x1888, 65264 },
+ { 0x1897, 65269 },
+ { 0x188B, 65274 },
+ { 0x1891, 65279 },
+ { 0x1889, 65284 },
+ { 0x1892, 65289 },
+ { 0x1890, 65294 },
+ { 0x1896, 65299 },
+ { 0x188E, 65304 },
+ { 0x188A, 65309 },
+ { 0x188F, 65314 },
+ { 0x1893, 65319 },
+ { 0x1894, 65324 },
+ { 0x188C, 65329 },
+ { 0x1895, 65334 },
+ { 0x18A6, 65339 },
+ { 0x18A7, 65345 },
+ { 0x188D, 65351 },
+ { 0x1886, 65356 },
+ { 0x1885, 65362 },
+ { 0x1882, 65367 },
+ { 0x18A9, 65372 },
+ { 0x1883, 65377 },
+ { 0x1881, 65382 },
+ { 0x1880, 65388 },
+ { 0x1884, 65394 },
+ { 0x1829, 65400 },
+ { 0x1834, 65403 },
+ { 0x1842, 65406 },
+ { 0x183E, 65409 },
+ { 0x183B, 65412 },
+ { 0x1840, 65415 },
+ { 0x1831, 65418 },
+ { 0x183C, 65421 },
+ { 0x1841, 65424 },
+ { 0x183F, 65427 },
+ { 0x185D, 65430 },
+ { 0x185E, 65434 },
+ { 0x1861, 65438 },
+ { 0x1869, 65442 },
+ { 0x186B, 65446 },
+ { 0x1864, 65450 },
+ { 0x1865, 65454 },
+ { 0x185F, 65458 },
+ { 0x186A, 65462 },
+ { 0x1863, 65466 },
+ { 0x1866, 65470 },
+ { 0x1868, 65474 },
+ { 0x1860, 65478 },
+ { 0x186F, 65482 },
+ { 0x1862, 65486 },
+ { 0x1871, 65490 },
+ { 0x186C, 65494 },
+ { 0x186D, 65498 },
+ { 0x1870, 65502 },
+ { 0x1867, 65506 },
+ { 0x186E, 65510 },
+ { 0x1872, 65514 },
+ { 0x1844, 65518 },
+ { 0x1845, 65522 },
+ { 0x1846, 65526 },
+ { 0x1847, 65530 },
+ { 0x184B, 65534 },
+ { 0x1851, 65538 },
+ { 0x184E, 65542 },
+ { 0x1853, 65546 },
+ { 0x1857, 65550 },
+ { 0x184F, 65554 },
+ { 0x1848, 65558 },
+ { 0x184C, 65562 },
+ { 0x184D, 65566 },
+ { 0x1850, 65570 },
+ { 0x1849, 65574 },
+ { 0x1856, 65578 },
+ { 0x1855, 65582 },
+ { 0x1898, 65586 },
+ { 0x1899, 65592 },
+ { 0x184A, 65598 },
+ { 0x1852, 65602 },
+ { 0x185C, 65606 },
+ { 0x1858, 65610 },
+ { 0x1859, 65614 },
+ { 0x185A, 65618 },
+ { 0x185B, 65622 },
+ { 0x1854, 65626 },
+ { 0x1843, 65630 },
+ { 0x1873, 65636 },
+ { 0x1876, 65640 },
+ { 0x1874, 65644 },
+ { 0x1875, 65648 },
+ { 0x189C, 65652 },
+ { 0x18A0, 65658 },
+ { 0x18A5, 65664 },
+ { 0x18A8, 65670 },
+ { 0x18A3, 65676 },
+ { 0x18A1, 65682 },
+ { 0x189A, 65688 },
+ { 0x189D, 65694 },
+ { 0x18AA, 65700 },
+ { 0x189B, 65706 },
+ { 0x18A2, 65712 },
+ { 0x189E, 65718 },
+ { 0x18A4, 65724 },
+ { 0x189F, 65730 },
+ { 0x1877, 65736 },
+ { 0x1809, 65740 },
+ { 0x1808, 65744 },
+ { 0x180A, 65747 },
+ { 0x1801, 65749 },
+ { 0x2029, 65751 },
+ { 0x267E, 65753 },
+ { 0x22D4, 65756 },
+ { 0x2ADA, 65757 },
+ { 0x2057, 65761 },
+ { 0x2A0C, 65763 },
+ { 0x0022, 65766 },
+ { 0x2673, 65768 },
+ { 0x2674, 65773 },
+ { 0x2675, 65778 },
+ { 0x2676, 65783 },
+ { 0x2677, 65788 },
+ { 0x2678, 65793 },
+ { 0x2679, 65798 },
+ { 0x267A, 65803 },
+ { 0x203B, 65808 },
+ { 0x2A3D, 65810 },
+ { 0x003B, 65813 },
+ { 0x2744, 65814 },
+ { 0x2222, 65815 },
+ { 0x29A1, 65817 },
+ { 0x29A0, 65821 },
+ { 0x2081, 65825 },
+ { 0x2086, 65827 },
+ { 0x2082, 65829 },
+ { 0x2085, 65831 },
+ { 0x2084, 65833 },
+ { 0x208D, 65835 },
+ { 0x2089, 65838 },
+ { 0x208A, 65840 },
+ { 0x2080, 65843 },
+ { 0x2088, 65845 },
+ { 0x208B, 65847 },
+ { 0x208E, 65849 },
+ { 0x2087, 65852 },
+ { 0x2083, 65854 },
+ { 0x208C, 65856 },
+ { 0x23B2, 65859 },
+ { 0x2A0B, 65861 },
+ { 0x23B3, 65864 },
+ { 0x1BAA, 65866 },
+ { 0x1B80, 65869 },
+ { 0x1B81, 65872 },
+ { 0x1B82, 65875 },
+ { 0x1BB1, 65878 },
+ { 0x1BB6, 65881 },
+ { 0x1BB2, 65884 },
+ { 0x1BB5, 65887 },
+ { 0x1BB4, 65890 },
+ { 0x1BB9, 65893 },
+ { 0x1BB0, 65896 },
+ { 0x1BB8, 65899 },
+ { 0x1BB7, 65902 },
+ { 0x1BB3, 65905 },
+ { 0x1BA8, 65908 },
+ { 0x1BA5, 65912 },
+ { 0x1BA4, 65916 },
+ { 0x1BA7, 65920 },
+ { 0x1BA6, 65924 },
+ { 0x1BA9, 65928 },
+ { 0x1B83, 65932 },
+ { 0x1B88, 65935 },
+ { 0x1B84, 65938 },
+ { 0x1B87, 65941 },
+ { 0x1B85, 65944 },
+ { 0x1B86, 65947 },
+ { 0x1B98, 65950 },
+ { 0x1B8E, 65953 },
+ { 0x1B93, 65956 },
+ { 0x1B89, 65959 },
+ { 0x1B96, 65962 },
+ { 0x1B8C, 65965 },
+ { 0x1BA0, 65968 },
+ { 0x1B8F, 65971 },
+ { 0x1B8A, 65974 },
+ { 0x1B9C, 65977 },
+ { 0x1B99, 65980 },
+ { 0x1B94, 65983 },
+ { 0x1B95, 65986 },
+ { 0x1B8B, 65989 },
+ { 0x1B9B, 65992 },
+ { 0x1B9E, 65995 },
+ { 0x1B92, 65998 },
+ { 0x1B97, 66001 },
+ { 0x1B9D, 66004 },
+ { 0x1B9F, 66007 },
+ { 0x1B9A, 66010 },
+ { 0x1B90, 66013 },
+ { 0x1BAE, 66016 },
+ { 0x1B8D, 66019 },
+ { 0x1B91, 66022 },
+ { 0x1BAF, 66025 },
+ { 0x1BA3, 66028 },
+ { 0x1BA2, 66032 },
+ { 0x1BA1, 66036 },
+ { 0x2121, 66040 },
+ { 0x2706, 66042 },
+ { 0x2315, 66045 },
+ { 0x9353, 66047 },
+ { 0x931D, 66052 },
+ { 0x932D, 66055 },
+ { 0x9323, 66060 },
+ { 0x931C, 66064 },
+ { 0x9307, 66067 },
+ { 0x9343, 66071 },
+ { 0x932F, 66074 },
+ { 0x9346, 66079 },
+ { 0x9308, 66082 },
+ { 0x9314, 66085 },
+ { 0x9331, 66088 },
+ { 0x933B, 66091 },
+ { 0x9344, 66094 },
+ { 0x930C, 66097 },
+ { 0x9306, 66100 },
+ { 0x9321, 66103 },
+ { 0x933D, 66106 },
+ { 0x9320, 66110 },
+ { 0x9336, 66113 },
+ { 0x9325, 66116 },
+ { 0x932A, 66119 },
+ { 0x9335, 66122 },
+ { 0x9319, 66125 },
+ { 0x9309, 66128 },
+ { 0x934F, 66131 },
+ { 0x9315, 66134 },
+ { 0x9349, 66137 },
+ { 0x9350, 66140 },
+ { 0x9316, 66143 },
+ { 0x930A, 66147 },
+ { 0x9327, 66151 },
+ { 0x9340, 66154 },
+ { 0x9339, 66157 },
+ { 0x9324, 66160 },
+ { 0x9334, 66163 },
+ { 0x931A, 66166 },
+ { 0x9345, 66169 },
+ { 0x9317, 66172 },
+ { 0x933A, 66175 },
+ { 0x932B, 66178 },
+ { 0x934D, 66181 },
+ { 0x9312, 66184 },
+ { 0x932E, 66187 },
+ { 0x934C, 66190 },
+ { 0x9329, 66193 },
+ { 0x9337, 66196 },
+ { 0x930E, 66201 },
+ { 0x9326, 66205 },
+ { 0x9338, 66208 },
+ { 0x9348, 66211 },
+ { 0x9347, 66214 },
+ { 0x931F, 66217 },
+ { 0x9318, 66220 },
+ { 0x9356, 66223 },
+ { 0x9328, 66226 },
+ { 0x933F, 66229 },
+ { 0x9332, 66233 },
+ { 0x9355, 66236 },
+ { 0x932C, 66239 },
+ { 0x934B, 66242 },
+ { 0x934E, 66245 },
+ { 0x9352, 66248 },
+ { 0x931E, 66251 },
+ { 0x9310, 66254 },
+ { 0x9330, 66257 },
+ { 0x934A, 66260 },
+ { 0x930D, 66263 },
+ { 0x931B, 66266 },
+ { 0x9351, 66269 },
+ { 0x930B, 66272 },
+ { 0x9333, 66275 },
+ { 0x933E, 66278 },
+ { 0x9313, 66281 },
+ { 0x9341, 66284 },
+ { 0x9322, 66287 },
+ { 0x9354, 66290 },
+ { 0x933C, 66293 },
+ { 0x9311, 66296 },
+ { 0x930F, 66299 },
+ { 0x9342, 66304 },
+ { 0x2234, 66307 },
+ { 0x2672, 66308 },
+ { 0x26AF, 66311 },
+ { 0x6E00, 66314 },
+ { 0x6E01, 66316 },
+ { 0x6E02, 66318 },
+ { 0x6E03, 66320 },
+ { 0x6E04, 66322 },
+ { 0x6E05, 66324 },
+ { 0x6E06, 66326 },
+ { 0x6E07, 66328 },
+ { 0x6E08, 66330 },
+ { 0x6E09, 66332 },
+ { 0x6E0A, 66334 },
+ { 0x6E0B, 66336 },
+ { 0x6E0C, 66338 },
+ { 0x6E0D, 66340 },
+ { 0x6E0E, 66342 },
+ { 0x6E0F, 66344 },
+ { 0xC100, 66346 },
+ { 0xC101, 66348 },
+ { 0xC102, 66350 },
+ { 0xC103, 66352 },
+ { 0xC104, 66354 },
+ { 0xC105, 66356 },
+ { 0xC106, 66358 },
+ { 0xC107, 66360 },
+ { 0xC108, 66362 },
+ { 0xC109, 66364 },
+ { 0xC10A, 66366 },
+ { 0xC10B, 66368 },
+ { 0xC10C, 66370 },
+ { 0xC10D, 66372 },
+ { 0xC10E, 66374 },
+ { 0xC10F, 66376 },
+ { 0xC110, 66378 },
+ { 0xC111, 66380 },
+ { 0xC112, 66382 },
+ { 0xC113, 66384 },
+ { 0xC114, 66386 },
+ { 0xC115, 66388 },
+ { 0xC116, 66390 },
+ { 0xC117, 66392 },
+ { 0xC118, 66394 },
+ { 0xC119, 66396 },
+ { 0xC11A, 66398 },
+ { 0xC11B, 66400 },
+ { 0xC11C, 66402 },
+ { 0xC11D, 66404 },
+ { 0xC11E, 66406 },
+ { 0xC11F, 66408 },
+ { 0xC120, 66410 },
+ { 0xC121, 66412 },
+ { 0xC122, 66414 },
+ { 0xC123, 66416 },
+ { 0xC124, 66418 },
+ { 0xC125, 66420 },
+ { 0xC126, 66422 },
+ { 0xC127, 66424 },
+ { 0xC128, 66426 },
+ { 0xC129, 66428 },
+ { 0xC12A, 66430 },
+ { 0xC12B, 66432 },
+ { 0xC12C, 66434 },
+ { 0xC12D, 66436 },
+ { 0xC12E, 66438 },
+ { 0xC12F, 66440 },
+ { 0xC130, 66442 },
+ { 0xC131, 66444 },
+ { 0xC132, 66446 },
+ { 0xC133, 66448 },
+ { 0xC134, 66450 },
+ { 0xC135, 66452 },
+ { 0xC136, 66454 },
+ { 0xC137, 66456 },
+ { 0xC138, 66458 },
+ { 0xC139, 66460 },
+ { 0xC13A, 66462 },
+ { 0xC13B, 66464 },
+ { 0xC13C, 66466 },
+ { 0xC13D, 66468 },
+ { 0xC13E, 66470 },
+ { 0xC13F, 66472 },
+ { 0xC140, 66474 },
+ { 0xC141, 66476 },
+ { 0xC142, 66478 },
+ { 0xC143, 66480 },
+ { 0xC144, 66482 },
+ { 0xC145, 66484 },
+ { 0xC146, 66486 },
+ { 0xC147, 66488 },
+ { 0xC148, 66490 },
+ { 0xC149, 66492 },
+ { 0xC14A, 66494 },
+ { 0xC14B, 66496 },
+ { 0xC14C, 66498 },
+ { 0xC14D, 66500 },
+ { 0xC14E, 66502 },
+ { 0xC14F, 66504 },
+ { 0xC150, 66506 },
+ { 0xC151, 66508 },
+ { 0xC152, 66510 },
+ { 0xC153, 66512 },
+ { 0xC154, 66514 },
+ { 0xC155, 66516 },
+ { 0xC156, 66518 },
+ { 0xC157, 66520 },
+ { 0xC158, 66522 },
+ { 0xC159, 66524 },
+ { 0xC15A, 66526 },
+ { 0xC15B, 66528 },
+ { 0xC15C, 66530 },
+ { 0xC15D, 66532 },
+ { 0xC15E, 66534 },
+ { 0xC15F, 66536 },
+ { 0xC160, 66538 },
+ { 0xC161, 66540 },
+ { 0xC162, 66542 },
+ { 0xC163, 66544 },
+ { 0xC164, 66546 },
+ { 0xC165, 66548 },
+ { 0xC166, 66550 },
+ { 0xC167, 66552 },
+ { 0xC168, 66554 },
+ { 0xC169, 66556 },
+ { 0xC16A, 66558 },
+ { 0xC16B, 66560 },
+ { 0xC16C, 66562 },
+ { 0xC16D, 66564 },
+ { 0xC16E, 66566 },
+ { 0xC16F, 66568 },
+ { 0xC170, 66570 },
+ { 0xC171, 66572 },
+ { 0xC172, 66574 },
+ { 0xC173, 66576 },
+ { 0xC174, 66578 },
+ { 0xC175, 66580 },
+ { 0xC176, 66582 },
+ { 0xC177, 66584 },
+ { 0xC178, 66586 },
+ { 0xC179, 66588 },
+ { 0xC17A, 66590 },
+ { 0xC17B, 66592 },
+ { 0xC17C, 66594 },
+ { 0xC17D, 66596 },
+ { 0xC17E, 66598 },
+ { 0xC17F, 66600 },
+ { 0xC180, 66602 },
+ { 0xC181, 66604 },
+ { 0xC182, 66606 },
+ { 0xC183, 66608 },
+ { 0xC184, 66610 },
+ { 0xC185, 66612 },
+ { 0xC186, 66614 },
+ { 0xC187, 66616 },
+ { 0xC188, 66618 },
+ { 0xC189, 66620 },
+ { 0xC18A, 66622 },
+ { 0xC18B, 66624 },
+ { 0xC18C, 66626 },
+ { 0xC18D, 66628 },
+ { 0xC18E, 66630 },
+ { 0xC18F, 66632 },
+ { 0xC190, 66634 },
+ { 0xC191, 66636 },
+ { 0xC192, 66638 },
+ { 0xC193, 66640 },
+ { 0xC194, 66642 },
+ { 0xC195, 66644 },
+ { 0xC196, 66646 },
+ { 0xC197, 66648 },
+ { 0xC198, 66650 },
+ { 0xC199, 66652 },
+ { 0xC19A, 66654 },
+ { 0xC19B, 66656 },
+ { 0xC19C, 66658 },
+ { 0xC19D, 66660 },
+ { 0xC19E, 66662 },
+ { 0xC19F, 66664 },
+ { 0xC1A0, 66666 },
+ { 0xC1A1, 66668 },
+ { 0xC1A2, 66670 },
+ { 0xC1A3, 66672 },
+ { 0xC1A4, 66674 },
+ { 0xC1A5, 66676 },
+ { 0xC1A6, 66678 },
+ { 0xC1A7, 66680 },
+ { 0xC1A8, 66682 },
+ { 0xC1A9, 66684 },
+ { 0xC1AA, 66686 },
+ { 0xC1AB, 66688 },
+ { 0xC1AC, 66690 },
+ { 0xC1AD, 66692 },
+ { 0xC1AE, 66694 },
+ { 0xC1AF, 66696 },
+ { 0xC1B0, 66698 },
+ { 0xC1B1, 66700 },
+ { 0xC1B2, 66702 },
+ { 0xC1B3, 66704 },
+ { 0xC1B4, 66706 },
+ { 0xC1B5, 66708 },
+ { 0xC1B6, 66710 },
+ { 0xC1B7, 66712 },
+ { 0xC1B8, 66714 },
+ { 0xC1B9, 66716 },
+ { 0xC1BA, 66718 },
+ { 0xC1BB, 66720 },
+ { 0xC1BC, 66722 },
+ { 0xC1BD, 66724 },
+ { 0xC1BE, 66726 },
+ { 0xC1BF, 66728 },
+ { 0xC1C0, 66730 },
+ { 0xC1C1, 66732 },
+ { 0xC1C2, 66734 },
+ { 0xC1C3, 66736 },
+ { 0xC1C4, 66738 },
+ { 0xC1C5, 66740 },
+ { 0xC1C6, 66742 },
+ { 0xC1C7, 66744 },
+ { 0xC1C8, 66746 },
+ { 0xC1C9, 66748 },
+ { 0xC1CA, 66750 },
+ { 0xC1CB, 66752 },
+ { 0xC1CC, 66754 },
+ { 0xC1CD, 66756 },
+ { 0xC1CE, 66758 },
+ { 0xC1CF, 66760 },
+ { 0xC1D0, 66762 },
+ { 0xC1D1, 66764 },
+ { 0xC1D2, 66766 },
+ { 0xC1D3, 66768 },
+ { 0xC1D4, 66770 },
+ { 0xC1D5, 66772 },
+ { 0xC1D6, 66774 },
+ { 0xC1D7, 66776 },
+ { 0xC1D8, 66778 },
+ { 0xC1D9, 66780 },
+ { 0xC1DA, 66782 },
+ { 0xC1DB, 66784 },
+ { 0xC1DC, 66786 },
+ { 0xC1DD, 66788 },
+ { 0xC1DE, 66790 },
+ { 0xC1DF, 66792 },
+ { 0xC1E0, 66794 },
+ { 0xC1E1, 66796 },
+ { 0xC1E2, 66798 },
+ { 0xC1E3, 66800 },
+ { 0xC1E4, 66802 },
+ { 0xC1E5, 66804 },
+ { 0xC1E6, 66806 },
+ { 0xC1E7, 66808 },
+ { 0xC1E8, 66810 },
+ { 0xC1E9, 66812 },
+ { 0xC1EA, 66814 },
+ { 0xC1EB, 66816 },
+ { 0xC1EC, 66818 },
+ { 0xC1ED, 66820 },
+ { 0xC1EE, 66822 },
+ { 0xC1EF, 66824 },
+ { 0x0027, 66826 },
+ { 0x2250, 66827 },
+ { 0x6E4E, 66830 },
+ { 0x6E4A, 66833 },
+ { 0x005E, 66835 },
+ { 0x0040, 66837 },
+ { 0x2052, 66839 },
+ { 0x2201, 66842 },
+ { 0x2381, 66843 },
+ { 0x260B, 66846 },
+ { 0x0950, 66848 },
+ { 0x0971, 66850 },
+ { 0x093C, 66855 },
+ { 0x094D, 66858 },
+ { 0x0903, 66861 },
+ { 0x0902, 66864 },
+ { 0x093D, 66867 },
+ { 0x0901, 66870 },
+ { 0x0954, 66873 },
+ { 0x0964, 66876 },
+ { 0x0967, 66878 },
+ { 0x096C, 66881 },
+ { 0x0968, 66884 },
+ { 0x096B, 66887 },
+ { 0x096A, 66890 },
+ { 0x096F, 66893 },
+ { 0x0966, 66896 },
+ { 0x096E, 66899 },
+ { 0x096D, 66902 },
+ { 0x0969, 66905 },
+ { 0x0953, 66908 },
+ { 0x0947, 66911 },
+ { 0x093F, 66915 },
+ { 0x094B, 66919 },
+ { 0x0941, 66923 },
+ { 0x093E, 66927 },
+ { 0x0948, 66931 },
+ { 0x094C, 66935 },
+ { 0x0940, 66939 },
+ { 0x0942, 66943 },
+ { 0x0946, 66947 },
+ { 0x094A, 66952 },
+ { 0x0945, 66957 },
+ { 0x0949, 66962 },
+ { 0x0962, 66967 },
+ { 0x0943, 66972 },
+ { 0x0963, 66977 },
+ { 0x0944, 66982 },
+ { 0x0965, 66987 },
+ { 0x0905, 66990 },
+ { 0x090F, 66993 },
+ { 0x0907, 66996 },
+ { 0x0913, 66999 },
+ { 0x0909, 67002 },
+ { 0x0906, 67005 },
+ { 0x0910, 67008 },
+ { 0x0914, 67011 },
+ { 0x092C, 67014 },
+ { 0x091A, 67017 },
+ { 0x0926, 67020 },
+ { 0x095E, 67023 },
+ { 0x0917, 67026 },
+ { 0x0939, 67029 },
+ { 0x0908, 67032 },
+ { 0x091C, 67035 },
+ { 0x0915, 67038 },
+ { 0x0932, 67041 },
+ { 0x092E, 67044 },
+ { 0x0928, 67047 },
+ { 0x092A, 67050 },
+ { 0x0958, 67053 },
+ { 0x0930, 67056 },
+ { 0x0938, 67059 },
+ { 0x0924, 67062 },
+ { 0x090A, 67065 },
+ { 0x0935, 67068 },
+ { 0x092F, 67071 },
+ { 0x095B, 67074 },
+ { 0x097F, 67077 },
+ { 0x092D, 67080 },
+ { 0x091B, 67083 },
+ { 0x0921, 67086 },
+ { 0x0927, 67089 },
+ { 0x097B, 67092 },
+ { 0x0918, 67095 },
+ { 0x091D, 67098 },
+ { 0x097C, 67101 },
+ { 0x0916, 67104 },
+ { 0x0933, 67107 },
+ { 0x0919, 67110 },
+ { 0x0923, 67113 },
+ { 0x091E, 67116 },
+ { 0x092B, 67119 },
+ { 0x095D, 67122 },
+ { 0x0931, 67125 },
+ { 0x0936, 67128 },
+ { 0x0937, 67131 },
+ { 0x0925, 67134 },
+ { 0x091F, 67137 },
+ { 0x095F, 67140 },
+ { 0x097E, 67143 },
+ { 0x0922, 67146 },
+ { 0x095A, 67149 },
+ { 0x0959, 67152 },
+ { 0x0934, 67155 },
+ { 0x0929, 67158 },
+ { 0x0920, 67161 },
+ { 0x095C, 67164 },
+ { 0x0904, 67167 },
+ { 0x090E, 67171 },
+ { 0x0912, 67175 },
+ { 0x0972, 67179 },
+ { 0x090D, 67183 },
+ { 0x0911, 67187 },
+ { 0x097D, 67191 },
+ { 0x090C, 67195 },
+ { 0x090B, 67199 },
+ { 0x0961, 67203 },
+ { 0x0960, 67207 },
+ { 0x0951, 67211 },
+ { 0x0952, 67215 },
+ { 0x0970, 67219 },
+ { 0x224F, 67222 },
+ { 0x23E7, 67224 },
+ { 0x224D, 67226 },
+ { 0x2A78, 67228 },
+ { 0x2C3B, 67233 },
+ { 0x2C4A, 67237 },
+ { 0x2C56, 67241 },
+ { 0x2C53, 67245 },
+ { 0x2C30, 67249 },
+ { 0x2C58, 67253 },
+ { 0x2C41, 67258 },
+ { 0x2C49, 67262 },
+ { 0x2C4E, 67266 },
+ { 0x2C4C, 67270 },
+ { 0x2C46, 67274 },
+ { 0x2C31, 67278 },
+ { 0x2C5A, 67282 },
+ { 0x2C48, 67286 },
+ { 0x2C39, 67290 },
+ { 0x2C3D, 67294 },
+ { 0x2C4B, 67298 },
+ { 0x2C32, 67302 },
+ { 0x2C51, 67306 },
+ { 0x2C50, 67310 },
+ { 0x2C4F, 67314 },
+ { 0x2C34, 67318 },
+ { 0x2C37, 67322 },
+ { 0x2C47, 67326 },
+ { 0x2C40, 67330 },
+ { 0x2C43, 67334 },
+ { 0x2C44, 67338 },
+ { 0x2C54, 67342 },
+ { 0x2C55, 67347 },
+ { 0x2C35, 67354 },
+ { 0x2C4D, 67358 },
+ { 0x2C3C, 67362 },
+ { 0x2C42, 67366 },
+ { 0x2C45, 67370 },
+ { 0x2C38, 67374 },
+ { 0x2C33, 67378 },
+ { 0x2C3A, 67382 },
+ { 0x2C59, 67387 },
+ { 0x2C57, 67393 },
+ { 0x2C5B, 67399 },
+ { 0x2C3E, 67403 },
+ { 0x2C3F, 67407 },
+ { 0x2C5C, 67411 },
+ { 0x2C52, 67415 },
+ { 0x2C36, 67420 },
+ { 0x2C5E, 67424 },
+ { 0x2C5D, 67429 },
+ { 0x2C0B, 67434 },
+ { 0x2C1A, 67438 },
+ { 0x2C26, 67442 },
+ { 0x2C23, 67446 },
+ { 0x2C00, 67450 },
+ { 0x2C28, 67454 },
+ { 0x2C11, 67459 },
+ { 0x2C19, 67463 },
+ { 0x2C1E, 67467 },
+ { 0x2C1C, 67471 },
+ { 0x2C16, 67475 },
+ { 0x2C01, 67479 },
+ { 0x2C2A, 67483 },
+ { 0x2C18, 67487 },
+ { 0x2C09, 67491 },
+ { 0x2C0D, 67495 },
+ { 0x2C1B, 67499 },
+ { 0x2C02, 67503 },
+ { 0x2C21, 67507 },
+ { 0x2C20, 67511 },
+ { 0x2C1F, 67515 },
+ { 0x2C04, 67519 },
+ { 0x2C07, 67523 },
+ { 0x2C17, 67527 },
+ { 0x2C10, 67531 },
+ { 0x2C13, 67535 },
+ { 0x2C14, 67539 },
+ { 0x2C24, 67543 },
+ { 0x2C25, 67548 },
+ { 0x2C05, 67555 },
+ { 0x2C1D, 67559 },
+ { 0x2C0C, 67563 },
+ { 0x2C12, 67567 },
+ { 0x2C15, 67571 },
+ { 0x2C08, 67575 },
+ { 0x2C03, 67579 },
+ { 0x2C0A, 67583 },
+ { 0x2C29, 67588 },
+ { 0x2C27, 67594 },
+ { 0x2C2B, 67600 },
+ { 0x2C0E, 67604 },
+ { 0x2C0F, 67608 },
+ { 0x2C2C, 67612 },
+ { 0x2C22, 67616 },
+ { 0x2C06, 67621 },
+ { 0x2C2E, 67625 },
+ { 0x2C2D, 67630 },
+ { 0x223B, 67635 },
+ { 0x2015, 67636 },
+ { 0x23AF, 67638 },
+ { 0x26A9, 67641 },
+ { 0x23BA, 67646 },
+ { 0x23BB, 67649 },
+ { 0x23BC, 67652 },
+ { 0x23BD, 67655 },
+ { 0x2B23, 67658 },
+ { 0x2026, 67661 },
+ { 0x238E, 67663 },
+ { 0x29DC, 67665 },
+ { 0x7A38, 67667 },
+ { 0x7A3A, 67671 },
+ { 0x7A39, 67675 },
+ { 0x7A0D, 67678 },
+ { 0x7A0F, 67683 },
+ { 0x7A0E, 67686 },
+ { 0x7A40, 67689 },
+ { 0x7A41, 67692 },
+ { 0x7A43, 67695 },
+ { 0x7A42, 67698 },
+ { 0x7A05, 67701 },
+ { 0x7A01, 67705 },
+ { 0x7A06, 67709 },
+ { 0x7A02, 67713 },
+ { 0x7A03, 67717 },
+ { 0x7A0C, 67722 },
+ { 0x7A00, 67726 },
+ { 0x7A26, 67729 },
+ { 0x7A15, 67732 },
+ { 0x7A21, 67735 },
+ { 0x7A12, 67738 },
+ { 0x7A31, 67741 },
+ { 0x7A17, 67744 },
+ { 0x7A10, 67747 },
+ { 0x7A2B, 67750 },
+ { 0x7A28, 67753 },
+ { 0x7A23, 67756 },
+ { 0x7A24, 67759 },
+ { 0x7A2A, 67762 },
+ { 0x7A2F, 67765 },
+ { 0x7A1F, 67768 },
+ { 0x7A2C, 67771 },
+ { 0x7A29, 67774 },
+ { 0x7A30, 67777 },
+ { 0x7A27, 67780 },
+ { 0x7A16, 67783 },
+ { 0x7A1C, 67786 },
+ { 0x7A22, 67789 },
+ { 0x7A13, 67792 },
+ { 0x7A11, 67795 },
+ { 0x7A32, 67798 },
+ { 0x7A1E, 67801 },
+ { 0x7A19, 67804 },
+ { 0x7A25, 67807 },
+ { 0x7A2D, 67810 },
+ { 0x7A2E, 67813 },
+ { 0x7A20, 67816 },
+ { 0x7A1A, 67819 },
+ { 0x7A1D, 67822 },
+ { 0x7A1B, 67825 },
+ { 0x7A33, 67828 },
+ { 0x7A46, 67831 },
+ { 0x7A47, 67835 },
+ { 0x7A44, 67839 },
+ { 0x7A45, 67842 },
+ { 0x7A3F, 67845 },
+ { 0x7A50, 67847 },
+ { 0x7A56, 67850 },
+ { 0x7A58, 67853 },
+ { 0x7A55, 67856 },
+ { 0x7A51, 67859 },
+ { 0x7A52, 67863 },
+ { 0x7A57, 67866 },
+ { 0x7A53, 67870 },
+ { 0x7A54, 67874 },
+ { 0x238D, 67877 },
+ { 0x2ADD, 67879 },
+ { 0x260D, 67880 },
+ { 0x1736, 67881 },
+ { 0x1735, 67884 },
+ { 0x791F, 67887 },
+ { 0x7904, 67890 },
+ { 0x7910, 67893 },
+ { 0x790F, 67896 },
+ { 0x7900, 67899 },
+ { 0x7901, 67902 },
+ { 0x7907, 67905 },
+ { 0x790A, 67908 },
+ { 0x790C, 67911 },
+ { 0x790D, 67914 },
+ { 0x7912, 67917 },
+ { 0x7915, 67920 },
+ { 0x7908, 67923 },
+ { 0x7905, 67926 },
+ { 0x7909, 67929 },
+ { 0x7906, 67932 },
+ { 0x7903, 67935 },
+ { 0x7902, 67938 },
+ { 0x790B, 67941 },
+ { 0x7913, 67944 },
+ { 0x7911, 67947 },
+ { 0x790E, 67950 },
+ { 0x7914, 67953 },
+ { 0x7916, 67956 },
+ { 0x7919, 67959 },
+ { 0x7917, 67963 },
+ { 0x7918, 67966 },
+ { 0x00B1, 67969 },
+ { 0x2305, 67971 },
+ { 0x2237, 67972 },
+ { 0x2A16, 67973 },
+ { 0x225F, 67976 },
+ { 0x00AE, 67979 },
+ { 0x2938, 67981 },
+ { 0x21A0, 67985 },
+ { 0x219D, 67989 },
+ { 0x2192, 67992 },
+ { 0x21E5, 67994 },
+ { 0x291E, 67998 },
+ { 0x21A6, 68003 },
+ { 0x2920, 68007 },
+ { 0x21C4, 68014 },
+ { 0x2B0F, 68019 },
+ { 0x2B0E, 68024 },
+ { 0x21AA, 68029 },
+ { 0x21AC, 68033 },
+ { 0x2945, 68037 },
+ { 0x21A3, 68042 },
+ { 0x2915, 68046 },
+ { 0x2914, 68054 },
+ { 0x21B4, 68061 },
+ { 0x2911, 68066 },
+ { 0x21FB, 68071 },
+ { 0x219B, 68077 },
+ { 0x21F8, 68081 },
+ { 0x2942, 68086 },
+ { 0x2974, 68092 },
+ { 0x2975, 68097 },
+ { 0x2B4C, 68103 },
+ { 0x2B48, 68109 },
+ { 0x2947, 68116 },
+ { 0x2B44, 68120 },
+ { 0x2B43, 68124 },
+ { 0x21E8, 68128 },
+ { 0x21F0, 68131 },
+ { 0x21E2, 68136 },
+ { 0x290D, 68139 },
+ { 0x21D2, 68143 },
+ { 0x2907, 68146 },
+ { 0x21CF, 68151 },
+ { 0x2903, 68156 },
+ { 0x291C, 68162 },
+ { 0x21C9, 68165 },
+ { 0x290F, 68168 },
+ { 0x21DB, 68172 },
+ { 0x21CC, 68175 },
+ { 0x2953, 68180 },
+ { 0x295B, 68187 },
+ { 0x296C, 68194 },
+ { 0x2968, 68202 },
+ { 0x2964, 68213 },
+ { 0x2957, 68224 },
+ { 0x295F, 68231 },
+ { 0x2969, 68238 },
+ { 0x296D, 68249 },
+ { 0x21C0, 68257 },
+ { 0x21C1, 68262 },
+ { 0x21DD, 68267 },
+ { 0x2B46, 68270 },
+ { 0x291A, 68273 },
+ { 0x2905, 68275 },
+ { 0x2916, 68280 },
+ { 0x2918, 68285 },
+ { 0x2917, 68294 },
+ { 0x2901, 68302 },
+ { 0x2900, 68309 },
+ { 0x2910, 68315 },
+ { 0x21FE, 68320 },
+ { 0x58C4, 68323 },
+ { 0x5881, 68326 },
+ { 0x5880, 68329 },
+ { 0x58CE, 68332 },
+ { 0x58D1, 68334 },
+ { 0x58D6, 68337 },
+ { 0x58D2, 68340 },
+ { 0x58D5, 68343 },
+ { 0x58D4, 68346 },
+ { 0x58D9, 68349 },
+ { 0x58D0, 68352 },
+ { 0x58D8, 68355 },
+ { 0x58D7, 68358 },
+ { 0x58D3, 68361 },
+ { 0x58BE, 68364 },
+ { 0x58B6, 68368 },
+ { 0x58C1, 68372 },
+ { 0x58B8, 68376 },
+ { 0x58B5, 68380 },
+ { 0x58C0, 68384 },
+ { 0x58C3, 68388 },
+ { 0x58BF, 68392 },
+ { 0x58B7, 68396 },
+ { 0x58C2, 68400 },
+ { 0x58B9, 68404 },
+ { 0x58BC, 68408 },
+ { 0x58BA, 68413 },
+ { 0x58BD, 68418 },
+ { 0x58BB, 68423 },
+ { 0x58CF, 68428 },
+ { 0x5882, 68431 },
+ { 0x588C, 68434 },
+ { 0x5884, 68437 },
+ { 0x588F, 68440 },
+ { 0x5886, 68443 },
+ { 0x5883, 68446 },
+ { 0x588E, 68449 },
+ { 0x5891, 68452 },
+ { 0x58A8, 68455 },
+ { 0x5897, 68458 },
+ { 0x58A3, 68461 },
+ { 0x588D, 68464 },
+ { 0x5894, 68467 },
+ { 0x58B2, 68470 },
+ { 0x5885, 68473 },
+ { 0x5899, 68476 },
+ { 0x5892, 68479 },
+ { 0x58AD, 68482 },
+ { 0x58AA, 68485 },
+ { 0x58A5, 68488 },
+ { 0x5890, 68491 },
+ { 0x58A6, 68494 },
+ { 0x58AC, 68497 },
+ { 0x58B1, 68500 },
+ { 0x58A1, 68503 },
+ { 0x5887, 68506 },
+ { 0x58AE, 68509 },
+ { 0x58AB, 68512 },
+ { 0x58A9, 68515 },
+ { 0x5898, 68518 },
+ { 0x589E, 68521 },
+ { 0x58A4, 68524 },
+ { 0x5895, 68527 },
+ { 0x589A, 68530 },
+ { 0x5893, 68533 },
+ { 0x58B3, 68536 },
+ { 0x5896, 68539 },
+ { 0x58A0, 68542 },
+ { 0x589B, 68545 },
+ { 0x58A7, 68548 },
+ { 0x58AF, 68551 },
+ { 0x58B0, 68554 },
+ { 0x58A2, 68557 },
+ { 0x589C, 68560 },
+ { 0x589F, 68563 },
+ { 0x589D, 68566 },
+ { 0x588A, 68569 },
+ { 0x5888, 68573 },
+ { 0x588B, 68577 },
+ { 0x5889, 68581 },
+ { 0x58B4, 68585 },
+ { 0x2A32, 68589 },
+ { 0x237D, 68594 },
+ { 0x2006, 68597 },
+ { 0x2023, 68599 },
+ { 0x267F, 68601 },
+ { 0x2387, 68603 },
+ { 0x27AB, 68606 },
+ { 0x2A10, 68611 },
+ { 0x2384, 68613 },
+ { 0x260C, 68615 },
+ { 0x2258, 68616 },
+ { 0x2334, 68618 },
+ { 0x2335, 68619 },
+ { 0x2A99, 68620 },
+ { 0x2A9A, 68625 },
+ { 0x2A9B, 68630 },
+ { 0x2A9C, 68636 },
+ { 0x2AF9, 68642 },
+ { 0x2AFA, 68648 },
+ { 0x225A, 68654 },
+ { 0x0021, 68656 },
+ { 0x2049, 68658 },
+ { 0x2005, 68661 },
+ { 0x2027, 68663 },
+ { 0x3002, 68665 },
+ { 0x303F, 68668 },
+ { 0x3001, 68672 },
+ { 0x302A, 68674 },
+ { 0x3000, 68678 },
+ { 0x3007, 68680 },
+ { 0x302B, 68683 },
+ { 0x3006, 68687 },
+ { 0x302D, 68690 },
+ { 0x302C, 68694 },
+ { 0x3005, 68698 },
+ { 0x3037, 68701 },
+ { 0x33E0, 68707 },
+ { 0x33E5, 68713 },
+ { 0x33E9, 68719 },
+ { 0x33E1, 68725 },
+ { 0x33E4, 68731 },
+ { 0x33E3, 68737 },
+ { 0x33E8, 68743 },
+ { 0x33E7, 68749 },
+ { 0x33E6, 68755 },
+ { 0x33E2, 68761 },
+ { 0x33EA, 68767 },
+ { 0x33FD, 68773 },
+ { 0x33EB, 68779 },
+ { 0x33F3, 68785 },
+ { 0x33EE, 68791 },
+ { 0x33EF, 68797 },
+ { 0x33F1, 68803 },
+ { 0x33ED, 68809 },
+ { 0x33F2, 68815 },
+ { 0x33EC, 68821 },
+ { 0x33F0, 68827 },
+ { 0x33FE, 68833 },
+ { 0x33F4, 68839 },
+ { 0x33F9, 68845 },
+ { 0x33F5, 68851 },
+ { 0x33F8, 68857 },
+ { 0x33F7, 68863 },
+ { 0x33FC, 68869 },
+ { 0x33FB, 68875 },
+ { 0x33FA, 68881 },
+ { 0x33F6, 68887 },
+ { 0x32C4, 68893 },
+ { 0x3359, 68898 },
+ { 0x335E, 68904 },
+ { 0x3362, 68910 },
+ { 0x335A, 68916 },
+ { 0x335D, 68922 },
+ { 0x335C, 68928 },
+ { 0x3361, 68934 },
+ { 0x3358, 68940 },
+ { 0x3360, 68946 },
+ { 0x335F, 68952 },
+ { 0x335B, 68958 },
+ { 0x3363, 68964 },
+ { 0x3364, 68970 },
+ { 0x336C, 68976 },
+ { 0x3367, 68982 },
+ { 0x3368, 68988 },
+ { 0x336A, 68994 },
+ { 0x3366, 69000 },
+ { 0x336B, 69006 },
+ { 0x3365, 69012 },
+ { 0x3369, 69018 },
+ { 0x336D, 69024 },
+ { 0x336E, 69030 },
+ { 0x3370, 69036 },
+ { 0x336F, 69042 },
+ { 0x32C6, 69048 },
+ { 0x32C5, 69053 },
+ { 0x32C3, 69058 },
+ { 0x32C2, 69063 },
+ { 0x32C7, 69068 },
+ { 0x32C0, 69073 },
+ { 0x32C9, 69078 },
+ { 0x32CB, 69083 },
+ { 0x32C1, 69088 },
+ { 0x32CA, 69093 },
+ { 0x32C8, 69098 },
+ { 0x303E, 69103 },
+ { 0x319F, 69106 },
+ { 0x3192, 69110 },
+ { 0x3196, 69114 },
+ { 0x3193, 69118 },
+ { 0x3195, 69122 },
+ { 0x319E, 69126 },
+ { 0x3199, 69130 },
+ { 0x319B, 69134 },
+ { 0x3194, 69138 },
+ { 0x3198, 69142 },
+ { 0x319C, 69146 },
+ { 0x319D, 69150 },
+ { 0x3197, 69154 },
+ { 0x319A, 69158 },
+ { 0x3190, 69162 },
+ { 0x3191, 69166 },
+ { 0x2FF4, 69170 },
+ { 0x2FF0, 69175 },
+ { 0x2FF2, 69181 },
+ { 0x2FF1, 69189 },
+ { 0x2FF3, 69195 },
+ { 0x2FFB, 69203 },
+ { 0x2FF7, 69207 },
+ { 0x2FF5, 69213 },
+ { 0x2FF6, 69219 },
+ { 0x2FFA, 69225 },
+ { 0x2FF8, 69232 },
+ { 0x2FF9, 69239 },
+ { 0x2139, 69246 },
+ { 0x22BA, 69248 },
+ { 0x6FF9, 69249 },
+ { 0x6FFA, 69252 },
+ { 0x6FFB, 69255 },
+ { 0x26A4, 69258 },
+ { 0x203D, 69263 },
+ { 0x27AA, 69264 },
+ { 0x2E0F, 69268 },
+ { 0x3250, 69269 },
+ { 0x2306, 69271 },
+ { 0x2008, 69272 },
+ { 0x2622, 69274 },
+ { 0x6FFD, 69276 },
+ { 0x2650, 69278 },
+ { 0x26BA, 69279 },
+ { 0x00B9, 69280 },
+ { 0x2076, 69282 },
+ { 0x00B2, 69284 },
+ { 0x2075, 69286 },
+ { 0x2074, 69288 },
+ { 0x207D, 69290 },
+ { 0x2079, 69293 },
+ { 0x207A, 69295 },
+ { 0x2070, 69298 },
+ { 0x2078, 69300 },
+ { 0x2071, 69302 },
+ { 0x207F, 69307 },
+ { 0x207B, 69312 },
+ { 0x207E, 69314 },
+ { 0x2077, 69317 },
+ { 0x00B3, 69319 },
+ { 0x207C, 69321 },
+ { 0x2ADB, 69324 },
+ { 0x25ED, 69326 },
+ { 0x25EE, 69332 },
+ { 0x214D, 69338 },
+ { 0x2A3F, 69339 },
+ { 0x060A, 69342 },
+ { 0x0609, 69347 },
+ { 0x0606, 69351 },
+ { 0x0661, 69354 },
+ { 0x0666, 69357 },
+ { 0x0662, 69360 },
+ { 0x0665, 69363 },
+ { 0x0664, 69366 },
+ { 0x0669, 69369 },
+ { 0x0660, 69372 },
+ { 0x0668, 69375 },
+ { 0x0667, 69378 },
+ { 0x0663, 69381 },
+ { 0x0607, 69384 },
+ { 0x212D, 69387 },
+ { 0x210C, 69390 },
+ { 0x2111, 69393 },
+ { 0x211C, 69396 },
+ { 0x2128, 69399 },
+ { 0x232D, 69402 },
+ { 0x29DF, 69403 },
+ { 0x29F3, 69405 },
+ { 0x29EF, 69408 },
+ { 0x29F1, 69411 },
+ { 0x29F2, 69414 },
+ { 0x29EE, 69417 },
+ { 0x29F0, 69420 },
+ { 0x269C, 69423 },
+ { 0x27AC, 69424 },
+ { 0x2265, 69429 },
+ { 0x2A7E, 69433 },
+ { 0x2A82, 69438 },
+ { 0x2A84, 69446 },
+ { 0x2A80, 69455 },
+ { 0x2277, 69463 },
+ { 0x2273, 69466 },
+ { 0x2A86, 69470 },
+ { 0x2A8A, 69473 },
+ { 0x2A88, 69477 },
+ { 0x2269, 69483 },
+ { 0x22E7, 69488 },
+ { 0x2267, 69493 },
+ { 0x003E, 69497 },
+ { 0x22D7, 69499 },
+ { 0x2A7A, 69502 },
+ { 0x2A7C, 69506 },
+ { 0x2A8E, 69511 },
+ { 0x2A90, 69516 },
+ { 0x2A94, 69521 },
+ { 0x2A92, 69530 },
+ { 0x2978, 69536 },
+ { 0x2A8C, 69540 },
+ { 0x22DB, 69546 },
+ { 0x2AA5, 69551 },
+ { 0x2AA7, 69554 },
+ { 0x2AA9, 69558 },
+ { 0x2AA4, 69565 },
+ { 0x002D, 69568 },
+ { 0x2E12, 69569 },
+ { 0x2229, 69570 },
+ { 0x2A40, 69571 },
+ { 0x2A44, 69574 },
+ { 0x2A43, 69578 },
+ { 0x2A49, 69581 },
+ { 0x2A47, 69586 },
+ { 0x2A4B, 69589 },
+ { 0x96E1, 69595 },
+ { 0x96DF, 69599 },
+ { 0x96E0, 69603 },
+ { 0x97CF, 69607 },
+ { 0x97D4, 69611 },
+ { 0x97D0, 69615 },
+ { 0x97D3, 69619 },
+ { 0x97D2, 69623 },
+ { 0x97D7, 69627 },
+ { 0x97CE, 69631 },
+ { 0x97D6, 69635 },
+ { 0x97D5, 69639 },
+ { 0x97D1, 69643 },
+ { 0x96DE, 69647 },
+ { 0x96C1, 69651 },
+ { 0x941A, 69654 },
+ { 0x941B, 69658 },
+ { 0x941C, 69662 },
+ { 0x941D, 69666 },
+ { 0x941E, 69670 },
+ { 0x941F, 69674 },
+ { 0x9420, 69678 },
+ { 0x9421, 69682 },
+ { 0x9422, 69686 },
+ { 0x9423, 69690 },
+ { 0x9424, 69694 },
+ { 0x9425, 69698 },
+ { 0x9426, 69702 },
+ { 0x9427, 69706 },
+ { 0x9428, 69710 },
+ { 0x9429, 69714 },
+ { 0x942A, 69718 },
+ { 0x942B, 69722 },
+ { 0x942C, 69726 },
+ { 0x942D, 69730 },
+ { 0x942E, 69734 },
+ { 0x942F, 69738 },
+ { 0x9430, 69742 },
+ { 0x9431, 69746 },
+ { 0x9432, 69750 },
+ { 0x9433, 69754 },
+ { 0x96CD, 69758 },
+ { 0x96CE, 69762 },
+ { 0x96D1, 69766 },
+ { 0x96CF, 69770 },
+ { 0x96D8, 69774 },
+ { 0x96C8, 69778 },
+ { 0x96D7, 69782 },
+ { 0x96D9, 69786 },
+ { 0x96D2, 69790 },
+ { 0x96D5, 69794 },
+ { 0x96C3, 69798 },
+ { 0x96CA, 69802 },
+ { 0x96C7, 69806 },
+ { 0x96C2, 69810 },
+ { 0x96C5, 69814 },
+ { 0x96D3, 69818 },
+ { 0x96C4, 69823 },
+ { 0x96CB, 69827 },
+ { 0x96CC, 69831 },
+ { 0x96DA, 69835 },
+ { 0x96D4, 69839 },
+ { 0x96C9, 69843 },
+ { 0x97CB, 69847 },
+ { 0x96C6, 69851 },
+ { 0x96D0, 69855 },
+ { 0x96D6, 69859 },
+ { 0x96DD, 69863 },
+ { 0x9755, 69867 },
+ { 0x9753, 69872 },
+ { 0x9754, 69877 },
+ { 0x9752, 69882 },
+ { 0x9735, 69887 },
+ { 0x9482, 69891 },
+ { 0x9483, 69896 },
+ { 0x9484, 69901 },
+ { 0x9485, 69906 },
+ { 0x9486, 69911 },
+ { 0x9487, 69916 },
+ { 0x9488, 69921 },
+ { 0x9489, 69926 },
+ { 0x948A, 69931 },
+ { 0x948B, 69936 },
+ { 0x948C, 69941 },
+ { 0x948D, 69946 },
+ { 0x948E, 69951 },
+ { 0x948F, 69956 },
+ { 0x9490, 69961 },
+ { 0x9491, 69966 },
+ { 0x9492, 69971 },
+ { 0x9493, 69976 },
+ { 0x9494, 69981 },
+ { 0x9495, 69986 },
+ { 0x9496, 69991 },
+ { 0x9497, 69996 },
+ { 0x9498, 70001 },
+ { 0x9499, 70006 },
+ { 0x949A, 70011 },
+ { 0x949B, 70016 },
+ { 0x9741, 70021 },
+ { 0x9742, 70026 },
+ { 0x9745, 70031 },
+ { 0x9743, 70036 },
+ { 0x974C, 70041 },
+ { 0x973C, 70046 },
+ { 0x974B, 70051 },
+ { 0x974D, 70056 },
+ { 0x9746, 70061 },
+ { 0x9749, 70066 },
+ { 0x9737, 70071 },
+ { 0x973E, 70076 },
+ { 0x973B, 70081 },
+ { 0x9736, 70086 },
+ { 0x9739, 70091 },
+ { 0x9747, 70096 },
+ { 0x9738, 70102 },
+ { 0x973F, 70107 },
+ { 0x9740, 70112 },
+ { 0x974E, 70117 },
+ { 0x9748, 70122 },
+ { 0x973D, 70127 },
+ { 0x973A, 70132 },
+ { 0x9744, 70137 },
+ { 0x974A, 70142 },
+ { 0x9751, 70147 },
+ { 0x9468, 70152 },
+ { 0x9469, 70157 },
+ { 0x946A, 70162 },
+ { 0x946B, 70167 },
+ { 0x946C, 70172 },
+ { 0x946D, 70177 },
+ { 0x946E, 70182 },
+ { 0x946F, 70187 },
+ { 0x9470, 70192 },
+ { 0x9471, 70197 },
+ { 0x9472, 70202 },
+ { 0x9473, 70207 },
+ { 0x9474, 70212 },
+ { 0x9475, 70217 },
+ { 0x9476, 70222 },
+ { 0x9477, 70227 },
+ { 0x9478, 70232 },
+ { 0x9479, 70237 },
+ { 0x947A, 70242 },
+ { 0x947B, 70247 },
+ { 0x947C, 70252 },
+ { 0x947D, 70257 },
+ { 0x947E, 70262 },
+ { 0x947F, 70267 },
+ { 0x9480, 70272 },
+ { 0x9481, 70277 },
+ { 0x9727, 70282 },
+ { 0x9728, 70287 },
+ { 0x972B, 70292 },
+ { 0x9729, 70297 },
+ { 0x9732, 70302 },
+ { 0x9722, 70307 },
+ { 0x9731, 70312 },
+ { 0x9733, 70317 },
+ { 0x972C, 70322 },
+ { 0x972F, 70327 },
+ { 0x971D, 70332 },
+ { 0x9724, 70337 },
+ { 0x9721, 70342 },
+ { 0x971C, 70347 },
+ { 0x971F, 70352 },
+ { 0x971E, 70357 },
+ { 0x9725, 70362 },
+ { 0x9726, 70367 },
+ { 0x9734, 70372 },
+ { 0x972E, 70377 },
+ { 0x9723, 70382 },
+ { 0x972D, 70387 },
+ { 0x9720, 70393 },
+ { 0x972A, 70398 },
+ { 0x9730, 70403 },
+ { 0x9750, 70408 },
+ { 0x974F, 70413 },
+ { 0x94EA, 70418 },
+ { 0x94EB, 70423 },
+ { 0x94EC, 70428 },
+ { 0x94ED, 70433 },
+ { 0x94EE, 70438 },
+ { 0x94EF, 70443 },
+ { 0x94F0, 70448 },
+ { 0x94F1, 70453 },
+ { 0x94F2, 70458 },
+ { 0x94F3, 70463 },
+ { 0x94F4, 70468 },
+ { 0x94F5, 70473 },
+ { 0x94F6, 70478 },
+ { 0x94F7, 70483 },
+ { 0x94F8, 70488 },
+ { 0x94F9, 70493 },
+ { 0x94FA, 70498 },
+ { 0x94FB, 70503 },
+ { 0x94FC, 70508 },
+ { 0x94FD, 70513 },
+ { 0x94FE, 70518 },
+ { 0x94FF, 70523 },
+ { 0x9500, 70528 },
+ { 0x9501, 70533 },
+ { 0x9502, 70538 },
+ { 0x9503, 70543 },
+ { 0x94D0, 70548 },
+ { 0x94D1, 70553 },
+ { 0x94D2, 70558 },
+ { 0x94D3, 70563 },
+ { 0x94D4, 70568 },
+ { 0x94D5, 70573 },
+ { 0x94D6, 70578 },
+ { 0x94D7, 70583 },
+ { 0x94D8, 70588 },
+ { 0x94D9, 70593 },
+ { 0x94DA, 70598 },
+ { 0x94DB, 70603 },
+ { 0x94DC, 70608 },
+ { 0x94DD, 70613 },
+ { 0x94DE, 70618 },
+ { 0x94DF, 70623 },
+ { 0x94E0, 70628 },
+ { 0x94E1, 70633 },
+ { 0x94E2, 70638 },
+ { 0x94E3, 70643 },
+ { 0x94E4, 70648 },
+ { 0x94E5, 70653 },
+ { 0x94E6, 70658 },
+ { 0x94E7, 70663 },
+ { 0x94E8, 70668 },
+ { 0x94E9, 70673 },
+ { 0x9400, 70678 },
+ { 0x9401, 70682 },
+ { 0x9402, 70686 },
+ { 0x9403, 70690 },
+ { 0x9404, 70694 },
+ { 0x9405, 70698 },
+ { 0x9406, 70702 },
+ { 0x9407, 70706 },
+ { 0x9408, 70710 },
+ { 0x9409, 70714 },
+ { 0x940A, 70718 },
+ { 0x940B, 70722 },
+ { 0x940C, 70726 },
+ { 0x940D, 70730 },
+ { 0x940E, 70734 },
+ { 0x940F, 70738 },
+ { 0x9410, 70742 },
+ { 0x9411, 70746 },
+ { 0x9412, 70750 },
+ { 0x9413, 70754 },
+ { 0x9414, 70758 },
+ { 0x9415, 70762 },
+ { 0x9416, 70766 },
+ { 0x9417, 70770 },
+ { 0x9418, 70774 },
+ { 0x9419, 70778 },
+ { 0x96B3, 70782 },
+ { 0x96B4, 70786 },
+ { 0x96B7, 70790 },
+ { 0x96B5, 70794 },
+ { 0x96BE, 70798 },
+ { 0x96AE, 70802 },
+ { 0x96BD, 70806 },
+ { 0x96BF, 70810 },
+ { 0x96B8, 70814 },
+ { 0x96BB, 70818 },
+ { 0x96A9, 70822 },
+ { 0x96B0, 70826 },
+ { 0x96AD, 70830 },
+ { 0x96A8, 70834 },
+ { 0x96AB, 70838 },
+ { 0x96AA, 70842 },
+ { 0x96B1, 70846 },
+ { 0x96B2, 70850 },
+ { 0x96C0, 70854 },
+ { 0x96BA, 70858 },
+ { 0x96AF, 70862 },
+ { 0x96B9, 70866 },
+ { 0x97CA, 70871 },
+ { 0x96AC, 70875 },
+ { 0x96B6, 70879 },
+ { 0x96BC, 70883 },
+ { 0x96DC, 70887 },
+ { 0x9586, 70891 },
+ { 0x9587, 70896 },
+ { 0x9588, 70901 },
+ { 0x9589, 70906 },
+ { 0x958A, 70911 },
+ { 0x958B, 70916 },
+ { 0x958C, 70921 },
+ { 0x958D, 70926 },
+ { 0x958E, 70931 },
+ { 0x958F, 70936 },
+ { 0x9590, 70941 },
+ { 0x9591, 70946 },
+ { 0x9592, 70951 },
+ { 0x9593, 70956 },
+ { 0x9594, 70961 },
+ { 0x9595, 70966 },
+ { 0x9596, 70971 },
+ { 0x9597, 70976 },
+ { 0x9598, 70981 },
+ { 0x9599, 70986 },
+ { 0x959A, 70991 },
+ { 0x959B, 70996 },
+ { 0x959C, 71001 },
+ { 0x959D, 71006 },
+ { 0x959E, 71011 },
+ { 0x959F, 71016 },
+ { 0x956C, 71021 },
+ { 0x956D, 71026 },
+ { 0x956E, 71031 },
+ { 0x956F, 71036 },
+ { 0x9570, 71041 },
+ { 0x9571, 71046 },
+ { 0x9572, 71051 },
+ { 0x9573, 71056 },
+ { 0x9574, 71061 },
+ { 0x9575, 71066 },
+ { 0x9576, 71071 },
+ { 0x9577, 71076 },
+ { 0x9578, 71081 },
+ { 0x9579, 71086 },
+ { 0x957A, 71091 },
+ { 0x957B, 71096 },
+ { 0x957C, 71101 },
+ { 0x957D, 71106 },
+ { 0x957E, 71111 },
+ { 0x957F, 71116 },
+ { 0x9580, 71121 },
+ { 0x9581, 71126 },
+ { 0x9582, 71131 },
+ { 0x9583, 71136 },
+ { 0x9584, 71141 },
+ { 0x9585, 71146 },
+ { 0x96DB, 71151 },
+ { 0x27E8, 71155 },
+ { 0x27E6, 71159 },
+ { 0x27EC, 71164 },
+ { 0x27EA, 71170 },
+ { 0x27EE, 71175 },
+ { 0x27E9, 71179 },
+ { 0x27E7, 71183 },
+ { 0x27ED, 71188 },
+ { 0x27EB, 71194 },
+ { 0x27EF, 71199 },
+ { 0x971B, 71203 },
+ { 0x9719, 71207 },
+ { 0x971A, 71211 },
+ { 0x9718, 71215 },
+ { 0x96FB, 71219 },
+ { 0x944E, 71222 },
+ { 0x944F, 71226 },
+ { 0x9450, 71230 },
+ { 0x9451, 71234 },
+ { 0x9452, 71238 },
+ { 0x9453, 71242 },
+ { 0x9454, 71246 },
+ { 0x9456, 71250 },
+ { 0x9457, 71254 },
+ { 0x9458, 71258 },
+ { 0x9459, 71262 },
+ { 0x945A, 71266 },
+ { 0x945B, 71270 },
+ { 0x945C, 71274 },
+ { 0x945D, 71278 },
+ { 0x945E, 71282 },
+ { 0x945F, 71286 },
+ { 0x9460, 71290 },
+ { 0x9461, 71294 },
+ { 0x9462, 71298 },
+ { 0x9463, 71302 },
+ { 0x9464, 71306 },
+ { 0x9465, 71310 },
+ { 0x9466, 71314 },
+ { 0x9467, 71318 },
+ { 0x9707, 71322 },
+ { 0x9708, 71326 },
+ { 0x970B, 71330 },
+ { 0x9709, 71334 },
+ { 0x9712, 71338 },
+ { 0x9702, 71342 },
+ { 0x9711, 71346 },
+ { 0x9713, 71350 },
+ { 0x970C, 71354 },
+ { 0x970F, 71358 },
+ { 0x96FD, 71362 },
+ { 0x9704, 71366 },
+ { 0x9701, 71370 },
+ { 0x96FC, 71374 },
+ { 0x96FF, 71378 },
+ { 0x970D, 71382 },
+ { 0x96FE, 71387 },
+ { 0x9705, 71391 },
+ { 0x9706, 71395 },
+ { 0x9714, 71399 },
+ { 0x970E, 71403 },
+ { 0x9703, 71407 },
+ { 0x96A4, 71411 },
+ { 0x96A5, 71416 },
+ { 0x9700, 71421 },
+ { 0x970A, 71425 },
+ { 0x9710, 71429 },
+ { 0x9717, 71433 },
+ { 0x9434, 71437 },
+ { 0x9435, 71441 },
+ { 0x9436, 71445 },
+ { 0x9437, 71449 },
+ { 0x9438, 71453 },
+ { 0x9439, 71457 },
+ { 0x943A, 71461 },
+ { 0x943B, 71465 },
+ { 0x943C, 71469 },
+ { 0x943D, 71473 },
+ { 0x943E, 71477 },
+ { 0x943F, 71481 },
+ { 0x9440, 71485 },
+ { 0x9441, 71489 },
+ { 0x9442, 71493 },
+ { 0x9443, 71497 },
+ { 0x9444, 71501 },
+ { 0x9445, 71505 },
+ { 0x9446, 71509 },
+ { 0x9447, 71513 },
+ { 0x9448, 71517 },
+ { 0x9449, 71521 },
+ { 0x944A, 71525 },
+ { 0x944B, 71529 },
+ { 0x944C, 71533 },
+ { 0x944D, 71537 },
+ { 0x96ED, 71541 },
+ { 0x96EE, 71545 },
+ { 0x96F1, 71549 },
+ { 0x96EF, 71553 },
+ { 0x96F8, 71557 },
+ { 0x96E8, 71561 },
+ { 0x96F7, 71565 },
+ { 0x96F9, 71569 },
+ { 0x96F2, 71573 },
+ { 0x96F5, 71577 },
+ { 0x96E3, 71581 },
+ { 0x96EA, 71585 },
+ { 0x96E7, 71589 },
+ { 0x96E2, 71593 },
+ { 0x96E5, 71597 },
+ { 0x96E4, 71601 },
+ { 0x96EB, 71605 },
+ { 0x96EC, 71609 },
+ { 0x96FA, 71613 },
+ { 0x96F4, 71617 },
+ { 0x96E9, 71621 },
+ { 0x96F3, 71625 },
+ { 0x96E6, 71630 },
+ { 0x96F0, 71634 },
+ { 0x96F6, 71638 },
+ { 0x9716, 71642 },
+ { 0x9715, 71646 },
+ { 0x94B6, 71650 },
+ { 0x94B7, 71654 },
+ { 0x94B8, 71658 },
+ { 0x94B9, 71662 },
+ { 0x94BB, 71666 },
+ { 0x94BD, 71670 },
+ { 0x94BE, 71674 },
+ { 0x94BF, 71678 },
+ { 0x94C0, 71682 },
+ { 0x94C1, 71686 },
+ { 0x94C2, 71690 },
+ { 0x94C3, 71694 },
+ { 0x94C5, 71698 },
+ { 0x94C6, 71702 },
+ { 0x94C7, 71706 },
+ { 0x94C8, 71710 },
+ { 0x94C9, 71714 },
+ { 0x94CA, 71718 },
+ { 0x94CB, 71722 },
+ { 0x94CC, 71726 },
+ { 0x94CD, 71730 },
+ { 0x94CE, 71734 },
+ { 0x94CF, 71738 },
+ { 0x949C, 71742 },
+ { 0x949E, 71746 },
+ { 0x949F, 71750 },
+ { 0x94A2, 71754 },
+ { 0x94A5, 71758 },
+ { 0x94A6, 71762 },
+ { 0x94A9, 71766 },
+ { 0x94AA, 71770 },
+ { 0x94AB, 71774 },
+ { 0x94AC, 71778 },
+ { 0x94AE, 71782 },
+ { 0x94AF, 71786 },
+ { 0x94B0, 71790 },
+ { 0x94B1, 71794 },
+ { 0x94B2, 71798 },
+ { 0x94B3, 71802 },
+ { 0x94B4, 71806 },
+ { 0x94B5, 71810 },
+ { 0x951E, 71814 },
+ { 0x951F, 71818 },
+ { 0x9520, 71822 },
+ { 0x9521, 71826 },
+ { 0x9522, 71830 },
+ { 0x9523, 71834 },
+ { 0x9524, 71838 },
+ { 0x9525, 71842 },
+ { 0x9526, 71846 },
+ { 0x9527, 71850 },
+ { 0x9528, 71854 },
+ { 0x9529, 71858 },
+ { 0x952A, 71862 },
+ { 0x952B, 71866 },
+ { 0x952C, 71870 },
+ { 0x952D, 71874 },
+ { 0x952E, 71878 },
+ { 0x952F, 71882 },
+ { 0x9530, 71886 },
+ { 0x9531, 71890 },
+ { 0x9532, 71894 },
+ { 0x9533, 71898 },
+ { 0x9534, 71902 },
+ { 0x9535, 71906 },
+ { 0x9536, 71910 },
+ { 0x9537, 71914 },
+ { 0x9504, 71918 },
+ { 0x9505, 71922 },
+ { 0x9507, 71926 },
+ { 0x9508, 71930 },
+ { 0x9509, 71934 },
+ { 0x950A, 71938 },
+ { 0x950D, 71942 },
+ { 0x950E, 71946 },
+ { 0x950F, 71950 },
+ { 0x9510, 71954 },
+ { 0x9511, 71958 },
+ { 0x9512, 71962 },
+ { 0x9513, 71966 },
+ { 0x9514, 71970 },
+ { 0x9516, 71974 },
+ { 0x9517, 71978 },
+ { 0x9518, 71982 },
+ { 0x9519, 71986 },
+ { 0x951A, 71990 },
+ { 0x951B, 71994 },
+ { 0x951C, 71998 },
+ { 0x97F7, 72002 },
+ { 0x97FC, 72006 },
+ { 0x97F8, 72010 },
+ { 0x97FB, 72014 },
+ { 0x97FA, 72018 },
+ { 0x97FF, 72022 },
+ { 0x97F6, 72026 },
+ { 0x97FE, 72030 },
+ { 0x97FD, 72034 },
+ { 0x97F9, 72038 },
+ { 0x968A, 72042 },
+ { 0x968B, 72046 },
+ { 0x968C, 72050 },
+ { 0x968D, 72054 },
+ { 0x968E, 72058 },
+ { 0x968F, 72062 },
+ { 0x9690, 72066 },
+ { 0x9691, 72070 },
+ { 0x9692, 72074 },
+ { 0x9693, 72078 },
+ { 0x9694, 72082 },
+ { 0x9695, 72086 },
+ { 0x9696, 72090 },
+ { 0x9697, 72094 },
+ { 0x9698, 72098 },
+ { 0x9699, 72102 },
+ { 0x969A, 72106 },
+ { 0x969B, 72110 },
+ { 0x969C, 72114 },
+ { 0x969D, 72118 },
+ { 0x969E, 72122 },
+ { 0x969F, 72126 },
+ { 0x96A0, 72130 },
+ { 0x96A1, 72134 },
+ { 0x96A2, 72138 },
+ { 0x96A3, 72142 },
+ { 0x9670, 72146 },
+ { 0x9671, 72150 },
+ { 0x9672, 72154 },
+ { 0x9673, 72158 },
+ { 0x9674, 72162 },
+ { 0x9675, 72166 },
+ { 0x9676, 72170 },
+ { 0x9677, 72174 },
+ { 0x9678, 72178 },
+ { 0x9679, 72182 },
+ { 0x967A, 72186 },
+ { 0x967B, 72190 },
+ { 0x967C, 72194 },
+ { 0x967D, 72198 },
+ { 0x967E, 72202 },
+ { 0x967F, 72206 },
+ { 0x9680, 72210 },
+ { 0x9681, 72214 },
+ { 0x9682, 72218 },
+ { 0x9683, 72222 },
+ { 0x9684, 72226 },
+ { 0x9685, 72230 },
+ { 0x9686, 72234 },
+ { 0x9687, 72238 },
+ { 0x9688, 72242 },
+ { 0x9689, 72246 },
+ { 0x978F, 72250 },
+ { 0x978D, 72255 },
+ { 0x978E, 72260 },
+ { 0x97ED, 72265 },
+ { 0x97F2, 72270 },
+ { 0x97EE, 72275 },
+ { 0x97F1, 72280 },
+ { 0x97F0, 72285 },
+ { 0x97F5, 72290 },
+ { 0x97EC, 72295 },
+ { 0x97F4, 72300 },
+ { 0x97F3, 72305 },
+ { 0x97EF, 72310 },
+ { 0x978C, 72315 },
+ { 0x976F, 72320 },
+ { 0x95EE, 72324 },
+ { 0x95EF, 72329 },
+ { 0x95F0, 72334 },
+ { 0x95F1, 72339 },
+ { 0x95F2, 72344 },
+ { 0x95F3, 72349 },
+ { 0x95F4, 72354 },
+ { 0x95F5, 72359 },
+ { 0x95F6, 72364 },
+ { 0x95F7, 72369 },
+ { 0x95F8, 72374 },
+ { 0x95F9, 72379 },
+ { 0x95FA, 72384 },
+ { 0x95FB, 72389 },
+ { 0x95FC, 72394 },
+ { 0x95FD, 72399 },
+ { 0x95FE, 72404 },
+ { 0x95FF, 72409 },
+ { 0x9600, 72414 },
+ { 0x9601, 72419 },
+ { 0x9602, 72424 },
+ { 0x9603, 72429 },
+ { 0x9604, 72434 },
+ { 0x9605, 72439 },
+ { 0x9606, 72444 },
+ { 0x9607, 72449 },
+ { 0x977B, 72454 },
+ { 0x977C, 72459 },
+ { 0x977F, 72464 },
+ { 0x977D, 72469 },
+ { 0x9786, 72474 },
+ { 0x9776, 72479 },
+ { 0x9785, 72484 },
+ { 0x9787, 72489 },
+ { 0x9780, 72494 },
+ { 0x9783, 72499 },
+ { 0x9771, 72504 },
+ { 0x9778, 72509 },
+ { 0x9775, 72514 },
+ { 0x9770, 72519 },
+ { 0x9773, 72524 },
+ { 0x9781, 72529 },
+ { 0x9772, 72535 },
+ { 0x9779, 72540 },
+ { 0x977A, 72545 },
+ { 0x9788, 72550 },
+ { 0x9782, 72555 },
+ { 0x9777, 72560 },
+ { 0x9774, 72565 },
+ { 0x977E, 72570 },
+ { 0x9784, 72575 },
+ { 0x978B, 72580 },
+ { 0x97C9, 72585 },
+ { 0x97C7, 72591 },
+ { 0x97C8, 72597 },
+ { 0x97C6, 72603 },
+ { 0x97A9, 72609 },
+ { 0x9656, 72614 },
+ { 0x9657, 72620 },
+ { 0x9658, 72626 },
+ { 0x9659, 72632 },
+ { 0x965A, 72638 },
+ { 0x965B, 72644 },
+ { 0x965C, 72650 },
+ { 0x965D, 72656 },
+ { 0x965E, 72662 },
+ { 0x965F, 72668 },
+ { 0x9660, 72674 },
+ { 0x9661, 72680 },
+ { 0x9662, 72686 },
+ { 0x9663, 72692 },
+ { 0x9664, 72698 },
+ { 0x9665, 72704 },
+ { 0x9666, 72710 },
+ { 0x9667, 72716 },
+ { 0x9668, 72722 },
+ { 0x9669, 72728 },
+ { 0x966A, 72734 },
+ { 0x966B, 72740 },
+ { 0x966C, 72746 },
+ { 0x966D, 72752 },
+ { 0x966E, 72758 },
+ { 0x966F, 72764 },
+ { 0x97B5, 72770 },
+ { 0x97B6, 72776 },
+ { 0x97B9, 72782 },
+ { 0x97B7, 72788 },
+ { 0x97C0, 72794 },
+ { 0x97B0, 72800 },
+ { 0x97BF, 72806 },
+ { 0x97C1, 72812 },
+ { 0x97BA, 72818 },
+ { 0x97BD, 72824 },
+ { 0x97AB, 72830 },
+ { 0x97B2, 72836 },
+ { 0x97AF, 72842 },
+ { 0x97AA, 72848 },
+ { 0x97AD, 72854 },
+ { 0x97BB, 72860 },
+ { 0x97AC, 72867 },
+ { 0x97B3, 72873 },
+ { 0x97B4, 72879 },
+ { 0x97C2, 72885 },
+ { 0x97BC, 72891 },
+ { 0x97B1, 72897 },
+ { 0x97AE, 72903 },
+ { 0x97B8, 72909 },
+ { 0x97BE, 72915 },
+ { 0x97C5, 72921 },
+ { 0x963C, 72927 },
+ { 0x963D, 72933 },
+ { 0x963E, 72939 },
+ { 0x963F, 72945 },
+ { 0x9640, 72951 },
+ { 0x9641, 72957 },
+ { 0x9642, 72963 },
+ { 0x9643, 72969 },
+ { 0x9644, 72975 },
+ { 0x9645, 72981 },
+ { 0x9646, 72987 },
+ { 0x9647, 72993 },
+ { 0x9648, 72999 },
+ { 0x9649, 73005 },
+ { 0x964A, 73011 },
+ { 0x964B, 73017 },
+ { 0x964C, 73023 },
+ { 0x964D, 73029 },
+ { 0x964E, 73035 },
+ { 0x964F, 73041 },
+ { 0x9650, 73047 },
+ { 0x9651, 73053 },
+ { 0x9652, 73059 },
+ { 0x9653, 73065 },
+ { 0x9654, 73071 },
+ { 0x9655, 73077 },
+ { 0x979B, 73083 },
+ { 0x979C, 73089 },
+ { 0x979F, 73095 },
+ { 0x979D, 73101 },
+ { 0x97A6, 73107 },
+ { 0x9796, 73113 },
+ { 0x97A5, 73119 },
+ { 0x97A7, 73125 },
+ { 0x97A0, 73131 },
+ { 0x97A3, 73137 },
+ { 0x9791, 73143 },
+ { 0x9798, 73149 },
+ { 0x9795, 73155 },
+ { 0x9790, 73161 },
+ { 0x9793, 73167 },
+ { 0x9792, 73173 },
+ { 0x9799, 73179 },
+ { 0x979A, 73185 },
+ { 0x97A8, 73191 },
+ { 0x97A2, 73197 },
+ { 0x9797, 73203 },
+ { 0x97A1, 73209 },
+ { 0x9794, 73216 },
+ { 0x979E, 73222 },
+ { 0x97A4, 73228 },
+ { 0x97C4, 73234 },
+ { 0x97C3, 73240 },
+ { 0x95D4, 73246 },
+ { 0x95D5, 73251 },
+ { 0x95D6, 73256 },
+ { 0x95D7, 73261 },
+ { 0x95D8, 73266 },
+ { 0x95D9, 73271 },
+ { 0x95DA, 73276 },
+ { 0x95DB, 73281 },
+ { 0x95DC, 73286 },
+ { 0x95DD, 73291 },
+ { 0x95DE, 73296 },
+ { 0x95DF, 73301 },
+ { 0x95E0, 73306 },
+ { 0x95E1, 73311 },
+ { 0x95E2, 73316 },
+ { 0x95E3, 73321 },
+ { 0x95E4, 73326 },
+ { 0x95E5, 73331 },
+ { 0x95E6, 73336 },
+ { 0x95E7, 73341 },
+ { 0x95E8, 73346 },
+ { 0x95E9, 73351 },
+ { 0x95EA, 73356 },
+ { 0x95EB, 73361 },
+ { 0x95EC, 73366 },
+ { 0x95ED, 73371 },
+ { 0x9761, 73376 },
+ { 0x9762, 73381 },
+ { 0x9765, 73386 },
+ { 0x9763, 73391 },
+ { 0x976C, 73396 },
+ { 0x975C, 73401 },
+ { 0x976B, 73406 },
+ { 0x976D, 73411 },
+ { 0x9766, 73416 },
+ { 0x9769, 73421 },
+ { 0x9757, 73426 },
+ { 0x975E, 73431 },
+ { 0x975B, 73436 },
+ { 0x9756, 73441 },
+ { 0x9759, 73446 },
+ { 0x9758, 73451 },
+ { 0x975F, 73456 },
+ { 0x9760, 73461 },
+ { 0x976E, 73466 },
+ { 0x9768, 73471 },
+ { 0x975D, 73476 },
+ { 0x9767, 73481 },
+ { 0x975A, 73487 },
+ { 0x9764, 73492 },
+ { 0x976A, 73497 },
+ { 0x978A, 73502 },
+ { 0x9789, 73507 },
+ { 0x97E3, 73512 },
+ { 0x97E8, 73516 },
+ { 0x97E4, 73520 },
+ { 0x97E7, 73524 },
+ { 0x97E6, 73528 },
+ { 0x97EB, 73532 },
+ { 0x97E2, 73536 },
+ { 0x97EA, 73540 },
+ { 0x97E9, 73544 },
+ { 0x97E5, 73548 },
+ { 0x95BA, 73552 },
+ { 0x95BB, 73556 },
+ { 0x95BC, 73560 },
+ { 0x95BD, 73564 },
+ { 0x95BE, 73568 },
+ { 0x95BF, 73572 },
+ { 0x95C0, 73576 },
+ { 0x95C1, 73580 },
+ { 0x95C2, 73584 },
+ { 0x95C3, 73588 },
+ { 0x95C4, 73592 },
+ { 0x95C5, 73596 },
+ { 0x95C6, 73600 },
+ { 0x95C7, 73604 },
+ { 0x95C8, 73608 },
+ { 0x95C9, 73612 },
+ { 0x95CA, 73616 },
+ { 0x95CB, 73620 },
+ { 0x95CC, 73624 },
+ { 0x95CD, 73628 },
+ { 0x95CE, 73632 },
+ { 0x95CF, 73636 },
+ { 0x95D0, 73640 },
+ { 0x95D1, 73644 },
+ { 0x95D2, 73648 },
+ { 0x95D3, 73652 },
+ { 0x9622, 73656 },
+ { 0x9623, 73661 },
+ { 0x9624, 73666 },
+ { 0x9625, 73671 },
+ { 0x9626, 73676 },
+ { 0x9627, 73681 },
+ { 0x9628, 73686 },
+ { 0x9629, 73691 },
+ { 0x962A, 73696 },
+ { 0x962B, 73701 },
+ { 0x962C, 73706 },
+ { 0x962D, 73711 },
+ { 0x962E, 73716 },
+ { 0x962F, 73721 },
+ { 0x9630, 73726 },
+ { 0x9631, 73731 },
+ { 0x9632, 73736 },
+ { 0x9633, 73741 },
+ { 0x9634, 73746 },
+ { 0x9635, 73751 },
+ { 0x9636, 73756 },
+ { 0x9637, 73761 },
+ { 0x9638, 73766 },
+ { 0x9639, 73771 },
+ { 0x963A, 73776 },
+ { 0x963B, 73781 },
+ { 0x9608, 73786 },
+ { 0x9609, 73791 },
+ { 0x960A, 73796 },
+ { 0x960B, 73801 },
+ { 0x960C, 73806 },
+ { 0x960D, 73811 },
+ { 0x960E, 73816 },
+ { 0x960F, 73821 },
+ { 0x9610, 73826 },
+ { 0x9611, 73831 },
+ { 0x9612, 73836 },
+ { 0x9613, 73841 },
+ { 0x9614, 73846 },
+ { 0x9615, 73851 },
+ { 0x9616, 73856 },
+ { 0x9617, 73861 },
+ { 0x9618, 73866 },
+ { 0x9619, 73871 },
+ { 0x961A, 73876 },
+ { 0x961B, 73881 },
+ { 0x961C, 73886 },
+ { 0x961D, 73891 },
+ { 0x961E, 73896 },
+ { 0x961F, 73901 },
+ { 0x9620, 73906 },
+ { 0x9621, 73911 },
+ { 0x95A0, 73916 },
+ { 0x95A1, 73920 },
+ { 0x95A2, 73924 },
+ { 0x95A3, 73928 },
+ { 0x95A4, 73932 },
+ { 0x95A5, 73936 },
+ { 0x95A6, 73940 },
+ { 0x95A7, 73944 },
+ { 0x95A8, 73948 },
+ { 0x95A9, 73952 },
+ { 0x95AA, 73956 },
+ { 0x95AB, 73960 },
+ { 0x95AC, 73964 },
+ { 0x95AD, 73968 },
+ { 0x95AE, 73972 },
+ { 0x95AF, 73976 },
+ { 0x95B0, 73980 },
+ { 0x95B1, 73984 },
+ { 0x95B2, 73988 },
+ { 0x95B3, 73992 },
+ { 0x95B4, 73996 },
+ { 0x95B5, 74000 },
+ { 0x95B6, 74004 },
+ { 0x95B7, 74008 },
+ { 0x95B8, 74012 },
+ { 0x95B9, 74016 },
+ { 0x97D9, 74020 },
+ { 0x97DE, 74024 },
+ { 0x97DA, 74028 },
+ { 0x97DD, 74032 },
+ { 0x97DC, 74036 },
+ { 0x97E1, 74040 },
+ { 0x97D8, 74044 },
+ { 0x97E0, 74048 },
+ { 0x97DF, 74052 },
+ { 0x97DB, 74056 },
+ { 0x9552, 74060 },
+ { 0x9553, 74064 },
+ { 0x9554, 74068 },
+ { 0x9555, 74072 },
+ { 0x9556, 74076 },
+ { 0x9557, 74080 },
+ { 0x9558, 74084 },
+ { 0x9559, 74088 },
+ { 0x955A, 74092 },
+ { 0x955B, 74096 },
+ { 0x955C, 74100 },
+ { 0x955D, 74104 },
+ { 0x955E, 74108 },
+ { 0x955F, 74112 },
+ { 0x9560, 74116 },
+ { 0x9561, 74120 },
+ { 0x9562, 74124 },
+ { 0x9563, 74128 },
+ { 0x9564, 74132 },
+ { 0x9565, 74136 },
+ { 0x9566, 74140 },
+ { 0x9567, 74144 },
+ { 0x9568, 74148 },
+ { 0x9569, 74152 },
+ { 0x956A, 74156 },
+ { 0x956B, 74160 },
+ { 0x9538, 74164 },
+ { 0x9539, 74168 },
+ { 0x953B, 74172 },
+ { 0x953C, 74176 },
+ { 0x953D, 74180 },
+ { 0x953E, 74184 },
+ { 0x9540, 74188 },
+ { 0x9541, 74192 },
+ { 0x9542, 74196 },
+ { 0x9543, 74200 },
+ { 0x9544, 74204 },
+ { 0x9546, 74208 },
+ { 0x954A, 74212 },
+ { 0x954B, 74216 },
+ { 0x954C, 74220 },
+ { 0x954D, 74224 },
+ { 0x954E, 74228 },
+ { 0x954F, 74232 },
+ { 0x9550, 74236 },
+ { 0x2011, 74240 },
+ { 0x211E, 74242 },
+ { 0x6E31, 74244 },
+ { 0x6E32, 74250 },
+ { 0x6E33, 74256 },
+ { 0x6E30, 74262 },
+ { 0x6E3F, 74269 },
+ { 0x6E3B, 74276 },
+ { 0x6E37, 74284 },
+ { 0x6E43, 74291 },
+ { 0x6E17, 74299 },
+ { 0x6E41, 74307 },
+ { 0x6E3D, 74314 },
+ { 0x6E47, 74322 },
+ { 0x6E39, 74329 },
+ { 0x6E35, 74337 },
+ { 0x6E34, 74343 },
+ { 0x6E13, 74350 },
+ { 0x6E10, 74355 },
+ { 0x6E40, 74360 },
+ { 0x6E3C, 74367 },
+ { 0x6E38, 74375 },
+ { 0x6E44, 74382 },
+ { 0x6E18, 74390 },
+ { 0x6E42, 74398 },
+ { 0x6E3E, 74405 },
+ { 0x6E48, 74413 },
+ { 0x6E3A, 74420 },
+ { 0x6E36, 74428 },
+ { 0x6E16, 74434 },
+ { 0x6E14, 74440 },
+ { 0x6E19, 74445 },
+ { 0x6E15, 74451 },
+ { 0x6E12, 74457 },
+ { 0x6E11, 74464 },
+ { 0x221D, 74470 },
+ { 0x27A9, 74472 },
+ { 0x29F4, 74476 },
+ { 0x23E4, 74477 },
+ { 0x2004, 74478 },
+ { 0x2608, 74480 },
+ { 0x27BC, 74481 },
+ { 0x21B6, 74484 },
+ { 0x21BA, 74488 },
+ { 0x2940, 74492 },
+ { 0x27F2, 74496 },
+ { 0x2233, 74500 },
+ { 0x2A11, 74503 },
+ { 0x2246, 74505 },
+ { 0x2A70, 74511 },
+ { 0x2245, 74516 },
+ { 0x2252, 74519 },
+ { 0x2382, 74526 },
+ { 0x2140, 74529 },
+ { 0x213C, 74532 },
+ { 0x213D, 74535 },
+ { 0x2146, 74538 },
+ { 0x2147, 74542 },
+ { 0x2148, 74546 },
+ { 0x2149, 74550 },
+ { 0x2145, 74554 },
+ { 0x2102, 74558 },
+ { 0x210D, 74561 },
+ { 0x2115, 74564 },
+ { 0x2119, 74567 },
+ { 0x211A, 74570 },
+ { 0x211D, 74573 },
+ { 0x2124, 74576 },
+ { 0x213F, 74579 },
+ { 0x213E, 74582 },
+ { 0x29E8, 74585 },
+ { 0x29E9, 74591 },
+ { 0x20A0, 74597 },
+ { 0x2251, 74599 },
+ { 0x224E, 74602 },
+ { 0x2329, 74605 },
+ { 0x29FC, 74608 },
+ { 0x00AB, 74612 },
+ { 0x200E, 74617 },
+ { 0x202D, 74619 },
+ { 0x202A, 74621 },
+ { 0x2213, 74623 },
+ { 0x27BE, 74625 },
+ { 0x2474, 74628 },
+ { 0x2479, 74631 },
+ { 0x2475, 74634 },
+ { 0x2478, 74637 },
+ { 0x2477, 74640 },
+ { 0x247C, 74643 },
+ { 0x247B, 74646 },
+ { 0x247A, 74649 },
+ { 0x2476, 74652 },
+ { 0x249C, 74655 },
+ { 0x249D, 74660 },
+ { 0x249E, 74665 },
+ { 0x249F, 74670 },
+ { 0x24A0, 74675 },
+ { 0x24A1, 74680 },
+ { 0x24A2, 74685 },
+ { 0x24A3, 74690 },
+ { 0x24A4, 74695 },
+ { 0x24A5, 74700 },
+ { 0x24A6, 74705 },
+ { 0x24A7, 74710 },
+ { 0x24A8, 74715 },
+ { 0x24A9, 74720 },
+ { 0x24AA, 74725 },
+ { 0x24AB, 74730 },
+ { 0x24AC, 74735 },
+ { 0x24AD, 74740 },
+ { 0x24AE, 74745 },
+ { 0x24AF, 74750 },
+ { 0x24B0, 74755 },
+ { 0x24B1, 74760 },
+ { 0x24B2, 74765 },
+ { 0x24B3, 74770 },
+ { 0x24B4, 74775 },
+ { 0x24B5, 74780 },
+ { 0x3206, 74785 },
+ { 0x3214, 74788 },
+ { 0x3208, 74792 },
+ { 0x3216, 74795 },
+ { 0x321C, 74799 },
+ { 0x320D, 74803 },
+ { 0x321B, 74806 },
+ { 0x3207, 74810 },
+ { 0x3215, 74813 },
+ { 0x3204, 74817 },
+ { 0x3212, 74820 },
+ { 0x3201, 74824 },
+ { 0x320F, 74827 },
+ { 0x3205, 74831 },
+ { 0x3213, 74834 },
+ { 0x3203, 74838 },
+ { 0x3211, 74841 },
+ { 0x3200, 74845 },
+ { 0x320E, 74848 },
+ { 0x3202, 74852 },
+ { 0x3210, 74855 },
+ { 0x3209, 74859 },
+ { 0x3217, 74862 },
+ { 0x320A, 74866 },
+ { 0x3218, 74869 },
+ { 0x320C, 74873 },
+ { 0x321A, 74876 },
+ { 0x320B, 74880 },
+ { 0x3219, 74883 },
+ { 0x321E, 74887 },
+ { 0x321D, 74892 },
+ { 0x247D, 74896 },
+ { 0x247E, 74899 },
+ { 0x247F, 74902 },
+ { 0x2487, 74905 },
+ { 0x2482, 74908 },
+ { 0x2483, 74911 },
+ { 0x2485, 74914 },
+ { 0x2481, 74917 },
+ { 0x2486, 74920 },
+ { 0x2480, 74923 },
+ { 0x2484, 74926 },
+ { 0x3220, 74929 },
+ { 0x3225, 74932 },
+ { 0x3230, 74935 },
+ { 0x3229, 74938 },
+ { 0x3221, 74941 },
+ { 0x323A, 74944 },
+ { 0x322B, 74947 },
+ { 0x3224, 74950 },
+ { 0x3223, 74953 },
+ { 0x3232, 74956 },
+ { 0x322A, 74959 },
+ { 0x3234, 74962 },
+ { 0x3228, 74965 },
+ { 0x3241, 74968 },
+ { 0x3242, 74971 },
+ { 0x322D, 74974 },
+ { 0x322F, 74977 },
+ { 0x3227, 74980 },
+ { 0x3238, 74983 },
+ { 0x322E, 74986 },
+ { 0x3243, 74989 },
+ { 0x3226, 74992 },
+ { 0x3231, 74995 },
+ { 0x323B, 74998 },
+ { 0x3222, 75001 },
+ { 0x322C, 75004 },
+ { 0x3233, 75007 },
+ { 0x3235, 75010 },
+ { 0x323F, 75013 },
+ { 0x3240, 75016 },
+ { 0x323E, 75019 },
+ { 0x3236, 75022 },
+ { 0x3239, 75025 },
+ { 0x323C, 75028 },
+ { 0x323D, 75031 },
+ { 0x3237, 75034 },
+ { 0x27C2, 75037 },
+ { 0x2AE1, 75038 },
+ { 0x200F, 75041 },
+ { 0x202E, 75043 },
+ { 0x202B, 75045 },
+ { 0x29E7, 75047 },
+ { 0x2243, 75048 },
+ { 0x2749, 75051 },
+ { 0x2715, 75053 },
+ { 0x00D7, 75055 },
+ { 0x2A34, 75057 },
+ { 0x2A35, 75063 },
+ { 0x2A37, 75069 },
+ { 0x2A3B, 75074 },
+ { 0x2A30, 75078 },
+ { 0x2A31, 75083 },
+ { 0x232A, 75087 },
+ { 0x29FD, 75090 },
+ { 0x00BB, 75094 },
+ { 0x26BC, 75099 },
+ { 0x27B6, 75100 },
+ { 0x27B4, 75104 },
+ { 0x27B5, 75108 },
+ { 0x27BA, 75111 },
+ { 0x273B, 75114 },
+ { 0x279D, 75116 },
+ { 0x27B3, 75119 },
+ { 0x30A0, 75122 },
+ { 0x309B, 75125 },
+ { 0x30FC, 75129 },
+ { 0x309C, 75133 },
+ { 0x2394, 75137 },
+ { 0x267D, 75139 },
+ { 0x238F, 75142 },
+ { 0x2390, 75145 },
+ { 0x2392, 75148 },
+ { 0x2391, 75150 },
+};
+static const struct { uint16_t code; uint32_t name:24; }
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+__attribute__((__packed__))
+#endif
+unicode_code_to_name[18242] = {
+ { 0x0020, 22740 },
+ { 0x0021, 68656 },
+ { 0x0022, 65766 },
+ { 0x0023, 35593 },
+ { 0x0024, 31225 },
+ { 0x0025, 42973 },
+ { 0x0026, 56108 },
+ { 0x0027, 66826 },
+ { 0x0028, 9464 },
+ { 0x0029, 21991 },
+ { 0x002A, 45081 },
+ { 0x002B, 9633 },
+ { 0x002C, 10461 },
+ { 0x002D, 69568 },
+ { 0x002E, 9112 },
+ { 0x002F, 43548 },
+ { 0x0030, 10518 },
+ { 0x0031, 10482 },
+ { 0x0032, 10494 },
+ { 0x0033, 10532 },
+ { 0x0034, 10506 },
+ { 0x0035, 10500 },
+ { 0x0036, 10488 },
+ { 0x0037, 10526 },
+ { 0x0038, 10520 },
+ { 0x0039, 10512 },
+ { 0x003A, 10455 },
+ { 0x003B, 65813 },
+ { 0x003C, 64726 },
+ { 0x003D, 31706 },
+ { 0x003E, 69497 },
+ { 0x003F, 55446 },
+ { 0x0040, 66837 },
+ { 0x0041, 18231 },
+ { 0x0042, 18454 },
+ { 0x0043, 18497 },
+ { 0x0044, 18552 },
+ { 0x0045, 18632 },
+ { 0x0046, 18817 },
+ { 0x0047, 18834 },
+ { 0x0048, 18893 },
+ { 0x0049, 18954 },
+ { 0x004A, 19068 },
+ { 0x004B, 19084 },
+ { 0x004C, 19154 },
+ { 0x004D, 19254 },
+ { 0x004E, 19284 },
+ { 0x004F, 19369 },
+ { 0x0050, 19659 },
+ { 0x0051, 19709 },
+ { 0x0052, 19728 },
+ { 0x0053, 19811 },
+ { 0x0054, 19888 },
+ { 0x0055, 19965 },
+ { 0x0056, 20187 },
+ { 0x0057, 20217 },
+ { 0x0058, 20265 },
+ { 0x0059, 20282 },
+ { 0x005A, 20361 },
+ { 0x005B, 9385 },
+ { 0x005C, 42994 },
+ { 0x005D, 21912 },
+ { 0x005E, 66835 },
+ { 0x005F, 6031 },
+ { 0x0060, 10638 },
+ { 0x0061, 14473 },
+ { 0x0062, 14711 },
+ { 0x0063, 14768 },
+ { 0x0064, 14829 },
+ { 0x0065, 14925 },
+ { 0x0066, 15123 },
+ { 0x0067, 15154 },
+ { 0x0068, 15220 },
+ { 0x0069, 15294 },
+ { 0x006A, 15408 },
+ { 0x006B, 15436 },
+ { 0x006C, 15513 },
+ { 0x006D, 15631 },
+ { 0x006E, 15675 },
+ { 0x006F, 15786 },
+ { 0x0070, 16077 },
+ { 0x0071, 16141 },
+ { 0x0072, 16173 },
+ { 0x0073, 16292 },
+ { 0x0074, 16396 },
+ { 0x0075, 16499 },
+ { 0x0076, 16728 },
+ { 0x0077, 16778 },
+ { 0x0078, 16833 },
+ { 0x0079, 16857 },
+ { 0x007A, 16943 },
+ { 0x007B, 9231 },
+ { 0x007C, 56066 },
+ { 0x007D, 21824 },
+ { 0x007E, 23008 },
+ { 0x00A0, 54927 },
+ { 0x00A1, 53357 },
+ { 0x00A2, 8729 },
+ { 0x00A3, 21740 },
+ { 0x00A4, 48521 },
+ { 0x00A5, 8712 },
+ { 0x00A6, 30305 },
+ { 0x00A7, 43022 },
+ { 0x00A8, 63244 },
+ { 0x00A9, 58349 },
+ { 0x00AA, 51775 },
+ { 0x00AB, 74612 },
+ { 0x00AC, 6723 },
+ { 0x00AD, 9710 },
+ { 0x00AE, 67979 },
+ { 0x00AF, 35513 },
+ { 0x00B0, 31179 },
+ { 0x00B1, 67969 },
+ { 0x00B2, 69284 },
+ { 0x00B3, 69319 },
+ { 0x00B4, 10104 },
+ { 0x00B5, 21176 },
+ { 0x00B6, 42975 },
+ { 0x00B7, 35570 },
+ { 0x00B8, 38870 },
+ { 0x00B9, 69280 },
+ { 0x00BA, 65112 },
+ { 0x00BB, 75094 },
+ { 0x00BC, 37732 },
+ { 0x00BD, 37712 },
+ { 0x00BE, 37768 },
+ { 0x00BF, 53352 },
+ { 0x00C0, 18348 },
+ { 0x00C1, 18288 },
+ { 0x00C2, 18406 },
+ { 0x00C3, 18354 },
+ { 0x00C4, 18392 },
+ { 0x00C5, 18265 },
+ { 0x00C6, 20426 },
+ { 0x00C7, 18532 },
+ { 0x00C8, 18675 },
+ { 0x00C9, 18657 },
+ { 0x00CA, 18762 },
+ { 0x00CB, 18756 },
+ { 0x00CC, 18997 },
+ { 0x00CD, 18979 },
+ { 0x00CE, 19062 },
+ { 0x00CF, 19048 },
+ { 0x00D0, 20523 },
+ { 0x00D1, 19350 },
+ { 0x00D2, 19483 },
+ { 0x00D3, 19465 },
+ { 0x00D4, 19611 },
+ { 0x00D5, 19489 },
+ { 0x00D6, 19597 },
+ { 0x00D7, 75055 },
+ { 0x00D8, 19576 },
+ { 0x00D9, 20061 },
+ { 0x00DA, 20043 },
+ { 0x00DB, 20174 },
+ { 0x00DC, 20129 },
+ { 0x00DD, 20319 },
+ { 0x00DE, 20626 },
+ { 0x00DF, 17465 },
+ { 0x00E0, 14590 },
+ { 0x00E1, 14530 },
+ { 0x00E2, 14663 },
+ { 0x00E3, 14604 },
+ { 0x00E4, 14642 },
+ { 0x00E5, 14507 },
+ { 0x00E6, 17042 },
+ { 0x00E7, 14809 },
+ { 0x00E8, 14968 },
+ { 0x00E9, 14950 },
+ { 0x00EA, 15068 },
+ { 0x00EB, 15055 },
+ { 0x00EC, 15330 },
+ { 0x00ED, 15312 },
+ { 0x00EE, 15402 },
+ { 0x00EF, 15381 },
+ { 0x00F0, 17225 },
+ { 0x00F1, 15739 },
+ { 0x00F2, 15908 },
+ { 0x00F3, 15890 },
+ { 0x00F4, 16029 },
+ { 0x00F5, 15914 },
+ { 0x00F6, 16015 },
+ { 0x00F7, 50308 },
+ { 0x00F8, 15994 },
+ { 0x00F9, 16595 },
+ { 0x00FA, 16577 },
+ { 0x00FB, 16715 },
+ { 0x00FC, 16663 },
+ { 0x00FD, 16901 },
+ { 0x00FE, 17476 },
+ { 0x00FF, 16931 },
+ { 0x0100, 18367 },
+ { 0x0101, 14617 },
+ { 0x0102, 18294 },
+ { 0x0103, 14536 },
+ { 0x0104, 18373 },
+ { 0x0105, 14623 },
+ { 0x0106, 18514 },
+ { 0x0107, 14791 },
+ { 0x0108, 18546 },
+ { 0x0109, 14823 },
+ { 0x010A, 18501 },
+ { 0x010B, 14772 },
+ { 0x010C, 18520 },
+ { 0x010D, 14797 },
+ { 0x010E, 18583 },
+ { 0x010F, 14880 },
+ { 0x0110, 18607 },
+ { 0x0111, 14893 },
+ { 0x0112, 18701 },
+ { 0x0113, 15000 },
+ { 0x0114, 18663 },
+ { 0x0115, 14956 },
+ { 0x0116, 18636 },
+ { 0x0117, 14929 },
+ { 0x0118, 18723 },
+ { 0x0119, 15022 },
+ { 0x011A, 18669 },
+ { 0x011B, 14962 },
+ { 0x011C, 18887 },
+ { 0x011D, 15214 },
+ { 0x011E, 18857 },
+ { 0x011F, 15177 },
+ { 0x0120, 18838 },
+ { 0x0121, 15158 },
+ { 0x0122, 18881 },
+ { 0x0123, 15201 },
+ { 0x0124, 18948 },
+ { 0x0125, 15288 },
+ { 0x0126, 18924 },
+ { 0x0127, 15264 },
+ { 0x0128, 19003 },
+ { 0x0129, 15336 },
+ { 0x012A, 19023 },
+ { 0x012B, 15356 },
+ { 0x012C, 18985 },
+ { 0x012D, 15318 },
+ { 0x012E, 19029 },
+ { 0x012F, 15362 },
+ { 0x0130, 18958 },
+ { 0x0131, 17682 },
+ { 0x0132, 20774 },
+ { 0x0133, 17909 },
+ { 0x0134, 19078 },
+ { 0x0135, 15424 },
+ { 0x0136, 19135 },
+ { 0x0137, 15487 },
+ { 0x0138, 17263 },
+ { 0x0139, 19194 },
+ { 0x013A, 15565 },
+ { 0x013B, 19241 },
+ { 0x013C, 15604 },
+ { 0x013D, 19200 },
+ { 0x013E, 15571 },
+ { 0x013F, 19221 },
+ { 0x0140, 15584 },
+ { 0x0141, 19235 },
+ { 0x0142, 15598 },
+ { 0x0143, 19324 },
+ { 0x0144, 15721 },
+ { 0x0145, 19356 },
+ { 0x0146, 15752 },
+ { 0x0147, 19330 },
+ { 0x0148, 15727 },
+ { 0x0149, 15779 },
+ { 0x014A, 20515 },
+ { 0x014B, 17197 },
+ { 0x014C, 19533 },
+ { 0x014D, 15958 },
+ { 0x014E, 19471 },
+ { 0x014F, 15896 },
+ { 0x0150, 19519 },
+ { 0x0151, 15944 },
+ { 0x0152, 20778 },
+ { 0x0153, 17913 },
+ { 0x0154, 19768 },
+ { 0x0155, 16220 },
+ { 0x0156, 19793 },
+ { 0x0157, 16252 },
+ { 0x0158, 19774 },
+ { 0x0159, 16226 },
+ { 0x015A, 19839 },
+ { 0x015B, 16326 },
+ { 0x015C, 19882 },
+ { 0x015D, 16390 },
+ { 0x015E, 19876 },
+ { 0x015F, 16377 },
+ { 0x0160, 19854 },
+ { 0x0161, 16341 },
+ { 0x0162, 19938 },
+ { 0x0163, 16459 },
+ { 0x0164, 19919 },
+ { 0x0165, 16433 },
+ { 0x0166, 19932 },
+ { 0x0167, 16453 },
+ { 0x0168, 20067 },
+ { 0x0169, 16601 },
+ { 0x016A, 20102 },
+ { 0x016B, 16636 },
+ { 0x016C, 20049 },
+ { 0x016D, 16583 },
+ { 0x016E, 20036 },
+ { 0x016F, 16570 },
+ { 0x0170, 20088 },
+ { 0x0171, 16622 },
+ { 0x0172, 20116 },
+ { 0x0173, 16650 },
+ { 0x0174, 20259 },
+ { 0x0175, 16827 },
+ { 0x0176, 20355 },
+ { 0x0177, 16937 },
+ { 0x0178, 20349 },
+ { 0x0179, 20392 },
+ { 0x017A, 16980 },
+ { 0x017B, 20365 },
+ { 0x017C, 16947 },
+ { 0x017D, 20398 },
+ { 0x017E, 16986 },
+ { 0x017F, 17341 },
+ { 0x0180, 14749 },
+ { 0x0181, 18472 },
+ { 0x0182, 18491 },
+ { 0x0183, 14755 },
+ { 0x0184, 20570 },
+ { 0x0185, 17406 },
+ { 0x0186, 20565 },
+ { 0x0187, 18508 },
+ { 0x0188, 14785 },
+ { 0x0189, 20675 },
+ { 0x018A, 18570 },
+ { 0x018B, 18613 },
+ { 0x018C, 14899 },
+ { 0x018D, 17671 },
+ { 0x018E, 20726 },
+ { 0x018F, 20609 },
+ { 0x0190, 20560 },
+ { 0x0191, 18828 },
+ { 0x0192, 15134 },
+ { 0x0193, 18845 },
+ { 0x0194, 20601 },
+ { 0x0195, 17112 },
+ { 0x0196, 20556 },
+ { 0x0197, 19035 },
+ { 0x0198, 19095 },
+ { 0x0199, 15447 },
+ { 0x019A, 15517 },
+ { 0x019B, 17528 },
+ { 0x019C, 20659 },
+ { 0x019D, 19302 },
+ { 0x019E, 15713 },
+ { 0x019F, 19555 },
+ { 0x01A0, 19403 },
+ { 0x01A1, 15828 },
+ { 0x01A2, 20491 },
+ { 0x01A3, 17138 },
+ { 0x01A4, 19670 },
+ { 0x01A5, 16088 },
+ { 0x01A6, 17935 },
+ { 0x01A7, 20575 },
+ { 0x01A8, 17411 },
+ { 0x01A9, 20519 },
+ { 0x01AA, 18206 },
+ { 0x01AB, 16465 },
+ { 0x01AC, 19906 },
+ { 0x01AD, 16420 },
+ { 0x01AE, 19951 },
+ { 0x01AF, 19988 },
+ { 0x01B0, 16522 },
+ { 0x01B1, 20715 },
+ { 0x01B2, 20198 },
+ { 0x01B3, 20300 },
+ { 0x01B4, 16875 },
+ { 0x01B5, 20404 },
+ { 0x01B6, 17006 },
+ { 0x01B7, 20527 },
+ { 0x01B8, 20537 },
+ { 0x01B9, 17258 },
+ { 0x01BA, 17239 },
+ { 0x01BB, 17941 },
+ { 0x01BC, 20580 },
+ { 0x01BD, 17416 },
+ { 0x01BE, 18199 },
+ { 0x01BF, 17946 },
+ { 0x01C0, 18155 },
+ { 0x01C1, 18174 },
+ { 0x01C2, 18178 },
+ { 0x01C3, 18218 },
+ { 0x01C4, 20469 },
+ { 0x01C5, 18597 },
+ { 0x01C6, 17090 },
+ { 0x01C7, 20483 },
+ { 0x01C8, 19206 },
+ { 0x01C9, 17120 },
+ { 0x01CA, 20487 },
+ { 0x01CB, 19342 },
+ { 0x01CC, 17134 },
+ { 0x01CD, 18342 },
+ { 0x01CE, 14584 },
+ { 0x01CF, 18991 },
+ { 0x01D0, 15324 },
+ { 0x01D1, 19477 },
+ { 0x01D2, 15902 },
+ { 0x01D3, 20055 },
+ { 0x01D4, 16589 },
+ { 0x01D5, 20159 },
+ { 0x01D6, 16693 },
+ { 0x01D7, 20135 },
+ { 0x01D8, 16669 },
+ { 0x01D9, 20143 },
+ { 0x01DA, 16677 },
+ { 0x01DB, 20151 },
+ { 0x01DC, 16685 },
+ { 0x01DD, 17544 },
+ { 0x01DE, 18398 },
+ { 0x01DF, 14648 },
+ { 0x01E0, 18242 },
+ { 0x01E1, 14484 },
+ { 0x01E2, 20436 },
+ { 0x01E3, 17052 },
+ { 0x01E4, 18875 },
+ { 0x01E5, 15195 },
+ { 0x01E6, 18863 },
+ { 0x01E7, 15183 },
+ { 0x01E8, 19114 },
+ { 0x01E9, 15466 },
+ { 0x01EA, 19562 },
+ { 0x01EB, 15980 },
+ { 0x01EC, 19568 },
+ { 0x01ED, 15986 },
+ { 0x01EE, 20531 },
+ { 0x01EF, 17245 },
+ { 0x01F0, 15412 },
+ { 0x01F1, 20465 },
+ { 0x01F2, 18589 },
+ { 0x01F3, 17086 },
+ { 0x01F4, 18851 },
+ { 0x01F5, 15171 },
+ { 0x01F6, 20605 },
+ { 0x01F7, 20589 },
+ { 0x01F8, 19336 },
+ { 0x01F9, 15733 },
+ { 0x01FA, 18272 },
+ { 0x01FB, 14514 },
+ { 0x01FC, 20430 },
+ { 0x01FD, 17046 },
+ { 0x01FE, 19582 },
+ { 0x01FF, 16000 },
+ { 0x0200, 18360 },
+ { 0x0201, 14610 },
+ { 0x0202, 18385 },
+ { 0x0203, 14635 },
+ { 0x0204, 18694 },
+ { 0x0205, 14993 },
+ { 0x0206, 18749 },
+ { 0x0207, 15048 },
+ { 0x0208, 19016 },
+ { 0x0209, 15349 },
+ { 0x020A, 19041 },
+ { 0x020B, 15374 },
+ { 0x020C, 19526 },
+ { 0x020D, 15951 },
+ { 0x020E, 19590 },
+ { 0x020F, 16008 },
+ { 0x0210, 19780 },
+ { 0x0211, 16232 },
+ { 0x0212, 19799 },
+ { 0x0213, 16280 },
+ { 0x0214, 20095 },
+ { 0x0215, 16629 },
+ { 0x0216, 20122 },
+ { 0x0217, 16656 },
+ { 0x0218, 19869 },
+ { 0x0219, 16356 },
+ { 0x021A, 19925 },
+ { 0x021B, 16439 },
+ { 0x021C, 20593 },
+ { 0x021D, 17425 },
+ { 0x021E, 18918 },
+ { 0x021F, 15258 },
+ { 0x0220, 19316 },
+ { 0x0221, 14847 },
+ { 0x0222, 20499 },
+ { 0x0223, 17146 },
+ { 0x0224, 20379 },
+ { 0x0225, 16967 },
+ { 0x0226, 18235 },
+ { 0x0227, 14477 },
+ { 0x0228, 18735 },
+ { 0x0229, 15034 },
+ { 0x022A, 19603 },
+ { 0x022B, 16021 },
+ { 0x022C, 19503 },
+ { 0x022D, 15928 },
+ { 0x022E, 19373 },
+ { 0x022F, 15790 },
+ { 0x0230, 19380 },
+ { 0x0231, 15797 },
+ { 0x0232, 20337 },
+ { 0x0233, 16919 },
+ { 0x0234, 15545 },
+ { 0x0235, 15693 },
+ { 0x0236, 16414 },
+ { 0x0237, 17687 },
+ { 0x0238, 17081 },
+ { 0x0239, 17150 },
+ { 0x023A, 18379 },
+ { 0x023B, 18526 },
+ { 0x023C, 14803 },
+ { 0x023D, 19158 },
+ { 0x023E, 19944 },
+ { 0x023F, 16363 },
+ { 0x0240, 16992 },
+ { 0x0241, 20680 },
+ { 0x0242, 17708 },
+ { 0x0243, 18485 },
+ { 0x0244, 19969 },
+ { 0x0245, 20664 },
+ { 0x0246, 18729 },
+ { 0x0247, 15028 },
+ { 0x0248, 19072 },
+ { 0x0249, 15418 },
+ { 0x024A, 20618 },
+ { 0x024B, 16151 },
+ { 0x024C, 19787 },
+ { 0x024D, 16246 },
+ { 0x024E, 20343 },
+ { 0x024F, 16925 },
+ { 0x0250, 17539 },
+ { 0x0251, 17429 },
+ { 0x0252, 17666 },
+ { 0x0253, 14729 },
+ { 0x0254, 17383 },
+ { 0x0255, 14779 },
+ { 0x0256, 14874 },
+ { 0x0257, 14853 },
+ { 0x0258, 17765 },
+ { 0x0259, 17448 },
+ { 0x025A, 17452 },
+ { 0x025B, 17370 },
+ { 0x025C, 17777 },
+ { 0x025D, 17783 },
+ { 0x025E, 17521 },
+ { 0x025F, 17692 },
+ { 0x0260, 15165 },
+ { 0x0261, 17534 },
+ { 0x0262, 17979 },
+ { 0x0263, 17444 },
+ { 0x0264, 17396 },
+ { 0x0265, 17554 },
+ { 0x0266, 15238 },
+ { 0x0267, 17321 },
+ { 0x0268, 15368 },
+ { 0x0269, 17327 },
+ { 0x026A, 17996 },
+ { 0x026B, 15591 },
+ { 0x026C, 15539 },
+ { 0x026D, 15617 },
+ { 0x026E, 17337 },
+ { 0x026F, 17590 },
+ { 0x0270, 17595 },
+ { 0x0271, 15649 },
+ { 0x0272, 15699 },
+ { 0x0273, 15765 },
+ { 0x0274, 18028 },
+ { 0x0275, 17494 },
+ { 0x0276, 18088 },
+ { 0x0277, 17516 },
+ { 0x0278, 17279 },
+ { 0x0279, 17603 },
+ { 0x027A, 17615 },
+ { 0x027B, 17608 },
+ { 0x027C, 16207 },
+ { 0x027D, 16214 },
+ { 0x027E, 16265 },
+ { 0x027F, 17770 },
+ { 0x0280, 18043 },
+ { 0x0281, 18137 },
+ { 0x0282, 16320 },
+ { 0x0283, 17201 },
+ { 0x0284, 17699 },
+ { 0x0285, 17470 },
+ { 0x0286, 17205 },
+ { 0x0287, 17630 },
+ { 0x0288, 16485 },
+ { 0x0289, 16503 },
+ { 0x028A, 17743 },
+ { 0x028B, 16745 },
+ { 0x028C, 17635 },
+ { 0x028D, 17640 },
+ { 0x028E, 17645 },
+ { 0x028F, 18073 },
+ { 0x0290, 17025 },
+ { 0x0291, 16961 },
+ { 0x0292, 17229 },
+ { 0x0293, 17233 },
+ { 0x0294, 18164 },
+ { 0x0295, 18226 },
+ { 0x0296, 18194 },
+ { 0x0297, 18222 },
+ { 0x0298, 18186 },
+ { 0x0299, 17954 },
+ { 0x029A, 17510 },
+ { 0x029B, 17984 },
+ { 0x029C, 17991 },
+ { 0x029D, 15430 },
+ { 0x029E, 17580 },
+ { 0x029F, 18011 },
+ { 0x02A0, 16145 },
+ { 0x02A1, 18168 },
+ { 0x02A2, 18211 },
+ { 0x02A3, 17096 },
+ { 0x02A4, 17302 },
+ { 0x02A5, 17101 },
+ { 0x02A6, 17168 },
+ { 0x02A7, 17401 },
+ { 0x02A8, 17155 },
+ { 0x02A9, 17307 },
+ { 0x02AA, 17124 },
+ { 0x02AB, 17129 },
+ { 0x02AC, 18190 },
+ { 0x02AD, 18182 },
+ { 0x02AE, 17559 },
+ { 0x02AF, 17566 },
+ { 0x02B0, 54170 },
+ { 0x02B1, 54174 },
+ { 0x02B2, 54186 },
+ { 0x02B3, 54250 },
+ { 0x02B4, 54449 },
+ { 0x02B5, 54454 },
+ { 0x02B6, 54509 },
+ { 0x02B7, 54294 },
+ { 0x02B8, 54302 },
+ { 0x02B9, 54116 },
+ { 0x02BA, 54543 },
+ { 0x02BB, 54612 },
+ { 0x02BC, 54827 },
+ { 0x02BD, 54790 },
+ { 0x02BE, 54119 },
+ { 0x02BF, 54058 },
+ { 0x02C0, 54775 },
+ { 0x02C1, 54794 },
+ { 0x02C2, 54063 },
+ { 0x02C3, 54124 },
+ { 0x02C4, 53873 },
+ { 0x02C5, 54025 },
+ { 0x02C6, 54830 },
+ { 0x02C7, 10445 },
+ { 0x02C8, 54799 },
+ { 0x02C9, 54551 },
+ { 0x02CA, 54081 },
+ { 0x02CB, 54102 },
+ { 0x02CC, 53975 },
+ { 0x02CD, 53965 },
+ { 0x02CE, 53938 },
+ { 0x02CF, 53933 },
+ { 0x02D0, 54858 },
+ { 0x02D1, 54029 },
+ { 0x02D2, 54721 },
+ { 0x02D3, 54715 },
+ { 0x02D4, 53869 },
+ { 0x02D5, 54021 },
+ { 0x02D6, 54071 },
+ { 0x02D7, 54112 },
+ { 0x02D8, 10378 },
+ { 0x02D9, 5782 },
+ { 0x02DA, 9699 },
+ { 0x02DB, 35640 },
+ { 0x02DC, 22588 },
+ { 0x02DD, 31564 },
+ { 0x02DE, 54596 },
+ { 0x02DF, 54098 },
+ { 0x02E0, 54383 },
+ { 0x02E1, 54200 },
+ { 0x02E2, 54254 },
+ { 0x02E3, 54298 },
+ { 0x02E4, 54532 },
+ { 0x02E5, 54834 },
+ { 0x02E6, 54034 },
+ { 0x02E7, 53991 },
+ { 0x02E8, 53928 },
+ { 0x02E9, 54803 },
+ { 0x02EA, 54015 },
+ { 0x02EB, 54075 },
+ { 0x02EC, 54779 },
+ { 0x02ED, 54862 },
+ { 0x02EE, 54547 },
+ { 0x02EF, 53909 },
+ { 0x02F0, 53904 },
+ { 0x02F1, 53919 },
+ { 0x02F2, 53943 },
+ { 0x02F3, 53924 },
+ { 0x02F4, 54554 },
+ { 0x02F5, 54565 },
+ { 0x02F6, 54559 },
+ { 0x02F7, 53948 },
+ { 0x02F8, 54581 },
+ { 0x02F9, 54090 },
+ { 0x02FA, 53899 },
+ { 0x02FB, 54085 },
+ { 0x02FC, 53894 },
+ { 0x02FD, 54128 },
+ { 0x02FE, 54067 },
+ { 0x02FF, 53914 },
+ { 0x0300, 57554 },
+ { 0x0301, 57523 },
+ { 0x0302, 58283 },
+ { 0x0303, 57841 },
+ { 0x0304, 57946 },
+ { 0x0305, 58215 },
+ { 0x0306, 57530 },
+ { 0x0307, 57402 },
+ { 0x0308, 58240 },
+ { 0x0309, 57427 },
+ { 0x030A, 57506 },
+ { 0x030B, 57876 },
+ { 0x030C, 57535 },
+ { 0x030D, 58221 },
+ { 0x030E, 57918 },
+ { 0x030F, 57887 },
+ { 0x0310, 58305 },
+ { 0x0311, 58191 },
+ { 0x0312, 57970 },
+ { 0x0313, 57540 },
+ { 0x0314, 58217 },
+ { 0x0315, 57543 },
+ { 0x0316, 57557 },
+ { 0x0317, 57526 },
+ { 0x0318, 57442 },
+ { 0x0319, 57783 },
+ { 0x031A, 57446 },
+ { 0x031B, 57430 },
+ { 0x031C, 57437 },
+ { 0x031D, 57392 },
+ { 0x031E, 57419 },
+ { 0x031F, 57502 },
+ { 0x0320, 57769 },
+ { 0x0321, 58307 },
+ { 0x0322, 58279 },
+ { 0x0323, 57409 },
+ { 0x0324, 58242 },
+ { 0x0325, 57509 },
+ { 0x0326, 57547 },
+ { 0x0327, 57983 },
+ { 0x0328, 57959 },
+ { 0x0329, 58225 },
+ { 0x032A, 57857 },
+ { 0x032B, 58202 },
+ { 0x032C, 57537 },
+ { 0x032D, 58286 },
+ { 0x032E, 57532 },
+ { 0x032F, 58194 },
+ { 0x0330, 57843 },
+ { 0x0331, 57952 },
+ { 0x0332, 57412 },
+ { 0x0333, 57868 },
+ { 0x0334, 57846 },
+ { 0x0335, 57821 },
+ { 0x0336, 57489 },
+ { 0x0337, 57825 },
+ { 0x0338, 57493 },
+ { 0x0339, 57778 },
+ { 0x033A, 58198 },
+ { 0x033B, 57964 },
+ { 0x033C, 57991 },
+ { 0x033D, 57383 },
+ { 0x033E, 58229 },
+ { 0x033F, 57915 },
+ { 0x0340, 57550 },
+ { 0x0341, 57519 },
+ { 0x0342, 57580 },
+ { 0x0343, 57561 },
+ { 0x0344, 57576 },
+ { 0x0345, 57583 },
+ { 0x0346, 57854 },
+ { 0x0347, 57942 },
+ { 0x0348, 57923 },
+ { 0x0349, 57450 },
+ { 0x034A, 57415 },
+ { 0x034B, 58293 },
+ { 0x034C, 57849 },
+ { 0x034D, 57467 },
+ { 0x034E, 57994 },
+ { 0x034F, 58188 },
+ { 0x0350, 57813 },
+ { 0x0351, 57432 },
+ { 0x0352, 57985 },
+ { 0x0353, 57386 },
+ { 0x0354, 57480 },
+ { 0x0355, 57817 },
+ { 0x0356, 57799 },
+ { 0x0357, 57773 },
+ { 0x0358, 57405 },
+ { 0x0359, 58001 },
+ { 0x035A, 57872 },
+ { 0x035B, 57974 },
+ { 0x035C, 57883 },
+ { 0x035D, 57880 },
+ { 0x035E, 57904 },
+ { 0x035F, 57907 },
+ { 0x0360, 57891 },
+ { 0x0361, 57911 },
+ { 0x0362, 57937 },
+ { 0x0363, 57586 },
+ { 0x0364, 57607 },
+ { 0x0365, 57622 },
+ { 0x0366, 57647 },
+ { 0x0367, 57679 },
+ { 0x0368, 57591 },
+ { 0x0369, 57602 },
+ { 0x036A, 57617 },
+ { 0x036B, 57637 },
+ { 0x036C, 57652 },
+ { 0x036D, 57674 },
+ { 0x036E, 57684 },
+ { 0x036F, 57689 },
+ { 0x0370, 12320 },
+ { 0x0371, 10998 },
+ { 0x0372, 12792 },
+ { 0x0373, 11590 },
+ { 0x0374, 13034 },
+ { 0x0375, 10720 },
+ { 0x0376, 12999 },
+ { 0x0377, 11869 },
+ { 0x037A, 13522 },
+ { 0x037B, 11881 },
+ { 0x037C, 10738 },
+ { 0x037D, 11874 },
+ { 0x037E, 13059 },
+ { 0x0384, 11898 },
+ { 0x0385, 13083 },
+ { 0x0386, 12574 },
+ { 0x0387, 10643 },
+ { 0x0388, 12851 },
+ { 0x0389, 12268 },
+ { 0x038A, 12394 },
+ { 0x038C, 12917 },
+ { 0x038E, 12969 },
+ { 0x038F, 12766 },
+ { 0x0390, 11110 },
+ { 0x0391, 12428 },
+ { 0x0392, 12316 },
+ { 0x0393, 12608 },
+ { 0x0394, 12604 },
+ { 0x0395, 12797 },
+ { 0x0396, 12424 },
+ { 0x0397, 12122 },
+ { 0x0398, 12788 },
+ { 0x0399, 12324 },
+ { 0x039A, 12612 },
+ { 0x039B, 12616 },
+ { 0x039C, 12102 },
+ { 0x039D, 12106 },
+ { 0x039E, 12114 },
+ { 0x039F, 12863 },
+ { 0x03A0, 12110 },
+ { 0x03A1, 12294 },
+ { 0x03A3, 12784 },
+ { 0x03A4, 12312 },
+ { 0x03A5, 12929 },
+ { 0x03A6, 12286 },
+ { 0x03A7, 12118 },
+ { 0x03A8, 12290 },
+ { 0x03A9, 12620 },
+ { 0x03AA, 12418 },
+ { 0x03AB, 12993 },
+ { 0x03AC, 11298 },
+ { 0x03AD, 11653 },
+ { 0x03AE, 10918 },
+ { 0x03AF, 11072 },
+ { 0x03B0, 11839 },
+ { 0x03B1, 11144 },
+ { 0x03B2, 10994 },
+ { 0x03B3, 11359 },
+ { 0x03B4, 11350 },
+ { 0x03B5, 11599 },
+ { 0x03B6, 11140 },
+ { 0x03B7, 10764 },
+ { 0x03B8, 11577 },
+ { 0x03B9, 11002 },
+ { 0x03BA, 11363 },
+ { 0x03BB, 11371 },
+ { 0x03BC, 10744 },
+ { 0x03BD, 10748 },
+ { 0x03BE, 10756 },
+ { 0x03BF, 11665 },
+ { 0x03C0, 10752 },
+ { 0x03C1, 10966 },
+ { 0x03C2, 11354 },
+ { 0x03C3, 11573 },
+ { 0x03C4, 10990 },
+ { 0x03C5, 11731 },
+ { 0x03C6, 10958 },
+ { 0x03C7, 10760 },
+ { 0x03C8, 10962 },
+ { 0x03C9, 11375 },
+ { 0x03CA, 11096 },
+ { 0x03CB, 11825 },
+ { 0x03CC, 11719 },
+ { 0x03CD, 11801 },
+ { 0x03CE, 11529 },
+ { 0x03CF, 12088 },
+ { 0x03D0, 10678 },
+ { 0x03D1, 11887 },
+ { 0x03D2, 13037 },
+ { 0x03D3, 13042 },
+ { 0x03D4, 13049 },
+ { 0x03D5, 10659 },
+ { 0x03D6, 10640 },
+ { 0x03D7, 10646 },
+ { 0x03D8, 12064 },
+ { 0x03D9, 11585 },
+ { 0x03DA, 12061 },
+ { 0x03DB, 11581 },
+ { 0x03DC, 12068 },
+ { 0x03DD, 11595 },
+ { 0x03DE, 12030 },
+ { 0x03DF, 11367 },
+ { 0x03E0, 12033 },
+ { 0x03E1, 11569 },
+ { 0x03E2, 31064 },
+ { 0x03E3, 30771 },
+ { 0x03E4, 30926 },
+ { 0x03E5, 30633 },
+ { 0x03E6, 31060 },
+ { 0x03E7, 30767 },
+ { 0x03E8, 31052 },
+ { 0x03E9, 30759 },
+ { 0x03EA, 31104 },
+ { 0x03EB, 30811 },
+ { 0x03EC, 31100 },
+ { 0x03ED, 30807 },
+ { 0x03EE, 30918 },
+ { 0x03EF, 30625 },
+ { 0x03F0, 10714 },
+ { 0x03F1, 10667 },
+ { 0x03F2, 12071 },
+ { 0x03F3, 12027 },
+ { 0x03F4, 12092 },
+ { 0x03F5, 12075 },
+ { 0x03F6, 13062 },
+ { 0x03F7, 12308 },
+ { 0x03F8, 10986 },
+ { 0x03F9, 13004 },
+ { 0x03FA, 12304 },
+ { 0x03FB, 10982 },
+ { 0x03FC, 10662 },
+ { 0x03FD, 13016 },
+ { 0x03FE, 12096 },
+ { 0x03FF, 13009 },
+ { 0x0400, 49628 },
+ { 0x0401, 49634 },
+ { 0x0402, 49779 },
+ { 0x0403, 49828 },
+ { 0x0404, 50271 },
+ { 0x0405, 49787 },
+ { 0x0406, 50281 },
+ { 0x0407, 49723 },
+ { 0x0408, 49638 },
+ { 0x0409, 49848 },
+ { 0x040A, 49852 },
+ { 0x040B, 50007 },
+ { 0x040C, 49836 },
+ { 0x040D, 49451 },
+ { 0x040E, 50103 },
+ { 0x040F, 49910 },
+ { 0x0410, 49421 },
+ { 0x0411, 49502 },
+ { 0x0412, 49711 },
+ { 0x0413, 49791 },
+ { 0x0414, 49506 },
+ { 0x0415, 49618 },
+ { 0x0416, 49884 },
+ { 0x0417, 49735 },
+ { 0x0418, 49447 },
+ { 0x0419, 50091 },
+ { 0x041A, 49642 },
+ { 0x041B, 49514 },
+ { 0x041C, 49537 },
+ { 0x041D, 49547 },
+ { 0x041E, 49469 },
+ { 0x041F, 49675 },
+ { 0x0420, 49576 },
+ { 0x0421, 49586 },
+ { 0x0422, 49690 },
+ { 0x0423, 49479 },
+ { 0x0424, 49510 },
+ { 0x0425, 49596 },
+ { 0x0426, 49868 },
+ { 0x0427, 49756 },
+ { 0x0428, 49864 },
+ { 0x0429, 50087 },
+ { 0x042A, 49926 },
+ { 0x042B, 50019 },
+ { 0x042C, 49998 },
+ { 0x042D, 49437 },
+ { 0x042E, 49731 },
+ { 0x042F, 49719 },
+ { 0x0430, 48523 },
+ { 0x0431, 48604 },
+ { 0x0432, 48813 },
+ { 0x0433, 48893 },
+ { 0x0434, 48608 },
+ { 0x0435, 48720 },
+ { 0x0436, 48986 },
+ { 0x0437, 48837 },
+ { 0x0438, 48549 },
+ { 0x0439, 49193 },
+ { 0x043A, 48744 },
+ { 0x043B, 48616 },
+ { 0x043C, 48639 },
+ { 0x043D, 48649 },
+ { 0x043E, 48571 },
+ { 0x043F, 48777 },
+ { 0x0440, 48678 },
+ { 0x0441, 48688 },
+ { 0x0442, 48792 },
+ { 0x0443, 48581 },
+ { 0x0444, 48612 },
+ { 0x0445, 48698 },
+ { 0x0446, 48970 },
+ { 0x0447, 48858 },
+ { 0x0448, 48966 },
+ { 0x0449, 49189 },
+ { 0x044A, 49028 },
+ { 0x044B, 49121 },
+ { 0x044C, 49100 },
+ { 0x044D, 48539 },
+ { 0x044E, 48833 },
+ { 0x044F, 48821 },
+ { 0x0450, 48730 },
+ { 0x0451, 48736 },
+ { 0x0452, 48881 },
+ { 0x0453, 48930 },
+ { 0x0454, 49377 },
+ { 0x0455, 48889 },
+ { 0x0456, 49387 },
+ { 0x0457, 48825 },
+ { 0x0458, 48740 },
+ { 0x0459, 48950 },
+ { 0x045A, 48954 },
+ { 0x045B, 49109 },
+ { 0x045C, 48938 },
+ { 0x045D, 48553 },
+ { 0x045E, 49205 },
+ { 0x045F, 49012 },
+ { 0x0460, 50062 },
+ { 0x0461, 49164 },
+ { 0x0462, 49880 },
+ { 0x0463, 48982 },
+ { 0x0464, 50173 },
+ { 0x0465, 49275 },
+ { 0x0466, 50132 },
+ { 0x0467, 49234 },
+ { 0x0468, 50196 },
+ { 0x0469, 49298 },
+ { 0x046A, 49751 },
+ { 0x046B, 48853 },
+ { 0x046C, 50178 },
+ { 0x046D, 49280 },
+ { 0x046E, 49840 },
+ { 0x046F, 48942 },
+ { 0x0470, 49856 },
+ { 0x0471, 48958 },
+ { 0x0472, 49922 },
+ { 0x0473, 49024 },
+ { 0x0474, 50151 },
+ { 0x0475, 49253 },
+ { 0x0476, 50155 },
+ { 0x0477, 49257 },
+ { 0x0478, 49707 },
+ { 0x0479, 48809 },
+ { 0x047A, 50072 },
+ { 0x047B, 49174 },
+ { 0x047C, 50066 },
+ { 0x047D, 49168 },
+ { 0x047E, 49671 },
+ { 0x047F, 48773 },
+ { 0x0480, 50058 },
+ { 0x0481, 49160 },
+ { 0x0482, 50303 },
+ { 0x0483, 58017 },
+ { 0x0484, 58185 },
+ { 0x0485, 58009 },
+ { 0x0486, 58013 },
+ { 0x0487, 58177 },
+ { 0x0488, 58165 },
+ { 0x0489, 58173 },
+ { 0x048A, 50096 },
+ { 0x048B, 49198 },
+ { 0x048C, 50217 },
+ { 0x048D, 49323 },
+ { 0x048E, 49580 },
+ { 0x048F, 48682 },
+ { 0x0490, 49816 },
+ { 0x0491, 48918 },
+ { 0x0492, 49802 },
+ { 0x0493, 48904 },
+ { 0x0494, 49795 },
+ { 0x0495, 48897 },
+ { 0x0496, 49894 },
+ { 0x0497, 48996 },
+ { 0x0498, 49739 },
+ { 0x0499, 48841 },
+ { 0x049A, 49665 },
+ { 0x049B, 48767 },
+ { 0x049C, 49658 },
+ { 0x049D, 48760 },
+ { 0x049E, 49652 },
+ { 0x049F, 48754 },
+ { 0x04A0, 50141 },
+ { 0x04A1, 49243 },
+ { 0x04A2, 49570 },
+ { 0x04A3, 48672 },
+ { 0x04A4, 50291 },
+ { 0x04A5, 49397 },
+ { 0x04A6, 49679 },
+ { 0x04A7, 48781 },
+ { 0x04A8, 50234 },
+ { 0x04A9, 49340 },
+ { 0x04AA, 49590 },
+ { 0x04AB, 48692 },
+ { 0x04AC, 49701 },
+ { 0x04AD, 48803 },
+ { 0x04AE, 50222 },
+ { 0x04AF, 49328 },
+ { 0x04B0, 50227 },
+ { 0x04B1, 49333 },
+ { 0x04B2, 49612 },
+ { 0x04B3, 48714 },
+ { 0x04B4, 50296 },
+ { 0x04B5, 49402 },
+ { 0x04B6, 49767 },
+ { 0x04B7, 48869 },
+ { 0x04B8, 49760 },
+ { 0x04B9, 48862 },
+ { 0x04BA, 49975 },
+ { 0x04BB, 49077 },
+ { 0x04BC, 50239 },
+ { 0x04BD, 49345 },
+ { 0x04BE, 50244 },
+ { 0x04BF, 49350 },
+ { 0x04C0, 49414 },
+ { 0x04C1, 49888 },
+ { 0x04C2, 48990 },
+ { 0x04C3, 49646 },
+ { 0x04C4, 48748 },
+ { 0x04C5, 49524 },
+ { 0x04C6, 48626 },
+ { 0x04C7, 49551 },
+ { 0x04C8, 48653 },
+ { 0x04C9, 49557 },
+ { 0x04CA, 48659 },
+ { 0x04CB, 50276 },
+ { 0x04CC, 49382 },
+ { 0x04CD, 49541 },
+ { 0x04CE, 48643 },
+ { 0x04CF, 49304 },
+ { 0x04D0, 49425 },
+ { 0x04D1, 48527 },
+ { 0x04D2, 49431 },
+ { 0x04D3, 48533 },
+ { 0x04D4, 50286 },
+ { 0x04D5, 49392 },
+ { 0x04D6, 49622 },
+ { 0x04D7, 48724 },
+ { 0x04D8, 50077 },
+ { 0x04D9, 49179 },
+ { 0x04DA, 50081 },
+ { 0x04DB, 49183 },
+ { 0x04DC, 49900 },
+ { 0x04DD, 49002 },
+ { 0x04DE, 49745 },
+ { 0x04DF, 48847 },
+ { 0x04E0, 50251 },
+ { 0x04E1, 49357 },
+ { 0x04E2, 49457 },
+ { 0x04E3, 48559 },
+ { 0x04E4, 49463 },
+ { 0x04E5, 48565 },
+ { 0x04E6, 49473 },
+ { 0x04E7, 48575 },
+ { 0x04E8, 50108 },
+ { 0x04E9, 49210 },
+ { 0x04EA, 50113 },
+ { 0x04EB, 49215 },
+ { 0x04EC, 49441 },
+ { 0x04ED, 48543 },
+ { 0x04EE, 49490 },
+ { 0x04EF, 48592 },
+ { 0x04F0, 49496 },
+ { 0x04F1, 48598 },
+ { 0x04F2, 49483 },
+ { 0x04F3, 48585 },
+ { 0x04F4, 49773 },
+ { 0x04F5, 48875 },
+ { 0x04F6, 49822 },
+ { 0x04F7, 48924 },
+ { 0x04F8, 50030 },
+ { 0x04F9, 49132 },
+ { 0x04FA, 49808 },
+ { 0x04FB, 48910 },
+ { 0x04FC, 49600 },
+ { 0x04FD, 48702 },
+ { 0x04FE, 49606 },
+ { 0x04FF, 48708 },
+ { 0x0500, 49935 },
+ { 0x0501, 49037 },
+ { 0x0502, 49940 },
+ { 0x0503, 49042 },
+ { 0x0504, 49965 },
+ { 0x0505, 49067 },
+ { 0x0506, 49970 },
+ { 0x0507, 49072 },
+ { 0x0508, 49945 },
+ { 0x0509, 49047 },
+ { 0x050A, 49950 },
+ { 0x050B, 49052 },
+ { 0x050C, 49955 },
+ { 0x050D, 49057 },
+ { 0x050E, 49960 },
+ { 0x050F, 49062 },
+ { 0x0510, 50207 },
+ { 0x0511, 49313 },
+ { 0x0512, 49518 },
+ { 0x0513, 48620 },
+ { 0x0514, 49844 },
+ { 0x0515, 48946 },
+ { 0x0516, 49860 },
+ { 0x0517, 48962 },
+ { 0x0518, 49876 },
+ { 0x0519, 48978 },
+ { 0x051A, 49686 },
+ { 0x051B, 48788 },
+ { 0x051C, 49715 },
+ { 0x051D, 48817 },
+ { 0x051E, 50040 },
+ { 0x051F, 49142 },
+ { 0x0520, 49530 },
+ { 0x0521, 48632 },
+ { 0x0522, 49563 },
+ { 0x0523, 48665 },
+ { 0x0531, 44961 },
+ { 0x0532, 44965 },
+ { 0x0533, 44981 },
+ { 0x0534, 44917 },
+ { 0x0535, 44973 },
+ { 0x0536, 44957 },
+ { 0x0537, 44921 },
+ { 0x0538, 44925 },
+ { 0x0539, 44945 },
+ { 0x053A, 45029 },
+ { 0x053B, 44985 },
+ { 0x053C, 45045 },
+ { 0x053D, 45025 },
+ { 0x053E, 44909 },
+ { 0x053F, 44993 },
+ { 0x0540, 44929 },
+ { 0x0541, 44933 },
+ { 0x0542, 45037 },
+ { 0x0543, 45033 },
+ { 0x0544, 44997 },
+ { 0x0545, 44953 },
+ { 0x0546, 45001 },
+ { 0x0547, 45017 },
+ { 0x0548, 44949 },
+ { 0x0549, 44969 },
+ { 0x054A, 45005 },
+ { 0x054B, 45041 },
+ { 0x054C, 44941 },
+ { 0x054D, 45013 },
+ { 0x054E, 45021 },
+ { 0x054F, 45053 },
+ { 0x0550, 45009 },
+ { 0x0551, 44913 },
+ { 0x0552, 45057 },
+ { 0x0553, 45049 },
+ { 0x0554, 44989 },
+ { 0x0555, 44937 },
+ { 0x0556, 44977 },
+ { 0x0559, 45064 },
+ { 0x055A, 45073 },
+ { 0x055B, 45061 },
+ { 0x055C, 45075 },
+ { 0x055D, 44723 },
+ { 0x055E, 45070 },
+ { 0x055F, 45078 },
+ { 0x0561, 44777 },
+ { 0x0562, 44781 },
+ { 0x0563, 44797 },
+ { 0x0564, 44733 },
+ { 0x0565, 44789 },
+ { 0x0566, 44773 },
+ { 0x0567, 44737 },
+ { 0x0568, 44741 },
+ { 0x0569, 44761 },
+ { 0x056A, 44845 },
+ { 0x056B, 44801 },
+ { 0x056C, 44861 },
+ { 0x056D, 44841 },
+ { 0x056E, 44725 },
+ { 0x056F, 44809 },
+ { 0x0570, 44745 },
+ { 0x0571, 44749 },
+ { 0x0572, 44853 },
+ { 0x0573, 44849 },
+ { 0x0574, 44813 },
+ { 0x0575, 44769 },
+ { 0x0576, 44817 },
+ { 0x0577, 44833 },
+ { 0x0578, 44765 },
+ { 0x0579, 44785 },
+ { 0x057A, 44821 },
+ { 0x057B, 44857 },
+ { 0x057C, 44757 },
+ { 0x057D, 44829 },
+ { 0x057E, 44837 },
+ { 0x057F, 44869 },
+ { 0x0580, 44825 },
+ { 0x0581, 44729 },
+ { 0x0582, 44873 },
+ { 0x0583, 44865 },
+ { 0x0584, 44805 },
+ { 0x0585, 44753 },
+ { 0x0586, 44793 },
+ { 0x0587, 44877 },
+ { 0x0589, 44720 },
+ { 0x058A, 44907 },
+ { 0x0591, 33056 },
+ { 0x0592, 33004 },
+ { 0x0593, 33073 },
+ { 0x0594, 33022 },
+ { 0x0595, 33018 },
+ { 0x0596, 33053 },
+ { 0x0597, 33001 },
+ { 0x0598, 33026 },
+ { 0x0599, 33046 },
+ { 0x059A, 33015 },
+ { 0x059B, 33007 },
+ { 0x059C, 33032 },
+ { 0x059D, 33035 },
+ { 0x059E, 33070 },
+ { 0x059F, 33049 },
+ { 0x05A0, 33059 },
+ { 0x05A1, 32995 },
+ { 0x05A2, 32985 },
+ { 0x05A3, 32992 },
+ { 0x05A4, 33067 },
+ { 0x05A5, 33039 },
+ { 0x05A6, 33042 },
+ { 0x05A7, 32989 },
+ { 0x05A8, 32998 },
+ { 0x05A9, 33063 },
+ { 0x05AA, 33010 },
+ { 0x05AB, 32976 },
+ { 0x05AC, 32982 },
+ { 0x05AD, 32979 },
+ { 0x05AE, 33029 },
+ { 0x05AF, 32903 },
+ { 0x05B0, 32951 },
+ { 0x05B1, 32922 },
+ { 0x05B2, 32918 },
+ { 0x05B3, 32926 },
+ { 0x05B4, 32930 },
+ { 0x05B5, 32954 },
+ { 0x05B6, 32948 },
+ { 0x05B7, 32945 },
+ { 0x05B8, 32962 },
+ { 0x05B9, 32933 },
+ { 0x05BA, 32936 },
+ { 0x05BB, 32969 },
+ { 0x05BC, 32957 },
+ { 0x05BD, 32942 },
+ { 0x05BE, 33412 },
+ { 0x05BF, 32911 },
+ { 0x05C0, 33415 },
+ { 0x05C1, 32914 },
+ { 0x05C2, 32907 },
+ { 0x05C3, 33408 },
+ { 0x05C4, 32899 },
+ { 0x05C5, 32895 },
+ { 0x05C6, 33404 },
+ { 0x05C7, 32965 },
+ { 0x05D0, 33192 },
+ { 0x05D1, 33097 },
+ { 0x05D2, 33330 },
+ { 0x05D3, 33290 },
+ { 0x05D4, 33076 },
+ { 0x05D5, 33166 },
+ { 0x05D6, 33354 },
+ { 0x05D7, 33110 },
+ { 0x05D8, 33158 },
+ { 0x05D9, 33179 },
+ { 0x05DA, 33308 },
+ { 0x05DB, 33113 },
+ { 0x05DC, 33338 },
+ { 0x05DD, 33318 },
+ { 0x05DE, 33126 },
+ { 0x05DF, 33322 },
+ { 0x05E0, 33134 },
+ { 0x05E1, 33362 },
+ { 0x05E2, 33210 },
+ { 0x05E3, 33298 },
+ { 0x05E4, 33084 },
+ { 0x05E5, 33326 },
+ { 0x05E6, 33346 },
+ { 0x05E7, 33142 },
+ { 0x05E8, 33213 },
+ { 0x05E9, 33221 },
+ { 0x05EA, 33150 },
+ { 0x05F0, 33394 },
+ { 0x05F1, 33383 },
+ { 0x05F2, 33399 },
+ { 0x05F3, 33418 },
+ { 0x05F4, 33421 },
+ { 0x0600, 26405 },
+ { 0x0601, 23733 },
+ { 0x0602, 26459 },
+ { 0x0603, 23730 },
+ { 0x0606, 69351 },
+ { 0x0607, 69384 },
+ { 0x0608, 23706 },
+ { 0x0609, 69347 },
+ { 0x060A, 69342 },
+ { 0x060B, 37776 },
+ { 0x060C, 23764 },
+ { 0x060D, 23708 },
+ { 0x060E, 26408 },
+ { 0x060F, 23727 },
+ { 0x0610, 23756 },
+ { 0x0611, 23736 },
+ { 0x0612, 23752 },
+ { 0x0613, 23722 },
+ { 0x0614, 23749 },
+ { 0x0615, 23840 },
+ { 0x0616, 23923 },
+ { 0x0617, 23872 },
+ { 0x0618, 23935 },
+ { 0x0619, 23932 },
+ { 0x061A, 23938 },
+ { 0x061B, 30222 },
+ { 0x061E, 26422 },
+ { 0x061F, 30214 },
+ { 0x0621, 26056 },
+ { 0x0622, 25371 },
+ { 0x0623, 25327 },
+ { 0x0624, 25097 },
+ { 0x0625, 25349 },
+ { 0x0626, 25155 },
+ { 0x0627, 25310 },
+ { 0x0628, 24144 },
+ { 0x0629, 25027 },
+ { 0x062A, 24996 },
+ { 0x062B, 25851 },
+ { 0x062C, 25554 },
+ { 0x062D, 24447 },
+ { 0x062E, 25577 },
+ { 0x062F, 24260 },
+ { 0x0630, 25838 },
+ { 0x0631, 24833 },
+ { 0x0632, 25897 },
+ { 0x0633, 25747 },
+ { 0x0634, 26192 },
+ { 0x0635, 24929 },
+ { 0x0636, 24231 },
+ { 0x0637, 24966 },
+ { 0x0638, 25287 },
+ { 0x0639, 24090 },
+ { 0x063A, 26027 },
+ { 0x063B, 26073 },
+ { 0x063C, 26087 },
+ { 0x063D, 25996 },
+ { 0x063E, 25950 },
+ { 0x063F, 25958 },
+ { 0x0640, 26440 },
+ { 0x0641, 24346 },
+ { 0x0642, 24797 },
+ { 0x0643, 24672 },
+ { 0x0644, 24720 },
+ { 0x0645, 25600 },
+ { 0x0646, 25635 },
+ { 0x0647, 24545 },
+ { 0x0648, 25076 },
+ { 0x0649, 25432 },
+ { 0x064A, 25147 },
+ { 0x064B, 26453 },
+ { 0x064C, 26447 },
+ { 0x064D, 26465 },
+ { 0x064E, 23786 },
+ { 0x064F, 23766 },
+ { 0x0650, 23807 },
+ { 0x0651, 26412 },
+ { 0x0652, 23947 },
+ { 0x0653, 26402 },
+ { 0x0654, 23801 },
+ { 0x0655, 23804 },
+ { 0x0656, 30224 },
+ { 0x0657, 26462 },
+ { 0x0658, 23718 },
+ { 0x0659, 30220 },
+ { 0x065A, 23962 },
+ { 0x065B, 23968 },
+ { 0x065C, 23957 },
+ { 0x065D, 30217 },
+ { 0x065E, 23788 },
+ { 0x0660, 69372 },
+ { 0x0661, 69354 },
+ { 0x0662, 69360 },
+ { 0x0663, 69381 },
+ { 0x0664, 69366 },
+ { 0x0665, 69363 },
+ { 0x0666, 69357 },
+ { 0x0667, 69378 },
+ { 0x0668, 69375 },
+ { 0x0669, 69369 },
+ { 0x066A, 26430 },
+ { 0x066B, 26427 },
+ { 0x066C, 30227 },
+ { 0x066D, 23711 },
+ { 0x066E, 26331 },
+ { 0x066F, 26339 },
+ { 0x0670, 26398 },
+ { 0x0671, 25416 },
+ { 0x0672, 25313 },
+ { 0x0673, 25320 },
+ { 0x0674, 25535 },
+ { 0x0675, 25549 },
+ { 0x0676, 25539 },
+ { 0x0677, 24001 },
+ { 0x0678, 25544 },
+ { 0x0679, 25874 },
+ { 0x067A, 26290 },
+ { 0x067B, 25453 },
+ { 0x067C, 24999 },
+ { 0x067D, 25004 },
+ { 0x067E, 24774 },
+ { 0x067F, 26254 },
+ { 0x0680, 25910 },
+ { 0x0681, 24465 },
+ { 0x0682, 24457 },
+ { 0x0683, 25711 },
+ { 0x0684, 25489 },
+ { 0x0685, 24500 },
+ { 0x0686, 26225 },
+ { 0x0687, 26375 },
+ { 0x0688, 25476 },
+ { 0x0689, 24296 },
+ { 0x068A, 24263 },
+ { 0x068B, 24269 },
+ { 0x068C, 25933 },
+ { 0x068D, 26277 },
+ { 0x068E, 24333 },
+ { 0x068F, 24301 },
+ { 0x0690, 24289 },
+ { 0x0691, 25734 },
+ { 0x0692, 24884 },
+ { 0x0693, 24873 },
+ { 0x0694, 24836 },
+ { 0x0695, 24890 },
+ { 0x0696, 24842 },
+ { 0x0697, 24851 },
+ { 0x0698, 24659 },
+ { 0x0699, 24866 },
+ { 0x069A, 25750 },
+ { 0x069B, 25785 },
+ { 0x069C, 25792 },
+ { 0x069D, 24932 },
+ { 0x069E, 24939 },
+ { 0x069F, 24969 },
+ { 0x06A0, 24108 },
+ { 0x06A1, 26335 },
+ { 0x06A2, 24355 },
+ { 0x06A3, 24349 },
+ { 0x06A4, 25053 },
+ { 0x06A5, 24369 },
+ { 0x06A6, 26146 },
+ { 0x06A7, 24800 },
+ { 0x06A8, 24806 },
+ { 0x06A9, 26064 },
+ { 0x06AA, 26221 },
+ { 0x06AB, 24688 },
+ { 0x06AC, 24675 },
+ { 0x06AD, 24028 },
+ { 0x06AE, 24693 },
+ { 0x06AF, 24405 },
+ { 0x06B0, 24415 },
+ { 0x06B1, 26123 },
+ { 0x06B2, 24408 },
+ { 0x06B3, 25512 },
+ { 0x06B4, 24420 },
+ { 0x06B5, 24734 },
+ { 0x06B6, 24728 },
+ { 0x06B7, 24740 },
+ { 0x06B8, 24747 },
+ { 0x06B9, 25638 },
+ { 0x06BA, 25680 },
+ { 0x06BB, 26169 },
+ { 0x06BC, 25651 },
+ { 0x06BD, 25668 },
+ { 0x06BE, 24631 },
+ { 0x06BF, 26228 },
+ { 0x06C0, 24583 },
+ { 0x06C1, 24548 },
+ { 0x06C2, 24552 },
+ { 0x06C3, 25031 },
+ { 0x06C4, 25092 },
+ { 0x06C5, 26343 },
+ { 0x06C6, 24051 },
+ { 0x06C7, 23998 },
+ { 0x06C8, 24077 },
+ { 0x06C9, 26359 },
+ { 0x06CA, 25085 },
+ { 0x06CB, 24064 },
+ { 0x06CC, 25946 },
+ { 0x06CD, 25150 },
+ { 0x06CE, 25193 },
+ { 0x06CF, 25079 },
+ { 0x06D0, 23975 },
+ { 0x06D1, 25199 },
+ { 0x06D2, 25211 },
+ { 0x06D3, 25215 },
+ { 0x06D4, 23715 },
+ { 0x06D5, 24025 },
+ { 0x06D6, 23913 },
+ { 0x06D7, 23903 },
+ { 0x06D8, 23852 },
+ { 0x06D9, 23835 },
+ { 0x06DA, 23848 },
+ { 0x06DB, 23880 },
+ { 0x06DC, 23868 },
+ { 0x06DD, 23702 },
+ { 0x06DE, 23941 },
+ { 0x06DF, 23892 },
+ { 0x06E0, 23897 },
+ { 0x06E1, 23885 },
+ { 0x06E2, 23858 },
+ { 0x06E3, 23825 },
+ { 0x06E4, 23876 },
+ { 0x06E5, 23829 },
+ { 0x06E6, 23832 },
+ { 0x06E7, 23844 },
+ { 0x06E8, 23864 },
+ { 0x06E9, 23817 },
+ { 0x06EA, 23776 },
+ { 0x06EB, 23781 },
+ { 0x06EC, 26433 },
+ { 0x06ED, 23821 },
+ { 0x06EE, 24309 },
+ { 0x06EF, 24913 },
+ { 0x06F0, 51759 },
+ { 0x06F1, 51735 },
+ { 0x06F2, 51743 },
+ { 0x06F3, 51771 },
+ { 0x06F4, 51751 },
+ { 0x06F5, 51747 },
+ { 0x06F6, 51739 },
+ { 0x06F7, 51767 },
+ { 0x06F8, 51763 },
+ { 0x06F9, 51755 },
+ { 0x06FA, 26195 },
+ { 0x06FB, 24234 },
+ { 0x06FC, 26030 },
+ { 0x06FD, 23740 },
+ { 0x06FE, 23744 },
+ { 0x06FF, 24605 },
+ { 0x0700, 36871 },
+ { 0x0701, 37114 },
+ { 0x0702, 37094 },
+ { 0x0703, 37118 },
+ { 0x0704, 37098 },
+ { 0x0705, 37106 },
+ { 0x0706, 36885 },
+ { 0x0707, 36889 },
+ { 0x0708, 37121 },
+ { 0x0709, 37101 },
+ { 0x070A, 37109 },
+ { 0x070B, 37081 },
+ { 0x070C, 37084 },
+ { 0x070D, 37087 },
+ { 0x070F, 37126 },
+ { 0x0710, 36987 },
+ { 0x0711, 37046 },
+ { 0x0712, 36952 },
+ { 0x0713, 36994 },
+ { 0x0714, 36997 },
+ { 0x0715, 37004 },
+ { 0x0716, 37010 },
+ { 0x0717, 36934 },
+ { 0x0718, 36949 },
+ { 0x0719, 36984 },
+ { 0x071A, 36955 },
+ { 0x071B, 36970 },
+ { 0x071C, 36973 },
+ { 0x071D, 36977 },
+ { 0x071E, 36980 },
+ { 0x071F, 36958 },
+ { 0x0720, 37007 },
+ { 0x0721, 36940 },
+ { 0x0722, 36943 },
+ { 0x0723, 37027 },
+ { 0x0724, 36990 },
+ { 0x0725, 36931 },
+ { 0x0726, 36937 },
+ { 0x0727, 37042 },
+ { 0x0728, 37001 },
+ { 0x0729, 36961 },
+ { 0x072A, 36964 },
+ { 0x072B, 36967 },
+ { 0x072C, 36946 },
+ { 0x072D, 37015 },
+ { 0x072E, 37019 },
+ { 0x072F, 37023 },
+ { 0x0730, 37050 },
+ { 0x0731, 37053 },
+ { 0x0732, 37056 },
+ { 0x0733, 37059 },
+ { 0x0734, 37062 },
+ { 0x0735, 37065 },
+ { 0x0736, 36907 },
+ { 0x0737, 36910 },
+ { 0x0738, 36927 },
+ { 0x0739, 36923 },
+ { 0x073A, 36899 },
+ { 0x073B, 36902 },
+ { 0x073C, 37111 },
+ { 0x073D, 36893 },
+ { 0x073E, 36896 },
+ { 0x073F, 36913 },
+ { 0x0740, 37078 },
+ { 0x0741, 37092 },
+ { 0x0742, 37090 },
+ { 0x0743, 36875 },
+ { 0x0744, 36880 },
+ { 0x0745, 36915 },
+ { 0x0746, 36919 },
+ { 0x0747, 37070 },
+ { 0x0748, 37074 },
+ { 0x0749, 36905 },
+ { 0x074A, 37068 },
+ { 0x074D, 37038 },
+ { 0x074E, 37034 },
+ { 0x074F, 37030 },
+ { 0x0750, 24195 },
+ { 0x0751, 24147 },
+ { 0x0752, 24173 },
+ { 0x0753, 24182 },
+ { 0x0754, 24157 },
+ { 0x0755, 24203 },
+ { 0x0756, 24167 },
+ { 0x0757, 24450 },
+ { 0x0758, 24507 },
+ { 0x0759, 24278 },
+ { 0x075A, 24315 },
+ { 0x075B, 24908 },
+ { 0x075C, 25767 },
+ { 0x075D, 24093 },
+ { 0x075E, 24115 },
+ { 0x075F, 24100 },
+ { 0x0760, 24362 },
+ { 0x0761, 24376 },
+ { 0x0762, 26067 },
+ { 0x0763, 26080 },
+ { 0x0764, 26094 },
+ { 0x0765, 25603 },
+ { 0x0766, 25609 },
+ { 0x0767, 25644 },
+ { 0x0768, 25662 },
+ { 0x0769, 25656 },
+ { 0x076A, 24723 },
+ { 0x076B, 24858 },
+ { 0x076C, 24878 },
+ { 0x076D, 25759 },
+ { 0x076E, 24491 },
+ { 0x076F, 24471 },
+ { 0x0770, 25774 },
+ { 0x0771, 24897 },
+ { 0x0772, 24482 },
+ { 0x0773, 25393 },
+ { 0x0774, 25402 },
+ { 0x0775, 25966 },
+ { 0x0776, 25986 },
+ { 0x0777, 25976 },
+ { 0x0778, 25119 },
+ { 0x0779, 25128 },
+ { 0x077A, 25240 },
+ { 0x077B, 25250 },
+ { 0x077C, 24516 },
+ { 0x077D, 25803 },
+ { 0x077E, 25812 },
+ { 0x077F, 24681 },
+ { 0x0780, 37486 },
+ { 0x0781, 37591 },
+ { 0x0782, 37534 },
+ { 0x0783, 37492 },
+ { 0x0784, 37483 },
+ { 0x0785, 37588 },
+ { 0x0786, 37525 },
+ { 0x0787, 37516 },
+ { 0x0788, 37543 },
+ { 0x0789, 37531 },
+ { 0x078A, 37519 },
+ { 0x078B, 37552 },
+ { 0x078C, 37510 },
+ { 0x078D, 37528 },
+ { 0x078E, 37522 },
+ { 0x078F, 37585 },
+ { 0x0790, 37540 },
+ { 0x0791, 37567 },
+ { 0x0792, 37579 },
+ { 0x0793, 37576 },
+ { 0x0794, 37495 },
+ { 0x0795, 37573 },
+ { 0x0796, 37570 },
+ { 0x0797, 37582 },
+ { 0x0798, 37513 },
+ { 0x0799, 37504 },
+ { 0x079A, 37507 },
+ { 0x079B, 37564 },
+ { 0x079C, 37498 },
+ { 0x079D, 37561 },
+ { 0x079E, 37558 },
+ { 0x079F, 37549 },
+ { 0x07A0, 37477 },
+ { 0x07A1, 37480 },
+ { 0x07A2, 37501 },
+ { 0x07A3, 37555 },
+ { 0x07A4, 37537 },
+ { 0x07A5, 37546 },
+ { 0x07A6, 37594 },
+ { 0x07A7, 37604 },
+ { 0x07A8, 37598 },
+ { 0x07A9, 37606 },
+ { 0x07AA, 37602 },
+ { 0x07AB, 37612 },
+ { 0x07AC, 37596 },
+ { 0x07AD, 37608 },
+ { 0x07AE, 37600 },
+ { 0x07AF, 37610 },
+ { 0x07B0, 37475 },
+ { 0x07B1, 37489 },
+ { 0x07C0, 6538 },
+ { 0x07C1, 6520 },
+ { 0x07C2, 6526 },
+ { 0x07C3, 6547 },
+ { 0x07C4, 6532 },
+ { 0x07C5, 6529 },
+ { 0x07C6, 6523 },
+ { 0x07C7, 6544 },
+ { 0x07C8, 6541 },
+ { 0x07C9, 6535 },
+ { 0x07CA, 6550 },
+ { 0x07CB, 6574 },
+ { 0x07CC, 6556 },
+ { 0x07CD, 6553 },
+ { 0x07CE, 6565 },
+ { 0x07CF, 6602 },
+ { 0x07D0, 6562 },
+ { 0x07D1, 6651 },
+ { 0x07D2, 6559 },
+ { 0x07D3, 6568 },
+ { 0x07D4, 6605 },
+ { 0x07D5, 6614 },
+ { 0x07D6, 6583 },
+ { 0x07D7, 6623 },
+ { 0x07D8, 6571 },
+ { 0x07D9, 6608 },
+ { 0x07DA, 6636 },
+ { 0x07DB, 6611 },
+ { 0x07DC, 6626 },
+ { 0x07DD, 6577 },
+ { 0x07DE, 6586 },
+ { 0x07DF, 6589 },
+ { 0x07E0, 6598 },
+ { 0x07E1, 6592 },
+ { 0x07E2, 6629 },
+ { 0x07E3, 6595 },
+ { 0x07E4, 6580 },
+ { 0x07E5, 6617 },
+ { 0x07E6, 6620 },
+ { 0x07E7, 6632 },
+ { 0x07E8, 6639 },
+ { 0x07E9, 6647 },
+ { 0x07EA, 6643 },
+ { 0x07EB, 6686 },
+ { 0x07EC, 6681 },
+ { 0x07ED, 6691 },
+ { 0x07EE, 6676 },
+ { 0x07EF, 6666 },
+ { 0x07F0, 6661 },
+ { 0x07F1, 6671 },
+ { 0x07F2, 6701 },
+ { 0x07F3, 6696 },
+ { 0x07F4, 6514 },
+ { 0x07F5, 6510 },
+ { 0x07F6, 6654 },
+ { 0x07F7, 6658 },
+ { 0x07F8, 6518 },
+ { 0x07F9, 6707 },
+ { 0x07FA, 6705 },
+ { 0x0901, 66870 },
+ { 0x0902, 66864 },
+ { 0x0903, 66861 },
+ { 0x0904, 67167 },
+ { 0x0905, 66990 },
+ { 0x0906, 67005 },
+ { 0x0907, 66996 },
+ { 0x0908, 67032 },
+ { 0x0909, 67002 },
+ { 0x090A, 67065 },
+ { 0x090B, 67199 },
+ { 0x090C, 67195 },
+ { 0x090D, 67183 },
+ { 0x090E, 67171 },
+ { 0x090F, 66993 },
+ { 0x0910, 67008 },
+ { 0x0911, 67187 },
+ { 0x0912, 67175 },
+ { 0x0913, 66999 },
+ { 0x0914, 67011 },
+ { 0x0915, 67038 },
+ { 0x0916, 67104 },
+ { 0x0917, 67026 },
+ { 0x0918, 67095 },
+ { 0x0919, 67110 },
+ { 0x091A, 67017 },
+ { 0x091B, 67083 },
+ { 0x091C, 67035 },
+ { 0x091D, 67098 },
+ { 0x091E, 67116 },
+ { 0x091F, 67137 },
+ { 0x0920, 67161 },
+ { 0x0921, 67086 },
+ { 0x0922, 67146 },
+ { 0x0923, 67113 },
+ { 0x0924, 67062 },
+ { 0x0925, 67134 },
+ { 0x0926, 67020 },
+ { 0x0927, 67089 },
+ { 0x0928, 67047 },
+ { 0x0929, 67158 },
+ { 0x092A, 67050 },
+ { 0x092B, 67119 },
+ { 0x092C, 67014 },
+ { 0x092D, 67080 },
+ { 0x092E, 67044 },
+ { 0x092F, 67071 },
+ { 0x0930, 67056 },
+ { 0x0931, 67125 },
+ { 0x0932, 67041 },
+ { 0x0933, 67107 },
+ { 0x0934, 67155 },
+ { 0x0935, 67068 },
+ { 0x0936, 67128 },
+ { 0x0937, 67131 },
+ { 0x0938, 67059 },
+ { 0x0939, 67029 },
+ { 0x093C, 66855 },
+ { 0x093D, 66867 },
+ { 0x093E, 66927 },
+ { 0x093F, 66915 },
+ { 0x0940, 66939 },
+ { 0x0941, 66923 },
+ { 0x0942, 66943 },
+ { 0x0943, 66972 },
+ { 0x0944, 66982 },
+ { 0x0945, 66957 },
+ { 0x0946, 66947 },
+ { 0x0947, 66911 },
+ { 0x0948, 66931 },
+ { 0x0949, 66962 },
+ { 0x094A, 66952 },
+ { 0x094B, 66919 },
+ { 0x094C, 66935 },
+ { 0x094D, 66858 },
+ { 0x0950, 66848 },
+ { 0x0951, 67211 },
+ { 0x0952, 67215 },
+ { 0x0953, 66908 },
+ { 0x0954, 66873 },
+ { 0x0958, 67053 },
+ { 0x0959, 67152 },
+ { 0x095A, 67149 },
+ { 0x095B, 67074 },
+ { 0x095C, 67164 },
+ { 0x095D, 67122 },
+ { 0x095E, 67023 },
+ { 0x095F, 67140 },
+ { 0x0960, 67207 },
+ { 0x0961, 67203 },
+ { 0x0962, 66967 },
+ { 0x0963, 66977 },
+ { 0x0964, 66876 },
+ { 0x0965, 66987 },
+ { 0x0966, 66896 },
+ { 0x0967, 66878 },
+ { 0x0968, 66884 },
+ { 0x0969, 66905 },
+ { 0x096A, 66890 },
+ { 0x096B, 66887 },
+ { 0x096C, 66881 },
+ { 0x096D, 66902 },
+ { 0x096E, 66899 },
+ { 0x096F, 66893 },
+ { 0x0970, 67219 },
+ { 0x0971, 66850 },
+ { 0x0972, 67179 },
+ { 0x097B, 67092 },
+ { 0x097C, 67101 },
+ { 0x097D, 67191 },
+ { 0x097E, 67143 },
+ { 0x097F, 67077 },
+ { 0x0981, 37801 },
+ { 0x0982, 37795 },
+ { 0x0983, 37792 },
+ { 0x0985, 37898 },
+ { 0x0986, 37913 },
+ { 0x0987, 37904 },
+ { 0x0988, 37937 },
+ { 0x0989, 37910 },
+ { 0x098A, 37979 },
+ { 0x098B, 38053 },
+ { 0x098C, 38049 },
+ { 0x098F, 37901 },
+ { 0x0990, 37916 },
+ { 0x0993, 37907 },
+ { 0x0994, 37919 },
+ { 0x0995, 37943 },
+ { 0x0996, 38003 },
+ { 0x0997, 37931 },
+ { 0x0998, 37997 },
+ { 0x0999, 38006 },
+ { 0x099A, 37925 },
+ { 0x099B, 37988 },
+ { 0x099C, 37940 },
+ { 0x099D, 38000 },
+ { 0x099E, 38012 },
+ { 0x099F, 38033 },
+ { 0x09A0, 38042 },
+ { 0x09A1, 37991 },
+ { 0x09A2, 38039 },
+ { 0x09A3, 38009 },
+ { 0x09A4, 37976 },
+ { 0x09A5, 38030 },
+ { 0x09A6, 37928 },
+ { 0x09A7, 37994 },
+ { 0x09A8, 37952 },
+ { 0x09AA, 37955 },
+ { 0x09AB, 38015 },
+ { 0x09AC, 37922 },
+ { 0x09AD, 37985 },
+ { 0x09AE, 37949 },
+ { 0x09AF, 37982 },
+ { 0x09B0, 37958 },
+ { 0x09B2, 37946 },
+ { 0x09B6, 38024 },
+ { 0x09B7, 38027 },
+ { 0x09B8, 37973 },
+ { 0x09B9, 37934 },
+ { 0x09BC, 37786 },
+ { 0x09BD, 37798 },
+ { 0x09BE, 37856 },
+ { 0x09BF, 37844 },
+ { 0x09C0, 37868 },
+ { 0x09C1, 37852 },
+ { 0x09C2, 37872 },
+ { 0x09C3, 37881 },
+ { 0x09C4, 37891 },
+ { 0x09C7, 37840 },
+ { 0x09C8, 37860 },
+ { 0x09CB, 37848 },
+ { 0x09CC, 37864 },
+ { 0x09CD, 37789 },
+ { 0x09CE, 38045 },
+ { 0x09D7, 37782 },
+ { 0x09DC, 38021 },
+ { 0x09DD, 38018 },
+ { 0x09DF, 38036 },
+ { 0x09E0, 38061 },
+ { 0x09E1, 38057 },
+ { 0x09E2, 37876 },
+ { 0x09E3, 37886 },
+ { 0x09E6, 37822 },
+ { 0x09E7, 37804 },
+ { 0x09E8, 37810 },
+ { 0x09E9, 37831 },
+ { 0x09EA, 37816 },
+ { 0x09EB, 37813 },
+ { 0x09EC, 37807 },
+ { 0x09ED, 37828 },
+ { 0x09EE, 37825 },
+ { 0x09EF, 37819 },
+ { 0x09F0, 37967 },
+ { 0x09F1, 37961 },
+ { 0x09F2, 37834 },
+ { 0x09F3, 37837 },
+ { 0x09F4, 38065 },
+ { 0x09F5, 38077 },
+ { 0x09F6, 38085 },
+ { 0x09F7, 38081 },
+ { 0x09F8, 38069 },
+ { 0x09F9, 38089 },
+ { 0x09FA, 37896 },
+ { 0x0A01, 52505 },
+ { 0x0A02, 52509 },
+ { 0x0A03, 52524 },
+ { 0x0A05, 52597 },
+ { 0x0A06, 52606 },
+ { 0x0A07, 52600 },
+ { 0x0A08, 52636 },
+ { 0x0A09, 52603 },
+ { 0x0A0A, 52669 },
+ { 0x0A0F, 52624 },
+ { 0x0A10, 52609 },
+ { 0x0A13, 52654 },
+ { 0x0A14, 52612 },
+ { 0x0A15, 52642 },
+ { 0x0A16, 52699 },
+ { 0x0A17, 52630 },
+ { 0x0A18, 52693 },
+ { 0x0A19, 52705 },
+ { 0x0A1A, 52618 },
+ { 0x0A1B, 52684 },
+ { 0x0A1C, 52639 },
+ { 0x0A1D, 52696 },
+ { 0x0A1E, 52711 },
+ { 0x0A1F, 52726 },
+ { 0x0A20, 52738 },
+ { 0x0A21, 52687 },
+ { 0x0A22, 52729 },
+ { 0x0A23, 52708 },
+ { 0x0A24, 52666 },
+ { 0x0A25, 52723 },
+ { 0x0A26, 52621 },
+ { 0x0A27, 52690 },
+ { 0x0A28, 52651 },
+ { 0x0A2A, 52657 },
+ { 0x0A2B, 52714 },
+ { 0x0A2C, 52615 },
+ { 0x0A2D, 52681 },
+ { 0x0A2E, 52648 },
+ { 0x0A2F, 52675 },
+ { 0x0A30, 52660 },
+ { 0x0A32, 52645 },
+ { 0x0A33, 52702 },
+ { 0x0A35, 52672 },
+ { 0x0A36, 52720 },
+ { 0x0A38, 52663 },
+ { 0x0A39, 52633 },
+ { 0x0A3C, 52512 },
+ { 0x0A3E, 52569 },
+ { 0x0A3F, 52561 },
+ { 0x0A40, 52585 },
+ { 0x0A41, 52565 },
+ { 0x0A42, 52593 },
+ { 0x0A47, 52581 },
+ { 0x0A48, 52573 },
+ { 0x0A4B, 52589 },
+ { 0x0A4C, 52577 },
+ { 0x0A4D, 52518 },
+ { 0x0A51, 52515 },
+ { 0x0A59, 52735 },
+ { 0x0A5A, 52732 },
+ { 0x0A5B, 52678 },
+ { 0x0A5C, 52717 },
+ { 0x0A5E, 52627 },
+ { 0x0A66, 52547 },
+ { 0x0A67, 52529 },
+ { 0x0A68, 52535 },
+ { 0x0A69, 52556 },
+ { 0x0A6A, 52541 },
+ { 0x0A6B, 52538 },
+ { 0x0A6C, 52532 },
+ { 0x0A6D, 52553 },
+ { 0x0A6E, 52550 },
+ { 0x0A6F, 52544 },
+ { 0x0A70, 52559 },
+ { 0x0A71, 52527 },
+ { 0x0A72, 52501 },
+ { 0x0A73, 52503 },
+ { 0x0A74, 52498 },
+ { 0x0A75, 52521 },
+ { 0x0A81, 52240 },
+ { 0x0A82, 52234 },
+ { 0x0A83, 52231 },
+ { 0x0A85, 52350 },
+ { 0x0A86, 52365 },
+ { 0x0A87, 52356 },
+ { 0x0A88, 52389 },
+ { 0x0A89, 52362 },
+ { 0x0A8A, 52419 },
+ { 0x0A8B, 52486 },
+ { 0x0A8C, 52482 },
+ { 0x0A8D, 52342 },
+ { 0x0A8F, 52353 },
+ { 0x0A90, 52368 },
+ { 0x0A91, 52346 },
+ { 0x0A93, 52359 },
+ { 0x0A94, 52371 },
+ { 0x0A95, 52395 },
+ { 0x0A96, 52446 },
+ { 0x0A97, 52383 },
+ { 0x0A98, 52440 },
+ { 0x0A99, 52452 },
+ { 0x0A9A, 52377 },
+ { 0x0A9B, 52431 },
+ { 0x0A9C, 52392 },
+ { 0x0A9D, 52443 },
+ { 0x0A9E, 52458 },
+ { 0x0A9F, 52473 },
+ { 0x0AA0, 52479 },
+ { 0x0AA1, 52434 },
+ { 0x0AA2, 52476 },
+ { 0x0AA3, 52455 },
+ { 0x0AA4, 52416 },
+ { 0x0AA5, 52470 },
+ { 0x0AA6, 52380 },
+ { 0x0AA7, 52437 },
+ { 0x0AA8, 52404 },
+ { 0x0AAA, 52407 },
+ { 0x0AAB, 52461 },
+ { 0x0AAC, 52374 },
+ { 0x0AAD, 52428 },
+ { 0x0AAE, 52401 },
+ { 0x0AAF, 52425 },
+ { 0x0AB0, 52410 },
+ { 0x0AB2, 52398 },
+ { 0x0AB3, 52449 },
+ { 0x0AB5, 52422 },
+ { 0x0AB6, 52464 },
+ { 0x0AB7, 52467 },
+ { 0x0AB8, 52413 },
+ { 0x0AB9, 52386 },
+ { 0x0ABC, 52225 },
+ { 0x0ABD, 52237 },
+ { 0x0ABE, 52292 },
+ { 0x0ABF, 52280 },
+ { 0x0AC0, 52304 },
+ { 0x0AC1, 52288 },
+ { 0x0AC2, 52308 },
+ { 0x0AC3, 52327 },
+ { 0x0AC4, 52337 },
+ { 0x0AC5, 52312 },
+ { 0x0AC7, 52276 },
+ { 0x0AC8, 52296 },
+ { 0x0AC9, 52317 },
+ { 0x0ACB, 52284 },
+ { 0x0ACC, 52300 },
+ { 0x0ACD, 52228 },
+ { 0x0AD0, 52223 },
+ { 0x0AE0, 52494 },
+ { 0x0AE1, 52490 },
+ { 0x0AE2, 52322 },
+ { 0x0AE3, 52332 },
+ { 0x0AE6, 52261 },
+ { 0x0AE7, 52243 },
+ { 0x0AE8, 52249 },
+ { 0x0AE9, 52270 },
+ { 0x0AEA, 52255 },
+ { 0x0AEB, 52252 },
+ { 0x0AEC, 52246 },
+ { 0x0AED, 52267 },
+ { 0x0AEE, 52264 },
+ { 0x0AEF, 52258 },
+ { 0x0AF1, 52273 },
+ { 0x0B01, 21480 },
+ { 0x0B02, 21474 },
+ { 0x0B03, 21471 },
+ { 0x0B05, 21571 },
+ { 0x0B06, 21586 },
+ { 0x0B07, 21577 },
+ { 0x0B08, 21610 },
+ { 0x0B09, 21583 },
+ { 0x0B0A, 21640 },
+ { 0x0B0B, 21719 },
+ { 0x0B0C, 21715 },
+ { 0x0B0F, 21574 },
+ { 0x0B10, 21589 },
+ { 0x0B13, 21580 },
+ { 0x0B14, 21592 },
+ { 0x0B15, 21616 },
+ { 0x0B16, 21670 },
+ { 0x0B17, 21604 },
+ { 0x0B18, 21664 },
+ { 0x0B19, 21676 },
+ { 0x0B1A, 21598 },
+ { 0x0B1B, 21655 },
+ { 0x0B1C, 21613 },
+ { 0x0B1D, 21667 },
+ { 0x0B1E, 21682 },
+ { 0x0B1F, 21703 },
+ { 0x0B20, 21712 },
+ { 0x0B21, 21658 },
+ { 0x0B22, 21709 },
+ { 0x0B23, 21679 },
+ { 0x0B24, 21637 },
+ { 0x0B25, 21700 },
+ { 0x0B26, 21601 },
+ { 0x0B27, 21661 },
+ { 0x0B28, 21625 },
+ { 0x0B2A, 21628 },
+ { 0x0B2B, 21685 },
+ { 0x0B2C, 21595 },
+ { 0x0B2D, 21652 },
+ { 0x0B2E, 21622 },
+ { 0x0B2F, 21649 },
+ { 0x0B30, 21631 },
+ { 0x0B32, 21619 },
+ { 0x0B33, 21673 },
+ { 0x0B35, 21643 },
+ { 0x0B36, 21694 },
+ { 0x0B37, 21697 },
+ { 0x0B38, 21634 },
+ { 0x0B39, 21607 },
+ { 0x0B3C, 21465 },
+ { 0x0B3D, 21477 },
+ { 0x0B3E, 21529 },
+ { 0x0B3F, 21517 },
+ { 0x0B40, 21541 },
+ { 0x0B41, 21525 },
+ { 0x0B42, 21545 },
+ { 0x0B43, 21554 },
+ { 0x0B44, 21564 },
+ { 0x0B47, 21513 },
+ { 0x0B48, 21533 },
+ { 0x0B4B, 21521 },
+ { 0x0B4C, 21537 },
+ { 0x0B4D, 21468 },
+ { 0x0B56, 21457 },
+ { 0x0B57, 21461 },
+ { 0x0B5C, 21691 },
+ { 0x0B5D, 21688 },
+ { 0x0B5F, 21706 },
+ { 0x0B60, 21727 },
+ { 0x0B61, 21723 },
+ { 0x0B62, 21549 },
+ { 0x0B63, 21559 },
+ { 0x0B66, 21501 },
+ { 0x0B67, 21483 },
+ { 0x0B68, 21489 },
+ { 0x0B69, 21510 },
+ { 0x0B6A, 21495 },
+ { 0x0B6B, 21492 },
+ { 0x0B6C, 21486 },
+ { 0x0B6D, 21507 },
+ { 0x0B6E, 21504 },
+ { 0x0B6F, 21498 },
+ { 0x0B70, 21569 },
+ { 0x0B71, 21646 },
+ { 0x0B82, 22772 },
+ { 0x0B83, 22769 },
+ { 0x0B85, 22864 },
+ { 0x0B86, 22879 },
+ { 0x0B87, 22870 },
+ { 0x0B88, 22897 },
+ { 0x0B89, 22876 },
+ { 0x0B8A, 22930 },
+ { 0x0B8E, 22867 },
+ { 0x0B8F, 22891 },
+ { 0x0B90, 22882 },
+ { 0x0B92, 22873 },
+ { 0x0B93, 22915 },
+ { 0x0B94, 22885 },
+ { 0x0B95, 22903 },
+ { 0x0B99, 22942 },
+ { 0x0B9A, 22888 },
+ { 0x0B9C, 22900 },
+ { 0x0B9E, 22948 },
+ { 0x0B9F, 22960 },
+ { 0x0BA3, 22945 },
+ { 0x0BA4, 22927 },
+ { 0x0BA8, 22912 },
+ { 0x0BA9, 22966 },
+ { 0x0BAA, 22918 },
+ { 0x0BAE, 22909 },
+ { 0x0BAF, 22936 },
+ { 0x0BB0, 22921 },
+ { 0x0BB1, 22951 },
+ { 0x0BB2, 22906 },
+ { 0x0BB3, 22939 },
+ { 0x0BB4, 22963 },
+ { 0x0BB5, 22933 },
+ { 0x0BB6, 22954 },
+ { 0x0BB7, 22957 },
+ { 0x0BB8, 22924 },
+ { 0x0BB9, 22894 },
+ { 0x0BBE, 22833 },
+ { 0x0BBF, 22821 },
+ { 0x0BC0, 22849 },
+ { 0x0BC1, 22829 },
+ { 0x0BC2, 22857 },
+ { 0x0BC6, 22817 },
+ { 0x0BC7, 22845 },
+ { 0x0BC8, 22837 },
+ { 0x0BCA, 22825 },
+ { 0x0BCB, 22853 },
+ { 0x0BCC, 22841 },
+ { 0x0BCD, 22766 },
+ { 0x0BD0, 22761 },
+ { 0x0BD7, 22757 },
+ { 0x0BE6, 22799 },
+ { 0x0BE7, 22781 },
+ { 0x0BE8, 22787 },
+ { 0x0BE9, 22808 },
+ { 0x0BEA, 22793 },
+ { 0x0BEB, 22790 },
+ { 0x0BEC, 22784 },
+ { 0x0BED, 22805 },
+ { 0x0BEE, 22802 },
+ { 0x0BEF, 22796 },
+ { 0x0BF0, 22977 },
+ { 0x0BF1, 22969 },
+ { 0x0BF2, 22973 },
+ { 0x0BF3, 22763 },
+ { 0x0BF4, 22811 },
+ { 0x0BF5, 22775 },
+ { 0x0BF6, 22778 },
+ { 0x0BF7, 22861 },
+ { 0x0BF8, 22753 },
+ { 0x0BF9, 22814 },
+ { 0x0BFA, 22980 },
+ { 0x0C01, 37149 },
+ { 0x0C02, 37143 },
+ { 0x0C03, 37140 },
+ { 0x0C05, 37249 },
+ { 0x0C06, 37264 },
+ { 0x0C07, 37255 },
+ { 0x0C08, 37291 },
+ { 0x0C09, 37261 },
+ { 0x0C0A, 37324 },
+ { 0x0C0B, 37400 },
+ { 0x0C0C, 37396 },
+ { 0x0C0E, 37252 },
+ { 0x0C0F, 37282 },
+ { 0x0C10, 37267 },
+ { 0x0C12, 37258 },
+ { 0x0C13, 37309 },
+ { 0x0C14, 37270 },
+ { 0x0C15, 37297 },
+ { 0x0C16, 37354 },
+ { 0x0C17, 37285 },
+ { 0x0C18, 37348 },
+ { 0x0C19, 37360 },
+ { 0x0C1A, 37276 },
+ { 0x0C1B, 37336 },
+ { 0x0C1C, 37294 },
+ { 0x0C1D, 37351 },
+ { 0x0C1E, 37366 },
+ { 0x0C1F, 37387 },
+ { 0x0C20, 37393 },
+ { 0x0C21, 37339 },
+ { 0x0C22, 37390 },
+ { 0x0C23, 37363 },
+ { 0x0C24, 37321 },
+ { 0x0C25, 37381 },
+ { 0x0C26, 37279 },
+ { 0x0C27, 37342 },
+ { 0x0C28, 37306 },
+ { 0x0C2A, 37312 },
+ { 0x0C2B, 37369 },
+ { 0x0C2C, 37273 },
+ { 0x0C2D, 37333 },
+ { 0x0C2E, 37303 },
+ { 0x0C2F, 37330 },
+ { 0x0C30, 37315 },
+ { 0x0C31, 37372 },
+ { 0x0C32, 37300 },
+ { 0x0C33, 37357 },
+ { 0x0C35, 37327 },
+ { 0x0C36, 37375 },
+ { 0x0C37, 37378 },
+ { 0x0C38, 37318 },
+ { 0x0C39, 37288 },
+ { 0x0C3D, 37146 },
+ { 0x0C3E, 37198 },
+ { 0x0C3F, 37186 },
+ { 0x0C40, 37214 },
+ { 0x0C41, 37194 },
+ { 0x0C42, 37222 },
+ { 0x0C43, 37231 },
+ { 0x0C44, 37241 },
+ { 0x0C46, 37182 },
+ { 0x0C47, 37210 },
+ { 0x0C48, 37202 },
+ { 0x0C4A, 37190 },
+ { 0x0C4B, 37218 },
+ { 0x0C4C, 37206 },
+ { 0x0C4D, 37137 },
+ { 0x0C55, 37246 },
+ { 0x0C56, 37130 },
+ { 0x0C58, 37384 },
+ { 0x0C59, 37345 },
+ { 0x0C60, 37408 },
+ { 0x0C61, 37404 },
+ { 0x0C62, 37226 },
+ { 0x0C63, 37236 },
+ { 0x0C66, 37170 },
+ { 0x0C67, 37152 },
+ { 0x0C68, 37158 },
+ { 0x0C69, 37179 },
+ { 0x0C6A, 37164 },
+ { 0x0C6B, 37161 },
+ { 0x0C6C, 37155 },
+ { 0x0C6D, 37176 },
+ { 0x0C6E, 37173 },
+ { 0x0C6F, 37167 },
+ { 0x0C78, 37448 },
+ { 0x0C79, 37412 },
+ { 0x0C7A, 37430 },
+ { 0x0C7B, 37457 },
+ { 0x0C7C, 37421 },
+ { 0x0C7D, 37439 },
+ { 0x0C7E, 37466 },
+ { 0x0C7F, 37134 },
+ { 0x0C82, 40655 },
+ { 0x0C83, 40652 },
+ { 0x0C85, 40764 },
+ { 0x0C86, 40779 },
+ { 0x0C87, 40770 },
+ { 0x0C88, 40809 },
+ { 0x0C89, 40776 },
+ { 0x0C8A, 40842 },
+ { 0x0C8B, 40912 },
+ { 0x0C8C, 40908 },
+ { 0x0C8E, 40767 },
+ { 0x0C8F, 40797 },
+ { 0x0C90, 40782 },
+ { 0x0C92, 40773 },
+ { 0x0C93, 40827 },
+ { 0x0C94, 40785 },
+ { 0x0C95, 40815 },
+ { 0x0C96, 40869 },
+ { 0x0C97, 40803 },
+ { 0x0C98, 40863 },
+ { 0x0C99, 40875 },
+ { 0x0C9A, 40791 },
+ { 0x0C9B, 40854 },
+ { 0x0C9C, 40812 },
+ { 0x0C9D, 40866 },
+ { 0x0C9E, 40881 },
+ { 0x0C9F, 40899 },
+ { 0x0CA0, 40905 },
+ { 0x0CA1, 40857 },
+ { 0x0CA2, 40902 },
+ { 0x0CA3, 40878 },
+ { 0x0CA4, 40839 },
+ { 0x0CA5, 40896 },
+ { 0x0CA6, 40794 },
+ { 0x0CA7, 40860 },
+ { 0x0CA8, 40824 },
+ { 0x0CAA, 40830 },
+ { 0x0CAB, 40884 },
+ { 0x0CAC, 40788 },
+ { 0x0CAD, 40851 },
+ { 0x0CAE, 40821 },
+ { 0x0CAF, 40848 },
+ { 0x0CB0, 40833 },
+ { 0x0CB1, 40887 },
+ { 0x0CB2, 40818 },
+ { 0x0CB3, 40872 },
+ { 0x0CB5, 40845 },
+ { 0x0CB6, 40890 },
+ { 0x0CB7, 40893 },
+ { 0x0CB8, 40836 },
+ { 0x0CB9, 40806 },
+ { 0x0CBC, 40646 },
+ { 0x0CBD, 40658 },
+ { 0x0CBE, 40713 },
+ { 0x0CBF, 40701 },
+ { 0x0CC0, 40729 },
+ { 0x0CC1, 40709 },
+ { 0x0CC2, 40737 },
+ { 0x0CC3, 40746 },
+ { 0x0CC4, 40756 },
+ { 0x0CC6, 40697 },
+ { 0x0CC7, 40725 },
+ { 0x0CC8, 40717 },
+ { 0x0CCA, 40705 },
+ { 0x0CCB, 40733 },
+ { 0x0CCC, 40721 },
+ { 0x0CCD, 40649 },
+ { 0x0CD5, 40761 },
+ { 0x0CD6, 40642 },
+ { 0x0CDE, 40800 },
+ { 0x0CE0, 40920 },
+ { 0x0CE1, 40916 },
+ { 0x0CE2, 40741 },
+ { 0x0CE3, 40751 },
+ { 0x0CE6, 40685 },
+ { 0x0CE7, 40667 },
+ { 0x0CE8, 40673 },
+ { 0x0CE9, 40694 },
+ { 0x0CEA, 40679 },
+ { 0x0CEB, 40676 },
+ { 0x0CEC, 40670 },
+ { 0x0CED, 40691 },
+ { 0x0CEE, 40688 },
+ { 0x0CEF, 40682 },
+ { 0x0CF1, 40661 },
+ { 0x0CF2, 40664 },
+ { 0x0D02, 64805 },
+ { 0x0D03, 64802 },
+ { 0x0D05, 64905 },
+ { 0x0D06, 64920 },
+ { 0x0D07, 64911 },
+ { 0x0D08, 64947 },
+ { 0x0D09, 64917 },
+ { 0x0D0A, 64980 },
+ { 0x0D0B, 65077 },
+ { 0x0D0C, 65073 },
+ { 0x0D0E, 64908 },
+ { 0x0D0F, 64938 },
+ { 0x0D10, 64923 },
+ { 0x0D12, 64914 },
+ { 0x0D13, 64965 },
+ { 0x0D14, 64926 },
+ { 0x0D15, 64953 },
+ { 0x0D16, 65007 },
+ { 0x0D17, 64941 },
+ { 0x0D18, 65001 },
+ { 0x0D19, 65013 },
+ { 0x0D1A, 64932 },
+ { 0x0D1B, 64992 },
+ { 0x0D1C, 64950 },
+ { 0x0D1D, 65004 },
+ { 0x0D1E, 65019 },
+ { 0x0D1F, 65037 },
+ { 0x0D20, 65046 },
+ { 0x0D21, 64995 },
+ { 0x0D22, 65040 },
+ { 0x0D23, 65016 },
+ { 0x0D24, 64977 },
+ { 0x0D25, 65034 },
+ { 0x0D26, 64935 },
+ { 0x0D27, 64998 },
+ { 0x0D28, 64962 },
+ { 0x0D2A, 64968 },
+ { 0x0D2B, 65022 },
+ { 0x0D2C, 64929 },
+ { 0x0D2D, 64989 },
+ { 0x0D2E, 64959 },
+ { 0x0D2F, 64986 },
+ { 0x0D30, 64971 },
+ { 0x0D31, 65025 },
+ { 0x0D32, 64956 },
+ { 0x0D33, 65010 },
+ { 0x0D34, 65043 },
+ { 0x0D35, 64983 },
+ { 0x0D36, 65028 },
+ { 0x0D37, 65031 },
+ { 0x0D38, 64974 },
+ { 0x0D39, 64944 },
+ { 0x0D3D, 64808 },
+ { 0x0D3E, 64857 },
+ { 0x0D3F, 64845 },
+ { 0x0D40, 64873 },
+ { 0x0D41, 64853 },
+ { 0x0D42, 64881 },
+ { 0x0D43, 64890 },
+ { 0x0D44, 64900 },
+ { 0x0D46, 64841 },
+ { 0x0D47, 64869 },
+ { 0x0D48, 64861 },
+ { 0x0D4A, 64849 },
+ { 0x0D4B, 64877 },
+ { 0x0D4C, 64865 },
+ { 0x0D4D, 64799 },
+ { 0x0D57, 64792 },
+ { 0x0D60, 65085 },
+ { 0x0D61, 65081 },
+ { 0x0D62, 64885 },
+ { 0x0D63, 64895 },
+ { 0x0D66, 64829 },
+ { 0x0D67, 64811 },
+ { 0x0D68, 64817 },
+ { 0x0D69, 64838 },
+ { 0x0D6A, 64823 },
+ { 0x0D6B, 64820 },
+ { 0x0D6C, 64814 },
+ { 0x0D6D, 64835 },
+ { 0x0D6E, 64832 },
+ { 0x0D6F, 64826 },
+ { 0x0D70, 65097 },
+ { 0x0D71, 65089 },
+ { 0x0D72, 65093 },
+ { 0x0D73, 65104 },
+ { 0x0D74, 65100 },
+ { 0x0D75, 65108 },
+ { 0x0D79, 64796 },
+ { 0x0D7A, 65065 },
+ { 0x0D7B, 65057 },
+ { 0x0D7C, 65069 },
+ { 0x0D7D, 65053 },
+ { 0x0D7E, 65061 },
+ { 0x0D7F, 65049 },
+ { 0x0D82, 43201 },
+ { 0x0D83, 43198 },
+ { 0x0D85, 43293 },
+ { 0x0D86, 43308 },
+ { 0x0D87, 43311 },
+ { 0x0D88, 43395 },
+ { 0x0D89, 43299 },
+ { 0x0D8A, 43341 },
+ { 0x0D8B, 43305 },
+ { 0x0D8C, 43386 },
+ { 0x0D8D, 43401 },
+ { 0x0D8E, 43407 },
+ { 0x0D8F, 43398 },
+ { 0x0D90, 43404 },
+ { 0x0D91, 43296 },
+ { 0x0D92, 43332 },
+ { 0x0D93, 43314 },
+ { 0x0D94, 43302 },
+ { 0x0D95, 43351 },
+ { 0x0D96, 43317 },
+ { 0x0D9A, 43442 },
+ { 0x0D9B, 43482 },
+ { 0x0D9C, 43434 },
+ { 0x0D9D, 43474 },
+ { 0x0D9E, 43344 },
+ { 0x0D9F, 43361 },
+ { 0x0DA0, 43426 },
+ { 0x0DA1, 43466 },
+ { 0x0DA2, 43438 },
+ { 0x0DA3, 43478 },
+ { 0x0DA4, 43382 },
+ { 0x0DA5, 43377 },
+ { 0x0DA6, 43365 },
+ { 0x0DA7, 43458 },
+ { 0x0DA8, 43498 },
+ { 0x0DA9, 43454 },
+ { 0x0DAA, 43494 },
+ { 0x0DAB, 43414 },
+ { 0x0DAC, 43369 },
+ { 0x0DAD, 43450 },
+ { 0x0DAE, 43490 },
+ { 0x0DAF, 43430 },
+ { 0x0DB0, 43470 },
+ { 0x0DB1, 43324 },
+ { 0x0DB3, 43357 },
+ { 0x0DB4, 43446 },
+ { 0x0DB5, 43486 },
+ { 0x0DB6, 43422 },
+ { 0x0DB7, 43462 },
+ { 0x0DB8, 43348 },
+ { 0x0DB9, 43289 },
+ { 0x0DBA, 43392 },
+ { 0x0DBB, 43354 },
+ { 0x0DBD, 43320 },
+ { 0x0DC0, 43389 },
+ { 0x0DC1, 43373 },
+ { 0x0DC2, 43418 },
+ { 0x0DC3, 43328 },
+ { 0x0DC4, 43338 },
+ { 0x0DC5, 43410 },
+ { 0x0DC6, 43335 },
+ { 0x0DCA, 43195 },
+ { 0x0DCF, 43277 },
+ { 0x0DD0, 43244 },
+ { 0x0DD1, 43219 },
+ { 0x0DD2, 43234 },
+ { 0x0DD3, 43209 },
+ { 0x0DD4, 43239 },
+ { 0x0DD6, 43214 },
+ { 0x0DD8, 43285 },
+ { 0x0DD9, 43254 },
+ { 0x0DDA, 43204 },
+ { 0x0DDB, 43249 },
+ { 0x0DDC, 43265 },
+ { 0x0DDD, 43258 },
+ { 0x0DDE, 43271 },
+ { 0x0DDF, 43281 },
+ { 0x0DF2, 43229 },
+ { 0x0DF3, 43224 },
+ { 0x0DF4, 43502 },
+ { 0x0E01, 9790 },
+ { 0x0E02, 9880 },
+ { 0x0E03, 9888 },
+ { 0x0E04, 9892 },
+ { 0x0E05, 9884 },
+ { 0x0E06, 9896 },
+ { 0x0E07, 9920 },
+ { 0x0E08, 9864 },
+ { 0x0E09, 9876 },
+ { 0x0E0A, 9872 },
+ { 0x0E0B, 9828 },
+ { 0x0E0C, 9868 },
+ { 0x0E0D, 9860 },
+ { 0x0E0E, 9770 },
+ { 0x0E0F, 9848 },
+ { 0x0E10, 9936 },
+ { 0x0E11, 9956 },
+ { 0x0E12, 9952 },
+ { 0x0E13, 9813 },
+ { 0x0E14, 9766 },
+ { 0x0E15, 9844 },
+ { 0x0E16, 9944 },
+ { 0x0E17, 9948 },
+ { 0x0E18, 9940 },
+ { 0x0E19, 9809 },
+ { 0x0E1A, 9762 },
+ { 0x0E1B, 9817 },
+ { 0x0E1C, 9928 },
+ { 0x0E1D, 9774 },
+ { 0x0E1E, 9924 },
+ { 0x0E1F, 9778 },
+ { 0x0E20, 9932 },
+ { 0x0E21, 9805 },
+ { 0x0E22, 9856 },
+ { 0x0E23, 9821 },
+ { 0x0E24, 9825 },
+ { 0x0E25, 9794 },
+ { 0x0E26, 9802 },
+ { 0x0E27, 9852 },
+ { 0x0E28, 9840 },
+ { 0x0E29, 9836 },
+ { 0x0E2A, 9832 },
+ { 0x0E2B, 9782 },
+ { 0x0E2C, 9798 },
+ { 0x0E2D, 9758 },
+ { 0x0E2E, 9786 },
+ { 0x0E2F, 10039 },
+ { 0x0E30, 9960 },
+ { 0x0E31, 9916 },
+ { 0x0E32, 9980 },
+ { 0x0E33, 9998 },
+ { 0x0E34, 9968 },
+ { 0x0E35, 10002 },
+ { 0x0E36, 10006 },
+ { 0x0E37, 10014 },
+ { 0x0E38, 9976 },
+ { 0x0E39, 10010 },
+ { 0x0E3A, 10024 },
+ { 0x0E3F, 9754 },
+ { 0x0E40, 9964 },
+ { 0x0E41, 9984 },
+ { 0x0E42, 9972 },
+ { 0x0E43, 9988 },
+ { 0x0E44, 9993 },
+ { 0x0E45, 10045 },
+ { 0x0E46, 10027 },
+ { 0x0E47, 10036 },
+ { 0x0E48, 9900 },
+ { 0x0E49, 9904 },
+ { 0x0E4A, 9908 },
+ { 0x0E4B, 9912 },
+ { 0x0E4C, 10048 },
+ { 0x0E4D, 10030 },
+ { 0x0E4E, 10033 },
+ { 0x0E4F, 10021 },
+ { 0x0E50, 9742 },
+ { 0x0E51, 9724 },
+ { 0x0E52, 9730 },
+ { 0x0E53, 9751 },
+ { 0x0E54, 9736 },
+ { 0x0E55, 9733 },
+ { 0x0E56, 9727 },
+ { 0x0E57, 9748 },
+ { 0x0E58, 9745 },
+ { 0x0E59, 9739 },
+ { 0x0E5A, 10042 },
+ { 0x0E5B, 10018 },
+ { 0x0E81, 5948 },
+ { 0x0E82, 5989 },
+ { 0x0E84, 5985 },
+ { 0x0E87, 5993 },
+ { 0x0E88, 5926 },
+ { 0x0E8A, 5968 },
+ { 0x0E8D, 5996 },
+ { 0x0E94, 5929 },
+ { 0x0E95, 5976 },
+ { 0x0E96, 6011 },
+ { 0x0E97, 6007 },
+ { 0x0E99, 5962 },
+ { 0x0E9A, 5923 },
+ { 0x0E9B, 5965 },
+ { 0x0E9C, 6003 },
+ { 0x0E9D, 5932 },
+ { 0x0E9E, 5999 },
+ { 0x0E9F, 5936 },
+ { 0x0EA1, 5959 },
+ { 0x0EA2, 5982 },
+ { 0x0EA3, 5951 },
+ { 0x0EA5, 5955 },
+ { 0x0EA7, 5979 },
+ { 0x0EAA, 5972 },
+ { 0x0EAB, 5944 },
+ { 0x0EAD, 5920 },
+ { 0x0EAE, 5940 },
+ { 0x0EAF, 6015 },
+ { 0x0EB0, 5854 },
+ { 0x0EB1, 5910 },
+ { 0x0EB2, 5878 },
+ { 0x0EB3, 5886 },
+ { 0x0EB4, 5862 },
+ { 0x0EB5, 5898 },
+ { 0x0EB6, 5874 },
+ { 0x0EB7, 5906 },
+ { 0x0EB8, 5870 },
+ { 0x0EB9, 5902 },
+ { 0x0EBB, 5915 },
+ { 0x0EBC, 6019 },
+ { 0x0EBD, 6023 },
+ { 0x0EC0, 5858 },
+ { 0x0EC1, 5894 },
+ { 0x0EC2, 5866 },
+ { 0x0EC3, 5890 },
+ { 0x0EC4, 5882 },
+ { 0x0EC6, 5805 },
+ { 0x0EC8, 5808 },
+ { 0x0EC9, 5816 },
+ { 0x0ECA, 5812 },
+ { 0x0ECB, 5820 },
+ { 0x0ECC, 6027 },
+ { 0x0ECD, 6017 },
+ { 0x0ED0, 5842 },
+ { 0x0ED1, 5824 },
+ { 0x0ED2, 5830 },
+ { 0x0ED3, 5851 },
+ { 0x0ED4, 5836 },
+ { 0x0ED5, 5833 },
+ { 0x0ED6, 5827 },
+ { 0x0ED7, 5848 },
+ { 0x0ED8, 5845 },
+ { 0x0ED9, 5839 },
+ { 0x0EDC, 5802 },
+ { 0x0EDD, 5799 },
+ { 0x0F00, 44295 },
+ { 0x0F01, 43729 },
+ { 0x0F02, 43720 },
+ { 0x0F03, 43711 },
+ { 0x0F04, 43850 },
+ { 0x0F05, 43831 },
+ { 0x0F06, 43789 },
+ { 0x0F07, 43698 },
+ { 0x0F08, 43820 },
+ { 0x0F09, 43784 },
+ { 0x0F0A, 43705 },
+ { 0x0F0B, 43871 },
+ { 0x0F0C, 43866 },
+ { 0x0F0D, 43770 },
+ { 0x0F0E, 43752 },
+ { 0x0F0F, 43824 },
+ { 0x0F10, 43760 },
+ { 0x0F11, 43688 },
+ { 0x0F12, 43765 },
+ { 0x0F13, 43797 },
+ { 0x0F14, 43736 },
+ { 0x0F15, 44285 },
+ { 0x0F16, 44290 },
+ { 0x0F17, 44477 },
+ { 0x0F18, 44489 },
+ { 0x0F19, 44484 },
+ { 0x0F1A, 43937 },
+ { 0x0F1B, 43953 },
+ { 0x0F1C, 43942 },
+ { 0x0F1D, 43916 },
+ { 0x0F1E, 43932 },
+ { 0x0F1F, 43947 },
+ { 0x0F20, 44030 },
+ { 0x0F21, 43972 },
+ { 0x0F22, 43978 },
+ { 0x0F23, 44039 },
+ { 0x0F24, 43984 },
+ { 0x0F25, 43981 },
+ { 0x0F26, 43975 },
+ { 0x0F27, 44036 },
+ { 0x0F28, 44033 },
+ { 0x0F29, 44027 },
+ { 0x0F2A, 43987 },
+ { 0x0F2B, 43995 },
+ { 0x0F2C, 44023 },
+ { 0x0F2D, 44003 },
+ { 0x0F2E, 43999 },
+ { 0x0F2F, 43991 },
+ { 0x0F30, 44019 },
+ { 0x0F31, 44015 },
+ { 0x0F32, 44007 },
+ { 0x0F33, 44011 },
+ { 0x0F34, 43773 },
+ { 0x0F35, 43740 },
+ { 0x0F36, 43805 },
+ { 0x0F37, 43746 },
+ { 0x0F38, 43674 },
+ { 0x0F39, 43694 },
+ { 0x0F3A, 43683 },
+ { 0x0F3B, 43678 },
+ { 0x0F3C, 43669 },
+ { 0x0F3D, 43664 },
+ { 0x0F3E, 43908 },
+ { 0x0F3F, 43894 },
+ { 0x0F40, 44132 },
+ { 0x0F41, 44183 },
+ { 0x0F42, 44123 },
+ { 0x0F43, 44180 },
+ { 0x0F44, 44189 },
+ { 0x0F45, 44117 },
+ { 0x0F46, 44168 },
+ { 0x0F47, 44129 },
+ { 0x0F49, 44195 },
+ { 0x0F4A, 44216 },
+ { 0x0F4B, 44234 },
+ { 0x0F4C, 44171 },
+ { 0x0F4D, 44222 },
+ { 0x0F4E, 44192 },
+ { 0x0F4F, 44153 },
+ { 0x0F50, 44210 },
+ { 0x0F51, 44120 },
+ { 0x0F52, 44174 },
+ { 0x0F53, 44141 },
+ { 0x0F54, 44144 },
+ { 0x0F55, 44198 },
+ { 0x0F56, 44114 },
+ { 0x0F57, 44165 },
+ { 0x0F58, 44138 },
+ { 0x0F59, 44213 },
+ { 0x0F5A, 44231 },
+ { 0x0F5B, 44177 },
+ { 0x0F5C, 44225 },
+ { 0x0F5D, 44156 },
+ { 0x0F5E, 44219 },
+ { 0x0F5F, 44162 },
+ { 0x0F60, 44111 },
+ { 0x0F61, 44159 },
+ { 0x0F62, 44147 },
+ { 0x0F63, 44135 },
+ { 0x0F64, 44204 },
+ { 0x0F65, 44207 },
+ { 0x0F66, 44150 },
+ { 0x0F67, 44126 },
+ { 0x0F68, 44108 },
+ { 0x0F69, 44228 },
+ { 0x0F6A, 44237 },
+ { 0x0F6B, 44186 },
+ { 0x0F6C, 44201 },
+ { 0x0F71, 44058 },
+ { 0x0F72, 44046 },
+ { 0x0F73, 44066 },
+ { 0x0F74, 44054 },
+ { 0x0F75, 44074 },
+ { 0x0F76, 44083 },
+ { 0x0F77, 44093 },
+ { 0x0F78, 44078 },
+ { 0x0F79, 44088 },
+ { 0x0F7A, 44042 },
+ { 0x0F7B, 44062 },
+ { 0x0F7C, 44050 },
+ { 0x0F7D, 44070 },
+ { 0x0F7E, 43958 },
+ { 0x0F7F, 43964 },
+ { 0x0F80, 44098 },
+ { 0x0F81, 44103 },
+ { 0x0F82, 43898 },
+ { 0x0F83, 43904 },
+ { 0x0F84, 43847 },
+ { 0x0F85, 43828 },
+ { 0x0F86, 43890 },
+ { 0x0F87, 43968 },
+ { 0x0F88, 43885 },
+ { 0x0F89, 43912 },
+ { 0x0F8A, 43875 },
+ { 0x0F8B, 43880 },
+ { 0x0F90, 44330 },
+ { 0x0F91, 44398 },
+ { 0x0F92, 44318 },
+ { 0x0F93, 44394 },
+ { 0x0F94, 44402 },
+ { 0x0F95, 44310 },
+ { 0x0F96, 44378 },
+ { 0x0F97, 44326 },
+ { 0x0F99, 44410 },
+ { 0x0F9A, 44434 },
+ { 0x0F9B, 44458 },
+ { 0x0F9C, 44382 },
+ { 0x0F9D, 44442 },
+ { 0x0F9E, 44406 },
+ { 0x0F9F, 44358 },
+ { 0x0FA0, 44426 },
+ { 0x0FA1, 44314 },
+ { 0x0FA2, 44386 },
+ { 0x0FA3, 44342 },
+ { 0x0FA4, 44346 },
+ { 0x0FA5, 44414 },
+ { 0x0FA6, 44306 },
+ { 0x0FA7, 44374 },
+ { 0x0FA8, 44338 },
+ { 0x0FA9, 44430 },
+ { 0x0FAA, 44454 },
+ { 0x0FAB, 44390 },
+ { 0x0FAC, 44446 },
+ { 0x0FAD, 44362 },
+ { 0x0FAE, 44438 },
+ { 0x0FAF, 44370 },
+ { 0x0FB0, 44302 },
+ { 0x0FB1, 44366 },
+ { 0x0FB2, 44350 },
+ { 0x0FB3, 44334 },
+ { 0x0FB4, 44418 },
+ { 0x0FB5, 44422 },
+ { 0x0FB6, 44354 },
+ { 0x0FB7, 44322 },
+ { 0x0FB8, 44298 },
+ { 0x0FB9, 44450 },
+ { 0x0FBA, 44467 },
+ { 0x0FBB, 44472 },
+ { 0x0FBC, 44462 },
+ { 0x0FBE, 43653 },
+ { 0x0FBF, 43657 },
+ { 0x0FC0, 44504 },
+ { 0x0FC1, 44509 },
+ { 0x0FC2, 44494 },
+ { 0x0FC3, 44499 },
+ { 0x0FC4, 44273 },
+ { 0x0FC5, 44263 },
+ { 0x0FC6, 44281 },
+ { 0x0FC7, 44267 },
+ { 0x0FC8, 44277 },
+ { 0x0FC9, 44241 },
+ { 0x0FCA, 44257 },
+ { 0x0FCB, 44251 },
+ { 0x0FCC, 44245 },
+ { 0x0FCE, 43926 },
+ { 0x0FCF, 43921 },
+ { 0x0FD0, 43777 },
+ { 0x0FD1, 43813 },
+ { 0x0FD2, 43756 },
+ { 0x0FD3, 43857 },
+ { 0x0FD4, 43838 },
+ { 0x1000, 42482 },
+ { 0x1001, 42533 },
+ { 0x1002, 42470 },
+ { 0x1003, 42527 },
+ { 0x1004, 42559 },
+ { 0x1005, 42464 },
+ { 0x1006, 42518 },
+ { 0x1007, 42479 },
+ { 0x1008, 42530 },
+ { 0x1009, 42565 },
+ { 0x100A, 42586 },
+ { 0x100B, 42580 },
+ { 0x100C, 42650 },
+ { 0x100D, 42521 },
+ { 0x100E, 42583 },
+ { 0x100F, 42562 },
+ { 0x1010, 42503 },
+ { 0x1011, 42577 },
+ { 0x1012, 42467 },
+ { 0x1013, 42524 },
+ { 0x1014, 42491 },
+ { 0x1015, 42494 },
+ { 0x1016, 42568 },
+ { 0x1017, 42461 },
+ { 0x1018, 42515 },
+ { 0x1019, 42488 },
+ { 0x101A, 42512 },
+ { 0x101B, 42497 },
+ { 0x101C, 42485 },
+ { 0x101D, 42509 },
+ { 0x101E, 42500 },
+ { 0x101F, 42473 },
+ { 0x1020, 42536 },
+ { 0x1021, 42443 },
+ { 0x1022, 42594 },
+ { 0x1023, 42449 },
+ { 0x1024, 42476 },
+ { 0x1025, 42455 },
+ { 0x1026, 42506 },
+ { 0x1027, 42446 },
+ { 0x1028, 42539 },
+ { 0x1029, 42452 },
+ { 0x102A, 42458 },
+ { 0x102B, 42389 },
+ { 0x102C, 42329 },
+ { 0x102D, 42321 },
+ { 0x102E, 42337 },
+ { 0x102F, 42325 },
+ { 0x1030, 42341 },
+ { 0x1031, 42312 },
+ { 0x1032, 42333 },
+ { 0x1033, 42350 },
+ { 0x1034, 42345 },
+ { 0x1035, 42316 },
+ { 0x1036, 42266 },
+ { 0x1037, 42179 },
+ { 0x1038, 42233 },
+ { 0x1039, 42227 },
+ { 0x103A, 42183 },
+ { 0x103B, 42767 },
+ { 0x103C, 42757 },
+ { 0x103D, 42762 },
+ { 0x103E, 42752 },
+ { 0x103F, 42653 },
+ { 0x1040, 42300 },
+ { 0x1041, 42282 },
+ { 0x1042, 42288 },
+ { 0x1043, 42309 },
+ { 0x1044, 42294 },
+ { 0x1045, 42291 },
+ { 0x1046, 42285 },
+ { 0x1047, 42306 },
+ { 0x1048, 42303 },
+ { 0x1049, 42297 },
+ { 0x104A, 42223 },
+ { 0x104B, 42230 },
+ { 0x104C, 42719 },
+ { 0x104D, 42722 },
+ { 0x104E, 42725 },
+ { 0x104F, 42716 },
+ { 0x1050, 42571 },
+ { 0x1051, 42574 },
+ { 0x1052, 42684 },
+ { 0x1053, 42692 },
+ { 0x1054, 42680 },
+ { 0x1055, 42688 },
+ { 0x1056, 42414 },
+ { 0x1057, 42424 },
+ { 0x1058, 42409 },
+ { 0x1059, 42419 },
+ { 0x105A, 42555 },
+ { 0x105B, 42551 },
+ { 0x105C, 42543 },
+ { 0x105D, 42547 },
+ { 0x105E, 42740 },
+ { 0x105F, 42734 },
+ { 0x1060, 42728 },
+ { 0x1061, 42589 },
+ { 0x1062, 42361 },
+ { 0x1063, 42276 },
+ { 0x1064, 42269 },
+ { 0x1065, 42702 },
+ { 0x1066, 42696 },
+ { 0x1067, 42429 },
+ { 0x1068, 42436 },
+ { 0x1069, 42236 },
+ { 0x106A, 42242 },
+ { 0x106B, 42248 },
+ { 0x106C, 42254 },
+ { 0x106D, 42260 },
+ { 0x106E, 42662 },
+ { 0x106F, 42668 },
+ { 0x1070, 42674 },
+ { 0x1071, 42355 },
+ { 0x1072, 42404 },
+ { 0x1073, 42394 },
+ { 0x1074, 42399 },
+ { 0x1075, 42622 },
+ { 0x1076, 42634 },
+ { 0x1077, 42614 },
+ { 0x1078, 42602 },
+ { 0x1079, 42630 },
+ { 0x107A, 42638 },
+ { 0x107B, 42606 },
+ { 0x107C, 42626 },
+ { 0x107D, 42642 },
+ { 0x107E, 42610 },
+ { 0x107F, 42598 },
+ { 0x1080, 42646 },
+ { 0x1081, 42618 },
+ { 0x1082, 42746 },
+ { 0x1083, 42378 },
+ { 0x1084, 42367 },
+ { 0x1085, 42372 },
+ { 0x1086, 42383 },
+ { 0x1087, 42186 },
+ { 0x1088, 42190 },
+ { 0x1089, 42194 },
+ { 0x108A, 42198 },
+ { 0x108B, 42202 },
+ { 0x108C, 42207 },
+ { 0x108D, 42212 },
+ { 0x108E, 42657 },
+ { 0x108F, 42218 },
+ { 0x1090, 42163 },
+ { 0x1091, 42139 },
+ { 0x1092, 42147 },
+ { 0x1093, 42175 },
+ { 0x1094, 42155 },
+ { 0x1095, 42151 },
+ { 0x1096, 42143 },
+ { 0x1097, 42171 },
+ { 0x1098, 42167 },
+ { 0x1099, 42159 },
+ { 0x109E, 42708 },
+ { 0x109F, 42712 },
+ { 0x10A0, 52068 },
+ { 0x10A1, 52096 },
+ { 0x10A2, 52112 },
+ { 0x10A3, 52108 },
+ { 0x10A4, 52072 },
+ { 0x10A5, 52176 },
+ { 0x10A6, 52184 },
+ { 0x10A7, 52168 },
+ { 0x10A8, 52080 },
+ { 0x10A9, 52136 },
+ { 0x10AA, 52140 },
+ { 0x10AB, 52144 },
+ { 0x10AC, 52148 },
+ { 0x10AD, 52084 },
+ { 0x10AE, 52152 },
+ { 0x10AF, 52216 },
+ { 0x10B0, 52160 },
+ { 0x10B1, 52164 },
+ { 0x10B2, 52172 },
+ { 0x10B3, 52088 },
+ { 0x10B4, 52208 },
+ { 0x10B5, 52204 },
+ { 0x10B6, 52196 },
+ { 0x10B7, 52156 },
+ { 0x10B8, 52212 },
+ { 0x10B9, 52192 },
+ { 0x10BA, 52100 },
+ { 0x10BB, 52132 },
+ { 0x10BC, 52104 },
+ { 0x10BD, 52188 },
+ { 0x10BE, 52180 },
+ { 0x10BF, 52200 },
+ { 0x10C0, 52116 },
+ { 0x10C1, 52076 },
+ { 0x10C2, 52124 },
+ { 0x10C3, 52092 },
+ { 0x10C4, 52120 },
+ { 0x10C5, 52128 },
+ { 0x10D0, 51938 },
+ { 0x10D1, 51968 },
+ { 0x10D2, 51980 },
+ { 0x10D3, 51977 },
+ { 0x10D4, 51941 },
+ { 0x10D5, 52028 },
+ { 0x10D6, 52034 },
+ { 0x10D7, 52022 },
+ { 0x10D8, 51950 },
+ { 0x10D9, 51998 },
+ { 0x10DA, 52001 },
+ { 0x10DB, 52004 },
+ { 0x10DC, 52007 },
+ { 0x10DD, 51953 },
+ { 0x10DE, 52010 },
+ { 0x10DF, 52058 },
+ { 0x10E0, 52016 },
+ { 0x10E1, 52019 },
+ { 0x10E2, 52025 },
+ { 0x10E3, 51956 },
+ { 0x10E4, 52052 },
+ { 0x10E5, 52049 },
+ { 0x10E6, 52043 },
+ { 0x10E7, 52013 },
+ { 0x10E8, 52055 },
+ { 0x10E9, 52040 },
+ { 0x10EA, 51971 },
+ { 0x10EB, 51995 },
+ { 0x10EC, 51974 },
+ { 0x10ED, 52037 },
+ { 0x10EE, 52031 },
+ { 0x10EF, 52046 },
+ { 0x10F0, 51983 },
+ { 0x10F1, 51947 },
+ { 0x10F2, 51989 },
+ { 0x10F3, 51959 },
+ { 0x10F4, 51986 },
+ { 0x10F5, 51992 },
+ { 0x10F6, 51944 },
+ { 0x10F7, 51962 },
+ { 0x10F8, 52061 },
+ { 0x10F9, 52064 },
+ { 0x10FA, 51965 },
+ { 0x10FB, 52220 },
+ { 0x10FC, 54786 },
+ { 0x1100, 32202 },
+ { 0x1101, 32310 },
+ { 0x1102, 32190 },
+ { 0x1103, 32205 },
+ { 0x1104, 32313 },
+ { 0x1105, 32196 },
+ { 0x1106, 32187 },
+ { 0x1107, 32193 },
+ { 0x1108, 32268 },
+ { 0x1109, 32175 },
+ { 0x110A, 32226 },
+ { 0x110B, 32184 },
+ { 0x110C, 32178 },
+ { 0x110D, 32256 },
+ { 0x110E, 32208 },
+ { 0x110F, 32211 },
+ { 0x1110, 32220 },
+ { 0x1111, 32217 },
+ { 0x1112, 32181 },
+ { 0x1113, 32328 },
+ { 0x1114, 32265 },
+ { 0x1115, 32331 },
+ { 0x1116, 32289 },
+ { 0x1117, 32391 },
+ { 0x1118, 32301 },
+ { 0x1119, 32271 },
+ { 0x111A, 32298 },
+ { 0x111B, 32376 },
+ { 0x111C, 32286 },
+ { 0x111D, 32370 },
+ { 0x111E, 32334 },
+ { 0x111F, 32295 },
+ { 0x1120, 32337 },
+ { 0x1121, 32232 },
+ { 0x1122, 32424 },
+ { 0x1123, 32427 },
+ { 0x1124, 32418 },
+ { 0x1125, 32409 },
+ { 0x1126, 32415 },
+ { 0x1127, 32292 },
+ { 0x1128, 32382 },
+ { 0x1129, 32388 },
+ { 0x112A, 32385 },
+ { 0x112B, 32373 },
+ { 0x112C, 32439 },
+ { 0x112D, 32304 },
+ { 0x112E, 32247 },
+ { 0x112F, 32307 },
+ { 0x1130, 32253 },
+ { 0x1131, 32244 },
+ { 0x1132, 32250 },
+ { 0x1133, 32430 },
+ { 0x1134, 32394 },
+ { 0x1135, 32241 },
+ { 0x1136, 32235 },
+ { 0x1137, 32340 },
+ { 0x1138, 32343 },
+ { 0x1139, 32349 },
+ { 0x113A, 32346 },
+ { 0x113B, 32238 },
+ { 0x113C, 32319 },
+ { 0x113D, 32421 },
+ { 0x113E, 32397 },
+ { 0x113F, 32442 },
+ { 0x1140, 32214 },
+ { 0x1141, 32322 },
+ { 0x1142, 32325 },
+ { 0x1143, 32280 },
+ { 0x1144, 32283 },
+ { 0x1145, 32229 },
+ { 0x1146, 32361 },
+ { 0x1147, 32262 },
+ { 0x1148, 32277 },
+ { 0x1149, 32358 },
+ { 0x114A, 32367 },
+ { 0x114B, 32364 },
+ { 0x114C, 32223 },
+ { 0x114D, 32274 },
+ { 0x114E, 32355 },
+ { 0x114F, 32436 },
+ { 0x1150, 32412 },
+ { 0x1151, 32445 },
+ { 0x1152, 32400 },
+ { 0x1153, 32352 },
+ { 0x1154, 32403 },
+ { 0x1155, 32433 },
+ { 0x1156, 32379 },
+ { 0x1157, 32406 },
+ { 0x1158, 32259 },
+ { 0x1159, 32316 },
+ { 0x115F, 32199 },
+ { 0x1160, 32865 },
+ { 0x1161, 32694 },
+ { 0x1162, 32709 },
+ { 0x1163, 32730 },
+ { 0x1164, 32781 },
+ { 0x1165, 32712 },
+ { 0x1166, 32697 },
+ { 0x1167, 32784 },
+ { 0x1168, 32733 },
+ { 0x1169, 32703 },
+ { 0x116A, 32721 },
+ { 0x116B, 32775 },
+ { 0x116C, 32718 },
+ { 0x116D, 32739 },
+ { 0x116E, 32706 },
+ { 0x116F, 32778 },
+ { 0x1170, 32724 },
+ { 0x1171, 32727 },
+ { 0x1172, 32742 },
+ { 0x1173, 32715 },
+ { 0x1174, 32736 },
+ { 0x1175, 32700 },
+ { 0x1176, 32745 },
+ { 0x1177, 32748 },
+ { 0x1178, 32814 },
+ { 0x1179, 32847 },
+ { 0x117A, 32787 },
+ { 0x117B, 32790 },
+ { 0x117C, 32841 },
+ { 0x117D, 32850 },
+ { 0x117E, 32853 },
+ { 0x117F, 32802 },
+ { 0x1180, 32760 },
+ { 0x1181, 32805 },
+ { 0x1182, 32763 },
+ { 0x1183, 32766 },
+ { 0x1184, 32856 },
+ { 0x1185, 32868 },
+ { 0x1186, 32871 },
+ { 0x1187, 32823 },
+ { 0x1188, 32820 },
+ { 0x1189, 32769 },
+ { 0x118A, 32808 },
+ { 0x118B, 32886 },
+ { 0x118C, 32811 },
+ { 0x118D, 32772 },
+ { 0x118E, 32826 },
+ { 0x118F, 32859 },
+ { 0x1190, 32829 },
+ { 0x1191, 32874 },
+ { 0x1192, 32862 },
+ { 0x1193, 32835 },
+ { 0x1194, 32832 },
+ { 0x1195, 32793 },
+ { 0x1196, 32844 },
+ { 0x1197, 32817 },
+ { 0x1198, 32751 },
+ { 0x1199, 32799 },
+ { 0x119A, 32754 },
+ { 0x119B, 32757 },
+ { 0x119C, 32796 },
+ { 0x119D, 32883 },
+ { 0x119E, 32838 },
+ { 0x119F, 32889 },
+ { 0x11A0, 32880 },
+ { 0x11A1, 32877 },
+ { 0x11A2, 32892 },
+ { 0x11A8, 32472 },
+ { 0x11A9, 32577 },
+ { 0x11AA, 32535 },
+ { 0x11AB, 32463 },
+ { 0x11AC, 32547 },
+ { 0x11AD, 32550 },
+ { 0x11AE, 32475 },
+ { 0x11AF, 32469 },
+ { 0x11B0, 32598 },
+ { 0x11B1, 32562 },
+ { 0x11B2, 32568 },
+ { 0x11B3, 32508 },
+ { 0x11B4, 32643 },
+ { 0x11B5, 32640 },
+ { 0x11B6, 32559 },
+ { 0x11B7, 32460 },
+ { 0x11B8, 32466 },
+ { 0x11B9, 32505 },
+ { 0x11BA, 32448 },
+ { 0x11BB, 32496 },
+ { 0x11BC, 32457 },
+ { 0x11BD, 32451 },
+ { 0x11BE, 32478 },
+ { 0x11BF, 32481 },
+ { 0x11C0, 32490 },
+ { 0x11C1, 32487 },
+ { 0x11C2, 32454 },
+ { 0x11C3, 32586 },
+ { 0x11C4, 32682 },
+ { 0x11C5, 32592 },
+ { 0x11C6, 32595 },
+ { 0x11C7, 32502 },
+ { 0x11C8, 32622 },
+ { 0x11C9, 32625 },
+ { 0x11CA, 32646 },
+ { 0x11CB, 32604 },
+ { 0x11CC, 32673 },
+ { 0x11CD, 32565 },
+ { 0x11CE, 32601 },
+ { 0x11CF, 32688 },
+ { 0x11D0, 32520 },
+ { 0x11D1, 32685 },
+ { 0x11D2, 32661 },
+ { 0x11D3, 32664 },
+ { 0x11D4, 32676 },
+ { 0x11D5, 32691 },
+ { 0x11D6, 32658 },
+ { 0x11D7, 32637 },
+ { 0x11D8, 32634 },
+ { 0x11D9, 32679 },
+ { 0x11DA, 32589 },
+ { 0x11DB, 32544 },
+ { 0x11DC, 32541 },
+ { 0x11DD, 32499 },
+ { 0x11DE, 32655 },
+ { 0x11DF, 32619 },
+ { 0x11E0, 32616 },
+ { 0x11E1, 32538 },
+ { 0x11E2, 32610 },
+ { 0x11E3, 32556 },
+ { 0x11E4, 32631 },
+ { 0x11E5, 32553 },
+ { 0x11E6, 32613 },
+ { 0x11E7, 32571 },
+ { 0x11E8, 32574 },
+ { 0x11E9, 32514 },
+ { 0x11EA, 32511 },
+ { 0x11EB, 32484 },
+ { 0x11EC, 32583 },
+ { 0x11ED, 32670 },
+ { 0x11EE, 32517 },
+ { 0x11EF, 32607 },
+ { 0x11F0, 32493 },
+ { 0x11F1, 32649 },
+ { 0x11F2, 32667 },
+ { 0x11F3, 32628 },
+ { 0x11F4, 32652 },
+ { 0x11F5, 32526 },
+ { 0x11F6, 32532 },
+ { 0x11F7, 32523 },
+ { 0x11F8, 32529 },
+ { 0x11F9, 32580 },
+ { 0x1200, 50516 },
+ { 0x1201, 50528 },
+ { 0x1202, 50522 },
+ { 0x1203, 50909 },
+ { 0x1204, 50912 },
+ { 0x1205, 50519 },
+ { 0x1206, 50525 },
+ { 0x1207, 50930 },
+ { 0x1208, 50561 },
+ { 0x1209, 50573 },
+ { 0x120A, 50567 },
+ { 0x120B, 50993 },
+ { 0x120C, 50996 },
+ { 0x120D, 50564 },
+ { 0x120E, 50570 },
+ { 0x120F, 51002 },
+ { 0x1210, 50915 },
+ { 0x1211, 50927 },
+ { 0x1212, 50921 },
+ { 0x1213, 51443 },
+ { 0x1214, 51446 },
+ { 0x1215, 50918 },
+ { 0x1216, 50924 },
+ { 0x1217, 51449 },
+ { 0x1218, 50576 },
+ { 0x1219, 50588 },
+ { 0x121A, 50582 },
+ { 0x121B, 51005 },
+ { 0x121C, 51008 },
+ { 0x121D, 50579 },
+ { 0x121E, 50585 },
+ { 0x121F, 51014 },
+ { 0x1220, 51191 },
+ { 0x1221, 51203 },
+ { 0x1222, 51197 },
+ { 0x1223, 51554 },
+ { 0x1224, 51557 },
+ { 0x1225, 51194 },
+ { 0x1226, 51200 },
+ { 0x1227, 51560 },
+ { 0x1228, 50636 },
+ { 0x1229, 50648 },
+ { 0x122A, 50642 },
+ { 0x122B, 51134 },
+ { 0x122C, 51137 },
+ { 0x122D, 50639 },
+ { 0x122E, 50645 },
+ { 0x122F, 51143 },
+ { 0x1230, 50651 },
+ { 0x1231, 50663 },
+ { 0x1232, 50657 },
+ { 0x1233, 51149 },
+ { 0x1234, 51152 },
+ { 0x1235, 50654 },
+ { 0x1236, 50660 },
+ { 0x1237, 51188 },
+ { 0x1238, 51155 },
+ { 0x1239, 51167 },
+ { 0x123A, 51161 },
+ { 0x123B, 51536 },
+ { 0x123C, 51539 },
+ { 0x123D, 51158 },
+ { 0x123E, 51164 },
+ { 0x123F, 51545 },
+ { 0x1240, 50621 },
+ { 0x1241, 50633 },
+ { 0x1242, 50627 },
+ { 0x1243, 51086 },
+ { 0x1244, 51089 },
+ { 0x1245, 50624 },
+ { 0x1246, 50630 },
+ { 0x1247, 51107 },
+ { 0x1248, 51110 },
+ { 0x124A, 51116 },
+ { 0x124B, 51524 },
+ { 0x124C, 51527 },
+ { 0x124D, 51113 },
+ { 0x1250, 51092 },
+ { 0x1251, 51104 },
+ { 0x1252, 51098 },
+ { 0x1253, 51509 },
+ { 0x1254, 51512 },
+ { 0x1255, 51095 },
+ { 0x1256, 51101 },
+ { 0x1258, 51515 },
+ { 0x125A, 51521 },
+ { 0x125B, 51638 },
+ { 0x125C, 51641 },
+ { 0x125D, 51518 },
+ { 0x1260, 50441 },
+ { 0x1261, 50453 },
+ { 0x1262, 50447 },
+ { 0x1263, 50756 },
+ { 0x1264, 50759 },
+ { 0x1265, 50444 },
+ { 0x1266, 50450 },
+ { 0x1267, 50765 },
+ { 0x1268, 50681 },
+ { 0x1269, 50693 },
+ { 0x126A, 50687 },
+ { 0x126B, 51263 },
+ { 0x126C, 51266 },
+ { 0x126D, 50684 },
+ { 0x126E, 50690 },
+ { 0x126F, 51269 },
+ { 0x1270, 50666 },
+ { 0x1271, 50678 },
+ { 0x1272, 50672 },
+ { 0x1273, 51206 },
+ { 0x1274, 51209 },
+ { 0x1275, 50669 },
+ { 0x1276, 50675 },
+ { 0x1277, 51245 },
+ { 0x1278, 50456 },
+ { 0x1279, 50468 },
+ { 0x127A, 50462 },
+ { 0x127B, 50774 },
+ { 0x127C, 50792 },
+ { 0x127D, 50459 },
+ { 0x127E, 50465 },
+ { 0x127F, 50813 },
+ { 0x1280, 50711 },
+ { 0x1281, 50723 },
+ { 0x1282, 50717 },
+ { 0x1283, 51281 },
+ { 0x1284, 51284 },
+ { 0x1285, 50714 },
+ { 0x1286, 50720 },
+ { 0x1287, 51287 },
+ { 0x1288, 51290 },
+ { 0x128A, 51296 },
+ { 0x128B, 51593 },
+ { 0x128C, 51596 },
+ { 0x128D, 51293 },
+ { 0x1290, 50591 },
+ { 0x1291, 50603 },
+ { 0x1292, 50597 },
+ { 0x1293, 51026 },
+ { 0x1294, 51029 },
+ { 0x1295, 50594 },
+ { 0x1296, 50600 },
+ { 0x1297, 51035 },
+ { 0x1298, 51038 },
+ { 0x1299, 51050 },
+ { 0x129A, 51044 },
+ { 0x129B, 51482 },
+ { 0x129C, 51485 },
+ { 0x129D, 51041 },
+ { 0x129E, 51047 },
+ { 0x129F, 51491 },
+ { 0x12A0, 51644 },
+ { 0x12A1, 51660 },
+ { 0x12A2, 51652 },
+ { 0x12A3, 51664 },
+ { 0x12A4, 51668 },
+ { 0x12A5, 51648 },
+ { 0x12A6, 51656 },
+ { 0x12A7, 51676 },
+ { 0x12A8, 50546 },
+ { 0x12A9, 50558 },
+ { 0x12AA, 50552 },
+ { 0x12AB, 50945 },
+ { 0x12AC, 50948 },
+ { 0x12AD, 50549 },
+ { 0x12AE, 50555 },
+ { 0x12AF, 50951 },
+ { 0x12B0, 50954 },
+ { 0x12B2, 50960 },
+ { 0x12B3, 51452 },
+ { 0x12B4, 51455 },
+ { 0x12B5, 50957 },
+ { 0x12B8, 50963 },
+ { 0x12B9, 50975 },
+ { 0x12BA, 50969 },
+ { 0x12BB, 51458 },
+ { 0x12BC, 51461 },
+ { 0x12BD, 50966 },
+ { 0x12BE, 50972 },
+ { 0x12C0, 51464 },
+ { 0x12C2, 51470 },
+ { 0x12C3, 51632 },
+ { 0x12C4, 51635 },
+ { 0x12C5, 51467 },
+ { 0x12C8, 50696 },
+ { 0x12C9, 50708 },
+ { 0x12CA, 50702 },
+ { 0x12CB, 51272 },
+ { 0x12CC, 51275 },
+ { 0x12CD, 50699 },
+ { 0x12CE, 50705 },
+ { 0x12CF, 51278 },
+ { 0x12D0, 51696 },
+ { 0x12D1, 51712 },
+ { 0x12D2, 51704 },
+ { 0x12D3, 51716 },
+ { 0x12D4, 51720 },
+ { 0x12D5, 51700 },
+ { 0x12D6, 51708 },
+ { 0x12D8, 50741 },
+ { 0x12D9, 50753 },
+ { 0x12DA, 50747 },
+ { 0x12DB, 51323 },
+ { 0x12DC, 51326 },
+ { 0x12DD, 50744 },
+ { 0x12DE, 50750 },
+ { 0x12DF, 51347 },
+ { 0x12E0, 51329 },
+ { 0x12E1, 51341 },
+ { 0x12E2, 51335 },
+ { 0x12E3, 51605 },
+ { 0x12E4, 51608 },
+ { 0x12E5, 51332 },
+ { 0x12E6, 51338 },
+ { 0x12E7, 51611 },
+ { 0x12E8, 50726 },
+ { 0x12E9, 50738 },
+ { 0x12EA, 50732 },
+ { 0x12EB, 51314 },
+ { 0x12EC, 51317 },
+ { 0x12ED, 50729 },
+ { 0x12EE, 50735 },
+ { 0x12EF, 51320 },
+ { 0x12F0, 50471 },
+ { 0x12F1, 50483 },
+ { 0x12F2, 50477 },
+ { 0x12F3, 50816 },
+ { 0x12F4, 50834 },
+ { 0x12F5, 50474 },
+ { 0x12F6, 50480 },
+ { 0x12F7, 50840 },
+ { 0x12F8, 50819 },
+ { 0x12F9, 50831 },
+ { 0x12FA, 50825 },
+ { 0x12FB, 51401 },
+ { 0x12FC, 51404 },
+ { 0x12FD, 50822 },
+ { 0x12FE, 50828 },
+ { 0x12FF, 51410 },
+ { 0x1300, 50531 },
+ { 0x1301, 50543 },
+ { 0x1302, 50537 },
+ { 0x1303, 50933 },
+ { 0x1304, 50936 },
+ { 0x1305, 50534 },
+ { 0x1306, 50540 },
+ { 0x1307, 50942 },
+ { 0x1308, 50501 },
+ { 0x1309, 50513 },
+ { 0x130A, 50507 },
+ { 0x130B, 50861 },
+ { 0x130C, 50864 },
+ { 0x130D, 50504 },
+ { 0x130E, 50510 },
+ { 0x130F, 50882 },
+ { 0x1310, 50885 },
+ { 0x1312, 50891 },
+ { 0x1313, 51431 },
+ { 0x1314, 51434 },
+ { 0x1315, 50888 },
+ { 0x1318, 50867 },
+ { 0x1319, 50879 },
+ { 0x131A, 50873 },
+ { 0x131B, 51416 },
+ { 0x131C, 51419 },
+ { 0x131D, 50870 },
+ { 0x131E, 50876 },
+ { 0x131F, 51626 },
+ { 0x1320, 51212 },
+ { 0x1321, 51224 },
+ { 0x1322, 51218 },
+ { 0x1323, 51563 },
+ { 0x1324, 51566 },
+ { 0x1325, 51215 },
+ { 0x1326, 51221 },
+ { 0x1327, 51572 },
+ { 0x1328, 50795 },
+ { 0x1329, 50807 },
+ { 0x132A, 50801 },
+ { 0x132B, 51389 },
+ { 0x132C, 51392 },
+ { 0x132D, 50798 },
+ { 0x132E, 50804 },
+ { 0x132F, 51398 },
+ { 0x1330, 51059 },
+ { 0x1331, 51071 },
+ { 0x1332, 51065 },
+ { 0x1333, 51494 },
+ { 0x1334, 51497 },
+ { 0x1335, 51062 },
+ { 0x1336, 51068 },
+ { 0x1337, 51503 },
+ { 0x1338, 51230 },
+ { 0x1339, 51242 },
+ { 0x133A, 51236 },
+ { 0x133B, 51575 },
+ { 0x133C, 51578 },
+ { 0x133D, 51233 },
+ { 0x133E, 51239 },
+ { 0x133F, 51581 },
+ { 0x1340, 51248 },
+ { 0x1341, 51260 },
+ { 0x1342, 51254 },
+ { 0x1343, 51584 },
+ { 0x1344, 51587 },
+ { 0x1345, 51251 },
+ { 0x1346, 51257 },
+ { 0x1347, 51590 },
+ { 0x1348, 50486 },
+ { 0x1349, 50498 },
+ { 0x134A, 50492 },
+ { 0x134B, 50843 },
+ { 0x134C, 50846 },
+ { 0x134D, 50489 },
+ { 0x134E, 50495 },
+ { 0x134F, 50849 },
+ { 0x1350, 50606 },
+ { 0x1351, 50618 },
+ { 0x1352, 50612 },
+ { 0x1353, 51053 },
+ { 0x1354, 51056 },
+ { 0x1355, 50609 },
+ { 0x1356, 50615 },
+ { 0x1357, 51077 },
+ { 0x1358, 51146 },
+ { 0x1359, 51023 },
+ { 0x135A, 50858 },
+ { 0x135F, 51724 },
+ { 0x1360, 50435 },
+ { 0x1361, 51733 },
+ { 0x1362, 50323 },
+ { 0x1363, 50328 },
+ { 0x1364, 51731 },
+ { 0x1365, 50326 },
+ { 0x1366, 50432 },
+ { 0x1367, 50438 },
+ { 0x1368, 51728 },
+ { 0x1369, 50330 },
+ { 0x136A, 50336 },
+ { 0x136B, 50354 },
+ { 0x136C, 50342 },
+ { 0x136D, 50339 },
+ { 0x136E, 50333 },
+ { 0x136F, 50351 },
+ { 0x1370, 50348 },
+ { 0x1371, 50345 },
+ { 0x1372, 50398 },
+ { 0x1373, 50423 },
+ { 0x1374, 50420 },
+ { 0x1375, 50408 },
+ { 0x1376, 50405 },
+ { 0x1377, 50411 },
+ { 0x1378, 50429 },
+ { 0x1379, 50414 },
+ { 0x137A, 50417 },
+ { 0x137B, 50426 },
+ { 0x137C, 50401 },
+ { 0x1380, 51688 },
+ { 0x1381, 51020 },
+ { 0x1382, 51479 },
+ { 0x1383, 51017 },
+ { 0x1384, 51680 },
+ { 0x1385, 50771 },
+ { 0x1386, 51365 },
+ { 0x1387, 50768 },
+ { 0x1388, 51684 },
+ { 0x1389, 50855 },
+ { 0x138A, 51413 },
+ { 0x138B, 50852 },
+ { 0x138C, 51692 },
+ { 0x138D, 51083 },
+ { 0x138E, 51506 },
+ { 0x138F, 51080 },
+ { 0x1390, 50382 },
+ { 0x1391, 50361 },
+ { 0x1392, 50390 },
+ { 0x1393, 50377 },
+ { 0x1394, 50365 },
+ { 0x1395, 50373 },
+ { 0x1396, 50386 },
+ { 0x1397, 50369 },
+ { 0x1398, 50394 },
+ { 0x1399, 50357 },
+ { 0x13A0, 48143 },
+ { 0x13A1, 48146 },
+ { 0x13A2, 48149 },
+ { 0x13A3, 48152 },
+ { 0x13A4, 48158 },
+ { 0x13A5, 48161 },
+ { 0x13A6, 48182 },
+ { 0x13A7, 48218 },
+ { 0x13A8, 48185 },
+ { 0x13A9, 48188 },
+ { 0x13AA, 48191 },
+ { 0x13AB, 48194 },
+ { 0x13AC, 48197 },
+ { 0x13AD, 48200 },
+ { 0x13AE, 48203 },
+ { 0x13AF, 48206 },
+ { 0x13B0, 48209 },
+ { 0x13B1, 48212 },
+ { 0x13B2, 48215 },
+ { 0x13B3, 48221 },
+ { 0x13B4, 48224 },
+ { 0x13B5, 48227 },
+ { 0x13B6, 48230 },
+ { 0x13B7, 48233 },
+ { 0x13B8, 48236 },
+ { 0x13B9, 48239 },
+ { 0x13BA, 48242 },
+ { 0x13BB, 48245 },
+ { 0x13BC, 48248 },
+ { 0x13BD, 48251 },
+ { 0x13BE, 48254 },
+ { 0x13BF, 48338 },
+ { 0x13C0, 48341 },
+ { 0x13C1, 48257 },
+ { 0x13C2, 48260 },
+ { 0x13C3, 48263 },
+ { 0x13C4, 48266 },
+ { 0x13C5, 48269 },
+ { 0x13C6, 48344 },
+ { 0x13C7, 48347 },
+ { 0x13C8, 48350 },
+ { 0x13C9, 48353 },
+ { 0x13CA, 48356 },
+ { 0x13CB, 48359 },
+ { 0x13CC, 48272 },
+ { 0x13CD, 48155 },
+ { 0x13CE, 48275 },
+ { 0x13CF, 48278 },
+ { 0x13D0, 48281 },
+ { 0x13D1, 48284 },
+ { 0x13D2, 48287 },
+ { 0x13D3, 48164 },
+ { 0x13D4, 48290 },
+ { 0x13D5, 48167 },
+ { 0x13D6, 48293 },
+ { 0x13D7, 48170 },
+ { 0x13D8, 48296 },
+ { 0x13D9, 48173 },
+ { 0x13DA, 48176 },
+ { 0x13DB, 48179 },
+ { 0x13DC, 48335 },
+ { 0x13DD, 48362 },
+ { 0x13DE, 48365 },
+ { 0x13DF, 48368 },
+ { 0x13E0, 48371 },
+ { 0x13E1, 48374 },
+ { 0x13E2, 48377 },
+ { 0x13E3, 48380 },
+ { 0x13E4, 48383 },
+ { 0x13E5, 48386 },
+ { 0x13E6, 48389 },
+ { 0x13E7, 48392 },
+ { 0x13E8, 48395 },
+ { 0x13E9, 48299 },
+ { 0x13EA, 48302 },
+ { 0x13EB, 48305 },
+ { 0x13EC, 48308 },
+ { 0x13ED, 48311 },
+ { 0x13EE, 48314 },
+ { 0x13EF, 48317 },
+ { 0x13F0, 48320 },
+ { 0x13F1, 48323 },
+ { 0x13F2, 48326 },
+ { 0x13F3, 48329 },
+ { 0x13F4, 48332 },
+ { 0x1401, 45872 },
+ { 0x1402, 46118 },
+ { 0x1403, 45878 },
+ { 0x1404, 45953 },
+ { 0x1405, 45893 },
+ { 0x1406, 46025 },
+ { 0x1407, 46790 },
+ { 0x1408, 46858 },
+ { 0x1409, 46842 },
+ { 0x140A, 45866 },
+ { 0x140B, 45914 },
+ { 0x140C, 46097 },
+ { 0x140D, 47791 },
+ { 0x140E, 46100 },
+ { 0x140F, 47795 },
+ { 0x1410, 46392 },
+ { 0x1411, 47927 },
+ { 0x1412, 46103 },
+ { 0x1413, 47799 },
+ { 0x1414, 46395 },
+ { 0x1415, 47931 },
+ { 0x1416, 47555 },
+ { 0x1417, 46094 },
+ { 0x1418, 47787 },
+ { 0x1419, 46389 },
+ { 0x141A, 47923 },
+ { 0x141B, 47551 },
+ { 0x141C, 45917 },
+ { 0x141D, 46786 },
+ { 0x141E, 47539 },
+ { 0x141F, 46643 },
+ { 0x1420, 46647 },
+ { 0x1421, 46663 },
+ { 0x1422, 46624 },
+ { 0x1423, 46651 },
+ { 0x1424, 46639 },
+ { 0x1425, 46669 },
+ { 0x1426, 46674 },
+ { 0x1427, 46681 },
+ { 0x1428, 46657 },
+ { 0x1429, 46635 },
+ { 0x142A, 46630 },
+ { 0x142B, 45935 },
+ { 0x142C, 45956 },
+ { 0x142D, 46022 },
+ { 0x142E, 45920 },
+ { 0x142F, 46031 },
+ { 0x1430, 46513 },
+ { 0x1431, 46034 },
+ { 0x1432, 46257 },
+ { 0x1433, 46037 },
+ { 0x1434, 46260 },
+ { 0x1435, 46814 },
+ { 0x1436, 47186 },
+ { 0x1437, 46882 },
+ { 0x1438, 46028 },
+ { 0x1439, 46254 },
+ { 0x143A, 46266 },
+ { 0x143B, 47879 },
+ { 0x143C, 46269 },
+ { 0x143D, 47883 },
+ { 0x143E, 46519 },
+ { 0x143F, 48011 },
+ { 0x1440, 46272 },
+ { 0x1441, 47887 },
+ { 0x1442, 46522 },
+ { 0x1443, 48015 },
+ { 0x1444, 46263 },
+ { 0x1445, 47875 },
+ { 0x1446, 46516 },
+ { 0x1447, 48007 },
+ { 0x1448, 46830 },
+ { 0x1449, 45896 },
+ { 0x144A, 47747 },
+ { 0x144B, 46838 },
+ { 0x144C, 46082 },
+ { 0x144D, 46567 },
+ { 0x144E, 46088 },
+ { 0x144F, 46344 },
+ { 0x1450, 46091 },
+ { 0x1451, 46347 },
+ { 0x1452, 46822 },
+ { 0x1453, 47118 },
+ { 0x1454, 46854 },
+ { 0x1455, 46079 },
+ { 0x1456, 46329 },
+ { 0x1457, 46368 },
+ { 0x1458, 47911 },
+ { 0x1459, 46371 },
+ { 0x145A, 47915 },
+ { 0x145B, 46606 },
+ { 0x145C, 48055 },
+ { 0x145D, 46374 },
+ { 0x145E, 47919 },
+ { 0x145F, 46609 },
+ { 0x1460, 48059 },
+ { 0x1461, 46365 },
+ { 0x1462, 47907 },
+ { 0x1463, 46603 },
+ { 0x1464, 48051 },
+ { 0x1465, 47595 },
+ { 0x1466, 45908 },
+ { 0x1467, 46353 },
+ { 0x1468, 46359 },
+ { 0x1469, 46362 },
+ { 0x146A, 46350 },
+ { 0x146B, 45962 },
+ { 0x146C, 46441 },
+ { 0x146D, 45965 },
+ { 0x146E, 46158 },
+ { 0x146F, 45968 },
+ { 0x1470, 46161 },
+ { 0x1471, 46798 },
+ { 0x1472, 45959 },
+ { 0x1473, 46155 },
+ { 0x1474, 46167 },
+ { 0x1475, 47823 },
+ { 0x1476, 46170 },
+ { 0x1477, 47827 },
+ { 0x1478, 46447 },
+ { 0x1479, 47971 },
+ { 0x147A, 46173 },
+ { 0x147B, 47831 },
+ { 0x147C, 46450 },
+ { 0x147D, 47975 },
+ { 0x147E, 46164 },
+ { 0x147F, 47819 },
+ { 0x1480, 46444 },
+ { 0x1481, 47967 },
+ { 0x1482, 47563 },
+ { 0x1483, 45881 },
+ { 0x1484, 45971 },
+ { 0x1485, 48131 },
+ { 0x1486, 48135 },
+ { 0x1487, 48139 },
+ { 0x1488, 48127 },
+ { 0x1489, 45926 },
+ { 0x148A, 46419 },
+ { 0x148B, 45929 },
+ { 0x148C, 46128 },
+ { 0x148D, 45932 },
+ { 0x148E, 46131 },
+ { 0x148F, 46794 },
+ { 0x1490, 45923 },
+ { 0x1491, 46121 },
+ { 0x1492, 46137 },
+ { 0x1493, 47807 },
+ { 0x1494, 46140 },
+ { 0x1495, 47811 },
+ { 0x1496, 46425 },
+ { 0x1497, 47955 },
+ { 0x1498, 46143 },
+ { 0x1499, 47815 },
+ { 0x149A, 46428 },
+ { 0x149B, 47959 },
+ { 0x149C, 46134 },
+ { 0x149D, 47803 },
+ { 0x149E, 46422 },
+ { 0x149F, 47951 },
+ { 0x14A0, 47559 },
+ { 0x14A1, 45869 },
+ { 0x14A2, 46762 },
+ { 0x14A3, 45992 },
+ { 0x14A4, 46474 },
+ { 0x14A5, 45998 },
+ { 0x14A6, 46209 },
+ { 0x14A7, 46001 },
+ { 0x14A8, 46212 },
+ { 0x14A9, 46806 },
+ { 0x14AA, 45989 },
+ { 0x14AB, 46206 },
+ { 0x14AC, 46218 },
+ { 0x14AD, 47855 },
+ { 0x14AE, 46221 },
+ { 0x14AF, 47859 },
+ { 0x14B0, 46480 },
+ { 0x14B1, 47995 },
+ { 0x14B2, 46224 },
+ { 0x14B3, 47863 },
+ { 0x14B4, 46483 },
+ { 0x14B5, 47999 },
+ { 0x14B6, 46215 },
+ { 0x14B7, 47851 },
+ { 0x14B8, 46477 },
+ { 0x14B9, 47991 },
+ { 0x14BA, 47567 },
+ { 0x14BB, 45887 },
+ { 0x14BC, 47743 },
+ { 0x14BD, 45995 },
+ { 0x14BE, 48091 },
+ { 0x14BF, 46734 },
+ { 0x14C0, 46007 },
+ { 0x14C1, 46486 },
+ { 0x14C2, 46016 },
+ { 0x14C3, 46239 },
+ { 0x14C4, 46019 },
+ { 0x14C5, 46245 },
+ { 0x14C6, 46810 },
+ { 0x14C7, 46004 },
+ { 0x14C8, 46227 },
+ { 0x14C9, 46251 },
+ { 0x14CA, 47871 },
+ { 0x14CB, 46248 },
+ { 0x14CC, 47867 },
+ { 0x14CD, 46510 },
+ { 0x14CE, 48003 },
+ { 0x14CF, 47571 },
+ { 0x14D0, 45890 },
+ { 0x14D1, 46958 },
+ { 0x14D2, 46013 },
+ { 0x14D3, 45977 },
+ { 0x14D4, 46453 },
+ { 0x14D5, 45983 },
+ { 0x14D6, 46188 },
+ { 0x14D7, 45986 },
+ { 0x14D8, 46191 },
+ { 0x14D9, 46802 },
+ { 0x14DA, 45974 },
+ { 0x14DB, 46176 },
+ { 0x14DC, 46197 },
+ { 0x14DD, 47839 },
+ { 0x14DE, 46200 },
+ { 0x14DF, 47843 },
+ { 0x14E0, 46468 },
+ { 0x14E1, 47983 },
+ { 0x14E2, 46203 },
+ { 0x14E3, 47847 },
+ { 0x14E4, 46471 },
+ { 0x14E5, 47987 },
+ { 0x14E6, 46194 },
+ { 0x14E7, 47835 },
+ { 0x14E8, 46465 },
+ { 0x14E9, 47979 },
+ { 0x14EA, 45884 },
+ { 0x14EB, 47739 },
+ { 0x14EC, 46710 },
+ { 0x14ED, 46064 },
+ { 0x14EE, 46534 },
+ { 0x14EF, 46070 },
+ { 0x14F0, 46311 },
+ { 0x14F1, 46073 },
+ { 0x14F2, 46314 },
+ { 0x14F3, 46818 },
+ { 0x14F4, 46061 },
+ { 0x14F5, 46296 },
+ { 0x14F6, 46320 },
+ { 0x14F7, 47895 },
+ { 0x14F8, 46323 },
+ { 0x14F9, 47899 },
+ { 0x14FA, 46561 },
+ { 0x14FB, 48043 },
+ { 0x14FC, 46326 },
+ { 0x14FD, 47903 },
+ { 0x14FE, 46564 },
+ { 0x14FF, 48047 },
+ { 0x1500, 46317 },
+ { 0x1501, 47891 },
+ { 0x1502, 46558 },
+ { 0x1503, 48039 },
+ { 0x1504, 47591 },
+ { 0x1505, 45905 },
+ { 0x1506, 48095 },
+ { 0x1507, 46076 },
+ { 0x1508, 47687 },
+ { 0x1509, 48103 },
+ { 0x150A, 47547 },
+ { 0x150B, 47543 },
+ { 0x150C, 47583 },
+ { 0x150D, 47587 },
+ { 0x150E, 47579 },
+ { 0x150F, 47575 },
+ { 0x1510, 46302 },
+ { 0x1511, 46305 },
+ { 0x1512, 46540 },
+ { 0x1513, 46308 },
+ { 0x1514, 46543 },
+ { 0x1515, 46299 },
+ { 0x1516, 46537 },
+ { 0x1517, 46549 },
+ { 0x1518, 48027 },
+ { 0x1519, 46552 },
+ { 0x151A, 48031 },
+ { 0x151B, 46701 },
+ { 0x151C, 48079 },
+ { 0x151D, 46555 },
+ { 0x151E, 48035 },
+ { 0x151F, 46704 },
+ { 0x1520, 48083 },
+ { 0x1521, 46546 },
+ { 0x1522, 48023 },
+ { 0x1523, 46698 },
+ { 0x1524, 48075 },
+ { 0x1525, 46067 },
+ { 0x1526, 46109 },
+ { 0x1527, 46612 },
+ { 0x1528, 46112 },
+ { 0x1529, 46401 },
+ { 0x152A, 46115 },
+ { 0x152B, 46404 },
+ { 0x152C, 46826 },
+ { 0x152D, 46106 },
+ { 0x152E, 46398 },
+ { 0x152F, 46410 },
+ { 0x1530, 47939 },
+ { 0x1531, 46413 },
+ { 0x1532, 47943 },
+ { 0x1533, 46618 },
+ { 0x1534, 48067 },
+ { 0x1535, 46416 },
+ { 0x1536, 47947 },
+ { 0x1537, 46621 },
+ { 0x1538, 48071 },
+ { 0x1539, 46407 },
+ { 0x153A, 47935 },
+ { 0x153B, 46615 },
+ { 0x153C, 48063 },
+ { 0x153D, 47599 },
+ { 0x153E, 45911 },
+ { 0x153F, 48099 },
+ { 0x1540, 47755 },
+ { 0x1541, 46766 },
+ { 0x1542, 46052 },
+ { 0x1543, 46730 },
+ { 0x1544, 47763 },
+ { 0x1545, 46528 },
+ { 0x1546, 46055 },
+ { 0x1547, 46290 },
+ { 0x1548, 46058 },
+ { 0x1549, 46293 },
+ { 0x154A, 47767 },
+ { 0x154B, 46049 },
+ { 0x154C, 46287 },
+ { 0x154D, 47759 },
+ { 0x154E, 46531 },
+ { 0x154F, 48019 },
+ { 0x1550, 45902 },
+ { 0x1551, 47751 },
+ { 0x1552, 46714 },
+ { 0x1553, 45941 },
+ { 0x1554, 46431 },
+ { 0x1555, 45944 },
+ { 0x1556, 46149 },
+ { 0x1557, 45947 },
+ { 0x1558, 46152 },
+ { 0x1559, 45938 },
+ { 0x155A, 46146 },
+ { 0x155B, 46438 },
+ { 0x155C, 47963 },
+ { 0x155D, 45875 },
+ { 0x155E, 46335 },
+ { 0x155F, 46718 },
+ { 0x1560, 46338 },
+ { 0x1561, 46722 },
+ { 0x1562, 46573 },
+ { 0x1563, 46726 },
+ { 0x1564, 46341 },
+ { 0x1565, 46576 },
+ { 0x1566, 46332 },
+ { 0x1567, 46570 },
+ { 0x1568, 46707 },
+ { 0x1569, 48087 },
+ { 0x156A, 46085 },
+ { 0x156B, 46594 },
+ { 0x156C, 46597 },
+ { 0x156D, 46600 },
+ { 0x156E, 46591 },
+ { 0x156F, 46356 },
+ { 0x1570, 46380 },
+ { 0x1571, 46383 },
+ { 0x1572, 46386 },
+ { 0x1573, 46377 },
+ { 0x1574, 47611 },
+ { 0x1575, 47615 },
+ { 0x1576, 47627 },
+ { 0x1577, 47619 },
+ { 0x1578, 47631 },
+ { 0x1579, 47607 },
+ { 0x157A, 47623 },
+ { 0x157B, 47603 },
+ { 0x157C, 47635 },
+ { 0x157D, 45950 },
+ { 0x157E, 46525 },
+ { 0x157F, 46043 },
+ { 0x1580, 46281 },
+ { 0x1581, 46046 },
+ { 0x1582, 46284 },
+ { 0x1583, 46040 },
+ { 0x1584, 46275 },
+ { 0x1585, 45899 },
+ { 0x1586, 46582 },
+ { 0x1587, 46585 },
+ { 0x1588, 46588 },
+ { 0x1589, 46579 },
+ { 0x158A, 47775 },
+ { 0x158B, 47779 },
+ { 0x158C, 47783 },
+ { 0x158D, 47771 },
+ { 0x158E, 46686 },
+ { 0x158F, 46233 },
+ { 0x1590, 46495 },
+ { 0x1591, 46236 },
+ { 0x1592, 46498 },
+ { 0x1593, 46230 },
+ { 0x1594, 46489 },
+ { 0x1595, 46010 },
+ { 0x1596, 46242 },
+ { 0x1597, 46774 },
+ { 0x1598, 46778 },
+ { 0x1599, 46782 },
+ { 0x159A, 46770 },
+ { 0x159B, 48115 },
+ { 0x159C, 48119 },
+ { 0x159D, 48123 },
+ { 0x159E, 48111 },
+ { 0x159F, 48107 },
+ { 0x15A0, 46182 },
+ { 0x15A1, 46459 },
+ { 0x15A2, 46185 },
+ { 0x15A3, 46462 },
+ { 0x15A4, 46179 },
+ { 0x15A5, 46456 },
+ { 0x15A6, 45980 },
+ { 0x15A7, 47647 },
+ { 0x15A8, 47651 },
+ { 0x15A9, 47663 },
+ { 0x15AA, 47655 },
+ { 0x15AB, 47667 },
+ { 0x15AC, 47643 },
+ { 0x15AD, 47659 },
+ { 0x15AE, 47639 },
+ { 0x15AF, 46834 },
+ { 0x15B0, 47675 },
+ { 0x15B1, 47679 },
+ { 0x15B2, 47683 },
+ { 0x15B3, 47671 },
+ { 0x15B4, 47727 },
+ { 0x15B5, 47731 },
+ { 0x15B6, 47735 },
+ { 0x15B7, 47723 },
+ { 0x15B8, 47711 },
+ { 0x15B9, 47715 },
+ { 0x15BA, 47719 },
+ { 0x15BB, 47707 },
+ { 0x15BC, 47695 },
+ { 0x15BD, 47699 },
+ { 0x15BE, 47703 },
+ { 0x15BF, 47691 },
+ { 0x15C0, 46742 },
+ { 0x15C1, 46746 },
+ { 0x15C2, 46750 },
+ { 0x15C3, 46738 },
+ { 0x15C4, 47182 },
+ { 0x15C5, 47178 },
+ { 0x15C6, 47170 },
+ { 0x15C7, 47442 },
+ { 0x15C8, 47174 },
+ { 0x15C9, 47166 },
+ { 0x15CA, 47010 },
+ { 0x15CB, 47006 },
+ { 0x15CC, 46998 },
+ { 0x15CD, 47310 },
+ { 0x15CE, 47002 },
+ { 0x15CF, 46994 },
+ { 0x15D0, 47054 },
+ { 0x15D1, 47050 },
+ { 0x15D2, 47042 },
+ { 0x15D3, 47418 },
+ { 0x15D4, 47046 },
+ { 0x15D5, 47038 },
+ { 0x15D6, 47206 },
+ { 0x15D7, 47202 },
+ { 0x15D8, 47194 },
+ { 0x15D9, 47446 },
+ { 0x15DA, 47198 },
+ { 0x15DB, 47190 },
+ { 0x15DC, 47354 },
+ { 0x15DD, 47350 },
+ { 0x15DE, 47342 },
+ { 0x15DF, 47470 },
+ { 0x15E0, 47346 },
+ { 0x15E1, 47338 },
+ { 0x15E2, 47414 },
+ { 0x15E3, 47410 },
+ { 0x15E4, 47402 },
+ { 0x15E5, 47502 },
+ { 0x15E6, 47406 },
+ { 0x15E7, 47398 },
+ { 0x15E8, 46990 },
+ { 0x15E9, 46986 },
+ { 0x15EA, 46978 },
+ { 0x15EB, 47306 },
+ { 0x15EC, 46982 },
+ { 0x15ED, 46974 },
+ { 0x15EE, 46846 },
+ { 0x15EF, 46878 },
+ { 0x15F0, 46874 },
+ { 0x15F1, 46866 },
+ { 0x15F2, 47162 },
+ { 0x15F3, 46870 },
+ { 0x15F4, 46862 },
+ { 0x15F5, 47250 },
+ { 0x15F6, 47246 },
+ { 0x15F7, 47238 },
+ { 0x15F8, 47454 },
+ { 0x15F9, 47242 },
+ { 0x15FA, 47234 },
+ { 0x15FB, 47270 },
+ { 0x15FC, 47266 },
+ { 0x15FD, 47258 },
+ { 0x15FE, 47458 },
+ { 0x15FF, 47262 },
+ { 0x1600, 47254 },
+ { 0x1601, 46906 },
+ { 0x1602, 46970 },
+ { 0x1603, 46966 },
+ { 0x1604, 46954 },
+ { 0x1605, 47302 },
+ { 0x1606, 46962 },
+ { 0x1607, 46950 },
+ { 0x1608, 46946 },
+ { 0x1609, 46942 },
+ { 0x160A, 46934 },
+ { 0x160B, 47298 },
+ { 0x160C, 46938 },
+ { 0x160D, 46930 },
+ { 0x160E, 47074 },
+ { 0x160F, 47070 },
+ { 0x1610, 47062 },
+ { 0x1611, 47422 },
+ { 0x1612, 47066 },
+ { 0x1613, 47058 },
+ { 0x1614, 46902 },
+ { 0x1615, 46758 },
+ { 0x1616, 46898 },
+ { 0x1617, 46890 },
+ { 0x1618, 47210 },
+ { 0x1619, 46894 },
+ { 0x161A, 46754 },
+ { 0x161B, 46886 },
+ { 0x161C, 47230 },
+ { 0x161D, 47226 },
+ { 0x161E, 47218 },
+ { 0x161F, 47450 },
+ { 0x1620, 47222 },
+ { 0x1621, 47214 },
+ { 0x1622, 46926 },
+ { 0x1623, 46922 },
+ { 0x1624, 46914 },
+ { 0x1625, 47274 },
+ { 0x1626, 46918 },
+ { 0x1627, 46910 },
+ { 0x1628, 47138 },
+ { 0x1629, 47134 },
+ { 0x162A, 47126 },
+ { 0x162B, 47434 },
+ { 0x162C, 47130 },
+ { 0x162D, 47122 },
+ { 0x162E, 47294 },
+ { 0x162F, 47290 },
+ { 0x1630, 47282 },
+ { 0x1631, 47462 },
+ { 0x1632, 47286 },
+ { 0x1633, 47278 },
+ { 0x1634, 47494 },
+ { 0x1635, 47490 },
+ { 0x1636, 47482 },
+ { 0x1637, 47526 },
+ { 0x1638, 47486 },
+ { 0x1639, 47478 },
+ { 0x163A, 47374 },
+ { 0x163B, 47370 },
+ { 0x163C, 47362 },
+ { 0x163D, 47474 },
+ { 0x163E, 47366 },
+ { 0x163F, 47358 },
+ { 0x1640, 47094 },
+ { 0x1641, 47090 },
+ { 0x1642, 47082 },
+ { 0x1643, 47426 },
+ { 0x1644, 47086 },
+ { 0x1645, 47078 },
+ { 0x1646, 46850 },
+ { 0x1647, 47534 },
+ { 0x1648, 47158 },
+ { 0x1649, 47154 },
+ { 0x164A, 47146 },
+ { 0x164B, 47438 },
+ { 0x164C, 47150 },
+ { 0x164D, 47142 },
+ { 0x164E, 47034 },
+ { 0x164F, 47030 },
+ { 0x1650, 47018 },
+ { 0x1651, 47314 },
+ { 0x1652, 47026 },
+ { 0x1653, 47014 },
+ { 0x1654, 47334 },
+ { 0x1655, 47330 },
+ { 0x1656, 47322 },
+ { 0x1657, 47466 },
+ { 0x1658, 47326 },
+ { 0x1659, 47318 },
+ { 0x165A, 47022 },
+ { 0x165B, 47394 },
+ { 0x165C, 47390 },
+ { 0x165D, 47382 },
+ { 0x165E, 47498 },
+ { 0x165F, 47386 },
+ { 0x1660, 47378 },
+ { 0x1661, 47114 },
+ { 0x1662, 47110 },
+ { 0x1663, 47102 },
+ { 0x1664, 47430 },
+ { 0x1665, 47106 },
+ { 0x1666, 47098 },
+ { 0x1667, 47522 },
+ { 0x1668, 47518 },
+ { 0x1669, 47510 },
+ { 0x166A, 47530 },
+ { 0x166B, 47514 },
+ { 0x166C, 47506 },
+ { 0x166D, 46124 },
+ { 0x166E, 46434 },
+ { 0x166F, 46278 },
+ { 0x1670, 46492 },
+ { 0x1671, 46504 },
+ { 0x1672, 46692 },
+ { 0x1673, 46507 },
+ { 0x1674, 46695 },
+ { 0x1675, 46501 },
+ { 0x1676, 46689 },
+ { 0x1680, 21369 },
+ { 0x1681, 21414 },
+ { 0x1682, 21396 },
+ { 0x1683, 21420 },
+ { 0x1684, 21408 },
+ { 0x1685, 21402 },
+ { 0x1686, 21411 },
+ { 0x1687, 21387 },
+ { 0x1688, 21426 },
+ { 0x1689, 21384 },
+ { 0x168A, 21417 },
+ { 0x168B, 21399 },
+ { 0x168C, 21390 },
+ { 0x168D, 21441 },
+ { 0x168E, 21429 },
+ { 0x168F, 21405 },
+ { 0x1690, 21381 },
+ { 0x1691, 21378 },
+ { 0x1692, 21375 },
+ { 0x1693, 21435 },
+ { 0x1694, 21438 },
+ { 0x1695, 21432 },
+ { 0x1696, 21372 },
+ { 0x1697, 21444 },
+ { 0x1698, 21393 },
+ { 0x1699, 21447 },
+ { 0x169A, 21423 },
+ { 0x169B, 21450 },
+ { 0x169C, 21453 },
+ { 0x16A0, 22222 },
+ { 0x16A1, 22160 },
+ { 0x16A2, 22250 },
+ { 0x16A3, 22189 },
+ { 0x16A4, 22169 },
+ { 0x16A5, 22163 },
+ { 0x16A6, 22368 },
+ { 0x16A7, 22201 },
+ { 0x16A8, 22259 },
+ { 0x16A9, 22185 },
+ { 0x16AA, 22175 },
+ { 0x16AB, 22216 },
+ { 0x16AC, 22402 },
+ { 0x16AD, 22390 },
+ { 0x16AE, 22154 },
+ { 0x16AF, 22179 },
+ { 0x16B0, 22182 },
+ { 0x16B1, 22287 },
+ { 0x16B2, 22284 },
+ { 0x16B3, 22192 },
+ { 0x16B4, 22243 },
+ { 0x16B5, 22151 },
+ { 0x16B6, 22198 },
+ { 0x16B7, 22228 },
+ { 0x16B8, 22204 },
+ { 0x16B9, 22304 },
+ { 0x16BA, 22309 },
+ { 0x16BB, 22276 },
+ { 0x16BC, 22422 },
+ { 0x16BD, 22418 },
+ { 0x16BE, 22327 },
+ { 0x16BF, 22410 },
+ { 0x16C0, 22362 },
+ { 0x16C1, 22233 },
+ { 0x16C2, 22148 },
+ { 0x16C3, 22280 },
+ { 0x16C4, 22207 },
+ { 0x16C5, 22383 },
+ { 0x16C6, 22376 },
+ { 0x16C7, 22239 },
+ { 0x16C8, 22336 },
+ { 0x16C9, 22255 },
+ { 0x16CA, 22341 },
+ { 0x16CB, 22293 },
+ { 0x16CC, 22394 },
+ { 0x16CD, 22142 },
+ { 0x16CE, 22172 },
+ { 0x16CF, 22298 },
+ { 0x16D0, 22398 },
+ { 0x16D1, 22145 },
+ { 0x16D2, 22353 },
+ { 0x16D3, 22426 },
+ { 0x16D4, 22365 },
+ { 0x16D5, 22333 },
+ { 0x16D6, 22271 },
+ { 0x16D7, 22322 },
+ { 0x16D8, 22414 },
+ { 0x16D9, 22406 },
+ { 0x16DA, 22316 },
+ { 0x16DB, 22359 },
+ { 0x16DC, 22313 },
+ { 0x16DD, 22210 },
+ { 0x16DE, 22266 },
+ { 0x16DF, 22348 },
+ { 0x16E0, 22195 },
+ { 0x16E1, 22213 },
+ { 0x16E2, 22345 },
+ { 0x16E3, 22219 },
+ { 0x16E4, 22263 },
+ { 0x16E5, 22247 },
+ { 0x16E6, 22387 },
+ { 0x16E7, 22380 },
+ { 0x16E8, 22373 },
+ { 0x16E9, 22157 },
+ { 0x16EA, 22166 },
+ { 0x16EB, 22430 },
+ { 0x16EC, 22436 },
+ { 0x16ED, 22136 },
+ { 0x16EE, 22139 },
+ { 0x16EF, 22439 },
+ { 0x16F0, 22433 },
+ { 0x1700, 43594 },
+ { 0x1701, 43597 },
+ { 0x1702, 43600 },
+ { 0x1703, 43615 },
+ { 0x1704, 43609 },
+ { 0x1705, 43642 },
+ { 0x1706, 43633 },
+ { 0x1707, 43606 },
+ { 0x1708, 43624 },
+ { 0x1709, 43627 },
+ { 0x170A, 43603 },
+ { 0x170B, 43621 },
+ { 0x170C, 43639 },
+ { 0x170E, 43618 },
+ { 0x170F, 43636 },
+ { 0x1710, 43630 },
+ { 0x1711, 43612 },
+ { 0x1712, 43586 },
+ { 0x1713, 43590 },
+ { 0x1714, 43583 },
+ { 0x1720, 40573 },
+ { 0x1721, 40576 },
+ { 0x1722, 40579 },
+ { 0x1723, 40594 },
+ { 0x1724, 40588 },
+ { 0x1725, 40624 },
+ { 0x1726, 40615 },
+ { 0x1727, 40585 },
+ { 0x1728, 40603 },
+ { 0x1729, 40606 },
+ { 0x172A, 40582 },
+ { 0x172B, 40600 },
+ { 0x172C, 40621 },
+ { 0x172D, 40609 },
+ { 0x172E, 40597 },
+ { 0x172F, 40618 },
+ { 0x1730, 40612 },
+ { 0x1731, 40591 },
+ { 0x1732, 40565 },
+ { 0x1733, 40569 },
+ { 0x1734, 40562 },
+ { 0x1735, 67884 },
+ { 0x1736, 67881 },
+ { 0x1740, 10387 },
+ { 0x1741, 10390 },
+ { 0x1742, 10393 },
+ { 0x1743, 10408 },
+ { 0x1744, 10402 },
+ { 0x1745, 10438 },
+ { 0x1746, 10429 },
+ { 0x1747, 10399 },
+ { 0x1748, 10417 },
+ { 0x1749, 10420 },
+ { 0x174A, 10396 },
+ { 0x174B, 10414 },
+ { 0x174C, 10435 },
+ { 0x174D, 10423 },
+ { 0x174E, 10411 },
+ { 0x174F, 10432 },
+ { 0x1750, 10426 },
+ { 0x1751, 10405 },
+ { 0x1752, 10379 },
+ { 0x1753, 10383 },
+ { 0x1760, 55665 },
+ { 0x1761, 55668 },
+ { 0x1762, 55671 },
+ { 0x1763, 55683 },
+ { 0x1764, 55680 },
+ { 0x1765, 55710 },
+ { 0x1766, 55701 },
+ { 0x1767, 55677 },
+ { 0x1768, 55692 },
+ { 0x1769, 55695 },
+ { 0x176A, 55674 },
+ { 0x176B, 55689 },
+ { 0x176C, 55707 },
+ { 0x176E, 55686 },
+ { 0x176F, 55704 },
+ { 0x1770, 55698 },
+ { 0x1772, 55657 },
+ { 0x1773, 55661 },
+ { 0x1780, 14115 },
+ { 0x1781, 14163 },
+ { 0x1782, 14118 },
+ { 0x1783, 14166 },
+ { 0x1784, 14169 },
+ { 0x1785, 14100 },
+ { 0x1786, 14157 },
+ { 0x1787, 14103 },
+ { 0x1788, 14160 },
+ { 0x1789, 14175 },
+ { 0x178A, 14106 },
+ { 0x178B, 14196 },
+ { 0x178C, 14109 },
+ { 0x178D, 14199 },
+ { 0x178E, 14172 },
+ { 0x178F, 14145 },
+ { 0x1790, 14190 },
+ { 0x1791, 14148 },
+ { 0x1792, 14193 },
+ { 0x1793, 14130 },
+ { 0x1794, 14097 },
+ { 0x1795, 14178 },
+ { 0x1796, 14133 },
+ { 0x1797, 14181 },
+ { 0x1798, 14127 },
+ { 0x1799, 14154 },
+ { 0x179A, 14139 },
+ { 0x179B, 14124 },
+ { 0x179C, 14151 },
+ { 0x179D, 14184 },
+ { 0x179E, 14187 },
+ { 0x179F, 14142 },
+ { 0x17A0, 14112 },
+ { 0x17A1, 14121 },
+ { 0x17A2, 14136 },
+ { 0x17A3, 14414 },
+ { 0x17A4, 14406 },
+ { 0x17A5, 14390 },
+ { 0x17A6, 14422 },
+ { 0x17A7, 14394 },
+ { 0x17A8, 14438 },
+ { 0x17A9, 14442 },
+ { 0x17AA, 14450 },
+ { 0x17AB, 14398 },
+ { 0x17AC, 14446 },
+ { 0x17AD, 14382 },
+ { 0x17AE, 14402 },
+ { 0x17AF, 14386 },
+ { 0x17B0, 14410 },
+ { 0x17B1, 14426 },
+ { 0x17B2, 14432 },
+ { 0x17B3, 14418 },
+ { 0x17B4, 14093 },
+ { 0x17B5, 14089 },
+ { 0x17B6, 14041 },
+ { 0x17B7, 14029 },
+ { 0x17B8, 14061 },
+ { 0x17B9, 14037 },
+ { 0x17BA, 14085 },
+ { 0x17BB, 14033 },
+ { 0x17BC, 14077 },
+ { 0x17BD, 14073 },
+ { 0x17BE, 14065 },
+ { 0x17BF, 14081 },
+ { 0x17C0, 14057 },
+ { 0x17C1, 14025 },
+ { 0x17C2, 14045 },
+ { 0x17C3, 14049 },
+ { 0x17C4, 14069 },
+ { 0x17C5, 14053 },
+ { 0x17C6, 13965 },
+ { 0x17C7, 13968 },
+ { 0x17C8, 13992 },
+ { 0x17C9, 13983 },
+ { 0x17CA, 13971 },
+ { 0x17CB, 13937 },
+ { 0x17CC, 13934 },
+ { 0x17CD, 13986 },
+ { 0x17CE, 13959 },
+ { 0x17CF, 13928 },
+ { 0x17D0, 13952 },
+ { 0x17D1, 13956 },
+ { 0x17D2, 13931 },
+ { 0x17D3, 13980 },
+ { 0x17D4, 13925 },
+ { 0x17D5, 13977 },
+ { 0x17D6, 13943 },
+ { 0x17D7, 13921 },
+ { 0x17D8, 13940 },
+ { 0x17D9, 13948 },
+ { 0x17DA, 13962 },
+ { 0x17DB, 14378 },
+ { 0x17DC, 13989 },
+ { 0x17DD, 13974 },
+ { 0x17E0, 14013 },
+ { 0x17E1, 13995 },
+ { 0x17E2, 14001 },
+ { 0x17E3, 14022 },
+ { 0x17E4, 14007 },
+ { 0x17E5, 14004 },
+ { 0x17E6, 13998 },
+ { 0x17E7, 14019 },
+ { 0x17E8, 14016 },
+ { 0x17E9, 14010 },
+ { 0x17F0, 14228 },
+ { 0x17F1, 14238 },
+ { 0x17F2, 14223 },
+ { 0x17F3, 14218 },
+ { 0x17F4, 14233 },
+ { 0x17F5, 14243 },
+ { 0x17F6, 14263 },
+ { 0x17F7, 14253 },
+ { 0x17F8, 14248 },
+ { 0x17F9, 14258 },
+ { 0x1800, 65145 },
+ { 0x1801, 65749 },
+ { 0x1802, 65149 },
+ { 0x1803, 65133 },
+ { 0x1804, 65147 },
+ { 0x1805, 65115 },
+ { 0x1806, 65141 },
+ { 0x1807, 65136 },
+ { 0x1808, 65744 },
+ { 0x1809, 65740 },
+ { 0x180A, 65747 },
+ { 0x180B, 65118 },
+ { 0x180C, 65123 },
+ { 0x180D, 65128 },
+ { 0x180E, 65181 },
+ { 0x1810, 65169 },
+ { 0x1811, 65151 },
+ { 0x1812, 65157 },
+ { 0x1813, 65178 },
+ { 0x1814, 65163 },
+ { 0x1815, 65160 },
+ { 0x1816, 65154 },
+ { 0x1817, 65175 },
+ { 0x1818, 65172 },
+ { 0x1819, 65166 },
+ { 0x1820, 65184 },
+ { 0x1821, 65187 },
+ { 0x1822, 65190 },
+ { 0x1823, 65193 },
+ { 0x1824, 65196 },
+ { 0x1825, 65229 },
+ { 0x1826, 65247 },
+ { 0x1827, 65205 },
+ { 0x1828, 65226 },
+ { 0x1829, 65400 },
+ { 0x182A, 65199 },
+ { 0x182B, 65232 },
+ { 0x182C, 65235 },
+ { 0x182D, 65211 },
+ { 0x182E, 65223 },
+ { 0x182F, 65220 },
+ { 0x1830, 65241 },
+ { 0x1831, 65418 },
+ { 0x1832, 65244 },
+ { 0x1833, 65202 },
+ { 0x1834, 65403 },
+ { 0x1835, 65214 },
+ { 0x1836, 65253 },
+ { 0x1837, 65238 },
+ { 0x1838, 65250 },
+ { 0x1839, 65208 },
+ { 0x183A, 65217 },
+ { 0x183B, 65412 },
+ { 0x183C, 65421 },
+ { 0x183D, 65256 },
+ { 0x183E, 65409 },
+ { 0x183F, 65427 },
+ { 0x1840, 65415 },
+ { 0x1841, 65424 },
+ { 0x1842, 65406 },
+ { 0x1843, 65630 },
+ { 0x1844, 65518 },
+ { 0x1845, 65522 },
+ { 0x1846, 65526 },
+ { 0x1847, 65530 },
+ { 0x1848, 65558 },
+ { 0x1849, 65574 },
+ { 0x184A, 65598 },
+ { 0x184B, 65534 },
+ { 0x184C, 65562 },
+ { 0x184D, 65566 },
+ { 0x184E, 65542 },
+ { 0x184F, 65554 },
+ { 0x1850, 65570 },
+ { 0x1851, 65538 },
+ { 0x1852, 65602 },
+ { 0x1853, 65546 },
+ { 0x1854, 65626 },
+ { 0x1855, 65582 },
+ { 0x1856, 65578 },
+ { 0x1857, 65550 },
+ { 0x1858, 65610 },
+ { 0x1859, 65614 },
+ { 0x185A, 65618 },
+ { 0x185B, 65622 },
+ { 0x185C, 65606 },
+ { 0x185D, 65430 },
+ { 0x185E, 65434 },
+ { 0x185F, 65458 },
+ { 0x1860, 65478 },
+ { 0x1861, 65438 },
+ { 0x1862, 65486 },
+ { 0x1863, 65466 },
+ { 0x1864, 65450 },
+ { 0x1865, 65454 },
+ { 0x1866, 65470 },
+ { 0x1867, 65506 },
+ { 0x1868, 65474 },
+ { 0x1869, 65442 },
+ { 0x186A, 65462 },
+ { 0x186B, 65446 },
+ { 0x186C, 65494 },
+ { 0x186D, 65498 },
+ { 0x186E, 65510 },
+ { 0x186F, 65482 },
+ { 0x1870, 65502 },
+ { 0x1871, 65490 },
+ { 0x1872, 65514 },
+ { 0x1873, 65636 },
+ { 0x1874, 65644 },
+ { 0x1875, 65648 },
+ { 0x1876, 65640 },
+ { 0x1877, 65736 },
+ { 0x1880, 65388 },
+ { 0x1881, 65382 },
+ { 0x1882, 65367 },
+ { 0x1883, 65377 },
+ { 0x1884, 65394 },
+ { 0x1885, 65362 },
+ { 0x1886, 65356 },
+ { 0x1887, 65259 },
+ { 0x1888, 65264 },
+ { 0x1889, 65284 },
+ { 0x188A, 65309 },
+ { 0x188B, 65274 },
+ { 0x188C, 65329 },
+ { 0x188D, 65351 },
+ { 0x188E, 65304 },
+ { 0x188F, 65314 },
+ { 0x1890, 65294 },
+ { 0x1891, 65279 },
+ { 0x1892, 65289 },
+ { 0x1893, 65319 },
+ { 0x1894, 65324 },
+ { 0x1895, 65334 },
+ { 0x1896, 65299 },
+ { 0x1897, 65269 },
+ { 0x1898, 65586 },
+ { 0x1899, 65592 },
+ { 0x189A, 65688 },
+ { 0x189B, 65706 },
+ { 0x189C, 65652 },
+ { 0x189D, 65694 },
+ { 0x189E, 65718 },
+ { 0x189F, 65730 },
+ { 0x18A0, 65658 },
+ { 0x18A1, 65682 },
+ { 0x18A2, 65712 },
+ { 0x18A3, 65676 },
+ { 0x18A4, 65724 },
+ { 0x18A5, 65664 },
+ { 0x18A6, 65339 },
+ { 0x18A7, 65345 },
+ { 0x18A8, 65670 },
+ { 0x18A9, 65372 },
+ { 0x18AA, 65700 },
+ { 0x1900, 21091 },
+ { 0x1901, 21007 },
+ { 0x1902, 21052 },
+ { 0x1903, 20998 },
+ { 0x1904, 21046 },
+ { 0x1905, 21055 },
+ { 0x1906, 20992 },
+ { 0x1907, 21040 },
+ { 0x1908, 21004 },
+ { 0x1909, 21049 },
+ { 0x190A, 21070 },
+ { 0x190B, 21028 },
+ { 0x190C, 21067 },
+ { 0x190D, 20995 },
+ { 0x190E, 21043 },
+ { 0x190F, 21016 },
+ { 0x1910, 21019 },
+ { 0x1911, 21058 },
+ { 0x1912, 20989 },
+ { 0x1913, 21037 },
+ { 0x1914, 21013 },
+ { 0x1915, 21034 },
+ { 0x1916, 21022 },
+ { 0x1917, 21010 },
+ { 0x1918, 21031 },
+ { 0x1919, 21061 },
+ { 0x191A, 21064 },
+ { 0x191B, 21025 },
+ { 0x191C, 21001 },
+ { 0x1920, 20953 },
+ { 0x1921, 20961 },
+ { 0x1922, 20969 },
+ { 0x1923, 20981 },
+ { 0x1924, 20973 },
+ { 0x1925, 20985 },
+ { 0x1926, 20977 },
+ { 0x1927, 20957 },
+ { 0x1928, 20965 },
+ { 0x1929, 21084 },
+ { 0x192A, 21076 },
+ { 0x192B, 21080 },
+ { 0x1930, 20917 },
+ { 0x1931, 20945 },
+ { 0x1932, 20949 },
+ { 0x1933, 20941 },
+ { 0x1934, 20929 },
+ { 0x1935, 20933 },
+ { 0x1936, 20925 },
+ { 0x1937, 20937 },
+ { 0x1938, 20921 },
+ { 0x1939, 20884 },
+ { 0x193A, 20881 },
+ { 0x193B, 20878 },
+ { 0x1940, 20875 },
+ { 0x1944, 21088 },
+ { 0x1945, 21073 },
+ { 0x1946, 20905 },
+ { 0x1947, 20887 },
+ { 0x1948, 20893 },
+ { 0x1949, 20914 },
+ { 0x194A, 20899 },
+ { 0x194B, 20896 },
+ { 0x194C, 20890 },
+ { 0x194D, 20911 },
+ { 0x194E, 20908 },
+ { 0x194F, 20902 },
+ { 0x1950, 7612 },
+ { 0x1951, 7656 },
+ { 0x1952, 7672 },
+ { 0x1953, 7684 },
+ { 0x1954, 7640 },
+ { 0x1955, 7660 },
+ { 0x1956, 7644 },
+ { 0x1957, 7680 },
+ { 0x1958, 7616 },
+ { 0x1959, 7632 },
+ { 0x195A, 7676 },
+ { 0x195B, 7620 },
+ { 0x195C, 7604 },
+ { 0x195D, 7652 },
+ { 0x195E, 7608 },
+ { 0x195F, 7636 },
+ { 0x1960, 7668 },
+ { 0x1961, 7688 },
+ { 0x1962, 7624 },
+ { 0x1963, 7572 },
+ { 0x1964, 7580 },
+ { 0x1965, 7596 },
+ { 0x1966, 7600 },
+ { 0x1967, 7588 },
+ { 0x1968, 7628 },
+ { 0x1969, 7584 },
+ { 0x196A, 7648 },
+ { 0x196B, 7576 },
+ { 0x196C, 7664 },
+ { 0x196D, 7592 },
+ { 0x1970, 7692 },
+ { 0x1971, 7696 },
+ { 0x1972, 7700 },
+ { 0x1973, 7704 },
+ { 0x1974, 7708 },
+ { 0x1980, 6393 },
+ { 0x1981, 6267 },
+ { 0x1982, 6363 },
+ { 0x1983, 6417 },
+ { 0x1984, 6435 },
+ { 0x1985, 6237 },
+ { 0x1986, 6291 },
+ { 0x1987, 6309 },
+ { 0x1988, 6453 },
+ { 0x1989, 6399 },
+ { 0x198A, 6423 },
+ { 0x198B, 6327 },
+ { 0x198C, 6273 },
+ { 0x198D, 6297 },
+ { 0x198E, 6405 },
+ { 0x198F, 6447 },
+ { 0x1990, 6381 },
+ { 0x1991, 6279 },
+ { 0x1992, 6321 },
+ { 0x1993, 6255 },
+ { 0x1994, 6387 },
+ { 0x1995, 6441 },
+ { 0x1996, 6375 },
+ { 0x1997, 6261 },
+ { 0x1998, 6315 },
+ { 0x1999, 6249 },
+ { 0x199A, 6351 },
+ { 0x199B, 6411 },
+ { 0x199C, 6369 },
+ { 0x199D, 6225 },
+ { 0x199E, 6285 },
+ { 0x199F, 6243 },
+ { 0x19A0, 6357 },
+ { 0x19A1, 6345 },
+ { 0x19A2, 6339 },
+ { 0x19A3, 6231 },
+ { 0x19A4, 6219 },
+ { 0x19A5, 6213 },
+ { 0x19A6, 6429 },
+ { 0x19A7, 6459 },
+ { 0x19A8, 6303 },
+ { 0x19A9, 6333 },
+ { 0x19B0, 6206 },
+ { 0x19B1, 6128 },
+ { 0x19B2, 6146 },
+ { 0x19B3, 6122 },
+ { 0x19B4, 6176 },
+ { 0x19B5, 6110 },
+ { 0x19B6, 6134 },
+ { 0x19B7, 6116 },
+ { 0x19B8, 6158 },
+ { 0x19B9, 6170 },
+ { 0x19BA, 6140 },
+ { 0x19BB, 6188 },
+ { 0x19BC, 6182 },
+ { 0x19BD, 6164 },
+ { 0x19BE, 6194 },
+ { 0x19BF, 6200 },
+ { 0x19C0, 6152 },
+ { 0x19C1, 6495 },
+ { 0x19C2, 6501 },
+ { 0x19C3, 6489 },
+ { 0x19C4, 6483 },
+ { 0x19C5, 6477 },
+ { 0x19C6, 6471 },
+ { 0x19C7, 6465 },
+ { 0x19C8, 6050 },
+ { 0x19C9, 6055 },
+ { 0x19D0, 6090 },
+ { 0x19D1, 6060 },
+ { 0x19D2, 6070 },
+ { 0x19D3, 6105 },
+ { 0x19D4, 6080 },
+ { 0x19D5, 6075 },
+ { 0x19D6, 6065 },
+ { 0x19D7, 6100 },
+ { 0x19D8, 6095 },
+ { 0x19D9, 6085 },
+ { 0x19DE, 6040 },
+ { 0x19DF, 6045 },
+ { 0x19E0, 14375 },
+ { 0x19E1, 14288 },
+ { 0x19E2, 14272 },
+ { 0x19E3, 14206 },
+ { 0x19E4, 14280 },
+ { 0x19E5, 14296 },
+ { 0x19E6, 14368 },
+ { 0x19E7, 14352 },
+ { 0x19E8, 14344 },
+ { 0x19E9, 14360 },
+ { 0x19EA, 14214 },
+ { 0x19EB, 14328 },
+ { 0x19EC, 14312 },
+ { 0x19ED, 14304 },
+ { 0x19EE, 14320 },
+ { 0x19EF, 14336 },
+ { 0x19F0, 14372 },
+ { 0x19F1, 14284 },
+ { 0x19F2, 14268 },
+ { 0x19F3, 14202 },
+ { 0x19F4, 14276 },
+ { 0x19F5, 14292 },
+ { 0x19F6, 14364 },
+ { 0x19F7, 14348 },
+ { 0x19F8, 14340 },
+ { 0x19F9, 14356 },
+ { 0x19FA, 14210 },
+ { 0x19FB, 14324 },
+ { 0x19FC, 14308 },
+ { 0x19FD, 14300 },
+ { 0x19FE, 14316 },
+ { 0x19FF, 14332 },
+ { 0x1A00, 45814 },
+ { 0x1A01, 45805 },
+ { 0x1A02, 45847 },
+ { 0x1A03, 45856 },
+ { 0x1A04, 45826 },
+ { 0x1A05, 45796 },
+ { 0x1A06, 45820 },
+ { 0x1A07, 45844 },
+ { 0x1A08, 45835 },
+ { 0x1A09, 45802 },
+ { 0x1A0A, 45823 },
+ { 0x1A0B, 45850 },
+ { 0x1A0C, 45799 },
+ { 0x1A0D, 45811 },
+ { 0x1A0E, 45853 },
+ { 0x1A0F, 45859 },
+ { 0x1A10, 45841 },
+ { 0x1A11, 45829 },
+ { 0x1A12, 45817 },
+ { 0x1A13, 45838 },
+ { 0x1A14, 45832 },
+ { 0x1A15, 45793 },
+ { 0x1A16, 45808 },
+ { 0x1A17, 45777 },
+ { 0x1A18, 45785 },
+ { 0x1A19, 45773 },
+ { 0x1A1A, 45781 },
+ { 0x1A1B, 45789 },
+ { 0x1A1E, 45862 },
+ { 0x1A1F, 45769 },
+ { 0x1B00, 45088 },
+ { 0x1B01, 45092 },
+ { 0x1B02, 45099 },
+ { 0x1B03, 45102 },
+ { 0x1B04, 45096 },
+ { 0x1B05, 45383 },
+ { 0x1B06, 45386 },
+ { 0x1B07, 45393 },
+ { 0x1B08, 45396 },
+ { 0x1B09, 45407 },
+ { 0x1B0A, 45410 },
+ { 0x1B0B, 45315 },
+ { 0x1B0C, 45319 },
+ { 0x1B0D, 45286 },
+ { 0x1B0E, 45290 },
+ { 0x1B0F, 45390 },
+ { 0x1B10, 45414 },
+ { 0x1B11, 45400 },
+ { 0x1B12, 45403 },
+ { 0x1B13, 45276 },
+ { 0x1B14, 45279 },
+ { 0x1B15, 45259 },
+ { 0x1B16, 45262 },
+ { 0x1B17, 45365 },
+ { 0x1B18, 45231 },
+ { 0x1B19, 45234 },
+ { 0x1B1A, 45269 },
+ { 0x1B1B, 45272 },
+ { 0x1B1C, 45368 },
+ { 0x1B1D, 45342 },
+ { 0x1B1E, 45346 },
+ { 0x1B1F, 45245 },
+ { 0x1B20, 45250 },
+ { 0x1B21, 45301 },
+ { 0x1B22, 45335 },
+ { 0x1B23, 45338 },
+ { 0x1B24, 45238 },
+ { 0x1B25, 45241 },
+ { 0x1B26, 45298 },
+ { 0x1B27, 45305 },
+ { 0x1B28, 45308 },
+ { 0x1B29, 45224 },
+ { 0x1B2A, 45227 },
+ { 0x1B2B, 45295 },
+ { 0x1B2C, 45358 },
+ { 0x1B2D, 45312 },
+ { 0x1B2E, 45283 },
+ { 0x1B2F, 45355 },
+ { 0x1B30, 45327 },
+ { 0x1B31, 45331 },
+ { 0x1B32, 45324 },
+ { 0x1B33, 45266 },
+ { 0x1B34, 45105 },
+ { 0x1B35, 45218 },
+ { 0x1B36, 45171 },
+ { 0x1B37, 45175 },
+ { 0x1B38, 45180 },
+ { 0x1B39, 45184 },
+ { 0x1B3A, 45160 },
+ { 0x1B3B, 45165 },
+ { 0x1B3C, 45149 },
+ { 0x1B3D, 45154 },
+ { 0x1B3E, 45198 },
+ { 0x1B3F, 45202 },
+ { 0x1B40, 45213 },
+ { 0x1B41, 45207 },
+ { 0x1B42, 45189 },
+ { 0x1B43, 45193 },
+ { 0x1B44, 45085 },
+ { 0x1B45, 45361 },
+ { 0x1B46, 45375 },
+ { 0x1B47, 45379 },
+ { 0x1B48, 45255 },
+ { 0x1B49, 45351 },
+ { 0x1B4A, 45371 },
+ { 0x1B4B, 45417 },
+ { 0x1B50, 45135 },
+ { 0x1B51, 45117 },
+ { 0x1B52, 45123 },
+ { 0x1B53, 45144 },
+ { 0x1B54, 45129 },
+ { 0x1B55, 45126 },
+ { 0x1B56, 45120 },
+ { 0x1B57, 45141 },
+ { 0x1B58, 45138 },
+ { 0x1B59, 45132 },
+ { 0x1B5A, 45147 },
+ { 0x1B5B, 45421 },
+ { 0x1B5C, 45222 },
+ { 0x1B5D, 45114 },
+ { 0x1B5E, 45108 },
+ { 0x1B5F, 45111 },
+ { 0x1B60, 45568 },
+ { 0x1B61, 45445 },
+ { 0x1B62, 45437 },
+ { 0x1B63, 45449 },
+ { 0x1B64, 45423 },
+ { 0x1B65, 45432 },
+ { 0x1B66, 45441 },
+ { 0x1B67, 45453 },
+ { 0x1B68, 45461 },
+ { 0x1B69, 45457 },
+ { 0x1B6A, 45427 },
+ { 0x1B6B, 45480 },
+ { 0x1B6C, 45475 },
+ { 0x1B6D, 45497 },
+ { 0x1B6E, 45485 },
+ { 0x1B6F, 45509 },
+ { 0x1B70, 45502 },
+ { 0x1B71, 45490 },
+ { 0x1B72, 45470 },
+ { 0x1B73, 45465 },
+ { 0x1B74, 45550 },
+ { 0x1B75, 45544 },
+ { 0x1B76, 45562 },
+ { 0x1B77, 45556 },
+ { 0x1B78, 45514 },
+ { 0x1B79, 45526 },
+ { 0x1B7A, 45532 },
+ { 0x1B7B, 45538 },
+ { 0x1B7C, 45520 },
+ { 0x1B80, 65869 },
+ { 0x1B81, 65872 },
+ { 0x1B82, 65875 },
+ { 0x1B83, 65932 },
+ { 0x1B84, 65938 },
+ { 0x1B85, 65944 },
+ { 0x1B86, 65947 },
+ { 0x1B87, 65941 },
+ { 0x1B88, 65935 },
+ { 0x1B89, 65959 },
+ { 0x1B8A, 65974 },
+ { 0x1B8B, 65989 },
+ { 0x1B8C, 65965 },
+ { 0x1B8D, 66019 },
+ { 0x1B8E, 65953 },
+ { 0x1B8F, 65971 },
+ { 0x1B90, 66013 },
+ { 0x1B91, 66022 },
+ { 0x1B92, 65998 },
+ { 0x1B93, 65956 },
+ { 0x1B94, 65983 },
+ { 0x1B95, 65986 },
+ { 0x1B96, 65962 },
+ { 0x1B97, 66001 },
+ { 0x1B98, 65950 },
+ { 0x1B99, 65980 },
+ { 0x1B9A, 66010 },
+ { 0x1B9B, 65992 },
+ { 0x1B9C, 65977 },
+ { 0x1B9D, 66004 },
+ { 0x1B9E, 65995 },
+ { 0x1B9F, 66007 },
+ { 0x1BA0, 65968 },
+ { 0x1BA1, 66036 },
+ { 0x1BA2, 66032 },
+ { 0x1BA3, 66028 },
+ { 0x1BA4, 65916 },
+ { 0x1BA5, 65912 },
+ { 0x1BA6, 65924 },
+ { 0x1BA7, 65920 },
+ { 0x1BA8, 65908 },
+ { 0x1BA9, 65928 },
+ { 0x1BAA, 65866 },
+ { 0x1BAE, 66016 },
+ { 0x1BAF, 66025 },
+ { 0x1BB0, 65896 },
+ { 0x1BB1, 65878 },
+ { 0x1BB2, 65884 },
+ { 0x1BB3, 65905 },
+ { 0x1BB4, 65890 },
+ { 0x1BB5, 65887 },
+ { 0x1BB6, 65881 },
+ { 0x1BB7, 65902 },
+ { 0x1BB8, 65899 },
+ { 0x1BB9, 65893 },
+ { 0x1C00, 34194 },
+ { 0x1C01, 34251 },
+ { 0x1C02, 34248 },
+ { 0x1C03, 34185 },
+ { 0x1C04, 34242 },
+ { 0x1C05, 34257 },
+ { 0x1C06, 34176 },
+ { 0x1C07, 34230 },
+ { 0x1C08, 34191 },
+ { 0x1C09, 34260 },
+ { 0x1C0A, 34215 },
+ { 0x1C0B, 34272 },
+ { 0x1C0C, 34179 },
+ { 0x1C0D, 34203 },
+ { 0x1C0E, 34206 },
+ { 0x1C0F, 34266 },
+ { 0x1C10, 34263 },
+ { 0x1C11, 34182 },
+ { 0x1C12, 34239 },
+ { 0x1C13, 34173 },
+ { 0x1C14, 34227 },
+ { 0x1C15, 34200 },
+ { 0x1C16, 34254 },
+ { 0x1C17, 34275 },
+ { 0x1C18, 34281 },
+ { 0x1C19, 34236 },
+ { 0x1C1A, 34224 },
+ { 0x1C1B, 34209 },
+ { 0x1C1C, 34197 },
+ { 0x1C1D, 34188 },
+ { 0x1C1E, 34245 },
+ { 0x1C1F, 34218 },
+ { 0x1C20, 34212 },
+ { 0x1C21, 34269 },
+ { 0x1C22, 34221 },
+ { 0x1C23, 34170 },
+ { 0x1C24, 34327 },
+ { 0x1C25, 34323 },
+ { 0x1C26, 34158 },
+ { 0x1C27, 34146 },
+ { 0x1C28, 34150 },
+ { 0x1C29, 34162 },
+ { 0x1C2A, 34154 },
+ { 0x1C2B, 34166 },
+ { 0x1C2C, 34142 },
+ { 0x1C2D, 34287 },
+ { 0x1C2E, 34295 },
+ { 0x1C2F, 34291 },
+ { 0x1C30, 34299 },
+ { 0x1C31, 34303 },
+ { 0x1C32, 34307 },
+ { 0x1C33, 34311 },
+ { 0x1C34, 34319 },
+ { 0x1C35, 34315 },
+ { 0x1C36, 34106 },
+ { 0x1C37, 34109 },
+ { 0x1C3B, 34339 },
+ { 0x1C3C, 34331 },
+ { 0x1C3D, 34336 },
+ { 0x1C3E, 34345 },
+ { 0x1C3F, 34342 },
+ { 0x1C40, 34130 },
+ { 0x1C41, 34112 },
+ { 0x1C42, 34118 },
+ { 0x1C43, 34139 },
+ { 0x1C44, 34124 },
+ { 0x1C45, 34121 },
+ { 0x1C46, 34115 },
+ { 0x1C47, 34136 },
+ { 0x1C48, 34133 },
+ { 0x1C49, 34127 },
+ { 0x1C4D, 34278 },
+ { 0x1C4E, 34284 },
+ { 0x1C4F, 34233 },
+ { 0x1C50, 112 },
+ { 0x1C51, 88 },
+ { 0x1C52, 96 },
+ { 0x1C53, 124 },
+ { 0x1C54, 104 },
+ { 0x1C55, 100 },
+ { 0x1C56, 92 },
+ { 0x1C57, 120 },
+ { 0x1C58, 116 },
+ { 0x1C59, 108 },
+ { 0x1C5A, 163 },
+ { 0x1C5B, 139 },
+ { 0x1C5C, 131 },
+ { 0x1C5D, 223 },
+ { 0x1C5E, 135 },
+ { 0x1C5F, 239 },
+ { 0x1C60, 211 },
+ { 0x1C61, 207 },
+ { 0x1C62, 215 },
+ { 0x1C63, 219 },
+ { 0x1C64, 171 },
+ { 0x1C65, 159 },
+ { 0x1C66, 151 },
+ { 0x1C67, 235 },
+ { 0x1C68, 155 },
+ { 0x1C69, 179 },
+ { 0x1C6A, 195 },
+ { 0x1C6B, 199 },
+ { 0x1C6C, 247 },
+ { 0x1C6D, 203 },
+ { 0x1C6E, 167 },
+ { 0x1C6F, 147 },
+ { 0x1C70, 227 },
+ { 0x1C71, 143 },
+ { 0x1C72, 231 },
+ { 0x1C73, 175 },
+ { 0x1C74, 243 },
+ { 0x1C75, 183 },
+ { 0x1C76, 191 },
+ { 0x1C77, 187 },
+ { 0x1C78, 81 },
+ { 0x1C79, 251 },
+ { 0x1C7A, 258 },
+ { 0x1C7B, 128 },
+ { 0x1C7C, 255 },
+ { 0x1C7D, 85 },
+ { 0x1C7E, 267 },
+ { 0x1C7F, 262 },
+ { 0x1D00, 17949 },
+ { 0x1D01, 18083 },
+ { 0x1D02, 17650 },
+ { 0x1D03, 18119 },
+ { 0x1D04, 17959 },
+ { 0x1D05, 17964 },
+ { 0x1D06, 18098 },
+ { 0x1D07, 17969 },
+ { 0x1D08, 17660 },
+ { 0x1D09, 17575 },
+ { 0x1D0A, 18001 },
+ { 0x1D0B, 18006 },
+ { 0x1D0C, 18016 },
+ { 0x1D0D, 18023 },
+ { 0x1D0E, 18143 },
+ { 0x1D0F, 18033 },
+ { 0x1D10, 18113 },
+ { 0x1D11, 17804 },
+ { 0x1D12, 17821 },
+ { 0x1D13, 17809 },
+ { 0x1D14, 17655 },
+ { 0x1D15, 18093 },
+ { 0x1D16, 17292 },
+ { 0x1D17, 17499 },
+ { 0x1D18, 18038 },
+ { 0x1D19, 18149 },
+ { 0x1D1A, 18131 },
+ { 0x1D1B, 18053 },
+ { 0x1D1C, 18058 },
+ { 0x1D1D, 17816 },
+ { 0x1D1E, 17833 },
+ { 0x1D1F, 17827 },
+ { 0x1D20, 18063 },
+ { 0x1D21, 18068 },
+ { 0x1D22, 18078 },
+ { 0x1D23, 18103 },
+ { 0x1D24, 18159 },
+ { 0x1D25, 17938 },
+ { 0x1D26, 12051 },
+ { 0x1D27, 12056 },
+ { 0x1D28, 12036 },
+ { 0x1D29, 12046 },
+ { 0x1D2A, 12041 },
+ { 0x1D2B, 49409 },
+ { 0x1D2C, 54616 },
+ { 0x1D2D, 54692 },
+ { 0x1D2E, 54620 },
+ { 0x1D2F, 54700 },
+ { 0x1D30, 54624 },
+ { 0x1D31, 54628 },
+ { 0x1D32, 54705 },
+ { 0x1D33, 54632 },
+ { 0x1D34, 54636 },
+ { 0x1D35, 54640 },
+ { 0x1D36, 54644 },
+ { 0x1D37, 54648 },
+ { 0x1D38, 54652 },
+ { 0x1D39, 54656 },
+ { 0x1D3A, 54660 },
+ { 0x1D3B, 54710 },
+ { 0x1D3C, 54664 },
+ { 0x1D3D, 54696 },
+ { 0x1D3E, 54668 },
+ { 0x1D3F, 54672 },
+ { 0x1D40, 54676 },
+ { 0x1D41, 54680 },
+ { 0x1D42, 54688 },
+ { 0x1D43, 54136 },
+ { 0x1D44, 54421 },
+ { 0x1D45, 54375 },
+ { 0x1D46, 54466 },
+ { 0x1D47, 54140 },
+ { 0x1D48, 54154 },
+ { 0x1D49, 54158 },
+ { 0x1D4A, 54397 },
+ { 0x1D4B, 54365 },
+ { 0x1D4C, 54471 },
+ { 0x1D4D, 54166 },
+ { 0x1D4E, 54431 },
+ { 0x1D4F, 54196 },
+ { 0x1D50, 54218 },
+ { 0x1D51, 54331 },
+ { 0x1D52, 54242 },
+ { 0x1D53, 54370 },
+ { 0x1D54, 54351 },
+ { 0x1D55, 54410 },
+ { 0x1D56, 54246 },
+ { 0x1D57, 54264 },
+ { 0x1D58, 54275 },
+ { 0x1D59, 54538 },
+ { 0x1D5A, 54436 },
+ { 0x1D5B, 54284 },
+ { 0x1D5C, 54323 },
+ { 0x1D5D, 54357 },
+ { 0x1D5E, 54392 },
+ { 0x1D5F, 54379 },
+ { 0x1D60, 54387 },
+ { 0x1D61, 54327 },
+ { 0x1D62, 20792 },
+ { 0x1D63, 20807 },
+ { 0x1D64, 20812 },
+ { 0x1D65, 20817 },
+ { 0x1D66, 13101 },
+ { 0x1D67, 13106 },
+ { 0x1D68, 13096 },
+ { 0x1D69, 13091 },
+ { 0x1D6A, 13086 },
+ { 0x1D6B, 17177 },
+ { 0x1D6C, 14742 },
+ { 0x1D6D, 14886 },
+ { 0x1D6E, 15140 },
+ { 0x1D6F, 15661 },
+ { 0x1D70, 15745 },
+ { 0x1D71, 16100 },
+ { 0x1D72, 16239 },
+ { 0x1D73, 16271 },
+ { 0x1D74, 16370 },
+ { 0x1D75, 16446 },
+ { 0x1D76, 16999 },
+ { 0x1D77, 17549 },
+ { 0x1D78, 54782 },
+ { 0x1D79, 17723 },
+ { 0x1D7A, 17162 },
+ { 0x1D7B, 17883 },
+ { 0x1D7C, 17331 },
+ { 0x1D7D, 16107 },
+ { 0x1D7E, 17890 },
+ { 0x1D7F, 17747 },
+ { 0x1D80, 14761 },
+ { 0x1D81, 14911 },
+ { 0x1D82, 15147 },
+ { 0x1D83, 15207 },
+ { 0x1D84, 15493 },
+ { 0x1D85, 15610 },
+ { 0x1D86, 15668 },
+ { 0x1D87, 15758 },
+ { 0x1D88, 16121 },
+ { 0x1D89, 16258 },
+ { 0x1D8A, 16383 },
+ { 0x1D8B, 17211 },
+ { 0x1D8C, 16764 },
+ { 0x1D8D, 16844 },
+ { 0x1D8E, 17012 },
+ { 0x1D8F, 14656 },
+ { 0x1D90, 17433 },
+ { 0x1D91, 14859 },
+ { 0x1D92, 15061 },
+ { 0x1D93, 17375 },
+ { 0x1D94, 17791 },
+ { 0x1D95, 17458 },
+ { 0x1D96, 15395 },
+ { 0x1D97, 17388 },
+ { 0x1D98, 17218 },
+ { 0x1D99, 16708 },
+ { 0x1D9A, 17251 },
+ { 0x1D9B, 54477 },
+ { 0x1D9C, 54144 },
+ { 0x1D9D, 54148 },
+ { 0x1D9E, 54339 },
+ { 0x1D9F, 54526 },
+ { 0x1DA0, 54162 },
+ { 0x1DA1, 54515 },
+ { 0x1DA2, 54416 },
+ { 0x1DA3, 54426 },
+ { 0x1DA4, 54180 },
+ { 0x1DA5, 54361 },
+ { 0x1DA6, 54482 },
+ { 0x1DA7, 54487 },
+ { 0x1DA8, 54190 },
+ { 0x1DA9, 54211 },
+ { 0x1DAA, 54204 },
+ { 0x1DAB, 54494 },
+ { 0x1DAC, 54222 },
+ { 0x1DAD, 54441 },
+ { 0x1DAE, 54228 },
+ { 0x1DAF, 54235 },
+ { 0x1DB0, 54499 },
+ { 0x1DB1, 54405 },
+ { 0x1DB2, 54347 },
+ { 0x1DB3, 54258 },
+ { 0x1DB4, 54335 },
+ { 0x1DB5, 54268 },
+ { 0x1DB6, 54279 },
+ { 0x1DB7, 54522 },
+ { 0x1DB8, 54504 },
+ { 0x1DB9, 54288 },
+ { 0x1DBA, 54461 },
+ { 0x1DBB, 54306 },
+ { 0x1DBC, 54316 },
+ { 0x1DBD, 54310 },
+ { 0x1DBE, 54343 },
+ { 0x1DBF, 54401 },
+ { 0x1DC0, 57864 },
+ { 0x1DC1, 57860 },
+ { 0x1DC2, 57834 },
+ { 0x1DC3, 58302 },
+ { 0x1DC4, 58317 },
+ { 0x1DC5, 58315 },
+ { 0x1DC6, 58321 },
+ { 0x1DC7, 58311 },
+ { 0x1DC8, 58333 },
+ { 0x1DC9, 58331 },
+ { 0x1DCA, 57657 },
+ { 0x1DCB, 58313 },
+ { 0x1DCC, 58319 },
+ { 0x1DCD, 57933 },
+ { 0x1DCE, 57961 },
+ { 0x1DCF, 57977 },
+ { 0x1DD0, 57389 },
+ { 0x1DD1, 57396 },
+ { 0x1DD2, 57399 },
+ { 0x1DD3, 57731 },
+ { 0x1DD4, 57699 },
+ { 0x1DD5, 57704 },
+ { 0x1DD6, 57709 },
+ { 0x1DD7, 57596 },
+ { 0x1DD8, 57725 },
+ { 0x1DD9, 57714 },
+ { 0x1DDA, 57612 },
+ { 0x1DDB, 57739 },
+ { 0x1DDC, 57627 },
+ { 0x1DDD, 57632 },
+ { 0x1DDE, 57745 },
+ { 0x1DDF, 57751 },
+ { 0x1DE0, 57642 },
+ { 0x1DE1, 57757 },
+ { 0x1DE2, 57763 },
+ { 0x1DE3, 57663 },
+ { 0x1DE4, 57669 },
+ { 0x1DE5, 57719 },
+ { 0x1DE6, 57694 },
+ { 0x1DFE, 57476 },
+ { 0x1DFF, 57806 },
+ { 0x1E00, 18281 },
+ { 0x1E01, 14523 },
+ { 0x1E02, 18458 },
+ { 0x1E03, 14715 },
+ { 0x1E04, 18465 },
+ { 0x1E05, 14722 },
+ { 0x1E06, 18478 },
+ { 0x1E07, 14735 },
+ { 0x1E08, 18538 },
+ { 0x1E09, 14815 },
+ { 0x1E0A, 18556 },
+ { 0x1E0B, 14833 },
+ { 0x1E0C, 18563 },
+ { 0x1E0D, 14840 },
+ { 0x1E0E, 18576 },
+ { 0x1E0F, 14867 },
+ { 0x1E10, 18619 },
+ { 0x1E11, 14905 },
+ { 0x1E12, 18625 },
+ { 0x1E13, 14918 },
+ { 0x1E14, 18715 },
+ { 0x1E15, 15014 },
+ { 0x1E16, 18707 },
+ { 0x1E17, 15006 },
+ { 0x1E18, 18810 },
+ { 0x1E19, 15116 },
+ { 0x1E1A, 18687 },
+ { 0x1E1B, 14986 },
+ { 0x1E1C, 18741 },
+ { 0x1E1D, 15040 },
+ { 0x1E1E, 18821 },
+ { 0x1E1F, 15127 },
+ { 0x1E20, 18869 },
+ { 0x1E21, 15189 },
+ { 0x1E22, 18897 },
+ { 0x1E23, 15224 },
+ { 0x1E24, 18904 },
+ { 0x1E25, 15231 },
+ { 0x1E26, 18942 },
+ { 0x1E27, 15282 },
+ { 0x1E28, 18930 },
+ { 0x1E29, 15270 },
+ { 0x1E2A, 18911 },
+ { 0x1E2B, 15251 },
+ { 0x1E2C, 19009 },
+ { 0x1E2D, 15342 },
+ { 0x1E2E, 19054 },
+ { 0x1E2F, 15387 },
+ { 0x1E30, 19108 },
+ { 0x1E31, 15460 },
+ { 0x1E32, 19088 },
+ { 0x1E33, 15440 },
+ { 0x1E34, 19101 },
+ { 0x1E35, 15453 },
+ { 0x1E36, 19164 },
+ { 0x1E37, 15523 },
+ { 0x1E38, 19171 },
+ { 0x1E39, 15530 },
+ { 0x1E3A, 19187 },
+ { 0x1E3B, 15558 },
+ { 0x1E3C, 19247 },
+ { 0x1E3D, 15624 },
+ { 0x1E3E, 19278 },
+ { 0x1E3F, 15655 },
+ { 0x1E40, 19258 },
+ { 0x1E41, 15635 },
+ { 0x1E42, 19265 },
+ { 0x1E43, 15642 },
+ { 0x1E44, 19288 },
+ { 0x1E45, 15679 },
+ { 0x1E46, 19295 },
+ { 0x1E47, 15686 },
+ { 0x1E48, 19309 },
+ { 0x1E49, 15706 },
+ { 0x1E4A, 19362 },
+ { 0x1E4B, 15772 },
+ { 0x1E4C, 19495 },
+ { 0x1E4D, 15920 },
+ { 0x1E4E, 19511 },
+ { 0x1E4F, 15936 },
+ { 0x1E50, 19547 },
+ { 0x1E51, 15972 },
+ { 0x1E52, 19539 },
+ { 0x1E53, 15964 },
+ { 0x1E54, 19676 },
+ { 0x1E55, 16094 },
+ { 0x1E56, 19663 },
+ { 0x1E57, 16081 },
+ { 0x1E58, 19732 },
+ { 0x1E59, 16177 },
+ { 0x1E5A, 19739 },
+ { 0x1E5B, 16184 },
+ { 0x1E5C, 19746 },
+ { 0x1E5D, 16191 },
+ { 0x1E5E, 19755 },
+ { 0x1E5F, 16200 },
+ { 0x1E60, 19815 },
+ { 0x1E61, 16296 },
+ { 0x1E62, 19822 },
+ { 0x1E63, 16303 },
+ { 0x1E64, 19845 },
+ { 0x1E65, 16332 },
+ { 0x1E66, 19860 },
+ { 0x1E67, 16347 },
+ { 0x1E68, 19829 },
+ { 0x1E69, 16310 },
+ { 0x1E6A, 19892 },
+ { 0x1E6B, 16400 },
+ { 0x1E6C, 19899 },
+ { 0x1E6D, 16407 },
+ { 0x1E6E, 19912 },
+ { 0x1E6F, 16426 },
+ { 0x1E70, 19958 },
+ { 0x1E71, 16492 },
+ { 0x1E72, 20167 },
+ { 0x1E73, 16701 },
+ { 0x1E74, 20081 },
+ { 0x1E75, 16615 },
+ { 0x1E76, 20180 },
+ { 0x1E77, 16721 },
+ { 0x1E78, 20073 },
+ { 0x1E79, 16607 },
+ { 0x1E7A, 20108 },
+ { 0x1E7B, 16642 },
+ { 0x1E7C, 20204 },
+ { 0x1E7D, 16758 },
+ { 0x1E7E, 20191 },
+ { 0x1E7F, 16732 },
+ { 0x1E80, 20247 },
+ { 0x1E81, 16815 },
+ { 0x1E82, 20241 },
+ { 0x1E83, 16809 },
+ { 0x1E84, 20253 },
+ { 0x1E85, 16821 },
+ { 0x1E86, 20221 },
+ { 0x1E87, 16782 },
+ { 0x1E88, 20228 },
+ { 0x1E89, 16789 },
+ { 0x1E8A, 20269 },
+ { 0x1E8B, 16837 },
+ { 0x1E8C, 20276 },
+ { 0x1E8D, 16851 },
+ { 0x1E8E, 20286 },
+ { 0x1E8F, 16861 },
+ { 0x1E90, 20416 },
+ { 0x1E91, 17032 },
+ { 0x1E92, 20372 },
+ { 0x1E93, 16954 },
+ { 0x1E94, 20385 },
+ { 0x1E95, 16973 },
+ { 0x1E96, 15244 },
+ { 0x1E97, 16479 },
+ { 0x1E98, 16802 },
+ { 0x1E99, 16894 },
+ { 0x1E9A, 14596 },
+ { 0x1E9B, 17346 },
+ { 0x1E9C, 17362 },
+ { 0x1E9D, 17354 },
+ { 0x1E9E, 20613 },
+ { 0x1E9F, 17440 },
+ { 0x1EA0, 18251 },
+ { 0x1EA1, 14493 },
+ { 0x1EA2, 18258 },
+ { 0x1EA3, 14500 },
+ { 0x1EA4, 18430 },
+ { 0x1EA5, 14687 },
+ { 0x1EA6, 18438 },
+ { 0x1EA7, 14695 },
+ { 0x1EA8, 18421 },
+ { 0x1EA9, 14678 },
+ { 0x1EAA, 18446 },
+ { 0x1EAB, 14703 },
+ { 0x1EAC, 18412 },
+ { 0x1EAD, 14669 },
+ { 0x1EAE, 18318 },
+ { 0x1EAF, 14560 },
+ { 0x1EB0, 18326 },
+ { 0x1EB1, 14568 },
+ { 0x1EB2, 18309 },
+ { 0x1EB3, 14551 },
+ { 0x1EB4, 18334 },
+ { 0x1EB5, 14576 },
+ { 0x1EB6, 18300 },
+ { 0x1EB7, 14542 },
+ { 0x1EB8, 18643 },
+ { 0x1EB9, 14936 },
+ { 0x1EBA, 18650 },
+ { 0x1EBB, 14943 },
+ { 0x1EBC, 18681 },
+ { 0x1EBD, 14980 },
+ { 0x1EBE, 18786 },
+ { 0x1EBF, 15092 },
+ { 0x1EC0, 18794 },
+ { 0x1EC1, 15100 },
+ { 0x1EC2, 18777 },
+ { 0x1EC3, 15083 },
+ { 0x1EC4, 18802 },
+ { 0x1EC5, 15108 },
+ { 0x1EC6, 18768 },
+ { 0x1EC7, 15074 },
+ { 0x1EC8, 18972 },
+ { 0x1EC9, 15305 },
+ { 0x1ECA, 18965 },
+ { 0x1ECB, 15298 },
+ { 0x1ECC, 19389 },
+ { 0x1ECD, 15806 },
+ { 0x1ECE, 19396 },
+ { 0x1ECF, 15821 },
+ { 0x1ED0, 19635 },
+ { 0x1ED1, 16053 },
+ { 0x1ED2, 19643 },
+ { 0x1ED3, 16061 },
+ { 0x1ED4, 19626 },
+ { 0x1ED5, 16044 },
+ { 0x1ED6, 19651 },
+ { 0x1ED7, 16069 },
+ { 0x1ED8, 19617 },
+ { 0x1ED9, 16035 },
+ { 0x1EDA, 19427 },
+ { 0x1EDB, 15852 },
+ { 0x1EDC, 19435 },
+ { 0x1EDD, 15860 },
+ { 0x1EDE, 19418 },
+ { 0x1EDF, 15843 },
+ { 0x1EE0, 19443 },
+ { 0x1EE1, 15868 },
+ { 0x1EE2, 19409 },
+ { 0x1EE3, 15834 },
+ { 0x1EE4, 19974 },
+ { 0x1EE5, 16508 },
+ { 0x1EE6, 19981 },
+ { 0x1EE7, 16515 },
+ { 0x1EE8, 20012 },
+ { 0x1EE9, 16546 },
+ { 0x1EEA, 20020 },
+ { 0x1EEB, 16554 },
+ { 0x1EEC, 20003 },
+ { 0x1EED, 16537 },
+ { 0x1EEE, 20028 },
+ { 0x1EEF, 16562 },
+ { 0x1EF0, 19994 },
+ { 0x1EF1, 16528 },
+ { 0x1EF2, 20325 },
+ { 0x1EF3, 16907 },
+ { 0x1EF4, 20293 },
+ { 0x1EF5, 16868 },
+ { 0x1EF6, 20306 },
+ { 0x1EF7, 16881 },
+ { 0x1EF8, 20331 },
+ { 0x1EF9, 16913 },
+ { 0x1EFA, 20759 },
+ { 0x1EFB, 17868 },
+ { 0x1EFC, 20754 },
+ { 0x1EFD, 17863 },
+ { 0x1EFE, 20313 },
+ { 0x1EFF, 16888 },
+ { 0x1F00, 11230 },
+ { 0x1F01, 11162 },
+ { 0x1F02, 11254 },
+ { 0x1F03, 11186 },
+ { 0x1F04, 11236 },
+ { 0x1F05, 11168 },
+ { 0x1F06, 11272 },
+ { 0x1F07, 11204 },
+ { 0x1F08, 12506 },
+ { 0x1F09, 12438 },
+ { 0x1F0A, 12530 },
+ { 0x1F0B, 12462 },
+ { 0x1F0C, 12512 },
+ { 0x1F0D, 12444 },
+ { 0x1F0E, 12548 },
+ { 0x1F0F, 12480 },
+ { 0x1F10, 11631 },
+ { 0x1F11, 11609 },
+ { 0x1F12, 11645 },
+ { 0x1F13, 11623 },
+ { 0x1F14, 11637 },
+ { 0x1F15, 11615 },
+ { 0x1F18, 12829 },
+ { 0x1F19, 12807 },
+ { 0x1F1A, 12843 },
+ { 0x1F1B, 12821 },
+ { 0x1F1C, 12835 },
+ { 0x1F1D, 12813 },
+ { 0x1F20, 10850 },
+ { 0x1F21, 10782 },
+ { 0x1F22, 10874 },
+ { 0x1F23, 10806 },
+ { 0x1F24, 10856 },
+ { 0x1F25, 10788 },
+ { 0x1F26, 10892 },
+ { 0x1F27, 10824 },
+ { 0x1F28, 12200 },
+ { 0x1F29, 12132 },
+ { 0x1F2A, 12224 },
+ { 0x1F2B, 12156 },
+ { 0x1F2C, 12206 },
+ { 0x1F2D, 12138 },
+ { 0x1F2E, 12242 },
+ { 0x1F2F, 12174 },
+ { 0x1F30, 11042 },
+ { 0x1F31, 11012 },
+ { 0x1F32, 11056 },
+ { 0x1F33, 11026 },
+ { 0x1F34, 11048 },
+ { 0x1F35, 11018 },
+ { 0x1F36, 11064 },
+ { 0x1F37, 11034 },
+ { 0x1F38, 12364 },
+ { 0x1F39, 12334 },
+ { 0x1F3A, 12378 },
+ { 0x1F3B, 12348 },
+ { 0x1F3C, 12370 },
+ { 0x1F3D, 12340 },
+ { 0x1F3E, 12386 },
+ { 0x1F3F, 12356 },
+ { 0x1F40, 11697 },
+ { 0x1F41, 11675 },
+ { 0x1F42, 11711 },
+ { 0x1F43, 11689 },
+ { 0x1F44, 11703 },
+ { 0x1F45, 11681 },
+ { 0x1F48, 12895 },
+ { 0x1F49, 12873 },
+ { 0x1F4A, 12909 },
+ { 0x1F4B, 12887 },
+ { 0x1F4C, 12901 },
+ { 0x1F4D, 12879 },
+ { 0x1F50, 11771 },
+ { 0x1F51, 11741 },
+ { 0x1F52, 11785 },
+ { 0x1F53, 11755 },
+ { 0x1F54, 11777 },
+ { 0x1F55, 11747 },
+ { 0x1F56, 11793 },
+ { 0x1F57, 11763 },
+ { 0x1F59, 12939 },
+ { 0x1F5B, 12953 },
+ { 0x1F5D, 12945 },
+ { 0x1F5F, 12961 },
+ { 0x1F60, 11461 },
+ { 0x1F61, 11393 },
+ { 0x1F62, 11485 },
+ { 0x1F63, 11417 },
+ { 0x1F64, 11467 },
+ { 0x1F65, 11399 },
+ { 0x1F66, 11503 },
+ { 0x1F67, 11435 },
+ { 0x1F68, 12698 },
+ { 0x1F69, 12630 },
+ { 0x1F6A, 12722 },
+ { 0x1F6B, 12654 },
+ { 0x1F6C, 12704 },
+ { 0x1F6D, 12636 },
+ { 0x1F6E, 12740 },
+ { 0x1F6F, 12672 },
+ { 0x1F70, 11304 },
+ { 0x1F71, 11148 },
+ { 0x1F72, 11659 },
+ { 0x1F73, 11603 },
+ { 0x1F74, 10924 },
+ { 0x1F75, 10768 },
+ { 0x1F76, 11078 },
+ { 0x1F77, 11006 },
+ { 0x1F78, 11725 },
+ { 0x1F79, 11669 },
+ { 0x1F7A, 11807 },
+ { 0x1F7B, 11735 },
+ { 0x1F7C, 11535 },
+ { 0x1F7D, 11379 },
+ { 0x1F80, 11290 },
+ { 0x1F81, 11222 },
+ { 0x1F82, 11262 },
+ { 0x1F83, 11194 },
+ { 0x1F84, 11244 },
+ { 0x1F85, 11176 },
+ { 0x1F86, 11280 },
+ { 0x1F87, 11212 },
+ { 0x1F88, 12566 },
+ { 0x1F89, 12498 },
+ { 0x1F8A, 12538 },
+ { 0x1F8B, 12470 },
+ { 0x1F8C, 12520 },
+ { 0x1F8D, 12452 },
+ { 0x1F8E, 12556 },
+ { 0x1F8F, 12488 },
+ { 0x1F90, 10910 },
+ { 0x1F91, 10842 },
+ { 0x1F92, 10882 },
+ { 0x1F93, 10814 },
+ { 0x1F94, 10864 },
+ { 0x1F95, 10796 },
+ { 0x1F96, 10900 },
+ { 0x1F97, 10832 },
+ { 0x1F98, 12260 },
+ { 0x1F99, 12192 },
+ { 0x1F9A, 12232 },
+ { 0x1F9B, 12164 },
+ { 0x1F9C, 12214 },
+ { 0x1F9D, 12146 },
+ { 0x1F9E, 12250 },
+ { 0x1F9F, 12182 },
+ { 0x1FA0, 11521 },
+ { 0x1FA1, 11453 },
+ { 0x1FA2, 11493 },
+ { 0x1FA3, 11425 },
+ { 0x1FA4, 11475 },
+ { 0x1FA5, 11407 },
+ { 0x1FA6, 11511 },
+ { 0x1FA7, 11443 },
+ { 0x1FA8, 12758 },
+ { 0x1FA9, 12690 },
+ { 0x1FAA, 12730 },
+ { 0x1FAB, 12662 },
+ { 0x1FAC, 12712 },
+ { 0x1FAD, 12644 },
+ { 0x1FAE, 12748 },
+ { 0x1FAF, 12680 },
+ { 0x1FB0, 11324 },
+ { 0x1FB1, 11318 },
+ { 0x1FB2, 11310 },
+ { 0x1FB3, 11344 },
+ { 0x1FB4, 11154 },
+ { 0x1FB6, 11330 },
+ { 0x1FB7, 11336 },
+ { 0x1FB8, 12592 },
+ { 0x1FB9, 12586 },
+ { 0x1FBA, 12580 },
+ { 0x1FBB, 12432 },
+ { 0x1FBC, 12598 },
+ { 0x1FBD, 13025 },
+ { 0x1FBE, 13524 },
+ { 0x1FBF, 10724 },
+ { 0x1FC0, 13372 },
+ { 0x1FC1, 13079 },
+ { 0x1FC2, 10930 },
+ { 0x1FC3, 10952 },
+ { 0x1FC4, 10774 },
+ { 0x1FC6, 10938 },
+ { 0x1FC7, 10944 },
+ { 0x1FC8, 12857 },
+ { 0x1FC9, 12801 },
+ { 0x1FCA, 12274 },
+ { 0x1FCB, 12126 },
+ { 0x1FCC, 12280 },
+ { 0x1FCD, 10730 },
+ { 0x1FCE, 10726 },
+ { 0x1FCF, 10734 },
+ { 0x1FD0, 11090 },
+ { 0x1FD1, 11084 },
+ { 0x1FD2, 11118 },
+ { 0x1FD3, 11102 },
+ { 0x1FD6, 11134 },
+ { 0x1FD7, 11126 },
+ { 0x1FD8, 12412 },
+ { 0x1FD9, 12406 },
+ { 0x1FDA, 12400 },
+ { 0x1FDB, 12328 },
+ { 0x1FDD, 10706 },
+ { 0x1FDE, 10702 },
+ { 0x1FDF, 10710 },
+ { 0x1FE0, 11819 },
+ { 0x1FE1, 11813 },
+ { 0x1FE2, 11847 },
+ { 0x1FE3, 11831 },
+ { 0x1FE4, 10976 },
+ { 0x1FE5, 10970 },
+ { 0x1FE6, 11863 },
+ { 0x1FE7, 11855 },
+ { 0x1FE8, 12987 },
+ { 0x1FE9, 12981 },
+ { 0x1FEA, 12975 },
+ { 0x1FEB, 12933 },
+ { 0x1FEC, 12298 },
+ { 0x1FED, 13075 },
+ { 0x1FEE, 13071 },
+ { 0x1FEF, 11900 },
+ { 0x1FF2, 11541 },
+ { 0x1FF3, 11563 },
+ { 0x1FF4, 11385 },
+ { 0x1FF6, 11549 },
+ { 0x1FF7, 11555 },
+ { 0x1FF8, 12923 },
+ { 0x1FF9, 12867 },
+ { 0x1FFA, 12772 },
+ { 0x1FFB, 12624 },
+ { 0x1FFC, 12778 },
+ { 0x1FFD, 10692 },
+ { 0x1FFE, 10700 },
+ { 0x2000, 77 },
+ { 0x2001, 71 },
+ { 0x2002, 79 },
+ { 0x2003, 73 },
+ { 0x2004, 74478 },
+ { 0x2005, 68661 },
+ { 0x2006, 68597 },
+ { 0x2007, 31771 },
+ { 0x2008, 69272 },
+ { 0x2009, 10051 },
+ { 0x200A, 9123 },
+ { 0x200B, 10089 },
+ { 0x200C, 10099 },
+ { 0x200D, 10092 },
+ { 0x200E, 74617 },
+ { 0x200F, 75041 },
+ { 0x2010, 33424 },
+ { 0x2011, 74240 },
+ { 0x2012, 31769 },
+ { 0x2013, 75 },
+ { 0x2014, 69 },
+ { 0x2015, 67636 },
+ { 0x2016, 31692 },
+ { 0x2017, 31548 },
+ { 0x2018, 9381 },
+ { 0x2019, 21908 },
+ { 0x201A, 35854 },
+ { 0x201B, 35868 },
+ { 0x201C, 9365 },
+ { 0x201D, 21892 },
+ { 0x201E, 31570 },
+ { 0x201F, 31700 },
+ { 0x2020, 31169 },
+ { 0x2021, 31587 },
+ { 0x2022, 30312 },
+ { 0x2023, 68599 },
+ { 0x2024, 7161 },
+ { 0x2025, 7766 },
+ { 0x2026, 67661 },
+ { 0x2027, 68663 },
+ { 0x2028, 9483 },
+ { 0x2029, 65751 },
+ { 0x202A, 74621 },
+ { 0x202B, 75045 },
+ { 0x202C, 7173 },
+ { 0x202D, 74619 },
+ { 0x202E, 75043 },
+ { 0x202F, 35576 },
+ { 0x2030, 7170 },
+ { 0x2031, 7164 },
+ { 0x2032, 21742 },
+ { 0x2033, 31574 },
+ { 0x2034, 37619 },
+ { 0x2035, 55468 },
+ { 0x2036, 55475 },
+ { 0x2037, 55491 },
+ { 0x2038, 10441 },
+ { 0x2039, 35858 },
+ { 0x203A, 35863 },
+ { 0x203B, 65808 },
+ { 0x203C, 31695 },
+ { 0x203D, 69263 },
+ { 0x203E, 54945 },
+ { 0x203F, 56009 },
+ { 0x2040, 57360 },
+ { 0x2041, 10442 },
+ { 0x2042, 45084 },
+ { 0x2043, 33428 },
+ { 0x2044, 51779 },
+ { 0x2045, 9404 },
+ { 0x2046, 21931 },
+ { 0x2047, 31668 },
+ { 0x2048, 55448 },
+ { 0x2049, 68658 },
+ { 0x204A, 55895 },
+ { 0x204B, 55494 },
+ { 0x204C, 10314 },
+ { 0x204D, 10331 },
+ { 0x204E, 6038 },
+ { 0x204F, 55505 },
+ { 0x2050, 10452 },
+ { 0x2051, 7789 },
+ { 0x2052, 66839 },
+ { 0x2053, 22751 },
+ { 0x2054, 53355 },
+ { 0x2055, 31779 },
+ { 0x2056, 22989 },
+ { 0x2057, 65761 },
+ { 0x2058, 9100 },
+ { 0x2059, 9094 },
+ { 0x205A, 7769 },
+ { 0x205B, 9097 },
+ { 0x205C, 31529 },
+ { 0x205D, 55910 },
+ { 0x205E, 56031 },
+ { 0x205F, 35557 },
+ { 0x2060, 10087 },
+ { 0x2061, 51784 },
+ { 0x2062, 64310 },
+ { 0x2063, 64312 },
+ { 0x2064, 64308 },
+ { 0x206A, 40633 },
+ { 0x206B, 44713 },
+ { 0x206C, 40629 },
+ { 0x206D, 44709 },
+ { 0x206E, 54880 },
+ { 0x206F, 42828 },
+ { 0x2070, 69298 },
+ { 0x2071, 69302 },
+ { 0x2074, 69288 },
+ { 0x2075, 69286 },
+ { 0x2076, 69282 },
+ { 0x2077, 69317 },
+ { 0x2078, 69300 },
+ { 0x2079, 69293 },
+ { 0x207A, 69295 },
+ { 0x207B, 69312 },
+ { 0x207C, 69321 },
+ { 0x207D, 69290 },
+ { 0x207E, 69314 },
+ { 0x207F, 69307 },
+ { 0x2080, 65843 },
+ { 0x2081, 65825 },
+ { 0x2082, 65829 },
+ { 0x2083, 65854 },
+ { 0x2084, 65833 },
+ { 0x2085, 65831 },
+ { 0x2086, 65827 },
+ { 0x2087, 65852 },
+ { 0x2088, 65845 },
+ { 0x2089, 65838 },
+ { 0x208A, 65840 },
+ { 0x208B, 65847 },
+ { 0x208C, 65856 },
+ { 0x208D, 65835 },
+ { 0x208E, 65849 },
+ { 0x2090, 20782 },
+ { 0x2091, 20787 },
+ { 0x2092, 20802 },
+ { 0x2093, 20822 },
+ { 0x2094, 20827 },
+ { 0x20A0, 74597 },
+ { 0x20A1, 10456 },
+ { 0x20A2, 48519 },
+ { 0x20A3, 31787 },
+ { 0x20A4, 9505 },
+ { 0x20A5, 9596 },
+ { 0x20A6, 21269 },
+ { 0x20A7, 35651 },
+ { 0x20A8, 22442 },
+ { 0x20A9, 8709 },
+ { 0x20AA, 6507 },
+ { 0x20AB, 9068 },
+ { 0x20AC, 9089 },
+ { 0x20AD, 5797 },
+ { 0x20AE, 37669 },
+ { 0x20AF, 40498 },
+ { 0x20B0, 31791 },
+ { 0x20B1, 9631 },
+ { 0x20B2, 40560 },
+ { 0x20B3, 37779 },
+ { 0x20B4, 40627 },
+ { 0x20B5, 8727 },
+ { 0x20D0, 57472 },
+ { 0x20D1, 57795 },
+ { 0x20D2, 57497 },
+ { 0x20D3, 57829 },
+ { 0x20D4, 58327 },
+ { 0x20D5, 58236 },
+ { 0x20D6, 57454 },
+ { 0x20D7, 57787 },
+ { 0x20D8, 57512 },
+ { 0x20D9, 58232 },
+ { 0x20DA, 58323 },
+ { 0x20DB, 57837 },
+ { 0x20DC, 57423 },
+ { 0x20DD, 58245 },
+ { 0x20DE, 58258 },
+ { 0x20DF, 58266 },
+ { 0x20E0, 58248 },
+ { 0x20E1, 57462 },
+ { 0x20E2, 58255 },
+ { 0x20E3, 58252 },
+ { 0x20E4, 58261 },
+ { 0x20E5, 57987 },
+ { 0x20E6, 57928 },
+ { 0x20E7, 57980 },
+ { 0x20E8, 57967 },
+ { 0x20E9, 57515 },
+ { 0x20EA, 58269 },
+ { 0x20EB, 57484 },
+ { 0x20EC, 58296 },
+ { 0x20ED, 58273 },
+ { 0x20EE, 57458 },
+ { 0x20EF, 57791 },
+ { 0x20F0, 57998 },
+ { 0x2100, 37774 },
+ { 0x2101, 56104 },
+ { 0x2102, 74558 },
+ { 0x2103, 31181 },
+ { 0x2104, 30465 },
+ { 0x2105, 8725 },
+ { 0x2106, 8723 },
+ { 0x2107, 10628 },
+ { 0x2108, 43021 },
+ { 0x2109, 31183 },
+ { 0x210A, 35815 },
+ { 0x210B, 35833 },
+ { 0x210C, 69390 },
+ { 0x210D, 74561 },
+ { 0x210E, 35654 },
+ { 0x210F, 35656 },
+ { 0x2110, 35836 },
+ { 0x2111, 69393 },
+ { 0x2112, 35839 },
+ { 0x2113, 35818 },
+ { 0x2114, 0 },
+ { 0x2115, 74564 },
+ { 0x2116, 35635 },
+ { 0x2117, 22671 },
+ { 0x2118, 35845 },
+ { 0x2119, 74567 },
+ { 0x211A, 74570 },
+ { 0x211B, 35848 },
+ { 0x211C, 69396 },
+ { 0x211D, 74573 },
+ { 0x211E, 74242 },
+ { 0x211F, 55455 },
+ { 0x2120, 43025 },
+ { 0x2121, 66040 },
+ { 0x2122, 23055 },
+ { 0x2123, 56010 },
+ { 0x2124, 74576 },
+ { 0x2125, 21731 },
+ { 0x2126, 6813 },
+ { 0x2127, 53346 },
+ { 0x2128, 69399 },
+ { 0x2129, 37676 },
+ { 0x212A, 34094 },
+ { 0x212B, 44717 },
+ { 0x212C, 35824 },
+ { 0x212D, 69387 },
+ { 0x212E, 63380 },
+ { 0x212F, 35812 },
+ { 0x2130, 35827 },
+ { 0x2131, 35830 },
+ { 0x2132, 37684 },
+ { 0x2133, 35842 },
+ { 0x2134, 35821 },
+ { 0x2135, 8716 },
+ { 0x2136, 4380 },
+ { 0x2137, 10636 },
+ { 0x2138, 10477 },
+ { 0x2139, 69246 },
+ { 0x213A, 43017 },
+ { 0x213B, 63383 },
+ { 0x213C, 74532 },
+ { 0x213D, 74535 },
+ { 0x213E, 74582 },
+ { 0x213F, 74579 },
+ { 0x2140, 74529 },
+ { 0x2141, 37689 },
+ { 0x2142, 37693 },
+ { 0x2143, 55507 },
+ { 0x2144, 37697 },
+ { 0x2145, 74554 },
+ { 0x2146, 74538 },
+ { 0x2147, 74542 },
+ { 0x2148, 74546 },
+ { 0x2149, 74550 },
+ { 0x214A, 55384 },
+ { 0x214B, 37687 },
+ { 0x214C, 7168 },
+ { 0x214D, 69338 },
+ { 0x214E, 37681 },
+ { 0x214F, 36848 },
+ { 0x2153, 37724 },
+ { 0x2154, 37740 },
+ { 0x2155, 37716 },
+ { 0x2156, 37736 },
+ { 0x2157, 37760 },
+ { 0x2158, 37752 },
+ { 0x2159, 37720 },
+ { 0x215A, 37744 },
+ { 0x215B, 37728 },
+ { 0x215C, 37764 },
+ { 0x215D, 37748 },
+ { 0x215E, 37756 },
+ { 0x215F, 51781 },
+ { 0x2160, 22020 },
+ { 0x2161, 22057 },
+ { 0x2162, 22095 },
+ { 0x2163, 22071 },
+ { 0x2164, 22060 },
+ { 0x2165, 22042 },
+ { 0x2166, 22092 },
+ { 0x2167, 22077 },
+ { 0x2168, 22074 },
+ { 0x2169, 22050 },
+ { 0x216A, 22098 },
+ { 0x216B, 22101 },
+ { 0x216C, 22080 },
+ { 0x216D, 22023 },
+ { 0x216E, 22063 },
+ { 0x216F, 22032 },
+ { 0x2170, 22521 },
+ { 0x2171, 22543 },
+ { 0x2172, 22576 },
+ { 0x2173, 22556 },
+ { 0x2174, 22547 },
+ { 0x2175, 22535 },
+ { 0x2176, 22572 },
+ { 0x2177, 22564 },
+ { 0x2178, 22560 },
+ { 0x2179, 22539 },
+ { 0x217A, 22580 },
+ { 0x217B, 22584 },
+ { 0x217C, 22568 },
+ { 0x217D, 22525 },
+ { 0x217E, 22551 },
+ { 0x217F, 22530 },
+ { 0x2180, 22036 },
+ { 0x2181, 22067 },
+ { 0x2182, 22053 },
+ { 0x2183, 22104 },
+ { 0x2184, 17753 },
+ { 0x2185, 22045 },
+ { 0x2186, 22083 },
+ { 0x2187, 22088 },
+ { 0x2188, 22027 },
+ { 0x2190, 64325 },
+ { 0x2191, 44542 },
+ { 0x2192, 67992 },
+ { 0x2193, 63251 },
+ { 0x2194, 9258 },
+ { 0x2195, 303 },
+ { 0x2196, 21324 },
+ { 0x2197, 21277 },
+ { 0x2198, 22674 },
+ { 0x2199, 22713 },
+ { 0x219A, 64414 },
+ { 0x219B, 68077 },
+ { 0x219C, 64322 },
+ { 0x219D, 67989 },
+ { 0x219E, 64318 },
+ { 0x219F, 44538 },
+ { 0x21A0, 67985 },
+ { 0x21A1, 63247 },
+ { 0x21A2, 64384 },
+ { 0x21A3, 68042 },
+ { 0x21A4, 64345 },
+ { 0x21A5, 44548 },
+ { 0x21A6, 68003 },
+ { 0x21A7, 63257 },
+ { 0x21A8, 306 },
+ { 0x21A9, 64371 },
+ { 0x21AA, 68029 },
+ { 0x21AB, 64375 },
+ { 0x21AC, 68033 },
+ { 0x21AD, 9254 },
+ { 0x21AE, 9268 },
+ { 0x21AF, 63312 },
+ { 0x21B0, 44552 },
+ { 0x21B1, 44557 },
+ { 0x21B2, 63261 },
+ { 0x21B3, 63266 },
+ { 0x21B4, 68061 },
+ { 0x21B5, 63271 },
+ { 0x21B6, 74484 },
+ { 0x21B7, 57362 },
+ { 0x21B8, 21327 },
+ { 0x21B9, 64331 },
+ { 0x21BA, 74488 },
+ { 0x21BB, 57366 },
+ { 0x21BC, 64592 },
+ { 0x21BD, 64597 },
+ { 0x21BE, 44689 },
+ { 0x21BF, 44684 },
+ { 0x21C0, 68257 },
+ { 0x21C1, 68262 },
+ { 0x21C2, 63370 },
+ { 0x21C3, 63365 },
+ { 0x21C4, 68014 },
+ { 0x21C5, 44572 },
+ { 0x21C6, 64356 },
+ { 0x21C7, 64500 },
+ { 0x21C8, 44628 },
+ { 0x21C9, 68165 },
+ { 0x21CA, 63306 },
+ { 0x21CB, 64510 },
+ { 0x21CC, 68175 },
+ { 0x21CD, 64486 },
+ { 0x21CE, 9297 },
+ { 0x21CF, 68151 },
+ { 0x21D0, 64478 },
+ { 0x21D1, 44625 },
+ { 0x21D2, 68143 },
+ { 0x21D3, 63303 },
+ { 0x21D4, 9293 },
+ { 0x21D5, 319 },
+ { 0x21D6, 21365 },
+ { 0x21D7, 21314 },
+ { 0x21D8, 22709 },
+ { 0x21D9, 22736 },
+ { 0x21DA, 64507 },
+ { 0x21DB, 68172 },
+ { 0x21DC, 64602 },
+ { 0x21DD, 68267 },
+ { 0x21DE, 44562 },
+ { 0x21DF, 63276 },
+ { 0x21E0, 64471 },
+ { 0x21E1, 44622 },
+ { 0x21E2, 68136 },
+ { 0x21E3, 63300 },
+ { 0x21E4, 64327 },
+ { 0x21E5, 67994 },
+ { 0x21E6, 64468 },
+ { 0x21E7, 44581 },
+ { 0x21E8, 68128 },
+ { 0x21E9, 63295 },
+ { 0x21EA, 44605 },
+ { 0x21EB, 44584 },
+ { 0x21EC, 44597 },
+ { 0x21ED, 44589 },
+ { 0x21EE, 44610 },
+ { 0x21EF, 44614 },
+ { 0x21F0, 68131 },
+ { 0x21F1, 21333 },
+ { 0x21F2, 22677 },
+ { 0x21F3, 315 },
+ { 0x21F4, 21805 },
+ { 0x21F5, 63286 },
+ { 0x21F6, 22995 },
+ { 0x21F7, 64418 },
+ { 0x21F8, 68081 },
+ { 0x21F9, 9273 },
+ { 0x21FA, 64408 },
+ { 0x21FB, 68071 },
+ { 0x21FC, 9261 },
+ { 0x21FD, 64655 },
+ { 0x21FE, 68320 },
+ { 0x21FF, 9310 },
+ { 0x2200, 5791 },
+ { 0x2201, 66842 },
+ { 0x2202, 42971 },
+ { 0x2203, 22987 },
+ { 0x2204, 22983 },
+ { 0x2205, 10570 },
+ { 0x2206, 64305 },
+ { 0x2207, 21268 },
+ { 0x2208, 40500 },
+ { 0x2209, 6719 },
+ { 0x220A, 22599 },
+ { 0x220B, 48398 },
+ { 0x220C, 9033 },
+ { 0x220D, 22626 },
+ { 0x220E, 5788 },
+ { 0x220F, 21260 },
+ { 0x2210, 21262 },
+ { 0x2211, 21264 },
+ { 0x2212, 21178 },
+ { 0x2213, 74623 },
+ { 0x2214, 5780 },
+ { 0x2215, 50310 },
+ { 0x2216, 7176 },
+ { 0x2217, 45082 },
+ { 0x2218, 9706 },
+ { 0x2219, 30313 },
+ { 0x221A, 36200 },
+ { 0x221B, 9013 },
+ { 0x221C, 31785 },
+ { 0x221D, 74470 },
+ { 0x221E, 53300 },
+ { 0x221F, 21771 },
+ { 0x2220, 10106 },
+ { 0x2221, 53732 },
+ { 0x2222, 65815 },
+ { 0x2223, 40489 },
+ { 0x2224, 9023 },
+ { 0x2225, 54946 },
+ { 0x2226, 6764 },
+ { 0x2227, 40959 },
+ { 0x2228, 40927 },
+ { 0x2229, 69570 },
+ { 0x222A, 23058 },
+ { 0x222B, 53306 },
+ { 0x222C, 31664 },
+ { 0x222D, 37633 },
+ { 0x222E, 39790 },
+ { 0x222F, 43581 },
+ { 0x2230, 37710 },
+ { 0x2231, 57381 },
+ { 0x2232, 57378 },
+ { 0x2233, 74500 },
+ { 0x2234, 66307 },
+ { 0x2235, 37781 },
+ { 0x2236, 21746 },
+ { 0x2237, 67972 },
+ { 0x2238, 5784 },
+ { 0x2239, 31766 },
+ { 0x223A, 63794 },
+ { 0x223B, 67635 },
+ { 0x223C, 23021 },
+ { 0x223D, 55470 },
+ { 0x223E, 53349 },
+ { 0x223F, 9708 },
+ { 0x2240, 37772 },
+ { 0x2241, 6733 },
+ { 0x2242, 21204 },
+ { 0x2243, 75048 },
+ { 0x2244, 6777 },
+ { 0x2245, 74516 },
+ { 0x2246, 74505 },
+ { 0x2247, 42821 },
+ { 0x2248, 23692 },
+ { 0x2249, 6735 },
+ { 0x224A, 23687 },
+ { 0x224B, 37621 },
+ { 0x224C, 4011 },
+ { 0x224D, 67226 },
+ { 0x224E, 74602 },
+ { 0x224F, 67222 },
+ { 0x2250, 66827 },
+ { 0x2251, 74599 },
+ { 0x2252, 74519 },
+ { 0x2253, 13722 },
+ { 0x2254, 10458 },
+ { 0x2255, 31764 },
+ { 0x2256, 9695 },
+ { 0x2257, 9701 },
+ { 0x2258, 68616 },
+ { 0x2259, 63382 },
+ { 0x225A, 68654 },
+ { 0x225B, 9718 },
+ { 0x225C, 10479 },
+ { 0x225D, 10596 },
+ { 0x225E, 53730 },
+ { 0x225F, 67976 },
+ { 0x2260, 6730 },
+ { 0x2261, 64292 },
+ { 0x2262, 6767 },
+ { 0x2263, 55525 },
+ { 0x2264, 64658 },
+ { 0x2265, 69429 },
+ { 0x2266, 64722 },
+ { 0x2267, 69493 },
+ { 0x2268, 64712 },
+ { 0x2269, 69483 },
+ { 0x226A, 9599 },
+ { 0x226B, 9601 },
+ { 0x226C, 38099 },
+ { 0x226D, 6772 },
+ { 0x226E, 6770 },
+ { 0x226F, 6775 },
+ { 0x2270, 42793 },
+ { 0x2271, 42807 },
+ { 0x2272, 64692 },
+ { 0x2273, 69466 },
+ { 0x2274, 42798 },
+ { 0x2275, 42816 },
+ { 0x2276, 64699 },
+ { 0x2277, 69463 },
+ { 0x2278, 42803 },
+ { 0x2279, 42812 },
+ { 0x227A, 55334 },
+ { 0x227B, 55528 },
+ { 0x227C, 55335 },
+ { 0x227D, 55529 },
+ { 0x227E, 55339 },
+ { 0x227F, 55533 },
+ { 0x2280, 9052 },
+ { 0x2281, 9060 },
+ { 0x2282, 36469 },
+ { 0x2283, 55576 },
+ { 0x2284, 6711 },
+ { 0x2285, 6715 },
+ { 0x2286, 36471 },
+ { 0x2287, 55578 },
+ { 0x2288, 42779 },
+ { 0x2289, 42786 },
+ { 0x228A, 36484 },
+ { 0x228B, 55591 },
+ { 0x228C, 54875 },
+ { 0x228D, 54878 },
+ { 0x228E, 54876 },
+ { 0x228F, 36310 },
+ { 0x2290, 36425 },
+ { 0x2291, 36320 },
+ { 0x2292, 36435 },
+ { 0x2293, 36092 },
+ { 0x2294, 36094 },
+ { 0x2295, 38882 },
+ { 0x2296, 39182 },
+ { 0x2297, 39184 },
+ { 0x2298, 39468 },
+ { 0x2299, 38871 },
+ { 0x229A, 38884 },
+ { 0x229B, 39462 },
+ { 0x229C, 39194 },
+ { 0x229D, 38874 },
+ { 0x229E, 43560 },
+ { 0x229F, 43562 },
+ { 0x22A0, 43567 },
+ { 0x22A1, 43553 },
+ { 0x22A2, 21769 },
+ { 0x22A3, 9202 },
+ { 0x22A4, 9073 },
+ { 0x22A5, 326 },
+ { 0x22A6, 56111 },
+ { 0x22A7, 35572 },
+ { 0x22A8, 10054 },
+ { 0x22A9, 31782 },
+ { 0x22AA, 37641 },
+ { 0x22AB, 31686 },
+ { 0x22AC, 9020 },
+ { 0x22AD, 6725 },
+ { 0x22AE, 9017 },
+ { 0x22AF, 42772 },
+ { 0x22B0, 55379 },
+ { 0x22B1, 55573 },
+ { 0x22B2, 35580 },
+ { 0x22B3, 48401 },
+ { 0x22B4, 35583 },
+ { 0x22B5, 48405 },
+ { 0x22B6, 54929 },
+ { 0x22B7, 13720 },
+ { 0x22B8, 54874 },
+ { 0x22B9, 64288 },
+ { 0x22BA, 69248 },
+ { 0x22BB, 8711 },
+ { 0x22BC, 9603 },
+ { 0x22BD, 6710 },
+ { 0x22BE, 21773 },
+ { 0x22BF, 21972 },
+ { 0x22C0, 21257 },
+ { 0x22C1, 21254 },
+ { 0x22C2, 21266 },
+ { 0x22C3, 21218 },
+ { 0x22C4, 40327 },
+ { 0x22C5, 5786 },
+ { 0x22C6, 9720 },
+ { 0x22C7, 50312 },
+ { 0x22C8, 30294 },
+ { 0x22C9, 9372 },
+ { 0x22CA, 21899 },
+ { 0x22CB, 9461 },
+ { 0x22CC, 21988 },
+ { 0x22CD, 55472 },
+ { 0x22CE, 10471 },
+ { 0x22CF, 10474 },
+ { 0x22D0, 31610 },
+ { 0x22D1, 31673 },
+ { 0x22D2, 31698 },
+ { 0x22D3, 31585 },
+ { 0x22D4, 65756 },
+ { 0x22D5, 10616 },
+ { 0x22D6, 64728 },
+ { 0x22D7, 69499 },
+ { 0x22D8, 10057 },
+ { 0x22D9, 10060 },
+ { 0x22DA, 64775 },
+ { 0x22DB, 69546 },
+ { 0x22DC, 10608 },
+ { 0x22DD, 10612 },
+ { 0x22DE, 10600 },
+ { 0x22DF, 10604 },
+ { 0x22E0, 9055 },
+ { 0x22E1, 9063 },
+ { 0x22E2, 6750 },
+ { 0x22E3, 6757 },
+ { 0x22E4, 36313 },
+ { 0x22E5, 36428 },
+ { 0x22E6, 64717 },
+ { 0x22E7, 69488 },
+ { 0x22E8, 55343 },
+ { 0x22E9, 55537 },
+ { 0x22EA, 6739 },
+ { 0x22EB, 9038 },
+ { 0x22EC, 6743 },
+ { 0x22ED, 9044 },
+ { 0x22EE, 56096 },
+ { 0x22EF, 41192 },
+ { 0x22F0, 337 },
+ { 0x22F1, 9080 },
+ { 0x22F2, 40513 },
+ { 0x22F3, 40527 },
+ { 0x22F4, 22607 },
+ { 0x22F5, 40502 },
+ { 0x22F6, 40519 },
+ { 0x22F7, 22602 },
+ { 0x22F8, 40523 },
+ { 0x22F9, 40507 },
+ { 0x22FA, 48412 },
+ { 0x22FB, 48420 },
+ { 0x22FC, 22634 },
+ { 0x22FD, 48417 },
+ { 0x22FE, 22630 },
+ { 0x22FF, 12 },
+ { 0x2300, 50306 },
+ { 0x2301, 50318 },
+ { 0x2302, 13719 },
+ { 0x2303, 341 },
+ { 0x2304, 9084 },
+ { 0x2305, 67971 },
+ { 0x2306, 69271 },
+ { 0x2307, 10080 },
+ { 0x2308, 9431 },
+ { 0x2309, 21958 },
+ { 0x230A, 9249 },
+ { 0x230B, 21842 },
+ { 0x230C, 30268 },
+ { 0x230D, 30255 },
+ { 0x230E, 7747 },
+ { 0x230F, 7734 },
+ { 0x2310, 55456 },
+ { 0x2311, 36399 },
+ { 0x2312, 4379 },
+ { 0x2313, 43024 },
+ { 0x2314, 35851 },
+ { 0x2315, 66045 },
+ { 0x2316, 55332 },
+ { 0x2317, 56102 },
+ { 0x2318, 21735 },
+ { 0x2319, 37671 },
+ { 0x231A, 23154 },
+ { 0x231B, 64291 },
+ { 0x231C, 7741 },
+ { 0x231D, 7754 },
+ { 0x231E, 30262 },
+ { 0x231F, 30275 },
+ { 0x2320, 7731 },
+ { 0x2321, 30252 },
+ { 0x2322, 10635 },
+ { 0x2323, 22670 },
+ { 0x2324, 343 },
+ { 0x2325, 35641 },
+ { 0x2326, 10624 },
+ { 0x2327, 7 },
+ { 0x2328, 53725 },
+ { 0x2329, 74605 },
+ { 0x232A, 75087 },
+ { 0x232B, 10620 },
+ { 0x232C, 38093 },
+ { 0x232D, 69402 },
+ { 0x232E, 4014 },
+ { 0x232F, 55656 },
+ { 0x2330, 23053 },
+ { 0x2331, 63245 },
+ { 0x2332, 39788 },
+ { 0x2333, 22479 },
+ { 0x2334, 68618 },
+ { 0x2335, 68619 },
+ { 0x2336, 4325 },
+ { 0x2337, 4329 },
+ { 0x2338, 4159 },
+ { 0x2339, 4174 },
+ { 0x233A, 4179 },
+ { 0x233B, 4132 },
+ { 0x233C, 4169 },
+ { 0x233D, 4305 },
+ { 0x233E, 4295 },
+ { 0x233F, 4276 },
+ { 0x2340, 4349 },
+ { 0x2341, 4164 },
+ { 0x2342, 4195 },
+ { 0x2343, 4212 },
+ { 0x2344, 4223 },
+ { 0x2345, 4359 },
+ { 0x2346, 4369 },
+ { 0x2347, 4206 },
+ { 0x2348, 4217 },
+ { 0x2349, 4315 },
+ { 0x234A, 4090 },
+ { 0x234B, 4247 },
+ { 0x234C, 4143 },
+ { 0x234D, 4154 },
+ { 0x234E, 4084 },
+ { 0x234F, 4344 },
+ { 0x2350, 4184 },
+ { 0x2351, 4031 },
+ { 0x2352, 4049 },
+ { 0x2353, 4121 },
+ { 0x2354, 4127 },
+ { 0x2355, 4025 },
+ { 0x2356, 4354 },
+ { 0x2357, 4200 },
+ { 0x2358, 4271 },
+ { 0x2359, 4252 },
+ { 0x235A, 4334 },
+ { 0x235B, 4064 },
+ { 0x235C, 4310 },
+ { 0x235D, 4019 },
+ { 0x235E, 4266 },
+ { 0x235F, 4300 },
+ { 0x2360, 4149 },
+ { 0x2361, 4037 },
+ { 0x2362, 4059 },
+ { 0x2363, 4228 },
+ { 0x2364, 4069 },
+ { 0x2365, 4320 },
+ { 0x2366, 4078 },
+ { 0x2367, 4111 },
+ { 0x2368, 4286 },
+ { 0x2369, 4374 },
+ { 0x236A, 4242 },
+ { 0x236B, 4054 },
+ { 0x236C, 4291 },
+ { 0x236D, 4281 },
+ { 0x236E, 4364 },
+ { 0x236F, 4137 },
+ { 0x2370, 4190 },
+ { 0x2371, 4096 },
+ { 0x2372, 4043 },
+ { 0x2373, 4102 },
+ { 0x2374, 4074 },
+ { 0x2375, 4257 },
+ { 0x2376, 4237 },
+ { 0x2377, 4339 },
+ { 0x2378, 4106 },
+ { 0x2379, 4261 },
+ { 0x237A, 4233 },
+ { 0x237B, 6727 },
+ { 0x237C, 21777 },
+ { 0x237D, 68594 },
+ { 0x237E, 8721 },
+ { 0x237F, 56078 },
+ { 0x2380, 64306 },
+ { 0x2381, 66843 },
+ { 0x2382, 74526 },
+ { 0x2383, 50320 },
+ { 0x2384, 68613 },
+ { 0x2385, 23322 },
+ { 0x2386, 10594 },
+ { 0x2387, 68603 },
+ { 0x2388, 9125 },
+ { 0x2389, 39769 },
+ { 0x238A, 39614 },
+ { 0x238B, 30307 },
+ { 0x238C, 10055 },
+ { 0x238D, 67877 },
+ { 0x238E, 67663 },
+ { 0x238F, 75142 },
+ { 0x2390, 75145 },
+ { 0x2391, 75150 },
+ { 0x2392, 75148 },
+ { 0x2393, 31220 },
+ { 0x2394, 75137 },
+ { 0x2395, 4117 },
+ { 0x2396, 39959 },
+ { 0x2397, 55382 },
+ { 0x2398, 9604 },
+ { 0x2399, 21743 },
+ { 0x239A, 10449 },
+ { 0x239B, 9470 },
+ { 0x239C, 9474 },
+ { 0x239D, 9466 },
+ { 0x239E, 21997 },
+ { 0x239F, 22001 },
+ { 0x23A0, 21993 },
+ { 0x23A1, 9419 },
+ { 0x23A2, 9424 },
+ { 0x23A3, 9414 },
+ { 0x23A4, 21946 },
+ { 0x23A5, 21951 },
+ { 0x23A6, 21941 },
+ { 0x23A7, 9239 },
+ { 0x23A8, 9244 },
+ { 0x23A9, 9234 },
+ { 0x23AA, 10468 },
+ { 0x23AB, 21832 },
+ { 0x23AC, 21837 },
+ { 0x23AD, 21827 },
+ { 0x23AE, 53342 },
+ { 0x23AF, 67638 },
+ { 0x23B0, 23099 },
+ { 0x23B1, 23123 },
+ { 0x23B2, 65859 },
+ { 0x23B3, 65864 },
+ { 0x23B4, 7757 },
+ { 0x23B5, 30278 },
+ { 0x23B6, 30281 },
+ { 0x23B7, 42979 },
+ { 0x23B8, 9457 },
+ { 0x23B9, 21984 },
+ { 0x23BA, 67646 },
+ { 0x23BB, 67649 },
+ { 0x23BC, 67652 },
+ { 0x23BD, 67655 },
+ { 0x23BE, 63205 },
+ { 0x23BF, 63225 },
+ { 0x23C0, 63232 },
+ { 0x23C1, 63182 },
+ { 0x23C2, 63152 },
+ { 0x23C3, 63238 },
+ { 0x23C4, 63190 },
+ { 0x23C5, 63160 },
+ { 0x23C6, 63212 },
+ { 0x23C7, 63174 },
+ { 0x23C8, 63144 },
+ { 0x23C9, 63168 },
+ { 0x23CA, 63138 },
+ { 0x23CB, 63198 },
+ { 0x23CC, 63218 },
+ { 0x23CD, 36165 },
+ { 0x23CE, 35797 },
+ { 0x23CF, 10568 },
+ { 0x23D0, 56083 },
+ { 0x23D1, 53857 },
+ { 0x23D2, 53853 },
+ { 0x23D3, 53859 },
+ { 0x23D4, 53848 },
+ { 0x23D5, 53839 },
+ { 0x23D6, 53844 },
+ { 0x23D7, 53863 },
+ { 0x23D8, 53867 },
+ { 0x23D9, 53865 },
+ { 0x23DA, 10541 },
+ { 0x23DB, 9119 },
+ { 0x23DC, 7764 },
+ { 0x23DD, 30292 },
+ { 0x23DE, 7744 },
+ { 0x23DF, 30265 },
+ { 0x23E0, 7760 },
+ { 0x23E1, 30288 },
+ { 0x23E2, 23412 },
+ { 0x23E3, 38095 },
+ { 0x23E4, 74477 },
+ { 0x23E5, 51778 },
+ { 0x23E6, 67 },
+ { 0x23E7, 67224 },
+ { 0x2400, 36757 },
+ { 0x2401, 36784 },
+ { 0x2402, 36779 },
+ { 0x2403, 36716 },
+ { 0x2404, 36726 },
+ { 0x2405, 36827 },
+ { 0x2406, 36864 },
+ { 0x2407, 36737 },
+ { 0x2408, 36845 },
+ { 0x2409, 36852 },
+ { 0x240A, 36753 },
+ { 0x240B, 36841 },
+ { 0x240C, 36749 },
+ { 0x240D, 36833 },
+ { 0x240E, 36772 },
+ { 0x240F, 36768 },
+ { 0x2410, 36740 },
+ { 0x2411, 36800 },
+ { 0x2412, 36805 },
+ { 0x2413, 36815 },
+ { 0x2414, 36810 },
+ { 0x2415, 36837 },
+ { 0x2416, 36867 },
+ { 0x2417, 36731 },
+ { 0x2418, 36789 },
+ { 0x2419, 36721 },
+ { 0x241A, 36856 },
+ { 0x241B, 36820 },
+ { 0x241C, 36745 },
+ { 0x241D, 36764 },
+ { 0x241E, 36823 },
+ { 0x241F, 36760 },
+ { 0x2420, 36776 },
+ { 0x2421, 36792 },
+ { 0x2422, 10376 },
+ { 0x2423, 9606 },
+ { 0x2424, 36830 },
+ { 0x2425, 36795 },
+ { 0x2426, 36859 },
+ { 0x2440, 6791 },
+ { 0x2441, 6793 },
+ { 0x2442, 6789 },
+ { 0x2443, 6810 },
+ { 0x2444, 6784 },
+ { 0x2445, 6781 },
+ { 0x2446, 6799 },
+ { 0x2447, 6795 },
+ { 0x2448, 6787 },
+ { 0x2449, 6806 },
+ { 0x244A, 6803 },
+ { 0x2460, 38887 },
+ { 0x2461, 38893 },
+ { 0x2462, 38914 },
+ { 0x2463, 38899 },
+ { 0x2464, 38896 },
+ { 0x2465, 38890 },
+ { 0x2466, 38911 },
+ { 0x2467, 38908 },
+ { 0x2468, 38902 },
+ { 0x2469, 39306 },
+ { 0x246A, 39351 },
+ { 0x246B, 39393 },
+ { 0x246C, 39450 },
+ { 0x246D, 39444 },
+ { 0x246E, 39435 },
+ { 0x246F, 39438 },
+ { 0x2470, 39453 },
+ { 0x2471, 39441 },
+ { 0x2472, 39447 },
+ { 0x2473, 39396 },
+ { 0x2474, 74628 },
+ { 0x2475, 74634 },
+ { 0x2476, 74652 },
+ { 0x2477, 74640 },
+ { 0x2478, 74637 },
+ { 0x2479, 74631 },
+ { 0x247A, 74649 },
+ { 0x247B, 74646 },
+ { 0x247C, 74643 },
+ { 0x247D, 74896 },
+ { 0x247E, 74899 },
+ { 0x247F, 74902 },
+ { 0x2480, 74923 },
+ { 0x2481, 74917 },
+ { 0x2482, 74908 },
+ { 0x2483, 74911 },
+ { 0x2484, 74926 },
+ { 0x2485, 74914 },
+ { 0x2486, 74920 },
+ { 0x2487, 74905 },
+ { 0x2488, 10484 },
+ { 0x2489, 10496 },
+ { 0x248A, 10534 },
+ { 0x248B, 10508 },
+ { 0x248C, 10502 },
+ { 0x248D, 10490 },
+ { 0x248E, 10528 },
+ { 0x248F, 10522 },
+ { 0x2490, 10514 },
+ { 0x2491, 35589 },
+ { 0x2492, 35595 },
+ { 0x2493, 35599 },
+ { 0x2494, 35627 },
+ { 0x2495, 35619 },
+ { 0x2496, 35607 },
+ { 0x2497, 35611 },
+ { 0x2498, 35631 },
+ { 0x2499, 35615 },
+ { 0x249A, 35623 },
+ { 0x249B, 35603 },
+ { 0x249C, 74655 },
+ { 0x249D, 74660 },
+ { 0x249E, 74665 },
+ { 0x249F, 74670 },
+ { 0x24A0, 74675 },
+ { 0x24A1, 74680 },
+ { 0x24A2, 74685 },
+ { 0x24A3, 74690 },
+ { 0x24A4, 74695 },
+ { 0x24A5, 74700 },
+ { 0x24A6, 74705 },
+ { 0x24A7, 74710 },
+ { 0x24A8, 74715 },
+ { 0x24A9, 74720 },
+ { 0x24AA, 74725 },
+ { 0x24AB, 74730 },
+ { 0x24AC, 74735 },
+ { 0x24AD, 74740 },
+ { 0x24AE, 74745 },
+ { 0x24AF, 74750 },
+ { 0x24B0, 74755 },
+ { 0x24B1, 74760 },
+ { 0x24B2, 74765 },
+ { 0x24B3, 74770 },
+ { 0x24B4, 74775 },
+ { 0x24B5, 74780 },
+ { 0x24B6, 39052 },
+ { 0x24B7, 39057 },
+ { 0x24B8, 39062 },
+ { 0x24B9, 39067 },
+ { 0x24BA, 39072 },
+ { 0x24BB, 39077 },
+ { 0x24BC, 39082 },
+ { 0x24BD, 39087 },
+ { 0x24BE, 39092 },
+ { 0x24BF, 39097 },
+ { 0x24C0, 39102 },
+ { 0x24C1, 39107 },
+ { 0x24C2, 39112 },
+ { 0x24C3, 39117 },
+ { 0x24C4, 39122 },
+ { 0x24C5, 39127 },
+ { 0x24C6, 39132 },
+ { 0x24C7, 39137 },
+ { 0x24C8, 39142 },
+ { 0x24C9, 39147 },
+ { 0x24CA, 39152 },
+ { 0x24CB, 39157 },
+ { 0x24CC, 39162 },
+ { 0x24CD, 39167 },
+ { 0x24CE, 39172 },
+ { 0x24CF, 39177 },
+ { 0x24D0, 38922 },
+ { 0x24D1, 38927 },
+ { 0x24D2, 38932 },
+ { 0x24D3, 38937 },
+ { 0x24D4, 38942 },
+ { 0x24D5, 38947 },
+ { 0x24D6, 38952 },
+ { 0x24D7, 38957 },
+ { 0x24D8, 38962 },
+ { 0x24D9, 38967 },
+ { 0x24DA, 38972 },
+ { 0x24DB, 38977 },
+ { 0x24DC, 38982 },
+ { 0x24DD, 38987 },
+ { 0x24DE, 38992 },
+ { 0x24DF, 38997 },
+ { 0x24E0, 39002 },
+ { 0x24E1, 39007 },
+ { 0x24E2, 39012 },
+ { 0x24E3, 39017 },
+ { 0x24E4, 39022 },
+ { 0x24E5, 39027 },
+ { 0x24E6, 39032 },
+ { 0x24E7, 39037 },
+ { 0x24E8, 39042 },
+ { 0x24E9, 39047 },
+ { 0x24EA, 38905 },
+ { 0x24EB, 54887 },
+ { 0x24EC, 54891 },
+ { 0x24ED, 54919 },
+ { 0x24EE, 54911 },
+ { 0x24EF, 54899 },
+ { 0x24F0, 54903 },
+ { 0x24F1, 54923 },
+ { 0x24F2, 54907 },
+ { 0x24F3, 54915 },
+ { 0x24F4, 54895 },
+ { 0x24F5, 31612 },
+ { 0x24F6, 31620 },
+ { 0x24F7, 31644 },
+ { 0x24F8, 31628 },
+ { 0x24F9, 31624 },
+ { 0x24FA, 31616 },
+ { 0x24FB, 31640 },
+ { 0x24FC, 31636 },
+ { 0x24FD, 31632 },
+ { 0x24FE, 31648 },
+ { 0x24FF, 54883 },
+ { 0x2500, 5020 },
+ { 0x2501, 4841 },
+ { 0x2502, 4986 },
+ { 0x2503, 4807 },
+ { 0x2504, 4957 },
+ { 0x2505, 4801 },
+ { 0x2506, 4951 },
+ { 0x2507, 4795 },
+ { 0x2508, 5014 },
+ { 0x2509, 4835 },
+ { 0x250A, 5008 },
+ { 0x250B, 4829 },
+ { 0x250C, 4912 },
+ { 0x250D, 4595 },
+ { 0x250E, 4550 },
+ { 0x250F, 4756 },
+ { 0x2510, 4906 },
+ { 0x2511, 4580 },
+ { 0x2512, 4535 },
+ { 0x2513, 4750 },
+ { 0x2514, 4862 },
+ { 0x2515, 4463 },
+ { 0x2516, 4418 },
+ { 0x2517, 4734 },
+ { 0x2518, 4849 },
+ { 0x2519, 4448 },
+ { 0x251A, 4403 },
+ { 0x251B, 4721 },
+ { 0x251C, 4996 },
+ { 0x251D, 5180 },
+ { 0x251E, 4410 },
+ { 0x251F, 4542 },
+ { 0x2520, 5159 },
+ { 0x2521, 4587 },
+ { 0x2522, 4455 },
+ { 0x2523, 4817 },
+ { 0x2524, 4990 },
+ { 0x2525, 5173 },
+ { 0x2526, 4395 },
+ { 0x2527, 4527 },
+ { 0x2528, 5152 },
+ { 0x2529, 4572 },
+ { 0x252A, 4440 },
+ { 0x252B, 4811 },
+ { 0x252C, 4918 },
+ { 0x252D, 4677 },
+ { 0x252E, 5050 },
+ { 0x252F, 4602 },
+ { 0x2530, 4557 },
+ { 0x2531, 5074 },
+ { 0x2532, 4701 },
+ { 0x2533, 4762 },
+ { 0x2534, 4868 },
+ { 0x2535, 4669 },
+ { 0x2536, 5042 },
+ { 0x2537, 4470 },
+ { 0x2538, 4425 },
+ { 0x2539, 5066 },
+ { 0x253A, 4693 },
+ { 0x253B, 4740 },
+ { 0x253C, 5002 },
+ { 0x253D, 4685 },
+ { 0x253E, 5058 },
+ { 0x253F, 5187 },
+ { 0x2540, 4387 },
+ { 0x2541, 4519 },
+ { 0x2542, 5166 },
+ { 0x2543, 4651 },
+ { 0x2544, 5024 },
+ { 0x2545, 4660 },
+ { 0x2546, 5033 },
+ { 0x2547, 4564 },
+ { 0x2548, 4432 },
+ { 0x2549, 5082 },
+ { 0x254A, 4709 },
+ { 0x254B, 4823 },
+ { 0x254C, 4945 },
+ { 0x254D, 4789 },
+ { 0x254E, 4939 },
+ { 0x254F, 4783 },
+ { 0x2550, 5148 },
+ { 0x2551, 5126 },
+ { 0x2552, 4637 },
+ { 0x2553, 4616 },
+ { 0x2554, 5114 },
+ { 0x2555, 4630 },
+ { 0x2556, 4609 },
+ { 0x2557, 5108 },
+ { 0x2558, 4505 },
+ { 0x2559, 4484 },
+ { 0x255A, 5096 },
+ { 0x255B, 4498 },
+ { 0x255C, 4477 },
+ { 0x255D, 5090 },
+ { 0x255E, 5222 },
+ { 0x255F, 5201 },
+ { 0x2560, 5136 },
+ { 0x2561, 5215 },
+ { 0x2562, 5194 },
+ { 0x2563, 5130 },
+ { 0x2564, 4644 },
+ { 0x2565, 4623 },
+ { 0x2566, 5120 },
+ { 0x2567, 4512 },
+ { 0x2568, 4491 },
+ { 0x2569, 5102 },
+ { 0x256A, 5229 },
+ { 0x256B, 5208 },
+ { 0x256C, 5142 },
+ { 0x256D, 4895 },
+ { 0x256E, 4888 },
+ { 0x256F, 4874 },
+ { 0x2570, 4881 },
+ { 0x2571, 4977 },
+ { 0x2572, 4968 },
+ { 0x2573, 4963 },
+ { 0x2574, 4924 },
+ { 0x2575, 4845 },
+ { 0x2576, 4935 },
+ { 0x2577, 4902 },
+ { 0x2578, 4768 },
+ { 0x2579, 4717 },
+ { 0x257A, 4779 },
+ { 0x257B, 4746 },
+ { 0x257C, 4928 },
+ { 0x257D, 4855 },
+ { 0x257E, 4772 },
+ { 0x257F, 4727 },
+ { 0x2580, 23088 },
+ { 0x2581, 21094 },
+ { 0x2582, 21098 },
+ { 0x2583, 21168 },
+ { 0x2584, 21106 },
+ { 0x2585, 21102 },
+ { 0x2586, 21172 },
+ { 0x2587, 21164 },
+ { 0x2588, 9114 },
+ { 0x2589, 9314 },
+ { 0x258A, 9322 },
+ { 0x258B, 9191 },
+ { 0x258C, 9199 },
+ { 0x258D, 9318 },
+ { 0x258E, 9156 },
+ { 0x258F, 9152 },
+ { 0x2590, 21766 },
+ { 0x2591, 20870 },
+ { 0x2592, 35535 },
+ { 0x2593, 9015 },
+ { 0x2594, 23084 },
+ { 0x2595, 21755 },
+ { 0x2596, 55386 },
+ { 0x2597, 55389 },
+ { 0x2598, 55392 },
+ { 0x2599, 55395 },
+ { 0x259A, 55404 },
+ { 0x259B, 55410 },
+ { 0x259C, 55419 },
+ { 0x259D, 55428 },
+ { 0x259E, 55431 },
+ { 0x259F, 55437 },
+ { 0x25A0, 10270 },
+ { 0x25A1, 23296 },
+ { 0x25A2, 23328 },
+ { 0x25A3, 23349 },
+ { 0x25A4, 36279 },
+ { 0x25A5, 36271 },
+ { 0x25A6, 36283 },
+ { 0x25A7, 36231 },
+ { 0x25A8, 36246 },
+ { 0x25A9, 36266 },
+ { 0x25AA, 10212 },
+ { 0x25AB, 23225 },
+ { 0x25AC, 10317 },
+ { 0x25AD, 23408 },
+ { 0x25AE, 10309 },
+ { 0x25AF, 23403 },
+ { 0x25B0, 10361 },
+ { 0x25B1, 23461 },
+ { 0x25B2, 10341 },
+ { 0x25B3, 23421 },
+ { 0x25B4, 10337 },
+ { 0x25B5, 23417 },
+ { 0x25B6, 10373 },
+ { 0x25B7, 23473 },
+ { 0x25B8, 10363 },
+ { 0x25B9, 23463 },
+ { 0x25BA, 10367 },
+ { 0x25BB, 23467 },
+ { 0x25BC, 10348 },
+ { 0x25BD, 23448 },
+ { 0x25BE, 10344 },
+ { 0x25BF, 23444 },
+ { 0x25C0, 10358 },
+ { 0x25C1, 23458 },
+ { 0x25C2, 10351 },
+ { 0x25C3, 23451 },
+ { 0x25C4, 10355 },
+ { 0x25C5, 23455 },
+ { 0x25C6, 10272 },
+ { 0x25C7, 23355 },
+ { 0x25C8, 23365 },
+ { 0x25C9, 40556 },
+ { 0x25CA, 40990 },
+ { 0x25CB, 23236 },
+ { 0x25CC, 31533 },
+ { 0x25CD, 30518 },
+ { 0x25CE, 45864 },
+ { 0x25CF, 10238 },
+ { 0x25D0, 30485 },
+ { 0x25D1, 30495 },
+ { 0x25D2, 30490 },
+ { 0x25D3, 30507 },
+ { 0x25D4, 30512 },
+ { 0x25D5, 30469 },
+ { 0x25D6, 9195 },
+ { 0x25D7, 21762 },
+ { 0x25D8, 40639 },
+ { 0x25D9, 40636 },
+ { 0x25DA, 23094 },
+ { 0x25DB, 21112 },
+ { 0x25DC, 23112 },
+ { 0x25DD, 23134 },
+ { 0x25DE, 21141 },
+ { 0x25DF, 21117 },
+ { 0x25E0, 23091 },
+ { 0x25E1, 21109 },
+ { 0x25E2, 10198 },
+ { 0x25E3, 10194 },
+ { 0x25E4, 10224 },
+ { 0x25E5, 10228 },
+ { 0x25E6, 23234 },
+ { 0x25E7, 36207 },
+ { 0x25E8, 36226 },
+ { 0x25E9, 36239 },
+ { 0x25EA, 36219 },
+ { 0x25EB, 23333 },
+ { 0x25EC, 23424 },
+ { 0x25ED, 69326 },
+ { 0x25EE, 69332 },
+ { 0x25EF, 14464 },
+ { 0x25F0, 23310 },
+ { 0x25F1, 23298 },
+ { 0x25F2, 23304 },
+ { 0x25F3, 23316 },
+ { 0x25F4, 23265 },
+ { 0x25F5, 23253 },
+ { 0x25F6, 23259 },
+ { 0x25F7, 23271 },
+ { 0x25F8, 23117 },
+ { 0x25F9, 23144 },
+ { 0x25FA, 21122 },
+ { 0x25FB, 23284 },
+ { 0x25FC, 10261 },
+ { 0x25FD, 23280 },
+ { 0x25FE, 10257 },
+ { 0x25FF, 21151 },
+ { 0x2600, 10141 },
+ { 0x2601, 10454 },
+ { 0x2602, 56004 },
+ { 0x2603, 43547 },
+ { 0x2604, 10460 },
+ { 0x2605, 10161 },
+ { 0x2606, 23185 },
+ { 0x2607, 64791 },
+ { 0x2608, 74480 },
+ { 0x2609, 7188 },
+ { 0x260A, 56109 },
+ { 0x260B, 66846 },
+ { 0x260C, 68615 },
+ { 0x260D, 67880 },
+ { 0x260E, 10319 },
+ { 0x260F, 23410 },
+ { 0x2610, 30232 },
+ { 0x2611, 30238 },
+ { 0x2612, 30234 },
+ { 0x2613, 43020 },
+ { 0x2614, 56005 },
+ { 0x2615, 5795 },
+ { 0x2616, 23219 },
+ { 0x2617, 10206 },
+ { 0x2618, 55522 },
+ { 0x2619, 55497 },
+ { 0x261A, 10154 },
+ { 0x261B, 10202 },
+ { 0x261C, 23181 },
+ { 0x261D, 23158 },
+ { 0x261E, 23215 },
+ { 0x261F, 23171 },
+ { 0x2620, 22476 },
+ { 0x2621, 38868 },
+ { 0x2622, 69274 },
+ { 0x2623, 56112 },
+ { 0x2624, 45865 },
+ { 0x2625, 8718 },
+ { 0x2626, 54931 },
+ { 0x2627, 5236 },
+ { 0x2628, 10462 },
+ { 0x2629, 10465 },
+ { 0x262A, 9715 },
+ { 0x262B, 10630 },
+ { 0x262C, 4009 },
+ { 0x262D, 31881 },
+ { 0x262E, 21733 },
+ { 0x262F, 8714 },
+ { 0x2630, 44529 },
+ { 0x2631, 44517 },
+ { 0x2632, 44514 },
+ { 0x2633, 44532 },
+ { 0x2634, 44520 },
+ { 0x2635, 44526 },
+ { 0x2636, 44535 },
+ { 0x2637, 44523 },
+ { 0x2638, 23155 },
+ { 0x2639, 23384 },
+ { 0x263A, 23373 },
+ { 0x263B, 10291 },
+ { 0x263C, 23164 },
+ { 0x263D, 10632 },
+ { 0x263E, 9132 },
+ { 0x263F, 41191 },
+ { 0x2640, 31767 },
+ { 0x2641, 10540 },
+ { 0x2642, 9580 },
+ { 0x2643, 40641 },
+ { 0x2644, 35810 },
+ { 0x2645, 37705 },
+ { 0x2646, 42827 },
+ { 0x2647, 21739 },
+ { 0x2648, 10114 },
+ { 0x2649, 37129 },
+ { 0x264A, 31790 },
+ { 0x264B, 30317 },
+ { 0x264C, 6030 },
+ { 0x264D, 23153 },
+ { 0x264E, 20857 },
+ { 0x264F, 55511 },
+ { 0x2650, 69278 },
+ { 0x2651, 57359 },
+ { 0x2652, 44719 },
+ { 0x2653, 35653 },
+ { 0x2654, 23191 },
+ { 0x2655, 23200 },
+ { 0x2656, 23197 },
+ { 0x2657, 23203 },
+ { 0x2658, 23206 },
+ { 0x2659, 23194 },
+ { 0x265A, 10167 },
+ { 0x265B, 10176 },
+ { 0x265C, 10173 },
+ { 0x265D, 10179 },
+ { 0x265E, 10182 },
+ { 0x265F, 10170 },
+ { 0x2660, 10221 },
+ { 0x2661, 23209 },
+ { 0x2662, 23357 },
+ { 0x2663, 10145 },
+ { 0x2664, 23231 },
+ { 0x2665, 10185 },
+ { 0x2666, 10274 },
+ { 0x2667, 23168 },
+ { 0x2668, 5793 },
+ { 0x2669, 42977 },
+ { 0x266A, 31704 },
+ { 0x266B, 30242 },
+ { 0x266C, 30245 },
+ { 0x266D, 21206 },
+ { 0x266E, 21212 },
+ { 0x266F, 21209 },
+ { 0x2670, 10084 },
+ { 0x2671, 9086 },
+ { 0x2672, 66308 },
+ { 0x2673, 65768 },
+ { 0x2674, 65773 },
+ { 0x2675, 65778 },
+ { 0x2676, 65783 },
+ { 0x2677, 65788 },
+ { 0x2678, 65793 },
+ { 0x2679, 65798 },
+ { 0x267A, 65803 },
+ { 0x267B, 10321 },
+ { 0x267C, 55452 },
+ { 0x267D, 75139 },
+ { 0x267E, 65753 },
+ { 0x267F, 68601 },
+ { 0x2680, 5768 },
+ { 0x2681, 5770 },
+ { 0x2682, 5772 },
+ { 0x2683, 5774 },
+ { 0x2684, 5776 },
+ { 0x2685, 5778 },
+ { 0x2686, 23238 },
+ { 0x2687, 23243 },
+ { 0x2688, 10251 },
+ { 0x2689, 10240 },
+ { 0x268A, 54868 },
+ { 0x268B, 54865 },
+ { 0x268C, 31212 },
+ { 0x268D, 31192 },
+ { 0x268E, 31196 },
+ { 0x268F, 31208 },
+ { 0x2690, 23175 },
+ { 0x2691, 10148 },
+ { 0x2692, 31878 },
+ { 0x2693, 23701 },
+ { 0x2694, 39792 },
+ { 0x2695, 22748 },
+ { 0x2696, 35811 },
+ { 0x2697, 37778 },
+ { 0x2698, 31778 },
+ { 0x2699, 9120 },
+ { 0x269A, 22745 },
+ { 0x269B, 8719 },
+ { 0x269C, 69423 },
+ { 0x269D, 54942 },
+ { 0x26A0, 44705 },
+ { 0x26A1, 9127 },
+ { 0x26A2, 40495 },
+ { 0x26A3, 40492 },
+ { 0x26A4, 69258 },
+ { 0x26A5, 9576 },
+ { 0x26A6, 9590 },
+ { 0x26A7, 9582 },
+ { 0x26A8, 56086 },
+ { 0x26A9, 67641 },
+ { 0x26AA, 35541 },
+ { 0x26AB, 35523 },
+ { 0x26AC, 35537 },
+ { 0x26AD, 53728 },
+ { 0x26AE, 40490 },
+ { 0x26AF, 66311 },
+ { 0x26B0, 30571 },
+ { 0x26B1, 40558 },
+ { 0x26B2, 35579 },
+ { 0x26B3, 10446 },
+ { 0x26B4, 35649 },
+ { 0x26B5, 9131 },
+ { 0x26B6, 23152 },
+ { 0x26B7, 30468 },
+ { 0x26B8, 10158 },
+ { 0x26B9, 43027 },
+ { 0x26BA, 69279 },
+ { 0x26BB, 55451 },
+ { 0x26BC, 75099 },
+ { 0x26C0, 23376 },
+ { 0x26C1, 23379 },
+ { 0x26C2, 10294 },
+ { 0x26C3, 10297 },
+ { 0x2701, 23120 },
+ { 0x2702, 10304 },
+ { 0x2703, 21130 },
+ { 0x2704, 23389 },
+ { 0x2706, 66042 },
+ { 0x2707, 9722 },
+ { 0x2708, 44716 },
+ { 0x2709, 50322 },
+ { 0x270C, 44703 },
+ { 0x270D, 44707 },
+ { 0x270E, 21138 },
+ { 0x270F, 35650 },
+ { 0x2710, 23131 },
+ { 0x2711, 23162 },
+ { 0x2712, 10139 },
+ { 0x2713, 10447 },
+ { 0x2714, 13551 },
+ { 0x2715, 75053 },
+ { 0x2716, 13671 },
+ { 0x2717, 30230 },
+ { 0x2718, 13593 },
+ { 0x2719, 54936 },
+ { 0x271A, 13565 },
+ { 0x271B, 9612 },
+ { 0x271C, 13530 },
+ { 0x271D, 14471 },
+ { 0x271E, 55515 },
+ { 0x271F, 54939 },
+ { 0x2720, 41189 },
+ { 0x2721, 9712 },
+ { 0x2722, 9109 },
+ { 0x2723, 9106 },
+ { 0x2724, 13526 },
+ { 0x2725, 9103 },
+ { 0x2726, 10150 },
+ { 0x2727, 23177 },
+ { 0x2729, 36465 },
+ { 0x272A, 39186 },
+ { 0x272B, 9608 },
+ { 0x272C, 10234 },
+ { 0x272D, 54933 },
+ { 0x272E, 13634 },
+ { 0x272F, 55330 },
+ { 0x2730, 55512 },
+ { 0x2731, 13632 },
+ { 0x2732, 9615 },
+ { 0x2733, 10543 },
+ { 0x2734, 10546 },
+ { 0x2735, 10550 },
+ { 0x2736, 7178 },
+ { 0x2737, 10554 },
+ { 0x2738, 13554 },
+ { 0x2739, 37701 },
+ { 0x273A, 43505 },
+ { 0x273B, 75114 },
+ { 0x273C, 9618 },
+ { 0x273D, 13704 },
+ { 0x273E, 7182 },
+ { 0x273F, 10300 },
+ { 0x2740, 23382 },
+ { 0x2741, 10559 },
+ { 0x2742, 38876 },
+ { 0x2743, 13707 },
+ { 0x2744, 65814 },
+ { 0x2745, 23005 },
+ { 0x2746, 13627 },
+ { 0x2747, 43552 },
+ { 0x2748, 13630 },
+ { 0x2749, 75051 },
+ { 0x274A, 10564 },
+ { 0x274B, 13560 },
+ { 0x274D, 55519 },
+ { 0x274F, 21159 },
+ { 0x2750, 23147 },
+ { 0x2751, 21146 },
+ { 0x2752, 23139 },
+ { 0x2756, 10282 },
+ { 0x2758, 20872 },
+ { 0x2759, 35544 },
+ { 0x275A, 13638 },
+ { 0x275B, 13620 },
+ { 0x275C, 13614 },
+ { 0x275D, 13607 },
+ { 0x275E, 13601 },
+ { 0x2761, 31164 },
+ { 0x2762, 13644 },
+ { 0x2763, 13568 },
+ { 0x2764, 13534 },
+ { 0x2765, 43008 },
+ { 0x2766, 31776 },
+ { 0x2767, 43013 },
+ { 0x2768, 35519 },
+ { 0x2769, 35531 },
+ { 0x276A, 35547 },
+ { 0x276B, 35552 },
+ { 0x276C, 35560 },
+ { 0x276D, 35565 },
+ { 0x276E, 13665 },
+ { 0x276F, 13679 },
+ { 0x2770, 13660 },
+ { 0x2771, 13674 },
+ { 0x2772, 20858 },
+ { 0x2773, 20864 },
+ { 0x2774, 35514 },
+ { 0x2775, 35526 },
+ { 0x2776, 40379 },
+ { 0x2777, 40389 },
+ { 0x2778, 40419 },
+ { 0x2779, 40399 },
+ { 0x277A, 40394 },
+ { 0x277B, 40384 },
+ { 0x277C, 40414 },
+ { 0x277D, 40409 },
+ { 0x277E, 40404 },
+ { 0x277F, 40424 },
+ { 0x2780, 40329 },
+ { 0x2781, 40339 },
+ { 0x2782, 40369 },
+ { 0x2783, 40349 },
+ { 0x2784, 40344 },
+ { 0x2785, 40334 },
+ { 0x2786, 40364 },
+ { 0x2787, 40359 },
+ { 0x2788, 40354 },
+ { 0x2789, 40374 },
+ { 0x278A, 40429 },
+ { 0x278B, 40441 },
+ { 0x278C, 40477 },
+ { 0x278D, 40453 },
+ { 0x278E, 40447 },
+ { 0x278F, 40435 },
+ { 0x2790, 40471 },
+ { 0x2791, 40465 },
+ { 0x2792, 40459 },
+ { 0x2793, 40483 },
+ { 0x2794, 13648 },
+ { 0x2798, 13583 },
+ { 0x2799, 13641 },
+ { 0x279A, 13579 },
+ { 0x279B, 50314 },
+ { 0x279C, 13652 },
+ { 0x279D, 75116 },
+ { 0x279E, 13711 },
+ { 0x279F, 31175 },
+ { 0x27A0, 13596 },
+ { 0x27A1, 10328 },
+ { 0x27A2, 43645 },
+ { 0x27A3, 43649 },
+ { 0x27A4, 10334 },
+ { 0x27A5, 13544 },
+ { 0x27A6, 13537 },
+ { 0x27A7, 22741 },
+ { 0x27A8, 13699 },
+ { 0x27A9, 74472 },
+ { 0x27AA, 69264 },
+ { 0x27AB, 68606 },
+ { 0x27AC, 69424 },
+ { 0x27AD, 13573 },
+ { 0x27AE, 13587 },
+ { 0x27AF, 42831 },
+ { 0x27B1, 42837 },
+ { 0x27B2, 38917 },
+ { 0x27B3, 75119 },
+ { 0x27B4, 75104 },
+ { 0x27B5, 75108 },
+ { 0x27B6, 75100 },
+ { 0x27B7, 13690 },
+ { 0x27B8, 13695 },
+ { 0x27B9, 13685 },
+ { 0x27BA, 75111 },
+ { 0x27BB, 13715 },
+ { 0x27BC, 74481 },
+ { 0x27BD, 13656 },
+ { 0x27BE, 74625 },
+ { 0x27C0, 23002 },
+ { 0x27C1, 23391 },
+ { 0x27C2, 75037 },
+ { 0x27C3, 9622 },
+ { 0x27C4, 9624 },
+ { 0x27C5, 9435 },
+ { 0x27C6, 21960 },
+ { 0x27C7, 271 },
+ { 0x27C8, 43004 },
+ { 0x27C9, 55653 },
+ { 0x27CA, 56011 },
+ { 0x27CC, 9530 },
+ { 0x27D0, 23360 },
+ { 0x27D1, 4016 },
+ { 0x27D2, 40537 },
+ { 0x27D3, 21133 },
+ { 0x27D4, 23107 },
+ { 0x27D5, 9251 },
+ { 0x27D6, 21844 },
+ { 0x27D7, 9116 },
+ { 0x27D8, 14454 },
+ { 0x27D9, 14457 },
+ { 0x27DA, 9139 },
+ { 0x27DB, 9135 },
+ { 0x27DC, 9433 },
+ { 0x27DD, 9527 },
+ { 0x27DE, 9515 },
+ { 0x27DF, 328 },
+ { 0x27E0, 40991 },
+ { 0x27E1, 23429 },
+ { 0x27E2, 23432 },
+ { 0x27E3, 23438 },
+ { 0x27E4, 23339 },
+ { 0x27E5, 23344 },
+ { 0x27E6, 71159 },
+ { 0x27E7, 71183 },
+ { 0x27E8, 71155 },
+ { 0x27E9, 71179 },
+ { 0x27EA, 71170 },
+ { 0x27EB, 71194 },
+ { 0x27EC, 71164 },
+ { 0x27ED, 71188 },
+ { 0x27EE, 71175 },
+ { 0x27EF, 71199 },
+ { 0x27F0, 44694 },
+ { 0x27F1, 63375 },
+ { 0x27F2, 74496 },
+ { 0x27F3, 57374 },
+ { 0x27F4, 21810 },
+ { 0x27F5, 9532 },
+ { 0x27F6, 9554 },
+ { 0x27F7, 9518 },
+ { 0x27F8, 9540 },
+ { 0x27F9, 9562 },
+ { 0x27FA, 9522 },
+ { 0x27FB, 9535 },
+ { 0x27FC, 9557 },
+ { 0x27FD, 9544 },
+ { 0x27FE, 9566 },
+ { 0x27FF, 9572 },
+ { 0x2800, 38100 },
+ { 0x2801, 38103 },
+ { 0x2802, 38106 },
+ { 0x2803, 38127 },
+ { 0x2804, 38109 },
+ { 0x2805, 38130 },
+ { 0x2806, 38148 },
+ { 0x2807, 38211 },
+ { 0x2808, 38112 },
+ { 0x2809, 38133 },
+ { 0x280A, 38151 },
+ { 0x280B, 38214 },
+ { 0x280C, 38166 },
+ { 0x280D, 38229 },
+ { 0x280E, 38274 },
+ { 0x280F, 38379 },
+ { 0x2810, 38115 },
+ { 0x2811, 38136 },
+ { 0x2812, 38154 },
+ { 0x2813, 38217 },
+ { 0x2814, 38169 },
+ { 0x2815, 38232 },
+ { 0x2816, 38277 },
+ { 0x2817, 38382 },
+ { 0x2818, 38181 },
+ { 0x2819, 38244 },
+ { 0x281A, 38289 },
+ { 0x281B, 38394 },
+ { 0x281C, 38319 },
+ { 0x281D, 38424 },
+ { 0x281E, 38484 },
+ { 0x281F, 38589 },
+ { 0x2820, 38118 },
+ { 0x2821, 38139 },
+ { 0x2822, 38157 },
+ { 0x2823, 38220 },
+ { 0x2824, 38172 },
+ { 0x2825, 38235 },
+ { 0x2826, 38280 },
+ { 0x2827, 38385 },
+ { 0x2828, 38184 },
+ { 0x2829, 38247 },
+ { 0x282A, 38292 },
+ { 0x282B, 38397 },
+ { 0x282C, 38322 },
+ { 0x282D, 38427 },
+ { 0x282E, 38487 },
+ { 0x282F, 38592 },
+ { 0x2830, 38193 },
+ { 0x2831, 38256 },
+ { 0x2832, 38301 },
+ { 0x2833, 38406 },
+ { 0x2834, 38331 },
+ { 0x2835, 38436 },
+ { 0x2836, 38496 },
+ { 0x2837, 38601 },
+ { 0x2838, 38349 },
+ { 0x2839, 38454 },
+ { 0x283A, 38514 },
+ { 0x283B, 38619 },
+ { 0x283C, 38544 },
+ { 0x283D, 38649 },
+ { 0x283E, 38694 },
+ { 0x283F, 38757 },
+ { 0x2840, 38121 },
+ { 0x2841, 38142 },
+ { 0x2842, 38160 },
+ { 0x2843, 38223 },
+ { 0x2844, 38175 },
+ { 0x2845, 38238 },
+ { 0x2846, 38283 },
+ { 0x2847, 38388 },
+ { 0x2848, 38187 },
+ { 0x2849, 38250 },
+ { 0x284A, 38295 },
+ { 0x284B, 38400 },
+ { 0x284C, 38325 },
+ { 0x284D, 38430 },
+ { 0x284E, 38490 },
+ { 0x284F, 38595 },
+ { 0x2850, 38196 },
+ { 0x2851, 38259 },
+ { 0x2852, 38304 },
+ { 0x2853, 38409 },
+ { 0x2854, 38334 },
+ { 0x2855, 38439 },
+ { 0x2856, 38499 },
+ { 0x2857, 38604 },
+ { 0x2858, 38352 },
+ { 0x2859, 38457 },
+ { 0x285A, 38517 },
+ { 0x285B, 38622 },
+ { 0x285C, 38547 },
+ { 0x285D, 38652 },
+ { 0x285E, 38697 },
+ { 0x285F, 38760 },
+ { 0x2860, 38202 },
+ { 0x2861, 38265 },
+ { 0x2862, 38310 },
+ { 0x2863, 38415 },
+ { 0x2864, 38340 },
+ { 0x2865, 38445 },
+ { 0x2866, 38505 },
+ { 0x2867, 38610 },
+ { 0x2868, 38358 },
+ { 0x2869, 38463 },
+ { 0x286A, 38523 },
+ { 0x286B, 38628 },
+ { 0x286C, 38553 },
+ { 0x286D, 38658 },
+ { 0x286E, 38703 },
+ { 0x286F, 38766 },
+ { 0x2870, 38367 },
+ { 0x2871, 38472 },
+ { 0x2872, 38532 },
+ { 0x2873, 38637 },
+ { 0x2874, 38562 },
+ { 0x2875, 38667 },
+ { 0x2876, 38712 },
+ { 0x2877, 38775 },
+ { 0x2878, 38574 },
+ { 0x2879, 38679 },
+ { 0x287A, 38724 },
+ { 0x287B, 38787 },
+ { 0x287C, 38739 },
+ { 0x287D, 38802 },
+ { 0x287E, 38820 },
+ { 0x287F, 38841 },
+ { 0x2880, 38124 },
+ { 0x2881, 38145 },
+ { 0x2882, 38163 },
+ { 0x2883, 38226 },
+ { 0x2884, 38178 },
+ { 0x2885, 38241 },
+ { 0x2886, 38286 },
+ { 0x2887, 38391 },
+ { 0x2888, 38190 },
+ { 0x2889, 38253 },
+ { 0x288A, 38298 },
+ { 0x288B, 38403 },
+ { 0x288C, 38328 },
+ { 0x288D, 38433 },
+ { 0x288E, 38493 },
+ { 0x288F, 38598 },
+ { 0x2890, 38199 },
+ { 0x2891, 38262 },
+ { 0x2892, 38307 },
+ { 0x2893, 38412 },
+ { 0x2894, 38337 },
+ { 0x2895, 38442 },
+ { 0x2896, 38502 },
+ { 0x2897, 38607 },
+ { 0x2898, 38355 },
+ { 0x2899, 38460 },
+ { 0x289A, 38520 },
+ { 0x289B, 38625 },
+ { 0x289C, 38550 },
+ { 0x289D, 38655 },
+ { 0x289E, 38700 },
+ { 0x289F, 38763 },
+ { 0x28A0, 38205 },
+ { 0x28A1, 38268 },
+ { 0x28A2, 38313 },
+ { 0x28A3, 38418 },
+ { 0x28A4, 38343 },
+ { 0x28A5, 38448 },
+ { 0x28A6, 38508 },
+ { 0x28A7, 38613 },
+ { 0x28A8, 38361 },
+ { 0x28A9, 38466 },
+ { 0x28AA, 38526 },
+ { 0x28AB, 38631 },
+ { 0x28AC, 38556 },
+ { 0x28AD, 38661 },
+ { 0x28AE, 38706 },
+ { 0x28AF, 38769 },
+ { 0x28B0, 38370 },
+ { 0x28B1, 38475 },
+ { 0x28B2, 38535 },
+ { 0x28B3, 38640 },
+ { 0x28B4, 38565 },
+ { 0x28B5, 38670 },
+ { 0x28B6, 38715 },
+ { 0x28B7, 38778 },
+ { 0x28B8, 38577 },
+ { 0x28B9, 38682 },
+ { 0x28BA, 38727 },
+ { 0x28BB, 38790 },
+ { 0x28BC, 38742 },
+ { 0x28BD, 38805 },
+ { 0x28BE, 38823 },
+ { 0x28BF, 38844 },
+ { 0x28C0, 38208 },
+ { 0x28C1, 38271 },
+ { 0x28C2, 38316 },
+ { 0x28C3, 38421 },
+ { 0x28C4, 38346 },
+ { 0x28C5, 38451 },
+ { 0x28C6, 38511 },
+ { 0x28C7, 38616 },
+ { 0x28C8, 38364 },
+ { 0x28C9, 38469 },
+ { 0x28CA, 38529 },
+ { 0x28CB, 38634 },
+ { 0x28CC, 38559 },
+ { 0x28CD, 38664 },
+ { 0x28CE, 38709 },
+ { 0x28CF, 38772 },
+ { 0x28D0, 38373 },
+ { 0x28D1, 38478 },
+ { 0x28D2, 38538 },
+ { 0x28D3, 38643 },
+ { 0x28D4, 38568 },
+ { 0x28D5, 38673 },
+ { 0x28D6, 38718 },
+ { 0x28D7, 38781 },
+ { 0x28D8, 38580 },
+ { 0x28D9, 38685 },
+ { 0x28DA, 38730 },
+ { 0x28DB, 38793 },
+ { 0x28DC, 38745 },
+ { 0x28DD, 38808 },
+ { 0x28DE, 38826 },
+ { 0x28DF, 38847 },
+ { 0x28E0, 38376 },
+ { 0x28E1, 38481 },
+ { 0x28E2, 38541 },
+ { 0x28E3, 38646 },
+ { 0x28E4, 38571 },
+ { 0x28E5, 38676 },
+ { 0x28E6, 38721 },
+ { 0x28E7, 38784 },
+ { 0x28E8, 38583 },
+ { 0x28E9, 38688 },
+ { 0x28EA, 38733 },
+ { 0x28EB, 38796 },
+ { 0x28EC, 38748 },
+ { 0x28ED, 38811 },
+ { 0x28EE, 38829 },
+ { 0x28EF, 38850 },
+ { 0x28F0, 38586 },
+ { 0x28F1, 38691 },
+ { 0x28F2, 38736 },
+ { 0x28F3, 38799 },
+ { 0x28F4, 38751 },
+ { 0x28F5, 38814 },
+ { 0x28F6, 38832 },
+ { 0x28F7, 38853 },
+ { 0x28F8, 38754 },
+ { 0x28F9, 38817 },
+ { 0x28FA, 38835 },
+ { 0x28FB, 38856 },
+ { 0x28FC, 38838 },
+ { 0x28FD, 38859 },
+ { 0x28FE, 38862 },
+ { 0x28FF, 38865 },
+ { 0x2900, 68309 },
+ { 0x2901, 68302 },
+ { 0x2902, 64491 },
+ { 0x2903, 68156 },
+ { 0x2904, 9303 },
+ { 0x2905, 68275 },
+ { 0x2906, 64481 },
+ { 0x2907, 68146 },
+ { 0x2908, 63281 },
+ { 0x2909, 44567 },
+ { 0x290A, 44631 },
+ { 0x290B, 63309 },
+ { 0x290C, 64474 },
+ { 0x290D, 68139 },
+ { 0x290E, 64503 },
+ { 0x290F, 68168 },
+ { 0x2910, 68315 },
+ { 0x2911, 68066 },
+ { 0x2912, 44544 },
+ { 0x2913, 63253 },
+ { 0x2914, 68054 },
+ { 0x2915, 68046 },
+ { 0x2916, 68280 },
+ { 0x2917, 68294 },
+ { 0x2918, 68285 },
+ { 0x2919, 64608 },
+ { 0x291A, 68273 },
+ { 0x291B, 64497 },
+ { 0x291C, 68162 },
+ { 0x291D, 64340 },
+ { 0x291E, 67998 },
+ { 0x291F, 64349 },
+ { 0x2920, 68007 },
+ { 0x2921, 21318 },
+ { 0x2922, 21271 },
+ { 0x2923, 21345 },
+ { 0x2924, 21287 },
+ { 0x2925, 22689 },
+ { 0x2926, 22723 },
+ { 0x2927, 21338 },
+ { 0x2928, 21280 },
+ { 0x2929, 22682 },
+ { 0x292A, 22716 },
+ { 0x292B, 35805 },
+ { 0x292C, 40551 },
+ { 0x292D, 22694 },
+ { 0x292E, 21299 },
+ { 0x292F, 40545 },
+ { 0x2930, 35799 },
+ { 0x2931, 21292 },
+ { 0x2932, 21350 },
+ { 0x2933, 10070 },
+ { 0x2934, 10127 },
+ { 0x2935, 10133 },
+ { 0x2936, 10115 },
+ { 0x2937, 10121 },
+ { 0x2938, 67981 },
+ { 0x2939, 64314 },
+ { 0x293A, 7721 },
+ { 0x293B, 30248 },
+ { 0x293C, 7715 },
+ { 0x293D, 7725 },
+ { 0x293E, 21154 },
+ { 0x293F, 21125 },
+ { 0x2940, 74492 },
+ { 0x2941, 57370 },
+ { 0x2942, 68086 },
+ { 0x2943, 64423 },
+ { 0x2944, 22470 },
+ { 0x2945, 68037 },
+ { 0x2946, 64379 },
+ { 0x2947, 68116 },
+ { 0x2948, 9279 },
+ { 0x2949, 44697 },
+ { 0x294A, 9167 },
+ { 0x294B, 9174 },
+ { 0x294C, 289 },
+ { 0x294D, 282 },
+ { 0x294E, 9160 },
+ { 0x294F, 296 },
+ { 0x2950, 9181 },
+ { 0x2951, 275 },
+ { 0x2952, 64515 },
+ { 0x2953, 68180 },
+ { 0x2954, 44670 },
+ { 0x2955, 63351 },
+ { 0x2956, 64559 },
+ { 0x2957, 68224 },
+ { 0x2958, 44634 },
+ { 0x2959, 63315 },
+ { 0x295A, 64522 },
+ { 0x295B, 68187 },
+ { 0x295C, 44677 },
+ { 0x295D, 63358 },
+ { 0x295E, 64566 },
+ { 0x295F, 68231 },
+ { 0x2960, 44641 },
+ { 0x2961, 63322 },
+ { 0x2962, 64537 },
+ { 0x2963, 44648 },
+ { 0x2964, 68213 },
+ { 0x2965, 63340 },
+ { 0x2966, 64548 },
+ { 0x2967, 64573 },
+ { 0x2968, 68202 },
+ { 0x2969, 68238 },
+ { 0x296A, 64529 },
+ { 0x296B, 64584 },
+ { 0x296C, 68194 },
+ { 0x296D, 68249 },
+ { 0x296E, 44659 },
+ { 0x296F, 63329 },
+ { 0x2970, 21882 },
+ { 0x2971, 31756 },
+ { 0x2972, 23038 },
+ { 0x2973, 64429 },
+ { 0x2974, 68092 },
+ { 0x2975, 68097 },
+ { 0x2976, 64759 },
+ { 0x2977, 64461 },
+ { 0x2978, 69536 },
+ { 0x2979, 36531 },
+ { 0x297A, 64457 },
+ { 0x297B, 55638 },
+ { 0x297C, 9188 },
+ { 0x297D, 21759 },
+ { 0x297E, 323 },
+ { 0x297F, 9070 },
+ { 0x2980, 37651 },
+ { 0x2981, 26 },
+ { 0x2982, 29 },
+ { 0x2983, 9326 },
+ { 0x2984, 21847 },
+ { 0x2985, 9347 },
+ { 0x2986, 21868 },
+ { 0x2987, 16 },
+ { 0x2988, 37 },
+ { 0x2989, 21 },
+ { 0x298A, 42 },
+ { 0x298B, 9409 },
+ { 0x298C, 21936 },
+ { 0x298D, 9388 },
+ { 0x298E, 21923 },
+ { 0x298F, 9396 },
+ { 0x2990, 21915 },
+ { 0x2991, 9207 },
+ { 0x2992, 21791 },
+ { 0x2993, 9144 },
+ { 0x2994, 21747 },
+ { 0x2995, 31554 },
+ { 0x2996, 31580 },
+ { 0x2997, 9222 },
+ { 0x2998, 21815 },
+ { 0x2999, 31531 },
+ { 0x299A, 56093 },
+ { 0x299B, 53830 },
+ { 0x299C, 21796 },
+ { 0x299D, 53834 },
+ { 0x299E, 10107 },
+ { 0x299F, 10102 },
+ { 0x29A0, 65821 },
+ { 0x29A1, 65817 },
+ { 0x29A2, 37674 },
+ { 0x29A3, 55459 },
+ { 0x29A4, 10111 },
+ { 0x29A5, 55461 },
+ { 0x29A6, 42843 },
+ { 0x29A7, 42847 },
+ { 0x29A8, 53746 },
+ { 0x29A9, 53734 },
+ { 0x29AA, 53770 },
+ { 0x29AB, 53758 },
+ { 0x29AC, 53806 },
+ { 0x29AD, 53782 },
+ { 0x29AE, 53818 },
+ { 0x29AF, 53794 },
+ { 0x29B0, 55465 },
+ { 0x29B1, 10590 },
+ { 0x29B2, 10584 },
+ { 0x29B3, 10578 },
+ { 0x29B4, 10572 },
+ { 0x29B5, 30522 },
+ { 0x29B6, 39617 },
+ { 0x29B7, 39612 },
+ { 0x29B8, 39459 },
+ { 0x29B9, 39776 },
+ { 0x29BA, 30530 },
+ { 0x29BB, 30526 },
+ { 0x29BC, 39784 },
+ { 0x29BD, 333 },
+ { 0x29BE, 39189 },
+ { 0x29BF, 39192 },
+ { 0x29C0, 39767 },
+ { 0x29C1, 39774 },
+ { 0x29C2, 30500 },
+ { 0x29C3, 30477 },
+ { 0x29C4, 43569 },
+ { 0x29C5, 43575 },
+ { 0x29C6, 43579 },
+ { 0x29C7, 43564 },
+ { 0x29C8, 43573 },
+ { 0x29C9, 7778 },
+ { 0x29CA, 55898 },
+ { 0x29CB, 55907 },
+ { 0x29CC, 4 },
+ { 0x29CD, 55902 },
+ { 0x29CE, 21974 },
+ { 0x29CF, 9447 },
+ { 0x29D0, 56016 },
+ { 0x29D1, 30295 },
+ { 0x29D2, 30300 },
+ { 0x29D3, 10232 },
+ { 0x29D4, 23043 },
+ { 0x29D5, 23048 },
+ { 0x29D6, 23406 },
+ { 0x29D7, 10312 },
+ { 0x29D8, 9428 },
+ { 0x29D9, 21955 },
+ { 0x29DA, 9361 },
+ { 0x29DB, 21888 },
+ { 0x29DC, 67665 },
+ { 0x29DD, 7712 },
+ { 0x29DE, 53301 },
+ { 0x29DF, 69403 },
+ { 0x29E0, 36275 },
+ { 0x29E1, 64303 },
+ { 0x29E2, 43172 },
+ { 0x29E3, 31708 },
+ { 0x29E4, 31713 },
+ { 0x29E5, 64294 },
+ { 0x29E6, 31794 },
+ { 0x29E7, 75047 },
+ { 0x29E8, 74585 },
+ { 0x29E9, 74591 },
+ { 0x29EA, 10277 },
+ { 0x29EB, 10289 },
+ { 0x29EC, 23248 },
+ { 0x29ED, 10246 },
+ { 0x29EE, 69417 },
+ { 0x29EF, 69408 },
+ { 0x29F0, 69420 },
+ { 0x29F1, 69411 },
+ { 0x29F2, 69414 },
+ { 0x29F3, 69405 },
+ { 0x29F4, 74476 },
+ { 0x29F5, 43001 },
+ { 0x29F6, 43549 },
+ { 0x29F7, 42996 },
+ { 0x29F8, 4385 },
+ { 0x29F9, 4382 },
+ { 0x29FA, 31559 },
+ { 0x29FB, 37614 },
+ { 0x29FC, 74608 },
+ { 0x29FD, 75090 },
+ { 0x29FE, 10053 },
+ { 0x29FF, 9598 },
+ { 0x2A00, 21242 },
+ { 0x2A01, 21246 },
+ { 0x2A02, 21250 },
+ { 0x2A03, 21220 },
+ { 0x2A04, 21225 },
+ { 0x2A05, 21238 },
+ { 0x2A06, 21234 },
+ { 0x2A07, 7785 },
+ { 0x2A08, 7781 },
+ { 0x2A09, 21215 },
+ { 0x2A0A, 35573 },
+ { 0x2A0B, 65861 },
+ { 0x2A0C, 65763 },
+ { 0x2A0D, 31773 },
+ { 0x2A0E, 53314 },
+ { 0x2A0F, 53338 },
+ { 0x2A10, 68611 },
+ { 0x2A11, 74503 },
+ { 0x2A12, 9491 },
+ { 0x2A13, 9498 },
+ { 0x2A14, 9485 },
+ { 0x2A15, 53333 },
+ { 0x2A16, 67973 },
+ { 0x2A17, 53324 },
+ { 0x2A18, 53307 },
+ { 0x2A19, 53330 },
+ { 0x2A1A, 53311 },
+ { 0x2A1B, 53318 },
+ { 0x2A1C, 53321 },
+ { 0x2A1D, 9130 },
+ { 0x2A1E, 14460 },
+ { 0x2A1F, 59 },
+ { 0x2A20, 51 },
+ { 0x2A21, 55 },
+ { 0x2A22, 9661 },
+ { 0x2A23, 9682 },
+ { 0x2A24, 9667 },
+ { 0x2A25, 9651 },
+ { 0x2A26, 9672 },
+ { 0x2A27, 9677 },
+ { 0x2A28, 9656 },
+ { 0x2A29, 21189 },
+ { 0x2A2A, 21184 },
+ { 0x2A2B, 21199 },
+ { 0x2A2C, 21194 },
+ { 0x2A2D, 9635 },
+ { 0x2A2E, 9641 },
+ { 0x2A2F, 37706 },
+ { 0x2A30, 75078 },
+ { 0x2A31, 75083 },
+ { 0x2A32, 68589 },
+ { 0x2A33, 22668 },
+ { 0x2A34, 75057 },
+ { 0x2A35, 75063 },
+ { 0x2A36, 39778 },
+ { 0x2A37, 75069 },
+ { 0x2A38, 39465 },
+ { 0x2A39, 9647 },
+ { 0x2A3A, 21180 },
+ { 0x2A3B, 75074 },
+ { 0x2A3C, 53344 },
+ { 0x2A3D, 65810 },
+ { 0x2A3E, 63 },
+ { 0x2A3F, 69339 },
+ { 0x2A40, 69571 },
+ { 0x2A41, 23059 },
+ { 0x2A42, 23067 },
+ { 0x2A43, 69578 },
+ { 0x2A44, 69574 },
+ { 0x2A45, 23063 },
+ { 0x2A46, 23075 },
+ { 0x2A47, 69586 },
+ { 0x2A48, 23070 },
+ { 0x2A49, 69581 },
+ { 0x2A4A, 23078 },
+ { 0x2A4B, 69589 },
+ { 0x2A4C, 30542 },
+ { 0x2A4D, 30567 },
+ { 0x2A4E, 31603 },
+ { 0x2A4F, 31600 },
+ { 0x2A50, 30546 },
+ { 0x2A51, 40961 },
+ { 0x2A52, 40929 },
+ { 0x2A53, 31655 },
+ { 0x2A54, 31652 },
+ { 0x2A55, 7801 },
+ { 0x2A56, 7797 },
+ { 0x2A57, 43534 },
+ { 0x2A58, 43537 },
+ { 0x2A59, 40954 },
+ { 0x2A5A, 40976 },
+ { 0x2A5B, 40944 },
+ { 0x2A5C, 40985 },
+ { 0x2A5D, 40949 },
+ { 0x2A5E, 40966 },
+ { 0x2A5F, 40981 },
+ { 0x2A60, 40971 },
+ { 0x2A61, 22483 },
+ { 0x2A62, 40934 },
+ { 0x2A63, 40939 },
+ { 0x2A64, 47 },
+ { 0x2A65, 33 },
+ { 0x2A66, 31721 },
+ { 0x2A67, 64299 },
+ { 0x2A68, 37655 },
+ { 0x2A69, 37662 },
+ { 0x2A6A, 23023 },
+ { 0x2A6B, 23028 },
+ { 0x2A6C, 43192 },
+ { 0x2A6D, 58345 },
+ { 0x2A6E, 31761 },
+ { 0x2A6F, 23695 },
+ { 0x2A70, 74511 },
+ { 0x2A71, 31741 },
+ { 0x2A72, 9688 },
+ { 0x2A73, 31746 },
+ { 0x2A74, 31567 },
+ { 0x2A75, 7793 },
+ { 0x2A76, 22998 },
+ { 0x2A77, 31726 },
+ { 0x2A78, 67228 },
+ { 0x2A79, 64731 },
+ { 0x2A7A, 69502 },
+ { 0x2A7B, 64735 },
+ { 0x2A7C, 69506 },
+ { 0x2A7D, 64662 },
+ { 0x2A7E, 69433 },
+ { 0x2A7F, 64684 },
+ { 0x2A80, 69455 },
+ { 0x2A81, 64667 },
+ { 0x2A82, 69438 },
+ { 0x2A83, 64675 },
+ { 0x2A84, 69446 },
+ { 0x2A85, 64696 },
+ { 0x2A86, 69470 },
+ { 0x2A87, 64706 },
+ { 0x2A88, 69477 },
+ { 0x2A89, 64702 },
+ { 0x2A8A, 69473 },
+ { 0x2A8B, 64763 },
+ { 0x2A8C, 69540 },
+ { 0x2A8D, 64740 },
+ { 0x2A8E, 69511 },
+ { 0x2A8F, 64745 },
+ { 0x2A90, 69516 },
+ { 0x2A91, 64769 },
+ { 0x2A92, 69530 },
+ { 0x2A93, 64750 },
+ { 0x2A94, 69521 },
+ { 0x2A95, 43508 },
+ { 0x2A96, 43521 },
+ { 0x2A97, 43513 },
+ { 0x2A98, 43526 },
+ { 0x2A99, 68620 },
+ { 0x2A9A, 68625 },
+ { 0x2A9B, 68630 },
+ { 0x2A9C, 68636 },
+ { 0x2A9D, 43174 },
+ { 0x2A9E, 43177 },
+ { 0x2A9F, 43180 },
+ { 0x2AA0, 43186 },
+ { 0x2AA1, 31589 },
+ { 0x2AA2, 31597 },
+ { 0x2AA3, 31592 },
+ { 0x2AA4, 69565 },
+ { 0x2AA5, 69551 },
+ { 0x2AA6, 64780 },
+ { 0x2AA7, 69554 },
+ { 0x2AA8, 64784 },
+ { 0x2AA9, 69558 },
+ { 0x2AAA, 43540 },
+ { 0x2AAB, 34099 },
+ { 0x2AAC, 43542 },
+ { 0x2AAD, 34101 },
+ { 0x2AAE, 31736 },
+ { 0x2AAF, 55374 },
+ { 0x2AB0, 55568 },
+ { 0x2AB1, 55368 },
+ { 0x2AB2, 55562 },
+ { 0x2AB3, 55364 },
+ { 0x2AB4, 55558 },
+ { 0x2AB5, 55348 },
+ { 0x2AB6, 55542 },
+ { 0x2AB7, 55359 },
+ { 0x2AB8, 55553 },
+ { 0x2AB9, 55353 },
+ { 0x2ABA, 55547 },
+ { 0x2ABB, 31666 },
+ { 0x2ABC, 31671 },
+ { 0x2ABD, 36512 },
+ { 0x2ABE, 55619 },
+ { 0x2ABF, 36515 },
+ { 0x2AC0, 55622 },
+ { 0x2AC1, 36520 },
+ { 0x2AC2, 55627 },
+ { 0x2AC3, 36476 },
+ { 0x2AC4, 55583 },
+ { 0x2AC5, 36507 },
+ { 0x2AC6, 55614 },
+ { 0x2AC7, 36496 },
+ { 0x2AC8, 55603 },
+ { 0x2AC9, 36501 },
+ { 0x2ACA, 55608 },
+ { 0x2ACB, 36490 },
+ { 0x2ACC, 55597 },
+ { 0x2ACD, 36177 },
+ { 0x2ACE, 36346 },
+ { 0x2ACF, 30553 },
+ { 0x2AD0, 30560 },
+ { 0x2AD1, 30555 },
+ { 0x2AD2, 30562 },
+ { 0x2AD3, 36528 },
+ { 0x2AD4, 55632 },
+ { 0x2AD5, 36525 },
+ { 0x2AD6, 55635 },
+ { 0x2AD7, 55650 },
+ { 0x2AD8, 55642 },
+ { 0x2AD9, 40541 },
+ { 0x2ADA, 65757 },
+ { 0x2ADB, 69324 },
+ { 0x2ADC, 40557 },
+ { 0x2ADD, 67879 },
+ { 0x2ADE, 22467 },
+ { 0x2ADF, 22459 },
+ { 0x2AE0, 22444 },
+ { 0x2AE1, 75038 },
+ { 0x2AE2, 56026 },
+ { 0x2AE3, 31675 },
+ { 0x2AE4, 56021 },
+ { 0x2AE5, 31680 },
+ { 0x2AE6, 9507 },
+ { 0x2AE7, 22462 },
+ { 0x2AE8, 22447 },
+ { 0x2AE9, 22452 },
+ { 0x2AEA, 31551 },
+ { 0x2AEB, 31545 },
+ { 0x2AEC, 31606 },
+ { 0x2AED, 55483 },
+ { 0x2AEE, 9026 },
+ { 0x2AEF, 56068 },
+ { 0x2AF0, 56073 },
+ { 0x2AF1, 9075 },
+ { 0x2AF2, 54952 },
+ { 0x2AF3, 54948 },
+ { 0x2AF4, 37646 },
+ { 0x2AF5, 37635 },
+ { 0x2AF6, 37616 },
+ { 0x2AF7, 37623 },
+ { 0x2AF8, 37626 },
+ { 0x2AF9, 68642 },
+ { 0x2AFA, 68648 },
+ { 0x2AFB, 37629 },
+ { 0x2AFC, 14466 },
+ { 0x2AFD, 31661 },
+ { 0x2AFE, 23397 },
+ { 0x2AFF, 21230 },
+ { 0x2B00, 21310 },
+ { 0x2B01, 21361 },
+ { 0x2B02, 22705 },
+ { 0x2B03, 22732 },
+ { 0x2B04, 9289 },
+ { 0x2B05, 64465 },
+ { 0x2B06, 44578 },
+ { 0x2B07, 63292 },
+ { 0x2B08, 21306 },
+ { 0x2B09, 21357 },
+ { 0x2B0A, 22701 },
+ { 0x2B0B, 22728 },
+ { 0x2B0C, 9285 },
+ { 0x2B0D, 311 },
+ { 0x2B0E, 68024 },
+ { 0x2B0F, 68019 },
+ { 0x2B10, 64366 },
+ { 0x2B11, 64361 },
+ { 0x2B12, 36202 },
+ { 0x2B13, 36261 },
+ { 0x2B14, 36254 },
+ { 0x2B15, 36212 },
+ { 0x2B16, 40312 },
+ { 0x2B17, 40317 },
+ { 0x2B18, 40307 },
+ { 0x2B19, 40322 },
+ { 0x2B1A, 31537 },
+ { 0x2B1B, 10191 },
+ { 0x2B1C, 23212 },
+ { 0x2B1D, 10163 },
+ { 0x2B1E, 23187 },
+ { 0x2B1F, 10302 },
+ { 0x2B20, 23387 },
+ { 0x2B21, 23371 },
+ { 0x2B22, 10287 },
+ { 0x2B23, 67658 },
+ { 0x2B24, 10188 },
+ { 0x2B25, 10264 },
+ { 0x2B26, 23287 },
+ { 0x2B27, 10267 },
+ { 0x2B28, 23290 },
+ { 0x2B29, 10215 },
+ { 0x2B2A, 10218 },
+ { 0x2B2B, 23228 },
+ { 0x2B2C, 10325 },
+ { 0x2B2D, 23414 },
+ { 0x2B2E, 10306 },
+ { 0x2B2F, 23400 },
+ { 0x2B30, 9212 },
+ { 0x2B31, 22992 },
+ { 0x2B32, 9217 },
+ { 0x2B33, 9550 },
+ { 0x2B34, 64644 },
+ { 0x2B35, 64637 },
+ { 0x2B36, 64610 },
+ { 0x2B37, 64650 },
+ { 0x2B38, 64403 },
+ { 0x2B39, 64396 },
+ { 0x2B3A, 64388 },
+ { 0x2B3B, 64615 },
+ { 0x2B3C, 64629 },
+ { 0x2B3D, 64620 },
+ { 0x2B3E, 64453 },
+ { 0x2B3F, 10065 },
+ { 0x2B40, 31751 },
+ { 0x2B41, 42982 },
+ { 0x2B42, 64446 },
+ { 0x2B43, 68124 },
+ { 0x2B44, 68120 },
+ { 0x2B45, 64605 },
+ { 0x2B46, 68270 },
+ { 0x2B47, 42988 },
+ { 0x2B48, 68109 },
+ { 0x2B49, 23033 },
+ { 0x2B4A, 64434 },
+ { 0x2B4B, 64440 },
+ { 0x2B4C, 68103 },
+ { 0x2B50, 23277 },
+ { 0x2B51, 10209 },
+ { 0x2B52, 23222 },
+ { 0x2B53, 10370 },
+ { 0x2B54, 23470 },
+ { 0x2C00, 67450 },
+ { 0x2C01, 67479 },
+ { 0x2C02, 67503 },
+ { 0x2C03, 67579 },
+ { 0x2C04, 67519 },
+ { 0x2C05, 67555 },
+ { 0x2C06, 67621 },
+ { 0x2C07, 67523 },
+ { 0x2C08, 67575 },
+ { 0x2C09, 67491 },
+ { 0x2C0A, 67583 },
+ { 0x2C0B, 67434 },
+ { 0x2C0C, 67563 },
+ { 0x2C0D, 67495 },
+ { 0x2C0E, 67604 },
+ { 0x2C0F, 67608 },
+ { 0x2C10, 67531 },
+ { 0x2C11, 67459 },
+ { 0x2C12, 67567 },
+ { 0x2C13, 67535 },
+ { 0x2C14, 67539 },
+ { 0x2C15, 67571 },
+ { 0x2C16, 67475 },
+ { 0x2C17, 67527 },
+ { 0x2C18, 67487 },
+ { 0x2C19, 67463 },
+ { 0x2C1A, 67438 },
+ { 0x2C1B, 67499 },
+ { 0x2C1C, 67471 },
+ { 0x2C1D, 67559 },
+ { 0x2C1E, 67467 },
+ { 0x2C1F, 67515 },
+ { 0x2C20, 67511 },
+ { 0x2C21, 67507 },
+ { 0x2C22, 67616 },
+ { 0x2C23, 67446 },
+ { 0x2C24, 67543 },
+ { 0x2C25, 67548 },
+ { 0x2C26, 67442 },
+ { 0x2C27, 67594 },
+ { 0x2C28, 67454 },
+ { 0x2C29, 67588 },
+ { 0x2C2A, 67483 },
+ { 0x2C2B, 67600 },
+ { 0x2C2C, 67612 },
+ { 0x2C2D, 67630 },
+ { 0x2C2E, 67625 },
+ { 0x2C30, 67249 },
+ { 0x2C31, 67278 },
+ { 0x2C32, 67302 },
+ { 0x2C33, 67378 },
+ { 0x2C34, 67318 },
+ { 0x2C35, 67354 },
+ { 0x2C36, 67420 },
+ { 0x2C37, 67322 },
+ { 0x2C38, 67374 },
+ { 0x2C39, 67290 },
+ { 0x2C3A, 67382 },
+ { 0x2C3B, 67233 },
+ { 0x2C3C, 67362 },
+ { 0x2C3D, 67294 },
+ { 0x2C3E, 67403 },
+ { 0x2C3F, 67407 },
+ { 0x2C40, 67330 },
+ { 0x2C41, 67258 },
+ { 0x2C42, 67366 },
+ { 0x2C43, 67334 },
+ { 0x2C44, 67338 },
+ { 0x2C45, 67370 },
+ { 0x2C46, 67274 },
+ { 0x2C47, 67326 },
+ { 0x2C48, 67286 },
+ { 0x2C49, 67262 },
+ { 0x2C4A, 67237 },
+ { 0x2C4B, 67298 },
+ { 0x2C4C, 67270 },
+ { 0x2C4D, 67358 },
+ { 0x2C4E, 67266 },
+ { 0x2C4F, 67314 },
+ { 0x2C50, 67310 },
+ { 0x2C51, 67306 },
+ { 0x2C52, 67415 },
+ { 0x2C53, 67245 },
+ { 0x2C54, 67342 },
+ { 0x2C55, 67347 },
+ { 0x2C56, 67241 },
+ { 0x2C57, 67393 },
+ { 0x2C58, 67253 },
+ { 0x2C59, 67387 },
+ { 0x2C5A, 67282 },
+ { 0x2C5B, 67399 },
+ { 0x2C5C, 67411 },
+ { 0x2C5D, 67429 },
+ { 0x2C5E, 67424 },
+ { 0x2C60, 19214 },
+ { 0x2C61, 15577 },
+ { 0x2C62, 19228 },
+ { 0x2C63, 19682 },
+ { 0x2C64, 19762 },
+ { 0x2C65, 14629 },
+ { 0x2C66, 16472 },
+ { 0x2C67, 18936 },
+ { 0x2C68, 15276 },
+ { 0x2C69, 19148 },
+ { 0x2C6A, 15507 },
+ { 0x2C6B, 20410 },
+ { 0x2C6C, 17019 },
+ { 0x2C6D, 20597 },
+ { 0x2C6E, 19272 },
+ { 0x2C6F, 20649 },
+ { 0x2C71, 16751 },
+ { 0x2C72, 20235 },
+ { 0x2C73, 16796 },
+ { 0x2C74, 16739 },
+ { 0x2C75, 20547 },
+ { 0x2C76, 17312 },
+ { 0x2C77, 17839 },
+ { 0x2C78, 14974 },
+ { 0x2C79, 17623 },
+ { 0x2C7A, 15813 },
+ { 0x2C7B, 18125 },
+ { 0x2C7C, 20797 },
+ { 0x2C7D, 54684 },
+ { 0x2C80, 31044 },
+ { 0x2C81, 30751 },
+ { 0x2C82, 31072 },
+ { 0x2C83, 30779 },
+ { 0x2C84, 31084 },
+ { 0x2C85, 30791 },
+ { 0x2C86, 31080 },
+ { 0x2C87, 30787 },
+ { 0x2C88, 30922 },
+ { 0x2C89, 30629 },
+ { 0x2C8A, 31036 },
+ { 0x2C8B, 30743 },
+ { 0x2C8C, 31076 },
+ { 0x2C8D, 30783 },
+ { 0x2C8E, 31048 },
+ { 0x2C8F, 30755 },
+ { 0x2C90, 31108 },
+ { 0x2C91, 30815 },
+ { 0x2C92, 31088 },
+ { 0x2C93, 30795 },
+ { 0x2C94, 31056 },
+ { 0x2C95, 30763 },
+ { 0x2C96, 31092 },
+ { 0x2C97, 30799 },
+ { 0x2C98, 30898 },
+ { 0x2C99, 30605 },
+ { 0x2C9A, 30902 },
+ { 0x2C9B, 30609 },
+ { 0x2C9C, 30934 },
+ { 0x2C9D, 30641 },
+ { 0x2C9E, 30890 },
+ { 0x2C9F, 30597 },
+ { 0x2CA0, 30906 },
+ { 0x2CA1, 30613 },
+ { 0x2CA2, 30910 },
+ { 0x2CA3, 30617 },
+ { 0x2CA4, 31068 },
+ { 0x2CA5, 30775 },
+ { 0x2CA6, 31040 },
+ { 0x2CA7, 30747 },
+ { 0x2CA8, 30914 },
+ { 0x2CA9, 30621 },
+ { 0x2CAA, 30894 },
+ { 0x2CAB, 30601 },
+ { 0x2CAC, 30930 },
+ { 0x2CAD, 30637 },
+ { 0x2CAE, 31032 },
+ { 0x2CAF, 30739 },
+ { 0x2CB0, 31028 },
+ { 0x2CB1, 30735 },
+ { 0x2CB2, 31132 },
+ { 0x2CB3, 30839 },
+ { 0x2CB4, 30944 },
+ { 0x2CB5, 30651 },
+ { 0x2CB6, 31152 },
+ { 0x2CB7, 30859 },
+ { 0x2CB8, 31142 },
+ { 0x2CB9, 30849 },
+ { 0x2CBA, 31127 },
+ { 0x2CBB, 30834 },
+ { 0x2CBC, 31147 },
+ { 0x2CBD, 30854 },
+ { 0x2CBE, 30974 },
+ { 0x2CBF, 30681 },
+ { 0x2CC0, 31096 },
+ { 0x2CC1, 30803 },
+ { 0x2CC2, 31112 },
+ { 0x2CC3, 30819 },
+ { 0x2CC4, 30986 },
+ { 0x2CC5, 30693 },
+ { 0x2CC6, 30956 },
+ { 0x2CC7, 30663 },
+ { 0x2CC8, 31117 },
+ { 0x2CC9, 30824 },
+ { 0x2CCA, 31137 },
+ { 0x2CCB, 30844 },
+ { 0x2CCC, 30980 },
+ { 0x2CCD, 30687 },
+ { 0x2CCE, 30938 },
+ { 0x2CCF, 30645 },
+ { 0x2CD0, 31122 },
+ { 0x2CD1, 30829 },
+ { 0x2CD2, 30968 },
+ { 0x2CD3, 30675 },
+ { 0x2CD4, 30962 },
+ { 0x2CD5, 30669 },
+ { 0x2CD6, 30998 },
+ { 0x2CD7, 30705 },
+ { 0x2CD8, 30950 },
+ { 0x2CD9, 30657 },
+ { 0x2CDA, 30992 },
+ { 0x2CDB, 30699 },
+ { 0x2CDC, 31022 },
+ { 0x2CDD, 30729 },
+ { 0x2CDE, 31004 },
+ { 0x2CDF, 30711 },
+ { 0x2CE0, 31010 },
+ { 0x2CE1, 30717 },
+ { 0x2CE2, 31016 },
+ { 0x2CE3, 30723 },
+ { 0x2CE4, 30872 },
+ { 0x2CE5, 30864 },
+ { 0x2CE6, 30868 },
+ { 0x2CE7, 30887 },
+ { 0x2CE8, 30879 },
+ { 0x2CE9, 30875 },
+ { 0x2CEA, 30883 },
+ { 0x2CF9, 30572 },
+ { 0x2CFA, 30582 },
+ { 0x2CFB, 30588 },
+ { 0x2CFC, 30577 },
+ { 0x2CFD, 31157 },
+ { 0x2CFE, 30594 },
+ { 0x2CFF, 31161 },
+ { 0x2D00, 51786 },
+ { 0x2D01, 51814 },
+ { 0x2D02, 51830 },
+ { 0x2D03, 51826 },
+ { 0x2D04, 51790 },
+ { 0x2D05, 51894 },
+ { 0x2D06, 51902 },
+ { 0x2D07, 51886 },
+ { 0x2D08, 51798 },
+ { 0x2D09, 51854 },
+ { 0x2D0A, 51858 },
+ { 0x2D0B, 51862 },
+ { 0x2D0C, 51866 },
+ { 0x2D0D, 51802 },
+ { 0x2D0E, 51870 },
+ { 0x2D0F, 51934 },
+ { 0x2D10, 51878 },
+ { 0x2D11, 51882 },
+ { 0x2D12, 51890 },
+ { 0x2D13, 51806 },
+ { 0x2D14, 51926 },
+ { 0x2D15, 51922 },
+ { 0x2D16, 51914 },
+ { 0x2D17, 51874 },
+ { 0x2D18, 51930 },
+ { 0x2D19, 51910 },
+ { 0x2D1A, 51818 },
+ { 0x2D1B, 51850 },
+ { 0x2D1C, 51822 },
+ { 0x2D1D, 51906 },
+ { 0x2D1E, 51898 },
+ { 0x2D1F, 51918 },
+ { 0x2D20, 51834 },
+ { 0x2D21, 51794 },
+ { 0x2D22, 51842 },
+ { 0x2D23, 51810 },
+ { 0x2D24, 51838 },
+ { 0x2D25, 51846 },
+ { 0x2D30, 55713 },
+ { 0x2D31, 55725 },
+ { 0x2D32, 55789 },
+ { 0x2D33, 55734 },
+ { 0x2D34, 55834 },
+ { 0x2D35, 55845 },
+ { 0x2D36, 55740 },
+ { 0x2D37, 55728 },
+ { 0x2D38, 55798 },
+ { 0x2D39, 55795 },
+ { 0x2D3A, 55831 },
+ { 0x2D3B, 55782 },
+ { 0x2D3C, 55731 },
+ { 0x2D3D, 55743 },
+ { 0x2D3E, 55854 },
+ { 0x2D3F, 55837 },
+ { 0x2D40, 55737 },
+ { 0x2D41, 55840 },
+ { 0x2D42, 55850 },
+ { 0x2D43, 55804 },
+ { 0x2D44, 55722 },
+ { 0x2D45, 55807 },
+ { 0x2D46, 55870 },
+ { 0x2D47, 55758 },
+ { 0x2D48, 55858 },
+ { 0x2D49, 55716 },
+ { 0x2D4A, 55825 },
+ { 0x2D4B, 55882 },
+ { 0x2D4C, 55878 },
+ { 0x2D4D, 55746 },
+ { 0x2D4E, 55749 },
+ { 0x2D4F, 55752 },
+ { 0x2D50, 55866 },
+ { 0x2D51, 55874 },
+ { 0x2D52, 55755 },
+ { 0x2D53, 55719 },
+ { 0x2D54, 55761 },
+ { 0x2D55, 55810 },
+ { 0x2D56, 55801 },
+ { 0x2D57, 55862 },
+ { 0x2D58, 55785 },
+ { 0x2D59, 55764 },
+ { 0x2D5A, 55816 },
+ { 0x2D5B, 55813 },
+ { 0x2D5C, 55767 },
+ { 0x2D5D, 55819 },
+ { 0x2D5E, 55792 },
+ { 0x2D5F, 55822 },
+ { 0x2D60, 55770 },
+ { 0x2D61, 55773 },
+ { 0x2D62, 55776 },
+ { 0x2D63, 55779 },
+ { 0x2D64, 55886 },
+ { 0x2D65, 55828 },
+ { 0x2D6F, 55890 },
+ { 0x2D80, 50999 },
+ { 0x2D81, 51011 },
+ { 0x2D82, 51140 },
+ { 0x2D83, 51170 },
+ { 0x2D84, 51542 },
+ { 0x2D85, 50762 },
+ { 0x2D86, 51227 },
+ { 0x2D87, 50810 },
+ { 0x2D88, 51032 },
+ { 0x2D89, 51488 },
+ { 0x2D8A, 51672 },
+ { 0x2D8B, 51344 },
+ { 0x2D8C, 50837 },
+ { 0x2D8D, 51407 },
+ { 0x2D8E, 50939 },
+ { 0x2D8F, 51569 },
+ { 0x2D90, 51395 },
+ { 0x2D91, 51500 },
+ { 0x2D92, 51074 },
+ { 0x2D93, 51422 },
+ { 0x2D94, 51428 },
+ { 0x2D95, 51629 },
+ { 0x2D96, 51425 },
+ { 0x2DA0, 51173 },
+ { 0x2DA1, 51185 },
+ { 0x2DA2, 51179 },
+ { 0x2DA3, 51548 },
+ { 0x2DA4, 51551 },
+ { 0x2DA5, 51176 },
+ { 0x2DA6, 51182 },
+ { 0x2DA8, 50777 },
+ { 0x2DA9, 50789 },
+ { 0x2DAA, 50783 },
+ { 0x2DAB, 51368 },
+ { 0x2DAC, 51371 },
+ { 0x2DAD, 50780 },
+ { 0x2DAE, 50786 },
+ { 0x2DB0, 51350 },
+ { 0x2DB1, 51362 },
+ { 0x2DB2, 51356 },
+ { 0x2DB3, 51614 },
+ { 0x2DB4, 51617 },
+ { 0x2DB5, 51353 },
+ { 0x2DB6, 51359 },
+ { 0x2DB8, 51374 },
+ { 0x2DB9, 51386 },
+ { 0x2DBA, 51380 },
+ { 0x2DBB, 51620 },
+ { 0x2DBC, 51623 },
+ { 0x2DBD, 51377 },
+ { 0x2DBE, 51383 },
+ { 0x2DC0, 51119 },
+ { 0x2DC1, 51131 },
+ { 0x2DC2, 51125 },
+ { 0x2DC3, 51530 },
+ { 0x2DC4, 51533 },
+ { 0x2DC5, 51122 },
+ { 0x2DC6, 51128 },
+ { 0x2DC8, 50978 },
+ { 0x2DC9, 50990 },
+ { 0x2DCA, 50984 },
+ { 0x2DCB, 51473 },
+ { 0x2DCC, 51476 },
+ { 0x2DCD, 50981 },
+ { 0x2DCE, 50987 },
+ { 0x2DD0, 51299 },
+ { 0x2DD1, 51311 },
+ { 0x2DD2, 51305 },
+ { 0x2DD3, 51599 },
+ { 0x2DD4, 51602 },
+ { 0x2DD5, 51302 },
+ { 0x2DD6, 51308 },
+ { 0x2DD8, 50894 },
+ { 0x2DD9, 50906 },
+ { 0x2DDA, 50900 },
+ { 0x2DDB, 51437 },
+ { 0x2DDC, 51440 },
+ { 0x2DDD, 50897 },
+ { 0x2DDE, 50903 },
+ { 0x2DE0, 58034 },
+ { 0x2DE1, 58082 },
+ { 0x2DE2, 58103 },
+ { 0x2DE3, 58038 },
+ { 0x2DE4, 58119 },
+ { 0x2DE5, 58090 },
+ { 0x2DE6, 58070 },
+ { 0x2DE7, 58042 },
+ { 0x2DE8, 58046 },
+ { 0x2DE9, 58050 },
+ { 0x2DEA, 58030 },
+ { 0x2DEB, 58074 },
+ { 0x2DEC, 58054 },
+ { 0x2DED, 58058 },
+ { 0x2DEE, 58078 },
+ { 0x2DEF, 58062 },
+ { 0x2DF0, 58111 },
+ { 0x2DF1, 58099 },
+ { 0x2DF2, 58107 },
+ { 0x2DF3, 58135 },
+ { 0x2DF4, 58123 },
+ { 0x2DF5, 58131 },
+ { 0x2DF6, 58026 },
+ { 0x2DF7, 58066 },
+ { 0x2DF8, 58127 },
+ { 0x2DF9, 58155 },
+ { 0x2DFA, 58115 },
+ { 0x2DFB, 58086 },
+ { 0x2DFC, 58144 },
+ { 0x2DFD, 58139 },
+ { 0x2DFE, 58094 },
+ { 0x2DFF, 58149 },
+ { 0x2E00, 21801 },
+ { 0x2E01, 21783 },
+ { 0x2E02, 9477 },
+ { 0x2E03, 22004 },
+ { 0x2E04, 9353 },
+ { 0x2E05, 21874 },
+ { 0x2E06, 35672 },
+ { 0x2E07, 35666 },
+ { 0x2E08, 31539 },
+ { 0x2E09, 9480 },
+ { 0x2E0A, 22007 },
+ { 0x2E0B, 35670 },
+ { 0x2E0C, 9377 },
+ { 0x2E0D, 21904 },
+ { 0x2E0E, 63378 },
+ { 0x2E0F, 69268 },
+ { 0x2E10, 31783 },
+ { 0x2E11, 55488 },
+ { 0x2E12, 69569 },
+ { 0x2E13, 31535 },
+ { 0x2E14, 63298 },
+ { 0x2E15, 44620 },
+ { 0x2E16, 31542 },
+ { 0x2E17, 31658 },
+ { 0x2E18, 53360 },
+ { 0x2E19, 9626 },
+ { 0x2E1A, 33425 },
+ { 0x2E1B, 23017 },
+ { 0x2E1C, 9148 },
+ { 0x2E1D, 21751 },
+ { 0x2E1E, 23009 },
+ { 0x2E1F, 23013 },
+ { 0x2E20, 9452 },
+ { 0x2E21, 21979 },
+ { 0x2E22, 7737 },
+ { 0x2E23, 7750 },
+ { 0x2E24, 30258 },
+ { 0x2E25, 30271 },
+ { 0x2E26, 9439 },
+ { 0x2E27, 21964 },
+ { 0x2E28, 9369 },
+ { 0x2E29, 21896 },
+ { 0x2E2A, 7772 },
+ { 0x2E2B, 7155 },
+ { 0x2E2C, 43556 },
+ { 0x2E2D, 9091 },
+ { 0x2E2E, 55502 },
+ { 0x2E2F, 56091 },
+ { 0x2E30, 9704 },
+ { 0x2E80, 5603 },
+ { 0x2E81, 5510 },
+ { 0x2E82, 5606 },
+ { 0x2E83, 5610 },
+ { 0x2E84, 5614 },
+ { 0x2E85, 5600 },
+ { 0x2E86, 5346 },
+ { 0x2E87, 5577 },
+ { 0x2E88, 5539 },
+ { 0x2E89, 5543 },
+ { 0x2E8A, 5638 },
+ { 0x2E8B, 5477 },
+ { 0x2E8C, 5558 },
+ { 0x2E8D, 5562 },
+ { 0x2E8E, 5441 },
+ { 0x2E8F, 5445 },
+ { 0x2E90, 5453 },
+ { 0x2E91, 5449 },
+ { 0x2E92, 5566 },
+ { 0x2E93, 5626 },
+ { 0x2E94, 5569 },
+ { 0x2E95, 5573 },
+ { 0x2E96, 5531 },
+ { 0x2E97, 5535 },
+ { 0x2E98, 5429 },
+ { 0x2E99, 5403 },
+ { 0x2E9B, 5507 },
+ { 0x2E9C, 5406 },
+ { 0x2E9D, 5471 },
+ { 0x2E9E, 5513 },
+ { 0x2E9F, 5597 },
+ { 0x2EA0, 5635 },
+ { 0x2EA1, 5583 },
+ { 0x2EA2, 5587 },
+ { 0x2EA3, 5423 },
+ { 0x2EA4, 5392 },
+ { 0x2EA5, 5396 },
+ { 0x2EA6, 5641 },
+ { 0x2EA7, 5349 },
+ { 0x2EA8, 5352 },
+ { 0x2EA9, 5438 },
+ { 0x2EAA, 5412 },
+ { 0x2EAB, 5370 },
+ { 0x2EAC, 5618 },
+ { 0x2EAD, 5622 },
+ { 0x2EAE, 5591 },
+ { 0x2EAF, 5480 },
+ { 0x2EB0, 5715 },
+ { 0x2EB1, 5373 },
+ { 0x2EB2, 5377 },
+ { 0x2EB3, 5385 },
+ { 0x2EB4, 5381 },
+ { 0x2EB5, 5468 },
+ { 0x2EB6, 5555 },
+ { 0x2EB7, 5400 },
+ { 0x2EB8, 5367 },
+ { 0x2EB9, 5389 },
+ { 0x2EBA, 5499 },
+ { 0x2EBB, 5503 },
+ { 0x2EBC, 5465 },
+ { 0x2EBD, 5594 },
+ { 0x2EBE, 5519 },
+ { 0x2EBF, 5523 },
+ { 0x2EC0, 5527 },
+ { 0x2EC1, 5580 },
+ { 0x2EC2, 5632 },
+ { 0x2EC3, 5491 },
+ { 0x2EC4, 5495 },
+ { 0x2EC5, 5671 },
+ { 0x2EC6, 5647 },
+ { 0x2EC7, 5435 },
+ { 0x2EC8, 5739 },
+ { 0x2EC9, 5727 },
+ { 0x2ECA, 5426 },
+ { 0x2ECB, 5679 },
+ { 0x2ECC, 5651 },
+ { 0x2ECD, 5483 },
+ { 0x2ECE, 5487 },
+ { 0x2ECF, 5420 },
+ { 0x2ED0, 5699 },
+ { 0x2ED1, 5457 },
+ { 0x2ED2, 5461 },
+ { 0x2ED3, 5707 },
+ { 0x2ED4, 5695 },
+ { 0x2ED5, 5547 },
+ { 0x2ED6, 5551 },
+ { 0x2ED7, 5474 },
+ { 0x2ED8, 5409 },
+ { 0x2ED9, 5743 },
+ { 0x2EDA, 5703 },
+ { 0x2EDB, 5719 },
+ { 0x2EDC, 5667 },
+ { 0x2EDD, 5355 },
+ { 0x2EDE, 5359 },
+ { 0x2EDF, 5363 },
+ { 0x2EE0, 5663 },
+ { 0x2EE1, 5432 },
+ { 0x2EE2, 5723 },
+ { 0x2EE3, 5417 },
+ { 0x2EE4, 5516 },
+ { 0x2EE5, 5687 },
+ { 0x2EE6, 5675 },
+ { 0x2EE7, 5711 },
+ { 0x2EE8, 5655 },
+ { 0x2EE9, 5659 },
+ { 0x2EEA, 5691 },
+ { 0x2EEB, 5752 },
+ { 0x2EEC, 5683 },
+ { 0x2EED, 5756 },
+ { 0x2EEE, 5731 },
+ { 0x2EEF, 5760 },
+ { 0x2EF0, 5735 },
+ { 0x2EF1, 5629 },
+ { 0x2EF2, 5764 },
+ { 0x2EF3, 5748 },
+ { 0x2F00, 33501 },
+ { 0x2F01, 33669 },
+ { 0x2F02, 33459 },
+ { 0x2F03, 33860 },
+ { 0x2F04, 33981 },
+ { 0x2F05, 33639 },
+ { 0x2F06, 33531 },
+ { 0x2F07, 33486 },
+ { 0x2F08, 33489 },
+ { 0x2F09, 33663 },
+ { 0x2F0A, 33792 },
+ { 0x2F0B, 33789 },
+ { 0x2F0C, 33588 },
+ { 0x2F0D, 33780 },
+ { 0x2F0E, 33480 },
+ { 0x2F0F, 33896 },
+ { 0x2F10, 33688 },
+ { 0x2F11, 33819 },
+ { 0x2F12, 33831 },
+ { 0x2F13, 33753 },
+ { 0x2F14, 33881 },
+ { 0x2F15, 33834 },
+ { 0x2F16, 33962 },
+ { 0x2F17, 33528 },
+ { 0x2F18, 34081 },
+ { 0x2F19, 33707 },
+ { 0x2F1A, 33774 },
+ { 0x2F1B, 34048 },
+ { 0x2F1C, 33756 },
+ { 0x2F1D, 33828 },
+ { 0x2F1E, 34078 },
+ { 0x2F1F, 33786 },
+ { 0x2F20, 34051 },
+ { 0x2F21, 33434 },
+ { 0x2F22, 33437 },
+ { 0x2F23, 34030 },
+ { 0x2F24, 33447 },
+ { 0x2F25, 33917 },
+ { 0x2F26, 33771 },
+ { 0x2F27, 33701 },
+ { 0x2F28, 33645 },
+ { 0x2F29, 33869 },
+ { 0x2F2A, 33654 },
+ { 0x2F2B, 33938 },
+ { 0x2F2C, 33990 },
+ { 0x2F2D, 34066 },
+ { 0x2F2E, 33839 },
+ { 0x2F2F, 33750 },
+ { 0x2F30, 34045 },
+ { 0x2F31, 34006 },
+ { 0x2F32, 33462 },
+ { 0x2F33, 33856 },
+ { 0x2F34, 33948 },
+ { 0x2F35, 33675 },
+ { 0x2F36, 33534 },
+ { 0x2F37, 33848 },
+ { 0x2F38, 33450 },
+ { 0x2F39, 33872 },
+ { 0x2F3A, 34021 },
+ { 0x2F3B, 33719 },
+ { 0x2F3C, 33813 },
+ { 0x2F3D, 34036 },
+ { 0x2F3E, 33585 },
+ { 0x2F3F, 33630 },
+ { 0x2F40, 33935 },
+ { 0x2F41, 33507 },
+ { 0x2F42, 33978 },
+ { 0x2F43, 33941 },
+ { 0x2F44, 33444 },
+ { 0x2F45, 33993 },
+ { 0x2F46, 33495 },
+ { 0x2F47, 33525 },
+ { 0x2F48, 33519 },
+ { 0x2F49, 33682 },
+ { 0x2F4A, 33731 },
+ { 0x2F4B, 33651 },
+ { 0x2F4C, 33722 },
+ { 0x2F4D, 33783 },
+ { 0x2F4E, 34015 },
+ { 0x2F4F, 33430 },
+ { 0x2F50, 34027 },
+ { 0x2F51, 33477 },
+ { 0x2F52, 33573 },
+ { 0x2F53, 33887 },
+ { 0x2F54, 33908 },
+ { 0x2F55, 33604 },
+ { 0x2F56, 33576 },
+ { 0x2F57, 33959 },
+ { 0x2F58, 33952 },
+ { 0x2F59, 33625 },
+ { 0x2F5A, 33866 },
+ { 0x2F5B, 33601 },
+ { 0x2F5C, 33453 },
+ { 0x2F5D, 33456 },
+ { 0x2F5E, 34069 },
+ { 0x2F5F, 33648 },
+ { 0x2F60, 33822 },
+ { 0x2F61, 33728 },
+ { 0x2F62, 33893 },
+ { 0x2F63, 33666 },
+ { 0x2F64, 33538 },
+ { 0x2F65, 33795 },
+ { 0x2F66, 33556 },
+ { 0x2F67, 34072 },
+ { 0x2F68, 33944 },
+ { 0x2F69, 33914 },
+ { 0x2F6A, 33716 },
+ { 0x2F6B, 33582 },
+ { 0x2F6C, 33471 },
+ { 0x2F6D, 33878 },
+ { 0x2F6E, 33759 },
+ { 0x2F6F, 33890 },
+ { 0x2F70, 33987 },
+ { 0x2F71, 33905 },
+ { 0x2F72, 33807 },
+ { 0x2F73, 33567 },
+ { 0x2F74, 33884 },
+ { 0x2F75, 33929 },
+ { 0x2F76, 33698 },
+ { 0x2F77, 33713 },
+ { 0x2F78, 33483 },
+ { 0x2F79, 33492 },
+ { 0x2F7A, 33842 },
+ { 0x2F7B, 34033 },
+ { 0x2F7C, 33498 },
+ { 0x2F7D, 33441 },
+ { 0x2F7E, 33692 },
+ { 0x2F7F, 33465 },
+ { 0x2F80, 33768 },
+ { 0x2F81, 33679 },
+ { 0x2F82, 34063 },
+ { 0x2F83, 33710 },
+ { 0x2F84, 33923 },
+ { 0x2F85, 33972 },
+ { 0x2F86, 34000 },
+ { 0x2F87, 33975 },
+ { 0x2F88, 33550 },
+ { 0x2F89, 34075 },
+ { 0x2F8A, 33777 },
+ { 0x2F8B, 33810 },
+ { 0x2F8C, 33899 },
+ { 0x2F8D, 33966 },
+ { 0x2F8E, 33765 },
+ { 0x2F8F, 33737 },
+ { 0x2F90, 34024 },
+ { 0x2F91, 33741 },
+ { 0x2F92, 33522 },
+ { 0x2F93, 33642 },
+ { 0x2F94, 33984 },
+ { 0x2F95, 34012 },
+ { 0x2F96, 33541 },
+ { 0x2F97, 33504 },
+ { 0x2F98, 33926 },
+ { 0x2F99, 33845 },
+ { 0x2F9A, 33513 },
+ { 0x2F9B, 33516 },
+ { 0x2F9C, 33610 },
+ { 0x2F9D, 33553 },
+ { 0x2F9E, 33564 },
+ { 0x2F9F, 33932 },
+ { 0x2FA0, 34042 },
+ { 0x2FA1, 33734 },
+ { 0x2FA2, 33570 },
+ { 0x2FA3, 33747 },
+ { 0x2FA4, 34087 },
+ { 0x2FA5, 34054 },
+ { 0x2FA6, 33619 },
+ { 0x2FA7, 33672 },
+ { 0x2FA8, 33616 },
+ { 0x2FA9, 33825 },
+ { 0x2FAA, 33863 },
+ { 0x2FAB, 33851 },
+ { 0x2FAC, 33695 },
+ { 0x2FAD, 33547 },
+ { 0x2FAE, 33920 },
+ { 0x2FAF, 33598 },
+ { 0x2FB0, 34039 },
+ { 0x2FB1, 33996 },
+ { 0x2FB2, 33660 },
+ { 0x2FB3, 33875 },
+ { 0x2FB4, 33657 },
+ { 0x2FB5, 33744 },
+ { 0x2FB6, 33474 },
+ { 0x2FB7, 33468 },
+ { 0x2FB8, 33633 },
+ { 0x2FB9, 34060 },
+ { 0x2FBA, 33816 },
+ { 0x2FBB, 33561 },
+ { 0x2FBC, 33725 },
+ { 0x2FBD, 33622 },
+ { 0x2FBE, 33798 },
+ { 0x2FBF, 34090 },
+ { 0x2FC0, 34057 },
+ { 0x2FC1, 33804 },
+ { 0x2FC2, 33607 },
+ { 0x2FC3, 33544 },
+ { 0x2FC4, 33704 },
+ { 0x2FC5, 33579 },
+ { 0x2FC6, 33911 },
+ { 0x2FC7, 33636 },
+ { 0x2FC8, 34018 },
+ { 0x2FC9, 33969 },
+ { 0x2FCA, 33762 },
+ { 0x2FCB, 34084 },
+ { 0x2FCC, 33613 },
+ { 0x2FCD, 34003 },
+ { 0x2FCE, 33592 },
+ { 0x2FCF, 33510 },
+ { 0x2FD0, 33685 },
+ { 0x2FD1, 33595 },
+ { 0x2FD2, 33902 },
+ { 0x2FD3, 33956 },
+ { 0x2FD4, 34009 },
+ { 0x2FD5, 33801 },
+ { 0x2FF0, 69175 },
+ { 0x2FF1, 69189 },
+ { 0x2FF2, 69181 },
+ { 0x2FF3, 69195 },
+ { 0x2FF4, 69170 },
+ { 0x2FF5, 69213 },
+ { 0x2FF6, 69219 },
+ { 0x2FF7, 69207 },
+ { 0x2FF8, 69232 },
+ { 0x2FF9, 69239 },
+ { 0x2FFA, 69225 },
+ { 0x2FFB, 69203 },
+ { 0x3000, 68678 },
+ { 0x3001, 68672 },
+ { 0x3002, 68665 },
+ { 0x3003, 10538 },
+ { 0x3004, 53362 },
+ { 0x3005, 68698 },
+ { 0x3006, 68687 },
+ { 0x3007, 68680 },
+ { 0x3008, 9204 },
+ { 0x3009, 21788 },
+ { 0x300A, 9357 },
+ { 0x300B, 21878 },
+ { 0x300C, 9350 },
+ { 0x300D, 21871 },
+ { 0x300E, 9330 },
+ { 0x300F, 21851 },
+ { 0x3010, 9227 },
+ { 0x3011, 21820 },
+ { 0x3012, 35661 },
+ { 0x3013, 9121 },
+ { 0x3014, 9443 },
+ { 0x3015, 21968 },
+ { 0x3016, 9343 },
+ { 0x3017, 21864 },
+ { 0x3018, 9338 },
+ { 0x3019, 21859 },
+ { 0x301A, 9334 },
+ { 0x301B, 21855 },
+ { 0x301C, 10063 },
+ { 0x301D, 55478 },
+ { 0x301E, 31576 },
+ { 0x301F, 6033 },
+ { 0x3020, 35663 },
+ { 0x3021, 52741 },
+ { 0x3022, 52750 },
+ { 0x3023, 52768 },
+ { 0x3024, 52756 },
+ { 0x3025, 52753 },
+ { 0x3026, 52744 },
+ { 0x3027, 52765 },
+ { 0x3028, 52762 },
+ { 0x3029, 52759 },
+ { 0x302A, 68674 },
+ { 0x302B, 68683 },
+ { 0x302C, 68694 },
+ { 0x302D, 68690 },
+ { 0x302E, 32170 },
+ { 0x302F, 31884 },
+ { 0x3030, 10078 },
+ { 0x3031, 56034 },
+ { 0x3032, 56050 },
+ { 0x3033, 56044 },
+ { 0x3034, 56057 },
+ { 0x3035, 56038 },
+ { 0x3036, 39456 },
+ { 0x3037, 68701 },
+ { 0x3038, 52747 },
+ { 0x3039, 52774 },
+ { 0x303A, 52771 },
+ { 0x303B, 56098 },
+ { 0x303C, 9594 },
+ { 0x303D, 9628 },
+ { 0x303E, 69103 },
+ { 0x303F, 68668 },
+ { 0x3041, 53242 },
+ { 0x3042, 53020 },
+ { 0x3043, 53250 },
+ { 0x3044, 53026 },
+ { 0x3045, 53258 },
+ { 0x3046, 53035 },
+ { 0x3047, 53246 },
+ { 0x3048, 53023 },
+ { 0x3049, 53254 },
+ { 0x304A, 53032 },
+ { 0x304B, 53098 },
+ { 0x304C, 53068 },
+ { 0x304D, 53104 },
+ { 0x304E, 53074 },
+ { 0x304F, 53110 },
+ { 0x3050, 53080 },
+ { 0x3051, 53101 },
+ { 0x3052, 53071 },
+ { 0x3053, 53107 },
+ { 0x3054, 53077 },
+ { 0x3055, 53173 },
+ { 0x3056, 53227 },
+ { 0x3057, 53179 },
+ { 0x3058, 53233 },
+ { 0x3059, 53185 },
+ { 0x305A, 53239 },
+ { 0x305B, 53176 },
+ { 0x305C, 53230 },
+ { 0x305D, 53182 },
+ { 0x305E, 53236 },
+ { 0x305F, 53188 },
+ { 0x3060, 53053 },
+ { 0x3061, 53194 },
+ { 0x3062, 53059 },
+ { 0x3063, 53270 },
+ { 0x3064, 53200 },
+ { 0x3065, 53065 },
+ { 0x3066, 53191 },
+ { 0x3067, 53056 },
+ { 0x3068, 53197 },
+ { 0x3069, 53062 },
+ { 0x306A, 53128 },
+ { 0x306B, 53134 },
+ { 0x306C, 53140 },
+ { 0x306D, 53131 },
+ { 0x306E, 53137 },
+ { 0x306F, 53083 },
+ { 0x3070, 53038 },
+ { 0x3071, 53143 },
+ { 0x3072, 53089 },
+ { 0x3073, 53044 },
+ { 0x3074, 53149 },
+ { 0x3075, 53095 },
+ { 0x3076, 53050 },
+ { 0x3077, 53155 },
+ { 0x3078, 53086 },
+ { 0x3079, 53041 },
+ { 0x307A, 53146 },
+ { 0x307B, 53092 },
+ { 0x307C, 53047 },
+ { 0x307D, 53152 },
+ { 0x307E, 53113 },
+ { 0x307F, 53119 },
+ { 0x3080, 53125 },
+ { 0x3081, 53116 },
+ { 0x3082, 53122 },
+ { 0x3083, 53278 },
+ { 0x3084, 53218 },
+ { 0x3085, 53286 },
+ { 0x3086, 53224 },
+ { 0x3087, 53282 },
+ { 0x3088, 53221 },
+ { 0x3089, 53158 },
+ { 0x308A, 53164 },
+ { 0x308B, 53170 },
+ { 0x308C, 53161 },
+ { 0x308D, 53167 },
+ { 0x308E, 53274 },
+ { 0x308F, 53206 },
+ { 0x3090, 53212 },
+ { 0x3091, 53209 },
+ { 0x3092, 53215 },
+ { 0x3093, 53029 },
+ { 0x3094, 53203 },
+ { 0x3095, 53262 },
+ { 0x3096, 53266 },
+ { 0x3099, 58335 },
+ { 0x309A, 58340 },
+ { 0x309B, 75125 },
+ { 0x309C, 75133 },
+ { 0x309D, 53297 },
+ { 0x309E, 53290 },
+ { 0x309F, 53294 },
+ { 0x30A0, 75122 },
+ { 0x30A1, 53600 },
+ { 0x30A2, 53366 },
+ { 0x30A3, 53608 },
+ { 0x30A4, 53372 },
+ { 0x30A5, 53616 },
+ { 0x30A6, 53381 },
+ { 0x30A7, 53604 },
+ { 0x30A8, 53369 },
+ { 0x30A9, 53612 },
+ { 0x30AA, 53378 },
+ { 0x30AB, 53444 },
+ { 0x30AC, 53414 },
+ { 0x30AD, 53450 },
+ { 0x30AE, 53420 },
+ { 0x30AF, 53456 },
+ { 0x30B0, 53426 },
+ { 0x30B1, 53447 },
+ { 0x30B2, 53417 },
+ { 0x30B3, 53453 },
+ { 0x30B4, 53423 },
+ { 0x30B5, 53519 },
+ { 0x30B6, 53585 },
+ { 0x30B7, 53525 },
+ { 0x30B8, 53591 },
+ { 0x30B9, 53531 },
+ { 0x30BA, 53597 },
+ { 0x30BB, 53522 },
+ { 0x30BC, 53588 },
+ { 0x30BD, 53528 },
+ { 0x30BE, 53594 },
+ { 0x30BF, 53534 },
+ { 0x30C0, 53399 },
+ { 0x30C1, 53540 },
+ { 0x30C2, 53405 },
+ { 0x30C3, 53692 },
+ { 0x30C4, 53546 },
+ { 0x30C5, 53411 },
+ { 0x30C6, 53537 },
+ { 0x30C7, 53402 },
+ { 0x30C8, 53543 },
+ { 0x30C9, 53408 },
+ { 0x30CA, 53474 },
+ { 0x30CB, 53480 },
+ { 0x30CC, 53486 },
+ { 0x30CD, 53477 },
+ { 0x30CE, 53483 },
+ { 0x30CF, 53429 },
+ { 0x30D0, 53384 },
+ { 0x30D1, 53489 },
+ { 0x30D2, 53435 },
+ { 0x30D3, 53390 },
+ { 0x30D4, 53495 },
+ { 0x30D5, 53441 },
+ { 0x30D6, 53396 },
+ { 0x30D7, 53501 },
+ { 0x30D8, 53432 },
+ { 0x30D9, 53387 },
+ { 0x30DA, 53492 },
+ { 0x30DB, 53438 },
+ { 0x30DC, 53393 },
+ { 0x30DD, 53498 },
+ { 0x30DE, 53459 },
+ { 0x30DF, 53465 },
+ { 0x30E0, 53471 },
+ { 0x30E1, 53462 },
+ { 0x30E2, 53468 },
+ { 0x30E3, 53700 },
+ { 0x30E4, 53576 },
+ { 0x30E5, 53708 },
+ { 0x30E6, 53582 },
+ { 0x30E7, 53704 },
+ { 0x30E8, 53579 },
+ { 0x30E9, 53504 },
+ { 0x30EA, 53510 },
+ { 0x30EB, 53516 },
+ { 0x30EC, 53507 },
+ { 0x30ED, 53513 },
+ { 0x30EE, 53696 },
+ { 0x30EF, 53564 },
+ { 0x30F0, 53570 },
+ { 0x30F1, 53567 },
+ { 0x30F2, 53573 },
+ { 0x30F3, 53375 },
+ { 0x30F4, 53561 },
+ { 0x30F5, 53640 },
+ { 0x30F6, 53644 },
+ { 0x30F7, 53549 },
+ { 0x30F8, 53555 },
+ { 0x30F9, 53552 },
+ { 0x30FA, 53558 },
+ { 0x30FB, 53712 },
+ { 0x30FC, 75129 },
+ { 0x30FD, 53722 },
+ { 0x30FE, 53715 },
+ { 0x30FF, 53719 },
+ { 0x3105, 45589 },
+ { 0x3106, 45631 },
+ { 0x3107, 45622 },
+ { 0x3108, 45601 },
+ { 0x3109, 45595 },
+ { 0x310A, 45643 },
+ { 0x310B, 45625 },
+ { 0x310C, 45619 },
+ { 0x310D, 45604 },
+ { 0x310E, 45616 },
+ { 0x310F, 45607 },
+ { 0x3110, 45613 },
+ { 0x3111, 45634 },
+ { 0x3112, 45652 },
+ { 0x3113, 45727 },
+ { 0x3114, 45673 },
+ { 0x3115, 45724 },
+ { 0x3116, 45637 },
+ { 0x3117, 45655 },
+ { 0x3118, 45592 },
+ { 0x3119, 45640 },
+ { 0x311A, 45586 },
+ { 0x311B, 45628 },
+ { 0x311C, 45598 },
+ { 0x311D, 45679 },
+ { 0x311E, 45658 },
+ { 0x311F, 45682 },
+ { 0x3120, 45667 },
+ { 0x3121, 45721 },
+ { 0x3122, 45664 },
+ { 0x3123, 45685 },
+ { 0x3124, 45733 },
+ { 0x3125, 45739 },
+ { 0x3126, 45688 },
+ { 0x3127, 45610 },
+ { 0x3128, 45646 },
+ { 0x3129, 45706 },
+ { 0x312A, 45649 },
+ { 0x312B, 45712 },
+ { 0x312C, 45691 },
+ { 0x312D, 45697 },
+ { 0x3131, 31996 },
+ { 0x3132, 32095 },
+ { 0x3133, 32065 },
+ { 0x3134, 31978 },
+ { 0x3135, 32071 },
+ { 0x3136, 32074 },
+ { 0x3137, 31999 },
+ { 0x3138, 32098 },
+ { 0x3139, 31984 },
+ { 0x313A, 32113 },
+ { 0x313B, 32083 },
+ { 0x313C, 32086 },
+ { 0x313D, 32038 },
+ { 0x313E, 32140 },
+ { 0x313F, 32137 },
+ { 0x3140, 32080 },
+ { 0x3141, 31975 },
+ { 0x3142, 31981 },
+ { 0x3143, 32062 },
+ { 0x3144, 32035 },
+ { 0x3145, 31954 },
+ { 0x3146, 32026 },
+ { 0x3147, 31972 },
+ { 0x3148, 31966 },
+ { 0x3149, 32050 },
+ { 0x314A, 32008 },
+ { 0x314B, 32011 },
+ { 0x314C, 32020 },
+ { 0x314D, 32017 },
+ { 0x314E, 31969 },
+ { 0x314F, 31891 },
+ { 0x3150, 31906 },
+ { 0x3151, 31927 },
+ { 0x3152, 31948 },
+ { 0x3153, 31909 },
+ { 0x3154, 31894 },
+ { 0x3155, 31951 },
+ { 0x3156, 31930 },
+ { 0x3157, 31900 },
+ { 0x3158, 31918 },
+ { 0x3159, 31942 },
+ { 0x315A, 31915 },
+ { 0x315B, 31936 },
+ { 0x315C, 31903 },
+ { 0x315D, 31945 },
+ { 0x315E, 31921 },
+ { 0x315F, 31924 },
+ { 0x3160, 31939 },
+ { 0x3161, 31912 },
+ { 0x3162, 31933 },
+ { 0x3163, 31897 },
+ { 0x3164, 31889 },
+ { 0x3165, 32059 },
+ { 0x3166, 32104 },
+ { 0x3167, 32032 },
+ { 0x3168, 32128 },
+ { 0x3169, 32161 },
+ { 0x316A, 32116 },
+ { 0x316B, 32149 },
+ { 0x316C, 32134 },
+ { 0x316D, 32164 },
+ { 0x316E, 32068 },
+ { 0x316F, 32029 },
+ { 0x3170, 32125 },
+ { 0x3171, 32119 },
+ { 0x3172, 32107 },
+ { 0x3173, 32110 },
+ { 0x3174, 32155 },
+ { 0x3175, 32158 },
+ { 0x3176, 32077 },
+ { 0x3177, 32131 },
+ { 0x3178, 32122 },
+ { 0x3179, 32167 },
+ { 0x317A, 32089 },
+ { 0x317B, 32044 },
+ { 0x317C, 32092 },
+ { 0x317D, 32047 },
+ { 0x317E, 32041 },
+ { 0x317F, 32014 },
+ { 0x3180, 32056 },
+ { 0x3181, 32023 },
+ { 0x3182, 32143 },
+ { 0x3183, 32152 },
+ { 0x3184, 32146 },
+ { 0x3185, 32053 },
+ { 0x3186, 32101 },
+ { 0x3187, 31987 },
+ { 0x3188, 32002 },
+ { 0x3189, 31957 },
+ { 0x318A, 32005 },
+ { 0x318B, 31990 },
+ { 0x318C, 31960 },
+ { 0x318D, 31963 },
+ { 0x318E, 31993 },
+ { 0x3190, 69162 },
+ { 0x3191, 69166 },
+ { 0x3192, 69110 },
+ { 0x3193, 69118 },
+ { 0x3194, 69138 },
+ { 0x3195, 69122 },
+ { 0x3196, 69114 },
+ { 0x3197, 69154 },
+ { 0x3198, 69142 },
+ { 0x3199, 69130 },
+ { 0x319A, 69158 },
+ { 0x319B, 69134 },
+ { 0x319C, 69146 },
+ { 0x319D, 69150 },
+ { 0x319E, 69126 },
+ { 0x319F, 69106 },
+ { 0x31A0, 45670 },
+ { 0x31A1, 45730 },
+ { 0x31A2, 45709 },
+ { 0x31A3, 45694 },
+ { 0x31A4, 45676 },
+ { 0x31A5, 45742 },
+ { 0x31A6, 45718 },
+ { 0x31A7, 45754 },
+ { 0x31A8, 45703 },
+ { 0x31A9, 45736 },
+ { 0x31AA, 45745 },
+ { 0x31AB, 45757 },
+ { 0x31AC, 45700 },
+ { 0x31AD, 45748 },
+ { 0x31AE, 45760 },
+ { 0x31AF, 45763 },
+ { 0x31B0, 45661 },
+ { 0x31B1, 45715 },
+ { 0x31B2, 45751 },
+ { 0x31B3, 45766 },
+ { 0x31B4, 45578 },
+ { 0x31B5, 45582 },
+ { 0x31B6, 45574 },
+ { 0x31B7, 45570 },
+ { 0x31C0, 5256 },
+ { 0x31C1, 5295 },
+ { 0x31C2, 5298 },
+ { 0x31C3, 5301 },
+ { 0x31C4, 5286 },
+ { 0x31C5, 5313 },
+ { 0x31C6, 5304 },
+ { 0x31C7, 5262 },
+ { 0x31C8, 5331 },
+ { 0x31C9, 5340 },
+ { 0x31CA, 5307 },
+ { 0x31CB, 5334 },
+ { 0x31CC, 5325 },
+ { 0x31CD, 5310 },
+ { 0x31CE, 5337 },
+ { 0x31CF, 5244 },
+ { 0x31D0, 5241 },
+ { 0x31D1, 5253 },
+ { 0x31D2, 5247 },
+ { 0x31D3, 5280 },
+ { 0x31D4, 5238 },
+ { 0x31D5, 5265 },
+ { 0x31D6, 5259 },
+ { 0x31D7, 5289 },
+ { 0x31D8, 5319 },
+ { 0x31D9, 5283 },
+ { 0x31DA, 5277 },
+ { 0x31DB, 5268 },
+ { 0x31DC, 5274 },
+ { 0x31DD, 5292 },
+ { 0x31DE, 5322 },
+ { 0x31DF, 5316 },
+ { 0x31E0, 5328 },
+ { 0x31E1, 5343 },
+ { 0x31E2, 5271 },
+ { 0x31E3, 5250 },
+ { 0x31F0, 53648 },
+ { 0x31F1, 53680 },
+ { 0x31F2, 53684 },
+ { 0x31F3, 53688 },
+ { 0x31F4, 53656 },
+ { 0x31F5, 53620 },
+ { 0x31F6, 53628 },
+ { 0x31F7, 53636 },
+ { 0x31F8, 53624 },
+ { 0x31F9, 53632 },
+ { 0x31FA, 53652 },
+ { 0x31FB, 53660 },
+ { 0x31FC, 53668 },
+ { 0x31FD, 53676 },
+ { 0x31FE, 53664 },
+ { 0x31FF, 53672 },
+ { 0x3200, 74845 },
+ { 0x3201, 74824 },
+ { 0x3202, 74852 },
+ { 0x3203, 74838 },
+ { 0x3204, 74817 },
+ { 0x3205, 74831 },
+ { 0x3206, 74785 },
+ { 0x3207, 74810 },
+ { 0x3208, 74792 },
+ { 0x3209, 74859 },
+ { 0x320A, 74866 },
+ { 0x320B, 74880 },
+ { 0x320C, 74873 },
+ { 0x320D, 74803 },
+ { 0x320E, 74848 },
+ { 0x320F, 74827 },
+ { 0x3210, 74855 },
+ { 0x3211, 74841 },
+ { 0x3212, 74820 },
+ { 0x3213, 74834 },
+ { 0x3214, 74788 },
+ { 0x3215, 74813 },
+ { 0x3216, 74795 },
+ { 0x3217, 74862 },
+ { 0x3218, 74869 },
+ { 0x3219, 74883 },
+ { 0x321A, 74876 },
+ { 0x321B, 74806 },
+ { 0x321C, 74799 },
+ { 0x321D, 74892 },
+ { 0x321E, 74887 },
+ { 0x3220, 74929 },
+ { 0x3221, 74941 },
+ { 0x3222, 75001 },
+ { 0x3223, 74953 },
+ { 0x3224, 74950 },
+ { 0x3225, 74932 },
+ { 0x3226, 74992 },
+ { 0x3227, 74980 },
+ { 0x3228, 74965 },
+ { 0x3229, 74938 },
+ { 0x322A, 74959 },
+ { 0x322B, 74947 },
+ { 0x322C, 75004 },
+ { 0x322D, 74974 },
+ { 0x322E, 74986 },
+ { 0x322F, 74977 },
+ { 0x3230, 74935 },
+ { 0x3231, 74995 },
+ { 0x3232, 74956 },
+ { 0x3233, 75007 },
+ { 0x3234, 74962 },
+ { 0x3235, 75010 },
+ { 0x3236, 75022 },
+ { 0x3237, 75034 },
+ { 0x3238, 74983 },
+ { 0x3239, 75025 },
+ { 0x323A, 74944 },
+ { 0x323B, 74998 },
+ { 0x323C, 75028 },
+ { 0x323D, 75031 },
+ { 0x323E, 75019 },
+ { 0x323F, 75013 },
+ { 0x3240, 75016 },
+ { 0x3241, 74968 },
+ { 0x3242, 74971 },
+ { 0x3243, 74989 },
+ { 0x3250, 69269 },
+ { 0x3251, 39399 },
+ { 0x3252, 39407 },
+ { 0x3253, 39431 },
+ { 0x3254, 39415 },
+ { 0x3255, 39411 },
+ { 0x3256, 39403 },
+ { 0x3257, 39427 },
+ { 0x3258, 39423 },
+ { 0x3259, 39419 },
+ { 0x325A, 39354 },
+ { 0x325B, 39357 },
+ { 0x325C, 39365 },
+ { 0x325D, 39389 },
+ { 0x325E, 39373 },
+ { 0x325F, 39369 },
+ { 0x3260, 39256 },
+ { 0x3261, 39235 },
+ { 0x3262, 39263 },
+ { 0x3263, 39249 },
+ { 0x3264, 39228 },
+ { 0x3265, 39242 },
+ { 0x3266, 39196 },
+ { 0x3267, 39217 },
+ { 0x3268, 39203 },
+ { 0x3269, 39270 },
+ { 0x326A, 39277 },
+ { 0x326B, 39291 },
+ { 0x326C, 39284 },
+ { 0x326D, 39210 },
+ { 0x326E, 39259 },
+ { 0x326F, 39238 },
+ { 0x3270, 39266 },
+ { 0x3271, 39252 },
+ { 0x3272, 39231 },
+ { 0x3273, 39245 },
+ { 0x3274, 39199 },
+ { 0x3275, 39220 },
+ { 0x3276, 39206 },
+ { 0x3277, 39273 },
+ { 0x3278, 39280 },
+ { 0x3279, 39294 },
+ { 0x327A, 39287 },
+ { 0x327B, 39213 },
+ { 0x327C, 39302 },
+ { 0x327D, 39298 },
+ { 0x327E, 39224 },
+ { 0x327F, 34096 },
+ { 0x3280, 39623 },
+ { 0x3281, 39635 },
+ { 0x3282, 39710 },
+ { 0x3283, 39647 },
+ { 0x3284, 39644 },
+ { 0x3285, 39626 },
+ { 0x3286, 39701 },
+ { 0x3287, 39683 },
+ { 0x3288, 39671 },
+ { 0x3289, 39632 },
+ { 0x328A, 39665 },
+ { 0x328B, 39641 },
+ { 0x328C, 39713 },
+ { 0x328D, 39677 },
+ { 0x328E, 39689 },
+ { 0x328F, 39680 },
+ { 0x3290, 39629 },
+ { 0x3291, 39704 },
+ { 0x3292, 39650 },
+ { 0x3293, 39728 },
+ { 0x3294, 39668 },
+ { 0x3295, 39731 },
+ { 0x3296, 39755 },
+ { 0x3297, 39764 },
+ { 0x3298, 39686 },
+ { 0x3299, 39722 },
+ { 0x329A, 39662 },
+ { 0x329B, 39719 },
+ { 0x329C, 39746 },
+ { 0x329D, 39752 },
+ { 0x329E, 39695 },
+ { 0x329F, 39749 },
+ { 0x32A0, 39656 },
+ { 0x32A1, 39674 },
+ { 0x32A2, 39638 },
+ { 0x32A3, 39725 },
+ { 0x32A4, 39653 },
+ { 0x32A5, 39716 },
+ { 0x32A6, 39620 },
+ { 0x32A7, 39659 },
+ { 0x32A8, 39698 },
+ { 0x32A9, 39737 },
+ { 0x32AA, 39740 },
+ { 0x32AB, 39707 },
+ { 0x32AC, 39758 },
+ { 0x32AD, 39761 },
+ { 0x32AE, 39743 },
+ { 0x32AF, 39734 },
+ { 0x32B0, 39692 },
+ { 0x32B1, 39361 },
+ { 0x32B2, 39385 },
+ { 0x32B3, 39381 },
+ { 0x32B4, 39377 },
+ { 0x32B5, 39312 },
+ { 0x32B6, 39315 },
+ { 0x32B7, 39323 },
+ { 0x32B8, 39347 },
+ { 0x32B9, 39331 },
+ { 0x32BA, 39327 },
+ { 0x32BB, 39319 },
+ { 0x32BC, 39343 },
+ { 0x32BD, 39339 },
+ { 0x32BE, 39335 },
+ { 0x32BF, 39309 },
+ { 0x32C0, 69073 },
+ { 0x32C1, 69088 },
+ { 0x32C2, 69063 },
+ { 0x32C3, 69058 },
+ { 0x32C4, 68893 },
+ { 0x32C5, 69053 },
+ { 0x32C6, 69048 },
+ { 0x32C7, 69068 },
+ { 0x32C8, 69098 },
+ { 0x32C9, 69078 },
+ { 0x32CA, 69093 },
+ { 0x32CB, 69083 },
+ { 0x32CC, 35949 },
+ { 0x32CD, 36112 },
+ { 0x32CE, 35939 },
+ { 0x32CF, 40924 },
+ { 0x32D0, 39471 },
+ { 0x32D1, 39477 },
+ { 0x32D2, 39483 },
+ { 0x32D3, 39474 },
+ { 0x32D4, 39480 },
+ { 0x32D5, 39501 },
+ { 0x32D6, 39507 },
+ { 0x32D7, 39513 },
+ { 0x32D8, 39504 },
+ { 0x32D9, 39510 },
+ { 0x32DA, 39561 },
+ { 0x32DB, 39567 },
+ { 0x32DC, 39573 },
+ { 0x32DD, 39564 },
+ { 0x32DE, 39570 },
+ { 0x32DF, 39576 },
+ { 0x32E0, 39582 },
+ { 0x32E1, 39588 },
+ { 0x32E2, 39579 },
+ { 0x32E3, 39585 },
+ { 0x32E4, 39531 },
+ { 0x32E5, 39537 },
+ { 0x32E6, 39543 },
+ { 0x32E7, 39534 },
+ { 0x32E8, 39540 },
+ { 0x32E9, 39486 },
+ { 0x32EA, 39492 },
+ { 0x32EB, 39498 },
+ { 0x32EC, 39489 },
+ { 0x32ED, 39495 },
+ { 0x32EE, 39516 },
+ { 0x32EF, 39522 },
+ { 0x32F0, 39528 },
+ { 0x32F1, 39519 },
+ { 0x32F2, 39525 },
+ { 0x32F3, 39603 },
+ { 0x32F4, 39609 },
+ { 0x32F5, 39606 },
+ { 0x32F6, 39546 },
+ { 0x32F7, 39552 },
+ { 0x32F8, 39558 },
+ { 0x32F9, 39549 },
+ { 0x32FA, 39555 },
+ { 0x32FB, 39591 },
+ { 0x32FC, 39597 },
+ { 0x32FD, 39594 },
+ { 0x32FE, 39600 },
+ { 0x3300, 36363 },
+ { 0x3301, 36365 },
+ { 0x3302, 36290 },
+ { 0x3303, 36157 },
+ { 0x3304, 36375 },
+ { 0x3305, 36171 },
+ { 0x3306, 36155 },
+ { 0x3307, 36421 },
+ { 0x3308, 36296 },
+ { 0x3309, 36188 },
+ { 0x330A, 36190 },
+ { 0x330B, 36326 },
+ { 0x330C, 36393 },
+ { 0x330D, 36395 },
+ { 0x330E, 36300 },
+ { 0x330F, 36298 },
+ { 0x3310, 36167 },
+ { 0x3311, 36302 },
+ { 0x3312, 36379 },
+ { 0x3313, 36391 },
+ { 0x3314, 36175 },
+ { 0x3315, 36459 },
+ { 0x3316, 36463 },
+ { 0x3317, 36451 },
+ { 0x3318, 36369 },
+ { 0x3319, 36447 },
+ { 0x331A, 36453 },
+ { 0x331B, 36397 },
+ { 0x331C, 36328 },
+ { 0x331D, 36377 },
+ { 0x331E, 36330 },
+ { 0x331F, 36415 },
+ { 0x3320, 36445 },
+ { 0x3321, 36417 },
+ { 0x3322, 36353 },
+ { 0x3323, 36355 },
+ { 0x3324, 36294 },
+ { 0x3325, 36161 },
+ { 0x3326, 36163 },
+ { 0x3327, 36153 },
+ { 0x3328, 36186 },
+ { 0x3329, 36336 },
+ { 0x332A, 36304 },
+ { 0x332B, 36441 },
+ { 0x332C, 36338 },
+ { 0x332D, 36389 },
+ { 0x332E, 36457 },
+ { 0x332F, 36385 },
+ { 0x3330, 36194 },
+ { 0x3331, 36159 },
+ { 0x3332, 36423 },
+ { 0x3333, 36373 },
+ { 0x3334, 36419 },
+ { 0x3335, 36308 },
+ { 0x3336, 36449 },
+ { 0x3337, 36192 },
+ { 0x3338, 36383 },
+ { 0x3339, 36371 },
+ { 0x333A, 36342 },
+ { 0x333B, 36340 },
+ { 0x333C, 36292 },
+ { 0x333D, 36387 },
+ { 0x333E, 36367 },
+ { 0x333F, 36120 },
+ { 0x3340, 36344 },
+ { 0x3341, 36306 },
+ { 0x3342, 36169 },
+ { 0x3343, 36401 },
+ { 0x3344, 36334 },
+ { 0x3345, 36332 },
+ { 0x3346, 36381 },
+ { 0x3347, 36403 },
+ { 0x3348, 36409 },
+ { 0x3349, 36184 },
+ { 0x334A, 36455 },
+ { 0x334B, 36182 },
+ { 0x334C, 36407 },
+ { 0x334D, 36405 },
+ { 0x334E, 36359 },
+ { 0x334F, 36361 },
+ { 0x3350, 36288 },
+ { 0x3351, 36411 },
+ { 0x3352, 36198 },
+ { 0x3353, 36351 },
+ { 0x3354, 36413 },
+ { 0x3355, 36196 },
+ { 0x3356, 36443 },
+ { 0x3357, 36357 },
+ { 0x3358, 68940 },
+ { 0x3359, 68898 },
+ { 0x335A, 68916 },
+ { 0x335B, 68958 },
+ { 0x335C, 68928 },
+ { 0x335D, 68922 },
+ { 0x335E, 68904 },
+ { 0x335F, 68952 },
+ { 0x3360, 68946 },
+ { 0x3361, 68934 },
+ { 0x3362, 68910 },
+ { 0x3363, 68964 },
+ { 0x3364, 68970 },
+ { 0x3365, 69012 },
+ { 0x3366, 69000 },
+ { 0x3367, 68982 },
+ { 0x3368, 68988 },
+ { 0x3369, 69018 },
+ { 0x336A, 68994 },
+ { 0x336B, 69006 },
+ { 0x336C, 68976 },
+ { 0x336D, 69024 },
+ { 0x336E, 69030 },
+ { 0x336F, 69042 },
+ { 0x3370, 69036 },
+ { 0x3371, 36122 },
+ { 0x3372, 35925 },
+ { 0x3373, 35907 },
+ { 0x3374, 36088 },
+ { 0x3375, 36059 },
+ { 0x3376, 36066 },
+ { 0x3377, 35931 },
+ { 0x3378, 35936 },
+ { 0x3379, 35933 },
+ { 0x337A, 35957 },
+ { 0x337B, 36100 },
+ { 0x337C, 36104 },
+ { 0x337D, 36108 },
+ { 0x337E, 36096 },
+ { 0x337F, 36461 },
+ { 0x3380, 36063 },
+ { 0x3381, 36047 },
+ { 0x3382, 36013 },
+ { 0x3383, 35992 },
+ { 0x3384, 35959 },
+ { 0x3385, 35961 },
+ { 0x3386, 35994 },
+ { 0x3387, 35943 },
+ { 0x3388, 36090 },
+ { 0x3389, 36173 },
+ { 0x338A, 36068 },
+ { 0x338B, 36049 },
+ { 0x338C, 36016 },
+ { 0x338D, 36019 },
+ { 0x338E, 35999 },
+ { 0x338F, 35963 },
+ { 0x3390, 35953 },
+ { 0x3391, 36124 },
+ { 0x3392, 36130 },
+ { 0x3393, 36116 },
+ { 0x3394, 36151 },
+ { 0x3395, 36022 },
+ { 0x3396, 36001 },
+ { 0x3397, 35929 },
+ { 0x3398, 35967 },
+ { 0x3399, 35941 },
+ { 0x339A, 36051 },
+ { 0x339B, 36025 },
+ { 0x339C, 36003 },
+ { 0x339D, 35915 },
+ { 0x339E, 35969 },
+ { 0x339F, 36008 },
+ { 0x33A0, 35920 },
+ { 0x33A1, 35898 },
+ { 0x33A2, 35977 },
+ { 0x33A3, 36005 },
+ { 0x33A4, 35917 },
+ { 0x33A5, 35895 },
+ { 0x33A6, 35971 },
+ { 0x33A7, 35886 },
+ { 0x33A8, 35890 },
+ { 0x33A9, 36061 },
+ { 0x33AA, 36126 },
+ { 0x33AB, 36136 },
+ { 0x33AC, 36118 },
+ { 0x33AD, 36140 },
+ { 0x33AE, 36142 },
+ { 0x33AF, 36146 },
+ { 0x33B0, 36076 },
+ { 0x33B1, 36053 },
+ { 0x33B2, 36028 },
+ { 0x33B3, 36011 },
+ { 0x33B4, 36078 },
+ { 0x33B5, 36055 },
+ { 0x33B6, 36031 },
+ { 0x33B7, 36037 },
+ { 0x33B8, 35982 },
+ { 0x33B9, 36039 },
+ { 0x33BA, 36080 },
+ { 0x33BB, 36057 },
+ { 0x33BC, 36034 },
+ { 0x33BD, 36042 },
+ { 0x33BE, 35984 },
+ { 0x33BF, 36044 },
+ { 0x33C0, 35880 },
+ { 0x33C1, 35883 },
+ { 0x33C2, 35905 },
+ { 0x33C3, 35909 },
+ { 0x33C4, 35911 },
+ { 0x33C5, 35913 },
+ { 0x33C6, 35876 },
+ { 0x33C7, 35923 },
+ { 0x33C8, 35927 },
+ { 0x33C9, 35945 },
+ { 0x33CA, 35947 },
+ { 0x33CB, 35951 },
+ { 0x33CC, 35955 },
+ { 0x33CD, 35965 },
+ { 0x33CE, 35974 },
+ { 0x33CF, 35980 },
+ { 0x33D0, 35986 },
+ { 0x33D1, 35988 },
+ { 0x33D2, 36128 },
+ { 0x33D3, 35990 },
+ { 0x33D4, 35996 },
+ { 0x33D5, 36132 },
+ { 0x33D6, 36134 },
+ { 0x33D7, 36070 },
+ { 0x33D8, 36072 },
+ { 0x33D9, 36138 },
+ { 0x33DA, 36074 },
+ { 0x33DB, 36082 },
+ { 0x33DC, 36084 },
+ { 0x33DD, 36086 },
+ { 0x33DE, 35901 },
+ { 0x33DF, 35872 },
+ { 0x33E0, 68707 },
+ { 0x33E1, 68725 },
+ { 0x33E2, 68761 },
+ { 0x33E3, 68737 },
+ { 0x33E4, 68731 },
+ { 0x33E5, 68713 },
+ { 0x33E6, 68755 },
+ { 0x33E7, 68749 },
+ { 0x33E8, 68743 },
+ { 0x33E9, 68719 },
+ { 0x33EA, 68767 },
+ { 0x33EB, 68779 },
+ { 0x33EC, 68821 },
+ { 0x33ED, 68809 },
+ { 0x33EE, 68791 },
+ { 0x33EF, 68797 },
+ { 0x33F0, 68827 },
+ { 0x33F1, 68803 },
+ { 0x33F2, 68815 },
+ { 0x33F3, 68785 },
+ { 0x33F4, 68839 },
+ { 0x33F5, 68851 },
+ { 0x33F6, 68887 },
+ { 0x33F7, 68863 },
+ { 0x33F8, 68857 },
+ { 0x33F9, 68845 },
+ { 0x33FA, 68881 },
+ { 0x33FB, 68875 },
+ { 0x33FC, 68869 },
+ { 0x33FD, 68773 },
+ { 0x33FE, 68833 },
+ { 0x33FF, 36114 },
+ { 0x4DC0, 52824 },
+ { 0x4DC1, 52838 },
+ { 0x4DC2, 52975 },
+ { 0x4DC3, 52945 },
+ { 0x4DC4, 52921 },
+ { 0x4DC5, 52927 },
+ { 0x4DC6, 52777 },
+ { 0x4DC7, 52907 },
+ { 0x4DC8, 52883 },
+ { 0x4DC9, 52942 },
+ { 0x4DCA, 52880 },
+ { 0x4DCB, 53002 },
+ { 0x4DCC, 52987 },
+ { 0x4DCD, 52864 },
+ { 0x4DCE, 52911 },
+ { 0x4DCF, 52984 },
+ { 0x4DD0, 52958 },
+ { 0x4DD1, 52843 },
+ { 0x4DD2, 52924 },
+ { 0x4DD3, 53017 },
+ { 0x4DD4, 52895 },
+ { 0x4DD5, 52853 },
+ { 0x4DD6, 52971 },
+ { 0x4DD7, 52904 },
+ { 0x4DD8, 52968 },
+ { 0x4DD9, 52860 },
+ { 0x4DDA, 52876 },
+ { 0x4DDB, 52868 },
+ { 0x4DDC, 52799 },
+ { 0x4DDD, 52819 },
+ { 0x4DDE, 52965 },
+ { 0x4DDF, 52933 },
+ { 0x4DE0, 52918 },
+ { 0x4DE1, 52856 },
+ { 0x4DE2, 52939 },
+ { 0x4DE3, 52952 },
+ { 0x4DE4, 52785 },
+ { 0x4DE5, 52993 },
+ { 0x4DE6, 53011 },
+ { 0x4DE7, 53005 },
+ { 0x4DE8, 52930 },
+ { 0x4DE9, 52936 },
+ { 0x4DEA, 53014 },
+ { 0x4DEB, 52899 },
+ { 0x4DEC, 52961 },
+ { 0x4DED, 52914 },
+ { 0x4DEE, 52996 },
+ { 0x4DEF, 52781 },
+ { 0x4DF0, 52999 },
+ { 0x4DF1, 52815 },
+ { 0x4DF2, 52810 },
+ { 0x4DF3, 52804 },
+ { 0x4DF4, 53008 },
+ { 0x4DF5, 52829 },
+ { 0x4DF6, 52949 },
+ { 0x4DF7, 52834 },
+ { 0x4DF8, 52789 },
+ { 0x4DF9, 52794 },
+ { 0x4DFA, 52981 },
+ { 0x4DFB, 52990 },
+ { 0x4DFC, 52872 },
+ { 0x4DFD, 52887 },
+ { 0x4DFE, 52849 },
+ { 0x4DFF, 52891 },
+ { 0x5000, 634 },
+ { 0x5001, 637 },
+ { 0x5002, 520 },
+ { 0x5003, 631 },
+ { 0x5004, 1300 },
+ { 0x5005, 1303 },
+ { 0x5006, 628 },
+ { 0x5007, 1297 },
+ { 0x5008, 529 },
+ { 0x5009, 532 },
+ { 0x500A, 514 },
+ { 0x500B, 526 },
+ { 0x500C, 2011 },
+ { 0x500D, 802 },
+ { 0x500E, 2008 },
+ { 0x500F, 721 },
+ { 0x5010, 724 },
+ { 0x5011, 523 },
+ { 0x5012, 718 },
+ { 0x5013, 586 },
+ { 0x5014, 517 },
+ { 0x5015, 829 },
+ { 0x5016, 910 },
+ { 0x5017, 913 },
+ { 0x5018, 541 },
+ { 0x5019, 907 },
+ { 0x501A, 2341 },
+ { 0x501B, 2344 },
+ { 0x501C, 904 },
+ { 0x501D, 2338 },
+ { 0x501E, 874 },
+ { 0x501F, 877 },
+ { 0x5020, 535 },
+ { 0x5021, 871 },
+ { 0x5022, 2350 },
+ { 0x5023, 925 },
+ { 0x5024, 2347 },
+ { 0x5025, 919 },
+ { 0x5026, 922 },
+ { 0x5027, 544 },
+ { 0x5028, 916 },
+ { 0x5029, 901 },
+ { 0x502A, 538 },
+ { 0x502B, 898 },
+ { 0x502C, 934 },
+ { 0x502D, 937 },
+ { 0x502E, 547 },
+ { 0x502F, 928 },
+ { 0x5030, 2353 },
+ { 0x5031, 931 },
+ { 0x5032, 946 },
+ { 0x5033, 949 },
+ { 0x5034, 550 },
+ { 0x5035, 940 },
+ { 0x5036, 2356 },
+ { 0x5037, 943 },
+ { 0x5038, 1705 },
+ { 0x5039, 1708 },
+ { 0x503A, 730 },
+ { 0x503B, 1702 },
+ { 0x503C, 3274 },
+ { 0x503D, 1699 },
+ { 0x503E, 3271 },
+ { 0x503F, 1693 },
+ { 0x5040, 1696 },
+ { 0x5041, 727 },
+ { 0x5042, 1690 },
+ { 0x5043, 3280 },
+ { 0x5044, 1720 },
+ { 0x5045, 3277 },
+ { 0x5046, 1714 },
+ { 0x5047, 1717 },
+ { 0x5048, 733 },
+ { 0x5049, 1711 },
+ { 0x504A, 1729 },
+ { 0x504B, 1732 },
+ { 0x504C, 736 },
+ { 0x504D, 1723 },
+ { 0x504E, 3283 },
+ { 0x504F, 1726 },
+ { 0x5050, 1741 },
+ { 0x5051, 1744 },
+ { 0x5052, 739 },
+ { 0x5053, 1735 },
+ { 0x5054, 3286 },
+ { 0x5055, 1738 },
+ { 0x5056, 2299 },
+ { 0x5057, 2302 },
+ { 0x5058, 886 },
+ { 0x5059, 2296 },
+ { 0x505A, 3709 },
+ { 0x505B, 3712 },
+ { 0x505C, 2293 },
+ { 0x505D, 3706 },
+ { 0x505E, 2281 },
+ { 0x505F, 2284 },
+ { 0x5060, 880 },
+ { 0x5061, 2278 },
+ { 0x5062, 3718 },
+ { 0x5063, 2314 },
+ { 0x5064, 3715 },
+ { 0x5065, 2308 },
+ { 0x5066, 2311 },
+ { 0x5067, 889 },
+ { 0x5068, 2305 },
+ { 0x5069, 2290 },
+ { 0x506A, 883 },
+ { 0x506B, 2287 },
+ { 0x506C, 2323 },
+ { 0x506D, 2326 },
+ { 0x506E, 892 },
+ { 0x506F, 2317 },
+ { 0x5070, 3721 },
+ { 0x5071, 2320 },
+ { 0x5072, 2332 },
+ { 0x5073, 2335 },
+ { 0x5074, 895 },
+ { 0x5075, 2329 },
+ { 0x5076, 2959 },
+ { 0x5077, 2962 },
+ { 0x5078, 1561 },
+ { 0x5079, 2956 },
+ { 0x507A, 3871 },
+ { 0x507B, 2953 },
+ { 0x507C, 3868 },
+ { 0x507D, 2947 },
+ { 0x507E, 2950 },
+ { 0x507F, 1558 },
+ { 0x5080, 2944 },
+ { 0x5081, 2968 },
+ { 0x5082, 2971 },
+ { 0x5083, 1564 },
+ { 0x5084, 2965 },
+ { 0x5085, 2980 },
+ { 0x5086, 2983 },
+ { 0x5087, 1567 },
+ { 0x5088, 2974 },
+ { 0x5089, 3874 },
+ { 0x508A, 2977 },
+ { 0x508B, 2992 },
+ { 0x508C, 2995 },
+ { 0x508D, 1570 },
+ { 0x508E, 2986 },
+ { 0x508F, 3877 },
+ { 0x5090, 2989 },
+ { 0x5091, 2647 },
+ { 0x5092, 2650 },
+ { 0x5093, 1252 },
+ { 0x5094, 2644 },
+ { 0x5095, 3793 },
+ { 0x5096, 2641 },
+ { 0x5097, 3790 },
+ { 0x5098, 2635 },
+ { 0x5099, 2638 },
+ { 0x509A, 1249 },
+ { 0x509B, 2632 },
+ { 0x509C, 3799 },
+ { 0x509D, 2662 },
+ { 0x509E, 3796 },
+ { 0x509F, 2656 },
+ { 0x50A0, 2659 },
+ { 0x50A1, 1255 },
+ { 0x50A2, 2653 },
+ { 0x50A3, 2671 },
+ { 0x50A4, 2674 },
+ { 0x50A5, 1258 },
+ { 0x50A6, 2665 },
+ { 0x50A7, 3802 },
+ { 0x50A8, 2668 },
+ { 0x50A9, 2683 },
+ { 0x50AA, 1261 },
+ { 0x50AB, 2677 },
+ { 0x50AC, 3805 },
+ { 0x50AD, 2680 },
+ { 0x50AE, 1513 },
+ { 0x50AF, 1516 },
+ { 0x50B0, 691 },
+ { 0x50B1, 1510 },
+ { 0x50B2, 2929 },
+ { 0x50B3, 1507 },
+ { 0x50B4, 2926 },
+ { 0x50B5, 1486 },
+ { 0x50B6, 1489 },
+ { 0x50B7, 685 },
+ { 0x50B8, 1483 },
+ { 0x50B9, 2935 },
+ { 0x50BA, 2938 },
+ { 0x50BB, 1528 },
+ { 0x50BC, 2932 },
+ { 0x50BD, 1522 },
+ { 0x50BE, 1525 },
+ { 0x50BF, 694 },
+ { 0x50C0, 1519 },
+ { 0x50C1, 1492 },
+ { 0x50C2, 688 },
+ { 0x50C3, 1537 },
+ { 0x50C4, 1540 },
+ { 0x50C5, 697 },
+ { 0x50C6, 1531 },
+ { 0x50C7, 2941 },
+ { 0x50C8, 1534 },
+ { 0x50C9, 1546 },
+ { 0x50CA, 1549 },
+ { 0x50CB, 700 },
+ { 0x50CC, 1543 },
+ { 0x50CD, 1108 },
+ { 0x50CE, 1111 },
+ { 0x50CF, 592 },
+ { 0x50D0, 1105 },
+ { 0x50D1, 1099 },
+ { 0x50D2, 1102 },
+ { 0x50D3, 589 },
+ { 0x50D4, 1096 },
+ { 0x50D5, 1117 },
+ { 0x50D6, 595 },
+ { 0x50D7, 1114 },
+ { 0x50D8, 1126 },
+ { 0x50D9, 1129 },
+ { 0x50DA, 598 },
+ { 0x50DB, 1120 },
+ { 0x50DC, 2494 },
+ { 0x50DD, 1123 },
+ { 0x50DE, 1135 },
+ { 0x50DF, 1138 },
+ { 0x50E0, 601 },
+ { 0x50E1, 1132 },
+ { 0x50E2, 2035 },
+ { 0x50E3, 2038 },
+ { 0x50E4, 808 },
+ { 0x50E5, 2032 },
+ { 0x50E6, 3523 },
+ { 0x50E7, 3526 },
+ { 0x50E8, 2029 },
+ { 0x50E9, 3520 },
+ { 0x50EA, 2017 },
+ { 0x50EB, 2020 },
+ { 0x50EC, 805 },
+ { 0x50ED, 2014 },
+ { 0x50EE, 2044 },
+ { 0x50EF, 2047 },
+ { 0x50F0, 811 },
+ { 0x50F1, 2041 },
+ { 0x50F2, 2026 },
+ { 0x50F3, 2023 },
+ { 0x50F4, 2056 },
+ { 0x50F5, 2059 },
+ { 0x50F6, 814 },
+ { 0x50F7, 2050 },
+ { 0x50F8, 3529 },
+ { 0x50F9, 2053 },
+ { 0x50FA, 2068 },
+ { 0x50FB, 2071 },
+ { 0x50FC, 817 },
+ { 0x50FD, 2062 },
+ { 0x50FE, 3532 },
+ { 0x50FF, 2065 },
+ { 0x5100, 1066 },
+ { 0x5101, 1069 },
+ { 0x5102, 577 },
+ { 0x5103, 1063 },
+ { 0x5104, 2485 },
+ { 0x5105, 1060 },
+ { 0x5106, 2482 },
+ { 0x5107, 1033 },
+ { 0x5108, 1036 },
+ { 0x5109, 571 },
+ { 0x510A, 1030 },
+ { 0x510B, 2488 },
+ { 0x510C, 1081 },
+ { 0x510D, 1075 },
+ { 0x510E, 1078 },
+ { 0x510F, 580 },
+ { 0x5110, 1072 },
+ { 0x5111, 1057 },
+ { 0x5112, 574 },
+ { 0x5113, 1054 },
+ { 0x5114, 1090 },
+ { 0x5115, 1093 },
+ { 0x5116, 583 },
+ { 0x5117, 1084 },
+ { 0x5118, 2491 },
+ { 0x5119, 1087 },
+ { 0x511A, 1978 },
+ { 0x511B, 1981 },
+ { 0x511C, 793 },
+ { 0x511D, 1975 },
+ { 0x511E, 3505 },
+ { 0x511F, 1972 },
+ { 0x5120, 3502 },
+ { 0x5121, 1960 },
+ { 0x5122, 1963 },
+ { 0x5123, 787 },
+ { 0x5124, 1957 },
+ { 0x5125, 3511 },
+ { 0x5126, 3514 },
+ { 0x5127, 1993 },
+ { 0x5128, 3508 },
+ { 0x5129, 1987 },
+ { 0x512A, 1990 },
+ { 0x512B, 796 },
+ { 0x512C, 1984 },
+ { 0x512D, 1969 },
+ { 0x512E, 790 },
+ { 0x512F, 1966 },
+ { 0x5130, 2002 },
+ { 0x5131, 2005 },
+ { 0x5132, 799 },
+ { 0x5133, 1996 },
+ { 0x5134, 3517 },
+ { 0x5135, 1999 },
+ { 0x5136, 2452 },
+ { 0x5137, 2455 },
+ { 0x5138, 1045 },
+ { 0x5139, 2449 },
+ { 0x513A, 3742 },
+ { 0x513B, 2446 },
+ { 0x513C, 3739 },
+ { 0x513D, 2434 },
+ { 0x513E, 2437 },
+ { 0x513F, 1039 },
+ { 0x5140, 2431 },
+ { 0x5141, 3748 },
+ { 0x5142, 2467 },
+ { 0x5143, 3745 },
+ { 0x5144, 2461 },
+ { 0x5145, 2464 },
+ { 0x5146, 1048 },
+ { 0x5147, 2458 },
+ { 0x5148, 2443 },
+ { 0x5149, 1042 },
+ { 0x514A, 2440 },
+ { 0x514B, 2476 },
+ { 0x514C, 2479 },
+ { 0x514D, 1051 },
+ { 0x514E, 2470 },
+ { 0x514F, 3751 },
+ { 0x5150, 2473 },
+ { 0x5151, 3019 },
+ { 0x5152, 3022 },
+ { 0x5153, 1579 },
+ { 0x5154, 3016 },
+ { 0x5155, 3880 },
+ { 0x5156, 3013 },
+ { 0x5157, 3001 },
+ { 0x5158, 3004 },
+ { 0x5159, 1573 },
+ { 0x515A, 2998 },
+ { 0x515B, 3028 },
+ { 0x515C, 3031 },
+ { 0x515D, 1582 },
+ { 0x515E, 3025 },
+ { 0x515F, 3010 },
+ { 0x5160, 1576 },
+ { 0x5161, 3007 },
+ { 0x5162, 3040 },
+ { 0x5163, 3043 },
+ { 0x5164, 1585 },
+ { 0x5165, 3034 },
+ { 0x5166, 3883 },
+ { 0x5167, 3037 },
+ { 0x5168, 2707 },
+ { 0x5169, 2710 },
+ { 0x516A, 1270 },
+ { 0x516B, 2704 },
+ { 0x516C, 3811 },
+ { 0x516D, 3814 },
+ { 0x516E, 2701 },
+ { 0x516F, 3808 },
+ { 0x5170, 2689 },
+ { 0x5171, 2692 },
+ { 0x5172, 1264 },
+ { 0x5173, 2686 },
+ { 0x5174, 3817 },
+ { 0x5175, 2722 },
+ { 0x5176, 2716 },
+ { 0x5177, 2719 },
+ { 0x5178, 2713 },
+ { 0x5179, 2698 },
+ { 0x517A, 1267 },
+ { 0x517B, 2695 },
+ { 0x517C, 2725 },
+ { 0x517D, 1609 },
+ { 0x517E, 1612 },
+ { 0x517F, 709 },
+ { 0x5180, 1606 },
+ { 0x5181, 3079 },
+ { 0x5182, 1603 },
+ { 0x5183, 3076 },
+ { 0x5184, 1555 },
+ { 0x5185, 703 },
+ { 0x5186, 1552 },
+ { 0x5187, 3178 },
+ { 0x5188, 1651 },
+ { 0x5189, 3175 },
+ { 0x518A, 1630 },
+ { 0x518B, 1633 },
+ { 0x518C, 712 },
+ { 0x518D, 1627 },
+ { 0x518E, 1591 },
+ { 0x518F, 706 },
+ { 0x5190, 1588 },
+ { 0x5191, 1660 },
+ { 0x5192, 1663 },
+ { 0x5193, 715 },
+ { 0x5194, 1654 },
+ { 0x5195, 3181 },
+ { 0x5196, 1657 },
+ { 0x5197, 2593 },
+ { 0x5198, 2596 },
+ { 0x5199, 1237 },
+ { 0x519A, 2590 },
+ { 0x519B, 3775 },
+ { 0x519C, 2587 },
+ { 0x519D, 3772 },
+ { 0x519E, 2575 },
+ { 0x519F, 2578 },
+ { 0x51A0, 1231 },
+ { 0x51A1, 2572 },
+ { 0x51A2, 3781 },
+ { 0x51A3, 2605 },
+ { 0x51A4, 3778 },
+ { 0x51A5, 2602 },
+ { 0x51A6, 1240 },
+ { 0x51A7, 2599 },
+ { 0x51A8, 2584 },
+ { 0x51A9, 1234 },
+ { 0x51AA, 2581 },
+ { 0x51AB, 2614 },
+ { 0x51AC, 2617 },
+ { 0x51AD, 1243 },
+ { 0x51AE, 2608 },
+ { 0x51AF, 3784 },
+ { 0x51B0, 2611 },
+ { 0x51B1, 2626 },
+ { 0x51B2, 2629 },
+ { 0x51B3, 1246 },
+ { 0x51B4, 2620 },
+ { 0x51B5, 3787 },
+ { 0x51B6, 2623 },
+ { 0x51B7, 1441 },
+ { 0x51B8, 1444 },
+ { 0x51B9, 673 },
+ { 0x51BA, 1438 },
+ { 0x51BB, 2863 },
+ { 0x51BC, 2866 },
+ { 0x51BD, 1435 },
+ { 0x51BE, 2860 },
+ { 0x51BF, 1423 },
+ { 0x51C0, 1426 },
+ { 0x51C1, 667 },
+ { 0x51C2, 1420 },
+ { 0x51C3, 2872 },
+ { 0x51C4, 2875 },
+ { 0x51C5, 1456 },
+ { 0x51C6, 2869 },
+ { 0x51C7, 1450 },
+ { 0x51C8, 1453 },
+ { 0x51C9, 676 },
+ { 0x51CA, 1447 },
+ { 0x51CB, 1432 },
+ { 0x51CC, 670 },
+ { 0x51CD, 1429 },
+ { 0x51CE, 1465 },
+ { 0x51CF, 1468 },
+ { 0x51D0, 679 },
+ { 0x51D1, 1459 },
+ { 0x51D2, 2878 },
+ { 0x51D3, 1462 },
+ { 0x51D4, 1477 },
+ { 0x51D5, 1480 },
+ { 0x51D6, 682 },
+ { 0x51D7, 1471 },
+ { 0x51D8, 2881 },
+ { 0x51D9, 1474 },
+ { 0x51DA, 1180 },
+ { 0x51DB, 1183 },
+ { 0x51DC, 610 },
+ { 0x51DD, 1177 },
+ { 0x51DE, 2551 },
+ { 0x51DF, 2554 },
+ { 0x51E0, 1174 },
+ { 0x51E1, 2548 },
+ { 0x51E2, 1144 },
+ { 0x51E3, 1147 },
+ { 0x51E4, 604 },
+ { 0x51E5, 1141 },
+ { 0x51E6, 2560 },
+ { 0x51E7, 2563 },
+ { 0x51E8, 1195 },
+ { 0x51E9, 2557 },
+ { 0x51EA, 1189 },
+ { 0x51EB, 1192 },
+ { 0x51EC, 613 },
+ { 0x51ED, 1186 },
+ { 0x51EE, 1153 },
+ { 0x51EF, 1156 },
+ { 0x51F0, 607 },
+ { 0x51F1, 1150 },
+ { 0x51F2, 1204 },
+ { 0x51F3, 1207 },
+ { 0x51F4, 616 },
+ { 0x51F5, 1198 },
+ { 0x51F6, 2566 },
+ { 0x51F7, 1201 },
+ { 0x51F8, 1390 },
+ { 0x51F9, 1393 },
+ { 0x51FA, 658 },
+ { 0x51FB, 1387 },
+ { 0x51FC, 2848 },
+ { 0x51FD, 1384 },
+ { 0x51FE, 2845 },
+ { 0x51FF, 1369 },
+ { 0x5200, 1372 },
+ { 0x5201, 652 },
+ { 0x5202, 1366 },
+ { 0x5203, 2854 },
+ { 0x5204, 1405 },
+ { 0x5205, 2851 },
+ { 0x5206, 1399 },
+ { 0x5207, 1402 },
+ { 0x5208, 661 },
+ { 0x5209, 1396 },
+ { 0x520A, 1378 },
+ { 0x520B, 1381 },
+ { 0x520C, 655 },
+ { 0x520D, 1375 },
+ { 0x520E, 1414 },
+ { 0x520F, 1417 },
+ { 0x5210, 664 },
+ { 0x5211, 1408 },
+ { 0x5212, 2857 },
+ { 0x5213, 1411 },
+ { 0x5214, 2518 },
+ { 0x5215, 2521 },
+ { 0x5216, 1165 },
+ { 0x5217, 3757 },
+ { 0x5218, 2515 },
+ { 0x5219, 3754 },
+ { 0x521A, 2500 },
+ { 0x521B, 2503 },
+ { 0x521C, 1159 },
+ { 0x521D, 2497 },
+ { 0x521E, 3763 },
+ { 0x521F, 3766 },
+ { 0x5220, 2533 },
+ { 0x5221, 3760 },
+ { 0x5222, 2527 },
+ { 0x5223, 2530 },
+ { 0x5224, 1168 },
+ { 0x5225, 2524 },
+ { 0x5226, 2509 },
+ { 0x5227, 2512 },
+ { 0x5228, 1162 },
+ { 0x5229, 2506 },
+ { 0x522A, 2542 },
+ { 0x522B, 2545 },
+ { 0x522C, 1171 },
+ { 0x522D, 2536 },
+ { 0x522E, 3769 },
+ { 0x522F, 2539 },
+ { 0x5230, 3856 },
+ { 0x5231, 2899 },
+ { 0x5232, 2887 },
+ { 0x5233, 2890 },
+ { 0x5234, 1495 },
+ { 0x5235, 2884 },
+ { 0x5236, 3862 },
+ { 0x5237, 2911 },
+ { 0x5238, 3859 },
+ { 0x5239, 2905 },
+ { 0x523A, 2908 },
+ { 0x523B, 1501 },
+ { 0x523C, 2902 },
+ { 0x523D, 2896 },
+ { 0x523E, 1498 },
+ { 0x523F, 2893 },
+ { 0x5240, 2920 },
+ { 0x5241, 2923 },
+ { 0x5242, 1504 },
+ { 0x5243, 2914 },
+ { 0x5244, 3865 },
+ { 0x5245, 2917 },
+ { 0x5246, 2758 },
+ { 0x5247, 2761 },
+ { 0x5248, 1291 },
+ { 0x5249, 2755 },
+ { 0x524A, 3823 },
+ { 0x524B, 3826 },
+ { 0x524C, 2752 },
+ { 0x524D, 3820 },
+ { 0x524E, 2740 },
+ { 0x524F, 2743 },
+ { 0x5250, 1285 },
+ { 0x5251, 2737 },
+ { 0x5252, 3832 },
+ { 0x5253, 3835 },
+ { 0x5254, 2773 },
+ { 0x5255, 3829 },
+ { 0x5256, 2767 },
+ { 0x5257, 2770 },
+ { 0x5258, 1294 },
+ { 0x5259, 2764 },
+ { 0x525A, 2749 },
+ { 0x525B, 1288 },
+ { 0x525C, 2746 },
+ { 0x525D, 3889 },
+ { 0x525E, 3061 },
+ { 0x525F, 3886 },
+ { 0x5260, 3049 },
+ { 0x5261, 3052 },
+ { 0x5262, 1594 },
+ { 0x5263, 3046 },
+ { 0x5264, 3892 },
+ { 0x5265, 3895 },
+ { 0x5266, 3073 },
+ { 0x5267, 3067 },
+ { 0x5268, 3070 },
+ { 0x5269, 1600 },
+ { 0x526A, 3064 },
+ { 0x526B, 3058 },
+ { 0x526C, 1597 },
+ { 0x526D, 3055 },
+ { 0x526E, 1228 },
+ { 0x526F, 2569 },
+ { 0x5270, 1225 },
+ { 0x5271, 1213 },
+ { 0x5272, 1216 },
+ { 0x5273, 619 },
+ { 0x5274, 1210 },
+ { 0x5275, 2731 },
+ { 0x5276, 2734 },
+ { 0x5277, 1282 },
+ { 0x5278, 2728 },
+ { 0x5279, 1276 },
+ { 0x527A, 1279 },
+ { 0x527B, 625 },
+ { 0x527C, 1273 },
+ { 0x527D, 1222 },
+ { 0x527E, 622 },
+ { 0x527F, 1219 },
+ { 0x5280, 2077 },
+ { 0x5281, 2080 },
+ { 0x5282, 820 },
+ { 0x5283, 2074 },
+ { 0x5284, 3538 },
+ { 0x5285, 2095 },
+ { 0x5286, 3535 },
+ { 0x5287, 2092 },
+ { 0x5288, 826 },
+ { 0x5289, 2089 },
+ { 0x528A, 2086 },
+ { 0x528B, 823 },
+ { 0x528C, 2083 },
+ { 0x528D, 2218 },
+ { 0x528E, 2221 },
+ { 0x528F, 859 },
+ { 0x5290, 2215 },
+ { 0x5291, 3637 },
+ { 0x5292, 2212 },
+ { 0x5293, 3634 },
+ { 0x5294, 2185 },
+ { 0x5295, 2188 },
+ { 0x5296, 853 },
+ { 0x5297, 2182 },
+ { 0x5298, 3643 },
+ { 0x5299, 2233 },
+ { 0x529A, 3640 },
+ { 0x529B, 2227 },
+ { 0x529C, 2230 },
+ { 0x529D, 862 },
+ { 0x529E, 2224 },
+ { 0x529F, 2194 },
+ { 0x52A0, 856 },
+ { 0x52A1, 2191 },
+ { 0x52A2, 2242 },
+ { 0x52A3, 2245 },
+ { 0x52A4, 865 },
+ { 0x52A5, 2236 },
+ { 0x52A6, 3646 },
+ { 0x52A7, 2239 },
+ { 0x52A8, 2254 },
+ { 0x52A9, 2257 },
+ { 0x52AA, 868 },
+ { 0x52AB, 2248 },
+ { 0x52AC, 3649 },
+ { 0x52AD, 2251 },
+ { 0x52AE, 988 },
+ { 0x52AF, 991 },
+ { 0x52B0, 559 },
+ { 0x52B1, 985 },
+ { 0x52B2, 2413 },
+ { 0x52B3, 2416 },
+ { 0x52B4, 982 },
+ { 0x52B5, 2410 },
+ { 0x52B6, 955 },
+ { 0x52B7, 958 },
+ { 0x52B8, 553 },
+ { 0x52B9, 952 },
+ { 0x52BA, 2422 },
+ { 0x52BB, 1003 },
+ { 0x52BC, 2419 },
+ { 0x52BD, 997 },
+ { 0x52BE, 1000 },
+ { 0x52BF, 562 },
+ { 0x52C0, 994 },
+ { 0x52C1, 964 },
+ { 0x52C2, 556 },
+ { 0x52C3, 961 },
+ { 0x52C4, 1012 },
+ { 0x52C5, 1015 },
+ { 0x52C6, 565 },
+ { 0x52C7, 1006 },
+ { 0x52C8, 2425 },
+ { 0x52C9, 1009 },
+ { 0x52CA, 1024 },
+ { 0x52CB, 1027 },
+ { 0x52CC, 568 },
+ { 0x52CD, 1018 },
+ { 0x52CE, 2428 },
+ { 0x52CF, 1021 },
+ { 0x52D0, 3673 },
+ { 0x52D1, 3676 },
+ { 0x52D2, 2266 },
+ { 0x52D3, 3670 },
+ { 0x52D4, 3997 },
+ { 0x52D5, 4000 },
+ { 0x52D6, 3667 },
+ { 0x52D7, 3994 },
+ { 0x52D8, 3655 },
+ { 0x52D9, 3658 },
+ { 0x52DA, 2260 },
+ { 0x52DB, 3652 },
+ { 0x52DC, 3682 },
+ { 0x52DD, 2269 },
+ { 0x52DE, 3679 },
+ { 0x52DF, 3664 },
+ { 0x52E0, 2263 },
+ { 0x52E1, 3661 },
+ { 0x52E2, 3691 },
+ { 0x52E3, 2272 },
+ { 0x52E4, 3685 },
+ { 0x52E5, 4003 },
+ { 0x52E6, 3688 },
+ { 0x52E7, 3700 },
+ { 0x52E8, 3703 },
+ { 0x52E9, 2275 },
+ { 0x52EA, 3694 },
+ { 0x52EB, 4006 },
+ { 0x52EC, 3697 },
+ { 0x52ED, 3235 },
+ { 0x52EE, 3238 },
+ { 0x52EF, 1681 },
+ { 0x52F0, 3232 },
+ { 0x52F1, 3940 },
+ { 0x52F2, 3229 },
+ { 0x52F3, 3937 },
+ { 0x52F4, 3220 },
+ { 0x52F5, 3223 },
+ { 0x52F6, 1675 },
+ { 0x52F7, 3217 },
+ { 0x52F8, 3943 },
+ { 0x52F9, 3247 },
+ { 0x52FA, 3244 },
+ { 0x52FB, 3241 },
+ { 0x52FC, 3226 },
+ { 0x52FD, 1678 },
+ { 0x52FE, 3256 },
+ { 0x52FF, 1684 },
+ { 0x5300, 3250 },
+ { 0x5301, 3946 },
+ { 0x5302, 3253 },
+ { 0x5303, 3265 },
+ { 0x5304, 3268 },
+ { 0x5305, 1687 },
+ { 0x5306, 3259 },
+ { 0x5307, 3949 },
+ { 0x5308, 3262 },
+ { 0x5309, 1897 },
+ { 0x530A, 1900 },
+ { 0x530B, 775 },
+ { 0x530C, 1894 },
+ { 0x530D, 3430 },
+ { 0x530E, 1891 },
+ { 0x530F, 3427 },
+ { 0x5310, 1864 },
+ { 0x5311, 1867 },
+ { 0x5312, 769 },
+ { 0x5313, 1861 },
+ { 0x5314, 3493 },
+ { 0x5315, 1930 },
+ { 0x5316, 3490 },
+ { 0x5317, 1906 },
+ { 0x5318, 1909 },
+ { 0x5319, 778 },
+ { 0x531A, 1903 },
+ { 0x531B, 1873 },
+ { 0x531C, 772 },
+ { 0x531D, 1870 },
+ { 0x531E, 1939 },
+ { 0x531F, 1942 },
+ { 0x5320, 781 },
+ { 0x5321, 1933 },
+ { 0x5322, 3496 },
+ { 0x5323, 1936 },
+ { 0x5324, 1951 },
+ { 0x5325, 1954 },
+ { 0x5326, 784 },
+ { 0x5327, 1945 },
+ { 0x5328, 3499 },
+ { 0x5329, 1948 },
+ { 0x532A, 3454 },
+ { 0x532B, 3457 },
+ { 0x532C, 1918 },
+ { 0x532D, 3451 },
+ { 0x532E, 3976 },
+ { 0x532F, 3448 },
+ { 0x5330, 3973 },
+ { 0x5331, 3436 },
+ { 0x5332, 3439 },
+ { 0x5333, 1912 },
+ { 0x5334, 3433 },
+ { 0x5335, 3463 },
+ { 0x5336, 3466 },
+ { 0x5337, 1921 },
+ { 0x5338, 3460 },
+ { 0x5339, 3445 },
+ { 0x533A, 1915 },
+ { 0x533B, 3442 },
+ { 0x533C, 3472 },
+ { 0x533D, 3475 },
+ { 0x533E, 1924 },
+ { 0x533F, 3469 },
+ { 0x5340, 3484 },
+ { 0x5341, 3487 },
+ { 0x5342, 1927 },
+ { 0x5343, 3478 },
+ { 0x5344, 3979 },
+ { 0x5345, 3481 },
+ { 0x5346, 3583 },
+ { 0x5347, 3586 },
+ { 0x5348, 2197 },
+ { 0x5349, 3580 },
+ { 0x534A, 3985 },
+ { 0x534B, 3607 },
+ { 0x534C, 3982 },
+ { 0x534D, 3601 },
+ { 0x534E, 3604 },
+ { 0x534F, 2203 },
+ { 0x5350, 3598 },
+ { 0x5351, 3592 },
+ { 0x5352, 3595 },
+ { 0x5353, 2200 },
+ { 0x5354, 3589 },
+ { 0x5355, 3616 },
+ { 0x5356, 3619 },
+ { 0x5357, 2206 },
+ { 0x5358, 3610 },
+ { 0x5359, 3988 },
+ { 0x535A, 3613 },
+ { 0x535B, 3628 },
+ { 0x535C, 3631 },
+ { 0x535D, 2209 },
+ { 0x535E, 3622 },
+ { 0x535F, 3991 },
+ { 0x5360, 3625 },
+ { 0x5361, 2362 },
+ { 0x5362, 2365 },
+ { 0x5363, 967 },
+ { 0x5364, 2359 },
+ { 0x5365, 3727 },
+ { 0x5366, 3730 },
+ { 0x5367, 2386 },
+ { 0x5368, 3724 },
+ { 0x5369, 2380 },
+ { 0x536A, 2383 },
+ { 0x536B, 973 },
+ { 0x536C, 2377 },
+ { 0x536D, 2371 },
+ { 0x536E, 2374 },
+ { 0x536F, 970 },
+ { 0x5370, 2368 },
+ { 0x5371, 2395 },
+ { 0x5372, 976 },
+ { 0x5373, 2389 },
+ { 0x5374, 3733 },
+ { 0x5375, 2392 },
+ { 0x5376, 2404 },
+ { 0x5377, 2407 },
+ { 0x5378, 979 },
+ { 0x5379, 2398 },
+ { 0x537A, 3736 },
+ { 0x537B, 2401 },
+ { 0x537C, 3313 },
+ { 0x537D, 1819 },
+ { 0x537E, 3952 },
+ { 0x537F, 3334 },
+ { 0x5380, 3328 },
+ { 0x5381, 3331 },
+ { 0x5382, 1825 },
+ { 0x5383, 3325 },
+ { 0x5384, 3319 },
+ { 0x5385, 3322 },
+ { 0x5386, 1822 },
+ { 0x5387, 3316 },
+ { 0x5388, 3343 },
+ { 0x5389, 3346 },
+ { 0x538A, 1828 },
+ { 0x538B, 3337 },
+ { 0x538C, 3955 },
+ { 0x538D, 3340 },
+ { 0x538E, 3355 },
+ { 0x538F, 3358 },
+ { 0x5390, 1831 },
+ { 0x5391, 3349 },
+ { 0x5392, 3958 },
+ { 0x5393, 3352 },
+ { 0x5394, 3130 },
+ { 0x5395, 3133 },
+ { 0x5396, 1636 },
+ { 0x5397, 3127 },
+ { 0x5398, 3148 },
+ { 0x5399, 1642 },
+ { 0x539A, 3145 },
+ { 0x539B, 3139 },
+ { 0x539C, 3142 },
+ { 0x539D, 1639 },
+ { 0x539E, 3136 },
+ { 0x539F, 3157 },
+ { 0x53A0, 3160 },
+ { 0x53A1, 1645 },
+ { 0x53A2, 3151 },
+ { 0x53A3, 3916 },
+ { 0x53A4, 3154 },
+ { 0x53A5, 3169 },
+ { 0x53A6, 3172 },
+ { 0x53A7, 1648 },
+ { 0x53A8, 3163 },
+ { 0x53A9, 3919 },
+ { 0x53AA, 3166 },
+ { 0x53AB, 3376 },
+ { 0x53AC, 3379 },
+ { 0x53AD, 1876 },
+ { 0x53AE, 3373 },
+ { 0x53AF, 3964 },
+ { 0x53B0, 3400 },
+ { 0x53B1, 3961 },
+ { 0x53B2, 3394 },
+ { 0x53B3, 3397 },
+ { 0x53B4, 1882 },
+ { 0x53B5, 3391 },
+ { 0x53B6, 3385 },
+ { 0x53B7, 3388 },
+ { 0x53B8, 1879 },
+ { 0x53B9, 3382 },
+ { 0x53BA, 3409 },
+ { 0x53BB, 3412 },
+ { 0x53BC, 1885 },
+ { 0x53BD, 3403 },
+ { 0x53BE, 3967 },
+ { 0x53BF, 3406 },
+ { 0x53C0, 3421 },
+ { 0x53C1, 3424 },
+ { 0x53C2, 1888 },
+ { 0x53C3, 3415 },
+ { 0x53C4, 3970 },
+ { 0x53C5, 3418 },
+ { 0x53C6, 1798 },
+ { 0x53C7, 1801 },
+ { 0x53C8, 754 },
+ { 0x53C9, 1795 },
+ { 0x53CA, 3364 },
+ { 0x53CB, 1834 },
+ { 0x53CC, 3361 },
+ { 0x53CD, 1813 },
+ { 0x53CE, 1816 },
+ { 0x53CF, 760 },
+ { 0x53D0, 1810 },
+ { 0x53D1, 1807 },
+ { 0x53D2, 757 },
+ { 0x53D3, 1804 },
+ { 0x53D4, 1843 },
+ { 0x53D5, 1846 },
+ { 0x53D6, 763 },
+ { 0x53D7, 1837 },
+ { 0x53D8, 3367 },
+ { 0x53D9, 1840 },
+ { 0x53DA, 1855 },
+ { 0x53DB, 1858 },
+ { 0x53DC, 766 },
+ { 0x53DD, 1849 },
+ { 0x53DE, 3370 },
+ { 0x53DF, 1852 },
+ { 0x53E0, 1312 },
+ { 0x53E1, 1315 },
+ { 0x53E2, 640 },
+ { 0x53E3, 1309 },
+ { 0x53E4, 2779 },
+ { 0x53E5, 2782 },
+ { 0x53E6, 1306 },
+ { 0x53E7, 2776 },
+ { 0x53E8, 2833 },
+ { 0x53E9, 2836 },
+ { 0x53EA, 1339 },
+ { 0x53EB, 2830 },
+ { 0x53EC, 1333 },
+ { 0x53ED, 1336 },
+ { 0x53EE, 643 },
+ { 0x53EF, 1330 },
+ { 0x53F0, 1348 },
+ { 0x53F1, 1351 },
+ { 0x53F2, 646 },
+ { 0x53F3, 1342 },
+ { 0x53F4, 2839 },
+ { 0x53F5, 1345 },
+ { 0x53F6, 1360 },
+ { 0x53F7, 1363 },
+ { 0x53F8, 649 },
+ { 0x53F9, 1354 },
+ { 0x53FA, 2842 },
+ { 0x53FB, 1357 },
+ { 0x53FC, 1753 },
+ { 0x53FD, 1756 },
+ { 0x53FE, 742 },
+ { 0x53FF, 1750 },
+ { 0x5400, 3292 },
+ { 0x5401, 3295 },
+ { 0x5402, 1747 },
+ { 0x5403, 3289 },
+ { 0x5404, 3301 },
+ { 0x5405, 3304 },
+ { 0x5406, 1768 },
+ { 0x5407, 3298 },
+ { 0x5408, 1762 },
+ { 0x5409, 1765 },
+ { 0x540A, 745 },
+ { 0x540B, 1759 },
+ { 0x540C, 1777 },
+ { 0x540D, 1780 },
+ { 0x540E, 748 },
+ { 0x540F, 1771 },
+ { 0x5410, 3307 },
+ { 0x5411, 1774 },
+ { 0x5412, 1789 },
+ { 0x5413, 1792 },
+ { 0x5414, 751 },
+ { 0x5415, 1783 },
+ { 0x5416, 3310 },
+ { 0x5417, 1786 },
+ { 0x5418, 2791 },
+ { 0x5419, 2794 },
+ { 0x541A, 1318 },
+ { 0x541B, 2788 },
+ { 0x541C, 3841 },
+ { 0x541D, 3844 },
+ { 0x541E, 2785 },
+ { 0x541F, 3838 },
+ { 0x5420, 3850 },
+ { 0x5421, 2806 },
+ { 0x5422, 3847 },
+ { 0x5423, 2800 },
+ { 0x5424, 2803 },
+ { 0x5425, 1321 },
+ { 0x5426, 2797 },
+ { 0x5427, 2815 },
+ { 0x5428, 2818 },
+ { 0x5429, 1324 },
+ { 0x542A, 2809 },
+ { 0x542B, 3853 },
+ { 0x542C, 2812 },
+ { 0x542D, 2824 },
+ { 0x542E, 2827 },
+ { 0x542F, 1327 },
+ { 0x5430, 2821 },
+ { 0x5431, 3088 },
+ { 0x5432, 3091 },
+ { 0x5433, 1615 },
+ { 0x5434, 3085 },
+ { 0x5435, 3901 },
+ { 0x5436, 3904 },
+ { 0x5437, 3082 },
+ { 0x5438, 3898 },
+ { 0x5439, 3907 },
+ { 0x543A, 3103 },
+ { 0x543B, 3097 },
+ { 0x543C, 3100 },
+ { 0x543D, 1618 },
+ { 0x543E, 3094 },
+ { 0x543F, 3112 },
+ { 0x5440, 1621 },
+ { 0x5441, 3106 },
+ { 0x5442, 3910 },
+ { 0x5443, 3109 },
+ { 0x5444, 3121 },
+ { 0x5445, 3124 },
+ { 0x5446, 1624 },
+ { 0x5447, 3115 },
+ { 0x5448, 3913 },
+ { 0x5449, 3118 },
+ { 0x544A, 3190 },
+ { 0x544B, 3193 },
+ { 0x544C, 1666 },
+ { 0x544D, 3187 },
+ { 0x544E, 3925 },
+ { 0x544F, 3928 },
+ { 0x5450, 3184 },
+ { 0x5451, 3922 },
+ { 0x5452, 3934 },
+ { 0x5453, 3205 },
+ { 0x5454, 3931 },
+ { 0x5455, 3199 },
+ { 0x5456, 3202 },
+ { 0x5457, 1669 },
+ { 0x5458, 3196 },
+ { 0x5459, 3211 },
+ { 0x545A, 3214 },
+ { 0x545B, 1672 },
+ { 0x545C, 3208 },
+ { 0x545D, 2104 },
+ { 0x545E, 2107 },
+ { 0x545F, 832 },
+ { 0x5460, 2101 },
+ { 0x5461, 3544 },
+ { 0x5462, 3547 },
+ { 0x5463, 2098 },
+ { 0x5464, 3541 },
+ { 0x5465, 3550 },
+ { 0x5466, 2119 },
+ { 0x5467, 2113 },
+ { 0x5468, 2116 },
+ { 0x5469, 835 },
+ { 0x546A, 2110 },
+ { 0x546B, 2128 },
+ { 0x546C, 2131 },
+ { 0x546D, 838 },
+ { 0x546E, 2122 },
+ { 0x546F, 3553 },
+ { 0x5470, 2125 },
+ { 0x5471, 2140 },
+ { 0x5472, 2143 },
+ { 0x5473, 841 },
+ { 0x5474, 2137 },
+ { 0x5475, 3559 },
+ { 0x5476, 3562 },
+ { 0x5477, 2134 },
+ { 0x5478, 3556 },
+ { 0x5479, 3568 },
+ { 0x547A, 3571 },
+ { 0x547B, 2155 },
+ { 0x547C, 3565 },
+ { 0x547D, 2149 },
+ { 0x547E, 2152 },
+ { 0x547F, 844 },
+ { 0x5480, 2146 },
+ { 0x5481, 2164 },
+ { 0x5482, 2167 },
+ { 0x5483, 847 },
+ { 0x5484, 2158 },
+ { 0x5485, 3574 },
+ { 0x5486, 2161 },
+ { 0x5487, 2176 },
+ { 0x5488, 2179 },
+ { 0x5489, 850 },
+ { 0x548A, 2170 },
+ { 0x548B, 3577 },
+ { 0x548C, 2173 },
+ { 0x5490, 430 },
+ { 0x5491, 364 },
+ { 0x5492, 412 },
+ { 0x5493, 493 },
+ { 0x5494, 394 },
+ { 0x5495, 436 },
+ { 0x5496, 469 },
+ { 0x5497, 400 },
+ { 0x5498, 367 },
+ { 0x5499, 475 },
+ { 0x549A, 418 },
+ { 0x549B, 460 },
+ { 0x549C, 421 },
+ { 0x549D, 379 },
+ { 0x549E, 424 },
+ { 0x549F, 481 },
+ { 0x54A0, 439 },
+ { 0x54A1, 355 },
+ { 0x54A2, 454 },
+ { 0x54A3, 397 },
+ { 0x54A4, 466 },
+ { 0x54A5, 385 },
+ { 0x54A6, 472 },
+ { 0x54A7, 496 },
+ { 0x54A8, 373 },
+ { 0x54A9, 370 },
+ { 0x54AA, 487 },
+ { 0x54AB, 451 },
+ { 0x54AC, 427 },
+ { 0x54AD, 406 },
+ { 0x54AE, 448 },
+ { 0x54AF, 445 },
+ { 0x54B0, 433 },
+ { 0x54B1, 442 },
+ { 0x54B2, 382 },
+ { 0x54B3, 358 },
+ { 0x54B4, 499 },
+ { 0x54B5, 409 },
+ { 0x54B6, 403 },
+ { 0x54B7, 484 },
+ { 0x54B8, 376 },
+ { 0x54B9, 352 },
+ { 0x54BA, 508 },
+ { 0x54BB, 415 },
+ { 0x54BC, 349 },
+ { 0x54BD, 463 },
+ { 0x54BE, 391 },
+ { 0x54BF, 478 },
+ { 0x54C0, 502 },
+ { 0x54C1, 457 },
+ { 0x54C2, 505 },
+ { 0x54C3, 388 },
+ { 0x54C4, 511 },
+ { 0x54C5, 490 },
+ { 0x54C6, 361 },
+ { 0x5500, 7945 },
+ { 0x5501, 8254 },
+ { 0x5502, 8290 },
+ { 0x5503, 8482 },
+ { 0x5504, 8653 },
+ { 0x5505, 8419 },
+ { 0x5506, 8527 },
+ { 0x5507, 8206 },
+ { 0x5508, 8578 },
+ { 0x5509, 8569 },
+ { 0x550A, 8671 },
+ { 0x550B, 8554 },
+ { 0x550C, 8257 },
+ { 0x550D, 8473 },
+ { 0x550E, 8452 },
+ { 0x550F, 8647 },
+ { 0x5510, 8533 },
+ { 0x5511, 8665 },
+ { 0x5512, 8338 },
+ { 0x5513, 8425 },
+ { 0x5514, 8233 },
+ { 0x5515, 8599 },
+ { 0x5516, 8431 },
+ { 0x5517, 8641 },
+ { 0x5518, 8506 },
+ { 0x5519, 8659 },
+ { 0x551A, 8227 },
+ { 0x551B, 8308 },
+ { 0x551C, 8629 },
+ { 0x551D, 8500 },
+ { 0x551E, 8317 },
+ { 0x551F, 8697 },
+ { 0x5520, 8278 },
+ { 0x5521, 8359 },
+ { 0x5522, 8380 },
+ { 0x5523, 8635 },
+ { 0x5524, 7888 },
+ { 0x5525, 7996 },
+ { 0x5526, 7987 },
+ { 0x5527, 8296 },
+ { 0x5528, 8167 },
+ { 0x5529, 8488 },
+ { 0x552A, 8089 },
+ { 0x552B, 8215 },
+ { 0x552C, 7906 },
+ { 0x552D, 8350 },
+ { 0x552E, 8329 },
+ { 0x552F, 8590 },
+ { 0x5530, 8269 },
+ { 0x5531, 7957 },
+ { 0x5532, 8152 },
+ { 0x5533, 8134 },
+ { 0x5534, 8461 },
+ { 0x5535, 8242 },
+ { 0x5536, 8542 },
+ { 0x5537, 8035 },
+ { 0x5538, 8104 },
+ { 0x5539, 7936 },
+ { 0x553A, 8371 },
+ { 0x553B, 8119 },
+ { 0x553C, 8440 },
+ { 0x553D, 8197 },
+ { 0x553E, 8515 },
+ { 0x553F, 7921 },
+ { 0x5540, 8005 },
+ { 0x5541, 8389 },
+ { 0x5542, 8182 },
+ { 0x5543, 8020 },
+ { 0x5544, 8617 },
+ { 0x5545, 7972 },
+ { 0x5546, 8050 },
+ { 0x5547, 8068 },
+ { 0x5548, 8407 },
+ { 0x5549, 7882 },
+ { 0x554A, 7897 },
+ { 0x554B, 8605 },
+ { 0x554C, 7981 },
+ { 0x554D, 8287 },
+ { 0x554E, 8161 },
+ { 0x554F, 8479 },
+ { 0x5550, 8083 },
+ { 0x5551, 8209 },
+ { 0x5552, 7900 },
+ { 0x5553, 8344 },
+ { 0x5554, 8323 },
+ { 0x5555, 8566 },
+ { 0x5556, 8584 },
+ { 0x5557, 8263 },
+ { 0x5558, 7951 },
+ { 0x5559, 8146 },
+ { 0x555A, 8128 },
+ { 0x555B, 8455 },
+ { 0x555C, 8236 },
+ { 0x555D, 8536 },
+ { 0x555E, 8029 },
+ { 0x555F, 8098 },
+ { 0x5560, 7930 },
+ { 0x5561, 8365 },
+ { 0x5562, 8113 },
+ { 0x5563, 8434 },
+ { 0x5564, 8191 },
+ { 0x5565, 8509 },
+ { 0x5566, 7915 },
+ { 0x5567, 7999 },
+ { 0x5568, 8383 },
+ { 0x5569, 8176 },
+ { 0x556A, 8014 },
+ { 0x556B, 8314 },
+ { 0x556C, 8611 },
+ { 0x556D, 7966 },
+ { 0x556E, 8044 },
+ { 0x556F, 8059 },
+ { 0x5570, 8401 },
+ { 0x5571, 8080 },
+ { 0x5572, 8416 },
+ { 0x5573, 8302 },
+ { 0x5574, 8494 },
+ { 0x5575, 8656 },
+ { 0x5576, 8422 },
+ { 0x5577, 8530 },
+ { 0x5578, 8224 },
+ { 0x5579, 8581 },
+ { 0x557A, 8575 },
+ { 0x557B, 8674 },
+ { 0x557C, 8563 },
+ { 0x557D, 8260 },
+ { 0x557E, 8476 },
+ { 0x557F, 8470 },
+ { 0x5580, 8650 },
+ { 0x5581, 8551 },
+ { 0x5582, 8668 },
+ { 0x5583, 8341 },
+ { 0x5584, 8428 },
+ { 0x5585, 8251 },
+ { 0x5586, 8602 },
+ { 0x5587, 8449 },
+ { 0x5588, 8644 },
+ { 0x5589, 8524 },
+ { 0x558A, 8662 },
+ { 0x558B, 8230 },
+ { 0x558C, 8311 },
+ { 0x558D, 8632 },
+ { 0x558E, 8503 },
+ { 0x558F, 8320 },
+ { 0x5590, 8703 },
+ { 0x5591, 8284 },
+ { 0x5592, 8362 },
+ { 0x5593, 8398 },
+ { 0x5594, 8638 },
+ { 0x5595, 7894 },
+ { 0x5596, 8143 },
+ { 0x5597, 7993 },
+ { 0x5598, 8305 },
+ { 0x5599, 8173 },
+ { 0x559A, 8497 },
+ { 0x559B, 8095 },
+ { 0x559C, 8221 },
+ { 0x559D, 7912 },
+ { 0x559E, 8356 },
+ { 0x559F, 8335 },
+ { 0x55A0, 8596 },
+ { 0x55A1, 8275 },
+ { 0x55A2, 7963 },
+ { 0x55A3, 8158 },
+ { 0x55A4, 8140 },
+ { 0x55A5, 8467 },
+ { 0x55A6, 8248 },
+ { 0x55A7, 8548 },
+ { 0x55A8, 8041 },
+ { 0x55A9, 8110 },
+ { 0x55AA, 7942 },
+ { 0x55AB, 8377 },
+ { 0x55AC, 8125 },
+ { 0x55AD, 8446 },
+ { 0x55AE, 8203 },
+ { 0x55AF, 8521 },
+ { 0x55B0, 7927 },
+ { 0x55B1, 8011 },
+ { 0x55B2, 8395 },
+ { 0x55B3, 8188 },
+ { 0x55B4, 8026 },
+ { 0x55B5, 8623 },
+ { 0x55B6, 7978 },
+ { 0x55B7, 8056 },
+ { 0x55B8, 8074 },
+ { 0x55B9, 8413 },
+ { 0x55BA, 7891 },
+ { 0x55BB, 8077 },
+ { 0x55BC, 8626 },
+ { 0x55BD, 7990 },
+ { 0x55BE, 8299 },
+ { 0x55BF, 8170 },
+ { 0x55C0, 8491 },
+ { 0x55C1, 8092 },
+ { 0x55C2, 8218 },
+ { 0x55C3, 7909 },
+ { 0x55C4, 8353 },
+ { 0x55C5, 8332 },
+ { 0x55C6, 8593 },
+ { 0x55C7, 8272 },
+ { 0x55C8, 8560 },
+ { 0x55C9, 7960 },
+ { 0x55CA, 8155 },
+ { 0x55CB, 8137 },
+ { 0x55CC, 8464 },
+ { 0x55CD, 8245 },
+ { 0x55CE, 8545 },
+ { 0x55CF, 8038 },
+ { 0x55D0, 8107 },
+ { 0x55D1, 7939 },
+ { 0x55D2, 8374 },
+ { 0x55D3, 8122 },
+ { 0x55D4, 8443 },
+ { 0x55D5, 8200 },
+ { 0x55D6, 8518 },
+ { 0x55D7, 7924 },
+ { 0x55D8, 8008 },
+ { 0x55D9, 8392 },
+ { 0x55DA, 8185 },
+ { 0x55DB, 8023 },
+ { 0x55DC, 8620 },
+ { 0x55DD, 7975 },
+ { 0x55DE, 8053 },
+ { 0x55DF, 8071 },
+ { 0x55E0, 8410 },
+ { 0x55E1, 7885 },
+ { 0x55E2, 7948 },
+ { 0x55E3, 8608 },
+ { 0x55E4, 7984 },
+ { 0x55E5, 8293 },
+ { 0x55E6, 8164 },
+ { 0x55E7, 8485 },
+ { 0x55E8, 8086 },
+ { 0x55E9, 8212 },
+ { 0x55EA, 7903 },
+ { 0x55EB, 8347 },
+ { 0x55EC, 8326 },
+ { 0x55ED, 8572 },
+ { 0x55EE, 8587 },
+ { 0x55EF, 8266 },
+ { 0x55F0, 8557 },
+ { 0x55F1, 7954 },
+ { 0x55F2, 8149 },
+ { 0x55F3, 8131 },
+ { 0x55F4, 8458 },
+ { 0x55F5, 8239 },
+ { 0x55F6, 8539 },
+ { 0x55F7, 8032 },
+ { 0x55F8, 8101 },
+ { 0x55F9, 7933 },
+ { 0x55FA, 8368 },
+ { 0x55FB, 8116 },
+ { 0x55FC, 8437 },
+ { 0x55FD, 8194 },
+ { 0x55FE, 8512 },
+ { 0x55FF, 7918 },
+ { 0x5600, 8002 },
+ { 0x5601, 8386 },
+ { 0x5602, 8179 },
+ { 0x5603, 8017 },
+ { 0x5604, 8614 },
+ { 0x5605, 8700 },
+ { 0x5606, 7969 },
+ { 0x5607, 8281 },
+ { 0x5608, 8047 },
+ { 0x5609, 8062 },
+ { 0x560A, 8404 },
+ { 0x560B, 8065 },
+ { 0x560C, 8706 },
+ { 0x560D, 7808 },
+ { 0x560E, 7805 },
+ { 0x560F, 7879 },
+ { 0x5610, 8681 },
+ { 0x5611, 8685 },
+ { 0x5612, 8693 },
+ { 0x5613, 7873 },
+ { 0x5614, 7876 },
+ { 0x5615, 7864 },
+ { 0x5616, 7843 },
+ { 0x5617, 7849 },
+ { 0x5618, 7840 },
+ { 0x5619, 7846 },
+ { 0x561A, 7852 },
+ { 0x561B, 7870 },
+ { 0x561C, 7861 },
+ { 0x561D, 7867 },
+ { 0x561E, 7855 },
+ { 0x561F, 7858 },
+ { 0x5620, 7828 },
+ { 0x5621, 7810 },
+ { 0x5622, 7816 },
+ { 0x5623, 7837 },
+ { 0x5624, 7822 },
+ { 0x5625, 7819 },
+ { 0x5626, 7813 },
+ { 0x5627, 7834 },
+ { 0x5628, 7831 },
+ { 0x5629, 7825 },
+ { 0x562A, 8689 },
+ { 0x562B, 8677 },
+ { 0x5640, 50137 },
+ { 0x5641, 49239 },
+ { 0x5642, 50054 },
+ { 0x5643, 49156 },
+ { 0x5644, 50212 },
+ { 0x5645, 49318 },
+ { 0x5646, 49931 },
+ { 0x5647, 49033 },
+ { 0x5648, 50050 },
+ { 0x5649, 49152 },
+ { 0x564A, 50266 },
+ { 0x564B, 49372 },
+ { 0x564C, 50045 },
+ { 0x564D, 49147 },
+ { 0x564E, 50163 },
+ { 0x564F, 49265 },
+ { 0x5650, 50023 },
+ { 0x5651, 49125 },
+ { 0x5652, 50184 },
+ { 0x5653, 49286 },
+ { 0x5654, 50202 },
+ { 0x5655, 49308 },
+ { 0x5656, 50168 },
+ { 0x5657, 49270 },
+ { 0x5658, 50120 },
+ { 0x5659, 49222 },
+ { 0x565A, 50146 },
+ { 0x565B, 49248 },
+ { 0x565C, 50189 },
+ { 0x565D, 49291 },
+ { 0x565E, 49727 },
+ { 0x565F, 48829 },
+ { 0x5662, 49983 },
+ { 0x5663, 49085 },
+ { 0x5664, 49988 },
+ { 0x5665, 49090 },
+ { 0x5666, 49993 },
+ { 0x5667, 49095 },
+ { 0x5668, 50261 },
+ { 0x5669, 49367 },
+ { 0x566A, 50256 },
+ { 0x566B, 49362 },
+ { 0x566C, 50126 },
+ { 0x566D, 49228 },
+ { 0x566E, 49417 },
+ { 0x566F, 58020 },
+ { 0x5670, 58004 },
+ { 0x5671, 58160 },
+ { 0x5672, 58180 },
+ { 0x5673, 55523 },
+ { 0x567C, 58023 },
+ { 0x567D, 58170 },
+ { 0x567E, 49407 },
+ { 0x567F, 50301 },
+ { 0x5680, 49783 },
+ { 0x5681, 48885 },
+ { 0x5682, 49914 },
+ { 0x5683, 49016 },
+ { 0x5684, 50036 },
+ { 0x5685, 49138 },
+ { 0x5686, 49906 },
+ { 0x5687, 49008 },
+ { 0x5688, 49918 },
+ { 0x5689, 49020 },
+ { 0x568A, 49694 },
+ { 0x568B, 48796 },
+ { 0x568C, 49872 },
+ { 0x568D, 48974 },
+ { 0x568E, 50015 },
+ { 0x568F, 49117 },
+ { 0x5690, 50011 },
+ { 0x5691, 49113 },
+ { 0x5692, 50003 },
+ { 0x5693, 49105 },
+ { 0x5694, 49832 },
+ { 0x5695, 48934 },
+ { 0x5696, 49979 },
+ { 0x5697, 49081 },
+ { 0x5700, 54739 },
+ { 0x5701, 54763 },
+ { 0x5702, 54745 },
+ { 0x5703, 54769 },
+ { 0x5704, 54727 },
+ { 0x5705, 54751 },
+ { 0x5706, 54733 },
+ { 0x5707, 54757 },
+ { 0x5708, 54839 },
+ { 0x5709, 54039 },
+ { 0x570A, 53996 },
+ { 0x570B, 53952 },
+ { 0x570C, 54808 },
+ { 0x570D, 54845 },
+ { 0x570E, 54045 },
+ { 0x570F, 54002 },
+ { 0x5710, 53958 },
+ { 0x5711, 54814 },
+ { 0x5712, 54852 },
+ { 0x5713, 54052 },
+ { 0x5714, 54009 },
+ { 0x5715, 53980 },
+ { 0x5716, 54821 },
+ { 0x5717, 53884 },
+ { 0x5718, 53880 },
+ { 0x5719, 53889 },
+ { 0x571A, 54106 },
+ { 0x571B, 54571 },
+ { 0x571C, 54576 },
+ { 0x571D, 54591 },
+ { 0x571E, 54585 },
+ { 0x571F, 53969 },
+ { 0x5720, 54606 },
+ { 0x5721, 54600 },
+ { 0x5722, 20769 },
+ { 0x5723, 17878 },
+ { 0x5724, 20764 },
+ { 0x5725, 17873 },
+ { 0x5726, 20552 },
+ { 0x5727, 17317 },
+ { 0x5728, 20503 },
+ { 0x5729, 17173 },
+ { 0x572A, 20735 },
+ { 0x572B, 17844 },
+ { 0x572C, 20739 },
+ { 0x572D, 17848 },
+ { 0x572E, 20743 },
+ { 0x572F, 17852 },
+ { 0x5730, 17974 },
+ { 0x5731, 18048 },
+ { 0x5732, 20422 },
+ { 0x5733, 17038 },
+ { 0x5734, 20442 },
+ { 0x5735, 17058 },
+ { 0x5736, 20446 },
+ { 0x5737, 17062 },
+ { 0x5738, 20450 },
+ { 0x5739, 17066 },
+ { 0x573A, 20454 },
+ { 0x573B, 17070 },
+ { 0x573C, 20461 },
+ { 0x573D, 17077 },
+ { 0x573E, 20719 },
+ { 0x573F, 17758 },
+ { 0x5740, 19120 },
+ { 0x5741, 15472 },
+ { 0x5742, 19141 },
+ { 0x5743, 15500 },
+ { 0x5744, 19126 },
+ { 0x5745, 15478 },
+ { 0x5746, 20644 },
+ { 0x5747, 17505 },
+ { 0x5748, 19180 },
+ { 0x5749, 15551 },
+ { 0x574A, 19451 },
+ { 0x574B, 15876 },
+ { 0x574C, 19459 },
+ { 0x574D, 15884 },
+ { 0x574E, 20495 },
+ { 0x574F, 17142 },
+ { 0x5750, 19688 },
+ { 0x5751, 16113 },
+ { 0x5752, 19696 },
+ { 0x5753, 16128 },
+ { 0x5754, 19702 },
+ { 0x5755, 16134 },
+ { 0x5756, 19713 },
+ { 0x5757, 16158 },
+ { 0x5758, 19721 },
+ { 0x5759, 16166 },
+ { 0x575A, 19806 },
+ { 0x575B, 16287 },
+ { 0x575C, 20542 },
+ { 0x575D, 17287 },
+ { 0x575E, 20210 },
+ { 0x575F, 16771 },
+ { 0x5760, 20507 },
+ { 0x5761, 17185 },
+ { 0x5762, 20749 },
+ { 0x5763, 17858 },
+ { 0x5764, 20630 },
+ { 0x5765, 17480 },
+ { 0x5766, 20636 },
+ { 0x5767, 17486 },
+ { 0x5768, 20585 },
+ { 0x5769, 17421 },
+ { 0x576A, 20475 },
+ { 0x576B, 17108 },
+ { 0x576C, 20479 },
+ { 0x576D, 17116 },
+ { 0x576E, 20511 },
+ { 0x576F, 17189 },
+ { 0x5770, 53877 },
+ { 0x5771, 17193 },
+ { 0x5772, 17267 },
+ { 0x5773, 17271 },
+ { 0x5774, 17275 },
+ { 0x5775, 17283 },
+ { 0x5776, 18108 },
+ { 0x5777, 17298 },
+ { 0x5778, 17181 },
+ { 0x5779, 20685 },
+ { 0x577A, 17713 },
+ { 0x577B, 20690 },
+ { 0x577C, 17718 },
+ { 0x577D, 20695 },
+ { 0x577E, 20669 },
+ { 0x577F, 17676 },
+ { 0x5780, 20654 },
+ { 0x5781, 17585 },
+ { 0x5782, 20700 },
+ { 0x5783, 17728 },
+ { 0x5784, 20705 },
+ { 0x5785, 17733 },
+ { 0x5786, 20710 },
+ { 0x5787, 17738 },
+ { 0x5788, 53986 },
+ { 0x5789, 54095 },
+ { 0x578A, 54131 },
+ { 0x578B, 20731 },
+ { 0x578C, 17800 },
+ { 0x57FB, 20847 },
+ { 0x57FC, 20852 },
+ { 0x57FD, 20842 },
+ { 0x57FE, 20832 },
+ { 0x57FF, 20837 },
+ { 0x5800, 36572 },
+ { 0x5801, 36580 },
+ { 0x5802, 36543 },
+ { 0x5803, 36588 },
+ { 0x5804, 36576 },
+ { 0x5805, 36584 },
+ { 0x5806, 36535 },
+ { 0x5807, 36616 },
+ { 0x5808, 36672 },
+ { 0x5809, 36604 },
+ { 0x580A, 36664 },
+ { 0x580B, 36539 },
+ { 0x580C, 36596 },
+ { 0x580D, 36652 },
+ { 0x580E, 36612 },
+ { 0x580F, 36668 },
+ { 0x5810, 36688 },
+ { 0x5811, 36696 },
+ { 0x5812, 36656 },
+ { 0x5813, 36692 },
+ { 0x5814, 36644 },
+ { 0x5815, 36684 },
+ { 0x5816, 36600 },
+ { 0x5817, 36660 },
+ { 0x5818, 36628 },
+ { 0x5819, 36632 },
+ { 0x581A, 36676 },
+ { 0x581B, 36592 },
+ { 0x581C, 36648 },
+ { 0x581D, 36624 },
+ { 0x581E, 36636 },
+ { 0x581F, 36620 },
+ { 0x5820, 36680 },
+ { 0x5821, 36640 },
+ { 0x5822, 36608 },
+ { 0x5823, 36547 },
+ { 0x5824, 36557 },
+ { 0x5825, 36562 },
+ { 0x5826, 36552 },
+ { 0x5827, 36567 },
+ { 0x5828, 36700 },
+ { 0x5829, 36704 },
+ { 0x582A, 36708 },
+ { 0x582B, 36712 },
+ { 0x5840, 55006 },
+ { 0x5841, 55057 },
+ { 0x5842, 54997 },
+ { 0x5843, 55060 },
+ { 0x5844, 54985 },
+ { 0x5845, 55045 },
+ { 0x5846, 55003 },
+ { 0x5847, 55066 },
+ { 0x5848, 55030 },
+ { 0x5849, 55075 },
+ { 0x584A, 54988 },
+ { 0x584B, 55015 },
+ { 0x584C, 55018 },
+ { 0x584D, 55069 },
+ { 0x584E, 54982 },
+ { 0x584F, 55012 },
+ { 0x5850, 55078 },
+ { 0x5851, 55087 },
+ { 0x5852, 55051 },
+ { 0x5853, 55033 },
+ { 0x5854, 55084 },
+ { 0x5855, 55042 },
+ { 0x5856, 55093 },
+ { 0x5857, 55039 },
+ { 0x5858, 55024 },
+ { 0x5859, 55009 },
+ { 0x585A, 55072 },
+ { 0x585B, 55027 },
+ { 0x585C, 55000 },
+ { 0x585D, 54967 },
+ { 0x585E, 54973 },
+ { 0x585F, 54979 },
+ { 0x5860, 54970 },
+ { 0x5861, 54976 },
+ { 0x5862, 55021 },
+ { 0x5863, 55036 },
+ { 0x5864, 54994 },
+ { 0x5865, 55054 },
+ { 0x5866, 54991 },
+ { 0x5867, 55124 },
+ { 0x5868, 55128 },
+ { 0x5869, 55081 },
+ { 0x586A, 55090 },
+ { 0x586B, 55048 },
+ { 0x586C, 55063 },
+ { 0x586D, 55101 },
+ { 0x586E, 55109 },
+ { 0x586F, 55097 },
+ { 0x5870, 55105 },
+ { 0x5871, 55120 },
+ { 0x5872, 55132 },
+ { 0x5873, 55113 },
+ { 0x5874, 55116 },
+ { 0x5875, 54963 },
+ { 0x5876, 54956 },
+ { 0x5877, 54959 },
+ { 0x5880, 68329 },
+ { 0x5881, 68326 },
+ { 0x5882, 68431 },
+ { 0x5883, 68446 },
+ { 0x5884, 68437 },
+ { 0x5885, 68473 },
+ { 0x5886, 68443 },
+ { 0x5887, 68506 },
+ { 0x5888, 68573 },
+ { 0x5889, 68581 },
+ { 0x588A, 68569 },
+ { 0x588B, 68577 },
+ { 0x588C, 68434 },
+ { 0x588D, 68464 },
+ { 0x588E, 68449 },
+ { 0x588F, 68440 },
+ { 0x5890, 68491 },
+ { 0x5891, 68452 },
+ { 0x5892, 68479 },
+ { 0x5893, 68533 },
+ { 0x5894, 68467 },
+ { 0x5895, 68527 },
+ { 0x5896, 68539 },
+ { 0x5897, 68458 },
+ { 0x5898, 68518 },
+ { 0x5899, 68476 },
+ { 0x589A, 68530 },
+ { 0x589B, 68545 },
+ { 0x589C, 68560 },
+ { 0x589D, 68566 },
+ { 0x589E, 68521 },
+ { 0x589F, 68563 },
+ { 0x58A0, 68542 },
+ { 0x58A1, 68503 },
+ { 0x58A2, 68557 },
+ { 0x58A3, 68461 },
+ { 0x58A4, 68524 },
+ { 0x58A5, 68488 },
+ { 0x58A6, 68494 },
+ { 0x58A7, 68548 },
+ { 0x58A8, 68455 },
+ { 0x58A9, 68515 },
+ { 0x58AA, 68485 },
+ { 0x58AB, 68512 },
+ { 0x58AC, 68497 },
+ { 0x58AD, 68482 },
+ { 0x58AE, 68509 },
+ { 0x58AF, 68551 },
+ { 0x58B0, 68554 },
+ { 0x58B1, 68500 },
+ { 0x58B2, 68470 },
+ { 0x58B3, 68536 },
+ { 0x58B4, 68585 },
+ { 0x58B5, 68380 },
+ { 0x58B6, 68368 },
+ { 0x58B7, 68396 },
+ { 0x58B8, 68376 },
+ { 0x58B9, 68404 },
+ { 0x58BA, 68413 },
+ { 0x58BB, 68423 },
+ { 0x58BC, 68408 },
+ { 0x58BD, 68418 },
+ { 0x58BE, 68364 },
+ { 0x58BF, 68392 },
+ { 0x58C0, 68384 },
+ { 0x58C1, 68372 },
+ { 0x58C2, 68400 },
+ { 0x58C3, 68388 },
+ { 0x58C4, 68323 },
+ { 0x58CE, 68332 },
+ { 0x58CF, 68428 },
+ { 0x58D0, 68352 },
+ { 0x58D1, 68334 },
+ { 0x58D2, 68340 },
+ { 0x58D3, 68361 },
+ { 0x58D4, 68346 },
+ { 0x58D5, 68343 },
+ { 0x58D6, 68337 },
+ { 0x58D7, 68358 },
+ { 0x58D8, 68355 },
+ { 0x58D9, 68349 },
+ { 0x5900, 13773 },
+ { 0x5901, 13749 },
+ { 0x5902, 13757 },
+ { 0x5903, 13785 },
+ { 0x5904, 13765 },
+ { 0x5905, 13761 },
+ { 0x5906, 13753 },
+ { 0x5907, 13781 },
+ { 0x5908, 13777 },
+ { 0x5909, 13769 },
+ { 0x590A, 13837 },
+ { 0x590B, 13897 },
+ { 0x590C, 13829 },
+ { 0x590D, 13901 },
+ { 0x590E, 13869 },
+ { 0x590F, 13913 },
+ { 0x5910, 13889 },
+ { 0x5911, 13905 },
+ { 0x5912, 13873 },
+ { 0x5913, 13893 },
+ { 0x5914, 13849 },
+ { 0x5915, 13861 },
+ { 0x5916, 13909 },
+ { 0x5917, 13845 },
+ { 0x5918, 13825 },
+ { 0x5919, 13817 },
+ { 0x591A, 13865 },
+ { 0x591B, 13885 },
+ { 0x591C, 13841 },
+ { 0x591D, 13881 },
+ { 0x591E, 13917 },
+ { 0x591F, 13833 },
+ { 0x5920, 13877 },
+ { 0x5921, 13821 },
+ { 0x5922, 13809 },
+ { 0x5923, 13853 },
+ { 0x5924, 13813 },
+ { 0x5925, 13857 },
+ { 0x5926, 13805 },
+ { 0x5927, 13789 },
+ { 0x5928, 13797 },
+ { 0x5929, 13801 },
+ { 0x592A, 13793 },
+ { 0x592B, 13745 },
+ { 0x592C, 13736 },
+ { 0x592D, 13740 },
+ { 0x592E, 13728 },
+ { 0x592F, 13732 },
+ { 0x5930, 35728 },
+ { 0x5931, 35719 },
+ { 0x5932, 35764 },
+ { 0x5933, 35749 },
+ { 0x5934, 35716 },
+ { 0x5935, 35737 },
+ { 0x5936, 35740 },
+ { 0x5937, 35710 },
+ { 0x5938, 35734 },
+ { 0x5939, 35713 },
+ { 0x593A, 35725 },
+ { 0x593B, 35767 },
+ { 0x593C, 35746 },
+ { 0x593D, 35743 },
+ { 0x593E, 35731 },
+ { 0x593F, 35755 },
+ { 0x5940, 35752 },
+ { 0x5941, 35722 },
+ { 0x5942, 35758 },
+ { 0x5943, 35770 },
+ { 0x5944, 35761 },
+ { 0x5945, 35773 },
+ { 0x5946, 35707 },
+ { 0x5947, 35679 },
+ { 0x5948, 35687 },
+ { 0x5949, 35675 },
+ { 0x594A, 35691 },
+ { 0x594B, 35683 },
+ { 0x594C, 35695 },
+ { 0x594D, 35703 },
+ { 0x594E, 35699 },
+ { 0x594F, 35793 },
+ { 0x5950, 35785 },
+ { 0x5951, 35789 },
+ { 0x5952, 35781 },
+ { 0x5953, 35776 },
+ { 0x595F, 35778 },
+ { 0x5A00, 8801 },
+ { 0x5A01, 8807 },
+ { 0x5A02, 8813 },
+ { 0x5A03, 8804 },
+ { 0x5A04, 8816 },
+ { 0x5A05, 8810 },
+ { 0x5A06, 8834 },
+ { 0x5A07, 8885 },
+ { 0x5A08, 8825 },
+ { 0x5A09, 8879 },
+ { 0x5A0A, 8915 },
+ { 0x5A0B, 8891 },
+ { 0x5A0C, 8870 },
+ { 0x5A0D, 8912 },
+ { 0x5A0E, 8831 },
+ { 0x5A0F, 8882 },
+ { 0x5A10, 8921 },
+ { 0x5A11, 8894 },
+ { 0x5A12, 8918 },
+ { 0x5A13, 8855 },
+ { 0x5A14, 8909 },
+ { 0x5A15, 8822 },
+ { 0x5A16, 8876 },
+ { 0x5A17, 8897 },
+ { 0x5A18, 8843 },
+ { 0x5A19, 8873 },
+ { 0x5A1A, 8846 },
+ { 0x5A1B, 8903 },
+ { 0x5A1C, 8900 },
+ { 0x5A1D, 8819 },
+ { 0x5A1E, 8867 },
+ { 0x5A1F, 8888 },
+ { 0x5A20, 8840 },
+ { 0x5A21, 8864 },
+ { 0x5A22, 8861 },
+ { 0x5A23, 8849 },
+ { 0x5A24, 8837 },
+ { 0x5A25, 8858 },
+ { 0x5A26, 8906 },
+ { 0x5A27, 8852 },
+ { 0x5A28, 8828 },
+ { 0x5A29, 8773 },
+ { 0x5A2A, 8761 },
+ { 0x5A2B, 8789 },
+ { 0x5A2C, 8785 },
+ { 0x5A2D, 8769 },
+ { 0x5A2E, 8793 },
+ { 0x5A2F, 8765 },
+ { 0x5A30, 8777 },
+ { 0x5A31, 8781 },
+ { 0x5A32, 8797 },
+ { 0x5A33, 8980 },
+ { 0x5A34, 8972 },
+ { 0x5A35, 8968 },
+ { 0x5A36, 8976 },
+ { 0x5A40, 8928 },
+ { 0x5A41, 8924 },
+ { 0x5A42, 8960 },
+ { 0x5A43, 8994 },
+ { 0x5A44, 8956 },
+ { 0x5A45, 8948 },
+ { 0x5A46, 8936 },
+ { 0x5A47, 8940 },
+ { 0x5A48, 8952 },
+ { 0x5A49, 8944 },
+ { 0x5A4A, 8932 },
+ { 0x5A4B, 8964 },
+ { 0x5A4C, 8989 },
+ { 0x5A4D, 8984 },
+ { 0x5A50, 8749 },
+ { 0x5A51, 8731 },
+ { 0x5A52, 8737 },
+ { 0x5A53, 8758 },
+ { 0x5A54, 8743 },
+ { 0x5A55, 8740 },
+ { 0x5A56, 8734 },
+ { 0x5A57, 8755 },
+ { 0x5A58, 8752 },
+ { 0x5A59, 8746 },
+ { 0x5A5C, 9006 },
+ { 0x5A5D, 8999 },
+ { 0x5A5E, 9002 },
+ { 0x5A5F, 9009 },
+ { 0x6B00, 17897 },
+ { 0x6B01, 17901 },
+ { 0x6B02, 17905 },
+ { 0x6B03, 17921 },
+ { 0x6B04, 17925 },
+ { 0x6B05, 17929 },
+ { 0x6B06, 17917 },
+ { 0x6B13, 44892 },
+ { 0x6B14, 44882 },
+ { 0x6B15, 44887 },
+ { 0x6B16, 44902 },
+ { 0x6B17, 44897 },
+ { 0x6B1D, 33182 },
+ { 0x6B1E, 32972 },
+ { 0x6B1F, 33388 },
+ { 0x6B20, 33370 },
+ { 0x6B21, 33269 },
+ { 0x6B22, 33277 },
+ { 0x6B23, 33257 },
+ { 0x6B24, 33261 },
+ { 0x6B25, 33286 },
+ { 0x6B26, 33281 },
+ { 0x6B27, 33273 },
+ { 0x6B28, 33265 },
+ { 0x6B29, 33374 },
+ { 0x6B2A, 33230 },
+ { 0x6B2B, 33224 },
+ { 0x6B2C, 33249 },
+ { 0x6B2D, 33241 },
+ { 0x6B2E, 33200 },
+ { 0x6B2F, 33205 },
+ { 0x6B30, 33195 },
+ { 0x6B31, 33105 },
+ { 0x6B32, 33333 },
+ { 0x6B33, 33293 },
+ { 0x6B34, 33079 },
+ { 0x6B35, 33174 },
+ { 0x6B36, 33357 },
+ { 0x6B38, 33161 },
+ { 0x6B39, 33187 },
+ { 0x6B3A, 33312 },
+ { 0x6B3B, 33121 },
+ { 0x6B3C, 33341 },
+ { 0x6B3E, 33129 },
+ { 0x6B40, 33137 },
+ { 0x6B41, 33365 },
+ { 0x6B43, 33302 },
+ { 0x6B44, 33092 },
+ { 0x6B46, 33349 },
+ { 0x6B47, 33145 },
+ { 0x6B48, 33216 },
+ { 0x6B49, 33236 },
+ { 0x6B4A, 33153 },
+ { 0x6B4B, 33169 },
+ { 0x6B4C, 33100 },
+ { 0x6B4D, 33116 },
+ { 0x6B4E, 33087 },
+ { 0x6B4F, 33379 },
+ { 0x6B50, 25426 },
+ { 0x6B51, 25420 },
+ { 0x6B52, 25471 },
+ { 0x6B53, 25456 },
+ { 0x6B54, 25466 },
+ { 0x6B55, 25461 },
+ { 0x6B56, 24792 },
+ { 0x6B57, 24777 },
+ { 0x6B58, 24787 },
+ { 0x6B59, 24782 },
+ { 0x6B5A, 25928 },
+ { 0x6B5B, 25913 },
+ { 0x6B5C, 25923 },
+ { 0x6B5D, 25918 },
+ { 0x6B5E, 26308 },
+ { 0x6B5F, 26293 },
+ { 0x6B60, 26303 },
+ { 0x6B61, 26298 },
+ { 0x6B62, 26272 },
+ { 0x6B63, 26257 },
+ { 0x6B64, 26267 },
+ { 0x6B65, 26262 },
+ { 0x6B66, 25892 },
+ { 0x6B67, 25877 },
+ { 0x6B68, 25887 },
+ { 0x6B69, 25882 },
+ { 0x6B6A, 25071 },
+ { 0x6B6B, 25056 },
+ { 0x6B6C, 25066 },
+ { 0x6B6D, 25061 },
+ { 0x6B6E, 26164 },
+ { 0x6B6F, 26149 },
+ { 0x6B70, 26159 },
+ { 0x6B71, 26154 },
+ { 0x6B72, 25507 },
+ { 0x6B73, 25492 },
+ { 0x6B74, 25502 },
+ { 0x6B75, 25497 },
+ { 0x6B76, 25729 },
+ { 0x6B77, 25714 },
+ { 0x6B78, 25724 },
+ { 0x6B79, 25719 },
+ { 0x6B7A, 26249 },
+ { 0x6B7B, 26234 },
+ { 0x6B7C, 26244 },
+ { 0x6B7D, 26239 },
+ { 0x6B7E, 26393 },
+ { 0x6B7F, 26378 },
+ { 0x6B80, 26388 },
+ { 0x6B81, 26383 },
+ { 0x6B82, 26285 },
+ { 0x6B83, 26280 },
+ { 0x6B84, 25941 },
+ { 0x6B85, 25936 },
+ { 0x6B86, 24341 },
+ { 0x6B87, 24336 },
+ { 0x6B88, 25484 },
+ { 0x6B89, 25479 },
+ { 0x6B8A, 24667 },
+ { 0x6B8B, 24662 },
+ { 0x6B8C, 25742 },
+ { 0x6B8D, 25737 },
+ { 0x6B8E, 26118 },
+ { 0x6B8F, 26103 },
+ { 0x6B90, 26113 },
+ { 0x6B91, 26108 },
+ { 0x6B92, 24442 },
+ { 0x6B93, 24427 },
+ { 0x6B94, 24437 },
+ { 0x6B95, 24432 },
+ { 0x6B96, 25530 },
+ { 0x6B97, 25515 },
+ { 0x6B98, 25525 },
+ { 0x6B99, 25520 },
+ { 0x6B9A, 26141 },
+ { 0x6B9B, 26126 },
+ { 0x6B9C, 26136 },
+ { 0x6B9D, 26131 },
+ { 0x6B9E, 25690 },
+ { 0x6B9F, 25684 },
+ { 0x6BA0, 26187 },
+ { 0x6BA1, 26172 },
+ { 0x6BA2, 26182 },
+ { 0x6BA3, 26177 },
+ { 0x6BA4, 24597 },
+ { 0x6BA5, 24589 },
+ { 0x6BA6, 24577 },
+ { 0x6BA7, 24559 },
+ { 0x6BA8, 24571 },
+ { 0x6BA9, 24565 },
+ { 0x6BAA, 24653 },
+ { 0x6BAB, 24635 },
+ { 0x6BAC, 24647 },
+ { 0x6BAD, 24641 },
+ { 0x6BAE, 25266 },
+ { 0x6BAF, 25260 },
+ { 0x6BB0, 25231 },
+ { 0x6BB1, 25222 },
+ { 0x6BD3, 24046 },
+ { 0x6BD4, 24031 },
+ { 0x6BD5, 24041 },
+ { 0x6BD6, 24036 },
+ { 0x6BD7, 24020 },
+ { 0x6BD8, 24015 },
+ { 0x6BD9, 24059 },
+ { 0x6BDA, 24054 },
+ { 0x6BDB, 24085 },
+ { 0x6BDC, 24080 },
+ { 0x6BDD, 24007 },
+ { 0x6BDE, 24072 },
+ { 0x6BDF, 24067 },
+ { 0x6BE0, 26353 },
+ { 0x6BE1, 26347 },
+ { 0x6BE2, 26369 },
+ { 0x6BE3, 26363 },
+ { 0x6BE4, 23993 },
+ { 0x6BE5, 23978 },
+ { 0x6BE6, 23988 },
+ { 0x6BE7, 23983 },
+ { 0x6BE8, 26322 },
+ { 0x6BE9, 26313 },
+ { 0x6BEA, 28622 },
+ { 0x6BEB, 28590 },
+ { 0x6BEC, 28450 },
+ { 0x6BED, 28440 },
+ { 0x6BEE, 28560 },
+ { 0x6BEF, 28550 },
+ { 0x6BF0, 28430 },
+ { 0x6BF1, 28420 },
+ { 0x6BF2, 28470 },
+ { 0x6BF3, 28460 },
+ { 0x6BF4, 28490 },
+ { 0x6BF5, 28480 },
+ { 0x6BF6, 28410 },
+ { 0x6BF7, 28390 },
+ { 0x6BF8, 28400 },
+ { 0x6BF9, 30178 },
+ { 0x6BFA, 30152 },
+ { 0x6BFB, 30165 },
+ { 0x6BFC, 26021 },
+ { 0x6BFD, 26003 },
+ { 0x6BFE, 26015 },
+ { 0x6BFF, 26009 },
+ { 0x6C00, 28642 },
+ { 0x6C01, 28510 },
+ { 0x6C02, 28692 },
+ { 0x6C03, 28611 },
+ { 0x6C04, 28580 },
+ { 0x6C05, 26665 },
+ { 0x6C06, 26600 },
+ { 0x6C07, 26688 },
+ { 0x6C08, 26716 },
+ { 0x6C09, 26650 },
+ { 0x6C0A, 26635 },
+ { 0x6C0B, 28073 },
+ { 0x6C0C, 27980 },
+ { 0x6C0D, 28115 },
+ { 0x6C0E, 28189 },
+ { 0x6C0F, 28030 },
+ { 0x6C10, 28015 },
+ { 0x6C11, 29671 },
+ { 0x6C12, 29699 },
+ { 0x6C13, 29663 },
+ { 0x6C14, 29648 },
+ { 0x6C15, 28801 },
+ { 0x6C16, 28882 },
+ { 0x6C17, 27033 },
+ { 0x6C18, 27066 },
+ { 0x6C19, 28933 },
+ { 0x6C1A, 28889 },
+ { 0x6C1B, 28947 },
+ { 0x6C1C, 29506 },
+ { 0x6C1D, 29408 },
+ { 0x6C1E, 29546 },
+ { 0x6C1F, 29612 },
+ { 0x6C20, 27755 },
+ { 0x6C21, 27838 },
+ { 0x6C22, 26821 },
+ { 0x6C23, 26763 },
+ { 0x6C24, 26853 },
+ { 0x6C25, 26867 },
+ { 0x6C26, 27852 },
+ { 0x6C27, 27939 },
+ { 0x6C28, 28736 },
+ { 0x6C29, 26526 },
+ { 0x6C2A, 26577 },
+ { 0x6C2B, 29767 },
+ { 0x6C2C, 29809 },
+ { 0x6C2D, 26925 },
+ { 0x6C2E, 26881 },
+ { 0x6C2F, 26957 },
+ { 0x6C30, 26980 },
+ { 0x6C31, 26910 },
+ { 0x6C32, 26895 },
+ { 0x6C33, 27626 },
+ { 0x6C34, 27706 },
+ { 0x6C35, 27655 },
+ { 0x6C36, 27640 },
+ { 0x6C37, 27221 },
+ { 0x6C38, 27235 },
+ { 0x6C39, 27149 },
+ { 0x6C3A, 27249 },
+ { 0x6C3B, 27177 },
+ { 0x6C3C, 27304 },
+ { 0x6C3D, 27213 },
+ { 0x6C3E, 27191 },
+ { 0x6C3F, 27525 },
+ { 0x6C40, 27355 },
+ { 0x6C41, 27557 },
+ { 0x6C42, 27612 },
+ { 0x6C43, 27458 },
+ { 0x6C44, 27376 },
+ { 0x6C45, 29060 },
+ { 0x6C46, 28988 },
+ { 0x6C47, 29101 },
+ { 0x6C48, 29131 },
+ { 0x6C49, 29009 },
+ { 0x6C4A, 28995 },
+ { 0x6C4B, 29293 },
+ { 0x6C4C, 29173 },
+ { 0x6C4D, 29307 },
+ { 0x6C4E, 29354 },
+ { 0x6C4F, 29223 },
+ { 0x6C50, 29208 },
+ { 0x6C51, 27095 },
+ { 0x6C52, 27127 },
+ { 0x6C53, 27080 },
+ { 0x6C54, 27073 },
+ { 0x6C55, 28300 },
+ { 0x6C56, 28226 },
+ { 0x6C57, 28314 },
+ { 0x6C58, 28369 },
+ { 0x6C59, 28276 },
+ { 0x6C5A, 28261 },
+ { 0x6C5B, 29619 },
+ { 0x6C5C, 27713 },
+ { 0x6C5D, 28766 },
+ { 0x6C5E, 30130 },
+ { 0x6C5F, 30137 },
+ { 0x6C60, 30109 },
+ { 0x6C61, 30095 },
+ { 0x6C62, 30123 },
+ { 0x6C63, 30144 },
+ { 0x6C64, 28540 },
+ { 0x6C65, 28712 },
+ { 0x6C66, 28662 },
+ { 0x6C67, 28702 },
+ { 0x6C68, 28600 },
+ { 0x6C69, 28570 },
+ { 0x6C6A, 26621 },
+ { 0x6C6B, 26730 },
+ { 0x6C6C, 26695 },
+ { 0x6C6D, 26723 },
+ { 0x6C6E, 26642 },
+ { 0x6C6F, 26628 },
+ { 0x6C70, 28001 },
+ { 0x6C71, 28203 },
+ { 0x6C72, 28168 },
+ { 0x6C73, 28196 },
+ { 0x6C74, 28022 },
+ { 0x6C75, 28008 },
+ { 0x6C76, 29634 },
+ { 0x6C77, 29713 },
+ { 0x6C78, 29678 },
+ { 0x6C79, 29706 },
+ { 0x6C7A, 29655 },
+ { 0x6C7B, 29641 },
+ { 0x6C7C, 26902 },
+ { 0x6C7D, 26888 },
+ { 0x6C7E, 27647 },
+ { 0x6C7F, 27633 },
+ { 0x6C80, 27198 },
+ { 0x6C81, 27156 },
+ { 0x6C82, 27283 },
+ { 0x6C83, 27205 },
+ { 0x6C84, 27184 },
+ { 0x6C85, 27591 },
+ { 0x6C86, 27450 },
+ { 0x6C87, 27369 },
+ { 0x6C88, 29002 },
+ { 0x6C89, 29117 },
+ { 0x6C8A, 29194 },
+ { 0x6C8B, 29368 },
+ { 0x6C8C, 29333 },
+ { 0x6C8D, 29361 },
+ { 0x6C8E, 29215 },
+ { 0x6C8F, 29201 },
+ { 0x6C90, 28757 },
+ { 0x6C91, 28247 },
+ { 0x6C92, 28383 },
+ { 0x6C93, 28348 },
+ { 0x6C94, 28376 },
+ { 0x6C95, 28268 },
+ { 0x6C96, 28254 },
+ { 0x6C97, 28632 },
+ { 0x6C98, 28500 },
+ { 0x6C99, 28652 },
+ { 0x6C9A, 28682 },
+ { 0x6C9B, 28530 },
+ { 0x6C9C, 26658 },
+ { 0x6C9D, 26593 },
+ { 0x6C9E, 26681 },
+ { 0x6C9F, 26709 },
+ { 0x6CA0, 26614 },
+ { 0x6CA1, 28066 },
+ { 0x6CA2, 27973 },
+ { 0x6CA3, 28108 },
+ { 0x6CA4, 28182 },
+ { 0x6CA5, 27994 },
+ { 0x6CA6, 29692 },
+ { 0x6CA7, 28794 },
+ { 0x6CA8, 28875 },
+ { 0x6CA9, 27026 },
+ { 0x6CAA, 27059 },
+ { 0x6CAB, 28926 },
+ { 0x6CAC, 28940 },
+ { 0x6CAD, 29499 },
+ { 0x6CAE, 29401 },
+ { 0x6CAF, 29539 },
+ { 0x6CB0, 29605 },
+ { 0x6CB1, 27748 },
+ { 0x6CB2, 27806 },
+ { 0x6CB3, 27831 },
+ { 0x6CB4, 26814 },
+ { 0x6CB5, 26756 },
+ { 0x6CB6, 26846 },
+ { 0x6CB7, 26860 },
+ { 0x6CB8, 27845 },
+ { 0x6CB9, 28729 },
+ { 0x6CBA, 26519 },
+ { 0x6CBB, 26570 },
+ { 0x6CBC, 29760 },
+ { 0x6CBD, 29802 },
+ { 0x6CBE, 26918 },
+ { 0x6CBF, 26874 },
+ { 0x6CC0, 26950 },
+ { 0x6CC1, 26973 },
+ { 0x6CC2, 27619 },
+ { 0x6CC3, 27699 },
+ { 0x6CC4, 27228 },
+ { 0x6CC5, 27142 },
+ { 0x6CC6, 27242 },
+ { 0x6CC7, 27170 },
+ { 0x6CC8, 27297 },
+ { 0x6CC9, 27518 },
+ { 0x6CCA, 27348 },
+ { 0x6CCB, 27550 },
+ { 0x6CCC, 27605 },
+ { 0x6CCD, 27362 },
+ { 0x6CCE, 29053 },
+ { 0x6CCF, 28981 },
+ { 0x6CD0, 29094 },
+ { 0x6CD1, 29124 },
+ { 0x6CD2, 29286 },
+ { 0x6CD3, 29166 },
+ { 0x6CD4, 29300 },
+ { 0x6CD5, 29347 },
+ { 0x6CD6, 29187 },
+ { 0x6CD7, 27088 },
+ { 0x6CD8, 27120 },
+ { 0x6CD9, 27134 },
+ { 0x6CDA, 28293 },
+ { 0x6CDB, 28219 },
+ { 0x6CDC, 28307 },
+ { 0x6CDD, 28362 },
+ { 0x6CDE, 28240 },
+ { 0x6CDF, 28672 },
+ { 0x6CE0, 28520 },
+ { 0x6CE1, 26702 },
+ { 0x6CE2, 26607 },
+ { 0x6CE3, 28175 },
+ { 0x6CE4, 27987 },
+ { 0x6CE5, 29685 },
+ { 0x6CE6, 29627 },
+ { 0x6CE7, 29598 },
+ { 0x6CE8, 29415 },
+ { 0x6CE9, 30057 },
+ { 0x6CEA, 29891 },
+ { 0x6CEB, 27163 },
+ { 0x6CEC, 27290 },
+ { 0x6CED, 27598 },
+ { 0x6CEE, 29340 },
+ { 0x6CEF, 29180 },
+ { 0x6CF0, 28355 },
+ { 0x6CF1, 28233 },
+ { 0x6CF2, 30102 },
+ { 0x6CF3, 30088 },
+ { 0x6CF4, 30116 },
+ { 0x6CF5, 27881 },
+ { 0x6CF6, 27866 },
+ { 0x6CF7, 26493 },
+ { 0x6CF8, 26478 },
+ { 0x6CF9, 29752 },
+ { 0x6CFA, 29737 },
+ { 0x6CFB, 29465 },
+ { 0x6CFC, 29450 },
+ { 0x6CFD, 29941 },
+ { 0x6CFE, 29926 },
+ { 0x6CFF, 27009 },
+ { 0x6D00, 26994 },
+ { 0x6D01, 28830 },
+ { 0x6D02, 28815 },
+ { 0x6D03, 28918 },
+ { 0x6D04, 28903 },
+ { 0x6D05, 27798 },
+ { 0x6D06, 27783 },
+ { 0x6D07, 26806 },
+ { 0x6D08, 26791 },
+ { 0x6D09, 29979 },
+ { 0x6D0A, 29884 },
+ { 0x6D0B, 30007 },
+ { 0x6D0C, 30071 },
+ { 0x6D0D, 29912 },
+ { 0x6D0E, 29436 },
+ { 0x6D0F, 27769 },
+ { 0x6D10, 26777 },
+ { 0x6D11, 27873 },
+ { 0x6D12, 27859 },
+ { 0x6D13, 26485 },
+ { 0x6D14, 26471 },
+ { 0x6D15, 29744 },
+ { 0x6D16, 29730 },
+ { 0x6D17, 29457 },
+ { 0x6D18, 29443 },
+ { 0x6D19, 29933 },
+ { 0x6D1A, 29919 },
+ { 0x6D1B, 27001 },
+ { 0x6D1C, 26987 },
+ { 0x6D1D, 28822 },
+ { 0x6D1E, 28808 },
+ { 0x6D1F, 28910 },
+ { 0x6D20, 28896 },
+ { 0x6D21, 27790 },
+ { 0x6D22, 27776 },
+ { 0x6D23, 26798 },
+ { 0x6D24, 26784 },
+ { 0x6D25, 29958 },
+ { 0x6D26, 29863 },
+ { 0x6D27, 29986 },
+ { 0x6D28, 30050 },
+ { 0x6D29, 29905 },
+ { 0x6D2A, 29429 },
+ { 0x6D2B, 27762 },
+ { 0x6D2C, 26770 },
+ { 0x6D2D, 29972 },
+ { 0x6D2E, 29877 },
+ { 0x6D2F, 30000 },
+ { 0x6D30, 30064 },
+ { 0x6D31, 29422 },
+ { 0x6D32, 29898 },
+ { 0x6D33, 27932 },
+ { 0x6D34, 29492 },
+ { 0x6D35, 29394 },
+ { 0x6D36, 29532 },
+ { 0x6D37, 29965 },
+ { 0x6D38, 29870 },
+ { 0x6D39, 29993 },
+ { 0x6D3A, 27925 },
+ { 0x6D3B, 28722 },
+ { 0x6D3C, 28743 },
+ { 0x6D3D, 28750 },
+ { 0x6D3E, 35643 },
+ { 0x6D3F, 35646 },
+ { 0x6D50, 28057 },
+ { 0x6D51, 27946 },
+ { 0x6D52, 27955 },
+ { 0x6D53, 27964 },
+ { 0x6D54, 28099 },
+ { 0x6D55, 28150 },
+ { 0x6D56, 28122 },
+ { 0x6D57, 28159 },
+ { 0x6D58, 28838 },
+ { 0x6D59, 28847 },
+ { 0x6D5A, 27040 },
+ { 0x6D5B, 27049 },
+ { 0x6D5C, 29385 },
+ { 0x6D5D, 29473 },
+ { 0x6D5E, 29482 },
+ { 0x6D5F, 29553 },
+ { 0x6D60, 29562 },
+ { 0x6D61, 29571 },
+ { 0x6D62, 29580 },
+ { 0x6D63, 29589 },
+ { 0x6D64, 27721 },
+ { 0x6D65, 27730 },
+ { 0x6D66, 27813 },
+ { 0x6D67, 29845 },
+ { 0x6D68, 29854 },
+ { 0x6D69, 29949 },
+ { 0x6D6A, 30014 },
+ { 0x6D6B, 30023 },
+ { 0x6D6C, 30032 },
+ { 0x6D6D, 30041 },
+ { 0x6D6E, 26746 },
+ { 0x6D6F, 26828 },
+ { 0x6D70, 26837 },
+ { 0x6D71, 27889 },
+ { 0x6D72, 27898 },
+ { 0x6D73, 27916 },
+ { 0x6D74, 27907 },
+ { 0x6D75, 26501 },
+ { 0x6D76, 26552 },
+ { 0x6D77, 26561 },
+ { 0x6D78, 26542 },
+ { 0x6D79, 29793 },
+ { 0x6D7A, 29774 },
+ { 0x6D7B, 29783 },
+ { 0x6D7C, 26932 },
+ { 0x6D7D, 26941 },
+ { 0x6D7E, 27663 },
+ { 0x6D7F, 27690 },
+ { 0x6D80, 27330 },
+ { 0x6D81, 27311 },
+ { 0x6D82, 27320 },
+ { 0x6D83, 27491 },
+ { 0x6D84, 27482 },
+ { 0x6D85, 27532 },
+ { 0x6D86, 27541 },
+ { 0x6D87, 27564 },
+ { 0x6D88, 27573 },
+ { 0x6D89, 28963 },
+ { 0x6D8A, 28972 },
+ { 0x6D8B, 28954 },
+ { 0x6D8C, 29017 },
+ { 0x6D8D, 29044 },
+ { 0x6D8E, 29076 },
+ { 0x6D8F, 29085 },
+ { 0x6D92, 29035 },
+ { 0x6D93, 27102 },
+ { 0x6D94, 27111 },
+ { 0x6D95, 29157 },
+ { 0x6D96, 29147 },
+ { 0x6D97, 29268 },
+ { 0x6D98, 29277 },
+ { 0x6D99, 29258 },
+ { 0x6D9A, 29314 },
+ { 0x6D9B, 29323 },
+ { 0x6D9C, 28330 },
+ { 0x6D9D, 28339 },
+ { 0x6D9E, 26672 },
+ { 0x6D9F, 28038 },
+ { 0x6DA0, 28047 },
+ { 0x6DA1, 28080 },
+ { 0x6DA2, 28089 },
+ { 0x6DA3, 28131 },
+ { 0x6DA4, 28140 },
+ { 0x6DA5, 28856 },
+ { 0x6DA6, 28784 },
+ { 0x6DA7, 28865 },
+ { 0x6DA8, 29522 },
+ { 0x6DA9, 27739 },
+ { 0x6DAA, 29836 },
+ { 0x6DAB, 26737 },
+ { 0x6DAC, 27473 },
+ { 0x6DAD, 27582 },
+ { 0x6DAE, 28210 },
+ { 0x6DAF, 28284 },
+ { 0x6DB0, 28321 },
+ { 0x6DB1, 29108 },
+ { 0x6DB2, 27681 },
+ { 0x6DB3, 29138 },
+ { 0x6DB4, 27672 },
+ { 0x6DB5, 27339 },
+ { 0x6DB6, 26533 },
+ { 0x6DB7, 27256 },
+ { 0x6DB8, 29240 },
+ { 0x6DB9, 29067 },
+ { 0x6DBA, 27509 },
+ { 0x6DBB, 27265 },
+ { 0x6DBC, 27500 },
+ { 0x6DBD, 29231 },
+ { 0x6DBE, 28775 },
+ { 0x6DBF, 27017 },
+ { 0x6DC0, 29026 },
+ { 0x6DC1, 26964 },
+ { 0x6DC2, 26584 },
+ { 0x6DC3, 27274 },
+ { 0x6DC4, 26510 },
+ { 0x6DC5, 27822 },
+ { 0x6DC6, 29513 },
+ { 0x6DC7, 29249 },
+ { 0x6DF0, 29821 },
+ { 0x6DF1, 29375 },
+ { 0x6DF2, 29725 },
+ { 0x6DF3, 29720 },
+ { 0x6DF4, 30191 },
+ { 0x6DF5, 29816 },
+ { 0x6DF6, 30083 },
+ { 0x6DF7, 30078 },
+ { 0x6DF8, 30196 },
+ { 0x6DF9, 29831 },
+ { 0x6DFA, 30206 },
+ { 0x6DFB, 30211 },
+ { 0x6DFC, 9693 },
+ { 0x6DFD, 30201 },
+ { 0x6E00, 66314 },
+ { 0x6E01, 66316 },
+ { 0x6E02, 66318 },
+ { 0x6E03, 66320 },
+ { 0x6E04, 66322 },
+ { 0x6E05, 66324 },
+ { 0x6E06, 66326 },
+ { 0x6E07, 66328 },
+ { 0x6E08, 66330 },
+ { 0x6E09, 66332 },
+ { 0x6E0A, 66334 },
+ { 0x6E0B, 66336 },
+ { 0x6E0C, 66338 },
+ { 0x6E0D, 66340 },
+ { 0x6E0E, 66342 },
+ { 0x6E0F, 66344 },
+ { 0x6E10, 74355 },
+ { 0x6E11, 74464 },
+ { 0x6E12, 74457 },
+ { 0x6E13, 74350 },
+ { 0x6E14, 74440 },
+ { 0x6E15, 74451 },
+ { 0x6E16, 74434 },
+ { 0x6E17, 74299 },
+ { 0x6E18, 74390 },
+ { 0x6E19, 74445 },
+ { 0x6E20, 58207 },
+ { 0x6E21, 58211 },
+ { 0x6E22, 57894 },
+ { 0x6E23, 57899 },
+ { 0x6E24, 57948 },
+ { 0x6E25, 57955 },
+ { 0x6E26, 58290 },
+ { 0x6E30, 74262 },
+ { 0x6E31, 74244 },
+ { 0x6E32, 74250 },
+ { 0x6E33, 74256 },
+ { 0x6E34, 74343 },
+ { 0x6E35, 74337 },
+ { 0x6E36, 74428 },
+ { 0x6E37, 74284 },
+ { 0x6E38, 74375 },
+ { 0x6E39, 74329 },
+ { 0x6E3A, 74420 },
+ { 0x6E3B, 74276 },
+ { 0x6E3C, 74367 },
+ { 0x6E3D, 74314 },
+ { 0x6E3E, 74405 },
+ { 0x6E3F, 74269 },
+ { 0x6E40, 74360 },
+ { 0x6E41, 74307 },
+ { 0x6E42, 74398 },
+ { 0x6E43, 74291 },
+ { 0x6E44, 74382 },
+ { 0x6E45, 35852 },
+ { 0x6E46, 23293 },
+ { 0x6E47, 74322 },
+ { 0x6E48, 74413 },
+ { 0x6E49, 31173 },
+ { 0x6E4A, 66833 },
+ { 0x6E4B, 10082 },
+ { 0x6E4C, 31561 },
+ { 0x6E4D, 31170 },
+ { 0x6E4E, 66830 },
+ { 0x6E4F, 10075 },
+ { 0x6E50, 22507 },
+ { 0x6E51, 22660 },
+ { 0x6E52, 22487 },
+ { 0x6E54, 22652 },
+ { 0x6E55, 22505 },
+ { 0x6E56, 22644 },
+ { 0x6E57, 22657 },
+ { 0x6E58, 22480 },
+ { 0x6E59, 22499 },
+ { 0x6E5A, 22518 },
+ { 0x6E5B, 22490 },
+ { 0x6E5C, 22509 },
+ { 0x6E5D, 22494 },
+ { 0x6E5E, 22513 },
+ { 0x6E5F, 22596 },
+ { 0x6E60, 22647 },
+ { 0x6E61, 22624 },
+ { 0x6E62, 22502 },
+ { 0x6E63, 22666 },
+ { 0x6E64, 22649 },
+ { 0x6E65, 22663 },
+ { 0x6E66, 22593 },
+ { 0x6E68, 22621 },
+ { 0x6E69, 22590 },
+ { 0x6E6A, 22618 },
+ { 0x6E6B, 22654 },
+ { 0x6E70, 26455 },
+ { 0x6E71, 26442 },
+ { 0x6E72, 26449 },
+ { 0x6E73, 23761 },
+ { 0x6E74, 26467 },
+ { 0x6E76, 23797 },
+ { 0x6E77, 23793 },
+ { 0x6E78, 23772 },
+ { 0x6E79, 23768 },
+ { 0x6E7A, 23813 },
+ { 0x6E7B, 23809 },
+ { 0x6E7C, 26418 },
+ { 0x6E7D, 26414 },
+ { 0x6E7E, 23953 },
+ { 0x6E7F, 23949 },
+ { 0x6E80, 26059 },
+ { 0x6E81, 25385 },
+ { 0x6E82, 25377 },
+ { 0x6E83, 25341 },
+ { 0x6E84, 25333 },
+ { 0x6E85, 25111 },
+ { 0x6E86, 25103 },
+ { 0x6E87, 25363 },
+ { 0x6E88, 25355 },
+ { 0x6E89, 25185 },
+ { 0x6E8A, 25161 },
+ { 0x6E8B, 25177 },
+ { 0x6E8C, 25169 },
+ { 0x6E8D, 25448 },
+ { 0x6E8E, 25411 },
+ { 0x6E8F, 24226 },
+ { 0x6E90, 24211 },
+ { 0x6E91, 24221 },
+ { 0x6E92, 24216 },
+ { 0x6E93, 25042 },
+ { 0x6E94, 25036 },
+ { 0x6E95, 25048 },
+ { 0x6E96, 25012 },
+ { 0x6E97, 25022 },
+ { 0x6E98, 25017 },
+ { 0x6E99, 25869 },
+ { 0x6E9A, 25854 },
+ { 0x6E9B, 25864 },
+ { 0x6E9C, 25859 },
+ { 0x6E9D, 25572 },
+ { 0x6E9E, 25557 },
+ { 0x6E9F, 25567 },
+ { 0x6EA0, 25562 },
+ { 0x6EA1, 24540 },
+ { 0x6EA2, 24525 },
+ { 0x6EA3, 24535 },
+ { 0x6EA4, 24530 },
+ { 0x6EA5, 25595 },
+ { 0x6EA6, 25580 },
+ { 0x6EA7, 25590 },
+ { 0x6EA8, 25585 },
+ { 0x6EA9, 24328 },
+ { 0x6EAA, 24323 },
+ { 0x6EAB, 25846 },
+ { 0x6EAC, 25841 },
+ { 0x6EAD, 24924 },
+ { 0x6EAE, 24919 },
+ { 0x6EAF, 25905 },
+ { 0x6EB0, 25900 },
+ { 0x6EB1, 25833 },
+ { 0x6EB2, 25818 },
+ { 0x6EB3, 25828 },
+ { 0x6EB4, 25823 },
+ { 0x6EB5, 26216 },
+ { 0x6EB6, 26201 },
+ { 0x6EB7, 26211 },
+ { 0x6EB8, 26206 },
+ { 0x6EB9, 24961 },
+ { 0x6EBA, 24946 },
+ { 0x6EBB, 24956 },
+ { 0x6EBC, 24951 },
+ { 0x6EBD, 24255 },
+ { 0x6EBE, 24240 },
+ { 0x6EBF, 24250 },
+ { 0x6EC0, 24245 },
+ { 0x6EC1, 24991 },
+ { 0x6EC2, 24976 },
+ { 0x6EC3, 24986 },
+ { 0x6EC4, 24981 },
+ { 0x6EC5, 25305 },
+ { 0x6EC6, 25290 },
+ { 0x6EC7, 25300 },
+ { 0x6EC8, 25295 },
+ { 0x6EC9, 24139 },
+ { 0x6ECA, 24124 },
+ { 0x6ECB, 24134 },
+ { 0x6ECC, 24129 },
+ { 0x6ECD, 26051 },
+ { 0x6ECE, 26036 },
+ { 0x6ECF, 26046 },
+ { 0x6ED0, 26041 },
+ { 0x6ED1, 24400 },
+ { 0x6ED2, 24385 },
+ { 0x6ED3, 24395 },
+ { 0x6ED4, 24390 },
+ { 0x6ED5, 24828 },
+ { 0x6ED6, 24813 },
+ { 0x6ED7, 24823 },
+ { 0x6ED8, 24818 },
+ { 0x6ED9, 24715 },
+ { 0x6EDA, 24700 },
+ { 0x6EDB, 24710 },
+ { 0x6EDC, 24705 },
+ { 0x6EDD, 24769 },
+ { 0x6EDE, 24754 },
+ { 0x6EDF, 24764 },
+ { 0x6EE0, 24759 },
+ { 0x6EE1, 25630 },
+ { 0x6EE2, 25615 },
+ { 0x6EE3, 25625 },
+ { 0x6EE4, 25620 },
+ { 0x6EE5, 25706 },
+ { 0x6EE6, 25675 },
+ { 0x6EE7, 25701 },
+ { 0x6EE8, 25696 },
+ { 0x6EE9, 24626 },
+ { 0x6EEA, 24611 },
+ { 0x6EEB, 24621 },
+ { 0x6EEC, 24616 },
+ { 0x6EED, 25142 },
+ { 0x6EEE, 25137 },
+ { 0x6EEF, 25442 },
+ { 0x6EF0, 25436 },
+ { 0x6EF1, 25282 },
+ { 0x6EF2, 25206 },
+ { 0x6EF3, 25277 },
+ { 0x6EF4, 25272 },
+ { 0x6EF5, 27433 },
+ { 0x6EF6, 27423 },
+ { 0x6EF7, 27393 },
+ { 0x6EF8, 27383 },
+ { 0x6EF9, 27413 },
+ { 0x6EFA, 27403 },
+ { 0x6EFB, 27466 },
+ { 0x6EFC, 27443 },
+ { 0x6EFF, 10095 },
+ { 0x6F01, 63786 },
+ { 0x6F02, 63773 },
+ { 0x6F03, 63749 },
+ { 0x6F04, 63741 },
+ { 0x6F05, 63752 },
+ { 0x6F06, 63768 },
+ { 0x6F07, 63778 },
+ { 0x6F08, 63415 },
+ { 0x6F09, 63733 },
+ { 0x6F0A, 63760 },
+ { 0x6F0B, 63418 },
+ { 0x6F0C, 63423 },
+ { 0x6F0D, 63792 },
+ { 0x6F0E, 63400 },
+ { 0x6F0F, 63758 },
+ { 0x6F10, 63443 },
+ { 0x6F11, 63425 },
+ { 0x6F12, 63431 },
+ { 0x6F13, 63452 },
+ { 0x6F14, 63437 },
+ { 0x6F15, 63434 },
+ { 0x6F16, 63428 },
+ { 0x6F17, 63449 },
+ { 0x6F18, 63446 },
+ { 0x6F19, 63440 },
+ { 0x6F1A, 63421 },
+ { 0x6F1B, 63776 },
+ { 0x6F1C, 63770 },
+ { 0x6F1D, 63744 },
+ { 0x6F1E, 63789 },
+ { 0x6F1F, 63762 },
+ { 0x6F20, 63783 },
+ { 0x6F21, 63588 },
+ { 0x6F22, 63593 },
+ { 0x6F23, 63598 },
+ { 0x6F24, 63603 },
+ { 0x6F25, 63608 },
+ { 0x6F26, 63613 },
+ { 0x6F27, 63618 },
+ { 0x6F28, 63623 },
+ { 0x6F29, 63628 },
+ { 0x6F2A, 63633 },
+ { 0x6F2B, 63638 },
+ { 0x6F2C, 63643 },
+ { 0x6F2D, 63648 },
+ { 0x6F2E, 63653 },
+ { 0x6F2F, 63658 },
+ { 0x6F30, 63663 },
+ { 0x6F31, 63668 },
+ { 0x6F32, 63673 },
+ { 0x6F33, 63678 },
+ { 0x6F34, 63683 },
+ { 0x6F35, 63688 },
+ { 0x6F36, 63693 },
+ { 0x6F37, 63698 },
+ { 0x6F38, 63703 },
+ { 0x6F39, 63708 },
+ { 0x6F3A, 63713 },
+ { 0x6F3B, 63411 },
+ { 0x6F3C, 63755 },
+ { 0x6F3D, 63729 },
+ { 0x6F3E, 63780 },
+ { 0x6F3F, 63385 },
+ { 0x6F40, 63455 },
+ { 0x6F41, 63458 },
+ { 0x6F42, 63463 },
+ { 0x6F43, 63468 },
+ { 0x6F44, 63473 },
+ { 0x6F45, 63478 },
+ { 0x6F46, 63483 },
+ { 0x6F47, 63488 },
+ { 0x6F48, 63493 },
+ { 0x6F49, 63498 },
+ { 0x6F4A, 63503 },
+ { 0x6F4B, 63508 },
+ { 0x6F4C, 63513 },
+ { 0x6F4D, 63518 },
+ { 0x6F4E, 63523 },
+ { 0x6F4F, 63528 },
+ { 0x6F50, 63533 },
+ { 0x6F51, 63538 },
+ { 0x6F52, 63543 },
+ { 0x6F53, 63548 },
+ { 0x6F54, 63553 },
+ { 0x6F55, 63558 },
+ { 0x6F56, 63563 },
+ { 0x6F57, 63568 },
+ { 0x6F58, 63573 },
+ { 0x6F59, 63578 },
+ { 0x6F5A, 63583 },
+ { 0x6F5B, 63403 },
+ { 0x6F5C, 63765 },
+ { 0x6F5D, 63721 },
+ { 0x6F5E, 63736 },
+ { 0x6F5F, 63407 },
+ { 0x6F60, 63725 },
+ { 0x6F61, 64276 },
+ { 0x6F62, 63796 },
+ { 0x6F63, 63807 },
+ { 0x6F64, 64280 },
+ { 0x6F65, 64253 },
+ { 0x6F66, 64192 },
+ { 0x6F67, 64208 },
+ { 0x6F68, 64218 },
+ { 0x6F69, 64228 },
+ { 0x6F6A, 64213 },
+ { 0x6F6B, 64223 },
+ { 0x6F6C, 64238 },
+ { 0x6F6D, 64248 },
+ { 0x6F6E, 64243 },
+ { 0x6F6F, 64233 },
+ { 0x6F70, 64283 },
+ { 0x6F71, 64024 },
+ { 0x6F72, 64032 },
+ { 0x6F73, 64044 },
+ { 0x6F74, 64028 },
+ { 0x6F75, 64040 },
+ { 0x6F76, 64068 },
+ { 0x6F77, 64076 },
+ { 0x6F78, 64084 },
+ { 0x6F79, 64072 },
+ { 0x6F7A, 64080 },
+ { 0x6F7B, 64148 },
+ { 0x6F7C, 64156 },
+ { 0x6F7D, 64164 },
+ { 0x6F7E, 64152 },
+ { 0x6F7F, 64160 },
+ { 0x6F80, 64168 },
+ { 0x6F81, 64176 },
+ { 0x6F82, 64184 },
+ { 0x6F83, 64172 },
+ { 0x6F84, 64180 },
+ { 0x6F85, 64108 },
+ { 0x6F86, 64116 },
+ { 0x6F87, 64124 },
+ { 0x6F88, 64112 },
+ { 0x6F89, 64120 },
+ { 0x6F8A, 64048 },
+ { 0x6F8B, 64056 },
+ { 0x6F8C, 64064 },
+ { 0x6F8D, 64052 },
+ { 0x6F8E, 64060 },
+ { 0x6F8F, 64088 },
+ { 0x6F90, 64096 },
+ { 0x6F91, 64104 },
+ { 0x6F92, 64092 },
+ { 0x6F93, 64100 },
+ { 0x6F94, 64196 },
+ { 0x6F95, 64204 },
+ { 0x6F96, 64200 },
+ { 0x6F97, 64128 },
+ { 0x6F98, 64136 },
+ { 0x6F99, 64144 },
+ { 0x6F9A, 64132 },
+ { 0x6F9B, 64140 },
+ { 0x6F9C, 64188 },
+ { 0x6F9D, 64036 },
+ { 0x6F9E, 64257 },
+ { 0x6F9F, 64262 },
+ { 0x6FA0, 63814 },
+ { 0x6FA1, 63933 },
+ { 0x6FA2, 64001 },
+ { 0x6FA3, 63977 },
+ { 0x6FA4, 63921 },
+ { 0x6FA5, 63981 },
+ { 0x6FA6, 63985 },
+ { 0x6FA7, 63937 },
+ { 0x6FA8, 64005 },
+ { 0x6FA9, 63929 },
+ { 0x6FAA, 64009 },
+ { 0x6FAB, 63993 },
+ { 0x6FAC, 63997 },
+ { 0x6FAD, 63965 },
+ { 0x6FAE, 64017 },
+ { 0x6FAF, 64013 },
+ { 0x6FB0, 63989 },
+ { 0x6FB1, 63917 },
+ { 0x6FB2, 63925 },
+ { 0x6FB3, 63973 },
+ { 0x6FB4, 63961 },
+ { 0x6FB5, 63901 },
+ { 0x6FB6, 63957 },
+ { 0x6FB7, 63913 },
+ { 0x6FB8, 63905 },
+ { 0x6FB9, 63969 },
+ { 0x6FBA, 63941 },
+ { 0x6FBB, 63945 },
+ { 0x6FBC, 63953 },
+ { 0x6FBD, 63949 },
+ { 0x6FBE, 63909 },
+ { 0x6FC2, 63817 },
+ { 0x6FC3, 63837 },
+ { 0x6FC4, 63865 },
+ { 0x6FC5, 63893 },
+ { 0x6FC6, 63841 },
+ { 0x6FC7, 63821 },
+ { 0x6FCA, 63897 },
+ { 0x6FCB, 63869 },
+ { 0x6FCC, 63829 },
+ { 0x6FCD, 63853 },
+ { 0x6FCE, 63885 },
+ { 0x6FCF, 63849 },
+ { 0x6FD2, 63877 },
+ { 0x6FD3, 63833 },
+ { 0x6FD4, 63889 },
+ { 0x6FD5, 63857 },
+ { 0x6FD6, 63861 },
+ { 0x6FD7, 63881 },
+ { 0x6FDA, 63845 },
+ { 0x6FDB, 63873 },
+ { 0x6FDC, 63825 },
+ { 0x6FE0, 63397 },
+ { 0x6FE1, 63718 },
+ { 0x6FE2, 63388 },
+ { 0x6FE3, 63747 },
+ { 0x6FE4, 63738 },
+ { 0x6FE5, 63394 },
+ { 0x6FE6, 63391 },
+ { 0x6FE8, 63803 },
+ { 0x6FE9, 64270 },
+ { 0x6FEA, 64021 },
+ { 0x6FEB, 64273 },
+ { 0x6FEC, 64267 },
+ { 0x6FED, 63800 },
+ { 0x6FEE, 63811 },
+ { 0x6FF9, 69249 },
+ { 0x6FFA, 69252 },
+ { 0x6FFB, 69255 },
+ { 0x6FFC, 35637 },
+ { 0x6FFD, 69276 },
+ { 0x7000, 35010 },
+ { 0x7001, 35135 },
+ { 0x7002, 35095 },
+ { 0x7003, 35235 },
+ { 0x7004, 35020 },
+ { 0x7005, 34975 },
+ { 0x7006, 35170 },
+ { 0x7007, 35005 },
+ { 0x7008, 35040 },
+ { 0x7009, 35190 },
+ { 0x700A, 35215 },
+ { 0x700B, 35175 },
+ { 0x700D, 35125 },
+ { 0x700E, 35245 },
+ { 0x700F, 35305 },
+ { 0x7010, 35165 },
+ { 0x7011, 35255 },
+ { 0x7012, 35270 },
+ { 0x7013, 35320 },
+ { 0x7014, 35315 },
+ { 0x7015, 35035 },
+ { 0x7016, 35285 },
+ { 0x7017, 35045 },
+ { 0x7018, 35070 },
+ { 0x7019, 35000 },
+ { 0x701A, 35075 },
+ { 0x701B, 35105 },
+ { 0x701C, 35195 },
+ { 0x701D, 35210 },
+ { 0x701E, 34985 },
+ { 0x701F, 35280 },
+ { 0x7020, 35140 },
+ { 0x7021, 35025 },
+ { 0x7022, 35185 },
+ { 0x7023, 35050 },
+ { 0x7024, 35310 },
+ { 0x7025, 35065 },
+ { 0x7026, 35115 },
+ { 0x7028, 35230 },
+ { 0x7029, 35090 },
+ { 0x702A, 35200 },
+ { 0x702B, 34980 },
+ { 0x702C, 35085 },
+ { 0x702D, 35110 },
+ { 0x702E, 35015 },
+ { 0x702F, 35150 },
+ { 0x7030, 35030 },
+ { 0x7031, 35220 },
+ { 0x7032, 35225 },
+ { 0x7033, 34990 },
+ { 0x7034, 35130 },
+ { 0x7035, 34995 },
+ { 0x7036, 35265 },
+ { 0x7037, 35205 },
+ { 0x7038, 35295 },
+ { 0x7039, 35145 },
+ { 0x703A, 35155 },
+ { 0x703C, 35055 },
+ { 0x703D, 35290 },
+ { 0x703F, 35060 },
+ { 0x7040, 35080 },
+ { 0x7041, 35160 },
+ { 0x7042, 35325 },
+ { 0x7043, 35275 },
+ { 0x7044, 35335 },
+ { 0x7045, 35180 },
+ { 0x7046, 35100 },
+ { 0x7047, 35240 },
+ { 0x7048, 35300 },
+ { 0x7049, 35120 },
+ { 0x704A, 35260 },
+ { 0x704B, 35250 },
+ { 0x704C, 35330 },
+ { 0x704D, 35340 },
+ { 0x7050, 34349 },
+ { 0x7051, 34353 },
+ { 0x7052, 34357 },
+ { 0x7053, 34361 },
+ { 0x7054, 34365 },
+ { 0x7055, 34369 },
+ { 0x7056, 34373 },
+ { 0x7057, 34377 },
+ { 0x7058, 34381 },
+ { 0x7059, 34385 },
+ { 0x705A, 34389 },
+ { 0x705B, 34393 },
+ { 0x705C, 34397 },
+ { 0x705D, 34401 },
+ { 0x7080, 34405 },
+ { 0x7081, 34410 },
+ { 0x7082, 34415 },
+ { 0x7083, 34420 },
+ { 0x7084, 34750 },
+ { 0x7085, 34755 },
+ { 0x7086, 34760 },
+ { 0x7087, 34765 },
+ { 0x7088, 34770 },
+ { 0x7089, 34775 },
+ { 0x708A, 34780 },
+ { 0x708B, 34785 },
+ { 0x708C, 34790 },
+ { 0x708D, 34795 },
+ { 0x708E, 34425 },
+ { 0x708F, 34430 },
+ { 0x7090, 34435 },
+ { 0x7091, 34440 },
+ { 0x7092, 34445 },
+ { 0x7093, 34945 },
+ { 0x7094, 34950 },
+ { 0x7095, 34450 },
+ { 0x7096, 34455 },
+ { 0x7097, 34460 },
+ { 0x7098, 34955 },
+ { 0x7099, 34960 },
+ { 0x709A, 34464 },
+ { 0x709B, 34469 },
+ { 0x709C, 34474 },
+ { 0x709D, 34478 },
+ { 0x709E, 34483 },
+ { 0x709F, 34487 },
+ { 0x70A0, 34491 },
+ { 0x70A1, 34496 },
+ { 0x70A2, 34500 },
+ { 0x70A3, 34504 },
+ { 0x70A4, 34965 },
+ { 0x70A5, 34508 },
+ { 0x70A6, 34512 },
+ { 0x70A7, 34516 },
+ { 0x70A8, 34521 },
+ { 0x70A9, 34525 },
+ { 0x70AA, 34529 },
+ { 0x70AB, 34534 },
+ { 0x70AC, 34539 },
+ { 0x70AD, 34543 },
+ { 0x70AE, 34547 },
+ { 0x70AF, 34551 },
+ { 0x70B0, 34555 },
+ { 0x70B1, 34559 },
+ { 0x70B2, 34563 },
+ { 0x70B3, 34567 },
+ { 0x70B4, 34571 },
+ { 0x70B5, 34575 },
+ { 0x70B6, 34580 },
+ { 0x70B7, 34584 },
+ { 0x70B8, 34589 },
+ { 0x70B9, 34593 },
+ { 0x70BA, 34597 },
+ { 0x70BB, 34601 },
+ { 0x70BC, 34605 },
+ { 0x70BD, 34609 },
+ { 0x70BE, 34613 },
+ { 0x70BF, 34617 },
+ { 0x70C0, 34621 },
+ { 0x70C1, 34625 },
+ { 0x70C2, 34629 },
+ { 0x70C3, 34633 },
+ { 0x70C4, 34638 },
+ { 0x70C5, 34643 },
+ { 0x70C6, 34648 },
+ { 0x70C7, 34653 },
+ { 0x70C8, 34658 },
+ { 0x70C9, 34662 },
+ { 0x70CA, 34667 },
+ { 0x70CB, 34671 },
+ { 0x70CC, 34675 },
+ { 0x70CD, 34681 },
+ { 0x70CE, 34686 },
+ { 0x70CF, 34692 },
+ { 0x70D0, 34697 },
+ { 0x70D1, 34701 },
+ { 0x70D2, 34970 },
+ { 0x70D3, 34705 },
+ { 0x70D4, 34709 },
+ { 0x70D5, 34713 },
+ { 0x70D6, 34717 },
+ { 0x70D7, 34721 },
+ { 0x70D8, 34725 },
+ { 0x70D9, 34730 },
+ { 0x70DA, 34734 },
+ { 0x70DB, 34738 },
+ { 0x70DC, 34742 },
+ { 0x70DD, 34746 },
+ { 0x70DE, 34800 },
+ { 0x70DF, 34805 },
+ { 0x70E0, 34810 },
+ { 0x70E1, 34815 },
+ { 0x70E2, 34820 },
+ { 0x70E3, 34825 },
+ { 0x70E4, 34830 },
+ { 0x70E5, 34835 },
+ { 0x70E6, 34840 },
+ { 0x70E7, 34845 },
+ { 0x70E8, 34850 },
+ { 0x70E9, 34855 },
+ { 0x70EA, 34860 },
+ { 0x70EB, 34865 },
+ { 0x70EC, 34870 },
+ { 0x70ED, 34875 },
+ { 0x70EE, 34880 },
+ { 0x70EF, 34885 },
+ { 0x70F0, 34890 },
+ { 0x70F1, 34895 },
+ { 0x70F2, 34900 },
+ { 0x70F3, 34905 },
+ { 0x70F4, 34910 },
+ { 0x70F5, 34915 },
+ { 0x70F6, 34920 },
+ { 0x70F7, 34925 },
+ { 0x70F8, 34930 },
+ { 0x70F9, 34935 },
+ { 0x70FA, 34940 },
+ { 0x7100, 23485 },
+ { 0x7101, 23481 },
+ { 0x7102, 23489 },
+ { 0x7107, 23497 },
+ { 0x7108, 23526 },
+ { 0x7109, 23613 },
+ { 0x710A, 23548 },
+ { 0x710B, 23537 },
+ { 0x710C, 23508 },
+ { 0x710D, 23595 },
+ { 0x710E, 23570 },
+ { 0x710F, 23559 },
+ { 0x7110, 23519 },
+ { 0x7111, 23645 },
+ { 0x7112, 23638 },
+ { 0x7113, 23588 },
+ { 0x7114, 23581 },
+ { 0x7115, 23606 },
+ { 0x7116, 23652 },
+ { 0x7117, 23624 },
+ { 0x7118, 23631 },
+ { 0x7119, 23500 },
+ { 0x711A, 23529 },
+ { 0x711B, 23616 },
+ { 0x711C, 23551 },
+ { 0x711D, 23540 },
+ { 0x711E, 23511 },
+ { 0x711F, 23598 },
+ { 0x7120, 23573 },
+ { 0x7121, 23562 },
+ { 0x7122, 23504 },
+ { 0x7123, 23533 },
+ { 0x7124, 23620 },
+ { 0x7125, 23555 },
+ { 0x7126, 23544 },
+ { 0x7127, 23515 },
+ { 0x7128, 23602 },
+ { 0x7129, 23577 },
+ { 0x712A, 23566 },
+ { 0x712B, 23522 },
+ { 0x712C, 23648 },
+ { 0x712D, 23641 },
+ { 0x712E, 23591 },
+ { 0x712F, 23584 },
+ { 0x7130, 23609 },
+ { 0x7131, 23655 },
+ { 0x7132, 23627 },
+ { 0x7133, 23634 },
+ { 0x7137, 23659 },
+ { 0x7138, 23663 },
+ { 0x7139, 23675 },
+ { 0x713A, 23667 },
+ { 0x713B, 23671 },
+ { 0x713C, 23476 },
+ { 0x713D, 23492 },
+ { 0x713E, 23683 },
+ { 0x713F, 23679 },
+ { 0x7140, 13133 },
+ { 0x7141, 13111 },
+ { 0x7142, 13116 },
+ { 0x7143, 13171 },
+ { 0x7144, 13213 },
+ { 0x7145, 13175 },
+ { 0x7146, 13202 },
+ { 0x7147, 13227 },
+ { 0x7148, 13197 },
+ { 0x7149, 13160 },
+ { 0x714A, 13222 },
+ { 0x714B, 13127 },
+ { 0x714C, 13186 },
+ { 0x714D, 13144 },
+ { 0x714E, 13207 },
+ { 0x714F, 13192 },
+ { 0x7150, 13155 },
+ { 0x7151, 13217 },
+ { 0x7152, 13121 },
+ { 0x7153, 13180 },
+ { 0x7154, 13138 },
+ { 0x7155, 13165 },
+ { 0x7156, 13232 },
+ { 0x7157, 13150 },
+ { 0x7158, 13248 },
+ { 0x7159, 13263 },
+ { 0x715A, 13331 },
+ { 0x715B, 13317 },
+ { 0x715C, 13281 },
+ { 0x715D, 13253 },
+ { 0x715E, 13321 },
+ { 0x715F, 13353 },
+ { 0x7160, 13343 },
+ { 0x7161, 13347 },
+ { 0x7162, 13335 },
+ { 0x7163, 13313 },
+ { 0x7164, 13277 },
+ { 0x7165, 13304 },
+ { 0x7166, 13362 },
+ { 0x7167, 13366 },
+ { 0x7168, 13339 },
+ { 0x7169, 13295 },
+ { 0x716A, 13267 },
+ { 0x716B, 13299 },
+ { 0x716C, 13326 },
+ { 0x716D, 13357 },
+ { 0x716E, 13285 },
+ { 0x716F, 13308 },
+ { 0x7170, 13238 },
+ { 0x7171, 13272 },
+ { 0x7172, 13290 },
+ { 0x7173, 13243 },
+ { 0x7174, 13258 },
+ { 0x7175, 10649 },
+ { 0x7176, 10653 },
+ { 0x7177, 10674 },
+ { 0x7178, 11894 },
+ { 0x7179, 10694 },
+ { 0x717A, 12082 },
+ { 0x717B, 13022 },
+ { 0x717C, 10689 },
+ { 0x717D, 10670 },
+ { 0x717E, 11890 },
+ { 0x717F, 10685 },
+ { 0x7180, 10681 },
+ { 0x7181, 13056 },
+ { 0x7182, 13027 },
+ { 0x7183, 10717 },
+ { 0x7184, 12079 },
+ { 0x7185, 12085 },
+ { 0x7186, 12021 },
+ { 0x7187, 12018 },
+ { 0x7188, 12024 },
+ { 0x7189, 13067 },
+ { 0x718A, 10697 },
+ { 0x7190, 22109 },
+ { 0x7191, 22013 },
+ { 0x7192, 22121 },
+ { 0x7193, 22112 },
+ { 0x7194, 22016 },
+ { 0x7195, 22115 },
+ { 0x7196, 22118 },
+ { 0x7197, 22130 },
+ { 0x7198, 22133 },
+ { 0x7199, 22127 },
+ { 0x719A, 22010 },
+ { 0x719B, 22124 },
+ { 0x71D0, 55326 },
+ { 0x71D1, 55265 },
+ { 0x71D2, 55306 },
+ { 0x71D3, 55278 },
+ { 0x71D4, 55211 },
+ { 0x71D5, 55245 },
+ { 0x71D6, 55261 },
+ { 0x71D7, 55294 },
+ { 0x71D8, 55237 },
+ { 0x71D9, 55202 },
+ { 0x71DA, 55145 },
+ { 0x71DB, 55270 },
+ { 0x71DC, 55165 },
+ { 0x71DD, 55298 },
+ { 0x71DE, 55282 },
+ { 0x71DF, 55161 },
+ { 0x71E0, 55153 },
+ { 0x71E1, 55311 },
+ { 0x71E2, 55315 },
+ { 0x71E3, 55253 },
+ { 0x71E4, 55169 },
+ { 0x71E5, 55228 },
+ { 0x71E6, 55249 },
+ { 0x71E7, 55274 },
+ { 0x71E8, 55189 },
+ { 0x71E9, 55181 },
+ { 0x71EA, 55177 },
+ { 0x71EB, 55206 },
+ { 0x71EC, 55149 },
+ { 0x71ED, 55157 },
+ { 0x71EE, 55215 },
+ { 0x71EF, 55173 },
+ { 0x71F0, 55241 },
+ { 0x71F1, 55141 },
+ { 0x71F2, 55223 },
+ { 0x71F3, 55193 },
+ { 0x71F4, 55286 },
+ { 0x71F5, 55290 },
+ { 0x71F6, 55185 },
+ { 0x71F7, 55136 },
+ { 0x71F8, 55219 },
+ { 0x71F9, 55257 },
+ { 0x71FA, 55302 },
+ { 0x71FB, 55232 },
+ { 0x71FC, 55197 },
+ { 0x71FD, 55320 },
+ { 0x7280, 35345 },
+ { 0x7281, 35354 },
+ { 0x7282, 35348 },
+ { 0x7283, 35411 },
+ { 0x7284, 35357 },
+ { 0x7285, 35351 },
+ { 0x7286, 35363 },
+ { 0x7287, 35399 },
+ { 0x7288, 35405 },
+ { 0x7289, 35426 },
+ { 0x728A, 35366 },
+ { 0x728B, 35369 },
+ { 0x728C, 35384 },
+ { 0x728D, 35372 },
+ { 0x728E, 35375 },
+ { 0x728F, 35378 },
+ { 0x7290, 35420 },
+ { 0x7291, 35423 },
+ { 0x7292, 35396 },
+ { 0x7293, 35381 },
+ { 0x7294, 35417 },
+ { 0x7295, 35387 },
+ { 0x7296, 35390 },
+ { 0x7297, 35393 },
+ { 0x7298, 35429 },
+ { 0x7299, 35408 },
+ { 0x729A, 35414 },
+ { 0x729B, 35360 },
+ { 0x729C, 35402 },
+ { 0x72A0, 30318 },
+ { 0x72A1, 30405 },
+ { 0x72A2, 30324 },
+ { 0x72A3, 30339 },
+ { 0x72A4, 30447 },
+ { 0x72A5, 30357 },
+ { 0x72A6, 30390 },
+ { 0x72A7, 30372 },
+ { 0x72A8, 30354 },
+ { 0x72A9, 30321 },
+ { 0x72AA, 30342 },
+ { 0x72AB, 30348 },
+ { 0x72AC, 30375 },
+ { 0x72AD, 30363 },
+ { 0x72AE, 30411 },
+ { 0x72AF, 30438 },
+ { 0x72B0, 30360 },
+ { 0x72B1, 30450 },
+ { 0x72B2, 30366 },
+ { 0x72B3, 30402 },
+ { 0x72B4, 30369 },
+ { 0x72B5, 30345 },
+ { 0x72B6, 30444 },
+ { 0x72B7, 30351 },
+ { 0x72B8, 30414 },
+ { 0x72B9, 30333 },
+ { 0x72BA, 30327 },
+ { 0x72BB, 30462 },
+ { 0x72BC, 30336 },
+ { 0x72BD, 30387 },
+ { 0x72BE, 30396 },
+ { 0x72BF, 30423 },
+ { 0x72C0, 30330 },
+ { 0x72C1, 30381 },
+ { 0x72C2, 30417 },
+ { 0x72C3, 30441 },
+ { 0x72C4, 30399 },
+ { 0x72C5, 30384 },
+ { 0x72C6, 30453 },
+ { 0x72C7, 30420 },
+ { 0x72C8, 30456 },
+ { 0x72C9, 30408 },
+ { 0x72CA, 30393 },
+ { 0x72CB, 30429 },
+ { 0x72CC, 30432 },
+ { 0x72CD, 30435 },
+ { 0x72CE, 30426 },
+ { 0x72CF, 30378 },
+ { 0x72D0, 30459 },
+ { 0x7300, 6815 },
+ { 0x7301, 6835 },
+ { 0x7302, 6879 },
+ { 0x7303, 6839 },
+ { 0x7304, 6819 },
+ { 0x7305, 6899 },
+ { 0x7306, 6903 },
+ { 0x7307, 6867 },
+ { 0x7308, 6935 },
+ { 0x7309, 6823 },
+ { 0x730A, 6875 },
+ { 0x730B, 6847 },
+ { 0x730C, 6851 },
+ { 0x730D, 6855 },
+ { 0x730E, 6919 },
+ { 0x730F, 6827 },
+ { 0x7310, 6887 },
+ { 0x7311, 6931 },
+ { 0x7312, 6883 },
+ { 0x7313, 6859 },
+ { 0x7314, 6863 },
+ { 0x7315, 6891 },
+ { 0x7316, 6831 },
+ { 0x7317, 6911 },
+ { 0x7318, 6927 },
+ { 0x7319, 6923 },
+ { 0x731A, 6843 },
+ { 0x731B, 6915 },
+ { 0x731C, 6907 },
+ { 0x731D, 6871 },
+ { 0x731E, 6895 },
+ { 0x7320, 6939 },
+ { 0x7321, 6947 },
+ { 0x7322, 6943 },
+ { 0x7323, 6951 },
+ { 0x7330, 31802 },
+ { 0x7331, 31869 },
+ { 0x7332, 31808 },
+ { 0x7333, 31805 },
+ { 0x7334, 31857 },
+ { 0x7335, 31875 },
+ { 0x7336, 31814 },
+ { 0x7337, 31811 },
+ { 0x7338, 31866 },
+ { 0x7339, 31796 },
+ { 0x733A, 31833 },
+ { 0x733B, 31836 },
+ { 0x733C, 31839 },
+ { 0x733D, 31860 },
+ { 0x733E, 31799 },
+ { 0x733F, 31821 },
+ { 0x7340, 31872 },
+ { 0x7341, 31863 },
+ { 0x7342, 31845 },
+ { 0x7343, 31848 },
+ { 0x7344, 31851 },
+ { 0x7345, 31854 },
+ { 0x7346, 31824 },
+ { 0x7347, 31830 },
+ { 0x7348, 31827 },
+ { 0x7349, 31842 },
+ { 0x734A, 31817 },
+ { 0x7380, 55959 },
+ { 0x7381, 55962 },
+ { 0x7382, 55986 },
+ { 0x7383, 55941 },
+ { 0x7384, 55983 },
+ { 0x7385, 55920 },
+ { 0x7386, 55929 },
+ { 0x7387, 55980 },
+ { 0x7388, 55968 },
+ { 0x7389, 55953 },
+ { 0x738A, 55956 },
+ { 0x738B, 55938 },
+ { 0x738C, 55977 },
+ { 0x738D, 55992 },
+ { 0x738E, 55944 },
+ { 0x738F, 55965 },
+ { 0x7390, 55947 },
+ { 0x7391, 55932 },
+ { 0x7392, 55998 },
+ { 0x7393, 55935 },
+ { 0x7394, 55923 },
+ { 0x7395, 55974 },
+ { 0x7396, 55971 },
+ { 0x7397, 55995 },
+ { 0x7398, 56001 },
+ { 0x7399, 55989 },
+ { 0x739A, 55926 },
+ { 0x739B, 55914 },
+ { 0x739C, 55917 },
+ { 0x739D, 55950 },
+ { 0x739F, 55911 },
+ { 0x73A0, 6955 },
+ { 0x73A1, 6959 },
+ { 0x73A2, 6963 },
+ { 0x73A3, 7011 },
+ { 0x73A4, 7015 },
+ { 0x73A5, 6991 },
+ { 0x73A6, 6995 },
+ { 0x73A7, 7075 },
+ { 0x73A8, 6971 },
+ { 0x73A9, 7003 },
+ { 0x73AA, 7007 },
+ { 0x73AB, 7059 },
+ { 0x73AC, 7063 },
+ { 0x73AD, 6975 },
+ { 0x73AE, 6979 },
+ { 0x73AF, 6983 },
+ { 0x73B0, 7095 },
+ { 0x73B1, 7043 },
+ { 0x73B2, 6967 },
+ { 0x73B3, 6987 },
+ { 0x73B4, 7035 },
+ { 0x73B5, 7039 },
+ { 0x73B6, 7023 },
+ { 0x73B7, 7027 },
+ { 0x73B8, 7031 },
+ { 0x73B9, 7079 },
+ { 0x73BA, 7067 },
+ { 0x73BB, 7071 },
+ { 0x73BC, 7047 },
+ { 0x73BD, 7051 },
+ { 0x73BE, 7019 },
+ { 0x73BF, 7055 },
+ { 0x73C0, 7083 },
+ { 0x73C1, 7087 },
+ { 0x73C2, 7091 },
+ { 0x73C3, 6999 },
+ { 0x73C8, 7111 },
+ { 0x73C9, 7119 },
+ { 0x73CA, 7123 },
+ { 0x73CB, 7127 },
+ { 0x73CC, 7107 },
+ { 0x73CD, 7115 },
+ { 0x73CE, 7099 },
+ { 0x73CF, 7103 },
+ { 0x73D0, 7131 },
+ { 0x73D1, 7135 },
+ { 0x73D2, 7143 },
+ { 0x73D3, 7139 },
+ { 0x73D4, 7147 },
+ { 0x73D5, 7151 },
+ { 0x7400, 40249 },
+ { 0x7401, 40244 },
+ { 0x7402, 40239 },
+ { 0x7403, 40259 },
+ { 0x7404, 40254 },
+ { 0x7405, 40264 },
+ { 0x7406, 40287 },
+ { 0x7407, 40282 },
+ { 0x7408, 40277 },
+ { 0x7409, 40297 },
+ { 0x740A, 40292 },
+ { 0x740B, 40302 },
+ { 0x740C, 40139 },
+ { 0x740D, 40175 },
+ { 0x740E, 40179 },
+ { 0x740F, 40227 },
+ { 0x7410, 40135 },
+ { 0x7411, 40215 },
+ { 0x7412, 40183 },
+ { 0x7413, 40219 },
+ { 0x7414, 40187 },
+ { 0x7415, 40235 },
+ { 0x7416, 40207 },
+ { 0x7417, 40211 },
+ { 0x7418, 40203 },
+ { 0x7419, 40143 },
+ { 0x741A, 40223 },
+ { 0x741B, 40199 },
+ { 0x741C, 40269 },
+ { 0x741D, 40163 },
+ { 0x741E, 40231 },
+ { 0x741F, 40195 },
+ { 0x7420, 40273 },
+ { 0x7421, 40159 },
+ { 0x7422, 40147 },
+ { 0x7423, 40151 },
+ { 0x7424, 40155 },
+ { 0x7425, 40191 },
+ { 0x7426, 40171 },
+ { 0x7427, 40167 },
+ { 0x7428, 40077 },
+ { 0x7429, 40072 },
+ { 0x742A, 40067 },
+ { 0x742B, 40087 },
+ { 0x742C, 40082 },
+ { 0x742D, 40092 },
+ { 0x742E, 40115 },
+ { 0x742F, 40110 },
+ { 0x7430, 40105 },
+ { 0x7431, 40125 },
+ { 0x7432, 40120 },
+ { 0x7433, 40130 },
+ { 0x7434, 39967 },
+ { 0x7435, 40003 },
+ { 0x7436, 40007 },
+ { 0x7437, 40055 },
+ { 0x7438, 39963 },
+ { 0x7439, 40043 },
+ { 0x743A, 40011 },
+ { 0x743B, 40047 },
+ { 0x743C, 40015 },
+ { 0x743D, 40063 },
+ { 0x743E, 40035 },
+ { 0x743F, 40039 },
+ { 0x7440, 40031 },
+ { 0x7441, 39971 },
+ { 0x7442, 40051 },
+ { 0x7443, 40027 },
+ { 0x7444, 40097 },
+ { 0x7445, 39991 },
+ { 0x7446, 40059 },
+ { 0x7447, 40023 },
+ { 0x7448, 40101 },
+ { 0x7449, 39987 },
+ { 0x744A, 39975 },
+ { 0x744B, 39979 },
+ { 0x744C, 39983 },
+ { 0x744D, 40019 },
+ { 0x744E, 39999 },
+ { 0x744F, 39995 },
+ { 0x7450, 43139 },
+ { 0x7451, 43103 },
+ { 0x7452, 43127 },
+ { 0x7453, 43079 },
+ { 0x7454, 43163 },
+ { 0x7455, 43040 },
+ { 0x7456, 43145 },
+ { 0x7457, 43166 },
+ { 0x7458, 43112 },
+ { 0x7459, 43124 },
+ { 0x745A, 43064 },
+ { 0x745B, 43121 },
+ { 0x745C, 43082 },
+ { 0x745D, 43106 },
+ { 0x745E, 43148 },
+ { 0x745F, 43118 },
+ { 0x7460, 43169 },
+ { 0x7461, 43160 },
+ { 0x7462, 43109 },
+ { 0x7463, 43157 },
+ { 0x7464, 43130 },
+ { 0x7465, 43133 },
+ { 0x7466, 43031 },
+ { 0x7467, 43073 },
+ { 0x7468, 43058 },
+ { 0x7469, 43046 },
+ { 0x746A, 43034 },
+ { 0x746B, 43151 },
+ { 0x746C, 43100 },
+ { 0x746D, 43028 },
+ { 0x746E, 43142 },
+ { 0x746F, 43091 },
+ { 0x7470, 43070 },
+ { 0x7471, 43049 },
+ { 0x7472, 43088 },
+ { 0x7473, 43043 },
+ { 0x7474, 43094 },
+ { 0x7475, 43136 },
+ { 0x7476, 43097 },
+ { 0x7477, 43061 },
+ { 0x7478, 43055 },
+ { 0x7479, 43037 },
+ { 0x747A, 43052 },
+ { 0x747B, 43076 },
+ { 0x747C, 43154 },
+ { 0x747D, 43067 },
+ { 0x747E, 43085 },
+ { 0x747F, 43115 },
+ { 0x7480, 42944 },
+ { 0x7481, 42899 },
+ { 0x7482, 42926 },
+ { 0x7483, 42914 },
+ { 0x7484, 42929 },
+ { 0x7485, 42938 },
+ { 0x7486, 42950 },
+ { 0x7487, 42920 },
+ { 0x7488, 42923 },
+ { 0x7489, 42968 },
+ { 0x748A, 42935 },
+ { 0x748B, 42947 },
+ { 0x748C, 42908 },
+ { 0x748D, 42905 },
+ { 0x748E, 42965 },
+ { 0x748F, 42953 },
+ { 0x7490, 42956 },
+ { 0x7491, 42959 },
+ { 0x7492, 42962 },
+ { 0x7493, 42941 },
+ { 0x7494, 42911 },
+ { 0x7495, 42932 },
+ { 0x7496, 42881 },
+ { 0x7497, 42884 },
+ { 0x7498, 42887 },
+ { 0x7499, 42890 },
+ { 0x749A, 42893 },
+ { 0x749B, 42896 },
+ { 0x749C, 42902 },
+ { 0x749D, 42917 },
+ { 0x74A0, 42869 },
+ { 0x74A1, 42851 },
+ { 0x74A2, 42857 },
+ { 0x74A3, 42878 },
+ { 0x74A4, 42863 },
+ { 0x74A5, 42860 },
+ { 0x74A6, 42854 },
+ { 0x74A7, 42875 },
+ { 0x74A8, 42872 },
+ { 0x74A9, 42866 },
+ { 0x7800, 39794 },
+ { 0x7801, 39797 },
+ { 0x7802, 39800 },
+ { 0x7803, 39803 },
+ { 0x7804, 39806 },
+ { 0x7805, 39809 },
+ { 0x7808, 39812 },
+ { 0x780A, 39815 },
+ { 0x780B, 39818 },
+ { 0x780C, 39821 },
+ { 0x780D, 39824 },
+ { 0x780E, 39827 },
+ { 0x780F, 39830 },
+ { 0x7810, 39833 },
+ { 0x7811, 39836 },
+ { 0x7812, 39839 },
+ { 0x7813, 39842 },
+ { 0x7814, 39845 },
+ { 0x7815, 39848 },
+ { 0x7816, 39851 },
+ { 0x7817, 39854 },
+ { 0x7818, 39857 },
+ { 0x7819, 39860 },
+ { 0x781A, 39863 },
+ { 0x781B, 39866 },
+ { 0x781C, 39869 },
+ { 0x781D, 39872 },
+ { 0x781E, 39875 },
+ { 0x781F, 39878 },
+ { 0x7820, 39881 },
+ { 0x7821, 39884 },
+ { 0x7822, 39887 },
+ { 0x7823, 39890 },
+ { 0x7824, 39893 },
+ { 0x7825, 39896 },
+ { 0x7826, 39899 },
+ { 0x7827, 39902 },
+ { 0x7828, 39905 },
+ { 0x7829, 39908 },
+ { 0x782A, 39911 },
+ { 0x782B, 39914 },
+ { 0x782C, 39917 },
+ { 0x782D, 39920 },
+ { 0x782E, 39923 },
+ { 0x782F, 39926 },
+ { 0x7830, 39929 },
+ { 0x7831, 39932 },
+ { 0x7832, 39935 },
+ { 0x7833, 39938 },
+ { 0x7834, 39941 },
+ { 0x7835, 39944 },
+ { 0x7837, 39947 },
+ { 0x7838, 39950 },
+ { 0x783C, 39953 },
+ { 0x783F, 39956 },
+ { 0x7900, 67899 },
+ { 0x7901, 67902 },
+ { 0x7902, 67938 },
+ { 0x7903, 67935 },
+ { 0x7904, 67890 },
+ { 0x7905, 67926 },
+ { 0x7906, 67932 },
+ { 0x7907, 67905 },
+ { 0x7908, 67923 },
+ { 0x7909, 67929 },
+ { 0x790A, 67908 },
+ { 0x790B, 67941 },
+ { 0x790C, 67911 },
+ { 0x790D, 67914 },
+ { 0x790E, 67950 },
+ { 0x790F, 67896 },
+ { 0x7910, 67893 },
+ { 0x7911, 67947 },
+ { 0x7912, 67917 },
+ { 0x7913, 67944 },
+ { 0x7914, 67953 },
+ { 0x7915, 67920 },
+ { 0x7916, 67956 },
+ { 0x7917, 67963 },
+ { 0x7918, 67966 },
+ { 0x7919, 67959 },
+ { 0x791F, 67887 },
+ { 0x7920, 35432 },
+ { 0x7921, 35435 },
+ { 0x7922, 35450 },
+ { 0x7923, 35441 },
+ { 0x7924, 35444 },
+ { 0x7925, 35486 },
+ { 0x7926, 35453 },
+ { 0x7927, 35489 },
+ { 0x7928, 35456 },
+ { 0x7929, 35459 },
+ { 0x792A, 35462 },
+ { 0x792B, 35465 },
+ { 0x792C, 35468 },
+ { 0x792D, 35474 },
+ { 0x792E, 35504 },
+ { 0x792F, 35480 },
+ { 0x7930, 35483 },
+ { 0x7931, 35447 },
+ { 0x7932, 35471 },
+ { 0x7933, 35477 },
+ { 0x7934, 35507 },
+ { 0x7935, 35492 },
+ { 0x7936, 35495 },
+ { 0x7937, 35498 },
+ { 0x7938, 35501 },
+ { 0x7939, 35438 },
+ { 0x793F, 35510 },
+ { 0x7A00, 67726 },
+ { 0x7A01, 67705 },
+ { 0x7A02, 67713 },
+ { 0x7A03, 67717 },
+ { 0x7A05, 67701 },
+ { 0x7A06, 67709 },
+ { 0x7A0C, 67722 },
+ { 0x7A0D, 67678 },
+ { 0x7A0E, 67686 },
+ { 0x7A0F, 67683 },
+ { 0x7A10, 67747 },
+ { 0x7A11, 67795 },
+ { 0x7A12, 67738 },
+ { 0x7A13, 67792 },
+ { 0x7A15, 67732 },
+ { 0x7A16, 67783 },
+ { 0x7A17, 67744 },
+ { 0x7A19, 67804 },
+ { 0x7A1A, 67819 },
+ { 0x7A1B, 67825 },
+ { 0x7A1C, 67786 },
+ { 0x7A1D, 67822 },
+ { 0x7A1E, 67801 },
+ { 0x7A1F, 67768 },
+ { 0x7A20, 67816 },
+ { 0x7A21, 67735 },
+ { 0x7A22, 67789 },
+ { 0x7A23, 67756 },
+ { 0x7A24, 67759 },
+ { 0x7A25, 67807 },
+ { 0x7A26, 67729 },
+ { 0x7A27, 67780 },
+ { 0x7A28, 67753 },
+ { 0x7A29, 67774 },
+ { 0x7A2A, 67762 },
+ { 0x7A2B, 67750 },
+ { 0x7A2C, 67771 },
+ { 0x7A2D, 67810 },
+ { 0x7A2E, 67813 },
+ { 0x7A2F, 67765 },
+ { 0x7A30, 67777 },
+ { 0x7A31, 67741 },
+ { 0x7A32, 67798 },
+ { 0x7A33, 67828 },
+ { 0x7A38, 67667 },
+ { 0x7A39, 67675 },
+ { 0x7A3A, 67671 },
+ { 0x7A3F, 67845 },
+ { 0x7A40, 67689 },
+ { 0x7A41, 67692 },
+ { 0x7A42, 67698 },
+ { 0x7A43, 67695 },
+ { 0x7A44, 67839 },
+ { 0x7A45, 67842 },
+ { 0x7A46, 67831 },
+ { 0x7A47, 67835 },
+ { 0x7A50, 67847 },
+ { 0x7A51, 67859 },
+ { 0x7A52, 67863 },
+ { 0x7A53, 67870 },
+ { 0x7A54, 67874 },
+ { 0x7A55, 67856 },
+ { 0x7A56, 67850 },
+ { 0x7A57, 67866 },
+ { 0x7A58, 67853 },
+ { 0x8000, 58351 },
+ { 0x8001, 58354 },
+ { 0x8002, 58364 },
+ { 0x8003, 58379 },
+ { 0x8004, 58359 },
+ { 0x8005, 58369 },
+ { 0x8006, 58390 },
+ { 0x8007, 58385 },
+ { 0x8008, 58374 },
+ { 0x8009, 58460 },
+ { 0x800A, 58463 },
+ { 0x800B, 58495 },
+ { 0x800C, 58500 },
+ { 0x800D, 58484 },
+ { 0x800E, 58506 },
+ { 0x800F, 58479 },
+ { 0x8010, 58489 },
+ { 0x8011, 58512 },
+ { 0x8012, 58517 },
+ { 0x8013, 58522 },
+ { 0x8014, 58470 },
+ { 0x8015, 58466 },
+ { 0x8016, 59529 },
+ { 0x8017, 59555 },
+ { 0x8018, 59539 },
+ { 0x8019, 59532 },
+ { 0x801A, 59545 },
+ { 0x801B, 59550 },
+ { 0x801C, 58527 },
+ { 0x801D, 58530 },
+ { 0x801E, 58533 },
+ { 0x801F, 58538 },
+ { 0x8020, 58545 },
+ { 0x8021, 58548 },
+ { 0x8022, 58573 },
+ { 0x8023, 58578 },
+ { 0x8024, 58553 },
+ { 0x8025, 58583 },
+ { 0x8026, 58558 },
+ { 0x8027, 58563 },
+ { 0x8028, 58568 },
+ { 0x8029, 61180 },
+ { 0x802A, 61793 },
+ { 0x802B, 61183 },
+ { 0x802C, 61186 },
+ { 0x802D, 58588 },
+ { 0x802E, 58591 },
+ { 0x802F, 58611 },
+ { 0x8030, 58602 },
+ { 0x8031, 58596 },
+ { 0x8032, 61796 },
+ { 0x8033, 61191 },
+ { 0x8034, 61194 },
+ { 0x8035, 61197 },
+ { 0x8036, 61799 },
+ { 0x8037, 61802 },
+ { 0x8038, 59560 },
+ { 0x8039, 59600 },
+ { 0x803A, 59563 },
+ { 0x803B, 59588 },
+ { 0x803C, 59568 },
+ { 0x803D, 59575 },
+ { 0x803E, 61202 },
+ { 0x803F, 62374 },
+ { 0x8040, 58616 },
+ { 0x8041, 59605 },
+ { 0x8042, 61205 },
+ { 0x8043, 62377 },
+ { 0x8044, 59608 },
+ { 0x8045, 59611 },
+ { 0x8046, 61805 },
+ { 0x8047, 59616 },
+ { 0x8048, 61808 },
+ { 0x8049, 58619 },
+ { 0x804A, 58622 },
+ { 0x804B, 58627 },
+ { 0x804C, 58632 },
+ { 0x804D, 58638 },
+ { 0x804E, 58641 },
+ { 0x804F, 58647 },
+ { 0x8050, 58653 },
+ { 0x8051, 61811 },
+ { 0x8052, 61814 },
+ { 0x8053, 59619 },
+ { 0x8054, 61208 },
+ { 0x8055, 58658 },
+ { 0x8056, 59622 },
+ { 0x8057, 59625 },
+ { 0x8058, 59751 },
+ { 0x8059, 59769 },
+ { 0x805A, 59633 },
+ { 0x805B, 59639 },
+ { 0x805C, 59645 },
+ { 0x805D, 59653 },
+ { 0x805E, 59757 },
+ { 0x805F, 59719 },
+ { 0x8060, 59659 },
+ { 0x8061, 59665 },
+ { 0x8062, 59671 },
+ { 0x8063, 59725 },
+ { 0x8064, 59679 },
+ { 0x8065, 59685 },
+ { 0x8066, 59691 },
+ { 0x8067, 59731 },
+ { 0x8068, 59699 },
+ { 0x8069, 59737 },
+ { 0x806A, 59705 },
+ { 0x806B, 59763 },
+ { 0x806C, 59711 },
+ { 0x806D, 59745 },
+ { 0x806E, 59775 },
+ { 0x806F, 59778 },
+ { 0x8070, 61819 },
+ { 0x8071, 61822 },
+ { 0x8072, 58661 },
+ { 0x8073, 59781 },
+ { 0x8074, 59784 },
+ { 0x8075, 59787 },
+ { 0x8076, 61211 },
+ { 0x8077, 59792 },
+ { 0x8078, 59795 },
+ { 0x8079, 61214 },
+ { 0x807A, 58664 },
+ { 0x807B, 58671 },
+ { 0x807C, 58667 },
+ { 0x807D, 58676 },
+ { 0x807E, 59802 },
+ { 0x807F, 59805 },
+ { 0x8080, 61217 },
+ { 0x8081, 59810 },
+ { 0x8082, 61825 },
+ { 0x8083, 59813 },
+ { 0x8084, 59816 },
+ { 0x8085, 61220 },
+ { 0x8086, 61223 },
+ { 0x8087, 61227 },
+ { 0x8088, 61232 },
+ { 0x8089, 61235 },
+ { 0x808A, 58396 },
+ { 0x808B, 58407 },
+ { 0x808C, 58399 },
+ { 0x808D, 58680 },
+ { 0x808E, 58683 },
+ { 0x808F, 58702 },
+ { 0x8090, 58697 },
+ { 0x8091, 58707 },
+ { 0x8092, 58712 },
+ { 0x8093, 58692 },
+ { 0x8094, 61238 },
+ { 0x8095, 61241 },
+ { 0x8096, 58717 },
+ { 0x8097, 58720 },
+ { 0x8098, 58728 },
+ { 0x8099, 58733 },
+ { 0x809A, 58723 },
+ { 0x809B, 58743 },
+ { 0x809C, 58748 },
+ { 0x809D, 58739 },
+ { 0x809E, 61244 },
+ { 0x809F, 61828 },
+ { 0x80A0, 61247 },
+ { 0x80A1, 61250 },
+ { 0x80A2, 61253 },
+ { 0x80A3, 61258 },
+ { 0x80A4, 61265 },
+ { 0x80A5, 61274 },
+ { 0x80A6, 61315 },
+ { 0x80A7, 61338 },
+ { 0x80A8, 61344 },
+ { 0x80A9, 61279 },
+ { 0x80AA, 61284 },
+ { 0x80AB, 61320 },
+ { 0x80AC, 61351 },
+ { 0x80AD, 61356 },
+ { 0x80AE, 61326 },
+ { 0x80AF, 61290 },
+ { 0x80B0, 61331 },
+ { 0x80B1, 61295 },
+ { 0x80B2, 61300 },
+ { 0x80B3, 61305 },
+ { 0x80B4, 61310 },
+ { 0x80B5, 58753 },
+ { 0x80B6, 58756 },
+ { 0x80B7, 59819 },
+ { 0x80B8, 59827 },
+ { 0x80B9, 59836 },
+ { 0x80BA, 59843 },
+ { 0x80BB, 59950 },
+ { 0x80BC, 59855 },
+ { 0x80BD, 59958 },
+ { 0x80BE, 60106 },
+ { 0x80BF, 59963 },
+ { 0x80C0, 59968 },
+ { 0x80C1, 59975 },
+ { 0x80C2, 59980 },
+ { 0x80C3, 59860 },
+ { 0x80C4, 59865 },
+ { 0x80C5, 59987 },
+ { 0x80C6, 59994 },
+ { 0x80C7, 59870 },
+ { 0x80C8, 59875 },
+ { 0x80C9, 59882 },
+ { 0x80CA, 59887 },
+ { 0x80CB, 60113 },
+ { 0x80CC, 59999 },
+ { 0x80CD, 59895 },
+ { 0x80CE, 60004 },
+ { 0x80CF, 60009 },
+ { 0x80D0, 60119 },
+ { 0x80D1, 59900 },
+ { 0x80D2, 60016 },
+ { 0x80D3, 60021 },
+ { 0x80D4, 59909 },
+ { 0x80D5, 60126 },
+ { 0x80D6, 60028 },
+ { 0x80D7, 60034 },
+ { 0x80D8, 60043 },
+ { 0x80D9, 60141 },
+ { 0x80DA, 60048 },
+ { 0x80DB, 60053 },
+ { 0x80DC, 60060 },
+ { 0x80DD, 59916 },
+ { 0x80DE, 59921 },
+ { 0x80DF, 59928 },
+ { 0x80E0, 60067 },
+ { 0x80E1, 60072 },
+ { 0x80E2, 59933 },
+ { 0x80E3, 60079 },
+ { 0x80E4, 60084 },
+ { 0x80E5, 60089 },
+ { 0x80E6, 60094 },
+ { 0x80E7, 60131 },
+ { 0x80E8, 60101 },
+ { 0x80E9, 60136 },
+ { 0x80EA, 59850 },
+ { 0x80EB, 59938 },
+ { 0x80EC, 59943 },
+ { 0x80ED, 59822 },
+ { 0x80EE, 61362 },
+ { 0x80EF, 61365 },
+ { 0x80F0, 60146 },
+ { 0x80F1, 60149 },
+ { 0x80F2, 60157 },
+ { 0x80F3, 60160 },
+ { 0x80F4, 61831 },
+ { 0x80F5, 60169 },
+ { 0x80F6, 60172 },
+ { 0x80F7, 61370 },
+ { 0x80F8, 61378 },
+ { 0x80F9, 61373 },
+ { 0x80FA, 61382 },
+ { 0x80FB, 60175 },
+ { 0x80FC, 61387 },
+ { 0x80FD, 62380 },
+ { 0x80FE, 62539 },
+ { 0x80FF, 62542 },
+ { 0x8100, 58760 },
+ { 0x8101, 58763 },
+ { 0x8102, 58768 },
+ { 0x8103, 58773 },
+ { 0x8104, 60178 },
+ { 0x8105, 60181 },
+ { 0x8106, 60186 },
+ { 0x8107, 61834 },
+ { 0x8108, 61390 },
+ { 0x8109, 61393 },
+ { 0x810A, 61397 },
+ { 0x810B, 61400 },
+ { 0x810C, 61424 },
+ { 0x810D, 61419 },
+ { 0x810E, 61407 },
+ { 0x810F, 61414 },
+ { 0x8110, 61837 },
+ { 0x8111, 61430 },
+ { 0x8112, 61447 },
+ { 0x8113, 61437 },
+ { 0x8114, 61442 },
+ { 0x8115, 61433 },
+ { 0x8116, 58778 },
+ { 0x8117, 58781 },
+ { 0x8118, 60191 },
+ { 0x8119, 60198 },
+ { 0x811A, 60203 },
+ { 0x811B, 60211 },
+ { 0x811C, 60216 },
+ { 0x811D, 60194 },
+ { 0x811E, 60223 },
+ { 0x811F, 60232 },
+ { 0x8120, 60239 },
+ { 0x8121, 60226 },
+ { 0x8122, 60244 },
+ { 0x8123, 60247 },
+ { 0x8124, 60250 },
+ { 0x8125, 60255 },
+ { 0x8126, 61452 },
+ { 0x8127, 61840 },
+ { 0x8128, 62383 },
+ { 0x8129, 58786 },
+ { 0x812A, 58793 },
+ { 0x812B, 58789 },
+ { 0x812C, 60258 },
+ { 0x812D, 58797 },
+ { 0x812E, 58805 },
+ { 0x812F, 58835 },
+ { 0x8130, 58810 },
+ { 0x8131, 58840 },
+ { 0x8132, 58815 },
+ { 0x8133, 58820 },
+ { 0x8134, 58825 },
+ { 0x8135, 58830 },
+ { 0x8136, 58800 },
+ { 0x8137, 58845 },
+ { 0x8138, 61455 },
+ { 0x8139, 61458 },
+ { 0x813A, 61468 },
+ { 0x813B, 61478 },
+ { 0x813C, 61473 },
+ { 0x813D, 61463 },
+ { 0x813E, 61483 },
+ { 0x813F, 58412 },
+ { 0x8140, 58415 },
+ { 0x8141, 58848 },
+ { 0x8142, 61486 },
+ { 0x8143, 61489 },
+ { 0x8144, 61495 },
+ { 0x8145, 58851 },
+ { 0x8146, 60261 },
+ { 0x8147, 60268 },
+ { 0x8148, 60264 },
+ { 0x8149, 60276 },
+ { 0x814A, 60272 },
+ { 0x814B, 58854 },
+ { 0x814C, 58857 },
+ { 0x814D, 60287 },
+ { 0x814E, 58863 },
+ { 0x814F, 58866 },
+ { 0x8150, 58875 },
+ { 0x8151, 58880 },
+ { 0x8152, 58871 },
+ { 0x8153, 61501 },
+ { 0x8154, 58885 },
+ { 0x8155, 58888 },
+ { 0x8156, 60290 },
+ { 0x8157, 58891 },
+ { 0x8158, 58894 },
+ { 0x8159, 58904 },
+ { 0x815A, 58909 },
+ { 0x815B, 59113 },
+ { 0x815C, 59029 },
+ { 0x815D, 59165 },
+ { 0x815E, 59034 },
+ { 0x815F, 58916 },
+ { 0x8160, 59170 },
+ { 0x8161, 59118 },
+ { 0x8162, 58921 },
+ { 0x8163, 59039 },
+ { 0x8164, 59123 },
+ { 0x8165, 59044 },
+ { 0x8166, 59049 },
+ { 0x8167, 58926 },
+ { 0x8168, 59129 },
+ { 0x8169, 59134 },
+ { 0x816A, 59141 },
+ { 0x816B, 58931 },
+ { 0x816C, 59148 },
+ { 0x816D, 59058 },
+ { 0x816E, 58936 },
+ { 0x816F, 59063 },
+ { 0x8170, 58941 },
+ { 0x8171, 59068 },
+ { 0x8172, 58946 },
+ { 0x8173, 58951 },
+ { 0x8174, 58956 },
+ { 0x8175, 58961 },
+ { 0x8176, 58968 },
+ { 0x8177, 58975 },
+ { 0x8178, 58982 },
+ { 0x8179, 58987 },
+ { 0x817A, 58994 },
+ { 0x817B, 59073 },
+ { 0x817C, 58999 },
+ { 0x817D, 59004 },
+ { 0x817E, 59009 },
+ { 0x817F, 59078 },
+ { 0x8180, 59083 },
+ { 0x8181, 59088 },
+ { 0x8182, 59153 },
+ { 0x8183, 59093 },
+ { 0x8184, 59098 },
+ { 0x8185, 59175 },
+ { 0x8186, 59103 },
+ { 0x8187, 58899 },
+ { 0x8188, 59014 },
+ { 0x8189, 59019 },
+ { 0x818A, 59158 },
+ { 0x818B, 59108 },
+ { 0x818C, 59024 },
+ { 0x818D, 60293 },
+ { 0x818E, 60296 },
+ { 0x818F, 60301 },
+ { 0x8190, 61504 },
+ { 0x8191, 61507 },
+ { 0x8192, 61510 },
+ { 0x8193, 61513 },
+ { 0x8194, 61516 },
+ { 0x8195, 60304 },
+ { 0x8196, 60307 },
+ { 0x8197, 60313 },
+ { 0x8198, 60316 },
+ { 0x8199, 60321 },
+ { 0x819A, 61521 },
+ { 0x819B, 61524 },
+ { 0x819C, 62386 },
+ { 0x819D, 62401 },
+ { 0x819E, 62389 },
+ { 0x819F, 61843 },
+ { 0x81A0, 59180 },
+ { 0x81A1, 59193 },
+ { 0x81A2, 59183 },
+ { 0x81A3, 59188 },
+ { 0x81A4, 60326 },
+ { 0x81A5, 60329 },
+ { 0x81A6, 61846 },
+ { 0x81A7, 61527 },
+ { 0x81A8, 62411 },
+ { 0x81A9, 62414 },
+ { 0x81AA, 59198 },
+ { 0x81AB, 59201 },
+ { 0x81AC, 60332 },
+ { 0x81AD, 60335 },
+ { 0x81AE, 60338 },
+ { 0x81AF, 60343 },
+ { 0x81B0, 60346 },
+ { 0x81B1, 60349 },
+ { 0x81B2, 60353 },
+ { 0x81B3, 60356 },
+ { 0x81B4, 60359 },
+ { 0x81B5, 62419 },
+ { 0x81B6, 62422 },
+ { 0x81B7, 59213 },
+ { 0x81B8, 61849 },
+ { 0x81B9, 61852 },
+ { 0x81BA, 61857 },
+ { 0x81BB, 61866 },
+ { 0x81BC, 61873 },
+ { 0x81BD, 61901 },
+ { 0x81BE, 61906 },
+ { 0x81BF, 62007 },
+ { 0x81C0, 62014 },
+ { 0x81C1, 61911 },
+ { 0x81C2, 62019 },
+ { 0x81C3, 61916 },
+ { 0x81C4, 61921 },
+ { 0x81C5, 62024 },
+ { 0x81C6, 62029 },
+ { 0x81C7, 62034 },
+ { 0x81C8, 61926 },
+ { 0x81C9, 62041 },
+ { 0x81CA, 61931 },
+ { 0x81CB, 62046 },
+ { 0x81CC, 61938 },
+ { 0x81CD, 61943 },
+ { 0x81CE, 61950 },
+ { 0x81CF, 61957 },
+ { 0x81D0, 62052 },
+ { 0x81D1, 62057 },
+ { 0x81D2, 62062 },
+ { 0x81D3, 62067 },
+ { 0x81D4, 62130 },
+ { 0x81D5, 62103 },
+ { 0x81D6, 61962 },
+ { 0x81D7, 62076 },
+ { 0x81D8, 61967 },
+ { 0x81D9, 61972 },
+ { 0x81DA, 62108 },
+ { 0x81DB, 61979 },
+ { 0x81DC, 62081 },
+ { 0x81DD, 62135 },
+ { 0x81DE, 62144 },
+ { 0x81DF, 62113 },
+ { 0x81E0, 62118 },
+ { 0x81E1, 62088 },
+ { 0x81E2, 62093 },
+ { 0x81E3, 62125 },
+ { 0x81E4, 61984 },
+ { 0x81E5, 61880 },
+ { 0x81E6, 61885 },
+ { 0x81E7, 61892 },
+ { 0x81E8, 61995 },
+ { 0x81E9, 62002 },
+ { 0x81EA, 62098 },
+ { 0x81EB, 62152 },
+ { 0x81EC, 62156 },
+ { 0x81ED, 62171 },
+ { 0x81EE, 62176 },
+ { 0x81EF, 62159 },
+ { 0x81F0, 62163 },
+ { 0x81F1, 62425 },
+ { 0x81F2, 60364 },
+ { 0x81F3, 60367 },
+ { 0x81F4, 60372 },
+ { 0x81F5, 60375 },
+ { 0x81F6, 60380 },
+ { 0x81F7, 59216 },
+ { 0x81F8, 60387 },
+ { 0x81F9, 62428 },
+ { 0x81FA, 61530 },
+ { 0x81FB, 59219 },
+ { 0x81FC, 59222 },
+ { 0x81FD, 60390 },
+ { 0x81FE, 60397 },
+ { 0x81FF, 60450 },
+ { 0x8200, 60455 },
+ { 0x8201, 60460 },
+ { 0x8202, 60466 },
+ { 0x8203, 60402 },
+ { 0x8204, 60409 },
+ { 0x8205, 60472 },
+ { 0x8206, 60477 },
+ { 0x8207, 60482 },
+ { 0x8208, 60414 },
+ { 0x8209, 60419 },
+ { 0x820A, 60501 },
+ { 0x820B, 60426 },
+ { 0x820C, 60433 },
+ { 0x820D, 60438 },
+ { 0x820E, 60443 },
+ { 0x820F, 60489 },
+ { 0x8210, 60496 },
+ { 0x8211, 60393 },
+ { 0x8212, 60514 },
+ { 0x8213, 60519 },
+ { 0x8214, 60510 },
+ { 0x8215, 60506 },
+ { 0x8216, 60524 },
+ { 0x8217, 62183 },
+ { 0x8218, 62186 },
+ { 0x8219, 62195 },
+ { 0x821A, 62191 },
+ { 0x821B, 60527 },
+ { 0x821C, 60530 },
+ { 0x821D, 60533 },
+ { 0x821E, 60536 },
+ { 0x821F, 60541 },
+ { 0x8220, 59227 },
+ { 0x8221, 59234 },
+ { 0x8222, 59230 },
+ { 0x8223, 60549 },
+ { 0x8224, 60552 },
+ { 0x8225, 60555 },
+ { 0x8226, 61533 },
+ { 0x8227, 62200 },
+ { 0x8228, 59239 },
+ { 0x8229, 60558 },
+ { 0x822A, 59242 },
+ { 0x822B, 60561 },
+ { 0x822C, 59245 },
+ { 0x822D, 59248 },
+ { 0x822E, 60564 },
+ { 0x822F, 60567 },
+ { 0x8230, 62431 },
+ { 0x8231, 62434 },
+ { 0x8232, 61536 },
+ { 0x8233, 61553 },
+ { 0x8234, 61563 },
+ { 0x8235, 61558 },
+ { 0x8236, 61539 },
+ { 0x8237, 61544 },
+ { 0x8238, 61568 },
+ { 0x8239, 62203 },
+ { 0x823A, 62210 },
+ { 0x823B, 62215 },
+ { 0x823C, 62222 },
+ { 0x823D, 62206 },
+ { 0x823E, 59253 },
+ { 0x823F, 60571 },
+ { 0x8240, 61573 },
+ { 0x8241, 61582 },
+ { 0x8242, 61576 },
+ { 0x8243, 61586 },
+ { 0x8244, 62227 },
+ { 0x8245, 60577 },
+ { 0x8246, 60574 },
+ { 0x8247, 61591 },
+ { 0x8248, 59256 },
+ { 0x8249, 59259 },
+ { 0x824A, 59264 },
+ { 0x824B, 59269 },
+ { 0x824C, 59273 },
+ { 0x824D, 59276 },
+ { 0x824E, 60581 },
+ { 0x824F, 60584 },
+ { 0x8250, 60595 },
+ { 0x8251, 60587 },
+ { 0x8252, 62437 },
+ { 0x8253, 62440 },
+ { 0x8254, 62465 },
+ { 0x8255, 62470 },
+ { 0x8256, 62477 },
+ { 0x8257, 62445 },
+ { 0x8258, 62453 },
+ { 0x8259, 62482 },
+ { 0x825A, 62487 },
+ { 0x825B, 62492 },
+ { 0x825C, 62500 },
+ { 0x825D, 62507 },
+ { 0x825E, 62458 },
+ { 0x825F, 62516 },
+ { 0x8260, 62230 },
+ { 0x8261, 59281 },
+ { 0x8262, 61594 },
+ { 0x8263, 60601 },
+ { 0x8264, 60613 },
+ { 0x8265, 60642 },
+ { 0x8266, 60619 },
+ { 0x8267, 60625 },
+ { 0x8268, 60636 },
+ { 0x8269, 60609 },
+ { 0x826A, 60604 },
+ { 0x826B, 60648 },
+ { 0x826C, 60653 },
+ { 0x826D, 62233 },
+ { 0x826E, 62291 },
+ { 0x826F, 62236 },
+ { 0x8270, 62260 },
+ { 0x8271, 62266 },
+ { 0x8272, 62272 },
+ { 0x8273, 62279 },
+ { 0x8274, 62242 },
+ { 0x8275, 62248 },
+ { 0x8276, 62285 },
+ { 0x8277, 62254 },
+ { 0x8278, 62297 },
+ { 0x8279, 62303 },
+ { 0x827A, 59284 },
+ { 0x827B, 60661 },
+ { 0x827C, 60664 },
+ { 0x827D, 60667 },
+ { 0x827E, 62310 },
+ { 0x827F, 59287 },
+ { 0x8280, 59290 },
+ { 0x8281, 59310 },
+ { 0x8282, 59315 },
+ { 0x8283, 59320 },
+ { 0x8284, 59295 },
+ { 0x8285, 59300 },
+ { 0x8286, 59325 },
+ { 0x8287, 59305 },
+ { 0x8288, 59330 },
+ { 0x8289, 59335 },
+ { 0x828A, 62313 },
+ { 0x828B, 62326 },
+ { 0x828C, 62316 },
+ { 0x828D, 62321 },
+ { 0x828E, 62331 },
+ { 0x828F, 59340 },
+ { 0x8290, 60670 },
+ { 0x8291, 59343 },
+ { 0x8292, 59346 },
+ { 0x8293, 59349 },
+ { 0x8294, 60770 },
+ { 0x8295, 60673 },
+ { 0x8296, 60685 },
+ { 0x8297, 60690 },
+ { 0x8298, 60725 },
+ { 0x8299, 60695 },
+ { 0x829A, 60730 },
+ { 0x829B, 60735 },
+ { 0x829C, 60740 },
+ { 0x829D, 60700 },
+ { 0x829E, 60745 },
+ { 0x829F, 60750 },
+ { 0x82A0, 60765 },
+ { 0x82A1, 60755 },
+ { 0x82A2, 60705 },
+ { 0x82A3, 60710 },
+ { 0x82A4, 60715 },
+ { 0x82A5, 60720 },
+ { 0x82A6, 60760 },
+ { 0x82A7, 60680 },
+ { 0x82A8, 60676 },
+ { 0x82A9, 60774 },
+ { 0x82AA, 60777 },
+ { 0x82AB, 62521 },
+ { 0x82AC, 60783 },
+ { 0x82AD, 60786 },
+ { 0x82AE, 61597 },
+ { 0x82AF, 61600 },
+ { 0x82B0, 61622 },
+ { 0x82B1, 61632 },
+ { 0x82B2, 61617 },
+ { 0x82B3, 61637 },
+ { 0x82B4, 61627 },
+ { 0x82B5, 61605 },
+ { 0x82B6, 61610 },
+ { 0x82B7, 61642 },
+ { 0x82B8, 62336 },
+ { 0x82B9, 62339 },
+ { 0x82BA, 60789 },
+ { 0x82BB, 60792 },
+ { 0x82BC, 60796 },
+ { 0x82BD, 60807 },
+ { 0x82BE, 62342 },
+ { 0x82BF, 61645 },
+ { 0x82C0, 62345 },
+ { 0x82C1, 62524 },
+ { 0x82C2, 62547 },
+ { 0x82C3, 61648 },
+ { 0x82C4, 61651 },
+ { 0x82C5, 61656 },
+ { 0x82C6, 61661 },
+ { 0x82C7, 61664 },
+ { 0x82C8, 61669 },
+ { 0x82C9, 61710 },
+ { 0x82CA, 61674 },
+ { 0x82CB, 61679 },
+ { 0x82CC, 61684 },
+ { 0x82CD, 61689 },
+ { 0x82CE, 61715 },
+ { 0x82CF, 61695 },
+ { 0x82D0, 61700 },
+ { 0x82D1, 61705 },
+ { 0x82D2, 62527 },
+ { 0x82D3, 61720 },
+ { 0x82D4, 61731 },
+ { 0x82D5, 61723 },
+ { 0x82D6, 62348 },
+ { 0x82D7, 60818 },
+ { 0x82D8, 60821 },
+ { 0x82D9, 61735 },
+ { 0x82DA, 62530 },
+ { 0x82DB, 59352 },
+ { 0x82DC, 59355 },
+ { 0x82DD, 60827 },
+ { 0x82DE, 61738 },
+ { 0x82DF, 61741 },
+ { 0x82E0, 61747 },
+ { 0x82E1, 62351 },
+ { 0x82E2, 59359 },
+ { 0x82E3, 59362 },
+ { 0x82E4, 60830 },
+ { 0x82E5, 61750 },
+ { 0x82E6, 62354 },
+ { 0x82E7, 60833 },
+ { 0x82E8, 62533 },
+ { 0x82E9, 60836 },
+ { 0x82EA, 61753 },
+ { 0x82EB, 59367 },
+ { 0x82EC, 59384 },
+ { 0x82ED, 59374 },
+ { 0x82EE, 59379 },
+ { 0x82EF, 59370 },
+ { 0x82F0, 60839 },
+ { 0x82F1, 60842 },
+ { 0x82F2, 60853 },
+ { 0x82F3, 60857 },
+ { 0x82F4, 60860 },
+ { 0x82F5, 60870 },
+ { 0x82F6, 60875 },
+ { 0x82F7, 60880 },
+ { 0x82F8, 60885 },
+ { 0x82F9, 60865 },
+ { 0x82FA, 61756 },
+ { 0x82FB, 60890 },
+ { 0x82FC, 59388 },
+ { 0x82FD, 59391 },
+ { 0x82FE, 59395 },
+ { 0x82FF, 59398 },
+ { 0x8300, 60893 },
+ { 0x8301, 60896 },
+ { 0x8302, 60915 },
+ { 0x8303, 60899 },
+ { 0x8304, 60904 },
+ { 0x8305, 59402 },
+ { 0x8306, 61759 },
+ { 0x8307, 60920 },
+ { 0x8308, 60923 },
+ { 0x8309, 60926 },
+ { 0x830A, 60929 },
+ { 0x830B, 58419 },
+ { 0x830C, 58427 },
+ { 0x830D, 58422 },
+ { 0x830E, 58441 },
+ { 0x830F, 58452 },
+ { 0x8310, 58431 },
+ { 0x8311, 59405 },
+ { 0x8312, 59408 },
+ { 0x8313, 59411 },
+ { 0x8314, 59447 },
+ { 0x8315, 59442 },
+ { 0x8316, 59437 },
+ { 0x8317, 59418 },
+ { 0x8318, 59427 },
+ { 0x8319, 59414 },
+ { 0x831A, 59451 },
+ { 0x831B, 59455 },
+ { 0x831C, 61762 },
+ { 0x831D, 59461 },
+ { 0x831E, 59481 },
+ { 0x831F, 59469 },
+ { 0x8320, 59476 },
+ { 0x8321, 59464 },
+ { 0x8322, 62357 },
+ { 0x8323, 61765 },
+ { 0x8324, 61773 },
+ { 0x8325, 61768 },
+ { 0x8326, 59486 },
+ { 0x8327, 59489 },
+ { 0x8328, 59493 },
+ { 0x8329, 59500 },
+ { 0x832A, 59496 },
+ { 0x832B, 60937 },
+ { 0x832C, 60940 },
+ { 0x832D, 60947 },
+ { 0x832E, 60954 },
+ { 0x832F, 60959 },
+ { 0x8330, 60983 },
+ { 0x8331, 60964 },
+ { 0x8332, 60976 },
+ { 0x8333, 60969 },
+ { 0x8334, 60988 },
+ { 0x8335, 60991 },
+ { 0x8336, 61778 },
+ { 0x8337, 60994 },
+ { 0x8338, 60997 },
+ { 0x8339, 61110 },
+ { 0x833A, 61049 },
+ { 0x833B, 61054 },
+ { 0x833C, 61009 },
+ { 0x833D, 61059 },
+ { 0x833E, 61094 },
+ { 0x833F, 61064 },
+ { 0x8340, 61014 },
+ { 0x8341, 61019 },
+ { 0x8342, 61069 },
+ { 0x8343, 61024 },
+ { 0x8344, 61074 },
+ { 0x8345, 61029 },
+ { 0x8346, 61079 },
+ { 0x8347, 61084 },
+ { 0x8348, 61034 },
+ { 0x8349, 61089 },
+ { 0x834A, 61100 },
+ { 0x834B, 61039 },
+ { 0x834C, 61002 },
+ { 0x834D, 61044 },
+ { 0x834E, 61105 },
+ { 0x834F, 62360 },
+ { 0x8350, 62363 },
+ { 0x8351, 61115 },
+ { 0x8352, 61118 },
+ { 0x8353, 61123 },
+ { 0x8354, 61128 },
+ { 0x8355, 61133 },
+ { 0x8356, 61784 },
+ { 0x8357, 61781 },
+ { 0x8358, 62536 },
+ { 0x8359, 62368 },
+ { 0x835A, 61138 },
+ { 0x835B, 61141 },
+ { 0x835C, 61146 },
+ { 0x835D, 59505 },
+ { 0x835E, 59508 },
+ { 0x835F, 59512 },
+ { 0x8360, 61149 },
+ { 0x8361, 61787 },
+ { 0x8362, 61152 },
+ { 0x8363, 59518 },
+ { 0x8364, 59521 },
+ { 0x8365, 61155 },
+ { 0x8366, 61158 },
+ { 0x8367, 61161 },
+ { 0x8368, 61166 },
+ { 0x8369, 61790 },
+ { 0x836A, 59526 },
+ { 0x836B, 61169 },
+ { 0x836C, 61172 },
+ { 0x836D, 62371 },
+ { 0x836E, 61177 },
+ { 0x8400, 62658 },
+ { 0x8401, 63027 },
+ { 0x8402, 62787 },
+ { 0x8403, 62723 },
+ { 0x8404, 62625 },
+ { 0x8405, 62968 },
+ { 0x8406, 62929 },
+ { 0x8407, 62875 },
+ { 0x8408, 63055 },
+ { 0x8409, 62815 },
+ { 0x840A, 62751 },
+ { 0x840B, 62636 },
+ { 0x840C, 62973 },
+ { 0x840D, 62934 },
+ { 0x840E, 62880 },
+ { 0x840F, 62782 },
+ { 0x8410, 62718 },
+ { 0x8411, 62620 },
+ { 0x8412, 62963 },
+ { 0x8413, 62924 },
+ { 0x8414, 62870 },
+ { 0x8415, 62579 },
+ { 0x8416, 62684 },
+ { 0x8417, 63060 },
+ { 0x8418, 62820 },
+ { 0x8419, 62756 },
+ { 0x841A, 62641 },
+ { 0x841B, 62978 },
+ { 0x841C, 62939 },
+ { 0x841D, 62885 },
+ { 0x841E, 62584 },
+ { 0x841F, 62689 },
+ { 0x8420, 63065 },
+ { 0x8421, 62825 },
+ { 0x8422, 62761 },
+ { 0x8423, 62694 },
+ { 0x8424, 63070 },
+ { 0x8425, 63075 },
+ { 0x8426, 62830 },
+ { 0x8427, 62766 },
+ { 0x8428, 62646 },
+ { 0x8429, 62983 },
+ { 0x842A, 62944 },
+ { 0x842B, 62890 },
+ { 0x842C, 62589 },
+ { 0x842D, 62699 },
+ { 0x842E, 63082 },
+ { 0x842F, 63087 },
+ { 0x8430, 62835 },
+ { 0x8431, 62771 },
+ { 0x8432, 63019 },
+ { 0x8433, 63011 },
+ { 0x8434, 62569 },
+ { 0x8435, 62674 },
+ { 0x8436, 63043 },
+ { 0x8437, 63048 },
+ { 0x8438, 62810 },
+ { 0x8439, 62746 },
+ { 0x843A, 63094 },
+ { 0x843B, 63101 },
+ { 0x843C, 62840 },
+ { 0x843D, 62863 },
+ { 0x843E, 62847 },
+ { 0x843F, 62855 },
+ { 0x8440, 62651 },
+ { 0x8441, 63004 },
+ { 0x8442, 62988 },
+ { 0x8443, 62996 },
+ { 0x8444, 62949 },
+ { 0x8445, 62956 },
+ { 0x8446, 62895 },
+ { 0x8447, 62910 },
+ { 0x8448, 62917 },
+ { 0x8449, 62902 },
+ { 0x844A, 62663 },
+ { 0x844B, 63032 },
+ { 0x844C, 62792 },
+ { 0x844D, 62728 },
+ { 0x844E, 62630 },
+ { 0x844F, 62564 },
+ { 0x8450, 62669 },
+ { 0x8451, 63038 },
+ { 0x8452, 62798 },
+ { 0x8453, 62803 },
+ { 0x8454, 62734 },
+ { 0x8455, 62739 },
+ { 0x8456, 63112 },
+ { 0x8457, 63108 },
+ { 0x8458, 62574 },
+ { 0x8459, 62679 },
+ { 0x845A, 62594 },
+ { 0x845B, 62704 },
+ { 0x845C, 62776 },
+ { 0x845D, 62600 },
+ { 0x845E, 62710 },
+ { 0x845F, 62608 },
+ { 0x8460, 62614 },
+ { 0x8461, 62550 },
+ { 0x8462, 62557 },
+ { 0x8470, 63116 },
+ { 0x8471, 63133 },
+ { 0x8472, 63123 },
+ { 0x8473, 63128 },
+ { 0x9000, 56261 },
+ { 0x9001, 56295 },
+ { 0x9002, 57281 },
+ { 0x9003, 56256 },
+ { 0x9004, 56251 },
+ { 0x9005, 56625 },
+ { 0x9006, 56620 },
+ { 0x9007, 56920 },
+ { 0x9008, 57186 },
+ { 0x9009, 57267 },
+ { 0x900A, 57194 },
+ { 0x900B, 57198 },
+ { 0x900C, 56937 },
+ { 0x900D, 56209 },
+ { 0x900E, 56118 },
+ { 0x900F, 56607 },
+ { 0x9010, 57136 },
+ { 0x9011, 57219 },
+ { 0x9012, 57228 },
+ { 0x9013, 56812 },
+ { 0x9014, 56282 },
+ { 0x9015, 56566 },
+ { 0x9016, 56484 },
+ { 0x9017, 56590 },
+ { 0x9018, 56847 },
+ { 0x9019, 56286 },
+ { 0x901A, 56132 },
+ { 0x901B, 56743 },
+ { 0x901C, 57158 },
+ { 0x901D, 57035 },
+ { 0x901E, 57022 },
+ { 0x901F, 56791 },
+ { 0x9020, 56575 },
+ { 0x9021, 56824 },
+ { 0x9022, 56838 },
+ { 0x9023, 56843 },
+ { 0x9024, 56512 },
+ { 0x9025, 56265 },
+ { 0x9026, 56585 },
+ { 0x9027, 56820 },
+ { 0x9028, 57295 },
+ { 0x9029, 56594 },
+ { 0x902A, 56807 },
+ { 0x902B, 56801 },
+ { 0x902C, 57172 },
+ { 0x902D, 56273 },
+ { 0x902E, 56242 },
+ { 0x902F, 56114 },
+ { 0x9030, 56147 },
+ { 0x9031, 56816 },
+ { 0x9032, 57163 },
+ { 0x9033, 56203 },
+ { 0x9034, 56400 },
+ { 0x9035, 57128 },
+ { 0x9036, 57099 },
+ { 0x9037, 56507 },
+ { 0x9038, 57026 },
+ { 0x9039, 57177 },
+ { 0x903A, 56924 },
+ { 0x903B, 56856 },
+ { 0x903C, 56783 },
+ { 0x903D, 57262 },
+ { 0x903E, 57276 },
+ { 0x903F, 56721 },
+ { 0x9040, 56137 },
+ { 0x9041, 56775 },
+ { 0x9042, 56928 },
+ { 0x9043, 57094 },
+ { 0x9044, 57303 },
+ { 0x9045, 57299 },
+ { 0x9046, 56127 },
+ { 0x9047, 56561 },
+ { 0x9048, 56246 },
+ { 0x9049, 56779 },
+ { 0x904A, 56933 },
+ { 0x904B, 57335 },
+ { 0x904C, 57327 },
+ { 0x904D, 57030 },
+ { 0x904E, 57140 },
+ { 0x904F, 56725 },
+ { 0x9050, 56663 },
+ { 0x9051, 57223 },
+ { 0x9052, 57213 },
+ { 0x9053, 56829 },
+ { 0x9054, 57331 },
+ { 0x9055, 56710 },
+ { 0x9056, 56702 },
+ { 0x9057, 56556 },
+ { 0x9058, 56615 },
+ { 0x9059, 56580 },
+ { 0x905A, 57181 },
+ { 0x905B, 56571 },
+ { 0x905C, 57203 },
+ { 0x905D, 56771 },
+ { 0x905E, 57271 },
+ { 0x905F, 57257 },
+ { 0x9060, 56337 },
+ { 0x9061, 56767 },
+ { 0x9062, 57323 },
+ { 0x9063, 57089 },
+ { 0x9064, 57233 },
+ { 0x9065, 56796 },
+ { 0x9066, 56269 },
+ { 0x9067, 56851 },
+ { 0x9068, 56912 },
+ { 0x9069, 56598 },
+ { 0x906A, 56290 },
+ { 0x906B, 57347 },
+ { 0x906C, 57339 },
+ { 0x906D, 57315 },
+ { 0x906E, 57351 },
+ { 0x906F, 57355 },
+ { 0x9070, 57319 },
+ { 0x9071, 57343 },
+ { 0x9072, 57311 },
+ { 0x9073, 57307 },
+ { 0x9074, 56342 },
+ { 0x9075, 57167 },
+ { 0x9076, 57285 },
+ { 0x9077, 57290 },
+ { 0x9078, 56277 },
+ { 0x9079, 56141 },
+ { 0x907A, 57132 },
+ { 0x907B, 57109 },
+ { 0x907C, 56156 },
+ { 0x907D, 56151 },
+ { 0x907E, 56787 },
+ { 0x907F, 56516 },
+ { 0x9080, 56237 },
+ { 0x9081, 56762 },
+ { 0x9082, 56757 },
+ { 0x9083, 56752 },
+ { 0x9084, 56833 },
+ { 0x9085, 56123 },
+ { 0x9086, 56233 },
+ { 0x9087, 56611 },
+ { 0x9088, 57085 },
+ { 0x9089, 56748 },
+ { 0x908A, 56532 },
+ { 0x908B, 56526 },
+ { 0x908C, 56538 },
+ { 0x908D, 56550 },
+ { 0x908E, 56544 },
+ { 0x908F, 56472 },
+ { 0x9090, 56495 },
+ { 0x9091, 56489 },
+ { 0x9092, 56883 },
+ { 0x9093, 56900 },
+ { 0x9094, 56893 },
+ { 0x9095, 56887 },
+ { 0x9096, 57190 },
+ { 0x9097, 56214 },
+ { 0x9098, 57249 },
+ { 0x9099, 56706 },
+ { 0x909A, 56171 },
+ { 0x909B, 56193 },
+ { 0x909C, 56161 },
+ { 0x909D, 56188 },
+ { 0x909E, 56166 },
+ { 0x909F, 56183 },
+ { 0x90A0, 56198 },
+ { 0x90A1, 56177 },
+ { 0x90A2, 56961 },
+ { 0x90A3, 56941 },
+ { 0x90A4, 56992 },
+ { 0x90A5, 56948 },
+ { 0x90A6, 56967 },
+ { 0x90A7, 57011 },
+ { 0x90A8, 56998 },
+ { 0x90A9, 57004 },
+ { 0x90AA, 56973 },
+ { 0x90AB, 56979 },
+ { 0x90AC, 56501 },
+ { 0x90AD, 57207 },
+ { 0x90AE, 57123 },
+ { 0x90AF, 57118 },
+ { 0x90B0, 57113 },
+ { 0x90B1, 56955 },
+ { 0x90B2, 57016 },
+ { 0x90B3, 56985 },
+ { 0x90B4, 57237 },
+ { 0x90B5, 57243 },
+ { 0x90B6, 56714 },
+ { 0x90B7, 56916 },
+ { 0x90B8, 57253 },
+ { 0x90B9, 56405 },
+ { 0x90BA, 56438 },
+ { 0x90BB, 56450 },
+ { 0x90BC, 56361 },
+ { 0x90BD, 56412 },
+ { 0x90BE, 56393 },
+ { 0x90BF, 56418 },
+ { 0x90C0, 56444 },
+ { 0x90C1, 56431 },
+ { 0x90C2, 56424 },
+ { 0x90C3, 56372 },
+ { 0x90C4, 56379 },
+ { 0x90C5, 56347 },
+ { 0x90C6, 56386 },
+ { 0x90C7, 56367 },
+ { 0x90C8, 56218 },
+ { 0x90C9, 56223 },
+ { 0x90CA, 56228 },
+ { 0x90CB, 56354 },
+ { 0x90CC, 56456 },
+ { 0x90CD, 56658 },
+ { 0x90CE, 56327 },
+ { 0x90CF, 56332 },
+ { 0x90D0, 56299 },
+ { 0x90D1, 56320 },
+ { 0x90D2, 56306 },
+ { 0x90D3, 56313 },
+ { 0x90D4, 56630 },
+ { 0x90D5, 56651 },
+ { 0x90D6, 56637 },
+ { 0x90D7, 56644 },
+ { 0x90D8, 56462 },
+ { 0x90D9, 56467 },
+ { 0x90DA, 56861 },
+ { 0x90DB, 56867 },
+ { 0x90DC, 56873 },
+ { 0x90DD, 56878 },
+ { 0x90DE, 57062 },
+ { 0x90DF, 57067 },
+ { 0x90E0, 57073 },
+ { 0x90E1, 57079 },
+ { 0x90E2, 57039 },
+ { 0x90E3, 57044 },
+ { 0x90E4, 57050 },
+ { 0x90E5, 57056 },
+ { 0x90E6, 56907 },
+ { 0x90E7, 57104 },
+ { 0x90E8, 56603 },
+ { 0x90E9, 56687 },
+ { 0x90EA, 56697 },
+ { 0x90EB, 56672 },
+ { 0x90EC, 56667 },
+ { 0x90ED, 56677 },
+ { 0x90EE, 56692 },
+ { 0x90EF, 56682 },
+ { 0x90F0, 57152 },
+ { 0x90F1, 56737 },
+ { 0x90F2, 57146 },
+ { 0x90F3, 56731 },
+ { 0x90F4, 56521 },
+ { 0x90F5, 56478 },
+ { 0x9100, 41562 },
+ { 0x9101, 41524 },
+ { 0x9102, 41404 },
+ { 0x9103, 41695 },
+ { 0x9104, 41508 },
+ { 0x9105, 41470 },
+ { 0x9106, 41337 },
+ { 0x9107, 41454 },
+ { 0x9108, 41558 },
+ { 0x9109, 41249 },
+ { 0x910A, 41238 },
+ { 0x910B, 41459 },
+ { 0x910C, 41290 },
+ { 0x910D, 41776 },
+ { 0x910E, 41780 },
+ { 0x910F, 41784 },
+ { 0x9110, 41659 },
+ { 0x9111, 41662 },
+ { 0x9112, 41485 },
+ { 0x9113, 41646 },
+ { 0x9114, 41395 },
+ { 0x9115, 41643 },
+ { 0x9116, 41728 },
+ { 0x9117, 41861 },
+ { 0x9118, 42079 },
+ { 0x9119, 41999 },
+ { 0x911A, 41995 },
+ { 0x911B, 41788 },
+ { 0x911C, 42075 },
+ { 0x911D, 42086 },
+ { 0x911E, 41215 },
+ { 0x911F, 41219 },
+ { 0x9120, 41225 },
+ { 0x9121, 41195 },
+ { 0x9122, 41199 },
+ { 0x9123, 41203 },
+ { 0x9124, 41209 },
+ { 0x9125, 41300 },
+ { 0x9126, 41304 },
+ { 0x9129, 41719 },
+ { 0x912A, 41520 },
+ { 0x912B, 41516 },
+ { 0x912C, 41308 },
+ { 0x912D, 41312 },
+ { 0x912E, 41666 },
+ { 0x912F, 41670 },
+ { 0x9130, 41462 },
+ { 0x9131, 41466 },
+ { 0x9132, 41690 },
+ { 0x9133, 41685 },
+ { 0x9134, 41504 },
+ { 0x9135, 41245 },
+ { 0x9136, 41550 },
+ { 0x9137, 41554 },
+ { 0x9138, 42103 },
+ { 0x9139, 42107 },
+ { 0x913A, 41438 },
+ { 0x913B, 41481 },
+ { 0x913C, 41328 },
+ { 0x913D, 41681 },
+ { 0x913E, 41532 },
+ { 0x913F, 42039 },
+ { 0x9140, 42123 },
+ { 0x9141, 42115 },
+ { 0x9142, 41280 },
+ { 0x9143, 41231 },
+ { 0x9144, 41356 },
+ { 0x9145, 41496 },
+ { 0x9146, 41575 },
+ { 0x9147, 41570 },
+ { 0x9148, 41819 },
+ { 0x9149, 41799 },
+ { 0x914A, 41843 },
+ { 0x914B, 41837 },
+ { 0x914C, 41855 },
+ { 0x914D, 41849 },
+ { 0x914E, 41831 },
+ { 0x914F, 41825 },
+ { 0x9150, 41812 },
+ { 0x9151, 41805 },
+ { 0x9152, 41347 },
+ { 0x9153, 41342 },
+ { 0x9154, 42133 },
+ { 0x9155, 42127 },
+ { 0x9156, 42096 },
+ { 0x9157, 41371 },
+ { 0x9158, 41724 },
+ { 0x9159, 41352 },
+ { 0x915A, 41654 },
+ { 0x915B, 41649 },
+ { 0x915C, 41398 },
+ { 0x915D, 41477 },
+ { 0x915E, 41324 },
+ { 0x915F, 41677 },
+ { 0x9160, 41528 },
+ { 0x9161, 42035 },
+ { 0x9162, 42119 },
+ { 0x9163, 42111 },
+ { 0x9164, 41274 },
+ { 0x9165, 41896 },
+ { 0x9166, 41975 },
+ { 0x9167, 41958 },
+ { 0x9168, 41962 },
+ { 0x9169, 41966 },
+ { 0x916A, 41703 },
+ { 0x916B, 41707 },
+ { 0x916C, 41711 },
+ { 0x916D, 41970 },
+ { 0x916E, 41917 },
+ { 0x916F, 41921 },
+ { 0x9170, 41925 },
+ { 0x9171, 41929 },
+ { 0x9172, 41933 },
+ { 0x9173, 41383 },
+ { 0x9174, 41262 },
+ { 0x9175, 41379 },
+ { 0x9176, 41258 },
+ { 0x9177, 41387 },
+ { 0x9178, 41266 },
+ { 0x9179, 41391 },
+ { 0x917A, 41270 },
+ { 0x917B, 41908 },
+ { 0x917C, 41954 },
+ { 0x917D, 41937 },
+ { 0x917E, 41980 },
+ { 0x917F, 41946 },
+ { 0x9180, 41988 },
+ { 0x9181, 41984 },
+ { 0x9182, 41900 },
+ { 0x9183, 42043 },
+ { 0x9184, 42047 },
+ { 0x9185, 41878 },
+ { 0x9186, 41870 },
+ { 0x9187, 41887 },
+ { 0x9188, 41904 },
+ { 0x9189, 41874 },
+ { 0x918A, 41912 },
+ { 0x918B, 41941 },
+ { 0x918C, 42100 },
+ { 0x918D, 41580 },
+ { 0x918E, 41235 },
+ { 0x918F, 41451 },
+ { 0x9190, 41435 },
+ { 0x9191, 41408 },
+ { 0x9192, 41992 },
+ { 0x9193, 42083 },
+ { 0x9194, 41417 },
+ { 0x9195, 41411 },
+ { 0x9196, 41242 },
+ { 0x9197, 41360 },
+ { 0x9198, 41715 },
+ { 0x9199, 41367 },
+ { 0x919A, 41363 },
+ { 0x919B, 41732 },
+ { 0x919C, 41736 },
+ { 0x919D, 41740 },
+ { 0x919E, 41744 },
+ { 0x919F, 41748 },
+ { 0x91A0, 41752 },
+ { 0x91A1, 41756 },
+ { 0x91A2, 41760 },
+ { 0x91A3, 41764 },
+ { 0x91A4, 41768 },
+ { 0x91A5, 41772 },
+ { 0x91A6, 42090 },
+ { 0x91A7, 42093 },
+ { 0x91A8, 41253 },
+ { 0x91A9, 41512 },
+ { 0x91AA, 41882 },
+ { 0x91AB, 41865 },
+ { 0x91AC, 41950 },
+ { 0x91AD, 41891 },
+ { 0x91AE, 41447 },
+ { 0x91AF, 41442 },
+ { 0x91B0, 41332 },
+ { 0x91B1, 42003 },
+ { 0x91B2, 42007 },
+ { 0x91B3, 41375 },
+ { 0x91B4, 41293 },
+ { 0x91B5, 41296 },
+ { 0x91B6, 41536 },
+ { 0x91B7, 41422 },
+ { 0x91B8, 41489 },
+ { 0x91B9, 42059 },
+ { 0x91BA, 42055 },
+ { 0x91BB, 41539 },
+ { 0x91BC, 41546 },
+ { 0x91BD, 42071 },
+ { 0x91BE, 42067 },
+ { 0x91BF, 41320 },
+ { 0x91C0, 41316 },
+ { 0x91C1, 41425 },
+ { 0x91C2, 41430 },
+ { 0x91C3, 41492 },
+ { 0x91C4, 42051 },
+ { 0x91C5, 41542 },
+ { 0x91C6, 42063 },
+ { 0x91C7, 41583 },
+ { 0x91C8, 41598 },
+ { 0x91C9, 41590 },
+ { 0x91CA, 41605 },
+ { 0x91CB, 41612 },
+ { 0x91CC, 41619 },
+ { 0x91CD, 41627 },
+ { 0x91CE, 41635 },
+ { 0x91CF, 41401 },
+ { 0x91D0, 42011 },
+ { 0x91D1, 42016 },
+ { 0x91D2, 41566 },
+ { 0x91D3, 41474 },
+ { 0x91D4, 41674 },
+ { 0x91D5, 41501 },
+ { 0x91D6, 42028 },
+ { 0x91D7, 41700 },
+ { 0x91D8, 41792 },
+ { 0x91D9, 42021 },
+ { 0x91DA, 42024 },
+ { 0x91DB, 42031 },
+ { 0x91DC, 41795 },
+ { 0x91DD, 41286 },
+ { 0x9200, 11902 },
+ { 0x9201, 11906 },
+ { 0x9202, 11910 },
+ { 0x9203, 11914 },
+ { 0x9204, 11918 },
+ { 0x9205, 11922 },
+ { 0x9206, 11926 },
+ { 0x9207, 11930 },
+ { 0x9208, 11934 },
+ { 0x9209, 11938 },
+ { 0x920A, 11942 },
+ { 0x920B, 11946 },
+ { 0x920C, 11950 },
+ { 0x920D, 11954 },
+ { 0x920E, 11958 },
+ { 0x920F, 11962 },
+ { 0x9210, 11966 },
+ { 0x9211, 11970 },
+ { 0x9212, 11974 },
+ { 0x9213, 11978 },
+ { 0x9214, 11982 },
+ { 0x9215, 11986 },
+ { 0x9216, 11990 },
+ { 0x9217, 11994 },
+ { 0x9218, 11998 },
+ { 0x9219, 12002 },
+ { 0x921A, 12006 },
+ { 0x921B, 12010 },
+ { 0x921C, 12014 },
+ { 0x921D, 13374 },
+ { 0x921E, 13378 },
+ { 0x921F, 13382 },
+ { 0x9220, 13386 },
+ { 0x9221, 13390 },
+ { 0x9222, 13394 },
+ { 0x9223, 13398 },
+ { 0x9224, 13402 },
+ { 0x9225, 13406 },
+ { 0x9226, 13410 },
+ { 0x9227, 13414 },
+ { 0x9228, 13418 },
+ { 0x9229, 13422 },
+ { 0x922A, 13426 },
+ { 0x922B, 13430 },
+ { 0x922C, 13434 },
+ { 0x922D, 13438 },
+ { 0x922E, 13442 },
+ { 0x922F, 13446 },
+ { 0x9230, 13450 },
+ { 0x9231, 13454 },
+ { 0x9232, 13458 },
+ { 0x9233, 13462 },
+ { 0x9234, 13466 },
+ { 0x9235, 13470 },
+ { 0x9236, 13474 },
+ { 0x9237, 13478 },
+ { 0x9238, 13482 },
+ { 0x9239, 13486 },
+ { 0x923A, 13490 },
+ { 0x923B, 13494 },
+ { 0x923C, 13498 },
+ { 0x923D, 13502 },
+ { 0x923E, 13506 },
+ { 0x923F, 13510 },
+ { 0x9240, 13514 },
+ { 0x9241, 13518 },
+ { 0x9242, 57564 },
+ { 0x9243, 57572 },
+ { 0x9244, 57568 },
+ { 0x9245, 13031 },
+ { 0x9300, 54871 },
+ { 0x9301, 31216 },
+ { 0x9302, 31188 },
+ { 0x9303, 31204 },
+ { 0x9304, 31200 },
+ { 0x9305, 31185 },
+ { 0x9306, 66100 },
+ { 0x9307, 66067 },
+ { 0x9308, 66082 },
+ { 0x9309, 66128 },
+ { 0x930A, 66147 },
+ { 0x930B, 66272 },
+ { 0x930C, 66097 },
+ { 0x930D, 66263 },
+ { 0x930E, 66201 },
+ { 0x930F, 66299 },
+ { 0x9310, 66254 },
+ { 0x9311, 66296 },
+ { 0x9312, 66184 },
+ { 0x9313, 66281 },
+ { 0x9314, 66085 },
+ { 0x9315, 66134 },
+ { 0x9316, 66143 },
+ { 0x9317, 66172 },
+ { 0x9318, 66220 },
+ { 0x9319, 66125 },
+ { 0x931A, 66166 },
+ { 0x931B, 66266 },
+ { 0x931C, 66064 },
+ { 0x931D, 66052 },
+ { 0x931E, 66251 },
+ { 0x931F, 66217 },
+ { 0x9320, 66110 },
+ { 0x9321, 66103 },
+ { 0x9322, 66287 },
+ { 0x9323, 66060 },
+ { 0x9324, 66160 },
+ { 0x9325, 66116 },
+ { 0x9326, 66205 },
+ { 0x9327, 66151 },
+ { 0x9328, 66226 },
+ { 0x9329, 66193 },
+ { 0x932A, 66119 },
+ { 0x932B, 66178 },
+ { 0x932C, 66239 },
+ { 0x932D, 66055 },
+ { 0x932E, 66187 },
+ { 0x932F, 66074 },
+ { 0x9330, 66257 },
+ { 0x9331, 66088 },
+ { 0x9332, 66233 },
+ { 0x9333, 66275 },
+ { 0x9334, 66163 },
+ { 0x9335, 66122 },
+ { 0x9336, 66113 },
+ { 0x9337, 66196 },
+ { 0x9338, 66208 },
+ { 0x9339, 66157 },
+ { 0x933A, 66175 },
+ { 0x933B, 66091 },
+ { 0x933C, 66293 },
+ { 0x933D, 66106 },
+ { 0x933E, 66278 },
+ { 0x933F, 66229 },
+ { 0x9340, 66154 },
+ { 0x9341, 66284 },
+ { 0x9342, 66304 },
+ { 0x9343, 66071 },
+ { 0x9344, 66094 },
+ { 0x9345, 66169 },
+ { 0x9346, 66079 },
+ { 0x9347, 66214 },
+ { 0x9348, 66211 },
+ { 0x9349, 66137 },
+ { 0x934A, 66260 },
+ { 0x934B, 66242 },
+ { 0x934C, 66190 },
+ { 0x934D, 66181 },
+ { 0x934E, 66245 },
+ { 0x934F, 66131 },
+ { 0x9350, 66140 },
+ { 0x9351, 66269 },
+ { 0x9352, 66248 },
+ { 0x9353, 66047 },
+ { 0x9354, 66290 },
+ { 0x9355, 66236 },
+ { 0x9356, 66223 },
+ { 0x9360, 48474 },
+ { 0x9361, 48484 },
+ { 0x9362, 48514 },
+ { 0x9363, 48494 },
+ { 0x9364, 48489 },
+ { 0x9365, 48479 },
+ { 0x9366, 48509 },
+ { 0x9367, 48504 },
+ { 0x9368, 48499 },
+ { 0x9369, 48429 },
+ { 0x936A, 48439 },
+ { 0x936B, 48469 },
+ { 0x936C, 48449 },
+ { 0x936D, 48444 },
+ { 0x936E, 48434 },
+ { 0x936F, 48464 },
+ { 0x9370, 48459 },
+ { 0x9371, 48454 },
+ { 0x9400, 70678 },
+ { 0x9401, 70682 },
+ { 0x9402, 70686 },
+ { 0x9403, 70690 },
+ { 0x9404, 70694 },
+ { 0x9405, 70698 },
+ { 0x9406, 70702 },
+ { 0x9407, 70706 },
+ { 0x9408, 70710 },
+ { 0x9409, 70714 },
+ { 0x940A, 70718 },
+ { 0x940B, 70722 },
+ { 0x940C, 70726 },
+ { 0x940D, 70730 },
+ { 0x940E, 70734 },
+ { 0x940F, 70738 },
+ { 0x9410, 70742 },
+ { 0x9411, 70746 },
+ { 0x9412, 70750 },
+ { 0x9413, 70754 },
+ { 0x9414, 70758 },
+ { 0x9415, 70762 },
+ { 0x9416, 70766 },
+ { 0x9417, 70770 },
+ { 0x9418, 70774 },
+ { 0x9419, 70778 },
+ { 0x941A, 69654 },
+ { 0x941B, 69658 },
+ { 0x941C, 69662 },
+ { 0x941D, 69666 },
+ { 0x941E, 69670 },
+ { 0x941F, 69674 },
+ { 0x9420, 69678 },
+ { 0x9421, 69682 },
+ { 0x9422, 69686 },
+ { 0x9423, 69690 },
+ { 0x9424, 69694 },
+ { 0x9425, 69698 },
+ { 0x9426, 69702 },
+ { 0x9427, 69706 },
+ { 0x9428, 69710 },
+ { 0x9429, 69714 },
+ { 0x942A, 69718 },
+ { 0x942B, 69722 },
+ { 0x942C, 69726 },
+ { 0x942D, 69730 },
+ { 0x942E, 69734 },
+ { 0x942F, 69738 },
+ { 0x9430, 69742 },
+ { 0x9431, 69746 },
+ { 0x9432, 69750 },
+ { 0x9433, 69754 },
+ { 0x9434, 71437 },
+ { 0x9435, 71441 },
+ { 0x9436, 71445 },
+ { 0x9437, 71449 },
+ { 0x9438, 71453 },
+ { 0x9439, 71457 },
+ { 0x943A, 71461 },
+ { 0x943B, 71465 },
+ { 0x943C, 71469 },
+ { 0x943D, 71473 },
+ { 0x943E, 71477 },
+ { 0x943F, 71481 },
+ { 0x9440, 71485 },
+ { 0x9441, 71489 },
+ { 0x9442, 71493 },
+ { 0x9443, 71497 },
+ { 0x9444, 71501 },
+ { 0x9445, 71505 },
+ { 0x9446, 71509 },
+ { 0x9447, 71513 },
+ { 0x9448, 71517 },
+ { 0x9449, 71521 },
+ { 0x944A, 71525 },
+ { 0x944B, 71529 },
+ { 0x944C, 71533 },
+ { 0x944D, 71537 },
+ { 0x944E, 71222 },
+ { 0x944F, 71226 },
+ { 0x9450, 71230 },
+ { 0x9451, 71234 },
+ { 0x9452, 71238 },
+ { 0x9453, 71242 },
+ { 0x9454, 71246 },
+ { 0x9456, 71250 },
+ { 0x9457, 71254 },
+ { 0x9458, 71258 },
+ { 0x9459, 71262 },
+ { 0x945A, 71266 },
+ { 0x945B, 71270 },
+ { 0x945C, 71274 },
+ { 0x945D, 71278 },
+ { 0x945E, 71282 },
+ { 0x945F, 71286 },
+ { 0x9460, 71290 },
+ { 0x9461, 71294 },
+ { 0x9462, 71298 },
+ { 0x9463, 71302 },
+ { 0x9464, 71306 },
+ { 0x9465, 71310 },
+ { 0x9466, 71314 },
+ { 0x9467, 71318 },
+ { 0x9468, 70152 },
+ { 0x9469, 70157 },
+ { 0x946A, 70162 },
+ { 0x946B, 70167 },
+ { 0x946C, 70172 },
+ { 0x946D, 70177 },
+ { 0x946E, 70182 },
+ { 0x946F, 70187 },
+ { 0x9470, 70192 },
+ { 0x9471, 70197 },
+ { 0x9472, 70202 },
+ { 0x9473, 70207 },
+ { 0x9474, 70212 },
+ { 0x9475, 70217 },
+ { 0x9476, 70222 },
+ { 0x9477, 70227 },
+ { 0x9478, 70232 },
+ { 0x9479, 70237 },
+ { 0x947A, 70242 },
+ { 0x947B, 70247 },
+ { 0x947C, 70252 },
+ { 0x947D, 70257 },
+ { 0x947E, 70262 },
+ { 0x947F, 70267 },
+ { 0x9480, 70272 },
+ { 0x9481, 70277 },
+ { 0x9482, 69891 },
+ { 0x9483, 69896 },
+ { 0x9484, 69901 },
+ { 0x9485, 69906 },
+ { 0x9486, 69911 },
+ { 0x9487, 69916 },
+ { 0x9488, 69921 },
+ { 0x9489, 69926 },
+ { 0x948A, 69931 },
+ { 0x948B, 69936 },
+ { 0x948C, 69941 },
+ { 0x948D, 69946 },
+ { 0x948E, 69951 },
+ { 0x948F, 69956 },
+ { 0x9490, 69961 },
+ { 0x9491, 69966 },
+ { 0x9492, 69971 },
+ { 0x9493, 69976 },
+ { 0x9494, 69981 },
+ { 0x9495, 69986 },
+ { 0x9496, 69991 },
+ { 0x9497, 69996 },
+ { 0x9498, 70001 },
+ { 0x9499, 70006 },
+ { 0x949A, 70011 },
+ { 0x949B, 70016 },
+ { 0x949C, 71742 },
+ { 0x949E, 71746 },
+ { 0x949F, 71750 },
+ { 0x94A2, 71754 },
+ { 0x94A5, 71758 },
+ { 0x94A6, 71762 },
+ { 0x94A9, 71766 },
+ { 0x94AA, 71770 },
+ { 0x94AB, 71774 },
+ { 0x94AC, 71778 },
+ { 0x94AE, 71782 },
+ { 0x94AF, 71786 },
+ { 0x94B0, 71790 },
+ { 0x94B1, 71794 },
+ { 0x94B2, 71798 },
+ { 0x94B3, 71802 },
+ { 0x94B4, 71806 },
+ { 0x94B5, 71810 },
+ { 0x94B6, 71650 },
+ { 0x94B7, 71654 },
+ { 0x94B8, 71658 },
+ { 0x94B9, 71662 },
+ { 0x94BB, 71666 },
+ { 0x94BD, 71670 },
+ { 0x94BE, 71674 },
+ { 0x94BF, 71678 },
+ { 0x94C0, 71682 },
+ { 0x94C1, 71686 },
+ { 0x94C2, 71690 },
+ { 0x94C3, 71694 },
+ { 0x94C5, 71698 },
+ { 0x94C6, 71702 },
+ { 0x94C7, 71706 },
+ { 0x94C8, 71710 },
+ { 0x94C9, 71714 },
+ { 0x94CA, 71718 },
+ { 0x94CB, 71722 },
+ { 0x94CC, 71726 },
+ { 0x94CD, 71730 },
+ { 0x94CE, 71734 },
+ { 0x94CF, 71738 },
+ { 0x94D0, 70548 },
+ { 0x94D1, 70553 },
+ { 0x94D2, 70558 },
+ { 0x94D3, 70563 },
+ { 0x94D4, 70568 },
+ { 0x94D5, 70573 },
+ { 0x94D6, 70578 },
+ { 0x94D7, 70583 },
+ { 0x94D8, 70588 },
+ { 0x94D9, 70593 },
+ { 0x94DA, 70598 },
+ { 0x94DB, 70603 },
+ { 0x94DC, 70608 },
+ { 0x94DD, 70613 },
+ { 0x94DE, 70618 },
+ { 0x94DF, 70623 },
+ { 0x94E0, 70628 },
+ { 0x94E1, 70633 },
+ { 0x94E2, 70638 },
+ { 0x94E3, 70643 },
+ { 0x94E4, 70648 },
+ { 0x94E5, 70653 },
+ { 0x94E6, 70658 },
+ { 0x94E7, 70663 },
+ { 0x94E8, 70668 },
+ { 0x94E9, 70673 },
+ { 0x94EA, 70418 },
+ { 0x94EB, 70423 },
+ { 0x94EC, 70428 },
+ { 0x94ED, 70433 },
+ { 0x94EE, 70438 },
+ { 0x94EF, 70443 },
+ { 0x94F0, 70448 },
+ { 0x94F1, 70453 },
+ { 0x94F2, 70458 },
+ { 0x94F3, 70463 },
+ { 0x94F4, 70468 },
+ { 0x94F5, 70473 },
+ { 0x94F6, 70478 },
+ { 0x94F7, 70483 },
+ { 0x94F8, 70488 },
+ { 0x94F9, 70493 },
+ { 0x94FA, 70498 },
+ { 0x94FB, 70503 },
+ { 0x94FC, 70508 },
+ { 0x94FD, 70513 },
+ { 0x94FE, 70518 },
+ { 0x94FF, 70523 },
+ { 0x9500, 70528 },
+ { 0x9501, 70533 },
+ { 0x9502, 70538 },
+ { 0x9503, 70543 },
+ { 0x9504, 71918 },
+ { 0x9505, 71922 },
+ { 0x9507, 71926 },
+ { 0x9508, 71930 },
+ { 0x9509, 71934 },
+ { 0x950A, 71938 },
+ { 0x950D, 71942 },
+ { 0x950E, 71946 },
+ { 0x950F, 71950 },
+ { 0x9510, 71954 },
+ { 0x9511, 71958 },
+ { 0x9512, 71962 },
+ { 0x9513, 71966 },
+ { 0x9514, 71970 },
+ { 0x9516, 71974 },
+ { 0x9517, 71978 },
+ { 0x9518, 71982 },
+ { 0x9519, 71986 },
+ { 0x951A, 71990 },
+ { 0x951B, 71994 },
+ { 0x951C, 71998 },
+ { 0x951E, 71814 },
+ { 0x951F, 71818 },
+ { 0x9520, 71822 },
+ { 0x9521, 71826 },
+ { 0x9522, 71830 },
+ { 0x9523, 71834 },
+ { 0x9524, 71838 },
+ { 0x9525, 71842 },
+ { 0x9526, 71846 },
+ { 0x9527, 71850 },
+ { 0x9528, 71854 },
+ { 0x9529, 71858 },
+ { 0x952A, 71862 },
+ { 0x952B, 71866 },
+ { 0x952C, 71870 },
+ { 0x952D, 71874 },
+ { 0x952E, 71878 },
+ { 0x952F, 71882 },
+ { 0x9530, 71886 },
+ { 0x9531, 71890 },
+ { 0x9532, 71894 },
+ { 0x9533, 71898 },
+ { 0x9534, 71902 },
+ { 0x9535, 71906 },
+ { 0x9536, 71910 },
+ { 0x9537, 71914 },
+ { 0x9538, 74164 },
+ { 0x9539, 74168 },
+ { 0x953B, 74172 },
+ { 0x953C, 74176 },
+ { 0x953D, 74180 },
+ { 0x953E, 74184 },
+ { 0x9540, 74188 },
+ { 0x9541, 74192 },
+ { 0x9542, 74196 },
+ { 0x9543, 74200 },
+ { 0x9544, 74204 },
+ { 0x9546, 74208 },
+ { 0x954A, 74212 },
+ { 0x954B, 74216 },
+ { 0x954C, 74220 },
+ { 0x954D, 74224 },
+ { 0x954E, 74228 },
+ { 0x954F, 74232 },
+ { 0x9550, 74236 },
+ { 0x9552, 74060 },
+ { 0x9553, 74064 },
+ { 0x9554, 74068 },
+ { 0x9555, 74072 },
+ { 0x9556, 74076 },
+ { 0x9557, 74080 },
+ { 0x9558, 74084 },
+ { 0x9559, 74088 },
+ { 0x955A, 74092 },
+ { 0x955B, 74096 },
+ { 0x955C, 74100 },
+ { 0x955D, 74104 },
+ { 0x955E, 74108 },
+ { 0x955F, 74112 },
+ { 0x9560, 74116 },
+ { 0x9561, 74120 },
+ { 0x9562, 74124 },
+ { 0x9563, 74128 },
+ { 0x9564, 74132 },
+ { 0x9565, 74136 },
+ { 0x9566, 74140 },
+ { 0x9567, 74144 },
+ { 0x9568, 74148 },
+ { 0x9569, 74152 },
+ { 0x956A, 74156 },
+ { 0x956B, 74160 },
+ { 0x956C, 71021 },
+ { 0x956D, 71026 },
+ { 0x956E, 71031 },
+ { 0x956F, 71036 },
+ { 0x9570, 71041 },
+ { 0x9571, 71046 },
+ { 0x9572, 71051 },
+ { 0x9573, 71056 },
+ { 0x9574, 71061 },
+ { 0x9575, 71066 },
+ { 0x9576, 71071 },
+ { 0x9577, 71076 },
+ { 0x9578, 71081 },
+ { 0x9579, 71086 },
+ { 0x957A, 71091 },
+ { 0x957B, 71096 },
+ { 0x957C, 71101 },
+ { 0x957D, 71106 },
+ { 0x957E, 71111 },
+ { 0x957F, 71116 },
+ { 0x9580, 71121 },
+ { 0x9581, 71126 },
+ { 0x9582, 71131 },
+ { 0x9583, 71136 },
+ { 0x9584, 71141 },
+ { 0x9585, 71146 },
+ { 0x9586, 70891 },
+ { 0x9587, 70896 },
+ { 0x9588, 70901 },
+ { 0x9589, 70906 },
+ { 0x958A, 70911 },
+ { 0x958B, 70916 },
+ { 0x958C, 70921 },
+ { 0x958D, 70926 },
+ { 0x958E, 70931 },
+ { 0x958F, 70936 },
+ { 0x9590, 70941 },
+ { 0x9591, 70946 },
+ { 0x9592, 70951 },
+ { 0x9593, 70956 },
+ { 0x9594, 70961 },
+ { 0x9595, 70966 },
+ { 0x9596, 70971 },
+ { 0x9597, 70976 },
+ { 0x9598, 70981 },
+ { 0x9599, 70986 },
+ { 0x959A, 70991 },
+ { 0x959B, 70996 },
+ { 0x959C, 71001 },
+ { 0x959D, 71006 },
+ { 0x959E, 71011 },
+ { 0x959F, 71016 },
+ { 0x95A0, 73916 },
+ { 0x95A1, 73920 },
+ { 0x95A2, 73924 },
+ { 0x95A3, 73928 },
+ { 0x95A4, 73932 },
+ { 0x95A5, 73936 },
+ { 0x95A6, 73940 },
+ { 0x95A7, 73944 },
+ { 0x95A8, 73948 },
+ { 0x95A9, 73952 },
+ { 0x95AA, 73956 },
+ { 0x95AB, 73960 },
+ { 0x95AC, 73964 },
+ { 0x95AD, 73968 },
+ { 0x95AE, 73972 },
+ { 0x95AF, 73976 },
+ { 0x95B0, 73980 },
+ { 0x95B1, 73984 },
+ { 0x95B2, 73988 },
+ { 0x95B3, 73992 },
+ { 0x95B4, 73996 },
+ { 0x95B5, 74000 },
+ { 0x95B6, 74004 },
+ { 0x95B7, 74008 },
+ { 0x95B8, 74012 },
+ { 0x95B9, 74016 },
+ { 0x95BA, 73552 },
+ { 0x95BB, 73556 },
+ { 0x95BC, 73560 },
+ { 0x95BD, 73564 },
+ { 0x95BE, 73568 },
+ { 0x95BF, 73572 },
+ { 0x95C0, 73576 },
+ { 0x95C1, 73580 },
+ { 0x95C2, 73584 },
+ { 0x95C3, 73588 },
+ { 0x95C4, 73592 },
+ { 0x95C5, 73596 },
+ { 0x95C6, 73600 },
+ { 0x95C7, 73604 },
+ { 0x95C8, 73608 },
+ { 0x95C9, 73612 },
+ { 0x95CA, 73616 },
+ { 0x95CB, 73620 },
+ { 0x95CC, 73624 },
+ { 0x95CD, 73628 },
+ { 0x95CE, 73632 },
+ { 0x95CF, 73636 },
+ { 0x95D0, 73640 },
+ { 0x95D1, 73644 },
+ { 0x95D2, 73648 },
+ { 0x95D3, 73652 },
+ { 0x95D4, 73246 },
+ { 0x95D5, 73251 },
+ { 0x95D6, 73256 },
+ { 0x95D7, 73261 },
+ { 0x95D8, 73266 },
+ { 0x95D9, 73271 },
+ { 0x95DA, 73276 },
+ { 0x95DB, 73281 },
+ { 0x95DC, 73286 },
+ { 0x95DD, 73291 },
+ { 0x95DE, 73296 },
+ { 0x95DF, 73301 },
+ { 0x95E0, 73306 },
+ { 0x95E1, 73311 },
+ { 0x95E2, 73316 },
+ { 0x95E3, 73321 },
+ { 0x95E4, 73326 },
+ { 0x95E5, 73331 },
+ { 0x95E6, 73336 },
+ { 0x95E7, 73341 },
+ { 0x95E8, 73346 },
+ { 0x95E9, 73351 },
+ { 0x95EA, 73356 },
+ { 0x95EB, 73361 },
+ { 0x95EC, 73366 },
+ { 0x95ED, 73371 },
+ { 0x95EE, 72324 },
+ { 0x95EF, 72329 },
+ { 0x95F0, 72334 },
+ { 0x95F1, 72339 },
+ { 0x95F2, 72344 },
+ { 0x95F3, 72349 },
+ { 0x95F4, 72354 },
+ { 0x95F5, 72359 },
+ { 0x95F6, 72364 },
+ { 0x95F7, 72369 },
+ { 0x95F8, 72374 },
+ { 0x95F9, 72379 },
+ { 0x95FA, 72384 },
+ { 0x95FB, 72389 },
+ { 0x95FC, 72394 },
+ { 0x95FD, 72399 },
+ { 0x95FE, 72404 },
+ { 0x95FF, 72409 },
+ { 0x9600, 72414 },
+ { 0x9601, 72419 },
+ { 0x9602, 72424 },
+ { 0x9603, 72429 },
+ { 0x9604, 72434 },
+ { 0x9605, 72439 },
+ { 0x9606, 72444 },
+ { 0x9607, 72449 },
+ { 0x9608, 73786 },
+ { 0x9609, 73791 },
+ { 0x960A, 73796 },
+ { 0x960B, 73801 },
+ { 0x960C, 73806 },
+ { 0x960D, 73811 },
+ { 0x960E, 73816 },
+ { 0x960F, 73821 },
+ { 0x9610, 73826 },
+ { 0x9611, 73831 },
+ { 0x9612, 73836 },
+ { 0x9613, 73841 },
+ { 0x9614, 73846 },
+ { 0x9615, 73851 },
+ { 0x9616, 73856 },
+ { 0x9617, 73861 },
+ { 0x9618, 73866 },
+ { 0x9619, 73871 },
+ { 0x961A, 73876 },
+ { 0x961B, 73881 },
+ { 0x961C, 73886 },
+ { 0x961D, 73891 },
+ { 0x961E, 73896 },
+ { 0x961F, 73901 },
+ { 0x9620, 73906 },
+ { 0x9621, 73911 },
+ { 0x9622, 73656 },
+ { 0x9623, 73661 },
+ { 0x9624, 73666 },
+ { 0x9625, 73671 },
+ { 0x9626, 73676 },
+ { 0x9627, 73681 },
+ { 0x9628, 73686 },
+ { 0x9629, 73691 },
+ { 0x962A, 73696 },
+ { 0x962B, 73701 },
+ { 0x962C, 73706 },
+ { 0x962D, 73711 },
+ { 0x962E, 73716 },
+ { 0x962F, 73721 },
+ { 0x9630, 73726 },
+ { 0x9631, 73731 },
+ { 0x9632, 73736 },
+ { 0x9633, 73741 },
+ { 0x9634, 73746 },
+ { 0x9635, 73751 },
+ { 0x9636, 73756 },
+ { 0x9637, 73761 },
+ { 0x9638, 73766 },
+ { 0x9639, 73771 },
+ { 0x963A, 73776 },
+ { 0x963B, 73781 },
+ { 0x963C, 72927 },
+ { 0x963D, 72933 },
+ { 0x963E, 72939 },
+ { 0x963F, 72945 },
+ { 0x9640, 72951 },
+ { 0x9641, 72957 },
+ { 0x9642, 72963 },
+ { 0x9643, 72969 },
+ { 0x9644, 72975 },
+ { 0x9645, 72981 },
+ { 0x9646, 72987 },
+ { 0x9647, 72993 },
+ { 0x9648, 72999 },
+ { 0x9649, 73005 },
+ { 0x964A, 73011 },
+ { 0x964B, 73017 },
+ { 0x964C, 73023 },
+ { 0x964D, 73029 },
+ { 0x964E, 73035 },
+ { 0x964F, 73041 },
+ { 0x9650, 73047 },
+ { 0x9651, 73053 },
+ { 0x9652, 73059 },
+ { 0x9653, 73065 },
+ { 0x9654, 73071 },
+ { 0x9655, 73077 },
+ { 0x9656, 72614 },
+ { 0x9657, 72620 },
+ { 0x9658, 72626 },
+ { 0x9659, 72632 },
+ { 0x965A, 72638 },
+ { 0x965B, 72644 },
+ { 0x965C, 72650 },
+ { 0x965D, 72656 },
+ { 0x965E, 72662 },
+ { 0x965F, 72668 },
+ { 0x9660, 72674 },
+ { 0x9661, 72680 },
+ { 0x9662, 72686 },
+ { 0x9663, 72692 },
+ { 0x9664, 72698 },
+ { 0x9665, 72704 },
+ { 0x9666, 72710 },
+ { 0x9667, 72716 },
+ { 0x9668, 72722 },
+ { 0x9669, 72728 },
+ { 0x966A, 72734 },
+ { 0x966B, 72740 },
+ { 0x966C, 72746 },
+ { 0x966D, 72752 },
+ { 0x966E, 72758 },
+ { 0x966F, 72764 },
+ { 0x9670, 72146 },
+ { 0x9671, 72150 },
+ { 0x9672, 72154 },
+ { 0x9673, 72158 },
+ { 0x9674, 72162 },
+ { 0x9675, 72166 },
+ { 0x9676, 72170 },
+ { 0x9677, 72174 },
+ { 0x9678, 72178 },
+ { 0x9679, 72182 },
+ { 0x967A, 72186 },
+ { 0x967B, 72190 },
+ { 0x967C, 72194 },
+ { 0x967D, 72198 },
+ { 0x967E, 72202 },
+ { 0x967F, 72206 },
+ { 0x9680, 72210 },
+ { 0x9681, 72214 },
+ { 0x9682, 72218 },
+ { 0x9683, 72222 },
+ { 0x9684, 72226 },
+ { 0x9685, 72230 },
+ { 0x9686, 72234 },
+ { 0x9687, 72238 },
+ { 0x9688, 72242 },
+ { 0x9689, 72246 },
+ { 0x968A, 72042 },
+ { 0x968B, 72046 },
+ { 0x968C, 72050 },
+ { 0x968D, 72054 },
+ { 0x968E, 72058 },
+ { 0x968F, 72062 },
+ { 0x9690, 72066 },
+ { 0x9691, 72070 },
+ { 0x9692, 72074 },
+ { 0x9693, 72078 },
+ { 0x9694, 72082 },
+ { 0x9695, 72086 },
+ { 0x9696, 72090 },
+ { 0x9697, 72094 },
+ { 0x9698, 72098 },
+ { 0x9699, 72102 },
+ { 0x969A, 72106 },
+ { 0x969B, 72110 },
+ { 0x969C, 72114 },
+ { 0x969D, 72118 },
+ { 0x969E, 72122 },
+ { 0x969F, 72126 },
+ { 0x96A0, 72130 },
+ { 0x96A1, 72134 },
+ { 0x96A2, 72138 },
+ { 0x96A3, 72142 },
+ { 0x96A4, 71411 },
+ { 0x96A5, 71416 },
+ { 0x96A8, 70834 },
+ { 0x96A9, 70822 },
+ { 0x96AA, 70842 },
+ { 0x96AB, 70838 },
+ { 0x96AC, 70875 },
+ { 0x96AD, 70830 },
+ { 0x96AE, 70802 },
+ { 0x96AF, 70862 },
+ { 0x96B0, 70826 },
+ { 0x96B1, 70846 },
+ { 0x96B2, 70850 },
+ { 0x96B3, 70782 },
+ { 0x96B4, 70786 },
+ { 0x96B5, 70794 },
+ { 0x96B6, 70879 },
+ { 0x96B7, 70790 },
+ { 0x96B8, 70814 },
+ { 0x96B9, 70866 },
+ { 0x96BA, 70858 },
+ { 0x96BB, 70818 },
+ { 0x96BC, 70883 },
+ { 0x96BD, 70806 },
+ { 0x96BE, 70798 },
+ { 0x96BF, 70810 },
+ { 0x96C0, 70854 },
+ { 0x96C1, 69651 },
+ { 0x96C2, 69810 },
+ { 0x96C3, 69798 },
+ { 0x96C4, 69823 },
+ { 0x96C5, 69814 },
+ { 0x96C6, 69851 },
+ { 0x96C7, 69806 },
+ { 0x96C8, 69778 },
+ { 0x96C9, 69843 },
+ { 0x96CA, 69802 },
+ { 0x96CB, 69827 },
+ { 0x96CC, 69831 },
+ { 0x96CD, 69758 },
+ { 0x96CE, 69762 },
+ { 0x96CF, 69770 },
+ { 0x96D0, 69855 },
+ { 0x96D1, 69766 },
+ { 0x96D2, 69790 },
+ { 0x96D3, 69818 },
+ { 0x96D4, 69839 },
+ { 0x96D5, 69794 },
+ { 0x96D6, 69859 },
+ { 0x96D7, 69782 },
+ { 0x96D8, 69774 },
+ { 0x96D9, 69786 },
+ { 0x96DA, 69835 },
+ { 0x96DB, 71151 },
+ { 0x96DC, 70887 },
+ { 0x96DD, 69863 },
+ { 0x96DE, 69647 },
+ { 0x96DF, 69599 },
+ { 0x96E0, 69603 },
+ { 0x96E1, 69595 },
+ { 0x96E2, 71593 },
+ { 0x96E3, 71581 },
+ { 0x96E4, 71601 },
+ { 0x96E5, 71597 },
+ { 0x96E6, 71630 },
+ { 0x96E7, 71589 },
+ { 0x96E8, 71561 },
+ { 0x96E9, 71621 },
+ { 0x96EA, 71585 },
+ { 0x96EB, 71605 },
+ { 0x96EC, 71609 },
+ { 0x96ED, 71541 },
+ { 0x96EE, 71545 },
+ { 0x96EF, 71553 },
+ { 0x96F0, 71634 },
+ { 0x96F1, 71549 },
+ { 0x96F2, 71573 },
+ { 0x96F3, 71625 },
+ { 0x96F4, 71617 },
+ { 0x96F5, 71577 },
+ { 0x96F6, 71638 },
+ { 0x96F7, 71565 },
+ { 0x96F8, 71557 },
+ { 0x96F9, 71569 },
+ { 0x96FA, 71613 },
+ { 0x96FB, 71219 },
+ { 0x96FC, 71374 },
+ { 0x96FD, 71362 },
+ { 0x96FE, 71387 },
+ { 0x96FF, 71378 },
+ { 0x9700, 71421 },
+ { 0x9701, 71370 },
+ { 0x9702, 71342 },
+ { 0x9703, 71407 },
+ { 0x9704, 71366 },
+ { 0x9705, 71391 },
+ { 0x9706, 71395 },
+ { 0x9707, 71322 },
+ { 0x9708, 71326 },
+ { 0x9709, 71334 },
+ { 0x970A, 71425 },
+ { 0x970B, 71330 },
+ { 0x970C, 71354 },
+ { 0x970D, 71382 },
+ { 0x970E, 71403 },
+ { 0x970F, 71358 },
+ { 0x9710, 71429 },
+ { 0x9711, 71346 },
+ { 0x9712, 71338 },
+ { 0x9713, 71350 },
+ { 0x9714, 71399 },
+ { 0x9715, 71646 },
+ { 0x9716, 71642 },
+ { 0x9717, 71433 },
+ { 0x9718, 71215 },
+ { 0x9719, 71207 },
+ { 0x971A, 71211 },
+ { 0x971B, 71203 },
+ { 0x971C, 70347 },
+ { 0x971D, 70332 },
+ { 0x971E, 70357 },
+ { 0x971F, 70352 },
+ { 0x9720, 70393 },
+ { 0x9721, 70342 },
+ { 0x9722, 70307 },
+ { 0x9723, 70382 },
+ { 0x9724, 70337 },
+ { 0x9725, 70362 },
+ { 0x9726, 70367 },
+ { 0x9727, 70282 },
+ { 0x9728, 70287 },
+ { 0x9729, 70297 },
+ { 0x972A, 70398 },
+ { 0x972B, 70292 },
+ { 0x972C, 70322 },
+ { 0x972D, 70387 },
+ { 0x972E, 70377 },
+ { 0x972F, 70327 },
+ { 0x9730, 70403 },
+ { 0x9731, 70312 },
+ { 0x9732, 70302 },
+ { 0x9733, 70317 },
+ { 0x9734, 70372 },
+ { 0x9735, 69887 },
+ { 0x9736, 70086 },
+ { 0x9737, 70071 },
+ { 0x9738, 70102 },
+ { 0x9739, 70091 },
+ { 0x973A, 70132 },
+ { 0x973B, 70081 },
+ { 0x973C, 70046 },
+ { 0x973D, 70127 },
+ { 0x973E, 70076 },
+ { 0x973F, 70107 },
+ { 0x9740, 70112 },
+ { 0x9741, 70021 },
+ { 0x9742, 70026 },
+ { 0x9743, 70036 },
+ { 0x9744, 70137 },
+ { 0x9745, 70031 },
+ { 0x9746, 70061 },
+ { 0x9747, 70096 },
+ { 0x9748, 70122 },
+ { 0x9749, 70066 },
+ { 0x974A, 70142 },
+ { 0x974B, 70051 },
+ { 0x974C, 70041 },
+ { 0x974D, 70056 },
+ { 0x974E, 70117 },
+ { 0x974F, 70413 },
+ { 0x9750, 70408 },
+ { 0x9751, 70147 },
+ { 0x9752, 69882 },
+ { 0x9753, 69872 },
+ { 0x9754, 69877 },
+ { 0x9755, 69867 },
+ { 0x9756, 73441 },
+ { 0x9757, 73426 },
+ { 0x9758, 73451 },
+ { 0x9759, 73446 },
+ { 0x975A, 73487 },
+ { 0x975B, 73436 },
+ { 0x975C, 73401 },
+ { 0x975D, 73476 },
+ { 0x975E, 73431 },
+ { 0x975F, 73456 },
+ { 0x9760, 73461 },
+ { 0x9761, 73376 },
+ { 0x9762, 73381 },
+ { 0x9763, 73391 },
+ { 0x9764, 73492 },
+ { 0x9765, 73386 },
+ { 0x9766, 73416 },
+ { 0x9767, 73481 },
+ { 0x9768, 73471 },
+ { 0x9769, 73421 },
+ { 0x976A, 73497 },
+ { 0x976B, 73406 },
+ { 0x976C, 73396 },
+ { 0x976D, 73411 },
+ { 0x976E, 73466 },
+ { 0x976F, 72320 },
+ { 0x9770, 72519 },
+ { 0x9771, 72504 },
+ { 0x9772, 72535 },
+ { 0x9773, 72524 },
+ { 0x9774, 72565 },
+ { 0x9775, 72514 },
+ { 0x9776, 72479 },
+ { 0x9777, 72560 },
+ { 0x9778, 72509 },
+ { 0x9779, 72540 },
+ { 0x977A, 72545 },
+ { 0x977B, 72454 },
+ { 0x977C, 72459 },
+ { 0x977D, 72469 },
+ { 0x977E, 72570 },
+ { 0x977F, 72464 },
+ { 0x9780, 72494 },
+ { 0x9781, 72529 },
+ { 0x9782, 72555 },
+ { 0x9783, 72499 },
+ { 0x9784, 72575 },
+ { 0x9785, 72484 },
+ { 0x9786, 72474 },
+ { 0x9787, 72489 },
+ { 0x9788, 72550 },
+ { 0x9789, 73507 },
+ { 0x978A, 73502 },
+ { 0x978B, 72580 },
+ { 0x978C, 72315 },
+ { 0x978D, 72255 },
+ { 0x978E, 72260 },
+ { 0x978F, 72250 },
+ { 0x9790, 73161 },
+ { 0x9791, 73143 },
+ { 0x9792, 73173 },
+ { 0x9793, 73167 },
+ { 0x9794, 73216 },
+ { 0x9795, 73155 },
+ { 0x9796, 73113 },
+ { 0x9797, 73203 },
+ { 0x9798, 73149 },
+ { 0x9799, 73179 },
+ { 0x979A, 73185 },
+ { 0x979B, 73083 },
+ { 0x979C, 73089 },
+ { 0x979D, 73101 },
+ { 0x979E, 73222 },
+ { 0x979F, 73095 },
+ { 0x97A0, 73131 },
+ { 0x97A1, 73209 },
+ { 0x97A2, 73197 },
+ { 0x97A3, 73137 },
+ { 0x97A4, 73228 },
+ { 0x97A5, 73119 },
+ { 0x97A6, 73107 },
+ { 0x97A7, 73125 },
+ { 0x97A8, 73191 },
+ { 0x97A9, 72609 },
+ { 0x97AA, 72848 },
+ { 0x97AB, 72830 },
+ { 0x97AC, 72867 },
+ { 0x97AD, 72854 },
+ { 0x97AE, 72903 },
+ { 0x97AF, 72842 },
+ { 0x97B0, 72800 },
+ { 0x97B1, 72897 },
+ { 0x97B2, 72836 },
+ { 0x97B3, 72873 },
+ { 0x97B4, 72879 },
+ { 0x97B5, 72770 },
+ { 0x97B6, 72776 },
+ { 0x97B7, 72788 },
+ { 0x97B8, 72909 },
+ { 0x97B9, 72782 },
+ { 0x97BA, 72818 },
+ { 0x97BB, 72860 },
+ { 0x97BC, 72891 },
+ { 0x97BD, 72824 },
+ { 0x97BE, 72915 },
+ { 0x97BF, 72806 },
+ { 0x97C0, 72794 },
+ { 0x97C1, 72812 },
+ { 0x97C2, 72885 },
+ { 0x97C3, 73240 },
+ { 0x97C4, 73234 },
+ { 0x97C5, 72921 },
+ { 0x97C6, 72603 },
+ { 0x97C7, 72591 },
+ { 0x97C8, 72597 },
+ { 0x97C9, 72585 },
+ { 0x97CA, 70871 },
+ { 0x97CB, 69847 },
+ { 0x97CE, 69631 },
+ { 0x97CF, 69607 },
+ { 0x97D0, 69615 },
+ { 0x97D1, 69643 },
+ { 0x97D2, 69623 },
+ { 0x97D3, 69619 },
+ { 0x97D4, 69611 },
+ { 0x97D5, 69639 },
+ { 0x97D6, 69635 },
+ { 0x97D7, 69627 },
+ { 0x97D8, 74044 },
+ { 0x97D9, 74020 },
+ { 0x97DA, 74028 },
+ { 0x97DB, 74056 },
+ { 0x97DC, 74036 },
+ { 0x97DD, 74032 },
+ { 0x97DE, 74024 },
+ { 0x97DF, 74052 },
+ { 0x97E0, 74048 },
+ { 0x97E1, 74040 },
+ { 0x97E2, 73536 },
+ { 0x97E3, 73512 },
+ { 0x97E4, 73520 },
+ { 0x97E5, 73548 },
+ { 0x97E6, 73528 },
+ { 0x97E7, 73524 },
+ { 0x97E8, 73516 },
+ { 0x97E9, 73544 },
+ { 0x97EA, 73540 },
+ { 0x97EB, 73532 },
+ { 0x97EC, 72295 },
+ { 0x97ED, 72265 },
+ { 0x97EE, 72275 },
+ { 0x97EF, 72310 },
+ { 0x97F0, 72285 },
+ { 0x97F1, 72280 },
+ { 0x97F2, 72270 },
+ { 0x97F3, 72305 },
+ { 0x97F4, 72300 },
+ { 0x97F5, 72290 },
+ { 0x97F6, 72026 },
+ { 0x97F7, 72002 },
+ { 0x97F8, 72010 },
+ { 0x97F9, 72038 },
+ { 0x97FA, 72018 },
+ { 0x97FB, 72014 },
+ { 0x97FC, 72006 },
+ { 0x97FD, 72034 },
+ { 0x97FE, 72030 },
+ { 0x97FF, 72022 },
+ { 0xA000, 41048 },
+ { 0xA001, 41145 },
+ { 0xA002, 41100 },
+ { 0xA003, 41126 },
+ { 0xA004, 41011 },
+ { 0xA005, 41119 },
+ { 0xA006, 41164 },
+ { 0xA007, 41006 },
+ { 0xA008, 41040 },
+ { 0xA009, 41159 },
+ { 0xA00A, 41077 },
+ { 0xA00B, 41062 },
+ { 0xA00C, 41025 },
+ { 0xA00D, 41140 },
+ { 0xA00E, 41114 },
+ { 0xA00F, 41092 },
+ { 0xA010, 40996 },
+ { 0xA011, 41030 },
+ { 0xA012, 41149 },
+ { 0xA013, 41067 },
+ { 0xA014, 41052 },
+ { 0xA015, 41015 },
+ { 0xA016, 41130 },
+ { 0xA017, 41104 },
+ { 0xA018, 41082 },
+ { 0xA019, 41001 },
+ { 0xA01A, 41035 },
+ { 0xA01B, 41154 },
+ { 0xA01C, 41072 },
+ { 0xA01D, 41057 },
+ { 0xA01E, 41020 },
+ { 0xA01F, 41135 },
+ { 0xA020, 41109 },
+ { 0xA021, 41087 },
+ { 0xA022, 41097 },
+ { 0xA023, 41174 },
+ { 0xA024, 41171 },
+ { 0xA025, 41186 },
+ { 0xA026, 41177 },
+ { 0xA027, 41180 },
+ { 0xA028, 41168 },
+ { 0xA029, 41183 },
+ { 0xA02A, 41123 },
+ { 0xA02B, 41045 },
+ { 0xA030, 31231 },
+ { 0xA031, 31382 },
+ { 0xA032, 31385 },
+ { 0xA033, 31388 },
+ { 0xA034, 31391 },
+ { 0xA035, 31394 },
+ { 0xA036, 31397 },
+ { 0xA037, 31400 },
+ { 0xA038, 31403 },
+ { 0xA039, 31406 },
+ { 0xA03A, 31409 },
+ { 0xA03B, 31412 },
+ { 0xA03C, 31415 },
+ { 0xA03D, 31418 },
+ { 0xA03E, 31421 },
+ { 0xA03F, 31424 },
+ { 0xA040, 31427 },
+ { 0xA041, 31430 },
+ { 0xA042, 31433 },
+ { 0xA043, 31436 },
+ { 0xA044, 31439 },
+ { 0xA045, 31442 },
+ { 0xA046, 31445 },
+ { 0xA047, 31448 },
+ { 0xA048, 31451 },
+ { 0xA049, 31454 },
+ { 0xA04A, 31457 },
+ { 0xA04B, 31460 },
+ { 0xA04C, 31463 },
+ { 0xA04D, 31466 },
+ { 0xA04E, 31469 },
+ { 0xA04F, 31472 },
+ { 0xA050, 31475 },
+ { 0xA051, 31478 },
+ { 0xA052, 31481 },
+ { 0xA053, 31484 },
+ { 0xA054, 31487 },
+ { 0xA055, 31490 },
+ { 0xA056, 31493 },
+ { 0xA057, 31496 },
+ { 0xA058, 31499 },
+ { 0xA059, 31502 },
+ { 0xA05A, 31505 },
+ { 0xA05B, 31508 },
+ { 0xA05C, 31511 },
+ { 0xA05D, 31514 },
+ { 0xA05E, 31517 },
+ { 0xA05F, 31520 },
+ { 0xA060, 31523 },
+ { 0xA061, 31526 },
+ { 0xA062, 31227 },
+ { 0xA063, 31235 },
+ { 0xA064, 31238 },
+ { 0xA065, 31241 },
+ { 0xA066, 31244 },
+ { 0xA067, 31247 },
+ { 0xA068, 31250 },
+ { 0xA069, 31253 },
+ { 0xA06A, 31256 },
+ { 0xA06B, 31259 },
+ { 0xA06C, 31262 },
+ { 0xA06D, 31265 },
+ { 0xA06E, 31268 },
+ { 0xA06F, 31271 },
+ { 0xA070, 31274 },
+ { 0xA071, 31277 },
+ { 0xA072, 31280 },
+ { 0xA073, 31283 },
+ { 0xA074, 31286 },
+ { 0xA075, 31289 },
+ { 0xA076, 31292 },
+ { 0xA077, 31295 },
+ { 0xA078, 31298 },
+ { 0xA079, 31301 },
+ { 0xA07A, 31304 },
+ { 0xA07B, 31307 },
+ { 0xA07C, 31310 },
+ { 0xA07D, 31313 },
+ { 0xA07E, 31316 },
+ { 0xA07F, 31319 },
+ { 0xA080, 31322 },
+ { 0xA081, 31325 },
+ { 0xA082, 31328 },
+ { 0xA083, 31331 },
+ { 0xA084, 31334 },
+ { 0xA085, 31337 },
+ { 0xA086, 31340 },
+ { 0xA087, 31343 },
+ { 0xA088, 31346 },
+ { 0xA089, 31349 },
+ { 0xA08A, 31352 },
+ { 0xA08B, 31355 },
+ { 0xA08C, 31358 },
+ { 0xA08D, 31361 },
+ { 0xA08E, 31364 },
+ { 0xA08F, 31367 },
+ { 0xA090, 31370 },
+ { 0xA091, 31373 },
+ { 0xA092, 31376 },
+ { 0xA093, 31379 },
+ { 0xC001, 53726 },
+ { 0xC020, 7517 },
+ { 0xC021, 7564 },
+ { 0xC022, 7551 },
+ { 0xC023, 7527 },
+ { 0xC024, 7521 },
+ { 0xC025, 7530 },
+ { 0xC026, 7546 },
+ { 0xC027, 7556 },
+ { 0xC028, 7203 },
+ { 0xC029, 7514 },
+ { 0xC02A, 7538 },
+ { 0xC02B, 7206 },
+ { 0xC02C, 7211 },
+ { 0xC02D, 7570 },
+ { 0xC02E, 7192 },
+ { 0xC02F, 7536 },
+ { 0xC030, 7231 },
+ { 0xC031, 7213 },
+ { 0xC032, 7219 },
+ { 0xC033, 7240 },
+ { 0xC034, 7225 },
+ { 0xC035, 7222 },
+ { 0xC036, 7216 },
+ { 0xC037, 7237 },
+ { 0xC038, 7234 },
+ { 0xC039, 7228 },
+ { 0xC03A, 7209 },
+ { 0xC03B, 7554 },
+ { 0xC03C, 7548 },
+ { 0xC03D, 7524 },
+ { 0xC03E, 7567 },
+ { 0xC03F, 7540 },
+ { 0xC040, 7561 },
+ { 0xC041, 7376 },
+ { 0xC042, 7381 },
+ { 0xC043, 7386 },
+ { 0xC044, 7391 },
+ { 0xC045, 7396 },
+ { 0xC046, 7401 },
+ { 0xC047, 7406 },
+ { 0xC048, 7411 },
+ { 0xC049, 7416 },
+ { 0xC04A, 7421 },
+ { 0xC04B, 7426 },
+ { 0xC04C, 7431 },
+ { 0xC04D, 7436 },
+ { 0xC04E, 7441 },
+ { 0xC04F, 7446 },
+ { 0xC050, 7451 },
+ { 0xC051, 7456 },
+ { 0xC052, 7461 },
+ { 0xC053, 7466 },
+ { 0xC054, 7471 },
+ { 0xC055, 7476 },
+ { 0xC056, 7481 },
+ { 0xC057, 7486 },
+ { 0xC058, 7491 },
+ { 0xC059, 7496 },
+ { 0xC05A, 7501 },
+ { 0xC05B, 7199 },
+ { 0xC05C, 7533 },
+ { 0xC05D, 7510 },
+ { 0xC05E, 7558 },
+ { 0xC05F, 7189 },
+ { 0xC060, 7243 },
+ { 0xC061, 7246 },
+ { 0xC062, 7251 },
+ { 0xC063, 7256 },
+ { 0xC064, 7261 },
+ { 0xC065, 7266 },
+ { 0xC066, 7271 },
+ { 0xC067, 7276 },
+ { 0xC068, 7281 },
+ { 0xC069, 7286 },
+ { 0xC06A, 7291 },
+ { 0xC06B, 7296 },
+ { 0xC06C, 7301 },
+ { 0xC06D, 7306 },
+ { 0xC06E, 7311 },
+ { 0xC06F, 7316 },
+ { 0xC070, 7321 },
+ { 0xC071, 7326 },
+ { 0xC072, 7331 },
+ { 0xC073, 7336 },
+ { 0xC074, 7341 },
+ { 0xC075, 7346 },
+ { 0xC076, 7351 },
+ { 0xC077, 7356 },
+ { 0xC078, 7361 },
+ { 0xC079, 7366 },
+ { 0xC07A, 7371 },
+ { 0xC07B, 7195 },
+ { 0xC07C, 7543 },
+ { 0xC07D, 7506 },
+ { 0xC07E, 7519 },
+ { 0xC07F, 30315 },
+ { 0xC100, 66346 },
+ { 0xC101, 66348 },
+ { 0xC102, 66350 },
+ { 0xC103, 66352 },
+ { 0xC104, 66354 },
+ { 0xC105, 66356 },
+ { 0xC106, 66358 },
+ { 0xC107, 66360 },
+ { 0xC108, 66362 },
+ { 0xC109, 66364 },
+ { 0xC10A, 66366 },
+ { 0xC10B, 66368 },
+ { 0xC10C, 66370 },
+ { 0xC10D, 66372 },
+ { 0xC10E, 66374 },
+ { 0xC10F, 66376 },
+ { 0xC110, 66378 },
+ { 0xC111, 66380 },
+ { 0xC112, 66382 },
+ { 0xC113, 66384 },
+ { 0xC114, 66386 },
+ { 0xC115, 66388 },
+ { 0xC116, 66390 },
+ { 0xC117, 66392 },
+ { 0xC118, 66394 },
+ { 0xC119, 66396 },
+ { 0xC11A, 66398 },
+ { 0xC11B, 66400 },
+ { 0xC11C, 66402 },
+ { 0xC11D, 66404 },
+ { 0xC11E, 66406 },
+ { 0xC11F, 66408 },
+ { 0xC120, 66410 },
+ { 0xC121, 66412 },
+ { 0xC122, 66414 },
+ { 0xC123, 66416 },
+ { 0xC124, 66418 },
+ { 0xC125, 66420 },
+ { 0xC126, 66422 },
+ { 0xC127, 66424 },
+ { 0xC128, 66426 },
+ { 0xC129, 66428 },
+ { 0xC12A, 66430 },
+ { 0xC12B, 66432 },
+ { 0xC12C, 66434 },
+ { 0xC12D, 66436 },
+ { 0xC12E, 66438 },
+ { 0xC12F, 66440 },
+ { 0xC130, 66442 },
+ { 0xC131, 66444 },
+ { 0xC132, 66446 },
+ { 0xC133, 66448 },
+ { 0xC134, 66450 },
+ { 0xC135, 66452 },
+ { 0xC136, 66454 },
+ { 0xC137, 66456 },
+ { 0xC138, 66458 },
+ { 0xC139, 66460 },
+ { 0xC13A, 66462 },
+ { 0xC13B, 66464 },
+ { 0xC13C, 66466 },
+ { 0xC13D, 66468 },
+ { 0xC13E, 66470 },
+ { 0xC13F, 66472 },
+ { 0xC140, 66474 },
+ { 0xC141, 66476 },
+ { 0xC142, 66478 },
+ { 0xC143, 66480 },
+ { 0xC144, 66482 },
+ { 0xC145, 66484 },
+ { 0xC146, 66486 },
+ { 0xC147, 66488 },
+ { 0xC148, 66490 },
+ { 0xC149, 66492 },
+ { 0xC14A, 66494 },
+ { 0xC14B, 66496 },
+ { 0xC14C, 66498 },
+ { 0xC14D, 66500 },
+ { 0xC14E, 66502 },
+ { 0xC14F, 66504 },
+ { 0xC150, 66506 },
+ { 0xC151, 66508 },
+ { 0xC152, 66510 },
+ { 0xC153, 66512 },
+ { 0xC154, 66514 },
+ { 0xC155, 66516 },
+ { 0xC156, 66518 },
+ { 0xC157, 66520 },
+ { 0xC158, 66522 },
+ { 0xC159, 66524 },
+ { 0xC15A, 66526 },
+ { 0xC15B, 66528 },
+ { 0xC15C, 66530 },
+ { 0xC15D, 66532 },
+ { 0xC15E, 66534 },
+ { 0xC15F, 66536 },
+ { 0xC160, 66538 },
+ { 0xC161, 66540 },
+ { 0xC162, 66542 },
+ { 0xC163, 66544 },
+ { 0xC164, 66546 },
+ { 0xC165, 66548 },
+ { 0xC166, 66550 },
+ { 0xC167, 66552 },
+ { 0xC168, 66554 },
+ { 0xC169, 66556 },
+ { 0xC16A, 66558 },
+ { 0xC16B, 66560 },
+ { 0xC16C, 66562 },
+ { 0xC16D, 66564 },
+ { 0xC16E, 66566 },
+ { 0xC16F, 66568 },
+ { 0xC170, 66570 },
+ { 0xC171, 66572 },
+ { 0xC172, 66574 },
+ { 0xC173, 66576 },
+ { 0xC174, 66578 },
+ { 0xC175, 66580 },
+ { 0xC176, 66582 },
+ { 0xC177, 66584 },
+ { 0xC178, 66586 },
+ { 0xC179, 66588 },
+ { 0xC17A, 66590 },
+ { 0xC17B, 66592 },
+ { 0xC17C, 66594 },
+ { 0xC17D, 66596 },
+ { 0xC17E, 66598 },
+ { 0xC17F, 66600 },
+ { 0xC180, 66602 },
+ { 0xC181, 66604 },
+ { 0xC182, 66606 },
+ { 0xC183, 66608 },
+ { 0xC184, 66610 },
+ { 0xC185, 66612 },
+ { 0xC186, 66614 },
+ { 0xC187, 66616 },
+ { 0xC188, 66618 },
+ { 0xC189, 66620 },
+ { 0xC18A, 66622 },
+ { 0xC18B, 66624 },
+ { 0xC18C, 66626 },
+ { 0xC18D, 66628 },
+ { 0xC18E, 66630 },
+ { 0xC18F, 66632 },
+ { 0xC190, 66634 },
+ { 0xC191, 66636 },
+ { 0xC192, 66638 },
+ { 0xC193, 66640 },
+ { 0xC194, 66642 },
+ { 0xC195, 66644 },
+ { 0xC196, 66646 },
+ { 0xC197, 66648 },
+ { 0xC198, 66650 },
+ { 0xC199, 66652 },
+ { 0xC19A, 66654 },
+ { 0xC19B, 66656 },
+ { 0xC19C, 66658 },
+ { 0xC19D, 66660 },
+ { 0xC19E, 66662 },
+ { 0xC19F, 66664 },
+ { 0xC1A0, 66666 },
+ { 0xC1A1, 66668 },
+ { 0xC1A2, 66670 },
+ { 0xC1A3, 66672 },
+ { 0xC1A4, 66674 },
+ { 0xC1A5, 66676 },
+ { 0xC1A6, 66678 },
+ { 0xC1A7, 66680 },
+ { 0xC1A8, 66682 },
+ { 0xC1A9, 66684 },
+ { 0xC1AA, 66686 },
+ { 0xC1AB, 66688 },
+ { 0xC1AC, 66690 },
+ { 0xC1AD, 66692 },
+ { 0xC1AE, 66694 },
+ { 0xC1AF, 66696 },
+ { 0xC1B0, 66698 },
+ { 0xC1B1, 66700 },
+ { 0xC1B2, 66702 },
+ { 0xC1B3, 66704 },
+ { 0xC1B4, 66706 },
+ { 0xC1B5, 66708 },
+ { 0xC1B6, 66710 },
+ { 0xC1B7, 66712 },
+ { 0xC1B8, 66714 },
+ { 0xC1B9, 66716 },
+ { 0xC1BA, 66718 },
+ { 0xC1BB, 66720 },
+ { 0xC1BC, 66722 },
+ { 0xC1BD, 66724 },
+ { 0xC1BE, 66726 },
+ { 0xC1BF, 66728 },
+ { 0xC1C0, 66730 },
+ { 0xC1C1, 66732 },
+ { 0xC1C2, 66734 },
+ { 0xC1C3, 66736 },
+ { 0xC1C4, 66738 },
+ { 0xC1C5, 66740 },
+ { 0xC1C6, 66742 },
+ { 0xC1C7, 66744 },
+ { 0xC1C8, 66746 },
+ { 0xC1C9, 66748 },
+ { 0xC1CA, 66750 },
+ { 0xC1CB, 66752 },
+ { 0xC1CC, 66754 },
+ { 0xC1CD, 66756 },
+ { 0xC1CE, 66758 },
+ { 0xC1CF, 66760 },
+ { 0xC1D0, 66762 },
+ { 0xC1D1, 66764 },
+ { 0xC1D2, 66766 },
+ { 0xC1D3, 66768 },
+ { 0xC1D4, 66770 },
+ { 0xC1D5, 66772 },
+ { 0xC1D6, 66774 },
+ { 0xC1D7, 66776 },
+ { 0xC1D8, 66778 },
+ { 0xC1D9, 66780 },
+ { 0xC1DA, 66782 },
+ { 0xC1DB, 66784 },
+ { 0xC1DC, 66786 },
+ { 0xC1DD, 66788 },
+ { 0xC1DE, 66790 },
+ { 0xC1DF, 66792 },
+ { 0xC1E0, 66794 },
+ { 0xC1E1, 66796 },
+ { 0xC1E2, 66798 },
+ { 0xC1E3, 66800 },
+ { 0xC1E4, 66802 },
+ { 0xC1E5, 66804 },
+ { 0xC1E6, 66806 },
+ { 0xC1E7, 66808 },
+ { 0xC1E8, 66810 },
+ { 0xC1E9, 66812 },
+ { 0xC1EA, 66814 },
+ { 0xC1EB, 66816 },
+ { 0xC1EC, 66818 },
+ { 0xC1ED, 66820 },
+ { 0xC1EE, 66822 },
+ { 0xC1EF, 66824 },
+};
+#define UNICODE_CHARNAME_MAX_LENGTH 83
+#define UNICODE_CHARNAME_MAX_WORDS 13
diff --git a/gnulib/lib/uninorm.h b/gnulib/lib/uninorm.h
new file mode 100644
index 00000000..206ee406
--- /dev/null
+++ b/gnulib/lib/uninorm.h
@@ -0,0 +1,245 @@
+/* Normalization forms (composition and decomposition) of Unicode strings.
+ Copyright (C) 2001-2002, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNINORM_H
+#define _UNINORM_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ 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. */
+
+
+enum
+{
+ UC_DECOMP_CANONICAL,/* Canonical decomposition. */
+ UC_DECOMP_FONT, /* <font> A font variant (e.g. a blackletter form). */
+ UC_DECOMP_NOBREAK, /* <noBreak> A no-break version of a space or hyphen. */
+ UC_DECOMP_INITIAL, /* <initial> An initial presentation form (Arabic). */
+ UC_DECOMP_MEDIAL, /* <medial> A medial presentation form (Arabic). */
+ UC_DECOMP_FINAL, /* <final> A final presentation form (Arabic). */
+ UC_DECOMP_ISOLATED,/* <isolated> An isolated presentation form (Arabic). */
+ UC_DECOMP_CIRCLE, /* <circle> An encircled form. */
+ UC_DECOMP_SUPER, /* <super> A superscript form. */
+ UC_DECOMP_SUB, /* <sub> A subscript form. */
+ UC_DECOMP_VERTICAL,/* <vertical> A vertical layout presentation form. */
+ UC_DECOMP_WIDE, /* <wide> A wide (or zenkaku) compatibility character. */
+ UC_DECOMP_NARROW, /* <narrow> A narrow (or hankaku) compatibility character. */
+ UC_DECOMP_SMALL, /* <small> A small variant form (CNS compatibility). */
+ UC_DECOMP_SQUARE, /* <square> A CJK squared font variant. */
+ UC_DECOMP_FRACTION,/* <fraction> A vulgar fraction form. */
+ UC_DECOMP_COMPAT /* <compat> Otherwise unspecified compatibility character. */
+};
+
+/* Maximum size of decomposition of a single Unicode character. */
+#define UC_DECOMPOSITION_MAX_LENGTH 32
+
+/* Return the character decomposition mapping of a Unicode character.
+ 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. */
+extern int
+ uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition);
+
+/* Return the canonical character decomposition mapping of a Unicode character.
+ 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. */
+extern int
+ uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition);
+
+
+/* Attempt to combine the Unicode characters uc1, uc2.
+ uc1 is known to have canonical combining class 0.
+ Return the combination of uc1 and uc2, if it exists.
+ Return 0 otherwise.
+ Not all decompositions can be recombined using this function. See the
+ Unicode file CompositionExclusions.txt for details. */
+extern ucs4_t
+ uc_composition (ucs4_t uc1, ucs4_t uc2);
+
+
+/* An object of type uninorm_t denotes a Unicode normalization form. */
+struct unicode_normalization_form;
+typedef const struct unicode_normalization_form *uninorm_t;
+
+/* UNINORM_NFD: Normalization form D: canonical decomposition. */
+extern const struct unicode_normalization_form uninorm_nfd;
+#define UNINORM_NFD (&uninorm_nfd)
+
+/* UNINORM_NFC: Normalization form C: canonical decomposition, then
+ canonical composition. */
+extern const struct unicode_normalization_form uninorm_nfc;
+#define UNINORM_NFC (&uninorm_nfc)
+
+/* UNINORM_NFKD: Normalization form KD: compatibility decomposition. */
+extern const struct unicode_normalization_form uninorm_nfkd;
+#define UNINORM_NFKD (&uninorm_nfkd)
+
+/* UNINORM_NFKC: Normalization form KC: compatibility decomposition, then
+ canonical composition. */
+extern const struct unicode_normalization_form uninorm_nfkc;
+#define UNINORM_NFKC (&uninorm_nfkc)
+
+/* Test whether a normalization form does compatibility decomposition. */
+#define uninorm_is_compat_decomposing(nf) \
+ ((* (const unsigned int *) (nf) >> 0) & 1)
+
+/* Test whether a normalization form includes canonical composition. */
+#define uninorm_is_composing(nf) \
+ ((* (const unsigned int *) (nf) >> 1) & 1)
+
+/* Return the decomposing variant of a normalization form.
+ This maps NFC,NFD -> NFD and NFKC,NFKD -> NFKD. */
+extern uninorm_t uninorm_decomposing_form (uninorm_t nf);
+
+
+/* Return the specified normalization form of a string. */
+extern uint8_t *
+ u8_normalize (uninorm_t nf, const uint8_t *s, size_t n,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_normalize (uninorm_t nf, const uint16_t *s, size_t n,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_normalize (uninorm_t nf, const uint32_t *s, size_t n,
+ uint32_t *resultbuf, size_t *lengthp);
+
+
+/* Compare S1 and S2, ignoring differences in normalization.
+ NF must be either UNINORM_NFD or UNINORM_NFKD.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_normcmp (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u16_normcmp (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u32_normcmp (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+
+
+/* Converts the string S of length N to a NUL-terminated byte sequence, in such
+ a way that comparing uN_normxfrm (S1) and uN_normxfrm (S2) with uN_cmp2() is
+ equivalent to comparing S1 and S2 with uN_normcoll().
+ NF must be either UNINORM_NFC or UNINORM_NFKC. */
+extern char *
+ u8_normxfrm (const uint8_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+extern char *
+ u16_normxfrm (const uint16_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+extern char *
+ u32_normxfrm (const uint32_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+
+
+/* Compare 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, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_normcoll (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u16_normcoll (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u32_normcoll (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+
+
+/* Normalization of a stream 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. */
+
+/* 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. */
+struct uninorm_filter;
+
+/* Create and return 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.
+ Return the new filter, or NULL with errno set upon failure. */
+extern struct uninorm_filter *
+ uninorm_filter_create (uninorm_t nf,
+ int (*stream_func) (void *stream_data, ucs4_t uc),
+ void *stream_data);
+
+/* Stuff a Unicode character into a normalizing filter.
+ Return 0 if successful, or -1 with errno set upon failure. */
+extern int
+ uninorm_filter_write (struct uninorm_filter *filter, ucs4_t uc);
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream.
+ Return 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. */
+extern int
+ uninorm_filter_flush (struct uninorm_filter *filter);
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream, then close and free the filter.
+ Return 0 if successful, or -1 with errno set upon failure. */
+extern int
+ uninorm_filter_free (struct uninorm_filter *filter);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNINORM_H */
diff --git a/gnulib/lib/uninorm/canonical-decomposition.c b/gnulib/lib/uninorm/canonical-decomposition.c
new file mode 100644
index 00000000..e6e39e0b
--- /dev/null
+++ b/gnulib/lib/uninorm/canonical-decomposition.c
@@ -0,0 +1,108 @@
+/* Canonical decomposition of Unicode characters.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <stdlib.h>
+
+#include "decomposition-table.h"
+
+int
+uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition)
+{
+ if (uc >= 0xAC00 && uc < 0xD7A4)
+ {
+ /* Hangul syllable. See Unicode standard, chapter 3, section
+ "Hangul Syllable Decomposition", See also the clarification at
+ <http://www.unicode.org/versions/Unicode5.1.0/>, section
+ "Clarification of Hangul Jamo Handling". */
+ unsigned int t;
+
+ uc -= 0xAC00;
+ t = uc % 28;
+
+ if (t == 0)
+ {
+ unsigned int v, l;
+
+ uc = uc / 28;
+ v = uc % 21;
+ l = uc / 21;
+
+ decomposition[0] = 0x1100 + l;
+ decomposition[1] = 0x1161 + v;
+ return 2;
+ }
+ else
+ {
+#if 1 /* Return the pairwise decomposition, not the full decomposition. */
+ decomposition[0] = 0xAC00 + uc - t; /* = 0xAC00 + (l * 21 + v) * 28; */
+ decomposition[1] = 0x11A7 + t;
+ return 2;
+#else
+ unsigned int v, l;
+
+ uc = uc / 28;
+ v = uc % 21;
+ l = uc / 21;
+
+ decomposition[0] = 0x1100 + l;
+ decomposition[1] = 0x1161 + v;
+ decomposition[2] = 0x11A7 + t;
+ return 3;
+#endif
+ }
+ }
+ else if (uc < 0x110000)
+ {
+ unsigned short entry = decomp_index (uc);
+ /* An entry of (unsigned short)(-1) denotes an absent entry.
+ Otherwise, bit 15 of the entry tells whether the decomposition
+ is a canonical one. */
+ if (entry < 0x8000)
+ {
+ const unsigned char *p;
+ unsigned int element;
+ unsigned int length;
+
+ p = &gl_uninorm_decomp_chars_table[3 * entry];
+ element = (p[0] << 16) | (p[1] << 8) | p[2];
+ /* The first element has 5 bits for the decomposition type. */
+ if (((element >> 18) & 0x1f) != UC_DECOMP_CANONICAL)
+ abort ();
+ length = 1;
+ for (;;)
+ {
+ /* Every element has an 18 bits wide Unicode code point. */
+ *decomposition = element & 0x3ffff;
+ /* Bit 23 tells whether there are more elements, */
+ if ((element & (1 << 23)) == 0)
+ break;
+ p += 3;
+ element = (p[0] << 16) | (p[1] << 8) | p[2];
+ decomposition++;
+ length++;
+ }
+ return length;
+ }
+ }
+ return -1;
+}
+
diff --git a/gnulib/lib/uninorm/compat-decomposition.c b/gnulib/lib/uninorm/compat-decomposition.c
new file mode 100644
index 00000000..740cc5c7
--- /dev/null
+++ b/gnulib/lib/uninorm/compat-decomposition.c
@@ -0,0 +1,31 @@
+/* Compatibility decomposition of Unicode characters.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "decompose-internal.h"
+
+#include "uninorm.h"
+
+int
+uc_compat_decomposition (ucs4_t uc, ucs4_t *decomposition)
+{
+ int tag;
+
+ return uc_decomposition (uc, &tag, decomposition);
+}
diff --git a/gnulib/lib/uninorm/composition-table.gperf b/gnulib/lib/uninorm/composition-table.gperf
new file mode 100644
index 00000000..71866bb8
--- /dev/null
+++ b/gnulib/lib/uninorm/composition-table.gperf
@@ -0,0 +1,958 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Canonical composition of Unicode characters. */
+/* Generated automatically by gen-uni-tables for Unicode 5.1.0. */
+
+/* Copyright (C) 2009-2010 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/>. */
+
+struct composition_rule { char codes[4]; };
+%struct-type
+%language=ANSI-C
+%define slot-name codes
+%define hash-function-name gl_uninorm_compose_hash
+%define lookup-function-name gl_uninorm_compose_lookup
+%compare-lengths
+%compare-strncmp
+%readonly-tables
+%omit-struct-type
+%%
+"\x00\x41\x03\x00", 0x00c0
+"\x00\x41\x03\x01", 0x00c1
+"\x00\x41\x03\x02", 0x00c2
+"\x00\x41\x03\x03", 0x00c3
+"\x00\x41\x03\x08", 0x00c4
+"\x00\x41\x03\x0a", 0x00c5
+"\x00\x43\x03\x27", 0x00c7
+"\x00\x45\x03\x00", 0x00c8
+"\x00\x45\x03\x01", 0x00c9
+"\x00\x45\x03\x02", 0x00ca
+"\x00\x45\x03\x08", 0x00cb
+"\x00\x49\x03\x00", 0x00cc
+"\x00\x49\x03\x01", 0x00cd
+"\x00\x49\x03\x02", 0x00ce
+"\x00\x49\x03\x08", 0x00cf
+"\x00\x4e\x03\x03", 0x00d1
+"\x00\x4f\x03\x00", 0x00d2
+"\x00\x4f\x03\x01", 0x00d3
+"\x00\x4f\x03\x02", 0x00d4
+"\x00\x4f\x03\x03", 0x00d5
+"\x00\x4f\x03\x08", 0x00d6
+"\x00\x55\x03\x00", 0x00d9
+"\x00\x55\x03\x01", 0x00da
+"\x00\x55\x03\x02", 0x00db
+"\x00\x55\x03\x08", 0x00dc
+"\x00\x59\x03\x01", 0x00dd
+"\x00\x61\x03\x00", 0x00e0
+"\x00\x61\x03\x01", 0x00e1
+"\x00\x61\x03\x02", 0x00e2
+"\x00\x61\x03\x03", 0x00e3
+"\x00\x61\x03\x08", 0x00e4
+"\x00\x61\x03\x0a", 0x00e5
+"\x00\x63\x03\x27", 0x00e7
+"\x00\x65\x03\x00", 0x00e8
+"\x00\x65\x03\x01", 0x00e9
+"\x00\x65\x03\x02", 0x00ea
+"\x00\x65\x03\x08", 0x00eb
+"\x00\x69\x03\x00", 0x00ec
+"\x00\x69\x03\x01", 0x00ed
+"\x00\x69\x03\x02", 0x00ee
+"\x00\x69\x03\x08", 0x00ef
+"\x00\x6e\x03\x03", 0x00f1
+"\x00\x6f\x03\x00", 0x00f2
+"\x00\x6f\x03\x01", 0x00f3
+"\x00\x6f\x03\x02", 0x00f4
+"\x00\x6f\x03\x03", 0x00f5
+"\x00\x6f\x03\x08", 0x00f6
+"\x00\x75\x03\x00", 0x00f9
+"\x00\x75\x03\x01", 0x00fa
+"\x00\x75\x03\x02", 0x00fb
+"\x00\x75\x03\x08", 0x00fc
+"\x00\x79\x03\x01", 0x00fd
+"\x00\x79\x03\x08", 0x00ff
+"\x00\x41\x03\x04", 0x0100
+"\x00\x61\x03\x04", 0x0101
+"\x00\x41\x03\x06", 0x0102
+"\x00\x61\x03\x06", 0x0103
+"\x00\x41\x03\x28", 0x0104
+"\x00\x61\x03\x28", 0x0105
+"\x00\x43\x03\x01", 0x0106
+"\x00\x63\x03\x01", 0x0107
+"\x00\x43\x03\x02", 0x0108
+"\x00\x63\x03\x02", 0x0109
+"\x00\x43\x03\x07", 0x010a
+"\x00\x63\x03\x07", 0x010b
+"\x00\x43\x03\x0c", 0x010c
+"\x00\x63\x03\x0c", 0x010d
+"\x00\x44\x03\x0c", 0x010e
+"\x00\x64\x03\x0c", 0x010f
+"\x00\x45\x03\x04", 0x0112
+"\x00\x65\x03\x04", 0x0113
+"\x00\x45\x03\x06", 0x0114
+"\x00\x65\x03\x06", 0x0115
+"\x00\x45\x03\x07", 0x0116
+"\x00\x65\x03\x07", 0x0117
+"\x00\x45\x03\x28", 0x0118
+"\x00\x65\x03\x28", 0x0119
+"\x00\x45\x03\x0c", 0x011a
+"\x00\x65\x03\x0c", 0x011b
+"\x00\x47\x03\x02", 0x011c
+"\x00\x67\x03\x02", 0x011d
+"\x00\x47\x03\x06", 0x011e
+"\x00\x67\x03\x06", 0x011f
+"\x00\x47\x03\x07", 0x0120
+"\x00\x67\x03\x07", 0x0121
+"\x00\x47\x03\x27", 0x0122
+"\x00\x67\x03\x27", 0x0123
+"\x00\x48\x03\x02", 0x0124
+"\x00\x68\x03\x02", 0x0125
+"\x00\x49\x03\x03", 0x0128
+"\x00\x69\x03\x03", 0x0129
+"\x00\x49\x03\x04", 0x012a
+"\x00\x69\x03\x04", 0x012b
+"\x00\x49\x03\x06", 0x012c
+"\x00\x69\x03\x06", 0x012d
+"\x00\x49\x03\x28", 0x012e
+"\x00\x69\x03\x28", 0x012f
+"\x00\x49\x03\x07", 0x0130
+"\x00\x4a\x03\x02", 0x0134
+"\x00\x6a\x03\x02", 0x0135
+"\x00\x4b\x03\x27", 0x0136
+"\x00\x6b\x03\x27", 0x0137
+"\x00\x4c\x03\x01", 0x0139
+"\x00\x6c\x03\x01", 0x013a
+"\x00\x4c\x03\x27", 0x013b
+"\x00\x6c\x03\x27", 0x013c
+"\x00\x4c\x03\x0c", 0x013d
+"\x00\x6c\x03\x0c", 0x013e
+"\x00\x4e\x03\x01", 0x0143
+"\x00\x6e\x03\x01", 0x0144
+"\x00\x4e\x03\x27", 0x0145
+"\x00\x6e\x03\x27", 0x0146
+"\x00\x4e\x03\x0c", 0x0147
+"\x00\x6e\x03\x0c", 0x0148
+"\x00\x4f\x03\x04", 0x014c
+"\x00\x6f\x03\x04", 0x014d
+"\x00\x4f\x03\x06", 0x014e
+"\x00\x6f\x03\x06", 0x014f
+"\x00\x4f\x03\x0b", 0x0150
+"\x00\x6f\x03\x0b", 0x0151
+"\x00\x52\x03\x01", 0x0154
+"\x00\x72\x03\x01", 0x0155
+"\x00\x52\x03\x27", 0x0156
+"\x00\x72\x03\x27", 0x0157
+"\x00\x52\x03\x0c", 0x0158
+"\x00\x72\x03\x0c", 0x0159
+"\x00\x53\x03\x01", 0x015a
+"\x00\x73\x03\x01", 0x015b
+"\x00\x53\x03\x02", 0x015c
+"\x00\x73\x03\x02", 0x015d
+"\x00\x53\x03\x27", 0x015e
+"\x00\x73\x03\x27", 0x015f
+"\x00\x53\x03\x0c", 0x0160
+"\x00\x73\x03\x0c", 0x0161
+"\x00\x54\x03\x27", 0x0162
+"\x00\x74\x03\x27", 0x0163
+"\x00\x54\x03\x0c", 0x0164
+"\x00\x74\x03\x0c", 0x0165
+"\x00\x55\x03\x03", 0x0168
+"\x00\x75\x03\x03", 0x0169
+"\x00\x55\x03\x04", 0x016a
+"\x00\x75\x03\x04", 0x016b
+"\x00\x55\x03\x06", 0x016c
+"\x00\x75\x03\x06", 0x016d
+"\x00\x55\x03\x0a", 0x016e
+"\x00\x75\x03\x0a", 0x016f
+"\x00\x55\x03\x0b", 0x0170
+"\x00\x75\x03\x0b", 0x0171
+"\x00\x55\x03\x28", 0x0172
+"\x00\x75\x03\x28", 0x0173
+"\x00\x57\x03\x02", 0x0174
+"\x00\x77\x03\x02", 0x0175
+"\x00\x59\x03\x02", 0x0176
+"\x00\x79\x03\x02", 0x0177
+"\x00\x59\x03\x08", 0x0178
+"\x00\x5a\x03\x01", 0x0179
+"\x00\x7a\x03\x01", 0x017a
+"\x00\x5a\x03\x07", 0x017b
+"\x00\x7a\x03\x07", 0x017c
+"\x00\x5a\x03\x0c", 0x017d
+"\x00\x7a\x03\x0c", 0x017e
+"\x00\x4f\x03\x1b", 0x01a0
+"\x00\x6f\x03\x1b", 0x01a1
+"\x00\x55\x03\x1b", 0x01af
+"\x00\x75\x03\x1b", 0x01b0
+"\x00\x41\x03\x0c", 0x01cd
+"\x00\x61\x03\x0c", 0x01ce
+"\x00\x49\x03\x0c", 0x01cf
+"\x00\x69\x03\x0c", 0x01d0
+"\x00\x4f\x03\x0c", 0x01d1
+"\x00\x6f\x03\x0c", 0x01d2
+"\x00\x55\x03\x0c", 0x01d3
+"\x00\x75\x03\x0c", 0x01d4
+"\x00\xdc\x03\x04", 0x01d5
+"\x00\xfc\x03\x04", 0x01d6
+"\x00\xdc\x03\x01", 0x01d7
+"\x00\xfc\x03\x01", 0x01d8
+"\x00\xdc\x03\x0c", 0x01d9
+"\x00\xfc\x03\x0c", 0x01da
+"\x00\xdc\x03\x00", 0x01db
+"\x00\xfc\x03\x00", 0x01dc
+"\x00\xc4\x03\x04", 0x01de
+"\x00\xe4\x03\x04", 0x01df
+"\x02\x26\x03\x04", 0x01e0
+"\x02\x27\x03\x04", 0x01e1
+"\x00\xc6\x03\x04", 0x01e2
+"\x00\xe6\x03\x04", 0x01e3
+"\x00\x47\x03\x0c", 0x01e6
+"\x00\x67\x03\x0c", 0x01e7
+"\x00\x4b\x03\x0c", 0x01e8
+"\x00\x6b\x03\x0c", 0x01e9
+"\x00\x4f\x03\x28", 0x01ea
+"\x00\x6f\x03\x28", 0x01eb
+"\x01\xea\x03\x04", 0x01ec
+"\x01\xeb\x03\x04", 0x01ed
+"\x01\xb7\x03\x0c", 0x01ee
+"\x02\x92\x03\x0c", 0x01ef
+"\x00\x6a\x03\x0c", 0x01f0
+"\x00\x47\x03\x01", 0x01f4
+"\x00\x67\x03\x01", 0x01f5
+"\x00\x4e\x03\x00", 0x01f8
+"\x00\x6e\x03\x00", 0x01f9
+"\x00\xc5\x03\x01", 0x01fa
+"\x00\xe5\x03\x01", 0x01fb
+"\x00\xc6\x03\x01", 0x01fc
+"\x00\xe6\x03\x01", 0x01fd
+"\x00\xd8\x03\x01", 0x01fe
+"\x00\xf8\x03\x01", 0x01ff
+"\x00\x41\x03\x0f", 0x0200
+"\x00\x61\x03\x0f", 0x0201
+"\x00\x41\x03\x11", 0x0202
+"\x00\x61\x03\x11", 0x0203
+"\x00\x45\x03\x0f", 0x0204
+"\x00\x65\x03\x0f", 0x0205
+"\x00\x45\x03\x11", 0x0206
+"\x00\x65\x03\x11", 0x0207
+"\x00\x49\x03\x0f", 0x0208
+"\x00\x69\x03\x0f", 0x0209
+"\x00\x49\x03\x11", 0x020a
+"\x00\x69\x03\x11", 0x020b
+"\x00\x4f\x03\x0f", 0x020c
+"\x00\x6f\x03\x0f", 0x020d
+"\x00\x4f\x03\x11", 0x020e
+"\x00\x6f\x03\x11", 0x020f
+"\x00\x52\x03\x0f", 0x0210
+"\x00\x72\x03\x0f", 0x0211
+"\x00\x52\x03\x11", 0x0212
+"\x00\x72\x03\x11", 0x0213
+"\x00\x55\x03\x0f", 0x0214
+"\x00\x75\x03\x0f", 0x0215
+"\x00\x55\x03\x11", 0x0216
+"\x00\x75\x03\x11", 0x0217
+"\x00\x53\x03\x26", 0x0218
+"\x00\x73\x03\x26", 0x0219
+"\x00\x54\x03\x26", 0x021a
+"\x00\x74\x03\x26", 0x021b
+"\x00\x48\x03\x0c", 0x021e
+"\x00\x68\x03\x0c", 0x021f
+"\x00\x41\x03\x07", 0x0226
+"\x00\x61\x03\x07", 0x0227
+"\x00\x45\x03\x27", 0x0228
+"\x00\x65\x03\x27", 0x0229
+"\x00\xd6\x03\x04", 0x022a
+"\x00\xf6\x03\x04", 0x022b
+"\x00\xd5\x03\x04", 0x022c
+"\x00\xf5\x03\x04", 0x022d
+"\x00\x4f\x03\x07", 0x022e
+"\x00\x6f\x03\x07", 0x022f
+"\x02\x2e\x03\x04", 0x0230
+"\x02\x2f\x03\x04", 0x0231
+"\x00\x59\x03\x04", 0x0232
+"\x00\x79\x03\x04", 0x0233
+"\x00\xa8\x03\x01", 0x0385
+"\x03\x91\x03\x01", 0x0386
+"\x03\x95\x03\x01", 0x0388
+"\x03\x97\x03\x01", 0x0389
+"\x03\x99\x03\x01", 0x038a
+"\x03\x9f\x03\x01", 0x038c
+"\x03\xa5\x03\x01", 0x038e
+"\x03\xa9\x03\x01", 0x038f
+"\x03\xca\x03\x01", 0x0390
+"\x03\x99\x03\x08", 0x03aa
+"\x03\xa5\x03\x08", 0x03ab
+"\x03\xb1\x03\x01", 0x03ac
+"\x03\xb5\x03\x01", 0x03ad
+"\x03\xb7\x03\x01", 0x03ae
+"\x03\xb9\x03\x01", 0x03af
+"\x03\xcb\x03\x01", 0x03b0
+"\x03\xb9\x03\x08", 0x03ca
+"\x03\xc5\x03\x08", 0x03cb
+"\x03\xbf\x03\x01", 0x03cc
+"\x03\xc5\x03\x01", 0x03cd
+"\x03\xc9\x03\x01", 0x03ce
+"\x03\xd2\x03\x01", 0x03d3
+"\x03\xd2\x03\x08", 0x03d4
+"\x04\x15\x03\x00", 0x0400
+"\x04\x15\x03\x08", 0x0401
+"\x04\x13\x03\x01", 0x0403
+"\x04\x06\x03\x08", 0x0407
+"\x04\x1a\x03\x01", 0x040c
+"\x04\x18\x03\x00", 0x040d
+"\x04\x23\x03\x06", 0x040e
+"\x04\x18\x03\x06", 0x0419
+"\x04\x38\x03\x06", 0x0439
+"\x04\x35\x03\x00", 0x0450
+"\x04\x35\x03\x08", 0x0451
+"\x04\x33\x03\x01", 0x0453
+"\x04\x56\x03\x08", 0x0457
+"\x04\x3a\x03\x01", 0x045c
+"\x04\x38\x03\x00", 0x045d
+"\x04\x43\x03\x06", 0x045e
+"\x04\x74\x03\x0f", 0x0476
+"\x04\x75\x03\x0f", 0x0477
+"\x04\x16\x03\x06", 0x04c1
+"\x04\x36\x03\x06", 0x04c2
+"\x04\x10\x03\x06", 0x04d0
+"\x04\x30\x03\x06", 0x04d1
+"\x04\x10\x03\x08", 0x04d2
+"\x04\x30\x03\x08", 0x04d3
+"\x04\x15\x03\x06", 0x04d6
+"\x04\x35\x03\x06", 0x04d7
+"\x04\xd8\x03\x08", 0x04da
+"\x04\xd9\x03\x08", 0x04db
+"\x04\x16\x03\x08", 0x04dc
+"\x04\x36\x03\x08", 0x04dd
+"\x04\x17\x03\x08", 0x04de
+"\x04\x37\x03\x08", 0x04df
+"\x04\x18\x03\x04", 0x04e2
+"\x04\x38\x03\x04", 0x04e3
+"\x04\x18\x03\x08", 0x04e4
+"\x04\x38\x03\x08", 0x04e5
+"\x04\x1e\x03\x08", 0x04e6
+"\x04\x3e\x03\x08", 0x04e7
+"\x04\xe8\x03\x08", 0x04ea
+"\x04\xe9\x03\x08", 0x04eb
+"\x04\x2d\x03\x08", 0x04ec
+"\x04\x4d\x03\x08", 0x04ed
+"\x04\x23\x03\x04", 0x04ee
+"\x04\x43\x03\x04", 0x04ef
+"\x04\x23\x03\x08", 0x04f0
+"\x04\x43\x03\x08", 0x04f1
+"\x04\x23\x03\x0b", 0x04f2
+"\x04\x43\x03\x0b", 0x04f3
+"\x04\x27\x03\x08", 0x04f4
+"\x04\x47\x03\x08", 0x04f5
+"\x04\x2b\x03\x08", 0x04f8
+"\x04\x4b\x03\x08", 0x04f9
+"\x06\x27\x06\x53", 0x0622
+"\x06\x27\x06\x54", 0x0623
+"\x06\x48\x06\x54", 0x0624
+"\x06\x27\x06\x55", 0x0625
+"\x06\x4a\x06\x54", 0x0626
+"\x06\xd5\x06\x54", 0x06c0
+"\x06\xc1\x06\x54", 0x06c2
+"\x06\xd2\x06\x54", 0x06d3
+"\x09\x28\x09\x3c", 0x0929
+"\x09\x30\x09\x3c", 0x0931
+"\x09\x33\x09\x3c", 0x0934
+"\x09\xc7\x09\xbe", 0x09cb
+"\x09\xc7\x09\xd7", 0x09cc
+"\x0b\x47\x0b\x56", 0x0b48
+"\x0b\x47\x0b\x3e", 0x0b4b
+"\x0b\x47\x0b\x57", 0x0b4c
+"\x0b\x92\x0b\xd7", 0x0b94
+"\x0b\xc6\x0b\xbe", 0x0bca
+"\x0b\xc7\x0b\xbe", 0x0bcb
+"\x0b\xc6\x0b\xd7", 0x0bcc
+"\x0c\x46\x0c\x56", 0x0c48
+"\x0c\xbf\x0c\xd5", 0x0cc0
+"\x0c\xc6\x0c\xd5", 0x0cc7
+"\x0c\xc6\x0c\xd6", 0x0cc8
+"\x0c\xc6\x0c\xc2", 0x0cca
+"\x0c\xca\x0c\xd5", 0x0ccb
+"\x0d\x46\x0d\x3e", 0x0d4a
+"\x0d\x47\x0d\x3e", 0x0d4b
+"\x0d\x46\x0d\x57", 0x0d4c
+"\x0d\xd9\x0d\xca", 0x0dda
+"\x0d\xd9\x0d\xcf", 0x0ddc
+"\x0d\xdc\x0d\xca", 0x0ddd
+"\x0d\xd9\x0d\xdf", 0x0dde
+"\x10\x25\x10\x2e", 0x1026
+"\x1b\x05\x1b\x35", 0x1b06
+"\x1b\x07\x1b\x35", 0x1b08
+"\x1b\x09\x1b\x35", 0x1b0a
+"\x1b\x0b\x1b\x35", 0x1b0c
+"\x1b\x0d\x1b\x35", 0x1b0e
+"\x1b\x11\x1b\x35", 0x1b12
+"\x1b\x3a\x1b\x35", 0x1b3b
+"\x1b\x3c\x1b\x35", 0x1b3d
+"\x1b\x3e\x1b\x35", 0x1b40
+"\x1b\x3f\x1b\x35", 0x1b41
+"\x1b\x42\x1b\x35", 0x1b43
+"\x00\x41\x03\x25", 0x1e00
+"\x00\x61\x03\x25", 0x1e01
+"\x00\x42\x03\x07", 0x1e02
+"\x00\x62\x03\x07", 0x1e03
+"\x00\x42\x03\x23", 0x1e04
+"\x00\x62\x03\x23", 0x1e05
+"\x00\x42\x03\x31", 0x1e06
+"\x00\x62\x03\x31", 0x1e07
+"\x00\xc7\x03\x01", 0x1e08
+"\x00\xe7\x03\x01", 0x1e09
+"\x00\x44\x03\x07", 0x1e0a
+"\x00\x64\x03\x07", 0x1e0b
+"\x00\x44\x03\x23", 0x1e0c
+"\x00\x64\x03\x23", 0x1e0d
+"\x00\x44\x03\x31", 0x1e0e
+"\x00\x64\x03\x31", 0x1e0f
+"\x00\x44\x03\x27", 0x1e10
+"\x00\x64\x03\x27", 0x1e11
+"\x00\x44\x03\x2d", 0x1e12
+"\x00\x64\x03\x2d", 0x1e13
+"\x01\x12\x03\x00", 0x1e14
+"\x01\x13\x03\x00", 0x1e15
+"\x01\x12\x03\x01", 0x1e16
+"\x01\x13\x03\x01", 0x1e17
+"\x00\x45\x03\x2d", 0x1e18
+"\x00\x65\x03\x2d", 0x1e19
+"\x00\x45\x03\x30", 0x1e1a
+"\x00\x65\x03\x30", 0x1e1b
+"\x02\x28\x03\x06", 0x1e1c
+"\x02\x29\x03\x06", 0x1e1d
+"\x00\x46\x03\x07", 0x1e1e
+"\x00\x66\x03\x07", 0x1e1f
+"\x00\x47\x03\x04", 0x1e20
+"\x00\x67\x03\x04", 0x1e21
+"\x00\x48\x03\x07", 0x1e22
+"\x00\x68\x03\x07", 0x1e23
+"\x00\x48\x03\x23", 0x1e24
+"\x00\x68\x03\x23", 0x1e25
+"\x00\x48\x03\x08", 0x1e26
+"\x00\x68\x03\x08", 0x1e27
+"\x00\x48\x03\x27", 0x1e28
+"\x00\x68\x03\x27", 0x1e29
+"\x00\x48\x03\x2e", 0x1e2a
+"\x00\x68\x03\x2e", 0x1e2b
+"\x00\x49\x03\x30", 0x1e2c
+"\x00\x69\x03\x30", 0x1e2d
+"\x00\xcf\x03\x01", 0x1e2e
+"\x00\xef\x03\x01", 0x1e2f
+"\x00\x4b\x03\x01", 0x1e30
+"\x00\x6b\x03\x01", 0x1e31
+"\x00\x4b\x03\x23", 0x1e32
+"\x00\x6b\x03\x23", 0x1e33
+"\x00\x4b\x03\x31", 0x1e34
+"\x00\x6b\x03\x31", 0x1e35
+"\x00\x4c\x03\x23", 0x1e36
+"\x00\x6c\x03\x23", 0x1e37
+"\x1e\x36\x03\x04", 0x1e38
+"\x1e\x37\x03\x04", 0x1e39
+"\x00\x4c\x03\x31", 0x1e3a
+"\x00\x6c\x03\x31", 0x1e3b
+"\x00\x4c\x03\x2d", 0x1e3c
+"\x00\x6c\x03\x2d", 0x1e3d
+"\x00\x4d\x03\x01", 0x1e3e
+"\x00\x6d\x03\x01", 0x1e3f
+"\x00\x4d\x03\x07", 0x1e40
+"\x00\x6d\x03\x07", 0x1e41
+"\x00\x4d\x03\x23", 0x1e42
+"\x00\x6d\x03\x23", 0x1e43
+"\x00\x4e\x03\x07", 0x1e44
+"\x00\x6e\x03\x07", 0x1e45
+"\x00\x4e\x03\x23", 0x1e46
+"\x00\x6e\x03\x23", 0x1e47
+"\x00\x4e\x03\x31", 0x1e48
+"\x00\x6e\x03\x31", 0x1e49
+"\x00\x4e\x03\x2d", 0x1e4a
+"\x00\x6e\x03\x2d", 0x1e4b
+"\x00\xd5\x03\x01", 0x1e4c
+"\x00\xf5\x03\x01", 0x1e4d
+"\x00\xd5\x03\x08", 0x1e4e
+"\x00\xf5\x03\x08", 0x1e4f
+"\x01\x4c\x03\x00", 0x1e50
+"\x01\x4d\x03\x00", 0x1e51
+"\x01\x4c\x03\x01", 0x1e52
+"\x01\x4d\x03\x01", 0x1e53
+"\x00\x50\x03\x01", 0x1e54
+"\x00\x70\x03\x01", 0x1e55
+"\x00\x50\x03\x07", 0x1e56
+"\x00\x70\x03\x07", 0x1e57
+"\x00\x52\x03\x07", 0x1e58
+"\x00\x72\x03\x07", 0x1e59
+"\x00\x52\x03\x23", 0x1e5a
+"\x00\x72\x03\x23", 0x1e5b
+"\x1e\x5a\x03\x04", 0x1e5c
+"\x1e\x5b\x03\x04", 0x1e5d
+"\x00\x52\x03\x31", 0x1e5e
+"\x00\x72\x03\x31", 0x1e5f
+"\x00\x53\x03\x07", 0x1e60
+"\x00\x73\x03\x07", 0x1e61
+"\x00\x53\x03\x23", 0x1e62
+"\x00\x73\x03\x23", 0x1e63
+"\x01\x5a\x03\x07", 0x1e64
+"\x01\x5b\x03\x07", 0x1e65
+"\x01\x60\x03\x07", 0x1e66
+"\x01\x61\x03\x07", 0x1e67
+"\x1e\x62\x03\x07", 0x1e68
+"\x1e\x63\x03\x07", 0x1e69
+"\x00\x54\x03\x07", 0x1e6a
+"\x00\x74\x03\x07", 0x1e6b
+"\x00\x54\x03\x23", 0x1e6c
+"\x00\x74\x03\x23", 0x1e6d
+"\x00\x54\x03\x31", 0x1e6e
+"\x00\x74\x03\x31", 0x1e6f
+"\x00\x54\x03\x2d", 0x1e70
+"\x00\x74\x03\x2d", 0x1e71
+"\x00\x55\x03\x24", 0x1e72
+"\x00\x75\x03\x24", 0x1e73
+"\x00\x55\x03\x30", 0x1e74
+"\x00\x75\x03\x30", 0x1e75
+"\x00\x55\x03\x2d", 0x1e76
+"\x00\x75\x03\x2d", 0x1e77
+"\x01\x68\x03\x01", 0x1e78
+"\x01\x69\x03\x01", 0x1e79
+"\x01\x6a\x03\x08", 0x1e7a
+"\x01\x6b\x03\x08", 0x1e7b
+"\x00\x56\x03\x03", 0x1e7c
+"\x00\x76\x03\x03", 0x1e7d
+"\x00\x56\x03\x23", 0x1e7e
+"\x00\x76\x03\x23", 0x1e7f
+"\x00\x57\x03\x00", 0x1e80
+"\x00\x77\x03\x00", 0x1e81
+"\x00\x57\x03\x01", 0x1e82
+"\x00\x77\x03\x01", 0x1e83
+"\x00\x57\x03\x08", 0x1e84
+"\x00\x77\x03\x08", 0x1e85
+"\x00\x57\x03\x07", 0x1e86
+"\x00\x77\x03\x07", 0x1e87
+"\x00\x57\x03\x23", 0x1e88
+"\x00\x77\x03\x23", 0x1e89
+"\x00\x58\x03\x07", 0x1e8a
+"\x00\x78\x03\x07", 0x1e8b
+"\x00\x58\x03\x08", 0x1e8c
+"\x00\x78\x03\x08", 0x1e8d
+"\x00\x59\x03\x07", 0x1e8e
+"\x00\x79\x03\x07", 0x1e8f
+"\x00\x5a\x03\x02", 0x1e90
+"\x00\x7a\x03\x02", 0x1e91
+"\x00\x5a\x03\x23", 0x1e92
+"\x00\x7a\x03\x23", 0x1e93
+"\x00\x5a\x03\x31", 0x1e94
+"\x00\x7a\x03\x31", 0x1e95
+"\x00\x68\x03\x31", 0x1e96
+"\x00\x74\x03\x08", 0x1e97
+"\x00\x77\x03\x0a", 0x1e98
+"\x00\x79\x03\x0a", 0x1e99
+"\x01\x7f\x03\x07", 0x1e9b
+"\x00\x41\x03\x23", 0x1ea0
+"\x00\x61\x03\x23", 0x1ea1
+"\x00\x41\x03\x09", 0x1ea2
+"\x00\x61\x03\x09", 0x1ea3
+"\x00\xc2\x03\x01", 0x1ea4
+"\x00\xe2\x03\x01", 0x1ea5
+"\x00\xc2\x03\x00", 0x1ea6
+"\x00\xe2\x03\x00", 0x1ea7
+"\x00\xc2\x03\x09", 0x1ea8
+"\x00\xe2\x03\x09", 0x1ea9
+"\x00\xc2\x03\x03", 0x1eaa
+"\x00\xe2\x03\x03", 0x1eab
+"\x1e\xa0\x03\x02", 0x1eac
+"\x1e\xa1\x03\x02", 0x1ead
+"\x01\x02\x03\x01", 0x1eae
+"\x01\x03\x03\x01", 0x1eaf
+"\x01\x02\x03\x00", 0x1eb0
+"\x01\x03\x03\x00", 0x1eb1
+"\x01\x02\x03\x09", 0x1eb2
+"\x01\x03\x03\x09", 0x1eb3
+"\x01\x02\x03\x03", 0x1eb4
+"\x01\x03\x03\x03", 0x1eb5
+"\x1e\xa0\x03\x06", 0x1eb6
+"\x1e\xa1\x03\x06", 0x1eb7
+"\x00\x45\x03\x23", 0x1eb8
+"\x00\x65\x03\x23", 0x1eb9
+"\x00\x45\x03\x09", 0x1eba
+"\x00\x65\x03\x09", 0x1ebb
+"\x00\x45\x03\x03", 0x1ebc
+"\x00\x65\x03\x03", 0x1ebd
+"\x00\xca\x03\x01", 0x1ebe
+"\x00\xea\x03\x01", 0x1ebf
+"\x00\xca\x03\x00", 0x1ec0
+"\x00\xea\x03\x00", 0x1ec1
+"\x00\xca\x03\x09", 0x1ec2
+"\x00\xea\x03\x09", 0x1ec3
+"\x00\xca\x03\x03", 0x1ec4
+"\x00\xea\x03\x03", 0x1ec5
+"\x1e\xb8\x03\x02", 0x1ec6
+"\x1e\xb9\x03\x02", 0x1ec7
+"\x00\x49\x03\x09", 0x1ec8
+"\x00\x69\x03\x09", 0x1ec9
+"\x00\x49\x03\x23", 0x1eca
+"\x00\x69\x03\x23", 0x1ecb
+"\x00\x4f\x03\x23", 0x1ecc
+"\x00\x6f\x03\x23", 0x1ecd
+"\x00\x4f\x03\x09", 0x1ece
+"\x00\x6f\x03\x09", 0x1ecf
+"\x00\xd4\x03\x01", 0x1ed0
+"\x00\xf4\x03\x01", 0x1ed1
+"\x00\xd4\x03\x00", 0x1ed2
+"\x00\xf4\x03\x00", 0x1ed3
+"\x00\xd4\x03\x09", 0x1ed4
+"\x00\xf4\x03\x09", 0x1ed5
+"\x00\xd4\x03\x03", 0x1ed6
+"\x00\xf4\x03\x03", 0x1ed7
+"\x1e\xcc\x03\x02", 0x1ed8
+"\x1e\xcd\x03\x02", 0x1ed9
+"\x01\xa0\x03\x01", 0x1eda
+"\x01\xa1\x03\x01", 0x1edb
+"\x01\xa0\x03\x00", 0x1edc
+"\x01\xa1\x03\x00", 0x1edd
+"\x01\xa0\x03\x09", 0x1ede
+"\x01\xa1\x03\x09", 0x1edf
+"\x01\xa0\x03\x03", 0x1ee0
+"\x01\xa1\x03\x03", 0x1ee1
+"\x01\xa0\x03\x23", 0x1ee2
+"\x01\xa1\x03\x23", 0x1ee3
+"\x00\x55\x03\x23", 0x1ee4
+"\x00\x75\x03\x23", 0x1ee5
+"\x00\x55\x03\x09", 0x1ee6
+"\x00\x75\x03\x09", 0x1ee7
+"\x01\xaf\x03\x01", 0x1ee8
+"\x01\xb0\x03\x01", 0x1ee9
+"\x01\xaf\x03\x00", 0x1eea
+"\x01\xb0\x03\x00", 0x1eeb
+"\x01\xaf\x03\x09", 0x1eec
+"\x01\xb0\x03\x09", 0x1eed
+"\x01\xaf\x03\x03", 0x1eee
+"\x01\xb0\x03\x03", 0x1eef
+"\x01\xaf\x03\x23", 0x1ef0
+"\x01\xb0\x03\x23", 0x1ef1
+"\x00\x59\x03\x00", 0x1ef2
+"\x00\x79\x03\x00", 0x1ef3
+"\x00\x59\x03\x23", 0x1ef4
+"\x00\x79\x03\x23", 0x1ef5
+"\x00\x59\x03\x09", 0x1ef6
+"\x00\x79\x03\x09", 0x1ef7
+"\x00\x59\x03\x03", 0x1ef8
+"\x00\x79\x03\x03", 0x1ef9
+"\x03\xb1\x03\x13", 0x1f00
+"\x03\xb1\x03\x14", 0x1f01
+"\x1f\x00\x03\x00", 0x1f02
+"\x1f\x01\x03\x00", 0x1f03
+"\x1f\x00\x03\x01", 0x1f04
+"\x1f\x01\x03\x01", 0x1f05
+"\x1f\x00\x03\x42", 0x1f06
+"\x1f\x01\x03\x42", 0x1f07
+"\x03\x91\x03\x13", 0x1f08
+"\x03\x91\x03\x14", 0x1f09
+"\x1f\x08\x03\x00", 0x1f0a
+"\x1f\x09\x03\x00", 0x1f0b
+"\x1f\x08\x03\x01", 0x1f0c
+"\x1f\x09\x03\x01", 0x1f0d
+"\x1f\x08\x03\x42", 0x1f0e
+"\x1f\x09\x03\x42", 0x1f0f
+"\x03\xb5\x03\x13", 0x1f10
+"\x03\xb5\x03\x14", 0x1f11
+"\x1f\x10\x03\x00", 0x1f12
+"\x1f\x11\x03\x00", 0x1f13
+"\x1f\x10\x03\x01", 0x1f14
+"\x1f\x11\x03\x01", 0x1f15
+"\x03\x95\x03\x13", 0x1f18
+"\x03\x95\x03\x14", 0x1f19
+"\x1f\x18\x03\x00", 0x1f1a
+"\x1f\x19\x03\x00", 0x1f1b
+"\x1f\x18\x03\x01", 0x1f1c
+"\x1f\x19\x03\x01", 0x1f1d
+"\x03\xb7\x03\x13", 0x1f20
+"\x03\xb7\x03\x14", 0x1f21
+"\x1f\x20\x03\x00", 0x1f22
+"\x1f\x21\x03\x00", 0x1f23
+"\x1f\x20\x03\x01", 0x1f24
+"\x1f\x21\x03\x01", 0x1f25
+"\x1f\x20\x03\x42", 0x1f26
+"\x1f\x21\x03\x42", 0x1f27
+"\x03\x97\x03\x13", 0x1f28
+"\x03\x97\x03\x14", 0x1f29
+"\x1f\x28\x03\x00", 0x1f2a
+"\x1f\x29\x03\x00", 0x1f2b
+"\x1f\x28\x03\x01", 0x1f2c
+"\x1f\x29\x03\x01", 0x1f2d
+"\x1f\x28\x03\x42", 0x1f2e
+"\x1f\x29\x03\x42", 0x1f2f
+"\x03\xb9\x03\x13", 0x1f30
+"\x03\xb9\x03\x14", 0x1f31
+"\x1f\x30\x03\x00", 0x1f32
+"\x1f\x31\x03\x00", 0x1f33
+"\x1f\x30\x03\x01", 0x1f34
+"\x1f\x31\x03\x01", 0x1f35
+"\x1f\x30\x03\x42", 0x1f36
+"\x1f\x31\x03\x42", 0x1f37
+"\x03\x99\x03\x13", 0x1f38
+"\x03\x99\x03\x14", 0x1f39
+"\x1f\x38\x03\x00", 0x1f3a
+"\x1f\x39\x03\x00", 0x1f3b
+"\x1f\x38\x03\x01", 0x1f3c
+"\x1f\x39\x03\x01", 0x1f3d
+"\x1f\x38\x03\x42", 0x1f3e
+"\x1f\x39\x03\x42", 0x1f3f
+"\x03\xbf\x03\x13", 0x1f40
+"\x03\xbf\x03\x14", 0x1f41
+"\x1f\x40\x03\x00", 0x1f42
+"\x1f\x41\x03\x00", 0x1f43
+"\x1f\x40\x03\x01", 0x1f44
+"\x1f\x41\x03\x01", 0x1f45
+"\x03\x9f\x03\x13", 0x1f48
+"\x03\x9f\x03\x14", 0x1f49
+"\x1f\x48\x03\x00", 0x1f4a
+"\x1f\x49\x03\x00", 0x1f4b
+"\x1f\x48\x03\x01", 0x1f4c
+"\x1f\x49\x03\x01", 0x1f4d
+"\x03\xc5\x03\x13", 0x1f50
+"\x03\xc5\x03\x14", 0x1f51
+"\x1f\x50\x03\x00", 0x1f52
+"\x1f\x51\x03\x00", 0x1f53
+"\x1f\x50\x03\x01", 0x1f54
+"\x1f\x51\x03\x01", 0x1f55
+"\x1f\x50\x03\x42", 0x1f56
+"\x1f\x51\x03\x42", 0x1f57
+"\x03\xa5\x03\x14", 0x1f59
+"\x1f\x59\x03\x00", 0x1f5b
+"\x1f\x59\x03\x01", 0x1f5d
+"\x1f\x59\x03\x42", 0x1f5f
+"\x03\xc9\x03\x13", 0x1f60
+"\x03\xc9\x03\x14", 0x1f61
+"\x1f\x60\x03\x00", 0x1f62
+"\x1f\x61\x03\x00", 0x1f63
+"\x1f\x60\x03\x01", 0x1f64
+"\x1f\x61\x03\x01", 0x1f65
+"\x1f\x60\x03\x42", 0x1f66
+"\x1f\x61\x03\x42", 0x1f67
+"\x03\xa9\x03\x13", 0x1f68
+"\x03\xa9\x03\x14", 0x1f69
+"\x1f\x68\x03\x00", 0x1f6a
+"\x1f\x69\x03\x00", 0x1f6b
+"\x1f\x68\x03\x01", 0x1f6c
+"\x1f\x69\x03\x01", 0x1f6d
+"\x1f\x68\x03\x42", 0x1f6e
+"\x1f\x69\x03\x42", 0x1f6f
+"\x03\xb1\x03\x00", 0x1f70
+"\x03\xb5\x03\x00", 0x1f72
+"\x03\xb7\x03\x00", 0x1f74
+"\x03\xb9\x03\x00", 0x1f76
+"\x03\xbf\x03\x00", 0x1f78
+"\x03\xc5\x03\x00", 0x1f7a
+"\x03\xc9\x03\x00", 0x1f7c
+"\x1f\x00\x03\x45", 0x1f80
+"\x1f\x01\x03\x45", 0x1f81
+"\x1f\x02\x03\x45", 0x1f82
+"\x1f\x03\x03\x45", 0x1f83
+"\x1f\x04\x03\x45", 0x1f84
+"\x1f\x05\x03\x45", 0x1f85
+"\x1f\x06\x03\x45", 0x1f86
+"\x1f\x07\x03\x45", 0x1f87
+"\x1f\x08\x03\x45", 0x1f88
+"\x1f\x09\x03\x45", 0x1f89
+"\x1f\x0a\x03\x45", 0x1f8a
+"\x1f\x0b\x03\x45", 0x1f8b
+"\x1f\x0c\x03\x45", 0x1f8c
+"\x1f\x0d\x03\x45", 0x1f8d
+"\x1f\x0e\x03\x45", 0x1f8e
+"\x1f\x0f\x03\x45", 0x1f8f
+"\x1f\x20\x03\x45", 0x1f90
+"\x1f\x21\x03\x45", 0x1f91
+"\x1f\x22\x03\x45", 0x1f92
+"\x1f\x23\x03\x45", 0x1f93
+"\x1f\x24\x03\x45", 0x1f94
+"\x1f\x25\x03\x45", 0x1f95
+"\x1f\x26\x03\x45", 0x1f96
+"\x1f\x27\x03\x45", 0x1f97
+"\x1f\x28\x03\x45", 0x1f98
+"\x1f\x29\x03\x45", 0x1f99
+"\x1f\x2a\x03\x45", 0x1f9a
+"\x1f\x2b\x03\x45", 0x1f9b
+"\x1f\x2c\x03\x45", 0x1f9c
+"\x1f\x2d\x03\x45", 0x1f9d
+"\x1f\x2e\x03\x45", 0x1f9e
+"\x1f\x2f\x03\x45", 0x1f9f
+"\x1f\x60\x03\x45", 0x1fa0
+"\x1f\x61\x03\x45", 0x1fa1
+"\x1f\x62\x03\x45", 0x1fa2
+"\x1f\x63\x03\x45", 0x1fa3
+"\x1f\x64\x03\x45", 0x1fa4
+"\x1f\x65\x03\x45", 0x1fa5
+"\x1f\x66\x03\x45", 0x1fa6
+"\x1f\x67\x03\x45", 0x1fa7
+"\x1f\x68\x03\x45", 0x1fa8
+"\x1f\x69\x03\x45", 0x1fa9
+"\x1f\x6a\x03\x45", 0x1faa
+"\x1f\x6b\x03\x45", 0x1fab
+"\x1f\x6c\x03\x45", 0x1fac
+"\x1f\x6d\x03\x45", 0x1fad
+"\x1f\x6e\x03\x45", 0x1fae
+"\x1f\x6f\x03\x45", 0x1faf
+"\x03\xb1\x03\x06", 0x1fb0
+"\x03\xb1\x03\x04", 0x1fb1
+"\x1f\x70\x03\x45", 0x1fb2
+"\x03\xb1\x03\x45", 0x1fb3
+"\x03\xac\x03\x45", 0x1fb4
+"\x03\xb1\x03\x42", 0x1fb6
+"\x1f\xb6\x03\x45", 0x1fb7
+"\x03\x91\x03\x06", 0x1fb8
+"\x03\x91\x03\x04", 0x1fb9
+"\x03\x91\x03\x00", 0x1fba
+"\x03\x91\x03\x45", 0x1fbc
+"\x00\xa8\x03\x42", 0x1fc1
+"\x1f\x74\x03\x45", 0x1fc2
+"\x03\xb7\x03\x45", 0x1fc3
+"\x03\xae\x03\x45", 0x1fc4
+"\x03\xb7\x03\x42", 0x1fc6
+"\x1f\xc6\x03\x45", 0x1fc7
+"\x03\x95\x03\x00", 0x1fc8
+"\x03\x97\x03\x00", 0x1fca
+"\x03\x97\x03\x45", 0x1fcc
+"\x1f\xbf\x03\x00", 0x1fcd
+"\x1f\xbf\x03\x01", 0x1fce
+"\x1f\xbf\x03\x42", 0x1fcf
+"\x03\xb9\x03\x06", 0x1fd0
+"\x03\xb9\x03\x04", 0x1fd1
+"\x03\xca\x03\x00", 0x1fd2
+"\x03\xb9\x03\x42", 0x1fd6
+"\x03\xca\x03\x42", 0x1fd7
+"\x03\x99\x03\x06", 0x1fd8
+"\x03\x99\x03\x04", 0x1fd9
+"\x03\x99\x03\x00", 0x1fda
+"\x1f\xfe\x03\x00", 0x1fdd
+"\x1f\xfe\x03\x01", 0x1fde
+"\x1f\xfe\x03\x42", 0x1fdf
+"\x03\xc5\x03\x06", 0x1fe0
+"\x03\xc5\x03\x04", 0x1fe1
+"\x03\xcb\x03\x00", 0x1fe2
+"\x03\xc1\x03\x13", 0x1fe4
+"\x03\xc1\x03\x14", 0x1fe5
+"\x03\xc5\x03\x42", 0x1fe6
+"\x03\xcb\x03\x42", 0x1fe7
+"\x03\xa5\x03\x06", 0x1fe8
+"\x03\xa5\x03\x04", 0x1fe9
+"\x03\xa5\x03\x00", 0x1fea
+"\x03\xa1\x03\x14", 0x1fec
+"\x00\xa8\x03\x00", 0x1fed
+"\x1f\x7c\x03\x45", 0x1ff2
+"\x03\xc9\x03\x45", 0x1ff3
+"\x03\xce\x03\x45", 0x1ff4
+"\x03\xc9\x03\x42", 0x1ff6
+"\x1f\xf6\x03\x45", 0x1ff7
+"\x03\x9f\x03\x00", 0x1ff8
+"\x03\xa9\x03\x00", 0x1ffa
+"\x03\xa9\x03\x45", 0x1ffc
+"\x21\x90\x03\x38", 0x219a
+"\x21\x92\x03\x38", 0x219b
+"\x21\x94\x03\x38", 0x21ae
+"\x21\xd0\x03\x38", 0x21cd
+"\x21\xd4\x03\x38", 0x21ce
+"\x21\xd2\x03\x38", 0x21cf
+"\x22\x03\x03\x38", 0x2204
+"\x22\x08\x03\x38", 0x2209
+"\x22\x0b\x03\x38", 0x220c
+"\x22\x23\x03\x38", 0x2224
+"\x22\x25\x03\x38", 0x2226
+"\x22\x3c\x03\x38", 0x2241
+"\x22\x43\x03\x38", 0x2244
+"\x22\x45\x03\x38", 0x2247
+"\x22\x48\x03\x38", 0x2249
+"\x00\x3d\x03\x38", 0x2260
+"\x22\x61\x03\x38", 0x2262
+"\x22\x4d\x03\x38", 0x226d
+"\x00\x3c\x03\x38", 0x226e
+"\x00\x3e\x03\x38", 0x226f
+"\x22\x64\x03\x38", 0x2270
+"\x22\x65\x03\x38", 0x2271
+"\x22\x72\x03\x38", 0x2274
+"\x22\x73\x03\x38", 0x2275
+"\x22\x76\x03\x38", 0x2278
+"\x22\x77\x03\x38", 0x2279
+"\x22\x7a\x03\x38", 0x2280
+"\x22\x7b\x03\x38", 0x2281
+"\x22\x82\x03\x38", 0x2284
+"\x22\x83\x03\x38", 0x2285
+"\x22\x86\x03\x38", 0x2288
+"\x22\x87\x03\x38", 0x2289
+"\x22\xa2\x03\x38", 0x22ac
+"\x22\xa8\x03\x38", 0x22ad
+"\x22\xa9\x03\x38", 0x22ae
+"\x22\xab\x03\x38", 0x22af
+"\x22\x7c\x03\x38", 0x22e0
+"\x22\x7d\x03\x38", 0x22e1
+"\x22\x91\x03\x38", 0x22e2
+"\x22\x92\x03\x38", 0x22e3
+"\x22\xb2\x03\x38", 0x22ea
+"\x22\xb3\x03\x38", 0x22eb
+"\x22\xb4\x03\x38", 0x22ec
+"\x22\xb5\x03\x38", 0x22ed
+"\x30\x4b\x30\x99", 0x304c
+"\x30\x4d\x30\x99", 0x304e
+"\x30\x4f\x30\x99", 0x3050
+"\x30\x51\x30\x99", 0x3052
+"\x30\x53\x30\x99", 0x3054
+"\x30\x55\x30\x99", 0x3056
+"\x30\x57\x30\x99", 0x3058
+"\x30\x59\x30\x99", 0x305a
+"\x30\x5b\x30\x99", 0x305c
+"\x30\x5d\x30\x99", 0x305e
+"\x30\x5f\x30\x99", 0x3060
+"\x30\x61\x30\x99", 0x3062
+"\x30\x64\x30\x99", 0x3065
+"\x30\x66\x30\x99", 0x3067
+"\x30\x68\x30\x99", 0x3069
+"\x30\x6f\x30\x99", 0x3070
+"\x30\x6f\x30\x9a", 0x3071
+"\x30\x72\x30\x99", 0x3073
+"\x30\x72\x30\x9a", 0x3074
+"\x30\x75\x30\x99", 0x3076
+"\x30\x75\x30\x9a", 0x3077
+"\x30\x78\x30\x99", 0x3079
+"\x30\x78\x30\x9a", 0x307a
+"\x30\x7b\x30\x99", 0x307c
+"\x30\x7b\x30\x9a", 0x307d
+"\x30\x46\x30\x99", 0x3094
+"\x30\x9d\x30\x99", 0x309e
+"\x30\xab\x30\x99", 0x30ac
+"\x30\xad\x30\x99", 0x30ae
+"\x30\xaf\x30\x99", 0x30b0
+"\x30\xb1\x30\x99", 0x30b2
+"\x30\xb3\x30\x99", 0x30b4
+"\x30\xb5\x30\x99", 0x30b6
+"\x30\xb7\x30\x99", 0x30b8
+"\x30\xb9\x30\x99", 0x30ba
+"\x30\xbb\x30\x99", 0x30bc
+"\x30\xbd\x30\x99", 0x30be
+"\x30\xbf\x30\x99", 0x30c0
+"\x30\xc1\x30\x99", 0x30c2
+"\x30\xc4\x30\x99", 0x30c5
+"\x30\xc6\x30\x99", 0x30c7
+"\x30\xc8\x30\x99", 0x30c9
+"\x30\xcf\x30\x99", 0x30d0
+"\x30\xcf\x30\x9a", 0x30d1
+"\x30\xd2\x30\x99", 0x30d3
+"\x30\xd2\x30\x9a", 0x30d4
+"\x30\xd5\x30\x99", 0x30d6
+"\x30\xd5\x30\x9a", 0x30d7
+"\x30\xd8\x30\x99", 0x30d9
+"\x30\xd8\x30\x9a", 0x30da
+"\x30\xdb\x30\x99", 0x30dc
+"\x30\xdb\x30\x9a", 0x30dd
+"\x30\xa6\x30\x99", 0x30f4
+"\x30\xef\x30\x99", 0x30f7
+"\x30\xf0\x30\x99", 0x30f8
+"\x30\xf1\x30\x99", 0x30f9
+"\x30\xf2\x30\x99", 0x30fa
+"\x30\xfd\x30\x99", 0x30fe
diff --git a/gnulib/lib/uninorm/composition.c b/gnulib/lib/uninorm/composition.c
new file mode 100644
index 00000000..c9cddbec
--- /dev/null
+++ b/gnulib/lib/uninorm/composition.c
@@ -0,0 +1,85 @@
+/* Canonical composition of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <string.h>
+
+struct composition_rule { char codes[4]; unsigned short combined; };
+
+#include "composition-table.h"
+
+ucs4_t
+uc_composition (ucs4_t uc1, ucs4_t uc2)
+{
+ if (uc1 < 0x10000 && uc2 < 0x10000)
+ {
+ if (uc2 >= 0x1161 && uc2 < 0x1161 + 21
+ && uc1 >= 0x1100 && uc1 < 0x1100 + 19)
+ {
+ /* Hangul: Combine single letter L and single letter V to form
+ two-letter syllable LV. */
+ return 0xAC00 + ((uc1 - 0x1100) * 21 + (uc2 - 0x1161)) * 28;
+ }
+ else if (uc2 > 0x11A7 && uc2 < 0x11A7 + 28
+ && uc1 >= 0xAC00 && uc1 < 0xD7A4 && ((uc1 - 0xAC00) % 28) == 0)
+ {
+ /* Hangul: Combine two-letter syllable LV with single-letter T
+ to form three-letter syllable LVT. */
+ return uc1 + (uc2 - 0x11A7);
+ }
+ else
+ {
+#if 0
+ unsigned int uc = MUL1 * uc1 * MUL2 * uc2;
+ unsigned int index1 = uc >> composition_header_0;
+ if (index1 < composition_header_1)
+ {
+ int lookup1 = u_composition.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> composition_header_2) & composition_header_3;
+ int lookup2 = u_composition.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & composition_header_4);
+ unsigned int lookup3 = u_composition.level3[lookup2 + index3];
+ if ((lookup3 >> 16) == uc2)
+ return lookup3 & ((1U << 16) - 1);
+ }
+ }
+ }
+#else
+ char codes[4];
+ const struct composition_rule *rule;
+
+ codes[0] = (uc1 >> 8) & 0xff;
+ codes[1] = uc1 & 0xff;
+ codes[2] = (uc2 >> 8) & 0xff;
+ codes[3] = uc2 & 0xff;
+
+ rule = gl_uninorm_compose_lookup (codes, 4);
+ if (rule != NULL)
+ return rule->combined;
+#endif
+ }
+ }
+ return 0;
+}
diff --git a/gnulib/lib/uninorm/decompose-internal.c b/gnulib/lib/uninorm/decompose-internal.c
new file mode 100644
index 00000000..f9c2277c
--- /dev/null
+++ b/gnulib/lib/uninorm/decompose-internal.c
@@ -0,0 +1,28 @@
+/* Decomposition of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "decompose-internal.h"
+
+#define ELEMENT struct ucs4_with_ccc
+#define COMPARE(a,b) ((a)->ccc - (b)->ccc)
+#define STATIC
+#define merge_sort_fromto gl_uninorm_decompose_merge_sort_fromto
+#define merge_sort_inplace gl_uninorm_decompose_merge_sort_inplace
+#include "array-mergesort.h"
diff --git a/gnulib/lib/uninorm/decompose-internal.h b/gnulib/lib/uninorm/decompose-internal.h
new file mode 100644
index 00000000..d952e2fd
--- /dev/null
+++ b/gnulib/lib/uninorm/decompose-internal.h
@@ -0,0 +1,36 @@
+/* Decomposition of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+#include "unitypes.h"
+
+/* Variant of uc_decomposition that does not produce the 'tag'. */
+extern int
+ uc_compat_decomposition (ucs4_t uc, ucs4_t *decomposition);
+
+/* A Unicode character together with its canonical combining class. */
+struct ucs4_with_ccc
+{
+ ucs4_t code;
+ int ccc; /* range 0..255 */
+};
+
+/* Stable-sort an array of 'struct ucs4_with_ccc'. */
+extern void
+ gl_uninorm_decompose_merge_sort_inplace (struct ucs4_with_ccc *src, size_t n,
+ struct ucs4_with_ccc *tmp);
diff --git a/gnulib/lib/uninorm/decomposing-form.c b/gnulib/lib/uninorm/decomposing-form.c
new file mode 100644
index 00000000..a19f6d3f
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposing-form.c
@@ -0,0 +1,29 @@
+/* Decomposing variant of a normalization form.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+
+uninorm_t
+uninorm_decomposing_form (uninorm_t nf)
+{
+ return nf->decomposing_variant;
+}
diff --git a/gnulib/lib/uninorm/decomposition-table.c b/gnulib/lib/uninorm/decomposition-table.c
new file mode 100644
index 00000000..b19b47a0
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition-table.c
@@ -0,0 +1,23 @@
+/* Decomposition of Unicode characters.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm/decomposition-table.h"
+
+#include "uninorm/decomposition-table2.h"
diff --git a/gnulib/lib/uninorm/decomposition-table.h b/gnulib/lib/uninorm/decomposition-table.h
new file mode 100644
index 00000000..9238ff95
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition-table.h
@@ -0,0 +1,48 @@
+/* Decomposition of Unicode characters.
+ Copyright (C) 2001-2003, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include "unitypes.h"
+
+/* The decomposition table is made of two parts:
+ - A table containing the actual arrays of decomposed equivalents.
+ (This table is separate because the maximum length of a decomposition
+ is 18, much larger than than the average length 1.497 of a decomposition).
+ - A 3-level table of indices into this array. */
+
+#include "decomposition-table1.h"
+
+static inline unsigned short
+decomp_index (ucs4_t uc)
+{
+ unsigned int index1 = uc >> decomp_header_0;
+ if (index1 < decomp_header_1)
+ {
+ int lookup1 = gl_uninorm_decomp_index_table.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> decomp_header_2) & decomp_header_3;
+ int lookup2 = gl_uninorm_decomp_index_table.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = uc & decomp_header_4;
+ return gl_uninorm_decomp_index_table.level3[lookup2 + index3];
+ }
+ }
+ }
+ return (unsigned short)(-1);
+}
diff --git a/gnulib/lib/uninorm/decomposition-table1.h b/gnulib/lib/uninorm/decomposition-table1.h
new file mode 100644
index 00000000..4ac70f4c
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition-table1.h
@@ -0,0 +1,20 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Decomposition of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 5.1.0. */
+
+extern const unsigned char gl_uninorm_decomp_chars_table[];
+
+#define decomp_header_0 10
+#define decomp_header_1 191
+#define decomp_header_2 5
+#define decomp_header_3 31
+#define decomp_header_4 31
+
+typedef struct
+ {
+ int level1[191];
+ int level2[18 << 5];
+ unsigned short level3[254 << 5];
+ }
+decomp_index_table_t;
+extern const decomp_index_table_t gl_uninorm_decomp_index_table;
diff --git a/gnulib/lib/uninorm/decomposition-table2.h b/gnulib/lib/uninorm/decomposition-table2.h
new file mode 100644
index 00000000..f80f4342
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition-table2.h
@@ -0,0 +1,3152 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Decomposition of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 5.1.0. */
+
+const unsigned char gl_uninorm_decomp_chars_table[] =
+{
+ 0x08, 0x00, 0x20, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x08, 0x20, 0x00, 0x61,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x04, 0x20, 0x00, 0x32, 0x20, 0x00, 0x33,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x01, 0x40, 0x03, 0xBC, 0xC0, 0x00, 0x20,
+ 0x00, 0x03, 0x27, 0x20, 0x00, 0x31, 0x20, 0x00, 0x6F, 0xBC, 0x00, 0x31,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x34, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x32, 0xBC, 0x00, 0x33, 0x80, 0x20, 0x44, 0x00, 0x00, 0x34,
+ 0x80, 0x00, 0x41, 0x00, 0x03, 0x00, 0x80, 0x00, 0x41, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x41, 0x00, 0x03, 0x02, 0x80, 0x00, 0x41, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x41, 0x00, 0x03, 0x08, 0x80, 0x00, 0x41, 0x00, 0x03, 0x0A,
+ 0x80, 0x00, 0x43, 0x00, 0x03, 0x27, 0x80, 0x00, 0x45, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x45, 0x00, 0x03, 0x01, 0x80, 0x00, 0x45, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x45, 0x00, 0x03, 0x08, 0x80, 0x00, 0x49, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x49, 0x00, 0x03, 0x01, 0x80, 0x00, 0x49, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x49, 0x00, 0x03, 0x08, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x4F, 0x00, 0x03, 0x00, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x4F, 0x00, 0x03, 0x02, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x4F, 0x00, 0x03, 0x08, 0x80, 0x00, 0x55, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x55, 0x00, 0x03, 0x01, 0x80, 0x00, 0x55, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x55, 0x00, 0x03, 0x08, 0x80, 0x00, 0x59, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x00, 0x80, 0x00, 0x61, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x02, 0x80, 0x00, 0x61, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x08, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0A,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x27, 0x80, 0x00, 0x65, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x01, 0x80, 0x00, 0x65, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x08, 0x80, 0x00, 0x69, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x01, 0x80, 0x00, 0x69, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x08, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x02, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x08, 0x80, 0x00, 0x75, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x01, 0x80, 0x00, 0x75, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x08, 0x80, 0x00, 0x79, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x08, 0x80, 0x00, 0x41, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x04, 0x80, 0x00, 0x41, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x06, 0x80, 0x00, 0x41, 0x00, 0x03, 0x28,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x28, 0x80, 0x00, 0x43, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x01, 0x80, 0x00, 0x43, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x02, 0x80, 0x00, 0x43, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x07, 0x80, 0x00, 0x43, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x44, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x45, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x04, 0x80, 0x00, 0x45, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x06, 0x80, 0x00, 0x45, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x07, 0x80, 0x00, 0x45, 0x00, 0x03, 0x28,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x28, 0x80, 0x00, 0x45, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x47, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x02, 0x80, 0x00, 0x47, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x06, 0x80, 0x00, 0x47, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x07, 0x80, 0x00, 0x47, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x27, 0x80, 0x00, 0x48, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x02, 0x80, 0x00, 0x49, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x03, 0x80, 0x00, 0x49, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x04, 0x80, 0x00, 0x49, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x06, 0x80, 0x00, 0x49, 0x00, 0x03, 0x28,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x28, 0x80, 0x00, 0x49, 0x00, 0x03, 0x07,
+ 0xC0, 0x00, 0x49, 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x6A,
+ 0x80, 0x00, 0x4A, 0x00, 0x03, 0x02, 0x80, 0x00, 0x6A, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x4B, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x4C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x4C, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x4C, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x0C,
+ 0xC0, 0x00, 0x4C, 0x00, 0x00, 0xB7, 0xC0, 0x00, 0x6C, 0x00, 0x00, 0xB7,
+ 0x80, 0x00, 0x4E, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x4E, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x4E, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x0C,
+ 0xC0, 0x02, 0xBC, 0x00, 0x00, 0x6E, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x06, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x0B,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0B, 0x80, 0x00, 0x52, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x01, 0x80, 0x00, 0x52, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x27, 0x80, 0x00, 0x52, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x53, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x01, 0x80, 0x00, 0x53, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x02, 0x80, 0x00, 0x53, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x27, 0x80, 0x00, 0x53, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x54, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x27, 0x80, 0x00, 0x54, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x55, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x03, 0x80, 0x00, 0x55, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x04, 0x80, 0x00, 0x55, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x06, 0x80, 0x00, 0x55, 0x00, 0x03, 0x0A,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x0A, 0x80, 0x00, 0x55, 0x00, 0x03, 0x0B,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x0B, 0x80, 0x00, 0x55, 0x00, 0x03, 0x28,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x28, 0x80, 0x00, 0x57, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x02, 0x80, 0x00, 0x59, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x02, 0x80, 0x00, 0x59, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0x5A, 0x00, 0x03, 0x01, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x5A, 0x00, 0x03, 0x07, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x5A, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x0C,
+ 0x40, 0x00, 0x73, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x1B, 0x80, 0x00, 0x6F,
+ 0x00, 0x03, 0x1B, 0x80, 0x00, 0x55, 0x00, 0x03, 0x1B, 0x80, 0x00, 0x75,
+ 0x00, 0x03, 0x1B, 0xC0, 0x00, 0x44, 0x00, 0x01, 0x7D, 0xC0, 0x00, 0x44,
+ 0x00, 0x01, 0x7E, 0xC0, 0x00, 0x64, 0x00, 0x01, 0x7E, 0xC0, 0x00, 0x4C,
+ 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x4C, 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x6C,
+ 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x4E, 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x4E,
+ 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x6E, 0x00, 0x00, 0x6A, 0x80, 0x00, 0x41,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x49,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x69, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x55,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x75, 0x00, 0x03, 0x0C, 0x80, 0x00, 0xDC,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x04, 0x80, 0x00, 0xDC,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x01, 0x80, 0x00, 0xDC,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x0C, 0x80, 0x00, 0xDC,
+ 0x00, 0x03, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC4,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xE4, 0x00, 0x03, 0x04, 0x80, 0x02, 0x26,
+ 0x00, 0x03, 0x04, 0x80, 0x02, 0x27, 0x00, 0x03, 0x04, 0x80, 0x00, 0xC6,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xE6, 0x00, 0x03, 0x04, 0x80, 0x00, 0x47,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x67, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4B,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x28, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x28, 0x80, 0x01, 0xEA,
+ 0x00, 0x03, 0x04, 0x80, 0x01, 0xEB, 0x00, 0x03, 0x04, 0x80, 0x01, 0xB7,
+ 0x00, 0x03, 0x0C, 0x80, 0x02, 0x92, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6A,
+ 0x00, 0x03, 0x0C, 0xC0, 0x00, 0x44, 0x00, 0x00, 0x5A, 0xC0, 0x00, 0x44,
+ 0x00, 0x00, 0x7A, 0xC0, 0x00, 0x64, 0x00, 0x00, 0x7A, 0x80, 0x00, 0x47,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0x67, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4E,
+ 0x00, 0x03, 0x00, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC5,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xE5, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC6,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xE6, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD8,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xF8, 0x00, 0x03, 0x01, 0x80, 0x00, 0x41,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x41,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x61, 0x00, 0x03, 0x11, 0x80, 0x00, 0x45,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x65, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x45,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x65, 0x00, 0x03, 0x11, 0x80, 0x00, 0x49,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x69, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x49,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x69, 0x00, 0x03, 0x11, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x11, 0x80, 0x00, 0x52,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x72, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x52,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x72, 0x00, 0x03, 0x11, 0x80, 0x00, 0x55,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x75, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x55,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x75, 0x00, 0x03, 0x11, 0x80, 0x00, 0x53,
+ 0x00, 0x03, 0x26, 0x80, 0x00, 0x73, 0x00, 0x03, 0x26, 0x80, 0x00, 0x54,
+ 0x00, 0x03, 0x26, 0x80, 0x00, 0x74, 0x00, 0x03, 0x26, 0x80, 0x00, 0x48,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x68, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x41,
+ 0x00, 0x03, 0x07, 0x80, 0x00, 0x61, 0x00, 0x03, 0x07, 0x80, 0x00, 0x45,
+ 0x00, 0x03, 0x27, 0x80, 0x00, 0x65, 0x00, 0x03, 0x27, 0x80, 0x00, 0xD6,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xF6, 0x00, 0x03, 0x04, 0x80, 0x00, 0xD5,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xF5, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x07, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x07, 0x80, 0x02, 0x2E,
+ 0x00, 0x03, 0x04, 0x80, 0x02, 0x2F, 0x00, 0x03, 0x04, 0x80, 0x00, 0x59,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0x79, 0x00, 0x03, 0x04, 0x20, 0x00, 0x68,
+ 0x20, 0x02, 0x66, 0x20, 0x00, 0x6A, 0x20, 0x00, 0x72, 0x20, 0x02, 0x79,
+ 0x20, 0x02, 0x7B, 0x20, 0x02, 0x81, 0x20, 0x00, 0x77, 0x20, 0x00, 0x79,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x06, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x07,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x0A, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x28,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x03, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x0B,
+ 0x20, 0x02, 0x63, 0x20, 0x00, 0x6C, 0x20, 0x00, 0x73, 0x20, 0x00, 0x78,
+ 0x20, 0x02, 0x95, 0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x08, 0x00, 0x03, 0x01, 0x00, 0x02, 0xB9, 0xC0, 0x00, 0x20,
+ 0x00, 0x03, 0x45, 0x00, 0x00, 0x3B, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xA8, 0x00, 0x03, 0x01, 0x80, 0x03, 0x91, 0x00, 0x03, 0x01,
+ 0x00, 0x00, 0xB7, 0x80, 0x03, 0x95, 0x00, 0x03, 0x01, 0x80, 0x03, 0x97,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0x99, 0x00, 0x03, 0x01, 0x80, 0x03, 0x9F,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x01, 0x80, 0x03, 0xA9,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xCA, 0x00, 0x03, 0x01, 0x80, 0x03, 0x99,
+ 0x00, 0x03, 0x08, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x08, 0x80, 0x03, 0xB1,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB7,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x01, 0x80, 0x03, 0xCB,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x08, 0x80, 0x03, 0xC5,
+ 0x00, 0x03, 0x08, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x01, 0x80, 0x03, 0xC5,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x01, 0x40, 0x03, 0xB2,
+ 0x40, 0x03, 0xB8, 0x40, 0x03, 0xA5, 0x80, 0x03, 0xD2, 0x00, 0x03, 0x01,
+ 0x80, 0x03, 0xD2, 0x00, 0x03, 0x08, 0x40, 0x03, 0xC6, 0x40, 0x03, 0xC0,
+ 0x40, 0x03, 0xBA, 0x40, 0x03, 0xC1, 0x40, 0x03, 0xC2, 0x40, 0x03, 0x98,
+ 0x40, 0x03, 0xB5, 0x40, 0x03, 0xA3, 0x80, 0x04, 0x15, 0x00, 0x03, 0x00,
+ 0x80, 0x04, 0x15, 0x00, 0x03, 0x08, 0x80, 0x04, 0x13, 0x00, 0x03, 0x01,
+ 0x80, 0x04, 0x06, 0x00, 0x03, 0x08, 0x80, 0x04, 0x1A, 0x00, 0x03, 0x01,
+ 0x80, 0x04, 0x18, 0x00, 0x03, 0x00, 0x80, 0x04, 0x23, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x18, 0x00, 0x03, 0x06, 0x80, 0x04, 0x38, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x35, 0x00, 0x03, 0x00, 0x80, 0x04, 0x35, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x33, 0x00, 0x03, 0x01, 0x80, 0x04, 0x56, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x3A, 0x00, 0x03, 0x01, 0x80, 0x04, 0x38, 0x00, 0x03, 0x00,
+ 0x80, 0x04, 0x43, 0x00, 0x03, 0x06, 0x80, 0x04, 0x74, 0x00, 0x03, 0x0F,
+ 0x80, 0x04, 0x75, 0x00, 0x03, 0x0F, 0x80, 0x04, 0x16, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x36, 0x00, 0x03, 0x06, 0x80, 0x04, 0x10, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x30, 0x00, 0x03, 0x06, 0x80, 0x04, 0x10, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x30, 0x00, 0x03, 0x08, 0x80, 0x04, 0x15, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x35, 0x00, 0x03, 0x06, 0x80, 0x04, 0xD8, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0xD9, 0x00, 0x03, 0x08, 0x80, 0x04, 0x16, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x36, 0x00, 0x03, 0x08, 0x80, 0x04, 0x17, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x37, 0x00, 0x03, 0x08, 0x80, 0x04, 0x18, 0x00, 0x03, 0x04,
+ 0x80, 0x04, 0x38, 0x00, 0x03, 0x04, 0x80, 0x04, 0x18, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x38, 0x00, 0x03, 0x08, 0x80, 0x04, 0x1E, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x3E, 0x00, 0x03, 0x08, 0x80, 0x04, 0xE8, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0xE9, 0x00, 0x03, 0x08, 0x80, 0x04, 0x2D, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x4D, 0x00, 0x03, 0x08, 0x80, 0x04, 0x23, 0x00, 0x03, 0x04,
+ 0x80, 0x04, 0x43, 0x00, 0x03, 0x04, 0x80, 0x04, 0x23, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x43, 0x00, 0x03, 0x08, 0x80, 0x04, 0x23, 0x00, 0x03, 0x0B,
+ 0x80, 0x04, 0x43, 0x00, 0x03, 0x0B, 0x80, 0x04, 0x27, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x47, 0x00, 0x03, 0x08, 0x80, 0x04, 0x2B, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x4B, 0x00, 0x03, 0x08, 0xC0, 0x05, 0x65, 0x00, 0x05, 0x82,
+ 0x80, 0x06, 0x27, 0x00, 0x06, 0x53, 0x80, 0x06, 0x27, 0x00, 0x06, 0x54,
+ 0x80, 0x06, 0x48, 0x00, 0x06, 0x54, 0x80, 0x06, 0x27, 0x00, 0x06, 0x55,
+ 0x80, 0x06, 0x4A, 0x00, 0x06, 0x54, 0xC0, 0x06, 0x27, 0x00, 0x06, 0x74,
+ 0xC0, 0x06, 0x48, 0x00, 0x06, 0x74, 0xC0, 0x06, 0xC7, 0x00, 0x06, 0x74,
+ 0xC0, 0x06, 0x4A, 0x00, 0x06, 0x74, 0x80, 0x06, 0xD5, 0x00, 0x06, 0x54,
+ 0x80, 0x06, 0xC1, 0x00, 0x06, 0x54, 0x80, 0x06, 0xD2, 0x00, 0x06, 0x54,
+ 0x80, 0x09, 0x28, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x30, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x33, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x15, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x16, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x17, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x1C, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x21, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x22, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x2B, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x2F, 0x00, 0x09, 0x3C, 0x80, 0x09, 0xC7, 0x00, 0x09, 0xBE,
+ 0x80, 0x09, 0xC7, 0x00, 0x09, 0xD7, 0x80, 0x09, 0xA1, 0x00, 0x09, 0xBC,
+ 0x80, 0x09, 0xA2, 0x00, 0x09, 0xBC, 0x80, 0x09, 0xAF, 0x00, 0x09, 0xBC,
+ 0x80, 0x0A, 0x32, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x38, 0x00, 0x0A, 0x3C,
+ 0x80, 0x0A, 0x16, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x17, 0x00, 0x0A, 0x3C,
+ 0x80, 0x0A, 0x1C, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x2B, 0x00, 0x0A, 0x3C,
+ 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x56, 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x3E,
+ 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x57, 0x80, 0x0B, 0x21, 0x00, 0x0B, 0x3C,
+ 0x80, 0x0B, 0x22, 0x00, 0x0B, 0x3C, 0x80, 0x0B, 0x92, 0x00, 0x0B, 0xD7,
+ 0x80, 0x0B, 0xC6, 0x00, 0x0B, 0xBE, 0x80, 0x0B, 0xC7, 0x00, 0x0B, 0xBE,
+ 0x80, 0x0B, 0xC6, 0x00, 0x0B, 0xD7, 0x80, 0x0C, 0x46, 0x00, 0x0C, 0x56,
+ 0x80, 0x0C, 0xBF, 0x00, 0x0C, 0xD5, 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xD5,
+ 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xD6, 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xC2,
+ 0x80, 0x0C, 0xCA, 0x00, 0x0C, 0xD5, 0x80, 0x0D, 0x46, 0x00, 0x0D, 0x3E,
+ 0x80, 0x0D, 0x47, 0x00, 0x0D, 0x3E, 0x80, 0x0D, 0x46, 0x00, 0x0D, 0x57,
+ 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xCA, 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xCF,
+ 0x80, 0x0D, 0xDC, 0x00, 0x0D, 0xCA, 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xDF,
+ 0xC0, 0x0E, 0x4D, 0x00, 0x0E, 0x32, 0xC0, 0x0E, 0xCD, 0x00, 0x0E, 0xB2,
+ 0xC0, 0x0E, 0xAB, 0x00, 0x0E, 0x99, 0xC0, 0x0E, 0xAB, 0x00, 0x0E, 0xA1,
+ 0x08, 0x0F, 0x0B, 0x80, 0x0F, 0x42, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x4C,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x51, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x56,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x5B, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x40,
+ 0x00, 0x0F, 0xB5, 0x80, 0x0F, 0x71, 0x00, 0x0F, 0x72, 0x80, 0x0F, 0x71,
+ 0x00, 0x0F, 0x74, 0x80, 0x0F, 0xB2, 0x00, 0x0F, 0x80, 0xC0, 0x0F, 0xB2,
+ 0x00, 0x0F, 0x81, 0x80, 0x0F, 0xB3, 0x00, 0x0F, 0x80, 0xC0, 0x0F, 0xB3,
+ 0x00, 0x0F, 0x81, 0x80, 0x0F, 0x71, 0x00, 0x0F, 0x80, 0x80, 0x0F, 0x92,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x9C, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xA1,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xA6, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xAB,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x90, 0x00, 0x0F, 0xB5, 0x80, 0x10, 0x25,
+ 0x00, 0x10, 0x2E, 0x20, 0x10, 0xDC, 0x80, 0x1B, 0x05, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x07, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x09, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x0B, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x0D, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x11, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x3A, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x3C, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x3E, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x3F, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x42, 0x00, 0x1B, 0x35,
+ 0x20, 0x00, 0x41, 0x20, 0x00, 0xC6, 0x20, 0x00, 0x42, 0x20, 0x00, 0x44,
+ 0x20, 0x00, 0x45, 0x20, 0x01, 0x8E, 0x20, 0x00, 0x47, 0x20, 0x00, 0x48,
+ 0x20, 0x00, 0x49, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x4B, 0x20, 0x00, 0x4C,
+ 0x20, 0x00, 0x4D, 0x20, 0x00, 0x4E, 0x20, 0x00, 0x4F, 0x20, 0x02, 0x22,
+ 0x20, 0x00, 0x50, 0x20, 0x00, 0x52, 0x20, 0x00, 0x54, 0x20, 0x00, 0x55,
+ 0x20, 0x00, 0x57, 0x20, 0x00, 0x61, 0x20, 0x02, 0x50, 0x20, 0x02, 0x51,
+ 0x20, 0x1D, 0x02, 0x20, 0x00, 0x62, 0x20, 0x00, 0x64, 0x20, 0x00, 0x65,
+ 0x20, 0x02, 0x59, 0x20, 0x02, 0x5B, 0x20, 0x02, 0x5C, 0x20, 0x00, 0x67,
+ 0x20, 0x00, 0x6B, 0x20, 0x00, 0x6D, 0x20, 0x01, 0x4B, 0x20, 0x00, 0x6F,
+ 0x20, 0x02, 0x54, 0x20, 0x1D, 0x16, 0x20, 0x1D, 0x17, 0x20, 0x00, 0x70,
+ 0x20, 0x00, 0x74, 0x20, 0x00, 0x75, 0x20, 0x1D, 0x1D, 0x20, 0x02, 0x6F,
+ 0x20, 0x00, 0x76, 0x20, 0x1D, 0x25, 0x20, 0x03, 0xB2, 0x20, 0x03, 0xB3,
+ 0x20, 0x03, 0xB4, 0x20, 0x03, 0xC6, 0x20, 0x03, 0xC7, 0x24, 0x00, 0x69,
+ 0x24, 0x00, 0x72, 0x24, 0x00, 0x75, 0x24, 0x00, 0x76, 0x24, 0x03, 0xB2,
+ 0x24, 0x03, 0xB3, 0x24, 0x03, 0xC1, 0x24, 0x03, 0xC6, 0x24, 0x03, 0xC7,
+ 0x20, 0x04, 0x3D, 0x20, 0x02, 0x52, 0x20, 0x00, 0x63, 0x20, 0x02, 0x55,
+ 0x20, 0x00, 0xF0, 0x20, 0x02, 0x5C, 0x20, 0x00, 0x66, 0x20, 0x02, 0x5F,
+ 0x20, 0x02, 0x61, 0x20, 0x02, 0x65, 0x20, 0x02, 0x68, 0x20, 0x02, 0x69,
+ 0x20, 0x02, 0x6A, 0x20, 0x1D, 0x7B, 0x20, 0x02, 0x9D, 0x20, 0x02, 0x6D,
+ 0x20, 0x1D, 0x85, 0x20, 0x02, 0x9F, 0x20, 0x02, 0x71, 0x20, 0x02, 0x70,
+ 0x20, 0x02, 0x72, 0x20, 0x02, 0x73, 0x20, 0x02, 0x74, 0x20, 0x02, 0x75,
+ 0x20, 0x02, 0x78, 0x20, 0x02, 0x82, 0x20, 0x02, 0x83, 0x20, 0x01, 0xAB,
+ 0x20, 0x02, 0x89, 0x20, 0x02, 0x8A, 0x20, 0x1D, 0x1C, 0x20, 0x02, 0x8B,
+ 0x20, 0x02, 0x8C, 0x20, 0x00, 0x7A, 0x20, 0x02, 0x90, 0x20, 0x02, 0x91,
+ 0x20, 0x02, 0x92, 0x20, 0x03, 0xB8, 0x80, 0x00, 0x41, 0x00, 0x03, 0x25,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x25, 0x80, 0x00, 0x42, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x62, 0x00, 0x03, 0x07, 0x80, 0x00, 0x42, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x62, 0x00, 0x03, 0x23, 0x80, 0x00, 0x42, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x62, 0x00, 0x03, 0x31, 0x80, 0x00, 0xC7, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xE7, 0x00, 0x03, 0x01, 0x80, 0x00, 0x44, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x07, 0x80, 0x00, 0x44, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x23, 0x80, 0x00, 0x44, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x31, 0x80, 0x00, 0x44, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x27, 0x80, 0x00, 0x44, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x2D, 0x80, 0x01, 0x12, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0x13, 0x00, 0x03, 0x00, 0x80, 0x01, 0x12, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0x13, 0x00, 0x03, 0x01, 0x80, 0x00, 0x45, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x45, 0x00, 0x03, 0x30,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x30, 0x80, 0x02, 0x28, 0x00, 0x03, 0x06,
+ 0x80, 0x02, 0x29, 0x00, 0x03, 0x06, 0x80, 0x00, 0x46, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x66, 0x00, 0x03, 0x07, 0x80, 0x00, 0x47, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x04, 0x80, 0x00, 0x48, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x07, 0x80, 0x00, 0x48, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x23, 0x80, 0x00, 0x48, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x08, 0x80, 0x00, 0x48, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x27, 0x80, 0x00, 0x48, 0x00, 0x03, 0x2E,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x2E, 0x80, 0x00, 0x49, 0x00, 0x03, 0x30,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x30, 0x80, 0x00, 0xCF, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xEF, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x6B, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6B, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x6B, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6C, 0x00, 0x03, 0x23, 0x80, 0x1E, 0x36, 0x00, 0x03, 0x04,
+ 0x80, 0x1E, 0x37, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x6C, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x6C, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x6D, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x6D, 0x00, 0x03, 0x07, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6D, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x6E, 0x00, 0x03, 0x07, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6E, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x6E, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x6E, 0x00, 0x03, 0x2D, 0x80, 0x00, 0xD5, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xF5, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD5, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0xF5, 0x00, 0x03, 0x08, 0x80, 0x01, 0x4C, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0x4D, 0x00, 0x03, 0x00, 0x80, 0x01, 0x4C, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0x4D, 0x00, 0x03, 0x01, 0x80, 0x00, 0x50, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x70, 0x00, 0x03, 0x01, 0x80, 0x00, 0x50, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x70, 0x00, 0x03, 0x07, 0x80, 0x00, 0x52, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x07, 0x80, 0x00, 0x52, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x23, 0x80, 0x1E, 0x5A, 0x00, 0x03, 0x04,
+ 0x80, 0x1E, 0x5B, 0x00, 0x03, 0x04, 0x80, 0x00, 0x52, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x31, 0x80, 0x00, 0x53, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x07, 0x80, 0x00, 0x53, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x23, 0x80, 0x01, 0x5A, 0x00, 0x03, 0x07,
+ 0x80, 0x01, 0x5B, 0x00, 0x03, 0x07, 0x80, 0x01, 0x60, 0x00, 0x03, 0x07,
+ 0x80, 0x01, 0x61, 0x00, 0x03, 0x07, 0x80, 0x1E, 0x62, 0x00, 0x03, 0x07,
+ 0x80, 0x1E, 0x63, 0x00, 0x03, 0x07, 0x80, 0x00, 0x54, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x07, 0x80, 0x00, 0x54, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x23, 0x80, 0x00, 0x54, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x31, 0x80, 0x00, 0x54, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x55, 0x00, 0x03, 0x24,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x24, 0x80, 0x00, 0x55, 0x00, 0x03, 0x30,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x30, 0x80, 0x00, 0x55, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x2D, 0x80, 0x01, 0x68, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0x69, 0x00, 0x03, 0x01, 0x80, 0x01, 0x6A, 0x00, 0x03, 0x08,
+ 0x80, 0x01, 0x6B, 0x00, 0x03, 0x08, 0x80, 0x00, 0x56, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x76, 0x00, 0x03, 0x03, 0x80, 0x00, 0x56, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x76, 0x00, 0x03, 0x23, 0x80, 0x00, 0x57, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x00, 0x80, 0x00, 0x57, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x01, 0x80, 0x00, 0x57, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x08, 0x80, 0x00, 0x57, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x07, 0x80, 0x00, 0x57, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x23, 0x80, 0x00, 0x58, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x78, 0x00, 0x03, 0x07, 0x80, 0x00, 0x58, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0x78, 0x00, 0x03, 0x08, 0x80, 0x00, 0x59, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x07, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x7A, 0x00, 0x03, 0x02, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x7A, 0x00, 0x03, 0x23, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x7A, 0x00, 0x03, 0x31, 0x80, 0x00, 0x68, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x08, 0x80, 0x00, 0x77, 0x00, 0x03, 0x0A,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x0A, 0xC0, 0x00, 0x61, 0x00, 0x02, 0xBE,
+ 0x80, 0x01, 0x7F, 0x00, 0x03, 0x07, 0x80, 0x00, 0x41, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x23, 0x80, 0x00, 0x41, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x09, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xE2, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0xE2, 0x00, 0x03, 0x09, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0xE2, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xA0, 0x00, 0x03, 0x02,
+ 0x80, 0x1E, 0xA1, 0x00, 0x03, 0x02, 0x80, 0x01, 0x02, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0x03, 0x00, 0x03, 0x01, 0x80, 0x01, 0x02, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0x03, 0x00, 0x03, 0x00, 0x80, 0x01, 0x02, 0x00, 0x03, 0x09,
+ 0x80, 0x01, 0x03, 0x00, 0x03, 0x09, 0x80, 0x01, 0x02, 0x00, 0x03, 0x03,
+ 0x80, 0x01, 0x03, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xA0, 0x00, 0x03, 0x06,
+ 0x80, 0x1E, 0xA1, 0x00, 0x03, 0x06, 0x80, 0x00, 0x45, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x23, 0x80, 0x00, 0x45, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x09, 0x80, 0x00, 0x45, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x03, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xEA, 0x00, 0x03, 0x01, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0xEA, 0x00, 0x03, 0x00, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0xEA, 0x00, 0x03, 0x09, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0xEA, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xB8, 0x00, 0x03, 0x02,
+ 0x80, 0x1E, 0xB9, 0x00, 0x03, 0x02, 0x80, 0x00, 0x49, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x09, 0x80, 0x00, 0x49, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x09, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xF4, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0xF4, 0x00, 0x03, 0x00, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0xF4, 0x00, 0x03, 0x09, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0xF4, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xCC, 0x00, 0x03, 0x02,
+ 0x80, 0x1E, 0xCD, 0x00, 0x03, 0x02, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x01, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x00, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x09,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x09, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x03,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x03, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x23,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x23, 0x80, 0x00, 0x55, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x23, 0x80, 0x00, 0x55, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x09, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x01, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x00, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x09,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x09, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x03,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x03, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x23,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x23, 0x80, 0x00, 0x59, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x00, 0x80, 0x00, 0x59, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x23, 0x80, 0x00, 0x59, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x09, 0x80, 0x00, 0x59, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x03, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xB1, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x01, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x01, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x01, 0x00, 0x03, 0x42, 0x80, 0x03, 0x91, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x91, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x09, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x09, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x09, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xB5, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x10, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x11, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x10, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x11, 0x00, 0x03, 0x01, 0x80, 0x03, 0x95, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x95, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x18, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x19, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x18, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x19, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xB7, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x21, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x21, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x21, 0x00, 0x03, 0x42, 0x80, 0x03, 0x97, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x97, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x29, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x29, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x29, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xB9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x31, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x31, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x31, 0x00, 0x03, 0x42, 0x80, 0x03, 0x99, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x99, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x39, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x39, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x39, 0x00, 0x03, 0x42, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xBF, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x40, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x41, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x40, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x41, 0x00, 0x03, 0x01, 0x80, 0x03, 0x9F, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x9F, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x48, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x49, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x48, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x49, 0x00, 0x03, 0x01, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xC5, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x51, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x51, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x51, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x14,
+ 0x80, 0x1F, 0x59, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x59, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x59, 0x00, 0x03, 0x42, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xC9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x61, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x61, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x61, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA9, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xA9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x69, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x69, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x69, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x00,
+ 0x00, 0x03, 0xAC, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x00, 0x00, 0x03, 0xAD,
+ 0x80, 0x03, 0xB7, 0x00, 0x03, 0x00, 0x00, 0x03, 0xAE, 0x80, 0x03, 0xB9,
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0xAF, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x00,
+ 0x00, 0x03, 0xCC, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x00, 0x00, 0x03, 0xCD,
+ 0x80, 0x03, 0xC9, 0x00, 0x03, 0x00, 0x00, 0x03, 0xCE, 0x80, 0x1F, 0x00,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x01, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x02,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x03, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x04,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x05, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x06,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x07, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x08,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x09, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0A,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0C,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0E,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0F, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x20,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x21, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x22,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x23, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x24,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x25, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x26,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x27, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x28,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x29, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2A,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2C,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2E,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2F, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x60,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x61, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x62,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x63, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x64,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x65, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x66,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x67, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x68,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x69, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6A,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6C,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6E,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6F, 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1,
+ 0x00, 0x03, 0x06, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x04, 0x80, 0x1F, 0x70,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x45, 0x80, 0x03, 0xAC,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xB6,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0x91, 0x00, 0x03, 0x06, 0x80, 0x03, 0x91,
+ 0x00, 0x03, 0x04, 0x80, 0x03, 0x91, 0x00, 0x03, 0x00, 0x00, 0x03, 0x86,
+ 0x80, 0x03, 0x91, 0x00, 0x03, 0x45, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x13,
+ 0x00, 0x03, 0xB9, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x13, 0xC0, 0x00, 0x20,
+ 0x00, 0x03, 0x42, 0x80, 0x00, 0xA8, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x74,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x45, 0x80, 0x03, 0xAE,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xC6,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0x95, 0x00, 0x03, 0x00, 0x00, 0x03, 0x88,
+ 0x80, 0x03, 0x97, 0x00, 0x03, 0x00, 0x00, 0x03, 0x89, 0x80, 0x03, 0x97,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0xBF, 0x00, 0x03, 0x00, 0x80, 0x1F, 0xBF,
+ 0x00, 0x03, 0x01, 0x80, 0x1F, 0xBF, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB9,
+ 0x00, 0x03, 0x06, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x04, 0x80, 0x03, 0xCA,
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0x90, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x42,
+ 0x80, 0x03, 0xCA, 0x00, 0x03, 0x42, 0x80, 0x03, 0x99, 0x00, 0x03, 0x06,
+ 0x80, 0x03, 0x99, 0x00, 0x03, 0x04, 0x80, 0x03, 0x99, 0x00, 0x03, 0x00,
+ 0x00, 0x03, 0x8A, 0x80, 0x1F, 0xFE, 0x00, 0x03, 0x00, 0x80, 0x1F, 0xFE,
+ 0x00, 0x03, 0x01, 0x80, 0x1F, 0xFE, 0x00, 0x03, 0x42, 0x80, 0x03, 0xC5,
+ 0x00, 0x03, 0x06, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x04, 0x80, 0x03, 0xCB,
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0xB0, 0x80, 0x03, 0xC1, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xC1, 0x00, 0x03, 0x14, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x42,
+ 0x80, 0x03, 0xCB, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x06,
+ 0x80, 0x03, 0xA5, 0x00, 0x03, 0x04, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x00,
+ 0x00, 0x03, 0x8E, 0x80, 0x03, 0xA1, 0x00, 0x03, 0x14, 0x80, 0x00, 0xA8,
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0x85, 0x00, 0x00, 0x60, 0x80, 0x1F, 0x7C,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x45, 0x80, 0x03, 0xCE,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xF6,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0x9F, 0x00, 0x03, 0x00, 0x00, 0x03, 0x8C,
+ 0x80, 0x03, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x03, 0x8F, 0x80, 0x03, 0xA9,
+ 0x00, 0x03, 0x45, 0x00, 0x00, 0xB4, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x14,
+ 0x00, 0x20, 0x02, 0x00, 0x20, 0x03, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20,
+ 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x08, 0x00, 0x20,
+ 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x08, 0x20, 0x10,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x33, 0x40, 0x00, 0x2E, 0xC0, 0x00, 0x2E,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x2E, 0x80, 0x00, 0x2E, 0x00, 0x00, 0x2E,
+ 0x08, 0x00, 0x20, 0xC0, 0x20, 0x32, 0x00, 0x20, 0x32, 0xC0, 0x20, 0x32,
+ 0x80, 0x20, 0x32, 0x00, 0x20, 0x32, 0xC0, 0x20, 0x35, 0x00, 0x20, 0x35,
+ 0xC0, 0x20, 0x35, 0x80, 0x20, 0x35, 0x00, 0x20, 0x35, 0xC0, 0x00, 0x21,
+ 0x00, 0x00, 0x21, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x05, 0xC0, 0x00, 0x3F,
+ 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x21, 0xC0, 0x00, 0x21,
+ 0x00, 0x00, 0x3F, 0xC0, 0x20, 0x32, 0x80, 0x20, 0x32, 0x80, 0x20, 0x32,
+ 0x00, 0x20, 0x32, 0x40, 0x00, 0x20, 0x20, 0x00, 0x30, 0x20, 0x00, 0x69,
+ 0x20, 0x00, 0x34, 0x20, 0x00, 0x35, 0x20, 0x00, 0x36, 0x20, 0x00, 0x37,
+ 0x20, 0x00, 0x38, 0x20, 0x00, 0x39, 0x20, 0x00, 0x2B, 0x20, 0x22, 0x12,
+ 0x20, 0x00, 0x3D, 0x20, 0x00, 0x28, 0x20, 0x00, 0x29, 0x20, 0x00, 0x6E,
+ 0x24, 0x00, 0x30, 0x24, 0x00, 0x31, 0x24, 0x00, 0x32, 0x24, 0x00, 0x33,
+ 0x24, 0x00, 0x34, 0x24, 0x00, 0x35, 0x24, 0x00, 0x36, 0x24, 0x00, 0x37,
+ 0x24, 0x00, 0x38, 0x24, 0x00, 0x39, 0x24, 0x00, 0x2B, 0x24, 0x22, 0x12,
+ 0x24, 0x00, 0x3D, 0x24, 0x00, 0x28, 0x24, 0x00, 0x29, 0x24, 0x00, 0x61,
+ 0x24, 0x00, 0x65, 0x24, 0x00, 0x6F, 0x24, 0x00, 0x78, 0x24, 0x02, 0x59,
+ 0xC0, 0x00, 0x52, 0x00, 0x00, 0x73, 0xC0, 0x00, 0x61, 0x80, 0x00, 0x2F,
+ 0x00, 0x00, 0x63, 0xC0, 0x00, 0x61, 0x80, 0x00, 0x2F, 0x00, 0x00, 0x73,
+ 0x04, 0x00, 0x43, 0xC0, 0x00, 0xB0, 0x00, 0x00, 0x43, 0xC0, 0x00, 0x63,
+ 0x80, 0x00, 0x2F, 0x00, 0x00, 0x6F, 0xC0, 0x00, 0x63, 0x80, 0x00, 0x2F,
+ 0x00, 0x00, 0x75, 0x40, 0x01, 0x90, 0xC0, 0x00, 0xB0, 0x00, 0x00, 0x46,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x48, 0x04, 0x00, 0x48, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x68, 0x04, 0x01, 0x27, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49,
+ 0x04, 0x00, 0x4C, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x4E, 0xC0, 0x00, 0x4E,
+ 0x00, 0x00, 0x6F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x52, 0x04, 0x00, 0x52, 0xA0, 0x00, 0x53, 0x00, 0x00, 0x4D,
+ 0xC0, 0x00, 0x54, 0x80, 0x00, 0x45, 0x00, 0x00, 0x4C, 0xA0, 0x00, 0x54,
+ 0x00, 0x00, 0x4D, 0x04, 0x00, 0x5A, 0x00, 0x03, 0xA9, 0x04, 0x00, 0x5A,
+ 0x00, 0x00, 0x4B, 0x00, 0x00, 0xC5, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x4D,
+ 0x04, 0x00, 0x6F, 0x40, 0x05, 0xD0, 0x40, 0x05, 0xD1, 0x40, 0x05, 0xD2,
+ 0x40, 0x05, 0xD3, 0x04, 0x00, 0x69, 0xC0, 0x00, 0x46, 0x80, 0x00, 0x41,
+ 0x00, 0x00, 0x58, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xB3, 0x04, 0x03, 0x93,
+ 0x04, 0x03, 0xA0, 0x04, 0x22, 0x11, 0x04, 0x00, 0x44, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0xBC, 0x00, 0x31,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x33, 0xBC, 0x00, 0x32, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x33, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x35,
+ 0xBC, 0x00, 0x32, 0x80, 0x20, 0x44, 0x00, 0x00, 0x35, 0xBC, 0x00, 0x33,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x35, 0xBC, 0x00, 0x34, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x35, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x36,
+ 0xBC, 0x00, 0x35, 0x80, 0x20, 0x44, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x31,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x38, 0xBC, 0x00, 0x33, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x38, 0xBC, 0x00, 0x35, 0x80, 0x20, 0x44, 0x00, 0x00, 0x38,
+ 0xBC, 0x00, 0x37, 0x80, 0x20, 0x44, 0x00, 0x00, 0x38, 0xBC, 0x00, 0x31,
+ 0x00, 0x20, 0x44, 0x40, 0x00, 0x49, 0xC0, 0x00, 0x49, 0x00, 0x00, 0x49,
+ 0xC0, 0x00, 0x49, 0x80, 0x00, 0x49, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x49,
+ 0x00, 0x00, 0x56, 0x40, 0x00, 0x56, 0xC0, 0x00, 0x56, 0x00, 0x00, 0x49,
+ 0xC0, 0x00, 0x56, 0x80, 0x00, 0x49, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x56,
+ 0x80, 0x00, 0x49, 0x80, 0x00, 0x49, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x49,
+ 0x00, 0x00, 0x58, 0x40, 0x00, 0x58, 0xC0, 0x00, 0x58, 0x00, 0x00, 0x49,
+ 0xC0, 0x00, 0x58, 0x80, 0x00, 0x49, 0x00, 0x00, 0x49, 0x40, 0x00, 0x4C,
+ 0x40, 0x00, 0x43, 0x40, 0x00, 0x44, 0x40, 0x00, 0x4D, 0x40, 0x00, 0x69,
+ 0xC0, 0x00, 0x69, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x69, 0x80, 0x00, 0x69,
+ 0x00, 0x00, 0x69, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x76, 0x40, 0x00, 0x76,
+ 0xC0, 0x00, 0x76, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x76, 0x80, 0x00, 0x69,
+ 0x00, 0x00, 0x69, 0xC0, 0x00, 0x76, 0x80, 0x00, 0x69, 0x80, 0x00, 0x69,
+ 0x00, 0x00, 0x69, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x78, 0x40, 0x00, 0x78,
+ 0xC0, 0x00, 0x78, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x78, 0x80, 0x00, 0x69,
+ 0x00, 0x00, 0x69, 0x40, 0x00, 0x6C, 0x40, 0x00, 0x63, 0x40, 0x00, 0x64,
+ 0x40, 0x00, 0x6D, 0x80, 0x21, 0x90, 0x00, 0x03, 0x38, 0x80, 0x21, 0x92,
+ 0x00, 0x03, 0x38, 0x80, 0x21, 0x94, 0x00, 0x03, 0x38, 0x80, 0x21, 0xD0,
+ 0x00, 0x03, 0x38, 0x80, 0x21, 0xD4, 0x00, 0x03, 0x38, 0x80, 0x21, 0xD2,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x03, 0x00, 0x03, 0x38, 0x80, 0x22, 0x08,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x0B, 0x00, 0x03, 0x38, 0x80, 0x22, 0x23,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x25, 0x00, 0x03, 0x38, 0xC0, 0x22, 0x2B,
+ 0x00, 0x22, 0x2B, 0xC0, 0x22, 0x2B, 0x80, 0x22, 0x2B, 0x00, 0x22, 0x2B,
+ 0xC0, 0x22, 0x2E, 0x00, 0x22, 0x2E, 0xC0, 0x22, 0x2E, 0x80, 0x22, 0x2E,
+ 0x00, 0x22, 0x2E, 0x80, 0x22, 0x3C, 0x00, 0x03, 0x38, 0x80, 0x22, 0x43,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x45, 0x00, 0x03, 0x38, 0x80, 0x22, 0x48,
+ 0x00, 0x03, 0x38, 0x80, 0x00, 0x3D, 0x00, 0x03, 0x38, 0x80, 0x22, 0x61,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x4D, 0x00, 0x03, 0x38, 0x80, 0x00, 0x3C,
+ 0x00, 0x03, 0x38, 0x80, 0x00, 0x3E, 0x00, 0x03, 0x38, 0x80, 0x22, 0x64,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x65, 0x00, 0x03, 0x38, 0x80, 0x22, 0x72,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x73, 0x00, 0x03, 0x38, 0x80, 0x22, 0x76,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x77, 0x00, 0x03, 0x38, 0x80, 0x22, 0x7A,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x7B, 0x00, 0x03, 0x38, 0x80, 0x22, 0x82,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x83, 0x00, 0x03, 0x38, 0x80, 0x22, 0x86,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x87, 0x00, 0x03, 0x38, 0x80, 0x22, 0xA2,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0xA8, 0x00, 0x03, 0x38, 0x80, 0x22, 0xA9,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0xAB, 0x00, 0x03, 0x38, 0x80, 0x22, 0x7C,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x7D, 0x00, 0x03, 0x38, 0x80, 0x22, 0x91,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0x92, 0x00, 0x03, 0x38, 0x80, 0x22, 0xB2,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0xB3, 0x00, 0x03, 0x38, 0x80, 0x22, 0xB4,
+ 0x00, 0x03, 0x38, 0x80, 0x22, 0xB5, 0x00, 0x03, 0x38, 0x00, 0x30, 0x08,
+ 0x00, 0x30, 0x09, 0x1C, 0x00, 0x31, 0x1C, 0x00, 0x32, 0x1C, 0x00, 0x33,
+ 0x1C, 0x00, 0x34, 0x1C, 0x00, 0x35, 0x1C, 0x00, 0x36, 0x1C, 0x00, 0x37,
+ 0x1C, 0x00, 0x38, 0x1C, 0x00, 0x39, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x30,
+ 0x9C, 0x00, 0x31, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x32,
+ 0x9C, 0x00, 0x31, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x34,
+ 0x9C, 0x00, 0x31, 0x00, 0x00, 0x35, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x36,
+ 0x9C, 0x00, 0x31, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x38,
+ 0x9C, 0x00, 0x31, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x30,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x32, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x33,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x34, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x35, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x36, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x37,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x38, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x39, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x33, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x36, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x37, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x32, 0x80, 0x00, 0x30, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x31,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x32, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x33,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x34, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x35,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x36, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x37,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x38, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x39,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x32, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x33,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x36, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x37,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x30, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x62, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x63, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x64, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x65,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x66, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x67, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x68, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x69,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6A, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x6C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6E, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x70, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x71,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x72, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x73, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x74, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x75,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x76, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x77, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x78, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x79,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x7A, 0x00, 0x00, 0x29,
+ 0x1C, 0x00, 0x41, 0x1C, 0x00, 0x42, 0x1C, 0x00, 0x43, 0x1C, 0x00, 0x44,
+ 0x1C, 0x00, 0x45, 0x1C, 0x00, 0x46, 0x1C, 0x00, 0x47, 0x1C, 0x00, 0x48,
+ 0x1C, 0x00, 0x49, 0x1C, 0x00, 0x4A, 0x1C, 0x00, 0x4B, 0x1C, 0x00, 0x4C,
+ 0x1C, 0x00, 0x4D, 0x1C, 0x00, 0x4E, 0x1C, 0x00, 0x4F, 0x1C, 0x00, 0x50,
+ 0x1C, 0x00, 0x51, 0x1C, 0x00, 0x52, 0x1C, 0x00, 0x53, 0x1C, 0x00, 0x54,
+ 0x1C, 0x00, 0x55, 0x1C, 0x00, 0x56, 0x1C, 0x00, 0x57, 0x1C, 0x00, 0x58,
+ 0x1C, 0x00, 0x59, 0x1C, 0x00, 0x5A, 0x1C, 0x00, 0x61, 0x1C, 0x00, 0x62,
+ 0x1C, 0x00, 0x63, 0x1C, 0x00, 0x64, 0x1C, 0x00, 0x65, 0x1C, 0x00, 0x66,
+ 0x1C, 0x00, 0x67, 0x1C, 0x00, 0x68, 0x1C, 0x00, 0x69, 0x1C, 0x00, 0x6A,
+ 0x1C, 0x00, 0x6B, 0x1C, 0x00, 0x6C, 0x1C, 0x00, 0x6D, 0x1C, 0x00, 0x6E,
+ 0x1C, 0x00, 0x6F, 0x1C, 0x00, 0x70, 0x1C, 0x00, 0x71, 0x1C, 0x00, 0x72,
+ 0x1C, 0x00, 0x73, 0x1C, 0x00, 0x74, 0x1C, 0x00, 0x75, 0x1C, 0x00, 0x76,
+ 0x1C, 0x00, 0x77, 0x1C, 0x00, 0x78, 0x1C, 0x00, 0x79, 0x1C, 0x00, 0x7A,
+ 0x1C, 0x00, 0x30, 0xC0, 0x22, 0x2B, 0x80, 0x22, 0x2B, 0x80, 0x22, 0x2B,
+ 0x00, 0x22, 0x2B, 0xC0, 0x00, 0x3A, 0x80, 0x00, 0x3A, 0x00, 0x00, 0x3D,
+ 0xC0, 0x00, 0x3D, 0x00, 0x00, 0x3D, 0xC0, 0x00, 0x3D, 0x80, 0x00, 0x3D,
+ 0x00, 0x00, 0x3D, 0x80, 0x2A, 0xDD, 0x00, 0x03, 0x38, 0x24, 0x00, 0x6A,
+ 0x20, 0x00, 0x56, 0x20, 0x2D, 0x61, 0x40, 0x6B, 0xCD, 0x40, 0x9F, 0x9F,
+ 0x40, 0x4E, 0x00, 0x40, 0x4E, 0x28, 0x40, 0x4E, 0x36, 0x40, 0x4E, 0x3F,
+ 0x40, 0x4E, 0x59, 0x40, 0x4E, 0x85, 0x40, 0x4E, 0x8C, 0x40, 0x4E, 0xA0,
+ 0x40, 0x4E, 0xBA, 0x40, 0x51, 0x3F, 0x40, 0x51, 0x65, 0x40, 0x51, 0x6B,
+ 0x40, 0x51, 0x82, 0x40, 0x51, 0x96, 0x40, 0x51, 0xAB, 0x40, 0x51, 0xE0,
+ 0x40, 0x51, 0xF5, 0x40, 0x52, 0x00, 0x40, 0x52, 0x9B, 0x40, 0x52, 0xF9,
+ 0x40, 0x53, 0x15, 0x40, 0x53, 0x1A, 0x40, 0x53, 0x38, 0x40, 0x53, 0x41,
+ 0x40, 0x53, 0x5C, 0x40, 0x53, 0x69, 0x40, 0x53, 0x82, 0x40, 0x53, 0xB6,
+ 0x40, 0x53, 0xC8, 0x40, 0x53, 0xE3, 0x40, 0x56, 0xD7, 0x40, 0x57, 0x1F,
+ 0x40, 0x58, 0xEB, 0x40, 0x59, 0x02, 0x40, 0x59, 0x0A, 0x40, 0x59, 0x15,
+ 0x40, 0x59, 0x27, 0x40, 0x59, 0x73, 0x40, 0x5B, 0x50, 0x40, 0x5B, 0x80,
+ 0x40, 0x5B, 0xF8, 0x40, 0x5C, 0x0F, 0x40, 0x5C, 0x22, 0x40, 0x5C, 0x38,
+ 0x40, 0x5C, 0x6E, 0x40, 0x5C, 0x71, 0x40, 0x5D, 0xDB, 0x40, 0x5D, 0xE5,
+ 0x40, 0x5D, 0xF1, 0x40, 0x5D, 0xFE, 0x40, 0x5E, 0x72, 0x40, 0x5E, 0x7A,
+ 0x40, 0x5E, 0x7F, 0x40, 0x5E, 0xF4, 0x40, 0x5E, 0xFE, 0x40, 0x5F, 0x0B,
+ 0x40, 0x5F, 0x13, 0x40, 0x5F, 0x50, 0x40, 0x5F, 0x61, 0x40, 0x5F, 0x73,
+ 0x40, 0x5F, 0xC3, 0x40, 0x62, 0x08, 0x40, 0x62, 0x36, 0x40, 0x62, 0x4B,
+ 0x40, 0x65, 0x2F, 0x40, 0x65, 0x34, 0x40, 0x65, 0x87, 0x40, 0x65, 0x97,
+ 0x40, 0x65, 0xA4, 0x40, 0x65, 0xB9, 0x40, 0x65, 0xE0, 0x40, 0x65, 0xE5,
+ 0x40, 0x66, 0xF0, 0x40, 0x67, 0x08, 0x40, 0x67, 0x28, 0x40, 0x6B, 0x20,
+ 0x40, 0x6B, 0x62, 0x40, 0x6B, 0x79, 0x40, 0x6B, 0xB3, 0x40, 0x6B, 0xCB,
+ 0x40, 0x6B, 0xD4, 0x40, 0x6B, 0xDB, 0x40, 0x6C, 0x0F, 0x40, 0x6C, 0x14,
+ 0x40, 0x6C, 0x34, 0x40, 0x70, 0x6B, 0x40, 0x72, 0x2A, 0x40, 0x72, 0x36,
+ 0x40, 0x72, 0x3B, 0x40, 0x72, 0x3F, 0x40, 0x72, 0x47, 0x40, 0x72, 0x59,
+ 0x40, 0x72, 0x5B, 0x40, 0x72, 0xAC, 0x40, 0x73, 0x84, 0x40, 0x73, 0x89,
+ 0x40, 0x74, 0xDC, 0x40, 0x74, 0xE6, 0x40, 0x75, 0x18, 0x40, 0x75, 0x1F,
+ 0x40, 0x75, 0x28, 0x40, 0x75, 0x30, 0x40, 0x75, 0x8B, 0x40, 0x75, 0x92,
+ 0x40, 0x76, 0x76, 0x40, 0x76, 0x7D, 0x40, 0x76, 0xAE, 0x40, 0x76, 0xBF,
+ 0x40, 0x76, 0xEE, 0x40, 0x77, 0xDB, 0x40, 0x77, 0xE2, 0x40, 0x77, 0xF3,
+ 0x40, 0x79, 0x3A, 0x40, 0x79, 0xB8, 0x40, 0x79, 0xBE, 0x40, 0x7A, 0x74,
+ 0x40, 0x7A, 0xCB, 0x40, 0x7A, 0xF9, 0x40, 0x7C, 0x73, 0x40, 0x7C, 0xF8,
+ 0x40, 0x7F, 0x36, 0x40, 0x7F, 0x51, 0x40, 0x7F, 0x8A, 0x40, 0x7F, 0xBD,
+ 0x40, 0x80, 0x01, 0x40, 0x80, 0x0C, 0x40, 0x80, 0x12, 0x40, 0x80, 0x33,
+ 0x40, 0x80, 0x7F, 0x40, 0x80, 0x89, 0x40, 0x81, 0xE3, 0x40, 0x81, 0xEA,
+ 0x40, 0x81, 0xF3, 0x40, 0x81, 0xFC, 0x40, 0x82, 0x0C, 0x40, 0x82, 0x1B,
+ 0x40, 0x82, 0x1F, 0x40, 0x82, 0x6E, 0x40, 0x82, 0x72, 0x40, 0x82, 0x78,
+ 0x40, 0x86, 0x4D, 0x40, 0x86, 0x6B, 0x40, 0x88, 0x40, 0x40, 0x88, 0x4C,
+ 0x40, 0x88, 0x63, 0x40, 0x89, 0x7E, 0x40, 0x89, 0x8B, 0x40, 0x89, 0xD2,
+ 0x40, 0x8A, 0x00, 0x40, 0x8C, 0x37, 0x40, 0x8C, 0x46, 0x40, 0x8C, 0x55,
+ 0x40, 0x8C, 0x78, 0x40, 0x8C, 0x9D, 0x40, 0x8D, 0x64, 0x40, 0x8D, 0x70,
+ 0x40, 0x8D, 0xB3, 0x40, 0x8E, 0xAB, 0x40, 0x8E, 0xCA, 0x40, 0x8F, 0x9B,
+ 0x40, 0x8F, 0xB0, 0x40, 0x8F, 0xB5, 0x40, 0x90, 0x91, 0x40, 0x91, 0x49,
+ 0x40, 0x91, 0xC6, 0x40, 0x91, 0xCC, 0x40, 0x91, 0xD1, 0x40, 0x95, 0x77,
+ 0x40, 0x95, 0x80, 0x40, 0x96, 0x1C, 0x40, 0x96, 0xB6, 0x40, 0x96, 0xB9,
+ 0x40, 0x96, 0xE8, 0x40, 0x97, 0x51, 0x40, 0x97, 0x5E, 0x40, 0x97, 0x62,
+ 0x40, 0x97, 0x69, 0x40, 0x97, 0xCB, 0x40, 0x97, 0xED, 0x40, 0x97, 0xF3,
+ 0x40, 0x98, 0x01, 0x40, 0x98, 0xA8, 0x40, 0x98, 0xDB, 0x40, 0x98, 0xDF,
+ 0x40, 0x99, 0x96, 0x40, 0x99, 0x99, 0x40, 0x99, 0xAC, 0x40, 0x9A, 0xA8,
+ 0x40, 0x9A, 0xD8, 0x40, 0x9A, 0xDF, 0x40, 0x9B, 0x25, 0x40, 0x9B, 0x2F,
+ 0x40, 0x9B, 0x32, 0x40, 0x9B, 0x3C, 0x40, 0x9B, 0x5A, 0x40, 0x9C, 0xE5,
+ 0x40, 0x9E, 0x75, 0x40, 0x9E, 0x7F, 0x40, 0x9E, 0xA5, 0x40, 0x9E, 0xBB,
+ 0x40, 0x9E, 0xC3, 0x40, 0x9E, 0xCD, 0x40, 0x9E, 0xD1, 0x40, 0x9E, 0xF9,
+ 0x40, 0x9E, 0xFD, 0x40, 0x9F, 0x0E, 0x40, 0x9F, 0x13, 0x40, 0x9F, 0x20,
+ 0x40, 0x9F, 0x3B, 0x40, 0x9F, 0x4A, 0x40, 0x9F, 0x52, 0x40, 0x9F, 0x8D,
+ 0x40, 0x9F, 0x9C, 0x40, 0x9F, 0xA0, 0x2C, 0x00, 0x20, 0x40, 0x30, 0x12,
+ 0x40, 0x53, 0x41, 0x40, 0x53, 0x44, 0x40, 0x53, 0x45, 0x80, 0x30, 0x4B,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0x4D, 0x00, 0x30, 0x99, 0x80, 0x30, 0x4F,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0x51, 0x00, 0x30, 0x99, 0x80, 0x30, 0x53,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0x55, 0x00, 0x30, 0x99, 0x80, 0x30, 0x57,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0x59, 0x00, 0x30, 0x99, 0x80, 0x30, 0x5B,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0x5D, 0x00, 0x30, 0x99, 0x80, 0x30, 0x5F,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0x61, 0x00, 0x30, 0x99, 0x80, 0x30, 0x64,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0x66, 0x00, 0x30, 0x99, 0x80, 0x30, 0x68,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0x6F, 0x00, 0x30, 0x99, 0x80, 0x30, 0x6F,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0x72, 0x00, 0x30, 0x99, 0x80, 0x30, 0x72,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0x75, 0x00, 0x30, 0x99, 0x80, 0x30, 0x75,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0x78, 0x00, 0x30, 0x99, 0x80, 0x30, 0x78,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0x7B, 0x00, 0x30, 0x99, 0x80, 0x30, 0x7B,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0x46, 0x00, 0x30, 0x99, 0xC0, 0x00, 0x20,
+ 0x00, 0x30, 0x99, 0xC0, 0x00, 0x20, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x9D,
+ 0x00, 0x30, 0x99, 0xA8, 0x30, 0x88, 0x00, 0x30, 0x8A, 0x80, 0x30, 0xAB,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xAD, 0x00, 0x30, 0x99, 0x80, 0x30, 0xAF,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xB1, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB3,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xB5, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB7,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xB9, 0x00, 0x30, 0x99, 0x80, 0x30, 0xBB,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xBD, 0x00, 0x30, 0x99, 0x80, 0x30, 0xBF,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xC1, 0x00, 0x30, 0x99, 0x80, 0x30, 0xC4,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xC6, 0x00, 0x30, 0x99, 0x80, 0x30, 0xC8,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xCF, 0x00, 0x30, 0x99, 0x80, 0x30, 0xCF,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD2, 0x00, 0x30, 0x99, 0x80, 0x30, 0xD2,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD5, 0x00, 0x30, 0x99, 0x80, 0x30, 0xD5,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD8, 0x00, 0x30, 0x99, 0x80, 0x30, 0xD8,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0xDB, 0x00, 0x30, 0x99, 0x80, 0x30, 0xDB,
+ 0x00, 0x30, 0x9A, 0x80, 0x30, 0xA6, 0x00, 0x30, 0x99, 0x80, 0x30, 0xEF,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xF0, 0x00, 0x30, 0x99, 0x80, 0x30, 0xF1,
+ 0x00, 0x30, 0x99, 0x80, 0x30, 0xF2, 0x00, 0x30, 0x99, 0x80, 0x30, 0xFD,
+ 0x00, 0x30, 0x99, 0xA8, 0x30, 0xB3, 0x00, 0x30, 0xC8, 0x40, 0x11, 0x00,
+ 0x40, 0x11, 0x01, 0x40, 0x11, 0xAA, 0x40, 0x11, 0x02, 0x40, 0x11, 0xAC,
+ 0x40, 0x11, 0xAD, 0x40, 0x11, 0x03, 0x40, 0x11, 0x04, 0x40, 0x11, 0x05,
+ 0x40, 0x11, 0xB0, 0x40, 0x11, 0xB1, 0x40, 0x11, 0xB2, 0x40, 0x11, 0xB3,
+ 0x40, 0x11, 0xB4, 0x40, 0x11, 0xB5, 0x40, 0x11, 0x1A, 0x40, 0x11, 0x06,
+ 0x40, 0x11, 0x07, 0x40, 0x11, 0x08, 0x40, 0x11, 0x21, 0x40, 0x11, 0x09,
+ 0x40, 0x11, 0x0A, 0x40, 0x11, 0x0B, 0x40, 0x11, 0x0C, 0x40, 0x11, 0x0D,
+ 0x40, 0x11, 0x0E, 0x40, 0x11, 0x0F, 0x40, 0x11, 0x10, 0x40, 0x11, 0x11,
+ 0x40, 0x11, 0x12, 0x40, 0x11, 0x61, 0x40, 0x11, 0x62, 0x40, 0x11, 0x63,
+ 0x40, 0x11, 0x64, 0x40, 0x11, 0x65, 0x40, 0x11, 0x66, 0x40, 0x11, 0x67,
+ 0x40, 0x11, 0x68, 0x40, 0x11, 0x69, 0x40, 0x11, 0x6A, 0x40, 0x11, 0x6B,
+ 0x40, 0x11, 0x6C, 0x40, 0x11, 0x6D, 0x40, 0x11, 0x6E, 0x40, 0x11, 0x6F,
+ 0x40, 0x11, 0x70, 0x40, 0x11, 0x71, 0x40, 0x11, 0x72, 0x40, 0x11, 0x73,
+ 0x40, 0x11, 0x74, 0x40, 0x11, 0x75, 0x40, 0x11, 0x60, 0x40, 0x11, 0x14,
+ 0x40, 0x11, 0x15, 0x40, 0x11, 0xC7, 0x40, 0x11, 0xC8, 0x40, 0x11, 0xCC,
+ 0x40, 0x11, 0xCE, 0x40, 0x11, 0xD3, 0x40, 0x11, 0xD7, 0x40, 0x11, 0xD9,
+ 0x40, 0x11, 0x1C, 0x40, 0x11, 0xDD, 0x40, 0x11, 0xDF, 0x40, 0x11, 0x1D,
+ 0x40, 0x11, 0x1E, 0x40, 0x11, 0x20, 0x40, 0x11, 0x22, 0x40, 0x11, 0x23,
+ 0x40, 0x11, 0x27, 0x40, 0x11, 0x29, 0x40, 0x11, 0x2B, 0x40, 0x11, 0x2C,
+ 0x40, 0x11, 0x2D, 0x40, 0x11, 0x2E, 0x40, 0x11, 0x2F, 0x40, 0x11, 0x32,
+ 0x40, 0x11, 0x36, 0x40, 0x11, 0x40, 0x40, 0x11, 0x47, 0x40, 0x11, 0x4C,
+ 0x40, 0x11, 0xF1, 0x40, 0x11, 0xF2, 0x40, 0x11, 0x57, 0x40, 0x11, 0x58,
+ 0x40, 0x11, 0x59, 0x40, 0x11, 0x84, 0x40, 0x11, 0x85, 0x40, 0x11, 0x88,
+ 0x40, 0x11, 0x91, 0x40, 0x11, 0x92, 0x40, 0x11, 0x94, 0x40, 0x11, 0x9E,
+ 0x40, 0x11, 0xA1, 0x20, 0x4E, 0x00, 0x20, 0x4E, 0x8C, 0x20, 0x4E, 0x09,
+ 0x20, 0x56, 0xDB, 0x20, 0x4E, 0x0A, 0x20, 0x4E, 0x2D, 0x20, 0x4E, 0x0B,
+ 0x20, 0x75, 0x32, 0x20, 0x4E, 0x59, 0x20, 0x4E, 0x19, 0x20, 0x4E, 0x01,
+ 0x20, 0x59, 0x29, 0x20, 0x57, 0x30, 0x20, 0x4E, 0xBA, 0xC0, 0x00, 0x28,
+ 0x80, 0x11, 0x00, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x02,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x03, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x11, 0x05, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x11, 0x06, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x07,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x09, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x11, 0x0C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0E,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0F, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x11, 0x10, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x11, 0x11, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x12,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x00, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x02, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x03, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x05, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x06, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x07, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x09, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0C, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0E, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0F, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x10, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x11, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x12, 0x80, 0x11, 0x61,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0C, 0x80, 0x11, 0x6E,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x80, 0x11, 0x69,
+ 0x80, 0x11, 0x0C, 0x80, 0x11, 0x65, 0x80, 0x11, 0xAB, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x80, 0x11, 0x69, 0x80, 0x11, 0x12,
+ 0x80, 0x11, 0x6E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x00,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x8C, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x09, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x56, 0xDB, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x94,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x51, 0x6D, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x03, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x51, 0x6B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x5D,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x53, 0x41, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x67, 0x08, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x70, 0x6B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x6C, 0x34,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x67, 0x28, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x91, 0xD1, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x57, 0x1F, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x65, 0xE5,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x68, 0x2A, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x67, 0x09, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x79, 0x3E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x54, 0x0D,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x72, 0x79, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x8C, 0xA1, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x79, 0x5D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x52, 0xB4,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0xE3, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x54, 0x7C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x5B, 0x66, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x76, 0xE3,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4F, 0x01, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x8C, 0xC7, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x53, 0x54, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x79, 0x6D,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4F, 0x11, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x81, 0xEA, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x81, 0xF3, 0x00, 0x00, 0x29, 0xB8, 0x00, 0x50, 0x80, 0x00, 0x54,
+ 0x00, 0x00, 0x45, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x32,
+ 0x00, 0x00, 0x32, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x32,
+ 0x00, 0x00, 0x34, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x35, 0x9C, 0x00, 0x32,
+ 0x00, 0x00, 0x36, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x32,
+ 0x00, 0x00, 0x38, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x33,
+ 0x00, 0x00, 0x30, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x33,
+ 0x00, 0x00, 0x32, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x33,
+ 0x00, 0x00, 0x34, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x35, 0x1C, 0x11, 0x00,
+ 0x1C, 0x11, 0x02, 0x1C, 0x11, 0x03, 0x1C, 0x11, 0x05, 0x1C, 0x11, 0x06,
+ 0x1C, 0x11, 0x07, 0x1C, 0x11, 0x09, 0x1C, 0x11, 0x0B, 0x1C, 0x11, 0x0C,
+ 0x1C, 0x11, 0x0E, 0x1C, 0x11, 0x0F, 0x1C, 0x11, 0x10, 0x1C, 0x11, 0x11,
+ 0x1C, 0x11, 0x12, 0x9C, 0x11, 0x00, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x02,
+ 0x00, 0x11, 0x61, 0x9C, 0x11, 0x03, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x05,
+ 0x00, 0x11, 0x61, 0x9C, 0x11, 0x06, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x07,
+ 0x00, 0x11, 0x61, 0x9C, 0x11, 0x09, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0B,
+ 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0C, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0E,
+ 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0F, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x10,
+ 0x00, 0x11, 0x61, 0x9C, 0x11, 0x11, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x12,
+ 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0E, 0x80, 0x11, 0x61, 0x80, 0x11, 0xB7,
+ 0x80, 0x11, 0x00, 0x00, 0x11, 0x69, 0x9C, 0x11, 0x0C, 0x80, 0x11, 0x6E,
+ 0x80, 0x11, 0x0B, 0x00, 0x11, 0x74, 0x9C, 0x11, 0x0B, 0x00, 0x11, 0x6E,
+ 0x1C, 0x4E, 0x00, 0x1C, 0x4E, 0x8C, 0x1C, 0x4E, 0x09, 0x1C, 0x56, 0xDB,
+ 0x1C, 0x4E, 0x94, 0x1C, 0x51, 0x6D, 0x1C, 0x4E, 0x03, 0x1C, 0x51, 0x6B,
+ 0x1C, 0x4E, 0x5D, 0x1C, 0x53, 0x41, 0x1C, 0x67, 0x08, 0x1C, 0x70, 0x6B,
+ 0x1C, 0x6C, 0x34, 0x1C, 0x67, 0x28, 0x1C, 0x91, 0xD1, 0x1C, 0x57, 0x1F,
+ 0x1C, 0x65, 0xE5, 0x1C, 0x68, 0x2A, 0x1C, 0x67, 0x09, 0x1C, 0x79, 0x3E,
+ 0x1C, 0x54, 0x0D, 0x1C, 0x72, 0x79, 0x1C, 0x8C, 0xA1, 0x1C, 0x79, 0x5D,
+ 0x1C, 0x52, 0xB4, 0x1C, 0x79, 0xD8, 0x1C, 0x75, 0x37, 0x1C, 0x59, 0x73,
+ 0x1C, 0x90, 0x69, 0x1C, 0x51, 0x2A, 0x1C, 0x53, 0x70, 0x1C, 0x6C, 0xE8,
+ 0x1C, 0x98, 0x05, 0x1C, 0x4F, 0x11, 0x1C, 0x51, 0x99, 0x1C, 0x6B, 0x63,
+ 0x1C, 0x4E, 0x0A, 0x1C, 0x4E, 0x2D, 0x1C, 0x4E, 0x0B, 0x1C, 0x5D, 0xE6,
+ 0x1C, 0x53, 0xF3, 0x1C, 0x53, 0x3B, 0x1C, 0x5B, 0x97, 0x1C, 0x5B, 0x66,
+ 0x1C, 0x76, 0xE3, 0x1C, 0x4F, 0x01, 0x1C, 0x8C, 0xC7, 0x1C, 0x53, 0x54,
+ 0x1C, 0x59, 0x1C, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x36, 0x9C, 0x00, 0x33,
+ 0x00, 0x00, 0x37, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x38, 0x9C, 0x00, 0x33,
+ 0x00, 0x00, 0x39, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x30, 0x9C, 0x00, 0x34,
+ 0x00, 0x00, 0x31, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x32, 0x9C, 0x00, 0x34,
+ 0x00, 0x00, 0x33, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x34, 0x9C, 0x00, 0x34,
+ 0x00, 0x00, 0x35, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x36, 0x9C, 0x00, 0x34,
+ 0x00, 0x00, 0x37, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x38, 0x9C, 0x00, 0x34,
+ 0x00, 0x00, 0x39, 0x9C, 0x00, 0x35, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x31,
+ 0x00, 0x67, 0x08, 0xC0, 0x00, 0x32, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x33,
+ 0x00, 0x67, 0x08, 0xC0, 0x00, 0x34, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x35,
+ 0x00, 0x67, 0x08, 0xC0, 0x00, 0x36, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x37,
+ 0x00, 0x67, 0x08, 0xC0, 0x00, 0x38, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x39,
+ 0x00, 0x67, 0x08, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x67, 0x08,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x32, 0x00, 0x67, 0x08, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x67,
+ 0xB8, 0x00, 0x65, 0x80, 0x00, 0x72, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x65,
+ 0x00, 0x00, 0x56, 0xB8, 0x00, 0x4C, 0x80, 0x00, 0x54, 0x00, 0x00, 0x44,
+ 0x1C, 0x30, 0xA2, 0x1C, 0x30, 0xA4, 0x1C, 0x30, 0xA6, 0x1C, 0x30, 0xA8,
+ 0x1C, 0x30, 0xAA, 0x1C, 0x30, 0xAB, 0x1C, 0x30, 0xAD, 0x1C, 0x30, 0xAF,
+ 0x1C, 0x30, 0xB1, 0x1C, 0x30, 0xB3, 0x1C, 0x30, 0xB5, 0x1C, 0x30, 0xB7,
+ 0x1C, 0x30, 0xB9, 0x1C, 0x30, 0xBB, 0x1C, 0x30, 0xBD, 0x1C, 0x30, 0xBF,
+ 0x1C, 0x30, 0xC1, 0x1C, 0x30, 0xC4, 0x1C, 0x30, 0xC6, 0x1C, 0x30, 0xC8,
+ 0x1C, 0x30, 0xCA, 0x1C, 0x30, 0xCB, 0x1C, 0x30, 0xCC, 0x1C, 0x30, 0xCD,
+ 0x1C, 0x30, 0xCE, 0x1C, 0x30, 0xCF, 0x1C, 0x30, 0xD2, 0x1C, 0x30, 0xD5,
+ 0x1C, 0x30, 0xD8, 0x1C, 0x30, 0xDB, 0x1C, 0x30, 0xDE, 0x1C, 0x30, 0xDF,
+ 0x1C, 0x30, 0xE0, 0x1C, 0x30, 0xE1, 0x1C, 0x30, 0xE2, 0x1C, 0x30, 0xE4,
+ 0x1C, 0x30, 0xE6, 0x1C, 0x30, 0xE8, 0x1C, 0x30, 0xE9, 0x1C, 0x30, 0xEA,
+ 0x1C, 0x30, 0xEB, 0x1C, 0x30, 0xEC, 0x1C, 0x30, 0xED, 0x1C, 0x30, 0xEF,
+ 0x1C, 0x30, 0xF0, 0x1C, 0x30, 0xF1, 0x1C, 0x30, 0xF2, 0xB8, 0x30, 0xA2,
+ 0x80, 0x30, 0xD1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xA2,
+ 0x80, 0x30, 0xEB, 0x80, 0x30, 0xD5, 0x00, 0x30, 0xA1, 0xB8, 0x30, 0xA2,
+ 0x80, 0x30, 0xF3, 0x80, 0x30, 0xDA, 0x00, 0x30, 0xA2, 0xB8, 0x30, 0xA2,
+ 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xA4, 0x80, 0x30, 0xCB,
+ 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB0, 0xB8, 0x30, 0xA4, 0x80, 0x30, 0xF3,
+ 0x00, 0x30, 0xC1, 0xB8, 0x30, 0xA6, 0x80, 0x30, 0xA9, 0x00, 0x30, 0xF3,
+ 0xB8, 0x30, 0xA8, 0x80, 0x30, 0xB9, 0x80, 0x30, 0xAF, 0x80, 0x30, 0xFC,
+ 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xA8, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xAB,
+ 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAA, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB9,
+ 0xB8, 0x30, 0xAA, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xAB,
+ 0x80, 0x30, 0xA4, 0x00, 0x30, 0xEA, 0xB8, 0x30, 0xAB, 0x80, 0x30, 0xE9,
+ 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xAB, 0x80, 0x30, 0xED,
+ 0x80, 0x30, 0xEA, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAC, 0x80, 0x30, 0xED,
+ 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xAC, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xDE,
+ 0xB8, 0x30, 0xAE, 0x00, 0x30, 0xAC, 0xB8, 0x30, 0xAE, 0x80, 0x30, 0xCB,
+ 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xE5, 0x80, 0x30, 0xEA,
+ 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAE, 0x80, 0x30, 0xEB, 0x80, 0x30, 0xC0,
+ 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAD, 0x00, 0x30, 0xED, 0xB8, 0x30, 0xAD,
+ 0x80, 0x30, 0xED, 0x80, 0x30, 0xB0, 0x80, 0x30, 0xE9, 0x00, 0x30, 0xE0,
+ 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xED, 0x80, 0x30, 0xE1, 0x80, 0x30, 0xFC,
+ 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xED,
+ 0x80, 0x30, 0xEF, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xB0,
+ 0x80, 0x30, 0xE9, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xB0, 0x80, 0x30, 0xE9,
+ 0x80, 0x30, 0xE0, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xAF,
+ 0x80, 0x30, 0xEB, 0x80, 0x30, 0xBC, 0x80, 0x30, 0xA4, 0x00, 0x30, 0xED,
+ 0xB8, 0x30, 0xAF, 0x80, 0x30, 0xED, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xCD,
+ 0xB8, 0x30, 0xB1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xB3,
+ 0x80, 0x30, 0xEB, 0x00, 0x30, 0xCA, 0xB8, 0x30, 0xB3, 0x80, 0x30, 0xFC,
+ 0x00, 0x30, 0xDD, 0xB8, 0x30, 0xB5, 0x80, 0x30, 0xA4, 0x80, 0x30, 0xAF,
+ 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xB5, 0x80, 0x30, 0xF3, 0x80, 0x30, 0xC1,
+ 0x80, 0x30, 0xFC, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xB7, 0x80, 0x30, 0xEA,
+ 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB0, 0xB8, 0x30, 0xBB, 0x80, 0x30, 0xF3,
+ 0x00, 0x30, 0xC1, 0xB8, 0x30, 0xBB, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC8,
+ 0xB8, 0x30, 0xC0, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xC7,
+ 0x00, 0x30, 0xB7, 0xB8, 0x30, 0xC9, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xC8,
+ 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xCA, 0x00, 0x30, 0xCE, 0xB8, 0x30, 0xCE,
+ 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xCF, 0x80, 0x30, 0xA4,
+ 0x00, 0x30, 0xC4, 0xB8, 0x30, 0xD1, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xBB,
+ 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xD1, 0x80, 0x30, 0xFC,
+ 0x00, 0x30, 0xC4, 0xB8, 0x30, 0xD0, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xEC,
+ 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4, 0x80, 0x30, 0xA2, 0x80, 0x30, 0xB9,
+ 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4, 0x80, 0x30, 0xAF,
+ 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4, 0x00, 0x30, 0xB3, 0xB8, 0x30, 0xD3,
+ 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD5, 0x80, 0x30, 0xA1, 0x80, 0x30, 0xE9,
+ 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xD5, 0x80, 0x30, 0xA3,
+ 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xD6, 0x80, 0x30, 0xC3,
+ 0x80, 0x30, 0xB7, 0x80, 0x30, 0xA7, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD5,
+ 0x80, 0x30, 0xE9, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xD8, 0x80, 0x30, 0xAF,
+ 0x80, 0x30, 0xBF, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xDA,
+ 0x00, 0x30, 0xBD, 0xB8, 0x30, 0xDA, 0x80, 0x30, 0xCB, 0x00, 0x30, 0xD2,
+ 0xB8, 0x30, 0xD8, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xC4, 0xB8, 0x30, 0xDA,
+ 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xDA, 0x80, 0x30, 0xFC,
+ 0x00, 0x30, 0xB8, 0xB8, 0x30, 0xD9, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xBF,
+ 0xB8, 0x30, 0xDD, 0x80, 0x30, 0xA4, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC8,
+ 0xB8, 0x30, 0xDC, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xDB,
+ 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDD, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC9,
+ 0xB8, 0x30, 0xDB, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xDB,
+ 0x80, 0x30, 0xFC, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xA4,
+ 0x80, 0x30, 0xAF, 0x00, 0x30, 0xED, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xA4,
+ 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xCF,
+ 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xAF, 0xB8, 0x30, 0xDE,
+ 0x80, 0x30, 0xF3, 0x80, 0x30, 0xB7, 0x80, 0x30, 0xE7, 0x00, 0x30, 0xF3,
+ 0xB8, 0x30, 0xDF, 0x80, 0x30, 0xAF, 0x80, 0x30, 0xED, 0x00, 0x30, 0xF3,
+ 0xB8, 0x30, 0xDF, 0x00, 0x30, 0xEA, 0xB8, 0x30, 0xDF, 0x80, 0x30, 0xEA,
+ 0x80, 0x30, 0xD0, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xE1,
+ 0x00, 0x30, 0xAC, 0xB8, 0x30, 0xE1, 0x80, 0x30, 0xAC, 0x80, 0x30, 0xC8,
+ 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xE1, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xC8,
+ 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xE4, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC9,
+ 0xB8, 0x30, 0xE4, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xE6,
+ 0x80, 0x30, 0xA2, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xEA, 0x80, 0x30, 0xC3,
+ 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xEA, 0x00, 0x30, 0xE9,
+ 0xB8, 0x30, 0xEB, 0x80, 0x30, 0xD4, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xEB,
+ 0x80, 0x30, 0xFC, 0x80, 0x30, 0xD6, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xEC,
+ 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xEC, 0x80, 0x30, 0xF3, 0x80, 0x30, 0xC8,
+ 0x80, 0x30, 0xB2, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xEF, 0x80, 0x30, 0xC3,
+ 0x00, 0x30, 0xC8, 0xC0, 0x00, 0x30, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x33,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x34, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x35,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x36, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x37,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x38, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x39,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x32, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x33,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x36, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x37,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x30, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x31,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x32, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x32, 0x80, 0x00, 0x33, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x34, 0x00, 0x70, 0xB9, 0xB8, 0x00, 0x68, 0x80, 0x00, 0x50,
+ 0x00, 0x00, 0x61, 0xB8, 0x00, 0x64, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x41,
+ 0x00, 0x00, 0x55, 0xB8, 0x00, 0x62, 0x80, 0x00, 0x61, 0x00, 0x00, 0x72,
+ 0xB8, 0x00, 0x6F, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x63,
+ 0xB8, 0x00, 0x64, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x64, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x64, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB3,
+ 0xB8, 0x00, 0x49, 0x00, 0x00, 0x55, 0xB8, 0x5E, 0x73, 0x00, 0x62, 0x10,
+ 0xB8, 0x66, 0x2D, 0x00, 0x54, 0x8C, 0xB8, 0x59, 0x27, 0x00, 0x6B, 0x63,
+ 0xB8, 0x66, 0x0E, 0x00, 0x6C, 0xBB, 0xB8, 0x68, 0x2A, 0x80, 0x5F, 0x0F,
+ 0x80, 0x4F, 0x1A, 0x00, 0x79, 0x3E, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x41,
+ 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x41, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x41,
+ 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x41, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x41,
+ 0xB8, 0x00, 0x4B, 0x00, 0x00, 0x42, 0xB8, 0x00, 0x4D, 0x00, 0x00, 0x42,
+ 0xB8, 0x00, 0x47, 0x00, 0x00, 0x42, 0xB8, 0x00, 0x63, 0x80, 0x00, 0x61,
+ 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x63, 0x80, 0x00, 0x61,
+ 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x46, 0xB8, 0x00, 0x6E,
+ 0x00, 0x00, 0x46, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x46, 0xB8, 0x03, 0xBC,
+ 0x00, 0x00, 0x67, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x6B,
+ 0x00, 0x00, 0x67, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x6B,
+ 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x4D, 0x80, 0x00, 0x48,
+ 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x47, 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A,
+ 0xB8, 0x00, 0x54, 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x03, 0xBC,
+ 0x00, 0x21, 0x13, 0xB8, 0x00, 0x6D, 0x00, 0x21, 0x13, 0xB8, 0x00, 0x64,
+ 0x00, 0x21, 0x13, 0xB8, 0x00, 0x6B, 0x00, 0x21, 0x13, 0xB8, 0x00, 0x66,
+ 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x6D, 0xB8, 0x03, 0xBC,
+ 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x63,
+ 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6D,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x63, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x6B,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x63, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB3,
+ 0xB8, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x6D, 0x80, 0x22, 0x15, 0x00, 0x00, 0x73,
+ 0xB8, 0x00, 0x6D, 0x80, 0x22, 0x15, 0x80, 0x00, 0x73, 0x00, 0x00, 0xB2,
+ 0xB8, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x50,
+ 0x00, 0x00, 0x61, 0xB8, 0x00, 0x4D, 0x80, 0x00, 0x50, 0x00, 0x00, 0x61,
+ 0xB8, 0x00, 0x47, 0x80, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x72,
+ 0x80, 0x00, 0x61, 0x00, 0x00, 0x64, 0xB8, 0x00, 0x72, 0x80, 0x00, 0x61,
+ 0x80, 0x00, 0x64, 0x80, 0x22, 0x15, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x72,
+ 0x80, 0x00, 0x61, 0x80, 0x00, 0x64, 0x80, 0x22, 0x15, 0x80, 0x00, 0x73,
+ 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x6E,
+ 0x00, 0x00, 0x73, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x6D,
+ 0x00, 0x00, 0x73, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x6E,
+ 0x00, 0x00, 0x56, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x6D,
+ 0x00, 0x00, 0x56, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x4D,
+ 0x00, 0x00, 0x56, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6E,
+ 0x00, 0x00, 0x57, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6D,
+ 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x4D,
+ 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6B, 0x00, 0x03, 0xA9, 0xB8, 0x00, 0x4D,
+ 0x00, 0x03, 0xA9, 0xB8, 0x00, 0x61, 0x80, 0x00, 0x2E, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x42, 0x00, 0x00, 0x71, 0xB8, 0x00, 0x63,
+ 0x00, 0x00, 0x63, 0xB8, 0x00, 0x63, 0x00, 0x00, 0x64, 0xB8, 0x00, 0x43,
+ 0x80, 0x22, 0x15, 0x80, 0x00, 0x6B, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x43,
+ 0x80, 0x00, 0x6F, 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x64, 0x00, 0x00, 0x42,
+ 0xB8, 0x00, 0x47, 0x00, 0x00, 0x79, 0xB8, 0x00, 0x68, 0x00, 0x00, 0x61,
+ 0xB8, 0x00, 0x48, 0x00, 0x00, 0x50, 0xB8, 0x00, 0x69, 0x00, 0x00, 0x6E,
+ 0xB8, 0x00, 0x4B, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0x4B, 0x00, 0x00, 0x4D,
+ 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x74, 0xB8, 0x00, 0x6C, 0x00, 0x00, 0x6D,
+ 0xB8, 0x00, 0x6C, 0x00, 0x00, 0x6E, 0xB8, 0x00, 0x6C, 0x80, 0x00, 0x6F,
+ 0x00, 0x00, 0x67, 0xB8, 0x00, 0x6C, 0x00, 0x00, 0x78, 0xB8, 0x00, 0x6D,
+ 0x00, 0x00, 0x62, 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x69, 0x00, 0x00, 0x6C,
+ 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x50,
+ 0x00, 0x00, 0x48, 0xB8, 0x00, 0x70, 0x80, 0x00, 0x2E, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x50, 0x80, 0x00, 0x50, 0x00, 0x00, 0x4D,
+ 0xB8, 0x00, 0x50, 0x00, 0x00, 0x52, 0xB8, 0x00, 0x73, 0x00, 0x00, 0x72,
+ 0xB8, 0x00, 0x53, 0x00, 0x00, 0x76, 0xB8, 0x00, 0x57, 0x00, 0x00, 0x62,
+ 0xB8, 0x00, 0x56, 0x80, 0x22, 0x15, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x41,
+ 0x80, 0x22, 0x15, 0x00, 0x00, 0x6D, 0xC0, 0x00, 0x31, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x32, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x33, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x34, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x35, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x36, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x37, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x38, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x39, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x31, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x32,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x33, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x35, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x36,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x37, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x39, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x30,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x31, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x32, 0x80, 0x00, 0x32, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x33, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x34,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x35, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x32, 0x80, 0x00, 0x36, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x37, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x38,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x39, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x33, 0x80, 0x00, 0x30, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x33,
+ 0x80, 0x00, 0x31, 0x00, 0x65, 0xE5, 0xB8, 0x00, 0x67, 0x80, 0x00, 0x61,
+ 0x00, 0x00, 0x6C, 0x20, 0xA7, 0x6F, 0x00, 0x8C, 0x48, 0x00, 0x66, 0xF4,
+ 0x00, 0x8E, 0xCA, 0x00, 0x8C, 0xC8, 0x00, 0x6E, 0xD1, 0x00, 0x4E, 0x32,
+ 0x00, 0x53, 0xE5, 0x00, 0x9F, 0x9C, 0x00, 0x9F, 0x9C, 0x00, 0x59, 0x51,
+ 0x00, 0x91, 0xD1, 0x00, 0x55, 0x87, 0x00, 0x59, 0x48, 0x00, 0x61, 0xF6,
+ 0x00, 0x76, 0x69, 0x00, 0x7F, 0x85, 0x00, 0x86, 0x3F, 0x00, 0x87, 0xBA,
+ 0x00, 0x88, 0xF8, 0x00, 0x90, 0x8F, 0x00, 0x6A, 0x02, 0x00, 0x6D, 0x1B,
+ 0x00, 0x70, 0xD9, 0x00, 0x73, 0xDE, 0x00, 0x84, 0x3D, 0x00, 0x91, 0x6A,
+ 0x00, 0x99, 0xF1, 0x00, 0x4E, 0x82, 0x00, 0x53, 0x75, 0x00, 0x6B, 0x04,
+ 0x00, 0x72, 0x1B, 0x00, 0x86, 0x2D, 0x00, 0x9E, 0x1E, 0x00, 0x5D, 0x50,
+ 0x00, 0x6F, 0xEB, 0x00, 0x85, 0xCD, 0x00, 0x89, 0x64, 0x00, 0x62, 0xC9,
+ 0x00, 0x81, 0xD8, 0x00, 0x88, 0x1F, 0x00, 0x5E, 0xCA, 0x00, 0x67, 0x17,
+ 0x00, 0x6D, 0x6A, 0x00, 0x72, 0xFC, 0x00, 0x90, 0xCE, 0x00, 0x4F, 0x86,
+ 0x00, 0x51, 0xB7, 0x00, 0x52, 0xDE, 0x00, 0x64, 0xC4, 0x00, 0x6A, 0xD3,
+ 0x00, 0x72, 0x10, 0x00, 0x76, 0xE7, 0x00, 0x80, 0x01, 0x00, 0x86, 0x06,
+ 0x00, 0x86, 0x5C, 0x00, 0x8D, 0xEF, 0x00, 0x97, 0x32, 0x00, 0x9B, 0x6F,
+ 0x00, 0x9D, 0xFA, 0x00, 0x78, 0x8C, 0x00, 0x79, 0x7F, 0x00, 0x7D, 0xA0,
+ 0x00, 0x83, 0xC9, 0x00, 0x93, 0x04, 0x00, 0x9E, 0x7F, 0x00, 0x8A, 0xD6,
+ 0x00, 0x58, 0xDF, 0x00, 0x5F, 0x04, 0x00, 0x7C, 0x60, 0x00, 0x80, 0x7E,
+ 0x00, 0x72, 0x62, 0x00, 0x78, 0xCA, 0x00, 0x8C, 0xC2, 0x00, 0x96, 0xF7,
+ 0x00, 0x58, 0xD8, 0x00, 0x5C, 0x62, 0x00, 0x6A, 0x13, 0x00, 0x6D, 0xDA,
+ 0x00, 0x6F, 0x0F, 0x00, 0x7D, 0x2F, 0x00, 0x7E, 0x37, 0x00, 0x96, 0x4B,
+ 0x00, 0x52, 0xD2, 0x00, 0x80, 0x8B, 0x00, 0x51, 0xDC, 0x00, 0x51, 0xCC,
+ 0x00, 0x7A, 0x1C, 0x00, 0x7D, 0xBE, 0x00, 0x83, 0xF1, 0x00, 0x96, 0x75,
+ 0x00, 0x8B, 0x80, 0x00, 0x62, 0xCF, 0x00, 0x6A, 0x02, 0x00, 0x8A, 0xFE,
+ 0x00, 0x4E, 0x39, 0x00, 0x5B, 0xE7, 0x00, 0x60, 0x12, 0x00, 0x73, 0x87,
+ 0x00, 0x75, 0x70, 0x00, 0x53, 0x17, 0x00, 0x78, 0xFB, 0x00, 0x4F, 0xBF,
+ 0x00, 0x5F, 0xA9, 0x00, 0x4E, 0x0D, 0x00, 0x6C, 0xCC, 0x00, 0x65, 0x78,
+ 0x00, 0x7D, 0x22, 0x00, 0x53, 0xC3, 0x00, 0x58, 0x5E, 0x00, 0x77, 0x01,
+ 0x00, 0x84, 0x49, 0x00, 0x8A, 0xAA, 0x00, 0x6B, 0xBA, 0x00, 0x8F, 0xB0,
+ 0x00, 0x6C, 0x88, 0x00, 0x62, 0xFE, 0x00, 0x82, 0xE5, 0x00, 0x63, 0xA0,
+ 0x00, 0x75, 0x65, 0x00, 0x4E, 0xAE, 0x00, 0x51, 0x69, 0x00, 0x51, 0xC9,
+ 0x00, 0x68, 0x81, 0x00, 0x7C, 0xE7, 0x00, 0x82, 0x6F, 0x00, 0x8A, 0xD2,
+ 0x00, 0x91, 0xCF, 0x00, 0x52, 0xF5, 0x00, 0x54, 0x42, 0x00, 0x59, 0x73,
+ 0x00, 0x5E, 0xEC, 0x00, 0x65, 0xC5, 0x00, 0x6F, 0xFE, 0x00, 0x79, 0x2A,
+ 0x00, 0x95, 0xAD, 0x00, 0x9A, 0x6A, 0x00, 0x9E, 0x97, 0x00, 0x9E, 0xCE,
+ 0x00, 0x52, 0x9B, 0x00, 0x66, 0xC6, 0x00, 0x6B, 0x77, 0x00, 0x8F, 0x62,
+ 0x00, 0x5E, 0x74, 0x00, 0x61, 0x90, 0x00, 0x62, 0x00, 0x00, 0x64, 0x9A,
+ 0x00, 0x6F, 0x23, 0x00, 0x71, 0x49, 0x00, 0x74, 0x89, 0x00, 0x79, 0xCA,
+ 0x00, 0x7D, 0xF4, 0x00, 0x80, 0x6F, 0x00, 0x8F, 0x26, 0x00, 0x84, 0xEE,
+ 0x00, 0x90, 0x23, 0x00, 0x93, 0x4A, 0x00, 0x52, 0x17, 0x00, 0x52, 0xA3,
+ 0x00, 0x54, 0xBD, 0x00, 0x70, 0xC8, 0x00, 0x88, 0xC2, 0x00, 0x8A, 0xAA,
+ 0x00, 0x5E, 0xC9, 0x00, 0x5F, 0xF5, 0x00, 0x63, 0x7B, 0x00, 0x6B, 0xAE,
+ 0x00, 0x7C, 0x3E, 0x00, 0x73, 0x75, 0x00, 0x4E, 0xE4, 0x00, 0x56, 0xF9,
+ 0x00, 0x5B, 0xE7, 0x00, 0x5D, 0xBA, 0x00, 0x60, 0x1C, 0x00, 0x73, 0xB2,
+ 0x00, 0x74, 0x69, 0x00, 0x7F, 0x9A, 0x00, 0x80, 0x46, 0x00, 0x92, 0x34,
+ 0x00, 0x96, 0xF6, 0x00, 0x97, 0x48, 0x00, 0x98, 0x18, 0x00, 0x4F, 0x8B,
+ 0x00, 0x79, 0xAE, 0x00, 0x91, 0xB4, 0x00, 0x96, 0xB8, 0x00, 0x60, 0xE1,
+ 0x00, 0x4E, 0x86, 0x00, 0x50, 0xDA, 0x00, 0x5B, 0xEE, 0x00, 0x5C, 0x3F,
+ 0x00, 0x65, 0x99, 0x00, 0x6A, 0x02, 0x00, 0x71, 0xCE, 0x00, 0x76, 0x42,
+ 0x00, 0x84, 0xFC, 0x00, 0x90, 0x7C, 0x00, 0x9F, 0x8D, 0x00, 0x66, 0x88,
+ 0x00, 0x96, 0x2E, 0x00, 0x52, 0x89, 0x00, 0x67, 0x7B, 0x00, 0x67, 0xF3,
+ 0x00, 0x6D, 0x41, 0x00, 0x6E, 0x9C, 0x00, 0x74, 0x09, 0x00, 0x75, 0x59,
+ 0x00, 0x78, 0x6B, 0x00, 0x7D, 0x10, 0x00, 0x98, 0x5E, 0x00, 0x51, 0x6D,
+ 0x00, 0x62, 0x2E, 0x00, 0x96, 0x78, 0x00, 0x50, 0x2B, 0x00, 0x5D, 0x19,
+ 0x00, 0x6D, 0xEA, 0x00, 0x8F, 0x2A, 0x00, 0x5F, 0x8B, 0x00, 0x61, 0x44,
+ 0x00, 0x68, 0x17, 0x00, 0x73, 0x87, 0x00, 0x96, 0x86, 0x00, 0x52, 0x29,
+ 0x00, 0x54, 0x0F, 0x00, 0x5C, 0x65, 0x00, 0x66, 0x13, 0x00, 0x67, 0x4E,
+ 0x00, 0x68, 0xA8, 0x00, 0x6C, 0xE5, 0x00, 0x74, 0x06, 0x00, 0x75, 0xE2,
+ 0x00, 0x7F, 0x79, 0x00, 0x88, 0xCF, 0x00, 0x88, 0xE1, 0x00, 0x91, 0xCC,
+ 0x00, 0x96, 0xE2, 0x00, 0x53, 0x3F, 0x00, 0x6E, 0xBA, 0x00, 0x54, 0x1D,
+ 0x00, 0x71, 0xD0, 0x00, 0x74, 0x98, 0x00, 0x85, 0xFA, 0x00, 0x96, 0xA3,
+ 0x00, 0x9C, 0x57, 0x00, 0x9E, 0x9F, 0x00, 0x67, 0x97, 0x00, 0x6D, 0xCB,
+ 0x00, 0x81, 0xE8, 0x00, 0x7A, 0xCB, 0x00, 0x7B, 0x20, 0x00, 0x7C, 0x92,
+ 0x00, 0x72, 0xC0, 0x00, 0x70, 0x99, 0x00, 0x8B, 0x58, 0x00, 0x4E, 0xC0,
+ 0x00, 0x83, 0x36, 0x00, 0x52, 0x3A, 0x00, 0x52, 0x07, 0x00, 0x5E, 0xA6,
+ 0x00, 0x62, 0xD3, 0x00, 0x7C, 0xD6, 0x00, 0x5B, 0x85, 0x00, 0x6D, 0x1E,
+ 0x00, 0x66, 0xB4, 0x00, 0x8F, 0x3B, 0x00, 0x88, 0x4C, 0x00, 0x96, 0x4D,
+ 0x00, 0x89, 0x8B, 0x00, 0x5E, 0xD3, 0x00, 0x51, 0x40, 0x00, 0x55, 0xC0,
+ 0x00, 0x58, 0x5A, 0x00, 0x66, 0x74, 0x00, 0x51, 0xDE, 0x00, 0x73, 0x2A,
+ 0x00, 0x76, 0xCA, 0x00, 0x79, 0x3C, 0x00, 0x79, 0x5E, 0x00, 0x79, 0x65,
+ 0x00, 0x79, 0x8F, 0x00, 0x97, 0x56, 0x00, 0x7C, 0xBE, 0x00, 0x7F, 0xBD,
+ 0x00, 0x86, 0x12, 0x00, 0x8A, 0xF8, 0x00, 0x90, 0x38, 0x00, 0x90, 0xFD,
+ 0x00, 0x98, 0xEF, 0x00, 0x98, 0xFC, 0x00, 0x99, 0x28, 0x00, 0x9D, 0xB4,
+ 0x00, 0x4F, 0xAE, 0x00, 0x50, 0xE7, 0x00, 0x51, 0x4D, 0x00, 0x52, 0xC9,
+ 0x00, 0x52, 0xE4, 0x00, 0x53, 0x51, 0x00, 0x55, 0x9D, 0x00, 0x56, 0x06,
+ 0x00, 0x56, 0x68, 0x00, 0x58, 0x40, 0x00, 0x58, 0xA8, 0x00, 0x5C, 0x64,
+ 0x00, 0x5C, 0x6E, 0x00, 0x60, 0x94, 0x00, 0x61, 0x68, 0x00, 0x61, 0x8E,
+ 0x00, 0x61, 0xF2, 0x00, 0x65, 0x4F, 0x00, 0x65, 0xE2, 0x00, 0x66, 0x91,
+ 0x00, 0x68, 0x85, 0x00, 0x6D, 0x77, 0x00, 0x6E, 0x1A, 0x00, 0x6F, 0x22,
+ 0x00, 0x71, 0x6E, 0x00, 0x72, 0x2B, 0x00, 0x74, 0x22, 0x00, 0x78, 0x91,
+ 0x00, 0x79, 0x3E, 0x00, 0x79, 0x49, 0x00, 0x79, 0x48, 0x00, 0x79, 0x50,
+ 0x00, 0x79, 0x56, 0x00, 0x79, 0x5D, 0x00, 0x79, 0x8D, 0x00, 0x79, 0x8E,
+ 0x00, 0x7A, 0x40, 0x00, 0x7A, 0x81, 0x00, 0x7B, 0xC0, 0x00, 0x7D, 0xF4,
+ 0x00, 0x7E, 0x09, 0x00, 0x7E, 0x41, 0x00, 0x7F, 0x72, 0x00, 0x80, 0x05,
+ 0x00, 0x81, 0xED, 0x00, 0x82, 0x79, 0x00, 0x82, 0x79, 0x00, 0x84, 0x57,
+ 0x00, 0x89, 0x10, 0x00, 0x89, 0x96, 0x00, 0x8B, 0x01, 0x00, 0x8B, 0x39,
+ 0x00, 0x8C, 0xD3, 0x00, 0x8D, 0x08, 0x00, 0x8F, 0xB6, 0x00, 0x90, 0x38,
+ 0x00, 0x96, 0xE3, 0x00, 0x97, 0xFF, 0x00, 0x98, 0x3B, 0x00, 0x4E, 0x26,
+ 0x00, 0x51, 0xB5, 0x00, 0x51, 0x68, 0x00, 0x4F, 0x80, 0x00, 0x51, 0x45,
+ 0x00, 0x51, 0x80, 0x00, 0x52, 0xC7, 0x00, 0x52, 0xFA, 0x00, 0x55, 0x9D,
+ 0x00, 0x55, 0x55, 0x00, 0x55, 0x99, 0x00, 0x55, 0xE2, 0x00, 0x58, 0x5A,
+ 0x00, 0x58, 0xB3, 0x00, 0x59, 0x44, 0x00, 0x59, 0x54, 0x00, 0x5A, 0x62,
+ 0x00, 0x5B, 0x28, 0x00, 0x5E, 0xD2, 0x00, 0x5E, 0xD9, 0x00, 0x5F, 0x69,
+ 0x00, 0x5F, 0xAD, 0x00, 0x60, 0xD8, 0x00, 0x61, 0x4E, 0x00, 0x61, 0x08,
+ 0x00, 0x61, 0x8E, 0x00, 0x61, 0x60, 0x00, 0x61, 0xF2, 0x00, 0x62, 0x34,
+ 0x00, 0x63, 0xC4, 0x00, 0x64, 0x1C, 0x00, 0x64, 0x52, 0x00, 0x65, 0x56,
+ 0x00, 0x66, 0x74, 0x00, 0x67, 0x17, 0x00, 0x67, 0x1B, 0x00, 0x67, 0x56,
+ 0x00, 0x6B, 0x79, 0x00, 0x6B, 0xBA, 0x00, 0x6D, 0x41, 0x00, 0x6E, 0xDB,
+ 0x00, 0x6E, 0xCB, 0x00, 0x6F, 0x22, 0x00, 0x70, 0x1E, 0x00, 0x71, 0x6E,
+ 0x00, 0x77, 0xA7, 0x00, 0x72, 0x35, 0x00, 0x72, 0xAF, 0x00, 0x73, 0x2A,
+ 0x00, 0x74, 0x71, 0x00, 0x75, 0x06, 0x00, 0x75, 0x3B, 0x00, 0x76, 0x1D,
+ 0x00, 0x76, 0x1F, 0x00, 0x76, 0xCA, 0x00, 0x76, 0xDB, 0x00, 0x76, 0xF4,
+ 0x00, 0x77, 0x4A, 0x00, 0x77, 0x40, 0x00, 0x78, 0xCC, 0x00, 0x7A, 0xB1,
+ 0x00, 0x7B, 0xC0, 0x00, 0x7C, 0x7B, 0x00, 0x7D, 0x5B, 0x00, 0x7D, 0xF4,
+ 0x00, 0x7F, 0x3E, 0x00, 0x80, 0x05, 0x00, 0x83, 0x52, 0x00, 0x83, 0xEF,
+ 0x00, 0x87, 0x79, 0x00, 0x89, 0x41, 0x00, 0x89, 0x86, 0x00, 0x89, 0x96,
+ 0x00, 0x8A, 0xBF, 0x00, 0x8A, 0xF8, 0x00, 0x8A, 0xCB, 0x00, 0x8B, 0x01,
+ 0x00, 0x8A, 0xFE, 0x00, 0x8A, 0xED, 0x00, 0x8B, 0x39, 0x00, 0x8B, 0x8A,
+ 0x00, 0x8D, 0x08, 0x00, 0x8F, 0x38, 0x00, 0x90, 0x72, 0x00, 0x91, 0x99,
+ 0x00, 0x92, 0x76, 0x00, 0x96, 0x7C, 0x00, 0x96, 0xE3, 0x00, 0x97, 0x56,
+ 0x00, 0x97, 0xDB, 0x00, 0x97, 0xFF, 0x00, 0x98, 0x0B, 0x00, 0x98, 0x3B,
+ 0x00, 0x9B, 0x12, 0x00, 0x9F, 0x9C, 0x02, 0x28, 0x4A, 0x02, 0x28, 0x44,
+ 0x02, 0x33, 0xD5, 0x00, 0x3B, 0x9D, 0x00, 0x40, 0x18, 0x00, 0x40, 0x39,
+ 0x02, 0x52, 0x49, 0x02, 0x5C, 0xD0, 0x02, 0x7E, 0xD3, 0x00, 0x9F, 0x43,
+ 0x00, 0x9F, 0x8E, 0xC0, 0x00, 0x66, 0x00, 0x00, 0x66, 0xC0, 0x00, 0x66,
+ 0x00, 0x00, 0x69, 0xC0, 0x00, 0x66, 0x00, 0x00, 0x6C, 0xC0, 0x00, 0x66,
+ 0x80, 0x00, 0x66, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x66, 0x80, 0x00, 0x66,
+ 0x00, 0x00, 0x6C, 0xC0, 0x01, 0x7F, 0x00, 0x00, 0x74, 0xC0, 0x00, 0x73,
+ 0x00, 0x00, 0x74, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x76, 0xC0, 0x05, 0x74,
+ 0x00, 0x05, 0x65, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x6B, 0xC0, 0x05, 0x7E,
+ 0x00, 0x05, 0x76, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x6D, 0x80, 0x05, 0xD9,
+ 0x00, 0x05, 0xB4, 0x80, 0x05, 0xF2, 0x00, 0x05, 0xB7, 0x04, 0x05, 0xE2,
+ 0x04, 0x05, 0xD0, 0x04, 0x05, 0xD3, 0x04, 0x05, 0xD4, 0x04, 0x05, 0xDB,
+ 0x04, 0x05, 0xDC, 0x04, 0x05, 0xDD, 0x04, 0x05, 0xE8, 0x04, 0x05, 0xEA,
+ 0x04, 0x00, 0x2B, 0x80, 0x05, 0xE9, 0x00, 0x05, 0xC1, 0x80, 0x05, 0xE9,
+ 0x00, 0x05, 0xC2, 0x80, 0xFB, 0x49, 0x00, 0x05, 0xC1, 0x80, 0xFB, 0x49,
+ 0x00, 0x05, 0xC2, 0x80, 0x05, 0xD0, 0x00, 0x05, 0xB7, 0x80, 0x05, 0xD0,
+ 0x00, 0x05, 0xB8, 0x80, 0x05, 0xD0, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD1,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD2, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD3,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD4, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD5,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD6, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD8,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD9, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDA,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDB, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDC,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDE, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE0,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE1, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE3,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE4, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE6,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE7, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE8,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE9, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xEA,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD5, 0x00, 0x05, 0xB9, 0x80, 0x05, 0xD1,
+ 0x00, 0x05, 0xBF, 0x80, 0x05, 0xDB, 0x00, 0x05, 0xBF, 0x80, 0x05, 0xE4,
+ 0x00, 0x05, 0xBF, 0xC0, 0x05, 0xD0, 0x00, 0x05, 0xDC, 0x18, 0x06, 0x71,
+ 0x14, 0x06, 0x71, 0x18, 0x06, 0x7B, 0x14, 0x06, 0x7B, 0x0C, 0x06, 0x7B,
+ 0x10, 0x06, 0x7B, 0x18, 0x06, 0x7E, 0x14, 0x06, 0x7E, 0x0C, 0x06, 0x7E,
+ 0x10, 0x06, 0x7E, 0x18, 0x06, 0x80, 0x14, 0x06, 0x80, 0x0C, 0x06, 0x80,
+ 0x10, 0x06, 0x80, 0x18, 0x06, 0x7A, 0x14, 0x06, 0x7A, 0x0C, 0x06, 0x7A,
+ 0x10, 0x06, 0x7A, 0x18, 0x06, 0x7F, 0x14, 0x06, 0x7F, 0x0C, 0x06, 0x7F,
+ 0x10, 0x06, 0x7F, 0x18, 0x06, 0x79, 0x14, 0x06, 0x79, 0x0C, 0x06, 0x79,
+ 0x10, 0x06, 0x79, 0x18, 0x06, 0xA4, 0x14, 0x06, 0xA4, 0x0C, 0x06, 0xA4,
+ 0x10, 0x06, 0xA4, 0x18, 0x06, 0xA6, 0x14, 0x06, 0xA6, 0x0C, 0x06, 0xA6,
+ 0x10, 0x06, 0xA6, 0x18, 0x06, 0x84, 0x14, 0x06, 0x84, 0x0C, 0x06, 0x84,
+ 0x10, 0x06, 0x84, 0x18, 0x06, 0x83, 0x14, 0x06, 0x83, 0x0C, 0x06, 0x83,
+ 0x10, 0x06, 0x83, 0x18, 0x06, 0x86, 0x14, 0x06, 0x86, 0x0C, 0x06, 0x86,
+ 0x10, 0x06, 0x86, 0x18, 0x06, 0x87, 0x14, 0x06, 0x87, 0x0C, 0x06, 0x87,
+ 0x10, 0x06, 0x87, 0x18, 0x06, 0x8D, 0x14, 0x06, 0x8D, 0x18, 0x06, 0x8C,
+ 0x14, 0x06, 0x8C, 0x18, 0x06, 0x8E, 0x14, 0x06, 0x8E, 0x18, 0x06, 0x88,
+ 0x14, 0x06, 0x88, 0x18, 0x06, 0x98, 0x14, 0x06, 0x98, 0x18, 0x06, 0x91,
+ 0x14, 0x06, 0x91, 0x18, 0x06, 0xA9, 0x14, 0x06, 0xA9, 0x0C, 0x06, 0xA9,
+ 0x10, 0x06, 0xA9, 0x18, 0x06, 0xAF, 0x14, 0x06, 0xAF, 0x0C, 0x06, 0xAF,
+ 0x10, 0x06, 0xAF, 0x18, 0x06, 0xB3, 0x14, 0x06, 0xB3, 0x0C, 0x06, 0xB3,
+ 0x10, 0x06, 0xB3, 0x18, 0x06, 0xB1, 0x14, 0x06, 0xB1, 0x0C, 0x06, 0xB1,
+ 0x10, 0x06, 0xB1, 0x18, 0x06, 0xBA, 0x14, 0x06, 0xBA, 0x18, 0x06, 0xBB,
+ 0x14, 0x06, 0xBB, 0x0C, 0x06, 0xBB, 0x10, 0x06, 0xBB, 0x18, 0x06, 0xC0,
+ 0x14, 0x06, 0xC0, 0x18, 0x06, 0xC1, 0x14, 0x06, 0xC1, 0x0C, 0x06, 0xC1,
+ 0x10, 0x06, 0xC1, 0x18, 0x06, 0xBE, 0x14, 0x06, 0xBE, 0x0C, 0x06, 0xBE,
+ 0x10, 0x06, 0xBE, 0x18, 0x06, 0xD2, 0x14, 0x06, 0xD2, 0x18, 0x06, 0xD3,
+ 0x14, 0x06, 0xD3, 0x18, 0x06, 0xAD, 0x14, 0x06, 0xAD, 0x0C, 0x06, 0xAD,
+ 0x10, 0x06, 0xAD, 0x18, 0x06, 0xC7, 0x14, 0x06, 0xC7, 0x18, 0x06, 0xC6,
+ 0x14, 0x06, 0xC6, 0x18, 0x06, 0xC8, 0x14, 0x06, 0xC8, 0x18, 0x06, 0x77,
+ 0x18, 0x06, 0xCB, 0x14, 0x06, 0xCB, 0x18, 0x06, 0xC5, 0x14, 0x06, 0xC5,
+ 0x18, 0x06, 0xC9, 0x14, 0x06, 0xC9, 0x18, 0x06, 0xD0, 0x14, 0x06, 0xD0,
+ 0x0C, 0x06, 0xD0, 0x10, 0x06, 0xD0, 0x0C, 0x06, 0x49, 0x10, 0x06, 0x49,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x27, 0x94, 0x06, 0x26, 0x00, 0x06, 0x27,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xD5, 0x94, 0x06, 0x26, 0x00, 0x06, 0xD5,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x48, 0x94, 0x06, 0x26, 0x00, 0x06, 0x48,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xC7, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC7,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xC6, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC6,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xC8, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC8,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xD0, 0x94, 0x06, 0x26, 0x00, 0x06, 0xD0,
+ 0x8C, 0x06, 0x26, 0x00, 0x06, 0xD0, 0x98, 0x06, 0x26, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x26, 0x00, 0x06, 0x49, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x49,
+ 0x18, 0x06, 0xCC, 0x14, 0x06, 0xCC, 0x0C, 0x06, 0xCC, 0x10, 0x06, 0xCC,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x26, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x45, 0x98, 0x06, 0x26, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x28, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x28, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x28, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x28, 0x00, 0x06, 0x45, 0x98, 0x06, 0x28, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x28, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x2A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x2A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2B, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x2B, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2B, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x2B, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2C, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2D, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x2E, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x33, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x33, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x35, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x35, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x36, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x36, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x36, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x36, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x37, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x37, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x38, 0x00, 0x06, 0x45, 0x98, 0x06, 0x39, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x39, 0x00, 0x06, 0x45, 0x98, 0x06, 0x3A, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x3A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x41, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x41, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x41, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x41, 0x00, 0x06, 0x45, 0x98, 0x06, 0x41, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x41, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x42, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x42, 0x00, 0x06, 0x45, 0x98, 0x06, 0x42, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x42, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x43, 0x00, 0x06, 0x27,
+ 0x98, 0x06, 0x43, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x43, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x43, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x43, 0x00, 0x06, 0x44,
+ 0x98, 0x06, 0x43, 0x00, 0x06, 0x45, 0x98, 0x06, 0x43, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x43, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x44, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x44, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x44, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x44, 0x00, 0x06, 0x45, 0x98, 0x06, 0x44, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x44, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x45, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x45, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x45, 0x00, 0x06, 0x45, 0x98, 0x06, 0x45, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x46, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x46, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x46, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x46, 0x00, 0x06, 0x45, 0x98, 0x06, 0x46, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x46, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x47, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x47, 0x00, 0x06, 0x45, 0x98, 0x06, 0x47, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x47, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x4A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x30, 0x00, 0x06, 0x70,
+ 0x98, 0x06, 0x31, 0x00, 0x06, 0x70, 0x98, 0x06, 0x49, 0x00, 0x06, 0x70,
+ 0x98, 0x00, 0x20, 0x80, 0x06, 0x4C, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20,
+ 0x80, 0x06, 0x4D, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x4E,
+ 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x4F, 0x00, 0x06, 0x51,
+ 0x98, 0x00, 0x20, 0x80, 0x06, 0x50, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20,
+ 0x80, 0x06, 0x51, 0x00, 0x06, 0x70, 0x94, 0x06, 0x26, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x26, 0x00, 0x06, 0x32, 0x94, 0x06, 0x26, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x26, 0x00, 0x06, 0x46, 0x94, 0x06, 0x26, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x26, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x28, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x28, 0x00, 0x06, 0x32, 0x94, 0x06, 0x28, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x28, 0x00, 0x06, 0x46, 0x94, 0x06, 0x28, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x28, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x2A, 0x00, 0x06, 0x32, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x2A, 0x00, 0x06, 0x46, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x2A, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x2B, 0x00, 0x06, 0x32, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x2B, 0x00, 0x06, 0x46, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x2B, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x41, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x41, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x42, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x42, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x43, 0x00, 0x06, 0x27,
+ 0x94, 0x06, 0x43, 0x00, 0x06, 0x44, 0x94, 0x06, 0x43, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x43, 0x00, 0x06, 0x49, 0x94, 0x06, 0x43, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x44, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x44, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45, 0x00, 0x06, 0x27,
+ 0x94, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x46, 0x00, 0x06, 0x32, 0x94, 0x06, 0x46, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x46, 0x00, 0x06, 0x46, 0x94, 0x06, 0x46, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x46, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x49, 0x00, 0x06, 0x70,
+ 0x94, 0x06, 0x4A, 0x00, 0x06, 0x31, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x32,
+ 0x94, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x46,
+ 0x94, 0x06, 0x4A, 0x00, 0x06, 0x49, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x4A,
+ 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x26, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x28, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x47,
+ 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x2B, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x2C, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2D, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2E, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x35, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x35, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x35, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x36, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x37, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x38, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x39, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x3A, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x3A, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x41, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x42, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x42, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x43, 0x00, 0x06, 0x44, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x44, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x46, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x47,
+ 0x8C, 0x06, 0x47, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x47, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x47, 0x00, 0x06, 0x70, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x26, 0x00, 0x06, 0x45, 0x90, 0x06, 0x26, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x28, 0x00, 0x06, 0x45, 0x90, 0x06, 0x28, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x2A, 0x00, 0x06, 0x45, 0x90, 0x06, 0x2A, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x2B, 0x00, 0x06, 0x45, 0x90, 0x06, 0x2B, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x33, 0x00, 0x06, 0x45, 0x90, 0x06, 0x33, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x34, 0x00, 0x06, 0x45, 0x90, 0x06, 0x34, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x43, 0x00, 0x06, 0x44, 0x90, 0x06, 0x43, 0x00, 0x06, 0x45,
+ 0x90, 0x06, 0x44, 0x00, 0x06, 0x45, 0x90, 0x06, 0x46, 0x00, 0x06, 0x45,
+ 0x90, 0x06, 0x46, 0x00, 0x06, 0x47, 0x90, 0x06, 0x4A, 0x00, 0x06, 0x45,
+ 0x90, 0x06, 0x4A, 0x00, 0x06, 0x47, 0x90, 0x06, 0x40, 0x80, 0x06, 0x4E,
+ 0x00, 0x06, 0x51, 0x90, 0x06, 0x40, 0x80, 0x06, 0x4F, 0x00, 0x06, 0x51,
+ 0x90, 0x06, 0x40, 0x80, 0x06, 0x50, 0x00, 0x06, 0x51, 0x98, 0x06, 0x37,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x37, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x39,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x39, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x3A,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x3A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x33,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x33, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x34,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x34, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2D,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2C,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2E,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x35,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x35, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x36,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x36, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x34,
+ 0x00, 0x06, 0x2C, 0x98, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x34,
+ 0x00, 0x06, 0x2E, 0x98, 0x06, 0x34, 0x00, 0x06, 0x45, 0x98, 0x06, 0x34,
+ 0x00, 0x06, 0x31, 0x98, 0x06, 0x33, 0x00, 0x06, 0x31, 0x98, 0x06, 0x35,
+ 0x00, 0x06, 0x31, 0x98, 0x06, 0x36, 0x00, 0x06, 0x31, 0x94, 0x06, 0x37,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x37, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x39,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x39, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x3A,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x3A, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x33,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x33, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x34, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2D,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2C,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2E,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x35,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x35, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x36,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x36, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34,
+ 0x00, 0x06, 0x2C, 0x94, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x34,
+ 0x00, 0x06, 0x2E, 0x94, 0x06, 0x34, 0x00, 0x06, 0x45, 0x94, 0x06, 0x34,
+ 0x00, 0x06, 0x31, 0x94, 0x06, 0x33, 0x00, 0x06, 0x31, 0x94, 0x06, 0x35,
+ 0x00, 0x06, 0x31, 0x94, 0x06, 0x36, 0x00, 0x06, 0x31, 0x8C, 0x06, 0x34,
+ 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x34,
+ 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x33,
+ 0x00, 0x06, 0x47, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x37,
+ 0x00, 0x06, 0x45, 0x90, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x90, 0x06, 0x33,
+ 0x00, 0x06, 0x2D, 0x90, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x90, 0x06, 0x34,
+ 0x00, 0x06, 0x2C, 0x90, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x90, 0x06, 0x34,
+ 0x00, 0x06, 0x2E, 0x90, 0x06, 0x37, 0x00, 0x06, 0x45, 0x90, 0x06, 0x38,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x27, 0x00, 0x06, 0x4B, 0x98, 0x06, 0x27,
+ 0x00, 0x06, 0x4B, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A,
+ 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x45, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2E, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x2D,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2D, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x49, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x33, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x33,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x94, 0x06, 0x33, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x94, 0x06, 0x33,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x35, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x35, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x35,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x34, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x45, 0x8C, 0x06, 0x34, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x34, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x34, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2E, 0x94, 0x06, 0x34, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x34, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x36,
+ 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x94, 0x06, 0x36, 0x80, 0x06, 0x2E,
+ 0x00, 0x06, 0x45, 0x8C, 0x06, 0x36, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x37, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x37,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x37, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x37, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x39, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x39,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x39, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x3A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x3A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x3A, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x41, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x41, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x94, 0x06, 0x42,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x42, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x44, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44,
+ 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2C,
+ 0x00, 0x06, 0x2C, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2C,
+ 0x94, 0x06, 0x44, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x44,
+ 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x45,
+ 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x94, 0x06, 0x45, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x45,
+ 0x80, 0x06, 0x2E, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2E,
+ 0x00, 0x06, 0x45, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x47, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x47,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x46, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x46, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x4A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x4A, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x28, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2E,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x33,
+ 0x80, 0x06, 0x2E, 0x00, 0x06, 0x49, 0x94, 0x06, 0x35, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x36, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x4A, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x4A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x4A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x42, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x46, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x42,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x39, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x46,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x45, 0x80, 0x06, 0x2E,
+ 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C,
+ 0x00, 0x06, 0x2D, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x2D, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x41, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x28, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A,
+ 0x8C, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x35, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x33, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x35,
+ 0x80, 0x06, 0x44, 0x00, 0x06, 0xD2, 0x98, 0x06, 0x42, 0x80, 0x06, 0x44,
+ 0x00, 0x06, 0xD2, 0x98, 0x06, 0x27, 0x80, 0x06, 0x44, 0x80, 0x06, 0x44,
+ 0x00, 0x06, 0x47, 0x98, 0x06, 0x27, 0x80, 0x06, 0x43, 0x80, 0x06, 0x28,
+ 0x00, 0x06, 0x31, 0x98, 0x06, 0x45, 0x80, 0x06, 0x2D, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2F, 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x80, 0x06, 0x39,
+ 0x00, 0x06, 0x45, 0x98, 0x06, 0x31, 0x80, 0x06, 0x33, 0x80, 0x06, 0x48,
+ 0x00, 0x06, 0x44, 0x98, 0x06, 0x39, 0x80, 0x06, 0x44, 0x80, 0x06, 0x4A,
+ 0x00, 0x06, 0x47, 0x98, 0x06, 0x48, 0x80, 0x06, 0x33, 0x80, 0x06, 0x44,
+ 0x00, 0x06, 0x45, 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x80, 0x06, 0x49, 0x80, 0x00, 0x20,
+ 0x80, 0x06, 0x27, 0x80, 0x06, 0x44, 0x80, 0x06, 0x44, 0x80, 0x06, 0x47,
+ 0x80, 0x00, 0x20, 0x80, 0x06, 0x39, 0x80, 0x06, 0x44, 0x80, 0x06, 0x4A,
+ 0x80, 0x06, 0x47, 0x80, 0x00, 0x20, 0x80, 0x06, 0x48, 0x80, 0x06, 0x33,
+ 0x80, 0x06, 0x44, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2C, 0x80, 0x06, 0x44,
+ 0x80, 0x00, 0x20, 0x80, 0x06, 0x2C, 0x80, 0x06, 0x44, 0x80, 0x06, 0x27,
+ 0x80, 0x06, 0x44, 0x00, 0x06, 0x47, 0x98, 0x06, 0x31, 0x80, 0x06, 0xCC,
+ 0x80, 0x06, 0x27, 0x00, 0x06, 0x44, 0x28, 0x00, 0x2C, 0x28, 0x30, 0x01,
+ 0x28, 0x30, 0x02, 0x28, 0x00, 0x3A, 0x28, 0x00, 0x3B, 0x28, 0x00, 0x21,
+ 0x28, 0x00, 0x3F, 0x28, 0x30, 0x16, 0x28, 0x30, 0x17, 0x28, 0x20, 0x26,
+ 0x28, 0x20, 0x25, 0x28, 0x20, 0x14, 0x28, 0x20, 0x13, 0x28, 0x00, 0x5F,
+ 0x28, 0x00, 0x5F, 0x28, 0x00, 0x28, 0x28, 0x00, 0x29, 0x28, 0x00, 0x7B,
+ 0x28, 0x00, 0x7D, 0x28, 0x30, 0x14, 0x28, 0x30, 0x15, 0x28, 0x30, 0x10,
+ 0x28, 0x30, 0x11, 0x28, 0x30, 0x0A, 0x28, 0x30, 0x0B, 0x28, 0x30, 0x08,
+ 0x28, 0x30, 0x09, 0x28, 0x30, 0x0C, 0x28, 0x30, 0x0D, 0x28, 0x30, 0x0E,
+ 0x28, 0x30, 0x0F, 0x28, 0x00, 0x5B, 0x28, 0x00, 0x5D, 0x40, 0x20, 0x3E,
+ 0x40, 0x20, 0x3E, 0x40, 0x20, 0x3E, 0x40, 0x20, 0x3E, 0x40, 0x00, 0x5F,
+ 0x40, 0x00, 0x5F, 0x40, 0x00, 0x5F, 0x34, 0x00, 0x2C, 0x34, 0x30, 0x01,
+ 0x34, 0x00, 0x2E, 0x34, 0x00, 0x3B, 0x34, 0x00, 0x3A, 0x34, 0x00, 0x3F,
+ 0x34, 0x00, 0x21, 0x34, 0x20, 0x14, 0x34, 0x00, 0x28, 0x34, 0x00, 0x29,
+ 0x34, 0x00, 0x7B, 0x34, 0x00, 0x7D, 0x34, 0x30, 0x14, 0x34, 0x30, 0x15,
+ 0x34, 0x00, 0x23, 0x34, 0x00, 0x26, 0x34, 0x00, 0x2A, 0x34, 0x00, 0x2B,
+ 0x34, 0x00, 0x2D, 0x34, 0x00, 0x3C, 0x34, 0x00, 0x3E, 0x34, 0x00, 0x3D,
+ 0x34, 0x00, 0x5C, 0x34, 0x00, 0x24, 0x34, 0x00, 0x25, 0x34, 0x00, 0x40,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x4B, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4B,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x4C, 0x98, 0x00, 0x20, 0x00, 0x06, 0x4D,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x4E, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4E,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x4F, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4F,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x50, 0x90, 0x06, 0x40, 0x00, 0x06, 0x50,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x51, 0x90, 0x06, 0x40, 0x00, 0x06, 0x51,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x52, 0x90, 0x06, 0x40, 0x00, 0x06, 0x52,
+ 0x18, 0x06, 0x21, 0x18, 0x06, 0x22, 0x14, 0x06, 0x22, 0x18, 0x06, 0x23,
+ 0x14, 0x06, 0x23, 0x18, 0x06, 0x24, 0x14, 0x06, 0x24, 0x18, 0x06, 0x25,
+ 0x14, 0x06, 0x25, 0x18, 0x06, 0x26, 0x14, 0x06, 0x26, 0x0C, 0x06, 0x26,
+ 0x10, 0x06, 0x26, 0x18, 0x06, 0x27, 0x14, 0x06, 0x27, 0x18, 0x06, 0x28,
+ 0x14, 0x06, 0x28, 0x0C, 0x06, 0x28, 0x10, 0x06, 0x28, 0x18, 0x06, 0x29,
+ 0x14, 0x06, 0x29, 0x18, 0x06, 0x2A, 0x14, 0x06, 0x2A, 0x0C, 0x06, 0x2A,
+ 0x10, 0x06, 0x2A, 0x18, 0x06, 0x2B, 0x14, 0x06, 0x2B, 0x0C, 0x06, 0x2B,
+ 0x10, 0x06, 0x2B, 0x18, 0x06, 0x2C, 0x14, 0x06, 0x2C, 0x0C, 0x06, 0x2C,
+ 0x10, 0x06, 0x2C, 0x18, 0x06, 0x2D, 0x14, 0x06, 0x2D, 0x0C, 0x06, 0x2D,
+ 0x10, 0x06, 0x2D, 0x18, 0x06, 0x2E, 0x14, 0x06, 0x2E, 0x0C, 0x06, 0x2E,
+ 0x10, 0x06, 0x2E, 0x18, 0x06, 0x2F, 0x14, 0x06, 0x2F, 0x18, 0x06, 0x30,
+ 0x14, 0x06, 0x30, 0x18, 0x06, 0x31, 0x14, 0x06, 0x31, 0x18, 0x06, 0x32,
+ 0x14, 0x06, 0x32, 0x18, 0x06, 0x33, 0x14, 0x06, 0x33, 0x0C, 0x06, 0x33,
+ 0x10, 0x06, 0x33, 0x18, 0x06, 0x34, 0x14, 0x06, 0x34, 0x0C, 0x06, 0x34,
+ 0x10, 0x06, 0x34, 0x18, 0x06, 0x35, 0x14, 0x06, 0x35, 0x0C, 0x06, 0x35,
+ 0x10, 0x06, 0x35, 0x18, 0x06, 0x36, 0x14, 0x06, 0x36, 0x0C, 0x06, 0x36,
+ 0x10, 0x06, 0x36, 0x18, 0x06, 0x37, 0x14, 0x06, 0x37, 0x0C, 0x06, 0x37,
+ 0x10, 0x06, 0x37, 0x18, 0x06, 0x38, 0x14, 0x06, 0x38, 0x0C, 0x06, 0x38,
+ 0x10, 0x06, 0x38, 0x18, 0x06, 0x39, 0x14, 0x06, 0x39, 0x0C, 0x06, 0x39,
+ 0x10, 0x06, 0x39, 0x18, 0x06, 0x3A, 0x14, 0x06, 0x3A, 0x0C, 0x06, 0x3A,
+ 0x10, 0x06, 0x3A, 0x18, 0x06, 0x41, 0x14, 0x06, 0x41, 0x0C, 0x06, 0x41,
+ 0x10, 0x06, 0x41, 0x18, 0x06, 0x42, 0x14, 0x06, 0x42, 0x0C, 0x06, 0x42,
+ 0x10, 0x06, 0x42, 0x18, 0x06, 0x43, 0x14, 0x06, 0x43, 0x0C, 0x06, 0x43,
+ 0x10, 0x06, 0x43, 0x18, 0x06, 0x44, 0x14, 0x06, 0x44, 0x0C, 0x06, 0x44,
+ 0x10, 0x06, 0x44, 0x18, 0x06, 0x45, 0x14, 0x06, 0x45, 0x0C, 0x06, 0x45,
+ 0x10, 0x06, 0x45, 0x18, 0x06, 0x46, 0x14, 0x06, 0x46, 0x0C, 0x06, 0x46,
+ 0x10, 0x06, 0x46, 0x18, 0x06, 0x47, 0x14, 0x06, 0x47, 0x0C, 0x06, 0x47,
+ 0x10, 0x06, 0x47, 0x18, 0x06, 0x48, 0x14, 0x06, 0x48, 0x18, 0x06, 0x49,
+ 0x14, 0x06, 0x49, 0x18, 0x06, 0x4A, 0x14, 0x06, 0x4A, 0x0C, 0x06, 0x4A,
+ 0x10, 0x06, 0x4A, 0x98, 0x06, 0x44, 0x00, 0x06, 0x22, 0x94, 0x06, 0x44,
+ 0x00, 0x06, 0x22, 0x98, 0x06, 0x44, 0x00, 0x06, 0x23, 0x94, 0x06, 0x44,
+ 0x00, 0x06, 0x23, 0x98, 0x06, 0x44, 0x00, 0x06, 0x25, 0x94, 0x06, 0x44,
+ 0x00, 0x06, 0x25, 0x98, 0x06, 0x44, 0x00, 0x06, 0x27, 0x94, 0x06, 0x44,
+ 0x00, 0x06, 0x27, 0x2C, 0x00, 0x21, 0x2C, 0x00, 0x22, 0x2C, 0x00, 0x23,
+ 0x2C, 0x00, 0x24, 0x2C, 0x00, 0x25, 0x2C, 0x00, 0x26, 0x2C, 0x00, 0x27,
+ 0x2C, 0x00, 0x28, 0x2C, 0x00, 0x29, 0x2C, 0x00, 0x2A, 0x2C, 0x00, 0x2B,
+ 0x2C, 0x00, 0x2C, 0x2C, 0x00, 0x2D, 0x2C, 0x00, 0x2E, 0x2C, 0x00, 0x2F,
+ 0x2C, 0x00, 0x30, 0x2C, 0x00, 0x31, 0x2C, 0x00, 0x32, 0x2C, 0x00, 0x33,
+ 0x2C, 0x00, 0x34, 0x2C, 0x00, 0x35, 0x2C, 0x00, 0x36, 0x2C, 0x00, 0x37,
+ 0x2C, 0x00, 0x38, 0x2C, 0x00, 0x39, 0x2C, 0x00, 0x3A, 0x2C, 0x00, 0x3B,
+ 0x2C, 0x00, 0x3C, 0x2C, 0x00, 0x3D, 0x2C, 0x00, 0x3E, 0x2C, 0x00, 0x3F,
+ 0x2C, 0x00, 0x40, 0x2C, 0x00, 0x41, 0x2C, 0x00, 0x42, 0x2C, 0x00, 0x43,
+ 0x2C, 0x00, 0x44, 0x2C, 0x00, 0x45, 0x2C, 0x00, 0x46, 0x2C, 0x00, 0x47,
+ 0x2C, 0x00, 0x48, 0x2C, 0x00, 0x49, 0x2C, 0x00, 0x4A, 0x2C, 0x00, 0x4B,
+ 0x2C, 0x00, 0x4C, 0x2C, 0x00, 0x4D, 0x2C, 0x00, 0x4E, 0x2C, 0x00, 0x4F,
+ 0x2C, 0x00, 0x50, 0x2C, 0x00, 0x51, 0x2C, 0x00, 0x52, 0x2C, 0x00, 0x53,
+ 0x2C, 0x00, 0x54, 0x2C, 0x00, 0x55, 0x2C, 0x00, 0x56, 0x2C, 0x00, 0x57,
+ 0x2C, 0x00, 0x58, 0x2C, 0x00, 0x59, 0x2C, 0x00, 0x5A, 0x2C, 0x00, 0x5B,
+ 0x2C, 0x00, 0x5C, 0x2C, 0x00, 0x5D, 0x2C, 0x00, 0x5E, 0x2C, 0x00, 0x5F,
+ 0x2C, 0x00, 0x60, 0x2C, 0x00, 0x61, 0x2C, 0x00, 0x62, 0x2C, 0x00, 0x63,
+ 0x2C, 0x00, 0x64, 0x2C, 0x00, 0x65, 0x2C, 0x00, 0x66, 0x2C, 0x00, 0x67,
+ 0x2C, 0x00, 0x68, 0x2C, 0x00, 0x69, 0x2C, 0x00, 0x6A, 0x2C, 0x00, 0x6B,
+ 0x2C, 0x00, 0x6C, 0x2C, 0x00, 0x6D, 0x2C, 0x00, 0x6E, 0x2C, 0x00, 0x6F,
+ 0x2C, 0x00, 0x70, 0x2C, 0x00, 0x71, 0x2C, 0x00, 0x72, 0x2C, 0x00, 0x73,
+ 0x2C, 0x00, 0x74, 0x2C, 0x00, 0x75, 0x2C, 0x00, 0x76, 0x2C, 0x00, 0x77,
+ 0x2C, 0x00, 0x78, 0x2C, 0x00, 0x79, 0x2C, 0x00, 0x7A, 0x2C, 0x00, 0x7B,
+ 0x2C, 0x00, 0x7C, 0x2C, 0x00, 0x7D, 0x2C, 0x00, 0x7E, 0x2C, 0x29, 0x85,
+ 0x2C, 0x29, 0x86, 0x30, 0x30, 0x02, 0x30, 0x30, 0x0C, 0x30, 0x30, 0x0D,
+ 0x30, 0x30, 0x01, 0x30, 0x30, 0xFB, 0x30, 0x30, 0xF2, 0x30, 0x30, 0xA1,
+ 0x30, 0x30, 0xA3, 0x30, 0x30, 0xA5, 0x30, 0x30, 0xA7, 0x30, 0x30, 0xA9,
+ 0x30, 0x30, 0xE3, 0x30, 0x30, 0xE5, 0x30, 0x30, 0xE7, 0x30, 0x30, 0xC3,
+ 0x30, 0x30, 0xFC, 0x30, 0x30, 0xA2, 0x30, 0x30, 0xA4, 0x30, 0x30, 0xA6,
+ 0x30, 0x30, 0xA8, 0x30, 0x30, 0xAA, 0x30, 0x30, 0xAB, 0x30, 0x30, 0xAD,
+ 0x30, 0x30, 0xAF, 0x30, 0x30, 0xB1, 0x30, 0x30, 0xB3, 0x30, 0x30, 0xB5,
+ 0x30, 0x30, 0xB7, 0x30, 0x30, 0xB9, 0x30, 0x30, 0xBB, 0x30, 0x30, 0xBD,
+ 0x30, 0x30, 0xBF, 0x30, 0x30, 0xC1, 0x30, 0x30, 0xC4, 0x30, 0x30, 0xC6,
+ 0x30, 0x30, 0xC8, 0x30, 0x30, 0xCA, 0x30, 0x30, 0xCB, 0x30, 0x30, 0xCC,
+ 0x30, 0x30, 0xCD, 0x30, 0x30, 0xCE, 0x30, 0x30, 0xCF, 0x30, 0x30, 0xD2,
+ 0x30, 0x30, 0xD5, 0x30, 0x30, 0xD8, 0x30, 0x30, 0xDB, 0x30, 0x30, 0xDE,
+ 0x30, 0x30, 0xDF, 0x30, 0x30, 0xE0, 0x30, 0x30, 0xE1, 0x30, 0x30, 0xE2,
+ 0x30, 0x30, 0xE4, 0x30, 0x30, 0xE6, 0x30, 0x30, 0xE8, 0x30, 0x30, 0xE9,
+ 0x30, 0x30, 0xEA, 0x30, 0x30, 0xEB, 0x30, 0x30, 0xEC, 0x30, 0x30, 0xED,
+ 0x30, 0x30, 0xEF, 0x30, 0x30, 0xF3, 0x30, 0x30, 0x99, 0x30, 0x30, 0x9A,
+ 0x30, 0x31, 0x64, 0x30, 0x31, 0x31, 0x30, 0x31, 0x32, 0x30, 0x31, 0x33,
+ 0x30, 0x31, 0x34, 0x30, 0x31, 0x35, 0x30, 0x31, 0x36, 0x30, 0x31, 0x37,
+ 0x30, 0x31, 0x38, 0x30, 0x31, 0x39, 0x30, 0x31, 0x3A, 0x30, 0x31, 0x3B,
+ 0x30, 0x31, 0x3C, 0x30, 0x31, 0x3D, 0x30, 0x31, 0x3E, 0x30, 0x31, 0x3F,
+ 0x30, 0x31, 0x40, 0x30, 0x31, 0x41, 0x30, 0x31, 0x42, 0x30, 0x31, 0x43,
+ 0x30, 0x31, 0x44, 0x30, 0x31, 0x45, 0x30, 0x31, 0x46, 0x30, 0x31, 0x47,
+ 0x30, 0x31, 0x48, 0x30, 0x31, 0x49, 0x30, 0x31, 0x4A, 0x30, 0x31, 0x4B,
+ 0x30, 0x31, 0x4C, 0x30, 0x31, 0x4D, 0x30, 0x31, 0x4E, 0x30, 0x31, 0x4F,
+ 0x30, 0x31, 0x50, 0x30, 0x31, 0x51, 0x30, 0x31, 0x52, 0x30, 0x31, 0x53,
+ 0x30, 0x31, 0x54, 0x30, 0x31, 0x55, 0x30, 0x31, 0x56, 0x30, 0x31, 0x57,
+ 0x30, 0x31, 0x58, 0x30, 0x31, 0x59, 0x30, 0x31, 0x5A, 0x30, 0x31, 0x5B,
+ 0x30, 0x31, 0x5C, 0x30, 0x31, 0x5D, 0x30, 0x31, 0x5E, 0x30, 0x31, 0x5F,
+ 0x30, 0x31, 0x60, 0x30, 0x31, 0x61, 0x30, 0x31, 0x62, 0x30, 0x31, 0x63,
+ 0x2C, 0x00, 0xA2, 0x2C, 0x00, 0xA3, 0x2C, 0x00, 0xAC, 0x2C, 0x00, 0xAF,
+ 0x2C, 0x00, 0xA6, 0x2C, 0x00, 0xA5, 0x2C, 0x20, 0xA9, 0x30, 0x25, 0x02,
+ 0x30, 0x21, 0x90, 0x30, 0x21, 0x91, 0x30, 0x21, 0x92, 0x30, 0x21, 0x93,
+ 0x30, 0x25, 0xA0, 0x30, 0x25, 0xCB, 0x81, 0xD1, 0x57, 0x01, 0xD1, 0x65,
+ 0x81, 0xD1, 0x58, 0x01, 0xD1, 0x65, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x6E,
+ 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x6F, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x70,
+ 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x71, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x72,
+ 0x81, 0xD1, 0xB9, 0x01, 0xD1, 0x65, 0x81, 0xD1, 0xBA, 0x01, 0xD1, 0x65,
+ 0x81, 0xD1, 0xBB, 0x01, 0xD1, 0x6E, 0x81, 0xD1, 0xBC, 0x01, 0xD1, 0x6E,
+ 0x81, 0xD1, 0xBB, 0x01, 0xD1, 0x6F, 0x81, 0xD1, 0xBC, 0x01, 0xD1, 0x6F,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B,
+ 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F,
+ 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73,
+ 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77,
+ 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41,
+ 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45,
+ 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49,
+ 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D,
+ 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51,
+ 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55,
+ 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59,
+ 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63,
+ 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67,
+ 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B,
+ 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F,
+ 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73,
+ 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77,
+ 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x47, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55,
+ 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59,
+ 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63,
+ 0x04, 0x00, 0x64, 0x04, 0x00, 0x66, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69,
+ 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D,
+ 0x04, 0x00, 0x6E, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45,
+ 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B,
+ 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F,
+ 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63,
+ 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67,
+ 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B,
+ 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F,
+ 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73,
+ 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77,
+ 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41,
+ 0x04, 0x00, 0x42, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B,
+ 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x53,
+ 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57,
+ 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C,
+ 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50,
+ 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54,
+ 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58,
+ 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61, 0x04, 0x00, 0x62,
+ 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A,
+ 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E,
+ 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71, 0x04, 0x00, 0x72,
+ 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75, 0x04, 0x00, 0x76,
+ 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A,
+ 0x04, 0x01, 0x31, 0x04, 0x02, 0x37, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92,
+ 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96,
+ 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A,
+ 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E,
+ 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4,
+ 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6,
+ 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07,
+ 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4,
+ 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8,
+ 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC,
+ 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0,
+ 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4,
+ 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8,
+ 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1,
+ 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6,
+ 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94,
+ 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98,
+ 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C,
+ 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0,
+ 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4,
+ 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8,
+ 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2,
+ 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6,
+ 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA,
+ 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE,
+ 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2,
+ 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6,
+ 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02,
+ 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5,
+ 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92,
+ 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96,
+ 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A,
+ 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E,
+ 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4,
+ 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6,
+ 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07,
+ 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4,
+ 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8,
+ 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC,
+ 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0,
+ 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4,
+ 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8,
+ 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1,
+ 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6,
+ 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94,
+ 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98,
+ 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C,
+ 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0,
+ 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4,
+ 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8,
+ 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2,
+ 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6,
+ 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA,
+ 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE,
+ 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2,
+ 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6,
+ 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02,
+ 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5,
+ 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92,
+ 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96,
+ 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A,
+ 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E,
+ 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4,
+ 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6,
+ 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07,
+ 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4,
+ 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8,
+ 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC,
+ 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0,
+ 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4,
+ 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8,
+ 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1,
+ 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6,
+ 0x04, 0x03, 0xDC, 0x04, 0x03, 0xDD, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31,
+ 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35,
+ 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39,
+ 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33,
+ 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37,
+ 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31,
+ 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35,
+ 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39,
+ 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33,
+ 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37,
+ 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31,
+ 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35,
+ 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39,
+ 0x00, 0x4E, 0x3D, 0x00, 0x4E, 0x38, 0x00, 0x4E, 0x41, 0x02, 0x01, 0x22,
+ 0x00, 0x4F, 0x60, 0x00, 0x4F, 0xAE, 0x00, 0x4F, 0xBB, 0x00, 0x50, 0x02,
+ 0x00, 0x50, 0x7A, 0x00, 0x50, 0x99, 0x00, 0x50, 0xE7, 0x00, 0x50, 0xCF,
+ 0x00, 0x34, 0x9E, 0x02, 0x06, 0x3A, 0x00, 0x51, 0x4D, 0x00, 0x51, 0x54,
+ 0x00, 0x51, 0x64, 0x00, 0x51, 0x77, 0x02, 0x05, 0x1C, 0x00, 0x34, 0xB9,
+ 0x00, 0x51, 0x67, 0x00, 0x51, 0x8D, 0x02, 0x05, 0x4B, 0x00, 0x51, 0x97,
+ 0x00, 0x51, 0xA4, 0x00, 0x4E, 0xCC, 0x00, 0x51, 0xAC, 0x00, 0x51, 0xB5,
+ 0x02, 0x91, 0xDF, 0x00, 0x51, 0xF5, 0x00, 0x52, 0x03, 0x00, 0x34, 0xDF,
+ 0x00, 0x52, 0x3B, 0x00, 0x52, 0x46, 0x00, 0x52, 0x72, 0x00, 0x52, 0x77,
+ 0x00, 0x35, 0x15, 0x00, 0x52, 0xC7, 0x00, 0x52, 0xC9, 0x00, 0x52, 0xE4,
+ 0x00, 0x52, 0xFA, 0x00, 0x53, 0x05, 0x00, 0x53, 0x06, 0x00, 0x53, 0x17,
+ 0x00, 0x53, 0x49, 0x00, 0x53, 0x51, 0x00, 0x53, 0x5A, 0x00, 0x53, 0x73,
+ 0x00, 0x53, 0x7D, 0x00, 0x53, 0x7F, 0x00, 0x53, 0x7F, 0x00, 0x53, 0x7F,
+ 0x02, 0x0A, 0x2C, 0x00, 0x70, 0x70, 0x00, 0x53, 0xCA, 0x00, 0x53, 0xDF,
+ 0x02, 0x0B, 0x63, 0x00, 0x53, 0xEB, 0x00, 0x53, 0xF1, 0x00, 0x54, 0x06,
+ 0x00, 0x54, 0x9E, 0x00, 0x54, 0x38, 0x00, 0x54, 0x48, 0x00, 0x54, 0x68,
+ 0x00, 0x54, 0xA2, 0x00, 0x54, 0xF6, 0x00, 0x55, 0x10, 0x00, 0x55, 0x53,
+ 0x00, 0x55, 0x63, 0x00, 0x55, 0x84, 0x00, 0x55, 0x84, 0x00, 0x55, 0x99,
+ 0x00, 0x55, 0xAB, 0x00, 0x55, 0xB3, 0x00, 0x55, 0xC2, 0x00, 0x57, 0x16,
+ 0x00, 0x56, 0x06, 0x00, 0x57, 0x17, 0x00, 0x56, 0x51, 0x00, 0x56, 0x74,
+ 0x00, 0x52, 0x07, 0x00, 0x58, 0xEE, 0x00, 0x57, 0xCE, 0x00, 0x57, 0xF4,
+ 0x00, 0x58, 0x0D, 0x00, 0x57, 0x8B, 0x00, 0x58, 0x32, 0x00, 0x58, 0x31,
+ 0x00, 0x58, 0xAC, 0x02, 0x14, 0xE4, 0x00, 0x58, 0xF2, 0x00, 0x58, 0xF7,
+ 0x00, 0x59, 0x06, 0x00, 0x59, 0x1A, 0x00, 0x59, 0x22, 0x00, 0x59, 0x62,
+ 0x02, 0x16, 0xA8, 0x02, 0x16, 0xEA, 0x00, 0x59, 0xEC, 0x00, 0x5A, 0x1B,
+ 0x00, 0x5A, 0x27, 0x00, 0x59, 0xD8, 0x00, 0x5A, 0x66, 0x00, 0x36, 0xEE,
+ 0x00, 0x36, 0xFC, 0x00, 0x5B, 0x08, 0x00, 0x5B, 0x3E, 0x00, 0x5B, 0x3E,
+ 0x02, 0x19, 0xC8, 0x00, 0x5B, 0xC3, 0x00, 0x5B, 0xD8, 0x00, 0x5B, 0xE7,
+ 0x00, 0x5B, 0xF3, 0x02, 0x1B, 0x18, 0x00, 0x5B, 0xFF, 0x00, 0x5C, 0x06,
+ 0x00, 0x5F, 0x53, 0x00, 0x5C, 0x22, 0x00, 0x37, 0x81, 0x00, 0x5C, 0x60,
+ 0x00, 0x5C, 0x6E, 0x00, 0x5C, 0xC0, 0x00, 0x5C, 0x8D, 0x02, 0x1D, 0xE4,
+ 0x00, 0x5D, 0x43, 0x02, 0x1D, 0xE6, 0x00, 0x5D, 0x6E, 0x00, 0x5D, 0x6B,
+ 0x00, 0x5D, 0x7C, 0x00, 0x5D, 0xE1, 0x00, 0x5D, 0xE2, 0x00, 0x38, 0x2F,
+ 0x00, 0x5D, 0xFD, 0x00, 0x5E, 0x28, 0x00, 0x5E, 0x3D, 0x00, 0x5E, 0x69,
+ 0x00, 0x38, 0x62, 0x02, 0x21, 0x83, 0x00, 0x38, 0x7C, 0x00, 0x5E, 0xB0,
+ 0x00, 0x5E, 0xB3, 0x00, 0x5E, 0xB6, 0x00, 0x5E, 0xCA, 0x02, 0xA3, 0x92,
+ 0x00, 0x5E, 0xFE, 0x02, 0x23, 0x31, 0x02, 0x23, 0x31, 0x00, 0x82, 0x01,
+ 0x00, 0x5F, 0x22, 0x00, 0x5F, 0x22, 0x00, 0x38, 0xC7, 0x02, 0x32, 0xB8,
+ 0x02, 0x61, 0xDA, 0x00, 0x5F, 0x62, 0x00, 0x5F, 0x6B, 0x00, 0x38, 0xE3,
+ 0x00, 0x5F, 0x9A, 0x00, 0x5F, 0xCD, 0x00, 0x5F, 0xD7, 0x00, 0x5F, 0xF9,
+ 0x00, 0x60, 0x81, 0x00, 0x39, 0x3A, 0x00, 0x39, 0x1C, 0x00, 0x60, 0x94,
+ 0x02, 0x26, 0xD4, 0x00, 0x60, 0xC7, 0x00, 0x61, 0x48, 0x00, 0x61, 0x4C,
+ 0x00, 0x61, 0x4E, 0x00, 0x61, 0x4C, 0x00, 0x61, 0x7A, 0x00, 0x61, 0x8E,
+ 0x00, 0x61, 0xB2, 0x00, 0x61, 0xA4, 0x00, 0x61, 0xAF, 0x00, 0x61, 0xDE,
+ 0x00, 0x61, 0xF2, 0x00, 0x61, 0xF6, 0x00, 0x62, 0x10, 0x00, 0x62, 0x1B,
+ 0x00, 0x62, 0x5D, 0x00, 0x62, 0xB1, 0x00, 0x62, 0xD4, 0x00, 0x63, 0x50,
+ 0x02, 0x2B, 0x0C, 0x00, 0x63, 0x3D, 0x00, 0x62, 0xFC, 0x00, 0x63, 0x68,
+ 0x00, 0x63, 0x83, 0x00, 0x63, 0xE4, 0x02, 0x2B, 0xF1, 0x00, 0x64, 0x22,
+ 0x00, 0x63, 0xC5, 0x00, 0x63, 0xA9, 0x00, 0x3A, 0x2E, 0x00, 0x64, 0x69,
+ 0x00, 0x64, 0x7E, 0x00, 0x64, 0x9D, 0x00, 0x64, 0x77, 0x00, 0x3A, 0x6C,
+ 0x00, 0x65, 0x4F, 0x00, 0x65, 0x6C, 0x02, 0x30, 0x0A, 0x00, 0x65, 0xE3,
+ 0x00, 0x66, 0xF8, 0x00, 0x66, 0x49, 0x00, 0x3B, 0x19, 0x00, 0x66, 0x91,
+ 0x00, 0x3B, 0x08, 0x00, 0x3A, 0xE4, 0x00, 0x51, 0x92, 0x00, 0x51, 0x95,
+ 0x00, 0x67, 0x00, 0x00, 0x66, 0x9C, 0x00, 0x80, 0xAD, 0x00, 0x43, 0xD9,
+ 0x00, 0x67, 0x17, 0x00, 0x67, 0x1B, 0x00, 0x67, 0x21, 0x00, 0x67, 0x5E,
+ 0x00, 0x67, 0x53, 0x02, 0x33, 0xC3, 0x00, 0x3B, 0x49, 0x00, 0x67, 0xFA,
+ 0x00, 0x67, 0x85, 0x00, 0x68, 0x52, 0x00, 0x68, 0x85, 0x02, 0x34, 0x6D,
+ 0x00, 0x68, 0x8E, 0x00, 0x68, 0x1F, 0x00, 0x69, 0x14, 0x00, 0x3B, 0x9D,
+ 0x00, 0x69, 0x42, 0x00, 0x69, 0xA3, 0x00, 0x69, 0xEA, 0x00, 0x6A, 0xA8,
+ 0x02, 0x36, 0xA3, 0x00, 0x6A, 0xDB, 0x00, 0x3C, 0x18, 0x00, 0x6B, 0x21,
+ 0x02, 0x38, 0xA7, 0x00, 0x6B, 0x54, 0x00, 0x3C, 0x4E, 0x00, 0x6B, 0x72,
+ 0x00, 0x6B, 0x9F, 0x00, 0x6B, 0xBA, 0x00, 0x6B, 0xBB, 0x02, 0x3A, 0x8D,
+ 0x02, 0x1D, 0x0B, 0x02, 0x3A, 0xFA, 0x00, 0x6C, 0x4E, 0x02, 0x3C, 0xBC,
+ 0x00, 0x6C, 0xBF, 0x00, 0x6C, 0xCD, 0x00, 0x6C, 0x67, 0x00, 0x6D, 0x16,
+ 0x00, 0x6D, 0x3E, 0x00, 0x6D, 0x77, 0x00, 0x6D, 0x41, 0x00, 0x6D, 0x69,
+ 0x00, 0x6D, 0x78, 0x00, 0x6D, 0x85, 0x02, 0x3D, 0x1E, 0x00, 0x6D, 0x34,
+ 0x00, 0x6E, 0x2F, 0x00, 0x6E, 0x6E, 0x00, 0x3D, 0x33, 0x00, 0x6E, 0xCB,
+ 0x00, 0x6E, 0xC7, 0x02, 0x3E, 0xD1, 0x00, 0x6D, 0xF9, 0x00, 0x6F, 0x6E,
+ 0x02, 0x3F, 0x5E, 0x02, 0x3F, 0x8E, 0x00, 0x6F, 0xC6, 0x00, 0x70, 0x39,
+ 0x00, 0x70, 0x1E, 0x00, 0x70, 0x1B, 0x00, 0x3D, 0x96, 0x00, 0x70, 0x4A,
+ 0x00, 0x70, 0x7D, 0x00, 0x70, 0x77, 0x00, 0x70, 0xAD, 0x02, 0x05, 0x25,
+ 0x00, 0x71, 0x45, 0x02, 0x42, 0x63, 0x00, 0x71, 0x9C, 0x02, 0x43, 0xAB,
+ 0x00, 0x72, 0x28, 0x00, 0x72, 0x35, 0x00, 0x72, 0x50, 0x02, 0x46, 0x08,
+ 0x00, 0x72, 0x80, 0x00, 0x72, 0x95, 0x02, 0x47, 0x35, 0x02, 0x48, 0x14,
+ 0x00, 0x73, 0x7A, 0x00, 0x73, 0x8B, 0x00, 0x3E, 0xAC, 0x00, 0x73, 0xA5,
+ 0x00, 0x3E, 0xB8, 0x00, 0x3E, 0xB8, 0x00, 0x74, 0x47, 0x00, 0x74, 0x5C,
+ 0x00, 0x74, 0x71, 0x00, 0x74, 0x85, 0x00, 0x74, 0xCA, 0x00, 0x3F, 0x1B,
+ 0x00, 0x75, 0x24, 0x02, 0x4C, 0x36, 0x00, 0x75, 0x3E, 0x02, 0x4C, 0x92,
+ 0x00, 0x75, 0x70, 0x02, 0x21, 0x9F, 0x00, 0x76, 0x10, 0x02, 0x4F, 0xA1,
+ 0x02, 0x4F, 0xB8, 0x02, 0x50, 0x44, 0x00, 0x3F, 0xFC, 0x00, 0x40, 0x08,
+ 0x00, 0x76, 0xF4, 0x02, 0x50, 0xF3, 0x02, 0x50, 0xF2, 0x02, 0x51, 0x19,
+ 0x02, 0x51, 0x33, 0x00, 0x77, 0x1E, 0x00, 0x77, 0x1F, 0x00, 0x77, 0x1F,
+ 0x00, 0x77, 0x4A, 0x00, 0x40, 0x39, 0x00, 0x77, 0x8B, 0x00, 0x40, 0x46,
+ 0x00, 0x40, 0x96, 0x02, 0x54, 0x1D, 0x00, 0x78, 0x4E, 0x00, 0x78, 0x8C,
+ 0x00, 0x78, 0xCC, 0x00, 0x40, 0xE3, 0x02, 0x56, 0x26, 0x00, 0x79, 0x56,
+ 0x02, 0x56, 0x9A, 0x02, 0x56, 0xC5, 0x00, 0x79, 0x8F, 0x00, 0x79, 0xEB,
+ 0x00, 0x41, 0x2F, 0x00, 0x7A, 0x40, 0x00, 0x7A, 0x4A, 0x00, 0x7A, 0x4F,
+ 0x02, 0x59, 0x7C, 0x02, 0x5A, 0xA7, 0x02, 0x5A, 0xA7, 0x00, 0x7A, 0xEE,
+ 0x00, 0x42, 0x02, 0x02, 0x5B, 0xAB, 0x00, 0x7B, 0xC6, 0x00, 0x7B, 0xC9,
+ 0x00, 0x42, 0x27, 0x02, 0x5C, 0x80, 0x00, 0x7C, 0xD2, 0x00, 0x42, 0xA0,
+ 0x00, 0x7C, 0xE8, 0x00, 0x7C, 0xE3, 0x00, 0x7D, 0x00, 0x02, 0x5F, 0x86,
+ 0x00, 0x7D, 0x63, 0x00, 0x43, 0x01, 0x00, 0x7D, 0xC7, 0x00, 0x7E, 0x02,
+ 0x00, 0x7E, 0x45, 0x00, 0x43, 0x34, 0x02, 0x62, 0x28, 0x02, 0x62, 0x47,
+ 0x00, 0x43, 0x59, 0x02, 0x62, 0xD9, 0x00, 0x7F, 0x7A, 0x02, 0x63, 0x3E,
+ 0x00, 0x7F, 0x95, 0x00, 0x7F, 0xFA, 0x00, 0x80, 0x05, 0x02, 0x64, 0xDA,
+ 0x02, 0x65, 0x23, 0x00, 0x80, 0x60, 0x02, 0x65, 0xA8, 0x00, 0x80, 0x70,
+ 0x02, 0x33, 0x5F, 0x00, 0x43, 0xD5, 0x00, 0x80, 0xB2, 0x00, 0x81, 0x03,
+ 0x00, 0x44, 0x0B, 0x00, 0x81, 0x3E, 0x00, 0x5A, 0xB5, 0x02, 0x67, 0xA7,
+ 0x02, 0x67, 0xB5, 0x02, 0x33, 0x93, 0x02, 0x33, 0x9C, 0x00, 0x82, 0x01,
+ 0x00, 0x82, 0x04, 0x00, 0x8F, 0x9E, 0x00, 0x44, 0x6B, 0x00, 0x82, 0x91,
+ 0x00, 0x82, 0x8B, 0x00, 0x82, 0x9D, 0x00, 0x52, 0xB3, 0x00, 0x82, 0xB1,
+ 0x00, 0x82, 0xB3, 0x00, 0x82, 0xBD, 0x00, 0x82, 0xE6, 0x02, 0x6B, 0x3C,
+ 0x00, 0x82, 0xE5, 0x00, 0x83, 0x1D, 0x00, 0x83, 0x63, 0x00, 0x83, 0xAD,
+ 0x00, 0x83, 0x23, 0x00, 0x83, 0xBD, 0x00, 0x83, 0xE7, 0x00, 0x84, 0x57,
+ 0x00, 0x83, 0x53, 0x00, 0x83, 0xCA, 0x00, 0x83, 0xCC, 0x00, 0x83, 0xDC,
+ 0x02, 0x6C, 0x36, 0x02, 0x6D, 0x6B, 0x02, 0x6C, 0xD5, 0x00, 0x45, 0x2B,
+ 0x00, 0x84, 0xF1, 0x00, 0x84, 0xF3, 0x00, 0x85, 0x16, 0x02, 0x73, 0xCA,
+ 0x00, 0x85, 0x64, 0x02, 0x6F, 0x2C, 0x00, 0x45, 0x5D, 0x00, 0x45, 0x61,
+ 0x02, 0x6F, 0xB1, 0x02, 0x70, 0xD2, 0x00, 0x45, 0x6B, 0x00, 0x86, 0x50,
+ 0x00, 0x86, 0x5C, 0x00, 0x86, 0x67, 0x00, 0x86, 0x69, 0x00, 0x86, 0xA9,
+ 0x00, 0x86, 0x88, 0x00, 0x87, 0x0E, 0x00, 0x86, 0xE2, 0x00, 0x87, 0x79,
+ 0x00, 0x87, 0x28, 0x00, 0x87, 0x6B, 0x00, 0x87, 0x86, 0x00, 0x45, 0xD7,
+ 0x00, 0x87, 0xE1, 0x00, 0x88, 0x01, 0x00, 0x45, 0xF9, 0x00, 0x88, 0x60,
+ 0x00, 0x88, 0x63, 0x02, 0x76, 0x67, 0x00, 0x88, 0xD7, 0x00, 0x88, 0xDE,
+ 0x00, 0x46, 0x35, 0x00, 0x88, 0xFA, 0x00, 0x34, 0xBB, 0x02, 0x78, 0xAE,
+ 0x02, 0x79, 0x66, 0x00, 0x46, 0xBE, 0x00, 0x46, 0xC7, 0x00, 0x8A, 0xA0,
+ 0x00, 0x8A, 0xED, 0x00, 0x8B, 0x8A, 0x00, 0x8C, 0x55, 0x02, 0x7C, 0xA8,
+ 0x00, 0x8C, 0xAB, 0x00, 0x8C, 0xC1, 0x00, 0x8D, 0x1B, 0x00, 0x8D, 0x77,
+ 0x02, 0x7F, 0x2F, 0x02, 0x08, 0x04, 0x00, 0x8D, 0xCB, 0x00, 0x8D, 0xBC,
+ 0x00, 0x8D, 0xF0, 0x02, 0x08, 0xDE, 0x00, 0x8E, 0xD4, 0x00, 0x8F, 0x38,
+ 0x02, 0x85, 0xD2, 0x02, 0x85, 0xED, 0x00, 0x90, 0x94, 0x00, 0x90, 0xF1,
+ 0x00, 0x91, 0x11, 0x02, 0x87, 0x2E, 0x00, 0x91, 0x1B, 0x00, 0x92, 0x38,
+ 0x00, 0x92, 0xD7, 0x00, 0x92, 0xD8, 0x00, 0x92, 0x7C, 0x00, 0x93, 0xF9,
+ 0x00, 0x94, 0x15, 0x02, 0x8B, 0xFA, 0x00, 0x95, 0x8B, 0x00, 0x49, 0x95,
+ 0x00, 0x95, 0xB7, 0x02, 0x8D, 0x77, 0x00, 0x49, 0xE6, 0x00, 0x96, 0xC3,
+ 0x00, 0x5D, 0xB2, 0x00, 0x97, 0x23, 0x02, 0x91, 0x45, 0x02, 0x92, 0x1A,
+ 0x00, 0x4A, 0x6E, 0x00, 0x4A, 0x76, 0x00, 0x97, 0xE0, 0x02, 0x94, 0x0A,
+ 0x00, 0x4A, 0xB2, 0x02, 0x94, 0x96, 0x00, 0x98, 0x0B, 0x00, 0x98, 0x0B,
+ 0x00, 0x98, 0x29, 0x02, 0x95, 0xB6, 0x00, 0x98, 0xE2, 0x00, 0x4B, 0x33,
+ 0x00, 0x99, 0x29, 0x00, 0x99, 0xA7, 0x00, 0x99, 0xC2, 0x00, 0x99, 0xFE,
+ 0x00, 0x4B, 0xCE, 0x02, 0x9B, 0x30, 0x00, 0x9B, 0x12, 0x00, 0x9C, 0x40,
+ 0x00, 0x9C, 0xFD, 0x00, 0x4C, 0xCE, 0x00, 0x4C, 0xED, 0x00, 0x9D, 0x67,
+ 0x02, 0xA0, 0xCE, 0x00, 0x4C, 0xF8, 0x02, 0xA1, 0x05, 0x02, 0xA2, 0x0E,
+ 0x02, 0xA2, 0x91, 0x00, 0x9E, 0xBB, 0x00, 0x4D, 0x56, 0x00, 0x9E, 0xF9,
+ 0x00, 0x9E, 0xFE, 0x00, 0x9F, 0x05, 0x00, 0x9F, 0x0F, 0x00, 0x9F, 0x16,
+ 0x00, 0x9F, 0x3B, 0x02, 0xA6, 0x00
+};
+
+const decomp_index_table_t gl_uninorm_decomp_index_table =
+{
+ {
+ 0, 32, 64, 96, 128, -1, 160, 192,
+ 224, 256, 288, 320, 352, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 384, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 416, 448,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 480, 512, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 544
+ },
+ {
+ -1, -1, -1, -1, -1, 0, 32, 64,
+ 96, 128, 160, 192, -1, 224, 256, 288,
+ 320, 352, -1, -1, -1, 384, 416, 448,
+ -1, -1, 480, 512, 544, 576, 608, 640,
+ 672, 704, 736, 768, -1, -1, 800, 832,
+ -1, -1, -1, -1, 864, -1, -1, -1,
+ -1, 896, -1, 928, -1, -1, 960, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 992, 1024, -1, -1, -1, 1056, -1,
+ -1, 1088, 1120, -1, -1, -1, -1, -1,
+ -1, -1, 1152, -1, 1184, -1, 1216, -1,
+ -1, -1, 1248, -1, -1, -1, 1280, -1,
+ -1, -1, 1312, -1, -1, -1, 1344, -1,
+ -1, 1376, -1, -1, -1, 1408, 1440, -1,
+ 1472, -1, 1504, 1536, 1568, 1600, -1, -1,
+ -1, 1632, -1, -1, -1, -1, -1, 1664,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 1696, 1728, 1760, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1792, 1824, 1856, 1888, 1920, -1, -1,
+ 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176,
+ 2208, 2240, 2272, 2304, 2336, 2368, 2400, 2432,
+ 2464, 2496, 2528, 2560, 2592, 2624, -1, -1,
+ 2656, 2688, 2720, 2752, 2784, 2816, 2848, -1,
+ 2880, 2912, 2944, 2976, 3008, 3040, -1, 3072,
+ -1, 3104, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3136, 3168, 3200, 3232, 3264,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3296, -1, -1, 3328, -1, -1, 3360, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3392, -1, -1, -1, -1,
+ -1, -1, -1, 3424, -1, -1, -1, -1,
+ -1, -1, -1, -1, 3456, -1, -1, 3488,
+ 3520, 3552, 3584, 3616, 3648, 3680, 3712, -1,
+ 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968,
+ -1, 4000, 4032, 4064, 4096, -1, -1, -1,
+ 4128, 4160, 4192, 4224, 4256, 4288, 4320, 4352,
+ 4384, 4416, 4448, 4480, 4512, 4544, 4576, 4608,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 4640, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4672, 4704, 4736, 4768, 4800, 4832, 4864, 4896,
+ 4928, 4960, 4992, 5024, 5056, 5088, 5120, -1,
+ 5152, 5184, 5216, 5248, 5280, 5312, 5344, 5376,
+ 5408, 5440, 5472, 5504, 5536, 5568, 5600, 5632,
+ 5664, 5696, 5728, 5760, 5792, 5824, 5856, 5888,
+ 5920, 5952, 5984, 6016, 6048, 6080, 6112, 6144,
+ 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 6432, 6464, -1, 6496, 6528, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 6560, 6592, 6624, 6656, 6688, 6720, 6752, 6784,
+ 6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040,
+ 7072, 7104, 7136, 7168, 7200, 7232, 7264, 7296,
+ 7328, 7360, 7392, 7424, 7456, 7488, 7520, 7552,
+ 7584, 7616, 7648, 7680, 7712, 7744, 7776, 7808,
+ 7840, 7872, 7904, 7936, 7968, 8000, 8032, 8064,
+ 8096, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 32768, -1, -1, -1, -1, -1, -1, -1,
+ 32769, -1, 32771, -1, -1, -1, -1, 32772,
+ -1, -1, 32774, 32775, 32776, 32778, -1, -1,
+ 32779, 32781, 32782, -1, 32783, 32786, 32789, -1,
+ 24, 26, 28, 30, 32, 34, -1, 36,
+ 38, 40, 42, 44, 46, 48, 50, 52,
+ -1, 54, 56, 58, 60, 62, 64, -1,
+ -1, 66, 68, 70, 72, 74, -1, -1,
+ 76, 78, 80, 82, 84, 86, -1, 88,
+ 90, 92, 94, 96, 98, 100, 102, 104,
+ -1, 106, 108, 110, 112, 114, 116, -1,
+ -1, 118, 120, 122, 124, 126, -1, 128,
+ 130, 132, 134, 136, 138, 140, 142, 144,
+ 146, 148, 150, 152, 154, 156, 158, 160,
+ -1, -1, 162, 164, 166, 168, 170, 172,
+ 174, 176, 178, 180, 182, 184, 186, 188,
+ 190, 192, 194, 196, 198, 200, -1, -1,
+ 202, 204, 206, 208, 210, 212, 214, 216,
+ 218, -1, 32988, 32990, 224, 226, 228, 230,
+ -1, 232, 234, 236, 238, 240, 242, 33012,
+ 33014, -1, -1, 248, 250, 252, 254, 256,
+ 258, 33028, -1, -1, 262, 264, 266, 268,
+ 270, 272, -1, -1, 274, 276, 278, 280,
+ 282, 284, 286, 288, 290, 292, 294, 296,
+ 298, 300, 302, 304, 306, 308, -1, -1,
+ 310, 312, 314, 316, 318, 320, 322, 324,
+ 326, 328, 330, 332, 334, 336, 338, 340,
+ 342, 344, 346, 348, 350, 352, 354, 33124,
+ 357, 359, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 361,
+ 363, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33133, 33135, 33137, 33139,
+ 33141, 33143, 33145, 33147, 33149, 383, 385, 387,
+ 389, 391, 393, 395, 397, 399, 401, 403,
+ 405, 407, 409, 411, 413, -1, 415, 417,
+ 419, 421, 423, 425, -1, -1, 427, 429,
+ 431, 433, 435, 437, 439, 441, 443, 445,
+ 447, 33217, 33219, 33221, 455, 457, -1, -1,
+ 459, 461, 463, 465, 467, 469, 471, 473,
+ 475, 477, 479, 481, 483, 485, 487, 489,
+ 491, 493, 495, 497, 499, 501, 503, 505,
+ 507, 509, 511, 513, 515, 517, 519, 521,
+ 523, 525, 527, 529, -1, -1, 531, 533,
+ -1, -1, -1, -1, -1, -1, 535, 537,
+ 539, 541, 543, 545, 547, 549, 551, 553,
+ 555, 557, 559, 561, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 33331, 33332, 33333, 33334, 33335, 33336, 33337, 33338,
+ 33339, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 33340, 33342, 33344, 33346, 33348, 33350, -1, -1,
+ 33352, 33353, 33354, 33355, 33356, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 589, 590, -1, 591, 592, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 594, -1, -1, -1,
+ -1, -1, 33363, -1, -1, -1, 597, -1,
+ -1, -1, -1, -1, 33366, 600, 602, 604,
+ 605, 607, 609, -1, 611, -1, 613, 615,
+ 617, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 619, 621, 623, 625, 627, 629,
+ 631, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 633, 635, 637, 639, 641, -1,
+ 33411, 33412, 33413, 646, 648, 33418, 33419, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 33420, 33421, 33422, -1, 33423, 33424, -1, -1,
+ -1, 33425, -1, -1, -1, -1, -1, -1,
+ 658, 660, -1, 662, -1, -1, -1, 664,
+ -1, -1, -1, -1, 666, 668, 670, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 672, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 674, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 676, 678, -1, 680, -1, -1, -1, 682,
+ -1, -1, -1, -1, 684, 686, 688, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 690, 692,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 694, 696, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 698, 700, 702, 704, -1, -1, 706, 708,
+ -1, -1, 710, 712, 714, 716, 718, 720,
+ -1, -1, 722, 724, 726, 728, 730, 732,
+ -1, -1, 734, 736, 738, 740, 742, 744,
+ 746, 748, 750, 752, 754, 756, -1, -1,
+ 758, 760, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 33530,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 764, 766, 768, 770, 772, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 33542, 33544, 33546,
+ 33548, -1, -1, -1, -1, -1, -1, -1,
+ 782, -1, 784, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 786, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 788, -1, -1, -1, -1, -1, -1,
+ -1, 790, -1, -1, 792, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 794, 796, 798, 800, 802, 804, 806, 808,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 810, 812, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 814, 816, -1, 818,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 820, -1, -1, 822, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 824, 826, 828, -1, -1, 830, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 832, -1, -1, 834, 836, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 838, 840, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 842, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 844, 846, 848, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 850, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 852, -1, -1, -1, -1, -1, -1, 854,
+ 856, -1, 858, 860, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 862, 864, 866, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 868, -1, 870, 872, 874, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 33644, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 33646, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33648, 33650, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33652, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 885, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 887, -1, -1,
+ -1, -1, 889, -1, -1, -1, -1, 891,
+ -1, -1, -1, -1, 893, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 895, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 897, -1, 899, 901, 33671,
+ 905, 33675, -1, -1, -1, -1, -1, -1,
+ -1, 909, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 911, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 913, -1, -1,
+ -1, -1, 915, -1, -1, -1, -1, 917,
+ -1, -1, -1, -1, 919, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 921, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 923, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33693, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 926, -1,
+ 928, -1, 930, -1, 932, -1, 934, -1,
+ -1, -1, 936, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 938, -1, 940, -1, -1,
+ 942, 944, -1, 946, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33716, 33717, 33718, -1,
+ 33719, 33720, 33721, 33722, 33723, 33724, 33725, 33726,
+ 33727, 33728, 33729, -1, 33730, 33731, 33732, 33733,
+ 33734, 33735, 33736, 33737, 33738, 33739, 33740, 33741,
+ 33742, 33743, 33744, 33745, 33746, 33747, -1, 33748,
+ 33749, 33750, 33751, 33752, 33753, 33754, 33755, 33756,
+ 33757, 33758, 33759, 33760, 33761, 33762, 33763, 33764,
+ 33765, 33766, 33767, 33768, 33769, 33770, 33771, 33772,
+ 33773, 33774, 33775, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 33776, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 33777, 33778, 33779, 33780, 33781,
+ 33782, 33783, 33784, 33785, 33786, 33787, 33788, 33789,
+ 33790, 33791, 33792, 33793, 33794, 33795, 33796, 33797,
+ 33798, 33799, 33800, 33801, 33802, 33803, 33804, 33805,
+ 33806, 33807, 33808, 33809, 33810, 33811, 33812, 33813,
+ 1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060,
+ 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076,
+ 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1092,
+ 1094, 1096, 1098, 1100, 1102, 1104, 1106, 1108,
+ 1110, 1112, 1114, 1116, 1118, 1120, 1122, 1124,
+ 1126, 1128, 1130, 1132, 1134, 1136, 1138, 1140,
+ 1142, 1144, 1146, 1148, 1150, 1152, 1154, 1156,
+ 1158, 1160, 1162, 1164, 1166, 1168, 1170, 1172,
+ 1174, 1176, 1178, 1180, 1182, 1184, 1186, 1188,
+ 1190, 1192, 1194, 1196, 1198, 1200, 1202, 1204,
+ 1206, 1208, 1210, 1212, 1214, 1216, 1218, 1220,
+ 1222, 1224, 1226, 1228, 1230, 1232, 1234, 1236,
+ 1238, 1240, 1242, 1244, 1246, 1248, 1250, 1252,
+ 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268,
+ 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1284,
+ 1286, 1288, 1290, 1292, 1294, 1296, 1298, 1300,
+ 1302, 1304, 1306, 1308, 1310, 1312, 1314, 1316,
+ 1318, 1320, 1322, 1324, 1326, 1328, 1330, 1332,
+ 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348,
+ 1350, 1352, 34122, 1356, -1, -1, -1, -1,
+ 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372,
+ 1374, 1376, 1378, 1380, 1382, 1384, 1386, 1388,
+ 1390, 1392, 1394, 1396, 1398, 1400, 1402, 1404,
+ 1406, 1408, 1410, 1412, 1414, 1416, 1418, 1420,
+ 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436,
+ 1438, 1440, 1442, 1444, 1446, 1448, 1450, 1452,
+ 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468,
+ 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484,
+ 1486, 1488, 1490, 1492, 1494, 1496, 1498, 1500,
+ 1502, 1504, 1506, 1508, 1510, 1512, 1514, 1516,
+ 1518, 1520, 1522, 1524, 1526, 1528, 1530, 1532,
+ 1534, 1536, -1, -1, -1, -1, -1, -1,
+ 1538, 1540, 1542, 1544, 1546, 1548, 1550, 1552,
+ 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568,
+ 1570, 1572, 1574, 1576, 1578, 1580, -1, -1,
+ 1582, 1584, 1586, 1588, 1590, 1592, -1, -1,
+ 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608,
+ 1610, 1612, 1614, 1616, 1618, 1620, 1622, 1624,
+ 1626, 1628, 1630, 1632, 1634, 1636, 1638, 1640,
+ 1642, 1644, 1646, 1648, 1650, 1652, 1654, 1656,
+ 1658, 1660, 1662, 1664, 1666, 1668, -1, -1,
+ 1670, 1672, 1674, 1676, 1678, 1680, -1, -1,
+ 1682, 1684, 1686, 1688, 1690, 1692, 1694, 1696,
+ -1, 1698, -1, 1700, -1, 1702, -1, 1704,
+ 1706, 1708, 1710, 1712, 1714, 1716, 1718, 1720,
+ 1722, 1724, 1726, 1728, 1730, 1732, 1734, 1736,
+ 1738, 1740, 1741, 1743, 1744, 1746, 1747, 1749,
+ 1750, 1752, 1753, 1755, 1756, 1758, -1, -1,
+ 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773,
+ 1775, 1777, 1779, 1781, 1783, 1785, 1787, 1789,
+ 1791, 1793, 1795, 1797, 1799, 1801, 1803, 1805,
+ 1807, 1809, 1811, 1813, 1815, 1817, 1819, 1821,
+ 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837,
+ 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853,
+ 1855, 1857, 1859, 1861, 1863, -1, 1865, 1867,
+ 1869, 1871, 1873, 1875, 1876, 34646, 1880, 34649,
+ 34651, 1885, 1887, 1889, 1891, -1, 1893, 1895,
+ 1897, 1899, 1900, 1902, 1903, 1905, 1907, 1909,
+ 1911, 1913, 1915, 1917, -1, -1, 1918, 1920,
+ 1922, 1924, 1926, 1928, -1, 1929, 1931, 1933,
+ 1935, 1937, 1939, 1941, 1942, 1944, 1946, 1948,
+ 1950, 1952, 1954, 1956, 1957, 1959, 1961, 1962,
+ -1, -1, 1963, 1965, 1967, -1, 1969, 1971,
+ 1973, 1975, 1976, 1978, 1979, 1981, 34750, -1,
+ 1984, 1985, 34754, 34755, 34756, 34757, 34758, 34759,
+ 34760, 34761, 34762, -1, -1, -1, -1, -1,
+ -1, 34763, -1, -1, -1, -1, -1, 34764,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 34766, 34767, 34769, -1,
+ -1, -1, -1, -1, -1, -1, -1, 34772,
+ -1, -1, -1, 34773, 34775, -1, 34778, 34780,
+ -1, -1, -1, -1, 34783, -1, 34785, -1,
+ -1, -1, -1, -1, -1, -1, -1, 34787,
+ 34789, 34791, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 34793,
+ -1, -1, -1, -1, -1, -1, -1, 34797,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 34798, 34799, -1, -1, 34800, 34801, 34802, 34803,
+ 34804, 34805, 34806, 34807, 34808, 34809, 34810, 34811,
+ 34812, 34813, 34814, 34815, 34816, 34817, 34818, 34819,
+ 34820, 34821, 34822, 34823, 34824, 34825, 34826, -1,
+ 34827, 34828, 34829, 34830, 34831, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 34832, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 34834, 34837, 34840, 34841, -1, 34843, 34846, 34849,
+ -1, 34850, 34852, 34853, 34854, 34855, 34856, 34857,
+ 34858, 34859, 34860, 34861, -1, 34862, 34863, -1,
+ -1, 34865, 34866, 34867, 34868, 34869, -1, -1,
+ 34870, 34872, 34875, -1, 34877, -1, 2110, -1,
+ 34879, -1, 2112, 2113, 34882, 34883, -1, 34884,
+ 34885, 34886, -1, 34887, 34888, 34889, 34890, 34891,
+ 34892, 34893, -1, 34894, 34897, 34898, 34899, 34900,
+ 34901, -1, -1, -1, -1, 34902, 34903, 34904,
+ 34905, 34906, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 34907, 34910, 34913, 34916, 34919,
+ 34922, 34925, 34928, 34931, 34934, 34937, 34940, 34943,
+ 34945, 34946, 34948, 34951, 34953, 34954, 34956, 34959,
+ 34963, 34965, 34966, 34968, 34971, 34972, 34973, 34974,
+ 34975, 34976, 34978, 34981, 34983, 34984, 34986, 34989,
+ 34993, 34995, 34996, 34998, 35001, 35002, 35003, 35004,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 2237, 2239, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 2241, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2243, 2245, 2247,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2249, -1, -1, -1,
+ -1, 2251, -1, -1, 2253, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2255, -1, 2257, -1,
+ -1, -1, -1, -1, 35027, 35029, -1, 35032,
+ 35034, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 2269, -1, -1, 2271, -1, -1, 2273,
+ -1, 2275, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2277, -1, 2279, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2281, 2283, 2285,
+ 2287, 2289, -1, -1, 2291, 2293, -1, -1,
+ 2295, 2297, -1, -1, -1, -1, -1, -1,
+ 2299, 2301, -1, -1, 2303, 2305, -1, -1,
+ 2307, 2309, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2311, 2313, 2315, 2317,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2319, 2321, 2323, 2325, -1, -1, -1, -1,
+ -1, -1, 2327, 2329, 2331, 2333, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 2335, 2336, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 35105, 35106, 35107, 35108, 35109, 35110, 35111, 35112,
+ 35113, 35114, 35116, 35118, 35120, 35122, 35124, 35126,
+ 35128, 35130, 35132, 35134, 35136, 35139, 35142, 35145,
+ 35148, 35151, 35154, 35157, 35160, 35163, 35167, 35171,
+ 35175, 35179, 35183, 35187, 35191, 35195, 35199, 35203,
+ 35207, 35209, 35211, 35213, 35215, 35217, 35219, 35221,
+ 35223, 35225, 35228, 35231, 35234, 35237, 35240, 35243,
+ 35246, 35249, 35252, 35255, 35258, 35261, 35264, 35267,
+ 35270, 35273, 35276, 35279, 35282, 35285, 35288, 35291,
+ 35294, 35297, 35300, 35303, 35306, 35309, 35312, 35315,
+ 35318, 35321, 35324, 35327, 35330, 35333, 35336, 35337,
+ 35338, 35339, 35340, 35341, 35342, 35343, 35344, 35345,
+ 35346, 35347, 35348, 35349, 35350, 35351, 35352, 35353,
+ 35354, 35355, 35356, 35357, 35358, 35359, 35360, 35361,
+ 35362, 35363, 35364, 35365, 35366, 35367, 35368, 35369,
+ 35370, 35371, 35372, 35373, 35374, 35375, 35376, 35377,
+ 35378, 35379, 35380, 35381, 35382, 35383, 35384, 35385,
+ 35386, 35387, 35388, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 35389, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 35393, 35396, 35398, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2633, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 35403, 35404, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 35405,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 35406,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 35407, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 35408, 35409, 35410, 35411, 35412, 35413, 35414, 35415,
+ 35416, 35417, 35418, 35419, 35420, 35421, 35422, 35423,
+ 35424, 35425, 35426, 35427, 35428, 35429, 35430, 35431,
+ 35432, 35433, 35434, 35435, 35436, 35437, 35438, 35439,
+ 35440, 35441, 35442, 35443, 35444, 35445, 35446, 35447,
+ 35448, 35449, 35450, 35451, 35452, 35453, 35454, 35455,
+ 35456, 35457, 35458, 35459, 35460, 35461, 35462, 35463,
+ 35464, 35465, 35466, 35467, 35468, 35469, 35470, 35471,
+ 35472, 35473, 35474, 35475, 35476, 35477, 35478, 35479,
+ 35480, 35481, 35482, 35483, 35484, 35485, 35486, 35487,
+ 35488, 35489, 35490, 35491, 35492, 35493, 35494, 35495,
+ 35496, 35497, 35498, 35499, 35500, 35501, 35502, 35503,
+ 35504, 35505, 35506, 35507, 35508, 35509, 35510, 35511,
+ 35512, 35513, 35514, 35515, 35516, 35517, 35518, 35519,
+ 35520, 35521, 35522, 35523, 35524, 35525, 35526, 35527,
+ 35528, 35529, 35530, 35531, 35532, 35533, 35534, 35535,
+ 35536, 35537, 35538, 35539, 35540, 35541, 35542, 35543,
+ 35544, 35545, 35546, 35547, 35548, 35549, 35550, 35551,
+ 35552, 35553, 35554, 35555, 35556, 35557, 35558, 35559,
+ 35560, 35561, 35562, 35563, 35564, 35565, 35566, 35567,
+ 35568, 35569, 35570, 35571, 35572, 35573, 35574, 35575,
+ 35576, 35577, 35578, 35579, 35580, 35581, 35582, 35583,
+ 35584, 35585, 35586, 35587, 35588, 35589, 35590, 35591,
+ 35592, 35593, 35594, 35595, 35596, 35597, 35598, 35599,
+ 35600, 35601, 35602, 35603, 35604, 35605, 35606, 35607,
+ 35608, 35609, 35610, 35611, 35612, 35613, 35614, 35615,
+ 35616, 35617, 35618, 35619, 35620, 35621, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 35622, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 35623, -1,
+ 35624, 35625, 35626, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2859, -1, 2861, -1,
+ 2863, -1, 2865, -1, 2867, -1, 2869, -1,
+ 2871, -1, 2873, -1, 2875, -1, 2877, -1,
+ 2879, -1, 2881, -1, -1, 2883, -1, 2885,
+ -1, 2887, -1, -1, -1, -1, -1, -1,
+ 2889, 2891, -1, 2893, 2895, -1, 2897, 2899,
+ -1, 2901, 2903, -1, 2905, 2907, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2909, -1, -1, -1,
+ -1, -1, -1, 35679, 35681, -1, 2915, 35685,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2919, -1, 2921, -1,
+ 2923, -1, 2925, -1, 2927, -1, 2929, -1,
+ 2931, -1, 2933, -1, 2935, -1, 2937, -1,
+ 2939, -1, 2941, -1, -1, 2943, -1, 2945,
+ -1, 2947, -1, -1, -1, -1, -1, -1,
+ 2949, 2951, -1, 2953, 2955, -1, 2957, 2959,
+ -1, 2961, 2963, -1, 2965, 2967, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2969, -1, -1, 2971,
+ 2973, 2975, 2977, -1, -1, -1, 2979, 35749,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 35751, 35752, 35753, 35754, 35755, 35756, 35757,
+ 35758, 35759, 35760, 35761, 35762, 35763, 35764, 35765,
+ 35766, 35767, 35768, 35769, 35770, 35771, 35772, 35773,
+ 35774, 35775, 35776, 35777, 35778, 35779, 35780, 35781,
+ 35782, 35783, 35784, 35785, 35786, 35787, 35788, 35789,
+ 35790, 35791, 35792, 35793, 35794, 35795, 35796, 35797,
+ 35798, 35799, 35800, 35801, 35802, 35803, 35804, 35805,
+ 35806, 35807, 35808, 35809, 35810, 35811, 35812, 35813,
+ 35814, 35815, 35816, 35817, 35818, 35819, 35820, 35821,
+ 35822, 35823, 35824, 35825, 35826, 35827, 35828, 35829,
+ 35830, 35831, 35832, 35833, 35834, 35835, 35836, 35837,
+ 35838, 35839, 35840, 35841, 35842, 35843, 35844, -1,
+ -1, -1, 35845, 35846, 35847, 35848, 35849, 35850,
+ 35851, 35852, 35853, 35854, 35855, 35856, 35857, 35858,
+ 35859, 35862, 35865, 35868, 35871, 35874, 35877, 35880,
+ 35883, 35886, 35889, 35892, 35895, 35898, 35901, 35905,
+ 35909, 35913, 35917, 35921, 35925, 35929, 35933, 35937,
+ 35941, 35945, 35949, 35953, 35957, 35961, 35968, -1,
+ 35974, 35977, 35980, 35983, 35986, 35989, 35992, 35995,
+ 35998, 36001, 36004, 36007, 36010, 36013, 36016, 36019,
+ 36022, 36025, 36028, 36031, 36034, 36037, 36040, 36043,
+ 36046, 36049, 36052, 36055, 36058, 36061, 36064, 36067,
+ 36070, 36073, 36076, 36079, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 36082, 36085, 36087, 36089, 36091, 36093, 36095, 36097,
+ 36099, 36101, 36103, 36105, 36107, 36109, 36111, 36113,
+ 36115, 36116, 36117, 36118, 36119, 36120, 36121, 36122,
+ 36123, 36124, 36125, 36126, 36127, 36128, 36129, 36131,
+ 36133, 36135, 36137, 36139, 36141, 36143, 36145, 36147,
+ 36149, 36151, 36153, 36155, 36157, 36162, 36166, -1,
+ 36168, 36169, 36170, 36171, 36172, 36173, 36174, 36175,
+ 36176, 36177, 36178, 36179, 36180, 36181, 36182, 36183,
+ 36184, 36185, 36186, 36187, 36188, 36189, 36190, 36191,
+ 36192, 36193, 36194, 36195, 36196, 36197, 36198, 36199,
+ 36200, 36201, 36202, 36203, 36204, 36205, 36206, 36207,
+ 36208, 36209, 36210, 36211, 36212, 36213, 36214, 36215,
+ 36216, 36217, 36219, 36221, 36223, 36225, 36227, 36229,
+ 36231, 36233, 36235, 36237, 36239, 36241, 36243, 36245,
+ 36247, 36249, 36251, 36253, 36255, 36257, 36259, 36261,
+ 36263, 36265, 36268, 36271, 36274, 36276, 36279, 36281,
+ 36284, 36285, 36286, 36287, 36288, 36289, 36290, 36291,
+ 36292, 36293, 36294, 36295, 36296, 36297, 36298, 36299,
+ 36300, 36301, 36302, 36303, 36304, 36305, 36306, 36307,
+ 36308, 36309, 36310, 36311, 36312, 36313, 36314, 36315,
+ 36316, 36317, 36318, 36319, 36320, 36321, 36322, 36323,
+ 36324, 36325, 36326, 36327, 36328, 36329, 36330, -1,
+ 36331, 36335, 36339, 36343, 36346, 36350, 36353, 36356,
+ 36361, 36365, 36368, 36371, 36374, 36378, 36382, 36385,
+ 36388, 36390, 36393, 36397, 36401, 36403, 36408, 36414,
+ 36419, 36422, 36427, 36432, 36436, 36439, 36442, 36445,
+ 36449, 36454, 36458, 36461, 36464, 36467, 36469, 36471,
+ 36473, 36475, 36478, 36481, 36486, 36489, 36493, 36498,
+ 36501, 36503, 36505, 36510, 36514, 36519, 36522, 36527,
+ 36529, 36532, 36535, 36538, 36541, 36544, 36548, 36551,
+ 36553, 36556, 36559, 36562, 36566, 36569, 36572, 36575,
+ 36580, 36584, 36586, 36591, 36593, 36597, 36601, 36604,
+ 36607, 36610, 36614, 36616, 36619, 36623, 36625, 36630,
+ 36633, 36635, 36637, 36639, 36641, 36643, 36645, 36647,
+ 36649, 36651, 36653, 36656, 36659, 36662, 36665, 36668,
+ 36671, 36674, 36677, 36680, 36683, 36686, 36689, 36692,
+ 36695, 36698, 36701, 36703, 36705, 36708, 36710, 36712,
+ 36714, 36717, 36720, 36722, 36724, 36726, 36728, 36730,
+ 36734, 36736, 36738, 36740, 36742, 36744, 36746, 36748,
+ 36750, 36753, 36757, 36759, 36761, 36763, 36765, 36767,
+ 36769, 36771, 36774, 36777, 36780, 36783, 36785, 36787,
+ 36789, 36791, 36793, 36795, 36797, 36799, 36801, 36803,
+ 36806, 36809, 36811, 36814, 36817, 36820, 36822, 36825,
+ 36828, 36832, 36834, 36837, 36840, 36843, 36846, 36851,
+ 36857, 36859, 36861, 36863, 36865, 36867, 36869, 36871,
+ 36873, 36875, 36877, 36879, 36881, 36883, 36885, 36887,
+ 36889, 36891, 36893, 36897, 36899, 36901, 36903, 36907,
+ 36910, 36912, 36914, 36916, 36918, 36920, 36922, 36924,
+ 36926, 36928, 36930, 36933, 36935, 36937, 36940, 36943,
+ 36945, 36949, 36952, 36954, 36956, 36958, 36960, 36963,
+ 36966, 36968, 36970, 36972, 36974, 36976, 36978, 36980,
+ 36982, 36984, 36987, 36990, 36993, 36996, 36999, 37002,
+ 37005, 37008, 37011, 37014, 37017, 37020, 37023, 37026,
+ 37029, 37032, 37035, 37038, 37041, 37044, 37047, 37050,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 37053, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293,
+ 4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301,
+ 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309,
+ 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317,
+ 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325,
+ 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333,
+ 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341,
+ 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349,
+ 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357,
+ 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365,
+ 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373,
+ 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381,
+ 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389,
+ 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397,
+ 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405,
+ 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413,
+ 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421,
+ 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429,
+ 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437,
+ 4438, 4439, 4440, 4441, 4442, 4443, 4444, 4445,
+ 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453,
+ 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461,
+ 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469,
+ 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477,
+ 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485,
+ 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493,
+ 4494, 4495, 4496, 4497, 4498, 4499, 4500, 4501,
+ 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509,
+ 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517,
+ 4518, 4519, 4520, 4521, 4522, 4523, 4524, 4525,
+ 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533,
+ 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541,
+ 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4549,
+ 4550, 4551, 4552, 4553, 4554, 4555, -1, -1,
+ 4556, -1, 4557, -1, -1, 4558, 4559, 4560,
+ 4561, 4562, 4563, 4564, 4565, 4566, 4567, -1,
+ 4568, -1, 4569, -1, -1, 4570, 4571, -1,
+ -1, -1, 4572, 4573, 4574, 4575, -1, -1,
+ 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583,
+ 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591,
+ 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599,
+ 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607,
+ 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615,
+ 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623,
+ 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631,
+ 4632, 4633, 4634, -1, -1, -1, -1, -1,
+ 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642,
+ 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650,
+ 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658,
+ 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666,
+ 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674,
+ 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682,
+ 4683, 4684, 4685, 4686, 4687, 4688, 4689, 4690,
+ 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698,
+ 4699, 4700, 4701, 4702, 4703, 4704, 4705, 4706,
+ 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714,
+ 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722,
+ 4723, 4724, 4725, 4726, 4727, 4728, 4729, 4730,
+ 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738,
+ 4739, 4740, -1, -1, -1, -1, -1, -1,
+ 37509, 37511, 37513, 37515, 37518, 37521, 37523, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 37525, 37527, 37529, 37531, 37533,
+ -1, -1, -1, -1, -1, 4767, -1, 4769,
+ 37539, 37540, 37541, 37542, 37543, 37544, 37545, 37546,
+ 37547, 37548, 4781, 4783, 4785, 4787, 4789, 4791,
+ 4793, 4795, 4797, 4799, 4801, 4803, 4805, -1,
+ 4807, 4809, 4811, 4813, 4815, -1, 4817, -1,
+ 4819, 4821, -1, 4823, 4825, -1, 4827, 4829,
+ 4831, 4833, 4835, 4837, 4839, 4841, 4843, 37613,
+ 37615, 37616, 37617, 37618, 37619, 37620, 37621, 37622,
+ 37623, 37624, 37625, 37626, 37627, 37628, 37629, 37630,
+ 37631, 37632, 37633, 37634, 37635, 37636, 37637, 37638,
+ 37639, 37640, 37641, 37642, 37643, 37644, 37645, 37646,
+ 37647, 37648, 37649, 37650, 37651, 37652, 37653, 37654,
+ 37655, 37656, 37657, 37658, 37659, 37660, 37661, 37662,
+ 37663, 37664, 37665, 37666, 37667, 37668, 37669, 37670,
+ 37671, 37672, 37673, 37674, 37675, 37676, 37677, 37678,
+ 37679, 37680, 37681, 37682, 37683, 37684, 37685, 37686,
+ 37687, 37688, 37689, 37690, 37691, 37692, 37693, 37694,
+ 37695, 37696, 37697, 37698, 37699, 37700, 37701, 37702,
+ 37703, 37704, 37705, 37706, 37707, 37708, 37709, 37710,
+ 37711, 37712, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 37713, 37714, 37715, 37716, 37717,
+ 37718, 37719, 37720, 37721, 37722, 37723, 37724, 37725,
+ 37726, 37727, 37728, 37729, 37730, 37731, 37732, 37733,
+ 37734, 37735, 37736, 37738, 37740, 37742, 37744, 37746,
+ 37748, 37750, 37752, 37754, 37756, 37758, 37760, 37762,
+ 37764, 37766, 37768, 37770, 37772, 37773, 37774, 37775,
+ 37776, 37778, 37780, 37782, 37784, 37786, 37788, 37790,
+ 37792, 37794, 37796, 37798, 37800, 37802, 37804, 37806,
+ 37808, 37810, 37812, 37814, 37816, 37818, 37820, 37822,
+ 37824, 37826, 37828, 37830, 37832, 37834, 37836, 37838,
+ 37840, 37842, 37844, 37846, 37848, 37850, 37852, 37854,
+ 37856, 37858, 37860, 37862, 37864, 37866, 37868, 37870,
+ 37872, 37874, 37876, 37878, 37880, 37882, 37884, 37886,
+ 37888, 37890, 37892, 37894, 37896, 37898, 37900, 37902,
+ 37904, 37906, 37908, 37910, 37912, 37914, 37916, 37918,
+ 37920, 37922, 37924, 37926, 37928, 37930, 37932, 37934,
+ 37936, 37938, 37940, 37942, 37944, 37946, 37948, 37950,
+ 37952, 37954, 37956, 37958, 37960, 37962, 37964, 37967,
+ 37970, 37973, 37976, 37979, 37982, 37984, 37986, 37988,
+ 37990, 37992, 37994, 37996, 37998, 38000, 38002, 38004,
+ 38006, 38008, 38010, 38012, 38014, 38016, 38018, 38020,
+ 38022, 38024, 38026, 38028, 38030, 38032, 38034, 38036,
+ 38038, 38040, 38042, 38044, 38046, 38048, 38050, 38052,
+ 38054, 38056, 38058, 38060, 38062, 38064, 38066, 38068,
+ 38070, 38072, 38074, 38076, 38078, 38080, 38082, 38084,
+ 38086, 38088, 38090, 38092, 38094, 38096, 38098, 38100,
+ 38102, 38104, 38106, 38108, 38110, 38112, 38114, 38116,
+ 38118, 38120, 38122, 38124, 38126, 38128, 38130, 38132,
+ 38134, 38136, 38138, 38140, 38142, 38144, 38146, 38148,
+ 38150, 38152, 38154, 38156, 38158, 38160, 38162, 38164,
+ 38166, 38168, 38170, 38172, 38174, 38176, 38178, 38180,
+ 38182, 38184, 38186, 38188, 38190, 38192, 38194, 38196,
+ 38198, 38200, 38202, 38204, 38206, 38208, 38210, 38212,
+ 38214, 38216, 38218, 38220, 38222, 38224, 38226, 38228,
+ 38230, 38232, 38234, 38236, 38238, 38240, 38242, 38244,
+ 38246, 38248, 38250, 38252, 38254, 38256, 38258, 38260,
+ 38262, 38264, 38266, 38269, 38272, 38275, 38277, 38279,
+ 38281, 38283, 38285, 38287, 38289, 38291, 38293, 38295,
+ 38297, 38299, 38301, 38303, 38305, 38307, 38309, 38311,
+ 38313, 38315, 38317, 38319, 38321, 38323, 38325, 38327,
+ 38329, 38331, 38333, 38335, 38337, 38339, 38341, 38343,
+ 38345, 38347, 38349, 38351, 38353, 38355, 38357, 38359,
+ 38361, 38363, 38365, 38367, 38369, 38371, 38373, 38375,
+ 38377, 38379, 38381, 38383, 38385, 38387, 38389, 38391,
+ 38393, 38395, 38397, 38399, 38401, 38403, 38405, 38407,
+ 38409, 38411, 38413, 38415, 38417, 38419, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 38421, 38424, 38427, 38430, 38433, 38436, 38439, 38442,
+ 38445, 38448, 38451, 38454, 38457, 38460, 38463, 38466,
+ 38469, 38472, 38475, 38478, 38481, 38484, 38487, 38490,
+ 38493, 38496, 38499, 38502, 38505, 38508, 38511, 38514,
+ 38517, 38520, 38523, 38526, 38529, 38532, 38535, 38538,
+ 38541, 38544, 38547, 38550, 38553, 38556, 38559, 38562,
+ 38565, 38568, 38571, 38574, 38577, 38580, 38583, 38586,
+ 38589, 38592, 38595, 38598, 38601, 38604, 38607, 38610,
+ -1, -1, 38613, 38616, 38619, 38622, 38625, 38628,
+ 38631, 38634, 38637, 38640, 38643, 38646, 38649, 38652,
+ 38655, 38658, 38661, 38664, 38667, 38670, 38673, 38676,
+ 38679, 38682, 38685, 38688, 38691, 38694, 38697, 38700,
+ 38703, 38706, 38709, 38712, 38715, 38718, 38721, 38724,
+ 38727, 38730, 38733, 38736, 38739, 38742, 38745, 38748,
+ 38751, 38754, 38757, 38760, 38763, 38766, 38769, 38772,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 38775, 38778, 38781, 38785, 38789, 38793, 38797, 38801,
+ 38805, 38809, 38812, 38830, 38838, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 38842, 38843, 38844, 38845, 38846, 38847, 38848, 38849,
+ 38850, 38851, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 38852, 38853, 38854, 38855, 38856, 38857, 38858, 38859,
+ 38860, 38861, 38862, 38863, 38864, 38865, 38866, 38867,
+ 38868, 38869, 38870, 38871, 38872, -1, -1, 38873,
+ 38874, 38875, 38876, 38877, 38878, 38879, 38880, 38881,
+ 38882, 38883, 38884, -1, 38885, 38886, 38887, 38888,
+ 38889, 38890, 38891, 38892, 38893, 38894, 38895, 38896,
+ 38897, 38898, 38899, 38900, 38901, 38902, 38903, -1,
+ 38904, 38905, 38906, 38907, -1, -1, -1, -1,
+ 38908, 38910, 38912, -1, 38914, -1, 38916, 38918,
+ 38920, 38922, 38924, 38926, 38928, 38930, 38932, 38934,
+ 38936, 38937, 38938, 38939, 38940, 38941, 38942, 38943,
+ 38944, 38945, 38946, 38947, 38948, 38949, 38950, 38951,
+ 38952, 38953, 38954, 38955, 38956, 38957, 38958, 38959,
+ 38960, 38961, 38962, 38963, 38964, 38965, 38966, 38967,
+ 38968, 38969, 38970, 38971, 38972, 38973, 38974, 38975,
+ 38976, 38977, 38978, 38979, 38980, 38981, 38982, 38983,
+ 38984, 38985, 38986, 38987, 38988, 38989, 38990, 38991,
+ 38992, 38993, 38994, 38995, 38996, 38997, 38998, 38999,
+ 39000, 39001, 39002, 39003, 39004, 39005, 39006, 39007,
+ 39008, 39009, 39010, 39011, 39012, 39013, 39014, 39015,
+ 39016, 39017, 39018, 39019, 39020, 39021, 39022, 39023,
+ 39024, 39025, 39026, 39027, 39028, 39029, 39030, 39031,
+ 39032, 39033, 39034, 39035, 39036, 39037, 39038, 39039,
+ 39040, 39041, 39042, 39043, 39044, 39045, 39046, 39047,
+ 39048, 39049, 39050, 39051, 39052, 39053, 39055, 39057,
+ 39059, 39061, 39063, 39065, 39067, -1, -1, -1,
+ -1, 39069, 39070, 39071, 39072, 39073, 39074, 39075,
+ 39076, 39077, 39078, 39079, 39080, 39081, 39082, 39083,
+ 39084, 39085, 39086, 39087, 39088, 39089, 39090, 39091,
+ 39092, 39093, 39094, 39095, 39096, 39097, 39098, 39099,
+ 39100, 39101, 39102, 39103, 39104, 39105, 39106, 39107,
+ 39108, 39109, 39110, 39111, 39112, 39113, 39114, 39115,
+ 39116, 39117, 39118, 39119, 39120, 39121, 39122, 39123,
+ 39124, 39125, 39126, 39127, 39128, 39129, 39130, 39131,
+ 39132, 39133, 39134, 39135, 39136, 39137, 39138, 39139,
+ 39140, 39141, 39142, 39143, 39144, 39145, 39146, 39147,
+ 39148, 39149, 39150, 39151, 39152, 39153, 39154, 39155,
+ 39156, 39157, 39158, 39159, 39160, 39161, 39162, 39163,
+ 39164, 39165, 39166, 39167, 39168, 39169, 39170, 39171,
+ 39172, 39173, 39174, 39175, 39176, 39177, 39178, 39179,
+ 39180, 39181, 39182, 39183, 39184, 39185, 39186, 39187,
+ 39188, 39189, 39190, 39191, 39192, 39193, 39194, 39195,
+ 39196, 39197, 39198, 39199, 39200, 39201, 39202, 39203,
+ 39204, 39205, 39206, 39207, 39208, 39209, 39210, 39211,
+ 39212, 39213, 39214, 39215, 39216, 39217, 39218, 39219,
+ 39220, 39221, 39222, 39223, 39224, 39225, 39226, 39227,
+ 39228, 39229, 39230, 39231, 39232, 39233, 39234, 39235,
+ 39236, 39237, 39238, 39239, 39240, 39241, 39242, 39243,
+ 39244, 39245, 39246, 39247, 39248, 39249, 39250, 39251,
+ 39252, 39253, 39254, 39255, 39256, 39257, 39258, -1,
+ -1, -1, 39259, 39260, 39261, 39262, 39263, 39264,
+ -1, -1, 39265, 39266, 39267, 39268, 39269, 39270,
+ -1, -1, 39271, 39272, 39273, 39274, 39275, 39276,
+ -1, -1, 39277, 39278, 39279, -1, -1, -1,
+ 39280, 39281, 39282, 39283, 39284, 39285, 39286, -1,
+ 39287, 39288, 39289, 39290, 39291, 39292, 39293, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 6526, 6528,
+ 6530, 6532, 6534, 6536, 6538, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6540, 6542, 6544, 6546, 6548,
+ 6550, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 39320, 39321, 39322, 39323, 39324, 39325, 39326, 39327,
+ 39328, 39329, 39330, 39331, 39332, 39333, 39334, 39335,
+ 39336, 39337, 39338, 39339, 39340, 39341, 39342, 39343,
+ 39344, 39345, 39346, 39347, 39348, 39349, 39350, 39351,
+ 39352, 39353, 39354, 39355, 39356, 39357, 39358, 39359,
+ 39360, 39361, 39362, 39363, 39364, 39365, 39366, 39367,
+ 39368, 39369, 39370, 39371, 39372, 39373, 39374, 39375,
+ 39376, 39377, 39378, 39379, 39380, 39381, 39382, 39383,
+ 39384, 39385, 39386, 39387, 39388, 39389, 39390, 39391,
+ 39392, 39393, 39394, 39395, 39396, 39397, 39398, 39399,
+ 39400, 39401, 39402, 39403, 39404, -1, 39405, 39406,
+ 39407, 39408, 39409, 39410, 39411, 39412, 39413, 39414,
+ 39415, 39416, 39417, 39418, 39419, 39420, 39421, 39422,
+ 39423, 39424, 39425, 39426, 39427, 39428, 39429, 39430,
+ 39431, 39432, 39433, 39434, 39435, 39436, 39437, 39438,
+ 39439, 39440, 39441, 39442, 39443, 39444, 39445, 39446,
+ 39447, 39448, 39449, 39450, 39451, 39452, 39453, 39454,
+ 39455, 39456, 39457, 39458, 39459, 39460, 39461, 39462,
+ 39463, 39464, 39465, 39466, 39467, 39468, 39469, 39470,
+ 39471, 39472, 39473, 39474, 39475, -1, 39476, 39477,
+ -1, -1, 39478, -1, -1, 39479, 39480, -1,
+ -1, 39481, 39482, 39483, 39484, -1, 39485, 39486,
+ 39487, 39488, 39489, 39490, 39491, 39492, 39493, 39494,
+ 39495, 39496, -1, 39497, -1, 39498, 39499, 39500,
+ 39501, 39502, 39503, 39504, -1, 39505, 39506, 39507,
+ 39508, 39509, 39510, 39511, 39512, 39513, 39514, 39515,
+ 39516, 39517, 39518, 39519, 39520, 39521, 39522, 39523,
+ 39524, 39525, 39526, 39527, 39528, 39529, 39530, 39531,
+ 39532, 39533, 39534, 39535, 39536, 39537, 39538, 39539,
+ 39540, 39541, 39542, 39543, 39544, 39545, 39546, 39547,
+ 39548, 39549, 39550, 39551, 39552, 39553, 39554, 39555,
+ 39556, 39557, 39558, 39559, 39560, 39561, 39562, 39563,
+ 39564, 39565, 39566, 39567, 39568, 39569, -1, 39570,
+ 39571, 39572, 39573, -1, -1, 39574, 39575, 39576,
+ 39577, 39578, 39579, 39580, 39581, -1, 39582, 39583,
+ 39584, 39585, 39586, 39587, 39588, -1, 39589, 39590,
+ 39591, 39592, 39593, 39594, 39595, 39596, 39597, 39598,
+ 39599, 39600, 39601, 39602, 39603, 39604, 39605, 39606,
+ 39607, 39608, 39609, 39610, 39611, 39612, 39613, 39614,
+ 39615, 39616, -1, 39617, 39618, 39619, 39620, -1,
+ 39621, 39622, 39623, 39624, 39625, -1, 39626, -1,
+ -1, -1, 39627, 39628, 39629, 39630, 39631, 39632,
+ 39633, -1, 39634, 39635, 39636, 39637, 39638, 39639,
+ 39640, 39641, 39642, 39643, 39644, 39645, 39646, 39647,
+ 39648, 39649, 39650, 39651, 39652, 39653, 39654, 39655,
+ 39656, 39657, 39658, 39659, 39660, 39661, 39662, 39663,
+ 39664, 39665, 39666, 39667, 39668, 39669, 39670, 39671,
+ 39672, 39673, 39674, 39675, 39676, 39677, 39678, 39679,
+ 39680, 39681, 39682, 39683, 39684, 39685, 39686, 39687,
+ 39688, 39689, 39690, 39691, 39692, 39693, 39694, 39695,
+ 39696, 39697, 39698, 39699, 39700, 39701, 39702, 39703,
+ 39704, 39705, 39706, 39707, 39708, 39709, 39710, 39711,
+ 39712, 39713, 39714, 39715, 39716, 39717, 39718, 39719,
+ 39720, 39721, 39722, 39723, 39724, 39725, 39726, 39727,
+ 39728, 39729, 39730, 39731, 39732, 39733, 39734, 39735,
+ 39736, 39737, 39738, 39739, 39740, 39741, 39742, 39743,
+ 39744, 39745, 39746, 39747, 39748, 39749, 39750, 39751,
+ 39752, 39753, 39754, 39755, 39756, 39757, 39758, 39759,
+ 39760, 39761, 39762, 39763, 39764, 39765, 39766, 39767,
+ 39768, 39769, 39770, 39771, 39772, 39773, 39774, 39775,
+ 39776, 39777, 39778, 39779, 39780, 39781, 39782, 39783,
+ 39784, 39785, 39786, 39787, 39788, 39789, 39790, 39791,
+ 39792, 39793, 39794, 39795, 39796, 39797, 39798, 39799,
+ 39800, 39801, 39802, 39803, 39804, 39805, 39806, 39807,
+ 39808, 39809, 39810, 39811, 39812, 39813, 39814, 39815,
+ 39816, 39817, 39818, 39819, 39820, 39821, 39822, 39823,
+ 39824, 39825, 39826, 39827, 39828, 39829, 39830, 39831,
+ 39832, 39833, 39834, 39835, 39836, 39837, 39838, 39839,
+ 39840, 39841, 39842, 39843, 39844, 39845, 39846, 39847,
+ 39848, 39849, 39850, 39851, 39852, 39853, 39854, 39855,
+ 39856, 39857, 39858, 39859, 39860, 39861, 39862, 39863,
+ 39864, 39865, 39866, 39867, 39868, 39869, 39870, 39871,
+ 39872, 39873, 39874, 39875, 39876, 39877, 39878, 39879,
+ 39880, 39881, 39882, 39883, 39884, 39885, 39886, 39887,
+ 39888, 39889, 39890, 39891, 39892, 39893, 39894, 39895,
+ 39896, 39897, 39898, 39899, 39900, 39901, 39902, 39903,
+ 39904, 39905, 39906, 39907, 39908, 39909, 39910, 39911,
+ 39912, 39913, 39914, 39915, 39916, 39917, 39918, 39919,
+ 39920, 39921, 39922, 39923, 39924, 39925, 39926, 39927,
+ 39928, 39929, 39930, 39931, 39932, 39933, 39934, 39935,
+ 39936, 39937, 39938, 39939, 39940, 39941, 39942, 39943,
+ 39944, 39945, 39946, 39947, 39948, 39949, 39950, 39951,
+ 39952, 39953, 39954, 39955, 39956, 39957, 39958, 39959,
+ 39960, 39961, 39962, 39963, 39964, 39965, 39966, 39967,
+ 39968, 39969, 39970, 39971, 39972, 39973, -1, -1,
+ 39974, 39975, 39976, 39977, 39978, 39979, 39980, 39981,
+ 39982, 39983, 39984, 39985, 39986, 39987, 39988, 39989,
+ 39990, 39991, 39992, 39993, 39994, 39995, 39996, 39997,
+ 39998, 39999, 40000, 40001, 40002, 40003, 40004, 40005,
+ 40006, 40007, 40008, 40009, 40010, 40011, 40012, 40013,
+ 40014, 40015, 40016, 40017, 40018, 40019, 40020, 40021,
+ 40022, 40023, 40024, 40025, 40026, 40027, 40028, 40029,
+ 40030, 40031, 40032, 40033, 40034, 40035, 40036, 40037,
+ 40038, 40039, 40040, 40041, 40042, 40043, 40044, 40045,
+ 40046, 40047, 40048, 40049, 40050, 40051, 40052, 40053,
+ 40054, 40055, 40056, 40057, 40058, 40059, 40060, 40061,
+ 40062, 40063, 40064, 40065, 40066, 40067, 40068, 40069,
+ 40070, 40071, 40072, 40073, 40074, 40075, 40076, 40077,
+ 40078, 40079, 40080, 40081, 40082, 40083, 40084, 40085,
+ 40086, 40087, 40088, 40089, 40090, 40091, 40092, 40093,
+ 40094, 40095, 40096, 40097, 40098, 40099, 40100, 40101,
+ 40102, 40103, 40104, 40105, 40106, 40107, 40108, 40109,
+ 40110, 40111, 40112, 40113, 40114, 40115, 40116, 40117,
+ 40118, 40119, 40120, 40121, 40122, 40123, 40124, 40125,
+ 40126, 40127, 40128, 40129, 40130, 40131, 40132, 40133,
+ 40134, 40135, 40136, 40137, 40138, 40139, 40140, 40141,
+ 40142, 40143, 40144, 40145, 40146, 40147, 40148, 40149,
+ 40150, 40151, 40152, 40153, 40154, 40155, 40156, 40157,
+ 40158, 40159, 40160, 40161, 40162, 40163, 40164, 40165,
+ 40166, 40167, 40168, 40169, 40170, 40171, 40172, 40173,
+ 40174, 40175, 40176, 40177, 40178, 40179, 40180, 40181,
+ 40182, 40183, 40184, 40185, 40186, 40187, 40188, 40189,
+ 40190, 40191, 40192, 40193, 40194, 40195, 40196, 40197,
+ 40198, 40199, 40200, 40201, 40202, 40203, 40204, 40205,
+ 40206, 40207, 40208, 40209, 40210, 40211, 40212, 40213,
+ 40214, 40215, 40216, 40217, 40218, 40219, 40220, 40221,
+ 40222, 40223, 40224, 40225, 40226, 40227, 40228, 40229,
+ 40230, 40231, 40232, 40233, 40234, 40235, 40236, 40237,
+ 40238, 40239, 40240, 40241, 40242, 40243, 40244, 40245,
+ 40246, 40247, 40248, 40249, 40250, 40251, 40252, 40253,
+ 40254, 40255, 40256, 40257, 40258, 40259, 40260, 40261,
+ 40262, 40263, 40264, 40265, -1, -1, 40266, 40267,
+ 40268, 40269, 40270, 40271, 40272, 40273, 40274, 40275,
+ 40276, 40277, 40278, 40279, 40280, 40281, 40282, 40283,
+ 40284, 40285, 40286, 40287, 40288, 40289, 40290, 40291,
+ 40292, 40293, 40294, 40295, 40296, 40297, 40298, 40299,
+ 40300, 40301, 40302, 40303, 40304, 40305, 40306, 40307,
+ 40308, 40309, 40310, 40311, 40312, 40313, 40314, 40315,
+ 7548, 7549, 7550, 7551, 7552, 7553, 7554, 7555,
+ 7556, 7557, 7558, 7559, 7560, 7561, 7562, 7563,
+ 7564, 7565, 7566, 7567, 7568, 7569, 7570, 7571,
+ 7572, 7573, 7574, 7575, 7576, 7577, 7578, 7579,
+ 7580, 7581, 7582, 7583, 7584, 7585, 7586, 7587,
+ 7588, 7589, 7590, 7591, 7592, 7593, 7594, 7595,
+ 7596, 7597, 7598, 7599, 7600, 7601, 7602, 7603,
+ 7604, 7605, 7606, 7607, 7608, 7609, 7610, 7611,
+ 7612, 7613, 7614, 7615, 7616, 7617, 7618, 7619,
+ 7620, 7621, 7622, 7623, 7624, 7625, 7626, 7627,
+ 7628, 7629, 7630, 7631, 7632, 7633, 7634, 7635,
+ 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643,
+ 7644, 7645, 7646, 7647, 7648, 7649, 7650, 7651,
+ 7652, 7653, 7654, 7655, 7656, 7657, 7658, 7659,
+ 7660, 7661, 7662, 7663, 7664, 7665, 7666, 7667,
+ 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7675,
+ 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7683,
+ 7684, 7685, 7686, 7687, 7688, 7689, 7690, 7691,
+ 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699,
+ 7700, 7701, 7702, 7703, 7704, 7705, 7706, 7707,
+ 7708, 7709, 7710, 7711, 7712, 7713, 7714, 7715,
+ 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723,
+ 7724, 7725, 7726, 7727, 7728, 7729, 7730, 7731,
+ 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739,
+ 7740, 7741, 7742, 7743, 7744, 7745, 7746, 7747,
+ 7748, 7749, 7750, 7751, 7752, 7753, 7754, 7755,
+ 7756, 7757, 7758, 7759, 7760, 7761, 7762, 7763,
+ 7764, 7765, 7766, 7767, 7768, 7769, 7770, 7771,
+ 7772, 7773, 7774, 7775, 7776, 7777, 7778, 7779,
+ 7780, 7781, 7782, 7783, 7784, 7785, 7786, 7787,
+ 7788, 7789, 7790, 7791, 7792, 7793, 7794, 7795,
+ 7796, 7797, 7798, 7799, 7800, 7801, 7802, 7803,
+ 7804, 7805, 7806, 7807, 7808, 7809, 7810, 7811,
+ 7812, 7813, 7814, 7815, 7816, 7817, 7818, 7819,
+ 7820, 7821, 7822, 7823, 7824, 7825, 7826, 7827,
+ 7828, 7829, 7830, 7831, 7832, 7833, 7834, 7835,
+ 7836, 7837, 7838, 7839, 7840, 7841, 7842, 7843,
+ 7844, 7845, 7846, 7847, 7848, 7849, 7850, 7851,
+ 7852, 7853, 7854, 7855, 7856, 7857, 7858, 7859,
+ 7860, 7861, 7862, 7863, 7864, 7865, 7866, 7867,
+ 7868, 7869, 7870, 7871, 7872, 7873, 7874, 7875,
+ 7876, 7877, 7878, 7879, 7880, 7881, 7882, 7883,
+ 7884, 7885, 7886, 7887, 7888, 7889, 7890, 7891,
+ 7892, 7893, 7894, 7895, 7896, 7897, 7898, 7899,
+ 7900, 7901, 7902, 7903, 7904, 7905, 7906, 7907,
+ 7908, 7909, 7910, 7911, 7912, 7913, 7914, 7915,
+ 7916, 7917, 7918, 7919, 7920, 7921, 7922, 7923,
+ 7924, 7925, 7926, 7927, 7928, 7929, 7930, 7931,
+ 7932, 7933, 7934, 7935, 7936, 7937, 7938, 7939,
+ 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947,
+ 7948, 7949, 7950, 7951, 7952, 7953, 7954, 7955,
+ 7956, 7957, 7958, 7959, 7960, 7961, 7962, 7963,
+ 7964, 7965, 7966, 7967, 7968, 7969, 7970, 7971,
+ 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7979,
+ 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987,
+ 7988, 7989, 7990, 7991, 7992, 7993, 7994, 7995,
+ 7996, 7997, 7998, 7999, 8000, 8001, 8002, 8003,
+ 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011,
+ 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019,
+ 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027,
+ 8028, 8029, 8030, 8031, 8032, 8033, 8034, 8035,
+ 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043,
+ 8044, 8045, 8046, 8047, 8048, 8049, 8050, 8051,
+ 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059,
+ 8060, 8061, 8062, 8063, 8064, 8065, 8066, 8067,
+ 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075,
+ 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083,
+ 8084, 8085, 8086, 8087, 8088, 8089, -1, -1
+ }
+};
diff --git a/gnulib/lib/uninorm/decomposition.c b/gnulib/lib/uninorm/decomposition.c
new file mode 100644
index 00000000..a29e105c
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition.c
@@ -0,0 +1,102 @@
+/* Decomposition of Unicode characters.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "decomposition-table.h"
+
+int
+uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition)
+{
+ if (uc >= 0xAC00 && uc < 0xD7A4)
+ {
+ /* Hangul syllable. See Unicode standard, chapter 3, section
+ "Hangul Syllable Decomposition", See also the clarification at
+ <http://www.unicode.org/versions/Unicode5.1.0/>, section
+ "Clarification of Hangul Jamo Handling". */
+ unsigned int t;
+
+ uc -= 0xAC00;
+ t = uc % 28;
+
+ *decomp_tag = UC_DECOMP_CANONICAL;
+ if (t == 0)
+ {
+ unsigned int v, l;
+
+ uc = uc / 28;
+ v = uc % 21;
+ l = uc / 21;
+
+ decomposition[0] = 0x1100 + l;
+ decomposition[1] = 0x1161 + v;
+ return 2;
+ }
+ else
+ {
+#if 1 /* Return the pairwise decomposition, not the full decomposition. */
+ decomposition[0] = 0xAC00 + uc - t; /* = 0xAC00 + (l * 21 + v) * 28; */
+ decomposition[1] = 0x11A7 + t;
+ return 2;
+#else
+ unsigned int v, l;
+
+ uc = uc / 28;
+ v = uc % 21;
+ l = uc / 21;
+
+ decomposition[0] = 0x1100 + l;
+ decomposition[1] = 0x1161 + v;
+ decomposition[2] = 0x11A7 + t;
+ return 3;
+#endif
+ }
+ }
+ else if (uc < 0x110000)
+ {
+ unsigned short entry = decomp_index (uc);
+ if (entry != (unsigned short)(-1))
+ {
+ const unsigned char *p;
+ unsigned int element;
+ unsigned int length;
+
+ p = &gl_uninorm_decomp_chars_table[3 * (entry & 0x7FFF)];
+ element = (p[0] << 16) | (p[1] << 8) | p[2];
+ /* The first element has 5 bits for the decomposition type. */
+ *decomp_tag = (element >> 18) & 0x1f;
+ length = 1;
+ for (;;)
+ {
+ /* Every element has an 18 bits wide Unicode code point. */
+ *decomposition = element & 0x3ffff;
+ /* Bit 23 tells whether there are more elements, */
+ if ((element & (1 << 23)) == 0)
+ break;
+ p += 3;
+ element = (p[0] << 16) | (p[1] << 8) | p[2];
+ decomposition++;
+ length++;
+ }
+ return length;
+ }
+ }
+ return -1;
+}
diff --git a/gnulib/lib/uninorm/nfc.c b/gnulib/lib/uninorm/nfc.c
new file mode 100644
index 00000000..ecc1aba6
--- /dev/null
+++ b/gnulib/lib/uninorm/nfc.c
@@ -0,0 +1,31 @@
+/* Unicode Normalization Form C.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+
+const struct unicode_normalization_form uninorm_nfc =
+ {
+ NF_IS_COMPOSING,
+ uc_canonical_decomposition,
+ uc_composition,
+ &uninorm_nfd
+ };
diff --git a/gnulib/lib/uninorm/nfd.c b/gnulib/lib/uninorm/nfd.c
new file mode 100644
index 00000000..1e7194d0
--- /dev/null
+++ b/gnulib/lib/uninorm/nfd.c
@@ -0,0 +1,31 @@
+/* Unicode Normalization Form D.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+
+const struct unicode_normalization_form uninorm_nfd =
+ {
+ 0,
+ uc_canonical_decomposition,
+ NULL,
+ &uninorm_nfd
+ };
diff --git a/gnulib/lib/uninorm/nfkc.c b/gnulib/lib/uninorm/nfkc.c
new file mode 100644
index 00000000..fdd05ac6
--- /dev/null
+++ b/gnulib/lib/uninorm/nfkc.c
@@ -0,0 +1,32 @@
+/* Unicode Normalization Form KC.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+const struct unicode_normalization_form uninorm_nfkc =
+ {
+ NF_IS_COMPAT_DECOMPOSING | NF_IS_COMPOSING,
+ uc_compat_decomposition,
+ uc_composition,
+ &uninorm_nfkd
+ };
diff --git a/gnulib/lib/uninorm/nfkd.c b/gnulib/lib/uninorm/nfkd.c
new file mode 100644
index 00000000..cff0df2e
--- /dev/null
+++ b/gnulib/lib/uninorm/nfkd.c
@@ -0,0 +1,32 @@
+/* Unicode Normalization Form KD.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+const struct unicode_normalization_form uninorm_nfkd =
+ {
+ NF_IS_COMPAT_DECOMPOSING,
+ uc_compat_decomposition,
+ NULL,
+ &uninorm_nfkd
+ };
diff --git a/gnulib/lib/uninorm/normalize-internal.h b/gnulib/lib/uninorm/normalize-internal.h
new file mode 100644
index 00000000..f4c8c8e3
--- /dev/null
+++ b/gnulib/lib/uninorm/normalize-internal.h
@@ -0,0 +1,37 @@
+/* Normalization of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+#include "unitypes.h"
+
+/* Complete definition of normalization form descriptor. */
+struct unicode_normalization_form
+{
+ /* Bit mask containing meta-information.
+ This must be the first field. */
+ unsigned int description;
+ #define NF_IS_COMPAT_DECOMPOSING (1 << 0)
+ #define NF_IS_COMPOSING (1 << 1)
+ /* Function that decomposes a Unicode character. */
+ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition);
+ /* Function that combines two Unicode characters, a starter and another
+ character. */
+ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2);
+ /* Decomposing variant. */
+ const struct unicode_normalization_form *decomposing_variant;
+};
diff --git a/gnulib/lib/uninorm/u-normalize-internal.h b/gnulib/lib/uninorm/u-normalize-internal.h
new file mode 100644
index 00000000..43b7ec32
--- /dev/null
+++ b/gnulib/lib/uninorm/u-normalize-internal.h
@@ -0,0 +1,375 @@
+/* Decomposition and composition of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (uninorm_t nf, const UNIT *s, size_t n,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition) = nf->decomposer;
+ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2) = nf->composer;
+
+ /* The result being accumulated. */
+ UNIT *result;
+ size_t length;
+ size_t allocated;
+ /* The buffer for sorting. */
+ #define SORTBUF_PREALLOCATED 64
+ struct ucs4_with_ccc sortbuf_preallocated[2 * SORTBUF_PREALLOCATED];
+ struct ucs4_with_ccc *sortbuf; /* array of size 2 * sortbuf_allocated */
+ size_t sortbuf_allocated;
+ size_t sortbuf_count;
+
+ /* Initialize the accumulator. */
+ if (resultbuf == NULL)
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ else
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ length = 0;
+
+ /* Initialize the buffer for sorting. */
+ sortbuf = sortbuf_preallocated;
+ sortbuf_allocated = SORTBUF_PREALLOCATED;
+ sortbuf_count = 0;
+
+ {
+ const UNIT *s_end = s + n;
+
+ for (;;)
+ {
+ int count;
+ ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int decomposed_count;
+ int i;
+
+ if (s < s_end)
+ {
+ /* Fetch the next character. */
+ count = U_MBTOUC_UNSAFE (&decomposed[0], s, s_end - s);
+ decomposed_count = 1;
+
+ /* Decompose it, recursively.
+ It would be possible to precompute the recursive decomposition
+ and store it in a table. But this would significantly increase
+ the size of the decomposition tables, because for example for
+ U+1FC1 the recursive canonical decomposition and the recursive
+ compatibility decomposition are different. */
+ {
+ int curr;
+
+ for (curr = 0; curr < decomposed_count; )
+ {
+ /* Invariant: decomposed[0..curr-1] is fully decomposed, i.e.
+ all elements are atomic. */
+ ucs4_t curr_decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int curr_decomposed_count;
+
+ curr_decomposed_count = decomposer (decomposed[curr], curr_decomposed);
+ if (curr_decomposed_count >= 0)
+ {
+ /* Move curr_decomposed[0..curr_decomposed_count-1] over
+ decomposed[curr], making room. It's not worth using
+ memcpy() here, since the counts are so small. */
+ int shift = curr_decomposed_count - 1;
+
+ if (shift < 0)
+ abort ();
+ if (shift > 0)
+ {
+ int j;
+
+ decomposed_count += shift;
+ if (decomposed_count > UC_DECOMPOSITION_MAX_LENGTH)
+ abort ();
+ for (j = decomposed_count - 1 - shift; j > curr; j--)
+ decomposed[j + shift] = decomposed[j];
+ }
+ for (; shift >= 0; shift--)
+ decomposed[curr + shift] = curr_decomposed[shift];
+ }
+ else
+ {
+ /* decomposed[curr] is atomic. */
+ curr++;
+ }
+ }
+ }
+ }
+ else
+ {
+ count = 0;
+ decomposed_count = 0;
+ }
+
+ i = 0;
+ for (;;)
+ {
+ ucs4_t uc;
+ int ccc;
+
+ if (s < s_end)
+ {
+ /* Fetch the next character from the decomposition. */
+ if (i == decomposed_count)
+ break;
+ uc = decomposed[i];
+ ccc = uc_combining_class (uc);
+ }
+ else
+ {
+ /* End of string reached. */
+ uc = 0;
+ ccc = 0;
+ }
+
+ if (ccc == 0)
+ {
+ size_t j;
+
+ /* Apply the canonical ordering algorithm to the accumulated
+ sequence of characters. */
+ if (sortbuf_count > 1)
+ gl_uninorm_decompose_merge_sort_inplace (sortbuf, sortbuf_count,
+ sortbuf + sortbuf_count);
+
+ if (composer != NULL)
+ {
+ /* Attempt to combine decomposed characters, as specified
+ in the Unicode Standard Annex #15 "Unicode Normalization
+ Forms". We need to check
+ 1. whether the first accumulated character is a
+ "starter" (i.e. has ccc = 0). This is usually the
+ case. But when the string starts with a
+ non-starter, the sortbuf also starts with a
+ non-starter. Btw, this check could also be
+ omitted, because the composition table has only
+ entries (code1, code2) for which code1 is a
+ starter; if the first accumulated character is not
+ a starter, no lookup will succeed.
+ 2. If the sortbuf has more than one character, check
+ for each of these characters that are not "blocked"
+ from the starter (i.e. have a ccc that is higher
+ than the ccc of the previous character) whether it
+ can be combined with the first character.
+ 3. If only one character is left in sortbuf, check
+ whether it can be combined with the next character
+ (also a starter). */
+ if (sortbuf_count > 0 && sortbuf[0].ccc == 0)
+ {
+ for (j = 1; j < sortbuf_count; )
+ {
+ if (sortbuf[j].ccc > sortbuf[j - 1].ccc)
+ {
+ ucs4_t combined =
+ composer (sortbuf[0].code, sortbuf[j].code);
+ if (combined)
+ {
+ size_t k;
+
+ sortbuf[0].code = combined;
+ /* sortbuf[0].ccc = 0, still valid. */
+ for (k = j + 1; k < sortbuf_count; k++)
+ sortbuf[k - 1] = sortbuf[k];
+ sortbuf_count--;
+ continue;
+ }
+ }
+ j++;
+ }
+ if (s < s_end && sortbuf_count == 1)
+ {
+ ucs4_t combined =
+ composer (sortbuf[0].code, uc);
+ if (combined)
+ {
+ uc = combined;
+ ccc = 0;
+ /* uc could be further combined with subsequent
+ characters. So don't put it into sortbuf[0] in
+ this round, only in the next round. */
+ sortbuf_count = 0;
+ }
+ }
+ }
+ }
+
+ for (j = 0; j < sortbuf_count; j++)
+ {
+ ucs4_t muc = sortbuf[j].code;
+
+ /* Append muc to the result accumulator. */
+ if (length < allocated)
+ {
+ int ret =
+ U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret >= 0)
+ {
+ length += ret;
+ goto done_appending;
+ }
+ }
+ {
+ size_t old_allocated = allocated;
+ size_t new_allocated = 2 * old_allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (new_allocated < old_allocated) /* integer overflow? */
+ abort ();
+ {
+ UNIT *larger_result;
+ if (result == NULL)
+ {
+ larger_result =
+ (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ else if (result == resultbuf)
+ {
+ larger_result =
+ (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ U_CPY (larger_result, resultbuf, length);
+ }
+ else
+ {
+ larger_result =
+ (UNIT *) realloc (result, new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ result = larger_result;
+ allocated = new_allocated;
+ {
+ int ret =
+ U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret < 0)
+ abort ();
+ length += ret;
+ goto done_appending;
+ }
+ }
+ }
+ done_appending: ;
+ }
+
+ /* sortbuf is now empty. */
+ sortbuf_count = 0;
+ }
+
+ if (!(s < s_end))
+ /* End of string reached. */
+ break;
+
+ /* Append (uc, ccc) to sortbuf. */
+ if (sortbuf_count == sortbuf_allocated)
+ {
+ struct ucs4_with_ccc *new_sortbuf;
+
+ sortbuf_allocated = 2 * sortbuf_allocated;
+ if (sortbuf_allocated < sortbuf_count) /* integer overflow? */
+ abort ();
+ new_sortbuf =
+ (struct ucs4_with_ccc *) malloc (2 * sortbuf_allocated * sizeof (struct ucs4_with_ccc));
+ memcpy (new_sortbuf, sortbuf,
+ sortbuf_count * sizeof (struct ucs4_with_ccc));
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+ sortbuf = new_sortbuf;
+ }
+ sortbuf[sortbuf_count].code = uc;
+ sortbuf[sortbuf_count].ccc = ccc;
+ sortbuf_count++;
+
+ i++;
+ }
+
+ if (!(s < s_end))
+ /* End of string reached. */
+ break;
+
+ s += count;
+ }
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ UNIT *memory;
+
+ memory = (UNIT *) realloc (result, length * sizeof (UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (sortbuf_count > 0)
+ abort ();
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+
+ *lengthp = length;
+ return result;
+
+ fail:
+ {
+ int saved_errno = errno;
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+ if (result != resultbuf)
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/uninorm/u-normcmp.h b/gnulib/lib/uninorm/u-normcmp.h
new file mode 100644
index 00000000..5cda5db3
--- /dev/null
+++ b/gnulib/lib/uninorm/u-normcmp.h
@@ -0,0 +1,64 @@
+/* Normalization insensitive comparison of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
+ uninorm_t nf, int *resultp)
+{
+ UNIT buf1[2048 / sizeof (UNIT)];
+ UNIT buf2[2048 / sizeof (UNIT)];
+ UNIT *norms1;
+ size_t norms1_length;
+ UNIT *norms2;
+ size_t norms2_length;
+ int cmp;
+
+ /* Normalize S1. */
+ norms1_length = sizeof (buf1) / sizeof (UNIT);
+ norms1 = U_NORMALIZE (nf, s1, n1, buf1, &norms1_length);
+ if (norms1 == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Normalize S2. */
+ norms2_length = sizeof (buf2) / sizeof (UNIT);
+ norms2 = U_NORMALIZE (nf, s2, n2, buf2, &norms2_length);
+ if (norms2 == NULL)
+ {
+ if (norms1 != buf1)
+ {
+ int saved_errno = errno;
+ free (norms1);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare the normalized strings. */
+ cmp = U_CMP2 (norms1, norms1_length, norms2, norms2_length);
+ if (cmp > 0)
+ cmp = 1;
+ else if (cmp < 0)
+ cmp = -1;
+
+ if (norms2 != buf2)
+ free (norms2);
+ if (norms1 != buf1)
+ free (norms1);
+ *resultp = cmp;
+ return 0;
+}
diff --git a/gnulib/lib/uninorm/u-normcoll.h b/gnulib/lib/uninorm/u-normcoll.h
new file mode 100644
index 00000000..d76e7258
--- /dev/null
+++ b/gnulib/lib/uninorm/u-normcoll.h
@@ -0,0 +1,65 @@
+/* Locale dependent, normalization insensitive comparison of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
+ uninorm_t nf, int *resultp)
+{
+ char buf1[2048];
+ char buf2[2048];
+ char *transformed1;
+ size_t transformed1_length;
+ char *transformed2;
+ size_t transformed2_length;
+ int cmp;
+
+ /* Normalize and transform S1. */
+ transformed1_length = sizeof (buf1);
+ transformed1 = U_NORMXFRM (s1, n1, nf, buf1, &transformed1_length);
+ if (transformed1 == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Normalize and transform S2. */
+ transformed2_length = sizeof (buf2);
+ transformed2 = U_NORMXFRM (s2, n2, nf, buf2, &transformed2_length);
+ if (transformed2 == NULL)
+ {
+ if (transformed1 != buf1)
+ {
+ int saved_errno = errno;
+ free (transformed1);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare the transformed strings. */
+ cmp = memcmp2 (transformed1, transformed1_length,
+ transformed2, transformed2_length);
+ if (cmp < 0)
+ cmp = -1;
+ else if (cmp > 0)
+ cmp = 1;
+
+ if (transformed2 != buf2)
+ free (transformed2);
+ if (transformed1 != buf1)
+ free (transformed1);
+ *resultp = cmp;
+ return 0;
+}
diff --git a/gnulib/lib/uninorm/u-normxfrm.h b/gnulib/lib/uninorm/u-normxfrm.h
new file mode 100644
index 00000000..ce84ff67
--- /dev/null
+++ b/gnulib/lib/uninorm/u-normxfrm.h
@@ -0,0 +1,87 @@
+/* Locale dependent transformation for comparison of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+char *
+FUNC (const UNIT *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp)
+{
+ UNIT normsbuf[2048 / sizeof (UNIT)];
+ UNIT *norms;
+ size_t norms_length;
+ char convsbuf[2048];
+ char *convs;
+ size_t convs_length;
+ char *result;
+
+ /* Normalize the Unicode string. */
+ norms_length = sizeof (normsbuf) / sizeof (UNIT);
+ norms = U_NORMALIZE (nf, s, n, normsbuf, &norms_length);
+ if (norms == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ /* Convert it to locale encoding. */
+ convs_length = sizeof (convsbuf) - 1;
+ convs = U_CONV_TO_ENCODING (locale_charset (),
+ iconveh_error,
+ norms, norms_length,
+ NULL,
+ convsbuf, &convs_length);
+ if (convs == NULL)
+ {
+ if (norms != normsbuf)
+ {
+ int saved_errno = errno;
+ free (norms);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (norms != normsbuf)
+ free (norms);
+
+ /* Ensure one more byte is available. */
+ if (convs != convsbuf)
+ {
+ char *memory = (char *) realloc (convs, convs_length + 1);
+ if (memory == NULL)
+ {
+ free (convs);
+ errno = ENOMEM;
+ return NULL;
+ }
+ convs = memory;
+ }
+
+ /* Apply locale dependent transformations for comparison. */
+ result = memxfrm (convs, convs_length, resultbuf, lengthp);
+ if (result == NULL)
+ {
+ if (convs != convsbuf)
+ {
+ int saved_errno = errno;
+ free (convs);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (convs != convsbuf)
+ free (convs);
+ return result;
+}
diff --git a/gnulib/lib/uninorm/u16-normalize.c b/gnulib/lib/uninorm/u16-normalize.c
new file mode 100644
index 00000000..df50e8d3
--- /dev/null
+++ b/gnulib/lib/uninorm/u16-normalize.c
@@ -0,0 +1,38 @@
+/* Normalization of UTF-16 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+#define FUNC u16_normalize
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#define U_UCTOMB u16_uctomb
+#define U_CPY u16_cpy
+#include "u-normalize-internal.h"
diff --git a/gnulib/lib/uninorm/u16-normcmp.c b/gnulib/lib/uninorm/u16-normcmp.c
new file mode 100644
index 00000000..e246a268
--- /dev/null
+++ b/gnulib/lib/uninorm/u16-normcmp.c
@@ -0,0 +1,33 @@
+/* Normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "unistr.h"
+
+#define FUNC u16_normcmp
+#define UNIT uint16_t
+#define U_NORMALIZE u16_normalize
+#define U_CMP2 u16_cmp2
+#include "u-normcmp.h"
diff --git a/gnulib/lib/uninorm/u16-normcoll.c b/gnulib/lib/uninorm/u16-normcoll.c
new file mode 100644
index 00000000..b851472c
--- /dev/null
+++ b/gnulib/lib/uninorm/u16-normcoll.c
@@ -0,0 +1,31 @@
+/* Locale dependent, normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u16_normcoll
+#define UNIT uint16_t
+#define U_NORMXFRM u16_normxfrm
+#include "u-normcoll.h"
diff --git a/gnulib/lib/uninorm/u16-normxfrm.c b/gnulib/lib/uninorm/u16-normxfrm.c
new file mode 100644
index 00000000..41d274ab
--- /dev/null
+++ b/gnulib/lib/uninorm/u16-normxfrm.c
@@ -0,0 +1,34 @@
+/* Locale dependent transformation for comparison of UTF-16 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "memxfrm.h"
+
+#define FUNC u16_normxfrm
+#define UNIT uint16_t
+#define U_NORMALIZE u16_normalize
+#define U_CONV_TO_ENCODING u16_conv_to_encoding
+#include "u-normxfrm.h"
diff --git a/gnulib/lib/uninorm/u32-normalize.c b/gnulib/lib/uninorm/u32-normalize.c
new file mode 100644
index 00000000..9ab8e5df
--- /dev/null
+++ b/gnulib/lib/uninorm/u32-normalize.c
@@ -0,0 +1,38 @@
+/* Normalization of UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+#define FUNC u32_normalize
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#define U_UCTOMB u32_uctomb
+#define U_CPY u32_cpy
+#include "u-normalize-internal.h"
diff --git a/gnulib/lib/uninorm/u32-normcmp.c b/gnulib/lib/uninorm/u32-normcmp.c
new file mode 100644
index 00000000..705c3457
--- /dev/null
+++ b/gnulib/lib/uninorm/u32-normcmp.c
@@ -0,0 +1,33 @@
+/* Normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "unistr.h"
+
+#define FUNC u32_normcmp
+#define UNIT uint32_t
+#define U_NORMALIZE u32_normalize
+#define U_CMP2 u32_cmp2
+#include "u-normcmp.h"
diff --git a/gnulib/lib/uninorm/u32-normcoll.c b/gnulib/lib/uninorm/u32-normcoll.c
new file mode 100644
index 00000000..37708030
--- /dev/null
+++ b/gnulib/lib/uninorm/u32-normcoll.c
@@ -0,0 +1,31 @@
+/* Locale dependent, normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u32_normcoll
+#define UNIT uint32_t
+#define U_NORMXFRM u32_normxfrm
+#include "u-normcoll.h"
diff --git a/gnulib/lib/uninorm/u32-normxfrm.c b/gnulib/lib/uninorm/u32-normxfrm.c
new file mode 100644
index 00000000..7e953f98
--- /dev/null
+++ b/gnulib/lib/uninorm/u32-normxfrm.c
@@ -0,0 +1,34 @@
+/* Locale dependent transformation for comparison of UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "memxfrm.h"
+
+#define FUNC u32_normxfrm
+#define UNIT uint32_t
+#define U_NORMALIZE u32_normalize
+#define U_CONV_TO_ENCODING u32_conv_to_encoding
+#include "u-normxfrm.h"
diff --git a/gnulib/lib/uninorm/u8-normalize.c b/gnulib/lib/uninorm/u8-normalize.c
new file mode 100644
index 00000000..63679945
--- /dev/null
+++ b/gnulib/lib/uninorm/u8-normalize.c
@@ -0,0 +1,38 @@
+/* Normalization of UTF-8 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+#define FUNC u8_normalize
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_UCTOMB u8_uctomb
+#define U_CPY u8_cpy
+#include "u-normalize-internal.h"
diff --git a/gnulib/lib/uninorm/u8-normcmp.c b/gnulib/lib/uninorm/u8-normcmp.c
new file mode 100644
index 00000000..02a4d5e3
--- /dev/null
+++ b/gnulib/lib/uninorm/u8-normcmp.c
@@ -0,0 +1,33 @@
+/* Normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "unistr.h"
+
+#define FUNC u8_normcmp
+#define UNIT uint8_t
+#define U_NORMALIZE u8_normalize
+#define U_CMP2 u8_cmp2
+#include "u-normcmp.h"
diff --git a/gnulib/lib/uninorm/u8-normcoll.c b/gnulib/lib/uninorm/u8-normcoll.c
new file mode 100644
index 00000000..5c392d91
--- /dev/null
+++ b/gnulib/lib/uninorm/u8-normcoll.c
@@ -0,0 +1,31 @@
+/* Locale dependent, normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u8_normcoll
+#define UNIT uint8_t
+#define U_NORMXFRM u8_normxfrm
+#include "u-normcoll.h"
diff --git a/gnulib/lib/uninorm/u8-normxfrm.c b/gnulib/lib/uninorm/u8-normxfrm.c
new file mode 100644
index 00000000..47d4fdc0
--- /dev/null
+++ b/gnulib/lib/uninorm/u8-normxfrm.c
@@ -0,0 +1,34 @@
+/* Locale dependent transformation for comparison of UTF-8 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "memxfrm.h"
+
+#define FUNC u8_normxfrm
+#define UNIT uint8_t
+#define U_NORMALIZE u8_normalize
+#define U_CONV_TO_ENCODING u8_conv_to_encoding
+#include "u-normxfrm.h"
diff --git a/gnulib/lib/uninorm/uninorm-filter.c b/gnulib/lib/uninorm/uninorm-filter.c
new file mode 100644
index 00000000..dbc5e10c
--- /dev/null
+++ b/gnulib/lib/uninorm/uninorm-filter.c
@@ -0,0 +1,367 @@
+/* Stream-based normalization of Unicode strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+
+struct uninorm_filter
+{
+ /* Characteristics of the normalization form. */
+ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition);
+ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2);
+
+ /* The encapsulated stream. */
+ int (*stream_func) (void *stream_data, ucs4_t uc);
+ void *stream_data;
+
+ /* The buffer for sorting. */
+ #define SORTBUF_PREALLOCATED 64
+ struct ucs4_with_ccc sortbuf_preallocated[2 * SORTBUF_PREALLOCATED];
+ struct ucs4_with_ccc *sortbuf; /* array of size 2 * sortbuf_allocated */
+ size_t sortbuf_allocated;
+ size_t sortbuf_count;
+};
+
+struct uninorm_filter *
+uninorm_filter_create (uninorm_t nf,
+ int (*stream_func) (void *stream_data, ucs4_t uc),
+ void *stream_data)
+{
+ struct uninorm_filter *filter =
+ (struct uninorm_filter *) malloc (sizeof (struct uninorm_filter));
+
+ if (filter == NULL)
+ /* errno is ENOMEM. */
+ return NULL;
+
+ filter->decomposer = nf->decomposer;
+ filter->composer = nf->composer;
+ filter->stream_func = stream_func;
+ filter->stream_data = stream_data;
+ filter->sortbuf = filter->sortbuf_preallocated;
+ filter->sortbuf_allocated = SORTBUF_PREALLOCATED;
+ filter->sortbuf_count = 0;
+
+ return filter;
+}
+
+int
+uninorm_filter_write (struct uninorm_filter *filter, ucs4_t uc_arg)
+{
+ ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int decomposed_count;
+
+ /* Accept the next character. */
+ decomposed[0] = uc_arg;
+ decomposed_count = 1;
+
+ /* Decompose it, recursively.
+ It would be possible to precompute the recursive decomposition
+ and store it in a table. But this would significantly increase
+ the size of the decomposition tables, because for example for
+ U+1FC1 the recursive canonical decomposition and the recursive
+ compatibility decomposition are different. */
+ {
+ int curr;
+
+ for (curr = 0; curr < decomposed_count; )
+ {
+ /* Invariant: decomposed[0..curr-1] is fully decomposed, i.e.
+ all elements are atomic. */
+ ucs4_t curr_decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int curr_decomposed_count;
+
+ curr_decomposed_count =
+ filter->decomposer (decomposed[curr], curr_decomposed);
+ if (curr_decomposed_count >= 0)
+ {
+ /* Move curr_decomposed[0..curr_decomposed_count-1] over
+ decomposed[curr], making room. It's not worth using
+ memcpy() here, since the counts are so small. */
+ int shift = curr_decomposed_count - 1;
+
+ if (shift < 0)
+ abort ();
+ if (shift > 0)
+ {
+ int j;
+
+ decomposed_count += shift;
+ if (decomposed_count > UC_DECOMPOSITION_MAX_LENGTH)
+ abort ();
+ for (j = decomposed_count - 1 - shift; j > curr; j--)
+ decomposed[j + shift] = decomposed[j];
+ }
+ for (; shift >= 0; shift--)
+ decomposed[curr + shift] = curr_decomposed[shift];
+ }
+ else
+ {
+ /* decomposed[curr] is atomic. */
+ curr++;
+ }
+ }
+ }
+
+ {
+ /* Cache sortbuf and sortbuf_count in local register variables. */
+ struct ucs4_with_ccc * const sortbuf = filter->sortbuf;
+ size_t sortbuf_count = filter->sortbuf_count;
+ int i;
+
+ for (i = 0; i < decomposed_count; i++)
+ {
+ /* Fetch the next character from the decomposition. */
+ ucs4_t uc = decomposed[i];
+ int ccc = uc_combining_class (uc);
+
+ if (ccc == 0)
+ {
+ size_t j;
+
+ /* Apply the canonical ordering algorithm to the accumulated
+ sequence of characters. */
+ if (sortbuf_count > 1)
+ gl_uninorm_decompose_merge_sort_inplace (sortbuf, sortbuf_count,
+ sortbuf + sortbuf_count);
+
+ if (filter->composer != NULL)
+ {
+ /* Attempt to combine decomposed characters, as specified
+ in the Unicode Standard Annex #15 "Unicode Normalization
+ Forms". We need to check
+ 1. whether the first accumulated character is a
+ "starter" (i.e. has ccc = 0). This is usually the
+ case. But when the string starts with a
+ non-starter, the sortbuf also starts with a
+ non-starter. Btw, this check could also be
+ omitted, because the composition table has only
+ entries (code1, code2) for which code1 is a
+ starter; if the first accumulated character is not
+ a starter, no lookup will succeed.
+ 2. If the sortbuf has more than one character, check
+ for each of these characters that are not "blocked"
+ from the starter (i.e. have a ccc that is higher
+ than the ccc of the previous character) whether it
+ can be combined with the first character.
+ 3. If only one character is left in sortbuf, check
+ whether it can be combined with the next character
+ (also a starter). */
+ if (sortbuf_count > 0 && sortbuf[0].ccc == 0)
+ {
+ for (j = 1; j < sortbuf_count; )
+ {
+ if (sortbuf[j].ccc > sortbuf[j - 1].ccc)
+ {
+ ucs4_t combined =
+ filter->composer (sortbuf[0].code, sortbuf[j].code);
+ if (combined)
+ {
+ size_t k;
+
+ sortbuf[0].code = combined;
+ /* sortbuf[0].ccc = 0, still valid. */
+ for (k = j + 1; k < sortbuf_count; k++)
+ sortbuf[k - 1] = sortbuf[k];
+ sortbuf_count--;
+ continue;
+ }
+ }
+ j++;
+ }
+ if (sortbuf_count == 1)
+ {
+ ucs4_t combined =
+ filter->composer (sortbuf[0].code, uc);
+ if (combined)
+ {
+ uc = combined;
+ ccc = 0;
+ /* uc could be further combined with subsequent
+ characters. So don't put it into sortbuf[0] in
+ this round, only in the next round. */
+ sortbuf_count = 0;
+ }
+ }
+ }
+ }
+
+ for (j = 0; j < sortbuf_count; j++)
+ {
+ ucs4_t muc = sortbuf[j].code;
+
+ /* Output muc to the encapsulated stream. */
+ int ret = filter->stream_func (filter->stream_data, muc);
+ if (ret < 0)
+ {
+ /* errno is set here. */
+ filter->sortbuf_count = 0;
+ return -1;
+ }
+ }
+
+ /* sortbuf is now empty. */
+ sortbuf_count = 0;
+ }
+
+ /* Append (uc, ccc) to sortbuf. */
+ if (sortbuf_count == filter->sortbuf_allocated)
+ {
+ struct ucs4_with_ccc *new_sortbuf;
+
+ filter->sortbuf_allocated = 2 * filter->sortbuf_allocated;
+ if (filter->sortbuf_allocated < sortbuf_count) /* integer overflow? */
+ abort ();
+ new_sortbuf =
+ (struct ucs4_with_ccc *)
+ malloc (2 * filter->sortbuf_allocated * sizeof (struct ucs4_with_ccc));
+ memcpy (new_sortbuf, filter->sortbuf,
+ sortbuf_count * sizeof (struct ucs4_with_ccc));
+ if (filter->sortbuf != filter->sortbuf_preallocated)
+ free (filter->sortbuf);
+ filter->sortbuf = new_sortbuf;
+ }
+ filter->sortbuf[sortbuf_count].code = uc;
+ filter->sortbuf[sortbuf_count].ccc = ccc;
+ sortbuf_count++;
+ }
+
+ filter->sortbuf_count = sortbuf_count;
+ }
+
+ return 0;
+}
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream.
+ Return 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. */
+int
+uninorm_filter_flush (struct uninorm_filter *filter)
+{
+ /* Cache sortbuf and sortbuf_count in local register variables. */
+ struct ucs4_with_ccc * const sortbuf = filter->sortbuf;
+ size_t sortbuf_count = filter->sortbuf_count;
+ size_t j;
+
+ /* Apply the canonical ordering algorithm to the accumulated
+ sequence of characters. */
+ if (sortbuf_count > 1)
+ gl_uninorm_decompose_merge_sort_inplace (sortbuf, sortbuf_count,
+ sortbuf + sortbuf_count);
+
+ if (filter->composer != NULL)
+ {
+ /* Attempt to combine decomposed characters, as specified
+ in the Unicode Standard Annex #15 "Unicode Normalization
+ Forms". We need to check
+ 1. whether the first accumulated character is a
+ "starter" (i.e. has ccc = 0). This is usually the
+ case. But when the string starts with a
+ non-starter, the sortbuf also starts with a
+ non-starter. Btw, this check could also be
+ omitted, because the composition table has only
+ entries (code1, code2) for which code1 is a
+ starter; if the first accumulated character is not
+ a starter, no lookup will succeed.
+ 2. If the sortbuf has more than one character, check
+ for each of these characters that are not "blocked"
+ from the starter (i.e. have a ccc that is higher
+ than the ccc of the previous character) whether it
+ can be combined with the first character.
+ 3. If only one character is left in sortbuf, check
+ whether it can be combined with the next character
+ (also a starter). */
+ if (sortbuf_count > 0 && sortbuf[0].ccc == 0)
+ {
+ for (j = 1; j < sortbuf_count; )
+ {
+ if (sortbuf[j].ccc > sortbuf[j - 1].ccc)
+ {
+ ucs4_t combined =
+ filter->composer (sortbuf[0].code, sortbuf[j].code);
+ if (combined)
+ {
+ size_t k;
+
+ sortbuf[0].code = combined;
+ /* sortbuf[0].ccc = 0, still valid. */
+ for (k = j + 1; k < sortbuf_count; k++)
+ sortbuf[k - 1] = sortbuf[k];
+ sortbuf_count--;
+ continue;
+ }
+ }
+ j++;
+ }
+ }
+ }
+
+ for (j = 0; j < sortbuf_count; j++)
+ {
+ ucs4_t muc = sortbuf[j].code;
+
+ /* Output muc to the encapsulated stream. */
+ int ret = filter->stream_func (filter->stream_data, muc);
+ if (ret < 0)
+ {
+ /* errno is set here. */
+ filter->sortbuf_count = 0;
+ return -1;
+ }
+ }
+
+ /* sortbuf is now empty. */
+ filter->sortbuf_count = 0;
+
+ return 0;
+}
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream, then close and free the filter.
+ Return 0 if successful, or -1 with errno set upon failure. */
+int
+uninorm_filter_free (struct uninorm_filter *filter)
+{
+ int ret = uninorm_filter_flush (filter);
+
+ if (ret < 0)
+ /* errno is set here. */
+ return -1;
+
+ if (filter->sortbuf_count > 0)
+ abort ();
+ if (filter->sortbuf != filter->sortbuf_preallocated)
+ free (filter->sortbuf);
+ free (filter);
+
+ return 0;
+}
diff --git a/gnulib/lib/unistd--.h b/gnulib/lib/unistd--.h
new file mode 100644
index 00000000..5283d2c5
--- /dev/null
+++ b/gnulib/lib/unistd--.h
@@ -0,0 +1,32 @@
+/* Like unistd.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <unistd.h>
+#include "unistd-safer.h"
+
+#undef dup
+#define dup dup_safer
+
+#undef pipe
+#define pipe pipe_safer
+
+#if GNULIB_PIPE2_SAFER
+# undef pipe2
+# define pipe2 pipe2_safer
+#endif
diff --git a/gnulib/lib/unistd-safer.h b/gnulib/lib/unistd-safer.h
new file mode 100644
index 00000000..190f1086
--- /dev/null
+++ b/gnulib/lib/unistd-safer.h
@@ -0,0 +1,31 @@
+/* Invoke unistd-like functions, but avoid some glitches.
+
+ Copyright (C) 2001, 2003, 2005, 2009-2010 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/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+int dup_safer (int);
+int fd_safer (int);
+int pipe_safer (int[2]);
+
+#if GNULIB_FD_SAFER_FLAG
+int dup_safer_flag (int, int);
+int fd_safer_flag (int, int);
+#endif
+
+#if GNULIB_PIPE2_SAFER
+int pipe2_safer (int[2], int);
+#endif
diff --git a/gnulib/lib/unistd.in.h b/gnulib/lib/unistd.in.h
new file mode 100644
index 00000000..f9fef506
--- /dev/null
+++ b/gnulib/lib/unistd.in.h
@@ -0,0 +1,921 @@
+/* Substitute for and wrapper around <unistd.h>.
+ Copyright (C) 2003-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_UNISTD_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_UNISTD_H@
+# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
+#endif
+
+#ifndef _GL_UNISTD_H
+#define _GL_UNISTD_H
+
+/* NetBSD 5.0 mis-defines NULL. Also get size_t. */
+#include <stddef.h>
+
+/* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>. */
+/* Cygwin 1.7.1 declares symlinkat in <stdio.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \
+ || (@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK)) \
+ && ! defined __GLIBC__
+# include <stdio.h>
+#endif
+
+/* Cygwin 1.7.1 declares unlinkat in <fcntl.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__
+# include <fcntl.h>
+#endif
+
+/* mingw fails to declare _exit in <unistd.h>. */
+/* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>. */
+/* Solaris declares getcwd not only in <unistd.h> but also in <stdlib.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stdlib.h>
+#endif
+
+/* mingw declares getcwd in <io.h>, not in <unistd.h>. */
+#if ((@GNULIB_GETCWD@ || defined GNULIB_POSIXCHECK) \
+ && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+# include <io.h>
+#endif
+
+#if (@GNULIB_WRITE@ || @GNULIB_READLINK@ || @GNULIB_READLINKAT@ \
+ || @GNULIB_PREAD@ || defined GNULIB_POSIXCHECK)
+/* Get ssize_t. */
+# include <sys/types.h>
+#endif
+
+/* Get getopt(), optarg, optind, opterr, optopt.
+ But avoid namespace pollution on glibc systems. */
+#if @GNULIB_UNISTD_H_GETOPT@ && !defined __GLIBC__ && !defined _GL_SYSTEM_GETOPT
+# include <getopt.h>
+#endif
+
+#if @GNULIB_GETHOSTNAME@
+/* Get all possible declarations of gethostname(). */
+# if @UNISTD_H_HAVE_WINSOCK2_H@
+# include <winsock2.h>
+# if !defined _GL_SYS_SOCKET_H
+# undef socket
+# define socket socket_used_without_including_sys_socket_h
+# undef connect
+# define connect connect_used_without_including_sys_socket_h
+# undef accept
+# define accept accept_used_without_including_sys_socket_h
+# undef bind
+# define bind bind_used_without_including_sys_socket_h
+# undef getpeername
+# define getpeername getpeername_used_without_including_sys_socket_h
+# undef getsockname
+# define getsockname getsockname_used_without_including_sys_socket_h
+# undef getsockopt
+# define getsockopt getsockopt_used_without_including_sys_socket_h
+# undef listen
+# define listen listen_used_without_including_sys_socket_h
+# undef recv
+# define recv recv_used_without_including_sys_socket_h
+# undef send
+# define send send_used_without_including_sys_socket_h
+# undef recvfrom
+# define recvfrom recvfrom_used_without_including_sys_socket_h
+# undef sendto
+# define sendto sendto_used_without_including_sys_socket_h
+# undef setsockopt
+# define setsockopt setsockopt_used_without_including_sys_socket_h
+# undef shutdown
+# define shutdown shutdown_used_without_including_sys_socket_h
+# endif
+# if !defined _GL_SYS_SELECT_H
+# undef select
+# define select select_used_without_including_sys_select_h
+# endif
+# endif
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* OS/2 EMX lacks these macros. */
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* Ensure *_OK macros exist. */
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+
+/* Declare overridden functions. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_CHOWN@
+# if @REPLACE_CHOWN@
+# undef chown
+# define chown rpl_chown
+# endif
+# if !@HAVE_CHOWN@ || @REPLACE_CHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+ to GID (if GID is not -1). Follow symbolic links.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/chown.html>. */
+extern int chown (const char *file, uid_t uid, gid_t gid)
+ _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef chown
+# if HAVE_RAW_DECL_CHOWN
+_GL_WARN_ON_USE (chown, "chown fails to follow symlinks on some systems and "
+ "doesn't treat a uid or gid of -1 on some systems - "
+ "use gnulib module chown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CLOSE@
+# if @REPLACE_CLOSE@
+/* Automatically included by modules that need a replacement for close. */
+# undef close
+# define close rpl_close
+extern int close (int);
+# endif
+#elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef close
+# define close close_used_without_requesting_gnulib_module_close
+#elif defined GNULIB_POSIXCHECK
+# undef close
+/* Assume close is always declared. */
+_GL_WARN_ON_USE (close, "close does not portably work on sockets - "
+ "use gnulib module close for portability");
+#endif
+
+
+#if @REPLACE_DUP@
+# define dup rpl_dup
+extern int dup (int);
+#endif
+
+
+#if @GNULIB_DUP2@
+# if @REPLACE_DUP2@
+# define dup2 rpl_dup2
+# endif
+# if !@HAVE_DUP2@ || @REPLACE_DUP2@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if
+ NEWFD = OLDFD, otherwise close NEWFD first if it is open.
+ Return newfd if successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/dup2.html>. */
+extern int dup2 (int oldfd, int newfd);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef dup2
+# if HAVE_RAW_DECL_DUP2
+_GL_WARN_ON_USE (dup2, "dup2 is unportable - "
+ "use gnulib module dup2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP3@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the
+ specified flags.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ Close NEWFD first if it is open.
+ Return newfd if successful, otherwise -1 and errno set.
+ See the Linux man page at
+ <http://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>. */
+# if @HAVE_DUP3@
+# define dup3 rpl_dup3
+# endif
+extern int dup3 (int oldfd, int newfd, int flags);
+#elif defined GNULIB_POSIXCHECK
+# undef dup3
+# if HAVE_RAW_DECL_DUP3
+_GL_WARN_ON_USE (dup3, "dup3 is unportable - "
+ "use gnulib module dup3 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ENVIRON@
+# if !@HAVE_DECL_ENVIRON@
+/* Set of environment variables and values. An array of strings of the form
+ "VARIABLE=VALUE", terminated with a NULL. */
+# if defined __APPLE__ && defined __MACH__
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron ())
+# else
+extern char **environ;
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if HAVE_RAW_DECL_ENVIRON
+static inline char ***
+rpl_environ (void)
+{
+ return &environ;
+}
+_GL_WARN_ON_USE (rpl_environ, "environ is unportable - "
+ "use gnulib module environ for portability");
+# undef environ
+# define environ (*rpl_environ ())
+# endif
+#endif
+
+
+#if @GNULIB_EUIDACCESS@
+# if !@HAVE_EUIDACCESS@
+/* Like access(), except that it uses the effective user id and group id of
+ the current process. */
+extern int euidaccess (const char *filename, int mode) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef euidaccess
+# if HAVE_RAW_DECL_EUIDACCESS
+_GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
+ "use gnulib module euidaccess for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FACCESSAT@
+# if !@HAVE_FACCESSAT@
+extern int faccessat (int fd, char const *file, int mode, int flag)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef faccessat
+# if HAVE_RAW_DECL_FACCESSAT
+_GL_WARN_ON_USE (faccessat, "faccessat is not portable - "
+ "use gnulib module faccessat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHDIR@
+# if @REPLACE_FCHDIR@
+/* Change the process' current working directory to the directory on which
+ the given file descriptor is open.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/fchdir.html>. */
+extern int fchdir (int /*fd*/);
+
+/* Gnulib internal hooks needed to maintain the fchdir metadata. */
+extern int _gl_register_fd (int fd, const char *filename)
+ _GL_ARG_NONNULL ((2));
+extern void _gl_unregister_fd (int fd);
+extern int _gl_register_dup (int oldfd, int newfd);
+extern const char *_gl_directory_name (int fd);
+
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fchdir
+# if HAVE_RAW_DECL_FCHDIR
+_GL_WARN_ON_USE (fchdir, "fchdir is unportable - "
+ "use gnulib module fchdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHOWNAT@
+# if @REPLACE_FCHOWNAT@
+# undef fchownat
+# define fchownat rpl_fchownat
+# endif
+# if !@HAVE_FCHOWNAT@ || @REPLACE_FCHOWNAT@
+extern int fchownat (int fd, char const *file, uid_t owner, gid_t group, int flag)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fchownat
+# if HAVE_RAW_DECL_FCHOWNAT
+_GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSYNC@
+/* Synchronize changes to a file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/fsync.html>. */
+# if !@HAVE_FSYNC@
+extern int fsync (int fd);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fsync
+# if HAVE_RAW_DECL_FSYNC
+_GL_WARN_ON_USE (fsync, "fsync is unportable - "
+ "use gnulib module fsync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FTRUNCATE@
+# if !@HAVE_FTRUNCATE@
+/* Change the size of the file to which FD is opened to become equal to LENGTH.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/ftruncate.html>. */
+extern int ftruncate (int fd, off_t length);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef ftruncate
+# if HAVE_RAW_DECL_FTRUNCATE
+_GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - "
+ "use gnulib module ftruncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETCWD@
+# if @REPLACE_GETCWD@
+/* Get the name of the current working directory, and put it in SIZE bytes
+ of BUF.
+ Return BUF if successful, or NULL if the directory couldn't be determined
+ or SIZE was too small.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/getcwd.html>.
+ Additionally, the gnulib module 'getcwd' guarantees the following GNU
+ extension: If BUF is NULL, an array is allocated with 'malloc'; the array
+ is SIZE bytes long, unless SIZE == 0, in which case it is as big as
+ necessary. */
+# define getcwd rpl_getcwd
+extern char * getcwd (char *buf, size_t size);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getcwd
+# if HAVE_RAW_DECL_GETCWD
+_GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
+ "use gnulib module getcwd for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDOMAINNAME@
+/* Return the NIS domain name of the machine.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+
+ Put up to LEN bytes of the NIS domain name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+# if !@HAVE_GETDOMAINNAME@
+extern int getdomainname(char *name, size_t len) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getdomainname
+# if HAVE_RAW_DECL_GETDOMAINNAME
+_GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - "
+ "use gnulib module getdomainname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDTABLESIZE@
+# if !@HAVE_GETDTABLESIZE@
+/* Return the maximum number of file descriptors in the current process.
+ In POSIX, this is same as sysconf (_SC_OPEN_MAX). */
+extern int getdtablesize (void);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getdtablesize
+# if HAVE_RAW_DECL_GETDTABLESIZE
+_GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - "
+ "use gnulib module getdtablesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETGROUPS@
+# if @REPLACE_GETGROUPS@
+# undef getgroups
+# define getgroups rpl_getgroups
+# endif
+# if !@HAVE_GETGROUPS@ || @REPLACE_GETGROUPS@
+/* Return the supplemental groups that the current process belongs to.
+ It is unspecified whether the effective group id is in the list.
+ If N is 0, return the group count; otherwise, N describes how many
+ entries are available in GROUPS. Return -1 and set errno if N is
+ not 0 and not large enough. Fails with ENOSYS on some systems. */
+int getgroups (int n, gid_t *groups);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getgroups
+# if HAVE_RAW_DECL_GETGROUPS
+_GL_WARN_ON_USE (getgroups, "getgroups is unportable - "
+ "use gnulib module getgroups for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETHOSTNAME@
+/* Return the standard host name of the machine.
+ WARNING! The host name may or may not be fully qualified.
+
+ Put up to LEN bytes of the host name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the host name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+# if @UNISTD_H_HAVE_WINSOCK2_H@
+# undef gethostname
+# define gethostname rpl_gethostname
+# endif
+# if @UNISTD_H_HAVE_WINSOCK2_H@ || !@HAVE_GETHOSTNAME@
+extern int gethostname(char *name, size_t len) _GL_ARG_NONNULL ((1));
+# endif
+#elif @UNISTD_H_HAVE_WINSOCK2_H@
+# undef gethostname
+# define gethostname gethostname_used_without_requesting_gnulib_module_gethostname
+#elif defined GNULIB_POSIXCHECK
+# undef gethostname
+# if HAVE_RAW_DECL_GETHOSTNAME
+_GL_WARN_ON_USE (gethostname, "gethostname is unportable - "
+ "use gnulib module gethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN@
+/* Returns the user's login name, or NULL if it cannot be found. Upon error,
+ returns NULL with errno set.
+
+ See <http://www.opengroup.org/susv3xsh/getlogin.html>.
+
+ Most programs don't need to use this function, because the information is
+ available through environment variables:
+ ${LOGNAME-$USER} on Unix platforms,
+ $USERNAME on native Windows platforms.
+ */
+# if !@HAVE_GETLOGIN@
+extern char *getlogin (void);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin
+# if HAVE_RAW_DECL_GETLOGIN
+_GL_WARN_ON_USE (getlogin, "getlogin is unportable - "
+ "use gnulib module getlogin for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN_R@
+/* Copies the user's login name to NAME.
+ The array pointed to by NAME has room for SIZE bytes.
+
+ Returns 0 if successful. Upon error, an error number is returned, or -1 in
+ the case that the login name cannot be found but no specific error is
+ provided (this case is hopefully rare but is left open by the POSIX spec).
+
+ See <http://www.opengroup.org/susv3xsh/getlogin.html>.
+
+ Most programs don't need to use this function, because the information is
+ available through environment variables:
+ ${LOGNAME-$USER} on Unix platforms,
+ $USERNAME on native Windows platforms.
+ */
+# if !@HAVE_DECL_GETLOGIN_R@
+extern int getlogin_r (char *name, size_t size) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin_r
+# if HAVE_RAW_DECL_GETLOGIN_R
+_GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - "
+ "use gnulib module getlogin_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPAGESIZE@
+# if @REPLACE_GETPAGESIZE@
+# define getpagesize rpl_getpagesize
+extern int getpagesize (void);
+# elif !@HAVE_GETPAGESIZE@
+/* This is for POSIX systems. */
+# if !defined getpagesize && defined _SC_PAGESIZE
+# if ! (defined __VMS && __VMS_VER < 70000000)
+# define getpagesize() sysconf (_SC_PAGESIZE)
+# endif
+# endif
+/* This is for older VMS. */
+# if !defined getpagesize && defined __VMS
+# ifdef __ALPHA
+# define getpagesize() 8192
+# else
+# define getpagesize() 512
+# endif
+# endif
+/* This is for BeOS. */
+# if !defined getpagesize && @HAVE_OS_H@
+# include <OS.h>
+# if defined B_PAGE_SIZE
+# define getpagesize() B_PAGE_SIZE
+# endif
+# endif
+/* This is for AmigaOS4.0. */
+# if !defined getpagesize && defined __amigaos4__
+# define getpagesize() 2048
+# endif
+/* This is for older Unix systems. */
+# if !defined getpagesize && @HAVE_SYS_PARAM_H@
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else
+# ifdef NBPG
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif
+# define getpagesize() (NBPG * CLSIZE)
+# else
+# ifdef NBPC
+# define getpagesize() NBPC
+# endif
+# endif
+# endif
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getpagesize
+# if HAVE_RAW_DECL_GETPAGESIZE
+_GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - "
+ "use gnulib module getpagesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETUSERSHELL@
+# if !@HAVE_GETUSERSHELL@
+/* Return the next valid login shell on the system, or NULL when the end of
+ the list has been reached. */
+extern char *getusershell (void);
+/* Rewind to pointer that is advanced at each getusershell() call. */
+extern void setusershell (void);
+/* Free the pointer that is advanced at each getusershell() call and
+ associated resources. */
+extern void endusershell (void);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getusershell
+# if HAVE_RAW_DECL_GETUSERSHELL
+_GL_WARN_ON_USE (getusershell, "getusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+# undef setusershell
+# if HAVE_RAW_DECL_SETUSERSHELL
+_GL_WARN_ON_USE (setusershell, "setusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+# undef endusershell
+# if HAVE_RAW_DECL_ENDUSERSHELL
+_GL_WARN_ON_USE (endusershell, "endusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LCHOWN@
+# if @REPLACE_LCHOWN@
+# undef lchown
+# define lchown rpl_lchown
+# endif
+# if !@HAVE_LCHOWN@ || @REPLACE_LCHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+ to GID (if GID is not -1). Do not follow symbolic links.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/lchown.html>. */
+extern int lchown (char const *file, uid_t owner, gid_t group)
+ _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef lchown
+# if HAVE_RAW_DECL_LCHOWN
+_GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - "
+ "use gnulib module lchown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINK@
+# if @REPLACE_LINK@
+# define link rpl_link
+# endif
+/* Create a new hard link for an existing file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/link.html>. */
+# if !@HAVE_LINK@ || @REPLACE_LINK@
+extern int link (const char *path1, const char *path2)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef link
+# if HAVE_RAW_DECL_LINK
+_GL_WARN_ON_USE (link, "link is unportable - "
+ "use gnulib module link for portability");
+# endif
+#endif
+
+#if @GNULIB_LINKAT@
+# if @REPLACE_LINKAT@
+# undef linkat
+# define linkat rpl_linkat
+# endif
+/* Create a new hard link for an existing file, relative to two
+ directories. FLAG controls whether symlinks are followed.
+ Return 0 if successful, otherwise -1 and errno set. */
+# if !@HAVE_LINKAT@ || @REPLACE_LINKAT@
+extern int linkat (int fd1, const char *path1, int fd2, const char *path2,
+ int flag)
+ _GL_ARG_NONNULL ((2, 4));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef linkat
+# if HAVE_RAW_DECL_LINKAT
+_GL_WARN_ON_USE (linkat, "linkat is unportable - "
+ "use gnulib module linkat for portability");
+# endif
+#endif
+
+#if @GNULIB_LSEEK@
+# if @REPLACE_LSEEK@
+/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
+ Return the new offset if successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/lseek.html>. */
+# define lseek rpl_lseek
+ extern off_t lseek (int fd, off_t offset, int whence);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef lseek
+# if HAVE_RAW_DECL_LSEEK
+_GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
+ "systems - use gnulib module lseek for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE2@
+/* Create a pipe, applying the given flags when opening the read-end of the
+ pipe and the write-end of the pipe.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ Store the read-end as fd[0] and the write-end as fd[1].
+ Return 0 upon success, or -1 with errno set upon failure.
+ See also the Linux man page at
+ <http://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>. */
+# if @HAVE_PIPE2@
+# define pipe2 rpl_pipe2
+# endif
+extern int pipe2 (int fd[2], int flags) _GL_ARG_NONNULL ((1));
+#elif defined GNULIB_POSIXCHECK
+# undef pipe2
+# if HAVE_RAW_DECL_PIPE2
+_GL_WARN_ON_USE (pipe2, "pipe2 is unportable - "
+ "use gnulib module pipe2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PREAD@
+# if @REPLACE_PREAD@
+# define pread rpl_pread
+# endif
+/* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET.
+ Return the number of bytes placed into BUF if successful, otherwise
+ set errno and return -1. 0 indicates EOF. See the POSIX:2001
+ specification <http://www.opengroup.org/susv3xsh/pread.html>. */
+# if !@HAVE_PREAD@ || @REPLACE_PREAD@
+ extern ssize_t pread (int fd, void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef pread
+# if HAVE_RAW_DECL_PREAD
+_GL_WARN_ON_USE (pread, "pread is unportable - "
+ "use gnulib module pread for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READLINK@
+# if @REPLACE_READLINK@
+# define readlink rpl_readlink
+# endif
+/* Read the contents of the symbolic link FILE and place the first BUFSIZE
+ bytes of it into BUF. Return the number of bytes placed into BUF if
+ successful, otherwise -1 and errno set.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/readlink.html>. */
+# if !@HAVE_READLINK@ || @REPLACE_READLINK@
+extern ssize_t readlink (const char *file, char *buf, size_t bufsize)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef readlink
+# if HAVE_RAW_DECL_READLINK
+_GL_WARN_ON_USE (readlink, "readlink is unportable - "
+ "use gnulib module readlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READLINKAT@
+# if !@HAVE_READLINKAT@
+extern ssize_t readlinkat (int fd, char const *file, char *buf, size_t len)
+ _GL_ARG_NONNULL ((2, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef readlinkat
+# if HAVE_RAW_DECL_READLINKAT
+_GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - "
+ "use gnulib module symlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RMDIR@
+# if @REPLACE_RMDIR@
+# define rmdir rpl_rmdir
+/* Remove the directory DIR. */
+extern int rmdir (char const *name) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rmdir
+# if HAVE_RAW_DECL_RMDIR
+_GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
+ "use gnulib module rmdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SLEEP@
+# if @REPLACE_SLEEP@
+# undef sleep
+# define sleep rpl_sleep
+# endif
+/* Pause the execution of the current thread for N seconds.
+ Returns the number of seconds left to sleep.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/sleep.html>. */
+# if !@HAVE_SLEEP@ || @REPLACE_SLEEP@
+extern unsigned int sleep (unsigned int n);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sleep
+# if HAVE_RAW_DECL_SLEEP
+_GL_WARN_ON_USE (sleep, "sleep is unportable - "
+ "use gnulib module sleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINK@
+# if @REPLACE_SYMLINK@
+# undef symlink
+# define symlink rpl_symlink
+# endif
+# if !@HAVE_SYMLINK@ || @REPLACE_SYMLINK@
+extern int symlink (char const *contents, char const *file)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef symlink
+# if HAVE_RAW_DECL_SYMLINK
+_GL_WARN_ON_USE (symlink, "symlink is not portable - "
+ "use gnulib module symlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINKAT@
+# if !@HAVE_SYMLINKAT@
+extern int symlinkat (char const *contents, int fd, char const *file)
+ _GL_ARG_NONNULL ((1, 3));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef symlinkat
+# if HAVE_RAW_DECL_SYMLINKAT
+_GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - "
+ "use gnulib module symlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINK@
+# if @REPLACE_UNLINK@
+# undef unlink
+# define unlink rpl_unlink
+extern int unlink (char const *file) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef unlink
+# if HAVE_RAW_DECL_UNLINK
+_GL_WARN_ON_USE (unlink, "unlink is not portable - "
+ "use gnulib module unlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINKAT@
+# if @REPLACE_UNLINKAT@
+# undef unlinkat
+# define unlinkat rpl_unlinkat
+# endif
+# if !@HAVE_UNLINKAT@ || @REPLACE_UNLINKAT@
+extern int unlinkat (int fd, char const *file, int flag) _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef unlinkat
+# if HAVE_RAW_DECL_UNLINKAT
+_GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_USLEEP@
+# if @REPLACE_USLEEP@
+# undef usleep
+# define usleep rpl_usleep
+# endif
+# if !@HAVE_USLEEP@ || @REPLACE_USLEEP@
+/* Pause the execution of the current thread for N microseconds.
+ Returns 0 on completion, or -1 on range error.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/sleep.html>. */
+extern int usleep (useconds_t n);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef usleep
+# if HAVE_RAW_DECL_USLEEP
+_GL_WARN_ON_USE (usleep, "usleep is unportable - "
+ "use gnulib module usleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_WRITE@ && @REPLACE_WRITE@ && @GNULIB_UNISTD_H_SIGPIPE@
+/* Write up to COUNT bytes starting at BUF to file descriptor FD.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/write.html>. */
+# undef write
+# define write rpl_write
+extern ssize_t write (int fd, const void *buf, size_t count)
+ _GL_ARG_NONNULL ((2));
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_UNISTD_H */
+#endif /* _GL_UNISTD_H */
diff --git a/gnulib/lib/unistdio.h b/gnulib/lib/unistdio.h
new file mode 100644
index 00000000..8eb69222
--- /dev/null
+++ b/gnulib/lib/unistdio.h
@@ -0,0 +1,256 @@
+/* Elementary Unicode string functions.
+ Copyright (C) 2002, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNISTDIO_H
+#define _UNISTDIO_H
+
+#include "unitypes.h"
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get FILE. */
+#include <stdio.h>
+
+/* Get va_list. */
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These 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 *).
+
+ The prefix (ulc_, u8_, u16_, u16_) indicates the type of the resulting
+ string. The prefix 'ulc' stands for "locale encoded".
+
+ 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.
+ */
+
+/* ASCII format string, result in locale dependent encoded 'char *'. */
+extern int
+ ulc_sprintf (char *buf,
+ const char *format, ...);
+extern int
+ ulc_snprintf (char *buf, size_t size,
+ const char *format, ...);
+extern int
+ ulc_asprintf (char **resultp,
+ const char *format, ...);
+extern char *
+ ulc_asnprintf (char *resultbuf, size_t *lengthp,
+ const char *format, ...);
+extern int
+ ulc_vsprintf (char *buf,
+ const char *format, va_list ap);
+extern int
+ ulc_vsnprintf (char *buf, size_t size,
+ const char *format, va_list ap);
+extern int
+ ulc_vasprintf (char **resultp,
+ const char *format, va_list ap);
+extern char *
+ ulc_vasnprintf (char *resultbuf, size_t *lengthp,
+ const char *format, va_list ap);
+
+/* ASCII format string, result in UTF-8 format. */
+extern int
+ u8_sprintf (uint8_t *buf,
+ const char *format, ...);
+extern int
+ u8_snprintf (uint8_t *buf, size_t size,
+ const char *format, ...);
+extern int
+ u8_asprintf (uint8_t **resultp,
+ const char *format, ...);
+extern uint8_t *
+ u8_asnprintf (uint8_t *resultbuf, size_t *lengthp,
+ const char *format, ...);
+extern int
+ u8_vsprintf (uint8_t *buf,
+ const char *format, va_list ap);
+extern int
+ u8_vsnprintf (uint8_t *buf, size_t size,
+ const char *format, va_list ap);
+extern int
+ u8_vasprintf (uint8_t **resultp,
+ const char *format, va_list ap);
+extern uint8_t *
+ u8_vasnprintf (uint8_t *resultbuf, size_t *lengthp,
+ const char *format, va_list ap);
+
+/* UTF-8 format string, result in UTF-8 format. */
+extern int
+ u8_u8_sprintf (uint8_t *buf,
+ const uint8_t *format, ...);
+extern int
+ u8_u8_snprintf (uint8_t *buf, size_t size,
+ const uint8_t *format, ...);
+extern int
+ u8_u8_asprintf (uint8_t **resultp,
+ const uint8_t *format, ...);
+extern uint8_t *
+ u8_u8_asnprintf (uint8_t *resultbuf, size_t *lengthp,
+ const uint8_t *format, ...);
+extern int
+ u8_u8_vsprintf (uint8_t *buf,
+ const uint8_t *format, va_list ap);
+extern int
+ u8_u8_vsnprintf (uint8_t *buf, size_t size,
+ const uint8_t *format, va_list ap);
+extern int
+ u8_u8_vasprintf (uint8_t **resultp,
+ const uint8_t *format, va_list ap);
+extern uint8_t *
+ u8_u8_vasnprintf (uint8_t *resultbuf, size_t *lengthp,
+ const uint8_t *format, va_list ap);
+
+/* ASCII format string, result in UTF-16 format. */
+extern int
+ u16_sprintf (uint16_t *buf,
+ const char *format, ...);
+extern int
+ u16_snprintf (uint16_t *buf, size_t size,
+ const char *format, ...);
+extern int
+ u16_asprintf (uint16_t **resultp,
+ const char *format, ...);
+extern uint16_t *
+ u16_asnprintf (uint16_t *resultbuf, size_t *lengthp,
+ const char *format, ...);
+extern int
+ u16_vsprintf (uint16_t *buf,
+ const char *format, va_list ap);
+extern int
+ u16_vsnprintf (uint16_t *buf, size_t size,
+ const char *format, va_list ap);
+extern int
+ u16_vasprintf (uint16_t **resultp,
+ const char *format, va_list ap);
+extern uint16_t *
+ u16_vasnprintf (uint16_t *resultbuf, size_t *lengthp,
+ const char *format, va_list ap);
+
+/* UTF-16 format string, result in UTF-16 format. */
+extern int
+ u16_u16_sprintf (uint16_t *buf,
+ const uint16_t *format, ...);
+extern int
+ u16_u16_snprintf (uint16_t *buf, size_t size,
+ const uint16_t *format, ...);
+extern int
+ u16_u16_asprintf (uint16_t **resultp,
+ const uint16_t *format, ...);
+extern uint16_t *
+ u16_u16_asnprintf (uint16_t *resultbuf, size_t *lengthp,
+ const uint16_t *format, ...);
+extern int
+ u16_u16_vsprintf (uint16_t *buf,
+ const uint16_t *format, va_list ap);
+extern int
+ u16_u16_vsnprintf (uint16_t *buf, size_t size,
+ const uint16_t *format, va_list ap);
+extern int
+ u16_u16_vasprintf (uint16_t **resultp,
+ const uint16_t *format, va_list ap);
+extern uint16_t *
+ u16_u16_vasnprintf (uint16_t *resultbuf, size_t *lengthp,
+ const uint16_t *format, va_list ap);
+
+/* ASCII format string, result in UTF-32 format. */
+extern int
+ u32_sprintf (uint32_t *buf,
+ const char *format, ...);
+extern int
+ u32_snprintf (uint32_t *buf, size_t size,
+ const char *format, ...);
+extern int
+ u32_asprintf (uint32_t **resultp,
+ const char *format, ...);
+extern uint32_t *
+ u32_asnprintf (uint32_t *resultbuf, size_t *lengthp,
+ const char *format, ...);
+extern int
+ u32_vsprintf (uint32_t *buf,
+ const char *format, va_list ap);
+extern int
+ u32_vsnprintf (uint32_t *buf, size_t size,
+ const char *format, va_list ap);
+extern int
+ u32_vasprintf (uint32_t **resultp,
+ const char *format, va_list ap);
+extern uint32_t *
+ u32_vasnprintf (uint32_t *resultbuf, size_t *lengthp,
+ const char *format, va_list ap);
+
+/* UTF-32 format string, result in UTF-32 format. */
+extern int
+ u32_u32_sprintf (uint32_t *buf,
+ const uint32_t *format, ...);
+extern int
+ u32_u32_snprintf (uint32_t *buf, size_t size,
+ const uint32_t *format, ...);
+extern int
+ u32_u32_asprintf (uint32_t **resultp,
+ const uint32_t *format, ...);
+extern uint32_t *
+ u32_u32_asnprintf (uint32_t *resultbuf, size_t *lengthp,
+ const uint32_t *format, ...);
+extern int
+ u32_u32_vsprintf (uint32_t *buf,
+ const uint32_t *format, va_list ap);
+extern int
+ u32_u32_vsnprintf (uint32_t *buf, size_t size,
+ const uint32_t *format, va_list ap);
+extern int
+ u32_u32_vasprintf (uint32_t **resultp,
+ const uint32_t *format, va_list ap);
+extern uint32_t *
+ u32_u32_vasnprintf (uint32_t *resultbuf, size_t *lengthp,
+ const uint32_t *format, va_list ap);
+
+/* ASCII format string, output to FILE in locale dependent encoding. */
+extern int
+ ulc_fprintf (FILE *stream,
+ const char *format, ...);
+extern int
+ ulc_vfprintf (FILE *stream,
+ const char *format, va_list ap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTDIO_H */
diff --git a/gnulib/lib/unistdio/u-asnprintf.h b/gnulib/lib/unistdio/u-asnprintf.h
new file mode 100644
index 00000000..693e35eb
--- /dev/null
+++ b/gnulib/lib/unistdio/u-asnprintf.h
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+DCHAR_T *
+ASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, const FCHAR_T *format, ...)
+{
+ va_list args;
+ DCHAR_T *result;
+
+ va_start (args, format);
+ result = VASNPRINTF (resultbuf, lengthp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/unistdio/u-asprintf.h b/gnulib/lib/unistdio/u-asprintf.h
new file mode 100644
index 00000000..b7f5cb29
--- /dev/null
+++ b/gnulib/lib/unistdio/u-asprintf.h
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+ASPRINTF (DCHAR_T **resultp, const FCHAR_T *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = VASPRINTF (resultp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/unistdio/u-printf-args.c b/gnulib/lib/unistdio/u-printf-args.c
new file mode 100644
index 00000000..b357f3c0
--- /dev/null
+++ b/gnulib/lib/unistdio/u-printf-args.c
@@ -0,0 +1,23 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-args.h"
+
+#include "printf-args.c"
diff --git a/gnulib/lib/unistdio/u-printf-args.h b/gnulib/lib/unistdio/u-printf-args.h
new file mode 100644
index 00000000..4e099fc9
--- /dev/null
+++ b/gnulib/lib/unistdio/u-printf-args.h
@@ -0,0 +1,28 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _U_PRINTF_ARGS_H
+#define _U_PRINTF_ARGS_H
+
+#include "unitypes.h"
+
+/* Parametrization of printf-args.h. */
+#define ENABLE_UNISTDIO 1
+#define PRINTF_FETCHARGS u_printf_fetchargs
+#include "printf-args.h"
+
+#endif /* _U_PRINTF_ARGS_H */
diff --git a/gnulib/lib/unistdio/u-printf-parse.h b/gnulib/lib/unistdio/u-printf-parse.h
new file mode 100644
index 00000000..0f593f82
--- /dev/null
+++ b/gnulib/lib/unistdio/u-printf-parse.h
@@ -0,0 +1,28 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002, 2005, 2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _U_PRINTF_PARSE_H
+#define _U_PRINTF_PARSE_H
+
+#include "unistdio/u-printf-args.h"
+
+/* Parametrization of printf-parse.h. */
+#undef ENABLE_UNISTDIO
+#define ENABLE_UNISTDIO 1
+#include "printf-parse.h"
+
+#endif /* _U_PRINTF_PARSE_H */
diff --git a/gnulib/lib/unistdio/u-snprintf.h b/gnulib/lib/unistdio/u-snprintf.h
new file mode 100644
index 00000000..391709ba
--- /dev/null
+++ b/gnulib/lib/unistdio/u-snprintf.h
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+SNPRINTF (DCHAR_T *buf, size_t size, const FCHAR_T *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = VSNPRINTF (buf, size, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/unistdio/u-sprintf.h b/gnulib/lib/unistdio/u-sprintf.h
new file mode 100644
index 00000000..94f3c820
--- /dev/null
+++ b/gnulib/lib/unistdio/u-sprintf.h
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+SPRINTF (DCHAR_T *buf, const FCHAR_T *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = VSPRINTF (buf, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/unistdio/u-vasprintf.h b/gnulib/lib/unistdio/u-vasprintf.h
new file mode 100644
index 00000000..e67c4cba
--- /dev/null
+++ b/gnulib/lib/unistdio/u-vasprintf.h
@@ -0,0 +1,35 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+VASPRINTF (DCHAR_T **resultp, const FCHAR_T *format, va_list args)
+{
+ size_t length;
+ DCHAR_T *result = VASNPRINTF (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ if (length > INT_MAX)
+ {
+ free (result);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ *resultp = result;
+ /* Return the number of resulting units, excluding the trailing NUL. */
+ return length;
+}
diff --git a/gnulib/lib/unistdio/u-vsnprintf.h b/gnulib/lib/unistdio/u-vsnprintf.h
new file mode 100644
index 00000000..2b2e0d57
--- /dev/null
+++ b/gnulib/lib/unistdio/u-vsnprintf.h
@@ -0,0 +1,52 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+VSNPRINTF (DCHAR_T *buf, size_t size, const FCHAR_T *format, va_list args)
+{
+ size_t length;
+ DCHAR_T *result;
+
+ if (size == 0)
+ buf = NULL;
+ else
+ length = size;
+ result = VASNPRINTF (buf, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ if (result != buf)
+ {
+ if (size != 0)
+ {
+ /* The result did not fit into the buffer. Copy the initial segment
+ into the buffer, truncating it if necessary. */
+ size_t n = (length < size ? length : size - 1);
+ DCHAR_CPY (buf, result, n);
+ buf[n] = '\0';
+ }
+ free (result);
+ }
+
+ if (length > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ /* Return the number of resulting units, excluding the trailing NUL. */
+ return length;
+}
diff --git a/gnulib/lib/unistdio/u-vsprintf.h b/gnulib/lib/unistdio/u-vsprintf.h
new file mode 100644
index 00000000..0caf0736
--- /dev/null
+++ b/gnulib/lib/unistdio/u-vsprintf.h
@@ -0,0 +1,58 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+int
+VSPRINTF (DCHAR_T *buf, const FCHAR_T *format, va_list args)
+{
+ /* Pass an infinite length. But note that *vasnprintf may fail if the buffer
+ argument is larger than INT_MAX (if that fits into a 'size_t' at all).
+ Also note that glibc's iconv fails with E2BIG when we pass a length that
+ is so large that buf + length wraps around, i.e.
+ (uintptr_t) (buf + length) < (uintptr_t) buf. */
+ size_t length;
+ DCHAR_T *result;
+
+ /* Set length = min (SIZE_MAX, INT_MAX, - (uintptr_t) buf - 1). */
+ length = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX);
+ if (length > (~ (uintptr_t) buf) / sizeof (DCHAR_T))
+ length = (~ (uintptr_t) buf) / sizeof (DCHAR_T);
+
+ result = VASNPRINTF (buf, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ /* The infinite buffer size guarantees that the result is not malloc()ed. */
+ if (result != buf)
+ {
+ /* length is near SIZE_MAX. */
+ free (result);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ if (length > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ /* Return the number of resulting units, excluding the trailing NUL. */
+ return length;
+}
diff --git a/gnulib/lib/unistdio/u16-asnprintf.c b/gnulib/lib/unistdio/u16-asnprintf.c
new file mode 100644
index 00000000..0705dd9e
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u16_asnprintf
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u16-asprintf.c b/gnulib/lib/unistdio/u16-asprintf.c
new file mode 100644
index 00000000..f7710bb8
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u16_asprintf
+#define VASPRINTF u16_vasprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u16-printf-parse.c b/gnulib/lib/unistdio/u16-printf-parse.c
new file mode 100644
index 00000000..fbc10831
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-printf-parse.c
@@ -0,0 +1,27 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-parse.h"
+
+#define PRINTF_PARSE u16_printf_parse
+#define CHAR_T uint16_t
+#define DIRECTIVE u16_directive
+#define DIRECTIVES u16_directives
+#include "printf-parse.c"
diff --git a/gnulib/lib/unistdio/u16-snprintf.c b/gnulib/lib/unistdio/u16-snprintf.c
new file mode 100644
index 00000000..c2b99a07
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u16_snprintf
+#define VSNPRINTF u16_vsnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u16-sprintf.c b/gnulib/lib/unistdio/u16-sprintf.c
new file mode 100644
index 00000000..b0e0799d
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u16_sprintf
+#define VSPRINTF u16_vsprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-asnprintf.c b/gnulib/lib/unistdio/u16-u16-asnprintf.c
new file mode 100644
index 00000000..bfb184ae
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u16_u16_asnprintf
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-asprintf.c b/gnulib/lib/unistdio/u16-u16-asprintf.c
new file mode 100644
index 00000000..84f1d665
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u16_u16_asprintf
+#define VASPRINTF u16_u16_vasprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-snprintf.c b/gnulib/lib/unistdio/u16-u16-snprintf.c
new file mode 100644
index 00000000..d1642e9e
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u16_u16_snprintf
+#define VSNPRINTF u16_u16_vsnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-sprintf.c b/gnulib/lib/unistdio/u16-u16-sprintf.c
new file mode 100644
index 00000000..58043672
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u16_u16_sprintf
+#define VSPRINTF u16_u16_vsprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-vasnprintf.c b/gnulib/lib/unistdio/u16-u16-vasnprintf.c
new file mode 100644
index 00000000..5c356bf8
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-vasnprintf.c
@@ -0,0 +1,50 @@
+/* Formatted output to UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DIRECTIVE u16_directive
+#define DIRECTIVES u16_directives
+#define PRINTF_PARSE u16_printf_parse
+#define DCHAR_T uint16_t
+#define DCHAR_T_IS_UINT16_T 1
+#define DCHAR_CPY u16_cpy
+#define DCHAR_SET u16_set
+#define DCHAR_MBSNLEN u16_mbsnlen
+#define DCHAR_IS_UINT16_T 1
+#define U8_TO_DCHAR u8_to_u16
+#define U32_TO_DCHAR u32_to_u16
+#define DCHAR_CONV_FROM_ENCODING u16_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u16-u16-vasprintf.c b/gnulib/lib/unistdio/u16-u16-vasprintf.c
new file mode 100644
index 00000000..6202a8bf
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u16_u16_vasprintf
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-vsnprintf.c b/gnulib/lib/unistdio/u16-u16-vsnprintf.c
new file mode 100644
index 00000000..2bf5c0ea
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u16_u16_vsnprintf
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#define DCHAR_CPY u16_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-vsprintf.c b/gnulib/lib/unistdio/u16-u16-vsprintf.c
new file mode 100644
index 00000000..b87f17e5
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u16_u16_vsprintf
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u16-vasnprintf.c b/gnulib/lib/unistdio/u16-vasnprintf.c
new file mode 100644
index 00000000..05d0adfc
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-vasnprintf.c
@@ -0,0 +1,51 @@
+/* Formatted output to UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#define ASCII_ONLY 1
+#define PRINTF_PARSE ulc_printf_parse
+#define DCHAR_T uint16_t
+#define DCHAR_T_IS_UINT16_T 1
+#define DCHAR_CPY u16_cpy
+#define DCHAR_SET u16_set
+#define DCHAR_MBSNLEN u16_mbsnlen
+#define DCHAR_IS_UINT16_T 1
+#define U8_TO_DCHAR u8_to_u16
+#define U32_TO_DCHAR u32_to_u16
+#define DCHAR_CONV_FROM_ENCODING u16_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u16-vasprintf.c b/gnulib/lib/unistdio/u16-vasprintf.c
new file mode 100644
index 00000000..f917f68f
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u16_vasprintf
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u16-vsnprintf.c b/gnulib/lib/unistdio/u16-vsnprintf.c
new file mode 100644
index 00000000..0b8bfce5
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u16_vsnprintf
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#define DCHAR_CPY u16_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u16-vsprintf.c b/gnulib/lib/unistdio/u16-vsprintf.c
new file mode 100644
index 00000000..7026a689
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u16_vsprintf
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u32-asnprintf.c b/gnulib/lib/unistdio/u32-asnprintf.c
new file mode 100644
index 00000000..c4eefd6b
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u32_asnprintf
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u32-asprintf.c b/gnulib/lib/unistdio/u32-asprintf.c
new file mode 100644
index 00000000..67730320
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u32_asprintf
+#define VASPRINTF u32_vasprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u32-printf-parse.c b/gnulib/lib/unistdio/u32-printf-parse.c
new file mode 100644
index 00000000..bc3c7f25
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-printf-parse.c
@@ -0,0 +1,27 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-parse.h"
+
+#define PRINTF_PARSE u32_printf_parse
+#define CHAR_T uint32_t
+#define DIRECTIVE u32_directive
+#define DIRECTIVES u32_directives
+#include "printf-parse.c"
diff --git a/gnulib/lib/unistdio/u32-snprintf.c b/gnulib/lib/unistdio/u32-snprintf.c
new file mode 100644
index 00000000..0636eef4
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u32_snprintf
+#define VSNPRINTF u32_vsnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u32-sprintf.c b/gnulib/lib/unistdio/u32-sprintf.c
new file mode 100644
index 00000000..207078bc
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u32_sprintf
+#define VSPRINTF u32_vsprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-asnprintf.c b/gnulib/lib/unistdio/u32-u32-asnprintf.c
new file mode 100644
index 00000000..bd37c808
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u32_u32_asnprintf
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-asprintf.c b/gnulib/lib/unistdio/u32-u32-asprintf.c
new file mode 100644
index 00000000..edc16e70
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u32_u32_asprintf
+#define VASPRINTF u32_u32_vasprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-snprintf.c b/gnulib/lib/unistdio/u32-u32-snprintf.c
new file mode 100644
index 00000000..a36c1239
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u32_u32_snprintf
+#define VSNPRINTF u32_u32_vsnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-sprintf.c b/gnulib/lib/unistdio/u32-u32-sprintf.c
new file mode 100644
index 00000000..eb322fc9
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u32_u32_sprintf
+#define VSPRINTF u32_u32_vsprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-vasnprintf.c b/gnulib/lib/unistdio/u32-u32-vasnprintf.c
new file mode 100644
index 00000000..17ae282c
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-vasnprintf.c
@@ -0,0 +1,50 @@
+/* Formatted output to UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DIRECTIVE u32_directive
+#define DIRECTIVES u32_directives
+#define PRINTF_PARSE u32_printf_parse
+#define DCHAR_T uint32_t
+#define DCHAR_T_IS_UINT32_T 1
+#define DCHAR_CPY u32_cpy
+#define DCHAR_SET u32_set
+#define DCHAR_MBSNLEN u32_mbsnlen
+#define DCHAR_IS_UINT32_T 1
+#define U8_TO_DCHAR u8_to_u32
+#define U16_TO_DCHAR u16_to_u32
+#define DCHAR_CONV_FROM_ENCODING u32_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u32-u32-vasprintf.c b/gnulib/lib/unistdio/u32-u32-vasprintf.c
new file mode 100644
index 00000000..678e2fd9
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u32_u32_vasprintf
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-vsnprintf.c b/gnulib/lib/unistdio/u32-u32-vsnprintf.c
new file mode 100644
index 00000000..c42678b7
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u32_u32_vsnprintf
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#define DCHAR_CPY u32_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-vsprintf.c b/gnulib/lib/unistdio/u32-u32-vsprintf.c
new file mode 100644
index 00000000..6a185987
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u32_u32_vsprintf
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u32-vasnprintf.c b/gnulib/lib/unistdio/u32-vasnprintf.c
new file mode 100644
index 00000000..86a3564a
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-vasnprintf.c
@@ -0,0 +1,51 @@
+/* Formatted output to UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#define ASCII_ONLY 1
+#define PRINTF_PARSE ulc_printf_parse
+#define DCHAR_T uint32_t
+#define DCHAR_T_IS_UINT32_T 1
+#define DCHAR_CPY u32_cpy
+#define DCHAR_SET u32_set
+#define DCHAR_MBSNLEN u32_mbsnlen
+#define DCHAR_IS_UINT32_T 1
+#define U8_TO_DCHAR u8_to_u32
+#define U16_TO_DCHAR u16_to_u32
+#define DCHAR_CONV_FROM_ENCODING u32_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u32-vasprintf.c b/gnulib/lib/unistdio/u32-vasprintf.c
new file mode 100644
index 00000000..ef4ed97d
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u32_vasprintf
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u32-vsnprintf.c b/gnulib/lib/unistdio/u32-vsnprintf.c
new file mode 100644
index 00000000..ba47a3c5
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u32_vsnprintf
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#define DCHAR_CPY u32_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u32-vsprintf.c b/gnulib/lib/unistdio/u32-vsprintf.c
new file mode 100644
index 00000000..26b1e959
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u32_vsprintf
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u8-asnprintf.c b/gnulib/lib/unistdio/u8-asnprintf.c
new file mode 100644
index 00000000..839e6e24
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u8_asnprintf
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u8-asprintf.c b/gnulib/lib/unistdio/u8-asprintf.c
new file mode 100644
index 00000000..8004b964
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u8_asprintf
+#define VASPRINTF u8_vasprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u8-printf-parse.c b/gnulib/lib/unistdio/u8-printf-parse.c
new file mode 100644
index 00000000..6b872991
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-printf-parse.c
@@ -0,0 +1,27 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-parse.h"
+
+#define PRINTF_PARSE u8_printf_parse
+#define CHAR_T uint8_t
+#define DIRECTIVE u8_directive
+#define DIRECTIVES u8_directives
+#include "printf-parse.c"
diff --git a/gnulib/lib/unistdio/u8-snprintf.c b/gnulib/lib/unistdio/u8-snprintf.c
new file mode 100644
index 00000000..ce0f7dec
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u8_snprintf
+#define VSNPRINTF u8_vsnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u8-sprintf.c b/gnulib/lib/unistdio/u8-sprintf.c
new file mode 100644
index 00000000..2467fbb3
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u8_sprintf
+#define VSPRINTF u8_vsprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-asnprintf.c b/gnulib/lib/unistdio/u8-u8-asnprintf.c
new file mode 100644
index 00000000..cdcd6c8f
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u8_u8_asnprintf
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-asprintf.c b/gnulib/lib/unistdio/u8-u8-asprintf.c
new file mode 100644
index 00000000..8e34f3d9
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u8_u8_asprintf
+#define VASPRINTF u8_u8_vasprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-snprintf.c b/gnulib/lib/unistdio/u8-u8-snprintf.c
new file mode 100644
index 00000000..615c5cbd
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u8_u8_snprintf
+#define VSNPRINTF u8_u8_vsnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-sprintf.c b/gnulib/lib/unistdio/u8-u8-sprintf.c
new file mode 100644
index 00000000..57c5642e
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u8_u8_sprintf
+#define VSPRINTF u8_u8_vsprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-vasnprintf.c b/gnulib/lib/unistdio/u8-u8-vasnprintf.c
new file mode 100644
index 00000000..588947da
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-vasnprintf.c
@@ -0,0 +1,50 @@
+/* Formatted output to UTF-8 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DIRECTIVE u8_directive
+#define DIRECTIVES u8_directives
+#define PRINTF_PARSE u8_printf_parse
+#define DCHAR_T uint8_t
+#define DCHAR_T_IS_UINT8_T 1
+#define DCHAR_CPY u8_cpy
+#define DCHAR_SET u8_set
+#define DCHAR_MBSNLEN u8_mbsnlen
+#define DCHAR_IS_UINT8_T 1
+#define U16_TO_DCHAR u16_to_u8
+#define U32_TO_DCHAR u32_to_u8
+#define DCHAR_CONV_FROM_ENCODING u8_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u8-u8-vasprintf.c b/gnulib/lib/unistdio/u8-u8-vasprintf.c
new file mode 100644
index 00000000..6a3732d0
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u8_u8_vasprintf
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-vsnprintf.c b/gnulib/lib/unistdio/u8-u8-vsnprintf.c
new file mode 100644
index 00000000..2ebb19ae
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u8_u8_vsnprintf
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#define DCHAR_CPY u8_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-vsprintf.c b/gnulib/lib/unistdio/u8-u8-vsprintf.c
new file mode 100644
index 00000000..ca4c656e
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u8_u8_vsprintf
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u8-vasnprintf.c b/gnulib/lib/unistdio/u8-vasnprintf.c
new file mode 100644
index 00000000..304c54c5
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-vasnprintf.c
@@ -0,0 +1,51 @@
+/* Formatted output to UTF-8 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#define ASCII_ONLY 1
+#define PRINTF_PARSE ulc_printf_parse
+#define DCHAR_T uint8_t
+#define DCHAR_T_IS_UINT8_T 1
+#define DCHAR_CPY u8_cpy
+#define DCHAR_SET u8_set
+#define DCHAR_MBSNLEN u8_mbsnlen
+#define DCHAR_IS_UINT8_T 1
+#define U16_TO_DCHAR u16_to_u8
+#define U32_TO_DCHAR u32_to_u8
+#define DCHAR_CONV_FROM_ENCODING u8_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u8-vasprintf.c b/gnulib/lib/unistdio/u8-vasprintf.c
new file mode 100644
index 00000000..5b7f719d
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u8_vasprintf
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u8-vsnprintf.c b/gnulib/lib/unistdio/u8-vsnprintf.c
new file mode 100644
index 00000000..4f6f1fa7
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u8_vsnprintf
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#define DCHAR_CPY u8_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u8-vsprintf.c b/gnulib/lib/unistdio/u8-vsprintf.c
new file mode 100644
index 00000000..7397d289
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u8_vsprintf
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-asnprintf.c b/gnulib/lib/unistdio/ulc-asnprintf.c
new file mode 100644
index 00000000..5a79c8ca
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF ulc_asnprintf
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-asprintf.c b/gnulib/lib/unistdio/ulc-asprintf.c
new file mode 100644
index 00000000..a97a3fef
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF ulc_asprintf
+#define VASPRINTF ulc_vasprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-fprintf.c b/gnulib/lib/unistdio/ulc-fprintf.c
new file mode 100644
index 00000000..383a1e39
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-fprintf.c
@@ -0,0 +1,74 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+ulc_fprintf (FILE *fp, const char *format, ...)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+ va_list args;
+
+ va_start (args, format);
+ output = ulc_vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/unistdio/ulc-printf-parse.c b/gnulib/lib/unistdio/ulc-printf-parse.c
new file mode 100644
index 00000000..a2e22b2a
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-printf-parse.c
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-parse.h"
+
+#define PRINTF_PARSE ulc_printf_parse
+#define CHAR_T char
+#define CHAR_T_ONLY_ASCII 1
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#include "printf-parse.c"
diff --git a/gnulib/lib/unistdio/ulc-snprintf.c b/gnulib/lib/unistdio/ulc-snprintf.c
new file mode 100644
index 00000000..9b57ada7
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF ulc_snprintf
+#define VSNPRINTF ulc_vsnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-sprintf.c b/gnulib/lib/unistdio/ulc-sprintf.c
new file mode 100644
index 00000000..a9f3c4ea
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF ulc_sprintf
+#define VSPRINTF ulc_vsprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-vasnprintf.c b/gnulib/lib/unistdio/ulc-vasnprintf.c
new file mode 100644
index 00000000..ef652b99
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vasnprintf.c
@@ -0,0 +1,47 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#define FCHAR_T_ONLY_ASCII 1
+#define PRINTF_PARSE ulc_printf_parse
+#define DCHAR_T char
+#define DCHAR_CPY memcpy
+#define DCHAR_SET memset
+#define DCHAR_MBSNLEN mbsnlen
+#define TCHAR_T char
+#define DCHAR_IS_TCHAR 1
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/ulc-vasprintf.c b/gnulib/lib/unistdio/ulc-vasprintf.c
new file mode 100644
index 00000000..24c77238
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF ulc_vasprintf
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-vfprintf.c b/gnulib/lib/unistdio/ulc-vfprintf.c
new file mode 100644
index 00000000..085e434e
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vfprintf.c
@@ -0,0 +1,71 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+ulc_vfprintf (FILE *fp, const char *format, va_list args)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+
+ output = ulc_vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/unistdio/ulc-vsnprintf.c b/gnulib/lib/unistdio/ulc-vsnprintf.c
new file mode 100644
index 00000000..7a43eb27
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define VSNPRINTF ulc_vsnprintf
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#define DCHAR_CPY memcpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-vsprintf.c b/gnulib/lib/unistdio/ulc-vsprintf.c
new file mode 100644
index 00000000..9b19a331
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF ulc_vsprintf
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistr.h b/gnulib/lib/unistr.h
new file mode 100644
index 00000000..26a3e33e
--- /dev/null
+++ b/gnulib/lib/unistr.h
@@ -0,0 +1,685 @@
+/* Elementary Unicode string functions.
+ Copyright (C) 2001-2002, 2005-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNISTR_H
+#define _UNISTR_H
+
+#include "unitypes.h"
+
+/* Get common macros for C. */
+#include "unused-parameter.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ All arguments starting with "str" and the arguments of functions starting
+ with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
+ which terminates at the first NUL unit. This termination unit is
+ considered part of the string for all memory allocation purposes, but
+ is not considered part of the string for all other logical purposes.
+
+ 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. */
+
+
+/* Elementary string checks. */
+
+/* Check whether an UTF-8 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint8_t *
+ u8_check (const uint8_t *s, size_t n);
+
+/* Check whether an UTF-16 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint16_t *
+ u16_check (const uint16_t *s, size_t n);
+
+/* Check whether an UCS-4 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint32_t *
+ u32_check (const uint32_t *s, size_t n);
+
+
+/* Elementary string conversions. */
+
+/* Convert an UTF-8 string to an UTF-16 string. */
+extern uint16_t *
+ u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-8 string to an UCS-4 string. */
+extern uint32_t *
+ u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-16 string to an UTF-8 string. */
+extern uint8_t *
+ u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-16 string to an UCS-4 string. */
+extern uint32_t *
+ u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-8 string. */
+extern uint8_t *
+ u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-16 string. */
+extern uint16_t *
+ u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
+ size_t *lengthp);
+
+
+/* Elementary string functions. */
+
+/* Return the length (number of units) of the first character in S, which is
+ no longer than N. Return 0 if it is the NUL character. Return -1 upon
+ failure. */
+/* Similar to mblen(), except that s must not be NULL. */
+extern int
+ u8_mblen (const uint8_t *s, size_t n);
+extern int
+ u16_mblen (const uint16_t *s, size_t n);
+extern int
+ u32_mblen (const uint32_t *s, size_t n);
+
+/* Return 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. */
+/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
+ and the NUL character is not treated specially. */
+/* The variants with _safe suffix are safe, even if the library is compiled
+ without --enable-safety. */
+
+#ifdef GNULIB_UNISTR_U8_MBTOUC_UNSAFE
+# if !HAVE_INLINE
+extern int
+ u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+ u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u8_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#ifdef GNULIB_UNISTR_U16_MBTOUC_UNSAFE
+# if !HAVE_INLINE
+extern int
+ u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+ u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u16_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#ifdef GNULIB_UNISTR_U32_MBTOUC_UNSAFE
+# if !HAVE_INLINE
+extern int
+ u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc_unsafe (ucs4_t *puc,
+ const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
+{
+ uint32_t c = *s;
+
+# if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+# endif
+ *puc = c;
+# if CONFIG_UNICODE_SAFETY
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+# endif
+ return 1;
+}
+# endif
+#endif
+
+#ifdef GNULIB_UNISTR_U8_MBTOUC
+# if !HAVE_INLINE
+extern int
+ u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+ u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u8_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#ifdef GNULIB_UNISTR_U16_MBTOUC
+# if !HAVE_INLINE
+extern int
+ u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+ u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u16_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#ifdef GNULIB_UNISTR_U32_MBTOUC
+# if !HAVE_INLINE
+extern int
+ u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
+{
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ *puc = c;
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+# endif
+#endif
+
+/* Return 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. */
+/* Similar to u*_mbtouc(), except that the return value gives more details
+ about the failure, similar to mbrtowc(). */
+
+#ifdef GNULIB_UNISTR_U8_MBTOUCR
+extern int
+ u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
+#endif
+
+#ifdef GNULIB_UNISTR_U16_MBTOUCR
+extern int
+ u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
+#endif
+
+#ifdef GNULIB_UNISTR_U32_MBTOUCR
+extern int
+ u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
+#endif
+
+/* Put the multibyte character represented by UC in S, returning its
+ length. Return -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. */
+/* Similar to wctomb(), except that s must not be NULL, and the argument n
+ must be specified. */
+
+#ifdef GNULIB_UNISTR_U8_UCTOMB
+/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr. */
+extern int
+ u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n);
+# if !HAVE_INLINE
+extern int
+ u8_uctomb (uint8_t *s, ucs4_t uc, int n);
+# else
+static inline int
+u8_uctomb (uint8_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0x80 && n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ else
+ return u8_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#ifdef GNULIB_UNISTR_U16_UCTOMB
+/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr. */
+extern int
+ u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n);
+# if !HAVE_INLINE
+extern int
+ u16_uctomb (uint16_t *s, ucs4_t uc, int n);
+# else
+static inline int
+u16_uctomb (uint16_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800 && n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ else
+ return u16_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#ifdef GNULIB_UNISTR_U32_UCTOMB
+# if !HAVE_INLINE
+extern int
+ u32_uctomb (uint32_t *s, ucs4_t uc, int n);
+# else
+static inline int
+u32_uctomb (uint32_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+ {
+ if (n > 0)
+ {
+ *s = uc;
+ return 1;
+ }
+ else
+ return -2;
+ }
+ else
+ return -1;
+}
+# endif
+#endif
+
+/* Copy N units from SRC to DEST. */
+/* Similar to memcpy(). */
+extern uint8_t *
+ u8_cpy (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_cpy (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_cpy (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Copy N units from SRC to DEST, guaranteeing correct behavior for
+ overlapping memory areas. */
+/* Similar to memmove(). */
+extern uint8_t *
+ u8_move (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_move (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_move (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Set the first N characters of S to UC. UC should be a character that
+ occupies only 1 unit. */
+/* Similar to memset(). */
+extern uint8_t *
+ u8_set (uint8_t *s, ucs4_t uc, size_t n);
+extern uint16_t *
+ u16_set (uint16_t *s, ucs4_t uc, size_t n);
+extern uint32_t *
+ u32_set (uint32_t *s, ucs4_t uc, size_t n);
+
+/* Compare S1 and S2, each of length N. */
+/* Similar to memcmp(). */
+extern int
+ u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n);
+extern int
+ u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n);
+extern int
+ u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n);
+
+/* Compare S1 and S2. */
+/* Similar to the gnulib function memcmp2(). */
+extern int
+ u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2);
+extern int
+ u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2);
+extern int
+ u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2);
+
+/* Search the string at S for UC. */
+/* Similar to memchr(). */
+extern uint8_t *
+ u8_chr (const uint8_t *s, size_t n, ucs4_t uc);
+extern uint16_t *
+ u16_chr (const uint16_t *s, size_t n, ucs4_t uc);
+extern uint32_t *
+ u32_chr (const uint32_t *s, size_t n, ucs4_t uc);
+
+/* Count the number of Unicode characters in the N units from S. */
+/* Similar to mbsnlen(). */
+extern size_t
+ u8_mbsnlen (const uint8_t *s, size_t n);
+extern size_t
+ u16_mbsnlen (const uint16_t *s, size_t n);
+extern size_t
+ u32_mbsnlen (const uint32_t *s, size_t n);
+
+/* Elementary string functions with memory allocation. */
+
+/* Make a freshly allocated copy of S, of length N. */
+extern uint8_t *
+ u8_cpy_alloc (const uint8_t *s, size_t n);
+extern uint16_t *
+ u16_cpy_alloc (const uint16_t *s, size_t n);
+extern uint32_t *
+ u32_cpy_alloc (const uint32_t *s, size_t n);
+
+/* Elementary string functions on NUL terminated strings. */
+
+/* Return the length (number of units) of the first character in S.
+ Return 0 if it is the NUL character. Return -1 upon failure. */
+extern int
+ u8_strmblen (const uint8_t *s);
+extern int
+ u16_strmblen (const uint16_t *s);
+extern int
+ u32_strmblen (const uint32_t *s);
+
+/* Return the length (number of units) of the first character in S, putting
+ its 'ucs4_t' representation in *PUC. Return 0 if it is the NUL
+ character. Return -1 upon failure. */
+extern int
+ u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
+extern int
+ u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
+extern int
+ u32_strmbtouc (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. */
+extern const uint8_t *
+ u8_next (ucs4_t *puc, const uint8_t *s);
+extern const uint16_t *
+ u16_next (ucs4_t *puc, const uint16_t *s);
+extern const uint32_t *
+ u32_next (ucs4_t *puc, const uint32_t *s);
+
+/* 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. */
+extern const uint8_t *
+ u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
+extern const uint16_t *
+ u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
+extern const uint32_t *
+ u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
+
+/* Return the number of units in S. */
+/* Similar to strlen(), wcslen(). */
+extern size_t
+ u8_strlen (const uint8_t *s);
+extern size_t
+ u16_strlen (const uint16_t *s);
+extern size_t
+ u32_strlen (const uint32_t *s);
+
+/* Return the number of units in S, but at most MAXLEN. */
+/* Similar to strnlen(), wcsnlen(). */
+extern size_t
+ u8_strnlen (const uint8_t *s, size_t maxlen);
+extern size_t
+ u16_strnlen (const uint16_t *s, size_t maxlen);
+extern size_t
+ u32_strnlen (const uint32_t *s, size_t maxlen);
+
+/* Copy SRC to DEST. */
+/* Similar to strcpy(), wcscpy(). */
+extern uint8_t *
+ u8_strcpy (uint8_t *dest, const uint8_t *src);
+extern uint16_t *
+ u16_strcpy (uint16_t *dest, const uint16_t *src);
+extern uint32_t *
+ u32_strcpy (uint32_t *dest, const uint32_t *src);
+
+/* Copy SRC to DEST, returning the address of the terminating NUL in DEST. */
+/* Similar to stpcpy(). */
+extern uint8_t *
+ u8_stpcpy (uint8_t *dest, const uint8_t *src);
+extern uint16_t *
+ u16_stpcpy (uint16_t *dest, const uint16_t *src);
+extern uint32_t *
+ u32_stpcpy (uint32_t *dest, const uint32_t *src);
+
+/* Copy no more than N units of SRC to DEST. */
+/* Similar to strncpy(), wcsncpy(). */
+extern uint8_t *
+ u8_strncpy (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_strncpy (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_strncpy (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Copy no more than N units of SRC to DEST. Return a pointer past the last
+ non-NUL unit written into DEST. */
+/* Similar to stpncpy(). */
+extern uint8_t *
+ u8_stpncpy (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_stpncpy (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_stpncpy (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Append SRC onto DEST. */
+/* Similar to strcat(), wcscat(). */
+extern uint8_t *
+ u8_strcat (uint8_t *dest, const uint8_t *src);
+extern uint16_t *
+ u16_strcat (uint16_t *dest, const uint16_t *src);
+extern uint32_t *
+ u32_strcat (uint32_t *dest, const uint32_t *src);
+
+/* Append no more than N units of SRC onto DEST. */
+/* Similar to strncat(), wcsncat(). */
+extern uint8_t *
+ u8_strncat (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_strncat (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_strncat (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Compare S1 and S2. */
+/* Similar to strcmp(), wcscmp(). */
+extern int
+ u8_strcmp (const uint8_t *s1, const uint8_t *s2);
+extern int
+ u16_strcmp (const uint16_t *s1, const uint16_t *s2);
+extern int
+ u32_strcmp (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare S1 and S2 using the collation rules of the current locale.
+ Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
+ Upon failure, set errno and return any value. */
+/* Similar to strcoll(), wcscoll(). */
+extern int
+ u8_strcoll (const uint8_t *s1, const uint8_t *s2);
+extern int
+ u16_strcoll (const uint16_t *s1, const uint16_t *s2);
+extern int
+ u32_strcoll (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare no more than N units of S1 and S2. */
+/* Similar to strncmp(), wcsncmp(). */
+extern int
+ u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n);
+extern int
+ u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n);
+extern int
+ u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n);
+
+/* Duplicate S, returning an identical malloc'd string. */
+/* Similar to strdup(), wcsdup(). */
+extern uint8_t *
+ u8_strdup (const uint8_t *s);
+extern uint16_t *
+ u16_strdup (const uint16_t *s);
+extern uint32_t *
+ u32_strdup (const uint32_t *s);
+
+/* Find the first occurrence of UC in STR. */
+/* Similar to strchr(), wcschr(). */
+extern uint8_t *
+ u8_strchr (const uint8_t *str, ucs4_t uc);
+extern uint16_t *
+ u16_strchr (const uint16_t *str, ucs4_t uc);
+extern uint32_t *
+ u32_strchr (const uint32_t *str, ucs4_t uc);
+
+/* Find the last occurrence of UC in STR. */
+/* Similar to strrchr(), wcsrchr(). */
+extern uint8_t *
+ u8_strrchr (const uint8_t *str, ucs4_t uc);
+extern uint16_t *
+ u16_strrchr (const uint16_t *str, ucs4_t uc);
+extern uint32_t *
+ u32_strrchr (const uint32_t *str, ucs4_t uc);
+
+/* Return the length of the initial segment of STR which consists entirely
+ of Unicode characters not in REJECT. */
+/* Similar to strcspn(), wcscspn(). */
+extern size_t
+ u8_strcspn (const uint8_t *str, const uint8_t *reject);
+extern size_t
+ u16_strcspn (const uint16_t *str, const uint16_t *reject);
+extern size_t
+ u32_strcspn (const uint32_t *str, const uint32_t *reject);
+
+/* Return the length of the initial segment of STR which consists entirely
+ of Unicode characters in ACCEPT. */
+/* Similar to strspn(), wcsspn(). */
+extern size_t
+ u8_strspn (const uint8_t *str, const uint8_t *accept);
+extern size_t
+ u16_strspn (const uint16_t *str, const uint16_t *accept);
+extern size_t
+ u32_strspn (const uint32_t *str, const uint32_t *accept);
+
+/* Find the first occurrence in STR of any character in ACCEPT. */
+/* Similar to strpbrk(), wcspbrk(). */
+extern uint8_t *
+ u8_strpbrk (const uint8_t *str, const uint8_t *accept);
+extern uint16_t *
+ u16_strpbrk (const uint16_t *str, const uint16_t *accept);
+extern uint32_t *
+ u32_strpbrk (const uint32_t *str, const uint32_t *accept);
+
+/* Find the first occurrence of NEEDLE in HAYSTACK. */
+/* Similar to strstr(), wcsstr(). */
+extern uint8_t *
+ u8_strstr (const uint8_t *haystack, const uint8_t *needle);
+extern uint16_t *
+ u16_strstr (const uint16_t *haystack, const uint16_t *needle);
+extern uint32_t *
+ u32_strstr (const uint32_t *haystack, const uint32_t *needle);
+
+/* Test whether STR starts with PREFIX. */
+extern bool
+ u8_startswith (const uint8_t *str, const uint8_t *prefix);
+extern bool
+ u16_startswith (const uint16_t *str, const uint16_t *prefix);
+extern bool
+ u32_startswith (const uint32_t *str, const uint32_t *prefix);
+
+/* Test whether STR ends with SUFFIX. */
+extern bool
+ u8_endswith (const uint8_t *str, const uint8_t *suffix);
+extern bool
+ u16_endswith (const uint16_t *str, const uint16_t *suffix);
+extern bool
+ u32_endswith (const uint32_t *str, const uint32_t *suffix);
+
+/* Divide STR into tokens separated by characters in DELIM.
+ This interface is actually more similar to wcstok than to strtok. */
+/* Similar to strtok_r(), wcstok(). */
+extern uint8_t *
+ u8_strtok (uint8_t *str, const uint8_t *delim, uint8_t **ptr);
+extern uint16_t *
+ u16_strtok (uint16_t *str, const uint16_t *delim, uint16_t **ptr);
+extern uint32_t *
+ u32_strtok (uint32_t *str, const uint32_t *delim, uint32_t **ptr);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTR_H */
diff --git a/gnulib/lib/unistr/u-cmp2.h b/gnulib/lib/unistr/u-cmp2.h
new file mode 100644
index 00000000..6058c4a5
--- /dev/null
+++ b/gnulib/lib/unistr/u-cmp2.h
@@ -0,0 +1,32 @@
+/* Compare pieces of UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2)
+{
+ int cmp = U_CMP (s1, s2, MIN (n1, n2));
+
+ if (cmp == 0)
+ {
+ if (n1 < n2)
+ cmp = -1;
+ else if (n1 > n2)
+ cmp = 1;
+ }
+
+ return cmp;
+}
diff --git a/gnulib/lib/unistr/u-cpy-alloc.h b/gnulib/lib/unistr/u-cpy-alloc.h
new file mode 100644
index 00000000..f36a8d03
--- /dev/null
+++ b/gnulib/lib/unistr/u-cpy-alloc.h
@@ -0,0 +1,40 @@
+/* Copy piece of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <string.h>
+
+UNIT *
+FUNC (const UNIT *s, size_t n)
+{
+ UNIT *dest;
+
+ dest = (UNIT *) malloc (n > 0 ? n * sizeof (UNIT) : 1);
+ if (dest != NULL)
+ {
+#if 0
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = *s++;
+#else
+ memcpy ((char *) dest, (const char *) s, n * sizeof (UNIT));
+#endif
+ }
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-cpy.h b/gnulib/lib/unistr/u-cpy.h
new file mode 100644
index 00000000..6dad9525
--- /dev/null
+++ b/gnulib/lib/unistr/u-cpy.h
@@ -0,0 +1,32 @@
+/* Copy piece of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <string.h>
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+#if 0
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = *src++;
+#else
+ memcpy ((char *) dest, (const char *) src, n * sizeof (UNIT));
+#endif
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-endswith.h b/gnulib/lib/unistr/u-endswith.h
new file mode 100644
index 00000000..094a87fb
--- /dev/null
+++ b/gnulib/lib/unistr/u-endswith.h
@@ -0,0 +1,28 @@
+/* Substring test for UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+bool
+FUNC (const UNIT *str, const UNIT *suffix)
+{
+ size_t len = U_STRLEN (str);
+ size_t suffixlen = U_STRLEN (suffix);
+
+ if (len >= suffixlen)
+ return (U_CMP (str + (len - suffixlen), suffix, suffixlen) == 0);
+ else
+ return false;
+}
diff --git a/gnulib/lib/unistr/u-move.h b/gnulib/lib/unistr/u-move.h
new file mode 100644
index 00000000..d8d58b0a
--- /dev/null
+++ b/gnulib/lib/unistr/u-move.h
@@ -0,0 +1,44 @@
+/* Copy piece of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <string.h>
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+#if 0
+ if (dest < src)
+ {
+ UNIT *destptr = dest;
+ const UNIT *srcptr = src;
+
+ for (; n > 0; n--)
+ *destptr++ = *srcptr++;
+ }
+ else if (dest > src)
+ {
+ UNIT *destptr = dest + n - 1;
+ const UNIT *srcptr = src + n - 1;
+
+ for (; n > 0; n--)
+ *destptr-- = *srcptr--;
+ }
+#else
+ memmove ((char *) dest, (const char *) src, n * sizeof (UNIT));
+#endif
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-set.h b/gnulib/lib/unistr/u-set.h
new file mode 100644
index 00000000..de78a8eb
--- /dev/null
+++ b/gnulib/lib/unistr/u-set.h
@@ -0,0 +1,39 @@
+/* Fill UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+
+UNIT *
+FUNC (UNIT *s, ucs4_t uc, size_t n)
+{
+ if (n > 0)
+ {
+ if (IS_SINGLE_UNIT (uc))
+ {
+ UNIT *ptr = s;
+
+ for (; n > 0; n--)
+ *ptr++ = uc;
+ }
+ else
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+ }
+ return s;
+}
diff --git a/gnulib/lib/unistr/u-startswith.h b/gnulib/lib/unistr/u-startswith.h
new file mode 100644
index 00000000..16966512
--- /dev/null
+++ b/gnulib/lib/unistr/u-startswith.h
@@ -0,0 +1,30 @@
+/* Substring test for UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+bool
+FUNC (const UNIT *str, const UNIT *prefix)
+{
+ for (;;)
+ {
+ UNIT uc1 = *str++;
+ UNIT uc2 = *prefix++;
+ if (uc2 == 0)
+ return true;
+ if (uc1 != uc2)
+ return false;
+ }
+}
diff --git a/gnulib/lib/unistr/u-stpcpy.h b/gnulib/lib/unistr/u-stpcpy.h
new file mode 100644
index 00000000..483f3c2a
--- /dev/null
+++ b/gnulib/lib/unistr/u-stpcpy.h
@@ -0,0 +1,24 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src)
+{
+ for (; (*dest = *src) != 0; src++, dest++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-stpncpy.h b/gnulib/lib/unistr/u-stpncpy.h
new file mode 100644
index 00000000..4d6dd3c7
--- /dev/null
+++ b/gnulib/lib/unistr/u-stpncpy.h
@@ -0,0 +1,34 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+ for (; n > 0 && (*dest = *src) != 0; src++, dest++, n--)
+ ;
+
+ /* This behavior is rarely useful, but it is here for consistency with
+ strncpy and wcsncpy. */
+ {
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = 0;
+ }
+
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strcat.h b/gnulib/lib/unistr/u-strcat.h
new file mode 100644
index 00000000..84430fc9
--- /dev/null
+++ b/gnulib/lib/unistr/u-strcat.h
@@ -0,0 +1,26 @@
+/* Concatenate UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src)
+{
+ UNIT *destptr = dest + U_STRLEN (dest);
+
+ for (; (*destptr = *src) != 0; src++, destptr++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strcoll.h b/gnulib/lib/unistr/u-strcoll.h
new file mode 100644
index 00000000..9ec5c601
--- /dev/null
+++ b/gnulib/lib/unistr/u-strcoll.h
@@ -0,0 +1,87 @@
+/* Compare UTF-8/UTF-16/UTF-32 strings using the collation rules of the current
+ locale.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, const UNIT *s2)
+{
+ /* When this function succeeds, it sets errno back to its original value.
+ When it fails, it sets errno, but also returns a meaningful return value,
+ for the sake of callers which ignore errno. */
+ int final_errno = errno;
+ char *sl1;
+ char *sl2;
+ int result;
+
+ sl1 = U_STRCONV_TO_LOCALE (s1);
+ if (sl1 != NULL)
+ {
+ sl2 = U_STRCONV_TO_LOCALE (s2);
+ if (sl2 != NULL)
+ {
+ /* Compare sl1 and sl2. */
+ errno = 0;
+ result = strcoll (sl1, sl2);
+ if (errno == 0)
+ {
+ /* strcoll succeeded. */
+ free (sl1);
+ free (sl2);
+ /* The conversion to locale encoding can do transliteration or
+ map some characters to question marks. Therefore sl1 and sl2
+ may be equal when s1 and s2 were in fact different. Return a
+ nonzero result in this case. */
+ if (result == 0)
+ result = U_STRCMP (s1, s2);
+ }
+ else
+ {
+ /* strcoll failed. */
+ final_errno = errno;
+ free (sl1);
+ free (sl2);
+ result = U_STRCMP (s1, s2);
+ }
+ }
+ else
+ {
+ /* s1 could be converted to locale encoding, s2 not. */
+ final_errno = errno;
+ free (sl1);
+ result = -1;
+ }
+ }
+ else
+ {
+ final_errno = errno;
+ sl2 = U_STRCONV_TO_LOCALE (s2);
+ if (sl2 != NULL)
+ {
+ /* s2 could be converted to locale encoding, s1 not. */
+ free (sl2);
+ result = 1;
+ }
+ else
+ {
+ /* Neither s1 nor s2 could be converted to locale encoding. */
+ result = U_STRCMP (s1, s2);
+ }
+ }
+
+ errno = final_errno;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u-strcpy.h b/gnulib/lib/unistr/u-strcpy.h
new file mode 100644
index 00000000..b059aea4
--- /dev/null
+++ b/gnulib/lib/unistr/u-strcpy.h
@@ -0,0 +1,26 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src)
+{
+ UNIT *destptr = dest;
+
+ for (; (*destptr = *src) != 0; src++, destptr++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strcspn.h b/gnulib/lib/unistr/u-strcspn.h
new file mode 100644
index 00000000..77b95508
--- /dev/null
+++ b/gnulib/lib/unistr/u-strcspn.h
@@ -0,0 +1,54 @@
+/* Search for some characters in UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+FUNC (const UNIT *str, const UNIT *reject)
+{
+ /* Optimize two cases. */
+ if (reject[0] == 0)
+ return U_STRLEN (str);
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, reject);
+ if (count >= 0 && reject[count] == 0)
+ {
+ const UNIT *found = U_STRCHR (str, uc);
+ if (found != NULL)
+ return found - str;
+ else
+ return U_STRLEN (str);
+ }
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+
+ for (;;)
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, ptr);
+ if (count == 0)
+ return ptr - str;
+ if (count < 0)
+ break;
+ if (U_STRCHR (reject, uc))
+ return ptr - str;
+ ptr += count;
+ }
+ return U_STRLEN (str);
+ }
+}
diff --git a/gnulib/lib/unistr/u-strdup.h b/gnulib/lib/unistr/u-strdup.h
new file mode 100644
index 00000000..a92e1efa
--- /dev/null
+++ b/gnulib/lib/unistr/u-strdup.h
@@ -0,0 +1,41 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <string.h>
+
+UNIT *
+FUNC (const UNIT *s)
+{
+ size_t n = U_STRLEN (s) + 1;
+ UNIT *dest;
+
+ dest = (UNIT *) malloc (n * sizeof (UNIT));
+ if (dest != NULL)
+ {
+#if 0
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = *s++;
+#else
+ memcpy ((char *) dest, (const char *) s, n * sizeof (UNIT));
+#endif
+ }
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strlen.h b/gnulib/lib/unistr/u-strlen.h
new file mode 100644
index 00000000..a54d614c
--- /dev/null
+++ b/gnulib/lib/unistr/u-strlen.h
@@ -0,0 +1,26 @@
+/* Determine length of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+FUNC (const UNIT *s)
+{
+ const UNIT *ptr;
+
+ for (ptr = s; *ptr != 0; ptr++)
+ ;
+ return ptr - s;
+}
diff --git a/gnulib/lib/unistr/u-strncat.h b/gnulib/lib/unistr/u-strncat.h
new file mode 100644
index 00000000..e5c9a045
--- /dev/null
+++ b/gnulib/lib/unistr/u-strncat.h
@@ -0,0 +1,28 @@
+/* Concatenate UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+ UNIT *destptr = dest + U_STRLEN (dest);
+
+ for (; n > 0 && (*destptr = *src) != 0; src++, destptr++, n--)
+ ;
+ if (n == 0)
+ *destptr = 0;
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strncpy.h b/gnulib/lib/unistr/u-strncpy.h
new file mode 100644
index 00000000..55a4f672
--- /dev/null
+++ b/gnulib/lib/unistr/u-strncpy.h
@@ -0,0 +1,32 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+ UNIT *destptr = dest;
+
+ for (; n > 0 && (*destptr = *src) != 0; src++, destptr++, n--)
+ ;
+
+ /* This behavior is rarely useful, but it is here for consistency with
+ strncpy and wcsncpy. */
+ for (; n > 0; n--)
+ *destptr++ = 0;
+
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strnlen.h b/gnulib/lib/unistr/u-strnlen.h
new file mode 100644
index 00000000..9bcc3da3
--- /dev/null
+++ b/gnulib/lib/unistr/u-strnlen.h
@@ -0,0 +1,26 @@
+/* Determine bounded length of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+FUNC (const UNIT *s, size_t maxlen)
+{
+ const UNIT *ptr;
+
+ for (ptr = s; maxlen > 0 && *ptr != 0; ptr++, maxlen--)
+ ;
+ return ptr - s;
+}
diff --git a/gnulib/lib/unistr/u-strpbrk.h b/gnulib/lib/unistr/u-strpbrk.h
new file mode 100644
index 00000000..34aabc53
--- /dev/null
+++ b/gnulib/lib/unistr/u-strpbrk.h
@@ -0,0 +1,46 @@
+/* Search for some characters in UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *str, const UNIT *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == 0)
+ return NULL;
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, accept);
+ if (count >= 0 && accept[count] == 0)
+ return U_STRCHR (str, uc);
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+
+ for (;;)
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, ptr);
+ if (count <= 0)
+ break;
+ if (U_STRCHR (accept, uc))
+ return (UNIT *) ptr;
+ ptr += count;
+ }
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u-strspn.h b/gnulib/lib/unistr/u-strspn.h
new file mode 100644
index 00000000..d6669af8
--- /dev/null
+++ b/gnulib/lib/unistr/u-strspn.h
@@ -0,0 +1,54 @@
+/* Search for some characters in UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+FUNC (const UNIT *str, const UNIT *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == 0)
+ return 0;
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, accept);
+ if (count >= 0 && accept[count] == 0)
+ {
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr += count)
+ if (U_CMP (ptr, accept, count) != 0)
+ break;
+ return ptr - str;
+ }
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+
+ for (;;)
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, ptr);
+ if (count == 0)
+ return ptr - str;
+ if (count < 0)
+ break;
+ if (!U_STRCHR (accept, uc))
+ return ptr - str;
+ ptr += count;
+ }
+ return U_STRLEN (str);
+ }
+}
diff --git a/gnulib/lib/unistr/u-strstr.h b/gnulib/lib/unistr/u-strstr.h
new file mode 100644
index 00000000..df32be8b
--- /dev/null
+++ b/gnulib/lib/unistr/u-strstr.h
@@ -0,0 +1,49 @@
+/* Substring test for UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *haystack, const UNIT *needle)
+{
+ UNIT first = needle[0];
+
+ /* Is needle empty? */
+ if (first == 0)
+ return (UNIT *) haystack;
+
+ /* Is needle nearly empty? */
+ if (needle[1] == 0)
+ return U_STRCHR (haystack, first);
+
+ /* Search for needle's first unit. */
+ for (; *haystack != 0; haystack++)
+ if (*haystack == first)
+ {
+ /* Compare with needle's remaining units. */
+ const UNIT *hptr = haystack + 1;
+ const UNIT *nptr = needle + 1;
+ for (;;)
+ {
+ if (*hptr != *nptr)
+ break;
+ hptr++; nptr++;
+ if (*nptr == 0)
+ return (UNIT *) haystack;
+ }
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u-strtok.h b/gnulib/lib/unistr/u-strtok.h
new file mode 100644
index 00000000..7fdef578
--- /dev/null
+++ b/gnulib/lib/unistr/u-strtok.h
@@ -0,0 +1,52 @@
+/* Tokenize UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *str, const UNIT *delim, UNIT **ptr)
+{
+ if (str == NULL)
+ {
+ str = *ptr;
+ if (str == NULL)
+ return NULL; /* reminder that end of token sequence has been reached */
+ }
+
+ /* Skip leading delimiters. */
+ str += U_STRSPN (str, delim);
+
+ /* Found a token? */
+ if (*str == 0)
+ {
+ *ptr = NULL;
+ return NULL;
+ }
+
+ /* Move past the token. */
+ {
+ UNIT *token_end = U_STRPBRK (str, delim);
+ if (token_end)
+ {
+ /* NUL-terminate the token. */
+ *token_end = 0;
+ *ptr = token_end + 1;
+ }
+ else
+ *ptr = NULL;
+ }
+
+ return str;
+}
diff --git a/gnulib/lib/unistr/u16-check.c b/gnulib/lib/unistr/u16-check.c
new file mode 100644
index 00000000..4f18383b
--- /dev/null
+++ b/gnulib/lib/unistr/u16-check.c
@@ -0,0 +1,51 @@
+/* Check UTF-16 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint16_t *
+u16_check (const uint16_t *s, size_t n)
+{
+ const uint16_t *s_end = s + n;
+
+ while (s < s_end)
+ {
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ s++;
+ continue;
+ }
+ if (c < 0xdc00)
+ {
+ if (s + 2 <= s_end
+ && s[1] >= 0xdc00 && s[1] < 0xe000)
+ {
+ s += 2;
+ continue;
+ }
+ }
+ /* invalid or incomplete multibyte character */
+ return s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u16-chr.c b/gnulib/lib/unistr/u16-chr.c
new file mode 100644
index 00000000..13deef4d
--- /dev/null
+++ b/gnulib/lib/unistr/u16-chr.c
@@ -0,0 +1,57 @@
+/* Search character in piece of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint16_t *
+u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
+{
+ uint16_t c[2];
+
+ if (uc < 0x10000)
+ {
+ uint16_t c0 = uc;
+
+ for (; n > 0; s++, n--)
+ {
+ if (*s == c0)
+ return (uint16_t *) s;
+ }
+ }
+ else
+ switch (u16_uctomb_aux (c, uc, 2))
+ {
+ case 2:
+ if (n > 1)
+ {
+ uint16_t c0 = c[0];
+ uint16_t c1 = c[1];
+
+ for (n--; n > 0; s++, n--)
+ {
+ if (*s == c0 && s[1] == c1)
+ return (uint16_t *) s;
+ }
+ }
+ break;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u16-cmp.c b/gnulib/lib/unistr/u16-cmp.c
new file mode 100644
index 00000000..b71c1c34
--- /dev/null
+++ b/gnulib/lib/unistr/u16-cmp.c
@@ -0,0 +1,54 @@
+/* Compare pieces of UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+{
+ /* Note that the UTF-16 encoding does NOT preserve lexicographic order.
+ Namely, if uc1 is a 16-bit character and [uc2a,uc2b] is a surrogate pair,
+ we must enforce uc1 < [uc2a,uc2b], even if uc1 > uc2a. */
+ for (; n > 0;)
+ {
+ uint16_t c1 = *s1++;
+ uint16_t c2 = *s2++;
+ if (c1 == c2)
+ {
+ n--;
+ continue;
+ }
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unistr/u16-cmp2.c b/gnulib/lib/unistr/u16-cmp2.c
new file mode 100644
index 00000000..8c2a8d6e
--- /dev/null
+++ b/gnulib/lib/unistr/u16-cmp2.c
@@ -0,0 +1,28 @@
+/* Compare pieces of UTF-16 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "minmax.h"
+
+#define FUNC u16_cmp2
+#define UNIT uint16_t
+#define U_CMP u16_cmp
+#include "u-cmp2.h"
diff --git a/gnulib/lib/unistr/u16-cpy-alloc.c b/gnulib/lib/unistr/u16-cpy-alloc.c
new file mode 100644
index 00000000..33984f9c
--- /dev/null
+++ b/gnulib/lib/unistr/u16-cpy-alloc.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_cpy_alloc
+#define UNIT uint16_t
+#include "u-cpy-alloc.h"
diff --git a/gnulib/lib/unistr/u16-cpy.c b/gnulib/lib/unistr/u16-cpy.c
new file mode 100644
index 00000000..614d24c4
--- /dev/null
+++ b/gnulib/lib/unistr/u16-cpy.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_cpy
+#define UNIT uint16_t
+#include "u-cpy.h"
diff --git a/gnulib/lib/unistr/u16-endswith.c b/gnulib/lib/unistr/u16-endswith.c
new file mode 100644
index 00000000..27dcd5aa
--- /dev/null
+++ b/gnulib/lib/unistr/u16-endswith.c
@@ -0,0 +1,27 @@
+/* Substring test for UTF-16 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_endswith
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#define U_CMP u16_cmp
+#include "u-endswith.h"
diff --git a/gnulib/lib/unistr/u16-mblen.c b/gnulib/lib/unistr/u16-mblen.c
new file mode 100644
index 00000000..9e7a93a1
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mblen.c
@@ -0,0 +1,50 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_mblen (const uint16_t *s, size_t n)
+{
+ if (n > 0)
+ {
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ return (c != 0 ? 1 : 0);
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+ {
+ if (n >= 2
+ && s[1] >= 0xdc00 && s[1] < 0xe000)
+ return 2;
+ }
+#else
+ {
+ if (n >= 2)
+ return 2;
+ }
+#endif
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u16-mbsnlen.c b/gnulib/lib/unistr/u16-mbsnlen.c
new file mode 100644
index 00000000..601d81d6
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbsnlen.c
@@ -0,0 +1,42 @@
+/* Count characters in UTF-16 string.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+size_t
+u16_mbsnlen (const uint16_t *s, size_t n)
+{
+ size_t characters;
+
+ characters = 0;
+ while (n > 0)
+ {
+ ucs4_t uc;
+ int count = u16_mbtoucr (&uc, s, n);
+ characters++;
+ if (count == -2)
+ break;
+ if (count <= 0)
+ count = 1;
+ s += count;
+ n -= count;
+ }
+ return characters;
+}
diff --git a/gnulib/lib/unistr/u16-mbtouc-aux.c b/gnulib/lib/unistr/u16-mbtouc-aux.c
new file mode 100644
index 00000000..bee77fcf
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtouc-aux.c
@@ -0,0 +1,51 @@
+/* Conversion UTF-16 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xdc00)
+ {
+ if (n >= 2)
+ {
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c b/gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c
new file mode 100644
index 00000000..f2d72259
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c
@@ -0,0 +1,55 @@
+/* Conversion UTF-16 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+#endif
+ {
+ if (n >= 2)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+#endif
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u16-mbtouc-unsafe.c b/gnulib/lib/unistr/u16-mbtouc-unsafe.c
new file mode 100644
index 00000000..a5a3638b
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtouc-unsafe.c
@@ -0,0 +1,66 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u16_mbtouc_unsafe as 'extern', not
+ 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+#endif
+ {
+ if (n >= 2)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+#endif
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u16-mbtouc.c b/gnulib/lib/unistr/u16-mbtouc.c
new file mode 100644
index 00000000..26b60890
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtouc.c
@@ -0,0 +1,61 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u16_mbtouc as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ if (c < 0xdc00)
+ {
+ if (n >= 2)
+ {
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u16-mbtoucr.c b/gnulib/lib/unistr/u16-mbtoucr.c
new file mode 100644
index 00000000..00b7b708
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtoucr.c
@@ -0,0 +1,54 @@
+/* Look at first character in UTF-16 string, returning an error code.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ if (c < 0xdc00)
+ {
+ if (n >= 2)
+ {
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u16-move.c b/gnulib/lib/unistr/u16-move.c
new file mode 100644
index 00000000..f6efb888
--- /dev/null
+++ b/gnulib/lib/unistr/u16-move.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_move
+#define UNIT uint16_t
+#include "u-move.h"
diff --git a/gnulib/lib/unistr/u16-next.c b/gnulib/lib/unistr/u16-next.c
new file mode 100644
index 00000000..8245f11a
--- /dev/null
+++ b/gnulib/lib/unistr/u16-next.c
@@ -0,0 +1,37 @@
+/* Iterate over next character in UTF-16 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint16_t *
+u16_next (ucs4_t *puc, const uint16_t *s)
+{
+ int count;
+
+ count = u16_strmbtouc (puc, s);
+ if (count > 0)
+ return s + count;
+ else
+ {
+ if (count < 0)
+ *puc = 0xfffd;
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u16-prev.c b/gnulib/lib/unistr/u16-prev.c
new file mode 100644
index 00000000..4c902ad2
--- /dev/null
+++ b/gnulib/lib/unistr/u16-prev.c
@@ -0,0 +1,53 @@
+/* Iterate over previous character in UTF-16 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint16_t *
+u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start)
+{
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ if (s != start)
+ {
+ uint16_t c_1 = s[-1];
+
+ if (c_1 < 0xd800 || c_1 >= 0xe000)
+ {
+ *puc = c_1;
+ return s - 1;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if (c_1 >= 0xdc00)
+#endif
+ if (s - 1 != start)
+ {
+ uint16_t c_2 = s[-2];
+
+#if CONFIG_UNICODE_SAFETY
+ if (c_2 >= 0xd800 && c_2 < 0xdc00)
+#endif
+ {
+ *puc = 0x10000 + ((c_2 - 0xd800) << 10) + (c_1 - 0xdc00);
+ return s - 2;
+ }
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u16-set.c b/gnulib/lib/unistr/u16-set.c
new file mode 100644
index 00000000..7bad3d61
--- /dev/null
+++ b/gnulib/lib/unistr/u16-set.c
@@ -0,0 +1,26 @@
+/* Fill UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_set
+#define UNIT uint16_t
+#define IS_SINGLE_UNIT(uc) (uc < 0xd800 || (uc < 0x10000 && uc >= 0xe000))
+#include "u-set.h"
diff --git a/gnulib/lib/unistr/u16-startswith.c b/gnulib/lib/unistr/u16-startswith.c
new file mode 100644
index 00000000..22a5d5fe
--- /dev/null
+++ b/gnulib/lib/unistr/u16-startswith.c
@@ -0,0 +1,25 @@
+/* Substring test for UTF-16 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_startswith
+#define UNIT uint16_t
+#include "u-startswith.h"
diff --git a/gnulib/lib/unistr/u16-stpcpy.c b/gnulib/lib/unistr/u16-stpcpy.c
new file mode 100644
index 00000000..59467f7a
--- /dev/null
+++ b/gnulib/lib/unistr/u16-stpcpy.c
@@ -0,0 +1,26 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_stpcpy
+#define UNIT uint16_t
+#include "u-stpcpy.h"
diff --git a/gnulib/lib/unistr/u16-stpncpy.c b/gnulib/lib/unistr/u16-stpncpy.c
new file mode 100644
index 00000000..49c616ef
--- /dev/null
+++ b/gnulib/lib/unistr/u16-stpncpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_stpncpy
+#define UNIT uint16_t
+#include "u-stpncpy.h"
diff --git a/gnulib/lib/unistr/u16-strcat.c b/gnulib/lib/unistr/u16-strcat.c
new file mode 100644
index 00000000..8b358683
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcat.c
@@ -0,0 +1,26 @@
+/* Concatenate UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strcat
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#include "u-strcat.h"
diff --git a/gnulib/lib/unistr/u16-strchr.c b/gnulib/lib/unistr/u16-strchr.c
new file mode 100644
index 00000000..1f8719fa
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strchr.c
@@ -0,0 +1,64 @@
+/* Search character in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint16_t *
+u16_strchr (const uint16_t *s, ucs4_t uc)
+{
+ uint16_t c[2];
+
+ if (uc < 0x10000)
+ {
+ uint16_t c0 = uc;
+
+ for (;; s++)
+ {
+ if (*s == c0)
+ break;
+ if (*s == 0)
+ goto notfound;
+ }
+ return (uint16_t *) s;
+ }
+ else
+ switch (u16_uctomb_aux (c, uc, 2))
+ {
+ case 2:
+ if (*s == 0)
+ goto notfound;
+ {
+ uint16_t c0 = c[0];
+ uint16_t c1 = c[1];
+
+ for (;; s++)
+ {
+ if (s[1] == 0)
+ goto notfound;
+ if (*s == c0 && s[1] == c1)
+ break;
+ }
+ return (uint16_t *) s;
+ }
+ }
+notfound:
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u16-strcmp.c b/gnulib/lib/unistr/u16-strcmp.c
new file mode 100644
index 00000000..b781211a
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcmp.c
@@ -0,0 +1,50 @@
+/* Compare UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_strcmp (const uint16_t *s1, const uint16_t *s2)
+{
+ /* Note that the UTF-16 encoding does NOT preserve lexicographic order.
+ Namely, if uc1 is a 16-bit character and [uc2a,uc2b] is a surrogate pair,
+ we must enforce uc1 < [uc2a,uc2b], even if uc1 > uc2a. */
+ for (;;)
+ {
+ uint16_t c1 = *s1++;
+ uint16_t c2 = *s2++;
+ if (c1 != 0 && c1 == c2)
+ continue;
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2. */
+ }
+}
diff --git a/gnulib/lib/unistr/u16-strcoll.c b/gnulib/lib/unistr/u16-strcoll.c
new file mode 100644
index 00000000..5a504bf4
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcoll.c
@@ -0,0 +1,33 @@
+/* Compare UTF-16 strings using the collation rules of the current locale.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uniconv.h"
+
+#define FUNC u16_strcoll
+#define UNIT uint16_t
+#define U_STRCMP u16_strcmp
+#define U_STRCONV_TO_LOCALE u16_strconv_to_locale
+#include "u-strcoll.h"
diff --git a/gnulib/lib/unistr/u16-strcpy.c b/gnulib/lib/unistr/u16-strcpy.c
new file mode 100644
index 00000000..ecde75da
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strcpy
+#define UNIT uint16_t
+#include "u-strcpy.h"
diff --git a/gnulib/lib/unistr/u16-strcspn.c b/gnulib/lib/unistr/u16-strcspn.c
new file mode 100644
index 00000000..b18bb374
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcspn.c
@@ -0,0 +1,28 @@
+/* Search for some characters in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strcspn
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#define U_STRMBTOUC u16_strmbtouc
+#define U_STRCHR u16_strchr
+#include "u-strcspn.h"
diff --git a/gnulib/lib/unistr/u16-strdup.c b/gnulib/lib/unistr/u16-strdup.c
new file mode 100644
index 00000000..4a944513
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strdup.c
@@ -0,0 +1,26 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strdup
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#include "u-strdup.h"
diff --git a/gnulib/lib/unistr/u16-strlen.c b/gnulib/lib/unistr/u16-strlen.c
new file mode 100644
index 00000000..da613c2e
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strlen.c
@@ -0,0 +1,25 @@
+/* Determine length of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strlen
+#define UNIT uint16_t
+#include "u-strlen.h"
diff --git a/gnulib/lib/unistr/u16-strmblen.c b/gnulib/lib/unistr/u16-strmblen.c
new file mode 100644
index 00000000..f07ca0b9
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strmblen.c
@@ -0,0 +1,44 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_strmblen (const uint16_t *s)
+{
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ return (c != 0 ? 1 : 0);
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+ {
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+ return 2;
+ }
+#else
+ if (s[1] != 0)
+ return 2;
+#endif
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u16-strmbtouc.c b/gnulib/lib/unistr/u16-strmbtouc.c
new file mode 100644
index 00000000..9aa5d43c
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strmbtouc.c
@@ -0,0 +1,51 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_strmbtouc (ucs4_t *puc, const uint16_t *s)
+{
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return (c != 0 ? 1 : 0);
+ }
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+#endif
+ {
+#if CONFIG_UNICODE_SAFETY
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+#else
+ if (s[1] != 0)
+#endif
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u16-strncat.c b/gnulib/lib/unistr/u16-strncat.c
new file mode 100644
index 00000000..70827160
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strncat.c
@@ -0,0 +1,26 @@
+/* Concatenate UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strncat
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#include "u-strncat.h"
diff --git a/gnulib/lib/unistr/u16-strncmp.c b/gnulib/lib/unistr/u16-strncmp.c
new file mode 100644
index 00000000..3ed59c37
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strncmp.c
@@ -0,0 +1,54 @@
+/* Compare UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+{
+ /* Note that the UTF-16 encoding does NOT preserve lexicographic order.
+ Namely, if uc1 is a 16-bit character and [uc2a,uc2b] is a surrogate pair,
+ we must enforce uc1 < [uc2a,uc2b], even if uc1 > uc2a. */
+ for (; n > 0;)
+ {
+ uint16_t c1 = *s1++;
+ uint16_t c2 = *s2++;
+ if (c1 != 0 && c1 == c2)
+ {
+ n--;
+ continue;
+ }
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2, = 0 if c1 and c2 are both 0. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unistr/u16-strncpy.c b/gnulib/lib/unistr/u16-strncpy.c
new file mode 100644
index 00000000..bd2eb6f6
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strncpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strncpy
+#define UNIT uint16_t
+#include "u-strncpy.h"
diff --git a/gnulib/lib/unistr/u16-strnlen.c b/gnulib/lib/unistr/u16-strnlen.c
new file mode 100644
index 00000000..49e6d58c
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strnlen.c
@@ -0,0 +1,25 @@
+/* Determine bounded length of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strnlen
+#define UNIT uint16_t
+#include "u-strnlen.h"
diff --git a/gnulib/lib/unistr/u16-strpbrk.c b/gnulib/lib/unistr/u16-strpbrk.c
new file mode 100644
index 00000000..45353fa0
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strpbrk.c
@@ -0,0 +1,27 @@
+/* Search for some characters in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strpbrk
+#define UNIT uint16_t
+#define U_STRMBTOUC u16_strmbtouc
+#define U_STRCHR u16_strchr
+#include "u-strpbrk.h"
diff --git a/gnulib/lib/unistr/u16-strrchr.c b/gnulib/lib/unistr/u16-strrchr.c
new file mode 100644
index 00000000..3cf3de2a
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strrchr.c
@@ -0,0 +1,65 @@
+/* Search character in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint16_t *
+u16_strrchr (const uint16_t *s, ucs4_t uc)
+{
+ /* Calling u16_strlen and then searching from the other end would cause more
+ memory accesses. Avoid that, at the cost of a few more comparisons. */
+ uint16_t *result = NULL;
+ uint16_t c[2];
+
+ if (uc < 0x10000)
+ {
+ uint16_t c0 = uc;
+
+ for (;; s++)
+ {
+ if (*s == c0)
+ result = (uint16_t *) s;
+ if (*s == 0)
+ break;
+ }
+ }
+ else
+ switch (u16_uctomb_aux (c, uc, 2))
+ {
+ case 2:
+ if (*s)
+ {
+ uint16_t c0 = c[0];
+ uint16_t c1 = c[1];
+
+ /* FIXME: Maybe walking the string via u16_mblen is a win? */
+ for (;; s++)
+ {
+ if (s[1] == 0)
+ break;
+ if (*s == c0 && s[1] == c1)
+ result = (uint16_t *) s;
+ }
+ }
+ break;
+ }
+ return result;
+}
diff --git a/gnulib/lib/unistr/u16-strspn.c b/gnulib/lib/unistr/u16-strspn.c
new file mode 100644
index 00000000..ab812ebc
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strspn.c
@@ -0,0 +1,29 @@
+/* Search for some characters in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strspn
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#define U_STRMBTOUC u16_strmbtouc
+#define U_CMP u16_cmp
+#define U_STRCHR u16_strchr
+#include "u-strspn.h"
diff --git a/gnulib/lib/unistr/u16-strstr.c b/gnulib/lib/unistr/u16-strstr.c
new file mode 100644
index 00000000..54a74d62
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strstr.c
@@ -0,0 +1,28 @@
+/* Substring test for UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+/* FIXME: Maybe walking the string via u16_mblen is a win? */
+
+#define FUNC u16_strstr
+#define UNIT uint16_t
+#define U_STRCHR u16_strchr
+#include "u-strstr.h"
diff --git a/gnulib/lib/unistr/u16-strtok.c b/gnulib/lib/unistr/u16-strtok.c
new file mode 100644
index 00000000..f84c4655
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strtok.c
@@ -0,0 +1,27 @@
+/* Tokenize UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strtok
+#define UNIT uint16_t
+#define U_STRSPN u16_strspn
+#define U_STRPBRK u16_strpbrk
+#include "u-strtok.h"
diff --git a/gnulib/lib/unistr/u16-to-u32.c b/gnulib/lib/unistr/u16-to-u32.c
new file mode 100644
index 00000000..3544cde3
--- /dev/null
+++ b/gnulib/lib/unistr/u16-to-u32.c
@@ -0,0 +1,125 @@
+/* Convert UTF-16 string to UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_to_u32
+#define SRC_UNIT uint16_t
+#define DST_UNIT uint32_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u16_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ if (length + 1 > allocated)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 1 > allocated)
+ allocated = length + 1;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ }
+ result[length++] = uc;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u16-to-u8.c b/gnulib/lib/unistr/u16-to-u8.c
new file mode 100644
index 00000000..f92cc930
--- /dev/null
+++ b/gnulib/lib/unistr/u16-to-u8.c
@@ -0,0 +1,136 @@
+/* Convert UTF-16 string to UTF-8 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_to_u8
+#define SRC_UNIT uint16_t
+#define DST_UNIT uint8_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u16_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 6 > allocated)
+ allocated = length + 6;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u16-uctomb-aux.c b/gnulib/lib/unistr/u16-uctomb-aux.c
new file mode 100644
index 00000000..e2acc9ee
--- /dev/null
+++ b/gnulib/lib/unistr/u16-uctomb-aux.c
@@ -0,0 +1,58 @@
+/* Conversion UCS-4 to UTF-16.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800)
+ {
+ /* The case n >= 1 is already handled by the caller. */
+ }
+ else if (uc < 0x10000)
+ {
+ if (uc >= 0xe000)
+ {
+ if (n >= 1)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ }
+ else
+ return -1;
+ }
+ else
+ {
+ if (uc < 0x110000)
+ {
+ if (n >= 2)
+ {
+ s[0] = 0xd800 + ((uc - 0x10000) >> 10);
+ s[1] = 0xdc00 + ((uc - 0x10000) & 0x3ff);
+ return 2;
+ }
+ }
+ else
+ return -1;
+ }
+ return -2;
+}
diff --git a/gnulib/lib/unistr/u16-uctomb.c b/gnulib/lib/unistr/u16-uctomb.c
new file mode 100644
index 00000000..cbc1abcf
--- /dev/null
+++ b/gnulib/lib/unistr/u16-uctomb.c
@@ -0,0 +1,72 @@
+/* Store a character in UTF-16 string.
+ Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u16_uctomb as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u16_uctomb (uint16_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800)
+ {
+ if (n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ /* else return -2, below. */
+ }
+ else if (uc < 0x10000)
+ {
+ if (uc >= 0xe000)
+ {
+ if (n >= 1)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ }
+ else
+ return -1;
+ }
+ else
+ {
+ if (uc < 0x110000)
+ {
+ if (n >= 2)
+ {
+ s[0] = 0xd800 + ((uc - 0x10000) >> 10);
+ s[1] = 0xdc00 + ((uc - 0x10000) & 0x3ff);
+ return 2;
+ }
+ }
+ else
+ return -1;
+ }
+ return -2;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u32-check.c b/gnulib/lib/unistr/u32-check.c
new file mode 100644
index 00000000..8c5f5180
--- /dev/null
+++ b/gnulib/lib/unistr/u32-check.c
@@ -0,0 +1,39 @@
+/* Check UTF-32 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint32_t *
+u32_check (const uint32_t *s, size_t n)
+{
+ const uint32_t *s_end = s + n;
+
+ while (s < s_end)
+ {
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ s++;
+ else
+ /* invalid Unicode character */
+ return s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u32-chr.c b/gnulib/lib/unistr/u32-chr.c
new file mode 100644
index 00000000..19002889
--- /dev/null
+++ b/gnulib/lib/unistr/u32-chr.c
@@ -0,0 +1,32 @@
+/* Search character in piece of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint32_t *
+u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
+{
+ for (; n > 0; s++, n--)
+ {
+ if (*s == uc)
+ return (uint32_t *) s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u32-cmp.c b/gnulib/lib/unistr/u32-cmp.c
new file mode 100644
index 00000000..36496f74
--- /dev/null
+++ b/gnulib/lib/unistr/u32-cmp.c
@@ -0,0 +1,40 @@
+/* Compare pieces of UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+{
+ for (; n > 0;)
+ {
+ uint32_t uc1 = *s1++;
+ uint32_t uc2 = *s2++;
+ if (uc1 == uc2)
+ {
+ n--;
+ continue;
+ }
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unistr/u32-cmp2.c b/gnulib/lib/unistr/u32-cmp2.c
new file mode 100644
index 00000000..32476025
--- /dev/null
+++ b/gnulib/lib/unistr/u32-cmp2.c
@@ -0,0 +1,28 @@
+/* Compare pieces of UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "minmax.h"
+
+#define FUNC u32_cmp2
+#define UNIT uint32_t
+#define U_CMP u32_cmp
+#include "u-cmp2.h"
diff --git a/gnulib/lib/unistr/u32-cpy-alloc.c b/gnulib/lib/unistr/u32-cpy-alloc.c
new file mode 100644
index 00000000..b9ebefe0
--- /dev/null
+++ b/gnulib/lib/unistr/u32-cpy-alloc.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_cpy_alloc
+#define UNIT uint32_t
+#include "u-cpy-alloc.h"
diff --git a/gnulib/lib/unistr/u32-cpy.c b/gnulib/lib/unistr/u32-cpy.c
new file mode 100644
index 00000000..747430be
--- /dev/null
+++ b/gnulib/lib/unistr/u32-cpy.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_cpy
+#define UNIT uint32_t
+#include "u-cpy.h"
diff --git a/gnulib/lib/unistr/u32-endswith.c b/gnulib/lib/unistr/u32-endswith.c
new file mode 100644
index 00000000..cee0d939
--- /dev/null
+++ b/gnulib/lib/unistr/u32-endswith.c
@@ -0,0 +1,27 @@
+/* Substring test for UTF-32 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_endswith
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#define U_CMP u32_cmp
+#include "u-endswith.h"
diff --git a/gnulib/lib/unistr/u32-mblen.c b/gnulib/lib/unistr/u32-mblen.c
new file mode 100644
index 00000000..4530fe42
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mblen.c
@@ -0,0 +1,37 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_mblen (const uint32_t *s, size_t n)
+{
+ if (n > 0)
+ {
+ uint32_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+#endif
+ return (c != 0 ? 1 : 0);
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u32-mbsnlen.c b/gnulib/lib/unistr/u32-mbsnlen.c
new file mode 100644
index 00000000..0a71293e
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mbsnlen.c
@@ -0,0 +1,27 @@
+/* Count characters in UTF-32 string.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+size_t
+u32_mbsnlen (const uint32_t *s, size_t n)
+{
+ return n;
+}
diff --git a/gnulib/lib/unistr/u32-mbtouc-unsafe.c b/gnulib/lib/unistr/u32-mbtouc-unsafe.c
new file mode 100644
index 00000000..8dbbfe45
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mbtouc-unsafe.c
@@ -0,0 +1,48 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u32_mbtouc_unsafe as 'extern', not
+ 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n)
+{
+ uint32_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+#endif
+ *puc = c;
+#if CONFIG_UNICODE_SAFETY
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+#endif
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u32-mbtouc.c b/gnulib/lib/unistr/u32-mbtouc.c
new file mode 100644
index 00000000..05f7c774
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mbtouc.c
@@ -0,0 +1,43 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u32_mbtouc as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n)
+{
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ *puc = c;
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u32-mbtoucr.c b/gnulib/lib/unistr/u32-mbtoucr.c
new file mode 100644
index 00000000..83f77820
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mbtoucr.c
@@ -0,0 +1,39 @@
+/* Look at first character in UTF-32 string, returning an error code.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n)
+{
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ {
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return -1;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-move.c b/gnulib/lib/unistr/u32-move.c
new file mode 100644
index 00000000..6362d853
--- /dev/null
+++ b/gnulib/lib/unistr/u32-move.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_move
+#define UNIT uint32_t
+#include "u-move.h"
diff --git a/gnulib/lib/unistr/u32-next.c b/gnulib/lib/unistr/u32-next.c
new file mode 100644
index 00000000..987fb027
--- /dev/null
+++ b/gnulib/lib/unistr/u32-next.c
@@ -0,0 +1,39 @@
+/* Iterate over next character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint32_t *
+u32_next (ucs4_t *puc, const uint32_t *s)
+{
+ int count;
+
+ count = u32_strmbtouc (puc, s);
+ if (count > 0)
+ return s + count;
+ else
+ {
+#if CONFIG_UNICODE_SAFETY
+ if (count < 0)
+ *puc = 0xfffd;
+#endif
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-prev.c b/gnulib/lib/unistr/u32-prev.c
new file mode 100644
index 00000000..f20b1b79
--- /dev/null
+++ b/gnulib/lib/unistr/u32-prev.c
@@ -0,0 +1,39 @@
+/* Iterate over previous character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint32_t *
+u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start)
+{
+ if (s != start)
+ {
+ uint32_t c_1 = s[-1];
+
+#if CONFIG_UNICODE_SAFETY
+ if (c_1 < 0xd800 || (c_1 >= 0xe000 && c_1 < 0x110000))
+#endif
+ {
+ *puc = c_1;
+ return s - 1;
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u32-set.c b/gnulib/lib/unistr/u32-set.c
new file mode 100644
index 00000000..5c517cd1
--- /dev/null
+++ b/gnulib/lib/unistr/u32-set.c
@@ -0,0 +1,26 @@
+/* Fill UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_set
+#define UNIT uint32_t
+#define IS_SINGLE_UNIT(uc) (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+#include "u-set.h"
diff --git a/gnulib/lib/unistr/u32-startswith.c b/gnulib/lib/unistr/u32-startswith.c
new file mode 100644
index 00000000..7fcb5979
--- /dev/null
+++ b/gnulib/lib/unistr/u32-startswith.c
@@ -0,0 +1,25 @@
+/* Substring test for UTF-32 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_startswith
+#define UNIT uint32_t
+#include "u-startswith.h"
diff --git a/gnulib/lib/unistr/u32-stpcpy.c b/gnulib/lib/unistr/u32-stpcpy.c
new file mode 100644
index 00000000..3cbfa924
--- /dev/null
+++ b/gnulib/lib/unistr/u32-stpcpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_stpcpy
+#define UNIT uint32_t
+#include "u-stpcpy.h"
diff --git a/gnulib/lib/unistr/u32-stpncpy.c b/gnulib/lib/unistr/u32-stpncpy.c
new file mode 100644
index 00000000..e55891e7
--- /dev/null
+++ b/gnulib/lib/unistr/u32-stpncpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_stpncpy
+#define UNIT uint32_t
+#include "u-stpncpy.h"
diff --git a/gnulib/lib/unistr/u32-strcat.c b/gnulib/lib/unistr/u32-strcat.c
new file mode 100644
index 00000000..4e26bb48
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcat.c
@@ -0,0 +1,26 @@
+/* Concatenate UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strcat
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#include "u-strcat.h"
diff --git a/gnulib/lib/unistr/u32-strchr.c b/gnulib/lib/unistr/u32-strchr.c
new file mode 100644
index 00000000..b5df7b7d
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strchr.c
@@ -0,0 +1,36 @@
+/* Search character in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint32_t *
+u32_strchr (const uint32_t *s, ucs4_t uc)
+{
+ for (;; s++)
+ {
+ if (*s == uc)
+ break;
+ if (*s == 0)
+ goto notfound;
+ }
+ return (uint32_t *) s;
+notfound:
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u32-strcmp.c b/gnulib/lib/unistr/u32-strcmp.c
new file mode 100644
index 00000000..5f336ce9
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcmp.c
@@ -0,0 +1,36 @@
+/* Compare UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_strcmp (const uint32_t *s1, const uint32_t *s2)
+{
+ for (;;)
+ {
+ uint32_t uc1 = *s1++;
+ uint32_t uc2 = *s2++;
+ if (uc1 != 0 && uc1 == uc2)
+ continue;
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2. */
+ }
+}
diff --git a/gnulib/lib/unistr/u32-strcoll.c b/gnulib/lib/unistr/u32-strcoll.c
new file mode 100644
index 00000000..97488553
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcoll.c
@@ -0,0 +1,33 @@
+/* Compare UTF-32 strings using the collation rules of the current locale.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uniconv.h"
+
+#define FUNC u32_strcoll
+#define UNIT uint32_t
+#define U_STRCMP u32_strcmp
+#define U_STRCONV_TO_LOCALE u32_strconv_to_locale
+#include "u-strcoll.h"
diff --git a/gnulib/lib/unistr/u32-strcpy.c b/gnulib/lib/unistr/u32-strcpy.c
new file mode 100644
index 00000000..f3c70e6c
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strcpy
+#define UNIT uint32_t
+#include "u-strcpy.h"
diff --git a/gnulib/lib/unistr/u32-strcspn.c b/gnulib/lib/unistr/u32-strcspn.c
new file mode 100644
index 00000000..595d32e9
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcspn.c
@@ -0,0 +1,51 @@
+/* Search for some characters in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strcspn
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#define U_STRCHR u32_strchr
+
+size_t
+FUNC (const UNIT *str, const UNIT *reject)
+{
+ /* Optimize two cases. */
+ if (reject[0] == 0)
+ return U_STRLEN (str);
+ if (reject[1] == 0)
+ {
+ ucs4_t uc = reject[0];
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (*ptr == uc)
+ break;
+ return ptr - str;
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (U_STRCHR (reject, *ptr))
+ break;
+ return ptr - str;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-strdup.c b/gnulib/lib/unistr/u32-strdup.c
new file mode 100644
index 00000000..da4cc5aa
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strdup.c
@@ -0,0 +1,26 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strdup
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#include "u-strdup.h"
diff --git a/gnulib/lib/unistr/u32-strlen.c b/gnulib/lib/unistr/u32-strlen.c
new file mode 100644
index 00000000..95d32abd
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strlen.c
@@ -0,0 +1,25 @@
+/* Determine length of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strlen
+#define UNIT uint32_t
+#include "u-strlen.h"
diff --git a/gnulib/lib/unistr/u32-strmblen.c b/gnulib/lib/unistr/u32-strmblen.c
new file mode 100644
index 00000000..54b78d7f
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strmblen.c
@@ -0,0 +1,36 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_strmblen (const uint32_t *s)
+{
+ uint32_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+#endif
+ return (c != 0 ? 1 : 0);
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/unistr/u32-strmbtouc.c b/gnulib/lib/unistr/u32-strmbtouc.c
new file mode 100644
index 00000000..4c067b9d
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strmbtouc.c
@@ -0,0 +1,39 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_strmbtouc (ucs4_t *puc, const uint32_t *s)
+{
+ uint32_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+#endif
+ {
+ *puc = c;
+ return (c != 0 ? 1 : 0);
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/unistr/u32-strncat.c b/gnulib/lib/unistr/u32-strncat.c
new file mode 100644
index 00000000..c9260b0f
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strncat.c
@@ -0,0 +1,26 @@
+/* Concatenate UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strncat
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#include "u-strncat.h"
diff --git a/gnulib/lib/unistr/u32-strncmp.c b/gnulib/lib/unistr/u32-strncmp.c
new file mode 100644
index 00000000..dcbb9352
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strncmp.c
@@ -0,0 +1,40 @@
+/* Compare UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+{
+ for (; n > 0;)
+ {
+ uint32_t uc1 = *s1++;
+ uint32_t uc2 = *s2++;
+ if (uc1 != 0 && uc1 == uc2)
+ {
+ n--;
+ continue;
+ }
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2, = 0 if uc1 and uc2 are both 0. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unistr/u32-strncpy.c b/gnulib/lib/unistr/u32-strncpy.c
new file mode 100644
index 00000000..9a54f97e
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strncpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strncpy
+#define UNIT uint32_t
+#include "u-strncpy.h"
diff --git a/gnulib/lib/unistr/u32-strnlen.c b/gnulib/lib/unistr/u32-strnlen.c
new file mode 100644
index 00000000..8102ac7f
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strnlen.c
@@ -0,0 +1,25 @@
+/* Determine bounded length of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strnlen
+#define UNIT uint32_t
+#include "u-strnlen.h"
diff --git a/gnulib/lib/unistr/u32-strpbrk.c b/gnulib/lib/unistr/u32-strpbrk.c
new file mode 100644
index 00000000..2c4b6bc8
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strpbrk.c
@@ -0,0 +1,50 @@
+/* Search for some characters in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strpbrk
+#define UNIT uint32_t
+#define U_STRCHR u32_strchr
+
+UNIT *
+FUNC (const UNIT *str, const UNIT *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == 0)
+ return NULL;
+ if (accept[1] == 0)
+ {
+ ucs4_t uc = accept[0];
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (*ptr == uc)
+ return (UNIT *) ptr;
+ return NULL;
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (U_STRCHR (accept, *ptr))
+ return (UNIT *) ptr;
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-strrchr.c b/gnulib/lib/unistr/u32-strrchr.c
new file mode 100644
index 00000000..f0030e5c
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strrchr.c
@@ -0,0 +1,38 @@
+/* Search character in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint32_t *
+u32_strrchr (const uint32_t *s, ucs4_t uc)
+{
+ /* Calling u32_strlen and then searching from the other end would cause more
+ memory accesses. Avoid that, at the cost of a few more comparisons. */
+ uint32_t *result = NULL;
+
+ for (;; s++)
+ {
+ if (*s == uc)
+ result = (uint32_t *) s;
+ if (*s == 0)
+ break;
+ }
+ return result;
+}
diff --git a/gnulib/lib/unistr/u32-strspn.c b/gnulib/lib/unistr/u32-strspn.c
new file mode 100644
index 00000000..e2571d5b
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strspn.c
@@ -0,0 +1,50 @@
+/* Search for some characters in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strspn
+#define UNIT uint32_t
+#define U_STRCHR u32_strchr
+
+size_t
+FUNC (const UNIT *str, const UNIT *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == 0)
+ return 0;
+ if (accept[1] == 0)
+ {
+ ucs4_t uc = accept[0];
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (*ptr != uc)
+ break;
+ return ptr - str;
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (!U_STRCHR (accept, *ptr))
+ break;
+ return ptr - str;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-strstr.c b/gnulib/lib/unistr/u32-strstr.c
new file mode 100644
index 00000000..cad06fcc
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strstr.c
@@ -0,0 +1,26 @@
+/* Substring test for UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strstr
+#define UNIT uint32_t
+#define U_STRCHR u32_strchr
+#include "u-strstr.h"
diff --git a/gnulib/lib/unistr/u32-strtok.c b/gnulib/lib/unistr/u32-strtok.c
new file mode 100644
index 00000000..067122f0
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strtok.c
@@ -0,0 +1,27 @@
+/* Tokenize UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strtok
+#define UNIT uint32_t
+#define U_STRSPN u32_strspn
+#define U_STRPBRK u32_strpbrk
+#include "u-strtok.h"
diff --git a/gnulib/lib/unistr/u32-to-u16.c b/gnulib/lib/unistr/u32-to-u16.c
new file mode 100644
index 00000000..be327703
--- /dev/null
+++ b/gnulib/lib/unistr/u32-to-u16.c
@@ -0,0 +1,130 @@
+/* Convert UTF-32 string to UTF-16 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_to_u16
+#define SRC_UNIT uint32_t
+#define DST_UNIT uint16_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ uc = *s++;
+ /* No need to call the safe variant u32_mbtouc, because
+ u16_uctomb will verify uc anyway. */
+
+ /* Store it in the output string. */
+ count = u16_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 2 > allocated)
+ allocated = length + 2;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u16_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u32-to-u8.c b/gnulib/lib/unistr/u32-to-u8.c
new file mode 100644
index 00000000..36710d3c
--- /dev/null
+++ b/gnulib/lib/unistr/u32-to-u8.c
@@ -0,0 +1,130 @@
+/* Convert UTF-32 string to UTF-8 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_to_u8
+#define SRC_UNIT uint32_t
+#define DST_UNIT uint8_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ uc = *s++;
+ /* No need to call the safe variant u32_mbtouc, because
+ u8_uctomb will verify uc anyway. */
+
+ /* Store it in the output string. */
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 6 > allocated)
+ allocated = length + 6;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u32-uctomb.c b/gnulib/lib/unistr/u32-uctomb.c
new file mode 100644
index 00000000..3ac58b43
--- /dev/null
+++ b/gnulib/lib/unistr/u32-uctomb.c
@@ -0,0 +1,47 @@
+/* Store a character in UTF-32 string.
+ Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u32_uctomb as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u32_uctomb (uint32_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+ {
+ if (n > 0)
+ {
+ *s = uc;
+ return 1;
+ }
+ else
+ return -2;
+ }
+ else
+ return -1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-check.c b/gnulib/lib/unistr/u8-check.c
new file mode 100644
index 00000000..368042b0
--- /dev/null
+++ b/gnulib/lib/unistr/u8-check.c
@@ -0,0 +1,105 @@
+/* Check UTF-8 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint8_t *
+u8_check (const uint8_t *s, size_t n)
+{
+ const uint8_t *s_end = s + n;
+
+ while (s < s_end)
+ {
+ /* Keep in sync with unistr.h and utf8-ucs4.c. */
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ s++;
+ continue;
+ }
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (s + 2 <= s_end
+ && (s[1] ^ 0x80) < 0x40)
+ {
+ s += 2;
+ continue;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (s + 3 <= s_end
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ s += 3;
+ continue;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (s + 4 <= s_end
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+ {
+ s += 4;
+ continue;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (s + 5 <= s_end
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+ {
+ s += 5;
+ continue;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (s + 6 <= s_end
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+ {
+ s += 6;
+ continue;
+ }
+ }
+#endif
+ }
+ /* invalid or incomplete multibyte character */
+ return s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u8-chr.c b/gnulib/lib/unistr/u8-chr.c
new file mode 100644
index 00000000..435d1be6
--- /dev/null
+++ b/gnulib/lib/unistr/u8-chr.c
@@ -0,0 +1,88 @@
+/* Search character in piece of UTF-8 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint8_t *
+u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
+{
+ uint8_t c[6];
+
+ if (uc < 0x80)
+ {
+ uint8_t c0 = uc;
+
+ for (; n > 0; s++, n--)
+ {
+ if (*s == c0)
+ return (uint8_t *) s;
+ }
+ }
+ else
+ switch (u8_uctomb_aux (c, uc, 6))
+ {
+ case 2:
+ if (n > 1)
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+
+ for (n--; n > 0; s++, n--)
+ {
+ if (*s == c0 && s[1] == c1)
+ return (uint8_t *) s;
+ }
+ }
+ break;
+
+ case 3:
+ if (n > 2)
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+
+ for (n -= 2; n > 0; s++, n--)
+ {
+ if (*s == c0 && s[1] == c1 && s[2] == c2)
+ return (uint8_t *) s;
+ }
+ }
+ break;
+
+ case 4:
+ if (n > 3)
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+ uint8_t c3 = c[3];
+
+ for (n -= 3; n > 0; s++, n--)
+ {
+ if (*s == c0 && s[1] == c1 && s[2] == c2 && s[3] == c3)
+ return (uint8_t *) s;
+ }
+ }
+ break;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u8-cmp.c b/gnulib/lib/unistr/u8-cmp.c
new file mode 100644
index 00000000..d021b1ab
--- /dev/null
+++ b/gnulib/lib/unistr/u8-cmp.c
@@ -0,0 +1,30 @@
+/* Compare pieces of UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+int
+u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+{
+ /* Use the fact that the UTF-8 encoding preserves lexicographic order. */
+ return memcmp ((const char *) s1, (const char *) s2, n);
+}
diff --git a/gnulib/lib/unistr/u8-cmp2.c b/gnulib/lib/unistr/u8-cmp2.c
new file mode 100644
index 00000000..8a97db40
--- /dev/null
+++ b/gnulib/lib/unistr/u8-cmp2.c
@@ -0,0 +1,28 @@
+/* Compare pieces of UTF-8 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "minmax.h"
+
+#define FUNC u8_cmp2
+#define UNIT uint8_t
+#define U_CMP u8_cmp
+#include "u-cmp2.h"
diff --git a/gnulib/lib/unistr/u8-cpy-alloc.c b/gnulib/lib/unistr/u8-cpy-alloc.c
new file mode 100644
index 00000000..18845165
--- /dev/null
+++ b/gnulib/lib/unistr/u8-cpy-alloc.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_cpy_alloc
+#define UNIT uint8_t
+#include "u-cpy-alloc.h"
diff --git a/gnulib/lib/unistr/u8-cpy.c b/gnulib/lib/unistr/u8-cpy.c
new file mode 100644
index 00000000..2f29200e
--- /dev/null
+++ b/gnulib/lib/unistr/u8-cpy.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_cpy
+#define UNIT uint8_t
+#include "u-cpy.h"
diff --git a/gnulib/lib/unistr/u8-endswith.c b/gnulib/lib/unistr/u8-endswith.c
new file mode 100644
index 00000000..833b3e18
--- /dev/null
+++ b/gnulib/lib/unistr/u8-endswith.c
@@ -0,0 +1,27 @@
+/* Substring test for UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_endswith
+#define UNIT uint8_t
+#define U_STRLEN u8_strlen
+#define U_CMP u8_cmp
+#include "u-endswith.h"
diff --git a/gnulib/lib/unistr/u8-mblen.c b/gnulib/lib/unistr/u8-mblen.c
new file mode 100644
index 00000000..f6a20271
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mblen.c
@@ -0,0 +1,99 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_mblen (const uint8_t *s, size_t n)
+{
+ if (n > 0)
+ {
+ /* Keep in sync with unistr.h and utf8-ucs4.c. */
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ return (c != 0 ? 1 : 0);
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40
+#endif
+ )
+ return 2;
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0)
+#endif
+ )
+ return 3;
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+#endif
+ )
+ return 4;
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88)
+#endif
+ )
+ return 5;
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84)
+#endif
+ )
+ return 6;
+ }
+#endif
+ }
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u8-mbsnlen.c b/gnulib/lib/unistr/u8-mbsnlen.c
new file mode 100644
index 00000000..9ddc42ea
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbsnlen.c
@@ -0,0 +1,42 @@
+/* Count characters in UTF-8 string.
+ Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+size_t
+u8_mbsnlen (const uint8_t *s, size_t n)
+{
+ size_t characters;
+
+ characters = 0;
+ while (n > 0)
+ {
+ ucs4_t uc;
+ int count = u8_mbtoucr (&uc, s, n);
+ characters++;
+ if (count == -2)
+ break;
+ if (count <= 0)
+ count = 1;
+ s += count;
+ n -= count;
+ }
+ return characters;
+}
diff --git a/gnulib/lib/unistr/u8-mbtouc-aux.c b/gnulib/lib/unistr/u8-mbtouc-aux.c
new file mode 100644
index 00000000..c9975896
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtouc-aux.c
@@ -0,0 +1,158 @@
+/* Conversion UTF-8 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5)
+ {
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6)
+ {
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c b/gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c
new file mode 100644
index 00000000..47590e39
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c
@@ -0,0 +1,168 @@
+/* Conversion UTF-8 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-mbtouc-unsafe.c b/gnulib/lib/unistr/u8-mbtouc-unsafe.c
new file mode 100644
index 00000000..41583f96
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtouc-unsafe.c
@@ -0,0 +1,179 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_mbtouc_unsafe as 'extern', not
+ 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-mbtouc.c b/gnulib/lib/unistr/u8-mbtouc.c
new file mode 100644
index 00000000..96cd5b74
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtouc.c
@@ -0,0 +1,168 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_mbtouc as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5)
+ {
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6)
+ {
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-mbtoucr.c b/gnulib/lib/unistr/u8-mbtoucr.c
new file mode 100644
index 00000000..a749c48c
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtoucr.c
@@ -0,0 +1,285 @@
+/* Look at first character in UTF-8 string, returning an error code.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ if (n >= 3)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+ {
+ if (n >= 3)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if (n >= 4)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+ {
+ if (n >= 3)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if (n >= 4)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if (n >= 5)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+ {
+ if (n >= 3)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if (n >= 4)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if (n >= 5)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if (n >= 6)
+ {
+ if ((s[5] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u8-move.c b/gnulib/lib/unistr/u8-move.c
new file mode 100644
index 00000000..5c48411b
--- /dev/null
+++ b/gnulib/lib/unistr/u8-move.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_move
+#define UNIT uint8_t
+#include "u-move.h"
diff --git a/gnulib/lib/unistr/u8-next.c b/gnulib/lib/unistr/u8-next.c
new file mode 100644
index 00000000..34249aa5
--- /dev/null
+++ b/gnulib/lib/unistr/u8-next.c
@@ -0,0 +1,37 @@
+/* Iterate over next character in UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint8_t *
+u8_next (ucs4_t *puc, const uint8_t *s)
+{
+ int count;
+
+ count = u8_strmbtouc (puc, s);
+ if (count > 0)
+ return s + count;
+ else
+ {
+ if (count < 0)
+ *puc = 0xfffd;
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u8-prev.c b/gnulib/lib/unistr/u8-prev.c
new file mode 100644
index 00000000..97a27f55
--- /dev/null
+++ b/gnulib/lib/unistr/u8-prev.c
@@ -0,0 +1,93 @@
+/* Iterate over previous character in UTF-8 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint8_t *
+u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start)
+{
+ /* Keep in sync with unistr.h and utf8-ucs4.c. */
+ if (s != start)
+ {
+ uint8_t c_1 = s[-1];
+
+ if (c_1 < 0x80)
+ {
+ *puc = c_1;
+ return s - 1;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if ((c_1 ^ 0x80) < 0x40)
+#endif
+ if (s - 1 != start)
+ {
+ uint8_t c_2 = s[-2];
+
+ if (c_2 >= 0xc2 && c_2 < 0xe0)
+ {
+ *puc = ((unsigned int) (c_2 & 0x1f) << 6)
+ | (unsigned int) (c_1 ^ 0x80);
+ return s - 2;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if ((c_2 ^ 0x80) < 0x40)
+#endif
+ if (s - 2 != start)
+ {
+ uint8_t c_3 = s[-3];
+
+ if (c_3 >= 0xe0 && c_3 < 0xf0
+#if CONFIG_UNICODE_SAFETY
+ && (c_3 >= 0xe1 || c_2 >= 0xa0)
+ && (c_3 != 0xed || c_2 < 0xa0)
+#endif
+ )
+ {
+ *puc = ((unsigned int) (c_3 & 0x0f) << 12)
+ | ((unsigned int) (c_2 ^ 0x80) << 6)
+ | (unsigned int) (c_1 ^ 0x80);
+ return s - 3;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if ((c_3 ^ 0x80) < 0x40)
+#endif
+ if (s - 3 != start)
+ {
+ uint8_t c_4 = s[-4];
+
+ if (c_4 >= 0xf0 && c_4 < 0xf8
+#if CONFIG_UNICODE_SAFETY
+ && (c_4 >= 0xf1 || c_3 >= 0x90)
+ && (c_4 < 0xf4 || (c_4 == 0xf4 && c_3 < 0x90))
+#endif
+ )
+ {
+ *puc = ((unsigned int) (c_4 & 0x07) << 18)
+ | ((unsigned int) (c_3 ^ 0x80) << 12)
+ | ((unsigned int) (c_2 ^ 0x80) << 6)
+ | (unsigned int) (c_1 ^ 0x80);
+ return s - 4;
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u8-set.c b/gnulib/lib/unistr/u8-set.c
new file mode 100644
index 00000000..3cca23b2
--- /dev/null
+++ b/gnulib/lib/unistr/u8-set.c
@@ -0,0 +1,44 @@
+/* Fill UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_set
+#define UNIT uint8_t
+#define IS_SINGLE_UNIT(uc) (uc < 0x80)
+
+#include <errno.h>
+#include <string.h>
+
+UNIT *
+FUNC (UNIT *s, ucs4_t uc, size_t n)
+{
+ if (n > 0)
+ {
+ if (IS_SINGLE_UNIT (uc))
+ memset ((char *) s, uc, n);
+ else
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+ }
+ return s;
+}
diff --git a/gnulib/lib/unistr/u8-startswith.c b/gnulib/lib/unistr/u8-startswith.c
new file mode 100644
index 00000000..4cc436a2
--- /dev/null
+++ b/gnulib/lib/unistr/u8-startswith.c
@@ -0,0 +1,25 @@
+/* Substring test for UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_startswith
+#define UNIT uint8_t
+#include "u-startswith.h"
diff --git a/gnulib/lib/unistr/u8-stpcpy.c b/gnulib/lib/unistr/u8-stpcpy.c
new file mode 100644
index 00000000..0faba413
--- /dev/null
+++ b/gnulib/lib/unistr/u8-stpcpy.c
@@ -0,0 +1,44 @@
+/* Copy UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Ensure stpcpy() gets declared. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if HAVE_STPCPY
+
+# include <string.h>
+
+uint8_t *
+u8_stpcpy (uint8_t *dest, const uint8_t *src)
+{
+ return (uint8_t *) stpcpy ((char *) dest, (const char *) src);
+}
+
+#else
+
+# define FUNC u8_stpcpy
+# define UNIT uint8_t
+# include "u-stpcpy.h"
+
+#endif
diff --git a/gnulib/lib/unistr/u8-stpncpy.c b/gnulib/lib/unistr/u8-stpncpy.c
new file mode 100644
index 00000000..a456beac
--- /dev/null
+++ b/gnulib/lib/unistr/u8-stpncpy.c
@@ -0,0 +1,44 @@
+/* Copy UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Ensure stpncpy() gets declared. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if __GLIBC__ >= 2
+
+# include <string.h>
+
+uint8_t *
+u8_stpncpy (uint8_t *dest, const uint8_t *src, size_t n)
+{
+ return (uint8_t *) stpncpy ((char *) dest, (const char *) src, n);
+}
+
+#else
+
+# define FUNC u8_stpncpy
+# define UNIT uint8_t
+# include "u-stpncpy.h"
+
+#endif
diff --git a/gnulib/lib/unistr/u8-strcat.c b/gnulib/lib/unistr/u8-strcat.c
new file mode 100644
index 00000000..2b54badf
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcat.c
@@ -0,0 +1,29 @@
+/* Concatenate UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strcat (uint8_t *dest, const uint8_t *src)
+{
+ return (uint8_t *) strcat ((char *) dest, (const char *) src);
+}
diff --git a/gnulib/lib/unistr/u8-strchr.c b/gnulib/lib/unistr/u8-strchr.c
new file mode 100644
index 00000000..3be14c79
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strchr.c
@@ -0,0 +1,101 @@
+/* Search character in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint8_t *
+u8_strchr (const uint8_t *s, ucs4_t uc)
+{
+ uint8_t c[6];
+
+ if (uc < 0x80)
+ {
+ uint8_t c0 = uc;
+
+ for (;; s++)
+ {
+ if (*s == c0)
+ break;
+ if (*s == 0)
+ goto notfound;
+ }
+ return (uint8_t *) s;
+ }
+ else
+ switch (u8_uctomb_aux (c, uc, 6))
+ {
+ case 2:
+ if (*s == 0)
+ goto notfound;
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+
+ for (;; s++)
+ {
+ if (s[1] == 0)
+ goto notfound;
+ if (*s == c0 && s[1] == c1)
+ break;
+ }
+ return (uint8_t *) s;
+ }
+
+ case 3:
+ if (*s == 0 || s[1] == 0)
+ goto notfound;
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+
+ for (;; s++)
+ {
+ if (s[2] == 0)
+ goto notfound;
+ if (*s == c0 && s[1] == c1 && s[2] == c2)
+ break;
+ }
+ return (uint8_t *) s;
+ }
+
+ case 4:
+ if (*s == 0 || s[1] == 0 || s[2] == 0)
+ goto notfound;
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+ uint8_t c3 = c[3];
+
+ for (;; s++)
+ {
+ if (s[3] == 0)
+ goto notfound;
+ if (*s == c0 && s[1] == c1 && s[2] == c2 && s[3] == c3)
+ break;
+ }
+ return (uint8_t *) s;
+ }
+ }
+notfound:
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u8-strcmp.c b/gnulib/lib/unistr/u8-strcmp.c
new file mode 100644
index 00000000..82a44147
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcmp.c
@@ -0,0 +1,30 @@
+/* Compare UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+int
+u8_strcmp (const uint8_t *s1, const uint8_t *s2)
+{
+ /* Use the fact that the UTF-8 encoding preserves lexicographic order. */
+ return strcmp ((const char *) s1, (const char *) s2);
+}
diff --git a/gnulib/lib/unistr/u8-strcoll.c b/gnulib/lib/unistr/u8-strcoll.c
new file mode 100644
index 00000000..9ffa135e
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcoll.c
@@ -0,0 +1,33 @@
+/* Compare UTF-8 strings using the collation rules of the current locale.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uniconv.h"
+
+#define FUNC u8_strcoll
+#define UNIT uint8_t
+#define U_STRCMP u8_strcmp
+#define U_STRCONV_TO_LOCALE u8_strconv_to_locale
+#include "u-strcoll.h"
diff --git a/gnulib/lib/unistr/u8-strcpy.c b/gnulib/lib/unistr/u8-strcpy.c
new file mode 100644
index 00000000..9662de58
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcpy.c
@@ -0,0 +1,29 @@
+/* Copy UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strcpy (uint8_t *dest, const uint8_t *src)
+{
+ return (uint8_t *) strcpy ((char *) dest, (const char *) src);
+}
diff --git a/gnulib/lib/unistr/u8-strcspn.c b/gnulib/lib/unistr/u8-strcspn.c
new file mode 100644
index 00000000..4b5b8e07
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcspn.c
@@ -0,0 +1,28 @@
+/* Search for some characters in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_strcspn
+#define UNIT uint8_t
+#define U_STRLEN u8_strlen
+#define U_STRMBTOUC u8_strmbtouc
+#define U_STRCHR u8_strchr
+#include "u-strcspn.h"
diff --git a/gnulib/lib/unistr/u8-strdup.c b/gnulib/lib/unistr/u8-strdup.c
new file mode 100644
index 00000000..58a30772
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strdup.c
@@ -0,0 +1,40 @@
+/* Copy UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if HAVE_STRDUP
+
+# include <string.h>
+
+uint8_t *
+u8_strdup (const uint8_t *s)
+{
+ return (uint8_t *) strdup ((const char *) s);
+}
+
+#else
+
+# define FUNC u8_strdup
+# define UNIT uint8_t
+# define U_STRLEN u8_strlen
+# include "u-strdup.h"
+
+#endif
diff --git a/gnulib/lib/unistr/u8-strlen.c b/gnulib/lib/unistr/u8-strlen.c
new file mode 100644
index 00000000..b8bebf0e
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strlen.c
@@ -0,0 +1,29 @@
+/* Determine length of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+size_t
+u8_strlen (const uint8_t *s)
+{
+ return strlen ((const char *) s);
+}
diff --git a/gnulib/lib/unistr/u8-strmblen.c b/gnulib/lib/unistr/u8-strmblen.c
new file mode 100644
index 00000000..52242c58
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strmblen.c
@@ -0,0 +1,97 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_strmblen (const uint8_t *s)
+{
+ /* Keep in sync with unistr.h and utf8-ucs4.c. */
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ return (c != 0 ? 1 : 0);
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+#else
+ if (s[1] != 0)
+#endif
+ return 2;
+ }
+ else if (c < 0xf0)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+#else
+ if (s[1] != 0 && s[2] != 0)
+#endif
+ return 3;
+ }
+ else if (c < 0xf8)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0)
+#endif
+ return 4;
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0 && s[4] != 0)
+#endif
+ return 5;
+ }
+ else if (c < 0xfe)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0 && s[4] != 0 && s[5] != 0)
+#endif
+ return 6;
+ }
+#endif
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u8-strmbtouc.c b/gnulib/lib/unistr/u8-strmbtouc.c
new file mode 100644
index 00000000..67016c65
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strmbtouc.c
@@ -0,0 +1,130 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2010 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_strmbtouc (ucs4_t *puc, const uint8_t *s)
+{
+ /* Keep in sync with unistr.h and utf8-ucs4.c. */
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return (c != 0 ? 1 : 0);
+ }
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+#else
+ if (s[1] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ }
+ else if (c < 0xf0)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+#else
+ if (s[1] != 0 && s[2] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ }
+ else if (c < 0xf8)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0 && s[4] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ }
+ else if (c < 0xfe)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0 && s[4] != 0 && s[5] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ }
+#endif
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u8-strncat.c b/gnulib/lib/unistr/u8-strncat.c
new file mode 100644
index 00000000..47803505
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strncat.c
@@ -0,0 +1,29 @@
+/* Concatenate UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strncat (uint8_t *dest, const uint8_t *src, size_t n)
+{
+ return (uint8_t *) strncat ((char *) dest, (const char *) src, n);
+}
diff --git a/gnulib/lib/unistr/u8-strncmp.c b/gnulib/lib/unistr/u8-strncmp.c
new file mode 100644
index 00000000..286450be
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strncmp.c
@@ -0,0 +1,30 @@
+/* Compare UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+int
+u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+{
+ /* Use the fact that the UTF-8 encoding preserves lexicographic order. */
+ return strncmp ((const char *) s1, (const char *) s2, n);
+}
diff --git a/gnulib/lib/unistr/u8-strncpy.c b/gnulib/lib/unistr/u8-strncpy.c
new file mode 100644
index 00000000..5ef757bd
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strncpy.c
@@ -0,0 +1,29 @@
+/* Copy UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strncpy (uint8_t *dest, const uint8_t *src, size_t n)
+{
+ return (uint8_t *) strncpy ((char *) dest, (const char *) src, n);
+}
diff --git a/gnulib/lib/unistr/u8-strnlen.c b/gnulib/lib/unistr/u8-strnlen.c
new file mode 100644
index 00000000..e732ea2e
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strnlen.c
@@ -0,0 +1,44 @@
+/* Determine bounded length of UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Ensure strnlen() gets declared. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if __GLIBC__ >= 2
+
+# include <string.h>
+
+size_t
+u8_strnlen (const uint8_t *s, size_t maxlen)
+{
+ return strnlen ((const char *) s, maxlen);
+}
+
+#else
+
+# define FUNC u8_strnlen
+# define UNIT uint8_t
+# include "u-strnlen.h"
+
+#endif
diff --git a/gnulib/lib/unistr/u8-strpbrk.c b/gnulib/lib/unistr/u8-strpbrk.c
new file mode 100644
index 00000000..ec6dc278
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strpbrk.c
@@ -0,0 +1,27 @@
+/* Search for some characters in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_strpbrk
+#define UNIT uint8_t
+#define U_STRMBTOUC u8_strmbtouc
+#define U_STRCHR u8_strchr
+#include "u-strpbrk.h"
diff --git a/gnulib/lib/unistr/u8-strrchr.c b/gnulib/lib/unistr/u8-strrchr.c
new file mode 100644
index 00000000..6d8e2971
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strrchr.c
@@ -0,0 +1,102 @@
+/* Search character in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint8_t *
+u8_strrchr (const uint8_t *s, ucs4_t uc)
+{
+ /* Calling u8_strlen and then searching from the other end would cause more
+ memory accesses. Avoid that, at the cost of a few more comparisons. */
+ uint8_t *result = NULL;
+ uint8_t c[6];
+
+ if (uc < 0x80)
+ {
+ uint8_t c0 = uc;
+
+ for (;; s++)
+ {
+ if (*s == c0)
+ result = (uint8_t *) s;
+ if (*s == 0)
+ break;
+ }
+ }
+ else
+ switch (u8_uctomb_aux (c, uc, 6))
+ {
+ case 2:
+ if (*s)
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+
+ /* FIXME: Maybe walking the string via u8_mblen is a win? */
+ for (;; s++)
+ {
+ if (s[1] == 0)
+ break;
+ if (*s == c0 && s[1] == c1)
+ result = (uint8_t *) s;
+ }
+ }
+ break;
+
+ case 3:
+ if (*s && s[1])
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+
+ /* FIXME: Maybe walking the string via u8_mblen is a win? */
+ for (;; s++)
+ {
+ if (s[2] == 0)
+ break;
+ if (*s == c0 && s[1] == c1 && s[2] == c2)
+ result = (uint8_t *) s;
+ }
+ }
+ break;
+
+ case 4:
+ if (*s && s[1] && s[2])
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+ uint8_t c3 = c[3];
+
+ /* FIXME: Maybe walking the string via u8_mblen is a win? */
+ for (;; s++)
+ {
+ if (s[3] == 0)
+ break;
+ if (*s == c0 && s[1] == c1 && s[2] == c2 && s[3] == c3)
+ result = (uint8_t *) s;
+ }
+ }
+ break;
+ }
+ return result;
+}
diff --git a/gnulib/lib/unistr/u8-strspn.c b/gnulib/lib/unistr/u8-strspn.c
new file mode 100644
index 00000000..7747815b
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strspn.c
@@ -0,0 +1,29 @@
+/* Search for some characters in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_strspn
+#define UNIT uint8_t
+#define U_STRLEN u8_strlen
+#define U_STRMBTOUC u8_strmbtouc
+#define U_CMP u8_cmp
+#define U_STRCHR u8_strchr
+#include "u-strspn.h"
diff --git a/gnulib/lib/unistr/u8-strstr.c b/gnulib/lib/unistr/u8-strstr.c
new file mode 100644
index 00000000..cce37adc
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strstr.c
@@ -0,0 +1,28 @@
+/* Substring test for UTF-8 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+/* FIXME: Maybe walking the string via u8_mblen is a win? */
+
+#define FUNC u8_strstr
+#define UNIT uint8_t
+#define U_STRCHR u8_strchr
+#include "u-strstr.h"
diff --git a/gnulib/lib/unistr/u8-strtok.c b/gnulib/lib/unistr/u8-strtok.c
new file mode 100644
index 00000000..e5c72037
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strtok.c
@@ -0,0 +1,27 @@
+/* Tokenize UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_strtok
+#define UNIT uint8_t
+#define U_STRSPN u8_strspn
+#define U_STRPBRK u8_strpbrk
+#include "u-strtok.h"
diff --git a/gnulib/lib/unistr/u8-to-u16.c b/gnulib/lib/unistr/u8-to-u16.c
new file mode 100644
index 00000000..3745c2bd
--- /dev/null
+++ b/gnulib/lib/unistr/u8-to-u16.c
@@ -0,0 +1,136 @@
+/* Convert UTF-8 string to UTF-16 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_to_u16
+#define SRC_UNIT uint8_t
+#define DST_UNIT uint16_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u8_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ count = u16_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 2 > allocated)
+ allocated = length + 2;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u16_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u8-to-u32.c b/gnulib/lib/unistr/u8-to-u32.c
new file mode 100644
index 00000000..de2a35e6
--- /dev/null
+++ b/gnulib/lib/unistr/u8-to-u32.c
@@ -0,0 +1,125 @@
+/* Convert UTF-8 string to UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_to_u32
+#define SRC_UNIT uint8_t
+#define DST_UNIT uint32_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u8_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ if (length + 1 > allocated)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 1 > allocated)
+ allocated = length + 1;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ }
+ result[length++] = uc;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u8-uctomb-aux.c b/gnulib/lib/unistr/u8-uctomb-aux.c
new file mode 100644
index 00000000..695921d6
--- /dev/null
+++ b/gnulib/lib/unistr/u8-uctomb-aux.c
@@ -0,0 +1,69 @@
+/* Conversion UCS-4 to UTF-8.
+ Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n)
+{
+ int count;
+
+ if (uc < 0x80)
+ /* The case n >= 1 is already handled by the caller. */
+ return -2;
+ else if (uc < 0x800)
+ count = 2;
+ else if (uc < 0x10000)
+ {
+ if (uc < 0xd800 || uc >= 0xe000)
+ count = 3;
+ else
+ return -1;
+ }
+#if 0
+ else if (uc < 0x200000)
+ count = 4;
+ else if (uc < 0x4000000)
+ count = 5;
+ else if (uc <= 0x7fffffff)
+ count = 6;
+#else
+ else if (uc < 0x110000)
+ count = 4;
+#endif
+ else
+ return -1;
+
+ if (n < count)
+ return -2;
+
+ switch (count) /* note: code falls through cases! */
+ {
+#if 0
+ case 6: s[5] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x4000000;
+ case 5: s[4] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x200000;
+#endif
+ case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
+ case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
+ case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
+ /*case 1:*/ s[0] = uc;
+ }
+ return count;
+}
diff --git a/gnulib/lib/unistr/u8-uctomb.c b/gnulib/lib/unistr/u8-uctomb.c
new file mode 100644
index 00000000..fd33c05c
--- /dev/null
+++ b/gnulib/lib/unistr/u8-uctomb.c
@@ -0,0 +1,88 @@
+/* Store a character in UTF-8 string.
+ Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_uctomb as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u8_uctomb (uint8_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0x80)
+ {
+ if (n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ /* else return -2, below. */
+ }
+ else
+ {
+ int count;
+
+ if (uc < 0x800)
+ count = 2;
+ else if (uc < 0x10000)
+ {
+ if (uc < 0xd800 || uc >= 0xe000)
+ count = 3;
+ else
+ return -1;
+ }
+#if 0
+ else if (uc < 0x200000)
+ count = 4;
+ else if (uc < 0x4000000)
+ count = 5;
+ else if (uc <= 0x7fffffff)
+ count = 6;
+#else
+ else if (uc < 0x110000)
+ count = 4;
+#endif
+ else
+ return -1;
+
+ if (n >= count)
+ {
+ switch (count) /* note: code falls through cases! */
+ {
+#if 0
+ case 6: s[5] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x4000000;
+ case 5: s[4] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x200000;
+#endif
+ case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
+ case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
+ case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
+ /*case 1:*/ s[0] = uc;
+ }
+ return count;
+ }
+ }
+ return -2;
+}
+
+#endif
diff --git a/gnulib/lib/unitypes.h b/gnulib/lib/unitypes.h
new file mode 100644
index 00000000..3e524f87
--- /dev/null
+++ b/gnulib/lib/unitypes.h
@@ -0,0 +1,26 @@
+/* Elementary types for the GNU UniString library.
+ Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNITYPES_H
+#define _UNITYPES_H
+
+/* Get uint8_t, uint16_t, uint32_t. */
+#include <stdint.h>
+
+/* Type representing a Unicode character. */
+typedef uint32_t ucs4_t;
+
+#endif /* _UNITYPES_H */
diff --git a/gnulib/lib/uniwbrk.h b/gnulib/lib/uniwbrk.h
new file mode 100644
index 00000000..25cf33a8
--- /dev/null
+++ b/gnulib/lib/uniwbrk.h
@@ -0,0 +1,83 @@
+/* Word breaks in Unicode strings.
+ Copyright (C) 2001-2003, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNIWBRK_H
+#define _UNIWBRK_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Property defined in Unicode Standard Annex #29, section "Word Boundaries"
+ <http://www.unicode.org/reports/tr29/#Word_Boundaries> */
+
+/* Possible values of the Word_Break property.
+ This enumeration may be extended in the future. */
+enum
+{
+ WBP_OTHER = 0,
+ WBP_CR = 11,
+ WBP_LF = 12,
+ WBP_NEWLINE = 10,
+ WBP_EXTEND = 8,
+ WBP_FORMAT = 9,
+ WBP_KATAKANA = 1,
+ WBP_ALETTER = 2,
+ WBP_MIDNUMLET = 3,
+ WBP_MIDLETTER = 4,
+ WBP_MIDNUM = 5,
+ WBP_NUMERIC = 6,
+ WBP_EXTENDNUMLET = 7
+};
+
+/* Return the Word_Break property of a Unicode character. */
+extern int
+ uc_wordbreak_property (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Word breaks. */
+
+/* Determine the word break points in S, and store 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.
+ */
+extern void
+ u8_wordbreaks (const uint8_t *s, size_t n, char *p);
+extern void
+ u16_wordbreaks (const uint16_t *s, size_t n, char *p);
+extern void
+ u32_wordbreaks (const uint32_t *s, size_t n, char *p);
+extern void
+ ulc_wordbreaks (const char *s, size_t n, char *p);
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNIWBRK_H */
diff --git a/gnulib/lib/uniwbrk/u-wordbreaks.h b/gnulib/lib/uniwbrk/u-wordbreaks.h
new file mode 100644
index 00000000..b0fd301e
--- /dev/null
+++ b/gnulib/lib/uniwbrk/u-wordbreaks.h
@@ -0,0 +1,127 @@
+/* Word breaks in UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+void
+FUNC (const UNIT *s, size_t n, char *p)
+{
+ if (n > 0)
+ {
+ const UNIT *s_end = s + n;
+
+ /* Word break property of the last character.
+ -1 at the very beginning of the string. */
+ int last_char_prop = -1;
+
+ /* Format and Extend characters are ignored; this means, the mostly used
+ unit is the complex character (= character with subsequent ignored
+ characters).
+ Word break property of the last complex character.
+ -1 at the very beginning of the string. */
+ int last_compchar_prop = -1;
+ char *last_compchar_ptr = NULL;
+
+ /* For recognizing rules involving 3 complex characters:
+ Word break property of the second-to-last complex character.
+ -1 at the very beginning of the string. */
+ int secondlast_compchar_prop = -1;
+
+ /* Don't break inside multibyte characters. */
+ memset (p, 0, n);
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+ int prop = uc_wordbreak_property (uc);
+
+ /* No break at the start of the string. */
+ if (last_char_prop >= 0)
+ {
+ /* No break between CR and LF. */
+ if (last_char_prop == WBP_CR && prop == WBP_LF)
+ /* *p = 0 */;
+ /* Break before and after newlines. */
+ else if (last_char_prop >= WBP_NEWLINE
+ /* same as:
+ last_char_prop == WBP_CR
+ || last_char_prop == WBP_LF
+ || last_char_prop == WBP_NEWLINE */
+ || prop >= WBP_NEWLINE
+ /* same as:
+ prop == WBP_CR
+ || prop == WBP_LF
+ || prop == WBP_NEWLINE */)
+ *p = 1;
+ /* Ignore Format and Extend characters. */
+ else if (!(prop == WBP_EXTEND || prop == WBP_FORMAT))
+ {
+ /* No break in these situations (see UAX #29):
+
+ secondlast last current
+
+ ALetter (MidLetter | MidNumLet) × ALetter (WB7)
+ ALetter × (MidLetter | MidNumLet) ALetter (WB6)
+ Numeric (MidNum | MidNumLet) × Numeric (WB11)
+ Numeric × (MidNum | MidNumLet) Numeric (WB12)
+ ALetter × ALetter (WB5)
+ ALetter × Numeric (WB9)
+ Numeric × ALetter (WB10)
+ Numeric × Numeric (WB8)
+ Katakana × Katakana (WB13)
+ (ALetter | Numeric | Katakana) × ExtendNumLet (WB13a)
+ ExtendNumLet × ExtendNumLet (WB13a)
+ ExtendNumLet × (ALetter | Numeric | Katakana) (WB13b)
+ */
+ /* No break across certain punctuation. Also, disable word
+ breaks that were recognized earlier (due to lookahead of
+ only one complex character). */
+ if ((prop == WBP_ALETTER
+ && (last_compchar_prop == WBP_MIDLETTER
+ || last_compchar_prop == WBP_MIDNUMLET)
+ && secondlast_compchar_prop == WBP_ALETTER)
+ || (prop == WBP_NUMERIC
+ && (last_compchar_prop == WBP_MIDNUM
+ || last_compchar_prop == WBP_MIDNUMLET)
+ && secondlast_compchar_prop == WBP_NUMERIC))
+ {
+ *last_compchar_ptr = 0;
+ /* *p = 0; */
+ }
+ else
+ {
+ /* Perform a single table lookup. */
+ if (uniwbrk_table[last_compchar_prop][prop])
+ *p = 1;
+ /* else *p = 0; */
+ }
+ }
+ }
+
+ last_char_prop = prop;
+ /* Ignore Format and Extend characters, except at the start of the string. */
+ if (last_compchar_prop < 0 || !(prop == WBP_EXTEND || prop == WBP_FORMAT))
+ {
+ secondlast_compchar_prop = last_compchar_prop;
+ last_compchar_prop = prop;
+ last_compchar_ptr = p;
+ }
+
+ s += count;
+ p += count;
+ }
+ }
+}
diff --git a/gnulib/lib/uniwbrk/u16-wordbreaks.c b/gnulib/lib/uniwbrk/u16-wordbreaks.c
new file mode 100644
index 00000000..ea2a53d2
--- /dev/null
+++ b/gnulib/lib/uniwbrk/u16-wordbreaks.c
@@ -0,0 +1,31 @@
+/* Word breaks in UTF-16 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include <string.h>
+
+#include "unistr.h"
+#include "uniwbrk/wbrktable.h"
+
+#define FUNC u16_wordbreaks
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#include "u-wordbreaks.h"
diff --git a/gnulib/lib/uniwbrk/u32-wordbreaks.c b/gnulib/lib/uniwbrk/u32-wordbreaks.c
new file mode 100644
index 00000000..86a26160
--- /dev/null
+++ b/gnulib/lib/uniwbrk/u32-wordbreaks.c
@@ -0,0 +1,31 @@
+/* Word breaks in UTF-32 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include <string.h>
+
+#include "unistr.h"
+#include "uniwbrk/wbrktable.h"
+
+#define FUNC u32_wordbreaks
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#include "u-wordbreaks.h"
diff --git a/gnulib/lib/uniwbrk/u8-wordbreaks.c b/gnulib/lib/uniwbrk/u8-wordbreaks.c
new file mode 100644
index 00000000..c7edfe9e
--- /dev/null
+++ b/gnulib/lib/uniwbrk/u8-wordbreaks.c
@@ -0,0 +1,124 @@
+/* Word breaks in UTF-8 strings.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include <string.h>
+
+#include "unistr.h"
+#include "uniwbrk/wbrktable.h"
+
+#define FUNC u8_wordbreaks
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#include "u-wordbreaks.h"
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ if (argc == 1)
+ {
+ /* Display all the word breaks in the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ u8_wordbreaks ((uint8_t *) input, length, breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case 1:
+ /* U+2027 in UTF-8 encoding */
+ putc (0xe2, stdout); putc (0x80, stdout); putc (0xa7, stdout);
+ break;
+ case 0:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/uniwbrk/ulc-wordbreaks.c b/gnulib/lib/uniwbrk/ulc-wordbreaks.c
new file mode 100644
index 00000000..6e17026b
--- /dev/null
+++ b/gnulib/lib/uniwbrk/ulc-wordbreaks.c
@@ -0,0 +1,201 @@
+/* Word breaks in strings.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "localcharset.h"
+#include "uniconv.h"
+#include "unilbrk/ulc-common.h"
+
+/* Word breaks of a string in an arbitrary encoding.
+
+ We convert the input string to Unicode.
+
+ The standardized Unicode encodings are UTF-8, UCS-2, UCS-4, UTF-16,
+ UTF-16BE, UTF-16LE, UTF-7. UCS-2 supports only characters up to
+ \U0000FFFF. UTF-16 and variants support only characters up to
+ \U0010FFFF. UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order mark.
+ glibc currently interprets it as big endian without byte order mark,
+ but this is not backed by an RFC. So we use UTF-8. It supports
+ characters up to \U7FFFFFFF and is unambiguously defined. */
+
+void
+ulc_wordbreaks (const char *s, size_t n, char *p)
+{
+ if (n > 0)
+ {
+ const char *encoding = locale_charset ();
+
+ if (is_utf8_encoding (encoding))
+ u8_wordbreaks ((const uint8_t *) s, n, p);
+ else
+ {
+ /* Convert the string to UTF-8 and build a translation table
+ from offsets into s to offsets into the translated string. */
+ size_t *offsets = (size_t *) malloc (n * sizeof (size_t));
+
+ if (offsets != NULL)
+ {
+ uint8_t *t;
+ size_t m;
+
+ t = u8_conv_from_encoding (encoding, iconveh_question_mark,
+ s, n, offsets, NULL, &m);
+ if (t != NULL)
+ {
+ char *q = (char *) (m > 0 ? malloc (m) : NULL);
+
+ if (m == 0 || q != NULL)
+ {
+ size_t i;
+
+ /* Determine the word breaks of the UTF-8 string. */
+ u8_wordbreaks (t, m, q);
+
+ /* Translate the result back to the original string. */
+ memset (p, 0, n);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ p[i] = q[offsets[i]];
+
+ free (q);
+ free (t);
+ free (offsets);
+ return;
+ }
+ free (t);
+ }
+ free (offsets);
+ }
+
+ /* Impossible to convert. */
+#if C_CTYPE_ASCII
+ if (is_all_ascii (s, n))
+ {
+ /* ASCII is a subset of UTF-8. */
+ u8_wordbreaks ((const uint8_t *) s, n, p);
+ return;
+ }
+#endif
+ /* We have a non-ASCII string and cannot convert it.
+ Don't produce any word breaks. */
+ memset (p, 0, n);
+ }
+ }
+}
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_CTYPE, "");
+ if (argc == 1)
+ {
+ /* Display all the word breaks in the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ ulc_wordbreaks (input, length, breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case 1:
+ putc ('|', stdout);
+ break;
+ case 0:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/uniwbrk/wbrkprop.h b/gnulib/lib/uniwbrk/wbrkprop.h
new file mode 100644
index 00000000..4d914006
--- /dev/null
+++ b/gnulib/lib/uniwbrk/wbrkprop.h
@@ -0,0 +1,3755 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Line breaking properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables for Unicode 5.1.0. */
+
+/* Copyright (C) 2000-2002, 2004, 2007-2010 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/>. */
+
+#define wbrkprop_header_0 16
+#define wbrkprop_header_1 15
+#define wbrkprop_header_2 7
+#define wbrkprop_header_3 511
+#define wbrkprop_header_4 127
+
+typedef struct
+ {
+ int level1[15];
+ int level2[3 << 9];
+ unsigned char level3[110 << 7];
+ }
+wbrkprop_t;
+static const wbrkprop_t uniwbrkprop =
+{
+ {
+ 0, 512, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1024
+ },
+ {
+ 0, 128, 256, 256, 256, 384, 512, 640,
+ 256, 768, 896, 1024, 1152, 1280, 1408, 1536,
+ -1, -1, 1664, 1792, 1920, 2048, 2176, 2304,
+ 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328,
+ 3456, 3584, 3712, 3840, 3968, 4096, 4224, 4352,
+ 4480, 256, 256, 256, 4608, 4736, 4864, 4992,
+ 5120, 5248, 5376, 5504, 5632, -1, 5760, 5888,
+ 6016, -1, 256, 6144, 256, 256, 6272, 6400,
+ 6528, 6656, 6784, 6912, -1, -1, -1, -1,
+ -1, 7040, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7168, 7296, 7424, 7552, 7680, -1, -1, -1,
+ 7808, 7936, 8064, 8192, -1, 8320, 8448, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 8576, 256, 256, 8704, 8832, 8960, 9088,
+ 9216, 9344, 9472, -1, 9600, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 9728,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 9856, 9984,
+ 256, 256, 10112, 10240, 10368, 10496, 10624, 10752,
+ 10880, 11008, 11136, 11264, -1, 11392, 11520, 11648,
+ 256, 11776, -1, -1, -1, -1, -1, -1,
+ 11904, -1, 12032, -1, 12160, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 12288, -1,
+ 12416, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 12544, 12672, 12800, -1, -1, -1,
+ 12928, 13056, 13184, 256, 256, 13312, 13440, 13568,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 13696, -1, 13824, 13952, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_LF, WBP_NEWLINE,
+ WBP_NEWLINE, WBP_CR, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUMLET,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_MIDLETTER, WBP_MIDNUM,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_NEWLINE, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_MIDLETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_MIDNUM, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_MIDLETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_MIDNUM, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_MIDLETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_MIDNUM, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_NUMERIC,
+ WBP_MIDNUM, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_FORMAT, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_FORMAT,
+ WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_FORMAT, WBP_FORMAT, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_FORMAT,
+ WBP_EXTEND, WBP_EXTEND, WBP_FORMAT, WBP_FORMAT,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUMLET, WBP_MIDNUMLET, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUMLET, WBP_OTHER, WBP_OTHER, WBP_MIDLETTER,
+ WBP_NEWLINE, WBP_NEWLINE, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET,
+ WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_MIDLETTER,
+ WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET,
+ WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTENDNUMLET, WBP_EXTENDNUMLET, WBP_EXTENDNUMLET,
+ WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER,
+ WBP_MIDNUM, WBP_MIDLETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_FORMAT,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUMLET,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_MIDLETTER, WBP_MIDNUM,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER
+ }
+};
diff --git a/gnulib/lib/uniwbrk/wbrktable.c b/gnulib/lib/uniwbrk/wbrktable.c
new file mode 100644
index 00000000..ff25fb31
--- /dev/null
+++ b/gnulib/lib/uniwbrk/wbrktable.c
@@ -0,0 +1,52 @@
+/* Word break auxiliary table.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "wbrktable.h"
+
+/* This table contains the following rules (see UAX #29):
+
+ last current
+
+ ALetter × ALetter (WB5)
+ ALetter × Numeric (WB9)
+ Numeric × ALetter (WB10)
+ Numeric × Numeric (WB8)
+ Katakana × Katakana (WB13)
+ (ALetter | Numeric | Katakana) × ExtendNumLet (WB13a)
+ ExtendNumLet × ExtendNumLet (WB13a)
+ ExtendNumLet × (ALetter | Numeric | Katakana) (WB13b)
+ */
+
+const unsigned char uniwbrk_table[10][8] =
+{ /* current: OTHER MIDNUMLET NUMERIC */
+ /* KATAKANA MIDLETTER EXTENDNUMLET */
+ /* ALETTER MIDNUM */
+ /* last */
+ /* WBP_OTHER */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_KATAKANA */ { 1, 0, 1, 1, 1, 1, 1, 0 },
+ /* WBP_ALETTER */ { 1, 1, 0, 1, 1, 1, 0, 0 },
+ /* WBP_MIDNUMLET */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_MIDLETTER */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_MIDNUM */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_NUMERIC */ { 1, 1, 0, 1, 1, 1, 0, 0 },
+ /* WBP_EXTENDNUMLET */ { 1, 0, 0, 1, 1, 1, 0, 0 },
+ /* WBP_EXTEND */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_FORMAT */ { 1, 1, 1, 1, 1, 1, 1, 1 }
+};
diff --git a/gnulib/lib/uniwbrk/wbrktable.h b/gnulib/lib/uniwbrk/wbrktable.h
new file mode 100644
index 00000000..8a13378b
--- /dev/null
+++ b/gnulib/lib/uniwbrk/wbrktable.h
@@ -0,0 +1,18 @@
+/* Word break auxiliary table.
+ Copyright (C) 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+extern const unsigned char uniwbrk_table[10][8];
diff --git a/gnulib/lib/uniwbrk/wordbreak-property.c b/gnulib/lib/uniwbrk/wordbreak-property.c
new file mode 100644
index 00000000..9d98b0b5
--- /dev/null
+++ b/gnulib/lib/uniwbrk/wordbreak-property.c
@@ -0,0 +1,44 @@
+/* Word break property.
+ Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include "wbrkprop.h"
+
+int
+uc_wordbreak_property (ucs4_t uc)
+{
+ unsigned int index1 = uc >> wbrkprop_header_0;
+ if (index1 < wbrkprop_header_1)
+ {
+ int lookup1 = uniwbrkprop.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> wbrkprop_header_2) & wbrkprop_header_3;
+ int lookup2 = uniwbrkprop.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = uc & wbrkprop_header_4;
+ return uniwbrkprop.level3[lookup2 + index3];
+ }
+ }
+ }
+ return WBP_OTHER;
+}
diff --git a/gnulib/lib/uniwidth.h b/gnulib/lib/uniwidth.h
new file mode 100644
index 00000000..d48a7754
--- /dev/null
+++ b/gnulib/lib/uniwidth.h
@@ -0,0 +1,65 @@
+/* Display width functions.
+ Copyright (C) 2001-2002, 2005, 2007, 2009-2010 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNIWIDTH_H
+#define _UNIWIDTH_H
+
+#include "unitypes.h"
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get locale_charset() declaration. */
+#include "localcharset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Display width. */
+
+/* These functions are locale dependent. The encoding argument identifies
+ the encoding (e.g. "ISO-8859-2" for Polish). */
+
+/* Determine number of column positions required for UC. */
+extern int
+ uc_width (ucs4_t uc, const char *encoding);
+
+/* Determine number of column positions required for first N units
+ (or fewer if S ends before this) in S. */
+extern int
+ u8_width (const uint8_t *s, size_t n, const char *encoding);
+extern int
+ u16_width (const uint16_t *s, size_t n, const char *encoding);
+extern int
+ u32_width (const uint32_t *s, size_t n, const char *encoding);
+
+/* Determine number of column positions required for S. */
+extern int
+ u8_strwidth (const uint8_t *s, const char *encoding);
+extern int
+ u16_strwidth (const uint16_t *s, const char *encoding);
+extern int
+ u32_strwidth (const uint32_t *s, const char *encoding);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNIWIDTH_H */
diff --git a/gnulib/lib/uniwidth/cjk.h b/gnulib/lib/uniwidth/cjk.h
new file mode 100644
index 00000000..5d8ef126
--- /dev/null
+++ b/gnulib/lib/uniwidth/cjk.h
@@ -0,0 +1,37 @@
+/* Test for CJK encoding.
+ Copyright (C) 2001-2002, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "streq.h"
+
+static int
+is_cjk_encoding (const char *encoding)
+{
+ if (0
+ /* Legacy Japanese encodings */
+ || STREQ (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0)
+ /* Legacy Chinese encodings */
+ || STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
+ || STREQ (encoding, "GBK", 'G', 'B', 'K', 0, 0, 0, 0, 0, 0)
+ || STREQ (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0)
+ || STREQ (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0)
+ /* Legacy Korean encodings */
+ || STREQ (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ || STREQ (encoding, "CP949", 'C', 'P', '9', '4', '9', 0, 0, 0, 0)
+ || STREQ (encoding, "JOHAB", 'J', 'O', 'H', 'A', 'B', 0, 0, 0, 0))
+ return 1;
+ return 0;
+}
diff --git a/gnulib/lib/uniwidth/u16-strwidth.c b/gnulib/lib/uniwidth/u16-strwidth.c
new file mode 100644
index 00000000..01dc33b0
--- /dev/null
+++ b/gnulib/lib/uniwidth/u16-strwidth.c
@@ -0,0 +1,29 @@
+/* Determine display width of UTF-16 string.
+ Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u16_strwidth (const uint16_t *s, const char *encoding)
+{
+ return u16_width (s, u16_strlen (s), encoding);
+}
diff --git a/gnulib/lib/uniwidth/u16-width.c b/gnulib/lib/uniwidth/u16-width.c
new file mode 100644
index 00000000..49a1204f
--- /dev/null
+++ b/gnulib/lib/uniwidth/u16-width.c
@@ -0,0 +1,47 @@
+/* Determine display width of UTF-16 string.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u16_width (const uint16_t *s, size_t n, const char *encoding)
+{
+ const uint16_t *s_end = s + n;
+ int width = 0;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int w;
+
+ s += u16_mbtouc_unsafe (&uc, s, s_end - s);
+
+ if (uc == 0)
+ break; /* end of string reached */
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ width += w;
+ }
+
+ return width;
+}
diff --git a/gnulib/lib/uniwidth/u32-strwidth.c b/gnulib/lib/uniwidth/u32-strwidth.c
new file mode 100644
index 00000000..c21e6aa1
--- /dev/null
+++ b/gnulib/lib/uniwidth/u32-strwidth.c
@@ -0,0 +1,29 @@
+/* Determine display width of UTF-32 string.
+ Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u32_strwidth (const uint32_t *s, const char *encoding)
+{
+ return u32_width (s, u32_strlen (s), encoding);
+}
diff --git a/gnulib/lib/uniwidth/u32-width.c b/gnulib/lib/uniwidth/u32-width.c
new file mode 100644
index 00000000..32c41336
--- /dev/null
+++ b/gnulib/lib/uniwidth/u32-width.c
@@ -0,0 +1,43 @@
+/* Determine display width of UTF-32 string.
+ Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+int
+u32_width (const uint32_t *s, size_t n, const char *encoding)
+{
+ const uint32_t *s_end = s + n;
+ int width = 0;
+
+ while (s < s_end)
+ {
+ ucs4_t uc = *s++;
+ int w;
+
+ if (uc == 0)
+ break; /* end of string reached */
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ width += w;
+ }
+
+ return width;
+}
diff --git a/gnulib/lib/uniwidth/u8-strwidth.c b/gnulib/lib/uniwidth/u8-strwidth.c
new file mode 100644
index 00000000..d3404b30
--- /dev/null
+++ b/gnulib/lib/uniwidth/u8-strwidth.c
@@ -0,0 +1,29 @@
+/* Determine display width of UTF-8 string.
+ Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u8_strwidth (const uint8_t *s, const char *encoding)
+{
+ return u8_width (s, u8_strlen (s), encoding);
+}
diff --git a/gnulib/lib/uniwidth/u8-width.c b/gnulib/lib/uniwidth/u8-width.c
new file mode 100644
index 00000000..fd27cab0
--- /dev/null
+++ b/gnulib/lib/uniwidth/u8-width.c
@@ -0,0 +1,47 @@
+/* Determine display width of UTF-8 string.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u8_width (const uint8_t *s, size_t n, const char *encoding)
+{
+ const uint8_t *s_end = s + n;
+ int width = 0;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int w;
+
+ s += u8_mbtouc_unsafe (&uc, s, s_end - s);
+
+ if (uc == 0)
+ break; /* end of string reached */
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ width += w;
+ }
+
+ return width;
+}
diff --git a/gnulib/lib/uniwidth/width.c b/gnulib/lib/uniwidth/width.c
new file mode 100644
index 00000000..c88fdb66
--- /dev/null
+++ b/gnulib/lib/uniwidth/width.c
@@ -0,0 +1,359 @@
+/* Determine display width of Unicode character.
+ Copyright (C) 2001-2002, 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "cjk.h"
+
+/*
+ * Non-spacing attribute table.
+ * Consists of:
+ * - Non-spacing characters; generated from PropList.txt or
+ * "grep '^[^;]*;[^;]*;[^;]*;[^;]*;NSM;' UnicodeData.txt"
+ * - Format control characters; generated from
+ * "grep '^[^;]*;[^;]*;Cf;' UnicodeData.txt"
+ * - Zero width characters; generated from
+ * "grep '^[^;]*;ZERO WIDTH ' UnicodeData.txt"
+ */
+static const unsigned char nonspacing_table_data[26*64] = {
+ /* 0x0000-0x01ff */
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, /* 0x0000-0x003f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x0040-0x007f */
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x00, 0x00, /* 0x0080-0x00bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00c0-0x00ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0100-0x013f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0140-0x017f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0180-0x01bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x01c0-0x01ff */
+ /* 0x0200-0x03ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0200-0x023f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0240-0x027f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0280-0x02bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x02c0-0x02ff */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x0300-0x033f */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, /* 0x0340-0x037f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0380-0x03bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x03c0-0x03ff */
+ /* 0x0400-0x05ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0400-0x043f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0440-0x047f */
+ 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0480-0x04bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x04c0-0x04ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0500-0x053f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0540-0x057f */
+ 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, /* 0x0580-0x05bf */
+ 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x05c0-0x05ff */
+ /* 0x0600-0x07ff */
+ 0x0f, 0x00, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, /* 0x0600-0x063f */
+ 0x00, 0xf8, 0xff, 0x7f, 0x00, 0x00, 0x01, 0x00, /* 0x0640-0x067f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0680-0x06bf */
+ 0x00, 0x00, 0xc0, 0xff, 0x9f, 0x3d, 0x00, 0x00, /* 0x06c0-0x06ff */
+ 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0x0700-0x073f */
+ 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0740-0x077f */
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, /* 0x0780-0x07bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x07c0-0x07ff */
+ /* 0x0800-0x09ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0800-0x083f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0840-0x087f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0880-0x08bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08c0-0x08ff */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0900-0x093f */
+ 0xfe, 0x21, 0x1e, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0940-0x097f */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0980-0x09bf */
+ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x09c0-0x09ff */
+ /* 0x0a00-0x0bff */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a00-0x0a3f */
+ 0x86, 0x39, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, /* 0x0a40-0x0a7f */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a80-0x0abf */
+ 0xbe, 0x21, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0ac0-0x0aff */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0x0b00-0x0b3f */
+ 0x1e, 0x20, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0b40-0x0b7f */
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0b80-0x0bbf */
+ 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0bc0-0x0bff */
+ /* 0x0c00-0x0dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, /* 0x0c00-0x0c3f */
+ 0xc1, 0x3d, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0c40-0x0c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0c80-0x0cbf */
+ 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0cc0-0x0cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d00-0x0d3f */
+ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0d40-0x0d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d80-0x0dbf */
+ 0x00, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0dc0-0x0dff */
+ /* 0x0e00-0x0fff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x07, /* 0x0e00-0x0e3f */
+ 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0e40-0x0e7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x1b, /* 0x0e80-0x0ebf */
+ 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0ec0-0x0eff */
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xa0, 0x02, /* 0x0f00-0x0f3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, /* 0x0f40-0x0f7f */
+ 0xdf, 0x00, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, /* 0x0f80-0x0fbf */
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0fc0-0x0fff */
+ /* 0x1000-0x11ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x66, /* 0x1000-0x103f */
+ 0x00, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x1e, 0x00, /* 0x1040-0x107f */
+ 0x64, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1080-0x10bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c0-0x10ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1100-0x113f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1140-0x117f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1180-0x11bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11c0-0x11ff */
+ /* 0x1200-0x13ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1200-0x123f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1240-0x127f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1280-0x12bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x12c0-0x12ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1300-0x133f */
+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, /* 0x1340-0x137f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1380-0x13bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13c0-0x13ff */
+ /* 0x1600-0x17ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1600-0x163f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1640-0x167f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1680-0x16bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16c0-0x16ff */
+ 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, /* 0x1700-0x173f */
+ 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, /* 0x1740-0x177f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3f, /* 0x1780-0x17bf */
+ 0x40, 0xfe, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x17c0-0x17ff */
+ /* 0x1800-0x19ff */
+ 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1800-0x183f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1840-0x187f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* 0x1880-0x18bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18c0-0x18ff */
+ 0x00, 0x00, 0x00, 0x00, 0x87, 0x01, 0x04, 0x0e, /* 0x1900-0x193f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1940-0x197f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1980-0x19bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x19c0-0x19ff */
+ /* 0x1a00-0x1bff */
+ 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, /* 0x1a00-0x1a3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1a40-0x1a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1a80-0x1abf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ac0-0x1aff */
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x17, /* 0x1b00-0x1b3f */
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x1b40-0x1b7f */
+ 0x03, 0x00, 0x00, 0x00, 0x3c, 0x03, 0x00, 0x00, /* 0x1b80-0x1bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bc0-0x1bff */
+ /* 0x1c00-0x1dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xcf, 0x00, /* 0x1c00-0x1c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c40-0x1c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c80-0x1cbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1cc0-0x1cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d00-0x1d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d40-0x1d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d80-0x1dbf */
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, /* 0x1dc0-0x1dff */
+ /* 0x2000-0x21ff */
+ 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, /* 0x2000-0x203f */
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, /* 0x2040-0x207f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2080-0x20bf */
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, /* 0x20c0-0x20ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2100-0x213f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2140-0x217f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2180-0x21bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x21c0-0x21ff */
+ /* 0x2c00-0x2dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c00-0x2c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c40-0x2c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c80-0x2cbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2cc0-0x2cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d00-0x2d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d40-0x2d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d80-0x2dbf */
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, /* 0x2dc0-0x2dff */
+ /* 0x3000-0x31ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, /* 0x3000-0x303f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3040-0x307f */
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, /* 0x3080-0x30bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30c0-0x30ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3100-0x313f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3140-0x317f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3180-0x31bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x31c0-0x31ff */
+ /* 0xa600-0xa7ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa600-0xa63f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x30, /* 0xa640-0xa67f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa680-0xa6bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa6c0-0xa6ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa700-0xa73f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa740-0xa77f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa780-0xa7bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa7c0-0xa7ff */
+ /* 0xa800-0xa9ff */
+ 0x44, 0x08, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* 0xa800-0xa83f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa840-0xa87f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa880-0xa8bf */
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8c0-0xa8ff */
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, /* 0xa900-0xa93f */
+ 0x80, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa940-0xa97f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa980-0xa9bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa9c0-0xa9ff */
+ /* 0xaa00-0xabff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x66, 0x00, /* 0xaa00-0xaa3f */
+ 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xaa40-0xaa7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xaa80-0xaabf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xaac0-0xaaff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab00-0xab3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab40-0xab7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab80-0xabbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xabc0-0xabff */
+ /* 0xfa00-0xfbff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa00-0xfa3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa40-0xfa7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa80-0xfabf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfac0-0xfaff */
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, /* 0xfb00-0xfb3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb40-0xfb7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb80-0xfbbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfbc0-0xfbff */
+ /* 0xfe00-0xffff */
+ 0xff, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, /* 0xfe00-0xfe3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe40-0xfe7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe80-0xfebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0xfec0-0xfeff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff00-0xff3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff40-0xff7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff80-0xffbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, /* 0xffc0-0xffff */
+ /* 0x10000-0x101ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10000-0x1003f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10040-0x1007f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10080-0x100bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x100c0-0x100ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10100-0x1013f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10140-0x1017f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10180-0x101bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /* 0x101c0-0x101ff */
+ /* 0x10a00-0x10bff */
+ 0x6e, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, /* 0x10a00-0x10a3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a40-0x10a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a80-0x10abf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10ac0-0x10aff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b00-0x10b3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b40-0x10b7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b80-0x10bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10bc0-0x10bff */
+ /* 0x1d000-0x1d1ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d000-0x1d03f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d040-0x1d07f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d080-0x1d0bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d0c0-0x1d0ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d100-0x1d13f */
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xf8, /* 0x1d140-0x1d17f */
+ 0xe7, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x1d180-0x1d1bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d1c0-0x1d1ff */
+ /* 0x1d200-0x1d3ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d200-0x1d23f */
+ 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d240-0x1d27f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d280-0x1d2bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d2c0-0x1d2ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d300-0x1d33f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d340-0x1d37f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d380-0x1d3bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x1d3c0-0x1d3ff */
+};
+static const signed char nonspacing_table_ind[240] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, /* 0x0000-0x0fff */
+ 8, 9, -1, 10, 11, 12, 13, -1, /* 0x1000-0x1fff */
+ 14, -1, -1, -1, -1, -1, 15, -1, /* 0x2000-0x2fff */
+ 16, -1, -1, -1, -1, -1, -1, -1, /* 0x3000-0x3fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x4000-0x4fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x5000-0x5fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x6000-0x6fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7000-0x7fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x8000-0x8fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x9000-0x9fff */
+ -1, -1, -1, 17, 18, 19, -1, -1, /* 0xa000-0xafff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb000-0xbfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc000-0xcfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd000-0xdfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe000-0xefff */
+ -1, -1, -1, -1, -1, 20, -1, 21, /* 0xf000-0xffff */
+ 22, -1, -1, -1, -1, 23, -1, -1, /* 0x10000-0x10fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x11000-0x11fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x12000-0x12fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x13000-0x13fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x14000-0x14fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x15000-0x15fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x16000-0x16fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x17000-0x17fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18000-0x18fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x19000-0x19fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1a000-0x1afff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1b000-0x1bfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1c000-0x1cfff */
+ 24, 25, -1, -1, -1, -1, -1, -1 /* 0x1d000-0x1dfff */
+};
+
+/* Determine number of column positions required for UC. */
+int
+uc_width (ucs4_t uc, const char *encoding)
+{
+ /* Test for non-spacing or control character. */
+ if ((uc >> 9) < 240)
+ {
+ int ind = nonspacing_table_ind[uc >> 9];
+ if (ind >= 0)
+ if ((nonspacing_table_data[64*ind + ((uc >> 3) & 63)] >> (uc & 7)) & 1)
+ {
+ if (uc > 0 && uc < 0xa0)
+ return -1;
+ else
+ return 0;
+ }
+ }
+ else if ((uc >> 9) == (0xe0000 >> 9))
+ {
+ if (uc >= 0xe0100)
+ {
+ if (uc <= 0xe01ef)
+ return 0;
+ }
+ else
+ {
+ if (uc >= 0xe0020 ? uc <= 0xe007f : uc == 0xe0001)
+ return 0;
+ }
+ }
+ /* Test for double-width character.
+ * Generated from "grep '^....;[WF]' EastAsianWidth.txt"
+ * and "grep '^....;[^WF]' EastAsianWidth.txt"
+ */
+ if (uc >= 0x1100
+ && ((uc < 0x1160) /* Hangul Jamo */
+ || (uc >= 0x2329 && uc < 0x232b) /* Angle Brackets */
+ || (uc >= 0x2e80 && uc < 0xa4d0 /* CJK ... Yi */
+ && !(uc == 0x303f) && !(uc >= 0x4dc0 && uc < 0x4e00))
+ || (uc >= 0xac00 && uc < 0xd7a4) /* Hangul Syllables */
+ || (uc >= 0xf900 && uc < 0xfb00) /* CJK Compatibility Ideographs */
+ || (uc >= 0xfe10 && uc < 0xfe20) /* Presentation Forms for Vertical */
+ || (uc >= 0xfe30 && uc < 0xfe70) /* CJK Compatibility Forms */
+ || (uc >= 0xff00 && uc < 0xff61) /* Fullwidth Forms */
+ || (uc >= 0xffe0 && uc < 0xffe7) /* Fullwidth Signs */
+ || (uc >= 0x20000 && uc <= 0x2a6d6) /* CJK */
+ || (uc >= 0x2f800 && uc <= 0x2fa1d) /* CJK Compatibility Ideographs */
+ ) )
+ return 2;
+ /* In ancient CJK encodings, Cyrillic and most other characters are
+ double-width as well. */
+ if (uc >= 0x00A1 && uc < 0xFF61 && uc != 0x20A9
+ && is_cjk_encoding (encoding))
+ return 2;
+ return 1;
+}
diff --git a/gnulib/lib/unlink.c b/gnulib/lib/unlink.c
new file mode 100644
index 00000000..3e42e286
--- /dev/null
+++ b/gnulib/lib/unlink.c
@@ -0,0 +1,85 @@
+/* Work around unlink bugs.
+
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#undef unlink
+
+/* Remove file NAME.
+ Return 0 if successful, -1 if not. */
+
+int
+rpl_unlink (char const *name)
+{
+ /* Work around Solaris 9 bug where unlink("file/") succeeds. */
+ size_t len = strlen (name);
+ int result = 0;
+ if (len && ISSLASH (name[len - 1]))
+ {
+ /* We can't unlink(2) something if it doesn't exist. If it does
+ exist, then it resolved to a directory, due to the trailing
+ slash, and POSIX requires that the unlink attempt to remove
+ that directory (which would leave the symlink dangling).
+ Unfortunately, Solaris 9 is one of the platforms where the
+ root user can unlink directories, and we don't want to
+ cripple this behavior on real directories, even if it is
+ seldom needed (at any rate, it's nicer to let coreutils'
+ unlink(1) give the correct errno for non-root users). But we
+ don't know whether name was an actual directory, or a symlink
+ to a directory; and due to the bug of ignoring trailing
+ slash, Solaris 9 would end up successfully unlinking the
+ symlink instead of the directory. Technically, we could use
+ realpath to find the canonical directory name to attempt
+ deletion on. But that is a lot of work for a corner case; so
+ we instead just use an lstat on the shortened name, and
+ reject symlinks with trailing slashes. The root user of
+ unlink(1) will just have to live with the rule that they
+ can't delete a directory via a symlink. */
+ struct stat st;
+ result = lstat (name, &st);
+ if (result == 0)
+ {
+ /* Trailing NUL will overwrite the trailing slash. */
+ char *short_name = malloc (len);
+ if (!short_name)
+ {
+ errno = EPERM;
+ return -1;
+ }
+ memcpy (short_name, name, len);
+ while (len && ISSLASH (short_name[len - 1]))
+ short_name[--len] = '\0';
+ if (len && (lstat (short_name, &st) || S_ISLNK (st.st_mode)))
+ {
+ free (short_name);
+ errno = EPERM;
+ return -1;
+ }
+ free (short_name);
+ }
+ }
+ if (!result)
+ result = unlink (name);
+ return result;
+}
diff --git a/gnulib/lib/unlinkat.c b/gnulib/lib/unlinkat.c
new file mode 100644
index 00000000..008192e6
--- /dev/null
+++ b/gnulib/lib/unlinkat.c
@@ -0,0 +1,105 @@
+/* Work around unlinkat bugs on Solaris 9.
+
+ Copyright (C) 2009-2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "openat.h"
+
+#if HAVE_UNLINKAT
+
+# undef unlinkat
+
+/* unlinkat without AT_REMOVEDIR does not honor trailing / on Solaris
+ 9. Solve it in a similar manner to unlink. */
+
+int
+rpl_unlinkat (int fd, char const *name, int flag)
+{
+ size_t len;
+ int result = 0;
+ /* rmdir behavior has no problems with trailing slash. */
+ if (flag & AT_REMOVEDIR)
+ return unlinkat (fd, name, flag);
+
+ len = strlen (name);
+ if (len && ISSLASH (name[len - 1]))
+ {
+ /* See the lengthy comment in unlink.c why we disobey the POSIX
+ rule of letting unlink("link-to-dir/") attempt to unlink a
+ directory. */
+ struct stat st;
+ result = lstatat (fd, name, &st);
+ if (result == 0)
+ {
+ /* Trailing NUL will overwrite the trailing slash. */
+ char *short_name = malloc (len);
+ if (!short_name)
+ {
+ errno = EPERM;
+ return -1;
+ }
+ memcpy (short_name, name, len);
+ while (len && ISSLASH (short_name[len - 1]))
+ short_name[--len] = '\0';
+ if (len && (lstatat (fd, short_name, &st) || S_ISLNK (st.st_mode)))
+ {
+ free (short_name);
+ errno = EPERM;
+ return -1;
+ }
+ free (short_name);
+ }
+ }
+ if (!result)
+ result = unlinkat (fd, name, flag);
+ return result;
+}
+
+#else /* !HAVE_UNLINKAT */
+
+/* Replacement for Solaris' function by the same name.
+ <http://www.google.com/search?q=unlinkat+site:docs.sun.com>
+ First, try to simulate it via (unlink|rmdir) ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it via save_cwd/fchdir/(unlink|rmdir)/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, this function works just like Solaris' unlinkat. */
+
+# define AT_FUNC_NAME unlinkat
+# define AT_FUNC_F1 rmdir
+# define AT_FUNC_F2 unlink
+# define AT_FUNC_USE_F1_COND AT_REMOVEDIR
+# define AT_FUNC_POST_FILE_PARAM_DECLS , int flag
+# define AT_FUNC_POST_FILE_ARGS /* empty */
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_F2
+# undef AT_FUNC_USE_F1_COND
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* !HAVE_UNLINKAT */
diff --git a/gnulib/lib/unlinkdir.c b/gnulib/lib/unlinkdir.c
new file mode 100644
index 00000000..9407b7a5
--- /dev/null
+++ b/gnulib/lib/unlinkdir.c
@@ -0,0 +1,54 @@
+/* unlinkdir.c - determine whether we can unlink directories
+
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert, Jim Meyering, and David Bartley. */
+
+#include <config.h>
+
+#include "unlinkdir.h"
+#include "priv-set.h"
+#include <unistd.h>
+
+#if ! UNLINK_CANNOT_UNLINK_DIR
+
+/* Return true if we cannot unlink directories, false if we might be
+ able to unlink directories. */
+
+bool
+cannot_unlink_dir (void)
+{
+ static bool initialized;
+ static bool cannot;
+
+ if (! initialized)
+ {
+# if defined PRIV_SYS_LINKDIR
+ /* We might be able to unlink directories if we cannot
+ determine our privileges, or if we have the
+ PRIV_SYS_LINKDIR privilege. */
+ cannot = (priv_set_ismember (PRIV_SYS_LINKDIR) == 0);
+# else
+ /* In traditional Unix, only root can unlink directories. */
+ cannot = (geteuid () != 0);
+# endif
+ initialized = true;
+ }
+
+ return cannot;
+}
+
+#endif
diff --git a/gnulib/lib/unlinkdir.h b/gnulib/lib/unlinkdir.h
new file mode 100644
index 00000000..a4103c5e
--- /dev/null
+++ b/gnulib/lib/unlinkdir.h
@@ -0,0 +1,26 @@
+/* unlinkdir.h - determine (and maybe change) whether we can unlink directories
+
+ Copyright (C) 2005, 2009-2010 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/>. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#include <stdbool.h>
+
+#if UNLINK_CANNOT_UNLINK_DIR
+# define cannot_unlink_dir() true
+#else
+bool cannot_unlink_dir (void);
+#endif
diff --git a/gnulib/lib/unlocked-io.h b/gnulib/lib/unlocked-io.h
new file mode 100644
index 00000000..75bf89f6
--- /dev/null
+++ b/gnulib/lib/unlocked-io.h
@@ -0,0 +1,136 @@
+/* Prefer faster, non-thread-safe stdio functions if available.
+
+ Copyright (C) 2001-2004, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef UNLOCKED_IO_H
+# define UNLOCKED_IO_H 1
+
+/* These are wrappers for functions/macros from the GNU C library, and
+ from other C libraries supporting POSIX's optional thread-safe functions.
+
+ The standard I/O functions are thread-safe. These *_unlocked ones are
+ more efficient but not thread-safe. That they're not thread-safe is
+ fine since all of the applications in this package are single threaded.
+
+ Also, some code that is shared with the GNU C library may invoke
+ the *_unlocked functions directly. On hosts that lack those
+ functions, invoke the non-thread-safe versions instead. */
+
+# include <stdio.h>
+
+# if HAVE_DECL_CLEARERR_UNLOCKED
+# undef clearerr
+# define clearerr(x) clearerr_unlocked (x)
+# else
+# define clearerr_unlocked(x) clearerr (x)
+# endif
+
+# if HAVE_DECL_FEOF_UNLOCKED
+# undef feof
+# define feof(x) feof_unlocked (x)
+# else
+# define feof_unlocked(x) feof (x)
+# endif
+
+# if HAVE_DECL_FERROR_UNLOCKED
+# undef ferror
+# define ferror(x) ferror_unlocked (x)
+# else
+# define ferror_unlocked(x) ferror (x)
+# endif
+
+# if HAVE_DECL_FFLUSH_UNLOCKED
+# undef fflush
+# define fflush(x) fflush_unlocked (x)
+# else
+# define fflush_unlocked(x) fflush (x)
+# endif
+
+# if HAVE_DECL_FGETS_UNLOCKED
+# undef fgets
+# define fgets(x,y,z) fgets_unlocked (x,y,z)
+# else
+# define fgets_unlocked(x,y,z) fgets (x,y,z)
+# endif
+
+# if HAVE_DECL_FPUTC_UNLOCKED
+# undef fputc
+# define fputc(x,y) fputc_unlocked (x,y)
+# else
+# define fputc_unlocked(x,y) fputc (x,y)
+# endif
+
+# if HAVE_DECL_FPUTS_UNLOCKED
+# undef fputs
+# define fputs(x,y) fputs_unlocked (x,y)
+# else
+# define fputs_unlocked(x,y) fputs (x,y)
+# endif
+
+# if HAVE_DECL_FREAD_UNLOCKED
+# undef fread
+# define fread(w,x,y,z) fread_unlocked (w,x,y,z)
+# else
+# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
+# endif
+
+# if HAVE_DECL_FWRITE_UNLOCKED
+# undef fwrite
+# define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z)
+# else
+# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
+# endif
+
+# if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc(x) getc_unlocked (x)
+# else
+# define getc_unlocked(x) getc (x)
+# endif
+
+# if HAVE_DECL_GETCHAR_UNLOCKED
+# undef getchar
+# define getchar() getchar_unlocked ()
+# else
+# define getchar_unlocked() getchar ()
+# endif
+
+# if HAVE_DECL_PUTC_UNLOCKED
+# undef putc
+# define putc(x,y) putc_unlocked (x,y)
+# else
+# define putc_unlocked(x,y) putc (x,y)
+# endif
+
+# if HAVE_DECL_PUTCHAR_UNLOCKED
+# undef putchar
+# define putchar(x) putchar_unlocked (x)
+# else
+# define putchar_unlocked(x) putchar (x)
+# endif
+
+# undef flockfile
+# define flockfile(x) ((void) 0)
+
+# undef ftrylockfile
+# define ftrylockfile(x) 0
+
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+
+#endif /* UNLOCKED_IO_H */
diff --git a/gnulib/lib/unsetenv.c b/gnulib/lib/unsetenv.c
new file mode 100644
index 00000000..65a19cca
--- /dev/null
+++ b/gnulib/lib/unsetenv.c
@@ -0,0 +1,120 @@
+/* Copyright (C) 1992, 1995-2002, 2005-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the name == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+#if !_LIBC
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __environ environ
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of `environ'. */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean. */
+#ifdef _LIBC
+# define unsetenv __unsetenv
+#endif
+
+#if _LIBC || !HAVE_UNSETENV
+
+int
+unsetenv (const char *name)
+{
+ size_t len;
+ char **ep;
+
+ if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ len = strlen (name);
+
+ LOCK;
+
+ ep = __environ;
+ while (*ep != NULL)
+ if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
+ {
+ /* Found it. Remove this pointer by moving later ones back. */
+ char **dp = ep;
+
+ do
+ dp[0] = dp[1];
+ while (*dp++);
+ /* Continue the loop in case NAME appears again. */
+ }
+ else
+ ++ep;
+
+ UNLOCK;
+
+ return 0;
+}
+
+#ifdef _LIBC
+# undef unsetenv
+weak_alias (__unsetenv, unsetenv)
+#endif
+
+#else /* HAVE_UNSETENV */
+
+# undef unsetenv
+
+/* Call the underlying unsetenv, in case there is hidden bookkeeping
+ that needs updating beyond just modifying environ. */
+int
+rpl_unsetenv (const char *name)
+{
+ int result = 0;
+ if (!name || !*name || strchr (name, '='))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ while (getenv (name))
+# if !VOID_UNSETENV
+ result =
+# endif
+ unsetenv (name);
+ return result;
+}
+
+#endif /* HAVE_UNSETENV */
diff --git a/gnulib/lib/userspec.c b/gnulib/lib/userspec.c
new file mode 100644
index 00000000..388f7233
--- /dev/null
+++ b/gnulib/lib/userspec.c
@@ -0,0 +1,309 @@
+/* userspec.c -- Parse a user and group string.
+ Copyright (C) 1989-1992, 1997-1998, 2000, 2002-2010 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/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "userspec.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <unistd.h>
+
+#include "intprops.h"
+#include "inttostr.h"
+#include "xalloc.h"
+#include "xstrtol.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#ifndef HAVE_ENDGRENT
+# define endgrent() ((void) 0)
+#endif
+
+#ifndef HAVE_ENDPWENT
+# define endpwent() ((void) 0)
+#endif
+
+#ifndef UID_T_MAX
+# define UID_T_MAX TYPE_MAXIMUM (uid_t)
+#endif
+
+#ifndef GID_T_MAX
+# define GID_T_MAX TYPE_MAXIMUM (gid_t)
+#endif
+
+/* MAXUID may come from limits.h or sys/params.h. */
+#ifndef MAXUID
+# define MAXUID UID_T_MAX
+#endif
+#ifndef MAXGID
+# define MAXGID GID_T_MAX
+#endif
+
+#ifdef __DJGPP__
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* Return true if STR represents an unsigned decimal integer. */
+
+static bool
+is_number (const char *str)
+{
+ do
+ {
+ if (!ISDIGIT (*str))
+ return false;
+ }
+ while (*++str);
+
+ return true;
+}
+#endif
+
+static char const *
+parse_with_separator (char const *spec, char const *separator,
+ uid_t *uid, gid_t *gid,
+ char **username, char **groupname)
+{
+ static const char *E_invalid_user = N_("invalid user");
+ static const char *E_invalid_group = N_("invalid group");
+ static const char *E_bad_spec = N_("invalid spec");
+
+ const char *error_msg;
+ struct passwd *pwd;
+ struct group *grp;
+ char *u;
+ char const *g;
+ char *gname = NULL;
+ uid_t unum = *uid;
+ gid_t gnum = *gid;
+
+ error_msg = NULL;
+ *username = *groupname = NULL;
+
+ /* Set U and G to nonzero length strings corresponding to user and
+ group specifiers or to NULL. If U is not NULL, it is a newly
+ allocated string. */
+
+ u = NULL;
+ if (separator == NULL)
+ {
+ if (*spec)
+ u = xstrdup (spec);
+ }
+ else
+ {
+ size_t ulen = separator - spec;
+ if (ulen != 0)
+ {
+ u = xmemdup (spec, ulen + 1);
+ u[ulen] = '\0';
+ }
+ }
+
+ g = (separator == NULL || *(separator + 1) == '\0'
+ ? NULL
+ : separator + 1);
+
+#ifdef __DJGPP__
+ /* Pretend that we are the user U whose group is G. This makes
+ pwd and grp functions ``know'' about the UID and GID of these. */
+ if (u && !is_number (u))
+ setenv ("USER", u, 1);
+ if (g && !is_number (g))
+ setenv ("GROUP", g, 1);
+#endif
+
+ if (u != NULL)
+ {
+ /* If it starts with "+", skip the look-up. */
+ pwd = (*u == '+' ? NULL : getpwnam (u));
+ if (pwd == NULL)
+ {
+ bool use_login_group = (separator != NULL && g == NULL);
+ if (use_login_group)
+ {
+ /* If there is no group,
+ then there may not be a trailing ":", either. */
+ error_msg = E_bad_spec;
+ }
+ else
+ {
+ unsigned long int tmp;
+ if (xstrtoul (u, NULL, 10, &tmp, "") == LONGINT_OK
+ && tmp <= MAXUID && (uid_t) tmp != (uid_t) -1)
+ unum = tmp;
+ else
+ error_msg = E_invalid_user;
+ }
+ }
+ else
+ {
+ unum = pwd->pw_uid;
+ if (g == NULL && separator != NULL)
+ {
+ /* A separator was given, but a group was not specified,
+ so get the login group. */
+ char buf[INT_BUFSIZE_BOUND (uintmax_t)];
+ gnum = pwd->pw_gid;
+ grp = getgrgid (gnum);
+ gname = xstrdup (grp ? grp->gr_name : umaxtostr (gnum, buf));
+ endgrent ();
+ }
+ }
+ endpwent ();
+ }
+
+ if (g != NULL && error_msg == NULL)
+ {
+ /* Explicit group. */
+ /* If it starts with "+", skip the look-up. */
+ grp = (*g == '+' ? NULL : getgrnam (g));
+ if (grp == NULL)
+ {
+ unsigned long int tmp;
+ if (xstrtoul (g, NULL, 10, &tmp, "") == LONGINT_OK
+ && tmp <= MAXGID && (gid_t) tmp != (gid_t) -1)
+ gnum = tmp;
+ else
+ error_msg = E_invalid_group;
+ }
+ else
+ gnum = grp->gr_gid;
+ endgrent (); /* Save a file descriptor. */
+ gname = xstrdup (g);
+ }
+
+ if (error_msg == NULL)
+ {
+ *uid = unum;
+ *gid = gnum;
+ *username = u;
+ *groupname = gname;
+ u = NULL;
+ }
+ else
+ free (gname);
+
+ free (u);
+ return _(error_msg);
+}
+
+/* Extract from SPEC, which has the form "[user][:.][group]",
+ a USERNAME, UID U, GROUPNAME, and GID G.
+ Either user or group, or both, must be present.
+ If the group is omitted but the separator is given,
+ use the given user's login group.
+ If SPEC contains a `:', then use that as the separator, ignoring
+ any `.'s. If there is no `:', but there is a `.', then first look
+ up the entire SPEC as a login name. If that look-up fails, then
+ try again interpreting the `.' as a separator.
+
+ USERNAME and GROUPNAME will be in newly malloc'd memory.
+ Either one might be NULL instead, indicating that it was not
+ given and the corresponding numeric ID was left unchanged.
+
+ Return NULL if successful, a static error message string if not. */
+
+char const *
+parse_user_spec (char const *spec, uid_t *uid, gid_t *gid,
+ char **username, char **groupname)
+{
+ char const *colon = strchr (spec, ':');
+ char const *error_msg =
+ parse_with_separator (spec, colon, uid, gid, username, groupname);
+
+ if (!colon && error_msg)
+ {
+ /* If there's no colon but there is a dot, and if looking up the
+ whole spec failed (i.e., the spec is not a owner name that
+ includes a dot), then try again, but interpret the dot as a
+ separator. This is a compatible extension to POSIX, since
+ the POSIX-required behavior is always tried first. */
+
+ char const *dot = strchr (spec, '.');
+ if (dot
+ && ! parse_with_separator (spec, dot, uid, gid, username, groupname))
+ error_msg = NULL;
+ }
+
+ return error_msg;
+}
+
+#ifdef TEST
+
+# define NULL_CHECK(s) ((s) == NULL ? "(null)" : (s))
+
+int
+main (int argc, char **argv)
+{
+ int i;
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *e;
+ char *username, *groupname;
+ uid_t uid;
+ gid_t gid;
+ char *tmp;
+
+ tmp = strdup (argv[i]);
+ e = parse_user_spec (tmp, &uid, &gid, &username, &groupname);
+ free (tmp);
+ printf ("%s: %lu %lu %s %s %s\n",
+ argv[i],
+ (unsigned long int) uid,
+ (unsigned long int) gid,
+ NULL_CHECK (username),
+ NULL_CHECK (groupname),
+ NULL_CHECK (e));
+ }
+
+ exit (0);
+}
+
+#endif
+
+/*
+Local Variables:
+indent-tabs-mode: nil
+End:
+*/
diff --git a/gnulib/lib/userspec.h b/gnulib/lib/userspec.h
new file mode 100644
index 00000000..67af8451
--- /dev/null
+++ b/gnulib/lib/userspec.h
@@ -0,0 +1,10 @@
+#ifndef USERSPEC_H
+# define USERSPEC_H 1
+
+# include <sys/types.h>
+
+const char *
+parse_user_spec (const char *spec_arg, uid_t *uid, gid_t *gid,
+ char **username_arg, char **groupname_arg);
+
+#endif
diff --git a/gnulib/lib/usleep.c b/gnulib/lib/usleep.c
new file mode 100644
index 00000000..679c8c49
--- /dev/null
+++ b/gnulib/lib/usleep.c
@@ -0,0 +1,58 @@
+/* Pausing execution of the current thread.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Eric Blake <ebb9@byu.net>, 2009.
+
+ 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/>. */
+
+/* This file is _intentionally_ light-weight. Rather than using
+ select or nanosleep, both of which drag in external libraries on
+ some platforms, this merely rounds up to the nearest second if
+ usleep() does not exist. If sub-second resolution is important,
+ then use a more powerful interface to begin with. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#ifndef HAVE_USLEEP
+# define HAVE_USLEEP 0
+#endif
+
+/* Sleep for MICRO microseconds, which can be greater than 1 second.
+ Return -1 and set errno to EINVAL on range error (about 4295
+ seconds), or 0 on success. Interaction with SIGALARM is
+ unspecified. */
+
+int
+usleep (useconds_t micro)
+{
+ unsigned int seconds = micro / 1000000;
+ if (sizeof seconds < sizeof micro && micro / 1000000 != seconds)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ if (!HAVE_USLEEP && micro % 1000000)
+ seconds++;
+ while ((seconds = sleep (seconds)) != 0);
+
+#undef usleep
+#if !HAVE_USLEEP
+# define usleep(x) 0
+#endif
+ return usleep (micro % 1000000);
+}
diff --git a/gnulib/lib/utime.c b/gnulib/lib/utime.c
new file mode 100644
index 00000000..b5d3aa56
--- /dev/null
+++ b/gnulib/lib/utime.c
@@ -0,0 +1,108 @@
+/* Copyright (C) 1998, 2001-2004, 2006, 2009-2010 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 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/>. */
+
+/* derived from a function in touch.c */
+
+#include <config.h>
+#undef utime
+
+#include <sys/types.h>
+
+#ifdef HAVE_UTIME_H
+# include <utime.h>
+#endif
+
+#if !HAVE_UTIMES_NULL
+# include <sys/stat.h>
+# include <fcntl.h>
+#endif
+
+#include <unistd.h>
+#include <errno.h>
+
+#include "full-write.h"
+#include "safe-read.h"
+
+/* Some systems (even some that do have <utime.h>) don't declare this
+ structure anywhere. */
+#ifndef HAVE_STRUCT_UTIMBUF
+struct utimbuf
+{
+ long actime;
+ long modtime;
+};
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+/* Emulate utime (file, NULL) for systems (like 4.3BSD) that do not
+ interpret it to set the access and modification times of FILE to
+ the current time. Return 0 if successful, -1 if not. */
+
+static int
+utime_null (const char *file)
+{
+#if HAVE_UTIMES_NULL
+ return utimes (file, 0);
+#else
+ int fd;
+ char c;
+ int status = 0;
+ struct stat st;
+ int saved_errno = 0;
+
+ fd = open (file, O_RDWR);
+ if (fd < 0
+ || fstat (fd, &st) < 0
+ || safe_read (fd, &c, sizeof c) == SAFE_READ_ERROR
+ || lseek (fd, (off_t) 0, SEEK_SET) < 0
+ || full_write (fd, &c, sizeof c) != sizeof c
+ /* Maybe do this -- it's necessary on SunOS 4.1.3 with some combination
+ of patches, but that system doesn't use this code: it has utimes.
+ || fsync (fd) < 0
+ */
+ || (st.st_size == 0 && ftruncate (fd, st.st_size) < 0))
+ {
+ saved_errno = errno;
+ status = -1;
+ }
+
+ if (0 <= fd)
+ {
+ if (close (fd) < 0)
+ status = -1;
+
+ /* If there was a prior failure, use the saved errno value.
+ But if the only failure was in the close, don't change errno. */
+ if (saved_errno)
+ errno = saved_errno;
+ }
+
+ return status;
+#endif
+}
+
+int
+rpl_utime (const char *file, const struct utimbuf *times)
+{
+ if (times)
+ return utime (file, times);
+
+ return utime_null (file);
+}
diff --git a/gnulib/lib/utimecmp.c b/gnulib/lib/utimecmp.c
new file mode 100644
index 00000000..63a0c9a8
--- /dev/null
+++ b/gnulib/lib/utimecmp.c
@@ -0,0 +1,356 @@
+/* utimecmp.c -- compare file time stamps
+
+ Copyright (C) 2004-2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "utimecmp.h"
+
+#include <limits.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "hash.h"
+#include "intprops.h"
+#include "stat-time.h"
+#include "utimens.h"
+#include "verify.h"
+#include "xalloc.h"
+
+#ifndef MAX
+# define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+
+#define BILLION (1000 * 1000 * 1000)
+
+/* Best possible resolution that utimens can set and stat can return,
+ due to system-call limitations. It must be a power of 10 that is
+ no greater than 1 billion. */
+#if HAVE_UTIMENSAT
+enum { SYSCALL_RESOLUTION = 1 };
+#elif ((HAVE_FUTIMESAT || HAVE_WORKING_UTIMES) \
+ && (defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_ATIMENSEC \
+ || defined HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_SPARE1))
+enum { SYSCALL_RESOLUTION = 1000 };
+#else
+enum { SYSCALL_RESOLUTION = BILLION };
+#endif
+
+/* Describe a file system and its time stamp resolution in nanoseconds. */
+struct fs_res
+{
+ /* Device number of file system. */
+ dev_t dev;
+
+ /* An upper bound on the time stamp resolution of this file system,
+ ignoring any resolution that cannot be set via utimens. It is
+ represented by an integer count of nanoseconds. It must be
+ either 2 billion, or a power of 10 that is no greater than a
+ billion and is no less than SYSCALL_RESOLUTION. */
+ int resolution;
+
+ /* True if RESOLUTION is known to be exact, and is not merely an
+ upper bound on the true resolution. */
+ bool exact;
+};
+
+/* Hash some device info. */
+static size_t
+dev_info_hash (void const *x, size_t table_size)
+{
+ struct fs_res const *p = x;
+
+ /* Beware signed arithmetic gotchas. */
+ if (TYPE_SIGNED (dev_t) && SIZE_MAX < MAX (INT_MAX, TYPE_MAXIMUM (dev_t)))
+ {
+ uintmax_t dev = p->dev;
+ return dev % table_size;
+ }
+
+ return p->dev % table_size;
+}
+
+/* Compare two dev_info structs. */
+static bool
+dev_info_compare (void const *x, void const *y)
+{
+ struct fs_res const *a = x;
+ struct fs_res const *b = y;
+ return a->dev == b->dev;
+}
+
+/* Return -1, 0, 1 based on whether the destination file (with name
+ DST_NAME and status DST_STAT) is older than SRC_STAT, the same age
+ as SRC_STAT, or newer than SRC_STAT, respectively.
+
+ DST_NAME may be NULL if OPTIONS is 0.
+
+ If OPTIONS & UTIMECMP_TRUNCATE_SOURCE, do the comparison after SRC is
+ converted to the destination's timestamp resolution as filtered through
+ utimens. In this case, return -2 if the exact answer cannot be
+ determined; this can happen only if the time stamps are very close and
+ there is some trouble accessing the file system (e.g., the user does not
+ have permission to futz with the destination's time stamps). */
+
+int
+utimecmp (char const *dst_name,
+ struct stat const *dst_stat,
+ struct stat const *src_stat,
+ int options)
+{
+ /* Things to watch out for:
+
+ The code uses a static hash table internally and is not safe in the
+ presence of signals, multiple threads, etc.
+
+ int and long int might be 32 bits. Many of the calculations store
+ numbers up to 2 billion, and multiply by 10; they have to avoid
+ multiplying 2 billion by 10, as this exceeds 32-bit capabilities.
+
+ time_t might be unsigned. */
+
+ verify (TYPE_IS_INTEGER (time_t));
+ verify (TYPE_TWOS_COMPLEMENT (int));
+
+ /* Destination and source time stamps. */
+ time_t dst_s = dst_stat->st_mtime;
+ time_t src_s = src_stat->st_mtime;
+ int dst_ns = get_stat_mtime_ns (dst_stat);
+ int src_ns = get_stat_mtime_ns (src_stat);
+
+ if (options & UTIMECMP_TRUNCATE_SOURCE)
+ {
+ /* Look up the time stamp resolution for the destination device. */
+
+ /* Hash table for devices. */
+ static Hash_table *ht;
+
+ /* Information about the destination file system. */
+ static struct fs_res *new_dst_res;
+ struct fs_res *dst_res;
+
+ /* Time stamp resolution in nanoseconds. */
+ int res;
+
+ /* Quick exit, if possible. Since the worst resolution is 2
+ seconds, anything that differs by more than that does not
+ needs source truncation. */
+ if (dst_s == src_s && dst_ns == src_ns)
+ return 0;
+ if (dst_s <= src_s - 2)
+ return -1;
+ if (src_s <= dst_s - 2)
+ return 1;
+
+ if (! ht)
+ ht = hash_initialize (16, NULL, dev_info_hash, dev_info_compare, free);
+ if (! new_dst_res)
+ {
+ new_dst_res = xmalloc (sizeof *new_dst_res);
+ new_dst_res->resolution = 2 * BILLION;
+ new_dst_res->exact = false;
+ }
+ new_dst_res->dev = dst_stat->st_dev;
+ dst_res = hash_insert (ht, new_dst_res);
+ if (! dst_res)
+ xalloc_die ();
+
+ if (dst_res == new_dst_res)
+ {
+ /* NEW_DST_RES is now in use in the hash table, so allocate a
+ new entry next time. */
+ new_dst_res = NULL;
+ }
+
+ res = dst_res->resolution;
+
+#ifdef _PC_TIMESTAMP_RESOLUTION
+ /* If the system will tell us the resolution, we're set! */
+ if (! dst_res->exact)
+ {
+ res = pathconf (dst_name, _PC_TIMESTAMP_RESOLUTION);
+ if (0 < res)
+ {
+ dst_res->resolution = res;
+ dst_res->exact = true;
+ }
+ }
+#endif
+
+ if (! dst_res->exact)
+ {
+ /* This file system's resolution is not known exactly.
+ Deduce it, and store the result in the hash table. */
+
+ time_t dst_a_s = dst_stat->st_atime;
+ time_t dst_c_s = dst_stat->st_ctime;
+ time_t dst_m_s = dst_s;
+ int dst_a_ns = get_stat_atime_ns (dst_stat);
+ int dst_c_ns = get_stat_ctime_ns (dst_stat);
+ int dst_m_ns = dst_ns;
+
+ /* Set RES to an upper bound on the file system resolution
+ (after truncation due to SYSCALL_RESOLUTION) by inspecting
+ the atime, ctime and mtime of the existing destination.
+ We don't know of any file system that stores atime or
+ ctime with a higher precision than mtime, so it's valid to
+ look at them too. */
+ {
+ bool odd_second = (dst_a_s | dst_c_s | dst_m_s) & 1;
+
+ if (SYSCALL_RESOLUTION == BILLION)
+ {
+ if (odd_second | dst_a_ns | dst_c_ns | dst_m_ns)
+ res = BILLION;
+ }
+ else
+ {
+ int a = dst_a_ns;
+ int c = dst_c_ns;
+ int m = dst_m_ns;
+
+ /* Write it this way to avoid mistaken GCC warning
+ about integer overflow in constant expression. */
+ int SR10 = SYSCALL_RESOLUTION; SR10 *= 10;
+
+ if ((a % SR10 | c % SR10 | m % SR10) != 0)
+ res = SYSCALL_RESOLUTION;
+ else
+ for (res = SR10, a /= SR10, c /= SR10, m /= SR10;
+ (res < dst_res->resolution
+ && (a % 10 | c % 10 | m % 10) == 0);
+ res *= 10, a /= 10, c /= 10, m /= 10)
+ if (res == BILLION)
+ {
+ if (! odd_second)
+ res *= 2;
+ break;
+ }
+ }
+
+ dst_res->resolution = res;
+ }
+
+ if (SYSCALL_RESOLUTION < res)
+ {
+ struct timespec timespec[2];
+ struct stat dst_status;
+
+ /* Ignore source time stamp information that must necessarily
+ be lost when filtered through utimens. */
+ src_ns -= src_ns % SYSCALL_RESOLUTION;
+
+ /* If the time stamps disagree widely enough, there's no need
+ to interrogate the file system to deduce the exact time
+ stamp resolution; return the answer directly. */
+ {
+ time_t s = src_s & ~ (res == 2 * BILLION);
+ if (src_s < dst_s || (src_s == dst_s && src_ns <= dst_ns))
+ return 1;
+ if (dst_s < s
+ || (dst_s == s && dst_ns < src_ns - src_ns % res))
+ return -1;
+ }
+
+ /* Determine the actual time stamp resolution for the
+ destination file system (after truncation due to
+ SYSCALL_RESOLUTION) by setting the access time stamp of the
+ destination to the existing access time, except with
+ trailing nonzero digits. */
+
+ timespec[0].tv_sec = dst_a_s;
+ timespec[0].tv_nsec = dst_a_ns;
+ timespec[1].tv_sec = dst_m_s | (res == 2 * BILLION);
+ timespec[1].tv_nsec = dst_m_ns + res / 9;
+
+ /* Set the modification time. But don't try to set the
+ modification time of symbolic links; on many hosts this sets
+ the time of the pointed-to file. */
+ if ((S_ISLNK (dst_stat->st_mode)
+ ? lutimens (dst_name, timespec)
+ : utimens (dst_name, timespec)) != 0)
+ return -2;
+
+ /* Read the modification time that was set. */
+ {
+ int stat_result = (S_ISLNK (dst_stat->st_mode)
+ ? lstat (dst_name, &dst_status)
+ : stat (dst_name, &dst_status));
+
+ if (stat_result
+ | (dst_status.st_mtime ^ dst_m_s)
+ | (get_stat_mtime_ns (&dst_status) ^ dst_m_ns))
+ {
+ /* The modification time changed, or we can't tell whether
+ it changed. Change it back as best we can. */
+ timespec[1].tv_sec = dst_m_s;
+ timespec[1].tv_nsec = dst_m_ns;
+ if (S_ISLNK (dst_stat->st_mode))
+ lutimens (dst_name, timespec);
+ else
+ utimens (dst_name, timespec);
+ }
+
+ if (stat_result != 0)
+ return -2;
+ }
+
+ /* Determine the exact resolution from the modification time
+ that was read back. */
+ {
+ int old_res = res;
+ int a = (BILLION * (dst_status.st_mtime & 1)
+ + get_stat_mtime_ns (&dst_status));
+
+ res = SYSCALL_RESOLUTION;
+
+ for (a /= res; a % 10 != 0; a /= 10)
+ {
+ if (res == BILLION)
+ {
+ res *= 2;
+ break;
+ }
+ res *= 10;
+ if (res == old_res)
+ break;
+ }
+ }
+ }
+
+ dst_res->resolution = res;
+ dst_res->exact = true;
+ }
+
+ /* Truncate the source's time stamp according to the resolution. */
+ src_s &= ~ (res == 2 * BILLION);
+ src_ns -= src_ns % res;
+ }
+
+ /* Compare the time stamps and return -1, 0, 1 accordingly. */
+ return (dst_s < src_s ? -1
+ : dst_s > src_s ? 1
+ : dst_ns < src_ns ? -1
+ : dst_ns > src_ns);
+}
diff --git a/gnulib/lib/utimecmp.h b/gnulib/lib/utimecmp.h
new file mode 100644
index 00000000..6e80c076
--- /dev/null
+++ b/gnulib/lib/utimecmp.h
@@ -0,0 +1,37 @@
+/* utimecmp.h -- compare file time stamps
+
+ Copyright (C) 2004, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef UTIMECMP_H
+#define UTIMECMP_H 1
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* Options for utimecmp. */
+enum
+{
+ /* Before comparing, truncate the source time stamp to the
+ resolution of the destination file system and to the resolution
+ of utimens. */
+ UTIMECMP_TRUNCATE_SOURCE = 1
+};
+
+int utimecmp (char const *, struct stat const *, struct stat const *, int);
+
+#endif
diff --git a/gnulib/lib/utimens.c b/gnulib/lib/utimens.c
new file mode 100644
index 00000000..bdb5a25a
--- /dev/null
+++ b/gnulib/lib/utimens.c
@@ -0,0 +1,513 @@
+/* Set file access and modification times.
+
+ Copyright (C) 2003-2010 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 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/>. */
+
+/* Written by Paul Eggert. */
+
+/* derived from a function in touch.c */
+
+#include <config.h>
+
+#include "utimens.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#include "stat-time.h"
+#include "timespec.h"
+
+#if HAVE_UTIME_H
+# include <utime.h>
+#endif
+
+/* Some systems (even some that do have <utime.h>) don't declare this
+ structure anywhere. */
+#ifndef HAVE_STRUCT_UTIMBUF
+struct utimbuf
+{
+ long actime;
+ long modtime;
+};
+#endif
+
+/* Avoid recursion with rpl_futimens or rpl_utimensat. */
+#undef futimens
+#undef utimensat
+
+/* Solaris 9 mistakenly succeeds when given a non-directory with a
+ trailing slash. Force the use of rpl_stat for a fix. */
+#ifndef REPLACE_FUNC_STAT_FILE
+# define REPLACE_FUNC_STAT_FILE 0
+#endif
+
+#if HAVE_UTIMENSAT || HAVE_FUTIMENS
+/* Cache variables for whether the utimensat syscall works; used to
+ avoid calling the syscall if we know it will just fail with ENOSYS,
+ and to avoid unnecessary work in massaging timestamps if the
+ syscall will work. Multiple variables are needed, to distinguish
+ between the following scenarios on Linux:
+ utimensat doesn't exist, or is in glibc but kernel 2.6.18 fails with ENOSYS
+ kernel 2.6.22 and earlier rejects AT_SYMLINK_NOFOLLOW
+ kernel 2.6.25 and earlier reject UTIME_NOW/UTIME_OMIT with non-zero tv_sec
+ kernel 2.6.32 used with xfs or ntfs-3g fail to honor UTIME_OMIT
+ utimensat completely works
+ For each cache variable: 0 = unknown, 1 = yes, -1 = no. */
+static int utimensat_works_really;
+static int lutimensat_works_really;
+#endif /* HAVE_UTIMENSAT || HAVE_FUTIMENS */
+
+/* Validate the requested timestamps. Return 0 if the resulting
+ timespec can be used for utimensat (after possibly modifying it to
+ work around bugs in utimensat). Return a positive value if the
+ timespec needs further adjustment based on stat results: 1 if any
+ adjustment is needed for utimes, and 2 if any adjustment is needed
+ for Linux utimensat. Return -1, with errno set to EINVAL, if
+ timespec is out of range. */
+static int
+validate_timespec (struct timespec timespec[2])
+{
+ int result = 0;
+ int utime_omit_count = 0;
+ assert (timespec);
+ if ((timespec[0].tv_nsec != UTIME_NOW
+ && timespec[0].tv_nsec != UTIME_OMIT
+ && (timespec[0].tv_nsec < 0 || 1000000000 <= timespec[0].tv_nsec))
+ || (timespec[1].tv_nsec != UTIME_NOW
+ && timespec[1].tv_nsec != UTIME_OMIT
+ && (timespec[1].tv_nsec < 0 || 1000000000 <= timespec[1].tv_nsec)))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ /* Work around Linux kernel 2.6.25 bug, where utimensat fails with
+ EINVAL if tv_sec is not 0 when using the flag values of tv_nsec.
+ Flag a Linux kernel 2.6.32 bug, where an mtime of UTIME_OMIT
+ fails to bump ctime. */
+ if (timespec[0].tv_nsec == UTIME_NOW
+ || timespec[0].tv_nsec == UTIME_OMIT)
+ {
+ timespec[0].tv_sec = 0;
+ result = 1;
+ if (timespec[0].tv_nsec == UTIME_OMIT)
+ utime_omit_count++;
+ }
+ if (timespec[1].tv_nsec == UTIME_NOW
+ || timespec[1].tv_nsec == UTIME_OMIT)
+ {
+ timespec[1].tv_sec = 0;
+ result = 1;
+ if (timespec[1].tv_nsec == UTIME_OMIT)
+ utime_omit_count++;
+ }
+ return result + (utime_omit_count == 1);
+}
+
+/* Normalize any UTIME_NOW or UTIME_OMIT values in *TS, using stat
+ buffer STATBUF to obtain the current timestamps of the file. If
+ both times are UTIME_NOW, set *TS to NULL (as this can avoid some
+ permissions issues). If both times are UTIME_OMIT, return true
+ (nothing further beyond the prior collection of STATBUF is
+ necessary); otherwise return false. */
+static bool
+update_timespec (struct stat const *statbuf, struct timespec *ts[2])
+{
+ struct timespec *timespec = *ts;
+ if (timespec[0].tv_nsec == UTIME_OMIT
+ && timespec[1].tv_nsec == UTIME_OMIT)
+ return true;
+ if (timespec[0].tv_nsec == UTIME_NOW
+ && timespec[1].tv_nsec == UTIME_NOW)
+ {
+ *ts = NULL;
+ return false;
+ }
+
+ if (timespec[0].tv_nsec == UTIME_OMIT)
+ timespec[0] = get_stat_atime (statbuf);
+ else if (timespec[0].tv_nsec == UTIME_NOW)
+ gettime (&timespec[0]);
+
+ if (timespec[1].tv_nsec == UTIME_OMIT)
+ timespec[1] = get_stat_mtime (statbuf);
+ else if (timespec[1].tv_nsec == UTIME_NOW)
+ gettime (&timespec[1]);
+
+ return false;
+}
+
+/* Set the access and modification time stamps of FD (a.k.a. FILE) to be
+ TIMESPEC[0] and TIMESPEC[1], respectively.
+ FD must be either negative -- in which case it is ignored --
+ or a file descriptor that is open on FILE.
+ If FD is nonnegative, then FILE can be NULL, which means
+ use just futimes (or equivalent) instead of utimes (or equivalent),
+ and fail if on an old system without futimes (or equivalent).
+ If TIMESPEC is null, set the time stamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+int
+fdutimens (char const *file, int fd, struct timespec const timespec[2])
+{
+ struct timespec adjusted_timespec[2];
+ struct timespec *ts = timespec ? adjusted_timespec : NULL;
+ int adjustment_needed = 0;
+ struct stat st;
+
+ if (ts)
+ {
+ adjusted_timespec[0] = timespec[0];
+ adjusted_timespec[1] = timespec[1];
+ adjustment_needed = validate_timespec (ts);
+ }
+ if (adjustment_needed < 0)
+ return -1;
+
+ /* Require that at least one of FD or FILE are valid. Works around
+ a Linux bug where futimens (AT_FDCWD, NULL) changes "." rather
+ than failing. */
+ if (!file)
+ {
+ if (fd < 0)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (dup2 (fd, fd) != fd)
+ return -1;
+ }
+
+ /* Some Linux-based NFS clients are buggy, and mishandle time stamps
+ of files in NFS file systems in some cases. We have no
+ configure-time test for this, but please see
+ <http://bugs.gentoo.org/show_bug.cgi?id=132673> for references to
+ some of the problems with Linux 2.6.16. If this affects you,
+ compile with -DHAVE_BUGGY_NFS_TIME_STAMPS; this is reported to
+ help in some cases, albeit at a cost in performance. But you
+ really should upgrade your kernel to a fixed version, since the
+ problem affects many applications. */
+
+#if HAVE_BUGGY_NFS_TIME_STAMPS
+ if (fd < 0)
+ sync ();
+ else
+ fsync (fd);
+#endif
+
+ /* POSIX 2008 added two interfaces to set file timestamps with
+ nanosecond resolution; newer Linux implements both functions via
+ a single syscall. We provide a fallback for ENOSYS (for example,
+ compiling against Linux 2.6.25 kernel headers and glibc 2.7, but
+ running on Linux 2.6.18 kernel). */
+#if HAVE_UTIMENSAT || HAVE_FUTIMENS
+ if (0 <= utimensat_works_really)
+ {
+ int result;
+# if __linux__
+ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
+ systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
+ but work if both times are either explicitly specified or
+ UTIME_NOW. Work around it with a preparatory [f]stat prior
+ to calling futimens/utimensat; fortunately, there is not much
+ timing impact due to the extra syscall even on file systems
+ where UTIME_OMIT would have worked. FIXME: Simplify this in
+ 2012, when file system bugs are no longer common. */
+ if (adjustment_needed == 2)
+ {
+ if (fd < 0 ? stat (file, &st) : fstat (fd, &st))
+ return -1;
+ if (ts[0].tv_nsec == UTIME_OMIT)
+ ts[0] = get_stat_atime (&st);
+ else if (ts[1].tv_nsec == UTIME_OMIT)
+ ts[1] = get_stat_mtime (&st);
+ /* Note that st is good, in case utimensat gives ENOSYS. */
+ adjustment_needed++;
+ }
+# endif /* __linux__ */
+# if HAVE_UTIMENSAT
+ if (fd < 0)
+ {
+ result = utimensat (AT_FDCWD, file, ts, 0);
+# ifdef __linux__
+ /* Work around a kernel bug:
+ http://bugzilla.redhat.com/442352
+ http://bugzilla.redhat.com/449910
+ It appears that utimensat can mistakenly return 280 rather
+ than -1 upon ENOSYS failure.
+ FIXME: remove in 2010 or whenever the offending kernels
+ are no longer in common use. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif /* __linux__ */
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ return result;
+ }
+ }
+# endif /* HAVE_UTIMENSAT */
+# if HAVE_FUTIMENS
+ if (0 <= fd)
+ {
+ result = futimens (fd, ts);
+# ifdef __linux__
+ /* Work around the same bug as above. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif /* __linux__ */
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ return result;
+ }
+ }
+# endif /* HAVE_FUTIMENS */
+ }
+ utimensat_works_really = -1;
+ lutimensat_works_really = -1;
+#endif /* HAVE_UTIMENSAT || HAVE_FUTIMENS */
+
+ /* The platform lacks an interface to set file timestamps with
+ nanosecond resolution, so do the best we can, discarding any
+ fractional part of the timestamp. */
+
+ if (adjustment_needed || (REPLACE_FUNC_STAT_FILE && fd < 0))
+ {
+ if (adjustment_needed != 3
+ && (fd < 0 ? stat (file, &st) : fstat (fd, &st)))
+ return -1;
+ if (ts && update_timespec (&st, &ts))
+ return 0;
+ }
+
+ {
+#if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES
+ struct timeval timeval[2];
+ struct timeval const *t;
+ if (ts)
+ {
+ timeval[0].tv_sec = ts[0].tv_sec;
+ timeval[0].tv_usec = ts[0].tv_nsec / 1000;
+ timeval[1].tv_sec = ts[1].tv_sec;
+ timeval[1].tv_usec = ts[1].tv_nsec / 1000;
+ t = timeval;
+ }
+ else
+ t = NULL;
+
+ if (fd < 0)
+ {
+# if HAVE_FUTIMESAT
+ return futimesat (AT_FDCWD, file, t);
+# endif
+ }
+ else
+ {
+ /* If futimesat or futimes fails here, don't try to speed things
+ up by returning right away. glibc can incorrectly fail with
+ errno == ENOENT if /proc isn't mounted. Also, Mandrake 10.0
+ in high security mode doesn't allow ordinary users to read
+ /proc/self, so glibc incorrectly fails with errno == EACCES.
+ If errno == EIO, EPERM, or EROFS, it's probably safe to fail
+ right away, but these cases are rare enough that they're not
+ worth optimizing, and who knows what other messed-up systems
+ are out there? So play it safe and fall back on the code
+ below. */
+# if HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG
+ if (futimesat (fd, NULL, t) == 0)
+ return 0;
+# elif HAVE_FUTIMES
+ if (futimes (fd, t) == 0)
+ return 0;
+# endif
+ }
+#endif /* HAVE_FUTIMESAT || HAVE_WORKING_UTIMES */
+
+ if (!file)
+ {
+#if ! ((HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG) \
+ || (HAVE_WORKING_UTIMES && HAVE_FUTIMES))
+ errno = ENOSYS;
+#endif
+ return -1;
+ }
+
+#if HAVE_WORKING_UTIMES
+ return utimes (file, t);
+#else
+ {
+ struct utimbuf utimbuf;
+ struct utimbuf *ut;
+ if (ts)
+ {
+ utimbuf.actime = ts[0].tv_sec;
+ utimbuf.modtime = ts[1].tv_sec;
+ ut = &utimbuf;
+ }
+ else
+ ut = NULL;
+
+ return utime (file, ut);
+ }
+#endif /* !HAVE_WORKING_UTIMES */
+ }
+}
+
+/* Set the access and modification time stamps of FD (a.k.a. FILE) to be
+ TIMESPEC[0] and TIMESPEC[1], respectively.
+ FD must be either negative -- in which case it is ignored --
+ or a file descriptor that is open on FILE.
+ If FD is nonnegative, then FILE can be NULL, which means
+ use just futimes (or equivalent) instead of utimes (or equivalent),
+ and fail if on an old system without futimes (or equivalent).
+ If TIMESPEC is null, set the time stamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+int
+gl_futimens (int fd, char const *file, struct timespec const timespec[2])
+{
+ return fdutimens (file, fd, timespec);
+}
+
+/* Set the access and modification time stamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively. */
+int
+utimens (char const *file, struct timespec const timespec[2])
+{
+ return fdutimens (file, -1, timespec);
+}
+
+/* Set the access and modification time stamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively, without dereferencing
+ symlinks. Fail with ENOSYS if the platform does not support
+ changing symlink timestamps, but FILE was a symlink. */
+int
+lutimens (char const *file, struct timespec const timespec[2])
+{
+ struct timespec adjusted_timespec[2];
+ struct timespec *ts = timespec ? adjusted_timespec : NULL;
+ int adjustment_needed = 0;
+ struct stat st;
+
+ if (ts)
+ {
+ adjusted_timespec[0] = timespec[0];
+ adjusted_timespec[1] = timespec[1];
+ adjustment_needed = validate_timespec (ts);
+ }
+ if (adjustment_needed < 0)
+ return -1;
+
+ /* The Linux kernel did not support symlink timestamps until
+ utimensat, in version 2.6.22, so we don't need to mimic
+ gl_futimens' worry about buggy NFS clients. But we do have to
+ worry about bogus return values. */
+
+#if HAVE_UTIMENSAT
+ if (0 <= lutimensat_works_really)
+ {
+ int result;
+# if __linux__
+ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
+ systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
+ but work if both times are either explicitly specified or
+ UTIME_NOW. Work around it with a preparatory lstat prior to
+ calling utimensat; fortunately, there is not much timing
+ impact due to the extra syscall even on file systems where
+ UTIME_OMIT would have worked. FIXME: Simplify this in 2012,
+ when file system bugs are no longer common. */
+ if (adjustment_needed == 2)
+ {
+ if (lstat (file, &st))
+ return -1;
+ if (ts[0].tv_nsec == UTIME_OMIT)
+ ts[0] = get_stat_atime (&st);
+ else if (ts[1].tv_nsec == UTIME_OMIT)
+ ts[1] = get_stat_mtime (&st);
+ /* Note that st is good, in case utimensat gives ENOSYS. */
+ adjustment_needed++;
+ }
+# endif /* __linux__ */
+ result = utimensat (AT_FDCWD, file, ts, AT_SYMLINK_NOFOLLOW);
+# ifdef __linux__
+ /* Work around a kernel bug:
+ http://bugzilla.redhat.com/442352
+ http://bugzilla.redhat.com/449910
+ It appears that utimensat can mistakenly return 280 rather
+ than -1 upon ENOSYS failure.
+ FIXME: remove in 2010 or whenever the offending kernels
+ are no longer in common use. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ lutimensat_works_really = 1;
+ return result;
+ }
+ }
+ lutimensat_works_really = -1;
+#endif /* HAVE_UTIMENSAT */
+
+ /* The platform lacks an interface to set file timestamps with
+ nanosecond resolution, so do the best we can, discarding any
+ fractional part of the timestamp. */
+
+ if (adjustment_needed || REPLACE_FUNC_STAT_FILE)
+ {
+ if (adjustment_needed != 3 && lstat (file, &st))
+ return -1;
+ if (ts && update_timespec (&st, &ts))
+ return 0;
+ }
+
+ /* On Linux, lutimes is a thin wrapper around utimensat, so there is
+ no point trying lutimes if utimensat failed with ENOSYS. */
+#if HAVE_LUTIMES && !HAVE_UTIMENSAT
+ {
+ struct timeval timeval[2];
+ struct timeval const *t;
+ int result;
+ if (ts)
+ {
+ timeval[0].tv_sec = ts[0].tv_sec;
+ timeval[0].tv_usec = ts[0].tv_nsec / 1000;
+ timeval[1].tv_sec = ts[1].tv_sec;
+ timeval[1].tv_usec = ts[1].tv_nsec / 1000;
+ t = timeval;
+ }
+ else
+ t = NULL;
+
+ result = lutimes (file, t);
+ if (result == 0 || errno != ENOSYS)
+ return result;
+ }
+#endif /* HAVE_LUTIMES && !HAVE_UTIMENSAT */
+
+ /* Out of luck for symlinks, but we still handle regular files. */
+ if (!(adjustment_needed || REPLACE_FUNC_STAT_FILE) && lstat (file, &st))
+ return -1;
+ if (!S_ISLNK (st.st_mode))
+ return fdutimens (file, -1, ts);
+ errno = ENOSYS;
+ return -1;
+}
diff --git a/gnulib/lib/utimens.h b/gnulib/lib/utimens.h
new file mode 100644
index 00000000..bb0326da
--- /dev/null
+++ b/gnulib/lib/utimens.h
@@ -0,0 +1,19 @@
+#include <time.h>
+int fdutimens (char const *, int, struct timespec const [2]);
+int gl_futimens (int, char const *, struct timespec const [2]);
+int utimens (char const *, struct timespec const [2]);
+int lutimens (char const *, struct timespec const [2]);
+
+#if GNULIB_FDUTIMENSAT
+# include <fcntl.h>
+# include <sys/stat.h>
+
+int fdutimensat (int dir, char const *name, int fd, struct timespec const [2]);
+
+/* Using this function makes application code slightly more readable. */
+static inline int
+lutimensat (int fd, char const *file, struct timespec const times[2])
+{
+ return utimensat (fd, file, times, AT_SYMLINK_NOFOLLOW);
+}
+#endif
diff --git a/gnulib/lib/utimensat.c b/gnulib/lib/utimensat.c
new file mode 100644
index 00000000..259c7e8a
--- /dev/null
+++ b/gnulib/lib/utimensat.c
@@ -0,0 +1,136 @@
+/* Set the access and modification time of a file relative to directory fd.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#include "stat-time.h"
+#include "timespec.h"
+#include "utimens.h"
+
+#if HAVE_UTIMENSAT
+
+# undef utimensat
+
+/* If we have a native utimensat, but are compiling this file, then
+ utimensat was defined to rpl_utimensat by our replacement
+ sys/stat.h. We assume the native version might fail with ENOSYS,
+ or succeed without properly affecting ctime (as is the case when
+ using newer glibc but older Linux kernel). In this scenario,
+ rpl_utimensat checks whether the native version is usable, and
+ local_utimensat provides the fallback manipulation. */
+
+static int local_utimensat (int, char const *, struct timespec const[2], int);
+# define AT_FUNC_NAME local_utimensat
+
+/* Like utimensat, but work around native bugs. */
+
+int
+rpl_utimensat (int fd, char const *file, struct timespec const times[2],
+ int flag)
+{
+ /* See comments in utimens.c for details. */
+ static int utimensat_works_really; /* 0 = unknown, 1 = yes, -1 = no. */
+ if (0 <= utimensat_works_really)
+ {
+ int result;
+# ifdef __linux__
+ struct stat st;
+ struct timespec ts[2];
+ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
+ systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
+ but work if both times are either explicitly specified or
+ UTIME_NOW. Work around it with a preparatory [l]stat prior
+ to calling utimensat; fortunately, there is not much timing
+ impact due to the extra syscall even on file systems where
+ UTIME_OMIT would have worked. FIXME: Simplify this in 2012,
+ when file system bugs are no longer common. */
+ if (times && (times[0].tv_nsec == UTIME_OMIT
+ || times[1].tv_nsec == UTIME_OMIT))
+ {
+ if (fstatat (fd, file, &st, flag))
+ return -1;
+ if (times[0].tv_nsec == UTIME_OMIT && times[1].tv_nsec == UTIME_OMIT)
+ return 0;
+ if (times[0].tv_nsec == UTIME_OMIT)
+ ts[0] = get_stat_atime (&st);
+ else
+ ts[0] = times[0];
+ if (times[1].tv_nsec == UTIME_OMIT)
+ ts[1] = get_stat_mtime (&st);
+ else
+ ts[1] = times[1];
+ times = ts;
+ }
+# endif /* __linux__ */
+ result = utimensat (fd, file, times, flag);
+ /* Linux kernel 2.6.25 has a bug where it returns EINVAL for
+ UTIME_NOW or UTIME_OMIT with non-zero tv_sec, which
+ local_utimensat works around. Meanwhile, EINVAL for a bad
+ flag is indeterminate whether the native utimensat works, but
+ local_utimensat will also reject it. */
+ if (result == -1 && errno == EINVAL && (flag & ~AT_SYMLINK_NOFOLLOW))
+ return result;
+ if (result == 0 || (errno != ENOSYS && errno != EINVAL))
+ {
+ utimensat_works_really = 1;
+ return result;
+ }
+ }
+ /* No point in trying openat/futimens, since on Linux, futimens is
+ implemented with the same syscall as utimensat. Only avoid the
+ native utimensat due to an ENOSYS failure; an EINVAL error was
+ data-dependent, and the next caller may pass valid data. */
+ if (0 <= utimensat_works_really && errno == ENOSYS)
+ utimensat_works_really = -1;
+ return local_utimensat (fd, file, times, flag);
+}
+
+#else /* !HAVE_UTIMENSAT */
+
+# define AT_FUNC_NAME utimensat
+
+#endif /* !HAVE_UTIMENSAT */
+
+/* Set the access and modification time stamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively; relative to directory
+ FD. If flag is AT_SYMLINK_NOFOLLOW, change the times of a symlink,
+ or fail with ENOSYS if not possible. If TIMESPEC is null, set the
+ time stamps to the current time. If possible, do it without
+ changing the working directory. Otherwise, resort to using
+ save_cwd/fchdir, then utimens/restore_cwd. If either the save_cwd
+ or the restore_cwd fails, then give a diagnostic and exit nonzero.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+/* AT_FUNC_NAME is now utimensat or local_utimensat. */
+#define AT_FUNC_F1 lutimens
+#define AT_FUNC_F2 utimens
+#define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+#define AT_FUNC_POST_FILE_PARAM_DECLS , struct timespec const ts[2], int flag
+#define AT_FUNC_POST_FILE_ARGS , ts
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_F2
+#undef AT_FUNC_USE_F1_COND
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
diff --git a/gnulib/lib/vasnprintf.c b/gnulib/lib/vasnprintf.c
new file mode 100644
index 00000000..79854ed8
--- /dev/null
+++ b/gnulib/lib/vasnprintf.c
@@ -0,0 +1,5488 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 1999, 2002-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file can be parametrized with the following macros:
+ VASNPRINTF The name of the function being defined.
+ FCHAR_T The element type of the format string.
+ DCHAR_T The element type of the destination (result) string.
+ FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII. MUST be set if
+ FCHAR_T and DCHAR_T are not the same type.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on FCHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on FCHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on FCHAR_T.
+ DCHAR_CPY memcpy like function for DCHAR_T[] arrays.
+ DCHAR_SET memset like function for DCHAR_T[] arrays.
+ DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays.
+ SNPRINTF The system's snprintf (or similar) function.
+ This may be either snprintf or swprintf.
+ TCHAR_T The element type of the argument and result string
+ of the said SNPRINTF function. This may be either
+ char or wchar_t. The code exploits that
+ sizeof (TCHAR_T) | sizeof (DCHAR_T) and
+ alignof (TCHAR_T) <= alignof (DCHAR_T).
+ DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type.
+ DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
+ DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t.
+ DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t.
+ DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifndef VASNPRINTF
+# include <config.h>
+#endif
+#ifndef IN_LIBINTL
+# include <alloca.h>
+#endif
+
+/* Specification. */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# include "vasnwprintf.h"
+# else
+# include "vasnprintf.h"
+# endif
+#endif
+
+#include <locale.h> /* localeconv() */
+#include <stdio.h> /* snprintf(), sprintf() */
+#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
+#include <string.h> /* memcpy(), strlen() */
+#include <errno.h> /* errno */
+#include <limits.h> /* CHAR_BIT */
+#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
+#if HAVE_NL_LANGINFO
+# include <langinfo.h>
+#endif
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+# else
+# include "printf-parse.h"
+# endif
+#endif
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "float+.h"
+#endif
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnand-nolibm.h"
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "fpucw.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnand-nolibm.h"
+# include "printf-frexp.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "printf-frexpl.h"
+# include "fpucw.h"
+#endif
+
+/* Default parameters. */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# define VASNPRINTF vasnwprintf
+# define FCHAR_T wchar_t
+# define DCHAR_T wchar_t
+# define TCHAR_T wchar_t
+# define DCHAR_IS_TCHAR 1
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+# define PRINTF_PARSE wprintf_parse
+# define DCHAR_CPY wmemcpy
+# define DCHAR_SET wmemset
+# else
+# define VASNPRINTF vasnprintf
+# define FCHAR_T char
+# define DCHAR_T char
+# define TCHAR_T char
+# define DCHAR_IS_TCHAR 1
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+# define PRINTF_PARSE printf_parse
+# define DCHAR_CPY memcpy
+# define DCHAR_SET memset
+# endif
+#endif
+#if WIDE_CHAR_VERSION
+ /* TCHAR_T is wchar_t. */
+# define USE_SNPRINTF 1
+# if HAVE_DECL__SNWPRINTF
+ /* On Windows, the function swprintf() has a different signature than
+ on Unix; we use the _snwprintf() function instead. */
+# define SNPRINTF _snwprintf
+# else
+ /* Unix. */
+# define SNPRINTF swprintf
+# endif
+#else
+ /* TCHAR_T is char. */
+ /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'.
+ But don't use it on BeOS, since BeOS snprintf produces no output if the
+ size argument is >= 0x3000000.
+ Also don't use it on Linux libc5, since there snprintf with size = 1
+ writes any output without bounds, like sprintf. */
+# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__ && !(__GNU_LIBRARY__ == 1)
+# define USE_SNPRINTF 1
+# else
+# define USE_SNPRINTF 0
+# endif
+# if HAVE_DECL__SNPRINTF
+ /* Windows. */
+# define SNPRINTF _snprintf
+# else
+ /* Unix. */
+# define SNPRINTF snprintf
+ /* Here we need to call the native snprintf, not rpl_snprintf. */
+# undef snprintf
+# endif
+#endif
+/* Here we need to call the native sprintf, not rpl_sprintf. */
+#undef sprintf
+
+/* GCC >= 4.0 with -Wall emits unjustified "... may be used uninitialized"
+ warnings in this file. Use -Dlint to suppress them. */
+#ifdef lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+/* Avoid some warnings from "gcc -Wshadow".
+ This file doesn't use the exp() and remainder() functions. */
+#undef exp
+#define exp expo
+#undef remainder
+#define remainder rem
+
+#if !USE_SNPRINTF && !WIDE_CHAR_VERSION
+# if (HAVE_STRNLEN && !defined _AIX)
+# define local_strnlen strnlen
+# else
+# ifndef local_strnlen_defined
+# define local_strnlen_defined 1
+static size_t
+local_strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
+# endif
+# endif
+#endif
+
+#if (!USE_SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && HAVE_WCHAR_T && (WIDE_CHAR_VERSION || DCHAR_IS_TCHAR)
+# if HAVE_WCSLEN
+# define local_wcslen wcslen
+# else
+ /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+ a dependency towards this library, here is a local substitute.
+ Define this substitute only once, even if this file is included
+ twice in the same compilation unit. */
+# ifndef local_wcslen_defined
+# define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if !USE_SNPRINTF && HAVE_WCHAR_T && WIDE_CHAR_VERSION
+# if HAVE_WCSNLEN
+# define local_wcsnlen wcsnlen
+# else
+# ifndef local_wcsnlen_defined
+# define local_wcsnlen_defined 1
+static size_t
+local_wcsnlen (const wchar_t *s, size_t maxlen)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; maxlen > 0 && *ptr != (wchar_t) 0; ptr++, maxlen--)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+/* Determine the decimal-point character according to the current locale. */
+# ifndef decimal_point_char_defined
+# define decimal_point_char_defined 1
+static char
+decimal_point_char (void)
+{
+ const char *point;
+ /* Determine it in a multithread-safe way. We know nl_langinfo is
+ multithread-safe on glibc systems and MacOS X systems, but is not required
+ to be multithread-safe by POSIX. sprintf(), however, is multithread-safe.
+ localeconv() is rarely multithread-safe. */
+# if HAVE_NL_LANGINFO && (__GLIBC__ || (defined __APPLE__ && defined __MACH__))
+ point = nl_langinfo (RADIXCHAR);
+# elif 1
+ char pointbuf[5];
+ sprintf (pointbuf, "%#.0f", 1.0);
+ point = &pointbuf[1];
+# else
+ point = localeconv () -> decimal_point;
+# endif
+ /* The decimal point is always a single byte: either '.' or ','. */
+ return (point[0] != '\0' ? point[0] : '.');
+}
+# endif
+#endif
+
+#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+static int
+is_infinite_or_zero (double x)
+{
+ return isnand (x) || x + x == x;
+}
+
+#endif
+
+#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+static int
+is_infinite_or_zerol (long double x)
+{
+ return isnanl (x) || x + x == x;
+}
+
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+
+/* Converting 'long double' to decimal without rare rounding bugs requires
+ real bignums. We use the naming conventions of GNU gmp, but vastly simpler
+ (and slower) algorithms. */
+
+typedef unsigned int mp_limb_t;
+# define GMP_LIMB_BITS 32
+typedef int mp_limb_verify[2 * (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS) - 1];
+
+typedef unsigned long long mp_twolimb_t;
+# define GMP_TWOLIMB_BITS 64
+typedef int mp_twolimb_verify[2 * (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS) - 1];
+
+/* Representation of a bignum >= 0. */
+typedef struct
+{
+ size_t nlimbs;
+ mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */
+} mpn_t;
+
+/* Compute the product of two bignums >= 0.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+multiply (mpn_t src1, mpn_t src2, mpn_t *dest)
+{
+ const mp_limb_t *p1;
+ const mp_limb_t *p2;
+ size_t len1;
+ size_t len2;
+
+ if (src1.nlimbs <= src2.nlimbs)
+ {
+ len1 = src1.nlimbs;
+ p1 = src1.limbs;
+ len2 = src2.nlimbs;
+ p2 = src2.limbs;
+ }
+ else
+ {
+ len1 = src2.nlimbs;
+ p1 = src2.limbs;
+ len2 = src1.nlimbs;
+ p2 = src1.limbs;
+ }
+ /* Now 0 <= len1 <= len2. */
+ if (len1 == 0)
+ {
+ /* src1 or src2 is zero. */
+ dest->nlimbs = 0;
+ dest->limbs = (mp_limb_t *) malloc (1);
+ }
+ else
+ {
+ /* Here 1 <= len1 <= len2. */
+ size_t dlen;
+ mp_limb_t *dp;
+ size_t k, i, j;
+
+ dlen = len1 + len2;
+ dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t));
+ if (dp == NULL)
+ return NULL;
+ for (k = len2; k > 0; )
+ dp[--k] = 0;
+ for (i = 0; i < len1; i++)
+ {
+ mp_limb_t digit1 = p1[i];
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < len2; j++)
+ {
+ mp_limb_t digit2 = p2[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ carry += dp[i + j];
+ dp[i + j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ dp[i + len2] = (mp_limb_t) carry;
+ }
+ /* Normalise. */
+ while (dlen > 0 && dp[dlen - 1] == 0)
+ dlen--;
+ dest->nlimbs = dlen;
+ dest->limbs = dp;
+ }
+ return dest->limbs;
+}
+
+/* Compute the quotient of a bignum a >= 0 and a bignum b > 0.
+ a is written as a = q * b + r with 0 <= r < b. q is the quotient, r
+ the remainder.
+ Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd,
+ q is incremented.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+divide (mpn_t a, mpn_t b, mpn_t *q)
+{
+ /* Algorithm:
+ First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]]
+ with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS).
+ If m<n, then q:=0 and r:=a.
+ If m>=n=1, perform a single-precision division:
+ r:=0, j:=m,
+ while j>0 do
+ {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j =
+ = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r<b[0]<beta}
+ j:=j-1, r:=r*beta+a[j], q[j]:=floor(r/b[0]), r:=r-b[0]*q[j].
+ Normalise [q[m-1],...,q[0]], yields q.
+ If m>=n>1, perform a multiple-precision division:
+ We have a/b < beta^(m-n+1).
+ s:=intDsize-1-(highest bit in b[n-1]), 0<=s<intDsize.
+ Shift a and b left by s bits, copying them. r:=a.
+ r=[r[m],...,r[0]], b=[b[n-1],...,b[0]] with b[n-1]>=beta/2.
+ For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).}
+ Compute q* :
+ q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]).
+ In case of overflow (q* >= beta) set q* := beta-1.
+ Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2]
+ and c3 := b[n-2] * q*.
+ {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow
+ occurred. Furthermore 0 <= c3 < beta^2.
+ If there was overflow and
+ r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2,
+ the next test can be skipped.}
+ While c3 > c2, {Here 0 <= c2 < c3 < beta^2}
+ Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2].
+ If q* > 0:
+ Put r := r - b * q* * beta^j. In detail:
+ [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]].
+ hence: u:=0, for i:=0 to n-1 do
+ u := u + q* * b[i],
+ r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry),
+ u:=u div beta (+ 1, if carry in subtraction)
+ r[n+j]:=r[n+j]-u.
+ {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1
+ < q* + 1 <= beta,
+ the carry u does not overflow.}
+ If a negative carry occurs, put q* := q* - 1
+ and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]].
+ Set q[j] := q*.
+ Normalise [q[m-n],..,q[0]]; this yields the quotient q.
+ Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the
+ rest r.
+ The room for q[j] can be allocated at the memory location of r[n+j].
+ Finally, round-to-even:
+ Shift r left by 1 bit.
+ If r > b or if r = b and q[0] is odd, q := q+1.
+ */
+ const mp_limb_t *a_ptr = a.limbs;
+ size_t a_len = a.nlimbs;
+ const mp_limb_t *b_ptr = b.limbs;
+ size_t b_len = b.nlimbs;
+ mp_limb_t *roomptr;
+ mp_limb_t *tmp_roomptr = NULL;
+ mp_limb_t *q_ptr;
+ size_t q_len;
+ mp_limb_t *r_ptr;
+ size_t r_len;
+
+ /* Allocate room for a_len+2 digits.
+ (Need a_len+1 digits for the real division and 1 more digit for the
+ final rounding of q.) */
+ roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t));
+ if (roomptr == NULL)
+ return NULL;
+
+ /* Normalise a. */
+ while (a_len > 0 && a_ptr[a_len - 1] == 0)
+ a_len--;
+
+ /* Normalise b. */
+ for (;;)
+ {
+ if (b_len == 0)
+ /* Division by zero. */
+ abort ();
+ if (b_ptr[b_len - 1] == 0)
+ b_len--;
+ else
+ break;
+ }
+
+ /* Here m = a_len >= 0 and n = b_len > 0. */
+
+ if (a_len < b_len)
+ {
+ /* m<n: trivial case. q=0, r := copy of a. */
+ r_ptr = roomptr;
+ r_len = a_len;
+ memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+ q_ptr = roomptr + a_len;
+ q_len = 0;
+ }
+ else if (b_len == 1)
+ {
+ /* n=1: single precision division.
+ beta^(m-1) <= a < beta^m ==> beta^(m-2) <= a/b < beta^m */
+ r_ptr = roomptr;
+ q_ptr = roomptr + 1;
+ {
+ mp_limb_t den = b_ptr[0];
+ mp_limb_t remainder = 0;
+ const mp_limb_t *sourceptr = a_ptr + a_len;
+ mp_limb_t *destptr = q_ptr + a_len;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ mp_twolimb_t num =
+ ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr;
+ *--destptr = num / den;
+ remainder = num % den;
+ }
+ /* Normalise and store r. */
+ if (remainder > 0)
+ {
+ r_ptr[0] = remainder;
+ r_len = 1;
+ }
+ else
+ r_len = 0;
+ /* Normalise q. */
+ q_len = a_len;
+ if (q_ptr[q_len - 1] == 0)
+ q_len--;
+ }
+ }
+ else
+ {
+ /* n>1: multiple precision division.
+ beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==>
+ beta^(m-n-1) <= a/b < beta^(m-n+1). */
+ /* Determine s. */
+ size_t s;
+ {
+ mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
+ s = 31;
+ if (msd >= 0x10000)
+ {
+ msd = msd >> 16;
+ s -= 16;
+ }
+ if (msd >= 0x100)
+ {
+ msd = msd >> 8;
+ s -= 8;
+ }
+ if (msd >= 0x10)
+ {
+ msd = msd >> 4;
+ s -= 4;
+ }
+ if (msd >= 0x4)
+ {
+ msd = msd >> 2;
+ s -= 2;
+ }
+ if (msd >= 0x2)
+ {
+ msd = msd >> 1;
+ s -= 1;
+ }
+ }
+ /* 0 <= s < GMP_LIMB_BITS.
+ Copy b, shifting it left by s bits. */
+ if (s > 0)
+ {
+ tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t));
+ if (tmp_roomptr == NULL)
+ {
+ free (roomptr);
+ return NULL;
+ }
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = tmp_roomptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ /* accu must be zero, since that was how s was determined. */
+ if (accu != 0)
+ abort ();
+ }
+ b_ptr = tmp_roomptr;
+ }
+ /* Copy a, shifting it left by s bits, yields r.
+ Memory layout:
+ At the beginning: r = roomptr[0..a_len],
+ at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */
+ r_ptr = roomptr;
+ if (s == 0)
+ {
+ memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+ r_ptr[a_len] = 0;
+ }
+ else
+ {
+ const mp_limb_t *sourceptr = a_ptr;
+ mp_limb_t *destptr = r_ptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ *destptr++ = (mp_limb_t) accu;
+ }
+ q_ptr = roomptr + b_len;
+ q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */
+ {
+ size_t j = a_len - b_len; /* m-n */
+ mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */
+ mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */
+ mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */
+ ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd;
+ /* Division loop, traversed m-n+1 times.
+ j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */
+ for (;;)
+ {
+ mp_limb_t q_star;
+ mp_limb_t c1;
+ if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */
+ {
+ /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */
+ mp_twolimb_t num =
+ ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS)
+ | r_ptr[j + b_len - 1];
+ q_star = num / b_msd;
+ c1 = num % b_msd;
+ }
+ else
+ {
+ /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */
+ q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */
+ /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta
+ <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta
+ <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta)
+ {<= beta !}.
+ If yes, jump directly to the subtraction loop.
+ (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta
+ <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */
+ if (r_ptr[j + b_len] > b_msd
+ || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd)
+ /* r[j+n] >= b[n-1]+1 or
+ r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a
+ carry. */
+ goto subtract;
+ }
+ /* q_star = q*,
+ c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta). */
+ {
+ mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */
+ ((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2];
+ mp_twolimb_t c3 = /* b[n-2] * q* */
+ (mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star;
+ /* While c2 < c3, increase c2 and decrease c3.
+ Consider c3-c2. While it is > 0, decrease it by
+ b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2
+ this can happen only twice. */
+ if (c3 > c2)
+ {
+ q_star = q_star - 1; /* q* := q* - 1 */
+ if (c3 - c2 > b_msdd)
+ q_star = q_star - 1; /* q* := q* - 1 */
+ }
+ }
+ if (q_star > 0)
+ subtract:
+ {
+ /* Subtract r := r - b * q* * beta^j. */
+ mp_limb_t cr;
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = r_ptr + j;
+ mp_twolimb_t carry = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ /* Here 0 <= carry <= q*. */
+ carry =
+ carry
+ + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++
+ + (mp_limb_t) ~(*destptr);
+ /* Here 0 <= carry <= beta*q* + beta-1. */
+ *destptr++ = ~(mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS; /* <= q* */
+ }
+ cr = (mp_limb_t) carry;
+ }
+ /* Subtract cr from r_ptr[j + b_len], then forget about
+ r_ptr[j + b_len]. */
+ if (cr > r_ptr[j + b_len])
+ {
+ /* Subtraction gave a carry. */
+ q_star = q_star - 1; /* q* := q* - 1 */
+ /* Add b back. */
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = r_ptr + j;
+ mp_limb_t carry = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ mp_limb_t source1 = *sourceptr++;
+ mp_limb_t source2 = *destptr;
+ *destptr++ = source1 + source2 + carry;
+ carry =
+ (carry
+ ? source1 >= (mp_limb_t) ~source2
+ : source1 > (mp_limb_t) ~source2);
+ }
+ }
+ /* Forget about the carry and about r[j+n]. */
+ }
+ }
+ /* q* is determined. Store it as q[j]. */
+ q_ptr[j] = q_star;
+ if (j == 0)
+ break;
+ j--;
+ }
+ }
+ r_len = b_len;
+ /* Normalise q. */
+ if (q_ptr[q_len - 1] == 0)
+ q_len--;
+# if 0 /* Not needed here, since we need r only to compare it with b/2, and
+ b is shifted left by s bits. */
+ /* Shift r right by s bits. */
+ if (s > 0)
+ {
+ mp_limb_t ptr = r_ptr + r_len;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = r_len; count > 0; count--)
+ {
+ accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS;
+ accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s);
+ *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS);
+ }
+ }
+# endif
+ /* Normalise r. */
+ while (r_len > 0 && r_ptr[r_len - 1] == 0)
+ r_len--;
+ }
+ /* Compare r << 1 with b. */
+ if (r_len > b_len)
+ goto increment_q;
+ {
+ size_t i;
+ for (i = b_len;;)
+ {
+ mp_limb_t r_i =
+ (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0)
+ | (i < r_len ? r_ptr[i] << 1 : 0);
+ mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0);
+ if (r_i > b_i)
+ goto increment_q;
+ if (r_i < b_i)
+ goto keep_q;
+ if (i == 0)
+ break;
+ i--;
+ }
+ }
+ if (q_len > 0 && ((q_ptr[0] & 1) != 0))
+ /* q is odd. */
+ increment_q:
+ {
+ size_t i;
+ for (i = 0; i < q_len; i++)
+ if (++(q_ptr[i]) != 0)
+ goto keep_q;
+ q_ptr[q_len++] = 1;
+ }
+ keep_q:
+ if (tmp_roomptr != NULL)
+ free (tmp_roomptr);
+ q->limbs = q_ptr;
+ q->nlimbs = q_len;
+ return roomptr;
+}
+
+/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal
+ representation.
+ Destroys the contents of a.
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+convert_to_decimal (mpn_t a, size_t extra_zeroes)
+{
+ mp_limb_t *a_ptr = a.limbs;
+ size_t a_len = a.nlimbs;
+ /* 0.03345 is slightly larger than log(2)/(9*log(10)). */
+ size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
+ char *c_ptr = (char *) malloc (xsum (c_len, extra_zeroes));
+ if (c_ptr != NULL)
+ {
+ char *d_ptr = c_ptr;
+ for (; extra_zeroes > 0; extra_zeroes--)
+ *d_ptr++ = '0';
+ while (a_len > 0)
+ {
+ /* Divide a by 10^9, in-place. */
+ mp_limb_t remainder = 0;
+ mp_limb_t *ptr = a_ptr + a_len;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ mp_twolimb_t num =
+ ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr;
+ *ptr = num / 1000000000;
+ remainder = num % 1000000000;
+ }
+ /* Store the remainder as 9 decimal digits. */
+ for (count = 9; count > 0; count--)
+ {
+ *d_ptr++ = '0' + (remainder % 10);
+ remainder = remainder / 10;
+ }
+ /* Normalize a. */
+ if (a_ptr[a_len - 1] == 0)
+ a_len--;
+ }
+ /* Remove leading zeroes. */
+ while (d_ptr > c_ptr && d_ptr[-1] == '0')
+ d_ptr--;
+ /* But keep at least one zero. */
+ if (d_ptr == c_ptr)
+ *d_ptr++ = '0';
+ /* Terminate the string. */
+ *d_ptr = '\0';
+ }
+ return c_ptr;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0:
+ write x as x = 2^e * m, where m is a bignum.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+decode_long_double (long double x, int *ep, mpn_t *mp)
+{
+ mpn_t m;
+ int exp;
+ long double y;
+ size_t i;
+
+ /* Allocate memory for result. */
+ m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+ m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+ if (m.limbs == NULL)
+ return NULL;
+ /* Split into exponential part and mantissa. */
+ y = frexpl (x, &exp);
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * LDBL_MANT_BIT), and the
+ latter is an integer. */
+ /* Convert the mantissa (y * LDBL_MANT_BIT) to a sequence of limbs.
+ I'm not sure whether it's safe to cast a 'long double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+ doesn't matter). */
+# if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0
+# if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# else
+ {
+ mp_limb_t d;
+ y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS);
+ d = (int) y;
+ y -= d;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d;
+ }
+# endif
+# endif
+ for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+#if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess
+ precision. */
+ if (!(y == 0.0L))
+ abort ();
+#endif
+ /* Normalise. */
+ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+ m.nlimbs--;
+ *mp = m;
+ *ep = exp - LDBL_MANT_BIT;
+ return m.limbs;
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0:
+ write x as x = 2^e * m, where m is a bignum.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+decode_double (double x, int *ep, mpn_t *mp)
+{
+ mpn_t m;
+ int exp;
+ double y;
+ size_t i;
+
+ /* Allocate memory for result. */
+ m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+ m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+ if (m.limbs == NULL)
+ return NULL;
+ /* Split into exponential part and mantissa. */
+ y = frexp (x, &exp);
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * DBL_MANT_BIT), and the
+ latter is an integer. */
+ /* Convert the mantissa (y * DBL_MANT_BIT) to a sequence of limbs.
+ I'm not sure whether it's safe to cast a 'double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+ doesn't matter). */
+# if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0
+# if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# else
+ {
+ mp_limb_t d;
+ y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS);
+ d = (int) y;
+ y -= d;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d;
+ }
+# endif
+# endif
+ for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+ if (!(y == 0.0))
+ abort ();
+ /* Normalise. */
+ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+ m.nlimbs--;
+ *mp = m;
+ *ep = exp - DBL_MANT_BIT;
+ return m.limbs;
+}
+
+# endif
+
+/* Assuming x = 2^e * m is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n)
+{
+ int s;
+ size_t extra_zeroes;
+ unsigned int abs_n;
+ unsigned int abs_s;
+ mp_limb_t *pow5_ptr;
+ size_t pow5_len;
+ unsigned int s_limbs;
+ unsigned int s_bits;
+ mpn_t pow5;
+ mpn_t z;
+ void *z_memory;
+ char *digits;
+
+ if (memory == NULL)
+ return NULL;
+ /* x = 2^e * m, hence
+ y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m)
+ = round (2^s * 5^n * m). */
+ s = e + n;
+ extra_zeroes = 0;
+ /* Factor out a common power of 10 if possible. */
+ if (s > 0 && n > 0)
+ {
+ extra_zeroes = (s < n ? s : n);
+ s -= extra_zeroes;
+ n -= extra_zeroes;
+ }
+ /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes.
+ Before converting to decimal, we need to compute
+ z = round (2^s * 5^n * m). */
+ /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same
+ sign. 2.322 is slightly larger than log(5)/log(2). */
+ abs_n = (n >= 0 ? n : -n);
+ abs_s = (s >= 0 ? s : -s);
+ pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1
+ + abs_s / GMP_LIMB_BITS + 1)
+ * sizeof (mp_limb_t));
+ if (pow5_ptr == NULL)
+ {
+ free (memory);
+ return NULL;
+ }
+ /* Initialize with 1. */
+ pow5_ptr[0] = 1;
+ pow5_len = 1;
+ /* Multiply with 5^|n|. */
+ if (abs_n > 0)
+ {
+ static mp_limb_t const small_pow5[13 + 1] =
+ {
+ 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
+ 48828125, 244140625, 1220703125
+ };
+ unsigned int n13;
+ for (n13 = 0; n13 <= abs_n; n13 += 13)
+ {
+ mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13];
+ size_t j;
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < pow5_len; j++)
+ {
+ mp_limb_t digit2 = pow5_ptr[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ pow5_ptr[j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ if (carry > 0)
+ pow5_ptr[pow5_len++] = (mp_limb_t) carry;
+ }
+ }
+ s_limbs = abs_s / GMP_LIMB_BITS;
+ s_bits = abs_s % GMP_LIMB_BITS;
+ if (n >= 0 ? s >= 0 : s <= 0)
+ {
+ /* Multiply with 2^|s|. */
+ if (s_bits > 0)
+ {
+ mp_limb_t *ptr = pow5_ptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = pow5_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *ptr << s_bits;
+ *ptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ if (accu > 0)
+ {
+ *ptr = (mp_limb_t) accu;
+ pow5_len++;
+ }
+ }
+ if (s_limbs > 0)
+ {
+ size_t count;
+ for (count = pow5_len; count > 0;)
+ {
+ count--;
+ pow5_ptr[s_limbs + count] = pow5_ptr[count];
+ }
+ for (count = s_limbs; count > 0;)
+ {
+ count--;
+ pow5_ptr[count] = 0;
+ }
+ pow5_len += s_limbs;
+ }
+ pow5.limbs = pow5_ptr;
+ pow5.nlimbs = pow5_len;
+ if (n >= 0)
+ {
+ /* Multiply m with pow5. No division needed. */
+ z_memory = multiply (m, pow5, &z);
+ }
+ else
+ {
+ /* Divide m by pow5 and round. */
+ z_memory = divide (m, pow5, &z);
+ }
+ }
+ else
+ {
+ pow5.limbs = pow5_ptr;
+ pow5.nlimbs = pow5_len;
+ if (n >= 0)
+ {
+ /* n >= 0, s < 0.
+ Multiply m with pow5, then divide by 2^|s|. */
+ mpn_t numerator;
+ mpn_t denominator;
+ void *tmp_memory;
+ tmp_memory = multiply (m, pow5, &numerator);
+ if (tmp_memory == NULL)
+ {
+ free (pow5_ptr);
+ free (memory);
+ return NULL;
+ }
+ /* Construct 2^|s|. */
+ {
+ mp_limb_t *ptr = pow5_ptr + pow5_len;
+ size_t i;
+ for (i = 0; i < s_limbs; i++)
+ ptr[i] = 0;
+ ptr[s_limbs] = (mp_limb_t) 1 << s_bits;
+ denominator.limbs = ptr;
+ denominator.nlimbs = s_limbs + 1;
+ }
+ z_memory = divide (numerator, denominator, &z);
+ free (tmp_memory);
+ }
+ else
+ {
+ /* n < 0, s > 0.
+ Multiply m with 2^s, then divide by pow5. */
+ mpn_t numerator;
+ mp_limb_t *num_ptr;
+ num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1)
+ * sizeof (mp_limb_t));
+ if (num_ptr == NULL)
+ {
+ free (pow5_ptr);
+ free (memory);
+ return NULL;
+ }
+ {
+ mp_limb_t *destptr = num_ptr;
+ {
+ size_t i;
+ for (i = 0; i < s_limbs; i++)
+ *destptr++ = 0;
+ }
+ if (s_bits > 0)
+ {
+ const mp_limb_t *sourceptr = m.limbs;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = m.nlimbs; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s_bits;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ if (accu > 0)
+ *destptr++ = (mp_limb_t) accu;
+ }
+ else
+ {
+ const mp_limb_t *sourceptr = m.limbs;
+ size_t count;
+ for (count = m.nlimbs; count > 0; count--)
+ *destptr++ = *sourceptr++;
+ }
+ numerator.limbs = num_ptr;
+ numerator.nlimbs = destptr - num_ptr;
+ }
+ z_memory = divide (numerator, pow5, &z);
+ free (num_ptr);
+ }
+ }
+ free (pow5_ptr);
+ free (memory);
+
+ /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */
+
+ if (z_memory == NULL)
+ return NULL;
+ digits = convert_to_decimal (z, extra_zeroes);
+ free (z_memory);
+ return digits;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_long_double (long double x, int n)
+{
+ int e IF_LINT(= 0);
+ mpn_t m;
+ void *memory = decode_long_double (x, &e, &m);
+ return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_double (double x, int n)
+{
+ int e IF_LINT(= 0);
+ mpn_t m;
+ void *memory = decode_double (x, &e, &m);
+ return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and > 0:
+ Return an approximation for n with 10^n <= x < 10^(n+1).
+ The approximation is usually the right n, but may be off by 1 sometimes. */
+static int
+floorlog10l (long double x)
+{
+ int exp;
+ long double y;
+ double z;
+ double l;
+
+ /* Split into exponential part and mantissa. */
+ y = frexpl (x, &exp);
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ if (y == 0.0L)
+ return INT_MIN;
+ if (y < 0.5L)
+ {
+ while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+ {
+ y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+ exp -= GMP_LIMB_BITS;
+ }
+ if (y < (1.0L / (1 << 16)))
+ {
+ y *= 1.0L * (1 << 16);
+ exp -= 16;
+ }
+ if (y < (1.0L / (1 << 8)))
+ {
+ y *= 1.0L * (1 << 8);
+ exp -= 8;
+ }
+ if (y < (1.0L / (1 << 4)))
+ {
+ y *= 1.0L * (1 << 4);
+ exp -= 4;
+ }
+ if (y < (1.0L / (1 << 2)))
+ {
+ y *= 1.0L * (1 << 2);
+ exp -= 2;
+ }
+ if (y < (1.0L / (1 << 1)))
+ {
+ y *= 1.0L * (1 << 1);
+ exp -= 1;
+ }
+ }
+ if (!(y >= 0.5L && y < 1.0L))
+ abort ();
+ /* Compute an approximation for l = log2(x) = exp + log2(y). */
+ l = exp;
+ z = y;
+ if (z < 0.70710678118654752444)
+ {
+ z *= 1.4142135623730950488;
+ l -= 0.5;
+ }
+ if (z < 0.8408964152537145431)
+ {
+ z *= 1.1892071150027210667;
+ l -= 0.25;
+ }
+ if (z < 0.91700404320467123175)
+ {
+ z *= 1.0905077326652576592;
+ l -= 0.125;
+ }
+ if (z < 0.9576032806985736469)
+ {
+ z *= 1.0442737824274138403;
+ l -= 0.0625;
+ }
+ /* Now 0.95 <= z <= 1.01. */
+ z = 1 - z;
+ /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
+ Four terms are enough to get an approximation with error < 10^-7. */
+ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+ /* Finally multiply with log(2)/log(10), yields an approximation for
+ log10(x). */
+ l *= 0.30102999566398119523;
+ /* Round down to the next integer. */
+ return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and > 0:
+ Return an approximation for n with 10^n <= x < 10^(n+1).
+ The approximation is usually the right n, but may be off by 1 sometimes. */
+static int
+floorlog10 (double x)
+{
+ int exp;
+ double y;
+ double z;
+ double l;
+
+ /* Split into exponential part and mantissa. */
+ y = frexp (x, &exp);
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ if (y == 0.0)
+ return INT_MIN;
+ if (y < 0.5)
+ {
+ while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+ {
+ y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+ exp -= GMP_LIMB_BITS;
+ }
+ if (y < (1.0 / (1 << 16)))
+ {
+ y *= 1.0 * (1 << 16);
+ exp -= 16;
+ }
+ if (y < (1.0 / (1 << 8)))
+ {
+ y *= 1.0 * (1 << 8);
+ exp -= 8;
+ }
+ if (y < (1.0 / (1 << 4)))
+ {
+ y *= 1.0 * (1 << 4);
+ exp -= 4;
+ }
+ if (y < (1.0 / (1 << 2)))
+ {
+ y *= 1.0 * (1 << 2);
+ exp -= 2;
+ }
+ if (y < (1.0 / (1 << 1)))
+ {
+ y *= 1.0 * (1 << 1);
+ exp -= 1;
+ }
+ }
+ if (!(y >= 0.5 && y < 1.0))
+ abort ();
+ /* Compute an approximation for l = log2(x) = exp + log2(y). */
+ l = exp;
+ z = y;
+ if (z < 0.70710678118654752444)
+ {
+ z *= 1.4142135623730950488;
+ l -= 0.5;
+ }
+ if (z < 0.8408964152537145431)
+ {
+ z *= 1.1892071150027210667;
+ l -= 0.25;
+ }
+ if (z < 0.91700404320467123175)
+ {
+ z *= 1.0905077326652576592;
+ l -= 0.125;
+ }
+ if (z < 0.9576032806985736469)
+ {
+ z *= 1.0442737824274138403;
+ l -= 0.0625;
+ }
+ /* Now 0.95 <= z <= 1.01. */
+ z = 1 - z;
+ /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
+ Four terms are enough to get an approximation with error < 10^-7. */
+ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+ /* Finally multiply with log(2)/log(10), yields an approximation for
+ log10(x). */
+ l *= 0.30102999566398119523;
+ /* Round down to the next integer. */
+ return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+/* Tests whether a string of digits consists of exactly PRECISION zeroes and
+ a single '1' digit. */
+static int
+is_borderline (const char *digits, size_t precision)
+{
+ for (; precision > 0; precision--, digits++)
+ if (*digits != '0')
+ return 0;
+ if (*digits != '1')
+ return 0;
+ digits++;
+ return *digits == '\0';
+}
+
+#endif
+
+DCHAR_T *
+VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
+ const FCHAR_T *format, va_list args)
+{
+ DIRECTIVES d;
+ arguments a;
+
+ if (PRINTF_PARSE (format, &d, &a) < 0)
+ /* errno is already set. */
+ return NULL;
+
+#define CLEANUP() \
+ free (d.dir); \
+ if (a.arg) \
+ free (a.arg);
+
+ if (PRINTF_FETCHARGS (args, &a) < 0)
+ {
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+ {
+ size_t buf_neededlength;
+ TCHAR_T *buf;
+ TCHAR_T *buf_malloced;
+ const FCHAR_T *cp;
+ size_t i;
+ DIRECTIVE *dp;
+ /* Output string accumulator. */
+ DCHAR_T *result;
+ size_t allocated;
+ size_t length;
+
+ /* Allocate a small buffer that will hold a directive passed to
+ sprintf or snprintf. */
+ buf_neededlength =
+ xsum4 (7, d.max_width_length, d.max_precision_length, 6);
+#if HAVE_ALLOCA
+ if (buf_neededlength < 4000 / sizeof (TCHAR_T))
+ {
+ buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T));
+ buf_malloced = NULL;
+ }
+ else
+#endif
+ {
+ size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T));
+ if (size_overflow_p (buf_memsize))
+ goto out_of_memory_1;
+ buf = (TCHAR_T *) malloc (buf_memsize);
+ if (buf == NULL)
+ goto out_of_memory_1;
+ buf_malloced = buf;
+ }
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ /* Ensures that allocated >= needed. Aborts through a jump to
+ out_of_memory if needed is SIZE_MAX or otherwise too big. */
+#define ENSURE_ALLOCATION(needed) \
+ if ((needed) > allocated) \
+ { \
+ size_t memory_size; \
+ DCHAR_T *memory; \
+ \
+ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \
+ if ((needed) > allocated) \
+ allocated = (needed); \
+ memory_size = xtimes (allocated, sizeof (DCHAR_T)); \
+ if (size_overflow_p (memory_size)) \
+ goto out_of_memory; \
+ if (result == resultbuf || result == NULL) \
+ memory = (DCHAR_T *) malloc (memory_size); \
+ else \
+ memory = (DCHAR_T *) realloc (result, memory_size); \
+ if (memory == NULL) \
+ goto out_of_memory; \
+ if (result == resultbuf && length > 0) \
+ DCHAR_CPY (memory, result, length); \
+ result = memory; \
+ }
+
+ for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+ {
+ if (cp != dp->dir_start)
+ {
+ size_t n = dp->dir_start - cp;
+ size_t augmented_length = xsum (length, n);
+
+ ENSURE_ALLOCATION (augmented_length);
+ /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we
+ need that the format string contains only ASCII characters
+ if FCHAR_T and DCHAR_T are not the same type. */
+ if (sizeof (FCHAR_T) == sizeof (DCHAR_T))
+ {
+ DCHAR_CPY (result + length, (const DCHAR_T *) cp, n);
+ length = augmented_length;
+ }
+ else
+ {
+ do
+ result[length++] = (unsigned char) *cp++;
+ while (--n > 0);
+ }
+ }
+ if (i == d.count)
+ break;
+
+ /* Execute a single directive. */
+ if (dp->conversion == '%')
+ {
+ size_t augmented_length;
+
+ if (!(dp->arg_index == ARG_NONE))
+ abort ();
+ augmented_length = xsum (length, 1);
+ ENSURE_ALLOCATION (augmented_length);
+ result[length] = '%';
+ length = augmented_length;
+ }
+ else
+ {
+ if (!(dp->arg_index != ARG_NONE))
+ abort ();
+
+ if (dp->conversion == 'n')
+ {
+ switch (a.arg[dp->arg_index].type)
+ {
+ case TYPE_COUNT_SCHAR_POINTER:
+ *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_short_pointer = length;
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_int_pointer = length;
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+ break;
+#endif
+ default:
+ abort ();
+ }
+ }
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ else if (dp->conversion == 'U')
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ switch (type)
+ {
+ case TYPE_U8_STRING:
+ {
+ const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;
+ const uint8_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u8_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u8_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u8_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (has_width && width > characters
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT8_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-8 to locale encoding. */
+ converted =
+ u8_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-8 to UTF-16/UTF-32. */
+ converted =
+ U8_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (has_width && width > characters
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ case TYPE_U16_STRING:
+ {
+ const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;
+ const uint16_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u16_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u16_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u16_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (has_width && width > characters
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT16_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-16 to locale encoding. */
+ converted =
+ u16_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-16 to UTF-8/UTF-32. */
+ converted =
+ U16_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (has_width && width > characters
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ case TYPE_U32_STRING:
+ {
+ const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;
+ const uint32_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u32_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u32_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u32_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (has_width && width > characters
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT32_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-32 to locale encoding. */
+ converted =
+ u32_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-32 to UTF-8/UTF-16. */
+ converted =
+ U32_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (has_width && width > characters
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+#endif
+#if (!USE_SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && HAVE_WCHAR_T
+ else if (dp->conversion == 's'
+# if WIDE_CHAR_VERSION
+ && a.arg[dp->arg_index].type != TYPE_WIDE_STRING
+# else
+ && a.arg[dp->arg_index].type == TYPE_WIDE_STRING
+# endif
+ )
+ {
+ /* The normal handling of the 's' directive below requires
+ allocating a temporary buffer. The determination of its
+ length (tmp_length), in the case when a precision is
+ specified, below requires a conversion between a char[]
+ string and a wchar_t[] wide string. It could be done, but
+ we have no guarantee that the implementation of sprintf will
+ use the exactly same algorithm. Without this guarantee, it
+ is possible to have buffer overrun bugs. In order to avoid
+ such bugs, we implement the entire processing of the 's'
+ directive ourselves. */
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+# if WIDE_CHAR_VERSION
+ /* %s in vasnwprintf. See the specification of fwprintf. */
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ const char *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only as many bytes as needed to produce PRECISION
+ wide characters, from the left. */
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrlen (arg_end, MB_CUR_MAX, &state);
+# else
+ count = mblen (arg_end, MB_CUR_MAX);
+# endif
+ if (count == 0)
+ /* Found the terminating NUL. */
+ break;
+ if (count < 0)
+ {
+ /* Invalid or incomplete multibyte character. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of wide
+ characters. */
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrlen (arg_end, MB_CUR_MAX, &state);
+# else
+ count = mblen (arg_end, MB_CUR_MAX);
+# endif
+ if (count == 0)
+ /* Found the terminating NUL. */
+ break;
+ if (count < 0)
+ {
+ /* Invalid or incomplete multibyte character. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (has_width && width > characters
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+ if (has_precision || has_width)
+ {
+ /* We know the number of wide characters in advance. */
+ size_t remaining;
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ ENSURE_ALLOCATION (xsum (length, characters));
+ for (remaining = characters; remaining > 0; remaining--)
+ {
+ wchar_t wc;
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrtowc (&wc, arg, arg_end - arg, &state);
+# else
+ count = mbtowc (&wc, arg, arg_end - arg);
+# endif
+ if (count <= 0)
+ /* mbrtowc not consistent with mbrlen, or mbtowc
+ not consistent with mblen. */
+ abort ();
+ result[length++] = wc;
+ arg += count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+ else
+ {
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ while (arg < arg_end)
+ {
+ wchar_t wc;
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrtowc (&wc, arg, arg_end - arg, &state);
+# else
+ count = mbtowc (&wc, arg, arg_end - arg);
+# endif
+ if (count <= 0)
+ /* mbrtowc not consistent with mbrlen, or mbtowc
+ not consistent with mblen. */
+ abort ();
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length++] = wc;
+ arg += count;
+ }
+ }
+
+ if (has_width && width > characters
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+# else
+ /* %ls in vasnprintf. See the specification of fprintf. */
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ const wchar_t *arg_end;
+ size_t characters;
+# if !DCHAR_IS_TCHAR
+ /* This code assumes that TCHAR_T is 'char'. */
+ typedef int TCHAR_T_verify[2 * (sizeof (TCHAR_T) == 1) - 1];
+ TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+# endif
+ size_t w;
+
+ if (has_precision)
+ {
+ /* Use only as many wide characters as needed to produce
+ at most PRECISION bytes, from the left. */
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ while (precision > 0)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg_end == 0)
+ /* Found the terminating null wide character. */
+ break;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg_end, &state);
+# else
+ count = wctomb (cbuf, *arg_end);
+# endif
+ if (count < 0)
+ {
+ /* Cannot convert. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (precision < count)
+ break;
+ arg_end++;
+ characters += count;
+ precision -= count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else if (has_width)
+# else
+ else
+# endif
+ {
+ /* Use the entire string, and count the number of
+ bytes. */
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg_end == 0)
+ /* Found the terminating null wide character. */
+ break;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg_end, &state);
+# else
+ count = wctomb (cbuf, *arg_end);
+# endif
+ if (count < 0)
+ {
+ /* Cannot convert. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end++;
+ characters += count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + local_wcslen (arg);
+ /* The number of bytes doesn't matter. */
+ characters = 0;
+ }
+# endif
+
+# if !DCHAR_IS_TCHAR
+ /* Convert the string into a piece of temporary memory. */
+ tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T));
+ if (tmpsrc == NULL)
+ goto out_of_memory;
+ {
+ TCHAR_T *tmpptr = tmpsrc;
+ size_t remaining;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ for (remaining = characters; remaining > 0; )
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg, &state);
+# else
+ count = wctomb (cbuf, *arg);
+# endif
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (tmpptr, cbuf, count);
+ tmpptr += count;
+ arg++;
+ remaining -= count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, characters,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ {
+ int saved_errno = errno;
+ free (tmpsrc);
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ free (tmpsrc);
+# endif
+
+ if (has_width)
+ {
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferrable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, characters);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = characters;
+# endif
+ }
+ else
+ /* w doesn't matter. */
+ w = 0;
+
+ if (has_width && width > w
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_TCHAR
+ if (has_precision || has_width)
+ {
+ /* We know the number of bytes in advance. */
+ size_t remaining;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ ENSURE_ALLOCATION (xsum (length, characters));
+ for (remaining = characters; remaining > 0; )
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg, &state);
+# else
+ count = wctomb (cbuf, *arg);
+# endif
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (result + length, cbuf, count);
+ length += count;
+ arg++;
+ remaining -= count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+ else
+ {
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ while (arg < arg_end)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg, &state);
+# else
+ count = wctomb (cbuf, *arg);
+# endif
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ ENSURE_ALLOCATION (xsum (length, count));
+ memcpy (result + length, cbuf, count);
+ length += count;
+ arg++;
+ }
+ }
+# else
+ ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ length += tmpdst_len;
+# endif
+
+ if (has_width && width > w
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ }
+# endif
+#endif
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+ else if ((dp->conversion == 'a' || dp->conversion == 'A')
+# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
+ && (0
+# if NEED_PRINTF_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# endif
+ )
+# endif
+ )
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+ size_t tmp_length;
+ DCHAR_T tmpbuf[700];
+ DCHAR_T *tmp;
+ DCHAR_T *pad_ptr;
+ DCHAR_T *p;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ /* Allocate a temporary buffer of sufficient size. */
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) ((LDBL_DIG + 1)
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) ((DBL_DIG + 1)
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (DCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+
+ pad_ptr = NULL;
+ p = tmp;
+ if (type == TYPE_LONGDOUBLE)
+ {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+ if (isnanl (arg))
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ if (signbit (arg)) /* arg < 0.0L or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0L && arg + arg == arg)
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+ int exponent;
+ long double mantissa;
+
+ if (arg > 0.0L)
+ mantissa = printf_frexpl (arg, &exponent);
+ else
+ {
+ exponent = 0;
+ mantissa = 0.0L;
+ }
+
+ if (has_precision
+ && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
+ {
+ /* Round the mantissa. */
+ long double tail = mantissa;
+ size_t q;
+
+ for (q = precision; ; q--)
+ {
+ int digit = (int) tail;
+ tail -= digit;
+ if (q == 0)
+ {
+ if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
+ tail = 1 - tail;
+ else
+ tail = - tail;
+ break;
+ }
+ tail *= 16.0L;
+ }
+ if (tail != 0.0L)
+ for (q = precision; q > 0; q--)
+ tail *= 0.0625L;
+ mantissa += tail;
+ }
+
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ {
+ int digit;
+
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = '0' + digit;
+ if ((flags & FLAG_ALT)
+ || mantissa > 0.0L || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ /* This loop terminates because we assume
+ that FLT_RADIX is a power of 2. */
+ while (mantissa > 0.0L)
+ {
+ mantissa *= 16.0L;
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = digit
+ + (digit < 10
+ ? '0'
+ : dp->conversion - 10);
+ if (precision > 0)
+ precision--;
+ }
+ while (precision > 0)
+ {
+ *p++ = '0';
+ precision--;
+ }
+ }
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+ }
+# else
+ abort ();
+# endif
+ }
+ else
+ {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE
+ double arg = a.arg[dp->arg_index].a.a_double;
+
+ if (isnand (arg))
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+
+ if (signbit (arg)) /* arg < 0.0 or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0 && arg + arg == arg)
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+ int exponent;
+ double mantissa;
+
+ if (arg > 0.0)
+ mantissa = printf_frexp (arg, &exponent);
+ else
+ {
+ exponent = 0;
+ mantissa = 0.0;
+ }
+
+ if (has_precision
+ && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
+ {
+ /* Round the mantissa. */
+ double tail = mantissa;
+ size_t q;
+
+ for (q = precision; ; q--)
+ {
+ int digit = (int) tail;
+ tail -= digit;
+ if (q == 0)
+ {
+ if (digit & 1 ? tail >= 0.5 : tail > 0.5)
+ tail = 1 - tail;
+ else
+ tail = - tail;
+ break;
+ }
+ tail *= 16.0;
+ }
+ if (tail != 0.0)
+ for (q = precision; q > 0; q--)
+ tail *= 0.0625;
+ mantissa += tail;
+ }
+
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ {
+ int digit;
+
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = '0' + digit;
+ if ((flags & FLAG_ALT)
+ || mantissa > 0.0 || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ /* This loop terminates because we assume
+ that FLT_RADIX is a power of 2. */
+ while (mantissa > 0.0)
+ {
+ mantissa *= 16.0;
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = digit
+ + (digit < 10
+ ? '0'
+ : dp->conversion - 10);
+ if (precision > 0)
+ precision--;
+ }
+ while (precision > 0)
+ {
+ *p++ = '0';
+ precision--;
+ }
+ }
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+ }
+# else
+ abort ();
+# endif
+ }
+ /* The generated string now extends from tmp to p, with the
+ zero padding insertion point being at pad_ptr. */
+ if (has_width && p - tmp < width)
+ {
+ size_t pad = width - (p - tmp);
+ DCHAR_T *end = p + pad;
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > tmp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+
+ p = end;
+ }
+
+ {
+ size_t count = p - tmp;
+
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+
+ /* Make room for the result. */
+ if (count >= allocated - length)
+ {
+ size_t n = xsum (length, count);
+
+ ENSURE_ALLOCATION (n);
+ }
+
+ /* Append the result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+ length += count;
+ }
+ }
+#endif
+#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+ else if ((dp->conversion == 'f' || dp->conversion == 'F'
+ || dp->conversion == 'e' || dp->conversion == 'E'
+ || dp->conversion == 'g' || dp->conversion == 'G'
+ || dp->conversion == 'a' || dp->conversion == 'A')
+ && (0
+# if NEED_PRINTF_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# elif NEED_PRINTF_INFINITE_DOUBLE
+ || (a.arg[dp->arg_index].type == TYPE_DOUBLE
+ /* The systems (mingw) which produce wrong output
+ for Inf, -Inf, and NaN also do so for -0.0.
+ Therefore we treat this case here as well. */
+ && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double))
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
+ || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+ /* Some systems produce wrong output for Inf,
+ -Inf, and NaN. Some systems in this category
+ (IRIX 5.3) also do so for -0.0. Therefore we
+ treat this case here as well. */
+ && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble))
+# endif
+ ))
+ {
+# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE)
+ arg_type type = a.arg[dp->arg_index].type;
+# endif
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+ size_t tmp_length;
+ DCHAR_T tmpbuf[700];
+ DCHAR_T *tmp;
+ DCHAR_T *pad_ptr;
+ DCHAR_T *p;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ /* POSIX specifies the default precision to be 6 for %f, %F,
+ %e, %E, but not for %g, %G. Implementations appear to use
+ the same default precision also for %g, %G. But for %a, %A,
+ the default precision is 0. */
+ if (!has_precision)
+ if (!(dp->conversion == 'a' || dp->conversion == 'A'))
+ precision = 6;
+
+ /* Allocate a temporary buffer of sufficient size. */
+# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+ tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1);
+# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+ tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0);
+# elif NEED_PRINTF_LONG_DOUBLE
+ tmp_length = LDBL_DIG + 1;
+# elif NEED_PRINTF_DOUBLE
+ tmp_length = DBL_DIG + 1;
+# else
+ tmp_length = 0;
+# endif
+ if (tmp_length < precision)
+ tmp_length = precision;
+# if NEED_PRINTF_LONG_DOUBLE
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+# endif
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ if (!(isnanl (arg) || arg + arg == arg))
+ {
+ /* arg is finite and nonzero. */
+ int exponent = floorlog10l (arg < 0 ? -arg : arg);
+ if (exponent >= 0 && tmp_length < exponent + precision)
+ tmp_length = exponent + precision;
+ }
+ }
+# endif
+# if NEED_PRINTF_DOUBLE
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+ if (type == TYPE_DOUBLE)
+# endif
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ if (!(isnand (arg) || arg + arg == arg))
+ {
+ /* arg is finite and nonzero. */
+ int exponent = floorlog10 (arg < 0 ? -arg : arg);
+ if (exponent >= 0 && tmp_length < exponent + precision)
+ tmp_length = exponent + precision;
+ }
+ }
+# endif
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (DCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+
+ pad_ptr = NULL;
+ p = tmp;
+
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+# endif
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+ if (isnanl (arg))
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ if (signbit (arg)) /* arg < 0.0L or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0L && arg + arg == arg)
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+# if NEED_PRINTF_LONG_DOUBLE
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ char *digits;
+ size_t ndigits;
+
+ digits =
+ scale10_round_decimal_long_double (arg, precision);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits > precision)
+ do
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ while (ndigits > precision);
+ else
+ *p++ = '0';
+ /* Here ndigits <= precision. */
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > ndigits; precision--)
+ *p++ = '0';
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ int exponent;
+
+ if (arg == 0.0L)
+ {
+ exponent = 0;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else
+ {
+ /* arg > 0.0L. */
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+
+ exponent = floorlog10l (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_long_double (arg,
+ (int)precision - exponent);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits == precision + 1)
+ break;
+ if (ndigits < precision
+ || ndigits > precision + 2)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits == precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision+1. */
+ if (is_borderline (digits, precision))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_long_double (arg,
+ (int)precision - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision + 1)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision+1. */
+
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+
+ *p++ = dp->conversion; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', '.', '2', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+.2d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+.2d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ if (precision == 0)
+ precision = 1;
+ /* precision >= 1. */
+
+ if (arg == 0.0L)
+ /* The exponent is 0, >= -4, < precision.
+ Use fixed-point notation. */
+ {
+ size_t ndigits = precision;
+ /* Number of trailing zeroes that have to be
+ dropped. */
+ size_t nzeroes =
+ (flags & FLAG_ALT ? 0 : precision - 1);
+
+ --ndigits;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = '0';
+ }
+ }
+ }
+ else
+ {
+ /* arg > 0.0L. */
+ int exponent;
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+ size_t nzeroes;
+
+ exponent = floorlog10l (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_long_double (arg,
+ (int)(precision - 1) - exponent);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits == precision)
+ break;
+ if (ndigits < precision - 1
+ || ndigits > precision + 1)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits < precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision. */
+ if (is_borderline (digits, precision - 1))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_long_double (arg,
+ (int)(precision - 1) - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision. */
+
+ /* Determine the number of trailing zeroes
+ that have to be dropped. */
+ nzeroes = 0;
+ if ((flags & FLAG_ALT) == 0)
+ while (nzeroes < ndigits
+ && digits[nzeroes] == '0')
+ nzeroes++;
+
+ /* The exponent is now determined. */
+ if (exponent >= -4
+ && exponent < (long)precision)
+ {
+ /* Fixed-point notation:
+ max(exponent,0)+1 digits, then the
+ decimal point, then the remaining
+ digits without trailing zeroes. */
+ if (exponent >= 0)
+ {
+ size_t count = exponent + 1;
+ /* Note: count <= precision = ndigits. */
+ for (; count > 0; count--)
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ size_t count = -exponent - 1;
+ *p++ = '0';
+ *p++ = decimal_point_char ();
+ for (; count > 0; count--)
+ *p++ = '0';
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ /* Exponential notation. */
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', '.', '2', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+.2d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+.2d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+
+ free (digits);
+ }
+ }
+ else
+ abort ();
+# else
+ /* arg is finite. */
+ if (!(arg == 0.0L))
+ abort ();
+
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion; /* 'e' or 'E' */
+ *p++ = '+';
+ *p++ = '0';
+ *p++ = '0';
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ *p++ = '0';
+ if (flags & FLAG_ALT)
+ {
+ size_t ndigits =
+ (precision > 0 ? precision - 1 : 0);
+ *p++ = decimal_point_char ();
+ for (; ndigits > 0; --ndigits)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'a' || dp->conversion == 'A')
+ {
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+ *p++ = '+';
+ *p++ = '0';
+ }
+ else
+ abort ();
+# endif
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+ }
+ }
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ else
+# endif
+# endif
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+
+ if (isnand (arg))
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+
+ if (signbit (arg)) /* arg < 0.0 or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0 && arg + arg == arg)
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+# if NEED_PRINTF_DOUBLE
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ char *digits;
+ size_t ndigits;
+
+ digits =
+ scale10_round_decimal_double (arg, precision);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits > precision)
+ do
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ while (ndigits > precision);
+ else
+ *p++ = '0';
+ /* Here ndigits <= precision. */
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > ndigits; precision--)
+ *p++ = '0';
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ int exponent;
+
+ if (arg == 0.0)
+ {
+ exponent = 0;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else
+ {
+ /* arg > 0.0. */
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+
+ exponent = floorlog10 (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_double (arg,
+ (int)precision - exponent);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits == precision + 1)
+ break;
+ if (ndigits < precision
+ || ndigits > precision + 2)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits == precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision+1. */
+ if (is_borderline (digits, precision))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_double (arg,
+ (int)precision - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision + 1)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision+1. */
+
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+
+ *p++ = dp->conversion; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ { '%', '+', '.', '3', 'd', '\0' };
+# else
+ { '%', '+', '.', '2', 'd', '\0' };
+# endif
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ {
+ static const char decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ "%+.3d";
+# else
+ "%+.2d";
+# endif
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, decimal_format, exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, decimal_format, exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+ }
+# endif
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ if (precision == 0)
+ precision = 1;
+ /* precision >= 1. */
+
+ if (arg == 0.0)
+ /* The exponent is 0, >= -4, < precision.
+ Use fixed-point notation. */
+ {
+ size_t ndigits = precision;
+ /* Number of trailing zeroes that have to be
+ dropped. */
+ size_t nzeroes =
+ (flags & FLAG_ALT ? 0 : precision - 1);
+
+ --ndigits;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = '0';
+ }
+ }
+ }
+ else
+ {
+ /* arg > 0.0. */
+ int exponent;
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+ size_t nzeroes;
+
+ exponent = floorlog10 (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_double (arg,
+ (int)(precision - 1) - exponent);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits == precision)
+ break;
+ if (ndigits < precision - 1
+ || ndigits > precision + 1)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits < precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision. */
+ if (is_borderline (digits, precision - 1))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_double (arg,
+ (int)(precision - 1) - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision. */
+
+ /* Determine the number of trailing zeroes
+ that have to be dropped. */
+ nzeroes = 0;
+ if ((flags & FLAG_ALT) == 0)
+ while (nzeroes < ndigits
+ && digits[nzeroes] == '0')
+ nzeroes++;
+
+ /* The exponent is now determined. */
+ if (exponent >= -4
+ && exponent < (long)precision)
+ {
+ /* Fixed-point notation:
+ max(exponent,0)+1 digits, then the
+ decimal point, then the remaining
+ digits without trailing zeroes. */
+ if (exponent >= 0)
+ {
+ size_t count = exponent + 1;
+ /* Note: count <= precision = ndigits. */
+ for (; count > 0; count--)
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ size_t count = -exponent - 1;
+ *p++ = '0';
+ *p++ = decimal_point_char ();
+ for (; count > 0; count--)
+ *p++ = '0';
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ /* Exponential notation. */
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ { '%', '+', '.', '3', 'd', '\0' };
+# else
+ { '%', '+', '.', '2', 'd', '\0' };
+# endif
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ {
+ static const char decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ "%+.3d";
+# else
+ "%+.2d";
+# endif
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, decimal_format, exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, decimal_format, exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+ }
+# endif
+ }
+
+ free (digits);
+ }
+ }
+ else
+ abort ();
+# else
+ /* arg is finite. */
+ if (!(arg == 0.0))
+ abort ();
+
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion; /* 'e' or 'E' */
+ *p++ = '+';
+ /* Produce the same number of exponent digits as
+ the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ *p++ = '0';
+# endif
+ *p++ = '0';
+ *p++ = '0';
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ *p++ = '0';
+ if (flags & FLAG_ALT)
+ {
+ size_t ndigits =
+ (precision > 0 ? precision - 1 : 0);
+ *p++ = decimal_point_char ();
+ for (; ndigits > 0; --ndigits)
+ *p++ = '0';
+ }
+ }
+ else
+ abort ();
+# endif
+ }
+ }
+ }
+# endif
+
+ /* The generated string now extends from tmp to p, with the
+ zero padding insertion point being at pad_ptr. */
+ if (has_width && p - tmp < width)
+ {
+ size_t pad = width - (p - tmp);
+ DCHAR_T *end = p + pad;
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > tmp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+
+ p = end;
+ }
+
+ {
+ size_t count = p - tmp;
+
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+
+ /* Make room for the result. */
+ if (count >= allocated - length)
+ {
+ size_t n = xsum (length, count);
+
+ ENSURE_ALLOCATION (n);
+ }
+
+ /* Append the result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+ length += count;
+ }
+ }
+#endif
+ else
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ int has_width;
+ size_t width;
+#endif
+#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+ int has_precision;
+ size_t precision;
+#endif
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ int prec_ourselves;
+#else
+# define prec_ourselves 0
+#endif
+#if NEED_PRINTF_FLAG_LEFTADJUST
+# define pad_ourselves 1
+#elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ int pad_ourselves;
+#else
+# define pad_ourselves 0
+#endif
+ TCHAR_T *fbp;
+ unsigned int prefix_count;
+ int prefixes[2] IF_LINT (= { 0 });
+#if !USE_SNPRINTF
+ size_t tmp_length;
+ TCHAR_T tmpbuf[700];
+ TCHAR_T *tmp;
+#endif
+
+#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+#endif
+
+#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_precision = 0;
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+#endif
+
+ /* Decide whether to handle the precision ourselves. */
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ switch (dp->conversion)
+ {
+ case 'd': case 'i': case 'u':
+ case 'o':
+ case 'x': case 'X': case 'p':
+ prec_ourselves = has_precision && (precision > 0);
+ break;
+ default:
+ prec_ourselves = 0;
+ break;
+ }
+#endif
+
+ /* Decide whether to perform the padding ourselves. */
+#if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION)
+ switch (dp->conversion)
+ {
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+ /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need
+ to perform the padding after this conversion. Functions
+ with unistdio extensions perform the padding based on
+ character count rather than element count. */
+ case 'c': case 's':
+# endif
+# if NEED_PRINTF_FLAG_ZERO
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+# endif
+ pad_ourselves = 1;
+ break;
+ default:
+ pad_ourselves = prec_ourselves;
+ break;
+ }
+#endif
+
+#if !USE_SNPRINTF
+ /* Allocate a temporary buffer of sufficient size for calling
+ sprintf. */
+ {
+ switch (dp->conversion)
+ {
+
+ case 'd': case 'i': case 'u':
+# if HAVE_LONG_LONG_INT
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Multiply by 2, as an estimate for FLAG_GROUP. */
+ tmp_length = xsum (tmp_length, tmp_length);
+ /* Add 1, to account for a leading sign. */
+ tmp_length = xsum (tmp_length, 1);
+ break;
+
+ case 'o':
+# if HAVE_LONG_LONG_INT
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 1, to account for a leading sign. */
+ tmp_length = xsum (tmp_length, 1);
+ break;
+
+ case 'x': case 'X':
+# if HAVE_LONG_LONG_INT
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 2, to account for a leading sign or alternate form. */
+ tmp_length = xsum (tmp_length, 2);
+ break;
+
+ case 'f': case 'F':
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ else
+ tmp_length =
+ (unsigned int) (DBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'e': case 'E': case 'g': case 'G':
+ tmp_length =
+ 12; /* sign, decimal point, exponent etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'a': case 'A':
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_DIG
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (DBL_DIG
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+ break;
+
+ case 'c':
+# if HAVE_WINT_T && !WIDE_CHAR_VERSION
+ if (type == TYPE_WIDE_CHAR)
+ tmp_length = MB_CUR_MAX;
+ else
+# endif
+ tmp_length = 1;
+ break;
+
+ case 's':
+# if HAVE_WCHAR_T
+ if (type == TYPE_WIDE_STRING)
+ {
+# if WIDE_CHAR_VERSION
+ /* ISO C says about %ls in fwprintf:
+ "If the precision is not specified or is greater
+ than the size of the array, the array shall
+ contain a null wide character."
+ So if there is a precision, we must not use
+ wcslen. */
+ const wchar_t *arg =
+ a.arg[dp->arg_index].a.a_wide_string;
+
+ if (has_precision)
+ tmp_length = local_wcsnlen (arg, precision);
+ else
+ tmp_length = local_wcslen (arg);
+# else
+ /* ISO C says about %ls in fprintf:
+ "If a precision is specified, no more than that
+ many bytes are written (including shift
+ sequences, if any), and the array shall contain
+ a null wide character if, to equal the
+ multibyte character sequence length given by
+ the precision, the function would need to
+ access a wide character one past the end of the
+ array."
+ So if there is a precision, we must not use
+ wcslen. */
+ /* This case has already been handled above. */
+ abort ();
+# endif
+ }
+ else
+# endif
+ {
+# if WIDE_CHAR_VERSION
+ /* ISO C says about %s in fwprintf:
+ "If the precision is not specified or is greater
+ than the size of the converted array, the
+ converted array shall contain a null wide
+ character."
+ So if there is a precision, we must not use
+ strlen. */
+ /* This case has already been handled above. */
+ abort ();
+# else
+ /* ISO C says about %s in fprintf:
+ "If the precision is not specified or greater
+ than the size of the array, the array shall
+ contain a null character."
+ So if there is a precision, we must not use
+ strlen. */
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+
+ if (has_precision)
+ tmp_length = local_strnlen (arg, precision);
+ else
+ tmp_length = strlen (arg);
+# endif
+ }
+ break;
+
+ case 'p':
+ tmp_length =
+ (unsigned int) (sizeof (void *) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading 0x */
+ break;
+
+ default:
+ abort ();
+ }
+
+ if (!pad_ourselves)
+ {
+# if ENABLE_UNISTDIO
+ /* Padding considers the number of characters, therefore
+ the number of elements after padding may be
+ > max (tmp_length, width)
+ but is certainly
+ <= tmp_length + width. */
+ tmp_length = xsum (tmp_length, width);
+# else
+ /* Padding considers the number of elements,
+ says POSIX. */
+ if (tmp_length < width)
+ tmp_length = width;
+# endif
+ }
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+ }
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (TCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+#endif
+
+ /* Construct the format string for calling snprintf or
+ sprintf. */
+ fbp = buf;
+ *fbp++ = '%';
+#if NEED_PRINTF_FLAG_GROUPING
+ /* The underlying implementation doesn't support the ' flag.
+ Produce no grouping characters in this case; this is
+ acceptable because the grouping is locale dependent. */
+#else
+ if (flags & FLAG_GROUP)
+ *fbp++ = '\'';
+#endif
+ if (flags & FLAG_LEFT)
+ *fbp++ = '-';
+ if (flags & FLAG_SHOWSIGN)
+ *fbp++ = '+';
+ if (flags & FLAG_SPACE)
+ *fbp++ = ' ';
+ if (flags & FLAG_ALT)
+ *fbp++ = '#';
+ if (!pad_ourselves)
+ {
+ if (flags & FLAG_ZERO)
+ *fbp++ = '0';
+ if (dp->width_start != dp->width_end)
+ {
+ size_t n = dp->width_end - dp->width_start;
+ /* The width specification is known to consist only
+ of standard ASCII characters. */
+ if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+ {
+ memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T));
+ fbp += n;
+ }
+ else
+ {
+ const FCHAR_T *mp = dp->width_start;
+ do
+ *fbp++ = (unsigned char) *mp++;
+ while (--n > 0);
+ }
+ }
+ }
+ if (!prec_ourselves)
+ {
+ if (dp->precision_start != dp->precision_end)
+ {
+ size_t n = dp->precision_end - dp->precision_start;
+ /* The precision specification is known to consist only
+ of standard ASCII characters. */
+ if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+ {
+ memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T));
+ fbp += n;
+ }
+ else
+ {
+ const FCHAR_T *mp = dp->precision_start;
+ do
+ *fbp++ = (unsigned char) *mp++;
+ while (--n > 0);
+ }
+ }
+ }
+
+ switch (type)
+ {
+#if HAVE_LONG_LONG_INT
+ case TYPE_LONGLONGINT:
+ case TYPE_ULONGLONGINT:
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ *fbp++ = 'I';
+ *fbp++ = '6';
+ *fbp++ = '4';
+ break;
+# else
+ *fbp++ = 'l';
+ /*FALLTHROUGH*/
+# endif
+#endif
+ case TYPE_LONGINT:
+ case TYPE_ULONGINT:
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+#endif
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+#endif
+ *fbp++ = 'l';
+ break;
+ case TYPE_LONGDOUBLE:
+ *fbp++ = 'L';
+ break;
+ default:
+ break;
+ }
+#if NEED_PRINTF_DIRECTIVE_F
+ if (dp->conversion == 'F')
+ *fbp = 'f';
+ else
+#endif
+ *fbp = dp->conversion;
+#if USE_SNPRINTF
+# if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+ fbp[1] = '%';
+ fbp[2] = 'n';
+ fbp[3] = '\0';
+# else
+ /* On glibc2 systems from glibc >= 2.3 - probably also older
+ ones - we know that snprintf's returns value conforms to
+ ISO C 99: the gl_SNPRINTF_DIRECTIVE_N test passes.
+ Therefore we can avoid using %n in this situation.
+ On glibc2 systems from 2004-10-18 or newer, the use of %n
+ in format strings in writable memory may crash the program
+ (if compiled with _FORTIFY_SOURCE=2), so we should avoid it
+ in this situation. */
+ /* On native Win32 systems (such as mingw), we can avoid using
+ %n because:
+ - Although the gl_SNPRINTF_TRUNCATION_C99 test fails,
+ snprintf does not write more than the specified number
+ of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes
+ '4', '5', '6' into buf, not '4', '5', '\0'.)
+ - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf
+ allows us to recognize the case of an insufficient
+ buffer size: it returns -1 in this case.
+ On native Win32 systems (such as mingw) where the OS is
+ Windows Vista, the use of %n in format strings by default
+ crashes the program. See
+ <http://gcc.gnu.org/ml/gcc/2007-06/msg00122.html> and
+ <http://msdn2.microsoft.com/en-us/library/ms175782(VS.80).aspx>
+ So we should avoid %n in this situation. */
+ fbp[1] = '\0';
+# endif
+#else
+ fbp[1] = '\0';
+#endif
+
+ /* Construct the arguments for calling snprintf or sprintf. */
+ prefix_count = 0;
+ if (!pad_ourselves && dp->width_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+ }
+ if (!prec_ourselves && dp->precision_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+ }
+
+#if USE_SNPRINTF
+ /* The SNPRINTF result is appended after result[0..length].
+ The latter is an array of DCHAR_T; SNPRINTF appends an
+ array of TCHAR_T to it. This is possible because
+ sizeof (TCHAR_T) divides sizeof (DCHAR_T) and
+ alignof (TCHAR_T) <= alignof (DCHAR_T). */
+# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T))
+ /* Ensure that maxlen below will be >= 2. Needed on BeOS,
+ where an snprintf() with maxlen==1 acts like sprintf(). */
+ ENSURE_ALLOCATION (xsum (length,
+ (2 + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR));
+ /* Prepare checking whether snprintf returns the count
+ via %n. */
+ *(TCHAR_T *) (result + length) = '\0';
+#endif
+
+ for (;;)
+ {
+ int count = -1;
+
+#if USE_SNPRINTF
+ int retcount = 0;
+ size_t maxlen = allocated - length;
+ /* SNPRINTF can fail if its second argument is
+ > INT_MAX. */
+ if (maxlen > INT_MAX / TCHARS_PER_DCHAR)
+ maxlen = INT_MAX / TCHARS_PER_DCHAR;
+ maxlen = maxlen * TCHARS_PER_DCHAR;
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ arg, &count); \
+ break; \
+ case 1: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ prefixes[0], arg, &count); \
+ break; \
+ case 2: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ prefixes[0], prefixes[1], arg, \
+ &count); \
+ break; \
+ default: \
+ abort (); \
+ }
+#else
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ count = sprintf (tmp, buf, arg); \
+ break; \
+ case 1: \
+ count = sprintf (tmp, buf, prefixes[0], arg); \
+ break; \
+ case 2: \
+ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+ arg); \
+ break; \
+ default: \
+ abort (); \
+ }
+#endif
+
+ switch (type)
+ {
+ case TYPE_SCHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_schar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UCHAR:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_SHORT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_short;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_USHORT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_INT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_int;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UINT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGINT:
+ {
+ long int arg = a.arg[dp->arg_index].a.a_longint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGINT:
+ {
+ unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_LONGLONGINT:
+ {
+ long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGLONGINT:
+ {
+ unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_DOUBLE:
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGDOUBLE:
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_CHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ {
+ wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_STRING:
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ {
+ void *arg = a.arg[dp->arg_index].a.a_pointer;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+#if USE_SNPRINTF
+ /* Portability: Not all implementations of snprintf()
+ are ISO C 99 compliant. Determine the number of
+ bytes that snprintf() has produced or would have
+ produced. */
+ if (count >= 0)
+ {
+ /* Verify that snprintf() has NUL-terminated its
+ result. */
+ if (count < maxlen
+ && ((TCHAR_T *) (result + length)) [count] != '\0')
+ abort ();
+ /* Portability hack. */
+ if (retcount > count)
+ count = retcount;
+ }
+ else
+ {
+ /* snprintf() doesn't understand the '%n'
+ directive. */
+ if (fbp[1] != '\0')
+ {
+ /* Don't use the '%n' directive; instead, look
+ at the snprintf() return value. */
+ fbp[1] = '\0';
+ continue;
+ }
+ else
+ {
+ /* Look at the snprintf() return value. */
+ if (retcount < 0)
+ {
+ /* HP-UX 10.20 snprintf() is doubly deficient:
+ It doesn't understand the '%n' directive,
+ *and* it returns -1 (rather than the length
+ that would have been required) when the
+ buffer is too small. */
+ size_t bigger_need =
+ xsum (xtimes (allocated, 2), 12);
+ ENSURE_ALLOCATION (bigger_need);
+ continue;
+ }
+ else
+ count = retcount;
+ }
+ }
+#endif
+
+ /* Attempt to handle failure. */
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+#if USE_SNPRINTF
+ /* Handle overflow of the allocated buffer.
+ If such an overflow occurs, a C99 compliant snprintf()
+ returns a count >= maxlen. However, a non-compliant
+ snprintf() function returns only count = maxlen - 1. To
+ cover both cases, test whether count >= maxlen - 1. */
+ if ((unsigned int) count + 1 >= maxlen)
+ {
+ /* If maxlen already has attained its allowed maximum,
+ allocating more memory will not increase maxlen.
+ Instead of looping, bail out. */
+ if (maxlen == INT_MAX / TCHARS_PER_DCHAR)
+ goto overflow;
+ else
+ {
+ /* Need at least (count + 1) * sizeof (TCHAR_T)
+ bytes. (The +1 is for the trailing NUL.)
+ But ask for (count + 2) * sizeof (TCHAR_T)
+ bytes, so that in the next round, we likely get
+ maxlen > (unsigned int) count + 1
+ and so we don't get here again.
+ And allocate proportionally, to avoid looping
+ eternally if snprintf() reports a too small
+ count. */
+ size_t n =
+ xmax (xsum (length,
+ ((unsigned int) count + 2
+ + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR),
+ xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+ continue;
+ }
+ }
+#endif
+
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ if (prec_ourselves)
+ {
+ /* Handle the precision. */
+ TCHAR_T *prec_ptr =
+# if USE_SNPRINTF
+ (TCHAR_T *) (result + length);
+# else
+ tmp;
+# endif
+ size_t prefix_count;
+ size_t move;
+
+ prefix_count = 0;
+ /* Put the additional zeroes after the sign. */
+ if (count >= 1
+ && (*prec_ptr == '-' || *prec_ptr == '+'
+ || *prec_ptr == ' '))
+ prefix_count = 1;
+ /* Put the additional zeroes after the 0x prefix if
+ (flags & FLAG_ALT) || (dp->conversion == 'p'). */
+ else if (count >= 2
+ && prec_ptr[0] == '0'
+ && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X'))
+ prefix_count = 2;
+
+ move = count - prefix_count;
+ if (precision > move)
+ {
+ /* Insert zeroes. */
+ size_t insert = precision - move;
+ TCHAR_T *prec_end;
+
+# if USE_SNPRINTF
+ size_t n =
+ xsum (length,
+ (count + insert + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR);
+ length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+ ENSURE_ALLOCATION (n);
+ length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+ prec_ptr = (TCHAR_T *) (result + length);
+# endif
+
+ prec_end = prec_ptr + count;
+ prec_ptr += prefix_count;
+
+ while (prec_end > prec_ptr)
+ {
+ prec_end--;
+ prec_end[insert] = prec_end[0];
+ }
+
+ prec_end += insert;
+ do
+ *--prec_end = '0';
+ while (prec_end > prec_ptr);
+
+ count += insert;
+ }
+ }
+#endif
+
+#if !USE_SNPRINTF
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+#endif
+
+#if !DCHAR_IS_TCHAR
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ if (dp->conversion == 'c' || dp->conversion == 's')
+ {
+ /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING
+ TYPE_WIDE_STRING.
+ The result string is not certainly ASCII. */
+ const TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+ /* This code assumes that TCHAR_T is 'char'. */
+ typedef int TCHAR_T_verify
+ [2 * (sizeof (TCHAR_T) == 1) - 1];
+# if USE_SNPRINTF
+ tmpsrc = (TCHAR_T *) (result + length);
+# else
+ tmpsrc = tmp;
+# endif
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, count,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ count = tmpdst_len;
+ }
+ else
+ {
+ /* The result string is ASCII.
+ Simple 1:1 conversion. */
+# if USE_SNPRINTF
+ /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a
+ no-op conversion, in-place on the array starting
+ at (result + length). */
+ if (sizeof (DCHAR_T) != sizeof (TCHAR_T))
+# endif
+ {
+ const TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t n;
+
+# if USE_SNPRINTF
+ if (result == resultbuf)
+ {
+ tmpsrc = (TCHAR_T *) (result + length);
+ /* ENSURE_ALLOCATION will not move tmpsrc
+ (because it's part of resultbuf). */
+ ENSURE_ALLOCATION (xsum (length, count));
+ }
+ else
+ {
+ /* ENSURE_ALLOCATION will move the array
+ (because it uses realloc(). */
+ ENSURE_ALLOCATION (xsum (length, count));
+ tmpsrc = (TCHAR_T *) (result + length);
+ }
+# else
+ tmpsrc = tmp;
+ ENSURE_ALLOCATION (xsum (length, count));
+# endif
+ tmpdst = result + length;
+ /* Copy backwards, because of overlapping. */
+ tmpsrc += count;
+ tmpdst += count;
+ for (n = count; n > 0; n--)
+ *--tmpdst = (unsigned char) *--tmpsrc;
+ }
+ }
+#endif
+
+#if DCHAR_IS_TCHAR && !USE_SNPRINTF
+ /* Make room for the result. */
+ if (count > allocated - length)
+ {
+ /* Need at least count elements. But allocate
+ proportionally. */
+ size_t n =
+ xmax (xsum (length, count), xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+ }
+#endif
+
+ /* Here count <= allocated - length. */
+
+ /* Perform padding. */
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ if (pad_ourselves && has_width)
+ {
+ size_t w;
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferrable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, count);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = count;
+# endif
+ if (w < width)
+ {
+ size_t pad = width - w;
+
+ /* Make room for the result. */
+ if (xsum (count, pad) > allocated - length)
+ {
+ /* Need at least count + pad elements. But
+ allocate proportionally. */
+ size_t n =
+ xmax (xsum3 (length, count, pad),
+ xtimes (allocated, 2));
+
+# if USE_SNPRINTF
+ length += count;
+ ENSURE_ALLOCATION (n);
+ length -= count;
+# else
+ ENSURE_ALLOCATION (n);
+# endif
+ }
+ /* Here count + pad <= allocated - length. */
+
+ {
+# if !DCHAR_IS_TCHAR || USE_SNPRINTF
+ DCHAR_T * const rp = result + length;
+# else
+ DCHAR_T * const rp = tmp;
+# endif
+ DCHAR_T *p = rp + count;
+ DCHAR_T *end = p + pad;
+ DCHAR_T *pad_ptr;
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+ if (dp->conversion == 'c'
+ || dp->conversion == 's')
+ /* No zero-padding for string directives. */
+ pad_ptr = NULL;
+ else
+# endif
+ {
+ pad_ptr = (*rp == '-' ? rp + 1 : rp);
+ /* No zero-padding of "inf" and "nan". */
+ if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z')
+ || (*pad_ptr >= 'a' && *pad_ptr <= 'z'))
+ pad_ptr = NULL;
+ }
+ /* The generated string now extends from rp to p,
+ with the zero padding insertion point being at
+ pad_ptr. */
+
+ count = count + pad; /* = end - rp */
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > rp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ }
+ }
+ }
+#endif
+
+ /* Here still count <= allocated - length. */
+
+#if !DCHAR_IS_TCHAR || USE_SNPRINTF
+ /* The snprintf() result did fit. */
+#else
+ /* Append the sprintf() result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+#endif
+#if !USE_SNPRINTF
+ if (tmp != tmpbuf)
+ free (tmp);
+#endif
+
+#if NEED_PRINTF_DIRECTIVE_F
+ if (dp->conversion == 'F')
+ {
+ /* Convert the %f result to upper case for %F. */
+ DCHAR_T *rp = result + length;
+ size_t rc;
+ for (rc = count; rc > 0; rc--, rp++)
+ if (*rp >= 'a' && *rp <= 'z')
+ *rp = *rp - 'a' + 'A';
+ }
+#endif
+
+ length += count;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Add the final NUL. */
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length] = '\0';
+
+ if (result != resultbuf && length + 1 < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DCHAR_T *memory;
+
+ memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ *lengthp = length;
+ /* Note that we can produce a big string of a length > INT_MAX. POSIX
+ says that snprintf() fails with errno = EOVERFLOW in this case, but
+ that's only because snprintf() returns an 'int'. This function does
+ not have this limitation. */
+ return result;
+
+#if USE_SNPRINTF
+ overflow:
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EOVERFLOW;
+ return NULL;
+#endif
+
+ out_of_memory:
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ out_of_memory_1:
+ CLEANUP ();
+ errno = ENOMEM;
+ return NULL;
+ }
+}
+
+#undef TCHARS_PER_DCHAR
+#undef SNPRINTF
+#undef USE_SNPRINTF
+#undef DCHAR_SET
+#undef DCHAR_CPY
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef DCHAR_IS_TCHAR
+#undef TCHAR_T
+#undef DCHAR_T
+#undef FCHAR_T
+#undef VASNPRINTF
diff --git a/gnulib/lib/vasnprintf.h b/gnulib/lib/vasnprintf.h
new file mode 100644
index 00000000..5e3d291c
--- /dev/null
+++ b/gnulib/lib/vasnprintf.h
@@ -0,0 +1,80 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 2002-2004, 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifndef __attribute__
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable __attribute__ only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(Spec) /* empty */
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+ You can pass a preallocated buffer for the result in RESULTBUF and its
+ size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+ If successful, return the address of the string (this may be = RESULTBUF
+ if no dynamic memory allocation was necessary) and set *LENGTHP to the
+ number of resulting bytes, excluding the trailing NUL. Upon error, set
+ errno and return NULL.
+
+ When dynamic memory allocation occurs, the preallocated buffer is left
+ alone (with possibly modified contents). This makes it possible to use
+ a statically allocated or stack-allocated buffer, like this:
+
+ char buf[100];
+ size_t len = sizeof (buf);
+ char *output = vasnprintf (buf, &len, format, args);
+ if (output == NULL)
+ ... error handling ...;
+ else
+ {
+ ... use the output string ...;
+ if (output != buf)
+ free (output);
+ }
+ */
+#if REPLACE_VASNPRINTF
+# define asnprintf rpl_asnprintf
+# define vasnprintf rpl_vasnprintf
+#endif
+extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 3, 0)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */
diff --git a/gnulib/lib/vasprintf.c b/gnulib/lib/vasprintf.c
new file mode 100644
index 00000000..e48b6d16
--- /dev/null
+++ b/gnulib/lib/vasprintf.c
@@ -0,0 +1,51 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef IN_LIBASPRINTF
+# include "vasprintf.h"
+#else
+# include <stdio.h>
+#endif
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "vasnprintf.h"
+
+int
+vasprintf (char **resultp, const char *format, va_list args)
+{
+ size_t length;
+ char *result = vasnprintf (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ if (length > INT_MAX)
+ {
+ free (result);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ *resultp = result;
+ /* Return the number of resulting bytes, excluding the trailing NUL. */
+ return length;
+}
diff --git a/gnulib/lib/vdprintf.c b/gnulib/lib/vdprintf.c
new file mode 100644
index 00000000..008738a1
--- /dev/null
+++ b/gnulib/lib/vdprintf.c
@@ -0,0 +1,67 @@
+/* Formatted output to a file descriptor.
+ Copyright (C) 2009, 2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "full-write.h"
+#include "vasnprintf.h"
+
+int
+vdprintf (int fd, const char *format, va_list args)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ return -1;
+
+ if (full_write (fd, output, len) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/verify.h b/gnulib/lib/verify.h
new file mode 100644
index 00000000..bcd3f5a0
--- /dev/null
+++ b/gnulib/lib/verify.h
@@ -0,0 +1,140 @@
+/* Compile-time assert-like macros.
+
+ Copyright (C) 2005-2006, 2009-2010 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/>. */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
+
+#ifndef VERIFY_H
+# define VERIFY_H 1
+
+/* Each of these macros verifies that its argument R is nonzero. To
+ be portable, R should be an integer constant expression. Unlike
+ assert (R), there is no run-time overhead.
+
+ There are two macros, since no single macro can be used in all
+ contexts in C. verify_true (R) is for scalar contexts, including
+ integer constant expression contexts. verify (R) is for declaration
+ contexts, e.g., the top level.
+
+ Symbols ending in "__" are private to this header.
+
+ The code below uses several ideas.
+
+ * The first step is ((R) ? 1 : -1). Given an expression R, of
+ integral or boolean or floating-point type, this yields an
+ expression of integral type, whose value is later verified to be
+ constant and nonnegative.
+
+ * Next this expression W is wrapped in a type
+ struct verify_type__ { unsigned int verify_error_if_negative_size__: W; }.
+ If W is negative, this yields a compile-time error. No compiler can
+ deal with a bit-field of negative size.
+
+ One might think that an array size check would have the same
+ effect, that is, that the type struct { unsigned int dummy[W]; }
+ would work as well. However, inside a function, some compilers
+ (such as C++ compilers and GNU C) allow local parameters and
+ variables inside array size expressions. With these compilers,
+ an array size check would not properly diagnose this misuse of
+ the verify macro:
+
+ void function (int n) { verify (n < 0); }
+
+ * For the verify macro, the struct verify_type__ will need to
+ somehow be embedded into a declaration. To be portable, this
+ declaration must declare an object, a constant, a function, or a
+ typedef name. If the declared entity uses the type directly,
+ such as in
+
+ struct dummy {...};
+ typedef struct {...} dummy;
+ extern struct {...} *dummy;
+ extern void dummy (struct {...} *);
+ extern struct {...} *dummy (void);
+
+ two uses of the verify macro would yield colliding declarations
+ if the entity names are not disambiguated. A workaround is to
+ attach the current line number to the entity name:
+
+ #define GL_CONCAT0(x, y) x##y
+ #define GL_CONCAT(x, y) GL_CONCAT0 (x, y)
+ extern struct {...} * GL_CONCAT(dummy,__LINE__);
+
+ But this has the problem that two invocations of verify from
+ within the same macro would collide, since the __LINE__ value
+ would be the same for both invocations.
+
+ A solution is to use the sizeof operator. It yields a number,
+ getting rid of the identity of the type. Declarations like
+
+ extern int dummy [sizeof (struct {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+
+ can be repeated.
+
+ * Should the implementation use a named struct or an unnamed struct?
+ Which of the following alternatives can be used?
+
+ extern int dummy [sizeof (struct {...})];
+ extern int dummy [sizeof (struct verify_type__ {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern void dummy (int [sizeof (struct verify_type__ {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+ extern int (*dummy (void)) [sizeof (struct verify_type__ {...})];
+
+ In the second and sixth case, the struct type is exported to the
+ outer scope; two such declarations therefore collide. GCC warns
+ about the first, third, and fourth cases. So the only remaining
+ possibility is the fifth case:
+
+ extern int (*dummy (void)) [sizeof (struct {...})];
+
+ * This implementation exploits the fact that GCC does not warn about
+ the last declaration mentioned above. If a future version of GCC
+ introduces a warning for this, the problem could be worked around
+ by using code specialized to GCC, e.g.,:
+
+ #if 4 <= __GNUC__
+ # define verify(R) \
+ extern int (* verify_function__ (void)) \
+ [__builtin_constant_p (R) && (R) ? 1 : -1]
+ #endif
+
+ * In C++, any struct definition inside sizeof is invalid.
+ Use a template type to work around the problem. */
+
+
+/* Verify requirement R at compile-time, as an integer constant expression.
+ Return 1. */
+
+# ifdef __cplusplus
+template <int w>
+ struct verify_type__ { unsigned int verify_error_if_negative_size__: w; };
+# define verify_true(R) \
+ (!!sizeof (verify_type__<(R) ? 1 : -1>))
+# else
+# define verify_true(R) \
+ (!!sizeof \
+ (struct { unsigned int verify_error_if_negative_size__: (R) ? 1 : -1; }))
+# endif
+
+/* Verify requirement R at compile-time, as a declaration without a
+ trailing ';'. */
+
+# define verify(R) extern int (* verify_function__ (void)) [verify_true (R)]
+
+#endif
diff --git a/gnulib/lib/verror.c b/gnulib/lib/verror.c
new file mode 100644
index 00000000..62b7fc46
--- /dev/null
+++ b/gnulib/lib/verror.c
@@ -0,0 +1,77 @@
+/* va_list error handler for noninteractive utilities
+ Copyright (C) 2006-2007, 2009-2010 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "verror.h"
+#include "xvasprintf.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#if ENABLE_NLS
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#ifndef _
+# define _(String) String
+#endif
+
+/* Print a message with `vfprintf (stderr, FORMAT, ARGS)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'.
+ Use the globals error_print_progname and error_message_count similarly
+ to error(). */
+void
+verror (int status, int errnum, const char *format, va_list args)
+{
+ verror_at_line (status, errnum, NULL, 0, format, args);
+}
+
+/* Print a message with `vfprintf (stderr, FORMAT, ARGS)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'.
+ If FNAME is not NULL, prepend the message with `FNAME:LINENO:'.
+ Use the globals error_print_progname, error_message_count, and
+ error_one_per_line similarly to error_at_line(). */
+void
+verror_at_line (int status, int errnum, const char *file,
+ unsigned int line_number, const char *format, va_list args)
+{
+ char *message = xvasprintf (format, args);
+ if (message)
+ {
+ /* Until http://sourceware.org/bugzilla/show_bug.cgi?id=2997 is fixed,
+ glibc violates GNU Coding Standards when the file argument to
+ error_at_line is NULL. */
+ if (file)
+ error_at_line (status, errnum, file, line_number, "%s", message);
+ else
+ error (status, errnum, "%s", message);
+ }
+ else
+ {
+ /* EOVERFLOW, EINVAL, and EILSEQ from xvasprintf are signs of
+ serious programmer errors. */
+ error (0, errno, _("unable to display error message"));
+ abort ();
+ }
+ free (message);
+}
diff --git a/gnulib/lib/verror.h b/gnulib/lib/verror.h
new file mode 100644
index 00000000..f0553e86
--- /dev/null
+++ b/gnulib/lib/verror.h
@@ -0,0 +1,53 @@
+/* Declaration for va_list error-reporting function
+ Copyright (C) 2006-2007, 2009-2010 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/>. */
+
+#ifndef _VERROR_H
+#define _VERROR_H 1
+
+#include "error.h"
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Print a message with `vfprintf (stderr, FORMAT, ARGS)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'.
+ Use the globals error_print_progname and error_message_count similarly
+ to error(). */
+
+extern void verror (int __status, int __errnum, const char *__format,
+ va_list __args)
+ __attribute__ ((__format__ (__printf__, 3, 0)));
+
+/* Print a message with `vfprintf (stderr, FORMAT, ARGS)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'.
+ If FNAME is not NULL, prepend the message with `FNAME:LINENO:'.
+ Use the globals error_print_progname, error_message_count, and
+ error_one_per_line similarly to error_at_line(). */
+
+extern void verror_at_line (int __status, int __errnum, const char *__fname,
+ unsigned int __lineno, const char *__format,
+ va_list __args)
+ __attribute__ ((__format__ (__printf__, 5, 0)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* verror.h */
diff --git a/gnulib/lib/version-etc-fsf.c b/gnulib/lib/version-etc-fsf.c
new file mode 100644
index 00000000..fc837a89
--- /dev/null
+++ b/gnulib/lib/version-etc-fsf.c
@@ -0,0 +1,30 @@
+/* Variable with FSF copyright information, for version-etc.
+ Copyright (C) 1999-2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "version-etc.h"
+
+/* Default copyright goes to the FSF. */
+
+const char version_etc_copyright[] =
+ /* Do *not* mark this string for translation. %s is a copyright
+ symbol suitable for this locale, and %d is the copyright
+ year. */
+ "Copyright %s %d Free Software Foundation, Inc.";
diff --git a/gnulib/lib/version-etc.c b/gnulib/lib/version-etc.c
new file mode 100644
index 00000000..19c873d0
--- /dev/null
+++ b/gnulib/lib/version-etc.c
@@ -0,0 +1,258 @@
+/* Print --version and bug-reporting information in a consistent format.
+ Copyright (C) 1999-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "version-etc.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+/* If you use AM_INIT_AUTOMAKE's no-define option,
+ PACKAGE is not defined. Use PACKAGE_TARNAME instead. */
+#if ! defined PACKAGE && defined PACKAGE_TARNAME
+# define PACKAGE PACKAGE_TARNAME
+#endif
+
+enum { COPYRIGHT_YEAR = 2010 };
+
+/* The three functions below display the --version information the
+ standard way.
+
+ If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of
+ the program. The formats are therefore:
+
+ PACKAGE VERSION
+
+ or
+
+ COMMAND_NAME (PACKAGE) VERSION.
+
+ The functions differ in the way they are passed author names. */
+
+/* Display the --version information the standard way.
+
+ Author names are given in the array AUTHORS. N_AUTHORS is the
+ number of elements in the array. */
+void
+version_etc_arn (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version,
+ const char * const * authors, size_t n_authors)
+{
+ if (command_name)
+ fprintf (stream, "%s (%s) %s\n", command_name, package, version);
+ else
+ fprintf (stream, "%s %s\n", package, version);
+
+#ifdef PACKAGE_PACKAGER
+# ifdef PACKAGE_PACKAGER_VERSION
+ fprintf (stream, _("Packaged by %s (%s)\n"), PACKAGE_PACKAGER,
+ PACKAGE_PACKAGER_VERSION);
+# else
+ fprintf (stream, _("Packaged by %s\n"), PACKAGE_PACKAGER);
+# endif
+#endif
+
+ /* TRANSLATORS: Translate "(C)" to the copyright symbol
+ (C-in-a-circle), if this symbol is available in the user's
+ locale. Otherwise, do not translate "(C)"; leave it as-is. */
+ fprintf (stream, version_etc_copyright, _("(C)"), COPYRIGHT_YEAR);
+
+ fputs (_("\
+\n\
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.\n\
+This is free software: you are free to change and redistribute it.\n\
+There is NO WARRANTY, to the extent permitted by law.\n\
+\n\
+"),
+ stream);
+
+ switch (n_authors)
+ {
+ case 0:
+ /* The caller must provide at least one author name. */
+ abort ();
+ case 1:
+ /* TRANSLATORS: %s denotes an author name. */
+ fprintf (stream, _("Written by %s.\n"), authors[0]);
+ break;
+ case 2:
+ /* TRANSLATORS: Each %s denotes an author name. */
+ fprintf (stream, _("Written by %s and %s.\n"), authors[0], authors[1]);
+ break;
+ case 3:
+ /* TRANSLATORS: Each %s denotes an author name. */
+ fprintf (stream, _("Written by %s, %s, and %s.\n"),
+ authors[0], authors[1], authors[2]);
+ break;
+ case 4:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"),
+ authors[0], authors[1], authors[2], authors[3]);
+ break;
+ case 5:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4]);
+ break;
+ case 6:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5]);
+ break;
+ case 7:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5], authors[6]);
+ break;
+ case 8:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5], authors[6], authors[7]);
+ break;
+ case 9:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5], authors[6], authors[7], authors[8]);
+ break;
+ default:
+ /* 10 or more authors. Use an abbreviation, since the human reader
+ will probably not want to read the entire list anyway. */
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5], authors[6], authors[7], authors[8]);
+ break;
+ }
+}
+
+/* Display the --version information the standard way. See the initial
+ comment to this module, for more information.
+
+ Author names are given in the NULL-terminated array AUTHORS. */
+void
+version_etc_ar (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, const char * const * authors)
+{
+ size_t n_authors;
+
+ for (n_authors = 0; authors[n_authors]; n_authors++)
+ ;
+ version_etc_arn (stream, command_name, package, version, authors, n_authors);
+}
+
+/* Display the --version information the standard way. See the initial
+ comment to this module, for more information.
+
+ Author names are given in the NULL-terminated va_list AUTHORS. */
+void
+version_etc_va (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, va_list authors)
+{
+ size_t n_authors;
+ const char *authtab[10];
+
+ for (n_authors = 0;
+ n_authors < 10
+ && (authtab[n_authors] = va_arg (authors, const char *)) != NULL;
+ n_authors++)
+ ;
+ version_etc_arn (stream, command_name, package, version,
+ authtab, n_authors);
+}
+
+
+/* Display the --version information the standard way.
+
+ If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of
+ the program. The formats are therefore:
+
+ PACKAGE VERSION
+
+ or
+
+ COMMAND_NAME (PACKAGE) VERSION.
+
+ The authors names are passed as separate arguments, with an additional
+ NULL argument at the end. */
+void
+version_etc (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, /* const char *author1, ...*/ ...)
+{
+ va_list authors;
+
+ va_start (authors, version);
+ version_etc_va (stream, command_name, package, version, authors);
+ va_end (authors);
+}
+
+void
+emit_bug_reporting_address (void)
+{
+ /* TRANSLATORS: The placeholder indicates the bug-reporting address
+ for this package. Please add _another line_ saying
+ "Report translation bugs to <...>\n" with the address for translation
+ bugs (typically your translation team's web or email address). */
+ printf (_("\nReport bugs to: %s\n"), PACKAGE_BUGREPORT);
+#ifdef PACKAGE_PACKAGER_BUG_REPORTS
+ printf (_("Report %s bugs to: %s\n"), PACKAGE_PACKAGER,
+ PACKAGE_PACKAGER_BUG_REPORTS);
+#endif
+#ifdef PACKAGE_URL
+ printf (_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+#else
+ printf (_("%s home page: <http://www.gnu.org/software/%s/>\n"),
+ PACKAGE_NAME, PACKAGE);
+#endif
+ fputs (_("General help using GNU software: <http://www.gnu.org/gethelp/>\n"),
+ stdout);
+}
diff --git a/gnulib/lib/version-etc.h b/gnulib/lib/version-etc.h
new file mode 100644
index 00000000..629fe830
--- /dev/null
+++ b/gnulib/lib/version-etc.h
@@ -0,0 +1,78 @@
+/* Print --version and bug-reporting information in a consistent format.
+ Copyright (C) 1999, 2003, 2005, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef VERSION_ETC_H
+# define VERSION_ETC_H 1
+
+# include <stdarg.h>
+# include <stdio.h>
+
+/* The `sentinel' attribute was added in gcc 4.0. */
+#ifndef ATTRIBUTE_SENTINEL
+# if 4 <= __GNUC__
+# define ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__))
+# else
+# define ATTRIBUTE_SENTINEL /* empty */
+# endif
+#endif
+
+extern const char version_etc_copyright[];
+
+/* The three functions below display the --version information in the
+ standard way: command and package names, package version, followed
+ by a short GPLv3+ notice and a list of up to 10 author names.
+
+ If COMMAND_NAME is NULL, the PACKAGE is asumed to be the name of
+ the program. The formats are therefore:
+
+ PACKAGE VERSION
+
+ or
+
+ COMMAND_NAME (PACKAGE) VERSION.
+
+ The functions differ in the way they are passed author names: */
+
+/* N_AUTHORS names are supplied in array AUTHORS. */
+extern void version_etc_arn (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version,
+ const char * const * authors, size_t n_authors);
+
+/* Names are passed in the NULL-terminated array AUTHORS. */
+extern void version_etc_ar (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, const char * const * authors);
+
+/* Names are passed in the NULL-terminated va_list. */
+extern void version_etc_va (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, va_list authors);
+
+/* Names are passed as separate arguments, with an additional
+ NULL argument at the end. */
+extern void version_etc (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version,
+ /* const char *author1, ..., NULL */ ...)
+ ATTRIBUTE_SENTINEL;
+
+/* Display the usual `Report bugs to' stanza */
+extern void emit_bug_reporting_address (void);
+
+#endif /* VERSION_ETC_H */
diff --git a/gnulib/lib/vfprintf.c b/gnulib/lib/vfprintf.c
new file mode 100644
index 00000000..cae62e5e
--- /dev/null
+++ b/gnulib/lib/vfprintf.c
@@ -0,0 +1,74 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+#include "vasnprintf.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+vfprintf (FILE *fp, const char *format, va_list args)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/vprintf.c b/gnulib/lib/vprintf.c
new file mode 100644
index 00000000..98ec660b
--- /dev/null
+++ b/gnulib/lib/vprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to a stream.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <stdarg.h>
+
+/* Print formatted output to standard output.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+vprintf (const char *format, va_list args)
+{
+ return vfprintf (stdout, format, args);
+}
diff --git a/gnulib/lib/vsnprintf.c b/gnulib/lib/vsnprintf.c
new file mode 100644
index 00000000..fb0dbfa9
--- /dev/null
+++ b/gnulib/lib/vsnprintf.c
@@ -0,0 +1,71 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+ 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vasnprintf.h"
+
+/* Print formatted output to string STR. Similar to vsprintf, but
+ additional length SIZE limit how much is written into STR. Returns
+ string length of formatted string (which may be larger than SIZE).
+ STR may be NULL, in which case nothing will be written. On error,
+ return a negative value. */
+int
+vsnprintf (char *str, size_t size, const char *format, va_list args)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf = size;
+
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ if (size)
+ {
+ size_t pruned_len = (len < size ? len : size - 1);
+ memcpy (str, output, pruned_len);
+ str[pruned_len] = '\0';
+ }
+
+ free (output);
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/vsprintf.c b/gnulib/lib/vsprintf.c
new file mode 100644
index 00000000..df708f74
--- /dev/null
+++ b/gnulib/lib/vsprintf.c
@@ -0,0 +1,77 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2010 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "vasnprintf.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* Print formatted output to string STR.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+vsprintf (char *str, const char *format, va_list args)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf;
+
+ /* vasnprintf fails with EOVERFLOW when the buffer size argument is larger
+ than INT_MAX (if that fits into a 'size_t' at all).
+ Also note that glibc's iconv fails with E2BIG when we pass a length that
+ is so large that str + lenbuf wraps around, i.e.
+ (uintptr_t) (str + lenbuf) < (uintptr_t) str.
+ Therefore set lenbuf = min (SIZE_MAX, INT_MAX, - (uintptr_t) str - 1). */
+ lenbuf = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX);
+ if (lenbuf > ~ (uintptr_t) str)
+ lenbuf = ~ (uintptr_t) str;
+
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ /* len is near SIZE_MAX. */
+ free (output);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/w32sock.h b/gnulib/lib/w32sock.h
new file mode 100644
index 00000000..b472bd05
--- /dev/null
+++ b/gnulib/lib/w32sock.h
@@ -0,0 +1,61 @@
+/* w32sock.h --- internal auxilliary functions for Windows socket functions
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <errno.h>
+
+/* Get O_RDWR and O_BINARY. */
+#include <fcntl.h>
+
+/* Get _get_osfhandle() and _open_osfhandle(). */
+#include <io.h>
+
+#define FD_TO_SOCKET(fd) ((SOCKET) _get_osfhandle ((fd)))
+#define SOCKET_TO_FD(fh) (_open_osfhandle ((long) (fh), O_RDWR | O_BINARY))
+
+static inline void
+set_winsock_errno (void)
+{
+ int err = WSAGetLastError ();
+
+ /* Map some WSAE* errors to the runtime library's error codes. */
+ switch (err)
+ {
+ case WSA_INVALID_HANDLE:
+ errno = EBADF;
+ break;
+ case WSA_NOT_ENOUGH_MEMORY:
+ errno = ENOMEM;
+ break;
+ case WSA_INVALID_PARAMETER:
+ errno = EINVAL;
+ break;
+ case WSAEWOULDBLOCK:
+ errno = EWOULDBLOCK;
+ break;
+ case WSAENAMETOOLONG:
+ errno = ENAMETOOLONG;
+ break;
+ case WSAENOTEMPTY:
+ errno = ENOTEMPTY;
+ break;
+ default:
+ errno = (err > 10000 && err < 10025) ? err - 10000 : err;
+ break;
+ }
+}
diff --git a/gnulib/lib/w32spawn.h b/gnulib/lib/w32spawn.h
new file mode 100644
index 00000000..6c748d06
--- /dev/null
+++ b/gnulib/lib/w32spawn.h
@@ -0,0 +1,212 @@
+/* Auxiliary functions for the creation of subprocesses. Native Woe32 API.
+ Copyright (C) 2001, 2003-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+/* Get declarations of the Win32 API functions. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* Get _get_osfhandle() and _open_osfhandle(). */
+#include <io.h>
+
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "cloexec.h"
+#include "xalloc.h"
+
+/* Duplicates a file handle, making the copy uninheritable.
+ Returns -1 for a file handle that is equivalent to closed. */
+static int
+dup_noinherit (int fd)
+{
+ fd = dup_cloexec (fd);
+ if (fd < 0 && errno == EMFILE)
+ error (EXIT_FAILURE, errno, _("_open_osfhandle failed"));
+
+ return fd;
+}
+
+/* Returns a file descriptor equivalent to FD, except that the resulting file
+ descriptor is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
+ FD must be open and non-inheritable. The result will be non-inheritable as
+ well.
+ If FD < 0, FD itself is returned. */
+static int
+fd_safer_noinherit (int fd)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ /* The recursion depth is at most 3. */
+ int nfd = fd_safer_noinherit (dup_noinherit (fd));
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return nfd;
+ }
+ return fd;
+}
+
+/* Duplicates a file handle, making the copy uninheritable and ensuring the
+ result is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
+ Returns -1 for a file handle that is equivalent to closed. */
+static int
+dup_safer_noinherit (int fd)
+{
+ return fd_safer_noinherit (dup_noinherit (fd));
+}
+
+/* Undoes the effect of TEMPFD = dup_safer_noinherit (ORIGFD); */
+static void
+undup_safer_noinherit (int tempfd, int origfd)
+{
+ if (tempfd >= 0)
+ {
+ if (dup2 (tempfd, origfd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot restore fd %d: dup2 failed"),
+ origfd);
+ close (tempfd);
+ }
+ else
+ {
+ /* origfd was closed or open to no handle at all. Set it to a closed
+ state. This is (nearly) equivalent to the original state. */
+ close (origfd);
+ }
+}
+
+/* Prepares an argument vector before calling spawn().
+ Note that spawn() does not by itself call the command interpreter
+ (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+ ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&v);
+ v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+ }) ? "cmd.exe" : "command.com").
+ Instead it simply concatenates the arguments, separated by ' ', and calls
+ CreateProcess(). We must quote the arguments since Win32 CreateProcess()
+ interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+ special way:
+ - Space and tab are interpreted as delimiters. They are not treated as
+ delimiters if they are surrounded by double quotes: "...".
+ - Unescaped double quotes are removed from the input. Their only effect is
+ that within double quotes, space and tab are treated like normal
+ characters.
+ - Backslashes not followed by double quotes are not special.
+ - But 2*n+1 backslashes followed by a double quote become
+ n backslashes followed by a double quote (n >= 0):
+ \" -> "
+ \\\" -> \"
+ \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+static char **
+prepare_spawn (char **argv)
+{
+ size_t argc;
+ char **new_argv;
+ size_t i;
+
+ /* Count number of arguments. */
+ for (argc = 0; argv[argc] != NULL; argc++)
+ ;
+
+ /* Allocate new argument vector. */
+ new_argv = XNMALLOC (1 + argc + 1, char *);
+
+ /* Add an element upfront that can be used when argv[0] turns out to be a
+ script, not a program.
+ On Unix, this would be "/bin/sh". On native Windows, "sh" is actually
+ "sh.exe". We have to omit the directory part and rely on the search in
+ PATH, because the mingw "mount points" are not visible inside Win32
+ CreateProcess(). */
+ *new_argv++ = "sh.exe";
+
+ /* Put quoted arguments into the new argument vector. */
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+
+ if (string[0] == '\0')
+ new_argv[i] = xstrdup ("\"\"");
+ else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+ {
+ bool quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+ size_t length;
+ unsigned int backslashes;
+ const char *s;
+ char *quoted_string;
+ char *p;
+
+ length = 0;
+ backslashes = 0;
+ if (quote_around)
+ length++;
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ length += backslashes + 1;
+ length++;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ length += backslashes + 1;
+
+ quoted_string = (char *) xmalloc (length + 1);
+
+ p = quoted_string;
+ backslashes = 0;
+ if (quote_around)
+ *p++ = '"';
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ {
+ unsigned int j;
+ for (j = backslashes + 1; j > 0; j--)
+ *p++ = '\\';
+ }
+ *p++ = c;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ {
+ unsigned int j;
+ for (j = backslashes; j > 0; j--)
+ *p++ = '\\';
+ *p++ = '"';
+ }
+ *p = '\0';
+
+ new_argv[i] = quoted_string;
+ }
+ else
+ new_argv[i] = (char *) string;
+ }
+ new_argv[argc] = NULL;
+
+ return new_argv;
+}
diff --git a/gnulib/lib/wait-process.c b/gnulib/lib/wait-process.c
new file mode 100644
index 00000000..987b0439
--- /dev/null
+++ b/gnulib/lib/wait-process.c
@@ -0,0 +1,361 @@
+/* Waiting for a subprocess to finish.
+ Copyright (C) 2001-2003, 2005-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "wait-process.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+
+#if defined _MSC_VER || defined __MINGW32__
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* The return value of spawnvp() is really a process handle as returned
+ by CreateProcess(). Therefore we can kill it using TerminateProcess. */
+#define kill(pid,sig) TerminateProcess ((HANDLE) (pid), sig)
+
+#endif
+
+
+/* Type of an entry in the slaves array.
+ The 'used' bit determines whether this entry is currently in use.
+ (If pid_t was an atomic type like sig_atomic_t, we could just set the
+ 'child' field to 0 when unregistering a slave process, and wouldn't need
+ the 'used' field.)
+ The 'used' and 'child' fields are accessed from within the cleanup_slaves()
+ action, therefore we mark them as 'volatile'. */
+typedef struct
+{
+ volatile sig_atomic_t used;
+ volatile pid_t child;
+}
+slaves_entry_t;
+
+/* The registered slave subprocesses. */
+static slaves_entry_t static_slaves[32];
+static slaves_entry_t * volatile slaves = static_slaves;
+static sig_atomic_t volatile slaves_count = 0;
+static size_t slaves_allocated = SIZEOF (static_slaves);
+
+/* The termination signal for slave subprocesses.
+ 2003-10-07: Terminator becomes Governator. */
+#ifdef SIGHUP
+# define TERMINATOR SIGHUP
+#else
+# define TERMINATOR SIGTERM
+#endif
+
+/* The cleanup action. It gets called asynchronously. */
+static void
+cleanup_slaves (void)
+{
+ for (;;)
+ {
+ /* Get the last registered slave. */
+ size_t n = slaves_count;
+ if (n == 0)
+ break;
+ n--;
+ slaves_count = n;
+ /* Skip unused entries in the slaves array. */
+ if (slaves[n].used)
+ {
+ pid_t slave = slaves[n].child;
+
+ /* Kill the slave. */
+ kill (slave, TERMINATOR);
+ }
+ }
+}
+
+/* Register a subprocess as being a slave process. This means that the
+ subprocess will be terminated when its creator receives a catchable fatal
+ signal or exits normally. Registration ends when wait_subprocess()
+ notices that the subprocess has exited. */
+void
+register_slave_subprocess (pid_t child)
+{
+ static bool cleanup_slaves_registered = false;
+ if (!cleanup_slaves_registered)
+ {
+ atexit (cleanup_slaves);
+ at_fatal_signal (cleanup_slaves);
+ cleanup_slaves_registered = true;
+ }
+
+ /* Try to store the new slave in an unused entry of the slaves array. */
+ {
+ slaves_entry_t *s = slaves;
+ slaves_entry_t *s_end = s + slaves_count;
+
+ for (; s < s_end; s++)
+ if (!s->used)
+ {
+ /* The two uses of 'volatile' in the slaves_entry_t type above
+ (and ISO C 99 section 5.1.2.3.(5)) ensure that we mark the
+ entry as used only after the child pid has been written to the
+ memory location s->child. */
+ s->child = child;
+ s->used = 1;
+ return;
+ }
+ }
+
+ if (slaves_count == slaves_allocated)
+ {
+ /* Extend the slaves array. Note that we cannot use xrealloc(),
+ because then the cleanup_slaves() function could access an already
+ deallocated array. */
+ slaves_entry_t *old_slaves = slaves;
+ size_t new_slaves_allocated = 2 * slaves_allocated;
+ slaves_entry_t *new_slaves =
+ (slaves_entry_t *)
+ malloc (new_slaves_allocated * sizeof (slaves_entry_t));
+ if (new_slaves == NULL)
+ {
+ /* xalloc_die() will call exit() which will invoke cleanup_slaves().
+ Additionally we need to kill child, because it's not yet among
+ the slaves list. */
+ kill (child, TERMINATOR);
+ xalloc_die ();
+ }
+ memcpy (new_slaves, old_slaves,
+ slaves_allocated * sizeof (slaves_entry_t));
+ slaves = new_slaves;
+ slaves_allocated = new_slaves_allocated;
+ /* Now we can free the old slaves array. */
+ if (old_slaves != static_slaves)
+ free (old_slaves);
+ }
+ /* The three uses of 'volatile' in the types above (and ISO C 99 section
+ 5.1.2.3.(5)) ensure that we increment the slaves_count only after the
+ new slave and its 'used' bit have been written to the memory locations
+ that make up slaves[slaves_count]. */
+ slaves[slaves_count].child = child;
+ slaves[slaves_count].used = 1;
+ slaves_count++;
+}
+
+/* Unregister a child from the list of slave subprocesses. */
+static inline void
+unregister_slave_subprocess (pid_t child)
+{
+ /* The easiest way to remove an entry from a list that can be used by
+ an asynchronous signal handler is just to mark it as unused. For this,
+ we rely on sig_atomic_t. */
+ slaves_entry_t *s = slaves;
+ slaves_entry_t *s_end = s + slaves_count;
+
+ for (; s < s_end; s++)
+ if (s->used && s->child == child)
+ s->used = 0;
+}
+
+
+/* Wait for a subprocess to finish. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127. */
+int
+wait_subprocess (pid_t child, const char *progname,
+ bool ignore_sigpipe, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp)
+{
+#if HAVE_WAITID && defined WNOWAIT && 0
+ /* Commented out because waitid() without WEXITED and with WNOWAIT doesn't
+ work: On Solaris 7 and OSF/1 4.0, it returns -1 and sets errno = ECHILD,
+ and on HP-UX 10.20 it just hangs. */
+ /* Use of waitid() with WNOWAIT avoids a race condition: If slave_process is
+ true, and this process sleeps a very long time between the return from
+ waitpid() and the execution of unregister_slave_subprocess(), and
+ meanwhile another process acquires the same PID as child, and then - still
+ before unregister_slave_subprocess() - this process gets a fatal signal,
+ it would kill the other totally unrelated process. */
+ siginfo_t info;
+
+ if (termsigp != NULL)
+ *termsigp = 0;
+ for (;;)
+ {
+ if (waitid (P_PID, child, &info, WEXITED | (slave_process ? WNOWAIT : 0))
+ < 0)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+
+ /* info.si_code is set to one of CLD_EXITED, CLD_KILLED, CLD_DUMPED,
+ CLD_TRAPPED, CLD_STOPPED, CLD_CONTINUED. Loop until the program
+ terminates. */
+ if (info.si_code == CLD_EXITED
+ || info.si_code == CLD_KILLED || info.si_code == CLD_DUMPED)
+ break;
+ }
+
+ /* The child process has exited or was signalled. */
+
+ if (slave_process)
+ {
+ /* Unregister the child from the list of slave subprocesses, so that
+ later, when we exit, we don't kill a totally unrelated process which
+ may have acquired the same pid. */
+ unregister_slave_subprocess (child);
+
+ /* Now remove the zombie from the process list. */
+ for (;;)
+ {
+ if (waitid (P_PID, child, &info, WEXITED) < 0)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+ break;
+ }
+ }
+
+ switch (info.si_code)
+ {
+ case CLD_KILLED:
+ case CLD_DUMPED:
+ if (termsigp != NULL)
+ *termsigp = info.si_status; /* TODO: or info.si_signo? */
+# ifdef SIGPIPE
+ if (info.si_status == SIGPIPE && ignore_sigpipe)
+ return 0;
+# endif
+ if (exit_on_error || (!null_stderr && termsigp == NULL))
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess got fatal signal %d"),
+ progname, info.si_status);
+ return 127;
+ case CLD_EXITED:
+ if (info.si_status == 127)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+ return info.si_status;
+ default:
+ abort ();
+ }
+#else
+ /* waitpid() is just as portable as wait() nowadays. */
+ int status;
+
+ if (termsigp != NULL)
+ *termsigp = 0;
+ status = 0;
+ for (;;)
+ {
+ int result = waitpid (child, &status, 0);
+
+ if (result != child)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+# if 0 /* defined ECHILD */
+ if (errno == ECHILD)
+ {
+ /* Child process nonexistent?! Assume it terminated
+ successfully. */
+ status = 0;
+ break;
+ }
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+
+ /* One of WIFSIGNALED (status), WIFEXITED (status), WIFSTOPPED (status)
+ must always be true, since we did not specify WCONTINUED in the
+ waitpid() call. Loop until the program terminates. */
+ if (!WIFSTOPPED (status))
+ break;
+ }
+
+ /* The child process has exited or was signalled. */
+
+ if (slave_process)
+ /* Unregister the child from the list of slave subprocesses, so that
+ later, when we exit, we don't kill a totally unrelated process which
+ may have acquired the same pid. */
+ unregister_slave_subprocess (child);
+
+ if (WIFSIGNALED (status))
+ {
+ if (termsigp != NULL)
+ *termsigp = WTERMSIG (status);
+# ifdef SIGPIPE
+ if (WTERMSIG (status) == SIGPIPE && ignore_sigpipe)
+ return 0;
+# endif
+ if (exit_on_error || (!null_stderr && termsigp == NULL))
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess got fatal signal %d"),
+ progname, (int) WTERMSIG (status));
+ return 127;
+ }
+ if (!WIFEXITED (status))
+ abort ();
+ if (WEXITSTATUS (status) == 127)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+ return WEXITSTATUS (status);
+#endif
+}
diff --git a/gnulib/lib/wait-process.h b/gnulib/lib/wait-process.h
new file mode 100644
index 00000000..56984585
--- /dev/null
+++ b/gnulib/lib/wait-process.h
@@ -0,0 +1,74 @@
+/* Waiting for a subprocess to finish.
+ Copyright (C) 2001-2003, 2006, 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#ifndef _WAIT_PROCESS_H
+#define _WAIT_PROCESS_H
+
+/* Get pid_t. */
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Wait for a subprocess to finish. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127.
+ Arguments:
+ - child is the pid of the subprocess.
+ - progname is the name of the program executed by the subprocess, used for
+ error messages.
+ - If ignore_sigpipe is true, consider a subprocess termination due to
+ SIGPIPE as equivalent to a success. This is suitable for processes whose
+ only purpose is to write to standard output. This flag can be safely set
+ to false when the process' standard output is known to go to DEV_NULL.
+ - If null_stderr is true, the usual error message to stderr will be omitted.
+ This is suitable when the subprocess does not fulfill an important task.
+ - slave_process should be set to true if the process has been launched as a
+ slave process.
+ - If exit_on_error is true, any error will cause the main process to exit
+ with an error status.
+ - If termsigp is not NULL: *termsig will be set to the signal that
+ terminated the subprocess (if supported by the platform: not on native
+ Windows platforms), otherwise 0, and the error message about the signal
+ that terminated the subprocess will be omitted.
+ Prerequisites: The signal handler for SIGCHLD should not be set to SIG_IGN,
+ otherwise this function will not work. */
+extern int wait_subprocess (pid_t child, const char *progname,
+ bool ignore_sigpipe, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp);
+
+/* Register a subprocess as being a slave process. This means that the
+ subprocess will be terminated when its creator receives a catchable fatal
+ signal or exits normally. Registration ends when wait_subprocess()
+ notices that the subprocess has exited. */
+extern void register_slave_subprocess (pid_t child);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _WAIT_PROCESS_H */
diff --git a/gnulib/lib/wchar.in.h b/gnulib/lib/wchar.in.h
new file mode 100644
index 00000000..dd1e0265
--- /dev/null
+++ b/gnulib/lib/wchar.in.h
@@ -0,0 +1,319 @@
+/* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
+
+ Copyright (C) 2007-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake. */
+
+/*
+ * ISO C 99 <wchar.h> for platforms that have issues.
+ * <http://www.opengroup.org/susv3xbd/wchar.h.html>
+ *
+ * For now, this just ensures proper prerequisite inclusion order and
+ * the declaration of wcwidth().
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if defined __need_mbstate_t || defined __need_wint_t || (defined __hpux && ((defined _INTTYPES_INCLUDED && !defined strtoimax) || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) || defined _GL_ALREADY_INCLUDING_WCHAR_H
+/* Special invocation convention:
+ - Inside glibc and uClibc header files.
+ - On HP-UX 11.00 we have a sequence of nested includes
+ <wchar.h> -> <stdlib.h> -> <stdint.h>, and the latter includes <wchar.h>,
+ once indirectly <stdint.h> -> <sys/types.h> -> <inttypes.h> -> <wchar.h>
+ and once directly. In both situations 'wint_t' is not yet defined,
+ therefore we cannot provide the function overrides; instead include only
+ the system's <wchar.h>.
+ - On IRIX 6.5, similarly, we have an include <wchar.h> -> <wctype.h>, and
+ the latter includes <wchar.h>. But here, we have no way to detect whether
+ <wctype.h> is completely included or is still being included. */
+
+#@INCLUDE_NEXT@ @NEXT_WCHAR_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _GL_WCHAR_H
+
+#define _GL_ALREADY_INCLUDING_WCHAR_H
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stddef.h>
+# include <stdio.h>
+# include <time.h>
+#endif
+
+/* Include the original <wchar.h> if it exists.
+ Some builds of uClibc lack it. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_WCHAR_H@
+# @INCLUDE_NEXT@ @NEXT_WCHAR_H@
+#endif
+
+#undef _GL_ALREADY_INCLUDING_WCHAR_H
+
+#ifndef _GL_WCHAR_H
+#define _GL_WCHAR_H
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Define wint_t. (Also done in wctype.in.h.) */
+#if !@HAVE_WINT_T@ && !defined wint_t
+# define wint_t int
+# ifndef WEOF
+# define WEOF -1
+# endif
+#endif
+
+
+/* Override mbstate_t if it is too small.
+ On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
+ implementing mbrtowc for encodings like UTF-8. */
+#if !(@HAVE_MBSINIT@ && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@
+typedef int rpl_mbstate_t;
+# undef mbstate_t
+# define mbstate_t rpl_mbstate_t
+# define GNULIB_defined_mbstate_t 1
+#endif
+
+
+/* Convert a single-byte character to a wide character. */
+#if @GNULIB_BTOWC@
+# if @REPLACE_BTOWC@
+# undef btowc
+# define btowc rpl_btowc
+# endif
+# if !@HAVE_BTOWC@ || @REPLACE_BTOWC@
+extern wint_t btowc (int c);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef btowc
+# if HAVE_RAW_DECL_BTOWC
+_GL_WARN_ON_USE (btowc, "btowc is unportable - "
+ "use gnulib module btowc for portability");
+# endif
+#endif
+
+
+/* Convert a wide character to a single-byte character. */
+#if @GNULIB_WCTOB@
+# if @REPLACE_WCTOB@
+# undef wctob
+# define wctob rpl_wctob
+# endif
+# if (!defined wctob && !@HAVE_DECL_WCTOB@) || @REPLACE_WCTOB@
+/* wctob is provided by gnulib, or wctob exists but is not declared. */
+extern int wctob (wint_t wc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wctob
+# if HAVE_RAW_DECL_WCTOB
+_GL_WARN_ON_USE (wctob, "wctob is unportable - "
+ "use gnulib module wctob for portability");
+# endif
+#endif
+
+
+/* Test whether *PS is in the initial state. */
+#if @GNULIB_MBSINIT@
+# if @REPLACE_MBSINIT@
+# undef mbsinit
+# define mbsinit rpl_mbsinit
+# endif
+# if !@HAVE_MBSINIT@ || @REPLACE_MBSINIT@
+extern int mbsinit (const mbstate_t *ps);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbsinit
+# if HAVE_RAW_DECL_MBSINIT
+_GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - "
+ "use gnulib module mbsinit for portability");
+# endif
+#endif
+
+
+/* Convert a multibyte character to a wide character. */
+#if @GNULIB_MBRTOWC@
+# if @REPLACE_MBRTOWC@
+# undef mbrtowc
+# define mbrtowc rpl_mbrtowc
+# endif
+# if !@HAVE_MBRTOWC@ || @REPLACE_MBRTOWC@
+extern size_t mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbrtowc
+# if HAVE_RAW_DECL_MBRTOWC
+_GL_WARN_ON_USE (mbrtowc, "mbrtowc is unportable - "
+ "use gnulib module mbrtowc for portability");
+# endif
+#endif
+
+
+/* Recognize a multibyte character. */
+#if @GNULIB_MBRLEN@
+# if @REPLACE_MBRLEN@
+# undef mbrlen
+# define mbrlen rpl_mbrlen
+# endif
+# if !@HAVE_MBRLEN@ || @REPLACE_MBRLEN@
+extern size_t mbrlen (const char *s, size_t n, mbstate_t *ps);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbrlen
+# if HAVE_RAW_DECL_MBRLEN
+_GL_WARN_ON_USE (mbrlen, "mbrlen is unportable - "
+ "use gnulib module mbrlen for portability");
+# endif
+#endif
+
+
+/* Convert a string to a wide string. */
+#if @GNULIB_MBSRTOWCS@
+# if @REPLACE_MBSRTOWCS@
+# undef mbsrtowcs
+# define mbsrtowcs rpl_mbsrtowcs
+# endif
+# if !@HAVE_MBSRTOWCS@ || @REPLACE_MBSRTOWCS@
+extern size_t mbsrtowcs (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbsrtowcs
+# if HAVE_RAW_DECL_MBSRTOWCS
+_GL_WARN_ON_USE (mbsrtowcs, "mbsrtowcs is unportable - "
+ "use gnulib module mbsrtowcs for portability");
+# endif
+#endif
+
+
+/* Convert a string to a wide string. */
+#if @GNULIB_MBSNRTOWCS@
+# if @REPLACE_MBSNRTOWCS@
+# undef mbsnrtowcs
+# define mbsnrtowcs rpl_mbsnrtowcs
+# endif
+# if !@HAVE_MBSNRTOWCS@ || @REPLACE_MBSNRTOWCS@
+extern size_t mbsnrtowcs (wchar_t *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbsnrtowcs
+# if HAVE_RAW_DECL_MBSNRTOWCS
+_GL_WARN_ON_USE (mbsnrtowcs, "mbsnrtowcs is unportable - "
+ "use gnulib module mbsnrtowcs for portability");
+# endif
+#endif
+
+
+/* Convert a wide character to a multibyte character. */
+#if @GNULIB_WCRTOMB@
+# if @REPLACE_WCRTOMB@
+# undef wcrtomb
+# define wcrtomb rpl_wcrtomb
+# endif
+# if !@HAVE_WCRTOMB@ || @REPLACE_WCRTOMB@
+extern size_t wcrtomb (char *s, wchar_t wc, mbstate_t *ps);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcrtomb
+# if HAVE_RAW_DECL_WCRTOMB
+_GL_WARN_ON_USE (wcrtomb, "wcrtomb is unportable - "
+ "use gnulib module wcrtomb for portability");
+# endif
+#endif
+
+
+/* Convert a wide string to a string. */
+#if @GNULIB_WCSRTOMBS@
+# if @REPLACE_WCSRTOMBS@
+# undef wcsrtombs
+# define wcsrtombs rpl_wcsrtombs
+# endif
+# if !@HAVE_WCSRTOMBS@ || @REPLACE_WCSRTOMBS@
+extern size_t wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsrtombs
+# if HAVE_RAW_DECL_WCSRTOMBS
+_GL_WARN_ON_USE (wcsrtombs, "wcsrtombs is unportable - "
+ "use gnulib module wcsrtombs for portability");
+# endif
+#endif
+
+
+/* Convert a wide string to a string. */
+#if @GNULIB_WCSNRTOMBS@
+# if @REPLACE_WCSNRTOMBS@
+# undef wcsnrtombs
+# define wcsnrtombs rpl_wcsnrtombs
+# endif
+# if !@HAVE_WCSNRTOMBS@ || @REPLACE_WCSNRTOMBS@
+extern size_t wcsnrtombs (char *dest, const wchar_t **srcp, size_t srclen, size_t len, mbstate_t *ps)
+ _GL_ARG_NONNULL ((2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsnrtombs
+# if HAVE_RAW_DECL_WCSNRTOMBS
+_GL_WARN_ON_USE (wcsnrtombs, "wcsnrtombs is unportable - "
+ "use gnulib module wcsnrtombs for portability");
+# endif
+#endif
+
+
+/* Return the number of screen columns needed for WC. */
+#if @GNULIB_WCWIDTH@
+# if @REPLACE_WCWIDTH@
+# undef wcwidth
+# define wcwidth rpl_wcwidth
+extern int wcwidth (wchar_t);
+# else
+# if !defined wcwidth && !@HAVE_DECL_WCWIDTH@
+/* wcwidth exists but is not declared. */
+extern int wcwidth (int /* actually wchar_t */);
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcwidth
+# if HAVE_RAW_DECL_WCWIDTH
+_GL_WARN_ON_USE (wcwidth, "wcwidth is unportable - "
+ "use gnulib module wcwidth for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_WCHAR_H */
+#endif /* _GL_WCHAR_H */
+#endif
diff --git a/gnulib/lib/wcrtomb.c b/gnulib/lib/wcrtomb.c
new file mode 100644
index 00000000..e7345f69
--- /dev/null
+++ b/gnulib/lib/wcrtomb.c
@@ -0,0 +1,53 @@
+/* Convert wide character to multibyte character.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <stdlib.h>
+
+
+size_t
+wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
+{
+ /* This implementation of wcrtomb on top of wctomb() supports only
+ stateless encodings. ps must be in the initial state. */
+ if (ps != NULL && !mbsinit (ps))
+ {
+ errno = EINVAL;
+ return (size_t)(-1);
+ }
+
+ if (s == NULL)
+ /* We know the NUL wide character corresponds to the NUL character. */
+ return 1;
+ else
+ {
+ int ret = wctomb (s, wc);
+
+ if (ret >= 0)
+ return ret;
+ else
+ {
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+ }
+}
diff --git a/gnulib/lib/wcsnrtombs.c b/gnulib/lib/wcsnrtombs.c
new file mode 100644
index 00000000..c8f0b921
--- /dev/null
+++ b/gnulib/lib/wcsnrtombs.c
@@ -0,0 +1,102 @@
+/* Convert wide string to string.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+extern mbstate_t _gl_wcsrtombs_state;
+
+size_t
+wcsnrtombs (char *dest, const wchar_t **srcp, size_t srclen, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_wcsrtombs_state;
+ {
+ const wchar_t *src = *srcp;
+ size_t cur_max = MB_CUR_MAX;
+ char buf[64];
+
+ if (!(cur_max <= sizeof (buf)))
+ abort ();
+
+ if (dest != NULL)
+ {
+ char *destptr = dest;
+
+ for (; srclen > 0 && len > 0; src++, srclen--)
+ {
+ wchar_t wc = *src;
+ size_t ret = wcrtomb (len >= cur_max ? destptr : buf, wc, ps);
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (!(ret <= cur_max))
+ abort ();
+ if (len < ret)
+ break;
+ if (len < cur_max)
+ memcpy (destptr, buf, ret);
+ if (wc == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ destptr += ret;
+ len -= ret;
+ }
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (; srclen > 0; src++, srclen--)
+ {
+ wchar_t wc = *src;
+ size_t ret = wcrtomb (buf, wc, &state);
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (wc == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ totalcount += ret;
+ }
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
diff --git a/gnulib/lib/wcsrtombs-state.c b/gnulib/lib/wcsrtombs-state.c
new file mode 100644
index 00000000..ae6f62f3
--- /dev/null
+++ b/gnulib/lib/wcsrtombs-state.c
@@ -0,0 +1,37 @@
+/* Convert wide string to string.
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+/* Internal state used by the functions wcsrtombs() and wcsnrtombs(). */
+mbstate_t _gl_wcsrtombs_state
+/* The state must initially be in the "initial state"; so, zero-initialize it.
+ On most systems, putting it into BSS is sufficient. Not so on MacOS X 10.3,
+ see <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>.
+ When it needs an initializer, use 0 or {0} as initializer? 0 only works
+ when mbstate_t is a scalar type (such as when gnulib defines it, or on
+ AIX, IRIX, mingw). {0} works as an initializer in all cases: for a struct
+ or union type, but also for a scalar type (ISO C 99, 6.7.8.(11)). */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ /* Use braces, to be on the safe side. */
+ = { 0 }
+#endif
+ ;
diff --git a/gnulib/lib/wcsrtombs.c b/gnulib/lib/wcsrtombs.c
new file mode 100644
index 00000000..e995a9ce
--- /dev/null
+++ b/gnulib/lib/wcsrtombs.c
@@ -0,0 +1,128 @@
+/* Convert wide string to string.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+extern mbstate_t _gl_wcsrtombs_state;
+
+#if HAVE_WCSRTOMBS && !WCSRTOMBS_TERMINATION_BUG
+/* Override the system's wcsrtombs() function. */
+
+# undef wcsrtombs
+
+size_t
+rpl_wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_wcsrtombs_state;
+# if WCSRTOMBS_NULL_ARG_BUG
+ if (dest == NULL)
+ {
+ const wchar_t *temp_src = *srcp;
+
+ return wcsrtombs (NULL, &temp_src, len, ps);
+ }
+ else
+# endif
+ return wcsrtombs (dest, srcp, len, ps);
+}
+
+#else
+/* Implement wcsrtombs on top of wcrtomb(). */
+
+# include <errno.h>
+# include <stdlib.h>
+# include <string.h>
+
+size_t
+wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_wcsrtombs_state;
+ {
+ const wchar_t *src = *srcp;
+ size_t cur_max = MB_CUR_MAX;
+ char buf[64];
+
+ if (!(cur_max <= sizeof (buf)))
+ abort ();
+
+ if (dest != NULL)
+ {
+ char *destptr = dest;
+
+ for (; len > 0; src++)
+ {
+ wchar_t wc = *src;
+ size_t ret = wcrtomb (len >= cur_max ? destptr : buf, wc, ps);
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (!(ret <= cur_max))
+ abort ();
+ if (len < ret)
+ break;
+ if (len < cur_max)
+ memcpy (destptr, buf, ret);
+ if (wc == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ destptr += ret;
+ len -= ret;
+ }
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (;; src++)
+ {
+ wchar_t wc = *src;
+ size_t ret = wcrtomb (buf, wc, &state);
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (wc == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ totalcount += ret;
+ }
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
+
+#endif
diff --git a/gnulib/lib/wctob.c b/gnulib/lib/wctob.c
new file mode 100644
index 00000000..1d1cc7b1
--- /dev/null
+++ b/gnulib/lib/wctob.c
@@ -0,0 +1,37 @@
+/* Convert wide character to unibyte character.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+wctob (wint_t wc)
+{
+ char buf[64];
+
+ if (!(MB_CUR_MAX <= sizeof (buf)))
+ abort ();
+ if (wctomb (buf, wc) == 1)
+ return (unsigned char) buf[0];
+ else
+ return EOF;
+}
diff --git a/gnulib/lib/wctype.in.h b/gnulib/lib/wctype.in.h
new file mode 100644
index 00000000..a7348787
--- /dev/null
+++ b/gnulib/lib/wctype.in.h
@@ -0,0 +1,239 @@
+/* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
+
+ Copyright (C) 2006-2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible and Paul Eggert. */
+
+/*
+ * ISO C 99 <wctype.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/wctype.h.html>
+ *
+ * iswctype, towctrans, towlower, towupper, wctrans, wctype,
+ * wctrans_t, and wctype_t are not yet implemented.
+ */
+
+#ifndef _GL_WCTYPE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+
+#if @HAVE_WINT_T@
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
+ Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+# include <stddef.h>
+# include <stdio.h>
+# include <time.h>
+# include <wchar.h>
+#endif
+
+/* Include the original <wctype.h> if it exists.
+ BeOS 5 has the functions but no <wctype.h>. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_WCTYPE_H@
+# @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
+#endif
+
+#ifndef _GL_WCTYPE_H
+#define _GL_WCTYPE_H
+
+/* Define wint_t. (Also done in wchar.in.h.) */
+#if !@HAVE_WINT_T@ && !defined wint_t
+# define wint_t int
+# ifndef WEOF
+# define WEOF -1
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
+ Linux libc5 has <wctype.h> and the functions but they are broken.
+ Assume all 12 functions are implemented the same way, or not at all. */
+#if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
+
+/* IRIX 5.3 has macros but no functions, its isw* macros refer to an
+ undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
+ refer to system functions like _iswctype that are not in the
+ standard C library. Rather than try to get ancient buggy
+ implementations like this to work, just disable them. */
+# undef iswalnum
+# undef iswalpha
+# undef iswblank
+# undef iswcntrl
+# undef iswdigit
+# undef iswgraph
+# undef iswlower
+# undef iswprint
+# undef iswpunct
+# undef iswspace
+# undef iswupper
+# undef iswxdigit
+# undef towlower
+# undef towupper
+
+/* Linux libc5 has <wctype.h> and the functions but they are broken. */
+# if @REPLACE_ISWCNTRL@
+# define iswalnum rpl_iswalnum
+# define iswalpha rpl_iswalpha
+# define iswblank rpl_iswblank
+# define iswcntrl rpl_iswcntrl
+# define iswdigit rpl_iswdigit
+# define iswgraph rpl_iswgraph
+# define iswlower rpl_iswlower
+# define iswprint rpl_iswprint
+# define iswpunct rpl_iswpunct
+# define iswspace rpl_iswspace
+# define iswupper rpl_iswupper
+# define iswxdigit rpl_iswxdigit
+# define towlower rpl_towlower
+# define towupper rpl_towupper
+# endif
+
+static inline int
+iswalnum (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
+}
+
+static inline int
+iswalpha (wint_t wc)
+{
+ return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
+}
+
+static inline int
+iswblank (wint_t wc)
+{
+ return wc == ' ' || wc == '\t';
+}
+
+static inline int
+iswcntrl (wint_t wc)
+{
+ return (wc & ~0x1f) == 0 || wc == 0x7f;
+}
+
+static inline int
+iswdigit (wint_t wc)
+{
+ return wc >= '0' && wc <= '9';
+}
+
+static inline int
+iswgraph (wint_t wc)
+{
+ return wc >= '!' && wc <= '~';
+}
+
+static inline int
+iswlower (wint_t wc)
+{
+ return wc >= 'a' && wc <= 'z';
+}
+
+static inline int
+iswprint (wint_t wc)
+{
+ return wc >= ' ' && wc <= '~';
+}
+
+static inline int
+iswpunct (wint_t wc)
+{
+ return (wc >= '!' && wc <= '~'
+ && !((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
+}
+
+static inline int
+iswspace (wint_t wc)
+{
+ return (wc == ' ' || wc == '\t'
+ || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
+}
+
+static inline int
+iswupper (wint_t wc)
+{
+ return wc >= 'A' && wc <= 'Z';
+}
+
+static inline int
+iswxdigit (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
+}
+
+static inline wint_t
+towlower (wint_t wc)
+{
+ return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
+}
+
+static inline wint_t
+towupper (wint_t wc)
+{
+ return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
+}
+
+#endif /* ! HAVE_ISWCNTRL || REPLACE_ISWCNTRL */
+
+#if defined __MINGW32__
+
+/* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
+ The functions towlower and towupper are implemented in the MSVCRT library
+ to take a wchar_t argument and return a wchar_t result. mingw declares
+ these functions to take a wint_t argument and return a wint_t result.
+ This means that:
+ 1. When the user passes an argument outside the range 0x0000..0xFFFF, the
+ function will look only at the lower 16 bits. This is allowed according
+ to POSIX.
+ 2. The return value is returned in the lower 16 bits of the result register.
+ The upper 16 bits are random: whatever happened to be in that part of the
+ result register. We need to fix this by adding a zero-extend from
+ wchar_t to wint_t after the call. */
+
+static inline wint_t
+rpl_towlower (wint_t wc)
+{
+ return (wint_t) (wchar_t) towlower (wc);
+}
+# define towlower rpl_towlower
+
+static inline wint_t
+rpl_towupper (wint_t wc)
+{
+ return (wint_t) (wchar_t) towupper (wc);
+}
+# define towupper rpl_towupper
+
+#endif /* __MINGW32__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_WCTYPE_H */
+#endif /* _GL_WCTYPE_H */
diff --git a/gnulib/lib/wcwidth.c b/gnulib/lib/wcwidth.c
new file mode 100644
index 00000000..7341b66c
--- /dev/null
+++ b/gnulib/lib/wcwidth.c
@@ -0,0 +1,51 @@
+/* Determine the number of screen columns needed for a character.
+ Copyright (C) 2006, 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+/* Get iswprint. */
+#include <wctype.h>
+
+#include "localcharset.h"
+#include "streq.h"
+#include "uniwidth.h"
+
+#undef wcwidth
+
+int
+rpl_wcwidth (wchar_t wc)
+{
+ /* In UTF-8 locales, use a Unicode aware width function. */
+ const char *encoding = locale_charset ();
+ if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0 ,0))
+ {
+ /* We assume that in a UTF-8 locale, a wide character is the same as a
+ Unicode character. */
+ return uc_width (wc, encoding);
+ }
+ else
+ {
+ /* Otherwise, fall back to the system's wcwidth function. */
+#if HAVE_WCWIDTH
+ return wcwidth (wc);
+#else
+ return wc == 0 ? 0 : iswprint (wc) ? 1 : -1;
+#endif
+ }
+}
diff --git a/gnulib/lib/write-any-file.c b/gnulib/lib/write-any-file.c
new file mode 100644
index 00000000..2a26b2fa
--- /dev/null
+++ b/gnulib/lib/write-any-file.c
@@ -0,0 +1,50 @@
+/* Determine whether we can write any file.
+
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "write-any-file.h"
+#include "priv-set.h"
+
+#include <unistd.h>
+
+/* Return true if we know that we can write any file, including
+ writing directories. */
+
+bool
+can_write_any_file (void)
+{
+ static bool initialized;
+ static bool can_write;
+
+ if (! initialized)
+ {
+ bool can = false;
+#if defined PRIV_FILE_DAC_WRITE
+ can = (priv_set_ismember (PRIV_FILE_DAC_WRITE) == 1);
+#else
+ /* In traditional Unix, only root can unlink directories. */
+ can = (geteuid () == 0);
+#endif
+ can_write = can;
+ initialized = true;
+ }
+
+ return can_write;
+}
diff --git a/gnulib/lib/write-any-file.h b/gnulib/lib/write-any-file.h
new file mode 100644
index 00000000..3930d4dc
--- /dev/null
+++ b/gnulib/lib/write-any-file.h
@@ -0,0 +1,2 @@
+#include <stdbool.h>
+bool can_write_any_file (void);
diff --git a/gnulib/lib/write.c b/gnulib/lib/write.c
new file mode 100644
index 00000000..3a98f24f
--- /dev/null
+++ b/gnulib/lib/write.c
@@ -0,0 +1,62 @@
+/* POSIX compatible write() function.
+ Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+/* Replace this function only if module 'sigpipe' is requested. */
+#if GNULIB_SIGPIPE
+
+/* On native Windows platforms, SIGPIPE does not exist. When write() is
+ called on a pipe with no readers, WriteFile() fails with error
+ GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
+ error EINVAL. */
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <signal.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+ssize_t
+rpl_write (int fd, const void *buf, size_t count)
+#undef write
+{
+ ssize_t ret = write (fd, buf, count);
+
+ if (ret < 0)
+ {
+ if (GetLastError () == ERROR_NO_DATA
+ && GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_PIPE)
+ {
+ /* Try to raise signal SIGPIPE. */
+ raise (SIGPIPE);
+ /* If it is currently blocked or ignored, change errno from EINVAL
+ to EPIPE. */
+ errno = EPIPE;
+ }
+ }
+ return ret;
+}
+
+# endif
+#endif
diff --git a/gnulib/lib/xalloc-die.c b/gnulib/lib/xalloc-die.c
new file mode 100644
index 00000000..4b220403
--- /dev/null
+++ b/gnulib/lib/xalloc-die.c
@@ -0,0 +1,41 @@
+/* Report a memory allocation failure and exit.
+
+ Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006, 2009, 2010
+ 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/>. */
+
+#include <config.h>
+
+#include "xalloc.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+xalloc_die (void)
+{
+ error (exit_failure, 0, "%s", _("memory exhausted"));
+
+ /* The `noreturn' cannot be given to error, since it may return if
+ its first argument is 0. To help compilers understand the
+ xalloc_die does not return, call abort. Also, the abort is a
+ safety feature if exit_failure is 0 (which shouldn't happen). */
+ abort ();
+}
diff --git a/gnulib/lib/xalloc.h b/gnulib/lib/xalloc.h
new file mode 100644
index 00000000..6122cc58
--- /dev/null
+++ b/gnulib/lib/xalloc.h
@@ -0,0 +1,281 @@
+/* xalloc.h -- malloc with out-of-memory checking
+
+ Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2003, 2004, 2006, 2007, 2008, 2009, 2010 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/>. */
+
+#ifndef XALLOC_H_
+# define XALLOC_H_
+
+# include <stddef.h>
+
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+# ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+# define __attribute__(x)
+# endif
+# endif
+
+# ifndef ATTRIBUTE_NORETURN
+# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+# endif
+
+# ifndef ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3
+# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+# define ATTRIBUTE_MALLOC
+# endif
+# endif
+
+/* This function is always triggered when memory is exhausted.
+ It must be defined by the application, either explicitly
+ or by using gnulib's xalloc-die module. This is the
+ function to call when one wants the program to die because of a
+ memory allocation failure. */
+extern void xalloc_die (void) ATTRIBUTE_NORETURN;
+
+void *xmalloc (size_t s) ATTRIBUTE_MALLOC;
+void *xzalloc (size_t s) ATTRIBUTE_MALLOC;
+void *xcalloc (size_t n, size_t s) ATTRIBUTE_MALLOC;
+void *xrealloc (void *p, size_t s);
+void *x2realloc (void *p, size_t *pn);
+void *xmemdup (void const *p, size_t s) ATTRIBUTE_MALLOC;
+char *xstrdup (char const *str) ATTRIBUTE_MALLOC;
+
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+ to size arithmetic overflow. S must be positive and N must be
+ nonnegative. This is a macro, not an inline function, so that it
+ works correctly even when SIZE_MAX < N.
+
+ By gnulib convention, SIZE_MAX represents overflow in size
+ calculations, so the conservative dividend to use here is
+ SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
+ However, malloc (SIZE_MAX) fails on all known hosts where
+ sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
+ exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+ branch when S is known to be 1. */
+# define xalloc_oversized(n, s) \
+ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+
+
+/* In the following macros, T must be an elementary or structure/union or
+ typedef'ed type, or a pointer to such a type. To apply one of the
+ following macros to a function pointer or array type, you need to typedef
+ it first and use the typedef name. */
+
+/* Allocate an object of type T dynamically, with error checking. */
+/* extern t *XMALLOC (typename t); */
+# define XMALLOC(t) ((t *) xmalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking. */
+/* extern t *XNMALLOC (size_t n, typename t); */
+# define XNMALLOC(n, t) \
+ ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t))))
+
+/* Allocate an object of type T dynamically, with error checking,
+ and zero it. */
+/* extern t *XZALLOC (typename t); */
+# define XZALLOC(t) ((t *) xzalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking,
+ and zero it. */
+/* extern t *XCALLOC (size_t n, typename t); */
+# define XCALLOC(n, t) \
+ ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
+
+
+# if HAVE_INLINE
+# define static_inline static inline
+# else
+void *xnmalloc (size_t n, size_t s) ATTRIBUTE_MALLOC;
+void *xnrealloc (void *p, size_t n, size_t s);
+void *x2nrealloc (void *p, size_t *pn, size_t s);
+char *xcharalloc (size_t n) ATTRIBUTE_MALLOC;
+# endif
+
+# ifdef static_inline
+
+/* Allocate an array of N objects, each with S bytes of memory,
+ dynamically, with error checking. S must be nonzero. */
+
+static_inline void *xnmalloc (size_t n, size_t s) ATTRIBUTE_MALLOC;
+static_inline void *
+xnmalloc (size_t n, size_t s)
+{
+ if (xalloc_oversized (n, s))
+ xalloc_die ();
+ return xmalloc (n * s);
+}
+
+/* Change the size of an allocated block of memory P to an array of N
+ objects each of S bytes, with error checking. S must be nonzero. */
+
+static_inline void *
+xnrealloc (void *p, size_t n, size_t s)
+{
+ if (xalloc_oversized (n, s))
+ xalloc_die ();
+ return xrealloc (p, n * s);
+}
+
+/* If P is null, allocate a block of at least *PN such objects;
+ otherwise, reallocate P so that it contains more than *PN objects
+ each of S bytes. *PN must be nonzero unless P is null, and S must
+ be nonzero. Set *PN to the new number of objects, and return the
+ pointer to the new block. *PN is never set to zero, and the
+ returned pointer is never null.
+
+ Repeated reallocations are guaranteed to make progress, either by
+ allocating an initial block with a nonzero size, or by allocating a
+ larger block.
+
+ In the following implementation, nonzero sizes are increased by a
+ factor of approximately 1.5 so that repeated reallocations have
+ O(N) overall cost rather than O(N**2) cost, but the
+ specification for this function does not guarantee that rate.
+
+ Here is an example of use:
+
+ int *p = NULL;
+ size_t used = 0;
+ size_t allocated = 0;
+
+ void
+ append_int (int value)
+ {
+ if (used == allocated)
+ p = x2nrealloc (p, &allocated, sizeof *p);
+ p[used++] = value;
+ }
+
+ This causes x2nrealloc to allocate a block of some nonzero size the
+ first time it is called.
+
+ To have finer-grained control over the initial size, set *PN to a
+ nonzero value before calling this function with P == NULL. For
+ example:
+
+ int *p = NULL;
+ size_t used = 0;
+ size_t allocated = 0;
+ size_t allocated1 = 1000;
+
+ void
+ append_int (int value)
+ {
+ if (used == allocated)
+ {
+ p = x2nrealloc (p, &allocated1, sizeof *p);
+ allocated = allocated1;
+ }
+ p[used++] = value;
+ }
+
+ */
+
+static_inline void *
+x2nrealloc (void *p, size_t *pn, size_t s)
+{
+ size_t n = *pn;
+
+ if (! p)
+ {
+ if (! n)
+ {
+ /* The approximate size to use for initial small allocation
+ requests, when the invoking code specifies an old size of
+ zero. 64 bytes is the largest "small" request for the
+ GNU C library malloc. */
+ enum { DEFAULT_MXFAST = 64 };
+
+ n = DEFAULT_MXFAST / s;
+ n += !n;
+ }
+ }
+ else
+ {
+ /* Set N = ceil (1.5 * N) so that progress is made if N == 1.
+ Check for overflow, so that N * S stays in size_t range.
+ The check is slightly conservative, but an exact check isn't
+ worth the trouble. */
+ if ((size_t) -1 / 3 * 2 / s <= n)
+ xalloc_die ();
+ n += (n + 1) / 2;
+ }
+
+ *pn = n;
+ return xrealloc (p, n * s);
+}
+
+/* Return a pointer to a new buffer of N bytes. This is like xmalloc,
+ except it returns char *. */
+
+static_inline char *xcharalloc (size_t n) ATTRIBUTE_MALLOC;
+static_inline char *
+xcharalloc (size_t n)
+{
+ return XNMALLOC (n, char);
+}
+
+# endif
+
+# ifdef __cplusplus
+}
+
+/* C++ does not allow conversions from void * to other pointer types
+ without a cast. Use templates to work around the problem when
+ possible. */
+
+template <typename T> inline T *
+xrealloc (T *p, size_t s)
+{
+ return (T *) xrealloc ((void *) p, s);
+}
+
+template <typename T> inline T *
+xnrealloc (T *p, size_t n, size_t s)
+{
+ return (T *) xnrealloc ((void *) p, n, s);
+}
+
+template <typename T> inline T *
+x2realloc (T *p, size_t *pn)
+{
+ return (T *) x2realloc ((void *) p, pn);
+}
+
+template <typename T> inline T *
+x2nrealloc (T *p, size_t *pn, size_t s)
+{
+ return (T *) x2nrealloc ((void *) p, pn, s);
+}
+
+template <typename T> inline T *
+xmemdup (T const *p, size_t s)
+{
+ return (T *) xmemdup ((void const *) p, s);
+}
+
+# endif
+
+
+#endif /* !XALLOC_H_ */
diff --git a/gnulib/lib/xasprintf.c b/gnulib/lib/xasprintf.c
new file mode 100644
index 00000000..0fcff254
--- /dev/null
+++ b/gnulib/lib/xasprintf.c
@@ -0,0 +1,34 @@
+/* vasprintf and asprintf with out-of-memory checking.
+ Copyright (C) 1999, 2002-2004, 2006, 2009-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xvasprintf.h"
+
+char *
+xasprintf (const char *format, ...)
+{
+ va_list args;
+ char *result;
+
+ va_start (args, format);
+ result = xvasprintf (format, args);
+ va_end (args);
+
+ return result;
+}
diff --git a/gnulib/lib/xconcat-filename.c b/gnulib/lib/xconcat-filename.c
new file mode 100644
index 00000000..d1fff90e
--- /dev/null
+++ b/gnulib/lib/xconcat-filename.c
@@ -0,0 +1,41 @@
+/* Construct a full filename from a directory and a relative filename.
+ Copyright (C) 2001-2004, 2006-2010 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 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/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "concat-filename.h"
+
+#include "xalloc.h"
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. The directory may end with the directory separator. The second
+ argument may not start with the directory separator (it is relative).
+ Return a freshly allocated filename. */
+char *
+xconcatenated_filename (const char *directory, const char *filename,
+ const char *suffix)
+{
+ char *result;
+
+ result = concatenated_filename (directory, filename, suffix);
+ if (result == NULL)
+ xalloc_die ();
+
+ return result;
+}
diff --git a/gnulib/lib/xfreopen.c b/gnulib/lib/xfreopen.c
new file mode 100644
index 00000000..297bda4e
--- /dev/null
+++ b/gnulib/lib/xfreopen.c
@@ -0,0 +1,42 @@
+/* a wrapper for frepoen
+ Copyright (C) 2008-2010 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/>. */
+
+#include <config.h>
+#include "xfreopen.h"
+
+#include <errno.h>
+#include "error.h"
+#include "exitfail.h"
+#include "quote.h"
+#include "stdio--.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+xfreopen (char const *filename, char const *mode, FILE *fp)
+{
+ if (!freopen (filename, mode, fp))
+ {
+ char const *f = (filename ? filename
+ : (fp == stdin ? _("stdin")
+ : (fp == stdout ? _("stdout")
+ : (fp == stderr ? _("stderr")
+ : _("unknown stream")))));
+ error (exit_failure, errno, _("failed to reopen %s with mode %s"),
+ quote_n (0, f), quote_n (1, mode));
+ }
+}
diff --git a/gnulib/lib/xfreopen.h b/gnulib/lib/xfreopen.h
new file mode 100644
index 00000000..2ce49b5a
--- /dev/null
+++ b/gnulib/lib/xfreopen.h
@@ -0,0 +1,2 @@
+#include <stdio.h>
+void xfreopen (char const *filename, char const *mode, FILE *fp);
diff --git a/gnulib/lib/xgetcwd.c b/gnulib/lib/xgetcwd.c
new file mode 100644
index 00000000..8b78aa28
--- /dev/null
+++ b/gnulib/lib/xgetcwd.c
@@ -0,0 +1,41 @@
+/* xgetcwd.c -- return current directory with unlimited length
+
+ Copyright (C) 2001, 2003-2004, 2006-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "xgetcwd.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "xalloc.h"
+
+/* Return the current directory, newly allocated.
+ Upon an out-of-memory error, call xalloc_die.
+ Upon any other type of error, return NULL. */
+
+char *
+xgetcwd (void)
+{
+ char *cwd = getcwd (NULL, 0);
+ if (! cwd && errno == ENOMEM)
+ xalloc_die ();
+ return cwd;
+}
diff --git a/gnulib/lib/xgetcwd.h b/gnulib/lib/xgetcwd.h
new file mode 100644
index 00000000..ad427e8b
--- /dev/null
+++ b/gnulib/lib/xgetcwd.h
@@ -0,0 +1,17 @@
+/* prototype for xgetcwd
+ Copyright (C) 1995, 2001, 2003, 2009-2010 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/>. */
+
+extern char *xgetcwd (void);
diff --git a/gnulib/lib/xgetdomainname.c b/gnulib/lib/xgetdomainname.c
new file mode 100644
index 00000000..f2b27038
--- /dev/null
+++ b/gnulib/lib/xgetdomainname.c
@@ -0,0 +1,77 @@
+/* xgetdomainname.c -- Return the NIS domain name, without size limitations.
+ Copyright (C) 1992, 1996, 2000-2001, 2003-2004, 2006, 2008-2010 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/>. */
+
+/* Based on xgethostname.c, written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xgetdomainname.h"
+
+/* Get getdomainname. */
+#include <unistd.h>
+
+/* Get errno. */
+#include <errno.h>
+
+/* Get free. */
+#include <stdlib.h>
+
+#include "xalloc.h"
+
+#ifndef INITIAL_DOMAINNAME_LENGTH
+# define INITIAL_DOMAINNAME_LENGTH 34
+#endif
+
+/* Return the NIS domain name of the machine, in malloc'd storage.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+ If malloc fails, exit.
+ Upon any other failure, set errno and return NULL. */
+char *
+xgetdomainname (void)
+{
+ char *domainname;
+ size_t size;
+
+ size = INITIAL_DOMAINNAME_LENGTH;
+ domainname = xmalloc (size);
+ while (1)
+ {
+ int k = size - 1;
+ int err;
+
+ errno = 0;
+ domainname[k] = '\0';
+ err = getdomainname (domainname, size);
+ if (err >= 0 && domainname[k] == '\0')
+ break;
+ else if (err < 0 && errno != EINVAL)
+ {
+ int saved_errno = errno;
+ free (domainname);
+ errno = saved_errno;
+ return NULL;
+ }
+ size *= 2;
+ domainname = xrealloc (domainname, size);
+ }
+
+ return domainname;
+}
diff --git a/gnulib/lib/xgetdomainname.h b/gnulib/lib/xgetdomainname.h
new file mode 100644
index 00000000..b12eb7c1
--- /dev/null
+++ b/gnulib/lib/xgetdomainname.h
@@ -0,0 +1,30 @@
+/* xgetdomainname.h -- Return the NIS domain name, without size limitations.
+ Copyright (C) 1992, 1996, 2000, 2001, 2003, 2009, 2010 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/>. */
+
+#ifndef _XGETDOMAINNAME_H
+#define _XGETDOMAINNAME_H
+
+/* Return the NIS domain name of the machine, in malloc'd storage.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+ If malloc fails, exit.
+ Upon any other failure, set errno and return NULL. */
+extern char *xgetdomainname (void);
+
+#endif /* _XGETDOMAINNAME_H */
diff --git a/gnulib/lib/xgethostname.c b/gnulib/lib/xgethostname.c
new file mode 100644
index 00000000..8d24d404
--- /dev/null
+++ b/gnulib/lib/xgethostname.c
@@ -0,0 +1,74 @@
+/* xgethostname.c -- return current hostname with unlimited length
+
+ Copyright (C) 1992, 1996, 2000-2001, 2003-2006, 2009-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include "xgethostname.h"
+
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include "xalloc.h"
+
+#ifndef INITIAL_HOSTNAME_LENGTH
+# define INITIAL_HOSTNAME_LENGTH 34
+#endif
+
+/* Return the current hostname in malloc'd storage.
+ If malloc fails, exit.
+ Upon any other failure, return NULL and set errno. */
+char *
+xgethostname (void)
+{
+ char *hostname = NULL;
+ size_t size = INITIAL_HOSTNAME_LENGTH;
+
+ while (1)
+ {
+ /* Use SIZE_1 here rather than SIZE to work around the bug in
+ SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME
+ even when the name is as long as the supplied buffer. */
+ size_t size_1;
+
+ hostname = x2realloc (hostname, &size);
+ size_1 = size - 1;
+ hostname[size_1 - 1] = '\0';
+ errno = 0;
+
+ if (gethostname (hostname, size_1) == 0)
+ {
+ if (! hostname[size_1 - 1])
+ break;
+ }
+ else if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL
+ /* OSX/Darwin does this when the buffer is not large enough */
+ && errno != ENOMEM)
+ {
+ int saved_errno = errno;
+ free (hostname);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+
+ return hostname;
+}
diff --git a/gnulib/lib/xgethostname.h b/gnulib/lib/xgethostname.h
new file mode 100644
index 00000000..0177a409
--- /dev/null
+++ b/gnulib/lib/xgethostname.h
@@ -0,0 +1 @@
+char *xgethostname (void);
diff --git a/gnulib/lib/xmalloc.c b/gnulib/lib/xmalloc.c
new file mode 100644
index 00000000..ecce5296
--- /dev/null
+++ b/gnulib/lib/xmalloc.c
@@ -0,0 +1,118 @@
+/* xmalloc.c -- malloc with out of memory checking
+
+ Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#if ! HAVE_INLINE
+# define static_inline
+#endif
+#include "xalloc.h"
+#undef static_inline
+
+#include <stdlib.h>
+#include <string.h>
+
+/* 1 if calloc is known to be compatible with GNU calloc. This
+ matters if we are not also using the calloc module, which defines
+ HAVE_CALLOC and supports the GNU API even on non-GNU platforms. */
+#if defined HAVE_CALLOC || defined __GLIBC__
+enum { HAVE_GNU_CALLOC = 1 };
+#else
+enum { HAVE_GNU_CALLOC = 0 };
+#endif
+
+/* Allocate N bytes of memory dynamically, with error checking. */
+
+void *
+xmalloc (size_t n)
+{
+ void *p = malloc (n);
+ if (!p && n != 0)
+ xalloc_die ();
+ return p;
+}
+
+/* Change the size of an allocated block of memory P to N bytes,
+ with error checking. */
+
+void *
+xrealloc (void *p, size_t n)
+{
+ p = realloc (p, n);
+ if (!p && n != 0)
+ xalloc_die ();
+ return p;
+}
+
+/* If P is null, allocate a block of at least *PN bytes; otherwise,
+ reallocate P so that it contains more than *PN bytes. *PN must be
+ nonzero unless P is null. Set *PN to the new block's size, and
+ return the pointer to the new block. *PN is never set to zero, and
+ the returned pointer is never null. */
+
+void *
+x2realloc (void *p, size_t *pn)
+{
+ return x2nrealloc (p, pn, 1);
+}
+
+/* Allocate S bytes of zeroed memory dynamically, with error checking.
+ There's no need for xnzalloc (N, S), since it would be equivalent
+ to xcalloc (N, S). */
+
+void *
+xzalloc (size_t s)
+{
+ return memset (xmalloc (s), 0, s);
+}
+
+/* Allocate zeroed memory for N elements of S bytes, with error
+ checking. S must be nonzero. */
+
+void *
+xcalloc (size_t n, size_t s)
+{
+ void *p;
+ /* Test for overflow, since some calloc implementations don't have
+ proper overflow checks. But omit overflow and size-zero tests if
+ HAVE_GNU_CALLOC, since GNU calloc catches overflow and never
+ returns NULL if successful. */
+ if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s))
+ || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
+ xalloc_die ();
+ return p;
+}
+
+/* Clone an object P of size S, with error checking. There's no need
+ for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
+ need for an arithmetic overflow check. */
+
+void *
+xmemdup (void const *p, size_t s)
+{
+ return memcpy (xmalloc (s), p, s);
+}
+
+/* Clone STRING. */
+
+char *
+xstrdup (char const *string)
+{
+ return xmemdup (string, strlen (string) + 1);
+}
diff --git a/gnulib/lib/xmalloca.c b/gnulib/lib/xmalloca.c
new file mode 100644
index 00000000..6848a9b0
--- /dev/null
+++ b/gnulib/lib/xmalloca.c
@@ -0,0 +1,38 @@
+/* Safe automatic memory allocation with out of memory checking.
+ Copyright (C) 2003, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xmalloca.h"
+
+#include "xalloc.h"
+
+#if HAVE_ALLOCA
+
+void *
+xmmalloca (size_t n)
+{
+ void *p;
+
+ p = mmalloca (n);
+ if (p == NULL)
+ xalloc_die ();
+ return p;
+}
+
+#endif
diff --git a/gnulib/lib/xmalloca.h b/gnulib/lib/xmalloca.h
new file mode 100644
index 00000000..1a5fb6d0
--- /dev/null
+++ b/gnulib/lib/xmalloca.h
@@ -0,0 +1,64 @@
+/* Safe automatic memory allocation with out of memory checking.
+ Copyright (C) 2003, 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ 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/>. */
+
+#ifndef _XMALLOCA_H
+#define _XMALLOCA_H
+
+#include "malloca.h"
+#include "xalloc.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* xmalloca(N) is a checking safe variant of alloca(N). It allocates N bytes
+ of memory allocated on the stack, that must be freed using freea() before
+ the function returns. Upon failure, it exits with an error message. */
+#if HAVE_ALLOCA
+# define xmalloca(N) \
+ ((N) < 4032 - sa_increment \
+ ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \
+ : xmmalloca (N))
+extern void * xmmalloca (size_t n);
+#else
+# define xmalloca(N) \
+ xmalloc (N)
+#endif
+
+/* xnmalloca(N,S) is an overflow-safe variant of xmalloca (N * S).
+ It allocates an array of N objects, each with S bytes of memory,
+ on the stack. S must be positive and N must be nonnegative.
+ The array must be freed using freea() before the function returns.
+ Upon failure, it exits with an error message. */
+#if HAVE_ALLOCA
+/* Rely on xmalloca (SIZE_MAX) calling xalloc_die (). */
+# define xnmalloca(n, s) \
+ xmalloca (xalloc_oversized ((n), (s)) ? (size_t) (-1) : (n) * (s))
+#else
+# define xnmalloca(n, s) \
+ xnmalloc ((n), (s))
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _XMALLOCA_H */
diff --git a/gnulib/lib/xmemcoll.c b/gnulib/lib/xmemcoll.c
new file mode 100644
index 00000000..84bbd8ce
--- /dev/null
+++ b/gnulib/lib/xmemcoll.c
@@ -0,0 +1,57 @@
+/* Locale-specific memory comparison.
+
+ Copyright (C) 2002-2004, 2006, 2009-2010 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/>. */
+
+/* Contributed by Paul Eggert <eggert@twinsun.com>. */
+
+#include <config.h>
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "error.h"
+#include "exitfail.h"
+#include "memcoll.h"
+#include "quotearg.h"
+#include "xmemcoll.h"
+
+/* Compare S1 (with length S1LEN) and S2 (with length S2LEN) according
+ to the LC_COLLATE locale. S1 and S2 do not overlap, and are not
+ adjacent. Temporarily modify the bytes after S1 and S2, but
+ restore their original contents before returning. Report an error
+ and exit if there is an error. */
+
+int
+xmemcoll (char *s1, size_t s1len, char *s2, size_t s2len)
+{
+ int diff = memcoll (s1, s1len, s2, s2len);
+ int collation_errno = errno;
+
+ if (collation_errno)
+ {
+ error (0, collation_errno, _("string comparison failed"));
+ error (0, 0, _("Set LC_ALL='C' to work around the problem."));
+ error (exit_failure, 0,
+ _("The strings compared were %s and %s."),
+ quotearg_n_style_mem (0, locale_quoting_style, s1, s1len),
+ quotearg_n_style_mem (1, locale_quoting_style, s2, s2len));
+ }
+
+ return diff;
+}
diff --git a/gnulib/lib/xmemcoll.h b/gnulib/lib/xmemcoll.h
new file mode 100644
index 00000000..2f422e8c
--- /dev/null
+++ b/gnulib/lib/xmemcoll.h
@@ -0,0 +1,2 @@
+#include <stddef.h>
+int xmemcoll (char *, size_t, char *, size_t);
diff --git a/gnulib/lib/xmemdup0.c b/gnulib/lib/xmemdup0.c
new file mode 100644
index 00000000..feddccc1
--- /dev/null
+++ b/gnulib/lib/xmemdup0.c
@@ -0,0 +1,44 @@
+/* xmemdup0.c -- copy a block of arbitrary bytes, plus a trailing NUL
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include "xmemdup0.h"
+#include "xalloc.h"
+
+#include <string.h>
+
+/* Clone an arbitrary block of bytes P of size S, with error checking,
+ and include a terminating NUL byte. P is of type `void const *',
+ to make it easier to use this with other mem* functions that return
+ `void *', but since appending a NUL byte only makes sense on bytes,
+ the return type is `char *'.
+
+ The terminating NUL makes it safe to use strlen or rawmemchr to
+ check for embedded NUL; it also speeds up algorithms such as escape
+ sequence processing on arbitrary memory, by making it always safe
+ to read the byte after the escape character rather than having to
+ check if each escape character is the last byte in the object. */
+
+char *
+xmemdup0 (void const *p, size_t s)
+{
+ char *result = xcharalloc (s + 1);
+ memcpy (result, p, s);
+ result[s] = 0;
+ return result;
+}
diff --git a/gnulib/lib/xmemdup0.h b/gnulib/lib/xmemdup0.h
new file mode 100644
index 00000000..d3557694
--- /dev/null
+++ b/gnulib/lib/xmemdup0.h
@@ -0,0 +1,51 @@
+/* xmemdup0.h -- copy a block of arbitrary bytes, plus a trailing NUL
+
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#ifndef XMEMDUP_H_
+# define XMEMDUP_H_
+
+# include <stddef.h>
+
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+# define __attribute__(x)
+# endif
+# endif
+
+# ifndef ATTRIBUTE_NORETURN
+# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+# endif
+
+/* This function is always triggered when memory is exhausted.
+ It must be defined by the application, either explicitly
+ or by using gnulib's xalloc-die module. This is the
+ function to call when one wants the program to die because of a
+ memory allocation failure. */
+extern void xalloc_die (void) ATTRIBUTE_NORETURN;
+
+char *xmemdup0 (void const *p, size_t s);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* !XMEMDUP0_H_ */
diff --git a/gnulib/lib/xnanosleep.c b/gnulib/lib/xnanosleep.c
new file mode 100644
index 00000000..b4dbdc1c
--- /dev/null
+++ b/gnulib/lib/xnanosleep.c
@@ -0,0 +1,118 @@
+/* xnanosleep.c -- a more convenient interface to nanosleep
+
+ Copyright (C) 2002-2007, 2009-2010 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/>. */
+
+/* Mostly written (for sleep.c) by Paul Eggert.
+ Factored out (creating this file) by Jim Meyering. */
+
+#include <config.h>
+
+#include "xnanosleep.h"
+
+#include <limits.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <time.h>
+
+#include "intprops.h"
+
+#ifndef TIME_T_MAX
+# define TIME_T_MAX TYPE_MAXIMUM (time_t)
+#endif
+
+/* Sleep until the time (call it WAKE_UP_TIME) specified as
+ SECONDS seconds after the time this function is called.
+ SECONDS must be non-negative. If SECONDS is so large that
+ it is not representable as a `struct timespec', then use
+ the maximum value for that interval. Return -1 on failure
+ (setting errno), 0 on success. */
+
+int
+xnanosleep (double seconds)
+{
+ enum { BILLION = 1000000000 };
+
+ /* For overflow checking, use naive comparison if possible, widening
+ to long double if double is not wide enough. Otherwise, use <=,
+ not <, to avoid problems when TIME_T_MAX is less than SECONDS but
+ compares equal to SECONDS after loss of precision when coercing
+ from time_t to long double. This mishandles near-maximal values
+ in some rare (perhaps theoretical) cases but that is better than
+ undefined behavior. */
+ bool overflow = ((time_t) ((double) TIME_T_MAX / 2) == TIME_T_MAX / 2
+ ? TIME_T_MAX < seconds
+ : (time_t) ((long double) TIME_T_MAX / 2) == TIME_T_MAX / 2
+ ? TIME_T_MAX < (long double) seconds
+ : TIME_T_MAX <= (long double) seconds);
+
+ struct timespec ts_sleep;
+
+ assert (0 <= seconds);
+
+ /* Separate whole seconds from nanoseconds. */
+ if (! overflow)
+ {
+ time_t floor_seconds = seconds;
+ double ns = BILLION * (seconds - floor_seconds);
+ ts_sleep.tv_sec = floor_seconds;
+
+ /* Round up to the next whole number, if necessary, so that we
+ always sleep for at least the requested amount of time. Assuming
+ the default rounding mode, we don't have to worry about the
+ rounding error when computing 'ns' above, since the error won't
+ cause 'ns' to drop below an integer boundary. */
+ ts_sleep.tv_nsec = ns;
+ ts_sleep.tv_nsec += (ts_sleep.tv_nsec < ns);
+
+ /* Normalize the interval length. nanosleep requires this. */
+ if (BILLION <= ts_sleep.tv_nsec)
+ {
+ if (ts_sleep.tv_sec == TIME_T_MAX)
+ overflow = true;
+ else
+ {
+ ts_sleep.tv_sec++;
+ ts_sleep.tv_nsec -= BILLION;
+ }
+ }
+ }
+
+ for (;;)
+ {
+ if (overflow)
+ {
+ ts_sleep.tv_sec = TIME_T_MAX;
+ ts_sleep.tv_nsec = BILLION - 1;
+ }
+
+ /* Linux-2.6.8.1's nanosleep returns -1, but doesn't set errno
+ when resumed after being suspended. Earlier versions would
+ set errno to EINTR. nanosleep from linux-2.6.10, as well as
+ implementations by (all?) other vendors, doesn't return -1
+ in that case; either it continues sleeping (if time remains)
+ or it returns zero (if the wake-up time has passed). */
+ errno = 0;
+ if (nanosleep (&ts_sleep, NULL) == 0)
+ break;
+ if (errno != EINTR && errno != 0)
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/lib/xnanosleep.h b/gnulib/lib/xnanosleep.h
new file mode 100644
index 00000000..56232d55
--- /dev/null
+++ b/gnulib/lib/xnanosleep.h
@@ -0,0 +1 @@
+int xnanosleep (double);
diff --git a/gnulib/lib/xprintf.c b/gnulib/lib/xprintf.c
new file mode 100644
index 00000000..f0450300
--- /dev/null
+++ b/gnulib/lib/xprintf.c
@@ -0,0 +1,79 @@
+/* printf wrappers that fail immediately for non-file-related errors
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include "xprintf.h"
+
+#include <errno.h>
+
+#include "error.h"
+#include "exitfail.h"
+#include "gettext.h"
+
+/* written by Jim Meyering */
+
+/* Just like printf, but call error if it fails without setting the
+ stream's error indicator. */
+int
+xprintf (char const *restrict format, ...)
+{
+ va_list args;
+ int retval;
+ va_start (args, format);
+ retval = xvprintf (format, args);
+ va_end (args);
+
+ return retval;
+}
+
+/* Just like vprintf, but call error if it fails without setting the
+ stream's error indicator. */
+int
+xvprintf (char const *restrict format, va_list args)
+{
+ int retval = vprintf (format, args);
+ if (retval < 0 && ! ferror (stdout))
+ error (exit_failure, errno, gettext ("cannot perform formatted output"));
+
+ return retval;
+}
+
+/* Just like fprintf, but call error if it fails without setting the
+ stream's error indicator. */
+int
+xfprintf (FILE *restrict stream, char const *restrict format, ...)
+{
+ va_list args;
+ int retval;
+ va_start (args, format);
+ retval = xvfprintf (stream, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+/* Just like vfprintf, but call error if it fails without setting the
+ stream's error indicator. */
+int
+xvfprintf (FILE *restrict stream, char const *restrict format, va_list args)
+{
+ int retval = vfprintf (stream, format, args);
+ if (retval < 0 && ! ferror (stream))
+ error (exit_failure, errno, gettext ("cannot perform formatted output"));
+
+ return retval;
+}
diff --git a/gnulib/lib/xprintf.h b/gnulib/lib/xprintf.h
new file mode 100644
index 00000000..91ba55da
--- /dev/null
+++ b/gnulib/lib/xprintf.h
@@ -0,0 +1,45 @@
+/* printf wrappers that fail immediately for non-file-related errors
+ Copyright (C) 2007-2010 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/>. */
+
+#ifndef _XPRINTF_H
+#define _XPRINTF_H
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#ifndef __attribute__
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable __attribute__ only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(Spec) /* empty */
+# endif
+#endif
+
+extern int xprintf (char const *restrict format, ...)
+ __attribute__ ((__format__ (__printf__, 1, 2)));
+extern int xvprintf (char const *restrict format, va_list args)
+ __attribute__ ((__format__ (__printf__, 1, 0)));
+extern int xfprintf (FILE *restrict stream, char const *restrict format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+extern int xvfprintf (FILE *restrict stream, char const *restrict format,
+ va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0)));
+
+#endif
diff --git a/gnulib/lib/xreadlink.c b/gnulib/lib/xreadlink.c
new file mode 100644
index 00000000..4fdcafb5
--- /dev/null
+++ b/gnulib/lib/xreadlink.c
@@ -0,0 +1,44 @@
+/* xreadlink.c -- readlink wrapper to return the link name in malloc'd storage
+
+ Copyright (C) 2001, 2003-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>
+ and Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xreadlink.h"
+
+#include <errno.h>
+
+#include "areadlink.h"
+#include "xalloc.h"
+
+/* Call readlink to get the symbolic link value of FILENAME.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlink fails, return NULL and set errno.
+ If realloc fails, or if the link value is longer than SIZE_MAX :-),
+ give a diagnostic and exit. */
+
+char *
+xreadlink (char const *filename)
+{
+ char *result = areadlink (filename);
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xreadlink.h b/gnulib/lib/xreadlink.h
new file mode 100644
index 00000000..022bc804
--- /dev/null
+++ b/gnulib/lib/xreadlink.h
@@ -0,0 +1,27 @@
+/* Reading symbolic links without size limitation.
+
+ Copyright (C) 2001, 2003-2004, 2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <jim@meyering.net> */
+
+#include <stddef.h>
+
+extern char *xreadlink (char const *filename);
+
+#if GNULIB_XREADLINKAT
+extern char *xreadlinkat (int fd, char const *filename);
+#endif
diff --git a/gnulib/lib/xreadlinkat.c b/gnulib/lib/xreadlinkat.c
new file mode 100644
index 00000000..6bd097d9
--- /dev/null
+++ b/gnulib/lib/xreadlinkat.c
@@ -0,0 +1,46 @@
+/* xreadlinkat.c -- readlink wrapper to return the link name in malloc'd storage
+
+ Copyright (C) 2001, 2003-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>,
+ and Bruno Haible <bruno@clisp.org>,
+ and Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xreadlink.h"
+
+#include <errno.h>
+
+#include "areadlink.h"
+#include "xalloc.h"
+
+/* Call readlinkat to get the symbolic link value of FILENAME relative to FD.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlinkat fails, return NULL and set errno (although failure to
+ change directory will issue a diagnostic and exit).
+ If realloc fails, or if the link value is longer than SIZE_MAX :-),
+ give a diagnostic and exit. */
+
+char *
+xreadlinkat (int fd, char const *filename)
+{
+ char *result = areadlinkat (fd, filename);
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xsetenv.c b/gnulib/lib/xsetenv.c
new file mode 100644
index 00000000..0d0a2b7c
--- /dev/null
+++ b/gnulib/lib/xsetenv.c
@@ -0,0 +1,38 @@
+/* Setting environment variables, with out-of-memory checking.
+ Copyright (C) 2001-2002, 2005-2007, 2009-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xsetenv.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value.
+ With error checking. */
+void
+xsetenv (const char *name, const char *value, int replace)
+{
+ if (setenv (name, value, replace) < 0)
+ error (EXIT_FAILURE, 0, _("memory exhausted"));
+}
diff --git a/gnulib/lib/xsetenv.h b/gnulib/lib/xsetenv.h
new file mode 100644
index 00000000..80416bf9
--- /dev/null
+++ b/gnulib/lib/xsetenv.h
@@ -0,0 +1,31 @@
+/* Setting environment variables, with out-of-memory checking.
+ Copyright (C) 2001-2002, 2007, 2009-2010 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/>. */
+
+/* Get unsetenv(). It can be used without error checking. */
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value.
+ With error checking. */
+extern void xsetenv (const char *name, const char *value, int replace);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/xsize.h b/gnulib/lib/xsize.h
new file mode 100644
index 00000000..2b955b63
--- /dev/null
+++ b/gnulib/lib/xsize.h
@@ -0,0 +1,108 @@
+/* xsize.h -- Checked size_t computations.
+
+ Copyright (C) 2003, 2008, 2009, 2010 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 2, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _XSIZE_H
+#define _XSIZE_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get SIZE_MAX. */
+#include <limits.h>
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+/* The size of memory objects is often computed through expressions of
+ type size_t. Example:
+ void* p = malloc (header_size + n * element_size).
+ These computations can lead to overflow. When this happens, malloc()
+ returns a piece of memory that is way too small, and the program then
+ crashes while attempting to fill the memory.
+ To avoid this, the functions and macros in this file check for overflow.
+ The convention is that SIZE_MAX represents overflow.
+ malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
+ implementation that uses mmap --, it's recommended to use size_overflow_p()
+ or size_in_bounds_p() before invoking malloc().
+ The example thus becomes:
+ size_t size = xsum (header_size, xtimes (n, element_size));
+ void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
+*/
+
+/* Convert an arbitrary value >= 0 to type size_t. */
+#define xcast_size_t(N) \
+ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
+
+/* Sum of two sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum (size_t size1, size_t size2)
+{
+ size_t sum = size1 + size2;
+ return (sum >= size1 ? sum : SIZE_MAX);
+}
+
+/* Sum of three sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum3 (size_t size1, size_t size2, size_t size3)
+{
+ return xsum (xsum (size1, size2), size3);
+}
+
+/* Sum of four sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
+{
+ return xsum (xsum (xsum (size1, size2), size3), size4);
+}
+
+/* Maximum of two sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xmax (size_t size1, size_t size2)
+{
+ /* No explicit check is needed here, because for any n:
+ max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
+ return (size1 >= size2 ? size1 : size2);
+}
+
+/* Multiplication of a count with an element size, with overflow check.
+ The count must be >= 0 and the element size must be > 0.
+ This is a macro, not an inline function, so that it works correctly even
+ when N is of a wider type and N > SIZE_MAX. */
+#define xtimes(N, ELSIZE) \
+ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
+
+/* Check for overflow. */
+#define size_overflow_p(SIZE) \
+ ((SIZE) == SIZE_MAX)
+/* Check against overflow. */
+#define size_in_bounds_p(SIZE) \
+ ((SIZE) != SIZE_MAX)
+
+#endif /* _XSIZE_H */
diff --git a/gnulib/lib/xstriconv.c b/gnulib/lib/xstriconv.c
new file mode 100644
index 00000000..7c8c1421
--- /dev/null
+++ b/gnulib/lib/xstriconv.c
@@ -0,0 +1,62 @@
+/* Charset conversion with out-of-memory checking.
+ Copyright (C) 2001-2004, 2006, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xstriconv.h"
+
+#include <errno.h>
+
+#include "striconv.h"
+#include "xalloc.h"
+
+
+#if HAVE_ICONV
+
+int
+xmem_cd_iconv (const char *src, size_t srclen, iconv_t cd,
+ char **resultp, size_t *lengthp)
+{
+ int retval = mem_cd_iconv (src, srclen, cd, resultp, lengthp);
+
+ if (retval < 0 && errno == ENOMEM)
+ xalloc_die ();
+ return retval;
+}
+
+char *
+xstr_cd_iconv (const char *src, iconv_t cd)
+{
+ char *result = str_cd_iconv (src, cd);
+
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+char *
+xstr_iconv (const char *src, const char *from_codeset, const char *to_codeset)
+{
+ char *result = str_iconv (src, from_codeset, to_codeset);
+
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xstriconv.h b/gnulib/lib/xstriconv.h
new file mode 100644
index 00000000..72b2aa37
--- /dev/null
+++ b/gnulib/lib/xstriconv.h
@@ -0,0 +1,78 @@
+/* Charset conversion with out-of-memory checking.
+ Copyright (C) 2001-2004, 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ 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/>. */
+
+#ifndef _XSTRICONV_H
+#define _XSTRICONV_H
+
+#include <stddef.h>
+#if HAVE_ICONV
+#include <iconv.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if HAVE_ICONV
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ The conversion descriptor is passed as CD.
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Upon memory allocation failure, report the error and exit.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int xmem_cd_iconv (const char *src, size_t srclen, iconv_t cd,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ The conversion descriptor is passed as CD. Both the "from" and the "to"
+ encoding must use a single NUL byte at the end of the string (i.e. not
+ UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Upon memory allocation failure, report the error and exit.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char * xstr_cd_iconv (const char *src, iconv_t cd);
+
+#endif
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Upon memory allocation failure, report the error and exit.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char * xstr_iconv (const char *src,
+ const char *from_codeset, const char *to_codeset);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _XSTRICONV_H */
diff --git a/gnulib/lib/xstriconveh.c b/gnulib/lib/xstriconveh.c
new file mode 100644
index 00000000..608e39c3
--- /dev/null
+++ b/gnulib/lib/xstriconveh.c
@@ -0,0 +1,86 @@
+/* Charset conversion with out-of-memory checking.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xstriconveh.h"
+
+#include <errno.h>
+
+#include "striconveh.h"
+#include "xalloc.h"
+
+
+#if HAVE_ICONV
+
+int
+xmem_cd_iconveh (const char *src, size_t srclen,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ int retval =
+ mem_cd_iconveh (src, srclen, cd, handler, offsets, resultp, lengthp);
+
+ if (retval < 0 && errno == ENOMEM)
+ xalloc_die ();
+ return retval;
+}
+
+char *
+xstr_cd_iconveh (const char *src,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler)
+{
+ char *result = str_cd_iconveh (src, cd, handler);
+
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+int
+xmem_iconveh (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ int retval =
+ mem_iconveh (src, srclen, from_codeset, to_codeset, handler, offsets,
+ resultp, lengthp);
+
+ if (retval < 0 && errno == ENOMEM)
+ xalloc_die ();
+ return retval;
+}
+
+char *
+xstr_iconveh (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler)
+{
+ char *result = str_iconveh (src, from_codeset, to_codeset, handler);
+
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xstriconveh.h b/gnulib/lib/xstriconveh.h
new file mode 100644
index 00000000..8018304a
--- /dev/null
+++ b/gnulib/lib/xstriconveh.h
@@ -0,0 +1,115 @@
+/* Charset conversion with out-of-memory checking.
+ Copyright (C) 2001-2007, 2009-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ 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/>. */
+
+#ifndef _XSTRICONVEH_H
+#define _XSTRICONVEH_H
+
+#include <stddef.h>
+
+/* Get the 'enum iconv_ilseq_handler' and iconveh_t types, and the
+ iconveh_open, iconveh_close declarations. */
+#include "striconveh.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if HAVE_ICONV
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ CD points to the conversion descriptor from FROMCODE to TOCODE, created by
+ the function iconveh_open().
+ 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 (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Upon memory allocation failure, report the error and exit.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ xmem_cd_iconveh (const char *src, size_t srclen,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ CD points to the conversion descriptor from FROMCODE to TOCODE, created by
+ the function iconveh_open().
+ Both the "from" and the "to" encoding must use a single NUL byte at the end
+ of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Upon memory allocation failure, report the error and exit.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ xstr_cd_iconveh (const char *src,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler);
+
+#endif
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ 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 (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Upon memory allocation failure, report the error and exit.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ xmem_iconveh (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Upon memory allocation failure, report the error and exit.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ xstr_iconveh (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _XSTRICONVEH_H */
diff --git a/gnulib/lib/xstrndup.c b/gnulib/lib/xstrndup.c
new file mode 100644
index 00000000..414f9f4f
--- /dev/null
+++ b/gnulib/lib/xstrndup.c
@@ -0,0 +1,36 @@
+/* Duplicate a bounded initial segment of a string, with out-of-memory
+ checking.
+ Copyright (C) 2003, 2006, 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xstrndup.h"
+
+#include <string.h>
+#include "xalloc.h"
+
+/* Return a newly allocated copy of at most N bytes of STRING.
+ In other words, return a copy of the initial segment of length N of
+ STRING. */
+char *
+xstrndup (const char *string, size_t n)
+{
+ char *s = strndup (string, n);
+ if (! s)
+ xalloc_die ();
+ return s;
+}
diff --git a/gnulib/lib/xstrndup.h b/gnulib/lib/xstrndup.h
new file mode 100644
index 00000000..009fdb08
--- /dev/null
+++ b/gnulib/lib/xstrndup.h
@@ -0,0 +1,23 @@
+/* Duplicate a bounded initial segment of a string, with out-of-memory
+ checking.
+ Copyright (C) 2003, 2009, 2010 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/>. */
+
+#include <stddef.h>
+
+/* Return a newly allocated copy of at most N bytes of STRING.
+ In other words, return a copy of the initial segment of length N of
+ STRING. */
+extern char *xstrndup (const char *string, size_t n);
diff --git a/gnulib/lib/xstrtod.c b/gnulib/lib/xstrtod.c
new file mode 100644
index 00000000..ef4d5bee
--- /dev/null
+++ b/gnulib/lib/xstrtod.c
@@ -0,0 +1,71 @@
+/* error-checking interface to strtod-like functions
+
+ Copyright (C) 1996, 1999-2000, 2003-2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "xstrtod.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+
+#if LONG
+# define XSTRTOD xstrtold
+# define DOUBLE long double
+#else
+# define XSTRTOD xstrtod
+# define DOUBLE double
+#endif
+
+/* An interface to a string-to-floating-point conversion function that
+ encapsulates all the error checking one should usually perform.
+ Like strtod/strtold, but upon successful
+ conversion put the result in *RESULT and return true. Return
+ false and don't modify *RESULT upon any failure. CONVERT
+ specifies the conversion function, e.g., strtod itself. */
+
+bool
+XSTRTOD (char const *str, char const **ptr, DOUBLE *result,
+ DOUBLE (*convert) (char const *, char **))
+{
+ DOUBLE val;
+ char *terminator;
+ bool ok = true;
+
+ errno = 0;
+ val = convert (str, &terminator);
+
+ /* Having a non-zero terminator is an error only when PTR is NULL. */
+ if (terminator == str || (ptr == NULL && *terminator != '\0'))
+ ok = false;
+ else
+ {
+ /* Allow underflow (in which case CONVERT returns zero),
+ but flag overflow as an error. */
+ if (val != 0 && errno == ERANGE)
+ ok = false;
+ }
+
+ if (ptr != NULL)
+ *ptr = terminator;
+
+ *result = val;
+ return ok;
+}
diff --git a/gnulib/lib/xstrtod.h b/gnulib/lib/xstrtod.h
new file mode 100644
index 00000000..572d8a72
--- /dev/null
+++ b/gnulib/lib/xstrtod.h
@@ -0,0 +1,31 @@
+/* Error-checking interface to strtod-like functions.
+
+ Copyright (C) 1996, 1998, 2003-2004, 2006, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef XSTRTOD_H
+# define XSTRTOD_H 1
+
+# include <stdbool.h>
+
+bool xstrtod (const char *str, const char **ptr, double *result,
+ double (*convert) (char const *, char **));
+bool xstrtold (const char *str, const char **ptr, long double *result,
+ long double (*convert) (char const *, char **));
+
+#endif /* not XSTRTOD_H */
diff --git a/gnulib/lib/xstrtoimax.c b/gnulib/lib/xstrtoimax.c
new file mode 100644
index 00000000..b4baf5bc
--- /dev/null
+++ b/gnulib/lib/xstrtoimax.c
@@ -0,0 +1,6 @@
+#define __strtol strtoimax
+#define __strtol_t intmax_t
+#define __xstrtol xstrtoimax
+#define STRTOL_T_MINIMUM INTMAX_MIN
+#define STRTOL_T_MAXIMUM INTMAX_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xstrtol-error.c b/gnulib/lib/xstrtol-error.c
new file mode 100644
index 00000000..014fc1c5
--- /dev/null
+++ b/gnulib/lib/xstrtol-error.c
@@ -0,0 +1,98 @@
+/* A more useful interface to strtol.
+
+ Copyright (C) 1995-1996, 1998-1999, 2001-2004, 2006-2010 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/>. */
+
+#include <config.h>
+#include "xstrtol.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+#include "gettext.h"
+
+#define N_(msgid) msgid
+
+/* Report an error for an invalid integer in an option argument.
+
+ ERR is the error code returned by one of the xstrto* functions.
+
+ Use OPT_IDX to decide whether to print the short option string "C"
+ or "-C" or a long option string derived from LONG_OPTION. OPT_IDX
+ is -2 if the short option "C" was used, without any leading "-"; it
+ is -1 if the short option "-C" was used; otherwise it is an index
+ into LONG_OPTIONS, which should have a name preceded by two '-'
+ characters.
+
+ ARG is the option-argument containing the integer.
+
+ After reporting an error, exit with status EXIT_STATUS if it is
+ nonzero. */
+
+static void
+xstrtol_error (enum strtol_error err,
+ int opt_idx, char c, struct option const *long_options,
+ char const *arg,
+ int exit_status)
+{
+ char const *hyphens = "--";
+ char const *msgid;
+ char const *option;
+ char option_buffer[2];
+
+ switch (err)
+ {
+ default:
+ abort ();
+
+ case LONGINT_INVALID:
+ msgid = N_("invalid %s%s argument `%s'");
+ break;
+
+ case LONGINT_INVALID_SUFFIX_CHAR:
+ case LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW:
+ msgid = N_("invalid suffix in %s%s argument `%s'");
+ break;
+
+ case LONGINT_OVERFLOW:
+ msgid = N_("%s%s argument `%s' too large");
+ break;
+ }
+
+ if (opt_idx < 0)
+ {
+ hyphens -= opt_idx;
+ option_buffer[0] = c;
+ option_buffer[1] = '\0';
+ option = option_buffer;
+ }
+ else
+ option = long_options[opt_idx].name;
+
+ error (exit_status, 0, gettext (msgid), hyphens, option, arg);
+}
+
+/* Like xstrtol_error, except exit with a failure status. */
+
+void
+xstrtol_fatal (enum strtol_error err,
+ int opt_idx, char c, struct option const *long_options,
+ char const *arg)
+{
+ xstrtol_error (err, opt_idx, c, long_options, arg, exit_failure);
+ abort ();
+}
diff --git a/gnulib/lib/xstrtol.c b/gnulib/lib/xstrtol.c
new file mode 100644
index 00000000..43f5ada7
--- /dev/null
+++ b/gnulib/lib/xstrtol.c
@@ -0,0 +1,228 @@
+/* A more useful interface to strtol.
+
+ Copyright (C) 1995-1996, 1998-2001, 2003-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef __strtol
+# define __strtol strtol
+# define __strtol_t long int
+# define __xstrtol xstrtol
+# define STRTOL_T_MINIMUM LONG_MIN
+# define STRTOL_T_MAXIMUM LONG_MAX
+#endif
+
+#include <config.h>
+
+#include "xstrtol.h"
+
+/* Some pre-ANSI implementations (e.g. SunOS 4)
+ need stderr defined if assertion checking is enabled. */
+#include <stdio.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "intprops.h"
+
+static strtol_error
+bkm_scale (__strtol_t *x, int scale_factor)
+{
+ if (TYPE_SIGNED (__strtol_t) && *x < STRTOL_T_MINIMUM / scale_factor)
+ {
+ *x = STRTOL_T_MINIMUM;
+ return LONGINT_OVERFLOW;
+ }
+ if (STRTOL_T_MAXIMUM / scale_factor < *x)
+ {
+ *x = STRTOL_T_MAXIMUM;
+ return LONGINT_OVERFLOW;
+ }
+ *x *= scale_factor;
+ return LONGINT_OK;
+}
+
+static strtol_error
+bkm_scale_by_power (__strtol_t *x, int base, int power)
+{
+ strtol_error err = LONGINT_OK;
+ while (power--)
+ err |= bkm_scale (x, base);
+ return err;
+}
+
+/* FIXME: comment. */
+
+strtol_error
+__xstrtol (const char *s, char **ptr, int strtol_base,
+ __strtol_t *val, const char *valid_suffixes)
+{
+ char *t_ptr;
+ char **p;
+ __strtol_t tmp;
+ strtol_error err = LONGINT_OK;
+
+ assert (0 <= strtol_base && strtol_base <= 36);
+
+ p = (ptr ? ptr : &t_ptr);
+
+ if (! TYPE_SIGNED (__strtol_t))
+ {
+ const char *q = s;
+ unsigned char ch = *q;
+ while (isspace (ch))
+ ch = *++q;
+ if (ch == '-')
+ return LONGINT_INVALID;
+ }
+
+ errno = 0;
+ tmp = __strtol (s, p, strtol_base);
+
+ if (*p == s)
+ {
+ /* If there is no number but there is a valid suffix, assume the
+ number is 1. The string is invalid otherwise. */
+ if (valid_suffixes && **p && strchr (valid_suffixes, **p))
+ tmp = 1;
+ else
+ return LONGINT_INVALID;
+ }
+ else if (errno != 0)
+ {
+ if (errno != ERANGE)
+ return LONGINT_INVALID;
+ err = LONGINT_OVERFLOW;
+ }
+
+ /* Let valid_suffixes == NULL mean `allow any suffix'. */
+ /* FIXME: update all callers except the ones that allow suffixes
+ after the number, changing last parameter NULL to `""'. */
+ if (!valid_suffixes)
+ {
+ *val = tmp;
+ return err;
+ }
+
+ if (**p != '\0')
+ {
+ int base = 1024;
+ int suffixes = 1;
+ strtol_error overflow;
+
+ if (!strchr (valid_suffixes, **p))
+ {
+ *val = tmp;
+ return err | LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ if (strchr (valid_suffixes, '0'))
+ {
+ /* The ``valid suffix'' '0' is a special flag meaning that
+ an optional second suffix is allowed, which can change
+ the base. A suffix "B" (e.g. "100MB") stands for a power
+ of 1000, whereas a suffix "iB" (e.g. "100MiB") stands for
+ a power of 1024. If no suffix (e.g. "100M"), assume
+ power-of-1024. */
+
+ switch (p[0][1])
+ {
+ case 'i':
+ if (p[0][2] == 'B')
+ suffixes += 2;
+ break;
+
+ case 'B':
+ case 'D': /* 'D' is obsolescent */
+ base = 1000;
+ suffixes++;
+ break;
+ }
+ }
+
+ switch (**p)
+ {
+ case 'b':
+ overflow = bkm_scale (&tmp, 512);
+ break;
+
+ case 'B':
+ overflow = bkm_scale (&tmp, 1024);
+ break;
+
+ case 'c':
+ overflow = 0;
+ break;
+
+ case 'E': /* exa or exbi */
+ overflow = bkm_scale_by_power (&tmp, base, 6);
+ break;
+
+ case 'G': /* giga or gibi */
+ case 'g': /* 'g' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 3);
+ break;
+
+ case 'k': /* kilo */
+ case 'K': /* kibi */
+ overflow = bkm_scale_by_power (&tmp, base, 1);
+ break;
+
+ case 'M': /* mega or mebi */
+ case 'm': /* 'm' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 2);
+ break;
+
+ case 'P': /* peta or pebi */
+ overflow = bkm_scale_by_power (&tmp, base, 5);
+ break;
+
+ case 'T': /* tera or tebi */
+ case 't': /* 't' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 4);
+ break;
+
+ case 'w':
+ overflow = bkm_scale (&tmp, 2);
+ break;
+
+ case 'Y': /* yotta or 2**80 */
+ overflow = bkm_scale_by_power (&tmp, base, 8);
+ break;
+
+ case 'Z': /* zetta or 2**70 */
+ overflow = bkm_scale_by_power (&tmp, base, 7);
+ break;
+
+ default:
+ *val = tmp;
+ return err | LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ err |= overflow;
+ *p += suffixes;
+ if (**p)
+ err |= LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ *val = tmp;
+ return err;
+}
diff --git a/gnulib/lib/xstrtol.h b/gnulib/lib/xstrtol.h
new file mode 100644
index 00000000..3a94a9c6
--- /dev/null
+++ b/gnulib/lib/xstrtol.h
@@ -0,0 +1,83 @@
+/* A more useful interface to strtol.
+
+ Copyright (C) 1995-1996, 1998-1999, 2001-2004, 2006-2010 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/>. */
+
+#ifndef XSTRTOL_H_
+# define XSTRTOL_H_ 1
+
+# include <getopt.h>
+# include <inttypes.h>
+
+# ifndef _STRTOL_ERROR
+enum strtol_error
+ {
+ LONGINT_OK = 0,
+
+ /* These two values can be ORed together, to indicate that both
+ errors occurred. */
+ LONGINT_OVERFLOW = 1,
+ LONGINT_INVALID_SUFFIX_CHAR = 2,
+
+ LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW = (LONGINT_INVALID_SUFFIX_CHAR
+ | LONGINT_OVERFLOW),
+ LONGINT_INVALID = 4
+ };
+typedef enum strtol_error strtol_error;
+# endif
+
+# define _DECLARE_XSTRTOL(name, type) \
+ strtol_error name (const char *, char **, int, type *, const char *);
+_DECLARE_XSTRTOL (xstrtol, long int)
+_DECLARE_XSTRTOL (xstrtoul, unsigned long int)
+_DECLARE_XSTRTOL (xstrtoimax, intmax_t)
+_DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
+
+#if HAVE_LONG_LONG_INT
+_DECLARE_XSTRTOL (xstrtoll, long long int)
+_DECLARE_XSTRTOL (xstrtoull, unsigned long long int)
+#endif
+
+#ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+# define __attribute__(x)
+# endif
+#endif
+
+#ifndef ATTRIBUTE_NORETURN
+# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+#endif
+
+/* Report an error for an invalid integer in an option argument.
+
+ ERR is the error code returned by one of the xstrto* functions.
+
+ Use OPT_IDX to decide whether to print the short option string "C"
+ or "-C" or a long option string derived from LONG_OPTION. OPT_IDX
+ is -2 if the short option "C" was used, without any leading "-"; it
+ is -1 if the short option "-C" was used; otherwise it is an index
+ into LONG_OPTIONS, which should have a name preceded by two '-'
+ characters.
+
+ ARG is the option-argument containing the integer.
+
+ After reporting an error, exit with a failure status. */
+
+void xstrtol_fatal (enum strtol_error,
+ int, char, struct option const *,
+ char const *) ATTRIBUTE_NORETURN;
+
+#endif /* not XSTRTOL_H_ */
diff --git a/gnulib/lib/xstrtold.c b/gnulib/lib/xstrtold.c
new file mode 100644
index 00000000..50dc6a40
--- /dev/null
+++ b/gnulib/lib/xstrtold.c
@@ -0,0 +1,2 @@
+#define LONG 1
+#include "xstrtod.c"
diff --git a/gnulib/lib/xstrtoll.c b/gnulib/lib/xstrtoll.c
new file mode 100644
index 00000000..344e5a4b
--- /dev/null
+++ b/gnulib/lib/xstrtoll.c
@@ -0,0 +1,6 @@
+#define __strtol strtoll
+#define __strtol_t long long int
+#define __xstrtol xstrtoll
+#define STRTOL_T_MINIMUM LONG_LONG_MIN
+#define STRTOL_T_MAXIMUM LONG_LONG_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xstrtoul.c b/gnulib/lib/xstrtoul.c
new file mode 100644
index 00000000..285f7b96
--- /dev/null
+++ b/gnulib/lib/xstrtoul.c
@@ -0,0 +1,6 @@
+#define __strtol strtoul
+#define __strtol_t unsigned long int
+#define __xstrtol xstrtoul
+#define STRTOL_T_MINIMUM 0
+#define STRTOL_T_MAXIMUM ULONG_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xstrtoull.c b/gnulib/lib/xstrtoull.c
new file mode 100644
index 00000000..2f2d83c3
--- /dev/null
+++ b/gnulib/lib/xstrtoull.c
@@ -0,0 +1,6 @@
+#define __strtol strtoull
+#define __strtol_t unsigned long long int
+#define __xstrtol xstrtoull
+#define STRTOL_T_MINIMUM 0
+#define STRTOL_T_MAXIMUM ULONG_LONG_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xstrtoumax.c b/gnulib/lib/xstrtoumax.c
new file mode 100644
index 00000000..9a2349f0
--- /dev/null
+++ b/gnulib/lib/xstrtoumax.c
@@ -0,0 +1,6 @@
+#define __strtol strtoumax
+#define __strtol_t uintmax_t
+#define __xstrtol xstrtoumax
+#define STRTOL_T_MINIMUM 0
+#define STRTOL_T_MAXIMUM UINTMAX_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xtime.h b/gnulib/lib/xtime.h
new file mode 100644
index 00000000..9060956c
--- /dev/null
+++ b/gnulib/lib/xtime.h
@@ -0,0 +1,86 @@
+/* xtime -- extended-resolution integer time stamps
+
+ Copyright (C) 2005, 2006, 2009, 2010 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef XTIME_H_
+# define XTIME_H_ 1
+
+/* xtime_t is a signed type used for time stamps. It is an integer
+ type that is a count of nanoseconds -- except for obsolescent hosts
+ without sufficiently-wide integers, where it is a count of
+ seconds. */
+# if HAVE_LONG_LONG_INT
+typedef long long int xtime_t;
+# define XTIME_PRECISION 1000000000
+# else
+# include <limits.h>
+typedef long int xtime_t;
+# if LONG_MAX >> 31 >> 31 == 0
+# define XTIME_PRECISION 1
+# else
+# define XTIME_PRECISION 1000000000
+# endif
+# endif
+
+/* Return an extended time value that contains S seconds and NS
+ nanoseconds, without any overflow checking. */
+static inline xtime_t
+xtime_make (xtime_t s, long int ns)
+{
+ if (XTIME_PRECISION == 1)
+ return s;
+ else
+ return XTIME_PRECISION * s + ns;
+}
+
+/* Return the number of seconds in T, which must be nonnegative. */
+static inline xtime_t
+xtime_nonnegative_sec (xtime_t t)
+{
+ return t / XTIME_PRECISION;
+}
+
+/* Return the number of seconds in T. */
+static inline xtime_t
+xtime_sec (xtime_t t)
+{
+ return (XTIME_PRECISION == 1
+ ? t
+ : t < 0
+ ? (t + XTIME_PRECISION - 1) / XTIME_PRECISION - 1
+ : xtime_nonnegative_sec (t));
+}
+
+/* Return the number of nanoseconds in T, which must be nonnegative. */
+static inline long int
+xtime_nonnegative_nsec (xtime_t t)
+{
+ return t % XTIME_PRECISION;
+}
+
+/* Return the number of nanoseconds in T. */
+static inline long int
+xtime_nsec (xtime_t t)
+{
+ long int ns = t % XTIME_PRECISION;
+ if (ns < 0)
+ ns += XTIME_PRECISION;
+ return ns;
+}
+
+#endif
diff --git a/gnulib/lib/xvasprintf.c b/gnulib/lib/xvasprintf.c
new file mode 100644
index 00000000..6a8bac4a
--- /dev/null
+++ b/gnulib/lib/xvasprintf.c
@@ -0,0 +1,110 @@
+/* vasprintf and asprintf with out-of-memory checking.
+ Copyright (C) 1999, 2002-2004, 2006-2010 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xvasprintf.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "xalloc.h"
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+static inline char *
+xstrcat (size_t argcount, va_list args)
+{
+ char *result;
+ va_list ap;
+ size_t totalsize;
+ size_t i;
+ char *p;
+
+ /* Determine the total size. */
+ totalsize = 0;
+ va_copy (ap, args);
+ for (i = argcount; i > 0; i--)
+ {
+ const char *next = va_arg (ap, const char *);
+ totalsize = xsum (totalsize, strlen (next));
+ }
+ va_end (ap);
+
+ /* Test for overflow in the summing pass above or in (totalsize + 1) below.
+ Also, don't return a string longer than INT_MAX, for consistency with
+ vasprintf(). */
+ if (totalsize == SIZE_MAX || totalsize > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return NULL;
+ }
+
+ /* Allocate and fill the result string. */
+ result = XNMALLOC (totalsize + 1, char);
+ p = result;
+ for (i = argcount; i > 0; i--)
+ {
+ const char *next = va_arg (args, const char *);
+ size_t len = strlen (next);
+ memcpy (p, next, len);
+ p += len;
+ }
+ *p = '\0';
+
+ return result;
+}
+
+char *
+xvasprintf (const char *format, va_list args)
+{
+ char *result;
+
+ /* Recognize the special case format = "%s...%s". It is a frequently used
+ idiom for string concatenation and needs to be fast. We don't want to
+ have a separate function xstrcat() for this purpose. */
+ {
+ size_t argcount = 0;
+ const char *f;
+
+ for (f = format;;)
+ {
+ if (*f == '\0')
+ /* Recognized the special case of string concatenation. */
+ return xstrcat (argcount, args);
+ if (*f != '%')
+ break;
+ f++;
+ if (*f != 's')
+ break;
+ f++;
+ argcount++;
+ }
+ }
+
+ if (vasprintf (&result, format, args) < 0)
+ {
+ if (errno == ENOMEM)
+ xalloc_die ();
+ return NULL;
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/xvasprintf.h b/gnulib/lib/xvasprintf.h
new file mode 100644
index 00000000..4f3b1360
--- /dev/null
+++ b/gnulib/lib/xvasprintf.h
@@ -0,0 +1,55 @@
+/* vasprintf and asprintf with out-of-memory checking.
+ Copyright (C) 2002-2004, 2006-2010 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/>. */
+
+#ifndef _XVASPRINTF_H
+#define _XVASPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+#ifndef __attribute__
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable __attribute__ only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(Spec) /* empty */
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc(),
+ and return it. Upon [ENOMEM] memory allocation error, call xalloc_die.
+ On some other error
+ - [EOVERFLOW] resulting string length is > INT_MAX,
+ - [EINVAL] invalid format string,
+ - [EILSEQ] error during conversion between wide and multibyte characters,
+ return NULL. */
+extern char *xasprintf (const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 1, 2)));
+extern char *xvasprintf (const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 1, 0)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _XVASPRINTF_H */
diff --git a/gnulib/lib/yesno.c b/gnulib/lib/yesno.c
new file mode 100644
index 00000000..fb5ef366
--- /dev/null
+++ b/gnulib/lib/yesno.c
@@ -0,0 +1,60 @@
+/* yesno.c -- read a yes/no response from stdin
+
+ Copyright (C) 1990, 1998, 2001, 2003-2010 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/>. */
+
+#include <config.h>
+
+#include "yesno.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+/* Return true if we read an affirmative line from standard input.
+
+ Since this function uses stdin, it is suggested that the caller not
+ use STDIN_FILENO directly, and also that the line
+ atexit(close_stdin) be added to main(). */
+
+bool
+yesno (void)
+{
+ bool yes;
+
+#if ENABLE_NLS
+ char *response = NULL;
+ size_t response_size = 0;
+ ssize_t response_len = getline (&response, &response_size, stdin);
+
+ if (response_len <= 0)
+ yes = false;
+ else
+ {
+ response[response_len - 1] = '\0';
+ yes = (0 < rpmatch (response));
+ }
+
+ free (response);
+#else
+ /* Test against "^[yY]", hardcoded to avoid requiring getline,
+ regex, and rpmatch. */
+ int c = getchar ();
+ yes = (c == 'y' || c == 'Y');
+ while (c != '\n' && c != EOF)
+ c = getchar ();
+#endif
+
+ return yes;
+}
diff --git a/gnulib/lib/yesno.h b/gnulib/lib/yesno.h
new file mode 100644
index 00000000..8be63009
--- /dev/null
+++ b/gnulib/lib/yesno.h
@@ -0,0 +1,24 @@
+/* declare yesno
+ Copyright (C) 2004, 2009-2010 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/>. */
+
+#ifndef YESNO_H_
+# define YESNO_H_
+
+# include <stdbool.h>
+
+bool yesno (void);
+
+#endif
diff --git a/gnulib/m4/.cvsignore b/gnulib/m4/.cvsignore
new file mode 100644
index 00000000..66dba33a
--- /dev/null
+++ b/gnulib/m4/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+jm-glibc-io.m4
diff --git a/gnulib/m4/00gnulib.m4 b/gnulib/m4/00gnulib.m4
new file mode 100644
index 00000000..301469b3
--- /dev/null
+++ b/gnulib/m4/00gnulib.m4
@@ -0,0 +1,30 @@
+# 00gnulib.m4 serial 2
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This file must be named something that sorts before all other
+dnl gnulib-provided .m4 files. It is needed until such time as we can
+dnl assume Autoconf 2.64, with its improved AC_DEFUN_ONCE semantics.
+
+# AC_DEFUN_ONCE([NAME], VALUE)
+# ----------------------------
+# Define NAME to expand to VALUE on the first use (whether by direct
+# expansion, or by AC_REQUIRE), and to nothing on all subsequent uses.
+# Avoid bugs in AC_REQUIRE in Autoconf 2.63 and earlier. This
+# definition is slower than the version in Autoconf 2.64, because it
+# can only use interfaces that existed since 2.59; but it achieves the
+# same effect. Quoting is necessary to avoid confusing Automake.
+m4_version_prereq([2.63.263], [],
+[m4_define([AC][_DEFUN_ONCE],
+ [AC][_DEFUN([$1],
+ [AC_REQUIRE([_gl_DEFUN_ONCE([$1])],
+ [m4_indir([_gl_DEFUN_ONCE([$1])])])])]dnl
+[AC][_DEFUN([_gl_DEFUN_ONCE([$1])], [$2])])])
+
+# gl_00GNULIB
+# -----------
+# Witness macro that this file has been included. Needed to force
+# Automake to include this file prior to all other gnulib .m4 files.
+AC_DEFUN([gl_00GNULIB])
diff --git a/gnulib/m4/README b/gnulib/m4/README
new file mode 100644
index 00000000..964c5981
--- /dev/null
+++ b/gnulib/m4/README
@@ -0,0 +1,85 @@
+Many of the files in this directory are shared between the coreutils,
+diffutils, tar and gettext packages -- and others, so if you
+change them, try to ensure that you don't break those packages.
+That's hard without a systematic approach, but here is a set of conventions
+that makes it easy.
+
+- The lib/ sources are split into modules. Usually the module of a
+ lib/foo.h and lib/foo.c is called "foo" - not unexpected, hey! -, but
+ in more ambiguous cases you can look up the module a file belongs to
+ by doing "grep lib/foo.c modules/*".
+
+- For every module there is an autoconf macro file, usually called
+ m4/foo.m4 according to the module name. When you modify lib/foo.h or
+ lib/foo.c, remember to modify m4/foo.m4 as well!
+ What if you don't find m4/foo.m4? This probably means that the module
+ doesn't need autoconf support up to now (again, take a look in modules/*).
+ So you might need to create one.
+
+- A module which defines a replacement function (i.e. a function which is
+ compiled only on systems which lack it or where it exists but doesn't
+ work satisfactorily) has a .m4 file with typically the following structure:
+
+ AC_DEFUN([gl_FUNC_FOO],
+ [
+ AC_REPLACE_FUNCS(foo)
+ if test $ac_cv_func_foo = no; then
+ gl_PREREQ_FOO
+ fi
+ ])
+
+ # Prerequisites of lib/foo.c.
+ AC_DEFUN([gl_PREREQ_FOO], [
+ dnl Many AC_CHECK_* invocations.
+ ])
+
+- A module which is compiled on all platforms can define multiple functions
+ and be spread across multiple source files (although each time you do
+ this you should consider splitting the module, if the source files could
+ be independent). The .m4 file has typically the following structure:
+
+ AC_DEFUN([gl_FOO],
+ [
+ dnl Prerequisites of lib/foo.c.
+ dnl Many AC_CHECK_* invocations.
+
+ dnl Prerequisites of lib/foobar.c.
+ dnl Many AC_CHECK_* invocations.
+ ])
+
+- When a module FOO depends on a module BAR, you do *not* generally need
+ to write
+
+ AC_DEFUN([gl_FOO],
+ [
+ AC_REQUIRE([gl_BAR])
+ ...
+ ])
+
+ because the maintainers might want to use locally modified / renamed copies
+ of the module BAR.
+
+- If the autoconf tests for the modules FOO and BAR have some checks in
+ common, still list them separately. Autoconf has two mechanisms for
+ avoiding that a configure file runs the same test twice: AC_REQUIRE
+ and AC_CACHE_CHECK. Trying to omit the checks leads to maintenance
+ problems: If FOO depends on BAR, and you omit a check from FOO's .m4 file,
+ later on, when someone modifies bar.c and removes the check from bar.m4,
+ he will not remember that foo.c needs the check as well.
+
+- Now, how can you find the prerequisites of lib/foo.c? Try this:
+ "grep '#.*if' lib/foo.c | grep -v endif"
+ and for each HAVE_* macro search in the autoconf documentation what could
+ be the autoconf macro that provides it. This is only an approximation; in
+ general you should look at all preprocessor directives in lib/foo.c.
+
+- After ANY modifications of an m4 file, you should increment its serial
+ number (in the first line). Also, if this first line features a particular
+ release, _remove_ this release stamp. Example: Change
+
+ # setenv.m4 serial 2 (gettext-0.11.1)
+
+ into
+
+ # setenv.m4 serial 3
+
diff --git a/gnulib/m4/absolute-header.m4 b/gnulib/m4/absolute-header.m4
new file mode 100644
index 00000000..87b0961f
--- /dev/null
+++ b/gnulib/m4/absolute-header.m4
@@ -0,0 +1,65 @@
+# absolute-header.m4 serial 11
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Derek Price.
+
+# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
+# ---------------------------------------
+# Find the absolute name of a header file, assuming the header exists.
+# If the header were sys/inttypes.h, this macro would define
+# ABSOLUTE_SYS_INTTYPES_H to the `""' quoted absolute name of sys/inttypes.h
+# in config.h
+# (e.g. `#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use `""', not `<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+AC_DEFUN([gl_ABSOLUTE_HEADER],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_PREPROC_REQUIRE()dnl
+m4_foreach_w([gl_HEADER_NAME], [$1],
+ [AS_VAR_PUSHDEF([gl_absolute_header],
+ [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
+ AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+ m4_defn([gl_absolute_header]),
+ [AS_VAR_PUSHDEF([ac_header_exists],
+ [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
+ AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
+ if test AS_VAR_GET(ac_header_exists) = yes; then
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote(m4_defn([gl_HEADER_NAME]))[[>]])])
+ dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
+ dnl that contain only a #include of other header files and no
+ dnl non-comment tokens of their own. This leads to a failure to
+ dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
+ dnl and others. The workaround is to force preservation of comments
+ dnl through option -C. This ensures all necessary #line directives
+ dnl are present. GCC supports option -C as well.
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+ dnl eval is necessary to expand gl_absname_cpp.
+ dnl Ultrix and Pyramid sh refuse to redirect output of eval,
+ dnl so use subshell.
+ AS_VAR_SET(gl_absolute_header,
+[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
+sed -n '\#/]m4_defn([gl_HEADER_NAME])[#{
+ s#.*"\(.*/]m4_defn([gl_HEADER_NAME])[\)".*#\1#
+ s#^/[^/]#//&#
+ p
+ q
+}'`])
+ fi
+ AS_VAR_POPDEF([ac_header_exists])dnl
+ ])dnl
+ AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
+ ["AS_VAR_GET(gl_absolute_header)"],
+ [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
+ AS_VAR_POPDEF([gl_absolute_header])dnl
+])dnl
+])# gl_ABSOLUTE_HEADER
diff --git a/gnulib/m4/accept4.m4 b/gnulib/m4/accept4.m4
new file mode 100644
index 00000000..0839a13b
--- /dev/null
+++ b/gnulib/m4/accept4.m4
@@ -0,0 +1,18 @@
+# accept4.m4 serial 2
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ACCEPT4],
+[
+ AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+
+ dnl Persuade glibc <sys/socket.h> to declare accept4().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([accept4])
+ if test $ac_cv_func_accept4 != yes; then
+ HAVE_ACCEPT4=0
+ fi
+])
diff --git a/gnulib/m4/acl.m4 b/gnulib/m4/acl.m4
new file mode 100644
index 00000000..03c0f107
--- /dev/null
+++ b/gnulib/m4/acl.m4
@@ -0,0 +1,153 @@
+# acl.m4 - check for access control list (ACL) primitives
+# serial 9
+
+# Copyright (C) 2002, 2004-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Paul Eggert and Jim Meyering.
+
+AC_DEFUN([gl_FUNC_ACL],
+[
+ AC_ARG_ENABLE([acl],
+ AS_HELP_STRING([--disable-acl], [do not support ACLs]),
+ , [enable_acl=auto])
+
+ LIB_ACL=
+ use_acl=0
+ AC_REQUIRE([AC_C_INLINE])
+ if test "x$enable_acl" != "xno"; then
+ dnl On all platforms, the ACL related API is declared in <sys/acl.h>.
+ AC_CHECK_HEADERS([sys/acl.h])
+ if test $ac_cv_header_sys_acl_h = yes; then
+ ac_save_LIBS=$LIBS
+
+ dnl Test for POSIX-draft-like API (Linux, FreeBSD, MacOS X, IRIX, Tru64).
+ dnl -lacl is needed on Linux, -lpacl is needed on OSF/1.
+ if test $use_acl = 0; then
+ AC_SEARCH_LIBS([acl_get_file], [acl pacl],
+ [if test "$ac_cv_search_acl_get_file" != "none required"; then
+ LIB_ACL=$ac_cv_search_acl_get_file
+ fi
+ AC_CHECK_FUNCS(
+ [acl_get_file acl_get_fd acl_set_file acl_set_fd \
+ acl_free acl_from_mode acl_from_text \
+ acl_delete_def_file acl_extended_file \
+ acl_delete_fd_np acl_delete_file_np \
+ acl_copy_ext_native acl_create_entry_np \
+ acl_to_short_text acl_free_text])
+ # If the acl_get_file bug is detected, don't enable the ACL support.
+ gl_ACL_GET_FILE([use_acl=1], [])
+ if test $use_acl = 1; then
+ dnl On Linux, additional API is declared in <acl/libacl.h>.
+ AC_CHECK_HEADERS([acl/libacl.h])
+ AC_REPLACE_FUNCS([acl_entries])
+ AC_CACHE_CHECK([for ACL_FIRST_ENTRY],
+ [gl_cv_acl_ACL_FIRST_ENTRY],
+ [AC_COMPILE_IFELSE(
+[[#include <sys/types.h>
+#include <sys/acl.h>
+int type = ACL_FIRST_ENTRY;]],
+ [gl_cv_acl_ACL_FIRST_ENTRY=yes],
+ [gl_cv_acl_ACL_FIRST_ENTRY=no])])
+ if test $gl_cv_acl_ACL_FIRST_ENTRY = yes; then
+ AC_DEFINE([HAVE_ACL_FIRST_ENTRY], [1],
+ [Define to 1 if the constant ACL_FIRST_ENTRY exists.])
+ fi
+ dnl On MacOS X, other types of ACLs are supported.
+ AC_CACHE_CHECK([for ACL_TYPE_EXTENDED],
+ [gl_cv_acl_ACL_TYPE_EXTENDED],
+ [AC_COMPILE_IFELSE(
+[[#include <sys/types.h>
+#include <sys/acl.h>
+int type = ACL_TYPE_EXTENDED;]],
+ [gl_cv_acl_ACL_TYPE_EXTENDED=yes],
+ [gl_cv_acl_ACL_TYPE_EXTENDED=no])])
+ if test $gl_cv_acl_ACL_TYPE_EXTENDED = yes; then
+ AC_DEFINE([HAVE_ACL_TYPE_EXTENDED], [1],
+ [Define to 1 if the ACL type ACL_TYPE_EXTENDED exists.])
+ fi
+ else
+ LIB_ACL=
+ fi
+ ])
+ fi
+
+ dnl Test for Solaris API (Solaris, Cygwin).
+ if test $use_acl = 0; then
+ AC_CHECK_FUNCS([acl])
+ if test $ac_cv_func_acl = yes; then
+ AC_SEARCH_LIBS([acl_trivial], [sec],
+ [if test "$ac_cv_search_acl_trivial" != "none required"; then
+ LIB_ACL=$ac_cv_search_acl_trivial
+ fi
+ ])
+ AC_CHECK_FUNCS([acl_trivial])
+ use_acl=1
+ fi
+ fi
+
+ dnl Test for HP-UX API.
+ if test $use_acl = 0 || test "$ac_cv_func_acl" = yes; then
+ AC_CHECK_FUNCS([getacl])
+ if test $ac_cv_func_getacl = yes; then
+ use_acl=1
+ fi
+ fi
+
+ dnl Test for AIX API (AIX 5.3 or newer).
+ if test $use_acl = 0; then
+ AC_CHECK_FUNCS([aclx_get])
+ if test $ac_cv_func_aclx_get = yes; then
+ use_acl=1
+ fi
+ fi
+
+ dnl Test for older AIX API.
+ if test $use_acl = 0 || test "$ac_cv_func_aclx_get" = yes; then
+ AC_CHECK_FUNCS([statacl])
+ if test $ac_cv_func_statacl = yes; then
+ use_acl=1
+ fi
+ fi
+
+ LIBS=$ac_save_LIBS
+ fi
+ if test "x$enable_acl$use_acl" = "xyes0"; then
+ AC_MSG_ERROR([ACLs enabled but support not detected])
+ elif test "x$enable_acl$use_acl" = "xauto0"; then
+ AC_MSG_WARN([libacl development library was not found or not usable.])
+ AC_MSG_WARN([AC_PACKAGE_NAME will be built without ACL support.])
+ fi
+ fi
+ AC_SUBST([LIB_ACL])
+ AC_DEFINE_UNQUOTED([USE_ACL], [$use_acl],
+ [Define to nonzero if you want access control list support.])
+ USE_ACL=$use_acl
+ AC_SUBST([USE_ACL])
+])
+
+# gl_ACL_GET_FILE(IF-WORKS, IF-NOT)
+# -------------------------------------
+# If `acl_get_file' works (does not have a particular bug),
+# run IF-WORKS, otherwise, IF-NOT.
+# This tests for a Darwin 8.7.0 bug, whereby acl_get_file returns NULL,
+# but sets errno = ENOENT for an existing file or directory.
+AC_DEFUN([gl_ACL_GET_FILE],
+[
+ AC_CACHE_CHECK([for working acl_get_file], [gl_cv_func_working_acl_get_file],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/acl.h>
+ #include <errno.h>
+ ]],
+ [[return !! (!acl_get_file (".", ACL_TYPE_ACCESS)
+ && errno == ENOENT);]])],
+ [gl_cv_func_working_acl_get_file=yes],
+ [gl_cv_func_working_acl_get_file=no],
+ [gl_cv_func_working_acl_get_file=cross-compiling])])
+
+ AS_IF([test $gl_cv_func_working_acl_get_file = yes], [$1], [$2])
+])
diff --git a/gnulib/m4/acosl.m4 b/gnulib/m4/acosl.m4
new file mode 100644
index 00000000..66cbd6cd
--- /dev/null
+++ b/gnulib/m4/acosl.m4
@@ -0,0 +1,69 @@
+# acosl.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ACOSL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare acosl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ ACOSL_LIBM=
+ AC_CACHE_CHECK([whether acosl() can be used without linking with libm],
+ [gl_cv_func_acosl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return acosl (x) > 1;],
+ [gl_cv_func_acosl_no_libm=yes],
+ [gl_cv_func_acosl_no_libm=no])
+ ])
+ if test $gl_cv_func_acosl_no_libm = no; then
+ AC_CACHE_CHECK([whether acosl() can be used with libm],
+ [gl_cv_func_acosl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return acosl (x) > 1;],
+ [gl_cv_func_acosl_in_libm=yes],
+ [gl_cv_func_acosl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_acosl_in_libm = yes; then
+ ACOSL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_acosl_no_libm = yes \
+ || test $gl_cv_func_acosl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has acosl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([acosl], , [HAVE_DECL_ACOSL=0], [#include <math.h>])
+ else
+ HAVE_DECL_ACOSL=0
+ HAVE_ACOSL=0
+ AC_LIBOBJ([acosl])
+ AC_REQUIRE([gl_FUNC_ASINL])
+ AC_REQUIRE([gl_FUNC_SQRTL])
+ dnl Append $ASINL_LIBM to ACOSL_LIBM, avoiding gratuitous duplicates.
+ case " $ACOSL_LIBM " in
+ *" $ASINL_LIBM "*) ;;
+ *) ACOSL_LIBM="$ACOSL_LIBM $ASINL_LIBM" ;;
+ esac
+ dnl Append $SQRTL_LIBM to ACOSL_LIBM, avoiding gratuitous duplicates.
+ case " $ACOSL_LIBM " in
+ *" $SQRTL_LIBM "*) ;;
+ *) ACOSL_LIBM="$ACOSL_LIBM $SQRTL_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([ACOSL_LIBM])
+])
diff --git a/gnulib/m4/afs.m4 b/gnulib/m4/afs.m4
new file mode 100644
index 00000000..e7ebafae
--- /dev/null
+++ b/gnulib/m4/afs.m4
@@ -0,0 +1,17 @@
+# serial 10
+
+# Copyright (C) 1999-2001, 2004, 2008-2010 Free Software Foundation, Inc.
+# This file 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.
+
+AC_DEFUN([gl_AFS],
+ [
+ AC_ARG_WITH([afs],
+ AS_HELP_STRING([--with-afs],
+ [support for the Andrew File System [[default=no]]]),
+ test "$withval" = no || with_afs=yes, with_afs=no)
+ if test "$with_afs" = yes; then
+ AC_DEFINE([AFS], [1], [Define if you have the Andrew File System.])
+ fi
+ ])
diff --git a/gnulib/m4/alloca.m4 b/gnulib/m4/alloca.m4
new file mode 100644
index 00000000..f3ee3438
--- /dev/null
+++ b/gnulib/m4/alloca.m4
@@ -0,0 +1,47 @@
+# alloca.m4 serial 9
+dnl Copyright (C) 2002-2004, 2006-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ALLOCA],
+[
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ if test $ac_cv_func_alloca_works = no; then
+ gl_PREREQ_ALLOCA
+ fi
+
+ # Define an additional variable used in the Makefile substitution.
+ if test $ac_cv_working_alloca_h = yes; then
+ AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [
+ AC_EGREP_CPP([Need own alloca], [
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+ Need own alloca
+#endif
+ ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no])
+ ])
+ if test $gl_cv_rpl_alloca = yes; then
+ dnl OK, alloca can be implemented through a compiler built-in.
+ AC_DEFINE([HAVE_ALLOCA], [1],
+ [Define to 1 if you have 'alloca' after including <alloca.h>,
+ a header that may be supplied by this distribution.])
+ ALLOCA_H=alloca.h
+ else
+ dnl alloca exists as a library function, i.e. it is slow and probably
+ dnl a memory leak. Don't define HAVE_ALLOCA in this case.
+ ALLOCA_H=
+ fi
+ else
+ ALLOCA_H=alloca.h
+ fi
+ AC_SUBST([ALLOCA_H])
+])
+
+# Prerequisites of lib/alloca.c.
+# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA.
+AC_DEFUN([gl_PREREQ_ALLOCA], [:])
diff --git a/gnulib/m4/alphasort.m4 b/gnulib/m4/alphasort.m4
new file mode 100644
index 00000000..d160b5c3
--- /dev/null
+++ b/gnulib/m4/alphasort.m4
@@ -0,0 +1,23 @@
+# alphasort.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ALPHASORT],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+ dnl Persuade glibc and Solaris <dirent.h> to declare alphasort().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS([alphasort])
+ if test $ac_cv_func_alphasort = no; then
+ HAVE_ALPHASORT=0
+ AC_LIBOBJ([alphasort])
+ gl_PREREQ_ALPHASORT
+ fi
+])
+
+# Prerequisites of lib/alphasort.c.
+AC_DEFUN([gl_PREREQ_ALPHASORT], [:])
diff --git a/gnulib/m4/arcfour.m4 b/gnulib/m4/arcfour.m4
new file mode 100644
index 00000000..20ef5152
--- /dev/null
+++ b/gnulib/m4/arcfour.m4
@@ -0,0 +1,10 @@
+# arcfour.m4 serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ARCFOUR],
+[
+ AC_LIBOBJ([arcfour])
+])
diff --git a/gnulib/m4/arctwo.m4 b/gnulib/m4/arctwo.m4
new file mode 100644
index 00000000..5b659482
--- /dev/null
+++ b/gnulib/m4/arctwo.m4
@@ -0,0 +1,12 @@
+# arctwo.m4 serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ARCTWO],
+[
+ AC_LIBOBJ([arctwo])
+ # Prerequisites of lib/arctwo.c.
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/argmatch.m4 b/gnulib/m4/argmatch.m4
new file mode 100644
index 00000000..510fef9e
--- /dev/null
+++ b/gnulib/m4/argmatch.m4
@@ -0,0 +1,10 @@
+#serial 3
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ARGMATCH],
+[
+ AC_LIBOBJ([argmatch])
+])
diff --git a/gnulib/m4/argp.m4 b/gnulib/m4/argp.m4
new file mode 100644
index 00000000..819425bb
--- /dev/null
+++ b/gnulib/m4/argp.m4
@@ -0,0 +1,65 @@
+# argp.m4 serial 10
+dnl Copyright (C) 2003-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ARGP],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl argp-parse.c depends on GNU getopt internals, therefore use GNU getopt
+ dnl always.
+ gl_REPLACE_GETOPT
+ dnl Note: gl_REPLACE_GETOPT does AC_LIBOBJ([getopt]), AC_LIBOBJ([getopt1]).
+
+ AC_CHECK_DECL([program_invocation_name],
+ [AC_DEFINE([HAVE_DECL_PROGRAM_INVOCATION_NAME], [1],
+ [Define if program_invocation_name is declared])],
+ [AC_DEFINE([GNULIB_PROGRAM_INVOCATION_NAME], [1],
+ [Define to 1 to add extern declaration of program_invocation_name to argp.h])],
+ [#include <errno.h>])
+ AC_CHECK_DECL([program_invocation_short_name],
+ [AC_DEFINE([HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME], [1],
+ [Define if program_invocation_short_name is declared])],
+ [AC_DEFINE([GNULIB_PROGRAM_INVOCATION_SHORT_NAME], [1],
+ [Define to 1 to add extern declaration of program_invocation_short_name to argp.h])],
+ [#include <errno.h>])
+
+ # Check if program_invocation_name and program_invocation_short_name
+ # are defined elsewhere. It is improbable that only one of them will
+ # be defined and other not, I prefer to stay on the safe side and to
+ # test each one separately.
+ AC_MSG_CHECKING([whether program_invocation_name is defined])
+ AC_TRY_LINK([#include <argp.h>],
+ [ program_invocation_name = "test"; ],
+ [ AC_DEFINE([HAVE_PROGRAM_INVOCATION_NAME], [1],
+ [Define if program_invocation_name is defined])
+ AC_MSG_RESULT([yes])],
+ [ AC_MSG_RESULT([no])] )
+
+ AC_MSG_CHECKING([whether program_invocation_short_name is defined])
+ AC_TRY_LINK([#include <argp.h>],
+ [ program_invocation_short_name = "test"; ],
+ [ AC_DEFINE([HAVE_PROGRAM_INVOCATION_SHORT_NAME], [1],
+ [Define if program_invocation_short_name is defined])
+ AC_MSG_RESULT([yes])],
+ [ AC_MSG_RESULT([no])] )
+
+ AC_CHECK_DECLS_ONCE([clearerr_unlocked])
+ AC_CHECK_DECLS_ONCE([feof_unlocked])
+ AC_CHECK_DECLS_ONCE([ferror_unlocked])
+ AC_CHECK_DECLS_ONCE([fflush_unlocked])
+ AC_CHECK_DECLS_ONCE([fgets_unlocked])
+ AC_CHECK_DECLS_ONCE([fputc_unlocked])
+ AC_CHECK_DECLS_ONCE([fputs_unlocked])
+ AC_CHECK_DECLS_ONCE([fread_unlocked])
+ AC_CHECK_DECLS_ONCE([fwrite_unlocked])
+ AC_CHECK_DECLS_ONCE([getc_unlocked])
+ AC_CHECK_DECLS_ONCE([getchar_unlocked])
+ AC_CHECK_DECLS_ONCE([putc_unlocked])
+ AC_CHECK_DECLS_ONCE([putchar_unlocked])
+ AC_CHECK_FUNCS_ONCE([flockfile funlockfile])
+ AC_CHECK_HEADERS_ONCE([features.h linewrap.h])
+])
diff --git a/gnulib/m4/argz.m4 b/gnulib/m4/argz.m4
new file mode 100644
index 00000000..b799fb37
--- /dev/null
+++ b/gnulib/m4/argz.m4
@@ -0,0 +1,80 @@
+# Portability macros for glibc argz. -*- Autoconf -*-
+#
+# Copyright (C) 2004-2010 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan <gary@gnu.org>
+#
+# This file 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.
+
+# serial 7 argz.m4
+
+AC_DEFUN([gl_FUNC_ARGZ],
+[gl_PREREQ_ARGZ
+
+AC_REQUIRE([AC_C_RESTRICT])
+
+AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT])
+
+AC_CHECK_TYPES([error_t],
+ [],
+ [AC_DEFINE([error_t], [int],
+ [Define to a type to use for `error_t' if it is not otherwise available.])
+ AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h
+ does not typedef error_t.])],
+ [#if defined(HAVE_ARGZ_H)
+# include <argz.h>
+#endif])
+
+ARGZ_H=
+AC_CHECK_FUNC([argz_replace], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])])
+
+dnl if have system argz functions, allow forced use of
+dnl libltdl-supplied implementation (and default to do so
+dnl on "known bad" systems). Could use a runtime check, but
+dnl (a) detecting malloc issues is notoriously unreliable
+dnl (b) only known system that declares argz functions,
+dnl provides them, yet they are broken, is cygwin
+dnl releases prior to 5-May-2007 (1.5.24 and earlier)
+dnl So, it's more straightforward simply to special case
+dnl this for known bad systems.
+AS_IF([test -z "$ARGZ_H"],
+ [AC_CACHE_CHECK(
+ [if argz actually works],
+ [lt_cv_sys_argz_works],
+ [[case $host_os in #(
+ *cygwin*)
+ lt_cv_sys_argz_works=no
+ if test "$cross_compiling" != no; then
+ lt_cv_sys_argz_works="guessing no"
+ else
+ lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/'
+ save_IFS=$IFS
+ IFS=-.
+ set x `uname -r | sed -e "$lt_sed_extract_leading_digits"`
+ IFS=$save_IFS
+ lt_os_major=${2-0}
+ lt_os_minor=${3-0}
+ lt_os_micro=${4-0}
+ if test "$lt_os_major" -gt 1 \
+ || { test "$lt_os_major" -eq 1 \
+ && { test "$lt_os_minor" -gt 5 \
+ || { test "$lt_os_minor" -eq 5 \
+ && test "$lt_os_micro" -gt 24; }; }; }; then
+ lt_cv_sys_argz_works=yes
+ fi
+ fi
+ ;; #(
+ *) lt_cv_sys_argz_works=yes ;;
+ esac]])
+ AS_IF([test $lt_cv_sys_argz_works = yes],
+ [AC_DEFINE([HAVE_WORKING_ARGZ], [1],
+ [This value is set to 1 to indicate that the system argz facility works])],
+ [ARGZ_H=argz.h
+ AC_LIBOBJ([argz])])])
+
+AC_SUBST([ARGZ_H])
+])
+
+# Prerequisites of lib/argz.c.
+AC_DEFUN([gl_PREREQ_ARGZ], [:])
diff --git a/gnulib/m4/arpa_inet_h.m4 b/gnulib/m4/arpa_inet_h.m4
new file mode 100644
index 00000000..4360dd81
--- /dev/null
+++ b/gnulib/m4/arpa_inet_h.m4
@@ -0,0 +1,57 @@
+# arpa_inet_h.m4 serial 7
+dnl Copyright (C) 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Simon Josefsson and Bruno Haible
+
+AC_DEFUN([gl_HEADER_ARPA_INET],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS])
+
+ AC_CHECK_HEADERS_ONCE([arpa/inet.h])
+ if test $ac_cv_header_arpa_inet_h = yes; then
+ HAVE_ARPA_INET_H=1
+ else
+ HAVE_ARPA_INET_H=0
+ fi
+ AC_SUBST([HAVE_ARPA_INET_H])
+ dnl <arpa/inet.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([arpa/inet.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+/* On some systems, this header is not self-consistent. */
+#ifndef __GLIBC__
+# include <sys/socket.h>
+#endif
+#include <arpa/inet.h>
+ ]], [inet_ntop inet_pton])
+])
+
+dnl Unconditionally enables the replacement of <arpa/inet.h>.
+AC_DEFUN([gl_REPLACE_ARPA_INET_H],
+[
+ dnl This is a no-op, because <arpa/inet.h> is always overridden.
+ :
+])
+
+AC_DEFUN([gl_ARPA_INET_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_ARPA_INET_H_DEFAULTS],
+[
+ GNULIB_INET_NTOP=0; AC_SUBST([GNULIB_INET_NTOP])
+ GNULIB_INET_PTON=0; AC_SUBST([GNULIB_INET_PTON])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_INET_NTOP=1; AC_SUBST([HAVE_DECL_INET_NTOP])
+ HAVE_DECL_INET_PTON=1; AC_SUBST([HAVE_DECL_INET_PTON])
+])
diff --git a/gnulib/m4/asinl.m4 b/gnulib/m4/asinl.m4
new file mode 100644
index 00000000..1f5bc6df
--- /dev/null
+++ b/gnulib/m4/asinl.m4
@@ -0,0 +1,63 @@
+# asinl.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ASINL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare asinl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ ASINL_LIBM=
+ AC_CACHE_CHECK([whether asinl() can be used without linking with libm],
+ [gl_cv_func_asinl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return asinl (x) > 1;],
+ [gl_cv_func_asinl_no_libm=yes],
+ [gl_cv_func_asinl_no_libm=no])
+ ])
+ if test $gl_cv_func_asinl_no_libm = no; then
+ AC_CACHE_CHECK([whether asinl() can be used with libm],
+ [gl_cv_func_asinl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return asinl (x) > 1;],
+ [gl_cv_func_asinl_in_libm=yes],
+ [gl_cv_func_asinl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_asinl_in_libm = yes; then
+ ASINL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_asinl_no_libm = yes \
+ || test $gl_cv_func_asinl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has asinl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([asinl], , [HAVE_DECL_ASINL=0], [#include <math.h>])
+ else
+ HAVE_DECL_ASINL=0
+ HAVE_ASINL=0
+ AC_LIBOBJ([asinl])
+ AC_REQUIRE([gl_FUNC_SQRTL])
+ dnl Append $SQRTL_LIBM to ASINL_LIBM, avoiding gratuitous duplicates.
+ case " $ASINL_LIBM " in
+ *" $SQRTL_LIBM "*) ;;
+ *) ASINL_LIBM="$ASINL_LIBM $SQRTL_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([ASINL_LIBM])
+])
diff --git a/gnulib/m4/assert.m4 b/gnulib/m4/assert.m4
new file mode 100644
index 00000000..b5b90c0d
--- /dev/null
+++ b/gnulib/m4/assert.m4
@@ -0,0 +1,24 @@
+#serial 7
+
+# Copyright (C) 1998-1999, 2001, 2004, 2008-2010 Free Software Foundation, Inc.
+# This file 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.
+
+dnl based on code from Eleftherios Gkioulekas
+dnl Autoconf 2.60 provides AC_HEADER_ASSERT for the same purpose, but
+dnl it has broken semantics for --enable-assert until 2.64.
+AC_DEFUN([gl_ASSERT],
+[
+ AC_MSG_CHECKING([whether to enable assertions])
+ AC_ARG_ENABLE([assert],
+ [AS_HELP_STRING([--disable-assert], [turn off assertions])],
+ [AS_IF([test "x$enableval" = xno],
+ [AC_DEFINE([NDEBUG], [1],
+ [Define to 1 if assertions should be disabled.])],
+ [test "x$enableval" != xyes],
+ [AC_MSG_WARN([invalid argument supplied to --enable-assert])
+ enable_assert=yes])],
+ [enable_assert=yes])
+ AC_MSG_RESULT([$enable_assert])
+])
diff --git a/gnulib/m4/atanl.m4 b/gnulib/m4/atanl.m4
new file mode 100644
index 00000000..28cf7b3a
--- /dev/null
+++ b/gnulib/m4/atanl.m4
@@ -0,0 +1,63 @@
+# atanl.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ATANL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare atanl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ ATANL_LIBM=
+ AC_CACHE_CHECK([whether atanl() can be used without linking with libm],
+ [gl_cv_func_atanl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return atanl (x) > 1;],
+ [gl_cv_func_atanl_no_libm=yes],
+ [gl_cv_func_atanl_no_libm=no])
+ ])
+ if test $gl_cv_func_atanl_no_libm = no; then
+ AC_CACHE_CHECK([whether atanl() can be used with libm],
+ [gl_cv_func_atanl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return atanl (x) > 1;],
+ [gl_cv_func_atanl_in_libm=yes],
+ [gl_cv_func_atanl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_atanl_in_libm = yes; then
+ ATANL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_atanl_no_libm = yes \
+ || test $gl_cv_func_atanl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has atanl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([atanl], , [HAVE_DECL_ATANL=0], [#include <math.h>])
+ else
+ HAVE_DECL_ATANL=0
+ HAVE_ATANL=0
+ AC_LIBOBJ([atanl])
+ AC_REQUIRE([gl_FUNC_ISNANL])
+ dnl Append $ISNANL_LIBM to ATANL_LIBM, avoiding gratuitous duplicates.
+ case " $ATANL_LIBM " in
+ *" $ISNANL_LIBM "*) ;;
+ *) ATANL_LIBM="$ATANL_LIBM $ISNANL_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([ATANL_LIBM])
+])
diff --git a/gnulib/m4/atexit.m4 b/gnulib/m4/atexit.m4
new file mode 100644
index 00000000..c01d7814
--- /dev/null
+++ b/gnulib/m4/atexit.m4
@@ -0,0 +1,18 @@
+# atexit.m4 serial 3
+dnl Copyright (C) 2002, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ATEXIT],
+[
+ AC_REPLACE_FUNCS([atexit])
+ if test $ac_cv_func_atexit = no; then
+ gl_PREREQ_ATEXIT
+ fi
+])
+
+# Prerequisites of lib/atexit.c.
+AC_DEFUN([gl_PREREQ_ATEXIT], [
+ :
+])
diff --git a/gnulib/m4/atoll.m4 b/gnulib/m4/atoll.m4
new file mode 100644
index 00000000..17a1f7e9
--- /dev/null
+++ b/gnulib/m4/atoll.m4
@@ -0,0 +1,26 @@
+# atoll.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ATOLL],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ dnl We don't need (and can't compile) the replacement strtoll
+ dnl unless the type 'long long int' exists.
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ if test "$ac_cv_type_long_long_int" = yes; then
+ AC_CHECK_FUNCS([atoll])
+ if test $ac_cv_func_atoll = no; then
+ HAVE_ATOLL=0
+ AC_LIBOBJ([atoll])
+ gl_PREREQ_ATOLL
+ fi
+ fi
+])
+
+# Prerequisites of lib/atoll.c.
+AC_DEFUN([gl_PREREQ_ATOLL], [
+ :
+])
diff --git a/gnulib/m4/autobuild.m4 b/gnulib/m4/autobuild.m4
new file mode 100644
index 00000000..93ccb546
--- /dev/null
+++ b/gnulib/m4/autobuild.m4
@@ -0,0 +1,40 @@
+# autobuild.m4 serial 7
+dnl Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson
+
+# Usage: AB_INIT([MODE]).
+AC_DEFUN([AB_INIT],
+[
+ AC_REQUIRE([AC_CANONICAL_BUILD])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ if test -z "$AB_PACKAGE"; then
+ AB_PACKAGE=${PACKAGE_NAME:-$PACKAGE}
+ fi
+ AC_MSG_NOTICE([autobuild project... $AB_PACKAGE])
+
+ if test -z "$AB_VERSION"; then
+ AB_VERSION=${PACKAGE_VERSION:-$VERSION}
+ fi
+ AC_MSG_NOTICE([autobuild revision... $AB_VERSION])
+
+ hostname=`hostname`
+ if test "$hostname"; then
+ AC_MSG_NOTICE([autobuild hostname... $hostname])
+ fi
+
+ ifelse([$1],[],,[AC_MSG_NOTICE([autobuild mode... $1])])
+
+ date=`TZ=UTC0 date +%Y%m%dT%H%M%SZ`
+ if test "$?" != 0; then
+ date=`date`
+ fi
+ if test "$date"; then
+ AC_MSG_NOTICE([autobuild timestamp... $date])
+ fi
+])
diff --git a/gnulib/m4/backupfile.m4 b/gnulib/m4/backupfile.m4
new file mode 100644
index 00000000..0725ea92
--- /dev/null
+++ b/gnulib/m4/backupfile.m4
@@ -0,0 +1,16 @@
+# backupfile.m4 serial 12
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_BACKUPFILE],
+[
+ AC_LIBOBJ([backupfile])
+
+ dnl Prerequisites of lib/backupfile.c.
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO])
+ AC_REQUIRE([gl_AC_DOS])
+ AC_REQUIRE([AC_SYS_LONG_FILE_NAMES])
+ AC_CHECK_FUNCS_ONCE([pathconf])
+])
diff --git a/gnulib/m4/base64.m4 b/gnulib/m4/base64.m4
new file mode 100644
index 00000000..d1e13522
--- /dev/null
+++ b/gnulib/m4/base64.m4
@@ -0,0 +1,16 @@
+# base64.m4 serial 3
+dnl Copyright (C) 2004, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_BASE64],
+[
+ gl_PREREQ_BASE64
+])
+
+# Prerequisites of lib/base64.c.
+AC_DEFUN([gl_PREREQ_BASE64], [
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_C_RESTRICT])
+])
diff --git a/gnulib/m4/bison-i18n.m4 b/gnulib/m4/bison-i18n.m4
new file mode 100644
index 00000000..b4850554
--- /dev/null
+++ b/gnulib/m4/bison-i18n.m4
@@ -0,0 +1,48 @@
+# bison-i18n.m4 serial 3
+dnl Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Support for internationalization of bison-generated parsers.
+
+dnl BISON_I18N
+dnl should be used in configure.ac, after AM_GNU_GETTEXT. If USE_NLS is yes, it
+dnl sets BISON_LOCALEDIR to indicate where to find the bison-runtime.mo files
+dnl and defines YYENABLE_NLS if there are bison-runtime.mo files at all.
+AC_DEFUN([BISON_I18N],
+[
+ if test -z "$USE_NLS"; then
+ echo "The BISON-I18N macro is used without being preceded by AM-GNU-GETTEXT." 1>&2
+ exit 1
+ fi
+ BISON_LOCALEDIR=
+ BISON_USE_NLS=no
+ if test "$USE_NLS" = yes; then
+ dnl Determine bison's localedir.
+ dnl AC_PROG_YACC sets the YACC variable; other macros set the BISON variable.
+ dnl But even is YACC is called "yacc", it may be a script that invokes bison
+ dnl and accepts the --print-localedir option.
+ dnl YACC's default value is empty; BISON's default value is :.
+ if (${YACC-${BISON-:}} --print-localedir) >/dev/null 2>&1; then
+ BISON_LOCALEDIR=`${YACC-${BISON-:}} --print-localedir`
+ fi
+ AC_SUBST([BISON_LOCALEDIR])
+ if test -n "$BISON_LOCALEDIR"; then
+ dnl There is no need to enable internationalization if the user doesn't
+ dnl want message catalogs. So look at the language/locale names for
+ dnl which the user wants message catalogs. This is $LINGUAS. If unset
+ dnl or empty, he wants all of them.
+ USER_LINGUAS="${LINGUAS-%UNSET%}"
+ if test -n "$USER_LINGUAS"; then
+ BISON_USE_NLS=yes
+ fi
+ fi
+ fi
+ if test $BISON_USE_NLS = yes; then
+ AC_DEFINE([YYENABLE_NLS], [1],
+ [Define to 1 to internationalize bison runtime messages.])
+ fi
+])
diff --git a/gnulib/m4/bison.m4 b/gnulib/m4/bison.m4
new file mode 100644
index 00000000..260cba6a
--- /dev/null
+++ b/gnulib/m4/bison.m4
@@ -0,0 +1,24 @@
+# serial 5
+
+# Copyright (C) 2002, 2005, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+AC_DEFUN([gl_BISON],
+[
+ # getdate.y works with bison only.
+ : ${YACC='bison -y'}
+dnl
+dnl Declaring YACC & YFLAGS precious will not be necessary after GNULIB
+dnl requires an Autoconf greater than 2.59c, but it will probably still be
+dnl useful to override the description of YACC in the --help output, re
+dnl getdate.y assuming `bison -y'.
+ AC_ARG_VAR([YACC],
+[The `Yet Another C Compiler' implementation to use. Defaults to `bison -y'.
+Values other than `bison -y' will most likely break on most systems.])dnl
+ AC_ARG_VAR([YFLAGS],
+[YFLAGS contains the list arguments that will be passed by default to Bison.
+This script will default YFLAGS to the empty string to avoid a default value of
+`-d' given by some make applications.])dnl
+])
diff --git a/gnulib/m4/btowc.m4 b/gnulib/m4/btowc.m4
new file mode 100644
index 00000000..2c75c8fb
--- /dev/null
+++ b/gnulib/m4/btowc.m4
@@ -0,0 +1,73 @@
+# btowc.m4 serial 5
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_BTOWC],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ dnl Check whether <wchar.h> is usable at all, first. Otherwise the test
+ dnl program below may lead to an endless loop. See
+ dnl <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>.
+ AC_REQUIRE([gl_WCHAR_H_INLINE_OK])
+
+ AC_CHECK_FUNCS_ONCE([btowc])
+ if test $ac_cv_func_btowc = no; then
+ HAVE_BTOWC=0
+ else
+
+ dnl IRIX 6.5 btowc(EOF) is 0xFF, not WEOF.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether btowc(EOF) is correct],
+ [gl_cv_func_btowc_eof],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on IRIX.
+ irix*) gl_cv_func_btowc_eof="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_btowc_eof="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ if (btowc (EOF) != WEOF)
+ return 1;
+ }
+ return 0;
+}],
+ [gl_cv_func_btowc_eof=yes],
+ [gl_cv_func_btowc_eof=no],
+ [:])
+ fi
+ ])
+ case "$gl_cv_func_btowc_eof" in
+ *yes) ;;
+ *) REPLACE_BTOWC=1 ;;
+ esac
+ fi
+ if test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([btowc])
+ gl_PREREQ_BTOWC
+ fi
+])
+
+# Prerequisites of lib/btowc.c.
+AC_DEFUN([gl_PREREQ_BTOWC], [
+ :
+])
diff --git a/gnulib/m4/byteswap.m4 b/gnulib/m4/byteswap.m4
new file mode 100644
index 00000000..2afd6a2a
--- /dev/null
+++ b/gnulib/m4/byteswap.m4
@@ -0,0 +1,18 @@
+# byteswap.m4 serial 3
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Oskar Liljeblad.
+
+AC_DEFUN([gl_BYTESWAP],
+[
+ dnl Prerequisites of lib/byteswap.in.h.
+ AC_CHECK_HEADERS([byteswap.h], [
+ BYTESWAP_H=''
+ ], [
+ BYTESWAP_H='byteswap.h'
+ ])
+ AC_SUBST([BYTESWAP_H])
+])
diff --git a/gnulib/m4/c-stack.m4 b/gnulib/m4/c-stack.m4
new file mode 100644
index 00000000..634f4440
--- /dev/null
+++ b/gnulib/m4/c-stack.m4
@@ -0,0 +1,349 @@
+# Check prerequisites for compiling lib/c-stack.c.
+
+# Copyright (C) 2002, 2003, 2004, 2008, 2009, 2010 Free Software Foundation,
+# Inc.
+# This file 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.
+
+# Written by Paul Eggert.
+
+# serial 10
+
+AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
+ [# for STACK_DIRECTION
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([setrlimit])
+ AC_CHECK_HEADERS_ONCE([ucontext.h])
+
+ dnl List of signals that are sent when an invalid virtual memory address
+ dnl is accessed, or when the stack overflows.
+ dnl Either { SIGSEGV } or { SIGSEGV, SIGBUS }.
+ case "$host_os" in
+ sunos4* | freebsd* | dragonfly* | openbsd* | netbsd* | kfreebsd* | knetbsd*) # BSD systems
+ FAULT_YIELDS_SIGBUS=1 ;;
+ hpux*) # HP-UX
+ FAULT_YIELDS_SIGBUS=1 ;;
+ macos* | darwin*) # MacOS X
+ FAULT_YIELDS_SIGBUS=1 ;;
+ gnu*) # Hurd
+ FAULT_YIELDS_SIGBUS=1 ;;
+ *)
+ FAULT_YIELDS_SIGBUS=0 ;;
+ esac
+ AC_DEFINE_UNQUOTED([FAULT_YIELDS_SIGBUS], [$FAULT_YIELDS_SIGBUS],
+ [Define to 1 if an invalid memory address access may yield a SIGBUS.])
+
+ AC_CACHE_CHECK([for working C stack overflow detection],
+ [ac_cv_sys_stack_overflow_works],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE(
+ [[
+ #include <unistd.h>
+ #include <signal.h>
+ #if HAVE_SETRLIMIT
+ # include <sys/types.h>
+ # include <sys/time.h>
+ # include <sys/resource.h>
+ #endif
+ #ifndef SIGSTKSZ
+ # define SIGSTKSZ 16384
+ #endif
+
+ static union
+ {
+ char buffer[2 * SIGSTKSZ];
+ long double ld;
+ long u;
+ void *p;
+ } alternate_signal_stack;
+
+ static void
+ segv_handler (int signo)
+ {
+ _exit (0);
+ }
+
+ static int
+ c_stack_action ()
+ {
+ stack_t st;
+ struct sigaction act;
+ int r;
+
+ st.ss_flags = 0;
+ /* Use the midpoint to avoid Irix sigaltstack bug. */
+ st.ss_sp = alternate_signal_stack.buffer + SIGSTKSZ;
+ st.ss_size = SIGSTKSZ;
+ r = sigaltstack (&st, 0);
+ if (r != 0)
+ return r;
+
+ sigemptyset (&act.sa_mask);
+ act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
+ act.sa_handler = segv_handler;
+ #if FAULT_YIELDS_SIGBUS
+ if (sigaction (SIGBUS, &act, 0) < 0)
+ return -1;
+ #endif
+ return sigaction (SIGSEGV, &act, 0);
+ }
+ static volatile int *
+ recurse_1 (volatile int n, volatile int *p)
+ {
+ if (n >= 0)
+ *recurse_1 (n + 1, p) += n;
+ return p;
+ }
+ static int
+ recurse (volatile int n)
+ {
+ int sum = 0;
+ return *recurse_1 (n, &sum);
+ }
+ int
+ main ()
+ {
+ #if HAVE_SETRLIMIT && defined RLIMIT_STACK
+ /* Before starting the endless recursion, try to be friendly
+ to the user's machine. On some Linux 2.2.x systems, there
+ is no stack limit for user processes at all. We don't want
+ to kill such systems. */
+ struct rlimit rl;
+ rl.rlim_cur = rl.rlim_max = 0x100000; /* 1 MB */
+ setrlimit (RLIMIT_STACK, &rl);
+ #endif
+
+ return c_stack_action () || recurse (0);
+ }
+ ]])],
+ [ac_cv_sys_stack_overflow_works=yes],
+ [ac_cv_sys_stack_overflow_works=no],
+ [ac_cv_sys_stack_overflow_works=cross-compiling])])
+
+ if test $ac_cv_sys_stack_overflow_works = yes; then
+ AC_DEFINE([HAVE_STACK_OVERFLOW_HANDLING], [1],
+ [Define to 1 if extending the stack slightly past the limit causes
+ a SIGSEGV which can be handled on an alternate stack established
+ with sigaltstack.])
+
+ dnl The ss_sp field of a stack_t is, according to POSIX, the lowest address
+ dnl of the memory block designated as an alternate stack. But IRIX 5.3
+ dnl interprets it as the highest address!
+ AC_CACHE_CHECK([for correct stack_t interpretation],
+ [gl_cv_sigaltstack_low_base], [
+ AC_RUN_IFELSE([
+ AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <signal.h>
+#if HAVE_SYS_SIGNAL_H
+# include <sys/signal.h>
+#endif
+#ifndef SIGSTKSZ
+# define SIGSTKSZ 16384
+#endif
+volatile char *stack_lower_bound;
+volatile char *stack_upper_bound;
+static void check_stack_location (volatile char *addr)
+{
+ if (addr >= stack_lower_bound && addr <= stack_upper_bound)
+ exit (0);
+ else
+ exit (1);
+}
+static void stackoverflow_handler (int sig)
+{
+ char dummy;
+ check_stack_location (&dummy);
+}
+int main ()
+{
+ char mystack[2 * SIGSTKSZ];
+ stack_t altstack;
+ struct sigaction action;
+ /* Install the alternate stack. */
+ altstack.ss_sp = mystack + SIGSTKSZ;
+ altstack.ss_size = SIGSTKSZ;
+ stack_lower_bound = (char *) altstack.ss_sp;
+ stack_upper_bound = (char *) altstack.ss_sp + altstack.ss_size - 1;
+ altstack.ss_flags = 0; /* no SS_DISABLE */
+ if (sigaltstack (&altstack, NULL) < 0)
+ exit (2);
+ /* Install the SIGSEGV handler. */
+ sigemptyset (&action.sa_mask);
+ action.sa_handler = &stackoverflow_handler;
+ action.sa_flags = SA_ONSTACK;
+ if (sigaction (SIGSEGV, &action, (struct sigaction *) NULL) < 0)
+ exit(3);
+ /* Provoke a SIGSEGV. */
+ raise (SIGSEGV);
+ exit (3);
+}]])],
+ [gl_cv_sigaltstack_low_base=yes],
+ [gl_cv_sigaltstack_low_base=no],
+ [gl_cv_sigaltstack_low_base=cross-compiling])])
+ if test "$gl_cv_sigaltstack_low_base" = no; then
+ AC_DEFINE([SIGALTSTACK_SS_REVERSED], [1],
+ [Define if sigaltstack() interprets the stack_t.ss_sp field
+ incorrectly, as the highest address of the alternate stack range
+ rather than as the lowest address.])
+ fi
+
+ AC_CACHE_CHECK([for precise C stack overflow detection],
+ ac_cv_sys_xsi_stack_overflow_heuristic,
+ [AC_RUN_IFELSE([AC_LANG_SOURCE(
+ [[
+ #include <unistd.h>
+ #include <signal.h>
+ #if HAVE_UCONTEXT_H
+ # include <ucontext.h>
+ #endif
+ #if HAVE_SETRLIMIT
+ # include <sys/types.h>
+ # include <sys/time.h>
+ # include <sys/resource.h>
+ #endif
+ #ifndef SIGSTKSZ
+ # define SIGSTKSZ 16384
+ #endif
+
+ static union
+ {
+ char buffer[2 * SIGSTKSZ];
+ long double ld;
+ long u;
+ void *p;
+ } alternate_signal_stack;
+
+ #if STACK_DIRECTION
+ # define find_stack_direction(ptr) STACK_DIRECTION
+ #else
+ static int
+ find_stack_direction (char const *addr)
+ {
+ char dummy;
+ return (! addr ? find_stack_direction (&dummy)
+ : addr < &dummy ? 1 : -1);
+ }
+ #endif
+
+ static void
+ segv_handler (int signo, siginfo_t *info, void *context)
+ {
+ if (0 < info->si_code)
+ {
+ /* For XSI heuristics to work, we need uc_stack to describe
+ the interrupted stack (as on Solaris), and not the
+ currently executing stack (as on Linux). */
+ ucontext_t const *user_context = context;
+ char const *stack_min = user_context->uc_stack.ss_sp;
+ size_t stack_size = user_context->uc_stack.ss_size;
+ char const *faulting_address = info->si_addr;
+ size_t s = faulting_address - stack_min;
+ size_t page_size = sysconf (_SC_PAGESIZE);
+ if (find_stack_direction (0) < 0)
+ s += page_size;
+ if (s < stack_size + page_size)
+ _exit (0);
+ }
+
+ _exit (1);
+ }
+
+ static int
+ c_stack_action ()
+ {
+ stack_t st;
+ struct sigaction act;
+ int r;
+
+ st.ss_flags = 0;
+ /* Use the midpoint to avoid Irix sigaltstack bug. */
+ st.ss_sp = alternate_signal_stack.buffer + SIGSTKSZ;
+ st.ss_size = SIGSTKSZ;
+ r = sigaltstack (&st, 0);
+ if (r != 0)
+ return r;
+
+ sigemptyset (&act.sa_mask);
+ act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
+ act.sa_sigaction = segv_handler;
+ #if FAULT_YIELDS_SIGBUS
+ if (sigaction (SIGBUS, &act, 0) < 0)
+ return -1;
+ #endif
+ return sigaction (SIGSEGV, &act, 0);
+ }
+ static volatile int *
+ recurse_1 (volatile int n, volatile int *p)
+ {
+ if (n >= 0)
+ *recurse_1 (n + 1, p) += n;
+ return p;
+ }
+ static int
+ recurse (volatile int n)
+ {
+ int sum = 0;
+ return *recurse_1 (n, &sum);
+ }
+ int
+ main ()
+ {
+ #if HAVE_SETRLIMIT && defined RLIMIT_STACK
+ /* Before starting the endless recursion, try to be friendly
+ to the user's machine. On some Linux 2.2.x systems, there
+ is no stack limit for user processes at all. We don't want
+ to kill such systems. */
+ struct rlimit rl;
+ rl.rlim_cur = rl.rlim_max = 0x100000; /* 1 MB */
+ setrlimit (RLIMIT_STACK, &rl);
+ #endif
+
+ return c_stack_action () || recurse (0);
+ }
+ ]])],
+ [ac_cv_sys_xsi_stack_overflow_heuristic=yes],
+ [ac_cv_sys_xsi_stack_overflow_heuristic=no],
+ [ac_cv_sys_xsi_stack_overflow_heuristic=cross-compiling])])
+
+ if test $ac_cv_sys_xsi_stack_overflow_heuristic = yes; then
+ AC_DEFINE([HAVE_XSI_STACK_OVERFLOW_HEURISTIC], [1],
+ [Define to 1 if extending the stack slightly past the limit causes
+ a SIGSEGV, and an alternate stack can be established with sigaltstack,
+ and the signal handler is passed a context that specifies the
+ run time stack. This behavior is defined by POSIX 1003.1-2001
+ with the X/Open System Interface (XSI) option
+ and is a standardized way to implement a SEGV-based stack
+ overflow detection heuristic.])
+ fi
+ fi])
+
+
+AC_DEFUN([gl_PREREQ_C_STACK],
+ [AC_REQUIRE([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC])
+ AC_REQUIRE([gl_LIBSIGSEGV])
+
+ # for STACK_DIRECTION
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+
+ AC_CHECK_FUNCS_ONCE([sigaltstack])
+ AC_CHECK_DECLS([sigaltstack], , , [#include <signal.h>])
+
+ AC_CHECK_HEADERS_ONCE([unistd.h ucontext.h])
+
+ AC_CHECK_TYPES([stack_t], , , [#include <signal.h>])
+
+ dnl c-stack does not need -lsigsegv if the system has XSI heuristics.
+ if test "$gl_cv_lib_sigsegv" = yes \
+ && test $"ac_cv_sys_xsi_stack_overflow_heuristic" != yes ; then
+ AC_SUBST([LIBCSTACK], [$LIBSIGSEGV])
+ AC_SUBST([LTLIBCSTACK], [$LTLIBSIGSEGV])
+ fi
+])
+
+AC_DEFUN([gl_C_STACK],
+[
+ dnl Prerequisites of lib/c-stack.c.
+ gl_PREREQ_C_STACK
+])
diff --git a/gnulib/m4/c-strtod.m4 b/gnulib/m4/c-strtod.m4
new file mode 100644
index 00000000..41cf18e9
--- /dev/null
+++ b/gnulib/m4/c-strtod.m4
@@ -0,0 +1,57 @@
+# c-strtod.m4 serial 11
+
+# Copyright (C) 2004-2006, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Paul Eggert.
+
+AC_DEFUN([gl_C99_STRTOLD],
+[
+ AC_CACHE_CHECK([whether strtold conforms to C99],
+ [gl_cv_func_c99_strtold],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[/* On HP-UX before 11.23, strtold returns a struct instead of
+ long double. Reject implementations like that, by requiring
+ compatibility with the C99 prototype. */
+ #include <stdlib.h>
+ static long double (*p) (char const *, char **) = strtold;
+ static long double
+ test (char const *nptr, char **endptr)
+ {
+ long double r;
+ r = strtold (nptr, endptr);
+ return r;
+ }]],
+ [[return test ("1.0", NULL) != 1 || p ("1.0", NULL) != 1;]])],
+ [gl_cv_func_c99_strtold=yes],
+ [gl_cv_func_c99_strtold=no])])
+ if test $gl_cv_func_c99_strtold = yes; then
+ AC_DEFINE([HAVE_C99_STRTOLD], [1], [Define to 1 if strtold conforms to C99.])
+ fi
+])
+
+AC_DEFUN([gl_C_STRTOD],
+[
+ AC_LIBOBJ([c-strtod])
+
+ dnl Prerequisites of lib/c-strtod.c.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
+
+AC_DEFUN([gl_C_STRTOLD],
+[
+ AC_LIBOBJ([c-strtold])
+
+ dnl Prerequisites of lib/c-strtold.c.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_C99_STRTOLD])
+
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
diff --git a/gnulib/m4/calloc.m4 b/gnulib/m4/calloc.m4
new file mode 100644
index 00000000..22cffbd6
--- /dev/null
+++ b/gnulib/m4/calloc.m4
@@ -0,0 +1,62 @@
+# calloc.m4 serial 9
+
+# Copyright (C) 2004-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Jim Meyering.
+
+# Determine whether calloc (N, S) returns non-NULL when N*S is zero,
+# and returns NULL when N*S overflows.
+# If so, define HAVE_CALLOC. Otherwise, define calloc to rpl_calloc
+# and arrange to use a calloc wrapper function that does work in that case.
+
+# _AC_FUNC_CALLOC_IF([IF-WORKS], [IF-NOT])
+# -------------------------------------
+# If `calloc (0, 0)' is properly handled, run IF-WORKS, otherwise, IF-NOT.
+AC_DEFUN([_AC_FUNC_CALLOC_IF],
+[AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+AC_CACHE_CHECK([for GNU libc compatible calloc], [ac_cv_func_calloc_0_nonnull],
+[AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
+ [[exit (!calloc (0, 0) || calloc ((size_t) -1 / 8 + 1, 8));]])],
+ [ac_cv_func_calloc_0_nonnull=yes],
+ [ac_cv_func_calloc_0_nonnull=no],
+ [ac_cv_func_calloc_0_nonnull=no])])
+AS_IF([test $ac_cv_func_calloc_0_nonnull = yes], [$1], [$2])
+])# AC_FUNC_CALLOC
+
+
+# AC_FUNC_CALLOC
+# ---------------
+# Report whether `calloc (0, 0)' is properly handled, and replace calloc if
+# needed.
+AC_DEFUN([AC_FUNC_CALLOC],
+[_AC_FUNC_CALLOC_IF(
+ [AC_DEFINE([HAVE_CALLOC], [1],
+ [Define to 1 if your system has a GNU libc compatible `calloc'
+ function, and to 0 otherwise.])],
+ [AC_DEFINE([HAVE_CALLOC], [0])
+ AC_LIBOBJ([calloc])
+ AC_DEFINE([calloc], [rpl_calloc],
+ [Define to rpl_calloc if the replacement function should be used.])])
+])# AC_FUNC_CALLOC
+
+
+# gl_FUNC_CALLOC_POSIX
+# --------------------
+# Test whether 'calloc' is POSIX compliant (sets errno to ENOMEM when it
+# fails), and replace calloc if it is not.
+AC_DEFUN([gl_FUNC_CALLOC_POSIX],
+[
+ AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+ if test $gl_cv_func_malloc_posix = yes; then
+ HAVE_CALLOC_POSIX=1
+ AC_DEFINE([HAVE_CALLOC_POSIX], [1],
+ [Define if the 'calloc' function is POSIX compliant.])
+ else
+ AC_LIBOBJ([calloc])
+ HAVE_CALLOC_POSIX=0
+ fi
+ AC_SUBST([HAVE_CALLOC_POSIX])
+])
diff --git a/gnulib/m4/canon-host.m4 b/gnulib/m4/canon-host.m4
new file mode 100644
index 00000000..b1fe314b
--- /dev/null
+++ b/gnulib/m4/canon-host.m4
@@ -0,0 +1,15 @@
+# canon-host.m4 serial 9
+dnl Copyright (C) 2002-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CANON_HOST],
+[
+ AC_LIBOBJ([canon-host])
+ gl_PREREQ_CANON_HOST
+])
+
+AC_DEFUN([gl_PREREQ_CANON_HOST], [
+ :
+])
diff --git a/gnulib/m4/canonicalize.m4 b/gnulib/m4/canonicalize.m4
new file mode 100644
index 00000000..d418de8f
--- /dev/null
+++ b/gnulib/m4/canonicalize.m4
@@ -0,0 +1,81 @@
+# canonicalize.m4 serial 16
+
+dnl Copyright (C) 2003-2007, 2009-2010 Free Software Foundation, Inc.
+
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Provides canonicalize_file_name and canonicalize_filename_mode, but does
+# not provide or fix realpath.
+AC_DEFUN([gl_FUNC_CANONICALIZE_FILENAME_MODE],
+[
+ AC_LIBOBJ([canonicalize])
+
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([canonicalize_file_name])
+ AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
+ AC_REQUIRE([gl_FUNC_REALPATH_WORKS])
+ if test $ac_cv_func_canonicalize_file_name = no; then
+ HAVE_CANONICALIZE_FILE_NAME=0
+ elif test "$gl_cv_func_realpath_works" != yes; then
+ REPLACE_CANONICALIZE_FILE_NAME=1
+ fi
+])
+
+# Provides canonicalize_file_name and realpath.
+AC_DEFUN([gl_CANONICALIZE_LGPL],
+[
+ AC_REQUIRE([gl_CANONICALIZE_LGPL_SEPARATE])
+ if test $ac_cv_func_canonicalize_file_name = no; then
+ HAVE_CANONICALIZE_FILE_NAME=0
+ AC_LIBOBJ([canonicalize-lgpl])
+ if test $ac_cv_func_realpath = no; then
+ HAVE_REALPATH=0
+ elif test "$gl_cv_func_realpath_works" != yes; then
+ REPLACE_REALPATH=1
+ fi
+ elif test "$gl_cv_func_realpath_works" != yes; then
+ AC_LIBOBJ([canonicalize-lgpl])
+ REPLACE_REALPATH=1
+ REPLACE_CANONICALIZE_FILE_NAME=1
+ fi
+])
+
+# Like gl_CANONICALIZE_LGPL, except prepare for separate compilation
+# (no AC_LIBOBJ).
+AC_DEFUN([gl_CANONICALIZE_LGPL_SEPARATE],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([canonicalize_file_name getcwd readlink])
+ AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
+ AC_REQUIRE([gl_FUNC_REALPATH_WORKS])
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+])
+
+# Check whether realpath works. Assume that if a platform has both
+# realpath and canonicalize_file_name, but the former is broken, then
+# so is the latter.
+AC_DEFUN([gl_FUNC_REALPATH_WORKS],
+[
+ AC_CHECK_FUNCS_ONCE([realpath])
+ AC_CACHE_CHECK([whether realpath works], [gl_cv_func_realpath_works], [
+ touch conftest.a
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[
+ #include <stdlib.h>
+ ]], [[
+ char *name1 = realpath ("conftest.a", NULL);
+ char *name2 = realpath ("conftest.b/../conftest.a", NULL);
+ char *name3 = realpath ("conftest.a/", NULL);
+ return !(name1 && *name1 == '/' && !name2 && !name3);
+ ]])
+ ], [gl_cv_func_realpath_works=yes], [gl_cv_func_realpath_works=no],
+ [gl_cv_func_realpath_works="guessing no"])
+ ])
+ if test "$gl_cv_func_realpath_works" = yes; then
+ AC_DEFINE([FUNC_REALPATH_WORKS], [1], [Define to 1 if realpath()
+ can malloc memory, always gives an absolute path, and handles
+ trailing slash correctly.])
+ fi
+])
diff --git a/gnulib/m4/ceil.m4 b/gnulib/m4/ceil.m4
new file mode 100644
index 00000000..5981f39c
--- /dev/null
+++ b/gnulib/m4/ceil.m4
@@ -0,0 +1,46 @@
+# ceil.m4 serial 3
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_CEIL],
+[
+ dnl Test whether ceil() can be used without libm.
+ gl_FUNC_CEIL_LIBS
+ if test "$CEIL_LIBM" = "?"; then
+ CEIL_LIBM=
+ fi
+ AC_SUBST([CEIL_LIBM])
+])
+
+# Determines the libraries needed to get the ceil() function.
+# Sets CEIL_LIBM.
+AC_DEFUN([gl_FUNC_CEIL_LIBS],
+[
+ gl_CACHE_VAL_SILENT([gl_cv_func_ceil_libm], [
+ gl_cv_func_ceil_libm=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ double x;],
+ [x = ceil(x);],
+ [gl_cv_func_ceil_libm=])
+ if test "$gl_cv_func_ceil_libm" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ double x;],
+ [x = ceil(x);],
+ [gl_cv_func_ceil_libm="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ ])
+ CEIL_LIBM="$gl_cv_func_ceil_libm"
+])
diff --git a/gnulib/m4/ceilf.m4 b/gnulib/m4/ceilf.m4
new file mode 100644
index 00000000..91940c12
--- /dev/null
+++ b/gnulib/m4/ceilf.m4
@@ -0,0 +1,62 @@
+# ceilf.m4 serial 4
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_CEILF],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare ceilf().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl Test whether ceilf() is declared.
+ AC_CHECK_DECLS([ceilf], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_ceilf" = yes; then
+ dnl Test whether ceilf() can be used without libm.
+ gl_FUNC_CEILF_LIBS
+ if test "$CEILF_LIBM" = "?"; then
+ dnl Sun C 5.0 on Solaris declares ceilf() and has it in the system-wide
+ dnl libm.so, but not in the libm.so that the compiler uses.
+ REPLACE_CEILF=1
+ fi
+ else
+ REPLACE_CEILF=1
+ fi
+ if test $REPLACE_CEILF = 1; then
+ AC_LIBOBJ([ceilf])
+ CEILF_LIBM=
+ fi
+ AC_SUBST([REPLACE_CEILF])
+ AC_SUBST([CEILF_LIBM])
+])
+
+# Determines the libraries needed to get the ceilf() function.
+# Sets CEILF_LIBM.
+AC_DEFUN([gl_FUNC_CEILF_LIBS],
+[
+ gl_CACHE_VAL_SILENT([gl_cv_func_ceilf_libm], [
+ gl_cv_func_ceilf_libm=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ float x;],
+ [x = ceilf(x);],
+ [gl_cv_func_ceilf_libm=])
+ if test "$gl_cv_func_ceilf_libm" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ float x;],
+ [x = ceilf(x);],
+ [gl_cv_func_ceilf_libm="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ ])
+ CEILF_LIBM="$gl_cv_func_ceilf_libm"
+])
diff --git a/gnulib/m4/ceill.m4 b/gnulib/m4/ceill.m4
new file mode 100644
index 00000000..71ab316d
--- /dev/null
+++ b/gnulib/m4/ceill.m4
@@ -0,0 +1,62 @@
+# ceill.m4 serial 4
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_CEILL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare ceill().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl Test whether ceill() is declared.
+ AC_CHECK_DECLS([ceill], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_ceill" = yes; then
+ dnl Test whether ceill() can be used without libm.
+ gl_FUNC_CEILL_LIBS
+ if test "$CEILL_LIBM" = "?"; then
+ dnl Sun C 5.0 on Solaris declares ceill() and has it in the system-wide
+ dnl libm.so, but not in the libm.so that the compiler uses.
+ REPLACE_CEILL=1
+ fi
+ else
+ REPLACE_CEILL=1
+ fi
+ if test $REPLACE_CEILL = 1; then
+ AC_LIBOBJ([ceill])
+ CEILL_LIBM=
+ fi
+ AC_SUBST([REPLACE_CEILL])
+ AC_SUBST([CEILL_LIBM])
+])
+
+# Determines the libraries needed to get the ceill() function.
+# Sets CEILL_LIBM.
+AC_DEFUN([gl_FUNC_CEILL_LIBS],
+[
+ gl_CACHE_VAL_SILENT([gl_cv_func_ceill_libm], [
+ gl_cv_func_ceill_libm=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [x = ceill(x);],
+ [gl_cv_func_ceill_libm=])
+ if test "$gl_cv_func_ceill_libm" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [x = ceill(x);],
+ [gl_cv_func_ceill_libm="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ ])
+ CEILL_LIBM="$gl_cv_func_ceill_libm"
+])
diff --git a/gnulib/m4/chdir-long.m4 b/gnulib/m4/chdir-long.m4
new file mode 100644
index 00000000..17fe727a
--- /dev/null
+++ b/gnulib/m4/chdir-long.m4
@@ -0,0 +1,39 @@
+#serial 11
+
+# Use Gnulib's robust chdir function.
+# It can handle arbitrarily long directory names, which means
+# that when it is given the name of an existing directory, it
+# never fails with ENAMETOOLONG.
+# Arrange to compile chdir-long.c only on systems that define PATH_MAX.
+
+dnl Copyright (C) 2004-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Jim Meyering.
+
+AC_DEFUN([gl_FUNC_CHDIR_LONG],
+[
+ AC_CACHE_CHECK([whether this system has an arbitrary file name length limit],
+ gl_cv_have_arbitrary_file_name_length_limit,
+ [AC_EGREP_CPP([have_arbitrary_file_name_length_limit],
+ [#include <unistd.h>
+#include <limits.h>
+#if defined PATH_MAX || defined MAXPATHLEN
+have_arbitrary_file_name_length_limit
+#endif],
+ gl_cv_have_arbitrary_file_name_length_limit=yes,
+ gl_cv_have_arbitrary_file_name_length_limit=no)])
+
+ if test $gl_cv_have_arbitrary_file_name_length_limit = yes; then
+ AC_LIBOBJ([chdir-long])
+ gl_PREREQ_CHDIR_LONG
+ fi
+])
+
+AC_DEFUN([gl_PREREQ_CHDIR_LONG],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
diff --git a/gnulib/m4/chdir-safer.m4 b/gnulib/m4/chdir-safer.m4
new file mode 100644
index 00000000..dfc13181
--- /dev/null
+++ b/gnulib/m4/chdir-safer.m4
@@ -0,0 +1,11 @@
+#serial 4
+dnl Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CHDIR_SAFER],
+[
+ AC_LIBOBJ([chdir-safer])
+ AC_CHECK_FUNCS_ONCE([readlink])
+])
diff --git a/gnulib/m4/check-math-lib.m4 b/gnulib/m4/check-math-lib.m4
new file mode 100644
index 00000000..e23b3d3b
--- /dev/null
+++ b/gnulib/m4/check-math-lib.m4
@@ -0,0 +1,31 @@
+# check-math-lib.m4 serial 3
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl gl_CHECK_MATH_LIB (VARIABLE, EXPRESSION)
+dnl
+dnl Sets the shell VARIABLE according to the libraries needed by EXPRESSION
+dnl to compile and link: to the empty string if no extra libraries are needed,
+dnl to "-lm" if -lm is needed, or to "missing" if it does not compile and
+dnl link either way.
+dnl
+dnl Example: gl_CHECK_MATH_LIB([ROUNDF_LIBM], [x = roundf (x);])
+AC_DEFUN([gl_CHECK_MATH_LIB], [
+ save_LIBS=$LIBS
+ $1=missing
+ for libm in "" "-lm"; do
+ LIBS="$save_LIBS $libm"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ double x;]],
+ [$2])],
+ [$1=$libm
+break])
+ done
+ LIBS=$save_LIBS
+])
diff --git a/gnulib/m4/check-version.m4 b/gnulib/m4/check-version.m4
new file mode 100644
index 00000000..f0b5941a
--- /dev/null
+++ b/gnulib/m4/check-version.m4
@@ -0,0 +1,10 @@
+#serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CHECK_VERSION],
+[
+ AC_LIBOBJ([check-version])
+])
diff --git a/gnulib/m4/chown.m4 b/gnulib/m4/chown.m4
new file mode 100644
index 00000000..0c32fa39
--- /dev/null
+++ b/gnulib/m4/chown.m4
@@ -0,0 +1,139 @@
+# serial 22
+# Determine whether we need the chown wrapper.
+
+dnl Copyright (C) 1997-2001, 2003-2005, 2007, 2009-2010 Free Software
+dnl Foundation, Inc.
+
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# chown should accept arguments of -1 for uid and gid, and it should
+# dereference symlinks. If it doesn't, arrange to use the replacement
+# function.
+
+# From Jim Meyering.
+
+AC_DEFUN_ONCE([gl_FUNC_CHOWN],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_TYPE_UID_T])
+ AC_REQUIRE([AC_FUNC_CHOWN])
+ AC_REQUIRE([gl_FUNC_CHOWN_FOLLOWS_SYMLINK])
+ AC_CHECK_FUNCS_ONCE([chown fchown])
+
+ dnl mingw lacks chown altogether.
+ if test $ac_cv_func_chown = no; then
+ HAVE_CHOWN=0
+ AC_LIBOBJ([chown])
+ else
+ dnl Some old systems treated chown like lchown.
+ if test $gl_cv_func_chown_follows_symlink = no; then
+ REPLACE_CHOWN=1
+ AC_LIBOBJ([chown])
+ fi
+
+ dnl Some old systems tried to use uid/gid -1 literally.
+ if test $ac_cv_func_chown_works = no; then
+ AC_DEFINE([CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE], [1],
+ [Define if chown is not POSIX compliant regarding IDs of -1.])
+ REPLACE_CHOWN=1
+ AC_LIBOBJ([chown])
+ fi
+
+ dnl Solaris 9 ignores trailing slash.
+ dnl FreeBSD 7.2 mishandles trailing slash on symlinks.
+ AC_CACHE_CHECK([whether chown honors trailing slash],
+ [gl_cv_func_chown_slash_works],
+ [touch conftest.file && rm -f conftest.link
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+]], [[ if (symlink ("conftest.file", "conftest.link")) return 1;
+ if (chown ("conftest.link/", getuid (), getgid ()) == 0) return 2;
+ ]])],
+ [gl_cv_func_chown_slash_works=yes],
+ [gl_cv_func_chown_slash_works=no],
+ [gl_cv_func_chown_slash_works="guessing no"])
+ rm -f conftest.link conftest.file])
+ if test "$gl_cv_func_chown_slash_works" != yes; then
+ AC_DEFINE([CHOWN_TRAILING_SLASH_BUG], [1],
+ [Define to 1 if chown mishandles trailing slash.])
+ REPLACE_CHOWN=1
+ AC_LIBOBJ([chown])
+ fi
+
+ dnl OpenBSD fails to update ctime if ownership does not change.
+ AC_CACHE_CHECK([whether chown always updates ctime],
+ [gl_cv_func_chown_ctime_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+]], [[ struct stat st1, st2;
+ if (close (creat ("conftest.file", 0600))) return 1;
+ if (stat ("conftest.file", &st1)) return 2;
+ sleep (1);
+ if (chown ("conftest.file", st1.st_uid, st1.st_gid)) return 3;
+ if (stat ("conftest.file", &st2)) return 4;
+ if (st2.st_ctime <= st1.st_ctime) return 5;
+ ]])],
+ [gl_cv_func_chown_ctime_works=yes],
+ [gl_cv_func_chown_ctime_works=no],
+ [gl_cv_func_chown_ctime_works="guessing no"])
+ rm -f conftest.file])
+ if test "$gl_cv_func_chown_ctime_works" != yes; then
+ AC_DEFINE([CHOWN_CHANGE_TIME_BUG], [1], [Define to 1 if chown fails
+ to change ctime when at least one argument was not -1.])
+ REPLACE_CHOWN=1
+ AC_LIBOBJ([chown])
+ fi
+
+ if test $REPLACE_CHOWN = 1 && test $ac_cv_func_fchown = no; then
+ AC_LIBOBJ([fchown-stub])
+ fi
+ fi
+])
+
+# Determine whether chown follows symlinks (it should).
+AC_DEFUN_ONCE([gl_FUNC_CHOWN_FOLLOWS_SYMLINK],
+[
+ AC_CACHE_CHECK(
+ [whether chown dereferences symlinks],
+ [gl_cv_func_chown_follows_symlink],
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+ int
+ main ()
+ {
+ char const *dangling_symlink = "conftest.dangle";
+
+ unlink (dangling_symlink);
+ if (symlink ("conftest.no-such", dangling_symlink))
+ abort ();
+
+ /* Exit successfully on a conforming system,
+ i.e., where chown must fail with ENOENT. */
+ exit ( ! (chown (dangling_symlink, getuid (), getgid ()) != 0
+ && errno == ENOENT));
+ }
+ ]])],
+ [gl_cv_func_chown_follows_symlink=yes],
+ [gl_cv_func_chown_follows_symlink=no],
+ [gl_cv_func_chown_follows_symlink=yes]
+ )
+ ]
+ )
+
+ if test $gl_cv_func_chown_follows_symlink = no; then
+ AC_DEFINE([CHOWN_MODIFIES_SYMLINK], [1],
+ [Define if chown modifies symlinks.])
+ fi
+])
diff --git a/gnulib/m4/clock_time.m4 b/gnulib/m4/clock_time.m4
new file mode 100644
index 00000000..8be179db
--- /dev/null
+++ b/gnulib/m4/clock_time.m4
@@ -0,0 +1,31 @@
+# clock_time.m4 serial 10
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Check for clock_gettime and clock_settime, and set LIB_CLOCK_GETTIME.
+# For a program named, say foo, you should add a line like the following
+# in the corresponding Makefile.am file:
+# foo_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
+
+AC_DEFUN([gl_CLOCK_TIME],
+[
+ dnl Persuade glibc and Solaris <time.h> to declare these functions.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
+ # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
+
+ # Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all*
+ # programs in the package would end up linked with that potentially-shared
+ # library, inducing unnecessary run-time overhead.
+ LIB_CLOCK_GETTIME=
+ AC_SUBST([LIB_CLOCK_GETTIME])
+ gl_saved_libs=$LIBS
+ AC_SEARCH_LIBS([clock_gettime], [rt posix4],
+ [test "$ac_cv_search_clock_gettime" = "none required" ||
+ LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime])
+ AC_CHECK_FUNCS([clock_gettime clock_settime])
+ LIBS=$gl_saved_libs
+])
diff --git a/gnulib/m4/cloexec.m4 b/gnulib/m4/cloexec.m4
new file mode 100644
index 00000000..c75595ca
--- /dev/null
+++ b/gnulib/m4/cloexec.m4
@@ -0,0 +1,10 @@
+#serial 6
+dnl Copyright (C) 2004-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CLOEXEC],
+[
+ AC_LIBOBJ([cloexec])
+])
diff --git a/gnulib/m4/close-stream.m4 b/gnulib/m4/close-stream.m4
new file mode 100644
index 00000000..40d999dc
--- /dev/null
+++ b/gnulib/m4/close-stream.m4
@@ -0,0 +1,13 @@
+#serial 3
+dnl Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CLOSE_STREAM],
+[
+ AC_LIBOBJ([close-stream])
+
+ dnl Prerequisites of lib/close-stream.c.
+ :
+])
diff --git a/gnulib/m4/close.m4 b/gnulib/m4/close.m4
new file mode 100644
index 00000000..1ee3add9
--- /dev/null
+++ b/gnulib/m4/close.m4
@@ -0,0 +1,26 @@
+# close.m4 serial 5
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_CLOSE],
+[
+ m4_ifdef([gl_PREREQ_SYS_H_WINSOCK2], [
+ gl_PREREQ_SYS_H_WINSOCK2
+ if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
+ dnl Even if the 'socket' module is not used here, another part of the
+ dnl application may use it and pass file descriptors that refer to
+ dnl sockets to the close() function. So enable the support for sockets.
+ gl_REPLACE_CLOSE
+ fi
+ ])
+])
+
+AC_DEFUN([gl_REPLACE_CLOSE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ REPLACE_CLOSE=1
+ AC_LIBOBJ([close])
+ gl_REPLACE_FCLOSE
+])
diff --git a/gnulib/m4/closein.m4 b/gnulib/m4/closein.m4
new file mode 100644
index 00000000..8bcf7c05
--- /dev/null
+++ b/gnulib/m4/closein.m4
@@ -0,0 +1,13 @@
+# closein.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CLOSEIN],
+[
+ AC_LIBOBJ([closein])
+
+ dnl Prerequisites of lib/closein.c.
+ :
+])
diff --git a/gnulib/m4/closeout.m4 b/gnulib/m4/closeout.m4
new file mode 100644
index 00000000..946944ec
--- /dev/null
+++ b/gnulib/m4/closeout.m4
@@ -0,0 +1,14 @@
+# closeout.m4 serial 5
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CLOSEOUT],
+[
+ AC_LIBOBJ([closeout])
+
+ dnl Prerequisites of lib/closeout.c.
+ :
+])
diff --git a/gnulib/m4/codeset.m4 b/gnulib/m4/codeset.m4
new file mode 100644
index 00000000..a53c0426
--- /dev/null
+++ b/gnulib/m4/codeset.m4
@@ -0,0 +1,21 @@
+# codeset.m4 serial 4 (gettext-0.18)
+dnl Copyright (C) 2000-2002, 2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset],
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(CODESET); return !cs;],
+ [am_cv_langinfo_codeset=yes],
+ [am_cv_langinfo_codeset=no])
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE([HAVE_LANGINFO_CODESET], [1],
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
diff --git a/gnulib/m4/cond.m4 b/gnulib/m4/cond.m4
new file mode 100644
index 00000000..e8c84cf2
--- /dev/null
+++ b/gnulib/m4/cond.m4
@@ -0,0 +1,11 @@
+# cond.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_COND],
+[
+ AC_REQUIRE([gl_THREADLIB])
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/config-h.m4 b/gnulib/m4/config-h.m4
new file mode 100644
index 00000000..319127d2
--- /dev/null
+++ b/gnulib/m4/config-h.m4
@@ -0,0 +1,13 @@
+# Say that -DHAVE_CONFIG_H is not needed.
+
+dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+# This package's source files all include config.h unconditionally,
+# so there's no need to pass -DHAVE_CONFIG_H to the compiler.
+AC_DEFUN([gl_CONFIG_H],
+ [AC_CONFIG_COMMANDS_PRE([test "X$DEFS" = X-DHAVE_CONFIG_H && DEFS=])])
diff --git a/gnulib/m4/copy-file.m4 b/gnulib/m4/copy-file.m4
new file mode 100644
index 00000000..f2fbf190
--- /dev/null
+++ b/gnulib/m4/copy-file.m4
@@ -0,0 +1,11 @@
+# copy-file.m4 serial 3
+dnl Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_COPY_FILE],
+[
+ AC_CHECK_HEADERS_ONCE([unistd.h utime.h])
+ AC_CHECK_FUNCS([chown utime utimes])
+])
diff --git a/gnulib/m4/cosl.m4 b/gnulib/m4/cosl.m4
new file mode 100644
index 00000000..74c9e7c6
--- /dev/null
+++ b/gnulib/m4/cosl.m4
@@ -0,0 +1,77 @@
+# cosl.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_COSL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare cosl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ COSL_LIBM=
+ AC_CACHE_CHECK([whether cosl() can be used without linking with libm],
+ [gl_cv_func_cosl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return cosl (x) > 0.4;],
+ [gl_cv_func_cosl_no_libm=yes],
+ [gl_cv_func_cosl_no_libm=no])
+ ])
+ if test $gl_cv_func_cosl_no_libm = no; then
+ AC_CACHE_CHECK([whether cosl() can be used with libm],
+ [gl_cv_func_cosl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return cosl (x) > 0.4;],
+ [gl_cv_func_cosl_in_libm=yes],
+ [gl_cv_func_cosl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_cosl_in_libm = yes; then
+ COSL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_cosl_no_libm = yes \
+ || test $gl_cv_func_cosl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has cosl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([cosl], , [HAVE_DECL_COSL=0], [#include <math.h>])
+ else
+ HAVE_DECL_COSL=0
+ HAVE_COSL=0
+ AC_LIBOBJ([cosl])
+ AC_LIBOBJ([sincosl])
+ AC_LIBOBJ([trigl])
+ AC_REQUIRE([gl_FUNC_ISNANL])
+ AC_REQUIRE([gl_FUNC_FLOOR])
+ AC_REQUIRE([gl_FUNC_FLOORL])
+ dnl Append $ISNANL_LIBM to COSL_LIBM, avoiding gratuitous duplicates.
+ case " $COSL_LIBM " in
+ *" $ISNANL_LIBM "*) ;;
+ *) COSL_LIBM="$COSL_LIBM $ISNANL_LIBM" ;;
+ esac
+ dnl Append $FLOOR_LIBM to COSL_LIBM, avoiding gratuitous duplicates.
+ case " $COSL_LIBM " in
+ *" $FLOOR_LIBM "*) ;;
+ *) COSL_LIBM="$COSL_LIBM $FLOOR_LIBM" ;;
+ esac
+ dnl Append $FLOORL_LIBM to COSL_LIBM, avoiding gratuitous duplicates.
+ case " $COSL_LIBM " in
+ *" $FLOORL_LIBM "*) ;;
+ *) COSL_LIBM="$COSL_LIBM $FLOORL_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([COSL_LIBM])
+])
diff --git a/gnulib/m4/count-one-bits.m4 b/gnulib/m4/count-one-bits.m4
new file mode 100644
index 00000000..17b24b26
--- /dev/null
+++ b/gnulib/m4/count-one-bits.m4
@@ -0,0 +1,15 @@
+# count-one-bits.m4 serial 2
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_COUNT_ONE_BITS],
+[
+ dnl We don't need (and can't compile) count_one_bits_ll
+ dnl unless the type 'unsigned long long int' exists.
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+
+ dnl Prerequisites of lib/count-one-bits.h.
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/crc.m4 b/gnulib/m4/crc.m4
new file mode 100644
index 00000000..008f844e
--- /dev/null
+++ b/gnulib/m4/crc.m4
@@ -0,0 +1,10 @@
+# crc.m4 serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CRC],
+[
+ AC_LIBOBJ([crc])
+])
diff --git a/gnulib/m4/csharp.m4 b/gnulib/m4/csharp.m4
new file mode 100644
index 00000000..e4080514
--- /dev/null
+++ b/gnulib/m4/csharp.m4
@@ -0,0 +1,28 @@
+# csharp.m4 serial 3
+dnl Copyright (C) 2004-2005, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Sets CSHARP_CHOICE to the preferred C# implementation:
+# 'pnet' or 'mono' or 'any' or 'no'.
+AC_DEFUN([gt_CSHARP_CHOICE],
+[
+ AC_MSG_CHECKING([for preferred C[#] implementation])
+ AC_ARG_ENABLE([csharp],
+ [ --enable-csharp[[=IMPL]] choose preferred C[#] implementation (pnet or mono)],
+ [CSHARP_CHOICE="$enableval"],
+ CSHARP_CHOICE=any)
+ AC_SUBST([CSHARP_CHOICE])
+ AC_MSG_RESULT([$CSHARP_CHOICE])
+ case "$CSHARP_CHOICE" in
+ pnet)
+ AC_DEFINE([CSHARP_CHOICE_PNET], [1],
+ [Define if pnet is the preferred C# implementation.])
+ ;;
+ mono)
+ AC_DEFINE([CSHARP_CHOICE_MONO], [1],
+ [Define if mono is the preferred C# implementation.])
+ ;;
+ esac
+])
diff --git a/gnulib/m4/csharpcomp.m4 b/gnulib/m4/csharpcomp.m4
new file mode 100644
index 00000000..bcf3357b
--- /dev/null
+++ b/gnulib/m4/csharpcomp.m4
@@ -0,0 +1,78 @@
+# csharpcomp.m4 serial 8
+dnl Copyright (C) 2003-2005, 2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prerequisites of csharpcomp.sh.
+# Checks for a C# compiler.
+# Sets at most one of HAVE_CSCC, HAVE_MCS, HAVE_CSC.
+# Sets HAVE_CSHARPCOMP to nonempty if csharpcomp.sh will work.
+# Also sets CSHARPCOMPFLAGS.
+AC_DEFUN([gt_CSHARPCOMP],
+[
+ AC_REQUIRE([gt_CSHARP_CHOICE])
+ AC_MSG_CHECKING([for C[#] compiler])
+ HAVE_CSHARPCOMP=1
+ pushdef([AC_MSG_CHECKING],[:])dnl
+ pushdef([AC_CHECKING],[:])dnl
+ pushdef([AC_MSG_RESULT],[:])dnl
+ AC_CHECK_PROG([HAVE_CSCC_IN_PATH], [cscc], [yes])
+ AC_CHECK_PROG([HAVE_MCS_IN_PATH], [mcs], [yes])
+ AC_CHECK_PROG([HAVE_CSC_IN_PATH], [csc], [yes])
+ popdef([AC_MSG_RESULT])dnl
+ popdef([AC_CHECKING])dnl
+ popdef([AC_MSG_CHECKING])dnl
+ for impl in "$CSHARP_CHOICE" pnet mono sscli no; do
+ case "$impl" in
+ pnet)
+ if test -n "$HAVE_CSCC_IN_PATH" \
+ && cscc --version >/dev/null 2>/dev/null \
+ && (
+ # See if pnetlib is well installed.
+ echo 'class ConfTest { static void Main() { } }' > conftest.cs
+ cscc -o conftest.exe conftest.cs 2>/dev/null
+ error=$?
+ rm -f conftest.cs conftest.exe
+ exit $error
+ ); then
+ HAVE_CSCC=1
+ ac_result="cscc"
+ break
+ fi
+ ;;
+ mono)
+ if test -n "$HAVE_MCS_IN_PATH" \
+ && mcs --version >/dev/null 2>/dev/null \
+ && mcs --version 2>/dev/null | grep Mono >/dev/null; then
+ HAVE_MCS=1
+ ac_result="mcs"
+ break
+ fi
+ ;;
+ sscli)
+ if test -n "$HAVE_CSC_IN_PATH" \
+ && csc -help >/dev/null 2>/dev/null \
+ && { if csc -help 2>/dev/null | grep -i chicken > /dev/null; then false; else true; fi; }; then
+ HAVE_CSC=1
+ ac_result="csc"
+ break
+ fi
+ ;;
+ no)
+ HAVE_CSHARPCOMP=
+ ac_result="no"
+ break
+ ;;
+ esac
+ done
+ AC_MSG_RESULT([$ac_result])
+ AC_SUBST([HAVE_CSCC])
+ AC_SUBST([HAVE_MCS])
+ AC_SUBST([HAVE_CSC])
+ dnl Provide a default for CSHARPCOMPFLAGS.
+ if test -z "${CSHARPCOMPFLAGS+set}"; then
+ CSHARPCOMPFLAGS="-O -g"
+ fi
+ AC_SUBST([CSHARPCOMPFLAGS])
+])
diff --git a/gnulib/m4/csharpexec.m4 b/gnulib/m4/csharpexec.m4
new file mode 100644
index 00000000..74905800
--- /dev/null
+++ b/gnulib/m4/csharpexec.m4
@@ -0,0 +1,86 @@
+# csharpexec.m4 serial 4
+dnl Copyright (C) 2003-2005, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prerequisites of csharpexec.sh.
+# Checks for a C# execution engine.
+# gt_CSHARPEXEC or gt_CSHARPEXEC(testexecutable, its-directory)
+# Sets at most one of HAVE_ILRUN, HAVE_MONO, HAVE_CLIX.
+# Sets HAVE_CSHARPEXEC to nonempty if csharpexec.sh will work.
+AC_DEFUN([gt_CSHARPEXEC],
+[
+ AC_REQUIRE([gt_CSHARP_CHOICE])
+ AC_MSG_CHECKING([for C[#] program execution engine])
+ AC_EGREP_CPP([yes], [
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ yes
+#endif
+], MONO_PATH_SEPARATOR=';', MONO_PATH_SEPARATOR=':')
+ HAVE_CSHARPEXEC=1
+ pushdef([AC_MSG_CHECKING],[:])dnl
+ pushdef([AC_CHECKING],[:])dnl
+ pushdef([AC_MSG_RESULT],[:])dnl
+ AC_CHECK_PROG([HAVE_ILRUN_IN_PATH], [ilrun], [yes])
+ AC_CHECK_PROG([HAVE_MONO_IN_PATH], [mono], [yes])
+ AC_CHECK_PROG([HAVE_CLIX_IN_PATH], [clix], [yes])
+ popdef([AC_MSG_RESULT])dnl
+ popdef([AC_CHECKING])dnl
+ popdef([AC_MSG_CHECKING])dnl
+ for impl in "$CSHARP_CHOICE" pnet mono no; do
+ case "$impl" in
+ pnet)
+ if test -n "$HAVE_ILRUN_IN_PATH" \
+ && ilrun --version >/dev/null 2>/dev/null \
+ ifelse([$1], , , [&& ilrun $2/$1 >/dev/null 2>/dev/null]); then
+ HAVE_ILRUN=1
+ ac_result="ilrun"
+ break
+ fi
+ ;;
+ mono)
+ if test -n "$HAVE_MONO_IN_PATH" \
+ && mono --version >/dev/null 2>/dev/null \
+ ifelse([$1], , , [&& mono $2/$1 >/dev/null 2>/dev/null]); then
+ HAVE_MONO=1
+ ac_result="mono"
+ break
+ fi
+ ;;
+ sscli)
+ if test -n "$HAVE_CLIX_IN_PATH" \
+ ifelse([$1], , , [&& clix $2/$1 >/dev/null 2>/dev/null]); then
+ HAVE_CLIX=1
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ CLIX_PATH_VAR=PATH
+ ;;
+ darwin* | rhapsody*)
+ CLIX_PATH_VAR=DYLD_LIBRARY_PATH
+ ;;
+ *)
+ CLIX_PATH_VAR=LD_LIBRARY_PATH
+ ;;
+ esac
+ eval CLIX_PATH=\"\$CLIX_PATH_VAR\"
+ ac_result="clix"
+ break
+ fi
+ ;;
+ no)
+ HAVE_CSHARPEXEC=
+ ac_result="no"
+ break
+ ;;
+ esac
+ done
+ AC_MSG_RESULT([$ac_result])
+ AC_SUBST([MONO_PATH])
+ AC_SUBST([MONO_PATH_SEPARATOR])
+ AC_SUBST([CLIX_PATH_VAR])
+ AC_SUBST([CLIX_PATH])
+ AC_SUBST([HAVE_ILRUN])
+ AC_SUBST([HAVE_MONO])
+ AC_SUBST([HAVE_CLIX])
+])
diff --git a/gnulib/m4/ctype.m4 b/gnulib/m4/ctype.m4
new file mode 100644
index 00000000..c23b0e37
--- /dev/null
+++ b/gnulib/m4/ctype.m4
@@ -0,0 +1,32 @@
+# ctype_h.m4 serial 3
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CTYPE_H],
+[
+ AC_REQUIRE([gl_CTYPE_H_DEFAULTS])
+ dnl Execute this unconditionally, because CTYPE_H may be set by other
+ dnl modules, after this code is executed.
+ gl_CHECK_NEXT_HEADERS([ctype.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <ctype.h>
+ ]], [isblank])
+])
+
+AC_DEFUN([gl_CTYPE_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_CTYPE_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_CTYPE_H_DEFAULTS],
+[
+ GNULIB_ISBLANK=0; AC_SUBST([GNULIB_ISBLANK])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_ISBLANK=1; AC_SUBST([HAVE_ISBLANK])
+])
diff --git a/gnulib/m4/cycle-check.m4 b/gnulib/m4/cycle-check.m4
new file mode 100644
index 00000000..71258caa
--- /dev/null
+++ b/gnulib/m4/cycle-check.m4
@@ -0,0 +1,11 @@
+#serial 5
+dnl Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CYCLE_CHECK],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_LIBOBJ([cycle-check])
+])
diff --git a/gnulib/m4/d-ino.m4 b/gnulib/m4/d-ino.m4
new file mode 100644
index 00000000..b019ae58
--- /dev/null
+++ b/gnulib/m4/d-ino.m4
@@ -0,0 +1,41 @@
+# serial 11
+
+dnl From Jim Meyering.
+dnl
+dnl Check whether struct dirent has a member named d_ino.
+dnl
+
+# Copyright (C) 1997, 1999-2001, 2003-2004, 2006-2007, 2009-2010 Free Software
+# Foundation, Inc.
+
+# This file 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.
+
+AC_DEFUN([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO],
+ [AC_CACHE_CHECK([for d_ino member in directory struct],
+ gl_cv_struct_dirent_d_ino,
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/stat.h>
+ #include <dirent.h>
+ ]],
+ [[DIR *dp = opendir (".");
+ struct dirent *e;
+ struct stat st;
+ if (! dp)
+ return 1;
+ e = readdir (dp);
+ return ! (e
+ && stat (e->d_name, &st) == 0
+ && e->d_ino == st.st_ino);]])],
+ [gl_cv_struct_dirent_d_ino=yes],
+ [gl_cv_struct_dirent_d_ino=no],
+ [gl_cv_struct_dirent_d_ino=no])])
+ if test $gl_cv_struct_dirent_d_ino = yes; then
+ AC_DEFINE([D_INO_IN_DIRENT], [1],
+ [Define if struct dirent has a member d_ino that actually works.])
+ fi
+ ]
+)
diff --git a/gnulib/m4/d-type.m4 b/gnulib/m4/d-type.m4
new file mode 100644
index 00000000..615b926c
--- /dev/null
+++ b/gnulib/m4/d-type.m4
@@ -0,0 +1,32 @@
+# serial 11
+
+dnl From Jim Meyering.
+dnl
+dnl Check whether struct dirent has a member named d_type.
+dnl
+
+# Copyright (C) 1997, 1999-2004, 2006, 2009-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+AC_DEFUN([gl_CHECK_TYPE_STRUCT_DIRENT_D_TYPE],
+ [AC_CACHE_CHECK([for d_type member in directory struct],
+ gl_cv_struct_dirent_d_type,
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <dirent.h>
+ ]],
+ [[struct dirent dp; dp.d_type = 0;]])],
+ [gl_cv_struct_dirent_d_type=yes],
+ [gl_cv_struct_dirent_d_type=no])
+ ]
+ )
+ if test $gl_cv_struct_dirent_d_type = yes; then
+ AC_DEFINE([HAVE_STRUCT_DIRENT_D_TYPE], [1],
+ [Define if there is a member named d_type in the struct describing
+ directory headers.])
+ fi
+ ]
+)
diff --git a/gnulib/m4/des.m4 b/gnulib/m4/des.m4
new file mode 100644
index 00000000..c66c0d57
--- /dev/null
+++ b/gnulib/m4/des.m4
@@ -0,0 +1,10 @@
+# des.m4 serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_DES],
+[
+ AC_LIBOBJ([des])
+])
diff --git a/gnulib/m4/dirent-safer.m4 b/gnulib/m4/dirent-safer.m4
new file mode 100644
index 00000000..c48f3dc8
--- /dev/null
+++ b/gnulib/m4/dirent-safer.m4
@@ -0,0 +1,11 @@
+#serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_DIRENT_SAFER],
+[
+ AC_CHECK_FUNCS_ONCE([fdopendir])
+ AC_LIBOBJ([opendir-safer])
+])
diff --git a/gnulib/m4/dirent_h.m4 b/gnulib/m4/dirent_h.m4
new file mode 100644
index 00000000..1328ee3c
--- /dev/null
+++ b/gnulib/m4/dirent_h.m4
@@ -0,0 +1,53 @@
+# dirent_h.m4 serial 9
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN([gl_DIRENT_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+ dnl <dirent.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([dirent.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <dirent.h>
+ ]], [alphasort dirfd fdopendir scandir])
+])
+
+dnl Unconditionally enables the replacement of <dirent.h>.
+AC_DEFUN([gl_REPLACE_DIRENT_H],
+[
+ dnl This is a no-op, because <dirent.h> is always overridden.
+ :
+])
+
+AC_DEFUN([gl_DIRENT_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_DIRENT_H_DEFAULTS],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR
+ GNULIB_DIRFD=0; AC_SUBST([GNULIB_DIRFD])
+ GNULIB_FDOPENDIR=0; AC_SUBST([GNULIB_FDOPENDIR])
+ GNULIB_SCANDIR=0; AC_SUBST([GNULIB_SCANDIR])
+ GNULIB_ALPHASORT=0; AC_SUBST([GNULIB_ALPHASORT])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_DIRFD=1; AC_SUBST([HAVE_DECL_DIRFD])
+ HAVE_FDOPENDIR=1; AC_SUBST([HAVE_FDOPENDIR])
+ HAVE_SCANDIR=1; AC_SUBST([HAVE_SCANDIR])
+ HAVE_ALPHASORT=1; AC_SUBST([HAVE_ALPHASORT])
+ REPLACE_CLOSEDIR=0; AC_SUBST([REPLACE_CLOSEDIR])
+ REPLACE_FDOPENDIR=0; AC_SUBST([REPLACE_FDOPENDIR])
+ REPLACE_OPENDIR=0; AC_SUBST([REPLACE_OPENDIR])
+])
diff --git a/gnulib/m4/dirfd.m4 b/gnulib/m4/dirfd.m4
new file mode 100644
index 00000000..7fefa2e4
--- /dev/null
+++ b/gnulib/m4/dirfd.m4
@@ -0,0 +1,83 @@
+# serial 17 -*- Autoconf -*-
+
+dnl Find out how to get the file descriptor associated with an open DIR*.
+
+# Copyright (C) 2001-2006, 2008-2010 Free Software Foundation, Inc.
+# This file 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.
+
+dnl From Jim Meyering
+
+AC_DEFUN([gl_FUNC_DIRFD],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ gl_REPLACE_DIRENT_H
+
+ dnl Persuade glibc <dirent.h> to declare dirfd().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+
+ AC_CHECK_FUNCS([dirfd])
+ AC_CHECK_DECLS([dirfd], , ,
+ [#include <sys/types.h>
+ #include <dirent.h>])
+ if test $ac_cv_have_decl_dirfd = no; then
+ HAVE_DECL_DIRFD=0
+ fi
+
+ AC_CACHE_CHECK([whether dirfd is a macro],
+ gl_cv_func_dirfd_macro,
+ [AC_EGREP_CPP([dirent_header_defines_dirfd], [
+#include <sys/types.h>
+#include <dirent.h>
+#ifdef dirfd
+ dirent_header_defines_dirfd
+#endif],
+ gl_cv_func_dirfd_macro=yes,
+ gl_cv_func_dirfd_macro=no)])
+
+ # Use the replacement only if we have no function, macro,
+ # or declaration with that name.
+ if test $ac_cv_func_dirfd,$ac_cv_have_decl_dirfd,$gl_cv_func_dirfd_macro \
+ = no,no,no; then
+ AC_REPLACE_FUNCS([dirfd])
+ AC_CACHE_CHECK(
+ [how to get the file descriptor associated with an open DIR*],
+ gl_cv_sys_dir_fd_member_name,
+ [
+ dirfd_save_CFLAGS=$CFLAGS
+ for ac_expr in d_fd dd_fd; do
+
+ CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #include <sys/types.h>
+ #include <dirent.h>]],
+ [[DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;]])],
+ [dir_fd_found=yes]
+ )
+ CFLAGS=$dirfd_save_CFLAGS
+ test "$dir_fd_found" = yes && break
+ done
+ test "$dir_fd_found" = yes || ac_expr=no_such_member
+
+ gl_cv_sys_dir_fd_member_name=$ac_expr
+ ]
+ )
+ if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
+ AC_DEFINE_UNQUOTED([DIR_FD_MEMBER_NAME],
+ $gl_cv_sys_dir_fd_member_name,
+ [the name of the file descriptor member of DIR])
+ fi
+ AH_VERBATIM(DIR_TO_FD,
+ [#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+])
+ fi
+])
diff --git a/gnulib/m4/dirname.m4 b/gnulib/m4/dirname.m4
new file mode 100644
index 00000000..576b5bea
--- /dev/null
+++ b/gnulib/m4/dirname.m4
@@ -0,0 +1,26 @@
+#serial 8 -*- autoconf -*-
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_DIRNAME],
+[
+ AC_REQUIRE([gl_DIRNAME_LGPL])
+ AC_LIBOBJ([basename])
+ AC_LIBOBJ([dirname])
+])
+
+AC_DEFUN([gl_DIRNAME_LGPL],
+[
+ AC_LIBOBJ([basename-lgpl])
+ AC_LIBOBJ([dirname-lgpl])
+ AC_LIBOBJ([stripslash])
+
+ dnl Prerequisites of lib/dirname.h.
+ AC_REQUIRE([gl_AC_DOS])
+ AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
+
+ dnl No prerequisites of lib/basename-lgpl.c, lib/dirname-lgpl.c,
+ dnl lib/stripslash.c.
+])
diff --git a/gnulib/m4/dos.m4 b/gnulib/m4/dos.m4
new file mode 100644
index 00000000..5660542b
--- /dev/null
+++ b/gnulib/m4/dos.m4
@@ -0,0 +1,71 @@
+#serial 11 -*- autoconf -*-
+
+# Define some macros required for proper operation of code in lib/*.c
+# on MSDOS/Windows systems.
+
+# Copyright (C) 2000-2001, 2004-2006, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# From Jim Meyering.
+
+AC_DEFUN([gl_AC_DOS],
+ [
+ AC_CACHE_CHECK([whether system is Windows or MSDOS], [ac_cv_win_or_dos],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
+#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__
+neither MSDOS nor Windows
+#endif]])],
+ [ac_cv_win_or_dos=yes],
+ [ac_cv_win_or_dos=no])
+ ])
+
+ if test x"$ac_cv_win_or_dos" = xyes; then
+ ac_fs_accepts_drive_letter_prefix=1
+ ac_fs_backslash_is_file_name_separator=1
+ AC_CACHE_CHECK([whether drive letter can start relative path],
+ [ac_cv_drive_letter_can_be_relative],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
+#if defined __CYGWIN__
+drive letters are always absolute
+#endif]])],
+ [ac_cv_drive_letter_can_be_relative=yes],
+ [ac_cv_drive_letter_can_be_relative=no])
+ ])
+ if test x"$ac_cv_drive_letter_can_be_relative" = xyes; then
+ ac_fs_drive_letter_can_be_relative=1
+ else
+ ac_fs_drive_letter_can_be_relative=0
+ fi
+ else
+ ac_fs_accepts_drive_letter_prefix=0
+ ac_fs_backslash_is_file_name_separator=0
+ ac_fs_drive_letter_can_be_relative=0
+ fi
+
+ AC_DEFINE_UNQUOTED([FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX],
+ $ac_fs_accepts_drive_letter_prefix,
+ [Define on systems for which file names may have a so-called
+ `drive letter' prefix, define this to compute the length of that
+ prefix, including the colon.])
+
+ AH_VERBATIM(ISSLASH,
+ [#if FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#else
+# define ISSLASH(C) ((C) == '/')
+#endif])
+
+ AC_DEFINE_UNQUOTED([FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR],
+ $ac_fs_backslash_is_file_name_separator,
+ [Define if the backslash character may also serve as a file name
+ component separator.])
+
+ AC_DEFINE_UNQUOTED([FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE],
+ $ac_fs_drive_letter_can_be_relative,
+ [Define if a drive letter prefix denotes a relative path if it is
+ not followed by a file name component separator.])
+ ])
diff --git a/gnulib/m4/double-slash-root.m4 b/gnulib/m4/double-slash-root.m4
new file mode 100644
index 00000000..66a79c0f
--- /dev/null
+++ b/gnulib/m4/double-slash-root.m4
@@ -0,0 +1,38 @@
+# double-slash-root.m4 serial 4 -*- Autoconf -*-
+dnl Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_DOUBLE_SLASH_ROOT],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether // is distinct from /], [gl_cv_double_slash_root],
+ [ if test x"$cross_compiling" = xyes ; then
+ # When cross-compiling, there is no way to tell whether // is special
+ # short of a list of hosts. However, the only known hosts to date
+ # that have a distinct // are Apollo DomainOS (too old to port to),
+ # Cygwin, and z/OS. If anyone knows of another system for which // has
+ # special semantics and is distinct from /, please report it to
+ # <bug-gnulib@gnu.org>.
+ case $host in
+ *-cygwin | i370-ibm-openedition)
+ gl_cv_double_slash_root=yes ;;
+ *)
+ # Be optimistic and assume that / and // are the same when we
+ # don't know.
+ gl_cv_double_slash_root='unknown, assuming no' ;;
+ esac
+ else
+ set x `ls -di / // 2>/dev/null`
+ if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then
+ gl_cv_double_slash_root=no
+ else
+ gl_cv_double_slash_root=yes
+ fi
+ fi])
+ if test "$gl_cv_double_slash_root" = yes; then
+ AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], [1],
+ [Define to 1 if // is a file system root distinct from /.])
+ fi
+])
diff --git a/gnulib/m4/dprintf-posix.m4 b/gnulib/m4/dprintf-posix.m4
new file mode 100644
index 00000000..e72f5d3d
--- /dev/null
+++ b/gnulib/m4/dprintf-posix.m4
@@ -0,0 +1,101 @@
+# dprintf-posix.m4 serial 2
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_DPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_dprintf_posix=no
+ AC_CHECK_FUNCS_ONCE([dprintf])
+ if test $ac_cv_func_dprintf = yes; then
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # dprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_dprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_dprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_DPRINTF
+ fi
+])
diff --git a/gnulib/m4/dprintf.m4 b/gnulib/m4/dprintf.m4
new file mode 100644
index 00000000..b29b6127
--- /dev/null
+++ b/gnulib/m4/dprintf.m4
@@ -0,0 +1,28 @@
+# dprintf.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_DPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([dprintf])
+ if test $ac_cv_func_dprintf = no; then
+ HAVE_DPRINTF=0
+ gl_REPLACE_DPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_DPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([dprintf])
+ if test $ac_cv_func_dprintf = yes; then
+ REPLACE_DPRINTF=1
+ fi
+ gl_PREREQ_DPRINTF
+])
+
+# Prerequisites of lib/dprintf.c.
+AC_DEFUN([gl_PREREQ_DPRINTF], [:])
diff --git a/gnulib/m4/dup2.m4 b/gnulib/m4/dup2.m4
new file mode 100644
index 00000000..998d66f8
--- /dev/null
+++ b/gnulib/m4/dup2.m4
@@ -0,0 +1,58 @@
+#serial 10
+dnl Copyright (C) 2002, 2005, 2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_DUP2],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([dup2])
+ if test $ac_cv_func_dup2 = no; then
+ HAVE_DUP2=0
+ AC_LIBOBJ([dup2])
+ else
+ AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works],
+ [AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[#include <unistd.h>
+#include <errno.h>]],
+ [if (dup2 (1, 1) == 0)
+ return 1;
+ close (0);
+ if (dup2 (0, 0) != -1)
+ return 2;
+ /* Many gnulib modules require POSIX conformance of EBADF. */
+ if (dup2 (1, 1000000) == -1 && errno != EBADF)
+ return 3;
+ return 0;
+ ])
+ ],
+ [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no],
+ [case "$host_os" in
+ mingw*) # on this platform, dup2 always returns 0 for success
+ gl_cv_func_dup2_works=no;;
+ cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
+ gl_cv_func_dup2_works=no;;
+ linux*) # On linux between 2008-07-27 and 2009-05-11, dup2 of a
+ # closed fd may yield -EBADF instead of -1 / errno=EBADF.
+ gl_cv_func_dup2_works=no;;
+ freebsd*) # on FreeBSD 6.1, dup2(1,1000000) gives EMFILE, not EBADF.
+ gl_cv_func_dup2_works=no;;
+ *) gl_cv_func_dup2_works=yes;;
+ esac])
+ ])
+ if test "$gl_cv_func_dup2_works" = no; then
+ gl_REPLACE_DUP2
+ fi
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_DUP2],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ if test $ac_cv_func_dup2 = yes; then
+ REPLACE_DUP2=1
+ fi
+ AC_LIBOBJ([dup2])
+])
diff --git a/gnulib/m4/dup3.m4 b/gnulib/m4/dup3.m4
new file mode 100644
index 00000000..b5fbaca9
--- /dev/null
+++ b/gnulib/m4/dup3.m4
@@ -0,0 +1,18 @@
+# dup3.m4 serial 2
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_DUP3],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade glibc <unistd.h> to declare dup3().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([dup3])
+ if test $ac_cv_func_dup3 != yes; then
+ HAVE_DUP3=0
+ fi
+])
diff --git a/gnulib/m4/duplocale.m4 b/gnulib/m4/duplocale.m4
new file mode 100644
index 00000000..91a8ffd9
--- /dev/null
+++ b/gnulib/m4/duplocale.m4
@@ -0,0 +1,56 @@
+# duplocale.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_DUPLOCALE],
+[
+ AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([duplocale])
+ if test $ac_cv_func_duplocale = yes; then
+ dnl Check against glibc bug where duplocale crashes.
+ dnl See <http://sourceware.org/bugzilla/show_bug.cgi?id=10969>.
+ AC_REQUIRE([gl_LOCALE_H])
+ AC_CACHE_CHECK([whether duplocale(LC_GLOBAL_LOCALE) works],
+ [gl_cv_func_duplocale_works],
+ [AC_TRY_RUN([
+#include <locale.h>
+#if HAVE_XLOCALE_H
+# include <xlocale.h>
+#endif
+int main ()
+{
+ (void) duplocale (LC_GLOBAL_LOCALE);
+ return 0;
+}], [gl_cv_func_duplocale_works=yes], [gl_cv_func_duplocale_works=no],
+ [dnl Guess it works except on glibc < 2.12.
+ AC_EGREP_CPP([Unlucky GNU user], [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ < 12)
+ Unlucky GNU user
+ #endif
+#endif
+ ],
+ [gl_cv_func_duplocale_works="guessing no"],
+ [gl_cv_func_duplocale_works="guessing yes"])
+ ])
+ ])
+ case "$gl_cv_func_duplocale_works" in
+ *no) REPLACE_DUPLOCALE=1 ;;
+ esac
+ fi
+ if test $REPLACE_DUPLOCALE = 1; then
+ gl_REPLACE_LOCALE_H
+ AC_LIBOBJ([duplocale])
+ gl_PREREQ_DUPLOCALE
+ fi
+])
+
+# Prerequisites of lib/duplocale.c.
+AC_DEFUN([gl_PREREQ_DUPLOCALE],
+[
+ :
+])
diff --git a/gnulib/m4/eaccess.m4 b/gnulib/m4/eaccess.m4
new file mode 100644
index 00000000..90d0417d
--- /dev/null
+++ b/gnulib/m4/eaccess.m4
@@ -0,0 +1,12 @@
+# eaccess.m4 serial 2
+dnl Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_EACCESS],
+[
+ AC_CHECK_FUNC([eaccess], ,
+ [AC_DEFINE([eaccess], [access],
+ [Define as 'access' if you don't have the eaccess() function.])])
+])
diff --git a/gnulib/m4/eealloc.m4 b/gnulib/m4/eealloc.m4
new file mode 100644
index 00000000..63dd9202
--- /dev/null
+++ b/gnulib/m4/eealloc.m4
@@ -0,0 +1,32 @@
+# eealloc.m4 serial 2
+dnl Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EEALLOC],
+[
+ AC_REQUIRE([gl_EEMALLOC])
+ AC_REQUIRE([gl_EEREALLOC])
+ AC_REQUIRE([AC_C_INLINE])
+])
+
+AC_DEFUN([gl_EEMALLOC],
+[
+ _AC_FUNC_MALLOC_IF(
+ [gl_cv_func_malloc_0_nonnull=1],
+ [gl_cv_func_malloc_0_nonnull=0])
+ AC_DEFINE_UNQUOTED([MALLOC_0_IS_NONNULL], [$gl_cv_func_malloc_0_nonnull],
+ [If malloc(0) is != NULL, define this to 1. Otherwise define this
+ to 0.])
+])
+
+AC_DEFUN([gl_EEREALLOC],
+[
+ _AC_FUNC_REALLOC_IF(
+ [gl_cv_func_realloc_0_nonnull=1],
+ [gl_cv_func_realloc_0_nonnull=0])
+ AC_DEFINE_UNQUOTED([REALLOC_0_IS_NONNULL], [$gl_cv_func_realloc_0_nonnull],
+ [If realloc(NULL,0) is != NULL, define this to 1. Otherwise define this
+ to 0.])
+])
diff --git a/gnulib/m4/environ.m4 b/gnulib/m4/environ.m4
new file mode 100644
index 00000000..5f50d6e3
--- /dev/null
+++ b/gnulib/m4/environ.m4
@@ -0,0 +1,36 @@
+# environ.m4 serial 3
+dnl Copyright (C) 2001-2004, 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_ENVIRON],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ dnl Persuade glibc <unistd.h> to declare environ.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ gt_CHECK_VAR_DECL([#include <unistd.h>], environ)
+ if test $gt_cv_var_environ_declaration != yes; then
+ HAVE_DECL_ENVIRON=0
+ fi
+])
+
+# Check if a variable is properly declared.
+# gt_CHECK_VAR_DECL(includes,variable)
+AC_DEFUN([gt_CHECK_VAR_DECL],
+[
+ define([gt_cv_var], [gt_cv_var_]$2[_declaration])
+ AC_MSG_CHECKING([if $2 is properly declared])
+ AC_CACHE_VAL([gt_cv_var], [
+ AC_TRY_COMPILE([$1
+ extern struct { int foo; } $2;],
+ [$2.foo = 1;],
+ gt_cv_var=no,
+ gt_cv_var=yes)])
+ AC_MSG_RESULT([$gt_cv_var])
+ if test $gt_cv_var = yes; then
+ AC_DEFINE([HAVE_]translit($2, [a-z], [A-Z])[_DECL], 1,
+ [Define if you have the declaration of $2.])
+ fi
+ undefine([gt_cv_var])
+])
diff --git a/gnulib/m4/errno_h.m4 b/gnulib/m4/errno_h.m4
new file mode 100644
index 00000000..d02a0393
--- /dev/null
+++ b/gnulib/m4/errno_h.m4
@@ -0,0 +1,115 @@
+# errno_h.m4 serial 6
+dnl Copyright (C) 2004, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_HEADER_ERRNO_H],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([for complete errno.h], [gl_cv_header_errno_h_complete], [
+ AC_EGREP_CPP([booboo],[
+#include <errno.h>
+#if !defined ENOMSG
+booboo
+#endif
+#if !defined EIDRM
+booboo
+#endif
+#if !defined ENOLINK
+booboo
+#endif
+#if !defined EPROTO
+booboo
+#endif
+#if !defined EMULTIHOP
+booboo
+#endif
+#if !defined EBADMSG
+booboo
+#endif
+#if !defined EOVERFLOW
+booboo
+#endif
+#if !defined ENOTSUP
+booboo
+#endif
+#if !defined ESTALE
+booboo
+#endif
+#if !defined ECANCELED
+booboo
+#endif
+ ],
+ [gl_cv_header_errno_h_complete=no],
+ [gl_cv_header_errno_h_complete=yes])
+ ])
+ if test $gl_cv_header_errno_h_complete = yes; then
+ ERRNO_H=''
+ else
+ gl_CHECK_NEXT_HEADERS([errno.h])
+ ERRNO_H='errno.h'
+ fi
+ AC_SUBST([ERRNO_H])
+ gl_REPLACE_ERRNO_VALUE([EMULTIHOP])
+ gl_REPLACE_ERRNO_VALUE([ENOLINK])
+ gl_REPLACE_ERRNO_VALUE([EOVERFLOW])
+])
+
+# Assuming $1 = EOVERFLOW.
+# The EOVERFLOW errno value ought to be defined in <errno.h>, according to
+# POSIX. But some systems (like OpenBSD 4.0 or AIX 3) don't define it, and
+# some systems (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined.
+# Check for the value of EOVERFLOW.
+# Set the variables EOVERFLOW_HIDDEN and EOVERFLOW_VALUE.
+AC_DEFUN([gl_REPLACE_ERRNO_VALUE],
+[
+ if test -n "$ERRNO_H"; then
+ AC_CACHE_CHECK([for ]$1[ value], [gl_cv_header_errno_h_]$1, [
+ AC_EGREP_CPP([yes],[
+#include <errno.h>
+#ifdef ]$1[
+yes
+#endif
+ ],
+ [gl_cv_header_errno_h_]$1[=yes],
+ [gl_cv_header_errno_h_]$1[=no])
+ if test $gl_cv_header_errno_h_]$1[ = no; then
+ AC_EGREP_CPP([yes],[
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef ]$1[
+yes
+#endif
+ ], [gl_cv_header_errno_h_]$1[=hidden])
+ if test $gl_cv_header_errno_h_]$1[ = hidden; then
+ dnl The macro exists but is hidden.
+ dnl Define it to the same value.
+ AC_COMPUTE_INT([gl_cv_header_errno_h_]$1, $1, [
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+])
+ fi
+ fi
+ ])
+ case $gl_cv_header_errno_h_]$1[ in
+ yes | no)
+ ]$1[_HIDDEN=0; ]$1[_VALUE=
+ ;;
+ *)
+ ]$1[_HIDDEN=1; ]$1[_VALUE="$gl_cv_header_errno_h_]$1["
+ ;;
+ esac
+ AC_SUBST($1[_HIDDEN])
+ AC_SUBST($1[_VALUE])
+ fi
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
diff --git a/gnulib/m4/error.m4 b/gnulib/m4/error.m4
new file mode 100644
index 00000000..9f1307a4
--- /dev/null
+++ b/gnulib/m4/error.m4
@@ -0,0 +1,22 @@
+#serial 12
+
+# Copyright (C) 1996-1998, 2001-2004, 2009-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+AC_DEFUN([gl_ERROR],
+[
+ AC_FUNC_ERROR_AT_LINE
+ dnl Note: AC_FUNC_ERROR_AT_LINE does AC_LIBSOURCES([error.h, error.c]).
+ gl_PREREQ_ERROR
+])
+
+# Prerequisites of lib/error.c.
+AC_DEFUN([gl_PREREQ_ERROR],
+[
+ AC_REQUIRE([AC_FUNC_STRERROR_R])
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
diff --git a/gnulib/m4/euidaccess.m4 b/gnulib/m4/euidaccess.m4
new file mode 100644
index 00000000..a0ae06b1
--- /dev/null
+++ b/gnulib/m4/euidaccess.m4
@@ -0,0 +1,53 @@
+# euidaccess.m4 serial 12
+dnl Copyright (C) 2002-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_NONREENTRANT_EUIDACCESS],
+[
+ AC_REQUIRE([gl_FUNC_EUIDACCESS])
+ AC_DEFINE([PREFER_NONREENTRANT_EUIDACCESS], [1],
+ [Define this if you prefer euidaccess to return the correct result
+ even if this would make it nonreentrant. Define this only if your
+ entire application is safe even if the uid or gid might temporarily
+ change. If your application uses signal handlers or threads it
+ is probably not safe.])
+])
+
+AC_DEFUN([gl_FUNC_EUIDACCESS],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade glibc <unistd.h> to declare euidaccess().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REPLACE_FUNCS([euidaccess])
+ if test $ac_cv_func_euidaccess = no; then
+ HAVE_EUIDACCESS=0
+ gl_PREREQ_EUIDACCESS
+ fi
+])
+
+# Prerequisites of lib/euidaccess.c.
+AC_DEFUN([gl_PREREQ_EUIDACCESS], [
+ dnl Prefer POSIX faccessat over non-standard euidaccess.
+ AC_CHECK_FUNCS_ONCE([faccessat])
+ dnl Try various other non-standard fallbacks.
+ AC_CHECK_HEADERS_ONCE([libgen.h])
+ AC_CHECK_DECLS_ONCE([setregid])
+ AC_REQUIRE([AC_FUNC_GETGROUPS])
+
+ # Solaris 9 needs -lgen to get the eaccess function.
+ # Save and restore LIBS so -lgen isn't added to it. Otherwise, *all*
+ # programs in the package would end up linked with that potentially-shared
+ # library, inducing unnecessary run-time overhead.
+ LIB_EACCESS=
+ AC_SUBST([LIB_EACCESS])
+ gl_saved_libs=$LIBS
+ AC_SEARCH_LIBS([eaccess], [gen],
+ [test "$ac_cv_search_eaccess" = "none required" ||
+ LIB_EACCESS=$ac_cv_search_eaccess])
+ AC_CHECK_FUNCS([eaccess])
+ LIBS=$gl_saved_libs
+])
diff --git a/gnulib/m4/exclude.m4 b/gnulib/m4/exclude.m4
new file mode 100644
index 00000000..72328ca2
--- /dev/null
+++ b/gnulib/m4/exclude.m4
@@ -0,0 +1,11 @@
+# exclude.m4 serial 7
+dnl Copyright (C) 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXCLUDE],
+[
+ AC_LIBOBJ([exclude])
+])
diff --git a/gnulib/m4/execute.m4 b/gnulib/m4/execute.m4
new file mode 100644
index 00000000..42641d13
--- /dev/null
+++ b/gnulib/m4/execute.m4
@@ -0,0 +1,12 @@
+# execute.m4 serial 4
+dnl Copyright (C) 2003, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXECUTE],
+[
+ dnl Prerequisites of lib/execute.c.
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_TYPE_MODE_T])
+])
diff --git a/gnulib/m4/exitfail.m4 b/gnulib/m4/exitfail.m4
new file mode 100644
index 00000000..56e2ce0d
--- /dev/null
+++ b/gnulib/m4/exitfail.m4
@@ -0,0 +1,14 @@
+# exitfail.m4 serial 6
+dnl Copyright (C) 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXITFAIL],
+[
+ AC_LIBOBJ([exitfail])
+
+ dnl No prerequisites of lib/exitfail.c.
+ :
+])
diff --git a/gnulib/m4/expl.m4 b/gnulib/m4/expl.m4
new file mode 100644
index 00000000..698a9fb8
--- /dev/null
+++ b/gnulib/m4/expl.m4
@@ -0,0 +1,59 @@
+# expl.m4 serial 1
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_EXPL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare expl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ EXPL_LIBM=
+ AC_CACHE_CHECK([whether expl() can be used without linking with libm],
+ [gl_cv_func_expl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return expl (x) > 1.5;],
+ [gl_cv_func_expl_no_libm=yes],
+ [gl_cv_func_expl_no_libm=no])
+ ])
+ if test $gl_cv_func_expl_no_libm = no; then
+ AC_CACHE_CHECK([whether expl() can be used with libm],
+ [gl_cv_func_expl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return expl (x) > 1.5;],
+ [gl_cv_func_expl_in_libm=yes],
+ [gl_cv_func_expl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_expl_in_libm = yes; then
+ EXPL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_expl_no_libm = yes \
+ || test $gl_cv_func_expl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has expl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([expl], , [HAVE_DECL_EXPL=0], [#include <math.h>])
+ else
+ HAVE_DECL_EXPL=0
+ HAVE_EXPL=0
+ AC_LIBOBJ([expl])
+ AC_REQUIRE([gl_FUNC_FLOORL])
+ EXPL_LIBM="$FLOORL_LIBM"
+ fi
+ AC_SUBST([EXPL_LIBM])
+])
diff --git a/gnulib/m4/exponentd.m4 b/gnulib/m4/exponentd.m4
new file mode 100644
index 00000000..5d44d0e0
--- /dev/null
+++ b/gnulib/m4/exponentd.m4
@@ -0,0 +1,114 @@
+# exponentd.m4 serial 1
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+AC_DEFUN([gl_DOUBLE_EXPONENT_LOCATION],
+[
+ AC_CACHE_CHECK([where to find the exponent in a 'double'],
+ [gl_cv_cc_double_expbit0],
+ [
+ AC_TRY_RUN([
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (double x)
+{
+ memory_double m;
+ size_t i;
+ /* Clear it first, in case sizeof (double) < sizeof (memory_double). */
+ memset (&m, 0, sizeof (memory_double));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25);
+ add_to_ored_words (0.5);
+ add_to_ored_words (1.0);
+ add_to_ored_words (2.0);
+ add_to_ored_words (4.0);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+ ],
+ [gl_cv_cc_double_expbit0=`cat conftest.out`],
+ [gl_cv_cc_double_expbit0="unknown"],
+ [
+ dnl On ARM, there are two 'double' floating-point formats, used by
+ dnl different sets of instructions: The older FPA instructions assume
+ dnl that they are stored in big-endian word order, while the words
+ dnl (like integer types) are stored in little-endian byte order.
+ dnl The newer VFP instructions assume little-endian order consistenly.
+ AC_EGREP_CPP([mixed_endianness], [
+#if defined arm || defined __arm || defined __arm__
+ mixed_endianness
+#endif
+ ],
+ [gl_cv_cc_double_expbit0="unknown"],
+ [
+ pushdef([AC_MSG_CHECKING],[:])dnl
+ pushdef([AC_MSG_RESULT],[:])dnl
+ pushdef([AC_MSG_RESULT_UNQUOTED],[:])dnl
+ AC_C_BIGENDIAN(
+ [gl_cv_cc_double_expbit0="word 0 bit 20"],
+ [gl_cv_cc_double_expbit0="word 1 bit 20"],
+ [gl_cv_cc_double_expbit0="unknown"])
+ popdef([AC_MSG_RESULT_UNQUOTED])dnl
+ popdef([AC_MSG_RESULT])dnl
+ popdef([AC_MSG_CHECKING])dnl
+ ])
+ ])
+ rm -f conftest.out
+ ])
+ case "$gl_cv_cc_double_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([DBL_EXPBIT0_WORD], [$word],
+ [Define as the word index where to find the exponent of 'double'.])
+ AC_DEFINE_UNQUOTED([DBL_EXPBIT0_BIT], [$bit],
+ [Define as the bit index in the word where to find bit 0 of the exponent of 'double'.])
+ ;;
+ esac
+])
diff --git a/gnulib/m4/exponentf.m4 b/gnulib/m4/exponentf.m4
new file mode 100644
index 00000000..4d8063fa
--- /dev/null
+++ b/gnulib/m4/exponentf.m4
@@ -0,0 +1,91 @@
+# exponentf.m4 serial 1
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+AC_DEFUN([gl_FLOAT_EXPONENT_LOCATION],
+[
+ AC_CACHE_CHECK([where to find the exponent in a 'float'],
+ [gl_cv_cc_float_expbit0],
+ [
+ AC_TRY_RUN([
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (float x)
+{
+ memory_float m;
+ size_t i;
+ /* Clear it first, in case
+ sizeof (float) < sizeof (memory_float). */
+ memset (&m, 0, sizeof (memory_float));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25f);
+ add_to_ored_words (0.5f);
+ add_to_ored_words (1.0f);
+ add_to_ored_words (2.0f);
+ add_to_ored_words (4.0f);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+ ],
+ [gl_cv_cc_float_expbit0=`cat conftest.out`],
+ [gl_cv_cc_float_expbit0="unknown"],
+ [gl_cv_cc_float_expbit0="word 0 bit 23"])
+ rm -f conftest.out
+ ])
+ case "$gl_cv_cc_float_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([FLT_EXPBIT0_WORD], [$word],
+ [Define as the word index where to find the exponent of 'float'.])
+ AC_DEFINE_UNQUOTED([FLT_EXPBIT0_BIT], [$bit],
+ [Define as the bit index in the word where to find bit 0 of the exponent of 'float'.])
+ ;;
+ esac
+])
diff --git a/gnulib/m4/exponentl.m4 b/gnulib/m4/exponentl.m4
new file mode 100644
index 00000000..a700d3ba
--- /dev/null
+++ b/gnulib/m4/exponentl.m4
@@ -0,0 +1,97 @@
+# exponentl.m4 serial 2
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+AC_DEFUN([gl_LONG_DOUBLE_EXPONENT_LOCATION],
+[
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_CACHE_CHECK([where to find the exponent in a 'long double'],
+ [gl_cv_cc_long_double_expbit0],
+ [
+ AC_TRY_RUN([
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { long double value; unsigned int word[NWORDS]; }
+ memory_long_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (long double x)
+{
+ memory_long_double m;
+ size_t i;
+ /* Clear it first, in case
+ sizeof (long double) < sizeof (memory_long_double). */
+ memset (&m, 0, sizeof (memory_long_double));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25L);
+ add_to_ored_words (0.5L);
+ add_to_ored_words (1.0L);
+ add_to_ored_words (2.0L);
+ add_to_ored_words (4.0L);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+ ],
+ [gl_cv_cc_long_double_expbit0=`cat conftest.out`],
+ [gl_cv_cc_long_double_expbit0="unknown"],
+ [
+ dnl When cross-compiling, we don't know. It depends on the
+ dnl ABI and compiler version. There are too many cases.
+ gl_cv_cc_long_double_expbit0="unknown"
+ ])
+ rm -f conftest.out
+ ])
+ case "$gl_cv_cc_long_double_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([LDBL_EXPBIT0_WORD], [$word],
+ [Define as the word index where to find the exponent of 'long double'.])
+ AC_DEFINE_UNQUOTED([LDBL_EXPBIT0_BIT], [$bit],
+ [Define as the bit index in the word where to find bit 0 of the exponent of 'long double'.])
+ ;;
+ esac
+])
diff --git a/gnulib/m4/extensions.m4 b/gnulib/m4/extensions.m4
new file mode 100644
index 00000000..7d9458a8
--- /dev/null
+++ b/gnulib/m4/extensions.m4
@@ -0,0 +1,118 @@
+# serial 9 -*- Autoconf -*-
+# Enable extensions on systems that normally disable them.
+
+# Copyright (C) 2003, 2006-2010 Free Software Foundation, Inc.
+# This file 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 definition of AC_USE_SYSTEM_EXTENSIONS is stolen from CVS
+# Autoconf. Perhaps we can remove this once we can assume Autoconf
+# 2.62 or later everywhere, but since CVS Autoconf mutates rapidly
+# enough in this area it's likely we'll need to redefine
+# AC_USE_SYSTEM_EXTENSIONS for quite some time.
+
+# If autoconf reports a warning
+# warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# or warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# the fix is
+# 1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked
+# but always AC_REQUIREd,
+# 2) to ensure that for each occurrence of
+# AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+# or
+# AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+# the corresponding gnulib module description has 'extensions' among
+# its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS
+# invocation occurs in gl_EARLY, not in gl_INIT.
+
+# AC_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+# Remember that #undef in AH_VERBATIM gets replaced with #define by
+# AC_DEFINE. The goal here is to define all known feature-enabling
+# macros, then, if reports of conflicts are made, disable macros that
+# cause problems on some platforms (such as __EXTENSIONS__).
+AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS],
+[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
+AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
+
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=])
+ if test "$MINIX" = yes; then
+ AC_DEFINE([_POSIX_SOURCE], [1],
+ [Define to 1 if you need to in order for `stat' and other
+ things to work.])
+ AC_DEFINE([_POSIX_1_SOURCE], [2],
+ [Define to 2 if the system does not provide POSIX.1 features
+ except with this defined.])
+ AC_DEFINE([_MINIX], [1],
+ [Define to 1 if on MINIX.])
+ fi
+
+ dnl HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to 500,
+ dnl regardless of whether the flags -Ae or _D_HPUX_SOURCE=1 are already
+ dnl provided.
+ case "$host_os" in
+ hpux*)
+ AC_DEFINE([_XOPEN_SOURCE], [500],
+ [Define to 500 only on HP-UX.])
+ ;;
+ esac
+
+ AH_VERBATIM([__EXTENSIONS__],
+[/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+])
+ AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
+ [ac_cv_safe_to_define___extensions__],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+# define __EXTENSIONS__ 1
+ ]AC_INCLUDES_DEFAULT])],
+ [ac_cv_safe_to_define___extensions__=yes],
+ [ac_cv_safe_to_define___extensions__=no])])
+ test $ac_cv_safe_to_define___extensions__ = yes &&
+ AC_DEFINE([__EXTENSIONS__])
+ AC_DEFINE([_ALL_SOURCE])
+ AC_DEFINE([_GNU_SOURCE])
+ AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
+ AC_DEFINE([_TANDEM_SOURCE])
+])# AC_USE_SYSTEM_EXTENSIONS
+
+# gl_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS],
+[
+ dnl Require this macro before AC_USE_SYSTEM_EXTENSIONS.
+ dnl gnulib does not need it. But if it gets required by third-party macros
+ dnl after AC_USE_SYSTEM_EXTENSIONS is required, autoconf 2.62..2.63 emit a
+ dnl warning: "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
+ dnl Note: We can do this only for one of the macros AC_AIX, AC_GNU_SOURCE,
+ dnl AC_MINIX. If people still use AC_AIX or AC_MINIX, they are out of luck.
+ AC_REQUIRE([AC_GNU_SOURCE])
+
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+])
diff --git a/gnulib/m4/faccessat.m4 b/gnulib/m4/faccessat.m4
new file mode 100644
index 00000000..9f75b8dc
--- /dev/null
+++ b/gnulib/m4/faccessat.m4
@@ -0,0 +1,23 @@
+# serial 3
+# See if we need to provide faccessat replacement.
+
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_FACCESSAT],
+[
+ AC_REQUIRE([gl_FUNC_OPENAT])
+ AC_REQUIRE([gl_FUNC_EUIDACCESS])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([access])
+ AC_CHECK_FUNCS_ONCE([faccessat])
+ if test $ac_cv_func_faccessat = no; then
+ HAVE_FACCESSAT=0
+ AC_LIBOBJ([faccessat])
+ fi
+])
diff --git a/gnulib/m4/fatal-signal.m4 b/gnulib/m4/fatal-signal.m4
new file mode 100644
index 00000000..138e2a3a
--- /dev/null
+++ b/gnulib/m4/fatal-signal.m4
@@ -0,0 +1,13 @@
+# fatal-signal.m4 serial 8
+dnl Copyright (C) 2003-2004, 2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FATAL_SIGNAL],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([gt_TYPE_SIG_ATOMIC_T])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ gl_PREREQ_SIG_HANDLER_H
+])
diff --git a/gnulib/m4/fbufmode.m4 b/gnulib/m4/fbufmode.m4
new file mode 100644
index 00000000..bcee79d2
--- /dev/null
+++ b/gnulib/m4/fbufmode.m4
@@ -0,0 +1,11 @@
+# fbufmode.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FBUFMODE],
+[
+ dnl Prerequisites of lib/fbufmode.c.
+ AC_CHECK_FUNCS_ONCE([__flbf])
+])
diff --git a/gnulib/m4/fchdir.m4 b/gnulib/m4/fchdir.m4
new file mode 100644
index 00000000..c05e9255
--- /dev/null
+++ b/gnulib/m4/fchdir.m4
@@ -0,0 +1,47 @@
+# fchdir.m4 serial 13
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FCHDIR],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([fchdir])
+ if test $ac_cv_func_fchdir = no; then
+ REPLACE_FCHDIR=1
+ AC_LIBOBJ([fchdir])
+ gl_PREREQ_FCHDIR
+ AC_DEFINE([REPLACE_FCHDIR], [1],
+ [Define to 1 if gnulib's fchdir() replacement is used.])
+ dnl We must also replace anything that can manipulate a directory fd,
+ dnl to keep our bookkeeping up-to-date. We don't have to replace
+ dnl fstatat, since no platform has fstatat but lacks fchdir.
+ REPLACE_OPENDIR=1
+ REPLACE_CLOSEDIR=1
+ REPLACE_DUP=1
+ gl_REPLACE_OPEN
+ gl_REPLACE_CLOSE
+ gl_REPLACE_DUP2
+ dnl dup3 is already unconditionally replaced
+ gl_REPLACE_FCNTL
+ gl_REPLACE_DIRENT_H
+ AC_CACHE_CHECK([whether open can visit directories],
+ [gl_cv_func_open_directory_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <fcntl.h>
+]], [return open(".", O_RDONLY) < 0;])],
+ [gl_cv_func_open_directory_works=yes],
+ [gl_cv_func_open_directory_works=no],
+ [gl_cv_func_open_directory_works="guessing no"])])
+ if test "$gl_cv_func_open_directory_works" != yes; then
+ AC_DEFINE([REPLACE_OPEN_DIRECTORY], [1], [Define to 1 if open() should
+work around the inability to open a directory.])
+ REPLACE_FSTAT=1
+ fi
+ fi
+])
+
+# Prerequisites of lib/fchdir.c.
+AC_DEFUN([gl_PREREQ_FCHDIR], [:])
diff --git a/gnulib/m4/fclose.m4 b/gnulib/m4/fclose.m4
new file mode 100644
index 00000000..85de6294
--- /dev/null
+++ b/gnulib/m4/fclose.m4
@@ -0,0 +1,16 @@
+# fclose.m4 serial 2
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FCLOSE],
+[
+])
+
+AC_DEFUN([gl_REPLACE_FCLOSE],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ REPLACE_FCLOSE=1
+ AC_LIBOBJ([fclose])
+])
diff --git a/gnulib/m4/fcntl-o.m4 b/gnulib/m4/fcntl-o.m4
new file mode 100644
index 00000000..67167cbd
--- /dev/null
+++ b/gnulib/m4/fcntl-o.m4
@@ -0,0 +1,81 @@
+# fcntl-o.m4 serial 1
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+# Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
+# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
+# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
+AC_DEFUN([gl_FCNTL_O_FLAGS],
+[
+ dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+ AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
+ #include <fcntl.h>
+ #ifndef O_NOATIME
+ #define O_NOATIME 0
+ #endif
+ #ifndef O_NOFOLLOW
+ #define O_NOFOLLOW 0
+ #endif
+ static int const constants[] =
+ {
+ O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+ O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+ };
+ ]],
+ [[
+ int status = !constants;
+ {
+ static char const sym[] = "conftest.sym";
+ if (symlink (".", sym) != 0
+ || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0)
+ status |= 32;
+ unlink (sym);
+ }
+ {
+ static char const file[] = "confdefs.h";
+ int fd = open (file, O_RDONLY | O_NOATIME);
+ char c;
+ struct stat st0, st1;
+ if (fd < 0
+ || fstat (fd, &st0) != 0
+ || sleep (1) != 0
+ || read (fd, &c, 1) != 1
+ || close (fd) != 0
+ || stat (file, &st1) != 0
+ || st0.st_atime != st1.st_atime)
+ status |= 64;
+ }
+ return status;]])],
+ [gl_cv_header_working_fcntl_h=yes],
+ [case $? in #(
+ 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+ 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+ 96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+ *) gl_cv_header_working_fcntl_h='no';;
+ esac],
+ [gl_cv_header_working_fcntl_h=cross-compiling])])
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+ AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
+ [Define to 1 if O_NOATIME works.])
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+ AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
+ [Define to 1 if O_NOFOLLOW works.])
+])
diff --git a/gnulib/m4/fcntl-safer.m4 b/gnulib/m4/fcntl-safer.m4
new file mode 100644
index 00000000..1a739b09
--- /dev/null
+++ b/gnulib/m4/fcntl-safer.m4
@@ -0,0 +1,19 @@
+#serial 7
+dnl Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FCNTL_SAFER],
+[
+ AC_LIBOBJ([open-safer])
+ AC_LIBOBJ([creat-safer])
+ # Prerequisites of lib/open-safer.c.
+ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
+])
+
+AC_DEFUN([gl_OPENAT_SAFER],
+[
+ AC_REQUIRE([gl_FCNTL_SAFER])
+ AC_LIBOBJ([openat-safer])
+])
diff --git a/gnulib/m4/fcntl.m4 b/gnulib/m4/fcntl.m4
new file mode 100644
index 00000000..fcb5f447
--- /dev/null
+++ b/gnulib/m4/fcntl.m4
@@ -0,0 +1,83 @@
+# fcntl.m4 serial 3
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# For now, this module ensures that fcntl()
+# - supports F_DUPFD correctly
+# - supports or emulates F_DUPFD_CLOEXEC
+# - supports F_GETFD
+# Still to be ported to mingw:
+# - F_SETFD
+# - F_GETFL, F_SETFL
+# - F_GETOWN, F_SETOWN
+# - F_GETLK, F_SETLK, F_SETLKW
+AC_DEFUN([gl_FUNC_FCNTL],
+[
+ dnl Persuade glibc to expose F_DUPFD_CLOEXEC.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([fcntl])
+ if test $ac_cv_func_fcntl = no; then
+ gl_REPLACE_FCNTL
+ else
+ dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target
+ AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly],
+ [gl_cv_func_fcntl_f_dupfd_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <fcntl.h>
+]], [[return fcntl (0, F_DUPFD, -1) != -1;
+ ]])],
+ [gl_cv_func_fcntl_f_dupfd_works=yes],
+ [gl_cv_func_fcntl_f_dupfd_works=no],
+ [# Guess that it works on glibc systems
+ case $host_os in #((
+ *-gnu*) gl_cv_func_fcntl_f_dupfd_works="guessing yes";;
+ *) gl_cv_func_fcntl_f_dupfd_works="guessing no";;
+ esac])])
+ case $gl_cv_func_fcntl_f_dupfd_works in
+ *yes) ;;
+ *) gl_REPLACE_FCNTL
+ AC_DEFINE([FCNTL_DUPFD_BUGGY], [1], [Define this to 1 if F_DUPFD
+ behavior does not match POSIX]) ;;
+ esac
+
+ dnl Many systems lack F_DUPFD_CLOEXEC
+ AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC],
+ [gl_cv_func_fcntl_f_dupfd_cloexec],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <fcntl.h>
+#ifndef F_DUPFD_CLOEXEC
+choke me
+#endif
+ ]])],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#ifdef __linux__
+/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
+ it to support the semantics on older kernels that failed with EINVAL. */
+choke me
+#endif
+ ]])],
+ [gl_cv_func_fcntl_f_dupfd_cloexec=yes],
+ [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])],
+ [gl_cv_func_fcntl_f_dupfd_cloexec=no])])
+ if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then
+ gl_REPLACE_FCNTL
+ dnl No witness macro needed for this bug.
+ fi
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_FCNTL],
+[
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([fcntl])
+ if test $ac_cv_func_fcntl = no; then
+ HAVE_FCNTL=0
+ else
+ REPLACE_FCNTL=1
+ fi
+ AC_LIBOBJ([fcntl])
+])
diff --git a/gnulib/m4/fcntl_h.m4 b/gnulib/m4/fcntl_h.m4
new file mode 100644
index 00000000..ecd8fa33
--- /dev/null
+++ b/gnulib/m4/fcntl_h.m4
@@ -0,0 +1,41 @@
+# serial 10
+# Configure fcntl.h.
+dnl Copyright (C) 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl_FCNTL_H],
+[
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ AC_REQUIRE([gl_FCNTL_O_FLAGS])
+ gl_CHECK_NEXT_HEADERS([fcntl.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, if it is not common
+ dnl enough to be declared everywhere.
+ gl_WARN_ON_USE_PREPARE([[#include <fcntl.h>
+ ]], [fcntl openat])
+])
+
+AC_DEFUN([gl_FCNTL_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_FCNTL_H_DEFAULTS],
+[
+ GNULIB_FCNTL=0; AC_SUBST([GNULIB_FCNTL])
+ GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN])
+ GNULIB_OPENAT=0; AC_SUBST([GNULIB_OPENAT])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_FCNTL=1; AC_SUBST([HAVE_FCNTL])
+ HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT])
+ REPLACE_FCNTL=0; AC_SUBST([REPLACE_FCNTL])
+ REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN])
+ REPLACE_OPENAT=0; AC_SUBST([REPLACE_OPENAT])
+])
diff --git a/gnulib/m4/fdopendir.m4 b/gnulib/m4/fdopendir.m4
new file mode 100644
index 00000000..7282d4b0
--- /dev/null
+++ b/gnulib/m4/fdopendir.m4
@@ -0,0 +1,38 @@
+# serial 3
+# See if we need to provide fdopendir.
+
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_FDOPENDIR],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([fdopendir])
+ if test $ac_cv_func_fdopendir = no; then
+ AC_LIBOBJ([openat-proc])
+ AC_LIBOBJ([fdopendir])
+ gl_REPLACE_DIRENT_H
+ HAVE_FDOPENDIR=0
+ else
+ AC_CACHE_CHECK([whether fdopendir works],
+ [gl_cv_func_fdopendir_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <dirent.h>
+#include <fcntl.h>
+]], [int fd = open ("conftest.c", O_RDONLY);
+ if (fd < 0) return 2;
+ return !!fdopendir (fd);])],
+ [gl_cv_func_fdopendir_works=yes],
+ [gl_cv_func_fdopendir_works=no],
+ [gl_cv_func_fdopendir_works="guessing no"])])
+ if test "$gl_cv_func_fdopendir_works" != yes; then
+ REPLACE_FDOPENDIR=1
+ gl_REPLACE_DIRENT_H
+ AC_LIBOBJ([fdopendir])
+ fi
+ fi
+])
diff --git a/gnulib/m4/fflush.m4 b/gnulib/m4/fflush.m4
new file mode 100644
index 00000000..56c0aedc
--- /dev/null
+++ b/gnulib/m4/fflush.m4
@@ -0,0 +1,82 @@
+# fflush.m4 serial 7
+
+# Copyright (C) 2007-2010 Free Software Foundation, Inc.
+# This file 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.
+
+dnl From Eric Blake
+
+dnl Find out how to obey POSIX semantics of fflush(stdin) discarding
+dnl unread input on seekable streams, rather than C99 undefined semantics.
+
+AC_DEFUN([gl_FUNC_FFLUSH],
+[
+ AC_CACHE_CHECK([whether fflush works on input streams],
+ [gl_cv_func_fflush_stdin],
+ [echo hello world > conftest.txt
+ AC_RUN_IFELSE([AC_LANG_PROGRAM(
+ [[
+#include <stdio.h>
+#include <unistd.h>
+ ]], [[FILE *f = fopen ("conftest.txt", "r");
+ char buffer[10];
+ int fd;
+ int c;
+ if (f == NULL)
+ return 1;
+ fd = fileno (f);
+ if (fd < 0 || fread (buffer, 1, 5, f) != 5)
+ return 2;
+ /* For deterministic results, ensure f read a bigger buffer. */
+ if (lseek (fd, 0, SEEK_CUR) == 5)
+ return 3;
+ /* POSIX requires fflush-fseek to set file offset of fd. This fails
+ on BSD systems and on mingw. */
+ if (fflush (f) != 0 || fseek (f, 0, SEEK_CUR) != 0)
+ return 4;
+ if (lseek (fd, 0, SEEK_CUR) != 5)
+ return 5;
+ /* Verify behaviour of fflush after ungetc. See
+ <http://www.opengroup.org/austin/aardvark/latest/xshbug3.txt> */
+ /* Verify behaviour of fflush after a backup ungetc. This fails on
+ mingw. */
+ c = fgetc (f);
+ ungetc (c, f);
+ fflush (f);
+ if (fgetc (f) != c)
+ return 6;
+ /* Verify behaviour of fflush after a non-backup ungetc. This fails
+ on glibc 2.8 and on BSD systems. */
+ c = fgetc (f);
+ ungetc ('@', f);
+ fflush (f);
+ if (fgetc (f) != c)
+ return 7;
+ return 0;
+ ]])], [gl_cv_func_fflush_stdin=yes], [gl_cv_func_fflush_stdin=no],
+ [dnl Pessimistically assume fflush is broken.
+ gl_cv_func_fflush_stdin=no])
+ rm conftest.txt
+ ])
+ if test $gl_cv_func_fflush_stdin = no; then
+ gl_REPLACE_FFLUSH
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_FFLUSH],
+[
+ AC_LIBOBJ([fflush])
+ AC_LIBOBJ([fseeko])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ REPLACE_FFLUSH=1
+ REPLACE_FSEEKO=1
+ gl_PREREQ_FFLUSH
+])
+
+# Prerequisites of lib/fflush.c.
+AC_DEFUN([gl_PREREQ_FFLUSH],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
diff --git a/gnulib/m4/file-type.m4 b/gnulib/m4/file-type.m4
new file mode 100644
index 00000000..f021aca5
--- /dev/null
+++ b/gnulib/m4/file-type.m4
@@ -0,0 +1,10 @@
+# file-type.m4 serial 6
+dnl Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FILE_TYPE],
+[
+ AC_LIBOBJ([file-type])
+])
diff --git a/gnulib/m4/fileblocks.m4 b/gnulib/m4/fileblocks.m4
new file mode 100644
index 00000000..7b74ca1a
--- /dev/null
+++ b/gnulib/m4/fileblocks.m4
@@ -0,0 +1,20 @@
+# fileblocks.m4 serial 5
+dnl Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FILEBLOCKS],
+[
+ AC_STRUCT_ST_BLOCKS
+ dnl Note: AC_STRUCT_ST_BLOCKS does AC_LIBOBJ([fileblocks]).
+ if test $ac_cv_member_struct_stat_st_blocks = no; then
+ gl_PREREQ_FILEBLOCKS
+ fi
+])
+
+# Prerequisites of lib/fileblocks.c.
+AC_DEFUN([gl_PREREQ_FILEBLOCKS], [
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+ :
+])
diff --git a/gnulib/m4/filemode.m4 b/gnulib/m4/filemode.m4
new file mode 100644
index 00000000..39fa26a0
--- /dev/null
+++ b/gnulib/m4/filemode.m4
@@ -0,0 +1,12 @@
+# filemode.m4 serial 7
+dnl Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FILEMODE],
+[
+ AC_REQUIRE([AC_STRUCT_ST_DM_MODE])
+ AC_LIBOBJ([filemode])
+ AC_CHECK_DECLS_ONCE([strmode])
+])
diff --git a/gnulib/m4/filenamecat.m4 b/gnulib/m4/filenamecat.m4
new file mode 100644
index 00000000..236e5b05
--- /dev/null
+++ b/gnulib/m4/filenamecat.m4
@@ -0,0 +1,19 @@
+# filenamecat.m4 serial 10
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FILE_NAME_CONCAT],
+[
+ AC_REQUIRE([gl_FILE_NAME_CONCAT_LGPL])
+ AC_LIBOBJ([filenamecat])
+])
+
+AC_DEFUN([gl_FILE_NAME_CONCAT_LGPL],
+[
+ AC_LIBOBJ([filenamecat-lgpl])
+
+ dnl Prerequisites of lib/filenamecat-lgpl.c.
+ AC_CHECK_FUNCS_ONCE([mempcpy])
+])
diff --git a/gnulib/m4/findprog.m4 b/gnulib/m4/findprog.m4
new file mode 100644
index 00000000..3008cb9c
--- /dev/null
+++ b/gnulib/m4/findprog.m4
@@ -0,0 +1,12 @@
+# findprog.m4 serial 2
+dnl Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FINDPROG],
+[
+ dnl Prerequisites of lib/findprog.c.
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_REQUIRE([gl_FUNC_EACCESS])
+])
diff --git a/gnulib/m4/flexmember.m4 b/gnulib/m4/flexmember.m4
new file mode 100644
index 00000000..10462435
--- /dev/null
+++ b/gnulib/m4/flexmember.m4
@@ -0,0 +1,41 @@
+# serial 2
+# Check for flexible array member support.
+
+# Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Paul Eggert.
+
+AC_DEFUN([AC_C_FLEXIBLE_ARRAY_MEMBER],
+[
+ AC_CACHE_CHECK([for flexible array member],
+ ac_cv_c_flexmember,
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <stdio.h>
+ #include <stddef.h>
+ struct s { int n; double d[]; };]],
+ [[int m = getchar ();
+ struct s *p = malloc (offsetof (struct s, d)
+ + m * sizeof (double));
+ p->d[0] = 0.0;
+ return p->d != (double *) NULL;]])],
+ [ac_cv_c_flexmember=yes],
+ [ac_cv_c_flexmember=no])])
+ if test $ac_cv_c_flexmember = yes; then
+ AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [],
+ [Define to nothing if C supports flexible array members, and to
+ 1 if it does not. That way, with a declaration like `struct s
+ { int n; double d@<:@FLEXIBLE_ARRAY_MEMBER@:>@; };', the struct hack
+ can be used with pre-C99 compilers.
+ When computing the size of such an object, don't use 'sizeof (struct s)'
+ as it overestimates the size. Use 'offsetof (struct s, d)' instead.
+ Don't use 'offsetof (struct s, d@<:@0@:>@)', as this doesn't work with
+ MSVC and with C++ compilers.])
+ else
+ AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1])
+ fi
+])
diff --git a/gnulib/m4/float_h.m4 b/gnulib/m4/float_h.m4
new file mode 100644
index 00000000..a74a0d95
--- /dev/null
+++ b/gnulib/m4/float_h.m4
@@ -0,0 +1,19 @@
+# float_h.m4 serial 3
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FLOAT_H],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ FLOAT_H=
+ case "$host_os" in
+ beos* | openbsd*)
+ FLOAT_H=float.h
+ gl_CHECK_NEXT_HEADERS([float.h])
+ ;;
+ esac
+ AC_SUBST([FLOAT_H])
+])
diff --git a/gnulib/m4/flock.m4 b/gnulib/m4/flock.m4
new file mode 100644
index 00000000..ca6e24f8
--- /dev/null
+++ b/gnulib/m4/flock.m4
@@ -0,0 +1,26 @@
+# flock.m4 serial 1
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FLOCK],
+[
+ AC_REQUIRE([gl_HEADER_SYS_FILE_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([flock])
+ if test $ac_cv_func_flock = no; then
+ HAVE_FLOCK=0
+ AC_LIBOBJ([flock])
+ gl_PREREQ_FLOCK
+ fi
+])
+
+dnl Prerequisites of lib/flock.c.
+AC_DEFUN([gl_PREREQ_FLOCK],
+[
+ AC_CHECK_FUNCS_ONCE([fcntl])
+ AC_CHECK_HEADERS_ONCE([unistd.h fcntl.h])
+
+ dnl Do we have a POSIX fcntl lock implementation?
+ AC_CHECK_MEMBERS([struct flock.l_type],[],[],[[#include <fcntl.h>]])
+])
diff --git a/gnulib/m4/floor.m4 b/gnulib/m4/floor.m4
new file mode 100644
index 00000000..ad6a1e49
--- /dev/null
+++ b/gnulib/m4/floor.m4
@@ -0,0 +1,46 @@
+# floor.m4 serial 3
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FLOOR],
+[
+ dnl Test whether floor() can be used without libm.
+ gl_FUNC_FLOOR_LIBS
+ if test "$FLOOR_LIBM" = "?"; then
+ FLOOR_LIBM=
+ fi
+ AC_SUBST([FLOOR_LIBM])
+])
+
+# Determines the libraries needed to get the floor() function.
+# Sets FLOOR_LIBM.
+AC_DEFUN([gl_FUNC_FLOOR_LIBS],
+[
+ gl_CACHE_VAL_SILENT([gl_cv_func_floor_libm], [
+ gl_cv_func_floor_libm=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ double x;],
+ [x = floor(x);],
+ [gl_cv_func_floor_libm=])
+ if test "$gl_cv_func_floor_libm" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ double x;],
+ [x = floor(x);],
+ [gl_cv_func_floor_libm="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ ])
+ FLOOR_LIBM="$gl_cv_func_floor_libm"
+])
diff --git a/gnulib/m4/floorf.m4 b/gnulib/m4/floorf.m4
new file mode 100644
index 00000000..cede8081
--- /dev/null
+++ b/gnulib/m4/floorf.m4
@@ -0,0 +1,62 @@
+# floorf.m4 serial 4
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FLOORF],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare floorf().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl Test whether floorf() is declared.
+ AC_CHECK_DECLS([floorf], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_floorf" = yes; then
+ dnl Test whether floorf() can be used without libm.
+ gl_FUNC_FLOORF_LIBS
+ if test "$FLOORF_LIBM" = "?"; then
+ dnl Sun C 5.0 on Solaris declares floorf() and has it in the system-wide
+ dnl libm.so, but not in the libm.so that the compiler uses.
+ REPLACE_FLOORF=1
+ fi
+ else
+ REPLACE_FLOORF=1
+ fi
+ if test $REPLACE_FLOORF = 1; then
+ AC_LIBOBJ([floorf])
+ FLOORF_LIBM=
+ fi
+ AC_SUBST([REPLACE_FLOORF])
+ AC_SUBST([FLOORF_LIBM])
+])
+
+# Determines the libraries needed to get the floorf() function.
+# Sets FLOORF_LIBM.
+AC_DEFUN([gl_FUNC_FLOORF_LIBS],
+[
+ gl_CACHE_VAL_SILENT([gl_cv_func_floorf_libm], [
+ gl_cv_func_floorf_libm=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ float x;],
+ [x = floorf(x);],
+ [gl_cv_func_floorf_libm=])
+ if test "$gl_cv_func_floorf_libm" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ float x;],
+ [x = floorf(x);],
+ [gl_cv_func_floorf_libm="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ ])
+ FLOORF_LIBM="$gl_cv_func_floorf_libm"
+])
diff --git a/gnulib/m4/floorl.m4 b/gnulib/m4/floorl.m4
new file mode 100644
index 00000000..792c09fe
--- /dev/null
+++ b/gnulib/m4/floorl.m4
@@ -0,0 +1,62 @@
+# floorl.m4 serial 4
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FLOORL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare floorl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl Test whether floorl() is declared.
+ AC_CHECK_DECLS([floorl], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_floorl" = yes; then
+ dnl Test whether floorl() can be used without libm.
+ gl_FUNC_FLOORL_LIBS
+ if test "$FLOORL_LIBM" = "?"; then
+ dnl Sun C 5.0 on Solaris declares floorl() and has it in the system-wide
+ dnl libm.so, but not in the libm.so that the compiler uses.
+ REPLACE_FLOORL=1
+ fi
+ else
+ REPLACE_FLOORL=1
+ fi
+ if test $REPLACE_FLOORL = 1; then
+ AC_LIBOBJ([floorl])
+ FLOORL_LIBM=
+ fi
+ AC_SUBST([REPLACE_FLOORL])
+ AC_SUBST([FLOORL_LIBM])
+])
+
+# Determines the libraries needed to get the floorl() function.
+# Sets FLOORL_LIBM.
+AC_DEFUN([gl_FUNC_FLOORL_LIBS],
+[
+ gl_CACHE_VAL_SILENT([gl_cv_func_floorl_libm], [
+ gl_cv_func_floorl_libm=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [x = floorl(x);],
+ [gl_cv_func_floorl_libm=])
+ if test "$gl_cv_func_floorl_libm" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [x = floorl(x);],
+ [gl_cv_func_floorl_libm="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ ])
+ FLOORL_LIBM="$gl_cv_func_floorl_libm"
+])
diff --git a/gnulib/m4/fnmatch.m4 b/gnulib/m4/fnmatch.m4
new file mode 100644
index 00000000..212ead57
--- /dev/null
+++ b/gnulib/m4/fnmatch.m4
@@ -0,0 +1,121 @@
+# Check for fnmatch - serial 4.
+
+# Copyright (C) 2000-2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Autoconf defines AC_FUNC_FNMATCH, but that is obsolescent.
+# New applications should use the macros below instead.
+
+# Request a POSIX compliant fnmatch function.
+AC_DEFUN([gl_FUNC_FNMATCH_POSIX],
+[
+ m4_divert_text([DEFAULTS], [gl_fnmatch_required=POSIX])
+
+ dnl Persuade glibc <fnmatch.h> to declare FNM_CASEFOLD etc.
+ dnl This is only needed if gl_fnmatch_required = GNU. It would be possible
+ dnl to avoid this dependency for gl_FUNC_FNMATCH_POSIX by putting
+ dnl gl_FUNC_FNMATCH_GNU into a separate .m4 file.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ FNMATCH_H=
+ gl_fnmatch_required_lowercase=`echo $gl_fnmatch_required | tr 'A-Z' 'a-z'`
+ gl_fnmatch_cache_var="gl_cv_func_fnmatch_${gl_fnmatch_required_lowercase}"
+ AC_CACHE_CHECK([for working $gl_fnmatch_required fnmatch],
+ [$gl_fnmatch_cache_var],
+ [dnl Some versions of Solaris, SCO, and the GNU C Library
+ dnl have a broken or incompatible fnmatch.
+ dnl So we run a test program. If we are cross-compiling, take no chance.
+ dnl Thanks to John Oleynick, François Pinard, and Paul Eggert for this
+ dnl test.
+ if test $gl_fnmatch_required = GNU; then
+ gl_fnmatch_gnu_start=
+ gl_fnmatch_gnu_end=
+ else
+ gl_fnmatch_gnu_start='#if 0'
+ gl_fnmatch_gnu_end='#endif'
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <fnmatch.h>
+ static int
+ y (char const *pattern, char const *string, int flags)
+ {
+ return fnmatch (pattern, string, flags) == 0;
+ }
+ static int
+ n (char const *pattern, char const *string, int flags)
+ {
+ return fnmatch (pattern, string, flags) == FNM_NOMATCH;
+ }
+ ]],
+ [[char const *Apat = 'A' < '\\\\' ? "[A-\\\\\\\\]" : "[\\\\\\\\-A]";
+ char const *apat = 'a' < '\\\\' ? "[a-\\\\\\\\]" : "[\\\\\\\\-a]";
+ static char const A_1[] = { 'A' - 1, 0 };
+ static char const A01[] = { 'A' + 1, 0 };
+ static char const a_1[] = { 'a' - 1, 0 };
+ static char const a01[] = { 'a' + 1, 0 };
+ static char const bs_1[] = { '\\\\' - 1, 0 };
+ static char const bs01[] = { '\\\\' + 1, 0 };
+ return
+ !(n ("a*", "", 0)
+ && y ("a*", "abc", 0)
+ && n ("d*/*1", "d/s/1", FNM_PATHNAME)
+ && y ("a\\\\bc", "abc", 0)
+ && n ("a\\\\bc", "abc", FNM_NOESCAPE)
+ && y ("*x", ".x", 0)
+ && n ("*x", ".x", FNM_PERIOD)
+ && y (Apat, "\\\\", 0) && y (Apat, "A", 0)
+ && y (apat, "\\\\", 0) && y (apat, "a", 0)
+ && n (Apat, A_1, 0) == ('A' < '\\\\')
+ && n (apat, a_1, 0) == ('a' < '\\\\')
+ && y (Apat, A01, 0) == ('A' < '\\\\')
+ && y (apat, a01, 0) == ('a' < '\\\\')
+ && y (Apat, bs_1, 0) == ('A' < '\\\\')
+ && y (apat, bs_1, 0) == ('a' < '\\\\')
+ && n (Apat, bs01, 0) == ('A' < '\\\\')
+ && n (apat, bs01, 0) == ('a' < '\\\\')
+ $gl_fnmatch_gnu_start
+ && y ("xxXX", "xXxX", FNM_CASEFOLD)
+ && y ("a++(x|yy)b", "a+xyyyyxb", FNM_EXTMATCH)
+ && n ("d*/*1", "d/s/1", FNM_FILE_NAME)
+ && y ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR)
+ && y ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR)
+ && y ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR)
+ $gl_fnmatch_gnu_end
+ );
+ ]])],
+ [eval "$gl_fnmatch_cache_var=yes"],
+ [eval "$gl_fnmatch_cache_var=no"],
+ [eval "$gl_fnmatch_cache_var=\"guessing no\""])
+ ])
+ eval "gl_fnmatch_result=\"\$$gl_fnmatch_cache_var\""
+ if test "$gl_fnmatch_result" = yes; then
+ dnl Not strictly necessary. Only to avoid spurious leftover files if people
+ dnl don't do "make distclean".
+ rm -f "$gl_source_base/fnmatch.h"
+ else
+ FNMATCH_H=fnmatch.h
+ AC_LIBOBJ([fnmatch])
+ dnl We must choose a different name for our function, since on ELF systems
+ dnl a broken fnmatch() in libc.so would override our fnmatch() if it is
+ dnl compiled into a shared library.
+ AC_DEFINE_UNQUOTED([fnmatch], [${gl_fnmatch_required_lowercase}_fnmatch],
+ [Define to a replacement function name for fnmatch().])
+ dnl Prerequisites of lib/fnmatch.c.
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ AC_CHECK_DECLS([isblank], [], [], [#include <ctype.h>])
+ AC_CHECK_FUNCS_ONCE([btowc isblank iswctype mbsrtowcs mempcpy wmemchr wmemcpy wmempcpy])
+ AC_CHECK_HEADERS_ONCE([wctype.h])
+ fi
+ AC_SUBST([FNMATCH_H])
+])
+
+# Request a POSIX compliant fnmatch function with GNU extensions.
+AC_DEFUN([gl_FUNC_FNMATCH_GNU],
+[
+ m4_divert_text([INIT_PREPARE], [gl_fnmatch_required=GNU])
+
+ AC_REQUIRE([gl_FUNC_FNMATCH_POSIX])
+])
diff --git a/gnulib/m4/fopen.m4 b/gnulib/m4/fopen.m4
new file mode 100644
index 00000000..6d2b0948
--- /dev/null
+++ b/gnulib/m4/fopen.m4
@@ -0,0 +1,61 @@
+# fopen.m4 serial 5
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FOPEN],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw* | pw*)
+ dnl Replace fopen, for handling of "/dev/null".
+ REPLACE_FOPEN=1
+ dnl fopen on mingw also has the trailing slash bug.
+ gl_cv_func_fopen_slash="guessing no"
+ ;;
+ *)
+ dnl fopen("foo/", "w") should not create a file when the file name has a
+ dnl trailing slash.
+ AC_CACHE_CHECK([whether fopen recognizes a trailing slash],
+ [gl_cv_func_fopen_slash],
+ [
+ AC_TRY_RUN([
+#include <stddef.h>
+#include <stdio.h>
+int main ()
+{
+ return fopen ("conftest.sl/", "w") != NULL;
+}], [gl_cv_func_fopen_slash=yes], [gl_cv_func_fopen_slash=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ solaris2.[0-9]*) gl_cv_func_fopen_slash="guessing no" ;;
+ hpux*) gl_cv_func_fopen_slash="guessing no" ;;
+ *) gl_cv_func_fopen_slash="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ rm -f conftest.sl
+ ])
+ ;;
+ esac
+ case "$gl_cv_func_fopen_slash" in
+ *no)
+ AC_DEFINE([FOPEN_TRAILING_SLASH_BUG], [1],
+ [Define to 1 if fopen() fails to recognize a trailing slash.])
+ REPLACE_FOPEN=1
+ ;;
+ esac
+ if test $REPLACE_FOPEN = 1; then
+ AC_LIBOBJ([fopen])
+ gl_PREREQ_FOPEN
+ fi
+])
+
+# Prerequisites of lib/fopen.c.
+AC_DEFUN([gl_PREREQ_FOPEN],
+[
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/fpending.m4 b/gnulib/m4/fpending.m4
new file mode 100644
index 00000000..09ae7e3f
--- /dev/null
+++ b/gnulib/m4/fpending.m4
@@ -0,0 +1,83 @@
+# serial 15
+
+# Copyright (C) 2000-2001, 2004-2010 Free Software Foundation, Inc.
+# This file 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.
+
+dnl From Jim Meyering
+dnl Using code from emacs, based on suggestions from Paul Eggert
+dnl and Ulrich Drepper.
+
+dnl Find out how to determine the number of pending output bytes on a stream.
+dnl glibc (2.1.93 and newer) and Solaris provide __fpending. On other systems,
+dnl we have to grub around in the FILE struct.
+
+AC_DEFUN([gl_FUNC_FPENDING],
+[
+ AC_CHECK_HEADERS_ONCE([stdio_ext.h])
+ AC_CHECK_FUNCS_ONCE([__fpending])
+ fp_headers='
+# include <stdio.h>
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+'
+ AC_CHECK_DECLS([__fpending], , , $fp_headers)
+ if test $ac_cv_func___fpending = no; then
+ AC_CACHE_CHECK(
+ [how to determine the number of pending output bytes on a stream],
+ ac_cv_sys_pending_output_n_bytes,
+ [
+ for ac_expr in \
+ \
+ '# glibc2' \
+ 'fp->_IO_write_ptr - fp->_IO_write_base' \
+ \
+ '# traditional Unix' \
+ 'fp->_ptr - fp->_base' \
+ \
+ '# BSD' \
+ 'fp->_p - fp->_bf._base' \
+ \
+ '# SCO, Unixware' \
+ '(fp->__ptr ? fp->__ptr - fp->__base : 0)' \
+ \
+ '# QNX' \
+ '(fp->_Mode & 0x2000 /*_MWRITE*/ ? fp->_Next - fp->_Buf : 0)' \
+ \
+ '# old glibc?' \
+ 'fp->__bufp - fp->__buffer' \
+ \
+ '# old glibc iostream?' \
+ 'fp->_pptr - fp->_pbase' \
+ \
+ '# emx+gcc' \
+ 'fp->_ptr - fp->_buffer' \
+ \
+ '# VMS' \
+ '(*fp)->_ptr - (*fp)->_base' \
+ \
+ '# e.g., DGUX R4.11; the info is not available' \
+ 1 \
+ ; do
+
+ # Skip each embedded comment.
+ case "$ac_expr" in '#'*) continue;; esac
+
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],
+ [[FILE *fp = stdin; (void) ($ac_expr);]])],
+ [fp_done=yes]
+ )
+ test "$fp_done" = yes && break
+ done
+
+ ac_cv_sys_pending_output_n_bytes=$ac_expr
+ ]
+ )
+ AC_DEFINE_UNQUOTED([PENDING_OUTPUT_N_BYTES],
+ $ac_cv_sys_pending_output_n_bytes,
+ [the number of pending output bytes on stream `fp'])
+ AC_LIBOBJ([fpending])
+ fi
+])
diff --git a/gnulib/m4/fpieee.m4 b/gnulib/m4/fpieee.m4
new file mode 100644
index 00000000..532802d7
--- /dev/null
+++ b/gnulib/m4/fpieee.m4
@@ -0,0 +1,52 @@
+# fpieee.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl IEEE 754 standardized three items:
+dnl - The formats of single-float and double-float - nowadays commonly
+dnl available as 'float' and 'double' in C and C++.
+dnl No autoconf test needed.
+dnl - The overflow and division by zero behaviour: The result are values
+dnl '±Inf' and 'NaN', rather than exceptions as it was before.
+dnl This file provides an autoconf macro for ensuring this behaviour of
+dnl floating-point operations.
+dnl - A set of conditions (overflow, underflow, inexact, etc.) which can
+dnl be configured to trigger an exception.
+dnl This cannot be done in a portable way: it depends on the compiler,
+dnl libc, kernel, and CPU. No autoconf macro is provided for this.
+
+dnl Ensure non-trapping behaviour of floating-point overflow and
+dnl floating-point division by zero.
+dnl (For integer overflow, see gcc's -ftrapv option; for integer division by
+dnl zero, see the autoconf macro in intdiv0.m4.)
+
+AC_DEFUN([gl_FP_IEEE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ # IEEE behaviour is the default on all CPUs except Alpha and SH
+ # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4
+ # and the GCC 4.1.2 manual).
+ case "$host_cpu" in
+ alpha*)
+ # On Alpha systems, a compiler option provides the behaviour.
+ # See the ieee(3) manual page, also available at
+ # <http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V51B_HTML/MAN/MAN3/0600____.HTM>
+ if test -n "$GCC"; then
+ # GCC has the option -mieee.
+ CPPFLAGS="$CPPFLAGS -mieee"
+ else
+ # Compaq (ex-DEC) C has the option -ieee.
+ CPPFLAGS="$CPPFLAGS -ieee"
+ fi
+ ;;
+ sh*)
+ if test -n "$GCC"; then
+ # GCC has the option -mieee.
+ CPPFLAGS="$CPPFLAGS -mieee"
+ fi
+ ;;
+ esac
+])
diff --git a/gnulib/m4/fprintf-posix.m4 b/gnulib/m4/fprintf-posix.m4
new file mode 100644
index 00000000..5b95b377
--- /dev/null
+++ b/gnulib/m4/fprintf-posix.m4
@@ -0,0 +1,110 @@
+# fprintf-posix.m4 serial 14
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_fprintf_posix=no
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # fprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_fprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ if test $gl_cv_func_fprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_FPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_FPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([fprintf])
+ REPLACE_FPRINTF=1
+ AC_DEFINE([REPLACE_FPRINTF_POSIX], [1],
+ [Define if fprintf is overridden by a POSIX compliant gnulib implementation.])
+ gl_PREREQ_FPRINTF
+])
+
+AC_DEFUN([gl_PREREQ_FPRINTF], [:])
diff --git a/gnulib/m4/fprintftime.m4 b/gnulib/m4/fprintftime.m4
new file mode 100644
index 00000000..bd5b618b
--- /dev/null
+++ b/gnulib/m4/fprintftime.m4
@@ -0,0 +1,10 @@
+#serial 2
+dnl Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FPRINTFTIME],
+[
+ AC_LIBOBJ([fprintftime])
+])
diff --git a/gnulib/m4/fpurge.m4 b/gnulib/m4/fpurge.m4
new file mode 100644
index 00000000..d97e8976
--- /dev/null
+++ b/gnulib/m4/fpurge.m4
@@ -0,0 +1,45 @@
+# fpurge.m4 serial 6
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FPURGE],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([fpurge])
+ AC_CHECK_FUNCS_ONCE([__fpurge])
+ AC_CHECK_DECLS([fpurge], , , [[#include <stdio.h>]])
+ if test "x$ac_cv_func_fpurge" = xyes; then
+ # Detect BSD bug. Only cygwin 1.7 is known to be immune.
+ AC_CACHE_CHECK([whether fpurge works], [gl_cv_func_fpurge_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
+]], [FILE *f = fopen ("conftest.txt", "w+");
+ if (!f) return 1;
+ if (fputc ('a', f) != 'a') return 2;
+ rewind (f);
+ if (fgetc (f) != 'a') return 3;
+ if (fgetc (f) != EOF) return 4;
+ if (fpurge (f) != 0) return 5;
+ if (putc ('b', f) != 'b') return 6;
+ if (fclose (f) != 0) return 7;
+ if ((f = fopen ("conftest.txt", "r")) == NULL) return 8;
+ if (fgetc (f) != 'a') return 9;
+ if (fgetc (f) != 'b') return 10;
+ if (fgetc (f) != EOF) return 11;
+ if (fclose (f) != 0) return 12;
+ if (remove ("conftest.txt") != 0) return 13;
+ return 0;])],
+ [gl_cv_func_fpurge_works=yes], [gl_cv_func_fpurge_works=no],
+ [gl_cv_func_fpurge_works='guessing no'])])
+ if test "x$gl_cv_func_fpurge_works" != xyes; then
+ REPLACE_FPURGE=1
+ AC_LIBOBJ([fpurge])
+ fi
+ else
+ AC_LIBOBJ([fpurge])
+ fi
+ if test "x$ac_cv_have_decl_fpurge" = xno; then
+ HAVE_DECL_FPURGE=0
+ fi
+])
diff --git a/gnulib/m4/freadable.m4 b/gnulib/m4/freadable.m4
new file mode 100644
index 00000000..4d44594a
--- /dev/null
+++ b/gnulib/m4/freadable.m4
@@ -0,0 +1,13 @@
+# freadable.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREADABLE],
+[
+ AC_CHECK_FUNCS_ONCE([__freadable])
+ if test $ac_cv_func___freadable = no; then
+ AC_LIBOBJ([freadable])
+ fi
+])
diff --git a/gnulib/m4/freading.m4 b/gnulib/m4/freading.m4
new file mode 100644
index 00000000..051b95d3
--- /dev/null
+++ b/gnulib/m4/freading.m4
@@ -0,0 +1,10 @@
+# freading.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREADING],
+[
+ AC_CHECK_FUNCS_ONCE([__freading])
+])
diff --git a/gnulib/m4/free.m4 b/gnulib/m4/free.m4
new file mode 100644
index 00000000..8f7fee2d
--- /dev/null
+++ b/gnulib/m4/free.m4
@@ -0,0 +1,40 @@
+# Check whether free (NULL) is supposed to work.
+
+# Copyright (C) 2003, 2004, 2005, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Paul Eggert.
+
+# We can't test for free (NULL) even at runtime, since it might
+# happen to "work" for our test program, but not in general. So, be
+# conservative and use feature tests for relatively modern hosts,
+# where free (NULL) is known to work. This costs a bit of
+# performance on some older hosts, but we can fix that later if
+# needed.
+
+AC_DEFUN([gl_FUNC_FREE],
+[
+ AC_CACHE_CHECK([whether free (NULL) is known to work],
+ [gl_cv_func_free],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[@%:@include <unistd.h>]],
+ [[@%:@if _POSIX_VERSION < 199009L && \
+ (defined unix || defined _unix || defined _unix_ \
+ || defined __unix || defined __unix__)
+ @%:@error "'free (NULL)' is not known to work"
+ @%:@endif]])],
+ [gl_cv_func_free=yes],
+ [gl_cv_func_free=no])])
+
+ if test $gl_cv_func_free = no; then
+ AC_LIBOBJ([free])
+ AC_DEFINE([free], [rpl_free],
+ [Define to rpl_free if the replacement function should be used.])
+ fi
+])
+
+# Prerequisites of lib/free.c.
+AC_DEFUN([gl_PREREQ_FREE], [:])
diff --git a/gnulib/m4/freopen.m4 b/gnulib/m4/freopen.m4
new file mode 100644
index 00000000..e39a2f79
--- /dev/null
+++ b/gnulib/m4/freopen.m4
@@ -0,0 +1,24 @@
+# freopen.m4 serial 2
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREOPEN],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw* | pw*)
+ REPLACE_FREOPEN=1
+ AC_LIBOBJ([freopen])
+ gl_PREREQ_FREOPEN
+ ;;
+ esac
+])
+
+# Prerequisites of lib/freopen.c.
+AC_DEFUN([gl_PREREQ_FREOPEN],
+[
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/frexp.m4 b/gnulib/m4/frexp.m4
new file mode 100644
index 00000000..3a450f65
--- /dev/null
+++ b/gnulib/m4/frexp.m4
@@ -0,0 +1,146 @@
+# frexp.m4 serial 7
+dnl Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREXP],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ FREXP_LIBM=
+ AC_CACHE_CHECK([whether frexp() can be used without linking with libm],
+ [gl_cv_func_frexp_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ double x;],
+ [int e; return frexp (x, &e) > 0;],
+ [gl_cv_func_frexp_no_libm=yes],
+ [gl_cv_func_frexp_no_libm=no])
+ ])
+ if test $gl_cv_func_frexp_no_libm = no; then
+ AC_CACHE_CHECK([whether frexp() can be used with libm],
+ [gl_cv_func_frexp_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#include <math.h>
+ double x;],
+ [int e; return frexp (x, &e) > 0;],
+ [gl_cv_func_frexp_in_libm=yes],
+ [gl_cv_func_frexp_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_frexp_in_libm = yes; then
+ FREXP_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_frexp_no_libm = yes \
+ || test $gl_cv_func_frexp_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $FREXP_LIBM"
+ gl_FUNC_FREXP_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_frexp_works" in
+ *yes) gl_func_frexp=yes ;;
+ *) gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;;
+ esac
+ else
+ gl_func_frexp=no
+ fi
+ if test $gl_func_frexp = yes; then
+ AC_DEFINE([HAVE_FREXP], [1],
+ [Define if the frexp() function is available and works.])
+ else
+ AC_LIBOBJ([frexp])
+ fi
+ AC_SUBST([FREXP_LIBM])
+])
+
+AC_DEFUN([gl_FUNC_FREXP_NO_LIBM],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_CACHE_CHECK([whether frexp() can be used without linking with libm],
+ [gl_cv_func_frexp_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ double x;],
+ [int e; return frexp (x, &e) > 0;],
+ [gl_cv_func_frexp_no_libm=yes],
+ [gl_cv_func_frexp_no_libm=no])
+ ])
+ if test $gl_cv_func_frexp_no_libm = yes; then
+ gl_FUNC_FREXP_WORKS
+ case "$gl_cv_func_frexp_works" in
+ *yes) gl_func_frexp_no_libm=yes ;;
+ *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
+ esac
+ else
+ gl_func_frexp_no_libm=no
+ dnl Set REPLACE_FREXP here because the system may have frexp in libm.
+ REPLACE_FREXP=1
+ fi
+ if test $gl_func_frexp_no_libm = yes; then
+ AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
+ [Define if the frexp() function is available in libc.])
+ else
+ AC_LIBOBJ([frexp])
+ fi
+])
+
+dnl Test whether frexp() works also on denormalized numbers (this fails e.g. on
+dnl NetBSD 3.0), on infinite numbers (this fails e.g. on IRIX 6.5 and mingw),
+dnl and on negative zero (this fails e.g. on NetBSD 4.99).
+AC_DEFUN([gl_FUNC_FREXP_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether frexp works], [gl_cv_func_frexp_works],
+ [
+ AC_TRY_RUN([
+#include <float.h>
+#include <math.h>
+#include <string.h>
+int main()
+{
+ int i;
+ volatile double x;
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zero instead. */
+ double zero = 0.0;
+ /* Test on denormalized numbers. */
+ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ ;
+ if (x > 0.0)
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
+ On NetBSD: y = 0.75. Correct: y = 0.5. */
+ if (y != 0.5)
+ return 1;
+ }
+ /* Test on infinite numbers. */
+ x = 1.0 / 0.0;
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ if (y != x)
+ return 1;
+ }
+ /* Test on negative zero. */
+ x = -zero;
+ {
+ int exp;
+ double y = frexp (x, &exp);
+ if (memcmp (&y, &x, sizeof x))
+ return 1;
+ }
+ return 0;
+}], [gl_cv_func_frexp_works=yes], [gl_cv_func_frexp_works=no],
+ [case "$host_os" in
+ netbsd* | irix* | mingw*) gl_cv_func_frexp_works="guessing no";;
+ *) gl_cv_func_frexp_works="guessing yes";;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib/m4/frexpl.m4 b/gnulib/m4/frexpl.m4
new file mode 100644
index 00000000..0fbc893a
--- /dev/null
+++ b/gnulib/m4/frexpl.m4
@@ -0,0 +1,186 @@
+# frexpl.m4 serial 9
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREXPL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ FREXPL_LIBM=
+ AC_CACHE_CHECK([whether frexpl() can be used without linking with libm],
+ [gl_cv_func_frexpl_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ long double x;],
+ [int e; return frexpl (x, &e) > 0;],
+ [gl_cv_func_frexpl_no_libm=yes],
+ [gl_cv_func_frexpl_no_libm=no])
+ ])
+ if test $gl_cv_func_frexpl_no_libm = no; then
+ AC_CACHE_CHECK([whether frexpl() can be used with libm],
+ [gl_cv_func_frexpl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#include <math.h>
+ long double x;],
+ [int e; return frexpl (x, &e) > 0;],
+ [gl_cv_func_frexpl_in_libm=yes],
+ [gl_cv_func_frexpl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_frexpl_in_libm = yes; then
+ FREXPL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_frexpl_no_libm = yes \
+ || test $gl_cv_func_frexpl_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $FREXPL_LIBM"
+ gl_FUNC_FREXPL_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_frexpl_works" in
+ *yes) gl_func_frexpl=yes ;;
+ *) gl_func_frexpl=no; REPLACE_FREXPL=1; FREXPL_LIBM= ;;
+ esac
+ else
+ gl_func_frexpl=no
+ fi
+ if test $gl_func_frexpl = yes; then
+ AC_DEFINE([HAVE_FREXPL], [1],
+ [Define if the frexpl() function is available.])
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [#include <math.h>])
+ else
+ HAVE_DECL_FREXPL=0
+ AC_LIBOBJ([frexpl])
+ fi
+ AC_SUBST([FREXPL_LIBM])
+])
+
+AC_DEFUN([gl_FUNC_FREXPL_NO_LIBM],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_CACHE_CHECK([whether frexpl() can be used without linking with libm],
+ [gl_cv_func_frexpl_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ long double x;],
+ [int e; return frexpl (x, &e) > 0;],
+ [gl_cv_func_frexpl_no_libm=yes],
+ [gl_cv_func_frexpl_no_libm=no])
+ ])
+ if test $gl_cv_func_frexpl_no_libm = yes; then
+ gl_FUNC_FREXPL_WORKS
+ case "$gl_cv_func_frexpl_works" in
+ *yes) gl_func_frexpl_no_libm=yes ;;
+ *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
+ esac
+ else
+ gl_func_frexpl_no_libm=no
+ dnl Set REPLACE_FREXPL here because the system may have frexpl in libm.
+ REPLACE_FREXPL=1
+ fi
+ if test $gl_func_frexpl_no_libm = yes; then
+ AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1],
+ [Define if the frexpl() function is available in libc.])
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [#include <math.h>])
+ else
+ HAVE_DECL_FREXPL=0
+ AC_LIBOBJ([frexpl])
+ fi
+])
+
+dnl Test whether frexpl() works on finite numbers (this fails on
+dnl MacOS X 10.4/PowerPC, on AIX 5.1, and on BeOS), on denormalized numbers
+dnl (this fails on MacOS X 10.5/i386), and also on infinite numbers (this
+dnl fails e.g. on IRIX 6.5 and mingw).
+AC_DEFUN([gl_FUNC_FREXPL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works],
+ [
+ AC_TRY_RUN([
+#include <float.h>
+#include <math.h>
+/* Override the values of <float.h>, like done in float.in.h. */
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+#endif
+extern long double frexpl (long double, int *);
+int main()
+{
+ volatile long double x;
+ /* Test on finite numbers that fails on AIX 5.1. */
+ x = 16.0L;
+ {
+ int exp = -9999;
+ frexpl (x, &exp);
+ if (exp != 5)
+ return 1;
+ }
+ /* Test on finite numbers that fails on MacOS X 10.4, because its frexpl
+ function returns an invalid (incorrectly normalized) value: it returns
+ y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
+ but the correct result is
+ 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */
+ x = 1.01L;
+ {
+ int exp = -9999;
+ long double y = frexpl (x, &exp);
+ if (!(exp == 1 && y == 0.505L))
+ return 1;
+ }
+ /* Test on large finite numbers. This fails on BeOS at i = 16322, while
+ LDBL_MAX_EXP = 16384.
+ In the loop end test, we test x against Infinity, rather than comparing
+ i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ frexpl (x, &exp);
+ if (exp != i)
+ return 1;
+ }
+ }
+ /* Test on denormalized numbers. */
+ {
+ int i;
+ for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+ ;
+ if (x > 0.0L)
+ {
+ int exp;
+ long double y = frexpl (x, &exp);
+ /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
+ exp = -16382, y = 0.5. On MacOS X 10.5: exp = -16384, y = 0.5. */
+ if (exp != LDBL_MIN_EXP - 1)
+ return 1;
+ }
+ }
+ /* Test on infinite numbers. */
+ x = 1.0L / 0.0L;
+ {
+ int exp;
+ long double y = frexpl (x, &exp);
+ if (y != x)
+ return 1;
+ }
+ return 0;
+}], [gl_cv_func_frexpl_works=yes], [gl_cv_func_frexpl_works=no],
+ [case "$host_os" in
+ aix* | beos* | darwin* | irix* | mingw* | pw*)
+ gl_cv_func_frexpl_works="guessing no";;
+ *) gl_cv_func_frexpl_works="guessing yes";;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib/m4/fseek.m4 b/gnulib/m4/fseek.m4
new file mode 100644
index 00000000..28eb282b
--- /dev/null
+++ b/gnulib/m4/fseek.m4
@@ -0,0 +1,20 @@
+# fseek.m4 serial 2
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FSEEK],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_FSEEKO])
+ dnl When fseeko needs fixes, fseek needs them too.
+ dnl gl_FUNC_FSEEKO takes care of calling gl_REPLACE_FSEEK
+])
+
+AC_DEFUN([gl_REPLACE_FSEEK],
+[
+ AC_LIBOBJ([fseek])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ REPLACE_FSEEK=1
+])
diff --git a/gnulib/m4/fseeko.m4 b/gnulib/m4/fseeko.m4
new file mode 100644
index 00000000..5f7f9772
--- /dev/null
+++ b/gnulib/m4/fseeko.m4
@@ -0,0 +1,35 @@
+# fseeko.m4 serial 7
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FSEEKO],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_STDIN_LARGE_OFFSET])
+
+ dnl Persuade glibc <stdio.h> to declare fseeko().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CACHE_CHECK([for fseeko], [gl_cv_func_fseeko],
+ [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
+]], [fseeko (stdin, 0, 0);])],
+ [gl_cv_func_fseeko=yes], [gl_cv_func_fseeko=no])
+ ])
+ if test $gl_cv_func_fseeko = no \
+ || test $gl_cv_var_stdin_large_offset = no; then
+ gl_REPLACE_FSEEKO
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_FSEEKO],
+[
+ AC_LIBOBJ([fseeko])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ REPLACE_FSEEKO=1
+ dnl If we are also using the fseek module, then fseek needs replacing, too.
+ m4_ifdef([gl_REPLACE_FSEEK], [gl_REPLACE_FSEEK])
+])
diff --git a/gnulib/m4/fstypename.m4 b/gnulib/m4/fstypename.m4
new file mode 100644
index 00000000..9e81efe3
--- /dev/null
+++ b/gnulib/m4/fstypename.m4
@@ -0,0 +1,23 @@
+#serial 6
+
+dnl From Jim Meyering.
+dnl
+dnl See if struct statfs has the f_fstypename member.
+dnl If so, define HAVE_STRUCT_STATFS_F_FSTYPENAME.
+dnl
+
+# Copyright (C) 1998-1999, 2001, 2004, 2006, 2009-2010 Free Software
+# Foundation, Inc.
+# This file 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.
+
+AC_DEFUN([gl_FSTYPENAME],
+[
+ AC_CHECK_MEMBERS([struct statfs.f_fstypename],,,
+ [
+ #include <sys/types.h>
+ #include <sys/param.h>
+ #include <sys/mount.h>
+ ])
+])
diff --git a/gnulib/m4/fsusage.m4 b/gnulib/m4/fsusage.m4
new file mode 100644
index 00000000..216b9dd8
--- /dev/null
+++ b/gnulib/m4/fsusage.m4
@@ -0,0 +1,272 @@
+# serial 25
+# Obtaining file system usage information.
+
+# Copyright (C) 1997-1998, 2000-2001, 2003-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+# Written by Jim Meyering.
+
+AC_DEFUN([gl_FSUSAGE],
+[
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+ AC_CHECK_HEADERS_ONCE([sys/vfs.h sys/fs_types.h])
+ AC_CHECK_HEADERS([sys/mount.h], [], [],
+ [AC_INCLUDES_DEFAULT
+ [#if HAVE_SYS_PARAM_H
+ #include <sys/param.h>
+ #endif]])
+ gl_FILE_SYSTEM_USAGE([gl_cv_fs_space=yes], [gl_cv_fs_space=no])
+ if test $gl_cv_fs_space = yes; then
+ AC_LIBOBJ([fsusage])
+ gl_PREREQ_FSUSAGE_EXTRA
+ fi
+])
+
+# Try to determine how a program can obtain file system usage information.
+# If successful, define the appropriate symbol (see fsusage.c) and
+# execute ACTION-IF-FOUND. Otherwise, execute ACTION-IF-NOT-FOUND.
+#
+# gl_FILE_SYSTEM_USAGE([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([gl_FILE_SYSTEM_USAGE],
+[
+
+AC_MSG_NOTICE([checking how to get file system space usage])
+ac_fsusage_space=no
+
+# Perform only the link test since it seems there are no variants of the
+# statvfs function. This check is more than just AC_CHECK_FUNCS([statvfs])
+# because that got a false positive on SCO OSR5. Adding the declaration
+# of a `struct statvfs' causes this test to fail (as it should) on such
+# systems. That system is reported to work fine with STAT_STATFS4 which
+# is what it gets when this test fails.
+if test $ac_fsusage_space = no; then
+ # SVR4
+ AC_CACHE_CHECK([for statvfs function (SVR4)], [fu_cv_sys_stat_statvfs],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#if defined __GLIBC__ && defined __linux__
+Do not use statvfs on systems with GNU libc on Linux, because that function
+stats all preceding entries in /proc/mounts, and that makes df hang if even
+one of the corresponding file systems is hard-mounted, but not available.
+statvfs in GNU libc on Hurd, BeOS, Haiku operates differently: it only makes
+a system call.
+#endif
+
+#ifdef __osf__
+"Do not use Tru64's statvfs implementation"
+#endif
+
+#include <sys/statvfs.h>]],
+ [[struct statvfs fsd; statvfs (0, &fsd);]])],
+ [fu_cv_sys_stat_statvfs=yes],
+ [fu_cv_sys_stat_statvfs=no])])
+ if test $fu_cv_sys_stat_statvfs = yes; then
+ ac_fsusage_space=yes
+ AC_DEFINE([STAT_STATVFS], [1],
+ [ Define if there is a function named statvfs. (SVR4)])
+ fi
+fi
+
+if test $ac_fsusage_space = no; then
+ # DEC Alpha running OSF/1
+ AC_MSG_CHECKING([for 3-argument statfs function (DEC OSF/1)])
+ AC_CACHE_VAL([fu_cv_sys_stat_statfs3_osf1],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/mount.h>
+ int
+ main ()
+ {
+ struct statfs fsd;
+ fsd.f_fsize = 0;
+ return statfs (".", &fsd, sizeof (struct statfs)) != 0;
+ }]])],
+ [fu_cv_sys_stat_statfs3_osf1=yes],
+ [fu_cv_sys_stat_statfs3_osf1=no],
+ [fu_cv_sys_stat_statfs3_osf1=no])])
+ AC_MSG_RESULT([$fu_cv_sys_stat_statfs3_osf1])
+ if test $fu_cv_sys_stat_statfs3_osf1 = yes; then
+ ac_fsusage_space=yes
+ AC_DEFINE([STAT_STATFS3_OSF1], [1],
+ [ Define if statfs takes 3 args. (DEC Alpha running OSF/1)])
+ fi
+fi
+
+if test $ac_fsusage_space = no; then
+# AIX
+ AC_MSG_CHECKING([for two-argument statfs with statfs.bsize dnl
+member (AIX, 4.3BSD)])
+ AC_CACHE_VAL([fu_cv_sys_stat_statfs2_bsize],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+#ifdef HAVE_SYS_VFS_H
+#include <sys/vfs.h>
+#endif
+ int
+ main ()
+ {
+ struct statfs fsd;
+ fsd.f_bsize = 0;
+ return statfs (".", &fsd) != 0;
+ }]])],
+ [fu_cv_sys_stat_statfs2_bsize=yes],
+ [fu_cv_sys_stat_statfs2_bsize=no],
+ [fu_cv_sys_stat_statfs2_bsize=no])])
+ AC_MSG_RESULT([$fu_cv_sys_stat_statfs2_bsize])
+ if test $fu_cv_sys_stat_statfs2_bsize = yes; then
+ ac_fsusage_space=yes
+ AC_DEFINE([STAT_STATFS2_BSIZE], [1],
+[ Define if statfs takes 2 args and struct statfs has a field named f_bsize.
+ (4.3BSD, SunOS 4, HP-UX, AIX PS/2)])
+ fi
+fi
+
+if test $ac_fsusage_space = no; then
+# SVR3
+ AC_MSG_CHECKING([for four-argument statfs (AIX-3.2.5, SVR3)])
+ AC_CACHE_VAL([fu_cv_sys_stat_statfs4],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/statfs.h>
+ int
+ main ()
+ {
+ struct statfs fsd;
+ return statfs (".", &fsd, sizeof fsd, 0) != 0;
+ }]])],
+ [fu_cv_sys_stat_statfs4=yes],
+ [fu_cv_sys_stat_statfs4=no],
+ [fu_cv_sys_stat_statfs4=no])])
+ AC_MSG_RESULT([$fu_cv_sys_stat_statfs4])
+ if test $fu_cv_sys_stat_statfs4 = yes; then
+ ac_fsusage_space=yes
+ AC_DEFINE([STAT_STATFS4], [1],
+ [ Define if statfs takes 4 args. (SVR3, Dynix, Irix, Dolphin)])
+ fi
+fi
+
+if test $ac_fsusage_space = no; then
+# 4.4BSD and NetBSD
+ AC_MSG_CHECKING([for two-argument statfs with statfs.fsize dnl
+member (4.4BSD and NetBSD)])
+ AC_CACHE_VAL([fu_cv_sys_stat_statfs2_fsize],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+ int
+ main ()
+ {
+ struct statfs fsd;
+ fsd.f_fsize = 0;
+ return statfs (".", &fsd) != 0;
+ }]])],
+ [fu_cv_sys_stat_statfs2_fsize=yes],
+ [fu_cv_sys_stat_statfs2_fsize=no],
+ [fu_cv_sys_stat_statfs2_fsize=no])])
+ AC_MSG_RESULT([$fu_cv_sys_stat_statfs2_fsize])
+ if test $fu_cv_sys_stat_statfs2_fsize = yes; then
+ ac_fsusage_space=yes
+ AC_DEFINE([STAT_STATFS2_FSIZE], [1],
+[ Define if statfs takes 2 args and struct statfs has a field named f_fsize.
+ (4.4BSD, NetBSD)])
+ fi
+fi
+
+if test $ac_fsusage_space = no; then
+ # Ultrix
+ AC_MSG_CHECKING([for two-argument statfs with struct fs_data (Ultrix)])
+ AC_CACHE_VAL([fu_cv_sys_stat_fs_data],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+#ifdef HAVE_SYS_FS_TYPES_H
+#include <sys/fs_types.h>
+#endif
+ int
+ main ()
+ {
+ struct fs_data fsd;
+ /* Ultrix's statfs returns 1 for success,
+ 0 for not mounted, -1 for failure. */
+ return statfs (".", &fsd) != 1;
+ }]])],
+ [fu_cv_sys_stat_fs_data=yes],
+ [fu_cv_sys_stat_fs_data=no],
+ [fu_cv_sys_stat_fs_data=no])])
+ AC_MSG_RESULT([$fu_cv_sys_stat_fs_data])
+ if test $fu_cv_sys_stat_fs_data = yes; then
+ ac_fsusage_space=yes
+ AC_DEFINE([STAT_STATFS2_FS_DATA], [1],
+[ Define if statfs takes 2 args and the second argument has
+ type struct fs_data. (Ultrix)])
+ fi
+fi
+
+if test $ac_fsusage_space = no; then
+ # SVR2
+ AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <sys/filsys.h>
+ ]])],
+ [AC_DEFINE([STAT_READ_FILSYS], [1],
+ [Define if there is no specific function for reading file systems usage
+ information and you have the <sys/filsys.h> header file. (SVR2)])
+ ac_fsusage_space=yes])
+fi
+
+AS_IF([test $ac_fsusage_space = yes], [$1], [$2])
+
+])
+
+
+# Check for SunOS statfs brokenness wrt partitions 2GB and larger.
+# If <sys/vfs.h> exists and struct statfs has a member named f_spare,
+# enable the work-around code in fsusage.c.
+AC_DEFUN([gl_STATFS_TRUNCATES],
+[
+ AC_MSG_CHECKING([for statfs that truncates block counts])
+ AC_CACHE_VAL([fu_cv_sys_truncating_statfs],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if !defined(sun) && !defined(__sun)
+choke -- this is a workaround for a Sun-specific problem
+#endif
+#include <sys/types.h>
+#include <sys/vfs.h>]],
+ [[struct statfs t; long c = *(t.f_spare);
+ if (c) return 0;]])],
+ [fu_cv_sys_truncating_statfs=yes],
+ [fu_cv_sys_truncating_statfs=no])])
+ if test $fu_cv_sys_truncating_statfs = yes; then
+ AC_DEFINE([STATFS_TRUNCATES_BLOCK_COUNTS], [1],
+ [Define if the block counts reported by statfs may be truncated to 2GB
+ and the correct values may be stored in the f_spare array.
+ (SunOS 4.1.2, 4.1.3, and 4.1.3_U1 are reported to have this problem.
+ SunOS 4.1.1 seems not to be affected.)])
+ fi
+ AC_MSG_RESULT([$fu_cv_sys_truncating_statfs])
+])
+
+
+# Prerequisites of lib/fsusage.c not done by gl_FILE_SYSTEM_USAGE.
+AC_DEFUN([gl_PREREQ_FSUSAGE_EXTRA],
+[
+ AC_CHECK_HEADERS([dustat.h sys/fs/s5param.h sys/filsys.h sys/statfs.h])
+ gl_STATFS_TRUNCATES
+])
diff --git a/gnulib/m4/fsync.m4 b/gnulib/m4/fsync.m4
new file mode 100644
index 00000000..83847ccc
--- /dev/null
+++ b/gnulib/m4/fsync.m4
@@ -0,0 +1,19 @@
+# fsync.m4 serial 1
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FSYNC],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([fsync])
+ if test $ac_cv_func_fsync = no; then
+ HAVE_FSYNC=0
+ AC_LIBOBJ([fsync])
+ gl_PREREQ_FSYNC
+ fi
+])
+
+# Prerequisites of lib/fsync.c.
+AC_DEFUN([gl_PREREQ_FSYNC], [:])
diff --git a/gnulib/m4/ftell.m4 b/gnulib/m4/ftell.m4
new file mode 100644
index 00000000..afd15089
--- /dev/null
+++ b/gnulib/m4/ftell.m4
@@ -0,0 +1,16 @@
+# ftell.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FTELL],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_FTELLO])
+ dnl When ftello needs fixes, ftell needs them too.
+ if test $REPLACE_FTELLO != 0; then
+ AC_LIBOBJ([ftell])
+ REPLACE_FTELL=1
+ fi
+])
diff --git a/gnulib/m4/ftello.m4 b/gnulib/m4/ftello.m4
new file mode 100644
index 00000000..2dff6ee9
--- /dev/null
+++ b/gnulib/m4/ftello.m4
@@ -0,0 +1,32 @@
+# ftello.m4 serial 5
+dnl Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FTELLO],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_STDIN_LARGE_OFFSET])
+
+ dnl Persuade glibc <stdio.h> to declare fseeko().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello],
+ [
+ AC_TRY_LINK([#include <stdio.h>], [ftello (stdin);],
+ [gl_cv_func_ftello=yes], [gl_cv_func_ftello=no])
+ ])
+ if test $gl_cv_func_ftello = no \
+ || test $gl_cv_var_stdin_large_offset = no; then
+ gl_REPLACE_FTELLO
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_FTELLO],
+[
+ AC_LIBOBJ([ftello])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ REPLACE_FTELLO=1
+])
diff --git a/gnulib/m4/ftruncate.m4 b/gnulib/m4/ftruncate.m4
new file mode 100644
index 00000000..95e371b0
--- /dev/null
+++ b/gnulib/m4/ftruncate.m4
@@ -0,0 +1,46 @@
+# serial 14
+
+# See if we need to emulate a missing ftruncate function using fcntl or chsize.
+
+# Copyright (C) 2000-2001, 2003-2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# FIXME: remove this macro, along with all uses of HAVE_FTRUNCATE in 2010,
+# if the check below provokes no more reports. So far, the only report
+# arose from a test build of this gnulib module, cross-compiling to mingw:
+# <http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/9203>
+
+AC_DEFUN([gl_FUNC_FTRUNCATE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([ftruncate])
+ if test $ac_cv_func_ftruncate = no; then
+ HAVE_FTRUNCATE=0
+ AC_LIBOBJ([ftruncate])
+ gl_PREREQ_FTRUNCATE
+ case "$host_os" in
+ mingw*)
+ # Yes, we know mingw lacks ftruncate.
+ ;;
+ *)
+ # If someone lacks ftruncate, make configure fail, and request
+ # a bug report to inform us about it.
+ if test x"$SKIP_FTRUNCATE_CHECK" != xyes; then
+ AC_MSG_FAILURE([Your system lacks the ftruncate function.
+ Please report this, along with the output of "uname -a", to the
+ bug-coreutils@gnu.org mailing list. To continue past this point,
+ rerun configure with SKIP_FTRUNCATE_CHECK=yes.
+ E.g., ./configure SKIP_FTRUNCATE_CHECK=yes])
+ fi
+ esac
+ fi
+])
+
+# Prerequisites of lib/ftruncate.c.
+AC_DEFUN([gl_PREREQ_FTRUNCATE],
+[
+ AC_CHECK_FUNCS([chsize])
+])
diff --git a/gnulib/m4/fts.m4 b/gnulib/m4/fts.m4
new file mode 100644
index 00000000..c40f0855
--- /dev/null
+++ b/gnulib/m4/fts.m4
@@ -0,0 +1,32 @@
+#serial 17
+dnl Copyright (C) 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FTS],
+[
+ gl_FUNC_FTS_CORE
+])
+
+AC_DEFUN([gl_FUNC_FTS_LGPL],
+[
+ gl_FUNC_FTS_CORE
+])
+
+AC_DEFUN([gl_FUNC_FTS_CORE],
+[
+ dnl Use this version of fts unconditionally, since the GNU libc and
+ dnl NetBSD versions have bugs and/or unnecessary limitations.
+ AC_LIBOBJ([fts])
+
+ dnl Prerequisites of lib/fts.c.
+ AC_REQUIRE([AC_C_INLINE])
+ gl_FUNC_OPENAT
+
+ AC_CHECK_FUNCS_ONCE([fstatfs])
+ AC_CHECK_HEADERS_ONCE([sys/param.h sys/vfs.h])dnl
+ AC_CHECK_MEMBERS([struct statfs.f_type],,,
+ [$ac_includes_default
+ #include <sys/vfs.h>])
+])
diff --git a/gnulib/m4/func.m4 b/gnulib/m4/func.m4
new file mode 100644
index 00000000..698c5281
--- /dev/null
+++ b/gnulib/m4/func.m4
@@ -0,0 +1,20 @@
+# func.m4 serial 2
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Simon Josefsson
+
+AC_DEFUN([gl_FUNC],
+[
+ AC_CACHE_CHECK([whether __func__ is available], [gl_cv_var_func],
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[const char *str = __func__;]])],
+ [gl_cv_var_func=yes],
+ [gl_cv_var_func=no]))
+ if test "$gl_cv_var_func" != yes; then
+ AC_DEFINE([__func__], ["<unknown function>"],
+ [Define as a replacement for the ISO C99 __func__ variable.])
+ fi
+])
diff --git a/gnulib/m4/futimens.m4 b/gnulib/m4/futimens.m4
new file mode 100644
index 00000000..68eaa781
--- /dev/null
+++ b/gnulib/m4/futimens.m4
@@ -0,0 +1,58 @@
+# serial 3
+# See if we need to provide futimens replacement.
+
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_FUTIMENS],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([futimens])
+ if test $ac_cv_func_futimens = no; then
+ HAVE_FUTIMENS=0
+ AC_LIBOBJ([futimens])
+ else
+ AC_CACHE_CHECK([whether futimens works],
+ [gl_cv_func_futimens_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+]], [[struct timespec ts[2] = { { 1, UTIME_OMIT }, { 1, UTIME_NOW } };
+ int fd = creat ("conftest.file", 0600);
+ struct stat st;
+ if (fd < 0) return 1;
+ if (futimens (AT_FDCWD, NULL)) return 2;
+ if (futimens (fd, ts)) return 3;
+ sleep (1);
+ ts[0].tv_nsec = UTIME_NOW;
+ ts[1].tv_nsec = UTIME_OMIT;
+ if (futimens (fd, ts)) return 4;
+ if (fstat (fd, &st)) return 5;
+ if (st.st_ctime < st.st_atime) return 6;
+ ]])],
+dnl FIXME: simplify this in 2012, when file system bugs are no longer common
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#ifdef __linux__
+/* The Linux kernel added futimens in 2.6.22, but has bugs with UTIME_OMIT
+ in several file systems as recently as 2.6.32. Always replace futimens
+ to support older kernels. */
+choke me
+#endif
+ ]])],
+ [gl_cv_func_futimens_works=yes],
+ [gl_cv_func_futimens_works="needs runtime check"])],
+ [gl_cv_func_futimens_works=no],
+ [gl_cv_func_futimens_works="guessing no"])
+ rm -f conftest.file])
+ if test "$gl_cv_func_futimens_works" != yes; then
+ REPLACE_FUTIMENS=1
+ AC_LIBOBJ([futimens])
+ fi
+ fi
+])
diff --git a/gnulib/m4/fwritable.m4 b/gnulib/m4/fwritable.m4
new file mode 100644
index 00000000..76ed0185
--- /dev/null
+++ b/gnulib/m4/fwritable.m4
@@ -0,0 +1,13 @@
+# fwritable.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FWRITABLE],
+[
+ AC_CHECK_FUNCS_ONCE([__fwritable])
+ if test $ac_cv_func___fwritable = no; then
+ AC_LIBOBJ([fwritable])
+ fi
+])
diff --git a/gnulib/m4/fwriting.m4 b/gnulib/m4/fwriting.m4
new file mode 100644
index 00000000..e263ea23
--- /dev/null
+++ b/gnulib/m4/fwriting.m4
@@ -0,0 +1,13 @@
+# fwriting.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FWRITING],
+[
+ AC_CHECK_FUNCS_ONCE([__fwriting])
+ if test $ac_cv_func___fwriting = no; then
+ AC_LIBOBJ([fwriting])
+ fi
+])
diff --git a/gnulib/m4/gc-arcfour.m4 b/gnulib/m4/gc-arcfour.m4
new file mode 100644
index 00000000..4425a778
--- /dev/null
+++ b/gnulib/m4/gc-arcfour.m4
@@ -0,0 +1,13 @@
+# gc-arcfour.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_ARCFOUR],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_ARCFOUR
+ fi
+])
diff --git a/gnulib/m4/gc-arctwo.m4 b/gnulib/m4/gc-arctwo.m4
new file mode 100644
index 00000000..cfe076eb
--- /dev/null
+++ b/gnulib/m4/gc-arctwo.m4
@@ -0,0 +1,13 @@
+# gc-arctwo.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_ARCTWO],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_ARCTWO
+ fi
+])
diff --git a/gnulib/m4/gc-camellia.m4 b/gnulib/m4/gc-camellia.m4
new file mode 100644
index 00000000..cf181bc9
--- /dev/null
+++ b/gnulib/m4/gc-camellia.m4
@@ -0,0 +1,20 @@
+# gc-camellia.m4 serial 3
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_CAMELLIA],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" = yes; then
+ AC_CACHE_CHECK([for camellia in libgcrypt], [gl_cv_libgcrypt_camellia], [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gcrypt.h>]],
+ [[return gcry_cipher_open (NULL, GCRY_CIPHER_CAMELLIA128, 0, 0);]])],
+ [gl_cv_libgcrypt_camellia=yes],
+ [gl_cv_libgcrypt_camellia=no])])
+ if test "$gl_cv_libgcrypt_camellia" = yes; then
+ AC_DEFINE([HAVE_CAMELLIA], [1], [Define if your libgcrypt supports Camellia.])
+ fi
+ fi
+])
diff --git a/gnulib/m4/gc-des.m4 b/gnulib/m4/gc-des.m4
new file mode 100644
index 00000000..ace899ba
--- /dev/null
+++ b/gnulib/m4/gc-des.m4
@@ -0,0 +1,13 @@
+# gc-des.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_DES],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_DES
+ fi
+])
diff --git a/gnulib/m4/gc-hmac-md5.m4 b/gnulib/m4/gc-hmac-md5.m4
new file mode 100644
index 00000000..01fc686a
--- /dev/null
+++ b/gnulib/m4/gc-hmac-md5.m4
@@ -0,0 +1,15 @@
+# gc-hmac-md5.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_HMAC_MD5],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_MD5
+ gl_HMAC_MD5
+ gl_MEMXOR
+ fi
+])
diff --git a/gnulib/m4/gc-hmac-sha1.m4 b/gnulib/m4/gc-hmac-sha1.m4
new file mode 100644
index 00000000..4c74ffd3
--- /dev/null
+++ b/gnulib/m4/gc-hmac-sha1.m4
@@ -0,0 +1,15 @@
+# gc-hmac-sha1.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_HMAC_SHA1],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_SHA1
+ gl_HMAC_SHA1
+ gl_MEMXOR
+ fi
+])
diff --git a/gnulib/m4/gc-md2.m4 b/gnulib/m4/gc-md2.m4
new file mode 100644
index 00000000..c5eb57c0
--- /dev/null
+++ b/gnulib/m4/gc-md2.m4
@@ -0,0 +1,9 @@
+# gc-md2.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_MD2],
+[
+])
diff --git a/gnulib/m4/gc-md4.m4 b/gnulib/m4/gc-md4.m4
new file mode 100644
index 00000000..5088f492
--- /dev/null
+++ b/gnulib/m4/gc-md4.m4
@@ -0,0 +1,13 @@
+# gc-md4.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_MD4],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_MD4
+ fi
+])
diff --git a/gnulib/m4/gc-md5.m4 b/gnulib/m4/gc-md5.m4
new file mode 100644
index 00000000..9bc5bf96
--- /dev/null
+++ b/gnulib/m4/gc-md5.m4
@@ -0,0 +1,13 @@
+# gc-md5.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_MD5],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_MD5
+ fi
+])
diff --git a/gnulib/m4/gc-pbkdf2-sha1.m4 b/gnulib/m4/gc-pbkdf2-sha1.m4
new file mode 100644
index 00000000..25c3edf5
--- /dev/null
+++ b/gnulib/m4/gc-pbkdf2-sha1.m4
@@ -0,0 +1,10 @@
+# gc-pbkdf2-sha1.m4 serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_PBKDF2_SHA1],
+[
+ AC_LIBOBJ([gc-pbkdf2-sha1])
+])
diff --git a/gnulib/m4/gc-random.m4 b/gnulib/m4/gc-random.m4
new file mode 100644
index 00000000..bd41183b
--- /dev/null
+++ b/gnulib/m4/gc-random.m4
@@ -0,0 +1,87 @@
+# gc-random.m4 serial 4
+dnl Copyright (C) 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_RANDOM],
+[
+ # Devices with randomness.
+ # FIXME: Are these the best defaults?
+
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+ case "$host_os" in
+ *openbsd*)
+ NAME_OF_RANDOM_DEVICE="/dev/srandom"
+ NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/prandom"
+ NAME_OF_NONCE_DEVICE="/dev/urandom"
+ ;;
+
+ *netbsd*)
+ NAME_OF_RANDOM_DEVICE="/dev/srandom"
+ NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/urandom"
+ NAME_OF_NONCE_DEVICE="/dev/urandom"
+ ;;
+
+ *solaris* | *irix* | *dec-osf* )
+ NAME_OF_RANDOM_DEVICE="/dev/random"
+ NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/random"
+ NAME_OF_NONCE_DEVICE="/dev/random"
+ ;;
+
+ *)
+ NAME_OF_RANDOM_DEVICE="/dev/random"
+ NAME_OF_PSEUDO_RANDOM_DEVICE="/dev/urandom"
+ NAME_OF_NONCE_DEVICE="/dev/urandom"
+ ;;
+ esac
+
+ AC_MSG_CHECKING([device with (strong) random data...])
+ AC_ARG_ENABLE([random-device],
+ AS_HELP_STRING([--enable-random-device],
+ [device with (strong) randomness (for Nettle)]),
+ NAME_OF_RANDOM_DEVICE=$enableval)
+ AC_MSG_RESULT([$NAME_OF_RANDOM_DEVICE])
+
+ AC_MSG_CHECKING([device with pseudo random data...])
+ AC_ARG_ENABLE([pseudo-random-device],
+ AS_HELP_STRING([--enable-pseudo-random-device],
+ [device with pseudo randomness (for Nettle)]),
+ NAME_OF_PSEUDO_RANDOM_DEVICE=$enableval)
+ AC_MSG_RESULT([$NAME_OF_PSEUDO_RANDOM_DEVICE])
+
+ AC_MSG_CHECKING([device with unpredictable data for nonces...])
+ AC_ARG_ENABLE([nonce-device],
+ AS_HELP_STRING([--enable-nonce-device],
+ [device with unpredictable nonces (for Nettle)]),
+ NAME_OF_NONCE_DEVICE=$enableval)
+ AC_MSG_RESULT([$NAME_OF_NONCE_DEVICE])
+
+ if test "$cross_compiling" != yes; then
+ if test "$NAME_OF_RANDOM_DEVICE" != "no"; then
+ AC_CHECK_FILE([$NAME_OF_RANDOM_DEVICE],,
+ AC_MSG_WARN([[Device `$NAME_OF_RANDOM_DEVICE' does not exist, consider to use --enable-random-device]]))
+ fi
+ if test "$NAME_OF_PSEUDO_RANDOM_DEVICE" != "no"; then
+ AC_CHECK_FILE([$NAME_OF_PSEUDO_RANDOM_DEVICE],,
+ AC_MSG_WARN([[Device `$NAME_OF_PSEUDO_RANDOM_DEVICE' does not exist, consider to use --enable-pseudo-random-device]]))
+ fi
+ if test "$NAME_OF_NONCE_DEVICE" != "no"; then
+ AC_CHECK_FILE([$NAME_OF_NONCE_DEVICE],,
+ AC_MSG_WARN([[Device `$NAME_OF_NONCE_DEVICE' does not exist, consider to use --enable-nonce-device]]))
+ fi
+ else
+ AC_MSG_NOTICE([[Cross compiling, assuming random devices exists on the target host...]])
+ fi
+
+ # FIXME?: Open+read 42 bytes+close twice and compare data. Should differ.
+
+ AC_DEFINE_UNQUOTED([NAME_OF_RANDOM_DEVICE], ["$NAME_OF_RANDOM_DEVICE"],
+ [defined to the name of the (strong) random device])
+ AC_DEFINE_UNQUOTED([NAME_OF_PSEUDO_RANDOM_DEVICE],
+ "$NAME_OF_PSEUDO_RANDOM_DEVICE",
+ [defined to the name of the pseudo random device])
+ AC_DEFINE_UNQUOTED([NAME_OF_NONCE_DEVICE], ["$NAME_OF_NONCE_DEVICE"],
+ [defined to the name of the unpredictable nonce device])
+])
diff --git a/gnulib/m4/gc-rijndael.m4 b/gnulib/m4/gc-rijndael.m4
new file mode 100644
index 00000000..334ab112
--- /dev/null
+++ b/gnulib/m4/gc-rijndael.m4
@@ -0,0 +1,13 @@
+# gc-rijndael.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_RIJNDAEL],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_RIJNDAEL
+ fi
+])
diff --git a/gnulib/m4/gc-sha1.m4 b/gnulib/m4/gc-sha1.m4
new file mode 100644
index 00000000..1398cfae
--- /dev/null
+++ b/gnulib/m4/gc-sha1.m4
@@ -0,0 +1,13 @@
+# gc-sha1.m4 serial 2
+dnl Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC_SHA1],
+[
+ AC_REQUIRE([gl_GC])
+ if test "$ac_cv_libgcrypt" != yes; then
+ gl_SHA1
+ fi
+])
diff --git a/gnulib/m4/gc.m4 b/gnulib/m4/gc.m4
new file mode 100644
index 00000000..f237d8dd
--- /dev/null
+++ b/gnulib/m4/gc.m4
@@ -0,0 +1,27 @@
+# gc.m4 serial 6
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GC],
+[
+ AC_ARG_WITH([libgcrypt],
+ AS_HELP_STRING([--with-libgcrypt], [use libgcrypt for low-level crypto]),
+ libgcrypt=$withval, libgcrypt=no)
+ if test "$libgcrypt" != no; then
+ AC_LIB_HAVE_LINKFLAGS([gcrypt], [gpg-error], [#include <gcrypt.h>])
+ fi
+ if test "$ac_cv_libgcrypt" = yes; then
+ AC_LIBOBJ([gc-libgcrypt])
+ else
+ AC_LIBOBJ([gc-gnulib])
+ fi
+])
+
+# Prerequisites of lib/gc.h
+AC_DEFUN([gl_PREREQ_GC],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ :
+])
diff --git a/gnulib/m4/getaddrinfo.m4 b/gnulib/m4/getaddrinfo.m4
new file mode 100644
index 00000000..05fd2b6c
--- /dev/null
+++ b/gnulib/m4/getaddrinfo.m4
@@ -0,0 +1,173 @@
+# getaddrinfo.m4 serial 22
+dnl Copyright (C) 2004-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GETADDRINFO],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ AC_REQUIRE([gl_HEADER_NETDB])dnl for HAVE_NETDB_H
+ AC_MSG_NOTICE([checking how to do getaddrinfo, freeaddrinfo and getnameinfo])
+ GETADDRINFO_LIB=
+ gai_saved_LIBS="$LIBS"
+
+ dnl Where is getaddrinfo()?
+ dnl - On Solaris, it is in libsocket.
+ dnl - On Haiku, it is in libnetwork.
+ dnl - On BeOS, it is in libnet.
+ dnl - On native Windows, it is in ws2_32.dll.
+ dnl - Otherwise it is in libc.
+ AC_SEARCH_LIBS([getaddrinfo], [socket network net],
+ [if test "$ac_cv_search_getaddrinfo" != "none required"; then
+ GETADDRINFO_LIB="$ac_cv_search_getaddrinfo"
+ fi])
+ LIBS="$gai_saved_LIBS $GETADDRINFO_LIB"
+
+ AC_CACHE_CHECK([for getaddrinfo], [gl_cv_func_getaddrinfo], [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#include <stddef.h>
+]], [[getaddrinfo("", "", NULL, NULL);]])],
+ [gl_cv_func_getaddrinfo=yes],
+ [gl_cv_func_getaddrinfo=no])])
+ if test $gl_cv_func_getaddrinfo = no; then
+ AC_CACHE_CHECK([for getaddrinfo in ws2tcpip.h and -lws2_32],
+ gl_cv_w32_getaddrinfo, [
+ gl_cv_w32_getaddrinfo=no
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+]], [[getaddrinfo(NULL, NULL, NULL, NULL);]])], [gl_cv_w32_getaddrinfo=yes])
+ LIBS="$am_save_LIBS"
+ ])
+ if test "$gl_cv_w32_getaddrinfo" = "yes"; then
+ GETADDRINFO_LIB="-lws2_32"
+ LIBS="$gai_saved_LIBS $GETADDRINFO_LIB"
+ else
+ AC_LIBOBJ([getaddrinfo])
+ fi
+ fi
+
+ # We can't use AC_REPLACE_FUNCS here because gai_strerror may be an
+ # inline function declared in ws2tcpip.h, so we need to get that
+ # header included somehow.
+ AC_CACHE_CHECK([for gai_strerror (possibly via ws2tcpip.h)],
+ gl_cv_func_gai_strerror, [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+]], [[gai_strerror (NULL);]])],
+ [gl_cv_func_gai_strerror=yes],
+ [gl_cv_func_gai_strerror=no])])
+ if test $gl_cv_func_gai_strerror = no; then
+ AC_LIBOBJ([gai_strerror])
+ fi
+
+ LIBS="$gai_saved_LIBS"
+
+ gl_PREREQ_GETADDRINFO
+
+ AC_SUBST([GETADDRINFO_LIB])
+])
+
+# Prerequisites of lib/netdb.in.h and lib/getaddrinfo.c.
+AC_DEFUN([gl_PREREQ_GETADDRINFO], [
+ AC_REQUIRE([gl_NETDB_H_DEFAULTS])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ AC_REQUIRE([gl_HOSTENT]) dnl for HOSTENT_LIB
+ AC_REQUIRE([gl_SERVENT]) dnl for SERVENT_LIB
+ AC_REQUIRE([gl_INET_NTOP]) dnl for INET_NTOP_LIB
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_SOCKET_FAMILIES])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl Including sys/socket.h is wrong for Windows, but Windows does not
+ dnl have sa_len so the result is correct anyway.
+ AC_CHECK_MEMBERS([struct sockaddr.sa_len], , , [#include <sys/socket.h>])
+
+ AC_CHECK_HEADERS_ONCE([netinet/in.h])
+
+ AC_CHECK_DECLS([getaddrinfo, freeaddrinfo, gai_strerror, getnameinfo],,,[
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+])
+ if test $ac_cv_have_decl_getaddrinfo = no; then
+ HAVE_DECL_GETADDRINFO=0
+ fi
+ if test $ac_cv_have_decl_freeaddrinfo = no; then
+ HAVE_DECL_FREEADDRINFO=0
+ fi
+ if test $ac_cv_have_decl_gai_strerror = no; then
+ HAVE_DECL_GAI_STRERROR=0
+ fi
+ if test $ac_cv_have_decl_getnameinfo = no; then
+ HAVE_DECL_GETNAMEINFO=0
+ fi
+
+ AC_CHECK_TYPES([struct addrinfo],,,[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+])
+ if test $ac_cv_type_struct_addrinfo = no; then
+ HAVE_STRUCT_ADDRINFO=0
+ fi
+
+ dnl Append $HOSTENT_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates.
+ case " $GETADDRINFO_LIB " in
+ *" $HOSTENT_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $HOSTENT_LIB" ;;
+ esac
+
+ dnl Append $SERVENT_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates.
+ case " $GETADDRINFO_LIB " in
+ *" $SERVENT_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $SERVENT_LIB" ;;
+ esac
+
+ dnl Append $INET_NTOP_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates.
+ case " $GETADDRINFO_LIB " in
+ *" $INET_NTOP_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $INET_NTOP_LIB" ;;
+ esac
+])
diff --git a/gnulib/m4/getcwd-abort-bug.m4 b/gnulib/m4/getcwd-abort-bug.m4
new file mode 100644
index 00000000..59c3daaa
--- /dev/null
+++ b/gnulib/m4/getcwd-abort-bug.m4
@@ -0,0 +1,106 @@
+# serial 2
+# Determine whether getcwd aborts when the length of the working directory
+# name is unusually large. Any length between 4k and 16k trigger the bug
+# when using glibc-2.4.90-9 or older.
+
+# Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+# From Jim Meyering
+
+# gl_FUNC_GETCWD_ABORT_BUG([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([gl_FUNC_GETCWD_ABORT_BUG],
+[
+ AC_CHECK_DECLS_ONCE([getcwd])
+ AC_CHECK_FUNCS([getpagesize])
+ AC_CACHE_CHECK([whether getcwd aborts when 4k < cwd_length < 16k],
+ gl_cv_func_getcwd_abort_bug,
+ [# Remove any remnants of a previous test.
+ rm -rf confdir-14B---
+ # Arrange for deletion of the temporary directory this test creates.
+ ac_clean_files="$ac_clean_files confdir-14B---"
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+#include <stdlib.h>
+#include <unistd.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/stat.h>
+
+/* Don't get link errors because mkdir is redefined to rpl_mkdir. */
+#undef mkdir
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* FIXME: skip the run-test altogether on systems without getpagesize. */
+#if ! HAVE_GETPAGESIZE
+# define getpagesize() 0
+#endif
+
+/* This size is chosen to be larger than PATH_MAX (4k), yet smaller than
+ the 16kB pagesize on ia64 linux. Those conditions make the code below
+ trigger a bug in glibc's getcwd implementation before 2.4.90-10. */
+#define TARGET_LEN (5 * 1024)
+
+int
+main ()
+{
+ char const *dir_name = "confdir-14B---";
+ char *cwd;
+ size_t initial_cwd_len;
+ int fail = 0;
+ size_t desired_depth;
+ size_t d;
+
+ /* The bug is triggered when PATH_MAX < getpagesize (), so skip
+ this relative expensive and invasive test if that's not true. */
+ if (getpagesize () <= PATH_MAX)
+ return 0;
+
+ cwd = getcwd (NULL, 0);
+ if (cwd == NULL)
+ return 0;
+
+ initial_cwd_len = strlen (cwd);
+ free (cwd);
+ desired_depth = ((TARGET_LEN - 1 - initial_cwd_len)
+ / (1 + strlen (dir_name)));
+ for (d = 0; d < desired_depth; d++)
+ {
+ if (mkdir (dir_name, S_IRWXU) < 0 || chdir (dir_name) < 0)
+ {
+ fail = 3; /* Unable to construct deep hierarchy. */
+ break;
+ }
+ }
+
+ /* If libc has the bug in question, this invocation of getcwd
+ results in a failed assertion. */
+ cwd = getcwd (NULL, 0);
+ if (cwd == NULL)
+ fail = 4; /* getcwd failed. This is ok, and expected. */
+ free (cwd);
+
+ /* Call rmdir first, in case the above chdir failed. */
+ rmdir (dir_name);
+ while (0 < d--)
+ {
+ if (chdir ("..") < 0)
+ break;
+ rmdir (dir_name);
+ }
+
+ return 0;
+}
+ ]])],
+ [gl_cv_func_getcwd_abort_bug=no],
+ [gl_cv_func_getcwd_abort_bug=yes],
+ [gl_cv_func_getcwd_abort_bug=yes])
+ ])
+ AS_IF([test $gl_cv_func_getcwd_abort_bug = yes], [$1], [$2])
+])
diff --git a/gnulib/m4/getcwd-path-max.m4 b/gnulib/m4/getcwd-path-max.m4
new file mode 100644
index 00000000..ecf61928
--- /dev/null
+++ b/gnulib/m4/getcwd-path-max.m4
@@ -0,0 +1,190 @@
+# serial 14
+# Check for several getcwd bugs with long file names.
+# If so, arrange to compile the wrapper function.
+
+# This is necessary for at least GNU libc on linux-2.4.19 and 2.4.20.
+# I've heard that this is due to a Linux kernel bug, and that it has
+# been fixed between 2.4.21-pre3 and 2.4.21-pre4. */
+
+# Copyright (C) 2003-2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# From Jim Meyering
+
+AC_DEFUN([gl_FUNC_GETCWD_PATH_MAX],
+[
+ AC_CHECK_DECLS_ONCE([getcwd])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CACHE_CHECK([whether getcwd handles long file names properly],
+ gl_cv_func_getcwd_path_max,
+ [# Arrange for deletion of the temporary directory this test creates.
+ ac_clean_files="$ac_clean_files confdir3"
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifndef AT_FDCWD
+# define AT_FDCWD 0
+#endif
+#ifdef ENAMETOOLONG
+# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
+#else
+# define is_ENAMETOOLONG(x) 0
+#endif
+
+/* Don't get link errors because mkdir is redefined to rpl_mkdir. */
+#undef mkdir
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* The length of this name must be 8. */
+#define DIR_NAME "confdir3"
+#define DIR_NAME_LEN 8
+#define DIR_NAME_SIZE (DIR_NAME_LEN + 1)
+
+/* The length of "../". */
+#define DOTDOTSLASH_LEN 3
+
+/* Leftover bytes in the buffer, to work around library or OS bugs. */
+#define BUF_SLOP 20
+
+int
+main ()
+{
+#ifndef PATH_MAX
+ /* The Hurd doesn't define this, so getcwd can't exhibit the bug --
+ at least not on a local file system. And if we were to start worrying
+ about remote file systems, we'd have to enable the wrapper function
+ all of the time, just to be safe. That's not worth the cost. */
+ exit (0);
+#elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) \
+ - DIR_NAME_SIZE - BUF_SLOP) \
+ <= PATH_MAX)
+ /* FIXME: Assuming there's a system for which this is true,
+ this should be done in a compile test. */
+ exit (0);
+#else
+ char buf[PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1)
+ + DIR_NAME_SIZE + BUF_SLOP];
+ char *cwd = getcwd (buf, PATH_MAX);
+ size_t initial_cwd_len;
+ size_t cwd_len;
+ int fail = 0;
+ size_t n_chdirs = 0;
+
+ if (cwd == NULL)
+ exit (1);
+
+ cwd_len = initial_cwd_len = strlen (cwd);
+
+ while (1)
+ {
+ size_t dotdot_max = PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN);
+ char *c = NULL;
+
+ cwd_len += DIR_NAME_SIZE;
+ /* If mkdir or chdir fails, it could be that this system cannot create
+ any file with an absolute name longer than PATH_MAX, such as cygwin.
+ If so, leave fail as 0, because the current working directory can't
+ be too long for getcwd if it can't even be created. For other
+ errors, be pessimistic and consider that as a failure, too. */
+ if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0)
+ {
+ if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+ fail = 2;
+ break;
+ }
+
+ if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE)
+ {
+ c = getcwd (buf, PATH_MAX);
+ if (!c && errno == ENOENT)
+ {
+ fail = 1;
+ break;
+ }
+ if (c || ! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+ {
+ fail = 2;
+ break;
+ }
+ }
+
+ if (dotdot_max <= cwd_len - initial_cwd_len)
+ {
+ if (dotdot_max + DIR_NAME_SIZE < cwd_len - initial_cwd_len)
+ break;
+ c = getcwd (buf, cwd_len + 1);
+ if (!c)
+ {
+ if (! (errno == ERANGE || errno == ENOENT
+ || is_ENAMETOOLONG (errno)))
+ {
+ fail = 2;
+ break;
+ }
+ if (AT_FDCWD || errno == ERANGE || errno == ENOENT)
+ {
+ fail = 1;
+ break;
+ }
+ }
+ }
+
+ if (c && strlen (c) != cwd_len)
+ {
+ fail = 2;
+ break;
+ }
+ ++n_chdirs;
+ }
+
+ /* Leaving behind such a deep directory is not polite.
+ So clean up here, right away, even though the driving
+ shell script would also clean up. */
+ {
+ size_t i;
+
+ /* Try rmdir first, in case the chdir failed. */
+ rmdir (DIR_NAME);
+ for (i = 0; i <= n_chdirs; i++)
+ {
+ if (chdir ("..") < 0)
+ break;
+ if (rmdir (DIR_NAME) != 0)
+ break;
+ }
+ }
+
+ exit (fail);
+#endif
+}
+ ]])],
+ [gl_cv_func_getcwd_path_max=yes],
+ [case $? in
+ 1) gl_cv_func_getcwd_path_max='no, but it is partly working';;
+ *) gl_cv_func_getcwd_path_max=no;;
+ esac],
+ [gl_cv_func_getcwd_path_max=no])
+ ])
+ case $gl_cv_func_getcwd_path_max in
+ no,*)
+ AC_DEFINE([HAVE_PARTLY_WORKING_GETCWD], [1],
+ [Define to 1 if getcwd works, except it sometimes fails when it shouldn't,
+ setting errno to ERANGE, ENAMETOOLONG, or ENOENT. If __GETCWD_PREFIX
+ is not defined, it doesn't matter whether HAVE_PARTLY_WORKING_GETCWD
+ is defined.]);;
+ esac
+])
diff --git a/gnulib/m4/getcwd.m4 b/gnulib/m4/getcwd.m4
new file mode 100644
index 00000000..df9c9686
--- /dev/null
+++ b/gnulib/m4/getcwd.m4
@@ -0,0 +1,80 @@
+# getcwd.m4 - check for working getcwd that is compatible with glibc
+
+# Copyright (C) 2001, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software
+# Foundation, Inc.
+# This file 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.
+
+# Written by Paul Eggert.
+# serial 2
+
+AC_DEFUN([gl_FUNC_GETCWD_NULL],
+ [
+ AC_CACHE_CHECK([whether getcwd (NULL, 0) allocates memory for result],
+ [gl_cv_func_getcwd_null],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+# include <unistd.h>
+# ifndef getcwd
+ char *getcwd ();
+# endif
+]], [[
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* mingw cwd does not start with '/', but getcwd does allocate. */
+#else
+ if (chdir ("/") != 0)
+ return 1;
+ else
+ {
+ char *f = getcwd (NULL, 0);
+ return ! (f && f[0] == '/' && !f[1]);
+ }
+#endif
+ ]])],
+ [gl_cv_func_getcwd_null=yes],
+ [gl_cv_func_getcwd_null=no],
+ [[
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_getcwd_null="guessing yes";;
+ # Guess yes on Cygwin.
+ cygwin*) gl_cv_func_getcwd_null="guessing yes";;
+ # Guess yes on mingw.
+ mingw*) gl_cv_func_getcwd_null="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_getcwd_null="guessing no";;
+ esac
+ ]])])
+])
+
+AC_DEFUN([gl_FUNC_GETCWD],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_GETCWD_NULL])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ gl_abort_bug=no
+ case $gl_cv_func_getcwd_null,$host_os in
+ *,mingw*)
+ gl_cv_func_getcwd_path_max=yes;;
+ yes,*)
+ gl_FUNC_GETCWD_PATH_MAX
+ gl_FUNC_GETCWD_ABORT_BUG([gl_abort_bug=yes]);;
+ esac
+
+ case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_path_max,$gl_abort_bug in
+ *yes,yes,no) ;;
+ *)
+ REPLACE_GETCWD=1
+ AC_LIBOBJ([getcwd])
+ gl_PREREQ_GETCWD;;
+ esac
+])
+
+# Prerequisites of lib/getcwd.c.
+AC_DEFUN([gl_PREREQ_GETCWD],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO])
+ :
+])
diff --git a/gnulib/m4/getdate.m4 b/gnulib/m4/getdate.m4
new file mode 100644
index 00000000..5f98229f
--- /dev/null
+++ b/gnulib/m4/getdate.m4
@@ -0,0 +1,53 @@
+# getdate.m4 serial 16
+dnl Copyright (C) 2002-2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Define HAVE_COMPOUND_LITERALS if the C compiler supports compound literals
+dnl as in ISO C99.
+dnl Note that compound literals such as (struct s) { 3, 4 } can be used for
+dnl initialization of stack-allocated variables, but are not constant
+dnl expressions and therefore cannot be used as initializer for global or
+dnl static variables (even though gcc supports this in pre-C99 mode).
+AC_DEFUN([gl_C_COMPOUND_LITERALS],
+[
+ AC_CACHE_CHECK([for compound literals], [gl_cv_compound_literals],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[struct s { int i, j; };]],
+ [[struct s t = (struct s) { 3, 4 };
+ if (t.i != 0) return 0;]])],
+ gl_cv_compound_literals=yes,
+ gl_cv_compound_literals=no)])
+ if test $gl_cv_compound_literals = yes; then
+ AC_DEFINE([HAVE_COMPOUND_LITERALS], [1],
+ [Define if you have compound literals.])
+ fi
+])
+
+AC_DEFUN([gl_GETDATE],
+[
+ dnl Prerequisites of lib/getdate.h.
+ AC_REQUIRE([AM_STDBOOL_H])
+ AC_REQUIRE([gl_TIMESPEC])
+
+ dnl Prerequisites of lib/getdate.y.
+ AC_REQUIRE([gl_BISON])
+ AC_REQUIRE([gl_C_COMPOUND_LITERALS])
+ AC_STRUCT_TIMEZONE
+ AC_REQUIRE([gl_CLOCK_TIME])
+ AC_REQUIRE([gl_TM_GMTOFF])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <time.h> /* for time_t */
+#include <limits.h> /* for CHAR_BIT, LONG_MIN, LONG_MAX */
+#define TYPE_MINIMUM(t) \
+ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+#define TYPE_MAXIMUM(t) \
+ ((t) ((t) 0 < (t) -1 ? (t) -1 : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+typedef int verify_min[2 * (LONG_MIN <= TYPE_MINIMUM (time_t)) - 1];
+typedef int verify_max[2 * (TYPE_MAXIMUM (time_t) <= LONG_MAX) - 1];
+ ]])],
+ [AC_DEFINE([TIME_T_FITS_IN_LONG_INT], [1],
+ [Define to 1 if all 'time_t' values fit in a 'long int'.])
+ ])
+])
diff --git a/gnulib/m4/getdelim.m4 b/gnulib/m4/getdelim.m4
new file mode 100644
index 00000000..4beb1501
--- /dev/null
+++ b/gnulib/m4/getdelim.m4
@@ -0,0 +1,90 @@
+# getdelim.m4 serial 6
+
+dnl Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc.
+dnl
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.59])
+
+AC_DEFUN([gl_FUNC_GETDELIM],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+
+ dnl Persuade glibc <stdio.h> to declare getdelim().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_DECLS_ONCE([getdelim])
+
+ AC_CHECK_FUNCS_ONCE([getdelim])
+ if test $ac_cv_func_getdelim = yes; then
+ dnl Found it in some library. Verify that it works.
+ AC_CACHE_CHECK([for working getdelim function], [gl_cv_func_working_getdelim],
+ [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+ int main ()
+ {
+ FILE *in = fopen ("./conftest.data", "r");
+ if (!in)
+ return 1;
+ {
+ /* Test result for a NULL buffer and a zero size.
+ Based on a test program from Karl Heuer. */
+ char *line = NULL;
+ size_t siz = 0;
+ int len = getdelim (&line, &siz, '\n', in);
+ if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+ return 1;
+ }
+ {
+ /* Test result for a NULL buffer and a non-zero size.
+ This crashes on FreeBSD 8.0. */
+ char *line = NULL;
+ size_t siz = (size_t)(~0) / 4;
+ if (getdelim (&line, &siz, '\n', in) == -1)
+ return 1;
+ }
+ return 0;
+ }
+ ]])], [gl_cv_func_working_getdelim=yes] dnl The library version works.
+ , [gl_cv_func_working_getdelim=no] dnl The library version does NOT work.
+ , dnl We're cross compiling. Assume it works on glibc2 systems.
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [gl_cv_func_working_getdelim=yes],
+ [gl_cv_func_working_getdelim=no])]
+ )])
+ else
+ gl_cv_func_working_getdelim=no
+ fi
+
+ if test $ac_cv_have_decl_getdelim = no; then
+ HAVE_DECL_GETDELIM=0
+ fi
+
+ if test $gl_cv_func_working_getdelim = no; then
+ if test $ac_cv_func_getdelim = yes; then
+ REPLACE_GETDELIM=1
+ fi
+ AC_LIBOBJ([getdelim])
+ gl_PREREQ_GETDELIM
+ fi
+])
+
+# Prerequisites of lib/getdelim.c.
+AC_DEFUN([gl_PREREQ_GETDELIM],
+[
+ AC_CHECK_FUNCS([flockfile funlockfile])
+ AC_CHECK_DECLS([getc_unlocked])
+])
diff --git a/gnulib/m4/getdomainname.m4 b/gnulib/m4/getdomainname.m4
new file mode 100644
index 00000000..6ce943d4
--- /dev/null
+++ b/gnulib/m4/getdomainname.m4
@@ -0,0 +1,24 @@
+# getdomainname.m4 serial 4
+dnl Copyright (C) 2002-2003, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_GETDOMAINNAME],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade glibc <unistd.h> to declare getdomainname().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REPLACE_FUNCS([getdomainname])
+ if test $ac_cv_func_getdomainname = no; then
+ HAVE_GETDOMAINNAME=0
+ gl_PREREQ_GETDOMAINNAME
+ fi
+])
+
+# Prerequisites of lib/getdomainname.c.
+AC_DEFUN([gl_PREREQ_GETDOMAINNAME], [
+ :
+])
diff --git a/gnulib/m4/getdtablesize.m4 b/gnulib/m4/getdtablesize.m4
new file mode 100644
index 00000000..d2386284
--- /dev/null
+++ b/gnulib/m4/getdtablesize.m4
@@ -0,0 +1,15 @@
+# getdtablesize.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_GETDTABLESIZE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([getdtablesize])
+ if test $ac_cv_func_getdtablesize != yes; then
+ HAVE_GETDTABLESIZE=0
+ AC_LIBOBJ([getdtablesize])
+ fi
+])
diff --git a/gnulib/m4/getgroups.m4 b/gnulib/m4/getgroups.m4
new file mode 100644
index 00000000..ccba7b91
--- /dev/null
+++ b/gnulib/m4/getgroups.m4
@@ -0,0 +1,43 @@
+# serial 15
+
+dnl From Jim Meyering.
+dnl A wrapper around AC_FUNC_GETGROUPS.
+
+# Copyright (C) 1996-1997, 1999-2004, 2008-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+AC_DEFUN([gl_FUNC_GETGROUPS],
+[
+ AC_REQUIRE([AC_FUNC_GETGROUPS])
+ AC_REQUIRE([AC_TYPE_GETGROUPS])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ if test "$ac_cv_func_getgroups" != yes; then
+ AC_LIBOBJ([getgroups])
+ HAVE_GETGROUPS=0
+ elif test "$ac_cv_func_getgroups_works.$ac_cv_type_getgroups" != yes.gid_t
+ then
+ AC_LIBOBJ([getgroups])
+ REPLACE_GETGROUPS=1
+ AC_DEFINE([GETGROUPS_ZERO_BUG], [1], [Define this to 1 if
+ getgroups(0,NULL) does not return the number of groups.])
+ else
+ dnl Detect FreeBSD bug; POSIX requires getgroups(-1,ptr) to fail.
+ AC_CACHE_CHECK([whether getgroups handles negative values],
+ [gl_cv_func_getgroups_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
+ [[int size = getgroups (0, 0);
+ gid_t *list = malloc (size * sizeof *list);
+ return getgroups (-1, list) != -1;]])],
+ [gl_cv_func_getgroups_works=yes],
+ [gl_cv_func_getgroups_works=no],
+ [gl_cv_func_getgroups_works="guessing no"])])
+ if test "$gl_cv_func_getgroups_works" != yes; then
+ AC_LIBOBJ([getgroups])
+ REPLACE_GETGROUPS=1
+ fi
+ fi
+ test -n "$GETGROUPS_LIB" && LIBS="$GETGROUPS_LIB $LIBS"
+])
diff --git a/gnulib/m4/gethostname.m4 b/gnulib/m4/gethostname.m4
new file mode 100644
index 00000000..ef0b43ef
--- /dev/null
+++ b/gnulib/m4/gethostname.m4
@@ -0,0 +1,101 @@
+# gethostname.m4 serial 9
+dnl Copyright (C) 2002, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Ensure
+# - the gethostname() function,
+# - the HOST_NAME_MAX macro in <limits.h>.
+AC_DEFUN([gl_FUNC_GETHOSTNAME],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ gl_PREREQ_SYS_H_WINSOCK2
+
+ dnl Where is gethostname() defined?
+ dnl - On native Windows, it is in ws2_32.dll.
+ dnl - Otherwise is is in libc.
+ GETHOSTNAME_LIB=
+ AC_CHECK_FUNCS([gethostname], , [
+ AC_CACHE_CHECK([for gethostname in winsock2.h and -lws2_32],
+ [gl_cv_w32_gethostname],
+ [gl_cv_w32_gethostname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+]], [[gethostname(NULL, 0);]])], [gl_cv_w32_gethostname=yes])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_w32_gethostname" = "yes"; then
+ GETHOSTNAME_LIB="-lws2_32"
+ fi
+ ])
+ AC_SUBST([GETHOSTNAME_LIB])
+
+ if test "$ac_cv_func_gethostname" = no; then
+ AC_LIBOBJ([gethostname])
+ HAVE_GETHOSTNAME=0
+ gl_PREREQ_GETHOSTNAME
+ fi
+
+ dnl Also provide HOST_NAME_MAX when <limits.h> lacks it.
+ dnl - On most Unix systems, use MAXHOSTNAMELEN from <sys/param.h> instead.
+ dnl - On Solaris, Cygwin, BeOS, use MAXHOSTNAMELEN from <netdb.h> instead.
+ dnl - On mingw, use 256, because
+ dnl <http://msdn.microsoft.com/en-us/library/ms738527.aspx> says:
+ dnl "if a buffer of 256 bytes is passed in the name parameter and
+ dnl the namelen parameter is set to 256, the buffer size will always
+ dnl be adequate."
+ dnl With this, there is no need to use sysconf (_SC_HOST_NAME_MAX), which
+ dnl is not a compile-time constant.
+ dnl We cannot override <limits.h> using the usual technique, because
+ dnl gl_CHECK_NEXT_HEADERS does not work for <limits.h>. Therefore retrieve
+ dnl the value of HOST_NAME_MAX at configure time.
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+ AC_CHECK_HEADERS_ONCE([sys/socket.h])
+ AC_CHECK_HEADERS_ONCE([netdb.h])
+ AC_CACHE_CHECK([for HOST_NAME_MAX], [gl_cv_decl_HOST_NAME_MAX], [
+ gl_cv_decl_HOST_NAME_MAX=
+ AC_EGREP_CPP([lucky], [
+#include <limits.h>
+#ifdef HOST_NAME_MAX
+lucky
+#endif
+ ], [gl_cv_decl_HOST_NAME_MAX=yes])
+ if test -z "$gl_cv_decl_HOST_NAME_MAX"; then
+ dnl It's not defined in <limits.h>. Substitute it.
+ if test "$gl_cv_w32_gethostname" = yes; then
+ dnl mingw.
+ gl_cv_decl_HOST_NAME_MAX=256
+ else
+ _AC_COMPUTE_INT([MAXHOSTNAMELEN], [gl_cv_decl_HOST_NAME_MAX], [
+#include <sys/types.h>
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#if HAVE_NETDB_H
+# include <netdb.h>
+#endif
+])
+ fi
+ fi
+ ])
+ if test "$gl_cv_decl_HOST_NAME_MAX" != yes; then
+ AC_DEFINE_UNQUOTED([HOST_NAME_MAX], [$gl_cv_decl_HOST_NAME_MAX],
+ [Define HOST_NAME_MAX when <limits.h> does not define it.])
+ fi
+])
+
+# Prerequisites of lib/gethostname.c.
+AC_DEFUN([gl_PREREQ_GETHOSTNAME], [
+ if test "$gl_cv_w32_gethostname" != "yes"; then
+ AC_CHECK_FUNCS([uname])
+ fi
+])
diff --git a/gnulib/m4/gethrxtime.m4 b/gnulib/m4/gethrxtime.m4
new file mode 100644
index 00000000..94250034
--- /dev/null
+++ b/gnulib/m4/gethrxtime.m4
@@ -0,0 +1,74 @@
+# gethrxtime.m4 serial 9
+dnl Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl_GETHRXTIME],
+[
+ AC_REQUIRE([gl_ARITHMETIC_HRTIME_T])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_XTIME])
+ AC_CHECK_DECLS([gethrtime], [], [], [#include <time.h>])
+ LIB_GETHRXTIME=
+ case $ac_cv_have_decl_gethrtime,$gl_cv_arithmetic_hrtime_t in
+ yes,yes) ;;
+ *)
+ AC_LIBOBJ([gethrxtime])
+ gl_PREREQ_GETHRXTIME;;
+ esac
+ AC_SUBST([LIB_GETHRXTIME])
+])
+
+# Test whether hrtime_t is an arithmetic type.
+# It is not arithmetic in older Solaris c89 (which insists on
+# not having a long long int type).
+AC_DEFUN([gl_ARITHMETIC_HRTIME_T],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CACHE_CHECK([for arithmetic hrtime_t], [gl_cv_arithmetic_hrtime_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <time.h>]],
+ [[hrtime_t x = 0; return x/x;]])],
+ [gl_cv_arithmetic_hrtime_t=yes],
+ [gl_cv_arithmetic_hrtime_t=no])])
+ if test $gl_cv_arithmetic_hrtime_t = yes; then
+ AC_DEFINE([HAVE_ARITHMETIC_HRTIME_T], [1],
+ [Define if you have an arithmetic hrtime_t type.])
+ fi
+])
+
+# Prerequisites of lib/xtime.h.
+AC_DEFUN([gl_XTIME],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ :
+])
+
+# Prerequisites of lib/gethrxtime.c.
+AC_DEFUN([gl_PREREQ_GETHRXTIME],
+[
+ AC_REQUIRE([gl_CLOCK_TIME])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([microuptime nanouptime])
+
+ if test $ac_cv_func_nanouptime != yes; then
+ AC_CACHE_CHECK([whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined],
+ gl_cv_have_clock_gettime_macro,
+ [AC_EGREP_CPP([have_clock_gettime_macro],
+ [
+# include <time.h>
+# if defined CLOCK_MONOTONIC || defined CLOCK_REALTIME
+ have_clock_gettime_macro
+# endif
+ ],
+ gl_cv_have_clock_gettime_macro=yes,
+ gl_cv_have_clock_gettime_macro=no)])
+ if test $gl_cv_have_clock_gettime_macro = yes; then
+ LIB_GETHRXTIME=$LIB_CLOCK_GETTIME
+ fi
+ fi
+])
diff --git a/gnulib/m4/getline.m4 b/gnulib/m4/getline.m4
new file mode 100644
index 00000000..83005600
--- /dev/null
+++ b/gnulib/m4/getline.m4
@@ -0,0 +1,97 @@
+# getline.m4 serial 21
+
+dnl Copyright (C) 1998-2003, 2005-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.59])
+
+dnl See if there's a working, system-supplied version of the getline function.
+dnl We can't just do AC_REPLACE_FUNCS([getline]) because some systems
+dnl have a function by that name in -linet that doesn't have anything
+dnl to do with the function we need.
+AC_DEFUN([gl_FUNC_GETLINE],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+
+ dnl Persuade glibc <stdio.h> to declare getline().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_DECLS_ONCE([getline])
+
+ gl_getline_needs_run_time_check=no
+ AC_CHECK_FUNC([getline],
+ [dnl Found it in some library. Verify that it works.
+ gl_getline_needs_run_time_check=yes],
+ [am_cv_func_working_getline=no])
+ if test $gl_getline_needs_run_time_check = yes; then
+ AC_CACHE_CHECK([for working getline function], [am_cv_func_working_getline],
+ [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+ int main ()
+ {
+ FILE *in = fopen ("./conftest.data", "r");
+ if (!in)
+ return 1;
+ {
+ /* Test result for a NULL buffer and a zero size.
+ Based on a test program from Karl Heuer. */
+ char *line = NULL;
+ size_t siz = 0;
+ int len = getline (&line, &siz, in);
+ if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+ return 1;
+ }
+ {
+ /* Test result for a NULL buffer and a non-zero size.
+ This crashes on FreeBSD 8.0. */
+ char *line = NULL;
+ size_t siz = (size_t)(~0) / 4;
+ if (getline (&line, &siz, in) == -1)
+ return 1;
+ }
+ return 0;
+ }
+ ]])], [am_cv_func_working_getline=yes] dnl The library version works.
+ , [am_cv_func_working_getline=no] dnl The library version does NOT work.
+ , dnl We're cross compiling. Assume it works on glibc2 systems.
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [am_cv_func_working_getline=yes],
+ [am_cv_func_working_getline=no])]
+ )])
+ fi
+
+ if test $ac_cv_have_decl_getline = no; then
+ HAVE_DECL_GETLINE=0
+ fi
+
+ if test $am_cv_func_working_getline = no; then
+ dnl Set REPLACE_GETLINE always: Even if we have not found the broken
+ dnl getline function among $LIBS, it may exist in libinet and the
+ dnl executable may be linked with -linet.
+ REPLACE_GETLINE=1
+ AC_LIBOBJ([getline])
+
+ gl_PREREQ_GETLINE
+ fi
+])
+
+# Prerequisites of lib/getline.c.
+AC_DEFUN([gl_PREREQ_GETLINE],
+[
+ gl_FUNC_GETDELIM
+])
diff --git a/gnulib/m4/getloadavg.m4 b/gnulib/m4/getloadavg.m4
new file mode 100644
index 00000000..0a731c4f
--- /dev/null
+++ b/gnulib/m4/getloadavg.m4
@@ -0,0 +1,187 @@
+# Check for getloadavg.
+
+# Copyright (C) 1992-1996, 1999-2000, 2002-2003, 2006, 2008-2010 Free Software
+# Foundation, Inc.
+
+# This file 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.
+
+# Autoconf defines AC_FUNC_GETLOADAVG, but that is obsolescent.
+# New applications should use gl_GETLOADAVG instead.
+
+# gl_GETLOADAVG(LIBOBJDIR)
+# ------------------------
+AC_DEFUN([gl_GETLOADAVG],
+[AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+# Persuade glibc <stdlib.h> to declare getloadavg().
+AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+gl_have_func=no # yes means we've found a way to get the load average.
+
+# Make sure getloadavg.c is where it belongs, at configure-time.
+test -f "$srcdir/$1/getloadavg.c" ||
+ AC_MSG_ERROR([$srcdir/$1/getloadavg.c is missing])
+
+gl_save_LIBS=$LIBS
+
+# Check for getloadavg, but be sure not to touch the cache variable.
+(AC_CHECK_FUNC([getloadavg], [exit 0], [exit 1])) && gl_have_func=yes
+
+# On HPUX9, an unprivileged user can get load averages through this function.
+AC_CHECK_FUNCS([pstat_getdynamic])
+
+# Solaris has libkstat which does not require root.
+AC_CHECK_LIB([kstat], [kstat_open])
+test $ac_cv_lib_kstat_kstat_open = yes && gl_have_func=yes
+
+# AIX has libperfstat which does not require root
+AC_CHECK_LIB([perfstat], [perfstat_cpu_total])
+test $ac_cv_lib_perfstat_perfstat_cpu_total = yes && gl_have_func=yes
+
+# Some systems with -lutil have (and need) -lkvm as well, some do not.
+# On Solaris, -lkvm requires nlist from -lelf, so check that first
+# to get the right answer into the cache.
+# For kstat on solaris, we need libelf to force the definition of SVR4 below.
+if test $gl_have_func = no; then
+ AC_CHECK_LIB([elf], [elf_begin], [LIBS="-lelf $LIBS"])
+fi
+if test $gl_have_func = no; then
+ AC_CHECK_LIB([kvm], [kvm_open], [LIBS="-lkvm $LIBS"])
+ # Check for the 4.4BSD definition of getloadavg.
+ AC_CHECK_LIB([util], [getloadavg],
+ [LIBS="-lutil $LIBS" gl_have_func=yes gl_cv_func_getloadavg_setgid=yes])
+fi
+
+if test $gl_have_func = no; then
+ # There is a commonly available library for RS/6000 AIX.
+ # Since it is not a standard part of AIX, it might be installed locally.
+ gl_getloadavg_LIBS=$LIBS
+ LIBS="-L/usr/local/lib $LIBS"
+ AC_CHECK_LIB([getloadavg], [getloadavg],
+ [LIBS="-lgetloadavg $LIBS"], [LIBS=$gl_getloadavg_LIBS])
+fi
+
+# Make sure it is really in the library, if we think we found it,
+# otherwise set up the replacement function.
+AC_CHECK_FUNCS([getloadavg], [],
+ [gl_PREREQ_GETLOADAVG])
+
+# Some definitions of getloadavg require that the program be installed setgid.
+AC_CACHE_CHECK([whether getloadavg requires setgid],
+ gl_cv_func_getloadavg_setgid,
+[AC_EGREP_CPP([Yowza Am I SETGID yet],
+[#define CONFIGURING_GETLOADAVG
+#include "$srcdir/$1/getloadavg.c"
+#ifdef LDAV_PRIVILEGED
+Yowza Am I SETGID yet
+#endif
+],
+ gl_cv_func_getloadavg_setgid=yes,
+ gl_cv_func_getloadavg_setgid=no)])
+if test $gl_cv_func_getloadavg_setgid = yes; then
+ NEED_SETGID=true
+ AC_DEFINE([GETLOADAVG_PRIVILEGED], [1],
+ [Define to 1 if the `getloadavg' function needs to be run setuid
+ or setgid.])
+else
+ NEED_SETGID=false
+fi
+AC_SUBST([NEED_SETGID])dnl
+
+if test $gl_cv_func_getloadavg_setgid = yes; then
+ AC_CACHE_CHECK([group of /dev/kmem], [gl_cv_group_kmem],
+[ # On Solaris, /dev/kmem is a symlink. Get info on the real file.
+ ac_ls_output=`ls -lgL /dev/kmem 2>/dev/null`
+ # If we got an error (system does not support symlinks), try without -L.
+ test -z "$ac_ls_output" && ac_ls_output=`ls -lg /dev/kmem`
+ gl_cv_group_kmem=`echo $ac_ls_output \
+ | sed -ne ['s/[ ][ ]*/ /g
+ s/^.[sSrwx-]* *[0-9]* *\([^0-9]*\) *.*/\1/
+ / /s/.* //;p']`
+])
+ AC_SUBST([KMEM_GROUP], [$gl_cv_group_kmem])dnl
+fi
+if test "x$gl_save_LIBS" = x; then
+ GETLOADAVG_LIBS=$LIBS
+else
+ GETLOADAVG_LIBS=`echo "$LIBS" | sed "s!$gl_save_LIBS!!"`
+fi
+LIBS=$gl_save_LIBS
+
+AC_SUBST([GETLOADAVG_LIBS])dnl
+
+# Test whether the system declares getloadavg. Solaris has the function
+# but declares it in <sys/loadavg.h>, not <stdlib.h>.
+AC_CHECK_HEADERS([sys/loadavg.h])
+if test $ac_cv_header_sys_loadavg_h = yes; then
+ HAVE_SYS_LOADAVG_H=1
+else
+ HAVE_SYS_LOADAVG_H=0
+fi
+AC_CHECK_DECL([getloadavg], [], [HAVE_DECL_GETLOADAVG=0],
+ [#if HAVE_SYS_LOADAVG_H
+ # include <sys/loadavg.h>
+ #endif
+ #include <stdlib.h>])
+])# gl_GETLOADAVG
+
+
+# gl_PREREQ_GETLOADAVG
+# --------------------
+# Set up the AC_LIBOBJ replacement of `getloadavg'.
+AC_DEFUN([gl_PREREQ_GETLOADAVG],
+[AC_LIBOBJ([getloadavg])
+AC_DEFINE([C_GETLOADAVG], [1], [Define to 1 if using `getloadavg.c'.])
+# Figure out what our getloadavg.c needs.
+gl_have_func=no
+AC_CHECK_HEADER([sys/dg_sys_info.h],
+[gl_have_func=yes
+ AC_DEFINE([DGUX], [1], [Define to 1 for DGUX with <sys/dg_sys_info.h>.])
+ AC_CHECK_LIB([dgc], [dg_sys_info])])
+
+# We cannot check for <dwarf.h>, because Solaris 2 does not use dwarf (it
+# uses stabs), but it is still SVR4. We cannot check for <elf.h> because
+# Irix 4.0.5F has the header but not the library.
+if test $gl_have_func = no && test "$ac_cv_lib_elf_elf_begin" = yes; then
+ gl_have_func=yes
+ AC_DEFINE([SVR4], [1], [Define to 1 on System V Release 4.])
+fi
+
+if test $gl_have_func = no; then
+ AC_CHECK_HEADER([inq_stats/cpustats.h],
+ [gl_have_func=yes
+ AC_DEFINE([UMAX], [1], [Define to 1 for Encore UMAX.])
+ AC_DEFINE([UMAX4_3], [1],
+ [Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h>
+ instead of <sys/cpustats.h>.])])
+fi
+
+if test $gl_have_func = no; then
+ AC_CHECK_HEADER([sys/cpustats.h],
+ [gl_have_func=yes; AC_DEFINE([UMAX])])
+fi
+
+if test $gl_have_func = no; then
+ AC_CHECK_HEADERS([mach/mach.h])
+fi
+
+AC_CHECK_HEADERS([nlist.h],
+[AC_CHECK_MEMBERS([struct nlist.n_un.n_name],
+ [AC_DEFINE([NLIST_NAME_UNION], [1],
+ [Define to 1 if your `struct nlist' has an
+ `n_un' member. Obsolete, depend on
+ `HAVE_STRUCT_NLIST_N_UN_N_NAME])], [],
+ [@%:@include <nlist.h>])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <nlist.h>]],
+ [[struct nlist x;
+ #ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
+ x.n_un.n_name = "";
+ #else
+ x.n_name = "";
+ #endif]])],
+ [AC_DEFINE([N_NAME_POINTER], [1],
+ [Define to 1 if the nlist n_name member is a pointer])])
+])dnl
+])# gl_PREREQ_GETLOADAVG
diff --git a/gnulib/m4/getlogin.m4 b/gnulib/m4/getlogin.m4
new file mode 100644
index 00000000..e47967d0
--- /dev/null
+++ b/gnulib/m4/getlogin.m4
@@ -0,0 +1,15 @@
+# getlogin.m4 serial 1
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GETLOGIN],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([getlogin])
+ if test $ac_cv_func_getlogin = no; then
+ AC_LIBOBJ([getlogin])
+ HAVE_GETLOGIN=0
+ fi
+])
diff --git a/gnulib/m4/getlogin_r.m4 b/gnulib/m4/getlogin_r.m4
new file mode 100644
index 00000000..455e0813
--- /dev/null
+++ b/gnulib/m4/getlogin_r.m4
@@ -0,0 +1,35 @@
+#serial 5
+
+# Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+dnl From Derek Price
+dnl
+dnl Provide getlogin_r when the system lacks it.
+dnl
+
+AC_DEFUN([gl_GETLOGIN_R],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade glibc <unistd.h> to declare getlogin_r().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([getlogin_r])
+ if test $ac_cv_func_getlogin_r = no; then
+ AC_LIBOBJ([getlogin_r])
+ gl_PREREQ_GETLOGIN_R
+ AC_CHECK_DECLS_ONCE([getlogin_r])
+ if test $ac_cv_have_decl_getlogin_r = no; then
+ HAVE_DECL_GETLOGIN_R=0
+ fi
+ fi
+])
+
+AC_DEFUN([gl_PREREQ_GETLOGIN_R],
+[
+ AC_CHECK_DECLS_ONCE([getlogin])
+])
diff --git a/gnulib/m4/getndelim2.m4 b/gnulib/m4/getndelim2.m4
new file mode 100644
index 00000000..950d230b
--- /dev/null
+++ b/gnulib/m4/getndelim2.m4
@@ -0,0 +1,21 @@
+# getndelim2.m4 serial 7
+dnl Copyright (C) 2003, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GETNDELIM2],
+[
+ AC_LIBOBJ([getndelim2])
+ gl_PREREQ_GETNDELIM2
+ AC_CHECK_FUNCS_ONCE([flockfile])
+ AC_CHECK_FUNCS_ONCE([funlockfile])
+])
+
+# Prerequisites of lib/getndelim2.h and lib/getndelim2.c.
+AC_DEFUN([gl_PREREQ_GETNDELIM2],
+[
+ dnl Prerequisites of lib/getndelim2.h.
+ AC_REQUIRE([gt_TYPE_SSIZE_T])
+ dnl No prerequisites of lib/getndelim2.c.
+])
diff --git a/gnulib/m4/getnline.m4 b/gnulib/m4/getnline.m4
new file mode 100644
index 00000000..1e22cef0
--- /dev/null
+++ b/gnulib/m4/getnline.m4
@@ -0,0 +1,13 @@
+# getnline.m4 serial 3
+dnl Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GETNLINE],
+[
+ dnl Prerequisites of lib/getnline.h.
+ AC_REQUIRE([gt_TYPE_SSIZE_T])
+ dnl Prerequisites of lib/getnline.c.
+ :
+])
diff --git a/gnulib/m4/getopt.m4 b/gnulib/m4/getopt.m4
new file mode 100644
index 00000000..a19805ea
--- /dev/null
+++ b/gnulib/m4/getopt.m4
@@ -0,0 +1,273 @@
+# getopt.m4 serial 24
+dnl Copyright (C) 2002-2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Request a POSIX compliant getopt function.
+AC_DEFUN([gl_FUNC_GETOPT_POSIX],
+[
+ m4_divert_text([DEFAULTS], [gl_getopt_required=POSIX])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ gl_GETOPT_IFELSE([
+ gl_REPLACE_GETOPT
+ ],
+ [])
+])
+
+# Request a POSIX compliant getopt function with GNU extensions (such as
+# options with optional arguments) and the functions getopt_long,
+# getopt_long_only.
+AC_DEFUN([gl_FUNC_GETOPT_GNU],
+[
+ m4_divert_text([INIT_PREPARE], [gl_getopt_required=GNU])
+
+ AC_REQUIRE([gl_FUNC_GETOPT_POSIX])
+])
+
+# Request the gnulib implementation of the getopt functions unconditionally.
+# argp.m4 uses this.
+AC_DEFUN([gl_REPLACE_GETOPT],
+[
+ dnl Arrange for getopt.h to be created.
+ gl_GETOPT_SUBSTITUTE_HEADER
+ dnl Arrange for unistd.h to include getopt.h.
+ GNULIB_UNISTD_H_GETOPT=1
+ dnl Arrange to compile the getopt implementation.
+ AC_LIBOBJ([getopt])
+ AC_LIBOBJ([getopt1])
+ gl_PREREQ_GETOPT
+])
+
+# emacs' configure.in uses this.
+AC_DEFUN([gl_GETOPT_IFELSE],
+[
+ AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
+ AS_IF([test -n "$gl_replace_getopt"], [$1], [$2])
+])
+
+# Determine whether to replace the entire getopt facility.
+AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade Solaris <unistd.h> to declare optarg, optind, opterr, optopt.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ gl_CHECK_NEXT_HEADERS([getopt.h])
+ AC_CHECK_HEADERS_ONCE([getopt.h])
+ if test $ac_cv_header_getopt_h = yes; then
+ HAVE_GETOPT_H=1
+ else
+ HAVE_GETOPT_H=0
+ fi
+ AC_SUBST([HAVE_GETOPT_H])
+
+ gl_replace_getopt=
+
+ dnl Test whether <getopt.h> is available.
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes])
+ fi
+
+ dnl Test whether the function getopt_long is available.
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes])
+ fi
+
+ dnl BSD getopt_long uses an incompatible method to reset option processing.
+ dnl Existence of the variable, in and of itself, is not a reason to replace
+ dnl getopt, but knowledge of the variable is needed to determine how to
+ dnl reset and whether a reset reparses the environment.
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ AC_CHECK_DECLS([optreset], [], [],
+ [[#include <getopt.h>]])
+ fi
+
+ dnl mingw's getopt (in libmingwex.a) does weird things when the options
+ dnl strings starts with '+' and it's not the first call. Some internal state
+ dnl is left over from earlier calls, and neither setting optind = 0 nor
+ dnl setting optreset = 1 get rid of this internal state.
+ dnl POSIX is silent on optind vs. optreset, so we allow either behavior.
+ if test -z "$gl_replace_getopt"; then
+ AC_CACHE_CHECK([whether getopt is POSIX compatible],
+ [gl_cv_func_getopt_posix],
+ [
+ dnl This test fails on mingw and succeeds on all other platforms.
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !HAVE_DECL_OPTRESET
+# define OPTIND_MIN 0
+#else
+# define OPTIND_MIN 1
+#endif
+
+int
+main ()
+{
+ {
+ int argc = 0;
+ char *argv[10];
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-a";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = OPTIND_MIN;
+ opterr = 0;
+
+ c = getopt (argc, argv, "ab");
+ if (!(c == 'a'))
+ return 1;
+ c = getopt (argc, argv, "ab");
+ if (!(c == -1))
+ return 2;
+ if (!(optind == 2))
+ return 3;
+ }
+ /* Some internal state exists at this point. */
+ {
+ int argc = 0;
+ char *argv[10];
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = OPTIND_MIN;
+ opterr = 0;
+
+ c = getopt (argc, argv, "+abp:q:");
+ if (!(c == -1))
+ return 4;
+ if (!(strcmp (argv[0], "program") == 0))
+ return 5;
+ if (!(strcmp (argv[1], "donald") == 0))
+ return 6;
+ if (!(strcmp (argv[2], "-p") == 0))
+ return 7;
+ if (!(strcmp (argv[3], "billy") == 0))
+ return 8;
+ if (!(strcmp (argv[4], "duck") == 0))
+ return 9;
+ if (!(strcmp (argv[5], "-a") == 0))
+ return 10;
+ if (!(strcmp (argv[6], "bar") == 0))
+ return 11;
+ if (!(optind == 1))
+ return 12;
+ }
+
+ return 0;
+}
+]])],
+ [gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no],
+ [case "$host_os" in
+ mingw*) gl_cv_func_getopt_posix="guessing no";;
+ *) gl_cv_func_getopt_posix="guessing yes";;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_getopt_posix" in
+ *no) gl_replace_getopt=yes ;;
+ esac
+ fi
+
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu],
+ [# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
+ # optstring is necessary for programs like m4 that have POSIX-mandated
+ # semantics for supporting options interspersed with files.
+ # Also, since getopt_long is a GNU extension, we require optind=0.
+ gl_had_POSIXLY_CORRECT=${POSIXLY_CORRECT:+yes}
+ POSIXLY_CORRECT=1
+ export POSIXLY_CORRECT
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[#include <getopt.h>
+ #include <stddef.h>
+ #include <string.h>
+ ]], [[
+ /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
+ and fails on MacOS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
+ OSF/1 5.1, Solaris 10. */
+ {
+ char *myargv[3];
+ myargv[0] = "conftest";
+ myargv[1] = "-+";
+ myargv[2] = 0;
+ opterr = 0;
+ if (getopt (2, myargv, "+a") != '?')
+ return 1;
+ }
+ /* This code succeeds on glibc 2.8, mingw,
+ and fails on MacOS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+ IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */
+ {
+ char *argv[] = { "program", "-p", "foo", "bar", NULL };
+
+ optind = 1;
+ if (getopt (4, argv, "p::") != 'p')
+ return 2;
+ if (optarg != NULL)
+ return 3;
+ if (getopt (4, argv, "p::") != -1)
+ return 4;
+ if (optind != 2)
+ return 5;
+ }
+ /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */
+ {
+ char *argv[] = { "program", "foo", "-p", NULL };
+ optind = 0;
+ if (getopt (3, argv, "-p") != 1)
+ return 6;
+ if (getopt (3, argv, "-p") != 'p')
+ return 7;
+ }
+ return 0;
+ ]])],
+ [gl_cv_func_getopt_gnu=yes],
+ [gl_cv_func_getopt_gnu=no],
+ [dnl Cross compiling. Guess based on host and declarations.
+ case $host_os:$ac_cv_have_decl_optreset in
+ *-gnu*:* | mingw*:*) gl_cv_func_getopt_gnu=no;;
+ *:yes) gl_cv_func_getopt_gnu=no;;
+ *) gl_cv_func_getopt_gnu=yes;;
+ esac
+ ])
+ if test "$gl_had_POSIXLY_CORRECT" != yes; then
+ AS_UNSET([POSIXLY_CORRECT])
+ fi
+ ])
+ if test "$gl_cv_func_getopt_gnu" = "no"; then
+ gl_replace_getopt=yes
+ fi
+ fi
+])
+
+# emacs' configure.in uses this.
+AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
+[
+ GETOPT_H=getopt.h
+ AC_DEFINE([__GETOPT_PREFIX], [[rpl_]],
+ [Define to rpl_ if the getopt replacement functions and variables
+ should be used.])
+ AC_SUBST([GETOPT_H])
+])
+
+# Prerequisites of lib/getopt*.
+# emacs' configure.in uses this.
+AC_DEFUN([gl_PREREQ_GETOPT],
+[
+ AC_CHECK_DECLS_ONCE([getenv])
+])
diff --git a/gnulib/m4/getpagesize.m4 b/gnulib/m4/getpagesize.m4
new file mode 100644
index 00000000..8968516e
--- /dev/null
+++ b/gnulib/m4/getpagesize.m4
@@ -0,0 +1,30 @@
+# getpagesize.m4 serial 7
+dnl Copyright (C) 2002, 2004-2005, 2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_GETPAGESIZE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS([getpagesize])
+ if test $ac_cv_func_getpagesize = no; then
+ HAVE_GETPAGESIZE=0
+ AC_CHECK_HEADERS([OS.h])
+ if test $ac_cv_header_OS_h = yes; then
+ HAVE_OS_H=1
+ fi
+ AC_CHECK_HEADERS([sys/param.h])
+ if test $ac_cv_header_sys_param_h = yes; then
+ HAVE_SYS_PARAM_H=1
+ fi
+ fi
+ case "$host_os" in
+ mingw*)
+ REPLACE_GETPAGESIZE=1
+ AC_LIBOBJ([getpagesize])
+ ;;
+ esac
+])
diff --git a/gnulib/m4/getpass.m4 b/gnulib/m4/getpass.m4
new file mode 100644
index 00000000..cb80a65c
--- /dev/null
+++ b/gnulib/m4/getpass.m4
@@ -0,0 +1,48 @@
+# getpass.m4 serial 11
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Provide a getpass() function if the system doesn't have it.
+AC_DEFUN([gl_FUNC_GETPASS],
+[
+ AC_REPLACE_FUNCS([getpass])
+ AC_CHECK_DECLS_ONCE([getpass])
+ if test $ac_cv_func_getpass = no; then
+ gl_PREREQ_GETPASS
+ fi
+])
+
+# Provide the GNU getpass() implementation. It supports passwords of
+# arbitrary length (not just 8 bytes as on HP-UX).
+AC_DEFUN([gl_FUNC_GETPASS_GNU],
+[
+ AC_CHECK_DECLS_ONCE([getpass])
+ dnl TODO: Detect when GNU getpass() is already found in glibc.
+ AC_LIBOBJ([getpass])
+ gl_PREREQ_GETPASS
+ dnl We must choose a different name for our function, since on ELF systems
+ dnl an unusable getpass() in libc.so would override our getpass() if it is
+ dnl compiled into a shared library.
+ AC_DEFINE([getpass], [gnu_getpass],
+ [Define to a replacement function name for getpass().])
+])
+
+# Prerequisites of lib/getpass.c.
+AC_DEFUN([gl_PREREQ_GETPASS], [
+ AC_CHECK_HEADERS_ONCE([stdio_ext.h termios.h])
+ AC_CHECK_FUNCS_ONCE([__fsetlocking tcgetattr tcsetattr])
+ AC_CHECK_DECLS([__fsetlocking],,,
+ [#include <stdio.h>
+ #if HAVE_STDIO_EXT_H
+ #include <stdio_ext.h>
+ #endif])
+ AC_CHECK_DECLS_ONCE([fflush_unlocked])
+ AC_CHECK_DECLS_ONCE([flockfile])
+ AC_CHECK_DECLS_ONCE([fputs_unlocked])
+ AC_CHECK_DECLS_ONCE([funlockfile])
+ AC_CHECK_DECLS_ONCE([putc_unlocked])
+ :
+])
diff --git a/gnulib/m4/getsubopt.m4 b/gnulib/m4/getsubopt.m4
new file mode 100644
index 00000000..8adf3115
--- /dev/null
+++ b/gnulib/m4/getsubopt.m4
@@ -0,0 +1,22 @@
+# getsubopt.m4 serial 4
+dnl Copyright (C) 2004, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_GETSUBOPT],
+[
+ dnl Persuade glibc <stdlib.h> to declare getsubopt().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([getsubopt])
+ if test $ac_cv_func_getsubopt = no; then
+ HAVE_GETSUBOPT=0
+ AC_LIBOBJ([getsubopt])
+ gl_PREREQ_GETSUBOPT
+ fi
+])
+
+# Prerequisites of lib/getsubopt.c.
+AC_DEFUN([gl_PREREQ_GETSUBOPT], [:])
diff --git a/gnulib/m4/gettext.m4 b/gnulib/m4/gettext.m4
new file mode 100644
index 00000000..d6dc3fe2
--- /dev/null
+++ b/gnulib/m4/gettext.m4
@@ -0,0 +1,381 @@
+# gettext.m4 serial 62 (gettext-0.18)
+dnl Copyright (C) 1995-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl default (if it is not specified or empty) is 'no-libtool'.
+dnl INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+dnl will be ignored. If NEEDSYMBOL is specified and is
+dnl 'need-formatstring-macros', then GNU gettext implementations that don't
+dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries. If empty,
+dnl the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+ dnl Argument checking.
+ ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+ [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+ ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+ [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+ define([gt_included_intl],
+ ifelse([$1], [external],
+ ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
+ [yes]))
+ define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
+ gt_NEEDS_INIT
+ AM_GNU_GETTEXT_NEED([$2])
+
+ AC_REQUIRE([AM_PO_SUBDIRS])dnl
+ ifelse(gt_included_intl, yes, [
+ AC_REQUIRE([AM_INTL_SUBDIR])dnl
+ ])
+
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ dnl Ideally we would do this search only after the
+ dnl if test "$USE_NLS" = "yes"; then
+ dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+ dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+ dnl the configure script would need to contain the same shell code
+ dnl again, outside any 'if'. There are two solutions:
+ dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+ dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+ dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+ dnl documented, we avoid it.
+ ifelse(gt_included_intl, yes, , [
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+ ])
+
+ dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation.
+ gt_INTL_MACOSX
+
+ dnl Set USE_NLS.
+ AC_REQUIRE([AM_NLS])
+
+ ifelse(gt_included_intl, yes, [
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ ])
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ dnl Add a version number to the cache macros.
+ case " $gt_needs " in
+ *" need-formatstring-macros "*) gt_api_version=3 ;;
+ *" need-ngettext "*) gt_api_version=2 ;;
+ *) gt_api_version=1 ;;
+ esac
+ gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+ gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+ ifelse(gt_included_intl, yes, [
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH([included-gettext],
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ ])
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we have
+ dnl to fall back to GNU NLS library.
+
+ if test $gt_api_version -ge 3; then
+ gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+'
+ else
+ gt_revision_test_code=
+ fi
+ if test $gt_api_version -ge 2; then
+ gt_expression_test_code=' + * ngettext ("", "", 0)'
+ else
+ gt_expression_test_code=
+ fi
+
+ AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
+ [AC_TRY_LINK([#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;],
+ [bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings],
+ [eval "$gt_func_gnugettext_libc=yes"],
+ [eval "$gt_func_gnugettext_libc=no"])])
+
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ ifelse(gt_included_intl, yes, , [
+ AM_ICONV_LINK
+ ])
+ dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+ dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+ dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+ dnl even if libiconv doesn't exist.
+ AC_LIB_LINKFLAGS_BODY([intl])
+ AC_CACHE_CHECK([for GNU gettext in libintl],
+ [$gt_func_gnugettext_libintl],
+ [gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ dnl Now see whether libintl exists and does not depend on libiconv.
+ AC_TRY_LINK([#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);],
+ [bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
+ [eval "$gt_func_gnugettext_libintl=yes"],
+ [eval "$gt_func_gnugettext_libintl=no"])
+ dnl Now see whether libintl exists and depends on libiconv.
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);],
+ [bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
+ [LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ eval "$gt_func_gnugettext_libintl=yes"
+ ])
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"])
+ fi
+
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ dnl Reset the values set by searching for libintl.
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on included GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
+ LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ CATOBJEXT=
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions to use GNU gettext tools.
+ CATOBJEXT=.gmo
+ fi
+ ])
+
+ if test -n "$INTL_MACOSX_LIBS"; then
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Some extra flags are needed during linking.
+ LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+ LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+ fi
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ AC_DEFINE([ENABLE_NLS], [1],
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ AC_MSG_CHECKING([whether to use NLS])
+ AC_MSG_RESULT([$USE_NLS])
+ if test "$USE_NLS" = "yes"; then
+ AC_MSG_CHECKING([where the gettext function comes from])
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
+ fi
+ else
+ gt_source="included intl directory"
+ fi
+ AC_MSG_RESULT([$gt_source])
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ AC_MSG_CHECKING([how to link with libintl])
+ AC_MSG_RESULT([$LIBINTL])
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+ fi
+
+ dnl For backward compatibility. Some packages may be using this.
+ AC_DEFINE([HAVE_GETTEXT], [1],
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ AC_DEFINE([HAVE_DCGETTEXT], [1],
+ [Define if the GNU dcgettext() function is already present or preinstalled.])
+ fi
+
+ dnl We need to process the po/ directory.
+ POSUB=po
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+ dnl to 'yes' because some of the testsuite requires it.
+ if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST([BUILD_INCLUDED_LIBINTL])
+ AC_SUBST([USE_INCLUDED_LIBINTL])
+ AC_SUBST([CATOBJEXT])
+
+ dnl For backward compatibility. Some configure.ins may be using this.
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ DATADIRNAME=share
+ AC_SUBST([DATADIRNAME])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INSTOBJEXT=.mo
+ AC_SUBST([INSTOBJEXT])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ GENCAT=gencat
+ AC_SUBST([GENCAT])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLOBJS=
+ if test "$USE_INCLUDED_LIBINTL" = yes; then
+ INTLOBJS="\$(GETTOBJS)"
+ fi
+ AC_SUBST([INTLOBJS])
+
+ dnl Enable libtool support if the surrounding package wishes it.
+ INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+ AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
+ ])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLLIBS="$LIBINTL"
+ AC_SUBST([INTLLIBS])
+
+ dnl Make all documented variables known to autoconf.
+ AC_SUBST([LIBINTL])
+ AC_SUBST([LTLIBINTL])
+ AC_SUBST([POSUB])
+])
+
+
+dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
+m4_define([gt_NEEDS_INIT],
+[
+ m4_divert_text([DEFAULTS], [gt_needs=])
+ m4_define([gt_NEEDS_INIT], [])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
+AC_DEFUN([AM_GNU_GETTEXT_NEED],
+[
+ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
diff --git a/gnulib/m4/gettime.m4 b/gnulib/m4/gettime.m4
new file mode 100644
index 00000000..9e7fde42
--- /dev/null
+++ b/gnulib/m4/gettime.m4
@@ -0,0 +1,15 @@
+# gettime.m4 serial 7
+dnl Copyright (C) 2002, 2004-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GETTIME],
+[
+ AC_LIBOBJ([gettime])
+
+ dnl Prerequisites of lib/gettime.c.
+ AC_REQUIRE([gl_CLOCK_TIME])
+ AC_REQUIRE([gl_TIMESPEC])
+ AC_CHECK_FUNCS_ONCE([gettimeofday nanotime])
+])
diff --git a/gnulib/m4/gettimeofday.m4 b/gnulib/m4/gettimeofday.m4
new file mode 100644
index 00000000..709a4d4f
--- /dev/null
+++ b/gnulib/m4/gettimeofday.m4
@@ -0,0 +1,120 @@
+# serial 15
+
+# Copyright (C) 2001-2003, 2005, 2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+dnl From Jim Meyering.
+
+AC_DEFUN([gl_FUNC_GETTIMEOFDAY],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H])
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([gettimeofday])
+
+ gl_gettimeofday_timezone=void
+ if test $ac_cv_func_gettimeofday != yes; then
+ HAVE_GETTIMEOFDAY=0
+ AC_LIBOBJ([gettimeofday])
+ gl_PREREQ_GETTIMEOFDAY
+ else
+ gl_FUNC_GETTIMEOFDAY_CLOBBER
+ AC_CACHE_CHECK([for gettimeofday with POSIX signature],
+ [gl_cv_func_gettimeofday_posix_signature],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/time.h>
+ struct timeval c;
+ int gettimeofday (struct timeval *restrict, void *restrict);
+ ]],
+ [[/* glibc uses struct timezone * rather than the POSIX void *
+ if _GNU_SOURCE is defined. However, since the only portable
+ use of gettimeofday uses NULL as the second parameter, and
+ since the glibc definition is actually more typesafe, it is
+ not worth wrapping this to get a compliant signature. */
+ int (*f) (struct timeval *restrict, void *restrict)
+ = gettimeofday;
+ int x = f (&c, 0);
+ return !(x | c.tv_sec | c.tv_usec);
+ ]])],
+ [gl_cv_func_gettimeofday_posix_signature=yes],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/time.h>
+int gettimeofday (struct timeval *restrict, struct timezone *restrict);
+ ]])],
+ [gl_cv_func_gettimeofday_posix_signature=almost],
+ [gl_cv_func_gettimeofday_posix_signature=no])])])
+ if test $gl_cv_func_gettimeofday_posix_signature = almost; then
+ gl_gettimeofday_timezone='struct timezone'
+ elif test $gl_cv_func_gettimeofday_posix_signature != yes; then
+ REPLACE_GETTIMEOFDAY=1
+ AC_LIBOBJ([gettimeofday])
+ gl_PREREQ_GETTIMEOFDAY
+ fi
+ fi
+ AC_DEFINE_UNQUOTED([GETTIMEOFDAY_TIMEZONE], [$gl_gettimeofday_timezone],
+ [Define this to 'void' or 'struct timezone' to match the system's
+ declaration of the second argument to gettimeofday.])
+])
+
+
+dnl See if gettimeofday clobbers the static buffer that localtime uses
+dnl for its return value. The gettimeofday function from Mac OS X 10.0.4
+dnl (i.e., Darwin 1.3.7) has this problem.
+dnl
+dnl If it does, then arrange to use gettimeofday and localtime only via
+dnl the wrapper functions that work around the problem.
+
+AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER],
+[
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H])
+
+ AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer],
+ [gl_cv_func_gettimeofday_clobber],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <string.h>
+ #include <sys/time.h>
+ #include <time.h>
+ #include <stdlib.h>
+ ]],
+ [[
+ time_t t = 0;
+ struct tm *lt;
+ struct tm saved_lt;
+ struct timeval tv;
+ lt = localtime (&t);
+ saved_lt = *lt;
+ gettimeofday (&tv, NULL);
+ return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0;
+ ]])],
+ [gl_cv_func_gettimeofday_clobber=no],
+ [gl_cv_func_gettimeofday_clobber=yes],
+ dnl When crosscompiling, assume it is broken.
+ [gl_cv_func_gettimeofday_clobber=yes])])
+
+ if test $gl_cv_func_gettimeofday_clobber = yes; then
+ REPLACE_GETTIMEOFDAY=1
+ gl_GETTIMEOFDAY_REPLACE_LOCALTIME
+ AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], [1],
+ [Define if gettimeofday clobbers the localtime buffer.])
+ fi
+])
+
+AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [
+ AC_LIBOBJ([gettimeofday])
+ gl_PREREQ_GETTIMEOFDAY
+ AC_DEFINE([gmtime], [rpl_gmtime],
+ [Define to rpl_gmtime if the replacement function should be used.])
+ AC_DEFINE([localtime], [rpl_localtime],
+ [Define to rpl_localtime if the replacement function should be used.])
+])
+
+# Prerequisites of lib/gettimeofday.c.
+AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [
+ AC_CHECK_HEADERS([sys/timeb.h])
+ AC_CHECK_FUNCS([_ftime])
+])
diff --git a/gnulib/m4/getugroups.m4 b/gnulib/m4/getugroups.m4
new file mode 100644
index 00000000..aea200e9
--- /dev/null
+++ b/gnulib/m4/getugroups.m4
@@ -0,0 +1,12 @@
+# getugroups.m4 serial 8
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_GETUGROUPS],
+[
+ AC_LIBOBJ([getugroups])
+ AC_CHECK_HEADERS_ONCE([grp.h])
+])
diff --git a/gnulib/m4/getusershell.m4 b/gnulib/m4/getusershell.m4
new file mode 100644
index 00000000..fa13e868
--- /dev/null
+++ b/gnulib/m4/getusershell.m4
@@ -0,0 +1,18 @@
+# getusershell.m4 serial 5
+dnl Copyright (C) 2002-2003, 2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_GETUSERSHELL],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade glibc <unistd.h> to declare {get,set,end}usershell().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REPLACE_FUNCS([getusershell])
+ if test $ac_cv_func_getusershell = no; then
+ HAVE_GETUSERSHELL=0
+ fi
+])
diff --git a/gnulib/m4/gl_list.m4 b/gnulib/m4/gl_list.m4
new file mode 100644
index 00000000..d1306967
--- /dev/null
+++ b/gnulib/m4/gl_list.m4
@@ -0,0 +1,10 @@
+# gl_list.m4 serial 2
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_LIST],
+[
+ AC_REQUIRE([gl_INLINE])
+])
diff --git a/gnulib/m4/glibc2.m4 b/gnulib/m4/glibc2.m4
new file mode 100644
index 00000000..f148c12c
--- /dev/null
+++ b/gnulib/m4/glibc2.m4
@@ -0,0 +1,30 @@
+# glibc2.m4 serial 2
+dnl Copyright (C) 2000-2002, 2004, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.0 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gt_GLIBC2],
+ [
+ AC_CACHE_CHECK([whether we are using the GNU C Library 2 or newer],
+ [ac_cv_gnu_library_2],
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [ac_cv_gnu_library_2=yes],
+ [ac_cv_gnu_library_2=no])
+ ]
+ )
+ AC_SUBST([GLIBC2])
+ GLIBC2="$ac_cv_gnu_library_2"
+ ]
+)
diff --git a/gnulib/m4/glibc21.m4 b/gnulib/m4/glibc21.m4
new file mode 100644
index 00000000..68ada9d4
--- /dev/null
+++ b/gnulib/m4/glibc21.m4
@@ -0,0 +1,30 @@
+# glibc21.m4 serial 4
+dnl Copyright (C) 2000-2002, 2004, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gl_GLIBC21],
+ [
+ AC_CACHE_CHECK([whether we are using the GNU C Library 2.1 or newer],
+ [ac_cv_gnu_library_2_1],
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [ac_cv_gnu_library_2_1=yes],
+ [ac_cv_gnu_library_2_1=no])
+ ]
+ )
+ AC_SUBST([GLIBC21])
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
diff --git a/gnulib/m4/glob.m4 b/gnulib/m4/glob.m4
new file mode 100644
index 00000000..545c37c6
--- /dev/null
+++ b/gnulib/m4/glob.m4
@@ -0,0 +1,86 @@
+# glob.m4 serial 10
+dnl Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# The glob module assumes you want GNU glob, with glob_pattern_p etc,
+# rather than vanilla POSIX glob. This means your code should
+# always include <glob.h> for the glob prototypes.
+
+AC_DEFUN([gl_GLOB_SUBSTITUTE],
+[
+ gl_PREREQ_GLOB
+
+ GLOB_H=glob.h
+ AC_LIBOBJ([glob])
+ AC_SUBST([GLOB_H])
+])
+
+AC_DEFUN([gl_GLOB],
+[ GLOB_H=
+ AC_CHECK_HEADERS([glob.h], [], [GLOB_H=glob.h])
+
+ if test -z "$GLOB_H"; then
+ AC_CACHE_CHECK([for GNU glob interface version 1],
+ [gl_cv_gnu_glob_interface_version_1],
+[ AC_COMPILE_IFELSE(
+[[#include <gnu-versions.h>
+char a[_GNU_GLOB_INTERFACE_VERSION == 1 ? 1 : -1];]],
+ [gl_cv_gnu_glob_interface_version_1=yes],
+ [gl_cv_gnu_glob_interface_version_1=no])])
+
+ if test "$gl_cv_gnu_glob_interface_version_1" = "no"; then
+ GLOB_H=glob.h
+ fi
+ fi
+
+ if test -z "$GLOB_H"; then
+ AC_CACHE_CHECK([whether glob lists broken symlinks],
+ [gl_cv_glob_lists_symlinks],
+[ if ln -s conf-doesntexist conf$$-globtest 2>/dev/null; then
+ gl_cv_glob_lists_symlinks=maybe
+ else
+ # If we can't make a symlink, then we cannot test this issue. Be
+ # pessimistic about this.
+ gl_cv_glob_lists_symlinks=no
+ fi
+
+ if test $gl_cv_glob_lists_symlinks = maybe; then
+ AC_RUN_IFELSE(
+AC_LANG_PROGRAM(
+[[#include <stddef.h>
+#include <glob.h>]],
+[[glob_t found;
+if (glob ("conf*-globtest", 0, NULL, &found) == GLOB_NOMATCH) return 1;]]),
+ [gl_cv_glob_lists_symlinks=yes],
+ [gl_cv_glob_lists_symlinks=no], [gl_cv_glob_lists_symlinks=no])
+ fi])
+
+ if test $gl_cv_glob_lists_symlinks = no; then
+ GLOB_H=glob.h
+ fi
+ fi
+
+ rm -f conf$$-globtest
+
+ if test -n "$GLOB_H"; then
+ gl_GLOB_SUBSTITUTE
+ fi
+])
+
+# Prerequisites of lib/glob.*.
+AC_DEFUN([gl_PREREQ_GLOB],
+[
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_TYPE])dnl
+ AC_REQUIRE([AC_C_RESTRICT])dnl
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])dnl
+ AC_CHECK_HEADERS_ONCE([sys/cdefs.h unistd.h])dnl
+ if test $ac_cv_header_sys_cdefs_h = yes; then
+ HAVE_SYS_CDEFS_H=1
+ else
+ HAVE_SYS_CDEFS_H=0
+ fi
+ AC_SUBST([HAVE_SYS_CDEFS_H])
+ AC_CHECK_FUNCS_ONCE([fstatat getlogin_r getpwnam_r])dnl
+])
diff --git a/gnulib/m4/gnu-make.m4 b/gnulib/m4/gnu-make.m4
new file mode 100644
index 00000000..385ab3ff
--- /dev/null
+++ b/gnulib/m4/gnu-make.m4
@@ -0,0 +1,19 @@
+# Determine whether recent-enough GNU Make is being used.
+
+# Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+
+# This file 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.
+
+# Written by Paul Eggert.
+
+# Set GNU_MAKE if we are using a recent-enough version of GNU make.
+
+# Use --version AND trailing junk, because SGI Make doesn't fail on --version.
+
+AC_DEFUN([gl_GNU_MAKE],
+[
+ AM_CONDITIONAL([GNU_MAKE],
+ [${MAKE-make} --version /cannot/make/this >/dev/null 2>&1])
+])
diff --git a/gnulib/m4/gnulib-common.m4 b/gnulib/m4/gnulib-common.m4
new file mode 100644
index 00000000..80ba2633
--- /dev/null
+++ b/gnulib/m4/gnulib-common.m4
@@ -0,0 +1,142 @@
+# gnulib-common.m4 serial 13
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_COMMON
+# is expanded unconditionally through gnulib-tool magic.
+AC_DEFUN([gl_COMMON], [
+ dnl Use AC_REQUIRE here, so that the code is expanded once only.
+ AC_REQUIRE([gl_00GNULIB])
+ AC_REQUIRE([gl_COMMON_BODY])
+])
+AC_DEFUN([gl_COMMON_BODY], [
+ AH_VERBATIM([isoc99_inline],
+[/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+ the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+ earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+ __APPLE__ && __MACH__ test for MacOS X.
+ __APPLE_CC__ tests for the Apple compiler and its version.
+ __STDC_VERSION__ tests for the C99 mode. */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
+# define __GNUC_STDC_INLINE__ 1
+#endif])
+ AH_VERBATIM([unused_parameter],
+[/* Define as a marker that can be attached to declarations that might not
+ be used. This helps to reduce warnings, such as from
+ GCC -Wunused-parameter. */
+#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_UNUSED
+#endif
+/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
+ is a misnomer outside of parameter lists. */
+#define _UNUSED_PARAMETER_ _GL_UNUSED
+])
+])
+
+# gl_MODULE_INDICATOR([modulename])
+# defines a C macro indicating the presence of the given module.
+AC_DEFUN([gl_MODULE_INDICATOR],
+[
+ AC_DEFINE([GNULIB_]translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
+ [Define to 1 when using the gnulib module ]$1[.])
+])
+
+# m4_foreach_w
+# is a backport of autoconf-2.59c's m4_foreach_w.
+# Remove this macro when we can assume autoconf >= 2.60.
+m4_ifndef([m4_foreach_w],
+ [m4_define([m4_foreach_w],
+ [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])])
+
+# AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH])
+# ----------------------------------------------------
+# Backport of autoconf-2.63b's macro.
+# Remove this macro when we can assume autoconf >= 2.64.
+m4_ifndef([AS_VAR_IF],
+[m4_define([AS_VAR_IF],
+[AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])])
+
+# AC_PROG_MKDIR_P
+# is a backport of autoconf-2.60's AC_PROG_MKDIR_P, with a fix
+# for interoperability with automake-1.9.6 from autoconf-2.62.
+# Remove this macro when we can assume autoconf >= 2.62 or
+# autoconf >= 2.60 && automake >= 1.10.
+m4_ifdef([AC_PROG_MKDIR_P], [
+ dnl For automake-1.9.6 && autoconf < 2.62: Ensure MKDIR_P is AC_SUBSTed.
+ m4_define([AC_PROG_MKDIR_P],
+ m4_defn([AC_PROG_MKDIR_P])[
+ AC_SUBST([MKDIR_P])])], [
+ dnl For autoconf < 2.60: Backport of AC_PROG_MKDIR_P.
+ AC_DEFUN_ONCE([AC_PROG_MKDIR_P],
+ [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ MKDIR_P='$(mkdir_p)'
+ AC_SUBST([MKDIR_P])])])
+
+# AC_C_RESTRICT
+# This definition overrides the AC_C_RESTRICT macro from autoconf 2.60..2.61,
+# so that mixed use of GNU C and GNU C++ and mixed use of Sun C and Sun C++
+# works.
+# This definition can be removed once autoconf >= 2.62 can be assumed.
+AC_DEFUN([AC_C_RESTRICT],
+[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
+ [ac_cv_c_restrict=no
+ # The order here caters to the fact that C++ does not require restrict.
+ for ac_kw in __restrict __restrict__ _Restrict restrict; do
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[typedef int * int_ptr;
+ int foo (int_ptr $ac_kw ip) {
+ return ip[0];
+ }]],
+ [[int s[1];
+ int * $ac_kw t = s;
+ t[0] = 0;
+ return foo(t)]])],
+ [ac_cv_c_restrict=$ac_kw])
+ test "$ac_cv_c_restrict" != no && break
+ done
+ ])
+ AH_VERBATIM([restrict],
+[/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported directly. */
+#undef restrict
+/* Work around a bug in Sun C++: it does not support _Restrict, even
+ though the corresponding Sun C compiler does, which causes
+ "#define restrict _Restrict" in the previous line. Perhaps some future
+ version of Sun C++ will work with _Restrict; if so, it'll probably
+ define __RESTRICT, just as Sun C does. */
+#if defined __SUNPRO_CC && !defined __RESTRICT
+# define _Restrict
+#endif])
+ case $ac_cv_c_restrict in
+ restrict) ;;
+ no) AC_DEFINE([restrict], []) ;;
+ *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
+ esac
+])
+
+# gl_BIGENDIAN
+# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
+# Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some
+# macros invoke AC_C_BIGENDIAN with arguments.
+AC_DEFUN([gl_BIGENDIAN],
+[
+ AC_C_BIGENDIAN
+])
+
+# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
+# is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
+# output a spurious "(cached)" mark in the midst of other configure output.
+# This macro should be used instead of AC_CACHE_VAL when it is not surrounded
+# by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
+AC_DEFUN([gl_CACHE_VAL_SILENT],
+[
+ saved_as_echo_n="$as_echo_n"
+ as_echo_n=':'
+ AC_CACHE_VAL([$1], [$2])
+ as_echo_n="$saved_as_echo_n"
+])
diff --git a/gnulib/m4/gnulib-tool.m4 b/gnulib/m4/gnulib-tool.m4
new file mode 100644
index 00000000..69e7733b
--- /dev/null
+++ b/gnulib/m4/gnulib-tool.m4
@@ -0,0 +1,57 @@
+# gnulib-tool.m4 serial 2
+dnl Copyright (C) 2004-2005, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl The following macros need not be invoked explicitly.
+dnl Invoking them does nothing except to declare default arguments
+dnl for "gnulib-tool --import".
+
+dnl Usage: gl_LOCAL_DIR([DIR])
+AC_DEFUN([gl_LOCAL_DIR], [])
+
+dnl Usage: gl_MODULES([module1 module2 ...])
+AC_DEFUN([gl_MODULES], [])
+
+dnl Usage: gl_AVOID([module1 module2 ...])
+AC_DEFUN([gl_AVOID], [])
+
+dnl Usage: gl_SOURCE_BASE([DIR])
+AC_DEFUN([gl_SOURCE_BASE], [])
+
+dnl Usage: gl_M4_BASE([DIR])
+AC_DEFUN([gl_M4_BASE], [])
+
+dnl Usage: gl_PO_BASE([DIR])
+AC_DEFUN([gl_PO_BASE], [])
+
+dnl Usage: gl_DOC_BASE([DIR])
+AC_DEFUN([gl_DOC_BASE], [])
+
+dnl Usage: gl_TESTS_BASE([DIR])
+AC_DEFUN([gl_TESTS_BASE], [])
+
+dnl Usage: gl_WITH_TESTS
+AC_DEFUN([gl_WITH_TESTS], [])
+
+dnl Usage: gl_LIB([LIBNAME])
+AC_DEFUN([gl_LIB], [])
+
+dnl Usage: gl_LGPL or gl_LGPL([VERSION])
+AC_DEFUN([gl_LGPL], [])
+
+dnl Usage: gl_MAKEFILE_NAME([FILENAME])
+AC_DEFUN([gl_MAKEFILE_NAME], [])
+
+dnl Usage: gl_LIBTOOL
+AC_DEFUN([gl_LIBTOOL], [])
+
+dnl Usage: gl_MACRO_PREFIX([PREFIX])
+AC_DEFUN([gl_MACRO_PREFIX], [])
+
+dnl Usage: gl_PO_DOMAIN([DOMAIN])
+AC_DEFUN([gl_PO_DOMAIN], [])
+
+dnl Usage: gl_VC_FILES([BOOLEAN])
+AC_DEFUN([gl_VC_FILES], [])
diff --git a/gnulib/m4/group-member.m4 b/gnulib/m4/group-member.m4
new file mode 100644
index 00000000..1e3939dc
--- /dev/null
+++ b/gnulib/m4/group-member.m4
@@ -0,0 +1,28 @@
+# serial 12
+
+# Copyright (C) 1999-2001, 2003-2007, 2009-2010 Free Software Foundation, Inc.
+
+# This file 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.
+
+dnl Written by Jim Meyering
+
+AC_DEFUN([gl_FUNC_GROUP_MEMBER],
+[
+ dnl Persuade glibc <unistd.h> to declare group_member().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl Do this replacement check manually because I want the hyphen
+ dnl (not the underscore) in the filename.
+ AC_CHECK_FUNC([group_member], , [
+ AC_LIBOBJ([group-member])
+ gl_PREREQ_GROUP_MEMBER
+ ])
+])
+
+# Prerequisites of lib/group-member.c.
+AC_DEFUN([gl_PREREQ_GROUP_MEMBER],
+[
+ AC_REQUIRE([AC_FUNC_GETGROUPS])
+])
diff --git a/gnulib/m4/hard-locale.m4 b/gnulib/m4/hard-locale.m4
new file mode 100644
index 00000000..fbf9f737
--- /dev/null
+++ b/gnulib/m4/hard-locale.m4
@@ -0,0 +1,12 @@
+# hard-locale.m4 serial 7
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl No prerequisites of lib/hard-locale.c.
+AC_DEFUN([gl_HARD_LOCALE],
+[
+ AC_LIBOBJ([hard-locale])
+])
diff --git a/gnulib/m4/hash.m4 b/gnulib/m4/hash.m4
new file mode 100644
index 00000000..414a2137
--- /dev/null
+++ b/gnulib/m4/hash.m4
@@ -0,0 +1,14 @@
+# hash.m4 serial 6
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HASH],
+[
+ AC_LIBOBJ([hash])
+
+ dnl Prerequisites of lib/hash.c.
+ AC_REQUIRE([AM_STDBOOL_H])
+])
diff --git a/gnulib/m4/hmac-md5.m4 b/gnulib/m4/hmac-md5.m4
new file mode 100644
index 00000000..417b3e36
--- /dev/null
+++ b/gnulib/m4/hmac-md5.m4
@@ -0,0 +1,10 @@
+# hmac-md5.m4 serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HMAC_MD5],
+[
+ AC_LIBOBJ([hmac-md5])
+])
diff --git a/gnulib/m4/hmac-sha1.m4 b/gnulib/m4/hmac-sha1.m4
new file mode 100644
index 00000000..db51c96b
--- /dev/null
+++ b/gnulib/m4/hmac-sha1.m4
@@ -0,0 +1,10 @@
+# hmac-sha1.m4 serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HMAC_SHA1],
+[
+ AC_LIBOBJ([hmac-sha1])
+])
diff --git a/gnulib/m4/host-os.m4 b/gnulib/m4/host-os.m4
new file mode 100644
index 00000000..0f624140
--- /dev/null
+++ b/gnulib/m4/host-os.m4
@@ -0,0 +1,82 @@
+# serial 7
+
+# Copyright (C) 2001, 2003-2004, 2006, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Paul Eggert.
+
+dnl From Paul Eggert.
+
+# Define HOST_OPERATING_SYSTEM to a name for the host operating system.
+AC_DEFUN([gl_HOST_OS],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_CACHE_CHECK([host operating system],
+ gl_cv_host_operating_system,
+
+ [[case $host_os in
+
+ # These operating system names do not use the default heuristic below.
+ # They are in reverse order, so that more-specific prefixes come first.
+ winnt*) os='Windows NT';;
+ vos*) os='VOS';;
+ sysv*) os='Unix System V';;
+ superux*) os='SUPER-UX';;
+ sunos*) os='SunOS';;
+ stop*) os='STOP';;
+ sco*) os='SCO Unix';;
+ riscos*) os='RISC OS';;
+ riscix*) os='RISCiX';;
+ qnx*) os='QNX';;
+ pw32*) os='PW32';;
+ ptx*) os='ptx';;
+ plan9*) os='Plan 9';;
+ osf*) os='Tru64';;
+ os2*) os='OS/2';;
+ openbsd*) os='OpenBSD';;
+ nsk*) os='NonStop Kernel';;
+ nonstopux*) os='NonStop-UX';;
+ netbsd*-gnu*) os='GNU/NetBSD';; # NetBSD kernel+libc, GNU userland
+ netbsd*) os='NetBSD';;
+ knetbsd*-gnu) os='GNU/kNetBSD';; # NetBSD kernel, GNU libc+userland
+ kfreebsd*-gnu) os='GNU/kFreeBSD';; # FreeBSD kernel, GNU libc+userland
+ msdosdjgpp*) os='DJGPP';;
+ mpeix*) os='MPE/iX';;
+ mint*) os='MiNT';;
+ mingw*) os='MinGW';;
+ lynxos*) os='LynxOS';;
+ linux*) os='GNU/Linux';;
+ hpux*) os='HP-UX';;
+ hiux*) os='HI-UX';;
+ gnu*) os='GNU';;
+ freebsd*) os='FreeBSD';;
+ dgux*) os='DG/UX';;
+ bsdi*) os='BSD/OS';;
+ bsd*) os='BSD';;
+ beos*) os='BeOS';;
+ aux*) os='A/UX';;
+ atheos*) os='AtheOS';;
+ amigaos*) os='Amiga OS';;
+ aix*) os='AIX';;
+
+ # The default heuristic takes the initial alphabetic string
+ # from $host_os, but capitalizes its first letter.
+ [A-Za-z]*)
+ os=`
+ expr "X$host_os" : 'X\([A-Za-z]\)' | tr '[a-z]' '[A-Z]'
+ ``
+ expr "X$host_os" : 'X.\([A-Za-z]*\)'
+ `
+ ;;
+
+ # If $host_os does not start with an alphabetic string, use it unchanged.
+ *)
+ os=$host_os;;
+ esac
+ gl_cv_host_operating_system=$os]])
+ AC_DEFINE_UNQUOTED([HOST_OPERATING_SYSTEM],
+ "$gl_cv_host_operating_system",
+ [The host operating system.])
+])
diff --git a/gnulib/m4/hostent.m4 b/gnulib/m4/hostent.m4
new file mode 100644
index 00000000..11110411
--- /dev/null
+++ b/gnulib/m4/hostent.m4
@@ -0,0 +1,45 @@
+# hostent.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HOSTENT],
+[
+ dnl Where are gethostent(), sethostent(), endhostent(), gethostbyname(),
+ dnl gethostbyaddr() defined?
+ dnl - On Solaris, they are in libnsl. Ignore libxnet.
+ dnl - On Haiku, they are in libnetwork.
+ dnl - On BeOS, they are in libnet.
+ dnl - On native Windows, they are in ws2_32.dll.
+ dnl - Otherwise they are in libc.
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ HOSTENT_LIB=
+ gl_saved_libs="$LIBS"
+ AC_SEARCH_LIBS([gethostbyname], [nsl network net],
+ [if test "$ac_cv_search_gethostbyname" != "none required"; then
+ HOSTENT_LIB="$ac_cv_search_gethostbyname"
+ fi])
+ LIBS="$gl_saved_libs"
+ if test -z "$HOSTENT_LIB"; then
+ AC_CHECK_FUNCS([gethostbyname], , [
+ AC_CACHE_CHECK([for gethostbyname in winsock2.h and -lws2_32],
+ [gl_cv_w32_gethostbyname],
+ [gl_cv_w32_gethostbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_TRY_LINK([
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+], [gethostbyname(NULL);], [gl_cv_w32_gethostbyname=yes])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_w32_gethostbyname" = "yes"; then
+ HOSTENT_LIB="-lws2_32"
+ fi
+ ])
+ fi
+ AC_SUBST([HOSTENT_LIB])
+])
diff --git a/gnulib/m4/human.m4 b/gnulib/m4/human.m4
new file mode 100644
index 00000000..eda47da5
--- /dev/null
+++ b/gnulib/m4/human.m4
@@ -0,0 +1,14 @@
+#serial 10
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HUMAN],
+[
+ AC_LIBOBJ([human])
+
+ dnl Prerequisites of lib/human.c.
+ :
+])
diff --git a/gnulib/m4/i-ring.m4 b/gnulib/m4/i-ring.m4
new file mode 100644
index 00000000..57b04228
--- /dev/null
+++ b/gnulib/m4/i-ring.m4
@@ -0,0 +1,10 @@
+# serial 1
+dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_I_RING],
+[
+ AC_LIBOBJ([i-ring])
+])
diff --git a/gnulib/m4/iconv.m4 b/gnulib/m4/iconv.m4
new file mode 100644
index 00000000..f46ff142
--- /dev/null
+++ b/gnulib/m4/iconv.m4
@@ -0,0 +1,199 @@
+# iconv.m4 serial 9 (gettext-0.18)
+dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+ dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed libiconv and not disabled its use
+ dnl via --without-libiconv-prefix, he wants to use it. The first
+ dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+ am_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+ AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ [am_cv_func_iconv=yes])
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ [am_cv_lib_iconv=yes]
+ [am_cv_func_iconv=yes])
+ LIBS="$am_save_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+ dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10.
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ AC_TRY_RUN([
+#include <iconv.h>
+#include <string.h>
+int main ()
+{
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static const char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ return 1;
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static const char input[] = "\263";
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ return 1;
+ }
+ }
+#if 0 /* This bug could be worked around by the caller. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ return 1;
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+ /* Try HP-UX names. */
+ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+ return 1;
+ return 0;
+}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no],
+ [case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac])
+ LIBS="$am_save_LIBS"
+ ])
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+ AC_DEFINE([HAVE_ICONV], [1],
+ [Define if you have the iconv() function and it works.])
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ AC_MSG_CHECKING([how to link with libiconv])
+ AC_MSG_RESULT([$LIBICONV])
+ else
+ dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+ dnl either.
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+ AC_SUBST([LIBICONV])
+ AC_SUBST([LTLIBICONV])
+])
+
+AC_DEFUN([AM_ICONV],
+[
+ AM_ICONV_LINK
+ if test "$am_cv_func_iconv" = yes; then
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL([am_cv_proto_iconv], [
+ AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"])
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+ am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ AC_MSG_RESULT([
+ $am_cv_proto_iconv])
+ AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
+ [Define as const if the declaration of iconv() needs const.])
+ fi
+])
diff --git a/gnulib/m4/iconv_h.m4 b/gnulib/m4/iconv_h.m4
new file mode 100644
index 00000000..8881473a
--- /dev/null
+++ b/gnulib/m4/iconv_h.m4
@@ -0,0 +1,37 @@
+# iconv_h.m4 serial 5
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ICONV_H],
+[
+ AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+
+ dnl Execute this unconditionally, because ICONV_H may be set by other
+ dnl modules, after this code is executed.
+ gl_CHECK_NEXT_HEADERS([iconv.h])
+])
+
+dnl Unconditionally enables the replacement of <iconv.h>.
+AC_DEFUN([gl_REPLACE_ICONV_H],
+[
+ AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ ICONV_H='iconv.h'
+])
+
+AC_DEFUN([gl_ICONV_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_ICONV_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ REPLACE_ICONV=0; AC_SUBST([REPLACE_ICONV])
+ REPLACE_ICONV_OPEN=0; AC_SUBST([REPLACE_ICONV_OPEN])
+ REPLACE_ICONV_UTF=0; AC_SUBST([REPLACE_ICONV_UTF])
+ ICONV_H=''; AC_SUBST([ICONV_H])
+])
diff --git a/gnulib/m4/iconv_open.m4 b/gnulib/m4/iconv_open.m4
new file mode 100644
index 00000000..d6f44fb3
--- /dev/null
+++ b/gnulib/m4/iconv_open.m4
@@ -0,0 +1,238 @@
+# iconv_open.m4 serial 6
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ICONV_OPEN],
+[
+ AC_REQUIRE([AM_ICONV])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ if test "$am_cv_func_iconv" = yes; then
+ dnl Test whether iconv_open accepts standardized encoding names.
+ dnl We know that GNU libiconv and GNU libc do.
+ AC_EGREP_CPP([gnu_iconv], [
+ #include <iconv.h>
+ #if defined _LIBICONV_VERSION || defined __GLIBC__
+ gnu_iconv
+ #endif
+ ], [gl_func_iconv_gnu=yes], [gl_func_iconv_gnu=no])
+ if test $gl_func_iconv_gnu = no; then
+ iconv_flavor=
+ case "$host_os" in
+ aix*) iconv_flavor=ICONV_FLAVOR_AIX ;;
+ irix*) iconv_flavor=ICONV_FLAVOR_IRIX ;;
+ hpux*) iconv_flavor=ICONV_FLAVOR_HPUX ;;
+ osf*) iconv_flavor=ICONV_FLAVOR_OSF ;;
+ solaris*) iconv_flavor=ICONV_FLAVOR_SOLARIS ;;
+ esac
+ if test -n "$iconv_flavor"; then
+ AC_DEFINE_UNQUOTED([ICONV_FLAVOR], [$iconv_flavor],
+ [Define to a symbolic name denoting the flavor of iconv_open()
+ implementation.])
+ gl_REPLACE_ICONV_OPEN
+ fi
+ fi
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_ICONV_OPEN],
+[
+ gl_REPLACE_ICONV_H
+ REPLACE_ICONV_OPEN=1
+ AC_LIBOBJ([iconv_open])
+])
+
+AC_DEFUN([gl_FUNC_ICONV_OPEN_UTF],
+[
+ AC_REQUIRE([gl_FUNC_ICONV_OPEN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ if test "$am_cv_func_iconv" = yes; then
+ if test -n "$am_cv_proto_iconv_arg1"; then
+ ICONV_CONST="const"
+ else
+ ICONV_CONST=
+ fi
+ AC_SUBST([ICONV_CONST])
+ AC_CACHE_CHECK([whether iconv supports conversion between UTF-8 and UTF-{16,32}{BE,LE}],
+ [gl_cv_func_iconv_supports_utf],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_RUN([
+#include <iconv.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define ASSERT(expr) if (!(expr)) return 1;
+int main ()
+{
+ /* Test conversion from UTF-8 to UTF-16BE with no errors. */
+ {
+ static const char input[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ static const char expected[] =
+ "\000J\000a\000p\000a\000n\000e\000s\000e\000 \000(\145\345\147\054\212\236\000)\000 \000[\330\065\335\015\330\065\335\036\330\065\335\055\000]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+ cd = iconv_open ("UTF-16BE", "UTF-8");
+ ASSERT (cd != (iconv_t)(-1));
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+ ASSERT (iconv_close (cd) == 0);
+ }
+ /* Test conversion from UTF-8 to UTF-16LE with no errors. */
+ {
+ static const char input[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ static const char expected[] =
+ "J\000a\000p\000a\000n\000e\000s\000e\000 \000(\000\345\145\054\147\236\212)\000 \000[\000\065\330\015\335\065\330\036\335\065\330\055\335]\000";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+ cd = iconv_open ("UTF-16LE", "UTF-8");
+ ASSERT (cd != (iconv_t)(-1));
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+ ASSERT (iconv_close (cd) == 0);
+ }
+ /* Test conversion from UTF-8 to UTF-32BE with no errors. */
+ {
+ static const char input[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ static const char expected[] =
+ "\000\000\000J\000\000\000a\000\000\000p\000\000\000a\000\000\000n\000\000\000e\000\000\000s\000\000\000e\000\000\000 \000\000\000(\000\000\145\345\000\000\147\054\000\000\212\236\000\000\000)\000\000\000 \000\000\000[\000\001\325\015\000\001\325\036\000\001\325\055\000\000\000]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+ cd = iconv_open ("UTF-32BE", "UTF-8");
+ ASSERT (cd != (iconv_t)(-1));
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+ ASSERT (iconv_close (cd) == 0);
+ }
+ /* Test conversion from UTF-8 to UTF-32LE with no errors. */
+ {
+ static const char input[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ static const char expected[] =
+ "J\000\000\000a\000\000\000p\000\000\000a\000\000\000n\000\000\000e\000\000\000s\000\000\000e\000\000\000 \000\000\000(\000\000\000\345\145\000\000\054\147\000\000\236\212\000\000)\000\000\000 \000\000\000[\000\000\000\015\325\001\000\036\325\001\000\055\325\001\000]\000\000\000";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+ cd = iconv_open ("UTF-32LE", "UTF-8");
+ ASSERT (cd != (iconv_t)(-1));
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+ ASSERT (iconv_close (cd) == 0);
+ }
+ /* Test conversion from UTF-16BE to UTF-8 with no errors.
+ This test fails on NetBSD 3.0. */
+ {
+ static const char input[] =
+ "\000J\000a\000p\000a\000n\000e\000s\000e\000 \000(\145\345\147\054\212\236\000)\000 \000[\330\065\335\015\330\065\335\036\330\065\335\055\000]";
+ static const char expected[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+ cd = iconv_open ("UTF-8", "UTF-16BE");
+ ASSERT (cd != (iconv_t)(-1));
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+ ASSERT (iconv_close (cd) == 0);
+ }
+ return 0;
+}], [gl_cv_func_iconv_supports_utf=yes], [gl_cv_func_iconv_supports_utf=no],
+ [
+ dnl We know that GNU libiconv, GNU libc, and Solaris >= 9 do.
+ dnl OSF/1 5.1 has these encodings, but inserts a BOM in the "to"
+ dnl direction.
+ gl_cv_func_iconv_supports_utf=no
+ if test $gl_func_iconv_gnu = yes; then
+ gl_cv_func_iconv_supports_utf=yes
+ else
+changequote(,)dnl
+ case "$host_os" in
+ solaris2.9 | solaris2.1[0-9]) gl_cv_func_iconv_supports_utf=yes ;;
+ esac
+changequote([,])dnl
+ fi
+ ])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_iconv_supports_utf = no; then
+ REPLACE_ICONV_UTF=1
+ AC_DEFINE([REPLACE_ICONV_UTF], [1],
+ [Define if the iconv() functions are enhanced to handle the UTF-{16,32}{BE,LE} encodings.])
+ REPLACE_ICONV=1
+ gl_REPLACE_ICONV_OPEN
+ AC_LIBOBJ([iconv])
+ AC_LIBOBJ([iconv_close])
+ fi
+ fi
+])
diff --git a/gnulib/m4/idcache.m4 b/gnulib/m4/idcache.m4
new file mode 100644
index 00000000..caf6905d
--- /dev/null
+++ b/gnulib/m4/idcache.m4
@@ -0,0 +1,11 @@
+# idcache.m4 serial 6
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_IDCACHE],
+[
+ AC_LIBOBJ([idcache])
+])
diff --git a/gnulib/m4/idpriv.m4 b/gnulib/m4/idpriv.m4
new file mode 100644
index 00000000..db99c0f2
--- /dev/null
+++ b/gnulib/m4/idpriv.m4
@@ -0,0 +1,14 @@
+# idpriv.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_IDPRIV],
+[
+ dnl Persuade glibc <unistd.h> to declare {get,set}res{uid,gid}.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([getuid geteuid getresuid getgid getegid getresgid])
+ AC_CHECK_FUNCS_ONCE([setresuid setreuid seteuid setresgid setregid setegid])
+])
diff --git a/gnulib/m4/imaxabs.m4 b/gnulib/m4/imaxabs.m4
new file mode 100644
index 00000000..fa1331ec
--- /dev/null
+++ b/gnulib/m4/imaxabs.m4
@@ -0,0 +1,17 @@
+# imaxabs.m4 serial 1
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_IMAXABS],
+[
+ AC_REQUIRE([gl_INTTYPES_H])
+ if test "$ac_cv_have_decl_imaxabs" != yes; then
+ AC_LIBOBJ([imaxabs])
+ gl_PREREQ_IMAXABS
+ fi
+])
+
+# Prerequisites of lib/imaxabs.c.
+AC_DEFUN([gl_PREREQ_IMAXABS], [:])
diff --git a/gnulib/m4/imaxdiv.m4 b/gnulib/m4/imaxdiv.m4
new file mode 100644
index 00000000..a574dcb1
--- /dev/null
+++ b/gnulib/m4/imaxdiv.m4
@@ -0,0 +1,17 @@
+# imaxdiv.m4 serial 1
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_IMAXDIV],
+[
+ AC_REQUIRE([gl_INTTYPES_H])
+ if test "$ac_cv_have_decl_imaxdiv" != yes; then
+ AC_LIBOBJ([imaxdiv])
+ gl_PREREQ_IMAXDIV
+ fi
+])
+
+# Prerequisites of lib/imaxdiv.c.
+AC_DEFUN([gl_PREREQ_IMAXDIV], [:])
diff --git a/gnulib/m4/include_next.m4 b/gnulib/m4/include_next.m4
new file mode 100644
index 00000000..c7e0672f
--- /dev/null
+++ b/gnulib/m4/include_next.m4
@@ -0,0 +1,187 @@
+# include_next.m4 serial 14
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert and Derek Price.
+
+dnl Sets INCLUDE_NEXT and PRAGMA_SYSTEM_HEADER.
+dnl
+dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to
+dnl 'include' otherwise.
+dnl
+dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler
+dnl supports it in the special case that it is the first include directive in
+dnl the given file, or to 'include' otherwise.
+dnl
+dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next,
+dnl so as to avoid GCC warnings when the gcc option -pedantic is used.
+dnl '#pragma GCC system_header' has the same effect as if the file was found
+dnl through the include search path specified with '-isystem' options (as
+dnl opposed to the search path specified with '-I' options). Namely, gcc
+dnl does not warn about some things, and on some systems (Solaris and Interix)
+dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side
+dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead
+dnl of plain '__STDC__'.
+
+AC_DEFUN([gl_INCLUDE_NEXT],
+[
+ AC_LANG_PREPROC_REQUIRE()
+ AC_CACHE_CHECK([whether the preprocessor supports include_next],
+ [gl_cv_have_include_next],
+ [rm -rf conftestd1a conftestd1b conftestd2
+ mkdir conftestd1a conftestd1b conftestd2
+ dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on
+ dnl AIX 6.1 support include_next when used as first preprocessor directive
+ dnl in a file, but not when preceded by another include directive. Check
+ dnl for this bug by including <stdio.h>.
+ dnl Additionally, with this same compiler, include_next is a no-op when
+ dnl used in a header file that was included by specifying its absolute
+ dnl file name. Despite these two bugs, include_next is used in the
+ dnl compiler's <math.h>. By virtue of the second bug, we need to use
+ dnl include_next as well in this case.
+ cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+ gl_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+ AC_COMPILE_IFELSE([#include <conftest.h>],
+ [gl_cv_have_include_next=yes],
+ [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+ AC_COMPILE_IFELSE([#include <conftest.h>],
+ [gl_cv_have_include_next=buggy],
+ [gl_cv_have_include_next=no])
+ ])
+ CPPFLAGS="$gl_save_CPPFLAGS"
+ rm -rf conftestd1a conftestd1b conftestd2
+ ])
+ PRAGMA_SYSTEM_HEADER=
+ if test $gl_cv_have_include_next = yes; then
+ INCLUDE_NEXT=include_next
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ if test -n "$GCC"; then
+ PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+ fi
+ else
+ if test $gl_cv_have_include_next = buggy; then
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ else
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+ fi
+ fi
+ AC_SUBST([INCLUDE_NEXT])
+ AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
+ AC_SUBST([PRAGMA_SYSTEM_HEADER])
+])
+
+# gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------------
+# For each arg foo.h, if #include_next works, define NEXT_FOO_H to be
+# '<foo.h>'; otherwise define it to be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# Also, if #include_next works as first preprocessing directive in a file,
+# define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to
+# be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# That way, a header file with the following line:
+# #@INCLUDE_NEXT@ @NEXT_FOO_H@
+# or
+# #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@
+# behaves (after sed substitution) as if it contained
+# #include_next <foo.h>
+# even if the compiler does not support include_next.
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use `""', not `<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+AC_DEFUN([gl_CHECK_NEXT_HEADERS],
+[
+ AC_REQUIRE([gl_INCLUDE_NEXT])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_HEADERS_ONCE([$1])
+
+ m4_foreach_w([gl_HEADER_NAME], [$1],
+ [AS_VAR_PUSHDEF([gl_next_header],
+ [gl_cv_next_]m4_defn([gl_HEADER_NAME]))
+ if test $gl_cv_have_include_next = yes; then
+ AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
+ else
+ AC_CACHE_CHECK(
+ [absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+ m4_defn([gl_next_header]),
+ [AS_VAR_PUSHDEF([gl_header_exists],
+ [ac_cv_header_]m4_defn([gl_HEADER_NAME]))
+ if test AS_VAR_GET(gl_header_exists) = yes; then
+ AC_LANG_CONFTEST(
+ [AC_LANG_SOURCE(
+ [[#include <]]m4_dquote(m4_defn([gl_HEADER_NAME]))[[>]]
+ )])
+ dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
+ dnl that contain only a #include of other header files and no
+ dnl non-comment tokens of their own. This leads to a failure to
+ dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
+ dnl and others. The workaround is to force preservation of comments
+ dnl through option -C. This ensures all necessary #line directives
+ dnl are present. GCC supports option -C as well.
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+ dnl eval is necessary to expand gl_absname_cpp.
+ dnl Ultrix and Pyramid sh refuse to redirect output of eval,
+ dnl so use subshell.
+ AS_VAR_SET([gl_next_header],
+ ['"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
+ sed -n '\#/]m4_defn([gl_HEADER_NAME])[#{
+ s#.*"\(.*/]m4_defn([gl_HEADER_NAME])[\)".*#\1#
+ s#^/[^/]#//&#
+ p
+ q
+ }'`'"'])
+ else
+ AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
+ fi
+ AS_VAR_POPDEF([gl_header_exists])])
+ fi
+ AC_SUBST(
+ AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
+ [AS_VAR_GET([gl_next_header])])
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'gl_HEADER_NAME'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=AS_VAR_GET([gl_next_header])
+ fi
+ AC_SUBST(
+ AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
+ [$gl_next_as_first_directive])
+ AS_VAR_POPDEF([gl_next_header])])
+])
diff --git a/gnulib/m4/inet_ntop.m4 b/gnulib/m4/inet_ntop.m4
new file mode 100644
index 00000000..20e8d7c5
--- /dev/null
+++ b/gnulib/m4/inet_ntop.m4
@@ -0,0 +1,38 @@
+# inet_ntop.m4 serial 11
+dnl Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_INET_NTOP],
+[
+ dnl Persuade Solaris <arpa/inet.h> to declare inet_ntop.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ gl_REPLACE_ARPA_INET_H
+
+ dnl Most platforms that provide inet_ntop define it in libc.
+ dnl Solaris 8..10 provide inet_ntop in libnsl instead.
+ gl_save_LIBS=$LIBS
+ AC_SEARCH_LIBS([inet_ntop], [nsl], [],
+ [AC_REPLACE_FUNCS([inet_ntop])])
+ LIBS=$gl_save_LIBS
+ INET_NTOP_LIB=
+ if test "$ac_cv_search_inet_ntop" != "no" &&
+ test "$ac_cv_search_inet_ntop" != "none required"; then
+ INET_NTOP_LIB="$ac_cv_search_inet_ntop"
+ fi
+ AC_SUBST([INET_NTOP_LIB])
+
+ gl_PREREQ_INET_NTOP
+])
+
+# Prerequisites of lib/inet_ntop.c.
+AC_DEFUN([gl_PREREQ_INET_NTOP], [
+ AC_CHECK_DECLS([inet_ntop],,,[#include <arpa/inet.h>])
+ if test $ac_cv_have_decl_inet_ntop = no; then
+ HAVE_DECL_INET_NTOP=0
+ fi
+ AC_REQUIRE([gl_SOCKET_FAMILIES])
+ AC_REQUIRE([AC_C_RESTRICT])
+])
diff --git a/gnulib/m4/inet_pton.m4 b/gnulib/m4/inet_pton.m4
new file mode 100644
index 00000000..e0b79424
--- /dev/null
+++ b/gnulib/m4/inet_pton.m4
@@ -0,0 +1,38 @@
+# inet_pton.m4 serial 9
+dnl Copyright (C) 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_INET_PTON],
+[
+ dnl Persuade Solaris <arpa/inet.h> to declare inet_pton.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ gl_REPLACE_ARPA_INET_H
+
+ dnl Most platforms that provide inet_pton define it in libc.
+ dnl Solaris 8..10 provide inet_pton in libnsl instead.
+ gl_save_LIBS=$LIBS
+ AC_SEARCH_LIBS([inet_pton], [nsl], [],
+ [AC_REPLACE_FUNCS([inet_pton])])
+ LIBS=$gl_save_LIBS
+ INET_PTON_LIB=
+ if test "$ac_cv_search_inet_pton" != "no" &&
+ test "$ac_cv_search_inet_pton" != "none required"; then
+ INET_PTON_LIB="$ac_cv_search_inet_pton"
+ fi
+ AC_SUBST([INET_PTON_LIB])
+
+ gl_PREREQ_INET_PTON
+])
+
+# Prerequisites of lib/inet_pton.c.
+AC_DEFUN([gl_PREREQ_INET_PTON], [
+ AC_CHECK_DECLS([inet_pton],,,[#include <arpa/inet.h>])
+ if test $ac_cv_have_decl_inet_pton = no; then
+ HAVE_DECL_INET_PTON=0
+ fi
+ AC_REQUIRE([gl_SOCKET_FAMILIES])
+ AC_REQUIRE([AC_C_RESTRICT])
+])
diff --git a/gnulib/m4/inline.m4 b/gnulib/m4/inline.m4
new file mode 100644
index 00000000..4ef768de
--- /dev/null
+++ b/gnulib/m4/inline.m4
@@ -0,0 +1,40 @@
+# inline.m4 serial 4
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Test for the 'inline' keyword or equivalent.
+dnl Define 'inline' to a supported equivalent, or to nothing if not supported,
+dnl like AC_C_INLINE does. Also, define HAVE_INLINE if 'inline' or an
+dnl equivalent is effectively supported, i.e. if the compiler is likely to
+dnl drop unused 'static inline' functions.
+AC_DEFUN([gl_INLINE],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_CACHE_CHECK([whether the compiler generally respects inline],
+ [gl_cv_c_inline_effective],
+ [if test $ac_cv_c_inline = no; then
+ gl_cv_c_inline_effective=no
+ else
+ dnl GCC defines __NO_INLINE__ if not optimizing or if -fno-inline is
+ dnl specified.
+ dnl Use AC_COMPILE_IFELSE here, not AC_EGREP_CPP, because the result
+ dnl depends on optimization flags, which can be in CFLAGS.
+ dnl (AC_EGREP_CPP looks only at the CPPFLAGS.)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]],
+ [[#ifdef __NO_INLINE__
+ #error "inline is not effective"
+ #endif]])],
+ [gl_cv_c_inline_effective=yes],
+ [gl_cv_c_inline_effective=no])
+ fi
+ ])
+ if test $gl_cv_c_inline_effective = yes; then
+ AC_DEFINE([HAVE_INLINE], [1],
+ [Define to 1 if the compiler supports one of the keywords
+ 'inline', '__inline__', '__inline' and effectively inlines
+ functions marked as such.])
+ fi
+])
diff --git a/gnulib/m4/intdiv0.m4 b/gnulib/m4/intdiv0.m4
new file mode 100644
index 00000000..289c4df5
--- /dev/null
+++ b/gnulib/m4/intdiv0.m4
@@ -0,0 +1,84 @@
+# intdiv0.m4 serial 3 (gettext-0.18)
+dnl Copyright (C) 2002, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+ AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+ gt_cv_int_divbyzero_sigfpe,
+ [
+ gt_cv_int_divbyzero_sigfpe=
+changequote(,)dnl
+ case "$host_os" in
+ macos* | darwin[6-9]* | darwin[1-9][0-9]*)
+ # On MacOS X 10.2 or newer, just assume the same as when cross-
+ # compiling. If we were to perform the real test, 1 Crash Report
+ # dialog window would pop up.
+ case "$host_cpu" in
+ i[34567]86 | x86_64)
+ gt_cv_int_divbyzero_sigfpe="guessing yes" ;;
+ esac
+ ;;
+ esac
+changequote([,])dnl
+ if test -z "$gt_cv_int_divbyzero_sigfpe"; then
+ AC_TRY_RUN([
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+sigfpe_handler (int sig)
+{
+ /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */
+ exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+ signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+ signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL. */
+#if defined (__sparc__) && defined (__linux__)
+ signal (SIGILL, sigfpe_handler);
+#endif
+
+ z = x / y;
+ nan = y / y;
+ exit (1);
+}
+], [gt_cv_int_divbyzero_sigfpe=yes], [gt_cv_int_divbyzero_sigfpe=no],
+ [
+ # Guess based on the CPU.
+changequote(,)dnl
+ case "$host_cpu" in
+ alpha* | i[34567]86 | x86_64 | m68k | s390*)
+ gt_cv_int_divbyzero_sigfpe="guessing yes";;
+ *)
+ gt_cv_int_divbyzero_sigfpe="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ fi
+ ])
+ case "$gt_cv_int_divbyzero_sigfpe" in
+ *yes) value=1;;
+ *) value=0;;
+ esac
+ AC_DEFINE_UNQUOTED([INTDIV0_RAISES_SIGFPE], [$value],
+ [Define if integer division by zero raises signal SIGFPE.])
+])
diff --git a/gnulib/m4/intl.m4 b/gnulib/m4/intl.m4
new file mode 100644
index 00000000..5e17fea9
--- /dev/null
+++ b/gnulib/m4/intl.m4
@@ -0,0 +1,285 @@
+# intl.m4 serial 8 (gettext-0.17)
+dnl Copyright (C) 1995-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006.
+
+AC_PREREQ(2.52)
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_REQUIRE([gt_GLIBC2])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([gl_VISIBILITY])dnl
+ AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl
+ AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
+ AC_REQUIRE([gt_TYPE_WINT_T])dnl
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gt_TYPE_INTMAX_T])
+ AC_REQUIRE([gt_PRINTF_POSIX])
+ AC_REQUIRE([gl_GLIBC21])dnl
+ AC_REQUIRE([gl_XSIZE])dnl
+ AC_REQUIRE([gt_INTL_MACOSX])dnl
+
+ AC_CHECK_TYPE([ptrdiff_t], ,
+ [AC_DEFINE([ptrdiff_t], [long],
+ [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+ ])
+ AC_CHECK_HEADERS([stddef.h stdlib.h string.h])
+ AC_CHECK_FUNCS([asprintf fwprintf putenv setenv setlocale snprintf wcslen])
+
+ dnl Use the _snprintf function only if it is declared (because on NetBSD it
+ dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+ gt_CHECK_DECL(_snprintf, [#include <stdio.h>])
+ gt_CHECK_DECL(_snwprintf, [#include <stdio.h>])
+
+ dnl Use the *_unlocked functions only if they are declared.
+ dnl (because some of them were defined without being declared in Solaris
+ dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+ dnl on Solaris 2.5.1 to run on Solaris 2.6).
+ dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+ gt_CHECK_DECL(getc_unlocked, [#include <stdio.h>])
+
+ case $gt_cv_func_printf_posix in
+ *yes) HAVE_POSIX_PRINTF=1 ;;
+ *) HAVE_POSIX_PRINTF=0 ;;
+ esac
+ AC_SUBST([HAVE_POSIX_PRINTF])
+ if test "$ac_cv_func_asprintf" = yes; then
+ HAVE_ASPRINTF=1
+ else
+ HAVE_ASPRINTF=0
+ fi
+ AC_SUBST([HAVE_ASPRINTF])
+ if test "$ac_cv_func_snprintf" = yes; then
+ HAVE_SNPRINTF=1
+ else
+ HAVE_SNPRINTF=0
+ fi
+ AC_SUBST([HAVE_SNPRINTF])
+ if test "$ac_cv_func_wprintf" = yes; then
+ HAVE_WPRINTF=1
+ else
+ HAVE_WPRINTF=0
+ fi
+ AC_SUBST([HAVE_WPRINTF])
+
+ AM_LANGINFO_CODESET
+ gt_LC_MESSAGES
+
+ dnl Compilation on mingw and Cygwin needs special Makefile rules, because
+ dnl 1. when we install a shared library, we must arrange to export
+ dnl auxiliary pointer variables for every exported variable,
+ dnl 2. when we install a shared library and a static library simultaneously,
+ dnl the include file specifies __declspec(dllimport) and therefore we
+ dnl must arrange to define the auxiliary pointer variables for the
+ dnl exported variables _also_ in the static library.
+ if test "$enable_shared" = yes; then
+ case "$host_os" in
+ mingw* | cygwin*) is_woe32dll=yes ;;
+ *) is_woe32dll=no ;;
+ esac
+ else
+ is_woe32dll=no
+ fi
+ WOE32DLL=$is_woe32dll
+ AC_SUBST([WOE32DLL])
+
+ dnl On mingw and Cygwin, we can activate special Makefile rules which add
+ dnl version information to the shared libraries and executables.
+ case "$host_os" in
+ mingw* | cygwin*) is_woe32=yes ;;
+ *) is_woe32=no ;;
+ esac
+ WOE32=$is_woe32
+ AC_SUBST([WOE32])
+ if test $WOE32 = yes; then
+ dnl Check for a program that compiles Windows resource files.
+ AC_CHECK_TOOL([WINDRES], [windres])
+ fi
+
+ dnl Determine whether when creating a library, "-lc" should be passed to
+ dnl libtool or not. On many platforms, it is required for the libtool option
+ dnl -no-undefined to work. On HP-UX, however, the -lc - stored by libtool
+ dnl in the *.la files - makes it impossible to create multithreaded programs,
+ dnl because libtool also reorders the -lc to come before the -pthread, and
+ dnl this disables pthread_create() <http://docs.hp.com/en/1896/pthreads.html>.
+ case "$host_os" in
+ hpux*) LTLIBC="" ;;
+ *) LTLIBC="-lc" ;;
+ esac
+ AC_SUBST([LTLIBC])
+
+ dnl Rename some macros and functions used for locking.
+ AH_BOTTOM([
+#define __libc_lock_t gl_lock_t
+#define __libc_lock_define gl_lock_define
+#define __libc_lock_define_initialized gl_lock_define_initialized
+#define __libc_lock_init gl_lock_init
+#define __libc_lock_lock gl_lock_lock
+#define __libc_lock_unlock gl_lock_unlock
+#define __libc_lock_recursive_t gl_recursive_lock_t
+#define __libc_lock_define_recursive gl_recursive_lock_define
+#define __libc_lock_define_initialized_recursive gl_recursive_lock_define_initialized
+#define __libc_lock_init_recursive gl_recursive_lock_init
+#define __libc_lock_lock_recursive gl_recursive_lock_lock
+#define __libc_lock_unlock_recursive gl_recursive_lock_unlock
+#define glthread_in_use libintl_thread_in_use
+#define glthread_lock_init libintl_lock_init
+#define glthread_lock_lock libintl_lock_lock
+#define glthread_lock_unlock libintl_lock_unlock
+#define glthread_lock_destroy libintl_lock_destroy
+#define glthread_rwlock_init libintl_rwlock_init
+#define glthread_rwlock_rdlock libintl_rwlock_rdlock
+#define glthread_rwlock_wrlock libintl_rwlock_wrlock
+#define glthread_rwlock_unlock libintl_rwlock_unlock
+#define glthread_rwlock_destroy libintl_rwlock_destroy
+#define glthread_recursive_lock_init libintl_recursive_lock_init
+#define glthread_recursive_lock_lock libintl_recursive_lock_lock
+#define glthread_recursive_lock_unlock libintl_recursive_lock_unlock
+#define glthread_recursive_lock_destroy libintl_recursive_lock_destroy
+#define glthread_once libintl_once
+#define glthread_once_call libintl_once_call
+#define glthread_once_singlethreaded libintl_once_singlethreaded
+])
+])
+
+
+dnl Checks for the core files of the intl subdirectory:
+dnl dcigettext.c
+dnl eval-plural.h
+dnl explodename.c
+dnl finddomain.c
+dnl gettextP.h
+dnl gmo.h
+dnl hash-string.h hash-string.c
+dnl l10nflist.c
+dnl libgnuintl.h.in (except the *printf stuff)
+dnl loadinfo.h
+dnl loadmsgcat.c
+dnl localealias.c
+dnl log.c
+dnl plural-exp.h plural-exp.c
+dnl plural.y
+dnl Used by libglocale.
+AC_DEFUN([gt_INTL_SUBDIR_CORE],
+[
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([gt_INTDIV0])dnl
+ AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl
+ AC_REQUIRE([gt_INTTYPES_PRI])dnl
+ AC_REQUIRE([gl_LOCK])dnl
+
+ AC_TRY_LINK(
+ [int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }],
+ [],
+ [AC_DEFINE([HAVE_BUILTIN_EXPECT], 1,
+ [Define to 1 if the compiler understands __builtin_expect.])])
+
+ AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h])
+ AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \
+ stpcpy strcasecmp strdup strtoul tsearch argz_count argz_stringify \
+ argz_next __fsetlocking])
+
+ dnl Use the *_unlocked functions only if they are declared.
+ dnl (because some of them were defined without being declared in Solaris
+ dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+ dnl on Solaris 2.5.1 to run on Solaris 2.6).
+ dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+ gt_CHECK_DECL(feof_unlocked, [#include <stdio.h>])
+ gt_CHECK_DECL(fgets_unlocked, [#include <stdio.h>])
+
+ AM_ICONV
+
+ dnl glibc >= 2.4 has a NL_LOCALE_NAME macro when _GNU_SOURCE is defined,
+ dnl and a _NL_LOCALE_NAME macro always.
+ AC_CACHE_CHECK([for NL_LOCALE_NAME macro], gt_cv_nl_locale_name,
+ [AC_TRY_LINK([#include <langinfo.h>
+#include <locale.h>],
+ [char* cs = nl_langinfo(_NL_LOCALE_NAME(LC_MESSAGES));
+ return !cs;
+ ],
+ gt_cv_nl_locale_name=yes,
+ gt_cv_nl_locale_name=no)
+ ])
+ if test $gt_cv_nl_locale_name = yes; then
+ AC_DEFINE(HAVE_NL_LOCALE_NAME, 1,
+ [Define if you have <langinfo.h> and it defines the NL_LOCALE_NAME macro if _GNU_SOURCE is defined.])
+ fi
+
+ dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+ dnl because plural.y uses bison specific features. It requires at least
+ dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+ dnl compile.
+ dnl bison is only needed for the maintainer (who touches plural.y). But in
+ dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+ dnl the rule in general Makefile. Now, some people carelessly touch the
+ dnl files or have a broken "make" program, hence the plural.c rule will
+ dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+ dnl present or too old.
+ AC_CHECK_PROGS([INTLBISON], [bison])
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ dnl Found it, now check the version.
+ AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ AC_MSG_RESULT([$ac_prog_version])
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+])
+
+
+dnl gt_CHECK_DECL(FUNC, INCLUDES)
+dnl Check whether a function is declared.
+AC_DEFUN([gt_CHECK_DECL],
+[
+ AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1,
+ [AC_TRY_COMPILE([$2], [
+#ifndef $1
+ char *p = (char *) $1;
+#endif
+], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)])
+ if test $ac_cv_have_decl_$1 = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value],
+ [Define to 1 if you have the declaration of `$1', and to 0 if you don't.])
+])
diff --git a/gnulib/m4/intldir.m4 b/gnulib/m4/intldir.m4
new file mode 100644
index 00000000..744c0bc7
--- /dev/null
+++ b/gnulib/m4/intldir.m4
@@ -0,0 +1,19 @@
+# intldir.m4 serial 2 (gettext-0.18)
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+AC_PREREQ([2.52])
+
+dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory.
+AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], [])
diff --git a/gnulib/m4/intlmacosx.m4 b/gnulib/m4/intlmacosx.m4
new file mode 100644
index 00000000..dd910259
--- /dev/null
+++ b/gnulib/m4/intlmacosx.m4
@@ -0,0 +1,51 @@
+# intlmacosx.m4 serial 3 (gettext-0.18)
+dnl Copyright (C) 2004-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Checks for special options needed on MacOS X.
+dnl Defines INTL_MACOSX_LIBS.
+AC_DEFUN([gt_INTL_MACOSX],
+[
+ dnl Check for API introduced in MacOS X 10.2.
+ AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+ [gt_cv_func_CFPreferencesCopyAppValue],
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>],
+ [CFPreferencesCopyAppValue(NULL, NULL)],
+ [gt_cv_func_CFPreferencesCopyAppValue=yes],
+ [gt_cv_func_CFPreferencesCopyAppValue=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+ AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
+ [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+ fi
+ dnl Check for API introduced in MacOS X 10.3.
+ AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();],
+ [gt_cv_func_CFLocaleCopyCurrent=yes],
+ [gt_cv_func_CFLocaleCopyCurrent=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
+ [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
+ fi
+ INTL_MACOSX_LIBS=
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ fi
+ AC_SUBST([INTL_MACOSX_LIBS])
+])
diff --git a/gnulib/m4/intmax.m4 b/gnulib/m4/intmax.m4
new file mode 100644
index 00000000..74aaaf5e
--- /dev/null
+++ b/gnulib/m4/intmax.m4
@@ -0,0 +1,33 @@
+# intmax.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 2002-2005, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the system has the 'intmax_t' type, but don't attempt to
+dnl find a replacement if it is lacking.
+
+AC_DEFUN([gt_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t],
+ [AC_TRY_COMPILE([
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+], [intmax_t x = -1;
+ return !x;],
+ [gt_cv_c_intmax_t=yes],
+ [gt_cv_c_intmax_t=no])])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE([HAVE_INTMAX_T], [1],
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
diff --git a/gnulib/m4/intmax_t.m4 b/gnulib/m4/intmax_t.m4
new file mode 100644
index 00000000..975caac5
--- /dev/null
+++ b/gnulib/m4/intmax_t.m4
@@ -0,0 +1,62 @@
+# intmax_t.m4 serial 7
+dnl Copyright (C) 1997-2004, 2006-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_PREREQ([2.13])
+
+# Define intmax_t to 'long' or 'long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([gl_AC_TYPE_INTMAX_T],
+[
+ dnl For simplicity, we assume that a header file defines 'intmax_t' if and
+ dnl only if it defines 'uintmax_t'.
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ test $ac_cv_type_long_long_int = yes \
+ && ac_type='long long' \
+ || ac_type='long'
+ AC_DEFINE_UNQUOTED([intmax_t], [$ac_type],
+ [Define to long or long long if <inttypes.h> and <stdint.h> don't define.])
+ else
+ AC_DEFINE([HAVE_INTMAX_T], [1],
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
+
+dnl An alternative would be to explicitly test for 'intmax_t'.
+
+AC_DEFUN([gt_AC_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t],
+ [AC_TRY_COMPILE([
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+], [intmax_t x = -1; return !x;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE([HAVE_INTMAX_T], [1],
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ else
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ test $ac_cv_type_long_long_int = yes \
+ && ac_type='long long' \
+ || ac_type='long'
+ AC_DEFINE_UNQUOTED([intmax_t], [$ac_type],
+ [Define to long or long long if <stdint.h> and <inttypes.h> don't define.])
+ fi
+])
diff --git a/gnulib/m4/inttostr.m4 b/gnulib/m4/inttostr.m4
new file mode 100644
index 00000000..3e17ed59
--- /dev/null
+++ b/gnulib/m4/inttostr.m4
@@ -0,0 +1,37 @@
+#serial 7
+dnl Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_INTTOSTR],
+[
+ AC_LIBOBJ([imaxtostr])
+ AC_LIBOBJ([offtostr])
+ AC_LIBOBJ([umaxtostr])
+ AC_LIBOBJ([uinttostr])
+
+ gl_PREREQ_INTTOSTR
+ gl_PREREQ_IMAXTOSTR
+ gl_PREREQ_OFFTOSTR
+ gl_PREREQ_UMAXTOSTR
+ gl_PREREQ_UINTTOSTR
+])
+
+# Prerequisites of lib/inttostr.h.
+AC_DEFUN([gl_PREREQ_INTTOSTR], [
+ AC_REQUIRE([AC_TYPE_OFF_T])
+ :
+])
+
+# Prerequisites of lib/imaxtostr.c.
+AC_DEFUN([gl_PREREQ_IMAXTOSTR], [:])
+
+# Prerequisites of lib/offtostr.c.
+AC_DEFUN([gl_PREREQ_OFFTOSTR], [:])
+
+# Prerequisites of lib/umaxtostr.c.
+AC_DEFUN([gl_PREREQ_UMAXTOSTR], [:])
+
+# Prerequisites of lib/uinttostr.c.
+AC_DEFUN([gl_PREREQ_UINTTOSTR], [:])
diff --git a/gnulib/m4/inttypes-pri.m4 b/gnulib/m4/inttypes-pri.m4
new file mode 100644
index 00000000..718a4f4e
--- /dev/null
+++ b/gnulib/m4/inttypes-pri.m4
@@ -0,0 +1,36 @@
+# inttypes-pri.m4 serial 6 (gettext-0.18)
+dnl Copyright (C) 1997-2002, 2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.52])
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values. This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+ AC_CHECK_HEADERS([inttypes.h])
+ if test $ac_cv_header_inttypes_h = yes; then
+ AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+ [gt_cv_inttypes_pri_broken],
+ [
+ AC_TRY_COMPILE([#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+], [], [gt_cv_inttypes_pri_broken=no], [gt_cv_inttypes_pri_broken=yes])
+ ])
+ fi
+ if test "$gt_cv_inttypes_pri_broken" = yes; then
+ AC_DEFINE_UNQUOTED([PRI_MACROS_BROKEN], [1],
+ [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+ PRI_MACROS_BROKEN=1
+ else
+ PRI_MACROS_BROKEN=0
+ fi
+ AC_SUBST([PRI_MACROS_BROKEN])
+])
diff --git a/gnulib/m4/inttypes.m4 b/gnulib/m4/inttypes.m4
new file mode 100644
index 00000000..3ee174dc
--- /dev/null
+++ b/gnulib/m4/inttypes.m4
@@ -0,0 +1,302 @@
+# inttypes.m4 serial 17
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Derek Price, Bruno Haible.
+dnl Test whether <inttypes.h> is supported or must be substituted.
+
+AC_DEFUN([gl_INTTYPES_H],
+[
+ AC_REQUIRE([gl_STDINT_H])
+ AC_REQUIRE([gt_INTTYPES_PRI])
+ AC_CHECK_HEADERS_ONCE([inttypes.h])
+ AC_CHECK_DECLS_ONCE([imaxabs])
+ AC_CHECK_DECLS_ONCE([imaxdiv])
+ AC_CHECK_DECLS_ONCE([strtoimax])
+ AC_CHECK_DECLS_ONCE([strtoumax])
+
+ dnl Now see if we need a substitute <inttypes.h>.
+ dnl A complete <inttypes.h> requires
+ dnl - a complete <stdint.h>,
+ dnl - the existence of an <inttypes.h>,
+ dnl - that imaxabs, imaxdiv, strtoimax, strtoumax are declared,
+ dnl - some additional tests.
+ AC_CACHE_CHECK([whether inttypes.h conforms to C99],
+ [gl_cv_header_working_inttypes_h],
+ [gl_cv_header_working_inttypes_h=no
+ if test "$gl_cv_header_working_stdint_h" = yes \
+ && test $ac_cv_header_inttypes_h = yes \
+ && test "$ac_cv_have_decl_imaxabs" = yes \
+ && test "$ac_cv_have_decl_imaxdiv" = yes \
+ && test "$ac_cv_have_decl_strtoimax" = yes \
+ && test "$ac_cv_have_decl_strtoumax" = yes; then
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+#include <stddef.h>
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_FORMAT_MACROS 1 /* to make it work also in C++ mode */
+#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H /* work if build isn't clean */
+#include <inttypes.h>
+
+/* No need to duplicate the tests of stdint.m4; they are subsumed by
+ $gl_cv_header_working_stdint_h = yes. */
+
+/* Tests for macros supposed to be defined in inttypes.h. */
+
+const char *k = /* implicit string concatenation */
+#ifdef INT8_MAX
+ PRId8 PRIi8
+#endif
+#ifdef UINT8_MAX
+ PRIo8 PRIu8 PRIx8 PRIX8
+#endif
+#ifdef INT16_MAX
+ PRId16 PRIi16
+#endif
+#ifdef UINT16_MAX
+ PRIo16 PRIu16 PRIx16 PRIX16
+#endif
+#ifdef INT32_MAX
+ PRId32 PRIi32
+#endif
+#ifdef UINT32_MAX
+ PRIo32 PRIu32 PRIx32 PRIX32
+#endif
+#ifdef INT64_MAX
+ PRId64 PRIi64
+#endif
+#ifdef UINT64_MAX
+ PRIo64 PRIu64 PRIx64 PRIX64
+#endif
+ PRIdLEAST8 PRIiLEAST8 PRIoLEAST8 PRIuLEAST8 PRIxLEAST8 PRIXLEAST8
+ PRIdLEAST16 PRIiLEAST16 PRIoLEAST16 PRIuLEAST16 PRIxLEAST16 PRIXLEAST16
+ PRIdLEAST32 PRIiLEAST32 PRIoLEAST32 PRIuLEAST32 PRIxLEAST32 PRIXLEAST32
+ PRIdLEAST64 PRIiLEAST64
+ PRIoLEAST64 PRIuLEAST64 PRIxLEAST64 PRIXLEAST64
+ PRIdFAST8 PRIiFAST8 PRIoFAST8 PRIuFAST8 PRIxFAST8 PRIXFAST8
+ PRIdFAST16 PRIiFAST16 PRIoFAST16 PRIuFAST16 PRIxFAST16 PRIXFAST16
+ PRIdFAST32 PRIiFAST32 PRIoFAST32 PRIuFAST32 PRIxFAST32 PRIXFAST32
+ PRIdFAST64 PRIiFAST64
+ PRIoFAST64 PRIuFAST64 PRIxFAST64 PRIXFAST64
+ PRIdMAX PRIiMAX PRIoMAX PRIuMAX PRIxMAX PRIXMAX
+#ifdef INTPTR_MAX
+ PRIdPTR PRIiPTR
+#endif
+#ifdef UINTPTR_MAX
+ PRIoPTR PRIuPTR PRIxPTR PRIXPTR
+#endif
+ ;
+const char *l = /* implicit string concatenation */
+#ifdef INT8_MAX
+ SCNd8 SCNi8
+#endif
+#ifdef UINT8_MAX
+ SCNo8 SCNu8 SCNx8
+#endif
+#ifdef INT16_MAX
+ SCNd16 SCNi16
+#endif
+#ifdef UINT16_MAX
+ SCNo16 SCNu16 SCNx16
+#endif
+#ifdef INT32_MAX
+ SCNd32 SCNi32
+#endif
+#ifdef UINT32_MAX
+ SCNo32 SCNu32 SCNx32
+#endif
+#ifdef INT64_MAX
+ SCNd64 SCNi64
+#endif
+#ifdef UINT64_MAX
+ SCNo64 SCNu64 SCNx64
+#endif
+ SCNdLEAST8 SCNiLEAST8 SCNoLEAST8 SCNuLEAST8 SCNxLEAST8
+ SCNdLEAST16 SCNiLEAST16 SCNoLEAST16 SCNuLEAST16 SCNxLEAST16
+ SCNdLEAST32 SCNiLEAST32 SCNoLEAST32 SCNuLEAST32 SCNxLEAST32
+ SCNdLEAST64 SCNiLEAST64
+ SCNoLEAST64 SCNuLEAST64 SCNxLEAST64
+ SCNdFAST8 SCNiFAST8 SCNoFAST8 SCNuFAST8 SCNxFAST8
+ SCNdFAST16 SCNiFAST16 SCNoFAST16 SCNuFAST16 SCNxFAST16
+ SCNdFAST32 SCNiFAST32 SCNoFAST32 SCNuFAST32 SCNxFAST32
+ SCNdFAST64 SCNiFAST64
+ SCNoFAST64 SCNuFAST64 SCNxFAST64
+ SCNdMAX SCNiMAX SCNoMAX SCNuMAX SCNxMAX
+#ifdef INTPTR_MAX
+ SCNdPTR SCNiPTR
+#endif
+#ifdef UINTPTR_MAX
+ SCNoPTR SCNuPTR SCNxPTR
+#endif
+ ;
+ ]])],
+ [gl_cv_header_working_inttypes_h=yes])
+ fi])
+
+ dnl Override <inttypes.h> always, so that the portability warnings work.
+ AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([inttypes.h])
+
+ AC_REQUIRE([gl_MULTIARCH])
+
+ dnl Ensure that <stdint.h> defines the limit macros, since gnulib's
+ dnl <inttypes.h> relies on them. This macro is only needed when a
+ dnl C++ compiler is in use; it has no effect for a C compiler.
+ dnl Also be careful to define __STDC_LIMIT_MACROS only when gnulib's
+ dnl <inttypes.h> is going to be created, and to avoid redefinition warnings
+ dnl if the __STDC_LIMIT_MACROS is already defined through the CPPFLAGS.
+ AC_DEFINE([GL_TRIGGER_STDC_LIMIT_MACROS], [1],
+ [Define to make the limit macros in <stdint.h> visible.])
+ AH_VERBATIM([__STDC_LIMIT_MACROS_ZZZ],
+[/* Ensure that <stdint.h> defines the limit macros, since gnulib's
+ <inttypes.h> relies on them. */
+#if defined __cplusplus && !defined __STDC_LIMIT_MACROS && GL_TRIGGER_STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS 1
+#endif
+])
+
+ PRIPTR_PREFIX=
+ if test -n "$STDINT_H"; then
+ dnl Using the gnulib <stdint.h>. It always defines intptr_t to 'long'.
+ PRIPTR_PREFIX='"l"'
+ else
+ dnl Using the system's <stdint.h>.
+ for glpfx in '' l ll I64; do
+ case $glpfx in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ I64) gltype1='__int64';;
+ esac
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <stdint.h>
+ extern intptr_t foo;
+ extern $gltype1 foo;]])],
+ [PRIPTR_PREFIX='"'$glpfx'"'])
+ test -n "$PRIPTR_PREFIX" && break
+ done
+ fi
+ AC_SUBST([PRIPTR_PREFIX])
+
+ if test "$ac_cv_have_decl_imaxabs" = yes; then
+ HAVE_DECL_IMAXABS=1
+ else
+ HAVE_DECL_IMAXABS=0
+ fi
+
+ if test "$ac_cv_have_decl_imaxdiv" = yes; then
+ HAVE_DECL_IMAXDIV=1
+ else
+ HAVE_DECL_IMAXDIV=0
+ fi
+
+ if test "$ac_cv_have_decl_strtoimax" = yes; then
+ HAVE_DECL_STRTOIMAX=1
+ else
+ HAVE_DECL_STRTOIMAX=0
+ fi
+
+ if test "$ac_cv_have_decl_strtoumax" = yes; then
+ HAVE_DECL_STRTOUMAX=1
+ else
+ HAVE_DECL_STRTOUMAX=0
+ fi
+
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [INT32_MAX_LT_INTMAX_MAX],
+ [defined INT32_MAX && defined INTMAX_MAX],
+ [INT32_MAX < INTMAX_MAX],
+ [sizeof (int) < sizeof (long long int)])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [INT64_MAX_EQ_LONG_MAX],
+ [defined INT64_MAX],
+ [INT64_MAX == LONG_MAX],
+ [sizeof (long long int) == sizeof (long int)])
+ else
+ INT64_MAX_EQ_LONG_MAX=-1
+ fi
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [UINT32_MAX_LT_UINTMAX_MAX],
+ [defined UINT32_MAX && defined UINTMAX_MAX],
+ [UINT32_MAX < UINTMAX_MAX],
+ [sizeof (unsigned int) < sizeof (unsigned long long int)])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [UINT64_MAX_EQ_ULONG_MAX],
+ [defined UINT64_MAX],
+ [UINT64_MAX == ULONG_MAX],
+ [sizeof (unsigned long long int) == sizeof (unsigned long int)])
+ else
+ UINT64_MAX_EQ_ULONG_MAX=-1
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <inttypes.h>
+ ]], [imaxabs imaxdiv strtoimax strtoumax])
+])
+
+# Define the symbol $1 to be 1 if the condition is true, 0 otherwise.
+# If $2 is true, the condition is $3; otherwise if long long int is supported
+# approximate the condition with $4; otherwise, assume the condition is false.
+# The condition should work on all C99 platforms; the approximations should be
+# good enough to work on all practical pre-C99 platforms.
+# $2 is evaluated by the C preprocessor, $3 and $4 as compile-time constants.
+AC_DEFUN([gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION],
+[
+ AC_CACHE_CHECK([whether $3],
+ [gl_cv_test_$1],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[/* Work also in C++ mode. */
+ #define __STDC_LIMIT_MACROS 1
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+ #include <limits.h>
+ #if HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+
+ #if $2
+ #define CONDITION ($3)
+ #elif HAVE_LONG_LONG_INT
+ #define CONDITION ($4)
+ #else
+ #define CONDITION 0
+ #endif
+ int test[CONDITION ? 1 : -1];]])],
+ [gl_cv_test_$1=yes],
+ [gl_cv_test_$1=no])])
+ if test $gl_cv_test_$1 = yes; then
+ $1=1;
+ else
+ $1=0;
+ fi
+ AC_SUBST([$1])
+])
+
+AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_INTTYPES_H_DEFAULTS],
+[
+ GNULIB_IMAXABS=0; AC_SUBST([GNULIB_IMAXABS])
+ GNULIB_IMAXDIV=0; AC_SUBST([GNULIB_IMAXDIV])
+ GNULIB_STRTOIMAX=0; AC_SUBST([GNULIB_STRTOIMAX])
+ GNULIB_STRTOUMAX=0; AC_SUBST([GNULIB_STRTOUMAX])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_IMAXABS=1; AC_SUBST([HAVE_DECL_IMAXABS])
+ HAVE_DECL_IMAXDIV=1; AC_SUBST([HAVE_DECL_IMAXDIV])
+ HAVE_DECL_STRTOIMAX=1; AC_SUBST([HAVE_DECL_STRTOIMAX])
+ HAVE_DECL_STRTOUMAX=1; AC_SUBST([HAVE_DECL_STRTOUMAX])
+])
diff --git a/gnulib/m4/inttypes_h.m4 b/gnulib/m4/inttypes_h.m4
new file mode 100644
index 00000000..782d77ed
--- /dev/null
+++ b/gnulib/m4/inttypes_h.m4
@@ -0,0 +1,26 @@
+# inttypes_h.m4 serial 9
+dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h],
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <inttypes.h>],
+ [uintmax_t i = (uintmax_t) -1; return !i;],
+ [gl_cv_header_inttypes_h=yes],
+ [gl_cv_header_inttypes_h=no])])
+ if test $gl_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1],
+ [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/gnulib/m4/isapipe.m4 b/gnulib/m4/isapipe.m4
new file mode 100644
index 00000000..6bf92218
--- /dev/null
+++ b/gnulib/m4/isapipe.m4
@@ -0,0 +1,89 @@
+# Test whether a file descriptor is a pipe.
+
+dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
+
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl_ISAPIPE],
+[
+ # OpenVMS has isapipe already, so check for it.
+ AC_REPLACE_FUNCS([isapipe])
+ if test $ac_cv_func_isapipe = no; then
+ gl_PREREQ_ISAPIPE
+ fi
+])
+
+# Prerequisites of lib/isapipe.c.
+AC_DEFUN([gl_PREREQ_ISAPIPE],
+[
+ AC_CACHE_CHECK([whether pipes are FIFOs (and for their link count)],
+ [gl_cv_pipes_are_fifos],
+ [AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#include <stdio.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
+ #ifndef S_ISFIFO
+ #define S_ISFIFO(m) 0
+ #endif
+ #ifndef S_ISSOCK
+ #define S_ISSOCK(m) 0
+ #endif
+ int
+ main (int argc, char **argv)
+ {
+ int fd[2];
+ struct stat st;
+ if (pipe (fd) != 0 || fstat (fd[0], &st) != 0)
+ return 1;
+ if (2 <= argc && argv[1][0] == '-')
+ {
+ char const *yesno = (S_ISFIFO (st.st_mode) ? "yes" : "no");
+ if (st.st_nlink <= 1)
+ {
+ long int i = st.st_nlink;
+ if (i != st.st_nlink)
+ return 1;
+ printf ("%s (%ld)\n", yesno, i);
+ }
+ else
+ {
+ unsigned long int i = st.st_nlink;
+ if (i != st.st_nlink)
+ return 1;
+ printf ("%s (%lu)\n", yesno, i);
+ }
+ }
+ else
+ {
+ if (! S_ISFIFO (st.st_mode) && ! S_ISSOCK (st.st_mode))
+ return 1;
+ }
+ return 0;
+ }]])],
+ [gl_cv_pipes_are_fifos=`./conftest$ac_exeext -`
+ test -z "$gl_cv_pipes_are_fifos" && gl_cv_pipes_are_fifos=no],
+ [gl_cv_pipes_are_fifos=unknown],
+ [gl_cv_pipes_are_fifos=cross-compiling])])
+
+ case $gl_cv_pipes_are_fifos in #(
+ 'yes ('*')')
+ AC_DEFINE([HAVE_FIFO_PIPES], [1],
+ [Define to 1 if pipes are FIFOs, 0 if sockets. Leave undefined
+ if not known.]);; #(
+ 'no ('*')')
+ AC_DEFINE([HAVE_FIFO_PIPES], [0]);;
+ esac
+
+ case $gl_cv_pipes_are_fifos in #(
+ *'('*')')
+ AC_DEFINE_UNQUOTED([PIPE_LINK_COUNT_MAX],
+ [`expr "$gl_cv_pipes_are_fifos" : '.*\((.*)\)'`],
+ [Define to the maximum link count that a true pipe can have.]);;
+ esac
+])
diff --git a/gnulib/m4/isblank.m4 b/gnulib/m4/isblank.m4
new file mode 100644
index 00000000..fa0c4720
--- /dev/null
+++ b/gnulib/m4/isblank.m4
@@ -0,0 +1,18 @@
+# isblank.m4 serial 2
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ISBLANK],
+[
+ dnl Persuade glibc <ctype.h> to declare isblank().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_CTYPE_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([isblank])
+ if test $ac_cv_func_isblank = no; then
+ HAVE_ISBLANK=0
+ AC_LIBOBJ([isblank])
+ fi
+])
diff --git a/gnulib/m4/isfinite.m4 b/gnulib/m4/isfinite.m4
new file mode 100644
index 00000000..389a23a8
--- /dev/null
+++ b/gnulib/m4/isfinite.m4
@@ -0,0 +1,160 @@
+# isfinite.m4 serial 6
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ISFINITE],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare isfinite.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_DECLS([isfinite], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_isfinite" = yes; then
+ gl_CHECK_MATH_LIB([ISFINITE_LIBM], [x = isfinite (x);])
+ if test "$ISFINITE_LIBM" != missing; then
+ dnl Test whether isfinite() on 'long double' works.
+ gl_ISFINITEL_WORKS
+ case "$gl_cv_func_isfinitel_works" in
+ *yes) ;;
+ *) ISFINITE_LIBM=missing;;
+ esac
+ dnl Also, isfinite() on 'double' does not work on Linux/ia64 (because of
+ dnl signalling NaNs). But this does not have to be tested, since
+ dnl isfinite(long double) also does not work in this situation.
+ fi
+ fi
+ if test "$ac_cv_have_decl_isfinite" != yes ||
+ test "$ISFINITE_LIBM" = missing; then
+ REPLACE_ISFINITE=1
+ AC_LIBOBJ([isfinite])
+ ISFINITE_LIBM=
+ fi
+ AC_SUBST([REPLACE_ISFINITE])
+ AC_SUBST([ISFINITE_LIBM])
+])
+
+dnl Test whether isfinite() on 'long double' recognizes all numbers which are
+dnl neither finite nor infinite. This test fails e.g. on i686, x86_64, ia64,
+dnl because of
+dnl - pseudo-denormals on x86_64,
+dnl - pseudo-zeroes, unnormalized numbers, and pseudo-denormals on i686,
+dnl - pseudo-NaN, pseudo-Infinity, pseudo-zeroes, unnormalized numbers, and
+dnl pseudo-denormals on ia64.
+AC_DEFUN([gl_ISFINITEL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether isfinite(long double) works], [gl_cv_func_isfinitel_works],
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; long double value; }
+ memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+ runtime type conversion. */
+#ifdef __sgi
+static long double NaNl ()
+{
+ double zero = 0.0;
+ return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
+int main ()
+{
+ memory_long_double m;
+ unsigned int i;
+
+ /* The isfinite macro should be immune against changes in the sign bit and
+ in the mantissa bits. The xor operation twiddles a bit that can only be
+ a sign bit or a mantissa bit (since the exponent never extends to
+ bit 31). */
+ m.value = NaNl ();
+ m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+ for (i = 0; i < NWORDS; i++)
+ m.word[i] |= 1;
+ if (isfinite (m.value))
+ return 1;
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ if (isfinite (x.value))
+ return 1;
+ }
+ {
+ /* Signalling NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ if (isfinite (x.value))
+ return 1;
+ }
+ /* The isfinite macro should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ if (isfinite (x.value))
+ return 1;
+ }
+ { /* Pseudo-Infinity. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ if (isfinite (x.value))
+ return 1;
+ }
+ { /* Pseudo-Zero. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ if (isfinite (x.value))
+ return 1;
+ }
+ { /* Unnormalized number. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ if (isfinite (x.value))
+ return 1;
+ }
+ { /* Pseudo-Denormal. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ if (isfinite (x.value))
+ return 1;
+ }
+#endif
+
+ return 0;
+}]])], [gl_cv_func_isfinitel_works=yes], [gl_cv_func_isfinitel_works=no],
+ [case "$host_cpu" in
+ # Guess no on ia64, x86_64, i386.
+ ia64 | x86_64 | i*86) gl_cv_func_isnanl_works="guessing no";;
+ *) gl_cv_func_isnanl_works="guessing yes";;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib/m4/isinf.m4 b/gnulib/m4/isinf.m4
new file mode 100644
index 00000000..45099efa
--- /dev/null
+++ b/gnulib/m4/isinf.m4
@@ -0,0 +1,49 @@
+# isinf.m4 serial 2
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ISINF],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare isinf.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_DECLS([isinf], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_isinf" = yes; then
+ gl_CHECK_MATH_LIB([ISINF_LIBM], [x = isinf (x);])
+ if test "$ISINF_LIBM" != missing; then
+ dnl Test whether isinf() on 'long double' works.
+ gl_ISINFL_WORKS
+ case "$gl_cv_func_isinfl_works" in
+ *yes) ;;
+ *) ISINF_LIBM=missing;;
+ esac
+ fi
+ fi
+ if test "$ac_cv_have_decl_isinf" != yes ||
+ test "$ISINF_LIBM" = missing; then
+ REPLACE_ISINF=1
+ AC_LIBOBJ([isinf])
+ ISINF_LIBM=
+ fi
+ AC_SUBST([REPLACE_ISINF])
+ AC_SUBST([ISINF_LIBM])
+])
+
+dnl Test whether isinf() correctly returns false for LDBL_MAX.
+AC_DEFUN([gl_ISINFL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether isinf(long double) works], [gl_cv_func_isinfl_works],
+ [
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <float.h>
+ #include <math.h>]],
+ [[return !!isinf(LDBL_MAX);]])],
+ [gl_cv_func_isinfl_works=yes],
+ [gl_cv_func_isinfl_works=no],
+ [gl_cv_func_isinfl_works="guessing no"])
+ ])
+])
diff --git a/gnulib/m4/isnan.m4 b/gnulib/m4/isnan.m4
new file mode 100644
index 00000000..eb61d566
--- /dev/null
+++ b/gnulib/m4/isnan.m4
@@ -0,0 +1,47 @@
+# isnan.m4 serial 3
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ISNAN],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_ISNANF])
+ AC_REQUIRE([gl_FUNC_ISNAND])
+ AC_REQUIRE([gl_FUNC_ISNANL])
+
+ # If we replaced any of the underlying isnan* functions, replace
+ # the isnan macro; it undoubtedly suffers from the same flaws.
+ AC_MSG_CHECKING([whether isnan macro works])
+ if test $gl_func_isnanf = yes \
+ && test $gl_func_isnand = yes \
+ && test $gl_func_isnanl = yes; then
+ AC_MSG_RESULT([yes])
+ ISNAN_LIBM=
+ dnl Append $ISNANF_LIBM to ISNAN_LIBM, avoiding gratuitous duplicates.
+ case " $ISNAN_LIBM " in
+ *" $ISNANF_LIBM "*) ;;
+ *) ISNAN_LIBM="$ISNAN_LIBM $ISNANF_LIBM" ;;
+ esac
+ dnl Append $ISNAND_LIBM to ISNAN_LIBM, avoiding gratuitous duplicates.
+ case " $ISNAN_LIBM " in
+ *" $ISNAND_LIBM "*) ;;
+ *) ISNAN_LIBM="$ISNAN_LIBM $ISNAND_LIBM" ;;
+ esac
+ dnl Append $ISNANL_LIBM to ISNAN_LIBM, avoiding gratuitous duplicates.
+ case " $ISNAN_LIBM " in
+ *" $ISNANL_LIBM "*) ;;
+ *) ISNAN_LIBM="$ISNAN_LIBM $ISNANL_LIBM" ;;
+ esac
+ else
+ AC_MSG_RESULT([no])
+ REPLACE_ISNAN=1
+ # Make sure the rpl_isnan[fdl] functions get built.
+ gl_BUILD_ISNANF
+ gl_BUILD_ISNAND
+ gl_BUILD_ISNANL
+ ISNAN_LIBM=
+ fi
+ AC_SUBST([ISNAN_LIBM])
+])
diff --git a/gnulib/m4/isnand.m4 b/gnulib/m4/isnand.m4
new file mode 100644
index 00000000..cd916284
--- /dev/null
+++ b/gnulib/m4/isnand.m4
@@ -0,0 +1,95 @@
+# isnand.m4 serial 6
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check how to get or define isnand().
+
+AC_DEFUN([gl_FUNC_ISNAND],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ ISNAND_LIBM=
+ gl_HAVE_ISNAND_NO_LIBM
+ if test $gl_cv_func_isnand_no_libm = no; then
+ gl_HAVE_ISNAND_IN_LIBM
+ if test $gl_cv_func_isnand_in_libm = yes; then
+ ISNAND_LIBM=-lm
+ fi
+ fi
+ dnl The variable gl_func_isnand set here is used by isnan.m4.
+ if test $gl_cv_func_isnand_no_libm = yes \
+ || test $gl_cv_func_isnand_in_libm = yes; then
+ gl_func_isnand=yes
+ else
+ gl_func_isnand=no
+ HAVE_ISNAND=0
+ gl_BUILD_ISNAND
+ fi
+ AC_SUBST([ISNAND_LIBM])
+])
+
+dnl Check how to get or define isnand() without linking with libm.
+
+AC_DEFUN([gl_FUNC_ISNAND_NO_LIBM],
+[
+ gl_HAVE_ISNAND_NO_LIBM
+ if test $gl_cv_func_isnand_no_libm = yes; then
+ AC_DEFINE([HAVE_ISNAND_IN_LIBC], [1],
+ [Define if the isnan(double) function is available in libc.])
+ else
+ gl_BUILD_ISNAND
+ fi
+])
+
+dnl Pull in replacement isnand definition. It does not need -lm.
+AC_DEFUN([gl_BUILD_ISNAND],
+[
+ AC_LIBOBJ([isnand])
+ gl_DOUBLE_EXPONENT_LOCATION
+])
+
+dnl Test whether isnand() can be used with libm.
+
+AC_DEFUN([gl_HAVE_ISNAND_IN_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(double) can be used with libm],
+ [gl_cv_func_isnand_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#include <math.h>
+ #if __GNUC__ >= 4
+ # undef isnand
+ # define isnand(x) __builtin_isnand ((double)(x))
+ #elif defined isnan
+ # undef isnand
+ # define isnand(x) isnan ((double)(x))
+ #endif
+ double x;],
+ [return isnand (x);],
+ [gl_cv_func_isnand_in_libm=yes],
+ [gl_cv_func_isnand_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+])
+
+AC_DEFUN([gl_HAVE_ISNAND_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(double) can be used without linking with libm],
+ [gl_cv_func_isnand_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ #if __GNUC__ >= 4
+ # undef isnand
+ # define isnand(x) __builtin_isnan ((double)(x))
+ #else
+ # undef isnand
+ # define isnand(x) isnan ((double)(x))
+ #endif
+ double x;],
+ [return isnand (x);],
+ [gl_cv_func_isnand_no_libm=yes],
+ [gl_cv_func_isnand_no_libm=no])
+ ])
+])
diff --git a/gnulib/m4/isnanf.m4 b/gnulib/m4/isnanf.m4
new file mode 100644
index 00000000..1509fb44
--- /dev/null
+++ b/gnulib/m4/isnanf.m4
@@ -0,0 +1,179 @@
+# isnanf.m4 serial 10
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check how to get or define isnanf().
+
+AC_DEFUN([gl_FUNC_ISNANF],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ ISNANF_LIBM=
+ gl_HAVE_ISNANF_NO_LIBM
+ if test $gl_cv_func_isnanf_no_libm = no; then
+ gl_HAVE_ISNANF_IN_LIBM
+ if test $gl_cv_func_isnanf_in_libm = yes; then
+ ISNANF_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_isnanf_no_libm = yes \
+ || test $gl_cv_func_isnanf_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $ISNANF_LIBM"
+ gl_ISNANF_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_isnanf_works" in
+ *yes) gl_func_isnanf=yes ;;
+ *) gl_func_isnanf=no; ISNANF_LIBM= ;;
+ esac
+ else
+ gl_func_isnanf=no
+ fi
+ if test $gl_func_isnanf != yes; then
+ HAVE_ISNANF=0
+ gl_BUILD_ISNANF
+ fi
+ AC_SUBST([ISNANF_LIBM])
+])
+
+dnl Check how to get or define isnanf() without linking with libm.
+
+AC_DEFUN([gl_FUNC_ISNANF_NO_LIBM],
+[
+ gl_HAVE_ISNANF_NO_LIBM
+ if test $gl_cv_func_isnanf_no_libm = yes; then
+ gl_ISNANF_WORKS
+ fi
+ if test $gl_cv_func_isnanf_no_libm = yes \
+ && { case "$gl_cv_func_isnanf_works" in
+ *yes) true;;
+ *) false;;
+ esac
+ }; then
+ AC_DEFINE([HAVE_ISNANF_IN_LIBC], [1],
+ [Define if the isnan(float) function is available in libc.])
+ else
+ gl_BUILD_ISNANF
+ fi
+])
+
+dnl Pull in replacement isnanf definition. It does not need -lm.
+AC_DEFUN([gl_BUILD_ISNANF],
+[
+ AC_LIBOBJ([isnanf])
+ gl_FLOAT_EXPONENT_LOCATION
+])
+
+dnl Test whether isnanf() can be used without libm.
+AC_DEFUN([gl_HAVE_ISNANF_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(float) can be used without linking with libm],
+ [gl_cv_func_isnanf_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ #if __GNUC__ >= 4
+ # undef isnanf
+ # define isnanf(x) __builtin_isnanf ((float)(x))
+ #elif defined isnan
+ # undef isnanf
+ # define isnanf(x) isnan ((float)(x))
+ #endif
+ float x;],
+ [return isnanf (x);],
+ [gl_cv_func_isnanf_no_libm=yes],
+ [gl_cv_func_isnanf_no_libm=no])
+ ])
+])
+
+dnl Test whether isnanf() can be used with libm.
+AC_DEFUN([gl_HAVE_ISNANF_IN_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(float) can be used with libm],
+ [gl_cv_func_isnanf_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#include <math.h>
+ #if __GNUC__ >= 4
+ # undef isnanf
+ # define isnanf(x) __builtin_isnanf ((float)(x))
+ #elif defined isnan
+ # undef isnanf
+ # define isnanf(x) isnan ((float)(x))
+ #endif
+ float x;],
+ [return isnanf (x);],
+ [gl_cv_func_isnanf_in_libm=yes],
+ [gl_cv_func_isnanf_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+])
+
+dnl Test whether isnanf() rejects Infinity (this fails on Solaris 2.5.1),
+dnl recognizes a NaN (this fails on IRIX 6.5 with cc), and recognizes a NaN
+dnl with in-memory representation 0x7fbfffff (this fails on IRIX 6.5).
+AC_DEFUN([gl_ISNANF_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_FLOAT_EXPONENT_LOCATION])
+ AC_CACHE_CHECK([whether isnan(float) works], [gl_cv_func_isnanf_works],
+ [
+ AC_TRY_RUN([
+#include <math.h>
+#if __GNUC__ >= 4
+# undef isnanf
+# define isnanf(x) __builtin_isnanf ((float)(x))
+#elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+#endif
+/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
+#ifdef __DECC
+static float
+NaN ()
+{
+ static float zero = 0.0f;
+ return zero / zero;
+}
+#else
+# define NaN() (0.0f / 0.0f)
+#endif
+#define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; float value; } memory_float;
+int main()
+{
+ memory_float m;
+
+ if (isnanf (1.0f / 0.0f))
+ return 1;
+
+ if (!isnanf (NaN ()))
+ return 1;
+
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+ /* The isnanf function should be immune against changes in the sign bit and
+ in the mantissa bits. The xor operation twiddles a bit that can only be
+ a sign bit or a mantissa bit. */
+ if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
+ {
+ m.value = NaN ();
+ /* Set the bits below the exponent to 01111...111. */
+ m.word[0] &= -1U << FLT_EXPBIT0_BIT;
+ m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
+ if (!isnanf (m.value))
+ return 1;
+ }
+#endif
+
+ return 0;
+}], [gl_cv_func_isnanf_works=yes], [gl_cv_func_isnanf_works=no],
+ [case "$host_os" in
+ irix* | solaris*) gl_cv_func_isnanf_works="guessing no";;
+ *) gl_cv_func_isnanf_works="guessing yes";;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib/m4/isnanl.m4 b/gnulib/m4/isnanl.m4
new file mode 100644
index 00000000..25daecae
--- /dev/null
+++ b/gnulib/m4/isnanl.m4
@@ -0,0 +1,245 @@
+# isnanl.m4 serial 12
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ISNANL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ ISNANL_LIBM=
+ gl_HAVE_ISNANL_NO_LIBM
+ if test $gl_cv_func_isnanl_no_libm = no; then
+ gl_HAVE_ISNANL_IN_LIBM
+ if test $gl_cv_func_isnanl_in_libm = yes; then
+ ISNANL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_isnanl_no_libm = yes \
+ || test $gl_cv_func_isnanl_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $ISNANL_LIBM"
+ gl_FUNC_ISNANL_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_isnanl_works" in
+ *yes) gl_func_isnanl=yes ;;
+ *) gl_func_isnanl=no; ISNANL_LIBM= ;;
+ esac
+ else
+ gl_func_isnanl=no
+ fi
+ if test $gl_func_isnanl != yes; then
+ HAVE_ISNANL=0
+ gl_BUILD_ISNANL
+ fi
+ AC_SUBST([ISNANL_LIBM])
+])
+
+AC_DEFUN([gl_FUNC_ISNANL_NO_LIBM],
+[
+ gl_HAVE_ISNANL_NO_LIBM
+ gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm
+ if test $gl_func_isnanl_no_libm = yes; then
+ gl_FUNC_ISNANL_WORKS
+ case "$gl_cv_func_isnanl_works" in
+ *yes) ;;
+ *) gl_func_isnanl_no_libm=no ;;
+ esac
+ fi
+ if test $gl_func_isnanl_no_libm = yes; then
+ AC_DEFINE([HAVE_ISNANL_IN_LIBC], [1],
+ [Define if the isnan(long double) function is available in libc.])
+ else
+ gl_BUILD_ISNANL
+ fi
+])
+
+dnl Pull in replacement isnanl definition. It does not need -lm.
+AC_DEFUN([gl_BUILD_ISNANL],
+[
+ AC_LIBOBJ([isnanl])
+ gl_LONG_DOUBLE_EXPONENT_LOCATION
+])
+
+dnl Test whether isnanl() can be used without libm.
+AC_DEFUN([gl_HAVE_ISNANL_NO_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(long double) can be used without linking with libm],
+ [gl_cv_func_isnanl_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ #if __GNUC__ >= 4
+ # undef isnanl
+ # define isnanl(x) __builtin_isnanl ((long double)(x))
+ #elif defined isnan
+ # undef isnanl
+ # define isnanl(x) isnan ((long double)(x))
+ #endif
+ long double x;],
+ [return isnanl (x);],
+ [gl_cv_func_isnanl_no_libm=yes],
+ [gl_cv_func_isnanl_no_libm=no])
+ ])
+])
+
+dnl Test whether isnanl() can be used with libm.
+AC_DEFUN([gl_HAVE_ISNANL_IN_LIBM],
+[
+ AC_CACHE_CHECK([whether isnan(long double) can be used with libm],
+ [gl_cv_func_isnanl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#include <math.h>
+ #if __GNUC__ >= 4
+ # undef isnanl
+ # define isnanl(x) __builtin_isnanl ((long double)(x))
+ #elif defined isnan
+ # undef isnanl
+ # define isnanl(x) isnan ((long double)(x))
+ #endif
+ long double x;],
+ [return isnanl (x);],
+ [gl_cv_func_isnanl_in_libm=yes],
+ [gl_cv_func_isnanl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+])
+
+dnl Test whether isnanl() recognizes all numbers which are neither finite nor
+dnl infinite. This test fails e.g. on NetBSD/i386 and on glibc/ia64.
+dnl Also, the GCC >= 4.0 built-in __builtin_isnanl does not pass the tests
+dnl - for pseudo-denormals on i686 and x86_64,
+dnl - for pseudo-zeroes, unnormalized numbers, and pseudo-denormals on ia64.
+AC_DEFUN([gl_FUNC_ISNANL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether isnanl works], [gl_cv_func_isnanl_works],
+ [
+ AC_TRY_RUN([
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#if __GNUC__ >= 4
+# undef isnanl
+# define isnanl(x) __builtin_isnanl ((long double)(x))
+#elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+#endif
+#define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; long double value; }
+ memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+ runtime type conversion. */
+#ifdef __sgi
+static long double NaNl ()
+{
+ double zero = 0.0;
+ return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
+int main ()
+{
+ memory_long_double m;
+ unsigned int i;
+
+ if (!isnanl (NaNl ()))
+ return 1;
+
+ /* The isnanl function should be immune against changes in the sign bit and
+ in the mantissa bits. The xor operation twiddles a bit that can only be
+ a sign bit or a mantissa bit (since the exponent never extends to
+ bit 31). */
+ m.value = NaNl ();
+ m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+ for (i = 0; i < NWORDS; i++)
+ m.word[i] |= 1;
+ if (!isnanl (m.value))
+ return 1;
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ if (!isnanl (x.value))
+ return 1;
+ }
+ {
+ /* Signalling NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ if (!isnanl (x.value))
+ return 1;
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ if (!isnanl (x.value))
+ return 1;
+ }
+ { /* Pseudo-Infinity. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ if (!isnanl (x.value))
+ return 1;
+ }
+ { /* Pseudo-Zero. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ if (!isnanl (x.value))
+ return 1;
+ }
+ { /* Unnormalized number. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ if (!isnanl (x.value))
+ return 1;
+ }
+ { /* Pseudo-Denormal. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ if (!isnanl (x.value))
+ return 1;
+ }
+#endif
+
+ return 0;
+}], [gl_cv_func_isnanl_works=yes], [gl_cv_func_isnanl_works=no],
+ [case "$host_cpu" in
+ # Guess no on ia64, x86_64, i386.
+ ia64 | x86_64 | i*86) gl_cv_func_isnanl_works="guessing no";;
+ *)
+ case "$host_os" in
+ netbsd*) gl_cv_func_isnanl_works="guessing no";;
+ *) gl_cv_func_isnanl_works="guessing yes";;
+ esac
+ ;;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib/m4/javacomp.m4 b/gnulib/m4/javacomp.m4
new file mode 100644
index 00000000..bbca6183
--- /dev/null
+++ b/gnulib/m4/javacomp.m4
@@ -0,0 +1,637 @@
+# javacomp.m4 serial 12
+dnl Copyright (C) 2001-2003, 2006-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prerequisites of javacomp.sh.
+# gt_JAVACOMP([source-version], [target-version])
+# Sets HAVE_JAVACOMP to nonempty if javacomp.sh will allow Java source code
+# according to source-version to be compiled to Java bytecode classes in the
+# target-version format.
+#
+# source-version can be: support for
+# 1.3 inner classes
+# 1.4 assert keyword
+# 1.5 generic classes and methods
+# 1.6 (not yet supported)
+#
+# target-version can be: classfile version:
+# 1.1 45.3
+# 1.2 46.0
+# 1.3 47.0
+# 1.4 48.0
+# 1.5 49.0
+# 1.6 50.0
+# The classfile version of a .class file can be determined through the "file"
+# command. More portably, the classfile major version can be determined through
+# "od -A n -t d1 -j 7 -N 1 classfile".
+# target-version can also be omitted. In this case, the required target-version
+# is determined from the found JVM (see macro gt_JAVAEXEC):
+# target-version for JVM
+# 1.1 JDK 1.1, jview
+# 1.2 JDK/JRE 1.2
+# 1.3 JDK/JRE 1.3, gij 3.3, 3.4
+# 1.4 JDK/JRE 1.4, gij 4.0, 4.1
+# 1.5 JDK/JRE 1.5
+# 1.6 JDK/JRE 1.6
+# Note: gij >= 3.3 can in some cases handle classes compiled with -target 1.4,
+# and gij >= 4.1 can in some cases partially handle classes compiled with
+# -target 1.5, but I have no idea how complete this support is.
+#
+# Specifying target-version is useful when building a library (.jar) that is
+# useful outside the given package. Omitting target-version is useful when
+# building an application.
+#
+# It is unreasonable to ask for:
+# - target-version < 1.4 with source-version >= 1.4, or
+# - target-version < 1.5 with source-version >= 1.5, or
+# - target-version < 1.6 with source-version >= 1.6,
+# because even Sun's javac doesn't support these combinations.
+#
+# It is redundant to ask for a target-version > source-version, since the
+# smaller target-version = source-version will also always work and newer JVMs
+# support the older target-versions too. Except for the case
+# target-version = 1.4, source-version = 1.3, which allows gcj versions 3.0
+# to 3.2 to be used.
+
+AC_DEFUN([gt_JAVACOMP],
+[
+ ifelse([$2], [], [AC_REQUIRE([gt_JAVAEXEC])], [])
+ AC_EGREP_CPP([yes], [
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ yes
+#endif
+], CLASSPATH_SEPARATOR=';', CLASSPATH_SEPARATOR=':')
+ source_version=$1
+ test -n "$source_version" || {
+ AC_MSG_ERROR([missing source-version argument to gt_@&t@JAVACOMP])
+ }
+ ifelse([$2], [],
+ [if test -n "$HAVE_JAVAEXEC"; then
+ dnl Use $CONF_JAVA to determine the JVM's version.
+changequote(,)dnl
+ cat > conftestver.java <<EOF
+public class conftestver {
+ public static void main (String[] args) {
+ System.out.println(System.getProperty("java.specification.version"));
+ }
+}
+EOF
+changequote([,])dnl
+ dnl A precompiled version of conftestver.java, compiled with
+ dnl "javac -target 1.1". This avoids having to compile conftestver.java
+ dnl during each test for a suitable Java compiler.
+ dnl For the conversion from binary to this ASCII encapsulation, avoiding
+ dnl to assume the presence of uudecode, use the command
+ dnl $ od -A n -t o1 < conftestver.class | tr ' ' '\012'| sort | uniq | sed -e '/^$/d' -e 's,^,\\,' | tr -d '\012'
+ dnl and the long tr command in opposite direction.
+ dnl Finally move the position corresponding to \055 to the last position,
+ dnl to work around a coreutils-5.x bug.
+ echo 'yzwx!$!I!D,!)!3+!4!5*!6,!4!7,!8!9)!:)!;"!(MeienN"!$FGW"!%Ojab"!2QeibRohZblVYZgb"!%hYei"!9FXQfYpYKgYidKUnleidLGW"!,Ujol_bPegb"!3_jicnbmnpblJfYpY/!*!+)!</!=!>"!=fYpYJmkb_ece_YnejiJpblmeji/!?!@)!A/!B!C"!._jicnbmnpbl"!3fYpYKgYidKSZfb_n"!3fYpYKgYidKUqmnbh"!$jon"!8QfYpYKejKTleinUnlbYhL"!.dbnTljkblnq"!EFQfYpYKgYidKUnleidLGQfYpYKgYidKUnleidL"!6fYpYKejKTleinUnlbYh"!)kleingi"!8FQfYpYKgYidKUnleidLGW!D!(!)!!!!!#!"!*!+!"!,!!!@!"!"!!!&Hu!"r!!!"!.!!!(!"!!!"!+!/!0!"!,!!!F!#!"!!!/s!#5$v!%t!&r!!!"!.!!!,!#!!!$!.!%!"!1!!!#!2' \
+ | tr -d '\012\015' \
+ | tr '!"#$%&()*+,./0123456789:;<=>?@ABCDEFGHJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzI' '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\046\050\051\052\056\057\073\074\076\103\106\114\116\117\120\123\124\126\133\141\142\143\144\145\146\147\151\152\154\155\156\157\160\162\163\164\165\166\171\261\262\266\267\270\272\276\312\376\055' \
+ > conftestver.class
+ target_version=`{
+ unset JAVA_HOME
+ echo "$as_me:__oline__: CLASSPATH=.${CLASSPATH:+$CLASSPATH_SEPARATOR$CLASSPATH} $CONF_JAVA conftestver" >&AS_MESSAGE_LOG_FD
+ CLASSPATH=.${CLASSPATH:+$CLASSPATH_SEPARATOR$CLASSPATH} $CONF_JAVA conftestver 2>&AS_MESSAGE_LOG_FD
+ }`
+ case "$target_version" in
+ 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6) ;;
+ null)
+ dnl JDK 1.1.X returns null.
+ target_version=1.1 ;;
+ *) AC_MSG_WARN([unknown target-version $target_version, please update gt_@&t@JAVACOMP macro])
+ target_version=1.1 ;;
+ esac
+ else
+ target_version="1.1"
+ fi
+ ],
+ [target_version=$2])
+ case "$source_version" in
+ 1.3) goodcode='class conftest {}'
+ failcode='class conftestfail { static { assert(true); } }' ;;
+ 1.4) goodcode='class conftest { static { assert(true); } }'
+ failcode='class conftestfail<T> { T foo() { return null; } }' ;;
+ 1.5) goodcode='class conftest<T> { T foo() { return null; } }'
+ failcode='class conftestfail syntax error' ;;
+ *) AC_MSG_ERROR([invalid source-version argument to gt_@&t@JAVACOMP: $source_version]) ;;
+ esac
+ case "$target_version" in
+ 1.1) cfversion=45 ;;
+ 1.2) cfversion=46 ;;
+ 1.3) cfversion=47 ;;
+ 1.4) cfversion=48 ;;
+ 1.5) cfversion=49 ;;
+ 1.6) cfversion=50 ;;
+ *) AC_MSG_ERROR([invalid target-version argument to gt_@&t@JAVACOMP: $target_version]) ;;
+ esac
+ # Function to output the classfile version of a file (8th byte) in decimal.
+ if od -A x < /dev/null >/dev/null 2>/dev/null; then
+ # Use POSIX od.
+ func_classfile_version ()
+ {
+ od -A n -t d1 -j 7 -N 1 "[$]1"
+ }
+ else
+ # Use BSD hexdump.
+ func_classfile_version ()
+ {
+ dd if="[$]1" bs=1 count=1 skip=7 2>/dev/null | hexdump -e '1/1 "%3d "'
+ echo
+ }
+ fi
+ AC_MSG_CHECKING([for Java compiler])
+ dnl
+ dnl The support of GNU gcj for target-version and source-version:
+ dnl
+ dnl gcj 3.0.4 to 4.2 does not have a way to specify the target-version.
+ dnl It always assumes target-version=1.4 but labels the class files as 1.1.
+ dnl One consequence of this is that gcj compiles GetURL.java to invalid
+ dnl bytecode, which crashes with a VerifyError when executed by Sun Java
+ dnl 1.3.1. The bug is registered as java/7066, see
+ dnl http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7066
+ dnl gcj 4.3 and newer has an option -ftarget=1.X.
+ dnl
+ dnl For gcj < 3.3, the source-version always is 1.3.
+ dnl For 3.3 <= gcj < 4.3, the source-version defaults to 1.4; option
+ dnl "-fno-assert" switches to source-version 1.3.
+ dnl gcj >= 4.3 has an option -fsource=1.X.
+ dnl
+ dnl The support of Sun javac for target-version and source-version:
+ dnl
+ dnl javac 1.3: -target 1.1 1.2 1.3 default: 1.1
+ dnl source always: 1.3
+ dnl
+ dnl javac 1.4: -target 1.1 1.2 1.3 1.4 default: 1.2
+ dnl -source 1.3 1.4 default: 1.3
+ dnl -target 1.1/1.2/1.3 only possible with -source 1.3 or no -source
+ dnl
+ dnl javac 1.5: -target 1.1 1.2 1.3 1.4 1.5 default: 1.5
+ dnl -source 1.3 1.4 1.5 default: 1.5
+ dnl -target 1.1/1.2/1.3 only possible with -source 1.3
+ dnl -target 1.4 only possible with -source 1.3/1.4
+ dnl
+ dnl javac 1.6: -target 1.1 1.2 1.3 1.4 1.5 1.6 default: 1.6
+ dnl -source 1.3 1.4 1.5 1.6 default: 1.5
+ dnl -target 1.1/1.2/1.3 only possible with -source 1.3
+ dnl -target 1.4 only possible with -source 1.3/1.4
+ dnl -target 1.5 only possible with -source 1.3/1.4/1.5 or no -source
+ dnl
+ dnl The support of jikes for target-version and source-version:
+ dnl
+ dnl jikes 1.14 does not have a way to specify the target-version. It
+ dnl always assumes target-version=1.1.
+ dnl
+ dnl For jikes 1.14, the source-version always is 1.3.
+ dnl
+ CONF_JAVAC=
+ HAVE_JAVAC_ENVVAR=
+ HAVE_GCJ_C=
+ HAVE_JAVAC=
+ HAVE_JIKES=
+ HAVE_JAVACOMP=
+changequote(,)dnl
+ cat > conftestlib.java <<EOF
+public class conftestlib {
+ public static void main (String[] args) {
+ }
+}
+EOF
+changequote([,])dnl
+ echo "$goodcode" > conftest.java
+ echo "$failcode" > conftestfail.java
+ dnl If the user has set the JAVAC environment variable, use that, if it
+ dnl satisfies the constraints (possibly after adding -target and -source
+ dnl options).
+ if test -n "$JAVAC"; then
+ dnl Try the original $JAVAC.
+ if $JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null; then
+ dnl It's a version of gcj.
+changequote(,)dnl
+ if $JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
+changequote([,])dnl
+ dnl It's a version of gcj >= 4.3. Assume the classfile versions are correct.
+ dnl Try $JAVAC.
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ dnl Try adding -fsource option if it is useful.
+ rm -f conftest.class
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -fsource="$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
+ && { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftestfail.class \
+ && ! { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -fsource="$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ }; then
+ CONF_JAVAC="$JAVAC -fsource=$source_version"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ else
+ CONF_JAVAC="$JAVAC"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ else
+ dnl Try with -fsource and -ftarget options.
+ rm -f conftest.class
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ CONF_JAVAC="$JAVAC -fsource=$source_version -ftarget=$target_version"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ fi
+ else
+ dnl It's a version of gcj < 4.3. Ignore the version of conftest.class.
+ if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
+ dnl Try $JAVAC.
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class; then
+ CONF_JAVAC="$JAVAC"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ else
+ if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
+ dnl Try $JAVAC and "$JAVAC -fno-assert". But add -fno-assert only if
+ dnl it makes a difference. (It could already be part of $JAVAC.)
+ javac_works=
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class; then
+ javac_works=1
+ fi
+ javac_noassert_works=
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: $JAVAC -fno-assert -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -fno-assert -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class; then
+ javac_noassert_works=1
+ fi
+ if test -n "$javac_works" && test -n "$javac_noassert_works"; then
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftestfail.class \
+ && ! { echo "$as_me:__oline__: $JAVAC -fno-assert -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -fno-assert -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ }; then
+ dnl "$JAVAC -fno-assert" works better than $JAVAC.
+ javac_works=
+ fi
+ fi
+ if test -n "$javac_works"; then
+ CONF_JAVAC="$JAVAC"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ else
+ if test -n "$javac_noassert_works"; then
+ CONF_JAVAC="$JAVAC -fno-assert"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ fi
+ fi
+ fi
+ fi
+ else
+ dnl It's not gcj. Assume the classfile versions are correct.
+ dnl Try $JAVAC.
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ dnl Try adding -source option if it is useful.
+ rm -f conftest.class
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: $JAVAC -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
+ && { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftestfail.class \
+ && ! { echo "$as_me:__oline__: $JAVAC -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ }; then
+ CONF_JAVAC="$JAVAC -source $source_version"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ else
+ CONF_JAVAC="$JAVAC"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ else
+ dnl Try with -target option alone. (Sun javac 1.3.1 has the -target
+ dnl option but no -source option.)
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: $JAVAC -target $target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -target "$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ dnl Try adding -source option if it is useful.
+ rm -f conftest.class
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
+ && { echo "$as_me:__oline__: $JAVAC -target $target_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -target "$target_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftestfail.class \
+ && ! { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -target "$target_version" -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ }; then
+ CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ else
+ CONF_JAVAC="$JAVAC -target $target_version"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ else
+ dnl Maybe this -target option requires a -source option? Try with
+ dnl -target and -source options. (Supported by Sun javac 1.4 and
+ dnl higher.)
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -z "$HAVE_JAVACOMP"; then
+ pushdef([AC_MSG_CHECKING],[:])dnl
+ pushdef([AC_CHECKING],[:])dnl
+ pushdef([AC_MSG_RESULT],[:])dnl
+ AC_CHECK_PROG([HAVE_GCJ_IN_PATH], [gcj], [yes])
+ AC_CHECK_PROG([HAVE_JAVAC_IN_PATH], [javac], [yes])
+ AC_CHECK_PROG([HAVE_JIKES_IN_PATH], [jikes], [yes])
+ popdef([AC_MSG_RESULT])dnl
+ popdef([AC_CHECKING])dnl
+ popdef([AC_MSG_CHECKING])dnl
+ if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_GCJ_IN_PATH"; then
+ dnl Test for a good gcj version (>= 3.0).
+changequote(,)dnl
+ if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null; then
+changequote([,])dnl
+ dnl See if libgcj.jar is well installed.
+ if { echo "$as_me:__oline__: gcj -C -d . conftestlib.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -d . conftestlib.java >&AS_MESSAGE_LOG_FD 2>&1
+ }; then
+ dnl OK, gcj works.
+changequote(,)dnl
+ if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
+changequote([,])dnl
+ dnl It's a version of gcj >= 4.3. Assume the classfile versions are correct.
+ dnl Try gcj.
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ dnl Try adding -fsource option if it is useful.
+ rm -f conftest.class
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: gcj -C -fsource=$source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -fsource="$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
+ && { echo "$as_me:__oline__: gcj -C -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftestfail.class \
+ && ! { echo "$as_me:__oline__: gcj -C -fsource=$source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -fsource="$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ }; then
+ CONF_JAVAC="gcj -C -fsource=$source_version"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ else
+ CONF_JAVAC="gcj -C"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ else
+ dnl Try with -fsource and -ftarget options.
+ rm -f conftest.class
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: gcj -C -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ CONF_JAVAC="gcj -C -fsource=$source_version -ftarget=$target_version"
+ HAVE_JAVAC_ENVVAR=1
+ HAVE_JAVACOMP=1
+ fi
+ fi
+ else
+ dnl It's a version of gcj < 4.3. Ignore the version of conftest.class.
+ dnl Now test whether it supports the desired target-version and
+ dnl source-version.
+ if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class; then
+ CONF_JAVAC="gcj -C"
+ HAVE_GCJ_C=1
+ HAVE_JAVACOMP=1
+ fi
+ else
+ if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
+ dnl Try gcj and "gcj -fno-assert". But add -fno-assert only if
+ dnl it works (not gcj < 3.3).
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: gcj -C -fno-assert -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -fno-assert -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class; then
+ CONF_JAVAC="gcj -C -fno-assert"
+ HAVE_GCJ_C=1
+ HAVE_JAVACOMP=1
+ else
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class; then
+ CONF_JAVAC="gcj -C"
+ HAVE_GCJ_C=1
+ HAVE_JAVACOMP=1
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JAVAC_IN_PATH"; then
+ dnl Test whether javac is usable.
+ if { javac -version >/dev/null 2>/dev/null || test $? -le 2; } \
+ && ( if javac -help 2>&1 >/dev/null | grep at.dms.kjc.Main >/dev/null && javac -help 2>/dev/null | grep 'released.*2000' >/dev/null ; then exit 1; else exit 0; fi ); then
+ dnl OK, javac works.
+ dnl Now test whether it supports the desired target-version and
+ dnl source-version.
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: javac -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ javac -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ dnl Try adding -source option if it is useful.
+ rm -f conftest.class
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: javac -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ javac -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
+ && { echo "$as_me:__oline__: javac -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ javac -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftestfail.class \
+ && ! { echo "$as_me:__oline__: javac -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ javac -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ }; then
+ CONF_JAVAC="javac -source $source_version"
+ HAVE_JAVAC=1
+ HAVE_JAVACOMP=1
+ else
+ CONF_JAVAC="javac"
+ HAVE_JAVAC=1
+ HAVE_JAVACOMP=1
+ fi
+ else
+ dnl Try with -target option alone. (Sun javac 1.3.1 has the -target
+ dnl option but no -source option.)
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: javac -target $target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ javac -target "$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ dnl Try adding -source option if it is useful.
+ rm -f conftest.class
+ rm -f conftestfail.class
+ if { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ javac -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
+ && { echo "$as_me:__oline__: javac -target $target_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ javac -target "$target_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftestfail.class \
+ && ! { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
+ javac -target "$target_version" -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
+ }; then
+ CONF_JAVAC="javac -target $target_version -source $source_version"
+ HAVE_JAVAC=1
+ HAVE_JAVACOMP=1
+ else
+ CONF_JAVAC="javac -target $target_version"
+ HAVE_JAVAC=1
+ HAVE_JAVACOMP=1
+ fi
+ else
+ dnl Maybe this -target option requires a -source option? Try with
+ dnl -target and -source options. (Supported by Sun javac 1.4 and
+ dnl higher.)
+ rm -f conftest.class
+ if { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
+ javac -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
+ } \
+ && test -f conftest.class \
+ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
+ CONF_JAVAC="javac -target $target_version -source $source_version"
+ HAVE_JAVAC=1
+ HAVE_JAVACOMP=1
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JIKES_IN_PATH"; then
+ dnl Test whether jikes is usable.
+ if { jikes >/dev/null 2>/dev/null || test $? = 1; } \
+ && (
+ # See if the existing CLASSPATH is sufficient to make jikes work.
+ unset JAVA_HOME
+ jikes conftestlib.java >&AS_MESSAGE_LOG_FD 2>&1
+ error=$?
+ rm -f conftestlib.class
+ exit $error
+ ); then
+ dnl OK, jikes works.
+ dnl Now test whether it supports the desired target-version and
+ dnl source-version.
+ if test "$source_version" = 1.3; then
+ CONF_JAVAC="jikes"
+ HAVE_JIKES=1
+ HAVE_JAVACOMP=1
+ fi
+ fi
+ fi
+ fi
+ rm -f conftest*.java conftest*.class
+ if test -n "$HAVE_JAVACOMP"; then
+ ac_result="$CONF_JAVAC"
+ else
+ ac_result="no"
+ fi
+ AC_MSG_RESULT([$ac_result])
+ AC_SUBST([CONF_JAVAC])
+ AC_SUBST([CLASSPATH])
+ AC_SUBST([CLASSPATH_SEPARATOR])
+ AC_SUBST([HAVE_JAVAC_ENVVAR])
+ AC_SUBST([HAVE_GCJ_C])
+ AC_SUBST([HAVE_JAVAC])
+ AC_SUBST([HAVE_JIKES])
+])
diff --git a/gnulib/m4/javaexec.m4 b/gnulib/m4/javaexec.m4
new file mode 100644
index 00000000..21d7464f
--- /dev/null
+++ b/gnulib/m4/javaexec.m4
@@ -0,0 +1,104 @@
+# javaexec.m4 serial 5
+dnl Copyright (C) 2001-2003, 2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prerequisites of javaexec.sh.
+# gt_JAVAEXEC or gt_JAVAEXEC(testclass, its-directory)
+# Sets HAVE_JAVAEXEC to nonempty if javaexec.sh will work.
+
+AC_DEFUN([gt_JAVAEXEC],
+[
+ AC_MSG_CHECKING([for Java virtual machine])
+ AC_EGREP_CPP([yes], [
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ yes
+#endif
+], CLASSPATH_SEPARATOR=';', CLASSPATH_SEPARATOR=':')
+ CONF_JAVA=
+ HAVE_JAVA_ENVVAR=
+ HAVE_GIJ=
+ HAVE_JAVA=
+ HAVE_JRE=
+ HAVE_JVIEW=
+ HAVE_JAVAEXEC=1
+ if test -n "$JAVA"; then
+ HAVE_JAVA_ENVVAR=1
+ CONF_JAVA="$JAVA"
+ else
+ pushdef([AC_MSG_CHECKING],[:])dnl
+ pushdef([AC_CHECKING],[:])dnl
+ pushdef([AC_MSG_RESULT],[:])dnl
+ AC_CHECK_PROG([HAVE_GIJ_IN_PATH], [gij], [yes])
+ AC_CHECK_PROG([HAVE_JAVA_IN_PATH], [java], [yes])
+ AC_CHECK_PROG([HAVE_JRE_IN_PATH], [jre], [yes])
+ AC_CHECK_PROG([HAVE_JVIEW_IN_PATH], [jview], [yes])
+ popdef([AC_MSG_RESULT])dnl
+ popdef([AC_CHECKING])dnl
+ popdef([AC_MSG_CHECKING])dnl
+ ifelse([$1], , , [
+ save_CLASSPATH="$CLASSPATH"
+ CLASSPATH="$2"${CLASSPATH+"$CLASSPATH_SEPARATOR$CLASSPATH"}
+ ])
+ export CLASSPATH
+ if test -n "$HAVE_GIJ_IN_PATH" \
+ && gij --version >/dev/null 2>/dev/null \
+ ifelse([$1], , , [&& {
+ echo "$as_me:__oline__: gij $1" >&AS_MESSAGE_LOG_FD
+ gij $1 >&AS_MESSAGE_LOG_FD 2>&1
+ }]); then
+ HAVE_GIJ=1
+ CONF_JAVA="gij"
+ else
+ if test -n "$HAVE_JAVA_IN_PATH" \
+ && java -version >/dev/null 2>/dev/null \
+ ifelse([$1], , , [&& {
+ echo "$as_me:__oline__: gij $1" >&AS_MESSAGE_LOG_FD
+ java $1 >&AS_MESSAGE_LOG_FD 2>&1
+ }]); then
+ HAVE_JAVA=1
+ CONF_JAVA="java"
+ else
+ if test -n "$HAVE_JRE_IN_PATH" \
+ && (jre >/dev/null 2>/dev/null || test $? = 1) \
+ ifelse([$1], , , [&& {
+ echo "$as_me:__oline__: gij $1" >&AS_MESSAGE_LOG_FD
+ jre $1 >&AS_MESSAGE_LOG_FD 2>&1
+ }]); then
+ HAVE_JRE=1
+ CONF_JAVA="jre"
+ else
+ if test -n "$HAVE_JVIEW_IN_PATH" \
+ && (jview -? >/dev/null 2>/dev/null || test $? = 1) \
+ ifelse([$1], , , [&& {
+ echo "$as_me:__oline__: gij $1" >&AS_MESSAGE_LOG_FD
+ jview $1 >&AS_MESSAGE_LOG_FD 2>&1
+ }]); then
+ HAVE_JVIEW=1
+ CONF_JAVA="jview"
+ else
+ HAVE_JAVAEXEC=
+ fi
+ fi
+ fi
+ fi
+ ifelse([$1], , , [
+ CLASSPATH="$save_CLASSPATH"
+ ])
+ fi
+ if test -n "$HAVE_JAVAEXEC"; then
+ ac_result="$CONF_JAVA"
+ else
+ ac_result="no"
+ fi
+ AC_MSG_RESULT([$ac_result])
+ AC_SUBST([CONF_JAVA])
+ AC_SUBST([CLASSPATH])
+ AC_SUBST([CLASSPATH_SEPARATOR])
+ AC_SUBST([HAVE_JAVA_ENVVAR])
+ AC_SUBST([HAVE_GIJ])
+ AC_SUBST([HAVE_JAVA])
+ AC_SUBST([HAVE_JRE])
+ AC_SUBST([HAVE_JVIEW])
+])
diff --git a/gnulib/m4/jm-winsz1.m4 b/gnulib/m4/jm-winsz1.m4
new file mode 100644
index 00000000..6a7a61e4
--- /dev/null
+++ b/gnulib/m4/jm-winsz1.m4
@@ -0,0 +1,48 @@
+# serial 11
+
+# Copyright (C) 1996, 1999, 2001-2002, 2004, 2006, 2009-2010 Free Software
+# Foundation, Inc.
+# This file 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.
+
+dnl From Jim Meyering and Paul Eggert.
+AC_DEFUN([gl_HEADER_TIOCGWINSZ_IN_TERMIOS_H],
+[AC_REQUIRE([AC_SYS_POSIX_TERMIOS])
+ AC_CACHE_CHECK([whether use of TIOCGWINSZ requires termios.h],
+ gl_cv_sys_tiocgwinsz_needs_termios_h,
+ [gl_cv_sys_tiocgwinsz_needs_termios_h=no
+
+ if test $ac_cv_sys_posix_termios = yes; then
+ AC_EGREP_CPP([yes],
+ [#include <sys/types.h>
+# include <termios.h>
+# ifdef TIOCGWINSZ
+ yes
+# endif
+ ], gl_cv_sys_tiocgwinsz_needs_termios_h=yes)
+ fi
+ ])
+])
+
+AC_DEFUN([gl_WINSIZE_IN_PTEM],
+ [AC_REQUIRE([AC_SYS_POSIX_TERMIOS])
+ AC_CACHE_CHECK([whether use of struct winsize requires sys/ptem.h],
+ gl_cv_sys_struct_winsize_needs_sys_ptem_h,
+ [gl_cv_sys_struct_winsize_needs_sys_ptem_h=yes
+ if test $ac_cv_sys_posix_termios = yes; then
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <termios.h>]],
+ [[struct winsize x;
+ if (sizeof x > 0) return 0;]])],
+ [gl_cv_sys_struct_winsize_needs_sys_ptem_h=no])
+ fi
+ if test $gl_cv_sys_struct_winsize_needs_sys_ptem_h = yes; then
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/ptem.h>]],
+ [[struct winsize x;
+ if (sizeof x > 0) return 0;]])],
+ [], [gl_cv_sys_struct_winsize_needs_sys_ptem_h=no])
+ fi])
+ if test $gl_cv_sys_struct_winsize_needs_sys_ptem_h = yes; then
+ AC_DEFINE([WINSIZE_IN_PTEM], [1],
+ [Define if sys/ptem.h is required for struct winsize.])
+ fi])
diff --git a/gnulib/m4/jm-winsz2.m4 b/gnulib/m4/jm-winsz2.m4
new file mode 100644
index 00000000..3d06c311
--- /dev/null
+++ b/gnulib/m4/jm-winsz2.m4
@@ -0,0 +1,29 @@
+# serial 7
+
+# Copyright (C) 1996, 1999, 2001, 2004, 2009-2010 Free Software Foundation,
+# Inc.
+# This file 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.
+
+AC_DEFUN([gl_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL],
+[AC_REQUIRE([gl_HEADER_TIOCGWINSZ_IN_TERMIOS_H])
+ AC_CACHE_CHECK([whether use of TIOCGWINSZ requires sys/ioctl.h],
+ gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h,
+ [gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h=no
+
+ if test $gl_cv_sys_tiocgwinsz_needs_termios_h = no; then
+ AC_EGREP_CPP([yes],
+ [#include <sys/types.h>
+# include <sys/ioctl.h>
+# ifdef TIOCGWINSZ
+ yes
+# endif
+ ], gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h=yes)
+ fi
+ ])
+ if test $gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h = yes; then
+ AC_DEFINE([GWINSZ_IN_SYS_IOCTL], [1],
+ [Define if your system defines TIOCGWINSZ in sys/ioctl.h.])
+ fi
+])
diff --git a/gnulib/m4/langinfo_h.m4 b/gnulib/m4/langinfo_h.m4
new file mode 100644
index 00000000..a4c5409d
--- /dev/null
+++ b/gnulib/m4/langinfo_h.m4
@@ -0,0 +1,74 @@
+# langinfo_h.m4 serial 3
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_LANGINFO_H],
+[
+ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS])
+
+ dnl Persuade glibc-2.0.6 <langinfo.h> to define CODESET.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ gl_CHECK_NEXT_HEADERS([langinfo.h])
+
+ dnl Determine whether <langinfo.h> exists. It is missing on mingw and BeOS.
+ HAVE_LANGINFO_CODESET=0
+ HAVE_LANGINFO_ERA=0
+ AC_CHECK_HEADERS_ONCE([langinfo.h])
+ if test $ac_cv_header_langinfo_h = yes; then
+ HAVE_LANGINFO_H=1
+ dnl Determine what <langinfo.h> defines. CODESET and ERA etc. are missing
+ dnl on OpenBSD 3.8.
+ AC_CACHE_CHECK([whether langinfo.h defines CODESET],
+ [gl_cv_header_langinfo_codeset],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <langinfo.h>
+int a = CODESET;
+]])],
+ [gl_cv_header_langinfo_codeset=yes],
+ [gl_cv_header_langinfo_codeset=no])
+ ])
+ if test $gl_cv_header_langinfo_codeset = yes; then
+ HAVE_LANGINFO_CODESET=1
+ fi
+ AC_CACHE_CHECK([whether langinfo.h defines ERA],
+ [gl_cv_header_langinfo_era],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <langinfo.h>
+int a = ERA;
+]])],
+ [gl_cv_header_langinfo_era=yes],
+ [gl_cv_header_langinfo_era=no])
+ ])
+ if test $gl_cv_header_langinfo_era = yes; then
+ HAVE_LANGINFO_ERA=1
+ fi
+ else
+ HAVE_LANGINFO_H=0
+ fi
+ AC_SUBST([HAVE_LANGINFO_H])
+ AC_SUBST([HAVE_LANGINFO_CODESET])
+ AC_SUBST([HAVE_LANGINFO_ERA])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <langinfo.h>
+ ]], [nl_langinfo])
+])
+
+AC_DEFUN([gl_LANGINFO_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_LANGINFO_H_DEFAULTS],
+[
+ GNULIB_NL_LANGINFO=0; AC_SUBST([GNULIB_NL_LANGINFO])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_NL_LANGINFO=1; AC_SUBST([HAVE_NL_LANGINFO])
+ REPLACE_NL_LANGINFO=0; AC_SUBST([REPLACE_NL_LANGINFO])
+])
diff --git a/gnulib/m4/lchmod.m4 b/gnulib/m4/lchmod.m4
new file mode 100644
index 00000000..96d9ce58
--- /dev/null
+++ b/gnulib/m4/lchmod.m4
@@ -0,0 +1,22 @@
+#serial 3
+
+dnl Copyright (C) 2005-2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+dnl Provide a replacement for lchmod on hosts that lack it.
+
+AC_DEFUN([gl_FUNC_LCHMOD],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+
+ dnl Persuade glibc <sys/stat.h> to declare lchmod().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([lchmod])
+ if test $ac_cv_func_lchmod = no; then
+ HAVE_LCHMOD=0
+ fi
+])
diff --git a/gnulib/m4/lchown.m4 b/gnulib/m4/lchown.m4
new file mode 100644
index 00000000..646dd9f3
--- /dev/null
+++ b/gnulib/m4/lchown.m4
@@ -0,0 +1,29 @@
+# serial 15
+# Determine whether we need the lchown wrapper.
+
+dnl Copyright (C) 1998, 2001, 2003-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Jim Meyering.
+dnl Provide lchown on systems that lack it, and work around bugs
+dnl on systems that have it.
+
+AC_DEFUN([gl_FUNC_LCHOWN],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_CHOWN])
+ AC_CHECK_FUNCS_ONCE([lchmod])
+ AC_REPLACE_FUNCS([lchown])
+ if test $ac_cv_func_lchown = no; then
+ HAVE_LCHOWN=0
+ elif test "$gl_cv_func_chown_slash_works" != yes \
+ || test "$gl_cv_func_chown_ctime_works" != yes; then
+ dnl Trailing slash and ctime bugs in chown also occur in lchown.
+ AC_LIBOBJ([lchown])
+ REPLACE_LCHOWN=1
+ fi
+])
diff --git a/gnulib/m4/lcmessage.m4 b/gnulib/m4/lcmessage.m4
new file mode 100644
index 00000000..1a705431
--- /dev/null
+++ b/gnulib/m4/lcmessage.m4
@@ -0,0 +1,31 @@
+# lcmessage.m4 serial 6 (gettext-0.18)
+dnl Copyright (C) 1995-2002, 2004-2005, 2008-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([gt_LC_MESSAGES],
+[
+ AC_CACHE_CHECK([for LC_MESSAGES], [gt_cv_val_LC_MESSAGES],
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ [gt_cv_val_LC_MESSAGES=yes], [gt_cv_val_LC_MESSAGES=no])])
+ if test $gt_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE([HAVE_LC_MESSAGES], [1],
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+])
diff --git a/gnulib/m4/ld-output-def.m4 b/gnulib/m4/ld-output-def.m4
new file mode 100644
index 00000000..2dc6bf52
--- /dev/null
+++ b/gnulib/m4/ld-output-def.m4
@@ -0,0 +1,29 @@
+# ld-output-def.m4 serial 2
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson
+
+# gl_LD_OUTPUT_DEF()
+# -------------
+# Check if linker supports -Wl,--output-def and define automake
+# conditional HAVE_LD_OUTPUT_DEF if it is.
+AC_DEFUN([gl_LD_OUTPUT_DEF],
+[
+ AC_CACHE_CHECK([if gcc/ld supports -Wl,--output-def],
+ [gl_cv_ld_output_def],
+ [if test "$enable_shared" = no; then
+ gl_cv_ld_output_def="not needed, shared libraries are disabled"
+ else
+ gl_ldflags_save=$LDFLAGS
+ LDFLAGS="-Wl,--output-def,conftest.def"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
+ [gl_cv_ld_output_def=yes],
+ [gl_cv_ld_output_def=no])
+ rm -f conftest.def
+ LDFLAGS="$gl_ldflags_save"
+ fi])
+ AM_CONDITIONAL([HAVE_LD_OUTPUT_DEF], test "x$gl_cv_ld_output_def" = "xyes")
+])
diff --git a/gnulib/m4/ld-version-script.m4 b/gnulib/m4/ld-version-script.m4
new file mode 100644
index 00000000..43c1ef12
--- /dev/null
+++ b/gnulib/m4/ld-version-script.m4
@@ -0,0 +1,44 @@
+# ld-version-script.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson
+
+# FIXME: The test below returns a false positive for mingw
+# cross-compiles, 'local:' statements does not reduce number of
+# exported symbols in a DLL. Use --disable-ld-version-script to work
+# around the problem.
+
+# gl_LD_VERSION_SCRIPT
+# --------------------
+# Check if LD supports linker scripts, and define automake conditional
+# HAVE_LD_VERSION_SCRIPT if so.
+AC_DEFUN([gl_LD_VERSION_SCRIPT],
+[
+ AC_ARG_ENABLE([ld-version-script],
+ AS_HELP_STRING([--enable-ld-version-script],
+ [enable linker version script (default is enabled when possible)]),
+ [have_ld_version_script=$enableval], [])
+ if test -z "$have_ld_version_script"; then
+ AC_MSG_CHECKING([if LD -Wl,--version-script works])
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
+ cat > conftest.map <<EOF
+VERS_1 {
+ global: sym;
+};
+
+VERS_2 {
+ global: sym;
+} VERS_1;
+EOF
+ AC_LINK_IFELSE(AC_LANG_PROGRAM([], []),
+ [have_ld_version_script=yes], [have_ld_version_script=no])
+ rm -f conftest.map
+ LDFLAGS="$save_LDFLAGS"
+ AC_MSG_RESULT($have_ld_version_script)
+ fi
+ AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
+])
diff --git a/gnulib/m4/ldd.m4 b/gnulib/m4/ldd.m4
new file mode 100644
index 00000000..9e3e3eed
--- /dev/null
+++ b/gnulib/m4/ldd.m4
@@ -0,0 +1,207 @@
+# ldd.m4 serial 1
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Sets LDDPROG to a command and LDDPOSTPROC to a filter command, such that
+# $LDDPROG program $LDDPOSTPROC
+# outputs a whitespace-separated list of the dynamically linked dependencies
+# of the program, as library names (no full pathnames), or nothing if the
+# program is statically linked or if the service is not supported on the given
+# system.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_LDD],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_PROG_CC])
+ dnl Default values.
+ LDDPROG=':'
+ LDDPOSTPROC=
+ dnl First try objdump, since it works when cross-compiling.
+ AC_CHECK_TOOL([OBJDUMP], [objdump], [false])
+changequote(,)dnl
+ if test "$OBJDUMP" != "false"; then
+ LDDPROG="$OBJDUMP -p"
+ dnl The output of "LC_ALL=C objdump -p program" of a program or library
+ dnl looks like this:
+ dnl
+ dnl libnet.so: file format elf32-i386
+ dnl
+ dnl Program Header:
+ dnl LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ dnl filesz 0x0001391d memsz 0x0001391d flags r-x
+ dnl LOAD off 0x00013920 vaddr 0x00014920 paddr 0x00014920 align 2**12
+ dnl filesz 0x00001874 memsz 0x0001b020 flags rw-
+ dnl DYNAMIC off 0x00015104 vaddr 0x00016104 paddr 0x00016104 align 2**2
+ dnl filesz 0x00000090 memsz 0x00000090 flags rw-
+ dnl
+ dnl Dynamic Section:
+ dnl NEEDED libroot.so
+ dnl SONAME libnet.so
+ dnl SYMBOLIC 0x0
+ dnl INIT 0x2aec
+ dnl FINI 0x12a2c
+ dnl HASH 0x94
+ dnl STRTAB 0x1684
+ dnl SYMTAB 0x774
+ dnl STRSZ 0xbd5
+ dnl SYMENT 0x10
+ dnl PLTGOT 0x15f20
+ dnl PLTRELSZ 0x320
+ dnl PLTREL 0x11
+ dnl JMPREL 0x27cc
+ dnl REL 0x225c
+ dnl RELSZ 0x570
+ dnl RELENT 0x8
+ LDDPOSTPROC="2>/dev/null | sed -n -e 's,^ NEEDED *\\([^ ].*\\)\$,\\1,p'"
+ else
+ if test "$cross_compiling" = no; then
+ dnl Not cross-compiling. Try system dependent vendor tools.
+ case "$host_os" in
+ aix*)
+ LDDPROG="dump -H"
+ dnl The output of "LC_ALL=C dump -H program" looks like this:
+ dnl
+ dnl program:
+ dnl
+ dnl ***Loader Section***
+ dnl Loader Header Information
+ dnl VERSION# #SYMtableENT #RELOCent LENidSTR
+ dnl 0x00000001 0x00000005 0x0000000d 0x0000001e
+ dnl
+ dnl #IMPfilID OFFidSTR LENstrTBL OFFstrTBL
+ dnl 0x00000002 0x00000134 0x0000000d 0x00000152
+ dnl
+ dnl
+ dnl ***Import File Strings***
+ dnl INDEX PATH BASE MEMBER
+ dnl 0 /usr/lib:/lib
+ dnl 1 libc.a shr.o
+ dnl
+ LDDPOSTPROC="2>/dev/null | sed -e '/^[^0-9]/d' -e '/^0x/d' | sed -n -e 's,^[0-9]* *\\([^ ]*\\).*\$,\\1,p' | sed -e 's,^.*/,,'"
+ ;;
+ darwin*)
+ LDDPROG="otool -L"
+ dnl The output of "otool -L program" looks like this:
+ dnl program:
+ dnl /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 71.1.4)
+ LDDPOSTPROC="2>/dev/null | sed -n -e 's,^ \\([^ ]*\\).*\$,\\1,p' | sed -e 's,^.*/,,'"
+ ;;
+ hpux*)
+ LDDPROG="chatr"
+ dnl The output of "LC_ALL=C chatr program" looks like this:
+ dnl program:
+ dnl shared executable
+ dnl shared library dynamic path search:
+ dnl SHLIB_PATH disabled second
+ dnl embedded path disabled first Not Defined
+ dnl shared library list:
+ dnl dynamic /usr/lib/libc.2
+ dnl shared library binding:
+ dnl deferred
+ dnl global hash table disabled
+ dnl plabel caching disabled
+ dnl global hash array size:1103
+ dnl global hash array nbuckets:3
+ dnl shared vtable support disabled
+ dnl static branch prediction disabled
+ dnl executable from stack: D (default)
+ dnl kernel assisted branch prediction enabled
+ dnl lazy swap allocation disabled
+ dnl text segment locking disabled
+ dnl data segment locking disabled
+ dnl third quadrant private data space disabled
+ dnl fourth quadrant private data space disabled
+ dnl third quadrant global data space disabled
+ dnl data page size: D (default)
+ dnl instruction page size: D (default)
+ dnl nulptr references disabled
+ dnl shared library private mapping disabled
+ dnl shared library text merging disabled
+ dnl
+ dnl or like this:
+ dnl a.out:
+ dnl 32-bit ELF executable
+ dnl shared library dynamic path search:
+ dnl LD_LIBRARY_PATH enabled first
+ dnl SHLIB_PATH enabled second
+ dnl embedded path enabled third /usr/lib/hpux32:/opt/langtools/lib/hpux32
+ dnl shared library list:
+ dnl libc.so.1
+ dnl shared library binding:
+ dnl deferred
+ dnl global hash table disabled
+ dnl global hash table size 1103
+ dnl shared library mapped private disabled
+ dnl shared library segment merging disabled
+ dnl shared vtable support disabled
+ dnl explicit unloading disabled
+ dnl segments:
+ dnl index type address flags size
+ dnl 7 text 04000000 z---c- D (default)
+ dnl 8 data 40000000 ---m-- D (default)
+ dnl executable from stack: D (default)
+ dnl kernel assisted branch prediction enabled
+ dnl lazy swap allocation for dynamic segments disabled
+ dnl nulptr references disabled
+ dnl address space model: default
+ dnl caliper dynamic instrumentation disabled
+ dnl
+ LDDPOSTPROC="2>/dev/null | sed -e '1,/shared library list:/d' -e '/shared library binding:/,\$d' | sed -e 's,^.*[ ]\\([^ ][^ ]*\\)\$,\\1,' | sed -e 's,^.*/,,'"
+ ;;
+ irix*)
+ LDDPROG="elfdump -Dl"
+ dnl The output of "elfdump -Dl program" looks like this:
+ dnl
+ dnl program:
+ dnl
+ dnl **** MIPS LIBLIST INFORMATION ****
+ dnl .liblist :
+ dnl [INDEX] Timestamp Checksum Flags Name Version
+ dnl [1] Oct 2 05:19:12 1999 0x867bf7a8 ----- libc.so.1 sgi1.0
+ dnl
+ LDDPOSTPROC="2>/dev/null | sed -n -e 's,^[[][0-9]*[]].* 0x[^ ]* [^ ][^ ]* \\([^ ][^ ]*\\).*\$,\\1,p' | sed -e 's,^.*/,,'"
+ ;;
+ linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) # glibc-based systems
+ LDDPROG="ldd"
+ dnl The output of "ldd program" looks like this:
+ dnl libc.so.6 => /lib/libc.so.6 (0x4002d000)
+ dnl /lib/ld-linux.so.2 (0x40000000)
+ LDDPOSTPROC="2>/dev/null | sed -n -e 's,^ \\([^ ][^ ]*\\).*\$,\\1,p' | sed -e 's,^.*/,,'"
+ ;;
+ osf*)
+ LDDPROG="odump -Dl"
+ dnl The output of "odump -Dl program" looks like this:
+ dnl
+ dnl ***LIBRARY LIST SECTION***
+ dnl Name Time-Stamp CheckSum Flags Version
+ dnl program:
+ dnl libc.so Dec 30 00:09:30 1997 0x5e955f9b 0 osf.1
+ dnl
+ LDDPOSTPROC="2>/dev/null | sed -n -e 's,^ \\([^ ][^ ]*\\).*,\\1,p' | sed -e '/^Name\$/d' | sed -e 's,^.*/,,'"
+ ;;
+ solaris*)
+ LDDPROG="ldd"
+ dnl The output of "ldd program" looks like this:
+ dnl libc.so.1 => /usr/lib/libc.so.1
+ dnl libdl.so.1 => /usr/lib/libdl.so.1
+ dnl /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1
+ dnl The first sed collects the indented lines.
+ dnl The second sed extracts the left-hand part.
+ dnl The third sed removes directory specifications.
+ LDDPOSTPROC="2>/dev/null | sed -n -e 's,^ \\([^ ].*\\)\$,\\1,p' | sed -e 's, =>.*\$,,' | sed -e 's,^.*/,,'"
+ ;;
+ esac
+ fi
+ fi
+ dnl Avoid locale dependencies.
+ if test "$LDDPROG" != ":"; then
+ LDDPROG="LC_ALL=C $LDDPROG"
+ fi
+changequote([,])dnl
+ AC_SUBST([LDDPROG])
+ AC_SUBST([LDDPOSTPROC])
+])
diff --git a/gnulib/m4/ldexpl.m4 b/gnulib/m4/ldexpl.m4
new file mode 100644
index 00000000..bcc76b21
--- /dev/null
+++ b/gnulib/m4/ldexpl.m4
@@ -0,0 +1,88 @@
+# ldexpl.m4 serial 4
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_LDEXPL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ LDEXPL_LIBM=
+ AC_CACHE_CHECK([whether ldexpl() can be used without linking with libm],
+ [gl_cv_func_ldexpl_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ long double x;],
+ [return ldexpl (x, -1) > 0;],
+ [gl_cv_func_ldexpl_no_libm=yes],
+ [gl_cv_func_ldexpl_no_libm=no])
+ ])
+ if test $gl_cv_func_ldexpl_no_libm = no; then
+ AC_CACHE_CHECK([whether ldexpl() can be used with libm],
+ [gl_cv_func_ldexpl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#include <math.h>
+ long double x;],
+ [return ldexpl (x, -1) > 0;],
+ [gl_cv_func_ldexpl_in_libm=yes],
+ [gl_cv_func_ldexpl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_ldexpl_in_libm = yes; then
+ LDEXPL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_ldexpl_no_libm = yes \
+ || test $gl_cv_func_ldexpl_in_libm = yes; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $LDEXPL_LIBM"
+ gl_FUNC_LDEXPL_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_ldexpl_works" in
+ *yes) gl_func_ldexpl=yes ;;
+ *) gl_func_ldexpl=no; REPLACE_LDEXPL=1; LDEXPL_LIBM= ;;
+ esac
+ else
+ gl_func_ldexpl=no
+ fi
+ if test $gl_func_ldexpl = yes; then
+ AC_DEFINE([HAVE_LDEXPL], [1],
+ [Define if the ldexpl() function is available.])
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has ldexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [#include <math.h>])
+ else
+ HAVE_DECL_LDEXPL=0
+ AC_LIBOBJ([ldexpl])
+ fi
+ AC_SUBST([LDEXPL_LIBM])
+])
+
+dnl Test whether ldexpl() works on finite numbers (this fails on AIX 5.1
+dnl and MacOS X 10.4/PowerPC).
+AC_DEFUN([gl_FUNC_LDEXPL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether ldexpl works], [gl_cv_func_ldexpl_works],
+ [
+ AC_TRY_RUN([
+#include <math.h>
+extern long double ldexpl (long double, int);
+int main()
+{
+ volatile long double x1 = 1.0;
+ volatile long double y1 = ldexpl (x1, -1);
+ volatile long double x2 = 1.73205L;
+ volatile long double y2 = ldexpl (x2, 0);
+ return (y1 != 0.5L) || (y2 != x2);
+}], [gl_cv_func_ldexpl_works=yes], [gl_cv_func_ldexpl_works=no],
+ [case "$host_os" in
+ aix*) gl_cv_func_ldexpl_works="guessing no";;
+ *) gl_cv_func_ldexpl_works="guessing yes";;
+ esac
+ ])
+ ])
+])
diff --git a/gnulib/m4/lib-ignore.m4 b/gnulib/m4/lib-ignore.m4
new file mode 100644
index 00000000..0236cb54
--- /dev/null
+++ b/gnulib/m4/lib-ignore.m4
@@ -0,0 +1,43 @@
+# If possible, ignore libraries that are not depended on.
+
+dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl_IGNORE_UNUSED_LIBRARIES],
+[
+ AC_CACHE_CHECK([for flag to ignore unused libraries],
+ [gl_cv_ignore_unused_libraries],
+ [gl_cv_ignore_unused_libraries=none
+ gl_saved_ldflags=$LDFLAGS
+ gl_saved_libs=$LIBS
+ # Link with -lm to detect binutils 2.16 bug with --as-needed; see
+ # <http://lists.gnu.org/archive/html/bug-gnulib/2006-06/msg00131.html>.
+ LIBS="$LIBS -lm"
+ # Use long option sequences like '-z ignore' to test for the feature,
+ # to forestall problems with linkers that have -z, -i, -g, -n, etc. flags.
+ # GCC + binutils likes '-Wl,--as-needed'.
+ # GCC + Solaris ld likes '-Wl,-z,ignore'.
+ # Sun C likes '-z ignore'.
+ # Don't try bare '--as-needed'; nothing likes it and the HP-UX 11.11
+ # native cc issues annoying warnings and then ignores it,
+ # which would cause us to incorrectly conclude that it worked.
+ for gl_flags in \
+ '-Wl,--as-needed' \
+ '-Wl,-z,ignore' \
+ '-z ignore'
+ do
+ LDFLAGS="$gl_flags $LDFLAGS"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM()],
+ [gl_cv_ignore_unused_libraries=$gl_flags])
+ LDFLAGS=$gl_saved_ldflags
+ test "$gl_cv_ignore_unused_libraries" != none && break
+ done
+ LIBS=$gl_saved_libs])
+
+ test "$gl_cv_ignore_unused_libraries" != none &&
+ LDFLAGS="$LDFLAGS $gl_cv_ignore_unused_libraries"
+])
diff --git a/gnulib/m4/lib-ld.m4 b/gnulib/m4/lib-ld.m4
new file mode 100644
index 00000000..ebb30528
--- /dev/null
+++ b/gnulib/m4/lib-ld.m4
@@ -0,0 +1,110 @@
+# lib-ld.m4 serial 4 (gettext-0.18)
+dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]* | [A-Za-z]:[\\/]*)]
+ [re_direlt='/[^/][^/]*/\.\./']
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL([acl_cv_path_LD],
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break ;;
+ *)
+ test "$with_gnu_ld" != yes && break ;;
+ esac
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT([$LD])
+else
+ AC_MSG_RESULT([no])
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/gnulib/m4/lib-link.m4 b/gnulib/m4/lib-link.m4
new file mode 100644
index 00000000..90e1ac91
--- /dev/null
+++ b/gnulib/m4/lib-link.m4
@@ -0,0 +1,764 @@
+# lib-link.m4 serial 20 (gettext-0.18)
+dnl Copyright (C) 2001-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.54])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ pushdef([Name],[translit([$1],[./-], [___])])
+ pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ popdef([NAME])
+ popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ pushdef([Name],[translit([$1],[./-], [___])])
+ pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIB[]NAME"
+ AC_TRY_LINK([$3], [$4],
+ [ac_cv_lib[]Name=yes],
+ [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ LIB[]NAME[]_PREFIX=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ popdef([NAME])
+ popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl acl_libext,
+dnl acl_shlibext,
+dnl acl_hardcode_libdir_flag_spec,
+dnl acl_hardcode_libdir_separator,
+dnl acl_hardcode_direct,
+dnl acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+ m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ acl_hardcode_direct="$acl_cv_hardcode_direct"
+ acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ dnl Determine whether the user wants rpath handling at all.
+ AC_ARG_ENABLE([rpath],
+ [ --disable-rpath do not hardcode runtime library paths],
+ :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+ pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ define([acl_frompackage_]NAME, [$2])
+ popdef([NAME])
+ pushdef([PACK],[$2])
+ pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ define([acl_libsinpackage_]PACKUP,
+ m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1])
+ popdef([PACKUP])
+ popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+ pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+ dnl Autoconf >= 2.61 supports dots in --with options.
+ pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_ARG_WITH(P_A_C_K[-prefix],
+[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib
+ --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
+ fi
+ fi
+])
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-seach.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ LIB[]NAME[]_PREFIX=
+ dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+ dnl computed. So it has to be reset here.
+ HAVE_LIB[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ dir="$additional_libdir"
+ dnl The same code as in the loop below:
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$acl_hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+ popdef([P_A_C_K])
+ popdef([PACKLIBS])
+ popdef([PACKUP])
+ popdef([PACK])
+ popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+ AC_REQUIRE([AC_LIB_RPATH])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ $1=
+ if test "$enable_rpath" != no; then
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode directories into the resulting
+ dnl binary.
+ rpathdirs=
+ next=
+ for opt in $2; do
+ if test -n "$next"; then
+ dir="$next"
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next=
+ else
+ case $opt in
+ -L) next=yes ;;
+ -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next= ;;
+ *) next= ;;
+ esac
+ fi
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n ""$3""; then
+ dnl libtool is used for linking. Use -R options.
+ for dir in $rpathdirs; do
+ $1="${$1}${$1:+ }-R$dir"
+ done
+ else
+ dnl The linker is used for linking directly.
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user
+ dnl must pass all path elements in one option.
+ alldirs=
+ for dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ $1="$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ $1="${$1}${$1:+ }$flag"
+ done
+ fi
+ fi
+ fi
+ fi
+ fi
+ AC_SUBST([$1])
+])
diff --git a/gnulib/m4/lib-prefix.m4 b/gnulib/m4/lib-prefix.m4
new file mode 100644
index 00000000..1601ceae
--- /dev/null
+++ b/gnulib/m4/lib-prefix.m4
@@ -0,0 +1,224 @@
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib-prefix],
+[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl "lib/amd64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+ dnl There is no formal standard regarding lib and lib64.
+ dnl On glibc systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+ dnl the compiler's default mode by looking at the compiler's library search
+ dnl path. If at least one of its elements ends in /lib64 or points to a
+ dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+ dnl Otherwise we use the default, namely "lib".
+ dnl On Solaris systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+ dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ case "$host_os" in
+ solaris*)
+ dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+ dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
+ dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+ dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+ dnl symlink is missing, so we set acl_libdirstem2 too.
+ AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+ [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+ ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+ ])
+ if test $gl_cv_solaris_64bit = yes; then
+ acl_libdirstem=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+])
diff --git a/gnulib/m4/libsigsegv.m4 b/gnulib/m4/libsigsegv.m4
new file mode 100644
index 00000000..9d255d3b
--- /dev/null
+++ b/gnulib/m4/libsigsegv.m4
@@ -0,0 +1,16 @@
+# libsigsegv.m4 serial 4
+dnl Copyright (C) 2002-2003, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible, Sam Steingold.
+
+AC_DEFUN([gl_LIBSIGSEGV],
+[
+ AC_LIB_HAVE_LINKFLAGS([sigsegv], [],
+ [#include <sigsegv.h>], [sigsegv_deinstall_handler();],
+ [no, consider installing GNU libsigsegv])
+ dnl Some other autoconf macros and clisp's configure use this variable.
+ gl_cv_lib_sigsegv="$ac_cv_libsigsegv"
+])
diff --git a/gnulib/m4/libunistring.m4 b/gnulib/m4/libunistring.m4
new file mode 100644
index 00000000..8f9f07b0
--- /dev/null
+++ b/gnulib/m4/libunistring.m4
@@ -0,0 +1,37 @@
+# libunistring.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl gl_LIBUNISTRING
+dnl Searches for an installed libunistring.
+dnl If found, it sets and AC_SUBSTs HAVE_LIBUNISTRING=yes and the LIBUNISTRING
+dnl and LTLIBUNISTRING variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIBUNISTRING to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIBUNISTRING=no and LIBUNINSTRING and LTLIBUNISTRING to empty.
+
+AC_DEFUN([gl_LIBUNISTRING],
+[
+ dnl First, try to link without -liconv. libunistring often depends on
+ dnl libiconv, but we don't know (and often don't need to know) where
+ dnl libiconv is installed.
+ AC_LIB_HAVE_LINKFLAGS([unistring], [],
+ [#include <uniconv.h>], [u8_strconv_from_locale((char*)0);],
+ [no, consider installing GNU libunistring])
+ if test "$ac_cv_libunistring" != yes; then
+ dnl Second try, with -liconv.
+ AC_REQUIRE([AM_ICONV])
+ if test -n "$LIBICONV"; then
+ glus_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_LIB_HAVE_LINKFLAGS([unistring], [],
+ [#include <uniconv.h>], [u8_strconv_from_locale((char*)0);],
+ [no, consider installing GNU libunistring])
+ if test -n "$LIBUNISTRING"; then
+ LIBUNISTRING="$LIBUNISTRING $LIBICONV"
+ fi
+ LIBS="$glus_save_LIBS"
+ fi
+ fi
+])
diff --git a/gnulib/m4/link-follow.m4 b/gnulib/m4/link-follow.m4
new file mode 100644
index 00000000..256b2a99
--- /dev/null
+++ b/gnulib/m4/link-follow.m4
@@ -0,0 +1,81 @@
+# serial 15
+dnl Run a program to determine whether link(2) follows symlinks.
+dnl Set LINK_FOLLOWS_SYMLINKS accordingly.
+
+# Copyright (C) 1999-2001, 2004-2006, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+dnl This macro can be used to emulate POSIX linkat. If
+dnl LINK_FOLLOWS_SYMLINKS is 0, link matches linkat(,0), and
+dnl linkat(,AT_SYMLINK_FOLLOW) requires a readlink. If it is 1,
+dnl link matches linkat(,AT_SYMLINK_FOLLOW), and there is no way
+dnl to do linkat(,0) on symlinks (on all other file types,
+dnl link() is sufficient). If it is -1, use a runtime test.
+AC_DEFUN([gl_FUNC_LINK_FOLLOWS_SYMLINK],
+[dnl
+ AC_CHECK_FUNCS_ONCE([readlink])
+ dnl Mingw lacks link, although gnulib provides a good replacement.
+ dnl However, it also lacks symlink, so there's nothing to test in
+ dnl the first place, and no reason to need to distinguish between
+ dnl linkat variants. So, we set LINK_FOLLOWS_SYMLINKS to 0.
+ gl_link_follows_symlinks=0 # assume GNU behavior
+ if test $ac_cv_func_readlink = yes; then
+ AC_CACHE_CHECK([whether link(2) dereferences a symlink],
+ gl_cv_func_link_follows_symlink,
+ [
+ # Create a regular file.
+ echo > conftest.file
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <unistd.h>
+# include <stdlib.h>
+
+# define SAME_INODE(Stat_buf_1, Stat_buf_2) \
+ ((Stat_buf_1).st_ino == (Stat_buf_2).st_ino \
+ && (Stat_buf_1).st_dev == (Stat_buf_2).st_dev)
+
+ int
+ main ()
+ {
+ const char *file = "conftest.file";
+ const char *sym = "conftest.sym";
+ const char *hard = "conftest.hard";
+ struct stat sb_file, sb_hard;
+
+ /* Create a symlink to the regular file. */
+ if (symlink (file, sym))
+ return 2;
+
+ /* Create a hard link to that symlink. */
+ if (link (sym, hard))
+ return 3;
+
+ if (lstat (hard, &sb_hard))
+ return 4;
+ if (lstat (file, &sb_file))
+ return 5;
+
+ /* If the dev/inode of hard and file are the same, then
+ the link call followed the symlink. */
+ return SAME_INODE (sb_hard, sb_file) ? 1 : 0;
+ }
+ ]])],
+ [gl_cv_func_link_follows_symlink=no], dnl GNU behavior
+ [gl_cv_func_link_follows_symlink=yes], dnl Followed link/compile failed
+ [gl_cv_func_link_follows_symlink=unknown] dnl We're cross compiling.
+ )
+ rm -f conftest.file conftest.sym conftest.hard
+ ])
+ case $gl_cv_func_link_follows_symlink in
+ yes) gl_link_follows_symlinks=1 ;;
+ no) ;; # already defaulted to 0
+ *) gl_link_follows_symlinks=-1 ;;
+ esac
+ fi
+ AC_DEFINE_UNQUOTED([LINK_FOLLOWS_SYMLINKS], [$gl_link_follows_symlinks],
+ [Define to 1 if `link(2)' dereferences symbolic links, 0 if it
+ creates hard links to symlinks, and -1 if unknown.])
+])
diff --git a/gnulib/m4/link.m4 b/gnulib/m4/link.m4
new file mode 100644
index 00000000..0ca85d3a
--- /dev/null
+++ b/gnulib/m4/link.m4
@@ -0,0 +1,38 @@
+# link.m4 serial 4
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_LINK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([link])
+ if test $ac_cv_func_link = no; then
+ HAVE_LINK=0
+ AC_LIBOBJ([link])
+ else
+ AC_CACHE_CHECK([whether link handles trailing slash correctly],
+ [gl_cv_func_link_works],
+ [touch conftest.a
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.a conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+]], [[if (!link ("conftest.a", "conftest.b/")) return 1;
+#if HAVE_LSTAT
+ if (!link ("conftest.lnk/", "conftest.b")) return 2;
+#endif
+ ]])],
+ [gl_cv_func_link_works=yes], [gl_cv_func_link_works=no],
+ [gl_cv_func_link_works="guessing no"])
+ rm -f conftest.a conftest.b conftest.lnk])
+ if test "$gl_cv_func_link_works" != yes; then
+ REPLACE_LINK=1
+ AC_LIBOBJ([link])
+ fi
+ fi
+])
diff --git a/gnulib/m4/linkat.m4 b/gnulib/m4/linkat.m4
new file mode 100644
index 00000000..630ce890
--- /dev/null
+++ b/gnulib/m4/linkat.m4
@@ -0,0 +1,47 @@
+# serial 2
+# See if we need to provide linkat replacement.
+
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_LINKAT],
+[
+ AC_REQUIRE([gl_FUNC_OPENAT])
+ AC_REQUIRE([gl_FUNC_LINK])
+ AC_REQUIRE([gl_FUNC_LINK_FOLLOWS_SYMLINK])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([linkat symlink])
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+ if test $ac_cv_func_linkat = no; then
+ HAVE_LINKAT=0
+ AC_LIBOBJ([linkat])
+ AC_LIBOBJ([at-func2])
+ else
+ AC_CACHE_CHECK([whether linkat(,AT_SYMLINK_FOLLOW) works],
+ [gl_cv_func_linkat_follow],
+ [rm -rf conftest.f1 conftest.f2
+ touch conftest.f1
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <fcntl.h>
+#include <unistd.h>
+#ifdef __linux__
+/* Linux added linkat in 2.6.16, but did not add AT_SYMLINK_FOLLOW
+ until 2.6.18. Always replace linkat to support older kernels. */
+choke me
+#endif
+]], [return linkat (AT_FDCWD, "conftest.f1", AT_FDCWD, "conftest.f2",
+ AT_SYMLINK_FOLLOW);])],
+ [gl_cv_func_linkat_follow=yes],
+ [gl_cv_func_linkat_follow="need runtime check"])
+ rm -rf conftest.f1 conftest.f2])
+ if test "$gl_cv_func_linkat_follow" != yes; then
+ REPLACE_LINKAT=1
+ AC_LIBOBJ([linkat])
+ fi
+ fi
+])
diff --git a/gnulib/m4/localcharset.m4 b/gnulib/m4/localcharset.m4
new file mode 100644
index 00000000..ee2e801b
--- /dev/null
+++ b/gnulib/m4/localcharset.m4
@@ -0,0 +1,17 @@
+# localcharset.m4 serial 7
+dnl Copyright (C) 2002, 2004, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_LOCALCHARSET],
+[
+ dnl Prerequisites of lib/localcharset.c.
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_REQUIRE([gl_FCNTL_O_FLAGS])
+ AC_CHECK_DECLS_ONCE([getc_unlocked])
+
+ dnl Prerequisites of the lib/Makefile.am snippet.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_GLIBC21])
+])
diff --git a/gnulib/m4/locale-fr.m4 b/gnulib/m4/locale-fr.m4
new file mode 100644
index 00000000..001f5390
--- /dev/null
+++ b/gnulib/m4/locale-fr.m4
@@ -0,0 +1,185 @@
+# locale-fr.m4 serial 11
+dnl Copyright (C) 2003, 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Determine the name of a french locale with traditional encoding.
+AC_DEFUN([gt_LOCALE_FR],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a traditional french locale], [gt_cv_locale_fr], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([
+changequote(,)dnl
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+ /* Check whether the given locale name is recognized by the system. */
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On MacOS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail. */
+#if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
+ return 1;
+ }
+#endif
+#ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+#endif
+ /* Check whether in the abbreviation of the second month, the second
+ character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only
+ one byte long. This excludes the UTF-8 encoding. */
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1;
+ /* Check whether the decimal separator is a comma.
+ On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
+ are nl_langinfo(RADIXCHAR) are both ".". */
+ if (localeconv () ->decimal_point[0] != ',') return 1;
+ return 0;
+}
+changequote([,])dnl
+ ])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on MacOS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the usual locale name.
+ if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.ISO-8859-1
+ else
+ # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name.
+ if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.ISO8859-1
+ else
+ # Test for the HP-UX locale name.
+ if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.iso88591
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr
+ else
+ # None found.
+ gt_cv_locale_fr=none
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_FR=$gt_cv_locale_fr
+ AC_SUBST([LOCALE_FR])
+])
+
+dnl Determine the name of a french locale with UTF-8 encoding.
+AC_DEFUN([gt_LOCALE_FR_UTF8],
+[
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a french Unicode locale], [gt_cv_locale_fr_utf8], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([
+changequote(,)dnl
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if !(defined __BEOS__ || defined __HAIKU__)
+ /* Check whether the given locale name is recognized by the system. */
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On MacOS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail. */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether in the abbreviation of the second month, the second
+ character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is
+ two bytes long, with UTF-8 encoding. */
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%b", &t) < 4
+ || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v')
+ return 1;
+#endif
+ /* Check whether the decimal separator is a comma.
+ On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
+ are nl_langinfo(RADIXCHAR) are both ".". */
+ if (localeconv () ->decimal_point[0] != ',') return 1;
+ return 0;
+}
+changequote([,])dnl
+ ])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on MacOS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the usual locale name.
+ if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr_FR
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr_FR.UTF-8
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr.UTF-8
+ else
+ # None found.
+ gt_cv_locale_fr_utf8=none
+ fi
+ fi
+ fi
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8
+ AC_SUBST([LOCALE_FR_UTF8])
+])
diff --git a/gnulib/m4/locale-ja.m4 b/gnulib/m4/locale-ja.m4
new file mode 100644
index 00000000..0eedaf14
--- /dev/null
+++ b/gnulib/m4/locale-ja.m4
@@ -0,0 +1,107 @@
+# locale-ja.m4 serial 7
+dnl Copyright (C) 2003, 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Determine the name of a japanese locale with EUC-JP encoding.
+AC_DEFUN([gt_LOCALE_JA],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a traditional japanese locale], [gt_cv_locale_ja], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([
+changequote(,)dnl
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main ()
+{
+ const char *p;
+ /* Check whether the given locale name is recognized by the system. */
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On MacOS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail. */
+#if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
+ return 1;
+ }
+#endif
+#ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+#endif
+ /* Check whether MB_CUR_MAX is > 1. This excludes the dysfunctional locales
+ on Cygwin 1.5.x. */
+ if (MB_CUR_MAX == 1)
+ return 1;
+ /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
+ This excludes the UTF-8 encoding. */
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
+ for (p = buf; *p != '\0'; p++)
+ if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
+ return 1;
+ return 0;
+}
+changequote([,])dnl
+ ])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on MacOS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the AIX locale name.
+ if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.EUC-JP
+ else
+ # Test for the HP-UX, OSF/1, NetBSD locale name.
+ if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.eucJP
+ else
+ # Test for the IRIX, FreeBSD locale name.
+ if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.EUC
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja
+ else
+ # Special test for NetBSD 1.6.
+ if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then
+ gt_cv_locale_ja=ja_JP.eucJP
+ else
+ # None found.
+ gt_cv_locale_ja=none
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_JA=$gt_cv_locale_ja
+ AC_SUBST([LOCALE_JA])
+])
diff --git a/gnulib/m4/locale-tr.m4 b/gnulib/m4/locale-tr.m4
new file mode 100644
index 00000000..404c063c
--- /dev/null
+++ b/gnulib/m4/locale-tr.m4
@@ -0,0 +1,97 @@
+# locale-tr.m4 serial 6
+dnl Copyright (C) 2003, 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Determine the name of a turkish locale with UTF-8 encoding.
+AC_DEFUN([gt_LOCALE_TR_UTF8],
+[
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a turkish Unicode locale], [gt_cv_locale_tr_utf8], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([
+changequote(,)dnl
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+ /* On BeOS, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. But BeOS does not
+ implement the Turkish upper-/lowercase mappings. Therefore, let this
+ program return 1 on BeOS. */
+ /* Check whether the given locale name is recognized by the system. */
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On MacOS X 10.3.5 (Darwin 7.5) in the tr_TR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail. */
+#if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
+ return 1;
+ }
+#endif
+#ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+#endif
+ /* Check whether in the abbreviation of the eighth month, the second
+ character (should be U+011F: LATIN SMALL LETTER G WITH BREVE) is
+ two bytes long, with UTF-8 encoding. */
+ t.tm_year = 1992 - 1900; t.tm_mon = 8 - 1; t.tm_mday = 19;
+ if (strftime (buf, sizeof (buf), "%b", &t) < 4
+ || buf[1] != (char) 0xc4 || buf[2] != (char) 0x9f)
+ return 1;
+ /* Check whether the upper-/lowercase mappings are as expected for
+ Turkish. */
+ if (towupper ('i') != 0x0130 || towlower (0x0130) != 'i'
+ || towupper(0x0131) != 'I' || towlower ('I') != 0x0131)
+ return 1;
+ return 0;
+}
+changequote([,])dnl
+ ])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on MacOS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the usual locale name.
+ if (LC_ALL=tr_TR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_tr_utf8=tr_TR
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=tr_TR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_tr_utf8=tr_TR.UTF-8
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=tr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_tr_utf8=tr.UTF-8
+ else
+ # None found.
+ gt_cv_locale_tr_utf8=none
+ fi
+ fi
+ fi
+ else
+ gt_cv_locale_tr_utf8=none
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_TR_UTF8=$gt_cv_locale_tr_utf8
+ AC_SUBST([LOCALE_TR_UTF8])
+])
diff --git a/gnulib/m4/locale-zh.m4 b/gnulib/m4/locale-zh.m4
new file mode 100644
index 00000000..777fd141
--- /dev/null
+++ b/gnulib/m4/locale-zh.m4
@@ -0,0 +1,92 @@
+# locale-zh.m4 serial 6
+dnl Copyright (C) 2003, 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Determine the name of a chinese locale with GB18030 encoding.
+AC_DEFUN([gt_LOCALE_ZH_CN],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a transitional chinese locale], [gt_cv_locale_zh_CN], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([
+changequote(,)dnl
+#include <locale.h>
+#include <stdlib.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main ()
+{
+ const char *p;
+ /* Check whether the given locale name is recognized by the system. */
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On MacOS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail. */
+#if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
+ return 1;
+ }
+#endif
+#ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+#endif
+ /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
+ This excludes the UTF-8 encoding. */
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
+ for (p = buf; *p != '\0'; p++)
+ if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
+ return 1;
+ /* Check whether a typical GB18030 multibyte sequence is recognized as a
+ single wide character. This excludes the GB2312 and GBK encodings. */
+ if (mblen ("\203\062\332\066", 5) != 4)
+ return 1;
+ return 0;
+}
+changequote([,])dnl
+ ])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on MacOS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the locale name without encoding suffix.
+ if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_zh_CN=zh_CN
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_zh_CN=zh_CN.GB18030
+ else
+ # None found.
+ gt_cv_locale_zh_CN=none
+ fi
+ fi
+ else
+ # If there was a link error, due to mblen(), the system is so old that
+ # it certainly doesn't have a chinese locale.
+ gt_cv_locale_zh_CN=none
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_ZH_CN=$gt_cv_locale_zh_CN
+ AC_SUBST([LOCALE_ZH_CN])
+])
diff --git a/gnulib/m4/locale_h.m4 b/gnulib/m4/locale_h.m4
new file mode 100644
index 00000000..0b7f4935
--- /dev/null
+++ b/gnulib/m4/locale_h.m4
@@ -0,0 +1,89 @@
+# locale_h.m4 serial 7
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_LOCALE_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+
+ dnl Persuade glibc <locale.h> to define locale_t.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ dnl If <stddef.h> is replaced, then <locale.h> must also be replaced.
+ AC_REQUIRE([gl_STDDEF_H])
+
+ AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001],
+ [gl_cv_header_locale_h_posix2001],
+ [AC_TRY_COMPILE([#include <locale.h>
+int x = LC_MESSAGES;], [],
+ [gl_cv_header_locale_h_posix2001=yes],
+ [gl_cv_header_locale_h_posix2001=no])])
+
+ dnl Check for <xlocale.h>.
+ AC_CHECK_HEADERS_ONCE([xlocale.h])
+ if test $ac_cv_header_xlocale_h = yes; then
+ HAVE_XLOCALE_H=1
+ dnl Check whether use of locale_t requires inclusion of <xlocale.h>,
+ dnl e.g. on MacOS X 10.5. If <locale.h> does not define locale_t by
+ dnl itself, we assume that <xlocale.h> will do so.
+ AC_CACHE_CHECK([whether locale.h defines locale_t],
+ [gl_cv_header_locale_has_locale_t],
+ [AC_TRY_COMPILE([#include <locale.h>
+locale_t x;], [],
+ [gl_cv_header_locale_has_locale_t=yes],
+ [gl_cv_header_locale_has_locale_t=no])
+ ])
+ if test $gl_cv_header_locale_has_locale_t = yes; then
+ gl_cv_header_locale_h_needs_xlocale_h=no
+ else
+ gl_cv_header_locale_h_needs_xlocale_h=yes
+ fi
+ else
+ HAVE_XLOCALE_H=0
+ gl_cv_header_locale_h_needs_xlocale_h=no
+ fi
+ AC_SUBST([HAVE_XLOCALE_H])
+
+ dnl <locale.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([locale.h])
+
+ if test -n "$STDDEF_H" \
+ || test $gl_cv_header_locale_h_posix2001 = no \
+ || test $gl_cv_header_locale_h_needs_xlocale_h = yes; then
+ gl_REPLACE_LOCALE_H
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <locale.h>
+/* Some systems provide declarations in a non-standard header. */
+#if HAVE_XLOCALE_H
+# include <xlocale.h>
+#endif
+ ]], [duplocale])
+])
+
+dnl Unconditionally enables the replacement of <locale.h>.
+AC_DEFUN([gl_REPLACE_LOCALE_H],
+[
+ dnl This is a no-op, because <locale.h> is always overridden.
+ :
+])
+
+AC_DEFUN([gl_LOCALE_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_LOCALE_H_DEFAULTS],
+[
+ GNULIB_DUPLOCALE=0; AC_SUBST([GNULIB_DUPLOCALE])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ REPLACE_DUPLOCALE=0; AC_SUBST([REPLACE_DUPLOCALE])
+])
diff --git a/gnulib/m4/localename.m4 b/gnulib/m4/localename.m4
new file mode 100644
index 00000000..9ff5eea2
--- /dev/null
+++ b/gnulib/m4/localename.m4
@@ -0,0 +1,12 @@
+# localename.m4 serial 2
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_LOCALENAME],
+[
+ AC_REQUIRE([gt_LC_MESSAGES])
+ AC_REQUIRE([gt_INTL_MACOSX])
+ AC_CHECK_FUNCS([setlocale uselocale])
+])
diff --git a/gnulib/m4/lock.m4 b/gnulib/m4/lock.m4
new file mode 100644
index 00000000..9da8465e
--- /dev/null
+++ b/gnulib/m4/lock.m4
@@ -0,0 +1,37 @@
+# lock.m4 serial 10 (gettext-0.18)
+dnl Copyright (C) 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_LOCK],
+[
+ AC_REQUIRE([gl_THREADLIB])
+ if test "$gl_threads_api" = posix; then
+ # OSF/1 4.0 and MacOS X 10.1 lack the pthread_rwlock_t type and the
+ # pthread_rwlock_* functions.
+ AC_CHECK_TYPE([pthread_rwlock_t],
+ [AC_DEFINE([HAVE_PTHREAD_RWLOCK], [1],
+ [Define if the POSIX multithreading library has read/write locks.])],
+ [],
+ [#include <pthread.h>])
+ # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
+ AC_TRY_COMPILE([#include <pthread.h>],
+ [#if __FreeBSD__ == 4
+error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
+#else
+int x = (int)PTHREAD_MUTEX_RECURSIVE;
+return !x;
+#endif],
+ [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], [1],
+ [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])])
+ fi
+ gl_PREREQ_LOCK
+])
+
+# Prerequisites of lib/lock.c.
+AC_DEFUN([gl_PREREQ_LOCK], [
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/logl.m4 b/gnulib/m4/logl.m4
new file mode 100644
index 00000000..eab591e2
--- /dev/null
+++ b/gnulib/m4/logl.m4
@@ -0,0 +1,75 @@
+# logl.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_LOGL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare logl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ LOGL_LIBM=
+ AC_CACHE_CHECK([whether logl() can be used without linking with libm],
+ [gl_cv_func_logl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return logl (x) > 1;],
+ [gl_cv_func_logl_no_libm=yes],
+ [gl_cv_func_logl_no_libm=no])
+ ])
+ if test $gl_cv_func_logl_no_libm = no; then
+ AC_CACHE_CHECK([whether logl() can be used with libm],
+ [gl_cv_func_logl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return logl (x) > 1;],
+ [gl_cv_func_logl_in_libm=yes],
+ [gl_cv_func_logl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_logl_in_libm = yes; then
+ LOGL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_logl_no_libm = yes \
+ || test $gl_cv_func_logl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has logl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([logl], , [HAVE_DECL_LOGL=0], [#include <math.h>])
+ else
+ HAVE_DECL_LOGL=0
+ HAVE_LOGL=0
+ AC_LIBOBJ([logl])
+ AC_REQUIRE([gl_FUNC_FREXPL])
+ AC_REQUIRE([gl_FUNC_ISNANL])
+ AC_REQUIRE([gl_FUNC_FLOORL])
+ dnl Append $FREXPL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
+ case " $LOGL_LIBM " in
+ *" $FREXPL_LIBM "*) ;;
+ *) LOGL_LIBM="$LOGL_LIBM $FREXPL_LIBM" ;;
+ esac
+ dnl Append $ISNANL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
+ case " $LOGL_LIBM " in
+ *" $ISNANL_LIBM "*) ;;
+ *) LOGL_LIBM="$LOGL_LIBM $ISNANL_LIBM" ;;
+ esac
+ dnl Append $FLOORL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
+ case " $LOGL_LIBM " in
+ *" $FLOORL_LIBM "*) ;;
+ *) LOGL_LIBM="$LOGL_LIBM $FLOORL_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([LOGL_LIBM])
+])
diff --git a/gnulib/m4/long-options.m4 b/gnulib/m4/long-options.m4
new file mode 100644
index 00000000..456c6582
--- /dev/null
+++ b/gnulib/m4/long-options.m4
@@ -0,0 +1,13 @@
+# long-options.m4 serial 5
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_LONG_OPTIONS],
+[
+ AC_LIBOBJ([long-options])
+
+ dnl Prerequisites of lib/long-options.c.
+])
diff --git a/gnulib/m4/longlong.m4 b/gnulib/m4/longlong.m4
new file mode 100644
index 00000000..cca3c1a9
--- /dev/null
+++ b/gnulib/m4/longlong.m4
@@ -0,0 +1,106 @@
+# longlong.m4 serial 14
+dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.61, but can be removed once we
+# assume 2.62 everywhere.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+ [AC_LINK_IFELSE(
+ [_AC_TYPE_LONG_LONG_SNIPPET],
+ [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+ dnl If cross compiling, assume the bug isn't important, since
+ dnl nobody cross compiles for this platform as far as we know.
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[@%:@include <limits.h>
+ @%:@ifndef LLONG_MAX
+ @%:@ define HALF \
+ (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+ @%:@ define LLONG_MAX (HALF - 1 + HALF)
+ @%:@endif]],
+ [[long long int n = 1;
+ int i;
+ for (i = 0; ; i++)
+ {
+ long long int m = n << i;
+ if (m >> i != n)
+ return 1;
+ if (LLONG_MAX / 2 < m)
+ break;
+ }
+ return 0;]])],
+ [ac_cv_type_long_long_int=yes],
+ [ac_cv_type_long_long_int=no],
+ [ac_cv_type_long_long_int=yes])],
+ [ac_cv_type_long_long_int=no])])
+ if test $ac_cv_type_long_long_int = yes; then
+ AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+ [Define to 1 if the system has the type `long long int'.])
+ fi
+])
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.61, but can be removed once we
+# assume 2.62 everywhere.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for unsigned long long int],
+ [ac_cv_type_unsigned_long_long_int],
+ [AC_LINK_IFELSE(
+ [_AC_TYPE_LONG_LONG_SNIPPET],
+ [ac_cv_type_unsigned_long_long_int=yes],
+ [ac_cv_type_unsigned_long_long_int=no])])
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+ [Define to 1 if the system has the type `unsigned long long int'.])
+ fi
+])
+
+# Expands to a C program that can be used to test for simultaneous support
+# of 'long long' and 'unsigned long long'. We don't want to say that
+# 'long long' is available if 'unsigned long long' is not, or vice versa,
+# because too many programs rely on the symmetry between signed and unsigned
+# integer types (excluding 'bool').
+AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
+[
+ AC_LANG_PROGRAM(
+ [[/* For now, do not test the preprocessor; as of 2007 there are too many
+ implementations with broken preprocessors. Perhaps this can
+ be revisited in 2012. In the meantime, code should not expect
+ #if to work with literals wider than 32 bits. */
+ /* Test literals. */
+ long long int ll = 9223372036854775807ll;
+ long long int nll = -9223372036854775807LL;
+ unsigned long long int ull = 18446744073709551615ULL;
+ /* Test constant expressions. */
+ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+ ? 1 : -1)];
+ typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+ ? 1 : -1)];
+ int i = 63;]],
+ [[/* Test availability of runtime routines for shift and division. */
+ long long int llmax = 9223372036854775807ll;
+ unsigned long long int ullmax = 18446744073709551615ull;
+ return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+ | (llmax / ll) | (llmax % ll)
+ | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+ | (ullmax / ull) | (ullmax % ull));]])
+])
diff --git a/gnulib/m4/ls-mntd-fs.m4 b/gnulib/m4/ls-mntd-fs.m4
new file mode 100644
index 00000000..40b93366
--- /dev/null
+++ b/gnulib/m4/ls-mntd-fs.m4
@@ -0,0 +1,336 @@
+# serial 28
+# How to list mounted file systems.
+
+# Copyright (C) 1998-2004, 2006, 2009-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+dnl From Jim Meyering.
+dnl
+dnl This is not pretty. I've just taken the autoconf code and wrapped
+dnl it in an AC_DEFUN and made some other fixes.
+dnl
+
+# Replace Autoconf's AC_FUNC_GETMNTENT to work around a bug in Autoconf
+# through Autoconf 2.59. We can remove this once we assume Autoconf 2.60
+# or later.
+AC_DEFUN([AC_FUNC_GETMNTENT],
+[# getmntent is in the standard C library on UNICOS, in -lsun on Irix 4,
+# -lseq on Dynix/PTX, -lgen on Unixware.
+AC_SEARCH_LIBS([getmntent], [sun seq gen])
+AC_CHECK_FUNCS([getmntent])
+])
+
+# gl_LIST_MOUNTED_FILE_SYSTEMS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([gl_LIST_MOUNTED_FILE_SYSTEMS],
+ [
+AC_CHECK_FUNCS([listmntent getmntinfo])
+AC_CHECK_HEADERS_ONCE([sys/param.h sys/statvfs.h])
+
+# We must include grp.h before ucred.h on OSF V4.0, since ucred.h uses
+# NGROUPS (as the array dimension for a struct member) without a definition.
+AC_CHECK_HEADERS([sys/ucred.h], [], [], [#include <grp.h>])
+
+AC_CHECK_HEADERS([sys/mount.h], [], [],
+ [AC_INCLUDES_DEFAULT
+ [#if HAVE_SYS_PARAM_H
+ #include <sys/param.h>
+ #endif]])
+
+AC_CHECK_HEADERS([mntent.h sys/fs_types.h])
+ getfsstat_includes="\
+$ac_includes_default
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h> /* needed by powerpc-apple-darwin1.3.7 */
+#endif
+#if HAVE_SYS_UCRED_H
+# include <grp.h> /* needed for definition of NGROUPS */
+# include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */
+#endif
+#if HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+#endif
+#if HAVE_SYS_FS_TYPES_H
+# include <sys/fs_types.h> /* needed by powerpc-apple-darwin1.3.7 */
+#endif
+"
+AC_CHECK_MEMBERS([struct fsstat.f_fstypename],,,[$getfsstat_includes])
+
+# Determine how to get the list of mounted file systems.
+ac_list_mounted_fs=
+
+# If the getmntent function is available but not in the standard library,
+# make sure LIBS contains the appropriate -l option.
+AC_FUNC_GETMNTENT
+
+# This test must precede the ones for getmntent because Unicos-9 is
+# reported to have the getmntent function, but its support is incompatible
+# with other getmntent implementations.
+
+# NOTE: Normally, I wouldn't use a check for system type as I've done for
+# `CRAY' below since that goes against the whole autoconf philosophy. But
+# I think there is too great a chance that some non-Cray system has a
+# function named listmntent to risk the false positive.
+
+if test -z "$ac_list_mounted_fs"; then
+ # Cray UNICOS 9
+ AC_MSG_CHECKING([for listmntent of Cray/Unicos-9])
+ AC_CACHE_VAL([fu_cv_sys_mounted_cray_listmntent],
+ [fu_cv_sys_mounted_cray_listmntent=no
+ AC_EGREP_CPP([yes],
+ [#ifdef _CRAY
+yes
+#endif
+ ], [test $ac_cv_func_listmntent = yes \
+ && fu_cv_sys_mounted_cray_listmntent=yes]
+ )
+ ]
+ )
+ AC_MSG_RESULT([$fu_cv_sys_mounted_cray_listmntent])
+ if test $fu_cv_sys_mounted_cray_listmntent = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_LISTMNTENT], [1],
+ [Define if there is a function named listmntent that can be used to
+ list all mounted file systems. (UNICOS)])
+ fi
+fi
+
+if test -z "$ac_list_mounted_fs"; then
+ # AIX.
+ AC_MSG_CHECKING([for mntctl function and struct vmount])
+ AC_CACHE_VAL([fu_cv_sys_mounted_vmount],
+ [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <fshelp.h>]])],
+ [fu_cv_sys_mounted_vmount=yes],
+ [fu_cv_sys_mounted_vmount=no])])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_vmount])
+ if test $fu_cv_sys_mounted_vmount = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_VMOUNT], [1],
+ [Define if there is a function named mntctl that can be used to read
+ the list of mounted file systems, and there is a system header file
+ that declares `struct vmount.' (AIX)])
+ fi
+fi
+
+if test $ac_cv_func_getmntent = yes; then
+
+ # This system has the getmntent function.
+ # Determine whether it's the one-argument variant or the two-argument one.
+
+ if test -z "$ac_list_mounted_fs"; then
+ # 4.3BSD, SunOS, HP-UX, Dynix, Irix
+ AC_MSG_CHECKING([for one-argument getmntent function])
+ AC_CACHE_VAL([fu_cv_sys_mounted_getmntent1],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+/* SunOS 4.1.x /usr/include/mntent.h needs this for FILE */
+#include <stdio.h>
+
+#include <mntent.h>
+#if !defined MOUNTED
+# if defined _PATH_MOUNTED /* GNU libc */
+# define MOUNTED _PATH_MOUNTED
+# endif
+# if defined MNT_MNTTAB /* HP-UX. */
+# define MOUNTED MNT_MNTTAB
+# endif
+# if defined MNTTABNAME /* Dynix. */
+# define MOUNTED MNTTABNAME
+# endif
+#endif
+]],
+ [[ struct mntent *mnt = 0; char *table = MOUNTED;
+ if (sizeof mnt && sizeof table) return 0;]])],
+ [fu_cv_sys_mounted_getmntent1=yes],
+ [fu_cv_sys_mounted_getmntent1=no])])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_getmntent1])
+ if test $fu_cv_sys_mounted_getmntent1 = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_GETMNTENT1], [1],
+ [Define if there is a function named getmntent for reading the list
+ of mounted file systems, and that function takes a single argument.
+ (4.3BSD, SunOS, HP-UX, Dynix, Irix)])
+ fi
+ fi
+
+ if test -z "$ac_list_mounted_fs"; then
+ # SVR4
+ AC_MSG_CHECKING([for two-argument getmntent function])
+ AC_CACHE_VAL([fu_cv_sys_mounted_getmntent2],
+ [AC_EGREP_HEADER([getmntent], [sys/mnttab.h],
+ fu_cv_sys_mounted_getmntent2=yes,
+ fu_cv_sys_mounted_getmntent2=no)])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_getmntent2])
+ if test $fu_cv_sys_mounted_getmntent2 = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_GETMNTENT2], [1],
+ [Define if there is a function named getmntent for reading the list of
+ mounted file systems, and that function takes two arguments. (SVR4)])
+ AC_CHECK_FUNCS([hasmntopt])
+ fi
+ fi
+
+fi
+
+if test -z "$ac_list_mounted_fs"; then
+ # DEC Alpha running OSF/1, and Apple Darwin 1.3.
+ # powerpc-apple-darwin1.3.7 needs sys/param.h sys/ucred.h sys/fs_types.h
+
+ AC_MSG_CHECKING([for getfsstat function])
+ AC_CACHE_VAL([fu_cv_sys_mounted_getfsstat],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#if HAVE_STRUCT_FSSTAT_F_FSTYPENAME
+# define FS_TYPE(Ent) ((Ent).f_fstypename)
+#else
+# define FS_TYPE(Ent) mnt_names[(Ent).f_type]
+#endif
+$getfsstat_includes]]
+,
+ [[struct statfs *stats;
+ int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT);
+ char *t = FS_TYPE (*stats); ]])],
+ [fu_cv_sys_mounted_getfsstat=yes],
+ [fu_cv_sys_mounted_getfsstat=no])])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_getfsstat])
+ if test $fu_cv_sys_mounted_getfsstat = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_GETFSSTAT], [1],
+ [Define if there is a function named getfsstat for reading the
+ list of mounted file systems. (DEC Alpha running OSF/1)])
+ fi
+fi
+
+if test -z "$ac_list_mounted_fs"; then
+ # SVR3
+ AC_MSG_CHECKING([for FIXME existence of three headers])
+ AC_CACHE_VAL([fu_cv_sys_mounted_fread_fstyp],
+ [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
+#include <sys/statfs.h>
+#include <sys/fstyp.h>
+#include <mnttab.h>]])],
+ [fu_cv_sys_mounted_fread_fstyp=yes],
+ [fu_cv_sys_mounted_fread_fstyp=no])])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_fread_fstyp])
+ if test $fu_cv_sys_mounted_fread_fstyp = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_FREAD_FSTYP], [1],
+ [Define if (like SVR2) there is no specific function for reading the
+ list of mounted file systems, and your system has these header files:
+ <sys/fstyp.h> and <sys/statfs.h>. (SVR3)])
+ fi
+fi
+
+if test -z "$ac_list_mounted_fs"; then
+ # 4.4BSD and DEC OSF/1.
+ AC_MSG_CHECKING([for getmntinfo function])
+ AC_CACHE_VAL([fu_cv_sys_mounted_getmntinfo],
+ [
+ test "$ac_cv_func_getmntinfo" = yes \
+ && fu_cv_sys_mounted_getmntinfo=yes \
+ || fu_cv_sys_mounted_getmntinfo=no
+ ])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_getmntinfo])
+ if test $fu_cv_sys_mounted_getmntinfo = yes; then
+ AC_MSG_CHECKING([whether getmntinfo returns statvfs structures])
+ AC_CACHE_VAL([fu_cv_sys_mounted_getmntinfo2],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#include <sys/types.h>
+#if HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+#endif
+#if HAVE_SYS_STATVFS_H
+# include <sys/statvfs.h>
+#endif
+extern int getmntinfo (struct statfs **, int);
+ ]], [])],
+ [fu_cv_sys_mounted_getmntinfo2=no],
+ [fu_cv_sys_mounted_getmntinfo2=yes])
+ ])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_getmntinfo2])
+ if test $fu_cv_sys_mounted_getmntinfo2 = no; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_GETMNTINFO], [1],
+ [Define if there is a function named getmntinfo for reading the
+ list of mounted file systems and it returns an array of
+ 'struct statfs'. (4.4BSD, Darwin)])
+ else
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_GETMNTINFO2], [1],
+ [Define if there is a function named getmntinfo for reading the
+ list of mounted file systems and it returns an array of
+ 'struct statvfs'. (NetBSD 3.0)])
+ fi
+ fi
+fi
+
+if test -z "$ac_list_mounted_fs"; then
+ # Ultrix
+ AC_MSG_CHECKING([for getmnt function])
+ AC_CACHE_VAL([fu_cv_sys_mounted_getmnt],
+ [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
+#include <sys/fs_types.h>
+#include <sys/mount.h>]])],
+ [fu_cv_sys_mounted_getmnt=yes],
+ [fu_cv_sys_mounted_getmnt=no])])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_getmnt])
+ if test $fu_cv_sys_mounted_getmnt = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_GETMNT], [1],
+ [Define if there is a function named getmnt for reading the list of
+ mounted file systems. (Ultrix)])
+ fi
+fi
+
+if test -z "$ac_list_mounted_fs"; then
+ # BeOS
+ AC_CHECK_FUNCS([next_dev fs_stat_dev])
+ AC_CHECK_HEADERS([fs_info.h])
+ AC_MSG_CHECKING([for BEOS mounted file system support functions])
+ if test $ac_cv_header_fs_info_h = yes \
+ && test $ac_cv_func_next_dev = yes \
+ && test $ac_cv_func_fs_stat_dev = yes; then
+ fu_result=yes
+ else
+ fu_result=no
+ fi
+ AC_MSG_RESULT([$fu_result])
+ if test $fu_result = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_FS_STAT_DEV], [1],
+ [Define if there are functions named next_dev and fs_stat_dev for
+ reading the list of mounted file systems. (BeOS)])
+ fi
+fi
+
+if test -z "$ac_list_mounted_fs"; then
+ # SVR2
+ AC_MSG_CHECKING([whether it is possible to resort to fread on /etc/mnttab])
+ AC_CACHE_VAL([fu_cv_sys_mounted_fread],
+ [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <mnttab.h>]])],
+ [fu_cv_sys_mounted_fread=yes],
+ [fu_cv_sys_mounted_fread=no])])
+ AC_MSG_RESULT([$fu_cv_sys_mounted_fread])
+ if test $fu_cv_sys_mounted_fread = yes; then
+ ac_list_mounted_fs=found
+ AC_DEFINE([MOUNTED_FREAD], [1],
+ [Define if there is no specific function for reading the list of
+ mounted file systems. fread will be used to read /etc/mnttab.
+ (SVR2) ])
+ fi
+fi
+
+if test -z "$ac_list_mounted_fs"; then
+ AC_MSG_ERROR([could not determine how to read list of mounted file systems])
+ # FIXME -- no need to abort building the whole package
+ # Can't build mountlist.c or anything that needs its functions
+fi
+
+AS_IF([test $ac_list_mounted_fs = found], [$1], [$2])
+
+ ])
diff --git a/gnulib/m4/lseek.m4 b/gnulib/m4/lseek.m4
new file mode 100644
index 00000000..9bf4dc2d
--- /dev/null
+++ b/gnulib/m4/lseek.m4
@@ -0,0 +1,51 @@
+# lseek.m4 serial 5
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_LSEEK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether lseek detects pipes], [gl_cv_func_lseek_pipe],
+ [if test $cross_compiling = no; then
+ AC_LINK_IFELSE([
+#include <sys/types.h> /* for off_t */
+#include <stdio.h> /* for SEEK_CUR */
+#include <unistd.h>
+int main ()
+{
+ /* Exit with success only if stdin is seekable. */
+ return lseek (0, (off_t)0, SEEK_CUR) < 0;
+}],
+ [if test -s conftest$ac_exeext \
+ && ./conftest$ac_exeext < conftest.$ac_ext \
+ && test 1 = "`echo hi \
+ | { ./conftest$ac_exeext; echo $?; cat >/dev/null; }`"; then
+ gl_cv_func_lseek_pipe=yes
+ else
+ gl_cv_func_lseek_pipe=no
+ fi],
+ [gl_cv_func_lseek_pipe=no])
+ else
+ AC_COMPILE_IFELSE([
+#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) || defined __BEOS__
+/* mingw and BeOS mistakenly return 0 when trying to seek on pipes. */
+ Choke me.
+#endif],
+ [gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no])
+ fi])
+ if test $gl_cv_func_lseek_pipe = no; then
+ gl_REPLACE_LSEEK
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_LSEEK],
+[
+ AC_LIBOBJ([lseek])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ REPLACE_LSEEK=1
+ AC_DEFINE([LSEEK_PIPE_BROKEN], [1],
+ [Define to 1 if lseek does not detect pipes.])
+])
diff --git a/gnulib/m4/lstat.m4 b/gnulib/m4/lstat.m4
new file mode 100644
index 00000000..5dbd16e2
--- /dev/null
+++ b/gnulib/m4/lstat.m4
@@ -0,0 +1,28 @@
+# serial 20
+
+# Copyright (C) 1997-2001, 2003-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+dnl From Jim Meyering.
+
+AC_DEFUN([gl_FUNC_LSTAT],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ dnl If lstat does not exist, the replacement <sys/stat.h> does
+ dnl "#define lstat stat", and lstat.c is a no-op.
+ AC_CHECK_FUNCS_ONCE([lstat])
+ if test $ac_cv_func_lstat = yes; then
+ AC_REQUIRE([AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+ if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then
+ dnl Note: AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK does AC_LIBOBJ([lstat]).
+ REPLACE_LSTAT=1
+ fi
+ # Prerequisites of lib/lstat.c.
+ AC_REQUIRE([AC_C_INLINE])
+ else
+ HAVE_LSTAT=0
+ fi
+])
diff --git a/gnulib/m4/malloc.m4 b/gnulib/m4/malloc.m4
new file mode 100644
index 00000000..910ac922
--- /dev/null
+++ b/gnulib/m4/malloc.m4
@@ -0,0 +1,41 @@
+# malloc.m4 serial 9
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_FUNC_MALLOC_POSIX
+# --------------------
+# Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it
+# fails), and replace malloc if it is not.
+AC_DEFUN([gl_FUNC_MALLOC_POSIX],
+[
+ AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+ if test $gl_cv_func_malloc_posix = yes; then
+ HAVE_MALLOC_POSIX=1
+ AC_DEFINE([HAVE_MALLOC_POSIX], [1],
+ [Define if the 'malloc' function is POSIX compliant.])
+ else
+ AC_LIBOBJ([malloc])
+ HAVE_MALLOC_POSIX=0
+ fi
+ AC_SUBST([HAVE_MALLOC_POSIX])
+])
+
+# Test whether malloc, realloc, calloc are POSIX compliant,
+# Set gl_cv_func_malloc_posix to yes or no accordingly.
+AC_DEFUN([gl_CHECK_MALLOC_POSIX],
+[
+ AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant],
+ [gl_cv_func_malloc_posix],
+ [
+ dnl It is too dangerous to try to allocate a large amount of memory:
+ dnl some systems go to their knees when you do that. So assume that
+ dnl all Unix implementations of the function are POSIX compliant.
+ AC_TRY_COMPILE([],
+ [#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ choke me
+ #endif
+ ], [gl_cv_func_malloc_posix=yes], [gl_cv_func_malloc_posix=no])
+ ])
+])
diff --git a/gnulib/m4/malloca.m4 b/gnulib/m4/malloca.m4
new file mode 100644
index 00000000..e07c6d93
--- /dev/null
+++ b/gnulib/m4/malloca.m4
@@ -0,0 +1,15 @@
+# malloca.m4 serial 1
+dnl Copyright (C) 2003-2004, 2006-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MALLOCA],
+[
+ dnl Use the autoconf tests for alloca(), but not the AC_SUBSTed variables
+ dnl @ALLOCA@ and @LTALLOCA@.
+ dnl gl_FUNC_ALLOCA dnl Already brought in by the module dependencies.
+ AC_REQUIRE([gl_EEMALLOC])
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+])
diff --git a/gnulib/m4/manywarnings.m4 b/gnulib/m4/manywarnings.m4
new file mode 100644
index 00000000..844a9ba2
--- /dev/null
+++ b/gnulib/m4/manywarnings.m4
@@ -0,0 +1,108 @@
+# manywarnings.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson
+
+# gl_MANYWARN_COMPLEMENT(OUTVAR, LISTVAR, REMOVEVAR)
+# --------------------------------------------------
+# Copy LISTVAR to OUTVAR except for the entries in REMOVEVAR.
+# Elements separated by whitespace. In set logic terms, the function
+# does OUTVAR = LISTVAR \ REMOVEVAR.
+AC_DEFUN([gl_MANYWARN_COMPLEMENT],
+[
+ gl_warn_set=
+ set x $2; shift
+ for gl_warn_item
+ do
+ case " $3 " in
+ *" $gl_warn_item "*)
+ ;;
+ *)
+ gl_warn_set="$gl_warn_set $gl_warn_item"
+ ;;
+ esac
+ done
+ $1=$gl_warn_set
+])
+
+# gl_MANYWARN_ALL_GCC(VARIABLE)
+# -----------------------------
+# Add all documented GCC (currently as per version 4.4) warning
+# parameters to variable VARIABLE. Note that you need to test them
+# using gl_WARN_ADD if you want to make sure your gcc understands it.
+AC_DEFUN([gl_MANYWARN_ALL_GCC],
+[
+ gl_manywarn_set=
+ for gl_manywarn_item in \
+ -Wall \
+ -W \
+ -Wformat-y2k \
+ -Wformat-nonliteral \
+ -Wformat-security \
+ -Winit-self \
+ -Wmissing-include-dirs \
+ -Wswitch-default \
+ -Wswitch-enum \
+ -Wunused \
+ -Wunknown-pragmas \
+ -Wstrict-aliasing \
+ -Wstrict-overflow \
+ -Wsystem-headers \
+ -Wfloat-equal \
+ -Wtraditional \
+ -Wtraditional-conversion \
+ -Wdeclaration-after-statement \
+ -Wundef \
+ -Wshadow \
+ -Wunsafe-loop-optimizations \
+ -Wpointer-arith \
+ -Wbad-function-cast \
+ -Wc++-compat \
+ -Wcast-qual \
+ -Wcast-align \
+ -Wwrite-strings \
+ -Wconversion \
+ -Wsign-conversion \
+ -Wlogical-op \
+ -Waggregate-return \
+ -Wstrict-prototypes \
+ -Wold-style-definition \
+ -Wmissing-prototypes \
+ -Wmissing-declarations \
+ -Wmissing-noreturn \
+ -Wmissing-format-attribute \
+ -Wpacked \
+ -Wpadded \
+ -Wredundant-decls \
+ -Wnested-externs \
+ -Wunreachable-code \
+ -Winline \
+ -Winvalid-pch \
+ -Wlong-long \
+ -Wvla \
+ -Wvolatile-register-var \
+ -Wdisabled-optimization \
+ -Wstack-protector \
+ -Woverlength-strings \
+ -Wbuiltin-macro-redefined \
+ -Wmudflap \
+ -Wpacked-bitfield-compat \
+ -Wsync-nand \
+ ; do
+ gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
+ done
+ # The following are not documented in the manual but are included in
+ # output from gcc --help=warnings.
+ for gl_manywarn_item in \
+ -Wattributes \
+ -Wcoverage-mismatch \
+ -Wmultichar \
+ -Wunused-macros \
+ ; do
+ gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
+ done
+ $1=$gl_manywarn_set
+])
diff --git a/gnulib/m4/math_h.m4 b/gnulib/m4/math_h.m4
new file mode 100644
index 00000000..e3b499e8
--- /dev/null
+++ b/gnulib/m4/math_h.m4
@@ -0,0 +1,128 @@
+# math_h.m4 serial 17
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MATH_H],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([math.h])
+ AC_REQUIRE([AC_C_INLINE])
+
+ AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]],
+ [[/* Solaris 10 has a broken definition of NAN. Other platforms
+ fail to provide NAN, or provide it only in C99 mode; this
+ test only needs to fail when NAN is provided but wrong. */
+ float f = 1.0f;
+#ifdef NAN
+ f = NAN;
+#endif
+ return f == 0;]])],
+ [gl_cv_header_math_nan_works=yes],
+ [gl_cv_header_math_nan_works=no])])
+ if test $gl_cv_header_math_nan_works = no; then
+ REPLACE_NAN=1
+ fi
+ AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]],
+ [[/* Solaris 10 has a broken definition of HUGE_VAL. */
+ double d = HUGE_VAL;
+ return d == 0;]])],
+ [gl_cv_header_math_huge_val_works=yes],
+ [gl_cv_header_math_huge_val_works=no])])
+ if test $gl_cv_header_math_huge_val_works = no; then
+ REPLACE_HUGE_VAL=1
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <math.h>
+ ]], [acosl asinl atanl ceilf ceill cosl expl floorf floorl frexpl
+ ldexpl logl round roundf roundl sinl sqrtl tanl trunc truncf truncl])
+])
+
+AC_DEFUN([gl_MATH_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_MATH_H_DEFAULTS],
+[
+ GNULIB_ACOSL=0; AC_SUBST([GNULIB_ACOSL])
+ GNULIB_ASINL=0; AC_SUBST([GNULIB_ASINL])
+ GNULIB_ATANL=0; AC_SUBST([GNULIB_ATANL])
+ GNULIB_CEILF=0; AC_SUBST([GNULIB_CEILF])
+ GNULIB_CEILL=0; AC_SUBST([GNULIB_CEILL])
+ GNULIB_COSL=0; AC_SUBST([GNULIB_COSL])
+ GNULIB_EXPL=0; AC_SUBST([GNULIB_EXPL])
+ GNULIB_FLOORF=0; AC_SUBST([GNULIB_FLOORF])
+ GNULIB_FLOORL=0; AC_SUBST([GNULIB_FLOORL])
+ GNULIB_FREXP=0; AC_SUBST([GNULIB_FREXP])
+ GNULIB_FREXPL=0; AC_SUBST([GNULIB_FREXPL])
+ GNULIB_ISFINITE=0; AC_SUBST([GNULIB_ISFINITE])
+ GNULIB_ISINF=0; AC_SUBST([GNULIB_ISINF])
+ GNULIB_ISNAN=0; AC_SUBST([GNULIB_ISNAN])
+ GNULIB_ISNANF=0; AC_SUBST([GNULIB_ISNANF])
+ GNULIB_ISNAND=0; AC_SUBST([GNULIB_ISNAND])
+ GNULIB_ISNANL=0; AC_SUBST([GNULIB_ISNANL])
+ GNULIB_LDEXPL=0; AC_SUBST([GNULIB_LDEXPL])
+ GNULIB_LOGL=0; AC_SUBST([GNULIB_LOGL])
+ GNULIB_ROUND=0; AC_SUBST([GNULIB_ROUND])
+ GNULIB_ROUNDF=0; AC_SUBST([GNULIB_ROUNDF])
+ GNULIB_ROUNDL=0; AC_SUBST([GNULIB_ROUNDL])
+ GNULIB_SIGNBIT=0; AC_SUBST([GNULIB_SIGNBIT])
+ GNULIB_SINL=0; AC_SUBST([GNULIB_SINL])
+ GNULIB_SQRTL=0; AC_SUBST([GNULIB_SQRTL])
+ GNULIB_TANL=0; AC_SUBST([GNULIB_TANL])
+ GNULIB_TRUNC=0; AC_SUBST([GNULIB_TRUNC])
+ GNULIB_TRUNCF=0; AC_SUBST([GNULIB_TRUNCF])
+ GNULIB_TRUNCL=0; AC_SUBST([GNULIB_TRUNCL])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_ACOSL=1; AC_SUBST([HAVE_ACOSL])
+ HAVE_ASINL=1; AC_SUBST([HAVE_ASINL])
+ HAVE_ATANL=1; AC_SUBST([HAVE_ATANL])
+ HAVE_COSL=1; AC_SUBST([HAVE_COSL])
+ HAVE_EXPL=1; AC_SUBST([HAVE_EXPL])
+ HAVE_ISNANF=1; AC_SUBST([HAVE_ISNANF])
+ HAVE_ISNAND=1; AC_SUBST([HAVE_ISNAND])
+ HAVE_ISNANL=1; AC_SUBST([HAVE_ISNANL])
+ HAVE_LOGL=1; AC_SUBST([HAVE_LOGL])
+ HAVE_SINL=1; AC_SUBST([HAVE_SINL])
+ HAVE_SQRTL=1; AC_SUBST([HAVE_SQRTL])
+ HAVE_TANL=1; AC_SUBST([HAVE_TANL])
+ HAVE_DECL_ACOSL=1; AC_SUBST([HAVE_DECL_ACOSL])
+ HAVE_DECL_ASINL=1; AC_SUBST([HAVE_DECL_ASINL])
+ HAVE_DECL_ATANL=1; AC_SUBST([HAVE_DECL_ATANL])
+ HAVE_DECL_COSL=1; AC_SUBST([HAVE_DECL_COSL])
+ HAVE_DECL_EXPL=1; AC_SUBST([HAVE_DECL_EXPL])
+ HAVE_DECL_FREXPL=1; AC_SUBST([HAVE_DECL_FREXPL])
+ HAVE_DECL_LDEXPL=1; AC_SUBST([HAVE_DECL_LDEXPL])
+ HAVE_DECL_LOGL=1; AC_SUBST([HAVE_DECL_LOGL])
+ HAVE_DECL_SINL=1; AC_SUBST([HAVE_DECL_SINL])
+ HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL])
+ HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL])
+ HAVE_DECL_TRUNC=1; AC_SUBST([HAVE_DECL_TRUNC])
+ HAVE_DECL_TRUNCF=1; AC_SUBST([HAVE_DECL_TRUNCF])
+ REPLACE_CEILF=0; AC_SUBST([REPLACE_CEILF])
+ REPLACE_CEILL=0; AC_SUBST([REPLACE_CEILL])
+ REPLACE_FLOORF=0; AC_SUBST([REPLACE_FLOORF])
+ REPLACE_FLOORL=0; AC_SUBST([REPLACE_FLOORL])
+ REPLACE_FREXP=0; AC_SUBST([REPLACE_FREXP])
+ REPLACE_FREXPL=0; AC_SUBST([REPLACE_FREXPL])
+ REPLACE_HUGE_VAL=0; AC_SUBST([REPLACE_HUGE_VAL])
+ REPLACE_ISFINITE=0; AC_SUBST([REPLACE_ISFINITE])
+ REPLACE_ISINF=0; AC_SUBST([REPLACE_ISINF])
+ REPLACE_ISNAN=0; AC_SUBST([REPLACE_ISNAN])
+ REPLACE_LDEXPL=0; AC_SUBST([REPLACE_LDEXPL])
+ REPLACE_NAN=0; AC_SUBST([REPLACE_NAN])
+ REPLACE_ROUND=0; AC_SUBST([REPLACE_ROUND])
+ REPLACE_ROUNDF=0; AC_SUBST([REPLACE_ROUNDF])
+ REPLACE_ROUNDL=0; AC_SUBST([REPLACE_ROUNDL])
+ REPLACE_SIGNBIT=0; AC_SUBST([REPLACE_SIGNBIT])
+ REPLACE_SIGNBIT_USING_GCC=0; AC_SUBST([REPLACE_SIGNBIT_USING_GCC])
+ REPLACE_TRUNCL=0; AC_SUBST([REPLACE_TRUNCL])
+])
diff --git a/gnulib/m4/mathfunc.m4 b/gnulib/m4/mathfunc.m4
new file mode 100644
index 00000000..d09aacaa
--- /dev/null
+++ b/gnulib/m4/mathfunc.m4
@@ -0,0 +1,115 @@
+# mathfunc.m4 serial 3
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_MATHFUNC(FUNC, RETTYPE, PARAMTYPES)
+# --------------------------------------------------
+# tests whether the function FUNC is available in libc or libm.
+# RETTYPE is the return type. PARAMTYPES is a parameter list, with parentheses.
+# It sets FUNC_LIBM to empty or "-lm" accordingly.
+
+AC_DEFUN([gl_MATHFUNC],
+[
+ dnl We need the RETTYPE and PARAMTYPES in order to force linking with the
+ dnl function. With gcc >= 4.3 on glibc/x86_64, calls to the 'fabs' function
+ dnl are inlined by the compiler, therefore linking of these calls does not
+ dnl require -lm, but taking the function pointer of 'fabs' does.
+ m4_pushdef([func], [$1])
+ m4_pushdef([FUNC], [translit([$1],[abcdefghijklmnopqrstuvwxyz],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ])])
+ FUNC[]_LIBM=
+ AC_CACHE_CHECK([whether func() can be used without linking with libm],
+ [gl_cv_func_]func[_no_libm],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ $2 (*funcptr) $3 = ]func[;]],
+ [[return 0;]])],
+ [gl_cv_func_]func[_no_libm=yes],
+ [gl_cv_func_]func[_no_libm=no])
+ ])
+ if test $gl_cv_func_[]func[]_no_libm = no; then
+ AC_CACHE_CHECK([whether func() can be used with libm],
+ [gl_cv_func_]func[_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ $2 (*funcptr) $3 = ]func[;]],
+ [[return 0;]])],
+ [gl_cv_func_]func[_in_libm=yes],
+ [gl_cv_func_]func[_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_[]func[]_in_libm = yes; then
+ FUNC[]_LIBM=-lm
+ fi
+ fi
+ AC_SUBST(FUNC[_LIBM])
+ m4_popdef([FUNC])
+ m4_popdef([func])
+])
+
+# gl_COMMON_DOUBLE_MATHFUNC(FUNC)
+# -------------------------------
+# tests whether the function FUNC is available in libc or libm.
+# It sets FUNC_LIBM to empty or "-lm" accordingly.
+# FUNC must be one of the following functions, that are present on all systems
+# and provided by libm on all systems except MacOS X, BeOS, Haiku:
+# acos asin atan atan2 cbrt copysign cos cosh erf erfc exp fmod hypot j0 j1
+# jn lgamma log log10 log1p pow remainder sin sinh sqrt tan tanh y0 y1 yn
+
+AC_DEFUN([gl_COMMON_DOUBLE_MATHFUNC],
+[
+ AC_REQUIRE([gl_COMMON_DOUBLE_MATHFUNC_TEST])
+ m4_pushdef([FUNC], [translit([$1],[abcdefghijklmnopqrstuvwxyz],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ])])
+ FUNC[]_LIBM="$POW_LIBM"
+ AC_SUBST(FUNC[_LIBM])
+ m4_popdef([FUNC])
+])
+
+AC_DEFUN([gl_COMMON_DOUBLE_MATHFUNC_TEST],
+[
+ dnl We could use any of the following:
+ dnl gl_MATHFUNC([acos], [double], [(double)])
+ dnl gl_MATHFUNC([asin], [double], [(double)])
+ dnl gl_MATHFUNC([atan], [double], [(double)])
+ dnl gl_MATHFUNC([atan2], [double], [(double, double)])
+ dnl gl_MATHFUNC([cbrt], [double], [(double)])
+ dnl gl_MATHFUNC([copysign], [double], [(double, double)])
+ dnl gl_MATHFUNC([cos], [double], [(double)])
+ dnl gl_MATHFUNC([cosh], [double], [(double)])
+ dnl gl_MATHFUNC([erf], [double], [(double)])
+ dnl gl_MATHFUNC([erfc], [double], [(double)])
+ dnl gl_MATHFUNC([exp], [double], [(double)])
+ dnl gl_MATHFUNC([fmod], [double], [(double, double)])
+ dnl gl_MATHFUNC([hypot], [double], [(double, double)])
+ dnl gl_MATHFUNC([j0], [double], [(double)])
+ dnl gl_MATHFUNC([j1], [double], [(double)])
+ dnl gl_MATHFUNC([jn], [double], [(int, double)])
+ dnl gl_MATHFUNC([lgamma], [double], [(double)])
+ dnl gl_MATHFUNC([log], [double], [(double)])
+ dnl gl_MATHFUNC([log10], [double], [(double)])
+ dnl gl_MATHFUNC([log1p], [double], [(double)])
+ dnl gl_MATHFUNC([pow], [double], [(double, double)])
+ dnl gl_MATHFUNC([remainder], [double], [(double, double)])
+ dnl gl_MATHFUNC([sin], [double], [(double)])
+ dnl gl_MATHFUNC([sinh], [double], [(double)])
+ dnl gl_MATHFUNC([sqrt], [double], [(double)])
+ dnl gl_MATHFUNC([tan], [double], [(double)])
+ dnl gl_MATHFUNC([tanh], [double], [(double)])
+ dnl gl_MATHFUNC([y0], [double], [(double)])
+ dnl gl_MATHFUNC([y1], [double], [(double)])
+ dnl gl_MATHFUNC([yn], [double], [(int, double)])
+ gl_MATHFUNC([pow], [double], [(double, double)])
+])
diff --git a/gnulib/m4/mbchar.m4 b/gnulib/m4/mbchar.m4
new file mode 100644
index 00000000..116ce7e5
--- /dev/null
+++ b/gnulib/m4/mbchar.m4
@@ -0,0 +1,14 @@
+# mbchar.m4 serial 8
+dnl Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl autoconf tests required for use of mbchar.m4
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_MBCHAR],
+[
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/mbfile.m4 b/gnulib/m4/mbfile.m4
new file mode 100644
index 00000000..add16467
--- /dev/null
+++ b/gnulib/m4/mbfile.m4
@@ -0,0 +1,18 @@
+# mbfile.m4 serial 5
+dnl Copyright (C) 2005, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl autoconf tests required for use of mbfile.h
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_MBFILE],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ dnl The following line is that so the user can test HAVE_MBRTOWC before
+ dnl #include "mbfile.h". It can be removed in 2010.
+ AC_REQUIRE([AC_FUNC_MBRTOWC])
+ :
+])
diff --git a/gnulib/m4/mbiter.m4 b/gnulib/m4/mbiter.m4
new file mode 100644
index 00000000..34810507
--- /dev/null
+++ b/gnulib/m4/mbiter.m4
@@ -0,0 +1,18 @@
+# mbiter.m4 serial 5
+dnl Copyright (C) 2005, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl autoconf tests required for use of mbiter.h
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_MBITER],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ dnl The following line is that so the user can test HAVE_MBRTOWC before
+ dnl #include "mbiter.h" or "mbuiter.h". It can be removed in 2010.
+ AC_REQUIRE([AC_FUNC_MBRTOWC])
+ :
+])
diff --git a/gnulib/m4/mbrlen.m4 b/gnulib/m4/mbrlen.m4
new file mode 100644
index 00000000..6049d1a1
--- /dev/null
+++ b/gnulib/m4/mbrlen.m4
@@ -0,0 +1,197 @@
+# mbrlen.m4 serial 2
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MBRLEN],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ AC_REQUIRE([gl_FUNC_MBRTOWC])
+ AC_CHECK_FUNCS_ONCE([mbrlen])
+ if test $ac_cv_func_mbrlen = no; then
+ HAVE_MBRLEN=0
+ else
+ dnl Most bugs affecting the system's mbrtowc function also affect the
+ dnl mbrlen function. So override mbrlen whenever mbrtowc is overridden.
+ dnl We could also run the individual tests below; the results would be
+ dnl the same.
+ if test $REPLACE_MBRTOWC = 1; then
+ REPLACE_MBRLEN=1
+ fi
+ fi
+ if test $HAVE_MBRLEN = 0 || test $REPLACE_MBRLEN = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([mbrlen])
+ gl_PREREQ_MBRLEN
+ fi
+])
+
+dnl Test whether mbrlen puts the state into non-initial state when parsing an
+dnl incomplete multibyte character.
+dnl Result is gl_cv_func_mbrlen_incomplete_state.
+
+AC_DEFUN([gl_MBRLEN_INCOMPLETE_STATE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrlen handles incomplete characters],
+ [gl_cv_func_mbrlen_incomplete_state],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on AIX and OSF/1.
+ osf*) gl_cv_func_mbrlen_incomplete_state="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrlen_incomplete_state="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_JA != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 1;
+ }
+ return 0;
+}],
+ [gl_cv_func_mbrlen_incomplete_state=yes],
+ [gl_cv_func_mbrlen_incomplete_state=no],
+ [])
+ fi
+ ])
+])
+
+dnl Test whether mbrlen, when parsing the end of a multibyte character,
+dnl correctly returns the number of bytes that were needed to complete the
+dnl character (not the total number of bytes of the multibyte character).
+dnl Result is gl_cv_func_mbrlen_retval.
+
+AC_DEFUN([gl_MBRLEN_RETVAL],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrlen has a correct return value],
+ [gl_cv_func_mbrlen_retval],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on HP-UX and Solaris.
+ hpux* | solaris*) gl_cv_func_mbrlen_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrlen_retval="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris. */
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
+ {
+ input[1] = '\0';
+ if (mbrlen (input + 2, 5, &state) != 1)
+ return 1;
+ }
+ }
+ /* This fails on HP-UX 11.11. */
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
+ {
+ input[1] = '\0';
+ if (mbrlen (input + 2, 5, &state) != 2)
+ return 1;
+ }
+ }
+ return 0;
+}],
+ [gl_cv_func_mbrlen_retval=yes],
+ [gl_cv_func_mbrlen_retval=no],
+ [])
+ fi
+ ])
+])
+
+dnl Test whether mbrlen, when parsing a NUL character, correctly returns 0.
+dnl Result is gl_cv_func_mbrlen_nul_retval.
+
+AC_DEFUN([gl_MBRLEN_NUL_RETVAL],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrlen returns 0 when parsing a NUL character],
+ [gl_cv_func_mbrlen_nul_retval],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Solaris 9.
+ solaris2.9) gl_cv_func_mbrlen_nul_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrlen_nul_retval="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_ZH_CN != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This crashes on Solaris 9 inside __mbrtowc_dense_gb18030. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrlen ("", 1, &state) != 0)
+ return 1;
+ }
+ return 0;
+}],
+ [gl_cv_func_mbrlen_nul_retval=yes],
+ [gl_cv_func_mbrlen_nul_retval=no],
+ [])
+ fi
+ ])
+])
+
+# Prerequisites of lib/mbrlen.c.
+AC_DEFUN([gl_PREREQ_MBRLEN], [
+ :
+])
diff --git a/gnulib/m4/mbrtowc.m4 b/gnulib/m4/mbrtowc.m4
new file mode 100644
index 00000000..9ec93f56
--- /dev/null
+++ b/gnulib/m4/mbrtowc.m4
@@ -0,0 +1,384 @@
+# mbrtowc.m4 serial 16
+dnl Copyright (C) 2001-2002, 2004-2005, 2008-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MBRTOWC],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBRTOWC=1
+ fi
+ AC_CHECK_FUNCS_ONCE([mbrtowc])
+ if test $ac_cv_func_mbrtowc = no; then
+ HAVE_MBRTOWC=0
+ fi
+ if test $HAVE_MBRTOWC != 0 && test $REPLACE_MBRTOWC != 1; then
+ gl_MBRTOWC_NULL_ARG
+ gl_MBRTOWC_RETVAL
+ gl_MBRTOWC_NUL_RETVAL
+ case "$gl_cv_func_mbrtowc_null_arg" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_NULL_ARG_BUG], [1],
+ [Define if the mbrtowc function has the NULL string argument bug.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_retval" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1],
+ [Define if the mbrtowc function returns a wrong return value.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_nul_retval" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1],
+ [Define if the mbrtowc function does not return 0 for a NUL character.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ fi
+ if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([mbrtowc])
+ gl_PREREQ_MBRTOWC
+ fi
+])
+
+dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that
+dnl redefines the semantics of the given mbstate_t type.
+dnl Result is REPLACE_MBSTATE_T.
+dnl When this is set to 1, we replace both mbsinit() and mbrtowc(), in order to
+dnl avoid inconsistencies.
+
+AC_DEFUN([gl_MBSTATE_T_BROKEN],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ AC_CHECK_FUNCS_ONCE([mbsinit])
+ AC_CHECK_FUNCS_ONCE([mbrtowc])
+ if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then
+ gl_MBRTOWC_INCOMPLETE_STATE
+ gl_MBRTOWC_SANITYCHECK
+ REPLACE_MBSTATE_T=0
+ case "$gl_cv_func_mbrtowc_incomplete_state" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ case "$gl_cv_func_mbrtowc_sanitycheck" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ else
+ REPLACE_MBSTATE_T=1
+ fi
+ if test $REPLACE_MBSTATE_T = 1; then
+ gl_REPLACE_WCHAR_H
+ fi
+])
+
+dnl Test whether mbrtowc puts the state into non-initial state when parsing an
+dnl incomplete multibyte character.
+dnl Result is gl_cv_func_mbrtowc_incomplete_state.
+
+AC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc handles incomplete characters],
+ [gl_cv_func_mbrtowc_incomplete_state],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on AIX and OSF/1.
+ osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_JA != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 1;
+ }
+ return 0;
+}],
+ [gl_cv_func_mbrtowc_incomplete_state=yes],
+ [gl_cv_func_mbrtowc_incomplete_state=no],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc works not worse than mbtowc.
+dnl Result is gl_cv_func_mbrtowc_sanitycheck.
+
+AC_DEFUN([gl_MBRTOWC_SANITYCHECK],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc works as well as mbtowc],
+ [gl_cv_func_mbrtowc_sanitycheck],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Solaris 8.
+ solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_ZH_CN != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8:
+ mbrtowc returns 2, and sets wc to 0x00F0.
+ mbtowc returns 4 (correct) and sets wc to 0x5EDC. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 6, &state) != 4
+ && mbtowc (&wc, input + 3, 6) == 4)
+ return 1;
+ }
+ return 0;
+}],
+ [gl_cv_func_mbrtowc_sanitycheck=yes],
+ [gl_cv_func_mbrtowc_sanitycheck=no],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc supports a NULL string argument correctly.
+dnl Result is gl_cv_func_mbrtowc_null_arg.
+
+AC_DEFUN([gl_MBRTOWC_NULL_ARG],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument],
+ [gl_cv_func_mbrtowc_null_arg],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on OSF/1.
+ osf*) gl_cv_func_mbrtowc_null_arg="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_null_arg="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR_UTF8 != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ mbstate_t state;
+ wchar_t wc;
+ int ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ mbrtowc (&wc, NULL, 5, &state);
+ /* Check that wc was not modified. */
+ if (wc != (wchar_t) 0xBADFACE)
+ return 1;
+ }
+ return 0;
+}], [gl_cv_func_mbrtowc_null_arg=yes], [gl_cv_func_mbrtowc_null_arg=no], [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc, when parsing the end of a multibyte character,
+dnl correctly returns the number of bytes that were needed to complete the
+dnl character (not the total number of bytes of the multibyte character).
+dnl Result is gl_cv_func_mbrtowc_retval.
+
+AC_DEFUN([gl_MBRTOWC_RETVAL],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc has a correct return value],
+ [gl_cv_func_mbrtowc_retval],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on HP-UX and Solaris.
+ hpux* | solaris*) gl_cv_func_mbrtowc_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_retval="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris. */
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ {
+ input[1] = '\0';
+ if (mbrtowc (&wc, input + 2, 5, &state) != 1)
+ return 1;
+ }
+ }
+ /* This fails on HP-UX 11.11. */
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ {
+ input[1] = '\0';
+ if (mbrtowc (&wc, input + 2, 5, &state) != 2)
+ return 1;
+ }
+ }
+ return 0;
+}],
+ [gl_cv_func_mbrtowc_retval=yes],
+ [gl_cv_func_mbrtowc_retval=no],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0.
+dnl Result is gl_cv_func_mbrtowc_nul_retval.
+
+AC_DEFUN([gl_MBRTOWC_NUL_RETVAL],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character],
+ [gl_cv_func_mbrtowc_nul_retval],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Solaris 8 and 9.
+ solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_ZH_CN != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8 and 9. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "", 1, &state) != 0)
+ return 1;
+ }
+ return 0;
+}],
+ [gl_cv_func_mbrtowc_nul_retval=yes],
+ [gl_cv_func_mbrtowc_nul_retval=no],
+ [:])
+ fi
+ ])
+])
+
+# Prerequisites of lib/mbrtowc.c.
+AC_DEFUN([gl_PREREQ_MBRTOWC], [
+ :
+])
+
+
+dnl From Paul Eggert
+
+dnl This override of an autoconf macro can be removed when autoconf 2.60 or
+dnl newer can be assumed everywhere.
+
+m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.60]),[-1],[
+AC_DEFUN([AC_FUNC_MBRTOWC],
+[
+ dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60.
+ AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
+ gl_cv_func_mbrtowc,
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>]],
+ [[wchar_t wc;
+ char const s[] = "";
+ size_t n = 1;
+ mbstate_t state;
+ return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])],
+ gl_cv_func_mbrtowc=yes,
+ gl_cv_func_mbrtowc=no)])
+ if test $gl_cv_func_mbrtowc = yes; then
+ AC_DEFINE([HAVE_MBRTOWC], [1],
+ [Define to 1 if mbrtowc and mbstate_t are properly declared.])
+ fi
+])
+])
diff --git a/gnulib/m4/mbsinit.m4 b/gnulib/m4/mbsinit.m4
new file mode 100644
index 00000000..13907a51
--- /dev/null
+++ b/gnulib/m4/mbsinit.m4
@@ -0,0 +1,30 @@
+# mbsinit.m4 serial 3
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MBSINIT],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBSINIT=1
+ fi
+ AC_CHECK_FUNCS_ONCE([mbsinit])
+ if test $ac_cv_func_mbsinit = no; then
+ HAVE_MBSINIT=0
+ fi
+ if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([mbsinit])
+ gl_PREREQ_MBSINIT
+ fi
+])
+
+# Prerequisites of lib/mbsinit.c.
+AC_DEFUN([gl_PREREQ_MBSINIT], [
+ :
+])
diff --git a/gnulib/m4/mbslen.m4 b/gnulib/m4/mbslen.m4
new file mode 100644
index 00000000..3c44fa65
--- /dev/null
+++ b/gnulib/m4/mbslen.m4
@@ -0,0 +1,16 @@
+# mbslen.m4 serial 1
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MBSLEN],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([mbslen])
+ if test $ac_cv_func_mbslen = yes; then
+ HAVE_MBSLEN=1
+ else
+ HAVE_MBSLEN=0
+ fi
+])
diff --git a/gnulib/m4/mbsnrtowcs.m4 b/gnulib/m4/mbsnrtowcs.m4
new file mode 100644
index 00000000..6b10fb46
--- /dev/null
+++ b/gnulib/m4/mbsnrtowcs.m4
@@ -0,0 +1,34 @@
+# mbsnrtowcs.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MBSNRTOWCS],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ dnl Persuade glibc <wchar.h> to declare mbsnrtowcs().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBSNRTOWCS=1
+ fi
+ AC_CHECK_FUNCS_ONCE([mbsnrtowcs])
+ if test $ac_cv_func_mbsnrtowcs = no; then
+ HAVE_MBSNRTOWCS=0
+ fi
+ if test $HAVE_MBSNRTOWCS = 0 || test $REPLACE_MBSNRTOWCS = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([mbsnrtowcs])
+ AC_LIBOBJ([mbsrtowcs-state])
+ gl_PREREQ_MBSNRTOWCS
+ fi
+])
+
+# Prerequisites of lib/mbsnrtowcs.c.
+AC_DEFUN([gl_PREREQ_MBSNRTOWCS], [
+ :
+])
diff --git a/gnulib/m4/mbsrtowcs.m4 b/gnulib/m4/mbsrtowcs.m4
new file mode 100644
index 00000000..846a2934
--- /dev/null
+++ b/gnulib/m4/mbsrtowcs.m4
@@ -0,0 +1,121 @@
+# mbsrtowcs.m4 serial 5
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MBSRTOWCS],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBSRTOWCS=1
+ fi
+ AC_CHECK_FUNCS_ONCE([mbsrtowcs])
+ if test $ac_cv_func_mbsrtowcs = no; then
+ HAVE_MBSRTOWCS=0
+ fi
+ if test $HAVE_MBSRTOWCS != 0 && test $REPLACE_MBSRTOWCS != 1; then
+ gl_MBSRTOWCS_WORKS
+ case "$gl_cv_func_mbsrtowcs_works" in
+ *yes) ;;
+ *) REPLACE_MBSRTOWCS=1 ;;
+ esac
+ fi
+ if test $HAVE_MBSRTOWCS = 0 || test $REPLACE_MBSRTOWCS = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([mbsrtowcs])
+ AC_LIBOBJ([mbsrtowcs-state])
+ gl_PREREQ_MBSRTOWCS
+ fi
+])
+
+dnl Test whether mbsrtowcs works.
+dnl Result is gl_cv_func_mbsrtowcs_works.
+
+AC_DEFUN([gl_MBSRTOWCS_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbsrtowcs works],
+ [gl_cv_func_mbsrtowcs_works],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on HP-UX and Solaris.
+ hpux* | solaris*) gl_cv_func_mbsrtowcs_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbsrtowcs_works="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* Test whether the function works when started with a conversion state
+ in non-initial state. This fails on HP-UX 11.11 and Solaris 10. */
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ const char input[] = "B\303\274\303\237er";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 2;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 4)
+ return 1;
+ }
+ }
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "<\306\374\313\334\270\354>";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 3, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 4;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 3)
+ return 1;
+ }
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ const char input[] = "B\250\271\201\060\211\070er";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 2;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 4)
+ return 1;
+ }
+ }
+ return 0;
+}],
+ [gl_cv_func_mbsrtowcs_works=yes],
+ [gl_cv_func_mbsrtowcs_works=no],
+ [:])
+ fi
+ ])
+])
+
+# Prerequisites of lib/mbsrtowcs.c.
+AC_DEFUN([gl_PREREQ_MBSRTOWCS], [
+ :
+])
diff --git a/gnulib/m4/mbstate_t.m4 b/gnulib/m4/mbstate_t.m4
new file mode 100644
index 00000000..3e2df29f
--- /dev/null
+++ b/gnulib/m4/mbstate_t.m4
@@ -0,0 +1,34 @@
+# mbstate_t.m4 serial 12
+dnl Copyright (C) 2000-2002, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# From Paul Eggert.
+
+# BeOS 5 has <wchar.h> but does not define mbstate_t,
+# so you can't declare an object of that type.
+# Check for this incompatibility with Standard C.
+
+# AC_TYPE_MBSTATE_T
+# -----------------
+AC_DEFUN([AC_TYPE_MBSTATE_T],
+[
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl for HP-UX 11.11
+
+ AC_CACHE_CHECK([for mbstate_t], [ac_cv_type_mbstate_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT[
+# include <wchar.h>]],
+ [[mbstate_t x; return sizeof x;]])],
+ [ac_cv_type_mbstate_t=yes],
+ [ac_cv_type_mbstate_t=no])])
+ if test $ac_cv_type_mbstate_t = yes; then
+ AC_DEFINE([HAVE_MBSTATE_T], [1],
+ [Define to 1 if <wchar.h> declares mbstate_t.])
+ else
+ AC_DEFINE([mbstate_t], [int],
+ [Define to a type if <wchar.h> does not define.])
+ fi
+])
diff --git a/gnulib/m4/mbswidth.m4 b/gnulib/m4/mbswidth.m4
new file mode 100644
index 00000000..25089f27
--- /dev/null
+++ b/gnulib/m4/mbswidth.m4
@@ -0,0 +1,41 @@
+# mbswidth.m4 serial 17
+dnl Copyright (C) 2000-2002, 2004, 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl autoconf tests required for use of mbswidth.c
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_MBSWIDTH],
+[
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+ AC_CHECK_FUNCS_ONCE([isascii mbsinit])
+
+ dnl UnixWare 7.1.1 <wchar.h> has a declaration of a function mbswidth()
+ dnl that clashes with ours.
+ AC_CACHE_CHECK([whether mbswidth is declared in <wchar.h>],
+ ac_cv_have_decl_mbswidth,
+ [AC_TRY_COMPILE([
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+], [
+ char *p = (char *) mbswidth;
+ return !p;
+], ac_cv_have_decl_mbswidth=yes, ac_cv_have_decl_mbswidth=no)])
+ if test $ac_cv_have_decl_mbswidth = yes; then
+ ac_val=1
+ else
+ ac_val=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_DECL_MBSWIDTH_IN_WCHAR_H], [$ac_val],
+ [Define to 1 if you have a declaration of mbswidth() in <wchar.h>, and to 0 otherwise.])
+
+ AC_TYPE_MBSTATE_T
+])
diff --git a/gnulib/m4/md2.m4 b/gnulib/m4/md2.m4
new file mode 100644
index 00000000..196da235
--- /dev/null
+++ b/gnulib/m4/md2.m4
@@ -0,0 +1,11 @@
+# md2.m4 serial 2
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MD2],
+[
+ AC_LIBOBJ([md2])
+])
diff --git a/gnulib/m4/md4.m4 b/gnulib/m4/md4.m4
new file mode 100644
index 00000000..9747d6b2
--- /dev/null
+++ b/gnulib/m4/md4.m4
@@ -0,0 +1,15 @@
+# md4.m4 serial 4
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MD4],
+[
+ AC_LIBOBJ([md4])
+
+ dnl Prerequisites of lib/md4.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/md5.m4 b/gnulib/m4/md5.m4
new file mode 100644
index 00000000..52f9c1b8
--- /dev/null
+++ b/gnulib/m4/md5.m4
@@ -0,0 +1,16 @@
+# md5.m4 serial 11
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MD5],
+[
+ AC_LIBOBJ([md5])
+
+ dnl Prerequisites of lib/md5.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
diff --git a/gnulib/m4/memcasecmp.m4 b/gnulib/m4/memcasecmp.m4
new file mode 100644
index 00000000..1a0879bc
--- /dev/null
+++ b/gnulib/m4/memcasecmp.m4
@@ -0,0 +1,10 @@
+#serial 5
+dnl Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MEMCASECMP],
+[
+ AC_LIBOBJ([memcasecmp])
+])
diff --git a/gnulib/m4/memchr.m4 b/gnulib/m4/memchr.m4
new file mode 100644
index 00000000..94596ef9
--- /dev/null
+++ b/gnulib/m4/memchr.m4
@@ -0,0 +1,86 @@
+# memchr.m4 serial 7
+dnl Copyright (C) 2002-2004, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_FUNC_MEMCHR],
+[
+ dnl Check for prerequisites for memory fence checks.
+ gl_FUNC_MMAP_ANON
+ AC_CHECK_HEADERS_ONCE([sys/mman.h])
+ AC_CHECK_FUNCS_ONCE([mprotect])
+
+ dnl These days, we assume memchr is present. But just in case...
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([memchr])
+ if test $ac_cv_func_memchr = no; then
+ gl_PREREQ_MEMCHR
+ REPLACE_MEMCHR=1
+ fi
+
+ if test $ac_cv_func_memchr = yes; then
+ # Detect platform-specific bugs in some versions of glibc:
+ # memchr should not dereference anything with length 0
+ # http://bugzilla.redhat.com/499689
+ # memchr should not dereference overestimated length after a match
+ # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
+ # http://sourceware.org/bugzilla/show_bug.cgi?id=10162
+ # Assume that memchr works on platforms that lack mprotect.
+ AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <string.h>
+#if HAVE_SYS_MMAN_H
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+#endif
+]], [[
+ char *fence = NULL;
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# if HAVE_MAP_ANONYMOUS
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+ const int fd = -1;
+# else /* !HAVE_MAP_ANONYMOUS */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ int fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd >= 0)
+# endif
+ {
+ int pagesize = getpagesize ();
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ flags, fd, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ fence = two_pages + pagesize;
+ }
+#endif
+ if (fence)
+ {
+ if (memchr (fence, 0, 0))
+ return 1;
+ strcpy (fence - 9, "12345678");
+ if (memchr (fence - 9, 0, 79) != fence - 1)
+ return 2;
+ }
+ return 0;
+]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no],
+ [dnl Be pessimistic for now.
+ gl_cv_func_memchr_works="guessing no"])])
+ if test "$gl_cv_func_memchr_works" != yes; then
+ gl_PREREQ_MEMCHR
+ REPLACE_MEMCHR=1
+ AC_LIBOBJ([memchr])
+ fi
+ fi
+])
+
+# Prerequisites of lib/memchr.c.
+AC_DEFUN([gl_PREREQ_MEMCHR], [
+ AC_CHECK_HEADERS([bp-sym.h])
+])
diff --git a/gnulib/m4/memcmp.m4 b/gnulib/m4/memcmp.m4
new file mode 100644
index 00000000..c0e9265d
--- /dev/null
+++ b/gnulib/m4/memcmp.m4
@@ -0,0 +1,31 @@
+# memcmp.m4 serial 14
+dnl Copyright (C) 2002-2004, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMCMP],
+[
+ if test $cross_compiling != no; then
+ # AC_FUNC_MEMCMP as of 2.62 defaults to 'no' when cross compiling.
+ # We default to yes if memcmp appears to exist, which works
+ # better for MinGW.
+ AC_CACHE_CHECK([whether cross-compiling target has memcmp],
+ [ac_cv_func_memcmp_working],
+ [AC_LINK_IFELSE([
+ AC_LANG_PROGRAM([[#include <string.h>
+ ]], [[int ret = memcmp ("foo", "bar", 0);]])],
+ [ac_cv_func_memcmp_working=yes],
+ [ac_cv_func_memcmp_working=no])])
+ fi
+ AC_FUNC_MEMCMP
+ dnl Note: AC_FUNC_MEMCMP does AC_LIBOBJ([memcmp]).
+ if test $ac_cv_func_memcmp_working = no; then
+ AC_DEFINE([memcmp], [rpl_memcmp],
+ [Define to rpl_memcmp if the replacement function should be used.])
+ gl_PREREQ_MEMCMP
+ fi
+])
+
+# Prerequisites of lib/memcmp.c.
+AC_DEFUN([gl_PREREQ_MEMCMP], [:])
diff --git a/gnulib/m4/memcoll.m4 b/gnulib/m4/memcoll.m4
new file mode 100644
index 00000000..1c4bd61c
--- /dev/null
+++ b/gnulib/m4/memcoll.m4
@@ -0,0 +1,14 @@
+# memcoll.m4 serial 7
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MEMCOLL],
+[
+ AC_LIBOBJ([memcoll])
+
+ dnl Prerequisites of lib/memcoll.c.
+ AC_FUNC_STRCOLL
+])
diff --git a/gnulib/m4/memcpy.m4 b/gnulib/m4/memcpy.m4
new file mode 100644
index 00000000..49192a04
--- /dev/null
+++ b/gnulib/m4/memcpy.m4
@@ -0,0 +1,18 @@
+# memcpy.m4 serial 3
+dnl Copyright (C) 2002, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMCPY],
+[
+ AC_REPLACE_FUNCS([memcpy])
+ if test $ac_cv_func_memcpy = no; then
+ gl_PREREQ_MEMCPY
+ fi
+])
+
+# Prerequisites of lib/memcpy.c.
+AC_DEFUN([gl_PREREQ_MEMCPY], [
+ :
+])
diff --git a/gnulib/m4/memmem.m4 b/gnulib/m4/memmem.m4
new file mode 100644
index 00000000..c6506ee5
--- /dev/null
+++ b/gnulib/m4/memmem.m4
@@ -0,0 +1,84 @@
+# memmem.m4 serial 14
+dnl Copyright (C) 2002, 2003, 2004, 2007, 2008, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check that memmem is present.
+AC_DEFUN([gl_FUNC_MEMMEM_SIMPLE],
+[
+ dnl Persuade glibc <string.h> to declare memmem().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([memmem])
+ AC_CHECK_DECLS_ONCE([memmem])
+ if test $ac_cv_have_decl_memmem = no; then
+ HAVE_DECL_MEMMEM=0
+ fi
+ gl_PREREQ_MEMMEM
+]) # gl_FUNC_MEMMEM_SIMPLE
+
+dnl Additionally, check that memmem is efficient and handles empty needles.
+AC_DEFUN([gl_FUNC_MEMMEM],
+[
+ AC_REQUIRE([gl_FUNC_MEMMEM_SIMPLE])
+ if test $ac_cv_have_decl_memmem = yes; then
+ AC_CACHE_CHECK([whether memmem works in linear time],
+ [gl_cv_func_memmem_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <signal.h> /* for signal */
+#include <string.h> /* for memmem */
+#include <stdlib.h> /* for malloc */
+#include <unistd.h> /* for alarm */
+]], [[size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 1);
+ char *needle = (char *) malloc (m + 1);
+ void *result = 0;
+ /* Failure to compile this test due to missing alarm is okay,
+ since all such platforms (mingw) also lack memmem. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (5);
+ /* Check for quadratic performance. */
+ if (haystack && needle)
+ {
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ memset (needle, 'A', m);
+ needle[m] = 'B';
+ result = memmem (haystack, 2 * m + 1, needle, m + 1);
+ }
+ /* Check for empty needle behavior. */
+ return !result || !memmem ("a", 1, 0, 0);]])],
+ [gl_cv_func_memmem_works=yes], [gl_cv_func_memmem_works=no],
+ [dnl Only glibc >= 2.9 and cygwin >= 1.7.0 are known to have a
+ dnl memmem that works in linear time.
+ AC_EGREP_CPP([Lucky user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9) || (__GLIBC__ > 2)
+ Lucky user
+ #endif
+#endif
+#ifdef __CYGWIN__
+ #include <cygwin/version.h>
+ #if CYGWIN_VERSION_DLL_MAJOR >= 1007
+ Lucky user
+ #endif
+#endif
+ ],
+ [gl_cv_func_memmem_works=yes],
+ [gl_cv_func_memmem_works="guessing no"])
+ ])
+ ])
+ if test "$gl_cv_func_memmem_works" != yes; then
+ REPLACE_MEMMEM=1
+ AC_LIBOBJ([memmem])
+ fi
+ fi
+]) # gl_FUNC_MEMMEM
+
+# Prerequisites of lib/memmem.c.
+AC_DEFUN([gl_PREREQ_MEMMEM], [:])
diff --git a/gnulib/m4/memmove.m4 b/gnulib/m4/memmove.m4
new file mode 100644
index 00000000..525704be
--- /dev/null
+++ b/gnulib/m4/memmove.m4
@@ -0,0 +1,18 @@
+# memmove.m4 serial 3
+dnl Copyright (C) 2002, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMMOVE],
+[
+ AC_REPLACE_FUNCS([memmove])
+ if test $ac_cv_func_memmove = no; then
+ gl_PREREQ_MEMMOVE
+ fi
+])
+
+# Prerequisites of lib/memmove.c.
+AC_DEFUN([gl_PREREQ_MEMMOVE], [
+ :
+])
diff --git a/gnulib/m4/mempcpy.m4 b/gnulib/m4/mempcpy.m4
new file mode 100644
index 00000000..12df771e
--- /dev/null
+++ b/gnulib/m4/mempcpy.m4
@@ -0,0 +1,27 @@
+# mempcpy.m4 serial 10
+dnl Copyright (C) 2003-2004, 2006-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMPCPY],
+[
+ dnl Persuade glibc <string.h> to declare mempcpy().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl The mempcpy() declaration in lib/string.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([mempcpy])
+ if test $ac_cv_func_mempcpy = no; then
+ HAVE_MEMPCPY=0
+ gl_PREREQ_MEMPCPY
+ fi
+])
+
+# Prerequisites of lib/mempcpy.c.
+AC_DEFUN([gl_PREREQ_MEMPCPY], [
+ :
+])
diff --git a/gnulib/m4/memrchr.m4 b/gnulib/m4/memrchr.m4
new file mode 100644
index 00000000..57ed978a
--- /dev/null
+++ b/gnulib/m4/memrchr.m4
@@ -0,0 +1,26 @@
+# memrchr.m4 serial 9
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMRCHR],
+[
+ dnl Persuade glibc <string.h> to declare memrchr().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_DECLS_ONCE([memrchr])
+ if test $ac_cv_have_decl_memrchr = no; then
+ HAVE_DECL_MEMRCHR=0
+ fi
+
+ AC_REPLACE_FUNCS([memrchr])
+ if test $ac_cv_func_memrchr = no; then
+ gl_PREREQ_MEMRCHR
+ fi
+])
+
+# Prerequisites of lib/memrchr.c.
+AC_DEFUN([gl_PREREQ_MEMRCHR], [:])
diff --git a/gnulib/m4/memset.m4 b/gnulib/m4/memset.m4
new file mode 100644
index 00000000..2e778a9e
--- /dev/null
+++ b/gnulib/m4/memset.m4
@@ -0,0 +1,18 @@
+# memset.m4 serial 3
+dnl Copyright (C) 2002, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMSET],
+[
+ AC_REPLACE_FUNCS([memset])
+ if test $ac_cv_func_memset = no; then
+ gl_PREREQ_MEMSET
+ fi
+])
+
+# Prerequisites of lib/memset.c.
+AC_DEFUN([gl_PREREQ_MEMSET], [
+ :
+])
diff --git a/gnulib/m4/memxor.m4 b/gnulib/m4/memxor.m4
new file mode 100644
index 00000000..3093cdc3
--- /dev/null
+++ b/gnulib/m4/memxor.m4
@@ -0,0 +1,11 @@
+# memxor.m4 serial 3
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MEMXOR],
+[
+ AC_LIBOBJ([memxor])
+ AC_REQUIRE([AC_C_RESTRICT])
+])
diff --git a/gnulib/m4/mgetgroups.m4 b/gnulib/m4/mgetgroups.m4
new file mode 100644
index 00000000..309fb913
--- /dev/null
+++ b/gnulib/m4/mgetgroups.m4
@@ -0,0 +1,11 @@
+#serial 4
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MGETGROUPS],
+[
+ AC_CHECK_FUNCS_ONCE([getgrouplist])
+ AC_LIBOBJ([mgetgroups])
+])
diff --git a/gnulib/m4/minmax.m4 b/gnulib/m4/minmax.m4
new file mode 100644
index 00000000..d9e9cecf
--- /dev/null
+++ b/gnulib/m4/minmax.m4
@@ -0,0 +1,41 @@
+# minmax.m4 serial 3
+dnl Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.52])
+
+AC_DEFUN([gl_MINMAX],
+[
+ AC_REQUIRE([gl_PREREQ_MINMAX])
+])
+
+# Prerequisites of lib/minmax.h.
+AC_DEFUN([gl_PREREQ_MINMAX],
+[
+ gl_MINMAX_IN_HEADER([limits.h])
+ gl_MINMAX_IN_HEADER([sys/param.h])
+])
+
+dnl gl_MINMAX_IN_HEADER(HEADER)
+dnl The parameter has to be a literal header name; it cannot be macro,
+dnl nor a shell variable. (Because autoheader collects only AC_DEFINE
+dnl invocations with a literal macro name.)
+AC_DEFUN([gl_MINMAX_IN_HEADER],
+[
+ m4_pushdef([header], AS_TR_SH([$1]))
+ m4_pushdef([HEADER], AS_TR_CPP([$1]))
+ AC_CACHE_CHECK([whether <$1> defines MIN and MAX],
+ [gl_cv_minmax_in_]header,
+ [AC_TRY_COMPILE([#include <$1>
+int x = MIN (42, 17);], [],
+ [gl_cv_minmax_in_]header[=yes],
+ [gl_cv_minmax_in_]header[=no])])
+ if test $gl_cv_minmax_in_[]header = yes; then
+ AC_DEFINE([HAVE_MINMAX_IN_]HEADER, 1,
+ [Define to 1 if <$1> defines the MIN and MAX macros.])
+ fi
+ m4_popdef([HEADER])
+ m4_popdef([header])
+])
diff --git a/gnulib/m4/mkancesdirs.m4 b/gnulib/m4/mkancesdirs.m4
new file mode 100644
index 00000000..46cdb4b3
--- /dev/null
+++ b/gnulib/m4/mkancesdirs.m4
@@ -0,0 +1,10 @@
+# Make a file's ancestor directories.
+dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MKANCESDIRS],
+[
+ AC_LIBOBJ([mkancesdirs])
+])
diff --git a/gnulib/m4/mkdir-p.m4 b/gnulib/m4/mkdir-p.m4
new file mode 100644
index 00000000..4281d014
--- /dev/null
+++ b/gnulib/m4/mkdir-p.m4
@@ -0,0 +1,16 @@
+# mkdir-p.m4 serial 13
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MKDIR_PARENTS],
+[
+ AC_LIBOBJ([dirchownmod])
+ AC_LIBOBJ([mkdir-p])
+
+ dnl Prerequisites of lib/dirchownmod.c.
+ AC_REQUIRE([gl_FUNC_LCHMOD])
+ AC_REQUIRE([gl_FUNC_LCHOWN])
+ AC_CHECK_FUNCS_ONCE([fchmod])
+])
diff --git a/gnulib/m4/mkdir.m4 b/gnulib/m4/mkdir.m4
new file mode 100644
index 00000000..87f5f21c
--- /dev/null
+++ b/gnulib/m4/mkdir.m4
@@ -0,0 +1,52 @@
+# serial 9
+
+# Copyright (C) 2001, 2003-2004, 2006, 2008-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# On some systems, mkdir ("foo/", 0700) fails because of the trailing slash.
+# On others, mkdir ("foo/./", 0700) mistakenly succeeds.
+# On such systems, arrange to use a wrapper function.
+AC_DEFUN([gl_FUNC_MKDIR],
+[dnl
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CACHE_CHECK([whether mkdir handles trailing slash],
+ [gl_cv_func_mkdir_trailing_slash_works],
+ [rm -rf conftest.dir
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+# include <sys/types.h>
+# include <sys/stat.h>
+]], [return mkdir ("conftest.dir/", 0700);])],
+ [gl_cv_func_mkdir_trailing_slash_works=yes],
+ [gl_cv_func_mkdir_trailing_slash_works=no],
+ [gl_cv_func_mkdir_trailing_slash_works="guessing no"])
+ rm -rf conftest.dir
+ ]
+ )
+ if test "$gl_cv_func_mkdir_trailing_slash_works" != yes; then
+ REPLACE_MKDIR=1
+ AC_LIBOBJ([mkdir])
+ fi
+
+ AC_CACHE_CHECK([whether mkdir handles trailing dot],
+ [gl_cv_func_mkdir_trailing_dot_works],
+ [rm -rf conftest.dir
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+# include <sys/types.h>
+# include <sys/stat.h>
+]], [return !mkdir ("conftest.dir/./", 0700);])],
+ [gl_cv_func_mkdir_trailing_dot_works=yes],
+ [gl_cv_func_mkdir_trailing_dot_works=no],
+ [gl_cv_func_mkdir_trailing_dot_works="guessing no"])
+ rm -rf conftest.dir
+ ]
+ )
+ if test "$gl_cv_func_mkdir_trailing_dot_works" != yes; then
+ REPLACE_MKDIR=1
+ AC_LIBOBJ([mkdir])
+ AC_DEFINE([FUNC_MKDIR_DOT_BUG], [1], [Define to 1 if mkdir mistakenly
+ creates a directory given with a trailing dot component.])
+ fi
+])
diff --git a/gnulib/m4/mkdtemp.m4 b/gnulib/m4/mkdtemp.m4
new file mode 100644
index 00000000..6a07e029
--- /dev/null
+++ b/gnulib/m4/mkdtemp.m4
@@ -0,0 +1,21 @@
+# mkdtemp.m4 serial 6
+dnl Copyright (C) 2001-2003, 2006-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gt_FUNC_MKDTEMP],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REPLACE_FUNCS([mkdtemp])
+ if test $ac_cv_func_mkdtemp = no; then
+ HAVE_MKDTEMP=0
+ gl_PREREQ_MKDTEMP
+ fi
+])
+
+# Prerequisites of lib/mkdtemp.c
+AC_DEFUN([gl_PREREQ_MKDTEMP],
+[:
+])
diff --git a/gnulib/m4/mkfifo.m4 b/gnulib/m4/mkfifo.m4
new file mode 100644
index 00000000..8d1f634c
--- /dev/null
+++ b/gnulib/m4/mkfifo.m4
@@ -0,0 +1,45 @@
+# serial 1
+# See if we need to provide mkfifo replacement.
+
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_MKFIFO],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([mkfifo])
+ if test $ac_cv_func_mkfifo = no; then
+ HAVE_MKFIFO=0
+ AC_LIBOBJ([mkfifo])
+ else
+ dnl Check for Solaris 9 and FreeBSD bug with trailing slash.
+ AC_CHECK_FUNCS_ONCE([lstat])
+ AC_CACHE_CHECK([whether mkfifo rejects trailing slashes],
+ [gl_cv_func_mkfifo_works],
+ [# Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.tmp conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/stat.h>
+]], [[if (!mkfifo ("conftest.tmp/", 0600)) return 1;
+#if HAVE_LSTAT
+ if (!mkfifo ("conftest.lnk/", 0600)) return 2;
+#endif
+ ]])],
+ [gl_cv_func_mkfifo_works=yes], [gl_cv_func_mkfifo_works=no],
+ [gl_cv_func_mkfifo_works="guessing no"])
+ rm -f conftest.tmp conftest.lnk])
+ if test "$gl_cv_func_mkfifo_works" != yes; then
+ AC_DEFINE([MKFIFO_TRAILING_SLASH_BUG], [1], [Define to 1 if mkfifo
+ does not reject trailing slash])
+ REPLACE_MKFIFO=1
+ AC_LIBOBJ([mkfifo])
+ fi
+ fi
+])
diff --git a/gnulib/m4/mkfifoat.m4 b/gnulib/m4/mkfifoat.m4
new file mode 100644
index 00000000..0b373bbc
--- /dev/null
+++ b/gnulib/m4/mkfifoat.m4
@@ -0,0 +1,24 @@
+# serial 2
+# See if we need to provide mkfifoat/mknodat replacement.
+
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_MKFIFOAT],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_OPENAT])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([mkfifoat mknodat])
+ if test $ac_cv_func_mkfifoat = no; then
+ # No known system has mkfifoat but not mknodat
+ HAVE_MKFIFOAT=0
+ HAVE_MKNODAT=0
+ AC_LIBOBJ([mkfifoat])
+ AC_LIBOBJ([mknodat])
+ fi
+])
diff --git a/gnulib/m4/mknod.m4 b/gnulib/m4/mknod.m4
new file mode 100644
index 00000000..4d9214d0
--- /dev/null
+++ b/gnulib/m4/mknod.m4
@@ -0,0 +1,45 @@
+# serial 1
+# See if we need to provide mknod replacement.
+
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_MKNOD],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_MKFIFO])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([mknod])
+ if test $ac_cv_func_mknod = no; then
+ HAVE_MKNOD=0
+ AC_LIBOBJ([mknod])
+ else
+ dnl Detect BSD bug, where mknod requires root privileges to create fifo.
+ AC_CACHE_CHECK([whether mknod can create fifo without root privileges],
+ [gl_cv_func_mknod_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/stat.h>
+ #include <unistd.h>
+]], [[/* Indeterminate for super-user, assume no. Why are you running
+ configure as root, anyway? */
+ if (!geteuid ()) return 1;
+ if (mknod ("conftest.fifo", S_IFIFO | 0600, 0)) return 2;]])],
+ [gl_cv_func_mknod_works=yes], [gl_cv_func_mknod_works=no],
+ [gl_cv_func_mknod_works="guessing no"])
+ rm -f conftest.fifo])
+ if test "$gl_cv_func_mknod_works" != yes; then
+ AC_DEFINE([MKNOD_FIFO_BUG], [1], [Define to 1 if mknod cannot create
+ a fifo without super-user privileges])
+ fi
+ dnl Systems that mishandle trailing slash on mkfifo also goof on mknod.
+ if test $REPLACE_MKFIFO = 1 || test "$gl_cv_func_mknod_works" != yes; then
+ REPLACE_MKNOD=1
+ AC_LIBOBJ([mknod])
+ fi
+ fi
+])
diff --git a/gnulib/m4/mkostemp.m4 b/gnulib/m4/mkostemp.m4
new file mode 100644
index 00000000..b4b4dd06
--- /dev/null
+++ b/gnulib/m4/mkostemp.m4
@@ -0,0 +1,25 @@
+# mkostemp.m4 serial 1
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MKOSTEMP],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+ dnl Persuade glibc <stdlib.h> to declare mkostemp().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([mkostemp])
+ if test $ac_cv_func_mkostemp != yes; then
+ HAVE_MKOSTEMP=0
+ AC_LIBOBJ([mkostemp])
+ gl_PREREQ_MKOSTEMP
+ fi
+])
+
+# Prerequisites of lib/mkostemp.c.
+AC_DEFUN([gl_PREREQ_MKOSTEMP],
+[
+])
diff --git a/gnulib/m4/mkostemps.m4 b/gnulib/m4/mkostemps.m4
new file mode 100644
index 00000000..83a35f0a
--- /dev/null
+++ b/gnulib/m4/mkostemps.m4
@@ -0,0 +1,19 @@
+# mkostemps.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MKOSTEMPS],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+ dnl Persuade glibc <stdlib.h> to declare mkostemps().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([mkostemps])
+ if test $ac_cv_func_mkostemps != yes; then
+ HAVE_MKOSTEMPS=0
+ AC_LIBOBJ([mkostemps])
+ fi
+])
diff --git a/gnulib/m4/mkstemp.m4 b/gnulib/m4/mkstemp.m4
new file mode 100644
index 00000000..e4fee76d
--- /dev/null
+++ b/gnulib/m4/mkstemp.m4
@@ -0,0 +1,56 @@
+#serial 17
+
+# Copyright (C) 2001, 2003-2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# On some hosts (e.g., HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a
+# silly limit that it can create no more than 26 files from a given template.
+# Other systems lack mkstemp altogether.
+# On OSF1/Tru64 V4.0F, the system-provided mkstemp function can create
+# only 32 files per process.
+# On systems like the above, arrange to use the replacement function.
+AC_DEFUN([gl_FUNC_MKSTEMP],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REQUIRE([AC_SYS_LARGEFILE])
+
+ AC_CACHE_CHECK([for working mkstemp],
+ [gl_cv_func_working_mkstemp],
+ [
+ mkdir conftest.mkstemp
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT],
+ [[int i;
+ off_t large = (off_t) 4294967295u;
+ if (large < 0)
+ large = 2147483647;
+ for (i = 0; i < 70; i++)
+ {
+ char templ[] = "conftest.mkstemp/coXXXXXX";
+ int (*mkstemp_function) (char *) = mkstemp;
+ int fd = mkstemp_function (templ);
+ if (fd < 0 || lseek (fd, large, SEEK_SET) != large)
+ return 1;
+ close (fd);
+ }
+ return 0;]])],
+ [gl_cv_func_working_mkstemp=yes],
+ [gl_cv_func_working_mkstemp=no],
+ [gl_cv_func_working_mkstemp=no])
+ rm -rf conftest.mkstemp
+ ])
+
+ if test $gl_cv_func_working_mkstemp != yes; then
+ REPLACE_MKSTEMP=1
+ AC_LIBOBJ([mkstemp])
+ gl_PREREQ_MKSTEMP
+ fi
+])
+
+# Prerequisites of lib/mkstemp.c.
+AC_DEFUN([gl_PREREQ_MKSTEMP],
+[
+])
diff --git a/gnulib/m4/mkstemps.m4 b/gnulib/m4/mkstemps.m4
new file mode 100644
index 00000000..89cc2d4b
--- /dev/null
+++ b/gnulib/m4/mkstemps.m4
@@ -0,0 +1,19 @@
+# mkstemps.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MKSTEMPS],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+ dnl Persuade glibc <stdlib.h> to declare mkstemps().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([mkstemps])
+ if test $ac_cv_func_mkstemps != yes; then
+ HAVE_MKSTEMPS=0
+ AC_LIBOBJ([mkstemps])
+ fi
+])
diff --git a/gnulib/m4/mktime.m4 b/gnulib/m4/mktime.m4
new file mode 100644
index 00000000..44b8d878
--- /dev/null
+++ b/gnulib/m4/mktime.m4
@@ -0,0 +1,234 @@
+# serial 15
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Jim Meyering.
+
+# Redefine AC_FUNC_MKTIME, to fix a bug in Autoconf 2.61a and earlier.
+# This redefinition can be removed once a new version of Autoconf is assumed.
+# The redefinition is taken from
+# <http://cvs.sv.gnu.org/viewcvs/*checkout*/autoconf/autoconf/lib/autoconf/functions.m4?rev=1.119>.
+# AC_FUNC_MKTIME
+# --------------
+AC_DEFUN([AC_FUNC_MKTIME],
+[AC_CHECK_HEADERS_ONCE([unistd.h])
+AC_CHECK_FUNCS_ONCE([alarm])
+AC_REQUIRE([gl_MULTIARCH])
+if test $APPLE_UNIVERSAL_BUILD = 1; then
+ # A universal build on Apple MacOS X platforms.
+ # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode.
+ # But we need a configuration result that is valid in both modes.
+ ac_cv_func_working_mktime=no
+fi
+AC_CACHE_CHECK([for working mktime], [ac_cv_func_working_mktime],
+[AC_RUN_IFELSE([AC_LANG_SOURCE(
+[[/* Test program from Paul Eggert and Tony Leneis. */
+#include <limits.h>
+#include <stdlib.h>
+#include <time.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifndef HAVE_ALARM
+# define alarm(X) /* empty */
+#endif
+
+/* Work around redefinition to rpl_putenv by other config tests. */
+#undef putenv
+
+static time_t time_t_max;
+static time_t time_t_min;
+
+/* Values we'll use to set the TZ environment variable. */
+static char *tz_strings[] = {
+ (char *) 0, "TZ=GMT0", "TZ=JST-9",
+ "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00"
+};
+#define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0]))
+
+/* Return 0 if mktime fails to convert a date in the spring-forward gap.
+ Based on a problem report from Andreas Jaeger. */
+static int
+spring_forward_gap ()
+{
+ /* glibc (up to about 1998-10-07) failed this test. */
+ struct tm tm;
+
+ /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
+ instead of "TZ=America/Vancouver" in order to detect the bug even
+ on systems that don't support the Olson extension, or don't have the
+ full zoneinfo tables installed. */
+ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
+
+ tm.tm_year = 98;
+ tm.tm_mon = 3;
+ tm.tm_mday = 5;
+ tm.tm_hour = 2;
+ tm.tm_min = 0;
+ tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+ return mktime (&tm) != (time_t) -1;
+}
+
+static int
+mktime_test1 (time_t now)
+{
+ struct tm *lt;
+ return ! (lt = localtime (&now)) || mktime (lt) == now;
+}
+
+static int
+mktime_test (time_t now)
+{
+ return (mktime_test1 (now)
+ && mktime_test1 ((time_t) (time_t_max - now))
+ && mktime_test1 ((time_t) (time_t_min + now)));
+}
+
+static int
+irix_6_4_bug ()
+{
+ /* Based on code from Ariel Faigon. */
+ struct tm tm;
+ tm.tm_year = 96;
+ tm.tm_mon = 3;
+ tm.tm_mday = 0;
+ tm.tm_hour = 0;
+ tm.tm_min = 0;
+ tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+ mktime (&tm);
+ return tm.tm_mon == 2 && tm.tm_mday == 31;
+}
+
+static int
+bigtime_test (int j)
+{
+ struct tm tm;
+ time_t now;
+ tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j;
+ now = mktime (&tm);
+ if (now != (time_t) -1)
+ {
+ struct tm *lt = localtime (&now);
+ if (! (lt
+ && lt->tm_year == tm.tm_year
+ && lt->tm_mon == tm.tm_mon
+ && lt->tm_mday == tm.tm_mday
+ && lt->tm_hour == tm.tm_hour
+ && lt->tm_min == tm.tm_min
+ && lt->tm_sec == tm.tm_sec
+ && lt->tm_yday == tm.tm_yday
+ && lt->tm_wday == tm.tm_wday
+ && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst)
+ == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst))))
+ return 0;
+ }
+ return 1;
+}
+
+static int
+year_2050_test ()
+{
+ /* The correct answer for 2050-02-01 00:00:00 in Pacific time,
+ ignoring leap seconds. */
+ unsigned long int answer = 2527315200UL;
+
+ struct tm tm;
+ time_t t;
+ tm.tm_year = 2050 - 1900;
+ tm.tm_mon = 2 - 1;
+ tm.tm_mday = 1;
+ tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+
+ /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
+ instead of "TZ=America/Vancouver" in order to detect the bug even
+ on systems that don't support the Olson extension, or don't have the
+ full zoneinfo tables installed. */
+ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
+
+ t = mktime (&tm);
+
+ /* Check that the result is either a failure, or close enough
+ to the correct answer that we can assume the discrepancy is
+ due to leap seconds. */
+ return (t == (time_t) -1
+ || (0 < t && answer - 120 <= t && t <= answer + 120));
+}
+
+int
+main ()
+{
+ time_t t, delta;
+ int i, j;
+
+ /* This test makes some buggy mktime implementations loop.
+ Give up after 60 seconds; a mktime slower than that
+ isn't worth using anyway. */
+ alarm (60);
+
+ for (;;)
+ {
+ t = (time_t_max << 1) + 1;
+ if (t <= time_t_max)
+ break;
+ time_t_max = t;
+ }
+ time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max;
+
+ delta = time_t_max / 997; /* a suitable prime number */
+ for (i = 0; i < N_STRINGS; i++)
+ {
+ if (tz_strings[i])
+ putenv (tz_strings[i]);
+
+ for (t = 0; t <= time_t_max - delta; t += delta)
+ if (! mktime_test (t))
+ return 1;
+ if (! (mktime_test ((time_t) 1)
+ && mktime_test ((time_t) (60 * 60))
+ && mktime_test ((time_t) (60 * 60 * 24))))
+ return 1;
+
+ for (j = 1; ; j <<= 1)
+ if (! bigtime_test (j))
+ return 1;
+ else if (INT_MAX / 2 < j)
+ break;
+ if (! bigtime_test (INT_MAX))
+ return 1;
+ }
+ return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ());
+}]])],
+ [ac_cv_func_working_mktime=yes],
+ [ac_cv_func_working_mktime=no],
+ [ac_cv_func_working_mktime=no])])
+if test $ac_cv_func_working_mktime = no; then
+ AC_LIBOBJ([mktime])
+fi
+])# AC_FUNC_MKTIME
+
+AC_DEFUN([gl_FUNC_MKTIME],
+[
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_FUNC_MKTIME
+ dnl Note: AC_FUNC_MKTIME does AC_LIBOBJ([mktime]).
+ if test $ac_cv_func_working_mktime = no; then
+ REPLACE_MKTIME=1
+ gl_PREREQ_MKTIME
+ else
+ REPLACE_MKTIME=0
+ fi
+])
+
+# Prerequisites of lib/mktime.c.
+AC_DEFUN([gl_PREREQ_MKTIME],
+[
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/mmap-anon.m4 b/gnulib/m4/mmap-anon.m4
new file mode 100644
index 00000000..a6b7b9ac
--- /dev/null
+++ b/gnulib/m4/mmap-anon.m4
@@ -0,0 +1,59 @@
+# mmap-anon.m4 serial 8
+dnl Copyright (C) 2005, 2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Detect how mmap can be used to create anonymous (not file-backed) memory
+# mappings.
+# - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS
+# and MAP_ANON exist and have the same value.
+# - On HP-UX, only MAP_ANONYMOUS exists.
+# - On MacOS X, FreeBSD, NetBSD, OpenBSD, only MAP_ANON exists.
+# - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be
+# used.
+
+AC_DEFUN([gl_FUNC_MMAP_ANON],
+[
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+
+ dnl Persuade glibc <sys/mman.h> to define MAP_ANONYMOUS.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
+ # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
+ # irrelevant for anonymous mappings.
+ AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no])
+
+ # Try to allow MAP_ANONYMOUS.
+ gl_have_mmap_anonymous=no
+ if test $gl_have_mmap = yes; then
+ AC_MSG_CHECKING([for MAP_ANONYMOUS])
+ AC_EGREP_CPP([I cant identify this map.], [
+#include <sys/mman.h>
+#ifdef MAP_ANONYMOUS
+ I cant identify this map.
+#endif
+],
+ [gl_have_mmap_anonymous=yes])
+ if test $gl_have_mmap_anonymous != yes; then
+ AC_EGREP_CPP([I cant identify this map.], [
+#include <sys/mman.h>
+#ifdef MAP_ANON
+ I cant identify this map.
+#endif
+],
+ [AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON],
+ [Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.])
+ gl_have_mmap_anonymous=yes])
+ fi
+ AC_MSG_RESULT([$gl_have_mmap_anonymous])
+ if test $gl_have_mmap_anonymous = yes; then
+ AC_DEFINE([HAVE_MAP_ANONYMOUS], [1],
+ [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
+ config.h and <sys/mman.h>.])
+ fi
+ fi
+])
diff --git a/gnulib/m4/mode_t.m4 b/gnulib/m4/mode_t.m4
new file mode 100644
index 00000000..3178dfd3
--- /dev/null
+++ b/gnulib/m4/mode_t.m4
@@ -0,0 +1,26 @@
+# mode_t.m4 serial 2
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# For using mode_t, it's sufficient to use AC_TYPE_MODE_T and
+# include <sys/types.h>.
+
+# Define PROMOTED_MODE_T to the type that is the result of "default argument
+# promotion" (ISO C 6.5.2.2.(6)) of the type mode_t.
+AC_DEFUN([gl_PROMOTED_TYPE_MODE_T],
+[
+ AC_REQUIRE([AC_TYPE_MODE_T])
+ AC_CACHE_CHECK([for promoted mode_t type], [gl_cv_promoted_mode_t], [
+ dnl Assume mode_t promotes to 'int' if and only if it is smaller than 'int',
+ dnl and to itself otherwise. This assumption is not guaranteed by the ISO C
+ dnl standard, but we don't know of any real-world counterexamples.
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>]],
+ [[typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];]])],
+ [gl_cv_promoted_mode_t='int'],
+ [gl_cv_promoted_mode_t='mode_t'])
+ ])
+ AC_DEFINE_UNQUOTED([PROMOTED_MODE_T], [$gl_cv_promoted_mode_t],
+ [Define to the type that is the result of default argument promotions of type mode_t.])
+])
diff --git a/gnulib/m4/modechange.m4 b/gnulib/m4/modechange.m4
new file mode 100644
index 00000000..475649aa
--- /dev/null
+++ b/gnulib/m4/modechange.m4
@@ -0,0 +1,11 @@
+# modechange.m4 serial 6
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MODECHANGE],
+[
+ AC_LIBOBJ([modechange])
+])
diff --git a/gnulib/m4/mountlist.m4 b/gnulib/m4/mountlist.m4
new file mode 100644
index 00000000..f2d59501
--- /dev/null
+++ b/gnulib/m4/mountlist.m4
@@ -0,0 +1,23 @@
+# serial 10
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MOUNTLIST],
+[
+ gl_LIST_MOUNTED_FILE_SYSTEMS([gl_cv_list_mounted_fs=yes],
+ [gl_cv_list_mounted_fs=no])
+ if test $gl_cv_list_mounted_fs = yes; then
+ AC_LIBOBJ([mountlist])
+ gl_PREREQ_MOUNTLIST_EXTRA
+ fi
+])
+
+# Prerequisites of lib/mountlist.c not done by gl_LIST_MOUNTED_FILE_SYSTEMS.
+AC_DEFUN([gl_PREREQ_MOUNTLIST_EXTRA],
+[
+ dnl Note gl_LIST_MOUNTED_FILE_SYSTEMS checks for mntent.h, not sys/mntent.h.
+ AC_CHECK_HEADERS([sys/mntent.h])
+ gl_FSTYPENAME
+])
diff --git a/gnulib/m4/mpsort.m4 b/gnulib/m4/mpsort.m4
new file mode 100644
index 00000000..6dc48048
--- /dev/null
+++ b/gnulib/m4/mpsort.m4
@@ -0,0 +1,13 @@
+# Sort a vector of pointers to data.
+
+# Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+
+# This file 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.
+
+AC_DEFUN([gl_MPSORT],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_LIBOBJ([mpsort])
+])
diff --git a/gnulib/m4/multiarch.m4 b/gnulib/m4/multiarch.m4
new file mode 100644
index 00000000..389bd2bb
--- /dev/null
+++ b/gnulib/m4/multiarch.m4
@@ -0,0 +1,65 @@
+# multiarch.m4 serial 5
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Determine whether the compiler is or may be producing universal binaries.
+#
+# On MacOS X 10.5 and later systems, the user can create libraries and
+# executables that work on multiple system types--known as "fat" or
+# "universal" binaries--by specifying multiple '-arch' options to the
+# compiler but only a single '-arch' option to the preprocessor. Like
+# this:
+#
+# ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+# CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+# CPP="gcc -E" CXXCPP="g++ -E"
+#
+# Detect this situation and set the macro AA_APPLE_UNIVERSAL_BUILD at the
+# beginning of config.h and set APPLE_UNIVERSAL_BUILD accordingly.
+
+AC_DEFUN_ONCE([gl_MULTIARCH],
+[
+ dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN.
+ gl_cv_c_multiarch=no
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+ ]])],
+ [
+ dnl Check for potential -arch flags. It is not universal unless
+ dnl there are at least two -arch flags with different values.
+ arch=
+ prev=
+ for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+ if test -n "$prev"; then
+ case $word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$arch" || test "$arch" = "$word"; then
+ arch="$word"
+ else
+ gl_cv_c_multiarch=yes
+ fi
+ ;;
+ esac
+ prev=
+ else
+ if test "x$word" = "x-arch"; then
+ prev=arch
+ fi
+ fi
+ done
+ ])
+ if test $gl_cv_c_multiarch = yes; then
+ AC_DEFINE([AA_APPLE_UNIVERSAL_BUILD], [1],
+ [Define if the compiler is building for multiple architectures of Apple platforms at once.])
+ APPLE_UNIVERSAL_BUILD=1
+ else
+ APPLE_UNIVERSAL_BUILD=0
+ fi
+ AC_SUBST([APPLE_UNIVERSAL_BUILD])
+])
diff --git a/gnulib/m4/nanosleep.m4 b/gnulib/m4/nanosleep.m4
new file mode 100644
index 00000000..a633321a
--- /dev/null
+++ b/gnulib/m4/nanosleep.m4
@@ -0,0 +1,126 @@
+# serial 30
+
+dnl From Jim Meyering.
+dnl Check for the nanosleep function.
+dnl If not found, use the supplied replacement.
+dnl
+
+# Copyright (C) 1999-2001, 2003-2010 Free Software Foundation, Inc.
+
+# This file 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.
+
+AC_DEFUN([gl_FUNC_NANOSLEEP],
+[
+ dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ AC_REQUIRE([gl_FUNC_SELECT])
+
+ nanosleep_save_libs=$LIBS
+
+ # Solaris 2.5.1 needs -lposix4 to get the nanosleep function.
+ # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
+ LIB_NANOSLEEP=
+ AC_SUBST([LIB_NANOSLEEP])
+ AC_SEARCH_LIBS([nanosleep], [rt posix4],
+ [test "$ac_cv_search_nanosleep" = "none required" ||
+ LIB_NANOSLEEP=$ac_cv_search_nanosleep])
+
+ AC_REQUIRE([gl_MULTIARCH])
+ if test $APPLE_UNIVERSAL_BUILD = 1; then
+ # A universal build on Apple MacOS X platforms.
+ # The test result would be 'no (mishandles large arguments)' in 64-bit mode
+ # but 'yes' in 32-bit mode. But we need a configuration result that is
+ # valid in both modes.
+ gl_cv_func_nanosleep='no (mishandles large arguments)'
+ fi
+
+ AC_CACHE_CHECK([for working nanosleep],
+ [gl_cv_func_nanosleep],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+ #include <errno.h>
+ #include <limits.h>
+ #include <signal.h>
+ #if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #include <unistd.h>
+ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+ #define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+
+ static void
+ check_for_SIGALRM (int sig)
+ {
+ if (sig != SIGALRM)
+ _exit (1);
+ }
+
+ int
+ main ()
+ {
+ static struct timespec ts_sleep;
+ static struct timespec ts_remaining;
+ static struct sigaction act;
+ if (! nanosleep)
+ return 1;
+ act.sa_handler = check_for_SIGALRM;
+ sigemptyset (&act.sa_mask);
+ sigaction (SIGALRM, &act, NULL);
+ ts_sleep.tv_sec = 0;
+ ts_sleep.tv_nsec = 1;
+ alarm (1);
+ if (nanosleep (&ts_sleep, NULL) != 0)
+ return 1;
+ ts_sleep.tv_sec = TYPE_MAXIMUM (time_t);
+ ts_sleep.tv_nsec = 999999999;
+ alarm (1);
+ if (nanosleep (&ts_sleep, &ts_remaining) == -1 && errno == EINTR
+ && TYPE_MAXIMUM (time_t) - 10 < ts_remaining.tv_sec)
+ return 0;
+ return 119;
+ }]])],
+ [gl_cv_func_nanosleep=yes],
+ [case $? in dnl (
+ 119) gl_cv_func_nanosleep='no (mishandles large arguments)';; dnl (
+ *) gl_cv_func_nanosleep=no;;
+ esac],
+ [gl_cv_func_nanosleep=cross-compiling])
+ ])
+ if test "$gl_cv_func_nanosleep" = yes; then
+ REPLACE_NANOSLEEP=0
+ else
+ REPLACE_NANOSLEEP=1
+ if test "$gl_cv_func_nanosleep" = 'no (mishandles large arguments)'; then
+ AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
+ [Define to 1 if nanosleep mishandles large arguments.])
+ else
+ for ac_lib in $LIBSOCKET; do
+ case " $LIB_NANOSLEEP " in
+ *" $ac_lib "*) ;;
+ *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
+ esac
+ done
+ fi
+ AC_LIBOBJ([nanosleep])
+ gl_PREREQ_NANOSLEEP
+ fi
+
+ LIBS=$nanosleep_save_libs
+])
+
+# Prerequisites of lib/nanosleep.c.
+AC_DEFUN([gl_PREREQ_NANOSLEEP],
+[
+ AC_CHECK_HEADERS_ONCE([sys/select.h])
+ gl_PREREQ_SIG_HANDLER_H
+])
diff --git a/gnulib/m4/netdb_h.m4 b/gnulib/m4/netdb_h.m4
new file mode 100644
index 00000000..84afce6e
--- /dev/null
+++ b/gnulib/m4/netdb_h.m4
@@ -0,0 +1,46 @@
+# netdb_h.m4 serial 6
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HEADER_NETDB],
+[
+ AC_REQUIRE([gl_NETDB_H_DEFAULTS])
+ AC_CHECK_HEADERS_ONCE([netdb.h])
+ gl_CHECK_NEXT_HEADERS([netdb.h])
+ if test $ac_cv_header_netdb_h = yes; then
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <netdb.h>
+ struct addrinfo a;
+ int b = EAI_OVERFLOW;
+ int c = AI_NUMERICSERV;
+ ]])],
+ [NETDB_H=''], [NETDB_H='netdb.h'])
+ HAVE_NETDB_H=1
+ else
+ NETDB_H='netdb.h'
+ HAVE_NETDB_H=0
+ fi
+ AC_SUBST([HAVE_NETDB_H])
+ AC_SUBST([NETDB_H])
+])
+
+AC_DEFUN([gl_NETDB_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_NETDB_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_NETDB_H_DEFAULTS],
+[
+ GNULIB_GETADDRINFO=0; AC_SUBST([GNULIB_GETADDRINFO])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_STRUCT_ADDRINFO=1; AC_SUBST([HAVE_STRUCT_ADDRINFO])
+ HAVE_DECL_FREEADDRINFO=1; AC_SUBST([HAVE_DECL_FREEADDRINFO])
+ HAVE_DECL_GAI_STRERROR=1; AC_SUBST([HAVE_DECL_GAI_STRERROR])
+ HAVE_DECL_GETADDRINFO=1; AC_SUBST([HAVE_DECL_GETADDRINFO])
+ HAVE_DECL_GETNAMEINFO=1; AC_SUBST([HAVE_DECL_GETNAMEINFO])
+])
diff --git a/gnulib/m4/netinet_in_h.m4 b/gnulib/m4/netinet_in_h.m4
new file mode 100644
index 00000000..cc7a44cc
--- /dev/null
+++ b/gnulib/m4/netinet_in_h.m4
@@ -0,0 +1,30 @@
+# netinet_in_h.m4 serial 4
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HEADER_NETINET_IN],
+[
+ AC_CACHE_CHECK([whether <netinet/in.h> is self-contained],
+ [gl_cv_header_netinet_in_h_selfcontained],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <netinet/in.h>]], [[]])],
+ [gl_cv_header_netinet_in_h_selfcontained=yes],
+ [gl_cv_header_netinet_in_h_selfcontained=no])
+ ])
+ if test $gl_cv_header_netinet_in_h_selfcontained = yes; then
+ NETINET_IN_H=''
+ else
+ NETINET_IN_H='netinet/in.h'
+ AC_CHECK_HEADERS([netinet/in.h])
+ gl_CHECK_NEXT_HEADERS([netinet/in.h])
+ if test $ac_cv_header_netinet_in_h = yes; then
+ HAVE_NETINET_IN_H=1
+ else
+ HAVE_NETINET_IN_H=0
+ fi
+ AC_SUBST([HAVE_NETINET_IN_H])
+ fi
+ AC_SUBST([NETINET_IN_H])
+])
diff --git a/gnulib/m4/nl_langinfo.m4 b/gnulib/m4/nl_langinfo.m4
new file mode 100644
index 00000000..ad456a26
--- /dev/null
+++ b/gnulib/m4/nl_langinfo.m4
@@ -0,0 +1,25 @@
+# nl_langinfo.m4 serial 3
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_NL_LANGINFO],
+[
+ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS])
+ AC_REQUIRE([gl_LANGINFO_H])
+ AC_CHECK_FUNCS_ONCE([nl_langinfo])
+ if test $ac_cv_func_nl_langinfo = yes; then
+ if test $HAVE_LANGINFO_CODESET = 1 && test $HAVE_LANGINFO_ERA = 1; then
+ :
+ else
+ REPLACE_NL_LANGINFO=1
+ AC_DEFINE([REPLACE_NL_LANGINFO], [1],
+ [Define if nl_langinfo exists but is overridden by gnulib.])
+ AC_LIBOBJ([nl_langinfo])
+ fi
+ else
+ HAVE_NL_LANGINFO=0
+ AC_LIBOBJ([nl_langinfo])
+ fi
+])
diff --git a/gnulib/m4/nls.m4 b/gnulib/m4/nls.m4
new file mode 100644
index 00000000..003704c4
--- /dev/null
+++ b/gnulib/m4/nls.m4
@@ -0,0 +1,32 @@
+# nls.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_NLS],
+[
+ AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ AC_ARG_ENABLE([nls],
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)
+ AC_MSG_RESULT([$USE_NLS])
+ AC_SUBST([USE_NLS])
+])
diff --git a/gnulib/m4/no-c++.m4 b/gnulib/m4/no-c++.m4
new file mode 100644
index 00000000..40e2930e
--- /dev/null
+++ b/gnulib/m4/no-c++.m4
@@ -0,0 +1,22 @@
+# no-c++.m4 serial 1
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Support for C source files that cannot be compiled by a C++ compiler.
+# Set NO_CXX to the C++ compiler flags needed to request C mode instead of
+# C++ mode.
+# So far only g++ is supported.
+
+AC_DEFUN([gt_NO_CXX],
+[
+ NO_CXX=
+ AC_EGREP_CPP([Is g++], [
+#if defined __GNUC__ && defined __cplusplus
+ Is g++
+#endif
+ ],
+ [NO_CXX="-x c"])
+ AC_SUBST([NO_CXX])
+])
diff --git a/gnulib/m4/nocrash.m4 b/gnulib/m4/nocrash.m4
new file mode 100644
index 00000000..efbcfa6a
--- /dev/null
+++ b/gnulib/m4/nocrash.m4
@@ -0,0 +1,102 @@
+# nocrash.m4 serial 2
+dnl Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Based on libsigsegv, from Bruno Haible and Paolo Bonzini.
+
+AC_PREREQ([2.13])
+
+dnl Expands to some code for use in .c programs that will cause the configure
+dnl test to exit instead of crashing. This is useful to avoid triggering
+dnl action from a background debugger and to avoid core dumps.
+dnl Usage: ...
+dnl ]GL_NOCRASH[
+dnl ...
+dnl int main() { nocrash_init(); ... }
+AC_DEFUN([GL_NOCRASH],[[
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on MacOS X. */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens. */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+ EXC_BAD_ACCESS. */
+static void *
+mach_exception_thread (void *arg)
+{
+ /* Buffer for a message to be received. */
+ struct {
+ mach_msg_header_t head;
+ mach_msg_body_t msgh_body;
+ char data[1024];
+ } msg;
+ mach_msg_return_t retval;
+ /* Wait for a message on the exception port. */
+ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+ our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (retval != MACH_MSG_SUCCESS)
+ abort ();
+ exit (1);
+}
+static void
+nocrash_init (void)
+{
+ mach_port_t self = mach_task_self ();
+ /* Allocate a port on which the thread shall listen for exceptions. */
+ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+ == KERN_SUCCESS) {
+ /* See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
+ if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+ MACH_MSG_TYPE_MAKE_SEND)
+ == KERN_SUCCESS) {
+ /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting
+ for us. */
+ exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+ /* Create the thread listening on the exception port. */
+ pthread_attr_t attr;
+ pthread_t thread;
+ if (pthread_attr_init (&attr) == 0
+ && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+ && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+ pthread_attr_destroy (&attr);
+ /* Replace the exception port info for these exceptions with our own.
+ Note that we replace the exception port for the entire task, not only
+ for a particular thread. This has the effect that when our exception
+ port gets the message, the thread specific exception port has already
+ been asked, and we don't need to bother about it.
+ See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */
+ task_set_exception_ports (self, mask, our_exception_port,
+ EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+ }
+ }
+ }
+}
+#else
+/* Avoid a crash on POSIX systems. */
+#include <signal.h>
+/* A POSIX signal handler. */
+static void
+exception_handler (int sig)
+{
+ exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+ signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+ signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+]])
diff --git a/gnulib/m4/nproc.m4 b/gnulib/m4/nproc.m4
new file mode 100644
index 00000000..06bec972
--- /dev/null
+++ b/gnulib/m4/nproc.m4
@@ -0,0 +1,53 @@
+# nproc.m4 serial 4
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_NPROC],
+[
+ gl_PREREQ_NPROC
+])
+
+# Prerequisites of lib/nproc.c.
+AC_DEFUN([gl_PREREQ_NPROC],
+[
+ dnl Persuade glibc <sched.h> to declare CPU_SETSIZE, CPU_ISSET etc.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_HEADERS([sys/pstat.h sys/sysmp.h sys/param.h],,,
+ [AC_INCLUDES_DEFAULT])
+ dnl <sys/sysctl.h> requires <sys/param.h> on OpenBSD 4.0.
+ AC_CHECK_HEADERS([sys/sysctl.h],,,
+ [AC_INCLUDES_DEFAULT
+ #if HAVE_SYS_PARAM_H
+ # include <sys/param.h>
+ #endif
+ ])
+
+ AC_CHECK_FUNCS([sched_getaffinity sched_getaffinity_np \
+ pstat_getdynamic sysmp sysctl])
+
+ dnl Test whether sched_getaffinity has the expected declaration.
+ dnl glibc 2.3.[0-2]:
+ dnl int sched_getaffinity (pid_t, unsigned int, unsigned long int *);
+ dnl glibc 2.3.3:
+ dnl int sched_getaffinity (pid_t, cpu_set_t *);
+ dnl glibc >= 2.3.4:
+ dnl int sched_getaffinity (pid_t, size_t, cpu_set_t *);
+ if test $ac_cv_func_sched_getaffinity = yes; then
+ AC_CACHE_CHECK([for glibc compatible sched_getaffinity],
+ [gl_cv_func_sched_getaffinity3],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sched.h>]],
+ [[sched_getaffinity (0, 0, (cpu_set_t *) 0);]])],
+ [gl_cv_func_sched_getaffinity3=yes],
+ [gl_cv_func_sched_getaffinity3=no])
+ ])
+ if test $gl_cv_func_sched_getaffinity3 = yes; then
+ AC_DEFINE([HAVE_SCHED_GETAFFINITY_LIKE_GLIBC], [1],
+ [Define to 1 if sched_getaffinity has a glibc compatible declaration.])
+ fi
+ fi
+])
diff --git a/gnulib/m4/obstack-printf-posix.m4 b/gnulib/m4/obstack-printf-posix.m4
new file mode 100644
index 00000000..606aca13
--- /dev/null
+++ b/gnulib/m4/obstack-printf-posix.m4
@@ -0,0 +1,105 @@
+# obstack-printf-posix.m4 serial 4
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_OBSTACK_PRINTF_POSIX],
+[
+ dnl Persuade glibc <stdio.h> to declare obstack_printf(), obstack_vprintf().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_obstack_printf_posix=no
+ AC_CHECK_FUNCS_ONCE([obstack_printf])
+ if test $ac_cv_func_obstack_printf = yes ; then
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # obstack_printf exists and is
+ # already POSIX compliant.
+ gl_cv_func_obstack_printf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_obstack_printf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_OBSTACK_PRINTF
+ fi
+ gl_DECL_OBSTACK_PRINTF
+])
diff --git a/gnulib/m4/obstack-printf.m4 b/gnulib/m4/obstack-printf.m4
new file mode 100644
index 00000000..b74a46bf
--- /dev/null
+++ b/gnulib/m4/obstack-printf.m4
@@ -0,0 +1,42 @@
+# obstack-printf.m4 serial 3
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Eric Blake.
+dnl Test whether obstack_printf() exists. For now, we assume that
+dnl obstack_vprintf behaves identically, so we only test for one.
+
+AC_DEFUN([gl_FUNC_OBSTACK_PRINTF],
+[
+ dnl Persuade glibc <stdio.h> to declare obstack_printf(), obstack_vprintf().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([obstack_printf])
+ if test $ac_cv_func_obstack_printf = no ; then
+ gl_REPLACE_OBSTACK_PRINTF
+ fi
+
+ gl_DECL_OBSTACK_PRINTF
+])
+
+AC_DEFUN([gl_REPLACE_OBSTACK_PRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([obstack_printf])
+ if test $ac_cv_func_obstack_printf = yes; then
+ REPLACE_OBSTACK_PRINTF=1
+ fi
+])
+
+dnl Ensure obstack_printf() and obstack_vprintf() are declared
+dnl (whether or not they are being replaced).
+AC_DEFUN([gl_DECL_OBSTACK_PRINTF],
+[
+ AC_CHECK_DECLS_ONCE([obstack_printf])
+ if test $ac_cv_have_decl_obstack_printf = no; then
+ HAVE_DECL_OBSTACK_PRINTF=0
+ fi
+])
diff --git a/gnulib/m4/onceonly.m4 b/gnulib/m4/onceonly.m4
new file mode 100644
index 00000000..4a3cd84d
--- /dev/null
+++ b/gnulib/m4/onceonly.m4
@@ -0,0 +1,91 @@
+# onceonly.m4 serial 6
+dnl Copyright (C) 2002-2003, 2005-2006, 2008-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl This file defines some "once only" variants of standard autoconf macros.
+dnl AC_CHECK_HEADERS_ONCE like AC_CHECK_HEADERS
+dnl AC_CHECK_FUNCS_ONCE like AC_CHECK_FUNCS
+dnl AC_CHECK_DECLS_ONCE like AC_CHECK_DECLS
+dnl AC_REQUIRE([AC_FUNC_STRCOLL]) like AC_FUNC_STRCOLL
+dnl The advantage is that the check for each of the headers/functions/decls
+dnl will be put only once into the 'configure' file. It keeps the size of
+dnl the 'configure' file down, and avoids redundant output when 'configure'
+dnl is run.
+dnl The drawback is that the checks cannot be conditionalized. If you write
+dnl if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi
+dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to
+dnl empty, and the check will be inserted before the body of the AC_DEFUNed
+dnl function.
+
+dnl The original code implemented AC_CHECK_HEADERS_ONCE and AC_CHECK_FUNCS_ONCE
+dnl in terms of AC_DEFUN and AC_REQUIRE. This implementation uses diversions to
+dnl named sections DEFAULTS and INIT_PREPARE in order to check all requested
+dnl headers at once, thus reducing the size of 'configure'. It is known to work
+dnl with autoconf 2.57..2.62 at least . The size reduction is ca. 9%.
+
+dnl Autoconf version 2.59 plus gnulib is required; this file is not needed
+dnl with Autoconf 2.60 or greater. But note that autoconf's implementation of
+dnl AC_CHECK_DECLS_ONCE expects a comma-separated list of symbols as first
+dnl argument!
+AC_PREREQ([2.59])
+
+# AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of
+# AC_CHECK_HEADERS(HEADER1 HEADER2 ...).
+AC_DEFUN([AC_CHECK_HEADERS_ONCE], [
+ :
+ m4_foreach_w([gl_HEADER_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME,
+ [./-], [___])), [
+ m4_divert_text([INIT_PREPARE],
+ [gl_header_list="$gl_header_list gl_HEADER_NAME"])
+ gl_HEADERS_EXPANSION
+ AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_HEADER_NAME])),
+ [Define to 1 if you have the <]m4_defn([gl_HEADER_NAME])[> header file.])
+ ])
+ AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME,
+ [./-], [___])))
+ ])
+])
+m4_define([gl_HEADERS_EXPANSION], [
+ m4_divert_text([DEFAULTS], [gl_header_list=])
+ AC_CHECK_HEADERS([$gl_header_list])
+ m4_define([gl_HEADERS_EXPANSION], [])
+])
+
+# AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of
+# AC_CHECK_FUNCS(FUNC1 FUNC2 ...).
+AC_DEFUN([AC_CHECK_FUNCS_ONCE], [
+ :
+ m4_foreach_w([gl_FUNC_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]), [
+ m4_divert_text([INIT_PREPARE],
+ [gl_func_list="$gl_func_list gl_FUNC_NAME"])
+ gl_FUNCS_EXPANSION
+ AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_FUNC_NAME])),
+ [Define to 1 if you have the `]m4_defn([gl_FUNC_NAME])[' function.])
+ ])
+ AC_REQUIRE([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]))
+ ])
+])
+m4_define([gl_FUNCS_EXPANSION], [
+ m4_divert_text([DEFAULTS], [gl_func_list=])
+ AC_CHECK_FUNCS([$gl_func_list])
+ m4_define([gl_FUNCS_EXPANSION], [])
+])
+
+# AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of
+# AC_CHECK_DECLS(DECL1, DECL2, ...).
+AC_DEFUN([AC_CHECK_DECLS_ONCE], [
+ :
+ m4_foreach_w([gl_DECL_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]), [
+ AC_CHECK_DECLS(m4_defn([gl_DECL_NAME]))
+ ])
+ AC_REQUIRE([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]))
+ ])
+])
diff --git a/gnulib/m4/open.m4 b/gnulib/m4/open.m4
new file mode 100644
index 00000000..d705b3a1
--- /dev/null
+++ b/gnulib/m4/open.m4
@@ -0,0 +1,74 @@
+# open.m4 serial 8
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_OPEN],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw* | pw*)
+ gl_REPLACE_OPEN
+ ;;
+ *)
+ dnl open("foo/") should not create a file when the file name has a
+ dnl trailing slash. FreeBSD only has the problem on symlinks.
+ AC_CHECK_FUNCS_ONCE([lstat])
+ AC_CACHE_CHECK([whether open recognizes a trailing slash],
+ [gl_cv_func_open_slash],
+ [# Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ touch conftest.tmp
+ ln -s conftest.tmp conftest.lnk
+ fi
+ AC_TRY_RUN([
+#include <fcntl.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+int main ()
+{
+#if HAVE_LSTAT
+ if (open ("conftest.lnk/", O_RDONLY) != -1) return 2;
+#endif
+ return open ("conftest.sl/", O_CREAT, 0600) >= 0;
+}], [gl_cv_func_open_slash=yes], [gl_cv_func_open_slash=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ freebsd*) gl_cv_func_open_slash="guessing no" ;;
+ solaris2.[0-9]*) gl_cv_func_open_slash="guessing no" ;;
+ hpux*) gl_cv_func_open_slash="guessing no" ;;
+ *) gl_cv_func_open_slash="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ rm -f conftest.sl conftest.tmp conftest.lnk
+ ])
+ case "$gl_cv_func_open_slash" in
+ *no)
+ AC_DEFINE([OPEN_TRAILING_SLASH_BUG], [1],
+ [Define to 1 if open() fails to recognize a trailing slash.])
+ gl_REPLACE_OPEN
+ ;;
+ esac
+ ;;
+ esac
+])
+
+AC_DEFUN([gl_REPLACE_OPEN],
+[
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ REPLACE_OPEN=1
+ AC_LIBOBJ([open])
+ gl_PREREQ_OPEN
+])
+
+# Prerequisites of lib/open.c.
+AC_DEFUN([gl_PREREQ_OPEN],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
+ :
+])
diff --git a/gnulib/m4/openat.m4 b/gnulib/m4/openat.m4
new file mode 100644
index 00000000..7975efb4
--- /dev/null
+++ b/gnulib/m4/openat.m4
@@ -0,0 +1,124 @@
+# serial 27
+# See if we need to use our replacement for Solaris' openat et al functions.
+
+dnl Copyright (C) 2004-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Jim Meyering.
+
+AC_DEFUN([gl_FUNC_OPENAT],
+[
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ GNULIB_OPENAT=1
+
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ GNULIB_FCHMODAT=1
+ GNULIB_FSTATAT=1
+ GNULIB_MKDIRAT=1
+
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ GNULIB_FCHOWNAT=1
+ GNULIB_UNLINKAT=1
+
+ AC_LIBOBJ([openat-proc])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([lchmod])
+ AC_REPLACE_FUNCS([fchmodat fstatat mkdirat openat unlinkat])
+ AC_REQUIRE([AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+ AC_REQUIRE([gl_FUNC_UNLINK])
+ case $ac_cv_func_openat+$ac_cv_func_lstat_dereferences_slashed_symlink in
+ yes+yes)
+ # GNU/Hurd has unlinkat, but it has the same bug as unlink.
+ if test $REPLACE_UNLINK = 1; then
+ AC_LIBOBJ([unlinkat])
+ REPLACE_UNLINKAT=1
+ fi ;;
+ yes+*)
+ # Solaris 9 has *at functions, but uniformly mishandles trailing
+ # slash in all of them.
+ AC_LIBOBJ([openat])
+ REPLACE_OPENAT=1
+ AC_LIBOBJ([fstatat])
+ REPLACE_FSTATAT=1
+ AC_LIBOBJ([unlinkat])
+ REPLACE_UNLINKAT=1
+ ;;
+ *)
+ HAVE_OPENAT=0
+ HAVE_UNLINKAT=0 # No known system with unlinkat but not openat
+ HAVE_FSTATAT=0 # No known system with fstatat but not openat
+ gl_PREREQ_OPENAT;;
+ esac
+ if test $ac_cv_func_fchmodat != yes; then
+ HAVE_FCHMODAT=0
+ fi
+ if test $ac_cv_func_mkdirat != yes; then
+ HAVE_MKDIRAT=0
+ fi
+ gl_FUNC_FCHOWNAT
+])
+
+# gl_FUNC_FCHOWNAT_DEREF_BUG([ACTION-IF-BUGGY[, ACTION-IF-NOT_BUGGY]])
+AC_DEFUN([gl_FUNC_FCHOWNAT_DEREF_BUG],
+[
+ AC_CACHE_CHECK([whether fchownat works with AT_SYMLINK_NOFOLLOW],
+ gl_cv_func_fchownat_nofollow_works,
+ [
+ gl_dangle=conftest.dangle
+ # Remove any remnants of a previous test.
+ rm -f $gl_dangle
+ # Arrange for deletion of the temporary file this test creates.
+ ac_clean_files="$ac_clean_files $gl_dangle"
+ ln -s conftest.no-such $gl_dangle
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+int
+main ()
+{
+ return (fchownat (AT_FDCWD, "$gl_dangle", -1, getgid (),
+ AT_SYMLINK_NOFOLLOW) != 0
+ && errno == ENOENT);
+}
+ ]])],
+ [gl_cv_func_fchownat_nofollow_works=yes],
+ [gl_cv_func_fchownat_nofollow_works=no],
+ [gl_cv_func_fchownat_nofollow_works=no],
+ )
+ ])
+ AS_IF([test $gl_cv_func_fchownat_nofollow_works = no], [$1], [$2])
+])
+
+# If we have the fchownat function, and it has the bug (in glibc-2.4)
+# that it dereferences symlinks even with AT_SYMLINK_NOFOLLOW, then
+# use the replacement function.
+# Also use the replacement function if fchownat is simply not available.
+AC_DEFUN([gl_FUNC_FCHOWNAT],
+[
+ AC_REQUIRE([gl_FUNC_CHOWN])
+ AC_CHECK_FUNC([fchownat],
+ [gl_FUNC_FCHOWNAT_DEREF_BUG([REPLACE_FCHOWNAT=1
+ AC_DEFINE([FCHOWNAT_NOFOLLOW_BUG], [1], [Define to 1 if your
+ platform has fchownat, but it cannot perform lchown tasks.])])],
+ [HAVE_FCHOWNAT=0])
+ if test $REPLACE_CHOWN = 1; then
+ REPLACE_FCHOWNAT=1
+ fi
+ if test $HAVE_FCHOWNAT = 0 || test $REPLACE_FCHOWNAT = 1; then
+ AC_LIBOBJ([fchownat])
+ fi
+])
+
+AC_DEFUN([gl_PREREQ_OPENAT],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
+ :
+])
diff --git a/gnulib/m4/openmp.m4 b/gnulib/m4/openmp.m4
new file mode 100644
index 00000000..78f2b759
--- /dev/null
+++ b/gnulib/m4/openmp.m4
@@ -0,0 +1,98 @@
+# openmp.m4 serial 7
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This file can be removed once we assume autoconf >= 2.62.
+
+dnl Expand to nothing in autoconf >= 2.62. m4_copy has a different
+dnl semantic in autoconf > 2.63.
+m4_ifdef([AC_OPENMP], [], [
+
+# _AC_LANG_OPENMP
+# ---------------
+# Expands to some language dependent source code for testing the presence of
+# OpenMP.
+AC_DEFUN([_AC_LANG_OPENMP],
+[_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])
+
+# _AC_LANG_OPENMP(C)
+# ------------------
+m4_define([_AC_LANG_OPENMP(C)],
+[
+#ifndef _OPENMP
+ choke me
+#endif
+#include <omp.h>
+int main () { return omp_get_num_threads (); }
+])
+
+# _AC_LANG_OPENMP(C++)
+# --------------------
+m4_copy([_AC_LANG_OPENMP(C)], [_AC_LANG_OPENMP(C++)])
+
+# _AC_LANG_OPENMP(Fortran 77)
+# ---------------------------
+m4_define([_AC_LANG_OPENMP(Fortran 77)],
+[AC_LANG_FUNC_LINK_TRY([omp_get_num_threads])])
+
+# _AC_LANG_OPENMP(Fortran)
+# ---------------------------
+m4_copy([_AC_LANG_OPENMP(Fortran 77)], [_AC_LANG_OPENMP(Fortran)])
+
+# AC_OPENMP
+# ---------
+# Check which options need to be passed to the C compiler to support OpenMP.
+# Set the OPENMP_CFLAGS / OPENMP_CXXFLAGS / OPENMP_FFLAGS variable to these
+# options.
+# The options are necessary at compile time (so the #pragmas are understood)
+# and at link time (so the appropriate library is linked with).
+# This macro takes care to not produce redundant options if $CC $CFLAGS already
+# supports OpenMP. It also is careful to not pass options to compilers that
+# misinterpret them; for example, most compilers accept "-openmp" and create
+# an output file called 'penmp' rather than activating OpenMP support.
+AC_DEFUN([AC_OPENMP],
+[
+ OPENMP_[]_AC_LANG_PREFIX[]FLAGS=
+ AC_ARG_ENABLE([openmp],
+ [AS_HELP_STRING([--disable-openmp], [do not use OpenMP])])
+ if test "$enable_openmp" != no; then
+ AC_CACHE_CHECK([for $CC option to support OpenMP],
+ [ac_cv_prog_[]_AC_LANG_ABBREV[]_openmp],
+ [AC_LINK_IFELSE([_AC_LANG_OPENMP],
+ [ac_cv_prog_[]_AC_LANG_ABBREV[]_openmp='none needed'],
+ [ac_cv_prog_[]_AC_LANG_ABBREV[]_openmp='unsupported'
+ dnl Try these flags:
+ dnl GCC >= 4.2 -fopenmp
+ dnl SunPRO C -xopenmp
+ dnl Intel C -openmp
+ dnl SGI C, PGI C -mp
+ dnl Tru64 Compaq C -omp
+ dnl IBM C (AIX, Linux) -qsmp=omp
+ dnl If in this loop a compiler is passed an option that it doesn't
+ dnl understand or that it misinterprets, the AC_LINK_IFELSE test
+ dnl will fail (since we know that it failed without the option),
+ dnl therefore the loop will continue searching for an option, and
+ dnl no output file called 'penmp' or 'mp' is created.
+ for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do
+ ac_save_[]_AC_LANG_PREFIX[]FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
+ _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $ac_option"
+ AC_LINK_IFELSE([_AC_LANG_OPENMP],
+ [ac_cv_prog_[]_AC_LANG_ABBREV[]_openmp=$ac_option])
+ _AC_LANG_PREFIX[]FLAGS=$ac_save_[]_AC_LANG_PREFIX[]FLAGS
+ if test "$ac_cv_prog_[]_AC_LANG_ABBREV[]_openmp" != unsupported; then
+ break
+ fi
+ done])])
+ case $ac_cv_prog_[]_AC_LANG_ABBREV[]_openmp in #(
+ "none needed" | unsupported)
+ ;; #(
+ *)
+ OPENMP_[]_AC_LANG_PREFIX[]FLAGS=$ac_cv_prog_[]_AC_LANG_ABBREV[]_openmp ;;
+ esac
+ fi
+ AC_SUBST([OPENMP_]_AC_LANG_PREFIX[FLAGS])
+])
+
+])
diff --git a/gnulib/m4/pagealign_alloc.m4 b/gnulib/m4/pagealign_alloc.m4
new file mode 100644
index 00000000..19b97380
--- /dev/null
+++ b/gnulib/m4/pagealign_alloc.m4
@@ -0,0 +1,22 @@
+#serial 5
+dnl Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_PAGEALIGN_ALLOC],
+[
+ dnl Persuade glibc <sys/mman.h> to define MAP_ANONYMOUS.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_LIBOBJ([pagealign_alloc])
+ gl_PREREQ_PAGEALIGN_ALLOC
+])
+
+# Prerequisites of lib/pagealign_alloc.c.
+AC_DEFUN([gl_PREREQ_PAGEALIGN_ALLOC],
+[
+ AC_REQUIRE([gl_FUNC_MMAP_ANON])
+ AC_CHECK_FUNCS_ONCE([posix_memalign])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+])
diff --git a/gnulib/m4/pathmax.m4 b/gnulib/m4/pathmax.m4
new file mode 100644
index 00000000..6a3f857e
--- /dev/null
+++ b/gnulib/m4/pathmax.m4
@@ -0,0 +1,13 @@
+# pathmax.m4 serial 8
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_PATHMAX],
+[
+ dnl Prerequisites of lib/pathmax.h.
+ AC_CHECK_FUNCS_ONCE([pathconf])
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+])
diff --git a/gnulib/m4/perl.m4 b/gnulib/m4/perl.m4
new file mode 100644
index 00000000..9d7e55c4
--- /dev/null
+++ b/gnulib/m4/perl.m4
@@ -0,0 +1,46 @@
+# serial 9
+
+dnl From Jim Meyering.
+dnl Find a new-enough version of Perl.
+
+# Copyright (C) 1998-2001, 2003-2004, 2007, 2009-2010 Free Software Foundation,
+# Inc.
+#
+# This file 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.
+
+AC_DEFUN([gl_PERL],
+[
+ dnl FIXME: don't hard-code 5.005
+ AC_MSG_CHECKING([for perl5.005 or newer])
+ if test "${PERL+set}" = set; then
+ # `PERL' is set in the user's environment.
+ candidate_perl_names="$PERL"
+ perl_specified=yes
+ else
+ candidate_perl_names='perl perl5'
+ perl_specified=no
+ fi
+
+ found=no
+ AC_SUBST([PERL])
+ PERL="$am_missing_run perl"
+ for perl in $candidate_perl_names; do
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ if ( $perl -e 'require 5.005; use File::Compare' ) > /dev/null 2>&1; then
+ PERL=$perl
+ found=yes
+ break
+ fi
+ done
+
+ AC_MSG_RESULT([$found])
+ test $found = no && AC_MSG_WARN([
+WARNING: You don't seem to have perl5.005 or newer installed, or you lack
+ a usable version of the Perl File::Compare module. As a result,
+ you may be unable to run a few tests or to regenerate certain
+ files if you modify the sources from which they are derived.
+] )
+])
diff --git a/gnulib/m4/perror.m4 b/gnulib/m4/perror.m4
new file mode 100644
index 00000000..350cd420
--- /dev/null
+++ b/gnulib/m4/perror.m4
@@ -0,0 +1,17 @@
+# perror.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_PERROR],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_HEADER_ERRNO_H])
+ if test -n "$ERRNO_H"; then
+ dnl The system's perror() cannot know about the new errno values we add
+ dnl to <errno.h>. Replace it.
+ REPLACE_PERROR=1
+ AC_LIBOBJ([perror])
+ fi
+])
diff --git a/gnulib/m4/physmem.m4 b/gnulib/m4/physmem.m4
new file mode 100644
index 00000000..042a3357
--- /dev/null
+++ b/gnulib/m4/physmem.m4
@@ -0,0 +1,47 @@
+# physmem.m4 serial 10
+dnl Copyright (C) 2002-2003, 2005-2006, 2008-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Check for the external symbol, _system_configuration,
+# a struct with member `physmem'.
+AC_DEFUN([gl_SYS__SYSTEM_CONFIGURATION],
+ [AC_CACHE_CHECK([for external symbol _system_configuration],
+ gl_cv_var__system_configuration,
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM(
+ [[#include <sys/systemcfg.h>
+ ]],
+ [[double x = _system_configuration.physmem;
+ if (x > 0.0) return 0;]])],
+ [gl_cv_var__system_configuration=yes],
+ [gl_cv_var__system_configuration=no])])
+
+ if test $gl_cv_var__system_configuration = yes; then
+ AC_DEFINE([HAVE__SYSTEM_CONFIGURATION], [1],
+ [Define to 1 if you have the external variable,
+ _system_configuration with a member named physmem.])
+ fi
+ ]
+)
+
+AC_DEFUN([gl_PHYSMEM],
+[
+ AC_LIBOBJ([physmem])
+
+ # Prerequisites of lib/physmem.c.
+ AC_CHECK_HEADERS([sys/pstat.h sys/sysmp.h sys/sysinfo.h \
+ machine/hal_sysinfo.h sys/table.h sys/param.h sys/systemcfg.h],,,
+ [AC_INCLUDES_DEFAULT])
+ dnl <sys/sysctl.h> requires <sys/param.h> on OpenBSD 4.0.
+ AC_CHECK_HEADERS([sys/sysctl.h],,,
+ [AC_INCLUDES_DEFAULT
+ #if HAVE_SYS_PARAM_H
+ # include <sys/param.h>
+ #endif
+ ])
+
+ AC_CHECK_FUNCS([pstat_getstatic pstat_getdynamic sysmp getsysinfo sysctl table])
+ AC_REQUIRE([gl_SYS__SYSTEM_CONFIGURATION])
+])
diff --git a/gnulib/m4/pipe.m4 b/gnulib/m4/pipe.m4
new file mode 100644
index 00000000..401881c8
--- /dev/null
+++ b/gnulib/m4/pipe.m4
@@ -0,0 +1,12 @@
+# pipe.m4 serial 4
+dnl Copyright (C) 2004, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_PIPE],
+[
+ dnl Prerequisites of lib/pipe.c.
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_TYPE_MODE_T])
+])
diff --git a/gnulib/m4/pipe2.m4 b/gnulib/m4/pipe2.m4
new file mode 100644
index 00000000..c114af61
--- /dev/null
+++ b/gnulib/m4/pipe2.m4
@@ -0,0 +1,18 @@
+# pipe2.m4 serial 2
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_PIPE2],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade glibc <unistd.h> to declare pipe2().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([pipe2])
+ if test $ac_cv_func_pipe2 != yes; then
+ HAVE_PIPE2=0
+ fi
+])
diff --git a/gnulib/m4/po.m4 b/gnulib/m4/po.m4
new file mode 100644
index 00000000..960efe15
--- /dev/null
+++ b/gnulib/m4/po.m4
@@ -0,0 +1,449 @@
+# po.m4 serial 17 (gettext-0.18)
+dnl Copyright (C) 1995-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.50])
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+ AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ AC_REQUIRE([AM_NLS])dnl
+
+ dnl Release version of the gettext macros. This is used to ensure that
+ dnl the gettext macros and po/Makefile.in.in are in sync.
+ AC_SUBST([GETTEXT_MACRO_VERSION], [0.17])
+
+ dnl Perform the following tests also if --disable-nls has been given,
+ dnl because they are needed for "make dist" to work.
+
+ dnl Search for GNU msgfmt in the PATH.
+ dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+ dnl The second test excludes FreeBSD msgfmt.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
+
+ dnl Test whether it is GNU msgfmt >= 0.15.
+changequote(,)dnl
+ case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+ *) MSGFMT_015=$MSGFMT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([MSGFMT_015])
+changequote(,)dnl
+ case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+ *) GMSGFMT_015=$GMSGFMT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([GMSGFMT_015])
+
+ dnl Search for GNU xgettext 0.12 or newer in the PATH.
+ dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+ dnl The second test excludes FreeBSD xgettext.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+
+ dnl Test whether it is GNU xgettext >= 0.15.
+changequote(,)dnl
+ case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+ *) XGETTEXT_015=$XGETTEXT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([XGETTEXT_015])
+
+ dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+ [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
+
+ dnl Installation directories.
+ dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we
+ dnl have to define it here, so that it can be used in po/Makefile.
+ test -n "$localedir" || localedir='${datadir}/locale'
+ AC_SUBST([localedir])
+
+ dnl Support for AM_XGETTEXT_OPTION.
+ test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+ AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
+
+ AC_CONFIG_COMMANDS([po-directories], [[
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ # Treat a directory as a PO directory if and only if it has a
+ # POTFILES.in file. This allows packages to have multiple PO
+ # directories under different names or in different locations.
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ POMAKEFILEDEPS="POTFILES.in"
+ # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done]],
+ [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+ # from automake < 1.5.
+ eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+ ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+ # When this code is run, in config.status, two variables have already been
+ # set:
+ # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+ # - LINGUAS is the value of the environment variable LINGUAS at configure
+ # time.
+
+changequote(,)dnl
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ # Find a way to echo strings without interpreting backslash.
+ if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='echo'
+ else
+ if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='printf %s\n'
+ else
+ echo_func () {
+ cat <<EOT
+$*
+EOT
+ }
+ gt_echo='echo_func'
+ fi
+ fi
+
+ # A sed script that extracts the value of VARIABLE from a Makefile.
+ sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^[ ]*VARIABLE[ ]*=/{
+ # Seen the first line of the variable definition.
+ s/^[ ]*VARIABLE[ ]*=//
+ ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+ # Set POTFILES to the value of the Makefile variable POTFILES.
+ sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
+ POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+ # Compute POTFILES_DEPS as
+ # $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+ POTFILES_DEPS=
+ for file in $POTFILES; do
+ POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+ done
+ POMAKEFILEDEPS=""
+
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+ sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
+ ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+ fi
+ # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ # Compute PROPERTIESFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+ # Compute CLASSFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+ # Compute QMFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+ # Compute MSGFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+ # Compute RESOURCESDLLFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ PROPERTIESFILES=
+ CLASSFILES=
+ QMFILES=
+ MSGFILES=
+ RESOURCESDLLFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+ CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+ QMFILES="$QMFILES $srcdirpre$lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ JAVACATALOGS=
+ QTCATALOGS=
+ TCLCATALOGS=
+ CSHARPCATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+ QTCATALOGS="$QTCATALOGS $lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ fi
+
+ sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+ if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+ @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+ \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+ @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+ \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if test -n "$POMAKEFILEDEPS"; then
+ cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+ fi
+ mv "$ac_file.tmp" "$ac_file"
+])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+ XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+ AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
diff --git a/gnulib/m4/poll.m4 b/gnulib/m4/poll.m4
new file mode 100644
index 00000000..3a7c186d
--- /dev/null
+++ b/gnulib/m4/poll.m4
@@ -0,0 +1,72 @@
+# poll.m4 serial 9
+dnl Copyright (c) 2003, 2005, 2006, 2007, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_POLL],
+[
+ AC_CHECK_HEADERS([poll.h])
+ if test "$ac_cv_header_poll_h" = no; then
+ gl_cv_func_poll=no
+ else
+ AC_CHECK_FUNC([poll],
+ [# Check whether poll() works on special files (like /dev/null) and
+ # and ttys (like /dev/tty). On MacOS X 10.4.0 and AIX 5.3, it doesn't.
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <fcntl.h>
+#include <poll.h>
+ int main()
+ {
+ struct pollfd ufd;
+ /* Try /dev/null for reading. */
+ ufd.fd = open ("/dev/null", O_RDONLY);
+ if (ufd.fd < 0)
+ /* If /dev/null does not exist, it's not MacOS X nor AIX. */
+ return 0;
+ ufd.events = POLLIN;
+ ufd.revents = 0;
+ if (!(poll (&ufd, 1, 0) == 1 && ufd.revents == POLLIN))
+ return 1;
+ /* Try /dev/null for writing. */
+ ufd.fd = open ("/dev/null", O_WRONLY);
+ if (ufd.fd < 0)
+ /* If /dev/null does not exist, it's not MacOS X nor AIX. */
+ return 0;
+ ufd.events = POLLOUT;
+ ufd.revents = 0;
+ if (!(poll (&ufd, 1, 0) == 1 && ufd.revents == POLLOUT))
+ return 1;
+ /* Trying /dev/tty may be too environment dependent. */
+ return 0;
+ }]])],
+ [gl_cv_func_poll=yes],
+ [gl_cv_func_poll=no],
+ [# When cross-compiling, assume that poll() works everywhere except on
+ # MacOS X or AIX, regardless of its version.
+ AC_EGREP_CPP([MacOSX], [
+#if (defined(__APPLE__) && defined(__MACH__)) || defined(_AIX)
+This is MacOSX or AIX
+#endif
+], [gl_cv_func_poll=no], [gl_cv_func_poll=yes])])])
+ fi
+ if test $gl_cv_func_poll = yes; then
+ AC_DEFINE([HAVE_POLL], [1],
+ [Define to 1 if you have the 'poll' function and it works.])
+ POLL_H=
+ else
+ AC_LIBOBJ([poll])
+ AC_DEFINE([poll], [rpl_poll],
+ [Define to poll if the replacement function should be used.])
+ gl_PREREQ_POLL
+ POLL_H=poll.h
+ fi
+ AC_SUBST([POLL_H])
+])
+
+# Prerequisites of lib/poll.c.
+AC_DEFUN([gl_PREREQ_POLL],
+[
+ AC_CHECK_HEADERS_ONCE([sys/ioctl.h sys/filio.h])
+])
diff --git a/gnulib/m4/popen.m4 b/gnulib/m4/popen.m4
new file mode 100644
index 00000000..76fd6d91
--- /dev/null
+++ b/gnulib/m4/popen.m4
@@ -0,0 +1,34 @@
+# popen.m4 serial 2
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_POPEN],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_CACHE_CHECK([whether popen works with closed stdin],
+ [gl_cv_func_popen_works],
+ [
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
+]], [FILE *child;
+ fclose (stdin);
+ fclose (stdout);
+ child = popen ("echo a", "r");
+ return !(fgetc (child) == 'a' && pclose (child) == 0);
+])], [gl_cv_func_popen_works=yes], [gl_cv_func_popen_works=no],
+ dnl For now, only cygwin 1.5 or older is known to be broken.
+ [gl_cv_func_popen_works='guessing yes'])
+ ])
+ if test "$gl_cv_func_popen_works" = no; then
+ REPLACE_POPEN=1
+ AC_LIBOBJ([popen])
+ gl_PREREQ_POPEN
+ fi
+])
+
+# Prerequisites of lib/popen.c.
+AC_DEFUN([gl_PREREQ_POPEN],
+[
+ :
+])
diff --git a/gnulib/m4/posix-shell.m4 b/gnulib/m4/posix-shell.m4
new file mode 100644
index 00000000..2f801fad
--- /dev/null
+++ b/gnulib/m4/posix-shell.m4
@@ -0,0 +1,63 @@
+# Find a POSIX-conforming shell.
+
+# Copyright (C) 2007-2010 Free Software Foundation, Inc.
+
+# This file 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.
+
+# Written by Paul Eggert.
+
+# If a POSIX-conforming shell can be found, set POSIX_SHELL and
+# PREFERABLY_POSIX_SHELL to it. If not, set POSIX_SHELL to the
+# empty string and PREFERABLY_POSIX_SHELL to '/bin/sh'.
+
+AC_DEFUN([gl_POSIX_SHELL],
+[
+ AC_CACHE_CHECK([for a shell that conforms to POSIX], [gl_cv_posix_shell],
+ [gl_test_posix_shell_script='
+ func_return () {
+ (exit [$]1)
+ }
+ func_success () {
+ func_return 0
+ }
+ func_failure () {
+ func_return 1
+ }
+ func_ret_success () {
+ return 0
+ }
+ func_ret_failure () {
+ return 1
+ }
+ subshell_umask_sanity () {
+ (umask 22; (umask 0); test $(umask) -eq 22)
+ }
+ test "[$](echo foo)" = foo &&
+ func_success &&
+ ! func_failure &&
+ func_ret_success &&
+ ! func_ret_failure &&
+ (set x && func_ret_success y && test x = "[$]1") &&
+ subshell_umask_sanity
+ '
+ for gl_cv_posix_shell in \
+ "$CONFIG_SHELL" "$SHELL" /bin/sh /bin/bash /bin/ksh /bin/sh5 no; do
+ case $gl_cv_posix_shell in
+ /*)
+ "$gl_cv_posix_shell" -c "$gl_test_posix_shell_script" 2>/dev/null \
+ && break;;
+ esac
+ done])
+
+ if test "$gl_cv_posix_shell" != no; then
+ POSIX_SHELL=$gl_cv_posix_shell
+ PREFERABLY_POSIX_SHELL=$POSIX_SHELL
+ else
+ POSIX_SHELL=
+ PREFERABLY_POSIX_SHELL=/bin/sh
+ fi
+ AC_SUBST([POSIX_SHELL])
+ AC_SUBST([PREFERABLY_POSIX_SHELL])
+])
diff --git a/gnulib/m4/posix_spawn.m4 b/gnulib/m4/posix_spawn.m4
new file mode 100644
index 00000000..e8f12c40
--- /dev/null
+++ b/gnulib/m4/posix_spawn.m4
@@ -0,0 +1,375 @@
+# posix_spawn.m4 serial 4
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Tests whether the entire posix_spawn facility is available.
+AC_DEFUN([gl_POSIX_SPAWN],
+[
+ AC_REQUIRE([gl_POSIX_SPAWN_BODY])
+])
+
+AC_DEFUN([gl_POSIX_SPAWN_BODY],
+[
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([posix_spawn])
+ dnl Assume that when the main function exists, all the others are
+ dnl available as well.
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnp])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_init])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_addclose])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_adddup2])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_addopen])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_destroy])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_init])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getflags])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setflags])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getpgroup])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setpgroup])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getschedparam])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setschedparam])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getschedpolicy])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setschedpolicy])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getsigdefault])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setsigdefault])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getsigmask])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setsigmask])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_destroy])
+ if test $ac_cv_func_posix_spawn = yes; then
+ gl_POSIX_SPAWN_WORKS
+ case "$gl_cv_func_posix_spawn_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN=1 ;;
+ esac
+ else
+ HAVE_POSIX_SPAWN=0
+ fi
+])
+
+dnl Test whether posix_spawn actually works.
+dnl posix_spawn on AIX 5.3..6.1 has two bugs:
+dnl 1) When it fails to execute the program, the child process exits with
+dnl exit() rather than _exit(), which causes the stdio buffers to be
+dnl flushed. Reported by Rainer Tammer.
+dnl 2) The posix_spawn_file_actions_addopen function does not support file
+dnl names that contain a '*'.
+dnl posix_spawn on AIX 5.3..6.1 has also a third bug: It does not work
+dnl when POSIX threads are used. But we don't test against this bug here.
+AC_DEFUN([gl_POSIX_SPAWN_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether posix_spawn works], [gl_cv_func_posix_spawn_works],
+ [if test $cross_compiling = no; then
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <spawn.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+extern char **environ;
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+#endif
+
+#define CHILD_PROGRAM_FILENAME "/non/exist/ent"
+
+static int
+fd_safer (int fd)
+{
+ if (0 <= fd && fd <= 2)
+ {
+ int f = fd_safer (dup (fd));
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
+
+int
+main ()
+{
+ char *argv[2] = { CHILD_PROGRAM_FILENAME, NULL };
+ int ofd[2];
+ sigset_t blocked_signals;
+ sigset_t fatal_signal_set;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+ int status;
+ int exitstatus;
+
+ setvbuf (stdout, NULL, _IOFBF, 0);
+ puts ("This should be seen only once.");
+ if (pipe (ofd) < 0 || (ofd[1] = fd_safer (ofd[1])) < 0)
+ {
+ perror ("cannot create pipe");
+ exit (1);
+ }
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ sigemptyset (&fatal_signal_set);
+ sigaddset (&fatal_signal_set, SIGINT);
+ sigaddset (&fatal_signal_set, SIGTERM);
+ sigaddset (&fatal_signal_set, SIGHUP);
+ sigaddset (&fatal_signal_set, SIGPIPE);
+ sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_adddup2 (&actions, ofd[0], STDIN_FILENO)) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ofd[0])) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ofd[1])) != 0
+ || (err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
+ || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
+ || (err = posix_spawnp (&child, CHILD_PROGRAM_FILENAME, &actions, &attrs, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ if (err == ENOENT)
+ return 0;
+ else
+ {
+ errno = err;
+ perror ("subprocess failed");
+ exit (1);
+ }
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ close (ofd[0]);
+ close (ofd[1]);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ exit (1);
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 127)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ exit (1);
+ }
+ return 0;
+}
+]])],
+ [if test -s conftest$ac_exeext \
+ && ./conftest$ac_exeext > conftest.out \
+ && echo 'This should be seen only once.' > conftest.ok \
+ && cmp conftest.out conftest.ok > /dev/null; then
+ gl_cv_func_posix_spawn_works=yes
+ else
+ gl_cv_func_posix_spawn_works=no
+ fi],
+ [gl_cv_func_posix_spawn_works=no])
+ if test $gl_cv_func_posix_spawn_works = yes; then
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+/* Test whether posix_spawn_file_actions_addopen supports filename arguments
+ that contain special characters such as '*'. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <spawn.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+extern char **environ;
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+#endif
+
+#define CHILD_PROGRAM_FILENAME "conftest"
+#define DATA_FILENAME "conftest%=*#?"
+
+static int
+parent_main (void)
+{
+ FILE *fp;
+ char *argv[3] = { CHILD_PROGRAM_FILENAME, "-child", NULL };
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ int err;
+ pid_t child;
+ int status;
+ int exitstatus;
+
+ /* Create a data file with specific contents. */
+ fp = fopen (DATA_FILENAME, "wb");
+ if (fp == NULL)
+ {
+ perror ("cannot create data file");
+ return 1;
+ }
+ fwrite ("Halle Potta", 1, 11, fp);
+ if (fflush (fp) || fclose (fp))
+ {
+ perror ("cannot prepare data file");
+ return 1;
+ }
+
+ /* Avoid reading from our stdin, as it could block. */
+ freopen ("/dev/null", "rb", stdin);
+
+ /* Test whether posix_spawn_file_actions_addopen with this file name
+ actually works, but spawning a child that reads from this file. */
+ actions_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, DATA_FILENAME, O_RDONLY, 0600)) != 0
+ || (err = posix_spawn (&child, CHILD_PROGRAM_FILENAME, &actions, NULL, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ errno = err;
+ perror ("subprocess failed");
+ return 1;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ return 1;
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 0)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+child_main (void)
+{
+ char buf[1024];
+
+ /* See if reading from STDIN_FILENO yields the expected contents. */
+ if (fread (buf, 1, sizeof (buf), stdin) == 11
+ && memcmp (buf, "Halle Potta", 11) == 0)
+ return 0;
+ else
+ return 2;
+}
+
+static void
+cleanup_then_die (int sig)
+{
+ /* Clean up data file. */
+ unlink (DATA_FILENAME);
+
+ /* Re-raise the signal and die from it. */
+ signal (sig, SIG_DFL);
+ raise (sig);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int exitstatus;
+
+ if (!(argc > 1 && strcmp (argv[1], "-child") == 0))
+ {
+ /* This is the parent process. */
+ signal (SIGINT, cleanup_then_die);
+ signal (SIGTERM, cleanup_then_die);
+ #ifdef SIGHUP
+ signal (SIGHUP, cleanup_then_die);
+ #endif
+
+ exitstatus = parent_main ();
+ }
+ else
+ {
+ /* This is the child process. */
+
+ exitstatus = child_main ();
+ }
+ unlink (DATA_FILENAME);
+ return exitstatus;
+}
+]])],
+ [],
+ [gl_cv_func_posix_spawn_works=no])
+ fi
+ else
+ case "$host_os" in
+ aix*) gl_cv_func_posix_spawn_works="guessing no";;
+ *) gl_cv_func_posix_spawn_works="guessing yes";;
+ esac
+ fi
+ ])
+])
+
+AC_DEFUN([gl_POSIX_SPAWN_INTERNAL],
+[
+ AC_LIBOBJ([spawni])
+ dnl Prerequisites of lib/spawni.c.
+ AC_CHECK_HEADERS([paths.h])
+ AC_CHECK_FUNCS([confstr sched_setparam sched_setscheduler setegid seteuid vfork])
+])
diff --git a/gnulib/m4/posixtm.m4 b/gnulib/m4/posixtm.m4
new file mode 100644
index 00000000..e5aa02f6
--- /dev/null
+++ b/gnulib/m4/posixtm.m4
@@ -0,0 +1,13 @@
+# posixtm.m4 serial 7
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_POSIXTM],
+[
+ AC_LIBOBJ([posixtm])
+
+ dnl No prerequisites of lib/posixtm.c.
+])
diff --git a/gnulib/m4/posixver.m4 b/gnulib/m4/posixver.m4
new file mode 100644
index 00000000..a0d4b991
--- /dev/null
+++ b/gnulib/m4/posixver.m4
@@ -0,0 +1,45 @@
+# posixver.m4 serial 10
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_POSIXVER],
+[
+ AC_LIBOBJ([posixver])
+
+ AC_REQUIRE([gl_DEFAULT_POSIX2_VERSION])
+])
+
+# Set the default level of POSIX conformance at configure-time.
+# Build with `./configure DEFAULT_POSIX2_VERSION=199209 ...' to
+# support the older version, thus preserving portability with
+# scripts that use sort +1, tail +32, etc.
+# Note however, that this breaks tools that might run commands
+# like `sort +some-file' that conform with the newer standard.
+AC_DEFUN([gl_DEFAULT_POSIX2_VERSION],
+[
+ AC_MSG_CHECKING([for desired default level of POSIX conformance])
+ gl_default_posix2_version=none-specified
+ if test -n "$ac_cv_env_DEFAULT_POSIX2_VERSION_set"; then
+ gl_default_posix2_version=$ac_cv_env_DEFAULT_POSIX2_VERSION_value
+ AC_DEFINE_UNQUOTED([DEFAULT_POSIX2_VERSION],
+ $gl_default_posix2_version,
+ [Define the default level of POSIX conformance. The value is of
+ the form YYYYMM, specifying the year and month the standard was
+ adopted. If not defined here, it defaults to the value of
+ _POSIX2_VERSION in <unistd.h>. Define to 199209 to default to
+ POSIX 1003.2-1992, which makes standard programs like `head',
+ `tail', and `sort' accept obsolete options like `+10' and
+ `-10'. Define to 200112 to default to POSIX 1003.1-2001, which
+ makes these standard programs treat leading-`+' operands as
+ file names and require modern usages like `-n 10' instead of
+ `-10'. Whether defined here or not, the default can be
+ overridden at run time via the _POSIX2_VERSION environment
+ variable.])
+ fi
+ AC_MSG_RESULT([$gl_default_posix2_version])
+ AC_ARG_VAR(
+ [DEFAULT_POSIX2_VERSION],
+ [POSIX version to default to; see 'config.hin'.])
+])
diff --git a/gnulib/m4/pread.m4 b/gnulib/m4/pread.m4
new file mode 100644
index 00000000..f1425a6b
--- /dev/null
+++ b/gnulib/m4/pread.m4
@@ -0,0 +1,18 @@
+# pread.m4 serial 2
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_PREAD],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ dnl Persuade glibc <unistd.h> to declare pread().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([pread])
+ if test $ac_cv_func_pread = no; then
+ HAVE_PREAD=0
+ AC_LIBOBJ([pread])
+ fi
+])
diff --git a/gnulib/m4/printf-frexp.m4 b/gnulib/m4/printf-frexp.m4
new file mode 100644
index 00000000..c42391a4
--- /dev/null
+++ b/gnulib/m4/printf-frexp.m4
@@ -0,0 +1,45 @@
+# printf-frexp.m4 serial 3
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check how to define printf_frexp() without linking with libm.
+
+AC_DEFUN([gl_FUNC_PRINTF_FREXP],
+[
+ AC_CACHE_CHECK([whether frexp can be used without linking with libm],
+ [gl_cv_func_frexp_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ double x;
+ int y;],
+ [return frexp (x, &y) < 1;],
+ [gl_cv_func_frexp_no_libm=yes],
+ [gl_cv_func_frexp_no_libm=no])
+ ])
+ if test $gl_cv_func_frexp_no_libm = yes; then
+ gl_FUNC_FREXP_WORKS
+ case "$gl_cv_func_frexp_works" in
+ *yes)
+ AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
+ [Define if the frexp function is available in libc.])
+ ;;
+ esac
+ fi
+
+ AC_CACHE_CHECK([whether ldexp can be used without linking with libm],
+ [gl_cv_func_ldexp_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ double x;
+ int y;],
+ [return ldexp (x, y) < 1;],
+ [gl_cv_func_ldexp_no_libm=yes],
+ [gl_cv_func_ldexp_no_libm=no])
+ ])
+ if test $gl_cv_func_ldexp_no_libm = yes; then
+ AC_DEFINE([HAVE_LDEXP_IN_LIBC], [1],
+ [Define if the ldexp function is available in libc.])
+ fi
+])
diff --git a/gnulib/m4/printf-frexpl.m4 b/gnulib/m4/printf-frexpl.m4
new file mode 100644
index 00000000..14ffe1fc
--- /dev/null
+++ b/gnulib/m4/printf-frexpl.m4
@@ -0,0 +1,64 @@
+# printf-frexpl.m4 serial 6
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check how to define printf_frexpl() without linking with libm.
+
+AC_DEFUN([gl_FUNC_PRINTF_FREXPL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Subset of gl_FUNC_FREXPL_NO_LIBM.
+ AC_CACHE_CHECK([whether frexpl can be used without linking with libm],
+ [gl_cv_func_frexpl_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ long double x;
+ int y;],
+ [return frexpl (x, &y) < 1;],
+ [gl_cv_func_frexpl_no_libm=yes],
+ [gl_cv_func_frexpl_no_libm=no])
+ ])
+ if test $gl_cv_func_frexpl_no_libm = yes; then
+ gl_FUNC_FREXPL_WORKS
+ case "$gl_cv_func_frexpl_works" in
+ *yes) gl_func_frexpl_no_libm=yes ;;
+ *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
+ esac
+ else
+ gl_func_frexpl_no_libm=no
+ dnl Set REPLACE_FREXPL here because the system may have frexpl in libm.
+ REPLACE_FREXPL=1
+ fi
+ if test $gl_func_frexpl_no_libm = yes; then
+ AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1],
+ [Define if the frexpl function is available in libc.])
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [#include <math.h>])
+ fi
+
+ AC_CACHE_CHECK([whether ldexpl can be used without linking with libm],
+ [gl_cv_func_ldexpl_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ long double x;
+ int y;],
+ [return ldexpl (x, y) < 1;],
+ [gl_cv_func_ldexpl_no_libm=yes],
+ [gl_cv_func_ldexpl_no_libm=no])
+ ])
+ if test $gl_cv_func_ldexpl_no_libm = yes; then
+ gl_FUNC_LDEXPL_WORKS
+ case "$gl_cv_func_ldexpl_works" in
+ *yes)
+ AC_DEFINE([HAVE_LDEXPL_IN_LIBC], [1],
+ [Define if the ldexpl function is available in libc.])
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has ldexpl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [#include <math.h>])
+ ;;
+ esac
+ fi
+])
diff --git a/gnulib/m4/printf-posix-rpl.m4 b/gnulib/m4/printf-posix-rpl.m4
new file mode 100644
index 00000000..26124a12
--- /dev/null
+++ b/gnulib/m4/printf-posix-rpl.m4
@@ -0,0 +1,25 @@
+# printf-posix-rpl.m4 serial 3
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_PRINTF_POSIX],
+[
+ AC_REQUIRE([gl_FUNC_VFPRINTF_POSIX])
+ if test $gl_cv_func_vfprintf_posix = no; then
+ gl_REPLACE_PRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_PRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([printf])
+ REPLACE_PRINTF=1
+ AC_DEFINE([REPLACE_PRINTF_POSIX], [1],
+ [Define if printf is overridden by a POSIX compliant gnulib implementation.])
+ gl_PREREQ_PRINTF
+])
+
+AC_DEFUN([gl_PREREQ_PRINTF], [:])
diff --git a/gnulib/m4/printf-posix.m4 b/gnulib/m4/printf-posix.m4
new file mode 100644
index 00000000..820ddf52
--- /dev/null
+++ b/gnulib/m4/printf-posix.m4
@@ -0,0 +1,45 @@
+# printf-posix.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the printf() function supports POSIX/XSI format strings with
+dnl positions.
+
+AC_DEFUN([gt_PRINTF_POSIX],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
+ gt_cv_func_printf_posix,
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no,
+ [
+ AC_EGREP_CPP([notposix], [
+#if defined __NetBSD__ || defined __BEOS__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+ notposix
+#endif
+ ],
+ [gt_cv_func_printf_posix="guessing no"],
+ [gt_cv_func_printf_posix="guessing yes"])
+ ])
+ ])
+ case $gt_cv_func_printf_posix in
+ *yes)
+ AC_DEFINE([HAVE_POSIX_PRINTF], [1],
+ [Define if your printf() function supports format strings with positions.])
+ ;;
+ esac
+])
diff --git a/gnulib/m4/printf.m4 b/gnulib/m4/printf.m4
new file mode 100644
index 00000000..ebca5364
--- /dev/null
+++ b/gnulib/m4/printf.m4
@@ -0,0 +1,1416 @@
+# printf.m4 serial 33
+dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Test whether the *printf family of functions supports the 'j', 'z', 't',
+dnl 'L' size specifiers. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_sizes_c99.
+
+AC_DEFUN([gl_PRINTF_SIZES_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports size specifiers as in C99],
+ [gl_cv_func_printf_sizes_c99],
+ [
+ AC_TRY_RUN([
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+#endif
+static char buf[100];
+int main ()
+{
+#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
+ buf[0] = '\0';
+ if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
+ || strcmp (buf, "12345671 33") != 0)
+ return 1;
+#endif
+ buf[0] = '\0';
+ if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
+ || strcmp (buf, "12345672 33") != 0)
+ return 1;
+ buf[0] = '\0';
+ if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
+ || strcmp (buf, "12345673 33") != 0)
+ return 1;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
+ || strcmp (buf, "1.5 33") != 0)
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4]*) gl_cv_func_printf_sizes_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on MacOS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";;
+ darwin*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_printf_sizes_c99="guessing no";;
+ openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[0-9]*) gl_cv_func_printf_sizes_c99="guessing no";;
+ solaris*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_sizes_c99="guessing no";;
+ netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_printf_sizes_c99="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports 'long double'
+dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_long_double.
+
+AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports 'long double' arguments],
+ [gl_cv_func_printf_long_double],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[10000];
+int main ()
+{
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.750000 33") != 0)
+ return 1;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.750000e+00 33") != 0)
+ return 1;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.75 33") != 0)
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_long_double=yes], [gl_cv_func_printf_long_double=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ beos*) gl_cv_func_printf_long_double="guessing no";;
+ mingw* | pw*) gl_cv_func_printf_long_double="guessing no";;
+ *) gl_cv_func_printf_long_double="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports infinite and NaN
+dnl 'double' arguments and negative zero arguments in the %f, %e, %g
+dnl directives. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_infinite.
+
+AC_DEFUN([gl_PRINTF_INFINITE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
+ [gl_cv_func_printf_infinite],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+static int
+have_minus_zero ()
+{
+ static double plus_zero = 0.0;
+ double minus_zero = - plus_zero;
+ return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+static char buf[10000];
+static double zero = 0.0;
+int main ()
+{
+ if (sprintf (buf, "%f", 1.0 / 0.0) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%f", -1.0 / 0.0) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%f", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%e", 1.0 / 0.0) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%e", -1.0 / 0.0) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%e", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%g", 1.0 / 0.0) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%g", -1.0 / 0.0) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%g", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ /* This test fails on HP-UX 10.20. */
+ if (have_minus_zero ())
+ if (sprintf (buf, "%g", - zero) < 0
+ || strcmp (buf, "-0") != 0)
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_infinite=yes], [gl_cv_func_printf_infinite=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5]*) gl_cv_func_printf_infinite="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on MacOS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";;
+ darwin*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
+ hpux*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_infinite="guessing no";;
+ netbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_infinite="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_printf_infinite="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports infinite and NaN
+dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_infinite_long_double.
+
+AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ dnl The user can set or unset the variable gl_printf_safe to indicate
+ dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
+ if test -n "$gl_printf_safe"; then
+ AC_DEFINE([CHECK_PRINTF_SAFE], [1],
+ [Define if you wish *printf() functions that have a safe handling of
+ non-IEEE-754 'long double' values.])
+ fi
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
+ [gl_cv_func_printf_infinite_long_double],
+ [
+ AC_TRY_RUN([
+]GL_NOCRASH[
+#include <float.h>
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+static char buf[10000];
+static long double zeroL = 0.0L;
+int main ()
+{
+ nocrash_init();
+ if (sprintf (buf, "%Lf", 1.0L / 0.0L) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%Lf", -1.0L / 0.0L) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Le", 1.0L / 0.0L) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%Le", -1.0L / 0.0L) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%Le", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Lg", 1.0L / 0.0L) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%Lg", -1.0L / 0.0L) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ return 1;
+ if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ }
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
+ }
+#endif
+ return 0;
+}],
+ [gl_cv_func_printf_infinite_long_double=yes],
+ [gl_cv_func_printf_infinite_long_double=no],
+ [
+changequote(,)dnl
+ case "$host_cpu" in
+ # Guess no on ia64, x86_64, i386.
+ ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
+ *)
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5]*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on MacOS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ darwin*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_infinite_long_double="guessing no";;
+ netbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_printf_infinite_long_double="guessing no";;
+ esac
+ ;;
+ esac
+changequote([,])dnl
+ ])
+ ])
+ ;;
+ *)
+ gl_cv_func_printf_infinite_long_double="irrelevant"
+ ;;
+ esac
+])
+
+dnl Test whether the *printf family of functions supports the 'a' and 'A'
+dnl conversion specifier for hexadecimal output of floating-point numbers.
+dnl (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_a.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
+ [gl_cv_func_printf_directive_a],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
+ || (strcmp (buf, "0x1.922p+1 33") != 0
+ && strcmp (buf, "0x3.244p+0 33") != 0
+ && strcmp (buf, "0x6.488p-1 33") != 0
+ && strcmp (buf, "0xc.91p-2 33") != 0))
+ return 1;
+ if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
+ || (strcmp (buf, "-0X1.922P+1 33") != 0
+ && strcmp (buf, "-0X3.244P+0 33") != 0
+ && strcmp (buf, "-0X6.488P-1 33") != 0
+ && strcmp (buf, "-0XC.91P-2 33") != 0))
+ return 1;
+ /* This catches a FreeBSD 6.1 bug: it doesn't round. */
+ if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
+ || (strcmp (buf, "0x1.83p+0 33") != 0
+ && strcmp (buf, "0x3.05p-1 33") != 0
+ && strcmp (buf, "0x6.0ap-2 33") != 0
+ && strcmp (buf, "0xc.14p-3 33") != 0))
+ return 1;
+ /* This catches a FreeBSD 6.1 bug. See
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ if (sprintf (buf, "%010a %d", 1.0 / 0.0, 33, 44, 55) < 0
+ || buf[0] == '0')
+ return 1;
+ /* This catches a MacOS X 10.3.9 (Darwin 7.9) bug. */
+ if (sprintf (buf, "%.1a", 1.999) < 0
+ || (strcmp (buf, "0x1.0p+1") != 0
+ && strcmp (buf, "0x2.0p+0") != 0
+ && strcmp (buf, "0x4.0p-1") != 0
+ && strcmp (buf, "0x8.0p-2") != 0))
+ return 1;
+ /* This catches the same MacOS X 10.3.9 (Darwin 7.9) bug and also a
+ glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
+ if (sprintf (buf, "%.1La", 1.999L) < 0
+ || (strcmp (buf, "0x1.0p+1") != 0
+ && strcmp (buf, "0x2.0p+0") != 0
+ && strcmp (buf, "0x4.0p-1") != 0
+ && strcmp (buf, "0x8.0p-2") != 0))
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no],
+ [
+ case "$host_os" in
+ # Guess yes on glibc >= 2.5 systems.
+ *-gnu*)
+ AC_EGREP_CPP([BZ2908], [
+ #include <features.h>
+ #ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)
+ BZ2908
+ #endif
+ #endif
+ ],
+ [gl_cv_func_printf_directive_a="guessing yes"],
+ [gl_cv_func_printf_directive_a="guessing no"])
+ ;;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_printf_directive_a="guessing no";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %F format
+dnl directive. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_f.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'F' directive],
+ [gl_cv_func_printf_directive_f],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
+ || strcmp (buf, "1234567.000000 33") != 0)
+ return 1;
+ if (sprintf (buf, "%F", 1.0 / 0.0) < 0
+ || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
+ return 1;
+ /* This catches a Cygwin 1.5.x bug. */
+ if (sprintf (buf, "%.F", 1234.0) < 0
+ || strcmp (buf, "1234") != 0)
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5]*) gl_cv_func_printf_directive_f="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on MacOS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";;
+ darwin*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[0-9]*) gl_cv_func_printf_directive_f="guessing no";;
+ solaris*) gl_cv_func_printf_directive_f="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_printf_directive_f="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %n format
+dnl directive. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_n.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'n' directive],
+ [gl_cv_func_printf_directive_n],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+ int count = -1;
+ /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
+ support %n in format strings in read-only memory but not in writable
+ memory. */
+ strcpy (fmtstring, "%d %n");
+ if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
+ || strcmp (buf, "123 ") != 0
+ || count != 4)
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ *) gl_cv_func_printf_directive_n="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %ls format
+dnl directive and in particular, when a precision is specified, whether
+dnl the functions stop converting the wide string argument when the number
+dnl of bytes that have been produced by this conversion equals or exceeds
+dnl the precision.
+dnl Result is gl_cv_func_printf_directive_ls.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'ls' directive],
+ [gl_cv_func_printf_directive_ls],
+ [
+ AC_TRY_RUN([
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+#include <string.h>
+int main ()
+{
+ char buf[100];
+ /* Test whether %ls works at all.
+ This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
+ Cygwin 1.5. */
+ {
+ static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%ls", wstring) < 0
+ || strcmp (buf, "abc") != 0)
+ return 1;
+ }
+ /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
+ assertion failure inside libc), but not on OpenBSD 4.0. */
+ {
+ static const wchar_t wstring[] = { 'a', 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%ls", wstring) < 0
+ || strcmp (buf, "a") != 0)
+ return 1;
+ }
+ /* Test whether precisions in %ls are supported as specified in ISO C 99
+ section 7.19.6.1:
+ "If a precision is specified, no more than that many bytes are written
+ (including shift sequences, if any), and the array shall contain a
+ null wide character if, to equal the multibyte character sequence
+ length given by the precision, the function would need to access a
+ wide character one past the end of the array."
+ This test fails on Solaris 10. */
+ {
+ static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%.2ls", wstring) < 0
+ || strcmp (buf, "ab") != 0)
+ return 1;
+ }
+ return 0;
+}], [gl_cv_func_printf_directive_ls=yes], [gl_cv_func_printf_directive_ls=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ openbsd*) gl_cv_func_printf_directive_ls="guessing no";;
+ irix*) gl_cv_func_printf_directive_ls="guessing no";;
+ solaris*) gl_cv_func_printf_directive_ls="guessing no";;
+ cygwin*) gl_cv_func_printf_directive_ls="guessing no";;
+ beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";;
+ *) gl_cv_func_printf_directive_ls="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports POSIX/XSI format
+dnl strings with positions. (POSIX:2001)
+dnl Result is gl_cv_func_printf_positions.
+
+AC_DEFUN([gl_PRINTF_POSITIONS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
+ [gl_cv_func_printf_positions],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+ gl_cv_func_printf_positions="guessing no";;
+ beos*) gl_cv_func_printf_positions="guessing no";;
+ mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
+ *) gl_cv_func_printf_positions="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports POSIX/XSI format
+dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
+dnl Result is gl_cv_func_printf_flag_grouping.
+
+AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the grouping flag],
+ [gl_cv_func_printf_flag_grouping],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ if (sprintf (buf, "%'d %d", 1234567, 99) < 0
+ || buf[strlen (buf) - 1] != '9')
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ cygwin*) gl_cv_func_printf_flag_grouping="guessing no";;
+ netbsd*) gl_cv_func_printf_flag_grouping="guessing no";;
+ mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
+ *) gl_cv_func_printf_flag_grouping="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the - flag correctly.
+dnl (ISO C99.) See
+dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html>
+dnl Result is gl_cv_func_printf_flag_leftadjust.
+
+AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
+ [gl_cv_func_printf_flag_leftadjust],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ /* Check that a '-' flag is not annihilated by a negative width. */
+ if (sprintf (buf, "a%-*sc", -3, "b") < 0
+ || strcmp (buf, "ab c") != 0)
+ return 1;
+ return 0;
+}],
+ [gl_cv_func_printf_flag_leftadjust=yes],
+ [gl_cv_func_printf_flag_leftadjust=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on HP-UX 11.
+ hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess no on HP-UX 10 and older.
+ hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports padding of non-finite
+dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
+dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
+dnl Result is gl_cv_func_printf_flag_zero.
+
+AC_DEFUN([gl_PRINTF_FLAG_ZERO],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the zero flag correctly],
+ [gl_cv_func_printf_flag_zero],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ if (sprintf (buf, "%010f", 1.0 / 0.0, 33, 44, 55) < 0
+ || (strcmp (buf, " inf") != 0
+ && strcmp (buf, " infinity") != 0))
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_printf_flag_zero="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports large precisions.
+dnl On mingw, precisions larger than 512 are treated like 512, in integer,
+dnl floating-point or pointer output. On BeOS, precisions larger than 1044
+dnl crash the program.
+dnl Result is gl_cv_func_printf_precision.
+
+AC_DEFUN([gl_PRINTF_PRECISION],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports large precisions],
+ [gl_cv_func_printf_precision],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[5000];
+int main ()
+{
+#ifdef __BEOS__
+ /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
+ return 1;
+#endif
+ if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
+ return 1;
+ return 0;
+}], [gl_cv_func_printf_precision=yes], [gl_cv_func_printf_precision=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no only on native Win32 and BeOS systems.
+ mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
+ beos*) gl_cv_func_printf_precision="guessing no" ;;
+ *) gl_cv_func_printf_precision="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions recovers gracefully in case
+dnl of an out-of-memory condition, or whether it crashes the entire program.
+dnl Result is gl_cv_func_printf_enomem.
+
+AC_DEFUN([gl_PRINTF_ENOMEM],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_MULTIARCH])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
+ [gl_cv_func_printf_enomem],
+ [
+ gl_cv_func_printf_enomem="guessing no"
+ if test "$cross_compiling" = no; then
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([
+]GL_NOCRASH[
+changequote(,)dnl
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <errno.h>
+int main()
+{
+ struct rlimit limit;
+ int ret;
+ nocrash_init ();
+ /* Some printf implementations allocate temporary space with malloc. */
+ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
+#ifdef RLIMIT_DATA
+ if (getrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+#endif
+ /* On Linux systems, malloc() is limited by RLIMIT_AS. */
+#ifdef RLIMIT_AS
+ if (getrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+#endif
+ /* Some printf implementations allocate temporary space on the stack. */
+#ifdef RLIMIT_STACK
+ if (getrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+#endif
+ ret = printf ("%.5000000f", 1.0);
+ return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
+}
+changequote([,])dnl
+ ])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ (./conftest
+ result=$?
+ if test $result != 0 && test $result != 77; then result=1; fi
+ exit $result
+ ) >/dev/null 2>/dev/null
+ case $? in
+ 0) gl_cv_func_printf_enomem="yes" ;;
+ 77) gl_cv_func_printf_enomem="guessing no" ;;
+ *) gl_cv_func_printf_enomem="no" ;;
+ esac
+ else
+ gl_cv_func_printf_enomem="guessing no"
+ fi
+ rm -fr conftest*
+ else
+ dnl A universal build on Apple MacOS X platforms.
+ dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
+ dnl But we need a configuration result that is valid in both modes.
+ gl_cv_func_printf_enomem="guessing no"
+ fi
+ fi
+ if test "$gl_cv_func_printf_enomem" = "guessing no"; then
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on Solaris.
+ solaris*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on AIX.
+ aix*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on HP-UX/hppa.
+ hpux*) case "$host_cpu" in
+ hppa*) gl_cv_func_printf_enomem="guessing yes";;
+ *) gl_cv_func_printf_enomem="guessing no";;
+ esac
+ ;;
+ # Guess yes on IRIX.
+ irix*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on OSF/1.
+ osf*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on Haiku.
+ haiku*) gl_cv_func_printf_enomem="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_printf_enomem="guessing no";;
+ esac
+changequote([,])dnl
+ fi
+ ])
+])
+
+dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
+dnl Result is ac_cv_func_snprintf.
+
+AC_DEFUN([gl_SNPRINTF_PRESENCE],
+[
+ AC_CHECK_FUNCS_ONCE([snprintf])
+])
+
+dnl Test whether the string produced by the snprintf function is always NUL
+dnl terminated. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_snprintf_truncation_c99.
+
+AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
+ [gl_cv_func_snprintf_truncation_c99],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ snprintf (buf, 3, "%d %d", 4567, 89);
+ if (memcmp (buf, "45\0DEF", 6) != 0)
+ return 1;
+ return 0;
+}], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on MacOS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OSF/1 >= 5.
+ osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the return value of the snprintf function is the number
+dnl of bytes (excluding the terminating NUL) that would have been produced
+dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
+dnl For example, this test program fails on IRIX 6.5:
+dnl ---------------------------------------------------------------------
+dnl #include <stdio.h>
+dnl int main()
+dnl {
+dnl static char buf[8];
+dnl int retval = snprintf (buf, 3, "%d", 12345);
+dnl return retval >= 0 && retval < 3;
+dnl }
+dnl ---------------------------------------------------------------------
+dnl Result is gl_cv_func_snprintf_retval_c99.
+
+AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
+ [gl_cv_func_snprintf_retval_c99],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
+ return 1;
+ return 0;
+}], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on MacOS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5]*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ solaris*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_snprintf_retval_c99="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the snprintf function supports the %n format directive
+dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_snprintf_directive_n.
+
+AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
+ [gl_cv_func_snprintf_directive_n],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+ int count = -1;
+ /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
+ support %n in format strings in read-only memory but not in writable
+ memory. */
+ strcpy (fmtstring, "%d %n");
+ snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
+ if (count != 6)
+ return 1;
+ return 0;
+}], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on MacOS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
+ darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5]*) gl_cv_func_snprintf_directive_n="guessing no";;
+ solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
+ aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on OSF/1 >= 5.
+ osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
+ osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_directive_n="guessing no";;
+ netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_snprintf_directive_n="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the snprintf function, when passed a size = 1, writes any
+dnl output without bounds in this case, behaving like sprintf. This is the
+dnl case on Linux libc5.
+dnl Result is gl_cv_func_snprintf_size1.
+
+AC_DEFUN([gl_SNPRINTF_SIZE1],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether snprintf respects a size of 1],
+ [gl_cv_func_snprintf_size1],
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ snprintf (buf, 1, "%d", 12345);
+ return buf[1] != 'E';
+}],
+ [gl_cv_func_snprintf_size1=yes],
+ [gl_cv_func_snprintf_size1=no],
+ [gl_cv_func_snprintf_size1="guessing yes"])
+ ])
+])
+
+dnl Test whether the vsnprintf function, when passed a zero size, produces no
+dnl output. (ISO C99, POSIX:2001)
+dnl For example, snprintf nevertheless writes a NUL byte in this case
+dnl on OSF/1 5.1:
+dnl ---------------------------------------------------------------------
+dnl #include <stdio.h>
+dnl int main()
+dnl {
+dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+dnl snprintf (buf, 0, "%d", 12345);
+dnl return buf[0] != 'D';
+dnl }
+dnl ---------------------------------------------------------------------
+dnl And vsnprintf writes any output without bounds in this case, behaving like
+dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
+dnl ---------------------------------------------------------------------
+dnl #include <stdarg.h>
+dnl #include <stdio.h>
+dnl static int my_snprintf (char *buf, int size, const char *format, ...)
+dnl {
+dnl va_list args;
+dnl int ret;
+dnl va_start (args, format);
+dnl ret = vsnprintf (buf, size, format, args);
+dnl va_end (args);
+dnl return ret;
+dnl }
+dnl int main()
+dnl {
+dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+dnl my_snprintf (buf, 0, "%d", 12345);
+dnl return buf[0] != 'D';
+dnl }
+dnl ---------------------------------------------------------------------
+dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
+
+AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
+ [gl_cv_func_vsnprintf_zerosize_c99],
+ [
+ AC_TRY_RUN([
+#include <stdarg.h>
+#include <stdio.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 0, "%d", 12345);
+ return buf[0] != 'D';
+}],
+ [gl_cv_func_vsnprintf_zerosize_c99=yes],
+ [gl_cv_func_vsnprintf_zerosize_c99=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on MacOS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Cygwin.
+ cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on mingw.
+ mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # If we don't know, assume the worst.
+ *) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl The results of these tests on various platforms are:
+dnl
+dnl 1 = gl_PRINTF_SIZES_C99
+dnl 2 = gl_PRINTF_LONG_DOUBLE
+dnl 3 = gl_PRINTF_INFINITE
+dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
+dnl 5 = gl_PRINTF_DIRECTIVE_A
+dnl 6 = gl_PRINTF_DIRECTIVE_F
+dnl 7 = gl_PRINTF_DIRECTIVE_N
+dnl 8 = gl_PRINTF_DIRECTIVE_LS
+dnl 9 = gl_PRINTF_POSITIONS
+dnl 10 = gl_PRINTF_FLAG_GROUPING
+dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
+dnl 12 = gl_PRINTF_FLAG_ZERO
+dnl 13 = gl_PRINTF_PRECISION
+dnl 14 = gl_PRINTF_ENOMEM
+dnl 15 = gl_SNPRINTF_PRESENCE
+dnl 16 = gl_SNPRINTF_TRUNCATION_C99
+dnl 17 = gl_SNPRINTF_RETVAL_C99
+dnl 18 = gl_SNPRINTF_DIRECTIVE_N
+dnl 19 = gl_SNPRINTF_SIZE1
+dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
+dnl
+dnl 1 = checking whether printf supports size specifiers as in C99...
+dnl 2 = checking whether printf supports 'long double' arguments...
+dnl 3 = checking whether printf supports infinite 'double' arguments...
+dnl 4 = checking whether printf supports infinite 'long double' arguments...
+dnl 5 = checking whether printf supports the 'a' and 'A' directives...
+dnl 6 = checking whether printf supports the 'F' directive...
+dnl 7 = checking whether printf supports the 'n' directive...
+dnl 8 = checking whether printf supports the 'ls' directive...
+dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
+dnl 10 = checking whether printf supports the grouping flag...
+dnl 11 = checking whether printf supports the left-adjust flag correctly...
+dnl 12 = checking whether printf supports the zero flag correctly...
+dnl 13 = checking whether printf supports large precisions...
+dnl 14 = checking whether printf survives out-of-memory conditions...
+dnl 15 = checking for snprintf...
+dnl 16 = checking whether snprintf truncates the result as in C99...
+dnl 17 = checking whether snprintf returns a byte count as in C99...
+dnl 18 = checking whether snprintf fully supports the 'n' directive...
+dnl 19 = checking whether snprintf respects a size of 1...
+dnl 20 = checking whether vsnprintf respects a zero size as in C99...
+dnl
+dnl . = yes, # = no.
+dnl
+dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . .
+dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . .
+dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . .
+dnl MacOS X 10.3.9 . . . . # . . . . . . # . # . . . . . .
+dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . .
+dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . .
+dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . .
+dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . .
+dnl Solaris 10 . . # # # . . # . . . # . . . . . . . .
+dnl Solaris 2.6 ... 9 # . # # # # . # . . . # . . . . . . . .
+dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # #
+dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . .
+dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . . . . .
+dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . .
+dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . #
+dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? #
+dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . .
+dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . #
+dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # #
+dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ?
+dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . .
+dnl Haiku . . . # # # . # . . . . . ? . . . . . .
+dnl BeOS # # . # # # . ? # . ? . # ? . . . . . .
+dnl mingw # # # # # # . . # # . # # ? . # # # . .
diff --git a/gnulib/m4/priv-set.m4 b/gnulib/m4/priv-set.m4
new file mode 100644
index 00000000..205b00c6
--- /dev/null
+++ b/gnulib/m4/priv-set.m4
@@ -0,0 +1,15 @@
+# serial 6
+
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+# Written by David Bartley.
+
+AC_DEFUN([gl_PRIV_SET],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_CHECK_FUNCS([getppriv])
+])
diff --git a/gnulib/m4/progtest.m4 b/gnulib/m4/progtest.m4
new file mode 100644
index 00000000..2d804ac9
--- /dev/null
+++ b/gnulib/m4/progtest.m4
@@ -0,0 +1,92 @@
+# progtest.m4 serial 6 (gettext-0.18)
+dnl Copyright (C) 1996-2003, 2005, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+AC_PREREQ([2.50])
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL([ac_cv_path_$1],
+[case "[$]$1" in
+ [[\\/]]* | ?:[[\\/]]*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$][$1])
+else
+ AC_MSG_RESULT([no])
+fi
+AC_SUBST([$1])dnl
+])
diff --git a/gnulib/m4/pthread.m4 b/gnulib/m4/pthread.m4
new file mode 100644
index 00000000..31d2b226
--- /dev/null
+++ b/gnulib/m4/pthread.m4
@@ -0,0 +1,27 @@
+# pthread.m4
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_PTHREAD_CHECK],
+ [AC_CHECK_HEADERS_ONCE([pthread.h])
+
+ LIB_PTHREAD=
+ PTHREAD_H=
+ if test "$ac_cv_header_pthread_h" = yes; then
+ gl_saved_libs=$LIBS
+ AC_SEARCH_LIBS([pthread_create], [pthread],
+ [if test "$ac_cv_search_pthread_create" != "none required"; then
+ LIB_PTHREAD="$ac_cv_search_pthread_create"
+ fi])
+ LIBS="$gl_saved_libs"
+ else
+ PTHREAD_H='pthread.h'
+ fi
+
+ AC_SUBST([LIB_PTHREAD])
+ AC_SUBST([PTHREAD_H])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
diff --git a/gnulib/m4/pty.m4 b/gnulib/m4/pty.m4
new file mode 100644
index 00000000..1d8616d6
--- /dev/null
+++ b/gnulib/m4/pty.m4
@@ -0,0 +1,42 @@
+# pty.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_PTY
+# ------
+# Make sure that pty.h provides forkpty, or sets up a replacement header.
+# Also define automake variable PTY_LIB to the library needed (if any).
+AC_DEFUN([gl_PTY],
+[
+ PTY_H=''
+ PTY_LIB=''
+ # First make sure that pty.h provides forkpty, or setup the replacement.
+ AC_CHECK_HEADERS_ONCE([pty.h])
+ if test $ac_cv_header_pty_h != yes; then
+ AC_CHECK_DECL([forkpty],,, [[#include <util.h>]])
+ if test $ac_cv_have_decl_forkpty = no; then
+ AC_CHECK_DECL([forkpty],,, [[#include <libutil.h>]])
+ if test $ac_cv_have_decl_forkpty = no; then
+ AC_MSG_WARN([[Cannot find forkpty, build will likely fail]])
+ else
+ PTY_H='pty.h'
+ PTY_HEADER='libutil.h'
+ fi
+ else
+ PTY_H='pty.h'
+ PTY_HEADER='util.h'
+ fi
+ fi
+ # Second check for the library required for forkpty.
+ save_LIBS="$LIBS"
+ AC_SEARCH_LIBS([forkpty], [util],
+ [if test "$ac_cv_search_forkpty" != "none required"; then
+ PTY_LIB="$ac_cv_search_forkpty"
+ fi])
+ LIBS="$save_LIBS"
+ AC_SUBST([PTY_H])
+ AC_SUBST([PTY_LIB])
+ AC_SUBST([PTY_HEADER])
+])
diff --git a/gnulib/m4/putenv.m4 b/gnulib/m4/putenv.m4
new file mode 100644
index 00000000..dd9140c0
--- /dev/null
+++ b/gnulib/m4/putenv.m4
@@ -0,0 +1,41 @@
+# putenv.m4 serial 16
+dnl Copyright (C) 2002-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Jim Meyering.
+dnl
+dnl Check whether putenv ("FOO") removes FOO from the environment.
+dnl The putenv in libc on at least SunOS 4.1.4 does *not* do that.
+
+AC_DEFUN([gl_FUNC_PUTENV],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_CACHE_CHECK([for putenv compatible with GNU and SVID],
+ [gl_cv_func_svid_putenv],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],[[
+ /* Put it in env. */
+ if (putenv ("CONFTEST_putenv=val"))
+ return 1;
+
+ /* Try to remove it. */
+ if (putenv ("CONFTEST_putenv"))
+ return 1;
+
+ /* Make sure it was deleted. */
+ if (getenv ("CONFTEST_putenv") != 0)
+ return 1;
+
+ return 0;
+ ]])],
+ gl_cv_func_svid_putenv=yes,
+ gl_cv_func_svid_putenv=no,
+ dnl When crosscompiling, assume putenv is broken.
+ gl_cv_func_svid_putenv=no)
+ ])
+ if test $gl_cv_func_svid_putenv = no; then
+ REPLACE_PUTENV=1
+ AC_LIBOBJ([putenv])
+ fi
+])
diff --git a/gnulib/m4/quote.m4 b/gnulib/m4/quote.m4
new file mode 100644
index 00000000..e0755426
--- /dev/null
+++ b/gnulib/m4/quote.m4
@@ -0,0 +1,14 @@
+# quote.m4 serial 5
+dnl Copyright (C) 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_QUOTE],
+[
+ AC_LIBOBJ([quote])
+
+ dnl Prerequisites of lib/quote.c.
+ dnl (none)
+])
diff --git a/gnulib/m4/quotearg.m4 b/gnulib/m4/quotearg.m4
new file mode 100644
index 00000000..f72fd621
--- /dev/null
+++ b/gnulib/m4/quotearg.m4
@@ -0,0 +1,10 @@
+# quotearg.m4 serial 8
+dnl Copyright (C) 2002, 2004-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_QUOTEARG],
+[
+ AC_LIBOBJ([quotearg])
+])
diff --git a/gnulib/m4/random_r.m4 b/gnulib/m4/random_r.m4
new file mode 100644
index 00000000..8c3aa2ac
--- /dev/null
+++ b/gnulib/m4/random_r.m4
@@ -0,0 +1,21 @@
+# serial 1
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_RANDOM_R],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_CHECK_FUNCS([random_r])
+ if test $ac_cv_func_random_r = no; then
+ HAVE_RANDOM_R=0
+ AC_LIBOBJ([random_r])
+ gl_PREREQ_RANDOM_R
+ fi
+])
+
+# Prerequisites of lib/random_r.c.
+AC_DEFUN([gl_PREREQ_RANDOM_R], [
+ :
+])
diff --git a/gnulib/m4/rawmemchr.m4 b/gnulib/m4/rawmemchr.m4
new file mode 100644
index 00000000..2a25a490
--- /dev/null
+++ b/gnulib/m4/rawmemchr.m4
@@ -0,0 +1,21 @@
+# rawmemchr.m4 serial 1
+dnl Copyright (C) 2003, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_RAWMEMCHR],
+[
+ dnl Persuade glibc <string.h> to declare rawmemchr().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([rawmemchr])
+ if test $ac_cv_func_rawmemchr = no; then
+ HAVE_RAWMEMCHR=0
+ gl_PREREQ_RAWMEMCHR
+ fi
+])
+
+# Prerequisites of lib/strchrnul.c.
+AC_DEFUN([gl_PREREQ_RAWMEMCHR], [:])
diff --git a/gnulib/m4/read-file.m4 b/gnulib/m4/read-file.m4
new file mode 100644
index 00000000..35a3a481
--- /dev/null
+++ b/gnulib/m4/read-file.m4
@@ -0,0 +1,15 @@
+# read-file.m4 serial 2
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_READ_FILE],
+[
+ AC_LIBOBJ([read-file])
+ gl_PREREQ_READ_FILE
+])
+
+# Prerequisites of lib/read-file.c.
+AC_DEFUN([gl_PREREQ_READ_FILE], [:])
diff --git a/gnulib/m4/readline.m4 b/gnulib/m4/readline.m4
new file mode 100644
index 00000000..27f81629
--- /dev/null
+++ b/gnulib/m4/readline.m4
@@ -0,0 +1,80 @@
+# readline.m4 serial 7
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Simon Josefsson, with help from Bruno Haible and Oskar
+dnl Liljeblad.
+
+AC_DEFUN([gl_FUNC_READLINE],
+[
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libreadline and define LIBREADLINE, LTLIBREADLINE and
+ dnl INCREADLINE accordingly.
+ AC_LIB_LINKFLAGS_BODY([readline])
+
+ dnl Add $INCREADLINE to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed libreadline and not disabled its use
+ dnl via --without-libreadline-prefix, he wants to use it. The AC_LINK_IFELSE
+ dnl will then succeed.
+ am_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCREADLINE])
+
+ AC_CACHE_CHECK([for readline], [gl_cv_lib_readline], [
+ gl_cv_lib_readline=no
+ am_save_LIBS="$LIBS"
+ dnl On some systems, -lreadline doesn't link without an additional
+ dnl -lncurses or -ltermcap.
+ dnl Try -lncurses before -ltermcap, because libtermcap is unsecure
+ dnl by design and obsolete since 1994. Try -lcurses last, because
+ dnl libcurses is unusable on some old Unices.
+ for extra_lib in "" ncurses termcap curses; do
+ LIBS="$am_save_LIBS $LIBREADLINE"
+ if test -n "$extra_lib"; then
+ LIBS="$LIBS -l$extra_lib"
+ fi
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
+#include <readline/readline.h>]],
+ [[readline((char*)0);]])],
+ [gl_cv_lib_readline=" -l$extra_lib"])
+ if test "$gl_cv_lib_readline" != no; then
+ break
+ fi
+ done
+ LIBS="$am_save_LIBS"
+ ])
+
+ if test "$gl_cv_lib_readline" != no; then
+ AC_DEFINE([HAVE_READLINE], [1], [Define if you have the readline library.])
+ if test "$gl_cv_lib_readline" != " -l"; then
+ LIBREADLINE="$LIBREADLINE$gl_cv_lib_readline"
+ LTLIBREADLINE="$LTLIBREADLINE$gl_cv_lib_readline"
+ fi
+ AC_MSG_CHECKING([how to link with libreadline])
+ AC_MSG_RESULT([$LIBREADLINE])
+ else
+ dnl If $LIBREADLINE didn't lead to a usable library, we don't
+ dnl need $INCREADLINE either.
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBREADLINE=
+ LTLIBREADLINE=
+ fi
+ AC_SUBST([LIBREADLINE])
+ AC_SUBST([LTLIBREADLINE])
+
+ AC_CHECK_HEADERS([readline/readline.h])
+
+ if test $gl_cv_lib_readline = no; then
+ AC_LIBOBJ([readline])
+ gl_PREREQ_READLINE
+ fi
+])
+
+# Prerequisites of lib/readline.c.
+AC_DEFUN([gl_PREREQ_READLINE], [
+ :
+])
diff --git a/gnulib/m4/readlink.m4 b/gnulib/m4/readlink.m4
new file mode 100644
index 00000000..36cd41f9
--- /dev/null
+++ b/gnulib/m4/readlink.m4
@@ -0,0 +1,62 @@
+# readlink.m4 serial 9
+dnl Copyright (C) 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_READLINK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([readlink])
+ if test $ac_cv_func_readlink = no; then
+ HAVE_READLINK=0
+ AC_LIBOBJ([readlink])
+ gl_PREREQ_READLINK
+ else
+ AC_CACHE_CHECK([whether readlink signature is correct],
+ [gl_cv_decl_readlink_works],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+ /* Cause compilation failure if original declaration has wrong type. */
+ ssize_t readlink (const char *, char *, size_t);]])],
+ [gl_cv_decl_readlink_works=yes], [gl_cv_decl_readlink_works=no])])
+ dnl Solaris 9 ignores trailing slash.
+ dnl FreeBSD 7.2 dereferences only one level of links with trailing slash.
+ AC_CACHE_CHECK([whether readlink handles trailing slash correctly],
+ [gl_cv_func_readlink_works],
+ [# We have readlink, so assume ln -s works.
+ ln -s conftest.no-such conftest.link
+ ln -s conftest.link conftest.lnk2
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+]], [[char buf[20];
+ return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])],
+ [gl_cv_func_readlink_works=yes], [gl_cv_func_readlink_works=no],
+ [gl_cv_func_readlink_works="guessing no"])
+ rm -f conftest.link conftest.lnk2])
+ if test "$gl_cv_func_readlink_works" != yes; then
+ AC_DEFINE([READLINK_TRAILING_SLASH_BUG], [1], [Define to 1 if readlink
+ fails to recognize a trailing slash.])
+ REPLACE_READLINK=1
+ AC_LIBOBJ([readlink])
+ elif test "$gl_cv_decl_readlink_works" != yes; then
+ REPLACE_READLINK=1
+ AC_LIBOBJ([readlink])
+ fi
+ fi
+])
+
+# Like gl_FUNC_READLINK, except prepare for separate compilation (no AC_LIBOBJ).
+AC_DEFUN([gl_FUNC_READLINK_SEPARATE],
+[
+ AC_CHECK_FUNCS_ONCE([readlink])
+ gl_PREREQ_READLINK
+])
+
+# Prerequisites of lib/readlink.c.
+AC_DEFUN([gl_PREREQ_READLINK],
+[
+ :
+])
diff --git a/gnulib/m4/readtokens.m4 b/gnulib/m4/readtokens.m4
new file mode 100644
index 00000000..38a3a0eb
--- /dev/null
+++ b/gnulib/m4/readtokens.m4
@@ -0,0 +1,14 @@
+# readtokens.m4 serial 5
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_READTOKENS],
+[
+ AC_LIBOBJ([readtokens])
+
+ dnl Prerequisites of lib/readtokens.c.
+ :
+])
diff --git a/gnulib/m4/readutmp.m4 b/gnulib/m4/readutmp.m4
new file mode 100644
index 00000000..d4c90087
--- /dev/null
+++ b/gnulib/m4/readutmp.m4
@@ -0,0 +1,61 @@
+# readutmp.m4 serial 16
+dnl Copyright (C) 2002-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_READUTMP],
+[
+ dnl Persuade utmpx.h to declare utmpxname
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_HEADERS_ONCE([utmp.h utmpx.h])
+ if test $ac_cv_header_utmp_h = yes || test $ac_cv_header_utmpx_h = yes; then
+ AC_LIBOBJ([readutmp])
+
+ dnl Prerequisites of lib/readutmp.h and lib/readutmp.c.
+ AC_REQUIRE([AC_C_INLINE])
+ AC_CHECK_FUNCS_ONCE([utmpname utmpxname])
+ AC_CHECK_DECLS([getutent],,,[
+#ifdef HAVE_UTMP_H
+# include <utmp.h>
+#endif
+])
+ utmp_includes="\
+$ac_includes_default
+#ifdef HAVE_UTMPX_H
+# include <utmpx.h>
+#endif
+#ifdef HAVE_UTMP_H
+# if defined _THREAD_SAFE && defined UTMP_DATA_INIT
+ /* When including both utmp.h and utmpx.h on AIX 4.3, with _THREAD_SAFE
+ defined, work around the duplicate struct utmp_data declaration. */
+# define utmp_data gl_aix_4_3_workaround_utmp_data
+# endif
+# include <utmp.h>
+#endif
+"
+ AC_CHECK_MEMBERS([struct utmpx.ut_user],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_user],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmpx.ut_name],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_name],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmpx.ut_type],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_type],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmpx.ut_pid],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_pid],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmpx.ut_id],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_id],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmpx.ut_exit],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_exit],,,[$utmp_includes])
+
+ AC_CHECK_MEMBERS([struct utmpx.ut_exit.ut_exit],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_exit.ut_exit],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmpx.ut_exit.e_exit],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_exit.e_exit],,,[$utmp_includes])
+
+ AC_CHECK_MEMBERS([struct utmpx.ut_exit.ut_termination],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_exit.ut_termination],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmpx.ut_exit.e_termination],,,[$utmp_includes])
+ AC_CHECK_MEMBERS([struct utmp.ut_exit.e_termination],,,[$utmp_includes])
+ fi
+])
diff --git a/gnulib/m4/realloc.m4 b/gnulib/m4/realloc.m4
new file mode 100644
index 00000000..dc30235c
--- /dev/null
+++ b/gnulib/m4/realloc.m4
@@ -0,0 +1,23 @@
+# realloc.m4 serial 9
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_FUNC_REALLOC_POSIX
+# ---------------------
+# Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it
+# fails), and replace realloc if it is not.
+AC_DEFUN([gl_FUNC_REALLOC_POSIX],
+[
+ AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+ if test $gl_cv_func_malloc_posix = yes; then
+ HAVE_REALLOC_POSIX=1
+ AC_DEFINE([HAVE_REALLOC_POSIX], [1],
+ [Define if the 'realloc' function is POSIX compliant.])
+ else
+ AC_LIBOBJ([realloc])
+ HAVE_REALLOC_POSIX=0
+ fi
+ AC_SUBST([HAVE_REALLOC_POSIX])
+])
diff --git a/gnulib/m4/regex.m4 b/gnulib/m4/regex.m4
new file mode 100644
index 00000000..6bd6b8f7
--- /dev/null
+++ b/gnulib/m4/regex.m4
@@ -0,0 +1,229 @@
+# serial 55
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+dnl Initially derived from code in GNU grep.
+dnl Mostly written by Jim Meyering.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([gl_REGEX],
+[
+ AC_CHECK_HEADERS_ONCE([locale.h])
+
+ AC_ARG_WITH([included-regex],
+ [AS_HELP_STRING([--without-included-regex],
+ [don't compile regex; this is the default on systems
+ with recent-enough versions of the GNU C Library
+ (use with caution on other systems).])])
+
+ case $with_included_regex in #(
+ yes|no) ac_use_included_regex=$with_included_regex
+ ;;
+ '')
+ # If the system regex support is good enough that it passes the
+ # following run test, then default to *not* using the included regex.c.
+ # If cross compiling, assume the test would fail and use the included
+ # regex.c.
+ AC_CACHE_CHECK([for working re_compile_pattern],
+ [gl_cv_func_re_compile_pattern_working],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT[
+ #if HAVE_LOCALE_H
+ #include <locale.h>
+ #endif
+ #include <limits.h>
+ #include <regex.h>
+ ]],
+ [[static struct re_pattern_buffer regex;
+ unsigned char folded_chars[UCHAR_MAX + 1];
+ int i;
+ const char *s;
+ struct re_registers regs;
+
+ #if HAVE_LOCALE_H
+ /* http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html
+ This test needs valgrind to catch the bug on Debian
+ GNU/Linux 3.1 x86, but it might catch the bug better
+ on other platforms and it shouldn't hurt to try the
+ test here. */
+ if (setlocale (LC_ALL, "en_US.UTF-8"))
+ {
+ static char const pat[] = "insert into";
+ static char const data[] =
+ "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK";
+ re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE
+ | RE_ICASE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern (pat, sizeof pat - 1, &regex);
+ if (s)
+ return 1;
+ if (re_search (&regex, data, sizeof data - 1,
+ 0, sizeof data - 1, &regs)
+ != -1)
+ return 1;
+ if (! setlocale (LC_ALL, "C"))
+ return 1;
+ }
+ #endif
+
+ /* This test is from glibc bug 3957, reported by Andrew Mackey. */
+ re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("a[^x]b", 6, &regex);
+ if (s)
+ return 1;
+
+ /* This should fail, but succeeds for glibc-2.5. */
+ if (re_search (&regex, "a\nb", 3, 0, 3, &regs) != -1)
+ return 1;
+
+ /* This regular expression is from Spencer ere test number 75
+ in grep-2.3. */
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+ memset (&regex, 0, sizeof regex);
+ for (i = 0; i <= UCHAR_MAX; i++)
+ folded_chars[i] = i;
+ regex.translate = folded_chars;
+ s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, &regex);
+ /* This should fail with _Invalid character class name_ error. */
+ if (!s)
+ return 1;
+
+ /* Ensure that [b-a] is diagnosed as invalid. */
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("a[b-a]", 6, &regex);
+ if (s == 0)
+ return 1;
+
+ /* This should succeed, but does not for glibc-2.1.3. */
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("{1", 2, &regex);
+
+ if (s)
+ return 1;
+
+ /* The following example is derived from a problem report
+ against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("[an\371]*n", 7, &regex);
+ if (s)
+ return 1;
+
+ /* This should match, but does not for glibc-2.2.1. */
+ if (re_match (&regex, "an", 2, 0, &regs) != 2)
+ return 1;
+
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("x", 1, &regex);
+ if (s)
+ return 1;
+
+ /* glibc-2.2.93 does not work with a negative RANGE argument. */
+ if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
+ return 1;
+
+ /* The version of regex.c in older versions of gnulib
+ ignored RE_ICASE. Detect that problem too. */
+ re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("x", 1, &regex);
+ if (s)
+ return 1;
+
+ if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0)
+ return 1;
+
+ /* Catch a bug reported by Vin Shelton in
+ http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html
+ */
+ re_set_syntax (RE_SYNTAX_POSIX_BASIC
+ & ~RE_CONTEXT_INVALID_DUP
+ & ~RE_NO_EMPTY_RANGES);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, &regex);
+ if (s)
+ return 1;
+
+ /* REG_STARTEND was added to glibc on 2004-01-15.
+ Reject older versions. */
+ if (! REG_STARTEND)
+ return 1;
+
+ /* Reject hosts whose regoff_t values are too narrow.
+ These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t
+ and 32-bit int. */
+ if (sizeof (regoff_t) < sizeof (ptrdiff_t)
+ || sizeof (regoff_t) < sizeof (ssize_t))
+ return 1;
+
+ return 0;]])],
+ [gl_cv_func_re_compile_pattern_working=yes],
+ [gl_cv_func_re_compile_pattern_working=no],
+ dnl When crosscompiling, assume it is not working.
+ [gl_cv_func_re_compile_pattern_working=no])])
+ case $gl_cv_func_re_compile_pattern_working in #(
+ yes) ac_use_included_regex=no;; #(
+ no) ac_use_included_regex=yes;;
+ esac
+ ;;
+ *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex])
+ ;;
+ esac
+
+ if test $ac_use_included_regex = yes; then
+ AC_DEFINE([_REGEX_LARGE_OFFSETS], [1],
+ [Define if you want regoff_t to be at least as wide POSIX requires.])
+ AC_DEFINE([re_syntax_options], [rpl_re_syntax_options],
+ [Define to rpl_re_syntax_options if the replacement should be used.])
+ AC_DEFINE([re_set_syntax], [rpl_re_set_syntax],
+ [Define to rpl_re_set_syntax if the replacement should be used.])
+ AC_DEFINE([re_compile_pattern], [rpl_re_compile_pattern],
+ [Define to rpl_re_compile_pattern if the replacement should be used.])
+ AC_DEFINE([re_compile_fastmap], [rpl_re_compile_fastmap],
+ [Define to rpl_re_compile_fastmap if the replacement should be used.])
+ AC_DEFINE([re_search], [rpl_re_search],
+ [Define to rpl_re_search if the replacement should be used.])
+ AC_DEFINE([re_search_2], [rpl_re_search_2],
+ [Define to rpl_re_search_2 if the replacement should be used.])
+ AC_DEFINE([re_match], [rpl_re_match],
+ [Define to rpl_re_match if the replacement should be used.])
+ AC_DEFINE([re_match_2], [rpl_re_match_2],
+ [Define to rpl_re_match_2 if the replacement should be used.])
+ AC_DEFINE([re_set_registers], [rpl_re_set_registers],
+ [Define to rpl_re_set_registers if the replacement should be used.])
+ AC_DEFINE([re_comp], [rpl_re_comp],
+ [Define to rpl_re_comp if the replacement should be used.])
+ AC_DEFINE([re_exec], [rpl_re_exec],
+ [Define to rpl_re_exec if the replacement should be used.])
+ AC_DEFINE([regcomp], [rpl_regcomp],
+ [Define to rpl_regcomp if the replacement should be used.])
+ AC_DEFINE([regexec], [rpl_regexec],
+ [Define to rpl_regexec if the replacement should be used.])
+ AC_DEFINE([regerror], [rpl_regerror],
+ [Define to rpl_regerror if the replacement should be used.])
+ AC_DEFINE([regfree], [rpl_regfree],
+ [Define to rpl_regfree if the replacement should be used.])
+ AC_LIBOBJ([regex])
+ gl_PREREQ_REGEX
+ fi
+])
+
+# Prerequisites of lib/regex.c and lib/regex_internal.c.
+AC_DEFUN([gl_PREREQ_REGEX],
+[
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ AC_CHECK_HEADERS([libintl.h])
+ AC_CHECK_FUNCS_ONCE([isblank iswctype wcscoll])
+ AC_CHECK_DECLS([isblank], [], [], [#include <ctype.h>])
+])
diff --git a/gnulib/m4/relocatable-lib.m4 b/gnulib/m4/relocatable-lib.m4
new file mode 100644
index 00000000..c1923786
--- /dev/null
+++ b/gnulib/m4/relocatable-lib.m4
@@ -0,0 +1,58 @@
+# relocatable-lib.m4 serial 5
+dnl Copyright (C) 2003, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Support for relocatable libraries.
+AC_DEFUN([gl_RELOCATABLE_LIBRARY],
+[
+ AC_REQUIRE([gl_RELOCATABLE_LIBRARY_BODY])
+ if test $RELOCATABLE = yes; then
+ AC_LIBOBJ([relocatable])
+ fi
+])
+AC_DEFUN([gl_RELOCATABLE_LIBRARY_BODY],
+[
+ AC_REQUIRE([gl_RELOCATABLE_NOP])
+ dnl Easier to put this here once, instead of into the DEFS of each Makefile.
+ if test "X$prefix" = "XNONE"; then
+ reloc_final_prefix="$ac_default_prefix"
+ else
+ reloc_final_prefix="$prefix"
+ fi
+ AC_DEFINE_UNQUOTED([INSTALLPREFIX], ["${reloc_final_prefix}"],
+ [Define to the value of ${prefix}, as a string.])
+ if test $RELOCATABLE = yes; then
+ AC_DEFINE([ENABLE_RELOCATABLE], [1],
+ [Define to 1 if the package shall run at any location in the file
+ system.])
+ fi
+])
+
+dnl Like gl_RELOCATABLE_LIBRARY, except prepare for separate compilation
+dnl (no AC_LIBOBJ).
+AC_DEFUN([gl_RELOCATABLE_LIBRARY_SEPARATE],
+[
+ AC_REQUIRE([gl_RELOCATABLE_LIBRARY_BODY])
+])
+
+dnl Support for relocatable packages for which it is a nop.
+AC_DEFUN([gl_RELOCATABLE_NOP],
+[
+ AC_MSG_CHECKING([whether to activate relocatable installation])
+ AC_ARG_ENABLE([relocatable],
+ [AS_HELP_STRING([--enable-relocatable],
+ [install a package that can be moved in the file system])],
+ [if test "$enableval" != no; then
+ RELOCATABLE=yes
+ else
+ RELOCATABLE=no
+ fi
+ ], RELOCATABLE=no)
+ AC_SUBST([RELOCATABLE])
+ AC_MSG_RESULT([$RELOCATABLE])
+])
+
diff --git a/gnulib/m4/relocatable.m4 b/gnulib/m4/relocatable.m4
new file mode 100644
index 00000000..d5285816
--- /dev/null
+++ b/gnulib/m4/relocatable.m4
@@ -0,0 +1,99 @@
+# relocatable.m4 serial 14
+dnl Copyright (C) 2003, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl gl_RELOCATABLE([RELOCWRAPPER-DIR])
+dnl ----------------------------------------------------------
+dnl Support for relocatable programs.
+dnl Supply RELOCWRAPPER-DIR as the directory where relocwrapper.c may be found.
+AC_DEFUN([gl_RELOCATABLE],
+[
+ AC_REQUIRE([gl_RELOCATABLE_BODY])
+ gl_RELOCATABLE_LIBRARY
+ if test $RELOCATABLE = yes; then
+ AC_LIBOBJ([progreloc])
+ fi
+ : ${RELOCATABLE_CONFIG_H_DIR='$(top_builddir)'}
+ RELOCATABLE_SRC_DIR="\$(top_srcdir)/$gl_source_base"
+ RELOCATABLE_BUILD_DIR="\$(top_builddir)/$gl_source_base"
+])
+dnl The guts of gl_RELOCATABLE. Needs to be expanded only once.
+AC_DEFUN([gl_RELOCATABLE_BODY],
+[
+ AC_REQUIRE([AC_PROG_INSTALL])
+ dnl This AC_BEFORE invocation leads to unjustified autoconf warnings
+ dnl when gl_RELOCATABLE_BODY is invoked more than once.
+ dnl We need this AC_BEFORE because AC_PROG_INSTALL is documented to
+ dnl overwrite earlier settings of INSTALL and INSTALL_PROGRAM (even
+ dnl though in autoconf-2.52..2.60 it doesn't do so), but we want this
+ dnl macro's setting of INSTALL_PROGRAM to persist.
+ AC_BEFORE([AC_PROG_INSTALL],[gl_RELOCATABLE_BODY])
+ AC_REQUIRE([AC_LIB_LIBPATH])
+ AC_REQUIRE([gl_RELOCATABLE_LIBRARY_BODY])
+ is_noop=no
+ use_elf_origin_trick=no
+ if test $RELOCATABLE = yes; then
+ # --enable-relocatable implies --disable-rpath
+ enable_rpath=no
+ AC_CHECK_HEADERS([mach-o/dyld.h])
+ AC_CHECK_FUNCS([_NSGetExecutablePath])
+ case "$host_os" in
+ mingw*) is_noop=yes ;;
+ linux*) use_elf_origin_trick=yes ;;
+ esac
+ if test $is_noop = yes; then
+ RELOCATABLE_LDFLAGS=:
+ AC_SUBST([RELOCATABLE_LDFLAGS])
+ else
+ if test $use_elf_origin_trick = yes; then
+ dnl Use the dynamic linker's support for relocatable programs.
+ case "$ac_aux_dir" in
+ /*) reloc_ldflags="$ac_aux_dir/reloc-ldflags" ;;
+ *) reloc_ldflags="\$(top_builddir)/$ac_aux_dir/reloc-ldflags" ;;
+ esac
+ RELOCATABLE_LDFLAGS="\"$reloc_ldflags\" \"\$(host)\" \"\$(RELOCATABLE_LIBRARY_PATH)\""
+ AC_SUBST([RELOCATABLE_LDFLAGS])
+ else
+ dnl Unfortunately we cannot define INSTALL_PROGRAM to a command
+ dnl consisting of more than one word - libtool doesn't support this.
+ dnl So we abuse the INSTALL_PROGRAM_ENV hook, originally meant for the
+ dnl 'install-strip' target.
+ INSTALL_PROGRAM_ENV="RELOC_LIBRARY_PATH_VAR=\"$shlibpath_var\" RELOC_LIBRARY_PATH_VALUE=\"\$(RELOCATABLE_LIBRARY_PATH)\" RELOC_PREFIX=\"\$(prefix)\" RELOC_DESTDIR=\"\$(DESTDIR)\" RELOC_COMPILE_COMMAND=\"\$(CC) \$(CPPFLAGS) \$(CFLAGS) \$(LDFLAGS)\" RELOC_SRCDIR=\"\$(RELOCATABLE_SRC_DIR)\" RELOC_BUILDDIR=\"\$(RELOCATABLE_BUILD_DIR)\" RELOC_CONFIG_H_DIR=\"\$(RELOCATABLE_CONFIG_H_DIR)\" RELOC_EXEEXT=\"\$(EXEEXT)\" RELOC_STRIP_PROG=\"\$(RELOCATABLE_STRIP)\" RELOC_INSTALL_PROG=\"$INSTALL_PROGRAM\""
+ AC_SUBST([INSTALL_PROGRAM_ENV])
+ case "$ac_aux_dir" in
+ /*) INSTALL_PROGRAM="$ac_aux_dir/install-reloc" ;;
+ *) INSTALL_PROGRAM="\$(top_builddir)/$ac_aux_dir/install-reloc" ;;
+ esac
+ fi
+ fi
+ fi
+ AM_CONDITIONAL([RELOCATABLE_VIA_LD],
+ [test $is_noop = yes || test $use_elf_origin_trick = yes])
+
+ dnl RELOCATABLE_LIBRARY_PATH can be set in configure.ac. Default is empty.
+ AC_SUBST([RELOCATABLE_LIBRARY_PATH])
+ AC_SUBST([RELOCATABLE_CONFIG_H_DIR])
+ AC_SUBST([RELOCATABLE_SRC_DIR])
+ AC_SUBST([RELOCATABLE_BUILD_DIR])
+])
+
+dnl Determine the platform dependent parameters needed to use relocatability:
+dnl shlibpath_var.
+AC_DEFUN([AC_LIB_LIBPATH],
+[
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library path variable], [acl_cv_libpath], [
+ LD="$LD" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.libpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_libpath=${acl_cv_shlibpath_var:-none}
+ ])
+ shlibpath_var="$acl_cv_shlibpath_var"
+])
diff --git a/gnulib/m4/remove.m4 b/gnulib/m4/remove.m4
new file mode 100644
index 00000000..c3bcd6a2
--- /dev/null
+++ b/gnulib/m4/remove.m4
@@ -0,0 +1,40 @@
+# remove.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_REMOVE],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_AC_DOS])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_RMDIR])
+ AC_REQUIRE([gl_FUNC_UNLINK])
+ if test "$gl_cv_func_rmdir_works:$gl_cv_func_unlink_works" != yes:yes; then
+ dnl If either underlying syscall is broken, then remove likely has
+ dnl the same bug; blindly use our replacement.
+ REPLACE_REMOVE=1
+ AC_LIBOBJ([remove])
+ else
+ dnl C89 requires remove(), but only POSIX requires it to handle
+ dnl directories. On mingw, directories fails with EPERM.
+ AC_CACHE_CHECK([whether remove handles directories],
+ [gl_cv_func_remove_dir_works],
+ [mkdir conftest.dir
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdio.h>
+]], [[return remove ("conftest.dir");]])],
+ [gl_cv_func_remove_dir_works=yes], [gl_cv_func_remove_dir_works=no],
+ [case $host_os in
+ mingw*) gl_cv_func_remove_dir_works="guessing no";;
+ *) gl_cv_func_remove_dir_works="guessing yes";;
+ esac])
+ rm -rf conftest.dir])
+ case $gl_cv_func_remove_dir_works in
+ *no*) REPLACE_REMOVE=1
+ AC_LIBOBJ([remove]);;
+ esac
+ fi
+])
diff --git a/gnulib/m4/rename.m4 b/gnulib/m4/rename.m4
new file mode 100644
index 00000000..41e70610
--- /dev/null
+++ b/gnulib/m4/rename.m4
@@ -0,0 +1,158 @@
+# serial 21
+
+# Copyright (C) 2001, 2003, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+dnl From Volker Borchert.
+dnl Determine whether rename works for source file names with a trailing slash.
+dnl The rename from SunOS 4.1.1_U1 doesn't.
+dnl
+dnl If it doesn't, then define RENAME_TRAILING_SLASH_BUG and arrange
+dnl to compile the wrapper function.
+dnl
+
+AC_DEFUN([gl_FUNC_RENAME],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([lstat])
+
+ dnl Solaris 10 mistakenly allows rename("file","name/").
+ dnl NetBSD 1.6 mistakenly forbids rename("dir","name/").
+ dnl FreeBSD 7.2 mistakenly allows rename("file","link-to-file/").
+ dnl The Solaris bug can be worked around without stripping
+ dnl trailing slash, while the NetBSD bug requires stripping;
+ dnl the two conditions can be distinguished by whether hard
+ dnl links are also broken.
+ AC_CACHE_CHECK([whether rename honors trailing slash on destination],
+ [gl_cv_func_rename_slash_dst_works],
+ [rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.lnk
+ touch conftest.f && mkdir conftest.d1 ||
+ AC_MSG_ERROR([cannot create temporary files])
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.f conftest.lnk
+ fi
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+# include <stdio.h>
+# include <stdlib.h>
+]], [if (rename ("conftest.f", "conftest.f1/") == 0) return 1;
+ if (rename ("conftest.d1", "conftest.d2/") != 0) return 2;
+#if HAVE_LSTAT
+ if (rename ("conftest.f", "conftest.lnk/") == 0) return 3;
+#endif
+ ])],
+ [gl_cv_func_rename_slash_dst_works=yes],
+ [gl_cv_func_rename_slash_dst_works=no],
+ dnl When crosscompiling, assume rename is broken.
+ [gl_cv_func_rename_slash_dst_works="guessing no"])
+ rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.lnk
+ ])
+ if test "x$gl_cv_func_rename_slash_dst_works" != xyes; then
+ AC_LIBOBJ([rename])
+ REPLACE_RENAME=1
+ AC_DEFINE([RENAME_TRAILING_SLASH_DEST_BUG], [1],
+ [Define if rename does not correctly handle slashes on the destination
+ argument, such as on Solaris 10 or NetBSD 1.6.])
+ fi
+
+ dnl SunOS 4.1.1_U1 mistakenly forbids rename("dir/","name").
+ dnl Solaris 9 mistakenly allows rename("file/","name").
+ dnl FreeBSD 7.2 mistakenly allows rename("link-to-file/","name").
+ dnl These bugs require stripping trailing slash to avoid corrupting
+ dnl symlinks with a trailing slash.
+ AC_CACHE_CHECK([whether rename honors trailing slash on source],
+ [gl_cv_func_rename_slash_src_works],
+ [rm -rf conftest.f conftest.d1 conftest.d2 conftest.lnk
+ touch conftest.f && mkdir conftest.d1 ||
+ AC_MSG_ERROR([cannot create temporary files])
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.f conftest.lnk
+ fi
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+# include <stdio.h>
+# include <stdlib.h>
+]], [if (rename ("conftest.f/", "conftest.d2") == 0) return 1;
+ if (rename ("conftest.d1/", "conftest.d2") != 0) return 2;
+#if HAVE_LSTAT
+ if (rename ("conftest.lnk/", "conftest.f") == 0) return 3;
+#endif
+ ])],
+ [gl_cv_func_rename_slash_src_works=yes],
+ [gl_cv_func_rename_slash_src_works=no],
+ dnl When crosscompiling, assume rename is broken.
+ [gl_cv_func_rename_slash_src_works="guessing no"])
+ rm -rf conftest.f conftest.d1 conftest.d2 conftest.lnk
+ ])
+ if test "x$gl_cv_func_rename_slash_src_works" != xyes; then
+ AC_LIBOBJ([rename])
+ REPLACE_RENAME=1
+ AC_DEFINE([RENAME_TRAILING_SLASH_SOURCE_BUG], [1],
+ [Define if rename does not correctly handle slashes on the source
+ argument, such as on Solaris 9 or cygwin 1.5.])
+ fi
+
+ dnl NetBSD 1.6 and cygwin 1.5.x mistakenly reduce hard link count
+ dnl on rename("h1","h2").
+ dnl This bug requires stat'ting targets prior to attempting rename.
+ AC_CACHE_CHECK([whether rename manages hard links correctly],
+ [gl_cv_func_rename_link_works],
+ [rm -rf conftest.f conftest.f1
+ if touch conftest.f && ln conftest.f conftest.f1 &&
+ set x `ls -i conftest.f conftest.f1` && test "$2" = "$4"; then
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+# include <stdio.h>
+# include <stdlib.h>
+# include <unistd.h>
+]], [if (rename ("conftest.f", "conftest.f1")) return 1;
+ if (unlink ("conftest.f1")) return 2;
+ if (rename ("conftest.f", "conftest.f")) return 3;
+ if (rename ("conftest.f1", "conftest.f1") == 0) return 4;])],
+ [gl_cv_func_rename_link_works=yes],
+ [gl_cv_func_rename_link_works=no],
+ dnl When crosscompiling, assume rename is broken.
+ [gl_cv_func_rename_link_works="guessing no"])
+ else
+ gl_cv_func_rename_link_works="guessing no"
+ fi
+ rm -rf conftest.f conftest.f1
+ ])
+ if test "x$gl_cv_func_rename_link_works" != xyes; then
+ AC_LIBOBJ([rename])
+ REPLACE_RENAME=1
+ AC_DEFINE([RENAME_HARD_LINK_BUG], [1],
+ [Define if rename fails to leave hard links alone, as on NetBSD 1.6
+ or Cygwin 1.5.])
+ fi
+
+ dnl Cygwin 1.5.x mistakenly allows rename("dir","file").
+ dnl mingw mistakenly forbids rename("dir1","dir2").
+ dnl These bugs require stripping trailing slash to avoid corrupting
+ dnl symlinks with a trailing slash.
+ AC_CACHE_CHECK([whether rename manages existing destinations correctly],
+ [gl_cv_func_rename_dest_works],
+ [rm -rf conftest.f conftest.d1 conftest.d2
+ touch conftest.f && mkdir conftest.d1 conftest.d2 ||
+ AC_MSG_ERROR([cannot create temporary files])
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+# include <stdio.h>
+# include <stdlib.h>
+]], [if (rename ("conftest.d1", "conftest.d2") != 0) return 1;
+ if (rename ("conftest.d2", "conftest.f") == 0) return 2;])],
+ [gl_cv_func_rename_dest_works=yes],
+ [gl_cv_func_rename_dest_works=no],
+ dnl When crosscompiling, assume rename is broken.
+ [gl_cv_func_rename_dest_works="guessing no"])
+ rm -rf conftest.f conftest.d1 conftest.d2
+ ])
+ if test "x$gl_cv_func_rename_dest_works" != xyes; then
+ AC_LIBOBJ([rename])
+ REPLACE_RENAME=1
+ AC_DEFINE([RENAME_DEST_EXISTS_BUG], [1],
+ [Define if rename does not work when the destination file exists,
+ as on Cygwin 1.5 or Windows.])
+ fi
+])
diff --git a/gnulib/m4/renameat.m4 b/gnulib/m4/renameat.m4
new file mode 100644
index 00000000..4d514a1f
--- /dev/null
+++ b/gnulib/m4/renameat.m4
@@ -0,0 +1,28 @@
+# serial 2
+# See if we need to provide renameat replacement.
+
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_RENAMEAT],
+[
+ AC_REQUIRE([gl_FUNC_OPENAT])
+ AC_REQUIRE([gl_FUNC_RENAME])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([renameat])
+ if test $ac_cv_func_renameat = no; then
+ HAVE_RENAMEAT=0
+ AC_LIBOBJ([renameat])
+ AC_LIBOBJ([at-func2])
+ elif test $REPLACE_RENAME = 1; then
+ dnl Solaris 9 and 10 have the same bugs in renameat as in rename.
+ REPLACE_RENAMEAT=1
+ AC_LIBOBJ([renameat])
+ AC_LIBOBJ([at-func2])
+ fi
+])
diff --git a/gnulib/m4/rijndael.m4 b/gnulib/m4/rijndael.m4
new file mode 100644
index 00000000..8d148742
--- /dev/null
+++ b/gnulib/m4/rijndael.m4
@@ -0,0 +1,11 @@
+# rijndael.m4 serial 2
+dnl Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_RIJNDAEL],
+[
+ AC_LIBOBJ([rijndael-alg-fst])
+ AC_LIBOBJ([rijndael-api-fst])
+])
diff --git a/gnulib/m4/rmdir-errno.m4 b/gnulib/m4/rmdir-errno.m4
new file mode 100644
index 00000000..d001a852
--- /dev/null
+++ b/gnulib/m4/rmdir-errno.m4
@@ -0,0 +1,49 @@
+# serial 10
+
+# Copyright (C) 2000-2001, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# When rmdir fails because the specified directory is not empty, it sets
+# errno to some value, usually ENOTEMPTY. However, on some AIX systems,
+# ENOTEMPTY is mistakenly defined to be EEXIST. To work around this, and
+# in general, to avoid depending on the use of any particular symbol, this
+# test runs a test to determine the actual numeric value.
+AC_DEFUN([gl_FUNC_RMDIR_NOTEMPTY],
+[dnl
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CACHE_CHECK([for rmdir-not-empty errno value],
+ gl_cv_func_rmdir_errno_not_empty,
+ [
+ # Arrange for deletion of the temporary directory this test creates.
+ ac_clean_files="$ac_clean_files confdir2"
+ mkdir confdir2; : > confdir2/file
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <errno.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+ int main ()
+ {
+ FILE *s;
+ int val;
+ rmdir ("confdir2");
+ val = errno;
+ s = fopen ("confdir2/errno", "w");
+ fprintf (s, "%d\n", val);
+ return 0;
+ }
+ ]])],
+ [gl_cv_func_rmdir_errno_not_empty=`cat confdir2/errno`],
+ [gl_cv_func_rmdir_errno_not_empty='configure error in rmdir-errno.m4'],
+ [gl_cv_func_rmdir_errno_not_empty=ENOTEMPTY]
+ )
+ ]
+ )
+
+ AC_DEFINE_UNQUOTED([RMDIR_ERRNO_NOT_EMPTY],
+ $gl_cv_func_rmdir_errno_not_empty,
+ [the value to which errno is set when rmdir fails on a nonempty directory])
+])
diff --git a/gnulib/m4/rmdir.m4 b/gnulib/m4/rmdir.m4
new file mode 100644
index 00000000..8d6bee8b
--- /dev/null
+++ b/gnulib/m4/rmdir.m4
@@ -0,0 +1,44 @@
+# rmdir.m4 serial 7
+dnl Copyright (C) 2002, 2005, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_RMDIR],
+[
+ AC_REQUIRE([gl_AC_DOS])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ dnl FIXME: simplify this module in 2010 if no one reports a missing rmdir
+ AC_REPLACE_FUNCS([rmdir])
+ if test $ac_cv_func_rmdir = no; then
+ REPLACE_RMDIR=1
+ # If someone lacks rmdir, make configure fail, and request
+ # a bug report to inform us about it.
+ if test x"$SKIP_RMDIR_CHECK" != xyes; then
+ AC_MSG_FAILURE([Your system lacks the rmdir function.
+ Please report this, along with the output of "uname -a", to the
+ bug-coreutils@gnu.org mailing list. To continue past this point,
+ rerun configure with SKIP_RMDIR_CHECK=yes.
+ E.g., ./configure SKIP_RMDIR_CHECK=yes])
+ fi
+ else
+ dnl Detect cygwin 1.5.x bug.
+ AC_CACHE_CHECK([whether rmdir works], [gl_cv_func_rmdir_works],
+ [mkdir conftest.dir
+ touch conftest.file
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdio.h>
+ #include <errno.h>
+ #include <unistd.h>
+]], [[return !rmdir ("conftest.file/") || errno != ENOTDIR
+ || !rmdir ("conftest.dir/./");]])],
+ [gl_cv_func_rmdir_works=yes], [gl_cv_func_rmdir_works=no],
+ [gl_cv_func_rmdir_works="guessing no"])
+ rm -rf conftest.dir conftest.file])
+ if test x"$gl_cv_func_rmdir_works" != xyes; then
+ REPLACE_RMDIR=1
+ AC_LIBOBJ([rmdir])
+ fi
+ fi
+])
diff --git a/gnulib/m4/round.m4 b/gnulib/m4/round.m4
new file mode 100644
index 00000000..8860e015
--- /dev/null
+++ b/gnulib/m4/round.m4
@@ -0,0 +1,72 @@
+# round.m4 serial 7
+dnl Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ROUND],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare round().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_DECLS([round], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_round" = yes; then
+ gl_CHECK_MATH_LIB([ROUND_LIBM], [x = round (x);])
+ fi
+ if test "$ac_cv_have_decl_round" = yes && test "$ROUND_LIBM" != missing; then
+ dnl Test whether round() produces correct results. On NetBSD 3.0, for
+ dnl x = 1/2 - 2^-54, the system's round() returns a wrong result.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether round works], [gl_cv_func_round_works],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $ROUND_LIBM"
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <float.h>
+#include <math.h>
+int main()
+{
+ /* 2^DBL_MANT_DIG. */
+ static const double TWO_MANT_DIG =
+ /* Assume DBL_MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (double) (1U << (DBL_MANT_DIG / 5))
+ * (double) (1U << ((DBL_MANT_DIG + 1) / 5))
+ * (double) (1U << ((DBL_MANT_DIG + 2) / 5))
+ * (double) (1U << ((DBL_MANT_DIG + 3) / 5))
+ * (double) (1U << ((DBL_MANT_DIG + 4) / 5));
+ volatile double x = 0.5 - 0.5 / TWO_MANT_DIG;
+ exit (x < 0.5 && round (x) != 0.0);
+}]])], [gl_cv_func_round_works=yes], [gl_cv_func_round_works=no],
+ [case "$host_os" in
+ netbsd*) gl_cv_func_round_works="guessing no";;
+ *) gl_cv_func_round_works="guessing yes";;
+ esac
+ ])
+ LIBS="$save_LIBS"
+ ])
+ case "$gl_cv_func_round_works" in
+ *no) ROUND_LIBM=missing ;;
+ esac
+ fi
+ if test "$ac_cv_have_decl_round" != yes || test "$ROUND_LIBM" = missing; then
+ REPLACE_ROUND=1
+ AC_LIBOBJ([round])
+ gl_FUNC_FLOOR_LIBS
+ gl_FUNC_CEIL_LIBS
+ ROUND_LIBM=
+ dnl Append $FLOOR_LIBM to ROUND_LIBM, avoiding gratuitous duplicates.
+ case " $ROUND_LIBM " in
+ *" $FLOOR_LIBM "*) ;;
+ *) ROUND_LIBM="$ROUND_LIBM $FLOOR_LIBM" ;;
+ esac
+ dnl Append $CEIL_LIBM to ROUND_LIBM, avoiding gratuitous duplicates.
+ case " $ROUND_LIBM " in
+ *" $CEIL_LIBM "*) ;;
+ *) ROUND_LIBM="$ROUND_LIBM $CEIL_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([ROUND_LIBM])
+])
diff --git a/gnulib/m4/roundf.m4 b/gnulib/m4/roundf.m4
new file mode 100644
index 00000000..b246d043
--- /dev/null
+++ b/gnulib/m4/roundf.m4
@@ -0,0 +1,81 @@
+# roundf.m4 serial 8
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ROUNDF],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare roundf().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_DECLS([roundf], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_roundf" = yes; then
+ gl_CHECK_MATH_LIB([ROUNDF_LIBM], [x = roundf (x);])
+ fi
+ if test "$ac_cv_have_decl_roundf" = yes && test "$ROUNDF_LIBM" != missing; then
+ dnl Test whether roundf() produces correct results. On mingw, for
+ dnl x = 1/2 - 2^-25, the system's roundf() returns a wrong result.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether roundf works], [gl_cv_func_roundf_works],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $ROUNDF_LIBM"
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <float.h>
+#include <math.h>
+int main()
+{
+ /* 2^FLT_MANT_DIG. */
+ static const float TWO_MANT_DIG =
+ /* Assume FLT_MANT_DIG <= 3 * 31.
+ Use the identity n = floor(n/3) + floor((n+1)/3) + floor((n+2)/3). */
+ (float) (1U << (FLT_MANT_DIG / 3))
+ * (float) (1U << ((FLT_MANT_DIG + 1) / 3))
+ * (float) (1U << ((FLT_MANT_DIG + 2) / 3));
+ volatile float x = 0.5f - 0.5f / TWO_MANT_DIG;
+ exit (x < 0.5f && roundf (x) != 0.0f);
+}]])], [gl_cv_func_roundf_works=yes], [gl_cv_func_roundf_works=no],
+ [case "$host_os" in
+ mingw*) gl_cv_func_roundf_works="guessing no";;
+ *) gl_cv_func_roundf_works="guessing yes";;
+ esac
+ ])
+ LIBS="$save_LIBS"
+ ])
+ case "$gl_cv_func_roundf_works" in
+ *no) ROUNDF_LIBM=missing ;;
+ esac
+ fi
+ if test "$ac_cv_have_decl_roundf" != yes || test "$ROUNDF_LIBM" = missing; then
+ REPLACE_ROUNDF=1
+ AC_LIBOBJ([roundf])
+ AC_CHECK_DECLS([ceilf, floorf], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_floorf" = yes \
+ && test "$ac_cv_have_decl_ceilf" = yes; then
+ gl_FUNC_FLOORF_LIBS
+ gl_FUNC_CEILF_LIBS
+ if test "$FLOORF_LIBM" != '?' && test "$CEILF_LIBM" != '?'; then
+ AC_DEFINE([HAVE_FLOORF_AND_CEILF], [1],
+ [Define if the both the floorf() and ceilf() functions exist.])
+ ROUNDF_LIBM=
+ dnl Append $FLOORF_LIBM to ROUNDF_LIBM, avoiding gratuitous duplicates.
+ case " $ROUNDF_LIBM " in
+ *" $FLOORF_LIBM "*) ;;
+ *) ROUNDF_LIBM="$ROUNDF_LIBM $FLOORF_LIBM" ;;
+ esac
+ dnl Append $CEILF_LIBM to ROUNDF_LIBM, avoiding gratuitous duplicates.
+ case " $ROUNDF_LIBM " in
+ *" $CEILF_LIBM "*) ;;
+ *) ROUNDF_LIBM="$ROUNDF_LIBM $CEILF_LIBM" ;;
+ esac
+ else
+ ROUNDF_LIBM=
+ fi
+ else
+ ROUNDF_LIBM=
+ fi
+ fi
+ AC_SUBST([ROUNDF_LIBM])
+])
diff --git a/gnulib/m4/roundl.m4 b/gnulib/m4/roundl.m4
new file mode 100644
index 00000000..3011c378
--- /dev/null
+++ b/gnulib/m4/roundl.m4
@@ -0,0 +1,46 @@
+# roundl.m4 serial 6
+dnl Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ROUNDL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare roundl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_DECLS([roundl], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_roundl" = yes; then
+ gl_CHECK_MATH_LIB([ROUNDL_LIBM], [x = roundl (x);])
+ fi
+ if test "$ac_cv_have_decl_roundl" != yes || test "$ROUNDL_LIBM" = missing; then
+ REPLACE_ROUNDL=1
+ AC_LIBOBJ([roundl])
+ AC_CHECK_DECLS([ceill, floorl], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_floorl" = yes \
+ && test "$ac_cv_have_decl_ceill" = yes; then
+ gl_FUNC_FLOORL_LIBS
+ gl_FUNC_CEILL_LIBS
+ if test "$FLOORL_LIBM" != '?' && test "$CEILL_LIBM" != '?'; then
+ AC_DEFINE([HAVE_FLOORL_AND_CEILL], [1],
+ [Define if the both the floorl() and ceill() functions exist.])
+ ROUNDL_LIBM=
+ dnl Append $FLOORL_LIBM to ROUNDL_LIBM, avoiding gratuitous duplicates.
+ case " $ROUNDL_LIBM " in
+ *" $FLOORL_LIBM "*) ;;
+ *) ROUNDL_LIBM="$ROUNDL_LIBM $FLOORL_LIBM" ;;
+ esac
+ dnl Append $CEILL_LIBM to ROUNDL_LIBM, avoiding gratuitous duplicates.
+ case " $ROUNDL_LIBM " in
+ *" $CEILL_LIBM "*) ;;
+ *) ROUNDL_LIBM="$ROUNDL_LIBM $CEILL_LIBM" ;;
+ esac
+ else
+ ROUNDL_LIBM=
+ fi
+ else
+ ROUNDL_LIBM=
+ fi
+ fi
+ AC_SUBST([ROUNDL_LIBM])
+])
diff --git a/gnulib/m4/rpmatch.m4 b/gnulib/m4/rpmatch.m4
new file mode 100644
index 00000000..c6222ae5
--- /dev/null
+++ b/gnulib/m4/rpmatch.m4
@@ -0,0 +1,32 @@
+# rpmatch.m4 serial 9
+dnl Copyright (C) 2002-2003, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_RPMATCH],
+[
+ dnl Persuade glibc <stdlib.h> to declare rpmatch().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REPLACE_FUNCS([rpmatch])
+ if test $ac_cv_func_rpmatch = no; then
+ HAVE_RPMATCH=0
+ gl_PREREQ_RPMATCH
+ fi
+])
+
+# Prerequisites of lib/rpmatch.c.
+AC_DEFUN([gl_PREREQ_RPMATCH], [
+ AC_CACHE_CHECK([for nl_langinfo and YESEXPR], [gl_cv_langinfo_yesexpr],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <langinfo.h>]],
+ [[char* cs = nl_langinfo(YESEXPR); return !cs;]])],
+ [gl_cv_langinfo_yesexpr=yes],
+ [gl_cv_langinfo_yesexpr=no])
+ ])
+ if test $gl_cv_langinfo_yesexpr = yes; then
+ AC_DEFINE([HAVE_LANGINFO_YESEXPR], [1],
+ [Define if you have <langinfo.h> and nl_langinfo(YESEXPR).])
+ fi
+])
diff --git a/gnulib/m4/safe-alloc.m4 b/gnulib/m4/safe-alloc.m4
new file mode 100644
index 00000000..64a01e21
--- /dev/null
+++ b/gnulib/m4/safe-alloc.m4
@@ -0,0 +1,9 @@
+# safe-alloc.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+AC_DEFUN([gl_SAFE_ALLOC],
+[
+ AC_LIBOBJ([safe-alloc])
+])
diff --git a/gnulib/m4/safe-read.m4 b/gnulib/m4/safe-read.m4
new file mode 100644
index 00000000..d087bd30
--- /dev/null
+++ b/gnulib/m4/safe-read.m4
@@ -0,0 +1,19 @@
+# safe-read.m4 serial 5
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SAFE_READ],
+[
+ AC_LIBOBJ([safe-read])
+
+ gl_PREREQ_SAFE_READ
+])
+
+# Prerequisites of lib/safe-read.c.
+AC_DEFUN([gl_PREREQ_SAFE_READ],
+[
+ AC_REQUIRE([gt_TYPE_SSIZE_T])
+])
diff --git a/gnulib/m4/safe-write.m4 b/gnulib/m4/safe-write.m4
new file mode 100644
index 00000000..2ff11d27
--- /dev/null
+++ b/gnulib/m4/safe-write.m4
@@ -0,0 +1,18 @@
+# safe-write.m4 serial 3
+dnl Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SAFE_WRITE],
+[
+ AC_LIBOBJ([safe-write])
+
+ gl_PREREQ_SAFE_WRITE
+])
+
+# Prerequisites of lib/safe-write.c.
+AC_DEFUN([gl_PREREQ_SAFE_WRITE],
+[
+ gl_PREREQ_SAFE_READ
+])
diff --git a/gnulib/m4/same.m4 b/gnulib/m4/same.m4
new file mode 100644
index 00000000..73c82bb5
--- /dev/null
+++ b/gnulib/m4/same.m4
@@ -0,0 +1,15 @@
+#serial 8
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SAME],
+[
+ AC_LIBOBJ([same])
+
+ dnl Prerequisites of lib/same.c.
+ AC_REQUIRE([AC_SYS_LONG_FILE_NAMES])
+ AC_CHECK_FUNCS_ONCE([pathconf])
+])
diff --git a/gnulib/m4/save-cwd.m4 b/gnulib/m4/save-cwd.m4
new file mode 100644
index 00000000..06dd16be
--- /dev/null
+++ b/gnulib/m4/save-cwd.m4
@@ -0,0 +1,12 @@
+# serial 9
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SAVE_CWD],
+[
+ AC_LIBOBJ([save-cwd])
+ dnl Prerequisites for lib/save-cwd.c.
+ AC_CHECK_FUNCS_ONCE([fchdir])
+])
diff --git a/gnulib/m4/savedir.m4 b/gnulib/m4/savedir.m4
new file mode 100644
index 00000000..06a4c80f
--- /dev/null
+++ b/gnulib/m4/savedir.m4
@@ -0,0 +1,11 @@
+# savedir.m4 serial 9
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SAVEDIR],
+[
+ AC_LIBOBJ([savedir])
+])
diff --git a/gnulib/m4/savewd.m4 b/gnulib/m4/savewd.m4
new file mode 100644
index 00000000..8a4c0618
--- /dev/null
+++ b/gnulib/m4/savewd.m4
@@ -0,0 +1,9 @@
+# Save and restore the working directory, possibly using a child process.
+
+dnl Copyright (C) 2004, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SAVEWD],
+ [AC_REQUIRE([AC_C_INLINE])])
diff --git a/gnulib/m4/scandir.m4 b/gnulib/m4/scandir.m4
new file mode 100644
index 00000000..28196bce
--- /dev/null
+++ b/gnulib/m4/scandir.m4
@@ -0,0 +1,23 @@
+# scandir.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SCANDIR],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+ dnl Persuade glibc and Solaris <dirent.h> to declare scandir().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS([scandir])
+ if test $ac_cv_func_scandir = no; then
+ HAVE_SCANDIR=0
+ AC_LIBOBJ([scandir])
+ gl_PREREQ_SCANDIR
+ fi
+])
+
+# Prerequisites of lib/scandir.c.
+AC_DEFUN([gl_PREREQ_SCANDIR], [:])
diff --git a/gnulib/m4/sched_h.m4 b/gnulib/m4/sched_h.m4
new file mode 100644
index 00000000..b137c1ce
--- /dev/null
+++ b/gnulib/m4/sched_h.m4
@@ -0,0 +1,36 @@
+# sched_h.m4 serial 2
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN([gl_SCHED_H],
+[
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <sched.h>
+ struct sched_param a;
+ int b[] = { SCHED_FIFO, SCHED_RR, SCHED_OTHER };
+ ]])],
+ [SCHED_H=''],
+ [SCHED_H='sched.h'
+
+ gl_CHECK_NEXT_HEADERS([sched.h])
+
+ AC_CHECK_HEADERS_ONCE([sched.h])
+ if test $ac_cv_header_sched_h = yes; then
+ HAVE_SCHED_H=1
+ else
+ HAVE_SCHED_H=0
+ fi
+ AC_SUBST([HAVE_SCHED_H])
+
+ AC_CHECK_TYPE([struct sched_param],
+ [HAVE_STRUCT_SCHED_PARAM=1], [HAVE_STRUCT_SCHED_PARAM=0],
+ [#include <sched.h>])
+ AC_SUBST([HAVE_STRUCT_SCHED_PARAM])
+ ])
+ AC_SUBST([SCHED_H])
+])
diff --git a/gnulib/m4/search_h.m4 b/gnulib/m4/search_h.m4
new file mode 100644
index 00000000..d9043d91
--- /dev/null
+++ b/gnulib/m4/search_h.m4
@@ -0,0 +1,38 @@
+# search_h.m4 serial 5
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SEARCH_H],
+[
+ AC_REQUIRE([gl_SEARCH_H_DEFAULTS])
+ AC_CHECK_HEADERS_ONCE([search.h])
+ gl_CHECK_NEXT_HEADERS([search.h])
+ if test $ac_cv_header_search_h = yes; then
+ HAVE_SEARCH_H=1
+ else
+ HAVE_SEARCH_H=0
+ fi
+ AC_SUBST([HAVE_SEARCH_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <search.h>
+ ]], [tdelete tfind tsearch twalk])
+])
+
+AC_DEFUN([gl_SEARCH_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SEARCH_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SEARCH_H_DEFAULTS],
+[
+ GNULIB_TSEARCH=0; AC_SUBST([GNULIB_TSEARCH])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_TSEARCH=1; AC_SUBST([HAVE_TSEARCH])
+ REPLACE_TSEARCH=0; AC_SUBST([REPLACE_TSEARCH])
+])
diff --git a/gnulib/m4/select.m4 b/gnulib/m4/select.m4
new file mode 100644
index 00000000..da266f0b
--- /dev/null
+++ b/gnulib/m4/select.m4
@@ -0,0 +1,53 @@
+# select.m4 serial 3
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SELECT],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SELECT])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SOCKETS])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([select])
+ else
+ dnl On Interix 3.5, select(0, NULL, NULL, NULL, timeout) fails with error
+ dnl EFAULT.
+ AC_CHECK_HEADERS_ONCE([sys/select.h])
+ AC_CACHE_CHECK([whether select supports a 0 argument],
+ [gl_cv_func_select_supports0],
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/time.h>
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+int main ()
+{
+ struct timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 5;
+ return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0;
+}]])], [gl_cv_func_select_supports0=yes], [gl_cv_func_select_supports0=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Interix.
+ interix*) gl_cv_func_select_supports0="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_select_supports0="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+ case "$gl_cv_func_select_supports0" in
+ *yes) ;;
+ *)
+ REPLACE_SELECT=1
+ AC_LIBOBJ([select])
+ ;;
+ esac
+ fi
+])
diff --git a/gnulib/m4/selinux-context-h.m4 b/gnulib/m4/selinux-context-h.m4
new file mode 100644
index 00000000..234b4e55
--- /dev/null
+++ b/gnulib/m4/selinux-context-h.m4
@@ -0,0 +1,16 @@
+# serial 1 -*- Autoconf -*-
+# Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# From Jim Meyering
+# Provide <selinux/context.h>, if necessary.
+
+AC_DEFUN([gl_HEADERS_SELINUX_CONTEXT_H],
+[
+ AC_CHECK_HEADERS([selinux/context.h],
+ [SELINUX_CONTEXT_H=],
+ [SELINUX_CONTEXT_H=selinux/context.h])
+ AC_SUBST([SELINUX_CONTEXT_H])
+])
diff --git a/gnulib/m4/selinux-selinux-h.m4 b/gnulib/m4/selinux-selinux-h.m4
new file mode 100644
index 00000000..35d2dbed
--- /dev/null
+++ b/gnulib/m4/selinux-selinux-h.m4
@@ -0,0 +1,57 @@
+# serial 3 -*- Autoconf -*-
+# Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# From Jim Meyering
+# Provide <selinux/selinux.h>, if necessary.
+# If it is already present, provide wrapper functions to guard against
+# misbehavior from getfilecon, lgetfilecon, and fgetfilecon.
+
+AC_DEFUN([gl_HEADERS_SELINUX_SELINUX_H],
+[
+ AC_REQUIRE([gl_LIBSELINUX])
+ AC_CHECK_HEADERS([selinux/selinux.h])
+
+ if test "$ac_cv_header_selinux_selinux_h" = yes; then
+ # We do have <selinux/selinux.h>, so do compile getfilecon.c
+ # and arrange to use its wrappers.
+ AC_LIBOBJ([getfilecon])
+ gl_CHECK_NEXT_HEADERS([selinux/selinux.h])
+ AC_DEFINE([getfilecon], [rpl_getfilecon],
+ [Always use our getfilecon wrapper.])
+ AC_DEFINE([lgetfilecon], [rpl_lgetfilecon],
+ [Always use our lgetfilecon wrapper.])
+ AC_DEFINE([fgetfilecon], [rpl_fgetfilecon],
+ [Always use our fgetfilecon wrapper.])
+ fi
+
+ case "$ac_cv_search_setfilecon:$ac_cv_header_selinux_selinux_h" in
+ no:*) # already warned
+ ;;
+ *:no)
+ AC_MSG_WARN([libselinux was found but selinux/selinux.h is missing.])
+ AC_MSG_WARN([AC_PACKAGE_NAME will be compiled without SELinux support.])
+ esac
+])
+
+AC_DEFUN([gl_LIBSELINUX],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_CANONICAL_BUILD])
+ LIB_SELINUX=
+ gl_save_LIBS=$LIBS
+ AC_SEARCH_LIBS([setfilecon], [selinux],
+ [test "$ac_cv_search_setfilecon" = "none required" ||
+ LIB_SELINUX=$ac_cv_search_setfilecon])
+ AC_SUBST([LIB_SELINUX])
+ LIBS=$gl_save_LIBS
+
+ # Warn if SELinux is found but libselinux is absent;
+ if test "$ac_cv_search_setfilecon" = no &&
+ test "$host" = "$build" && test -d /selinux; then
+ AC_MSG_WARN([This system supports SELinux but libselinux is missing.])
+ AC_MSG_WARN([AC_PACKAGE_NAME will be compiled without SELinux support.])
+ fi
+])
diff --git a/gnulib/m4/servent.m4 b/gnulib/m4/servent.m4
new file mode 100644
index 00000000..2ed961a4
--- /dev/null
+++ b/gnulib/m4/servent.m4
@@ -0,0 +1,47 @@
+# servent.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SERVENT],
+[
+ dnl Where are getservent(), setservent(), endservent(), getservbyname(),
+ dnl getservbyport() defined?
+ dnl Where are getprotoent(), setprotoent(), endprotoent(), getprotobyname(),
+ dnl getprotobynumber() defined?
+ dnl - On Solaris, they are in libsocket. Ignore libxnet.
+ dnl - On Haiku, they are in libnetwork.
+ dnl - On BeOS, they are in libnet.
+ dnl - On native Windows, they are in ws2_32.dll.
+ dnl - Otherwise they are in libc.
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ SERVENT_LIB=
+ gl_saved_libs="$LIBS"
+ AC_SEARCH_LIBS([getservbyname], [socket network net],
+ [if test "$ac_cv_search_getservbyname" != "none required"; then
+ SERVENT_LIB="$ac_cv_search_getservbyname"
+ fi])
+ LIBS="$gl_saved_libs"
+ if test -z "$SERVENT_LIB"; then
+ AC_CHECK_FUNCS([getservbyname], , [
+ AC_CACHE_CHECK([for getservbyname in winsock2.h and -lws2_32],
+ [gl_cv_w32_getservbyname],
+ [gl_cv_w32_getservbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_TRY_LINK([
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+], [getservbyname(NULL,NULL);], [gl_cv_w32_getservbyname=yes])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_w32_getservbyname" = "yes"; then
+ SERVENT_LIB="-lws2_32"
+ fi
+ ])
+ fi
+ AC_SUBST([SERVENT_LIB])
+])
diff --git a/gnulib/m4/setenv.m4 b/gnulib/m4/setenv.m4
new file mode 100644
index 00000000..ae4dd863
--- /dev/null
+++ b/gnulib/m4/setenv.m4
@@ -0,0 +1,110 @@
+# setenv.m4 serial 15
+dnl Copyright (C) 2001-2004, 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SETENV],
+[
+ AC_REQUIRE([gl_FUNC_SETENV_SEPARATE])
+ if test $HAVE_SETENV$REPLACE_SETENV != 10; then
+ AC_LIBOBJ([setenv])
+ fi
+])
+
+# Like gl_FUNC_SETENV, except prepare for separate compilation (no AC_LIBOBJ).
+AC_DEFUN([gl_FUNC_SETENV_SEPARATE],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([setenv])
+ if test $ac_cv_func_setenv = no; then
+ HAVE_SETENV=0
+ else
+ AC_CACHE_CHECK([whether setenv validates arguments],
+ [gl_cv_func_setenv_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+ #include <stdlib.h>
+ #include <errno.h>
+ ]], [[
+ if (setenv ("", "", 0) != -1) return 1;
+ if (errno != EINVAL) return 2;
+ if (setenv ("a", "=", 1) != 0) return 3;
+ if (strcmp (getenv ("a"), "=") != 0) return 4;
+ ]])],
+ [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no],
+ [gl_cv_func_setenv_works="guessing no"])])
+ if test "$gl_cv_func_setenv_works" != yes; then
+ REPLACE_SETENV=1
+ AC_LIBOBJ([setenv])
+ fi
+ fi
+ gl_PREREQ_SETENV
+])
+
+AC_DEFUN([gl_FUNC_UNSETENV],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_CHECK_FUNCS([unsetenv])
+ if test $ac_cv_func_unsetenv = no; then
+ HAVE_UNSETENV=0
+ AC_LIBOBJ([unsetenv])
+ gl_PREREQ_UNSETENV
+ else
+ dnl Some BSDs return void, failing to do error checking.
+ AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret],
+ [AC_TRY_COMPILE([#include <stdlib.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+int unsetenv (const char *name);
+#else
+int unsetenv();
+#endif
+], , gt_cv_func_unsetenv_ret='int', gt_cv_func_unsetenv_ret='void')])
+ if test $gt_cv_func_unsetenv_ret = 'void'; then
+ AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void
+ instead of int.])
+ REPLACE_UNSETENV=1
+ AC_LIBOBJ([unsetenv])
+ fi
+
+ dnl Solaris 10 unsetenv does not remove all copies of a name.
+ AC_CACHE_CHECK([whether unsetenv works on duplicates],
+ [gl_cv_func_unsetenv_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+ #include <stdlib.h>
+ ]], [[
+ char entry[] = "b=2";
+ if (putenv ((char *) "a=1")) return 1;
+ if (putenv (entry)) return 2;
+ entry[0] = 'a';
+ unsetenv ("a");
+ if (getenv ("a")) return 3;
+ ]])],
+ [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
+ [gl_cv_func_unsetenv_works="guessing no"])])
+ if test "$gl_cv_func_unsetenv_works" != yes; then
+ REPLACE_UNSETENV=1
+ AC_LIBOBJ([unsetenv])
+ fi
+ fi
+])
+
+# Prerequisites of lib/setenv.c.
+AC_DEFUN([gl_PREREQ_SETENV],
+[
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ AC_REQUIRE([gl_ENVIRON])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CHECK_HEADERS([search.h])
+ AC_CHECK_FUNCS([tsearch])
+])
+
+# Prerequisites of lib/unsetenv.c.
+AC_DEFUN([gl_PREREQ_UNSETENV],
+[
+ AC_REQUIRE([gl_ENVIRON])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+])
diff --git a/gnulib/m4/settime.m4 b/gnulib/m4/settime.m4
new file mode 100644
index 00000000..283bec6e
--- /dev/null
+++ b/gnulib/m4/settime.m4
@@ -0,0 +1,15 @@
+# settime.m4 serial 6
+dnl Copyright (C) 2002, 2004-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SETTIME],
+[
+ AC_LIBOBJ([settime])
+
+ dnl Prerequisites of lib/settime.c.
+ AC_REQUIRE([gl_CLOCK_TIME])
+ AC_REQUIRE([gl_TIMESPEC])
+ AC_CHECK_FUNCS_ONCE([settimeofday stime])
+])
diff --git a/gnulib/m4/sha1.m4 b/gnulib/m4/sha1.m4
new file mode 100644
index 00000000..0d18d857
--- /dev/null
+++ b/gnulib/m4/sha1.m4
@@ -0,0 +1,16 @@
+# sha1.m4 serial 9
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SHA1],
+[
+ AC_LIBOBJ([sha1])
+
+ dnl Prerequisites of lib/sha1.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
diff --git a/gnulib/m4/sha256.m4 b/gnulib/m4/sha256.m4
new file mode 100644
index 00000000..02a0dafb
--- /dev/null
+++ b/gnulib/m4/sha256.m4
@@ -0,0 +1,14 @@
+# sha256.m4 serial 4
+dnl Copyright (C) 2005, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SHA256],
+[
+ AC_LIBOBJ([sha256])
+
+ dnl Prerequisites of lib/sha256.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/sha512.m4 b/gnulib/m4/sha512.m4
new file mode 100644
index 00000000..48e10d12
--- /dev/null
+++ b/gnulib/m4/sha512.m4
@@ -0,0 +1,14 @@
+# sha512.m4 serial 5
+dnl Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SHA512],
+[
+ AC_LIBOBJ([sha512])
+
+ dnl Prerequisites of lib/sha512.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/sig2str.m4 b/gnulib/m4/sig2str.m4
new file mode 100644
index 00000000..04989288
--- /dev/null
+++ b/gnulib/m4/sig2str.m4
@@ -0,0 +1,19 @@
+# serial 6
+dnl Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SIG2STR],
+[
+
+ AC_REPLACE_FUNCS([sig2str])
+ if test $ac_cv_func_sig2str = no; then
+ gl_PREREQ_SIG2STR
+ fi
+])
+
+# Prerequisites of lib/sig2str.c.
+AC_DEFUN([gl_PREREQ_SIG2STR], [
+ :
+])
diff --git a/gnulib/m4/sig_atomic_t.m4 b/gnulib/m4/sig_atomic_t.m4
new file mode 100644
index 00000000..d50e427c
--- /dev/null
+++ b/gnulib/m4/sig_atomic_t.m4
@@ -0,0 +1,14 @@
+# sig_atomic_t.m4 serial 2
+dnl Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gt_TYPE_SIG_ATOMIC_T],
+[
+ AC_CHECK_TYPES([sig_atomic_t], ,
+ [AC_DEFINE([sig_atomic_t], [int],
+ [Define as an integer type suitable for memory locations that can be
+ accessed atomically even in the presence of asynchnonous signals.])],
+ [#include <signal.h>])
+])
diff --git a/gnulib/m4/sigaction.m4 b/gnulib/m4/sigaction.m4
new file mode 100644
index 00000000..8f0d450c
--- /dev/null
+++ b/gnulib/m4/sigaction.m4
@@ -0,0 +1,45 @@
+# sigaction.m4 serial 5
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Determine if sigaction interface is present.
+AC_DEFUN([gl_SIGACTION],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([sigaction])
+ if test $ac_cv_func_sigaction = yes; then
+ AC_CHECK_MEMBERS([struct sigaction.sa_sigaction], , ,
+ [[#include <signal.h>]])
+ if test $ac_cv_member_struct_sigaction_sa_sigaction = no; then
+ HAVE_STRUCT_SIGACTION_SA_SIGACTION=0
+ fi
+ else
+ HAVE_SIGACTION=0
+ AC_LIBOBJ([sigaction])
+ gl_PREREQ_SIGACTION
+ fi
+])
+
+# Prerequisites of the part of lib/signal.in.h and of lib/sigaction.c.
+AC_DEFUN([gl_PREREQ_SIGACTION],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([AC_TYPE_UID_T])
+ AC_REQUIRE([gl_PREREQ_SIG_HANDLER_H])
+ AC_CHECK_FUNCS_ONCE([sigaltstack siginterrupt])
+ AC_CHECK_TYPES([siginfo_t], [], [], [[
+#include <signal.h>
+ ]])
+ if test $ac_cv_type_siginfo_t = no; then
+ HAVE_SIGINFO_T=0
+ fi
+])
+
+# Prerequisites of lib/sig-handler.h.
+AC_DEFUN([gl_PREREQ_SIG_HANDLER_H],
+[
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/signal_h.m4 b/gnulib/m4/signal_h.m4
new file mode 100644
index 00000000..7f61e0b4
--- /dev/null
+++ b/gnulib/m4/signal_h.m4
@@ -0,0 +1,47 @@
+# signal_h.m4 serial 9
+dnl Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SIGNAL_H],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([signal.h])
+# AIX declares sig_atomic_t to already include volatile, and C89 compilers
+# then choke on 'volatile sig_atomic_t'. C99 requires that it compile.
+ AC_CHECK_TYPE([volatile sig_atomic_t], [],
+ [HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0], [[
+#include <signal.h>
+ ]])
+ AC_REQUIRE([AC_TYPE_UID_T])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <signal.h>
+ ]], [sigaction sigaddset sigdelset sigemptyset sigfillset sigismember
+ sigpending sigprocmask])
+])
+
+AC_DEFUN([gl_SIGNAL_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SIGNAL_H_DEFAULTS],
+[
+ GNULIB_SIGNAL_H_SIGPIPE=0; AC_SUBST([GNULIB_SIGNAL_H_SIGPIPE])
+ GNULIB_SIGPROCMASK=0; AC_SUBST([GNULIB_SIGPROCMASK])
+ GNULIB_SIGACTION=0; AC_SUBST([GNULIB_SIGACTION])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_POSIX_SIGNALBLOCKING=1; AC_SUBST([HAVE_POSIX_SIGNALBLOCKING])
+ HAVE_SIGSET_T=1; AC_SUBST([HAVE_SIGSET_T])
+ HAVE_SIGINFO_T=1; AC_SUBST([HAVE_SIGINFO_T])
+ HAVE_SIGACTION=1; AC_SUBST([HAVE_SIGACTION])
+ HAVE_STRUCT_SIGACTION_SA_SIGACTION=1;
+ AC_SUBST([HAVE_STRUCT_SIGACTION_SA_SIGACTION])
+ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1;
+ AC_SUBST([HAVE_TYPE_VOLATILE_SIG_ATOMIC_T])
+])
diff --git a/gnulib/m4/signalblocking.m4 b/gnulib/m4/signalblocking.m4
new file mode 100644
index 00000000..4459815a
--- /dev/null
+++ b/gnulib/m4/signalblocking.m4
@@ -0,0 +1,42 @@
+# signalblocking.m4 serial 10
+dnl Copyright (C) 2001-2002, 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Determine available signal blocking primitives. Three different APIs exist:
+# 1) POSIX: sigemptyset, sigaddset, sigprocmask
+# 2) SYSV: sighold, sigrelse
+# 3) BSD: sigblock, sigsetmask
+# For simplicity, here we check only for the POSIX signal blocking.
+AC_DEFUN([gl_SIGNALBLOCKING],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ signals_not_posix=
+ AC_EGREP_HEADER([sigset_t], [signal.h], , [signals_not_posix=1])
+ if test -z "$signals_not_posix"; then
+ AC_CHECK_FUNC([sigprocmask], [gl_cv_func_sigprocmask=1])
+ fi
+ if test -z "$gl_cv_func_sigprocmask"; then
+ HAVE_POSIX_SIGNALBLOCKING=0
+ AC_LIBOBJ([sigprocmask])
+ gl_PREREQ_SIGPROCMASK
+ fi
+])
+
+# Prerequisites of the part of lib/signal.in.h and of lib/sigprocmask.c.
+AC_DEFUN([gl_PREREQ_SIGPROCMASK],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_CHECK_TYPES([sigset_t],
+ [gl_cv_type_sigset_t=yes], [gl_cv_type_sigset_t=no],
+ [#include <signal.h>
+/* Mingw defines sigset_t not in <signal.h>, but in <sys/types.h>. */
+#include <sys/types.h>])
+ if test $gl_cv_type_sigset_t != yes; then
+ HAVE_SIGSET_T=0
+ fi
+ dnl HAVE_SIGSET_T is 1 if the system lacks the sigprocmask function but has
+ dnl the sigset_t type.
+ AC_SUBST([HAVE_SIGSET_T])
+])
diff --git a/gnulib/m4/signbit.m4 b/gnulib/m4/signbit.m4
new file mode 100644
index 00000000..56ff825f
--- /dev/null
+++ b/gnulib/m4/signbit.m4
@@ -0,0 +1,287 @@
+# signbit.m4 serial 6
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SIGNBIT],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_CACHE_CHECK([for signbit macro], [gl_cv_func_signbit],
+ [
+ AC_TRY_RUN([
+#include <math.h>
+/* If signbit is defined as a function, don't use it, since calling it for
+ 'float' or 'long double' arguments would involve conversions.
+ If signbit is not declared at all but exists as a library function, don't
+ use it, since the prototype may not match.
+ If signbit is not declared at all but exists as a compiler built-in, don't
+ use it, since it's preferable to use __builtin_signbit* (no warnings,
+ no conversions). */
+#ifndef signbit
+# error "signbit should be a macro"
+#endif
+#include <string.h>
+]gl_SIGNBIT_TEST_PROGRAM
+, [gl_cv_func_signbit=yes], [gl_cv_func_signbit=no],
+ [gl_cv_func_signbit="guessing no"])
+ ])
+ dnl GCC 4.0 and newer provides three built-ins for signbit.
+ dnl They can be used without warnings, also in C++, regardless of <math.h>.
+ dnl But they may expand to calls to functions, which may or may not be in
+ dnl libc.
+ AC_CACHE_CHECK([for signbit compiler built-ins], [gl_cv_func_signbit_gcc],
+ [
+ AC_TRY_RUN([
+#if __GNUC__ >= 4
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
+ __builtin_signbitf (x))
+#else
+# error "signbit should be three compiler built-ins"
+#endif
+#include <string.h>
+]gl_SIGNBIT_TEST_PROGRAM
+, [gl_cv_func_signbit_gcc=yes], [gl_cv_func_signbit_gcc=no],
+ [gl_cv_func_signbit_gcc="guessing no"])
+ ])
+ dnl Use the compiler built-ins whenever possible, because they are more
+ dnl efficient than the system library functions (if they exist).
+ if test "$gl_cv_func_signbit_gcc" = yes; then
+ REPLACE_SIGNBIT_USING_GCC=1
+ else
+ if test "$gl_cv_func_signbit" != yes; then
+ REPLACE_SIGNBIT=1
+ AC_LIBOBJ([signbitf])
+ AC_LIBOBJ([signbitd])
+ AC_LIBOBJ([signbitl])
+ gl_FLOAT_SIGN_LOCATION
+ gl_DOUBLE_SIGN_LOCATION
+ gl_LONG_DOUBLE_SIGN_LOCATION
+ if test "$gl_cv_cc_float_signbit" = unknown; then
+ dnl Test whether copysignf() is declared.
+ AC_CHECK_DECLS([copysignf], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_copysignf" = yes; then
+ dnl Test whether copysignf() can be used without libm.
+ AC_CACHE_CHECK([whether copysignf can be used without linking with libm],
+ [gl_cv_func_copysignf_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ float x, y;],
+ [return copysignf (x, y) < 0;],
+ [gl_cv_func_copysignf_no_libm=yes],
+ [gl_cv_func_copysignf_no_libm=no])
+ ])
+ if test $gl_cv_func_copysignf_no_libm = yes; then
+ AC_DEFINE([HAVE_COPYSIGNF_IN_LIBC], [1],
+ [Define if the copysignf function is declared in <math.h> and available in libc.])
+ fi
+ fi
+ fi
+ if test "$gl_cv_cc_double_signbit" = unknown; then
+ dnl Test whether copysign() is declared.
+ AC_CHECK_DECLS([copysign], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_copysign" = yes; then
+ dnl Test whether copysign() can be used without libm.
+ AC_CACHE_CHECK([whether copysign can be used without linking with libm],
+ [gl_cv_func_copysign_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ double x, y;],
+ [return copysign (x, y) < 0;],
+ [gl_cv_func_copysign_no_libm=yes],
+ [gl_cv_func_copysign_no_libm=no])
+ ])
+ if test $gl_cv_func_copysign_no_libm = yes; then
+ AC_DEFINE([HAVE_COPYSIGN_IN_LIBC], [1],
+ [Define if the copysign function is declared in <math.h> and available in libc.])
+ fi
+ fi
+ fi
+ if test "$gl_cv_cc_long_double_signbit" = unknown; then
+ dnl Test whether copysignl() is declared.
+ AC_CHECK_DECLS([copysignl], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_copysignl" = yes; then
+ dnl Test whether copysignl() can be used without libm.
+ AC_CACHE_CHECK([whether copysignl can be used without linking with libm],
+ [gl_cv_func_copysignl_no_libm],
+ [
+ AC_TRY_LINK([#include <math.h>
+ long double x, y;],
+ [return copysignl (x, y) < 0;],
+ [gl_cv_func_copysignl_no_libm=yes],
+ [gl_cv_func_copysignl_no_libm=no])
+ ])
+ if test $gl_cv_func_copysignl_no_libm = yes; then
+ AC_DEFINE([HAVE_COPYSIGNL_IN_LIBC], [1],
+ [Define if the copysignl function is declared in <math.h> and available in libc.])
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+AC_DEFUN([gl_SIGNBIT_TEST_PROGRAM], [[
+/* Global variables.
+ Needed because GCC 4 constant-folds __builtin_signbitl (literal)
+ but cannot constant-fold __builtin_signbitl (variable). */
+float vf;
+double vd;
+long double vl;
+int main ()
+{
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -p0f and -p0d instead. */
+float p0f = 0.0f;
+float m0f = -p0f;
+double p0d = 0.0;
+double m0d = -p0d;
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use another constant expression instead.
+ But that expression does not work on other platforms, such as when
+ cross-compiling to PowerPC on MacOS X 10.5. */
+long double p0l = 0.0L;
+#if defined __hpux || defined __sgi
+long double m0l = -LDBL_MIN * LDBL_MIN;
+#else
+long double m0l = -p0l;
+#endif
+ if (signbit (vf))
+ vf++;
+ {
+ float plus_inf = 1.0f / p0f;
+ float minus_inf = -1.0f / p0f;
+ if (!(!signbit (255.0f)
+ && signbit (-255.0f)
+ && !signbit (p0f)
+ && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ return 1;
+ }
+ if (signbit (vd))
+ vd++;
+ {
+ double plus_inf = 1.0 / p0d;
+ double minus_inf = -1.0 / p0d;
+ if (!(!signbit (255.0)
+ && signbit (-255.0)
+ && !signbit (p0d)
+ && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ return 1;
+ }
+ if (signbit (vl))
+ vl++;
+ {
+ long double plus_inf = 1.0L / p0l;
+ long double minus_inf = -1.0L / p0l;
+ if (!(!signbit (255.0L)
+ && signbit (-255.0L)
+ && !signbit (p0l)
+ && (memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l))
+ && !signbit (plus_inf)
+ && signbit (minus_inf)))
+ return 1;
+ }
+ return 0;
+}
+]])
+
+AC_DEFUN([gl_FLOAT_SIGN_LOCATION],
+[
+ gl_FLOATTYPE_SIGN_LOCATION([float], [gl_cv_cc_float_signbit], [f], [FLT])
+])
+
+AC_DEFUN([gl_DOUBLE_SIGN_LOCATION],
+[
+ gl_FLOATTYPE_SIGN_LOCATION([double], [gl_cv_cc_double_signbit], [], [DBL])
+])
+
+AC_DEFUN([gl_LONG_DOUBLE_SIGN_LOCATION],
+[
+ gl_FLOATTYPE_SIGN_LOCATION([long double], [gl_cv_cc_long_double_signbit], [L], [LDBL])
+])
+
+AC_DEFUN([gl_FLOATTYPE_SIGN_LOCATION],
+[
+ AC_CACHE_CHECK([where to find the sign bit in a '$1'],
+ [$2],
+ [
+ AC_TRY_RUN([
+#include <stddef.h>
+#include <stdio.h>
+#define NWORDS \
+ ((sizeof ($1) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { $1 value; unsigned int word[NWORDS]; }
+ memory_float;
+static memory_float plus = { 1.0$3 };
+static memory_float minus = { -1.0$3 };
+int main ()
+{
+ size_t j, k, i;
+ unsigned int m;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ /* Find the different bit. */
+ k = 0; m = 0;
+ for (j = 0; j < NWORDS; j++)
+ {
+ unsigned int x = plus.word[j] ^ minus.word[j];
+ if ((x & (x - 1)) || (x && m))
+ {
+ /* More than one bit difference. */
+ fprintf (fp, "unknown");
+ return 1;
+ }
+ if (x)
+ {
+ k = j;
+ m = x;
+ }
+ }
+ if (m == 0)
+ {
+ /* No difference. */
+ fprintf (fp, "unknown");
+ return 1;
+ }
+ /* Now m = plus.word[k] ^ ~minus.word[k]. */
+ if (plus.word[k] & ~minus.word[k])
+ {
+ /* Oh? The sign bit is set in the positive and cleared in the negative
+ numbers? */
+ fprintf (fp, "unknown");
+ return 1;
+ }
+ for (i = 0; ; i++)
+ if ((m >> i) & 1)
+ break;
+ fprintf (fp, "word %d bit %d", (int) k, (int) i);
+ return (fclose (fp) != 0);
+}
+ ],
+ [$2=`cat conftest.out`],
+ [$2="unknown"],
+ [
+ dnl When cross-compiling, we don't know. It depends on the
+ dnl ABI and compiler version. There are too many cases.
+ $2="unknown"
+ ])
+ rm -f conftest.out
+ ])
+ case "$]$2[" in
+ word*bit*)
+ word=`echo "$]$2[" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$]$2[" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([$4][_SIGNBIT_WORD], [$word],
+ [Define as the word index where to find the sign of '$1'.])
+ AC_DEFINE_UNQUOTED([$4][_SIGNBIT_BIT], [$bit],
+ [Define as the bit index in the word where to find the sign of '$1'.])
+ ;;
+ esac
+])
diff --git a/gnulib/m4/sigpipe.m4 b/gnulib/m4/sigpipe.m4
new file mode 100644
index 00000000..fc5d0220
--- /dev/null
+++ b/gnulib/m4/sigpipe.m4
@@ -0,0 +1,29 @@
+# sigpipe.m4 serial 2
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Tests whether SIGPIPE is provided by <signal.h>.
+dnl Sets gl_cv_header_signal_h_SIGPIPE.
+AC_DEFUN([gl_SIGNAL_SIGPIPE],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SIGNAL_SIGPIPE_BODY])
+])
+
+AC_DEFUN([gl_SIGNAL_SIGPIPE_BODY],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([for SIGPIPE], [gl_cv_header_signal_h_SIGPIPE], [
+ AC_EGREP_CPP([booboo],[
+#include <signal.h>
+#if !defined SIGPIPE
+booboo
+#endif
+ ],
+ [gl_cv_header_signal_h_SIGPIPE=no],
+ [gl_cv_header_signal_h_SIGPIPE=yes])
+ ])
+])
diff --git a/gnulib/m4/sinl.m4 b/gnulib/m4/sinl.m4
new file mode 100644
index 00000000..c9c0e5c4
--- /dev/null
+++ b/gnulib/m4/sinl.m4
@@ -0,0 +1,77 @@
+# sinl.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SINL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare sinl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ SINL_LIBM=
+ AC_CACHE_CHECK([whether sinl() can be used without linking with libm],
+ [gl_cv_func_sinl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return sinl (x) > 0.4;],
+ [gl_cv_func_sinl_no_libm=yes],
+ [gl_cv_func_sinl_no_libm=no])
+ ])
+ if test $gl_cv_func_sinl_no_libm = no; then
+ AC_CACHE_CHECK([whether sinl() can be used with libm],
+ [gl_cv_func_sinl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return sinl (x) > 0.4;],
+ [gl_cv_func_sinl_in_libm=yes],
+ [gl_cv_func_sinl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_sinl_in_libm = yes; then
+ SINL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_sinl_no_libm = yes \
+ || test $gl_cv_func_sinl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has sinl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([sinl], , [HAVE_DECL_SINL=0], [#include <math.h>])
+ else
+ HAVE_DECL_SINL=0
+ HAVE_SINL=0
+ AC_LIBOBJ([sinl])
+ AC_LIBOBJ([sincosl])
+ AC_LIBOBJ([trigl])
+ AC_REQUIRE([gl_FUNC_ISNANL])
+ AC_REQUIRE([gl_FUNC_FLOOR])
+ AC_REQUIRE([gl_FUNC_FLOORL])
+ dnl Append $ISNANL_LIBM to SINL_LIBM, avoiding gratuitous duplicates.
+ case " $SINL_LIBM " in
+ *" $ISNANL_LIBM "*) ;;
+ *) SINL_LIBM="$SINL_LIBM $ISNANL_LIBM" ;;
+ esac
+ dnl Append $FLOOR_LIBM to SINL_LIBM, avoiding gratuitous duplicates.
+ case " $SINL_LIBM " in
+ *" $FLOOR_LIBM "*) ;;
+ *) SINL_LIBM="$SINL_LIBM $FLOOR_LIBM" ;;
+ esac
+ dnl Append $FLOORL_LIBM to SINL_LIBM, avoiding gratuitous duplicates.
+ case " $SINL_LIBM " in
+ *" $FLOORL_LIBM "*) ;;
+ *) SINL_LIBM="$SINL_LIBM $FLOORL_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([SINL_LIBM])
+])
diff --git a/gnulib/m4/size_max.m4 b/gnulib/m4/size_max.m4
new file mode 100644
index 00000000..ce992db1
--- /dev/null
+++ b/gnulib/m4/size_max.m4
@@ -0,0 +1,75 @@
+# size_max.m4 serial 9
+dnl Copyright (C) 2003, 2005-2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+ AC_CHECK_HEADERS([stdint.h])
+ dnl First test whether the system already has SIZE_MAX.
+ AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [
+ gl_cv_size_max=
+ AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], [gl_cv_size_max=yes])
+ if test -z "$gl_cv_size_max"; then
+ dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+ dnl than the type 'unsigned long'. Try hard to find a definition that can
+ dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
+ AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
+ [#include <stddef.h>
+#include <limits.h>], [size_t_bits_minus_1=])
+ AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
+ [#include <stddef.h>], [fits_in_uint=])
+ if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+ if test $fits_in_uint = 1; then
+ dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+ dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+ AC_TRY_COMPILE([#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+ ], [], [fits_in_uint=0])
+ fi
+ dnl We cannot use 'expr' to simplify this expression, because 'expr'
+ dnl works only with 'long' integers in the host environment, while we
+ dnl might be cross-compiling from a 32-bit platform to a 64-bit platform.
+ if test $fits_in_uint = 1; then
+ gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ else
+ gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ fi
+ else
+ dnl Shouldn't happen, but who knows...
+ gl_cv_size_max='((size_t)~(size_t)0)'
+ fi
+ fi
+ ])
+ if test "$gl_cv_size_max" != yes; then
+ AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
+ [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+ fi
+ dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after
+ dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with
+ dnl #define by AC_DEFINE_UNQUOTED.
+ AH_VERBATIM([SIZE_MAX],
+[/* Define as the maximum value of type 'size_t', if the system doesn't define
+ it. */
+#ifndef SIZE_MAX
+# undef SIZE_MAX
+#endif])
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
diff --git a/gnulib/m4/sleep.m4 b/gnulib/m4/sleep.m4
new file mode 100644
index 00000000..a5ec6552
--- /dev/null
+++ b/gnulib/m4/sleep.m4
@@ -0,0 +1,49 @@
+# sleep.m4 serial 3
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SLEEP],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ dnl We expect to see the declaration of sleep() in a header file.
+ dnl Older versions of mingw have a sleep() function that is an alias to
+ dnl _sleep() in MSVCRT. It has a different signature than POSIX sleep():
+ dnl it takes the number of milliseconds as argument and returns void.
+ dnl mingw does not declare this function.
+ AC_CHECK_DECLS([sleep], , , [#include <unistd.h>])
+ AC_CHECK_FUNCS_ONCE([sleep])
+ if test $ac_cv_have_decl_sleep != yes; then
+ HAVE_SLEEP=0
+ AC_LIBOBJ([sleep])
+ else
+ dnl Cygwin 1.5.x has a bug where sleep can't exceed 49.7 days.
+ AC_CACHE_CHECK([for working sleep], [gl_cv_func_sleep_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <errno.h>
+#include <unistd.h>
+#include <signal.h>
+static void
+handle_alarm (int sig)
+{
+ if (sig != SIGALRM)
+ _exit (2);
+}
+]], [[
+ /* Failure to compile this test due to missing alarm is okay,
+ since all such platforms (mingw) also lack sleep. */
+ unsigned int pentecost = 50 * 24 * 60 * 60; /* 50 days. */
+ unsigned int remaining;
+ signal (SIGALRM, handle_alarm);
+ alarm (1);
+ remaining = sleep (pentecost);
+ return !(pentecost - 10 < remaining && remaining <= pentecost);]])],
+ [gl_cv_func_sleep_works=yes], [gl_cv_func_sleep_works=no],
+ [gl_cv_func_sleep_works="guessing no"])])
+ if test "$gl_cv_func_sleep_works" != yes; then
+ REPLACE_SLEEP=1
+ AC_LIBOBJ([sleep])
+ fi
+ fi
+])
diff --git a/gnulib/m4/snprintf-posix.m4 b/gnulib/m4/snprintf-posix.m4
new file mode 100644
index 00000000..77a2481c
--- /dev/null
+++ b/gnulib/m4/snprintf-posix.m4
@@ -0,0 +1,126 @@
+# snprintf-posix.m4 serial 14
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SNPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_snprintf_posix=no
+ AC_CHECK_FUNCS([snprintf])
+ if test $ac_cv_func_snprintf = yes; then
+ gl_SNPRINTF_TRUNCATION_C99
+ gl_SNPRINTF_RETVAL_C99
+ gl_SNPRINTF_DIRECTIVE_N
+ gl_SNPRINTF_SIZE1
+ gl_VSNPRINTF_ZEROSIZE_C99
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ case "$gl_cv_func_snprintf_truncation_c99" in
+ *yes)
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+ case "$gl_cv_func_snprintf_directive_n" in
+ *yes)
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+ case "$gl_cv_func_vsnprintf_zerosize_c99" in
+ *yes)
+ # snprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_snprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_snprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_SNPRINTF
+ fi
+])
diff --git a/gnulib/m4/snprintf.m4 b/gnulib/m4/snprintf.m4
new file mode 100644
index 00000000..522b107b
--- /dev/null
+++ b/gnulib/m4/snprintf.m4
@@ -0,0 +1,40 @@
+# snprintf.m4 serial 5
+dnl Copyright (C) 2002-2004, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_cv_func_snprintf_usable=no
+ AC_CHECK_FUNCS([snprintf])
+ if test $ac_cv_func_snprintf = yes; then
+ gl_SNPRINTF_SIZE1
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+ gl_cv_func_snprintf_usable=yes
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_snprintf_usable = no; then
+ gl_REPLACE_SNPRINTF
+ fi
+ AC_CHECK_DECLS_ONCE([snprintf])
+ if test $ac_cv_have_decl_snprintf = no; then
+ HAVE_DECL_SNPRINTF=0
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_SNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([snprintf])
+ if test $ac_cv_func_snprintf = yes; then
+ REPLACE_SNPRINTF=1
+ fi
+ gl_PREREQ_SNPRINTF
+])
+
+# Prerequisites of lib/snprintf.c.
+AC_DEFUN([gl_PREREQ_SNPRINTF], [:])
diff --git a/gnulib/m4/sockets.m4 b/gnulib/m4/sockets.m4
new file mode 100644
index 00000000..aefb9360
--- /dev/null
+++ b/gnulib/m4/sockets.m4
@@ -0,0 +1,90 @@
+# sockets.m4 serial 6
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SOCKETS],
+[
+ AC_REQUIRE([AC_C_INLINE])
+
+ gl_PREREQ_SYS_H_WINSOCK2 dnl for HAVE_WINSOCK2_H
+ LIBSOCKET=
+ if test $HAVE_WINSOCK2_H = 1; then
+ dnl Native Windows API (not Cygwin).
+ AC_CACHE_CHECK([if we need to call WSAStartup in winsock2.h and -lws2_32],
+ [gl_cv_func_wsastartup], [
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+#endif]], [[
+ WORD wVersionRequested = MAKEWORD(1, 1);
+ WSADATA wsaData;
+ int err = WSAStartup(wVersionRequested, &wsaData);
+ WSACleanup ();]])],
+ gl_cv_func_wsastartup=yes, gl_cv_func_wsastartup=no)
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_func_wsastartup" = "yes"; then
+ AC_DEFINE([WINDOWS_SOCKETS], [1], [Define if WSAStartup is needed.])
+ LIBSOCKET='-lws2_32'
+ fi
+ else
+ dnl Unix API.
+ dnl Solaris has most socket functions in libsocket.
+ dnl Haiku has most socket functions in libnetwork.
+ dnl BeOS has most socket functions in libnet.
+ AC_CACHE_CHECK([for library containing setsockopt], [gl_cv_lib_socket], [
+ gl_cv_lib_socket=
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();]], [[setsockopt();]])],
+ [],
+ [gl_save_LIBS="$LIBS"
+ LIBS="$gl_save_LIBS -lsocket"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();]], [[setsockopt();]])],
+ [gl_cv_lib_socket="-lsocket"])
+ if test -z "$gl_cv_lib_socket"; then
+ LIBS="$gl_save_LIBS -lnetwork"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();]], [[setsockopt();]])],
+ [gl_cv_lib_socket="-lnetwork"])
+ if test -z "$gl_cv_lib_socket"; then
+ LIBS="$gl_save_LIBS -lnet"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();]], [[setsockopt();]])],
+ [gl_cv_lib_socket="-lnet"])
+ fi
+ fi
+ LIBS="$gl_save_LIBS"
+ ])
+ if test -z "$gl_cv_lib_socket"; then
+ gl_cv_lib_socket="none needed"
+ fi
+ ])
+ if test "$gl_cv_lib_socket" != "none needed"; then
+ LIBSOCKET="$gl_cv_lib_socket"
+ fi
+ fi
+ AC_SUBST([LIBSOCKET])
+ gl_PREREQ_SOCKETS
+])
+
+# Prerequisites of lib/sockets.c.
+AC_DEFUN([gl_PREREQ_SOCKETS], [
+ :
+])
diff --git a/gnulib/m4/socklen.m4 b/gnulib/m4/socklen.m4
new file mode 100644
index 00000000..2933d4b8
--- /dev/null
+++ b/gnulib/m4/socklen.m4
@@ -0,0 +1,52 @@
+# socklen.m4 serial 7
+dnl Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Albert Chin, Windows fixes from Simon Josefsson.
+
+dnl Check for socklen_t: historically on BSD it is an int, and in
+dnl POSIX 1g it is a type of its own, but some platforms use different
+dnl types for the argument to getsockopt, getpeername, etc. So we
+dnl have to test to find something that will work.
+
+dnl On mingw32, socklen_t is in ws2tcpip.h ('int'), so we try to find
+dnl it there first. That file is included by gnulib's sys_socket.in.h, which
+dnl all users of this module should include. Cygwin must not include
+dnl ws2tcpip.h.
+AC_DEFUN([gl_TYPE_SOCKLEN_T],
+ [AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl
+ AC_CHECK_TYPE([socklen_t], ,
+ [AC_MSG_CHECKING([for socklen_t equivalent])
+ AC_CACHE_VAL([gl_cv_socklen_t_equiv],
+ [# Systems have either "struct sockaddr *" or
+ # "void *" as the second argument to getpeername
+ gl_cv_socklen_t_equiv=
+ for arg2 in "struct sockaddr" void; do
+ for t in int size_t "unsigned int" "long int" "unsigned long int"; do
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/socket.h>
+
+ int getpeername (int, $arg2 *, $t *);]],
+ [[$t len;
+ getpeername (0, 0, &len);]])],
+ [gl_cv_socklen_t_equiv="$t"])
+ test "$gl_cv_socklen_t_equiv" != "" && break
+ done
+ test "$gl_cv_socklen_t_equiv" != "" && break
+ done
+ ])
+ if test "$gl_cv_socklen_t_equiv" = ""; then
+ AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
+ fi
+ AC_MSG_RESULT([$gl_cv_socklen_t_equiv])
+ AC_DEFINE_UNQUOTED([socklen_t], [$gl_cv_socklen_t_equiv],
+ [type to use in place of socklen_t if not defined])],
+ [#include <sys/types.h>
+ #if HAVE_SYS_SOCKET_H
+ # include <sys/socket.h>
+ #elif HAVE_WS2TCPIP_H
+ # include <ws2tcpip.h>
+ #endif])])
diff --git a/gnulib/m4/sockpfaf.m4 b/gnulib/m4/sockpfaf.m4
new file mode 100644
index 00000000..8a0c2360
--- /dev/null
+++ b/gnulib/m4/sockpfaf.m4
@@ -0,0 +1,58 @@
+# sockpfaf.m4 serial 7
+dnl Copyright (C) 2004, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Test for some common socket protocol families (PF_INET, PF_INET6, ...)
+dnl and some common address families (AF_INET, AF_INET6, ...).
+dnl This test assumes that a system supports an address family if and only if
+dnl it supports the corresponding protocol family.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SOCKET_FAMILIES],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ AC_CHECK_HEADERS_ONCE([netinet/in.h])
+
+ AC_MSG_CHECKING([for IPv4 sockets])
+ AC_CACHE_VAL([gl_cv_socket_ipv4],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif]],
+[[int x = AF_INET; struct in_addr y; struct sockaddr_in z;
+ if (&x && &y && &z) return 0;]])],
+ gl_cv_socket_ipv4=yes, gl_cv_socket_ipv4=no)])
+ AC_MSG_RESULT([$gl_cv_socket_ipv4])
+ if test $gl_cv_socket_ipv4 = yes; then
+ AC_DEFINE([HAVE_IPV4], [1], [Define to 1 if <sys/socket.h> defines AF_INET.])
+ fi
+
+ AC_MSG_CHECKING([for IPv6 sockets])
+ AC_CACHE_VAL([gl_cv_socket_ipv6],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif]],
+[[int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z;
+ if (&x && &y && &z) return 0;]])],
+ gl_cv_socket_ipv6=yes, gl_cv_socket_ipv6=no)])
+ AC_MSG_RESULT([$gl_cv_socket_ipv6])
+ if test $gl_cv_socket_ipv6 = yes; then
+ AC_DEFINE([HAVE_IPV6], [1], [Define to 1 if <sys/socket.h> defines AF_INET6.])
+ fi
+])
diff --git a/gnulib/m4/spawn_h.m4 b/gnulib/m4/spawn_h.m4
new file mode 100644
index 00000000..a9bd1614
--- /dev/null
+++ b/gnulib/m4/spawn_h.m4
@@ -0,0 +1,96 @@
+# spawn_h.m4 serial 6
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN([gl_SPAWN_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+
+ dnl <spawn.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([spawn.h])
+
+ AC_CHECK_HEADERS_ONCE([spawn.h])
+ if test $ac_cv_header_spawn_h = yes; then
+ HAVE_SPAWN_H=1
+ AC_CHECK_TYPES([posix_spawnattr_t], [], [HAVE_POSIX_SPAWNATTR_T=0], [[
+#include <spawn.h>
+ ]])
+ AC_CHECK_TYPES([posix_spawn_file_actions_t], [],
+ [HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0], [[
+#include <spawn.h>
+ ]])
+ else
+ HAVE_SPAWN_H=0
+ HAVE_POSIX_SPAWNATTR_T=0
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
+ gl_REPLACE_SPAWN_H
+ fi
+ AC_SUBST([HAVE_SPAWN_H])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <spawn.h>
+ ]], [posix_spawn posix_spawnp posix_spawnattr_init posix_spawnattr_destroy
+ posix_spawnattr_getsigdefault posix_spawnattr_setsigdefault
+ posix_spawnattr_getsigmask posix_spawnattr_setsigmask
+ posix_spawnattr_getflags posix_spawnattr_setflags
+ posix_spawnattr_getpgroup posix_spawnattr_setpgroup
+ posix_spawnattr_getschedpolicy posix_spawnattr_setschedpolicy
+ posix_spawnattr_getschedparam posix_spawnattr_setschedparam
+ posix_spawn_file_actions_init posix_spawn_file_actions_destroy
+ posix_spawn_file_actions_addopen posix_spawn_file_actions_addclose
+ posix_spawwn_file_actions_adddup2])
+])
+
+dnl Unconditionally enables the replacement of <spawn.h>.
+AC_DEFUN([gl_REPLACE_SPAWN_H],
+[
+ dnl This is a no-op, because <spawn.h> is always overridden.
+ :
+])
+
+AC_DEFUN([gl_SPAWN_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SPAWN_H_DEFAULTS],
+[
+ GNULIB_POSIX_SPAWN=0; AC_SUBST([GNULIB_POSIX_SPAWN])
+ GNULIB_POSIX_SPAWNP=0; AC_SUBST([GNULIB_POSIX_SPAWNP])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY])
+ GNULIB_POSIX_SPAWNATTR_INIT=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_INIT])
+ GNULIB_POSIX_SPAWNATTR_GETFLAGS=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETFLAGS])
+ GNULIB_POSIX_SPAWNATTR_SETFLAGS=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETFLAGS])
+ GNULIB_POSIX_SPAWNATTR_GETPGROUP=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETPGROUP])
+ GNULIB_POSIX_SPAWNATTR_SETPGROUP=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETPGROUP])
+ GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM])
+ GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM])
+ GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY])
+ GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY])
+ GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT])
+ GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT])
+ GNULIB_POSIX_SPAWNATTR_GETSIGMASK=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSIGMASK])
+ GNULIB_POSIX_SPAWNATTR_SETSIGMASK=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSIGMASK])
+ GNULIB_POSIX_SPAWNATTR_DESTROY=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_DESTROY])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_POSIX_SPAWN=1; AC_SUBST([HAVE_POSIX_SPAWN])
+ HAVE_POSIX_SPAWNATTR_T=1; AC_SUBST([HAVE_POSIX_SPAWNATTR_T])
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_T=1;
+ AC_SUBST([HAVE_POSIX_SPAWN_FILE_ACTIONS_T])
+ REPLACE_POSIX_SPAWN=0; AC_SUBST([REPLACE_POSIX_SPAWN])
+])
diff --git a/gnulib/m4/sprintf-posix.m4 b/gnulib/m4/sprintf-posix.m4
new file mode 100644
index 00000000..08d0810b
--- /dev/null
+++ b/gnulib/m4/sprintf-posix.m4
@@ -0,0 +1,108 @@
+# sprintf-posix.m4 serial 12
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_sprintf_posix=no
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # sprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_sprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ if test $gl_cv_func_sprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_SPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_SPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([sprintf])
+ REPLACE_SPRINTF=1
+ gl_PREREQ_SPRINTF
+])
+
+AC_DEFUN([gl_PREREQ_SPRINTF], [:])
diff --git a/gnulib/m4/sqrt.m4 b/gnulib/m4/sqrt.m4
new file mode 100644
index 00000000..dd87ed24
--- /dev/null
+++ b/gnulib/m4/sqrt.m4
@@ -0,0 +1,10 @@
+# sqrt.m4 serial 3
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SQRT],
+[
+ gl_COMMON_DOUBLE_MATHFUNC([sqrt])
+])
diff --git a/gnulib/m4/sqrtl.m4 b/gnulib/m4/sqrtl.m4
new file mode 100644
index 00000000..21b1c683
--- /dev/null
+++ b/gnulib/m4/sqrtl.m4
@@ -0,0 +1,81 @@
+# sqrtl.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SQRTL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare sqrtl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ SQRTL_LIBM=
+ AC_CACHE_CHECK([whether sqrtl() can be used without linking with libm],
+ [gl_cv_func_sqrtl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return sqrtl (x) > 0.4;],
+ [gl_cv_func_sqrtl_no_libm=yes],
+ [gl_cv_func_sqrtl_no_libm=no])
+ ])
+ if test $gl_cv_func_sqrtl_no_libm = no; then
+ AC_CACHE_CHECK([whether sqrtl() can be used with libm],
+ [gl_cv_func_sqrtl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return sqrtl (x) > 0.4;],
+ [gl_cv_func_sqrtl_in_libm=yes],
+ [gl_cv_func_sqrtl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_sqrtl_in_libm = yes; then
+ SQRTL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_sqrtl_no_libm = yes \
+ || test $gl_cv_func_sqrtl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has sqrtl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([sqrtl], , [HAVE_DECL_SQRTL=0], [#include <math.h>])
+ else
+ HAVE_DECL_SQRTL=0
+ HAVE_SQRTL=0
+ AC_LIBOBJ([sqrtl])
+ AC_REQUIRE([gl_FUNC_ISNANL])
+ AC_REQUIRE([gl_FUNC_FREXPL])
+ AC_REQUIRE([gl_FUNC_LDEXPL])
+ AC_REQUIRE([gl_FUNC_SQRT])
+ dnl Append $ISNANL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
+ case " $SQRTL_LIBM " in
+ *" $ISNANL_LIBM "*) ;;
+ *) SQRTL_LIBM="$SQRTL_LIBM $ISNANL_LIBM" ;;
+ esac
+ dnl Append $FREXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
+ case " $SQRTL_LIBM " in
+ *" $FREXPL_LIBM "*) ;;
+ *) SQRTL_LIBM="$SQRTL_LIBM $FREXPL_LIBM" ;;
+ esac
+ dnl Append $LDEXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
+ case " $SQRTL_LIBM " in
+ *" $LDEXPL_LIBM "*) ;;
+ *) SQRTL_LIBM="$SQRTL_LIBM $LDEXPL_LIBM" ;;
+ esac
+ dnl Append $SQRT_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
+ case " $SQRTL_LIBM " in
+ *" $SQRT_LIBM "*) ;;
+ *) SQRTL_LIBM="$SQRTL_LIBM $SQRT_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([SQRTL_LIBM])
+])
diff --git a/gnulib/m4/ssize_t.m4 b/gnulib/m4/ssize_t.m4
new file mode 100644
index 00000000..e0ccee3a
--- /dev/null
+++ b/gnulib/m4/ssize_t.m4
@@ -0,0 +1,21 @@
+# ssize_t.m4 serial 4 (gettext-0.15)
+dnl Copyright (C) 2001-2003, 2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether ssize_t is defined.
+
+AC_DEFUN([gt_TYPE_SSIZE_T],
+[
+ AC_CACHE_CHECK([for ssize_t], [gt_cv_ssize_t],
+ [AC_TRY_COMPILE([#include <sys/types.h>],
+ [int x = sizeof (ssize_t *) + sizeof (ssize_t);
+ return !x;],
+ [gt_cv_ssize_t=yes], [gt_cv_ssize_t=no])])
+ if test $gt_cv_ssize_t = no; then
+ AC_DEFINE([ssize_t], [int],
+ [Define as a signed type of the same size as size_t.])
+ fi
+])
diff --git a/gnulib/m4/st_dm_mode.m4 b/gnulib/m4/st_dm_mode.m4
new file mode 100644
index 00000000..9b7cc23e
--- /dev/null
+++ b/gnulib/m4/st_dm_mode.m4
@@ -0,0 +1,23 @@
+# serial 6
+
+# Copyright (C) 1998-1999, 2001, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Define HAVE_ST_DM_MODE if struct stat has an st_dm_mode member.
+
+AC_DEFUN([AC_STRUCT_ST_DM_MODE],
+ [AC_CACHE_CHECK([for st_dm_mode in struct stat], [ac_cv_struct_st_dm_mode],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/stat.h>]], [[struct stat s; s.st_dm_mode;]])],
+ [ac_cv_struct_st_dm_mode=yes],
+ [ac_cv_struct_st_dm_mode=no])])
+
+ if test $ac_cv_struct_st_dm_mode = yes; then
+ AC_DEFINE([HAVE_ST_DM_MODE], [1],
+ [Define if struct stat has an st_dm_mode member. ])
+ fi
+ ]
+)
diff --git a/gnulib/m4/stat-macros.m4 b/gnulib/m4/stat-macros.m4
new file mode 100644
index 00000000..a59b85db
--- /dev/null
+++ b/gnulib/m4/stat-macros.m4
@@ -0,0 +1,12 @@
+#serial 3
+
+# Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+AC_DEFUN([gl_STAT_MACROS],
+[
+ AC_REQUIRE([AC_HEADER_STAT])
+])
diff --git a/gnulib/m4/stat-time.m4 b/gnulib/m4/stat-time.m4
new file mode 100644
index 00000000..e653c434
--- /dev/null
+++ b/gnulib/m4/stat-time.m4
@@ -0,0 +1,85 @@
+# Checks for stat-related time functions.
+
+# Copyright (C) 1998-1999, 2001, 2003, 2005-2007, 2009-2010 Free Software
+# Foundation, Inc.
+
+# This file 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.
+
+dnl From Paul Eggert.
+
+# st_atim.tv_nsec - Linux, Solaris, Cygwin
+# st_atimespec.tv_nsec - FreeBSD, NetBSD, if ! defined _POSIX_SOURCE
+# st_atimensec - FreeBSD, NetBSD, if defined _POSIX_SOURCE
+# st_atim.st__tim.tv_nsec - UnixWare (at least 2.1.2 through 7.1)
+
+# st_birthtimespec - FreeBSD, NetBSD (hidden on OpenBSD 3.9, anyway)
+# st_birthtim - Cygwin 1.7.0+
+
+AC_DEFUN([gl_STAT_TIME],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+
+ AC_CHECK_MEMBERS([struct stat.st_atim.tv_nsec],
+ [AC_CACHE_CHECK([whether struct stat.st_atim is of type struct timespec],
+ [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #if HAVE_SYS_TIME_H
+ # include <sys/time.h>
+ #endif
+ #include <time.h>
+ struct timespec ts;
+ struct stat st;
+ ]],
+ [[
+ st.st_atim = ts;
+ ]])],
+ [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes],
+ [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no])])
+ if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then
+ AC_DEFINE([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC], [1],
+ [Define to 1 if the type of the st_atim member of a struct stat is
+ struct timespec.])
+ fi],
+ [AC_CHECK_MEMBERS([struct stat.st_atimespec.tv_nsec], [],
+ [AC_CHECK_MEMBERS([struct stat.st_atimensec], [],
+ [AC_CHECK_MEMBERS([struct stat.st_atim.st__tim.tv_nsec], [], [],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])
+])
+
+# Check for st_birthtime, a feature from UFS2 (FreeBSD, NetBSD, OpenBSD, etc.)
+# and NTFS (Cygwin).
+# There was a time when this field was named st_createtime (21 June
+# 2002 to 16 July 2002) But that window is very small and applied only
+# to development code, so systems still using that configuration are
+# not supported. See revisions 1.10 and 1.11 of FreeBSD's
+# src/sys/ufs/ufs/dinode.h.
+#
+AC_DEFUN([gl_STAT_BIRTHTIME],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ AC_CHECK_MEMBERS([struct stat.st_birthtimespec.tv_nsec], [],
+ [AC_CHECK_MEMBERS([struct stat.st_birthtimensec], [],
+ [AC_CHECK_MEMBERS([struct stat.st_birthtim.tv_nsec], [], [],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])
+])
diff --git a/gnulib/m4/stat.m4 b/gnulib/m4/stat.m4
new file mode 100644
index 00000000..acd32d86
--- /dev/null
+++ b/gnulib/m4/stat.m4
@@ -0,0 +1,63 @@
+# serial 4
+
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+AC_DEFUN([gl_FUNC_STAT],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_AC_DOS])
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([lstat])
+ dnl mingw is the only known platform where stat(".") and stat("./") differ
+ AC_CACHE_CHECK([whether stat handles trailing slashes on directories],
+ [gl_cv_func_stat_dir_slash],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/stat.h>
+]], [[struct stat st; return stat (".", &st) != stat ("./", &st);]])],
+ [gl_cv_func_stat_dir_slash=yes], [gl_cv_func_stat_dir_slash=no],
+ [case $host_os in
+ mingw*) gl_cv_func_stat_dir_slash="guessing no";;
+ *) gl_cv_func_stat_dir_slash="guessing yes";;
+ esac])])
+ dnl Solaris 9 mistakenly succeeds on stat("file/")
+ dnl FreeBSD 7.2 mistakenly succeeds on stat("link-to-file/")
+ AC_CACHE_CHECK([whether stat handles trailing slashes on files],
+ [gl_cv_func_stat_file_slash],
+ [touch conftest.tmp
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.tmp conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/stat.h>
+]], [[struct stat st;
+ if (!stat ("conftest.tmp/", &st)) return 1;
+#if HAVE_LSTAT
+ if (!stat ("conftest.lnk/", &st)) return 2;
+#endif
+ ]])],
+ [gl_cv_func_stat_file_slash=yes], [gl_cv_func_stat_file_slash=no],
+ [gl_cv_func_stat_file_slash="guessing no"])
+ rm -f conftest.tmp conftest.lnk])
+ case $gl_cv_func_stat_dir_slash in
+ *no) REPLACE_STAT=1
+ AC_DEFINE([REPLACE_FUNC_STAT_DIR], [1], [Define to 1 if stat needs
+ help when passed a directory name with a trailing slash]);;
+ esac
+ case $gl_cv_func_stat_file_slash in
+ *no) REPLACE_STAT=1
+ AC_DEFINE([REPLACE_FUNC_STAT_FILE], [1], [Define to 1 if stat needs
+ help when passed a file name with a trailing slash]);;
+ esac
+ if test $REPLACE_STAT = 1; then
+ AC_LIBOBJ([stat])
+ dnl Prerequisites of lib/stat.c.
+ AC_REQUIRE([AC_C_INLINE])
+ fi
+])
diff --git a/gnulib/m4/stdarg.m4 b/gnulib/m4/stdarg.m4
new file mode 100644
index 00000000..5c87bd8b
--- /dev/null
+++ b/gnulib/m4/stdarg.m4
@@ -0,0 +1,67 @@
+# stdarg.m4 serial 3
+dnl Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Provide a working va_copy in combination with <stdarg.h>.
+
+AC_DEFUN([gl_STDARG_H],
+[
+ STDARG_H=''; AC_SUBST([STDARG_H])
+ NEXT_STDARG_H='<stdarg.h>'; AC_SUBST([NEXT_STDARG_H])
+ AC_MSG_CHECKING([for va_copy])
+ AC_CACHE_VAL([gl_cv_func_va_copy], [
+ AC_TRY_COMPILE([#include <stdarg.h>], [
+#ifndef va_copy
+void (*func) (va_list, va_list) = va_copy;
+#endif
+],
+ [gl_cv_func_va_copy=yes], [gl_cv_func_va_copy=no])])
+ AC_MSG_RESULT([$gl_cv_func_va_copy])
+ if test $gl_cv_func_va_copy = no; then
+ dnl Provide a substitute.
+ dnl Usually a simple definition in <config.h> is enough. Not so on AIX 5
+ dnl with some versions of the /usr/vac/bin/cc compiler. It has an <stdarg.h>
+ dnl which does '#undef va_copy', leading to a missing va_copy symbol. For
+ dnl this platform, we use an <stdarg.h> substitute. But we cannot use this
+ dnl approach on other platforms, because <stdarg.h> often defines only
+ dnl preprocessor macros and gl_ABSOLUTE_HEADER, gl_CHECK_NEXT_HEADERS do
+ dnl not work in this situation.
+ AC_EGREP_CPP([vaccine],
+ [#if defined _AIX && !defined __GNUC__
+ AIX vaccine
+ #endif
+ ], [gl_aixcc=yes], [gl_aixcc=no])
+ if test $gl_aixcc = yes; then
+ dnl Provide a substitute <stdarg.h> file.
+ STDARG_H=stdarg.h
+ gl_CHECK_NEXT_HEADERS([stdarg.h])
+ dnl Fallback for the case when <stdarg.h> contains only macro definitions.
+ if test "$gl_cv_next_stdarg_h" = '""'; then
+ gl_cv_next_stdarg_h='"///usr/include/stdarg.h"'
+ NEXT_STDARG_H="$gl_cv_next_stdarg_h"
+ fi
+ else
+ dnl Provide a substitute in <config.h>, either __va_copy or as a simple
+ dnl assignment.
+ gl_CACHE_VAL_SILENT([gl_cv_func___va_copy], [
+ AC_TRY_COMPILE([#include <stdarg.h>], [
+#ifndef __va_copy
+error, bail out
+#endif
+],
+ [gl_cv_func___va_copy=yes], [gl_cv_func___va_copy=no])])
+ if test $gl_cv_func___va_copy = yes; then
+ AC_DEFINE([va_copy], [__va_copy],
+ [Define as a macro for copying va_list variables.])
+ else
+ AH_VERBATIM([gl_VA_COPY], [/* A replacement for va_copy, if needed. */
+#define gl_va_copy(a,b) ((a) = (b))])
+ AC_DEFINE([va_copy], [gl_va_copy],
+ [Define as a macro for copying va_list variables.])
+ fi
+ fi
+ fi
+])
diff --git a/gnulib/m4/stdbool.m4 b/gnulib/m4/stdbool.m4
new file mode 100644
index 00000000..3d672d74
--- /dev/null
+++ b/gnulib/m4/stdbool.m4
@@ -0,0 +1,115 @@
+# Check for stdbool.h that conforms to C99.
+
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prepare for substituting <stdbool.h> if it is not supported.
+
+AC_DEFUN([AM_STDBOOL_H],
+[
+ AC_REQUIRE([AC_HEADER_STDBOOL])
+
+ # Define two additional variables used in the Makefile substitution.
+
+ if test "$ac_cv_header_stdbool_h" = yes; then
+ STDBOOL_H=''
+ else
+ STDBOOL_H='stdbool.h'
+ fi
+ AC_SUBST([STDBOOL_H])
+
+ if test "$ac_cv_type__Bool" = yes; then
+ HAVE__BOOL=1
+ else
+ HAVE__BOOL=0
+ fi
+ AC_SUBST([HAVE__BOOL])
+])
+
+# AM_STDBOOL_H will be renamed to gl_STDBOOL_H in the future.
+AC_DEFUN([gl_STDBOOL_H], [AM_STDBOOL_H])
+
+# This macro is only needed in autoconf <= 2.59. Newer versions of autoconf
+# have this macro built-in.
+
+AC_DEFUN([AC_HEADER_STDBOOL],
+ [AC_CACHE_CHECK([for stdbool.h that conforms to C99],
+ [ac_cv_header_stdbool_h],
+ [AC_TRY_COMPILE(
+ [
+ #include <stdbool.h>
+ #ifndef bool
+ "error: bool is not defined"
+ #endif
+ #ifndef false
+ "error: false is not defined"
+ #endif
+ #if false
+ "error: false is not 0"
+ #endif
+ #ifndef true
+ "error: true is not defined"
+ #endif
+ #if true != 1
+ "error: true is not 1"
+ #endif
+ #ifndef __bool_true_false_are_defined
+ "error: __bool_true_false_are_defined is not defined"
+ #endif
+
+ struct s { _Bool s: 1; _Bool t; } s;
+
+ char a[true == 1 ? 1 : -1];
+ char b[false == 0 ? 1 : -1];
+ char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+ char d[(bool) 0.5 == true ? 1 : -1];
+ bool e = &s;
+ char f[(_Bool) 0.0 == false ? 1 : -1];
+ char g[true];
+ char h[sizeof (_Bool)];
+ char i[sizeof s.t];
+ enum { j = false, k = true, l = false * true, m = true * 256 };
+ _Bool n[m];
+ char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+ char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+ #if defined __xlc__ || defined __GNUC__
+ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
+ reported by James Lemley on 2005-10-05; see
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
+ This test is not quite right, since xlc is allowed to
+ reject this program, as the initializer for xlcbug is
+ not one of the forms that C requires support for.
+ However, doing the test right would require a run-time
+ test, and that would make cross-compilation harder.
+ Let us hope that IBM fixes the xlc bug, and also adds
+ support for this kind of constant expression. In the
+ meantime, this test will reject xlc, which is OK, since
+ our stdbool.h substitute should suffice. We also test
+ this with GCC, where it should work, to detect more
+ quickly whether someone messes up the test in the
+ future. */
+ char digs[] = "0123456789";
+ int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
+ #endif
+ /* Catch a bug in an HP-UX C compiler. See
+ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ */
+ _Bool q = true;
+ _Bool *pq = &q;
+ ],
+ [
+ *pq |= q;
+ *pq |= ! q;
+ /* Refer to every declared value, to avoid compiler optimizations. */
+ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+ + !m + !n + !o + !p + !q + !pq);
+ ],
+ [ac_cv_header_stdbool_h=yes],
+ [ac_cv_header_stdbool_h=no])])
+ AC_CHECK_TYPES([_Bool])
+ if test $ac_cv_header_stdbool_h = yes; then
+ AC_DEFINE([HAVE_STDBOOL_H], [1], [Define to 1 if stdbool.h conforms to C99.])
+ fi])
diff --git a/gnulib/m4/stddef_h.m4 b/gnulib/m4/stddef_h.m4
new file mode 100644
index 00000000..c8572de9
--- /dev/null
+++ b/gnulib/m4/stddef_h.m4
@@ -0,0 +1,45 @@
+dnl A placeholder for POSIX 2008 <stddef.h>, for platforms that have issues.
+# stddef_h.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDDEF_H],
+[
+ AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ if test $gt_cv_c_wchar_t = no; then
+ HAVE_WCHAR_T=0
+ STDDEF_H=stddef.h
+ fi
+ AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions],
+ [gl_cv_decl_null_works],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stddef.h>
+ int test[2 * (sizeof NULL == sizeof (void *)) -1];
+]])],
+ [gl_cv_decl_null_works=yes],
+ [gl_cv_decl_null_works=no])])
+ if test $gl_cv_decl_null_works = no; then
+ REPLACE_NULL=1
+ STDDEF_H=stddef.h
+ fi
+ if test -n "$STDDEF_H"; then
+ gl_CHECK_NEXT_HEADERS([stddef.h])
+ fi
+])
+
+AC_DEFUN([gl_STDDEF_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_STDDEF_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ REPLACE_NULL=0; AC_SUBST([REPLACE_NULL])
+ HAVE_WCHAR_T=1; AC_SUBST([HAVE_WCHAR_T])
+ STDDEF_H=''; AC_SUBST([STDDEF_H])
+])
diff --git a/gnulib/m4/stdint.m4 b/gnulib/m4/stdint.m4
new file mode 100644
index 00000000..1cc57e6e
--- /dev/null
+++ b/gnulib/m4/stdint.m4
@@ -0,0 +1,472 @@
+# stdint.m4 serial 34
+dnl Copyright (C) 2001-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert and Bruno Haible.
+dnl Test whether <stdint.h> is supported or must be substituted.
+
+AC_DEFUN([gl_STDINT_H],
+[
+ AC_PREREQ([2.59])dnl
+
+ dnl Check for long long int and unsigned long long int.
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ if test $ac_cv_type_long_long_int = yes; then
+ HAVE_LONG_LONG_INT=1
+ else
+ HAVE_LONG_LONG_INT=0
+ fi
+ AC_SUBST([HAVE_LONG_LONG_INT])
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ HAVE_UNSIGNED_LONG_LONG_INT=1
+ else
+ HAVE_UNSIGNED_LONG_LONG_INT=0
+ fi
+ AC_SUBST([HAVE_UNSIGNED_LONG_LONG_INT])
+
+ dnl Check for <inttypes.h>.
+ dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
+ if test $ac_cv_header_inttypes_h = yes; then
+ HAVE_INTTYPES_H=1
+ else
+ HAVE_INTTYPES_H=0
+ fi
+ AC_SUBST([HAVE_INTTYPES_H])
+
+ dnl Check for <sys/types.h>.
+ dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_sys_types_h.
+ if test $ac_cv_header_sys_types_h = yes; then
+ HAVE_SYS_TYPES_H=1
+ else
+ HAVE_SYS_TYPES_H=0
+ fi
+ AC_SUBST([HAVE_SYS_TYPES_H])
+
+ gl_CHECK_NEXT_HEADERS([stdint.h])
+ if test $ac_cv_header_stdint_h = yes; then
+ HAVE_STDINT_H=1
+ else
+ HAVE_STDINT_H=0
+ fi
+ AC_SUBST([HAVE_STDINT_H])
+
+ dnl Now see whether we need a substitute <stdint.h>.
+ if test $ac_cv_header_stdint_h = yes; then
+ AC_CACHE_CHECK([whether stdint.h conforms to C99],
+ [gl_cv_header_working_stdint_h],
+ [gl_cv_header_working_stdint_h=no
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>. */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
+]
+gl_STDINT_INCLUDES
+[
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+#define TYPE_MAXIMUM(t) \
+ ((t) ((t) 0 < (t) -1 ? (t) -1 : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+struct s {
+ int check_PTRDIFF:
+ PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+ && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+ ? 1 : -1;
+ /* Detect bug in FreeBSD 6.0 / ia64. */
+ int check_SIG_ATOMIC:
+ SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+ && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+ ? 1 : -1;
+ int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+ int check_WCHAR:
+ WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+ && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+ ? 1 : -1;
+ /* Detect bug in mingw. */
+ int check_WINT:
+ WINT_MIN == TYPE_MINIMUM (wint_t)
+ && WINT_MAX == TYPE_MAXIMUM (wint_t)
+ ? 1 : -1;
+
+ /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */
+ int check_UINT8_C:
+ (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+ int check_UINT16_C:
+ (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+ /* Detect bugs in OpenBSD 3.9 stdint.h. */
+#ifdef UINT8_MAX
+ int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+ int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+ int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+ int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+ int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+ int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+ int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+ int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+ int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+ int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+ int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+ int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+ int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+ int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+ int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
+ ]])],
+ [dnl Determine whether the various *_MIN, *_MAX macros are usable
+ dnl in preprocessor expression. We could do it by compiling a test
+ dnl program for each of these macros. It is faster to run a program
+ dnl that inspects the macro expansion.
+ dnl This detects a bug on HP-UX 11.23/ia64.
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+ {
+#ifdef INT8_MAX
+ MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+ MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+ MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+ MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+ MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+ MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+ MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+ MVAL (UINT64_MAX),
+#endif
+ NULL
+ };
+]], [[
+ const char **mv;
+ for (mv = macro_values; *mv != NULL; mv++)
+ {
+ const char *value = *mv;
+ /* Test whether it looks like a cast expression. */
+ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+ || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+ || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+ || strncmp (value, "((int)"/*)*/, 6) == 0
+ || strncmp (value, "((signed short)"/*)*/, 15) == 0
+ || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+ return 1;
+ }
+ return 0;
+]])],
+ [gl_cv_header_working_stdint_h=yes],
+ [],
+ [dnl When cross-compiling, assume it works.
+ gl_cv_header_working_stdint_h=yes
+ ])
+ ])
+ ])
+ fi
+ if test "$gl_cv_header_working_stdint_h" = yes; then
+ STDINT_H=
+ else
+ dnl Check for <sys/inttypes.h>, and for
+ dnl <sys/bitypes.h> (used in Linux libc4 >= 4.6.7 and libc5).
+ AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h])
+ if test $ac_cv_header_sys_inttypes_h = yes; then
+ HAVE_SYS_INTTYPES_H=1
+ else
+ HAVE_SYS_INTTYPES_H=0
+ fi
+ AC_SUBST([HAVE_SYS_INTTYPES_H])
+ if test $ac_cv_header_sys_bitypes_h = yes; then
+ HAVE_SYS_BITYPES_H=1
+ else
+ HAVE_SYS_BITYPES_H=0
+ fi
+ AC_SUBST([HAVE_SYS_BITYPES_H])
+
+ dnl Check for <wchar.h> (missing in Linux uClibc when built without wide
+ dnl character support).
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+
+ gl_STDINT_TYPE_PROPERTIES
+ STDINT_H=stdint.h
+ fi
+ AC_SUBST([STDINT_H])
+])
+
+dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES)
+dnl Determine the size of each of the given types in bits.
+AC_DEFUN([gl_STDINT_BITSIZEOF],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE([BITSIZEOF_]translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+ [Define to the number of bits in type ']gltype['.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}],
+ [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT],
+ [$2
+#include <limits.h>], [result=unknown])
+ eval gl_cv_bitsizeof_${gltype}=\$result
+ ])
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ dnl Use a nonempty default, because some compilers, such as IRIX 5 cc,
+ dnl do a syntax check even on unused #if conditions and give an error
+ dnl on valid C code like this:
+ dnl #if 0
+ dnl # if > 32
+ dnl # endif
+ dnl #endif
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result])
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST([BITSIZEOF_]translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES)
+dnl Determine the signedness of each of the given types.
+dnl Define HAVE_SIGNED_TYPE if type is signed.
+AC_DEFUN([gl_CHECK_TYPES_SIGNED],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE([HAVE_SIGNED_]translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+ [Define to 1 if ']gltype[' is a signed integer type.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([$2[
+ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])],
+ result=yes, result=no)
+ eval gl_cv_type_${gltype}_signed=\$result
+ ])
+ eval result=\$gl_cv_type_${gltype}_signed
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ if test "$result" = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1])
+ eval HAVE_SIGNED_${GLTYPE}=1
+ else
+ eval HAVE_SIGNED_${GLTYPE}=0
+ fi
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST([HAVE_SIGNED_]translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES)
+dnl Determine the suffix to use for integer constants of the given types.
+dnl Define t_SUFFIX for each such type.
+AC_DEFUN([gl_INTEGER_TYPE_SUFFIX],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE(translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX],
+ [Define to l, ll, u, ul, ull, etc., as suitable for
+ constants of type ']gltype['.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([for $gltype integer literal suffix],
+ [gl_cv_type_${gltype}_suffix],
+ [eval gl_cv_type_${gltype}_suffix=no
+ eval result=\$gl_cv_type_${gltype}_signed
+ if test "$result" = yes; then
+ glsufu=
+ else
+ glsufu=u
+ fi
+ for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+ case $glsuf in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ i64) gltype1='__int64';;
+ u) gltype1='unsigned int';;
+ ul) gltype1='unsigned long int';;
+ ull) gltype1='unsigned long long int';;
+ ui64)gltype1='unsigned __int64';;
+ esac
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([$2[
+ extern $gltype foo;
+ extern $gltype1 foo;]])],
+ [eval gl_cv_type_${gltype}_suffix=\$glsuf])
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done])
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result])
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST(translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])])
+])
+
+dnl gl_STDINT_INCLUDES
+AC_DEFUN([gl_STDINT_INCLUDES],
+[[
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <stdio.h>
+ # include <time.h>
+ # include <wchar.h>
+ #endif
+]])
+
+dnl gl_STDINT_TYPE_PROPERTIES
+dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t
+dnl of interest to stdint.in.h.
+AC_DEFUN([gl_STDINT_TYPE_PROPERTIES],
+[
+ AC_REQUIRE([gl_MULTIARCH])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_STDINT_BITSIZEOF([ptrdiff_t size_t],
+ [gl_STDINT_INCLUDES])
+ fi
+ gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+ gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+ gl_cv_type_ptrdiff_t_signed=yes
+ gl_cv_type_size_t_signed=no
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t],
+ [gl_STDINT_INCLUDES])
+ fi
+ gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
+
+# Hey Emacs!
+# Local Variables:
+# indent-tabs-mode: nil
+# End:
diff --git a/gnulib/m4/stdint_h.m4 b/gnulib/m4/stdint_h.m4
new file mode 100644
index 00000000..b8e3c6cc
--- /dev/null
+++ b/gnulib/m4/stdint_h.m4
@@ -0,0 +1,26 @@
+# stdint_h.m4 serial 8
+dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_STDINT_H],
+[
+ AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h],
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <stdint.h>],
+ [uintmax_t i = (uintmax_t) -1; return !i;],
+ [gl_cv_header_stdint_h=yes],
+ [gl_cv_header_stdint_h=no])])
+ if test $gl_cv_header_stdint_h = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1],
+ [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/gnulib/m4/stdio-safer.m4 b/gnulib/m4/stdio-safer.m4
new file mode 100644
index 00000000..cecc14a5
--- /dev/null
+++ b/gnulib/m4/stdio-safer.m4
@@ -0,0 +1,25 @@
+#serial 12
+dnl Copyright (C) 2002, 2005-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FOPEN_SAFER],
+[
+ AC_LIBOBJ([fopen-safer])
+])
+
+AC_DEFUN([gl_FREOPEN_SAFER],
+[
+ AC_LIBOBJ([freopen-safer])
+])
+
+AC_DEFUN([gl_POPEN_SAFER],
+[
+ AC_LIBOBJ([popen-safer])
+])
+
+AC_DEFUN([gl_TMPFILE_SAFER],
+[
+ AC_LIBOBJ([tmpfile-safer])
+])
diff --git a/gnulib/m4/stdio_h.m4 b/gnulib/m4/stdio_h.m4
new file mode 100644
index 00000000..781fa8d3
--- /dev/null
+++ b/gnulib/m4/stdio_h.m4
@@ -0,0 +1,152 @@
+# stdio_h.m4 serial 25
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDIO_H],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_C_INLINE])
+ gl_CHECK_NEXT_HEADERS([stdio.h])
+ dnl No need to create extra modules for these functions. Everyone who uses
+ dnl <stdio.h> likely needs them.
+ GNULIB_FPRINTF=1
+ GNULIB_PRINTF=1
+ GNULIB_VFPRINTF=1
+ GNULIB_VPRINTF=1
+ GNULIB_FPUTC=1
+ GNULIB_PUTC=1
+ GNULIB_PUTCHAR=1
+ GNULIB_FPUTS=1
+ GNULIB_PUTS=1
+ GNULIB_FWRITE=1
+ dnl This ifdef is just an optimization, to avoid performing a configure
+ dnl check whose result is not used. It does not make the test of
+ dnl GNULIB_STDIO_H_SIGPIPE or GNULIB_SIGPIPE redundant.
+ m4_ifdef([gl_SIGNAL_SIGPIPE], [
+ gl_SIGNAL_SIGPIPE
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_STDIO_WRITE_FUNCS=1
+ AC_LIBOBJ([stdio-write])
+ fi
+ ])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by C89.
+ gl_WARN_ON_USE_PREPARE([[#include <stdio.h>
+ ]], [dprintf fpurge fseeko ftello getdelim getline popen renameat
+ snprintf vdprintf vsnprintf])
+])
+
+AC_DEFUN([gl_STDIO_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_STDIO_H_DEFAULTS],
+[
+ GNULIB_DPRINTF=0; AC_SUBST([GNULIB_DPRINTF])
+ GNULIB_FCLOSE=0; AC_SUBST([GNULIB_FCLOSE])
+ GNULIB_FFLUSH=0; AC_SUBST([GNULIB_FFLUSH])
+ GNULIB_FOPEN=0; AC_SUBST([GNULIB_FOPEN])
+ GNULIB_FPRINTF=0; AC_SUBST([GNULIB_FPRINTF])
+ GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX])
+ GNULIB_FPURGE=0; AC_SUBST([GNULIB_FPURGE])
+ GNULIB_FPUTC=0; AC_SUBST([GNULIB_FPUTC])
+ GNULIB_FPUTS=0; AC_SUBST([GNULIB_FPUTS])
+ GNULIB_FREOPEN=0; AC_SUBST([GNULIB_FREOPEN])
+ GNULIB_FSEEK=0; AC_SUBST([GNULIB_FSEEK])
+ GNULIB_FSEEKO=0; AC_SUBST([GNULIB_FSEEKO])
+ GNULIB_FTELL=0; AC_SUBST([GNULIB_FTELL])
+ GNULIB_FTELLO=0; AC_SUBST([GNULIB_FTELLO])
+ GNULIB_FWRITE=0; AC_SUBST([GNULIB_FWRITE])
+ GNULIB_GETDELIM=0; AC_SUBST([GNULIB_GETDELIM])
+ GNULIB_GETLINE=0; AC_SUBST([GNULIB_GETLINE])
+ GNULIB_OBSTACK_PRINTF=0; AC_SUBST([GNULIB_OBSTACK_PRINTF])
+ GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX])
+ GNULIB_PERROR=0; AC_SUBST([GNULIB_PERROR])
+ GNULIB_POPEN=0; AC_SUBST([GNULIB_POPEN])
+ GNULIB_PRINTF=0; AC_SUBST([GNULIB_PRINTF])
+ GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_POSIX])
+ GNULIB_PUTC=0; AC_SUBST([GNULIB_PUTC])
+ GNULIB_PUTCHAR=0; AC_SUBST([GNULIB_PUTCHAR])
+ GNULIB_PUTS=0; AC_SUBST([GNULIB_PUTS])
+ GNULIB_REMOVE=0; AC_SUBST([GNULIB_REMOVE])
+ GNULIB_RENAME=0; AC_SUBST([GNULIB_RENAME])
+ GNULIB_RENAMEAT=0; AC_SUBST([GNULIB_RENAMEAT])
+ GNULIB_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF])
+ GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX])
+ GNULIB_STDIO_H_SIGPIPE=0; AC_SUBST([GNULIB_STDIO_H_SIGPIPE])
+ GNULIB_VASPRINTF=0; AC_SUBST([GNULIB_VASPRINTF])
+ GNULIB_VDPRINTF=0; AC_SUBST([GNULIB_VDPRINTF])
+ GNULIB_VFPRINTF=0; AC_SUBST([GNULIB_VFPRINTF])
+ GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX])
+ GNULIB_VPRINTF=0; AC_SUBST([GNULIB_VPRINTF])
+ GNULIB_VPRINTF_POSIX=0; AC_SUBST([GNULIB_VPRINTF_POSIX])
+ GNULIB_VSNPRINTF=0; AC_SUBST([GNULIB_VSNPRINTF])
+ GNULIB_VSPRINTF_POSIX=0; AC_SUBST([GNULIB_VSPRINTF_POSIX])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_FPURGE=1; AC_SUBST([HAVE_DECL_FPURGE])
+ HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM])
+ HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE])
+ HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF])
+ HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF])
+ HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF])
+ HAVE_DPRINTF=1; AC_SUBST([HAVE_DPRINTF])
+ HAVE_RENAMEAT=1; AC_SUBST([HAVE_RENAMEAT])
+ HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF])
+ HAVE_VDPRINTF=1; AC_SUBST([HAVE_VDPRINTF])
+ REPLACE_DPRINTF=0; AC_SUBST([REPLACE_DPRINTF])
+ REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE])
+ REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH])
+ REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN])
+ REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF])
+ REPLACE_FPURGE=0; AC_SUBST([REPLACE_FPURGE])
+ REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN])
+ REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK])
+ REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO])
+ REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL])
+ REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO])
+ REPLACE_GETDELIM=0; AC_SUBST([REPLACE_GETDELIM])
+ REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE])
+ REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF])
+ REPLACE_PERROR=0; AC_SUBST([REPLACE_PERROR])
+ REPLACE_POPEN=0; AC_SUBST([REPLACE_POPEN])
+ REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF])
+ REPLACE_REMOVE=0; AC_SUBST([REPLACE_REMOVE])
+ REPLACE_RENAME=0; AC_SUBST([REPLACE_RENAME])
+ REPLACE_RENAMEAT=0; AC_SUBST([REPLACE_RENAMEAT])
+ REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF])
+ REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF])
+ REPLACE_STDIO_WRITE_FUNCS=0; AC_SUBST([REPLACE_STDIO_WRITE_FUNCS])
+ REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF])
+ REPLACE_VDPRINTF=0; AC_SUBST([REPLACE_VDPRINTF])
+ REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF])
+ REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF])
+ REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF])
+ REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF])
+])
+
+dnl Code shared by fseeko and ftello. Determine if large files are supported,
+dnl but stdin does not start as a large file by default.
+AC_DEFUN([gl_STDIN_LARGE_OFFSET],
+ [
+ AC_CACHE_CHECK([whether stdin defaults to large file offsets],
+ [gl_cv_var_stdin_large_offset],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],
+[[#if defined __SL64 && defined __SCLE /* cygwin */
+ /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making
+ fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and
+ it is easier to do a version check than building a runtime test. */
+# include <cygwin/version.h>
+# if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25)
+ choke me
+# endif
+#endif]])],
+ [gl_cv_var_stdin_large_offset=yes],
+ [gl_cv_var_stdin_large_offset=no])])
+])
diff --git a/gnulib/m4/stdlib-safer.m4 b/gnulib/m4/stdlib-safer.m4
new file mode 100644
index 00000000..2d55a660
--- /dev/null
+++ b/gnulib/m4/stdlib-safer.m4
@@ -0,0 +1,10 @@
+# stdlib-safer.m4 serial 2
+dnl Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDLIB_SAFER],
+[
+ AC_LIBOBJ([mkstemp-safer])
+])
diff --git a/gnulib/m4/stdlib_h.m4 b/gnulib/m4/stdlib_h.m4
new file mode 100644
index 00000000..0693d1a5
--- /dev/null
+++ b/gnulib/m4/stdlib_h.m4
@@ -0,0 +1,100 @@
+# stdlib_h.m4 serial 22
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDLIB_H],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([stdlib.h])
+ AC_CHECK_HEADERS([random.h], [], [], [AC_INCLUDES_DEFAULT])
+ if test $ac_cv_header_random_h = yes; then
+ HAVE_RANDOM_H=1
+ else
+ HAVE_RANDOM_H=0
+ fi
+ AC_SUBST([HAVE_RANDOM_H])
+ AC_CHECK_TYPES([struct random_data],
+ [], [HAVE_STRUCT_RANDOM_DATA=0],
+ [[#include <stdlib.h>
+ #if HAVE_RANDOM_H
+ # include <random.h>
+ #endif
+ ]])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by C89.
+ gl_WARN_ON_USE_PREPARE([[#include <stdlib.h>
+#if HAVE_SYS_LOADAVG_H
+# include <sys/loadavg.h>
+#endif
+#if HAVE_RANDOM_H
+# include <random.h>
+#endif
+ ]], [atoll canonicalize_file_name getloadavg getsubopt mkdtemp
+ mkostemp mkostemps mkstemp mkstemps random_r initstat_r srandom_r
+ setstate_r realpath rpmatch setenv strtod strtoll strtoull unsetenv])
+])
+
+AC_DEFUN([gl_STDLIB_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_STDLIB_H_DEFAULTS],
+[
+ GNULIB_ATOLL=0; AC_SUBST([GNULIB_ATOLL])
+ GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX])
+ GNULIB_CANONICALIZE_FILE_NAME=0; AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME])
+ GNULIB_GETLOADAVG=0; AC_SUBST([GNULIB_GETLOADAVG])
+ GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT])
+ GNULIB_MALLOC_POSIX=0; AC_SUBST([GNULIB_MALLOC_POSIX])
+ GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP])
+ GNULIB_MKOSTEMP=0; AC_SUBST([GNULIB_MKOSTEMP])
+ GNULIB_MKOSTEMPS=0; AC_SUBST([GNULIB_MKOSTEMPS])
+ GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP])
+ GNULIB_MKSTEMPS=0; AC_SUBST([GNULIB_MKSTEMPS])
+ GNULIB_PUTENV=0; AC_SUBST([GNULIB_PUTENV])
+ GNULIB_RANDOM_R=0; AC_SUBST([GNULIB_RANDOM_R])
+ GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX])
+ GNULIB_REALPATH=0; AC_SUBST([GNULIB_REALPATH])
+ GNULIB_RPMATCH=0; AC_SUBST([GNULIB_RPMATCH])
+ GNULIB_SETENV=0; AC_SUBST([GNULIB_SETENV])
+ GNULIB_STRTOD=0; AC_SUBST([GNULIB_STRTOD])
+ GNULIB_STRTOLL=0; AC_SUBST([GNULIB_STRTOLL])
+ GNULIB_STRTOULL=0; AC_SUBST([GNULIB_STRTOULL])
+ GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL])
+ HAVE_CALLOC_POSIX=1; AC_SUBST([HAVE_CALLOC_POSIX])
+ HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME])
+ HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG])
+ HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT])
+ HAVE_MALLOC_POSIX=1; AC_SUBST([HAVE_MALLOC_POSIX])
+ HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP])
+ HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP])
+ HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS])
+ HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS])
+ HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R])
+ HAVE_REALLOC_POSIX=1; AC_SUBST([HAVE_REALLOC_POSIX])
+ HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH])
+ HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH])
+ HAVE_SETENV=1; AC_SUBST([HAVE_SETENV])
+ HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD])
+ HAVE_STRTOLL=1; AC_SUBST([HAVE_STRTOLL])
+ HAVE_STRTOULL=1; AC_SUBST([HAVE_STRTOULL])
+ HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA])
+ HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H])
+ HAVE_UNSETENV=1; AC_SUBST([HAVE_UNSETENV])
+ REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME])
+ REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP])
+ REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV])
+ REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH])
+ REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV])
+ REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD])
+ REPLACE_UNSETENV=0; AC_SUBST([REPLACE_UNSETENV])
+])
diff --git a/gnulib/m4/stpcpy.m4 b/gnulib/m4/stpcpy.m4
new file mode 100644
index 00000000..d32d93a8
--- /dev/null
+++ b/gnulib/m4/stpcpy.m4
@@ -0,0 +1,26 @@
+# stpcpy.m4 serial 7
+dnl Copyright (C) 2002, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STPCPY],
+[
+ dnl Persuade glibc <string.h> to declare stpcpy().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl The stpcpy() declaration in lib/string.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([stpcpy])
+ if test $ac_cv_func_stpcpy = no; then
+ HAVE_STPCPY=0
+ gl_PREREQ_STPCPY
+ fi
+])
+
+# Prerequisites of lib/stpcpy.c.
+AC_DEFUN([gl_PREREQ_STPCPY], [
+ :
+])
diff --git a/gnulib/m4/stpncpy.m4 b/gnulib/m4/stpncpy.m4
new file mode 100644
index 00000000..2119515a
--- /dev/null
+++ b/gnulib/m4/stpncpy.m4
@@ -0,0 +1,69 @@
+# stpncpy.m4 serial 10
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STPNCPY],
+[
+ dnl Persuade glibc <string.h> to declare stpncpy().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl The stpncpy() declaration in lib/string.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+
+ dnl Both glibc and AIX (4.3.3, 5.1) have an stpncpy() function
+ dnl declared in <string.h>. Its side effects are the same as those
+ dnl of strncpy():
+ dnl stpncpy (dest, src, n)
+ dnl overwrites dest[0..n-1], min(strlen(src),n) bytes coming from src,
+ dnl and the remaining bytes being NULs. However, the return value is
+ dnl in glibc: dest + min(strlen(src),n)
+ dnl in AIX: dest + max(0,n-1)
+ dnl Only the glibc return value is useful in practice.
+
+ AC_CACHE_CHECK([for working stpncpy], [gl_cv_func_stpncpy], [
+ AC_TRY_RUN([
+#include <stdlib.h>
+#include <string.h> /* for strcpy */
+/* The stpncpy prototype is missing in <string.h> on AIX 4. */
+extern char *stpncpy (char *dest, const char *src, size_t n);
+int main () {
+ const char *src = "Hello";
+ char dest[10];
+ /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+1 here. */
+ strcpy (dest, "\377\377\377\377\377\377");
+ if (stpncpy (dest, src, 2) != dest + 2) exit(1);
+ /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+4 here. */
+ strcpy (dest, "\377\377\377\377\377\377");
+ if (stpncpy (dest, src, 5) != dest + 5) exit(1);
+ /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+6 here. */
+ strcpy (dest, "\377\377\377\377\377\377");
+ if (stpncpy (dest, src, 7) != dest + 5) exit(1);
+ exit(0);
+}
+], gl_cv_func_stpncpy=yes, gl_cv_func_stpncpy=no,
+ [AC_EGREP_CPP([Thanks for using GNU], [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ Thanks for using GNU
+#endif
+], gl_cv_func_stpncpy=yes, gl_cv_func_stpncpy=no)])])
+
+ if test $gl_cv_func_stpncpy = yes; then
+ AC_DEFINE([HAVE_STPNCPY], [1],
+ [Define if you have the stpncpy() function and it works.])
+ else
+ HAVE_STPNCPY=0
+ AC_LIBOBJ([stpncpy])
+ gl_PREREQ_STPNCPY
+ fi
+])
+
+# Prerequisites of lib/stpncpy.c.
+AC_DEFUN([gl_PREREQ_STPNCPY], [
+ :
+])
diff --git a/gnulib/m4/strcase.m4 b/gnulib/m4/strcase.m4
new file mode 100644
index 00000000..33de423a
--- /dev/null
+++ b/gnulib/m4/strcase.m4
@@ -0,0 +1,44 @@
+# strcase.m4 serial 10
+dnl Copyright (C) 2002, 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STRCASE],
+[
+ gl_FUNC_STRCASECMP
+ gl_FUNC_STRNCASECMP
+])
+
+AC_DEFUN([gl_FUNC_STRCASECMP],
+[
+ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
+ AC_REPLACE_FUNCS([strcasecmp])
+ if test $ac_cv_func_strcasecmp = no; then
+ HAVE_STRCASECMP=0
+ gl_PREREQ_STRCASECMP
+ fi
+])
+
+AC_DEFUN([gl_FUNC_STRNCASECMP],
+[
+ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
+ AC_REPLACE_FUNCS([strncasecmp])
+ if test $ac_cv_func_strncasecmp = no; then
+ gl_PREREQ_STRNCASECMP
+ fi
+ AC_CHECK_DECLS([strncasecmp])
+ if test $ac_cv_have_decl_strncasecmp = no; then
+ HAVE_DECL_STRNCASECMP=0
+ fi
+])
+
+# Prerequisites of lib/strcasecmp.c.
+AC_DEFUN([gl_PREREQ_STRCASECMP], [
+ :
+])
+
+# Prerequisites of lib/strncasecmp.c.
+AC_DEFUN([gl_PREREQ_STRNCASECMP], [
+ :
+])
diff --git a/gnulib/m4/strcasestr.m4 b/gnulib/m4/strcasestr.m4
new file mode 100644
index 00000000..6e940bcb
--- /dev/null
+++ b/gnulib/m4/strcasestr.m4
@@ -0,0 +1,95 @@
+# strcasestr.m4 serial 13
+dnl Copyright (C) 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check that strcasestr is present and works.
+AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+
+ dnl Persuade glibc <string.h> to declare strcasestr().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_FUNC_MEMCHR])
+ AC_CHECK_FUNCS([strcasestr])
+ if test $ac_cv_func_strcasestr = no; then
+ HAVE_STRCASESTR=0
+ else
+ if test "$gl_cv_func_memchr_works" != yes; then
+ REPLACE_STRCASESTR=1
+ fi
+ fi
+ if test $HAVE_STRCASESTR = 0 || test $REPLACE_STRCASESTR = 1; then
+ AC_LIBOBJ([strcasestr])
+ gl_PREREQ_STRCASESTR
+ fi
+]) # gl_FUNC_STRCASESTR_SIMPLE
+
+dnl Additionally, check that strcasestr is efficient.
+AC_DEFUN([gl_FUNC_STRCASESTR],
+[
+ AC_REQUIRE([gl_FUNC_STRCASESTR_SIMPLE])
+ if test $HAVE_STRCASESTR = 1 && test $REPLACE_STRCASESTR = 0; then
+ AC_CACHE_CHECK([whether strcasestr works in linear time],
+ [gl_cv_func_strcasestr_linear],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <signal.h> /* for signal */
+#include <string.h> /* for memmem */
+#include <stdlib.h> /* for malloc */
+#include <unistd.h> /* for alarm */
+]], [[size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 2);
+ char *needle = (char *) malloc (m + 2);
+ void *result = 0;
+ /* Failure to compile this test due to missing alarm is okay,
+ since all such platforms (mingw) also lack strcasestr. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (5);
+ /* Check for quadratic performance. */
+ if (haystack && needle)
+ {
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ haystack[2 * m + 1] = 0;
+ memset (needle, 'A', m);
+ needle[m] = 'B';
+ needle[m + 1] = 0;
+ result = strcasestr (haystack, needle);
+ }
+ return !result;]])],
+ [gl_cv_func_strcasestr_linear=yes], [gl_cv_func_strcasestr_linear=no],
+ [dnl Only glibc >= 2.9 and cygwin >= 1.7.0 are known to have a
+ dnl strcasestr that works in linear time.
+ AC_EGREP_CPP([Lucky user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9) || (__GLIBC__ > 2)
+ Lucky user
+ #endif
+#endif
+#ifdef __CYGWIN__
+ #include <cygwin/version.h>
+ #if CYGWIN_VERSION_DLL_MAJOR >= 1007
+ Lucky user
+ #endif
+#endif
+ ],
+ [gl_cv_func_strcasestr_linear=yes],
+ [gl_cv_func_strcasestr_linear="guessing no"])
+ ])
+ ])
+ if test "$gl_cv_func_strcasestr_linear" != yes; then
+ REPLACE_STRCASESTR=1
+ AC_LIBOBJ([strcasestr])
+ gl_PREREQ_STRCASESTR
+ fi
+ fi
+]) # gl_FUNC_STRCASESTR
+
+# Prerequisites of lib/strcasestr.c.
+AC_DEFUN([gl_PREREQ_STRCASESTR], [
+ :
+])
diff --git a/gnulib/m4/strchrnul.m4 b/gnulib/m4/strchrnul.m4
new file mode 100644
index 00000000..0072e60e
--- /dev/null
+++ b/gnulib/m4/strchrnul.m4
@@ -0,0 +1,21 @@
+# strchrnul.m4 serial 7
+dnl Copyright (C) 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRCHRNUL],
+[
+ dnl Persuade glibc <string.h> to declare strchrnul().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([strchrnul])
+ if test $ac_cv_func_strchrnul = no; then
+ HAVE_STRCHRNUL=0
+ gl_PREREQ_STRCHRNUL
+ fi
+])
+
+# Prerequisites of lib/strchrnul.c.
+AC_DEFUN([gl_PREREQ_STRCHRNUL], [:])
diff --git a/gnulib/m4/strcspn.m4 b/gnulib/m4/strcspn.m4
new file mode 100644
index 00000000..ca1c8cf1
--- /dev/null
+++ b/gnulib/m4/strcspn.m4
@@ -0,0 +1,16 @@
+# strcspn.m4 serial 3
+dnl Copyright (C) 2002-2003, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRCSPN],
+[
+ AC_REPLACE_FUNCS([strcspn])
+ if test $ac_cv_func_strcspn = no; then
+ gl_PREREQ_STRCSPN
+ fi
+])
+
+# Prerequisites of lib/strcspn.c.
+AC_DEFUN([gl_PREREQ_STRCSPN], [:])
diff --git a/gnulib/m4/strdup.m4 b/gnulib/m4/strdup.m4
new file mode 100644
index 00000000..3a3b07dd
--- /dev/null
+++ b/gnulib/m4/strdup.m4
@@ -0,0 +1,38 @@
+# strdup.m4 serial 11
+
+dnl Copyright (C) 2002-2010 Free Software Foundation, Inc.
+
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRDUP],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([strdup])
+ AC_CHECK_DECLS_ONCE([strdup])
+ if test $ac_cv_have_decl_strdup = no; then
+ HAVE_DECL_STRDUP=0
+ fi
+ gl_PREREQ_STRDUP
+])
+
+AC_DEFUN([gl_FUNC_STRDUP_POSIX],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+ if test $gl_cv_func_malloc_posix != yes; then
+ REPLACE_STRDUP=1
+ AC_LIBOBJ([strdup])
+ else
+ AC_REPLACE_FUNCS([strdup])
+ fi
+ AC_CHECK_DECLS_ONCE([strdup])
+ if test $ac_cv_have_decl_strdup = no; then
+ HAVE_DECL_STRDUP=0
+ fi
+ gl_PREREQ_STRDUP
+])
+
+# Prerequisites of lib/strdup.c.
+AC_DEFUN([gl_PREREQ_STRDUP], [:])
diff --git a/gnulib/m4/strerror.m4 b/gnulib/m4/strerror.m4
new file mode 100644
index 00000000..1649b245
--- /dev/null
+++ b/gnulib/m4/strerror.m4
@@ -0,0 +1,68 @@
+# strerror.m4 serial 9
+dnl Copyright (C) 2002, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRERROR],
+[
+ AC_REQUIRE([gl_FUNC_STRERROR_SEPARATE])
+ if test $REPLACE_STRERROR = 1; then
+ AC_LIBOBJ([strerror])
+ AC_DEFINE_UNQUOTED([REPLACE_STRERROR], [$REPLACE_STRERROR],
+ [Define this to 1 if strerror is broken.])
+ fi
+])
+
+# Like gl_FUNC_STRERROR, except prepare for separate compilation (no AC_LIBOBJ).
+AC_DEFUN([gl_FUNC_STRERROR_SEPARATE],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([gl_HEADER_ERRNO_H])
+ if test -z "$ERRNO_H"; then
+ AC_CACHE_CHECK([for working strerror function],
+ [gl_cv_func_working_strerror],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <string.h>
+ ]],
+ [[return !*strerror (-2);]])],
+ [gl_cv_func_working_strerror=yes],
+ [gl_cv_func_working_strerror=no],
+ [dnl Assume crossbuild works if it compiles.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <string.h>
+ ]],
+ [[return !*strerror (-2);]])],
+ [gl_cv_func_working_strerror=yes],
+ [gl_cv_func_working_strerror=no])
+ ])
+ ])
+ if test $gl_cv_func_working_strerror = no; then
+ dnl The system's strerror() fails to return a string for out-of-range
+ dnl integers. Replace it.
+ REPLACE_STRERROR=1
+ fi
+ else
+ dnl The system's strerror() cannot know about the new errno values we add
+ dnl to <errno.h>. Replace it.
+ REPLACE_STRERROR=1
+ fi
+ if test $REPLACE_STRERROR = 1; then
+ gl_PREREQ_STRERROR
+ fi
+])
+
+# Prerequisites of lib/strerror.c.
+AC_DEFUN([gl_PREREQ_STRERROR], [
+ AC_CHECK_DECLS([strerror])
+ AC_CHECK_HEADERS_ONCE([sys/socket.h])
+ if test $ac_cv_header_sys_socket_h != yes; then
+ dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make
+ dnl the check for those headers unconditional; yet cygwin reports
+ dnl that the headers are present but cannot be compiled (since on
+ dnl cygwin, all socket information should come from sys/socket.h).
+ AC_CHECK_HEADERS([winsock2.h])
+ fi
+])
diff --git a/gnulib/m4/strftime.m4 b/gnulib/m4/strftime.m4
new file mode 100644
index 00000000..35622400
--- /dev/null
+++ b/gnulib/m4/strftime.m4
@@ -0,0 +1,32 @@
+# serial 32
+
+# Copyright (C) 1996-1997, 1999-2007, 2009-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+# Written by Jim Meyering and Paul Eggert.
+
+AC_DEFUN([gl_FUNC_GNU_STRFTIME],
+[
+ gl_FUNC_STRFTIME
+])
+
+# These are the prerequisite macros for GNU's strftime.c replacement.
+AC_DEFUN([gl_FUNC_STRFTIME],
+[
+ AC_LIBOBJ([strftime])
+
+ # This defines (or not) HAVE_TZNAME and HAVE_TM_ZONE.
+ AC_REQUIRE([AC_STRUCT_TIMEZONE])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ AC_REQUIRE([gl_TM_GMTOFF])
+
+ AC_CHECK_FUNCS_ONCE([tzset])
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+
+ AC_DEFINE([my_strftime], [nstrftime],
+ [Define to the name of the strftime replacement function.])
+])
diff --git a/gnulib/m4/string_h.m4 b/gnulib/m4/string_h.m4
new file mode 100644
index 00000000..73c6d833
--- /dev/null
+++ b/gnulib/m4/string_h.m4
@@ -0,0 +1,104 @@
+# Configure a GNU-like replacement for <string.h>.
+
+# Copyright (C) 2007-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# serial 11
+
+# Written by Paul Eggert.
+
+AC_DEFUN([gl_HEADER_STRING_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_HEADER_STRING_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_BODY],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([string.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by C89.
+ gl_WARN_ON_USE_PREPARE([[#include <string.h>
+ ]], [memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul strdup
+ strndup strnlen strpbrk strsep strcasestr strtok_r strsignal strverscmp])
+])
+
+AC_DEFUN([gl_STRING_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS],
+[
+ GNULIB_MEMCHR=0; AC_SUBST([GNULIB_MEMCHR])
+ GNULIB_MEMMEM=0; AC_SUBST([GNULIB_MEMMEM])
+ GNULIB_MEMPCPY=0; AC_SUBST([GNULIB_MEMPCPY])
+ GNULIB_MEMRCHR=0; AC_SUBST([GNULIB_MEMRCHR])
+ GNULIB_RAWMEMCHR=0; AC_SUBST([GNULIB_RAWMEMCHR])
+ GNULIB_STPCPY=0; AC_SUBST([GNULIB_STPCPY])
+ GNULIB_STPNCPY=0; AC_SUBST([GNULIB_STPNCPY])
+ GNULIB_STRCHRNUL=0; AC_SUBST([GNULIB_STRCHRNUL])
+ GNULIB_STRDUP=0; AC_SUBST([GNULIB_STRDUP])
+ GNULIB_STRNDUP=0; AC_SUBST([GNULIB_STRNDUP])
+ GNULIB_STRNLEN=0; AC_SUBST([GNULIB_STRNLEN])
+ GNULIB_STRPBRK=0; AC_SUBST([GNULIB_STRPBRK])
+ GNULIB_STRSEP=0; AC_SUBST([GNULIB_STRSEP])
+ GNULIB_STRSTR=0; AC_SUBST([GNULIB_STRSTR])
+ GNULIB_STRCASESTR=0; AC_SUBST([GNULIB_STRCASESTR])
+ GNULIB_STRTOK_R=0; AC_SUBST([GNULIB_STRTOK_R])
+ GNULIB_MBSLEN=0; AC_SUBST([GNULIB_MBSLEN])
+ GNULIB_MBSNLEN=0; AC_SUBST([GNULIB_MBSNLEN])
+ GNULIB_MBSCHR=0; AC_SUBST([GNULIB_MBSCHR])
+ GNULIB_MBSRCHR=0; AC_SUBST([GNULIB_MBSRCHR])
+ GNULIB_MBSSTR=0; AC_SUBST([GNULIB_MBSSTR])
+ GNULIB_MBSCASECMP=0; AC_SUBST([GNULIB_MBSCASECMP])
+ GNULIB_MBSNCASECMP=0; AC_SUBST([GNULIB_MBSNCASECMP])
+ GNULIB_MBSPCASECMP=0; AC_SUBST([GNULIB_MBSPCASECMP])
+ GNULIB_MBSCASESTR=0; AC_SUBST([GNULIB_MBSCASESTR])
+ GNULIB_MBSCSPN=0; AC_SUBST([GNULIB_MBSCSPN])
+ GNULIB_MBSPBRK=0; AC_SUBST([GNULIB_MBSPBRK])
+ GNULIB_MBSSPN=0; AC_SUBST([GNULIB_MBSSPN])
+ GNULIB_MBSSEP=0; AC_SUBST([GNULIB_MBSSEP])
+ GNULIB_MBSTOK_R=0; AC_SUBST([GNULIB_MBSTOK_R])
+ GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR])
+ GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL])
+ GNULIB_STRVERSCMP=0; AC_SUBST([GNULIB_STRVERSCMP])
+ HAVE_MBSLEN=0; AC_SUBST([HAVE_MBSLEN])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM])
+ HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY])
+ HAVE_DECL_MEMRCHR=1; AC_SUBST([HAVE_DECL_MEMRCHR])
+ HAVE_RAWMEMCHR=1; AC_SUBST([HAVE_RAWMEMCHR])
+ HAVE_STPCPY=1; AC_SUBST([HAVE_STPCPY])
+ HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY])
+ HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL])
+ HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP])
+ HAVE_DECL_STRNDUP=1; AC_SUBST([HAVE_DECL_STRNDUP])
+ HAVE_DECL_STRNLEN=1; AC_SUBST([HAVE_DECL_STRNLEN])
+ HAVE_STRPBRK=1; AC_SUBST([HAVE_STRPBRK])
+ HAVE_STRSEP=1; AC_SUBST([HAVE_STRSEP])
+ HAVE_STRCASESTR=1; AC_SUBST([HAVE_STRCASESTR])
+ HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R])
+ HAVE_DECL_STRERROR=1; AC_SUBST([HAVE_DECL_STRERROR])
+ HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL])
+ HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP])
+ REPLACE_MEMCHR=0; AC_SUBST([REPLACE_MEMCHR])
+ REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM])
+ REPLACE_STRDUP=0; AC_SUBST([REPLACE_STRDUP])
+ REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR])
+ REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR])
+ REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR])
+ REPLACE_STRNDUP=0; AC_SUBST([REPLACE_STRNDUP])
+ REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL])
+ REPLACE_STRTOK_R=0; AC_SUBST([REPLACE_STRTOK_R])
+ UNDEFINE_STRTOK_R=0; AC_SUBST([UNDEFINE_STRTOK_R])
+])
diff --git a/gnulib/m4/strings_h.m4 b/gnulib/m4/strings_h.m4
new file mode 100644
index 00000000..26aa1f78
--- /dev/null
+++ b/gnulib/m4/strings_h.m4
@@ -0,0 +1,39 @@
+# Configure a replacement for <string.h>.
+# serial 2
+
+# Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+AC_DEFUN([gl_HEADER_STRINGS_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_HEADER_STRINGS_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_STRINGS_H_BODY],
+[
+ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([strings.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <strings.h>
+ ]], [strcasecmp strncasecmp])
+])
+
+AC_DEFUN([gl_STRINGS_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_HEADER_STRINGS_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_STRCASECMP=1; AC_SUBST([HAVE_STRCASECMP])
+ HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP])
+])
diff --git a/gnulib/m4/strndup.m4 b/gnulib/m4/strndup.m4
new file mode 100644
index 00000000..810313cd
--- /dev/null
+++ b/gnulib/m4/strndup.m4
@@ -0,0 +1,49 @@
+# strndup.m4 serial 17
+dnl Copyright (C) 2002-2003, 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRNDUP],
+[
+ dnl Persuade glibc <string.h> to declare strndup().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_DECLS_ONCE([strndup])
+ AC_CHECK_FUNCS_ONCE([strndup])
+ if test $ac_cv_have_decl_strndup = no; then
+ HAVE_DECL_STRNDUP=0
+ fi
+
+ if test $ac_cv_func_strndup = yes; then
+ # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
+ AC_CACHE_CHECK([for working strndup], [gl_cv_func_strndup_works],
+ [AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[#include <string.h>
+ #include <stdlib.h>]], [[
+#ifndef HAVE_DECL_STRNDUP
+ extern char *strndup (const char *, size_t);
+#endif
+ char *s;
+ s = strndup ("some longer string", 15);
+ free (s);
+ s = strndup ("shorter string", 13);
+ return s[13] != '\0';]])],
+ [gl_cv_func_strndup_works=yes],
+ [gl_cv_func_strndup_works=no],
+ [case $host_os in
+ aix*) gl_cv_func_strndup_works="guessing no";;
+ *) gl_cv_func_strndup_works="guessing yes";;
+ esac])])
+ case $gl_cv_func_strndup_works in
+ *no)
+ REPLACE_STRNDUP=1
+ AC_LIBOBJ([strndup])
+ ;;
+ esac
+ else
+ AC_LIBOBJ([strndup])
+ fi
+])
diff --git a/gnulib/m4/strnlen.m4 b/gnulib/m4/strnlen.m4
new file mode 100644
index 00000000..cd48948f
--- /dev/null
+++ b/gnulib/m4/strnlen.m4
@@ -0,0 +1,32 @@
+# strnlen.m4 serial 10
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRNLEN],
+[
+ dnl Persuade glibc <string.h> to declare strnlen().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_DECLS_ONCE([strnlen])
+ if test $ac_cv_have_decl_strnlen = no; then
+ HAVE_DECL_STRNLEN=0
+ fi
+
+ AC_FUNC_STRNLEN
+ if test $ac_cv_func_strnlen_working = no; then
+ # This is necessary because automake-1.6.1 doesn't understand
+ # that the above use of AC_FUNC_STRNLEN means we may have to use
+ # lib/strnlen.c.
+ #AC_LIBOBJ([strnlen])
+ AC_DEFINE([strnlen], [rpl_strnlen],
+ [Define to rpl_strnlen if the replacement function should be used.])
+ gl_PREREQ_STRNLEN
+ fi
+])
+
+# Prerequisites of lib/strnlen.c.
+AC_DEFUN([gl_PREREQ_STRNLEN], [:])
diff --git a/gnulib/m4/strpbrk.m4 b/gnulib/m4/strpbrk.m4
new file mode 100644
index 00000000..b4ec18a1
--- /dev/null
+++ b/gnulib/m4/strpbrk.m4
@@ -0,0 +1,18 @@
+# strpbrk.m4 serial 5
+dnl Copyright (C) 2002-2003, 2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRPBRK],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([strpbrk])
+ if test $ac_cv_func_strpbrk = no; then
+ HAVE_STRPBRK=0
+ gl_PREREQ_STRPBRK
+ fi
+])
+
+# Prerequisites of lib/strpbrk.c.
+AC_DEFUN([gl_PREREQ_STRPBRK], [:])
diff --git a/gnulib/m4/strptime.m4 b/gnulib/m4/strptime.m4
new file mode 100644
index 00000000..7c081f1e
--- /dev/null
+++ b/gnulib/m4/strptime.m4
@@ -0,0 +1,18 @@
+# strptime.m4 serial 5
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRPTIME],
+[
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REPLACE_FUNCS([strptime])
+ AC_REQUIRE([gl_TM_GMTOFF])
+ if test $ac_cv_func_strptime = yes; then
+ REPLACE_STRPTIME=0
+ else
+ REPLACE_STRPTIME=1
+ fi
+])
diff --git a/gnulib/m4/strsep.m4 b/gnulib/m4/strsep.m4
new file mode 100644
index 00000000..fb4d396b
--- /dev/null
+++ b/gnulib/m4/strsep.m4
@@ -0,0 +1,25 @@
+# strsep.m4 serial 9
+dnl Copyright (C) 2002, 2003, 2004, 2007, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRSEP],
+[
+ dnl Persuade glibc <string.h> to declare strsep().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl The strsep() declaration in lib/string.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([strsep])
+ if test $ac_cv_func_strsep = no; then
+ HAVE_STRSEP=0
+ gl_PREREQ_STRSEP
+ fi
+])
+
+# Prerequisites of lib/strsep.c.
+AC_DEFUN([gl_PREREQ_STRSEP], [:])
diff --git a/gnulib/m4/strsignal.m4 b/gnulib/m4/strsignal.m4
new file mode 100644
index 00000000..be3c7339
--- /dev/null
+++ b/gnulib/m4/strsignal.m4
@@ -0,0 +1,55 @@
+# strsignal.m4 serial 3
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRSIGNAL],
+[
+ dnl Persuade glibc <string.h> to declare strsignal().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_CHECK_DECLS_ONCE([strsignal])
+ if test $ac_cv_have_decl_strsignal = no; then
+ HAVE_DECL_STRSIGNAL=0
+ fi
+
+ AC_CHECK_FUNCS([strsignal])
+ if test $ac_cv_func_strsignal = yes; then
+ dnl Check if strsignal behaves reasonably for out-of-range signal numbers.
+ dnl On Solaris it returns NULL; on AIX 5.1 it returns (char *) -1.
+ AC_CACHE_CHECK([whether strsignal always returns a string],
+ [gl_cv_func_working_strsignal],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <string.h>
+ ]],
+ [[char *s = strsignal (-1);
+ return !(s != (char *) 0 && s != (char *) -1);]])],
+ [gl_cv_func_working_strsignal=yes],
+ [gl_cv_func_working_strsignal=no],
+ [case "$host_os" in
+ solaris* | aix*) gl_cv_func_working_strsignal=no;;
+ *) gl_cv_func_working_strsignal="guessing yes";;
+ esac])])
+ else
+ gl_cv_func_working_strsignal=no
+ fi
+
+ if test "$gl_cv_func_working_strsignal" = no; then
+ if test $ac_cv_func_strsignal = yes; then
+ REPLACE_STRSIGNAL=1
+ fi
+ AC_LIBOBJ([strsignal])
+ gl_PREREQ_STRSIGNAL
+ fi
+])
+
+# Prerequisites of lib/strsignal.c.
+AC_DEFUN([gl_PREREQ_STRSIGNAL], [
+ AC_REQUIRE([AC_DECL_SYS_SIGLIST])
+ AC_CHECK_DECLS([_sys_siglist], [], [], [#include <signal.h>])
+])
diff --git a/gnulib/m4/strstr.m4 b/gnulib/m4/strstr.m4
new file mode 100644
index 00000000..779957aa
--- /dev/null
+++ b/gnulib/m4/strstr.m4
@@ -0,0 +1,79 @@
+# strstr.m4 serial 7
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check that strstr works.
+AC_DEFUN([gl_FUNC_STRSTR_SIMPLE],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_MEMCHR])
+ if test "$gl_cv_func_memchr_works" != yes; then
+ REPLACE_STRSTR=1
+ AC_LIBOBJ([strstr])
+ fi
+]) # gl_FUNC_STRSTR_SIMPLE
+
+dnl Additionally, check that strstr is efficient.
+AC_DEFUN([gl_FUNC_STRSTR],
+[
+ AC_REQUIRE([gl_FUNC_STRSTR_SIMPLE])
+ if test $REPLACE_STRSTR = 0; then
+ AC_CACHE_CHECK([whether strstr works in linear time],
+ [gl_cv_func_strstr_linear],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <signal.h> /* for signal */
+#include <string.h> /* for memmem */
+#include <stdlib.h> /* for malloc */
+#include <unistd.h> /* for alarm */
+]], [[size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 2);
+ char *needle = (char *) malloc (m + 2);
+ void *result = 0;
+ /* Failure to compile this test due to missing alarm is okay,
+ since all such platforms (mingw) also have quadratic strstr. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (5);
+ /* Check for quadratic performance. */
+ if (haystack && needle)
+ {
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ haystack[2 * m + 1] = 0;
+ memset (needle, 'A', m);
+ needle[m] = 'B';
+ needle[m + 1] = 0;
+ result = strstr (haystack, needle);
+ }
+ return !result;]])],
+ [gl_cv_func_strstr_linear=yes], [gl_cv_func_strstr_linear=no],
+ [dnl Only glibc >= 2.9 and cygwin >= 1.7.0 are known to have a
+ dnl strstr that works in linear time.
+ AC_EGREP_CPP([Lucky user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9) || (__GLIBC__ > 2)
+ Lucky user
+ #endif
+#endif
+#ifdef __CYGWIN__
+ #include <cygwin/version.h>
+ #if CYGWIN_VERSION_DLL_MAJOR >= 1007
+ Lucky user
+ #endif
+#endif
+ ],
+ [gl_cv_func_strstr_linear=yes],
+ [gl_cv_func_strstr_linear="guessing no"])
+ ])
+ ])
+ if test "$gl_cv_func_strstr_linear" != yes; then
+ REPLACE_STRSTR=1
+ fi
+ fi
+ if test $REPLACE_STRSTR = 1; then
+ AC_LIBOBJ([strstr])
+ fi
+]) # gl_FUNC_STRSTR
diff --git a/gnulib/m4/strtod.m4 b/gnulib/m4/strtod.m4
new file mode 100644
index 00000000..6b2d7317
--- /dev/null
+++ b/gnulib/m4/strtod.m4
@@ -0,0 +1,90 @@
+# strtod.m4 serial 13
+dnl Copyright (C) 2002-2003, 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOD],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_FUNC_STRTOD
+ dnl Note: AC_FUNC_STRTOD does AC_LIBOBJ([strtod]).
+ if test $ac_cv_func_strtod = no; then
+ HAVE_STRTOD=0
+ REPLACE_STRTOD=1
+ gl_PREREQ_STRTOD
+ else
+ AC_CACHE_CHECK([whether strtod obeys C99], [gl_cv_func_strtod_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <stdlib.h>
+#include <math.h>
+#include <errno.h>
+/* Compare two numbers with ==.
+ This is a separate function because IRIX 6.5 "cc -O" miscompiles an
+ 'x == x' test. */
+static int
+numeric_equal (double x, double y)
+{
+ return x == y;
+}
+]], [[
+ {
+ /* Older glibc and Cygwin mis-parse "-0x". */
+ const char *string = "-0x";
+ char *term;
+ double value = strtod (string, &term);
+ double zero = 0.0;
+ if (1.0 / value != -1.0 / zero || term != (string + 2))
+ return 1;
+ }
+ {
+ /* Many platforms do not parse hex floats. */
+ const char *string = "0XaP+1";
+ char *term;
+ double value = strtod (string, &term);
+ if (value != 20.0 || term != (string + 6))
+ return 1;
+ }
+ {
+ /* Many platforms do not parse infinities. HP-UX 11.31 parses inf,
+ but mistakenly sets errno. */
+ const char *string = "inf";
+ char *term;
+ double value;
+ errno = 0;
+ value = strtod (string, &term);
+ if (value != HUGE_VAL || term != (string + 3) || errno)
+ return 1;
+ }
+ {
+ /* glibc 2.7 and cygwin 1.5.24 misparse "nan()". */
+ const char *string = "nan()";
+ char *term;
+ double value = strtod (string, &term);
+ if (numeric_equal (value, value) || term != (string + 5))
+ return 1;
+ }
+ {
+ /* darwin 10.6.1 misparses "nan(". */
+ const char *string = "nan(";
+ char *term;
+ double value = strtod (string, &term);
+ if (numeric_equal (value, value) || term != (string + 3))
+ return 1;
+ }
+]])],
+ [gl_cv_func_strtod_works=yes],
+ [gl_cv_func_strtod_works=no],
+ [gl_cv_func_strtod_works="guessing no"])])
+ if test "$gl_cv_func_strtod_works" != yes; then
+ REPLACE_STRTOD=1
+ gl_PREREQ_STRTOD
+ dnl Use undocumented macro to set POW_LIB correctly.
+ _AC_LIBOBJ_STRTOD
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtod.c.
+# The need for pow() is already handled by AC_FUNC_STRTOD.
+AC_DEFUN([gl_PREREQ_STRTOD], [:])
diff --git a/gnulib/m4/strtoimax.m4 b/gnulib/m4/strtoimax.m4
new file mode 100644
index 00000000..8d8298b9
--- /dev/null
+++ b/gnulib/m4/strtoimax.m4
@@ -0,0 +1,35 @@
+# strtoimax.m4 serial 7
+dnl Copyright (C) 2002, 2003, 2004, 2006, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOIMAX],
+[
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+
+ AC_CACHE_CHECK([whether <inttypes.h> defines strtoimax as a macro],
+ gl_cv_func_strtoimax_macro,
+ [AC_EGREP_CPP([inttypes_h_defines_strtoimax], [#include <inttypes.h>
+#ifdef strtoimax
+ inttypes_h_defines_strtoimax
+#endif],
+ gl_cv_func_strtoimax_macro=yes,
+ gl_cv_func_strtoimax_macro=no)])
+
+ if test "$gl_cv_func_strtoimax_macro" != yes; then
+ AC_REPLACE_FUNCS([strtoimax])
+ if test $ac_cv_func_strtoimax = no; then
+ gl_PREREQ_STRTOIMAX
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtoimax.c.
+AC_DEFUN([gl_PREREQ_STRTOIMAX], [
+ AC_CHECK_DECLS([strtoll])
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+])
diff --git a/gnulib/m4/strtok_r.m4 b/gnulib/m4/strtok_r.m4
new file mode 100644
index 00000000..f9847da0
--- /dev/null
+++ b/gnulib/m4/strtok_r.m4
@@ -0,0 +1,73 @@
+# strtok_r.m4 serial 9
+dnl Copyright (C) 2002, 2003, 2004, 2007, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOK_R],
+[
+ dnl The strtok_r() declaration in lib/string.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_FUNCS([strtok_r])
+ if test $ac_cv_func_strtok_r = yes; then
+ dnl glibc 2.7 has a bug in strtok_r that causes a segmentation fault
+ dnl when the second argument to strtok_r is a constant string that has
+ dnl exactly one byte and compiling with optimization.  This bug is, for
+ dnl example, present in the glibc 2.7-18 package in Debian "lenny".
+ dnl See <http://sources.redhat.com/bugzilla/show_bug.cgi?id=5614>.
+ AC_CACHE_CHECK([whether strtok_r works], [gl_cv_func_strtok_r_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #ifndef __OPTIMIZE__
+ # define __OPTIMIZE__ 1
+ #endif
+ #undef __OPTIMIZE_SIZE__
+ #undef __NO_INLINE__
+ #include <stdlib.h>
+ #include <string.h>
+ ]],
+ [[char delimiters[] = "xxxxxxxx";
+             char *save_ptr = (char *) 0xd0d0;
+             strtok_r (delimiters, "x", &save_ptr);
+             strtok_r (NULL, "x", &save_ptr);
+             return 0;
+ ]])
+ ],
+ [gl_cv_func_strtok_r_works=yes],
+ [gl_cv_func_strtok_r_works=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on glibc systems.
+ *-gnu*) gl_cv_func_strtok_r_works="guessing no";;
+ *) gl_cv_func_strtok_r_works="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+ case "$gl_cv_func_strtok_r_works" in
+ *no)
+ dnl We could set REPLACE_STRTOK_R=1 and AC_LIBOBJ([strtok_r]) here,
+ dnl but it's only the macro version in <bits/string2.h> which is wrong.
+ dnl The code compiled into libc is fine.
+ UNDEFINE_STRTOK_R=1
+ ;;
+ esac
+ else
+ AC_LIBOBJ([strtok_r])
+ fi
+ AC_CHECK_DECLS_ONCE([strtok_r])
+ if test $ac_cv_have_decl_strtok_r = no; then
+ HAVE_DECL_STRTOK_R=0
+ fi
+ gl_PREREQ_STRTOK_R
+])
+
+# Prerequisites of lib/strtok_r.c.
+AC_DEFUN([gl_PREREQ_STRTOK_R], [
+ :
+])
diff --git a/gnulib/m4/strtol.m4 b/gnulib/m4/strtol.m4
new file mode 100644
index 00000000..2f27ce88
--- /dev/null
+++ b/gnulib/m4/strtol.m4
@@ -0,0 +1,10 @@
+# strtol.m4 serial 5
+dnl Copyright (C) 2002, 2003, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOL],
+[
+ AC_REPLACE_FUNCS([strtol])
+])
diff --git a/gnulib/m4/strtoll.m4 b/gnulib/m4/strtoll.m4
new file mode 100644
index 00000000..065047a6
--- /dev/null
+++ b/gnulib/m4/strtoll.m4
@@ -0,0 +1,26 @@
+# strtoll.m4 serial 6
+dnl Copyright (C) 2002, 2004, 2006, 2008, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOLL],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ dnl We don't need (and can't compile) the replacement strtoll
+ dnl unless the type 'long long int' exists.
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ if test "$ac_cv_type_long_long_int" = yes; then
+ AC_REPLACE_FUNCS([strtoll])
+ if test $ac_cv_func_strtoll = no; then
+ HAVE_STRTOLL=0
+ gl_PREREQ_STRTOLL
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtoll.c.
+AC_DEFUN([gl_PREREQ_STRTOLL], [
+ :
+])
diff --git a/gnulib/m4/strtoul.m4 b/gnulib/m4/strtoul.m4
new file mode 100644
index 00000000..5da011c5
--- /dev/null
+++ b/gnulib/m4/strtoul.m4
@@ -0,0 +1,10 @@
+# strtoul.m4 serial 4
+dnl Copyright (C) 2002, 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOUL],
+[
+ AC_REPLACE_FUNCS([strtoul])
+])
diff --git a/gnulib/m4/strtoull.m4 b/gnulib/m4/strtoull.m4
new file mode 100644
index 00000000..e58e1366
--- /dev/null
+++ b/gnulib/m4/strtoull.m4
@@ -0,0 +1,26 @@
+# strtoull.m4 serial 6
+dnl Copyright (C) 2002, 2004, 2006, 2008, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOULL],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ dnl We don't need (and can't compile) the replacement strtoull
+ dnl unless the type 'unsigned long long int' exists.
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ if test "$ac_cv_type_unsigned_long_long_int" = yes; then
+ AC_REPLACE_FUNCS([strtoull])
+ if test $ac_cv_func_strtoull = no; then
+ HAVE_STRTOULL=0
+ gl_PREREQ_STRTOULL
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtoull.c.
+AC_DEFUN([gl_PREREQ_STRTOULL], [
+ :
+])
diff --git a/gnulib/m4/strtoumax.m4 b/gnulib/m4/strtoumax.m4
new file mode 100644
index 00000000..684634f5
--- /dev/null
+++ b/gnulib/m4/strtoumax.m4
@@ -0,0 +1,35 @@
+# strtoumax.m4 serial 7
+dnl Copyright (C) 2002, 2003, 2004, 2006, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOUMAX],
+[
+ dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
+ AC_REQUIRE([AC_PROG_CPP])
+ AC_REQUIRE([AC_PROG_EGREP])
+
+ AC_CACHE_CHECK([whether <inttypes.h> defines strtoumax as a macro],
+ gl_cv_func_strtoumax_macro,
+ [AC_EGREP_CPP([inttypes_h_defines_strtoumax], [#include <inttypes.h>
+#ifdef strtoumax
+ inttypes_h_defines_strtoumax
+#endif],
+ gl_cv_func_strtoumax_macro=yes,
+ gl_cv_func_strtoumax_macro=no)])
+
+ if test "$gl_cv_func_strtoumax_macro" != yes; then
+ AC_REPLACE_FUNCS([strtoumax])
+ if test $ac_cv_func_strtoumax = no; then
+ gl_PREREQ_STRTOUMAX
+ fi
+ fi
+])
+
+# Prerequisites of lib/strtoumax.c.
+AC_DEFUN([gl_PREREQ_STRTOUMAX], [
+ AC_CHECK_DECLS([strtoull])
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+])
diff --git a/gnulib/m4/strverscmp.m4 b/gnulib/m4/strverscmp.m4
new file mode 100644
index 00000000..59e0950f
--- /dev/null
+++ b/gnulib/m4/strverscmp.m4
@@ -0,0 +1,23 @@
+# strverscmp.m4 serial 7
+dnl Copyright (C) 2002, 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRVERSCMP],
+[
+ dnl Persuade glibc <string.h> to declare strverscmp().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REPLACE_FUNCS([strverscmp])
+ if test $ac_cv_func_strverscmp = no; then
+ gl_PREREQ_STRVERSCMP
+ HAVE_STRVERSCMP=0
+ fi
+])
+
+# Prerequisites of lib/strverscmp.c.
+AC_DEFUN([gl_PREREQ_STRVERSCMP], [
+ :
+])
diff --git a/gnulib/m4/symlink.m4 b/gnulib/m4/symlink.m4
new file mode 100644
index 00000000..3d14e692
--- /dev/null
+++ b/gnulib/m4/symlink.m4
@@ -0,0 +1,38 @@
+# serial 2
+# See if we need to provide symlink replacement.
+
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_SYMLINK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([symlink])
+ dnl The best we can do on mingw is provide a dummy that always fails, so
+ dnl that compilation can proceed with fewer ifdefs. On Solaris 9 and
+ dnl FreeBSD 7.2, we want to fix a bug with trailing slash handling.
+ if test $ac_cv_func_symlink = no; then
+ HAVE_SYMLINK=0
+ AC_LIBOBJ([symlink])
+ else
+ AC_CACHE_CHECK([whether symlink handles trailing slash correctly],
+ [gl_cv_func_symlink_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+]], [[if (!symlink ("a", "conftest.link/")) return 1;
+ if (symlink ("conftest.f", "conftest.lnk2")) return 2;
+ if (!symlink ("a", "conftest.lnk2/")) return 3;]])],
+ [gl_cv_func_symlink_works=yes], [gl_cv_func_symlink_works=no],
+ [gl_cv_func_symlink_works="guessing no"])
+ rm -f conftest.f conftest.link conftest.lnk2])
+ if test "$gl_cv_func_symlink_works" != yes; then
+ REPLACE_SYMLINK=1
+ AC_LIBOBJ([symlink])
+ fi
+ fi
+])
diff --git a/gnulib/m4/symlinkat.m4 b/gnulib/m4/symlinkat.m4
new file mode 100644
index 00000000..8466944a
--- /dev/null
+++ b/gnulib/m4/symlinkat.m4
@@ -0,0 +1,23 @@
+# serial 3
+# See if we need to provide symlinkat/readlinkat replacement.
+
+dnl Copyright (C) 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_SYMLINKAT],
+[
+ AC_REQUIRE([gl_FUNC_OPENAT])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([symlinkat readlinkat])
+ if test $ac_cv_func_symlinkat = no; then
+ # No known system has readlinkat but not symlinkat
+ HAVE_SYMLINKAT=0
+ HAVE_READLINKAT=0
+ AC_LIBOBJ([symlinkat])
+ fi
+])
diff --git a/gnulib/m4/sys_file_h.m4 b/gnulib/m4/sys_file_h.m4
new file mode 100644
index 00000000..d864dad3
--- /dev/null
+++ b/gnulib/m4/sys_file_h.m4
@@ -0,0 +1,45 @@
+# Configure a replacement for <sys/file.h>.
+# serial 3
+
+# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Richard W.M. Jones.
+
+AC_DEFUN([gl_HEADER_SYS_FILE_H],
+[
+ AC_REQUIRE([gl_HEADER_SYS_FILE_H_DEFAULTS])
+
+ dnl Only flock is defined in a working <sys/file.h>. If that
+ dnl function is already there, we don't want to do any substitution.
+ AC_CHECK_FUNCS_ONCE([flock])
+
+ gl_CHECK_NEXT_HEADERS([sys/file.h])
+
+ AC_CHECK_HEADERS_ONCE([sys/file.h])
+ if test $ac_cv_header_sys_file_h = yes; then
+ HAVE_SYS_FILE_H=1
+ else
+ HAVE_SYS_FILE_H=0
+ fi
+ AC_SUBST([HAVE_SYS_FILE_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <sys/file.h>
+ ]], [flock])
+])
+
+AC_DEFUN([gl_HEADER_SYS_FILE_MODULE_INDICATOR],
+[
+ AC_REQUIRE([gl_HEADER_SYS_FILE_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_HEADER_SYS_FILE_H_DEFAULTS],
+[
+ GNULIB_FLOCK=0; AC_SUBST([GNULIB_FLOCK])
+ HAVE_FLOCK=1; AC_SUBST([HAVE_FLOCK])
+])
diff --git a/gnulib/m4/sys_ioctl_h.m4 b/gnulib/m4/sys_ioctl_h.m4
new file mode 100644
index 00000000..829dc610
--- /dev/null
+++ b/gnulib/m4/sys_ioctl_h.m4
@@ -0,0 +1,68 @@
+# sys_ioctl_h.m4 serial 5
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN([gl_SYS_IOCTL_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])
+
+ AC_CHECK_HEADERS_ONCE([sys/ioctl.h])
+ if test $ac_cv_header_sys_ioctl_h = yes; then
+ HAVE_SYS_IOCTL_H=1
+ dnl Test whether <sys/ioctl.h> declares ioctl(), or whether some other
+ dnl header file, such as <unistd.h> or <stropts.h>, is needed for that.
+ AC_CACHE_CHECK([whether <sys/ioctl.h> declares ioctl],
+ [gl_cv_decl_ioctl_in_sys_ioctl_h],
+ [dnl We cannot use AC_CHECK_DECL because it produces its own messages.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT([#include <sys/ioctl.h>])],
+ [(void) ioctl;])],
+ [gl_cv_decl_ioctl_in_sys_ioctl_h=yes],
+ [gl_cv_decl_ioctl_in_sys_ioctl_h=no])
+ ])
+ else
+ HAVE_SYS_IOCTL_H=0
+ fi
+ AC_SUBST([HAVE_SYS_IOCTL_H])
+ dnl <sys/ioctl.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([sys/ioctl.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <sys/ioctl.h>
+/* Some platforms declare ioctl in the wrong header. */
+#ifndef __GLIBC__
+# include <unistd.h>
+#endif
+ ]], [ioctl])
+])
+
+dnl Unconditionally enables the replacement of <sys/ioctl.h>.
+AC_DEFUN([gl_REPLACE_SYS_IOCTL_H],
+[
+ dnl This is a no-op, because <sys/ioctl.h> is always overridden.
+ :
+])
+
+AC_DEFUN([gl_SYS_IOCTL_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SYS_IOCTL_H_DEFAULTS],
+[
+ GNULIB_IOCTL=0; AC_SUBST([GNULIB_IOCTL])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=0; AC_SUBST([SYS_IOCTL_H_HAVE_WINSOCK2_H])
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+ AC_SUBST([SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
+])
diff --git a/gnulib/m4/sys_select_h.m4 b/gnulib/m4/sys_select_h.m4
new file mode 100644
index 00000000..590554a1
--- /dev/null
+++ b/gnulib/m4/sys_select_h.m4
@@ -0,0 +1,84 @@
+# sys_select_h.m4 serial 11
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HEADER_SYS_SELECT],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ AC_REQUIRE([gl_SYS_SELECT_H_DEFAULTS])
+ AC_CACHE_CHECK([whether <sys/select.h> is self-contained],
+ [gl_cv_header_sys_select_h_selfcontained],
+ [
+ dnl Test against two bugs:
+ dnl 1. On many platforms, <sys/select.h> assumes prior inclusion of
+ dnl <sys/types.h>.
+ dnl 2. On OSF/1 4.0, <sys/select.h> provides only a forward declaration
+ dnl of 'struct timeval', and no definition of this type.
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/select.h>]],
+ [[struct timeval b;]])],
+ [gl_cv_header_sys_select_h_selfcontained=yes],
+ [gl_cv_header_sys_select_h_selfcontained=no])
+ dnl Test against another bug:
+ dnl 3. On Solaris 10, <sys/select.h> provides an FD_ZERO implementation
+ dnl that relies on memset(), but without including <string.h>.
+ if test $gl_cv_header_sys_select_h_selfcontained = yes; then
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/select.h>]],
+ [[int memset; int bzero;]])
+ ],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/select.h>]], [[
+ #undef memset
+ #define memset nonexistent_memset
+ extern void *memset (void *, int, unsigned long);
+ #undef bzero
+ #define bzero nonexistent_bzero
+ extern void bzero (void *, unsigned long);
+ fd_set fds;
+ FD_ZERO (&fds);
+ ]])
+ ],
+ [],
+ [gl_cv_header_sys_select_h_selfcontained=no])
+ ])
+ fi
+ ])
+ AC_CHECK_HEADERS_ONCE([sys/select.h])
+ gl_CHECK_NEXT_HEADERS([sys/select.h])
+ if test $ac_cv_header_sys_select_h = yes; then
+ HAVE_SYS_SELECT_H=1
+ else
+ HAVE_SYS_SELECT_H=0
+ fi
+ AC_SUBST([HAVE_SYS_SELECT_H])
+ if test $gl_cv_header_sys_select_h_selfcontained != yes; then
+ gl_PREREQ_SYS_H_WINSOCK2
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+/* Some systems require prerequisite headers. */
+#include <sys/types.h>
+#if !defined __GLIBC__ && HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#include <sys/select.h>
+ ]], [select])
+])
+
+AC_DEFUN([gl_SYS_SELECT_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_SELECT_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SYS_SELECT_H_DEFAULTS],
+[
+ GNULIB_SELECT=0; AC_SUBST([GNULIB_SELECT])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ REPLACE_SELECT=0; AC_SUBST([REPLACE_SELECT])
+])
diff --git a/gnulib/m4/sys_socket_h.m4 b/gnulib/m4/sys_socket_h.m4
new file mode 100644
index 00000000..1d476560
--- /dev/null
+++ b/gnulib/m4/sys_socket_h.m4
@@ -0,0 +1,159 @@
+# sys_socket_h.m4 serial 14
+dnl Copyright (C) 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson.
+
+AC_DEFUN([gl_HEADER_SYS_SOCKET],
+[
+ AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+ AC_REQUIRE([AC_C_INLINE])
+
+ AC_CACHE_CHECK([whether <sys/socket.h> is self-contained],
+ [gl_cv_header_sys_socket_h_selfcontained],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]], [[]])],
+ [gl_cv_header_sys_socket_h_selfcontained=yes],
+ [gl_cv_header_sys_socket_h_selfcontained=no])
+ ])
+ if test $gl_cv_header_sys_socket_h_selfcontained = yes; then
+ SYS_SOCKET_H=''
+ dnl If the shutdown function exists, <sys/socket.h> should define
+ dnl SHUT_RD, SHUT_WR, SHUT_RDWR.
+ AC_CHECK_FUNCS([shutdown])
+ if test $ac_cv_func_shutdown = yes; then
+ AC_CACHE_CHECK([whether <sys/socket.h> defines the SHUT_* macros],
+ [gl_cv_header_sys_socket_h_shut],
+ [
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/socket.h>]],
+ [[int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };]])],
+ [gl_cv_header_sys_socket_h_shut=yes],
+ [gl_cv_header_sys_socket_h_shut=no])
+ ])
+ if test $gl_cv_header_sys_socket_h_shut = no; then
+ SYS_SOCKET_H='sys/socket.h'
+ fi
+ fi
+ else
+ SYS_SOCKET_H='sys/socket.h'
+ fi
+ # We need to check for ws2tcpip.h now.
+ gl_PREREQ_SYS_H_SOCKET
+ AC_CHECK_TYPES([struct sockaddr_storage, sa_family_t],,,[
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+])
+ if test $ac_cv_type_struct_sockaddr_storage = no; then
+ HAVE_STRUCT_SOCKADDR_STORAGE=0
+ SYS_SOCKET_H='sys/socket.h'
+ fi
+ if test $ac_cv_type_sa_family_t = no; then
+ HAVE_SA_FAMILY_T=0
+ SYS_SOCKET_H='sys/socket.h'
+ fi
+ if test -n "$SYS_SOCKET_H"; then
+ gl_PREREQ_SYS_H_WINSOCK2
+ fi
+ AC_SUBST([SYS_SOCKET_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+/* Some systems require prerequisite headers. */
+#include <sys/types.h>
+#if !defined __GLIBC__ && HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#include <sys/select.h>
+ ]], [socket connect accept bind getpeername getsockname getsockopt
+ listen recv send recvfrom sendto setsockopt shutdown accept4])
+])
+
+AC_DEFUN([gl_PREREQ_SYS_H_SOCKET],
+[
+ dnl Check prerequisites of the <sys/socket.h> replacement.
+ gl_CHECK_NEXT_HEADERS([sys/socket.h])
+ if test $ac_cv_header_sys_socket_h = yes; then
+ HAVE_SYS_SOCKET_H=1
+ HAVE_WS2TCPIP_H=0
+ else
+ HAVE_SYS_SOCKET_H=0
+ dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make
+ dnl the check for those headers unconditional; yet cygwin reports
+ dnl that the headers are present but cannot be compiled (since on
+ dnl cygwin, all socket information should come from sys/socket.h).
+ AC_CHECK_HEADERS([ws2tcpip.h])
+ if test $ac_cv_header_ws2tcpip_h = yes; then
+ HAVE_WS2TCPIP_H=1
+ else
+ HAVE_WS2TCPIP_H=0
+ fi
+ fi
+ AC_SUBST([HAVE_SYS_SOCKET_H])
+ AC_SUBST([HAVE_WS2TCPIP_H])
+])
+
+# Common prerequisites of the <sys/socket.h> replacement and of the
+# <sys/select.h> replacement.
+# Sets and substitutes HAVE_WINSOCK2_H.
+AC_DEFUN([gl_PREREQ_SYS_H_WINSOCK2],
+[
+ m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])])
+ m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])])
+ AC_CHECK_HEADERS_ONCE([sys/socket.h])
+ if test $ac_cv_header_sys_socket_h != yes; then
+ dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make
+ dnl the check for those headers unconditional; yet cygwin reports
+ dnl that the headers are present but cannot be compiled (since on
+ dnl cygwin, all socket information should come from sys/socket.h).
+ AC_CHECK_HEADERS([winsock2.h])
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+ AC_SUBST([HAVE_WINSOCK2_H])
+])
+
+AC_DEFUN([gl_SYS_SOCKET_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS],
+[
+ GNULIB_SOCKET=0; AC_SUBST([GNULIB_SOCKET])
+ GNULIB_CONNECT=0; AC_SUBST([GNULIB_CONNECT])
+ GNULIB_ACCEPT=0; AC_SUBST([GNULIB_ACCEPT])
+ GNULIB_BIND=0; AC_SUBST([GNULIB_BIND])
+ GNULIB_GETPEERNAME=0; AC_SUBST([GNULIB_GETPEERNAME])
+ GNULIB_GETSOCKNAME=0; AC_SUBST([GNULIB_GETSOCKNAME])
+ GNULIB_GETSOCKOPT=0; AC_SUBST([GNULIB_GETSOCKOPT])
+ GNULIB_LISTEN=0; AC_SUBST([GNULIB_LISTEN])
+ GNULIB_RECV=0; AC_SUBST([GNULIB_RECV])
+ GNULIB_SEND=0; AC_SUBST([GNULIB_SEND])
+ GNULIB_RECVFROM=0; AC_SUBST([GNULIB_RECVFROM])
+ GNULIB_SENDTO=0; AC_SUBST([GNULIB_SENDTO])
+ GNULIB_SETSOCKOPT=0; AC_SUBST([GNULIB_SETSOCKOPT])
+ GNULIB_SHUTDOWN=0; AC_SUBST([GNULIB_SHUTDOWN])
+ GNULIB_ACCEPT4=0; AC_SUBST([GNULIB_ACCEPT4])
+ HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE])
+ HAVE_SA_FAMILY_T=1; AC_SUBST([HAVE_SA_FAMILY_T])
+ HAVE_ACCEPT4=1; AC_SUBST([HAVE_ACCEPT4])
+])
diff --git a/gnulib/m4/sys_stat_h.m4 b/gnulib/m4/sys_stat_h.m4
new file mode 100644
index 00000000..5a113d02
--- /dev/null
+++ b/gnulib/m4/sys_stat_h.m4
@@ -0,0 +1,80 @@
+# sys_stat_h.m4 serial 22 -*- Autoconf -*-
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Eric Blake.
+dnl Provide a GNU-like <sys/stat.h>.
+
+AC_DEFUN([gl_HEADER_SYS_STAT_H],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+
+ dnl For the mkdir substitute.
+ AC_REQUIRE([AC_C_INLINE])
+
+ dnl Check for broken stat macros.
+ AC_REQUIRE([AC_HEADER_STAT])
+
+ gl_CHECK_NEXT_HEADERS([sys/stat.h])
+
+ dnl Define types that are supposed to be defined in <sys/types.h> or
+ dnl <sys/stat.h>.
+ AC_CHECK_TYPE([nlink_t], [],
+ [AC_DEFINE([nlink_t], [int],
+ [Define to the type of st_nlink in struct stat, or a supertype.])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <sys/stat.h>
+ ]], [fchmodat fstatat futimens lchmod lstat mkdirat mkfifo mkfifoat
+ mknod mknodat stat utimensat])
+]) # gl_HEADER_SYS_STAT_H
+
+AC_DEFUN([gl_SYS_STAT_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SYS_STAT_H_DEFAULTS],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR
+ GNULIB_FCHMODAT=0; AC_SUBST([GNULIB_FCHMODAT])
+ GNULIB_FSTATAT=0; AC_SUBST([GNULIB_FSTATAT])
+ GNULIB_FUTIMENS=0; AC_SUBST([GNULIB_FUTIMENS])
+ GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD])
+ GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT])
+ GNULIB_MKDIRAT=0; AC_SUBST([GNULIB_MKDIRAT])
+ GNULIB_MKFIFO=0; AC_SUBST([GNULIB_MKFIFO])
+ GNULIB_MKFIFOAT=0; AC_SUBST([GNULIB_MKFIFOAT])
+ GNULIB_MKNOD=0; AC_SUBST([GNULIB_MKNOD])
+ GNULIB_MKNODAT=0; AC_SUBST([GNULIB_MKNODAT])
+ GNULIB_STAT=0; AC_SUBST([GNULIB_STAT])
+ GNULIB_UTIMENSAT=0; AC_SUBST([GNULIB_UTIMENSAT])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT])
+ HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT])
+ HAVE_FUTIMENS=1; AC_SUBST([HAVE_FUTIMENS])
+ HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD])
+ HAVE_LSTAT=1; AC_SUBST([HAVE_LSTAT])
+ HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT])
+ HAVE_MKFIFO=1; AC_SUBST([HAVE_MKFIFO])
+ HAVE_MKFIFOAT=1; AC_SUBST([HAVE_MKFIFOAT])
+ HAVE_MKNOD=1; AC_SUBST([HAVE_MKNOD])
+ HAVE_MKNODAT=1; AC_SUBST([HAVE_MKNODAT])
+ HAVE_UTIMENSAT=1; AC_SUBST([HAVE_UTIMENSAT])
+ REPLACE_FSTAT=0; AC_SUBST([REPLACE_FSTAT])
+ REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT])
+ REPLACE_FUTIMENS=0; AC_SUBST([REPLACE_FUTIMENS])
+ REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT])
+ REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR])
+ REPLACE_MKFIFO=0; AC_SUBST([REPLACE_MKFIFO])
+ REPLACE_MKNOD=0; AC_SUBST([REPLACE_MKNOD])
+ REPLACE_STAT=0; AC_SUBST([REPLACE_STAT])
+ REPLACE_UTIMENSAT=0; AC_SUBST([REPLACE_UTIMENSAT])
+])
diff --git a/gnulib/m4/sys_time_h.m4 b/gnulib/m4/sys_time_h.m4
new file mode 100644
index 00000000..be6d7ecb
--- /dev/null
+++ b/gnulib/m4/sys_time_h.m4
@@ -0,0 +1,70 @@
+# Configure a replacement for <sys/time.h>.
+# serial 4
+
+# Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Paul Eggert and Martin Lambers.
+
+AC_DEFUN([gl_HEADER_SYS_TIME_H],
+[
+ dnl Use AC_REQUIRE here, so that the REPLACE_GETTIMEOFDAY=0 statement
+ dnl below is expanded once only, before all REPLACE_GETTIMEOFDAY=1
+ dnl statements that occur in other macros.
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_SYS_TIME_H_BODY],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ gl_CHECK_NEXT_HEADERS([sys/time.h])
+
+ if test $ac_cv_header_sys_time_h != yes; then
+ HAVE_SYS_TIME_H=0
+ fi
+
+ AC_CACHE_CHECK([for struct timeval], [gl_cv_sys_struct_timeval],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ ]],
+ [[static struct timeval x; x.tv_sec = x.tv_usec;]])],
+ [gl_cv_sys_struct_timeval=yes],
+ [gl_cv_sys_struct_timeval=no])])
+ if test $gl_cv_sys_struct_timeval != yes; then
+ HAVE_STRUCT_TIMEVAL=0
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+#if HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#include <time.h>
+ ]], [gettimeofday])
+])
+
+AC_DEFUN([gl_SYS_TIME_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_HEADER_SYS_TIME_H_DEFAULTS],
+[
+ GNULIB_GETTIMEOFDAY=0; AC_SUBST([GNULIB_GETTIMEOFDAY])
+ dnl Assume POSIX behavior unless another module says otherwise.
+ HAVE_GETTIMEOFDAY=1; AC_SUBST([HAVE_GETTIMEOFDAY])
+ HAVE_STRUCT_TIMEVAL=1; AC_SUBST([HAVE_STRUCT_TIMEVAL])
+ HAVE_SYS_TIME_H=1; AC_SUBST([HAVE_SYS_TIME_H])
+ REPLACE_GETTIMEOFDAY=0; AC_SUBST([REPLACE_GETTIMEOFDAY])
+])
diff --git a/gnulib/m4/sys_times_h.m4 b/gnulib/m4/sys_times_h.m4
new file mode 100644
index 00000000..c954ed8a
--- /dev/null
+++ b/gnulib/m4/sys_times_h.m4
@@ -0,0 +1,51 @@
+# Configure a replacement for <sys/times.h>.
+# serial 4
+
+# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Simon Josefsson.
+
+AC_DEFUN([gl_SYS_TIMES_H],
+[
+ AC_REQUIRE([gl_SYS_TIMES_H_DEFAULTS])
+
+ gl_CHECK_NEXT_HEADERS([sys/times.h])
+ AC_CHECK_HEADERS_ONCE([sys/times.h])
+ if test $ac_cv_header_sys_times_h = yes; then
+ HAVE_SYS_TIMES_H=1
+ AC_CHECK_TYPES([struct tms], [], [HAVE_STRUCT_TMS=0], [[
+#include <sys/times.h>
+ ]])
+ else
+ HAVE_SYS_TIMES_H=0
+ HAVE_STRUCT_TMS=0
+ fi
+ AC_SUBST([HAVE_SYS_TIMES_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+/* Some systems have incomplete headers. */
+#ifndef __GLIBC__
+# include <time.h>
+#endif
+#include <sys/times.h>
+ ]], [times])
+])
+
+AC_DEFUN([gl_SYS_TIMES_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_TIMES_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SYS_TIMES_H_DEFAULTS],
+[
+ GNULIB_TIMES=0; AC_SUBST([GNULIB_TIMES])
+ HAVE_STRUCT_TMS=1; AC_SUBST([HAVE_STRUCT_TMS])
+ HAVE_TIMES=1; AC_SUBST([HAVE_TIMES])
+])
diff --git a/gnulib/m4/sys_utsname_h.m4 b/gnulib/m4/sys_utsname_h.m4
new file mode 100644
index 00000000..bdb54475
--- /dev/null
+++ b/gnulib/m4/sys_utsname_h.m4
@@ -0,0 +1,47 @@
+# sys_utsname_h.m4 serial 4
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN([gl_SYS_UTSNAME_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SYS_UTSNAME_H_DEFAULTS])
+
+ gl_CHECK_NEXT_HEADERS([sys/utsname.h])
+ AC_CHECK_HEADERS_ONCE([sys/utsname.h])
+ if test $ac_cv_header_sys_utsname_h != yes; then
+ HAVE_SYS_UTSNAME_H=0
+ HAVE_STRUCT_UTSNAME=0
+ else
+ HAVE_SYS_UTSNAME_H=1
+ AC_CHECK_TYPES([struct utsname], [], [HAVE_STRUCT_UTSNAME=0], [[
+#include <sys/utsname.h>
+ ]])
+ fi
+ AC_SUBST([HAVE_SYS_UTSNAME_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <sys/utsname.h>
+ ]], [uname])
+])
+
+AC_DEFUN([gl_SYS_UTSNAME_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_UTSNAME_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SYS_UTSNAME_H_DEFAULTS],
+[
+ GNULIB_UNAME=0; AC_SUBST([GNULIB_UNAME])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_UNAME=1; AC_SUBST([HAVE_UNAME])
+ HAVE_STRUCT_UTSNAME=1; AC_SUBST([HAVE_STRUCT_UTSNAME])
+])
diff --git a/gnulib/m4/sys_wait_h.m4 b/gnulib/m4/sys_wait_h.m4
new file mode 100644
index 00000000..a161ff72
--- /dev/null
+++ b/gnulib/m4/sys_wait_h.m4
@@ -0,0 +1,24 @@
+# sys_wait_h.m4 serial 2
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SYS_WAIT_H],
+[
+ AC_REQUIRE([gl_SYS_WAIT_H_DEFAULTS])
+
+ gl_CHECK_NEXT_HEADERS([sys/wait.h])
+])
+
+AC_DEFUN([gl_SYS_WAIT_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_WAIT_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SYS_WAIT_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+])
diff --git a/gnulib/m4/sysexits.m4 b/gnulib/m4/sysexits.m4
new file mode 100644
index 00000000..b3baa51c
--- /dev/null
+++ b/gnulib/m4/sysexits.m4
@@ -0,0 +1,43 @@
+# sysexits.m4 serial 5
+dnl Copyright (C) 2003, 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SYSEXITS],
+[
+ AC_CHECK_HEADERS_ONCE([sysexits.h])
+ if test $ac_cv_header_sysexits_h = yes; then
+ HAVE_SYSEXITS_H=1
+ gl_CHECK_NEXT_HEADERS([sysexits.h])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sysexits.h>]],
+ [[switch (0)
+ {
+ case EX_OK:
+ case EX_USAGE:
+ case EX_DATAERR:
+ case EX_NOINPUT:
+ case EX_NOUSER:
+ case EX_NOHOST:
+ case EX_UNAVAILABLE:
+ case EX_SOFTWARE:
+ case EX_OSERR:
+ case EX_OSFILE:
+ case EX_CANTCREAT:
+ case EX_IOERR:
+ case EX_TEMPFAIL:
+ case EX_PROTOCOL:
+ case EX_NOPERM:
+ case EX_CONFIG:
+ break;
+ }
+ ]])],
+ [SYSEXITS_H=],
+ [SYSEXITS_H=sysexits.h])
+ else
+ HAVE_SYSEXITS_H=0
+ SYSEXITS_H=sysexits.h
+ fi
+ AC_SUBST([HAVE_SYSEXITS_H])
+ AC_SUBST([SYSEXITS_H])
+])
diff --git a/gnulib/m4/tanl.m4 b/gnulib/m4/tanl.m4
new file mode 100644
index 00000000..0e785057
--- /dev/null
+++ b/gnulib/m4/tanl.m4
@@ -0,0 +1,76 @@
+# tanl.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_TANL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare tanl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ TANL_LIBM=
+ AC_CACHE_CHECK([whether tanl() can be used without linking with libm],
+ [gl_cv_func_tanl_no_libm],
+ [
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return tanl (x) > 0.4;],
+ [gl_cv_func_tanl_no_libm=yes],
+ [gl_cv_func_tanl_no_libm=no])
+ ])
+ if test $gl_cv_func_tanl_no_libm = no; then
+ AC_CACHE_CHECK([whether tanl() can be used with libm],
+ [gl_cv_func_tanl_in_libm],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([#ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [return tanl (x) > 0.4;],
+ [gl_cv_func_tanl_in_libm=yes],
+ [gl_cv_func_tanl_in_libm=no])
+ LIBS="$save_LIBS"
+ ])
+ if test $gl_cv_func_tanl_in_libm = yes; then
+ TANL_LIBM=-lm
+ fi
+ fi
+ if test $gl_cv_func_tanl_no_libm = yes \
+ || test $gl_cv_func_tanl_in_libm = yes; then
+ dnl Also check whether it's declared.
+ dnl MacOS X 10.3 has tanl() in libc but doesn't declare it in <math.h>.
+ AC_CHECK_DECL([tanl], , [HAVE_DECL_TANL=0], [#include <math.h>])
+ else
+ HAVE_DECL_TANL=0
+ HAVE_TANL=0
+ AC_LIBOBJ([tanl])
+ AC_LIBOBJ([trigl])
+ AC_REQUIRE([gl_FUNC_ISNANL])
+ AC_REQUIRE([gl_FUNC_FLOOR])
+ AC_REQUIRE([gl_FUNC_FLOORL])
+ dnl Append $ISNANL_LIBM to TANL_LIBM, avoiding gratuitous duplicates.
+ case " $TANL_LIBM " in
+ *" $ISNANL_LIBM "*) ;;
+ *) TANL_LIBM="$TANL_LIBM $ISNANL_LIBM" ;;
+ esac
+ dnl Append $FLOOR_LIBM to TANL_LIBM, avoiding gratuitous duplicates.
+ case " $TANL_LIBM " in
+ *" $FLOOR_LIBM "*) ;;
+ *) TANL_LIBM="$TANL_LIBM $FLOOR_LIBM" ;;
+ esac
+ dnl Append $FLOORL_LIBM to TANL_LIBM, avoiding gratuitous duplicates.
+ case " $TANL_LIBM " in
+ *" $FLOORL_LIBM "*) ;;
+ *) TANL_LIBM="$TANL_LIBM $FLOORL_LIBM" ;;
+ esac
+ fi
+ AC_SUBST([TANL_LIBM])
+])
diff --git a/gnulib/m4/tempname.m4 b/gnulib/m4/tempname.m4
new file mode 100644
index 00000000..bf83f195
--- /dev/null
+++ b/gnulib/m4/tempname.m4
@@ -0,0 +1,22 @@
+#serial 3
+
+# Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# glibc provides __gen_tempname as a wrapper for mk[ds]temp. Expose
+# it as a public API, and provide it on systems that are lacking.
+AC_DEFUN([gl_FUNC_GEN_TEMPNAME],
+[
+ AC_REQUIRE([AC_SYS_LARGEFILE])
+
+ AC_LIBOBJ([tempname])
+ gl_PREREQ_TEMPNAME
+])
+
+# Prerequisites of lib/tempname.c.
+AC_DEFUN([gl_PREREQ_TEMPNAME],
+[
+ :
+])
diff --git a/gnulib/m4/thread.m4 b/gnulib/m4/thread.m4
new file mode 100644
index 00000000..8e79075b
--- /dev/null
+++ b/gnulib/m4/thread.m4
@@ -0,0 +1,18 @@
+# thread.m4 serial 2
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_THREAD],
+[
+ AC_REQUIRE([gl_THREADLIB])
+ AC_REQUIRE([AC_C_INLINE])
+
+ if test $gl_threads_api = posix; then
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBMULTITHREAD"
+ AC_CHECK_FUNCS([pthread_atfork])
+ LIBS="$gl_save_LIBS"
+ fi
+])
diff --git a/gnulib/m4/threadlib.m4 b/gnulib/m4/threadlib.m4
new file mode 100644
index 00000000..bba460e4
--- /dev/null
+++ b/gnulib/m4/threadlib.m4
@@ -0,0 +1,324 @@
+# threadlib.m4 serial 4 (gettext-0.18)
+dnl Copyright (C) 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl gl_THREADLIB
+dnl ------------
+dnl Tests for a multithreading library to be used.
+dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
+dnl USE_PTH_THREADS, USE_WIN32_THREADS
+dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
+dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
+dnl libtool).
+dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
+dnl programs that really need multithread functionality. The difference
+dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
+dnl symbols, typically LIBTHREAD="" whereas LIBMULTITHREAD="-lpthread".
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+
+AC_DEFUN([gl_THREADLIB_EARLY],
+[
+ AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
+])
+
+dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once.
+
+AC_DEFUN([gl_THREADLIB_EARLY_BODY],
+[
+ dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
+ dnl influences the result of the autoconf tests that test for *_unlocked
+ dnl declarations, on AIX 5 at least. Therefore it must come early.
+ AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
+ AC_BEFORE([$0], [gl_ARGP])dnl
+
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
+ dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
+ dnl AC_GNU_SOURCE.
+ m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
+ [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
+ [AC_REQUIRE([AC_GNU_SOURCE])])
+ dnl Check for multithreading.
+ m4_divert_text([DEFAULTS], [gl_use_threads_default=])
+ AC_ARG_ENABLE([threads],
+AC_HELP_STRING([--enable-threads={posix|solaris|pth|win32}], [specify multithreading API])
+AC_HELP_STRING([--disable-threads], [build without multithread safety]),
+ [gl_use_threads=$enableval],
+ [if test -n "$gl_use_threads_default"; then
+ gl_use_threads="$gl_use_threads_default"
+ else
+changequote(,)dnl
+ case "$host_os" in
+ dnl Disable multithreading by default on OSF/1, because it interferes
+ dnl with fork()/exec(): When msgexec is linked with -lpthread, its
+ dnl child process gets an endless segmentation fault inside execvp().
+ dnl Disable multithreading by default on Cygwin 1.5.x, because it has
+ dnl bugs that lead to endless loops or crashes. See
+ dnl <http://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
+ osf*) gl_use_threads=no ;;
+ cygwin*)
+ case `uname -r` in
+ 1.[0-5].*) gl_use_threads=no ;;
+ *) gl_use_threads=yes ;;
+ esac
+ ;;
+ *) gl_use_threads=yes ;;
+ esac
+changequote([,])dnl
+ fi
+ ])
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+ # For using <pthread.h>:
+ case "$host_os" in
+ osf*)
+ # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+ # groks <pthread.h>. cc also understands the flag -pthread, but
+ # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+ # 2. putting a flag into CPPFLAGS that has an effect on the linker
+ # causes the AC_TRY_LINK test below to succeed unexpectedly,
+ # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ ;;
+ esac
+ # Some systems optimize for single-threaded programs by default, and
+ # need special flags to disable these optimizations. For example, the
+ # definition of 'errno' in <errno.h>.
+ case "$host_os" in
+ aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
+ solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
+ esac
+ fi
+])
+
+dnl The guts of gl_THREADLIB. Needs to be expanded only once.
+
+AC_DEFUN([gl_THREADLIB_BODY],
+[
+ AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
+ gl_threads_api=none
+ LIBTHREAD=
+ LTLIBTHREAD=
+ LIBMULTITHREAD=
+ LTLIBMULTITHREAD=
+ if test "$gl_use_threads" != no; then
+ dnl Check whether the compiler and linker support weak declarations.
+ AC_MSG_CHECKING([whether imported symbols can be declared weak])
+ gl_have_weak=no
+ AC_TRY_LINK([extern void xyzzy ();
+#pragma weak xyzzy], [xyzzy();], [gl_have_weak=yes])
+ AC_MSG_RESULT([$gl_have_weak])
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+ # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+ # it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY.
+ AC_CHECK_HEADER([pthread.h],
+ [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
+ if test "$gl_have_pthread_h" = yes; then
+ # Other possible tests:
+ # -lpthreads (FSU threads, PCthreads)
+ # -lgthreads
+ gl_have_pthread=
+ # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+ # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+ # the second one only in libpthread, and lock.c needs it.
+ AC_TRY_LINK([#include <pthread.h>],
+ [pthread_mutex_lock((pthread_mutex_t*)0);
+ pthread_mutexattr_init((pthread_mutexattr_t*)0);],
+ [gl_have_pthread=yes])
+ # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+ # since it is defined as a macro on OSF/1.)
+ if test -n "$gl_have_pthread"; then
+ # The program links fine without libpthread. But it may actually
+ # need to link with libpthread in order to create multiple threads.
+ AC_CHECK_LIB([pthread], [pthread_kill],
+ [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
+ # On Solaris and HP-UX, most pthread functions exist also in libc.
+ # Therefore pthread_in_use() needs to actually try to create a
+ # thread: pthread_create from libc will fail, whereas
+ # pthread_create will actually create a thread.
+ case "$host_os" in
+ solaris* | hpux*)
+ AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
+ [Define if the pthread_in_use() detection is hard.])
+ esac
+ ])
+ else
+ # Some library is needed. Try libpthread and libc_r.
+ AC_CHECK_LIB([pthread], [pthread_kill],
+ [gl_have_pthread=yes
+ LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
+ LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
+ if test -z "$gl_have_pthread"; then
+ # For FreeBSD 4.
+ AC_CHECK_LIB([c_r], [pthread_kill],
+ [gl_have_pthread=yes
+ LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
+ LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
+ fi
+ fi
+ if test -n "$gl_have_pthread"; then
+ gl_threads_api=posix
+ AC_DEFINE([USE_POSIX_THREADS], [1],
+ [Define if the POSIX multithreading library can be used.])
+ if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
+ [Define if references to the POSIX multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -z "$gl_have_pthread"; then
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
+ gl_have_solaristhread=
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lthread"
+ AC_TRY_LINK([#include <thread.h>
+#include <synch.h>],
+ [thr_self();],
+ [gl_have_solaristhread=yes])
+ LIBS="$gl_save_LIBS"
+ if test -n "$gl_have_solaristhread"; then
+ gl_threads_api=solaris
+ LIBTHREAD=-lthread
+ LTLIBTHREAD=-lthread
+ LIBMULTITHREAD="$LIBTHREAD"
+ LTLIBMULTITHREAD="$LTLIBTHREAD"
+ AC_DEFINE([USE_SOLARIS_THREADS], [1],
+ [Define if the old Solaris multithreading library can be used.])
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_SOLARIS_THREADS_WEAK], [1],
+ [Define if references to the old Solaris multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ fi
+ fi
+ if test "$gl_use_threads" = pth; then
+ gl_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_LINKFLAGS([pth])
+ gl_have_pth=
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lpth"
+ AC_TRY_LINK([#include <pth.h>], [pth_self();], [gl_have_pth=yes])
+ LIBS="$gl_save_LIBS"
+ if test -n "$gl_have_pth"; then
+ gl_threads_api=pth
+ LIBTHREAD="$LIBPTH"
+ LTLIBTHREAD="$LTLIBPTH"
+ LIBMULTITHREAD="$LIBTHREAD"
+ LTLIBMULTITHREAD="$LTLIBTHREAD"
+ AC_DEFINE([USE_PTH_THREADS], [1],
+ [Define if the GNU Pth multithreading library can be used.])
+ if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_PTH_THREADS_WEAK], [1],
+ [Define if references to the GNU Pth multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ else
+ CPPFLAGS="$gl_save_CPPFLAGS"
+ fi
+ fi
+ if test -z "$gl_have_pthread"; then
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = win32; then
+ if { case "$host_os" in
+ mingw*) true;;
+ *) false;;
+ esac
+ }; then
+ gl_threads_api=win32
+ AC_DEFINE([USE_WIN32_THREADS], [1],
+ [Define if the Win32 multithreading API can be used.])
+ fi
+ fi
+ fi
+ fi
+ AC_MSG_CHECKING([for multithread API to use])
+ AC_MSG_RESULT([$gl_threads_api])
+ AC_SUBST([LIBTHREAD])
+ AC_SUBST([LTLIBTHREAD])
+ AC_SUBST([LIBMULTITHREAD])
+ AC_SUBST([LTLIBMULTITHREAD])
+])
+
+AC_DEFUN([gl_THREADLIB],
+[
+ AC_REQUIRE([gl_THREADLIB_EARLY])
+ AC_REQUIRE([gl_THREADLIB_BODY])
+])
+
+
+dnl gl_DISABLE_THREADS
+dnl ------------------
+dnl Sets the gl_THREADLIB default so that threads are not used by default.
+dnl The user can still override it at installation time, by using the
+dnl configure option '--enable-threads'.
+
+AC_DEFUN([gl_DISABLE_THREADS], [
+ m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
+])
+
+
+dnl Survey of platforms:
+dnl
+dnl Platform Available Compiler Supports test-lock
+dnl flavours option weak result
+dnl --------------- --------- --------- -------- ---------
+dnl Linux 2.4/glibc posix -lpthread Y OK
+dnl
+dnl GNU Hurd/glibc posix
+dnl
+dnl FreeBSD 5.3 posix -lc_r Y
+dnl posix -lkse ? Y
+dnl posix -lpthread ? Y
+dnl posix -lthr Y
+dnl
+dnl FreeBSD 5.2 posix -lc_r Y
+dnl posix -lkse Y
+dnl posix -lthr Y
+dnl
+dnl FreeBSD 4.0,4.10 posix -lc_r Y OK
+dnl
+dnl NetBSD 1.6 --
+dnl
+dnl OpenBSD 3.4 posix -lpthread Y OK
+dnl
+dnl MacOS X 10.[123] posix -lpthread Y OK
+dnl
+dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK
+dnl solaris -lthread Y Sol 7,8: 0.0; Sol 9: OK
+dnl
+dnl HP-UX 11 posix -lpthread N (cc) OK
+dnl Y (gcc)
+dnl
+dnl IRIX 6.5 posix -lpthread Y 0.5
+dnl
+dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
+dnl
+dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
+dnl -lpthread (gcc) Y
+dnl
+dnl Cygwin posix -lpthread Y OK
+dnl
+dnl Any of the above pth -lpth 0.0
+dnl
+dnl Mingw win32 N OK
+dnl
+dnl BeOS 5 --
+dnl
+dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
+dnl turned off:
+dnl OK if all three tests terminate OK,
+dnl 0.5 if the first test terminates OK but the second one loops endlessly,
+dnl 0.0 if the first test already loops endlessly.
diff --git a/gnulib/m4/time_h.m4 b/gnulib/m4/time_h.m4
new file mode 100644
index 00000000..c00bfae9
--- /dev/null
+++ b/gnulib/m4/time_h.m4
@@ -0,0 +1,74 @@
+# Configure a more-standard replacement for <time.h>.
+
+# Copyright (C) 2000-2001, 2003-2007, 2009-2010 Free Software Foundation, Inc.
+
+# This file 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.
+
+# Written by Paul Eggert and Jim Meyering.
+
+AC_DEFUN([gl_HEADER_TIME_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_HEADER_TIME_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_TIME_H_BODY],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([time.h])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC])
+])
+
+AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS],
+[
+ dnl If another module says to replace or to not replace, do that.
+ dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK;
+ dnl this lets maintainers check for portability.
+ REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R])
+ REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME])
+ REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP])
+ REPLACE_STRPTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_STRPTIME])
+ REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM])
+])
+
+dnl Define HAVE_STRUCT_TIMESPEC if `struct timespec' is declared
+dnl in time.h or sys/time.h.
+
+AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC],
+[
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ AC_CACHE_CHECK([for struct timespec in <time.h>],
+ [gl_cv_sys_struct_timespec_in_time_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <time.h>
+ ]],
+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])],
+ [gl_cv_sys_struct_timespec_in_time_h=yes],
+ [gl_cv_sys_struct_timespec_in_time_h=no])])
+
+ TIME_H_DEFINES_STRUCT_TIMESPEC=0
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0
+ if test $gl_cv_sys_struct_timespec_in_time_h = yes; then
+ TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ else
+ AC_CACHE_CHECK([for struct timespec in <sys/time.h>],
+ [gl_cv_sys_struct_timespec_in_sys_time_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/time.h>
+ ]],
+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])],
+ [gl_cv_sys_struct_timespec_in_sys_time_h=yes],
+ [gl_cv_sys_struct_timespec_in_sys_time_h=no])])
+ if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ fi
+ fi
+ AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC])
+ AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
+])
diff --git a/gnulib/m4/time_r.m4 b/gnulib/m4/time_r.m4
new file mode 100644
index 00000000..b5938e79
--- /dev/null
+++ b/gnulib/m4/time_r.m4
@@ -0,0 +1,44 @@
+dnl Reentrant time functions like localtime_r.
+
+dnl Copyright (C) 2003, 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl_TIME_R],
+[
+ dnl Persuade glibc and Solaris <time.h> to declare localtime_r.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature],
+ [gl_cv_time_r_posix],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[#include <time.h>]],
+ [[/* We don't need to append 'restrict's to the argument types,
+ even though the POSIX signature has the 'restrict's,
+ since C99 says they can't affect type compatibility. */
+ struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r;
+ if (ptr) return 0;
+ /* Check the return type is a pointer. On HP-UX 10 it is 'int'. */
+ *localtime_r (0, 0);]])],
+ [gl_cv_time_r_posix=yes],
+ [gl_cv_time_r_posix=no])])
+ if test $gl_cv_time_r_posix = yes; then
+ REPLACE_LOCALTIME_R=0
+ else
+ REPLACE_LOCALTIME_R=1
+ AC_LIBOBJ([time_r])
+ gl_PREREQ_TIME_R
+ fi
+])
+
+# Prerequisites of lib/time_r.c.
+AC_DEFUN([gl_PREREQ_TIME_R], [
+ :
+])
diff --git a/gnulib/m4/timegm.m4 b/gnulib/m4/timegm.m4
new file mode 100644
index 00000000..9168c09b
--- /dev/null
+++ b/gnulib/m4/timegm.m4
@@ -0,0 +1,40 @@
+# timegm.m4 serial 6
+dnl Copyright (C) 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_TIMEGM],
+[
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_MKTIME])
+ if test $ac_cv_func_working_mktime = no; then
+ # Assume that timegm is buggy if mktime is.
+ AC_LIBOBJ([timegm])
+ ac_cv_func_timegm=no
+ else
+ AC_REPLACE_FUNCS([timegm])
+ fi
+ REPLACE_TIMEGM=1
+ if test $ac_cv_func_timegm = yes; then
+ AC_CHECK_DECLS([timegm], [REPLACE_TIMEGM=0], [], [#include <time.h>])
+ fi
+ if test $REPLACE_TIMEGM = 1; then
+ gl_PREREQ_TIMEGM
+ fi
+])
+
+# Prerequisites of lib/timegm.c.
+AC_DEFUN([gl_PREREQ_TIMEGM], [
+ AC_REQUIRE([gl_TIME_R])
+ AC_REQUIRE([gl_FUNC_MKTIME])
+ if test $ac_cv_func_working_mktime = yes; then
+ AC_CHECK_FUNC([__mktime_internal], ,
+ [# mktime works but it doesn't export __mktime_internal,
+ # so we need to substitute our own mktime implementation.
+ AC_LIBOBJ([mktime])
+ AC_DEFINE([mktime], [rpl_mktime],
+ [Define to rpl_mktime if the replacement function should be used.])
+ gl_PREREQ_MKTIME])
+ fi
+])
diff --git a/gnulib/m4/times.m4 b/gnulib/m4/times.m4
new file mode 100644
index 00000000..b19551a5
--- /dev/null
+++ b/gnulib/m4/times.m4
@@ -0,0 +1,15 @@
+# times.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_TIMES],
+[
+ AC_REQUIRE([gl_SYS_TIMES_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([times])
+ if test $ac_cv_func_times = no; then
+ HAVE_TIMES=0
+ AC_LIBOBJ([times])
+ fi
+])
diff --git a/gnulib/m4/timespec.m4 b/gnulib/m4/timespec.m4
new file mode 100644
index 00000000..5dbaed74
--- /dev/null
+++ b/gnulib/m4/timespec.m4
@@ -0,0 +1,15 @@
+#serial 14
+
+# Copyright (C) 2000-2001, 2003-2007, 2009-2010 Free Software Foundation, Inc.
+
+# This file 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.
+
+dnl From Jim Meyering
+
+AC_DEFUN([gl_TIMESPEC],
+[
+ dnl Prerequisites of lib/timespec.h.
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/tls.m4 b/gnulib/m4/tls.m4
new file mode 100644
index 00000000..9c1bb046
--- /dev/null
+++ b/gnulib/m4/tls.m4
@@ -0,0 +1,12 @@
+# tls.m4 serial 2 (gettext-0.18)
+dnl Copyright (C) 2005, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_TLS],
+[
+ AC_REQUIRE([gl_THREADLIB])
+])
diff --git a/gnulib/m4/tm_gmtoff.m4 b/gnulib/m4/tm_gmtoff.m4
new file mode 100644
index 00000000..43bda96f
--- /dev/null
+++ b/gnulib/m4/tm_gmtoff.m4
@@ -0,0 +1,14 @@
+# tm_gmtoff.m4 serial 3
+dnl Copyright (C) 2002, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_TM_GMTOFF],
+[
+ AC_CHECK_MEMBER([struct tm.tm_gmtoff],
+ [AC_DEFINE([HAVE_TM_GMTOFF], [1],
+ [Define if struct tm has the tm_gmtoff member.])],
+ ,
+ [#include <time.h>])
+])
diff --git a/gnulib/m4/tmpdir.m4 b/gnulib/m4/tmpdir.m4
new file mode 100644
index 00000000..b2ace868
--- /dev/null
+++ b/gnulib/m4/tmpdir.m4
@@ -0,0 +1,12 @@
+# tmpdir.m4 serial 3
+dnl Copyright (C) 2001-2002, 2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prerequisites for lib/tmpdir.c
+
+AC_DEFUN([gt_TMPDIR],
+[
+ AC_CHECK_FUNCS([__secure_getenv])
+])
diff --git a/gnulib/m4/tmpfile.m4 b/gnulib/m4/tmpfile.m4
new file mode 100644
index 00000000..8a5c145e
--- /dev/null
+++ b/gnulib/m4/tmpfile.m4
@@ -0,0 +1,39 @@
+# Check whether to use a replacement tmpfile() function.
+
+# Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+# Written by Ben Pfaff.
+
+# The native Windows tmpfile function always tries to put the temporary
+# file in the root directory. (This behaviour is even documented in
+# Microsoft's documentation!) This often fails for ordinary users who
+# don't have the permissions to write in the root directory.
+#
+# We can't test for tmpfile even at runtime, since our test program
+# might be running with privileges that allow it to write to the root
+# directory, even though tmpfile wouldn't work in general. Instead,
+# just test for a Windows platform (excluding Cygwin).
+
+AC_DEFUN([gl_TMPFILE], [
+ AC_CACHE_CHECK([whether tmpfile should be overridden],
+ [gl_cv_func_tmpfile_unusable],
+ [AC_EGREP_CPP([choke me], [
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+choke me
+#endif
+ ],
+ [gl_cv_func_tmpfile_unusable=yes],
+ [gl_cv_func_tmpfile_unusable=no])])
+ if test $gl_cv_func_tmpfile_unusable = yes; then
+ AC_LIBOBJ([tmpfile])
+ AC_DEFINE([tmpfile], [rpl_tmpfile],
+ [Define to rpl_tmpfile if the replacement function should be used.])
+ gl_PREREQ_TMPFILE
+ fi
+])
+
+# Prerequisites of lib/tmpfile.c.
+AC_DEFUN([gl_PREREQ_TMPFILE], [:])
diff --git a/gnulib/m4/trunc.m4 b/gnulib/m4/trunc.m4
new file mode 100644
index 00000000..1d003c3e
--- /dev/null
+++ b/gnulib/m4/trunc.m4
@@ -0,0 +1,48 @@
+# trunc.m4 serial 2
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_TRUNC],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare trunc().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl Test whether trunc() is declared.
+ AC_CHECK_DECLS([trunc], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_trunc" = yes; then
+ dnl Test whether trunc() can be used without libm.
+ TRUNC_LIBM=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ double x;],
+ [x = trunc(x);],
+ [TRUNC_LIBM=])
+ if test "$TRUNC_LIBM" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ double x;],
+ [x = trunc(x);],
+ [TRUNC_LIBM="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ if test "$TRUNC_LIBM" = "?"; then
+ TRUNC_LIBM=
+ fi
+ else
+ HAVE_DECL_TRUNC=0
+ AC_LIBOBJ([trunc])
+ TRUNC_LIBM=
+ fi
+ AC_SUBST([HAVE_DECL_TRUNC])
+ AC_SUBST([TRUNC_LIBM])
+])
diff --git a/gnulib/m4/truncf.m4 b/gnulib/m4/truncf.m4
new file mode 100644
index 00000000..4d5099f8
--- /dev/null
+++ b/gnulib/m4/truncf.m4
@@ -0,0 +1,48 @@
+# truncf.m4 serial 1
+dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_TRUNCF],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ dnl Persuade glibc <math.h> to declare truncf().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl Test whether truncf() is declared.
+ AC_CHECK_DECLS([truncf], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_truncf" = yes; then
+ dnl Test whether truncf() can be used without libm.
+ TRUNCF_LIBM=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ float x;],
+ [x = truncf(x);],
+ [TRUNCF_LIBM=])
+ if test "$TRUNCF_LIBM" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ float x;],
+ [x = truncf(x);],
+ [TRUNCF_LIBM="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ if test "$TRUNCF_LIBM" = "?"; then
+ TRUNCF_LIBM=
+ fi
+ else
+ HAVE_DECL_TRUNCF=0
+ AC_LIBOBJ([truncf])
+ TRUNCF_LIBM=
+ fi
+ AC_SUBST([HAVE_DECL_TRUNCF])
+ AC_SUBST([TRUNCF_LIBM])
+])
diff --git a/gnulib/m4/truncl.m4 b/gnulib/m4/truncl.m4
new file mode 100644
index 00000000..646e1573
--- /dev/null
+++ b/gnulib/m4/truncl.m4
@@ -0,0 +1,72 @@
+# truncl.m4 serial 2
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_TRUNCL],
+[
+ AC_REQUIRE([gl_MATH_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ dnl Persuade glibc <math.h> to declare truncl().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ dnl Test whether truncl() is declared.
+ AC_CHECK_DECLS([truncl], , , [#include <math.h>])
+ if test "$ac_cv_have_decl_truncl" = yes; then
+ dnl Test whether truncl() can be used without libm.
+ TRUNCL_LIBM=?
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [x = truncl(x);],
+ [TRUNCL_LIBM=])
+ if test "$TRUNCL_LIBM" = "?"; then
+ save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ long double x;],
+ [x = truncl(x);],
+ [TRUNCL_LIBM="-lm"])
+ LIBS="$save_LIBS"
+ fi
+ if test "$TRUNCL_LIBM" = "?"; then
+ TRUNCL_LIBM=
+ fi
+ dnl Test whether truncl() works. It crashes on OSF/1 4.0d.
+ AC_CACHE_CHECK([whether truncl works], [gl_cv_func_truncl_works],
+ [
+ AC_TRY_RUN([
+#include <math.h>
+long double x;
+int main()
+{
+ x = truncl (0.0L);
+ return 0;
+}], [gl_cv_func_truncl_works=yes], [gl_cv_func_truncl_works=no],
+ [case "$host_os" in
+ osf4*) gl_cv_func_truncl_works="guessing no";;
+ *) gl_cv_func_truncl_works="guessing yes";;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_truncl_works" in
+ *yes) ;;
+ *) REPLACE_TRUNCL=1 ;;
+ esac
+ else
+ REPLACE_TRUNCL=1
+ fi
+ if test $REPLACE_TRUNCL = 1; then
+ AC_LIBOBJ([truncl])
+ TRUNCL_LIBM=
+ fi
+ AC_SUBST([REPLACE_TRUNCL])
+ AC_SUBST([TRUNCL_LIBM])
+])
diff --git a/gnulib/m4/tsearch.m4 b/gnulib/m4/tsearch.m4
new file mode 100644
index 00000000..50a9aabe
--- /dev/null
+++ b/gnulib/m4/tsearch.m4
@@ -0,0 +1,59 @@
+# tsearch.m4 serial 4
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_TSEARCH],
+[
+ AC_REQUIRE([gl_SEARCH_H_DEFAULTS])
+ AC_CHECK_FUNCS([tsearch])
+ if test $ac_cv_func_tsearch = yes; then
+ dnl On OpenBSD 4.0, the return value of tdelete() is incorrect.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether tdelete works], [gl_cv_func_tdelete_works],
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stddef.h>
+#include <search.h>
+static int
+cmp_fn (const void *a, const void *b)
+{
+ return *(const int *) a - *(const int *) b;
+}
+int
+main ()
+{
+ int x = 0;
+ void *root = NULL;
+ if (!(tfind (&x, &root, cmp_fn) == NULL)) return 1;
+ tsearch (&x, &root, cmp_fn);
+ if (!(tfind (&x, &root, cmp_fn) != NULL)) return 1;
+ if (!(tdelete (&x, &root, cmp_fn) != NULL)) return 1;
+ return 0;
+}]])], [gl_cv_func_tdelete_works=yes], [gl_cv_func_tdelete_works=no],
+ [case "$host_os" in
+ openbsd*) gl_cv_func_tdelete_works="guessing no";;
+ *) gl_cv_func_tdelete_works="guessing yes";;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_tdelete_works" in
+ *no)
+ REPLACE_TSEARCH=1
+ AC_LIBOBJ([tsearch])
+ gl_PREREQ_TSEARCH
+ ;;
+ esac
+ else
+ HAVE_TSEARCH=0
+ AC_LIBOBJ([tsearch])
+ gl_PREREQ_TSEARCH
+ fi
+])
+
+# Prerequisites of lib/tsearch.c.
+AC_DEFUN([gl_PREREQ_TSEARCH], [
+ :
+])
diff --git a/gnulib/m4/tzset.m4 b/gnulib/m4/tzset.m4
new file mode 100644
index 00000000..c85ab5e6
--- /dev/null
+++ b/gnulib/m4/tzset.m4
@@ -0,0 +1,59 @@
+# serial 4
+
+# Copyright (C) 2003, 2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+# See if we have a working tzset function.
+# If so, arrange to compile the wrapper function.
+# For at least Solaris 2.5.1 and 2.6, this is necessary
+# because tzset can clobber the contents of the buffer
+# used by localtime.
+
+# Written by Paul Eggert and Jim Meyering.
+
+AC_DEFUN([gl_FUNC_TZSET_CLOBBER],
+[
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H])
+ AC_CACHE_CHECK([whether tzset clobbers localtime buffer],
+ gl_cv_func_tzset_clobber,
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <time.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ time_t t1 = 853958121;
+ struct tm *p, s;
+ putenv ("TZ=GMT0");
+ p = localtime (&t1);
+ s = *p;
+ putenv ("TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00");
+ tzset ();
+ return (p->tm_year != s.tm_year
+ || p->tm_mon != s.tm_mon
+ || p->tm_mday != s.tm_mday
+ || p->tm_hour != s.tm_hour
+ || p->tm_min != s.tm_min
+ || p->tm_sec != s.tm_sec);
+}
+ ]])],
+ [gl_cv_func_tzset_clobber=no],
+ [gl_cv_func_tzset_clobber=yes],
+ [gl_cv_func_tzset_clobber=yes])])
+
+ AC_DEFINE([HAVE_RUN_TZSET_TEST], [1],
+ [Define to 1 if you have run the test for working tzset.])
+
+ if test $gl_cv_func_tzset_clobber = yes; then
+ gl_GETTIMEOFDAY_REPLACE_LOCALTIME
+
+ AC_DEFINE([tzset], [rpl_tzset],
+ [Define to rpl_tzset if the wrapper function should be used.])
+ AC_DEFINE([TZSET_CLOBBERS_LOCALTIME], [1],
+ [Define if tzset clobbers localtime's static buffer.])
+ fi
+])
diff --git a/gnulib/m4/uintmax_t.m4 b/gnulib/m4/uintmax_t.m4
new file mode 100644
index 00000000..03b51bcf
--- /dev/null
+++ b/gnulib/m4/uintmax_t.m4
@@ -0,0 +1,30 @@
+# uintmax_t.m4 serial 12
+dnl Copyright (C) 1997-2004, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_PREREQ([2.13])
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([gl_AC_TYPE_UINTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ test $ac_cv_type_unsigned_long_long_int = yes \
+ && ac_type='unsigned long long' \
+ || ac_type='unsigned long'
+ AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type],
+ [Define to unsigned long or unsigned long long
+ if <stdint.h> and <inttypes.h> don't define.])
+ else
+ AC_DEFINE([HAVE_UINTMAX_T], [1],
+ [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
diff --git a/gnulib/m4/ulonglong.m4 b/gnulib/m4/ulonglong.m4
new file mode 100644
index 00000000..5d141df8
--- /dev/null
+++ b/gnulib/m4/ulonglong.m4
@@ -0,0 +1,5 @@
+# ulonglong.m4 serial 10
+dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
diff --git a/gnulib/m4/uname.m4 b/gnulib/m4/uname.m4
new file mode 100644
index 00000000..8aab3641
--- /dev/null
+++ b/gnulib/m4/uname.m4
@@ -0,0 +1,20 @@
+# uname.m4 serial 10
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_UNAME],
+[
+ AC_REQUIRE([gl_SYS_UTSNAME_H_DEFAULTS])
+ AC_REPLACE_FUNCS([uname])
+ if test $ac_cv_func_uname = no; then
+ HAVE_UNAME=0
+ gl_PREREQ_UNAME
+ fi
+])
+
+# Prerequisites of lib/uname.c.
+AC_DEFUN([gl_PREREQ_UNAME], [
+ :
+])
diff --git a/gnulib/m4/ungetc.m4 b/gnulib/m4/ungetc.m4
new file mode 100644
index 00000000..68ccf883
--- /dev/null
+++ b/gnulib/m4/ungetc.m4
@@ -0,0 +1,36 @@
+# ungetc.m4 serial 2
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_FUNC_UNGETC_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+
+ AC_CACHE_CHECK([whether ungetc works on arbitrary bytes],
+ [gl_cv_func_ungetc_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <stdio.h>
+ ]], [FILE *f;
+ if (!(f = fopen ("conftest.tmp", "w+"))) return 1;
+ if (fputs ("abc", f) < 0) return 2;
+ rewind (f);
+ if (fgetc (f) != 'a') return 3;
+ if (fgetc (f) != 'b') return 4;
+ if (ungetc ('d', f) != 'd') return 5;
+ if (ftell (f) != 1) return 6;
+ if (fgetc (f) != 'd') return 7;
+ if (ftell (f) != 2) return 8;
+ if (fseek (f, 0, SEEK_CUR) != 0) return 9;
+ if (ftell (f) != 2) return 10;
+ if (fgetc (f) != 'c') return 11;
+ fclose (f); remove ("conftest.tmp");])],
+ [gl_cv_func_ungetc_works=yes], [gl_cv_func_ungetc_works=no],
+ [gl_cv_func_ungetc_works='guessing no'])
+ ])
+ if test "$gl_cv_func_ungetc_works" != yes; then
+ AC_DEFINE([FUNC_UNGETC_BROKEN], [1],
+ [Define to 1 if ungetc is broken when used on arbitrary bytes.])
+ fi
+])
diff --git a/gnulib/m4/unicodeio.m4 b/gnulib/m4/unicodeio.m4
new file mode 100644
index 00000000..4b6f429e
--- /dev/null
+++ b/gnulib/m4/unicodeio.m4
@@ -0,0 +1,11 @@
+# unicodeio.m4 serial 2
+dnl Copyright (C) 2002-2003, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_UNICODEIO],
+[
+ dnl No prerequisites of lib/unicodeio.c.
+ :
+])
diff --git a/gnulib/m4/unistd-safer.m4 b/gnulib/m4/unistd-safer.m4
new file mode 100644
index 00000000..74c3ce60
--- /dev/null
+++ b/gnulib/m4/unistd-safer.m4
@@ -0,0 +1,13 @@
+#serial 8
+dnl Copyright (C) 2002, 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_UNISTD_SAFER],
+[
+ AC_CHECK_FUNCS_ONCE([pipe])
+ AC_LIBOBJ([dup-safer])
+ AC_LIBOBJ([fd-safer])
+ AC_LIBOBJ([pipe-safer])
+])
diff --git a/gnulib/m4/unistd_h.m4 b/gnulib/m4/unistd_h.m4
new file mode 100644
index 00000000..31d31c1e
--- /dev/null
+++ b/gnulib/m4/unistd_h.m4
@@ -0,0 +1,149 @@
+# unistd_h.m4 serial 39
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Simon Josefsson, Bruno Haible.
+
+AC_DEFUN([gl_UNISTD_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_C_INLINE])
+
+ gl_CHECK_NEXT_HEADERS([unistd.h])
+
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ if test $ac_cv_header_unistd_h = yes; then
+ HAVE_UNISTD_H=1
+ else
+ HAVE_UNISTD_H=0
+ fi
+ AC_SUBST([HAVE_UNISTD_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <unistd.h>
+/* Some systems declare various items in the wrong headers. */
+#ifndef __GLIBC__
+# include <fcntl.h>
+# include <stdio.h>
+# include <stdlib.h>
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <io.h>
+# endif
+#endif
+ ]], [chown dup2 dup3 environ euidaccess faccessat fchdir fchownat
+ fsync ftruncate getcwd getdomainname getdtablesize getgroups
+ gethostname getlogin getlogin_r getpagesize getusershell setusershell
+ endusershell lchown link linkat lseek pipe2 pread readlink readlinkat
+ rmdir sleep symlink symlinkat unlink unlinkat usleep])
+])
+
+AC_DEFUN([gl_UNISTD_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_UNISTD_H_DEFAULTS],
+[
+ GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN])
+ GNULIB_CLOSE=0; AC_SUBST([GNULIB_CLOSE])
+ GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2])
+ GNULIB_DUP3=0; AC_SUBST([GNULIB_DUP3])
+ GNULIB_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON])
+ GNULIB_EUIDACCESS=0; AC_SUBST([GNULIB_EUIDACCESS])
+ GNULIB_FACCESSAT=0; AC_SUBST([GNULIB_FACCESSAT])
+ GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR])
+ GNULIB_FCHOWNAT=0; AC_SUBST([GNULIB_FCHOWNAT])
+ GNULIB_FSYNC=0; AC_SUBST([GNULIB_FSYNC])
+ GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE])
+ GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD])
+ GNULIB_GETDOMAINNAME=0; AC_SUBST([GNULIB_GETDOMAINNAME])
+ GNULIB_GETDTABLESIZE=0; AC_SUBST([GNULIB_GETDTABLESIZE])
+ GNULIB_GETGROUPS=0; AC_SUBST([GNULIB_GETGROUPS])
+ GNULIB_GETHOSTNAME=0; AC_SUBST([GNULIB_GETHOSTNAME])
+ GNULIB_GETLOGIN=0; AC_SUBST([GNULIB_GETLOGIN])
+ GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R])
+ GNULIB_GETPAGESIZE=0; AC_SUBST([GNULIB_GETPAGESIZE])
+ GNULIB_GETUSERSHELL=0; AC_SUBST([GNULIB_GETUSERSHELL])
+ GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN])
+ GNULIB_LINK=0; AC_SUBST([GNULIB_LINK])
+ GNULIB_LINKAT=0; AC_SUBST([GNULIB_LINKAT])
+ GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK])
+ GNULIB_PIPE2=0; AC_SUBST([GNULIB_PIPE2])
+ GNULIB_PREAD=0; AC_SUBST([GNULIB_PREAD])
+ GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK])
+ GNULIB_READLINKAT=0; AC_SUBST([GNULIB_READLINKAT])
+ GNULIB_RMDIR=0; AC_SUBST([GNULIB_RMDIR])
+ GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP])
+ GNULIB_SYMLINK=0; AC_SUBST([GNULIB_SYMLINK])
+ GNULIB_SYMLINKAT=0; AC_SUBST([GNULIB_SYMLINKAT])
+ GNULIB_UNISTD_H_GETOPT=0; AC_SUBST([GNULIB_UNISTD_H_GETOPT])
+ GNULIB_UNISTD_H_SIGPIPE=0; AC_SUBST([GNULIB_UNISTD_H_SIGPIPE])
+ GNULIB_UNLINK=0; AC_SUBST([GNULIB_UNLINK])
+ GNULIB_UNLINKAT=0; AC_SUBST([GNULIB_UNLINKAT])
+ GNULIB_USLEEP=0; AC_SUBST([GNULIB_USLEEP])
+ GNULIB_WRITE=0; AC_SUBST([GNULIB_WRITE])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_CHOWN=1; AC_SUBST([HAVE_CHOWN])
+ HAVE_DUP2=1; AC_SUBST([HAVE_DUP2])
+ HAVE_DUP3=1; AC_SUBST([HAVE_DUP3])
+ HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS])
+ HAVE_FACCESSAT=1; AC_SUBST([HAVE_FACCESSAT])
+ HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT])
+ HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC])
+ HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE])
+ HAVE_GETDOMAINNAME=1; AC_SUBST([HAVE_GETDOMAINNAME])
+ HAVE_GETDTABLESIZE=1; AC_SUBST([HAVE_GETDTABLESIZE])
+ HAVE_GETGROUPS=1; AC_SUBST([HAVE_GETGROUPS])
+ HAVE_GETHOSTNAME=1; AC_SUBST([HAVE_GETHOSTNAME])
+ HAVE_GETLOGIN=1; AC_SUBST([HAVE_GETLOGIN])
+ HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE])
+ HAVE_GETUSERSHELL=1; AC_SUBST([HAVE_GETUSERSHELL])
+ HAVE_LCHOWN=1; AC_SUBST([HAVE_LCHOWN])
+ HAVE_LINK=1; AC_SUBST([HAVE_LINK])
+ HAVE_LINKAT=1; AC_SUBST([HAVE_LINKAT])
+ HAVE_PIPE2=1; AC_SUBST([HAVE_PIPE2])
+ HAVE_PREAD=1; AC_SUBST([HAVE_PREAD])
+ HAVE_READLINK=1; AC_SUBST([HAVE_READLINK])
+ HAVE_READLINKAT=1; AC_SUBST([HAVE_READLINKAT])
+ HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP])
+ HAVE_SYMLINK=1; AC_SUBST([HAVE_SYMLINK])
+ HAVE_SYMLINKAT=1; AC_SUBST([HAVE_SYMLINKAT])
+ HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON])
+ HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R])
+ HAVE_OS_H=0; AC_SUBST([HAVE_OS_H])
+ HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H])
+ HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT])
+ HAVE_USLEEP=1; AC_SUBST([HAVE_USLEEP])
+ REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN])
+ REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE])
+ REPLACE_DUP=0; AC_SUBST([REPLACE_DUP])
+ REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2])
+ REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR])
+ REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT])
+ REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD])
+ REPLACE_GETGROUPS=0; AC_SUBST([REPLACE_GETGROUPS])
+ REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE])
+ REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN])
+ REPLACE_LINK=0; AC_SUBST([REPLACE_LINK])
+ REPLACE_LINKAT=0; AC_SUBST([REPLACE_LINKAT])
+ REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK])
+ REPLACE_PREAD=0; AC_SUBST([REPLACE_PREAD])
+ REPLACE_READLINK=0; AC_SUBST([REPLACE_READLINK])
+ REPLACE_RMDIR=0; AC_SUBST([REPLACE_RMDIR])
+ REPLACE_SLEEP=0; AC_SUBST([REPLACE_SLEEP])
+ REPLACE_SYMLINK=0; AC_SUBST([REPLACE_SYMLINK])
+ REPLACE_UNLINK=0; AC_SUBST([REPLACE_UNLINK])
+ REPLACE_UNLINKAT=0; AC_SUBST([REPLACE_UNLINKAT])
+ REPLACE_USLEEP=0; AC_SUBST([REPLACE_USLEEP])
+ REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE])
+ UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H])
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+ AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
+])
diff --git a/gnulib/m4/unlink-busy.m4 b/gnulib/m4/unlink-busy.m4
new file mode 100644
index 00000000..15fdc7c8
--- /dev/null
+++ b/gnulib/m4/unlink-busy.m4
@@ -0,0 +1,35 @@
+#serial 11
+
+dnl From J. David Anglin.
+
+dnl HPUX and other systems can't unlink shared text that is being executed.
+
+# Copyright (C) 2000-2001, 2004, 2007, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+AC_DEFUN([gl_FUNC_UNLINK_BUSY_TEXT],
+[dnl
+ AC_CACHE_CHECK([whether a running program can be unlinked],
+ gl_cv_func_unlink_busy_text,
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [AC_INCLUDES_DEFAULT[
+ int
+ main (int argc, char **argv)
+ {
+ return !argc || unlink (argv[0]) != 0;
+ }]])],
+ gl_cv_func_unlink_busy_text=yes,
+ gl_cv_func_unlink_busy_text=no,
+ gl_cv_func_unlink_busy_text=no
+ )
+ ]
+ )
+
+ if test $gl_cv_func_unlink_busy_text = no; then
+ INSTALL=$ac_install_sh
+ fi
+])
diff --git a/gnulib/m4/unlink.m4 b/gnulib/m4/unlink.m4
new file mode 100644
index 00000000..c01d8482
--- /dev/null
+++ b/gnulib/m4/unlink.m4
@@ -0,0 +1,35 @@
+# unlink.m4 serial 3
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_UNLINK],
+[
+ AC_REQUIRE([gl_AC_DOS])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ dnl Detect Solaris 9 and FreeBSD 7.2 bug.
+ AC_CACHE_CHECK([whether unlink honors trailing slashes],
+ [gl_cv_func_unlink_works],
+ [touch conftest.file
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.file conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+ #include <errno.h>
+]], [[if (!unlink ("conftest.file/") || errno != ENOTDIR) return 1;
+#if HAVE_LSTAT
+ if (!unlink ("conftest.lnk/") || errno != ENOTDIR) return 2;
+#endif
+ ]])],
+ [gl_cv_func_unlink_works=yes], [gl_cv_func_unlink_works=no],
+ [gl_cv_func_unlink_works="guessing no"])
+ rm -f conftest.file conftest.lnk])
+ if test x"$gl_cv_func_unlink_works" != xyes; then
+ REPLACE_UNLINK=1
+ AC_LIBOBJ([unlink])
+ fi
+])
diff --git a/gnulib/m4/unlinkdir.m4 b/gnulib/m4/unlinkdir.m4
new file mode 100644
index 00000000..3b3c75e7
--- /dev/null
+++ b/gnulib/m4/unlinkdir.m4
@@ -0,0 +1,34 @@
+# serial 6
+
+# Copyright (C) 2005-2007, 2009-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+# Written by Paul Eggert.
+
+AC_DEFUN([gl_UNLINKDIR],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_HEADERS_ONCE([priv.h])
+
+ AC_LIBOBJ([unlinkdir])
+
+ # The Hurd, the Linux kernel, the FreeBSD kernel version 2.2 and later,
+ # Cygwin, and mingw never let anyone (even root) unlink directories.
+ # If anyone knows of another system for which unlink can never
+ # remove a directory, please report it to <bug-coreutils@gnu.org>.
+ # Unfortunately this is difficult to test for, since it requires root access
+ # and might create garbage in the file system,
+ # so the code below simply relies on the kernel name and version number.
+ case $host_os in
+ gnu[[0-9]]* | \
+ linux-* | linux | \
+ freebsd2.2* | freebsd[[3-9]]* | freebsd[[1-9]][[0-9]]* | \
+ cygwin | \
+ mingw*)
+ AC_DEFINE([UNLINK_CANNOT_UNLINK_DIR], [1],
+ [Define to 1 if unlink (dir) cannot possibly succeed.]);;
+ esac
+])
diff --git a/gnulib/m4/unlocked-io.m4 b/gnulib/m4/unlocked-io.m4
new file mode 100644
index 00000000..bddec0de
--- /dev/null
+++ b/gnulib/m4/unlocked-io.m4
@@ -0,0 +1,41 @@
+# unlocked-io.m4 serial 15
+
+# Copyright (C) 1998-2006, 2009-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+dnl From Jim Meyering.
+dnl
+dnl See if the glibc *_unlocked I/O macros or functions are available.
+dnl Use only those *_unlocked macros or functions that are declared
+dnl (because some of them were declared in Solaris 2.5.1 but were removed
+dnl in Solaris 2.6, whereas we want binaries built on Solaris 2.5.1 to run
+dnl on Solaris 2.6).
+
+AC_DEFUN([gl_FUNC_GLIBC_UNLOCKED_IO],
+[
+ AC_DEFINE([USE_UNLOCKED_IO], [1],
+ [Define to 1 if you want getc etc. to use unlocked I/O if available.
+ Unlocked I/O can improve performance in unithreaded apps,
+ but it is not safe for multithreaded apps.])
+
+ dnl Persuade glibc and Solaris <stdio.h> to declare
+ dnl fgets_unlocked(), fputs_unlocked() etc.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_DECLS_ONCE([clearerr_unlocked])
+ AC_CHECK_DECLS_ONCE([feof_unlocked])
+ AC_CHECK_DECLS_ONCE([ferror_unlocked])
+ AC_CHECK_DECLS_ONCE([fflush_unlocked])
+ AC_CHECK_DECLS_ONCE([fgets_unlocked])
+ AC_CHECK_DECLS_ONCE([fputc_unlocked])
+ AC_CHECK_DECLS_ONCE([fputs_unlocked])
+ AC_CHECK_DECLS_ONCE([fread_unlocked])
+ AC_CHECK_DECLS_ONCE([fwrite_unlocked])
+ AC_CHECK_DECLS_ONCE([getc_unlocked])
+ AC_CHECK_DECLS_ONCE([getchar_unlocked])
+ AC_CHECK_DECLS_ONCE([putc_unlocked])
+ AC_CHECK_DECLS_ONCE([putchar_unlocked])
+])
diff --git a/gnulib/m4/uptime.m4 b/gnulib/m4/uptime.m4
new file mode 100644
index 00000000..308ab2e4
--- /dev/null
+++ b/gnulib/m4/uptime.m4
@@ -0,0 +1,23 @@
+# serial 8
+
+# Copyright (C) 1996, 1999-2001, 2004, 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+AC_PREREQ([2.13])
+
+AC_DEFUN([gl_SYS_PROC_UPTIME],
+[ dnl Require AC_PROG_CC to see if we're cross compiling.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([for /proc/uptime], [gl_cv_have_proc_uptime],
+ [gl_cv_have_proc_uptime=no
+ test -f /proc/uptime \
+ && test "$cross_compiling" = no \
+ && cat < /proc/uptime >/dev/null 2>/dev/null \
+ && gl_cv_have_proc_uptime=yes])
+ if test $gl_cv_have_proc_uptime = yes; then
+ AC_DEFINE([HAVE_PROC_UPTIME], [1],
+ [ Define if your system has the /proc/uptime special file.])
+ fi
+])
diff --git a/gnulib/m4/userspec.m4 b/gnulib/m4/userspec.m4
new file mode 100644
index 00000000..04e0a230
--- /dev/null
+++ b/gnulib/m4/userspec.m4
@@ -0,0 +1,13 @@
+# serial 10
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_USERSPEC],
+[
+ AC_LIBOBJ([userspec])
+
+ dnl Prerequisites of lib/userspec.c.
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+])
diff --git a/gnulib/m4/usleep.m4 b/gnulib/m4/usleep.m4
new file mode 100644
index 00000000..420512eb
--- /dev/null
+++ b/gnulib/m4/usleep.m4
@@ -0,0 +1,37 @@
+# usleep.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This macro intentionally does not check for select or nanosleep;
+dnl both of those modules can require external libraries.
+AC_DEFUN([gl_FUNC_USLEEP],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ dnl usleep was required in POSIX 2001, but dropped as obsolete in
+ dnl POSIX 2008; therefore, it is not always exposed in headers.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([usleep])
+ AC_CHECK_TYPE([useconds_t], [],
+ [AC_DEFINE([useconds_t], [unsigned int], [Define to an unsigned 32-bit
+ type if <sys/types.h> lacks this type.])])
+ if test $ac_cv_func_usleep = no; then
+ HAVE_USLEEP=0
+ AC_LIBOBJ([usleep])
+ else
+ dnl POSIX allows implementations to reject arguments larger than
+ dnl 999999, but GNU guarantees it will work.
+ AC_CACHE_CHECK([whether usleep allows large arguments],
+ [gl_cv_func_usleep_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <unistd.h>
+]], [[return !!usleep (1000000);]])],
+ [gl_cv_func_usleep_works=yes], [gl_cv_func_usleep_works=no],
+ [gl_cv_func_usleep_works="guessing no"])])
+ if test "$gl_cv_func_usleep_works" != yes; then
+ REPLACE_USLEEP=1
+ AC_LIBOBJ([usleep])
+ fi
+ fi
+])
diff --git a/gnulib/m4/utimbuf.m4 b/gnulib/m4/utimbuf.m4
new file mode 100644
index 00000000..88a9f45f
--- /dev/null
+++ b/gnulib/m4/utimbuf.m4
@@ -0,0 +1,39 @@
+# serial 9
+
+# Copyright (C) 1998-2001, 2003-2004, 2007, 2009-2010 Free Software Foundation,
+# Inc.
+#
+# This file 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.
+
+dnl From Jim Meyering
+
+dnl Define HAVE_STRUCT_UTIMBUF if `struct utimbuf' is declared --
+dnl usually in <utime.h>.
+dnl Some systems have utime.h but don't declare the struct anywhere.
+
+AC_DEFUN([gl_CHECK_TYPE_STRUCT_UTIMBUF],
+[
+ AC_CHECK_HEADERS_ONCE([sys/time.h utime.h])
+ AC_CACHE_CHECK([for struct utimbuf], [gl_cv_sys_struct_utimbuf],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #ifdef HAVE_UTIME_H
+ #include <utime.h>
+ #endif
+ ]],
+ [[static struct utimbuf x; x.actime = x.modtime;]])],
+ [gl_cv_sys_struct_utimbuf=yes],
+ [gl_cv_sys_struct_utimbuf=no])])
+
+ if test $gl_cv_sys_struct_utimbuf = yes; then
+ AC_DEFINE([HAVE_STRUCT_UTIMBUF], [1],
+ [Define if struct utimbuf is declared -- usually in <utime.h>.
+ Some systems have utime.h but don't declare the struct anywhere. ])
+ fi
+])
diff --git a/gnulib/m4/utime.m4 b/gnulib/m4/utime.m4
new file mode 100644
index 00000000..08caa4e7
--- /dev/null
+++ b/gnulib/m4/utime.m4
@@ -0,0 +1,62 @@
+# serial 9
+
+dnl From Jim Meyering
+dnl Replace the utime function on systems that need it.
+
+# Copyright (C) 1998, 2000-2001, 2003-2004, 2009-2010 Free Software Foundation,
+# Inc.
+# This file 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.
+
+dnl FIXME
+
+AC_DEFUN([gl_FUNC_UTIME],
+[
+ AC_REQUIRE([AC_FUNC_UTIME_NULL])
+ if test $ac_cv_func_utime_null = no; then
+ AC_LIBOBJ([utime])
+ AC_DEFINE([utime], [rpl_utime],
+ [Define to rpl_utime if the replacement function should be used.])
+ gl_PREREQ_UTIME
+ fi
+])
+
+# Prerequisites of lib/utime.c.
+AC_DEFUN([gl_PREREQ_UTIME],
+[
+ AC_CHECK_HEADERS_ONCE([utime.h])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_UTIMBUF])
+ gl_FUNC_UTIMES_NULL
+])
+
+# Use the definition of AC_FUNC_UTIME_NULL from autoconf 2.64 or newer.
+# Remove this macro when we can assume autoconf >= 2.64.
+m4_version_prereq([2.64], [], [
+AC_DEFUN([AC_FUNC_UTIME_NULL],
+[AC_CHECK_HEADERS_ONCE([utime.h])
+AC_CACHE_CHECK([whether utime accepts a null argument], [ac_cv_func_utime_null],
+[rm -f conftest.data; >conftest.data
+# Sequent interprets utime(file, 0) to mean use start of epoch. Wrong.
+AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+ #ifdef HAVE_UTIME_H
+ # include <utime.h>
+ #endif],
+[[struct stat s, t;
+ return ! (stat ("conftest.data", &s) == 0
+ && utime ("conftest.data", 0) == 0
+ && stat ("conftest.data", &t) == 0
+ && t.st_mtime >= s.st_mtime
+ && t.st_mtime - s.st_mtime < 120);]])],
+ ac_cv_func_utime_null=yes,
+ ac_cv_func_utime_null=no,
+ ac_cv_func_utime_null='guessing yes')])
+if test "x$ac_cv_func_utime_null" != xno; then
+ ac_cv_func_utime_null=yes
+ AC_DEFINE([HAVE_UTIME_NULL], [1],
+ [Define to 1 if `utime(file, NULL)' sets file's timestamp to the
+ present.])
+fi
+rm -f conftest.data
+])
+])
diff --git a/gnulib/m4/utimecmp.m4 b/gnulib/m4/utimecmp.m4
new file mode 100644
index 00000000..b26a6352
--- /dev/null
+++ b/gnulib/m4/utimecmp.m4
@@ -0,0 +1,14 @@
+#serial 3
+dnl Copyright (C) 2004-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_UTIMECMP],
+[
+ AC_LIBOBJ([utimecmp])
+
+ dnl Prerequisites of lib/utimecmp.c.
+ AC_REQUIRE([gl_FUNC_UTIMES])
+ :
+])
diff --git a/gnulib/m4/utimens.m4 b/gnulib/m4/utimens.m4
new file mode 100644
index 00000000..2baa2561
--- /dev/null
+++ b/gnulib/m4/utimens.m4
@@ -0,0 +1,41 @@
+dnl Copyright (C) 2003-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl serial 4
+
+AC_DEFUN([gl_UTIMENS],
+[
+ AC_LIBOBJ([utimens])
+
+ dnl Prerequisites of lib/utimens.c.
+ AC_REQUIRE([gl_FUNC_UTIMES])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_UTIMBUF])
+ AC_CHECK_FUNCS_ONCE([futimes futimesat futimens utimensat lutimes])
+
+ if test $ac_cv_func_futimens = no && test $ac_cv_func_futimesat = yes; then
+ dnl FreeBSD 8.0-rc2 mishandles futimesat(fd,NULL,time). It is not
+ dnl standardized, but Solaris implemented it first and uses it as
+ dnl its only means to set fd time.
+ AC_CACHE_CHECK([whether futimesat handles NULL file],
+ [gl_cv_func_futimesat_works],
+ [touch conftest.file
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <stddef.h>
+#include <sys/times.h>
+]], [[ int fd = open ("conftest.file", O_RDWR);
+ if (fd < 0) return 1;
+ if (futimesat (fd, NULL, NULL)) return 2;
+ ]])],
+ [gl_cv_func_futimesat_works=yes],
+ [gl_cv_func_futimesat_works=no],
+ [gl_cv_func_futimesat_works="guessing no"])
+ rm -f conftest.file])
+ if test "$gl_cv_func_futimesat_works" != yes; then
+ AC_DEFINE([FUTIMESAT_NULL_BUG], [1],
+ [Define to 1 if futimesat mishandles a NULL file name.])
+ fi
+ fi
+])
diff --git a/gnulib/m4/utimensat.m4 b/gnulib/m4/utimensat.m4
new file mode 100644
index 00000000..1110e07c
--- /dev/null
+++ b/gnulib/m4/utimensat.m4
@@ -0,0 +1,56 @@
+# serial 3
+# See if we need to provide utimensat replacement.
+
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_UTIMENSAT],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([utimensat])
+ if test $ac_cv_func_utimensat = no; then
+ HAVE_UTIMENSAT=0
+ AC_LIBOBJ([utimensat])
+ else
+ AC_CACHE_CHECK([whether utimensat works],
+ [gl_cv_func_utimensat_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+]], [[struct timespec ts[2] = { { 1, UTIME_OMIT }, { 1, UTIME_NOW } };
+ struct stat st;
+ const char *f = "conftest.file";
+ if (close (creat (f, 0600))) return 1;
+ if (utimensat (AT_FDCWD, f, NULL, AT_SYMLINK_NOFOLLOW)) return 2;
+ if (utimensat (AT_FDCWD, f, ts, 0)) return 3;
+ sleep (1);
+ ts[0].tv_nsec = UTIME_NOW;
+ ts[1].tv_nsec = UTIME_OMIT;
+ if (utimensat (AT_FDCWD, f, ts, 0)) return 4;
+ if (stat (f, &st)) return 5;
+ if (st.st_ctime < st.st_atime) return 6;]])],
+dnl FIXME: simplify this in 2012, when file system bugs are no longer common
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#ifdef __linux__
+/* The Linux kernel added utimensat in 2.6.22, but has bugs with UTIME_OMIT
+ in several file systems as recently as 2.6.32. Always replace utimensat
+ to support older kernels. */
+choke me
+#endif
+ ]])],
+ [gl_cv_func_utimensat_works=yes],
+ [gl_cv_func_utimensat_works="needs runtime check"])],
+ [gl_cv_func_utimensat_works=no],
+ [gl_cv_func_utimensat_works="guessing no"])])
+ if test "$gl_cv_func_utimensat_works" != yes; then
+ REPLACE_UTIMENSAT=1
+ AC_LIBOBJ([utimensat])
+ fi
+ fi
+])
diff --git a/gnulib/m4/utimes-null.m4 b/gnulib/m4/utimes-null.m4
new file mode 100644
index 00000000..bcb5eb1f
--- /dev/null
+++ b/gnulib/m4/utimes-null.m4
@@ -0,0 +1,41 @@
+# serial 9
+
+# Copyright (C) 1998-1999, 2001, 2003-2004, 2006, 2009-2010 Free Software
+# Foundation, Inc.
+
+# This file 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.
+
+dnl Shamelessly cloned from acspecific.m4's AC_FUNC_UTIME_NULL,
+dnl then do case-insensitive s/utime/utimes/.
+
+AC_DEFUN([gl_FUNC_UTIMES_NULL],
+[AC_CACHE_CHECK([whether utimes accepts a null argument], [ac_cv_func_utimes_null],
+[rm -f conftest.data; > conftest.data
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+/* In case stat has been defined to rpl_stat, undef it here. */
+#undef stat
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+int
+main () {
+struct stat s, t;
+return ! (stat ("conftest.data", &s) == 0
+ && utimes ("conftest.data", 0) == 0
+ && stat ("conftest.data", &t) == 0
+ && t.st_mtime >= s.st_mtime
+ && t.st_mtime - s.st_mtime < 120));
+}]])],
+ [ac_cv_func_utimes_null=yes],
+ [ac_cv_func_utimes_null=no],
+ [ac_cv_func_utimes_null=no])
+rm -f core core.* *.core])
+
+ if test $ac_cv_func_utimes_null = yes; then
+ AC_DEFINE([HAVE_UTIMES_NULL], [1],
+ [Define if utimes accepts a null argument])
+ fi
+ ]
+)
diff --git a/gnulib/m4/utimes.m4 b/gnulib/m4/utimes.m4
new file mode 100644
index 00000000..e6d6f776
--- /dev/null
+++ b/gnulib/m4/utimes.m4
@@ -0,0 +1,84 @@
+# Detect some bugs in glibc's implementation of utimes.
+# serial 2
+
+dnl Copyright (C) 2003-2005, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# See if we need to work around bugs in glibc's implementation of
+# utimes from 2003-07-12 to 2003-09-17.
+# First, there was a bug that would make utimes set mtime
+# and atime to zero (1970-01-01) unconditionally.
+# Then, there was code to round rather than truncate.
+# Then, there was an implementation (sparc64, Linux-2.4.28, glibc-2.3.3)
+# that didn't honor the NULL-means-set-to-current-time semantics.
+# Finally, there was also a version of utimes that failed on read-only
+# files, while utime worked fine (linux-2.2.20, glibc-2.2.5).
+#
+# From Jim Meyering, with suggestions from Paul Eggert.
+
+AC_DEFUN([gl_FUNC_UTIMES],
+[
+ AC_CACHE_CHECK([whether the utimes function works],
+ [gl_cv_func_working_utimes],
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <utime.h>
+
+int
+main ()
+{
+ static struct timeval timeval[2] = {{9, 10}, {999999, 999999}};
+ struct stat sbuf;
+ char const *file = "conftest.utimes";
+ FILE *f;
+ time_t now;
+ int fd;
+
+ int ok = ((f = fopen (file, "w"))
+ && fclose (f) == 0
+ && utimes (file, timeval) == 0
+ && lstat (file, &sbuf) == 0
+ && sbuf.st_atime == timeval[0].tv_sec
+ && sbuf.st_mtime == timeval[1].tv_sec);
+ unlink (file);
+ if (!ok)
+ exit (1);
+
+ ok =
+ ((f = fopen (file, "w"))
+ && fclose (f) == 0
+ && time (&now) != (time_t)-1
+ && utimes (file, NULL) == 0
+ && lstat (file, &sbuf) == 0
+ && now - sbuf.st_atime <= 2
+ && now - sbuf.st_mtime <= 2);
+ unlink (file);
+ if (!ok)
+ exit (1);
+
+ ok = (0 <= (fd = open (file, O_WRONLY|O_CREAT, 0444))
+ && close (fd) == 0
+ && utimes (file, NULL) == 0);
+ unlink (file);
+
+ exit (!ok);
+}
+ ]])],
+ [gl_cv_func_working_utimes=yes],
+ [gl_cv_func_working_utimes=no],
+ [gl_cv_func_working_utimes=no])])
+
+ if test $gl_cv_func_working_utimes = yes; then
+ AC_DEFINE([HAVE_WORKING_UTIMES], [1], [Define if utimes works properly. ])
+ fi
+])
diff --git a/gnulib/m4/va-args.m4 b/gnulib/m4/va-args.m4
new file mode 100644
index 00000000..b0af3e92
--- /dev/null
+++ b/gnulib/m4/va-args.m4
@@ -0,0 +1,25 @@
+# va-args.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Test for variadic macro support.
+dnl Define HAVE_VA_ARGS if macros can use __VA_ARGS__.
+AC_DEFUN([gl_VA_ARGS],
+[
+ AC_CACHE_CHECK([whether the preprocessor allows variadic macros],
+ [gl_cv_c_va_args],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #include <stdio.h>
+ #define a(func, arg, ...) func (arg, __VA_ARGS__)
+ #define b(...) a (__VA_ARGS__)
+ ]], [[b (printf, "%s", "test");]])],
+ [gl_cv_c_va_args=yes], [gl_cv_c_va_args=no])
+ ])
+ if test $gl_cv_c_va_args = yes; then
+ AC_DEFINE([HAVE_VA_ARGS], [1],
+ [Define to 1 if the preprocessor supports variadic macros and
+ __VA_ARGS__.])
+ fi
+])
diff --git a/gnulib/m4/vararrays.m4 b/gnulib/m4/vararrays.m4
new file mode 100644
index 00000000..c1c8e1ff
--- /dev/null
+++ b/gnulib/m4/vararrays.m4
@@ -0,0 +1,25 @@
+# Check for variable-length arrays.
+
+# serial 4
+
+# From Paul Eggert
+
+# Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc.
+# This file 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.
+
+AC_DEFUN([AC_C_VARARRAYS],
+[
+ AC_CACHE_CHECK([for variable-length arrays],
+ ac_cv_c_vararrays,
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [],
+ [[static int x; char a[++x]; a[sizeof a - 1] = 0; return a[0];]])],
+ ac_cv_c_vararrays=yes,
+ ac_cv_c_vararrays=no)])
+ if test $ac_cv_c_vararrays = yes; then
+ AC_DEFINE([HAVE_C_VARARRAYS], [1],
+ [Define to 1 if C supports variable-length arrays.])
+ fi
+])
diff --git a/gnulib/m4/vasnprintf-posix.m4 b/gnulib/m4/vasnprintf-posix.m4
new file mode 100644
index 00000000..b37dc7e2
--- /dev/null
+++ b/gnulib/m4/vasnprintf-posix.m4
@@ -0,0 +1,100 @@
+# vasnprintf-posix.m4 serial 13
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VASNPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_vasnprintf_posix=no
+ AC_CHECK_FUNCS_ONCE([vasnprintf])
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ if test $ac_cv_func_vasnprintf = yes; then
+ # vasnprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_vasnprintf_posix=yes
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ if test $gl_cv_func_vasnprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ fi
+])
diff --git a/gnulib/m4/vasnprintf.m4 b/gnulib/m4/vasnprintf.m4
new file mode 100644
index 00000000..50a20cca
--- /dev/null
+++ b/gnulib/m4/vasnprintf.m4
@@ -0,0 +1,276 @@
+# vasnprintf.m4 serial 29
+dnl Copyright (C) 2002-2004, 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VASNPRINTF],
+[
+ AC_CHECK_FUNCS_ONCE([vasnprintf])
+ if test $ac_cv_func_vasnprintf = no; then
+ gl_REPLACE_VASNPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VASNPRINTF],
+[
+ AC_CHECK_FUNCS_ONCE([vasnprintf])
+ AC_LIBOBJ([vasnprintf])
+ AC_LIBOBJ([printf-args])
+ AC_LIBOBJ([printf-parse])
+ AC_LIBOBJ([asnprintf])
+ if test $ac_cv_func_vasnprintf = yes; then
+ AC_DEFINE([REPLACE_VASNPRINTF], [1],
+ [Define if vasnprintf exists but is overridden by gnulib.])
+ fi
+ gl_PREREQ_PRINTF_ARGS
+ gl_PREREQ_PRINTF_PARSE
+ gl_PREREQ_VASNPRINTF
+ gl_PREREQ_ASNPRINTF
+])
+
+# Prequisites of lib/printf-args.h, lib/printf-args.c.
+AC_DEFUN([gl_PREREQ_PRINTF_ARGS],
+[
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+])
+
+# Prequisites of lib/printf-parse.h, lib/printf-parse.c.
+AC_DEFUN([gl_PREREQ_PRINTF_PARSE],
+[
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ AC_REQUIRE([AC_TYPE_SIZE_T])
+ AC_CHECK_TYPE([ptrdiff_t], ,
+ [AC_DEFINE([ptrdiff_t], [long],
+ [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+ ])
+ AC_REQUIRE([gt_AC_TYPE_INTMAX_T])
+])
+
+# Prerequisites of lib/vasnprintf.c.
+AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF],
+[
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb])
+ dnl Use the _snprintf function only if it is declared (because on NetBSD it
+ dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+ AC_CHECK_DECLS([_snprintf], , , [#include <stdio.h>])
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting 'long double'
+# arguments.
+AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting infinite 'double'
+# arguments.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_INFINITE_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ infinite 'double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting infinite 'long double'
+# arguments.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ dnl There is no need to set NEED_PRINTF_INFINITE_LONG_DOUBLE if
+ dnl NEED_PRINTF_LONG_DOUBLE is already set.
+ AC_REQUIRE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE])
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_INFINITE_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ infinite 'long double' arguments.])
+ ;;
+ esac
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'a' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_A],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'a' and 'A' directives.])
+ AC_CHECK_FUNCS([nl_langinfo])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'F' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_F],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_F], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'F' directive.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'ls' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_LS],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_LS], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'ls' directive.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the ' flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_GROUPING],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_GROUPING], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ ' flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the '-' flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_LEFTADJUST], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ '-' flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 0 flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_ZERO],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_ZERO], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ 0 flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting large precisions.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_PRECISION],
+[
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_UNBOUNDED_PRECISION], [1],
+ [Define if the vasnprintf implementation needs special code for
+ supporting large precisions without arbitrary bounds.])
+ AC_DEFINE([NEED_PRINTF_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'double' arguments.])
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for surviving out-of-memory
+# conditions.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_ENOMEM],
+[
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_ENOMEM], [1],
+ [Define if the vasnprintf implementation needs special code for
+ surviving out-of-memory conditions.])
+ AC_DEFINE([NEED_PRINTF_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'double' arguments.])
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Prerequisites of lib/vasnprintf.c including all extras for POSIX compliance.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_WITH_EXTRAS],
+[
+ AC_REQUIRE([gl_PREREQ_VASNPRINTF])
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+])
+
+# Prerequisites of lib/asnprintf.c.
+AC_DEFUN([gl_PREREQ_ASNPRINTF],
+[
+])
diff --git a/gnulib/m4/vasprintf-posix.m4 b/gnulib/m4/vasprintf-posix.m4
new file mode 100644
index 00000000..a0b7bc66
--- /dev/null
+++ b/gnulib/m4/vasprintf-posix.m4
@@ -0,0 +1,101 @@
+# vasprintf-posix.m4 serial 13
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VASPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_vasprintf_posix=no
+ AC_CHECK_FUNCS([vasprintf])
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ if test $ac_cv_func_vasprintf = yes; then
+ # vasprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_vasprintf_posix=yes
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ if test $gl_cv_func_vasprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_VASPRINTF
+ fi
+])
diff --git a/gnulib/m4/vasprintf.m4 b/gnulib/m4/vasprintf.m4
new file mode 100644
index 00000000..b142bc0f
--- /dev/null
+++ b/gnulib/m4/vasprintf.m4
@@ -0,0 +1,46 @@
+# vasprintf.m4 serial 6
+dnl Copyright (C) 2002-2003, 2006-2007, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VASPRINTF],
+[
+ AC_CHECK_FUNCS([vasprintf])
+ if test $ac_cv_func_vasprintf = no; then
+ gl_REPLACE_VASPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VASPRINTF],
+[
+ AC_LIBOBJ([vasprintf])
+ AC_LIBOBJ([asprintf])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ if test $ac_cv_func_vasprintf = yes; then
+ REPLACE_VASPRINTF=1
+ else
+ HAVE_VASPRINTF=0
+ fi
+ gl_PREREQ_VASPRINTF_H
+ gl_PREREQ_VASPRINTF
+ gl_PREREQ_ASPRINTF
+])
+
+# Prerequisites of the vasprintf portion of lib/stdio.h.
+AC_DEFUN([gl_PREREQ_VASPRINTF_H],
+[
+ dnl Persuade glibc <stdio.h> to declare asprintf() and vasprintf().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+])
+
+# Prerequisites of lib/vasprintf.c.
+AC_DEFUN([gl_PREREQ_VASPRINTF],
+[
+])
+
+# Prerequisites of lib/asprintf.c.
+AC_DEFUN([gl_PREREQ_ASPRINTF],
+[
+])
diff --git a/gnulib/m4/vdprintf-posix.m4 b/gnulib/m4/vdprintf-posix.m4
new file mode 100644
index 00000000..a38fd70b
--- /dev/null
+++ b/gnulib/m4/vdprintf-posix.m4
@@ -0,0 +1,101 @@
+# vdprintf-posix.m4 serial 2
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VDPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_vdprintf_posix=no
+ AC_CHECK_FUNCS_ONCE([vdprintf])
+ if test $ac_cv_func_vdprintf = yes; then
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # vdprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_vdprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_vdprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_VDPRINTF
+ fi
+])
diff --git a/gnulib/m4/vdprintf.m4 b/gnulib/m4/vdprintf.m4
new file mode 100644
index 00000000..fd3eb4ff
--- /dev/null
+++ b/gnulib/m4/vdprintf.m4
@@ -0,0 +1,28 @@
+# vdprintf.m4 serial 1
+dnl Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VDPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([vdprintf])
+ if test $ac_cv_func_vdprintf = no; then
+ HAVE_VDPRINTF=0
+ gl_REPLACE_VDPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VDPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([vdprintf])
+ if test $ac_cv_func_vdprintf = yes; then
+ REPLACE_VDPRINTF=1
+ fi
+ gl_PREREQ_VDPRINTF
+])
+
+# Prerequisites of lib/vdprintf.c.
+AC_DEFUN([gl_PREREQ_VDPRINTF], [:])
diff --git a/gnulib/m4/version-etc.m4 b/gnulib/m4/version-etc.m4
new file mode 100644
index 00000000..2c572b4b
--- /dev/null
+++ b/gnulib/m4/version-etc.m4
@@ -0,0 +1,33 @@
+# version-etc.m4 serial 1
+# Copyright (C) 2009-2010 Free Software Foundation, Inc.
+# This file 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.
+
+dnl $1 - configure flag and define name
+dnl $2 - human readable description
+m4_define([gl_VERSION_ETC_FLAG],
+[dnl
+ AC_ARG_WITH([$1], [AS_HELP_STRING([--with-$1], [$2])],
+ [dnl
+ case $withval in
+ yes|no) ;;
+ *) AC_DEFINE_UNQUOTED(AS_TR_CPP([PACKAGE_$1]), ["$withval"], [$2]) ;;
+ esac
+ ])
+])
+
+AC_DEFUN([gl_VERSION_ETC],
+[dnl
+ gl_VERSION_ETC_FLAG([packager],
+ [String identifying the packager of this software])
+ gl_VERSION_ETC_FLAG([packager-version],
+ [Packager-specific version information])
+ gl_VERSION_ETC_FLAG([packager-bug-reports],
+ [Packager info for bug reports (URL/e-mail/...)])
+ if test "X$with_packager" = "X" && \
+ test "X$with_packager_version$with_packager_bug_reports" != "X"
+ then
+ AC_MSG_ERROR([The --with-packager-{bug-reports,version} options require --with-packager])
+ fi
+])
diff --git a/gnulib/m4/vfprintf-posix.m4 b/gnulib/m4/vfprintf-posix.m4
new file mode 100644
index 00000000..6f35b2f3
--- /dev/null
+++ b/gnulib/m4/vfprintf-posix.m4
@@ -0,0 +1,110 @@
+# vfprintf-posix.m4 serial 14
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VFPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_vfprintf_posix=no
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # vfprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_vfprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ if test $gl_cv_func_vfprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_VFPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VFPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([vfprintf])
+ REPLACE_VFPRINTF=1
+ AC_DEFINE([REPLACE_VFPRINTF_POSIX], [1],
+ [Define if vfprintf is overridden by a POSIX compliant gnulib implementation.])
+ gl_PREREQ_VFPRINTF
+])
+
+AC_DEFUN([gl_PREREQ_VFPRINTF], [:])
diff --git a/gnulib/m4/visibility.m4 b/gnulib/m4/visibility.m4
new file mode 100644
index 00000000..35a6dc0e
--- /dev/null
+++ b/gnulib/m4/visibility.m4
@@ -0,0 +1,52 @@
+# visibility.m4 serial 2 (gettext-0.18)
+dnl Copyright (C) 2005, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl MacOS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ CFLAG_VISIBILITY=
+ HAVE_VISIBILITY=0
+ if test -n "$GCC"; then
+ AC_MSG_CHECKING([for simple visibility declarations])
+ AC_CACHE_VAL([gl_cv_cc_visibility], [
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ AC_TRY_COMPILE(
+ [extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);],
+ [],
+ [gl_cv_cc_visibility=yes],
+ [gl_cv_cc_visibility=no])
+ CFLAGS="$gl_save_CFLAGS"])
+ AC_MSG_RESULT([$gl_cv_cc_visibility])
+ if test $gl_cv_cc_visibility = yes; then
+ CFLAG_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ fi
+ fi
+ AC_SUBST([CFLAG_VISIBILITY])
+ AC_SUBST([HAVE_VISIBILITY])
+ AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+ [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/gnulib/m4/vprintf-posix.m4 b/gnulib/m4/vprintf-posix.m4
new file mode 100644
index 00000000..0f249dfe
--- /dev/null
+++ b/gnulib/m4/vprintf-posix.m4
@@ -0,0 +1,25 @@
+# vprintf-posix.m4 serial 3
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_FUNC_VFPRINTF_POSIX])
+ if test $gl_cv_func_vfprintf_posix = no; then
+ gl_REPLACE_VPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([vprintf])
+ REPLACE_VPRINTF=1
+ AC_DEFINE([REPLACE_VPRINTF_POSIX], [1],
+ [Define if vprintf is overridden by a POSIX compliant gnulib implementation.])
+ gl_PREREQ_VPRINTF
+])
+
+AC_DEFUN([gl_PREREQ_VPRINTF], [:])
diff --git a/gnulib/m4/vsnprintf-posix.m4 b/gnulib/m4/vsnprintf-posix.m4
new file mode 100644
index 00000000..1243717d
--- /dev/null
+++ b/gnulib/m4/vsnprintf-posix.m4
@@ -0,0 +1,127 @@
+# vsnprintf-posix.m4 serial 14
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VSNPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_vsnprintf_posix=no
+ AC_CHECK_FUNCS([vsnprintf])
+ if test $ac_cv_func_vsnprintf = yes; then
+ dnl Assume that if vsnprintf() exists, snprintf() also exists.
+ gl_SNPRINTF_TRUNCATION_C99
+ gl_SNPRINTF_RETVAL_C99
+ gl_SNPRINTF_DIRECTIVE_N
+ gl_SNPRINTF_SIZE1
+ gl_VSNPRINTF_ZEROSIZE_C99
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ case "$gl_cv_func_snprintf_truncation_c99" in
+ *yes)
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+ case "$gl_cv_func_snprintf_directive_n" in
+ *yes)
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+ case "$gl_cv_func_vsnprintf_zerosize_c99" in
+ *yes)
+ # vsnprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_vsnprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_vsnprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_VSNPRINTF
+ fi
+])
diff --git a/gnulib/m4/vsnprintf.m4 b/gnulib/m4/vsnprintf.m4
new file mode 100644
index 00000000..ed189c23
--- /dev/null
+++ b/gnulib/m4/vsnprintf.m4
@@ -0,0 +1,40 @@
+# vsnprintf.m4 serial 5
+dnl Copyright (C) 2002-2004, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VSNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_cv_func_vsnprintf_usable=no
+ AC_CHECK_FUNCS([vsnprintf])
+ if test $ac_cv_func_vsnprintf = yes; then
+ gl_SNPRINTF_SIZE1
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+ gl_cv_func_vsnprintf_usable=yes
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_vsnprintf_usable = no; then
+ gl_REPLACE_VSNPRINTF
+ fi
+ AC_CHECK_DECLS_ONCE([vsnprintf])
+ if test $ac_cv_have_decl_vsnprintf = no; then
+ HAVE_DECL_VSNPRINTF=0
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VSNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([vsnprintf])
+ if test $ac_cv_func_vsnprintf = yes; then
+ REPLACE_VSNPRINTF=1
+ fi
+ gl_PREREQ_VSNPRINTF
+])
+
+# Prerequisites of lib/vsnprintf.c.
+AC_DEFUN([gl_PREREQ_VSNPRINTF], [:])
diff --git a/gnulib/m4/vsprintf-posix.m4 b/gnulib/m4/vsprintf-posix.m4
new file mode 100644
index 00000000..dfee532d
--- /dev/null
+++ b/gnulib/m4/vsprintf-posix.m4
@@ -0,0 +1,108 @@
+# vsprintf-posix.m4 serial 12
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_VSPRINTF_POSIX],
+[
+ AC_REQUIRE([gl_PRINTF_SIZES_C99])
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ AC_REQUIRE([gl_PRINTF_POSITIONS])
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ gl_cv_func_vsprintf_posix=no
+ case "$gl_cv_func_printf_sizes_c99" in
+ *yes)
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ case "$gl_cv_func_printf_directive_n" in
+ *yes)
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ # vsprintf exists and is
+ # already POSIX compliant.
+ gl_cv_func_vsprintf_posix=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ if test $gl_cv_func_vsprintf_posix = no; then
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+ gl_REPLACE_VASNPRINTF
+ gl_REPLACE_VSPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VSPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([vsprintf])
+ REPLACE_VSPRINTF=1
+ gl_PREREQ_VSPRINTF
+])
+
+AC_DEFUN([gl_PREREQ_VSPRINTF], [:])
diff --git a/gnulib/m4/wait-process.m4 b/gnulib/m4/wait-process.m4
new file mode 100644
index 00000000..22e0698d
--- /dev/null
+++ b/gnulib/m4/wait-process.m4
@@ -0,0 +1,13 @@
+# wait-process.m4 serial 5
+dnl Copyright (C) 2003, 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_WAIT_PROCESS],
+[
+ dnl Prerequisites of lib/wait-process.c.
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([gt_TYPE_SIG_ATOMIC_T])
+ AC_CHECK_FUNCS([waitid])
+])
diff --git a/gnulib/m4/warn-on-use.m4 b/gnulib/m4/warn-on-use.m4
new file mode 100644
index 00000000..42daae87
--- /dev/null
+++ b/gnulib/m4/warn-on-use.m4
@@ -0,0 +1,45 @@
+# warn-on-use.m4 serial 2
+dnl Copyright (C) 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES)
+# ---------------------------------------
+# For each whitespace-separated element in the list of NAMES, define
+# HAVE_RAW_DECL_name if the function has a declaration among INCLUDES
+# even after being undefined as a macro.
+#
+# See warn-on-use.h for some hints on how to poison function names, as
+# well as ideas on poisoning global variables and macros. NAMES may
+# include global variables, but remember that only functions work with
+# _GL_WARN_ON_USE. Typically, INCLUDES only needs to list a single
+# header, but if the replacement header pulls in other headers because
+# some systems declare functions in the wrong header, then INCLUDES
+# should do likewise.
+#
+# If you assume C89, then it is generally safe to assume declarations
+# for functions declared in that standard (such as gets) without
+# needing gl_WARN_ON_USE_PREPARE.
+AC_DEFUN([gl_WARN_ON_USE_PREPARE],
+[
+ m4_foreach_w([gl_decl], [$2],
+ [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])),
+ [Define to 1 if ]m4_defn([gl_decl])[ is declared even after
+ undefining macros.])])dnl
+ for gl_func in m4_flatten([$2]); do
+ AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl
+ AC_CACHE_CHECK([whether $gl_func is declared without a macro],
+ gl_Symbol,
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1],
+[@%:@undef $gl_func
+ (void) $gl_func;])],
+ [AS_VAR_SET(gl_Symbol, [yes])], [AS_VAR_SET(gl_Symbol, [no])])])
+ AS_VAR_IF(gl_Symbol, [yes],
+ [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1])
+ dnl shortcut - if the raw declaration exists, then set a cache
+ dnl variable to allow skipping any later AC_CHECK_DECL efforts
+ eval ac_cv_have_decl_$gl_func=yes])
+ AS_VAR_POPDEF([gl_Symbol])dnl
+ done
+])
diff --git a/gnulib/m4/warnings.m4 b/gnulib/m4/warnings.m4
new file mode 100644
index 00000000..dad5c1f2
--- /dev/null
+++ b/gnulib/m4/warnings.m4
@@ -0,0 +1,36 @@
+# warnings.m4 serial 2
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson
+
+# gl_AS_VAR_APPEND(VAR, VALUE)
+# ----------------------------
+# Provide the functionality of AS_VAR_APPEND if Autoconf does not have it.
+m4_ifdef([AS_VAR_APPEND],
+[m4_copy([AS_VAR_APPEND], [gl_AS_VAR_APPEND])],
+[m4_define([gl_AS_VAR_APPEND],
+[AS_VAR_SET([$1], [AS_VAR_GET([$1])$2])])])
+
+# gl_WARN_ADD(PARAMETER, [VARIABLE = WARN_CFLAGS])
+# ------------------------------------------------
+# Adds parameter to WARN_CFLAGS if the compiler supports it. For example,
+# gl_WARN_ADD([-Wparentheses]).
+AC_DEFUN([gl_WARN_ADD],
+[AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_$1])dnl
+AC_CACHE_CHECK([whether compiler handles $1], [gl_Warn], [
+ save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="${CPPFLAGS} $1"
+ AC_PREPROC_IFELSE([AC_LANG_PROGRAM([])],
+ [AS_VAR_SET([gl_Warn], [yes])],
+ [AS_VAR_SET([gl_Warn], [no])])
+ CPPFLAGS="$save_CPPFLAGS"
+])
+AS_VAR_PUSHDEF([gl_Flags], m4_if([$2], [], [[WARN_CFLAGS]], [[$2]]))dnl
+AS_VAR_IF([gl_Warn], [yes], [gl_AS_VAR_APPEND([gl_Flags], [" $1"])])
+AS_VAR_POPDEF([gl_Flags])dnl
+AS_VAR_POPDEF([gl_Warn])dnl
+m4_ifval([$2], [AS_LITERAL_IF([$2], [AC_SUBST([$2])], [])])dnl
+])
diff --git a/gnulib/m4/wchar.m4 b/gnulib/m4/wchar.m4
new file mode 100644
index 00000000..e81485d0
--- /dev/null
+++ b/gnulib/m4/wchar.m4
@@ -0,0 +1,150 @@
+dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
+
+dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Eric Blake.
+
+# wchar.m4 serial 31
+
+AC_DEFUN([gl_WCHAR_H],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([gl_WCHAR_H_INLINE_OK])
+ dnl Prepare for creating substitute <wchar.h>.
+ dnl Check for <wchar.h> (missing in Linux uClibc when built without wide
+ dnl character support).
+ dnl <wchar.h> is always overridden, because of GNULIB_POSIXCHECK.
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+ gl_CHECK_NEXT_HEADERS([wchar.h])
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+ AC_SUBST([HAVE_WCHAR_H])
+
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+ AC_SUBST([HAVE_WINT_T])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+/* Some systems require additional headers. */
+#ifndef __GLIBC__
+# include <stddef.h>
+# include <stdio.h>
+# include <time.h>
+#endif
+#include <wchar.h>
+ ]], [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
+ wcsrtombs wcsnrtombs wcwidth])
+])
+
+dnl Check whether <wchar.h> is usable at all.
+AC_DEFUN([gl_WCHAR_H_INLINE_OK],
+[
+ dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
+ dnl 'gnu_inline'. See <http://sourceware.org/bugzilla/show_bug.cgi?id=4022>
+ dnl and <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
+ dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
+ dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
+ AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
+ [gl_cv_header_wchar_h_correct_inline],
+ [gl_cv_header_wchar_h_correct_inline=yes
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([[#define wcstod renamed_wcstod
+#include <wchar.h>
+extern int zero (void);
+int main () { return zero(); }
+]])])
+ if AC_TRY_EVAL([ac_compile]); then
+ mv conftest.$ac_objext conftest1.$ac_objext
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([[#define wcstod renamed_wcstod
+#include <wchar.h>
+int zero (void) { return 0; }
+]])])
+ if AC_TRY_EVAL([ac_compile]); then
+ mv conftest.$ac_objext conftest2.$ac_objext
+ if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
+ :
+ else
+ gl_cv_header_wchar_h_correct_inline=no
+ fi
+ fi
+ fi
+ rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext
+ ])
+ if test $gl_cv_header_wchar_h_correct_inline = no; then
+ AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
+This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
+C99 mode. You have four options:
+ - Add the flag -fgnu89-inline to CC and reconfigure, or
+ - Fix your include files, using parts of
+ <http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
+ - Use a gcc version older than 4.3, or
+ - Don't use the flags -std=c99 or -std=gnu99.
+Configuration aborted.])
+ fi
+])
+
+dnl Unconditionally enables the replacement of <wchar.h>.
+AC_DEFUN([gl_REPLACE_WCHAR_H],
+[
+ dnl This is a no-op, because <wchar.h> is always overridden.
+ :
+])
+
+AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_WCHAR_H_DEFAULTS],
+[
+ GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC])
+ GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB])
+ GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT])
+ GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC])
+ GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN])
+ GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS])
+ GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS])
+ GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB])
+ GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS])
+ GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS])
+ GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
+ HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
+ HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC])
+ HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN])
+ HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS])
+ HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS])
+ HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB])
+ HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS])
+ HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS])
+ HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB])
+ HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
+ REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
+ REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC])
+ REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB])
+ REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT])
+ REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC])
+ REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN])
+ REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS])
+ REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
+ REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB])
+ REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS])
+ REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
+ REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH])
+])
diff --git a/gnulib/m4/wchar_t.m4 b/gnulib/m4/wchar_t.m4
new file mode 100644
index 00000000..ed804e66
--- /dev/null
+++ b/gnulib/m4/wchar_t.m4
@@ -0,0 +1,20 @@
+# wchar_t.m4 serial 3 (gettext-0.18)
+dnl Copyright (C) 2002-2003, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+ AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
+ [AC_TRY_COMPILE([#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';], ,
+ [gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])])
+ if test $gt_cv_c_wchar_t = yes; then
+ AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
+ fi
+])
diff --git a/gnulib/m4/wcrtomb.m4 b/gnulib/m4/wcrtomb.m4
new file mode 100644
index 00000000..19c0c5fe
--- /dev/null
+++ b/gnulib/m4/wcrtomb.m4
@@ -0,0 +1,92 @@
+# wcrtomb.m4 serial 4
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_WCRTOMB],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_WCRTOMB=1
+ fi
+ AC_CHECK_FUNCS_ONCE([wcrtomb])
+ if test $ac_cv_func_wcrtomb = no; then
+ HAVE_WCRTOMB=0
+ fi
+ if test $HAVE_WCRTOMB != 0 && test $REPLACE_WCRTOMB != 1; then
+ dnl On AIX 4.3, OSF/1 5.1 and Solaris 10, wcrtomb (NULL, 0, NULL) sometimes
+ dnl returns 0 instead of 1.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether wcrtomb return value is correct],
+ [gl_cv_func_wcrtomb_retval],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on AIX 4, OSF/1 and Solaris.
+ aix4* | osf* | solaris*) gl_cv_func_wcrtomb_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_wcrtomb_retval="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ return 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ return 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ return 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ return 1;
+ }
+ return 0;
+}],
+ [gl_cv_func_wcrtomb_retval=yes],
+ [gl_cv_func_wcrtomb_retval=no],
+ [:])
+ fi
+ ])
+ case "$gl_cv_func_wcrtomb_retval" in
+ *yes) ;;
+ *) REPLACE_WCRTOMB=1 ;;
+ esac
+ fi
+ if test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([wcrtomb])
+ gl_PREREQ_WCRTOMB
+ fi
+])
+
+# Prerequisites of lib/wcrtomb.c.
+AC_DEFUN([gl_PREREQ_WCRTOMB], [
+ :
+])
diff --git a/gnulib/m4/wcsnrtombs.m4 b/gnulib/m4/wcsnrtombs.m4
new file mode 100644
index 00000000..4d432f66
--- /dev/null
+++ b/gnulib/m4/wcsnrtombs.m4
@@ -0,0 +1,31 @@
+# wcsnrtombs.m4 serial 2
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_WCSNRTOMBS],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_WCSNRTOMBS=1
+ fi
+ AC_CHECK_FUNCS_ONCE([wcsnrtombs])
+ if test $ac_cv_func_wcsnrtombs = no; then
+ HAVE_WCSNRTOMBS=0
+ fi
+ if test $HAVE_WCSNRTOMBS = 0 || test $REPLACE_WCSNRTOMBS = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([wcsnrtombs])
+ AC_LIBOBJ([wcsrtombs-state])
+ gl_PREREQ_WCSNRTOMBS
+ fi
+])
+
+# Prerequisites of lib/wcsnrtombs.c.
+AC_DEFUN([gl_PREREQ_WCSNRTOMBS], [
+ :
+])
diff --git a/gnulib/m4/wcsrtombs.m4 b/gnulib/m4/wcsrtombs.m4
new file mode 100644
index 00000000..e4f39a7d
--- /dev/null
+++ b/gnulib/m4/wcsrtombs.m4
@@ -0,0 +1,155 @@
+# wcsrtombs.m4 serial 4
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_WCSRTOMBS],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_WCSRTOMBS=1
+ fi
+ AC_CHECK_FUNCS_ONCE([wcsrtombs])
+ if test $ac_cv_func_wcsrtombs = no; then
+ HAVE_WCSRTOMBS=0
+ fi
+ if test $HAVE_WCSRTOMBS != 0 && test $REPLACE_WCSRTOMBS != 1; then
+ gl_WCSRTOMBS_TERMINATION
+ gl_WCSRTOMBS_NULL
+ case "$gl_cv_func_wcsrtombs_termination" in
+ *yes) ;;
+ *) AC_DEFINE([WCSRTOMBS_TERMINATION_BUG], [1],
+ [Define if the wcsrtombs function may set the source pointer to NULL without NUL-terminating the destination.])
+ REPLACE_WCSRTOMBS=1 ;;
+ esac
+ case "$gl_cv_func_wcsrtombs_null" in
+ *yes) ;;
+ *) AC_DEFINE([WCSRTOMBS_NULL_ARG_BUG], [1],
+ [Define if the wcsrtombs function has the NULL destination argument bug.])
+ REPLACE_WCSRTOMBS=1 ;;
+ esac
+ fi
+ if test $HAVE_WCSRTOMBS = 0 || test $REPLACE_WCSRTOMBS = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([wcsrtombs])
+ AC_LIBOBJ([wcsrtombs-state])
+ gl_PREREQ_WCSRTOMBS
+ fi
+])
+
+dnl Test whether the wcsrtombs implementation stores a non-NULL source pointer
+dnl as long as it has not written the final NUL byte to the destination string.
+dnl The OSF/1 5.1 implementation stores a NULL pointer already after storing
+dnl the last non-NUL character, even if there is no more room for the
+dnl terminating NUL character.
+dnl Result is gl_cv_func_wcsrtombs_termination.
+
+AC_DEFUN([gl_WCSRTOMBS_TERMINATION],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether wcsrtombs updates the source pointer correctly],
+ [gl_cv_func_wcsrtombs_termination],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on OSF/1.
+ osf*) gl_cv_func_wcsrtombs_termination="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_wcsrtombs_termination="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <stdlib.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ const char original[] = "B\374\337er";
+ wchar_t input[10];
+
+ if (mbstowcs (input, original, 10) == 5)
+ {
+ const wchar_t *src = input;
+ char output[5];
+ wcsrtombs (output, &src, 5, NULL);
+ if (src != input + 5)
+ return 1;
+ }
+ }
+ return 0;
+}],
+ [gl_cv_func_wcsrtombs_termination=yes],
+ [gl_cv_func_wcsrtombs_termination=no],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether the wcsrtombs implementation supports a NULL argument
+dnl correctly. This is not the case on HP-UX 11.11 and OSF/1 5.1: These
+dnl implementations updates the source pointer also if the destination argument
+dnl is NULL.
+dnl Result is gl_cv_func_wcsrtombs_null.
+
+AC_DEFUN([gl_WCSRTOMBS_NULL],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether wcsrtombs supports a NULL argument correctly],
+ [gl_cv_func_wcsrtombs_null],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on HP-UX and OSF/1.
+ hpux* | osf*) gl_cv_func_wcsrtombs_null="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_wcsrtombs_null="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <stdlib.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ const char original[] = "B\374\337er";
+ wchar_t input[10];
+
+ if (mbstowcs (input, original, 10) == 5)
+ {
+ const wchar_t *src = input;
+ wcsrtombs (NULL, &src, 10, NULL);
+ if (src != input)
+ return 1;
+ }
+ }
+ return 0;
+}],
+ [gl_cv_func_wcsrtombs_null=yes],
+ [gl_cv_func_wcsrtombs_null=no],
+ [:])
+ fi
+ ])
+])
+
+# Prerequisites of lib/wcsrtombs.c.
+AC_DEFUN([gl_PREREQ_WCSRTOMBS], [
+ :
+])
diff --git a/gnulib/m4/wctob.m4 b/gnulib/m4/wctob.m4
new file mode 100644
index 00000000..3362ec62
--- /dev/null
+++ b/gnulib/m4/wctob.m4
@@ -0,0 +1,91 @@
+# wctob.m4 serial 4
+dnl Copyright (C) 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_WCTOB],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_CHECK_FUNCS_ONCE([wctob])
+ if test $ac_cv_func_wctob = no; then
+ HAVE_DECL_WCTOB=0
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([wctob])
+ gl_PREREQ_WCTOB
+ else
+
+ dnl Solaris 9 has the wctob() function but it does not work.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether wctob works],
+ [gl_cv_func_wctob_works],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Solaris <= 9.
+ solaris2.[1-9] | solaris2.[1-9].*)
+ gl_cv_func_wctob_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_wctob_works="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none; then
+ AC_TRY_RUN([
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ wchar_t wc;
+
+ if (mbtowc (&wc, "\374", 1) == 1)
+ if (wctob (wc) != (unsigned char) '\374')
+ return 1;
+ }
+ return 0;
+}],
+ [gl_cv_func_wctob_works=yes],
+ [gl_cv_func_wctob_works=no],
+ [:])
+ fi
+ ])
+ case "$gl_cv_func_wctob_works" in
+ *yes) ;;
+ *) REPLACE_WCTOB=1 ;;
+ esac
+ if test $REPLACE_WCTOB = 1; then
+ gl_REPLACE_WCHAR_H
+ AC_LIBOBJ([wctob])
+ gl_PREREQ_WCTOB
+ else
+
+ dnl IRIX 6.5 has the wctob() function but does not declare it.
+ AC_CHECK_DECLS([wctob], [], [], [
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+])
+ if test $ac_cv_have_decl_wctob != yes; then
+ HAVE_DECL_WCTOB=0
+ gl_REPLACE_WCHAR_H
+ fi
+ fi
+ fi
+])
+
+# Prerequisites of lib/wctob.c.
+AC_DEFUN([gl_PREREQ_WCTOB], [
+ :
+])
diff --git a/gnulib/m4/wctype.m4 b/gnulib/m4/wctype.m4
new file mode 100644
index 00000000..7fa36a1b
--- /dev/null
+++ b/gnulib/m4/wctype.m4
@@ -0,0 +1,84 @@
+# wctype.m4 serial 4
+
+dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
+
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl_WCTYPE_H],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([iswcntrl])
+ if test $ac_cv_func_iswcntrl = yes; then
+ HAVE_ISWCNTRL=1
+ else
+ HAVE_ISWCNTRL=0
+ fi
+ AC_SUBST([HAVE_ISWCNTRL])
+ AC_CHECK_HEADERS_ONCE([wctype.h])
+ AC_REQUIRE([AC_C_INLINE])
+
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+ AC_SUBST([HAVE_WINT_T])
+
+ WCTYPE_H=wctype.h
+ if test $ac_cv_header_wctype_h = yes; then
+ if test $ac_cv_func_iswcntrl = yes; then
+ dnl Linux libc5 has an iswprint function that returns 0 for all arguments.
+ dnl The other functions are likely broken in the same way.
+ AC_CACHE_CHECK([whether iswcntrl works], [gl_cv_func_iswcntrl_works],
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <stddef.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <wchar.h>
+ #include <wctype.h>
+ int main () { return iswprint ('x') == 0; }]])],
+ [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>
+ #if __GNU_LIBRARY__ == 1
+ Linux libc5 i18n is broken.
+ #endif]], [])],
+ [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no])
+ ])
+ ])
+ if test $gl_cv_func_iswcntrl_works = yes; then
+ case "$host_os" in
+ mingw*)
+ dnl On mingw, towlower and towupper return random high 16 bits.
+ ;;
+ *)
+ dnl iswcntrl works. towlower and towupper work as well.
+ WCTYPE_H=
+ ;;
+ esac
+ fi
+ fi
+ dnl Compute NEXT_WCTYPE_H even if WCTYPE_H is empty,
+ dnl for the benefit of builds from non-distclean directories.
+ gl_CHECK_NEXT_HEADERS([wctype.h])
+ HAVE_WCTYPE_H=1
+ else
+ HAVE_WCTYPE_H=0
+ fi
+ AC_SUBST([HAVE_WCTYPE_H])
+ AC_SUBST([WCTYPE_H])
+
+ if test "$gl_cv_func_iswcntrl_works" = no; then
+ REPLACE_ISWCNTRL=1
+ else
+ REPLACE_ISWCNTRL=0
+ fi
+ AC_SUBST([REPLACE_ISWCNTRL])
+])
diff --git a/gnulib/m4/wcwidth.m4 b/gnulib/m4/wcwidth.m4
new file mode 100644
index 00000000..ef5404ea
--- /dev/null
+++ b/gnulib/m4/wcwidth.m4
@@ -0,0 +1,94 @@
+# wcwidth.m4 serial 15
+dnl Copyright (C) 2006-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_WCWIDTH],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade glibc <wchar.h> to declare wcwidth().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+ AC_CHECK_FUNCS_ONCE([wcwidth])
+
+ AC_CHECK_DECLS([wcwidth], [], [], [
+/* AIX 3.2.5 declares wcwidth in <string.h>. */
+#include <string.h>
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+])
+ if test $ac_cv_have_decl_wcwidth != yes; then
+ HAVE_DECL_WCWIDTH=0
+ fi
+
+ if test $ac_cv_func_wcwidth = no; then
+ REPLACE_WCWIDTH=1
+ else
+ dnl On MacOS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1.
+ dnl On OSF/1 5.1, wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1.
+ dnl This leads to bugs in 'ls' (coreutils).
+ AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales],
+ [gl_cv_func_wcwidth_works],
+ [
+ AC_TRY_RUN([
+#include <locale.h>
+/* AIX 3.2.5 declares wcwidth in <string.h>. */
+#include <string.h>
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+#if !HAVE_DECL_WCWIDTH
+extern
+# ifdef __cplusplus
+"C"
+# endif
+int wcwidth (int);
+#endif
+int main ()
+{
+ if (setlocale (LC_ALL, "fr_FR.UTF-8") != NULL)
+ if (wcwidth (0x0301) > 0 || wcwidth (0x200B) > 0)
+ return 1;
+ return 0;
+}], [gl_cv_func_wcwidth_works=yes], [gl_cv_func_wcwidth_works=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_wcwidth_works="guessing yes";;
+ *) gl_cv_func_wcwidth_works="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+ case "$gl_cv_func_wcwidth_works" in
+ *yes) ;;
+ *no) REPLACE_WCWIDTH=1 ;;
+ esac
+ fi
+ if test $REPLACE_WCWIDTH = 1; then
+ AC_LIBOBJ([wcwidth])
+ fi
+
+ if test $REPLACE_WCWIDTH = 1 || test $HAVE_DECL_WCWIDTH = 0; then
+ gl_REPLACE_WCHAR_H
+ fi
+])
diff --git a/gnulib/m4/wint_t.m4 b/gnulib/m4/wint_t.m4
new file mode 100644
index 00000000..a6c7d15c
--- /dev/null
+++ b/gnulib/m4/wint_t.m4
@@ -0,0 +1,28 @@
+# wint_t.m4 serial 4 (gettext-0.18)
+dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
+ [AC_TRY_COMPILE([
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';], ,
+ [gt_cv_c_wint_t=yes], [gt_cv_c_wint_t=no])])
+ if test $gt_cv_c_wint_t = yes; then
+ AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.])
+ fi
+])
diff --git a/gnulib/m4/write-any-file.m4 b/gnulib/m4/write-any-file.m4
new file mode 100644
index 00000000..490260d9
--- /dev/null
+++ b/gnulib/m4/write-any-file.m4
@@ -0,0 +1,15 @@
+# Determine whether we can write any file.
+
+# Copyright (C) 2007, 2009-2010 Free Software Foundation, Inc.
+#
+# This file 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.
+
+# Written by Paul Eggert.
+
+AC_DEFUN([gl_WRITE_ANY_FILE],
+[
+ AC_CHECK_HEADERS_ONCE([priv.h])
+ AC_LIBOBJ([write-any-file])
+])
diff --git a/gnulib/m4/write.m4 b/gnulib/m4/write.m4
new file mode 100644
index 00000000..56325aba
--- /dev/null
+++ b/gnulib/m4/write.m4
@@ -0,0 +1,20 @@
+# write.m4 serial 1
+dnl Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_WRITE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ dnl This ifdef is just an optimization, to avoid performing a configure
+ dnl check whose result is not used. It does not make the test of
+ dnl GNULIB_UNISTD_H_SIGPIPE or GNULIB_SIGPIPE redundant.
+ m4_ifdef([gl_SIGNAL_SIGPIPE], [
+ gl_SIGNAL_SIGPIPE
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_WRITE=1
+ AC_LIBOBJ([write])
+ fi
+ ])
+])
diff --git a/gnulib/m4/xalloc.m4 b/gnulib/m4/xalloc.m4
new file mode 100644
index 00000000..83247fe3
--- /dev/null
+++ b/gnulib/m4/xalloc.m4
@@ -0,0 +1,25 @@
+# xalloc.m4 serial 16
+dnl Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009, 2010 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XALLOC],
+[
+ AC_LIBOBJ([xmalloc])
+
+ gl_PREREQ_XALLOC
+ gl_PREREQ_XMALLOC
+])
+
+# Prerequisites of lib/xalloc.h.
+AC_DEFUN([gl_PREREQ_XALLOC], [
+ AC_REQUIRE([gl_INLINE])
+ :
+])
+
+# Prerequisites of lib/xmalloc.c.
+AC_DEFUN([gl_PREREQ_XMALLOC], [
+ :
+])
diff --git a/gnulib/m4/xgetcwd.m4 b/gnulib/m4/xgetcwd.m4
new file mode 100644
index 00000000..fd534f6d
--- /dev/null
+++ b/gnulib/m4/xgetcwd.m4
@@ -0,0 +1,12 @@
+#serial 6
+dnl Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XGETCWD],
+[
+ AC_LIBOBJ([xgetcwd])
+
+ AC_REQUIRE([gl_FUNC_GETCWD])
+])
diff --git a/gnulib/m4/xnanosleep.m4 b/gnulib/m4/xnanosleep.m4
new file mode 100644
index 00000000..7e132d3e
--- /dev/null
+++ b/gnulib/m4/xnanosleep.m4
@@ -0,0 +1,12 @@
+#serial 4
+dnl Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl_XNANOSLEEP],
+[
+ AC_LIBOBJ([xnanosleep])
+])
diff --git a/gnulib/m4/xsize.m4 b/gnulib/m4/xsize.m4
new file mode 100644
index 00000000..b653693a
--- /dev/null
+++ b/gnulib/m4/xsize.m4
@@ -0,0 +1,13 @@
+# xsize.m4 serial 4
+dnl Copyright (C) 2003-2004, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XSIZE],
+[
+ dnl Prerequisites of lib/xsize.h.
+ AC_REQUIRE([gl_SIZE_MAX])
+ AC_REQUIRE([AC_C_INLINE])
+ AC_CHECK_HEADERS([stdint.h])
+])
diff --git a/gnulib/m4/xstrndup.m4 b/gnulib/m4/xstrndup.m4
new file mode 100644
index 00000000..74302cc9
--- /dev/null
+++ b/gnulib/m4/xstrndup.m4
@@ -0,0 +1,15 @@
+# xstrndup.m4 serial 2
+dnl Copyright (C) 2003, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XSTRNDUP],
+[
+ gl_PREREQ_XSTRNDUP
+])
+
+# Prerequisites of lib/xstrndup.c.
+AC_DEFUN([gl_PREREQ_XSTRNDUP], [
+ :
+])
diff --git a/gnulib/m4/xstrtod.m4 b/gnulib/m4/xstrtod.m4
new file mode 100644
index 00000000..1e26e3aa
--- /dev/null
+++ b/gnulib/m4/xstrtod.m4
@@ -0,0 +1,18 @@
+#serial 6
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prerequisites of lib/xstrtod.c.
+AC_DEFUN([gl_XSTRTOD],
+[
+ AC_LIBOBJ([xstrtod])
+])
+
+# Prerequisites of lib/xstrtold.c.
+AC_DEFUN([gl_XSTRTOLD],
+[
+ AC_LIBOBJ([xstrtold])
+])
diff --git a/gnulib/m4/xstrtol.m4 b/gnulib/m4/xstrtol.m4
new file mode 100644
index 00000000..25ab9b3f
--- /dev/null
+++ b/gnulib/m4/xstrtol.m4
@@ -0,0 +1,12 @@
+#serial 10
+dnl Copyright (C) 2002-2007, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XSTRTOL],
+[
+ AC_LIBOBJ([xstrtol])
+ AC_LIBOBJ([xstrtoul])
+ AC_LIBOBJ([xstrtol-error])
+])
diff --git a/gnulib/m4/xvasprintf.m4 b/gnulib/m4/xvasprintf.m4
new file mode 100644
index 00000000..bd5200f7
--- /dev/null
+++ b/gnulib/m4/xvasprintf.m4
@@ -0,0 +1,11 @@
+# xvasprintf.m4 serial 1
+dnl Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XVASPRINTF],
+[
+ dnl Prerequisites of lib/xvasprintf.c.
+ AC_REQUIRE([AC_C_INLINE])
+])
diff --git a/gnulib/m4/yesno.m4 b/gnulib/m4/yesno.m4
new file mode 100644
index 00000000..c1a20a55
--- /dev/null
+++ b/gnulib/m4/yesno.m4
@@ -0,0 +1,14 @@
+# yesno.m4 serial 5
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2010 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_YESNO],
+[
+ AC_LIBOBJ([yesno])
+
+ dnl No prerequisites of lib/yesno.c.
+ :
+])
diff --git a/gnulib/m4/yield.m4 b/gnulib/m4/yield.m4
new file mode 100644
index 00000000..7a543e4e
--- /dev/null
+++ b/gnulib/m4/yield.m4
@@ -0,0 +1,19 @@
+# yield.m4 serial 2
+dnl Copyright (C) 2005-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_YIELD],
+[
+ AC_REQUIRE([gl_THREADLIB])
+ dnl On some systems, sched_yield is in librt, rather than in libpthread.
+ YIELD_LIB=
+ if test $gl_threads_api = posix; then
+ dnl Solaris has sched_yield in librt, not in libpthread or libc.
+ AC_CHECK_LIB([rt], [sched_yield], [YIELD_LIB=-lrt],
+ [dnl Solaris 2.5.1, 2.6 has sched_yield in libposix4, not librt.
+ AC_CHECK_LIB([posix4], [sched_yield], [YIELD_LIB=-lposix4])])
+ fi
+ AC_SUBST([YIELD_LIB])
+])
diff --git a/gnulib/modules/.gitattributes b/gnulib/modules/.gitattributes
new file mode 100644
index 00000000..0d72641f
--- /dev/null
+++ b/gnulib/modules/.gitattributes
@@ -0,0 +1,2 @@
+# "git diff --check" should not reject modules files which end in a blank line.
+* whitespace=-trail
diff --git a/gnulib/modules/COPYING b/gnulib/modules/COPYING
new file mode 100644
index 00000000..39fde807
--- /dev/null
+++ b/gnulib/modules/COPYING
@@ -0,0 +1,8 @@
+The files in this directory describe the gnulib modules.
+The following copyright notice applies to each of these
+description files.
+
+Copyright (C) 2002-2010 Free Software Foundation, Inc.
+This file 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.
diff --git a/gnulib/modules/README b/gnulib/modules/README
new file mode 100644
index 00000000..cec9a74d
--- /dev/null
+++ b/gnulib/modules/README
@@ -0,0 +1,15 @@
+This directory contains metainformation about the gnulib modules, one or two
+files per module. These files are used by gnulib-tool.
+
+For every module,
+ - the file <module> is the metainformation about the library code of the
+ module,
+ - the file <module>-tests is the metainformation about the unit test of
+ the module (optional but recommended).
+
+All the files in this directory are distributed under the following copyright:
+
+ Copyright (C) 2002-2010 Free Software Foundation, Inc.
+ Copying and distribution of this file, with or without modification,
+ in any medium, are permitted without royalty provided the copyright
+ notice and this notice are preserved.
diff --git a/gnulib/modules/TEMPLATE b/gnulib/modules/TEMPLATE
new file mode 100644
index 00000000..6f8b2c28
--- /dev/null
+++ b/gnulib/modules/TEMPLATE
@@ -0,0 +1,17 @@
+Description:
+
+Files:
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+
diff --git a/gnulib/modules/TEMPLATE-EXTENDED b/gnulib/modules/TEMPLATE-EXTENDED
new file mode 100644
index 00000000..d3f3e84f
--- /dev/null
+++ b/gnulib/modules/TEMPLATE-EXTENDED
@@ -0,0 +1,27 @@
+Description:
+
+Status:
+
+Notice:
+
+Applicability:
+
+Files:
+
+Depends-on:
+
+configure.ac-early:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+Link:
+
+License:
+GPL
+
+Maintainer:
+
diff --git a/gnulib/modules/TEMPLATE-TESTS b/gnulib/modules/TEMPLATE-TESTS
new file mode 100644
index 00000000..30c7c355
--- /dev/null
+++ b/gnulib/modules/TEMPLATE-TESTS
@@ -0,0 +1,8 @@
+Files:
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
diff --git a/gnulib/modules/absolute-header b/gnulib/modules/absolute-header
new file mode 100644
index 00000000..491d3d27
--- /dev/null
+++ b/gnulib/modules/absolute-header
@@ -0,0 +1,23 @@
+Description:
+Allows wrapping a broken system header in a gnulib replacement.
+
+Files:
+m4/absolute-header.m4
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+# Use this preprocessor expression to decide whether #include_next works.
+# Do not rely on a 'configure'-time test for this, since the expression
+# might appear in an installed header, which is used by some other compiler.
+HAVE_INCLUDE_NEXT = (__GNUC__ || 60000000 <= __DECC_VER)
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/accept b/gnulib/modules/accept
new file mode 100644
index 00000000..d1c954ed
--- /dev/null
+++ b/gnulib/modules/accept
@@ -0,0 +1,28 @@
+Description:
+accept() function: accept a connection to a server socket.
+
+Files:
+lib/accept.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([accept])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([accept])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/accept4 b/gnulib/modules/accept4
new file mode 100644
index 00000000..009575c4
--- /dev/null
+++ b/gnulib/modules/accept4
@@ -0,0 +1,30 @@
+Description:
+accept4() function: accept a connection on a socket, with specific opening
+flags.
+
+Files:
+lib/accept4.c
+m4/accept4.m4
+
+Depends-on:
+sys_socket
+accept
+fcntl-h
+binary-io
+extensions
+
+configure.ac:
+gl_FUNC_ACCEPT4
+gl_SYS_SOCKET_MODULE_INDICATOR([accept4])
+
+Makefile.am:
+lib_SOURCES += accept4.c
+
+Include:
+<sys/socket.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Simon Josefsson
diff --git a/gnulib/modules/acl b/gnulib/modules/acl
new file mode 100644
index 00000000..2185242e
--- /dev/null
+++ b/gnulib/modules/acl
@@ -0,0 +1,35 @@
+Description:
+Access control lists of files. (Unportable.)
+
+Files:
+lib/acl.h
+lib/acl-internal.h
+lib/acl_entries.c
+lib/set-mode-acl.c
+lib/copy-acl.c
+lib/file-has-acl.c
+m4/acl.m4
+
+Depends-on:
+error
+gettext
+quote
+sys_stat
+
+configure.ac:
+gl_FUNC_ACL
+
+Makefile.am:
+lib_SOURCES += set-mode-acl.c copy-acl.c file-has-acl.c
+
+Include:
+"acl.h"
+
+Link:
+$(LIB_ACL)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering, Bruno Haible
diff --git a/gnulib/modules/acl-tests b/gnulib/modules/acl-tests
new file mode 100644
index 00000000..3ab99972
--- /dev/null
+++ b/gnulib/modules/acl-tests
@@ -0,0 +1,27 @@
+Files:
+tests/test-file-has-acl.sh
+tests/test-set-mode-acl.sh
+tests/test-copy-acl.sh
+tests/test-file-has-acl.c
+tests/test-set-mode-acl.c
+tests/test-copy-acl.c
+tests/test-sameacls.c
+tests/macros.h
+
+Depends-on:
+progname
+read-file
+unistd
+xalloc
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-file-has-acl.sh test-set-mode-acl.sh test-copy-acl.sh
+TESTS_ENVIRONMENT += USE_ACL=$(USE_ACL)
+check_PROGRAMS += test-file-has-acl test-set-mode-acl test-copy-acl test-sameacls
+test_file_has_acl_LDADD = $(LDADD) $(LIB_ACL)
+test_set_mode_acl_LDADD = $(LDADD) $(LIB_ACL) @LIBINTL@
+test_copy_acl_LDADD = $(LDADD) $(LIB_ACL) @LIBINTL@
+test_sameacls_LDADD = $(LDADD) $(LIB_ACL) @LIBINTL@
diff --git a/gnulib/modules/acos b/gnulib/modules/acos
new file mode 100644
index 00000000..cceee873
--- /dev/null
+++ b/gnulib/modules/acos
@@ -0,0 +1,24 @@
+Description:
+acos() function: inverse cosine function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([acos])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ACOS_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/acos-tests b/gnulib/modules/acos-tests
new file mode 100644
index 00000000..93c19d19
--- /dev/null
+++ b/gnulib/modules/acos-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-acos.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-acos
+check_PROGRAMS += test-acos
+test_acos_LDADD = $(LDADD) @ACOS_LIBM@
diff --git a/gnulib/modules/acosl b/gnulib/modules/acosl
new file mode 100644
index 00000000..3c49196f
--- /dev/null
+++ b/gnulib/modules/acosl
@@ -0,0 +1,30 @@
+Description:
+acosl() function: inverse cosine function with long double argument.
+
+Files:
+lib/acosl.c
+m4/acosl.m4
+
+Depends-on:
+math
+extensions
+asinl
+sqrtl
+
+configure.ac:
+gl_FUNC_ACOSL
+gl_MATH_MODULE_INDICATOR([acosl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ACOSL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/acosl-tests b/gnulib/modules/acosl-tests
new file mode 100644
index 00000000..c0ea5b90
--- /dev/null
+++ b/gnulib/modules/acosl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-acosl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-acosl
+check_PROGRAMS += test-acosl
+test_acosl_LDADD = $(LDADD) @ACOSL_LIBM@
diff --git a/gnulib/modules/agpl-3.0 b/gnulib/modules/agpl-3.0
new file mode 100644
index 00000000..98c3cedf
--- /dev/null
+++ b/gnulib/modules/agpl-3.0
@@ -0,0 +1,19 @@
+Description:
+Provide the GNU Affero General Public License version 3.0 in Texinfo format.
+
+Files:
+doc/agpl-3.0.texi
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unmodifiable license text
+
+Maintainer:
+all
diff --git a/gnulib/modules/alignof b/gnulib/modules/alignof
new file mode 100644
index 00000000..3635baab
--- /dev/null
+++ b/gnulib/modules/alignof
@@ -0,0 +1,20 @@
+Description:
+Determine alignment of types.
+
+Files:
+lib/alignof.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"alignof.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/alignof-tests b/gnulib/modules/alignof-tests
new file mode 100644
index 00000000..be4cb942
--- /dev/null
+++ b/gnulib/modules/alignof-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-alignof.c
+
+Depends-on:
+verify
+stdint
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-alignof
+check_PROGRAMS += test-alignof
+
diff --git a/gnulib/modules/alloca b/gnulib/modules/alloca
new file mode 100644
index 00000000..13d80dd9
--- /dev/null
+++ b/gnulib/modules/alloca
@@ -0,0 +1,21 @@
+Description:
+Memory allocation on the stack.
+
+Files:
+lib/alloca.c
+
+Depends-on:
+alloca-opt
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+<alloca.h>
+
+License:
+public domain
+
+Maintainer:
+bug-gnulib@gnu.org
diff --git a/gnulib/modules/alloca-opt b/gnulib/modules/alloca-opt
new file mode 100644
index 00000000..9ced93b2
--- /dev/null
+++ b/gnulib/modules/alloca-opt
@@ -0,0 +1,35 @@
+Description:
+Memory allocation on the stack, as an optional optimization.
+It allows using the alloca() macro if and only if the autoconf tests define
+HAVE_ALLOCA.
+
+Files:
+lib/alloca.in.h
+m4/alloca.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_ALLOCA
+
+Makefile.am:
+BUILT_SOURCES += $(ALLOCA_H)
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+alloca.h: alloca.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/alloca.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += alloca.h alloca.h-t
+
+Include:
+<alloca.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+bug-gnulib@gnu.org
diff --git a/gnulib/modules/alloca-opt-tests b/gnulib/modules/alloca-opt-tests
new file mode 100644
index 00000000..4c7e651d
--- /dev/null
+++ b/gnulib/modules/alloca-opt-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-alloca-opt.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-alloca-opt
+check_PROGRAMS += test-alloca-opt
+
diff --git a/gnulib/modules/alphasort b/gnulib/modules/alphasort
new file mode 100644
index 00000000..319eccc0
--- /dev/null
+++ b/gnulib/modules/alphasort
@@ -0,0 +1,26 @@
+Description:
+alphasort() function: compare entries of a directory alphabetically
+
+Files:
+lib/alphasort.c
+m4/alphasort.m4
+
+Depends-on:
+dirent
+extensions
+
+configure.ac:
+gl_FUNC_ALPHASORT
+gl_DIRENT_MODULE_INDICATOR([alphasort])
+
+Makefile.am:
+
+Include:
+<dirent.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
+
diff --git a/gnulib/modules/announce-gen b/gnulib/modules/announce-gen
new file mode 100644
index 00000000..558c4b3c
--- /dev/null
+++ b/gnulib/modules/announce-gen
@@ -0,0 +1,19 @@
+Description:
+Generate a release announcement message.
+
+Files:
+build-aux/announce-gen
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+coreutils
diff --git a/gnulib/modules/areadlink b/gnulib/modules/areadlink
new file mode 100644
index 00000000..199c77fa
--- /dev/null
+++ b/gnulib/modules/areadlink
@@ -0,0 +1,27 @@
+Description:
+Reading symbolic links without size limitation.
+
+Files:
+lib/areadlink.h
+lib/areadlink.c
+
+Depends-on:
+malloc-posix
+readlink
+ssize_t
+stdint
+unistd
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += areadlink.c
+
+Include:
+"areadlink.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible, Jim Meyering
diff --git a/gnulib/modules/areadlink-tests b/gnulib/modules/areadlink-tests
new file mode 100644
index 00000000..869be2c3
--- /dev/null
+++ b/gnulib/modules/areadlink-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-areadlink.h
+tests/test-areadlink.c
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-areadlink
+check_PROGRAMS += test-areadlink
diff --git a/gnulib/modules/areadlink-with-size b/gnulib/modules/areadlink-with-size
new file mode 100644
index 00000000..82a90218
--- /dev/null
+++ b/gnulib/modules/areadlink-with-size
@@ -0,0 +1,26 @@
+Description:
+Return the contents of a symbolic link, without size limitations.
+
+Files:
+lib/areadlink.h
+lib/areadlink-with-size.c
+
+Depends-on:
+readlink
+ssize_t
+stdint
+unistd
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += areadlink-with-size.c
+
+Include:
+"areadlink.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/areadlink-with-size-tests b/gnulib/modules/areadlink-with-size-tests
new file mode 100644
index 00000000..b9b3ded0
--- /dev/null
+++ b/gnulib/modules/areadlink-with-size-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-areadlink.h
+tests/test-areadlink-with-size.c
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-areadlink-with-size
+check_PROGRAMS += test-areadlink-with-size
diff --git a/gnulib/modules/areadlinkat b/gnulib/modules/areadlinkat
new file mode 100644
index 00000000..d5712d9c
--- /dev/null
+++ b/gnulib/modules/areadlinkat
@@ -0,0 +1,26 @@
+Description:
+Reading symbolic links without size limitation, relative to fd.
+
+Files:
+lib/areadlink.h
+lib/areadlinkat.c
+
+Depends-on:
+areadlink
+stdint
+symlinkat
+
+configure.ac:
+gl_MODULE_INDICATOR([areadlinkat])
+
+Makefile.am:
+lib_SOURCES += areadlinkat.c
+
+Include:
+"areadlink.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/areadlinkat-tests b/gnulib/modules/areadlinkat-tests
new file mode 100644
index 00000000..422ac614
--- /dev/null
+++ b/gnulib/modules/areadlinkat-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-areadlink.h
+tests/test-areadlinkat.c
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-areadlinkat
+check_PROGRAMS += test-areadlinkat
+test_areadlinkat_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/areadlinkat-with-size b/gnulib/modules/areadlinkat-with-size
new file mode 100644
index 00000000..7bd60d46
--- /dev/null
+++ b/gnulib/modules/areadlinkat-with-size
@@ -0,0 +1,26 @@
+Description:
+Read a symbolic link, without size limitations, relative to fd.
+
+Files:
+lib/areadlink.h
+lib/areadlinkat-with-size.c
+
+Depends-on:
+areadlink-with-size
+stdint
+symlinkat
+
+configure.ac:
+gl_MODULE_INDICATOR([areadlinkat-with-size])
+
+Makefile.am:
+lib_SOURCES += areadlinkat-with-size.c
+
+Include:
+"areadlink.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/areadlinkat-with-size-tests b/gnulib/modules/areadlinkat-with-size-tests
new file mode 100644
index 00000000..b86d6e70
--- /dev/null
+++ b/gnulib/modules/areadlinkat-with-size-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-areadlink.h
+tests/test-areadlinkat-with-size.c
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-areadlinkat-with-size
+check_PROGRAMS += test-areadlinkat-with-size
+test_areadlinkat_with_size_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/arg-nonnull b/gnulib/modules/arg-nonnull
new file mode 100644
index 00000000..d4e4d136
--- /dev/null
+++ b/gnulib/modules/arg-nonnull
@@ -0,0 +1,39 @@
+Description:
+A C macro for declaring that specific arguments must not be NULL.
+
+Applicability:
+all
+
+Files:
+build-aux/arg-nonnull.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+# The BUILT_SOURCES created by this Makefile snippet are not used via #include
+# statements but through direct file reference. Therefore this snippet must be
+# present in all Makefile.am that need it. This is ensured by the applicability
+# 'all' defined above.
+
+BUILT_SOURCES += arg-nonnull.h
+# The arg-nonnull.h that gets inserted into generated .h files is the same as
+# build-aux/arg-nonnull.h, except that it has the copyright header cut off.
+arg-nonnull.h: $(top_srcdir)/build-aux/arg-nonnull.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ sed -n -e '/GL_ARG_NONNULL/,$$p' \
+ < $(top_srcdir)/build-aux/arg-nonnull.h \
+ > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += arg-nonnull.h arg-nonnull.h-t
+
+ARG_NONNULL_H=arg-nonnull.h
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/argmatch b/gnulib/modules/argmatch
new file mode 100644
index 00000000..0dd643cd
--- /dev/null
+++ b/gnulib/modules/argmatch
@@ -0,0 +1,32 @@
+Description:
+Search for an exact or abbreviated match of a string in an array of strings.
+
+Files:
+lib/argmatch.h
+lib/argmatch.c
+m4/argmatch.m4
+
+Depends-on:
+gettext-h
+error
+quotearg
+quote
+exit
+exitfail
+verify
+stdbool
+memcmp
+
+configure.ac:
+gl_ARGMATCH
+
+Makefile.am:
+
+Include:
+"argmatch.h"
+
+License:
+GPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/argmatch-tests b/gnulib/modules/argmatch-tests
new file mode 100644
index 00000000..85ac3a2b
--- /dev/null
+++ b/gnulib/modules/argmatch-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-argmatch.c
+tests/macros.h
+
+Depends-on:
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-argmatch
+check_PROGRAMS += test-argmatch
+test_argmatch_LDADD = $(LDADD) @LIBINTL@
+
diff --git a/gnulib/modules/argp b/gnulib/modules/argp
new file mode 100644
index 00000000..bb108443
--- /dev/null
+++ b/gnulib/modules/argp
@@ -0,0 +1,61 @@
+Description:
+Hierarchical processing of command line arguments.
+
+Notice:
+If you are using GNU gettext version 0.16.1 or older, add the following options
+to XGETTEXT_OPTIONS in your po/Makevars:
+ --flag=argp_error:2:c-format --flag=argp_failure:4:c-format
+
+Files:
+lib/argp.h
+lib/argp-ba.c
+lib/argp-eexst.c
+lib/argp-fmtstream.c
+lib/argp-fmtstream.h
+lib/argp-fs-xinl.c
+lib/argp-help.c
+lib/argp-namefrob.h
+lib/argp-parse.c
+lib/argp-pin.c
+lib/argp-pv.c
+lib/argp-pvh.c
+lib/argp-xinl.c
+m4/argp.m4
+
+Depends-on:
+alloca
+dirname-lgpl
+getopt-gnu
+strchrnul
+sysexits
+malloc
+mempcpy
+strndup
+strcase
+extensions
+vsnprintf
+sleep
+strerror
+memchr
+memmove
+
+configure.ac:
+gl_ARGP
+m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--flag=argp_error:2:c-format])
+ AM_][XGETTEXT_OPTION([--flag=argp_failure:4:c-format])])
+
+Makefile.am:
+lib_SOURCES += argp.h argp-ba.c argp-eexst.c \
+ argp-fmtstream.c argp-fmtstream.h argp-fs-xinl.c argp-help.c \
+ argp-namefrob.h argp-parse.c argp-pin.c argp-pv.c argp-pvh.c \
+ argp-xinl.c
+
+Include:
+"argp.h"
+
+License:
+LGPL
+
+Maintainer:
+Sergey Poznyakoff, glibc
diff --git a/gnulib/modules/argp-tests b/gnulib/modules/argp-tests
new file mode 100644
index 00000000..8f92a4de
--- /dev/null
+++ b/gnulib/modules/argp-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-argp.c
+tests/test-argp-2.sh
+
+Depends-on:
+progname
+
+Makefile.am:
+TESTS += test-argp test-argp-2.sh
+check_PROGRAMS += test-argp
+test_argp_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/argp-version-etc b/gnulib/modules/argp-version-etc
new file mode 100644
index 00000000..20a479c9
--- /dev/null
+++ b/gnulib/modules/argp-version-etc
@@ -0,0 +1,22 @@
+Description:
+Version-etc hook for Argp.
+
+Files:
+lib/argp-version-etc.c
+lib/argp-version-etc.h
+
+Depends-on:
+argp
+version-etc
+
+Makefile.am:
+lib_SOURCES += argp-version-etc.h argp-version-etc.c
+
+Include:
+"argp-version-etc.h"
+
+License:
+GPL
+
+Maintainer:
+Sergey Poznyakoff
diff --git a/gnulib/modules/argp-version-etc-tests b/gnulib/modules/argp-version-etc-tests
new file mode 100644
index 00000000..c4451a24
--- /dev/null
+++ b/gnulib/modules/argp-version-etc-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-argp-version-etc.c
+tests/test-argp-version-etc-1.sh
+
+Depends-on:
+argp
+progname
+version-etc-fsf
+
+Makefile.am:
+TESTS += test-argp-version-etc test-argp-version-etc-1.sh
+check_PROGRAMS += test-argp-version-etc
+test_argp_version_etc_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/argv-iter b/gnulib/modules/argv-iter
new file mode 100644
index 00000000..3844b8a8
--- /dev/null
+++ b/gnulib/modules/argv-iter
@@ -0,0 +1,25 @@
+Description:
+iterate through argv or a --files0-from=-specified file
+
+Files:
+lib/argv-iter.c
+lib/argv-iter.h
+
+Depends-on:
+arg-nonnull
+getdelim
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += argv-iter.c argv-iter.h
+
+Include:
+"argv-iter.h"
+
+License
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/argv-iter-tests b/gnulib/modules/argv-iter-tests
new file mode 100644
index 00000000..92c5c82b
--- /dev/null
+++ b/gnulib/modules/argv-iter-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-argv-iter.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-argv-iter
+check_PROGRAMS += test-argv-iter
diff --git a/gnulib/modules/argz b/gnulib/modules/argz
new file mode 100644
index 00000000..5f9c7499
--- /dev/null
+++ b/gnulib/modules/argz
@@ -0,0 +1,40 @@
+Description:
+Argv style string arrays in a single null delimited char*.
+
+Files:
+lib/argz.in.h
+lib/argz.c
+m4/argz.m4
+
+Depends-on:
+memmove
+mempcpy
+stpcpy
+strndup
+strnlen
+strstr
+
+configure.ac:
+gl_FUNC_ARGZ
+
+Makefile.am:
+BUILT_SOURCES += $(ARGZ_H)
+
+# We need the following in order to create <argz.h> when the system
+# doesn't have one that works with the given compiler.
+argz.h: argz.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/argz.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += argz.h argz.h-t
+
+Include:
+<argz.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/arpa_inet b/gnulib/modules/arpa_inet
new file mode 100644
index 00000000..09eaee53
--- /dev/null
+++ b/gnulib/modules/arpa_inet
@@ -0,0 +1,50 @@
+Description:
+A GNU-like <arpa/inet.h>.
+
+Files:
+lib/arpa_inet.in.h
+m4/arpa_inet_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+sys_socket
+warn-on-use
+
+configure.ac:
+gl_HEADER_ARPA_INET
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += arpa/inet.h
+
+# We need the following in order to create <arpa/inet.h> when the system
+# doesn't have one.
+arpa/inet.h: arpa_inet.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) arpa
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_ARPA_INET_H''@|$(NEXT_ARPA_INET_H)|g' \
+ -e 's|@''HAVE_ARPA_INET_H''@|$(HAVE_ARPA_INET_H)|g' \
+ -e 's|@''GNULIB_INET_NTOP''@|$(GNULIB_INET_NTOP)|g' \
+ -e 's|@''GNULIB_INET_PTON''@|$(GNULIB_INET_PTON)|g' \
+ -e 's|@''HAVE_DECL_INET_NTOP''@|$(HAVE_DECL_INET_NTOP)|g' \
+ -e 's|@''HAVE_DECL_INET_PTON''@|$(HAVE_DECL_INET_PTON)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/arpa_inet.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += arpa/inet.h arpa/inet.h-t
+MOSTLYCLEANDIRS += arpa
+
+Include:
+<arpa/inet.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/arpa_inet-tests b/gnulib/modules/arpa_inet-tests
new file mode 100644
index 00000000..8c31fdeb
--- /dev/null
+++ b/gnulib/modules/arpa_inet-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-arpa_inet.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-arpa_inet
+check_PROGRAMS += test-arpa_inet
diff --git a/gnulib/modules/array-list b/gnulib/modules/array-list
new file mode 100644
index 00000000..9d6e2b9f
--- /dev/null
+++ b/gnulib/modules/array-list
@@ -0,0 +1,25 @@
+Description:
+Sequential list data type implemented by an array.
+
+Files:
+lib/gl_array_list.h
+lib/gl_array_list.c
+
+Depends-on:
+list
+xsize
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_array_list.h gl_array_list.c
+
+Include:
+"gl_array_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/array-list-tests b/gnulib/modules/array-list-tests
new file mode 100644
index 00000000..1e9524d2
--- /dev/null
+++ b/gnulib/modules/array-list-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-array_list.c
+tests/macros.h
+
+Depends-on:
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-array_list
+check_PROGRAMS += test-array_list
+
diff --git a/gnulib/modules/array-mergesort b/gnulib/modules/array-mergesort
new file mode 100644
index 00000000..32e6eb87
--- /dev/null
+++ b/gnulib/modules/array-mergesort
@@ -0,0 +1,21 @@
+Description:
+Merge-sort algorithm on arrays.
+
+Files:
+lib/array-mergesort.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"array-mergesort.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/array-mergesort-tests b/gnulib/modules/array-mergesort-tests
new file mode 100644
index 00000000..5bf9b678
--- /dev/null
+++ b/gnulib/modules/array-mergesort-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-array-mergesort.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-array-mergesort
+check_PROGRAMS += test-array-mergesort
diff --git a/gnulib/modules/array-oset b/gnulib/modules/array-oset
new file mode 100644
index 00000000..2f264ede
--- /dev/null
+++ b/gnulib/modules/array-oset
@@ -0,0 +1,25 @@
+Description:
+Ordered set data type implemented by an array.
+
+Files:
+lib/gl_array_oset.h
+lib/gl_array_oset.c
+
+Depends-on:
+oset
+xsize
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_array_oset.h gl_array_oset.c
+
+Include:
+"gl_array_oset.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/array-oset-tests b/gnulib/modules/array-oset-tests
new file mode 100644
index 00000000..57913163
--- /dev/null
+++ b/gnulib/modules/array-oset-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-array_oset.c
+tests/macros.h
+
+Depends-on:
+xlist
+array-list
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-array_oset
+check_PROGRAMS += test-array_oset
+test_array_oset_LDADD = $(LDADD) @LIBINTL@
+
diff --git a/gnulib/modules/asin b/gnulib/modules/asin
new file mode 100644
index 00000000..e6c496bc
--- /dev/null
+++ b/gnulib/modules/asin
@@ -0,0 +1,24 @@
+Description:
+asin() function: inverse sine function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([asin])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ASIN_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/asin-tests b/gnulib/modules/asin-tests
new file mode 100644
index 00000000..a6ffbe51
--- /dev/null
+++ b/gnulib/modules/asin-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-asin.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-asin
+check_PROGRAMS += test-asin
+test_asin_LDADD = $(LDADD) @ASIN_LIBM@
diff --git a/gnulib/modules/asinl b/gnulib/modules/asinl
new file mode 100644
index 00000000..7f254ab4
--- /dev/null
+++ b/gnulib/modules/asinl
@@ -0,0 +1,29 @@
+Description:
+asinl() function: inverse sine function with long double argument.
+
+Files:
+lib/asinl.c
+m4/asinl.m4
+
+Depends-on:
+math
+extensions
+sqrtl
+
+configure.ac:
+gl_FUNC_ASINL
+gl_MATH_MODULE_INDICATOR([asinl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ASINL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/asinl-tests b/gnulib/modules/asinl-tests
new file mode 100644
index 00000000..b111212f
--- /dev/null
+++ b/gnulib/modules/asinl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-asinl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-asinl
+check_PROGRAMS += test-asinl
+test_asinl_LDADD = $(LDADD) @ASINL_LIBM@
diff --git a/gnulib/modules/assert b/gnulib/modules/assert
new file mode 100644
index 00000000..900a1679
--- /dev/null
+++ b/gnulib/modules/assert
@@ -0,0 +1,22 @@
+Description:
+Allow the installer to disable assertions through "configure --disable-assert".
+
+Files:
+m4/assert.m4
+
+Depends-on:
+
+configure.ac:
+gl_ASSERT
+
+Makefile.am:
+
+Include:
+<assert.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/atan b/gnulib/modules/atan
new file mode 100644
index 00000000..9c596019
--- /dev/null
+++ b/gnulib/modules/atan
@@ -0,0 +1,24 @@
+Description:
+atan() function: inverse tangent function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([atan])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ATAN_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/atan-tests b/gnulib/modules/atan-tests
new file mode 100644
index 00000000..bdd5605a
--- /dev/null
+++ b/gnulib/modules/atan-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-atan.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-atan
+check_PROGRAMS += test-atan
+test_atan_LDADD = $(LDADD) @ATAN_LIBM@
diff --git a/gnulib/modules/atan2 b/gnulib/modules/atan2
new file mode 100644
index 00000000..877cc6bd
--- /dev/null
+++ b/gnulib/modules/atan2
@@ -0,0 +1,24 @@
+Description:
+atan2() function: angle of a point in the plane.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([atan2])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ATAN2_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/atan2-tests b/gnulib/modules/atan2-tests
new file mode 100644
index 00000000..08ca3674
--- /dev/null
+++ b/gnulib/modules/atan2-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-atan2.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-atan2
+check_PROGRAMS += test-atan2
+test_atan2_LDADD = $(LDADD) @ATAN2_LIBM@
diff --git a/gnulib/modules/atanl b/gnulib/modules/atanl
new file mode 100644
index 00000000..f6ba1b85
--- /dev/null
+++ b/gnulib/modules/atanl
@@ -0,0 +1,29 @@
+Description:
+atanl() function: inverse tangent function with long double argument.
+
+Files:
+lib/atanl.c
+m4/atanl.m4
+
+Depends-on:
+math
+extensions
+isnanl
+
+configure.ac:
+gl_FUNC_ATANL
+gl_MATH_MODULE_INDICATOR([atanl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ATANL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/atanl-tests b/gnulib/modules/atanl-tests
new file mode 100644
index 00000000..79fe52f1
--- /dev/null
+++ b/gnulib/modules/atanl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-atanl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-atanl
+check_PROGRAMS += test-atanl
+test_atanl_LDADD = $(LDADD) @ATANL_LIBM@
diff --git a/gnulib/modules/atexit b/gnulib/modules/atexit
new file mode 100644
index 00000000..5bb202e6
--- /dev/null
+++ b/gnulib/modules/atexit
@@ -0,0 +1,28 @@
+Description:
+atexit() function: register a function to be called at program termination.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/atexit.c
+m4/atexit.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_ATEXIT
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+public domain
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/atexit-tests b/gnulib/modules/atexit-tests
new file mode 100644
index 00000000..82d6ae45
--- /dev/null
+++ b/gnulib/modules/atexit-tests
@@ -0,0 +1,13 @@
+Files:
+tests/signature.h
+tests/test-atexit.sh
+tests/test-atexit.c
+
+Depends-on:
+unistd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-atexit.sh
+check_PROGRAMS += test-atexit
diff --git a/gnulib/modules/atoll b/gnulib/modules/atoll
new file mode 100644
index 00000000..5f057129
--- /dev/null
+++ b/gnulib/modules/atoll
@@ -0,0 +1,26 @@
+Description:
+atoll() function: convert decimal string string to 'long long'.
+
+Files:
+lib/atoll.c
+m4/atoll.m4
+m4/longlong.m4
+
+Depends-on:
+strtoll
+
+configure.ac:
+gl_FUNC_ATOLL
+gl_STDLIB_MODULE_INDICATOR([atoll])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
+
diff --git a/gnulib/modules/autobuild b/gnulib/modules/autobuild
new file mode 100644
index 00000000..d294e4f6
--- /dev/null
+++ b/gnulib/modules/autobuild
@@ -0,0 +1,22 @@
+Description:
+Macros to print information about the build, useful for the autobuild parser.
+
+Files:
+m4/autobuild.m4
+
+Depends-on:
+
+configure.ac-early:
+AB_INIT
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/avltree-list b/gnulib/modules/avltree-list
new file mode 100644
index 00000000..90a42fda
--- /dev/null
+++ b/gnulib/modules/avltree-list
@@ -0,0 +1,28 @@
+Description:
+Sequential list data type implemented by a binary tree.
+
+Files:
+lib/gl_avltree_list.h
+lib/gl_avltree_list.c
+lib/gl_anyavltree_list1.h
+lib/gl_anyavltree_list2.h
+lib/gl_anytree_list1.h
+lib/gl_anytree_list2.h
+
+Depends-on:
+list
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_avltree_list.h gl_avltree_list.c gl_anyavltree_list1.h gl_anyavltree_list2.h gl_anytree_list1.h gl_anytree_list2.h
+
+Include:
+"gl_avltree_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/avltree-list-tests b/gnulib/modules/avltree-list-tests
new file mode 100644
index 00000000..cbd47c78
--- /dev/null
+++ b/gnulib/modules/avltree-list-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-avltree_list.c
+tests/macros.h
+
+Depends-on:
+array-list
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-avltree_list
+check_PROGRAMS += test-avltree_list
diff --git a/gnulib/modules/avltree-oset b/gnulib/modules/avltree-oset
new file mode 100644
index 00000000..ee16eb5d
--- /dev/null
+++ b/gnulib/modules/avltree-oset
@@ -0,0 +1,25 @@
+Description:
+Ordered set data type implemented by a binary tree.
+
+Files:
+lib/gl_avltree_oset.h
+lib/gl_avltree_oset.c
+lib/gl_anytree_oset.h
+
+Depends-on:
+oset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_avltree_oset.h gl_avltree_oset.c gl_anytree_oset.h
+
+Include:
+"gl_avltree_oset.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/avltree-oset-tests b/gnulib/modules/avltree-oset-tests
new file mode 100644
index 00000000..a29ad587
--- /dev/null
+++ b/gnulib/modules/avltree-oset-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-avltree_oset.c
+tests/macros.h
+
+Depends-on:
+array-oset
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-avltree_oset
+check_PROGRAMS += test-avltree_oset
diff --git a/gnulib/modules/avltreehash-list b/gnulib/modules/avltreehash-list
new file mode 100644
index 00000000..4c5622cc
--- /dev/null
+++ b/gnulib/modules/avltreehash-list
@@ -0,0 +1,35 @@
+Description:
+Sequential list data type implemented by a hash table with a binary tree.
+
+Files:
+lib/gl_avltreehash_list.h
+lib/gl_avltreehash_list.c
+lib/gl_anyhash_list1.h
+lib/gl_anyhash_list2.h
+lib/gl_anyavltree_list1.h
+lib/gl_anyavltree_list2.h
+lib/gl_anytree_list1.h
+lib/gl_anytree_list2.h
+lib/gl_anytreehash_list1.h
+lib/gl_anytreehash_list2.h
+
+Depends-on:
+list
+avltree-oset
+stdint
+xsize
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_avltreehash_list.h gl_avltreehash_list.c gl_anyhash_list1.h gl_anyhash_list2.h gl_anyavltree_list1.h gl_anyavltree_list2.h gl_anytree_list1.h gl_anytree_list2.h gl_anytreehash_list1.h gl_anytreehash_list2.h
+
+Include:
+"gl_avltreehash_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/avltreehash-list-tests b/gnulib/modules/avltreehash-list-tests
new file mode 100644
index 00000000..eae613ec
--- /dev/null
+++ b/gnulib/modules/avltreehash-list-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-avltreehash_list.c
+tests/macros.h
+
+Depends-on:
+array-list
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-avltreehash_list
+check_PROGRAMS += test-avltreehash_list
+
diff --git a/gnulib/modules/backupfile b/gnulib/modules/backupfile
new file mode 100644
index 00000000..fcfcce62
--- /dev/null
+++ b/gnulib/modules/backupfile
@@ -0,0 +1,31 @@
+Description:
+Determination of the filename of a backup file, according to user environment
+variables.
+
+Files:
+lib/backupfile.h
+lib/backupfile.c
+m4/dos.m4
+m4/backupfile.m4
+
+Depends-on:
+argmatch
+d-ino
+dirent-safer
+dirname-lgpl
+memcmp
+stdbool
+
+configure.ac:
+gl_BACKUPFILE
+
+Makefile.am:
+
+Include:
+"backupfile.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/base64 b/gnulib/modules/base64
new file mode 100644
index 00000000..b1a3513b
--- /dev/null
+++ b/gnulib/modules/base64
@@ -0,0 +1,26 @@
+Description:
+Encode binary data using printable characters (base64).
+
+Files:
+lib/base64.h
+lib/base64.c
+m4/base64.m4
+
+Depends-on:
+stdbool
+memchr
+
+configure.ac:
+gl_FUNC_BASE64
+
+Makefile.am:
+lib_SOURCES += base64.h base64.c
+
+Include:
+"base64.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/base64-tests b/gnulib/modules/base64-tests
new file mode 100644
index 00000000..b8659a8b
--- /dev/null
+++ b/gnulib/modules/base64-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-base64.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-base64
+check_PROGRAMS += test-base64
diff --git a/gnulib/modules/bcopy b/gnulib/modules/bcopy
new file mode 100644
index 00000000..d4a2bb93
--- /dev/null
+++ b/gnulib/modules/bcopy
@@ -0,0 +1,22 @@
+Description:
+Old BSD bcopy() function: copy memory area.
+
+Files:
+lib/bcopy.c
+
+Depends-on:
+strings
+
+configure.ac:
+AC_REPLACE_FUNCS(bcopy)
+
+Makefile.am:
+
+Include:
+<strings.h>
+
+License:
+GPL
+
+Maintainer:
+
diff --git a/gnulib/modules/binary-io b/gnulib/modules/binary-io
new file mode 100644
index 00000000..e97feb92
--- /dev/null
+++ b/gnulib/modules/binary-io
@@ -0,0 +1,22 @@
+Description:
+Binary mode I/O.
+
+Files:
+lib/binary-io.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += binary-io.h
+
+Include:
+"binary-io.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/binary-io-tests b/gnulib/modules/binary-io-tests
new file mode 100644
index 00000000..86422e63
--- /dev/null
+++ b/gnulib/modules/binary-io-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-binary-io.sh
+tests/test-binary-io.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-binary-io.sh
+check_PROGRAMS += test-binary-io
+
diff --git a/gnulib/modules/bind b/gnulib/modules/bind
new file mode 100644
index 00000000..050f0e65
--- /dev/null
+++ b/gnulib/modules/bind
@@ -0,0 +1,28 @@
+Description:
+bind() function: bind a server socket to a port.
+
+Files:
+lib/bind.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([bind])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([bind])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/bison-i18n b/gnulib/modules/bison-i18n
new file mode 100644
index 00000000..d0175cae
--- /dev/null
+++ b/gnulib/modules/bison-i18n
@@ -0,0 +1,22 @@
+Description:
+Support for internationalization of bison-generated parsers.
+
+Files:
+m4/bison-i18n.m4
+
+Depends-on:
+gettext
+
+configure.ac:
+BISON_I18N
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Bruno Haible, Paul Eggert
+
diff --git a/gnulib/modules/bitrotate b/gnulib/modules/bitrotate
new file mode 100644
index 00000000..63124a89
--- /dev/null
+++ b/gnulib/modules/bitrotate
@@ -0,0 +1,23 @@
+Description:
+Rotate bits in unsigned 8, 16, and 32 bit integers.
+
+Files:
+lib/bitrotate.h
+
+Depends-on:
+stdint
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += bitrotate.h
+
+Include:
+"bitrotate.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/bitrotate-tests b/gnulib/modules/bitrotate-tests
new file mode 100644
index 00000000..c6860197
--- /dev/null
+++ b/gnulib/modules/bitrotate-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-bitrotate.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-bitrotate
+check_PROGRAMS += test-bitrotate
diff --git a/gnulib/modules/btowc b/gnulib/modules/btowc
new file mode 100644
index 00000000..9fab481d
--- /dev/null
+++ b/gnulib/modules/btowc
@@ -0,0 +1,25 @@
+Description:
+btowc() function: convert unibyte character to wide character.
+
+Files:
+lib/btowc.c
+m4/btowc.m4
+
+Depends-on:
+wchar
+
+configure.ac:
+gl_FUNC_BTOWC
+gl_WCHAR_MODULE_INDICATOR([btowc])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/btowc-tests b/gnulib/modules/btowc-tests
new file mode 100644
index 00000000..cac7e616
--- /dev/null
+++ b/gnulib/modules/btowc-tests
@@ -0,0 +1,20 @@
+Files:
+tests/test-btowc1.sh
+tests/test-btowc2.sh
+tests/test-btowc.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-btowc1.sh test-btowc2.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-btowc
+
diff --git a/gnulib/modules/byteswap b/gnulib/modules/byteswap
new file mode 100644
index 00000000..6a3ce152
--- /dev/null
+++ b/gnulib/modules/byteswap
@@ -0,0 +1,33 @@
+Description:
+Swap bytes of 16, 32 and 64 bit values.
+
+Files:
+lib/byteswap.in.h
+m4/byteswap.m4
+
+Depends-on:
+
+configure.ac:
+gl_BYTESWAP
+
+Makefile.am:
+BUILT_SOURCES += $(BYTESWAP_H)
+
+# We need the following in order to create <byteswap.h> when the system
+# doesn't have one.
+byteswap.h: byteswap.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/byteswap.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += byteswap.h byteswap.h-t
+
+Include:
+<byteswap.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Oskar Liljeblad
diff --git a/gnulib/modules/byteswap-tests b/gnulib/modules/byteswap-tests
new file mode 100644
index 00000000..be7b6594
--- /dev/null
+++ b/gnulib/modules/byteswap-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-byteswap.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-byteswap
+check_PROGRAMS += test-byteswap
diff --git a/gnulib/modules/c-ctype b/gnulib/modules/c-ctype
new file mode 100644
index 00000000..70136316
--- /dev/null
+++ b/gnulib/modules/c-ctype
@@ -0,0 +1,24 @@
+Description:
+Character handling in C locale.
+
+Files:
+lib/c-ctype.h
+lib/c-ctype.c
+
+Depends-on:
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += c-ctype.h c-ctype.c
+
+Include:
+"c-ctype.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/c-ctype-tests b/gnulib/modules/c-ctype-tests
new file mode 100644
index 00000000..196f5299
--- /dev/null
+++ b/gnulib/modules/c-ctype-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-c-ctype.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-c-ctype
+check_PROGRAMS += test-c-ctype
+
diff --git a/gnulib/modules/c-stack b/gnulib/modules/c-stack
new file mode 100644
index 00000000..83de3f8b
--- /dev/null
+++ b/gnulib/modules/c-stack
@@ -0,0 +1,35 @@
+Description:
+Stack overflow handling, causing program exit.
+
+Files:
+lib/c-stack.h
+lib/c-stack.c
+m4/c-stack.m4
+
+Depends-on:
+gettext-h
+errno
+exitfail
+ignore-value
+unistd
+raise
+sigaction
+libsigsegv
+
+configure.ac:
+gl_C_STACK
+
+Makefile.am:
+lib_SOURCES += c-stack.h c-stack.c
+
+Include:
+"c-stack.h"
+
+Link:
+$(LTLIBCSTACK) when linking with libtool, $(LIBCSTACK) otherwise
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/c-stack-tests b/gnulib/modules/c-stack-tests
new file mode 100644
index 00000000..81748628
--- /dev/null
+++ b/gnulib/modules/c-stack-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-c-stack.c
+tests/test-c-stack.sh
+tests/test-c-stack2.sh
+tests/macros.h
+
+Depends-on:
+exitfail
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-c-stack.sh test-c-stack2.sh
+TESTS_ENVIRONMENT += LIBSIGSEGV='@LIBSIGSEGV@'
+check_PROGRAMS += test-c-stack
+test_c_stack_LDADD = $(LDADD) $(LIBCSTACK) @LIBINTL@
+MOSTLYCLEANFILES += t-c-stack.tmp t-c-stack2.tmp
diff --git a/gnulib/modules/c-strcase b/gnulib/modules/c-strcase
new file mode 100644
index 00000000..49f391d9
--- /dev/null
+++ b/gnulib/modules/c-strcase
@@ -0,0 +1,25 @@
+Description:
+Case-insensitive string comparison functions in C locale.
+
+Files:
+lib/c-strcase.h
+lib/c-strcasecmp.c
+lib/c-strncasecmp.c
+
+Depends-on:
+c-ctype
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += c-strcase.h c-strcasecmp.c c-strncasecmp.c
+
+Include:
+"c-strcase.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/c-strcase-tests b/gnulib/modules/c-strcase-tests
new file mode 100644
index 00000000..aec55d24
--- /dev/null
+++ b/gnulib/modules/c-strcase-tests
@@ -0,0 +1,19 @@
+Files:
+tests/test-c-strcase.sh
+tests/test-c-strcasecmp.c
+tests/test-c-strncasecmp.c
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-tr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_TR_UTF8
+
+Makefile.am:
+TESTS += test-c-strcase.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
+check_PROGRAMS += test-c-strcasecmp test-c-strncasecmp
diff --git a/gnulib/modules/c-strcaseeq b/gnulib/modules/c-strcaseeq
new file mode 100644
index 00000000..90db9863
--- /dev/null
+++ b/gnulib/modules/c-strcaseeq
@@ -0,0 +1,23 @@
+Description:
+Optimized case-insensitive string comparison in C locale.
+
+Files:
+lib/c-strcaseeq.h
+
+Depends-on:
+c-strcase
+c-ctype
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"c-strcaseeq.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/c-strcasestr b/gnulib/modules/c-strcasestr
new file mode 100644
index 00000000..757f63ab
--- /dev/null
+++ b/gnulib/modules/c-strcasestr
@@ -0,0 +1,29 @@
+Description:
+Efficient case-insensitive searching in a string in C locale.
+
+Files:
+lib/c-strcasestr.h
+lib/c-strcasestr.c
+lib/str-two-way.h
+
+Depends-on:
+c-ctype
+c-strcase
+stdbool
+memchr
+memcmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += c-strcasestr.h c-strcasestr.c
+
+Include:
+"c-strcasestr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/c-strcasestr-tests b/gnulib/modules/c-strcasestr-tests
new file mode 100644
index 00000000..f6710861
--- /dev/null
+++ b/gnulib/modules/c-strcasestr-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-c-strcasestr.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-c-strcasestr
+check_PROGRAMS += test-c-strcasestr
+
diff --git a/gnulib/modules/c-strstr b/gnulib/modules/c-strstr
new file mode 100644
index 00000000..6a7e0634
--- /dev/null
+++ b/gnulib/modules/c-strstr
@@ -0,0 +1,24 @@
+Description:
+Search for a substring in a string in C locale.
+
+Files:
+lib/c-strstr.h
+lib/c-strstr.c
+
+Depends-on:
+strstr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += c-strstr.h c-strstr.c
+
+Include:
+"c-strstr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/c-strstr-tests b/gnulib/modules/c-strstr-tests
new file mode 100644
index 00000000..78565b22
--- /dev/null
+++ b/gnulib/modules/c-strstr-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-c-strstr.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-c-strstr
+check_PROGRAMS += test-c-strstr
+
diff --git a/gnulib/modules/c-strtod b/gnulib/modules/c-strtod
new file mode 100644
index 00000000..3bed8255
--- /dev/null
+++ b/gnulib/modules/c-strtod
@@ -0,0 +1,26 @@
+Description:
+Convert string to double in C locale.
+
+Files:
+lib/c-strtod.c
+lib/c-strtod.h
+m4/c-strtod.m4
+
+Depends-on:
+extensions
+locale
+strdup-posix
+
+configure.ac:
+gl_C_STRTOD
+
+Makefile.am:
+
+Include:
+"c-strtod.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/c-strtold b/gnulib/modules/c-strtold
new file mode 100644
index 00000000..e846276b
--- /dev/null
+++ b/gnulib/modules/c-strtold
@@ -0,0 +1,27 @@
+Description:
+Convert string to long double in C locale.
+
+Files:
+lib/c-strtod.h
+lib/c-strtod.c
+lib/c-strtold.c
+m4/c-strtod.m4
+
+Depends-on:
+extensions
+locale
+strdup-posix
+
+configure.ac:
+gl_C_STRTOLD
+
+Makefile.am:
+
+Include:
+"c-strtod.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/calloc b/gnulib/modules/calloc
new file mode 100644
index 00000000..52c9594a
--- /dev/null
+++ b/gnulib/modules/calloc
@@ -0,0 +1,23 @@
+Description:
+calloc() function that is glibc compatible.
+
+Files:
+lib/calloc.c
+m4/calloc.m4
+
+Depends-on:
+calloc-posix
+
+configure.ac:
+AC_FUNC_CALLOC
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/calloc-posix b/gnulib/modules/calloc-posix
new file mode 100644
index 00000000..f93b90e8
--- /dev/null
+++ b/gnulib/modules/calloc-posix
@@ -0,0 +1,26 @@
+Description:
+calloc() function: allocate memory with indefinite extent.
+
+Files:
+lib/calloc.c
+m4/calloc.m4
+m4/malloc.m4
+
+Depends-on:
+stdlib
+
+configure.ac:
+gl_FUNC_CALLOC_POSIX
+gl_STDLIB_MODULE_INDICATOR([calloc-posix])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/canon-host b/gnulib/modules/canon-host
new file mode 100644
index 00000000..ef9807da
--- /dev/null
+++ b/gnulib/modules/canon-host
@@ -0,0 +1,29 @@
+Description:
+Canonicalize a host name: return a name other hosts can understand, i.e.
+usually the host name including FQDN.
+
+Files:
+lib/canon-host.c
+lib/canon-host.h
+m4/canon-host.m4
+
+Depends-on:
+getaddrinfo
+strdup
+
+configure.ac:
+gl_CANON_HOST
+
+Makefile.am:
+
+Include:
+"canon-host.h"
+
+Link:
+$(GETADDRINFO_LIB)
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/canonicalize b/gnulib/modules/canonicalize
new file mode 100644
index 00000000..39a5102e
--- /dev/null
+++ b/gnulib/modules/canonicalize
@@ -0,0 +1,37 @@
+Description:
+Return the canonical absolute name of a given file.
+
+Files:
+lib/canonicalize.h
+lib/canonicalize.c
+m4/canonicalize.m4
+m4/double-slash-root.m4
+
+Depends-on:
+areadlink-with-size
+errno
+extensions
+file-set
+hash-triple
+lstat
+memmove
+pathmax
+sys_stat
+xalloc
+xgetcwd
+
+configure.ac:
+gl_FUNC_CANONICALIZE_FILENAME_MODE
+gl_MODULE_INDICATOR([canonicalize])
+gl_STDLIB_MODULE_INDICATOR([canonicalize_file_name])
+
+Makefile.am:
+
+Include:
+"canonicalize.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/canonicalize-lgpl b/gnulib/modules/canonicalize-lgpl
new file mode 100644
index 00000000..6a748f30
--- /dev/null
+++ b/gnulib/modules/canonicalize-lgpl
@@ -0,0 +1,36 @@
+Description:
+realpath, canonical_file_name: Provide canonical absolute file name
+
+Files:
+lib/canonicalize-lgpl.c
+m4/canonicalize.m4
+m4/double-slash-root.m4
+
+Depends-on:
+alloca-opt
+errno
+extensions
+lstat
+malloca
+memmove
+pathmax
+readlink
+stdlib
+sys_stat
+
+configure.ac:
+gl_CANONICALIZE_LGPL
+gl_MODULE_INDICATOR([canonicalize-lgpl])
+gl_STDLIB_MODULE_INDICATOR([canonicalize_file_name])
+gl_STDLIB_MODULE_INDICATOR([realpath])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/canonicalize-lgpl-tests b/gnulib/modules/canonicalize-lgpl-tests
new file mode 100644
index 00000000..fd49d69e
--- /dev/null
+++ b/gnulib/modules/canonicalize-lgpl-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-canonicalize-lgpl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+same-inode
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-canonicalize-lgpl
+check_PROGRAMS += test-canonicalize-lgpl
diff --git a/gnulib/modules/canonicalize-tests b/gnulib/modules/canonicalize-tests
new file mode 100644
index 00000000..9b5acd83
--- /dev/null
+++ b/gnulib/modules/canonicalize-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-canonicalize.c
+tests/macros.h
+
+Depends-on:
+ignore-value
+progname
+same-inode
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-canonicalize
+check_PROGRAMS += test-canonicalize
+test_canonicalize_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/carray-list b/gnulib/modules/carray-list
new file mode 100644
index 00000000..3b88d83d
--- /dev/null
+++ b/gnulib/modules/carray-list
@@ -0,0 +1,25 @@
+Description:
+Sequential list data type implemented by a circular array.
+
+Files:
+lib/gl_carray_list.h
+lib/gl_carray_list.c
+
+Depends-on:
+list
+xsize
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_carray_list.h gl_carray_list.c
+
+Include:
+"gl_carray_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/carray-list-tests b/gnulib/modules/carray-list-tests
new file mode 100644
index 00000000..4f13705a
--- /dev/null
+++ b/gnulib/modules/carray-list-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-carray_list.c
+tests/macros.h
+
+Depends-on:
+array-list
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-carray_list
+check_PROGRAMS += test-carray_list
+
diff --git a/gnulib/modules/cbrt b/gnulib/modules/cbrt
new file mode 100644
index 00000000..fe015ee0
--- /dev/null
+++ b/gnulib/modules/cbrt
@@ -0,0 +1,24 @@
+Description:
+cbrt() function: cube root.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([cbrt])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(CBRT_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/cbrt-tests b/gnulib/modules/cbrt-tests
new file mode 100644
index 00000000..47248e05
--- /dev/null
+++ b/gnulib/modules/cbrt-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-cbrt.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-cbrt
+check_PROGRAMS += test-cbrt
+test_cbrt_LDADD = $(LDADD) @CBRT_LIBM@
diff --git a/gnulib/modules/ceil b/gnulib/modules/ceil
new file mode 100644
index 00000000..5c163093
--- /dev/null
+++ b/gnulib/modules/ceil
@@ -0,0 +1,26 @@
+Description:
+ceil() function: round towards positive infinity.
+
+Files:
+m4/ceil.m4
+
+Depends-on:
+math
+
+configure.ac:
+gl_FUNC_CEIL
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(CEIL_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/ceilf b/gnulib/modules/ceilf
new file mode 100644
index 00000000..3c0082c7
--- /dev/null
+++ b/gnulib/modules/ceilf
@@ -0,0 +1,31 @@
+Description:
+ceilf() function: round towards positive infinity.
+
+Files:
+lib/ceilf.c
+lib/ceil.c
+m4/ceilf.m4
+
+Depends-on:
+math
+extensions
+float
+
+configure.ac:
+gl_FUNC_CEILF
+gl_MATH_MODULE_INDICATOR([ceilf])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(CEILF_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/ceilf-tests b/gnulib/modules/ceilf-tests
new file mode 100644
index 00000000..9462b06f
--- /dev/null
+++ b/gnulib/modules/ceilf-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-ceilf1.c
+tests/test-ceilf2.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+float
+isnanf-nolibm
+stdbool
+stdint
+fprintf-posix
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ceilf1 test-ceilf2
+check_PROGRAMS += test-ceilf1 test-ceilf2
+test_ceilf1_LDADD = $(LDADD) @CEILF_LIBM@
+test_ceilf2_LDADD = $(LDADD) @CEILF_LIBM@
diff --git a/gnulib/modules/ceill b/gnulib/modules/ceill
new file mode 100644
index 00000000..a2365c27
--- /dev/null
+++ b/gnulib/modules/ceill
@@ -0,0 +1,31 @@
+Description:
+ceill() function: round towards positive infinity.
+
+Files:
+lib/ceill.c
+lib/ceil.c
+m4/ceill.m4
+
+Depends-on:
+math
+extensions
+float
+
+configure.ac:
+gl_FUNC_CEILL
+gl_MATH_MODULE_INDICATOR([ceill])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(CEILL_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/ceill-tests b/gnulib/modules/ceill-tests
new file mode 100644
index 00000000..48b9be30
--- /dev/null
+++ b/gnulib/modules/ceill-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-ceill.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+isnanl-nolibm
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ceill
+check_PROGRAMS += test-ceill
+test_ceill_LDADD = $(LDADD) @CEILL_LIBM@
diff --git a/gnulib/modules/chdir-long b/gnulib/modules/chdir-long
new file mode 100644
index 00000000..4025b45a
--- /dev/null
+++ b/gnulib/modules/chdir-long
@@ -0,0 +1,31 @@
+Description:
+chdir-like function that tries not to fail due to ENAMETOOLONG
+
+Files:
+lib/chdir-long.h
+lib/chdir-long.c
+m4/chdir-long.m4
+
+Depends-on:
+atexit
+fchdir
+fcntl-h
+openat
+memchr
+mempcpy
+memrchr
+stdbool
+
+configure.ac:
+gl_FUNC_CHDIR_LONG
+
+Makefile.am:
+
+Include:
+"chdir-long.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/chdir-safer b/gnulib/modules/chdir-safer
new file mode 100644
index 00000000..39cfdc7f
--- /dev/null
+++ b/gnulib/modules/chdir-safer
@@ -0,0 +1,29 @@
+Description:
+like chdir, but safer
+
+Files:
+lib/chdir-safer.h
+lib/chdir-safer.c
+m4/chdir-safer.m4
+
+Depends-on:
+errno
+fchdir
+fcntl-h
+open
+same-inode
+stdbool
+
+configure.ac:
+gl_CHDIR_SAFER
+
+Makefile.am:
+
+Include:
+"chdir-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/check-version b/gnulib/modules/check-version
new file mode 100644
index 00000000..ab1bb3bc
--- /dev/null
+++ b/gnulib/modules/check-version
@@ -0,0 +1,24 @@
+Description:
+Check version string compatibility.
+
+Files:
+m4/check-version.m4
+lib/check-version.h
+lib/check-version.c
+
+Depends-on:
+strverscmp
+
+configure.ac:
+gl_CHECK_VERSION
+
+Makefile.am:
+
+Include:
+"check-version.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/chown b/gnulib/modules/chown
new file mode 100644
index 00000000..4c296ac2
--- /dev/null
+++ b/gnulib/modules/chown
@@ -0,0 +1,29 @@
+Description:
+chown() function: change ownership of a file, following symlinks.
+
+Files:
+lib/chown.c
+lib/fchown-stub.c
+m4/chown.m4
+
+Depends-on:
+open
+stat
+stdbool
+sys_stat
+unistd
+
+configure.ac:
+gl_FUNC_CHOWN
+gl_UNISTD_MODULE_INDICATOR([chown])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/chown-tests b/gnulib/modules/chown-tests
new file mode 100644
index 00000000..359ba1be
--- /dev/null
+++ b/gnulib/modules/chown-tests
@@ -0,0 +1,24 @@
+Files:
+tests/nap.h
+tests/test-chown.h
+tests/test-chown.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+lstat
+mgetgroups
+progname
+usleep
+stat-time
+stdbool
+symlink
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([getegid])
+
+Makefile.am:
+TESTS += test-chown
+check_PROGRAMS += test-chown
+test_chown_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/classpath b/gnulib/modules/classpath
new file mode 100644
index 00000000..c6b89377
--- /dev/null
+++ b/gnulib/modules/classpath
@@ -0,0 +1,26 @@
+Description:
+Java CLASSPATH handling.
+
+Files:
+lib/classpath.h
+lib/classpath.c
+
+Depends-on:
+stdbool
+xsetenv
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += classpath.h classpath.c
+
+Include:
+"classpath.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/clean-temp b/gnulib/modules/clean-temp
new file mode 100644
index 00000000..d4afa346
--- /dev/null
+++ b/gnulib/modules/clean-temp
@@ -0,0 +1,37 @@
+Description:
+Temporary directories and temporary files with automatic cleanup.
+
+Files:
+lib/clean-temp.h
+lib/clean-temp.c
+
+Depends-on:
+stdbool
+unistd
+error
+fatal-signal
+open
+pathmax
+tmpdir
+mkdtemp
+rmdir
+xalloc
+xmalloca
+linkedhash-list
+xlist
+gettext-h
+
+configure.ac:
+AC_DEFINE([SIGNAL_SAFE_LIST], [1], [Define if lists must be signal-safe.])
+
+Makefile.am:
+lib_SOURCES += clean-temp.h clean-temp.c
+
+Include:
+"clean-temp.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/clock-time b/gnulib/modules/clock-time
new file mode 100644
index 00000000..ba866d90
--- /dev/null
+++ b/gnulib/modules/clock-time
@@ -0,0 +1,24 @@
+Description:
+Check for clock_gettime and clock_settime.
+
+Files:
+m4/clock_time.m4
+
+Depends-on:
+extensions
+
+configure.ac:
+gl_CLOCK_TIME
+
+Makefile.am:
+
+Include:
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/cloexec b/gnulib/modules/cloexec
new file mode 100644
index 00000000..d590d1e6
--- /dev/null
+++ b/gnulib/modules/cloexec
@@ -0,0 +1,27 @@
+Description:
+Set or clear the close-on-exec descriptor flag.
+
+Files:
+lib/cloexec.c
+lib/cloexec.h
+m4/cloexec.m4
+
+Depends-on:
+dup2
+fcntl
+stdbool
+
+configure.ac:
+gl_CLOEXEC
+gl_MODULE_INDICATOR([cloexec])
+
+Makefile.am:
+
+Include:
+"cloexec.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/cloexec-tests b/gnulib/modules/cloexec-tests
new file mode 100644
index 00000000..3a76b9e9
--- /dev/null
+++ b/gnulib/modules/cloexec-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-cloexec.c
+tests/macros.h
+
+Depends-on:
+binary-io
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-cloexec
+check_PROGRAMS += test-cloexec
diff --git a/gnulib/modules/close b/gnulib/modules/close
new file mode 100644
index 00000000..e294292b
--- /dev/null
+++ b/gnulib/modules/close
@@ -0,0 +1,26 @@
+Description:
+close() function: close a file or socket.
+
+Files:
+lib/close.c
+m4/close.m4
+
+Depends-on:
+unistd
+close-hook
+fclose
+
+configure.ac:
+gl_FUNC_CLOSE
+gl_UNISTD_MODULE_INDICATOR([close])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson, Bruno Haible
diff --git a/gnulib/modules/close-hook b/gnulib/modules/close-hook
new file mode 100644
index 00000000..ae32ad05
--- /dev/null
+++ b/gnulib/modules/close-hook
@@ -0,0 +1,23 @@
+Description:
+Hook for making close() extensible.
+
+Files:
+lib/close-hook.h
+lib/close-hook.c
+
+Depends-on:
+unistd
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += close-hook.c
+
+Include:
+"close-hook.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/close-stream b/gnulib/modules/close-stream
new file mode 100644
index 00000000..03eba124
--- /dev/null
+++ b/gnulib/modules/close-stream
@@ -0,0 +1,26 @@
+Description:
+Close a stream, with nicer error checking than fclose's.
+
+Files:
+lib/close-stream.h
+lib/close-stream.c
+m4/close-stream.m4
+
+Depends-on:
+fpending
+stdbool
+
+configure.ac:
+gl_CLOSE_STREAM
+gl_MODULE_INDICATOR([close-stream])
+
+Makefile.am:
+
+Include:
+"close-stream.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/closein b/gnulib/modules/closein
new file mode 100644
index 00000000..522a383d
--- /dev/null
+++ b/gnulib/modules/closein
@@ -0,0 +1,27 @@
+Description:
+Close all standard streams, resetting seekable stdin if needed, and exiting with a diagnostic on error.
+
+Files:
+lib/closein.h
+lib/closein.c
+m4/closein.m4
+
+Depends-on:
+closeout
+freadahead
+fflush
+stdbool
+
+configure.ac:
+gl_CLOSEIN
+
+Makefile.am:
+
+Include:
+"closein.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/closein-tests b/gnulib/modules/closein-tests
new file mode 100644
index 00000000..2f3f6894
--- /dev/null
+++ b/gnulib/modules/closein-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-closein.sh
+tests/test-closein.c
+
+Depends-on:
+binary-io
+ignore-value
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-closein.sh
+check_PROGRAMS += test-closein
+test_closein_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/closeout b/gnulib/modules/closeout
new file mode 100644
index 00000000..6a77cef6
--- /dev/null
+++ b/gnulib/modules/closeout
@@ -0,0 +1,29 @@
+Description:
+Close standard output and standard error, exiting with a diagnostic on error.
+
+Files:
+lib/closeout.h
+lib/closeout.c
+m4/closeout.m4
+
+Depends-on:
+close-stream
+gettext-h
+error
+quotearg
+exitfail
+stdbool
+
+configure.ac:
+gl_CLOSEOUT
+
+Makefile.am:
+
+Include:
+"closeout.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/concat-filename b/gnulib/modules/concat-filename
new file mode 100644
index 00000000..70ad9f60
--- /dev/null
+++ b/gnulib/modules/concat-filename
@@ -0,0 +1,27 @@
+Description:
+Construct a full filename by concatenating a directory name, a relative
+filename, and a suffix.
+
+Files:
+lib/concat-filename.h
+lib/concat-filename.c
+
+Depends-on:
+filename
+malloc-posix
+stpcpy
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += concat-filename.c
+
+Include:
+"concat-filename.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/cond b/gnulib/modules/cond
new file mode 100644
index 00000000..a28ed116
--- /dev/null
+++ b/gnulib/modules/cond
@@ -0,0 +1,31 @@
+Description:
+Condition variables for multithreading.
+
+Files:
+lib/glthread/cond.h
+lib/glthread/cond.c
+m4/cond.m4
+
+Depends-on:
+threadlib
+lock
+errno
+stdbool
+time
+gettimeofday
+
+configure.ac:
+gl_COND
+
+Makefile.am:
+lib_SOURCES += glthread/cond.h glthread/cond.c
+
+Include:
+"glthread/cond.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Yoann Vandoorselaere
+
diff --git a/gnulib/modules/cond-tests b/gnulib/modules/cond-tests
new file mode 100644
index 00000000..6b4c45e2
--- /dev/null
+++ b/gnulib/modules/cond-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-cond.c
+
+Depends-on:
+lock
+thread
+yield
+gettimeofday
+sleep
+
+Makefile.am:
+TESTS += test-cond
+check_PROGRAMS += test-cond
+test_cond_LDADD = $(LDADD) @LIBMULTITHREAD@ @YIELD_LIB@
diff --git a/gnulib/modules/config-h b/gnulib/modules/config-h
new file mode 100644
index 00000000..0af7c3e2
--- /dev/null
+++ b/gnulib/modules/config-h
@@ -0,0 +1,20 @@
+Description:
+Assume config.h exists, to avoid -DHAVE_CONFIG_H clutter in 'make' output.
+
+Files:
+m4/config-h.m4
+
+Depends-on:
+
+configure.ac:
+gl_CONFIG_H
+
+Makefile.am:
+
+Include:
+
+License:
+LGPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/configmake b/gnulib/modules/configmake
new file mode 100644
index 00000000..d826c13a
--- /dev/null
+++ b/gnulib/modules/configmake
@@ -0,0 +1,76 @@
+Description:
+Variables set by "configure" or "make".
+
+Files:
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+# Retrieve values of the variables through 'configure' followed by
+# 'make', not directly through 'configure', so that a user who
+# sets some of these variables consistently on the 'make' command
+# line gets correct results.
+#
+# One advantage of this approach, compared to the classical
+# approach of adding -DLIBDIR=\"$(libdir)\" etc. to AM_CPPFLAGS,
+# is that it protects against the use of undefined variables.
+# If, say, $(libdir) is not set in the Makefile, LIBDIR is not
+# defined by this module, and code using LIBDIR gives a
+# compilation error.
+#
+# Another advantage is that 'make' output is shorter.
+#
+# Listed in the same order as the GNU makefile conventions.
+# The Automake-defined pkg* macros are appended, in the order
+# listed in the Automake 1.10a+ documentation.
+configmake.h: Makefile
+ $(AM_V_GEN)rm -f $@-t && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ echo '#define PREFIX "$(prefix)"'; \
+ echo '#define EXEC_PREFIX "$(exec_prefix)"'; \
+ echo '#define BINDIR "$(bindir)"'; \
+ echo '#define SBINDIR "$(sbindir)"'; \
+ echo '#define LIBEXECDIR "$(libexecdir)"'; \
+ echo '#define DATAROOTDIR "$(datarootdir)"'; \
+ echo '#define DATADIR "$(datadir)"'; \
+ echo '#define SYSCONFDIR "$(sysconfdir)"'; \
+ echo '#define SHAREDSTATEDIR "$(sharedstatedir)"'; \
+ echo '#define LOCALSTATEDIR "$(localstatedir)"'; \
+ echo '#define INCLUDEDIR "$(includedir)"'; \
+ echo '#define OLDINCLUDEDIR "$(oldincludedir)"'; \
+ echo '#define DOCDIR "$(docdir)"'; \
+ echo '#define INFODIR "$(infodir)"'; \
+ echo '#define HTMLDIR "$(htmldir)"'; \
+ echo '#define DVIDIR "$(dvidir)"'; \
+ echo '#define PDFDIR "$(pdfdir)"'; \
+ echo '#define PSDIR "$(psdir)"'; \
+ echo '#define LIBDIR "$(libdir)"'; \
+ echo '#define LISPDIR "$(lispdir)"'; \
+ echo '#define LOCALEDIR "$(localedir)"'; \
+ echo '#define MANDIR "$(mandir)"'; \
+ echo '#define MANEXT "$(manext)"'; \
+ echo '#define PKGDATADIR "$(pkgdatadir)"'; \
+ echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \
+ echo '#define PKGLIBDIR "$(pkglibdir)"'; \
+ echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \
+ } | sed '/""/d' > $@-t && \
+ if test -f $@ && cmp $@-t $@ > /dev/null; then \
+ rm -f $@-t; \
+ else \
+ rm -f $@; mv $@-t $@; \
+ fi
+
+BUILT_SOURCES += configmake.h
+CLEANFILES += configmake.h configmake.h-t
+
+Include:
+/* Include only after all system include files. */
+"configmake.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/connect b/gnulib/modules/connect
new file mode 100644
index 00000000..1381ffaf
--- /dev/null
+++ b/gnulib/modules/connect
@@ -0,0 +1,28 @@
+Description:
+connect() function: connect a client socket.
+
+Files:
+lib/connect.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([connect])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([connect])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/copy-file b/gnulib/modules/copy-file
new file mode 100644
index 00000000..6941e5a8
--- /dev/null
+++ b/gnulib/modules/copy-file
@@ -0,0 +1,34 @@
+Description:
+Copying of files.
+
+Files:
+lib/copy-file.h
+lib/copy-file.c
+m4/copy-file.m4
+
+Depends-on:
+acl
+binary-io
+error
+exit
+full-write
+gettext-h
+open
+safe-read
+unistd
+xalloc
+
+configure.ac:
+gl_COPY_FILE
+
+Makefile.am:
+lib_SOURCES += copy-file.h copy-file.c
+
+Include:
+"copy-file.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/copy-file-tests b/gnulib/modules/copy-file-tests
new file mode 100644
index 00000000..ab7f6324
--- /dev/null
+++ b/gnulib/modules/copy-file-tests
@@ -0,0 +1,19 @@
+Files:
+tests/test-copy-file.sh
+tests/test-copy-file.c
+tests/macros.h
+
+Depends-on:
+acl
+acl-tests
+progname
+read-file
+xalloc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-copy-file.sh
+TESTS_ENVIRONMENT += USE_ACL=$(USE_ACL)
+check_PROGRAMS += test-copy-file
+test_copy_file_LDADD = $(LDADD) $(LIB_ACL) @LIBINTL@
diff --git a/gnulib/modules/copysign b/gnulib/modules/copysign
new file mode 100644
index 00000000..c6328065
--- /dev/null
+++ b/gnulib/modules/copysign
@@ -0,0 +1,24 @@
+Description:
+copysign() function: copy sign.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([copysign])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(COPYSIGN_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/copysign-tests b/gnulib/modules/copysign-tests
new file mode 100644
index 00000000..44f1d810
--- /dev/null
+++ b/gnulib/modules/copysign-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-copysign.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-copysign
+check_PROGRAMS += test-copysign
+test_copysign_LDADD = $(LDADD) @COPYSIGN_LIBM@
diff --git a/gnulib/modules/cos b/gnulib/modules/cos
new file mode 100644
index 00000000..eae9a4d2
--- /dev/null
+++ b/gnulib/modules/cos
@@ -0,0 +1,24 @@
+Description:
+cos() function: cosine function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([cos])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(COS_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/cos-tests b/gnulib/modules/cos-tests
new file mode 100644
index 00000000..ab46a250
--- /dev/null
+++ b/gnulib/modules/cos-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-cos.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-cos
+check_PROGRAMS += test-cos
+test_cos_LDADD = $(LDADD) @COS_LIBM@
diff --git a/gnulib/modules/cosh b/gnulib/modules/cosh
new file mode 100644
index 00000000..4fd5c3a9
--- /dev/null
+++ b/gnulib/modules/cosh
@@ -0,0 +1,24 @@
+Description:
+cosh() function: hyperbolic cosine function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([cosh])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(COSH_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/cosh-tests b/gnulib/modules/cosh-tests
new file mode 100644
index 00000000..88af9d73
--- /dev/null
+++ b/gnulib/modules/cosh-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-cosh.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-cosh
+check_PROGRAMS += test-cosh
+test_cosh_LDADD = $(LDADD) @COSH_LIBM@
diff --git a/gnulib/modules/cosl b/gnulib/modules/cosl
new file mode 100644
index 00000000..88ebf9c4
--- /dev/null
+++ b/gnulib/modules/cosl
@@ -0,0 +1,35 @@
+Description:
+cosl() function: cosine function with long double argument.
+
+Files:
+lib/cosl.c
+lib/trigl.h
+lib/sincosl.c
+lib/trigl.c
+m4/cosl.m4
+
+Depends-on:
+math
+extensions
+float
+isnanl
+floor
+floorl
+
+configure.ac:
+gl_FUNC_COSL
+gl_MATH_MODULE_INDICATOR([cosl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ACOSL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/cosl-tests b/gnulib/modules/cosl-tests
new file mode 100644
index 00000000..846f330a
--- /dev/null
+++ b/gnulib/modules/cosl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-cosl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-cosl
+check_PROGRAMS += test-cosl
+test_cosl_LDADD = $(LDADD) @COSL_LIBM@
diff --git a/gnulib/modules/count-one-bits b/gnulib/modules/count-one-bits
new file mode 100644
index 00000000..b836bfa2
--- /dev/null
+++ b/gnulib/modules/count-one-bits
@@ -0,0 +1,23 @@
+Description:
+Counts the number of 1-bits in a word.
+
+Files:
+lib/count-one-bits.h
+m4/count-one-bits.m4
+
+Depends-on:
+verify
+
+configure.ac:
+gl_COUNT_ONE_BITS
+
+Makefile.am:
+
+Include:
+"count-one-bits.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Ben Pfaff
diff --git a/gnulib/modules/count-one-bits-tests b/gnulib/modules/count-one-bits-tests
new file mode 100644
index 00000000..bf0a5432
--- /dev/null
+++ b/gnulib/modules/count-one-bits-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-count-one-bits.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-count-one-bits
+check_PROGRAMS += test-count-one-bits
diff --git a/gnulib/modules/crc b/gnulib/modules/crc
new file mode 100644
index 00000000..d2dccbb1
--- /dev/null
+++ b/gnulib/modules/crc
@@ -0,0 +1,24 @@
+Description:
+Compute cyclic redundancy codes.
+
+Files:
+lib/crc.h
+lib/crc.c
+m4/crc.m4
+
+Depends-on:
+stdint
+
+configure.ac:
+gl_CRC
+
+Makefile.am:
+
+Include:
+"crc.h"
+
+License:
+LGPL
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crc-tests b/gnulib/modules/crc-tests
new file mode 100644
index 00000000..0d35256d
--- /dev/null
+++ b/gnulib/modules/crc-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-crc.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-crc
+check_PROGRAMS += test-crc
diff --git a/gnulib/modules/crypto/arcfour b/gnulib/modules/crypto/arcfour
new file mode 100644
index 00000000..362bebe4
--- /dev/null
+++ b/gnulib/modules/crypto/arcfour
@@ -0,0 +1,24 @@
+Description:
+ARCFOUR stream cipher implementation
+
+Files:
+lib/arcfour.h
+lib/arcfour.c
+m4/arcfour.m4
+
+Depends-on:
+stdint
+
+configure.ac:
+gl_ARCFOUR
+
+Makefile.am:
+
+Include:
+"arcfour.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/arcfour-tests b/gnulib/modules/crypto/arcfour-tests
new file mode 100644
index 00000000..f02b0a66
--- /dev/null
+++ b/gnulib/modules/crypto/arcfour-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-arcfour.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-arcfour
+check_PROGRAMS += test-arcfour
diff --git a/gnulib/modules/crypto/arctwo b/gnulib/modules/crypto/arctwo
new file mode 100644
index 00000000..c6ac35fc
--- /dev/null
+++ b/gnulib/modules/crypto/arctwo
@@ -0,0 +1,25 @@
+Description:
+ARCTWO block cipher implementation
+
+Files:
+lib/arctwo.h
+lib/arctwo.c
+m4/arctwo.m4
+
+Depends-on:
+stdint
+bitrotate
+
+configure.ac:
+gl_ARCTWO
+
+Makefile.am:
+
+Include:
+"arctwo.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/arctwo-tests b/gnulib/modules/crypto/arctwo-tests
new file mode 100644
index 00000000..a0b01da5
--- /dev/null
+++ b/gnulib/modules/crypto/arctwo-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-arctwo.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-arctwo
+check_PROGRAMS += test-arctwo
diff --git a/gnulib/modules/crypto/des b/gnulib/modules/crypto/des
new file mode 100644
index 00000000..db533d01
--- /dev/null
+++ b/gnulib/modules/crypto/des
@@ -0,0 +1,26 @@
+Description:
+DES block cipher.
+
+Files:
+lib/des.c
+lib/des.h
+m4/des.m4
+
+Depends-on:
+stdint
+stdbool
+memcmp
+
+configure.ac:
+gl_DES
+
+Makefile.am:
+
+Include:
+"des.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/des-tests b/gnulib/modules/crypto/des-tests
new file mode 100644
index 00000000..a5850a48
--- /dev/null
+++ b/gnulib/modules/crypto/des-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-des.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-des
+check_PROGRAMS += test-des
diff --git a/gnulib/modules/crypto/gc b/gnulib/modules/crypto/gc
new file mode 100644
index 00000000..408dfef7
--- /dev/null
+++ b/gnulib/modules/crypto/gc
@@ -0,0 +1,32 @@
+Description:
+Core files for generic crypto package
+
+Files:
+lib/gc.h
+lib/gc-libgcrypt.c
+lib/gc-gnulib.c
+m4/gc.m4
+
+Depends-on:
+havelib
+
+configure.ac:
+gl_GC
+if test $gl_cond_libtool = false; then
+ gl_ltlibdeps="$gl_ltlibdeps $LTLIBGCRYPT"
+ gl_libdeps="$gl_libdeps $LIBGCRYPT"
+fi
+
+Makefile.am:
+if GL_COND_LIBTOOL
+lib_LDFLAGS += $(LTLIBGCRYPT)
+endif
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-arcfour b/gnulib/modules/crypto/gc-arcfour
new file mode 100644
index 00000000..0d1c3b01
--- /dev/null
+++ b/gnulib/modules/crypto/gc-arcfour
@@ -0,0 +1,27 @@
+Description:
+Generic crypto wrappers for ARCFOUR stream cipher.
+
+Files:
+m4/gc-arcfour.m4
+lib/arcfour.h
+lib/arcfour.c
+m4/arcfour.m4
+
+Depends-on:
+stdint
+crypto/gc
+
+configure.ac:
+gl_GC_ARCFOUR
+gl_MODULE_INDICATOR([gc-arcfour])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-arcfour-tests b/gnulib/modules/crypto/gc-arcfour-tests
new file mode 100644
index 00000000..b0ed0bd6
--- /dev/null
+++ b/gnulib/modules/crypto/gc-arcfour-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-arcfour.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-arcfour
+check_PROGRAMS += test-gc-arcfour
diff --git a/gnulib/modules/crypto/gc-arctwo b/gnulib/modules/crypto/gc-arctwo
new file mode 100644
index 00000000..b2654020
--- /dev/null
+++ b/gnulib/modules/crypto/gc-arctwo
@@ -0,0 +1,28 @@
+Description:
+Generic crypto wrappers for ARCTWO block cipher.
+
+Files:
+m4/gc-arctwo.m4
+lib/arctwo.h
+lib/arctwo.c
+m4/arctwo.m4
+
+Depends-on:
+stdint
+crypto/gc
+bitrotate
+
+configure.ac:
+gl_GC_ARCTWO
+gl_MODULE_INDICATOR([gc-arctwo])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-arctwo-tests b/gnulib/modules/crypto/gc-arctwo-tests
new file mode 100644
index 00000000..d1cdaff9
--- /dev/null
+++ b/gnulib/modules/crypto/gc-arctwo-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-arctwo.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-arctwo
+check_PROGRAMS += test-gc-arctwo
diff --git a/gnulib/modules/crypto/gc-camellia b/gnulib/modules/crypto/gc-camellia
new file mode 100644
index 00000000..207ffa76
--- /dev/null
+++ b/gnulib/modules/crypto/gc-camellia
@@ -0,0 +1,23 @@
+Description:
+Generic crypto wrappers for Camellia block cipher.
+
+Files:
+m4/gc-camellia.m4
+
+Depends-on:
+crypto/gc
+
+configure.ac:
+gl_GC_CAMELLIA
+gl_MODULE_INDICATOR([gc-camellia])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-des b/gnulib/modules/crypto/gc-des
new file mode 100644
index 00000000..9d58dff5
--- /dev/null
+++ b/gnulib/modules/crypto/gc-des
@@ -0,0 +1,28 @@
+Description:
+Generic crypto wrappers for DES block cipher.
+
+Files:
+m4/gc-des.m4
+lib/des.h
+lib/des.c
+m4/des.m4
+
+Depends-on:
+stdint
+stdbool
+crypto/gc
+
+configure.ac:
+gl_GC_DES
+gl_MODULE_INDICATOR([gc-des])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-des-tests b/gnulib/modules/crypto/gc-des-tests
new file mode 100644
index 00000000..e9851db3
--- /dev/null
+++ b/gnulib/modules/crypto/gc-des-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-des.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-des
+check_PROGRAMS += test-gc-des
diff --git a/gnulib/modules/crypto/gc-hmac-md5 b/gnulib/modules/crypto/gc-hmac-md5
new file mode 100644
index 00000000..881899bb
--- /dev/null
+++ b/gnulib/modules/crypto/gc-hmac-md5
@@ -0,0 +1,33 @@
+Description:
+Generic crypto wrappers for HMAC-MD5 functions.
+
+Files:
+m4/gc-hmac-md5.m4
+lib/md5.h
+lib/md5.c
+m4/md5.m4
+lib/hmac.h
+lib/hmac-md5.c
+m4/hmac-md5.m4
+lib/memxor.h
+lib/memxor.c
+m4/memxor.m4
+
+Depends-on:
+stdint
+crypto/gc
+
+configure.ac:
+gl_GC_HMAC_MD5
+gl_MODULE_INDICATOR([gc-hmac-md5])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-hmac-md5-tests b/gnulib/modules/crypto/gc-hmac-md5-tests
new file mode 100644
index 00000000..699ccf9c
--- /dev/null
+++ b/gnulib/modules/crypto/gc-hmac-md5-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-hmac-md5.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-hmac-md5
+check_PROGRAMS += test-gc-hmac-md5
diff --git a/gnulib/modules/crypto/gc-hmac-sha1 b/gnulib/modules/crypto/gc-hmac-sha1
new file mode 100644
index 00000000..603c28e4
--- /dev/null
+++ b/gnulib/modules/crypto/gc-hmac-sha1
@@ -0,0 +1,33 @@
+Description:
+Generic crypto wrappers for HMAC-SHA1 functions.
+
+Files:
+m4/gc-hmac-sha1.m4
+lib/sha1.h
+lib/sha1.c
+m4/sha1.m4
+lib/hmac.h
+lib/hmac-sha1.c
+m4/hmac-sha1.m4
+lib/memxor.h
+lib/memxor.c
+m4/memxor.m4
+
+Depends-on:
+stdint
+crypto/gc
+
+configure.ac:
+gl_GC_HMAC_SHA1
+gl_MODULE_INDICATOR([gc-hmac-sha1])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-hmac-sha1-tests b/gnulib/modules/crypto/gc-hmac-sha1-tests
new file mode 100644
index 00000000..2795ee91
--- /dev/null
+++ b/gnulib/modules/crypto/gc-hmac-sha1-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-hmac-sha1.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-hmac-sha1
+check_PROGRAMS += test-gc-hmac-sha1
diff --git a/gnulib/modules/crypto/gc-md2 b/gnulib/modules/crypto/gc-md2
new file mode 100644
index 00000000..12405492
--- /dev/null
+++ b/gnulib/modules/crypto/gc-md2
@@ -0,0 +1,26 @@
+Description:
+Generic crypto wrappers for MD2 functions.
+
+Files:
+m4/gc-md2.m4
+
+Depends-on:
+stdint
+minmax
+crypto/gc
+crypto/md2
+
+configure.ac:
+gl_GC_MD2
+gl_MODULE_INDICATOR([gc-md2])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-md2-tests b/gnulib/modules/crypto/gc-md2-tests
new file mode 100644
index 00000000..759d3d55
--- /dev/null
+++ b/gnulib/modules/crypto/gc-md2-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-md2.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-md2
+check_PROGRAMS += test-gc-md2
diff --git a/gnulib/modules/crypto/gc-md4 b/gnulib/modules/crypto/gc-md4
new file mode 100644
index 00000000..1e9490bf
--- /dev/null
+++ b/gnulib/modules/crypto/gc-md4
@@ -0,0 +1,27 @@
+Description:
+Generic crypto wrappers for MD4 functions.
+
+Files:
+m4/gc-md4.m4
+lib/md4.h
+lib/md4.c
+m4/md4.m4
+
+Depends-on:
+stdint
+crypto/gc
+
+configure.ac:
+gl_GC_MD4
+gl_MODULE_INDICATOR([gc-md4])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-md4-tests b/gnulib/modules/crypto/gc-md4-tests
new file mode 100644
index 00000000..c6bd64a0
--- /dev/null
+++ b/gnulib/modules/crypto/gc-md4-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-md4.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-md4
+check_PROGRAMS += test-gc-md4
diff --git a/gnulib/modules/crypto/gc-md5 b/gnulib/modules/crypto/gc-md5
new file mode 100644
index 00000000..35fdf13c
--- /dev/null
+++ b/gnulib/modules/crypto/gc-md5
@@ -0,0 +1,28 @@
+Description:
+Generic crypto wrappers for MD5 functions.
+
+Files:
+m4/gc-md5.m4
+lib/md5.h
+lib/md5.c
+m4/md5.m4
+
+Depends-on:
+stdint
+crypto/gc
+
+configure.ac:
+gl_GC_MD5
+gl_MODULE_INDICATOR([gc-md5])
+
+Makefile.am:
+lib_SOURCES += md5.h
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-md5-tests b/gnulib/modules/crypto/gc-md5-tests
new file mode 100644
index 00000000..a2719716
--- /dev/null
+++ b/gnulib/modules/crypto/gc-md5-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-md5.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-md5
+check_PROGRAMS += test-gc-md5
diff --git a/gnulib/modules/crypto/gc-pbkdf2-sha1 b/gnulib/modules/crypto/gc-pbkdf2-sha1
new file mode 100644
index 00000000..d70960c1
--- /dev/null
+++ b/gnulib/modules/crypto/gc-pbkdf2-sha1
@@ -0,0 +1,24 @@
+Description:
+Password-Based Key Derivation Function according to PKCS#5/RFC2898
+
+Files:
+lib/gc-pbkdf2-sha1.c
+m4/gc-pbkdf2-sha1.m4
+
+Depends-on:
+crypto/gc
+crypto/gc-hmac-sha1
+
+configure.ac:
+gl_GC_PBKDF2_SHA1
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-pbkdf2-sha1-tests b/gnulib/modules/crypto/gc-pbkdf2-sha1-tests
new file mode 100644
index 00000000..d0f79ba1
--- /dev/null
+++ b/gnulib/modules/crypto/gc-pbkdf2-sha1-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-pbkdf2-sha1.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-pbkdf2-sha1
+check_PROGRAMS += test-gc-pbkdf2-sha1
diff --git a/gnulib/modules/crypto/gc-random b/gnulib/modules/crypto/gc-random
new file mode 100644
index 00000000..2f178717
--- /dev/null
+++ b/gnulib/modules/crypto/gc-random
@@ -0,0 +1,23 @@
+Description:
+Generic crypto random number functions.
+
+Files:
+m4/gc-random.m4
+
+Depends-on:
+crypto/gc
+
+configure.ac:
+gl_GC_RANDOM
+gl_MODULE_INDICATOR([gc-random])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-rijndael b/gnulib/modules/crypto/gc-rijndael
new file mode 100644
index 00000000..bfcd48e1
--- /dev/null
+++ b/gnulib/modules/crypto/gc-rijndael
@@ -0,0 +1,29 @@
+Description:
+Generic crypto wrappers for rijndael block cipher.
+
+Files:
+m4/gc-rijndael.m4
+lib/rijndael-alg-fst.c
+lib/rijndael-alg-fst.h
+lib/rijndael-api-fst.c
+lib/rijndael-api-fst.h
+m4/rijndael.m4
+
+Depends-on:
+stdint
+crypto/gc
+
+configure.ac:
+gl_GC_RIJNDAEL
+gl_MODULE_INDICATOR([gc-rijndael])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-rijndael-tests b/gnulib/modules/crypto/gc-rijndael-tests
new file mode 100644
index 00000000..1bf24333
--- /dev/null
+++ b/gnulib/modules/crypto/gc-rijndael-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-rijndael.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-rijndael
+check_PROGRAMS += test-gc-rijndael
diff --git a/gnulib/modules/crypto/gc-sha1 b/gnulib/modules/crypto/gc-sha1
new file mode 100644
index 00000000..94a58123
--- /dev/null
+++ b/gnulib/modules/crypto/gc-sha1
@@ -0,0 +1,27 @@
+Description:
+Generic crypto wrappers for SHA-1 functions.
+
+Files:
+m4/gc-sha1.m4
+lib/sha1.h
+lib/sha1.c
+m4/sha1.m4
+
+Depends-on:
+stdint
+crypto/gc
+
+configure.ac:
+gl_GC_SHA1
+gl_MODULE_INDICATOR([gc-sha1])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/gc-sha1-tests b/gnulib/modules/crypto/gc-sha1-tests
new file mode 100644
index 00000000..e438aa25
--- /dev/null
+++ b/gnulib/modules/crypto/gc-sha1-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc-sha1.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc-sha1
+check_PROGRAMS += test-gc-sha1
diff --git a/gnulib/modules/crypto/gc-tests b/gnulib/modules/crypto/gc-tests
new file mode 100644
index 00000000..6ce252ff
--- /dev/null
+++ b/gnulib/modules/crypto/gc-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-gc.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gc
+check_PROGRAMS += test-gc
diff --git a/gnulib/modules/crypto/hmac-md5 b/gnulib/modules/crypto/hmac-md5
new file mode 100644
index 00000000..6a3a674f
--- /dev/null
+++ b/gnulib/modules/crypto/hmac-md5
@@ -0,0 +1,25 @@
+Description:
+Compute hashed message authentication codes with MD5.
+
+Files:
+lib/hmac.h
+lib/hmac-md5.c
+m4/hmac-md5.m4
+
+Depends-on:
+memxor
+crypto/md5
+
+configure.ac:
+gl_HMAC_MD5
+
+Makefile.am:
+
+Include:
+"hmac.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/hmac-md5-tests b/gnulib/modules/crypto/hmac-md5-tests
new file mode 100644
index 00000000..738ee512
--- /dev/null
+++ b/gnulib/modules/crypto/hmac-md5-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-hmac-md5.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-hmac-md5
+check_PROGRAMS += test-hmac-md5
diff --git a/gnulib/modules/crypto/hmac-sha1 b/gnulib/modules/crypto/hmac-sha1
new file mode 100644
index 00000000..5609337d
--- /dev/null
+++ b/gnulib/modules/crypto/hmac-sha1
@@ -0,0 +1,25 @@
+Description:
+Compute hashed message authentication codes with SHA1.
+
+Files:
+lib/hmac.h
+lib/hmac-sha1.c
+m4/hmac-sha1.m4
+
+Depends-on:
+memxor
+crypto/sha1
+
+configure.ac:
+gl_HMAC_SHA1
+
+Makefile.am:
+
+Include:
+"hmac.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/hmac-sha1-tests b/gnulib/modules/crypto/hmac-sha1-tests
new file mode 100644
index 00000000..ddebc58d
--- /dev/null
+++ b/gnulib/modules/crypto/hmac-sha1-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-hmac-sha1.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-hmac-sha1
+check_PROGRAMS += test-hmac-sha1
diff --git a/gnulib/modules/crypto/md2 b/gnulib/modules/crypto/md2
new file mode 100644
index 00000000..322e94eb
--- /dev/null
+++ b/gnulib/modules/crypto/md2
@@ -0,0 +1,24 @@
+Description:
+Compute MD2 checksum.
+
+Files:
+lib/md2.h
+lib/md2.c
+m4/md2.m4
+
+Depends-on:
+minmax
+
+configure.ac:
+gl_MD2
+
+Makefile.am:
+
+Include:
+"md2.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/md2-tests b/gnulib/modules/crypto/md2-tests
new file mode 100644
index 00000000..2beed874
--- /dev/null
+++ b/gnulib/modules/crypto/md2-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-md2.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-md2
+check_PROGRAMS += test-md2
diff --git a/gnulib/modules/crypto/md4 b/gnulib/modules/crypto/md4
new file mode 100644
index 00000000..03ad58fe
--- /dev/null
+++ b/gnulib/modules/crypto/md4
@@ -0,0 +1,24 @@
+Description:
+Compute MD4 checksum.
+
+Files:
+lib/md4.h
+lib/md4.c
+m4/md4.m4
+
+Depends-on:
+stdint
+
+configure.ac:
+gl_MD4
+
+Makefile.am:
+
+Include:
+"md4.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/md4-tests b/gnulib/modules/crypto/md4-tests
new file mode 100644
index 00000000..b4b851e8
--- /dev/null
+++ b/gnulib/modules/crypto/md4-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-md4.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-md4
+check_PROGRAMS += test-md4
diff --git a/gnulib/modules/crypto/md5 b/gnulib/modules/crypto/md5
new file mode 100644
index 00000000..7e529e75
--- /dev/null
+++ b/gnulib/modules/crypto/md5
@@ -0,0 +1,24 @@
+Description:
+Compute MD5 checksum.
+
+Files:
+lib/md5.h
+lib/md5.c
+m4/md5.m4
+
+Depends-on:
+stdint
+
+configure.ac:
+gl_MD5
+
+Makefile.am:
+
+Include:
+"md5.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/crypto/md5-tests b/gnulib/modules/crypto/md5-tests
new file mode 100644
index 00000000..94bc3e44
--- /dev/null
+++ b/gnulib/modules/crypto/md5-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-md5.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-md5
+check_PROGRAMS += test-md5
diff --git a/gnulib/modules/crypto/rijndael b/gnulib/modules/crypto/rijndael
new file mode 100644
index 00000000..db9a6dfa
--- /dev/null
+++ b/gnulib/modules/crypto/rijndael
@@ -0,0 +1,27 @@
+Description:
+Rijndael block cipher.
+
+Files:
+lib/rijndael-alg-fst.c
+lib/rijndael-alg-fst.h
+lib/rijndael-api-fst.c
+lib/rijndael-api-fst.h
+m4/rijndael.m4
+
+Depends-on:
+stdint
+
+configure.ac:
+gl_RIJNDAEL
+
+Makefile.am:
+
+Include:
+"rijndael-alg-fst.h"
+"rijndael-api-fst.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/crypto/rijndael-tests b/gnulib/modules/crypto/rijndael-tests
new file mode 100644
index 00000000..cbf861f8
--- /dev/null
+++ b/gnulib/modules/crypto/rijndael-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-rijndael.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-rijndael
+check_PROGRAMS += test-rijndael
diff --git a/gnulib/modules/crypto/sha1 b/gnulib/modules/crypto/sha1
new file mode 100644
index 00000000..411cf3bb
--- /dev/null
+++ b/gnulib/modules/crypto/sha1
@@ -0,0 +1,24 @@
+Description:
+Compute SHA1 checksum.
+
+Files:
+lib/sha1.h
+lib/sha1.c
+m4/sha1.m4
+
+Depends-on:
+stdint
+
+configure.ac:
+gl_SHA1
+
+Makefile.am:
+
+Include:
+"sha1.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/crypto/sha1-tests b/gnulib/modules/crypto/sha1-tests
new file mode 100644
index 00000000..6da04d6c
--- /dev/null
+++ b/gnulib/modules/crypto/sha1-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sha1.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sha1
+check_PROGRAMS += test-sha1
diff --git a/gnulib/modules/crypto/sha256 b/gnulib/modules/crypto/sha256
new file mode 100644
index 00000000..3d70c4aa
--- /dev/null
+++ b/gnulib/modules/crypto/sha256
@@ -0,0 +1,24 @@
+Description:
+Compute SHA224 and SHA256 checksums.
+
+Files:
+lib/sha256.h
+lib/sha256.c
+m4/sha256.m4
+
+Depends-on:
+stdint
+
+configure.ac:
+gl_SHA256
+
+Makefile.am:
+
+Include:
+"sha256.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/crypto/sha512 b/gnulib/modules/crypto/sha512
new file mode 100644
index 00000000..ca17e1a2
--- /dev/null
+++ b/gnulib/modules/crypto/sha512
@@ -0,0 +1,25 @@
+Description:
+Compute SHA384 and SHA512 checksums.
+
+Files:
+lib/sha512.h
+lib/sha512.c
+m4/sha512.m4
+
+Depends-on:
+stdint
+u64
+
+configure.ac:
+gl_SHA512
+
+Makefile.am:
+
+Include:
+"sha512.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/csharpcomp b/gnulib/modules/csharpcomp
new file mode 100644
index 00000000..3b3ee908
--- /dev/null
+++ b/gnulib/modules/csharpcomp
@@ -0,0 +1,34 @@
+Description:
+Compile a C# program.
+
+Files:
+lib/csharpcomp.h
+lib/csharpcomp.c
+
+Depends-on:
+stdbool
+xmalloca
+execute
+pipe
+wait-process
+getline
+sh-quote
+safe-read
+error
+gettext-h
+memcmp
+csharpcomp-script
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += csharpcomp.h csharpcomp.c
+
+Include:
+"csharpcomp.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/csharpcomp-script b/gnulib/modules/csharpcomp-script
new file mode 100644
index 00000000..ae804fe8
--- /dev/null
+++ b/gnulib/modules/csharpcomp-script
@@ -0,0 +1,21 @@
+Description:
+Script to compile a C# program.
+
+Files:
+build-aux/csharpcomp.sh.in
+m4/csharpcomp.m4
+m4/csharp.m4
+
+Depends-on:
+
+configure.ac:
+AC_REQUIRE([gt_CSHARPCOMP])
+AC_CONFIG_FILES([csharpcomp.sh:build-aux/csharpcomp.sh.in])
+
+Makefile.am:
+
+License:
+GPLed build tool
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/csharpexec b/gnulib/modules/csharpexec
new file mode 100644
index 00000000..69e0c70f
--- /dev/null
+++ b/gnulib/modules/csharpexec
@@ -0,0 +1,34 @@
+Description:
+Execute a C# program.
+
+Files:
+lib/csharpexec.h
+lib/csharpexec.c
+lib/classpath.h
+lib/classpath.c
+
+Depends-on:
+stdbool
+execute
+xsetenv
+sh-quote
+xalloc
+xmalloca
+error
+gettext-h
+csharpexec-script
+
+configure.ac:
+
+Makefile.am:
+DEFS += -DEXEEXT=\"@EXEEXT@\"
+lib_SOURCES += csharpexec.h csharpexec.c
+
+Include:
+"csharpexec.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/csharpexec-script b/gnulib/modules/csharpexec-script
new file mode 100644
index 00000000..f34e8b3d
--- /dev/null
+++ b/gnulib/modules/csharpexec-script
@@ -0,0 +1,23 @@
+Description:
+Script to execute a C# program.
+
+Files:
+build-aux/csharpexec.sh.in
+m4/csharpexec.m4
+m4/csharp.m4
+
+Depends-on:
+
+configure.ac:
+# You need to invoke gt_CSHARPEXEC yourself, possibly with arguments.
+AC_CONFIG_FILES([csharpexec.sh:build-aux/csharpexec.sh.in])
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/ctype b/gnulib/modules/ctype
new file mode 100644
index 00000000..2cd1fb0c
--- /dev/null
+++ b/gnulib/modules/ctype
@@ -0,0 +1,41 @@
+Description:
+A <ctype.h> that conforms to C99.
+
+Files:
+lib/ctype.in.h
+m4/ctype.m4
+
+Depends-on:
+include_next
+warn-on-use
+
+configure.ac:
+gl_CTYPE_H
+
+Makefile.am:
+BUILT_SOURCES += ctype.h
+
+# We need the following in order to create <ctype.h> when the system
+# doesn't have one that works with the given compiler.
+ctype.h: ctype.in.h $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_CTYPE_H''@|$(NEXT_CTYPE_H)|g' \
+ -e 's/@''GNULIB_ISBLANK''@/$(GNULIB_ISBLANK)/g' \
+ -e 's/@''HAVE_ISBLANK''@/$(HAVE_ISBLANK)/g' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/ctype.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += ctype.h ctype.h-t
+
+Include:
+<ctype.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/ctype-tests b/gnulib/modules/ctype-tests
new file mode 100644
index 00000000..4b9f4af8
--- /dev/null
+++ b/gnulib/modules/ctype-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-ctype.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype
+check_PROGRAMS += test-ctype
diff --git a/gnulib/modules/cycle-check b/gnulib/modules/cycle-check
new file mode 100644
index 00000000..fe0e416b
--- /dev/null
+++ b/gnulib/modules/cycle-check
@@ -0,0 +1,27 @@
+Description:
+help detect directory cycles efficiently
+
+Files:
+lib/cycle-check.c
+lib/cycle-check.h
+m4/cycle-check.m4
+
+Depends-on:
+dev-ino
+same-inode
+stdbool
+stdint
+
+configure.ac:
+gl_CYCLE_CHECK
+
+Makefile.am:
+
+Include:
+"cycle-check.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/d-ino b/gnulib/modules/d-ino
new file mode 100644
index 00000000..a83f3d98
--- /dev/null
+++ b/gnulib/modules/d-ino
@@ -0,0 +1,20 @@
+Description:
+Check whether struct dirent has a member named d_ino.
+
+Files:
+m4/d-ino.m4
+
+Depends-on:
+
+configure.ac:
+gl_CHECK_TYPE_STRUCT_DIRENT_D_INO
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/d-type b/gnulib/modules/d-type
new file mode 100644
index 00000000..c60c2f8f
--- /dev/null
+++ b/gnulib/modules/d-type
@@ -0,0 +1,20 @@
+Description:
+Check whether struct dirent has a member named d_type.
+
+Files:
+m4/d-type.m4
+
+Depends-on:
+
+configure.ac:
+gl_CHECK_TYPE_STRUCT_DIRENT_D_TYPE
+
+Makefile.am:
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/dev-ino b/gnulib/modules/dev-ino
new file mode 100644
index 00000000..517a5a47
--- /dev/null
+++ b/gnulib/modules/dev-ino
@@ -0,0 +1,20 @@
+Description:
+declare a simple (device, inode) struct
+
+Files:
+lib/dev-ino.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"dev-ino.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/diacrit b/gnulib/modules/diacrit
new file mode 100644
index 00000000..725d683f
--- /dev/null
+++ b/gnulib/modules/diacrit
@@ -0,0 +1,23 @@
+Description:
+Decomposition of composed ISO-8859-1 characters.
+
+Files:
+lib/diacrit.h
+lib/diacrit.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += diacrit.h diacrit.c
+
+Include:
+"diacrit.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/diffseq b/gnulib/modules/diffseq
new file mode 100644
index 00000000..ce16bdf4
--- /dev/null
+++ b/gnulib/modules/diffseq
@@ -0,0 +1,21 @@
+Description:
+Compute the difference between two sequences.
+
+Files:
+lib/diffseq.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += diffseq.h
+
+Include:
+"diffseq.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Bruno Haible
diff --git a/gnulib/modules/dirent b/gnulib/modules/dirent
new file mode 100644
index 00000000..0e75c7b4
--- /dev/null
+++ b/gnulib/modules/dirent
@@ -0,0 +1,53 @@
+Description:
+A GNU-like <dirent.h>.
+
+Files:
+lib/dirent.in.h
+m4/dirent_h.m4
+m4/unistd_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+warn-on-use
+
+configure.ac:
+gl_DIRENT_H
+
+Makefile.am:
+BUILT_SOURCES += dirent.h
+
+# We need the following in order to create <dirent.h> when the system
+# doesn't have one that works with the given compiler.
+dirent.h: dirent.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \
+ -e 's|@''GNULIB_DIRFD''@|$(GNULIB_DIRFD)|g' \
+ -e 's|@''GNULIB_FDOPENDIR''@|$(GNULIB_FDOPENDIR)|g' \
+ -e 's|@''GNULIB_SCANDIR''@|$(GNULIB_SCANDIR)|g' \
+ -e 's|@''GNULIB_ALPHASORT''@|$(GNULIB_ALPHASORT)|g' \
+ -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \
+ -e 's|@''HAVE_FDOPENDIR''@|$(HAVE_FDOPENDIR)|g' \
+ -e 's|@''HAVE_SCANDIR''@|$(HAVE_SCANDIR)|g' \
+ -e 's|@''HAVE_ALPHASORT''@|$(HAVE_ALPHASORT)|g' \
+ -e 's|@''REPLACE_CLOSEDIR''@|$(REPLACE_CLOSEDIR)|g' \
+ -e 's|@''REPLACE_FDOPENDIR''@|$(REPLACE_FDOPENDIR)|g' \
+ -e 's|@''REPLACE_OPENDIR''@|$(REPLACE_OPENDIR)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/dirent.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += dirent.h dirent.h-t
+
+Include:
+<dirent.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/dirent-safer b/gnulib/modules/dirent-safer
new file mode 100644
index 00000000..47db18ef
--- /dev/null
+++ b/gnulib/modules/dirent-safer
@@ -0,0 +1,28 @@
+Description:
+Directory functions that avoid clobbering STD{IN,OUT,ERR}_FILENO.
+
+Files:
+lib/dirent--.h
+lib/dirent-safer.h
+lib/opendir-safer.c
+m4/dirent-safer.m4
+
+Depends-on:
+dirent
+dirfd
+unistd-safer
+
+configure.ac:
+gl_DIRENT_SAFER
+gl_MODULE_INDICATOR([dirent-safer])
+
+Makefile.am:
+
+Include:
+"dirent-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/dirent-safer-tests b/gnulib/modules/dirent-safer-tests
new file mode 100644
index 00000000..2bc95933
--- /dev/null
+++ b/gnulib/modules/dirent-safer-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-dirent-safer.c
+tests/macros.h
+
+Depends-on:
+dup2
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-dirent-safer
+check_PROGRAMS += test-dirent-safer
diff --git a/gnulib/modules/dirent-tests b/gnulib/modules/dirent-tests
new file mode 100644
index 00000000..2511f5f6
--- /dev/null
+++ b/gnulib/modules/dirent-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-dirent.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-dirent
+check_PROGRAMS += test-dirent
diff --git a/gnulib/modules/dirfd b/gnulib/modules/dirfd
new file mode 100644
index 00000000..42ff4d7a
--- /dev/null
+++ b/gnulib/modules/dirfd
@@ -0,0 +1,26 @@
+Description:
+Retrieving the file descriptor of an open directory stream. (Unportable.)
+
+Files:
+lib/dirfd.c
+m4/dirfd.m4
+
+Depends-on:
+dirent
+errno
+extensions
+
+configure.ac:
+gl_FUNC_DIRFD
+gl_DIRENT_MODULE_INDICATOR([dirfd])
+
+Makefile.am:
+
+Include:
+<dirent.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/dirname b/gnulib/modules/dirname
new file mode 100644
index 00000000..888c8bad
--- /dev/null
+++ b/gnulib/modules/dirname
@@ -0,0 +1,27 @@
+Description:
+Extract specific portions of filenames.
+
+Files:
+lib/dirname.c
+lib/basename.c
+lib/stripslash.c
+
+Depends-on:
+dirname-lgpl
+xalloc
+xstrndup
+
+configure.ac:
+gl_DIRNAME
+gl_MODULE_INDICATOR([dirname])
+
+Makefile.am:
+
+Include:
+"dirname.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/dirname-lgpl b/gnulib/modules/dirname-lgpl
new file mode 100644
index 00000000..38f779ab
--- /dev/null
+++ b/gnulib/modules/dirname-lgpl
@@ -0,0 +1,29 @@
+Description:
+Extract specific portions of filenames.
+
+Files:
+lib/dirname.h
+lib/dirname-lgpl.c
+lib/basename-lgpl.c
+lib/stripslash.c
+m4/dirname.m4
+m4/dos.m4
+
+Depends-on:
+double-slash-root
+malloc-posix
+stdbool
+
+configure.ac:
+gl_DIRNAME_LGPL
+
+Makefile.am:
+
+Include:
+"dirname.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/dirname-tests b/gnulib/modules/dirname-tests
new file mode 100644
index 00000000..49eeb596
--- /dev/null
+++ b/gnulib/modules/dirname-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-dirname.c
+
+Depends-on:
+progname
+strdup
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-dirname
+check_PROGRAMS += test-dirname
+test_dirname_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/do-release-commit-and-tag b/gnulib/modules/do-release-commit-and-tag
new file mode 100644
index 00000000..e2f80a58
--- /dev/null
+++ b/gnulib/modules/do-release-commit-and-tag
@@ -0,0 +1,19 @@
+Description:
+Automate the release-commit and tag process.
+
+Files:
+build-aux/do-release-commit-and-tag
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+coreutils
diff --git a/gnulib/modules/double-slash-root b/gnulib/modules/double-slash-root
new file mode 100644
index 00000000..af78f268
--- /dev/null
+++ b/gnulib/modules/double-slash-root
@@ -0,0 +1,20 @@
+Description:
+Check whether // is distinct from /.
+
+Files:
+m4/double-slash-root.m4
+
+Depends-on:
+
+configure.ac:
+gl_DOUBLE_SLASH_ROOT
+
+Makefile.am:
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake, Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/dprintf b/gnulib/modules/dprintf
new file mode 100644
index 00000000..6ebbde4c
--- /dev/null
+++ b/gnulib/modules/dprintf
@@ -0,0 +1,28 @@
+Description:
+dprintf() function: print formatted output to a file descriptor
+
+Files:
+lib/dprintf.c
+m4/dprintf.m4
+
+Depends-on:
+stdio
+vasnprintf
+full-write
+errno
+
+configure.ac:
+gl_FUNC_DPRINTF
+gl_STDIO_MODULE_INDICATOR([dprintf])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/dprintf-posix b/gnulib/modules/dprintf-posix
new file mode 100644
index 00000000..1f4b85c1
--- /dev/null
+++ b/gnulib/modules/dprintf-posix
@@ -0,0 +1,37 @@
+Description:
+POSIX compatible dprintf() function: print formatted output to a file
+descriptor
+
+Files:
+m4/dprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+dprintf
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+multiarch
+
+configure.ac:
+gl_FUNC_DPRINTF_POSIX
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/dprintf-posix-tests b/gnulib/modules/dprintf-posix-tests
new file mode 100644
index 00000000..a60f8eda
--- /dev/null
+++ b/gnulib/modules/dprintf-posix-tests
@@ -0,0 +1,18 @@
+Files:
+tests/test-dprintf-posix.sh
+tests/test-dprintf-posix.c
+tests/test-printf-posix.output
+tests/test-dprintf-posix2.sh
+tests/test-dprintf-posix2.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
+
+Makefile.am:
+TESTS += test-dprintf-posix.sh test-dprintf-posix2.sh
+check_PROGRAMS += test-dprintf-posix test-dprintf-posix2
diff --git a/gnulib/modules/dummy b/gnulib/modules/dummy
new file mode 100644
index 00000000..14e87487
--- /dev/null
+++ b/gnulib/modules/dummy
@@ -0,0 +1,20 @@
+Description:
+A dummy file, to make sure the library is non-empty.
+
+Files:
+lib/dummy.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += dummy.c
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/dup2 b/gnulib/modules/dup2
new file mode 100644
index 00000000..cea1a974
--- /dev/null
+++ b/gnulib/modules/dup2
@@ -0,0 +1,24 @@
+Description:
+dup2() function: duplicate an open file descriptor.
+
+Files:
+lib/dup2.c
+m4/dup2.m4
+
+Depends-on:
+unistd
+
+configure.ac:
+gl_FUNC_DUP2
+gl_UNISTD_MODULE_INDICATOR([dup2])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/dup2-tests b/gnulib/modules/dup2-tests
new file mode 100644
index 00000000..a973fd75
--- /dev/null
+++ b/gnulib/modules/dup2-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-dup2.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+binary-io
+open
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-dup2
+check_PROGRAMS += test-dup2
diff --git a/gnulib/modules/dup3 b/gnulib/modules/dup3
new file mode 100644
index 00000000..e1300c6e
--- /dev/null
+++ b/gnulib/modules/dup3
@@ -0,0 +1,30 @@
+Description:
+dup3() function: copy a file descriptor, applying specific flags.
+
+Files:
+lib/dup3.c
+m4/dup3.m4
+
+Depends-on:
+unistd
+fcntl
+binary-io
+getdtablesize
+extensions
+
+configure.ac:
+gl_FUNC_DUP3
+gl_MODULE_INDICATOR([dup3])
+gl_UNISTD_MODULE_INDICATOR([dup3])
+
+Makefile.am:
+lib_SOURCES += dup3.c
+
+Include:
+<unistd.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Jim Meyering
diff --git a/gnulib/modules/dup3-tests b/gnulib/modules/dup3-tests
new file mode 100644
index 00000000..26dd5d89
--- /dev/null
+++ b/gnulib/modules/dup3-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-dup3.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+open
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-dup3
+check_PROGRAMS += test-dup3
diff --git a/gnulib/modules/duplocale b/gnulib/modules/duplocale
new file mode 100644
index 00000000..00852fd5
--- /dev/null
+++ b/gnulib/modules/duplocale
@@ -0,0 +1,24 @@
+Description:
+duplocale() function: duplicate a locale object.
+
+Files:
+lib/duplocale.c
+m4/duplocale.m4
+
+Depends-on:
+locale
+
+configure.ac:
+gl_FUNC_DUPLOCALE
+gl_LOCALE_MODULE_INDICATOR([duplocale])
+
+Makefile.am:
+
+Include:
+<locale.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/duplocale-tests b/gnulib/modules/duplocale-tests
new file mode 100644
index 00000000..af9dc988
--- /dev/null
+++ b/gnulib/modules/duplocale-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-duplocale.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([duplocale])
+
+Makefile.am:
+TESTS += test-duplocale
+check_PROGRAMS += test-duplocale
diff --git a/gnulib/modules/eealloc b/gnulib/modules/eealloc
new file mode 100644
index 00000000..437cb4dd
--- /dev/null
+++ b/gnulib/modules/eealloc
@@ -0,0 +1,22 @@
+Description:
+Memory allocation with expensive empty allocations (glibc compatible).
+
+Files:
+lib/eealloc.h
+m4/eealloc.m4
+
+Depends-on:
+
+configure.ac:
+gl_EEALLOC
+
+Makefile.am:
+
+Include:
+<eealloc.h>
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/elisp-comp b/gnulib/modules/elisp-comp
new file mode 100644
index 00000000..4713e8de
--- /dev/null
+++ b/gnulib/modules/elisp-comp
@@ -0,0 +1,19 @@
+Description:
+Compile Emacs Lisp files.
+
+Files:
+build-aux/elisp-comp
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Alexandre Duret-Lutz
diff --git a/gnulib/modules/environ b/gnulib/modules/environ
new file mode 100644
index 00000000..6bd5e97f
--- /dev/null
+++ b/gnulib/modules/environ
@@ -0,0 +1,25 @@
+Description:
+environ variable: storage of environment variables.
+
+Files:
+m4/environ.m4
+
+Depends-on:
+unistd
+extensions
+
+configure.ac:
+gl_ENVIRON
+gl_UNISTD_MODULE_INDICATOR([environ])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/environ-tests b/gnulib/modules/environ-tests
new file mode 100644
index 00000000..c4fe0fd1
--- /dev/null
+++ b/gnulib/modules/environ-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-environ.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-environ
+check_PROGRAMS += test-environ
+
diff --git a/gnulib/modules/erf b/gnulib/modules/erf
new file mode 100644
index 00000000..551dddb3
--- /dev/null
+++ b/gnulib/modules/erf
@@ -0,0 +1,24 @@
+Description:
+erf() function: error function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([erf])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ERF_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/erf-tests b/gnulib/modules/erf-tests
new file mode 100644
index 00000000..9881649b
--- /dev/null
+++ b/gnulib/modules/erf-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-erf.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-erf
+check_PROGRAMS += test-erf
+test_erf_LDADD = $(LDADD) @ERF_LIBM@
diff --git a/gnulib/modules/erfc b/gnulib/modules/erfc
new file mode 100644
index 00000000..d891e927
--- /dev/null
+++ b/gnulib/modules/erfc
@@ -0,0 +1,24 @@
+Description:
+erfc() function: complementary error function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([erfc])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ERFC_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/erfc-tests b/gnulib/modules/erfc-tests
new file mode 100644
index 00000000..08baf536
--- /dev/null
+++ b/gnulib/modules/erfc-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-erfc.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-erfc
+check_PROGRAMS += test-erfc
+test_erfc_LDADD = $(LDADD) @ERFC_LIBM@
diff --git a/gnulib/modules/errno b/gnulib/modules/errno
new file mode 100644
index 00000000..70fbd8f3
--- /dev/null
+++ b/gnulib/modules/errno
@@ -0,0 +1,44 @@
+Description:
+A POSIX-like <errno.h>.
+
+Files:
+lib/errno.in.h
+m4/errno_h.m4
+
+Depends-on:
+include_next
+
+configure.ac:
+gl_HEADER_ERRNO_H
+
+Makefile.am:
+BUILT_SOURCES += $(ERRNO_H)
+
+# We need the following in order to create <errno.h> when the system
+# doesn't have one that is POSIX compliant.
+errno.h: errno.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \
+ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \
+ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \
+ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \
+ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \
+ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \
+ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \
+ < $(srcdir)/errno.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += errno.h errno.h-t
+
+Include:
+<errno.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/errno-tests b/gnulib/modules/errno-tests
new file mode 100644
index 00000000..00ec12b8
--- /dev/null
+++ b/gnulib/modules/errno-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-errno.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-errno
+check_PROGRAMS += test-errno
+
diff --git a/gnulib/modules/error b/gnulib/modules/error
new file mode 100644
index 00000000..7d43aba1
--- /dev/null
+++ b/gnulib/modules/error
@@ -0,0 +1,33 @@
+Description:
+error and error_at_line functions: Error reporting.
+
+Notice:
+If you are using GNU gettext version 0.16.1 or older, add the following options
+to XGETTEXT_OPTIONS in your po/Makevars:
+ --flag=error:3:c-format --flag=error_at_line:5:c-format
+
+Files:
+lib/error.h
+lib/error.c
+m4/error.m4
+
+Depends-on:
+strerror
+unistd
+
+configure.ac:
+gl_ERROR
+m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--flag=error:3:c-format])
+ AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])])
+
+Makefile.am:
+
+Include:
+"error.h"
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/euidaccess b/gnulib/modules/euidaccess
new file mode 100644
index 00000000..bf329c64
--- /dev/null
+++ b/gnulib/modules/euidaccess
@@ -0,0 +1,31 @@
+Description:
+euidaccess() function: check effective user's permissions for a file.
+
+Files:
+lib/euidaccess.c
+m4/euidaccess.m4
+
+Depends-on:
+unistd
+extensions
+group-member
+stat
+sys_stat
+
+configure.ac:
+gl_FUNC_EUIDACCESS
+gl_UNISTD_MODULE_INDICATOR([euidaccess])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+Link:
+$(LIB_EACCESS)
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/exclude b/gnulib/modules/exclude
new file mode 100644
index 00000000..7ff3c140
--- /dev/null
+++ b/gnulib/modules/exclude
@@ -0,0 +1,30 @@
+Description:
+Manage list of filenames or wildcard patterns for --exclude option processing.
+
+Files:
+lib/exclude.h
+lib/exclude.c
+m4/exclude.m4
+
+Depends-on:
+fnmatch
+hash
+mbscasecmp
+mbuiter
+stdbool
+verify
+xalloc
+
+configure.ac:
+gl_EXCLUDE
+
+Makefile.am:
+
+Include:
+"exclude.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/exclude-tests b/gnulib/modules/exclude-tests
new file mode 100644
index 00000000..ba265edd
--- /dev/null
+++ b/gnulib/modules/exclude-tests
@@ -0,0 +1,27 @@
+Files:
+tests/test-exclude.c
+tests/test-exclude1.sh
+tests/test-exclude2.sh
+tests/test-exclude3.sh
+tests/test-exclude4.sh
+tests/test-exclude5.sh
+tests/test-exclude6.sh
+tests/test-exclude7.sh
+
+Depends-on:
+progname
+error
+argmatch
+
+Makefile.am:
+TESTS += \
+ test-exclude1.sh\
+ test-exclude2.sh\
+ test-exclude3.sh\
+ test-exclude4.sh\
+ test-exclude5.sh\
+ test-exclude6.sh\
+ test-exclude7.sh
+
+check_PROGRAMS += test-exclude
+test_exclude_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/execute b/gnulib/modules/execute
new file mode 100644
index 00000000..755e3e5b
--- /dev/null
+++ b/gnulib/modules/execute
@@ -0,0 +1,45 @@
+Description:
+Creation of autonomous subprocesses.
+
+Files:
+lib/execute.h
+lib/execute.c
+lib/w32spawn.h
+m4/execute.m4
+
+Depends-on:
+cloexec
+dup2
+error
+exit
+fatal-signal
+wait-process
+gettext-h
+spawn
+posix_spawnp
+posix_spawn_file_actions_init
+posix_spawn_file_actions_addopen
+posix_spawn_file_actions_destroy
+posix_spawnattr_init
+posix_spawnattr_setsigmask
+posix_spawnattr_setflags
+posix_spawnattr_destroy
+stdbool
+strpbrk
+unistd
+environ
+
+configure.ac:
+gl_EXECUTE
+
+Makefile.am:
+lib_SOURCES += execute.h execute.c w32spawn.h
+
+Include:
+"execute.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/exit b/gnulib/modules/exit
new file mode 100644
index 00000000..4de69b75
--- /dev/null
+++ b/gnulib/modules/exit
@@ -0,0 +1,21 @@
+Description:
+exit() function: program termination.
+
+Files:
+
+Depends-on:
+stdlib
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/exitfail b/gnulib/modules/exitfail
new file mode 100644
index 00000000..26f5a923
--- /dev/null
+++ b/gnulib/modules/exitfail
@@ -0,0 +1,24 @@
+Description:
+Set exit status for fatal signal.
+
+Files:
+lib/exitfail.h
+lib/exitfail.c
+m4/exitfail.m4
+
+Depends-on:
+exit
+
+configure.ac:
+gl_EXITFAIL
+
+Makefile.am:
+
+Include:
+"exitfail.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/exp b/gnulib/modules/exp
new file mode 100644
index 00000000..f90548a0
--- /dev/null
+++ b/gnulib/modules/exp
@@ -0,0 +1,24 @@
+Description:
+exp() function: exponential function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([exp])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(EXP_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/exp-tests b/gnulib/modules/exp-tests
new file mode 100644
index 00000000..13388611
--- /dev/null
+++ b/gnulib/modules/exp-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-exp.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-exp
+check_PROGRAMS += test-exp
+test_exp_LDADD = $(LDADD) @EXP_LIBM@
diff --git a/gnulib/modules/expl b/gnulib/modules/expl
new file mode 100644
index 00000000..3870440e
--- /dev/null
+++ b/gnulib/modules/expl
@@ -0,0 +1,30 @@
+Description:
+expl() function: exponential function with long double argument.
+
+Files:
+lib/expl.c
+m4/expl.m4
+
+Depends-on:
+math
+extensions
+float
+floorl
+
+configure.ac:
+gl_FUNC_EXPL
+gl_MATH_MODULE_INDICATOR([expl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(EXPL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/expl-tests b/gnulib/modules/expl-tests
new file mode 100644
index 00000000..bc7b28ae
--- /dev/null
+++ b/gnulib/modules/expl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-expl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-expl
+check_PROGRAMS += test-expl
+test_expl_LDADD = $(LDADD) @EXPL_LIBM@
diff --git a/gnulib/modules/extensions b/gnulib/modules/extensions
new file mode 100644
index 00000000..76e5a966
--- /dev/null
+++ b/gnulib/modules/extensions
@@ -0,0 +1,22 @@
+Description:
+Enable extensions in standard headers
+
+Files:
+m4/extensions.m4
+
+Depends-on:
+
+configure.ac-early:
+AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert and Jim Meyering
diff --git a/gnulib/modules/fabs b/gnulib/modules/fabs
new file mode 100644
index 00000000..8b70430e
--- /dev/null
+++ b/gnulib/modules/fabs
@@ -0,0 +1,24 @@
+Description:
+fabs() function: absolute value.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_MATHFUNC([fabs], [double], [(double)])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(FABS_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/fabs-tests b/gnulib/modules/fabs-tests
new file mode 100644
index 00000000..b7161591
--- /dev/null
+++ b/gnulib/modules/fabs-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-fabs.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fabs
+check_PROGRAMS += test-fabs
+test_fabs_LDADD = $(LDADD) @FABS_LIBM@
diff --git a/gnulib/modules/faccessat b/gnulib/modules/faccessat
new file mode 100644
index 00000000..92d81855
--- /dev/null
+++ b/gnulib/modules/faccessat
@@ -0,0 +1,33 @@
+Description:
+faccessat() function: check user's permissions for a file.
+
+Files:
+lib/faccessat.c
+m4/faccessat.m4
+
+Depends-on:
+euidaccess
+extensions
+fcntl-h
+openat
+unistd
+
+configure.ac:
+gl_FUNC_FACCESSAT
+gl_MODULE_INDICATOR([faccessat])
+gl_UNISTD_MODULE_INDICATOR([faccessat])
+
+Makefile.am:
+
+Include:
+<fcntl.h>
+<unistd.h>
+
+Link:
+$(LIB_EACCESS)
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/fatal-signal b/gnulib/modules/fatal-signal
new file mode 100644
index 00000000..296fbd30
--- /dev/null
+++ b/gnulib/modules/fatal-signal
@@ -0,0 +1,32 @@
+Description:
+Emergency actions in case of a fatal signal.
+
+Files:
+lib/fatal-signal.h
+lib/fatal-signal.c
+m4/fatal-signal.m4
+m4/sig_atomic_t.m4
+
+Depends-on:
+xalloc
+stdbool
+unistd
+sigaction
+sigprocmask
+raise
+
+configure.ac:
+gl_FATAL_SIGNAL
+
+Makefile.am:
+lib_SOURCES += fatal-signal.h fatal-signal.c
+
+Include:
+"fatal-signal.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fbufmode b/gnulib/modules/fbufmode
new file mode 100644
index 00000000..8fdb7a09
--- /dev/null
+++ b/gnulib/modules/fbufmode
@@ -0,0 +1,26 @@
+Description:
+fbufmode() function: Determine the buffering mode of a FILE stream.
+
+Files:
+lib/fbufmode.h
+lib/fbufmode.c
+lib/stdio-impl.h
+m4/fbufmode.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_FBUFMODE
+
+Makefile.am:
+lib_SOURCES += fbufmode.c
+
+Include:
+"fbufmode.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Eric Blake
+
diff --git a/gnulib/modules/fbufmode-tests b/gnulib/modules/fbufmode-tests
new file mode 100644
index 00000000..fa36a61b
--- /dev/null
+++ b/gnulib/modules/fbufmode-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-fbufmode.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fbufmode
+check_PROGRAMS += test-fbufmode
+MOSTLYCLEANFILES += t-fbufmode.tmp
diff --git a/gnulib/modules/fchdir b/gnulib/modules/fchdir
new file mode 100644
index 00000000..46b481fd
--- /dev/null
+++ b/gnulib/modules/fchdir
@@ -0,0 +1,38 @@
+Description:
+fchdir() function: change current directory, given an open file descriptor.
+
+Files:
+lib/fchdir.c
+m4/fchdir.m4
+
+Depends-on:
+close
+dirent
+dirfd
+dup2
+fcntl
+fcntl-h
+include_next
+malloc-posix
+open
+realloc-posix
+stat
+stdbool
+strdup-posix
+sys_stat
+unistd
+
+configure.ac:
+gl_FUNC_FCHDIR
+gl_UNISTD_MODULE_INDICATOR([fchdir])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/fchdir-tests b/gnulib/modules/fchdir-tests
new file mode 100644
index 00000000..462e7092
--- /dev/null
+++ b/gnulib/modules/fchdir-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-fchdir.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+getcwd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fchdir
+check_PROGRAMS += test-fchdir
diff --git a/gnulib/modules/fclose b/gnulib/modules/fclose
new file mode 100644
index 00000000..4f6f7869
--- /dev/null
+++ b/gnulib/modules/fclose
@@ -0,0 +1,26 @@
+Description:
+fclose() function: close a stream.
+
+Files:
+lib/fclose.c
+m4/fclose.m4
+
+Depends-on:
+stdio
+close
+
+configure.ac:
+gl_FUNC_FCLOSE
+gl_STDIO_MODULE_INDICATOR([fclose])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fcntl b/gnulib/modules/fcntl
new file mode 100644
index 00000000..addd6ba1
--- /dev/null
+++ b/gnulib/modules/fcntl
@@ -0,0 +1,27 @@
+Description:
+Support for fcntl() action F_DUPFD, F_DUPFD_CLOEXEC, F_GETFD.
+
+Files:
+m4/fcntl.m4
+lib/fcntl.c
+
+Depends-on:
+dup2
+fcntl-h
+getdtablesize
+extensions
+
+configure.ac:
+gl_FUNC_FCNTL
+gl_FCNTL_MODULE_INDICATOR([fcntl])
+
+Makefile.am:
+
+Include:
+<fcntl.h>
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/fcntl-h b/gnulib/modules/fcntl-h
new file mode 100644
index 00000000..e25c155e
--- /dev/null
+++ b/gnulib/modules/fcntl-h
@@ -0,0 +1,52 @@
+Description:
+Like <fcntl.h>, but with non-working flags defined to 0.
+
+Files:
+lib/fcntl.in.h
+m4/fcntl_h.m4
+m4/fcntl-o.m4
+
+Depends-on:
+arg-nonnull
+extensions
+include_next
+unistd
+warn-on-use
+
+configure.ac:
+gl_FCNTL_H
+
+Makefile.am:
+BUILT_SOURCES += fcntl.h
+
+# We need the following in order to create <fcntl.h> when the system
+# doesn't have one that works with the given compiler.
+fcntl.h: fcntl.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
+ -e 's|@''GNULIB_FCNTL''@|$(GNULIB_FCNTL)|g' \
+ -e 's|@''GNULIB_OPEN''@|$(GNULIB_OPEN)|g' \
+ -e 's|@''GNULIB_OPENAT''@|$(GNULIB_OPENAT)|g' \
+ -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
+ -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
+ -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \
+ -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \
+ -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/fcntl.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += fcntl.h fcntl.h-t
+
+Include:
+<fcntl.h>
+
+License:
+LGPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/fcntl-h-tests b/gnulib/modules/fcntl-h-tests
new file mode 100644
index 00000000..94d87bc2
--- /dev/null
+++ b/gnulib/modules/fcntl-h-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-fcntl-h.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fcntl-h
+check_PROGRAMS += test-fcntl-h
diff --git a/gnulib/modules/fcntl-safer b/gnulib/modules/fcntl-safer
new file mode 100644
index 00000000..918223e8
--- /dev/null
+++ b/gnulib/modules/fcntl-safer
@@ -0,0 +1,30 @@
+Description:
+File descriptor functions that avoid clobbering STD{IN,OUT,ERR}_FILENO.
+
+Files:
+lib/fcntl--.h
+lib/creat-safer.c
+lib/fcntl-safer.h
+lib/open-safer.c
+m4/fcntl-safer.m4
+m4/mode_t.m4
+
+Depends-on:
+fcntl-h
+open
+unistd-safer
+
+configure.ac:
+gl_FCNTL_SAFER
+gl_MODULE_INDICATOR([fcntl-safer])
+
+Makefile.am:
+
+Include:
+"fcntl-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/fcntl-safer-tests b/gnulib/modules/fcntl-safer-tests
new file mode 100644
index 00000000..cb35aed2
--- /dev/null
+++ b/gnulib/modules/fcntl-safer-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-open.h
+tests/test-fcntl-safer.c
+tests/macros.h
+
+Depends-on:
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fcntl-safer
+check_PROGRAMS += test-fcntl-safer
diff --git a/gnulib/modules/fcntl-tests b/gnulib/modules/fcntl-tests
new file mode 100644
index 00000000..44b040c2
--- /dev/null
+++ b/gnulib/modules/fcntl-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-fcntl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+binary-io
+getdtablesize
+stdbool
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fcntl
+check_PROGRAMS += test-fcntl
diff --git a/gnulib/modules/fd-safer-flag b/gnulib/modules/fd-safer-flag
new file mode 100644
index 00000000..0a2df83b
--- /dev/null
+++ b/gnulib/modules/fd-safer-flag
@@ -0,0 +1,27 @@
+Description:
+fd_safer_flag() function: adjust a file descriptor result so that it avoids
+clobbering STD{IN,OUT,ERR}_FILENO, with specific flags.
+
+Files:
+lib/fd-safer-flag.c
+lib/dup-safer-flag.c
+
+Depends-on:
+cloexec
+fcntl
+unistd-safer
+
+configure.ac:
+gl_MODULE_INDICATOR([fd-safer-flag])
+
+Makefile.am:
+lib_SOURCES += fd-safer-flag.c dup-safer-flag.c
+
+Include:
+"unistd-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/fdl b/gnulib/modules/fdl
new file mode 100644
index 00000000..6d6f8599
--- /dev/null
+++ b/gnulib/modules/fdl
@@ -0,0 +1,19 @@
+Description:
+Provide the GNU Free Documentation License in Texinfo format.
+
+Files:
+doc/fdl.texi
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unmodifiable license text
+
+Maintainer:
+all
diff --git a/gnulib/modules/fdl-1.3 b/gnulib/modules/fdl-1.3
new file mode 100644
index 00000000..c4d1dd6a
--- /dev/null
+++ b/gnulib/modules/fdl-1.3
@@ -0,0 +1,19 @@
+Description:
+Provide the GNU Free Documentation License version 1.3 in Texinfo format.
+
+Files:
+doc/fdl-1.3.texi
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unmodifiable license text
+
+Maintainer:
+all
diff --git a/gnulib/modules/fdopendir b/gnulib/modules/fdopendir
new file mode 100644
index 00000000..83c2af7d
--- /dev/null
+++ b/gnulib/modules/fdopendir
@@ -0,0 +1,31 @@
+Description:
+Open a directory stream from a file descriptor.
+
+Files:
+lib/fdopendir.c
+lib/openat-priv.h
+lib/openat-proc.c
+m4/fdopendir.m4
+
+Depends-on:
+dirent
+errno
+extensions
+fchdir
+openat-die
+save-cwd
+
+configure.ac:
+gl_FUNC_FDOPENDIR
+gl_DIRENT_MODULE_INDICATOR([fdopendir])
+
+Makefile.am:
+
+Include:
+<dirent.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/fdopendir-tests b/gnulib/modules/fdopendir-tests
new file mode 100644
index 00000000..bee2df7d
--- /dev/null
+++ b/gnulib/modules/fdopendir-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-fdopendir.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+open
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fdopendir
+check_PROGRAMS += test-fdopendir
+test_fdopendir_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/fdutimensat b/gnulib/modules/fdutimensat
new file mode 100644
index 00000000..66d5b4b6
--- /dev/null
+++ b/gnulib/modules/fdutimensat
@@ -0,0 +1,30 @@
+Description:
+Set file access and modification times, relative to a directory.
+
+Files:
+lib/fdutimensat.c
+lib/utimens.h
+
+Depends-on:
+futimens
+utimensat
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE]) dnl because 'inline' is used in lib/utimens.h
+gl_MODULE_INDICATOR([fdutimensat])
+
+Makefile.am:
+lib_SOURCES += fdutimensat.c
+
+Include:
+<fcntl.h>
+"utimens.h"
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering, Eric Blake
diff --git a/gnulib/modules/fdutimensat-tests b/gnulib/modules/fdutimensat-tests
new file mode 100644
index 00000000..48ea78d2
--- /dev/null
+++ b/gnulib/modules/fdutimensat-tests
@@ -0,0 +1,22 @@
+Files:
+tests/nap.h
+tests/test-futimens.h
+tests/test-lutimens.h
+tests/test-utimens.h
+tests/test-utimens-common.h
+tests/test-fdutimensat.c
+tests/macros.h
+
+Depends-on:
+ignore-value
+progname
+timespec
+usleep
+utimecmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fdutimensat
+check_PROGRAMS += test-fdutimensat
+test_fdutimensat_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBINTL@
diff --git a/gnulib/modules/fflush b/gnulib/modules/fflush
new file mode 100644
index 00000000..a8a151e9
--- /dev/null
+++ b/gnulib/modules/fflush
@@ -0,0 +1,34 @@
+Description:
+Discard pending data on both input and output streams.
+
+Files:
+lib/fflush.c
+lib/stdio-impl.h
+m4/fflush.m4
+
+Depends-on:
+fpurge
+ftello
+freading
+lseek
+stdio
+unistd
+fseeko
+
+configure.ac-early:
+AC_REQUIRE([AC_FUNC_FSEEKO])
+
+configure.ac:
+gl_FUNC_FFLUSH
+gl_STDIO_MODULE_INDICATOR([fflush])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/fflush-tests b/gnulib/modules/fflush-tests
new file mode 100644
index 00000000..a447521f
--- /dev/null
+++ b/gnulib/modules/fflush-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-fflush.c
+tests/test-fflush2.sh
+tests/test-fflush2.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+binary-io
+fseeko
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fflush test-fflush2.sh
+check_PROGRAMS += test-fflush test-fflush2
+MOSTLYCLEANFILES += test-fflush.txt
diff --git a/gnulib/modules/file-set b/gnulib/modules/file-set
new file mode 100644
index 00000000..7895cdac
--- /dev/null
+++ b/gnulib/modules/file-set
@@ -0,0 +1,27 @@
+Description:
+Very specialized set-of-files code.
+
+Files:
+lib/file-set.c
+lib/file-set.h
+
+Depends-on:
+hash
+hash-triple
+stdbool
+xalloc
+xalloc-die
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += file-set.c
+
+Include:
+"file-set.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/file-type b/gnulib/modules/file-type
new file mode 100644
index 00000000..806c60d3
--- /dev/null
+++ b/gnulib/modules/file-type
@@ -0,0 +1,25 @@
+Description:
+Return a string describing the type of a file.
+
+Files:
+lib/file-type.h
+lib/file-type.c
+m4/file-type.m4
+
+Depends-on:
+gettext-h
+sys_stat
+
+configure.ac:
+gl_FILE_TYPE
+
+Makefile.am:
+
+Include:
+"file-type.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/fileblocks b/gnulib/modules/fileblocks
new file mode 100644
index 00000000..e919301e
--- /dev/null
+++ b/gnulib/modules/fileblocks
@@ -0,0 +1,22 @@
+Description:
+Estimate number of blocks of a file, if 'struct stat' doesn't have st_blocks.
+
+Files:
+lib/fileblocks.c
+m4/fileblocks.m4
+
+Depends-on:
+
+configure.ac:
+gl_FILEBLOCKS
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/filemode b/gnulib/modules/filemode
new file mode 100644
index 00000000..c09120c0
--- /dev/null
+++ b/gnulib/modules/filemode
@@ -0,0 +1,26 @@
+Description:
+Return a string (?rwxrwxrwx format) describing the type and permissions of a
+file.
+
+Files:
+lib/filemode.h
+lib/filemode.c
+m4/filemode.m4
+m4/st_dm_mode.m4
+
+Depends-on:
+sys_stat
+
+configure.ac:
+gl_FILEMODE
+
+Makefile.am:
+
+Include:
+"filemode.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/filename b/gnulib/modules/filename
new file mode 100644
index 00000000..0f7607fa
--- /dev/null
+++ b/gnulib/modules/filename
@@ -0,0 +1,21 @@
+Description:
+Basic filename support macros.
+
+Files:
+lib/filename.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"filename.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/filenamecat b/gnulib/modules/filenamecat
new file mode 100644
index 00000000..df90c2fb
--- /dev/null
+++ b/gnulib/modules/filenamecat
@@ -0,0 +1,26 @@
+Description:
+Concatenate two arbitrary file names.
+
+Files:
+lib/filenamecat.c
+m4/filenamecat.m4
+
+Depends-on:
+dirname-lgpl
+filenamecat-lgpl
+xalloc
+
+configure.ac:
+gl_FILE_NAME_CONCAT
+gl_MODULE_INDICATOR([filenamecat])
+
+Makefile.am:
+
+Include:
+"filenamecat.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/filenamecat-lgpl b/gnulib/modules/filenamecat-lgpl
new file mode 100644
index 00000000..a7449334
--- /dev/null
+++ b/gnulib/modules/filenamecat-lgpl
@@ -0,0 +1,24 @@
+Description:
+Concatenate two arbitrary file names.
+
+Files:
+lib/filenamecat.h
+lib/filenamecat-lgpl.c
+m4/filenamecat.m4
+
+Depends-on:
+dirname-lgpl
+
+configure.ac:
+gl_FILE_NAME_CONCAT_LGPL
+
+Makefile.am:
+
+Include:
+"filenamecat.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/filenamecat-tests b/gnulib/modules/filenamecat-tests
new file mode 100644
index 00000000..93ccac14
--- /dev/null
+++ b/gnulib/modules/filenamecat-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-filenamecat.c
+
+Depends-on:
+stdbool
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-filenamecat
+check_PROGRAMS += test-filenamecat
+test_filenamecat_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/filevercmp b/gnulib/modules/filevercmp
new file mode 100644
index 00000000..dd6b0a6b
--- /dev/null
+++ b/gnulib/modules/filevercmp
@@ -0,0 +1,26 @@
+Description:
+compare version strings and version-containing file names
+
+Files:
+lib/filevercmp.h
+lib/filevercmp.c
+
+Depends-on:
+c-ctype
+stdbool
+string
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += filevercmp.c
+
+Include:
+"filevercmp.h"
+
+License:
+LGPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/filevercmp-tests b/gnulib/modules/filevercmp-tests
new file mode 100644
index 00000000..46cf4018
--- /dev/null
+++ b/gnulib/modules/filevercmp-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-filevercmp.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-filevercmp
+check_PROGRAMS += test-filevercmp
diff --git a/gnulib/modules/findprog b/gnulib/modules/findprog
new file mode 100644
index 00000000..537d6871
--- /dev/null
+++ b/gnulib/modules/findprog
@@ -0,0 +1,31 @@
+Description:
+Locating a program in PATH.
+
+Files:
+lib/findprog.h
+lib/findprog.c
+m4/findprog.m4
+m4/eaccess.m4
+
+Depends-on:
+stdbool
+xalloc
+xconcat-filename
+unistd
+strdup
+
+configure.ac:
+gl_FINDPROG
+
+Makefile.am:
+lib_SOURCES += findprog.h findprog.c
+
+Include:
+"findprog.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/findprog-lgpl b/gnulib/modules/findprog-lgpl
new file mode 100644
index 00000000..a4dc64bd
--- /dev/null
+++ b/gnulib/modules/findprog-lgpl
@@ -0,0 +1,32 @@
+Description:
+Locating a program in PATH (LGPLed version).
+
+Files:
+lib/findprog.h
+lib/findprog.c
+lib/findprog-lgpl.c
+m4/findprog.m4
+m4/eaccess.m4
+
+Depends-on:
+stdbool
+strdup
+concat-filename
+unistd
+
+configure.ac:
+gl_FINDPROG
+gl_MODULE_INDICATOR([findprog-lgpl])
+
+Makefile.am:
+lib_SOURCES += findprog.h findprog.c
+
+Include:
+"findprog.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/flexmember b/gnulib/modules/flexmember
new file mode 100644
index 00000000..6d39e140
--- /dev/null
+++ b/gnulib/modules/flexmember
@@ -0,0 +1,20 @@
+Description:
+Flexible array member support
+
+Files:
+m4/flexmember.m4
+
+Depends-on:
+
+configure.ac:
+AC_C_FLEXIBLE_ARRAY_MEMBER
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/float b/gnulib/modules/float
new file mode 100644
index 00000000..b7f068e9
--- /dev/null
+++ b/gnulib/modules/float
@@ -0,0 +1,37 @@
+Description:
+A correct <float.h>.
+
+Files:
+lib/float.in.h
+m4/float_h.m4
+
+Depends-on:
+include_next
+
+configure.ac:
+gl_FLOAT_H
+
+Makefile.am:
+BUILT_SOURCES += $(FLOAT_H)
+
+# We need the following in order to create <float.h> when the system
+# doesn't have one that works with the given compiler.
+float.h: float.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \
+ < $(srcdir)/float.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += float.h float.h-t
+
+Include:
+<float.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/flock b/gnulib/modules/flock
new file mode 100644
index 00000000..9134d517
--- /dev/null
+++ b/gnulib/modules/flock
@@ -0,0 +1,24 @@
+Description:
+flock(2) function: advisory file locks.
+
+Files:
+lib/flock.c
+m4/flock.m4
+
+Depends-on:
+sys_file
+
+configure.ac:
+gl_FUNC_FLOCK
+gl_HEADER_SYS_FILE_MODULE_INDICATOR([flock])
+
+Makefile.am:
+
+Include:
+<sys/file.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Richard W.M. Jones, Jim Meyering
diff --git a/gnulib/modules/flock-tests b/gnulib/modules/flock-tests
new file mode 100644
index 00000000..ece4b482
--- /dev/null
+++ b/gnulib/modules/flock-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-flock.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+unistd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-flock
+check_PROGRAMS += test-flock
diff --git a/gnulib/modules/floor b/gnulib/modules/floor
new file mode 100644
index 00000000..f0eaef84
--- /dev/null
+++ b/gnulib/modules/floor
@@ -0,0 +1,26 @@
+Description:
+floor() function: round towards negative infinity.
+
+Files:
+m4/floor.m4
+
+Depends-on:
+math
+
+configure.ac:
+gl_FUNC_FLOOR
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(FLOOR_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/floorf b/gnulib/modules/floorf
new file mode 100644
index 00000000..47b9d5ca
--- /dev/null
+++ b/gnulib/modules/floorf
@@ -0,0 +1,31 @@
+Description:
+floorf() function: round towards negative infinity.
+
+Files:
+lib/floorf.c
+lib/floor.c
+m4/floorf.m4
+
+Depends-on:
+math
+extensions
+float
+
+configure.ac:
+gl_FUNC_FLOORF
+gl_MATH_MODULE_INDICATOR([floorf])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(FLOORF_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/floorf-tests b/gnulib/modules/floorf-tests
new file mode 100644
index 00000000..ffe6a995
--- /dev/null
+++ b/gnulib/modules/floorf-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-floorf1.c
+tests/test-floorf2.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+float
+isnanf-nolibm
+stdbool
+stdint
+fprintf-posix
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-floorf1 test-floorf2
+check_PROGRAMS += test-floorf1 test-floorf2
+test_floorf1_LDADD = $(LDADD) @FLOORF_LIBM@
+test_floorf2_LDADD = $(LDADD) @FLOORF_LIBM@
diff --git a/gnulib/modules/floorl b/gnulib/modules/floorl
new file mode 100644
index 00000000..66c13621
--- /dev/null
+++ b/gnulib/modules/floorl
@@ -0,0 +1,31 @@
+Description:
+floorl() function: round towards negative infinity.
+
+Files:
+lib/floorl.c
+lib/floor.c
+m4/floorl.m4
+
+Depends-on:
+math
+extensions
+float
+
+configure.ac:
+gl_FUNC_FLOORL
+gl_MATH_MODULE_INDICATOR([floorl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(FLOORL_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/floorl-tests b/gnulib/modules/floorl-tests
new file mode 100644
index 00000000..f7dd7bb8
--- /dev/null
+++ b/gnulib/modules/floorl-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-floorl.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+isnanl-nolibm
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-floorl
+check_PROGRAMS += test-floorl
+test_floorl_LDADD = $(LDADD) @FLOORL_LIBM@
diff --git a/gnulib/modules/fmod b/gnulib/modules/fmod
new file mode 100644
index 00000000..ae82f4b1
--- /dev/null
+++ b/gnulib/modules/fmod
@@ -0,0 +1,24 @@
+Description:
+fmod() function: floating-point remainder function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([fmod])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(FMOD_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/fmod-tests b/gnulib/modules/fmod-tests
new file mode 100644
index 00000000..7d9c7f39
--- /dev/null
+++ b/gnulib/modules/fmod-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-fmod.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fmod
+check_PROGRAMS += test-fmod
+test_fmod_LDADD = $(LDADD) @FMOD_LIBM@
diff --git a/gnulib/modules/fnmatch b/gnulib/modules/fnmatch
new file mode 100644
index 00000000..6849b4d5
--- /dev/null
+++ b/gnulib/modules/fnmatch
@@ -0,0 +1,47 @@
+Description:
+fnmatch() function: wildcard matching.
+
+Files:
+lib/fnmatch.in.h
+lib/fnmatch.c
+lib/fnmatch_loop.c
+m4/mbstate_t.m4
+m4/fnmatch.m4
+
+Depends-on:
+arg-nonnull
+extensions
+alloca
+stdbool
+wchar
+wctype
+memchr
+memcmp
+mbsrtowcs
+mbsinit
+
+configure.ac:
+gl_FUNC_FNMATCH_POSIX
+
+Makefile.am:
+BUILT_SOURCES += $(FNMATCH_H)
+
+# We need the following in order to create <fnmatch.h> when the system
+# doesn't have one that supports the required API.
+fnmatch.h: fnmatch.in.h $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ < $(srcdir)/fnmatch.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += fnmatch.h fnmatch.h-t
+
+Include:
+<fnmatch.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/fnmatch-gnu b/gnulib/modules/fnmatch-gnu
new file mode 100644
index 00000000..143344e3
--- /dev/null
+++ b/gnulib/modules/fnmatch-gnu
@@ -0,0 +1,22 @@
+Description:
+fnmatch() function: wildcard matching, with GNU extensions.
+
+Files:
+
+Depends-on:
+fnmatch
+
+configure.ac:
+gl_FUNC_FNMATCH_GNU
+
+Makefile.am:
+
+Include:
+"fnmatch.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+all
+
diff --git a/gnulib/modules/fnmatch-posix b/gnulib/modules/fnmatch-posix
new file mode 100644
index 00000000..b6df7da3
--- /dev/null
+++ b/gnulib/modules/fnmatch-posix
@@ -0,0 +1,27 @@
+Description:
+fnmatch() function: wildcard matching.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete. Use the module 'fnmatch' instead.
+
+Files:
+
+Depends-on:
+fnmatch
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"fnmatch.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+all
+
diff --git a/gnulib/modules/fnmatch-tests b/gnulib/modules/fnmatch-tests
new file mode 100644
index 00000000..cb16de43
--- /dev/null
+++ b/gnulib/modules/fnmatch-tests
@@ -0,0 +1,8 @@
+Files:
+tests/test-fnmatch.c
+tests/signature.h
+tests/macros.h
+
+Makefile.am:
+TESTS += test-fnmatch
+check_PROGRAMS += test-fnmatch
diff --git a/gnulib/modules/fopen b/gnulib/modules/fopen
new file mode 100644
index 00000000..eddd7f65
--- /dev/null
+++ b/gnulib/modules/fopen
@@ -0,0 +1,26 @@
+Description:
+fopen() function: open a stream to a file.
+
+Files:
+lib/fopen.c
+m4/fopen.m4
+
+Depends-on:
+stdio
+unistd
+
+configure.ac:
+gl_FUNC_FOPEN
+gl_STDIO_MODULE_INDICATOR([fopen])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fopen-safer b/gnulib/modules/fopen-safer
new file mode 100644
index 00000000..6a68f0cd
--- /dev/null
+++ b/gnulib/modules/fopen-safer
@@ -0,0 +1,27 @@
+Description:
+fopen function that avoids clobbering std{in,out,err}.
+
+Files:
+lib/stdio--.h
+lib/stdio-safer.h
+lib/fopen-safer.c
+m4/stdio-safer.m4
+
+Depends-on:
+fopen
+unistd-safer
+
+configure.ac:
+gl_FOPEN_SAFER
+gl_MODULE_INDICATOR([fopen-safer])
+
+Makefile.am:
+
+Include:
+"stdio-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/fopen-safer-tests b/gnulib/modules/fopen-safer-tests
new file mode 100644
index 00000000..256c54ce
--- /dev/null
+++ b/gnulib/modules/fopen-safer-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-fopen.h
+tests/test-fopen-safer.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fopen-safer
+check_PROGRAMS += test-fopen-safer
diff --git a/gnulib/modules/fopen-tests b/gnulib/modules/fopen-tests
new file mode 100644
index 00000000..69ff6ac4
--- /dev/null
+++ b/gnulib/modules/fopen-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-fopen.h
+tests/test-fopen.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fopen
+check_PROGRAMS += test-fopen
+
diff --git a/gnulib/modules/fpending b/gnulib/modules/fpending
new file mode 100644
index 00000000..6b67cc3f
--- /dev/null
+++ b/gnulib/modules/fpending
@@ -0,0 +1,23 @@
+Description:
+Determine the number of bytes waiting in the output buffer of a stream.
+
+Files:
+lib/fpending.h
+lib/fpending.c
+m4/fpending.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_FPENDING
+
+Makefile.am:
+
+Include:
+"fpending.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/fpending-tests b/gnulib/modules/fpending-tests
new file mode 100644
index 00000000..31568e29
--- /dev/null
+++ b/gnulib/modules/fpending-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-fpending.c
+tests/test-fpending.sh
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fpending.sh
+check_PROGRAMS += test-fpending
+MOSTLYCLEANFILES += test-fpending.t
diff --git a/gnulib/modules/fpieee b/gnulib/modules/fpieee
new file mode 100644
index 00000000..174627a9
--- /dev/null
+++ b/gnulib/modules/fpieee
@@ -0,0 +1,23 @@
+Description:
+Ensure IEEE compliant floating-point operations (overflow and division by zero).
+
+Files:
+m4/fpieee.m4
+
+Depends-on:
+
+configure.ac-early:
+AC_REQUIRE([gl_FP_IEEE])
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fprintf-posix b/gnulib/modules/fprintf-posix
new file mode 100644
index 00000000..2f22ebda
--- /dev/null
+++ b/gnulib/modules/fprintf-posix
@@ -0,0 +1,40 @@
+Description:
+POSIX compatible fprintf() function: print formatted output to a stream
+
+Files:
+lib/fprintf.c
+m4/fprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+stdio
+fseterr
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+errno
+multiarch
+
+configure.ac:
+gl_FUNC_FPRINTF_POSIX
+gl_STDIO_MODULE_INDICATOR([fprintf-posix])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fprintf-posix-tests b/gnulib/modules/fprintf-posix-tests
new file mode 100644
index 00000000..3eebaf9c
--- /dev/null
+++ b/gnulib/modules/fprintf-posix-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-fprintf-posix.sh
+tests/test-fprintf-posix.c
+tests/test-fprintf-posix.h
+tests/test-printf-posix.output
+tests/test-fprintf-posix2.sh
+tests/test-fprintf-posix2.c
+tests/test-fprintf-posix3.sh
+tests/test-fprintf-posix3.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
+
+Makefile.am:
+TESTS += test-fprintf-posix.sh test-fprintf-posix2.sh test-fprintf-posix3.sh
+check_PROGRAMS += test-fprintf-posix test-fprintf-posix2 test-fprintf-posix3
diff --git a/gnulib/modules/fprintftime b/gnulib/modules/fprintftime
new file mode 100644
index 00000000..87598eff
--- /dev/null
+++ b/gnulib/modules/fprintftime
@@ -0,0 +1,25 @@
+Description:
+like nstrftime, but output the formatted date to a FILE* stream
+
+Files:
+lib/fprintftime.h
+lib/fprintftime.c
+m4/fprintftime.m4
+
+Depends-on:
+ignore-value
+strftime
+
+configure.ac:
+gl_FPRINTFTIME
+
+Makefile.am:
+
+Include:
+"fprintftime.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/fpucw b/gnulib/modules/fpucw
new file mode 100644
index 00000000..d03bad3d
--- /dev/null
+++ b/gnulib/modules/fpucw
@@ -0,0 +1,21 @@
+Description:
+Set the FPU control word, so as to allow correct 'long double' computations.
+
+Files:
+lib/fpucw.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"fpucw.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fpurge b/gnulib/modules/fpurge
new file mode 100644
index 00000000..ec110620
--- /dev/null
+++ b/gnulib/modules/fpurge
@@ -0,0 +1,26 @@
+Description:
+fpurge() function: Flush buffers.
+
+Files:
+lib/fpurge.c
+lib/stdio-impl.h
+m4/fpurge.m4
+
+Depends-on:
+stdio
+
+configure.ac:
+gl_FUNC_FPURGE
+gl_STDIO_MODULE_INDICATOR([fpurge])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Eric Blake
+
diff --git a/gnulib/modules/fpurge-tests b/gnulib/modules/fpurge-tests
new file mode 100644
index 00000000..74e898d1
--- /dev/null
+++ b/gnulib/modules/fpurge-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-fpurge.c
+tests/macros.h
+
+Depends-on:
+fflush
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fpurge
+check_PROGRAMS += test-fpurge
+MOSTLYCLEANFILES += t-fpurge.tmp
diff --git a/gnulib/modules/freadable b/gnulib/modules/freadable
new file mode 100644
index 00000000..2c69d960
--- /dev/null
+++ b/gnulib/modules/freadable
@@ -0,0 +1,26 @@
+Description:
+freadable() function: Determine whether a FILE stream supports reading.
+
+Files:
+lib/freadable.h
+lib/freadable.c
+lib/stdio-impl.h
+m4/freadable.m4
+
+Depends-on:
+stdbool
+
+configure.ac:
+gl_FUNC_FREADABLE
+
+Makefile.am:
+
+Include:
+"freadable.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Eric Blake
+
diff --git a/gnulib/modules/freadable-tests b/gnulib/modules/freadable-tests
new file mode 100644
index 00000000..9e6f4152
--- /dev/null
+++ b/gnulib/modules/freadable-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-freadable.c
+tests/macros.h
+
+Depends-on:
+fflush
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-freadable
+check_PROGRAMS += test-freadable
+MOSTLYCLEANFILES += t-freadable.tmp
diff --git a/gnulib/modules/freadahead b/gnulib/modules/freadahead
new file mode 100644
index 00000000..96ef2e8f
--- /dev/null
+++ b/gnulib/modules/freadahead
@@ -0,0 +1,25 @@
+Description:
+freadahead() function: Determine the number of bytes waiting in the input
+buffer of a stream.
+
+Files:
+lib/freadahead.h
+lib/freadahead.c
+lib/stdio-impl.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += freadahead.c
+
+Include:
+"freadahead.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/freadahead-tests b/gnulib/modules/freadahead-tests
new file mode 100644
index 00000000..1b53268a
--- /dev/null
+++ b/gnulib/modules/freadahead-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-freadahead.c
+tests/test-freadahead.sh
+tests/macros.h
+
+Depends-on:
+lseek
+unistd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-freadahead.sh
+check_PROGRAMS += test-freadahead
diff --git a/gnulib/modules/freading b/gnulib/modules/freading
new file mode 100644
index 00000000..d2a02780
--- /dev/null
+++ b/gnulib/modules/freading
@@ -0,0 +1,27 @@
+Description:
+freading() function: Determine whether a FILE stream is currently doing reading.
+
+Files:
+lib/freading.h
+lib/freading.c
+lib/stdio-impl.h
+m4/freading.m4
+
+Depends-on:
+stdbool
+
+configure.ac:
+gl_FUNC_FREADING
+
+Makefile.am:
+lib_SOURCES += freading.c
+
+Include:
+"freading.h"
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
+
diff --git a/gnulib/modules/freading-tests b/gnulib/modules/freading-tests
new file mode 100644
index 00000000..10c23117
--- /dev/null
+++ b/gnulib/modules/freading-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-freading.c
+tests/macros.h
+
+Depends-on:
+fflush
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-freading
+check_PROGRAMS += test-freading
+MOSTLYCLEANFILES += t-freading.tmp
diff --git a/gnulib/modules/freadptr b/gnulib/modules/freadptr
new file mode 100644
index 00000000..5ae340ed
--- /dev/null
+++ b/gnulib/modules/freadptr
@@ -0,0 +1,24 @@
+Description:
+freadptr() function: Pointer to the input buffer of a stream.
+
+Files:
+lib/freadptr.h
+lib/freadptr.c
+lib/stdio-impl.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += freadptr.c
+
+Include:
+"freadptr.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/freadptr-tests b/gnulib/modules/freadptr-tests
new file mode 100644
index 00000000..f8bf1bc5
--- /dev/null
+++ b/gnulib/modules/freadptr-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-freadptr.c
+tests/test-freadptr.sh
+tests/test-freadptr2.c
+tests/test-freadptr2.sh
+tests/macros.h
+
+Depends-on:
+lseek
+unistd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-freadptr.sh test-freadptr2.sh
+check_PROGRAMS += test-freadptr test-freadptr2
diff --git a/gnulib/modules/freadseek b/gnulib/modules/freadseek
new file mode 100644
index 00000000..e1ad31cb
--- /dev/null
+++ b/gnulib/modules/freadseek
@@ -0,0 +1,29 @@
+Description:
+freadseek() function: Read and discard input from a stream.
+
+Files:
+lib/freadseek.h
+lib/freadseek.c
+lib/stdio-impl.h
+
+Depends-on:
+freadahead
+freadptr
+fseeko
+lseek
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += freadseek.c
+
+Include:
+"freadseek.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/freadseek-tests b/gnulib/modules/freadseek-tests
new file mode 100644
index 00000000..d101582d
--- /dev/null
+++ b/gnulib/modules/freadseek-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-freadseek.c
+tests/test-freadseek.sh
+tests/macros.h
+
+Depends-on:
+unistd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-freadseek.sh
+check_PROGRAMS += test-freadseek
diff --git a/gnulib/modules/free b/gnulib/modules/free
new file mode 100644
index 00000000..26ef70b1
--- /dev/null
+++ b/gnulib/modules/free
@@ -0,0 +1,25 @@
+Description:
+Work around incompatibility on older systems where free (NULL) fails.
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/free.c
+m4/free.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_FREE
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/freopen b/gnulib/modules/freopen
new file mode 100644
index 00000000..5c556e4e
--- /dev/null
+++ b/gnulib/modules/freopen
@@ -0,0 +1,25 @@
+Description:
+freopen() function: open a stream to a file.
+
+Files:
+lib/freopen.c
+m4/freopen.m4
+
+Depends-on:
+stdio
+
+configure.ac:
+gl_FUNC_FREOPEN
+gl_STDIO_MODULE_INDICATOR([freopen])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/freopen-safer b/gnulib/modules/freopen-safer
new file mode 100644
index 00000000..91c67b6e
--- /dev/null
+++ b/gnulib/modules/freopen-safer
@@ -0,0 +1,29 @@
+Description:
+freopen function that avoids clobbering std{in,out,err}.
+
+Files:
+lib/stdio--.h
+lib/stdio-safer.h
+lib/freopen-safer.c
+m4/stdio-safer.m4
+
+Depends-on:
+dup2
+freopen
+open
+stdbool
+
+configure.ac:
+gl_FREOPEN_SAFER
+gl_MODULE_INDICATOR([freopen-safer])
+
+Makefile.am:
+
+Include:
+"stdio-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/freopen-safer-tests b/gnulib/modules/freopen-safer-tests
new file mode 100644
index 00000000..048d8a2a
--- /dev/null
+++ b/gnulib/modules/freopen-safer-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-freopen-safer.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-freopen-safer
+check_PROGRAMS += test-freopen-safer
diff --git a/gnulib/modules/freopen-tests b/gnulib/modules/freopen-tests
new file mode 100644
index 00000000..95b59152
--- /dev/null
+++ b/gnulib/modules/freopen-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-freopen.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-freopen
+check_PROGRAMS += test-freopen
+
diff --git a/gnulib/modules/frexp b/gnulib/modules/frexp
new file mode 100644
index 00000000..7fae366d
--- /dev/null
+++ b/gnulib/modules/frexp
@@ -0,0 +1,29 @@
+Description:
+frexp() function: split a double into its constituents.
+
+Files:
+lib/frexp.c
+m4/frexp.m4
+
+Depends-on:
+math
+isnand-nolibm
+
+configure.ac:
+gl_FUNC_FREXP
+gl_MATH_MODULE_INDICATOR([frexp])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(FREXP_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Paolo Bonzini
+
diff --git a/gnulib/modules/frexp-nolibm b/gnulib/modules/frexp-nolibm
new file mode 100644
index 00000000..6a909e97
--- /dev/null
+++ b/gnulib/modules/frexp-nolibm
@@ -0,0 +1,26 @@
+Description:
+frexp() function: split a double into its constituents, without requiring libm.
+
+Files:
+lib/frexp.c
+m4/frexp.m4
+
+Depends-on:
+math
+isnand-nolibm
+
+configure.ac:
+gl_FUNC_FREXP_NO_LIBM
+gl_MATH_MODULE_INDICATOR([frexp])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Paolo Bonzini
+
diff --git a/gnulib/modules/frexp-nolibm-tests b/gnulib/modules/frexp-nolibm-tests
new file mode 100644
index 00000000..2d761c06
--- /dev/null
+++ b/gnulib/modules/frexp-nolibm-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-frexp.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+isnand-nolibm
+signbit
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-frexp-nolibm
+check_PROGRAMS += test-frexp-nolibm
+test_frexp_nolibm_SOURCES = test-frexp.c
diff --git a/gnulib/modules/frexp-tests b/gnulib/modules/frexp-tests
new file mode 100644
index 00000000..32a9ecae
--- /dev/null
+++ b/gnulib/modules/frexp-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-frexp.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+isnand-nolibm
+signbit
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-frexp
+check_PROGRAMS += test-frexp
+test_frexp_LDADD = $(LDADD) @FREXP_LIBM@
diff --git a/gnulib/modules/frexpl b/gnulib/modules/frexpl
new file mode 100644
index 00000000..185d54dd
--- /dev/null
+++ b/gnulib/modules/frexpl
@@ -0,0 +1,31 @@
+Description:
+frexpl() function: split a 'long double' into its constituents.
+
+Files:
+lib/frexpl.c
+lib/frexp.c
+m4/frexpl.m4
+
+Depends-on:
+math
+isnanl-nolibm
+fpucw
+
+configure.ac:
+gl_FUNC_FREXPL
+gl_MATH_MODULE_INDICATOR([frexpl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(FREXPL_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Paolo Bonzini
+
diff --git a/gnulib/modules/frexpl-nolibm b/gnulib/modules/frexpl-nolibm
new file mode 100644
index 00000000..80ce8fb7
--- /dev/null
+++ b/gnulib/modules/frexpl-nolibm
@@ -0,0 +1,29 @@
+Description:
+frexpl() function: split a 'long double' into its constituents, without
+requiring libm.
+
+Files:
+lib/frexpl.c
+lib/frexp.c
+m4/frexpl.m4
+
+Depends-on:
+math
+isnanl-nolibm
+fpucw
+
+configure.ac:
+gl_FUNC_FREXPL_NO_LIBM
+gl_MATH_MODULE_INDICATOR([frexpl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Paolo Bonzini
+
diff --git a/gnulib/modules/frexpl-nolibm-tests b/gnulib/modules/frexpl-nolibm-tests
new file mode 100644
index 00000000..d9f6d4da
--- /dev/null
+++ b/gnulib/modules/frexpl-nolibm-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-frexpl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+isnanl-nolibm
+signbit
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-frexpl-nolibm
+check_PROGRAMS += test-frexpl-nolibm
+test_frexpl_nolibm_SOURCES = test-frexpl.c
diff --git a/gnulib/modules/frexpl-tests b/gnulib/modules/frexpl-tests
new file mode 100644
index 00000000..4eb2e4bd
--- /dev/null
+++ b/gnulib/modules/frexpl-tests
@@ -0,0 +1,18 @@
+Files:
+tests/test-frexpl.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+isnanl-nolibm
+signbit
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-frexpl
+check_PROGRAMS += test-frexpl
+test_frexpl_LDADD = $(LDADD) @FREXPL_LIBM@
diff --git a/gnulib/modules/fseek b/gnulib/modules/fseek
new file mode 100644
index 00000000..375a54cc
--- /dev/null
+++ b/gnulib/modules/fseek
@@ -0,0 +1,27 @@
+Description:
+fseek() function: Reposition a FILE stream.
+
+Files:
+lib/fseek.c
+m4/fseek.m4
+
+Depends-on:
+fseeko
+stdio
+
+configure.ac:
+gl_FUNC_FSEEK
+gl_MODULE_INDICATOR([fseek])
+gl_STDIO_MODULE_INDICATOR([fseek])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fseek-tests b/gnulib/modules/fseek-tests
new file mode 100644
index 00000000..45fe9593
--- /dev/null
+++ b/gnulib/modules/fseek-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-fseek.c
+tests/test-fseek.sh
+tests/test-fseek2.sh
+tests/signature.h
+tests/macros.h
+m4/ungetc.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_UNGETC_WORKS
+
+Makefile.am:
+TESTS += test-fseek.sh test-fseek2.sh
+check_PROGRAMS += test-fseek
diff --git a/gnulib/modules/fseeko b/gnulib/modules/fseeko
new file mode 100644
index 00000000..3581d8a7
--- /dev/null
+++ b/gnulib/modules/fseeko
@@ -0,0 +1,31 @@
+Description:
+fseeko() function: Reposition a FILE stream.
+
+Files:
+lib/fseeko.c
+lib/stdio-impl.h
+m4/fseeko.m4
+
+Depends-on:
+extensions
+lseek
+stdio
+
+configure.ac-early:
+AC_REQUIRE([AC_FUNC_FSEEKO])
+
+configure.ac:
+gl_FUNC_FSEEKO
+gl_STDIO_MODULE_INDICATOR([fseeko])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fseeko-tests b/gnulib/modules/fseeko-tests
new file mode 100644
index 00000000..178e8731
--- /dev/null
+++ b/gnulib/modules/fseeko-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-fseeko.c
+tests/test-fseeko.sh
+tests/test-fseeko2.sh
+tests/signature.h
+tests/macros.h
+m4/ungetc.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_UNGETC_WORKS
+
+Makefile.am:
+TESTS += test-fseeko.sh test-fseeko2.sh
+check_PROGRAMS += test-fseeko
diff --git a/gnulib/modules/fseterr b/gnulib/modules/fseterr
new file mode 100644
index 00000000..190cbd2d
--- /dev/null
+++ b/gnulib/modules/fseterr
@@ -0,0 +1,24 @@
+Description:
+Set the error indicator of a stream.
+
+Files:
+lib/fseterr.h
+lib/fseterr.c
+lib/stdio-impl.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += fseterr.c
+
+Include:
+"fseterr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fseterr-tests b/gnulib/modules/fseterr-tests
new file mode 100644
index 00000000..ce2332f4
--- /dev/null
+++ b/gnulib/modules/fseterr-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-fseterr.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fseterr
+check_PROGRAMS += test-fseterr
+
diff --git a/gnulib/modules/fstrcmp b/gnulib/modules/fstrcmp
new file mode 100644
index 00000000..a77a9134
--- /dev/null
+++ b/gnulib/modules/fstrcmp
@@ -0,0 +1,28 @@
+Description:
+Fuzzy string comparison.
+
+Files:
+lib/fstrcmp.h
+lib/fstrcmp.c
+
+Depends-on:
+diffseq
+lock
+tls
+minmax
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += fstrcmp.h fstrcmp.c
+
+Include:
+"fstrcmp.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/fstrcmp-tests b/gnulib/modules/fstrcmp-tests
new file mode 100644
index 00000000..b82f414b
--- /dev/null
+++ b/gnulib/modules/fstrcmp-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-fstrcmp.c
+tests/macros.h
+
+Depends-on:
+stdbool
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fstrcmp
+check_PROGRAMS += test-fstrcmp
+test_fstrcmp_LDADD = $(LDADD) @LIBINTL@ $(LIBTHREAD)
diff --git a/gnulib/modules/fsusage b/gnulib/modules/fsusage
new file mode 100644
index 00000000..c8496880
--- /dev/null
+++ b/gnulib/modules/fsusage
@@ -0,0 +1,26 @@
+Description:
+Return file system space usage info.
+
+Files:
+lib/fsusage.h
+lib/fsusage.c
+m4/fsusage.m4
+
+Depends-on:
+full-read
+stdbool
+stdint
+
+configure.ac:
+gl_FSUSAGE
+
+Makefile.am:
+
+Include:
+"fsusage.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/fsync b/gnulib/modules/fsync
new file mode 100644
index 00000000..fa01e9b1
--- /dev/null
+++ b/gnulib/modules/fsync
@@ -0,0 +1,24 @@
+Description:
+fsync(2) function: synchronize writes to a file.
+
+Files:
+lib/fsync.c
+m4/fsync.m4
+
+Depends-on:
+unistd
+
+configure.ac:
+gl_FUNC_FSYNC
+gl_UNISTD_MODULE_INDICATOR([fsync])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Richard W.M. Jones, Jim Meyering
diff --git a/gnulib/modules/fsync-tests b/gnulib/modules/fsync-tests
new file mode 100644
index 00000000..e3df22db
--- /dev/null
+++ b/gnulib/modules/fsync-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-fsync.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fsync
+check_PROGRAMS += test-fsync
diff --git a/gnulib/modules/ftell b/gnulib/modules/ftell
new file mode 100644
index 00000000..6e9dc259
--- /dev/null
+++ b/gnulib/modules/ftell
@@ -0,0 +1,27 @@
+Description:
+ftell() function: Retrieve the position of a FILE stream.
+
+Files:
+lib/ftell.c
+m4/ftell.m4
+
+Depends-on:
+ftello
+stdio
+errno
+
+configure.ac:
+gl_FUNC_FTELL
+gl_STDIO_MODULE_INDICATOR([ftell])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/ftell-tests b/gnulib/modules/ftell-tests
new file mode 100644
index 00000000..c944ca91
--- /dev/null
+++ b/gnulib/modules/ftell-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-ftell.c
+tests/test-ftell.sh
+tests/test-ftell2.sh
+tests/signature.h
+tests/macros.h
+m4/ungetc.m4
+
+Depends-on:
+binary-io
+
+configure.ac:
+gl_FUNC_UNGETC_WORKS
+
+Makefile.am:
+TESTS += test-ftell.sh test-ftell2.sh
+check_PROGRAMS += test-ftell
diff --git a/gnulib/modules/ftello b/gnulib/modules/ftello
new file mode 100644
index 00000000..9a0b62d0
--- /dev/null
+++ b/gnulib/modules/ftello
@@ -0,0 +1,30 @@
+Description:
+ftello() function: Retrieve the position of a FILE stream.
+
+Files:
+lib/ftello.c
+m4/ftello.m4
+
+Depends-on:
+extensions
+lseek
+stdio
+
+configure.ac-early:
+AC_REQUIRE([AC_FUNC_FSEEKO])
+
+configure.ac:
+gl_FUNC_FTELLO
+gl_STDIO_MODULE_INDICATOR([ftello])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/ftello-tests b/gnulib/modules/ftello-tests
new file mode 100644
index 00000000..c20381c1
--- /dev/null
+++ b/gnulib/modules/ftello-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-ftello.c
+tests/test-ftello.sh
+tests/test-ftello2.sh
+tests/signature.h
+tests/macros.h
+m4/ungetc.m4
+
+Depends-on:
+binary-io
+
+configure.ac:
+gl_FUNC_UNGETC_WORKS
+
+Makefile.am:
+TESTS += test-ftello.sh test-ftello2.sh
+check_PROGRAMS += test-ftello
diff --git a/gnulib/modules/ftruncate b/gnulib/modules/ftruncate
new file mode 100644
index 00000000..a90be6ce
--- /dev/null
+++ b/gnulib/modules/ftruncate
@@ -0,0 +1,25 @@
+Description:
+ftruncate() function: truncate an open file to a specified length.
+
+Files:
+lib/ftruncate.c
+m4/ftruncate.m4
+
+Depends-on:
+unistd
+
+configure.ac:
+gl_FUNC_FTRUNCATE
+gl_UNISTD_MODULE_INDICATOR([ftruncate])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/fts b/gnulib/modules/fts
new file mode 100644
index 00000000..9509557b
--- /dev/null
+++ b/gnulib/modules/fts
@@ -0,0 +1,41 @@
+Description:
+Traverse a file hierarchy.
+
+Files:
+lib/fts_.h
+lib/fts.c
+lib/fts-cycle.c
+m4/fts.m4
+
+Depends-on:
+cloexec
+cycle-check
+d-ino
+d-type
+dirent-safer
+dirfd
+fchdir
+fcntl-h
+fcntl-safer
+hash
+i-ring
+lstat
+memmove
+openat-safer
+stdbool
+unistd-safer
+
+configure.ac:
+gl_FUNC_FTS
+gl_MODULE_INDICATOR([fts])
+
+Makefile.am:
+
+Include:
+"fts_.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/fts-lgpl b/gnulib/modules/fts-lgpl
new file mode 100644
index 00000000..3a6f0ed0
--- /dev/null
+++ b/gnulib/modules/fts-lgpl
@@ -0,0 +1,28 @@
+Description:
+Traverse a file hierarchy (LPGL'ed version).
+
+Files:
+lib/fts_.h
+lib/fts.c
+m4/fts.m4
+
+Depends-on:
+dirfd
+fchdir
+i-ring
+openat
+stdbool
+
+configure.ac:
+gl_FUNC_FTS_LGPL
+
+Makefile.am:
+
+Include:
+"fts_.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/full-read b/gnulib/modules/full-read
new file mode 100644
index 00000000..a97a7679
--- /dev/null
+++ b/gnulib/modules/full-read
@@ -0,0 +1,24 @@
+Description:
+An interface to the read() function that reads all it is asked to read.
+
+Files:
+lib/full-read.h
+lib/full-read.c
+
+Depends-on:
+safe-read
+full-write
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += full-read.h full-read.c
+
+Include:
+"full-read.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, Bruno Haible
diff --git a/gnulib/modules/full-write b/gnulib/modules/full-write
new file mode 100644
index 00000000..4f8eeadc
--- /dev/null
+++ b/gnulib/modules/full-write
@@ -0,0 +1,23 @@
+Description:
+An interface to the write() function that writes all it is asked to write.
+
+Files:
+lib/full-write.h
+lib/full-write.c
+
+Depends-on:
+safe-write
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += full-write.h full-write.c
+
+Include:
+"full-write.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, Bruno Haible
diff --git a/gnulib/modules/func b/gnulib/modules/func
new file mode 100644
index 00000000..48e979d1
--- /dev/null
+++ b/gnulib/modules/func
@@ -0,0 +1,20 @@
+Description:
+Make sure __func__ is usable even on non-C99 platforms.
+
+Files:
+m4/func.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC
+
+Makefile.am:
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/func-tests b/gnulib/modules/func-tests
new file mode 100644
index 00000000..cb53b6d5
--- /dev/null
+++ b/gnulib/modules/func-tests
@@ -0,0 +1,9 @@
+Files:
+tests/test-func.c
+tests/macros.h
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-func
+check_PROGRAMS += test-func
diff --git a/gnulib/modules/futimens b/gnulib/modules/futimens
new file mode 100644
index 00000000..17bff44a
--- /dev/null
+++ b/gnulib/modules/futimens
@@ -0,0 +1,29 @@
+Description:
+Set file access and modification times of a file descriptor.
+
+Files:
+lib/futimens.c
+m4/futimens.m4
+
+Depends-on:
+sys_stat
+utimens
+extensions
+
+configure.ac:
+gl_FUNC_FUTIMENS
+gl_SYS_STAT_MODULE_INDICATOR([futimens])
+
+Makefile.am:
+
+Include:
+<sys/stat.h>
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/futimens-tests b/gnulib/modules/futimens-tests
new file mode 100644
index 00000000..124b62f4
--- /dev/null
+++ b/gnulib/modules/futimens-tests
@@ -0,0 +1,20 @@
+Files:
+tests/nap.h
+tests/test-futimens.h
+tests/test-utimens-common.h
+tests/test-futimens.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+timespec
+usleep
+utimecmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-futimens
+check_PROGRAMS += test-futimens
+test_futimens_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBINTL@
diff --git a/gnulib/modules/fwritable b/gnulib/modules/fwritable
new file mode 100644
index 00000000..56d698e3
--- /dev/null
+++ b/gnulib/modules/fwritable
@@ -0,0 +1,26 @@
+Description:
+fwritable() function: Determine whether a FILE stream supports writing.
+
+Files:
+lib/fwritable.h
+lib/fwritable.c
+lib/stdio-impl.h
+m4/fwritable.m4
+
+Depends-on:
+stdbool
+
+configure.ac:
+gl_FUNC_FWRITABLE
+
+Makefile.am:
+
+Include:
+"fwritable.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Eric Blake
+
diff --git a/gnulib/modules/fwritable-tests b/gnulib/modules/fwritable-tests
new file mode 100644
index 00000000..803a331e
--- /dev/null
+++ b/gnulib/modules/fwritable-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-fwritable.c
+tests/macros.h
+
+Depends-on:
+fflush
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fwritable
+check_PROGRAMS += test-fwritable
+MOSTLYCLEANFILES += t-fwritable.tmp
diff --git a/gnulib/modules/fwriteerror b/gnulib/modules/fwriteerror
new file mode 100644
index 00000000..93b0533c
--- /dev/null
+++ b/gnulib/modules/fwriteerror
@@ -0,0 +1,25 @@
+Description:
+Detect write error on a stream.
+
+Files:
+lib/fwriteerror.h
+lib/fwriteerror.c
+
+Depends-on:
+errno
+stdbool
+
+configure.ac:
+gl_MODULE_INDICATOR([fwriteerror])
+
+Makefile.am:
+lib_SOURCES += fwriteerror.h fwriteerror.c
+
+Include:
+"fwriteerror.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/fwriting b/gnulib/modules/fwriting
new file mode 100644
index 00000000..f3e94a31
--- /dev/null
+++ b/gnulib/modules/fwriting
@@ -0,0 +1,26 @@
+Description:
+fwriting() function: Determine whether a FILE stream is currently doing writing.
+
+Files:
+lib/fwriting.h
+lib/fwriting.c
+lib/stdio-impl.h
+m4/fwriting.m4
+
+Depends-on:
+stdbool
+
+configure.ac:
+gl_FUNC_FWRITING
+
+Makefile.am:
+
+Include:
+"fwriting.h"
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
+
diff --git a/gnulib/modules/fwriting-tests b/gnulib/modules/fwriting-tests
new file mode 100644
index 00000000..2b74b64a
--- /dev/null
+++ b/gnulib/modules/fwriting-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-fwriting.c
+tests/macros.h
+
+Depends-on:
+fflush
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fwriting
+check_PROGRAMS += test-fwriting
+MOSTLYCLEANFILES += t-fwriting.tmp
diff --git a/gnulib/modules/gcd b/gnulib/modules/gcd
new file mode 100644
index 00000000..bba1cfd2
--- /dev/null
+++ b/gnulib/modules/gcd
@@ -0,0 +1,23 @@
+Description:
+Greatest common divisor.
+
+Files:
+lib/gcd.h
+lib/gcd.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gcd.h gcd.c
+
+Include:
+"gcd.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/gen-uni-tables b/gnulib/modules/gen-uni-tables
new file mode 100644
index 00000000..115853a0
--- /dev/null
+++ b/gnulib/modules/gen-uni-tables
@@ -0,0 +1,26 @@
+Description:
+Generates the tables in lib/unictype/* and lib/unilbrk/* and lib/uniwbrk/* and
+lib/unicase/*.
+
+Files:
+lib/gen-uni-tables.c
+lib/unictype/3level.h
+lib/unictype/3levelbit.h
+
+Depends-on:
+memcmp
+strdup
+strstr-simple
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/gendocs b/gnulib/modules/gendocs
new file mode 100644
index 00000000..d70449d3
--- /dev/null
+++ b/gnulib/modules/gendocs
@@ -0,0 +1,21 @@
+Description:
+Generate manuals in several formats from Texinfo sources.
+Can be used for http://www.gnu.org/software/PKG/manual/ directories.
+
+Files:
+build-aux/gendocs.sh
+doc/gendocs_template
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Karl Berry
diff --git a/gnulib/modules/getaddrinfo b/gnulib/modules/getaddrinfo
new file mode 100644
index 00000000..c8c60244
--- /dev/null
+++ b/gnulib/modules/getaddrinfo
@@ -0,0 +1,38 @@
+Description:
+getaddrinfo() function: Get address information.
+
+Files:
+lib/getaddrinfo.c
+lib/gai_strerror.c
+m4/getaddrinfo.m4
+
+Depends-on:
+extensions
+gettext-h
+inet_ntop
+snprintf
+socklen
+stdbool
+sys_socket
+netdb
+strdup
+servent
+hostent
+
+configure.ac:
+gl_GETADDRINFO
+gl_NETDB_MODULE_INDICATOR([getaddrinfo])
+
+Makefile.am:
+
+Include:
+<netdb.h>
+
+Link:
+$(GETADDRINFO_LIB)
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/getaddrinfo-tests b/gnulib/modules/getaddrinfo-tests
new file mode 100644
index 00000000..521cf680
--- /dev/null
+++ b/gnulib/modules/getaddrinfo-tests
@@ -0,0 +1,14 @@
+Files:
+tests/signature.h
+tests/test-getaddrinfo.c
+
+Depends-on:
+inet_ntop
+strerror
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getaddrinfo
+check_PROGRAMS += test-getaddrinfo
+test_getaddrinfo_LDADD = $(LDADD) @GETADDRINFO_LIB@ @LIBINTL@
diff --git a/gnulib/modules/getcwd b/gnulib/modules/getcwd
new file mode 100644
index 00000000..cec9e2a5
--- /dev/null
+++ b/gnulib/modules/getcwd
@@ -0,0 +1,34 @@
+Description:
+Return the current working directory.
+
+Files:
+lib/getcwd.c
+m4/getcwd-abort-bug.m4
+m4/getcwd-path-max.m4
+m4/getcwd.m4
+
+Depends-on:
+mempcpy
+d-ino
+dirfd
+extensions
+memmove
+openat
+stdbool
+unistd
+malloc-posix
+
+configure.ac:
+gl_FUNC_GETCWD
+gl_UNISTD_MODULE_INDICATOR([getcwd])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/getcwd-tests b/gnulib/modules/getcwd-tests
new file mode 100644
index 00000000..016961fc
--- /dev/null
+++ b/gnulib/modules/getcwd-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-getcwd.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getcwd
+check_PROGRAMS += test-getcwd
diff --git a/gnulib/modules/getdate b/gnulib/modules/getdate
new file mode 100644
index 00000000..1328c221
--- /dev/null
+++ b/gnulib/modules/getdate
@@ -0,0 +1,40 @@
+Description:
+Convert a date/time string to linear time.
+
+Files:
+doc/getdate.texi
+lib/getdate.h
+lib/getdate.y
+m4/bison.m4
+m4/tm_gmtoff.m4
+m4/getdate.m4
+
+Depends-on:
+c-ctype
+stdbool
+gettime
+intprops
+mktime
+setenv
+unsetenv
+time
+verify
+xalloc
+
+configure.ac:
+gl_GETDATE
+
+Makefile.am:
+lib_SOURCES += getdate.y
+BUILT_SOURCES += getdate.c
+MAINTAINERCLEANFILES += getdate.c
+EXTRA_DIST += getdate.c
+
+Include:
+"getdate.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/getdate-tests b/gnulib/modules/getdate-tests
new file mode 100644
index 00000000..ff2945db
--- /dev/null
+++ b/gnulib/modules/getdate-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-getdate.c
+tests/macros.h
+
+Depends-on:
+progname
+setenv
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getdate
+check_PROGRAMS += test-getdate
+test_getdate_LDADD = $(LDADD) @LIBINTL@ $(LIB_CLOCK_GETTIME)
diff --git a/gnulib/modules/getdelim b/gnulib/modules/getdelim
new file mode 100644
index 00000000..0f17b608
--- /dev/null
+++ b/gnulib/modules/getdelim
@@ -0,0 +1,28 @@
+Description:
+Read character delimited data from a stream.
+
+Files:
+lib/getdelim.c
+m4/getdelim.m4
+
+Depends-on:
+extensions
+stdio
+stdint
+realloc-posix
+errno
+
+configure.ac:
+gl_FUNC_GETDELIM
+gl_STDIO_MODULE_INDICATOR([getdelim])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/getdelim-tests b/gnulib/modules/getdelim-tests
new file mode 100644
index 00000000..a2f2aa0b
--- /dev/null
+++ b/gnulib/modules/getdelim-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-getdelim.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getdelim
+check_PROGRAMS += test-getdelim
+MOSTLYCLEANFILES += test-getdelim.txt
diff --git a/gnulib/modules/getdomainname b/gnulib/modules/getdomainname
new file mode 100644
index 00000000..4f37a0cc
--- /dev/null
+++ b/gnulib/modules/getdomainname
@@ -0,0 +1,25 @@
+Description:
+getdomainname() function: Return machine's NIS domain name.
+
+Files:
+lib/getdomainname.c
+m4/getdomainname.m4
+
+Depends-on:
+unistd
+extensions
+
+configure.ac:
+gl_FUNC_GETDOMAINNAME
+gl_UNISTD_MODULE_INDICATOR([getdomainname])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/getdtablesize b/gnulib/modules/getdtablesize
new file mode 100644
index 00000000..dd7f855a
--- /dev/null
+++ b/gnulib/modules/getdtablesize
@@ -0,0 +1,25 @@
+Description:
+getdtablesize() function: return maximum number of file descriptors.
+
+Files:
+lib/getdtablesize.c
+m4/getdtablesize.m4
+
+Depends-on:
+unistd
+
+configure.ac:
+gl_FUNC_GETDTABLESIZE
+gl_UNISTD_MODULE_INDICATOR([getdtablesize])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/getdtablesize-tests b/gnulib/modules/getdtablesize-tests
new file mode 100644
index 00000000..5f78c5fc
--- /dev/null
+++ b/gnulib/modules/getdtablesize-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-getdtablesize.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getdtablesize
+check_PROGRAMS += test-getdtablesize
diff --git a/gnulib/modules/getgroups b/gnulib/modules/getgroups
new file mode 100644
index 00000000..aabcefc5
--- /dev/null
+++ b/gnulib/modules/getgroups
@@ -0,0 +1,26 @@
+Description:
+getgroups() function: return the supplementary group IDs of the current process.
+
+Files:
+lib/getgroups.c
+m4/getgroups.m4
+
+Depends-on:
+malloc-posix
+stdint
+unistd
+
+configure.ac:
+gl_FUNC_GETGROUPS
+gl_UNISTD_MODULE_INDICATOR([getgroups])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/getgroups-tests b/gnulib/modules/getgroups-tests
new file mode 100644
index 00000000..3db9224d
--- /dev/null
+++ b/gnulib/modules/getgroups-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-getgroups.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getgroups
+check_PROGRAMS += test-getgroups
diff --git a/gnulib/modules/gethostname b/gnulib/modules/gethostname
new file mode 100644
index 00000000..8c245712
--- /dev/null
+++ b/gnulib/modules/gethostname
@@ -0,0 +1,31 @@
+Description:
+gethostname() function: Return machine's hostname.
+
+Files:
+lib/gethostname.c
+m4/gethostname.m4
+lib/w32sock.h
+
+Depends-on:
+unistd
+sys_socket
+errno
+sockets
+
+configure.ac:
+gl_FUNC_GETHOSTNAME
+gl_UNISTD_MODULE_INDICATOR([gethostname])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+Link:
+$(GETHOSTNAME_LIB)
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/gethostname-tests b/gnulib/modules/gethostname-tests
new file mode 100644
index 00000000..2d2d537d
--- /dev/null
+++ b/gnulib/modules/gethostname-tests
@@ -0,0 +1,12 @@
+Files:
+tests/signature.h
+tests/test-gethostname.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gethostname
+check_PROGRAMS += test-gethostname
+test_gethostname_LDADD = $(LDADD) @GETHOSTNAME_LIB@
diff --git a/gnulib/modules/gethrxtime b/gnulib/modules/gethrxtime
new file mode 100644
index 00000000..ab9507bc
--- /dev/null
+++ b/gnulib/modules/gethrxtime
@@ -0,0 +1,32 @@
+Description:
+Get high resolution real time.
+
+Files:
+lib/xtime.h
+lib/gethrxtime.c
+lib/gethrxtime.h
+m4/gethrxtime.m4
+m4/longlong.m4
+
+Depends-on:
+clock-time
+extensions
+gettime
+sys_time
+
+configure.ac:
+gl_GETHRXTIME
+
+Makefile.am:
+
+Include:
+"xtime.h"
+
+Link:
+$(LIB_GETHRXTIME)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/getline b/gnulib/modules/getline
new file mode 100644
index 00000000..1fb9b9c2
--- /dev/null
+++ b/gnulib/modules/getline
@@ -0,0 +1,26 @@
+Description:
+Read a line from a stream.
+
+Files:
+lib/getline.c
+m4/getline.m4
+
+Depends-on:
+extensions
+getdelim
+stdio
+
+configure.ac:
+gl_FUNC_GETLINE
+gl_STDIO_MODULE_INDICATOR([getline])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/getline-tests b/gnulib/modules/getline-tests
new file mode 100644
index 00000000..33eb2b7b
--- /dev/null
+++ b/gnulib/modules/getline-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-getline.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getline
+check_PROGRAMS += test-getline
+MOSTLYCLEANFILES += test-getline.txt
diff --git a/gnulib/modules/getloadavg b/gnulib/modules/getloadavg
new file mode 100644
index 00000000..7865b8f0
--- /dev/null
+++ b/gnulib/modules/getloadavg
@@ -0,0 +1,30 @@
+Description:
+Return the current system load averages.
+
+Files:
+lib/getloadavg.c
+m4/getloadavg.m4
+
+Depends-on:
+c-strtod
+cloexec
+extensions
+fcntl-safer
+intprops
+stdbool
+stdlib
+
+configure.ac:
+gl_GETLOADAVG([$gl_source_base])
+gl_STDLIB_MODULE_INDICATOR([getloadavg])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/getlogin b/gnulib/modules/getlogin
new file mode 100644
index 00000000..1e0c77ab
--- /dev/null
+++ b/gnulib/modules/getlogin
@@ -0,0 +1,24 @@
+Description:
+getlogin() function: Get user name.
+
+Files:
+lib/getlogin.c
+m4/getlogin.m4
+
+Depends-on:
+unistd
+
+configure.ac:
+gl_GETLOGIN
+gl_UNISTD_MODULE_INDICATOR([getlogin])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/getlogin-tests b/gnulib/modules/getlogin-tests
new file mode 100644
index 00000000..795fba78
--- /dev/null
+++ b/gnulib/modules/getlogin-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-getlogin.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getlogin
+check_PROGRAMS += test-getlogin
diff --git a/gnulib/modules/getlogin_r b/gnulib/modules/getlogin_r
new file mode 100644
index 00000000..35b655e6
--- /dev/null
+++ b/gnulib/modules/getlogin_r
@@ -0,0 +1,25 @@
+Description:
+getlogin_r() function: Get user name to a buffer allocated by the caller.
+
+Files:
+lib/getlogin_r.c
+m4/getlogin_r.m4
+
+Depends-on:
+extensions
+unistd
+
+configure.ac:
+gl_GETLOGIN_R
+gl_UNISTD_MODULE_INDICATOR([getlogin_r])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/getlogin_r-tests b/gnulib/modules/getlogin_r-tests
new file mode 100644
index 00000000..22dfba54
--- /dev/null
+++ b/gnulib/modules/getlogin_r-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-getlogin_r.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getlogin_r
+check_PROGRAMS += test-getlogin_r
diff --git a/gnulib/modules/getndelim2 b/gnulib/modules/getndelim2
new file mode 100644
index 00000000..daf4b5f0
--- /dev/null
+++ b/gnulib/modules/getndelim2
@@ -0,0 +1,30 @@
+Description:
+Read a line from a stream, stopping at one of 2 delimiters, with bounded
+memory allocation.
+
+Files:
+lib/getndelim2.h
+lib/getndelim2.c
+m4/getndelim2.m4
+
+Depends-on:
+ssize_t
+stdbool
+stdint
+freadptr
+freadseek
+memchr2
+
+configure.ac:
+gl_GETNDELIM2
+
+Makefile.am:
+
+Include:
+"getndelim2.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/getndelim2-tests b/gnulib/modules/getndelim2-tests
new file mode 100644
index 00000000..d7e4dfc5
--- /dev/null
+++ b/gnulib/modules/getndelim2-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-getndelim2.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getndelim2
+check_PROGRAMS += test-getndelim2
+MOSTLYCLEANFILES += test-getndelim2.txt
diff --git a/gnulib/modules/getnline b/gnulib/modules/getnline
new file mode 100644
index 00000000..4f449dbe
--- /dev/null
+++ b/gnulib/modules/getnline
@@ -0,0 +1,26 @@
+Description:
+Read a line from a stream, with bounded memory allocation.
+
+Files:
+lib/getnline.h
+lib/getnline.c
+m4/getnline.m4
+
+Depends-on:
+getndelim2
+ssize_t
+
+configure.ac:
+gl_GETNLINE
+
+Makefile.am:
+lib_SOURCES += getnline.h getnline.c
+
+Include:
+"getnline.h"
+
+License:
+GPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/getopt b/gnulib/modules/getopt
new file mode 100644
index 00000000..402e6765
--- /dev/null
+++ b/gnulib/modules/getopt
@@ -0,0 +1,26 @@
+Description:
+Process command line arguments.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete. Use the module 'getopt-posix' or 'getopt-gnu' instead.
+
+Files:
+
+Depends-on:
+getopt-gnu
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+<getopt.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/getopt-gnu b/gnulib/modules/getopt-gnu
new file mode 100644
index 00000000..34aea2df
--- /dev/null
+++ b/gnulib/modules/getopt-gnu
@@ -0,0 +1,23 @@
+Description:
+GNU-like getopt() function, getopt_long() function, getopt_long_only() function:
+process command line arguments.
+
+Files:
+
+Depends-on:
+getopt-posix
+
+configure.ac:
+gl_FUNC_GETOPT_GNU
+gl_MODULE_INDICATOR([getopt-gnu])
+
+Makefile.am:
+
+Include:
+<getopt.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/getopt-posix b/gnulib/modules/getopt-posix
new file mode 100644
index 00000000..a3ae9f13
--- /dev/null
+++ b/gnulib/modules/getopt-posix
@@ -0,0 +1,46 @@
+Description:
+getopt() function: process command line arguments.
+
+Files:
+lib/getopt.in.h
+lib/getopt.c
+lib/getopt1.c
+lib/getopt_int.h
+m4/getopt.m4
+
+Depends-on:
+gettext-h
+unistd
+extensions
+include_next
+arg-nonnull
+
+configure.ac:
+gl_FUNC_GETOPT_POSIX
+
+Makefile.am:
+BUILT_SOURCES += $(GETOPT_H)
+
+# We need the following in order to create <getopt.h> when the system
+# doesn't have one that works with the given compiler.
+getopt.h: getopt.in.h $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_GETOPT_H''@|$(HAVE_GETOPT_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ < $(srcdir)/getopt.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += getopt.h getopt.h-t
+
+Include:
+<unistd.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/getopt-posix-tests b/gnulib/modules/getopt-posix-tests
new file mode 100644
index 00000000..9c73d08b
--- /dev/null
+++ b/gnulib/modules/getopt-posix-tests
@@ -0,0 +1,20 @@
+Files:
+tests/macros.h
+tests/signature.h
+tests/test-getopt.c
+tests/test-getopt.h
+tests/test-getopt_long.h
+
+Depends-on:
+dup2
+setenv
+stdbool
+unistd
+unsetenv
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-getopt
+check_PROGRAMS += test-getopt
+test_getopt_LDADD = $(LDADD) $(LIBINTL)
diff --git a/gnulib/modules/getpagesize b/gnulib/modules/getpagesize
new file mode 100644
index 00000000..6ad16208
--- /dev/null
+++ b/gnulib/modules/getpagesize
@@ -0,0 +1,24 @@
+Description:
+getpagesize() function: Return memory page size.
+
+Files:
+lib/getpagesize.c
+m4/getpagesize.m4
+
+Depends-on:
+unistd
+
+configure.ac:
+gl_FUNC_GETPAGESIZE
+gl_UNISTD_MODULE_INDICATOR([getpagesize])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/getpass b/gnulib/modules/getpass
new file mode 100644
index 00000000..7dba7e6b
--- /dev/null
+++ b/gnulib/modules/getpass
@@ -0,0 +1,27 @@
+Description:
+getpass() function: read a password from /dev/tty.
+
+Files:
+lib/getpass.h
+lib/getpass.c
+m4/getpass.m4
+
+Depends-on:
+fseeko
+getline
+stdbool
+strdup-posix
+
+configure.ac:
+gl_FUNC_GETPASS
+
+Makefile.am:
+
+Include:
+"getpass.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/getpass-gnu b/gnulib/modules/getpass-gnu
new file mode 100644
index 00000000..92e2d798
--- /dev/null
+++ b/gnulib/modules/getpass-gnu
@@ -0,0 +1,26 @@
+Description:
+getpass() function: read a password of arbitrary length from /dev/tty.
+
+Files:
+lib/getpass.h
+lib/getpass.c
+m4/getpass.m4
+
+Depends-on:
+fseeko
+getline
+stdbool
+
+configure.ac:
+gl_FUNC_GETPASS_GNU
+
+Makefile.am:
+
+Include:
+"getpass.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/getpeername b/gnulib/modules/getpeername
new file mode 100644
index 00000000..a8a4fcaf
--- /dev/null
+++ b/gnulib/modules/getpeername
@@ -0,0 +1,29 @@
+Description:
+getpeername() function: return information about the remote end of a connected
+socket.
+
+Files:
+lib/getpeername.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([getpeername])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([getpeername])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/getsockname b/gnulib/modules/getsockname
new file mode 100644
index 00000000..a7f8881c
--- /dev/null
+++ b/gnulib/modules/getsockname
@@ -0,0 +1,29 @@
+Description:
+getsockname() function: return information about the local end of a connected
+socket.
+
+Files:
+lib/getsockname.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([getsockname])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([getsockname])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/getsockopt b/gnulib/modules/getsockopt
new file mode 100644
index 00000000..85b04c04
--- /dev/null
+++ b/gnulib/modules/getsockopt
@@ -0,0 +1,30 @@
+Description:
+getsockopt() function: retrieve optional settings on a socket.
+
+Files:
+lib/getsockopt.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+sys_time
+socklen
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([getsockopt])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([getsockopt])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/getsubopt b/gnulib/modules/getsubopt
new file mode 100644
index 00000000..a28e2a0a
--- /dev/null
+++ b/gnulib/modules/getsubopt
@@ -0,0 +1,27 @@
+Description:
+getsubopt: Parse comma separated list into words.
+
+Files:
+lib/getsubopt.c
+m4/getsubopt.m4
+
+Depends-on:
+extensions
+strchrnul
+stdlib
+memchr
+
+configure.ac:
+gl_FUNC_GETSUBOPT
+gl_STDLIB_MODULE_INDICATOR([getsubopt])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/gettext b/gnulib/modules/gettext
new file mode 100644
index 00000000..5278b401
--- /dev/null
+++ b/gnulib/modules/gettext
@@ -0,0 +1,64 @@
+Description:
+Translate messages to user's native language.
+
+Files:
+m4/codeset.m4
+m4/gettext.m4
+m4/glibc2.m4
+m4/glibc21.m4
+m4/iconv.m4
+m4/intdiv0.m4
+m4/intl.m4
+m4/intldir.m4
+m4/intlmacosx.m4
+m4/intmax.m4
+m4/inttypes_h.m4
+m4/inttypes-pri.m4
+m4/lcmessage.m4
+m4/lock.m4
+m4/longlong.m4
+m4/nls.m4
+m4/po.m4
+m4/printf-posix.m4
+m4/progtest.m4
+m4/size_max.m4
+m4/stdint_h.m4
+m4/threadlib.m4
+m4/uintmax_t.m4
+m4/visibility.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/xsize.m4
+build-aux/config.rpath
+
+Depends-on:
+extensions
+gettext-h
+havelib
+
+configure.ac:
+AM_GNU_GETTEXT([external])
+AM_GNU_GETTEXT_VERSION([0.17])
+
+Makefile.am:
+# This is for those projects which use "gettextize --intl" to put a source-code
+# copy of libintl into their package. In such projects, every Makefile.am needs
+# -I$(top_builddir)/intl, so that <libintl.h> can be found in this directory.
+# For the Makefile.ams in other directories it is the maintainer's
+# responsibility; for the one from gnulib we do it here.
+# This option has no effect when the user disables NLS (because then the intl
+# directory contains no libintl.h file) or when the project does not use
+# "gettextize --intl".
+AM_CPPFLAGS += -I$(top_builddir)/intl
+
+Include:
+"gettext.h"
+
+Link:
+$(LTLIBINTL) when linking with libtool, $(LIBINTL) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/gettext-h b/gnulib/modules/gettext-h
new file mode 100644
index 00000000..a3dd23f9
--- /dev/null
+++ b/gnulib/modules/gettext-h
@@ -0,0 +1,26 @@
+Description:
+Translate messages to user's native language if the gettext module is also used.
+
+Files:
+lib/gettext.h
+
+Depends-on:
+
+configure.ac:
+AC_SUBST([LIBINTL])
+AC_SUBST([LTLIBINTL])
+
+Makefile.am:
+lib_SOURCES += gettext.h
+
+Include:
+"gettext.h"
+
+Link:
+$(LTLIBINTL) when linking with libtool, $(LIBINTL) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/gettime b/gnulib/modules/gettime
new file mode 100644
index 00000000..988d2933
--- /dev/null
+++ b/gnulib/modules/gettime
@@ -0,0 +1,30 @@
+Description:
+Return current time, with nanosecond resolution.
+
+Files:
+lib/gettime.c
+m4/gettime.m4
+
+Depends-on:
+clock-time
+gettimeofday
+sys_time
+timespec
+extensions
+
+configure.ac:
+gl_GETTIME
+
+Makefile.am:
+
+Include:
+"timespec.h"
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/gettimeofday b/gnulib/modules/gettimeofday
new file mode 100644
index 00000000..979f601d
--- /dev/null
+++ b/gnulib/modules/gettimeofday
@@ -0,0 +1,24 @@
+Description:
+gettimeofday() function: return current time.
+
+Files:
+lib/gettimeofday.c
+m4/gettimeofday.m4
+
+Depends-on:
+sys_time
+
+configure.ac:
+gl_FUNC_GETTIMEOFDAY
+gl_SYS_TIME_MODULE_INDICATOR([gettimeofday])
+
+Makefile.am:
+
+Include:
+<sys/time.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/gettimeofday-tests b/gnulib/modules/gettimeofday-tests
new file mode 100644
index 00000000..996df8e7
--- /dev/null
+++ b/gnulib/modules/gettimeofday-tests
@@ -0,0 +1,12 @@
+Files:
+tests/signature.h
+tests/test-gettimeofday.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-gettimeofday
+check_PROGRAMS += test-gettimeofday
+
diff --git a/gnulib/modules/getugroups b/gnulib/modules/getugroups
new file mode 100644
index 00000000..0cd52b29
--- /dev/null
+++ b/gnulib/modules/getugroups
@@ -0,0 +1,23 @@
+Description:
+Return the group IDs of a user.
+
+Files:
+lib/getugroups.c
+lib/getugroups.h
+m4/getugroups.m4
+
+Depends-on:
+errno
+
+configure.ac:
+gl_GETUGROUPS
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/getusershell b/gnulib/modules/getusershell
new file mode 100644
index 00000000..9ae7dcae
--- /dev/null
+++ b/gnulib/modules/getusershell
@@ -0,0 +1,27 @@
+Description:
+Return names of valid user shells.
+
+Files:
+lib/getusershell.c
+m4/getusershell.m4
+
+Depends-on:
+unistd
+extensions
+fopen-safer
+xalloc
+
+configure.ac:
+gl_FUNC_GETUSERSHELL
+gl_UNISTD_MODULE_INDICATOR([getusershell])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/git-merge-changelog b/gnulib/modules/git-merge-changelog
new file mode 100644
index 00000000..d0e2ad02
--- /dev/null
+++ b/gnulib/modules/git-merge-changelog
@@ -0,0 +1,40 @@
+Description:
+git "merge" driver for GNU style ChangeLog files
+
+Files:
+lib/git-merge-changelog.c
+
+Depends-on:
+getopt-gnu
+stdbool
+progname
+error
+read-file
+xlist
+array-list
+linkedhash-list
+linked-list
+rbtreehash-list
+xalloc
+xmalloca
+fstrcmp
+minmax
+c-strstr
+fwriteerror
+memchr
+memcmp
+
+configure.ac:
+
+Makefile.am:
+bin_PROGRAMS = git-merge-changelog
+git_merge_changelog_LDADD = libgnu.a @LIBINTL@ $(LIBTHREAD)
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/git-version-gen b/gnulib/modules/git-version-gen
new file mode 100644
index 00000000..a783ac57
--- /dev/null
+++ b/gnulib/modules/git-version-gen
@@ -0,0 +1,19 @@
+Description:
+Compute a version string from a git repository.
+
+Files:
+build-aux/git-version-gen
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+coreutils
diff --git a/gnulib/modules/gitlog-to-changelog b/gnulib/modules/gitlog-to-changelog
new file mode 100644
index 00000000..4b403341
--- /dev/null
+++ b/gnulib/modules/gitlog-to-changelog
@@ -0,0 +1,19 @@
+Description:
+Convert git log to ChangeLog
+
+Files:
+build-aux/gitlog-to-changelog
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/glob b/gnulib/modules/glob
new file mode 100644
index 00000000..204ba488
--- /dev/null
+++ b/gnulib/modules/glob
@@ -0,0 +1,52 @@
+Description:
+glob() function: Search for files and directories with paths matching a
+pattern, with GNU extensions.
+
+Files:
+lib/glob.in.h
+lib/glob-libc.h
+lib/glob.c
+m4/glob.m4
+
+Depends-on:
+alloca
+arg-nonnull
+d-type
+dirfd
+extensions
+fnmatch
+getlogin_r
+memchr
+mempcpy
+stdbool
+strdup
+sys_stat
+unistd
+malloc-posix
+
+configure.ac:
+gl_GLOB
+
+Makefile.am:
+BUILT_SOURCES += $(GLOB_H)
+
+# We need the following in order to create <glob.h> when the system
+# doesn't have one that works with the given compiler.
+glob.h: glob.in.h $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SYS_CDEFS_H''@|$(HAVE_SYS_CDEFS_H)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ < $(srcdir)/glob.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += glob.h glob.h-t
+
+Include:
+<glob.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/glob-tests b/gnulib/modules/glob-tests
new file mode 100644
index 00000000..3cf2c901
--- /dev/null
+++ b/gnulib/modules/glob-tests
@@ -0,0 +1,8 @@
+Files:
+tests/test-glob.c
+tests/signature.h
+tests/macros.h
+
+Makefile.am:
+TESTS += test-glob
+check_PROGRAMS += test-glob
diff --git a/gnulib/modules/gnu-make b/gnulib/modules/gnu-make
new file mode 100644
index 00000000..6d1c63a2
--- /dev/null
+++ b/gnulib/modules/gnu-make
@@ -0,0 +1,28 @@
+Description:
+Determine whether recent-enough GNU Make is being used.
+
+Files:
+m4/gnu-make.m4
+
+Depends-on:
+
+configure.ac:
+gl_GNU_MAKE
+
+Makefile.am:
+##Sample usage of gnu-make module:
+#if GNU_MAKE
+# [nicer features that work only with GNU Make]
+#else
+# [fallback features that work in any 'make' implementation; see
+# http://www.opengroup.org/susv3/utilities/make.html
+# for the 2004 POSIX specification]
+#endif
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/gnu-web-doc-update b/gnulib/modules/gnu-web-doc-update
new file mode 100644
index 00000000..5b3e8ac3
--- /dev/null
+++ b/gnulib/modules/gnu-web-doc-update
@@ -0,0 +1,20 @@
+Description:
+update the official GNU web documentation for your project
+
+Files:
+build-aux/gnu-web-doc-update
+
+Depends-on:
+gendocs
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+coreutils
diff --git a/gnulib/modules/gnumakefile b/gnulib/modules/gnumakefile
new file mode 100644
index 00000000..483ff74d
--- /dev/null
+++ b/gnulib/modules/gnumakefile
@@ -0,0 +1,32 @@
+Description:
+Add GNU-make specific rules for maintainer use.
+
+Files:
+top/GNUmakefile
+
+Depends-on:
+
+configure.ac:
+# Autoconf 2.61a.99 and earlier don't support linking a file only
+# in VPATH builds. But since GNUmakefile is for maintainer use
+# only, it does not matter if we skip the link with older autoconf.
+# Automake 1.10.1 and earlier try to remove GNUmakefile in non-VPATH
+# builds, so use a shell variable to bypass this.
+GNUmakefile=GNUmakefile
+m4_if(m4_version_compare([2.61a.100],
+ m4_defn([m4_PACKAGE_VERSION])), [1], [],
+ [AC_CONFIG_LINKS([$GNUmakefile:$GNUmakefile], [],
+ [GNUmakefile=$GNUmakefile])])
+
+Makefile.am:
+distclean-local: clean-GNUmakefile
+clean-GNUmakefile:
+ test x'$(VPATH)' != x && rm -f $(top_builddir)/GNUmakefile || :
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+coreutils
diff --git a/gnulib/modules/gnupload b/gnulib/modules/gnupload
new file mode 100644
index 00000000..6db4455d
--- /dev/null
+++ b/gnulib/modules/gnupload
@@ -0,0 +1,21 @@
+Description:
+Upload PGP signed files to gnu.org.
+See http://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html
+for more information.
+
+Files:
+build-aux/gnupload
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+coreutils
diff --git a/gnulib/modules/gperf b/gnulib/modules/gperf
new file mode 100644
index 00000000..4bc48b52
--- /dev/null
+++ b/gnulib/modules/gperf
@@ -0,0 +1,20 @@
+Description:
+Provides the GNU gperf build tool.
+
+Files:
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+GPERF = gperf
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/gpl-2.0 b/gnulib/modules/gpl-2.0
new file mode 100644
index 00000000..8633a5c4
--- /dev/null
+++ b/gnulib/modules/gpl-2.0
@@ -0,0 +1,19 @@
+Description:
+Provide the GNU General Public License version 2.0 in Texinfo format.
+
+Files:
+doc/gpl-2.0.texi
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unmodifiable license text
+
+Maintainer:
+all
diff --git a/gnulib/modules/gpl-3.0 b/gnulib/modules/gpl-3.0
new file mode 100644
index 00000000..95deef88
--- /dev/null
+++ b/gnulib/modules/gpl-3.0
@@ -0,0 +1,19 @@
+Description:
+Provide the GNU General Public License version 3.0 in Texinfo format.
+
+Files:
+doc/gpl-3.0.texi
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unmodifiable license text
+
+Maintainer:
+all
diff --git a/gnulib/modules/group-member b/gnulib/modules/group-member
new file mode 100644
index 00000000..20075dd6
--- /dev/null
+++ b/gnulib/modules/group-member
@@ -0,0 +1,27 @@
+Description:
+Determine whether the current process has the permissions of a given group ID.
+
+Files:
+lib/group-member.h
+lib/group-member.c
+m4/group-member.m4
+
+Depends-on:
+extensions
+getgroups
+xalloc
+stdbool
+
+configure.ac:
+gl_FUNC_GROUP_MEMBER
+
+Makefile.am:
+
+Include:
+"group-member.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/hard-locale b/gnulib/modules/hard-locale
new file mode 100644
index 00000000..2f9810ad
--- /dev/null
+++ b/gnulib/modules/hard-locale
@@ -0,0 +1,25 @@
+Description:
+Determine whether the current locale is different from the "C" locale.
+
+Files:
+lib/hard-locale.h
+lib/hard-locale.c
+m4/hard-locale.m4
+
+Depends-on:
+stdbool
+strdup
+
+configure.ac:
+gl_HARD_LOCALE
+
+Makefile.am:
+
+Include:
+"hard-locale.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/hash b/gnulib/modules/hash
new file mode 100644
index 00000000..75a99da3
--- /dev/null
+++ b/gnulib/modules/hash
@@ -0,0 +1,27 @@
+Description:
+Parametrizable hash table.
+
+Files:
+lib/hash.c
+lib/hash.h
+m4/hash.m4
+
+Depends-on:
+bitrotate
+stdbool
+stdint
+xalloc
+
+configure.ac:
+gl_HASH
+
+Makefile.am:
+
+Include:
+"hash.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/hash-pjw b/gnulib/modules/hash-pjw
new file mode 100644
index 00000000..2fa6edb3
--- /dev/null
+++ b/gnulib/modules/hash-pjw
@@ -0,0 +1,23 @@
+Description:
+Compute a hash value for a NUL-terminated string.
+
+Files:
+lib/hash-pjw.h
+lib/hash-pjw.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += hash-pjw.h hash-pjw.c
+
+Include:
+"hash-pjw.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/hash-tests b/gnulib/modules/hash-tests
new file mode 100644
index 00000000..a77bfe7d
--- /dev/null
+++ b/gnulib/modules/hash-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-hash.c
+tests/macros.h
+
+Depends-on:
+hash-pjw
+inttostr
+progname
+stdbool
+xalloc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-hash
+check_PROGRAMS += test-hash
+test_hash_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/hash-triple b/gnulib/modules/hash-triple
new file mode 100644
index 00000000..b746d475
--- /dev/null
+++ b/gnulib/modules/hash-triple
@@ -0,0 +1,25 @@
+Description:
+Hash functions for file-related triples: name, device, inode.
+
+Files:
+lib/hash-triple.c
+lib/hash-triple.h
+
+Depends-on:
+hash-pjw
+same
+same-inode
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += hash-triple.c
+
+Include:
+"hash-triple.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/havelib b/gnulib/modules/havelib
new file mode 100644
index 00000000..fb274f9e
--- /dev/null
+++ b/gnulib/modules/havelib
@@ -0,0 +1,22 @@
+Description:
+Macros to search for libraries.
+
+Files:
+m4/lib-ld.m4
+m4/lib-link.m4
+m4/lib-prefix.m4
+build-aux/config.rpath
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/host-os b/gnulib/modules/host-os
new file mode 100644
index 00000000..12692dbf
--- /dev/null
+++ b/gnulib/modules/host-os
@@ -0,0 +1,20 @@
+Description:
+Define HOST_OPERATING_SYSTEM to a name for the host operating system.
+
+Files:
+m4/host-os.m4
+
+Depends-on:
+
+configure.ac:
+gl_HOST_OS
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/hostent b/gnulib/modules/hostent
new file mode 100644
index 00000000..029b457a
--- /dev/null
+++ b/gnulib/modules/hostent
@@ -0,0 +1,27 @@
+Description:
+Library containing gethostent(), sethostent(), endhostent(), gethostbyname(),
+gethostbyaddr().
+
+Files:
+m4/hostent.m4
+
+Depends-on:
+sys_socket
+
+configure.ac:
+gl_HOSTENT
+
+Makefile.am:
+
+Include:
+<netdb.h>
+
+Link:
+$(HOSTENT_LIB)
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible, Simon Josefsson
+
diff --git a/gnulib/modules/human b/gnulib/modules/human
new file mode 100644
index 00000000..2216ca4e
--- /dev/null
+++ b/gnulib/modules/human
@@ -0,0 +1,31 @@
+Description:
+Convert a number (usually a file size) to a human readable string, possibly
+with K/M/G suffix.
+
+Files:
+lib/human.h
+lib/human.c
+m4/human.m4
+
+Depends-on:
+argmatch
+error
+intprops
+memmove
+xstrtoumax
+stdbool
+stdint
+
+configure.ac:
+gl_HUMAN
+
+Makefile.am:
+
+Include:
+"human.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/hypot b/gnulib/modules/hypot
new file mode 100644
index 00000000..fc13752c
--- /dev/null
+++ b/gnulib/modules/hypot
@@ -0,0 +1,24 @@
+Description:
+hypot() function: length of a vector in the plane.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([hypot])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(HYPOT_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/hypot-tests b/gnulib/modules/hypot-tests
new file mode 100644
index 00000000..f4b65d05
--- /dev/null
+++ b/gnulib/modules/hypot-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-hypot.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-hypot
+check_PROGRAMS += test-hypot
+test_hypot_LDADD = $(LDADD) @HYPOT_LIBM@
diff --git a/gnulib/modules/i-ring b/gnulib/modules/i-ring
new file mode 100644
index 00000000..20503ab4
--- /dev/null
+++ b/gnulib/modules/i-ring
@@ -0,0 +1,25 @@
+Description:
+a simple ring buffer
+
+Files:
+lib/i-ring.h
+lib/i-ring.c
+m4/i-ring.m4
+
+Depends-on:
+stdbool
+verify
+
+configure.ac:
+gl_I_RING
+
+Makefile.am:
+
+Include:
+"i-ring.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/i-ring-tests b/gnulib/modules/i-ring-tests
new file mode 100644
index 00000000..96361c92
--- /dev/null
+++ b/gnulib/modules/i-ring-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-i-ring.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-i-ring
+check_PROGRAMS += test-i-ring
diff --git a/gnulib/modules/iconv b/gnulib/modules/iconv
new file mode 100644
index 00000000..5d81aa3d
--- /dev/null
+++ b/gnulib/modules/iconv
@@ -0,0 +1,28 @@
+Description:
+Character set conversion.
+
+Files:
+m4/iconv.m4
+
+Depends-on:
+havelib
+
+configure.ac:
+AM_ICONV
+
+Makefile.am:
+
+Include:
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+Link:
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/iconv-tests b/gnulib/modules/iconv-tests
new file mode 100644
index 00000000..91e17f0c
--- /dev/null
+++ b/gnulib/modules/iconv-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-iconv.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-iconv
+check_PROGRAMS += test-iconv
+test_iconv_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/iconv_open b/gnulib/modules/iconv_open
new file mode 100644
index 00000000..ab92f0c8
--- /dev/null
+++ b/gnulib/modules/iconv_open
@@ -0,0 +1,78 @@
+Description:
+Character set conversion.
+
+Files:
+lib/iconv.in.h
+lib/iconv_open.c
+lib/iconv_open-aix.gperf
+lib/iconv_open-hpux.gperf
+lib/iconv_open-irix.gperf
+lib/iconv_open-osf.gperf
+lib/iconv_open-solaris.gperf
+m4/iconv_h.m4
+m4/iconv_open.m4
+
+Depends-on:
+gperf
+include_next
+arg-nonnull
+iconv
+c-ctype
+c-strcase
+
+configure.ac:
+gl_ICONV_H
+gl_FUNC_ICONV_OPEN
+
+Makefile.am:
+BUILT_SOURCES += $(ICONV_H)
+
+# We need the following in order to create <iconv.h> when the system
+# doesn't have one that works with the given compiler.
+iconv.h: iconv.in.h $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_ICONV_H''@|$(NEXT_ICONV_H)|g' \
+ -e 's|@''ICONV_CONST''@|$(ICONV_CONST)|g' \
+ -e 's|@''REPLACE_ICONV''@|$(REPLACE_ICONV)|g' \
+ -e 's|@''REPLACE_ICONV_OPEN''@|$(REPLACE_ICONV_OPEN)|g' \
+ -e 's|@''REPLACE_ICONV_UTF''@|$(REPLACE_ICONV_UTF)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ < $(srcdir)/iconv.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += iconv.h iconv.h-t
+
+iconv_open-aix.h: iconv_open-aix.gperf
+ $(GPERF) -m 10 $(srcdir)/iconv_open-aix.gperf > $(srcdir)/iconv_open-aix.h-t
+ mv $(srcdir)/iconv_open-aix.h-t $(srcdir)/iconv_open-aix.h
+iconv_open-hpux.h: iconv_open-hpux.gperf
+ $(GPERF) -m 10 $(srcdir)/iconv_open-hpux.gperf > $(srcdir)/iconv_open-hpux.h-t
+ mv $(srcdir)/iconv_open-hpux.h-t $(srcdir)/iconv_open-hpux.h
+iconv_open-irix.h: iconv_open-irix.gperf
+ $(GPERF) -m 10 $(srcdir)/iconv_open-irix.gperf > $(srcdir)/iconv_open-irix.h-t
+ mv $(srcdir)/iconv_open-irix.h-t $(srcdir)/iconv_open-irix.h
+iconv_open-osf.h: iconv_open-osf.gperf
+ $(GPERF) -m 10 $(srcdir)/iconv_open-osf.gperf > $(srcdir)/iconv_open-osf.h-t
+ mv $(srcdir)/iconv_open-osf.h-t $(srcdir)/iconv_open-osf.h
+iconv_open-solaris.h: iconv_open-solaris.gperf
+ $(GPERF) -m 10 $(srcdir)/iconv_open-solaris.gperf > $(srcdir)/iconv_open-solaris.h-t
+ mv $(srcdir)/iconv_open-solaris.h-t $(srcdir)/iconv_open-solaris.h
+BUILT_SOURCES += iconv_open-aix.h iconv_open-hpux.h iconv_open-irix.h iconv_open-osf.h iconv_open-solaris.h
+MOSTLYCLEANFILES += iconv_open-aix.h-t iconv_open-hpux.h-t iconv_open-irix.h-t iconv_open-osf.h-t iconv_open-solaris.h-t
+MAINTAINERCLEANFILES += iconv_open-aix.h iconv_open-hpux.h iconv_open-irix.h iconv_open-osf.h iconv_open-solaris.h
+EXTRA_DIST += iconv_open-aix.h iconv_open-hpux.h iconv_open-irix.h iconv_open-osf.h iconv_open-solaris.h
+
+Include:
+<iconv.h>
+
+Link:
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/iconv_open-utf b/gnulib/modules/iconv_open-utf
new file mode 100644
index 00000000..be6ff9f4
--- /dev/null
+++ b/gnulib/modules/iconv_open-utf
@@ -0,0 +1,29 @@
+Description:
+Character set conversion support for UTF-{16,32}{BE,LE} encodings.
+
+Files:
+lib/iconv.c
+lib/iconv_close.c
+m4/iconv_open.m4
+
+Depends-on:
+iconv_open
+stdint
+unistr/u8-mbtoucr
+unistr/u8-uctomb
+
+configure.ac:
+gl_FUNC_ICONV_OPEN_UTF
+
+Makefile.am:
+
+Include:
+
+Link:
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/iconv_open-utf-tests b/gnulib/modules/iconv_open-utf-tests
new file mode 100644
index 00000000..3e3c9883
--- /dev/null
+++ b/gnulib/modules/iconv_open-utf-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-iconv-utf.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-iconv-utf
+check_PROGRAMS += test-iconv-utf
+test_iconv_utf_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/idcache b/gnulib/modules/idcache
new file mode 100644
index 00000000..23486414
--- /dev/null
+++ b/gnulib/modules/idcache
@@ -0,0 +1,24 @@
+Description:
+Username <--> uid and groupname <--> gid conversions, with cache for speed.
+
+Files:
+lib/idcache.c
+lib/idcache.h
+m4/idcache.m4
+
+Depends-on:
+flexmember
+xalloc
+
+configure.ac:
+gl_IDCACHE
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/idpriv-drop b/gnulib/modules/idpriv-drop
new file mode 100644
index 00000000..19472fad
--- /dev/null
+++ b/gnulib/modules/idpriv-drop
@@ -0,0 +1,27 @@
+Description:
+Drop uid/gid privileges of the current process.
+
+Files:
+lib/idpriv.h
+lib/idpriv-drop.c
+m4/idpriv.m4
+
+Depends-on:
+unistd
+extensions
+
+configure.ac:
+gl_IDPRIV
+
+Makefile.am:
+lib_SOURCES += idpriv-drop.c
+
+Include:
+"idpriv.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/idpriv-drop-tests b/gnulib/modules/idpriv-drop-tests
new file mode 100644
index 00000000..18596b2d
--- /dev/null
+++ b/gnulib/modules/idpriv-drop-tests
@@ -0,0 +1,19 @@
+Notice:
+The 'idpriv-drop-tests' module asks the user for the root password. It is
+therefore not suitable for all environments. To disable it, pass option
+'--avoid=idpriv-drop-tests' to gnulib-tool.
+
+Files:
+tests/test-idpriv-drop.sh
+tests/test-idpriv-drop.su.sh
+tests/test-idpriv-drop.c
+tests/macros.h
+
+Depends-on:
+stdbool
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-idpriv-drop.sh
+check_PROGRAMS += test-idpriv-drop
diff --git a/gnulib/modules/idpriv-droptemp b/gnulib/modules/idpriv-droptemp
new file mode 100644
index 00000000..97b59c42
--- /dev/null
+++ b/gnulib/modules/idpriv-droptemp
@@ -0,0 +1,27 @@
+Description:
+Drop uid/gid privileges of the current process temporarily.
+
+Files:
+lib/idpriv.h
+lib/idpriv-droptemp.c
+m4/idpriv.m4
+
+Depends-on:
+unistd
+extensions
+
+configure.ac:
+gl_IDPRIV
+
+Makefile.am:
+lib_SOURCES += idpriv-droptemp.c
+
+Include:
+"idpriv.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/idpriv-droptemp-tests b/gnulib/modules/idpriv-droptemp-tests
new file mode 100644
index 00000000..44c3c4dc
--- /dev/null
+++ b/gnulib/modules/idpriv-droptemp-tests
@@ -0,0 +1,19 @@
+Notice:
+The 'idpriv-droptemp-tests' module asks the user for the root password. It is
+therefore not suitable for all environments. To disable it, pass option
+'--avoid=idpriv-droptemp-tests' to gnulib-tool.
+
+Files:
+tests/test-idpriv-droptemp.sh
+tests/test-idpriv-droptemp.su.sh
+tests/test-idpriv-droptemp.c
+tests/macros.h
+
+Depends-on:
+stdbool
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-idpriv-droptemp.sh
+check_PROGRAMS += test-idpriv-droptemp
diff --git a/gnulib/modules/ignore-value b/gnulib/modules/ignore-value
new file mode 100644
index 00000000..8d488634
--- /dev/null
+++ b/gnulib/modules/ignore-value
@@ -0,0 +1,22 @@
+Description:
+ignore a value to quiet a compiler warning
+
+Files:
+lib/ignore-value.h
+
+Depends-on:
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += ignore-value.h
+
+Include:
+"ignore-value.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/imaxabs b/gnulib/modules/imaxabs
new file mode 100644
index 00000000..481486d1
--- /dev/null
+++ b/gnulib/modules/imaxabs
@@ -0,0 +1,24 @@
+Description:
+imaxabs() function: absolute value of 'intmax_t'.
+
+Files:
+lib/imaxabs.c
+m4/imaxabs.m4
+
+Depends-on:
+inttypes
+
+configure.ac:
+gl_FUNC_IMAXABS
+gl_INTTYPES_MODULE_INDICATOR([imaxabs])
+
+Makefile.am:
+
+Include:
+<inttypes.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/imaxdiv b/gnulib/modules/imaxdiv
new file mode 100644
index 00000000..7eacbc75
--- /dev/null
+++ b/gnulib/modules/imaxdiv
@@ -0,0 +1,24 @@
+Description:
+imaxdiv() function: division of 'intmax_t'.
+
+Files:
+lib/imaxdiv.c
+m4/imaxdiv.m4
+
+Depends-on:
+inttypes
+
+configure.ac:
+gl_FUNC_IMAXDIV
+gl_INTTYPES_MODULE_INDICATOR([imaxdiv])
+
+Makefile.am:
+
+Include:
+<inttypes.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/include_next b/gnulib/modules/include_next
new file mode 100644
index 00000000..3d019289
--- /dev/null
+++ b/gnulib/modules/include_next
@@ -0,0 +1,19 @@
+Description:
+Allows wrapping a broken system header in a gnulib replacement.
+
+Files:
+m4/include_next.m4
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/inet_ntop b/gnulib/modules/inet_ntop
new file mode 100644
index 00000000..7e5c8dc7
--- /dev/null
+++ b/gnulib/modules/inet_ntop
@@ -0,0 +1,32 @@
+Description:
+Convert internet address from internal to printable, presentable format.
+
+Files:
+lib/inet_ntop.c
+m4/inet_ntop.m4
+
+Depends-on:
+socklen
+sys_socket
+arpa_inet
+errno
+netinet_in
+extensions
+
+configure.ac:
+gl_INET_NTOP
+gl_ARPA_INET_MODULE_INDICATOR([inet_ntop])
+
+Makefile.am:
+
+License:
+LGPLv2+
+
+Include:
+<arpa/inet.h>
+
+Link:
+$(INET_NTOP_LIB)
+
+Maintainer:
+Yoann Vandoorselaere, glibc
diff --git a/gnulib/modules/inet_ntop-tests b/gnulib/modules/inet_ntop-tests
new file mode 100644
index 00000000..cab3d51a
--- /dev/null
+++ b/gnulib/modules/inet_ntop-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-inet_ntop.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+netinet_in
+sys_socket
+
+configure.ac:
+AC_C_BIGENDIAN
+
+Makefile.am:
+TESTS += test-inet_ntop
+check_PROGRAMS += test-inet_ntop
+test_inet_ntop_LDADD = $(LDADD) @INET_NTOP_LIB@
diff --git a/gnulib/modules/inet_pton b/gnulib/modules/inet_pton
new file mode 100644
index 00000000..26007474
--- /dev/null
+++ b/gnulib/modules/inet_pton
@@ -0,0 +1,33 @@
+Description:
+Convert internet address from presentation to internal, binary, format.
+
+Files:
+lib/inet_pton.c
+m4/inet_pton.m4
+
+Depends-on:
+c-ctype
+socklen
+sys_socket
+arpa_inet
+errno
+netinet_in
+extensions
+
+configure.ac:
+gl_INET_PTON
+gl_ARPA_INET_MODULE_INDICATOR([inet_pton])
+
+Makefile.am:
+
+License:
+LGPLv2+
+
+Include:
+<arpa/inet.h>
+
+Link:
+$(INET_PTON_LIB)
+
+Maintainer:
+Simon Josefsson, glibc
diff --git a/gnulib/modules/inet_pton-tests b/gnulib/modules/inet_pton-tests
new file mode 100644
index 00000000..cc7408a6
--- /dev/null
+++ b/gnulib/modules/inet_pton-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-inet_pton.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+netinet_in
+sys_socket
+
+configure.ac:
+AC_C_BIGENDIAN
+
+Makefile.am:
+TESTS += test-inet_pton
+check_PROGRAMS += test-inet_pton
+test_inet_pton_LDADD = $(LDADD) @INET_PTON_LIB@
diff --git a/gnulib/modules/inline b/gnulib/modules/inline
new file mode 100644
index 00000000..484703b1
--- /dev/null
+++ b/gnulib/modules/inline
@@ -0,0 +1,21 @@
+Description:
+Test for the 'inline' keyword or equivalent and whether it is actually
+effective.
+
+Files:
+m4/inline.m4
+
+Depends-on:
+
+configure.ac:
+gl_INLINE
+
+Makefile.am:
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+all
diff --git a/gnulib/modules/intprops b/gnulib/modules/intprops
new file mode 100644
index 00000000..0680adf0
--- /dev/null
+++ b/gnulib/modules/intprops
@@ -0,0 +1,20 @@
+Description:
+Properties of integer types
+
+Files:
+lib/intprops.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"intprops.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/inttostr b/gnulib/modules/inttostr
new file mode 100644
index 00000000..2c2b76e5
--- /dev/null
+++ b/gnulib/modules/inttostr
@@ -0,0 +1,30 @@
+Description:
+Convert integers to printable strings.
+
+Files:
+lib/imaxtostr.c
+lib/inttostr.c
+lib/inttostr.h
+lib/offtostr.c
+lib/umaxtostr.c
+lib/uinttostr.c
+m4/inttostr.m4
+
+Depends-on:
+intprops
+stdint
+verify
+
+configure.ac:
+gl_INTTOSTR
+
+Makefile.am:
+
+Include:
+"inttostr.h"
+
+License:
+LGPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/inttypes b/gnulib/modules/inttypes
new file mode 100644
index 00000000..d0bbefc3
--- /dev/null
+++ b/gnulib/modules/inttypes
@@ -0,0 +1,62 @@
+Description:
+An <inttypes.h> that nearly conforms to C99.
+
+Files:
+lib/inttypes.in.h
+m4/inttypes-pri.m4
+m4/inttypes.m4
+
+Depends-on:
+arg-nonnull
+include_next
+multiarch
+stdint
+warn-on-use
+
+configure.ac:
+gl_INTTYPES_H
+
+Makefile.am:
+BUILT_SOURCES += inttypes.h
+
+# We need the following in order to create <inttypes.h> when the system
+# doesn't have one that works with the given compiler.
+inttypes.h: inttypes.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \
+ -e 's/@''PRI_MACROS_BROKEN''@/$(PRI_MACROS_BROKEN)/g' \
+ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+ -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
+ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \
+ -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \
+ -e 's/@''GNULIB_IMAXABS''@/$(GNULIB_IMAXABS)/g' \
+ -e 's/@''GNULIB_IMAXDIV''@/$(GNULIB_IMAXDIV)/g' \
+ -e 's/@''GNULIB_STRTOIMAX''@/$(GNULIB_STRTOIMAX)/g' \
+ -e 's/@''GNULIB_STRTOUMAX''@/$(GNULIB_STRTOUMAX)/g' \
+ -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \
+ -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \
+ -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \
+ -e 's/@''HAVE_DECL_STRTOUMAX''@/$(HAVE_DECL_STRTOUMAX)/g' \
+ -e 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \
+ -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \
+ -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \
+ -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/inttypes.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += inttypes.h inttypes.h-t
+
+Include:
+<inttypes.h>
+
+License:
+LGPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/inttypes-tests b/gnulib/modules/inttypes-tests
new file mode 100644
index 00000000..0f0727e9
--- /dev/null
+++ b/gnulib/modules/inttypes-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-inttypes.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-inttypes
+check_PROGRAMS += test-inttypes
diff --git a/gnulib/modules/ioctl b/gnulib/modules/ioctl
new file mode 100644
index 00000000..fbc8dc85
--- /dev/null
+++ b/gnulib/modules/ioctl
@@ -0,0 +1,34 @@
+Description:
+ioctl() function: issue device specific requests on files, devices, or sockets.
+
+Files:
+lib/ioctl.c
+lib/w32sock.h
+
+Depends-on:
+sys_ioctl
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ dnl Even if the 'socket' module is not used here, another part of the
+ dnl application may use it and pass file descriptors that refer to
+ dnl sockets to the ioctl() function. So enable the support for sockets.
+ AC_LIBOBJ([ioctl])
+ gl_REPLACE_SYS_IOCTL_H
+fi
+gl_SYS_IOCTL_MODULE_INDICATOR([ioctl])
+gl_MODULE_INDICATOR([ioctl])
+
+Makefile.am:
+
+Include:
+<sys/ioctl.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson, Bruno Haible
diff --git a/gnulib/modules/isapipe b/gnulib/modules/isapipe
new file mode 100644
index 00000000..6352af45
--- /dev/null
+++ b/gnulib/modules/isapipe
@@ -0,0 +1,26 @@
+Description:
+Test whether a file descriptor is a pipe.
+
+Files:
+lib/isapipe.c
+lib/isapipe.h
+m4/isapipe.m4
+
+Depends-on:
+stdbool
+sys_stat
+unistd
+
+configure.ac:
+gl_ISAPIPE
+
+Makefile.am:
+
+Include:
+"isapipe.h"
+
+License:
+LGPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/isblank b/gnulib/modules/isblank
new file mode 100644
index 00000000..6dbb371f
--- /dev/null
+++ b/gnulib/modules/isblank
@@ -0,0 +1,25 @@
+Description:
+isblank() function: test whether a single-byte character is a blank.
+
+Files:
+lib/isblank.c
+m4/isblank.m4
+
+Depends-on:
+extensions
+ctype
+
+configure.ac:
+gl_FUNC_ISBLANK
+gl_CTYPE_MODULE_INDICATOR([isblank])
+
+Makefile.am:
+
+Include:
+<ctype.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/isblank-tests b/gnulib/modules/isblank-tests
new file mode 100644
index 00000000..43d29ade
--- /dev/null
+++ b/gnulib/modules/isblank-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-isblank.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-isblank
+check_PROGRAMS += test-isblank
diff --git a/gnulib/modules/isdir b/gnulib/modules/isdir
new file mode 100644
index 00000000..aab5f841
--- /dev/null
+++ b/gnulib/modules/isdir
@@ -0,0 +1,22 @@
+Description:
+Determine whether a directory exists.
+
+Files:
+lib/isdir.c
+lib/isdir.h
+
+Depends-on:
+stat
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += isdir.c
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/isfinite b/gnulib/modules/isfinite
new file mode 100644
index 00000000..f122c5ad
--- /dev/null
+++ b/gnulib/modules/isfinite
@@ -0,0 +1,29 @@
+Description:
+isfinite macro: test for finite value (zero, subnormal, or normal, and not infinite or NaN).
+
+Files:
+lib/isfinite.c
+m4/isfinite.m4
+m4/check-math-lib.m4
+
+Depends-on:
+isnanf-nolibm
+isnand-nolibm
+isnanl-nolibm
+math
+extensions
+
+configure.ac:
+gl_ISFINITE
+gl_MATH_MODULE_INDICATOR([isfinite])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+License:
+GPL
+
+Maintainer:
+Ben Pfaff
diff --git a/gnulib/modules/isfinite-tests b/gnulib/modules/isfinite-tests
new file mode 100644
index 00000000..d4940690
--- /dev/null
+++ b/gnulib/modules/isfinite-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-isfinite.c
+tests/macros.h
+
+Depends-on:
+float
+
+configure.ac:
+gl_FLOAT_EXPONENT_LOCATION
+gl_DOUBLE_EXPONENT_LOCATION
+gl_LONG_DOUBLE_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isfinite
+check_PROGRAMS += test-isfinite
+test_isfinite_LDADD = $(LDADD) @ISFINITE_LIBM@
diff --git a/gnulib/modules/isinf b/gnulib/modules/isinf
new file mode 100644
index 00000000..c5e4dbd0
--- /dev/null
+++ b/gnulib/modules/isinf
@@ -0,0 +1,27 @@
+Description:
+isinf macro: test for positive or negative infinity
+
+Files:
+lib/isinf.c
+m4/isinf.m4
+m4/check-math-lib.m4
+
+Depends-on:
+float
+math
+extensions
+
+configure.ac:
+gl_ISINF
+gl_MATH_MODULE_INDICATOR([isinf])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+License:
+GPL
+
+Maintainer:
+Ben Pfaff
diff --git a/gnulib/modules/isinf-tests b/gnulib/modules/isinf-tests
new file mode 100644
index 00000000..f577aa9e
--- /dev/null
+++ b/gnulib/modules/isinf-tests
@@ -0,0 +1,19 @@
+Files:
+m4/exponentf.m4
+m4/exponentd.m4
+m4/exponentl.m4
+tests/test-isinf.c
+tests/macros.h
+
+Depends-on:
+float
+
+configure.ac:
+gl_FLOAT_EXPONENT_LOCATION
+gl_DOUBLE_EXPONENT_LOCATION
+gl_LONG_DOUBLE_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isinf
+check_PROGRAMS += test-isinf
+test_isinf_LDADD = $(LDADD) @ISINF_LIBM@
diff --git a/gnulib/modules/isnan b/gnulib/modules/isnan
new file mode 100644
index 00000000..16972faa
--- /dev/null
+++ b/gnulib/modules/isnan
@@ -0,0 +1,27 @@
+Description:
+isnan macro: test for NaN value.
+
+Files:
+m4/isnan.m4
+
+Depends-on:
+isnanf
+isnand
+isnanl
+math
+extensions
+
+configure.ac:
+gl_ISNAN
+gl_MATH_MODULE_INDICATOR([isnan])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+License:
+GPL
+
+Maintainer:
+Ben Pfaff
diff --git a/gnulib/modules/isnan-tests b/gnulib/modules/isnan-tests
new file mode 100644
index 00000000..a63b7cfd
--- /dev/null
+++ b/gnulib/modules/isnan-tests
@@ -0,0 +1,18 @@
+Files:
+tests/test-isnan.c
+tests/nan.h
+tests/macros.h
+
+Depends-on:
+float
+
+configure.ac:
+gl_FLOAT_EXPONENT_LOCATION
+gl_DOUBLE_EXPONENT_LOCATION
+gl_LONG_DOUBLE_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isnan
+check_PROGRAMS += test-isnan
+test_isnan_LDADD = $(LDADD) @ISNAN_LIBM@
+
diff --git a/gnulib/modules/isnand b/gnulib/modules/isnand
new file mode 100644
index 00000000..c741769d
--- /dev/null
+++ b/gnulib/modules/isnand
@@ -0,0 +1,33 @@
+Description:
+isnand() function: test for NaN.
+
+Files:
+lib/isnand.c
+lib/isnan.c
+lib/float+.h
+m4/exponentd.m4
+m4/isnand.m4
+
+Depends-on:
+math
+fpieee
+memcmp
+
+configure.ac:
+gl_FUNC_ISNAND
+gl_MATH_MODULE_INDICATOR([isnand])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ISNAND_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/isnand-nolibm b/gnulib/modules/isnand-nolibm
new file mode 100644
index 00000000..eceabf72
--- /dev/null
+++ b/gnulib/modules/isnand-nolibm
@@ -0,0 +1,29 @@
+Description:
+isnand() function: test for NaN, without requiring libm.
+
+Files:
+lib/isnand-nolibm.h
+lib/isnand.c
+lib/isnan.c
+lib/float+.h
+m4/exponentd.m4
+m4/isnand.m4
+
+Depends-on:
+fpieee
+memcmp
+
+configure.ac:
+gl_FUNC_ISNAND_NO_LIBM
+
+Makefile.am:
+
+Include:
+"isnand-nolibm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/isnand-nolibm-tests b/gnulib/modules/isnand-nolibm-tests
new file mode 100644
index 00000000..2ce8b6c5
--- /dev/null
+++ b/gnulib/modules/isnand-nolibm-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-isnand-nolibm.c
+tests/test-isnand.h
+tests/nan.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+gl_DOUBLE_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isnand-nolibm
+check_PROGRAMS += test-isnand-nolibm
+
diff --git a/gnulib/modules/isnand-tests b/gnulib/modules/isnand-tests
new file mode 100644
index 00000000..b9964cca
--- /dev/null
+++ b/gnulib/modules/isnand-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-isnand.c
+tests/test-isnand.h
+tests/nan.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+gl_DOUBLE_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isnand
+check_PROGRAMS += test-isnand
+test_isnand_LDADD = $(LDADD) @ISNAND_LIBM@
+
diff --git a/gnulib/modules/isnanf b/gnulib/modules/isnanf
new file mode 100644
index 00000000..6ac3968f
--- /dev/null
+++ b/gnulib/modules/isnanf
@@ -0,0 +1,33 @@
+Description:
+isnanf() function: test for NaN.
+
+Files:
+lib/isnanf.c
+lib/isnan.c
+lib/float+.h
+m4/exponentf.m4
+m4/isnanf.m4
+
+Depends-on:
+math
+fpieee
+memcmp
+
+configure.ac:
+gl_FUNC_ISNANF
+gl_MATH_MODULE_INDICATOR([isnanf])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ISNANF_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/isnanf-nolibm b/gnulib/modules/isnanf-nolibm
new file mode 100644
index 00000000..c178cc57
--- /dev/null
+++ b/gnulib/modules/isnanf-nolibm
@@ -0,0 +1,29 @@
+Description:
+isnanf() function: test for NaN, without requiring libm.
+
+Files:
+lib/isnanf-nolibm.h
+lib/isnanf.c
+lib/isnan.c
+lib/float+.h
+m4/exponentf.m4
+m4/isnanf.m4
+
+Depends-on:
+fpieee
+memcmp
+
+configure.ac:
+gl_FUNC_ISNANF_NO_LIBM
+
+Makefile.am:
+
+Include:
+"isnanf-nolibm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/isnanf-nolibm-tests b/gnulib/modules/isnanf-nolibm-tests
new file mode 100644
index 00000000..6aab7e07
--- /dev/null
+++ b/gnulib/modules/isnanf-nolibm-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-isnanf-nolibm.c
+tests/test-isnanf.h
+tests/nan.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+gl_FLOAT_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isnanf-nolibm
+check_PROGRAMS += test-isnanf-nolibm
+
diff --git a/gnulib/modules/isnanf-tests b/gnulib/modules/isnanf-tests
new file mode 100644
index 00000000..2c09485f
--- /dev/null
+++ b/gnulib/modules/isnanf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-isnanf.c
+tests/test-isnanf.h
+tests/nan.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+gl_FLOAT_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isnanf
+check_PROGRAMS += test-isnanf
+test_isnanf_LDADD = $(LDADD) @ISNANF_LIBM@
+
diff --git a/gnulib/modules/isnanl b/gnulib/modules/isnanl
new file mode 100644
index 00000000..8bad6f67
--- /dev/null
+++ b/gnulib/modules/isnanl
@@ -0,0 +1,34 @@
+Description:
+isnanl() function: test for NaN.
+
+Files:
+lib/isnanl.c
+lib/isnan.c
+lib/float+.h
+m4/exponentl.m4
+m4/isnanl.m4
+
+Depends-on:
+math
+float
+fpieee
+memcmp
+
+configure.ac:
+gl_FUNC_ISNANL
+gl_MATH_MODULE_INDICATOR([isnanl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ISNANL_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/isnanl-nolibm b/gnulib/modules/isnanl-nolibm
new file mode 100644
index 00000000..85823c91
--- /dev/null
+++ b/gnulib/modules/isnanl-nolibm
@@ -0,0 +1,30 @@
+Description:
+isnanl() function: test for NaN, without requiring libm.
+
+Files:
+lib/isnanl-nolibm.h
+lib/isnanl.c
+lib/isnan.c
+lib/float+.h
+m4/exponentl.m4
+m4/isnanl.m4
+
+Depends-on:
+float
+fpieee
+memcmp
+
+configure.ac:
+gl_FUNC_ISNANL_NO_LIBM
+
+Makefile.am:
+
+Include:
+"isnanl-nolibm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/isnanl-nolibm-tests b/gnulib/modules/isnanl-nolibm-tests
new file mode 100644
index 00000000..6d2f08e4
--- /dev/null
+++ b/gnulib/modules/isnanl-nolibm-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-isnanl-nolibm.c
+tests/test-isnanl.h
+tests/nan.h
+tests/macros.h
+
+Depends-on:
+float
+
+configure.ac:
+gl_LONG_DOUBLE_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isnanl-nolibm
+check_PROGRAMS += test-isnanl-nolibm
+
diff --git a/gnulib/modules/isnanl-tests b/gnulib/modules/isnanl-tests
new file mode 100644
index 00000000..5cff0dd7
--- /dev/null
+++ b/gnulib/modules/isnanl-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-isnanl.c
+tests/test-isnanl.h
+tests/nan.h
+tests/macros.h
+
+Depends-on:
+float
+
+configure.ac:
+gl_LONG_DOUBLE_EXPONENT_LOCATION
+
+Makefile.am:
+TESTS += test-isnanl
+check_PROGRAMS += test-isnanl
+test_isnanl_LDADD = $(LDADD) @ISNANL_LIBM@
+
diff --git a/gnulib/modules/j0 b/gnulib/modules/j0
new file mode 100644
index 00000000..b06d76df
--- /dev/null
+++ b/gnulib/modules/j0
@@ -0,0 +1,24 @@
+Description:
+j0() function: Bessel function of the first kind of order 0.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([j0])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(J0_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/j0-tests b/gnulib/modules/j0-tests
new file mode 100644
index 00000000..eec1438a
--- /dev/null
+++ b/gnulib/modules/j0-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-j0.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-j0
+check_PROGRAMS += test-j0
+test_j0_LDADD = $(LDADD) @J0_LIBM@
diff --git a/gnulib/modules/j1 b/gnulib/modules/j1
new file mode 100644
index 00000000..9c189142
--- /dev/null
+++ b/gnulib/modules/j1
@@ -0,0 +1,24 @@
+Description:
+j1() function: Bessel function of the first kind of order 1.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([j1])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(J1_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/j1-tests b/gnulib/modules/j1-tests
new file mode 100644
index 00000000..ad94ecd9
--- /dev/null
+++ b/gnulib/modules/j1-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-j1.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-j1
+check_PROGRAMS += test-j1
+test_j1_LDADD = $(LDADD) @J1_LIBM@
diff --git a/gnulib/modules/javacomp b/gnulib/modules/javacomp
new file mode 100644
index 00000000..3bc33b81
--- /dev/null
+++ b/gnulib/modules/javacomp
@@ -0,0 +1,45 @@
+Description:
+Compile a Java program.
+
+Files:
+lib/javacomp.h
+lib/javacomp.c
+
+Depends-on:
+stdbool
+unistd
+javaversion
+execute
+pipe
+wait-process
+classpath
+xsetenv
+sh-quote
+binary-io
+safe-read
+xalloc
+xmalloca
+getline
+xconcat-filename
+fwriteerror
+clean-temp
+error
+xvasprintf
+c-strstr
+gettext-h
+javacomp-script
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += javacomp.h javacomp.c
+
+Include:
+"javacomp.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/javacomp-script b/gnulib/modules/javacomp-script
new file mode 100644
index 00000000..eef87bf6
--- /dev/null
+++ b/gnulib/modules/javacomp-script
@@ -0,0 +1,21 @@
+Description:
+Script to compile a Java program.
+
+Files:
+build-aux/javacomp.sh.in
+m4/javacomp.m4
+
+Depends-on:
+
+configure.ac:
+# You need to invoke gt_JAVACOMP yourself, possibly with arguments.
+AC_CONFIG_FILES([javacomp.sh:build-aux/javacomp.sh.in])
+
+Makefile.am:
+
+License:
+GPLed build tool
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/javaexec b/gnulib/modules/javaexec
new file mode 100644
index 00000000..1e397a07
--- /dev/null
+++ b/gnulib/modules/javaexec
@@ -0,0 +1,35 @@
+Description:
+Execute a Java program.
+
+Files:
+lib/javaexec.h
+lib/javaexec.c
+
+Depends-on:
+stdbool
+execute
+classpath
+xsetenv
+sh-quote
+xconcat-filename
+xalloc
+xmalloca
+error
+gettext-h
+javaexec-script
+
+configure.ac:
+
+Makefile.am:
+DEFS += -DEXEEXT=\"@EXEEXT@\"
+lib_SOURCES += javaexec.h javaexec.c
+
+Include:
+"javaexec.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/javaexec-script b/gnulib/modules/javaexec-script
new file mode 100644
index 00000000..46492b49
--- /dev/null
+++ b/gnulib/modules/javaexec-script
@@ -0,0 +1,23 @@
+Description:
+Execute a Java program.
+
+Files:
+build-aux/javaexec.sh.in
+m4/javaexec.m4
+
+Depends-on:
+
+configure.ac:
+# You need to invoke gt_JAVAEXEC yourself, possibly with arguments.
+AC_CONFIG_FILES([javaexec.sh:build-aux/javaexec.sh.in])
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/javaversion b/gnulib/modules/javaversion
new file mode 100644
index 00000000..8011077d
--- /dev/null
+++ b/gnulib/modules/javaversion
@@ -0,0 +1,33 @@
+Description:
+Determine the Java version supported by javaexec.
+
+Files:
+lib/javaversion.h
+lib/javaversion.c
+lib/javaversion.java
+lib/javaversion.class
+
+Depends-on:
+javaexec
+stdbool
+pipe
+wait-process
+getline
+gettext-h
+configmake
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += javaversion.h javaversion.c
+pkgdata_DATA += javaversion.class
+
+Include:
+"javaversion.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/jn b/gnulib/modules/jn
new file mode 100644
index 00000000..adcc9b1a
--- /dev/null
+++ b/gnulib/modules/jn
@@ -0,0 +1,24 @@
+Description:
+jn() function: Bessel function of the first kind of order n.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([jn])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(JN_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/jn-tests b/gnulib/modules/jn-tests
new file mode 100644
index 00000000..b5bb49df
--- /dev/null
+++ b/gnulib/modules/jn-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-jn.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-jn
+check_PROGRAMS += test-jn
+test_jn_LDADD = $(LDADD) @JN_LIBM@
diff --git a/gnulib/modules/langinfo b/gnulib/modules/langinfo
new file mode 100644
index 00000000..07d4e47b
--- /dev/null
+++ b/gnulib/modules/langinfo
@@ -0,0 +1,46 @@
+Description:
+A GNU-like <langinfo.h>.
+
+Files:
+lib/langinfo.in.h
+m4/langinfo_h.m4
+
+Depends-on:
+extensions
+include_next
+warn-on-use
+
+configure.ac:
+gl_LANGINFO_H
+
+Makefile.am:
+BUILT_SOURCES += langinfo.h
+
+# We need the following in order to create an empty placeholder for
+# <langinfo.h> when the system doesn't have one.
+langinfo.h: langinfo.in.h $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_LANGINFO_H''@|$(HAVE_LANGINFO_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_LANGINFO_H''@|$(NEXT_LANGINFO_H)|g' \
+ -e 's|@''GNULIB_NL_LANGINFO''@|$(GNULIB_NL_LANGINFO)|g' \
+ -e 's|@''HAVE_LANGINFO_CODESET''@|$(HAVE_LANGINFO_CODESET)|g' \
+ -e 's|@''HAVE_LANGINFO_ERA''@|$(HAVE_LANGINFO_ERA)|g' \
+ -e 's|@''HAVE_NL_LANGINFO''@|$(HAVE_NL_LANGINFO)|g' \
+ -e 's|@''REPLACE_NL_LANGINFO''@|$(REPLACE_NL_LANGINFO)|g' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/langinfo.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += langinfo.h langinfo.h-t
+
+Include:
+<langinfo.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/langinfo-tests b/gnulib/modules/langinfo-tests
new file mode 100644
index 00000000..3475e118
--- /dev/null
+++ b/gnulib/modules/langinfo-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-langinfo.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-langinfo
+check_PROGRAMS += test-langinfo
diff --git a/gnulib/modules/lchmod b/gnulib/modules/lchmod
new file mode 100644
index 00000000..a0ac7a53
--- /dev/null
+++ b/gnulib/modules/lchmod
@@ -0,0 +1,24 @@
+Description:
+lchmod that is actually chmod (!) on hosts lacking lchmod
+
+Files:
+m4/lchmod.m4
+
+Depends-on:
+sys_stat
+extensions
+
+configure.ac:
+gl_FUNC_LCHMOD
+gl_SYS_STAT_MODULE_INDICATOR([lchmod])
+
+Makefile.am:
+
+Include:
+<sys/stat.h>
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/lchown b/gnulib/modules/lchown
new file mode 100644
index 00000000..75672b44
--- /dev/null
+++ b/gnulib/modules/lchown
@@ -0,0 +1,29 @@
+Description:
+lchown() function: change ownership of a file, without following symlinks.
+
+Files:
+lib/lchown.c
+m4/lchown.m4
+
+Depends-on:
+chown
+errno
+lstat
+stdbool
+sys_stat
+unistd
+
+configure.ac:
+gl_FUNC_LCHOWN
+gl_UNISTD_MODULE_INDICATOR([lchown])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/lchown-tests b/gnulib/modules/lchown-tests
new file mode 100644
index 00000000..72ab3c10
--- /dev/null
+++ b/gnulib/modules/lchown-tests
@@ -0,0 +1,23 @@
+Files:
+tests/nap.h
+tests/test-lchown.h
+tests/test-lchown.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+mgetgroups
+progname
+usleep
+stat-time
+stdbool
+symlink
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([getegid])
+
+Makefile.am:
+TESTS += test-lchown
+check_PROGRAMS += test-lchown
+test_lchown_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/ldd b/gnulib/modules/ldd
new file mode 100644
index 00000000..da38d323
--- /dev/null
+++ b/gnulib/modules/ldd
@@ -0,0 +1,23 @@
+Description:
+Command to determine the dynamically linked dependencies of a program.
+
+Files:
+build-aux/ldd.sh.in
+m4/ldd.m4
+
+Depends-on:
+
+configure.ac:
+gl_LDD
+AC_CONFIG_FILES([ldd.sh:build-aux/ldd.sh.in])
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/ldexp b/gnulib/modules/ldexp
new file mode 100644
index 00000000..20818ede
--- /dev/null
+++ b/gnulib/modules/ldexp
@@ -0,0 +1,24 @@
+Description:
+ldexp() function: multiply a 'double' by a power of 2.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_MATHFUNC([ldexp], [double], [(double, int)])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(LDEXP_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/ldexp-tests b/gnulib/modules/ldexp-tests
new file mode 100644
index 00000000..e5d796cb
--- /dev/null
+++ b/gnulib/modules/ldexp-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-ldexp.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ldexp
+check_PROGRAMS += test-ldexp
+test_ldexp_LDADD = $(LDADD) @LDEXP_LIBM@
diff --git a/gnulib/modules/ldexpl b/gnulib/modules/ldexpl
new file mode 100644
index 00000000..7dd82ccb
--- /dev/null
+++ b/gnulib/modules/ldexpl
@@ -0,0 +1,30 @@
+Description:
+ldexpl() function: multiply a 'long double' by a power of 2.
+
+Files:
+lib/ldexpl.c
+m4/ldexpl.m4
+
+Depends-on:
+math
+isnanl
+fpucw
+
+configure.ac:
+gl_FUNC_LDEXPL
+gl_MATH_MODULE_INDICATOR([ldexpl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(LDEXPL_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Paolo Bonzini
+
diff --git a/gnulib/modules/ldexpl-tests b/gnulib/modules/ldexpl-tests
new file mode 100644
index 00000000..3c4f251c
--- /dev/null
+++ b/gnulib/modules/ldexpl-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-ldexpl.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+isnanl-nolibm
+signbit
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ldexpl
+check_PROGRAMS += test-ldexpl
diff --git a/gnulib/modules/lgamma b/gnulib/modules/lgamma
new file mode 100644
index 00000000..81d1704e
--- /dev/null
+++ b/gnulib/modules/lgamma
@@ -0,0 +1,24 @@
+Description:
+lgamma() function: log of gamma function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([lgamma])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(LGAMMA_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/lgamma-tests b/gnulib/modules/lgamma-tests
new file mode 100644
index 00000000..b5e91bba
--- /dev/null
+++ b/gnulib/modules/lgamma-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-lgamma.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-lgamma
+check_PROGRAMS += test-lgamma
+test_lgamma_LDADD = $(LDADD) @LGAMMA_LIBM@
diff --git a/gnulib/modules/lgpl-2.1 b/gnulib/modules/lgpl-2.1
new file mode 100644
index 00000000..5e089205
--- /dev/null
+++ b/gnulib/modules/lgpl-2.1
@@ -0,0 +1,19 @@
+Description:
+Provide the GNU Lesser General Public License version 2.1 in Texinfo format.
+
+Files:
+doc/lgpl-2.1.texi
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unmodifiable license text
+
+Maintainer:
+all
diff --git a/gnulib/modules/lib-ignore b/gnulib/modules/lib-ignore
new file mode 100644
index 00000000..8fe1c328
--- /dev/null
+++ b/gnulib/modules/lib-ignore
@@ -0,0 +1,20 @@
+Description:
+If possible, ignore libraries that are not depended on.
+
+Files:
+m4/lib-ignore.m4
+
+Depends-on:
+
+configure.ac:
+gl_IGNORE_UNUSED_LIBRARIES
+
+Makefile.am:
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+Paul Eggert and Jim Meyering
diff --git a/gnulib/modules/lib-msvc-compat b/gnulib/modules/lib-msvc-compat
new file mode 100644
index 00000000..344b501a
--- /dev/null
+++ b/gnulib/modules/lib-msvc-compat
@@ -0,0 +1,14 @@
+Description:
+Macros to test whether LD support --output-def.
+
+Files:
+m4/ld-output-def.m4
+
+configure.ac:
+gl_LD_OUTPUT_DEF
+
+License:
+unlimited
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/lib-symbol-versions b/gnulib/modules/lib-symbol-versions
new file mode 100644
index 00000000..6b0d990b
--- /dev/null
+++ b/gnulib/modules/lib-symbol-versions
@@ -0,0 +1,14 @@
+Description:
+Macros to test whether LD support --linker-script.
+
+Files:
+m4/ld-version-script.m4
+
+configure.ac:
+gl_LD_VERSION_SCRIPT
+
+License:
+unlimited
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/lib-symbol-visibility b/gnulib/modules/lib-symbol-visibility
new file mode 100644
index 00000000..a30249c7
--- /dev/null
+++ b/gnulib/modules/lib-symbol-visibility
@@ -0,0 +1,26 @@
+Description:
+Control of symbols exported by shared libraries.
+
+Files:
+m4/visibility.m4
+
+Depends-on:
+
+configure.ac:
+gl_VISIBILITY
+
+Makefile.am:
+# The value of $(CFLAG_VISIBILITY) needs to be added to the CFLAGS for the
+# compilation of all sources that make up the library. This line here does it
+# only for the gnulib part of it. The developer is responsible for adding
+# $(CFLAG_VISIBILITY) to the Makefile.ams of the other portions of the library.
+AM_CFLAGS += $(CFLAG_VISIBILITY)
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/libsigsegv b/gnulib/modules/libsigsegv
new file mode 100644
index 00000000..7b340454
--- /dev/null
+++ b/gnulib/modules/libsigsegv
@@ -0,0 +1,27 @@
+Description:
+Handle page faults in user mode.
+
+Files:
+m4/libsigsegv.m4
+
+Depends-on:
+havelib
+
+configure.ac:
+gl_LIBSIGSEGV
+
+Makefile.am:
+
+Include:
+#if HAVE_LIBSIGSEGV
+# include <sigsegv.h>
+#endif
+
+Link:
+$(LTLIBSIGSEGV) when linking with libtool, $(LIBSIGSEGV) otherwise
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/libunistring b/gnulib/modules/libunistring
new file mode 100644
index 00000000..844b5c17
--- /dev/null
+++ b/gnulib/modules/libunistring
@@ -0,0 +1,40 @@
+Description:
+Unicode string functions.
+
+Files:
+m4/libunistring.m4
+
+Depends-on:
+havelib
+iconv
+
+configure.ac:
+gl_LIBUNISTRING
+
+Makefile.am:
+
+Include:
+#if HAVE_LIBUNISTRING
+# include <unitypes.h>
+# include <unistr.h>
+# include <uniconv.h>
+# include <unistdio.h>
+# include <uniname.h>
+# include <unictype.h>
+# include <uniwidth.h>
+# include <uniwbrk.h>
+# include <unilbrk.h>
+# include <uninorm.h>
+# include <unicase.h>
+# include <uniregex.h>
+# include <unistring/version.h>
+#endif
+
+Link:
+$(LTLIBUNISTRING) when linking with libtool, $(LIBUNISTRING) otherwise
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/linebuffer b/gnulib/modules/linebuffer
new file mode 100644
index 00000000..1444ff07
--- /dev/null
+++ b/gnulib/modules/linebuffer
@@ -0,0 +1,24 @@
+Description:
+Read a line from a stream.
+
+Files:
+lib/linebuffer.h
+lib/linebuffer.c
+
+Depends-on:
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += linebuffer.h linebuffer.c
+
+Include:
+"linebuffer.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/link b/gnulib/modules/link
new file mode 100644
index 00000000..6a006c31
--- /dev/null
+++ b/gnulib/modules/link
@@ -0,0 +1,27 @@
+Description:
+link() function: create a new link for an existing file
+
+Files:
+lib/link.c
+m4/link.m4
+
+Depends-on:
+stat
+strdup-posix
+sys_stat
+unistd
+
+configure.ac:
+gl_FUNC_LINK
+gl_UNISTD_MODULE_INDICATOR([link])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Martin Lambers, Eric Blake
diff --git a/gnulib/modules/link-follow b/gnulib/modules/link-follow
new file mode 100644
index 00000000..c7fd48a5
--- /dev/null
+++ b/gnulib/modules/link-follow
@@ -0,0 +1,20 @@
+Description:
+Determine whether link("symlink", "foo") follows the symlink.
+
+Files:
+m4/link-follow.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_LINK_FOLLOWS_SYMLINK
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/link-tests b/gnulib/modules/link-tests
new file mode 100644
index 00000000..5b1978e8
--- /dev/null
+++ b/gnulib/modules/link-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-link.h
+tests/test-link.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+errno
+stdbool
+sys_stat
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-link
+check_PROGRAMS += test-link
diff --git a/gnulib/modules/link-warning b/gnulib/modules/link-warning
new file mode 100644
index 00000000..935f66a3
--- /dev/null
+++ b/gnulib/modules/link-warning
@@ -0,0 +1,40 @@
+Description:
+A C macro for emitting link time warnings.
+
+Applicability:
+all
+
+Files:
+build-aux/link-warning.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+# The BUILT_SOURCES created by this Makefile snippet are not used via #include
+# statements but through direct file reference. Therefore this snippet must be
+# present in all Makefile.am that need it. This is ensured by the applicability
+# 'all' defined above.
+
+BUILT_SOURCES += link-warning.h
+# The link-warning.h that gets inserted into generated .h files is the same as
+# build-aux/link-warning.h, except that it has the copyright header cut off.
+link-warning.h: $(top_srcdir)/build-aux/link-warning.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ sed -n -e '/GL_LINK_WARNING/,$$p' \
+ < $(top_srcdir)/build-aux/link-warning.h \
+ > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += link-warning.h link-warning.h-t
+
+LINK_WARNING_H=link-warning.h
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/linkat b/gnulib/modules/linkat
new file mode 100644
index 00000000..d0e47715
--- /dev/null
+++ b/gnulib/modules/linkat
@@ -0,0 +1,42 @@
+Description:
+linkat(): create a hard link, relative to two directories
+
+Files:
+lib/at-func2.c
+lib/linkat.c
+m4/linkat.m4
+
+Depends-on:
+areadlink
+areadlinkat
+dirname-lgpl
+errno
+extensions
+fcntl-h
+filenamecat-lgpl
+openat
+link
+link-follow
+lstat
+readlink
+same-inode
+stpcpy
+symlink
+symlinkat
+unistd
+
+configure.ac:
+gl_FUNC_LINKAT
+gl_UNISTD_MODULE_INDICATOR([linkat])
+
+Makefile.am:
+
+Include:
+<fcntl.h>
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/linkat-tests b/gnulib/modules/linkat-tests
new file mode 100644
index 00000000..6df47819
--- /dev/null
+++ b/gnulib/modules/linkat-tests
@@ -0,0 +1,20 @@
+Files:
+tests/test-link.h
+tests/test-linkat.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+areadlink-with-size
+filenamecat
+progname
+same-inode
+xgetcwd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-linkat
+check_PROGRAMS += test-linkat
+test_linkat_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/linked-list b/gnulib/modules/linked-list
new file mode 100644
index 00000000..1c66585e
--- /dev/null
+++ b/gnulib/modules/linked-list
@@ -0,0 +1,26 @@
+Description:
+Sequential list data type implemented by a linked list.
+
+Files:
+lib/gl_linked_list.h
+lib/gl_linked_list.c
+lib/gl_anylinked_list1.h
+lib/gl_anylinked_list2.h
+
+Depends-on:
+list
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_linked_list.h gl_linked_list.c gl_anylinked_list1.h gl_anylinked_list2.h
+
+Include:
+"gl_linked_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/linked-list-tests b/gnulib/modules/linked-list-tests
new file mode 100644
index 00000000..d6fd5aa2
--- /dev/null
+++ b/gnulib/modules/linked-list-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-linked_list.c
+tests/macros.h
+
+Depends-on:
+array-list
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-linked_list
+check_PROGRAMS += test-linked_list
diff --git a/gnulib/modules/linkedhash-list b/gnulib/modules/linkedhash-list
new file mode 100644
index 00000000..16bc79f1
--- /dev/null
+++ b/gnulib/modules/linkedhash-list
@@ -0,0 +1,30 @@
+Description:
+Sequential list data type implemented by a hash table with a linked list.
+
+Files:
+lib/gl_linkedhash_list.h
+lib/gl_linkedhash_list.c
+lib/gl_anyhash_list1.h
+lib/gl_anyhash_list2.h
+lib/gl_anylinked_list1.h
+lib/gl_anylinked_list2.h
+
+Depends-on:
+list
+stdint
+xsize
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_linkedhash_list.h gl_linkedhash_list.c gl_anyhash_list1.h gl_anyhash_list2.h gl_anylinked_list1.h gl_anylinked_list2.h
+
+Include:
+"gl_linkedhash_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/linkedhash-list-tests b/gnulib/modules/linkedhash-list-tests
new file mode 100644
index 00000000..51091493
--- /dev/null
+++ b/gnulib/modules/linkedhash-list-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-linkedhash_list.c
+tests/macros.h
+
+Depends-on:
+array-list
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-linkedhash_list
+check_PROGRAMS += test-linkedhash_list
diff --git a/gnulib/modules/list b/gnulib/modules/list
new file mode 100644
index 00000000..202e9ce3
--- /dev/null
+++ b/gnulib/modules/list
@@ -0,0 +1,26 @@
+Description:
+Abstract sequential list data type.
+
+Files:
+lib/gl_list.h
+lib/gl_list.c
+m4/gl_list.m4
+
+Depends-on:
+inline
+stdbool
+
+configure.ac:
+gl_LIST
+
+Makefile.am:
+lib_SOURCES += gl_list.h gl_list.c
+
+Include:
+"gl_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/listen b/gnulib/modules/listen
new file mode 100644
index 00000000..6912f5d6
--- /dev/null
+++ b/gnulib/modules/listen
@@ -0,0 +1,28 @@
+Description:
+listen() function: make a server socket ready for accepting connections.
+
+Files:
+lib/listen.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([listen])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([listen])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/localcharset b/gnulib/modules/localcharset
new file mode 100644
index 00000000..e07061a7
--- /dev/null
+++ b/gnulib/modules/localcharset
@@ -0,0 +1,106 @@
+Description:
+Return current locale's character encoding.
+
+Notice:
+If your package's tests make use of the locale_charset() function directly or
+indirectly, you may need to define the CHARSETALIASDIR environment variable,
+so that "make check" works before "make install". In Makefile.am syntax:
+TESTS_ENVIRONMENT += @LOCALCHARSET_TESTS_ENVIRONMENT@
+
+Files:
+lib/localcharset.h
+lib/localcharset.c
+lib/config.charset
+lib/ref-add.sin
+lib/ref-del.sin
+m4/codeset.m4
+m4/fcntl-o.m4
+m4/glibc21.m4
+m4/localcharset.m4
+
+Depends-on:
+configmake
+extensions
+
+configure.ac:
+gl_LOCALCHARSET
+LOCALCHARSET_TESTS_ENVIRONMENT="CHARSETALIASDIR=\"\$(top_builddir)/$gl_source_base\""
+AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT])
+
+Makefile.am:
+lib_SOURCES += localcharset.h localcharset.c
+
+# We need the following in order to install a simple file in $(libdir)
+# which is shared with other installed packages. We use a list of referencing
+# packages so that "make uninstall" will remove the file if and only if it
+# is not used by another installed package.
+# On systems with glibc-2.1 or newer, the file is redundant, therefore we
+# avoid installing it.
+
+all-local: charset.alias ref-add.sed ref-del.sed
+
+charset_alias = $(DESTDIR)$(libdir)/charset.alias
+charset_tmp = $(DESTDIR)$(libdir)/charset.tmp
+install-exec-local: install-exec-localcharset
+install-exec-localcharset: all-local
+ if test $(GLIBC21) = no; then \
+ case '$(host_os)' in \
+ darwin[56]*) \
+ need_charset_alias=true ;; \
+ darwin* | cygwin* | mingw* | pw32* | cegcc*) \
+ need_charset_alias=false ;; \
+ *) \
+ need_charset_alias=true ;; \
+ esac ; \
+ else \
+ need_charset_alias=false ; \
+ fi ; \
+ if $$need_charset_alias; then \
+ $(mkinstalldirs) $(DESTDIR)$(libdir) ; \
+ fi ; \
+ if test -f $(charset_alias); then \
+ sed -f ref-add.sed $(charset_alias) > $(charset_tmp) ; \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \
+ rm -f $(charset_tmp) ; \
+ else \
+ if $$need_charset_alias; then \
+ sed -f ref-add.sed charset.alias > $(charset_tmp) ; \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \
+ rm -f $(charset_tmp) ; \
+ fi ; \
+ fi
+
+uninstall-local: uninstall-localcharset
+uninstall-localcharset: all-local
+ if test -f $(charset_alias); then \
+ sed -f ref-del.sed $(charset_alias) > $(charset_tmp); \
+ if grep '^# Packages using this file: $$' $(charset_tmp) \
+ > /dev/null; then \
+ rm -f $(charset_alias); \
+ else \
+ $(INSTALL_DATA) $(charset_tmp) $(charset_alias); \
+ fi; \
+ rm -f $(charset_tmp); \
+ fi
+
+charset.alias: config.charset
+ $(AM_V_GEN)rm -f t-$@ $@ && \
+ $(SHELL) $(srcdir)/config.charset '$(host)' > t-$@ && \
+ mv t-$@ $@
+
+SUFFIXES += .sed .sin
+.sin.sed:
+ $(AM_V_GEN)rm -f t-$@ $@ && \
+ sed -e '/^#/d' -e 's/@''PACKAGE''@/$(PACKAGE)/g' $< > t-$@ && \
+ mv t-$@ $@
+
+CLEANFILES += charset.alias ref-add.sed ref-del.sed
+
+Include:
+"localcharset.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/locale b/gnulib/modules/locale
new file mode 100644
index 00000000..25774682
--- /dev/null
+++ b/gnulib/modules/locale
@@ -0,0 +1,46 @@
+Description:
+A <locale.h> that conforms to POSIX.
+
+Files:
+lib/locale.in.h
+m4/locale_h.m4
+
+Depends-on:
+arg-nonnull
+extensions
+include_next
+stddef
+warn-on-use
+
+configure.ac:
+gl_LOCALE_H
+
+Makefile.am:
+BUILT_SOURCES += locale.h
+
+# We need the following in order to create <locale.h> when the system
+# doesn't have one that provides all definitions.
+locale.h: locale.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \
+ -e 's|@''GNULIB_DUPLOCALE''@|$(GNULIB_DUPLOCALE)|g' \
+ -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \
+ -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/locale.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += locale.h locale.h-t
+
+Include:
+<locale.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/locale-tests b/gnulib/modules/locale-tests
new file mode 100644
index 00000000..272aa613
--- /dev/null
+++ b/gnulib/modules/locale-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-locale.c
+
+Depends-on:
+verify
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([newlocale])
+
+Makefile.am:
+TESTS += test-locale
+check_PROGRAMS += test-locale
diff --git a/gnulib/modules/localename b/gnulib/modules/localename
new file mode 100644
index 00000000..165de352
--- /dev/null
+++ b/gnulib/modules/localename
@@ -0,0 +1,32 @@
+Description:
+Return current locale's name, according to glibc naming conventions.
+
+Files:
+lib/localename.h
+lib/localename.c
+m4/localename.m4
+m4/intlmacosx.m4
+m4/lcmessage.m4
+
+Depends-on:
+strdup
+lock
+
+configure.ac:
+gl_LOCALENAME
+
+Makefile.am:
+lib_SOURCES += localename.c
+
+Include:
+"localename.h"
+
+Link:
+@INTL_MACOSX_LIBS@
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/localename-tests b/gnulib/modules/localename-tests
new file mode 100644
index 00000000..3b53c6c1
--- /dev/null
+++ b/gnulib/modules/localename-tests
@@ -0,0 +1,18 @@
+Files:
+tests/test-localename.c
+tests/macros.h
+
+Depends-on:
+locale
+setenv
+unsetenv
+strdup
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([newlocale])
+
+Makefile.am:
+TESTS += test-localename
+check_PROGRAMS += test-localename
+test_localename_LDADD = $(LDADD) @INTL_MACOSX_LIBS@
+
diff --git a/gnulib/modules/lock b/gnulib/modules/lock
new file mode 100644
index 00000000..f7e4c9a9
--- /dev/null
+++ b/gnulib/modules/lock
@@ -0,0 +1,29 @@
+Description:
+Locking in multithreaded situations.
+
+Files:
+lib/glthread/lock.h
+lib/glthread/lock.c
+m4/lock.m4
+
+Depends-on:
+threadlib
+
+configure.ac:
+gl_LOCK
+
+Makefile.am:
+lib_SOURCES += glthread/lock.h glthread/lock.c
+
+Include:
+"glthread/lock.h"
+
+Link:
+$(LTLIBTHREAD) when linking with libtool, $(LIBTHREAD) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/lock-tests b/gnulib/modules/lock-tests
new file mode 100644
index 00000000..d0e50105
--- /dev/null
+++ b/gnulib/modules/lock-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-lock.c
+
+Depends-on:
+thread
+yield
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-lock
+check_PROGRAMS += test-lock
+test_lock_LDADD = $(LDADD) @LIBMULTITHREAD@ @YIELD_LIB@
diff --git a/gnulib/modules/log b/gnulib/modules/log
new file mode 100644
index 00000000..cbee37bc
--- /dev/null
+++ b/gnulib/modules/log
@@ -0,0 +1,24 @@
+Description:
+log() function: natural logarithmic function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([log])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(LOG_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/log-tests b/gnulib/modules/log-tests
new file mode 100644
index 00000000..d3f5adbd
--- /dev/null
+++ b/gnulib/modules/log-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-log.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-log
+check_PROGRAMS += test-log
+test_log_LDADD = $(LDADD) @LOG_LIBM@
diff --git a/gnulib/modules/log10 b/gnulib/modules/log10
new file mode 100644
index 00000000..a0b4c292
--- /dev/null
+++ b/gnulib/modules/log10
@@ -0,0 +1,24 @@
+Description:
+log10() function: base 10 logarithmic function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([log10])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(LOG10_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/log10-tests b/gnulib/modules/log10-tests
new file mode 100644
index 00000000..5fc6e6bc
--- /dev/null
+++ b/gnulib/modules/log10-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-log10.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-log10
+check_PROGRAMS += test-log10
+test_log10_LDADD = $(LDADD) @LOG10_LIBM@
diff --git a/gnulib/modules/log1p b/gnulib/modules/log1p
new file mode 100644
index 00000000..955893b7
--- /dev/null
+++ b/gnulib/modules/log1p
@@ -0,0 +1,24 @@
+Description:
+log1p() function: natural logarithm of 1 plus argument.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([log1p])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(LOG1P_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/log1p-tests b/gnulib/modules/log1p-tests
new file mode 100644
index 00000000..f0fff097
--- /dev/null
+++ b/gnulib/modules/log1p-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-log1p.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-log1p
+check_PROGRAMS += test-log1p
+test_log1p_LDADD = $(LDADD) @LOG1P_LIBM@
diff --git a/gnulib/modules/logb b/gnulib/modules/logb
new file mode 100644
index 00000000..8816840d
--- /dev/null
+++ b/gnulib/modules/logb
@@ -0,0 +1,24 @@
+Description:
+logb() function: get exponent.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_MATHFUNC([logb], [double], [(double)])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(LOGB_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/logb-tests b/gnulib/modules/logb-tests
new file mode 100644
index 00000000..f9490702
--- /dev/null
+++ b/gnulib/modules/logb-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-logb.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-logb
+check_PROGRAMS += test-logb
+test_logb_LDADD = $(LDADD) @LOGB_LIBM@
diff --git a/gnulib/modules/logl b/gnulib/modules/logl
new file mode 100644
index 00000000..c9b7237d
--- /dev/null
+++ b/gnulib/modules/logl
@@ -0,0 +1,31 @@
+Description:
+logl() function: logarithm with long double argument.
+
+Files:
+lib/logl.c
+m4/logl.m4
+
+Depends-on:
+math
+extensions
+frexpl
+isnanl
+floorl
+
+configure.ac:
+gl_FUNC_LOGL
+gl_MATH_MODULE_INDICATOR([logl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(LOGL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/logl-tests b/gnulib/modules/logl-tests
new file mode 100644
index 00000000..805a3c44
--- /dev/null
+++ b/gnulib/modules/logl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-logl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-logl
+check_PROGRAMS += test-logl
+test_logl_LDADD = $(LDADD) @LOGL_LIBM@
diff --git a/gnulib/modules/long-options b/gnulib/modules/long-options
new file mode 100644
index 00000000..29bf734d
--- /dev/null
+++ b/gnulib/modules/long-options
@@ -0,0 +1,25 @@
+Description:
+Handle --help and --version options.
+
+Files:
+lib/long-options.h
+lib/long-options.c
+m4/long-options.m4
+
+Depends-on:
+getopt-gnu
+version-etc
+
+configure.ac:
+gl_LONG_OPTIONS
+
+Makefile.am:
+
+Include:
+"long-options.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/longlong b/gnulib/modules/longlong
new file mode 100644
index 00000000..5b73e931
--- /dev/null
+++ b/gnulib/modules/longlong
@@ -0,0 +1,15 @@
+Description:
+Define HAVE_LONG_LONG_INT if 'long long int' works.
+
+Files:
+m4/longlong.m4
+
+configure.ac:
+AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+
+License:
+GPL
+
+Maintainer:
+Ben Pfaff
diff --git a/gnulib/modules/lseek b/gnulib/modules/lseek
new file mode 100644
index 00000000..33de968d
--- /dev/null
+++ b/gnulib/modules/lseek
@@ -0,0 +1,24 @@
+Description:
+lseek() function: Reposition a file descriptor.
+
+Files:
+lib/lseek.c
+m4/lseek.m4
+
+Depends-on:
+unistd
+
+configure.ac:
+gl_FUNC_LSEEK
+gl_UNISTD_MODULE_INDICATOR([lseek])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/lseek-tests b/gnulib/modules/lseek-tests
new file mode 100644
index 00000000..890a87fb
--- /dev/null
+++ b/gnulib/modules/lseek-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-lseek.c
+tests/test-lseek.sh
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-lseek.sh
+check_PROGRAMS += test-lseek
diff --git a/gnulib/modules/lstat b/gnulib/modules/lstat
new file mode 100644
index 00000000..e4eabb5a
--- /dev/null
+++ b/gnulib/modules/lstat
@@ -0,0 +1,25 @@
+Description:
+lstat() function: return information about a file or symbolic link.
+
+Files:
+lib/lstat.c
+m4/lstat.m4
+
+Depends-on:
+stat
+sys_stat
+
+configure.ac:
+gl_FUNC_LSTAT
+gl_SYS_STAT_MODULE_INDICATOR([lstat])
+
+Makefile.am:
+
+Include:
+<sys/stat.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/lstat-tests b/gnulib/modules/lstat-tests
new file mode 100644
index 00000000..911a7ff6
--- /dev/null
+++ b/gnulib/modules/lstat-tests
@@ -0,0 +1,18 @@
+Files:
+tests/test-lstat.h
+tests/test-lstat.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+errno
+same-inode
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-lstat
+check_PROGRAMS += test-lstat
diff --git a/gnulib/modules/maintainer-makefile b/gnulib/modules/maintainer-makefile
new file mode 100644
index 00000000..ed43e879
--- /dev/null
+++ b/gnulib/modules/maintainer-makefile
@@ -0,0 +1,20 @@
+Description:
+Helper GNUmakefile with syntax checks, build improvements, etc.
+
+Files:
+top/maint.mk
+
+Depends-on:
+gnumakefile
+useless-if-before-free
+vc-list-files
+
+configure.ac:
+AC_CONFIG_COMMANDS_PRE([m4_ifdef([AH_HEADER],
+ [AC_SUBST([CONFIG_INCLUDE], m4_defn([AH_HEADER]))])])
+
+License:
+GPLed build tool
+
+Maintainer:
+all
diff --git a/gnulib/modules/malloc b/gnulib/modules/malloc
new file mode 100644
index 00000000..cc786684
--- /dev/null
+++ b/gnulib/modules/malloc
@@ -0,0 +1,23 @@
+Description:
+malloc() function that is glibc compatible.
+
+Files:
+lib/malloc.c
+
+Depends-on:
+malloc-posix
+
+configure.ac:
+AC_FUNC_MALLOC
+AC_DEFINE([GNULIB_MALLOC_GNU], 1, [Define to indicate the 'malloc' module.])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/malloc-posix b/gnulib/modules/malloc-posix
new file mode 100644
index 00000000..0b0edd6d
--- /dev/null
+++ b/gnulib/modules/malloc-posix
@@ -0,0 +1,25 @@
+Description:
+malloc() function: allocate memory with indefinite extent.
+
+Files:
+lib/malloc.c
+m4/malloc.m4
+
+Depends-on:
+stdlib
+
+configure.ac:
+gl_FUNC_MALLOC_POSIX
+gl_STDLIB_MODULE_INDICATOR([malloc-posix])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/malloca b/gnulib/modules/malloca
new file mode 100644
index 00000000..d54bf306
--- /dev/null
+++ b/gnulib/modules/malloca
@@ -0,0 +1,28 @@
+Description:
+Safe automatic memory allocation.
+
+Files:
+lib/malloca.h
+lib/malloca.c
+lib/malloca.valgrind
+m4/malloca.m4
+m4/eealloc.m4
+m4/longlong.m4
+
+Depends-on:
+alloca-opt
+
+configure.ac:
+gl_MALLOCA
+
+Makefile.am:
+lib_SOURCES += malloca.c
+
+Include:
+"malloca.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/malloca-tests b/gnulib/modules/malloca-tests
new file mode 100644
index 00000000..c473b35b
--- /dev/null
+++ b/gnulib/modules/malloca-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-malloca.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-malloca
+check_PROGRAMS += test-malloca
+
diff --git a/gnulib/modules/manywarnings b/gnulib/modules/manywarnings
new file mode 100644
index 00000000..f557ef0f
--- /dev/null
+++ b/gnulib/modules/manywarnings
@@ -0,0 +1,16 @@
+Description:
+Helper M4 functions to help work out a set of warning parameters to use.
+
+Files:
+m4/manywarnings.m4
+
+Depends-on:
+warnings
+
+configure.ac:
+
+License:
+unlimited
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/math b/gnulib/modules/math
new file mode 100644
index 00000000..0ffeff4a
--- /dev/null
+++ b/gnulib/modules/math
@@ -0,0 +1,113 @@
+Description:
+A GNU-like <math.h>.
+
+Files:
+lib/math.in.h
+m4/math_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+warn-on-use
+
+configure.ac:
+gl_MATH_H
+
+Makefile.am:
+BUILT_SOURCES += math.h
+
+# We need the following in order to create <math.h> when the system
+# doesn't have one that works with the given compiler.
+math.h: math.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \
+ -e 's|@''GNULIB_ACOSL''@|$(GNULIB_ACOSL)|g' \
+ -e 's|@''GNULIB_ASINL''@|$(GNULIB_ASINL)|g' \
+ -e 's|@''GNULIB_ATANL''@|$(GNULIB_ATANL)|g' \
+ -e 's|@''GNULIB_CEILF''@|$(GNULIB_CEILF)|g' \
+ -e 's|@''GNULIB_CEILL''@|$(GNULIB_CEILL)|g' \
+ -e 's|@''GNULIB_COSL''@|$(GNULIB_COSL)|g' \
+ -e 's|@''GNULIB_EXPL''@|$(GNULIB_EXPL)|g' \
+ -e 's|@''GNULIB_FLOORF''@|$(GNULIB_FLOORF)|g' \
+ -e 's|@''GNULIB_FLOORL''@|$(GNULIB_FLOORL)|g' \
+ -e 's|@''GNULIB_FREXP''@|$(GNULIB_FREXP)|g' \
+ -e 's|@''GNULIB_FREXPL''@|$(GNULIB_FREXPL)|g' \
+ -e 's|@''GNULIB_ISFINITE''@|$(GNULIB_ISFINITE)|g' \
+ -e 's|@''GNULIB_ISINF''@|$(GNULIB_ISINF)|g' \
+ -e 's|@''GNULIB_ISNAN''@|$(GNULIB_ISNAN)|g' \
+ -e 's|@''GNULIB_ISNANF''@|$(GNULIB_ISNANF)|g' \
+ -e 's|@''GNULIB_ISNAND''@|$(GNULIB_ISNAND)|g' \
+ -e 's|@''GNULIB_ISNANL''@|$(GNULIB_ISNANL)|g' \
+ -e 's|@''GNULIB_LDEXPL''@|$(GNULIB_LDEXPL)|g' \
+ -e 's|@''GNULIB_LOGL''@|$(GNULIB_LOGL)|g' \
+ -e 's|@''GNULIB_ROUND''@|$(GNULIB_ROUND)|g' \
+ -e 's|@''GNULIB_ROUNDF''@|$(GNULIB_ROUNDF)|g' \
+ -e 's|@''GNULIB_ROUNDL''@|$(GNULIB_ROUNDL)|g' \
+ -e 's|@''GNULIB_SIGNBIT''@|$(GNULIB_SIGNBIT)|g' \
+ -e 's|@''GNULIB_SINL''@|$(GNULIB_SINL)|g' \
+ -e 's|@''GNULIB_SQRTL''@|$(GNULIB_SQRTL)|g' \
+ -e 's|@''GNULIB_TANL''@|$(GNULIB_TANL)|g' \
+ -e 's|@''GNULIB_TRUNC''@|$(GNULIB_TRUNC)|g' \
+ -e 's|@''GNULIB_TRUNCF''@|$(GNULIB_TRUNCF)|g' \
+ -e 's|@''GNULIB_TRUNCL''@|$(GNULIB_TRUNCL)|g' \
+ -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \
+ -e 's|@''HAVE_ASINL''@|$(HAVE_ASINL)|g' \
+ -e 's|@''HAVE_ATANL''@|$(HAVE_ATANL)|g' \
+ -e 's|@''HAVE_COSL''@|$(HAVE_COSL)|g' \
+ -e 's|@''HAVE_EXPL''@|$(HAVE_EXPL)|g' \
+ -e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \
+ -e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \
+ -e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \
+ -e 's|@''HAVE_LOGL''@|$(HAVE_LOGL)|g' \
+ -e 's|@''HAVE_SINL''@|$(HAVE_SINL)|g' \
+ -e 's|@''HAVE_SQRTL''@|$(HAVE_SQRTL)|g' \
+ -e 's|@''HAVE_TANL''@|$(HAVE_TANL)|g' \
+ -e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \
+ -e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \
+ -e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \
+ -e 's|@''HAVE_DECL_COSL''@|$(HAVE_DECL_COSL)|g' \
+ -e 's|@''HAVE_DECL_EXPL''@|$(HAVE_DECL_EXPL)|g' \
+ -e 's|@''HAVE_DECL_FREXPL''@|$(HAVE_DECL_FREXPL)|g' \
+ -e 's|@''HAVE_DECL_LDEXPL''@|$(HAVE_DECL_LDEXPL)|g' \
+ -e 's|@''HAVE_DECL_LOGL''@|$(HAVE_DECL_LOGL)|g' \
+ -e 's|@''HAVE_DECL_SINL''@|$(HAVE_DECL_SINL)|g' \
+ -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \
+ -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \
+ -e 's|@''HAVE_DECL_TRUNC''@|$(HAVE_DECL_TRUNC)|g' \
+ -e 's|@''HAVE_DECL_TRUNCF''@|$(HAVE_DECL_TRUNCF)|g' \
+ -e 's|@''REPLACE_CEILF''@|$(REPLACE_CEILF)|g' \
+ -e 's|@''REPLACE_CEILL''@|$(REPLACE_CEILL)|g' \
+ -e 's|@''REPLACE_FLOORF''@|$(REPLACE_FLOORF)|g' \
+ -e 's|@''REPLACE_FLOORL''@|$(REPLACE_FLOORL)|g' \
+ -e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \
+ -e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \
+ -e 's|@''REPLACE_HUGE_VAL''@|$(REPLACE_HUGE_VAL)|g' \
+ -e 's|@''REPLACE_ISFINITE''@|$(REPLACE_ISFINITE)|g' \
+ -e 's|@''REPLACE_ISINF''@|$(REPLACE_ISINF)|g' \
+ -e 's|@''REPLACE_ISNAN''@|$(REPLACE_ISNAN)|g' \
+ -e 's|@''REPLACE_LDEXPL''@|$(REPLACE_LDEXPL)|g' \
+ -e 's|@''REPLACE_NAN''@|$(REPLACE_NAN)|g' \
+ -e 's|@''REPLACE_ROUND''@|$(REPLACE_ROUND)|g' \
+ -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \
+ -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \
+ -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \
+ -e 's|@''REPLACE_SIGNBIT_USING_GCC''@|$(REPLACE_SIGNBIT_USING_GCC)|g' \
+ -e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/math.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += math.h math.h-t
+
+Include:
+<math.h>
+
+License:
+LGPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/math-tests b/gnulib/modules/math-tests
new file mode 100644
index 00000000..ebab1579
--- /dev/null
+++ b/gnulib/modules/math-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-math.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-math
+check_PROGRAMS += test-math
diff --git a/gnulib/modules/mathl b/gnulib/modules/mathl
new file mode 100644
index 00000000..ac0a27e8
--- /dev/null
+++ b/gnulib/modules/mathl
@@ -0,0 +1,43 @@
+Description:
+C99 functions for transcendental functions with long double arguments.
+
+Files:
+
+Depends-on:
+floorl
+ceill
+acosl
+asinl
+atanl
+cosl
+expl
+logl
+sinl
+sqrtl
+tanl
+
+configure.ac:
+AC_REQUIRE([gl_FUNC_FLOORL])
+AC_REQUIRE([gl_FUNC_CEILL])
+AC_REQUIRE([gl_FUNC_ACOSL])
+AC_REQUIRE([gl_FUNC_ASINL])
+AC_REQUIRE([gl_FUNC_ATANL])
+AC_REQUIRE([gl_FUNC_COSL])
+AC_REQUIRE([gl_FUNC_EXPL])
+AC_REQUIRE([gl_FUNC_LOGL])
+AC_REQUIRE([gl_FUNC_SINL])
+AC_REQUIRE([gl_FUNC_SQRTL])
+AC_REQUIRE([gl_FUNC_TANL])
+LIBS="$LIBS $FLOORL_LIBM $CEILL_LIBM $ACOSL_LIBM $ASINL_LIBM $ATANL_LIBM $ACOSL_LIBM $EXPL_LIBM $LOGL_LIBM $SINL_LIBM $SQRTL_LIBM $TANL_LIBM"
+
+Makefile.am:
+
+Include:
+<math.h>
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini <bonzini@gnu.org>
+
diff --git a/gnulib/modules/mbchar b/gnulib/modules/mbchar
new file mode 100644
index 00000000..b5e222ac
--- /dev/null
+++ b/gnulib/modules/mbchar
@@ -0,0 +1,30 @@
+Description:
+Multibyte character data type.
+
+Files:
+lib/mbchar.h
+lib/mbchar.c
+m4/mbchar.m4
+
+Depends-on:
+extensions
+stdbool
+wchar
+wctype
+wcwidth
+memcmp
+
+configure.ac:
+gl_MBCHAR
+
+Makefile.am:
+lib_SOURCES += mbchar.c
+
+Include:
+"mbchar.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/mbfile b/gnulib/modules/mbfile
new file mode 100644
index 00000000..0bbd0324
--- /dev/null
+++ b/gnulib/modules/mbfile
@@ -0,0 +1,30 @@
+Description:
+Multibyte character I/O.
+
+Files:
+lib/mbfile.h
+m4/mbfile.m4
+m4/mbrtowc.m4
+
+Depends-on:
+mbchar
+mbrtowc
+mbsinit
+wchar
+stdbool
+
+configure.ac:
+gl_MBFILE
+
+Makefile.am:
+lib_SOURCES += mbfile.h
+
+Include:
+"mbfile.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbiter b/gnulib/modules/mbiter
new file mode 100644
index 00000000..5e51723a
--- /dev/null
+++ b/gnulib/modules/mbiter
@@ -0,0 +1,30 @@
+Description:
+Iterating through multibyte strings.
+
+Files:
+lib/mbiter.h
+m4/mbiter.m4
+m4/mbrtowc.m4
+
+Depends-on:
+mbchar
+mbrtowc
+mbsinit
+wchar
+stdbool
+
+configure.ac:
+gl_MBITER
+
+Makefile.am:
+lib_SOURCES += mbiter.h
+
+Include:
+"mbiter.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbmemcasecmp b/gnulib/modules/mbmemcasecmp
new file mode 100644
index 00000000..0ff071df
--- /dev/null
+++ b/gnulib/modules/mbmemcasecmp
@@ -0,0 +1,24 @@
+Description:
+mbmemcasecmp() function: case-insensitive memory area comparison.
+
+Files:
+lib/mbmemcasecmp.h
+lib/mbmemcasecmp.c
+
+Depends-on:
+mbiter
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += mbmemcasecmp.c
+
+Include:
+"mbmemcasecmp.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbmemcasecmp-tests b/gnulib/modules/mbmemcasecmp-tests
new file mode 100644
index 00000000..05d6c7fe
--- /dev/null
+++ b/gnulib/modules/mbmemcasecmp-tests
@@ -0,0 +1,27 @@
+Files:
+tests/test-mbmemcasecmp1.sh
+tests/test-mbmemcasecmp2.sh
+tests/test-mbmemcasecmp3.sh
+tests/test-mbmemcasecmp.c
+tests/test-mbmemcasecmp.h
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-tr.m4
+m4/codeset.m4
+
+Depends-on:
+stdbool
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_TR_UTF8
+
+Makefile.am:
+TESTS += test-mbmemcasecmp1.sh test-mbmemcasecmp2.sh test-mbmemcasecmp3.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
+ LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
+check_PROGRAMS += test-mbmemcasecmp
+
diff --git a/gnulib/modules/mbmemcasecoll b/gnulib/modules/mbmemcasecoll
new file mode 100644
index 00000000..98200971
--- /dev/null
+++ b/gnulib/modules/mbmemcasecoll
@@ -0,0 +1,30 @@
+Description:
+mbmemcasecoll() function: locale dependent case-insensitive memory area
+comparison.
+
+Files:
+lib/mbmemcasecoll.h
+lib/mbmemcasecoll.c
+
+Depends-on:
+stdbool
+malloca
+mbrtowc
+wcrtomb
+memcmp2
+memcoll
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += mbmemcasecoll.c
+
+Include:
+"mbmemcasecoll.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbmemcasecoll-tests b/gnulib/modules/mbmemcasecoll-tests
new file mode 100644
index 00000000..e2cc524c
--- /dev/null
+++ b/gnulib/modules/mbmemcasecoll-tests
@@ -0,0 +1,27 @@
+Files:
+tests/test-mbmemcasecoll1.sh
+tests/test-mbmemcasecoll2.sh
+tests/test-mbmemcasecoll3.sh
+tests/test-mbmemcasecoll.c
+tests/test-mbmemcasecmp.h
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-tr.m4
+m4/codeset.m4
+
+Depends-on:
+stdbool
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_TR_UTF8
+
+Makefile.am:
+TESTS += test-mbmemcasecoll1.sh test-mbmemcasecoll2.sh test-mbmemcasecoll3.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
+ LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
+check_PROGRAMS += test-mbmemcasecoll
+
diff --git a/gnulib/modules/mbrlen b/gnulib/modules/mbrlen
new file mode 100644
index 00000000..e7f36734
--- /dev/null
+++ b/gnulib/modules/mbrlen
@@ -0,0 +1,28 @@
+Description:
+mbrlen() function: recognize multibyte character.
+
+Files:
+lib/mbrlen.c
+m4/mbrlen.m4
+m4/mbstate_t.m4
+
+Depends-on:
+wchar
+mbrtowc
+extensions
+
+configure.ac:
+gl_FUNC_MBRLEN
+gl_WCHAR_MODULE_INDICATOR([mbrlen])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbrtowc b/gnulib/modules/mbrtowc
new file mode 100644
index 00000000..5981633e
--- /dev/null
+++ b/gnulib/modules/mbrtowc
@@ -0,0 +1,35 @@
+Description:
+mbrtowc() function: convert multibyte character to wide character.
+
+Files:
+lib/mbrtowc.c
+m4/mbrtowc.m4
+m4/mbstate_t.m4
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+wchar
+mbsinit
+localcharset
+streq
+verify
+extensions
+
+configure.ac:
+gl_FUNC_MBRTOWC
+gl_WCHAR_MODULE_INDICATOR([mbrtowc])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbrtowc-tests b/gnulib/modules/mbrtowc-tests
new file mode 100644
index 00000000..d9c0d183
--- /dev/null
+++ b/gnulib/modules/mbrtowc-tests
@@ -0,0 +1,32 @@
+Files:
+tests/test-mbrtowc1.sh
+tests/test-mbrtowc2.sh
+tests/test-mbrtowc3.sh
+tests/test-mbrtowc4.sh
+tests/test-mbrtowc.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+mbsinit
+wctob
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_JA
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-mbrtowc1.sh test-mbrtowc2.sh test-mbrtowc3.sh test-mbrtowc4.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
+ LOCALE_JA='@LOCALE_JA@' \
+ LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-mbrtowc
+
diff --git a/gnulib/modules/mbscasecmp b/gnulib/modules/mbscasecmp
new file mode 100644
index 00000000..73181529
--- /dev/null
+++ b/gnulib/modules/mbscasecmp
@@ -0,0 +1,25 @@
+Description:
+mbscasecmp() function: case-insensitive string comparison.
+
+Files:
+lib/mbscasecmp.c
+
+Depends-on:
+mbuiter
+string
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbscasecmp])
+
+Makefile.am:
+lib_SOURCES += mbscasecmp.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbscasecmp-tests b/gnulib/modules/mbscasecmp-tests
new file mode 100644
index 00000000..9e89bfea
--- /dev/null
+++ b/gnulib/modules/mbscasecmp-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-mbscasecmp.sh
+tests/test-mbscasecmp.c
+tests/macros.h
+m4/locale-tr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_TR_UTF8
+
+Makefile.am:
+TESTS += test-mbscasecmp.sh
+TESTS_ENVIRONMENT += LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
+check_PROGRAMS += test-mbscasecmp
+
diff --git a/gnulib/modules/mbscasestr b/gnulib/modules/mbscasestr
new file mode 100644
index 00000000..7d4a6149
--- /dev/null
+++ b/gnulib/modules/mbscasestr
@@ -0,0 +1,30 @@
+Description:
+mbscasestr() function: case-insensitive search for a substring in a string.
+
+Files:
+lib/mbscasestr.c
+lib/str-kmp.h
+
+Depends-on:
+mbuiter
+stdbool
+string
+mbslen
+malloca
+strnlen
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbscasestr])
+
+Makefile.am:
+lib_SOURCES += mbscasestr.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbscasestr-tests b/gnulib/modules/mbscasestr-tests
new file mode 100644
index 00000000..30f09199
--- /dev/null
+++ b/gnulib/modules/mbscasestr-tests
@@ -0,0 +1,26 @@
+Files:
+tests/test-mbscasestr1.c
+tests/test-mbscasestr2.sh
+tests/test-mbscasestr2.c
+tests/test-mbscasestr3.sh
+tests/test-mbscasestr3.c
+tests/test-mbscasestr4.sh
+tests/test-mbscasestr4.c
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-tr.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR_UTF8
+gt_LOCALE_TR_UTF8
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-mbscasestr1 test-mbscasestr2.sh test-mbscasestr3.sh test-mbscasestr4.sh
+TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' LOCALE_TR_UTF8='@LOCALE_TR_UTF8@' LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-mbscasestr1 test-mbscasestr2 test-mbscasestr3 test-mbscasestr4
+
diff --git a/gnulib/modules/mbschr b/gnulib/modules/mbschr
new file mode 100644
index 00000000..8bd2b29e
--- /dev/null
+++ b/gnulib/modules/mbschr
@@ -0,0 +1,25 @@
+Description:
+mbschr() function: search a string for a character.
+
+Files:
+lib/mbschr.c
+
+Depends-on:
+mbuiter
+string
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbschr])
+
+Makefile.am:
+lib_SOURCES += mbschr.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbschr-tests b/gnulib/modules/mbschr-tests
new file mode 100644
index 00000000..a26d8dd4
--- /dev/null
+++ b/gnulib/modules/mbschr-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-mbschr.sh
+tests/test-mbschr.c
+tests/macros.h
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-mbschr.sh
+TESTS_ENVIRONMENT += LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-mbschr
+
diff --git a/gnulib/modules/mbscspn b/gnulib/modules/mbscspn
new file mode 100644
index 00000000..ecea4a8e
--- /dev/null
+++ b/gnulib/modules/mbscspn
@@ -0,0 +1,27 @@
+Description:
+mbscspn() function: search a string for any of a set of characters.
+
+Files:
+lib/mbscspn.c
+
+Depends-on:
+mbuiter
+string
+mbschr
+strcspn
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbscspn])
+
+Makefile.am:
+lib_SOURCES += mbscspn.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbscspn-tests b/gnulib/modules/mbscspn-tests
new file mode 100644
index 00000000..f31e3479
--- /dev/null
+++ b/gnulib/modules/mbscspn-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-mbscspn.sh
+tests/test-mbscspn.c
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-mbscspn.sh
+TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-mbscspn
+
diff --git a/gnulib/modules/mbsinit b/gnulib/modules/mbsinit
new file mode 100644
index 00000000..4e673c77
--- /dev/null
+++ b/gnulib/modules/mbsinit
@@ -0,0 +1,29 @@
+Description:
+mbsinit() function: test for initial conversion state.
+
+Files:
+lib/mbsinit.c
+m4/mbsinit.m4
+m4/mbstate_t.m4
+
+Depends-on:
+wchar
+mbrtowc
+verify
+extensions
+
+configure.ac:
+gl_FUNC_MBSINIT
+gl_WCHAR_MODULE_INDICATOR([mbsinit])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsinit-tests b/gnulib/modules/mbsinit-tests
new file mode 100644
index 00000000..3a8a7a01
--- /dev/null
+++ b/gnulib/modules/mbsinit-tests
@@ -0,0 +1,19 @@
+Files:
+tests/test-mbsinit.sh
+tests/test-mbsinit.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+mbrtowc
+
+configure.ac:
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-mbsinit.sh
+TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-mbsinit
+
diff --git a/gnulib/modules/mbslen b/gnulib/modules/mbslen
new file mode 100644
index 00000000..3551809f
--- /dev/null
+++ b/gnulib/modules/mbslen
@@ -0,0 +1,27 @@
+Description:
+mbslen() function: Determine the number of multibyte characters in a string.
+
+Files:
+lib/mbslen.c
+m4/mbslen.m4
+
+Depends-on:
+mbuiter
+string
+
+configure.ac:
+gl_MBSLEN
+gl_STRING_MODULE_INDICATOR([mbslen])
+
+Makefile.am:
+lib_SOURCES += mbslen.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsncasecmp b/gnulib/modules/mbsncasecmp
new file mode 100644
index 00000000..34cb0530
--- /dev/null
+++ b/gnulib/modules/mbsncasecmp
@@ -0,0 +1,25 @@
+Description:
+mbsncasecmp() function: case-insensitive string prefix comparison.
+
+Files:
+lib/mbsncasecmp.c
+
+Depends-on:
+mbuiter
+string
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbsncasecmp])
+
+Makefile.am:
+lib_SOURCES += mbsncasecmp.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsncasecmp-tests b/gnulib/modules/mbsncasecmp-tests
new file mode 100644
index 00000000..81b8ba91
--- /dev/null
+++ b/gnulib/modules/mbsncasecmp-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-mbsncasecmp.sh
+tests/test-mbsncasecmp.c
+tests/macros.h
+m4/locale-tr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_TR_UTF8
+
+Makefile.am:
+TESTS += test-mbsncasecmp.sh
+TESTS_ENVIRONMENT += LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
+check_PROGRAMS += test-mbsncasecmp
+
diff --git a/gnulib/modules/mbsnlen b/gnulib/modules/mbsnlen
new file mode 100644
index 00000000..568d4859
--- /dev/null
+++ b/gnulib/modules/mbsnlen
@@ -0,0 +1,25 @@
+Description:
+mbsnlen() function: Determine the number of multibyte characters in a string.
+
+Files:
+lib/mbsnlen.c
+
+Depends-on:
+mbiter
+string
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbsnlen])
+
+Makefile.am:
+lib_SOURCES += mbsnlen.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsnrtowcs b/gnulib/modules/mbsnrtowcs
new file mode 100644
index 00000000..30ffcadb
--- /dev/null
+++ b/gnulib/modules/mbsnrtowcs
@@ -0,0 +1,31 @@
+Description:
+mbsnrtowcs() function: convert string to wide string.
+
+Files:
+lib/mbsnrtowcs.c
+lib/mbsrtowcs-state.c
+m4/mbsnrtowcs.m4
+m4/mbstate_t.m4
+
+Depends-on:
+extensions
+wchar
+mbrtowc
+minmax
+strnlen1
+
+configure.ac:
+gl_FUNC_MBSNRTOWCS
+gl_WCHAR_MODULE_INDICATOR([mbsnrtowcs])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsnrtowcs-tests b/gnulib/modules/mbsnrtowcs-tests
new file mode 100644
index 00000000..1d43beb8
--- /dev/null
+++ b/gnulib/modules/mbsnrtowcs-tests
@@ -0,0 +1,33 @@
+Files:
+tests/test-mbsnrtowcs1.sh
+tests/test-mbsnrtowcs2.sh
+tests/test-mbsnrtowcs3.sh
+tests/test-mbsnrtowcs4.sh
+tests/test-mbsnrtowcs.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+mbrtowc
+mbsinit
+wctob
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_JA
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-mbsnrtowcs1.sh test-mbsnrtowcs2.sh test-mbsnrtowcs3.sh test-mbsnrtowcs4.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
+ LOCALE_JA='@LOCALE_JA@' \
+ LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-mbsnrtowcs
+
diff --git a/gnulib/modules/mbspbrk b/gnulib/modules/mbspbrk
new file mode 100644
index 00000000..80d51334
--- /dev/null
+++ b/gnulib/modules/mbspbrk
@@ -0,0 +1,27 @@
+Description:
+mbspbrk() function: search a string for any of a set of characters.
+
+Files:
+lib/mbspbrk.c
+
+Depends-on:
+mbuiter
+string
+mbschr
+strpbrk
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbspbrk])
+
+Makefile.am:
+lib_SOURCES += mbspbrk.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbspbrk-tests b/gnulib/modules/mbspbrk-tests
new file mode 100644
index 00000000..d22cf198
--- /dev/null
+++ b/gnulib/modules/mbspbrk-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-mbspbrk.sh
+tests/test-mbspbrk.c
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-mbspbrk.sh
+TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-mbspbrk
+
diff --git a/gnulib/modules/mbspcasecmp b/gnulib/modules/mbspcasecmp
new file mode 100644
index 00000000..c3e59c02
--- /dev/null
+++ b/gnulib/modules/mbspcasecmp
@@ -0,0 +1,25 @@
+Description:
+mbspcasecmp() function: case-insensitive string prefix comparison.
+
+Files:
+lib/mbspcasecmp.c
+
+Depends-on:
+mbuiter
+string
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbspcasecmp])
+
+Makefile.am:
+lib_SOURCES += mbspcasecmp.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbspcasecmp-tests b/gnulib/modules/mbspcasecmp-tests
new file mode 100644
index 00000000..0b1c7d3d
--- /dev/null
+++ b/gnulib/modules/mbspcasecmp-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-mbspcasecmp.sh
+tests/test-mbspcasecmp.c
+tests/macros.h
+m4/locale-tr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_TR_UTF8
+
+Makefile.am:
+TESTS += test-mbspcasecmp.sh
+TESTS_ENVIRONMENT += LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
+check_PROGRAMS += test-mbspcasecmp
+
diff --git a/gnulib/modules/mbsrchr b/gnulib/modules/mbsrchr
new file mode 100644
index 00000000..7d4f2473
--- /dev/null
+++ b/gnulib/modules/mbsrchr
@@ -0,0 +1,25 @@
+Description:
+mbsrchr() function: search a string for a character, from the end.
+
+Files:
+lib/mbsrchr.c
+
+Depends-on:
+mbuiter
+string
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbsrchr])
+
+Makefile.am:
+lib_SOURCES += mbsrchr.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsrchr-tests b/gnulib/modules/mbsrchr-tests
new file mode 100644
index 00000000..70d7c206
--- /dev/null
+++ b/gnulib/modules/mbsrchr-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-mbsrchr.sh
+tests/test-mbsrchr.c
+tests/macros.h
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-mbsrchr.sh
+TESTS_ENVIRONMENT += LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-mbsrchr
+
diff --git a/gnulib/modules/mbsrtowcs b/gnulib/modules/mbsrtowcs
new file mode 100644
index 00000000..948763a4
--- /dev/null
+++ b/gnulib/modules/mbsrtowcs
@@ -0,0 +1,34 @@
+Description:
+mbsrtowcs() function: convert string to wide string.
+
+Files:
+lib/mbsrtowcs.c
+lib/mbsrtowcs-state.c
+m4/mbsrtowcs.m4
+m4/mbstate_t.m4
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+wchar
+mbrtowc
+strnlen1
+extensions
+
+configure.ac:
+gl_FUNC_MBSRTOWCS
+gl_WCHAR_MODULE_INDICATOR([mbsrtowcs])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsrtowcs-tests b/gnulib/modules/mbsrtowcs-tests
new file mode 100644
index 00000000..4b05e52f
--- /dev/null
+++ b/gnulib/modules/mbsrtowcs-tests
@@ -0,0 +1,33 @@
+Files:
+tests/test-mbsrtowcs1.sh
+tests/test-mbsrtowcs2.sh
+tests/test-mbsrtowcs3.sh
+tests/test-mbsrtowcs4.sh
+tests/test-mbsrtowcs.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+mbrtowc
+mbsinit
+wctob
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_JA
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-mbsrtowcs1.sh test-mbsrtowcs2.sh test-mbsrtowcs3.sh test-mbsrtowcs4.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
+ LOCALE_JA='@LOCALE_JA@' \
+ LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-mbsrtowcs
+
diff --git a/gnulib/modules/mbssep b/gnulib/modules/mbssep
new file mode 100644
index 00000000..2e30c5c1
--- /dev/null
+++ b/gnulib/modules/mbssep
@@ -0,0 +1,27 @@
+Description:
+mbssep() function: split string into tokens, thread safe.
+
+Files:
+lib/mbssep.c
+
+Depends-on:
+mbuiter
+string
+mbspbrk
+strsep
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbssep])
+
+Makefile.am:
+lib_SOURCES += mbssep.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsspn b/gnulib/modules/mbsspn
new file mode 100644
index 00000000..f0bc950f
--- /dev/null
+++ b/gnulib/modules/mbsspn
@@ -0,0 +1,26 @@
+Description:
+mbsspn() function: search a string for any outside a set of characters.
+
+Files:
+lib/mbsspn.c
+
+Depends-on:
+mbuiter
+string
+mbschr
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbsspn])
+
+Makefile.am:
+lib_SOURCES += mbsspn.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsspn-tests b/gnulib/modules/mbsspn-tests
new file mode 100644
index 00000000..ace5c766
--- /dev/null
+++ b/gnulib/modules/mbsspn-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-mbsspn.sh
+tests/test-mbsspn.c
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-mbsspn.sh
+TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-mbsspn
+
diff --git a/gnulib/modules/mbsstr b/gnulib/modules/mbsstr
new file mode 100644
index 00000000..7a68edc3
--- /dev/null
+++ b/gnulib/modules/mbsstr
@@ -0,0 +1,30 @@
+Description:
+mbsstr() function: search for a substring in a string.
+
+Files:
+lib/mbsstr.c
+lib/str-kmp.h
+
+Depends-on:
+mbuiter
+stdbool
+string
+mbslen
+malloca
+strnlen
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbsstr])
+
+Makefile.am:
+lib_SOURCES += mbsstr.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbsstr-tests b/gnulib/modules/mbsstr-tests
new file mode 100644
index 00000000..21a85906
--- /dev/null
+++ b/gnulib/modules/mbsstr-tests
@@ -0,0 +1,22 @@
+Files:
+tests/test-mbsstr1.c
+tests/test-mbsstr2.sh
+tests/test-mbsstr2.c
+tests/test-mbsstr3.sh
+tests/test-mbsstr3.c
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR_UTF8
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-mbsstr1 test-mbsstr2.sh test-mbsstr3.sh
+TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-mbsstr1 test-mbsstr2 test-mbsstr3
+
diff --git a/gnulib/modules/mbstok_r b/gnulib/modules/mbstok_r
new file mode 100644
index 00000000..c51be541
--- /dev/null
+++ b/gnulib/modules/mbstok_r
@@ -0,0 +1,28 @@
+Description:
+mbstok_r() function: split string into tokens, thread safe.
+
+Files:
+lib/mbstok_r.c
+
+Depends-on:
+mbuiter
+string
+mbsspn
+mbspbrk
+strtok_r
+
+configure.ac:
+gl_STRING_MODULE_INDICATOR([mbstok_r])
+
+Makefile.am:
+lib_SOURCES += mbstok_r.c
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mbswidth b/gnulib/modules/mbswidth
new file mode 100644
index 00000000..330748df
--- /dev/null
+++ b/gnulib/modules/mbswidth
@@ -0,0 +1,32 @@
+Description:
+Determine the number of screen columns needed for a string.
+
+Files:
+lib/mbswidth.h
+lib/mbswidth.c
+m4/mbstate_t.m4
+m4/mbrtowc.m4
+m4/mbswidth.m4
+
+Depends-on:
+wchar
+wctype
+mbrtowc
+mbsinit
+wcwidth
+extensions
+
+configure.ac:
+gl_MBSWIDTH
+
+Makefile.am:
+lib_SOURCES += mbswidth.h mbswidth.c
+
+Include:
+"mbswidth.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/mbuiter b/gnulib/modules/mbuiter
new file mode 100644
index 00000000..c729b09e
--- /dev/null
+++ b/gnulib/modules/mbuiter
@@ -0,0 +1,31 @@
+Description:
+Iterating through multibyte strings.
+
+Files:
+lib/mbuiter.h
+m4/mbiter.m4
+m4/mbrtowc.m4
+
+Depends-on:
+mbchar
+mbrtowc
+mbsinit
+wchar
+stdbool
+strnlen1
+
+configure.ac:
+gl_MBITER
+
+Makefile.am:
+lib_SOURCES += mbuiter.h
+
+Include:
+"mbuiter.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/memcasecmp b/gnulib/modules/memcasecmp
new file mode 100644
index 00000000..c3847913
--- /dev/null
+++ b/gnulib/modules/memcasecmp
@@ -0,0 +1,23 @@
+Description:
+Case-insensitive memory area comparison.
+
+Files:
+lib/memcasecmp.h
+lib/memcasecmp.c
+m4/memcasecmp.m4
+
+Depends-on:
+
+configure.ac:
+gl_MEMCASECMP
+
+Makefile.am:
+
+Include:
+"memcasecmp.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/memchr b/gnulib/modules/memchr
new file mode 100644
index 00000000..495f2e26
--- /dev/null
+++ b/gnulib/modules/memchr
@@ -0,0 +1,27 @@
+Description:
+memchr() function: scan memory for a byte.
+
+Files:
+lib/memchr.c
+lib/memchr.valgrind
+m4/memchr.m4
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+string
+
+configure.ac:
+gl_FUNC_MEMCHR
+gl_STRING_MODULE_INDICATOR([memchr])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/memchr-tests b/gnulib/modules/memchr-tests
new file mode 100644
index 00000000..4fafa8dc
--- /dev/null
+++ b/gnulib/modules/memchr-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-memchr.c
+tests/zerosize-ptr.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-memchr
+check_PROGRAMS += test-memchr
diff --git a/gnulib/modules/memchr2 b/gnulib/modules/memchr2
new file mode 100644
index 00000000..99e4b856
--- /dev/null
+++ b/gnulib/modules/memchr2
@@ -0,0 +1,25 @@
+Description:
+memchr2() function: scan memory for the first of two bytes.
+
+Files:
+lib/memchr2.h
+lib/memchr2.c
+lib/memchr2.valgrind
+
+Depends-on:
+stdint
+memchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += memchr2.h memchr2.c
+
+Include:
+"memchr2.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/memchr2-tests b/gnulib/modules/memchr2-tests
new file mode 100644
index 00000000..66901aef
--- /dev/null
+++ b/gnulib/modules/memchr2-tests
@@ -0,0 +1,18 @@
+Files:
+tests/test-memchr2.c
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-memchr2
+check_PROGRAMS += test-memchr2
diff --git a/gnulib/modules/memcmp b/gnulib/modules/memcmp
new file mode 100644
index 00000000..c6bc2620
--- /dev/null
+++ b/gnulib/modules/memcmp
@@ -0,0 +1,30 @@
+Description:
+memcmp() function: compare memory areas.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/memcmp.c
+m4/memcmp.m4
+
+Depends-on:
+stdint
+
+configure.ac:
+gl_FUNC_MEMCMP
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, glibc
+
diff --git a/gnulib/modules/memcmp-tests b/gnulib/modules/memcmp-tests
new file mode 100644
index 00000000..15f099c0
--- /dev/null
+++ b/gnulib/modules/memcmp-tests
@@ -0,0 +1,19 @@
+Files:
+tests/test-memcmp.c
+tests/zerosize-ptr.h
+tests/signature.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-memcmp
+check_PROGRAMS += test-memcmp
diff --git a/gnulib/modules/memcmp2 b/gnulib/modules/memcmp2
new file mode 100644
index 00000000..355f7ebf
--- /dev/null
+++ b/gnulib/modules/memcmp2
@@ -0,0 +1,22 @@
+Description:
+Compare two memory areas with possibly different lengths.
+
+Files:
+lib/memcmp2.h
+lib/memcmp2.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += memcmp2.c
+
+Include:
+"memcmp2.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/memcoll b/gnulib/modules/memcoll
new file mode 100644
index 00000000..1d334ccd
--- /dev/null
+++ b/gnulib/modules/memcoll
@@ -0,0 +1,24 @@
+Description:
+Locale dependent memory area comparison.
+
+Files:
+lib/memcoll.h
+lib/memcoll.c
+m4/memcoll.m4
+
+Depends-on:
+memcmp
+
+configure.ac:
+gl_MEMCOLL
+
+Makefile.am:
+
+Include:
+"memcoll.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/memcpy b/gnulib/modules/memcpy
new file mode 100644
index 00000000..1758bdf8
--- /dev/null
+++ b/gnulib/modules/memcpy
@@ -0,0 +1,29 @@
+Description:
+memcpy() function: copy memory area.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/memcpy.c
+m4/memcpy.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_MEMCPY
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/memmem b/gnulib/modules/memmem
new file mode 100644
index 00000000..8dea8932
--- /dev/null
+++ b/gnulib/modules/memmem
@@ -0,0 +1,21 @@
+Description:
+memmem() function: efficiently locate first substring in a buffer.
+
+Files:
+
+Depends-on:
+memmem-simple
+
+configure.ac:
+gl_FUNC_MEMMEM
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+libc, Eric Blake
diff --git a/gnulib/modules/memmem-simple b/gnulib/modules/memmem-simple
new file mode 100644
index 00000000..c84755d6
--- /dev/null
+++ b/gnulib/modules/memmem-simple
@@ -0,0 +1,29 @@
+Description:
+memmem() function: locate first substring in a buffer.
+
+Files:
+lib/str-two-way.h
+lib/memmem.c
+m4/memmem.m4
+
+Depends-on:
+extensions
+string
+stdint
+memchr
+memcmp
+
+configure.ac:
+gl_FUNC_MEMMEM_SIMPLE
+gl_STRING_MODULE_INDICATOR([memmem])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+libc, Eric Blake, Simon Josefsson
diff --git a/gnulib/modules/memmem-tests b/gnulib/modules/memmem-tests
new file mode 100644
index 00000000..4738d5c8
--- /dev/null
+++ b/gnulib/modules/memmem-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-memmem.c
+tests/zerosize-ptr.h
+tests/signature.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-memmem
+check_PROGRAMS += test-memmem
+
diff --git a/gnulib/modules/memmove b/gnulib/modules/memmove
new file mode 100644
index 00000000..53ca9726
--- /dev/null
+++ b/gnulib/modules/memmove
@@ -0,0 +1,28 @@
+Description:
+memmove() function: copy memory area.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/memmove.c
+m4/memmove.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_MEMMOVE
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+public domain
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/mempcpy b/gnulib/modules/mempcpy
new file mode 100644
index 00000000..5fd8bdce
--- /dev/null
+++ b/gnulib/modules/mempcpy
@@ -0,0 +1,25 @@
+Description:
+mempcpy() function: copy memory area, return point after last written byte.
+
+Files:
+lib/mempcpy.c
+m4/mempcpy.m4
+
+Depends-on:
+extensions
+string
+
+configure.ac:
+gl_FUNC_MEMPCPY
+gl_STRING_MODULE_INDICATOR([mempcpy])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/memrchr b/gnulib/modules/memrchr
new file mode 100644
index 00000000..3a6e982b
--- /dev/null
+++ b/gnulib/modules/memrchr
@@ -0,0 +1,25 @@
+Description:
+memrchr() function: scan memory for a byte, from the right end.
+
+Files:
+lib/memrchr.c
+m4/memrchr.m4
+
+Depends-on:
+extensions
+string
+
+configure.ac:
+gl_FUNC_MEMRCHR
+gl_STRING_MODULE_INDICATOR([memrchr])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/memrchr-tests b/gnulib/modules/memrchr-tests
new file mode 100644
index 00000000..e3af2777
--- /dev/null
+++ b/gnulib/modules/memrchr-tests
@@ -0,0 +1,19 @@
+Files:
+tests/test-memrchr.c
+tests/zerosize-ptr.h
+tests/signature.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-memrchr
+check_PROGRAMS += test-memrchr
diff --git a/gnulib/modules/memset b/gnulib/modules/memset
new file mode 100644
index 00000000..9b2a89d9
--- /dev/null
+++ b/gnulib/modules/memset
@@ -0,0 +1,28 @@
+Description:
+memset() function: fill memory with a constant byte.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/memset.c
+m4/memset.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_MEMSET
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/memxfrm b/gnulib/modules/memxfrm
new file mode 100644
index 00000000..8c9033ca
--- /dev/null
+++ b/gnulib/modules/memxfrm
@@ -0,0 +1,22 @@
+Description:
+Locale dependent memory area transformation for comparison.
+
+Files:
+lib/memxfrm.h
+lib/memxfrm.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += memxfrm.c
+
+Include:
+"memxfrm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/memxor b/gnulib/modules/memxor
new file mode 100644
index 00000000..dea7eed2
--- /dev/null
+++ b/gnulib/modules/memxor
@@ -0,0 +1,23 @@
+Description:
+memxor() function: binary exclusive or operation on two memory blocks
+
+Files:
+lib/memxor.h
+lib/memxor.c
+m4/memxor.m4
+
+Depends-on:
+
+configure.ac:
+gl_MEMXOR
+
+Makefile.am:
+
+Include:
+"memxor.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/mgetgroups b/gnulib/modules/mgetgroups
new file mode 100644
index 00000000..cd249dba
--- /dev/null
+++ b/gnulib/modules/mgetgroups
@@ -0,0 +1,27 @@
+Description:
+Return the group IDs of a user or current process in malloc'd storage.
+
+Files:
+lib/mgetgroups.c
+lib/mgetgroups.h
+m4/mgetgroups.m4
+
+Depends-on:
+getgroups
+getugroups
+realloc
+xalloc
+
+configure.ac:
+gl_MGETGROUPS
+
+Makefile.am:
+
+Include:
+"mgetgroups.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/minmax b/gnulib/modules/minmax
new file mode 100644
index 00000000..19ea4338
--- /dev/null
+++ b/gnulib/modules/minmax
@@ -0,0 +1,24 @@
+Description:
+MIN, MAX macros.
+
+Files:
+lib/minmax.h
+m4/minmax.m4
+
+Depends-on:
+
+configure.ac:
+gl_MINMAX
+
+Makefile.am:
+lib_SOURCES += minmax.h
+
+Include:
+"minmax.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mkancesdirs b/gnulib/modules/mkancesdirs
new file mode 100644
index 00000000..bff63e1f
--- /dev/null
+++ b/gnulib/modules/mkancesdirs
@@ -0,0 +1,28 @@
+Description:
+Ensure the existence of the ancestor directories of a file.
+
+Files:
+lib/mkancesdirs.c
+lib/mkancesdirs.h
+m4/mkancesdirs.m4
+
+Depends-on:
+dirname-lgpl
+fcntl-h
+savewd
+stat-macros
+sys_stat
+
+configure.ac:
+gl_MKANCESDIRS
+
+Makefile.am:
+
+Include:
+"mkancesdirs.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/mkdir b/gnulib/modules/mkdir
new file mode 100644
index 00000000..08089d00
--- /dev/null
+++ b/gnulib/modules/mkdir
@@ -0,0 +1,24 @@
+Description:
+mkdir() function: create a directory.
+
+Files:
+lib/mkdir.c
+m4/mkdir.m4
+
+Depends-on:
+dirname-lgpl
+sys_stat
+
+configure.ac:
+gl_FUNC_MKDIR
+
+Makefile.am:
+
+Include:
+<sys/stat.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/mkdir-p b/gnulib/modules/mkdir-p
new file mode 100644
index 00000000..3b0abdf4
--- /dev/null
+++ b/gnulib/modules/mkdir-p
@@ -0,0 +1,37 @@
+Description:
+Ensure that a directory and its parents exist.
+
+Files:
+lib/dirchownmod.c
+lib/dirchownmod.h
+lib/mkdir-p.c
+lib/mkdir-p.h
+m4/mkdir-p.m4
+
+Depends-on:
+error
+fcntl-h
+gettext-h
+lchmod
+lchown
+mkancesdirs
+quote
+savewd
+stat
+stat-macros
+stdbool
+sys_stat
+
+configure.ac:
+gl_MKDIR_PARENTS
+
+Makefile.am:
+
+Include:
+"mkdir-p.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/mkdir-tests b/gnulib/modules/mkdir-tests
new file mode 100644
index 00000000..fea1b63e
--- /dev/null
+++ b/gnulib/modules/mkdir-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-mkdir.h
+tests/test-mkdir.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-mkdir
+check_PROGRAMS += test-mkdir
diff --git a/gnulib/modules/mkdtemp b/gnulib/modules/mkdtemp
new file mode 100644
index 00000000..3c5aeee2
--- /dev/null
+++ b/gnulib/modules/mkdtemp
@@ -0,0 +1,27 @@
+Description:
+mkdtemp() function: create a private temporary directory.
+
+Files:
+lib/mkdtemp.c
+m4/mkdtemp.m4
+
+Depends-on:
+stdint
+stdlib
+tempname
+
+configure.ac:
+gt_FUNC_MKDTEMP
+gl_STDLIB_MODULE_INDICATOR([mkdtemp])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/mkfifo b/gnulib/modules/mkfifo
new file mode 100644
index 00000000..ce7af63c
--- /dev/null
+++ b/gnulib/modules/mkfifo
@@ -0,0 +1,25 @@
+Description:
+mkfifo(): create named FIFO
+
+Files:
+lib/mkfifo.c
+m4/mkfifo.m4
+
+Depends-on:
+stat
+sys_stat
+
+configure.ac:
+gl_FUNC_MKFIFO
+gl_UNISTD_MODULE_INDICATOR([mkfifo])
+
+Makefile.am:
+
+Include:
+<sys/stat.h>
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/mkfifo-tests b/gnulib/modules/mkfifo-tests
new file mode 100644
index 00000000..00ca98f9
--- /dev/null
+++ b/gnulib/modules/mkfifo-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-mkfifo.h
+tests/test-mkfifo.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-mkfifo
+check_PROGRAMS += test-mkfifo
diff --git a/gnulib/modules/mkfifoat b/gnulib/modules/mkfifoat
new file mode 100644
index 00000000..2bc7e655
--- /dev/null
+++ b/gnulib/modules/mkfifoat
@@ -0,0 +1,32 @@
+Description:
+mkfifoat() and mknodat(): create named FIFOs relative to a directory
+
+Files:
+lib/mkfifoat.c
+lib/mknodat.c
+m4/mkfifoat.m4
+
+Depends-on:
+extensions
+fcntl-h
+mkfifo
+mknod
+openat
+sys_stat
+
+configure.ac:
+gl_FUNC_MKFIFOAT
+gl_UNISTD_MODULE_INDICATOR([mkfifoat])
+gl_UNISTD_MODULE_INDICATOR([mknodat])
+
+Makefile.am:
+
+Include:
+<fcntl.h>
+<sys/stat.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/mkfifoat-tests b/gnulib/modules/mkfifoat-tests
new file mode 100644
index 00000000..8be33df0
--- /dev/null
+++ b/gnulib/modules/mkfifoat-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-mkfifo.h
+tests/test-mkfifoat.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-mkfifoat
+check_PROGRAMS += test-mkfifoat
+test_mkfifoat_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/mknod b/gnulib/modules/mknod
new file mode 100644
index 00000000..b3329cb6
--- /dev/null
+++ b/gnulib/modules/mknod
@@ -0,0 +1,27 @@
+Description:
+mknod(): create various special devices
+
+Files:
+lib/mknod.c
+m4/mknod.m4
+
+Depends-on:
+mkfifo
+stat
+sys_stat
+extensions
+
+configure.ac:
+gl_FUNC_MKNOD
+gl_UNISTD_MODULE_INDICATOR([mknod])
+
+Makefile.am:
+
+Include:
+<sys/stat.h>
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/mknod-tests b/gnulib/modules/mknod-tests
new file mode 100644
index 00000000..e35ffec7
--- /dev/null
+++ b/gnulib/modules/mknod-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-mkfifo.h
+tests/test-mknod.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-mknod
+check_PROGRAMS += test-mknod
diff --git a/gnulib/modules/mkostemp b/gnulib/modules/mkostemp
new file mode 100644
index 00000000..8a61dbeb
--- /dev/null
+++ b/gnulib/modules/mkostemp
@@ -0,0 +1,28 @@
+Description:
+mkostemp() function: create a private temporary file, with specific opening
+flags.
+
+Files:
+lib/mkostemp.c
+m4/mkostemp.m4
+
+Depends-on:
+extensions
+stdlib
+tempname
+
+configure.ac:
+gl_FUNC_MKOSTEMP
+gl_MODULE_INDICATOR([mkostemp])
+gl_STDLIB_MODULE_INDICATOR([mkostemp])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, Bruno Haible
diff --git a/gnulib/modules/mkostemps b/gnulib/modules/mkostemps
new file mode 100644
index 00000000..a4175bdb
--- /dev/null
+++ b/gnulib/modules/mkostemps
@@ -0,0 +1,28 @@
+Description:
+mkostemps() function: create a private temporary file, with specific opening
+flags, and with suffix.
+
+Files:
+lib/mkostemps.c
+m4/mkostemps.m4
+
+Depends-on:
+extensions
+stdlib
+tempname
+
+configure.ac:
+gl_FUNC_MKOSTEMPS
+gl_MODULE_INDICATOR([mkostemps])
+gl_STDLIB_MODULE_INDICATOR([mkostemps])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/mkstemp b/gnulib/modules/mkstemp
new file mode 100644
index 00000000..265144b9
--- /dev/null
+++ b/gnulib/modules/mkstemp
@@ -0,0 +1,26 @@
+Description:
+mkstemp() function: create a private temporary file.
+
+Files:
+lib/mkstemp.c
+m4/mkstemp.m4
+
+Depends-on:
+extensions
+stdlib
+tempname
+
+configure.ac:
+gl_FUNC_MKSTEMP
+gl_STDLIB_MODULE_INDICATOR([mkstemp])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/mkstemps b/gnulib/modules/mkstemps
new file mode 100644
index 00000000..2a497776
--- /dev/null
+++ b/gnulib/modules/mkstemps
@@ -0,0 +1,27 @@
+Description:
+mkstemps() function: create a private temporary file, with suffix
+
+Files:
+lib/mkstemps.c
+m4/mkstemps.m4
+
+Depends-on:
+extensions
+stdlib
+tempname
+
+configure.ac:
+gl_FUNC_MKSTEMPS
+gl_MODULE_INDICATOR([mkstemps])
+gl_STDLIB_MODULE_INDICATOR([mkstemps])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/mktempd b/gnulib/modules/mktempd
new file mode 100644
index 00000000..aa6fe824
--- /dev/null
+++ b/gnulib/modules/mktempd
@@ -0,0 +1,19 @@
+Description:
+Create a temporary directory, much like mktemp -d does.
+
+Files:
+build-aux/mktempd
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/mktime b/gnulib/modules/mktime
new file mode 100644
index 00000000..037f4e47
--- /dev/null
+++ b/gnulib/modules/mktime
@@ -0,0 +1,25 @@
+Description:
+mktime() function: convert broken-down time to linear time.
+
+Files:
+lib/mktime-internal.h
+lib/mktime.c
+m4/mktime.m4
+
+Depends-on:
+multiarch
+time_r
+
+configure.ac:
+gl_FUNC_MKTIME
+
+Makefile.am:
+
+Include:
+<time.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert, Jim Meyering, glibc
diff --git a/gnulib/modules/modechange b/gnulib/modules/modechange
new file mode 100644
index 00000000..e58589a6
--- /dev/null
+++ b/gnulib/modules/modechange
@@ -0,0 +1,29 @@
+Description:
+Manipulation of mode changes specified by strings (e.g. as first argument of
+chmod utility).
+
+Files:
+lib/modechange.h
+lib/modechange.c
+m4/modechange.m4
+
+Depends-on:
+stat
+stat-macros
+stdbool
+sys_stat
+xalloc
+
+configure.ac:
+gl_MODECHANGE
+
+Makefile.am:
+
+Include:
+"modechange.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/modf b/gnulib/modules/modf
new file mode 100644
index 00000000..0c5e4677
--- /dev/null
+++ b/gnulib/modules/modf
@@ -0,0 +1,24 @@
+Description:
+modf() function: get signed integer and fractional parts.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_MATHFUNC([modf], [double], [(double, double *)])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(MODF_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/modf-tests b/gnulib/modules/modf-tests
new file mode 100644
index 00000000..24e483df
--- /dev/null
+++ b/gnulib/modules/modf-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-modf.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-modf
+check_PROGRAMS += test-modf
+test_modf_LDADD = $(LDADD) @MODF_LIBM@
diff --git a/gnulib/modules/mountlist b/gnulib/modules/mountlist
new file mode 100644
index 00000000..65af9c1e
--- /dev/null
+++ b/gnulib/modules/mountlist
@@ -0,0 +1,29 @@
+Description:
+Return list of mounted file systems.
+
+Files:
+lib/mountlist.h
+lib/mountlist.c
+m4/ls-mntd-fs.m4
+m4/fstypename.m4
+m4/mountlist.m4
+
+Depends-on:
+stdbool
+stdint
+strstr-simple
+xalloc
+
+configure.ac:
+gl_MOUNTLIST
+
+Makefile.am:
+
+Include:
+"mountlist.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/mpsort b/gnulib/modules/mpsort
new file mode 100644
index 00000000..4804fd0e
--- /dev/null
+++ b/gnulib/modules/mpsort
@@ -0,0 +1,23 @@
+Description:
+Sort a vector of pointers to data.
+
+Files:
+lib/mpsort.h
+lib/mpsort.c
+m4/mpsort.m4
+
+Depends-on:
+
+configure.ac:
+gl_MPSORT
+
+Makefile.am:
+
+Include:
+"mpsort.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/multiarch b/gnulib/modules/multiarch
new file mode 100644
index 00000000..24b14d52
--- /dev/null
+++ b/gnulib/modules/multiarch
@@ -0,0 +1,21 @@
+Description:
+Detection of multi-architecture ("universal binary") builds.
+
+Files:
+m4/multiarch.m4
+
+Depends-on:
+
+configure.ac:
+gl_MULTIARCH
+
+Makefile.am:
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+Bruno Haible, autoconf
+
diff --git a/gnulib/modules/nanosleep b/gnulib/modules/nanosleep
new file mode 100644
index 00000000..d457b6f0
--- /dev/null
+++ b/gnulib/modules/nanosleep
@@ -0,0 +1,35 @@
+Description:
+nanosleep() function: pause execution for a specified time.
+
+Files:
+lib/nanosleep.c
+m4/nanosleep.m4
+
+Depends-on:
+extensions
+intprops
+multiarch
+select
+sigaction
+stdbool
+sys_select
+sys_time
+time
+verify
+
+configure.ac:
+gl_FUNC_NANOSLEEP
+
+Makefile.am:
+
+Include:
+<time.h>
+
+Link:
+$(LIB_NANOSLEEP)
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/nanosleep-tests b/gnulib/modules/nanosleep-tests
new file mode 100644
index 00000000..c3b5f2f8
--- /dev/null
+++ b/gnulib/modules/nanosleep-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-nanosleep.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-nanosleep
+check_PROGRAMS += test-nanosleep
+test_nanosleep_LDADD = $(LDADD) $(LIB_NANOSLEEP)
diff --git a/gnulib/modules/netdb b/gnulib/modules/netdb
new file mode 100644
index 00000000..5d9c3758
--- /dev/null
+++ b/gnulib/modules/netdb
@@ -0,0 +1,47 @@
+Description:
+A <netdb.h> for systems lacking it.
+
+Files:
+lib/netdb.in.h
+m4/netdb_h.m4
+
+Depends-on:
+include_next
+arg-nonnull
+sys_socket
+
+configure.ac:
+gl_HEADER_NETDB
+
+Makefile.am:
+BUILT_SOURCES += $(NETDB_H)
+
+# We need the following in order to create <netdb.h> when the system
+# doesn't have one that works with the given compiler.
+netdb.h: netdb.in.h $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_NETDB_H''@|$(NEXT_NETDB_H)|g' \
+ -e 's|@''HAVE_NETDB_H''@|$(HAVE_NETDB_H)|g' \
+ -e 's|@''GNULIB_GETADDRINFO''@|$(GNULIB_GETADDRINFO)|g' \
+ -e 's|@''HAVE_STRUCT_ADDRINFO''@|$(HAVE_STRUCT_ADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_FREEADDRINFO''@|$(HAVE_DECL_FREEADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_GAI_STRERROR''@|$(HAVE_DECL_GAI_STRERROR)|g' \
+ -e 's|@''HAVE_DECL_GETADDRINFO''@|$(HAVE_DECL_GETADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_GETNAMEINFO''@|$(HAVE_DECL_GETNAMEINFO)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ < $(srcdir)/netdb.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += netdb.h netdb.h-t
+
+Include:
+<netdb.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/netdb-tests b/gnulib/modules/netdb-tests
new file mode 100644
index 00000000..1c3ae0b3
--- /dev/null
+++ b/gnulib/modules/netdb-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-netdb.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-netdb
+check_PROGRAMS += test-netdb
diff --git a/gnulib/modules/netinet_in b/gnulib/modules/netinet_in
new file mode 100644
index 00000000..683e0db8
--- /dev/null
+++ b/gnulib/modules/netinet_in
@@ -0,0 +1,42 @@
+Description:
+A <netinet/in.h> for systems lacking it.
+
+Files:
+lib/netinet_in.in.h
+m4/netinet_in_h.m4
+
+Depends-on:
+include_next
+sys_socket
+
+configure.ac:
+gl_HEADER_NETINET_IN
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += $(NETINET_IN_H)
+
+# We need the following in order to create <netinet/in.h> when the system
+# doesn't have one.
+netinet/in.h: netinet_in.in.h
+ $(AM_V_at)$(MKDIR_P) netinet
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_NETINET_IN_H''@|$(NEXT_NETINET_IN_H)|g' \
+ -e 's|@''HAVE_NETINET_IN_H''@|$(HAVE_NETINET_IN_H)|g' \
+ < $(srcdir)/netinet_in.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += netinet/in.h netinet/in.h-t
+MOSTLYCLEANDIRS += netinet
+
+Include:
+<netinet/in.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/netinet_in-tests b/gnulib/modules/netinet_in-tests
new file mode 100644
index 00000000..08d1a28f
--- /dev/null
+++ b/gnulib/modules/netinet_in-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-netinet_in.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-netinet_in
+check_PROGRAMS += test-netinet_in
diff --git a/gnulib/modules/nextafter b/gnulib/modules/nextafter
new file mode 100644
index 00000000..ed93418b
--- /dev/null
+++ b/gnulib/modules/nextafter
@@ -0,0 +1,24 @@
+Description:
+nextafter() function: next representable 'double' number.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_MATHFUNC([nextafter], [double], [(double)])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(NEXTAFTER_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/nextafter-tests b/gnulib/modules/nextafter-tests
new file mode 100644
index 00000000..1bb372a1
--- /dev/null
+++ b/gnulib/modules/nextafter-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-nextafter.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-nextafter
+check_PROGRAMS += test-nextafter
+test_nextafter_LDADD = $(LDADD) @NEXTAFTER_LIBM@
diff --git a/gnulib/modules/nl_langinfo b/gnulib/modules/nl_langinfo
new file mode 100644
index 00000000..78133452
--- /dev/null
+++ b/gnulib/modules/nl_langinfo
@@ -0,0 +1,24 @@
+Description:
+nl_langinfo() function: query locale dependent information.
+
+Files:
+lib/nl_langinfo.c
+m4/nl_langinfo.m4
+
+Depends-on:
+langinfo
+
+configure.ac:
+gl_FUNC_NL_LANGINFO
+gl_LANGINFO_MODULE_INDICATOR([nl_langinfo])
+
+Makefile.am:
+
+Include:
+<langinfo.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/nl_langinfo-tests b/gnulib/modules/nl_langinfo-tests
new file mode 100644
index 00000000..dcb0af93
--- /dev/null
+++ b/gnulib/modules/nl_langinfo-tests
@@ -0,0 +1,18 @@
+Files:
+tests/test-nl_langinfo.sh
+tests/test-nl_langinfo.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+
+Depends-on:
+c-strcase
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-nl_langinfo.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-nl_langinfo
diff --git a/gnulib/modules/no-c++ b/gnulib/modules/no-c++
new file mode 100644
index 00000000..2f9e7c11
--- /dev/null
+++ b/gnulib/modules/no-c++
@@ -0,0 +1,21 @@
+Description:
+Support for compiling in C mode when CC is set to a C++ compiler.
+
+Files:
+m4/no-c++.m4
+
+Depends-on:
+
+configure.ac:
+gt_NO_CXX
+
+Makefile.am:
+
+Include:
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/nocrash b/gnulib/modules/nocrash
new file mode 100644
index 00000000..607c3940
--- /dev/null
+++ b/gnulib/modules/nocrash
@@ -0,0 +1,20 @@
+Description:
+Macro that avoids crashes in configure tests.
+
+Files:
+m4/nocrash.m4
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+unlimited
+
+Maintainer:
+Bruno Haible, Paolo Bonzini
+
diff --git a/gnulib/modules/nproc b/gnulib/modules/nproc
new file mode 100644
index 00000000..c04d4cd6
--- /dev/null
+++ b/gnulib/modules/nproc
@@ -0,0 +1,27 @@
+Description:
+Detect the number of processors
+
+Files:
+lib/nproc.h
+lib/nproc.c
+m4/nproc.m4
+
+Depends-on:
+c-ctype
+extensions
+unistd
+
+configure.ac:
+gl_NPROC
+
+Makefile.am:
+lib_SOURCES += nproc.c
+
+Include:
+"nproc.h"
+
+License:
+GPL
+
+Maintainer:
+Glen Lenker and Paul Eggert
diff --git a/gnulib/modules/obstack b/gnulib/modules/obstack
new file mode 100644
index 00000000..af12846b
--- /dev/null
+++ b/gnulib/modules/obstack
@@ -0,0 +1,27 @@
+Description:
+Memory allocation, optimized for stack-like allocation patterns.
+
+Files:
+lib/obstack.h
+lib/obstack.c
+
+Depends-on:
+gettext-h
+exit
+exitfail
+stdint
+
+configure.ac:
+AC_FUNC_OBSTACK
+dnl Note: AC_FUNC_OBSTACK does AC_LIBSOURCES([obstack.h, obstack.c]).
+
+Makefile.am:
+
+Include:
+"obstack.h"
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/obstack-printf b/gnulib/modules/obstack-printf
new file mode 100644
index 00000000..3604ce29
--- /dev/null
+++ b/gnulib/modules/obstack-printf
@@ -0,0 +1,27 @@
+Description:
+Formatted printing into an obstack.
+
+Files:
+m4/obstack-printf.m4
+lib/obstack_printf.c
+
+Depends-on:
+obstack
+stdio
+vasnprintf
+extensions
+
+configure.ac:
+gl_FUNC_OBSTACK_PRINTF
+gl_STDIO_MODULE_INDICATOR([obstack-printf])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/obstack-printf-posix b/gnulib/modules/obstack-printf-posix
new file mode 100644
index 00000000..eb7bef53
--- /dev/null
+++ b/gnulib/modules/obstack-printf-posix
@@ -0,0 +1,28 @@
+Description:
+POSIX formatted printing into an obstack.
+
+Files:
+m4/obstack-printf.m4
+m4/obstack-printf-posix.m4
+lib/obstack_printf.c
+
+Depends-on:
+obstack
+stdio
+vasnprintf-posix
+extensions
+
+configure.ac:
+gl_FUNC_OBSTACK_PRINTF_POSIX
+gl_STDIO_MODULE_INDICATOR([obstack-printf-posix])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/obstack-printf-posix-tests b/gnulib/modules/obstack-printf-posix-tests
new file mode 100644
index 00000000..a5b1bc10
--- /dev/null
+++ b/gnulib/modules/obstack-printf-posix-tests
@@ -0,0 +1,8 @@
+Files:
+
+Depends-on:
+obstack-printf-tests
+
+configure.ac:
+
+Makefile.am:
diff --git a/gnulib/modules/obstack-printf-tests b/gnulib/modules/obstack-printf-tests
new file mode 100644
index 00000000..f1c99ca9
--- /dev/null
+++ b/gnulib/modules/obstack-printf-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-obstack-printf.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+progname
+xalloc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-obstack-printf
+check_PROGRAMS += test-obstack-printf
+test_obstack_printf_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/open b/gnulib/modules/open
new file mode 100644
index 00000000..0b8b303f
--- /dev/null
+++ b/gnulib/modules/open
@@ -0,0 +1,28 @@
+Description:
+open() function: open a descriptor to a file.
+
+Files:
+lib/open.c
+m4/open.m4
+m4/mode_t.m4
+
+Depends-on:
+fcntl-h
+stat
+
+configure.ac:
+gl_FUNC_OPEN
+gl_MODULE_INDICATOR([open])
+gl_FCNTL_MODULE_INDICATOR([open])
+
+Makefile.am:
+
+Include:
+<fcntl.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/open-tests b/gnulib/modules/open-tests
new file mode 100644
index 00000000..5bc4e0f8
--- /dev/null
+++ b/gnulib/modules/open-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-open.h
+tests/test-open.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-open
+check_PROGRAMS += test-open
diff --git a/gnulib/modules/openat b/gnulib/modules/openat
new file mode 100644
index 00000000..37cae80f
--- /dev/null
+++ b/gnulib/modules/openat
@@ -0,0 +1,55 @@
+Description:
+Open a file at a directory.
+
+Files:
+lib/at-func.c
+lib/fchmodat.c
+lib/fchownat.c
+lib/fstatat.c
+lib/mkdirat.c
+lib/openat.c
+lib/openat.h
+lib/openat-priv.h
+lib/openat-proc.c
+lib/unlinkat.c
+m4/openat.m4
+m4/mode_t.m4
+
+Depends-on:
+dirname-lgpl
+errno
+extensions
+fchdir
+fcntl-h
+fdopendir
+gettext-h
+intprops
+lchown
+lstat
+mkdir
+open
+openat-die
+rmdir
+same-inode
+save-cwd
+stdbool
+sys_stat
+unistd
+unlink
+
+configure.ac:
+gl_FUNC_OPENAT
+
+Makefile.am:
+
+Include:
+<fcntl.h>
+<sys/stat.h>
+<unistd.h>
+"openat.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/openat-die b/gnulib/modules/openat-die
new file mode 100644
index 00000000..76cc44dc
--- /dev/null
+++ b/gnulib/modules/openat-die
@@ -0,0 +1,25 @@
+Description:
+Report a save- or restore-cwd failure in our openat replacement and then exit.
+
+Files:
+lib/openat-die.c
+
+Depends-on:
+openat
+error
+gettext-h
+exitfail
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += openat-die.c
+
+Include:
+"openat.h"
+
+License:
+GPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/openat-safer b/gnulib/modules/openat-safer
new file mode 100644
index 00000000..d5958839
--- /dev/null
+++ b/gnulib/modules/openat-safer
@@ -0,0 +1,28 @@
+Description:
+openat function that avoids clobbering std{in,out,err}.
+
+Files:
+lib/fcntl--.h
+lib/fcntl-safer.h
+lib/openat-safer.c
+m4/fcntl-safer.m4
+
+Depends-on:
+fcntl-safer
+openat
+unistd-safer
+
+configure.ac:
+gl_OPENAT_SAFER
+gl_MODULE_INDICATOR([openat-safer])
+
+Makefile.am:
+
+Include:
+"fcntl-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/openat-safer-tests b/gnulib/modules/openat-safer-tests
new file mode 100644
index 00000000..1f0b158f
--- /dev/null
+++ b/gnulib/modules/openat-safer-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-openat-safer.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-openat-safer
+check_PROGRAMS += test-openat-safer
+test_openat_safer_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/openat-tests b/gnulib/modules/openat-tests
new file mode 100644
index 00000000..250a5745
--- /dev/null
+++ b/gnulib/modules/openat-tests
@@ -0,0 +1,38 @@
+Files:
+tests/nap.h
+tests/test-chown.h
+tests/test-lchown.h
+tests/test-lstat.h
+tests/test-mkdir.h
+tests/test-rmdir.h
+tests/test-stat.h
+tests/test-unlink.h
+tests/test-fchownat.c
+tests/test-fstatat.c
+tests/test-mkdirat.c
+tests/test-openat.c
+tests/test-unlinkat.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+mgetgroups
+pathmax
+usleep
+stat-time
+symlink
+unlinkdir
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([getegid])
+
+Makefile.am:
+TESTS += test-fchownat test-fstatat test-mkdirat test-openat test-unlinkat
+check_PROGRAMS += test-fchownat test-fstatat test-mkdirat test-openat \
+ test-unlinkat
+test_fchownat_LDADD = $(LDADD) @LIBINTL@
+test_fstatat_LDADD = $(LDADD) @LIBINTL@
+test_mkdirat_LDADD = $(LDADD) @LIBINTL@
+test_openat_LDADD = $(LDADD) @LIBINTL@
+test_unlinkat_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/openmp b/gnulib/modules/openmp
new file mode 100644
index 00000000..de3b352e
--- /dev/null
+++ b/gnulib/modules/openmp
@@ -0,0 +1,24 @@
+Description:
+Detection of OpenMP support.
+
+Files:
+m4/openmp.m4
+
+Depends-on:
+
+configure.ac:
+AC_OPENMP
+
+Makefile.am:
+
+Include:
+
+Link:
+$(OPENMP_CFLAGS)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/oset b/gnulib/modules/oset
new file mode 100644
index 00000000..669af0a7
--- /dev/null
+++ b/gnulib/modules/oset
@@ -0,0 +1,26 @@
+Description:
+Abstract ordered set data type.
+
+Files:
+lib/gl_oset.h
+lib/gl_oset.c
+m4/gl_list.m4
+
+Depends-on:
+inline
+stdbool
+
+configure.ac:
+gl_LIST
+
+Makefile.am:
+lib_SOURCES += gl_oset.h gl_oset.c
+
+Include:
+"gl_oset.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/pagealign_alloc b/gnulib/modules/pagealign_alloc
new file mode 100644
index 00000000..5972aa15
--- /dev/null
+++ b/gnulib/modules/pagealign_alloc
@@ -0,0 +1,31 @@
+Description:
+Memory allocation aligned on page boundaries.
+
+Files:
+lib/pagealign_alloc.h
+lib/pagealign_alloc.c
+m4/mmap-anon.m4
+m4/pagealign_alloc.m4
+
+Depends-on:
+error
+exit
+extensions
+getpagesize
+gettext-h
+xalloc
+unistd
+
+configure.ac:
+gl_PAGEALIGN_ALLOC
+
+Makefile.am:
+
+Include:
+"pagealign_alloc.h"
+
+License:
+GPL
+
+Maintainer:
+bug-gnulib@gnu.org
diff --git a/gnulib/modules/parse-duration b/gnulib/modules/parse-duration
new file mode 100644
index 00000000..2e8f3d1b
--- /dev/null
+++ b/gnulib/modules/parse-duration
@@ -0,0 +1,25 @@
+Description:
+Parse a duration given as string.
+
+Files:
+lib/parse-duration.h
+lib/parse-duration.c
+
+Depends-on:
+xalloc
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += parse-duration.c
+
+Include:
+"parse-duration.h"
+
+License:
+GPL
+
+Maintainer:
+Bruce Korb
+
diff --git a/gnulib/modules/parse-duration-tests b/gnulib/modules/parse-duration-tests
new file mode 100644
index 00000000..b561a38f
--- /dev/null
+++ b/gnulib/modules/parse-duration-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-parse-duration.sh
+tests/test-parse-duration.c
+
+Depends-on:
+strdup
+strerror
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-parse-duration.sh
+check_PROGRAMS += test-parse-duration
+test_parse_duration_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/pathmax b/gnulib/modules/pathmax
new file mode 100644
index 00000000..df9b56c7
--- /dev/null
+++ b/gnulib/modules/pathmax
@@ -0,0 +1,22 @@
+Description:
+Return maximum size of reasonable pathnames. (Unportable: Hurd has no limit.)
+
+Files:
+lib/pathmax.h
+m4/pathmax.m4
+
+Depends-on:
+
+configure.ac:
+gl_PATHMAX
+
+Makefile.am:
+
+Include:
+"pathmax.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/perl b/gnulib/modules/perl
new file mode 100644
index 00000000..017ba57a
--- /dev/null
+++ b/gnulib/modules/perl
@@ -0,0 +1,20 @@
+Description:
+Find a new-enough version of Perl.
+
+Files:
+m4/perl.m4
+
+Depends-on:
+
+configure.ac:
+gl_PERL
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/perror b/gnulib/modules/perror
new file mode 100644
index 00000000..c0190295
--- /dev/null
+++ b/gnulib/modules/perror
@@ -0,0 +1,26 @@
+Description:
+perror() function: print a message describing error code.
+
+Files:
+lib/perror.c
+m4/perror.m4
+
+Depends-on:
+stdio
+errno
+strerror
+
+configure.ac:
+gl_FUNC_PERROR
+gl_STRING_MODULE_INDICATOR([perror])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/perror-tests b/gnulib/modules/perror-tests
new file mode 100644
index 00000000..867f9202
--- /dev/null
+++ b/gnulib/modules/perror-tests
@@ -0,0 +1,12 @@
+Files:
+tests/signature.h
+tests/test-perror.c
+tests/test-perror.sh
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-perror.sh
+check_PROGRAMS += test-perror
diff --git a/gnulib/modules/physmem b/gnulib/modules/physmem
new file mode 100644
index 00000000..12f16796
--- /dev/null
+++ b/gnulib/modules/physmem
@@ -0,0 +1,23 @@
+Description:
+Return amount of total/available physical memory.
+
+Files:
+lib/physmem.h
+lib/physmem.c
+m4/physmem.m4
+
+Depends-on:
+
+configure.ac:
+gl_PHYSMEM
+
+Makefile.am:
+
+Include:
+"physmem.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/pipe b/gnulib/modules/pipe
new file mode 100644
index 00000000..922bda16
--- /dev/null
+++ b/gnulib/modules/pipe
@@ -0,0 +1,51 @@
+Description:
+Creation of subprocesses, communicating via pipes.
+
+Files:
+lib/pipe.h
+lib/pipe.c
+lib/w32spawn.h
+m4/pipe.m4
+
+Depends-on:
+cloexec
+dup2
+environ
+error
+exit
+fatal-signal
+gettext-h
+open
+pipe2
+pipe2-safer
+spawn
+posix_spawnp
+posix_spawn_file_actions_init
+posix_spawn_file_actions_addclose
+posix_spawn_file_actions_adddup2
+posix_spawn_file_actions_addopen
+posix_spawn_file_actions_destroy
+posix_spawnattr_init
+posix_spawnattr_setsigmask
+posix_spawnattr_setflags
+posix_spawnattr_destroy
+stdbool
+strpbrk
+unistd
+unistd-safer
+wait-process
+
+configure.ac:
+gl_PIPE
+
+Makefile.am:
+lib_SOURCES += pipe.h pipe.c w32spawn.h
+
+Include:
+"pipe.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/pipe-filter-gi b/gnulib/modules/pipe-filter-gi
new file mode 100644
index 00000000..95ab27a6
--- /dev/null
+++ b/gnulib/modules/pipe-filter-gi
@@ -0,0 +1,34 @@
+Description:
+Filtering of data through a subprocess.
+
+Files:
+lib/pipe-filter.h
+lib/pipe-filter-gi.c
+lib/pipe-filter-aux.h
+
+Depends-on:
+pipe
+wait-process
+error
+exit
+gettext-h
+stdbool
+stdint
+sys_select
+unistd
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+AC_CHECK_FUNCS_ONCE([select])
+
+Makefile.am:
+lib_SOURCES += pipe-filter-gi.c
+
+Include:
+"pipe-filter.h"
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini, Bruno Haible
diff --git a/gnulib/modules/pipe-filter-gi-tests b/gnulib/modules/pipe-filter-gi-tests
new file mode 100644
index 00000000..e5da5623
--- /dev/null
+++ b/gnulib/modules/pipe-filter-gi-tests
@@ -0,0 +1,24 @@
+Files:
+tests/test-pipe-filter-gi1.sh
+tests/test-pipe-filter-gi1.c
+tests/test-vasnprintf-posix.c
+tests/test-pipe-filter-gi2.sh
+tests/test-pipe-filter-gi2-main.c
+tests/test-pipe-filter-gi2-child.c
+tests/macros.h
+
+Depends-on:
+binary-io
+c-ctype
+read-file
+full-write
+usleep
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pipe-filter-gi1.sh test-pipe-filter-gi2.sh
+check_PROGRAMS += test-pipe-filter-gi1 test-pipe-filter-gi2-main test-pipe-filter-gi2-child
+test_pipe_filter_gi1_LDADD = $(LDADD) @LIBINTL@
+test_pipe_filter_gi2_main_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/pipe-filter-ii b/gnulib/modules/pipe-filter-ii
new file mode 100644
index 00000000..6ae28019
--- /dev/null
+++ b/gnulib/modules/pipe-filter-ii
@@ -0,0 +1,34 @@
+Description:
+Filtering of data through a subprocess.
+
+Files:
+lib/pipe-filter.h
+lib/pipe-filter-ii.c
+lib/pipe-filter-aux.h
+
+Depends-on:
+pipe
+wait-process
+error
+exit
+gettext-h
+stdbool
+stdint
+sys_select
+unistd
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+AC_CHECK_FUNCS_ONCE([select])
+
+Makefile.am:
+lib_SOURCES += pipe-filter-ii.c
+
+Include:
+"pipe-filter.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/pipe-filter-ii-tests b/gnulib/modules/pipe-filter-ii-tests
new file mode 100644
index 00000000..236de130
--- /dev/null
+++ b/gnulib/modules/pipe-filter-ii-tests
@@ -0,0 +1,23 @@
+Files:
+tests/test-pipe-filter-ii1.sh
+tests/test-pipe-filter-ii1.c
+tests/test-vasnprintf-posix.c
+tests/test-pipe-filter-ii2.sh
+tests/test-pipe-filter-ii2-main.c
+tests/test-pipe-filter-ii2-child.c
+tests/macros.h
+
+Depends-on:
+binary-io
+c-ctype
+read-file
+full-write
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pipe-filter-ii1.sh test-pipe-filter-ii2.sh
+check_PROGRAMS += test-pipe-filter-ii1 test-pipe-filter-ii2-main test-pipe-filter-ii2-child
+test_pipe_filter_ii1_LDADD = $(LDADD) @LIBINTL@
+test_pipe_filter_ii2_main_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/pipe-tests b/gnulib/modules/pipe-tests
new file mode 100644
index 00000000..b20ea687
--- /dev/null
+++ b/gnulib/modules/pipe-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-pipe.sh
+tests/test-pipe.c
+tests/macros.h
+
+Depends-on:
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pipe.sh
+check_PROGRAMS += test-pipe
+test_pipe_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/pipe2 b/gnulib/modules/pipe2
new file mode 100644
index 00000000..45813962
--- /dev/null
+++ b/gnulib/modules/pipe2
@@ -0,0 +1,28 @@
+Description:
+pipe2() function: create a pipe, with specific opening flags.
+
+Files:
+lib/pipe2.c
+m4/pipe2.m4
+
+Depends-on:
+unistd
+fcntl-h
+binary-io
+extensions
+
+configure.ac:
+gl_FUNC_PIPE2
+gl_UNISTD_MODULE_INDICATOR([pipe2])
+
+Makefile.am:
+lib_SOURCES += pipe2.c
+
+Include:
+<unistd.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, Eric Blake
diff --git a/gnulib/modules/pipe2-safer b/gnulib/modules/pipe2-safer
new file mode 100644
index 00000000..e01a932f
--- /dev/null
+++ b/gnulib/modules/pipe2-safer
@@ -0,0 +1,26 @@
+Description:
+pipe2_safer() function: create a pipe, with specific opening flags,
+without clobbering std{in,out,err}.
+
+Files:
+lib/pipe2-safer.c
+
+Depends-on:
+fd-safer-flag
+pipe2
+unistd-safer
+
+configure.ac:
+gl_MODULE_INDICATOR([pipe2-safer])
+
+Makefile.am:
+lib_SOURCES += pipe2-safer.c
+
+Include:
+"unistd-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/pipe2-tests b/gnulib/modules/pipe2-tests
new file mode 100644
index 00000000..5d24bd74
--- /dev/null
+++ b/gnulib/modules/pipe2-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-pipe2.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdbool
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pipe2
+check_PROGRAMS += test-pipe2
diff --git a/gnulib/modules/pmccabe2html b/gnulib/modules/pmccabe2html
new file mode 100644
index 00000000..1ff19f7f
--- /dev/null
+++ b/gnulib/modules/pmccabe2html
@@ -0,0 +1,22 @@
+Description:
+Produce fancy cyclomatic code complexity charts, using pmccabe.
+See <http://www.parisc-linux.org/~bame/pmccabe/>.
+
+Files:
+build-aux/pmccabe2html
+build-aux/pmccabe.css
+
+Depends-on:
+
+configure.ac:
+AC_PATH_PROG([PMCCABE], [pmccabe], [false])
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+gnupdf and Simon Josefsson
diff --git a/gnulib/modules/poll b/gnulib/modules/poll
new file mode 100644
index 00000000..64c1de5c
--- /dev/null
+++ b/gnulib/modules/poll
@@ -0,0 +1,39 @@
+Description:
+poll() function: wait for some event on a set of file descriptors.
+
+Files:
+lib/poll.c
+lib/poll.in.h
+m4/poll.m4
+
+Depends-on:
+alloca
+select
+sys_select
+sys_time
+errno
+
+configure.ac:
+gl_FUNC_POLL
+
+Makefile.am:
+BUILT_SOURCES += $(POLL_H)
+
+# We need the following in order to create <poll.h> when the system
+# doesn't have one.
+poll.h: poll.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/poll.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += poll.h poll.h-t
+
+Include:
+<poll.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini <bonzini@gnu.org>
diff --git a/gnulib/modules/poll-tests b/gnulib/modules/poll-tests
new file mode 100644
index 00000000..d34107ee
--- /dev/null
+++ b/gnulib/modules/poll-tests
@@ -0,0 +1,31 @@
+Files:
+tests/signature.h
+tests/test-poll.c
+
+Depends-on:
+stdbool
+sys_socket
+netinet_in
+arpa_inet
+sys_ioctl
+extensions
+inet_pton
+errno
+perror
+sockets
+socket
+bind
+setsockopt
+listen
+connect
+accept
+ioctl
+close
+
+configure.ac:
+AC_CHECK_HEADERS_ONCE([unistd.h sys/wait.h])
+
+Makefile.am:
+TESTS += test-poll
+check_PROGRAMS += test-poll
+test_poll_LDADD = $(LDADD) @LIBSOCKET@ $(INET_PTON_LIB)
diff --git a/gnulib/modules/popen b/gnulib/modules/popen
new file mode 100644
index 00000000..75e278d8
--- /dev/null
+++ b/gnulib/modules/popen
@@ -0,0 +1,25 @@
+Description:
+popen() function: open a stream to a shell command.
+
+Files:
+lib/popen.c
+m4/popen.m4
+
+Depends-on:
+open
+stdio
+
+configure.ac:
+gl_FUNC_POPEN
+gl_STDIO_MODULE_INDICATOR([popen])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/popen-safer b/gnulib/modules/popen-safer
new file mode 100644
index 00000000..76bf4ee5
--- /dev/null
+++ b/gnulib/modules/popen-safer
@@ -0,0 +1,29 @@
+Description:
+popen function that avoids clobbering std{in,out,err}.
+
+Files:
+lib/stdio--.h
+lib/stdio-safer.h
+lib/popen-safer.c
+m4/stdio-safer.m4
+
+Depends-on:
+cloexec
+open
+popen
+unistd-safer
+
+configure.ac:
+gl_POPEN_SAFER
+gl_MODULE_INDICATOR([popen-safer])
+
+Makefile.am:
+
+Include:
+"stdio-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/popen-safer-tests b/gnulib/modules/popen-safer-tests
new file mode 100644
index 00000000..8b212aed
--- /dev/null
+++ b/gnulib/modules/popen-safer-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-popen.h
+tests/test-popen-safer.c
+tests/test-popen-safer2.c
+tests/macros.h
+
+Depends-on:
+dup2
+sys_wait
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-popen-safer test-popen-safer2
+check_PROGRAMS += test-popen-safer test-popen-safer2
diff --git a/gnulib/modules/popen-tests b/gnulib/modules/popen-tests
new file mode 100644
index 00000000..f3465b62
--- /dev/null
+++ b/gnulib/modules/popen-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-popen.h
+tests/test-popen.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+dup2
+sys_wait
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-popen
+check_PROGRAMS += test-popen
diff --git a/gnulib/modules/posix-shell b/gnulib/modules/posix-shell
new file mode 100644
index 00000000..8f7b864e
--- /dev/null
+++ b/gnulib/modules/posix-shell
@@ -0,0 +1,30 @@
+Description:
+Find a POSIX-conforming shell.
+
+Files:
+m4/posix-shell.m4
+
+Depends-on:
+
+configure.ac:
+gl_POSIX_SHELL
+
+Makefile.am:
+##Sample usage of posix-shell module:
+#script: script.in
+# rm -f $@-t $@
+# sed -e 's#@''PREFERABLY_POSIX_SHELL''@#$(PREFERABLY_POSIX_SHELL)#g' \
+# -e 's#@''POSIX_SHELL''@#$(POSIX_SHELL)#g' \
+# -e $(srcdir)/$@.in >$@-t
+# chmod a+x $@-t
+# mv $@-t $@
+#EXTRA_DIST += script.in
+#MOSTLYCLEANFILES += script script-t
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/posix_spawn b/gnulib/modules/posix_spawn
new file mode 100644
index 00000000..44331193
--- /dev/null
+++ b/gnulib/modules/posix_spawn
@@ -0,0 +1,31 @@
+Description:
+posix_spawn() function: create a child process.
+
+Files:
+lib/spawn.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+posix_spawn-internal
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawn])
+ gl_POSIX_SPAWN_INTERNAL
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawn])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawn-internal b/gnulib/modules/posix_spawn-internal
new file mode 100644
index 00000000..da3ed281
--- /dev/null
+++ b/gnulib/modules/posix_spawn-internal
@@ -0,0 +1,28 @@
+Description:
+posix_spawn internals.
+
+Files:
+lib/spawni.c
+lib/spawn_int.h
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+alloca-opt
+dup2
+errno
+open
+strchrnul
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawn-tests b/gnulib/modules/posix_spawn-tests
new file mode 100644
index 00000000..8795206a
--- /dev/null
+++ b/gnulib/modules/posix_spawn-tests
@@ -0,0 +1,27 @@
+Files:
+tests/test-posix_spawn3.c
+tests/signature.h
+
+Depends-on:
+posix_spawn_file_actions_init
+posix_spawn_file_actions_addopen
+posix_spawn_file_actions_destroy
+stdbool
+unistd
+sys_wait
+
+configure.ac:
+AC_EGREP_CPP([notposix], [[
+#if defined _MSC_VER || defined __MINGW32__
+ notposix
+#endif
+ ]],
+ [posix_spawn_ported=no],
+ [posix_spawn_ported=yes])
+AM_CONDITIONAL([POSIX_SPAWN_PORTED], [test $posix_spawn_ported = yes])
+
+Makefile.am:
+if POSIX_SPAWN_PORTED
+TESTS += test-posix_spawn3
+check_PROGRAMS += test-posix_spawn3
+endif
diff --git a/gnulib/modules/posix_spawn_file_actions_addclose b/gnulib/modules/posix_spawn_file_actions_addclose
new file mode 100644
index 00000000..b85eacfd
--- /dev/null
+++ b/gnulib/modules/posix_spawn_file_actions_addclose
@@ -0,0 +1,32 @@
+Description:
+posix_spawn_file_actions_addclose() function: augment a child process actions
+specification.
+
+Files:
+lib/spawn_faction_addclose.c
+lib/spawn_int.h
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+getdtablesize
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawn_faction_addclose])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_addclose])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawn_file_actions_adddup2 b/gnulib/modules/posix_spawn_file_actions_adddup2
new file mode 100644
index 00000000..35a67e85
--- /dev/null
+++ b/gnulib/modules/posix_spawn_file_actions_adddup2
@@ -0,0 +1,32 @@
+Description:
+posix_spawn_file_actions_adddup2() function: augment a child process actions
+specification.
+
+Files:
+lib/spawn_faction_adddup2.c
+lib/spawn_int.h
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+getdtablesize
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawn_faction_adddup2])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_adddup2])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawn_file_actions_addopen b/gnulib/modules/posix_spawn_file_actions_addopen
new file mode 100644
index 00000000..c715c71c
--- /dev/null
+++ b/gnulib/modules/posix_spawn_file_actions_addopen
@@ -0,0 +1,32 @@
+Description:
+posix_spawn_file_actions_addopen() function: augment a child process actions
+specification.
+
+Files:
+lib/spawn_faction_addopen.c
+lib/spawn_int.h
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+getdtablesize
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawn_faction_addopen])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_addopen])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawn_file_actions_destroy b/gnulib/modules/posix_spawn_file_actions_destroy
new file mode 100644
index 00000000..0f08cad2
--- /dev/null
+++ b/gnulib/modules/posix_spawn_file_actions_destroy
@@ -0,0 +1,30 @@
+Description:
+posix_spawn_file_actions_destroy() function: free a child process actions
+specification.
+
+Files:
+lib/spawn_faction_destroy.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawn_faction_destroy])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_destroy])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawn_file_actions_init b/gnulib/modules/posix_spawn_file_actions_init
new file mode 100644
index 00000000..78131cae
--- /dev/null
+++ b/gnulib/modules/posix_spawn_file_actions_init
@@ -0,0 +1,31 @@
+Description:
+posix_spawn_file_actions_init() function: initialize child process actions
+specification.
+
+Files:
+lib/spawn_faction_init.c
+lib/spawn_int.h
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawn_faction_init])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_init])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_destroy b/gnulib/modules/posix_spawnattr_destroy
new file mode 100644
index 00000000..2bbf4baf
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_destroy
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_destroy() function: free a child process attributes
+specification.
+
+Files:
+lib/spawnattr_destroy.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_destroy])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_destroy])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_getflags b/gnulib/modules/posix_spawnattr_getflags
new file mode 100644
index 00000000..6c9bfafd
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_getflags
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_getflags() function: get bitmask of attributes specified for
+child process.
+
+Files:
+lib/spawnattr_getflags.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_getflags])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_getflags])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_getpgroup b/gnulib/modules/posix_spawnattr_getpgroup
new file mode 100644
index 00000000..e1a34e4a
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_getpgroup
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_getpgroup() function: get process group specified for child
+process.
+
+Files:
+lib/spawnattr_getpgroup.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_getpgroup])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_getpgroup])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_getschedparam b/gnulib/modules/posix_spawnattr_getschedparam
new file mode 100644
index 00000000..46915235
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_getschedparam
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_getschedparam() function: get the scheduling parameters
+specified for child process.
+
+Files:
+lib/spawnattr_getschedparam.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_getschedparam])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_getschedparam])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_getschedpolicy b/gnulib/modules/posix_spawnattr_getschedpolicy
new file mode 100644
index 00000000..9663e37a
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_getschedpolicy
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_getschedpolicy() function: get the scheduling policy specified
+for child process.
+
+Files:
+lib/spawnattr_getschedpolicy.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_getschedpolicy])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_getschedpolicy])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_getsigdefault b/gnulib/modules/posix_spawnattr_getsigdefault
new file mode 100644
index 00000000..9f264069
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_getsigdefault
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_getsigdefault() function: get the set of signals with initially
+the default handler specified for child process.
+
+Files:
+lib/spawnattr_getdefault.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_getdefault])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_getsigdefault])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_getsigmask b/gnulib/modules/posix_spawnattr_getsigmask
new file mode 100644
index 00000000..e33f150b
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_getsigmask
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_getsigmask() function: get the set of initially blocked signals
+specified for child process.
+
+Files:
+lib/spawnattr_getsigmask.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_getsigmask])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_getsigmask])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_init b/gnulib/modules/posix_spawnattr_init
new file mode 100644
index 00000000..e1b81560
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_init
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_init() function: initialize child process attributes
+specification.
+
+Files:
+lib/spawnattr_init.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_init])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_init])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_setflags b/gnulib/modules/posix_spawnattr_setflags
new file mode 100644
index 00000000..20468c51
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_setflags
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_setflags() function: specify bitmask of attributes for child
+process.
+
+Files:
+lib/spawnattr_setflags.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_setflags])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setflags])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_setpgroup b/gnulib/modules/posix_spawnattr_setpgroup
new file mode 100644
index 00000000..3774ca19
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_setpgroup
@@ -0,0 +1,29 @@
+Description:
+posix_spawnattr_setpgroup() function: specify process group for child process.
+
+Files:
+lib/spawnattr_setpgroup.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_setpgroup])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setpgroup])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_setschedparam b/gnulib/modules/posix_spawnattr_setschedparam
new file mode 100644
index 00000000..abef5f28
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_setschedparam
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_setschedparam() function: specify the scheduling parameters for
+child process.
+
+Files:
+lib/spawnattr_setschedparam.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_setschedparam])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setschedparam])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_setschedpolicy b/gnulib/modules/posix_spawnattr_setschedpolicy
new file mode 100644
index 00000000..2ee661ae
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_setschedpolicy
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_setschedpolicy() function: specify the scheduling policy for
+child process.
+
+Files:
+lib/spawnattr_setschedpolicy.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_setschedpolicy])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setschedpolicy])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_setsigdefault b/gnulib/modules/posix_spawnattr_setsigdefault
new file mode 100644
index 00000000..c0ee62e1
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_setsigdefault
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_setsigdefault() function:get the specify of signals with
+initially the default handler for child process.
+
+Files:
+lib/spawnattr_setdefault.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_setdefault])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setsigdefault])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnattr_setsigmask b/gnulib/modules/posix_spawnattr_setsigmask
new file mode 100644
index 00000000..758cbb62
--- /dev/null
+++ b/gnulib/modules/posix_spawnattr_setsigmask
@@ -0,0 +1,30 @@
+Description:
+posix_spawnattr_setsigmask() function: specify the set of initially blocked
+signals for child process.
+
+Files:
+lib/spawnattr_setsigmask.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnattr_setsigmask])
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setsigmask])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnp b/gnulib/modules/posix_spawnp
new file mode 100644
index 00000000..f78760ce
--- /dev/null
+++ b/gnulib/modules/posix_spawnp
@@ -0,0 +1,31 @@
+Description:
+posix_spawnp() function: create a child process.
+
+Files:
+lib/spawnp.c
+m4/posix_spawn.m4
+
+Depends-on:
+spawn
+posix_spawn-internal
+
+configure.ac:
+gl_POSIX_SPAWN
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ gl_REPLACE_SPAWN_H
+ AC_LIBOBJ([spawnp])
+ gl_POSIX_SPAWN_INTERNAL
+fi
+gl_SPAWN_MODULE_INDICATOR([posix_spawnp])
+
+Makefile.am:
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/posix_spawnp-tests b/gnulib/modules/posix_spawnp-tests
new file mode 100644
index 00000000..49465d85
--- /dev/null
+++ b/gnulib/modules/posix_spawnp-tests
@@ -0,0 +1,51 @@
+Files:
+tests/test-posix_spawn1.c
+tests/test-posix_spawn1.in.sh
+tests/test-posix_spawn2.c
+tests/test-posix_spawn2.in.sh
+tests/signature.h
+
+Depends-on:
+posix_spawn_file_actions_init
+posix_spawn_file_actions_adddup2
+posix_spawn_file_actions_addclose
+posix_spawn_file_actions_addopen
+posix_spawn_file_actions_destroy
+posix_spawnattr_init
+posix_spawnattr_setsigmask
+posix_spawnattr_setflags
+posix_spawnattr_destroy
+sigprocmask
+stdbool
+unistd
+sys_wait
+
+configure.ac:
+AC_EGREP_CPP([notposix], [[
+#if defined _MSC_VER || defined __MINGW32__
+ notposix
+#endif
+ ]],
+ [posix_spawn_ported=no],
+ [posix_spawn_ported=yes])
+AM_CONDITIONAL([POSIX_SPAWN_PORTED], [test $posix_spawn_ported = yes])
+
+Makefile.am:
+if POSIX_SPAWN_PORTED
+TESTS += test-posix_spawn1 test-posix_spawn2
+check_PROGRAMS += test-posix_spawn1 test-posix_spawn2
+
+BUILT_SOURCES += test-posix_spawn1.sh
+test-posix_spawn1.sh: test-posix_spawn1.in.sh
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ cp $(srcdir)/test-posix_spawn1.in.sh $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += test-posix_spawn1.sh test-posix_spawn1.sh-t
+
+BUILT_SOURCES += test-posix_spawn2.sh
+test-posix_spawn2.sh: test-posix_spawn2.in.sh
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ cp $(srcdir)/test-posix_spawn2.in.sh $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += test-posix_spawn2.sh test-posix_spawn2.sh-t
+endif
diff --git a/gnulib/modules/posixtm b/gnulib/modules/posixtm
new file mode 100644
index 00000000..425c175e
--- /dev/null
+++ b/gnulib/modules/posixtm
@@ -0,0 +1,26 @@
+Description:
+Convert a date/time string (POSIX syntax) to linear time or broken-down time.
+
+Files:
+lib/posixtm.h
+lib/posixtm.c
+m4/posixtm.m4
+
+Depends-on:
+mktime
+stdbool
+stpcpy
+
+configure.ac:
+gl_POSIXTM
+
+Makefile.am:
+
+Include:
+"posixtm.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/posixtm-tests b/gnulib/modules/posixtm-tests
new file mode 100644
index 00000000..216d6024
--- /dev/null
+++ b/gnulib/modules/posixtm-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-posixtm.c
+tests/macros.h
+
+Depends-on:
+intprops
+setenv
+strftime
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-posixtm
+check_PROGRAMS += test-posixtm
diff --git a/gnulib/modules/posixver b/gnulib/modules/posixver
new file mode 100644
index 00000000..84891cd5
--- /dev/null
+++ b/gnulib/modules/posixver
@@ -0,0 +1,24 @@
+Description:
+Determine desired POSIX specification version, according to user's environment
+variables.
+
+Files:
+lib/posixver.h
+lib/posixver.c
+m4/posixver.m4
+
+Depends-on:
+
+configure.ac:
+gl_POSIXVER
+
+Makefile.am:
+
+Include:
+"posixver.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/pow b/gnulib/modules/pow
new file mode 100644
index 00000000..dec50d1b
--- /dev/null
+++ b/gnulib/modules/pow
@@ -0,0 +1,24 @@
+Description:
+pow() function: power function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([pow])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(POW_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/pow-tests b/gnulib/modules/pow-tests
new file mode 100644
index 00000000..1189af91
--- /dev/null
+++ b/gnulib/modules/pow-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-pow.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pow
+check_PROGRAMS += test-pow
+test_pow_LDADD = $(LDADD) @POW_LIBM@
diff --git a/gnulib/modules/pread b/gnulib/modules/pread
new file mode 100644
index 00000000..4fb44246
--- /dev/null
+++ b/gnulib/modules/pread
@@ -0,0 +1,25 @@
+Description:
+pread() function: read without changing file offset
+
+Files:
+lib/pread.c
+m4/pread.m4
+
+Depends-on:
+lseek
+unistd
+
+configure.ac:
+gl_FUNC_PREAD
+gl_UNISTD_MODULE_INDICATOR([pread])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/pread-tests b/gnulib/modules/pread-tests
new file mode 100644
index 00000000..72e4613b
--- /dev/null
+++ b/gnulib/modules/pread-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-pread.c
+tests/test-pread.sh
+tests/init.sh
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pread.sh
+check_PROGRAMS += test-pread
diff --git a/gnulib/modules/printf-frexp b/gnulib/modules/printf-frexp
new file mode 100644
index 00000000..ff70ba00
--- /dev/null
+++ b/gnulib/modules/printf-frexp
@@ -0,0 +1,27 @@
+Description:
+printf_frexp() function: split a double into fraction and mantissa, for
+hexadecimal printf, without requiring libm.
+
+Files:
+lib/printf-frexp.h
+lib/printf-frexp.c
+m4/printf-frexp.m4
+m4/frexp.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_PRINTF_FREXP
+
+Makefile.am:
+lib_SOURCES += printf-frexp.c
+
+Include:
+"printf-frexp.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/printf-frexp-tests b/gnulib/modules/printf-frexp-tests
new file mode 100644
index 00000000..b1f0b9ff
--- /dev/null
+++ b/gnulib/modules/printf-frexp-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-printf-frexp.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-printf-frexp
+check_PROGRAMS += test-printf-frexp
diff --git a/gnulib/modules/printf-frexpl b/gnulib/modules/printf-frexpl
new file mode 100644
index 00000000..c23550e1
--- /dev/null
+++ b/gnulib/modules/printf-frexpl
@@ -0,0 +1,32 @@
+Description:
+printf_frexpl() function: split a long double into fraction and mantissa,
+for hexadecimal printf, without requiring libm.
+
+Files:
+lib/printf-frexpl.h
+lib/printf-frexpl.c
+lib/printf-frexp.c
+m4/printf-frexpl.m4
+m4/frexpl.m4
+m4/ldexpl.m4
+
+Depends-on:
+float
+math
+fpucw
+
+configure.ac:
+gl_FUNC_PRINTF_FREXPL
+
+Makefile.am:
+lib_SOURCES += printf-frexpl.c
+
+Include:
+"printf-frexpl.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/printf-frexpl-tests b/gnulib/modules/printf-frexpl-tests
new file mode 100644
index 00000000..d87a0038
--- /dev/null
+++ b/gnulib/modules/printf-frexpl-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-printf-frexpl.c
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-printf-frexpl
+check_PROGRAMS += test-printf-frexpl
diff --git a/gnulib/modules/printf-posix b/gnulib/modules/printf-posix
new file mode 100644
index 00000000..b690c729
--- /dev/null
+++ b/gnulib/modules/printf-posix
@@ -0,0 +1,28 @@
+Description:
+POSIX compatible printf() function: print formatted output to standard output
+
+Files:
+lib/printf.c
+m4/printf-posix-rpl.m4
+m4/printf.m4
+
+Depends-on:
+stdio
+vfprintf-posix
+printf-safe
+
+configure.ac:
+gl_FUNC_PRINTF_POSIX
+gl_STDIO_MODULE_INDICATOR([printf-posix])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/printf-posix-tests b/gnulib/modules/printf-posix-tests
new file mode 100644
index 00000000..8e8ec6de
--- /dev/null
+++ b/gnulib/modules/printf-posix-tests
@@ -0,0 +1,19 @@
+Files:
+tests/test-printf-posix.sh
+tests/test-printf-posix.c
+tests/test-printf-posix.h
+tests/test-printf-posix.output
+tests/test-printf-posix2.sh
+tests/test-printf-posix2.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
+
+Makefile.am:
+TESTS += test-printf-posix.sh test-printf-posix2.sh
+check_PROGRAMS += test-printf-posix test-printf-posix2
diff --git a/gnulib/modules/printf-safe b/gnulib/modules/printf-safe
new file mode 100644
index 00000000..8e93366a
--- /dev/null
+++ b/gnulib/modules/printf-safe
@@ -0,0 +1,22 @@
+Description:
+Ensures that the *printf() functions provided by the *printf-posix modules
+recognize non-IEEE-754 values of 'long double' arguments and display them as
+NaN (rather than producing undefined behavior).
+
+Files:
+
+Depends-on:
+
+configure.ac:
+m4_divert_text([INIT_PREPARE], [gl_printf_safe=yes])
+
+Makefile.am:
+
+Include:
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/priv-set b/gnulib/modules/priv-set
new file mode 100644
index 00000000..77e01640
--- /dev/null
+++ b/gnulib/modules/priv-set
@@ -0,0 +1,26 @@
+Description:
+Query, remove or restore a Solaris privilege
+
+Files:
+lib/priv-set.h
+lib/priv-set.c
+m4/priv-set.m4
+
+Depends-on:
+errno
+stdbool
+
+configure.ac:
+gl_PRIV_SET
+
+Makefile.am:
+lib_SOURCES += priv-set.c
+
+Include:
+"priv-set.h"
+
+License:
+GPL
+
+Maintainer:
+David Bartley
diff --git a/gnulib/modules/priv-set-tests b/gnulib/modules/priv-set-tests
new file mode 100644
index 00000000..7a24aa13
--- /dev/null
+++ b/gnulib/modules/priv-set-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-priv-set.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-priv-set
+check_PROGRAMS += test-priv-set
diff --git a/gnulib/modules/progname b/gnulib/modules/progname
new file mode 100644
index 00000000..349b1ff0
--- /dev/null
+++ b/gnulib/modules/progname
@@ -0,0 +1,25 @@
+Description:
+Program name management.
+
+Files:
+lib/progname.h
+lib/progname.c
+
+Depends-on:
+
+configure.ac:
+AC_CHECK_DECLS([program_invocation_name], [], [], [#include <errno.h>])
+AC_CHECK_DECLS([program_invocation_short_name], [], [], [#include <errno.h>])
+
+Makefile.am:
+lib_SOURCES += progname.h progname.c
+
+Include:
+"progname.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/propername b/gnulib/modules/propername
new file mode 100644
index 00000000..fc819a97
--- /dev/null
+++ b/gnulib/modules/propername
@@ -0,0 +1,46 @@
+Description:
+Localization of proper names.
+
+Notice:
+If you are using GNU gettext version 0.16.1 or older, add the following options
+to XGETTEXT_OPTIONS in your po/Makevars:
+ --keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."'
+ --keyword='proper_name_utf8:1,"This is a proper name. See the gettext manual, section Names."'
+
+Files:
+lib/propername.h
+lib/propername.c
+
+Depends-on:
+stdbool
+trim
+mbsstr
+mbchar
+mbuiter
+iconv
+localcharset
+c-strcase
+xstriconv
+xalloc
+gettext-h
+
+configure.ac:
+m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--keyword='proper_name:1,\"This is a proper name. See the gettext manual, section Names.\"'])
+ AM_][XGETTEXT_OPTION([--keyword='proper_name_utf8:1,\"This is a proper name. See the gettext manual, section Names.\"'])])
+
+Makefile.am:
+lib_SOURCES += propername.h propername.c
+
+Include:
+"propername.h"
+
+Link:
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/pthread b/gnulib/modules/pthread
new file mode 100644
index 00000000..6e061cec
--- /dev/null
+++ b/gnulib/modules/pthread
@@ -0,0 +1,29 @@
+Description:
+Implement a trivial subset of the pthreads library.
+
+Files:
+lib/pthread.in.h
+m4/pthread.m4
+
+Depends-on:
+
+configure.ac:
+gl_PTHREAD_CHECK
+
+Makefile.am:
+BUILT_SOURCES += $(PTHREAD_H)
+
+# We need the following in order to create <pthread.h> when the system
+# doesn't have one that works with the given compiler.
+pthread.h: pthread.in.h
+ ln -f pthread.in.h $@ || cp pthread.in.h $@
+MOSTLYCLEANFILES += pthread.h
+
+Include:
+<pthread.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Glen Lenker and Paul Eggert
diff --git a/gnulib/modules/pty b/gnulib/modules/pty
new file mode 100644
index 00000000..66cecefb
--- /dev/null
+++ b/gnulib/modules/pty
@@ -0,0 +1,33 @@
+Description:
+A <pty.h> for systems that lacks it.
+
+Files:
+m4/pty.m4
+
+configure.ac:
+gl_PTY
+
+Makefile.am:
+BUILT_SOURCES += $(PTY_H)
+
+# We need the following in order to create <pty.h> when the system
+# doesn't have one that works with the given compiler.
+pty.h:
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ echo '#include <'$(PTY_HEADER)'>'; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += pty.h pty.h-t
+
+Include:
+<pty.h>
+
+Link:
+$(PTY_LIB)
+
+License:
+LGPL
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/pty-tests b/gnulib/modules/pty-tests
new file mode 100644
index 00000000..870d5182
--- /dev/null
+++ b/gnulib/modules/pty-tests
@@ -0,0 +1,8 @@
+Files:
+tests/signature.h
+tests/test-pty.c
+
+Makefile.am:
+TESTS += test-pty
+check_PROGRAMS += test-pty
+test_pty_LDADD = $(LDADD) $(PTY_LIB)
diff --git a/gnulib/modules/putenv b/gnulib/modules/putenv
new file mode 100644
index 00000000..3874b541
--- /dev/null
+++ b/gnulib/modules/putenv
@@ -0,0 +1,26 @@
+Description:
+putenv() function: change or add an environment variable.
+
+Files:
+lib/putenv.c
+m4/putenv.m4
+
+Depends-on:
+stdlib
+malloc-posix
+
+configure.ac:
+gl_FUNC_PUTENV
+gl_STDLIB_MODULE_INDICATOR([putenv])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, glibc
+
diff --git a/gnulib/modules/quote b/gnulib/modules/quote
new file mode 100644
index 00000000..6e26f691
--- /dev/null
+++ b/gnulib/modules/quote
@@ -0,0 +1,24 @@
+Description:
+Quote arguments for use in error messages.
+
+Files:
+lib/quote.h
+lib/quote.c
+m4/quote.m4
+
+Depends-on:
+quotearg
+
+configure.ac:
+gl_QUOTE
+
+Makefile.am:
+
+Include:
+"quote.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/quotearg b/gnulib/modules/quotearg
new file mode 100644
index 00000000..59ecea35
--- /dev/null
+++ b/gnulib/modules/quotearg
@@ -0,0 +1,34 @@
+Description:
+Quote arguments for use in error messages.
+
+Files:
+lib/quotearg.h
+lib/quotearg.c
+m4/mbstate_t.m4
+m4/mbrtowc.m4
+m4/quotearg.m4
+
+Depends-on:
+extensions
+gettext-h
+mbrtowc
+mbsinit
+memcmp
+stdbool
+wchar
+wctype
+xalloc
+
+configure.ac:
+gl_QUOTEARG
+
+Makefile.am:
+
+Include:
+"quotearg.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/quotearg-tests b/gnulib/modules/quotearg-tests
new file mode 100644
index 00000000..b510e5d8
--- /dev/null
+++ b/gnulib/modules/quotearg-tests
@@ -0,0 +1,25 @@
+Files:
+tests/test-quotearg.sh
+tests/test-quotearg.c
+tests/macros.h
+tests/locale/fr/LC_MESSAGES/test-quotearg.po
+tests/locale/fr/LC_MESSAGES/test-quotearg.mo
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+gettext
+progname
+stdint
+setenv
+unsetenv
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-quotearg.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-quotearg
+test_quotearg_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/raise b/gnulib/modules/raise
new file mode 100644
index 00000000..7735dfea
--- /dev/null
+++ b/gnulib/modules/raise
@@ -0,0 +1,28 @@
+Description:
+Send a signal to the executing process.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/raise.c
+
+Depends-on:
+
+configure.ac:
+AC_REPLACE_FUNCS(raise)
+
+Makefile.am:
+
+Include:
+<signal.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/random_r b/gnulib/modules/random_r
new file mode 100644
index 00000000..49a791bb
--- /dev/null
+++ b/gnulib/modules/random_r
@@ -0,0 +1,25 @@
+Description:
+reentrant random number generator
+
+Files:
+lib/random_r.c
+m4/random_r.m4
+
+Depends-on:
+stdlib
+stdint
+
+configure.ac:
+gl_FUNC_RANDOM_R
+gl_STDLIB_MODULE_INDICATOR([random_r])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/random_r-tests b/gnulib/modules/random_r-tests
new file mode 100644
index 00000000..e1fa2919
--- /dev/null
+++ b/gnulib/modules/random_r-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-random_r.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-random_r
+check_PROGRAMS += test-random_r
diff --git a/gnulib/modules/rawmemchr b/gnulib/modules/rawmemchr
new file mode 100644
index 00000000..c9fd3239
--- /dev/null
+++ b/gnulib/modules/rawmemchr
@@ -0,0 +1,26 @@
+Description:
+rawmemchr() function: Find the first occurrence of C in S.
+
+Files:
+lib/rawmemchr.c
+lib/rawmemchr.valgrind
+m4/rawmemchr.m4
+
+Depends-on:
+extensions
+string
+
+configure.ac:
+gl_FUNC_RAWMEMCHR
+gl_STRING_MODULE_INDICATOR([rawmemchr])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake, glibc
diff --git a/gnulib/modules/rawmemchr-tests b/gnulib/modules/rawmemchr-tests
new file mode 100644
index 00000000..bca145e1
--- /dev/null
+++ b/gnulib/modules/rawmemchr-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-rawmemchr.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-rawmemchr
+check_PROGRAMS += test-rawmemchr
diff --git a/gnulib/modules/rbtree-list b/gnulib/modules/rbtree-list
new file mode 100644
index 00000000..4ea7796f
--- /dev/null
+++ b/gnulib/modules/rbtree-list
@@ -0,0 +1,28 @@
+Description:
+Sequential list data type implemented by a binary tree.
+
+Files:
+lib/gl_rbtree_list.h
+lib/gl_rbtree_list.c
+lib/gl_anyrbtree_list1.h
+lib/gl_anyrbtree_list2.h
+lib/gl_anytree_list1.h
+lib/gl_anytree_list2.h
+
+Depends-on:
+list
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_rbtree_list.h gl_rbtree_list.c gl_anyrbtree_list1.h gl_anyrbtree_list2.h gl_anytree_list1.h gl_anytree_list2.h
+
+Include:
+"gl_rbtree_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/rbtree-list-tests b/gnulib/modules/rbtree-list-tests
new file mode 100644
index 00000000..c4262ab0
--- /dev/null
+++ b/gnulib/modules/rbtree-list-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-rbtree_list.c
+tests/macros.h
+
+Depends-on:
+array-list
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-rbtree_list
+check_PROGRAMS += test-rbtree_list
diff --git a/gnulib/modules/rbtree-oset b/gnulib/modules/rbtree-oset
new file mode 100644
index 00000000..0630673e
--- /dev/null
+++ b/gnulib/modules/rbtree-oset
@@ -0,0 +1,25 @@
+Description:
+Ordered set data type implemented by a binary tree.
+
+Files:
+lib/gl_rbtree_oset.h
+lib/gl_rbtree_oset.c
+lib/gl_anytree_oset.h
+
+Depends-on:
+oset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_rbtree_oset.h gl_rbtree_oset.c gl_anytree_oset.h
+
+Include:
+"gl_rbtree_oset.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/rbtree-oset-tests b/gnulib/modules/rbtree-oset-tests
new file mode 100644
index 00000000..db690783
--- /dev/null
+++ b/gnulib/modules/rbtree-oset-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-rbtree_oset.c
+tests/macros.h
+
+Depends-on:
+array-oset
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-rbtree_oset
+check_PROGRAMS += test-rbtree_oset
diff --git a/gnulib/modules/rbtreehash-list b/gnulib/modules/rbtreehash-list
new file mode 100644
index 00000000..7355e8bc
--- /dev/null
+++ b/gnulib/modules/rbtreehash-list
@@ -0,0 +1,35 @@
+Description:
+Sequential list data type implemented by a hash table with a binary tree.
+
+Files:
+lib/gl_rbtreehash_list.h
+lib/gl_rbtreehash_list.c
+lib/gl_anyhash_list1.h
+lib/gl_anyhash_list2.h
+lib/gl_anyrbtree_list1.h
+lib/gl_anyrbtree_list2.h
+lib/gl_anytree_list1.h
+lib/gl_anytree_list2.h
+lib/gl_anytreehash_list1.h
+lib/gl_anytreehash_list2.h
+
+Depends-on:
+list
+rbtree-oset
+stdint
+xsize
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_rbtreehash_list.h gl_rbtreehash_list.c gl_anyhash_list1.h gl_anyhash_list2.h gl_anyrbtree_list1.h gl_anyrbtree_list2.h gl_anytree_list1.h gl_anytree_list2.h gl_anytreehash_list1.h gl_anytreehash_list2.h
+
+Include:
+"gl_rbtreehash_list.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/rbtreehash-list-tests b/gnulib/modules/rbtreehash-list-tests
new file mode 100644
index 00000000..446e44d1
--- /dev/null
+++ b/gnulib/modules/rbtreehash-list-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-rbtreehash_list.c
+tests/macros.h
+
+Depends-on:
+array-list
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-rbtreehash_list
+check_PROGRAMS += test-rbtreehash_list
diff --git a/gnulib/modules/read-file b/gnulib/modules/read-file
new file mode 100644
index 00000000..e3029400
--- /dev/null
+++ b/gnulib/modules/read-file
@@ -0,0 +1,24 @@
+Description:
+read_file() function: read the contents of a file into a string
+
+Files:
+lib/read-file.h
+lib/read-file.c
+m4/read-file.m4
+
+Depends-on:
+realloc-posix
+
+configure.ac:
+gl_FUNC_READ_FILE
+
+Makefile.am:
+
+Include:
+"read-file.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/read-file-tests b/gnulib/modules/read-file-tests
new file mode 100644
index 00000000..361bca80
--- /dev/null
+++ b/gnulib/modules/read-file-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-read-file.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-read-file
+check_PROGRAMS += test-read-file
diff --git a/gnulib/modules/readline b/gnulib/modules/readline
new file mode 100644
index 00000000..933ae5b6
--- /dev/null
+++ b/gnulib/modules/readline
@@ -0,0 +1,28 @@
+Description:
+Simple implementation of readline.
+
+Files:
+lib/readline.h
+lib/readline.c
+m4/readline.m4
+
+Depends-on:
+getline
+havelib
+
+configure.ac:
+gl_FUNC_READLINE
+
+Makefile.am:
+
+Include:
+"readline.h"
+
+Link:
+$(LTLIBREADLINE) when linking with libtool, $(LIBREADLINE) otherwise
+
+License:
+GPL
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/readlink b/gnulib/modules/readlink
new file mode 100644
index 00000000..eb32ef53
--- /dev/null
+++ b/gnulib/modules/readlink
@@ -0,0 +1,26 @@
+Description:
+readlink() function: read the value of a symbolic link.
+
+Files:
+lib/readlink.c
+m4/readlink.m4
+
+Depends-on:
+stat
+unistd
+
+configure.ac:
+gl_FUNC_READLINK
+gl_UNISTD_MODULE_INDICATOR([readlink])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/readlink-tests b/gnulib/modules/readlink-tests
new file mode 100644
index 00000000..cbd84a53
--- /dev/null
+++ b/gnulib/modules/readlink-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-readlink.h
+tests/test-readlink.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-readlink
+check_PROGRAMS += test-readlink
diff --git a/gnulib/modules/readtokens b/gnulib/modules/readtokens
new file mode 100644
index 00000000..9453de99
--- /dev/null
+++ b/gnulib/modules/readtokens
@@ -0,0 +1,25 @@
+Description:
+Read tokens from a stream.
+
+Files:
+lib/readtokens.h
+lib/readtokens.c
+m4/readtokens.m4
+
+Depends-on:
+xalloc
+stdbool
+
+configure.ac:
+gl_READTOKENS
+
+Makefile.am:
+
+Include:
+"readtokens.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/readtokens0 b/gnulib/modules/readtokens0
new file mode 100644
index 00000000..a7b56312
--- /dev/null
+++ b/gnulib/modules/readtokens0
@@ -0,0 +1,24 @@
+Description:
+Read NUL-separated tokens from a stream.
+
+Files:
+lib/readtokens0.h
+lib/readtokens0.c
+
+Depends-on:
+obstack
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += readtokens0.h readtokens0.c
+
+Include:
+"readtokens0.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/readutmp b/gnulib/modules/readutmp
new file mode 100644
index 00000000..f0fe3984
--- /dev/null
+++ b/gnulib/modules/readutmp
@@ -0,0 +1,27 @@
+Description:
+Read entire utmp file into memory.
+
+Files:
+lib/readutmp.h
+lib/readutmp.c
+m4/readutmp.m4
+
+Depends-on:
+extensions
+xalloc
+stdbool
+stdint
+
+configure.ac:
+gl_READUTMP
+
+Makefile.am:
+
+Include:
+"readutmp.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering & Paul Eggert
diff --git a/gnulib/modules/realloc b/gnulib/modules/realloc
new file mode 100644
index 00000000..4596b4cc
--- /dev/null
+++ b/gnulib/modules/realloc
@@ -0,0 +1,23 @@
+Description:
+realloc() function that is glibc compatible.
+
+Files:
+lib/realloc.c
+
+Depends-on:
+realloc-posix
+
+configure.ac:
+AC_FUNC_REALLOC
+AC_DEFINE([GNULIB_REALLOC_GNU], 1, [Define to indicate the 'realloc' module.])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/realloc-posix b/gnulib/modules/realloc-posix
new file mode 100644
index 00000000..5876584e
--- /dev/null
+++ b/gnulib/modules/realloc-posix
@@ -0,0 +1,26 @@
+Description:
+realloc() function: allocate memory with indefinite extent.
+
+Files:
+lib/realloc.c
+m4/realloc.m4
+m4/malloc.m4
+
+Depends-on:
+stdlib
+
+configure.ac:
+gl_FUNC_REALLOC_POSIX
+gl_STDLIB_MODULE_INDICATOR([realloc-posix])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/recv b/gnulib/modules/recv
new file mode 100644
index 00000000..04602f98
--- /dev/null
+++ b/gnulib/modules/recv
@@ -0,0 +1,28 @@
+Description:
+recv() function: receive (read) data from a connected socket.
+
+Files:
+lib/recv.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([recv])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([recv])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/recvfrom b/gnulib/modules/recvfrom
new file mode 100644
index 00000000..8237565b
--- /dev/null
+++ b/gnulib/modules/recvfrom
@@ -0,0 +1,29 @@
+Description:
+recvfrom() function: receive (read) data from a potentially unconnected socket.
+
+Files:
+lib/recvfrom.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+getpeername
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([recvfrom])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([recvfrom])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/regex b/gnulib/modules/regex
new file mode 100644
index 00000000..f5164062
--- /dev/null
+++ b/gnulib/modules/regex
@@ -0,0 +1,45 @@
+Description:
+Regular expression matching.
+
+Files:
+lib/regex.h
+lib/regex.c
+lib/regex_internal.c
+lib/regex_internal.h
+lib/regexec.c
+lib/regcomp.c
+m4/regex.m4
+m4/mbstate_t.m4
+
+Depends-on:
+alloca
+btowc
+extensions
+gettext-h
+localcharset
+malloc
+memcmp
+memmove
+mbrtowc
+mbsinit
+nl_langinfo
+stdbool
+stdint
+ssize_t
+wchar
+wcrtomb
+wctype
+
+configure.ac:
+gl_REGEX
+
+Makefile.am:
+
+Include:
+"regex.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/regexprops-generic b/gnulib/modules/regexprops-generic
new file mode 100644
index 00000000..3a7f5471
--- /dev/null
+++ b/gnulib/modules/regexprops-generic
@@ -0,0 +1,19 @@
+Description:
+Describe the various regular expression flavors.
+
+Files:
+doc/regexprops-generic.texi
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+public domain
+
+Maintainer:
+James Youngman
diff --git a/gnulib/modules/relocatable-lib b/gnulib/modules/relocatable-lib
new file mode 100644
index 00000000..5f6f774e
--- /dev/null
+++ b/gnulib/modules/relocatable-lib
@@ -0,0 +1,28 @@
+Description:
+Help make libraries relocatable, that is, to allow them to function
+properly when copied to an arbitrary directory.
+
+Files:
+doc/relocatable.texi
+lib/relocatable.h
+lib/relocatable.c
+m4/relocatable-lib.m4
+
+Depends-on:
+xalloc
+strdup
+
+configure.ac:
+gl_RELOCATABLE_LIBRARY
+
+Makefile.am:
+
+Include:
+"relocatable.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible, Ben Pfaff
+
diff --git a/gnulib/modules/relocatable-lib-lgpl b/gnulib/modules/relocatable-lib-lgpl
new file mode 100644
index 00000000..40fa815e
--- /dev/null
+++ b/gnulib/modules/relocatable-lib-lgpl
@@ -0,0 +1,28 @@
+Description:
+Help make libraries relocatable, that is, to allow them to function
+properly when copied to an arbitrary directory.
+
+Files:
+doc/relocatable.texi
+lib/relocatable.h
+lib/relocatable.c
+m4/relocatable-lib.m4
+
+Depends-on:
+strdup
+
+configure.ac:
+gl_RELOCATABLE_LIBRARY
+
+Makefile.am:
+DEFS += -DNO_XMALLOC
+
+Include:
+"relocatable.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible, Ben Pfaff
+
diff --git a/gnulib/modules/relocatable-prog b/gnulib/modules/relocatable-prog
new file mode 100644
index 00000000..48a66b8b
--- /dev/null
+++ b/gnulib/modules/relocatable-prog
@@ -0,0 +1,42 @@
+Description:
+Help make programs relocatable, that is, to allow them to function
+properly when copied to an arbitrary directory.
+
+Files:
+build-aux/config.libpath
+build-aux/reloc-ldflags
+doc/relocatable.texi
+lib/relocatable.h
+lib/relocatable.c
+lib/progreloc.c
+m4/relocatable.m4
+m4/relocatable-lib.m4
+m4/lib-ld.m4
+
+Depends-on:
+relocatable-prog-wrapper
+progname
+canonicalize-lgpl
+xalloc
+xreadlink
+stdbool
+unistd
+memcmp
+strdup
+
+configure.ac:
+gl_RELOCATABLE([$gl_source_base])
+
+Makefile.am:
+DEFS += -DEXEEXT=\"@EXEEXT@\"
+
+Include:
+"relocatable.h"
+"progname.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible, Ben Pfaff
+
diff --git a/gnulib/modules/relocatable-prog-wrapper b/gnulib/modules/relocatable-prog-wrapper
new file mode 100644
index 00000000..de77830a
--- /dev/null
+++ b/gnulib/modules/relocatable-prog-wrapper
@@ -0,0 +1,63 @@
+Description:
+Source for the wrapper program that is required for making programs relocatable
+that depend on shared libraries installed with the same installation prefix.
+
+Files:
+build-aux/install-reloc
+lib/relocwrapper.c
+lib/progname.h
+lib/progname.c
+lib/progreloc.c
+lib/areadlink.h
+lib/areadlink.c
+lib/readlink.c
+lib/canonicalize-lgpl.c
+lib/malloca.h
+lib/malloca.c
+lib/relocatable.h
+lib/relocatable.c
+lib/setenv.c
+lib/strerror.c
+lib/c-ctype.h
+lib/c-ctype.c
+m4/malloca.m4
+m4/canonicalize.m4
+m4/eealloc.m4
+m4/environ.m4
+m4/longlong.m4
+m4/readlink.m4
+m4/relocatable-lib.m4
+m4/setenv.m4
+m4/strerror.m4
+
+Depends-on:
+alloca-opt
+double-slash-root
+errno
+pathmax
+ssize_t
+stdbool
+stdlib
+unistd
+environ
+intprops
+string
+
+configure.ac:
+gl_FUNC_READLINK_SEPARATE
+gl_CANONICALIZE_LGPL_SEPARATE
+gl_MALLOCA
+gl_RELOCATABLE_LIBRARY_SEPARATE
+gl_FUNC_SETENV_SEPARATE
+gl_FUNC_STRERROR_SEPARATE
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible, Ben Pfaff
+
diff --git a/gnulib/modules/relocatable-script b/gnulib/modules/relocatable-script
new file mode 100644
index 00000000..2cdd6ae2
--- /dev/null
+++ b/gnulib/modules/relocatable-script
@@ -0,0 +1,26 @@
+Description:
+Help make shell scripts relocatable, that is, to allow them to
+function properly when copied to an arbitrary directory.
+
+Files:
+doc/relocatable.texi
+build-aux/relocatable.sh.in
+m4/relocatable-lib.m4
+
+Depends-on:
+
+configure.ac:
+AC_REQUIRE([gl_RELOCATABLE_NOP])
+relocatable_sh=$ac_aux_dir/relocatable.sh.in
+AC_SUBST_FILE([relocatable_sh])
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible, Ben Pfaff
+
diff --git a/gnulib/modules/remainder b/gnulib/modules/remainder
new file mode 100644
index 00000000..36d75bdc
--- /dev/null
+++ b/gnulib/modules/remainder
@@ -0,0 +1,24 @@
+Description:
+remainder() function: floating-point remainder function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([remainder])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(REMAINDER_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/remainder-tests b/gnulib/modules/remainder-tests
new file mode 100644
index 00000000..6832a49a
--- /dev/null
+++ b/gnulib/modules/remainder-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-remainder.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-remainder
+check_PROGRAMS += test-remainder
+test_remainder_LDADD = $(LDADD) @REMAINDER_LIBM@
diff --git a/gnulib/modules/remove b/gnulib/modules/remove
new file mode 100644
index 00000000..c2a305ed
--- /dev/null
+++ b/gnulib/modules/remove
@@ -0,0 +1,27 @@
+Description:
+remove(): remove a file or directory
+
+Files:
+lib/remove.c
+m4/dos.m4
+m4/remove.m4
+
+Depends-on:
+rmdir
+stdio
+unlink
+
+configure.ac:
+gl_FUNC_REMOVE
+gl_STDIO_MODULE_INDICATOR([remove])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/remove-tests b/gnulib/modules/remove-tests
new file mode 100644
index 00000000..498c7d6e
--- /dev/null
+++ b/gnulib/modules/remove-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-remove.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+symlink
+sys_stat
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-remove
+check_PROGRAMS += test-remove
diff --git a/gnulib/modules/rename b/gnulib/modules/rename
new file mode 100644
index 00000000..e553a12a
--- /dev/null
+++ b/gnulib/modules/rename
@@ -0,0 +1,31 @@
+Description:
+rename() function: change the name or location of a file.
+
+Files:
+lib/rename.c
+m4/rename.m4
+
+Depends-on:
+canonicalize-lgpl
+dirname-lgpl
+lstat
+rmdir
+same-inode
+stdbool
+stdio
+strdup
+
+configure.ac:
+gl_FUNC_RENAME
+gl_STDIO_MODULE_INDICATOR([rename])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/rename-dest-slash b/gnulib/modules/rename-dest-slash
new file mode 100644
index 00000000..f52b3b8d
--- /dev/null
+++ b/gnulib/modules/rename-dest-slash
@@ -0,0 +1,26 @@
+Description:
+rename() function: change the name or location of a file.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete; use the rename module instead.
+
+Files:
+
+Depends-on:
+rename
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/rename-tests b/gnulib/modules/rename-tests
new file mode 100644
index 00000000..339ecdf5
--- /dev/null
+++ b/gnulib/modules/rename-tests
@@ -0,0 +1,19 @@
+Files:
+tests/test-rename.h
+tests/test-rename.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+errno
+link
+stdbool
+symlink
+sys_stat
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-rename
+check_PROGRAMS += test-rename
diff --git a/gnulib/modules/renameat b/gnulib/modules/renameat
new file mode 100644
index 00000000..d370279c
--- /dev/null
+++ b/gnulib/modules/renameat
@@ -0,0 +1,33 @@
+Description:
+renameat(): rename a file, relative to two directories
+
+Files:
+lib/at-func2.c
+lib/renameat.c
+m4/renameat.m4
+
+Depends-on:
+extensions
+fcntl-h
+filenamecat-lgpl
+openat
+rename
+same-inode
+stdio
+stpcpy
+
+configure.ac:
+gl_FUNC_RENAMEAT
+gl_STDIO_MODULE_INDICATOR([renameat])
+
+Makefile.am:
+
+Include:
+<fcntl.h>
+<stdio.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/renameat-tests b/gnulib/modules/renameat-tests
new file mode 100644
index 00000000..dcef7c19
--- /dev/null
+++ b/gnulib/modules/renameat-tests
@@ -0,0 +1,18 @@
+Files:
+tests/test-rename.h
+tests/test-renameat.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+filenamecat
+progname
+xgetcwd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-renameat
+check_PROGRAMS += test-renameat
+test_renameat_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/rint b/gnulib/modules/rint
new file mode 100644
index 00000000..276c9263
--- /dev/null
+++ b/gnulib/modules/rint
@@ -0,0 +1,24 @@
+Description:
+rint() function: round to nearest integer.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_MATHFUNC([rint], [double], [(double)])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(RINT_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/rint-tests b/gnulib/modules/rint-tests
new file mode 100644
index 00000000..315fda37
--- /dev/null
+++ b/gnulib/modules/rint-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-rint.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-rint
+check_PROGRAMS += test-rint
+test_rint_LDADD = $(LDADD) @RINT_LIBM@
diff --git a/gnulib/modules/rmdir b/gnulib/modules/rmdir
new file mode 100644
index 00000000..d047e4c5
--- /dev/null
+++ b/gnulib/modules/rmdir
@@ -0,0 +1,26 @@
+Description:
+rmdir() function: delete a directory.
+
+Files:
+lib/rmdir.c
+m4/dos.m4
+m4/rmdir.m4
+
+Depends-on:
+sys_stat
+unistd
+
+configure.ac:
+gl_FUNC_RMDIR
+gl_UNISTD_MODULE_INDICATOR([rmdir])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/rmdir-errno b/gnulib/modules/rmdir-errno
new file mode 100644
index 00000000..ef02a95d
--- /dev/null
+++ b/gnulib/modules/rmdir-errno
@@ -0,0 +1,26 @@
+Description:
+rmdir errno for nonempty directories
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+m4/rmdir-errno.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_RMDIR_NOTEMPTY
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/rmdir-tests b/gnulib/modules/rmdir-tests
new file mode 100644
index 00000000..19a5240e
--- /dev/null
+++ b/gnulib/modules/rmdir-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-rmdir.h
+tests/test-rmdir.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-rmdir
+check_PROGRAMS += test-rmdir
diff --git a/gnulib/modules/round b/gnulib/modules/round
new file mode 100644
index 00000000..c4acba13
--- /dev/null
+++ b/gnulib/modules/round
@@ -0,0 +1,34 @@
+Description:
+round() function: round toward nearest, breaking ties away from zero.
+
+Files:
+lib/round.c
+m4/check-math-lib.m4
+m4/round.m4
+m4/floor.m4
+m4/ceil.m4
+
+Depends-on:
+float
+floor
+math
+extensions
+
+configure.ac:
+gl_FUNC_ROUND
+gl_MATH_MODULE_INDICATOR([round])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ROUND_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Ben Pfaff
+
diff --git a/gnulib/modules/round-tests b/gnulib/modules/round-tests
new file mode 100644
index 00000000..28b0defe
--- /dev/null
+++ b/gnulib/modules/round-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-round1.c
+tests/test-round2.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+isnand-nolibm
+stdbool
+stdint
+fprintf-posix
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-round1 test-round2
+check_PROGRAMS += test-round1 test-round2
+test_round1_LDADD = $(LDADD) @ROUND_LIBM@
+test_round2_LDADD = $(LDADD) @ROUND_LIBM@
diff --git a/gnulib/modules/roundf b/gnulib/modules/roundf
new file mode 100644
index 00000000..d77b2a19
--- /dev/null
+++ b/gnulib/modules/roundf
@@ -0,0 +1,34 @@
+Description:
+roundf() function: round toward nearest, breaking ties away from zero.
+
+Files:
+lib/round.c
+lib/roundf.c
+m4/check-math-lib.m4
+m4/roundf.m4
+m4/floorf.m4
+m4/ceilf.m4
+
+Depends-on:
+float
+math
+extensions
+
+configure.ac:
+gl_FUNC_ROUNDF
+gl_MATH_MODULE_INDICATOR([roundf])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ROUNDF_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Ben Pfaff
+
diff --git a/gnulib/modules/roundf-tests b/gnulib/modules/roundf-tests
new file mode 100644
index 00000000..82ff3b74
--- /dev/null
+++ b/gnulib/modules/roundf-tests
@@ -0,0 +1,24 @@
+Files:
+tests/test-roundf1.c
+tests/test-round2.c
+tests/test-roundf2.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ceilf
+floorf
+isnanf-nolibm
+stdbool
+stdint
+fprintf-posix
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-roundf1 test-roundf2
+check_PROGRAMS += test-roundf1 test-roundf2
+test_roundf1_LDADD = $(LDADD) @ROUNDF_LIBM@
+test_roundf2_LDADD = $(LDADD) @ROUNDF_LIBM@
diff --git a/gnulib/modules/roundl b/gnulib/modules/roundl
new file mode 100644
index 00000000..9eb9f1de
--- /dev/null
+++ b/gnulib/modules/roundl
@@ -0,0 +1,34 @@
+Description:
+roundl() function: round toward nearest, breaking ties away from zero.
+
+Files:
+lib/round.c
+lib/roundl.c
+m4/check-math-lib.m4
+m4/roundl.m4
+m4/floorl.m4
+m4/ceill.m4
+
+Depends-on:
+float
+math
+extensions
+
+configure.ac:
+gl_FUNC_ROUNDL
+gl_MATH_MODULE_INDICATOR([roundl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(ROUNDL_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Ben Pfaff
+
diff --git a/gnulib/modules/roundl-tests b/gnulib/modules/roundl-tests
new file mode 100644
index 00000000..bd1b5c90
--- /dev/null
+++ b/gnulib/modules/roundl-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-roundl.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+isnanl-nolibm
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-roundl
+check_PROGRAMS += test-roundl
+test_roundl_LDADD = $(LDADD) @ROUNDL_LIBM@
diff --git a/gnulib/modules/rpmatch b/gnulib/modules/rpmatch
new file mode 100644
index 00000000..24297e5d
--- /dev/null
+++ b/gnulib/modules/rpmatch
@@ -0,0 +1,30 @@
+Description:
+Locale dependent classification of a response as matching "yes" or "no".
+
+Files:
+lib/rpmatch.c
+m4/rpmatch.m4
+
+Depends-on:
+stdlib
+extensions
+stdbool
+gettext-h
+regex
+strdup
+
+configure.ac:
+gl_FUNC_RPMATCH
+gl_STDLIB_MODULE_INDICATOR([rpmatch])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/safe-alloc b/gnulib/modules/safe-alloc
new file mode 100644
index 00000000..bffbecc4
--- /dev/null
+++ b/gnulib/modules/safe-alloc
@@ -0,0 +1,21 @@
+Description:
+A set of macros to make calls to alloc/calloc/realloc safer.
+
+Files:
+lib/safe-alloc.h
+lib/safe-alloc.c
+m4/safe-alloc.m4
+
+configure.ac:
+gl_SAFE_ALLOC
+
+Makefile.am:
+
+Include:
+"safe-alloc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+David Lutterkort
diff --git a/gnulib/modules/safe-alloc-tests b/gnulib/modules/safe-alloc-tests
new file mode 100644
index 00000000..06f771c4
--- /dev/null
+++ b/gnulib/modules/safe-alloc-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-safe-alloc.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-safe-alloc
+check_PROGRAMS += test-safe-alloc
diff --git a/gnulib/modules/safe-read b/gnulib/modules/safe-read
new file mode 100644
index 00000000..bc575067
--- /dev/null
+++ b/gnulib/modules/safe-read
@@ -0,0 +1,24 @@
+Description:
+An interface to the read() function that retries after interrupts.
+
+Files:
+lib/safe-read.h
+lib/safe-read.c
+m4/safe-read.m4
+
+Depends-on:
+ssize_t
+
+configure.ac:
+gl_SAFE_READ
+
+Makefile.am:
+
+Include:
+"safe-read.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, Bruno Haible
diff --git a/gnulib/modules/safe-write b/gnulib/modules/safe-write
new file mode 100644
index 00000000..cd4da564
--- /dev/null
+++ b/gnulib/modules/safe-write
@@ -0,0 +1,25 @@
+Description:
+An interface to the write() function that retries after interrupts.
+
+Files:
+lib/safe-write.h
+lib/safe-write.c
+m4/safe-write.m4
+
+Depends-on:
+safe-read
+write
+
+configure.ac:
+gl_SAFE_WRITE
+
+Makefile.am:
+
+Include:
+"safe-write.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, Bruno Haible
diff --git a/gnulib/modules/same b/gnulib/modules/same
new file mode 100644
index 00000000..7a9252a5
--- /dev/null
+++ b/gnulib/modules/same
@@ -0,0 +1,30 @@
+Description:
+Determine whether two file names refer to the same directory entry of the same
+directory.
+
+Files:
+lib/same.h
+lib/same.c
+m4/same.m4
+
+Depends-on:
+error
+dirname
+same-inode
+stat
+stdbool
+memcmp
+
+configure.ac:
+gl_SAME
+
+Makefile.am:
+
+Include:
+"same.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/same-inode b/gnulib/modules/same-inode
new file mode 100644
index 00000000..8301b3d1
--- /dev/null
+++ b/gnulib/modules/same-inode
@@ -0,0 +1,20 @@
+Description:
+compare inodes
+
+Files:
+lib/same-inode.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"same-inode.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/save-cwd b/gnulib/modules/save-cwd
new file mode 100644
index 00000000..46a1276a
--- /dev/null
+++ b/gnulib/modules/save-cwd
@@ -0,0 +1,27 @@
+Description:
+Save and restore the current working directory.
+
+Files:
+lib/save-cwd.h
+lib/save-cwd.c
+m4/save-cwd.m4
+
+Depends-on:
+chdir-long
+stdbool
+unistd-safer
+xgetcwd
+
+configure.ac:
+gl_SAVE_CWD
+
+Makefile.am:
+
+Include:
+"save-cwd.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/savedir b/gnulib/modules/savedir
new file mode 100644
index 00000000..6699095e
--- /dev/null
+++ b/gnulib/modules/savedir
@@ -0,0 +1,26 @@
+Description:
+Return the entries of a directory (just the names) as an argz string.
+
+Files:
+lib/savedir.h
+lib/savedir.c
+m4/savedir.m4
+
+Depends-on:
+dirent-safer
+fdopendir
+xalloc
+
+configure.ac:
+gl_SAVEDIR
+
+Makefile.am:
+
+Include:
+"savedir.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/savewd b/gnulib/modules/savewd
new file mode 100644
index 00000000..41f51e31
--- /dev/null
+++ b/gnulib/modules/savewd
@@ -0,0 +1,33 @@
+Description:
+Save and restore the working directory, possibly using a child process.
+
+Files:
+lib/savewd.h
+lib/savewd.c
+m4/savewd.m4
+
+Depends-on:
+dirname-lgpl
+errno
+exit
+fchdir
+fcntl-safer
+fcntl-h
+raise
+stdbool
+xalloc
+
+configure.ac:
+gl_SAVEWD
+
+Makefile.am:
+lib_SOURCES += savewd.h savewd.c
+
+Include:
+"savewd.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/scandir b/gnulib/modules/scandir
new file mode 100644
index 00000000..d226f118
--- /dev/null
+++ b/gnulib/modules/scandir
@@ -0,0 +1,26 @@
+Description:
+scandir() function: collect entries of a directory
+
+Files:
+lib/scandir.c
+m4/scandir.m4
+
+Depends-on:
+dirent
+extensions
+
+configure.ac:
+gl_FUNC_SCANDIR
+gl_DIRENT_MODULE_INDICATOR([scandir])
+
+Makefile.am:
+
+Include:
+<dirent.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
+
diff --git a/gnulib/modules/sched b/gnulib/modules/sched
new file mode 100644
index 00000000..4ce23571
--- /dev/null
+++ b/gnulib/modules/sched
@@ -0,0 +1,40 @@
+Description:
+A <sched.h> include file.
+
+Files:
+lib/sched.in.h
+m4/sched_h.m4
+
+Depends-on:
+include_next
+
+configure.ac:
+gl_SCHED_H
+
+Makefile.am:
+BUILT_SOURCES += $(SCHED_H)
+
+# We need the following in order to create a replacement for <sched.h> when
+# the system doesn't have one.
+sched.h: sched.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SCHED_H''@|$(HAVE_SCHED_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SCHED_H''@|$(NEXT_SCHED_H)|g' \
+ -e 's|@''HAVE_STRUCT_SCHED_PARAM''@|$(HAVE_STRUCT_SCHED_PARAM)|g' \
+ < $(srcdir)/sched.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sched.h sched.h-t
+
+Include:
+<sched.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/sched-tests b/gnulib/modules/sched-tests
new file mode 100644
index 00000000..8427490f
--- /dev/null
+++ b/gnulib/modules/sched-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sched.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sched
+check_PROGRAMS += test-sched
diff --git a/gnulib/modules/search b/gnulib/modules/search
new file mode 100644
index 00000000..898decef
--- /dev/null
+++ b/gnulib/modules/search
@@ -0,0 +1,45 @@
+Description:
+A GNU-like <search.h>.
+
+Files:
+lib/search.in.h
+m4/search_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+warn-on-use
+
+configure.ac:
+gl_SEARCH_H
+
+Makefile.am:
+BUILT_SOURCES += search.h
+
+# We need the following in order to create <search.h> when the system
+# doesn't have one that works with the given compiler.
+search.h: search.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''HAVE_SEARCH_H''@|$(HAVE_SEARCH_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SEARCH_H''@|$(NEXT_SEARCH_H)|g' \
+ -e 's|@''GNULIB_TSEARCH''@|$(GNULIB_TSEARCH)|g' \
+ -e 's|@''HAVE_TSEARCH''@|$(HAVE_TSEARCH)|g' \
+ -e 's|@''REPLACE_TSEARCH''@|$(REPLACE_TSEARCH)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/search.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += search.h search.h-t
+
+Include:
+<search.h>
+
+License:
+LGPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/search-tests b/gnulib/modules/search-tests
new file mode 100644
index 00000000..93d35114
--- /dev/null
+++ b/gnulib/modules/search-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-search.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-search
+check_PROGRAMS += test-search
diff --git a/gnulib/modules/select b/gnulib/modules/select
new file mode 100644
index 00000000..18865f14
--- /dev/null
+++ b/gnulib/modules/select
@@ -0,0 +1,29 @@
+Description:
+select() function: synchronous I/O multiplexing.
+
+Files:
+lib/select.c
+m4/select.m4
+
+Depends-on:
+alloca
+sockets
+sys_select
+
+configure.ac:
+gl_FUNC_SELECT
+gl_SYS_SELECT_MODULE_INDICATOR([select])
+
+Makefile.am:
+
+Include:
+<sys/select.h>
+
+Link:
+$(LIBSOCKET)
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/select-tests b/gnulib/modules/select-tests
new file mode 100644
index 00000000..6019b449
--- /dev/null
+++ b/gnulib/modules/select-tests
@@ -0,0 +1,37 @@
+Files:
+tests/signature.h
+tests/test-select.c
+tests/test-select-fd.c
+tests/test-select-in.sh
+tests/test-select-out.sh
+tests/test-select-stdin.c
+
+Depends-on:
+stdbool
+netinet_in
+arpa_inet
+sys_ioctl
+extensions
+inet_pton
+errno
+perror
+socket
+bind
+setsockopt
+listen
+connect
+accept
+ioctl
+close
+gettimeofday
+
+configure.ac:
+AC_CHECK_HEADERS_ONCE([unistd.h sys/wait.h])
+
+Makefile.am:
+TESTS += test-select test-select-in.sh test-select-out.sh
+# test-select-stdin has to be run by hand.
+check_PROGRAMS += test-select test-select-fd test-select-stdin
+test_select_LDADD = $(LDADD) @LIBSOCKET@ $(INET_PTON_LIB)
+test_select_fd_LDADD = $(LDADD) @LIBSOCKET@
+test_select_stdin_LDADD = $(LDADD) @LIBSOCKET@
diff --git a/gnulib/modules/selinux-at b/gnulib/modules/selinux-at
new file mode 100644
index 00000000..925219d1
--- /dev/null
+++ b/gnulib/modules/selinux-at
@@ -0,0 +1,25 @@
+Description:
+openat-style fd-relative functions for SE Linux
+
+Files:
+lib/selinux-at.c
+lib/selinux-at.h
+
+Depends-on:
+openat
+selinux-h
+
+configure.ac:
+AC_CHECK_HEADERS([selinux/flask.h])
+AC_LIBOBJ([selinux-at])
+
+Makefile.am:
+
+Include:
+"selinux-at.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/selinux-h b/gnulib/modules/selinux-h
new file mode 100644
index 00000000..12dd20d8
--- /dev/null
+++ b/gnulib/modules/selinux-h
@@ -0,0 +1,62 @@
+Description:
+SELinux-related headers for systems that lack them.
+
+Files:
+lib/getfilecon.c
+lib/se-context.in.h
+lib/se-selinux.in.h
+m4/selinux-context-h.m4
+m4/selinux-selinux-h.m4
+
+Depends-on:
+errno
+unused-parameter
+
+configure.ac:
+gl_HEADERS_SELINUX_SELINUX_H
+gl_HEADERS_SELINUX_CONTEXT_H
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += se-context.in.h se-selinux.in.h
+
+BUILT_SOURCES += selinux/selinux.h
+selinux/selinux.h: se-selinux.in.h $(UNUSED_PARAMETER_H)
+ $(AM_V_at)$(MKDIR_P) selinux
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SELINUX_SELINUX_H''@|$(NEXT_SELINUX_SELINUX_H)|g' \
+ -e '/definition of _GL_UNUSED_PARAMETER/r $(UNUSED_PARAMETER_H)' \
+ < $(srcdir)/se-selinux.in.h; \
+ } > $@-t && \
+ chmod a-x $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += selinux/selinux.h selinux/selinux.h-t
+
+BUILT_SOURCES += $(SELINUX_CONTEXT_H)
+selinux/context.h: se-context.in.h $(UNUSED_PARAMETER_H)
+ $(AM_V_at)$(MKDIR_P) selinux
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e '/definition of _GL_UNUSED_PARAMETER/r $(UNUSED_PARAMETER_H)' \
+ < $(srcdir)/se-context.in.h; \
+ } > $@-t && \
+ chmod a-x $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += selinux/context.h selinux/context.h-t
+MOSTLYCLEANDIRS += selinux
+
+Include:
+<selinux/selinux.h>
+<selinux/context.h>
+
+Link:
+$(LIB_SELINUX)
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/send b/gnulib/modules/send
new file mode 100644
index 00000000..4317d6fb
--- /dev/null
+++ b/gnulib/modules/send
@@ -0,0 +1,28 @@
+Description:
+send() function: send (write) data to a connected socket.
+
+Files:
+lib/send.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([send])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([send])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/sendto b/gnulib/modules/sendto
new file mode 100644
index 00000000..d9a292c8
--- /dev/null
+++ b/gnulib/modules/sendto
@@ -0,0 +1,28 @@
+Description:
+sendto() function: send (write) data to a potentially unconnected socket.
+
+Files:
+lib/sendto.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([sendto])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([sendto])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/servent b/gnulib/modules/servent
new file mode 100644
index 00000000..e5e27feb
--- /dev/null
+++ b/gnulib/modules/servent
@@ -0,0 +1,28 @@
+Description:
+Library containing getservent(), setservent(), endservent(), getservbyname(),
+getservbyport(), getprotoent(), setprotoent(), endprotoent(), getprotobyname(),
+getprotobynumber().
+
+Files:
+m4/servent.m4
+
+Depends-on:
+sys_socket
+
+configure.ac:
+gl_SERVENT
+
+Makefile.am:
+
+Include:
+<netdb.h>
+
+Link:
+$(SERVENT_LIB)
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible, Simon Josefsson
+
diff --git a/gnulib/modules/setenv b/gnulib/modules/setenv
new file mode 100644
index 00000000..0458c388
--- /dev/null
+++ b/gnulib/modules/setenv
@@ -0,0 +1,29 @@
+Description:
+setenv() function: set an environment variable.
+
+Files:
+lib/setenv.c
+m4/setenv.m4
+
+Depends-on:
+stdlib
+malloca
+alloca-opt
+unistd
+environ
+
+configure.ac:
+gl_FUNC_SETENV
+gl_STDLIB_MODULE_INDICATOR([setenv])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/setenv-tests b/gnulib/modules/setenv-tests
new file mode 100644
index 00000000..b7b8bad2
--- /dev/null
+++ b/gnulib/modules/setenv-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-setenv.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-setenv
+check_PROGRAMS += test-setenv
diff --git a/gnulib/modules/setsockopt b/gnulib/modules/setsockopt
new file mode 100644
index 00000000..5702aaeb
--- /dev/null
+++ b/gnulib/modules/setsockopt
@@ -0,0 +1,30 @@
+Description:
+setsockopt() function: specify optional settings on a socket.
+
+Files:
+lib/setsockopt.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+sys_time
+socklen
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([setsockopt])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([setsockopt])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/settime b/gnulib/modules/settime
new file mode 100644
index 00000000..c2e1b3cd
--- /dev/null
+++ b/gnulib/modules/settime
@@ -0,0 +1,30 @@
+Description:
+Set the current time, with nanosecond resolution.
+
+Files:
+lib/settime.c
+m4/settime.m4
+
+Depends-on:
+clock-time
+errno
+extensions
+sys_time
+timespec
+
+configure.ac:
+gl_SETTIME
+
+Makefile.am:
+
+Include:
+"timespec.h"
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/sh-quote b/gnulib/modules/sh-quote
new file mode 100644
index 00000000..b9328165
--- /dev/null
+++ b/gnulib/modules/sh-quote
@@ -0,0 +1,25 @@
+Description:
+Shell quoting.
+
+Files:
+lib/sh-quote.h
+lib/sh-quote.c
+
+Depends-on:
+quotearg
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += sh-quote.h sh-quote.c
+
+Include:
+"sh-quote.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/shutdown b/gnulib/modules/shutdown
new file mode 100644
index 00000000..c1e06210
--- /dev/null
+++ b/gnulib/modules/shutdown
@@ -0,0 +1,28 @@
+Description:
+shutdown() function: initiate a graceful shutdown of a socket.
+
+Files:
+lib/shutdown.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([shutdown])
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([shutdown])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson, Bruno Haible
diff --git a/gnulib/modules/sig2str b/gnulib/modules/sig2str
new file mode 100644
index 00000000..89d00cc6
--- /dev/null
+++ b/gnulib/modules/sig2str
@@ -0,0 +1,24 @@
+Description:
+Convert between signal names and signal numbers.
+
+Files:
+lib/sig2str.h
+lib/sig2str.c
+m4/sig2str.m4
+
+Depends-on:
+intprops
+
+configure.ac:
+gl_FUNC_SIG2STR
+
+Makefile.am:
+
+Include:
+"sig2str.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/sigaction b/gnulib/modules/sigaction
new file mode 100644
index 00000000..84905739
--- /dev/null
+++ b/gnulib/modules/sigaction
@@ -0,0 +1,26 @@
+Description:
+POSIX compatible signal handlers.
+
+Files:
+lib/sigaction.c
+lib/sig-handler.h
+m4/sigaction.m4
+
+Depends-on:
+signal
+sigprocmask
+
+configure.ac:
+gl_SIGACTION
+gl_SIGNAL_MODULE_INDICATOR([sigaction])
+
+Makefile.am:
+
+Include:
+<signal.h>
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/sigaction-tests b/gnulib/modules/sigaction-tests
new file mode 100644
index 00000000..e683614e
--- /dev/null
+++ b/gnulib/modules/sigaction-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-sigaction.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sigaction
+check_PROGRAMS += test-sigaction
diff --git a/gnulib/modules/signal b/gnulib/modules/signal
new file mode 100644
index 00000000..68297a8b
--- /dev/null
+++ b/gnulib/modules/signal
@@ -0,0 +1,50 @@
+Description:
+A GNU-like <signal.h>.
+
+Files:
+lib/signal.in.h
+m4/signal_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+warn-on-use
+
+configure.ac:
+gl_SIGNAL_H
+
+Makefile.am:
+BUILT_SOURCES += signal.h
+
+# We need the following in order to create <signal.h> when the system
+# doesn't have a complete one.
+signal.h: signal.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \
+ -e 's|@''GNULIB_SIGNAL_H_SIGPIPE''@|$(GNULIB_SIGNAL_H_SIGPIPE)|g' \
+ -e 's|@''GNULIB_SIGPROCMASK''@|$(GNULIB_SIGPROCMASK)|g' \
+ -e 's|@''GNULIB_SIGACTION''@|$(GNULIB_SIGACTION)|g' \
+ -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \
+ -e 's|@''HAVE_SIGSET_T''@|$(HAVE_SIGSET_T)|g' \
+ -e 's|@''HAVE_SIGINFO_T''@|$(HAVE_SIGINFO_T)|g' \
+ -e 's|@''HAVE_SIGACTION''@|$(HAVE_SIGACTION)|g' \
+ -e 's|@''HAVE_STRUCT_SIGACTION_SA_SIGACTION''@|$(HAVE_STRUCT_SIGACTION_SA_SIGACTION)|g' \
+ -e 's|@''HAVE_TYPE_VOLATILE_SIG_ATOMIC_T''@|$(HAVE_TYPE_VOLATILE_SIG_ATOMIC_T)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/signal.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += signal.h signal.h-t
+
+Include:
+<signal.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/signal-tests b/gnulib/modules/signal-tests
new file mode 100644
index 00000000..3a321f1e
--- /dev/null
+++ b/gnulib/modules/signal-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-signal.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-signal
+check_PROGRAMS += test-signal
diff --git a/gnulib/modules/signbit b/gnulib/modules/signbit
new file mode 100644
index 00000000..14a57545
--- /dev/null
+++ b/gnulib/modules/signbit
@@ -0,0 +1,34 @@
+Description:
+signbit() macro: Determine the sign bit of a floating-point number.
+
+Files:
+lib/signbitf.c
+lib/signbitd.c
+lib/signbitl.c
+lib/float+.h
+m4/signbit.m4
+
+Depends-on:
+float
+math
+isnanf-nolibm
+isnand-nolibm
+isnanl-nolibm
+fpieee
+memcmp
+
+configure.ac:
+gl_SIGNBIT
+gl_MATH_MODULE_INDICATOR([signbit])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/signbit-tests b/gnulib/modules/signbit-tests
new file mode 100644
index 00000000..10d7d7b5
--- /dev/null
+++ b/gnulib/modules/signbit-tests
@@ -0,0 +1,19 @@
+Files:
+tests/test-signbit.c
+tests/macros.h
+m4/exponentf.m4
+m4/exponentd.m4
+m4/exponentl.m4
+
+Depends-on:
+float
+
+configure.ac:
+AC_REQUIRE([gl_FLOAT_EXPONENT_LOCATION])
+AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION])
+AC_REQUIRE([gl_LONG_DOUBLE_EXPONENT_LOCATION])
+
+Makefile.am:
+TESTS += test-signbit
+check_PROGRAMS += test-signbit
+
diff --git a/gnulib/modules/sigpipe b/gnulib/modules/sigpipe
new file mode 100644
index 00000000..8addd22e
--- /dev/null
+++ b/gnulib/modules/sigpipe
@@ -0,0 +1,37 @@
+Description:
+Emulation of POSIX compatible SIGPIPE behaviour.
+
+Files:
+m4/sigpipe.m4
+
+Depends-on:
+signal
+sigprocmask
+stdio
+unistd
+
+configure.ac:
+gl_SIGNAL_SIGPIPE
+dnl Define the C macro GNULIB_SIGPIPE to 1.
+gl_MODULE_INDICATOR([sigpipe])
+dnl Define the substituted variable GNULIB_SIGNAL_H_SIGPIPE to 1.
+AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+GNULIB_SIGNAL_H_SIGPIPE=1
+dnl Define the substituted variable GNULIB_STDIO_H_SIGPIPE to 1.
+AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+GNULIB_STDIO_H_SIGPIPE=1
+dnl Define the substituted variable GNULIB_UNISTD_H_SIGPIPE to 1.
+AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+GNULIB_UNISTD_H_SIGPIPE=1
+
+Makefile.am:
+
+Include:
+<signal.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/sigpipe-die b/gnulib/modules/sigpipe-die
new file mode 100644
index 00000000..72296656
--- /dev/null
+++ b/gnulib/modules/sigpipe-die
@@ -0,0 +1,28 @@
+Description:
+Report a SIGPIPE signal and exit.
+
+Files:
+lib/sigpipe-die.h
+lib/sigpipe-die.c
+
+Depends-on:
+error
+gettext-h
+exitfail
+sigpipe
+sigprocmask
+sigaction
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += sigpipe-die.h sigpipe-die.c
+
+Include:
+"sigpipe-die.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/sigpipe-tests b/gnulib/modules/sigpipe-tests
new file mode 100644
index 00000000..99107a65
--- /dev/null
+++ b/gnulib/modules/sigpipe-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-sigpipe.c
+tests/test-sigpipe.sh
+
+Depends-on:
+write
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sigpipe.sh
+check_PROGRAMS += test-sigpipe
+
diff --git a/gnulib/modules/sigprocmask b/gnulib/modules/sigprocmask
new file mode 100644
index 00000000..e46abc97
--- /dev/null
+++ b/gnulib/modules/sigprocmask
@@ -0,0 +1,27 @@
+Description:
+POSIX compatible signal blocking.
+
+Files:
+lib/sigprocmask.c
+m4/signalblocking.m4
+
+Depends-on:
+signal
+stdint
+raise
+
+configure.ac:
+gl_SIGNALBLOCKING
+gl_SIGNAL_MODULE_INDICATOR([sigprocmask])
+
+Makefile.am:
+
+Include:
+<signal.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/sin b/gnulib/modules/sin
new file mode 100644
index 00000000..ba5e92db
--- /dev/null
+++ b/gnulib/modules/sin
@@ -0,0 +1,24 @@
+Description:
+sin() function: sine function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([sin])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(SIN_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/sin-tests b/gnulib/modules/sin-tests
new file mode 100644
index 00000000..06d3b32f
--- /dev/null
+++ b/gnulib/modules/sin-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-sin.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sin
+check_PROGRAMS += test-sin
+test_sin_LDADD = $(LDADD) @SIN_LIBM@
diff --git a/gnulib/modules/sinh b/gnulib/modules/sinh
new file mode 100644
index 00000000..d02ef56d
--- /dev/null
+++ b/gnulib/modules/sinh
@@ -0,0 +1,24 @@
+Description:
+sinh() function: hyperbolic sine function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([sinh])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(SINH_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/sinh-tests b/gnulib/modules/sinh-tests
new file mode 100644
index 00000000..236c9469
--- /dev/null
+++ b/gnulib/modules/sinh-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-sinh.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sinh
+check_PROGRAMS += test-sinh
+test_sinh_LDADD = $(LDADD) @SINH_LIBM@
diff --git a/gnulib/modules/sinl b/gnulib/modules/sinl
new file mode 100644
index 00000000..67621ed3
--- /dev/null
+++ b/gnulib/modules/sinl
@@ -0,0 +1,35 @@
+Description:
+sinl() function: sine function with long double argument.
+
+Files:
+lib/sinl.c
+lib/trigl.h
+lib/sincosl.c
+lib/trigl.c
+m4/sinl.m4
+
+Depends-on:
+math
+extensions
+float
+isnanl
+floor
+floorl
+
+configure.ac:
+gl_FUNC_SINL
+gl_MATH_MODULE_INDICATOR([sinl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(SINL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/sinl-tests b/gnulib/modules/sinl-tests
new file mode 100644
index 00000000..357ad627
--- /dev/null
+++ b/gnulib/modules/sinl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-sinl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sinl
+check_PROGRAMS += test-sinl
+test_sinl_LDADD = $(LDADD) @SINL_LIBM@
diff --git a/gnulib/modules/size_max b/gnulib/modules/size_max
new file mode 100644
index 00000000..b584e496
--- /dev/null
+++ b/gnulib/modules/size_max
@@ -0,0 +1,24 @@
+Description:
+Provide SIZE_MAX, for cases when the 'stdint' module cannot be used.
+
+Files:
+m4/size_max.m4
+lib/size_max.h
+
+Depends-on:
+
+configure.ac:
+gl_SIZE_MAX
+
+Makefile.am:
+lib_SOURCES += size_max.h
+
+Include:
+"size_max.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
+Bruno Haible
diff --git a/gnulib/modules/sleep b/gnulib/modules/sleep
new file mode 100644
index 00000000..e859e59e
--- /dev/null
+++ b/gnulib/modules/sleep
@@ -0,0 +1,27 @@
+Description:
+sleep() function: pause execution of the current thread.
+
+Files:
+lib/sleep.c
+m4/sleep.m4
+
+Depends-on:
+stdint
+unistd
+verify
+
+configure.ac:
+gl_FUNC_SLEEP
+gl_UNISTD_MODULE_INDICATOR([sleep])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/sleep-tests b/gnulib/modules/sleep-tests
new file mode 100644
index 00000000..93a28f81
--- /dev/null
+++ b/gnulib/modules/sleep-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-sleep.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-sleep
+check_PROGRAMS += test-sleep
diff --git a/gnulib/modules/snprintf b/gnulib/modules/snprintf
new file mode 100644
index 00000000..27c343eb
--- /dev/null
+++ b/gnulib/modules/snprintf
@@ -0,0 +1,27 @@
+Description:
+snprintf() function: print formatted output to a fixed length string
+
+Files:
+lib/snprintf.c
+m4/snprintf.m4
+m4/printf.m4
+
+Depends-on:
+stdio
+vasnprintf
+errno
+
+configure.ac:
+gl_FUNC_SNPRINTF
+gl_STDIO_MODULE_INDICATOR([snprintf])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson, Paul Eggert, Bruno Haible
diff --git a/gnulib/modules/snprintf-posix b/gnulib/modules/snprintf-posix
new file mode 100644
index 00000000..28c8fe37
--- /dev/null
+++ b/gnulib/modules/snprintf-posix
@@ -0,0 +1,37 @@
+Description:
+POSIX compatible snprintf() function: print formatted output to a fixed length
+string
+
+Files:
+m4/snprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+snprintf
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+multiarch
+
+configure.ac:
+gl_FUNC_SNPRINTF_POSIX
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/snprintf-posix-tests b/gnulib/modules/snprintf-posix-tests
new file mode 100644
index 00000000..4448cf52
--- /dev/null
+++ b/gnulib/modules/snprintf-posix-tests
@@ -0,0 +1,20 @@
+Files:
+tests/test-snprintf-posix.c
+tests/test-snprintf-posix.h
+tests/test-snprintf.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+float
+
+configure.ac:
+AC_DEFINE([CHECK_SNPRINTF_POSIX], 1,
+ [Define to 1 for strict checking in test-snprintf.c.])
+
+Makefile.am:
+TESTS += test-snprintf-posix test-snprintf
+check_PROGRAMS += test-snprintf-posix test-snprintf
+
diff --git a/gnulib/modules/snprintf-tests b/gnulib/modules/snprintf-tests
new file mode 100644
index 00000000..df0a3162
--- /dev/null
+++ b/gnulib/modules/snprintf-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-snprintf.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-snprintf
+check_PROGRAMS += test-snprintf
+
diff --git a/gnulib/modules/socket b/gnulib/modules/socket
new file mode 100644
index 00000000..f5daa491
--- /dev/null
+++ b/gnulib/modules/socket
@@ -0,0 +1,38 @@
+Description:
+socket() function: create a socket.
+
+Files:
+lib/socket.c
+lib/w32sock.h
+
+Depends-on:
+sys_socket
+errno
+sockets
+
+configure.ac:
+AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([socket])
+fi
+# When this module is used, sockets may actually occur as file descriptors,
+# hence it is worth warning if the modules 'close' and 'ioctl' are not used.
+m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])])
+m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])])
+AC_REQUIRE([gl_PREREQ_SYS_H_WINSOCK2])
+if test "$ac_cv_header_winsock2_h" = yes; then
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1
+fi
+gl_SYS_SOCKET_MODULE_INDICATOR([socket])
+
+Makefile.am:
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paolo Bonzini, Simon Josefsson
diff --git a/gnulib/modules/sockets b/gnulib/modules/sockets
new file mode 100644
index 00000000..9e03ac68
--- /dev/null
+++ b/gnulib/modules/sockets
@@ -0,0 +1,30 @@
+Description:
+General facilities for using sockets
+
+Files:
+lib/sockets.c
+lib/sockets.h
+lib/w32sock.h
+m4/sockets.m4
+
+Depends-on:
+sys_socket
+close-hook
+
+configure.ac:
+gl_SOCKETS
+
+Makefile.am:
+lib_SOURCES += sockets.h sockets.c
+
+Include:
+"sockets.h"
+
+Link:
+$(LIBSOCKET)
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/sockets-tests b/gnulib/modules/sockets-tests
new file mode 100644
index 00000000..22524e4d
--- /dev/null
+++ b/gnulib/modules/sockets-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-sockets.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sockets
+check_PROGRAMS += test-sockets
+test_sockets_LDADD = $(LDADD) @LIBSOCKET@
diff --git a/gnulib/modules/socklen b/gnulib/modules/socklen
new file mode 100644
index 00000000..4986f10e
--- /dev/null
+++ b/gnulib/modules/socklen
@@ -0,0 +1,23 @@
+Description:
+Declare socklen_t in config.h if the system doesn't have it.
+
+Files:
+m4/socklen.m4
+
+Depends-on:
+sys_socket
+
+configure.ac:
+gl_TYPE_SOCKLEN_T
+
+Makefile.am:
+
+Include:
+<sys/types.h>
+<sys/socket.h>
+
+License:
+unlimited
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/spawn b/gnulib/modules/spawn
new file mode 100644
index 00000000..f92f1fb4
--- /dev/null
+++ b/gnulib/modules/spawn
@@ -0,0 +1,69 @@
+Description:
+A POSIX compliant <spawn.h>.
+
+Files:
+lib/spawn.in.h
+m4/spawn_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+sched
+warn-on-use
+
+configure.ac:
+gl_SPAWN_H
+
+Makefile.am:
+BUILT_SOURCES += spawn.h
+
+# We need the following in order to create a replacement for <spawn.h> when
+# the system doesn't have one.
+spawn.h: spawn.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SPAWN_H''@|$(HAVE_SPAWN_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SPAWN_H''@|$(NEXT_SPAWN_H)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWN''@|$(GNULIB_POSIX_SPAWN)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNP''@|$(GNULIB_POSIX_SPAWNP)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_INIT''@|$(GNULIB_POSIX_SPAWNATTR_INIT)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_GETFLAGS''@|$(GNULIB_POSIX_SPAWNATTR_GETFLAGS)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_SETFLAGS''@|$(GNULIB_POSIX_SPAWNATTR_SETFLAGS)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_GETPGROUP''@|$(GNULIB_POSIX_SPAWNATTR_GETPGROUP)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_SETPGROUP''@|$(GNULIB_POSIX_SPAWNATTR_SETPGROUP)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM''@|$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM''@|$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY''@|$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY''@|$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT''@|$(GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT''@|$(GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_GETSIGMASK''@|$(GNULIB_POSIX_SPAWNATTR_GETSIGMASK)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_SETSIGMASK''@|$(GNULIB_POSIX_SPAWNATTR_SETSIGMASK)|g' \
+ -e 's|@''GNULIB_POSIX_SPAWNATTR_DESTROY''@|$(GNULIB_POSIX_SPAWNATTR_DESTROY)|g' \
+ -e 's|@''HAVE_POSIX_SPAWN''@|$(HAVE_POSIX_SPAWN)|g' \
+ -e 's|@''HAVE_POSIX_SPAWNATTR_T''@|$(HAVE_POSIX_SPAWNATTR_T)|g' \
+ -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_T''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_T)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN''@|$(REPLACE_POSIX_SPAWN)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/spawn.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += spawn.h spawn.h-t
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/spawn-tests b/gnulib/modules/spawn-tests
new file mode 100644
index 00000000..c576fdd3
--- /dev/null
+++ b/gnulib/modules/spawn-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-spawn.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-spawn
+check_PROGRAMS += test-spawn
diff --git a/gnulib/modules/sprintf-posix b/gnulib/modules/sprintf-posix
new file mode 100644
index 00000000..e432bd88
--- /dev/null
+++ b/gnulib/modules/sprintf-posix
@@ -0,0 +1,40 @@
+Description:
+POSIX compatible sprintf() function: print formatted output to a string
+
+Files:
+lib/sprintf.c
+m4/sprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+stdio
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+stdint
+errno
+multiarch
+
+configure.ac:
+gl_FUNC_SPRINTF_POSIX
+gl_STDIO_MODULE_INDICATOR([sprintf-posix])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/sprintf-posix-tests b/gnulib/modules/sprintf-posix-tests
new file mode 100644
index 00000000..f6e4ce0f
--- /dev/null
+++ b/gnulib/modules/sprintf-posix-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-sprintf-posix.c
+tests/test-sprintf-posix.h
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sprintf-posix
+check_PROGRAMS += test-sprintf-posix
+
diff --git a/gnulib/modules/sqrt b/gnulib/modules/sqrt
new file mode 100644
index 00000000..bceda3d8
--- /dev/null
+++ b/gnulib/modules/sqrt
@@ -0,0 +1,25 @@
+Description:
+sqrt() function: square root.
+
+Files:
+m4/sqrt.m4
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_SQRT
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(SQRT_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/sqrt-tests b/gnulib/modules/sqrt-tests
new file mode 100644
index 00000000..86d81761
--- /dev/null
+++ b/gnulib/modules/sqrt-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-sqrt.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sqrt
+check_PROGRAMS += test-sqrt
+test_sqrt_LDADD = $(LDADD) @SQRT_LIBM@
diff --git a/gnulib/modules/sqrtl b/gnulib/modules/sqrtl
new file mode 100644
index 00000000..d4886665
--- /dev/null
+++ b/gnulib/modules/sqrtl
@@ -0,0 +1,33 @@
+Description:
+sqrtl() function: square root with long double argument.
+
+Files:
+lib/sqrtl.c
+m4/sqrtl.m4
+
+Depends-on:
+math
+extensions
+float
+isnanl
+frexpl
+ldexpl
+sqrt
+
+configure.ac:
+gl_FUNC_SQRTL
+gl_MATH_MODULE_INDICATOR([sqrtl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(SQRTL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/sqrtl-tests b/gnulib/modules/sqrtl-tests
new file mode 100644
index 00000000..eab018b7
--- /dev/null
+++ b/gnulib/modules/sqrtl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-sqrtl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sqrtl
+check_PROGRAMS += test-sqrtl
+test_sqrtl_LDADD = $(LDADD) @SQRTL_LIBM@
diff --git a/gnulib/modules/ssize_t b/gnulib/modules/ssize_t
new file mode 100644
index 00000000..64c880b4
--- /dev/null
+++ b/gnulib/modules/ssize_t
@@ -0,0 +1,21 @@
+Description:
+Define ssize_t if it does not already exist.
+
+Files:
+m4/ssize_t.m4
+
+Depends-on:
+
+configure.ac:
+gt_TYPE_SSIZE_T
+
+Makefile.am:
+
+Include:
+<sys/types.h>
+
+License:
+unlimited
+
+Maintainer:
+all
diff --git a/gnulib/modules/stat b/gnulib/modules/stat
new file mode 100644
index 00000000..9729b849
--- /dev/null
+++ b/gnulib/modules/stat
@@ -0,0 +1,26 @@
+Description:
+stat(): query file information
+
+Files:
+lib/stat.c
+m4/dos.m4
+m4/stat.m4
+
+Depends-on:
+stdbool
+sys_stat
+
+configure.ac:
+gl_FUNC_STAT
+gl_SYS_STAT_MODULE_INDICATOR([stat])
+
+Makefile.am:
+
+Include:
+<sys/stat.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/stat-macros b/gnulib/modules/stat-macros
new file mode 100644
index 00000000..d9a331c6
--- /dev/null
+++ b/gnulib/modules/stat-macros
@@ -0,0 +1,20 @@
+Description:
+stat-related macros
+
+Files:
+lib/stat-macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"stat-macros.h"
+
+License:
+GPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/stat-tests b/gnulib/modules/stat-tests
new file mode 100644
index 00000000..74d558c8
--- /dev/null
+++ b/gnulib/modules/stat-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-stat.h
+tests/test-stat.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+pathmax
+same-inode
+stdbool
+symlink
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-stat
+check_PROGRAMS += test-stat
diff --git a/gnulib/modules/stat-time b/gnulib/modules/stat-time
new file mode 100644
index 00000000..5228919c
--- /dev/null
+++ b/gnulib/modules/stat-time
@@ -0,0 +1,25 @@
+Description:
+stat-related time functions
+
+Files:
+lib/stat-time.h
+m4/stat-time.m4
+
+Depends-on:
+time
+extensions
+
+configure.ac:
+gl_STAT_TIME
+gl_STAT_BIRTHTIME
+
+Makefile.am:
+
+Include:
+"stat-time.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert and Jim Meyering
diff --git a/gnulib/modules/stat-time-tests b/gnulib/modules/stat-time-tests
new file mode 100644
index 00000000..2e72444b
--- /dev/null
+++ b/gnulib/modules/stat-time-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-stat-time.c
+tests/macros.h
+
+Depends-on:
+time
+usleep
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-stat-time
+check_PROGRAMS += test-stat-time
diff --git a/gnulib/modules/stdarg b/gnulib/modules/stdarg
new file mode 100644
index 00000000..89e880c1
--- /dev/null
+++ b/gnulib/modules/stdarg
@@ -0,0 +1,44 @@
+Description:
+An <stdarg.h> that conforms to C99.
+
+Files:
+lib/stdarg.in.h
+m4/stdarg.m4
+
+Depends-on:
+include_next
+
+configure.ac-early:
+dnl Some compilers (e.g., AIX 5.3 cc) need to be in c99 mode
+dnl for the builtin va_copy to work. With Autoconf 2.60 or later,
+dnl AC_PROG_CC_STDC arranges for this. With older Autoconf AC_PROG_CC_STDC
+dnl shouldn't hurt, though installers are on their own to set c99 mode.
+AC_REQUIRE([AC_PROG_CC_STDC])
+
+configure.ac:
+gl_STDARG_H
+
+Makefile.am:
+BUILT_SOURCES += $(STDARG_H)
+
+# We need the following in order to create <stdarg.h> when the system
+# doesn't have one that works with the given compiler.
+stdarg.h: stdarg.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_STDARG_H''@|$(NEXT_STDARG_H)|g' \
+ < $(srcdir)/stdarg.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += stdarg.h stdarg.h-t
+
+Include:
+<stdarg.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/stdbool b/gnulib/modules/stdbool
new file mode 100644
index 00000000..80fe2db8
--- /dev/null
+++ b/gnulib/modules/stdbool
@@ -0,0 +1,34 @@
+Description:
+An <stdbool.h> that nearly conforms to C99.
+(Nearly: casts to bool may not work.)
+
+Files:
+lib/stdbool.in.h
+m4/stdbool.m4
+
+Depends-on:
+
+configure.ac:
+AM_STDBOOL_H
+
+Makefile.am:
+BUILT_SOURCES += $(STDBOOL_H)
+
+# We need the following in order to create <stdbool.h> when the system
+# doesn't have one that works.
+stdbool.h: stdbool.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += stdbool.h stdbool.h-t
+
+Include:
+<stdbool.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/stdbool-tests b/gnulib/modules/stdbool-tests
new file mode 100644
index 00000000..6905dfbe
--- /dev/null
+++ b/gnulib/modules/stdbool-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-stdbool.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-stdbool
+check_PROGRAMS += test-stdbool
diff --git a/gnulib/modules/stddef b/gnulib/modules/stddef
new file mode 100644
index 00000000..a6175c27
--- /dev/null
+++ b/gnulib/modules/stddef
@@ -0,0 +1,40 @@
+Description:
+A <stddef.h> that works around platform issues.
+
+Files:
+lib/stddef.in.h
+m4/stddef_h.m4
+m4/wchar_t.m4
+
+Depends-on:
+include_next
+
+configure.ac:
+gl_STDDEF_H
+
+Makefile.am:
+BUILT_SOURCES += $(STDDEF_H)
+
+# We need the following in order to create <stddef.h> when the system
+# doesn't have one that works with the given compiler.
+stddef.h: stddef.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
+ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
+ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
+ < $(srcdir)/stddef.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += stddef.h stddef.h-t
+
+Include:
+<stddef.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/stddef-tests b/gnulib/modules/stddef-tests
new file mode 100644
index 00000000..622ece50
--- /dev/null
+++ b/gnulib/modules/stddef-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-stddef.c
+
+Depends-on:
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-stddef
+check_PROGRAMS += test-stddef
diff --git a/gnulib/modules/stdint b/gnulib/modules/stdint
new file mode 100644
index 00000000..dd01df1e
--- /dev/null
+++ b/gnulib/modules/stdint
@@ -0,0 +1,66 @@
+Description:
+A <stdint.h> that nearly conforms to C99.
+Assumes typical host with 8-bit bytes, two's complement
+representation, and no padding or trap representations, with int
+widths equal to 8, 16, 32, and 64 bits. {uint,int}_fast{8,16,32,64}_t
+may not correspond to the fastest types available on the system.
+Macros are used instead of typedefs.
+
+Files:
+lib/stdint.in.h
+m4/stdint.m4
+m4/longlong.m4
+
+Depends-on:
+include_next
+multiarch
+wchar
+
+configure.ac:
+gl_STDINT_H
+
+Makefile.am:
+BUILT_SOURCES += $(STDINT_H)
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+stdint.h: stdint.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \
+ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \
+ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
+ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
+ -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
+ -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \
+ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
+ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \
+ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \
+ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \
+ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \
+ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \
+ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
+ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
+ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
+ < $(srcdir)/stdint.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += stdint.h stdint.h-t
+
+Include:
+<stdint.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/stdint-tests b/gnulib/modules/stdint-tests
new file mode 100644
index 00000000..ad320b22
--- /dev/null
+++ b/gnulib/modules/stdint-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-stdint.c
+m4/wchar_t.m4
+m4/wint_t.m4
+
+Depends-on:
+verify
+intprops
+
+configure.ac:
+gt_TYPE_WCHAR_T
+gt_TYPE_WINT_T
+
+Makefile.am:
+TESTS += test-stdint
+check_PROGRAMS += test-stdint
diff --git a/gnulib/modules/stdio b/gnulib/modules/stdio
new file mode 100644
index 00000000..189c2c22
--- /dev/null
+++ b/gnulib/modules/stdio
@@ -0,0 +1,123 @@
+Description:
+A GNU-like <stdio.h>.
+
+Files:
+lib/stdio.in.h
+lib/stdio-write.c
+m4/stdio_h.m4
+
+Depends-on:
+include_next
+arg-nonnull
+raise
+stddef
+warn-on-use
+
+configure.ac:
+gl_STDIO_H
+
+Makefile.am:
+BUILT_SOURCES += stdio.h
+
+# We need the following in order to create <stdio.h> when the system
+# doesn't have one that works with the given compiler.
+stdio.h: stdio.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
+ -e 's|@''GNULIB_DPRINTF''@|$(GNULIB_DPRINTF)|g' \
+ -e 's|@''GNULIB_FCLOSE''@|$(GNULIB_FCLOSE)|g' \
+ -e 's|@''GNULIB_FFLUSH''@|$(GNULIB_FFLUSH)|g' \
+ -e 's|@''GNULIB_FOPEN''@|$(GNULIB_FOPEN)|g' \
+ -e 's|@''GNULIB_FPRINTF''@|$(GNULIB_FPRINTF)|g' \
+ -e 's|@''GNULIB_FPRINTF_POSIX''@|$(GNULIB_FPRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_FPURGE''@|$(GNULIB_FPURGE)|g' \
+ -e 's|@''GNULIB_FPUTC''@|$(GNULIB_FPUTC)|g' \
+ -e 's|@''GNULIB_FPUTS''@|$(GNULIB_FPUTS)|g' \
+ -e 's|@''GNULIB_FREOPEN''@|$(GNULIB_FREOPEN)|g' \
+ -e 's|@''GNULIB_FSEEK''@|$(GNULIB_FSEEK)|g' \
+ -e 's|@''GNULIB_FSEEKO''@|$(GNULIB_FSEEKO)|g' \
+ -e 's|@''GNULIB_FTELL''@|$(GNULIB_FTELL)|g' \
+ -e 's|@''GNULIB_FTELLO''@|$(GNULIB_FTELLO)|g' \
+ -e 's|@''GNULIB_FWRITE''@|$(GNULIB_FWRITE)|g' \
+ -e 's|@''GNULIB_GETDELIM''@|$(GNULIB_GETDELIM)|g' \
+ -e 's|@''GNULIB_GETLINE''@|$(GNULIB_GETLINE)|g' \
+ -e 's|@''GNULIB_OBSTACK_PRINTF''@|$(GNULIB_OBSTACK_PRINTF)|g' \
+ -e 's|@''GNULIB_OBSTACK_PRINTF_POSIX''@|$(GNULIB_OBSTACK_PRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_PERROR''@|$(GNULIB_PERROR)|g' \
+ -e 's|@''GNULIB_POPEN''@|$(GNULIB_POPEN)|g' \
+ -e 's|@''GNULIB_PRINTF''@|$(GNULIB_PRINTF)|g' \
+ -e 's|@''GNULIB_PRINTF_POSIX''@|$(GNULIB_PRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_PUTC''@|$(GNULIB_PUTC)|g' \
+ -e 's|@''GNULIB_PUTCHAR''@|$(GNULIB_PUTCHAR)|g' \
+ -e 's|@''GNULIB_PUTS''@|$(GNULIB_PUTS)|g' \
+ -e 's|@''GNULIB_REMOVE''@|$(GNULIB_REMOVE)|g' \
+ -e 's|@''GNULIB_RENAME''@|$(GNULIB_RENAME)|g' \
+ -e 's|@''GNULIB_RENAMEAT''@|$(GNULIB_RENAMEAT)|g' \
+ -e 's|@''GNULIB_SNPRINTF''@|$(GNULIB_SNPRINTF)|g' \
+ -e 's|@''GNULIB_SPRINTF_POSIX''@|$(GNULIB_SPRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_STDIO_H_SIGPIPE''@|$(GNULIB_STDIO_H_SIGPIPE)|g' \
+ -e 's|@''GNULIB_VASPRINTF''@|$(GNULIB_VASPRINTF)|g' \
+ -e 's|@''GNULIB_VDPRINTF''@|$(GNULIB_VDPRINTF)|g' \
+ -e 's|@''GNULIB_VFPRINTF''@|$(GNULIB_VFPRINTF)|g' \
+ -e 's|@''GNULIB_VFPRINTF_POSIX''@|$(GNULIB_VFPRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_VPRINTF''@|$(GNULIB_VPRINTF)|g' \
+ -e 's|@''GNULIB_VPRINTF_POSIX''@|$(GNULIB_VPRINTF_POSIX)|g' \
+ -e 's|@''GNULIB_VSNPRINTF''@|$(GNULIB_VSNPRINTF)|g' \
+ -e 's|@''GNULIB_VSPRINTF_POSIX''@|$(GNULIB_VSPRINTF_POSIX)|g' \
+ < $(srcdir)/stdio.in.h | \
+ sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
+ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
+ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \
+ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \
+ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \
+ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \
+ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \
+ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \
+ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \
+ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \
+ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \
+ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \
+ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \
+ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \
+ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \
+ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \
+ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \
+ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \
+ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \
+ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += stdio.h stdio.h-t
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/stdio-tests b/gnulib/modules/stdio-tests
new file mode 100644
index 00000000..f8433c79
--- /dev/null
+++ b/gnulib/modules/stdio-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-stdio.c
+
+Depends-on:
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-stdio
+check_PROGRAMS += test-stdio
diff --git a/gnulib/modules/stdlib b/gnulib/modules/stdlib
new file mode 100644
index 00000000..93234588
--- /dev/null
+++ b/gnulib/modules/stdlib
@@ -0,0 +1,94 @@
+Description:
+A GNU-like <stdlib.h>.
+
+Files:
+lib/stdlib.in.h
+m4/stdlib_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+stddef
+stdint
+unistd
+warn-on-use
+
+configure.ac:
+gl_STDLIB_H
+
+Makefile.am:
+BUILT_SOURCES += stdlib.h
+
+# We need the following in order to create <stdlib.h> when the system
+# doesn't have one that works with the given compiler.
+stdlib.h: stdlib.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
+ -e 's|@''GNULIB_ATOLL''@|$(GNULIB_ATOLL)|g' \
+ -e 's|@''GNULIB_CALLOC_POSIX''@|$(GNULIB_CALLOC_POSIX)|g' \
+ -e 's|@''GNULIB_CANONICALIZE_FILE_NAME''@|$(GNULIB_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''GNULIB_GETLOADAVG''@|$(GNULIB_GETLOADAVG)|g' \
+ -e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \
+ -e 's|@''GNULIB_MALLOC_POSIX''@|$(GNULIB_MALLOC_POSIX)|g' \
+ -e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \
+ -e 's|@''GNULIB_MKOSTEMP''@|$(GNULIB_MKOSTEMP)|g' \
+ -e 's|@''GNULIB_MKOSTEMPS''@|$(GNULIB_MKOSTEMPS)|g' \
+ -e 's|@''GNULIB_MKSTEMP''@|$(GNULIB_MKSTEMP)|g' \
+ -e 's|@''GNULIB_MKSTEMPS''@|$(GNULIB_MKSTEMPS)|g' \
+ -e 's|@''GNULIB_PUTENV''@|$(GNULIB_PUTENV)|g' \
+ -e 's|@''GNULIB_RANDOM_R''@|$(GNULIB_RANDOM_R)|g' \
+ -e 's|@''GNULIB_REALLOC_POSIX''@|$(GNULIB_REALLOC_POSIX)|g' \
+ -e 's|@''GNULIB_REALPATH''@|$(GNULIB_REALPATH)|g' \
+ -e 's|@''GNULIB_RPMATCH''@|$(GNULIB_RPMATCH)|g' \
+ -e 's|@''GNULIB_SETENV''@|$(GNULIB_SETENV)|g' \
+ -e 's|@''GNULIB_STRTOD''@|$(GNULIB_STRTOD)|g' \
+ -e 's|@''GNULIB_STRTOLL''@|$(GNULIB_STRTOLL)|g' \
+ -e 's|@''GNULIB_STRTOULL''@|$(GNULIB_STRTOULL)|g' \
+ -e 's|@''GNULIB_UNSETENV''@|$(GNULIB_UNSETENV)|g' \
+ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
+ -e 's|@''HAVE_CALLOC_POSIX''@|$(HAVE_CALLOC_POSIX)|g' \
+ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+ -e 's|@''HAVE_MALLOC_POSIX''@|$(HAVE_MALLOC_POSIX)|g' \
+ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
+ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
+ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
+ -e 's|@''HAVE_REALLOC_POSIX''@|$(HAVE_REALLOC_POSIX)|g' \
+ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
+ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
+ -e 's|@''HAVE_SETENV''@|$(HAVE_SETENV)|g' \
+ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
+ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
+ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
+ -e 's|@''HAVE_UNSETENV''@|$(HAVE_UNSETENV)|g' \
+ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
+ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
+ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
+ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/stdlib.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += stdlib.h stdlib.h-t
+
+Include:
+<stdlib.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/stdlib-safer b/gnulib/modules/stdlib-safer
new file mode 100644
index 00000000..43e6a2db
--- /dev/null
+++ b/gnulib/modules/stdlib-safer
@@ -0,0 +1,29 @@
+Description:
+File stream functions that avoid clobbering std{in,out,err}.
+
+Files:
+lib/stdlib--.h
+lib/stdlib-safer.h
+lib/mkstemp-safer.c
+m4/stdlib-safer.m4
+
+Depends-on:
+fd-safer-flag
+mkstemp
+stdlib
+unistd-safer
+
+configure.ac:
+gl_STDLIB_SAFER
+gl_MODULE_INDICATOR([stdlib-safer])
+
+Makefile.am:
+
+Include:
+"stdlib-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/stdlib-tests b/gnulib/modules/stdlib-tests
new file mode 100644
index 00000000..a47cba98
--- /dev/null
+++ b/gnulib/modules/stdlib-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-stdlib.c
+
+Depends-on:
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-stdlib
+check_PROGRAMS += test-stdlib
diff --git a/gnulib/modules/stpcpy b/gnulib/modules/stpcpy
new file mode 100644
index 00000000..3d00faf4
--- /dev/null
+++ b/gnulib/modules/stpcpy
@@ -0,0 +1,25 @@
+Description:
+stpcpy() function: copy a string, returning a pointer to its end.
+
+Files:
+lib/stpcpy.c
+m4/stpcpy.m4
+
+Depends-on:
+extensions
+string
+
+configure.ac:
+gl_FUNC_STPCPY
+gl_STRING_MODULE_INDICATOR([stpcpy])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible, glibc
diff --git a/gnulib/modules/stpncpy b/gnulib/modules/stpncpy
new file mode 100644
index 00000000..ccbd2537
--- /dev/null
+++ b/gnulib/modules/stpncpy
@@ -0,0 +1,25 @@
+Description:
+stpncpy() function: copy a size-bounded string, returning a pointer to its end.
+
+Files:
+lib/stpncpy.c
+m4/stpncpy.m4
+
+Depends-on:
+extensions
+string
+
+configure.ac:
+gl_FUNC_STPNCPY
+gl_STRING_MODULE_INDICATOR([stpncpy])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible, glibc
diff --git a/gnulib/modules/strcase b/gnulib/modules/strcase
new file mode 100644
index 00000000..0023f467
--- /dev/null
+++ b/gnulib/modules/strcase
@@ -0,0 +1,24 @@
+Description:
+Case-insensitive string comparison functions.
+
+Files:
+lib/strcasecmp.c
+lib/strncasecmp.c
+m4/strcase.m4
+
+Depends-on:
+strings
+
+configure.ac:
+gl_STRCASE
+
+Makefile.am:
+
+Include:
+<strings.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/strcasestr b/gnulib/modules/strcasestr
new file mode 100644
index 00000000..ea0ed1cc
--- /dev/null
+++ b/gnulib/modules/strcasestr
@@ -0,0 +1,22 @@
+Description:
+strcasestr() function: efficient case-insensitive search for unibyte substring.
+
+Files:
+
+Depends-on:
+strcasestr-simple
+
+configure.ac:
+gl_FUNC_STRCASESTR
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/strcasestr-simple b/gnulib/modules/strcasestr-simple
new file mode 100644
index 00000000..0f6c6922
--- /dev/null
+++ b/gnulib/modules/strcasestr-simple
@@ -0,0 +1,31 @@
+Description:
+strcasestr() function: case-insensitive search for unibyte substring.
+
+Files:
+lib/strcasestr.c
+lib/str-two-way.h
+m4/strcasestr.m4
+
+Depends-on:
+string
+stdbool
+strcase
+memchr
+memcmp
+extensions
+
+configure.ac:
+gl_FUNC_STRCASESTR_SIMPLE
+gl_STRING_MODULE_INDICATOR([strcasestr])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/strcasestr-tests b/gnulib/modules/strcasestr-tests
new file mode 100644
index 00000000..78b64cd1
--- /dev/null
+++ b/gnulib/modules/strcasestr-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-strcasestr.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-strcasestr
+check_PROGRAMS += test-strcasestr
+
diff --git a/gnulib/modules/strchrnul b/gnulib/modules/strchrnul
new file mode 100644
index 00000000..8ae3ea6f
--- /dev/null
+++ b/gnulib/modules/strchrnul
@@ -0,0 +1,28 @@
+Description:
+strchrnul() function: Find the first occurrence of C in S or the final NUL
+byte.
+
+Files:
+lib/strchrnul.c
+lib/strchrnul.valgrind
+m4/strchrnul.m4
+
+Depends-on:
+extensions
+string
+rawmemchr
+
+configure.ac:
+gl_FUNC_STRCHRNUL
+gl_STRING_MODULE_INDICATOR([strchrnul])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake, glibc
diff --git a/gnulib/modules/strchrnul-tests b/gnulib/modules/strchrnul-tests
new file mode 100644
index 00000000..e16518d6
--- /dev/null
+++ b/gnulib/modules/strchrnul-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-strchrnul.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-strchrnul
+check_PROGRAMS += test-strchrnul
diff --git a/gnulib/modules/strcspn b/gnulib/modules/strcspn
new file mode 100644
index 00000000..5d2be924
--- /dev/null
+++ b/gnulib/modules/strcspn
@@ -0,0 +1,29 @@
+Description:
+strcspn() function: search a string for any of a set of characters.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/strcspn.c
+m4/strcspn.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_STRCSPN
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+
diff --git a/gnulib/modules/strdup b/gnulib/modules/strdup
new file mode 100644
index 00000000..8da96a23
--- /dev/null
+++ b/gnulib/modules/strdup
@@ -0,0 +1,30 @@
+Description:
+strdup() function: duplicate a string.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete. But you may want to use the strdup-posix module.
+
+Files:
+lib/strdup.c
+m4/strdup.m4
+
+Depends-on:
+string
+
+configure.ac:
+gl_FUNC_STRDUP
+gl_STRING_MODULE_INDICATOR([strdup])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/strdup-posix b/gnulib/modules/strdup-posix
new file mode 100644
index 00000000..4a474881
--- /dev/null
+++ b/gnulib/modules/strdup-posix
@@ -0,0 +1,25 @@
+Description:
+strdup() function: duplicate a string.
+
+Files:
+lib/strdup.c
+m4/strdup.m4
+
+Depends-on:
+string
+malloc-posix
+
+configure.ac:
+gl_FUNC_STRDUP_POSIX
+gl_STRING_MODULE_INDICATOR([strdup])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/streq b/gnulib/modules/streq
new file mode 100644
index 00000000..75d2a045
--- /dev/null
+++ b/gnulib/modules/streq
@@ -0,0 +1,21 @@
+Description:
+Optimized string comparison.
+
+Files:
+lib/streq.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"streq.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/strerror b/gnulib/modules/strerror
new file mode 100644
index 00000000..1a204fa0
--- /dev/null
+++ b/gnulib/modules/strerror
@@ -0,0 +1,26 @@
+Description:
+strerror() function: return string describing error code.
+
+Files:
+lib/strerror.c
+m4/strerror.m4
+
+Depends-on:
+errno
+intprops
+string
+
+configure.ac:
+gl_FUNC_STRERROR
+gl_STRING_MODULE_INDICATOR([strerror])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/strerror-tests b/gnulib/modules/strerror-tests
new file mode 100644
index 00000000..14e96949
--- /dev/null
+++ b/gnulib/modules/strerror-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-strerror.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-strerror
+check_PROGRAMS += test-strerror
diff --git a/gnulib/modules/strftime b/gnulib/modules/strftime
new file mode 100644
index 00000000..dc539160
--- /dev/null
+++ b/gnulib/modules/strftime
@@ -0,0 +1,31 @@
+Description:
+nstrftime() function: convert date and time to string, with GNU extensions.
+
+Files:
+lib/strftime.h
+lib/strftime.c
+m4/mbstate_t.m4
+m4/tm_gmtoff.m4
+m4/strftime.m4
+
+Depends-on:
+extensions
+mbrlen
+mbsinit
+stdbool
+time_r
+wchar
+
+configure.ac:
+gl_FUNC_GNU_STRFTIME
+
+Makefile.am:
+
+Include:
+"strftime.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/striconv b/gnulib/modules/striconv
new file mode 100644
index 00000000..a411248e
--- /dev/null
+++ b/gnulib/modules/striconv
@@ -0,0 +1,37 @@
+Description:
+Character set conversion of strings made easy, uses iconv.
+
+Files:
+lib/striconv.h
+lib/striconv.c
+
+Depends-on:
+iconv
+iconv_open
+strdup
+c-strcase
+
+configure.ac:
+if test $gl_cond_libtool = false; then
+ gl_ltlibdeps="$gl_ltlibdeps $LTLIBICONV"
+ gl_libdeps="$gl_libdeps $LIBICONV"
+fi
+
+Makefile.am:
+lib_SOURCES += striconv.h striconv.c
+if GL_COND_LIBTOOL
+lib_LDFLAGS += $(LTLIBICONV)
+endif
+
+Include:
+"striconv.h"
+
+Link:
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible, Simon Josefsson
+
diff --git a/gnulib/modules/striconv-tests b/gnulib/modules/striconv-tests
new file mode 100644
index 00000000..d4482f8e
--- /dev/null
+++ b/gnulib/modules/striconv-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-striconv.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-striconv
+check_PROGRAMS += test-striconv
+test_striconv_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/striconveh b/gnulib/modules/striconveh
new file mode 100644
index 00000000..8bdfb340
--- /dev/null
+++ b/gnulib/modules/striconveh
@@ -0,0 +1,46 @@
+Description:
+Character set conversion of strings with error handling, uses iconv.
+
+Files:
+lib/striconveh.h
+lib/striconveh.c
+lib/iconveh.h
+
+Depends-on:
+stdbool
+iconv
+iconv_open
+unistr/u8-prev
+unistr/u8-mbtouc-unsafe
+unistr/u8-mbtouc
+unistr/u8-mbtoucr
+unistr/u8-uctomb
+strdup
+c-strcase
+c-strcaseeq
+memmove
+
+configure.ac:
+if test $gl_cond_libtool = false; then
+ gl_ltlibdeps="$gl_ltlibdeps $LTLIBICONV"
+ gl_libdeps="$gl_libdeps $LIBICONV"
+fi
+
+Makefile.am:
+lib_SOURCES += striconveh.h striconveh.c
+if GL_COND_LIBTOOL
+lib_LDFLAGS += $(LTLIBICONV)
+endif
+
+Include:
+"striconveh.h"
+
+Link:
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/striconveh-tests b/gnulib/modules/striconveh-tests
new file mode 100644
index 00000000..bfb68efd
--- /dev/null
+++ b/gnulib/modules/striconveh-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-striconveh.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-striconveh
+check_PROGRAMS += test-striconveh
+test_striconveh_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/striconveha b/gnulib/modules/striconveha
new file mode 100644
index 00000000..4867b8c0
--- /dev/null
+++ b/gnulib/modules/striconveha
@@ -0,0 +1,29 @@
+Description:
+Character set conversion of strings with error handling and autodetection,
+uses iconv.
+
+Files:
+lib/striconveha.h
+lib/striconveha.c
+
+Depends-on:
+stdbool
+striconveh
+malloca
+strdup
+c-strcase
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += striconveha.h striconveha.c
+
+Include:
+"striconveha.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/striconveha-tests b/gnulib/modules/striconveha-tests
new file mode 100644
index 00000000..46ad0cf8
--- /dev/null
+++ b/gnulib/modules/striconveha-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-striconveha.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-striconveha
+check_PROGRAMS += test-striconveha
+test_striconveha_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/string b/gnulib/modules/string
new file mode 100644
index 00000000..e4cf6b6b
--- /dev/null
+++ b/gnulib/modules/string
@@ -0,0 +1,105 @@
+Description:
+A GNU-like <string.h>.
+
+Files:
+lib/string.in.h
+m4/string_h.m4
+
+Depends-on:
+arg-nonnull
+extensions
+include_next
+stddef
+warn-on-use
+
+configure.ac:
+gl_HEADER_STRING_H
+
+Makefile.am:
+BUILT_SOURCES += string.h
+
+# We need the following in order to create <string.h> when the system
+# doesn't have one that works with the given compiler.
+string.h: string.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
+ -e 's|@''GNULIB_MBSLEN''@|$(GNULIB_MBSLEN)|g' \
+ -e 's|@''GNULIB_MBSNLEN''@|$(GNULIB_MBSNLEN)|g' \
+ -e 's|@''GNULIB_MBSCHR''@|$(GNULIB_MBSCHR)|g' \
+ -e 's|@''GNULIB_MBSRCHR''@|$(GNULIB_MBSRCHR)|g' \
+ -e 's|@''GNULIB_MBSSTR''@|$(GNULIB_MBSSTR)|g' \
+ -e 's|@''GNULIB_MBSCASECMP''@|$(GNULIB_MBSCASECMP)|g' \
+ -e 's|@''GNULIB_MBSNCASECMP''@|$(GNULIB_MBSNCASECMP)|g' \
+ -e 's|@''GNULIB_MBSPCASECMP''@|$(GNULIB_MBSPCASECMP)|g' \
+ -e 's|@''GNULIB_MBSCASESTR''@|$(GNULIB_MBSCASESTR)|g' \
+ -e 's|@''GNULIB_MBSCSPN''@|$(GNULIB_MBSCSPN)|g' \
+ -e 's|@''GNULIB_MBSPBRK''@|$(GNULIB_MBSPBRK)|g' \
+ -e 's|@''GNULIB_MBSSPN''@|$(GNULIB_MBSSPN)|g' \
+ -e 's|@''GNULIB_MBSSEP''@|$(GNULIB_MBSSEP)|g' \
+ -e 's|@''GNULIB_MBSTOK_R''@|$(GNULIB_MBSTOK_R)|g' \
+ -e 's|@''GNULIB_MEMCHR''@|$(GNULIB_MEMCHR)|g' \
+ -e 's|@''GNULIB_MEMMEM''@|$(GNULIB_MEMMEM)|g' \
+ -e 's|@''GNULIB_MEMPCPY''@|$(GNULIB_MEMPCPY)|g' \
+ -e 's|@''GNULIB_MEMRCHR''@|$(GNULIB_MEMRCHR)|g' \
+ -e 's|@''GNULIB_RAWMEMCHR''@|$(GNULIB_RAWMEMCHR)|g' \
+ -e 's|@''GNULIB_STPCPY''@|$(GNULIB_STPCPY)|g' \
+ -e 's|@''GNULIB_STPNCPY''@|$(GNULIB_STPNCPY)|g' \
+ -e 's|@''GNULIB_STRCHRNUL''@|$(GNULIB_STRCHRNUL)|g' \
+ -e 's|@''GNULIB_STRDUP''@|$(GNULIB_STRDUP)|g' \
+ -e 's|@''GNULIB_STRNDUP''@|$(GNULIB_STRNDUP)|g' \
+ -e 's|@''GNULIB_STRNLEN''@|$(GNULIB_STRNLEN)|g' \
+ -e 's|@''GNULIB_STRPBRK''@|$(GNULIB_STRPBRK)|g' \
+ -e 's|@''GNULIB_STRSEP''@|$(GNULIB_STRSEP)|g' \
+ -e 's|@''GNULIB_STRSTR''@|$(GNULIB_STRSTR)|g' \
+ -e 's|@''GNULIB_STRCASESTR''@|$(GNULIB_STRCASESTR)|g' \
+ -e 's|@''GNULIB_STRTOK_R''@|$(GNULIB_STRTOK_R)|g' \
+ -e 's|@''GNULIB_STRERROR''@|$(GNULIB_STRERROR)|g' \
+ -e 's|@''GNULIB_STRSIGNAL''@|$(GNULIB_STRSIGNAL)|g' \
+ -e 's|@''GNULIB_STRVERSCMP''@|$(GNULIB_STRVERSCMP)|g' \
+ < $(srcdir)/string.in.h | \
+ sed -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
+ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
+ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
+ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
+ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \
+ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \
+ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \
+ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \
+ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \
+ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
+ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
+ -e 's|@''HAVE_DECL_STRERROR''@|$(HAVE_DECL_STRERROR)|g' \
+ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
+ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
+ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \
+ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
+ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \
+ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
+ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
+ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
+ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
+ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ < $(srcdir)/string.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += string.h string.h-t
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/string-tests b/gnulib/modules/string-tests
new file mode 100644
index 00000000..dc55e945
--- /dev/null
+++ b/gnulib/modules/string-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-string.c
+
+Depends-on:
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-string
+check_PROGRAMS += test-string
diff --git a/gnulib/modules/strings b/gnulib/modules/strings
new file mode 100644
index 00000000..37ab9996
--- /dev/null
+++ b/gnulib/modules/strings
@@ -0,0 +1,43 @@
+Description:
+A substitute <strings.h>.
+
+Files:
+lib/strings.in.h
+m4/strings_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+warn-on-use
+
+configure.ac:
+gl_HEADER_STRINGS_H
+
+Makefile.am:
+BUILT_SOURCES += strings.h
+
+# We need the following in order to create <strings.h> when the system
+# doesn't have one that works with the given compiler.
+strings.h: strings.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \
+ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
+ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/strings.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += strings.h strings.h-t
+
+Include:
+<strings.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/strings-tests b/gnulib/modules/strings-tests
new file mode 100644
index 00000000..b414a128
--- /dev/null
+++ b/gnulib/modules/strings-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-strings.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-strings
+check_PROGRAMS += test-strings
diff --git a/gnulib/modules/strndup b/gnulib/modules/strndup
new file mode 100644
index 00000000..80f143be
--- /dev/null
+++ b/gnulib/modules/strndup
@@ -0,0 +1,26 @@
+Description:
+strndup() function: duplicate a size-bounded string.
+
+Files:
+lib/strndup.c
+m4/strndup.m4
+
+Depends-on:
+extensions
+string
+strnlen
+
+configure.ac:
+gl_FUNC_STRNDUP
+gl_STRING_MODULE_INDICATOR([strndup])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+glibc
diff --git a/gnulib/modules/strnlen b/gnulib/modules/strnlen
new file mode 100644
index 00000000..9f9f2ca2
--- /dev/null
+++ b/gnulib/modules/strnlen
@@ -0,0 +1,26 @@
+Description:
+strnlen() function: determine the length of a size-bounded string.
+
+Files:
+lib/strnlen.c
+m4/strnlen.m4
+
+Depends-on:
+extensions
+string
+memchr
+
+configure.ac:
+gl_FUNC_STRNLEN
+gl_STRING_MODULE_INDICATOR([strnlen])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/strnlen1 b/gnulib/modules/strnlen1
new file mode 100644
index 00000000..a945c73b
--- /dev/null
+++ b/gnulib/modules/strnlen1
@@ -0,0 +1,24 @@
+Description:
+Quick string length estimation.
+
+Files:
+lib/strnlen1.h
+lib/strnlen1.c
+
+Depends-on:
+memchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += strnlen1.h strnlen1.c
+
+Include:
+"strnlen1.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/strpbrk b/gnulib/modules/strpbrk
new file mode 100644
index 00000000..f0f1a858
--- /dev/null
+++ b/gnulib/modules/strpbrk
@@ -0,0 +1,30 @@
+Description:
+strpbrk() function: search a string for any of a set of characters.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete.
+
+Files:
+lib/strpbrk.c
+m4/strpbrk.m4
+
+Depends-on:
+string
+
+configure.ac:
+gl_FUNC_STRPBRK
+gl_STRING_MODULE_INDICATOR([strpbrk])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible, glibc
diff --git a/gnulib/modules/strptime b/gnulib/modules/strptime
new file mode 100644
index 00000000..74570f5a
--- /dev/null
+++ b/gnulib/modules/strptime
@@ -0,0 +1,30 @@
+Description:
+Convert a string representation of time to a tm structure.
+
+Files:
+lib/strptime.c
+m4/strptime.m4
+m4/tm_gmtoff.m4
+
+Depends-on:
+extensions
+sys_time
+string
+strcase
+stdbool
+time
+time_r
+
+configure.ac:
+gl_FUNC_STRPTIME
+
+Makefile.am:
+
+Include:
+<time.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+glibc
diff --git a/gnulib/modules/strsep b/gnulib/modules/strsep
new file mode 100644
index 00000000..10ca817a
--- /dev/null
+++ b/gnulib/modules/strsep
@@ -0,0 +1,26 @@
+Description:
+strsep() function: extract token from string.
+
+Files:
+lib/strsep.c
+m4/strsep.m4
+
+Depends-on:
+extensions
+string
+strpbrk
+
+configure.ac:
+gl_FUNC_STRSEP
+gl_STRING_MODULE_INDICATOR([strsep])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Yoann Vandoorselaere
diff --git a/gnulib/modules/strsignal b/gnulib/modules/strsignal
new file mode 100644
index 00000000..41dda4ec
--- /dev/null
+++ b/gnulib/modules/strsignal
@@ -0,0 +1,31 @@
+Description:
+strsignal() function: return string describing signal.
+
+Files:
+lib/strsignal.c
+lib/siglist.h
+m4/strsignal.m4
+
+Depends-on:
+string
+gettext-h
+lock
+tls
+snprintf
+memset
+extensions
+
+configure.ac:
+gl_FUNC_STRSIGNAL
+gl_STRING_MODULE_INDICATOR([strsignal])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Colin Watson, glibc
diff --git a/gnulib/modules/strsignal-tests b/gnulib/modules/strsignal-tests
new file mode 100644
index 00000000..ab67eb1b
--- /dev/null
+++ b/gnulib/modules/strsignal-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-strsignal.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-strsignal
+check_PROGRAMS += test-strsignal
+test_strsignal_LDADD = $(LDADD) @LIBINTL@ $(LIBTHREAD)
diff --git a/gnulib/modules/strstr b/gnulib/modules/strstr
new file mode 100644
index 00000000..dc33bd29
--- /dev/null
+++ b/gnulib/modules/strstr
@@ -0,0 +1,21 @@
+Description:
+strstr() function: efficiently locate first substring in a buffer.
+
+Files:
+
+Depends-on:
+strstr-simple
+
+configure.ac:
+gl_FUNC_STRSTR
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, Eric Blake
diff --git a/gnulib/modules/strstr-simple b/gnulib/modules/strstr-simple
new file mode 100644
index 00000000..9ebf5dac
--- /dev/null
+++ b/gnulib/modules/strstr-simple
@@ -0,0 +1,28 @@
+Description:
+strstr() function: locate first substring in a buffer.
+
+Files:
+lib/str-two-way.h
+lib/strstr.c
+m4/strstr.m4
+
+Depends-on:
+string
+stdbool
+memchr
+memcmp
+
+configure.ac:
+gl_FUNC_STRSTR_SIMPLE
+gl_STRING_MODULE_INDICATOR([strstr])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, Eric Blake
diff --git a/gnulib/modules/strstr-tests b/gnulib/modules/strstr-tests
new file mode 100644
index 00000000..48171779
--- /dev/null
+++ b/gnulib/modules/strstr-tests
@@ -0,0 +1,20 @@
+Files:
+tests/test-strstr.c
+tests/zerosize-ptr.h
+tests/signature.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-strstr
+check_PROGRAMS += test-strstr
diff --git a/gnulib/modules/strtod b/gnulib/modules/strtod
new file mode 100644
index 00000000..9a4a0f31
--- /dev/null
+++ b/gnulib/modules/strtod
@@ -0,0 +1,30 @@
+Description:
+strtod() function: convert string to 'double'.
+
+Files:
+lib/strtod.c
+m4/strtod.m4
+
+Depends-on:
+c-ctype
+stdbool
+stdlib
+
+configure.ac:
+gl_FUNC_STRTOD
+gl_STDLIB_MODULE_INDICATOR([strtod])
+
+Makefile.am:
+LIBS += $(POW_LIB)
+
+Include:
+<stdlib.h>
+
+Link:
+$(POW_LIB)
+
+License:
+LGPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/strtod-tests b/gnulib/modules/strtod-tests
new file mode 100644
index 00000000..8d5be7f7
--- /dev/null
+++ b/gnulib/modules/strtod-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-strtod.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+float
+isnand-nolibm
+signbit
+
+configure.ac:
+
+Makefile.am:
+LIBS += $(POW_LIB)
+TESTS += test-strtod
+check_PROGRAMS += test-strtod
diff --git a/gnulib/modules/strtoimax b/gnulib/modules/strtoimax
new file mode 100644
index 00000000..9f82af45
--- /dev/null
+++ b/gnulib/modules/strtoimax
@@ -0,0 +1,28 @@
+Description:
+strtoimax() function: convert string to 'intmax_t'.
+
+Files:
+lib/strtoimax.c
+m4/longlong.m4
+m4/strtoimax.m4
+
+Depends-on:
+strtoll
+verify
+inttypes
+stdint
+
+configure.ac:
+gl_FUNC_STRTOIMAX
+gl_INTTYPES_MODULE_INDICATOR([strtoimax])
+
+Makefile.am:
+
+Include:
+<inttypes.h>
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/strtok_r b/gnulib/modules/strtok_r
new file mode 100644
index 00000000..f638baab
--- /dev/null
+++ b/gnulib/modules/strtok_r
@@ -0,0 +1,25 @@
+Description:
+strtok_r() function: split string into tokens, thread safe.
+
+Files:
+lib/strtok_r.c
+m4/strtok_r.m4
+
+Depends-on:
+string
+strpbrk
+
+configure.ac:
+gl_FUNC_STRTOK_R
+gl_STRING_MODULE_INDICATOR([strtok_r])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/strtol b/gnulib/modules/strtol
new file mode 100644
index 00000000..8a313a40
--- /dev/null
+++ b/gnulib/modules/strtol
@@ -0,0 +1,24 @@
+Description:
+strtol() function: convert string to 'long'.
+
+Files:
+lib/strtol.c
+m4/strtol.m4
+
+Depends-on:
+wchar
+
+configure.ac:
+gl_FUNC_STRTOL
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+glibc
+
diff --git a/gnulib/modules/strtoll b/gnulib/modules/strtoll
new file mode 100644
index 00000000..738c9efe
--- /dev/null
+++ b/gnulib/modules/strtoll
@@ -0,0 +1,27 @@
+Description:
+strtoll() function: convert string to 'long long'.
+
+Files:
+lib/strtoll.c
+m4/longlong.m4
+m4/strtoll.m4
+
+Depends-on:
+stdlib
+strtol
+
+configure.ac:
+gl_FUNC_STRTOLL
+gl_STDLIB_MODULE_INDICATOR([strtoll])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+glibc
+
diff --git a/gnulib/modules/strtoul b/gnulib/modules/strtoul
new file mode 100644
index 00000000..8cb6d66c
--- /dev/null
+++ b/gnulib/modules/strtoul
@@ -0,0 +1,24 @@
+Description:
+strtoul() function: convert string to 'unsigned long'.
+
+Files:
+lib/strtoul.c
+m4/strtoul.m4
+
+Depends-on:
+strtol
+
+configure.ac:
+gl_FUNC_STRTOUL
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+glibc
+
diff --git a/gnulib/modules/strtoull b/gnulib/modules/strtoull
new file mode 100644
index 00000000..f02e9b0f
--- /dev/null
+++ b/gnulib/modules/strtoull
@@ -0,0 +1,27 @@
+Description:
+strtoull() function: convert string to 'unsigned long long'.
+
+Files:
+lib/strtoull.c
+m4/longlong.m4
+m4/strtoull.m4
+
+Depends-on:
+stdlib
+strtoul
+
+configure.ac:
+gl_FUNC_STRTOULL
+gl_STDLIB_MODULE_INDICATOR([strtoull])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+glibc
+
diff --git a/gnulib/modules/strtoumax b/gnulib/modules/strtoumax
new file mode 100644
index 00000000..e8862852
--- /dev/null
+++ b/gnulib/modules/strtoumax
@@ -0,0 +1,28 @@
+Description:
+strtoumax() function: convert string to 'uintmax_t'.
+
+Files:
+lib/strtoumax.c
+m4/longlong.m4
+m4/strtoumax.m4
+
+Depends-on:
+strtoimax
+strtoull
+inttypes
+stdint
+
+configure.ac:
+gl_FUNC_STRTOUMAX
+gl_INTTYPES_MODULE_INDICATOR([strtoumax])
+
+Makefile.am:
+
+Include:
+<inttypes.h>
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/strverscmp b/gnulib/modules/strverscmp
new file mode 100644
index 00000000..33822c76
--- /dev/null
+++ b/gnulib/modules/strverscmp
@@ -0,0 +1,25 @@
+Description:
+Compare strings holding version numbers.
+
+Files:
+lib/strverscmp.c
+m4/strverscmp.m4
+
+Depends-on:
+extensions
+string
+
+configure.ac:
+gl_FUNC_STRVERSCMP
+gl_STRING_MODULE_INDICATOR([strverscmp])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Jim Meyering, glibc
diff --git a/gnulib/modules/strverscmp-tests b/gnulib/modules/strverscmp-tests
new file mode 100644
index 00000000..b34b4b05
--- /dev/null
+++ b/gnulib/modules/strverscmp-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-strverscmp.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-strverscmp
+check_PROGRAMS += test-strverscmp
diff --git a/gnulib/modules/sublist b/gnulib/modules/sublist
new file mode 100644
index 00000000..7b0ddcb0
--- /dev/null
+++ b/gnulib/modules/sublist
@@ -0,0 +1,24 @@
+Description:
+Sequential list data type backed by another list.
+
+Files:
+lib/gl_sublist.h
+lib/gl_sublist.c
+
+Depends-on:
+list
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_sublist.h gl_sublist.c
+
+Include:
+"gl_sublist.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/symlink b/gnulib/modules/symlink
new file mode 100644
index 00000000..4276036f
--- /dev/null
+++ b/gnulib/modules/symlink
@@ -0,0 +1,25 @@
+Description:
+symlink(): create a symlink, if possible
+
+Files:
+lib/symlink.c
+m4/symlink.m4
+
+Depends-on:
+lstat
+unistd
+
+configure.ac:
+gl_FUNC_SYMLINK
+gl_UNISTD_MODULE_INDICATOR([symlink])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/symlink-tests b/gnulib/modules/symlink-tests
new file mode 100644
index 00000000..a07074e3
--- /dev/null
+++ b/gnulib/modules/symlink-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-symlink.h
+tests/test-symlink.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-symlink
+check_PROGRAMS += test-symlink
diff --git a/gnulib/modules/symlinkat b/gnulib/modules/symlinkat
new file mode 100644
index 00000000..1a065fdf
--- /dev/null
+++ b/gnulib/modules/symlinkat
@@ -0,0 +1,31 @@
+Description:
+symlinkat() and readlinkat(): manage symlinks relative to a directory
+
+Files:
+lib/symlinkat.c
+m4/symlinkat.m4
+
+Depends-on:
+extensions
+fcntl-h
+openat
+readlink
+symlink
+unistd
+
+configure.ac:
+gl_FUNC_SYMLINKAT
+gl_UNISTD_MODULE_INDICATOR([symlinkat])
+gl_UNISTD_MODULE_INDICATOR([readlinkat])
+
+Makefile.am:
+
+Include:
+<fcntl.h>
+<unistd.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/symlinkat-tests b/gnulib/modules/symlinkat-tests
new file mode 100644
index 00000000..c1678c02
--- /dev/null
+++ b/gnulib/modules/symlinkat-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-readlink.h
+tests/test-symlink.h
+tests/test-symlinkat.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-symlinkat
+check_PROGRAMS += test-symlinkat
+test_symlinkat_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/sys_file b/gnulib/modules/sys_file
new file mode 100644
index 00000000..b08e4189
--- /dev/null
+++ b/gnulib/modules/sys_file
@@ -0,0 +1,45 @@
+Description:
+<sys/file.h> for systems with an incomplete header.
+
+Files:
+lib/sys_file.in.h
+m4/sys_file_h.m4
+
+Depends-on:
+include_next
+warn-on-use
+
+configure.ac:
+gl_HEADER_SYS_FILE_H
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/file.h
+
+# We need the following in order to create <sys/file.h> when the system
+# has one that is incomplete.
+sys/file.h: sys_file.in.h $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_SYS_FILE_H''@/$(HAVE_SYS_FILE_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_FILE_H''@|$(NEXT_SYS_FILE_H)|g' \
+ -e 's/@''HAVE_FLOCK''@/$(HAVE_FLOCK)/g' \
+ -e 's/@''GNULIB_FLOCK''@/$(GNULIB_FLOCK)/g' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_file.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/file.h sys/file.h-t
+MOSTLYCLEANDIRS += sys
+
+Include:
+<sys/file.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/sys_file-tests b/gnulib/modules/sys_file-tests
new file mode 100644
index 00000000..f52629d5
--- /dev/null
+++ b/gnulib/modules/sys_file-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sys_file.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sys_file
+check_PROGRAMS += test-sys_file
diff --git a/gnulib/modules/sys_ioctl b/gnulib/modules/sys_ioctl
new file mode 100644
index 00000000..4e3658d2
--- /dev/null
+++ b/gnulib/modules/sys_ioctl
@@ -0,0 +1,47 @@
+Description:
+A <sys/ioctl.h> for systems with missing declarations.
+
+Files:
+lib/sys_ioctl.in.h
+m4/sys_ioctl_h.m4
+
+Depends-on:
+include_next
+unistd
+warn-on-use
+
+configure.ac:
+gl_SYS_IOCTL_H
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/ioctl.h
+
+# We need the following in order to create <sys/ioctl.h> when the system
+# does not have a complete one.
+sys/ioctl.h: sys_ioctl.in.h $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SYS_IOCTL_H''@|$(HAVE_SYS_IOCTL_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_IOCTL_H''@|$(NEXT_SYS_IOCTL_H)|g' \
+ -e 's|@''GNULIB_IOCTL''@|$(GNULIB_IOCTL)|g' \
+ -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H)|g' \
+ -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_ioctl.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/ioctl.h sys/ioctl.h-t
+MOSTLYCLEANDIRS += sys
+
+Include:
+<sys/ioctl.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/sys_ioctl-tests b/gnulib/modules/sys_ioctl-tests
new file mode 100644
index 00000000..17363a71
--- /dev/null
+++ b/gnulib/modules/sys_ioctl-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sys_ioctl.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sys_ioctl
+check_PROGRAMS += test-sys_ioctl
diff --git a/gnulib/modules/sys_select b/gnulib/modules/sys_select
new file mode 100644
index 00000000..27d9a48c
--- /dev/null
+++ b/gnulib/modules/sys_select
@@ -0,0 +1,48 @@
+Description:
+A <sys/select.h> for systems lacking it.
+
+Files:
+lib/sys_select.in.h
+m4/sys_select_h.m4
+
+Depends-on:
+include_next
+sys_socket
+sys_time
+warn-on-use
+
+configure.ac:
+gl_HEADER_SYS_SELECT
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/select.h
+
+# We need the following in order to create <sys/select.h> when the system
+# doesn't have one that works with the given compiler.
+sys/select.h: sys_select.in.h $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_SELECT_H''@|$(NEXT_SYS_SELECT_H)|g' \
+ -e 's|@''HAVE_SYS_SELECT_H''@|$(HAVE_SYS_SELECT_H)|g' \
+ -e 's|@''GNULIB_SELECT''@|$(GNULIB_SELECT)|g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
+ -e 's|@''REPLACE_SELECT''@|$(REPLACE_SELECT)|g' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_select.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/select.h sys/select.h-t
+MOSTLYCLEANDIRS += sys
+
+Include:
+<sys/select.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/sys_select-tests b/gnulib/modules/sys_select-tests
new file mode 100644
index 00000000..9908e40c
--- /dev/null
+++ b/gnulib/modules/sys_select-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sys_select.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sys_select
+check_PROGRAMS += test-sys_select
diff --git a/gnulib/modules/sys_socket b/gnulib/modules/sys_socket
new file mode 100644
index 00000000..d9cfc866
--- /dev/null
+++ b/gnulib/modules/sys_socket
@@ -0,0 +1,69 @@
+Description:
+A POSIX-like <sys/socket.h>.
+
+Files:
+lib/sys_socket.in.h
+m4/sys_socket_h.m4
+m4/sockpfaf.m4
+
+Depends-on:
+alignof
+arg-nonnull
+errno
+include_next
+warn-on-use
+
+configure.ac:
+gl_HEADER_SYS_SOCKET
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/socket.h
+
+# We need the following in order to create <sys/socket.h> when the system
+# doesn't have one that works with the given compiler.
+sys/socket.h: sys_socket.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_SOCKET_H''@|$(NEXT_SYS_SOCKET_H)|g' \
+ -e 's|@''HAVE_SYS_SOCKET_H''@|$(HAVE_SYS_SOCKET_H)|g' \
+ -e 's|@''GNULIB_CLOSE''@|$(GNULIB_CLOSE)|g' \
+ -e 's|@''GNULIB_SOCKET''@|$(GNULIB_SOCKET)|g' \
+ -e 's|@''GNULIB_CONNECT''@|$(GNULIB_CONNECT)|g' \
+ -e 's|@''GNULIB_ACCEPT''@|$(GNULIB_ACCEPT)|g' \
+ -e 's|@''GNULIB_BIND''@|$(GNULIB_BIND)|g' \
+ -e 's|@''GNULIB_GETPEERNAME''@|$(GNULIB_GETPEERNAME)|g' \
+ -e 's|@''GNULIB_GETSOCKNAME''@|$(GNULIB_GETSOCKNAME)|g' \
+ -e 's|@''GNULIB_GETSOCKOPT''@|$(GNULIB_GETSOCKOPT)|g' \
+ -e 's|@''GNULIB_LISTEN''@|$(GNULIB_LISTEN)|g' \
+ -e 's|@''GNULIB_RECV''@|$(GNULIB_RECV)|g' \
+ -e 's|@''GNULIB_SEND''@|$(GNULIB_SEND)|g' \
+ -e 's|@''GNULIB_RECVFROM''@|$(GNULIB_RECVFROM)|g' \
+ -e 's|@''GNULIB_SENDTO''@|$(GNULIB_SENDTO)|g' \
+ -e 's|@''GNULIB_SETSOCKOPT''@|$(GNULIB_SETSOCKOPT)|g' \
+ -e 's|@''GNULIB_SHUTDOWN''@|$(GNULIB_SHUTDOWN)|g' \
+ -e 's|@''GNULIB_ACCEPT4''@|$(GNULIB_ACCEPT4)|g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
+ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \
+ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \
+ -e 's|@''HAVE_SA_FAMILY_T''@|$(HAVE_SA_FAMILY_T)|g' \
+ -e 's|@''HAVE_ACCEPT4''@|$(HAVE_ACCEPT4)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_socket.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += sys/socket.h sys/socket.h-t
+MOSTLYCLEANDIRS += sys
+
+Include:
+<sys/socket.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/sys_socket-tests b/gnulib/modules/sys_socket-tests
new file mode 100644
index 00000000..7ead3ae0
--- /dev/null
+++ b/gnulib/modules/sys_socket-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-sys_socket.c
+
+Depends-on:
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([shutdown])
+
+Makefile.am:
+TESTS += test-sys_socket
+check_PROGRAMS += test-sys_socket
diff --git a/gnulib/modules/sys_stat b/gnulib/modules/sys_stat
new file mode 100644
index 00000000..f349e133
--- /dev/null
+++ b/gnulib/modules/sys_stat
@@ -0,0 +1,78 @@
+Description:
+A <sys/stat.h> for systems with missing declarations.
+
+Files:
+lib/sys_stat.in.h
+m4/sys_stat_h.m4
+m4/unistd_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+time
+warn-on-use
+
+configure.ac:
+gl_HEADER_SYS_STAT_H
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/stat.h
+
+# We need the following in order to create <sys/stat.h> when the system
+# has one that is incomplete.
+sys/stat.h: sys_stat.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \
+ -e 's|@''GNULIB_FCHMODAT''@|$(GNULIB_FCHMODAT)|g' \
+ -e 's|@''GNULIB_FSTATAT''@|$(GNULIB_FSTATAT)|g' \
+ -e 's|@''GNULIB_FUTIMENS''@|$(GNULIB_FUTIMENS)|g' \
+ -e 's|@''GNULIB_LCHMOD''@|$(GNULIB_LCHMOD)|g' \
+ -e 's|@''GNULIB_LSTAT''@|$(GNULIB_LSTAT)|g' \
+ -e 's|@''GNULIB_MKDIRAT''@|$(GNULIB_MKDIRAT)|g' \
+ -e 's|@''GNULIB_MKFIFO''@|$(GNULIB_MKFIFO)|g' \
+ -e 's|@''GNULIB_MKFIFOAT''@|$(GNULIB_MKFIFOAT)|g' \
+ -e 's|@''GNULIB_MKNOD''@|$(GNULIB_MKNOD)|g' \
+ -e 's|@''GNULIB_MKNODAT''@|$(GNULIB_MKNODAT)|g' \
+ -e 's|@''GNULIB_STAT''@|$(GNULIB_STAT)|g' \
+ -e 's|@''GNULIB_UTIMENSAT''@|$(GNULIB_UTIMENSAT)|g' \
+ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \
+ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \
+ -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \
+ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \
+ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \
+ -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \
+ -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \
+ -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \
+ -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \
+ -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \
+ -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \
+ -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \
+ -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \
+ -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \
+ -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \
+ -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \
+ -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \
+ -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \
+ -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \
+ -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_stat.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/stat.h sys/stat.h-t
+MOSTLYCLEANDIRS += sys
+
+Include:
+<sys/stat.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/sys_stat-tests b/gnulib/modules/sys_stat-tests
new file mode 100644
index 00000000..451f8318
--- /dev/null
+++ b/gnulib/modules/sys_stat-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-sys_stat.c
+
+Depends-on:
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sys_stat
+check_PROGRAMS += test-sys_stat
diff --git a/gnulib/modules/sys_time b/gnulib/modules/sys_time
new file mode 100644
index 00000000..adfa4938
--- /dev/null
+++ b/gnulib/modules/sys_time
@@ -0,0 +1,48 @@
+Description:
+A <sys/time.h> that conforms better to POSIX.
+
+Files:
+lib/sys_time.in.h
+m4/sys_time_h.m4
+
+Depends-on:
+include_next
+arg-nonnull
+warn-on-use
+
+configure.ac:
+gl_HEADER_SYS_TIME_H
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/time.h
+
+# We need the following in order to create <sys/time.h> when the system
+# doesn't have one that works with the given compiler.
+sys/time.h: sys_time.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \
+ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \
+ -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \
+ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \
+ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_time.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/time.h sys/time.h-t
+
+Include:
+<sys/time.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/sys_time-tests b/gnulib/modules/sys_time-tests
new file mode 100644
index 00000000..dd1bff48
--- /dev/null
+++ b/gnulib/modules/sys_time-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sys_time.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sys_time
+check_PROGRAMS += test-sys_time
diff --git a/gnulib/modules/sys_times b/gnulib/modules/sys_times
new file mode 100644
index 00000000..6ce9d7e9
--- /dev/null
+++ b/gnulib/modules/sys_times
@@ -0,0 +1,48 @@
+Description:
+A <sys/times.h> for systems lacking it.
+
+Files:
+lib/sys_times.in.h
+m4/sys_times_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+warn-on-use
+
+configure.ac:
+gl_SYS_TIMES_H
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/times.h
+
+# We need the following in order to create <sys/times.h> when the system
+# doesn't have one that works with the given compiler.
+sys/times.h: sys_times.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_SYS_TIMES_H''@/$(HAVE_SYS_TIMES_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_TIMES_H''@|$(NEXT_SYS_TIMES_H)|g' \
+ -e 's|@''GNULIB_TIMES''@|$(GNULIB_TIMES)|g' \
+ -e 's|@''HAVE_STRUCT_TMS''@|$(HAVE_STRUCT_TMS)|g' \
+ -e 's|@''HAVE_TIMES''@|$(HAVE_TIMES)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_times.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/times.h sys/times.h-t
+MOSTLYCLEANDIRS += sys
+
+Include:
+<sys/times.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/sys_times-tests b/gnulib/modules/sys_times-tests
new file mode 100644
index 00000000..f6221570
--- /dev/null
+++ b/gnulib/modules/sys_times-tests
@@ -0,0 +1,6 @@
+Files:
+tests/test-sys_times.c
+
+Makefile.am:
+TESTS += test-sys_times
+check_PROGRAMS += test-sys_times
diff --git a/gnulib/modules/sys_utsname b/gnulib/modules/sys_utsname
new file mode 100644
index 00000000..1a3d8ec2
--- /dev/null
+++ b/gnulib/modules/sys_utsname
@@ -0,0 +1,48 @@
+Description:
+A <sys/utsname.h> for systems which lack it.
+
+Files:
+lib/sys_utsname.in.h
+m4/sys_utsname_h.m4
+
+Depends-on:
+arg-nonnull
+include_next
+warn-on-use
+
+configure.ac:
+gl_SYS_UTSNAME_H
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/utsname.h
+
+# We need the following in order to create <sys/utsname.h> when the system
+# does not have one.
+sys/utsname.h: sys_utsname.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_SYS_UTSNAME_H''@/$(HAVE_SYS_UTSNAME_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_UTSNAME_H''@|$(NEXT_SYS_UTSNAME_H)|g' \
+ -e 's|@''GNULIB_UNAME''@|$(GNULIB_UNAME)|g' \
+ -e 's|@''HAVE_STRUCT_UTSNAME''@|$(HAVE_STRUCT_UTSNAME)|g' \
+ -e 's|@''HAVE_UNAME''@|$(HAVE_UNAME)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_utsname.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/utsname.h sys/utsname.h-t
+MOSTLYCLEANDIRS += sys
+
+Include:
+<sys/utsname.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/sys_utsname-tests b/gnulib/modules/sys_utsname-tests
new file mode 100644
index 00000000..8d95351f
--- /dev/null
+++ b/gnulib/modules/sys_utsname-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sys_utsname.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sys_utsname
+check_PROGRAMS += test-sys_utsname
diff --git a/gnulib/modules/sys_wait b/gnulib/modules/sys_wait
new file mode 100644
index 00000000..376b08c2
--- /dev/null
+++ b/gnulib/modules/sys_wait
@@ -0,0 +1,40 @@
+Description:
+A <sys/wait.h> for systems with missing declarations.
+
+Files:
+lib/sys_wait.in.h
+m4/sys_wait_h.m4
+
+Depends-on:
+include_next
+
+configure.ac:
+gl_SYS_WAIT_H
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += sys/wait.h
+
+# We need the following in order to create <sys/wait.h> when the system
+# has one that is incomplete.
+sys/wait.h: sys_wait.in.h
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_WAIT_H''@|$(NEXT_SYS_WAIT_H)|g' \
+ < $(srcdir)/sys_wait.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/wait.h sys/wait.h-t
+MOSTLYCLEANDIRS += sys
+
+Include:
+<sys/wait.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/sys_wait-tests b/gnulib/modules/sys_wait-tests
new file mode 100644
index 00000000..9c877d88
--- /dev/null
+++ b/gnulib/modules/sys_wait-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sys_wait.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sys_wait
+check_PROGRAMS += test-sys_wait
diff --git a/gnulib/modules/sysexits b/gnulib/modules/sysexits
new file mode 100644
index 00000000..6ec3a44b
--- /dev/null
+++ b/gnulib/modules/sysexits
@@ -0,0 +1,38 @@
+Description:
+Exit status codes for some BSD system programs.
+
+Files:
+lib/sysexits.in.h
+m4/sysexits.m4
+
+Depends-on:
+include_next
+
+configure.ac:
+gl_SYSEXITS
+
+Makefile.am:
+BUILT_SOURCES += $(SYSEXITS_H)
+
+# We need the following in order to create <sysexits.h> when the system
+# doesn't have one that works with the given compiler.
+sysexits.h: sysexits.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SYSEXITS_H''@|$(HAVE_SYSEXITS_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYSEXITS_H''@|$(NEXT_SYSEXITS_H)|g' \
+ < $(srcdir)/sysexits.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += sysexits.h sysexits.h-t
+
+Include:
+<sysexits.h>
+
+License:
+LGPL
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/sysexits-tests b/gnulib/modules/sysexits-tests
new file mode 100644
index 00000000..7794cf05
--- /dev/null
+++ b/gnulib/modules/sysexits-tests
@@ -0,0 +1,10 @@
+Files:
+tests/test-sysexits.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sysexits
+check_PROGRAMS += test-sysexits
diff --git a/gnulib/modules/tan b/gnulib/modules/tan
new file mode 100644
index 00000000..4f14961f
--- /dev/null
+++ b/gnulib/modules/tan
@@ -0,0 +1,24 @@
+Description:
+tan() function: tangent function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([tan])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(TAN_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/tan-tests b/gnulib/modules/tan-tests
new file mode 100644
index 00000000..178a6439
--- /dev/null
+++ b/gnulib/modules/tan-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-tan.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-tan
+check_PROGRAMS += test-tan
+test_tan_LDADD = $(LDADD) @TAN_LIBM@
diff --git a/gnulib/modules/tanh b/gnulib/modules/tanh
new file mode 100644
index 00000000..6969caf5
--- /dev/null
+++ b/gnulib/modules/tanh
@@ -0,0 +1,24 @@
+Description:
+tanh() function: hyperbolic tangent function.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([tanh])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(TANH_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/tanh-tests b/gnulib/modules/tanh-tests
new file mode 100644
index 00000000..9e098c31
--- /dev/null
+++ b/gnulib/modules/tanh-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-tanh.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-tanh
+check_PROGRAMS += test-tanh
+test_tanh_LDADD = $(LDADD) @TANH_LIBM@
diff --git a/gnulib/modules/tanl b/gnulib/modules/tanl
new file mode 100644
index 00000000..b00fd1bd
--- /dev/null
+++ b/gnulib/modules/tanl
@@ -0,0 +1,34 @@
+Description:
+tanl() function: tangent function with long double argument.
+
+Files:
+lib/tanl.c
+lib/trigl.h
+lib/trigl.c
+m4/tanl.m4
+
+Depends-on:
+math
+extensions
+float
+isnanl
+floor
+floorl
+
+configure.ac:
+gl_FUNC_TANL
+gl_MATH_MODULE_INDICATOR([tanl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(TANL_LIBM)
+
+License:
+GPL
+
+Maintainer:
+Paolo Bonzini
diff --git a/gnulib/modules/tanl-tests b/gnulib/modules/tanl-tests
new file mode 100644
index 00000000..eb8f609a
--- /dev/null
+++ b/gnulib/modules/tanl-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-tanl.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-tanl
+check_PROGRAMS += test-tanl
+test_tanl_LDADD = $(LDADD) @TANL_LIBM@
diff --git a/gnulib/modules/tempname b/gnulib/modules/tempname
new file mode 100644
index 00000000..77617d07
--- /dev/null
+++ b/gnulib/modules/tempname
@@ -0,0 +1,29 @@
+Description:
+gen_tempname() function: create a private temporary file or directory.
+
+Files:
+lib/tempname.c
+lib/tempname.h
+m4/tempname.m4
+
+Depends-on:
+extensions
+gettimeofday
+lstat
+stdint
+sys_stat
+sys_time
+
+configure.ac:
+gl_FUNC_GEN_TEMPNAME
+
+Makefile.am:
+
+Include:
+"tempname.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake and Jim Meyering
diff --git a/gnulib/modules/thread b/gnulib/modules/thread
new file mode 100644
index 00000000..a7d338df
--- /dev/null
+++ b/gnulib/modules/thread
@@ -0,0 +1,30 @@
+Description:
+Creating and controlling threads.
+
+Files:
+lib/glthread/thread.h
+lib/glthread/thread.c
+m4/thread.m4
+
+Depends-on:
+threadlib
+lock
+
+configure.ac:
+gl_THREAD
+
+Makefile.am:
+lib_SOURCES += glthread/thread.h glthread/thread.c
+
+Include:
+"glthread/thread.h"
+
+Link:
+$(LTLIBMULTITHREAD) when linking with libtool, $(LIBMULTITHREAD) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Yoann Vandoorselaere
+
diff --git a/gnulib/modules/threadlib b/gnulib/modules/threadlib
new file mode 100644
index 00000000..9e3438c7
--- /dev/null
+++ b/gnulib/modules/threadlib
@@ -0,0 +1,31 @@
+Description:
+Access to multithreading primitives.
+
+Files:
+lib/glthread/threadlib.c
+m4/threadlib.m4
+build-aux/config.rpath
+
+Depends-on:
+havelib
+
+configure.ac-early:
+gl_THREADLIB_EARLY
+
+configure.ac:
+gl_THREADLIB
+
+Makefile.am:
+lib_SOURCES += glthread/threadlib.c
+
+Include:
+
+Link:
+$(LTLIBTHREAD) when linking with libtool, $(LIBTHREAD) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/time b/gnulib/modules/time
new file mode 100644
index 00000000..ed89cf9b
--- /dev/null
+++ b/gnulib/modules/time
@@ -0,0 +1,48 @@
+Description:
+A more-standard <time.h>.
+
+Files:
+lib/time.in.h
+m4/time_h.m4
+
+Depends-on:
+extensions
+include_next
+arg-nonnull
+stddef
+
+configure.ac:
+gl_HEADER_TIME_H
+
+Makefile.am:
+BUILT_SOURCES += time.h
+
+# We need the following in order to create <time.h> when the system
+# doesn't have one that works with the given compiler.
+time.h: time.in.h $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \
+ -e 's|@REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \
+ -e 's|@REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \
+ -e 's|@REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \
+ -e 's|@REPLACE_STRPTIME''@|$(REPLACE_STRPTIME)|g' \
+ -e 's|@REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \
+ -e 's|@SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e 's|@TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ < $(srcdir)/time.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += time.h time.h-t
+
+Include:
+<time.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/time-tests b/gnulib/modules/time-tests
new file mode 100644
index 00000000..cde1e0f8
--- /dev/null
+++ b/gnulib/modules/time-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-time.c
+
+Depends-on:
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-time
+check_PROGRAMS += test-time
diff --git a/gnulib/modules/time_r b/gnulib/modules/time_r
new file mode 100644
index 00000000..8349bcf4
--- /dev/null
+++ b/gnulib/modules/time_r
@@ -0,0 +1,24 @@
+Description:
+Reentrant time functions like localtime_r.
+
+Files:
+lib/time_r.c
+m4/time_r.m4
+
+Depends-on:
+extensions
+time
+
+configure.ac:
+gl_TIME_R
+
+Makefile.am:
+
+Include:
+<time.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/timegm b/gnulib/modules/timegm
new file mode 100644
index 00000000..f1de7264
--- /dev/null
+++ b/gnulib/modules/timegm
@@ -0,0 +1,26 @@
+Description:
+Convert calendar time to simple time, inverse of mktime.
+
+Files:
+lib/mktime-internal.h
+lib/timegm.c
+m4/timegm.m4
+
+Depends-on:
+mktime
+time
+time_r
+
+configure.ac:
+gl_FUNC_TIMEGM
+
+Makefile.am:
+
+Include:
+<time.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, glibc
diff --git a/gnulib/modules/times b/gnulib/modules/times
new file mode 100644
index 00000000..dad7eb9b
--- /dev/null
+++ b/gnulib/modules/times
@@ -0,0 +1,24 @@
+Description:
+times() function: get process times
+
+Files:
+lib/times.c
+m4/times.m4
+
+Depends-on:
+sys_times
+
+configure.ac:
+gl_FUNC_TIMES
+gl_SYS_TIMES_MODULE_INDICATOR([times])
+
+Makefile.am:
+
+Include:
+<sys/times.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/times-tests b/gnulib/modules/times-tests
new file mode 100644
index 00000000..3d90f1a6
--- /dev/null
+++ b/gnulib/modules/times-tests
@@ -0,0 +1,7 @@
+Files:
+tests/signature.h
+tests/test-times.c
+
+Makefile.am:
+TESTS += test-times
+check_PROGRAMS += test-times
diff --git a/gnulib/modules/timespec b/gnulib/modules/timespec
new file mode 100644
index 00000000..8d74632c
--- /dev/null
+++ b/gnulib/modules/timespec
@@ -0,0 +1,23 @@
+Description:
+timespec-related declarations
+
+Files:
+lib/timespec.h
+m4/timespec.m4
+
+Depends-on:
+time
+
+configure.ac:
+gl_TIMESPEC
+
+Makefile.am:
+
+Include:
+"timespec.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert and Jim Meyering
diff --git a/gnulib/modules/tls b/gnulib/modules/tls
new file mode 100644
index 00000000..a2a4664e
--- /dev/null
+++ b/gnulib/modules/tls
@@ -0,0 +1,29 @@
+Description:
+Thread-local storage in multithreaded situations.
+
+Files:
+lib/glthread/tls.h
+lib/glthread/tls.c
+m4/tls.m4
+
+Depends-on:
+threadlib
+
+configure.ac:
+gl_TLS
+
+Makefile.am:
+lib_SOURCES += glthread/tls.h glthread/tls.c
+
+Include:
+"glthread/tls.h"
+
+Link:
+$(LTLIBTHREAD) when linking with libtool, $(LIBTHREAD) otherwise
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/tls-tests b/gnulib/modules/tls-tests
new file mode 100644
index 00000000..107cfe45
--- /dev/null
+++ b/gnulib/modules/tls-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-tls.c
+
+Depends-on:
+thread
+yield
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-tls
+check_PROGRAMS += test-tls
+test_tls_LDADD = $(LDADD) @LIBMULTITHREAD@ @YIELD_LIB@
+
diff --git a/gnulib/modules/tmpdir b/gnulib/modules/tmpdir
new file mode 100644
index 00000000..a42fdc45
--- /dev/null
+++ b/gnulib/modules/tmpdir
@@ -0,0 +1,27 @@
+Description:
+Determine a temporary directory.
+
+Files:
+lib/tmpdir.h
+lib/tmpdir.c
+m4/tmpdir.m4
+
+Depends-on:
+stdbool
+sys_stat
+
+configure.ac:
+gt_TMPDIR
+
+Makefile.am:
+lib_SOURCES += tmpdir.h tmpdir.c
+
+Include:
+"tmpdir.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/tmpfile b/gnulib/modules/tmpfile
new file mode 100644
index 00000000..8358274e
--- /dev/null
+++ b/gnulib/modules/tmpfile
@@ -0,0 +1,25 @@
+Description:
+tmpfile() function: create a temporary file.
+
+Files:
+lib/tmpfile.c
+m4/tmpfile.m4
+
+Depends-on:
+pathmax
+tempname
+tmpdir
+
+configure.ac:
+gl_TMPFILE
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+GPL
+
+Maintainer:
+Ben Pfaff
diff --git a/gnulib/modules/tmpfile-safer b/gnulib/modules/tmpfile-safer
new file mode 100644
index 00000000..de615442
--- /dev/null
+++ b/gnulib/modules/tmpfile-safer
@@ -0,0 +1,28 @@
+Description:
+tmpfile function that avoids clobbering std{in,out,err}.
+
+Files:
+lib/stdio--.h
+lib/stdio-safer.h
+lib/tmpfile-safer.c
+m4/stdio-safer.m4
+
+Depends-on:
+binary-io
+tmpfile
+unistd-safer
+
+configure.ac:
+gl_TMPFILE_SAFER
+gl_MODULE_INDICATOR([tmpfile-safer])
+
+Makefile.am:
+
+Include:
+"stdio-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/trim b/gnulib/modules/trim
new file mode 100644
index 00000000..c954509a
--- /dev/null
+++ b/gnulib/modules/trim
@@ -0,0 +1,27 @@
+Description:
+trim() function: remove leading and/or trailing whitespaces
+
+Files:
+lib/trim.h
+lib/trim.c
+
+Depends-on:
+xalloc
+mbchar
+mbiter
+memmove
+strdup
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += trim.c
+
+Include:
+"trim.h"
+
+License:
+GPL
+
+Maintainer:
+Davide Angelocola
diff --git a/gnulib/modules/trunc b/gnulib/modules/trunc
new file mode 100644
index 00000000..1c6f7062
--- /dev/null
+++ b/gnulib/modules/trunc
@@ -0,0 +1,30 @@
+Description:
+trunc() function: round towards zero.
+
+Files:
+lib/trunc.c
+m4/trunc.m4
+
+Depends-on:
+math
+extensions
+float
+
+configure.ac:
+gl_FUNC_TRUNC
+gl_MATH_MODULE_INDICATOR([trunc])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(TRUNC_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/trunc-tests b/gnulib/modules/trunc-tests
new file mode 100644
index 00000000..3f84affc
--- /dev/null
+++ b/gnulib/modules/trunc-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-trunc1.c
+tests/test-trunc2.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+float
+isnand-nolibm
+stdbool
+stdint
+fprintf-posix
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-trunc1 test-trunc2
+check_PROGRAMS += test-trunc1 test-trunc2
+test_trunc1_LDADD = $(LDADD) @TRUNC_LIBM@
+test_trunc2_LDADD = $(LDADD) @TRUNC_LIBM@
diff --git a/gnulib/modules/truncf b/gnulib/modules/truncf
new file mode 100644
index 00000000..6c4c46f1
--- /dev/null
+++ b/gnulib/modules/truncf
@@ -0,0 +1,31 @@
+Description:
+truncf() function: round towards zero.
+
+Files:
+lib/truncf.c
+lib/trunc.c
+m4/truncf.m4
+
+Depends-on:
+math
+extensions
+float
+
+configure.ac:
+gl_FUNC_TRUNCF
+gl_MATH_MODULE_INDICATOR([truncf])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(TRUNCF_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/truncf-tests b/gnulib/modules/truncf-tests
new file mode 100644
index 00000000..a2b93202
--- /dev/null
+++ b/gnulib/modules/truncf-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-truncf1.c
+tests/test-truncf2.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+float
+isnanf-nolibm
+stdbool
+stdint
+fprintf-posix
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-truncf1 test-truncf2
+check_PROGRAMS += test-truncf1 test-truncf2
+test_truncf1_LDADD = $(LDADD) @TRUNCF_LIBM@
+test_truncf2_LDADD = $(LDADD) @TRUNCF_LIBM@
diff --git a/gnulib/modules/truncl b/gnulib/modules/truncl
new file mode 100644
index 00000000..d3d88847
--- /dev/null
+++ b/gnulib/modules/truncl
@@ -0,0 +1,31 @@
+Description:
+truncl() function: round towards zero.
+
+Files:
+lib/truncl.c
+lib/trunc.c
+m4/truncl.m4
+
+Depends-on:
+math
+extensions
+float
+
+configure.ac:
+gl_FUNC_TRUNCL
+gl_MATH_MODULE_INDICATOR([truncl])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(TRUNCL_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/truncl-tests b/gnulib/modules/truncl-tests
new file mode 100644
index 00000000..6056a642
--- /dev/null
+++ b/gnulib/modules/truncl-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-truncl.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+fpucw
+isnanl-nolibm
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-truncl
+check_PROGRAMS += test-truncl
+test_truncl_LDADD = $(LDADD) @TRUNCL_LIBM@
diff --git a/gnulib/modules/tsearch b/gnulib/modules/tsearch
new file mode 100644
index 00000000..ad1bbefe
--- /dev/null
+++ b/gnulib/modules/tsearch
@@ -0,0 +1,25 @@
+Description:
+Binary tree data structure.
+
+Files:
+lib/tsearch.c
+m4/tsearch.m4
+
+Depends-on:
+search
+
+configure.ac:
+gl_FUNC_TSEARCH
+gl_SEARCH_MODULE_INDICATOR([tsearch])
+
+Makefile.am:
+
+Include:
+<search.h>
+
+License:
+LGPL
+
+Maintainer:
+all, glibc
+
diff --git a/gnulib/modules/tsearch-tests b/gnulib/modules/tsearch-tests
new file mode 100644
index 00000000..0c4de8b7
--- /dev/null
+++ b/gnulib/modules/tsearch-tests
@@ -0,0 +1,24 @@
+Files:
+tests/test-tsearch.sh
+tests/test-tsearch.c
+tests/signature.h
+
+Depends-on:
+stdint
+
+configure.ac:
+TEST_TSEARCH_LIBM=
+AC_TRY_LINK([
+ #ifndef __NO_MATH_INLINES
+ # define __NO_MATH_INLINES 1 /* for glibc */
+ #endif
+ #include <math.h>
+ double x;],
+ [x = log (x);], , [TEST_TSEARCH_LIBM=-lm])
+AC_SUBST([TEST_TSEARCH_LIBM])
+AC_CHECK_FUNCS_ONCE([initstate])
+
+Makefile.am:
+TESTS += test-tsearch.sh
+check_PROGRAMS += test-tsearch
+test_tsearch_LDADD = $(LDADD) @TEST_TSEARCH_LIBM@
diff --git a/gnulib/modules/tzset b/gnulib/modules/tzset
new file mode 100644
index 00000000..54f13e38
--- /dev/null
+++ b/gnulib/modules/tzset
@@ -0,0 +1,23 @@
+Description:
+tzset - initialize time conversion information
+
+Files:
+m4/tzset.m4
+
+Depends-on:
+gettimeofday
+
+configure.ac:
+gl_FUNC_TZSET_CLOBBER
+
+Makefile.am:
+
+Include:
+<time.h>
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/u64 b/gnulib/modules/u64
new file mode 100644
index 00000000..23138d0f
--- /dev/null
+++ b/gnulib/modules/u64
@@ -0,0 +1,22 @@
+Description:
+uint64_t-like operations that work even on hosts lacking uint64_t
+
+Files:
+lib/u64.h
+
+Depends-on:
+stdint
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+
+Include:
+"u64.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/u64-tests b/gnulib/modules/u64-tests
new file mode 100644
index 00000000..4b53abb0
--- /dev/null
+++ b/gnulib/modules/u64-tests
@@ -0,0 +1,6 @@
+Files:
+tests/test-u64.c
+
+Makefile.am:
+TESTS += test-u64
+check_PROGRAMS += test-u64
diff --git a/gnulib/modules/ucs4-utf16 b/gnulib/modules/ucs4-utf16
new file mode 100644
index 00000000..0aee82d9
--- /dev/null
+++ b/gnulib/modules/ucs4-utf16
@@ -0,0 +1,21 @@
+Description:
+Conversion UCS-4 to UTF-16.
+
+Files:
+
+Depends-on:
+unistr/u16-uctomb
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/ucs4-utf8 b/gnulib/modules/ucs4-utf8
new file mode 100644
index 00000000..102d0467
--- /dev/null
+++ b/gnulib/modules/ucs4-utf8
@@ -0,0 +1,21 @@
+Description:
+Conversion UCS-4 to UTF-8.
+
+Files:
+
+Depends-on:
+unistr/u8-uctomb
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uname b/gnulib/modules/uname
new file mode 100644
index 00000000..ac5ad88f
--- /dev/null
+++ b/gnulib/modules/uname
@@ -0,0 +1,28 @@
+Description:
+uname() function: enquire system information.
+
+Files:
+lib/uname.c
+m4/uname.m4
+
+Depends-on:
+sys_utsname
+gethostname
+
+configure.ac:
+gl_FUNC_UNAME
+gl_SYS_UTSNAME_MODULE_INDICATOR([uname])
+
+Makefile.am:
+
+Include:
+<sys/utsname.h>
+
+Link:
+$(GETHOSTNAME_LIB)
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/uname-tests b/gnulib/modules/uname-tests
new file mode 100644
index 00000000..daee4904
--- /dev/null
+++ b/gnulib/modules/uname-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-uname.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-uname
+check_PROGRAMS += test-uname
+test_uname_LDADD = $(LDADD) @GETHOSTNAME_LIB@
diff --git a/gnulib/modules/unicase/base b/gnulib/modules/unicase/base
new file mode 100644
index 00000000..ddd2fe6f
--- /dev/null
+++ b/gnulib/modules/unicase/base
@@ -0,0 +1,24 @@
+Description:
+Base layer for Unicode character case mappings.
+
+Files:
+lib/unicase.h
+
+Depends-on:
+unitypes
+uninorm/base
+stdbool
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/cased b/gnulib/modules/unicase/cased
new file mode 100644
index 00000000..bce2fdc3
--- /dev/null
+++ b/gnulib/modules/unicase/cased
@@ -0,0 +1,28 @@
+Description:
+Test whether a Unicode character is "cased".
+
+Files:
+lib/unicase/caseprop.h
+lib/unicase/cased.c
+lib/unicase/cased.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unitypes
+stdbool
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unicase/cased.c
+
+Include:
+"unicase/caseprop.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/cased-tests b/gnulib/modules/unicase/cased-tests
new file mode 100644
index 00000000..fb8c535e
--- /dev/null
+++ b/gnulib/modules/unicase/cased-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-cased.c
+tests/unicase/test-predicate-part1.h
+tests/unicase/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-cased
+check_PROGRAMS += test-cased
+test_cased_SOURCES = unicase/test-cased.c
+
diff --git a/gnulib/modules/unicase/empty-prefix-context b/gnulib/modules/unicase/empty-prefix-context
new file mode 100644
index 00000000..faa49716
--- /dev/null
+++ b/gnulib/modules/unicase/empty-prefix-context
@@ -0,0 +1,23 @@
+Description:
+Case-mapping context of empty prefix string.
+
+Files:
+lib/unicase/empty-prefix-context.c
+
+Depends-on:
+unicase/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/empty-prefix-context.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/empty-suffix-context b/gnulib/modules/unicase/empty-suffix-context
new file mode 100644
index 00000000..22c5b235
--- /dev/null
+++ b/gnulib/modules/unicase/empty-suffix-context
@@ -0,0 +1,23 @@
+Description:
+Case-mapping context of empty suffix string.
+
+Files:
+lib/unicase/empty-suffix-context.c
+
+Depends-on:
+unicase/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/empty-suffix-context.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/ignorable b/gnulib/modules/unicase/ignorable
new file mode 100644
index 00000000..20b16e54
--- /dev/null
+++ b/gnulib/modules/unicase/ignorable
@@ -0,0 +1,28 @@
+Description:
+Test whether a Unicode character is "case-ignorable".
+
+Files:
+lib/unicase/caseprop.h
+lib/unicase/ignorable.c
+lib/unicase/ignorable.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unitypes
+stdbool
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unicase/ignorable.c
+
+Include:
+"unicase/caseprop.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/ignorable-tests b/gnulib/modules/unicase/ignorable-tests
new file mode 100644
index 00000000..ca241aaf
--- /dev/null
+++ b/gnulib/modules/unicase/ignorable-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-ignorable.c
+tests/unicase/test-predicate-part1.h
+tests/unicase/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ignorable
+check_PROGRAMS += test-ignorable
+test_ignorable_SOURCES = unicase/test-ignorable.c
+
diff --git a/gnulib/modules/unicase/locale-language b/gnulib/modules/unicase/locale-language
new file mode 100644
index 00000000..71036f1c
--- /dev/null
+++ b/gnulib/modules/unicase/locale-language
@@ -0,0 +1,34 @@
+Description:
+Language code of current locale.
+
+Files:
+lib/unicase/locale-language.c
+lib/unicase/locale-languages.gperf
+
+Depends-on:
+unicase/base
+localename
+gperf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/locale-language.c
+
+unicase/locale-languages.h: $(srcdir)/unicase/locale-languages.gperf
+ $(GPERF) -m 10 $(srcdir)/unicase/locale-languages.gperf > $(srcdir)/unicase/locale-languages.h-t
+ mv $(srcdir)/unicase/locale-languages.h-t $(srcdir)/unicase/locale-languages.h
+BUILT_SOURCES += unicase/locale-languages.h
+MOSTLYCLEANFILES += unicase/locale-languages.h-t
+MAINTAINERCLEANFILES += unicase/locale-languages.h
+EXTRA_DIST += unicase/locale-languages.h
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/locale-language-tests b/gnulib/modules/unicase/locale-language-tests
new file mode 100644
index 00000000..bd6a21ae
--- /dev/null
+++ b/gnulib/modules/unicase/locale-language-tests
@@ -0,0 +1,25 @@
+Files:
+tests/unicase/test-locale-language.sh
+tests/unicase/test-locale-language.c
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-tr.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_JA
+gt_LOCALE_TR_UTF8
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += unicase/test-locale-language.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' LOCALE_JA='@LOCALE_JA@' LOCALE_TR_UTF8='@LOCALE_TR_UTF8@' LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-locale-language
+test_locale_language_SOURCES = unicase/test-locale-language.c
+test_locale_language_LDADD = $(LDADD) @INTL_MACOSX_LIBS@
diff --git a/gnulib/modules/unicase/special-casing b/gnulib/modules/unicase/special-casing
new file mode 100644
index 00000000..53e65df9
--- /dev/null
+++ b/gnulib/modules/unicase/special-casing
@@ -0,0 +1,33 @@
+Description:
+Special casing table.
+
+Files:
+lib/unicase/special-casing.h
+lib/unicase/special-casing.c
+lib/unicase/special-casing-table.gperf
+
+Depends-on:
+gperf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/special-casing.c
+
+unicase/special-casing-table.h: $(srcdir)/unicase/special-casing-table.gperf
+ $(GPERF) -m 10 $(srcdir)/unicase/special-casing-table.gperf > $(srcdir)/unicase/special-casing-table.h-t
+ mv $(srcdir)/unicase/special-casing-table.h-t $(srcdir)/unicase/special-casing-table.h
+BUILT_SOURCES += unicase/special-casing-table.h
+MOSTLYCLEANFILES += unicase/special-casing-table.h-t
+MAINTAINERCLEANFILES += unicase/special-casing-table.h
+EXTRA_DIST += unicase/special-casing-table.h
+
+Include:
+"unicase/special-casing.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/tocasefold b/gnulib/modules/unicase/tocasefold
new file mode 100644
index 00000000..771bb66f
--- /dev/null
+++ b/gnulib/modules/unicase/tocasefold
@@ -0,0 +1,26 @@
+Description:
+Casefolding mapping for Unicode characters (locale and context independent).
+
+Files:
+lib/unicase/casefold.h
+lib/unicase/tocasefold.c
+lib/unicase/tocasefold.h
+lib/unicase/simple-mapping.h
+
+Depends-on:
+unicase/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/tocasefold.c
+
+Include:
+"unicase/casefold.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/tolower b/gnulib/modules/unicase/tolower
new file mode 100644
index 00000000..8c34b095
--- /dev/null
+++ b/gnulib/modules/unicase/tolower
@@ -0,0 +1,25 @@
+Description:
+Lowercase mapping for Unicode characters (locale and context independent).
+
+Files:
+lib/unicase/tolower.c
+lib/unicase/tolower.h
+lib/unicase/simple-mapping.h
+
+Depends-on:
+unicase/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/tolower.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/tolower-tests b/gnulib/modules/unicase/tolower-tests
new file mode 100644
index 00000000..8dc87f8b
--- /dev/null
+++ b/gnulib/modules/unicase/tolower-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-uc_tolower.c
+tests/unicase/test-mapping-part1.h
+tests/unicase/test-mapping-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-uc_tolower
+check_PROGRAMS += test-uc_tolower
+test_uc_tolower_SOURCES = unicase/test-uc_tolower.c
+
diff --git a/gnulib/modules/unicase/totitle b/gnulib/modules/unicase/totitle
new file mode 100644
index 00000000..ad457c4f
--- /dev/null
+++ b/gnulib/modules/unicase/totitle
@@ -0,0 +1,25 @@
+Description:
+Titlecase mapping for Unicode characters (locale and context independent).
+
+Files:
+lib/unicase/totitle.c
+lib/unicase/totitle.h
+lib/unicase/simple-mapping.h
+
+Depends-on:
+unicase/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/totitle.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/totitle-tests b/gnulib/modules/unicase/totitle-tests
new file mode 100644
index 00000000..f0856dde
--- /dev/null
+++ b/gnulib/modules/unicase/totitle-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-uc_totitle.c
+tests/unicase/test-mapping-part1.h
+tests/unicase/test-mapping-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-uc_totitle
+check_PROGRAMS += test-uc_totitle
+test_uc_totitle_SOURCES = unicase/test-uc_totitle.c
+
diff --git a/gnulib/modules/unicase/toupper b/gnulib/modules/unicase/toupper
new file mode 100644
index 00000000..7b669a13
--- /dev/null
+++ b/gnulib/modules/unicase/toupper
@@ -0,0 +1,25 @@
+Description:
+Uppercase mapping for Unicode characters (locale and context independent).
+
+Files:
+lib/unicase/toupper.c
+lib/unicase/toupper.h
+lib/unicase/simple-mapping.h
+
+Depends-on:
+unicase/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/toupper.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/toupper-tests b/gnulib/modules/unicase/toupper-tests
new file mode 100644
index 00000000..f0c20028
--- /dev/null
+++ b/gnulib/modules/unicase/toupper-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-uc_toupper.c
+tests/unicase/test-mapping-part1.h
+tests/unicase/test-mapping-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-uc_toupper
+check_PROGRAMS += test-uc_toupper
+test_uc_toupper_SOURCES = unicase/test-uc_toupper.c
+
diff --git a/gnulib/modules/unicase/u16-casecmp b/gnulib/modules/unicase/u16-casecmp
new file mode 100644
index 00000000..ec5a60b2
--- /dev/null
+++ b/gnulib/modules/unicase/u16-casecmp
@@ -0,0 +1,28 @@
+Description:
+Case and normalization insensitive comparison of UTF-16 strings.
+
+Files:
+lib/unicase/u16-casecmp.c
+lib/unicase/u-casecmp.h
+
+Depends-on:
+unicase/base
+unicase/u16-casefold
+uninorm/decomposing-form
+unistr/u16-cmp2
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-casecmp.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-casecmp-tests b/gnulib/modules/unicase/u16-casecmp-tests
new file mode 100644
index 00000000..f0a98450
--- /dev/null
+++ b/gnulib/modules/unicase/u16-casecmp-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u16-casecmp.c
+tests/unicase/test-casecmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-casecmp
+check_PROGRAMS += test-u16-casecmp
+test_u16_casecmp_SOURCES = unicase/test-u16-casecmp.c
+
diff --git a/gnulib/modules/unicase/u16-casecoll b/gnulib/modules/unicase/u16-casecoll
new file mode 100644
index 00000000..fb449a95
--- /dev/null
+++ b/gnulib/modules/unicase/u16-casecoll
@@ -0,0 +1,27 @@
+Description:
+Locale dependent, case and normalization insensitive comparison of UTF-16
+strings.
+
+Files:
+lib/unicase/u16-casecoll.c
+lib/unicase/u-casecoll.h
+
+Depends-on:
+unicase/base
+unicase/u16-casexfrm
+memcmp2
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-casecoll.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-casecoll-tests b/gnulib/modules/unicase/u16-casecoll-tests
new file mode 100644
index 00000000..9b643e69
--- /dev/null
+++ b/gnulib/modules/unicase/u16-casecoll-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unicase/test-u16-casecoll.c
+tests/unicase/test-casecmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-casecoll
+check_PROGRAMS += test-u16-casecoll
+test_u16_casecoll_SOURCES = unicase/test-u16-casecoll.c
+test_u16_casecoll_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/unicase/u16-casefold b/gnulib/modules/unicase/u16-casefold
new file mode 100644
index 00000000..2d5ade2b
--- /dev/null
+++ b/gnulib/modules/unicase/u16-casefold
@@ -0,0 +1,27 @@
+Description:
+Casefolding mapping for UTF-16 strings (locale dependent).
+
+Files:
+lib/unicase/u16-casefold.c
+lib/unicase/u-casefold.h
+
+Depends-on:
+unicase/base
+unicase/u16-ct-casefold
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-casefold.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-casefold-tests b/gnulib/modules/unicase/u16-casefold-tests
new file mode 100644
index 00000000..0c4d50c4
--- /dev/null
+++ b/gnulib/modules/unicase/u16-casefold-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unicase/test-u16-casefold.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-cmp
+uninorm/nfc
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-casefold
+check_PROGRAMS += test-u16-casefold
+test_u16_casefold_SOURCES = unicase/test-u16-casefold.c
+
diff --git a/gnulib/modules/unicase/u16-casemap b/gnulib/modules/unicase/u16-casemap
new file mode 100644
index 00000000..cb2e6c43
--- /dev/null
+++ b/gnulib/modules/unicase/u16-casemap
@@ -0,0 +1,36 @@
+Description:
+Case mapping for UTF-16 strings (locale dependent).
+
+Files:
+lib/unicase/unicasemap.h
+lib/unicase/u16-casemap.c
+lib/unicase/u-casemap.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/cased
+unicase/ignorable
+unicase/special-casing
+unictype/combining-class
+unictype/property-soft-dotted
+unistr/u16-mbtouc-unsafe
+unistr/u16-uctomb
+unistr/u16-cpy
+uninorm/u16-normalize
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-casemap.c
+
+Include:
+"unicase/unicasemap.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-casexfrm b/gnulib/modules/unicase/u16-casexfrm
new file mode 100644
index 00000000..91e72292
--- /dev/null
+++ b/gnulib/modules/unicase/u16-casexfrm
@@ -0,0 +1,29 @@
+Description:
+Locale dependent transformation for case insensitive comparison of UTF-16
+strings.
+
+Files:
+lib/unicase/u16-casexfrm.c
+lib/unicase/u-casexfrm.h
+
+Depends-on:
+unicase/base
+unicase/u16-casefold
+uniconv/u16-conv-to-enc
+localcharset
+memxfrm
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-casexfrm.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-ct-casefold b/gnulib/modules/unicase/u16-ct-casefold
new file mode 100644
index 00000000..ce50470f
--- /dev/null
+++ b/gnulib/modules/unicase/u16-ct-casefold
@@ -0,0 +1,30 @@
+Description:
+Casefolding mapping for UTF-16 substrings (locale dependent).
+
+Files:
+lib/unicase/u16-ct-casefold.c
+lib/unicase/u-ct-casefold.h
+
+Depends-on:
+unicase/base
+unicase/u16-casemap
+unicase/special-casing
+unicase/tocasefold
+uninorm/decomposing-form
+uninorm/u16-normalize
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-ct-casefold.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-ct-tolower b/gnulib/modules/unicase/u16-ct-tolower
new file mode 100644
index 00000000..e3ccbf44
--- /dev/null
+++ b/gnulib/modules/unicase/u16-ct-tolower
@@ -0,0 +1,26 @@
+Description:
+Lowercase mapping for UTF-16 substrings (locale dependent).
+
+Files:
+lib/unicase/u16-ct-tolower.c
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-ct-tolower.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-ct-totitle b/gnulib/modules/unicase/u16-ct-totitle
new file mode 100644
index 00000000..823310ed
--- /dev/null
+++ b/gnulib/modules/unicase/u16-ct-totitle
@@ -0,0 +1,38 @@
+Description:
+Titlecase mapping for UTF-16 substrings (locale dependent).
+
+Files:
+lib/unicase/u16-ct-totitle.c
+lib/unicase/u-ct-totitle.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/cased
+unicase/ignorable
+unicase/special-casing
+unicase/totitle
+unicase/tolower
+uniwbrk/u16-wordbreaks
+unictype/combining-class
+unictype/property-soft-dotted
+unistr/u16-mbtouc-unsafe
+unistr/u16-uctomb
+unistr/u16-cpy
+uninorm/u16-normalize
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-ct-totitle.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-ct-toupper b/gnulib/modules/unicase/u16-ct-toupper
new file mode 100644
index 00000000..8157915a
--- /dev/null
+++ b/gnulib/modules/unicase/u16-ct-toupper
@@ -0,0 +1,26 @@
+Description:
+Uppercase mapping for UTF-16 substrings (locale dependent).
+
+Files:
+lib/unicase/u16-ct-toupper.c
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-ct-toupper.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-is-cased b/gnulib/modules/unicase/u16-is-cased
new file mode 100644
index 00000000..733bc90d
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-cased
@@ -0,0 +1,30 @@
+Description:
+Test whether case matters for an UTF-16 string.
+
+Files:
+lib/unicase/u16-is-cased.c
+lib/unicase/u-is-cased.h
+
+Depends-on:
+unicase/base
+unicase/u16-toupper
+unicase/u16-tolower
+unicase/u16-totitle
+uninorm/u16-normalize
+uninorm/nfd
+unistr/u16-cmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-is-cased.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-is-cased-tests b/gnulib/modules/unicase/u16-is-cased-tests
new file mode 100644
index 00000000..ebff5929
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-cased-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u16-is-cased.c
+tests/unicase/test-is-cased.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-is-cased
+check_PROGRAMS += test-u16-is-cased
+test_u16_is_cased_SOURCES = unicase/test-u16-is-cased.c
+
diff --git a/gnulib/modules/unicase/u16-is-casefolded b/gnulib/modules/unicase/u16-is-casefolded
new file mode 100644
index 00000000..2ea0312e
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-casefolded
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-16 string is already case-folded.
+
+Files:
+lib/unicase/u16-is-casefolded.c
+
+Depends-on:
+unicase/base
+unicase/u16-is-invariant
+unicase/u16-casefold
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-is-casefolded.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-is-casefolded-tests b/gnulib/modules/unicase/u16-is-casefolded-tests
new file mode 100644
index 00000000..6f32c370
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-casefolded-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u16-is-casefolded.c
+tests/unicase/test-is-casefolded.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-is-casefolded
+check_PROGRAMS += test-u16-is-casefolded
+test_u16_is_casefolded_SOURCES = unicase/test-u16-is-casefolded.c
+
diff --git a/gnulib/modules/unicase/u16-is-invariant b/gnulib/modules/unicase/u16-is-invariant
new file mode 100644
index 00000000..72ac0da2
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-invariant
@@ -0,0 +1,30 @@
+Description:
+Test whether an UTF-16 string is invariant under a given case mapping.
+
+Files:
+lib/unicase/u16-is-invariant.c
+lib/unicase/invariant.h
+lib/unicase/u-is-invariant.h
+
+Depends-on:
+unitypes
+uninorm/base
+uninorm/u16-normalize
+uninorm/nfd
+unistr/u16-cmp
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-is-invariant.c
+
+Include:
+"unicase/invariant.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-is-lowercase b/gnulib/modules/unicase/u16-is-lowercase
new file mode 100644
index 00000000..d6c3af1e
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-lowercase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-16 string is entirely lower case.
+
+Files:
+lib/unicase/u16-is-lowercase.c
+
+Depends-on:
+unicase/base
+unicase/u16-is-invariant
+unicase/u16-tolower
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-is-lowercase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-is-lowercase-tests b/gnulib/modules/unicase/u16-is-lowercase-tests
new file mode 100644
index 00000000..f5a0a796
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-lowercase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u16-is-lowercase.c
+tests/unicase/test-is-lowercase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-is-lowercase
+check_PROGRAMS += test-u16-is-lowercase
+test_u16_is_lowercase_SOURCES = unicase/test-u16-is-lowercase.c
+
diff --git a/gnulib/modules/unicase/u16-is-titlecase b/gnulib/modules/unicase/u16-is-titlecase
new file mode 100644
index 00000000..cb500a09
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-titlecase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-16 string is entirely title case.
+
+Files:
+lib/unicase/u16-is-titlecase.c
+
+Depends-on:
+unicase/base
+unicase/u16-is-invariant
+unicase/u16-totitle
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-is-titlecase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-is-titlecase-tests b/gnulib/modules/unicase/u16-is-titlecase-tests
new file mode 100644
index 00000000..701098a0
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-titlecase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u16-is-titlecase.c
+tests/unicase/test-is-titlecase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-is-titlecase
+check_PROGRAMS += test-u16-is-titlecase
+test_u16_is_titlecase_SOURCES = unicase/test-u16-is-titlecase.c
+
diff --git a/gnulib/modules/unicase/u16-is-uppercase b/gnulib/modules/unicase/u16-is-uppercase
new file mode 100644
index 00000000..aac90e33
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-uppercase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-16 string is entirely upper case.
+
+Files:
+lib/unicase/u16-is-uppercase.c
+
+Depends-on:
+unicase/base
+unicase/u16-is-invariant
+unicase/u16-toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-is-uppercase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-is-uppercase-tests b/gnulib/modules/unicase/u16-is-uppercase-tests
new file mode 100644
index 00000000..28d3d844
--- /dev/null
+++ b/gnulib/modules/unicase/u16-is-uppercase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u16-is-uppercase.c
+tests/unicase/test-is-uppercase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-is-uppercase
+check_PROGRAMS += test-u16-is-uppercase
+test_u16_is_uppercase_SOURCES = unicase/test-u16-is-uppercase.c
+
diff --git a/gnulib/modules/unicase/u16-prefix-context b/gnulib/modules/unicase/u16-prefix-context
new file mode 100644
index 00000000..775110b9
--- /dev/null
+++ b/gnulib/modules/unicase/u16-prefix-context
@@ -0,0 +1,30 @@
+Description:
+Case-mapping context of prefix UTF-16 string.
+
+Files:
+lib/unicase/u16-prefix-context.c
+lib/unicase/u-prefix-context.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/empty-prefix-context
+unicase/ignorable
+unictype/combining-class
+unistr/u16-mbtouc-unsafe
+unistr/u16-prev
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-prefix-context.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-suffix-context b/gnulib/modules/unicase/u16-suffix-context
new file mode 100644
index 00000000..512ab2b2
--- /dev/null
+++ b/gnulib/modules/unicase/u16-suffix-context
@@ -0,0 +1,29 @@
+Description:
+Case-mapping context of suffix UTF-16 string.
+
+Files:
+lib/unicase/u16-suffix-context.c
+lib/unicase/u-suffix-context.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/empty-prefix-context
+unicase/ignorable
+unictype/combining-class
+unistr/u16-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-suffix-context.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-tolower b/gnulib/modules/unicase/u16-tolower
new file mode 100644
index 00000000..63c1c9fa
--- /dev/null
+++ b/gnulib/modules/unicase/u16-tolower
@@ -0,0 +1,28 @@
+Description:
+Lowercase mapping for UTF-16 strings (locale dependent).
+
+Files:
+lib/unicase/u16-tolower.c
+
+Depends-on:
+unicase/base
+unicase/u16-casemap
+unicase/special-casing
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+unicase/tolower
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-tolower.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-tolower-tests b/gnulib/modules/unicase/u16-tolower-tests
new file mode 100644
index 00000000..d4d48106
--- /dev/null
+++ b/gnulib/modules/unicase/u16-tolower-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u16-tolower.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-tolower
+check_PROGRAMS += test-u16-tolower
+test_u16_tolower_SOURCES = unicase/test-u16-tolower.c
+
diff --git a/gnulib/modules/unicase/u16-totitle b/gnulib/modules/unicase/u16-totitle
new file mode 100644
index 00000000..771b5630
--- /dev/null
+++ b/gnulib/modules/unicase/u16-totitle
@@ -0,0 +1,27 @@
+Description:
+Titlecase mapping for UTF-16 strings (locale dependent).
+
+Files:
+lib/unicase/u16-totitle.c
+lib/unicase/u-totitle.h
+
+Depends-on:
+unicase/base
+unicase/u16-ct-totitle
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-totitle.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-totitle-tests b/gnulib/modules/unicase/u16-totitle-tests
new file mode 100644
index 00000000..00889be6
--- /dev/null
+++ b/gnulib/modules/unicase/u16-totitle-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u16-totitle.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-totitle
+check_PROGRAMS += test-u16-totitle
+test_u16_totitle_SOURCES = unicase/test-u16-totitle.c
+
diff --git a/gnulib/modules/unicase/u16-toupper b/gnulib/modules/unicase/u16-toupper
new file mode 100644
index 00000000..898edc8d
--- /dev/null
+++ b/gnulib/modules/unicase/u16-toupper
@@ -0,0 +1,28 @@
+Description:
+Uppercase mapping for UTF-16 strings (locale dependent).
+
+Files:
+lib/unicase/u16-toupper.c
+
+Depends-on:
+unicase/base
+unicase/u16-casemap
+unicase/special-casing
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u16-toupper.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u16-toupper-tests b/gnulib/modules/unicase/u16-toupper-tests
new file mode 100644
index 00000000..86958fe1
--- /dev/null
+++ b/gnulib/modules/unicase/u16-toupper-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u16-toupper.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-toupper
+check_PROGRAMS += test-u16-toupper
+test_u16_toupper_SOURCES = unicase/test-u16-toupper.c
+
diff --git a/gnulib/modules/unicase/u32-casecmp b/gnulib/modules/unicase/u32-casecmp
new file mode 100644
index 00000000..9c0ce1d2
--- /dev/null
+++ b/gnulib/modules/unicase/u32-casecmp
@@ -0,0 +1,28 @@
+Description:
+Case and normalization insensitive comparison of UTF-32 strings.
+
+Files:
+lib/unicase/u32-casecmp.c
+lib/unicase/u-casecmp.h
+
+Depends-on:
+unicase/base
+unicase/u32-casefold
+uninorm/decomposing-form
+unistr/u32-cmp2
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-casecmp.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-casecmp-tests b/gnulib/modules/unicase/u32-casecmp-tests
new file mode 100644
index 00000000..a62a5d11
--- /dev/null
+++ b/gnulib/modules/unicase/u32-casecmp-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u32-casecmp.c
+tests/unicase/test-casecmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-casecmp
+check_PROGRAMS += test-u32-casecmp
+test_u32_casecmp_SOURCES = unicase/test-u32-casecmp.c
+
diff --git a/gnulib/modules/unicase/u32-casecoll b/gnulib/modules/unicase/u32-casecoll
new file mode 100644
index 00000000..b8e34b3c
--- /dev/null
+++ b/gnulib/modules/unicase/u32-casecoll
@@ -0,0 +1,27 @@
+Description:
+Locale dependent, case and normalization insensitive comparison of UTF-32
+strings.
+
+Files:
+lib/unicase/u32-casecoll.c
+lib/unicase/u-casecoll.h
+
+Depends-on:
+unicase/base
+unicase/u32-casexfrm
+memcmp2
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-casecoll.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-casecoll-tests b/gnulib/modules/unicase/u32-casecoll-tests
new file mode 100644
index 00000000..1f96a0dc
--- /dev/null
+++ b/gnulib/modules/unicase/u32-casecoll-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unicase/test-u32-casecoll.c
+tests/unicase/test-casecmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-casecoll
+check_PROGRAMS += test-u32-casecoll
+test_u32_casecoll_SOURCES = unicase/test-u32-casecoll.c
+test_u32_casecoll_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/unicase/u32-casefold b/gnulib/modules/unicase/u32-casefold
new file mode 100644
index 00000000..c6350911
--- /dev/null
+++ b/gnulib/modules/unicase/u32-casefold
@@ -0,0 +1,27 @@
+Description:
+Casefolding mapping for UTF-32 strings (locale dependent).
+
+Files:
+lib/unicase/u32-casefold.c
+lib/unicase/u-casefold.h
+
+Depends-on:
+unicase/base
+unicase/u32-ct-casefold
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-casefold.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-casefold-tests b/gnulib/modules/unicase/u32-casefold-tests
new file mode 100644
index 00000000..fb3f4e6e
--- /dev/null
+++ b/gnulib/modules/unicase/u32-casefold-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unicase/test-u32-casefold.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-cmp
+uninorm/nfc
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-casefold
+check_PROGRAMS += test-u32-casefold
+test_u32_casefold_SOURCES = unicase/test-u32-casefold.c
+
diff --git a/gnulib/modules/unicase/u32-casemap b/gnulib/modules/unicase/u32-casemap
new file mode 100644
index 00000000..4285d1ce
--- /dev/null
+++ b/gnulib/modules/unicase/u32-casemap
@@ -0,0 +1,36 @@
+Description:
+Case mapping for UTF-32 strings (locale dependent).
+
+Files:
+lib/unicase/unicasemap.h
+lib/unicase/u32-casemap.c
+lib/unicase/u-casemap.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/cased
+unicase/ignorable
+unicase/special-casing
+unictype/combining-class
+unictype/property-soft-dotted
+unistr/u32-mbtouc-unsafe
+unistr/u32-uctomb
+unistr/u32-cpy
+uninorm/u32-normalize
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-casemap.c
+
+Include:
+"unicase/unicasemap.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-casexfrm b/gnulib/modules/unicase/u32-casexfrm
new file mode 100644
index 00000000..f582a865
--- /dev/null
+++ b/gnulib/modules/unicase/u32-casexfrm
@@ -0,0 +1,29 @@
+Description:
+Locale dependent transformation for case insensitive comparison of UTF-32
+strings.
+
+Files:
+lib/unicase/u32-casexfrm.c
+lib/unicase/u-casexfrm.h
+
+Depends-on:
+unicase/base
+unicase/u32-casefold
+uniconv/u32-conv-to-enc
+localcharset
+memxfrm
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-casexfrm.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-ct-casefold b/gnulib/modules/unicase/u32-ct-casefold
new file mode 100644
index 00000000..bb037d92
--- /dev/null
+++ b/gnulib/modules/unicase/u32-ct-casefold
@@ -0,0 +1,30 @@
+Description:
+Casefolding mapping for UTF-32 substrings (locale dependent).
+
+Files:
+lib/unicase/u32-ct-casefold.c
+lib/unicase/u-ct-casefold.h
+
+Depends-on:
+unicase/base
+unicase/u32-casemap
+unicase/special-casing
+unicase/tocasefold
+uninorm/decomposing-form
+uninorm/u32-normalize
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-ct-casefold.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-ct-tolower b/gnulib/modules/unicase/u32-ct-tolower
new file mode 100644
index 00000000..085d6497
--- /dev/null
+++ b/gnulib/modules/unicase/u32-ct-tolower
@@ -0,0 +1,26 @@
+Description:
+Lowercase mapping for UTF-32 substrings (locale dependent).
+
+Files:
+lib/unicase/u32-ct-tolower.c
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-ct-tolower.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-ct-totitle b/gnulib/modules/unicase/u32-ct-totitle
new file mode 100644
index 00000000..bc702a33
--- /dev/null
+++ b/gnulib/modules/unicase/u32-ct-totitle
@@ -0,0 +1,38 @@
+Description:
+Titlecase mapping for UTF-32 substrings (locale dependent).
+
+Files:
+lib/unicase/u32-ct-totitle.c
+lib/unicase/u-ct-totitle.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/cased
+unicase/ignorable
+unicase/special-casing
+unicase/totitle
+unicase/tolower
+uniwbrk/u32-wordbreaks
+unictype/combining-class
+unictype/property-soft-dotted
+unistr/u32-mbtouc-unsafe
+unistr/u32-uctomb
+unistr/u32-cpy
+uninorm/u32-normalize
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-ct-totitle.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-ct-toupper b/gnulib/modules/unicase/u32-ct-toupper
new file mode 100644
index 00000000..1f3ae06b
--- /dev/null
+++ b/gnulib/modules/unicase/u32-ct-toupper
@@ -0,0 +1,26 @@
+Description:
+Uppercase mapping for UTF-32 substrings (locale dependent).
+
+Files:
+lib/unicase/u32-ct-toupper.c
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-ct-toupper.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-is-cased b/gnulib/modules/unicase/u32-is-cased
new file mode 100644
index 00000000..7d391f70
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-cased
@@ -0,0 +1,30 @@
+Description:
+Test whether case matters for an UTF-32 string.
+
+Files:
+lib/unicase/u32-is-cased.c
+lib/unicase/u-is-cased.h
+
+Depends-on:
+unicase/base
+unicase/u32-toupper
+unicase/u32-tolower
+unicase/u32-totitle
+uninorm/u32-normalize
+uninorm/nfd
+unistr/u32-cmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-is-cased.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-is-cased-tests b/gnulib/modules/unicase/u32-is-cased-tests
new file mode 100644
index 00000000..48342c55
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-cased-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u32-is-cased.c
+tests/unicase/test-is-cased.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-is-cased
+check_PROGRAMS += test-u32-is-cased
+test_u32_is_cased_SOURCES = unicase/test-u32-is-cased.c
+
diff --git a/gnulib/modules/unicase/u32-is-casefolded b/gnulib/modules/unicase/u32-is-casefolded
new file mode 100644
index 00000000..d98ef5e3
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-casefolded
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-32 string is already case-folded.
+
+Files:
+lib/unicase/u32-is-casefolded.c
+
+Depends-on:
+unicase/base
+unicase/u32-is-invariant
+unicase/u32-casefold
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-is-casefolded.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-is-casefolded-tests b/gnulib/modules/unicase/u32-is-casefolded-tests
new file mode 100644
index 00000000..78f27475
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-casefolded-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u32-is-casefolded.c
+tests/unicase/test-is-casefolded.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-is-casefolded
+check_PROGRAMS += test-u32-is-casefolded
+test_u32_is_casefolded_SOURCES = unicase/test-u32-is-casefolded.c
+
diff --git a/gnulib/modules/unicase/u32-is-invariant b/gnulib/modules/unicase/u32-is-invariant
new file mode 100644
index 00000000..e6ec3879
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-invariant
@@ -0,0 +1,30 @@
+Description:
+Test whether an UTF-32 string is invariant under a given case mapping.
+
+Files:
+lib/unicase/u32-is-invariant.c
+lib/unicase/invariant.h
+lib/unicase/u-is-invariant.h
+
+Depends-on:
+unitypes
+uninorm/base
+uninorm/u32-normalize
+uninorm/nfd
+unistr/u32-cmp
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-is-invariant.c
+
+Include:
+"unicase/invariant.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-is-lowercase b/gnulib/modules/unicase/u32-is-lowercase
new file mode 100644
index 00000000..7e9b251f
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-lowercase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-32 string is entirely lower case.
+
+Files:
+lib/unicase/u32-is-lowercase.c
+
+Depends-on:
+unicase/base
+unicase/u32-is-invariant
+unicase/u32-tolower
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-is-lowercase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-is-lowercase-tests b/gnulib/modules/unicase/u32-is-lowercase-tests
new file mode 100644
index 00000000..63765667
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-lowercase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u32-is-lowercase.c
+tests/unicase/test-is-lowercase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-is-lowercase
+check_PROGRAMS += test-u32-is-lowercase
+test_u32_is_lowercase_SOURCES = unicase/test-u32-is-lowercase.c
+
diff --git a/gnulib/modules/unicase/u32-is-titlecase b/gnulib/modules/unicase/u32-is-titlecase
new file mode 100644
index 00000000..3ce07eb2
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-titlecase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-32 string is entirely title case.
+
+Files:
+lib/unicase/u32-is-titlecase.c
+
+Depends-on:
+unicase/base
+unicase/u32-is-invariant
+unicase/u32-totitle
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-is-titlecase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-is-titlecase-tests b/gnulib/modules/unicase/u32-is-titlecase-tests
new file mode 100644
index 00000000..955542e3
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-titlecase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u32-is-titlecase.c
+tests/unicase/test-is-titlecase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-is-titlecase
+check_PROGRAMS += test-u32-is-titlecase
+test_u32_is_titlecase_SOURCES = unicase/test-u32-is-titlecase.c
+
diff --git a/gnulib/modules/unicase/u32-is-uppercase b/gnulib/modules/unicase/u32-is-uppercase
new file mode 100644
index 00000000..cbe5a163
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-uppercase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-32 string is entirely upper case.
+
+Files:
+lib/unicase/u32-is-uppercase.c
+
+Depends-on:
+unicase/base
+unicase/u32-is-invariant
+unicase/u32-toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-is-uppercase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-is-uppercase-tests b/gnulib/modules/unicase/u32-is-uppercase-tests
new file mode 100644
index 00000000..a0689bcb
--- /dev/null
+++ b/gnulib/modules/unicase/u32-is-uppercase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u32-is-uppercase.c
+tests/unicase/test-is-uppercase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-is-uppercase
+check_PROGRAMS += test-u32-is-uppercase
+test_u32_is_uppercase_SOURCES = unicase/test-u32-is-uppercase.c
+
diff --git a/gnulib/modules/unicase/u32-prefix-context b/gnulib/modules/unicase/u32-prefix-context
new file mode 100644
index 00000000..4804b9db
--- /dev/null
+++ b/gnulib/modules/unicase/u32-prefix-context
@@ -0,0 +1,30 @@
+Description:
+Case-mapping context of prefix UTF-32 string.
+
+Files:
+lib/unicase/u32-prefix-context.c
+lib/unicase/u-prefix-context.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/empty-prefix-context
+unicase/ignorable
+unictype/combining-class
+unistr/u32-mbtouc-unsafe
+unistr/u32-prev
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-prefix-context.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-suffix-context b/gnulib/modules/unicase/u32-suffix-context
new file mode 100644
index 00000000..3ab0c630
--- /dev/null
+++ b/gnulib/modules/unicase/u32-suffix-context
@@ -0,0 +1,29 @@
+Description:
+Case-mapping context of suffix UTF-32 string.
+
+Files:
+lib/unicase/u32-suffix-context.c
+lib/unicase/u-suffix-context.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/empty-prefix-context
+unicase/ignorable
+unictype/combining-class
+unistr/u32-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-suffix-context.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-tolower b/gnulib/modules/unicase/u32-tolower
new file mode 100644
index 00000000..4aea8a75
--- /dev/null
+++ b/gnulib/modules/unicase/u32-tolower
@@ -0,0 +1,28 @@
+Description:
+Lowercase mapping for UTF-32 strings (locale dependent).
+
+Files:
+lib/unicase/u32-tolower.c
+
+Depends-on:
+unicase/base
+unicase/u32-casemap
+unicase/special-casing
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+unicase/tolower
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-tolower.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-tolower-tests b/gnulib/modules/unicase/u32-tolower-tests
new file mode 100644
index 00000000..b481a097
--- /dev/null
+++ b/gnulib/modules/unicase/u32-tolower-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u32-tolower.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-tolower
+check_PROGRAMS += test-u32-tolower
+test_u32_tolower_SOURCES = unicase/test-u32-tolower.c
+
diff --git a/gnulib/modules/unicase/u32-totitle b/gnulib/modules/unicase/u32-totitle
new file mode 100644
index 00000000..1a594353
--- /dev/null
+++ b/gnulib/modules/unicase/u32-totitle
@@ -0,0 +1,27 @@
+Description:
+Titlecase mapping for UTF-32 strings (locale dependent).
+
+Files:
+lib/unicase/u32-totitle.c
+lib/unicase/u-totitle.h
+
+Depends-on:
+unicase/base
+unicase/u32-ct-totitle
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-totitle.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-totitle-tests b/gnulib/modules/unicase/u32-totitle-tests
new file mode 100644
index 00000000..32202e2b
--- /dev/null
+++ b/gnulib/modules/unicase/u32-totitle-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u32-totitle.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-totitle
+check_PROGRAMS += test-u32-totitle
+test_u32_totitle_SOURCES = unicase/test-u32-totitle.c
+
diff --git a/gnulib/modules/unicase/u32-toupper b/gnulib/modules/unicase/u32-toupper
new file mode 100644
index 00000000..79d9e15f
--- /dev/null
+++ b/gnulib/modules/unicase/u32-toupper
@@ -0,0 +1,28 @@
+Description:
+Uppercase mapping for UTF-32 strings (locale dependent).
+
+Files:
+lib/unicase/u32-toupper.c
+
+Depends-on:
+unicase/base
+unicase/u32-casemap
+unicase/special-casing
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u32-toupper.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u32-toupper-tests b/gnulib/modules/unicase/u32-toupper-tests
new file mode 100644
index 00000000..177caed0
--- /dev/null
+++ b/gnulib/modules/unicase/u32-toupper-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u32-toupper.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-toupper
+check_PROGRAMS += test-u32-toupper
+test_u32_toupper_SOURCES = unicase/test-u32-toupper.c
+
diff --git a/gnulib/modules/unicase/u8-casecmp b/gnulib/modules/unicase/u8-casecmp
new file mode 100644
index 00000000..b4fdba87
--- /dev/null
+++ b/gnulib/modules/unicase/u8-casecmp
@@ -0,0 +1,28 @@
+Description:
+Case and normalization insensitive comparison of UTF-8 strings.
+
+Files:
+lib/unicase/u8-casecmp.c
+lib/unicase/u-casecmp.h
+
+Depends-on:
+unicase/base
+unicase/u8-casefold
+uninorm/decomposing-form
+unistr/u8-cmp2
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-casecmp.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-casecmp-tests b/gnulib/modules/unicase/u8-casecmp-tests
new file mode 100644
index 00000000..799a82ec
--- /dev/null
+++ b/gnulib/modules/unicase/u8-casecmp-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u8-casecmp.c
+tests/unicase/test-casecmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-casecmp
+check_PROGRAMS += test-u8-casecmp
+test_u8_casecmp_SOURCES = unicase/test-u8-casecmp.c
+
diff --git a/gnulib/modules/unicase/u8-casecoll b/gnulib/modules/unicase/u8-casecoll
new file mode 100644
index 00000000..f6b61575
--- /dev/null
+++ b/gnulib/modules/unicase/u8-casecoll
@@ -0,0 +1,27 @@
+Description:
+Locale dependent, case and normalization insensitive comparison of UTF-8
+strings.
+
+Files:
+lib/unicase/u8-casecoll.c
+lib/unicase/u-casecoll.h
+
+Depends-on:
+unicase/base
+unicase/u8-casexfrm
+memcmp2
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-casecoll.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-casecoll-tests b/gnulib/modules/unicase/u8-casecoll-tests
new file mode 100644
index 00000000..c58020a5
--- /dev/null
+++ b/gnulib/modules/unicase/u8-casecoll-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unicase/test-u8-casecoll.c
+tests/unicase/test-casecmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-casecoll
+check_PROGRAMS += test-u8-casecoll
+test_u8_casecoll_SOURCES = unicase/test-u8-casecoll.c
+test_u8_casecoll_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/unicase/u8-casefold b/gnulib/modules/unicase/u8-casefold
new file mode 100644
index 00000000..16871849
--- /dev/null
+++ b/gnulib/modules/unicase/u8-casefold
@@ -0,0 +1,27 @@
+Description:
+Casefolding mapping for UTF-8 strings (locale dependent).
+
+Files:
+lib/unicase/u8-casefold.c
+lib/unicase/u-casefold.h
+
+Depends-on:
+unicase/base
+unicase/u8-ct-casefold
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-casefold.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-casefold-tests b/gnulib/modules/unicase/u8-casefold-tests
new file mode 100644
index 00000000..db22f394
--- /dev/null
+++ b/gnulib/modules/unicase/u8-casefold-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unicase/test-u8-casefold.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+uninorm/nfc
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-casefold
+check_PROGRAMS += test-u8-casefold
+test_u8_casefold_SOURCES = unicase/test-u8-casefold.c
+
diff --git a/gnulib/modules/unicase/u8-casemap b/gnulib/modules/unicase/u8-casemap
new file mode 100644
index 00000000..3c482da0
--- /dev/null
+++ b/gnulib/modules/unicase/u8-casemap
@@ -0,0 +1,36 @@
+Description:
+Case mapping for UTF-8 strings (locale dependent).
+
+Files:
+lib/unicase/unicasemap.h
+lib/unicase/u8-casemap.c
+lib/unicase/u-casemap.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/cased
+unicase/ignorable
+unicase/special-casing
+unictype/combining-class
+unictype/property-soft-dotted
+unistr/u8-mbtouc-unsafe
+unistr/u8-uctomb
+unistr/u8-cpy
+uninorm/u8-normalize
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-casemap.c
+
+Include:
+"unicase/unicasemap.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-casexfrm b/gnulib/modules/unicase/u8-casexfrm
new file mode 100644
index 00000000..474a179c
--- /dev/null
+++ b/gnulib/modules/unicase/u8-casexfrm
@@ -0,0 +1,29 @@
+Description:
+Locale dependent transformation for case insensitive comparison of UTF-8
+strings.
+
+Files:
+lib/unicase/u8-casexfrm.c
+lib/unicase/u-casexfrm.h
+
+Depends-on:
+unicase/base
+unicase/u8-casefold
+uniconv/u8-conv-to-enc
+localcharset
+memxfrm
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-casexfrm.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-ct-casefold b/gnulib/modules/unicase/u8-ct-casefold
new file mode 100644
index 00000000..d82086cb
--- /dev/null
+++ b/gnulib/modules/unicase/u8-ct-casefold
@@ -0,0 +1,30 @@
+Description:
+Casefolding mapping for UTF-8 substrings (locale dependent).
+
+Files:
+lib/unicase/u8-ct-casefold.c
+lib/unicase/u-ct-casefold.h
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/tocasefold
+uninorm/decomposing-form
+uninorm/u8-normalize
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-ct-casefold.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-ct-tolower b/gnulib/modules/unicase/u8-ct-tolower
new file mode 100644
index 00000000..28349226
--- /dev/null
+++ b/gnulib/modules/unicase/u8-ct-tolower
@@ -0,0 +1,26 @@
+Description:
+Lowercase mapping for UTF-8 substrings (locale dependent).
+
+Files:
+lib/unicase/u8-ct-tolower.c
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-ct-tolower.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-ct-totitle b/gnulib/modules/unicase/u8-ct-totitle
new file mode 100644
index 00000000..86166381
--- /dev/null
+++ b/gnulib/modules/unicase/u8-ct-totitle
@@ -0,0 +1,38 @@
+Description:
+Titlecase mapping for UTF-8 substrings (locale dependent).
+
+Files:
+lib/unicase/u8-ct-totitle.c
+lib/unicase/u-ct-totitle.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/cased
+unicase/ignorable
+unicase/special-casing
+unicase/totitle
+unicase/tolower
+uniwbrk/u8-wordbreaks
+unictype/combining-class
+unictype/property-soft-dotted
+unistr/u8-mbtouc-unsafe
+unistr/u8-uctomb
+unistr/u8-cpy
+uninorm/u8-normalize
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-ct-totitle.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-ct-toupper b/gnulib/modules/unicase/u8-ct-toupper
new file mode 100644
index 00000000..3f43adb3
--- /dev/null
+++ b/gnulib/modules/unicase/u8-ct-toupper
@@ -0,0 +1,26 @@
+Description:
+Uppercase mapping for UTF-8 substrings (locale dependent).
+
+Files:
+lib/unicase/u8-ct-toupper.c
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-ct-toupper.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-is-cased b/gnulib/modules/unicase/u8-is-cased
new file mode 100644
index 00000000..be054019
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-cased
@@ -0,0 +1,30 @@
+Description:
+Test whether case matters for an UTF-8 string.
+
+Files:
+lib/unicase/u8-is-cased.c
+lib/unicase/u-is-cased.h
+
+Depends-on:
+unicase/base
+unicase/u8-toupper
+unicase/u8-tolower
+unicase/u8-totitle
+uninorm/u8-normalize
+uninorm/nfd
+unistr/u8-cmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-is-cased.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-is-cased-tests b/gnulib/modules/unicase/u8-is-cased-tests
new file mode 100644
index 00000000..cfc65276
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-cased-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u8-is-cased.c
+tests/unicase/test-is-cased.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-is-cased
+check_PROGRAMS += test-u8-is-cased
+test_u8_is_cased_SOURCES = unicase/test-u8-is-cased.c
+
diff --git a/gnulib/modules/unicase/u8-is-casefolded b/gnulib/modules/unicase/u8-is-casefolded
new file mode 100644
index 00000000..791ad0a7
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-casefolded
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-8 string is already case-folded.
+
+Files:
+lib/unicase/u8-is-casefolded.c
+
+Depends-on:
+unicase/base
+unicase/u8-is-invariant
+unicase/u8-casefold
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-is-casefolded.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-is-casefolded-tests b/gnulib/modules/unicase/u8-is-casefolded-tests
new file mode 100644
index 00000000..7a4b0482
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-casefolded-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u8-is-casefolded.c
+tests/unicase/test-is-casefolded.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-is-casefolded
+check_PROGRAMS += test-u8-is-casefolded
+test_u8_is_casefolded_SOURCES = unicase/test-u8-is-casefolded.c
+
diff --git a/gnulib/modules/unicase/u8-is-invariant b/gnulib/modules/unicase/u8-is-invariant
new file mode 100644
index 00000000..40cacdd4
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-invariant
@@ -0,0 +1,30 @@
+Description:
+Test whether an UTF-8 string is invariant under a given case mapping.
+
+Files:
+lib/unicase/u8-is-invariant.c
+lib/unicase/invariant.h
+lib/unicase/u-is-invariant.h
+
+Depends-on:
+unitypes
+uninorm/base
+uninorm/u8-normalize
+uninorm/nfd
+unistr/u8-cmp
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-is-invariant.c
+
+Include:
+"unicase/invariant.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-is-lowercase b/gnulib/modules/unicase/u8-is-lowercase
new file mode 100644
index 00000000..debc2cc8
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-lowercase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-8 string is entirely lower case.
+
+Files:
+lib/unicase/u8-is-lowercase.c
+
+Depends-on:
+unicase/base
+unicase/u8-is-invariant
+unicase/u8-tolower
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-is-lowercase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-is-lowercase-tests b/gnulib/modules/unicase/u8-is-lowercase-tests
new file mode 100644
index 00000000..c1ef0b57
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-lowercase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u8-is-lowercase.c
+tests/unicase/test-is-lowercase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-is-lowercase
+check_PROGRAMS += test-u8-is-lowercase
+test_u8_is_lowercase_SOURCES = unicase/test-u8-is-lowercase.c
+
diff --git a/gnulib/modules/unicase/u8-is-titlecase b/gnulib/modules/unicase/u8-is-titlecase
new file mode 100644
index 00000000..4e8d9eef
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-titlecase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-8 string is entirely title case.
+
+Files:
+lib/unicase/u8-is-titlecase.c
+
+Depends-on:
+unicase/base
+unicase/u8-is-invariant
+unicase/u8-totitle
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-is-titlecase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-is-titlecase-tests b/gnulib/modules/unicase/u8-is-titlecase-tests
new file mode 100644
index 00000000..c35c2ac1
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-titlecase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u8-is-titlecase.c
+tests/unicase/test-is-titlecase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-is-titlecase
+check_PROGRAMS += test-u8-is-titlecase
+test_u8_is_titlecase_SOURCES = unicase/test-u8-is-titlecase.c
+
diff --git a/gnulib/modules/unicase/u8-is-uppercase b/gnulib/modules/unicase/u8-is-uppercase
new file mode 100644
index 00000000..d7ebfe05
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-uppercase
@@ -0,0 +1,25 @@
+Description:
+Test whether an UTF-8 string is entirely upper case.
+
+Files:
+lib/unicase/u8-is-uppercase.c
+
+Depends-on:
+unicase/base
+unicase/u8-is-invariant
+unicase/u8-toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-is-uppercase.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-is-uppercase-tests b/gnulib/modules/unicase/u8-is-uppercase-tests
new file mode 100644
index 00000000..9bf0811e
--- /dev/null
+++ b/gnulib/modules/unicase/u8-is-uppercase-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unicase/test-u8-is-uppercase.c
+tests/unicase/test-is-uppercase.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-is-uppercase
+check_PROGRAMS += test-u8-is-uppercase
+test_u8_is_uppercase_SOURCES = unicase/test-u8-is-uppercase.c
+
diff --git a/gnulib/modules/unicase/u8-prefix-context b/gnulib/modules/unicase/u8-prefix-context
new file mode 100644
index 00000000..267bfe6f
--- /dev/null
+++ b/gnulib/modules/unicase/u8-prefix-context
@@ -0,0 +1,30 @@
+Description:
+Case-mapping context of prefix UTF-8 string.
+
+Files:
+lib/unicase/u8-prefix-context.c
+lib/unicase/u-prefix-context.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/empty-prefix-context
+unicase/ignorable
+unictype/combining-class
+unistr/u8-mbtouc-unsafe
+unistr/u8-prev
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-prefix-context.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-suffix-context b/gnulib/modules/unicase/u8-suffix-context
new file mode 100644
index 00000000..02f77725
--- /dev/null
+++ b/gnulib/modules/unicase/u8-suffix-context
@@ -0,0 +1,29 @@
+Description:
+Case-mapping context of suffix UTF-8 string.
+
+Files:
+lib/unicase/u8-suffix-context.c
+lib/unicase/u-suffix-context.h
+lib/unicase/context.h
+
+Depends-on:
+unicase/base
+unicase/empty-prefix-context
+unicase/ignorable
+unictype/combining-class
+unistr/u8-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-suffix-context.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-tolower b/gnulib/modules/unicase/u8-tolower
new file mode 100644
index 00000000..89afce91
--- /dev/null
+++ b/gnulib/modules/unicase/u8-tolower
@@ -0,0 +1,28 @@
+Description:
+Lowercase mapping for UTF-8 strings (locale dependent).
+
+Files:
+lib/unicase/u8-tolower.c
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+unicase/tolower
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-tolower.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-tolower-tests b/gnulib/modules/unicase/u8-tolower-tests
new file mode 100644
index 00000000..f07483d3
--- /dev/null
+++ b/gnulib/modules/unicase/u8-tolower-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u8-tolower.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-tolower
+check_PROGRAMS += test-u8-tolower
+test_u8_tolower_SOURCES = unicase/test-u8-tolower.c
+
diff --git a/gnulib/modules/unicase/u8-totitle b/gnulib/modules/unicase/u8-totitle
new file mode 100644
index 00000000..f576f4d7
--- /dev/null
+++ b/gnulib/modules/unicase/u8-totitle
@@ -0,0 +1,27 @@
+Description:
+Titlecase mapping for UTF-8 strings (locale dependent).
+
+Files:
+lib/unicase/u8-totitle.c
+lib/unicase/u-totitle.h
+
+Depends-on:
+unicase/base
+unicase/u8-ct-totitle
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-totitle.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-totitle-tests b/gnulib/modules/unicase/u8-totitle-tests
new file mode 100644
index 00000000..bccf5a3f
--- /dev/null
+++ b/gnulib/modules/unicase/u8-totitle-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u8-totitle.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-totitle
+check_PROGRAMS += test-u8-totitle
+test_u8_totitle_SOURCES = unicase/test-u8-totitle.c
+
diff --git a/gnulib/modules/unicase/u8-toupper b/gnulib/modules/unicase/u8-toupper
new file mode 100644
index 00000000..2e52e83a
--- /dev/null
+++ b/gnulib/modules/unicase/u8-toupper
@@ -0,0 +1,28 @@
+Description:
+Uppercase mapping for UTF-8 strings (locale dependent).
+
+Files:
+lib/unicase/u8-toupper.c
+
+Depends-on:
+unicase/base
+unicase/u8-casemap
+unicase/special-casing
+unicase/empty-prefix-context
+unicase/empty-suffix-context
+unicase/toupper
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/u8-toupper.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/u8-toupper-tests b/gnulib/modules/unicase/u8-toupper-tests
new file mode 100644
index 00000000..d6ffa178
--- /dev/null
+++ b/gnulib/modules/unicase/u8-toupper-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unicase/test-u8-toupper.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-toupper
+check_PROGRAMS += test-u8-toupper
+test_u8_toupper_SOURCES = unicase/test-u8-toupper.c
+
diff --git a/gnulib/modules/unicase/ulc-casecmp b/gnulib/modules/unicase/ulc-casecmp
new file mode 100644
index 00000000..ad1b96de
--- /dev/null
+++ b/gnulib/modules/unicase/ulc-casecmp
@@ -0,0 +1,30 @@
+Description:
+Case and normalization insensitive comparison of strings.
+
+Files:
+lib/unicase/ulc-casecmp.c
+lib/unicase/u-casecmp.h
+
+Depends-on:
+unicase/base
+unicase/u8-casefold
+uninorm/decomposing-form
+uniconv/u8-conv-from-enc
+unistr/u8-cmp2
+localcharset
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/ulc-casecmp.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/ulc-casecmp-tests b/gnulib/modules/unicase/ulc-casecmp-tests
new file mode 100644
index 00000000..93ac72c0
--- /dev/null
+++ b/gnulib/modules/unicase/ulc-casecmp-tests
@@ -0,0 +1,25 @@
+Files:
+tests/unicase/test-ulc-casecmp1.sh
+tests/unicase/test-ulc-casecmp2.sh
+tests/unicase/test-ulc-casecmp.c
+tests/unicase/test-casecmp.h
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+uninorm/nfd
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += unicase/test-ulc-casecmp1.sh unicase/test-ulc-casecmp2.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-ulc-casecmp
+test_ulc_casecmp_SOURCES = unicase/test-ulc-casecmp.c
+test_ulc_casecmp_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/unicase/ulc-casecoll b/gnulib/modules/unicase/ulc-casecoll
new file mode 100644
index 00000000..7762cef5
--- /dev/null
+++ b/gnulib/modules/unicase/ulc-casecoll
@@ -0,0 +1,26 @@
+Description:
+Locale dependent, case and normalization insensitive comparison of strings.
+
+Files:
+lib/unicase/ulc-casecoll.c
+lib/unicase/u-casecoll.h
+
+Depends-on:
+unicase/base
+unicase/ulc-casexfrm
+memcmp2
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/ulc-casecoll.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicase/ulc-casecoll-tests b/gnulib/modules/unicase/ulc-casecoll-tests
new file mode 100644
index 00000000..11c6f59d
--- /dev/null
+++ b/gnulib/modules/unicase/ulc-casecoll-tests
@@ -0,0 +1,25 @@
+Files:
+tests/unicase/test-ulc-casecoll1.sh
+tests/unicase/test-ulc-casecoll2.sh
+tests/unicase/test-ulc-casecoll.c
+tests/unicase/test-casecmp.h
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+uninorm/nfc
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += unicase/test-ulc-casecoll1.sh unicase/test-ulc-casecoll2.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-ulc-casecoll
+test_ulc_casecoll_SOURCES = unicase/test-ulc-casecoll.c
+test_ulc_casecoll_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/unicase/ulc-casexfrm b/gnulib/modules/unicase/ulc-casexfrm
new file mode 100644
index 00000000..48e2eca1
--- /dev/null
+++ b/gnulib/modules/unicase/ulc-casexfrm
@@ -0,0 +1,26 @@
+Description:
+Locale dependent transformation for case insensitive comparison of strings.
+
+Files:
+lib/unicase/ulc-casexfrm.c
+
+Depends-on:
+unicase/base
+unicase/u8-casexfrm
+uniconv/u8-conv-from-enc
+localcharset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unicase/ulc-casexfrm.c
+
+Include:
+"unicase.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unicodeio b/gnulib/modules/unicodeio
new file mode 100644
index 00000000..8231569c
--- /dev/null
+++ b/gnulib/modules/unicodeio
@@ -0,0 +1,35 @@
+Description:
+Unicode character output to streams with locale dependent encoding.
+
+Files:
+lib/unicodeio.h
+lib/unicodeio.c
+m4/unicodeio.m4
+
+Depends-on:
+unistr/u8-uctomb
+iconv
+iconv_open
+gettext-h
+localcharset
+error
+ignore-value
+
+configure.ac:
+gl_UNICODEIO
+
+Makefile.am:
+lib_SOURCES += unicodeio.h unicodeio.c
+
+Include:
+"unicodeio.h"
+
+Link:
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/base b/gnulib/modules/uniconv/base
new file mode 100644
index 00000000..b5c67865
--- /dev/null
+++ b/gnulib/modules/uniconv/base
@@ -0,0 +1,25 @@
+Description:
+Base layer for conversion from/to legacy encodings.
+
+Files:
+lib/uniconv.h
+lib/iconveh.h
+lib/striconveha.h
+lib/localcharset.h
+
+Depends-on:
+unitypes
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u16-conv-from-enc b/gnulib/modules/uniconv/u16-conv-from-enc
new file mode 100644
index 00000000..acb9c990
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-conv-from-enc
@@ -0,0 +1,30 @@
+Description:
+Conversion to UTF-16 from legacy encodings.
+
+Files:
+lib/uniconv/u16-conv-from-enc.c
+lib/uniconv/u-conv-from-enc.h
+
+Depends-on:
+uniconv/base
+striconveha
+uniconv/u8-conv-from-enc
+unistr/u8-to-u16
+unistr/u8-mblen
+unistr/u16-mblen
+
+configure.ac:
+AC_REQUIRE([gl_BIGENDIAN])
+
+Makefile.am:
+lib_SOURCES += uniconv/u16-conv-from-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u16-conv-from-enc-tests b/gnulib/modules/uniconv/u16-conv-from-enc-tests
new file mode 100644
index 00000000..df46e178
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-conv-from-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u16-conv-from-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-conv-from-enc
+check_PROGRAMS += test-u16-conv-from-enc
+test_u16_conv_from_enc_SOURCES = uniconv/test-u16-conv-from-enc.c
+test_u16_conv_from_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u16-conv-to-enc b/gnulib/modules/uniconv/u16-conv-to-enc
new file mode 100644
index 00000000..2a5012e7
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-conv-to-enc
@@ -0,0 +1,31 @@
+Description:
+Conversion from UTF-16 to legacy encodings.
+
+Files:
+lib/uniconv/u16-conv-to-enc.c
+lib/uniconv/u-conv-to-enc.h
+
+Depends-on:
+uniconv/base
+striconveha
+uniconv/u8-conv-to-enc
+unistr/u16-mbtoucr
+unistr/u8-uctomb
+unistr/u16-mblen
+unistr/u8-mblen
+
+configure.ac:
+AC_REQUIRE([gl_BIGENDIAN])
+
+Makefile.am:
+lib_SOURCES += uniconv/u16-conv-to-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u16-conv-to-enc-tests b/gnulib/modules/uniconv/u16-conv-to-enc-tests
new file mode 100644
index 00000000..cb0dd013
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-conv-to-enc-tests
@@ -0,0 +1,14 @@
+Files:
+tests/uniconv/test-u16-conv-to-enc.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-conv-to-enc
+check_PROGRAMS += test-u16-conv-to-enc
+test_u16_conv_to_enc_SOURCES = uniconv/test-u16-conv-to-enc.c
+test_u16_conv_to_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u16-strconv-from-enc b/gnulib/modules/uniconv/u16-strconv-from-enc
new file mode 100644
index 00000000..a7da446a
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-strconv-from-enc
@@ -0,0 +1,26 @@
+Description:
+Conversion to UTF-16 from legacy encodings.
+
+Files:
+lib/uniconv/u16-strconv-from-enc.c
+lib/uniconv/u-strconv-from-enc.h
+
+Depends-on:
+uniconv/base
+uniconv/u16-conv-from-enc
+unistr/u16-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u16-strconv-from-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u16-strconv-from-enc-tests b/gnulib/modules/uniconv/u16-strconv-from-enc-tests
new file mode 100644
index 00000000..67f96def
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-strconv-from-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u16-strconv-from-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-strcmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strconv-from-enc
+check_PROGRAMS += test-u16-strconv-from-enc
+test_u16_strconv_from_enc_SOURCES = uniconv/test-u16-strconv-from-enc.c
+test_u16_strconv_from_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u16-strconv-from-locale b/gnulib/modules/uniconv/u16-strconv-from-locale
new file mode 100644
index 00000000..a8dc48fb
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-strconv-from-locale
@@ -0,0 +1,25 @@
+Description:
+Conversion to UTF-16 from the locale encoding.
+
+Files:
+lib/uniconv/u16-strconv-from-locale.c
+
+Depends-on:
+uniconv/base
+uniconv/u16-strconv-from-enc
+localcharset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u16-strconv-from-locale.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u16-strconv-to-enc b/gnulib/modules/uniconv/u16-strconv-to-enc
new file mode 100644
index 00000000..6b6b5518
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-strconv-to-enc
@@ -0,0 +1,29 @@
+Description:
+Conversion from UTF-16 to legacy encodings.
+
+Files:
+lib/uniconv/u16-strconv-to-enc.c
+lib/uniconv/u-strconv-to-enc.h
+
+Depends-on:
+uniconv/base
+striconveha
+uniconv/u8-strconv-to-enc
+unistr/u16-to-u8
+unistr/u16-strlen
+
+configure.ac:
+AC_REQUIRE([gl_BIGENDIAN])
+
+Makefile.am:
+lib_SOURCES += uniconv/u16-strconv-to-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u16-strconv-to-enc-tests b/gnulib/modules/uniconv/u16-strconv-to-enc-tests
new file mode 100644
index 00000000..c1865bf6
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-strconv-to-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u16-strconv-to-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-strcmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strconv-to-enc
+check_PROGRAMS += test-u16-strconv-to-enc
+test_u16_strconv_to_enc_SOURCES = uniconv/test-u16-strconv-to-enc.c
+test_u16_strconv_to_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u16-strconv-to-locale b/gnulib/modules/uniconv/u16-strconv-to-locale
new file mode 100644
index 00000000..264370ce
--- /dev/null
+++ b/gnulib/modules/uniconv/u16-strconv-to-locale
@@ -0,0 +1,25 @@
+Description:
+Conversion from UTF-16 to the locale encoding.
+
+Files:
+lib/uniconv/u16-strconv-to-locale.c
+
+Depends-on:
+uniconv/base
+uniconv/u16-strconv-to-enc
+localcharset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u16-strconv-to-locale.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u32-conv-from-enc b/gnulib/modules/uniconv/u32-conv-from-enc
new file mode 100644
index 00000000..2203c705
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-conv-from-enc
@@ -0,0 +1,29 @@
+Description:
+Conversion to UTF-32 from legacy encodings.
+
+Files:
+lib/uniconv/u32-conv-from-enc.c
+lib/uniconv/u-conv-from-enc.h
+
+Depends-on:
+uniconv/base
+striconveha
+uniconv/u8-conv-from-enc
+unistr/u8-to-u32
+unistr/u8-mblen
+unistr/u32-mblen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u32-conv-from-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u32-conv-from-enc-tests b/gnulib/modules/uniconv/u32-conv-from-enc-tests
new file mode 100644
index 00000000..94a3b8c0
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-conv-from-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u32-conv-from-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-conv-from-enc
+check_PROGRAMS += test-u32-conv-from-enc
+test_u32_conv_from_enc_SOURCES = uniconv/test-u32-conv-from-enc.c
+test_u32_conv_from_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u32-conv-to-enc b/gnulib/modules/uniconv/u32-conv-to-enc
new file mode 100644
index 00000000..798d9666
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-conv-to-enc
@@ -0,0 +1,29 @@
+Description:
+Conversion from UTF-32 to legacy encodings.
+
+Files:
+lib/uniconv/u32-conv-to-enc.c
+lib/uniconv/u-conv-to-enc.h
+
+Depends-on:
+uniconv/base
+striconveha
+uniconv/u8-conv-to-enc
+unistr/u32-to-u8
+unistr/u32-mblen
+unistr/u8-mblen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u32-conv-to-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u32-conv-to-enc-tests b/gnulib/modules/uniconv/u32-conv-to-enc-tests
new file mode 100644
index 00000000..934d7e49
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-conv-to-enc-tests
@@ -0,0 +1,14 @@
+Files:
+tests/uniconv/test-u32-conv-to-enc.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-conv-to-enc
+check_PROGRAMS += test-u32-conv-to-enc
+test_u32_conv_to_enc_SOURCES = uniconv/test-u32-conv-to-enc.c
+test_u32_conv_to_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u32-strconv-from-enc b/gnulib/modules/uniconv/u32-strconv-from-enc
new file mode 100644
index 00000000..bdc2e688
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-strconv-from-enc
@@ -0,0 +1,26 @@
+Description:
+Conversion to UTF-32 from legacy encodings.
+
+Files:
+lib/uniconv/u32-strconv-from-enc.c
+lib/uniconv/u-strconv-from-enc.h
+
+Depends-on:
+uniconv/base
+uniconv/u32-conv-from-enc
+unistr/u32-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u32-strconv-from-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u32-strconv-from-enc-tests b/gnulib/modules/uniconv/u32-strconv-from-enc-tests
new file mode 100644
index 00000000..a01fbf2e
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-strconv-from-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u32-strconv-from-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-strcmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strconv-from-enc
+check_PROGRAMS += test-u32-strconv-from-enc
+test_u32_strconv_from_enc_SOURCES = uniconv/test-u32-strconv-from-enc.c
+test_u32_strconv_from_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u32-strconv-from-locale b/gnulib/modules/uniconv/u32-strconv-from-locale
new file mode 100644
index 00000000..2569ab7b
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-strconv-from-locale
@@ -0,0 +1,25 @@
+Description:
+Conversion to UTF-32 from the locale encoding.
+
+Files:
+lib/uniconv/u32-strconv-from-locale.c
+
+Depends-on:
+uniconv/base
+uniconv/u32-strconv-from-enc
+localcharset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u32-strconv-from-locale.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u32-strconv-to-enc b/gnulib/modules/uniconv/u32-strconv-to-enc
new file mode 100644
index 00000000..27c8adc9
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-strconv-to-enc
@@ -0,0 +1,28 @@
+Description:
+Conversion from UTF-32 to legacy encodings.
+
+Files:
+lib/uniconv/u32-strconv-to-enc.c
+lib/uniconv/u-strconv-to-enc.h
+
+Depends-on:
+uniconv/base
+striconveha
+uniconv/u8-strconv-to-enc
+unistr/u32-to-u8
+unistr/u32-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u32-strconv-to-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u32-strconv-to-enc-tests b/gnulib/modules/uniconv/u32-strconv-to-enc-tests
new file mode 100644
index 00000000..7188c321
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-strconv-to-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u32-strconv-to-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-strcmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strconv-to-enc
+check_PROGRAMS += test-u32-strconv-to-enc
+test_u32_strconv_to_enc_SOURCES = uniconv/test-u32-strconv-to-enc.c
+test_u32_strconv_to_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u32-strconv-to-locale b/gnulib/modules/uniconv/u32-strconv-to-locale
new file mode 100644
index 00000000..27631865
--- /dev/null
+++ b/gnulib/modules/uniconv/u32-strconv-to-locale
@@ -0,0 +1,25 @@
+Description:
+Conversion from UTF-32 to the locale encoding.
+
+Files:
+lib/uniconv/u32-strconv-to-locale.c
+
+Depends-on:
+uniconv/base
+uniconv/u32-strconv-to-enc
+localcharset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u32-strconv-to-locale.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u8-conv-from-enc b/gnulib/modules/uniconv/u8-conv-from-enc
new file mode 100644
index 00000000..f3f9c671
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-conv-from-enc
@@ -0,0 +1,27 @@
+Description:
+Conversion to UTF-8 from legacy encodings.
+
+Files:
+lib/uniconv/u8-conv-from-enc.c
+
+Depends-on:
+uniconv/base
+c-strcaseeq
+striconveha
+unistr/u8-check
+unistr/u8-mblen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u8-conv-from-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u8-conv-from-enc-tests b/gnulib/modules/uniconv/u8-conv-from-enc-tests
new file mode 100644
index 00000000..d11cd52d
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-conv-from-enc-tests
@@ -0,0 +1,16 @@
+Files:
+tests/uniconv/test-u8-conv-from-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-strlen
+unistr/u8-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-conv-from-enc
+check_PROGRAMS += test-u8-conv-from-enc
+test_u8_conv_from_enc_SOURCES = uniconv/test-u8-conv-from-enc.c
+test_u8_conv_from_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u8-conv-to-enc b/gnulib/modules/uniconv/u8-conv-to-enc
new file mode 100644
index 00000000..1d82b0eb
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-conv-to-enc
@@ -0,0 +1,26 @@
+Description:
+Conversion from UTF-8 to legacy encodings.
+
+Files:
+lib/uniconv/u8-conv-to-enc.c
+
+Depends-on:
+uniconv/base
+c-strcaseeq
+striconveha
+unistr/u8-check
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u8-conv-to-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u8-conv-to-enc-tests b/gnulib/modules/uniconv/u8-conv-to-enc-tests
new file mode 100644
index 00000000..9fe4134d
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-conv-to-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u8-conv-to-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-strlen
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-conv-to-enc
+check_PROGRAMS += test-u8-conv-to-enc
+test_u8_conv_to_enc_SOURCES = uniconv/test-u8-conv-to-enc.c
+test_u8_conv_to_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u8-strconv-from-enc b/gnulib/modules/uniconv/u8-strconv-from-enc
new file mode 100644
index 00000000..f3a4cdf9
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-strconv-from-enc
@@ -0,0 +1,26 @@
+Description:
+Conversion to UTF-8 from legacy encodings.
+
+Files:
+lib/uniconv/u8-strconv-from-enc.c
+lib/uniconv/u-strconv-from-enc.h
+
+Depends-on:
+uniconv/base
+uniconv/u8-conv-from-enc
+unistr/u8-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u8-strconv-from-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u8-strconv-from-enc-tests b/gnulib/modules/uniconv/u8-strconv-from-enc-tests
new file mode 100644
index 00000000..90119d59
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-strconv-from-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u8-strconv-from-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-strcmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strconv-from-enc
+check_PROGRAMS += test-u8-strconv-from-enc
+test_u8_strconv_from_enc_SOURCES = uniconv/test-u8-strconv-from-enc.c
+test_u8_strconv_from_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u8-strconv-from-locale b/gnulib/modules/uniconv/u8-strconv-from-locale
new file mode 100644
index 00000000..f72d5b8e
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-strconv-from-locale
@@ -0,0 +1,25 @@
+Description:
+Conversion to UTF-8 from the locale encoding.
+
+Files:
+lib/uniconv/u8-strconv-from-locale.c
+
+Depends-on:
+uniconv/base
+uniconv/u8-strconv-from-enc
+localcharset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u8-strconv-from-locale.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u8-strconv-to-enc b/gnulib/modules/uniconv/u8-strconv-to-enc
new file mode 100644
index 00000000..bc30b8c2
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-strconv-to-enc
@@ -0,0 +1,27 @@
+Description:
+Conversion from UTF-8 to legacy encodings.
+
+Files:
+lib/uniconv/u8-strconv-to-enc.c
+
+Depends-on:
+uniconv/base
+c-strcaseeq
+striconveha
+unistr/u8-check
+unistr/u8-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u8-strconv-to-enc.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniconv/u8-strconv-to-enc-tests b/gnulib/modules/uniconv/u8-strconv-to-enc-tests
new file mode 100644
index 00000000..12409eda
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-strconv-to-enc-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uniconv/test-u8-strconv-to-enc.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-strcmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strconv-to-enc
+check_PROGRAMS += test-u8-strconv-to-enc
+test_u8_strconv_to_enc_SOURCES = uniconv/test-u8-strconv-to-enc.c
+test_u8_strconv_to_enc_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniconv/u8-strconv-to-locale b/gnulib/modules/uniconv/u8-strconv-to-locale
new file mode 100644
index 00000000..d7f625cd
--- /dev/null
+++ b/gnulib/modules/uniconv/u8-strconv-to-locale
@@ -0,0 +1,25 @@
+Description:
+Conversion from UTF-8 to the locale encoding.
+
+Files:
+lib/uniconv/u8-strconv-to-locale.c
+
+Depends-on:
+uniconv/base
+uniconv/u8-strconv-to-enc
+localcharset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniconv/u8-strconv-to-locale.c
+
+Include:
+"uniconv.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/base b/gnulib/modules/unictype/base
new file mode 100644
index 00000000..e2876981
--- /dev/null
+++ b/gnulib/modules/unictype/base
@@ -0,0 +1,23 @@
+Description:
+Base layer for Unicode classification and properties.
+
+Files:
+lib/unictype.h
+
+Depends-on:
+unitypes
+stdbool
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/bidicategory-all b/gnulib/modules/unictype/bidicategory-all
new file mode 100644
index 00000000..9e7aaa75
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-all
@@ -0,0 +1,25 @@
+Description:
+Complete API for Unicode character bidi categories.
+
+Files:
+
+Depends-on:
+unictype/base
+unictype/bidicategory-byname
+unictype/bidicategory-name
+unictype/bidicategory-of
+unictype/bidicategory-test
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/bidicategory-byname b/gnulib/modules/unictype/bidicategory-byname
new file mode 100644
index 00000000..8185a501
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-byname
@@ -0,0 +1,23 @@
+Description:
+Find a Unicode character bidi category, given its name.
+
+Files:
+lib/unictype/bidi_byname.c
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/bidi_byname.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/bidicategory-byname-tests b/gnulib/modules/unictype/bidicategory-byname-tests
new file mode 100644
index 00000000..cfb67cd4
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-byname-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-bidi_byname.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-bidi_byname
+check_PROGRAMS += test-bidi_byname
+test_bidi_byname_SOURCES = unictype/test-bidi_byname.c
+
diff --git a/gnulib/modules/unictype/bidicategory-name b/gnulib/modules/unictype/bidicategory-name
new file mode 100644
index 00000000..49c151a9
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-name
@@ -0,0 +1,23 @@
+Description:
+Name of Unicode character bidi category.
+
+Files:
+lib/unictype/bidi_name.c
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/bidi_name.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/bidicategory-name-tests b/gnulib/modules/unictype/bidicategory-name-tests
new file mode 100644
index 00000000..a34a0161
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-name-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-bidi_name.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-bidi_name
+check_PROGRAMS += test-bidi_name
+test_bidi_name_SOURCES = unictype/test-bidi_name.c
+
diff --git a/gnulib/modules/unictype/bidicategory-of b/gnulib/modules/unictype/bidicategory-of
new file mode 100644
index 00000000..77bf2789
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-of
@@ -0,0 +1,24 @@
+Description:
+Determine bidi category of a Unicode character.
+
+Files:
+lib/unictype/bidi_of.c
+lib/unictype/bidi_of.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/bidi_of.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/bidicategory-of-tests b/gnulib/modules/unictype/bidicategory-of-tests
new file mode 100644
index 00000000..e5819034
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-of-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-bidi_of.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-bidi_of
+check_PROGRAMS += test-bidi_of
+test_bidi_of_SOURCES = unictype/test-bidi_of.c
+
diff --git a/gnulib/modules/unictype/bidicategory-test b/gnulib/modules/unictype/bidicategory-test
new file mode 100644
index 00000000..6f5a2fdb
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-test
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character belongs to a given bidi category.
+
+Files:
+lib/unictype/bidi_test.c
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/bidi_test.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/bidicategory-test-tests b/gnulib/modules/unictype/bidicategory-test-tests
new file mode 100644
index 00000000..3410d658
--- /dev/null
+++ b/gnulib/modules/unictype/bidicategory-test-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unictype/test-bidi_test.c
+tests/macros.h
+
+Depends-on:
+unictype/bidicategory-of
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-bidi_test
+check_PROGRAMS += test-bidi_test
+test_bidi_test_SOURCES = unictype/test-bidi_test.c
+
diff --git a/gnulib/modules/unictype/block-all b/gnulib/modules/unictype/block-all
new file mode 100644
index 00000000..92de8562
--- /dev/null
+++ b/gnulib/modules/unictype/block-all
@@ -0,0 +1,23 @@
+Description:
+Complete API for blocks of Unicode characters.
+
+Files:
+
+Depends-on:
+unictype/block-of
+unictype/block-test
+unictype/block-list
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/block-list b/gnulib/modules/unictype/block-list
new file mode 100644
index 00000000..095f71e9
--- /dev/null
+++ b/gnulib/modules/unictype/block-list
@@ -0,0 +1,24 @@
+Description:
+List of Unicode character blocks.
+
+Files:
+lib/unictype/blocks.c
+lib/unictype/blocks.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/blocks.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/block-list-tests b/gnulib/modules/unictype/block-list-tests
new file mode 100644
index 00000000..8f11c39d
--- /dev/null
+++ b/gnulib/modules/unictype/block-list-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-block_list.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-block_list
+check_PROGRAMS += test-block_list
+test_block_list_SOURCES = unictype/test-block_list.c
+
diff --git a/gnulib/modules/unictype/block-of b/gnulib/modules/unictype/block-of
new file mode 100644
index 00000000..d5bd1935
--- /dev/null
+++ b/gnulib/modules/unictype/block-of
@@ -0,0 +1,22 @@
+Description:
+Determine block of a Unicode character.
+
+Files:
+
+Depends-on:
+unictype/base
+unictype/block-list
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/block-of-tests b/gnulib/modules/unictype/block-of-tests
new file mode 100644
index 00000000..4e71260f
--- /dev/null
+++ b/gnulib/modules/unictype/block-of-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-block_of.c
+tests/macros.h
+
+Depends-on:
+unictype/block-list
+unictype/block-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-block_of
+check_PROGRAMS += test-block_of
+test_block_of_SOURCES = unictype/test-block_of.c
+
diff --git a/gnulib/modules/unictype/block-test b/gnulib/modules/unictype/block-test
new file mode 100644
index 00000000..14f04782
--- /dev/null
+++ b/gnulib/modules/unictype/block-test
@@ -0,0 +1,23 @@
+Description:
+Test whether a Unicode character belongs to a given Unicode block.
+
+Files:
+lib/unictype/block_test.c
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/block_test.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/block-test-tests b/gnulib/modules/unictype/block-test-tests
new file mode 100644
index 00000000..33367f0a
--- /dev/null
+++ b/gnulib/modules/unictype/block-test-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-block_test.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-block_test
+check_PROGRAMS += test-block_test
+test_block_test_SOURCES = unictype/test-block_test.c
+
diff --git a/gnulib/modules/unictype/category-C b/gnulib/modules/unictype/category-C
new file mode 100644
index 00000000..d9986830
--- /dev/null
+++ b/gnulib/modules/unictype/category-C
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category C.
+
+Files:
+lib/unictype/categ_C.c
+lib/unictype/categ_C.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_C.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-C-tests b/gnulib/modules/unictype/category-C-tests
new file mode 100644
index 00000000..9b4a18e0
--- /dev/null
+++ b/gnulib/modules/unictype/category-C-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_C.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_C
+check_PROGRAMS += test-categ_C
+test_categ_C_SOURCES = unictype/test-categ_C.c
+
diff --git a/gnulib/modules/unictype/category-Cc b/gnulib/modules/unictype/category-Cc
new file mode 100644
index 00000000..a97ee1cb
--- /dev/null
+++ b/gnulib/modules/unictype/category-Cc
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Cc.
+
+Files:
+lib/unictype/categ_Cc.c
+lib/unictype/categ_Cc.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Cc.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Cc-tests b/gnulib/modules/unictype/category-Cc-tests
new file mode 100644
index 00000000..da8c0f8f
--- /dev/null
+++ b/gnulib/modules/unictype/category-Cc-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Cc.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Cc
+check_PROGRAMS += test-categ_Cc
+test_categ_Cc_SOURCES = unictype/test-categ_Cc.c
+
diff --git a/gnulib/modules/unictype/category-Cf b/gnulib/modules/unictype/category-Cf
new file mode 100644
index 00000000..b0039649
--- /dev/null
+++ b/gnulib/modules/unictype/category-Cf
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Cf.
+
+Files:
+lib/unictype/categ_Cf.c
+lib/unictype/categ_Cf.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Cf.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Cf-tests b/gnulib/modules/unictype/category-Cf-tests
new file mode 100644
index 00000000..a1d81382
--- /dev/null
+++ b/gnulib/modules/unictype/category-Cf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Cf.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Cf
+check_PROGRAMS += test-categ_Cf
+test_categ_Cf_SOURCES = unictype/test-categ_Cf.c
+
diff --git a/gnulib/modules/unictype/category-Cn b/gnulib/modules/unictype/category-Cn
new file mode 100644
index 00000000..93a65b3b
--- /dev/null
+++ b/gnulib/modules/unictype/category-Cn
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Cn.
+
+Files:
+lib/unictype/categ_Cn.c
+lib/unictype/categ_Cn.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Cn.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Cn-tests b/gnulib/modules/unictype/category-Cn-tests
new file mode 100644
index 00000000..ca0a8243
--- /dev/null
+++ b/gnulib/modules/unictype/category-Cn-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Cn.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Cn
+check_PROGRAMS += test-categ_Cn
+test_categ_Cn_SOURCES = unictype/test-categ_Cn.c
+
diff --git a/gnulib/modules/unictype/category-Co b/gnulib/modules/unictype/category-Co
new file mode 100644
index 00000000..21576962
--- /dev/null
+++ b/gnulib/modules/unictype/category-Co
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Co.
+
+Files:
+lib/unictype/categ_Co.c
+lib/unictype/categ_Co.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Co.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Co-tests b/gnulib/modules/unictype/category-Co-tests
new file mode 100644
index 00000000..93ef8a39
--- /dev/null
+++ b/gnulib/modules/unictype/category-Co-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Co.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Co
+check_PROGRAMS += test-categ_Co
+test_categ_Co_SOURCES = unictype/test-categ_Co.c
+
diff --git a/gnulib/modules/unictype/category-Cs b/gnulib/modules/unictype/category-Cs
new file mode 100644
index 00000000..cc3d32ef
--- /dev/null
+++ b/gnulib/modules/unictype/category-Cs
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Cs.
+
+Files:
+lib/unictype/categ_Cs.c
+lib/unictype/categ_Cs.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Cs.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Cs-tests b/gnulib/modules/unictype/category-Cs-tests
new file mode 100644
index 00000000..17c1c22b
--- /dev/null
+++ b/gnulib/modules/unictype/category-Cs-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Cs.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Cs
+check_PROGRAMS += test-categ_Cs
+test_categ_Cs_SOURCES = unictype/test-categ_Cs.c
+
diff --git a/gnulib/modules/unictype/category-L b/gnulib/modules/unictype/category-L
new file mode 100644
index 00000000..56a5b574
--- /dev/null
+++ b/gnulib/modules/unictype/category-L
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category L.
+
+Files:
+lib/unictype/categ_L.c
+lib/unictype/categ_L.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_L.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-L-tests b/gnulib/modules/unictype/category-L-tests
new file mode 100644
index 00000000..12725343
--- /dev/null
+++ b/gnulib/modules/unictype/category-L-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_L.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_L
+check_PROGRAMS += test-categ_L
+test_categ_L_SOURCES = unictype/test-categ_L.c
+
diff --git a/gnulib/modules/unictype/category-Ll b/gnulib/modules/unictype/category-Ll
new file mode 100644
index 00000000..4b9e763a
--- /dev/null
+++ b/gnulib/modules/unictype/category-Ll
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Ll.
+
+Files:
+lib/unictype/categ_Ll.c
+lib/unictype/categ_Ll.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Ll.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Ll-tests b/gnulib/modules/unictype/category-Ll-tests
new file mode 100644
index 00000000..756d26ca
--- /dev/null
+++ b/gnulib/modules/unictype/category-Ll-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Ll.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Ll
+check_PROGRAMS += test-categ_Ll
+test_categ_Ll_SOURCES = unictype/test-categ_Ll.c
+
diff --git a/gnulib/modules/unictype/category-Lm b/gnulib/modules/unictype/category-Lm
new file mode 100644
index 00000000..8d3625f0
--- /dev/null
+++ b/gnulib/modules/unictype/category-Lm
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Lm.
+
+Files:
+lib/unictype/categ_Lm.c
+lib/unictype/categ_Lm.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Lm.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Lm-tests b/gnulib/modules/unictype/category-Lm-tests
new file mode 100644
index 00000000..362e88c9
--- /dev/null
+++ b/gnulib/modules/unictype/category-Lm-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Lm.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Lm
+check_PROGRAMS += test-categ_Lm
+test_categ_Lm_SOURCES = unictype/test-categ_Lm.c
+
diff --git a/gnulib/modules/unictype/category-Lo b/gnulib/modules/unictype/category-Lo
new file mode 100644
index 00000000..8417a10f
--- /dev/null
+++ b/gnulib/modules/unictype/category-Lo
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Lo.
+
+Files:
+lib/unictype/categ_Lo.c
+lib/unictype/categ_Lo.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Lo.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Lo-tests b/gnulib/modules/unictype/category-Lo-tests
new file mode 100644
index 00000000..12b76963
--- /dev/null
+++ b/gnulib/modules/unictype/category-Lo-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Lo.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Lo
+check_PROGRAMS += test-categ_Lo
+test_categ_Lo_SOURCES = unictype/test-categ_Lo.c
+
diff --git a/gnulib/modules/unictype/category-Lt b/gnulib/modules/unictype/category-Lt
new file mode 100644
index 00000000..4bbdee96
--- /dev/null
+++ b/gnulib/modules/unictype/category-Lt
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Lt.
+
+Files:
+lib/unictype/categ_Lt.c
+lib/unictype/categ_Lt.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Lt.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Lt-tests b/gnulib/modules/unictype/category-Lt-tests
new file mode 100644
index 00000000..c284256b
--- /dev/null
+++ b/gnulib/modules/unictype/category-Lt-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Lt.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Lt
+check_PROGRAMS += test-categ_Lt
+test_categ_Lt_SOURCES = unictype/test-categ_Lt.c
+
diff --git a/gnulib/modules/unictype/category-Lu b/gnulib/modules/unictype/category-Lu
new file mode 100644
index 00000000..ffd78dad
--- /dev/null
+++ b/gnulib/modules/unictype/category-Lu
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Lu.
+
+Files:
+lib/unictype/categ_Lu.c
+lib/unictype/categ_Lu.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Lu.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Lu-tests b/gnulib/modules/unictype/category-Lu-tests
new file mode 100644
index 00000000..a8e94a6a
--- /dev/null
+++ b/gnulib/modules/unictype/category-Lu-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Lu.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Lu
+check_PROGRAMS += test-categ_Lu
+test_categ_Lu_SOURCES = unictype/test-categ_Lu.c
+
diff --git a/gnulib/modules/unictype/category-M b/gnulib/modules/unictype/category-M
new file mode 100644
index 00000000..73ecb142
--- /dev/null
+++ b/gnulib/modules/unictype/category-M
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category M.
+
+Files:
+lib/unictype/categ_M.c
+lib/unictype/categ_M.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_M.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-M-tests b/gnulib/modules/unictype/category-M-tests
new file mode 100644
index 00000000..c883a865
--- /dev/null
+++ b/gnulib/modules/unictype/category-M-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_M.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_M
+check_PROGRAMS += test-categ_M
+test_categ_M_SOURCES = unictype/test-categ_M.c
+
diff --git a/gnulib/modules/unictype/category-Mc b/gnulib/modules/unictype/category-Mc
new file mode 100644
index 00000000..a917309d
--- /dev/null
+++ b/gnulib/modules/unictype/category-Mc
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Mc.
+
+Files:
+lib/unictype/categ_Mc.c
+lib/unictype/categ_Mc.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Mc.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Mc-tests b/gnulib/modules/unictype/category-Mc-tests
new file mode 100644
index 00000000..dbbee20a
--- /dev/null
+++ b/gnulib/modules/unictype/category-Mc-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Mc.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Mc
+check_PROGRAMS += test-categ_Mc
+test_categ_Mc_SOURCES = unictype/test-categ_Mc.c
+
diff --git a/gnulib/modules/unictype/category-Me b/gnulib/modules/unictype/category-Me
new file mode 100644
index 00000000..f3bdb9af
--- /dev/null
+++ b/gnulib/modules/unictype/category-Me
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Me.
+
+Files:
+lib/unictype/categ_Me.c
+lib/unictype/categ_Me.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Me.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Me-tests b/gnulib/modules/unictype/category-Me-tests
new file mode 100644
index 00000000..1025c7ef
--- /dev/null
+++ b/gnulib/modules/unictype/category-Me-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Me.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Me
+check_PROGRAMS += test-categ_Me
+test_categ_Me_SOURCES = unictype/test-categ_Me.c
+
diff --git a/gnulib/modules/unictype/category-Mn b/gnulib/modules/unictype/category-Mn
new file mode 100644
index 00000000..567e2f12
--- /dev/null
+++ b/gnulib/modules/unictype/category-Mn
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Mn.
+
+Files:
+lib/unictype/categ_Mn.c
+lib/unictype/categ_Mn.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Mn.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Mn-tests b/gnulib/modules/unictype/category-Mn-tests
new file mode 100644
index 00000000..a201a8c4
--- /dev/null
+++ b/gnulib/modules/unictype/category-Mn-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Mn.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Mn
+check_PROGRAMS += test-categ_Mn
+test_categ_Mn_SOURCES = unictype/test-categ_Mn.c
+
diff --git a/gnulib/modules/unictype/category-N b/gnulib/modules/unictype/category-N
new file mode 100644
index 00000000..48e33e54
--- /dev/null
+++ b/gnulib/modules/unictype/category-N
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category N.
+
+Files:
+lib/unictype/categ_N.c
+lib/unictype/categ_N.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_N.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-N-tests b/gnulib/modules/unictype/category-N-tests
new file mode 100644
index 00000000..55500032
--- /dev/null
+++ b/gnulib/modules/unictype/category-N-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_N.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_N
+check_PROGRAMS += test-categ_N
+test_categ_N_SOURCES = unictype/test-categ_N.c
+
diff --git a/gnulib/modules/unictype/category-Nd b/gnulib/modules/unictype/category-Nd
new file mode 100644
index 00000000..5efaa213
--- /dev/null
+++ b/gnulib/modules/unictype/category-Nd
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Nd.
+
+Files:
+lib/unictype/categ_Nd.c
+lib/unictype/categ_Nd.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Nd.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Nd-tests b/gnulib/modules/unictype/category-Nd-tests
new file mode 100644
index 00000000..463ff8fa
--- /dev/null
+++ b/gnulib/modules/unictype/category-Nd-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Nd.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Nd
+check_PROGRAMS += test-categ_Nd
+test_categ_Nd_SOURCES = unictype/test-categ_Nd.c
+
diff --git a/gnulib/modules/unictype/category-Nl b/gnulib/modules/unictype/category-Nl
new file mode 100644
index 00000000..e9dd8a27
--- /dev/null
+++ b/gnulib/modules/unictype/category-Nl
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Nl.
+
+Files:
+lib/unictype/categ_Nl.c
+lib/unictype/categ_Nl.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Nl.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Nl-tests b/gnulib/modules/unictype/category-Nl-tests
new file mode 100644
index 00000000..340aa24a
--- /dev/null
+++ b/gnulib/modules/unictype/category-Nl-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Nl.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Nl
+check_PROGRAMS += test-categ_Nl
+test_categ_Nl_SOURCES = unictype/test-categ_Nl.c
+
diff --git a/gnulib/modules/unictype/category-No b/gnulib/modules/unictype/category-No
new file mode 100644
index 00000000..a59a89df
--- /dev/null
+++ b/gnulib/modules/unictype/category-No
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category No.
+
+Files:
+lib/unictype/categ_No.c
+lib/unictype/categ_No.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_No.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-No-tests b/gnulib/modules/unictype/category-No-tests
new file mode 100644
index 00000000..0aa828ac
--- /dev/null
+++ b/gnulib/modules/unictype/category-No-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_No.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_No
+check_PROGRAMS += test-categ_No
+test_categ_No_SOURCES = unictype/test-categ_No.c
+
diff --git a/gnulib/modules/unictype/category-P b/gnulib/modules/unictype/category-P
new file mode 100644
index 00000000..608dd79a
--- /dev/null
+++ b/gnulib/modules/unictype/category-P
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category P.
+
+Files:
+lib/unictype/categ_P.c
+lib/unictype/categ_P.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_P.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-P-tests b/gnulib/modules/unictype/category-P-tests
new file mode 100644
index 00000000..57f591e9
--- /dev/null
+++ b/gnulib/modules/unictype/category-P-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_P.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_P
+check_PROGRAMS += test-categ_P
+test_categ_P_SOURCES = unictype/test-categ_P.c
+
diff --git a/gnulib/modules/unictype/category-Pc b/gnulib/modules/unictype/category-Pc
new file mode 100644
index 00000000..7656bcc2
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pc
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Pc.
+
+Files:
+lib/unictype/categ_Pc.c
+lib/unictype/categ_Pc.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Pc.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Pc-tests b/gnulib/modules/unictype/category-Pc-tests
new file mode 100644
index 00000000..c6e1e909
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pc-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Pc.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Pc
+check_PROGRAMS += test-categ_Pc
+test_categ_Pc_SOURCES = unictype/test-categ_Pc.c
+
diff --git a/gnulib/modules/unictype/category-Pd b/gnulib/modules/unictype/category-Pd
new file mode 100644
index 00000000..b179d8a4
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pd
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Pd.
+
+Files:
+lib/unictype/categ_Pd.c
+lib/unictype/categ_Pd.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Pd.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Pd-tests b/gnulib/modules/unictype/category-Pd-tests
new file mode 100644
index 00000000..238ae1c1
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pd-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Pd.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Pd
+check_PROGRAMS += test-categ_Pd
+test_categ_Pd_SOURCES = unictype/test-categ_Pd.c
+
diff --git a/gnulib/modules/unictype/category-Pe b/gnulib/modules/unictype/category-Pe
new file mode 100644
index 00000000..ca3521a7
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pe
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Pe.
+
+Files:
+lib/unictype/categ_Pe.c
+lib/unictype/categ_Pe.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Pe.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Pe-tests b/gnulib/modules/unictype/category-Pe-tests
new file mode 100644
index 00000000..f9c31458
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pe-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Pe.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Pe
+check_PROGRAMS += test-categ_Pe
+test_categ_Pe_SOURCES = unictype/test-categ_Pe.c
+
diff --git a/gnulib/modules/unictype/category-Pf b/gnulib/modules/unictype/category-Pf
new file mode 100644
index 00000000..d7449942
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pf
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Pf.
+
+Files:
+lib/unictype/categ_Pf.c
+lib/unictype/categ_Pf.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Pf.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Pf-tests b/gnulib/modules/unictype/category-Pf-tests
new file mode 100644
index 00000000..2e1a0353
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Pf.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Pf
+check_PROGRAMS += test-categ_Pf
+test_categ_Pf_SOURCES = unictype/test-categ_Pf.c
+
diff --git a/gnulib/modules/unictype/category-Pi b/gnulib/modules/unictype/category-Pi
new file mode 100644
index 00000000..b52882aa
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pi
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Pi.
+
+Files:
+lib/unictype/categ_Pi.c
+lib/unictype/categ_Pi.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Pi.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Pi-tests b/gnulib/modules/unictype/category-Pi-tests
new file mode 100644
index 00000000..d210ad29
--- /dev/null
+++ b/gnulib/modules/unictype/category-Pi-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Pi.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Pi
+check_PROGRAMS += test-categ_Pi
+test_categ_Pi_SOURCES = unictype/test-categ_Pi.c
+
diff --git a/gnulib/modules/unictype/category-Po b/gnulib/modules/unictype/category-Po
new file mode 100644
index 00000000..1e0ef658
--- /dev/null
+++ b/gnulib/modules/unictype/category-Po
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Po.
+
+Files:
+lib/unictype/categ_Po.c
+lib/unictype/categ_Po.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Po.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Po-tests b/gnulib/modules/unictype/category-Po-tests
new file mode 100644
index 00000000..f652bd6b
--- /dev/null
+++ b/gnulib/modules/unictype/category-Po-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Po.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Po
+check_PROGRAMS += test-categ_Po
+test_categ_Po_SOURCES = unictype/test-categ_Po.c
+
diff --git a/gnulib/modules/unictype/category-Ps b/gnulib/modules/unictype/category-Ps
new file mode 100644
index 00000000..45957c4b
--- /dev/null
+++ b/gnulib/modules/unictype/category-Ps
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Ps.
+
+Files:
+lib/unictype/categ_Ps.c
+lib/unictype/categ_Ps.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Ps.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Ps-tests b/gnulib/modules/unictype/category-Ps-tests
new file mode 100644
index 00000000..ce9da497
--- /dev/null
+++ b/gnulib/modules/unictype/category-Ps-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Ps.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Ps
+check_PROGRAMS += test-categ_Ps
+test_categ_Ps_SOURCES = unictype/test-categ_Ps.c
+
diff --git a/gnulib/modules/unictype/category-S b/gnulib/modules/unictype/category-S
new file mode 100644
index 00000000..86f589d1
--- /dev/null
+++ b/gnulib/modules/unictype/category-S
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category S.
+
+Files:
+lib/unictype/categ_S.c
+lib/unictype/categ_S.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_S.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-S-tests b/gnulib/modules/unictype/category-S-tests
new file mode 100644
index 00000000..4eb24e23
--- /dev/null
+++ b/gnulib/modules/unictype/category-S-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_S.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_S
+check_PROGRAMS += test-categ_S
+test_categ_S_SOURCES = unictype/test-categ_S.c
+
diff --git a/gnulib/modules/unictype/category-Sc b/gnulib/modules/unictype/category-Sc
new file mode 100644
index 00000000..c1f5b33c
--- /dev/null
+++ b/gnulib/modules/unictype/category-Sc
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Sc.
+
+Files:
+lib/unictype/categ_Sc.c
+lib/unictype/categ_Sc.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Sc.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Sc-tests b/gnulib/modules/unictype/category-Sc-tests
new file mode 100644
index 00000000..20fc989f
--- /dev/null
+++ b/gnulib/modules/unictype/category-Sc-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Sc.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Sc
+check_PROGRAMS += test-categ_Sc
+test_categ_Sc_SOURCES = unictype/test-categ_Sc.c
+
diff --git a/gnulib/modules/unictype/category-Sk b/gnulib/modules/unictype/category-Sk
new file mode 100644
index 00000000..3b9476e1
--- /dev/null
+++ b/gnulib/modules/unictype/category-Sk
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Sk.
+
+Files:
+lib/unictype/categ_Sk.c
+lib/unictype/categ_Sk.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Sk.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Sk-tests b/gnulib/modules/unictype/category-Sk-tests
new file mode 100644
index 00000000..ff30f24d
--- /dev/null
+++ b/gnulib/modules/unictype/category-Sk-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Sk.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Sk
+check_PROGRAMS += test-categ_Sk
+test_categ_Sk_SOURCES = unictype/test-categ_Sk.c
+
diff --git a/gnulib/modules/unictype/category-Sm b/gnulib/modules/unictype/category-Sm
new file mode 100644
index 00000000..1c2c4b4f
--- /dev/null
+++ b/gnulib/modules/unictype/category-Sm
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Sm.
+
+Files:
+lib/unictype/categ_Sm.c
+lib/unictype/categ_Sm.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Sm.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Sm-tests b/gnulib/modules/unictype/category-Sm-tests
new file mode 100644
index 00000000..0d75ece1
--- /dev/null
+++ b/gnulib/modules/unictype/category-Sm-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Sm.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Sm
+check_PROGRAMS += test-categ_Sm
+test_categ_Sm_SOURCES = unictype/test-categ_Sm.c
+
diff --git a/gnulib/modules/unictype/category-So b/gnulib/modules/unictype/category-So
new file mode 100644
index 00000000..fcc65f34
--- /dev/null
+++ b/gnulib/modules/unictype/category-So
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category So.
+
+Files:
+lib/unictype/categ_So.c
+lib/unictype/categ_So.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_So.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-So-tests b/gnulib/modules/unictype/category-So-tests
new file mode 100644
index 00000000..a0c28a4d
--- /dev/null
+++ b/gnulib/modules/unictype/category-So-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_So.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_So
+check_PROGRAMS += test-categ_So
+test_categ_So_SOURCES = unictype/test-categ_So.c
+
diff --git a/gnulib/modules/unictype/category-Z b/gnulib/modules/unictype/category-Z
new file mode 100644
index 00000000..13475d51
--- /dev/null
+++ b/gnulib/modules/unictype/category-Z
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Z.
+
+Files:
+lib/unictype/categ_Z.c
+lib/unictype/categ_Z.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Z.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Z-tests b/gnulib/modules/unictype/category-Z-tests
new file mode 100644
index 00000000..a85eed1b
--- /dev/null
+++ b/gnulib/modules/unictype/category-Z-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Z.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Z
+check_PROGRAMS += test-categ_Z
+test_categ_Z_SOURCES = unictype/test-categ_Z.c
+
diff --git a/gnulib/modules/unictype/category-Zl b/gnulib/modules/unictype/category-Zl
new file mode 100644
index 00000000..b50bf277
--- /dev/null
+++ b/gnulib/modules/unictype/category-Zl
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Zl.
+
+Files:
+lib/unictype/categ_Zl.c
+lib/unictype/categ_Zl.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Zl.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Zl-tests b/gnulib/modules/unictype/category-Zl-tests
new file mode 100644
index 00000000..75be72a6
--- /dev/null
+++ b/gnulib/modules/unictype/category-Zl-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Zl.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Zl
+check_PROGRAMS += test-categ_Zl
+test_categ_Zl_SOURCES = unictype/test-categ_Zl.c
+
diff --git a/gnulib/modules/unictype/category-Zp b/gnulib/modules/unictype/category-Zp
new file mode 100644
index 00000000..9bf8f754
--- /dev/null
+++ b/gnulib/modules/unictype/category-Zp
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Zp.
+
+Files:
+lib/unictype/categ_Zp.c
+lib/unictype/categ_Zp.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Zp.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Zp-tests b/gnulib/modules/unictype/category-Zp-tests
new file mode 100644
index 00000000..8b5d3b9d
--- /dev/null
+++ b/gnulib/modules/unictype/category-Zp-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Zp.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Zp
+check_PROGRAMS += test-categ_Zp
+test_categ_Zp_SOURCES = unictype/test-categ_Zp.c
+
diff --git a/gnulib/modules/unictype/category-Zs b/gnulib/modules/unictype/category-Zs
new file mode 100644
index 00000000..19fa6225
--- /dev/null
+++ b/gnulib/modules/unictype/category-Zs
@@ -0,0 +1,24 @@
+Description:
+Test whether a Unicode character is of general category Zs.
+
+Files:
+lib/unictype/categ_Zs.c
+lib/unictype/categ_Zs.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_Zs.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-Zs-tests b/gnulib/modules/unictype/category-Zs-tests
new file mode 100644
index 00000000..a72f5e61
--- /dev/null
+++ b/gnulib/modules/unictype/category-Zs-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_Zs.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_Zs
+check_PROGRAMS += test-categ_Zs
+test_categ_Zs_SOURCES = unictype/test-categ_Zs.c
+
diff --git a/gnulib/modules/unictype/category-all b/gnulib/modules/unictype/category-all
new file mode 100644
index 00000000..c1b14486
--- /dev/null
+++ b/gnulib/modules/unictype/category-all
@@ -0,0 +1,65 @@
+Description:
+Complete API for Unicode character categories.
+
+Files:
+
+Depends-on:
+unictype/category-C
+unictype/category-Cc
+unictype/category-Cf
+unictype/category-Cn
+unictype/category-Co
+unictype/category-Cs
+unictype/category-L
+unictype/category-Ll
+unictype/category-Lm
+unictype/category-Lo
+unictype/category-Lt
+unictype/category-Lu
+unictype/category-M
+unictype/category-Mc
+unictype/category-Me
+unictype/category-Mn
+unictype/category-N
+unictype/category-Nd
+unictype/category-Nl
+unictype/category-No
+unictype/category-P
+unictype/category-Pc
+unictype/category-Pd
+unictype/category-Pe
+unictype/category-Pf
+unictype/category-Pi
+unictype/category-Po
+unictype/category-Ps
+unictype/category-S
+unictype/category-Sc
+unictype/category-Sk
+unictype/category-Sm
+unictype/category-So
+unictype/category-Z
+unictype/category-Zl
+unictype/category-Zp
+unictype/category-Zs
+unictype/category-and
+unictype/category-and-not
+unictype/category-byname
+unictype/category-name
+unictype/category-of
+unictype/category-or
+unictype/category-test
+unictype/category-test-withtable
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-and b/gnulib/modules/unictype/category-and
new file mode 100644
index 00000000..5d0a9b9e
--- /dev/null
+++ b/gnulib/modules/unictype/category-and
@@ -0,0 +1,25 @@
+Description:
+Intersection of categories of Unicode characters.
+
+Files:
+lib/unictype/categ_and.c
+
+Depends-on:
+unictype/base
+unictype/category-none
+unictype/category-test-withtable
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_and.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-and-not b/gnulib/modules/unictype/category-and-not
new file mode 100644
index 00000000..58925cf3
--- /dev/null
+++ b/gnulib/modules/unictype/category-and-not
@@ -0,0 +1,25 @@
+Description:
+Set-difference of categories of Unicode characters.
+
+Files:
+lib/unictype/categ_and_not.c
+
+Depends-on:
+unictype/base
+unictype/category-none
+unictype/category-test-withtable
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_and_not.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-and-not-tests b/gnulib/modules/unictype/category-and-not-tests
new file mode 100644
index 00000000..b2a988be
--- /dev/null
+++ b/gnulib/modules/unictype/category-and-not-tests
@@ -0,0 +1,19 @@
+Files:
+tests/unictype/test-categ_and_not.c
+tests/macros.h
+
+Depends-on:
+unictype/category-or
+unictype/category-test
+unictype/category-L
+unictype/category-N
+unictype/category-Lu
+unictype/category-Nd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_and_not
+check_PROGRAMS += test-categ_and_not
+test_categ_and_not_SOURCES = unictype/test-categ_and_not.c
+
diff --git a/gnulib/modules/unictype/category-and-tests b/gnulib/modules/unictype/category-and-tests
new file mode 100644
index 00000000..99de11ae
--- /dev/null
+++ b/gnulib/modules/unictype/category-and-tests
@@ -0,0 +1,19 @@
+Files:
+tests/unictype/test-categ_and.c
+tests/macros.h
+
+Depends-on:
+unictype/category-or
+unictype/category-test
+unictype/category-L
+unictype/category-Nd
+unictype/category-Lu
+unictype/category-N
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_and
+check_PROGRAMS += test-categ_and
+test_categ_and_SOURCES = unictype/test-categ_and.c
+
diff --git a/gnulib/modules/unictype/category-byname b/gnulib/modules/unictype/category-byname
new file mode 100644
index 00000000..bbc56791
--- /dev/null
+++ b/gnulib/modules/unictype/category-byname
@@ -0,0 +1,61 @@
+Description:
+Find a Unicode character category, given its name.
+
+Files:
+lib/unictype/categ_byname.c
+
+Depends-on:
+unictype/base
+unictype/category-C
+unictype/category-Cc
+unictype/category-Cf
+unictype/category-Cn
+unictype/category-Co
+unictype/category-Cs
+unictype/category-L
+unictype/category-Ll
+unictype/category-Lm
+unictype/category-Lo
+unictype/category-Lt
+unictype/category-Lu
+unictype/category-M
+unictype/category-Mc
+unictype/category-Me
+unictype/category-Mn
+unictype/category-N
+unictype/category-Nd
+unictype/category-Nl
+unictype/category-No
+unictype/category-P
+unictype/category-Pc
+unictype/category-Pd
+unictype/category-Pe
+unictype/category-Pf
+unictype/category-Pi
+unictype/category-Po
+unictype/category-Ps
+unictype/category-S
+unictype/category-Sc
+unictype/category-Sk
+unictype/category-Sm
+unictype/category-So
+unictype/category-Z
+unictype/category-Zl
+unictype/category-Zp
+unictype/category-Zs
+unictype/category-none
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_byname.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-byname-tests b/gnulib/modules/unictype/category-byname-tests
new file mode 100644
index 00000000..ba97566b
--- /dev/null
+++ b/gnulib/modules/unictype/category-byname-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-categ_byname.c
+tests/macros.h
+
+Depends-on:
+stdbool
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_byname
+check_PROGRAMS += test-categ_byname
+test_categ_byname_SOURCES = unictype/test-categ_byname.c
+
diff --git a/gnulib/modules/unictype/category-name b/gnulib/modules/unictype/category-name
new file mode 100644
index 00000000..ef0b1d66
--- /dev/null
+++ b/gnulib/modules/unictype/category-name
@@ -0,0 +1,23 @@
+Description:
+Name of Unicode character category.
+
+Files:
+lib/unictype/categ_name.c
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_name.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-name-tests b/gnulib/modules/unictype/category-name-tests
new file mode 100644
index 00000000..bc0c82a3
--- /dev/null
+++ b/gnulib/modules/unictype/category-name-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_name.c
+tests/macros.h
+
+Depends-on:
+unictype/category-or
+unictype/category-Z
+unictype/category-Nl
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_name
+check_PROGRAMS += test-categ_name
+test_categ_name_SOURCES = unictype/test-categ_name.c
+
diff --git a/gnulib/modules/unictype/category-none b/gnulib/modules/unictype/category-none
new file mode 100644
index 00000000..0c76d796
--- /dev/null
+++ b/gnulib/modules/unictype/category-none
@@ -0,0 +1,23 @@
+Description:
+Empty category of Unicode characters.
+
+Files:
+lib/unictype/categ_none.c
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_none.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-none-tests b/gnulib/modules/unictype/category-none-tests
new file mode 100644
index 00000000..c78e4165
--- /dev/null
+++ b/gnulib/modules/unictype/category-none-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unictype/test-categ_none.c
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_none
+check_PROGRAMS += test-categ_none
+test_categ_none_SOURCES = unictype/test-categ_none.c
+
diff --git a/gnulib/modules/unictype/category-of b/gnulib/modules/unictype/category-of
new file mode 100644
index 00000000..bb38bcf9
--- /dev/null
+++ b/gnulib/modules/unictype/category-of
@@ -0,0 +1,26 @@
+Description:
+Determine category of a Unicode character.
+
+Files:
+lib/unictype/categ_of.c
+lib/unictype/categ_of.h
+
+Depends-on:
+unictype/base
+unictype/category-none
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/categ_of.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-of-tests b/gnulib/modules/unictype/category-of-tests
new file mode 100644
index 00000000..fe1aa6b6
--- /dev/null
+++ b/gnulib/modules/unictype/category-of-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unictype/test-categ_of.c
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_of
+check_PROGRAMS += test-categ_of
+test_categ_of_SOURCES = unictype/test-categ_of.c
+
diff --git a/gnulib/modules/unictype/category-or b/gnulib/modules/unictype/category-or
new file mode 100644
index 00000000..072ab8a7
--- /dev/null
+++ b/gnulib/modules/unictype/category-or
@@ -0,0 +1,24 @@
+Description:
+Union of categories of Unicode characters.
+
+Files:
+lib/unictype/categ_or.c
+
+Depends-on:
+unictype/base
+unictype/category-test-withtable
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/categ_or.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-or-tests b/gnulib/modules/unictype/category-or-tests
new file mode 100644
index 00000000..a6b740dd
--- /dev/null
+++ b/gnulib/modules/unictype/category-or-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unictype/test-categ_or.c
+tests/macros.h
+
+Depends-on:
+unictype/category-test
+unictype/category-L
+unictype/category-N
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_or
+check_PROGRAMS += test-categ_or
+test_categ_or_SOURCES = unictype/test-categ_or.c
+
diff --git a/gnulib/modules/unictype/category-test b/gnulib/modules/unictype/category-test
new file mode 100644
index 00000000..c811e485
--- /dev/null
+++ b/gnulib/modules/unictype/category-test
@@ -0,0 +1,25 @@
+Description:
+Test whether a Unicode character belongs to a given category.
+
+Files:
+lib/unictype/categ_test.c
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/categ_test.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-test-withtable b/gnulib/modules/unictype/category-test-withtable
new file mode 100644
index 00000000..73b7a33f
--- /dev/null
+++ b/gnulib/modules/unictype/category-test-withtable
@@ -0,0 +1,22 @@
+Description:
+Test whether a Unicode character belongs to a given bitmask of categories.
+
+Files:
+
+Depends-on:
+unictype/base
+unictype/category-of
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/category-test-withtable-tests b/gnulib/modules/unictype/category-test-withtable-tests
new file mode 100644
index 00000000..c74027e4
--- /dev/null
+++ b/gnulib/modules/unictype/category-test-withtable-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-categ_test_withtable.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-categ_test_withtable
+check_PROGRAMS += test-categ_test_withtable
+test_categ_test_withtable_SOURCES = unictype/test-categ_test_withtable.c
+
diff --git a/gnulib/modules/unictype/combining-class b/gnulib/modules/unictype/combining-class
new file mode 100644
index 00000000..17079025
--- /dev/null
+++ b/gnulib/modules/unictype/combining-class
@@ -0,0 +1,24 @@
+Description:
+Determine combining class of a Unicode character.
+
+Files:
+lib/unictype/combining.c
+lib/unictype/combining.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/combining.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/combining-class-tests b/gnulib/modules/unictype/combining-class-tests
new file mode 100644
index 00000000..eafbdd09
--- /dev/null
+++ b/gnulib/modules/unictype/combining-class-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-combining.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-combining
+check_PROGRAMS += test-combining
+test_combining_SOURCES = unictype/test-combining.c
+
diff --git a/gnulib/modules/unictype/ctype-alnum b/gnulib/modules/unictype/ctype-alnum
new file mode 100644
index 00000000..be53c43b
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-alnum
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isalnum() function and the
+<wctype.h> iswalnum() function.
+
+Files:
+lib/unictype/ctype_alnum.c
+lib/unictype/ctype_alnum.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_alnum.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-alnum-tests b/gnulib/modules/unictype/ctype-alnum-tests
new file mode 100644
index 00000000..db33ed4a
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-alnum-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_alnum.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_alnum
+check_PROGRAMS += test-ctype_alnum
+test_ctype_alnum_SOURCES = unictype/test-ctype_alnum.c
+
diff --git a/gnulib/modules/unictype/ctype-alpha b/gnulib/modules/unictype/ctype-alpha
new file mode 100644
index 00000000..d96967bc
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-alpha
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isalpha() function and the
+<wctype.h> iswalpha() function.
+
+Files:
+lib/unictype/ctype_alpha.c
+lib/unictype/ctype_alpha.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_alpha.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-alpha-tests b/gnulib/modules/unictype/ctype-alpha-tests
new file mode 100644
index 00000000..abdfc509
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-alpha-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_alpha.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_alpha
+check_PROGRAMS += test-ctype_alpha
+test_ctype_alpha_SOURCES = unictype/test-ctype_alpha.c
+
diff --git a/gnulib/modules/unictype/ctype-blank b/gnulib/modules/unictype/ctype-blank
new file mode 100644
index 00000000..6a7a78b5
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-blank
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isblank() function and the
+<wctype.h> iswblank() function.
+
+Files:
+lib/unictype/ctype_blank.c
+lib/unictype/ctype_blank.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_blank.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-blank-tests b/gnulib/modules/unictype/ctype-blank-tests
new file mode 100644
index 00000000..d1daa911
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-blank-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_blank.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_blank
+check_PROGRAMS += test-ctype_blank
+test_ctype_blank_SOURCES = unictype/test-ctype_blank.c
+
diff --git a/gnulib/modules/unictype/ctype-cntrl b/gnulib/modules/unictype/ctype-cntrl
new file mode 100644
index 00000000..4b9a4d33
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-cntrl
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> iscntrl() function and the
+<wctype.h> iswcntrl() function.
+
+Files:
+lib/unictype/ctype_cntrl.c
+lib/unictype/ctype_cntrl.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_cntrl.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-cntrl-tests b/gnulib/modules/unictype/ctype-cntrl-tests
new file mode 100644
index 00000000..4c195c4e
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-cntrl-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_cntrl.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_cntrl
+check_PROGRAMS += test-ctype_cntrl
+test_ctype_cntrl_SOURCES = unictype/test-ctype_cntrl.c
+
diff --git a/gnulib/modules/unictype/ctype-digit b/gnulib/modules/unictype/ctype-digit
new file mode 100644
index 00000000..cdce1e98
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-digit
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isdigit() function and the
+<wctype.h> iswdigit() function.
+
+Files:
+lib/unictype/ctype_digit.c
+lib/unictype/ctype_digit.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_digit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-digit-tests b/gnulib/modules/unictype/ctype-digit-tests
new file mode 100644
index 00000000..2f7833e2
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-digit-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_digit.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_digit
+check_PROGRAMS += test-ctype_digit
+test_ctype_digit_SOURCES = unictype/test-ctype_digit.c
+
diff --git a/gnulib/modules/unictype/ctype-graph b/gnulib/modules/unictype/ctype-graph
new file mode 100644
index 00000000..e1171b28
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-graph
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isgraph() function and the
+<wctype.h> iswgraph() function.
+
+Files:
+lib/unictype/ctype_graph.c
+lib/unictype/ctype_graph.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_graph.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-graph-tests b/gnulib/modules/unictype/ctype-graph-tests
new file mode 100644
index 00000000..646a00ba
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-graph-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_graph.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_graph
+check_PROGRAMS += test-ctype_graph
+test_ctype_graph_SOURCES = unictype/test-ctype_graph.c
+
diff --git a/gnulib/modules/unictype/ctype-lower b/gnulib/modules/unictype/ctype-lower
new file mode 100644
index 00000000..e31281df
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-lower
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> islower() function and the
+<wctype.h> iswlower() function.
+
+Files:
+lib/unictype/ctype_lower.c
+lib/unictype/ctype_lower.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_lower.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-lower-tests b/gnulib/modules/unictype/ctype-lower-tests
new file mode 100644
index 00000000..707cec62
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-lower-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_lower.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_lower
+check_PROGRAMS += test-ctype_lower
+test_ctype_lower_SOURCES = unictype/test-ctype_lower.c
+
diff --git a/gnulib/modules/unictype/ctype-print b/gnulib/modules/unictype/ctype-print
new file mode 100644
index 00000000..3f3cf6f0
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-print
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isprint() function and the
+<wctype.h> iswprint() function.
+
+Files:
+lib/unictype/ctype_print.c
+lib/unictype/ctype_print.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_print.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-print-tests b/gnulib/modules/unictype/ctype-print-tests
new file mode 100644
index 00000000..a590a4db
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-print-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_print.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_print
+check_PROGRAMS += test-ctype_print
+test_ctype_print_SOURCES = unictype/test-ctype_print.c
+
diff --git a/gnulib/modules/unictype/ctype-punct b/gnulib/modules/unictype/ctype-punct
new file mode 100644
index 00000000..9800fc0b
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-punct
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> ispunct() function and the
+<wctype.h> iswpunct() function.
+
+Files:
+lib/unictype/ctype_punct.c
+lib/unictype/ctype_punct.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_punct.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-punct-tests b/gnulib/modules/unictype/ctype-punct-tests
new file mode 100644
index 00000000..7f39283f
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-punct-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_punct.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_punct
+check_PROGRAMS += test-ctype_punct
+test_ctype_punct_SOURCES = unictype/test-ctype_punct.c
+
diff --git a/gnulib/modules/unictype/ctype-space b/gnulib/modules/unictype/ctype-space
new file mode 100644
index 00000000..e50ab991
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-space
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isspace() function and the
+<wctype.h> iswspace() function.
+
+Files:
+lib/unictype/ctype_space.c
+lib/unictype/ctype_space.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_space.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-space-tests b/gnulib/modules/unictype/ctype-space-tests
new file mode 100644
index 00000000..124b107e
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-space-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_space.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_space
+check_PROGRAMS += test-ctype_space
+test_ctype_space_SOURCES = unictype/test-ctype_space.c
+
diff --git a/gnulib/modules/unictype/ctype-upper b/gnulib/modules/unictype/ctype-upper
new file mode 100644
index 00000000..7dfd6919
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-upper
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isupper() function and the
+<wctype.h> iswupper() function.
+
+Files:
+lib/unictype/ctype_upper.c
+lib/unictype/ctype_upper.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_upper.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-upper-tests b/gnulib/modules/unictype/ctype-upper-tests
new file mode 100644
index 00000000..b32e1b6f
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-upper-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_upper.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_upper
+check_PROGRAMS += test-ctype_upper
+test_ctype_upper_SOURCES = unictype/test-ctype_upper.c
+
diff --git a/gnulib/modules/unictype/ctype-xdigit b/gnulib/modules/unictype/ctype-xdigit
new file mode 100644
index 00000000..dac2b4a3
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-xdigit
@@ -0,0 +1,27 @@
+Description:
+Generalization of the <ctype.h> isxdigit() function and the
+<wctype.h> iswxdigit() function.
+
+Files:
+lib/unictype/ctype_xdigit.c
+lib/unictype/ctype_xdigit.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/ctype_xdigit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/ctype-xdigit-tests b/gnulib/modules/unictype/ctype-xdigit-tests
new file mode 100644
index 00000000..4cc56788
--- /dev/null
+++ b/gnulib/modules/unictype/ctype-xdigit-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-ctype_xdigit.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ctype_xdigit
+check_PROGRAMS += test-ctype_xdigit
+test_ctype_xdigit_SOURCES = unictype/test-ctype_xdigit.c
+
diff --git a/gnulib/modules/unictype/decimal-digit b/gnulib/modules/unictype/decimal-digit
new file mode 100644
index 00000000..7802f436
--- /dev/null
+++ b/gnulib/modules/unictype/decimal-digit
@@ -0,0 +1,24 @@
+Description:
+Value of a decimal digit Unicode character.
+
+Files:
+lib/unictype/decdigit.c
+lib/unictype/decdigit.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/decdigit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/decimal-digit-tests b/gnulib/modules/unictype/decimal-digit-tests
new file mode 100644
index 00000000..f0451d90
--- /dev/null
+++ b/gnulib/modules/unictype/decimal-digit-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unictype/test-decdigit.c
+tests/unictype/test-decdigit.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-decdigit
+check_PROGRAMS += test-decdigit
+test_decdigit_SOURCES = unictype/test-decdigit.c
+
diff --git a/gnulib/modules/unictype/digit b/gnulib/modules/unictype/digit
new file mode 100644
index 00000000..7c89e5b5
--- /dev/null
+++ b/gnulib/modules/unictype/digit
@@ -0,0 +1,24 @@
+Description:
+Value of a digit Unicode character.
+
+Files:
+lib/unictype/digit.c
+lib/unictype/digit.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/digit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/digit-tests b/gnulib/modules/unictype/digit-tests
new file mode 100644
index 00000000..58b6c000
--- /dev/null
+++ b/gnulib/modules/unictype/digit-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unictype/test-digit.c
+tests/unictype/test-digit.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-digit
+check_PROGRAMS += test-digit
+test_digit_SOURCES = unictype/test-digit.c
+
diff --git a/gnulib/modules/unictype/mirror b/gnulib/modules/unictype/mirror
new file mode 100644
index 00000000..99d2d619
--- /dev/null
+++ b/gnulib/modules/unictype/mirror
@@ -0,0 +1,24 @@
+Description:
+Mirrored Unicode characters.
+
+Files:
+lib/unictype/mirror.c
+lib/unictype/mirror.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/mirror.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/mirror-tests b/gnulib/modules/unictype/mirror-tests
new file mode 100644
index 00000000..dc2ad1ee
--- /dev/null
+++ b/gnulib/modules/unictype/mirror-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-mirror.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-mirror
+check_PROGRAMS += test-mirror
+test_mirror_SOURCES = unictype/test-mirror.c
+
diff --git a/gnulib/modules/unictype/numeric b/gnulib/modules/unictype/numeric
new file mode 100644
index 00000000..1a65f075
--- /dev/null
+++ b/gnulib/modules/unictype/numeric
@@ -0,0 +1,24 @@
+Description:
+Value of a numeric Unicode character.
+
+Files:
+lib/unictype/numeric.c
+lib/unictype/numeric.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/numeric.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/numeric-tests b/gnulib/modules/unictype/numeric-tests
new file mode 100644
index 00000000..759ae2e9
--- /dev/null
+++ b/gnulib/modules/unictype/numeric-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unictype/test-numeric.c
+tests/unictype/test-numeric.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-numeric
+check_PROGRAMS += test-numeric
+test_numeric_SOURCES = unictype/test-numeric.c
+
diff --git a/gnulib/modules/unictype/property-all b/gnulib/modules/unictype/property-all
new file mode 100644
index 00000000..01b01a78
--- /dev/null
+++ b/gnulib/modules/unictype/property-all
@@ -0,0 +1,101 @@
+Description:
+Complete API for Unicode character properties.
+
+Files:
+
+Depends-on:
+unictype/property-alphabetic
+unictype/property-ascii-hex-digit
+unictype/property-bidi-arabic-digit
+unictype/property-bidi-arabic-right-to-left
+unictype/property-bidi-block-separator
+unictype/property-bidi-boundary-neutral
+unictype/property-bidi-common-separator
+unictype/property-bidi-control
+unictype/property-bidi-embedding-or-override
+unictype/property-bidi-eur-num-separator
+unictype/property-bidi-eur-num-terminator
+unictype/property-bidi-european-digit
+unictype/property-bidi-hebrew-right-to-left
+unictype/property-bidi-left-to-right
+unictype/property-bidi-non-spacing-mark
+unictype/property-bidi-other-neutral
+unictype/property-bidi-pdf
+unictype/property-bidi-segment-separator
+unictype/property-bidi-whitespace
+unictype/property-byname
+unictype/property-combining
+unictype/property-composite
+unictype/property-currency-symbol
+unictype/property-dash
+unictype/property-decimal-digit
+unictype/property-default-ignorable-code-point
+unictype/property-deprecated
+unictype/property-diacritic
+unictype/property-extender
+unictype/property-format-control
+unictype/property-grapheme-base
+unictype/property-grapheme-extend
+unictype/property-grapheme-link
+unictype/property-hex-digit
+unictype/property-hyphen
+unictype/property-id-continue
+unictype/property-id-start
+unictype/property-ideographic
+unictype/property-ids-binary-operator
+unictype/property-ids-trinary-operator
+unictype/property-ignorable-control
+unictype/property-iso-control
+unictype/property-join-control
+unictype/property-left-of-pair
+unictype/property-line-separator
+unictype/property-logical-order-exception
+unictype/property-lowercase
+unictype/property-math
+unictype/property-non-break
+unictype/property-not-a-character
+unictype/property-numeric
+unictype/property-other-alphabetic
+unictype/property-other-default-ignorable-code-point
+unictype/property-other-grapheme-extend
+unictype/property-other-id-continue
+unictype/property-other-id-start
+unictype/property-other-lowercase
+unictype/property-other-math
+unictype/property-other-uppercase
+unictype/property-paired-punctuation
+unictype/property-paragraph-separator
+unictype/property-pattern-syntax
+unictype/property-pattern-white-space
+unictype/property-private-use
+unictype/property-punctuation
+unictype/property-quotation-mark
+unictype/property-radical
+unictype/property-sentence-terminal
+unictype/property-soft-dotted
+unictype/property-space
+unictype/property-terminal-punctuation
+unictype/property-test
+unictype/property-titlecase
+unictype/property-unassigned-code-value
+unictype/property-unified-ideograph
+unictype/property-uppercase
+unictype/property-variation-selector
+unictype/property-white-space
+unictype/property-xid-continue
+unictype/property-xid-start
+unictype/property-zero-width
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-alphabetic b/gnulib/modules/unictype/property-alphabetic
new file mode 100644
index 00000000..784f011b
--- /dev/null
+++ b/gnulib/modules/unictype/property-alphabetic
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "alphabetic".
+
+Files:
+lib/unictype/pr_alphabetic.c
+lib/unictype/pr_alphabetic.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_alphabetic.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-alphabetic-tests b/gnulib/modules/unictype/property-alphabetic-tests
new file mode 100644
index 00000000..a4a757dc
--- /dev/null
+++ b/gnulib/modules/unictype/property-alphabetic-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_alphabetic.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_alphabetic
+check_PROGRAMS += test-pr_alphabetic
+test_pr_alphabetic_SOURCES = unictype/test-pr_alphabetic.c
+
diff --git a/gnulib/modules/unictype/property-ascii-hex-digit b/gnulib/modules/unictype/property-ascii-hex-digit
new file mode 100644
index 00000000..28c124d9
--- /dev/null
+++ b/gnulib/modules/unictype/property-ascii-hex-digit
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "ascii hex digit".
+
+Files:
+lib/unictype/pr_ascii_hex_digit.c
+lib/unictype/pr_ascii_hex_digit.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_ascii_hex_digit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-ascii-hex-digit-tests b/gnulib/modules/unictype/property-ascii-hex-digit-tests
new file mode 100644
index 00000000..edf2cad1
--- /dev/null
+++ b/gnulib/modules/unictype/property-ascii-hex-digit-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_ascii_hex_digit.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_ascii_hex_digit
+check_PROGRAMS += test-pr_ascii_hex_digit
+test_pr_ascii_hex_digit_SOURCES = unictype/test-pr_ascii_hex_digit.c
+
diff --git a/gnulib/modules/unictype/property-bidi-arabic-digit b/gnulib/modules/unictype/property-bidi-arabic-digit
new file mode 100644
index 00000000..e1d3e289
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-arabic-digit
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi arabic digit".
+
+Files:
+lib/unictype/pr_bidi_arabic_digit.c
+lib/unictype/pr_bidi_arabic_digit.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_arabic_digit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-arabic-digit-tests b/gnulib/modules/unictype/property-bidi-arabic-digit-tests
new file mode 100644
index 00000000..f6fa5ec5
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-arabic-digit-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_arabic_digit.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_arabic_digit
+check_PROGRAMS += test-pr_bidi_arabic_digit
+test_pr_bidi_arabic_digit_SOURCES = unictype/test-pr_bidi_arabic_digit.c
+
diff --git a/gnulib/modules/unictype/property-bidi-arabic-right-to-left b/gnulib/modules/unictype/property-bidi-arabic-right-to-left
new file mode 100644
index 00000000..15a9fe09
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-arabic-right-to-left
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi arabic right to left".
+
+Files:
+lib/unictype/pr_bidi_arabic_right_to_left.c
+lib/unictype/pr_bidi_arabic_right_to_left.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_arabic_right_to_left.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-arabic-right-to-left-tests b/gnulib/modules/unictype/property-bidi-arabic-right-to-left-tests
new file mode 100644
index 00000000..2efe8319
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-arabic-right-to-left-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_arabic_right_to_left.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_arabic_right_to_left
+check_PROGRAMS += test-pr_bidi_arabic_right_to_left
+test_pr_bidi_arabic_right_to_left_SOURCES = unictype/test-pr_bidi_arabic_right_to_left.c
+
diff --git a/gnulib/modules/unictype/property-bidi-block-separator b/gnulib/modules/unictype/property-bidi-block-separator
new file mode 100644
index 00000000..553a3ab6
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-block-separator
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi block separator".
+
+Files:
+lib/unictype/pr_bidi_block_separator.c
+lib/unictype/pr_bidi_block_separator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_block_separator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-block-separator-tests b/gnulib/modules/unictype/property-bidi-block-separator-tests
new file mode 100644
index 00000000..3377c176
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-block-separator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_block_separator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_block_separator
+check_PROGRAMS += test-pr_bidi_block_separator
+test_pr_bidi_block_separator_SOURCES = unictype/test-pr_bidi_block_separator.c
+
diff --git a/gnulib/modules/unictype/property-bidi-boundary-neutral b/gnulib/modules/unictype/property-bidi-boundary-neutral
new file mode 100644
index 00000000..2e9f98f5
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-boundary-neutral
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi boundary neutral".
+
+Files:
+lib/unictype/pr_bidi_boundary_neutral.c
+lib/unictype/pr_bidi_boundary_neutral.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_boundary_neutral.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-boundary-neutral-tests b/gnulib/modules/unictype/property-bidi-boundary-neutral-tests
new file mode 100644
index 00000000..dedc4ab6
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-boundary-neutral-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_boundary_neutral.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_boundary_neutral
+check_PROGRAMS += test-pr_bidi_boundary_neutral
+test_pr_bidi_boundary_neutral_SOURCES = unictype/test-pr_bidi_boundary_neutral.c
+
diff --git a/gnulib/modules/unictype/property-bidi-common-separator b/gnulib/modules/unictype/property-bidi-common-separator
new file mode 100644
index 00000000..1eb12cc9
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-common-separator
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi common separator".
+
+Files:
+lib/unictype/pr_bidi_common_separator.c
+lib/unictype/pr_bidi_common_separator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_common_separator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-common-separator-tests b/gnulib/modules/unictype/property-bidi-common-separator-tests
new file mode 100644
index 00000000..6964ed6d
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-common-separator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_common_separator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_common_separator
+check_PROGRAMS += test-pr_bidi_common_separator
+test_pr_bidi_common_separator_SOURCES = unictype/test-pr_bidi_common_separator.c
+
diff --git a/gnulib/modules/unictype/property-bidi-control b/gnulib/modules/unictype/property-bidi-control
new file mode 100644
index 00000000..6a86708f
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-control
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi control".
+
+Files:
+lib/unictype/pr_bidi_control.c
+lib/unictype/pr_bidi_control.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_control.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-control-tests b/gnulib/modules/unictype/property-bidi-control-tests
new file mode 100644
index 00000000..52a11020
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-control-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_control.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_control
+check_PROGRAMS += test-pr_bidi_control
+test_pr_bidi_control_SOURCES = unictype/test-pr_bidi_control.c
+
diff --git a/gnulib/modules/unictype/property-bidi-embedding-or-override b/gnulib/modules/unictype/property-bidi-embedding-or-override
new file mode 100644
index 00000000..a843eb89
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-embedding-or-override
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi embedding or override".
+
+Files:
+lib/unictype/pr_bidi_embedding_or_override.c
+lib/unictype/pr_bidi_embedding_or_override.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_embedding_or_override.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-embedding-or-override-tests b/gnulib/modules/unictype/property-bidi-embedding-or-override-tests
new file mode 100644
index 00000000..c64e232f
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-embedding-or-override-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_embedding_or_override.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_embedding_or_override
+check_PROGRAMS += test-pr_bidi_embedding_or_override
+test_pr_bidi_embedding_or_override_SOURCES = unictype/test-pr_bidi_embedding_or_override.c
+
diff --git a/gnulib/modules/unictype/property-bidi-eur-num-separator b/gnulib/modules/unictype/property-bidi-eur-num-separator
new file mode 100644
index 00000000..76696539
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-eur-num-separator
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi eur num separator".
+
+Files:
+lib/unictype/pr_bidi_eur_num_separator.c
+lib/unictype/pr_bidi_eur_num_separator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_eur_num_separator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-eur-num-separator-tests b/gnulib/modules/unictype/property-bidi-eur-num-separator-tests
new file mode 100644
index 00000000..3442fcf8
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-eur-num-separator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_eur_num_separator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_eur_num_separator
+check_PROGRAMS += test-pr_bidi_eur_num_separator
+test_pr_bidi_eur_num_separator_SOURCES = unictype/test-pr_bidi_eur_num_separator.c
+
diff --git a/gnulib/modules/unictype/property-bidi-eur-num-terminator b/gnulib/modules/unictype/property-bidi-eur-num-terminator
new file mode 100644
index 00000000..18c3b58b
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-eur-num-terminator
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi eur num terminator".
+
+Files:
+lib/unictype/pr_bidi_eur_num_terminator.c
+lib/unictype/pr_bidi_eur_num_terminator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_eur_num_terminator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-eur-num-terminator-tests b/gnulib/modules/unictype/property-bidi-eur-num-terminator-tests
new file mode 100644
index 00000000..fda0c48b
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-eur-num-terminator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_eur_num_terminator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_eur_num_terminator
+check_PROGRAMS += test-pr_bidi_eur_num_terminator
+test_pr_bidi_eur_num_terminator_SOURCES = unictype/test-pr_bidi_eur_num_terminator.c
+
diff --git a/gnulib/modules/unictype/property-bidi-european-digit b/gnulib/modules/unictype/property-bidi-european-digit
new file mode 100644
index 00000000..febb9f9e
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-european-digit
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi european digit".
+
+Files:
+lib/unictype/pr_bidi_european_digit.c
+lib/unictype/pr_bidi_european_digit.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_european_digit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-european-digit-tests b/gnulib/modules/unictype/property-bidi-european-digit-tests
new file mode 100644
index 00000000..c7196f9b
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-european-digit-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_european_digit.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_european_digit
+check_PROGRAMS += test-pr_bidi_european_digit
+test_pr_bidi_european_digit_SOURCES = unictype/test-pr_bidi_european_digit.c
+
diff --git a/gnulib/modules/unictype/property-bidi-hebrew-right-to-left b/gnulib/modules/unictype/property-bidi-hebrew-right-to-left
new file mode 100644
index 00000000..933a08a9
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-hebrew-right-to-left
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi hebrew right to left".
+
+Files:
+lib/unictype/pr_bidi_hebrew_right_to_left.c
+lib/unictype/pr_bidi_hebrew_right_to_left.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_hebrew_right_to_left.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-hebrew-right-to-left-tests b/gnulib/modules/unictype/property-bidi-hebrew-right-to-left-tests
new file mode 100644
index 00000000..3d3985a8
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-hebrew-right-to-left-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_hebrew_right_to_left.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_hebrew_right_to_left
+check_PROGRAMS += test-pr_bidi_hebrew_right_to_left
+test_pr_bidi_hebrew_right_to_left_SOURCES = unictype/test-pr_bidi_hebrew_right_to_left.c
+
diff --git a/gnulib/modules/unictype/property-bidi-left-to-right b/gnulib/modules/unictype/property-bidi-left-to-right
new file mode 100644
index 00000000..8bc92161
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-left-to-right
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi left to right".
+
+Files:
+lib/unictype/pr_bidi_left_to_right.c
+lib/unictype/pr_bidi_left_to_right.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_left_to_right.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-left-to-right-tests b/gnulib/modules/unictype/property-bidi-left-to-right-tests
new file mode 100644
index 00000000..4097553f
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-left-to-right-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_left_to_right.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_left_to_right
+check_PROGRAMS += test-pr_bidi_left_to_right
+test_pr_bidi_left_to_right_SOURCES = unictype/test-pr_bidi_left_to_right.c
+
diff --git a/gnulib/modules/unictype/property-bidi-non-spacing-mark b/gnulib/modules/unictype/property-bidi-non-spacing-mark
new file mode 100644
index 00000000..699c3b9a
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-non-spacing-mark
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi non spacing mark".
+
+Files:
+lib/unictype/pr_bidi_non_spacing_mark.c
+lib/unictype/pr_bidi_non_spacing_mark.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_non_spacing_mark.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-non-spacing-mark-tests b/gnulib/modules/unictype/property-bidi-non-spacing-mark-tests
new file mode 100644
index 00000000..ce4ac00b
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-non-spacing-mark-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_non_spacing_mark.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_non_spacing_mark
+check_PROGRAMS += test-pr_bidi_non_spacing_mark
+test_pr_bidi_non_spacing_mark_SOURCES = unictype/test-pr_bidi_non_spacing_mark.c
+
diff --git a/gnulib/modules/unictype/property-bidi-other-neutral b/gnulib/modules/unictype/property-bidi-other-neutral
new file mode 100644
index 00000000..b1a7c4af
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-other-neutral
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi other neutral".
+
+Files:
+lib/unictype/pr_bidi_other_neutral.c
+lib/unictype/pr_bidi_other_neutral.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_other_neutral.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-other-neutral-tests b/gnulib/modules/unictype/property-bidi-other-neutral-tests
new file mode 100644
index 00000000..4a540804
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-other-neutral-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_other_neutral.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_other_neutral
+check_PROGRAMS += test-pr_bidi_other_neutral
+test_pr_bidi_other_neutral_SOURCES = unictype/test-pr_bidi_other_neutral.c
+
diff --git a/gnulib/modules/unictype/property-bidi-pdf b/gnulib/modules/unictype/property-bidi-pdf
new file mode 100644
index 00000000..20d7e8f2
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-pdf
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi pdf".
+
+Files:
+lib/unictype/pr_bidi_pdf.c
+lib/unictype/pr_bidi_pdf.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_pdf.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-pdf-tests b/gnulib/modules/unictype/property-bidi-pdf-tests
new file mode 100644
index 00000000..9096a566
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-pdf-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_pdf.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_pdf
+check_PROGRAMS += test-pr_bidi_pdf
+test_pr_bidi_pdf_SOURCES = unictype/test-pr_bidi_pdf.c
+
diff --git a/gnulib/modules/unictype/property-bidi-segment-separator b/gnulib/modules/unictype/property-bidi-segment-separator
new file mode 100644
index 00000000..18c77134
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-segment-separator
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi segment separator".
+
+Files:
+lib/unictype/pr_bidi_segment_separator.c
+lib/unictype/pr_bidi_segment_separator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_segment_separator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-segment-separator-tests b/gnulib/modules/unictype/property-bidi-segment-separator-tests
new file mode 100644
index 00000000..081050cb
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-segment-separator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_segment_separator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_segment_separator
+check_PROGRAMS += test-pr_bidi_segment_separator
+test_pr_bidi_segment_separator_SOURCES = unictype/test-pr_bidi_segment_separator.c
+
diff --git a/gnulib/modules/unictype/property-bidi-whitespace b/gnulib/modules/unictype/property-bidi-whitespace
new file mode 100644
index 00000000..ed833753
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-whitespace
@@ -0,0 +1,27 @@
+Description:
+Test whether a Unicode character is "bidi whitespace".
+
+Files:
+lib/unictype/pr_bidi_whitespace.c
+lib/unictype/pr_bidi_whitespace.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/bidicategory-of
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_bidi_whitespace.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-bidi-whitespace-tests b/gnulib/modules/unictype/property-bidi-whitespace-tests
new file mode 100644
index 00000000..0bcde48a
--- /dev/null
+++ b/gnulib/modules/unictype/property-bidi-whitespace-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_bidi_whitespace.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_bidi_whitespace
+check_PROGRAMS += test-pr_bidi_whitespace
+test_pr_bidi_whitespace_SOURCES = unictype/test-pr_bidi_whitespace.c
+
diff --git a/gnulib/modules/unictype/property-byname b/gnulib/modules/unictype/property-byname
new file mode 100644
index 00000000..b50911b6
--- /dev/null
+++ b/gnulib/modules/unictype/property-byname
@@ -0,0 +1,112 @@
+Description:
+Find a Unicode character property, given its name.
+
+Files:
+lib/unictype/pr_byname.c
+lib/unictype/pr_byname.gperf
+
+Depends-on:
+unictype/base
+unictype/property-alphabetic
+unictype/property-ascii-hex-digit
+unictype/property-bidi-arabic-digit
+unictype/property-bidi-arabic-right-to-left
+unictype/property-bidi-block-separator
+unictype/property-bidi-boundary-neutral
+unictype/property-bidi-common-separator
+unictype/property-bidi-control
+unictype/property-bidi-embedding-or-override
+unictype/property-bidi-eur-num-separator
+unictype/property-bidi-eur-num-terminator
+unictype/property-bidi-european-digit
+unictype/property-bidi-hebrew-right-to-left
+unictype/property-bidi-left-to-right
+unictype/property-bidi-non-spacing-mark
+unictype/property-bidi-other-neutral
+unictype/property-bidi-pdf
+unictype/property-bidi-segment-separator
+unictype/property-bidi-whitespace
+unictype/property-combining
+unictype/property-composite
+unictype/property-currency-symbol
+unictype/property-dash
+unictype/property-decimal-digit
+unictype/property-default-ignorable-code-point
+unictype/property-deprecated
+unictype/property-diacritic
+unictype/property-extender
+unictype/property-format-control
+unictype/property-grapheme-base
+unictype/property-grapheme-extend
+unictype/property-grapheme-link
+unictype/property-hex-digit
+unictype/property-hyphen
+unictype/property-id-continue
+unictype/property-id-start
+unictype/property-ideographic
+unictype/property-ids-binary-operator
+unictype/property-ids-trinary-operator
+unictype/property-ignorable-control
+unictype/property-iso-control
+unictype/property-join-control
+unictype/property-left-of-pair
+unictype/property-line-separator
+unictype/property-logical-order-exception
+unictype/property-lowercase
+unictype/property-math
+unictype/property-non-break
+unictype/property-not-a-character
+unictype/property-numeric
+unictype/property-other-alphabetic
+unictype/property-other-default-ignorable-code-point
+unictype/property-other-grapheme-extend
+unictype/property-other-id-continue
+unictype/property-other-id-start
+unictype/property-other-lowercase
+unictype/property-other-math
+unictype/property-other-uppercase
+unictype/property-paired-punctuation
+unictype/property-paragraph-separator
+unictype/property-pattern-syntax
+unictype/property-pattern-white-space
+unictype/property-private-use
+unictype/property-punctuation
+unictype/property-quotation-mark
+unictype/property-radical
+unictype/property-sentence-terminal
+unictype/property-soft-dotted
+unictype/property-space
+unictype/property-terminal-punctuation
+unictype/property-titlecase
+unictype/property-unassigned-code-value
+unictype/property-unified-ideograph
+unictype/property-uppercase
+unictype/property-variation-selector
+unictype/property-white-space
+unictype/property-xid-continue
+unictype/property-xid-start
+unictype/property-zero-width
+gperf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/pr_byname.c
+
+unictype/pr_byname.h: unictype/pr_byname.gperf
+ $(GPERF) -m 10 $(srcdir)/unictype/pr_byname.gperf > $(srcdir)/unictype/pr_byname.h-t
+ mv $(srcdir)/unictype/pr_byname.h-t $(srcdir)/unictype/pr_byname.h
+BUILT_SOURCES += unictype/pr_byname.h
+MOSTLYCLEANFILES += unictype/pr_byname.h-t
+MAINTAINERCLEANFILES += unictype/pr_byname.h
+EXTRA_DIST += unictype/pr_byname.h
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-byname-tests b/gnulib/modules/unictype/property-byname-tests
new file mode 100644
index 00000000..ff6a60d3
--- /dev/null
+++ b/gnulib/modules/unictype/property-byname-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_byname.c
+tests/macros.h
+
+Depends-on:
+unictype/property-test
+unictype/property-composite
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_byname
+check_PROGRAMS += test-pr_byname
+test_pr_byname_SOURCES = unictype/test-pr_byname.c
+
diff --git a/gnulib/modules/unictype/property-combining b/gnulib/modules/unictype/property-combining
new file mode 100644
index 00000000..dd9706dd
--- /dev/null
+++ b/gnulib/modules/unictype/property-combining
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "combining".
+
+Files:
+lib/unictype/pr_combining.c
+lib/unictype/pr_combining.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_combining.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-combining-tests b/gnulib/modules/unictype/property-combining-tests
new file mode 100644
index 00000000..bafe54ea
--- /dev/null
+++ b/gnulib/modules/unictype/property-combining-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_combining.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_combining
+check_PROGRAMS += test-pr_combining
+test_pr_combining_SOURCES = unictype/test-pr_combining.c
+
diff --git a/gnulib/modules/unictype/property-composite b/gnulib/modules/unictype/property-composite
new file mode 100644
index 00000000..d7ec5ecf
--- /dev/null
+++ b/gnulib/modules/unictype/property-composite
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "composite".
+
+Files:
+lib/unictype/pr_composite.c
+lib/unictype/pr_composite.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_composite.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-composite-tests b/gnulib/modules/unictype/property-composite-tests
new file mode 100644
index 00000000..2d5652fa
--- /dev/null
+++ b/gnulib/modules/unictype/property-composite-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_composite.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_composite
+check_PROGRAMS += test-pr_composite
+test_pr_composite_SOURCES = unictype/test-pr_composite.c
+
diff --git a/gnulib/modules/unictype/property-currency-symbol b/gnulib/modules/unictype/property-currency-symbol
new file mode 100644
index 00000000..7c8bc9c0
--- /dev/null
+++ b/gnulib/modules/unictype/property-currency-symbol
@@ -0,0 +1,28 @@
+Description:
+Test whether a Unicode character is "currency symbol".
+
+Files:
+lib/unictype/pr_currency_symbol.c
+lib/unictype/pr_currency_symbol.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/category-test
+unictype/category-Sc
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_currency_symbol.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-currency-symbol-tests b/gnulib/modules/unictype/property-currency-symbol-tests
new file mode 100644
index 00000000..034db16f
--- /dev/null
+++ b/gnulib/modules/unictype/property-currency-symbol-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_currency_symbol.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_currency_symbol
+check_PROGRAMS += test-pr_currency_symbol
+test_pr_currency_symbol_SOURCES = unictype/test-pr_currency_symbol.c
+
diff --git a/gnulib/modules/unictype/property-dash b/gnulib/modules/unictype/property-dash
new file mode 100644
index 00000000..94a1d704
--- /dev/null
+++ b/gnulib/modules/unictype/property-dash
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "dash".
+
+Files:
+lib/unictype/pr_dash.c
+lib/unictype/pr_dash.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_dash.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-dash-tests b/gnulib/modules/unictype/property-dash-tests
new file mode 100644
index 00000000..9ca620f8
--- /dev/null
+++ b/gnulib/modules/unictype/property-dash-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_dash.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_dash
+check_PROGRAMS += test-pr_dash
+test_pr_dash_SOURCES = unictype/test-pr_dash.c
+
diff --git a/gnulib/modules/unictype/property-decimal-digit b/gnulib/modules/unictype/property-decimal-digit
new file mode 100644
index 00000000..16e390eb
--- /dev/null
+++ b/gnulib/modules/unictype/property-decimal-digit
@@ -0,0 +1,28 @@
+Description:
+Test whether a Unicode character is "decimal digit".
+
+Files:
+lib/unictype/pr_decimal_digit.c
+lib/unictype/pr_decimal_digit.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/category-test
+unictype/category-Nd
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_decimal_digit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-decimal-digit-tests b/gnulib/modules/unictype/property-decimal-digit-tests
new file mode 100644
index 00000000..9dc5dabb
--- /dev/null
+++ b/gnulib/modules/unictype/property-decimal-digit-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_decimal_digit.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_decimal_digit
+check_PROGRAMS += test-pr_decimal_digit
+test_pr_decimal_digit_SOURCES = unictype/test-pr_decimal_digit.c
+
diff --git a/gnulib/modules/unictype/property-default-ignorable-code-point b/gnulib/modules/unictype/property-default-ignorable-code-point
new file mode 100644
index 00000000..9050a664
--- /dev/null
+++ b/gnulib/modules/unictype/property-default-ignorable-code-point
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "default ignorable code point".
+
+Files:
+lib/unictype/pr_default_ignorable_code_point.c
+lib/unictype/pr_default_ignorable_code_point.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_default_ignorable_code_point.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-default-ignorable-code-point-tests b/gnulib/modules/unictype/property-default-ignorable-code-point-tests
new file mode 100644
index 00000000..f8992b69
--- /dev/null
+++ b/gnulib/modules/unictype/property-default-ignorable-code-point-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_default_ignorable_code_point.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_default_ignorable_code_point
+check_PROGRAMS += test-pr_default_ignorable_code_point
+test_pr_default_ignorable_code_point_SOURCES = unictype/test-pr_default_ignorable_code_point.c
+
diff --git a/gnulib/modules/unictype/property-deprecated b/gnulib/modules/unictype/property-deprecated
new file mode 100644
index 00000000..7e5d60b8
--- /dev/null
+++ b/gnulib/modules/unictype/property-deprecated
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "deprecated".
+
+Files:
+lib/unictype/pr_deprecated.c
+lib/unictype/pr_deprecated.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_deprecated.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-deprecated-tests b/gnulib/modules/unictype/property-deprecated-tests
new file mode 100644
index 00000000..40fc7ed8
--- /dev/null
+++ b/gnulib/modules/unictype/property-deprecated-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_deprecated.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_deprecated
+check_PROGRAMS += test-pr_deprecated
+test_pr_deprecated_SOURCES = unictype/test-pr_deprecated.c
+
diff --git a/gnulib/modules/unictype/property-diacritic b/gnulib/modules/unictype/property-diacritic
new file mode 100644
index 00000000..09df4b64
--- /dev/null
+++ b/gnulib/modules/unictype/property-diacritic
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "diacritic".
+
+Files:
+lib/unictype/pr_diacritic.c
+lib/unictype/pr_diacritic.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_diacritic.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-diacritic-tests b/gnulib/modules/unictype/property-diacritic-tests
new file mode 100644
index 00000000..f1e77ca6
--- /dev/null
+++ b/gnulib/modules/unictype/property-diacritic-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_diacritic.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_diacritic
+check_PROGRAMS += test-pr_diacritic
+test_pr_diacritic_SOURCES = unictype/test-pr_diacritic.c
+
diff --git a/gnulib/modules/unictype/property-extender b/gnulib/modules/unictype/property-extender
new file mode 100644
index 00000000..bb3ae1df
--- /dev/null
+++ b/gnulib/modules/unictype/property-extender
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "extender".
+
+Files:
+lib/unictype/pr_extender.c
+lib/unictype/pr_extender.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_extender.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-extender-tests b/gnulib/modules/unictype/property-extender-tests
new file mode 100644
index 00000000..9e1d6fac
--- /dev/null
+++ b/gnulib/modules/unictype/property-extender-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_extender.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_extender
+check_PROGRAMS += test-pr_extender
+test_pr_extender_SOURCES = unictype/test-pr_extender.c
+
diff --git a/gnulib/modules/unictype/property-format-control b/gnulib/modules/unictype/property-format-control
new file mode 100644
index 00000000..250b35d6
--- /dev/null
+++ b/gnulib/modules/unictype/property-format-control
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "format control".
+
+Files:
+lib/unictype/pr_format_control.c
+lib/unictype/pr_format_control.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_format_control.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-format-control-tests b/gnulib/modules/unictype/property-format-control-tests
new file mode 100644
index 00000000..bfda08e8
--- /dev/null
+++ b/gnulib/modules/unictype/property-format-control-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_format_control.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_format_control
+check_PROGRAMS += test-pr_format_control
+test_pr_format_control_SOURCES = unictype/test-pr_format_control.c
+
diff --git a/gnulib/modules/unictype/property-grapheme-base b/gnulib/modules/unictype/property-grapheme-base
new file mode 100644
index 00000000..6576e450
--- /dev/null
+++ b/gnulib/modules/unictype/property-grapheme-base
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "grapheme base".
+
+Files:
+lib/unictype/pr_grapheme_base.c
+lib/unictype/pr_grapheme_base.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_grapheme_base.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-grapheme-base-tests b/gnulib/modules/unictype/property-grapheme-base-tests
new file mode 100644
index 00000000..b534c393
--- /dev/null
+++ b/gnulib/modules/unictype/property-grapheme-base-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_grapheme_base.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_grapheme_base
+check_PROGRAMS += test-pr_grapheme_base
+test_pr_grapheme_base_SOURCES = unictype/test-pr_grapheme_base.c
+
diff --git a/gnulib/modules/unictype/property-grapheme-extend b/gnulib/modules/unictype/property-grapheme-extend
new file mode 100644
index 00000000..b759a4da
--- /dev/null
+++ b/gnulib/modules/unictype/property-grapheme-extend
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "grapheme extend".
+
+Files:
+lib/unictype/pr_grapheme_extend.c
+lib/unictype/pr_grapheme_extend.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_grapheme_extend.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-grapheme-extend-tests b/gnulib/modules/unictype/property-grapheme-extend-tests
new file mode 100644
index 00000000..b5bc7244
--- /dev/null
+++ b/gnulib/modules/unictype/property-grapheme-extend-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_grapheme_extend.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_grapheme_extend
+check_PROGRAMS += test-pr_grapheme_extend
+test_pr_grapheme_extend_SOURCES = unictype/test-pr_grapheme_extend.c
+
diff --git a/gnulib/modules/unictype/property-grapheme-link b/gnulib/modules/unictype/property-grapheme-link
new file mode 100644
index 00000000..29fe5767
--- /dev/null
+++ b/gnulib/modules/unictype/property-grapheme-link
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "grapheme link".
+
+Files:
+lib/unictype/pr_grapheme_link.c
+lib/unictype/pr_grapheme_link.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_grapheme_link.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-grapheme-link-tests b/gnulib/modules/unictype/property-grapheme-link-tests
new file mode 100644
index 00000000..5168325f
--- /dev/null
+++ b/gnulib/modules/unictype/property-grapheme-link-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_grapheme_link.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_grapheme_link
+check_PROGRAMS += test-pr_grapheme_link
+test_pr_grapheme_link_SOURCES = unictype/test-pr_grapheme_link.c
+
diff --git a/gnulib/modules/unictype/property-hex-digit b/gnulib/modules/unictype/property-hex-digit
new file mode 100644
index 00000000..01f25024
--- /dev/null
+++ b/gnulib/modules/unictype/property-hex-digit
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "hex digit".
+
+Files:
+lib/unictype/pr_hex_digit.c
+lib/unictype/pr_hex_digit.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_hex_digit.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-hex-digit-tests b/gnulib/modules/unictype/property-hex-digit-tests
new file mode 100644
index 00000000..043b0cda
--- /dev/null
+++ b/gnulib/modules/unictype/property-hex-digit-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_hex_digit.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_hex_digit
+check_PROGRAMS += test-pr_hex_digit
+test_pr_hex_digit_SOURCES = unictype/test-pr_hex_digit.c
+
diff --git a/gnulib/modules/unictype/property-hyphen b/gnulib/modules/unictype/property-hyphen
new file mode 100644
index 00000000..fc55b587
--- /dev/null
+++ b/gnulib/modules/unictype/property-hyphen
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "hyphen".
+
+Files:
+lib/unictype/pr_hyphen.c
+lib/unictype/pr_hyphen.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_hyphen.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-hyphen-tests b/gnulib/modules/unictype/property-hyphen-tests
new file mode 100644
index 00000000..b4a4e7e9
--- /dev/null
+++ b/gnulib/modules/unictype/property-hyphen-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_hyphen.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_hyphen
+check_PROGRAMS += test-pr_hyphen
+test_pr_hyphen_SOURCES = unictype/test-pr_hyphen.c
+
diff --git a/gnulib/modules/unictype/property-id-continue b/gnulib/modules/unictype/property-id-continue
new file mode 100644
index 00000000..9d4092ec
--- /dev/null
+++ b/gnulib/modules/unictype/property-id-continue
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "id continue".
+
+Files:
+lib/unictype/pr_id_continue.c
+lib/unictype/pr_id_continue.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_id_continue.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-id-continue-tests b/gnulib/modules/unictype/property-id-continue-tests
new file mode 100644
index 00000000..33362eda
--- /dev/null
+++ b/gnulib/modules/unictype/property-id-continue-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_id_continue.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_id_continue
+check_PROGRAMS += test-pr_id_continue
+test_pr_id_continue_SOURCES = unictype/test-pr_id_continue.c
+
diff --git a/gnulib/modules/unictype/property-id-start b/gnulib/modules/unictype/property-id-start
new file mode 100644
index 00000000..49cb595d
--- /dev/null
+++ b/gnulib/modules/unictype/property-id-start
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "id start".
+
+Files:
+lib/unictype/pr_id_start.c
+lib/unictype/pr_id_start.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_id_start.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-id-start-tests b/gnulib/modules/unictype/property-id-start-tests
new file mode 100644
index 00000000..d0e82569
--- /dev/null
+++ b/gnulib/modules/unictype/property-id-start-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_id_start.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_id_start
+check_PROGRAMS += test-pr_id_start
+test_pr_id_start_SOURCES = unictype/test-pr_id_start.c
+
diff --git a/gnulib/modules/unictype/property-ideographic b/gnulib/modules/unictype/property-ideographic
new file mode 100644
index 00000000..4400127d
--- /dev/null
+++ b/gnulib/modules/unictype/property-ideographic
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "ideographic".
+
+Files:
+lib/unictype/pr_ideographic.c
+lib/unictype/pr_ideographic.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_ideographic.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-ideographic-tests b/gnulib/modules/unictype/property-ideographic-tests
new file mode 100644
index 00000000..1b6a7256
--- /dev/null
+++ b/gnulib/modules/unictype/property-ideographic-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_ideographic.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_ideographic
+check_PROGRAMS += test-pr_ideographic
+test_pr_ideographic_SOURCES = unictype/test-pr_ideographic.c
+
diff --git a/gnulib/modules/unictype/property-ids-binary-operator b/gnulib/modules/unictype/property-ids-binary-operator
new file mode 100644
index 00000000..2accc75a
--- /dev/null
+++ b/gnulib/modules/unictype/property-ids-binary-operator
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "ids binary operator".
+
+Files:
+lib/unictype/pr_ids_binary_operator.c
+lib/unictype/pr_ids_binary_operator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_ids_binary_operator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-ids-binary-operator-tests b/gnulib/modules/unictype/property-ids-binary-operator-tests
new file mode 100644
index 00000000..195c854f
--- /dev/null
+++ b/gnulib/modules/unictype/property-ids-binary-operator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_ids_binary_operator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_ids_binary_operator
+check_PROGRAMS += test-pr_ids_binary_operator
+test_pr_ids_binary_operator_SOURCES = unictype/test-pr_ids_binary_operator.c
+
diff --git a/gnulib/modules/unictype/property-ids-trinary-operator b/gnulib/modules/unictype/property-ids-trinary-operator
new file mode 100644
index 00000000..46d01f95
--- /dev/null
+++ b/gnulib/modules/unictype/property-ids-trinary-operator
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "ids trinary operator".
+
+Files:
+lib/unictype/pr_ids_trinary_operator.c
+lib/unictype/pr_ids_trinary_operator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_ids_trinary_operator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-ids-trinary-operator-tests b/gnulib/modules/unictype/property-ids-trinary-operator-tests
new file mode 100644
index 00000000..e9e448ee
--- /dev/null
+++ b/gnulib/modules/unictype/property-ids-trinary-operator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_ids_trinary_operator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_ids_trinary_operator
+check_PROGRAMS += test-pr_ids_trinary_operator
+test_pr_ids_trinary_operator_SOURCES = unictype/test-pr_ids_trinary_operator.c
+
diff --git a/gnulib/modules/unictype/property-ignorable-control b/gnulib/modules/unictype/property-ignorable-control
new file mode 100644
index 00000000..c8e17df1
--- /dev/null
+++ b/gnulib/modules/unictype/property-ignorable-control
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "ignorable control".
+
+Files:
+lib/unictype/pr_ignorable_control.c
+lib/unictype/pr_ignorable_control.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_ignorable_control.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-ignorable-control-tests b/gnulib/modules/unictype/property-ignorable-control-tests
new file mode 100644
index 00000000..1e72a68a
--- /dev/null
+++ b/gnulib/modules/unictype/property-ignorable-control-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_ignorable_control.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_ignorable_control
+check_PROGRAMS += test-pr_ignorable_control
+test_pr_ignorable_control_SOURCES = unictype/test-pr_ignorable_control.c
+
diff --git a/gnulib/modules/unictype/property-iso-control b/gnulib/modules/unictype/property-iso-control
new file mode 100644
index 00000000..596f18d9
--- /dev/null
+++ b/gnulib/modules/unictype/property-iso-control
@@ -0,0 +1,28 @@
+Description:
+Test whether a Unicode character is "iso control".
+
+Files:
+lib/unictype/pr_iso_control.c
+lib/unictype/pr_iso_control.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/category-test
+unictype/category-Cc
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_iso_control.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-iso-control-tests b/gnulib/modules/unictype/property-iso-control-tests
new file mode 100644
index 00000000..8923607c
--- /dev/null
+++ b/gnulib/modules/unictype/property-iso-control-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_iso_control.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_iso_control
+check_PROGRAMS += test-pr_iso_control
+test_pr_iso_control_SOURCES = unictype/test-pr_iso_control.c
+
diff --git a/gnulib/modules/unictype/property-join-control b/gnulib/modules/unictype/property-join-control
new file mode 100644
index 00000000..ba2241a4
--- /dev/null
+++ b/gnulib/modules/unictype/property-join-control
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "join control".
+
+Files:
+lib/unictype/pr_join_control.c
+lib/unictype/pr_join_control.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_join_control.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-join-control-tests b/gnulib/modules/unictype/property-join-control-tests
new file mode 100644
index 00000000..17deabb7
--- /dev/null
+++ b/gnulib/modules/unictype/property-join-control-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_join_control.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_join_control
+check_PROGRAMS += test-pr_join_control
+test_pr_join_control_SOURCES = unictype/test-pr_join_control.c
+
diff --git a/gnulib/modules/unictype/property-left-of-pair b/gnulib/modules/unictype/property-left-of-pair
new file mode 100644
index 00000000..f8310942
--- /dev/null
+++ b/gnulib/modules/unictype/property-left-of-pair
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "left of pair".
+
+Files:
+lib/unictype/pr_left_of_pair.c
+lib/unictype/pr_left_of_pair.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_left_of_pair.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-left-of-pair-tests b/gnulib/modules/unictype/property-left-of-pair-tests
new file mode 100644
index 00000000..ea9bd6e5
--- /dev/null
+++ b/gnulib/modules/unictype/property-left-of-pair-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_left_of_pair.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_left_of_pair
+check_PROGRAMS += test-pr_left_of_pair
+test_pr_left_of_pair_SOURCES = unictype/test-pr_left_of_pair.c
+
diff --git a/gnulib/modules/unictype/property-line-separator b/gnulib/modules/unictype/property-line-separator
new file mode 100644
index 00000000..6a8e3e97
--- /dev/null
+++ b/gnulib/modules/unictype/property-line-separator
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "line separator".
+
+Files:
+lib/unictype/pr_line_separator.c
+lib/unictype/pr_line_separator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_line_separator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-line-separator-tests b/gnulib/modules/unictype/property-line-separator-tests
new file mode 100644
index 00000000..15a519de
--- /dev/null
+++ b/gnulib/modules/unictype/property-line-separator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_line_separator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_line_separator
+check_PROGRAMS += test-pr_line_separator
+test_pr_line_separator_SOURCES = unictype/test-pr_line_separator.c
+
diff --git a/gnulib/modules/unictype/property-logical-order-exception b/gnulib/modules/unictype/property-logical-order-exception
new file mode 100644
index 00000000..b84ffd13
--- /dev/null
+++ b/gnulib/modules/unictype/property-logical-order-exception
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "logical order exception".
+
+Files:
+lib/unictype/pr_logical_order_exception.c
+lib/unictype/pr_logical_order_exception.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_logical_order_exception.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-logical-order-exception-tests b/gnulib/modules/unictype/property-logical-order-exception-tests
new file mode 100644
index 00000000..44411832
--- /dev/null
+++ b/gnulib/modules/unictype/property-logical-order-exception-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_logical_order_exception.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_logical_order_exception
+check_PROGRAMS += test-pr_logical_order_exception
+test_pr_logical_order_exception_SOURCES = unictype/test-pr_logical_order_exception.c
+
diff --git a/gnulib/modules/unictype/property-lowercase b/gnulib/modules/unictype/property-lowercase
new file mode 100644
index 00000000..90073a13
--- /dev/null
+++ b/gnulib/modules/unictype/property-lowercase
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "lowercase".
+
+Files:
+lib/unictype/pr_lowercase.c
+lib/unictype/pr_lowercase.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_lowercase.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-lowercase-tests b/gnulib/modules/unictype/property-lowercase-tests
new file mode 100644
index 00000000..302110a3
--- /dev/null
+++ b/gnulib/modules/unictype/property-lowercase-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_lowercase.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_lowercase
+check_PROGRAMS += test-pr_lowercase
+test_pr_lowercase_SOURCES = unictype/test-pr_lowercase.c
+
diff --git a/gnulib/modules/unictype/property-math b/gnulib/modules/unictype/property-math
new file mode 100644
index 00000000..e2d9d395
--- /dev/null
+++ b/gnulib/modules/unictype/property-math
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "math".
+
+Files:
+lib/unictype/pr_math.c
+lib/unictype/pr_math.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_math.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-math-tests b/gnulib/modules/unictype/property-math-tests
new file mode 100644
index 00000000..04010a08
--- /dev/null
+++ b/gnulib/modules/unictype/property-math-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_math.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_math
+check_PROGRAMS += test-pr_math
+test_pr_math_SOURCES = unictype/test-pr_math.c
+
diff --git a/gnulib/modules/unictype/property-non-break b/gnulib/modules/unictype/property-non-break
new file mode 100644
index 00000000..2a4835d7
--- /dev/null
+++ b/gnulib/modules/unictype/property-non-break
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "non break".
+
+Files:
+lib/unictype/pr_non_break.c
+lib/unictype/pr_non_break.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_non_break.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-non-break-tests b/gnulib/modules/unictype/property-non-break-tests
new file mode 100644
index 00000000..0ba6b8f7
--- /dev/null
+++ b/gnulib/modules/unictype/property-non-break-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_non_break.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_non_break
+check_PROGRAMS += test-pr_non_break
+test_pr_non_break_SOURCES = unictype/test-pr_non_break.c
+
diff --git a/gnulib/modules/unictype/property-not-a-character b/gnulib/modules/unictype/property-not-a-character
new file mode 100644
index 00000000..3b7fa7d0
--- /dev/null
+++ b/gnulib/modules/unictype/property-not-a-character
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "not a character".
+
+Files:
+lib/unictype/pr_not_a_character.c
+lib/unictype/pr_not_a_character.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_not_a_character.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-not-a-character-tests b/gnulib/modules/unictype/property-not-a-character-tests
new file mode 100644
index 00000000..5c96ba5f
--- /dev/null
+++ b/gnulib/modules/unictype/property-not-a-character-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_not_a_character.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_not_a_character
+check_PROGRAMS += test-pr_not_a_character
+test_pr_not_a_character_SOURCES = unictype/test-pr_not_a_character.c
+
diff --git a/gnulib/modules/unictype/property-numeric b/gnulib/modules/unictype/property-numeric
new file mode 100644
index 00000000..0bd6da15
--- /dev/null
+++ b/gnulib/modules/unictype/property-numeric
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "numeric".
+
+Files:
+lib/unictype/pr_numeric.c
+lib/unictype/pr_numeric.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_numeric.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-numeric-tests b/gnulib/modules/unictype/property-numeric-tests
new file mode 100644
index 00000000..ac4c4b88
--- /dev/null
+++ b/gnulib/modules/unictype/property-numeric-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_numeric.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_numeric
+check_PROGRAMS += test-pr_numeric
+test_pr_numeric_SOURCES = unictype/test-pr_numeric.c
+
diff --git a/gnulib/modules/unictype/property-other-alphabetic b/gnulib/modules/unictype/property-other-alphabetic
new file mode 100644
index 00000000..40db74d1
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-alphabetic
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "other alphabetic".
+
+Files:
+lib/unictype/pr_other_alphabetic.c
+lib/unictype/pr_other_alphabetic.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_other_alphabetic.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-other-alphabetic-tests b/gnulib/modules/unictype/property-other-alphabetic-tests
new file mode 100644
index 00000000..1c5a83c3
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-alphabetic-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_other_alphabetic.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_other_alphabetic
+check_PROGRAMS += test-pr_other_alphabetic
+test_pr_other_alphabetic_SOURCES = unictype/test-pr_other_alphabetic.c
+
diff --git a/gnulib/modules/unictype/property-other-default-ignorable-code-point b/gnulib/modules/unictype/property-other-default-ignorable-code-point
new file mode 100644
index 00000000..5abe6b8a
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-default-ignorable-code-point
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "other default ignorable code point".
+
+Files:
+lib/unictype/pr_other_default_ignorable_code_point.c
+lib/unictype/pr_other_default_ignorable_code_point.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_other_default_ignorable_code_point.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-other-default-ignorable-code-point-tests b/gnulib/modules/unictype/property-other-default-ignorable-code-point-tests
new file mode 100644
index 00000000..213aea77
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-default-ignorable-code-point-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_other_default_ignorable_code_point.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_other_default_ignorable_code_point
+check_PROGRAMS += test-pr_other_default_ignorable_code_point
+test_pr_other_default_ignorable_code_point_SOURCES = unictype/test-pr_other_default_ignorable_code_point.c
+
diff --git a/gnulib/modules/unictype/property-other-grapheme-extend b/gnulib/modules/unictype/property-other-grapheme-extend
new file mode 100644
index 00000000..3408a2d8
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-grapheme-extend
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "other grapheme extend".
+
+Files:
+lib/unictype/pr_other_grapheme_extend.c
+lib/unictype/pr_other_grapheme_extend.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_other_grapheme_extend.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-other-grapheme-extend-tests b/gnulib/modules/unictype/property-other-grapheme-extend-tests
new file mode 100644
index 00000000..7a5fce5d
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-grapheme-extend-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_other_grapheme_extend.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_other_grapheme_extend
+check_PROGRAMS += test-pr_other_grapheme_extend
+test_pr_other_grapheme_extend_SOURCES = unictype/test-pr_other_grapheme_extend.c
+
diff --git a/gnulib/modules/unictype/property-other-id-continue b/gnulib/modules/unictype/property-other-id-continue
new file mode 100644
index 00000000..f9204315
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-id-continue
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "other id continue".
+
+Files:
+lib/unictype/pr_other_id_continue.c
+lib/unictype/pr_other_id_continue.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_other_id_continue.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-other-id-continue-tests b/gnulib/modules/unictype/property-other-id-continue-tests
new file mode 100644
index 00000000..f40de9ee
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-id-continue-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_other_id_continue.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_other_id_continue
+check_PROGRAMS += test-pr_other_id_continue
+test_pr_other_id_continue_SOURCES = unictype/test-pr_other_id_continue.c
+
diff --git a/gnulib/modules/unictype/property-other-id-start b/gnulib/modules/unictype/property-other-id-start
new file mode 100644
index 00000000..627da3ad
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-id-start
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "other id start".
+
+Files:
+lib/unictype/pr_other_id_start.c
+lib/unictype/pr_other_id_start.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_other_id_start.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-other-id-start-tests b/gnulib/modules/unictype/property-other-id-start-tests
new file mode 100644
index 00000000..cf1b2e41
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-id-start-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_other_id_start.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_other_id_start
+check_PROGRAMS += test-pr_other_id_start
+test_pr_other_id_start_SOURCES = unictype/test-pr_other_id_start.c
+
diff --git a/gnulib/modules/unictype/property-other-lowercase b/gnulib/modules/unictype/property-other-lowercase
new file mode 100644
index 00000000..d416b446
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-lowercase
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "other lowercase".
+
+Files:
+lib/unictype/pr_other_lowercase.c
+lib/unictype/pr_other_lowercase.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_other_lowercase.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-other-lowercase-tests b/gnulib/modules/unictype/property-other-lowercase-tests
new file mode 100644
index 00000000..ba13d39a
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-lowercase-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_other_lowercase.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_other_lowercase
+check_PROGRAMS += test-pr_other_lowercase
+test_pr_other_lowercase_SOURCES = unictype/test-pr_other_lowercase.c
+
diff --git a/gnulib/modules/unictype/property-other-math b/gnulib/modules/unictype/property-other-math
new file mode 100644
index 00000000..3ef531eb
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-math
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "other math".
+
+Files:
+lib/unictype/pr_other_math.c
+lib/unictype/pr_other_math.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_other_math.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-other-math-tests b/gnulib/modules/unictype/property-other-math-tests
new file mode 100644
index 00000000..1cbcc5a0
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-math-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_other_math.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_other_math
+check_PROGRAMS += test-pr_other_math
+test_pr_other_math_SOURCES = unictype/test-pr_other_math.c
+
diff --git a/gnulib/modules/unictype/property-other-uppercase b/gnulib/modules/unictype/property-other-uppercase
new file mode 100644
index 00000000..81cd907c
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-uppercase
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "other uppercase".
+
+Files:
+lib/unictype/pr_other_uppercase.c
+lib/unictype/pr_other_uppercase.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_other_uppercase.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-other-uppercase-tests b/gnulib/modules/unictype/property-other-uppercase-tests
new file mode 100644
index 00000000..d8c60317
--- /dev/null
+++ b/gnulib/modules/unictype/property-other-uppercase-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_other_uppercase.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_other_uppercase
+check_PROGRAMS += test-pr_other_uppercase
+test_pr_other_uppercase_SOURCES = unictype/test-pr_other_uppercase.c
+
diff --git a/gnulib/modules/unictype/property-paired-punctuation b/gnulib/modules/unictype/property-paired-punctuation
new file mode 100644
index 00000000..c863fee5
--- /dev/null
+++ b/gnulib/modules/unictype/property-paired-punctuation
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "paired punctuation".
+
+Files:
+lib/unictype/pr_paired_punctuation.c
+lib/unictype/pr_paired_punctuation.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_paired_punctuation.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-paired-punctuation-tests b/gnulib/modules/unictype/property-paired-punctuation-tests
new file mode 100644
index 00000000..941190da
--- /dev/null
+++ b/gnulib/modules/unictype/property-paired-punctuation-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_paired_punctuation.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_paired_punctuation
+check_PROGRAMS += test-pr_paired_punctuation
+test_pr_paired_punctuation_SOURCES = unictype/test-pr_paired_punctuation.c
+
diff --git a/gnulib/modules/unictype/property-paragraph-separator b/gnulib/modules/unictype/property-paragraph-separator
new file mode 100644
index 00000000..0415746e
--- /dev/null
+++ b/gnulib/modules/unictype/property-paragraph-separator
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "paragraph separator".
+
+Files:
+lib/unictype/pr_paragraph_separator.c
+lib/unictype/pr_paragraph_separator.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_paragraph_separator.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-paragraph-separator-tests b/gnulib/modules/unictype/property-paragraph-separator-tests
new file mode 100644
index 00000000..81468513
--- /dev/null
+++ b/gnulib/modules/unictype/property-paragraph-separator-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_paragraph_separator.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_paragraph_separator
+check_PROGRAMS += test-pr_paragraph_separator
+test_pr_paragraph_separator_SOURCES = unictype/test-pr_paragraph_separator.c
+
diff --git a/gnulib/modules/unictype/property-pattern-syntax b/gnulib/modules/unictype/property-pattern-syntax
new file mode 100644
index 00000000..e184dad4
--- /dev/null
+++ b/gnulib/modules/unictype/property-pattern-syntax
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "pattern syntax".
+
+Files:
+lib/unictype/pr_pattern_syntax.c
+lib/unictype/pr_pattern_syntax.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_pattern_syntax.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-pattern-syntax-tests b/gnulib/modules/unictype/property-pattern-syntax-tests
new file mode 100644
index 00000000..43fb342b
--- /dev/null
+++ b/gnulib/modules/unictype/property-pattern-syntax-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_pattern_syntax.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_pattern_syntax
+check_PROGRAMS += test-pr_pattern_syntax
+test_pr_pattern_syntax_SOURCES = unictype/test-pr_pattern_syntax.c
+
diff --git a/gnulib/modules/unictype/property-pattern-white-space b/gnulib/modules/unictype/property-pattern-white-space
new file mode 100644
index 00000000..26f3c1ab
--- /dev/null
+++ b/gnulib/modules/unictype/property-pattern-white-space
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "pattern white space".
+
+Files:
+lib/unictype/pr_pattern_white_space.c
+lib/unictype/pr_pattern_white_space.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_pattern_white_space.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-pattern-white-space-tests b/gnulib/modules/unictype/property-pattern-white-space-tests
new file mode 100644
index 00000000..6edae420
--- /dev/null
+++ b/gnulib/modules/unictype/property-pattern-white-space-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_pattern_white_space.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_pattern_white_space
+check_PROGRAMS += test-pr_pattern_white_space
+test_pr_pattern_white_space_SOURCES = unictype/test-pr_pattern_white_space.c
+
diff --git a/gnulib/modules/unictype/property-private-use b/gnulib/modules/unictype/property-private-use
new file mode 100644
index 00000000..dd9c3fd7
--- /dev/null
+++ b/gnulib/modules/unictype/property-private-use
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "private use".
+
+Files:
+lib/unictype/pr_private_use.c
+lib/unictype/pr_private_use.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_private_use.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-private-use-tests b/gnulib/modules/unictype/property-private-use-tests
new file mode 100644
index 00000000..f9b4d24b
--- /dev/null
+++ b/gnulib/modules/unictype/property-private-use-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_private_use.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_private_use
+check_PROGRAMS += test-pr_private_use
+test_pr_private_use_SOURCES = unictype/test-pr_private_use.c
+
diff --git a/gnulib/modules/unictype/property-punctuation b/gnulib/modules/unictype/property-punctuation
new file mode 100644
index 00000000..33890d15
--- /dev/null
+++ b/gnulib/modules/unictype/property-punctuation
@@ -0,0 +1,28 @@
+Description:
+Test whether a Unicode character is "punctuation".
+
+Files:
+lib/unictype/pr_punctuation.c
+lib/unictype/pr_punctuation.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/category-test
+unictype/category-P
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_punctuation.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-punctuation-tests b/gnulib/modules/unictype/property-punctuation-tests
new file mode 100644
index 00000000..afee3258
--- /dev/null
+++ b/gnulib/modules/unictype/property-punctuation-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_punctuation.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_punctuation
+check_PROGRAMS += test-pr_punctuation
+test_pr_punctuation_SOURCES = unictype/test-pr_punctuation.c
+
diff --git a/gnulib/modules/unictype/property-quotation-mark b/gnulib/modules/unictype/property-quotation-mark
new file mode 100644
index 00000000..511c133a
--- /dev/null
+++ b/gnulib/modules/unictype/property-quotation-mark
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "quotation mark".
+
+Files:
+lib/unictype/pr_quotation_mark.c
+lib/unictype/pr_quotation_mark.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_quotation_mark.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-quotation-mark-tests b/gnulib/modules/unictype/property-quotation-mark-tests
new file mode 100644
index 00000000..21862e96
--- /dev/null
+++ b/gnulib/modules/unictype/property-quotation-mark-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_quotation_mark.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_quotation_mark
+check_PROGRAMS += test-pr_quotation_mark
+test_pr_quotation_mark_SOURCES = unictype/test-pr_quotation_mark.c
+
diff --git a/gnulib/modules/unictype/property-radical b/gnulib/modules/unictype/property-radical
new file mode 100644
index 00000000..5b8eb1b3
--- /dev/null
+++ b/gnulib/modules/unictype/property-radical
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "radical".
+
+Files:
+lib/unictype/pr_radical.c
+lib/unictype/pr_radical.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_radical.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-radical-tests b/gnulib/modules/unictype/property-radical-tests
new file mode 100644
index 00000000..ffa8d615
--- /dev/null
+++ b/gnulib/modules/unictype/property-radical-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_radical.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_radical
+check_PROGRAMS += test-pr_radical
+test_pr_radical_SOURCES = unictype/test-pr_radical.c
+
diff --git a/gnulib/modules/unictype/property-sentence-terminal b/gnulib/modules/unictype/property-sentence-terminal
new file mode 100644
index 00000000..16dc1cb0
--- /dev/null
+++ b/gnulib/modules/unictype/property-sentence-terminal
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "sentence terminal".
+
+Files:
+lib/unictype/pr_sentence_terminal.c
+lib/unictype/pr_sentence_terminal.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_sentence_terminal.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-sentence-terminal-tests b/gnulib/modules/unictype/property-sentence-terminal-tests
new file mode 100644
index 00000000..6ae3e90b
--- /dev/null
+++ b/gnulib/modules/unictype/property-sentence-terminal-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_sentence_terminal.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_sentence_terminal
+check_PROGRAMS += test-pr_sentence_terminal
+test_pr_sentence_terminal_SOURCES = unictype/test-pr_sentence_terminal.c
+
diff --git a/gnulib/modules/unictype/property-soft-dotted b/gnulib/modules/unictype/property-soft-dotted
new file mode 100644
index 00000000..41f10188
--- /dev/null
+++ b/gnulib/modules/unictype/property-soft-dotted
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "soft dotted".
+
+Files:
+lib/unictype/pr_soft_dotted.c
+lib/unictype/pr_soft_dotted.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_soft_dotted.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-soft-dotted-tests b/gnulib/modules/unictype/property-soft-dotted-tests
new file mode 100644
index 00000000..6b9c6e55
--- /dev/null
+++ b/gnulib/modules/unictype/property-soft-dotted-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_soft_dotted.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_soft_dotted
+check_PROGRAMS += test-pr_soft_dotted
+test_pr_soft_dotted_SOURCES = unictype/test-pr_soft_dotted.c
+
diff --git a/gnulib/modules/unictype/property-space b/gnulib/modules/unictype/property-space
new file mode 100644
index 00000000..d6a8345b
--- /dev/null
+++ b/gnulib/modules/unictype/property-space
@@ -0,0 +1,28 @@
+Description:
+Test whether a Unicode character is "space".
+
+Files:
+lib/unictype/pr_space.c
+lib/unictype/pr_space.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/category-test
+unictype/category-Zs
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_space.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-space-tests b/gnulib/modules/unictype/property-space-tests
new file mode 100644
index 00000000..9ad1edd7
--- /dev/null
+++ b/gnulib/modules/unictype/property-space-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_space.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_space
+check_PROGRAMS += test-pr_space
+test_pr_space_SOURCES = unictype/test-pr_space.c
+
diff --git a/gnulib/modules/unictype/property-terminal-punctuation b/gnulib/modules/unictype/property-terminal-punctuation
new file mode 100644
index 00000000..9d76602b
--- /dev/null
+++ b/gnulib/modules/unictype/property-terminal-punctuation
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "terminal punctuation".
+
+Files:
+lib/unictype/pr_terminal_punctuation.c
+lib/unictype/pr_terminal_punctuation.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_terminal_punctuation.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-terminal-punctuation-tests b/gnulib/modules/unictype/property-terminal-punctuation-tests
new file mode 100644
index 00000000..4c36eddc
--- /dev/null
+++ b/gnulib/modules/unictype/property-terminal-punctuation-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_terminal_punctuation.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_terminal_punctuation
+check_PROGRAMS += test-pr_terminal_punctuation
+test_pr_terminal_punctuation_SOURCES = unictype/test-pr_terminal_punctuation.c
+
diff --git a/gnulib/modules/unictype/property-test b/gnulib/modules/unictype/property-test
new file mode 100644
index 00000000..385c0821
--- /dev/null
+++ b/gnulib/modules/unictype/property-test
@@ -0,0 +1,23 @@
+Description:
+Test whether a Unicode character has a given property.
+
+Files:
+lib/unictype/pr_test.c
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/pr_test.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-test-tests b/gnulib/modules/unictype/property-test-tests
new file mode 100644
index 00000000..34597a83
--- /dev/null
+++ b/gnulib/modules/unictype/property-test-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unictype/test-pr_test.c
+tests/macros.h
+
+Depends-on:
+unictype/property-composite
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_test
+check_PROGRAMS += test-pr_test
+test_pr_test_SOURCES = unictype/test-pr_test.c
+
diff --git a/gnulib/modules/unictype/property-titlecase b/gnulib/modules/unictype/property-titlecase
new file mode 100644
index 00000000..793d6c33
--- /dev/null
+++ b/gnulib/modules/unictype/property-titlecase
@@ -0,0 +1,28 @@
+Description:
+Test whether a Unicode character is "titlecase".
+
+Files:
+lib/unictype/pr_titlecase.c
+lib/unictype/pr_titlecase.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+unictype/category-test
+unictype/category-Lt
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_titlecase.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-titlecase-tests b/gnulib/modules/unictype/property-titlecase-tests
new file mode 100644
index 00000000..16cbecfb
--- /dev/null
+++ b/gnulib/modules/unictype/property-titlecase-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_titlecase.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_titlecase
+check_PROGRAMS += test-pr_titlecase
+test_pr_titlecase_SOURCES = unictype/test-pr_titlecase.c
+
diff --git a/gnulib/modules/unictype/property-unassigned-code-value b/gnulib/modules/unictype/property-unassigned-code-value
new file mode 100644
index 00000000..fb63d9b6
--- /dev/null
+++ b/gnulib/modules/unictype/property-unassigned-code-value
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "unassigned code value".
+
+Files:
+lib/unictype/pr_unassigned_code_value.c
+lib/unictype/pr_unassigned_code_value.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_unassigned_code_value.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-unassigned-code-value-tests b/gnulib/modules/unictype/property-unassigned-code-value-tests
new file mode 100644
index 00000000..1d92aee7
--- /dev/null
+++ b/gnulib/modules/unictype/property-unassigned-code-value-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_unassigned_code_value.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_unassigned_code_value
+check_PROGRAMS += test-pr_unassigned_code_value
+test_pr_unassigned_code_value_SOURCES = unictype/test-pr_unassigned_code_value.c
+
diff --git a/gnulib/modules/unictype/property-unified-ideograph b/gnulib/modules/unictype/property-unified-ideograph
new file mode 100644
index 00000000..700b2e68
--- /dev/null
+++ b/gnulib/modules/unictype/property-unified-ideograph
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "unified ideograph".
+
+Files:
+lib/unictype/pr_unified_ideograph.c
+lib/unictype/pr_unified_ideograph.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_unified_ideograph.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-unified-ideograph-tests b/gnulib/modules/unictype/property-unified-ideograph-tests
new file mode 100644
index 00000000..b6ef0341
--- /dev/null
+++ b/gnulib/modules/unictype/property-unified-ideograph-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_unified_ideograph.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_unified_ideograph
+check_PROGRAMS += test-pr_unified_ideograph
+test_pr_unified_ideograph_SOURCES = unictype/test-pr_unified_ideograph.c
+
diff --git a/gnulib/modules/unictype/property-uppercase b/gnulib/modules/unictype/property-uppercase
new file mode 100644
index 00000000..f645f81f
--- /dev/null
+++ b/gnulib/modules/unictype/property-uppercase
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "uppercase".
+
+Files:
+lib/unictype/pr_uppercase.c
+lib/unictype/pr_uppercase.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_uppercase.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-uppercase-tests b/gnulib/modules/unictype/property-uppercase-tests
new file mode 100644
index 00000000..e0e8a447
--- /dev/null
+++ b/gnulib/modules/unictype/property-uppercase-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_uppercase.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_uppercase
+check_PROGRAMS += test-pr_uppercase
+test_pr_uppercase_SOURCES = unictype/test-pr_uppercase.c
+
diff --git a/gnulib/modules/unictype/property-variation-selector b/gnulib/modules/unictype/property-variation-selector
new file mode 100644
index 00000000..4fc42e54
--- /dev/null
+++ b/gnulib/modules/unictype/property-variation-selector
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "variation selector".
+
+Files:
+lib/unictype/pr_variation_selector.c
+lib/unictype/pr_variation_selector.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_variation_selector.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-variation-selector-tests b/gnulib/modules/unictype/property-variation-selector-tests
new file mode 100644
index 00000000..8150e179
--- /dev/null
+++ b/gnulib/modules/unictype/property-variation-selector-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_variation_selector.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_variation_selector
+check_PROGRAMS += test-pr_variation_selector
+test_pr_variation_selector_SOURCES = unictype/test-pr_variation_selector.c
+
diff --git a/gnulib/modules/unictype/property-white-space b/gnulib/modules/unictype/property-white-space
new file mode 100644
index 00000000..decb2860
--- /dev/null
+++ b/gnulib/modules/unictype/property-white-space
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "white space".
+
+Files:
+lib/unictype/pr_white_space.c
+lib/unictype/pr_white_space.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_white_space.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-white-space-tests b/gnulib/modules/unictype/property-white-space-tests
new file mode 100644
index 00000000..64cf0930
--- /dev/null
+++ b/gnulib/modules/unictype/property-white-space-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_white_space.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_white_space
+check_PROGRAMS += test-pr_white_space
+test_pr_white_space_SOURCES = unictype/test-pr_white_space.c
+
diff --git a/gnulib/modules/unictype/property-xid-continue b/gnulib/modules/unictype/property-xid-continue
new file mode 100644
index 00000000..6480d926
--- /dev/null
+++ b/gnulib/modules/unictype/property-xid-continue
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "xid continue".
+
+Files:
+lib/unictype/pr_xid_continue.c
+lib/unictype/pr_xid_continue.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_xid_continue.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-xid-continue-tests b/gnulib/modules/unictype/property-xid-continue-tests
new file mode 100644
index 00000000..ee71a023
--- /dev/null
+++ b/gnulib/modules/unictype/property-xid-continue-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_xid_continue.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_xid_continue
+check_PROGRAMS += test-pr_xid_continue
+test_pr_xid_continue_SOURCES = unictype/test-pr_xid_continue.c
+
diff --git a/gnulib/modules/unictype/property-xid-start b/gnulib/modules/unictype/property-xid-start
new file mode 100644
index 00000000..8008a9fe
--- /dev/null
+++ b/gnulib/modules/unictype/property-xid-start
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "xid start".
+
+Files:
+lib/unictype/pr_xid_start.c
+lib/unictype/pr_xid_start.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_xid_start.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-xid-start-tests b/gnulib/modules/unictype/property-xid-start-tests
new file mode 100644
index 00000000..a1a2a097
--- /dev/null
+++ b/gnulib/modules/unictype/property-xid-start-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_xid_start.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_xid_start
+check_PROGRAMS += test-pr_xid_start
+test_pr_xid_start_SOURCES = unictype/test-pr_xid_start.c
+
diff --git a/gnulib/modules/unictype/property-zero-width b/gnulib/modules/unictype/property-zero-width
new file mode 100644
index 00000000..759ff4e0
--- /dev/null
+++ b/gnulib/modules/unictype/property-zero-width
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character is "zero width".
+
+Files:
+lib/unictype/pr_zero_width.c
+lib/unictype/pr_zero_width.h
+lib/unictype/bitmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/pr_zero_width.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/property-zero-width-tests b/gnulib/modules/unictype/property-zero-width-tests
new file mode 100644
index 00000000..20163ddf
--- /dev/null
+++ b/gnulib/modules/unictype/property-zero-width-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-pr_zero_width.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-pr_zero_width
+check_PROGRAMS += test-pr_zero_width
+test_pr_zero_width_SOURCES = unictype/test-pr_zero_width.c
+
diff --git a/gnulib/modules/unictype/scripts b/gnulib/modules/unictype/scripts
new file mode 100644
index 00000000..6d5c71b2
--- /dev/null
+++ b/gnulib/modules/unictype/scripts
@@ -0,0 +1,34 @@
+Description:
+Scripts of Unicode characters.
+
+Files:
+lib/unictype/scripts.c
+lib/unictype/scripts.h
+lib/unictype/scripts_byname.gperf
+
+Depends-on:
+unictype/base
+gperf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/scripts.c
+
+unictype/scripts_byname.h: unictype/scripts_byname.gperf
+ $(GPERF) -m 10 $(srcdir)/unictype/scripts_byname.gperf > $(srcdir)/unictype/scripts_byname.h-t
+ mv $(srcdir)/unictype/scripts_byname.h-t $(srcdir)/unictype/scripts_byname.h
+BUILT_SOURCES += unictype/scripts_byname.h
+MOSTLYCLEANFILES += unictype/scripts_byname.h-t
+MAINTAINERCLEANFILES += unictype/scripts_byname.h
+EXTRA_DIST += unictype/scripts_byname.h
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/scripts-all b/gnulib/modules/unictype/scripts-all
new file mode 100644
index 00000000..f209d622
--- /dev/null
+++ b/gnulib/modules/unictype/scripts-all
@@ -0,0 +1,21 @@
+Description:
+Complete API for scripts of Unicode characters.
+
+Files:
+
+Depends-on:
+unictype/scripts
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/scripts-tests b/gnulib/modules/unictype/scripts-tests
new file mode 100644
index 00000000..cd6a6eb5
--- /dev/null
+++ b/gnulib/modules/unictype/scripts-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-scripts.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-scripts
+check_PROGRAMS += test-scripts
+test_scripts_SOURCES = unictype/test-scripts.c
+
diff --git a/gnulib/modules/unictype/syntax-c-ident b/gnulib/modules/unictype/syntax-c-ident
new file mode 100644
index 00000000..2106569c
--- /dev/null
+++ b/gnulib/modules/unictype/syntax-c-ident
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character can occur in identifiers in the C language.
+
+Files:
+lib/unictype/sy_c_ident.c
+lib/unictype/sy_c_ident.h
+lib/unictype/identsyntaxmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/sy_c_ident.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/syntax-c-ident-tests b/gnulib/modules/unictype/syntax-c-ident-tests
new file mode 100644
index 00000000..5bd69aa7
--- /dev/null
+++ b/gnulib/modules/unictype/syntax-c-ident-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-sy_c_ident.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sy_c_ident
+check_PROGRAMS += test-sy_c_ident
+test_sy_c_ident_SOURCES = unictype/test-sy_c_ident.c
+
diff --git a/gnulib/modules/unictype/syntax-c-whitespace b/gnulib/modules/unictype/syntax-c-whitespace
new file mode 100644
index 00000000..8c5be57b
--- /dev/null
+++ b/gnulib/modules/unictype/syntax-c-whitespace
@@ -0,0 +1,23 @@
+Description:
+Test whether a Unicode character is whitespace in the C language syntax.
+
+Files:
+lib/unictype/sy_c_whitespace.c
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/sy_c_whitespace.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/syntax-c-whitespace-tests b/gnulib/modules/unictype/syntax-c-whitespace-tests
new file mode 100644
index 00000000..b19dd64b
--- /dev/null
+++ b/gnulib/modules/unictype/syntax-c-whitespace-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-sy_c_whitespace.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sy_c_whitespace
+check_PROGRAMS += test-sy_c_whitespace
+test_sy_c_whitespace_SOURCES = unictype/test-sy_c_whitespace.c
+
diff --git a/gnulib/modules/unictype/syntax-java-ident b/gnulib/modules/unictype/syntax-java-ident
new file mode 100644
index 00000000..220b11d5
--- /dev/null
+++ b/gnulib/modules/unictype/syntax-java-ident
@@ -0,0 +1,26 @@
+Description:
+Test whether a Unicode character can occur in identifiers in the Java language.
+
+Files:
+lib/unictype/sy_java_ident.c
+lib/unictype/sy_java_ident.h
+lib/unictype/identsyntaxmap.h
+
+Depends-on:
+unictype/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unictype/sy_java_ident.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/syntax-java-ident-tests b/gnulib/modules/unictype/syntax-java-ident-tests
new file mode 100644
index 00000000..2753d637
--- /dev/null
+++ b/gnulib/modules/unictype/syntax-java-ident-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unictype/test-sy_java_ident.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sy_java_ident
+check_PROGRAMS += test-sy_java_ident
+test_sy_java_ident_SOURCES = unictype/test-sy_java_ident.c
+
diff --git a/gnulib/modules/unictype/syntax-java-whitespace b/gnulib/modules/unictype/syntax-java-whitespace
new file mode 100644
index 00000000..85b0c5b3
--- /dev/null
+++ b/gnulib/modules/unictype/syntax-java-whitespace
@@ -0,0 +1,23 @@
+Description:
+Test whether a Unicode character is whitespace in the Java language syntax.
+
+Files:
+lib/unictype/sy_java_whitespace.c
+
+Depends-on:
+unictype/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unictype/sy_java_whitespace.c
+
+Include:
+"unictype.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unictype/syntax-java-whitespace-tests b/gnulib/modules/unictype/syntax-java-whitespace-tests
new file mode 100644
index 00000000..6fcd4a15
--- /dev/null
+++ b/gnulib/modules/unictype/syntax-java-whitespace-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unictype/test-sy_java_whitespace.c
+tests/unictype/test-predicate-part1.h
+tests/unictype/test-predicate-part2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-sy_java_whitespace
+check_PROGRAMS += test-sy_java_whitespace
+test_sy_java_whitespace_SOURCES = unictype/test-sy_java_whitespace.c
+
diff --git a/gnulib/modules/unilbrk/base b/gnulib/modules/unilbrk/base
new file mode 100644
index 00000000..988aaae2
--- /dev/null
+++ b/gnulib/modules/unilbrk/base
@@ -0,0 +1,23 @@
+Description:
+Base layer for line breaking.
+
+Files:
+lib/unilbrk.h
+
+Depends-on:
+unitypes
+localcharset
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/tables b/gnulib/modules/unilbrk/tables
new file mode 100644
index 00000000..5e4c1e8c
--- /dev/null
+++ b/gnulib/modules/unilbrk/tables
@@ -0,0 +1,27 @@
+Description:
+Line breaking auxiliary tables.
+
+Files:
+lib/unilbrk/lbrktables.h
+lib/unilbrk/lbrktables.c
+lib/unilbrk/lbrkprop1.h
+lib/unilbrk/lbrkprop2.h
+
+Depends-on:
+unilbrk/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += unilbrk/lbrktables.c
+
+Include:
+"unilbrk/lbrktables.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/u16-possible-linebreaks b/gnulib/modules/unilbrk/u16-possible-linebreaks
new file mode 100644
index 00000000..5f79aa56
--- /dev/null
+++ b/gnulib/modules/unilbrk/u16-possible-linebreaks
@@ -0,0 +1,27 @@
+Description:
+Line breaking of UTF-16 strings.
+
+Files:
+lib/unilbrk/u16-possible-linebreaks.c
+lib/uniwidth/cjk.h
+
+Depends-on:
+unilbrk/base
+unilbrk/tables
+unistr/u16-mbtouc-unsafe
+streq
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/u16-possible-linebreaks.c
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/u16-possible-linebreaks-tests b/gnulib/modules/unilbrk/u16-possible-linebreaks-tests
new file mode 100644
index 00000000..0ccca8c0
--- /dev/null
+++ b/gnulib/modules/unilbrk/u16-possible-linebreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unilbrk/test-u16-possible-linebreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-possible-linebreaks
+check_PROGRAMS += test-u16-possible-linebreaks
+test_u16_possible_linebreaks_SOURCES = unilbrk/test-u16-possible-linebreaks.c
+
diff --git a/gnulib/modules/unilbrk/u16-width-linebreaks b/gnulib/modules/unilbrk/u16-width-linebreaks
new file mode 100644
index 00000000..6f6db880
--- /dev/null
+++ b/gnulib/modules/unilbrk/u16-width-linebreaks
@@ -0,0 +1,26 @@
+Description:
+Line breaking of UTF-16 strings.
+
+Files:
+lib/unilbrk/u16-width-linebreaks.c
+
+Depends-on:
+unilbrk/base
+unilbrk/u16-possible-linebreaks
+uniwidth/width
+unistr/u16-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/u16-width-linebreaks.c
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/u16-width-linebreaks-tests b/gnulib/modules/unilbrk/u16-width-linebreaks-tests
new file mode 100644
index 00000000..1f2eb540
--- /dev/null
+++ b/gnulib/modules/unilbrk/u16-width-linebreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unilbrk/test-u16-width-linebreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-width-linebreaks
+check_PROGRAMS += test-u16-width-linebreaks
+test_u16_width_linebreaks_SOURCES = unilbrk/test-u16-width-linebreaks.c
+
diff --git a/gnulib/modules/unilbrk/u32-possible-linebreaks b/gnulib/modules/unilbrk/u32-possible-linebreaks
new file mode 100644
index 00000000..eda95189
--- /dev/null
+++ b/gnulib/modules/unilbrk/u32-possible-linebreaks
@@ -0,0 +1,26 @@
+Description:
+Line breaking of UTF-32 strings.
+
+Files:
+lib/unilbrk/u32-possible-linebreaks.c
+lib/uniwidth/cjk.h
+
+Depends-on:
+unilbrk/base
+unilbrk/tables
+streq
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/u32-possible-linebreaks.c
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/u32-possible-linebreaks-tests b/gnulib/modules/unilbrk/u32-possible-linebreaks-tests
new file mode 100644
index 00000000..12ff96e9
--- /dev/null
+++ b/gnulib/modules/unilbrk/u32-possible-linebreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unilbrk/test-u32-possible-linebreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-possible-linebreaks
+check_PROGRAMS += test-u32-possible-linebreaks
+test_u32_possible_linebreaks_SOURCES = unilbrk/test-u32-possible-linebreaks.c
+
diff --git a/gnulib/modules/unilbrk/u32-width-linebreaks b/gnulib/modules/unilbrk/u32-width-linebreaks
new file mode 100644
index 00000000..e69f298b
--- /dev/null
+++ b/gnulib/modules/unilbrk/u32-width-linebreaks
@@ -0,0 +1,25 @@
+Description:
+Line breaking of UTF-32 strings.
+
+Files:
+lib/unilbrk/u32-width-linebreaks.c
+
+Depends-on:
+unilbrk/base
+unilbrk/u32-possible-linebreaks
+uniwidth/width
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/u32-width-linebreaks.c
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/u32-width-linebreaks-tests b/gnulib/modules/unilbrk/u32-width-linebreaks-tests
new file mode 100644
index 00000000..e6daa5a9
--- /dev/null
+++ b/gnulib/modules/unilbrk/u32-width-linebreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unilbrk/test-u32-width-linebreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-width-linebreaks
+check_PROGRAMS += test-u32-width-linebreaks
+test_u32_width_linebreaks_SOURCES = unilbrk/test-u32-width-linebreaks.c
+
diff --git a/gnulib/modules/unilbrk/u8-possible-linebreaks b/gnulib/modules/unilbrk/u8-possible-linebreaks
new file mode 100644
index 00000000..6bd41ae8
--- /dev/null
+++ b/gnulib/modules/unilbrk/u8-possible-linebreaks
@@ -0,0 +1,27 @@
+Description:
+Line breaking of UTF-8 strings.
+
+Files:
+lib/unilbrk/u8-possible-linebreaks.c
+lib/uniwidth/cjk.h
+
+Depends-on:
+unilbrk/base
+unilbrk/tables
+unistr/u8-mbtouc-unsafe
+streq
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/u8-possible-linebreaks.c
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/u8-possible-linebreaks-tests b/gnulib/modules/unilbrk/u8-possible-linebreaks-tests
new file mode 100644
index 00000000..3b1ac382
--- /dev/null
+++ b/gnulib/modules/unilbrk/u8-possible-linebreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unilbrk/test-u8-possible-linebreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-possible-linebreaks
+check_PROGRAMS += test-u8-possible-linebreaks
+test_u8_possible_linebreaks_SOURCES = unilbrk/test-u8-possible-linebreaks.c
+
diff --git a/gnulib/modules/unilbrk/u8-width-linebreaks b/gnulib/modules/unilbrk/u8-width-linebreaks
new file mode 100644
index 00000000..83a2e25d
--- /dev/null
+++ b/gnulib/modules/unilbrk/u8-width-linebreaks
@@ -0,0 +1,26 @@
+Description:
+Line breaking of UTF-8 strings.
+
+Files:
+lib/unilbrk/u8-width-linebreaks.c
+
+Depends-on:
+unilbrk/base
+unilbrk/u8-possible-linebreaks
+uniwidth/width
+unistr/u8-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/u8-width-linebreaks.c
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/u8-width-linebreaks-tests b/gnulib/modules/unilbrk/u8-width-linebreaks-tests
new file mode 100644
index 00000000..00fe85fe
--- /dev/null
+++ b/gnulib/modules/unilbrk/u8-width-linebreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unilbrk/test-u8-width-linebreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-width-linebreaks
+check_PROGRAMS += test-u8-width-linebreaks
+test_u8_width_linebreaks_SOURCES = unilbrk/test-u8-width-linebreaks.c
+
diff --git a/gnulib/modules/unilbrk/ulc-common b/gnulib/modules/unilbrk/ulc-common
new file mode 100644
index 00000000..f7e62427
--- /dev/null
+++ b/gnulib/modules/unilbrk/ulc-common
@@ -0,0 +1,25 @@
+Description:
+Line breaking auxiliary functions.
+
+Files:
+lib/unilbrk/ulc-common.h
+lib/unilbrk/ulc-common.c
+
+Depends-on:
+c-ctype
+c-strcaseeq
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/ulc-common.c
+
+Include:
+"unilbrk/ulc-common.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/ulc-possible-linebreaks b/gnulib/modules/unilbrk/ulc-possible-linebreaks
new file mode 100644
index 00000000..f7cc283e
--- /dev/null
+++ b/gnulib/modules/unilbrk/ulc-possible-linebreaks
@@ -0,0 +1,27 @@
+Description:
+Line breaking of strings.
+
+Files:
+lib/unilbrk/ulc-possible-linebreaks.c
+
+Depends-on:
+unilbrk/base
+unilbrk/u8-possible-linebreaks
+unilbrk/ulc-common
+uniconv/u8-conv-from-enc
+c-ctype
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/ulc-possible-linebreaks.c
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/ulc-possible-linebreaks-tests b/gnulib/modules/unilbrk/ulc-possible-linebreaks-tests
new file mode 100644
index 00000000..33c1e041
--- /dev/null
+++ b/gnulib/modules/unilbrk/ulc-possible-linebreaks-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unilbrk/test-ulc-possible-linebreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ulc-possible-linebreaks
+check_PROGRAMS += test-ulc-possible-linebreaks
+test_ulc_possible_linebreaks_SOURCES = unilbrk/test-ulc-possible-linebreaks.c
+test_ulc_possible_linebreaks_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/unilbrk/ulc-width-linebreaks b/gnulib/modules/unilbrk/ulc-width-linebreaks
new file mode 100644
index 00000000..5763e850
--- /dev/null
+++ b/gnulib/modules/unilbrk/ulc-width-linebreaks
@@ -0,0 +1,27 @@
+Description:
+Line breaking of strings.
+
+Files:
+lib/unilbrk/ulc-width-linebreaks.c
+
+Depends-on:
+unilbrk/base
+unilbrk/u8-width-linebreaks
+unilbrk/ulc-common
+uniconv/u8-conv-from-enc
+c-ctype
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unilbrk/ulc-width-linebreaks.c
+
+Include:
+"unilbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unilbrk/ulc-width-linebreaks-tests b/gnulib/modules/unilbrk/ulc-width-linebreaks-tests
new file mode 100644
index 00000000..7c05b5ab
--- /dev/null
+++ b/gnulib/modules/unilbrk/ulc-width-linebreaks-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unilbrk/test-ulc-width-linebreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ulc-width-linebreaks
+check_PROGRAMS += test-ulc-width-linebreaks
+test_ulc_width_linebreaks_SOURCES = unilbrk/test-ulc-width-linebreaks.c
+test_ulc_width_linebreaks_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniname/base b/gnulib/modules/uniname/base
new file mode 100644
index 00000000..77eda977
--- /dev/null
+++ b/gnulib/modules/uniname/base
@@ -0,0 +1,22 @@
+Description:
+Base layer for Unicode character names.
+
+Files:
+lib/uniname.h
+
+Depends-on:
+unitypes
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"uniname.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniname/uniname b/gnulib/modules/uniname/uniname
new file mode 100644
index 00000000..c1e2e0dd
--- /dev/null
+++ b/gnulib/modules/uniname/uniname
@@ -0,0 +1,26 @@
+Description:
+Association between Unicode characters and their names.
+
+Files:
+lib/uniname/gen-uninames.lisp
+lib/uniname/uninames.h
+lib/uniname/uniname.c
+
+Depends-on:
+uniname/base
+memcmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniname/uniname.c
+
+Include:
+"uniname.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniname/uniname-tests b/gnulib/modules/uniname/uniname-tests
new file mode 100644
index 00000000..6f2f7f70
--- /dev/null
+++ b/gnulib/modules/uniname/uniname-tests
@@ -0,0 +1,17 @@
+Files:
+tests/uniname/test-uninames.sh
+tests/uniname/test-uninames.c
+tests/uniname/UnicodeDataNames.txt
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += uniname/test-uninames.sh
+check_PROGRAMS += test-uninames
+test_uninames_SOURCES = uniname/test-uninames.c
+test_uninames_LDADD = $(LDADD) @LIBINTL@
+
diff --git a/gnulib/modules/uninorm/base b/gnulib/modules/uninorm/base
new file mode 100644
index 00000000..062a5bee
--- /dev/null
+++ b/gnulib/modules/uninorm/base
@@ -0,0 +1,22 @@
+Description:
+Base layer for normalization forms of Unicode strings.
+
+Files:
+lib/uninorm.h
+
+Depends-on:
+unitypes
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/canonical-decomposition b/gnulib/modules/uninorm/canonical-decomposition
new file mode 100644
index 00000000..8579e6e7
--- /dev/null
+++ b/gnulib/modules/uninorm/canonical-decomposition
@@ -0,0 +1,24 @@
+Description:
+Canonical decomposition of Unicode characters.
+
+Files:
+lib/uninorm/canonical-decomposition.c
+
+Depends-on:
+uninorm/base
+uninorm/decomposition-table
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/canonical-decomposition.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/canonical-decomposition-tests b/gnulib/modules/uninorm/canonical-decomposition-tests
new file mode 100644
index 00000000..189a46d4
--- /dev/null
+++ b/gnulib/modules/uninorm/canonical-decomposition-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uninorm/test-canonical-decomposition.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-canonical-decomposition
+check_PROGRAMS += test-canonical-decomposition
+test_canonical_decomposition_SOURCES = uninorm/test-canonical-decomposition.c
+
diff --git a/gnulib/modules/uninorm/compat-decomposition b/gnulib/modules/uninorm/compat-decomposition
new file mode 100644
index 00000000..17c8d45f
--- /dev/null
+++ b/gnulib/modules/uninorm/compat-decomposition
@@ -0,0 +1,25 @@
+Description:
+Compatibility decomposition of Unicode characters.
+
+Files:
+lib/uninorm/decompose-internal.h
+lib/uninorm/compat-decomposition.c
+
+Depends-on:
+uninorm/base
+uninorm/decomposition
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/compat-decomposition.c
+
+Include:
+"uninorm/decompose-internal.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/compat-decomposition-tests b/gnulib/modules/uninorm/compat-decomposition-tests
new file mode 100644
index 00000000..75cff7fe
--- /dev/null
+++ b/gnulib/modules/uninorm/compat-decomposition-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uninorm/test-compat-decomposition.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-compat-decomposition
+check_PROGRAMS += test-compat-decomposition
+test_compat_decomposition_SOURCES = uninorm/test-compat-decomposition.c
+
diff --git a/gnulib/modules/uninorm/composition b/gnulib/modules/uninorm/composition
new file mode 100644
index 00000000..4b8b1df0
--- /dev/null
+++ b/gnulib/modules/uninorm/composition
@@ -0,0 +1,33 @@
+Description:
+Composition of Unicode characters.
+
+Files:
+lib/uninorm/composition.c
+lib/uninorm/composition-table.gperf
+
+Depends-on:
+uninorm/base
+gperf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/composition.c
+
+uninorm/composition-table.h: $(srcdir)/uninorm/composition-table.gperf
+ $(GPERF) -m 1 $(srcdir)/uninorm/composition-table.gperf > $(srcdir)/uninorm/composition-table.h-t
+ mv $(srcdir)/uninorm/composition-table.h-t $(srcdir)/uninorm/composition-table.h
+BUILT_SOURCES += uninorm/composition-table.h
+MOSTLYCLEANFILES += uninorm/composition-table.h-t
+MAINTAINERCLEANFILES += uninorm/composition-table.h
+EXTRA_DIST += uninorm/composition-table.h
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/composition-tests b/gnulib/modules/uninorm/composition-tests
new file mode 100644
index 00000000..d8d87dfe
--- /dev/null
+++ b/gnulib/modules/uninorm/composition-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uninorm/test-composition.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-composition
+check_PROGRAMS += test-composition
+test_composition_SOURCES = uninorm/test-composition.c
+
diff --git a/gnulib/modules/uninorm/decompose-internal b/gnulib/modules/uninorm/decompose-internal
new file mode 100644
index 00000000..575de103
--- /dev/null
+++ b/gnulib/modules/uninorm/decompose-internal
@@ -0,0 +1,25 @@
+Description:
+Decomposition of Unicode strings.
+
+Files:
+lib/uninorm/decompose-internal.h
+lib/uninorm/decompose-internal.c
+
+Depends-on:
+unitypes
+array-mergesort
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/decompose-internal.c
+
+Include:
+"uninorm/decompose-internal.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/decomposing-form b/gnulib/modules/uninorm/decomposing-form
new file mode 100644
index 00000000..3df8f9d3
--- /dev/null
+++ b/gnulib/modules/uninorm/decomposing-form
@@ -0,0 +1,24 @@
+Description:
+Decomposing variant of a normalization form.
+
+Files:
+lib/uninorm/decomposing-form.c
+lib/uninorm/normalize-internal.h
+
+Depends-on:
+uninorm/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/decomposing-form.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/decomposing-form-tests b/gnulib/modules/uninorm/decomposing-form-tests
new file mode 100644
index 00000000..f3113cb4
--- /dev/null
+++ b/gnulib/modules/uninorm/decomposing-form-tests
@@ -0,0 +1,17 @@
+Files:
+tests/uninorm/test-decomposing-form.c
+tests/macros.h
+
+Depends-on:
+uninorm/nfc
+uninorm/nfd
+uninorm/nfkc
+uninorm/nfkd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-decomposing-form
+check_PROGRAMS += test-decomposing-form
+test_decomposing_form_SOURCES = uninorm/test-decomposing-form.c
+
diff --git a/gnulib/modules/uninorm/decomposition b/gnulib/modules/uninorm/decomposition
new file mode 100644
index 00000000..ac09f1f1
--- /dev/null
+++ b/gnulib/modules/uninorm/decomposition
@@ -0,0 +1,24 @@
+Description:
+Decomposition of Unicode characters.
+
+Files:
+lib/uninorm/decomposition.c
+
+Depends-on:
+uninorm/base
+uninorm/decomposition-table
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/decomposition.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/decomposition-table b/gnulib/modules/uninorm/decomposition-table
new file mode 100644
index 00000000..7aa21b7d
--- /dev/null
+++ b/gnulib/modules/uninorm/decomposition-table
@@ -0,0 +1,27 @@
+Description:
+Decomposition of Unicode characters.
+
+Files:
+lib/uninorm/decomposition-table.h
+lib/uninorm/decomposition-table.c
+lib/uninorm/decomposition-table1.h
+lib/uninorm/decomposition-table2.h
+
+Depends-on:
+uninorm/base
+
+configure.ac:
+AC_REQUIRE([AC_C_INLINE])
+
+Makefile.am:
+lib_SOURCES += uninorm/decomposition-table.c
+
+Include:
+"uninorm/decomposition-table.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/decomposition-tests b/gnulib/modules/uninorm/decomposition-tests
new file mode 100644
index 00000000..ce70d175
--- /dev/null
+++ b/gnulib/modules/uninorm/decomposition-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uninorm/test-decomposition.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-decomposition
+check_PROGRAMS += test-decomposition
+test_decomposition_SOURCES = uninorm/test-decomposition.c
+
diff --git a/gnulib/modules/uninorm/filter b/gnulib/modules/uninorm/filter
new file mode 100644
index 00000000..fed14ded
--- /dev/null
+++ b/gnulib/modules/uninorm/filter
@@ -0,0 +1,27 @@
+Description:
+Normalization of a stream of Unicode characters.
+
+Files:
+lib/uninorm/uninorm-filter.c
+lib/uninorm/normalize-internal.h
+
+Depends-on:
+uninorm/base
+unictype/combining-class
+uninorm/decompose-internal
+malloc-posix
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/uninorm-filter.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/filter-tests b/gnulib/modules/uninorm/filter-tests
new file mode 100644
index 00000000..ae95a72f
--- /dev/null
+++ b/gnulib/modules/uninorm/filter-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uninorm/test-uninorm-filter-nfc.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-cmp
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-uninorm-filter-nfc
+check_PROGRAMS += test-uninorm-filter-nfc
+test_uninorm_filter_nfc_SOURCES = uninorm/test-uninorm-filter-nfc.c
+
diff --git a/gnulib/modules/uninorm/nfc b/gnulib/modules/uninorm/nfc
new file mode 100644
index 00000000..31417d38
--- /dev/null
+++ b/gnulib/modules/uninorm/nfc
@@ -0,0 +1,27 @@
+Description:
+Canonical normalization of Unicode strings.
+
+Files:
+lib/uninorm/nfc.c
+lib/uninorm/normalize-internal.h
+
+Depends-on:
+uninorm/base
+uninorm/canonical-decomposition
+uninorm/composition
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/nfc.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/nfc-tests b/gnulib/modules/uninorm/nfc-tests
new file mode 100644
index 00000000..0c6b187a
--- /dev/null
+++ b/gnulib/modules/uninorm/nfc-tests
@@ -0,0 +1,35 @@
+Files:
+tests/uninorm/test-nfc.c
+tests/uninorm/test-u8-nfc.c
+tests/uninorm/test-u16-nfc.c
+tests/uninorm/test-u32-nfc.c
+tests/uninorm/test-u32-nfc-big.sh
+tests/uninorm/test-u32-nfc-big.c
+tests/uninorm/test-u32-normalize-big.h
+tests/uninorm/test-u32-normalize-big.c
+tests/uninorm/NormalizationTest.txt
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+unistr/u16-cmp
+unistr/u32-cmp
+unistr/u32-strlen
+xalloc
+progname
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-nfc uninorm/test-u32-nfc-big.sh
+check_PROGRAMS += test-nfc test-u32-nfc-big
+test_nfc_SOURCES = \
+ uninorm/test-nfc.c \
+ uninorm/test-u8-nfc.c \
+ uninorm/test-u16-nfc.c \
+ uninorm/test-u32-nfc.c
+test_u32_nfc_big_SOURCES = \
+ uninorm/test-u32-nfc-big.c \
+ uninorm/test-u32-normalize-big.c
+test_u32_nfc_big_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/uninorm/nfd b/gnulib/modules/uninorm/nfd
new file mode 100644
index 00000000..ee18334a
--- /dev/null
+++ b/gnulib/modules/uninorm/nfd
@@ -0,0 +1,25 @@
+Description:
+Canonical decomposition of Unicode strings.
+
+Files:
+lib/uninorm/nfd.c
+lib/uninorm/normalize-internal.h
+
+Depends-on:
+uninorm/base
+uninorm/canonical-decomposition
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/nfd.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/nfd-tests b/gnulib/modules/uninorm/nfd-tests
new file mode 100644
index 00000000..0ec24056
--- /dev/null
+++ b/gnulib/modules/uninorm/nfd-tests
@@ -0,0 +1,36 @@
+Files:
+tests/uninorm/test-nfd.c
+tests/uninorm/test-u8-nfd.c
+tests/uninorm/test-u16-nfd.c
+tests/uninorm/test-u32-nfd.c
+tests/uninorm/test-u32-nfd-big.sh
+tests/uninorm/test-u32-nfd-big.c
+tests/uninorm/test-u32-normalize-big.h
+tests/uninorm/test-u32-normalize-big.c
+tests/uninorm/NormalizationTest.txt
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+unistr/u16-cmp
+unistr/u32-cmp
+unistr/u32-strlen
+xalloc
+progname
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-nfd uninorm/test-u32-nfd-big.sh
+check_PROGRAMS += test-nfd test-u32-nfd-big
+test_nfd_SOURCES = \
+ uninorm/test-nfd.c \
+ uninorm/test-u8-nfd.c \
+ uninorm/test-u16-nfd.c \
+ uninorm/test-u32-nfd.c
+test_u32_nfd_big_SOURCES = \
+ uninorm/test-u32-nfd-big.c \
+ uninorm/test-u32-normalize-big.c
+test_u32_nfd_big_LDADD = $(LDADD) @LIBINTL@
+
diff --git a/gnulib/modules/uninorm/nfkc b/gnulib/modules/uninorm/nfkc
new file mode 100644
index 00000000..408c8a10
--- /dev/null
+++ b/gnulib/modules/uninorm/nfkc
@@ -0,0 +1,27 @@
+Description:
+Compatibility normalization of Unicode strings.
+
+Files:
+lib/uninorm/nfkc.c
+lib/uninorm/normalize-internal.h
+
+Depends-on:
+uninorm/base
+uninorm/compat-decomposition
+uninorm/composition
+uninorm/nfkd
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/nfkc.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/nfkc-tests b/gnulib/modules/uninorm/nfkc-tests
new file mode 100644
index 00000000..12f3a43d
--- /dev/null
+++ b/gnulib/modules/uninorm/nfkc-tests
@@ -0,0 +1,36 @@
+Files:
+tests/uninorm/test-nfkc.c
+tests/uninorm/test-u8-nfkc.c
+tests/uninorm/test-u16-nfkc.c
+tests/uninorm/test-u32-nfkc.c
+tests/uninorm/test-u32-nfkc-big.sh
+tests/uninorm/test-u32-nfkc-big.c
+tests/uninorm/test-u32-normalize-big.h
+tests/uninorm/test-u32-normalize-big.c
+tests/uninorm/NormalizationTest.txt
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+unistr/u16-cmp
+unistr/u32-cmp
+unistr/u32-strlen
+xalloc
+progname
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-nfkc uninorm/test-u32-nfkc-big.sh
+check_PROGRAMS += test-nfkc test-u32-nfkc-big
+test_nfkc_SOURCES = \
+ uninorm/test-nfkc.c \
+ uninorm/test-u8-nfkc.c \
+ uninorm/test-u16-nfkc.c \
+ uninorm/test-u32-nfkc.c
+test_u32_nfkc_big_SOURCES = \
+ uninorm/test-u32-nfkc-big.c \
+ uninorm/test-u32-normalize-big.c
+test_u32_nfkc_big_LDADD = $(LDADD) @LIBINTL@
+
diff --git a/gnulib/modules/uninorm/nfkd b/gnulib/modules/uninorm/nfkd
new file mode 100644
index 00000000..0a2510c6
--- /dev/null
+++ b/gnulib/modules/uninorm/nfkd
@@ -0,0 +1,25 @@
+Description:
+Compatibility decomposition of Unicode strings.
+
+Files:
+lib/uninorm/nfkd.c
+lib/uninorm/normalize-internal.h
+
+Depends-on:
+uninorm/base
+uninorm/compat-decomposition
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/nfkd.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/nfkd-tests b/gnulib/modules/uninorm/nfkd-tests
new file mode 100644
index 00000000..9b5ec6e3
--- /dev/null
+++ b/gnulib/modules/uninorm/nfkd-tests
@@ -0,0 +1,36 @@
+Files:
+tests/uninorm/test-nfkd.c
+tests/uninorm/test-u8-nfkd.c
+tests/uninorm/test-u16-nfkd.c
+tests/uninorm/test-u32-nfkd.c
+tests/uninorm/test-u32-nfkd-big.sh
+tests/uninorm/test-u32-nfkd-big.c
+tests/uninorm/test-u32-normalize-big.h
+tests/uninorm/test-u32-normalize-big.c
+tests/uninorm/NormalizationTest.txt
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+unistr/u16-cmp
+unistr/u32-cmp
+unistr/u32-strlen
+xalloc
+progname
+
+configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
+
+Makefile.am:
+TESTS += test-nfkd uninorm/test-u32-nfkd-big.sh
+check_PROGRAMS += test-nfkd test-u32-nfkd-big
+test_nfkd_SOURCES = \
+ uninorm/test-nfkd.c \
+ uninorm/test-u8-nfkd.c \
+ uninorm/test-u16-nfkd.c \
+ uninorm/test-u32-nfkd.c
+test_u32_nfkd_big_SOURCES = \
+ uninorm/test-u32-nfkd-big.c \
+ uninorm/test-u32-normalize-big.c
+test_u32_nfkd_big_LDADD = $(LDADD) @LIBINTL@
+
diff --git a/gnulib/modules/uninorm/u16-normalize b/gnulib/modules/uninorm/u16-normalize
new file mode 100644
index 00000000..076a7054
--- /dev/null
+++ b/gnulib/modules/uninorm/u16-normalize
@@ -0,0 +1,31 @@
+Description:
+Normalization of UTF-16 strings.
+
+Files:
+lib/uninorm/u16-normalize.c
+lib/uninorm/normalize-internal.h
+lib/uninorm/u-normalize-internal.h
+
+Depends-on:
+uninorm/base
+unistr/u16-mbtouc-unsafe
+unistr/u16-uctomb
+unistr/u16-cpy
+unictype/combining-class
+uninorm/decompose-internal
+
+configure.ac:
+gl_MODULE_INDICATOR([uninorm/u16-normalize])
+
+Makefile.am:
+lib_SOURCES += uninorm/u16-normalize.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u16-normcmp b/gnulib/modules/uninorm/u16-normcmp
new file mode 100644
index 00000000..da414049
--- /dev/null
+++ b/gnulib/modules/uninorm/u16-normcmp
@@ -0,0 +1,27 @@
+Description:
+Normalization insensitive comparison of UTF-16 strings.
+
+Files:
+lib/uninorm/u16-normcmp.c
+lib/uninorm/u-normcmp.h
+
+Depends-on:
+uninorm/base
+uninorm/u16-normalize
+unistr/u16-cmp2
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u16-normcmp.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u16-normcmp-tests b/gnulib/modules/uninorm/u16-normcmp-tests
new file mode 100644
index 00000000..217e6f08
--- /dev/null
+++ b/gnulib/modules/uninorm/u16-normcmp-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uninorm/test-u16-normcmp.c
+tests/uninorm/test-u16-normcmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-normcmp
+check_PROGRAMS += test-u16-normcmp
+test_u16_normcmp_SOURCES = uninorm/test-u16-normcmp.c
+
diff --git a/gnulib/modules/uninorm/u16-normcoll b/gnulib/modules/uninorm/u16-normcoll
new file mode 100644
index 00000000..c55e2ccf
--- /dev/null
+++ b/gnulib/modules/uninorm/u16-normcoll
@@ -0,0 +1,26 @@
+Description:
+Locale dependent, normalization insensitive comparison of UTF-16 strings.
+
+Files:
+lib/uninorm/u16-normcoll.c
+lib/uninorm/u-normcoll.h
+
+Depends-on:
+uninorm/base
+uninorm/u16-normxfrm
+memcmp2
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u16-normcoll.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u16-normcoll-tests b/gnulib/modules/uninorm/u16-normcoll-tests
new file mode 100644
index 00000000..bb295534
--- /dev/null
+++ b/gnulib/modules/uninorm/u16-normcoll-tests
@@ -0,0 +1,16 @@
+Files:
+tests/uninorm/test-u16-normcoll.c
+tests/uninorm/test-u16-normcmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-normcoll
+check_PROGRAMS += test-u16-normcoll
+test_u16_normcoll_SOURCES = uninorm/test-u16-normcoll.c
+test_u16_normcoll_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uninorm/u16-normxfrm b/gnulib/modules/uninorm/u16-normxfrm
new file mode 100644
index 00000000..7ef751e7
--- /dev/null
+++ b/gnulib/modules/uninorm/u16-normxfrm
@@ -0,0 +1,28 @@
+Description:
+Locale dependent transformation for comparison of UTF-16 strings.
+
+Files:
+lib/uninorm/u16-normxfrm.c
+lib/uninorm/u-normxfrm.h
+
+Depends-on:
+uninorm/base
+uninorm/u16-normalize
+uniconv/u16-conv-to-enc
+localcharset
+memxfrm
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u16-normxfrm.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u32-normalize b/gnulib/modules/uninorm/u32-normalize
new file mode 100644
index 00000000..9eb31f3d
--- /dev/null
+++ b/gnulib/modules/uninorm/u32-normalize
@@ -0,0 +1,31 @@
+Description:
+Normalization of UTF-32 strings.
+
+Files:
+lib/uninorm/u32-normalize.c
+lib/uninorm/normalize-internal.h
+lib/uninorm/u-normalize-internal.h
+
+Depends-on:
+uninorm/base
+unistr/u32-mbtouc-unsafe
+unistr/u32-uctomb
+unistr/u32-cpy
+unictype/combining-class
+uninorm/decompose-internal
+
+configure.ac:
+gl_MODULE_INDICATOR([uninorm/u32-normalize])
+
+Makefile.am:
+lib_SOURCES += uninorm/u32-normalize.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u32-normcmp b/gnulib/modules/uninorm/u32-normcmp
new file mode 100644
index 00000000..0b4f5066
--- /dev/null
+++ b/gnulib/modules/uninorm/u32-normcmp
@@ -0,0 +1,27 @@
+Description:
+Normalization insensitive comparison of UTF-32 strings.
+
+Files:
+lib/uninorm/u32-normcmp.c
+lib/uninorm/u-normcmp.h
+
+Depends-on:
+uninorm/base
+uninorm/u32-normalize
+unistr/u32-cmp2
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u32-normcmp.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u32-normcmp-tests b/gnulib/modules/uninorm/u32-normcmp-tests
new file mode 100644
index 00000000..887ccb2e
--- /dev/null
+++ b/gnulib/modules/uninorm/u32-normcmp-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uninorm/test-u32-normcmp.c
+tests/uninorm/test-u32-normcmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-normcmp
+check_PROGRAMS += test-u32-normcmp
+test_u32_normcmp_SOURCES = uninorm/test-u32-normcmp.c
+
diff --git a/gnulib/modules/uninorm/u32-normcoll b/gnulib/modules/uninorm/u32-normcoll
new file mode 100644
index 00000000..76b093ec
--- /dev/null
+++ b/gnulib/modules/uninorm/u32-normcoll
@@ -0,0 +1,26 @@
+Description:
+Locale dependent, normalization insensitive comparison of UTF-32 strings.
+
+Files:
+lib/uninorm/u32-normcoll.c
+lib/uninorm/u-normcoll.h
+
+Depends-on:
+uninorm/base
+uninorm/u32-normxfrm
+memcmp2
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u32-normcoll.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u32-normcoll-tests b/gnulib/modules/uninorm/u32-normcoll-tests
new file mode 100644
index 00000000..41ce656d
--- /dev/null
+++ b/gnulib/modules/uninorm/u32-normcoll-tests
@@ -0,0 +1,16 @@
+Files:
+tests/uninorm/test-u32-normcoll.c
+tests/uninorm/test-u32-normcmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-normcoll
+check_PROGRAMS += test-u32-normcoll
+test_u32_normcoll_SOURCES = uninorm/test-u32-normcoll.c
+test_u32_normcoll_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uninorm/u32-normxfrm b/gnulib/modules/uninorm/u32-normxfrm
new file mode 100644
index 00000000..d0d0260c
--- /dev/null
+++ b/gnulib/modules/uninorm/u32-normxfrm
@@ -0,0 +1,28 @@
+Description:
+Locale dependent transformation for comparison of UTF-32 strings.
+
+Files:
+lib/uninorm/u32-normxfrm.c
+lib/uninorm/u-normxfrm.h
+
+Depends-on:
+uninorm/base
+uninorm/u32-normalize
+uniconv/u32-conv-to-enc
+localcharset
+memxfrm
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u32-normxfrm.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u8-normalize b/gnulib/modules/uninorm/u8-normalize
new file mode 100644
index 00000000..698f12da
--- /dev/null
+++ b/gnulib/modules/uninorm/u8-normalize
@@ -0,0 +1,31 @@
+Description:
+Normalization of UTF-8 strings.
+
+Files:
+lib/uninorm/u8-normalize.c
+lib/uninorm/normalize-internal.h
+lib/uninorm/u-normalize-internal.h
+
+Depends-on:
+uninorm/base
+unistr/u8-mbtouc-unsafe
+unistr/u8-uctomb
+unistr/u8-cpy
+unictype/combining-class
+uninorm/decompose-internal
+
+configure.ac:
+gl_MODULE_INDICATOR([uninorm/u8-normalize])
+
+Makefile.am:
+lib_SOURCES += uninorm/u8-normalize.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u8-normcmp b/gnulib/modules/uninorm/u8-normcmp
new file mode 100644
index 00000000..21de0ef8
--- /dev/null
+++ b/gnulib/modules/uninorm/u8-normcmp
@@ -0,0 +1,27 @@
+Description:
+Normalization insensitive comparison of UTF-8 strings.
+
+Files:
+lib/uninorm/u8-normcmp.c
+lib/uninorm/u-normcmp.h
+
+Depends-on:
+uninorm/base
+uninorm/u8-normalize
+unistr/u8-cmp2
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u8-normcmp.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u8-normcmp-tests b/gnulib/modules/uninorm/u8-normcmp-tests
new file mode 100644
index 00000000..b1abc02b
--- /dev/null
+++ b/gnulib/modules/uninorm/u8-normcmp-tests
@@ -0,0 +1,15 @@
+Files:
+tests/uninorm/test-u8-normcmp.c
+tests/uninorm/test-u8-normcmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfd
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-normcmp
+check_PROGRAMS += test-u8-normcmp
+test_u8_normcmp_SOURCES = uninorm/test-u8-normcmp.c
+
diff --git a/gnulib/modules/uninorm/u8-normcoll b/gnulib/modules/uninorm/u8-normcoll
new file mode 100644
index 00000000..143e18ed
--- /dev/null
+++ b/gnulib/modules/uninorm/u8-normcoll
@@ -0,0 +1,26 @@
+Description:
+Locale dependent, normalization insensitive comparison of UTF-8 strings.
+
+Files:
+lib/uninorm/u8-normcoll.c
+lib/uninorm/u-normcoll.h
+
+Depends-on:
+uninorm/base
+uninorm/u8-normxfrm
+memcmp2
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u8-normcoll.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uninorm/u8-normcoll-tests b/gnulib/modules/uninorm/u8-normcoll-tests
new file mode 100644
index 00000000..54995f0e
--- /dev/null
+++ b/gnulib/modules/uninorm/u8-normcoll-tests
@@ -0,0 +1,16 @@
+Files:
+tests/uninorm/test-u8-normcoll.c
+tests/uninorm/test-u8-normcmp.h
+tests/macros.h
+
+Depends-on:
+uninorm/nfc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-normcoll
+check_PROGRAMS += test-u8-normcoll
+test_u8_normcoll_SOURCES = uninorm/test-u8-normcoll.c
+test_u8_normcoll_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uninorm/u8-normxfrm b/gnulib/modules/uninorm/u8-normxfrm
new file mode 100644
index 00000000..b53918fa
--- /dev/null
+++ b/gnulib/modules/uninorm/u8-normxfrm
@@ -0,0 +1,28 @@
+Description:
+Locale dependent transformation for comparison of UTF-8 strings.
+
+Files:
+lib/uninorm/u8-normxfrm.c
+lib/uninorm/u-normxfrm.h
+
+Depends-on:
+uninorm/base
+uninorm/u8-normalize
+uniconv/u8-conv-to-enc
+localcharset
+memxfrm
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uninorm/u8-normxfrm.c
+
+Include:
+"uninorm.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistd b/gnulib/modules/unistd
new file mode 100644
index 00000000..c2d32b3b
--- /dev/null
+++ b/gnulib/modules/unistd
@@ -0,0 +1,136 @@
+Description:
+A GNU-like <unistd.h>.
+
+Files:
+m4/unistd_h.m4
+lib/unistd.in.h
+
+Depends-on:
+arg-nonnull
+include_next
+stddef
+warn-on-use
+
+configure.ac:
+gl_UNISTD_H
+
+Makefile.am:
+BUILT_SOURCES += unistd.h
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+unistd.h: unistd.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
+ -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \
+ -e 's|@''GNULIB_CLOSE''@|$(GNULIB_CLOSE)|g' \
+ -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \
+ -e 's|@''GNULIB_DUP3''@|$(GNULIB_DUP3)|g' \
+ -e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|g' \
+ -e 's|@''GNULIB_EUIDACCESS''@|$(GNULIB_EUIDACCESS)|g' \
+ -e 's|@''GNULIB_FACCESSAT''@|$(GNULIB_FACCESSAT)|g' \
+ -e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \
+ -e 's|@''GNULIB_FCHOWNAT''@|$(GNULIB_FCHOWNAT)|g' \
+ -e 's|@''GNULIB_FSYNC''@|$(GNULIB_FSYNC)|g' \
+ -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \
+ -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \
+ -e 's|@''GNULIB_GETDOMAINNAME''@|$(GNULIB_GETDOMAINNAME)|g' \
+ -e 's|@''GNULIB_GETDTABLESIZE''@|$(GNULIB_GETDTABLESIZE)|g' \
+ -e 's|@''GNULIB_GETGROUPS''@|$(GNULIB_GETGROUPS)|g' \
+ -e 's|@''GNULIB_GETHOSTNAME''@|$(GNULIB_GETHOSTNAME)|g' \
+ -e 's|@''GNULIB_GETLOGIN''@|$(GNULIB_GETLOGIN)|g' \
+ -e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \
+ -e 's|@''GNULIB_GETPAGESIZE''@|$(GNULIB_GETPAGESIZE)|g' \
+ -e 's|@''GNULIB_GETUSERSHELL''@|$(GNULIB_GETUSERSHELL)|g' \
+ -e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|g' \
+ -e 's|@''GNULIB_LINK''@|$(GNULIB_LINK)|g' \
+ -e 's|@''GNULIB_LINKAT''@|$(GNULIB_LINKAT)|g' \
+ -e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \
+ -e 's|@''GNULIB_PIPE2''@|$(GNULIB_PIPE2)|g' \
+ -e 's|@''GNULIB_PREAD''@|$(GNULIB_PREAD)|g' \
+ -e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \
+ -e 's|@''GNULIB_READLINKAT''@|$(GNULIB_READLINKAT)|g' \
+ -e 's|@''GNULIB_RMDIR''@|$(GNULIB_RMDIR)|g' \
+ -e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \
+ -e 's|@''GNULIB_SYMLINK''@|$(GNULIB_SYMLINK)|g' \
+ -e 's|@''GNULIB_SYMLINKAT''@|$(GNULIB_SYMLINKAT)|g' \
+ -e 's|@''GNULIB_UNISTD_H_GETOPT''@|$(GNULIB_UNISTD_H_GETOPT)|g' \
+ -e 's|@''GNULIB_UNISTD_H_SIGPIPE''@|$(GNULIB_UNISTD_H_SIGPIPE)|g' \
+ -e 's|@''GNULIB_UNLINK''@|$(GNULIB_UNLINK)|g' \
+ -e 's|@''GNULIB_UNLINKAT''@|$(GNULIB_UNLINKAT)|g' \
+ -e 's|@''GNULIB_USLEEP''@|$(GNULIB_USLEEP)|g' \
+ -e 's|@''GNULIB_WRITE''@|$(GNULIB_WRITE)|g' \
+ < $(srcdir)/unistd.in.h | \
+ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
+ -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
+ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
+ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
+ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
+ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
+ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+ -e 's|@''HAVE_GETDOMAINNAME''@|$(HAVE_GETDOMAINNAME)|g' \
+ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
+ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
+ -e 's|@''HAVE_GETLOGIN''@|$(HAVE_GETLOGIN)|g' \
+ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_GETUSERSHELL''@|$(HAVE_GETUSERSHELL)|g' \
+ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \
+ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
+ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \
+ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
+ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \
+ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \
+ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \
+ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \
+ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
+ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
+ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
+ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
+ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
+ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
+ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+ -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \
+ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
+ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \
+ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
+ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
+ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \
+ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \
+ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \
+ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \
+ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \
+ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \
+ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \
+ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \
+ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
+ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
+ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += unistd.h unistd.h-t
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/unistd-safer b/gnulib/modules/unistd-safer
new file mode 100644
index 00000000..dfa56721
--- /dev/null
+++ b/gnulib/modules/unistd-safer
@@ -0,0 +1,28 @@
+Description:
+File descriptor functions that avoid clobbering STD{IN,OUT,ERR}_FILENO.
+
+Files:
+lib/unistd--.h
+lib/dup-safer.c
+lib/fd-safer.c
+lib/pipe-safer.c
+lib/unistd-safer.h
+m4/unistd-safer.m4
+
+Depends-on:
+fcntl
+unistd
+
+configure.ac:
+gl_UNISTD_SAFER
+
+Makefile.am:
+
+Include:
+"unistd-safer.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/unistd-safer-tests b/gnulib/modules/unistd-safer-tests
new file mode 100644
index 00000000..cc4b97ab
--- /dev/null
+++ b/gnulib/modules/unistd-safer-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-dup-safer.c
+tests/macros.h
+
+Depends-on:
+binary-io
+cloexec
+fd-safer-flag
+stdbool
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-dup-safer
+check_PROGRAMS += test-dup-safer
diff --git a/gnulib/modules/unistd-tests b/gnulib/modules/unistd-tests
new file mode 100644
index 00000000..486f9e1a
--- /dev/null
+++ b/gnulib/modules/unistd-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-unistd.c
+
+Depends-on:
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-unistd
+check_PROGRAMS += test-unistd
diff --git a/gnulib/modules/unistdio/base b/gnulib/modules/unistdio/base
new file mode 100644
index 00000000..290712b9
--- /dev/null
+++ b/gnulib/modules/unistdio/base
@@ -0,0 +1,22 @@
+Description:
+Base layer for formatted output to strings.
+
+Files:
+lib/unistdio.h
+
+Depends-on:
+unitypes
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u-printf-args b/gnulib/modules/unistdio/u-printf-args
new file mode 100644
index 00000000..eb15f139
--- /dev/null
+++ b/gnulib/modules/unistdio/u-printf-args
@@ -0,0 +1,31 @@
+Description:
+Fetching a printf argument list.
+
+Files:
+lib/unistdio/u-printf-args.h
+lib/unistdio/u-printf-args.c
+lib/printf-args.h
+lib/printf-args.c
+m4/vasnprintf.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unitypes
+
+configure.ac:
+gl_PREREQ_PRINTF_ARGS
+
+Makefile.am:
+lib_SOURCES += unistdio/u-printf-args.c
+
+Include:
+"unistdio/u-printf-args.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-asnprintf b/gnulib/modules/unistdio/u16-asnprintf
new file mode 100644
index 00000000..78355ac7
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-asnprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-16 string, with automatic memory allocation and
+bounded output size.
+
+Files:
+lib/unistdio/u16-asnprintf.c
+lib/unistdio/u-asnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-vasnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-asnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-asnprintf-tests b/gnulib/modules/unistdio/u16-asnprintf-tests
new file mode 100644
index 00000000..9023b33c
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-asnprintf-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unistdio/test-u16-asnprintf1.c
+tests/unistdio/test-u16-asnprintf1.h
+tests/unistdio/test-u16-printf1.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-asnprintf1
+check_PROGRAMS += test-u16-asnprintf1
+test_u16_asnprintf1_SOURCES = unistdio/test-u16-asnprintf1.c
+test_u16_asnprintf1_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u16-asprintf b/gnulib/modules/unistdio/u16-asprintf
new file mode 100644
index 00000000..edb2448f
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-asprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-16 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u16-asprintf.c
+lib/unistdio/u-asprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-vasprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-asprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-printf-parse b/gnulib/modules/unistdio/u16-printf-parse
new file mode 100644
index 00000000..552715f5
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-printf-parse
@@ -0,0 +1,33 @@
+Description:
+Parsing an UTF-16 format string.
+
+Files:
+lib/unistdio/u-printf-parse.h
+lib/unistdio/u16-printf-parse.c
+lib/printf-parse.h
+lib/printf-parse.c
+m4/vasnprintf.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/u-printf-args
+stdint
+xsize
+
+configure.ac:
+gl_PREREQ_PRINTF_PARSE
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-printf-parse.c
+
+Include:
+"unistdio/u-printf-parse.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-snprintf b/gnulib/modules/unistdio/u16-snprintf
new file mode 100644
index 00000000..214afe54
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-snprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a fixed-length UTF-16 string.
+
+Files:
+lib/unistdio/u16-snprintf.c
+lib/unistdio/u-snprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-vsnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-snprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-sprintf b/gnulib/modules/unistdio/u16-sprintf
new file mode 100644
index 00000000..8018a4c0
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-sprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-16 string.
+
+Files:
+lib/unistdio/u16-sprintf.c
+lib/unistdio/u-sprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-vsprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-sprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-u16-asnprintf b/gnulib/modules/unistdio/u16-u16-asnprintf
new file mode 100644
index 00000000..d1230b04
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-u16-asnprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-16 string, with automatic memory allocation and
+bounded output size.
+
+Files:
+lib/unistdio/u16-u16-asnprintf.c
+lib/unistdio/u-asnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-u16-vasnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-u16-asnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-u16-asprintf b/gnulib/modules/unistdio/u16-u16-asprintf
new file mode 100644
index 00000000..abd44ed7
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-u16-asprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-16 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u16-u16-asprintf.c
+lib/unistdio/u-asprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-u16-vasprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-u16-asprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-u16-snprintf b/gnulib/modules/unistdio/u16-u16-snprintf
new file mode 100644
index 00000000..0d78a404
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-u16-snprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a fixed-length UTF-16 string.
+
+Files:
+lib/unistdio/u16-u16-snprintf.c
+lib/unistdio/u-snprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-u16-vsnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-u16-snprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-u16-sprintf b/gnulib/modules/unistdio/u16-u16-sprintf
new file mode 100644
index 00000000..300e93af
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-u16-sprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-16 string.
+
+Files:
+lib/unistdio/u16-u16-sprintf.c
+lib/unistdio/u-sprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-u16-vsprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-u16-sprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-u16-vasnprintf b/gnulib/modules/unistdio/u16-u16-vasnprintf
new file mode 100644
index 00000000..c4a9075d
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-u16-vasnprintf
@@ -0,0 +1,62 @@
+Description:
+Formatted output to UTF-16 strings.
+
+Files:
+lib/unistdio/u16-u16-vasnprintf.c
+lib/vasnprintf.c
+m4/vasnprintf.m4
+m4/printf.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/longlong.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/base
+unistdio/u16-printf-parse
+unistdio/u-printf-args
+uniconv/u16-conv-from-enc
+unistr/u16-cpy
+unistr/u16-set
+unistr/u16-mbsnlen
+unistr/u8-to-u16
+unistr/u32-to-u16
+unistr/u8-strlen
+unistr/u8-strmblen
+unistr/u16-strlen
+unistr/u16-strmblen
+unistr/u32-strlen
+unistr/u32-strmblen
+isnand-nolibm
+isnanl-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+alloca-opt
+localcharset
+xsize
+errno
+memchr
+multiarch
+
+configure.ac:
+gl_PREREQ_VASNPRINTF_WITH_EXTRAS
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-u16-vasnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-u16-vasprintf b/gnulib/modules/unistdio/u16-u16-vasprintf
new file mode 100644
index 00000000..3fac74c3
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-u16-vasprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-16 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u16-u16-vasprintf.c
+lib/unistdio/u-vasprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-u16-vasnprintf
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-u16-vasprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-u16-vsnprintf b/gnulib/modules/unistdio/u16-u16-vsnprintf
new file mode 100644
index 00000000..f42e4900
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-u16-vsnprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to a fixed-length UTF-16 string.
+
+Files:
+lib/unistdio/u16-u16-vsnprintf.c
+lib/unistdio/u-vsnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-u16-vasnprintf
+unistr/u16-cpy
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-u16-vsnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-u16-vsprintf b/gnulib/modules/unistdio/u16-u16-vsprintf
new file mode 100644
index 00000000..6b33c869
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-u16-vsprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to an UTF-16 string.
+
+Files:
+lib/unistdio/u16-u16-vsprintf.c
+lib/unistdio/u-vsprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-u16-vasnprintf
+stdint
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-u16-vsprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-vasnprintf b/gnulib/modules/unistdio/u16-vasnprintf
new file mode 100644
index 00000000..094facf4
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-vasnprintf
@@ -0,0 +1,62 @@
+Description:
+Formatted output to UTF-16 strings.
+
+Files:
+lib/unistdio/u16-vasnprintf.c
+lib/vasnprintf.c
+m4/vasnprintf.m4
+m4/printf.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/longlong.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/base
+unistdio/ulc-printf-parse
+unistdio/u-printf-args
+uniconv/u16-conv-from-enc
+unistr/u16-cpy
+unistr/u16-set
+unistr/u16-mbsnlen
+unistr/u8-to-u16
+unistr/u32-to-u16
+unistr/u8-strlen
+unistr/u8-strmblen
+unistr/u16-strlen
+unistr/u16-strmblen
+unistr/u32-strlen
+unistr/u32-strmblen
+isnand-nolibm
+isnanl-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+alloca-opt
+localcharset
+xsize
+errno
+memchr
+multiarch
+
+configure.ac:
+gl_PREREQ_VASNPRINTF_WITH_EXTRAS
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-vasnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-vasnprintf-tests b/gnulib/modules/unistdio/u16-vasnprintf-tests
new file mode 100644
index 00000000..d67a13ec
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-vasnprintf-tests
@@ -0,0 +1,32 @@
+Files:
+tests/unistdio/test-u16-vasnprintf1.c
+tests/unistdio/test-u16-asnprintf1.h
+tests/unistdio/test-u16-printf1.h
+tests/unistdio/test-u16-vasnprintf2.sh
+tests/unistdio/test-u16-vasnprintf2.c
+tests/unistdio/test-u16-vasnprintf3.sh
+tests/unistdio/test-u16-vasnprintf3.c
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+unistr/u16-cmp
+unistr/u16-cpy
+unistr/u16-strcmp
+unistr/u16-strlen
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-u16-vasnprintf1 unistdio/test-u16-vasnprintf2.sh unistdio/test-u16-vasnprintf3.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-u16-vasnprintf1 test-u16-vasnprintf2 test-u16-vasnprintf3
+test_u16_vasnprintf1_SOURCES = unistdio/test-u16-vasnprintf1.c
+test_u16_vasnprintf1_LDADD = $(LDADD) @LIBICONV@
+test_u16_vasnprintf2_SOURCES = unistdio/test-u16-vasnprintf2.c
+test_u16_vasnprintf2_LDADD = $(LDADD) @LIBICONV@
+test_u16_vasnprintf3_SOURCES = unistdio/test-u16-vasnprintf3.c
+test_u16_vasnprintf3_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u16-vasprintf b/gnulib/modules/unistdio/u16-vasprintf
new file mode 100644
index 00000000..bc148f58
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-vasprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-16 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u16-vasprintf.c
+lib/unistdio/u-vasprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-vasnprintf
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-vasprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-vasprintf-tests b/gnulib/modules/unistdio/u16-vasprintf-tests
new file mode 100644
index 00000000..b4163a4d
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-vasprintf-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistdio/test-u16-vasprintf1.c
+tests/unistdio/test-u16-printf1.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-vasprintf1
+check_PROGRAMS += test-u16-vasprintf1
+test_u16_vasprintf1_SOURCES = unistdio/test-u16-vasprintf1.c
+test_u16_vasprintf1_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u16-vsnprintf b/gnulib/modules/unistdio/u16-vsnprintf
new file mode 100644
index 00000000..3e4f350b
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-vsnprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to a fixed-length UTF-16 string.
+
+Files:
+lib/unistdio/u16-vsnprintf.c
+lib/unistdio/u-vsnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-vasnprintf
+unistr/u16-cpy
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-vsnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-vsnprintf-tests b/gnulib/modules/unistdio/u16-vsnprintf-tests
new file mode 100644
index 00000000..0a4c70a9
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-vsnprintf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unistdio/test-u16-vsnprintf1.c
+tests/unistdio/test-u16-printf1.h
+tests/macros.h
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-vsnprintf1
+check_PROGRAMS += test-u16-vsnprintf1
+test_u16_vsnprintf1_SOURCES = unistdio/test-u16-vsnprintf1.c
+test_u16_vsnprintf1_LDADD = $(LDADD) @LIBINTL@ @LIBICONV@
diff --git a/gnulib/modules/unistdio/u16-vsprintf b/gnulib/modules/unistdio/u16-vsprintf
new file mode 100644
index 00000000..20f93009
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-vsprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to an UTF-16 string.
+
+Files:
+lib/unistdio/u16-vsprintf.c
+lib/unistdio/u-vsprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u16-vasnprintf
+stdint
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u16-vsprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u16-vsprintf-tests b/gnulib/modules/unistdio/u16-vsprintf-tests
new file mode 100644
index 00000000..715249db
--- /dev/null
+++ b/gnulib/modules/unistdio/u16-vsprintf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unistdio/test-u16-vsprintf1.c
+tests/unistdio/test-u16-printf1.h
+tests/macros.h
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-vsprintf1
+check_PROGRAMS += test-u16-vsprintf1
+test_u16_vsprintf1_SOURCES = unistdio/test-u16-vsprintf1.c
+test_u16_vsprintf1_LDADD = $(LDADD) @LIBINTL@ @LIBICONV@
diff --git a/gnulib/modules/unistdio/u32-asnprintf b/gnulib/modules/unistdio/u32-asnprintf
new file mode 100644
index 00000000..ec916051
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-asnprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-32 string, with automatic memory allocation and
+bounded output size.
+
+Files:
+lib/unistdio/u32-asnprintf.c
+lib/unistdio/u-asnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-vasnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-asnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-asnprintf-tests b/gnulib/modules/unistdio/u32-asnprintf-tests
new file mode 100644
index 00000000..8a285f30
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-asnprintf-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unistdio/test-u32-asnprintf1.c
+tests/unistdio/test-u32-asnprintf1.h
+tests/unistdio/test-u32-printf1.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-asnprintf1
+check_PROGRAMS += test-u32-asnprintf1
+test_u32_asnprintf1_SOURCES = unistdio/test-u32-asnprintf1.c
+test_u32_asnprintf1_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u32-asprintf b/gnulib/modules/unistdio/u32-asprintf
new file mode 100644
index 00000000..5b251d12
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-asprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-32 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u32-asprintf.c
+lib/unistdio/u-asprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-vasprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-asprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-printf-parse b/gnulib/modules/unistdio/u32-printf-parse
new file mode 100644
index 00000000..5ac29fd4
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-printf-parse
@@ -0,0 +1,33 @@
+Description:
+Parsing an UTF-32 format string.
+
+Files:
+lib/unistdio/u-printf-parse.h
+lib/unistdio/u32-printf-parse.c
+lib/printf-parse.h
+lib/printf-parse.c
+m4/vasnprintf.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/u-printf-args
+stdint
+xsize
+
+configure.ac:
+gl_PREREQ_PRINTF_PARSE
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-printf-parse.c
+
+Include:
+"unistdio/u-printf-parse.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-snprintf b/gnulib/modules/unistdio/u32-snprintf
new file mode 100644
index 00000000..54c783d9
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-snprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a fixed-length UTF-32 string.
+
+Files:
+lib/unistdio/u32-snprintf.c
+lib/unistdio/u-snprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-vsnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-snprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-sprintf b/gnulib/modules/unistdio/u32-sprintf
new file mode 100644
index 00000000..a662796f
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-sprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-32 string.
+
+Files:
+lib/unistdio/u32-sprintf.c
+lib/unistdio/u-sprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-vsprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-sprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-u32-asnprintf b/gnulib/modules/unistdio/u32-u32-asnprintf
new file mode 100644
index 00000000..4f8dfc6f
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-u32-asnprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-32 string, with automatic memory allocation and
+bounded output size.
+
+Files:
+lib/unistdio/u32-u32-asnprintf.c
+lib/unistdio/u-asnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-u32-vasnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-u32-asnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-u32-asprintf b/gnulib/modules/unistdio/u32-u32-asprintf
new file mode 100644
index 00000000..4dc5bf8d
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-u32-asprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-32 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u32-u32-asprintf.c
+lib/unistdio/u-asprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-u32-vasprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-u32-asprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-u32-snprintf b/gnulib/modules/unistdio/u32-u32-snprintf
new file mode 100644
index 00000000..6c355c97
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-u32-snprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a fixed-length UTF-32 string.
+
+Files:
+lib/unistdio/u32-u32-snprintf.c
+lib/unistdio/u-snprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-u32-vsnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-u32-snprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-u32-sprintf b/gnulib/modules/unistdio/u32-u32-sprintf
new file mode 100644
index 00000000..e2e31463
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-u32-sprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-32 string.
+
+Files:
+lib/unistdio/u32-u32-sprintf.c
+lib/unistdio/u-sprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-u32-vsprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-u32-sprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-u32-vasnprintf b/gnulib/modules/unistdio/u32-u32-vasnprintf
new file mode 100644
index 00000000..f5481ccc
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-u32-vasnprintf
@@ -0,0 +1,62 @@
+Description:
+Formatted output to UTF-32 strings.
+
+Files:
+lib/unistdio/u32-u32-vasnprintf.c
+lib/vasnprintf.c
+m4/vasnprintf.m4
+m4/printf.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/longlong.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/base
+unistdio/u32-printf-parse
+unistdio/u-printf-args
+uniconv/u32-conv-from-enc
+unistr/u32-cpy
+unistr/u32-set
+unistr/u32-mbsnlen
+unistr/u8-to-u32
+unistr/u16-to-u32
+unistr/u8-strlen
+unistr/u8-strmblen
+unistr/u16-strlen
+unistr/u16-strmblen
+unistr/u32-strlen
+unistr/u32-strmblen
+isnand-nolibm
+isnanl-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+alloca-opt
+localcharset
+xsize
+errno
+memchr
+multiarch
+
+configure.ac:
+gl_PREREQ_VASNPRINTF_WITH_EXTRAS
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-u32-vasnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-u32-vasprintf b/gnulib/modules/unistdio/u32-u32-vasprintf
new file mode 100644
index 00000000..c135191c
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-u32-vasprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-32 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u32-u32-vasprintf.c
+lib/unistdio/u-vasprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-u32-vasnprintf
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-u32-vasprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-u32-vsnprintf b/gnulib/modules/unistdio/u32-u32-vsnprintf
new file mode 100644
index 00000000..96acc62a
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-u32-vsnprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to a fixed-length UTF-32 string.
+
+Files:
+lib/unistdio/u32-u32-vsnprintf.c
+lib/unistdio/u-vsnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-u32-vasnprintf
+unistr/u32-cpy
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-u32-vsnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-u32-vsprintf b/gnulib/modules/unistdio/u32-u32-vsprintf
new file mode 100644
index 00000000..bbb8e4d0
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-u32-vsprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to an UTF-32 string.
+
+Files:
+lib/unistdio/u32-u32-vsprintf.c
+lib/unistdio/u-vsprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-u32-vasnprintf
+stdint
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-u32-vsprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-vasnprintf b/gnulib/modules/unistdio/u32-vasnprintf
new file mode 100644
index 00000000..b48b0c02
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-vasnprintf
@@ -0,0 +1,62 @@
+Description:
+Formatted output to UTF-32 strings.
+
+Files:
+lib/unistdio/u32-vasnprintf.c
+lib/vasnprintf.c
+m4/vasnprintf.m4
+m4/printf.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/longlong.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/base
+unistdio/ulc-printf-parse
+unistdio/u-printf-args
+uniconv/u32-conv-from-enc
+unistr/u32-cpy
+unistr/u32-set
+unistr/u32-mbsnlen
+unistr/u8-to-u32
+unistr/u16-to-u32
+unistr/u8-strlen
+unistr/u8-strmblen
+unistr/u16-strlen
+unistr/u16-strmblen
+unistr/u32-strlen
+unistr/u32-strmblen
+isnand-nolibm
+isnanl-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+alloca-opt
+localcharset
+xsize
+errno
+memchr
+multiarch
+
+configure.ac:
+gl_PREREQ_VASNPRINTF_WITH_EXTRAS
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-vasnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-vasnprintf-tests b/gnulib/modules/unistdio/u32-vasnprintf-tests
new file mode 100644
index 00000000..73308878
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-vasnprintf-tests
@@ -0,0 +1,32 @@
+Files:
+tests/unistdio/test-u32-vasnprintf1.c
+tests/unistdio/test-u32-asnprintf1.h
+tests/unistdio/test-u32-printf1.h
+tests/unistdio/test-u32-vasnprintf2.sh
+tests/unistdio/test-u32-vasnprintf2.c
+tests/unistdio/test-u32-vasnprintf3.sh
+tests/unistdio/test-u32-vasnprintf3.c
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+unistr/u32-cmp
+unistr/u32-cpy
+unistr/u32-strcmp
+unistr/u32-strlen
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-u32-vasnprintf1 unistdio/test-u32-vasnprintf2.sh unistdio/test-u32-vasnprintf3.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-u32-vasnprintf1 test-u32-vasnprintf2 test-u32-vasnprintf3
+test_u32_vasnprintf1_SOURCES = unistdio/test-u32-vasnprintf1.c
+test_u32_vasnprintf1_LDADD = $(LDADD) @LIBICONV@
+test_u32_vasnprintf2_SOURCES = unistdio/test-u32-vasnprintf2.c
+test_u32_vasnprintf2_LDADD = $(LDADD) @LIBICONV@
+test_u32_vasnprintf3_SOURCES = unistdio/test-u32-vasnprintf3.c
+test_u32_vasnprintf3_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u32-vasprintf b/gnulib/modules/unistdio/u32-vasprintf
new file mode 100644
index 00000000..dc71f0b6
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-vasprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-32 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u32-vasprintf.c
+lib/unistdio/u-vasprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-vasnprintf
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-vasprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-vasprintf-tests b/gnulib/modules/unistdio/u32-vasprintf-tests
new file mode 100644
index 00000000..e7b4c02f
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-vasprintf-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistdio/test-u32-vasprintf1.c
+tests/unistdio/test-u32-printf1.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-vasprintf1
+check_PROGRAMS += test-u32-vasprintf1
+test_u32_vasprintf1_SOURCES = unistdio/test-u32-vasprintf1.c
+test_u32_vasprintf1_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u32-vsnprintf b/gnulib/modules/unistdio/u32-vsnprintf
new file mode 100644
index 00000000..09797694
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-vsnprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to a fixed-length UTF-32 string.
+
+Files:
+lib/unistdio/u32-vsnprintf.c
+lib/unistdio/u-vsnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-vasnprintf
+unistr/u32-cpy
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-vsnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-vsnprintf-tests b/gnulib/modules/unistdio/u32-vsnprintf-tests
new file mode 100644
index 00000000..65fd9477
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-vsnprintf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unistdio/test-u32-vsnprintf1.c
+tests/unistdio/test-u32-printf1.h
+tests/macros.h
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-vsnprintf1
+check_PROGRAMS += test-u32-vsnprintf1
+test_u32_vsnprintf1_SOURCES = unistdio/test-u32-vsnprintf1.c
+test_u32_vsnprintf1_LDADD = $(LDADD) @LIBINTL@ @LIBICONV@
diff --git a/gnulib/modules/unistdio/u32-vsprintf b/gnulib/modules/unistdio/u32-vsprintf
new file mode 100644
index 00000000..102d0f0c
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-vsprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to an UTF-32 string.
+
+Files:
+lib/unistdio/u32-vsprintf.c
+lib/unistdio/u-vsprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u32-vasnprintf
+stdint
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u32-vsprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u32-vsprintf-tests b/gnulib/modules/unistdio/u32-vsprintf-tests
new file mode 100644
index 00000000..04c515cb
--- /dev/null
+++ b/gnulib/modules/unistdio/u32-vsprintf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unistdio/test-u32-vsprintf1.c
+tests/unistdio/test-u32-printf1.h
+tests/macros.h
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-vsprintf1
+check_PROGRAMS += test-u32-vsprintf1
+test_u32_vsprintf1_SOURCES = unistdio/test-u32-vsprintf1.c
+test_u32_vsprintf1_LDADD = $(LDADD) @LIBINTL@ @LIBICONV@
diff --git a/gnulib/modules/unistdio/u8-asnprintf b/gnulib/modules/unistdio/u8-asnprintf
new file mode 100644
index 00000000..a0542488
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-asnprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-8 string, with automatic memory allocation and
+bounded output size.
+
+Files:
+lib/unistdio/u8-asnprintf.c
+lib/unistdio/u-asnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-vasnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-asnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-asnprintf-tests b/gnulib/modules/unistdio/u8-asnprintf-tests
new file mode 100644
index 00000000..2e6ed150
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-asnprintf-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unistdio/test-u8-asnprintf1.c
+tests/unistdio/test-u8-asnprintf1.h
+tests/unistdio/test-u8-printf1.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-asnprintf1
+check_PROGRAMS += test-u8-asnprintf1
+test_u8_asnprintf1_SOURCES = unistdio/test-u8-asnprintf1.c
+test_u8_asnprintf1_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u8-asprintf b/gnulib/modules/unistdio/u8-asprintf
new file mode 100644
index 00000000..56f78a18
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-asprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-8 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u8-asprintf.c
+lib/unistdio/u-asprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-vasprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-asprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-printf-parse b/gnulib/modules/unistdio/u8-printf-parse
new file mode 100644
index 00000000..6cbc2ed8
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-printf-parse
@@ -0,0 +1,33 @@
+Description:
+Parsing an UTF-8 format string.
+
+Files:
+lib/unistdio/u-printf-parse.h
+lib/unistdio/u8-printf-parse.c
+lib/printf-parse.h
+lib/printf-parse.c
+m4/vasnprintf.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/u-printf-args
+stdint
+xsize
+
+configure.ac:
+gl_PREREQ_PRINTF_PARSE
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-printf-parse.c
+
+Include:
+"unistdio/u-printf-parse.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-snprintf b/gnulib/modules/unistdio/u8-snprintf
new file mode 100644
index 00000000..ee1fd7ab
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-snprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a fixed-length UTF-8 string.
+
+Files:
+lib/unistdio/u8-snprintf.c
+lib/unistdio/u-snprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-vsnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-snprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-sprintf b/gnulib/modules/unistdio/u8-sprintf
new file mode 100644
index 00000000..72c612b0
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-sprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-8 string.
+
+Files:
+lib/unistdio/u8-sprintf.c
+lib/unistdio/u-sprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-vsprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-sprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-u8-asnprintf b/gnulib/modules/unistdio/u8-u8-asnprintf
new file mode 100644
index 00000000..c8ddf9d8
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-u8-asnprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-8 string, with automatic memory allocation and
+bounded output size.
+
+Files:
+lib/unistdio/u8-u8-asnprintf.c
+lib/unistdio/u-asnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-u8-vasnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-u8-asnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-u8-asprintf b/gnulib/modules/unistdio/u8-u8-asprintf
new file mode 100644
index 00000000..73289385
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-u8-asprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-8 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u8-u8-asprintf.c
+lib/unistdio/u-asprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-u8-vasprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-u8-asprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-u8-snprintf b/gnulib/modules/unistdio/u8-u8-snprintf
new file mode 100644
index 00000000..de12c800
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-u8-snprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a fixed-length UTF-8 string.
+
+Files:
+lib/unistdio/u8-u8-snprintf.c
+lib/unistdio/u-snprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-u8-vsnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-u8-snprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-u8-sprintf b/gnulib/modules/unistdio/u8-u8-sprintf
new file mode 100644
index 00000000..f6e7e745
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-u8-sprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to an UTF-8 string.
+
+Files:
+lib/unistdio/u8-u8-sprintf.c
+lib/unistdio/u-sprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-u8-vsprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-u8-sprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-u8-vasnprintf b/gnulib/modules/unistdio/u8-u8-vasnprintf
new file mode 100644
index 00000000..3d830086
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-u8-vasnprintf
@@ -0,0 +1,62 @@
+Description:
+Formatted output to UTF-8 strings.
+
+Files:
+lib/unistdio/u8-u8-vasnprintf.c
+lib/vasnprintf.c
+m4/vasnprintf.m4
+m4/printf.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/longlong.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/base
+unistdio/u8-printf-parse
+unistdio/u-printf-args
+uniconv/u8-conv-from-enc
+unistr/u8-cpy
+unistr/u8-set
+unistr/u8-mbsnlen
+unistr/u16-to-u8
+unistr/u32-to-u8
+unistr/u8-strlen
+unistr/u8-strmblen
+unistr/u16-strlen
+unistr/u16-strmblen
+unistr/u32-strlen
+unistr/u32-strmblen
+isnand-nolibm
+isnanl-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+alloca-opt
+localcharset
+xsize
+errno
+memchr
+multiarch
+
+configure.ac:
+gl_PREREQ_VASNPRINTF_WITH_EXTRAS
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-u8-vasnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-u8-vasprintf b/gnulib/modules/unistdio/u8-u8-vasprintf
new file mode 100644
index 00000000..286c0ae7
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-u8-vasprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-8 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u8-u8-vasprintf.c
+lib/unistdio/u-vasprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-u8-vasnprintf
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-u8-vasprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-u8-vsnprintf b/gnulib/modules/unistdio/u8-u8-vsnprintf
new file mode 100644
index 00000000..cc8156a0
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-u8-vsnprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to a fixed-length UTF-8 string.
+
+Files:
+lib/unistdio/u8-u8-vsnprintf.c
+lib/unistdio/u-vsnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-u8-vasnprintf
+unistr/u8-cpy
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-u8-vsnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-u8-vsprintf b/gnulib/modules/unistdio/u8-u8-vsprintf
new file mode 100644
index 00000000..ac20f40a
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-u8-vsprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to an UTF-8 string.
+
+Files:
+lib/unistdio/u8-u8-vsprintf.c
+lib/unistdio/u-vsprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-u8-vasnprintf
+stdint
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-u8-vsprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-vasnprintf b/gnulib/modules/unistdio/u8-vasnprintf
new file mode 100644
index 00000000..cbad1b33
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-vasnprintf
@@ -0,0 +1,62 @@
+Description:
+Formatted output to UTF-8 strings.
+
+Files:
+lib/unistdio/u8-vasnprintf.c
+lib/vasnprintf.c
+m4/vasnprintf.m4
+m4/printf.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/longlong.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/base
+unistdio/ulc-printf-parse
+unistdio/u-printf-args
+uniconv/u8-conv-from-enc
+unistr/u8-cpy
+unistr/u8-set
+unistr/u8-mbsnlen
+unistr/u16-to-u8
+unistr/u32-to-u8
+unistr/u8-strlen
+unistr/u8-strmblen
+unistr/u16-strlen
+unistr/u16-strmblen
+unistr/u32-strlen
+unistr/u32-strmblen
+isnand-nolibm
+isnanl-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+alloca-opt
+localcharset
+xsize
+errno
+memchr
+multiarch
+
+configure.ac:
+gl_PREREQ_VASNPRINTF_WITH_EXTRAS
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-vasnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-vasnprintf-tests b/gnulib/modules/unistdio/u8-vasnprintf-tests
new file mode 100644
index 00000000..485ca5d1
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-vasnprintf-tests
@@ -0,0 +1,32 @@
+Files:
+tests/unistdio/test-u8-vasnprintf1.c
+tests/unistdio/test-u8-asnprintf1.h
+tests/unistdio/test-u8-printf1.h
+tests/unistdio/test-u8-vasnprintf2.sh
+tests/unistdio/test-u8-vasnprintf2.c
+tests/unistdio/test-u8-vasnprintf3.sh
+tests/unistdio/test-u8-vasnprintf3.c
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+unistr/u8-cmp
+unistr/u8-cpy
+unistr/u8-strcmp
+unistr/u8-strlen
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-u8-vasnprintf1 unistdio/test-u8-vasnprintf2.sh unistdio/test-u8-vasnprintf3.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-u8-vasnprintf1 test-u8-vasnprintf2 test-u8-vasnprintf3
+test_u8_vasnprintf1_SOURCES = unistdio/test-u8-vasnprintf1.c
+test_u8_vasnprintf1_LDADD = $(LDADD) @LIBICONV@
+test_u8_vasnprintf2_SOURCES = unistdio/test-u8-vasnprintf2.c
+test_u8_vasnprintf2_LDADD = $(LDADD) @LIBICONV@
+test_u8_vasnprintf3_SOURCES = unistdio/test-u8-vasnprintf3.c
+test_u8_vasnprintf3_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u8-vasprintf b/gnulib/modules/unistdio/u8-vasprintf
new file mode 100644
index 00000000..e280dc17
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-vasprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to an UTF-8 string, with automatic memory allocation.
+
+Files:
+lib/unistdio/u8-vasprintf.c
+lib/unistdio/u-vasprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-vasnprintf
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-vasprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-vasprintf-tests b/gnulib/modules/unistdio/u8-vasprintf-tests
new file mode 100644
index 00000000..ec85b60e
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-vasprintf-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistdio/test-u8-vasprintf1.c
+tests/unistdio/test-u8-printf1.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-vasprintf1
+check_PROGRAMS += test-u8-vasprintf1
+test_u8_vasprintf1_SOURCES = unistdio/test-u8-vasprintf1.c
+test_u8_vasprintf1_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/u8-vsnprintf b/gnulib/modules/unistdio/u8-vsnprintf
new file mode 100644
index 00000000..680a987c
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-vsnprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to a fixed-length UTF-8 string.
+
+Files:
+lib/unistdio/u8-vsnprintf.c
+lib/unistdio/u-vsnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-vasnprintf
+unistr/u8-cpy
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-vsnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-vsnprintf-tests b/gnulib/modules/unistdio/u8-vsnprintf-tests
new file mode 100644
index 00000000..7f12e45b
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-vsnprintf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unistdio/test-u8-vsnprintf1.c
+tests/unistdio/test-u8-printf1.h
+tests/macros.h
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-vsnprintf1
+check_PROGRAMS += test-u8-vsnprintf1
+test_u8_vsnprintf1_SOURCES = unistdio/test-u8-vsnprintf1.c
+test_u8_vsnprintf1_LDADD = $(LDADD) @LIBINTL@ @LIBICONV@
diff --git a/gnulib/modules/unistdio/u8-vsprintf b/gnulib/modules/unistdio/u8-vsprintf
new file mode 100644
index 00000000..bd092fed
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-vsprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to an UTF-8 string.
+
+Files:
+lib/unistdio/u8-vsprintf.c
+lib/unistdio/u-vsprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/u8-vasnprintf
+stdint
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/u8-vsprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/u8-vsprintf-tests b/gnulib/modules/unistdio/u8-vsprintf-tests
new file mode 100644
index 00000000..b20e7040
--- /dev/null
+++ b/gnulib/modules/unistdio/u8-vsprintf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unistdio/test-u8-vsprintf1.c
+tests/unistdio/test-u8-printf1.h
+tests/macros.h
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-vsprintf1
+check_PROGRAMS += test-u8-vsprintf1
+test_u8_vsprintf1_SOURCES = unistdio/test-u8-vsprintf1.c
+test_u8_vsprintf1_LDADD = $(LDADD) @LIBINTL@ @LIBICONV@
diff --git a/gnulib/modules/unistdio/ulc-asnprintf b/gnulib/modules/unistdio/ulc-asnprintf
new file mode 100644
index 00000000..921c572c
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-asnprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to a string, with automatic memory allocation and bounded
+output size.
+
+Files:
+lib/unistdio/ulc-asnprintf.c
+lib/unistdio/u-asnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vasnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-asnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-asnprintf-tests b/gnulib/modules/unistdio/ulc-asnprintf-tests
new file mode 100644
index 00000000..2eaddaf4
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-asnprintf-tests
@@ -0,0 +1,15 @@
+Files:
+tests/unistdio/test-ulc-asnprintf1.c
+tests/unistdio/test-ulc-asnprintf1.h
+tests/unistdio/test-ulc-printf1.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ulc-asnprintf1
+check_PROGRAMS += test-ulc-asnprintf1
+test_ulc_asnprintf1_SOURCES = unistdio/test-ulc-asnprintf1.c
+test_ulc_asnprintf1_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/ulc-asprintf b/gnulib/modules/unistdio/ulc-asprintf
new file mode 100644
index 00000000..587436b0
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-asprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a string, with automatic memory allocation.
+
+Files:
+lib/unistdio/ulc-asprintf.c
+lib/unistdio/u-asprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vasprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-asprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-fprintf b/gnulib/modules/unistdio/ulc-fprintf
new file mode 100644
index 00000000..b03d5758
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-fprintf
@@ -0,0 +1,26 @@
+Description:
+Print formatted output to a stream.
+
+Files:
+lib/unistdio/ulc-fprintf.c
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vasnprintf
+fseterr
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-fprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-printf-parse b/gnulib/modules/unistdio/ulc-printf-parse
new file mode 100644
index 00000000..e1f74366
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-printf-parse
@@ -0,0 +1,34 @@
+Description:
+Parsing an ASCII format string.
+
+Files:
+lib/unistdio/u-printf-parse.h
+lib/unistdio/ulc-printf-parse.c
+lib/printf-parse.h
+lib/printf-parse.c
+m4/vasnprintf.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/u-printf-args
+stdint
+xsize
+c-ctype
+
+configure.ac:
+gl_PREREQ_PRINTF_PARSE
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-printf-parse.c
+
+Include:
+"unistdio/u-printf-parse.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-snprintf b/gnulib/modules/unistdio/ulc-snprintf
new file mode 100644
index 00000000..0a56b791
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-snprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a fixed-length string.
+
+Files:
+lib/unistdio/ulc-snprintf.c
+lib/unistdio/u-snprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vsnprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-snprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-sprintf b/gnulib/modules/unistdio/ulc-sprintf
new file mode 100644
index 00000000..1c874790
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-sprintf
@@ -0,0 +1,25 @@
+Description:
+Formatted output to a string.
+
+Files:
+lib/unistdio/ulc-sprintf.c
+lib/unistdio/u-sprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vsprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-sprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-vasnprintf b/gnulib/modules/unistdio/ulc-vasnprintf
new file mode 100644
index 00000000..4b95bb85
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vasnprintf
@@ -0,0 +1,60 @@
+Description:
+Formatted output to strings.
+
+Files:
+lib/unistdio/ulc-vasnprintf.c
+lib/vasnprintf.c
+m4/vasnprintf.m4
+m4/printf.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/longlong.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+
+Depends-on:
+unistdio/base
+unistdio/ulc-printf-parse
+unistdio/u-printf-args
+uniconv/u8-conv-to-enc
+uniconv/u16-conv-to-enc
+uniconv/u32-conv-to-enc
+unistr/u8-strlen
+unistr/u8-strmblen
+unistr/u16-strlen
+unistr/u16-strmblen
+unistr/u32-strlen
+unistr/u32-strmblen
+mbsnlen
+isnand-nolibm
+isnanl-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+alloca-opt
+localcharset
+xsize
+errno
+memchr
+multiarch
+
+configure.ac:
+gl_PREREQ_VASNPRINTF_WITH_EXTRAS
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-vasnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-vasnprintf-tests b/gnulib/modules/unistdio/ulc-vasnprintf-tests
new file mode 100644
index 00000000..f90aaed1
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vasnprintf-tests
@@ -0,0 +1,28 @@
+Files:
+tests/unistdio/test-ulc-vasnprintf1.c
+tests/unistdio/test-ulc-asnprintf1.h
+tests/unistdio/test-ulc-printf1.h
+tests/unistdio/test-ulc-vasnprintf2.sh
+tests/unistdio/test-ulc-vasnprintf2.c
+tests/unistdio/test-ulc-vasnprintf3.sh
+tests/unistdio/test-ulc-vasnprintf3.c
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-ulc-vasnprintf1 unistdio/test-ulc-vasnprintf2.sh unistdio/test-ulc-vasnprintf3.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-ulc-vasnprintf1 test-ulc-vasnprintf2 test-ulc-vasnprintf3
+test_ulc_vasnprintf1_SOURCES = unistdio/test-ulc-vasnprintf1.c
+test_ulc_vasnprintf1_LDADD = $(LDADD) @LIBICONV@
+test_ulc_vasnprintf2_SOURCES = unistdio/test-ulc-vasnprintf2.c
+test_ulc_vasnprintf2_LDADD = $(LDADD) @LIBICONV@
+test_ulc_vasnprintf3_SOURCES = unistdio/test-ulc-vasnprintf3.c
+test_ulc_vasnprintf3_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/ulc-vasprintf b/gnulib/modules/unistdio/ulc-vasprintf
new file mode 100644
index 00000000..631daec8
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vasprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to a string, with automatic memory allocation.
+
+Files:
+lib/unistdio/ulc-vasprintf.c
+lib/unistdio/u-vasprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vasnprintf
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-vasprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-vasprintf-tests b/gnulib/modules/unistdio/ulc-vasprintf-tests
new file mode 100644
index 00000000..1acae46e
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vasprintf-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistdio/test-ulc-vasprintf1.c
+tests/unistdio/test-ulc-printf1.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ulc-vasprintf1
+check_PROGRAMS += test-ulc-vasprintf1
+test_ulc_vasprintf1_SOURCES = unistdio/test-ulc-vasprintf1.c
+test_ulc_vasprintf1_LDADD = $(LDADD) @LIBICONV@
diff --git a/gnulib/modules/unistdio/ulc-vfprintf b/gnulib/modules/unistdio/ulc-vfprintf
new file mode 100644
index 00000000..81f4cc9d
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vfprintf
@@ -0,0 +1,26 @@
+Description:
+Print formatted output to a stream.
+
+Files:
+lib/unistdio/ulc-vfprintf.c
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vasnprintf
+fseterr
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-vfprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-vsnprintf b/gnulib/modules/unistdio/ulc-vsnprintf
new file mode 100644
index 00000000..a4d6fd55
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vsnprintf
@@ -0,0 +1,26 @@
+Description:
+Formatted output to a fixed-length string.
+
+Files:
+lib/unistdio/ulc-vsnprintf.c
+lib/unistdio/u-vsnprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vasnprintf
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-vsnprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-vsnprintf-tests b/gnulib/modules/unistdio/ulc-vsnprintf-tests
new file mode 100644
index 00000000..fb7eb6cd
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vsnprintf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unistdio/test-ulc-vsnprintf1.c
+tests/unistdio/test-ulc-printf1.h
+tests/macros.h
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ulc-vsnprintf1
+check_PROGRAMS += test-ulc-vsnprintf1
+test_ulc_vsnprintf1_SOURCES = unistdio/test-ulc-vsnprintf1.c
+test_ulc_vsnprintf1_LDADD = $(LDADD) @LIBINTL@ @LIBICONV@
diff --git a/gnulib/modules/unistdio/ulc-vsprintf b/gnulib/modules/unistdio/ulc-vsprintf
new file mode 100644
index 00000000..294cd593
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vsprintf
@@ -0,0 +1,27 @@
+Description:
+Formatted output to a string.
+
+Files:
+lib/unistdio/ulc-vsprintf.c
+lib/unistdio/u-vsprintf.h
+
+Depends-on:
+unistdio/base
+unistdio/ulc-vasnprintf
+stdint
+errno
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistdio/ulc-vsprintf.c
+
+Include:
+"unistdio.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistdio/ulc-vsprintf-tests b/gnulib/modules/unistdio/ulc-vsprintf-tests
new file mode 100644
index 00000000..7660984e
--- /dev/null
+++ b/gnulib/modules/unistdio/ulc-vsprintf-tests
@@ -0,0 +1,16 @@
+Files:
+tests/unistdio/test-ulc-vsprintf1.c
+tests/unistdio/test-ulc-printf1.h
+tests/macros.h
+
+Depends-on:
+xalloc
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-ulc-vsprintf1
+check_PROGRAMS += test-ulc-vsprintf1
+test_ulc_vsprintf1_SOURCES = unistdio/test-ulc-vsprintf1.c
+test_ulc_vsprintf1_LDADD = $(LDADD) @LIBINTL@ @LIBICONV@
diff --git a/gnulib/modules/unistr/base b/gnulib/modules/unistr/base
new file mode 100644
index 00000000..06846a6d
--- /dev/null
+++ b/gnulib/modules/unistr/base
@@ -0,0 +1,25 @@
+Description:
+Base layer for elementary Unicode string functions.
+
+Files:
+lib/unistr.h
+
+Depends-on:
+unitypes
+unused-parameter
+stdbool
+inline
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-check b/gnulib/modules/unistr/u16-check
new file mode 100644
index 00000000..b16b01b8
--- /dev/null
+++ b/gnulib/modules/unistr/u16-check
@@ -0,0 +1,23 @@
+Description:
+Check UTF-16 string.
+
+Files:
+lib/unistr/u16-check.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-check.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-check-tests b/gnulib/modules/unistr/u16-check-tests
new file mode 100644
index 00000000..22f4a6f3
--- /dev/null
+++ b/gnulib/modules/unistr/u16-check-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-check.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-check
+check_PROGRAMS += test-u16-check
+test_u16_check_SOURCES = unistr/test-u16-check.c
diff --git a/gnulib/modules/unistr/u16-chr b/gnulib/modules/unistr/u16-chr
new file mode 100644
index 00000000..7ef4abef
--- /dev/null
+++ b/gnulib/modules/unistr/u16-chr
@@ -0,0 +1,24 @@
+Description:
+Search character in piece of UTF-16 string.
+
+Files:
+lib/unistr/u16-chr.c
+
+Depends-on:
+unistr/base
+unistr/u16-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-chr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-chr-tests b/gnulib/modules/unistr/u16-chr-tests
new file mode 100644
index 00000000..75ee7784
--- /dev/null
+++ b/gnulib/modules/unistr/u16-chr-tests
@@ -0,0 +1,21 @@
+Files:
+tests/unistr/test-u16-chr.c
+tests/unistr/test-chr.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+unistr/u16-set
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u16-chr
+check_PROGRAMS += test-u16-chr
+test_u16_chr_SOURCES = unistr/test-u16-chr.c
diff --git a/gnulib/modules/unistr/u16-cmp b/gnulib/modules/unistr/u16-cmp
new file mode 100644
index 00000000..f9c27542
--- /dev/null
+++ b/gnulib/modules/unistr/u16-cmp
@@ -0,0 +1,23 @@
+Description:
+Compare pieces of UTF-16 strings.
+
+Files:
+lib/unistr/u16-cmp.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-cmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-cmp-tests b/gnulib/modules/unistr/u16-cmp-tests
new file mode 100644
index 00000000..1c96328b
--- /dev/null
+++ b/gnulib/modules/unistr/u16-cmp-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u16-cmp.c
+tests/unistr/test-cmp.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u16-cmp
+check_PROGRAMS += test-u16-cmp
+test_u16_cmp_SOURCES = unistr/test-u16-cmp.c
diff --git a/gnulib/modules/unistr/u16-cmp2 b/gnulib/modules/unistr/u16-cmp2
new file mode 100644
index 00000000..c3844265
--- /dev/null
+++ b/gnulib/modules/unistr/u16-cmp2
@@ -0,0 +1,26 @@
+Description:
+Compare pieces of UTF-16 strings with possibly different lengths.
+
+Files:
+lib/unistr/u16-cmp2.c
+lib/unistr/u-cmp2.h
+
+Depends-on:
+unistr/base
+unistr/u16-cmp
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-cmp2.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-cmp2-tests b/gnulib/modules/unistr/u16-cmp2-tests
new file mode 100644
index 00000000..da082961
--- /dev/null
+++ b/gnulib/modules/unistr/u16-cmp2-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-cmp2.c
+tests/unistr/test-cmp2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-cmp2
+check_PROGRAMS += test-u16-cmp2
+test_u16_cmp2_SOURCES = unistr/test-u16-cmp2.c
diff --git a/gnulib/modules/unistr/u16-cpy b/gnulib/modules/unistr/u16-cpy
new file mode 100644
index 00000000..f72179d4
--- /dev/null
+++ b/gnulib/modules/unistr/u16-cpy
@@ -0,0 +1,24 @@
+Description:
+Copy piece of UTF-16 string.
+
+Files:
+lib/unistr/u16-cpy.c
+lib/unistr/u-cpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-cpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-cpy-alloc b/gnulib/modules/unistr/u16-cpy-alloc
new file mode 100644
index 00000000..74395f44
--- /dev/null
+++ b/gnulib/modules/unistr/u16-cpy-alloc
@@ -0,0 +1,25 @@
+Description:
+Copy piece of UTF-16 string.
+
+Files:
+lib/unistr/u16-cpy-alloc.c
+lib/unistr/u-cpy-alloc.h
+
+Depends-on:
+unistr/base
+malloc-posix
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-cpy-alloc.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-cpy-alloc-tests b/gnulib/modules/unistr/u16-cpy-alloc-tests
new file mode 100644
index 00000000..33dbf899
--- /dev/null
+++ b/gnulib/modules/unistr/u16-cpy-alloc-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-cpy-alloc.c
+tests/unistr/test-cpy-alloc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-cpy-alloc
+check_PROGRAMS += test-u16-cpy-alloc
+test_u16_cpy_alloc_SOURCES = unistr/test-u16-cpy-alloc.c
diff --git a/gnulib/modules/unistr/u16-cpy-tests b/gnulib/modules/unistr/u16-cpy-tests
new file mode 100644
index 00000000..08a97037
--- /dev/null
+++ b/gnulib/modules/unistr/u16-cpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-cpy.c
+tests/unistr/test-cpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-cpy
+check_PROGRAMS += test-u16-cpy
+test_u16_cpy_SOURCES = unistr/test-u16-cpy.c
diff --git a/gnulib/modules/unistr/u16-endswith b/gnulib/modules/unistr/u16-endswith
new file mode 100644
index 00000000..fd27b156
--- /dev/null
+++ b/gnulib/modules/unistr/u16-endswith
@@ -0,0 +1,26 @@
+Description:
+Substring test for UTF-16 strings.
+
+Files:
+lib/unistr/u16-endswith.c
+lib/unistr/u-endswith.h
+
+Depends-on:
+unistr/base
+unistr/u16-strlen
+unistr/u16-cmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-endswith.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-mblen b/gnulib/modules/unistr/u16-mblen
new file mode 100644
index 00000000..f557aaf1
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mblen
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-16 string.
+
+Files:
+lib/unistr/u16-mblen.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-mblen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-mblen-tests b/gnulib/modules/unistr/u16-mblen-tests
new file mode 100644
index 00000000..b4f255e3
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mblen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-mblen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-mblen
+check_PROGRAMS += test-u16-mblen
+test_u16_mblen_SOURCES = unistr/test-u16-mblen.c
diff --git a/gnulib/modules/unistr/u16-mbsnlen b/gnulib/modules/unistr/u16-mbsnlen
new file mode 100644
index 00000000..6d8ba47e
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mbsnlen
@@ -0,0 +1,24 @@
+Description:
+Count characters in UTF-16 string.
+
+Files:
+lib/unistr/u16-mbsnlen.c
+
+Depends-on:
+unistr/base
+unistr/u16-mbtoucr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-mbsnlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-mbsnlen-tests b/gnulib/modules/unistr/u16-mbsnlen-tests
new file mode 100644
index 00000000..24c2b579
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mbsnlen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-mbsnlen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-mbsnlen
+check_PROGRAMS += test-u16-mbsnlen
+test_u16_mbsnlen_SOURCES = unistr/test-u16-mbsnlen.c
diff --git a/gnulib/modules/unistr/u16-mbtouc b/gnulib/modules/unistr/u16-mbtouc
new file mode 100644
index 00000000..1febbc2a
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mbtouc
@@ -0,0 +1,25 @@
+Description:
+Look at first character in UTF-16 string.
+
+Files:
+lib/unistr/u16-mbtouc.c
+lib/unistr/u16-mbtouc-aux.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u16-mbtouc])
+
+Makefile.am:
+lib_SOURCES += unistr/u16-mbtouc.c unistr/u16-mbtouc-aux.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-mbtouc-tests b/gnulib/modules/unistr/u16-mbtouc-tests
new file mode 100644
index 00000000..3bfb6975
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mbtouc-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-mbtouc.c
+tests/unistr/test-u16-mbtouc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-mbtouc
+check_PROGRAMS += test-u16-mbtouc
+test_u16_mbtouc_SOURCES = unistr/test-u16-mbtouc.c
diff --git a/gnulib/modules/unistr/u16-mbtouc-unsafe b/gnulib/modules/unistr/u16-mbtouc-unsafe
new file mode 100644
index 00000000..6213dc5e
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mbtouc-unsafe
@@ -0,0 +1,25 @@
+Description:
+Look at first character in UTF-16 string.
+
+Files:
+lib/unistr/u16-mbtouc-unsafe.c
+lib/unistr/u16-mbtouc-unsafe-aux.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u16-mbtouc-unsafe])
+
+Makefile.am:
+lib_SOURCES += unistr/u16-mbtouc-unsafe.c unistr/u16-mbtouc-unsafe-aux.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-mbtouc-unsafe-tests b/gnulib/modules/unistr/u16-mbtouc-unsafe-tests
new file mode 100644
index 00000000..7b39f900
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mbtouc-unsafe-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-mbtouc-unsafe.c
+tests/unistr/test-u16-mbtouc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-mbtouc-unsafe
+check_PROGRAMS += test-u16-mbtouc-unsafe
+test_u16_mbtouc_unsafe_SOURCES = unistr/test-u16-mbtouc-unsafe.c
diff --git a/gnulib/modules/unistr/u16-mbtoucr b/gnulib/modules/unistr/u16-mbtoucr
new file mode 100644
index 00000000..8e1a7e31
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mbtoucr
@@ -0,0 +1,24 @@
+Description:
+Look at first character in UTF-16 string, returning an error code upon failure.
+
+Files:
+lib/unistr/u16-mbtoucr.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u16-mbtoucr])
+
+Makefile.am:
+lib_SOURCES += unistr/u16-mbtoucr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-mbtoucr-tests b/gnulib/modules/unistr/u16-mbtoucr-tests
new file mode 100644
index 00000000..7c6e53fb
--- /dev/null
+++ b/gnulib/modules/unistr/u16-mbtoucr-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-mbtoucr.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-mbtoucr
+check_PROGRAMS += test-u16-mbtoucr
+test_u16_mbtoucr_SOURCES = unistr/test-u16-mbtoucr.c
diff --git a/gnulib/modules/unistr/u16-move b/gnulib/modules/unistr/u16-move
new file mode 100644
index 00000000..fd0a0b63
--- /dev/null
+++ b/gnulib/modules/unistr/u16-move
@@ -0,0 +1,25 @@
+Description:
+Copy piece of UTF-16 string.
+
+Files:
+lib/unistr/u16-move.c
+lib/unistr/u-move.h
+
+Depends-on:
+unistr/base
+memmove
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-move.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-move-tests b/gnulib/modules/unistr/u16-move-tests
new file mode 100644
index 00000000..48a7e09a
--- /dev/null
+++ b/gnulib/modules/unistr/u16-move-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-move.c
+tests/unistr/test-move.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-move
+check_PROGRAMS += test-u16-move
+test_u16_move_SOURCES = unistr/test-u16-move.c
diff --git a/gnulib/modules/unistr/u16-next b/gnulib/modules/unistr/u16-next
new file mode 100644
index 00000000..b1846254
--- /dev/null
+++ b/gnulib/modules/unistr/u16-next
@@ -0,0 +1,24 @@
+Description:
+Iterate over next character in UTF-16 string.
+
+Files:
+lib/unistr/u16-next.c
+
+Depends-on:
+unistr/base
+unistr/u16-strmbtouc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-next.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-next-tests b/gnulib/modules/unistr/u16-next-tests
new file mode 100644
index 00000000..9843cf0f
--- /dev/null
+++ b/gnulib/modules/unistr/u16-next-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-next.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-next
+check_PROGRAMS += test-u16-next
+test_u16_next_SOURCES = unistr/test-u16-next.c
diff --git a/gnulib/modules/unistr/u16-prev b/gnulib/modules/unistr/u16-prev
new file mode 100644
index 00000000..88c754e5
--- /dev/null
+++ b/gnulib/modules/unistr/u16-prev
@@ -0,0 +1,23 @@
+Description:
+Iterate over previous character in UTF-16 string.
+
+Files:
+lib/unistr/u16-prev.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-prev.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-prev-tests b/gnulib/modules/unistr/u16-prev-tests
new file mode 100644
index 00000000..062b2513
--- /dev/null
+++ b/gnulib/modules/unistr/u16-prev-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-prev.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-prev
+check_PROGRAMS += test-u16-prev
+test_u16_prev_SOURCES = unistr/test-u16-prev.c
diff --git a/gnulib/modules/unistr/u16-set b/gnulib/modules/unistr/u16-set
new file mode 100644
index 00000000..d3c18997
--- /dev/null
+++ b/gnulib/modules/unistr/u16-set
@@ -0,0 +1,24 @@
+Description:
+Fill UTF-16 string.
+
+Files:
+lib/unistr/u16-set.c
+lib/unistr/u-set.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-set.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-set-tests b/gnulib/modules/unistr/u16-set-tests
new file mode 100644
index 00000000..bc886100
--- /dev/null
+++ b/gnulib/modules/unistr/u16-set-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-set.c
+tests/unistr/test-set.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-set
+check_PROGRAMS += test-u16-set
+test_u16_set_SOURCES = unistr/test-u16-set.c
diff --git a/gnulib/modules/unistr/u16-startswith b/gnulib/modules/unistr/u16-startswith
new file mode 100644
index 00000000..7c82e2f7
--- /dev/null
+++ b/gnulib/modules/unistr/u16-startswith
@@ -0,0 +1,24 @@
+Description:
+Substring test for UTF-16 strings.
+
+Files:
+lib/unistr/u16-startswith.c
+lib/unistr/u-startswith.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-startswith.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-stpcpy b/gnulib/modules/unistr/u16-stpcpy
new file mode 100644
index 00000000..37e2b44c
--- /dev/null
+++ b/gnulib/modules/unistr/u16-stpcpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-16 string.
+
+Files:
+lib/unistr/u16-stpcpy.c
+lib/unistr/u-stpcpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-stpcpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-stpcpy-tests b/gnulib/modules/unistr/u16-stpcpy-tests
new file mode 100644
index 00000000..b4288727
--- /dev/null
+++ b/gnulib/modules/unistr/u16-stpcpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-stpcpy.c
+tests/unistr/test-stpcpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-stpcpy
+check_PROGRAMS += test-u16-stpcpy
+test_u16_stpcpy_SOURCES = unistr/test-u16-stpcpy.c
diff --git a/gnulib/modules/unistr/u16-stpncpy b/gnulib/modules/unistr/u16-stpncpy
new file mode 100644
index 00000000..e3e47898
--- /dev/null
+++ b/gnulib/modules/unistr/u16-stpncpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-16 string.
+
+Files:
+lib/unistr/u16-stpncpy.c
+lib/unistr/u-stpncpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-stpncpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-stpncpy-tests b/gnulib/modules/unistr/u16-stpncpy-tests
new file mode 100644
index 00000000..6dd27ccc
--- /dev/null
+++ b/gnulib/modules/unistr/u16-stpncpy-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u16-stpncpy.c
+tests/unistr/test-stpncpy.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u16-stpncpy
+check_PROGRAMS += test-u16-stpncpy
+test_u16_stpncpy_SOURCES = unistr/test-u16-stpncpy.c
diff --git a/gnulib/modules/unistr/u16-strcat b/gnulib/modules/unistr/u16-strcat
new file mode 100644
index 00000000..dcf80696
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcat
@@ -0,0 +1,25 @@
+Description:
+Concatenate UTF-16 strings.
+
+Files:
+lib/unistr/u16-strcat.c
+lib/unistr/u-strcat.h
+
+Depends-on:
+unistr/base
+unistr/u16-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strcat.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strcat-tests b/gnulib/modules/unistr/u16-strcat-tests
new file mode 100644
index 00000000..64eb5171
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcat-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-strcat.c
+tests/unistr/test-strcat.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strcat
+check_PROGRAMS += test-u16-strcat
+test_u16_strcat_SOURCES = unistr/test-u16-strcat.c
diff --git a/gnulib/modules/unistr/u16-strchr b/gnulib/modules/unistr/u16-strchr
new file mode 100644
index 00000000..555695fa
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strchr
@@ -0,0 +1,24 @@
+Description:
+Search character in UTF-16 string.
+
+Files:
+lib/unistr/u16-strchr.c
+
+Depends-on:
+unistr/base
+unistr/u16-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strchr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strcmp b/gnulib/modules/unistr/u16-strcmp
new file mode 100644
index 00000000..7bfcf6c9
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcmp
@@ -0,0 +1,23 @@
+Description:
+Compare UTF-16 strings.
+
+Files:
+lib/unistr/u16-strcmp.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strcmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strcmp-tests b/gnulib/modules/unistr/u16-strcmp-tests
new file mode 100644
index 00000000..8dcb3233
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcmp-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistr/test-u16-strcmp.c
+tests/unistr/test-u16-strcmp.h
+tests/unistr/test-strcmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strcmp
+check_PROGRAMS += test-u16-strcmp
+test_u16_strcmp_SOURCES = unistr/test-u16-strcmp.c
diff --git a/gnulib/modules/unistr/u16-strcoll b/gnulib/modules/unistr/u16-strcoll
new file mode 100644
index 00000000..dadf366b
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcoll
@@ -0,0 +1,26 @@
+Description:
+Compare UTF-16 strings using the collation rules of the current locale.
+
+Files:
+lib/unistr/u16-strcoll.c
+lib/unistr/u-strcoll.h
+
+Depends-on:
+unistr/base
+unistr/u16-strcmp
+uniconv/u16-strconv-to-locale
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strcoll.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strcoll-tests b/gnulib/modules/unistr/u16-strcoll-tests
new file mode 100644
index 00000000..84f54de9
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcoll-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistr/test-u16-strcoll.c
+tests/unistr/test-u16-strcmp.h
+tests/unistr/test-strcmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strcoll
+check_PROGRAMS += test-u16-strcoll
+test_u16_strcoll_SOURCES = unistr/test-u16-strcoll.c
diff --git a/gnulib/modules/unistr/u16-strcpy b/gnulib/modules/unistr/u16-strcpy
new file mode 100644
index 00000000..f2b227c2
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-16 string.
+
+Files:
+lib/unistr/u16-strcpy.c
+lib/unistr/u-strcpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strcpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strcpy-tests b/gnulib/modules/unistr/u16-strcpy-tests
new file mode 100644
index 00000000..cca4e3bd
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-strcpy.c
+tests/unistr/test-strcpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strcpy
+check_PROGRAMS += test-u16-strcpy
+test_u16_strcpy_SOURCES = unistr/test-u16-strcpy.c
diff --git a/gnulib/modules/unistr/u16-strcspn b/gnulib/modules/unistr/u16-strcspn
new file mode 100644
index 00000000..ed318e30
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strcspn
@@ -0,0 +1,27 @@
+Description:
+Search for some characters in UTF-16 string.
+
+Files:
+lib/unistr/u16-strcspn.c
+lib/unistr/u-strcspn.h
+
+Depends-on:
+unistr/base
+unistr/u16-strlen
+unistr/u16-strmbtouc
+unistr/u16-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strcspn.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strdup b/gnulib/modules/unistr/u16-strdup
new file mode 100644
index 00000000..6c000273
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strdup
@@ -0,0 +1,25 @@
+Description:
+Copy UTF-16 string.
+
+Files:
+lib/unistr/u16-strdup.c
+lib/unistr/u-strdup.h
+
+Depends-on:
+unistr/base
+unistr/u16-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strdup.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strdup-tests b/gnulib/modules/unistr/u16-strdup-tests
new file mode 100644
index 00000000..80eb81c4
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strdup-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-strdup.c
+tests/unistr/test-strdup.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strdup
+check_PROGRAMS += test-u16-strdup
+test_u16_strdup_SOURCES = unistr/test-u16-strdup.c
diff --git a/gnulib/modules/unistr/u16-strlen b/gnulib/modules/unistr/u16-strlen
new file mode 100644
index 00000000..f2282c54
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strlen
@@ -0,0 +1,24 @@
+Description:
+Determine length of UTF-16 string.
+
+Files:
+lib/unistr/u16-strlen.c
+lib/unistr/u-strlen.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strlen-tests b/gnulib/modules/unistr/u16-strlen-tests
new file mode 100644
index 00000000..b1dd434b
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strlen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-strlen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strlen
+check_PROGRAMS += test-u16-strlen
+test_u16_strlen_SOURCES = unistr/test-u16-strlen.c
diff --git a/gnulib/modules/unistr/u16-strmblen b/gnulib/modules/unistr/u16-strmblen
new file mode 100644
index 00000000..74611d82
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strmblen
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-16 string.
+
+Files:
+lib/unistr/u16-strmblen.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strmblen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strmblen-tests b/gnulib/modules/unistr/u16-strmblen-tests
new file mode 100644
index 00000000..bdb9ac80
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strmblen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-strmblen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strmblen
+check_PROGRAMS += test-u16-strmblen
+test_u16_strmblen_SOURCES = unistr/test-u16-strmblen.c
diff --git a/gnulib/modules/unistr/u16-strmbtouc b/gnulib/modules/unistr/u16-strmbtouc
new file mode 100644
index 00000000..7ee51643
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strmbtouc
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-16 string.
+
+Files:
+lib/unistr/u16-strmbtouc.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strmbtouc.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strmbtouc-tests b/gnulib/modules/unistr/u16-strmbtouc-tests
new file mode 100644
index 00000000..5e06b76e
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strmbtouc-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-strmbtouc.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strmbtouc
+check_PROGRAMS += test-u16-strmbtouc
+test_u16_strmbtouc_SOURCES = unistr/test-u16-strmbtouc.c
diff --git a/gnulib/modules/unistr/u16-strncat b/gnulib/modules/unistr/u16-strncat
new file mode 100644
index 00000000..e5e28c39
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strncat
@@ -0,0 +1,25 @@
+Description:
+Concatenate UTF-16 strings.
+
+Files:
+lib/unistr/u16-strncat.c
+lib/unistr/u-strncat.h
+
+Depends-on:
+unistr/base
+unistr/u16-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strncat.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strncat-tests b/gnulib/modules/unistr/u16-strncat-tests
new file mode 100644
index 00000000..e929b5a5
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strncat-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u16-strncat.c
+tests/unistr/test-strncat.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u16-strncat
+check_PROGRAMS += test-u16-strncat
+test_u16_strncat_SOURCES = unistr/test-u16-strncat.c
diff --git a/gnulib/modules/unistr/u16-strncmp b/gnulib/modules/unistr/u16-strncmp
new file mode 100644
index 00000000..c4c164ba
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strncmp
@@ -0,0 +1,23 @@
+Description:
+Compare UTF-16 strings.
+
+Files:
+lib/unistr/u16-strncmp.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strncmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strncmp-tests b/gnulib/modules/unistr/u16-strncmp-tests
new file mode 100644
index 00000000..16a6e2f8
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strncmp-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-strncmp.c
+tests/unistr/test-strncmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strncmp
+check_PROGRAMS += test-u16-strncmp
+test_u16_strncmp_SOURCES = unistr/test-u16-strncmp.c
diff --git a/gnulib/modules/unistr/u16-strncpy b/gnulib/modules/unistr/u16-strncpy
new file mode 100644
index 00000000..6a2042d0
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strncpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-16 string.
+
+Files:
+lib/unistr/u16-strncpy.c
+lib/unistr/u-strncpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strncpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strncpy-tests b/gnulib/modules/unistr/u16-strncpy-tests
new file mode 100644
index 00000000..dcdf78cd
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strncpy-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u16-strncpy.c
+tests/unistr/test-strncpy.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u16-strncpy
+check_PROGRAMS += test-u16-strncpy
+test_u16_strncpy_SOURCES = unistr/test-u16-strncpy.c
diff --git a/gnulib/modules/unistr/u16-strnlen b/gnulib/modules/unistr/u16-strnlen
new file mode 100644
index 00000000..d285f3b7
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strnlen
@@ -0,0 +1,24 @@
+Description:
+Determine bounded length of UTF-16 string.
+
+Files:
+lib/unistr/u16-strnlen.c
+lib/unistr/u-strnlen.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strnlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strnlen-tests b/gnulib/modules/unistr/u16-strnlen-tests
new file mode 100644
index 00000000..780b3387
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strnlen-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u16-strnlen.c
+tests/unistr/test-strnlen.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u16-strnlen
+check_PROGRAMS += test-u16-strnlen
+test_u16_strnlen_SOURCES = unistr/test-u16-strnlen.c
diff --git a/gnulib/modules/unistr/u16-strpbrk b/gnulib/modules/unistr/u16-strpbrk
new file mode 100644
index 00000000..b66ef568
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strpbrk
@@ -0,0 +1,26 @@
+Description:
+Search for some characters in UTF-16 string.
+
+Files:
+lib/unistr/u16-strpbrk.c
+lib/unistr/u-strpbrk.h
+
+Depends-on:
+unistr/base
+unistr/u16-strmbtouc
+unistr/u16-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strpbrk.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strrchr b/gnulib/modules/unistr/u16-strrchr
new file mode 100644
index 00000000..4ceddbc3
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strrchr
@@ -0,0 +1,24 @@
+Description:
+Search character in UTF-16 string.
+
+Files:
+lib/unistr/u16-strrchr.c
+
+Depends-on:
+unistr/base
+unistr/u16-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strrchr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strspn b/gnulib/modules/unistr/u16-strspn
new file mode 100644
index 00000000..8429d475
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strspn
@@ -0,0 +1,28 @@
+Description:
+Search for some characters in UTF-16 string.
+
+Files:
+lib/unistr/u16-strspn.c
+lib/unistr/u-strspn.h
+
+Depends-on:
+unistr/base
+unistr/u16-strlen
+unistr/u16-strmbtouc
+unistr/u16-cmp
+unistr/u16-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strspn.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strstr b/gnulib/modules/unistr/u16-strstr
new file mode 100644
index 00000000..c98dc717
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strstr
@@ -0,0 +1,24 @@
+Description:
+Substring test for UTF-16 strings.
+
+Files:
+lib/unistr/u16-strstr.c
+lib/unistr/u-strstr.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strstr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-strtok b/gnulib/modules/unistr/u16-strtok
new file mode 100644
index 00000000..2eb33b09
--- /dev/null
+++ b/gnulib/modules/unistr/u16-strtok
@@ -0,0 +1,26 @@
+Description:
+Tokenize UTF-16 string.
+
+Files:
+lib/unistr/u16-strtok.c
+lib/unistr/u-strtok.h
+
+Depends-on:
+unistr/base
+unistr/u16-strspn
+unistr/u16-strpbrk
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-strtok.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-to-u32 b/gnulib/modules/unistr/u16-to-u32
new file mode 100644
index 00000000..bb2e4885
--- /dev/null
+++ b/gnulib/modules/unistr/u16-to-u32
@@ -0,0 +1,24 @@
+Description:
+Convert UTF-16 string to UTF-32 string.
+
+Files:
+lib/unistr/u16-to-u32.c
+
+Depends-on:
+unistr/base
+unistr/u16-mbtoucr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-to-u32.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-to-u32-tests b/gnulib/modules/unistr/u16-to-u32-tests
new file mode 100644
index 00000000..c2d4ab75
--- /dev/null
+++ b/gnulib/modules/unistr/u16-to-u32-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-to-u32.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-to-u32
+check_PROGRAMS += test-u16-to-u32
+test_u16_to_u32_SOURCES = unistr/test-u16-to-u32.c
diff --git a/gnulib/modules/unistr/u16-to-u8 b/gnulib/modules/unistr/u16-to-u8
new file mode 100644
index 00000000..a9bd312b
--- /dev/null
+++ b/gnulib/modules/unistr/u16-to-u8
@@ -0,0 +1,25 @@
+Description:
+Convert UTF-16 string to UTF-8 string.
+
+Files:
+lib/unistr/u16-to-u8.c
+
+Depends-on:
+unistr/base
+unistr/u16-mbtoucr
+unistr/u8-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u16-to-u8.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-to-u8-tests b/gnulib/modules/unistr/u16-to-u8-tests
new file mode 100644
index 00000000..5b73be8c
--- /dev/null
+++ b/gnulib/modules/unistr/u16-to-u8-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u16-to-u8.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-to-u8
+check_PROGRAMS += test-u16-to-u8
+test_u16_to_u8_SOURCES = unistr/test-u16-to-u8.c
diff --git a/gnulib/modules/unistr/u16-uctomb b/gnulib/modules/unistr/u16-uctomb
new file mode 100644
index 00000000..8c14f2e3
--- /dev/null
+++ b/gnulib/modules/unistr/u16-uctomb
@@ -0,0 +1,25 @@
+Description:
+Store a character in UTF-16 string.
+
+Files:
+lib/unistr/u16-uctomb.c
+lib/unistr/u16-uctomb-aux.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u16-uctomb])
+
+Makefile.am:
+lib_SOURCES += unistr/u16-uctomb.c unistr/u16-uctomb-aux.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u16-uctomb-tests b/gnulib/modules/unistr/u16-uctomb-tests
new file mode 100644
index 00000000..7827020a
--- /dev/null
+++ b/gnulib/modules/unistr/u16-uctomb-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u16-uctomb.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-uctomb
+check_PROGRAMS += test-u16-uctomb
+test_u16_uctomb_SOURCES = unistr/test-u16-uctomb.c
diff --git a/gnulib/modules/unistr/u32-check b/gnulib/modules/unistr/u32-check
new file mode 100644
index 00000000..030286d6
--- /dev/null
+++ b/gnulib/modules/unistr/u32-check
@@ -0,0 +1,23 @@
+Description:
+Check UTF-32 string.
+
+Files:
+lib/unistr/u32-check.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-check.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-check-tests b/gnulib/modules/unistr/u32-check-tests
new file mode 100644
index 00000000..1dee21c8
--- /dev/null
+++ b/gnulib/modules/unistr/u32-check-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-check.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-check
+check_PROGRAMS += test-u32-check
+test_u32_check_SOURCES = unistr/test-u32-check.c
diff --git a/gnulib/modules/unistr/u32-chr b/gnulib/modules/unistr/u32-chr
new file mode 100644
index 00000000..101c1b72
--- /dev/null
+++ b/gnulib/modules/unistr/u32-chr
@@ -0,0 +1,23 @@
+Description:
+Search character in piece of UTF-32 string.
+
+Files:
+lib/unistr/u32-chr.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-chr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-chr-tests b/gnulib/modules/unistr/u32-chr-tests
new file mode 100644
index 00000000..beca859d
--- /dev/null
+++ b/gnulib/modules/unistr/u32-chr-tests
@@ -0,0 +1,21 @@
+Files:
+tests/unistr/test-u32-chr.c
+tests/unistr/test-chr.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+unistr/u32-set
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u32-chr
+check_PROGRAMS += test-u32-chr
+test_u32_chr_SOURCES = unistr/test-u32-chr.c
diff --git a/gnulib/modules/unistr/u32-cmp b/gnulib/modules/unistr/u32-cmp
new file mode 100644
index 00000000..594b445d
--- /dev/null
+++ b/gnulib/modules/unistr/u32-cmp
@@ -0,0 +1,23 @@
+Description:
+Compare pieces of UTF-32 strings.
+
+Files:
+lib/unistr/u32-cmp.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-cmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-cmp-tests b/gnulib/modules/unistr/u32-cmp-tests
new file mode 100644
index 00000000..26dca1f4
--- /dev/null
+++ b/gnulib/modules/unistr/u32-cmp-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u32-cmp.c
+tests/unistr/test-cmp.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u32-cmp
+check_PROGRAMS += test-u32-cmp
+test_u32_cmp_SOURCES = unistr/test-u32-cmp.c
diff --git a/gnulib/modules/unistr/u32-cmp2 b/gnulib/modules/unistr/u32-cmp2
new file mode 100644
index 00000000..a65872b7
--- /dev/null
+++ b/gnulib/modules/unistr/u32-cmp2
@@ -0,0 +1,26 @@
+Description:
+Compare pieces of UTF-32 strings with possibly different lengths.
+
+Files:
+lib/unistr/u32-cmp2.c
+lib/unistr/u-cmp2.h
+
+Depends-on:
+unistr/base
+unistr/u32-cmp
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-cmp2.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-cmp2-tests b/gnulib/modules/unistr/u32-cmp2-tests
new file mode 100644
index 00000000..f2d19abb
--- /dev/null
+++ b/gnulib/modules/unistr/u32-cmp2-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-cmp2.c
+tests/unistr/test-cmp2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-cmp2
+check_PROGRAMS += test-u32-cmp2
+test_u32_cmp2_SOURCES = unistr/test-u32-cmp2.c
diff --git a/gnulib/modules/unistr/u32-cpy b/gnulib/modules/unistr/u32-cpy
new file mode 100644
index 00000000..97ae099f
--- /dev/null
+++ b/gnulib/modules/unistr/u32-cpy
@@ -0,0 +1,24 @@
+Description:
+Copy piece of UTF-32 string.
+
+Files:
+lib/unistr/u32-cpy.c
+lib/unistr/u-cpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-cpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-cpy-alloc b/gnulib/modules/unistr/u32-cpy-alloc
new file mode 100644
index 00000000..d6dd635a
--- /dev/null
+++ b/gnulib/modules/unistr/u32-cpy-alloc
@@ -0,0 +1,25 @@
+Description:
+Copy piece of UTF-32 string.
+
+Files:
+lib/unistr/u32-cpy-alloc.c
+lib/unistr/u-cpy-alloc.h
+
+Depends-on:
+unistr/base
+malloc-posix
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-cpy-alloc.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-cpy-alloc-tests b/gnulib/modules/unistr/u32-cpy-alloc-tests
new file mode 100644
index 00000000..14e9869b
--- /dev/null
+++ b/gnulib/modules/unistr/u32-cpy-alloc-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-cpy-alloc.c
+tests/unistr/test-cpy-alloc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-cpy-alloc
+check_PROGRAMS += test-u32-cpy-alloc
+test_u32_cpy_alloc_SOURCES = unistr/test-u32-cpy-alloc.c
diff --git a/gnulib/modules/unistr/u32-cpy-tests b/gnulib/modules/unistr/u32-cpy-tests
new file mode 100644
index 00000000..abe0b7f7
--- /dev/null
+++ b/gnulib/modules/unistr/u32-cpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-cpy.c
+tests/unistr/test-cpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-cpy
+check_PROGRAMS += test-u32-cpy
+test_u32_cpy_SOURCES = unistr/test-u32-cpy.c
diff --git a/gnulib/modules/unistr/u32-endswith b/gnulib/modules/unistr/u32-endswith
new file mode 100644
index 00000000..0ba7248f
--- /dev/null
+++ b/gnulib/modules/unistr/u32-endswith
@@ -0,0 +1,26 @@
+Description:
+Substring test for UTF-32 strings.
+
+Files:
+lib/unistr/u32-endswith.c
+lib/unistr/u-endswith.h
+
+Depends-on:
+unistr/base
+unistr/u32-strlen
+unistr/u32-cmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-endswith.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-mblen b/gnulib/modules/unistr/u32-mblen
new file mode 100644
index 00000000..eb28b559
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mblen
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-32 string.
+
+Files:
+lib/unistr/u32-mblen.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-mblen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-mblen-tests b/gnulib/modules/unistr/u32-mblen-tests
new file mode 100644
index 00000000..0657812b
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mblen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-mblen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-mblen
+check_PROGRAMS += test-u32-mblen
+test_u32_mblen_SOURCES = unistr/test-u32-mblen.c
diff --git a/gnulib/modules/unistr/u32-mbsnlen b/gnulib/modules/unistr/u32-mbsnlen
new file mode 100644
index 00000000..8484d7f4
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mbsnlen
@@ -0,0 +1,23 @@
+Description:
+Count characters in UTF-32 string.
+
+Files:
+lib/unistr/u32-mbsnlen.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-mbsnlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-mbsnlen-tests b/gnulib/modules/unistr/u32-mbsnlen-tests
new file mode 100644
index 00000000..12c1d155
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mbsnlen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-mbsnlen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-mbsnlen
+check_PROGRAMS += test-u32-mbsnlen
+test_u32_mbsnlen_SOURCES = unistr/test-u32-mbsnlen.c
diff --git a/gnulib/modules/unistr/u32-mbtouc b/gnulib/modules/unistr/u32-mbtouc
new file mode 100644
index 00000000..35c33c1f
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mbtouc
@@ -0,0 +1,24 @@
+Description:
+Look at first character in UTF-32 string.
+
+Files:
+lib/unistr/u32-mbtouc.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u32-mbtouc])
+
+Makefile.am:
+lib_SOURCES += unistr/u32-mbtouc.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-mbtouc-tests b/gnulib/modules/unistr/u32-mbtouc-tests
new file mode 100644
index 00000000..5345b947
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mbtouc-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-mbtouc.c
+tests/unistr/test-u32-mbtouc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-mbtouc
+check_PROGRAMS += test-u32-mbtouc
+test_u32_mbtouc_SOURCES = unistr/test-u32-mbtouc.c
diff --git a/gnulib/modules/unistr/u32-mbtouc-unsafe b/gnulib/modules/unistr/u32-mbtouc-unsafe
new file mode 100644
index 00000000..94d25a16
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mbtouc-unsafe
@@ -0,0 +1,24 @@
+Description:
+Look at first character in UTF-32 string.
+
+Files:
+lib/unistr/u32-mbtouc-unsafe.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u32-mbtouc-unsafe])
+
+Makefile.am:
+lib_SOURCES += unistr/u32-mbtouc-unsafe.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-mbtouc-unsafe-tests b/gnulib/modules/unistr/u32-mbtouc-unsafe-tests
new file mode 100644
index 00000000..fda26ae9
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mbtouc-unsafe-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-mbtouc-unsafe.c
+tests/unistr/test-u32-mbtouc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-mbtouc-unsafe
+check_PROGRAMS += test-u32-mbtouc-unsafe
+test_u32_mbtouc_unsafe_SOURCES = unistr/test-u32-mbtouc-unsafe.c
diff --git a/gnulib/modules/unistr/u32-mbtoucr b/gnulib/modules/unistr/u32-mbtoucr
new file mode 100644
index 00000000..37493b71
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mbtoucr
@@ -0,0 +1,24 @@
+Description:
+Look at first character in UTF-32 string, returning an error code upon failure.
+
+Files:
+lib/unistr/u32-mbtoucr.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u32-mbtoucr])
+
+Makefile.am:
+lib_SOURCES += unistr/u32-mbtoucr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-mbtoucr-tests b/gnulib/modules/unistr/u32-mbtoucr-tests
new file mode 100644
index 00000000..df5c6bfe
--- /dev/null
+++ b/gnulib/modules/unistr/u32-mbtoucr-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-mbtoucr.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-mbtoucr
+check_PROGRAMS += test-u32-mbtoucr
+test_u32_mbtoucr_SOURCES = unistr/test-u32-mbtoucr.c
diff --git a/gnulib/modules/unistr/u32-move b/gnulib/modules/unistr/u32-move
new file mode 100644
index 00000000..2cc237bd
--- /dev/null
+++ b/gnulib/modules/unistr/u32-move
@@ -0,0 +1,25 @@
+Description:
+Copy piece of UTF-32 string.
+
+Files:
+lib/unistr/u32-move.c
+lib/unistr/u-move.h
+
+Depends-on:
+unistr/base
+memmove
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-move.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-move-tests b/gnulib/modules/unistr/u32-move-tests
new file mode 100644
index 00000000..d999af6e
--- /dev/null
+++ b/gnulib/modules/unistr/u32-move-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-move.c
+tests/unistr/test-move.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-move
+check_PROGRAMS += test-u32-move
+test_u32_move_SOURCES = unistr/test-u32-move.c
diff --git a/gnulib/modules/unistr/u32-next b/gnulib/modules/unistr/u32-next
new file mode 100644
index 00000000..c45e941e
--- /dev/null
+++ b/gnulib/modules/unistr/u32-next
@@ -0,0 +1,24 @@
+Description:
+Iterate over next character in UTF-32 string.
+
+Files:
+lib/unistr/u32-next.c
+
+Depends-on:
+unistr/base
+unistr/u32-strmbtouc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-next.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-next-tests b/gnulib/modules/unistr/u32-next-tests
new file mode 100644
index 00000000..eed2b23b
--- /dev/null
+++ b/gnulib/modules/unistr/u32-next-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-next.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-next
+check_PROGRAMS += test-u32-next
+test_u32_next_SOURCES = unistr/test-u32-next.c
diff --git a/gnulib/modules/unistr/u32-prev b/gnulib/modules/unistr/u32-prev
new file mode 100644
index 00000000..837e4a2e
--- /dev/null
+++ b/gnulib/modules/unistr/u32-prev
@@ -0,0 +1,23 @@
+Description:
+Iterate over previous character in UTF-32 string.
+
+Files:
+lib/unistr/u32-prev.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-prev.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-prev-tests b/gnulib/modules/unistr/u32-prev-tests
new file mode 100644
index 00000000..6cc8695e
--- /dev/null
+++ b/gnulib/modules/unistr/u32-prev-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-prev.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-prev
+check_PROGRAMS += test-u32-prev
+test_u32_prev_SOURCES = unistr/test-u32-prev.c
diff --git a/gnulib/modules/unistr/u32-set b/gnulib/modules/unistr/u32-set
new file mode 100644
index 00000000..a23cdef4
--- /dev/null
+++ b/gnulib/modules/unistr/u32-set
@@ -0,0 +1,24 @@
+Description:
+Fill UTF-32 string.
+
+Files:
+lib/unistr/u32-set.c
+lib/unistr/u-set.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-set.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-set-tests b/gnulib/modules/unistr/u32-set-tests
new file mode 100644
index 00000000..ddd35e95
--- /dev/null
+++ b/gnulib/modules/unistr/u32-set-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-set.c
+tests/unistr/test-set.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-set
+check_PROGRAMS += test-u32-set
+test_u32_set_SOURCES = unistr/test-u32-set.c
diff --git a/gnulib/modules/unistr/u32-startswith b/gnulib/modules/unistr/u32-startswith
new file mode 100644
index 00000000..6d3f554a
--- /dev/null
+++ b/gnulib/modules/unistr/u32-startswith
@@ -0,0 +1,24 @@
+Description:
+Substring test for UTF-32 strings.
+
+Files:
+lib/unistr/u32-startswith.c
+lib/unistr/u-startswith.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-startswith.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-stpcpy b/gnulib/modules/unistr/u32-stpcpy
new file mode 100644
index 00000000..96fe2a2d
--- /dev/null
+++ b/gnulib/modules/unistr/u32-stpcpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-32 string.
+
+Files:
+lib/unistr/u32-stpcpy.c
+lib/unistr/u-stpcpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-stpcpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-stpcpy-tests b/gnulib/modules/unistr/u32-stpcpy-tests
new file mode 100644
index 00000000..6caf032b
--- /dev/null
+++ b/gnulib/modules/unistr/u32-stpcpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-stpcpy.c
+tests/unistr/test-stpcpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-stpcpy
+check_PROGRAMS += test-u32-stpcpy
+test_u32_stpcpy_SOURCES = unistr/test-u32-stpcpy.c
diff --git a/gnulib/modules/unistr/u32-stpncpy b/gnulib/modules/unistr/u32-stpncpy
new file mode 100644
index 00000000..0fc4f0c5
--- /dev/null
+++ b/gnulib/modules/unistr/u32-stpncpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-32 string.
+
+Files:
+lib/unistr/u32-stpncpy.c
+lib/unistr/u-stpncpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-stpncpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-stpncpy-tests b/gnulib/modules/unistr/u32-stpncpy-tests
new file mode 100644
index 00000000..5b9c88f0
--- /dev/null
+++ b/gnulib/modules/unistr/u32-stpncpy-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u32-stpncpy.c
+tests/unistr/test-stpncpy.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u32-stpncpy
+check_PROGRAMS += test-u32-stpncpy
+test_u32_stpncpy_SOURCES = unistr/test-u32-stpncpy.c
diff --git a/gnulib/modules/unistr/u32-strcat b/gnulib/modules/unistr/u32-strcat
new file mode 100644
index 00000000..0ca908af
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcat
@@ -0,0 +1,25 @@
+Description:
+Concatenate UTF-32 strings.
+
+Files:
+lib/unistr/u32-strcat.c
+lib/unistr/u-strcat.h
+
+Depends-on:
+unistr/base
+unistr/u32-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strcat.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strcat-tests b/gnulib/modules/unistr/u32-strcat-tests
new file mode 100644
index 00000000..bc8b9c81
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcat-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-strcat.c
+tests/unistr/test-strcat.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strcat
+check_PROGRAMS += test-u32-strcat
+test_u32_strcat_SOURCES = unistr/test-u32-strcat.c
diff --git a/gnulib/modules/unistr/u32-strchr b/gnulib/modules/unistr/u32-strchr
new file mode 100644
index 00000000..01f0580c
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strchr
@@ -0,0 +1,23 @@
+Description:
+Search character in UTF-32 string.
+
+Files:
+lib/unistr/u32-strchr.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strchr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strcmp b/gnulib/modules/unistr/u32-strcmp
new file mode 100644
index 00000000..e3c7825d
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcmp
@@ -0,0 +1,23 @@
+Description:
+Compare UTF-32 strings.
+
+Files:
+lib/unistr/u32-strcmp.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strcmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strcmp-tests b/gnulib/modules/unistr/u32-strcmp-tests
new file mode 100644
index 00000000..0ffef406
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcmp-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistr/test-u32-strcmp.c
+tests/unistr/test-u32-strcmp.h
+tests/unistr/test-strcmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strcmp
+check_PROGRAMS += test-u32-strcmp
+test_u32_strcmp_SOURCES = unistr/test-u32-strcmp.c
diff --git a/gnulib/modules/unistr/u32-strcoll b/gnulib/modules/unistr/u32-strcoll
new file mode 100644
index 00000000..03904ef5
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcoll
@@ -0,0 +1,26 @@
+Description:
+Compare UTF-32 strings using the collation rules of the current locale.
+
+Files:
+lib/unistr/u32-strcoll.c
+lib/unistr/u-strcoll.h
+
+Depends-on:
+unistr/base
+unistr/u32-strcmp
+uniconv/u32-strconv-to-locale
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strcoll.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strcoll-tests b/gnulib/modules/unistr/u32-strcoll-tests
new file mode 100644
index 00000000..962ca4b9
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcoll-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistr/test-u32-strcoll.c
+tests/unistr/test-u32-strcmp.h
+tests/unistr/test-strcmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strcoll
+check_PROGRAMS += test-u32-strcoll
+test_u32_strcoll_SOURCES = unistr/test-u32-strcoll.c
diff --git a/gnulib/modules/unistr/u32-strcpy b/gnulib/modules/unistr/u32-strcpy
new file mode 100644
index 00000000..63d56b4b
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-32 string.
+
+Files:
+lib/unistr/u32-strcpy.c
+lib/unistr/u-strcpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strcpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strcpy-tests b/gnulib/modules/unistr/u32-strcpy-tests
new file mode 100644
index 00000000..2e6a30e3
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-strcpy.c
+tests/unistr/test-strcpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strcpy
+check_PROGRAMS += test-u32-strcpy
+test_u32_strcpy_SOURCES = unistr/test-u32-strcpy.c
diff --git a/gnulib/modules/unistr/u32-strcspn b/gnulib/modules/unistr/u32-strcspn
new file mode 100644
index 00000000..e1a3ba26
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strcspn
@@ -0,0 +1,25 @@
+Description:
+Search for some characters in UTF-32 string.
+
+Files:
+lib/unistr/u32-strcspn.c
+
+Depends-on:
+unistr/base
+unistr/u32-strlen
+unistr/u32-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strcspn.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strdup b/gnulib/modules/unistr/u32-strdup
new file mode 100644
index 00000000..2a59d253
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strdup
@@ -0,0 +1,25 @@
+Description:
+Copy UTF-32 string.
+
+Files:
+lib/unistr/u32-strdup.c
+lib/unistr/u-strdup.h
+
+Depends-on:
+unistr/base
+unistr/u32-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strdup.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strdup-tests b/gnulib/modules/unistr/u32-strdup-tests
new file mode 100644
index 00000000..2e6e8a63
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strdup-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-strdup.c
+tests/unistr/test-strdup.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strdup
+check_PROGRAMS += test-u32-strdup
+test_u32_strdup_SOURCES = unistr/test-u32-strdup.c
diff --git a/gnulib/modules/unistr/u32-strlen b/gnulib/modules/unistr/u32-strlen
new file mode 100644
index 00000000..2e99f4b7
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strlen
@@ -0,0 +1,24 @@
+Description:
+Determine length of UTF-32 string.
+
+Files:
+lib/unistr/u32-strlen.c
+lib/unistr/u-strlen.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strlen-tests b/gnulib/modules/unistr/u32-strlen-tests
new file mode 100644
index 00000000..8ffaa38d
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strlen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-strlen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strlen
+check_PROGRAMS += test-u32-strlen
+test_u32_strlen_SOURCES = unistr/test-u32-strlen.c
diff --git a/gnulib/modules/unistr/u32-strmblen b/gnulib/modules/unistr/u32-strmblen
new file mode 100644
index 00000000..744af0d2
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strmblen
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-32 string.
+
+Files:
+lib/unistr/u32-strmblen.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strmblen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strmblen-tests b/gnulib/modules/unistr/u32-strmblen-tests
new file mode 100644
index 00000000..519b2aa3
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strmblen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-strmblen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strmblen
+check_PROGRAMS += test-u32-strmblen
+test_u32_strmblen_SOURCES = unistr/test-u32-strmblen.c
diff --git a/gnulib/modules/unistr/u32-strmbtouc b/gnulib/modules/unistr/u32-strmbtouc
new file mode 100644
index 00000000..8fa5475e
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strmbtouc
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-32 string.
+
+Files:
+lib/unistr/u32-strmbtouc.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strmbtouc.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strmbtouc-tests b/gnulib/modules/unistr/u32-strmbtouc-tests
new file mode 100644
index 00000000..63d07312
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strmbtouc-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-strmbtouc.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strmbtouc
+check_PROGRAMS += test-u32-strmbtouc
+test_u32_strmbtouc_SOURCES = unistr/test-u32-strmbtouc.c
diff --git a/gnulib/modules/unistr/u32-strncat b/gnulib/modules/unistr/u32-strncat
new file mode 100644
index 00000000..74b9bedf
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strncat
@@ -0,0 +1,25 @@
+Description:
+Concatenate UTF-32 strings.
+
+Files:
+lib/unistr/u32-strncat.c
+lib/unistr/u-strncat.h
+
+Depends-on:
+unistr/base
+unistr/u32-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strncat.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strncat-tests b/gnulib/modules/unistr/u32-strncat-tests
new file mode 100644
index 00000000..8703de0a
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strncat-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u32-strncat.c
+tests/unistr/test-strncat.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u32-strncat
+check_PROGRAMS += test-u32-strncat
+test_u32_strncat_SOURCES = unistr/test-u32-strncat.c
diff --git a/gnulib/modules/unistr/u32-strncmp b/gnulib/modules/unistr/u32-strncmp
new file mode 100644
index 00000000..036d71e9
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strncmp
@@ -0,0 +1,23 @@
+Description:
+Compare UTF-32 strings.
+
+Files:
+lib/unistr/u32-strncmp.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strncmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strncmp-tests b/gnulib/modules/unistr/u32-strncmp-tests
new file mode 100644
index 00000000..0797984a
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strncmp-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-strncmp.c
+tests/unistr/test-strncmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strncmp
+check_PROGRAMS += test-u32-strncmp
+test_u32_strncmp_SOURCES = unistr/test-u32-strncmp.c
diff --git a/gnulib/modules/unistr/u32-strncpy b/gnulib/modules/unistr/u32-strncpy
new file mode 100644
index 00000000..6b623167
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strncpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-32 string.
+
+Files:
+lib/unistr/u32-strncpy.c
+lib/unistr/u-strncpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strncpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strncpy-tests b/gnulib/modules/unistr/u32-strncpy-tests
new file mode 100644
index 00000000..3f1f0be6
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strncpy-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u32-strncpy.c
+tests/unistr/test-strncpy.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u32-strncpy
+check_PROGRAMS += test-u32-strncpy
+test_u32_strncpy_SOURCES = unistr/test-u32-strncpy.c
diff --git a/gnulib/modules/unistr/u32-strnlen b/gnulib/modules/unistr/u32-strnlen
new file mode 100644
index 00000000..8e72ba96
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strnlen
@@ -0,0 +1,24 @@
+Description:
+Determine bounded length of UTF-32 string.
+
+Files:
+lib/unistr/u32-strnlen.c
+lib/unistr/u-strnlen.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strnlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strnlen-tests b/gnulib/modules/unistr/u32-strnlen-tests
new file mode 100644
index 00000000..1687ff7e
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strnlen-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u32-strnlen.c
+tests/unistr/test-strnlen.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u32-strnlen
+check_PROGRAMS += test-u32-strnlen
+test_u32_strnlen_SOURCES = unistr/test-u32-strnlen.c
diff --git a/gnulib/modules/unistr/u32-strpbrk b/gnulib/modules/unistr/u32-strpbrk
new file mode 100644
index 00000000..9aaa96d8
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strpbrk
@@ -0,0 +1,24 @@
+Description:
+Search for some characters in UTF-32 string.
+
+Files:
+lib/unistr/u32-strpbrk.c
+
+Depends-on:
+unistr/base
+unistr/u32-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strpbrk.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strrchr b/gnulib/modules/unistr/u32-strrchr
new file mode 100644
index 00000000..4935f03f
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strrchr
@@ -0,0 +1,23 @@
+Description:
+Search character in UTF-32 string.
+
+Files:
+lib/unistr/u32-strrchr.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strrchr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strspn b/gnulib/modules/unistr/u32-strspn
new file mode 100644
index 00000000..bf0efed2
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strspn
@@ -0,0 +1,24 @@
+Description:
+Search for some characters in UTF-32 string.
+
+Files:
+lib/unistr/u32-strspn.c
+
+Depends-on:
+unistr/base
+unistr/u32-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strspn.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strstr b/gnulib/modules/unistr/u32-strstr
new file mode 100644
index 00000000..a24e6061
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strstr
@@ -0,0 +1,24 @@
+Description:
+Substring test for UTF-32 strings.
+
+Files:
+lib/unistr/u32-strstr.c
+lib/unistr/u-strstr.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strstr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-strtok b/gnulib/modules/unistr/u32-strtok
new file mode 100644
index 00000000..e338fc22
--- /dev/null
+++ b/gnulib/modules/unistr/u32-strtok
@@ -0,0 +1,26 @@
+Description:
+Tokenize UTF-32 string.
+
+Files:
+lib/unistr/u32-strtok.c
+lib/unistr/u-strtok.h
+
+Depends-on:
+unistr/base
+unistr/u32-strspn
+unistr/u32-strpbrk
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-strtok.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-to-u16 b/gnulib/modules/unistr/u32-to-u16
new file mode 100644
index 00000000..6840041c
--- /dev/null
+++ b/gnulib/modules/unistr/u32-to-u16
@@ -0,0 +1,24 @@
+Description:
+Convert UTF-32 string to UTF-16 string.
+
+Files:
+lib/unistr/u32-to-u16.c
+
+Depends-on:
+unistr/base
+unistr/u16-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-to-u16.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-to-u16-tests b/gnulib/modules/unistr/u32-to-u16-tests
new file mode 100644
index 00000000..6b10e1e9
--- /dev/null
+++ b/gnulib/modules/unistr/u32-to-u16-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-to-u16.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-to-u16
+check_PROGRAMS += test-u32-to-u16
+test_u32_to_u16_SOURCES = unistr/test-u32-to-u16.c
diff --git a/gnulib/modules/unistr/u32-to-u8 b/gnulib/modules/unistr/u32-to-u8
new file mode 100644
index 00000000..a5ace260
--- /dev/null
+++ b/gnulib/modules/unistr/u32-to-u8
@@ -0,0 +1,24 @@
+Description:
+Convert UTF-32 string to UTF-8 string.
+
+Files:
+lib/unistr/u32-to-u8.c
+
+Depends-on:
+unistr/base
+unistr/u8-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u32-to-u8.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-to-u8-tests b/gnulib/modules/unistr/u32-to-u8-tests
new file mode 100644
index 00000000..534c7494
--- /dev/null
+++ b/gnulib/modules/unistr/u32-to-u8-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u32-to-u8.c
+tests/macros.h
+
+Depends-on:
+unistr/u8-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-to-u8
+check_PROGRAMS += test-u32-to-u8
+test_u32_to_u8_SOURCES = unistr/test-u32-to-u8.c
diff --git a/gnulib/modules/unistr/u32-uctomb b/gnulib/modules/unistr/u32-uctomb
new file mode 100644
index 00000000..c81cd36b
--- /dev/null
+++ b/gnulib/modules/unistr/u32-uctomb
@@ -0,0 +1,24 @@
+Description:
+Store a character in UTF-32 string.
+
+Files:
+lib/unistr/u32-uctomb.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u32-uctomb])
+
+Makefile.am:
+lib_SOURCES += unistr/u32-uctomb.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u32-uctomb-tests b/gnulib/modules/unistr/u32-uctomb-tests
new file mode 100644
index 00000000..27e2c9ca
--- /dev/null
+++ b/gnulib/modules/unistr/u32-uctomb-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u32-uctomb.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-uctomb
+check_PROGRAMS += test-u32-uctomb
+test_u32_uctomb_SOURCES = unistr/test-u32-uctomb.c
diff --git a/gnulib/modules/unistr/u8-check b/gnulib/modules/unistr/u8-check
new file mode 100644
index 00000000..cfebaabb
--- /dev/null
+++ b/gnulib/modules/unistr/u8-check
@@ -0,0 +1,23 @@
+Description:
+Check UTF-8 string.
+
+Files:
+lib/unistr/u8-check.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-check.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-check-tests b/gnulib/modules/unistr/u8-check-tests
new file mode 100644
index 00000000..c50c8f17
--- /dev/null
+++ b/gnulib/modules/unistr/u8-check-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-check.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-check
+check_PROGRAMS += test-u8-check
+test_u8_check_SOURCES = unistr/test-u8-check.c
diff --git a/gnulib/modules/unistr/u8-chr b/gnulib/modules/unistr/u8-chr
new file mode 100644
index 00000000..b90dab04
--- /dev/null
+++ b/gnulib/modules/unistr/u8-chr
@@ -0,0 +1,24 @@
+Description:
+Search character in piece of UTF-8 string.
+
+Files:
+lib/unistr/u8-chr.c
+
+Depends-on:
+unistr/base
+unistr/u8-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-chr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-chr-tests b/gnulib/modules/unistr/u8-chr-tests
new file mode 100644
index 00000000..ecaead96
--- /dev/null
+++ b/gnulib/modules/unistr/u8-chr-tests
@@ -0,0 +1,21 @@
+Files:
+tests/unistr/test-u8-chr.c
+tests/unistr/test-chr.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+unistr/u8-set
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u8-chr
+check_PROGRAMS += test-u8-chr
+test_u8_chr_SOURCES = unistr/test-u8-chr.c
diff --git a/gnulib/modules/unistr/u8-cmp b/gnulib/modules/unistr/u8-cmp
new file mode 100644
index 00000000..c885cc8b
--- /dev/null
+++ b/gnulib/modules/unistr/u8-cmp
@@ -0,0 +1,24 @@
+Description:
+Compare pieces of UTF-8 strings.
+
+Files:
+lib/unistr/u8-cmp.c
+
+Depends-on:
+unistr/base
+memcmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-cmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-cmp-tests b/gnulib/modules/unistr/u8-cmp-tests
new file mode 100644
index 00000000..959a24e5
--- /dev/null
+++ b/gnulib/modules/unistr/u8-cmp-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u8-cmp.c
+tests/unistr/test-cmp.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u8-cmp
+check_PROGRAMS += test-u8-cmp
+test_u8_cmp_SOURCES = unistr/test-u8-cmp.c
diff --git a/gnulib/modules/unistr/u8-cmp2 b/gnulib/modules/unistr/u8-cmp2
new file mode 100644
index 00000000..9fbbc434
--- /dev/null
+++ b/gnulib/modules/unistr/u8-cmp2
@@ -0,0 +1,26 @@
+Description:
+Compare pieces of UTF-8 strings with possibly different lengths.
+
+Files:
+lib/unistr/u8-cmp2.c
+lib/unistr/u-cmp2.h
+
+Depends-on:
+unistr/base
+unistr/u8-cmp
+minmax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-cmp2.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-cmp2-tests b/gnulib/modules/unistr/u8-cmp2-tests
new file mode 100644
index 00000000..4224efd3
--- /dev/null
+++ b/gnulib/modules/unistr/u8-cmp2-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-cmp2.c
+tests/unistr/test-cmp2.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-cmp2
+check_PROGRAMS += test-u8-cmp2
+test_u8_cmp2_SOURCES = unistr/test-u8-cmp2.c
diff --git a/gnulib/modules/unistr/u8-cpy b/gnulib/modules/unistr/u8-cpy
new file mode 100644
index 00000000..3e12cd89
--- /dev/null
+++ b/gnulib/modules/unistr/u8-cpy
@@ -0,0 +1,24 @@
+Description:
+Copy piece of UTF-8 string.
+
+Files:
+lib/unistr/u8-cpy.c
+lib/unistr/u-cpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-cpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-cpy-alloc b/gnulib/modules/unistr/u8-cpy-alloc
new file mode 100644
index 00000000..735d9014
--- /dev/null
+++ b/gnulib/modules/unistr/u8-cpy-alloc
@@ -0,0 +1,25 @@
+Description:
+Copy piece of UTF-8 string.
+
+Files:
+lib/unistr/u8-cpy-alloc.c
+lib/unistr/u-cpy-alloc.h
+
+Depends-on:
+unistr/base
+malloc-posix
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-cpy-alloc.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-cpy-alloc-tests b/gnulib/modules/unistr/u8-cpy-alloc-tests
new file mode 100644
index 00000000..5f71e779
--- /dev/null
+++ b/gnulib/modules/unistr/u8-cpy-alloc-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-cpy-alloc.c
+tests/unistr/test-cpy-alloc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-cpy-alloc
+check_PROGRAMS += test-u8-cpy-alloc
+test_u8_cpy_alloc_SOURCES = unistr/test-u8-cpy-alloc.c
diff --git a/gnulib/modules/unistr/u8-cpy-tests b/gnulib/modules/unistr/u8-cpy-tests
new file mode 100644
index 00000000..59c8c67e
--- /dev/null
+++ b/gnulib/modules/unistr/u8-cpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-cpy.c
+tests/unistr/test-cpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-cpy
+check_PROGRAMS += test-u8-cpy
+test_u8_cpy_SOURCES = unistr/test-u8-cpy.c
diff --git a/gnulib/modules/unistr/u8-endswith b/gnulib/modules/unistr/u8-endswith
new file mode 100644
index 00000000..b6aa8099
--- /dev/null
+++ b/gnulib/modules/unistr/u8-endswith
@@ -0,0 +1,26 @@
+Description:
+Substring test for UTF-8 strings.
+
+Files:
+lib/unistr/u8-endswith.c
+lib/unistr/u-endswith.h
+
+Depends-on:
+unistr/base
+unistr/u8-strlen
+unistr/u8-cmp
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-endswith.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-mblen b/gnulib/modules/unistr/u8-mblen
new file mode 100644
index 00000000..d83b88ed
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mblen
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-8 string.
+
+Files:
+lib/unistr/u8-mblen.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-mblen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-mblen-tests b/gnulib/modules/unistr/u8-mblen-tests
new file mode 100644
index 00000000..14e714b8
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mblen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-mblen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-mblen
+check_PROGRAMS += test-u8-mblen
+test_u8_mblen_SOURCES = unistr/test-u8-mblen.c
diff --git a/gnulib/modules/unistr/u8-mbsnlen b/gnulib/modules/unistr/u8-mbsnlen
new file mode 100644
index 00000000..eaa6e1f5
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mbsnlen
@@ -0,0 +1,24 @@
+Description:
+Count characters in UTF-8 string.
+
+Files:
+lib/unistr/u8-mbsnlen.c
+
+Depends-on:
+unistr/base
+unistr/u8-mbtoucr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-mbsnlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-mbsnlen-tests b/gnulib/modules/unistr/u8-mbsnlen-tests
new file mode 100644
index 00000000..50b27115
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mbsnlen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-mbsnlen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-mbsnlen
+check_PROGRAMS += test-u8-mbsnlen
+test_u8_mbsnlen_SOURCES = unistr/test-u8-mbsnlen.c
diff --git a/gnulib/modules/unistr/u8-mbtouc b/gnulib/modules/unistr/u8-mbtouc
new file mode 100644
index 00000000..460dfd41
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mbtouc
@@ -0,0 +1,25 @@
+Description:
+Look at first character in UTF-8 string.
+
+Files:
+lib/unistr/u8-mbtouc.c
+lib/unistr/u8-mbtouc-aux.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u8-mbtouc])
+
+Makefile.am:
+lib_SOURCES += unistr/u8-mbtouc.c unistr/u8-mbtouc-aux.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-mbtouc-tests b/gnulib/modules/unistr/u8-mbtouc-tests
new file mode 100644
index 00000000..eedb31df
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mbtouc-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-mbtouc.c
+tests/unistr/test-u8-mbtouc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-mbtouc
+check_PROGRAMS += test-u8-mbtouc
+test_u8_mbtouc_SOURCES = unistr/test-u8-mbtouc.c
diff --git a/gnulib/modules/unistr/u8-mbtouc-unsafe b/gnulib/modules/unistr/u8-mbtouc-unsafe
new file mode 100644
index 00000000..246966ee
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mbtouc-unsafe
@@ -0,0 +1,25 @@
+Description:
+Look at first character in UTF-8 string.
+
+Files:
+lib/unistr/u8-mbtouc-unsafe.c
+lib/unistr/u8-mbtouc-unsafe-aux.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u8-mbtouc-unsafe])
+
+Makefile.am:
+lib_SOURCES += unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc-unsafe-aux.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-mbtouc-unsafe-tests b/gnulib/modules/unistr/u8-mbtouc-unsafe-tests
new file mode 100644
index 00000000..f3a84c8c
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mbtouc-unsafe-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-mbtouc-unsafe.c
+tests/unistr/test-u8-mbtouc.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-mbtouc-unsafe
+check_PROGRAMS += test-u8-mbtouc-unsafe
+test_u8_mbtouc_unsafe_SOURCES = unistr/test-u8-mbtouc-unsafe.c
diff --git a/gnulib/modules/unistr/u8-mbtoucr b/gnulib/modules/unistr/u8-mbtoucr
new file mode 100644
index 00000000..f5eadc45
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mbtoucr
@@ -0,0 +1,24 @@
+Description:
+Look at first character in UTF-8 string, returning an error code upon failure.
+
+Files:
+lib/unistr/u8-mbtoucr.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u8-mbtoucr])
+
+Makefile.am:
+lib_SOURCES += unistr/u8-mbtoucr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-mbtoucr-tests b/gnulib/modules/unistr/u8-mbtoucr-tests
new file mode 100644
index 00000000..3e64eb06
--- /dev/null
+++ b/gnulib/modules/unistr/u8-mbtoucr-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-mbtoucr.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-mbtoucr
+check_PROGRAMS += test-u8-mbtoucr
+test_u8_mbtoucr_SOURCES = unistr/test-u8-mbtoucr.c
diff --git a/gnulib/modules/unistr/u8-move b/gnulib/modules/unistr/u8-move
new file mode 100644
index 00000000..24032361
--- /dev/null
+++ b/gnulib/modules/unistr/u8-move
@@ -0,0 +1,25 @@
+Description:
+Copy piece of UTF-8 string.
+
+Files:
+lib/unistr/u8-move.c
+lib/unistr/u-move.h
+
+Depends-on:
+unistr/base
+memmove
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-move.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-move-tests b/gnulib/modules/unistr/u8-move-tests
new file mode 100644
index 00000000..9a0744cd
--- /dev/null
+++ b/gnulib/modules/unistr/u8-move-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-move.c
+tests/unistr/test-move.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-move
+check_PROGRAMS += test-u8-move
+test_u8_move_SOURCES = unistr/test-u8-move.c
diff --git a/gnulib/modules/unistr/u8-next b/gnulib/modules/unistr/u8-next
new file mode 100644
index 00000000..783fb446
--- /dev/null
+++ b/gnulib/modules/unistr/u8-next
@@ -0,0 +1,24 @@
+Description:
+Iterate over next character in UTF-8 string.
+
+Files:
+lib/unistr/u8-next.c
+
+Depends-on:
+unistr/base
+unistr/u8-strmbtouc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-next.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-next-tests b/gnulib/modules/unistr/u8-next-tests
new file mode 100644
index 00000000..1840af95
--- /dev/null
+++ b/gnulib/modules/unistr/u8-next-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-next.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-next
+check_PROGRAMS += test-u8-next
+test_u8_next_SOURCES = unistr/test-u8-next.c
diff --git a/gnulib/modules/unistr/u8-prev b/gnulib/modules/unistr/u8-prev
new file mode 100644
index 00000000..372b416e
--- /dev/null
+++ b/gnulib/modules/unistr/u8-prev
@@ -0,0 +1,23 @@
+Description:
+Iterate over previous character in UTF-8 string.
+
+Files:
+lib/unistr/u8-prev.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-prev.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-prev-tests b/gnulib/modules/unistr/u8-prev-tests
new file mode 100644
index 00000000..a6527422
--- /dev/null
+++ b/gnulib/modules/unistr/u8-prev-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-prev.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-prev
+check_PROGRAMS += test-u8-prev
+test_u8_prev_SOURCES = unistr/test-u8-prev.c
diff --git a/gnulib/modules/unistr/u8-set b/gnulib/modules/unistr/u8-set
new file mode 100644
index 00000000..d052c22d
--- /dev/null
+++ b/gnulib/modules/unistr/u8-set
@@ -0,0 +1,23 @@
+Description:
+Fill UTF-8 string.
+
+Files:
+lib/unistr/u8-set.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-set.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-set-tests b/gnulib/modules/unistr/u8-set-tests
new file mode 100644
index 00000000..a5fbb203
--- /dev/null
+++ b/gnulib/modules/unistr/u8-set-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-set.c
+tests/unistr/test-set.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-set
+check_PROGRAMS += test-u8-set
+test_u8_set_SOURCES = unistr/test-u8-set.c
diff --git a/gnulib/modules/unistr/u8-startswith b/gnulib/modules/unistr/u8-startswith
new file mode 100644
index 00000000..b0fdab95
--- /dev/null
+++ b/gnulib/modules/unistr/u8-startswith
@@ -0,0 +1,24 @@
+Description:
+Substring test for UTF-8 strings.
+
+Files:
+lib/unistr/u8-startswith.c
+lib/unistr/u-startswith.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-startswith.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-stpcpy b/gnulib/modules/unistr/u8-stpcpy
new file mode 100644
index 00000000..635f7730
--- /dev/null
+++ b/gnulib/modules/unistr/u8-stpcpy
@@ -0,0 +1,25 @@
+Description:
+Copy UTF-8 string.
+
+Files:
+lib/unistr/u8-stpcpy.c
+lib/unistr/u-stpcpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([stpcpy])
+
+Makefile.am:
+lib_SOURCES += unistr/u8-stpcpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-stpcpy-tests b/gnulib/modules/unistr/u8-stpcpy-tests
new file mode 100644
index 00000000..89f7c6c8
--- /dev/null
+++ b/gnulib/modules/unistr/u8-stpcpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-stpcpy.c
+tests/unistr/test-stpcpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-stpcpy
+check_PROGRAMS += test-u8-stpcpy
+test_u8_stpcpy_SOURCES = unistr/test-u8-stpcpy.c
diff --git a/gnulib/modules/unistr/u8-stpncpy b/gnulib/modules/unistr/u8-stpncpy
new file mode 100644
index 00000000..3adb54ca
--- /dev/null
+++ b/gnulib/modules/unistr/u8-stpncpy
@@ -0,0 +1,24 @@
+Description:
+Copy UTF-8 string.
+
+Files:
+lib/unistr/u8-stpncpy.c
+lib/unistr/u-stpncpy.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-stpncpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-stpncpy-tests b/gnulib/modules/unistr/u8-stpncpy-tests
new file mode 100644
index 00000000..ab5899cd
--- /dev/null
+++ b/gnulib/modules/unistr/u8-stpncpy-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u8-stpncpy.c
+tests/unistr/test-stpncpy.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u8-stpncpy
+check_PROGRAMS += test-u8-stpncpy
+test_u8_stpncpy_SOURCES = unistr/test-u8-stpncpy.c
diff --git a/gnulib/modules/unistr/u8-strcat b/gnulib/modules/unistr/u8-strcat
new file mode 100644
index 00000000..a9faa746
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcat
@@ -0,0 +1,23 @@
+Description:
+Concatenate UTF-8 strings.
+
+Files:
+lib/unistr/u8-strcat.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strcat.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strcat-tests b/gnulib/modules/unistr/u8-strcat-tests
new file mode 100644
index 00000000..84635c74
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcat-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-strcat.c
+tests/unistr/test-strcat.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strcat
+check_PROGRAMS += test-u8-strcat
+test_u8_strcat_SOURCES = unistr/test-u8-strcat.c
diff --git a/gnulib/modules/unistr/u8-strchr b/gnulib/modules/unistr/u8-strchr
new file mode 100644
index 00000000..a025b905
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strchr
@@ -0,0 +1,24 @@
+Description:
+Search character in UTF-8 string.
+
+Files:
+lib/unistr/u8-strchr.c
+
+Depends-on:
+unistr/base
+unistr/u8-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strchr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strcmp b/gnulib/modules/unistr/u8-strcmp
new file mode 100644
index 00000000..05248489
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcmp
@@ -0,0 +1,23 @@
+Description:
+Compare UTF-8 strings.
+
+Files:
+lib/unistr/u8-strcmp.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strcmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strcmp-tests b/gnulib/modules/unistr/u8-strcmp-tests
new file mode 100644
index 00000000..7b8bc173
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcmp-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistr/test-u8-strcmp.c
+tests/unistr/test-u8-strcmp.h
+tests/unistr/test-strcmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strcmp
+check_PROGRAMS += test-u8-strcmp
+test_u8_strcmp_SOURCES = unistr/test-u8-strcmp.c
diff --git a/gnulib/modules/unistr/u8-strcoll b/gnulib/modules/unistr/u8-strcoll
new file mode 100644
index 00000000..385c388a
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcoll
@@ -0,0 +1,26 @@
+Description:
+Compare UTF-8 strings using the collation rules of the current locale.
+
+Files:
+lib/unistr/u8-strcoll.c
+lib/unistr/u-strcoll.h
+
+Depends-on:
+unistr/base
+unistr/u8-strcmp
+uniconv/u8-strconv-to-locale
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strcoll.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strcoll-tests b/gnulib/modules/unistr/u8-strcoll-tests
new file mode 100644
index 00000000..5470f9a9
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcoll-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unistr/test-u8-strcoll.c
+tests/unistr/test-u8-strcmp.h
+tests/unistr/test-strcmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strcoll
+check_PROGRAMS += test-u8-strcoll
+test_u8_strcoll_SOURCES = unistr/test-u8-strcoll.c
diff --git a/gnulib/modules/unistr/u8-strcpy b/gnulib/modules/unistr/u8-strcpy
new file mode 100644
index 00000000..def5a592
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcpy
@@ -0,0 +1,23 @@
+Description:
+Copy UTF-8 string.
+
+Files:
+lib/unistr/u8-strcpy.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strcpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strcpy-tests b/gnulib/modules/unistr/u8-strcpy-tests
new file mode 100644
index 00000000..84f5413c
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcpy-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-strcpy.c
+tests/unistr/test-strcpy.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strcpy
+check_PROGRAMS += test-u8-strcpy
+test_u8_strcpy_SOURCES = unistr/test-u8-strcpy.c
diff --git a/gnulib/modules/unistr/u8-strcspn b/gnulib/modules/unistr/u8-strcspn
new file mode 100644
index 00000000..95c487b6
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strcspn
@@ -0,0 +1,27 @@
+Description:
+Search for some characters in UTF-8 string.
+
+Files:
+lib/unistr/u8-strcspn.c
+lib/unistr/u-strcspn.h
+
+Depends-on:
+unistr/base
+unistr/u8-strlen
+unistr/u8-strmbtouc
+unistr/u8-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strcspn.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strdup b/gnulib/modules/unistr/u8-strdup
new file mode 100644
index 00000000..8ebd4299
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strdup
@@ -0,0 +1,26 @@
+Description:
+Copy UTF-8 string.
+
+Files:
+lib/unistr/u8-strdup.c
+lib/unistr/u-strdup.h
+
+Depends-on:
+unistr/base
+unistr/u8-strlen
+
+configure.ac:
+AC_CHECK_FUNCS_ONCE([strdup])
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strdup.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strdup-tests b/gnulib/modules/unistr/u8-strdup-tests
new file mode 100644
index 00000000..e5477b71
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strdup-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-strdup.c
+tests/unistr/test-strdup.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strdup
+check_PROGRAMS += test-u8-strdup
+test_u8_strdup_SOURCES = unistr/test-u8-strdup.c
diff --git a/gnulib/modules/unistr/u8-strlen b/gnulib/modules/unistr/u8-strlen
new file mode 100644
index 00000000..52dec55f
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strlen
@@ -0,0 +1,23 @@
+Description:
+Determine length of UTF-8 string.
+
+Files:
+lib/unistr/u8-strlen.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strlen-tests b/gnulib/modules/unistr/u8-strlen-tests
new file mode 100644
index 00000000..16bf677f
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strlen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-strlen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strlen
+check_PROGRAMS += test-u8-strlen
+test_u8_strlen_SOURCES = unistr/test-u8-strlen.c
diff --git a/gnulib/modules/unistr/u8-strmblen b/gnulib/modules/unistr/u8-strmblen
new file mode 100644
index 00000000..31945fce
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strmblen
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-8 string.
+
+Files:
+lib/unistr/u8-strmblen.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strmblen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strmblen-tests b/gnulib/modules/unistr/u8-strmblen-tests
new file mode 100644
index 00000000..6123520e
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strmblen-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-strmblen.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strmblen
+check_PROGRAMS += test-u8-strmblen
+test_u8_strmblen_SOURCES = unistr/test-u8-strmblen.c
diff --git a/gnulib/modules/unistr/u8-strmbtouc b/gnulib/modules/unistr/u8-strmbtouc
new file mode 100644
index 00000000..c62dde4b
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strmbtouc
@@ -0,0 +1,23 @@
+Description:
+Look at first character in UTF-8 string.
+
+Files:
+lib/unistr/u8-strmbtouc.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strmbtouc.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strmbtouc-tests b/gnulib/modules/unistr/u8-strmbtouc-tests
new file mode 100644
index 00000000..2150a922
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strmbtouc-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-strmbtouc.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strmbtouc
+check_PROGRAMS += test-u8-strmbtouc
+test_u8_strmbtouc_SOURCES = unistr/test-u8-strmbtouc.c
diff --git a/gnulib/modules/unistr/u8-strncat b/gnulib/modules/unistr/u8-strncat
new file mode 100644
index 00000000..5bc0c92e
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strncat
@@ -0,0 +1,23 @@
+Description:
+Concatenate UTF-8 strings.
+
+Files:
+lib/unistr/u8-strncat.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strncat.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strncat-tests b/gnulib/modules/unistr/u8-strncat-tests
new file mode 100644
index 00000000..16372122
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strncat-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u8-strncat.c
+tests/unistr/test-strncat.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u8-strncat
+check_PROGRAMS += test-u8-strncat
+test_u8_strncat_SOURCES = unistr/test-u8-strncat.c
diff --git a/gnulib/modules/unistr/u8-strncmp b/gnulib/modules/unistr/u8-strncmp
new file mode 100644
index 00000000..a4bc8d07
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strncmp
@@ -0,0 +1,23 @@
+Description:
+Compare UTF-8 strings.
+
+Files:
+lib/unistr/u8-strncmp.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strncmp.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strncmp-tests b/gnulib/modules/unistr/u8-strncmp-tests
new file mode 100644
index 00000000..cadb045a
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strncmp-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-strncmp.c
+tests/unistr/test-strncmp.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strncmp
+check_PROGRAMS += test-u8-strncmp
+test_u8_strncmp_SOURCES = unistr/test-u8-strncmp.c
diff --git a/gnulib/modules/unistr/u8-strncpy b/gnulib/modules/unistr/u8-strncpy
new file mode 100644
index 00000000..6f18e6ac
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strncpy
@@ -0,0 +1,23 @@
+Description:
+Copy UTF-8 string.
+
+Files:
+lib/unistr/u8-strncpy.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strncpy.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strncpy-tests b/gnulib/modules/unistr/u8-strncpy-tests
new file mode 100644
index 00000000..212c1435
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strncpy-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u8-strncpy.c
+tests/unistr/test-strncpy.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u8-strncpy
+check_PROGRAMS += test-u8-strncpy
+test_u8_strncpy_SOURCES = unistr/test-u8-strncpy.c
diff --git a/gnulib/modules/unistr/u8-strnlen b/gnulib/modules/unistr/u8-strnlen
new file mode 100644
index 00000000..d3fa3732
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strnlen
@@ -0,0 +1,24 @@
+Description:
+Determine bounded length of UTF-8 string.
+
+Files:
+lib/unistr/u8-strnlen.c
+lib/unistr/u-strnlen.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strnlen.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strnlen-tests b/gnulib/modules/unistr/u8-strnlen-tests
new file mode 100644
index 00000000..a60d2b91
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strnlen-tests
@@ -0,0 +1,20 @@
+Files:
+tests/unistr/test-u8-strnlen.c
+tests/unistr/test-strnlen.h
+tests/zerosize-ptr.h
+tests/macros.h
+m4/mmap-anon.m4
+
+Depends-on:
+extensions
+getpagesize
+
+configure.ac:
+gl_FUNC_MMAP_ANON
+AC_CHECK_HEADERS_ONCE([sys/mman.h])
+AC_CHECK_FUNCS_ONCE([mprotect])
+
+Makefile.am:
+TESTS += test-u8-strnlen
+check_PROGRAMS += test-u8-strnlen
+test_u8_strnlen_SOURCES = unistr/test-u8-strnlen.c
diff --git a/gnulib/modules/unistr/u8-strpbrk b/gnulib/modules/unistr/u8-strpbrk
new file mode 100644
index 00000000..ffbdb828
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strpbrk
@@ -0,0 +1,26 @@
+Description:
+Search for some characters in UTF-8 string.
+
+Files:
+lib/unistr/u8-strpbrk.c
+lib/unistr/u-strpbrk.h
+
+Depends-on:
+unistr/base
+unistr/u8-strmbtouc
+unistr/u8-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strpbrk.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strrchr b/gnulib/modules/unistr/u8-strrchr
new file mode 100644
index 00000000..656b9047
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strrchr
@@ -0,0 +1,24 @@
+Description:
+Search character in UTF-8 string.
+
+Files:
+lib/unistr/u8-strrchr.c
+
+Depends-on:
+unistr/base
+unistr/u8-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strrchr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strspn b/gnulib/modules/unistr/u8-strspn
new file mode 100644
index 00000000..1912e6b6
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strspn
@@ -0,0 +1,28 @@
+Description:
+Search for some characters in UTF-8 string.
+
+Files:
+lib/unistr/u8-strspn.c
+lib/unistr/u-strspn.h
+
+Depends-on:
+unistr/base
+unistr/u8-strlen
+unistr/u8-strmbtouc
+unistr/u8-cmp
+unistr/u8-strchr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strspn.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strstr b/gnulib/modules/unistr/u8-strstr
new file mode 100644
index 00000000..ea9c6ce6
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strstr
@@ -0,0 +1,24 @@
+Description:
+Substring test for UTF-8 strings.
+
+Files:
+lib/unistr/u8-strstr.c
+lib/unistr/u-strstr.h
+
+Depends-on:
+unistr/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strstr.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-strtok b/gnulib/modules/unistr/u8-strtok
new file mode 100644
index 00000000..77c30bc6
--- /dev/null
+++ b/gnulib/modules/unistr/u8-strtok
@@ -0,0 +1,26 @@
+Description:
+Tokenize UTF-8 string.
+
+Files:
+lib/unistr/u8-strtok.c
+lib/unistr/u-strtok.h
+
+Depends-on:
+unistr/base
+unistr/u8-strspn
+unistr/u8-strpbrk
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strtok.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-to-u16 b/gnulib/modules/unistr/u8-to-u16
new file mode 100644
index 00000000..d87a8114
--- /dev/null
+++ b/gnulib/modules/unistr/u8-to-u16
@@ -0,0 +1,25 @@
+Description:
+Convert UTF-8 string to UTF-16 string.
+
+Files:
+lib/unistr/u8-to-u16.c
+
+Depends-on:
+unistr/base
+unistr/u8-mbtoucr
+unistr/u16-uctomb
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-to-u16.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-to-u16-tests b/gnulib/modules/unistr/u8-to-u16-tests
new file mode 100644
index 00000000..1dd37eb6
--- /dev/null
+++ b/gnulib/modules/unistr/u8-to-u16-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-to-u16.c
+tests/macros.h
+
+Depends-on:
+unistr/u16-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-to-u16
+check_PROGRAMS += test-u8-to-u16
+test_u8_to_u16_SOURCES = unistr/test-u8-to-u16.c
diff --git a/gnulib/modules/unistr/u8-to-u32 b/gnulib/modules/unistr/u8-to-u32
new file mode 100644
index 00000000..a3d27d93
--- /dev/null
+++ b/gnulib/modules/unistr/u8-to-u32
@@ -0,0 +1,24 @@
+Description:
+Convert UTF-8 string to UTF-32 string.
+
+Files:
+lib/unistr/u8-to-u32.c
+
+Depends-on:
+unistr/base
+unistr/u8-mbtoucr
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-to-u32.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-to-u32-tests b/gnulib/modules/unistr/u8-to-u32-tests
new file mode 100644
index 00000000..0d5d3383
--- /dev/null
+++ b/gnulib/modules/unistr/u8-to-u32-tests
@@ -0,0 +1,13 @@
+Files:
+tests/unistr/test-u8-to-u32.c
+tests/macros.h
+
+Depends-on:
+unistr/u32-cmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-to-u32
+check_PROGRAMS += test-u8-to-u32
+test_u8_to_u32_SOURCES = unistr/test-u8-to-u32.c
diff --git a/gnulib/modules/unistr/u8-uctomb b/gnulib/modules/unistr/u8-uctomb
new file mode 100644
index 00000000..9f3ee369
--- /dev/null
+++ b/gnulib/modules/unistr/u8-uctomb
@@ -0,0 +1,25 @@
+Description:
+Store a character in UTF-8 string.
+
+Files:
+lib/unistr/u8-uctomb.c
+lib/unistr/u8-uctomb-aux.c
+
+Depends-on:
+unistr/base
+
+configure.ac:
+gl_MODULE_INDICATOR([unistr/u8-uctomb])
+
+Makefile.am:
+lib_SOURCES += unistr/u8-uctomb.c unistr/u8-uctomb-aux.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unistr/u8-uctomb-tests b/gnulib/modules/unistr/u8-uctomb-tests
new file mode 100644
index 00000000..bfacf45f
--- /dev/null
+++ b/gnulib/modules/unistr/u8-uctomb-tests
@@ -0,0 +1,12 @@
+Files:
+tests/unistr/test-u8-uctomb.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-uctomb
+check_PROGRAMS += test-u8-uctomb
+test_u8_uctomb_SOURCES = unistr/test-u8-uctomb.c
diff --git a/gnulib/modules/unitypes b/gnulib/modules/unitypes
new file mode 100644
index 00000000..b924da97
--- /dev/null
+++ b/gnulib/modules/unitypes
@@ -0,0 +1,22 @@
+Description:
+Base types for Unicode string functions.
+
+Files:
+lib/unitypes.h
+
+Depends-on:
+stdint
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unitypes.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwbrk/base b/gnulib/modules/uniwbrk/base
new file mode 100644
index 00000000..66afadbd
--- /dev/null
+++ b/gnulib/modules/uniwbrk/base
@@ -0,0 +1,22 @@
+Description:
+Base layer for word breaks.
+
+Files:
+lib/uniwbrk.h
+
+Depends-on:
+unitypes
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"uniwbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwbrk/table b/gnulib/modules/uniwbrk/table
new file mode 100644
index 00000000..99392dbe
--- /dev/null
+++ b/gnulib/modules/uniwbrk/table
@@ -0,0 +1,22 @@
+Description:
+
+Files:
+lib/uniwbrk/wbrktable.h
+lib/uniwbrk/wbrktable.c
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwbrk/wbrktable.c
+
+Include:
+"uniwbrk/wbrktable.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwbrk/u16-wordbreaks b/gnulib/modules/uniwbrk/u16-wordbreaks
new file mode 100644
index 00000000..8bf71f87
--- /dev/null
+++ b/gnulib/modules/uniwbrk/u16-wordbreaks
@@ -0,0 +1,27 @@
+Description:
+Word breaks in UTF-16 strings.
+
+Files:
+lib/uniwbrk/u16-wordbreaks.c
+lib/uniwbrk/u-wordbreaks.h
+
+Depends-on:
+uniwbrk/base
+uniwbrk/wordbreak-property
+uniwbrk/table
+unistr/u16-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwbrk/u16-wordbreaks.c
+
+Include:
+"uniwbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwbrk/u16-wordbreaks-tests b/gnulib/modules/uniwbrk/u16-wordbreaks-tests
new file mode 100644
index 00000000..8a923f3a
--- /dev/null
+++ b/gnulib/modules/uniwbrk/u16-wordbreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwbrk/test-u16-wordbreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-wordbreaks
+check_PROGRAMS += test-u16-wordbreaks
+test_u16_wordbreaks_SOURCES = uniwbrk/test-u16-wordbreaks.c
+
diff --git a/gnulib/modules/uniwbrk/u32-wordbreaks b/gnulib/modules/uniwbrk/u32-wordbreaks
new file mode 100644
index 00000000..a290aa3a
--- /dev/null
+++ b/gnulib/modules/uniwbrk/u32-wordbreaks
@@ -0,0 +1,27 @@
+Description:
+Word breaks in UTF-32 strings.
+
+Files:
+lib/uniwbrk/u32-wordbreaks.c
+lib/uniwbrk/u-wordbreaks.h
+
+Depends-on:
+uniwbrk/base
+uniwbrk/wordbreak-property
+uniwbrk/table
+unistr/u32-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwbrk/u32-wordbreaks.c
+
+Include:
+"uniwbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwbrk/u32-wordbreaks-tests b/gnulib/modules/uniwbrk/u32-wordbreaks-tests
new file mode 100644
index 00000000..33145c07
--- /dev/null
+++ b/gnulib/modules/uniwbrk/u32-wordbreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwbrk/test-u32-wordbreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-wordbreaks
+check_PROGRAMS += test-u32-wordbreaks
+test_u32_wordbreaks_SOURCES = uniwbrk/test-u32-wordbreaks.c
+
diff --git a/gnulib/modules/uniwbrk/u8-wordbreaks b/gnulib/modules/uniwbrk/u8-wordbreaks
new file mode 100644
index 00000000..46d1fd18
--- /dev/null
+++ b/gnulib/modules/uniwbrk/u8-wordbreaks
@@ -0,0 +1,27 @@
+Description:
+Word breaks in UTF-8 strings.
+
+Files:
+lib/uniwbrk/u8-wordbreaks.c
+lib/uniwbrk/u-wordbreaks.h
+
+Depends-on:
+uniwbrk/base
+uniwbrk/wordbreak-property
+uniwbrk/table
+unistr/u8-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwbrk/u8-wordbreaks.c
+
+Include:
+"uniwbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwbrk/u8-wordbreaks-tests b/gnulib/modules/uniwbrk/u8-wordbreaks-tests
new file mode 100644
index 00000000..8248f2f9
--- /dev/null
+++ b/gnulib/modules/uniwbrk/u8-wordbreaks-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwbrk/test-u8-wordbreaks.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-wordbreaks
+check_PROGRAMS += test-u8-wordbreaks
+test_u8_wordbreaks_SOURCES = uniwbrk/test-u8-wordbreaks.c
+
diff --git a/gnulib/modules/uniwbrk/ulc-wordbreaks b/gnulib/modules/uniwbrk/ulc-wordbreaks
new file mode 100644
index 00000000..52507510
--- /dev/null
+++ b/gnulib/modules/uniwbrk/ulc-wordbreaks
@@ -0,0 +1,28 @@
+Description:
+Word breaks in strings.
+
+Files:
+lib/uniwbrk/ulc-wordbreaks.c
+
+Depends-on:
+uniwbrk/base
+uniwbrk/u8-wordbreaks
+unilbrk/ulc-common
+uniconv/u8-conv-from-enc
+c-ctype
+localcharset
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwbrk/ulc-wordbreaks.c
+
+Include:
+"uniwbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwbrk/ulc-wordbreaks-tests b/gnulib/modules/uniwbrk/ulc-wordbreaks-tests
new file mode 100644
index 00000000..3bf214d1
--- /dev/null
+++ b/gnulib/modules/uniwbrk/ulc-wordbreaks-tests
@@ -0,0 +1,19 @@
+Files:
+tests/uniwbrk/test-ulc-wordbreaks.sh
+tests/uniwbrk/test-ulc-wordbreaks.c
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR
+
+Makefile.am:
+TESTS += uniwbrk/test-ulc-wordbreaks.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
+check_PROGRAMS += test-ulc-wordbreaks
+test_ulc_wordbreaks_SOURCES = uniwbrk/test-ulc-wordbreaks.c
+test_ulc_wordbreaks_LDADD = $(LDADD) @LIBICONV@
+
diff --git a/gnulib/modules/uniwbrk/wordbreak-property b/gnulib/modules/uniwbrk/wordbreak-property
new file mode 100644
index 00000000..34462ad5
--- /dev/null
+++ b/gnulib/modules/uniwbrk/wordbreak-property
@@ -0,0 +1,24 @@
+Description:
+Base layer for word breaks.
+
+Files:
+lib/uniwbrk/wordbreak-property.c
+lib/uniwbrk/wbrkprop.h
+
+Depends-on:
+uniwbrk/base
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwbrk/wordbreak-property.c
+
+Include:
+"uniwbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/base b/gnulib/modules/uniwidth/base
new file mode 100644
index 00000000..2b78dca0
--- /dev/null
+++ b/gnulib/modules/uniwidth/base
@@ -0,0 +1,23 @@
+Description:
+Base layer for Unicode string width.
+
+Files:
+lib/uniwidth.h
+lib/localcharset.h
+
+Depends-on:
+unitypes
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"uniwidth.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/u16-strwidth b/gnulib/modules/uniwidth/u16-strwidth
new file mode 100644
index 00000000..a11f1aac
--- /dev/null
+++ b/gnulib/modules/uniwidth/u16-strwidth
@@ -0,0 +1,25 @@
+Description:
+Determine display width of UTF-16 string.
+
+Files:
+lib/uniwidth/u16-strwidth.c
+
+Depends-on:
+uniwidth/base
+uniwidth/u16-width
+unistr/u16-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwidth/u16-strwidth.c
+
+Include:
+"uniwidth.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/u16-strwidth-tests b/gnulib/modules/uniwidth/u16-strwidth-tests
new file mode 100644
index 00000000..84d0c7e7
--- /dev/null
+++ b/gnulib/modules/uniwidth/u16-strwidth-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwidth/test-u16-strwidth.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-strwidth
+check_PROGRAMS += test-u16-strwidth
+test_u16_strwidth_SOURCES = uniwidth/test-u16-strwidth.c
+
diff --git a/gnulib/modules/uniwidth/u16-width b/gnulib/modules/uniwidth/u16-width
new file mode 100644
index 00000000..ae31a3f6
--- /dev/null
+++ b/gnulib/modules/uniwidth/u16-width
@@ -0,0 +1,25 @@
+Description:
+Determine display width of UTF-16 string.
+
+Files:
+lib/uniwidth/u16-width.c
+
+Depends-on:
+uniwidth/base
+uniwidth/width
+unistr/u16-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwidth/u16-width.c
+
+Include:
+"uniwidth.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/u16-width-tests b/gnulib/modules/uniwidth/u16-width-tests
new file mode 100644
index 00000000..3a872035
--- /dev/null
+++ b/gnulib/modules/uniwidth/u16-width-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwidth/test-u16-width.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u16-width
+check_PROGRAMS += test-u16-width
+test_u16_width_SOURCES = uniwidth/test-u16-width.c
+
diff --git a/gnulib/modules/uniwidth/u32-strwidth b/gnulib/modules/uniwidth/u32-strwidth
new file mode 100644
index 00000000..fbd14002
--- /dev/null
+++ b/gnulib/modules/uniwidth/u32-strwidth
@@ -0,0 +1,25 @@
+Description:
+Determine display width of UTF-32 string.
+
+Files:
+lib/uniwidth/u32-strwidth.c
+
+Depends-on:
+uniwidth/base
+uniwidth/u32-width
+unistr/u32-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwidth/u32-strwidth.c
+
+Include:
+"uniwidth.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/u32-strwidth-tests b/gnulib/modules/uniwidth/u32-strwidth-tests
new file mode 100644
index 00000000..a8e34da4
--- /dev/null
+++ b/gnulib/modules/uniwidth/u32-strwidth-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwidth/test-u32-strwidth.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-strwidth
+check_PROGRAMS += test-u32-strwidth
+test_u32_strwidth_SOURCES = uniwidth/test-u32-strwidth.c
+
diff --git a/gnulib/modules/uniwidth/u32-width b/gnulib/modules/uniwidth/u32-width
new file mode 100644
index 00000000..a5660fcd
--- /dev/null
+++ b/gnulib/modules/uniwidth/u32-width
@@ -0,0 +1,24 @@
+Description:
+Determine display width of UTF-32 string.
+
+Files:
+lib/uniwidth/u32-width.c
+
+Depends-on:
+uniwidth/base
+uniwidth/width
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwidth/u32-width.c
+
+Include:
+"uniwidth.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/u32-width-tests b/gnulib/modules/uniwidth/u32-width-tests
new file mode 100644
index 00000000..934402fd
--- /dev/null
+++ b/gnulib/modules/uniwidth/u32-width-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwidth/test-u32-width.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u32-width
+check_PROGRAMS += test-u32-width
+test_u32_width_SOURCES = uniwidth/test-u32-width.c
+
diff --git a/gnulib/modules/uniwidth/u8-strwidth b/gnulib/modules/uniwidth/u8-strwidth
new file mode 100644
index 00000000..49b2df92
--- /dev/null
+++ b/gnulib/modules/uniwidth/u8-strwidth
@@ -0,0 +1,25 @@
+Description:
+Determine display width of UTF-8 string.
+
+Files:
+lib/uniwidth/u8-strwidth.c
+
+Depends-on:
+uniwidth/base
+uniwidth/u8-width
+unistr/u8-strlen
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwidth/u8-strwidth.c
+
+Include:
+"uniwidth.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/u8-strwidth-tests b/gnulib/modules/uniwidth/u8-strwidth-tests
new file mode 100644
index 00000000..1898c906
--- /dev/null
+++ b/gnulib/modules/uniwidth/u8-strwidth-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwidth/test-u8-strwidth.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-strwidth
+check_PROGRAMS += test-u8-strwidth
+test_u8_strwidth_SOURCES = uniwidth/test-u8-strwidth.c
+
diff --git a/gnulib/modules/uniwidth/u8-width b/gnulib/modules/uniwidth/u8-width
new file mode 100644
index 00000000..e00eb8d9
--- /dev/null
+++ b/gnulib/modules/uniwidth/u8-width
@@ -0,0 +1,25 @@
+Description:
+Determine display width of UTF-8 string.
+
+Files:
+lib/uniwidth/u8-width.c
+
+Depends-on:
+uniwidth/base
+uniwidth/width
+unistr/u8-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwidth/u8-width.c
+
+Include:
+"uniwidth.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/u8-width-tests b/gnulib/modules/uniwidth/u8-width-tests
new file mode 100644
index 00000000..a0112a76
--- /dev/null
+++ b/gnulib/modules/uniwidth/u8-width-tests
@@ -0,0 +1,13 @@
+Files:
+tests/uniwidth/test-u8-width.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-u8-width
+check_PROGRAMS += test-u8-width
+test_u8_width_SOURCES = uniwidth/test-u8-width.c
+
diff --git a/gnulib/modules/uniwidth/width b/gnulib/modules/uniwidth/width
new file mode 100644
index 00000000..d0fe6540
--- /dev/null
+++ b/gnulib/modules/uniwidth/width
@@ -0,0 +1,25 @@
+Description:
+Determine display width of Unicode character.
+
+Files:
+lib/uniwidth/width.c
+lib/uniwidth/cjk.h
+
+Depends-on:
+uniwidth/base
+streq
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += uniwidth/width.c
+
+Include:
+"uniwidth.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/uniwidth/width-tests b/gnulib/modules/uniwidth/width-tests
new file mode 100644
index 00000000..c6caf1f6
--- /dev/null
+++ b/gnulib/modules/uniwidth/width-tests
@@ -0,0 +1,16 @@
+Files:
+tests/uniwidth/test-uc_width.c
+tests/uniwidth/test-uc_width2.c
+tests/uniwidth/test-uc_width2.sh
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-uc_width uniwidth/test-uc_width2.sh
+check_PROGRAMS += test-uc_width test-uc_width2
+test_uc_width_SOURCES = uniwidth/test-uc_width.c
+test_uc_width2_SOURCES = uniwidth/test-uc_width2.c
+
diff --git a/gnulib/modules/unlink b/gnulib/modules/unlink
new file mode 100644
index 00000000..224efa34
--- /dev/null
+++ b/gnulib/modules/unlink
@@ -0,0 +1,26 @@
+Description:
+unlink(): remove a file.
+
+Files:
+lib/unlink.c
+m4/dos.m4
+m4/unlink.m4
+
+Depends-on:
+lstat
+unistd
+
+configure.ac:
+gl_FUNC_UNLINK
+gl_UNISTD_MODULE_INDICATOR([unlink])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/unlink-busy b/gnulib/modules/unlink-busy
new file mode 100644
index 00000000..96d7b314
--- /dev/null
+++ b/gnulib/modules/unlink-busy
@@ -0,0 +1,20 @@
+Description:
+Test whether a running program can be unlinked.
+
+Files:
+m4/unlink-busy.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_UNLINK_BUSY_TEXT
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/unlink-tests b/gnulib/modules/unlink-tests
new file mode 100644
index 00000000..6a57d499
--- /dev/null
+++ b/gnulib/modules/unlink-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-unlink.h
+tests/test-unlink.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+stdbool
+symlink
+unlinkdir
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-unlink
+check_PROGRAMS += test-unlink
diff --git a/gnulib/modules/unlinkdir b/gnulib/modules/unlinkdir
new file mode 100644
index 00000000..f3b7fd71
--- /dev/null
+++ b/gnulib/modules/unlinkdir
@@ -0,0 +1,25 @@
+Description:
+Determine whether we can unlink directories.
+
+Files:
+lib/unlinkdir.h
+lib/unlinkdir.c
+m4/unlinkdir.m4
+
+Depends-on:
+stdbool
+priv-set
+
+configure.ac:
+gl_UNLINKDIR
+
+Makefile.am:
+
+Include:
+"unlinkdir.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/unlocked-io b/gnulib/modules/unlocked-io
new file mode 100644
index 00000000..000fe32c
--- /dev/null
+++ b/gnulib/modules/unlocked-io
@@ -0,0 +1,23 @@
+Description:
+Enable faster, non-thread-safe stdio functions if available.
+
+Files:
+lib/unlocked-io.h
+m4/unlocked-io.m4
+
+Depends-on:
+extensions
+
+configure.ac:
+gl_FUNC_GLIBC_UNLOCKED_IO
+
+Makefile.am:
+
+Include:
+"unlocked-io.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/unsetenv b/gnulib/modules/unsetenv
new file mode 100644
index 00000000..6dff883c
--- /dev/null
+++ b/gnulib/modules/unsetenv
@@ -0,0 +1,27 @@
+Description:
+unsetenv() function: remove an environment variable.
+
+Files:
+lib/unsetenv.c
+m4/setenv.m4
+
+Depends-on:
+stdlib
+unistd
+environ
+
+configure.ac:
+gl_FUNC_UNSETENV
+gl_STDLIB_MODULE_INDICATOR([unsetenv])
+
+Makefile.am:
+
+Include:
+<stdlib.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/unsetenv-tests b/gnulib/modules/unsetenv-tests
new file mode 100644
index 00000000..e3a62f41
--- /dev/null
+++ b/gnulib/modules/unsetenv-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-unsetenv.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+putenv
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-unsetenv
+check_PROGRAMS += test-unsetenv
diff --git a/gnulib/modules/unused-parameter b/gnulib/modules/unused-parameter
new file mode 100644
index 00000000..196aa78e
--- /dev/null
+++ b/gnulib/modules/unused-parameter
@@ -0,0 +1,40 @@
+Description:
+A C macro for declaring that specific function parameters are not used.
+
+Applicability:
+all
+
+Files:
+build-aux/unused-parameter.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+# The BUILT_SOURCES created by this Makefile snippet are not used via #include
+# statements but through direct file reference. Therefore this snippet must be
+# present in all Makefile.am that need it. This is ensured by the applicability
+# 'all' defined above.
+
+BUILT_SOURCES += unused-parameter.h
+# The unused-parameter.h that gets inserted into generated .h files is the same
+# as build-aux/unused-parameter.h, except that it has the copyright header cut
+# off.
+unused-parameter.h: $(top_srcdir)/build-aux/unused-parameter.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ sed -n -e '/GL_UNUSED_PARAMETER/,$$p' \
+ < $(top_srcdir)/build-aux/unused-parameter.h \
+ > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += unused-parameter.h unused-parameter.h-t
+
+UNUSED_PARAMETER_H=unused-parameter.h
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/update-copyright b/gnulib/modules/update-copyright
new file mode 100644
index 00000000..c703c68b
--- /dev/null
+++ b/gnulib/modules/update-copyright
@@ -0,0 +1,19 @@
+Description:
+Update an FSF copyright year list to include the current year.
+
+Files:
+build-aux/update-copyright
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/update-copyright-tests b/gnulib/modules/update-copyright-tests
new file mode 100644
index 00000000..5dc8ee1c
--- /dev/null
+++ b/gnulib/modules/update-copyright-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-update-copyright.sh
+
+Depends-on:
+
+configure.ac:
+abs_aux_dir=`cd "$ac_aux_dir"; pwd`
+AC_SUBST([abs_aux_dir])
+
+Makefile.am:
+TESTS += test-update-copyright.sh
+TESTS_ENVIRONMENT += PATH='$(abs_aux_dir)'$(PATH_SEPARATOR)"$$PATH"
diff --git a/gnulib/modules/uptime b/gnulib/modules/uptime
new file mode 100644
index 00000000..93c5f4ae
--- /dev/null
+++ b/gnulib/modules/uptime
@@ -0,0 +1,20 @@
+Description:
+Test whether /proc/uptime might exist.
+
+Files:
+m4/uptime.m4
+
+Depends-on:
+
+configure.ac:
+gl_SYS_PROC_UPTIME
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/useless-if-before-free b/gnulib/modules/useless-if-before-free
new file mode 100644
index 00000000..5d05232a
--- /dev/null
+++ b/gnulib/modules/useless-if-before-free
@@ -0,0 +1,19 @@
+Description:
+Detect useless "if" tests before "free" calls.
+
+Files:
+build-aux/useless-if-before-free
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/userspec b/gnulib/modules/userspec
new file mode 100644
index 00000000..95da75d5
--- /dev/null
+++ b/gnulib/modules/userspec
@@ -0,0 +1,32 @@
+Description:
+Parse a `user:group' specifier (e.g. the first argument of chown utility).
+
+Files:
+lib/inttostr.h
+lib/userspec.c
+lib/userspec.h
+m4/userspec.m4
+
+Depends-on:
+posixver
+xalloc
+xstrtol
+strdup
+gettext-h
+intprops
+inttostr
+stdbool
+
+configure.ac:
+gl_USERSPEC
+
+Makefile.am:
+
+Include:
+"userspec.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/userspec-tests b/gnulib/modules/userspec-tests
new file mode 100644
index 00000000..a5228577
--- /dev/null
+++ b/gnulib/modules/userspec-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-userspec.c
+
+Depends-on:
+xalloc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-userspec
+check_PROGRAMS += test-userspec
+test_userspec_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/usleep b/gnulib/modules/usleep
new file mode 100644
index 00000000..c77826bb
--- /dev/null
+++ b/gnulib/modules/usleep
@@ -0,0 +1,26 @@
+Description:
+usleep() function: pause execution of the current thread.
+
+Files:
+lib/usleep.c
+m4/usleep.m4
+
+Depends-on:
+extensions
+sleep
+unistd
+
+configure.ac:
+gl_FUNC_USLEEP
+gl_UNISTD_MODULE_INDICATOR([usleep])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/usleep-tests b/gnulib/modules/usleep-tests
new file mode 100644
index 00000000..43241f4b
--- /dev/null
+++ b/gnulib/modules/usleep-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-usleep.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+time
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-usleep
+check_PROGRAMS += test-usleep
diff --git a/gnulib/modules/utf16-ucs4 b/gnulib/modules/utf16-ucs4
new file mode 100644
index 00000000..ba07bb5d
--- /dev/null
+++ b/gnulib/modules/utf16-ucs4
@@ -0,0 +1,21 @@
+Description:
+Conversion UTF-16 to UCS-4.
+
+Files:
+
+Depends-on:
+unistr/u16-mbtouc
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/utf16-ucs4-unsafe b/gnulib/modules/utf16-ucs4-unsafe
new file mode 100644
index 00000000..ba1c103f
--- /dev/null
+++ b/gnulib/modules/utf16-ucs4-unsafe
@@ -0,0 +1,21 @@
+Description:
+Conversion UTF-16 to UCS-4.
+
+Files:
+
+Depends-on:
+unistr/u16-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/utf8-ucs4 b/gnulib/modules/utf8-ucs4
new file mode 100644
index 00000000..b0536f53
--- /dev/null
+++ b/gnulib/modules/utf8-ucs4
@@ -0,0 +1,21 @@
+Description:
+Conversion UTF-8 to UCS-4.
+
+Files:
+
+Depends-on:
+unistr/u8-mbtouc
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/utf8-ucs4-unsafe b/gnulib/modules/utf8-ucs4-unsafe
new file mode 100644
index 00000000..452541cc
--- /dev/null
+++ b/gnulib/modules/utf8-ucs4-unsafe
@@ -0,0 +1,21 @@
+Description:
+Conversion UTF-8 to UCS-4.
+
+Files:
+
+Depends-on:
+unistr/u8-mbtouc-unsafe
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/utime b/gnulib/modules/utime
new file mode 100644
index 00000000..56ed8ef3
--- /dev/null
+++ b/gnulib/modules/utime
@@ -0,0 +1,38 @@
+Description:
+utime() function: change access and/or modification times of a file.
+
+Status:
+obsolete
+
+Notice:
+This module is obsolete. It can be removed on 2010-01-01.
+
+Files:
+lib/utime.c
+m4/utimbuf.m4
+m4/utime.m4
+m4/utimes.m4
+m4/utimes-null.m4
+
+Depends-on:
+open
+full-write
+safe-read
+
+configure.ac:
+gl_FUNC_UTIME
+
+Makefile.am:
+
+Include:
+#if HAVE_UTIME_H
+# include <utime.h>
+#else
+# include <sys/utime.h>
+#endif
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/utimecmp b/gnulib/modules/utimecmp
new file mode 100644
index 00000000..7be906b2
--- /dev/null
+++ b/gnulib/modules/utimecmp
@@ -0,0 +1,36 @@
+Description:
+compare file time stamps
+
+Files:
+lib/utimecmp.h
+lib/utimecmp.c
+m4/utimecmp.m4
+
+Depends-on:
+hash
+stat-time
+time
+utimens
+xalloc
+intprops
+lstat
+stdbool
+stdint
+verify
+
+configure.ac:
+gl_UTIMECMP
+
+Makefile.am:
+
+Include:
+"utimecmp.h"
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/utimens b/gnulib/modules/utimens
new file mode 100644
index 00000000..9917cfc7
--- /dev/null
+++ b/gnulib/modules/utimens
@@ -0,0 +1,37 @@
+Description:
+Set file access and modification times.
+
+Files:
+lib/utimens.c
+lib/utimens.h
+m4/utimbuf.m4
+m4/utimens.m4
+m4/utimes.m4
+
+Depends-on:
+dup2
+errno
+lstat
+gettime
+stat-time
+stdbool
+sys_stat
+sys_time
+time
+
+configure.ac:
+gl_UTIMENS
+
+Makefile.am:
+
+Include:
+"utimens.h"
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering, Eric Blake
diff --git a/gnulib/modules/utimens-tests b/gnulib/modules/utimens-tests
new file mode 100644
index 00000000..d0566a61
--- /dev/null
+++ b/gnulib/modules/utimens-tests
@@ -0,0 +1,22 @@
+Files:
+tests/nap.h
+tests/test-futimens.h
+tests/test-lutimens.h
+tests/test-utimens.h
+tests/test-utimens-common.h
+tests/test-utimens.c
+tests/macros.h
+
+Depends-on:
+ignore-value
+symlink
+timespec
+usleep
+utimecmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-utimens
+check_PROGRAMS += test-utimens
+test_utimens_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBINTL@
diff --git a/gnulib/modules/utimensat b/gnulib/modules/utimensat
new file mode 100644
index 00000000..23770809
--- /dev/null
+++ b/gnulib/modules/utimensat
@@ -0,0 +1,30 @@
+Description:
+Set file access and modification times of a file relative to a directory fd.
+
+Files:
+lib/utimensat.c
+m4/utimensat.m4
+
+Depends-on:
+openat
+sys_stat
+utimens
+extensions
+
+configure.ac:
+gl_FUNC_UTIMENSAT
+gl_SYS_STAT_MODULE_INDICATOR([utimensat])
+
+Makefile.am:
+
+Include:
+<sys/stat.h>
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/utimensat-tests b/gnulib/modules/utimensat-tests
new file mode 100644
index 00000000..26dbac67
--- /dev/null
+++ b/gnulib/modules/utimensat-tests
@@ -0,0 +1,22 @@
+Files:
+tests/nap.h
+tests/test-lutimens.h
+tests/test-utimens.h
+tests/test-utimens-common.h
+tests/test-utimensat.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+ignore-value
+progname
+timespec
+usleep
+utimecmp
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-utimensat
+check_PROGRAMS += test-utimensat
+test_utimensat_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBINTL@
diff --git a/gnulib/modules/va-args b/gnulib/modules/va-args
new file mode 100644
index 00000000..79fb1632
--- /dev/null
+++ b/gnulib/modules/va-args
@@ -0,0 +1,20 @@
+Description:
+Detect whether the preprocessor supports C99 variadic macros and __VA_ARGS__.
+
+Files:
+m4/va-args.m4
+
+Depends-on:
+
+configure.ac:
+gl_VA_ARGS
+
+Makefile.am:
+
+Include:
+
+License:
+LGPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/vararrays b/gnulib/modules/vararrays
new file mode 100644
index 00000000..335fe46e
--- /dev/null
+++ b/gnulib/modules/vararrays
@@ -0,0 +1,20 @@
+Description:
+Variable-length arrays
+
+Files:
+m4/vararrays.m4
+
+Depends-on:
+
+configure.ac:
+AC_C_VARARRAYS
+
+Makefile.am:
+
+Include:
+
+License:
+LGPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/vasnprintf b/gnulib/modules/vasnprintf
new file mode 100644
index 00000000..819495c4
--- /dev/null
+++ b/gnulib/modules/vasnprintf
@@ -0,0 +1,41 @@
+Description:
+vsprintf with automatic memory allocation and bounded output size.
+
+Files:
+lib/float+.h
+lib/printf-args.h
+lib/printf-args.c
+lib/printf-parse.h
+lib/printf-parse.c
+lib/vasnprintf.h
+lib/vasnprintf.c
+lib/asnprintf.c
+m4/wchar_t.m4
+m4/wint_t.m4
+m4/longlong.m4
+m4/intmax_t.m4
+m4/stdint_h.m4
+m4/inttypes_h.m4
+m4/vasnprintf.m4
+
+Depends-on:
+alloca-opt
+float
+stdint
+xsize
+errno
+memchr
+
+configure.ac:
+gl_FUNC_VASNPRINTF
+
+Makefile.am:
+
+Include:
+"vasnprintf.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/vasnprintf-posix b/gnulib/modules/vasnprintf-posix
new file mode 100644
index 00000000..2e47814f
--- /dev/null
+++ b/gnulib/modules/vasnprintf-posix
@@ -0,0 +1,36 @@
+Description:
+POSIX compatible vsprintf with automatic memory allocation and bounded output
+size.
+
+Files:
+m4/vasnprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+multiarch
+
+configure.ac:
+gl_FUNC_VASNPRINTF_POSIX
+
+Makefile.am:
+
+Include:
+"vasnprintf.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vasnprintf-posix-tests b/gnulib/modules/vasnprintf-posix-tests
new file mode 100644
index 00000000..5320d88b
--- /dev/null
+++ b/gnulib/modules/vasnprintf-posix-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-vasnprintf-posix.c
+tests/test-vasnprintf-posix2.sh
+tests/test-vasnprintf-posix2.c
+tests/nan.h
+tests/macros.h
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+stdint
+float
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+
+Makefile.am:
+TESTS += test-vasnprintf-posix test-vasnprintf-posix2.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
+check_PROGRAMS += test-vasnprintf-posix test-vasnprintf-posix2
diff --git a/gnulib/modules/vasnprintf-tests b/gnulib/modules/vasnprintf-tests
new file mode 100644
index 00000000..7ae88c6b
--- /dev/null
+++ b/gnulib/modules/vasnprintf-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-vasnprintf.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-vasnprintf
+check_PROGRAMS += test-vasnprintf
+
diff --git a/gnulib/modules/vasprintf b/gnulib/modules/vasprintf
new file mode 100644
index 00000000..e0eed16b
--- /dev/null
+++ b/gnulib/modules/vasprintf
@@ -0,0 +1,37 @@
+Description:
+vsprintf with automatic memory allocation.
+
+Notice:
+If you are using GNU gettext version 0.16.1 or older, add the following options
+to XGETTEXT_OPTIONS in your po/Makevars:
+ --flag=asprintf:2:c-format --flag=vasprintf:2:c-format
+
+Files:
+lib/vasprintf.c
+lib/asprintf.c
+m4/vasprintf.m4
+
+Depends-on:
+extensions
+vasnprintf
+stdio
+errno
+
+configure.ac:
+gl_FUNC_VASPRINTF
+gl_STDIO_MODULE_INDICATOR([vasprintf])
+m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--flag=asprintf:2:c-format])
+ AM_][XGETTEXT_OPTION([--flag=vasprintf:2:c-format])])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vasprintf-posix b/gnulib/modules/vasprintf-posix
new file mode 100644
index 00000000..1fc33857
--- /dev/null
+++ b/gnulib/modules/vasprintf-posix
@@ -0,0 +1,36 @@
+Description:
+POSIX compatible vsprintf with automatic memory allocation.
+
+Files:
+m4/vasprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+vasprintf
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+multiarch
+
+configure.ac:
+gl_FUNC_VASPRINTF_POSIX
+
+Makefile.am:
+
+Include:
+"vasprintf.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vasprintf-posix-tests b/gnulib/modules/vasprintf-posix-tests
new file mode 100644
index 00000000..4be9c2b3
--- /dev/null
+++ b/gnulib/modules/vasprintf-posix-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-vasprintf-posix.c
+tests/nan.h
+tests/macros.h
+
+Depends-on:
+stdint
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-vasprintf-posix
+check_PROGRAMS += test-vasprintf-posix
+
diff --git a/gnulib/modules/vasprintf-tests b/gnulib/modules/vasprintf-tests
new file mode 100644
index 00000000..f6a7d806
--- /dev/null
+++ b/gnulib/modules/vasprintf-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-vasprintf.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-vasprintf
+check_PROGRAMS += test-vasprintf
+
diff --git a/gnulib/modules/vc-list-files b/gnulib/modules/vc-list-files
new file mode 100644
index 00000000..0f922aec
--- /dev/null
+++ b/gnulib/modules/vc-list-files
@@ -0,0 +1,19 @@
+Description:
+list version-controlled files (vc-agnostic)
+
+Files:
+build-aux/vc-list-files
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+
+License:
+GPLed build tool
+
+Maintainer:
+coreutils
diff --git a/gnulib/modules/vc-list-files-tests b/gnulib/modules/vc-list-files-tests
new file mode 100644
index 00000000..c6bc0745
--- /dev/null
+++ b/gnulib/modules/vc-list-files-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-vc-list-files-git.sh
+tests/test-vc-list-files-cvs.sh
+
+Depends-on:
+
+configure.ac:
+abs_aux_dir=`cd "$ac_aux_dir"; pwd`
+AC_SUBST([abs_aux_dir])
+
+Makefile.am:
+TESTS += test-vc-list-files-git.sh
+TESTS += test-vc-list-files-cvs.sh
+TESTS_ENVIRONMENT += PATH='$(abs_aux_dir)'$(PATH_SEPARATOR)"$$PATH"
diff --git a/gnulib/modules/vdprintf b/gnulib/modules/vdprintf
new file mode 100644
index 00000000..3ddda20d
--- /dev/null
+++ b/gnulib/modules/vdprintf
@@ -0,0 +1,28 @@
+Description:
+vdprintf() function: print formatted output to a file descriptor
+
+Files:
+lib/vdprintf.c
+m4/vdprintf.m4
+
+Depends-on:
+stdio
+vasnprintf
+full-write
+errno
+
+configure.ac:
+gl_FUNC_VDPRINTF
+gl_STDIO_MODULE_INDICATOR([vdprintf])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vdprintf-posix b/gnulib/modules/vdprintf-posix
new file mode 100644
index 00000000..bc1cb889
--- /dev/null
+++ b/gnulib/modules/vdprintf-posix
@@ -0,0 +1,37 @@
+Description:
+POSIX compatible vdprintf() function: print formatted output to a file
+descriptor
+
+Files:
+m4/vdprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+vdprintf
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+multiarch
+
+configure.ac:
+gl_FUNC_VDPRINTF_POSIX
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vdprintf-posix-tests b/gnulib/modules/vdprintf-posix-tests
new file mode 100644
index 00000000..a7dff7ac
--- /dev/null
+++ b/gnulib/modules/vdprintf-posix-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-vdprintf-posix.sh
+tests/test-vdprintf-posix.c
+tests/test-fprintf-posix.h
+tests/test-printf-posix.output
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-vdprintf-posix.sh
+check_PROGRAMS += test-vdprintf-posix
diff --git a/gnulib/modules/verify b/gnulib/modules/verify
new file mode 100644
index 00000000..eebb1cde
--- /dev/null
+++ b/gnulib/modules/verify
@@ -0,0 +1,21 @@
+Description:
+Compile-time assert-like macros.
+
+Files:
+lib/verify.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += verify.h
+
+Include:
+"verify.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/verror b/gnulib/modules/verror
new file mode 100644
index 00000000..6b837e9e
--- /dev/null
+++ b/gnulib/modules/verror
@@ -0,0 +1,32 @@
+Description:
+verror and verror_at_line functions: Error reporting with va_list.
+
+Notice:
+If you are using GNU gettext version 0.16.1 or older, add the following options
+to XGETTEXT_OPTIONS in your po/Makevars:
+ --flag=verror:3:c-format --flag=verror_at_line:5:c-format
+
+Files:
+lib/verror.h
+lib/verror.c
+
+Depends-on:
+error
+xvasprintf
+
+configure.ac:
+m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--flag=verror:3:c-format])
+ AM_][XGETTEXT_OPTION([--flag=verror_at_line:5:c-format])])
+
+Makefile.am:
+lib_SOURCES += verror.h verror.c
+
+Include:
+"verror.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/version-etc b/gnulib/modules/version-etc
new file mode 100644
index 00000000..d4cea5ad
--- /dev/null
+++ b/gnulib/modules/version-etc
@@ -0,0 +1,26 @@
+Description:
+Print --version and bug-reporting information in a consistent format.
+
+Files:
+lib/version-etc.h
+lib/version-etc.c
+m4/version-etc.m4
+
+Depends-on:
+gettext-h
+stdarg
+
+configure.ac:
+gl_VERSION_ETC
+
+Makefile.am:
+lib_SOURCES += version-etc.h version-etc.c
+
+Include:
+"version-etc.h"
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/version-etc-fsf b/gnulib/modules/version-etc-fsf
new file mode 100644
index 00000000..16663cab
--- /dev/null
+++ b/gnulib/modules/version-etc-fsf
@@ -0,0 +1,21 @@
+Description:
+Copyright variable for FSF projects
+
+Files:
+lib/version-etc-fsf.c
+
+Depends-on:
+version-etc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += version-etc-fsf.c
+
+Include:
+
+License:
+LGPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/version-etc-tests b/gnulib/modules/version-etc-tests
new file mode 100644
index 00000000..54936db7
--- /dev/null
+++ b/gnulib/modules/version-etc-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-version-etc.c
+tests/test-version-etc.sh
+
+Depends-on:
+progname
+version-etc-fsf
+
+Makefile.am:
+TESTS += test-version-etc.sh
+check_PROGRAMS += test-version-etc
+test_version_etc_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/vfprintf-posix b/gnulib/modules/vfprintf-posix
new file mode 100644
index 00000000..b6225641
--- /dev/null
+++ b/gnulib/modules/vfprintf-posix
@@ -0,0 +1,40 @@
+Description:
+POSIX compatible vfprintf() function: print formatted output to a stream
+
+Files:
+lib/vfprintf.c
+m4/vfprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+stdio
+fseterr
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+errno
+multiarch
+
+configure.ac:
+gl_FUNC_VFPRINTF_POSIX
+gl_STDIO_MODULE_INDICATOR([vfprintf-posix])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vfprintf-posix-tests b/gnulib/modules/vfprintf-posix-tests
new file mode 100644
index 00000000..d4dab2d9
--- /dev/null
+++ b/gnulib/modules/vfprintf-posix-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-vfprintf-posix.sh
+tests/test-vfprintf-posix.c
+tests/test-fprintf-posix.h
+tests/test-printf-posix.output
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-vfprintf-posix.sh
+check_PROGRAMS += test-vfprintf-posix
diff --git a/gnulib/modules/vprintf-posix b/gnulib/modules/vprintf-posix
new file mode 100644
index 00000000..2007000a
--- /dev/null
+++ b/gnulib/modules/vprintf-posix
@@ -0,0 +1,28 @@
+Description:
+POSIX compatible vprintf() function: print formatted output to standard output
+
+Files:
+lib/vprintf.c
+m4/vprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+stdio
+vfprintf-posix
+printf-safe
+
+configure.ac:
+gl_FUNC_VPRINTF_POSIX
+gl_STDIO_MODULE_INDICATOR([vprintf-posix])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vprintf-posix-tests b/gnulib/modules/vprintf-posix-tests
new file mode 100644
index 00000000..84f250b3
--- /dev/null
+++ b/gnulib/modules/vprintf-posix-tests
@@ -0,0 +1,16 @@
+Files:
+tests/test-vprintf-posix.sh
+tests/test-vprintf-posix.c
+tests/test-printf-posix.h
+tests/test-printf-posix.output
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-vprintf-posix.sh
+check_PROGRAMS += test-vprintf-posix
diff --git a/gnulib/modules/vsnprintf b/gnulib/modules/vsnprintf
new file mode 100644
index 00000000..ce44cf15
--- /dev/null
+++ b/gnulib/modules/vsnprintf
@@ -0,0 +1,28 @@
+Description:
+vsnprintf() function: print formatted output from an stdarg argument list
+to a fixed length string
+
+Files:
+lib/vsnprintf.c
+m4/vsnprintf.m4
+m4/printf.m4
+
+Depends-on:
+stdio
+vasnprintf
+errno
+
+configure.ac:
+gl_FUNC_VSNPRINTF
+gl_STDIO_MODULE_INDICATOR([vsnprintf])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Yoann Vandoorselaere
diff --git a/gnulib/modules/vsnprintf-posix b/gnulib/modules/vsnprintf-posix
new file mode 100644
index 00000000..dda0c321
--- /dev/null
+++ b/gnulib/modules/vsnprintf-posix
@@ -0,0 +1,37 @@
+Description:
+POSIX compatible vsnprintf() function: print formatted output to a fixed length
+string
+
+Files:
+m4/vsnprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+vsnprintf
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+multiarch
+
+configure.ac:
+gl_FUNC_VSNPRINTF_POSIX
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vsnprintf-posix-tests b/gnulib/modules/vsnprintf-posix-tests
new file mode 100644
index 00000000..530e57ca
--- /dev/null
+++ b/gnulib/modules/vsnprintf-posix-tests
@@ -0,0 +1,20 @@
+Files:
+tests/test-vsnprintf-posix.c
+tests/test-snprintf-posix.h
+tests/test-vsnprintf.c
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+float
+
+configure.ac:
+AC_DEFINE([CHECK_VSNPRINTF_POSIX], 1,
+ [Define to 1 for strict checking in test-vsnprintf.c.])
+
+Makefile.am:
+TESTS += test-vsnprintf-posix test-vsnprintf
+check_PROGRAMS += test-vsnprintf-posix test-vsnprintf
+
diff --git a/gnulib/modules/vsnprintf-tests b/gnulib/modules/vsnprintf-tests
new file mode 100644
index 00000000..9c520cef
--- /dev/null
+++ b/gnulib/modules/vsnprintf-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-vsnprintf.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-vsnprintf
+check_PROGRAMS += test-vsnprintf
+
diff --git a/gnulib/modules/vsprintf-posix b/gnulib/modules/vsprintf-posix
new file mode 100644
index 00000000..96730b34
--- /dev/null
+++ b/gnulib/modules/vsprintf-posix
@@ -0,0 +1,40 @@
+Description:
+POSIX compatible vsprintf() function: print formatted output to a string
+
+Files:
+lib/vsprintf.c
+m4/vsprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+stdio
+vasnprintf
+isnand-nolibm
+isnanl-nolibm
+frexp-nolibm
+frexpl-nolibm
+printf-frexp
+printf-frexpl
+signbit
+fpucw
+nocrash
+printf-safe
+stdint
+errno
+multiarch
+
+configure.ac:
+gl_FUNC_VSPRINTF_POSIX
+gl_STDIO_MODULE_INDICATOR([vsprintf-posix])
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/vsprintf-posix-tests b/gnulib/modules/vsprintf-posix-tests
new file mode 100644
index 00000000..7b5412ff
--- /dev/null
+++ b/gnulib/modules/vsprintf-posix-tests
@@ -0,0 +1,17 @@
+Files:
+tests/test-vsprintf-posix.c
+tests/test-sprintf-posix.h
+tests/nan.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+stdint
+float
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-vsprintf-posix
+check_PROGRAMS += test-vsprintf-posix
+
diff --git a/gnulib/modules/wait-process b/gnulib/modules/wait-process
new file mode 100644
index 00000000..0670bda8
--- /dev/null
+++ b/gnulib/modules/wait-process
@@ -0,0 +1,35 @@
+Description:
+Waiting for a subprocess to finish.
+
+Files:
+lib/wait-process.h
+lib/wait-process.c
+m4/wait-process.m4
+m4/sig_atomic_t.m4
+
+Depends-on:
+fatal-signal
+error
+exit
+xalloc
+gettext-h
+stdbool
+sys_wait
+unistd
+atexit
+
+configure.ac:
+gl_WAIT_PROCESS
+
+Makefile.am:
+lib_SOURCES += wait-process.h wait-process.c
+
+Include:
+"wait-process.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/warn-on-use b/gnulib/modules/warn-on-use
new file mode 100644
index 00000000..f0ee83b8
--- /dev/null
+++ b/gnulib/modules/warn-on-use
@@ -0,0 +1,35 @@
+Description:
+A C macro for emitting a warning if a function is used.
+
+Applicability:
+all
+
+Files:
+build-aux/warn-on-use.h
+m4/warn-on-use.m4
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+BUILT_SOURCES += warn-on-use.h
+# The warn-on-use.h that gets inserted into generated .h files is the same as
+# build-aux/warn-on-use.h, except that it has the copyright header cut off.
+warn-on-use.h: $(top_srcdir)/build-aux/warn-on-use.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ sed -n -e '/^.ifndef/,$$p' \
+ < $(top_srcdir)/build-aux/warn-on-use.h \
+ > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += warn-on-use.h warn-on-use.h-t
+
+WARN_ON_USE_H=warn-on-use.h
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/warnings b/gnulib/modules/warnings
new file mode 100644
index 00000000..0eb724e6
--- /dev/null
+++ b/gnulib/modules/warnings
@@ -0,0 +1,16 @@
+Description:
+Helper M4 functions for safely adding compiler warning parameters.
+
+Files:
+m4/warnings.m4
+
+Depends-on:
+
+configure.ac:
+AC_SUBST([WARN_CFLAGS])
+
+License:
+unlimited
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/wchar b/gnulib/modules/wchar
new file mode 100644
index 00000000..cfd1dd02
--- /dev/null
+++ b/gnulib/modules/wchar
@@ -0,0 +1,79 @@
+Description:
+A <wchar.h> that works around platform issues.
+
+Files:
+lib/wchar.in.h
+m4/wchar.m4
+m4/wint_t.m4
+
+Depends-on:
+arg-nonnull
+include_next
+stddef
+warn-on-use
+
+configure.ac:
+gl_WCHAR_H
+
+Makefile.am:
+BUILT_SOURCES += wchar.h
+
+# We need the following in order to create <wchar.h> when the system
+# version does not work standalone.
+wchar.h: wchar.in.h $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \
+ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \
+ -e 's|@''GNULIB_BTOWC''@|$(GNULIB_BTOWC)|g' \
+ -e 's|@''GNULIB_WCTOB''@|$(GNULIB_WCTOB)|g' \
+ -e 's|@''GNULIB_MBSINIT''@|$(GNULIB_MBSINIT)|g' \
+ -e 's|@''GNULIB_MBRTOWC''@|$(GNULIB_MBRTOWC)|g' \
+ -e 's|@''GNULIB_MBRLEN''@|$(GNULIB_MBRLEN)|g' \
+ -e 's|@''GNULIB_MBSRTOWCS''@|$(GNULIB_MBSRTOWCS)|g' \
+ -e 's|@''GNULIB_MBSNRTOWCS''@|$(GNULIB_MBSNRTOWCS)|g' \
+ -e 's|@''GNULIB_WCRTOMB''@|$(GNULIB_WCRTOMB)|g' \
+ -e 's|@''GNULIB_WCSRTOMBS''@|$(GNULIB_WCSRTOMBS)|g' \
+ -e 's|@''GNULIB_WCSNRTOMBS''@|$(GNULIB_WCSNRTOMBS)|g' \
+ -e 's|@''GNULIB_WCWIDTH''@|$(GNULIB_WCWIDTH)|g' \
+ -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
+ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
+ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \
+ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \
+ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \
+ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \
+ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \
+ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \
+ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \
+ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \
+ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
+ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
+ -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
+ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \
+ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \
+ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \
+ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \
+ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \
+ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \
+ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \
+ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \
+ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \
+ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \
+ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/wchar.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += wchar.h wchar.h-t
+
+Include:
+<wchar.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/wchar-tests b/gnulib/modules/wchar-tests
new file mode 100644
index 00000000..b98622c7
--- /dev/null
+++ b/gnulib/modules/wchar-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-wchar.c
+
+Depends-on:
+verify
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-wchar
+check_PROGRAMS += test-wchar
diff --git a/gnulib/modules/wcrtomb b/gnulib/modules/wcrtomb
new file mode 100644
index 00000000..cdafa555
--- /dev/null
+++ b/gnulib/modules/wcrtomb
@@ -0,0 +1,33 @@
+Description:
+wcrtomb() function: convert wide character to multibyte character.
+
+Files:
+lib/wcrtomb.c
+m4/wcrtomb.m4
+m4/mbrtowc.m4
+m4/mbstate_t.m4
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+extensions
+wchar
+mbsinit
+
+configure.ac:
+gl_FUNC_WCRTOMB
+gl_WCHAR_MODULE_INDICATOR([wcrtomb])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/wcrtomb-tests b/gnulib/modules/wcrtomb-tests
new file mode 100644
index 00000000..abedd771
--- /dev/null
+++ b/gnulib/modules/wcrtomb-tests
@@ -0,0 +1,28 @@
+Files:
+tests/test-wcrtomb.sh
+tests/test-wcrtomb.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+btowc
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_JA
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-wcrtomb.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
+ LOCALE_JA='@LOCALE_JA@' \
+ LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-wcrtomb
+
diff --git a/gnulib/modules/wcsnrtombs b/gnulib/modules/wcsnrtombs
new file mode 100644
index 00000000..2ee1be3a
--- /dev/null
+++ b/gnulib/modules/wcsnrtombs
@@ -0,0 +1,33 @@
+Description:
+wcsnrtombs() function: convert wide string to string.
+
+Files:
+lib/wcsnrtombs.c
+lib/wcsrtombs-state.c
+m4/wcsnrtombs.m4
+m4/mbrtowc.m4
+m4/mbstate_t.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+extensions
+wchar
+wcrtomb
+
+configure.ac:
+gl_FUNC_WCSNRTOMBS
+gl_WCHAR_MODULE_INDICATOR([wcsnrtombs])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/wcsnrtombs-tests b/gnulib/modules/wcsnrtombs-tests
new file mode 100644
index 00000000..1745272f
--- /dev/null
+++ b/gnulib/modules/wcsnrtombs-tests
@@ -0,0 +1,30 @@
+Files:
+tests/test-wcsnrtombs1.sh
+tests/test-wcsnrtombs2.sh
+tests/test-wcsnrtombs3.sh
+tests/test-wcsnrtombs4.sh
+tests/test-wcsnrtombs.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_JA
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-wcsnrtombs1.sh test-wcsnrtombs2.sh test-wcsnrtombs3.sh test-wcsnrtombs4.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
+ LOCALE_JA='@LOCALE_JA@' \
+ LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-wcsnrtombs
+
diff --git a/gnulib/modules/wcsrtombs b/gnulib/modules/wcsrtombs
new file mode 100644
index 00000000..876f3690
--- /dev/null
+++ b/gnulib/modules/wcsrtombs
@@ -0,0 +1,34 @@
+Description:
+wcsrtombs() function: convert wide string to string.
+
+Files:
+lib/wcsrtombs.c
+lib/wcsrtombs-state.c
+m4/wcsrtombs.m4
+m4/mbrtowc.m4
+m4/mbstate_t.m4
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+extensions
+wchar
+wcrtomb
+
+configure.ac:
+gl_FUNC_WCSRTOMBS
+gl_WCHAR_MODULE_INDICATOR([wcsrtombs])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/wcsrtombs-tests b/gnulib/modules/wcsrtombs-tests
new file mode 100644
index 00000000..41ec9973
--- /dev/null
+++ b/gnulib/modules/wcsrtombs-tests
@@ -0,0 +1,30 @@
+Files:
+tests/test-wcsrtombs1.sh
+tests/test-wcsrtombs2.sh
+tests/test-wcsrtombs3.sh
+tests/test-wcsrtombs4.sh
+tests/test-wcsrtombs.c
+tests/signature.h
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-ja.m4
+m4/locale-zh.m4
+m4/codeset.m4
+
+Depends-on:
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_FR_UTF8
+gt_LOCALE_JA
+gt_LOCALE_ZH_CN
+
+Makefile.am:
+TESTS += test-wcsrtombs1.sh test-wcsrtombs2.sh test-wcsrtombs3.sh test-wcsrtombs4.sh
+TESTS_ENVIRONMENT += \
+ LOCALE_FR='@LOCALE_FR@' \
+ LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
+ LOCALE_JA='@LOCALE_JA@' \
+ LOCALE_ZH_CN='@LOCALE_ZH_CN@'
+check_PROGRAMS += test-wcsrtombs
+
diff --git a/gnulib/modules/wctob b/gnulib/modules/wctob
new file mode 100644
index 00000000..500ce6cd
--- /dev/null
+++ b/gnulib/modules/wctob
@@ -0,0 +1,27 @@
+Description:
+wctob() function: convert wide character to unibyte character.
+
+Files:
+lib/wctob.c
+m4/wctob.m4
+m4/locale-fr.m4
+m4/codeset.m4
+
+Depends-on:
+wchar
+
+configure.ac:
+gl_FUNC_WCTOB
+gl_WCHAR_MODULE_INDICATOR([wctob])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/wctype b/gnulib/modules/wctype
new file mode 100644
index 00000000..157c3ddf
--- /dev/null
+++ b/gnulib/modules/wctype
@@ -0,0 +1,42 @@
+Description:
+A <wctype.h> that conforms better to C99.
+
+Files:
+lib/wctype.in.h
+m4/wctype.m4
+m4/wint_t.m4
+
+Depends-on:
+include_next
+
+configure.ac:
+gl_WCTYPE_H
+
+Makefile.am:
+BUILT_SOURCES += $(WCTYPE_H)
+
+# We need the following in order to create <wctype.h> when the system
+# doesn't have one that works with the given compiler.
+wctype.h: wctype.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \
+ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
+ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
+ -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
+ < $(srcdir)/wctype.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += wctype.h wctype.h-t
+
+Include:
+<wctype.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/gnulib/modules/wctype-tests b/gnulib/modules/wctype-tests
new file mode 100644
index 00000000..d10498fc
--- /dev/null
+++ b/gnulib/modules/wctype-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-wctype.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-wctype
+check_PROGRAMS += test-wctype
diff --git a/gnulib/modules/wcwidth b/gnulib/modules/wcwidth
new file mode 100644
index 00000000..fe410f15
--- /dev/null
+++ b/gnulib/modules/wcwidth
@@ -0,0 +1,31 @@
+Description:
+Determine the number of screen columns needed for a character.
+
+Files:
+lib/wcwidth.c
+m4/wcwidth.m4
+m4/wchar_t.m4
+m4/wint_t.m4
+
+Depends-on:
+extensions
+wchar
+wctype
+localcharset
+streq
+uniwidth/width
+
+configure.ac:
+gl_FUNC_WCWIDTH
+gl_WCHAR_MODULE_INDICATOR([wcwidth])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/wcwidth-tests b/gnulib/modules/wcwidth-tests
new file mode 100644
index 00000000..0938a884
--- /dev/null
+++ b/gnulib/modules/wcwidth-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-wcwidth.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+localcharset
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-wcwidth
+check_PROGRAMS += test-wcwidth
+
diff --git a/gnulib/modules/winsz-ioctl b/gnulib/modules/winsz-ioctl
new file mode 100644
index 00000000..9e1c37e2
--- /dev/null
+++ b/gnulib/modules/winsz-ioctl
@@ -0,0 +1,21 @@
+Description:
+Test whether use of TIOCGWINSZ requires sys/ioctl.h.
+
+Files:
+m4/jm-winsz2.m4
+
+Depends-on:
+winsz-termios
+
+configure.ac:
+gl_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/winsz-termios b/gnulib/modules/winsz-termios
new file mode 100644
index 00000000..6e7e38bf
--- /dev/null
+++ b/gnulib/modules/winsz-termios
@@ -0,0 +1,21 @@
+Description:
+Test whether use of TIOCGWINSZ requires termios.h.
+
+Files:
+m4/jm-winsz1.m4
+
+Depends-on:
+
+configure.ac:
+gl_HEADER_TIOCGWINSZ_IN_TERMIOS_H
+gl_WINSIZE_IN_PTEM
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/write b/gnulib/modules/write
new file mode 100644
index 00000000..0f0fc5f2
--- /dev/null
+++ b/gnulib/modules/write
@@ -0,0 +1,26 @@
+Description:
+POSIX compatible write() function: write data to a file descriptor
+
+Files:
+lib/write.c
+m4/write.m4
+
+Depends-on:
+unistd
+raise
+
+configure.ac:
+gl_FUNC_WRITE
+gl_UNISTD_MODULE_INDICATOR([write])
+
+Makefile.am:
+
+Include:
+<unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/write-any-file b/gnulib/modules/write-any-file
new file mode 100644
index 00000000..07eac748
--- /dev/null
+++ b/gnulib/modules/write-any-file
@@ -0,0 +1,25 @@
+Description:
+Determine whether we can write any file.
+
+Files:
+lib/write-any-file.h
+lib/write-any-file.c
+m4/write-any-file.m4
+
+Depends-on:
+stdbool
+priv-set
+
+configure.ac:
+gl_WRITE_ANY_FILE
+
+Makefile.am:
+
+Include:
+"write-any-file.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/xalloc b/gnulib/modules/xalloc
new file mode 100644
index 00000000..43ee9420
--- /dev/null
+++ b/gnulib/modules/xalloc
@@ -0,0 +1,25 @@
+Description:
+Memory allocation with out-of-memory checking. Also see xalloc-die.
+
+Files:
+lib/xalloc.h
+lib/xmalloc.c
+m4/xalloc.m4
+
+Depends-on:
+inline
+xalloc-die
+
+configure.ac:
+gl_XALLOC
+
+Makefile.am:
+
+Include:
+"xalloc.h"
+
+License:
+GPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/xalloc-die b/gnulib/modules/xalloc-die
new file mode 100644
index 00000000..b9f875c4
--- /dev/null
+++ b/gnulib/modules/xalloc-die
@@ -0,0 +1,25 @@
+Description:
+Report a memory allocation failure and exit.
+
+Files:
+lib/xalloc-die.c
+
+Depends-on:
+xalloc
+error
+gettext-h
+exitfail
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xalloc-die.c
+
+Include:
+"xalloc.h"
+
+License:
+GPL
+
+Maintainer:
+all
diff --git a/gnulib/modules/xalloc-die-tests b/gnulib/modules/xalloc-die-tests
new file mode 100644
index 00000000..ca7acd2d
--- /dev/null
+++ b/gnulib/modules/xalloc-die-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-xalloc-die.c
+tests/test-xalloc-die.sh
+tests/init.sh
+
+Depends-on:
+progname
+
+Makefile.am:
+TESTS += test-xalloc-die.sh
+check_PROGRAMS += test-xalloc-die
+test_xalloc_die_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/xconcat-filename b/gnulib/modules/xconcat-filename
new file mode 100644
index 00000000..b8cb0875
--- /dev/null
+++ b/gnulib/modules/xconcat-filename
@@ -0,0 +1,26 @@
+Description:
+Construct a full filename by concatenating a directory name, a relative
+filename, and a suffix, with out-of-memory checking.
+
+Files:
+lib/concat-filename.h
+lib/xconcat-filename.c
+
+Depends-on:
+concat-filename
+xalloc-die
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xconcat-filename.c
+
+Include:
+"concat-filename.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/xfreopen b/gnulib/modules/xfreopen
new file mode 100644
index 00000000..e41b2a66
--- /dev/null
+++ b/gnulib/modules/xfreopen
@@ -0,0 +1,26 @@
+Description:
+a wrapper for frepoen
+
+Files:
+lib/xfreopen.c
+lib/xfreopen.h
+
+Depends-on:
+error
+exitfail
+freopen-safer
+quote
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xfreopen.c xfreopen.h
+
+Include:
+"xfreopen.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/xgetcwd b/gnulib/modules/xgetcwd
new file mode 100644
index 00000000..a3ae23f5
--- /dev/null
+++ b/gnulib/modules/xgetcwd
@@ -0,0 +1,26 @@
+Description:
+Return the current working directory, without size limitations.
+
+Files:
+lib/xgetcwd.h
+lib/xgetcwd.c
+m4/xgetcwd.m4
+
+Depends-on:
+getcwd
+xalloc
+stdbool
+
+configure.ac:
+gl_XGETCWD
+
+Makefile.am:
+
+Include:
+"xgetcwd.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/xgetdomainname b/gnulib/modules/xgetdomainname
new file mode 100644
index 00000000..307aa5dc
--- /dev/null
+++ b/gnulib/modules/xgetdomainname
@@ -0,0 +1,24 @@
+Description:
+Return machine's domainname, without size limitations.
+
+Files:
+lib/xgetdomainname.h
+lib/xgetdomainname.c
+
+Depends-on:
+getdomainname
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xgetdomainname.h xgetdomainname.c
+
+Include:
+"xgetdomainname.h"
+
+License:
+GPL
+
+Maintainer:
+Simon Josefsson
diff --git a/gnulib/modules/xgethostname b/gnulib/modules/xgethostname
new file mode 100644
index 00000000..07cf83d9
--- /dev/null
+++ b/gnulib/modules/xgethostname
@@ -0,0 +1,25 @@
+Description:
+Return machine's hostname, without size limitations.
+
+Files:
+lib/xgethostname.h
+lib/xgethostname.c
+
+Depends-on:
+gethostname
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xgethostname.h xgethostname.c
+
+Include:
+"xgethostname.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
+
diff --git a/gnulib/modules/xlist b/gnulib/modules/xlist
new file mode 100644
index 00000000..ce17e6b6
--- /dev/null
+++ b/gnulib/modules/xlist
@@ -0,0 +1,28 @@
+Description:
+Abstract sequential list data type, with out-of-memory checking.
+
+Files:
+lib/gl_xlist.h
+lib/gl_xlist.c
+m4/gl_list.m4
+
+Depends-on:
+list
+inline
+stdbool
+xalloc-die
+
+configure.ac:
+gl_LIST
+
+Makefile.am:
+lib_SOURCES += gl_xlist.h gl_xlist.c
+
+Include:
+"gl_xlist.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/xmalloca b/gnulib/modules/xmalloca
new file mode 100644
index 00000000..449568af
--- /dev/null
+++ b/gnulib/modules/xmalloca
@@ -0,0 +1,24 @@
+Description:
+Safe automatic memory allocation with out of memory checking.
+
+Files:
+lib/xmalloca.h
+lib/xmalloca.c
+
+Depends-on:
+malloca
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xmalloca.c
+
+Include:
+"xmalloca.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/xmemcoll b/gnulib/modules/xmemcoll
new file mode 100644
index 00000000..06d06a32
--- /dev/null
+++ b/gnulib/modules/xmemcoll
@@ -0,0 +1,28 @@
+Description:
+Locale dependent memory area comparison, with error checking.
+
+Files:
+lib/xmemcoll.h
+lib/xmemcoll.c
+
+Depends-on:
+memcoll
+gettext-h
+error
+quotearg
+exitfail
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xmemcoll.h xmemcoll.c
+
+Include:
+"xmemcoll.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
+
diff --git a/gnulib/modules/xmemdup0 b/gnulib/modules/xmemdup0
new file mode 100644
index 00000000..d7ea438d
--- /dev/null
+++ b/gnulib/modules/xmemdup0
@@ -0,0 +1,23 @@
+Description:
+Copy a block of arbitrary bytes, and append a trailing NUL.
+
+Files:
+lib/xmemdup0.h
+lib/xmemdup0.c
+
+Depends-on:
+xalloc
+
+configure.ac:
+AC_LIBOBJ([xmemdup0])
+
+Makefile.am:
+
+Include:
+"xmemdup0.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake
diff --git a/gnulib/modules/xmemdup0-tests b/gnulib/modules/xmemdup0-tests
new file mode 100644
index 00000000..13311f0f
--- /dev/null
+++ b/gnulib/modules/xmemdup0-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-xmemdup0.c
+tests/macros.h
+
+Depends-on:
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-xmemdup0
+check_PROGRAMS += test-xmemdup0
+test_xmemdup0_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/xnanosleep b/gnulib/modules/xnanosleep
new file mode 100644
index 00000000..876a3b4d
--- /dev/null
+++ b/gnulib/modules/xnanosleep
@@ -0,0 +1,30 @@
+Description:
+a more convenient interface to nanosleep
+
+Files:
+lib/xnanosleep.h
+lib/xnanosleep.c
+m4/xnanosleep.m4
+
+Depends-on:
+nanosleep
+time
+intprops
+stdbool
+
+configure.ac:
+gl_XNANOSLEEP
+
+Makefile.am:
+
+Include:
+"xnanosleep.h"
+
+Link:
+$(LIB_NANOSLEEP)
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/gnulib/modules/xoset b/gnulib/modules/xoset
new file mode 100644
index 00000000..61e8d549
--- /dev/null
+++ b/gnulib/modules/xoset
@@ -0,0 +1,28 @@
+Description:
+Abstract ordered set data type, with out-of-memory checking.
+
+Files:
+lib/gl_xoset.h
+lib/gl_xoset.c
+m4/gl_list.m4
+
+Depends-on:
+oset
+inline
+stdbool
+xalloc-die
+
+configure.ac:
+gl_LIST
+
+Makefile.am:
+lib_SOURCES += gl_xoset.h gl_xoset.c
+
+Include:
+"gl_xoset.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/xprintf b/gnulib/modules/xprintf
new file mode 100644
index 00000000..186e3b01
--- /dev/null
+++ b/gnulib/modules/xprintf
@@ -0,0 +1,38 @@
+Description:
+a wrapper around printf that calls error upon ENOMEM or EILSEQ errors
+
+Notice:
+If you are using GNU gettext version 0.16.1 or older, add the following options
+to XGETTEXT_OPTIONS in your po/Makevars:
+ --flag=xprintf:1:c-format --flag=xvprintf:1:c-format
+ --flag=xfprintf:2:c-format --flag=xvfprintf:2:c-format
+
+Files:
+lib/xprintf.h
+lib/xprintf.c
+
+Depends-on:
+error
+exitfail
+gettext-h
+stdarg
+stdio
+
+configure.ac:
+m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--flag=xprintf:1:c-format])
+ AM_][XGETTEXT_OPTION([--flag=xvprintf:1:c-format])
+ AM_][XGETTEXT_OPTION([--flag=xfprintf:2:c-format])
+ AM_][XGETTEXT_OPTION([--flag=xvfprintf:2:c-format])])
+
+Makefile.am:
+lib_SOURCES += xprintf.h xprintf.c
+
+Include:
+"xprintf.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/xprintf-posix b/gnulib/modules/xprintf-posix
new file mode 100644
index 00000000..495f7996
--- /dev/null
+++ b/gnulib/modules/xprintf-posix
@@ -0,0 +1,24 @@
+Description:
+A wrapper around printf with POSIX compatible format string interpretation,
+that calls error upon ENOMEM or EILSEQ errors.
+
+Files:
+
+Depends-on:
+xprintf
+vprintf-posix
+vfprintf-posix
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"xprintf.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/xprintf-posix-tests b/gnulib/modules/xprintf-posix-tests
new file mode 100644
index 00000000..7882b43e
--- /dev/null
+++ b/gnulib/modules/xprintf-posix-tests
@@ -0,0 +1,20 @@
+Files:
+tests/test-xprintf-posix.sh
+tests/test-xfprintf-posix.c
+tests/test-xprintf-posix.c
+tests/test-fprintf-posix.h
+tests/test-printf-posix.h
+tests/test-printf-posix.output
+tests/macros.h
+
+Depends-on:
+stdint
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-xprintf-posix.sh
+check_PROGRAMS += test-xfprintf-posix test-xprintf-posix
+test_xfprintf_posix_LDADD = $(LDADD) @LIBINTL@
+test_xprintf_posix_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/xreadlink b/gnulib/modules/xreadlink
new file mode 100644
index 00000000..36c0acf6
--- /dev/null
+++ b/gnulib/modules/xreadlink
@@ -0,0 +1,24 @@
+Description:
+Reading symbolic links without size limitation.
+
+Files:
+lib/xreadlink.h
+lib/xreadlink.c
+
+Depends-on:
+areadlink
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xreadlink.c
+
+Include:
+"xreadlink.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible, Jim Meyering
diff --git a/gnulib/modules/xreadlinkat b/gnulib/modules/xreadlinkat
new file mode 100644
index 00000000..81f87de4
--- /dev/null
+++ b/gnulib/modules/xreadlinkat
@@ -0,0 +1,25 @@
+Description:
+Reading symbolic links without size limitation, relative to fd.
+
+Files:
+lib/xreadlink.h
+lib/xreadlinkat.c
+
+Depends-on:
+areadlinkat
+xalloc
+
+configure.ac:
+gl_MODULE_INDICATOR([xreadlinkat])
+
+Makefile.am:
+lib_SOURCES += xreadlinkat.c
+
+Include:
+"xreadlink.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake
diff --git a/gnulib/modules/xsetenv b/gnulib/modules/xsetenv
new file mode 100644
index 00000000..29319f12
--- /dev/null
+++ b/gnulib/modules/xsetenv
@@ -0,0 +1,28 @@
+Description:
+xsetenv() function: set an environment variable, with out-of-memory checking.
+unsetenv() function: remove an environment variable.
+
+Files:
+lib/xsetenv.h
+lib/xsetenv.c
+
+Depends-on:
+setenv
+unsetenv
+error
+exit
+gettext-h
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xsetenv.h xsetenv.c
+
+Include:
+"xsetenv.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/xsize b/gnulib/modules/xsize
new file mode 100644
index 00000000..edaf60f6
--- /dev/null
+++ b/gnulib/modules/xsize
@@ -0,0 +1,25 @@
+Description:
+Checked size_t computations.
+
+Files:
+lib/xsize.h
+m4/xsize.m4
+
+Depends-on:
+size_max
+
+configure.ac:
+gl_XSIZE
+
+Makefile.am:
+lib_SOURCES += xsize.h
+
+Include:
+"xsize.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/xstriconv b/gnulib/modules/xstriconv
new file mode 100644
index 00000000..02b00a8f
--- /dev/null
+++ b/gnulib/modules/xstriconv
@@ -0,0 +1,29 @@
+Description:
+Character set conversion of strings made easy, uses iconv, with out-of-memory
+checking.
+
+Files:
+lib/xstriconv.h
+lib/xstriconv.c
+
+Depends-on:
+striconv
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xstriconv.h xstriconv.c
+
+Include:
+"xstriconv.h"
+
+Link:
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible, Simon Josefsson
+
diff --git a/gnulib/modules/xstriconveh b/gnulib/modules/xstriconveh
new file mode 100644
index 00000000..461d8a2a
--- /dev/null
+++ b/gnulib/modules/xstriconveh
@@ -0,0 +1,28 @@
+Description:
+Character set conversion of strings made easy, uses iconv, with out-of-memory
+checking.
+
+Files:
+lib/xstriconveh.h
+lib/xstriconveh.c
+
+Depends-on:
+striconveh
+xalloc
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xstriconveh.c
+
+Include:
+"xstriconveh.h"
+
+Link:
+$(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/xstrndup b/gnulib/modules/xstrndup
new file mode 100644
index 00000000..dfd72a7a
--- /dev/null
+++ b/gnulib/modules/xstrndup
@@ -0,0 +1,27 @@
+Description:
+Duplicate a bounded initial segment of a string, with out-of-memory checking.
+
+Files:
+lib/xstrndup.h
+lib/xstrndup.c
+m4/xstrndup.m4
+
+Depends-on:
+strndup
+xalloc
+
+configure.ac:
+gl_XSTRNDUP
+
+Makefile.am:
+lib_SOURCES += xstrndup.h xstrndup.c
+
+Include:
+"xstrndup.h"
+
+License:
+GPL
+
+Maintainer:
+Simon Josefsson
+
diff --git a/gnulib/modules/xstrtod b/gnulib/modules/xstrtod
new file mode 100644
index 00000000..095616a7
--- /dev/null
+++ b/gnulib/modules/xstrtod
@@ -0,0 +1,24 @@
+Description:
+Convert string to 'double', with error checking.
+
+Files:
+lib/xstrtod.h
+lib/xstrtod.c
+m4/xstrtod.m4
+
+Depends-on:
+stdbool
+
+configure.ac:
+gl_XSTRTOD
+
+Makefile.am:
+
+Include:
+"xstrtod.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/xstrtoimax b/gnulib/modules/xstrtoimax
new file mode 100644
index 00000000..3ab66230
--- /dev/null
+++ b/gnulib/modules/xstrtoimax
@@ -0,0 +1,23 @@
+Description:
+Convert string to 'intmax_t', with error checking.
+
+Files:
+lib/xstrtoimax.c
+
+Depends-on:
+xstrtol
+strtoimax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xstrtoimax.c
+
+Include:
+"xstrtol.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/xstrtoimax-tests b/gnulib/modules/xstrtoimax-tests
new file mode 100644
index 00000000..cf7acfd2
--- /dev/null
+++ b/gnulib/modules/xstrtoimax-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-xstrtoimax.c
+tests/test-xstrtoimax.sh
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-xstrtoimax.sh
+check_PROGRAMS += test-xstrtoimax
+test_xstrtoimax_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/xstrtol b/gnulib/modules/xstrtol
new file mode 100644
index 00000000..3ce76a88
--- /dev/null
+++ b/gnulib/modules/xstrtol
@@ -0,0 +1,31 @@
+Description:
+Convert string to 'long' or 'unsigned long', with error checking.
+
+Files:
+lib/xstrtol.h
+lib/xstrtol.c
+lib/xstrtoul.c
+lib/xstrtol-error.c
+m4/xstrtol.m4
+
+Depends-on:
+exitfail
+error
+getopt-gnu
+gettext-h
+intprops
+inttypes
+
+configure.ac:
+gl_XSTRTOL
+
+Makefile.am:
+
+Include:
+"xstrtol.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/xstrtol-tests b/gnulib/modules/xstrtol-tests
new file mode 100644
index 00000000..664015b7
--- /dev/null
+++ b/gnulib/modules/xstrtol-tests
@@ -0,0 +1,15 @@
+Files:
+tests/test-xstrtol.c
+tests/test-xstrtoul.c
+tests/test-xstrtol.sh
+
+Depends-on:
+inttypes
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-xstrtol.sh
+check_PROGRAMS += test-xstrtol test-xstrtoul
+test_xstrtol_LDADD = $(LDADD) @LIBINTL@
+test_xstrtoul_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/xstrtold b/gnulib/modules/xstrtold
new file mode 100644
index 00000000..a29769c8
--- /dev/null
+++ b/gnulib/modules/xstrtold
@@ -0,0 +1,25 @@
+Description:
+Convert string to 'long double', with error checking.
+
+Files:
+lib/xstrtod.h
+lib/xstrtod.c
+lib/xstrtold.c
+m4/xstrtod.m4
+
+Depends-on:
+stdbool
+
+configure.ac:
+gl_XSTRTOLD
+
+Makefile.am:
+
+Include:
+"xstrtod.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/xstrtoll b/gnulib/modules/xstrtoll
new file mode 100644
index 00000000..a5da2114
--- /dev/null
+++ b/gnulib/modules/xstrtoll
@@ -0,0 +1,30 @@
+Description:
+Convert string to 'long long' or 'unsigned long long', with error checking.
+
+Files:
+lib/xstrtoll.c
+lib/xstrtoull.c
+
+Depends-on:
+strtoll
+strtoull
+xstrtol
+
+configure.ac:
+AC_LIBOBJ([xstrtoll])
+AC_LIBOBJ([xstrtoull])
+AC_TYPE_LONG_LONG_INT
+test $ac_cv_type_long_long_int = no \
+ && AC_MSG_ERROR(
+ [you lack long long support; required by gnulib's xstrtoll module])
+
+Makefile.am:
+
+Include:
+"xstrtol.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/xstrtoll-tests b/gnulib/modules/xstrtoll-tests
new file mode 100644
index 00000000..bef462ae
--- /dev/null
+++ b/gnulib/modules/xstrtoll-tests
@@ -0,0 +1,17 @@
+Files:
+tests/init.sh
+tests/test-xstrtol.c
+tests/test-xstrtoll.c
+tests/test-xstrtoull.c
+tests/test-xstrtoll.sh
+
+Depends-on:
+inttypes
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-xstrtoll.sh
+check_PROGRAMS += test-xstrtoll test-xstrtoull
+test_xstrtoll_LDADD = $(LDADD) $(LIBINTL)
+test_xstrtoull_LDADD = $(LDADD) $(LIBINTL)
diff --git a/gnulib/modules/xstrtoumax b/gnulib/modules/xstrtoumax
new file mode 100644
index 00000000..0d8ad36f
--- /dev/null
+++ b/gnulib/modules/xstrtoumax
@@ -0,0 +1,23 @@
+Description:
+Convert string to 'uintmax_t', with error checking.
+
+Files:
+lib/xstrtoumax.c
+
+Depends-on:
+xstrtol
+strtoumax
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xstrtoumax.c
+
+Include:
+"xstrtol.h"
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert
diff --git a/gnulib/modules/xstrtoumax-tests b/gnulib/modules/xstrtoumax-tests
new file mode 100644
index 00000000..67b30c5c
--- /dev/null
+++ b/gnulib/modules/xstrtoumax-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-xstrtoumax.c
+tests/test-xstrtoumax.sh
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-xstrtoumax.sh
+check_PROGRAMS += test-xstrtoumax
+test_xstrtoumax_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/xsublist b/gnulib/modules/xsublist
new file mode 100644
index 00000000..e3b7cf85
--- /dev/null
+++ b/gnulib/modules/xsublist
@@ -0,0 +1,24 @@
+Description:
+Sequential list data type backed by another list, with out-of-memory checking.
+
+Files:
+lib/gl_xsublist.h
+lib/gl_xsublist.c
+
+Depends-on:
+sublist
+xalloc-die
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += gl_xsublist.h gl_xsublist.c
+
+Include:
+"gl_xsublist.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/xvasprintf b/gnulib/modules/xvasprintf
new file mode 100644
index 00000000..a931d7c9
--- /dev/null
+++ b/gnulib/modules/xvasprintf
@@ -0,0 +1,37 @@
+Description:
+vasprintf and asprintf with out-of-memory checking. Also see xalloc-die.
+
+Notice:
+If you are using GNU gettext version 0.16.1 or older, add the following options
+to XGETTEXT_OPTIONS in your po/Makevars: --flag=xasprintf:1:c-format
+
+Files:
+lib/xvasprintf.h
+lib/xvasprintf.c
+lib/xasprintf.c
+lib/xalloc.h
+m4/xvasprintf.m4
+
+Depends-on:
+vasprintf
+xalloc-die
+xsize
+stdarg
+errno
+
+configure.ac:
+gl_XVASPRINTF
+m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--flag=xasprintf:1:c-format])])
+
+Makefile.am:
+lib_SOURCES += xvasprintf.h xvasprintf.c xasprintf.c
+
+Include:
+"xvasprintf.h"
+
+License:
+GPL
+
+Maintainer:
+Oskar Liljeblad
diff --git a/gnulib/modules/xvasprintf-posix b/gnulib/modules/xvasprintf-posix
new file mode 100644
index 00000000..b95ebb8f
--- /dev/null
+++ b/gnulib/modules/xvasprintf-posix
@@ -0,0 +1,23 @@
+Description:
+vasprintf and asprintf with POSIX compatible format string interpretation and
+with out-of-memory checking. Also see xalloc-die.
+
+Files:
+
+Depends-on:
+xvasprintf
+vasprintf-posix
+
+configure.ac:
+
+Makefile.am:
+
+Include:
+"xvasprintf.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+
diff --git a/gnulib/modules/xvasprintf-tests b/gnulib/modules/xvasprintf-tests
new file mode 100644
index 00000000..77d536eb
--- /dev/null
+++ b/gnulib/modules/xvasprintf-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-xvasprintf.c
+tests/macros.h
+
+Depends-on:
+progname
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-xvasprintf
+check_PROGRAMS += test-xvasprintf
+test_xvasprintf_LDADD = $(LDADD) @LIBINTL@
+
diff --git a/gnulib/modules/y0 b/gnulib/modules/y0
new file mode 100644
index 00000000..0c0ea34d
--- /dev/null
+++ b/gnulib/modules/y0
@@ -0,0 +1,24 @@
+Description:
+y0() function: Bessel function of the second kind of order 0.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([y0])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(Y0_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/y0-tests b/gnulib/modules/y0-tests
new file mode 100644
index 00000000..77eef72a
--- /dev/null
+++ b/gnulib/modules/y0-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-y0.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-y0
+check_PROGRAMS += test-y0
+test_y0_LDADD = $(LDADD) @Y0_LIBM@
diff --git a/gnulib/modules/y1 b/gnulib/modules/y1
new file mode 100644
index 00000000..e5ae84f2
--- /dev/null
+++ b/gnulib/modules/y1
@@ -0,0 +1,24 @@
+Description:
+y1() function: Bessel function of the second kind of order 1.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([y1])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(Y1_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/y1-tests b/gnulib/modules/y1-tests
new file mode 100644
index 00000000..7747ad3f
--- /dev/null
+++ b/gnulib/modules/y1-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-y1.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-y1
+check_PROGRAMS += test-y1
+test_y1_LDADD = $(LDADD) @Y1_LIBM@
diff --git a/gnulib/modules/yesno b/gnulib/modules/yesno
new file mode 100644
index 00000000..2b958457
--- /dev/null
+++ b/gnulib/modules/yesno
@@ -0,0 +1,27 @@
+Description:
+Read a response from the user, and its classification as matching "yes" or
+"no".
+
+Files:
+lib/yesno.c
+lib/yesno.h
+m4/yesno.m4
+
+Depends-on:
+getline
+rpmatch
+stdbool
+
+configure.ac:
+gl_YESNO
+
+Makefile.am:
+
+Include:
+"yesno.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering
diff --git a/gnulib/modules/yesno-tests b/gnulib/modules/yesno-tests
new file mode 100644
index 00000000..01ba8e1d
--- /dev/null
+++ b/gnulib/modules/yesno-tests
@@ -0,0 +1,14 @@
+Files:
+tests/test-yesno.c
+tests/test-yesno.sh
+
+Depends-on:
+closein
+binary-io
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-yesno.sh
+check_PROGRAMS += test-yesno
+test_yesno_LDADD = $(LDADD) @LIBINTL@
diff --git a/gnulib/modules/yield b/gnulib/modules/yield
new file mode 100644
index 00000000..24ffcdd2
--- /dev/null
+++ b/gnulib/modules/yield
@@ -0,0 +1,29 @@
+Description:
+Yielding the processor to other threads.
+
+Files:
+lib/glthread/yield.h
+m4/yield.m4
+
+Depends-on:
+threadlib
+
+configure.ac:
+gl_YIELD
+
+Makefile.am:
+lib_SOURCES += glthread/yield.h
+
+Include:
+"glthread/yield.h"
+
+Link:
+$(LTLIBTHREAD) when linking with libtool, $(LIBTHREAD) otherwise
+$(YIELD_LIB)
+
+License:
+LGPLv2+
+
+Maintainer:
+Yoann Vandoorselaere
+
diff --git a/gnulib/modules/yn b/gnulib/modules/yn
new file mode 100644
index 00000000..8db13084
--- /dev/null
+++ b/gnulib/modules/yn
@@ -0,0 +1,24 @@
+Description:
+yn() function: Bessel function of the second kind of order n.
+
+Files:
+m4/mathfunc.m4
+
+Depends-on:
+
+configure.ac:
+gl_COMMON_DOUBLE_MATHFUNC([yn])
+
+Makefile.am:
+
+Include:
+<math.h>
+
+Link:
+$(YN_LIBM)
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
diff --git a/gnulib/modules/yn-tests b/gnulib/modules/yn-tests
new file mode 100644
index 00000000..6dbea0bb
--- /dev/null
+++ b/gnulib/modules/yn-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-yn.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-yn
+check_PROGRAMS += test-yn
+test_yn_LDADD = $(LDADD) @YN_LIBM@
diff --git a/gnulib/posix-modules b/gnulib/posix-modules
new file mode 100755
index 00000000..19670a48
--- /dev/null
+++ b/gnulib/posix-modules
@@ -0,0 +1,267 @@
+#!/bin/sh
+#
+# Copyright (C) 2002-2010 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/>.
+#
+
+progname=$0
+package=gnulib
+
+# func_usage
+# outputs to stdout the --help usage message.
+func_usage ()
+{
+ echo "\
+Usage: posix-modules
+
+Report bugs to <bug-gnulib@gnu.org>."
+}
+
+# func_version
+# outputs to stdout the --version message.
+func_version ()
+{
+ func_gnulib_dir
+ if test -d "$gnulib_dir"/.git \
+ && (git --version) >/dev/null 2>/dev/null \
+ && (date --version) >/dev/null 2>/dev/null; then
+ # gnulib checked out from git.
+ sed_extract_first_date='/^Date/{
+s/^Date:[ ]*//p
+q
+}'
+ date=`cd "$gnulib_dir" && git log ChangeLog | sed -n -e "$sed_extract_first_date"`
+ # Turn "Fri Mar 21 07:16:51 2008 -0600" into "Mar 21 2008 07:16:51 -0600".
+ sed_year_before_time='s/^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) /\1 \2 \4 \3 /'
+ date=`echo "$date" | sed -e "$sed_year_before_time"`
+ # Use GNU date to compute the time in GMT.
+ date=`date -d "$date" -u +"%Y-%m-%d %H:%M:%S"`
+ version=' '`cd "$gnulib_dir" && ./build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
+ else
+ if test -d "$gnulib_dir"/CVS \
+ && (cvs --version) >/dev/null 2>/dev/null; then
+ # gnulib checked out from CVS.
+ sed_extract_first_date='/^date: /{
+s/^date: \([0-9][0-9][0-9][0-9]\).\([0-9][0-9]\).\([0-9][0-9]\) \([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1-\2-\3 \4/p
+q
+}'
+ date=`cd "$gnulib_dir" && cvs log -N ChangeLog 2>/dev/null | sed -n -e "$sed_extract_first_date"`
+ else
+ # gnulib copy without versioning information.
+ date=`sed -e 's/ .*//;q' "$gnulib_dir"/ChangeLog`
+ fi
+ version=
+ fi
+ year=`"$gnulib_dir"/build-aux/mdate-sh "$self_abspathname" | sed 's,^.* ,,'`
+ echo "\
+posix-modules (GNU $package $date)$version
+Copyright (C) $year Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by" "Bruno Haible"
+}
+
+# func_exit STATUS
+# exits with a given status.
+# This function needs to be used, rather than 'exit', when a 'trap' handler is
+# in effect that refers to $?.
+func_exit ()
+{
+ (exit $1); exit $1
+}
+
+# func_gnulib_dir
+# locates the directory where the gnulib repository lives
+# Input:
+# - progname name of this program
+# Sets variables
+# - self_abspathname absolute pathname of this program
+# - gnulib_dir absolute pathname of gnulib repository
+func_gnulib_dir ()
+{
+ case "$progname" in
+ /*) self_abspathname="$progname" ;;
+ */*) self_abspathname=`pwd`/"$progname" ;;
+ *)
+ # Look in $PATH.
+ # Iterate through the elements of $PATH.
+ # We use IFS=: instead of
+ # for d in `echo ":$PATH:" | sed -e 's/:::*/:.:/g' | sed -e 's/:/ /g'`
+ # because the latter does not work when some PATH element contains spaces.
+ # We use a canonicalized $pathx instead of $PATH, because empty PATH
+ # elements are by definition equivalent to '.', however field splitting
+ # according to IFS=: loses empty fields in many shells:
+ # - /bin/sh on OSF/1 and Solaris loses all empty fields (at the
+ # beginning, at the end, and in the middle),
+ # - /bin/sh on IRIX and /bin/ksh on IRIX and OSF/1 lose empty fields
+ # at the beginning and at the end,
+ # - GNU bash, /bin/sh on AIX and HP-UX, and /bin/ksh on AIX, HP-UX,
+ # Solaris lose empty fields at the end.
+ # The 'case' statement is an optimization, to avoid evaluating the
+ # explicit canonicalization command when $PATH contains no empty fields.
+ self_abspathname=
+ if test "${PATH_SEPARATOR+set}" != set; then
+ func_tmpdir
+ { echo "#! /bin/sh"; echo "exit 0"; } > "$tmp"/conf.sh
+ chmod +x "$tmp"/conf.sh
+ if (PATH="/nonexistent;$tmp"; conf.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -rf "$tmp"
+ fi
+ if test "$PATH_SEPARATOR" = ";"; then
+ # On Windows, programs are searched in "." before $PATH.
+ pathx=".;$PATH"
+ else
+ # On Unix, we have to convert empty PATH elements to ".".
+ pathx="$PATH"
+ case :$PATH: in
+ *::*)
+ pathx=`echo ":$PATH:" | sed -e 's/:::*/:.:/g' -e 's/^://' -e 's/:\$//'`
+ ;;
+ esac
+ fi
+ save_IFS="$IFS"
+ IFS="$PATH_SEPARATOR"
+ for d in $pathx; do
+ IFS="$save_IFS"
+ test -z "$d" && d=.
+ if test -x "$d/$progname" && test ! -d "$d/$progname"; then
+ self_abspathname="$d/$progname"
+ break
+ fi
+ done
+ IFS="$save_IFS"
+ if test -z "$self_abspathname"; then
+ func_fatal_error "could not locate the posix-modules program - how did you invoke it?"
+ fi
+ ;;
+ esac
+ while test -h "$self_abspathname"; do
+ # Resolve symbolic link.
+ linkval=`func_readlink "$self_abspathname"`
+ test -n "$linkval" || break
+ case "$linkval" in
+ /* ) self_abspathname="$linkval" ;;
+ * ) self_abspathname=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`/"$linkval" ;;
+ esac
+ done
+ gnulib_dir=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`
+}
+
+# func_tmpdir
+# creates a temporary directory.
+# Input:
+# - progname name of this program
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gl$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$progname: cannot create a temporary directory in $TMPDIR" >&2
+ func_exit 1
+ }
+}
+
+# func_fatal_error message
+# outputs to stderr a fatal error message, and terminates the program.
+# Input:
+# - progname name of this program
+func_fatal_error ()
+{
+ echo "$progname: *** $1" 1>&2
+ echo "$progname: *** Stop." 1>&2
+ func_exit 1
+}
+
+# func_readlink SYMLINK
+# outputs the target of the given symlink.
+if (type -p readlink) > /dev/null 2>&1; then
+ func_readlink ()
+ {
+ # Use the readlink program from GNU coreutils.
+ readlink "$1"
+ }
+else
+ func_readlink ()
+ {
+ # Use two sed invocations. A single sed -n -e 's,^.* -> \(.*\)$,\1,p'
+ # would do the wrong thing if the link target contains " -> ".
+ LC_ALL=C ls -l "$1" | sed -e 's, -> ,#%%#,' | sed -n -e 's,^.*#%%#\(.*\)$,\1,p'
+ }
+fi
+
+# Command-line option processing.
+while test $# -gt 0; do
+ case "$1" in
+ --help | --hel | --he | --h )
+ func_usage
+ exit $? ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v )
+ func_version
+ exit $? ;;
+ -* )
+ echo "posix-modules: unknown option $1" 1>&2
+ echo "Try 'posix-modules --help' for more information." 1>&2
+ exit 1 ;;
+ * )
+ echo "posix-modules: too many arguments" 1>&2
+ echo "Try 'posix-modules --help' for more information." 1>&2
+ exit 1 ;;
+ esac
+done
+
+func_gnulib_dir
+(
+ # Get the header modules.
+ LC_ALL=C grep -h '^Gnulib module: ' "$gnulib_dir"/doc/posix-headers/* 2>/dev/null \
+ | sed -e 's,^Gnulib module: ,,'
+ # Get the function modules.
+ LC_ALL=C grep -h '^Gnulib module: ' "$gnulib_dir"/doc/posix-functions/* 2>/dev/null \
+ | sed -e 's,^Gnulib module: ,,'
+ # Then filter out the words "---", ",", "and", "or" and remove *-gnu modules.
+) | sed -e 's/,/ /g' | LC_ALL=C sort | LC_ALL=C uniq \
+ | { # Then filter out the words "---", "and", "or" and remove *-gnu modules.
+ tr ' ' '\012' | sed -e '/^---$/d' -e '/^and$/d' -e '/^or$/d' -e '/-gnu$/d'
+ } \
+ | LC_ALL=C sort | LC_ALL=C uniq
+
+# Local Variables:
+# indent-tabs-mode: nil
+# whitespace-check-buffer-indent: nil
+# End:
diff --git a/gnulib/tests/init.sh b/gnulib/tests/init.sh
new file mode 100644
index 00000000..3154f595
--- /dev/null
+++ b/gnulib/tests/init.sh
@@ -0,0 +1,345 @@
+# source this file; set up for tests
+
+# Copyright (C) 2009, 2010 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/>.
+
+# Using this file in a test
+# =========================
+#
+# The typical skeleton of a test looks like this:
+#
+# #!/bin/sh
+# : ${srcdir=.}
+# . "$srcdir/init.sh"; path_prepend_ .
+# Execute some commands.
+# Note that these commands are executed in a subdirectory, therefore you
+# need to prepend "../" to relative filenames in the build directory.
+# Set the exit code 0 for success, 77 for skipped, or 1 or other for failure.
+# Use the skip_ and fail_ functions to print a diagnostic and then exit
+# with the corresponding exit code.
+# Exit $?
+
+# Executing a test that uses this file
+# ====================================
+#
+# Running a single test:
+# $ make check TESTS=test-foo.sh
+#
+# Running a single test, with verbose output:
+# $ make check TESTS=test-foo.sh VERBOSE=yes
+#
+# Running a single test, with single-stepping:
+# 1. Go into a sub-shell:
+# $ bash
+# 2. Set relevant environment variables from TESTS_ENVIRONMENT in the
+# Makefile:
+# $ export srcdir=../../tests # this is an example
+# 3. Execute the commands from the test, copy&pasting them one by one:
+# $ . "$srcdir/init.sh"; path_prepend_ .
+# ...
+# 4. Finally
+# $ exit
+
+# We require $(...) support unconditionally.
+# We require a few additional shell features only when $EXEEXT is nonempty,
+# in order to support automatic $EXEEXT emulation:
+# - hyphen-containing alias names
+# - we prefer to use ${var#...} substitution, rather than having
+# to work around lack of support for that feature.
+# The following code attempts to find a shell with support for these features
+# and re-exec's it. If not, it skips the current test.
+
+gl_shell_test_script_='
+test $(echo y) = y || exit 1
+test -z "$EXEEXT" && exit 0
+shopt -s expand_aliases
+alias a-b="echo zoo"
+v=abx
+ test ${v%x} = ab \
+ && test ${v#a} = bx \
+ && test $(a-b) = zoo
+'
+
+if test "x$1" = "x--no-reexec"; then
+ shift
+else
+ for re_shell_ in "${CONFIG_SHELL:-no_shell}" /bin/sh bash dash zsh pdksh fail
+ do
+ test "$re_shell_" = no_shell && continue
+ test "$re_shell_" = fail && skip_ failed to find an adequate shell
+ if "$re_shell_" -c "$gl_shell_test_script_" 2>/dev/null; then
+ exec "$re_shell_" "$0" --no-reexec "$@"
+ echo "$ME_: exec failed" 1>&2
+ exit 127
+ fi
+ done
+fi
+
+test -n "$EXEEXT" && shopt -s expand_aliases
+
+# We use a trap below for cleanup. This requires us to go through
+# hoops to get the right exit status transported through the handler.
+# So use `Exit STATUS' instead of `exit STATUS' inside of the tests.
+# Turn off errexit here so that we don't trip the bug with OSF1/Tru64
+# sh inside this function.
+Exit () { set +e; (exit $1); exit $1; }
+
+fail_() { echo "$ME_: failed test: $@" 1>&2; Exit 1; }
+skip_() { echo "$ME_: skipped test: $@" 1>&2; Exit 77; }
+
+# This is a stub function that is run upon trap (upon regular exit and
+# interrupt). Override it with a per-test function, e.g., to unmount
+# a partition, or to undo any other global state changes.
+cleanup_() { :; }
+
+if ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
+ compare() { diff -u "$@"; }
+elif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
+ compare() { cmp -s "$@"; }
+else
+ compare() { cmp "$@"; }
+fi
+
+# An arbitrary prefix to help distinguish test directories.
+testdir_prefix_() { printf gt; }
+
+# Run the user-overridable cleanup_ function, remove the temporary
+# directory and exit with the incoming value of $?.
+remove_tmp_()
+{
+ __st=$?
+ cleanup_
+ # cd out of the directory we're about to remove
+ cd "$initial_cwd_" || cd / || cd /tmp
+ chmod -R u+rwx "$test_dir_"
+ # If removal fails and exit status was to be 0, then change it to 1.
+ rm -rf "$test_dir_" || { test $__st = 0 && __st=1; }
+ exit $__st
+}
+
+# Given a directory name, DIR, if every entry in it that matches *.exe
+# contains only the specified bytes (see the case stmt below), then print
+# a space-separated list of those names and return 0. Otherwise, don't
+# print anything and return 1. Naming constraints apply also to DIR.
+find_exe_basenames_()
+{
+ feb_dir_=$1
+ feb_fail_=0
+ feb_result_=
+ feb_sp_=
+ for feb_file_ in $feb_dir_/*.exe; do
+ case $feb_file_ in
+ *[!-a-zA-Z/0-9_.+]*) feb_fail_=1; break;;
+ *) # Remove leading file name components as well as the .exe suffix.
+ feb_file_=${feb_file_##*/}
+ feb_file_=${feb_file_%.exe}
+ feb_result_="$feb_result_$feb_sp_$feb_file_";;
+ esac
+ feb_sp_=' '
+ done
+ test $feb_fail_ = 0 && printf %s "$feb_result_"
+ return $feb_fail_
+}
+
+# Consider the files in directory, $1.
+# For each file name of the form PROG.exe, create an alias named
+# PROG that simply invokes PROG.exe, then return 0. If any selected
+# file name or the directory name, $1, contains an unexpected character,
+# define no function and return 1.
+create_exe_shims_()
+{
+ case $EXEEXT in
+ '') return 0 ;;
+ .exe) ;;
+ *) echo "$0: unexpected \$EXEEXT value: $EXEEXT" 1>&2; return 1 ;;
+ esac
+
+ base_names_=`find_exe_basenames_ $1` \
+ || { echo "$0 (exe_shim): skipping directory: $1" 1>&2; return 1; }
+
+ if test -n "$base_names_"; then
+ for base_ in $base_names_; do
+ alias "$base_"="$base_$EXEEXT"
+ done
+ fi
+
+ return 0
+}
+
+# Use this function to prepend to PATH an absolute name for each
+# specified, possibly-$initial_cwd_-relative, directory.
+path_prepend_()
+{
+ while test $# != 0; do
+ path_dir_=$1
+ case $path_dir_ in
+ '') fail_ "invalid path dir: '$1'";;
+ /*) abs_path_dir_=$path_dir_;;
+ *) abs_path_dir_=`cd "$initial_cwd_/$path_dir_" && echo "$PWD"` \
+ || fail_ "invalid path dir: $path_dir_";;
+ esac
+ case $abs_path_dir_ in
+ *:*) fail_ "invalid path dir: '$abs_path_dir_'";;
+ esac
+ PATH="$abs_path_dir_:$PATH"
+
+ # Create an alias, FOO, for each FOO.exe in this directory.
+ create_exe_shims_ "$abs_path_dir_" \
+ || fail_ "something failed (above): $abs_path_dir_"
+ shift
+ done
+ export PATH
+}
+
+setup_()
+{
+ test "$VERBOSE" = yes && set -x
+
+ initial_cwd_=$PWD
+ ME_=`expr "./$0" : '.*/\(.*\)$'`
+
+ pfx_=`testdir_prefix_`
+ test_dir_=`mktempd_ "$initial_cwd_" "$pfx_-$ME_.XXXX"` \
+ || fail_ "failed to create temporary directory in $initial_cwd_"
+ cd "$test_dir_"
+
+ # This pair of trap statements ensures that the temporary directory,
+ # $test_dir_, is removed upon exit as well as upon catchable signal.
+ trap remove_tmp_ 0
+ trap 'Exit $?' 1 2 13 15
+}
+
+# Create a temporary directory, much like mktemp -d does.
+# Written by Jim Meyering.
+#
+# Usage: mktempd_ /tmp phoey.XXXXXXXXXX
+#
+# First, try to use the mktemp program.
+# Failing that, we'll roll our own mktemp-like function:
+# - try to get random bytes from /dev/urandom
+# - failing that, generate output from a combination of quickly-varying
+# sources and gzip. Ignore non-varying gzip header, and extract
+# "random" bits from there.
+# - given those bits, map to file-name bytes using tr, and try to create
+# the desired directory.
+# - make only $MAX_TRIES_ attempts
+
+# Helper function. Print $N pseudo-random bytes from a-zA-Z0-9.
+rand_bytes_()
+{
+ n_=$1
+
+ # Maybe try openssl rand -base64 $n_prime_|tr '+/=\012' abcd first?
+ # But if they have openssl, they probably have mktemp, too.
+
+ chars_=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
+ dev_rand_=/dev/urandom
+ if test -r "$dev_rand_"; then
+ # Note: 256-length($chars_) == 194; 3 copies of $chars_ is 186 + 8 = 194.
+ dd ibs=$n_ count=1 if=$dev_rand_ 2>/dev/null \
+ | tr -c $chars_ 01234567$chars_$chars_$chars_
+ return
+ fi
+
+ n_plus_50_=`expr $n_ + 50`
+ cmds_='date; date +%N; free; who -a; w; ps auxww; ps ef; netstat -n'
+ data_=` (eval "$cmds_") 2>&1 | gzip `
+
+ # Ensure that $data_ has length at least 50+$n_
+ while :; do
+ len_=`echo "$data_"|wc -c`
+ test $n_plus_50_ -le $len_ && break;
+ data_=` (echo "$data_"; eval "$cmds_") 2>&1 | gzip `
+ done
+
+ echo "$data_" \
+ | dd bs=1 skip=50 count=$n_ 2>/dev/null \
+ | tr -c $chars_ 01234567$chars_$chars_$chars_
+}
+
+mktempd_()
+{
+ case $# in
+ 2);;
+ *) fail_ "Usage: $ME DIR TEMPLATE";;
+ esac
+
+ destdir_=$1
+ template_=$2
+
+ MAX_TRIES_=4
+
+ # Disallow any trailing slash on specified destdir:
+ # it would subvert the post-mktemp "case"-based destdir test.
+ case $destdir_ in
+ /) ;;
+ */) fail_ "invalid destination dir: remove trailing slash(es)";;
+ esac
+
+ case $template_ in
+ *XXXX) ;;
+ *) fail_ "invalid template: $template_ (must have a suffix of at least 4 X's)";;
+ esac
+
+ fail=0
+
+ # First, try to use mktemp.
+ d=`env -u TMPDIR mktemp -d -t -p "$destdir_" "$template_" 2>/dev/null` \
+ || fail=1
+
+ # The resulting name must be in the specified directory.
+ case $d in "$destdir_"*);; *) fail=1;; esac
+
+ # It must have created the directory.
+ test -d "$d" || fail=1
+
+ # It must have 0700 permissions. Handle sticky "S" bits.
+ perms=`ls -dgo "$d" 2>/dev/null|tr S -` || fail=1
+ case $perms in drwx------*) ;; *) fail=1;; esac
+
+ test $fail = 0 && {
+ echo "$d"
+ return
+ }
+
+ # If we reach this point, we'll have to create a directory manually.
+
+ # Get a copy of the template without its suffix of X's.
+ base_template_=`echo "$template_"|sed 's/XX*$//'`
+
+ # Calculate how many X's we've just removed.
+ template_length_=`echo "$template_" | wc -c`
+ nx_=`echo "$base_template_" | wc -c`
+ nx_=`expr $template_length_ - $nx_`
+
+ err_=
+ i_=1
+ while :; do
+ X_=`rand_bytes_ $nx_`
+ candidate_dir_="$destdir_/$base_template_$X_"
+ err_=`mkdir -m 0700 "$candidate_dir_" 2>&1` \
+ && { echo "$candidate_dir_"; return; }
+ test $MAX_TRIES_ -le $i_ && break;
+ i_=`expr $i_ + 1`
+ done
+ fail_ "$err_"
+}
+
+# If you want to override the testdir_prefix_ function,
+# or to add more utility functions, use this file.
+test -f "$srcdir/init.cfg" \
+ && . "$srcdir/init.cfg"
+
+setup_ "$@"
diff --git a/gnulib/tests/macros.h b/gnulib/tests/macros.h
new file mode 100644
index 00000000..11db5a8a
--- /dev/null
+++ b/gnulib/tests/macros.h
@@ -0,0 +1,64 @@
+/* Common macros used by gnulib tests.
+ Copyright (C) 2006-2010 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/>. */
+
+
+/* This file contains macros that are used by many gnulib tests.
+ Put here only frequently used macros, say, used by 10 tests or more. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Define ASSERT_STREAM before including this file if ASSERT must
+ target a stream other than stderr. */
+#ifndef ASSERT_STREAM
+# define ASSERT_STREAM stderr
+#endif
+
+/* ASSERT (condition);
+ verifies that the specified condition is fulfilled. If not, a message
+ is printed to ASSERT_STREAM if defined (defaulting to stderr if
+ undefined) and the program is terminated with an error code.
+
+ This macro has the following properties:
+ - The programmer specifies the expected condition, not the failure
+ condition. This simplifies thinking.
+ - The condition is tested always, regardless of compilation flags.
+ (Unlike the macro from <assert.h>.)
+ - On Unix platforms, the tester can debug the test program with a
+ debugger (provided core dumps are enabled: "ulimit -c unlimited").
+ - For the sake of platforms where no debugger is available (such as
+ some mingw systems), an error message is printed on the error
+ stream that includes the source location of the ASSERT invocation.
+ */
+#define ASSERT(expr) \
+ do \
+ { \
+ if (!(expr)) \
+ { \
+ fprintf (ASSERT_STREAM, "%s:%d: assertion failed\n", \
+ __FILE__, __LINE__); \
+ fflush (ASSERT_STREAM); \
+ abort (); \
+ } \
+ } \
+ while (0)
+
+/* SIZEOF (array)
+ returns the number of elements of an array. It works for arrays that are
+ declared outside functions and for local variables of array type. It does
+ *not* work for function parameters of array type, because they are actually
+ parameters of pointer type. */
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
diff --git a/gnulib/tests/nan.h b/gnulib/tests/nan.h
new file mode 100644
index 00000000..611eed3e
--- /dev/null
+++ b/gnulib/tests/nan.h
@@ -0,0 +1,60 @@
+/* Macros for not-a-number.
+ Copyright (C) 2007-2010 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/>. */
+
+
+/* NaNf () returns a 'float' not-a-number. */
+
+/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
+#ifdef __DECC
+static float
+NaNf ()
+{
+ static float zero = 0.0f;
+ return zero / zero;
+}
+#else
+# define NaNf() (0.0f / 0.0f)
+#endif
+
+
+/* NaNd () returns a 'double' not-a-number. */
+
+/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
+#ifdef __DECC
+static double
+NaNd ()
+{
+ static double zero = 0.0;
+ return zero / zero;
+}
+#else
+# define NaNd() (0.0 / 0.0)
+#endif
+
+
+/* NaNl () returns a 'long double' not-a-number. */
+
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+ runtime type conversion. */
+#ifdef __sgi
+static long double NaNl ()
+{
+ double zero = 0.0;
+ return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
diff --git a/gnulib/tests/nap.h b/gnulib/tests/nap.h
new file mode 100644
index 00000000..b11eb815
--- /dev/null
+++ b/gnulib/tests/nap.h
@@ -0,0 +1,67 @@
+/* Assist in file system timestamp tests.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#ifndef GLTEST_NAP_H
+# define GLTEST_NAP_H
+
+/* Sleep long enough to notice a timestamp difference on the file
+ system in the current directory. Assumes that BASE is defined,
+ and requires that the test module depends on usleep. */
+static void
+nap (void)
+{
+ static long delay;
+ if (!delay)
+ {
+ /* Initialize only once, by sleeping for 20 milliseconds (needed
+ since xfs has a quantization of about 10 milliseconds, even
+ though it has a granularity of 1 nanosecond, and since NTFS
+ has a default quantization of 15.25 milliseconds, even though
+ it has a granularity of 100 nanoseconds). If the seconds
+ differ, repeat the test one more time (in case we crossed a
+ quantization boundary on a file system with 1 second
+ resolution). If we can't observe a difference in only the
+ nanoseconds, then fall back to 1 second if the time is odd,
+ and 2 seconds (needed for FAT) if time is even. */
+ struct stat st1;
+ struct stat st2;
+ ASSERT (close (creat (BASE "tmp", 0600)) == 0);
+ ASSERT (stat (BASE "tmp", &st1) == 0);
+ ASSERT (unlink (BASE "tmp") == 0);
+ delay = 20000;
+ usleep (delay);
+ ASSERT (close (creat (BASE "tmp", 0600)) == 0);
+ ASSERT (stat (BASE "tmp", &st2) == 0);
+ ASSERT (unlink (BASE "tmp") == 0);
+ if (st1.st_mtime != st2.st_mtime)
+ {
+ /* Seconds differ, give it one more shot. */
+ st1 = st2;
+ usleep (delay);
+ ASSERT (close (creat (BASE "tmp", 0600)) == 0);
+ ASSERT (stat (BASE "tmp", &st2) == 0);
+ ASSERT (unlink (BASE "tmp") == 0);
+ }
+ if (! (st1.st_mtime == st2.st_mtime
+ && get_stat_mtime_ns (&st1) < get_stat_mtime_ns (&st2)))
+ delay = (st1.st_mtime & 1) ? 1000000 : 2000000;
+ }
+ usleep (delay);
+}
+
+#endif /* GLTEST_NAP_H */
diff --git a/gnulib/tests/signature.h b/gnulib/tests/signature.h
new file mode 100644
index 00000000..6e15c43a
--- /dev/null
+++ b/gnulib/tests/signature.h
@@ -0,0 +1,48 @@
+/* Macro for checking that a function declaration is compliant.
+ Copyright (C) 2009, 2010 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/>. */
+
+#ifndef SIGNATURE_CHECK
+
+/* Check that the function FN takes the specified arguments ARGS with
+ a return type of RET. This header is designed to be included after
+ <config.h> and the one system header that is supposed to contain
+ the function being checked, but prior to any other system headers
+ that are necessary for the unit test. Therefore, this file does
+ not include any system headers, nor reference anything outside of
+ the macro arguments. For an example, if foo.h should provide:
+
+ extern int foo (char, float);
+
+ then the unit test named test-foo.c would start out with:
+
+ #include <config.h>
+ #include <foo.h>
+ #include "signature.h"
+ SIGNATURE_CHECK (foo, int, (char, float));
+ #include <other.h>
+ ...
+*/
+# define SIGNATURE_CHECK(fn, ret, args) \
+ SIGNATURE_CHECK1 (fn, ret, args, __LINE__)
+
+/* Necessary to allow multiple SIGNATURE_CHECK lines in a unit test.
+ Note that the checks must not occupy the same line. */
+# define SIGNATURE_CHECK1(fn, ret, args, id) \
+ SIGNATURE_CHECK2 (fn, ret, args, id) /* macroexpand line */
+# define SIGNATURE_CHECK2(fn, ret, args, id) \
+ static ret (* _GL_UNUSED signature_check ## id) args = fn
+
+#endif /* SIGNATURE_CHECK */
diff --git a/gnulib/tests/test-acos.c b/gnulib/tests/test-acos.c
new file mode 100644
index 00000000..6abea73e
--- /dev/null
+++ b/gnulib/tests/test-acos.c
@@ -0,0 +1,40 @@
+/* Test of acos() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (acos, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = acos (x);
+ ASSERT (y >= 0.9272952180 && y <= 0.9272952181);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-acosl.c b/gnulib/tests/test-acosl.c
new file mode 100644
index 00000000..9533def5
--- /dev/null
+++ b/gnulib/tests/test-acosl.c
@@ -0,0 +1,45 @@
+/* Test of acosl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (acosl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = acosl (x);
+ ASSERT (y >= 0.9272952180L && y <= 0.9272952181L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-alignof.c b/gnulib/tests/test-alignof.c
new file mode 100644
index 00000000..a8b6d189
--- /dev/null
+++ b/gnulib/tests/test-alignof.c
@@ -0,0 +1,59 @@
+/* Test of <alignof.h>.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <alignof.h>
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "verify.h"
+
+typedef long double longdouble;
+typedef struct { char a[1]; } struct1;
+typedef struct { char a[2]; } struct2;
+typedef struct { char a[3]; } struct3;
+typedef struct { char a[4]; } struct4;
+
+#define CHECK(type) \
+ typedef struct { char slot1; type slot2; } type##_helper; \
+ verify (alignof_slot (type) == offsetof (type##_helper, slot2)); \
+ const int type##_slot_alignment = alignof_slot (type); \
+ const int type##_type_alignment = alignof_type (type);
+
+CHECK (char)
+CHECK (short)
+CHECK (int)
+CHECK (long)
+CHECK (float)
+CHECK (double)
+CHECK (longdouble)
+#ifdef INT64_MAX
+CHECK (int64_t)
+#endif
+CHECK (struct1)
+CHECK (struct2)
+CHECK (struct3)
+CHECK (struct4)
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-alloca-opt.c b/gnulib/tests/test-alloca-opt.c
new file mode 100644
index 00000000..cfbecafc
--- /dev/null
+++ b/gnulib/tests/test-alloca-opt.c
@@ -0,0 +1,62 @@
+/* Test of optional automatic memory allocation.
+ Copyright (C) 2005, 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <alloca.h>
+
+#if HAVE_ALLOCA
+
+static void
+do_allocation (int n)
+{
+ void *ptr = alloca (n);
+ (void) ptr;
+}
+
+void (*func) (int) = do_allocation;
+
+#endif
+
+int
+main ()
+{
+#if HAVE_ALLOCA
+ int i;
+
+ /* Repeat a lot of times, to make sure there's no memory leak. */
+ for (i = 0; i < 100000; i++)
+ {
+ /* Try various values.
+ n = 0 gave a crash on Alpha with gcc-2.5.8.
+ Some versions of MacOS X have a stack size limit of 512 KB. */
+ func (34);
+ func (134);
+ func (399);
+ func (510823);
+ func (129321);
+ func (0);
+ func (4070);
+ func (4095);
+ func (1);
+ func (16582);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-arcfour.c b/gnulib/tests/test-arcfour.c
new file mode 100644
index 00000000..9291f528
--- /dev/null
+++ b/gnulib/tests/test-arcfour.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "arcfour.h"
+
+int
+main (int argc, char *argv[])
+{
+ arcfour_context ctx;
+ /* Test vector from Cryptlib via Libgcrypt labeled there: "from the
+ State/Commerce Department". */
+ static char key_1[] = { 0x61, 0x8A, 0x63, 0xD2, 0xFB };
+ static char plaintext_1[] = { 0xDC, 0xEE, 0x4C, 0xF9, 0x2C };
+ static const char ciphertext_1[] = { 0xF1, 0x38, 0x29, 0xC9, 0xDE };
+ char scratch[16];
+
+ arcfour_setkey (&ctx, key_1, sizeof (key_1));
+ arcfour_stream (&ctx, plaintext_1, scratch, sizeof (plaintext_1));
+ if (memcmp (scratch, ciphertext_1, sizeof (ciphertext_1)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", ciphertext_1[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ /* decrypt */
+
+ arcfour_setkey (&ctx, key_1, sizeof (key_1));
+ arcfour_stream (&ctx, scratch, scratch, sizeof (plaintext_1));
+ if (memcmp (scratch, plaintext_1, sizeof (plaintext_1)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", plaintext_1[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+
+ return 0;
+}
diff --git a/gnulib/tests/test-arctwo.c b/gnulib/tests/test-arctwo.c
new file mode 100644
index 00000000..e2c8d661
--- /dev/null
+++ b/gnulib/tests/test-arctwo.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "arctwo.h"
+
+int
+main (int argc, char *argv[])
+{
+ arctwo_context ctx;
+ char scratch[16];
+
+ /* Test vectors from Peter Gutmann's paper. */
+ static char key_1[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ static char plaintext_1[] =
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ static const char ciphertext_1[] =
+ { 0x1C, 0x19, 0x8A, 0x83, 0x8D, 0xF0, 0x28, 0xB7 };
+
+ static char key_2[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+ };
+ static char plaintext_2[] =
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ static char ciphertext_2[] =
+ { 0x50, 0xDC, 0x01, 0x62, 0xBD, 0x75, 0x7F, 0x31 };
+
+ /* This one was checked against libmcrypt's RFC2268. */
+ static char key_3[] = { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ static char plaintext_3[] =
+ { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ static char ciphertext_3[] =
+ { 0x8f, 0xd1, 0x03, 0x89, 0x33, 0x6b, 0xf9, 0x5e };
+
+ /* From RFC2268. */
+ static char key_4[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ static char plaintext_4[] =
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ static char ciphertext_4[] =
+ { 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff };
+
+ static char key_5[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ static char plaintext_5[] =
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ static char ciphertext_5[] =
+ { 0x27, 0x8b, 0x27, 0xe4, 0x2e, 0x2f, 0x0d, 0x49 };
+
+ static char key_6[] = { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ static char plaintext_6[] =
+ { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
+ static char ciphertext_6[] =
+ { 0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2 };
+
+ /* First test. */
+ arctwo_setkey_ekb (&ctx, sizeof (key_1), key_1, 0);
+ arctwo_encrypt (&ctx, plaintext_1, scratch, ARCTWO_BLOCK_SIZE);
+
+ if (memcmp (scratch, ciphertext_1, sizeof (ciphertext_1)))
+ return 1;
+
+ arctwo_setkey_ekb (&ctx, sizeof (key_1), key_1, 0);
+ arctwo_decrypt (&ctx, scratch, scratch, ARCTWO_BLOCK_SIZE);
+ if (memcmp (scratch, plaintext_1, sizeof (plaintext_1)))
+ return 1;
+
+ /* Second test. */
+ arctwo_setkey_ekb (&ctx, sizeof (key_2), key_2, 0);
+ arctwo_encrypt (&ctx, plaintext_2, scratch, ARCTWO_BLOCK_SIZE);
+ if (memcmp (scratch, ciphertext_2, sizeof (ciphertext_2)))
+ return 1;
+
+ arctwo_setkey_ekb (&ctx, sizeof (key_2), key_2, 0);
+ arctwo_decrypt (&ctx, scratch, scratch, ARCTWO_BLOCK_SIZE);
+ if (memcmp (scratch, plaintext_2, sizeof (plaintext_2)))
+ return 1;
+
+ /* Third test. */
+ arctwo_setkey_ekb (&ctx, sizeof (key_3), key_3, 0);
+ arctwo_encrypt (&ctx, plaintext_3, scratch, ARCTWO_BLOCK_SIZE);
+
+ if (memcmp (scratch, ciphertext_3, sizeof (ciphertext_3)))
+ return 1;
+
+ arctwo_setkey_ekb (&ctx, sizeof (key_3), key_3, 0);
+ arctwo_decrypt (&ctx, scratch, scratch, ARCTWO_BLOCK_SIZE);
+ if (memcmp (scratch, plaintext_3, sizeof (plaintext_3)))
+ return 1;
+
+ /* Fourth test. */
+ arctwo_setkey_ekb (&ctx, sizeof (key_4), key_4, 63);
+ arctwo_encrypt (&ctx, plaintext_4, scratch, ARCTWO_BLOCK_SIZE);
+
+ if (memcmp (scratch, ciphertext_4, sizeof (ciphertext_4)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < sizeof (ciphertext_4); i++)
+ printf ("%02x ", ciphertext_4[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < sizeof (ciphertext_4); i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ arctwo_setkey_ekb (&ctx, sizeof (key_4), key_4, 63);
+ arctwo_decrypt (&ctx, scratch, scratch, ARCTWO_BLOCK_SIZE);
+ if (memcmp (scratch, plaintext_4, sizeof (plaintext_4)))
+ return 1;
+
+ /* Fifth test. */
+ arctwo_setkey_ekb (&ctx, sizeof (key_5), key_5, 64);
+ arctwo_encrypt (&ctx, plaintext_5, scratch, ARCTWO_BLOCK_SIZE);
+
+ if (memcmp (scratch, ciphertext_5, sizeof (ciphertext_5)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < sizeof (ciphertext_5); i++)
+ printf ("%02x ", ciphertext_5[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < sizeof (ciphertext_5); i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ arctwo_setkey_ekb (&ctx, sizeof (key_5), key_5, 64);
+ arctwo_decrypt (&ctx, scratch, scratch, ARCTWO_BLOCK_SIZE);
+ if (memcmp (scratch, plaintext_5, sizeof (plaintext_5)))
+ return 1;
+
+ /* Sixth test. */
+ arctwo_setkey_ekb (&ctx, 8, key_6, 64);
+ arctwo_encrypt (&ctx, plaintext_6, scratch, ARCTWO_BLOCK_SIZE);
+
+ if (memcmp (scratch, ciphertext_6, sizeof (ciphertext_6)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < sizeof (ciphertext_6); i++)
+ printf ("%02x ", ciphertext_6[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < sizeof (ciphertext_6); i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ arctwo_setkey_ekb (&ctx, sizeof (key_6), key_6, 64);
+ arctwo_decrypt (&ctx, scratch, scratch, ARCTWO_BLOCK_SIZE);
+ if (memcmp (scratch, plaintext_6, sizeof (plaintext_6)))
+ return 1;
+
+ return 0;
+}
diff --git a/gnulib/tests/test-areadlink-with-size.c b/gnulib/tests/test-areadlink-with-size.c
new file mode 100644
index 00000000..2344390b
--- /dev/null
+++ b/gnulib/tests/test-areadlink-with-size.c
@@ -0,0 +1,46 @@
+/* Tests of areadlink_with_size.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "areadlink.h"
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-areadlink-with-size.t"
+
+#include "test-areadlink.h"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_areadlink (areadlink_with_size, true);
+}
diff --git a/gnulib/tests/test-areadlink.c b/gnulib/tests/test-areadlink.c
new file mode 100644
index 00000000..c3e58226
--- /dev/null
+++ b/gnulib/tests/test-areadlink.c
@@ -0,0 +1,53 @@
+/* Tests of areadlink.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "areadlink.h"
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-areadlink.t"
+
+#include "test-areadlink.h"
+
+/* Wrapper for testing areadlink. */
+static char *
+do_areadlink (char const *name, size_t ignored _GL_UNUSED)
+{
+ return areadlink (name);
+}
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_areadlink (do_areadlink, true);
+}
diff --git a/gnulib/tests/test-areadlink.h b/gnulib/tests/test-areadlink.h
new file mode 100644
index 00000000..5e2a643b
--- /dev/null
+++ b/gnulib/tests/test-areadlink.h
@@ -0,0 +1,83 @@
+/* Tests of areadlink and friends.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+/* This file is designed to test areadlink(a),
+ areadlink_with_size(a,b), and areadlinkat(AT_FDCWD,a). FUNC is the
+ function to test; a length is always supplied, but may be ignored.
+ Assumes that BASE and ASSERT are already defined, and that
+ appropriate headers are already included. If PRINT, warn before
+ skipping symlink tests with status 77. */
+
+static int
+test_areadlink (char * (*func) (char const *, size_t), bool print)
+{
+ /* Sanity checks of failures. Mingw lacks symlink, but areadlink can
+ still distinguish between various errors. */
+ errno = 0;
+ ASSERT (func ("no_such", 1) == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("no_such/", 1) == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("", 1) == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (".", 1) == NULL);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ ASSERT (func ("./", 1) == NULL);
+ ASSERT (errno == EINVAL);
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ errno = 0;
+ ASSERT (func (BASE "file", 1) == NULL);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ ASSERT (func (BASE "file/", 1) == NULL);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (unlink (BASE "file") == 0);
+
+ /* Now test actual symlinks. */
+ if (symlink (BASE "dir", BASE "link"))
+ {
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ errno = 0;
+ ASSERT (func (BASE "link/", 1) == NULL);
+ ASSERT (errno == EINVAL);
+ {
+ /* Too small a guess is okay. */
+ char *buf = func (BASE "link", 1);
+ ASSERT (buf);
+ ASSERT (strcmp (buf, BASE "dir") == 0);
+ free (buf);
+ /* Too large a guess is okay. */
+ buf = func (BASE "link", 10000000);
+ ASSERT (buf);
+ ASSERT (strcmp (buf, BASE "dir") == 0);
+ free (buf);
+ }
+ ASSERT (rmdir (BASE "dir") == 0);
+ ASSERT (unlink (BASE "link") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-areadlinkat-with-size.c b/gnulib/tests/test-areadlinkat-with-size.c
new file mode 100644
index 00000000..f709ea82
--- /dev/null
+++ b/gnulib/tests/test-areadlinkat-with-size.c
@@ -0,0 +1,89 @@
+/* Tests of areadlinkat_with_size.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "areadlink.h"
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-areadlinkat-with-size.t"
+
+#include "test-areadlink.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper for testing areadlinkat_with_size. */
+static char *
+do_areadlinkat_with_size (char const *name, size_t size)
+{
+ return areadlinkat_with_size (dfd, name, size);
+}
+
+int
+main (void)
+{
+ int result;
+
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Basic tests. */
+ result = test_areadlink (do_areadlinkat_with_size, false);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_areadlink (do_areadlinkat_with_size, false) == result);
+
+ /* Relative tests. */
+ if (result == 77)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ else
+ {
+ char *buf;
+ ASSERT (symlink ("nowhere", BASE "link") == 0);
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (chdir (BASE "dir") == 0);
+ buf = areadlinkat_with_size (dfd, BASE "link", strlen (BASE "link"));
+ ASSERT (buf);
+ ASSERT (strcmp (buf, "nowhere") == 0);
+ free (buf);
+ errno = 0;
+ ASSERT (areadlinkat_with_size (-1, BASE "link", 1) == NULL);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (areadlinkat_with_size (AT_FDCWD, BASE "link", 1) == NULL);
+ ASSERT (errno == ENOENT);
+ ASSERT (chdir ("..") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ ASSERT (unlink (BASE "link") == 0);
+ }
+
+ ASSERT (close (dfd) == 0);
+ return result;
+}
diff --git a/gnulib/tests/test-areadlinkat.c b/gnulib/tests/test-areadlinkat.c
new file mode 100644
index 00000000..c93a2d81
--- /dev/null
+++ b/gnulib/tests/test-areadlinkat.c
@@ -0,0 +1,89 @@
+/* Tests of areadlinkat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "areadlink.h"
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-areadlinkat.t"
+
+#include "test-areadlink.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper for testing areadlinkat. */
+static char *
+do_areadlinkat (char const *name, size_t ignored _GL_UNUSED)
+{
+ return areadlinkat (dfd, name);
+}
+
+int
+main (void)
+{
+ int result;
+
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Basic tests. */
+ result = test_areadlink (do_areadlinkat, false);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_areadlink (do_areadlinkat, false) == result);
+
+ /* Relative tests. */
+ if (result == 77)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ else
+ {
+ char *buf;
+ ASSERT (symlink ("nowhere", BASE "link") == 0);
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (chdir (BASE "dir") == 0);
+ buf = areadlinkat (dfd, BASE "link");
+ ASSERT (buf);
+ ASSERT (strcmp (buf, "nowhere") == 0);
+ free (buf);
+ errno = 0;
+ ASSERT (areadlinkat (-1, BASE "link") == NULL);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (areadlinkat (AT_FDCWD, BASE "link") == NULL);
+ ASSERT (errno == ENOENT);
+ ASSERT (chdir ("..") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ ASSERT (unlink (BASE "link") == 0);
+ }
+
+ ASSERT (close (dfd) == 0);
+ return result;
+}
diff --git a/gnulib/tests/test-argmatch.c b/gnulib/tests/test-argmatch.c
new file mode 100644
index 00000000..807970e2
--- /dev/null
+++ b/gnulib/tests/test-argmatch.c
@@ -0,0 +1,98 @@
+/* Test of exact or abbreviated match search.
+ Copyright (C) 1990, 1998-1999, 2001-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007, based on test code
+ by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+#include "argmatch.h"
+
+#include <stdlib.h>
+
+#include "progname.h"
+#include "macros.h"
+
+/* Some packages define ARGMATCH_DIE and ARGMATCH_DIE_DECL in <config.h>, and
+ thus must link with a definition of that function. Provide it here. */
+#ifdef ARGMATCH_DIE_DECL
+ARGMATCH_DIE_DECL { exit (1); }
+#endif
+
+enum backup_type
+{
+ no_backups,
+ simple_backups,
+ numbered_existing_backups,
+ numbered_backups
+};
+
+static const char *const backup_args[] =
+{
+ "no", "none", "off",
+ "simple", "never", "single",
+ "existing", "nil", "numbered-existing",
+ "numbered", "t", "newstyle",
+ NULL
+};
+
+static const enum backup_type backup_vals[] =
+{
+ no_backups, no_backups, no_backups,
+ simple_backups, simple_backups, simple_backups,
+ numbered_existing_backups, numbered_existing_backups, numbered_existing_backups,
+ numbered_backups, numbered_backups, numbered_backups
+};
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ /* Not found. */
+ ASSERT (ARGMATCH ("klingon", backup_args, backup_vals) == -1);
+
+ /* Exact match. */
+ ASSERT (ARGMATCH ("none", backup_args, backup_vals) == 1);
+ ASSERT (ARGMATCH ("nil", backup_args, backup_vals) == 7);
+
+ /* Too long. */
+ ASSERT (ARGMATCH ("nilpotent", backup_args, backup_vals) == -1);
+
+ /* Abbreviated. */
+ ASSERT (ARGMATCH ("simpl", backup_args, backup_vals) == 3);
+ ASSERT (ARGMATCH ("simp", backup_args, backup_vals) == 3);
+ ASSERT (ARGMATCH ("sim", backup_args, backup_vals) == 3);
+
+ /* Exact match and abbreviated. */
+ ASSERT (ARGMATCH ("numbered", backup_args, backup_vals) == 9);
+ ASSERT (ARGMATCH ("numbere", backup_args, backup_vals) == -2);
+ ASSERT (ARGMATCH ("number", backup_args, backup_vals) == -2);
+ ASSERT (ARGMATCH ("numbe", backup_args, backup_vals) == -2);
+ ASSERT (ARGMATCH ("numb", backup_args, backup_vals) == -2);
+ ASSERT (ARGMATCH ("num", backup_args, backup_vals) == -2);
+ ASSERT (ARGMATCH ("nu", backup_args, backup_vals) == -2);
+ ASSERT (ARGMATCH ("n", backup_args, backup_vals) == -2);
+
+ /* Ambiguous abbreviated. */
+ ASSERT (ARGMATCH ("ne", backup_args, backup_vals) == -2);
+
+ /* Ambiguous abbreviated, but same value. */
+ ASSERT (ARGMATCH ("si", backup_args, backup_vals) == 3);
+ ASSERT (ARGMATCH ("s", backup_args, backup_vals) == 3);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-argp-2.sh b/gnulib/tests/test-argp-2.sh
new file mode 100755
index 00000000..5c0c64ce
--- /dev/null
+++ b/gnulib/tests/test-argp-2.sh
@@ -0,0 +1,113 @@
+#! /bin/sh
+# Test suite for argp.
+# Copyright (C) 2006-2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>. */
+
+TMP=argp.$$
+
+unset ARGP_HELP_FMT
+ERR=0
+
+func_compare() {
+# If argp was compiled without base_name, it will display full program name.
+# If run on mingw, it will display the program name with a .exe suffix.
+ sed '1{
+ s,: [^ ]*/test-argp,: test-argp,
+ s,: test-argp\.exe,: test-argp,
+ }' | LC_ALL=C tr -d '\r' | diff -c $TMP -
+}
+
+####
+# Test --usage output
+cat > $TMP <<EOT
+Usage: test-argp [-tvCSOlp?V] [-f FILE] [-r FILE] [-o[ARG]] [--test]
+ [--file=FILE] [--input=FILE] [--read=FILE] [--verbose] [--cantiga]
+ [--sonet] [--option] [--optional[=ARG]] [--limerick] [--poem]
+ [--help] [--usage] [--version] ARGS...
+EOT
+
+./test-argp$EXEEXT --usage | func_compare || ERR=1
+
+####
+# Test working usage-indent format
+
+cat > $TMP <<EOT
+Usage: test-argp [-tvCSOlp?V] [-f FILE] [-r FILE] [-o[ARG]] [--test]
+[--file=FILE] [--input=FILE] [--read=FILE] [--verbose] [--cantiga] [--sonet]
+[--option] [--optional[=ARG]] [--limerick] [--poem] [--help] [--usage]
+[--version] ARGS...
+EOT
+
+ARGP_HELP_FMT='usage-indent=0' ./test-argp$EXEEXT --usage | func_compare || ERR=1
+
+####
+# Test --help output
+cat >$TMP <<EOT
+Usage: test-argp [OPTION...] ARGS...
+documentation string
+
+ Main options
+ -t, --test
+
+ Option Group 1
+ -f, -r, --file=FILE, --input=FILE, --read=FILE
+ Option with a mandatory argument
+ -v, --verbose Simple option without arguments
+
+ Option Group 1.1
+ -C, --cantiga create a cantiga
+ -S, --sonet create a sonet
+
+ Option Group 2
+ -O, --option An option
+
+ -o, --optional[=ARG] Option with an optional argument. ARG is one of
+ the following:
+
+ many many units
+ one one unit
+ two two units
+
+ Option Group 2.1
+ -l, --limerick create a limerick
+ -p, --poem create a poem
+
+ -?, --help give this help list
+ --usage give a short usage message
+ -V, --version print program version
+
+Mandatory or optional arguments to long options are also mandatory or optional
+for any corresponding short options.
+
+Report bugs to <>.
+EOT
+
+# Compare --help output, but filter out any bug-reporting email address.
+./test-argp$EXEEXT --help \
+ | sed 's/^\(Report bugs to \)<[^>]*>.$/\1<>./' | func_compare || ERR=1
+
+####
+# Test ambiguous option handling
+
+./test-argp$EXEEXT --optio 2>/dev/null && ERR=1
+
+####
+# Run built-in tests
+./test-argp$EXEEXT || ERR=1
+
+rm $TMP
+
+exit $ERR
diff --git a/gnulib/tests/test-argp-version-etc-1.sh b/gnulib/tests/test-argp-version-etc-1.sh
new file mode 100755
index 00000000..7ef5b9a8
--- /dev/null
+++ b/gnulib/tests/test-argp-version-etc-1.sh
@@ -0,0 +1,43 @@
+#! /bin/sh
+# Test suite for argp-version-etc.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=ave-expected.tmp
+LC_ALL=C
+export LC_ALL
+ERR=0
+
+cat > $TMP <<EOT
+test-argp-version-etc (PROJECT) VERSION
+COPYRIGHT Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by Sergey Poznyakoff.
+EOT
+
+./test-argp-version-etc${EXEEXT} --version |
+ sed '1s/test-argp-version-etc (.*) .*/test-argp-version-etc (PROJECT) VERSION/
+ /^Packaged by/d
+ 2,3 s/Copyright (C) [0-9]\{4,4\}/COPYRIGHT/' |
+ tr -d '\015' |
+ diff -c $TMP - || ERR=1
+
+rm $TMP
+
+exit $ERR
diff --git a/gnulib/tests/test-argp-version-etc.c b/gnulib/tests/test-argp-version-etc.c
new file mode 100644
index 00000000..04f9a3fc
--- /dev/null
+++ b/gnulib/tests/test-argp-version-etc.c
@@ -0,0 +1,48 @@
+/* Test suite for argp-version-etc.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNUlib Library.
+
+ 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/>. */
+
+#include <config.h>
+#include "argp-version-etc.h"
+#include "argp.h"
+#include "progname.h"
+
+static char doc[] = "test for the argp-version-etc module";
+
+struct argp test_argp =
+{
+ NULL,
+ NULL,
+ NULL,
+ doc,
+ NULL,
+ NULL,
+ NULL
+};
+
+const char *authors[] =
+{
+ "Sergey Poznyakoff",
+ NULL
+};
+
+int
+main (int argc, char **argv)
+{
+ set_program_name (argv[0]);
+ argp_version_setup ("test-argp-version-etc", authors);
+ return argp_parse (&test_argp, argc, argv, 0, NULL, NULL);
+}
diff --git a/gnulib/tests/test-argp.c b/gnulib/tests/test-argp.c
new file mode 100644
index 00000000..675951fb
--- /dev/null
+++ b/gnulib/tests/test-argp.c
@@ -0,0 +1,493 @@
+/* Test suite for argp.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
+ This file is part of the GNUlib Library.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "argp.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#include "progname.h"
+
+struct test_args
+{
+ int test;
+ int verbose;
+ char *file;
+ int read;
+ char *hidden;
+ int opt;
+ char *optional;
+ int optional_set;
+ int group_2_1_option;
+ int group_1_1_option;
+};
+
+static struct argp_option group1_option[] = {
+ { NULL, 0, NULL, 0, "Option Group 1", 0 },
+ { "verbose", 'v', NULL, 0, "Simple option without arguments", 1 },
+ { "file", 'f', "FILE", 0, "Option with a mandatory argument", 1 },
+ { "input", 0, NULL, OPTION_ALIAS, NULL, 1 },
+ { "read", 'r', NULL, OPTION_ALIAS, NULL, 1 },
+ { "hidden", 'H', "FILE", OPTION_HIDDEN, "Hidden option", 1 },
+ { NULL, 0, NULL, 0, NULL, 0 }
+};
+
+static error_t
+group1_parser (int key, char *arg, struct argp_state *state)
+{
+ struct test_args *args = state->input;
+
+ switch (key)
+ {
+ case 'v':
+ args->verbose++;
+ break;
+
+ case 'r':
+ args->read = 1;
+ /* fall through */
+ case 'f':
+ args->file = arg;
+ break;
+
+ case 'H':
+ args->hidden = arg;
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+struct argp group1_argp = {
+ group1_option,
+ group1_parser
+};
+
+struct argp_child group1_child = {
+ &group1_argp,
+ 0,
+ "",
+ 1
+};
+
+
+static struct argp_option group1_1_option[] = {
+ { NULL, 0, NULL, 0, "Option Group 1.1", 0 },
+ { "cantiga", 'C', NULL, 0, "create a cantiga" },
+ { "sonet", 'S', NULL, 0, "create a sonet" },
+ { NULL, 0, NULL, 0, NULL, 0 }
+};
+
+static error_t
+group1_1_parser (int key, char *arg, struct argp_state *state)
+{
+ struct test_args *args = state->input;
+ switch (key)
+ {
+ case 'C':
+ case 'S':
+ args->group_1_1_option = key;
+ break;
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+struct argp group1_1_argp = {
+ group1_1_option,
+ group1_1_parser
+};
+
+struct argp_child group1_1_child = {
+ &group1_1_argp,
+ 0,
+ "",
+ 2
+};
+
+
+static struct argp_option group2_option[] = {
+ { NULL, 0, NULL, 0, "Option Group 2", 0 },
+ { "option", 'O', NULL, 0, "An option", 1 },
+ { "optional", 'o', "ARG", OPTION_ARG_OPTIONAL,
+ "Option with an optional argument. ARG is one of the following:", 2 },
+ { "one", 0, NULL, OPTION_DOC | OPTION_NO_TRANS, "one unit", 3 },
+ { "two", 0, NULL, OPTION_DOC | OPTION_NO_TRANS, "two units", 3 },
+ { "many", 0, NULL, OPTION_DOC | OPTION_NO_TRANS, "many units", 3 },
+ { NULL, 0, NULL, 0, NULL, 0 }
+};
+
+static error_t
+group2_parser (int key, char *arg, struct argp_state *state)
+{
+ struct test_args *args = state->input;
+
+ switch (key)
+ {
+ case 'O':
+ args->opt = 1;
+ break;
+
+ case 'o':
+ args->optional_set = 1;
+ args->optional = arg;
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+struct argp group2_argp = {
+ group2_option,
+ group2_parser
+};
+
+struct argp_child group2_child = {
+ &group2_argp,
+ 0,
+ "",
+ 2
+};
+
+
+static struct argp_option group2_1_option[] = {
+ { NULL, 0, NULL, 0, "Option Group 2.1", 0 },
+ { "poem", 'p', NULL, 0, "create a poem" },
+ { "limerick", 'l', NULL, 0, "create a limerick" },
+ { NULL, 0, NULL, 0, NULL, 0 }
+};
+
+static error_t
+group2_1_parser (int key, char *arg, struct argp_state *state)
+{
+ struct test_args *args = state->input;
+ switch (key)
+ {
+ case 'p':
+ case 'e':
+ args->group_2_1_option = key;
+ break;
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+struct argp group2_1_argp = {
+ group2_1_option,
+ group2_1_parser
+};
+
+struct argp_child group2_1_child = {
+ &group2_1_argp,
+ 0,
+ "",
+ 2
+};
+
+
+static struct argp_option main_options[] = {
+ { NULL, 0, NULL, 0, "Main options", 0 },
+ { "test", 't', NULL, 0, NULL, 1 },
+ { NULL, 0, NULL, 0, NULL, 0 }
+};
+
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+ struct test_args *args = state->input;
+ int i;
+
+ switch (key)
+ {
+ case ARGP_KEY_INIT:
+ for (i = 0; state->root_argp->children[i].argp; i++)
+ state->child_inputs[i] = args;
+ break;
+
+ case 't':
+ args->test = 1;
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+const char *argp_program_version = "test_argp (" PACKAGE_NAME ") " VERSION;
+const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
+static char doc[] = "documentation string";
+
+struct argp test_argp = {
+ main_options,
+ parse_opt,
+ "ARGS...",
+ doc,
+ NULL,
+ NULL,
+ NULL
+};
+
+#define NARGS(a) (sizeof(a) / sizeof((a)[0]) - 1)
+#define ARGV0 "test-argp"
+#define init_args(a) memset (&(a), 0, sizeof (a));
+
+#define INIT_TEST_COMMON(n) \
+ int argc = NARGS (argv); \
+ struct test_args test_args; \
+ init_args(test_args); \
+ test_number = n;
+
+#define INIT_TEST1(n, arg1) \
+ char *argv[] = { ARGV0, arg1, NULL }; \
+ INIT_TEST_COMMON(n)
+
+#define INIT_TEST2(n, arg1, arg2) \
+ char *argv[] = { ARGV0, arg1, arg2, NULL }; \
+ INIT_TEST_COMMON(n)
+
+#define INIT_TEST3(n, arg1, arg2, arg3) \
+ char *argv[] = { ARGV0, arg1, arg2, arg3, NULL }; \
+ INIT_TEST_COMMON(n)
+
+int test_number;
+unsigned failure_count = 0;
+
+void
+fail (const char *msg)
+{
+ fprintf (stderr, "Test %d: %s\n", test_number, msg);
+ failure_count++;
+}
+
+void
+test1 (struct argp *argp)
+{
+ INIT_TEST1 (1, "--test");
+ if (argp_parse (argp, argc, argv, 0, NULL, &test_args))
+ fail ("argp_parse failed");
+ else if (test_args.test != 1)
+ fail ("option not processed");
+}
+
+void
+test2 (struct argp *argp)
+{
+ INIT_TEST1 (2, "-t");
+ if (argp_parse (argp, argc, argv, 0, NULL, &test_args))
+ fail ("argp_parse failed");
+ else if (test_args.test != 1)
+ fail ("option not processed");
+}
+
+void
+test_file (struct argp *argp, int argc, char **argv, struct test_args *args)
+{
+ if (argp_parse (argp, argc, argv, 0, NULL, args))
+ fail ("argp_parse failed");
+ else if (!args->file)
+ fail ("option not processed");
+ else if (strcmp (args->file, "FILE"))
+ fail ("option processed incorrectly");
+}
+
+void
+test3 (struct argp *argp)
+{
+ INIT_TEST1 (3, "--file=FILE");
+ test_file (argp, argc, argv, &test_args);
+}
+
+void
+test4 (struct argp *argp)
+{
+ INIT_TEST2 (4, "--file", "FILE");
+ test_file (argp, argc, argv, &test_args);
+}
+
+void
+test5 (struct argp *argp)
+{
+ INIT_TEST1 (5, "--input=FILE");
+ test_file (argp, argc, argv, &test_args);
+}
+
+void
+test6 (struct argp *argp)
+{
+ INIT_TEST2 (6, "--input", "FILE");
+ test_file (argp, argc, argv, &test_args);
+}
+
+void
+test_optional (struct argp *argp, int argc, char **argv,
+ struct test_args *args, char *val, char *a)
+{
+ int index;
+ if (argp_parse (argp, argc, argv, 0, &index, args))
+ fail ("argp_parse failed");
+ else if (!args->optional_set)
+ fail ("option not processed");
+
+ if (!val)
+ {
+ if (args->optional)
+ fail ("option processed incorrectly");
+ }
+ else if (strcmp (args->optional, val))
+ fail ("option processed incorrectly");
+
+ if (a)
+ {
+ if (index == argc)
+ fail ("expected command line argument not found");
+ else if (strcmp (argv[index], a))
+ fail ("expected command line argument does not match");
+ }
+}
+
+void
+test7 (struct argp *argp)
+{
+ INIT_TEST1 (7, "-oARG");
+ test_optional (argp, argc, argv, &test_args, "ARG", NULL);
+}
+
+void
+test8 (struct argp *argp)
+{
+ INIT_TEST2 (8, "-o", "ARG");
+ test_optional (argp, argc, argv, &test_args, NULL, "ARG");
+}
+
+void
+test9 (struct argp *argp)
+{
+ INIT_TEST1 (9, "--optional=ARG");
+ test_optional (argp, argc, argv, &test_args, "ARG", NULL);
+}
+
+void
+test10 (struct argp *argp)
+{
+ INIT_TEST2 (10, "--optional", "ARG");
+ test_optional (argp, argc, argv, &test_args, NULL, "ARG");
+}
+
+void
+test11 (struct argp *argp)
+{
+ INIT_TEST1 (11, "--optiona=ARG");
+ test_optional (argp, argc, argv, &test_args, "ARG", NULL);
+}
+
+void
+test12 (struct argp *argp)
+{
+ INIT_TEST3 (12, "--option", "--optional=OPT", "FILE");
+ test_optional (argp, argc, argv, &test_args, "OPT", "FILE");
+}
+
+void
+test13 (struct argp *argp)
+{
+ INIT_TEST1 (1, "--cantiga");
+ if (argp_parse (argp, argc, argv, 0, NULL, &test_args))
+ fail ("argp_parse failed");
+ else if (test_args.group_1_1_option != 'C')
+ fail ("option not processed");
+}
+
+void
+test14 (struct argp *argp)
+{
+ INIT_TEST1 (1, "--limerick");
+ if (argp_parse (argp, argc, argv, 0, NULL, &test_args))
+ fail ("argp_parse failed");
+ else if (test_args.group_2_1_option != 'l')
+ fail ("option not processed");
+}
+
+void
+test15 (struct argp *argp)
+{
+ INIT_TEST2 (1, "-r", "FILE");
+ test_file (argp, argc, argv, &test_args);
+ if (!test_args.read)
+ fail ("short alias not recognized properly");
+}
+
+
+typedef void (*test_fp) (struct argp *argp);
+
+test_fp test_fun[] = {
+ test1, test2, test3, test4,
+ test5, test6, test7, test8,
+ test9, test10, test11, test12,
+ test13, test14, test15,
+ NULL
+};
+
+int
+main (int argc, char **argv)
+{
+ struct argp_child argp_children[3], group1_children[2], group2_children[2];
+ test_fp *fun;
+
+ set_program_name (argv[0]);
+
+ group1_children[0] = group1_1_child;
+ group1_children[1].argp = NULL;
+ group1_argp.children = group1_children;
+
+ group2_children[0] = group2_1_child;
+ group2_children[1].argp = NULL;
+ group2_argp.children = group2_children;
+
+ argp_children[0] = group1_child;
+ argp_children[1] = group2_child;
+ argp_children[2].argp = NULL;
+ test_argp.children = argp_children;
+
+ if (argc > 0)
+ {
+ struct test_args test_args;
+ init_args (test_args);
+ return argp_parse (&test_argp, argc, argv, 0, NULL, &test_args);
+ }
+
+ for (fun = test_fun; *fun; fun++)
+ (*fun) (&test_argp);
+
+ if (failure_count)
+ return 1;
+
+ return 0;
+}
diff --git a/gnulib/tests/test-argv-iter.c b/gnulib/tests/test-argv-iter.c
new file mode 100644
index 00000000..d0597bd5
--- /dev/null
+++ b/gnulib/tests/test-argv-iter.c
@@ -0,0 +1,108 @@
+/* Test argv iterator
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "argv-iter.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "macros.h"
+
+#define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+static FILE *
+write_nul_delimited_argv (char **argv)
+{
+ FILE *fp = tmpfile ();
+ ASSERT (fp);
+ while (*argv)
+ {
+ size_t len = strlen (*argv) + 1;
+ ASSERT (fwrite (*argv, len, 1, fp) == 1);
+ argv++;
+ }
+ ASSERT (fflush (fp) == 0);
+ rewind (fp);
+ return fp;
+}
+
+int
+main (void)
+{
+ /* set_program_name (argv[0]); placate overzealous "syntax-check" test. */
+ static char one[] = "1";
+ static char two[] = "2";
+ static char three[] = "3";
+ static char *av[][4] = {
+ {NULL},
+ {one, NULL},
+ {one, two, NULL},
+ {one, two, three, NULL}
+ };
+
+ int use_stream;
+ for (use_stream = 0; use_stream < 2; use_stream++)
+ {
+ size_t i;
+ for (i = 0; i < ARRAY_CARDINALITY (av); i++)
+ {
+ FILE *fp;
+ struct argv_iterator *ai;
+ size_t n_found = 0;
+ if (use_stream)
+ {
+ /* Generate an identical list to be read via FP. */
+ ASSERT ((fp = write_nul_delimited_argv (av[i])) != NULL);
+ ai = argv_iter_init_stream (fp);
+ }
+ else
+ {
+ fp = NULL;
+ ai = argv_iter_init_argv (av[i]);
+ }
+ ASSERT (ai);
+
+ while (1)
+ {
+ enum argv_iter_err ai_err;
+ char *s = argv_iter (ai, &ai_err);
+ ASSERT ((i == n_found) == (ai_err == AI_ERR_EOF));
+ ASSERT ((s == NULL) ^ (ai_err == AI_ERR_OK));
+ ASSERT (ai_err == AI_ERR_OK || ai_err == AI_ERR_EOF);
+ if (ai_err == AI_ERR_OK)
+ ++n_found;
+ if (ai_err == AI_ERR_EOF)
+ break;
+ /* In stream mode, the strings are equal, but
+ in argv mode the actual pointers are equal. */
+ ASSERT (use_stream
+ ? STREQ (s, av[i][n_found - 1])
+ : s == av[i][n_found - 1]);
+ }
+ ASSERT (argv_iter_n_args (ai) == i);
+ argv_iter_free (ai);
+ if (fp)
+ ASSERT (fclose (fp) == 0);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-arpa_inet.c b/gnulib/tests/test-arpa_inet.c
new file mode 100644
index 00000000..262686ac
--- /dev/null
+++ b/gnulib/tests/test-arpa_inet.c
@@ -0,0 +1,27 @@
+/* Test of <arpa/inet.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <arpa/inet.h>
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-array-mergesort.c b/gnulib/tests/test-array-mergesort.c
new file mode 100644
index 00000000..3f5d0821
--- /dev/null
+++ b/gnulib/tests/test-array-mergesort.c
@@ -0,0 +1,384 @@
+/* Test of stable-sorting of an array using mergesort.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stddef.h>
+
+struct foo { double x; double index; };
+#define ELEMENT struct foo
+#define COMPARE(a,b) ((a)->x < (b)->x ? -1 : (a)->x > (b)->x ? 1 : 0)
+#define STATIC static
+#include "array-mergesort.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+#define NMAX 257
+static const struct foo data[NMAX] =
+{
+ { 2, 0 },
+ { 28, 1 },
+ { 36, 2 },
+ { 43, 3 },
+ { 20, 4 },
+ { 37, 5 },
+ { 19, 6 },
+ { 37, 7 },
+ { 30, 8 },
+ { 18, 9 },
+ { 30, 10 },
+ { 49, 11 },
+ { 16, 12 },
+ { 22, 13 },
+ { 23, 14 },
+ { 3, 15 },
+ { 39, 16 },
+ { 48, 17 },
+ { 18, 18 },
+ { 18, 19 },
+ { 45, 20 },
+ { 39, 21 },
+ { 1, 22 },
+ { 44, 23 },
+ { 24, 24 },
+ { 21, 25 },
+ { 29, 26 },
+ { 3, 27 },
+ { 34, 28 },
+ { 15, 29 },
+ { 39, 30 },
+ { 11, 31 },
+ { 29, 32 },
+ { 27, 33 },
+ { 43, 34 },
+ { 31, 35 },
+ { 28, 36 },
+ { 12, 37 },
+ { 16, 38 },
+ { 34, 39 },
+ { 25, 40 },
+ { 31, 41 },
+ { 29, 42 },
+ { 36, 43 },
+ { 17, 44 },
+ { 18, 45 },
+ { 44, 46 },
+ { 22, 47 },
+ { 23, 48 },
+ { 32, 49 },
+ { 16, 50 },
+ { 47, 51 },
+ { 28, 52 },
+ { 46, 53 },
+ { 49, 54 },
+ { 24, 55 },
+ { 0, 56 },
+ { 20, 57 },
+ { 25, 58 },
+ { 42, 59 },
+ { 48, 60 },
+ { 16, 61 },
+ { 26, 62 },
+ { 32, 63 },
+ { 24, 64 },
+ { 17, 65 },
+ { 47, 66 },
+ { 47, 67 },
+ { 12, 68 },
+ { 33, 69 },
+ { 41, 70 },
+ { 36, 71 },
+ { 8, 72 },
+ { 15, 73 },
+ { 0, 74 },
+ { 32, 75 },
+ { 28, 76 },
+ { 11, 77 },
+ { 46, 78 },
+ { 34, 79 },
+ { 5, 80 },
+ { 20, 81 },
+ { 47, 82 },
+ { 25, 83 },
+ { 7, 84 },
+ { 29, 85 },
+ { 40, 86 },
+ { 5, 87 },
+ { 12, 88 },
+ { 30, 89 },
+ { 1, 90 },
+ { 22, 91 },
+ { 29, 92 },
+ { 42, 93 },
+ { 49, 94 },
+ { 30, 95 },
+ { 40, 96 },
+ { 33, 97 },
+ { 36, 98 },
+ { 12, 99 },
+ { 8, 100 },
+ { 33, 101 },
+ { 5, 102 },
+ { 31, 103 },
+ { 27, 104 },
+ { 19, 105 },
+ { 43, 106 },
+ { 37, 107 },
+ { 9, 108 },
+ { 40, 109 },
+ { 0, 110 },
+ { 35, 111 },
+ { 32, 112 },
+ { 6, 113 },
+ { 27, 114 },
+ { 28, 115 },
+ { 30, 116 },
+ { 37, 117 },
+ { 32, 118 },
+ { 41, 119 },
+ { 14, 120 },
+ { 44, 121 },
+ { 22, 122 },
+ { 26, 123 },
+ { 2, 124 },
+ { 43, 125 },
+ { 20, 126 },
+ { 32, 127 },
+ { 24, 128 },
+ { 33, 129 },
+ { 7, 130 },
+ { 17, 131 },
+ { 10, 132 },
+ { 47, 133 },
+ { 14, 134 },
+ { 29, 135 },
+ { 19, 136 },
+ { 25, 137 },
+ { 25, 138 },
+ { 13, 139 },
+ { 25, 140 },
+ { 32, 141 },
+ { 8, 142 },
+ { 37, 143 },
+ { 31, 144 },
+ { 32, 145 },
+ { 5, 146 },
+ { 45, 147 },
+ { 35, 148 },
+ { 47, 149 },
+ { 3, 150 },
+ { 4, 151 },
+ { 37, 152 },
+ { 43, 153 },
+ { 39, 154 },
+ { 18, 155 },
+ { 13, 156 },
+ { 15, 157 },
+ { 41, 158 },
+ { 34, 159 },
+ { 4, 160 },
+ { 33, 161 },
+ { 20, 162 },
+ { 4, 163 },
+ { 38, 164 },
+ { 47, 165 },
+ { 30, 166 },
+ { 41, 167 },
+ { 23, 168 },
+ { 40, 169 },
+ { 23, 170 },
+ { 35, 171 },
+ { 47, 172 },
+ { 32, 173 },
+ { 15, 174 },
+ { 15, 175 },
+ { 41, 176 },
+ { 35, 177 },
+ { 6, 178 },
+ { 18, 179 },
+ { 35, 180 },
+ { 39, 181 },
+ { 34, 182 },
+ { 6, 183 },
+ { 34, 184 },
+ { 37, 185 },
+ { 15, 186 },
+ { 6, 187 },
+ { 12, 188 },
+ { 39, 189 },
+ { 9, 190 },
+ { 48, 191 },
+ { 37, 192 },
+ { 28, 193 },
+ { 32, 194 },
+ { 1, 195 },
+ { 45, 196 },
+ { 21, 197 },
+ { 11, 198 },
+ { 32, 199 },
+ { 43, 200 },
+ { 35, 201 },
+ { 25, 202 },
+ { 4, 203 },
+ { 20, 204 },
+ { 10, 205 },
+ { 22, 206 },
+ { 44, 207 },
+ { 30, 208 },
+ { 16, 209 },
+ { 42, 210 },
+ { 13, 211 },
+ { 29, 212 },
+ { 23, 213 },
+ { 30, 214 },
+ { 25, 215 },
+ { 49, 216 },
+ { 0, 217 },
+ { 49, 218 },
+ { 29, 219 },
+ { 37, 220 },
+ { 6, 221 },
+ { 27, 222 },
+ { 31, 223 },
+ { 17, 224 },
+ { 45, 225 },
+ { 25, 226 },
+ { 15, 227 },
+ { 34, 228 },
+ { 7, 229 },
+ { 7, 230 },
+ { 4, 231 },
+ { 31, 232 },
+ { 40, 233 },
+ { 17, 234 },
+ { 2, 235 },
+ { 34, 236 },
+ { 17, 237 },
+ { 25, 238 },
+ { 5, 239 },
+ { 48, 240 },
+ { 31, 241 },
+ { 41, 242 },
+ { 45, 243 },
+ { 33, 244 },
+ { 46, 245 },
+ { 19, 246 },
+ { 17, 247 },
+ { 38, 248 },
+ { 43, 249 },
+ { 16, 250 },
+ { 5, 251 },
+ { 21, 252 },
+ { 0, 253 },
+ { 47, 254 },
+ { 40, 255 },
+ { 22, 256 }
+};
+
+static int
+cmp_double (const void *a, const void *b)
+{
+ return (*(const double *)a < *(const double *)b ? -1 :
+ *(const double *)a > *(const double *)b ? 1 :
+ 0);
+}
+
+int
+main ()
+{
+ size_t n;
+
+ /* Test merge_sort_fromto. */
+ for (n = 1; n <= NMAX; n++)
+ {
+ struct foo *dst;
+ struct foo *tmp;
+ double *qsort_result;
+ size_t i;
+
+ dst = (struct foo *) malloc ((n + 1) * sizeof (struct foo));
+ dst[n].x = 0x4A6A71FE; /* canary */
+ tmp = (struct foo *) malloc ((n / 2 + 1) * sizeof (struct foo));
+ tmp[n / 2].x = 0x587EF149; /* canary */
+
+ merge_sort_fromto (data, dst, n, tmp);
+
+ /* Verify the canaries. */
+ ASSERT (dst[n].x == 0x4A6A71FE);
+ ASSERT (tmp[n / 2].x == 0x587EF149);
+
+ /* Verify the result. */
+ qsort_result = (double *) malloc (n * sizeof (double));
+ for (i = 0; i < n; i++)
+ qsort_result[i] = data[i].x;
+ qsort (qsort_result, n, sizeof (double), cmp_double);
+ for (i = 0; i < n; i++)
+ ASSERT (dst[i].x == qsort_result[i]);
+
+ /* Verify the stability. */
+ for (i = 0; i < n; i++)
+ if (i > 0 && dst[i - 1].x == dst[i].x)
+ ASSERT (dst[i - 1].index < dst[i].index);
+
+ free (qsort_result);
+ free (tmp);
+ free (dst);
+ }
+
+ /* Test merge_sort_inplace. */
+ for (n = 1; n <= NMAX; n++)
+ {
+ struct foo *src;
+ struct foo *tmp;
+ double *qsort_result;
+ size_t i;
+
+ src = (struct foo *) malloc ((n + 1) * sizeof (struct foo));
+ src[n].x = 0x4A6A71FE; /* canary */
+ tmp = (struct foo *) malloc ((n + 1) * sizeof (struct foo));
+ tmp[n].x = 0x587EF149; /* canary */
+
+ for (i = 0; i < n; i++)
+ src[i] = data[i];
+
+ merge_sort_inplace (src, n, tmp);
+
+ /* Verify the canaries. */
+ ASSERT (src[n].x == 0x4A6A71FE);
+ ASSERT (tmp[n].x == 0x587EF149);
+
+ /* Verify the result. */
+ qsort_result = (double *) malloc (n * sizeof (double));
+ for (i = 0; i < n; i++)
+ qsort_result[i] = data[i].x;
+ qsort (qsort_result, n, sizeof (double), cmp_double);
+ for (i = 0; i < n; i++)
+ ASSERT (src[i].x == qsort_result[i]);
+
+ /* Verify the stability. */
+ for (i = 0; i < n; i++)
+ if (i > 0 && src[i - 1].x == src[i].x)
+ ASSERT (src[i - 1].index < src[i].index);
+
+ free (qsort_result);
+ free (tmp);
+ free (src);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-array_list.c b/gnulib/tests/test-array_list.c
new file mode 100644
index 00000000..d2987794
--- /dev/null
+++ b/gnulib/tests/test-array_list.c
@@ -0,0 +1,329 @@
+/* Test of sequential list data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_array_list.h"
+
+#include <stdlib.h>
+
+#include "progname.h"
+#include "macros.h"
+
+static const char *objects[15] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
+ };
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_list_t list1, gl_list_t list2)
+{
+ size_t n, i;
+
+ n = gl_list_size (list1);
+ ASSERT (n == gl_list_size (list2));
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_get_at (list1, i) == gl_list_get_at (list2, i));
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_list_t list1, list2;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (50);
+ const void **contents =
+ (const void **) malloc (initial_size * sizeof (const void *));
+ size_t i;
+ unsigned int repeat;
+
+ for (i = 0; i < initial_size; i++)
+ contents[i] = RANDOM_OBJECT ();
+
+ /* Create list1. */
+ list1 = gl_list_nx_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list1 != NULL);
+ /* Create list2. */
+ list2 = gl_list_nx_create_empty (GL_ARRAY_LIST, NULL, NULL, NULL, true);
+ ASSERT (list2 != NULL);
+ for (i = 0; i < initial_size; i++)
+ ASSERT (gl_list_nx_add_last (list2, contents[i]) != NULL);
+
+ check_equals (list1, list2);
+
+ for (repeat = 0; repeat < 10000; repeat++)
+ {
+ unsigned int operation = RANDOM (16);
+ switch (operation)
+ {
+ case 0:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t index = RANDOM (gl_list_size (list1));
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2;
+
+ node1 = gl_list_nx_set_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+
+ node2 = gl_list_nx_set_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ }
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ if (node1 == NULL)
+ {
+ ASSERT (node2 == NULL);
+ }
+ else
+ {
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ }
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ size_t index1, index2;
+ index1 = gl_list_indexof (list1, obj);
+ index2 = gl_list_indexof (list2, obj);
+ if (index1 == (size_t)(-1))
+ {
+ ASSERT (index2 == (size_t)(-1));
+ }
+ else
+ {
+ ASSERT (index2 != (size_t)(-1));
+ ASSERT (gl_list_get_at (list1, index1) == obj);
+ ASSERT (gl_list_get_at (list2, index2) == obj);
+ ASSERT (index2 == index1);
+ }
+ }
+ break;
+ case 3: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2;
+ node1 = gl_list_nx_add_first (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list1, 0) == obj);
+ ASSERT (gl_list_get_at (list2, 0) == obj);
+ }
+ break;
+ case 4: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2;
+ node1 = gl_list_nx_add_last (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_last (list2, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list1, gl_list_size (list1) - 1) == obj);
+ ASSERT (gl_list_get_at (list2, gl_list_size (list2) - 1) == obj);
+ }
+ break;
+ case 5: /* add 3 elements */
+ {
+ const char *obj0 = RANDOM_OBJECT ();
+ const char *obj1 = RANDOM_OBJECT ();
+ const char *obj2 = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2;
+ node1 = gl_list_nx_add_first (list1, obj2);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_before (list1, node1, obj0);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_after (list1, node1, obj1);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj2);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_before (list2, node2, obj0);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_after (list2, node2, obj1);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj1);
+ ASSERT (gl_list_node_value (list2, node2) == obj1);
+ ASSERT (gl_list_get_at (list1, 0) == obj0);
+ ASSERT (gl_list_get_at (list1, 1) == obj1);
+ ASSERT (gl_list_get_at (list1, 2) == obj2);
+ ASSERT (gl_list_get_at (list2, 0) == obj0);
+ ASSERT (gl_list_get_at (list2, 1) == obj1);
+ ASSERT (gl_list_get_at (list2, 2) == obj2);
+ }
+ break;
+ case 6: /* add 1 element */
+ {
+ size_t index = RANDOM (gl_list_size (list1) + 1);
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2;
+ node1 = gl_list_nx_add_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ }
+ }
+ break;
+ case 7: case 8: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ gl_list_node_t node1, node2;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_remove_node (list1, node1));
+ ASSERT (gl_list_remove_node (list2, node2));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 9: case 10: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ size_t index = RANDOM (n);
+ ASSERT (gl_list_remove_at (list1, index));
+ ASSERT (gl_list_remove_at (list2, index));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 11: case 12: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ ASSERT (gl_list_remove (list1, obj));
+ ASSERT (gl_list_remove (list2, obj));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 13:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = "xyzzy";
+ ASSERT (!gl_list_remove (list1, obj));
+ ASSERT (!gl_list_remove (list2, obj));
+ ASSERT (gl_list_size (list1) == n);
+ }
+ break;
+ case 14:
+ {
+ size_t n = gl_list_size (list1);
+ gl_list_iterator_t iter1, iter2;
+ const void *elt;
+ iter1 = gl_list_iterator (list1);
+ iter2 = gl_list_iterator (list2);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ }
+ break;
+ case 15:
+ {
+ size_t end = RANDOM (gl_list_size (list1) + 1);
+ size_t start = RANDOM (end + 1);
+ gl_list_iterator_t iter1, iter2;
+ const void *elt;
+ iter1 = gl_list_iterator_from_to (list1, start, end);
+ iter2 = gl_list_iterator_from_to (list2, start, end);
+ for (i = start; i < end; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ }
+ break;
+ }
+ check_equals (list1, list2);
+ }
+
+ gl_list_free (list1);
+ gl_list_free (list2);
+ free (contents);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-array_oset.c b/gnulib/tests/test-array_oset.c
new file mode 100644
index 00000000..9ec6171c
--- /dev/null
+++ b/gnulib/tests/test-array_oset.c
@@ -0,0 +1,144 @@
+/* Test of ordered set data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_array_oset.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gl_xlist.h"
+#include "gl_array_list.h"
+#include "progname.h"
+#include "macros.h"
+
+static const char *objects[30] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
+ "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "<", ">", "[", "]"
+ };
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_oset_t set1, gl_list_t set2)
+{
+ size_t n = gl_oset_size (set1);
+ gl_oset_iterator_t iter1;
+ gl_list_iterator_t iter2;
+ const void *elt1;
+ const void *elt2;
+ gl_list_node_t node2;
+ size_t i;
+
+ iter1 = gl_oset_iterator (set1);
+ iter2 = gl_list_iterator (set2);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_oset_iterator_next (&iter1, &elt1));
+ ASSERT (gl_list_iterator_next (&iter2, &elt2, &node2));
+ ASSERT (elt1 == elt2);
+ }
+ ASSERT (!gl_oset_iterator_next (&iter1, &elt1));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt2, &node2));
+ gl_oset_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+}
+
+static void
+check_all (gl_oset_t set1, gl_list_t set2)
+{
+ check_equals (set1, set2);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_oset_t set1;
+ gl_list_t set2;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (20);
+ size_t i;
+ unsigned int repeat;
+
+ /* Create set1. */
+ set1 = gl_oset_nx_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp, NULL);
+ ASSERT (set1 != NULL);
+
+ /* Create set2. */
+ set2 = gl_list_create_empty (GL_ARRAY_LIST, NULL, NULL, NULL, false);
+
+ check_all (set1, set2);
+
+ /* Initialize them. */
+ for (i = 0; i < initial_size; i++)
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_nx_add (set1, obj)
+ == (gl_sortedlist_search (set2, (gl_listelement_compar_fn)strcmp, obj) != NULL
+ ? false
+ : (gl_sortedlist_add (set2, (gl_listelement_compar_fn)strcmp, obj), true)));
+ check_all (set1, set2);
+ }
+
+ for (repeat = 0; repeat < 100000; repeat++)
+ {
+ unsigned int operation = RANDOM (3);
+ switch (operation)
+ {
+ case 0:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_search (set1, obj)
+ == (gl_sortedlist_search (set2, (gl_listelement_compar_fn)strcmp, obj) != NULL));
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_nx_add (set1, obj)
+ == (gl_sortedlist_search (set2, (gl_listelement_compar_fn)strcmp, obj) != NULL
+ ? false
+ : (gl_sortedlist_add (set2, (gl_listelement_compar_fn)strcmp, obj), true)));
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_remove (set1, obj)
+ == gl_sortedlist_remove (set2, (gl_listelement_compar_fn)strcmp, obj));
+ }
+ break;
+ }
+ check_all (set1, set2);
+ }
+
+ gl_oset_free (set1);
+ gl_list_free (set2);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-asin.c b/gnulib/tests/test-asin.c
new file mode 100644
index 00000000..178e5277
--- /dev/null
+++ b/gnulib/tests/test-asin.c
@@ -0,0 +1,40 @@
+/* Test of asin() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (asin, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = asin (x);
+ ASSERT (y >= 0.6435011087 && y <= 0.6435011088);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-asinl.c b/gnulib/tests/test-asinl.c
new file mode 100644
index 00000000..8b604573
--- /dev/null
+++ b/gnulib/tests/test-asinl.c
@@ -0,0 +1,45 @@
+/* Test of asinl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (asinl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = asinl (x);
+ ASSERT (y >= 0.6435011087L && y <= 0.6435011088L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-atan.c b/gnulib/tests/test-atan.c
new file mode 100644
index 00000000..25c9eab7
--- /dev/null
+++ b/gnulib/tests/test-atan.c
@@ -0,0 +1,40 @@
+/* Test of atan() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (atan, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = atan (x);
+ ASSERT (y >= 0.5404195002 && y <= 0.5404195003);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-atan2.c b/gnulib/tests/test-atan2.c
new file mode 100644
index 00000000..07022c71
--- /dev/null
+++ b/gnulib/tests/test-atan2.c
@@ -0,0 +1,60 @@
+/* Test of atan2() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (atan2, double, (double, double));
+
+#include "macros.h"
+
+volatile double x;
+volatile double y;
+double z;
+
+int
+main ()
+{
+ /* A particular value in the first quadrant. */
+ x = 0.6;
+ y = 0.8;
+ z = atan2 (y, x);
+ ASSERT (z >= 0.9272952180 && z <= 0.9272952181);
+
+ /* A particular value in the second quadrant. */
+ x = -0.6;
+ y = 0.8;
+ z = atan2 (y, x);
+ ASSERT (z >= 2.214297435 && z <= 2.214297436);
+
+ /* A particular value in the third quadrant. */
+ x = -0.6;
+ y = -0.8;
+ z = atan2 (y, x);
+ ASSERT (z >= -2.214297436 && z <= -2.214297435);
+
+ /* A particular value in the fourth quadrant. */
+ x = 0.6;
+ y = -0.8;
+ z = atan2 (y, x);
+ ASSERT (z >= -0.9272952181 && z <= -0.9272952180);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-atanl.c b/gnulib/tests/test-atanl.c
new file mode 100644
index 00000000..c3654016
--- /dev/null
+++ b/gnulib/tests/test-atanl.c
@@ -0,0 +1,45 @@
+/* Test of atanl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (atanl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = atanl (x);
+ ASSERT (y >= 0.5404195002L && y <= 0.5404195003L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-atexit.c b/gnulib/tests/test-atexit.c
new file mode 100644
index 00000000..08d1ed90
--- /dev/null
+++ b/gnulib/tests/test-atexit.c
@@ -0,0 +1,45 @@
+/* Test of execution of program termination handlers.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (atexit, int, (void (*) (void)));
+
+#include <unistd.h>
+
+#define TEMPFILE "t-atexit.tmp"
+
+static void
+clear_temp_file (void)
+{
+ unlink (TEMPFILE);
+}
+
+int
+main (int argc, char *argv[])
+{
+ atexit (clear_temp_file);
+
+ if (argc > 1)
+ exit (atoi (argv[1]));
+ else
+ return 0;
+}
diff --git a/gnulib/tests/test-atexit.sh b/gnulib/tests/test-atexit.sh
new file mode 100755
index 00000000..49c77291
--- /dev/null
+++ b/gnulib/tests/test-atexit.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-atexit.tmp"
+# Check that an atexit handler is called when main() returns normally.
+echo > t-atexit.tmp
+./test-atexit${EXEEXT}
+if test -f t-atexit.tmp; then
+ exit 1
+fi
+
+# Check that an atexit handler is called when the program is left
+# through exit(0).
+echo > t-atexit.tmp
+./test-atexit${EXEEXT} 0
+if test -f t-atexit.tmp; then
+ exit 1
+fi
+
+# Check that an atexit handler is called when the program is left
+# through exit(1).
+echo > t-atexit.tmp
+./test-atexit${EXEEXT} 1
+if test -f t-atexit.tmp; then
+ exit 1
+fi
+
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-avltree_list.c b/gnulib/tests/test-avltree_list.c
new file mode 100644
index 00000000..96f49f5e
--- /dev/null
+++ b/gnulib/tests/test-avltree_list.c
@@ -0,0 +1,415 @@
+/* Test of sequential list data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_avltree_list.h"
+
+#include <stdlib.h>
+
+#include "gl_array_list.h"
+#include "progname.h"
+#include "macros.h"
+
+extern void gl_avltree_list_check_invariants (gl_list_t list);
+
+static const char *objects[15] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
+ };
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_list_t list1, gl_list_t list2)
+{
+ size_t n, i;
+
+ n = gl_list_size (list1);
+ ASSERT (n == gl_list_size (list2));
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_get_at (list1, i) == gl_list_get_at (list2, i));
+ }
+}
+
+static void
+check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3)
+{
+ gl_avltree_list_check_invariants (list2);
+ gl_avltree_list_check_invariants (list3);
+ check_equals (list1, list2);
+ check_equals (list1, list3);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_list_t list1, list2, list3;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (50);
+ const void **contents =
+ (const void **) malloc (initial_size * sizeof (const void *));
+ size_t i;
+ unsigned int repeat;
+
+ for (i = 0; i < initial_size; i++)
+ contents[i] = RANDOM_OBJECT ();
+
+ /* Create list1. */
+ list1 = gl_list_nx_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list1 != NULL);
+ /* Create list2. */
+ list2 = gl_list_nx_create_empty (GL_AVLTREE_LIST, NULL, NULL, NULL, true);
+ ASSERT (list2 != NULL);
+ for (i = 0; i < initial_size; i++)
+ ASSERT (gl_list_nx_add_last (list2, contents[i]) != NULL);
+
+ /* Create list3. */
+ list3 = gl_list_nx_create (GL_AVLTREE_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list3 != NULL);
+
+ check_all (list1, list2, list3);
+
+ for (repeat = 0; repeat < 10000; repeat++)
+ {
+ unsigned int operation = RANDOM (16);
+ switch (operation)
+ {
+ case 0:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t index = RANDOM (gl_list_size (list1));
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+
+ node1 = gl_list_nx_set_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+
+ node2 = gl_list_nx_set_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+
+ node3 = gl_list_nx_set_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ if (node1 == NULL)
+ {
+ ASSERT (node2 == NULL);
+ ASSERT (node3 == NULL);
+ }
+ else
+ {
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ }
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ size_t index1, index2, index3;
+ index1 = gl_list_indexof (list1, obj);
+ index2 = gl_list_indexof (list2, obj);
+ index3 = gl_list_indexof (list3, obj);
+ if (index1 == (size_t)(-1))
+ {
+ ASSERT (index2 == (size_t)(-1));
+ ASSERT (index3 == (size_t)(-1));
+ }
+ else
+ {
+ ASSERT (index2 != (size_t)(-1));
+ ASSERT (index3 != (size_t)(-1));
+ ASSERT (gl_list_get_at (list1, index1) == obj);
+ ASSERT (gl_list_get_at (list2, index2) == obj);
+ ASSERT (gl_list_get_at (list3, index3) == obj);
+ ASSERT (index2 == index1);
+ ASSERT (index3 == index1);
+ }
+ }
+ break;
+ case 3: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, 0) == obj);
+ ASSERT (gl_list_get_at (list2, 0) == obj);
+ ASSERT (gl_list_get_at (list3, 0) == obj);
+ }
+ break;
+ case 4: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_last (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_last (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_last (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, gl_list_size (list1) - 1) == obj);
+ ASSERT (gl_list_get_at (list2, gl_list_size (list2) - 1) == obj);
+ ASSERT (gl_list_get_at (list3, gl_list_size (list3) - 1) == obj);
+ }
+ break;
+ case 5: /* add 3 elements */
+ {
+ const char *obj0 = RANDOM_OBJECT ();
+ const char *obj1 = RANDOM_OBJECT ();
+ const char *obj2 = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj2);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_before (list1, node1, obj0);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_after (list1, node1, obj1);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj2);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_before (list2, node2, obj0);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_after (list2, node2, obj1);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj2);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_before (list3, node3, obj0);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_after (list3, node3, obj1);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj1);
+ ASSERT (gl_list_node_value (list2, node2) == obj1);
+ ASSERT (gl_list_node_value (list3, node3) == obj1);
+ ASSERT (gl_list_get_at (list1, 0) == obj0);
+ ASSERT (gl_list_get_at (list1, 1) == obj1);
+ ASSERT (gl_list_get_at (list1, 2) == obj2);
+ ASSERT (gl_list_get_at (list2, 0) == obj0);
+ ASSERT (gl_list_get_at (list2, 1) == obj1);
+ ASSERT (gl_list_get_at (list2, 2) == obj2);
+ ASSERT (gl_list_get_at (list3, 0) == obj0);
+ ASSERT (gl_list_get_at (list3, 1) == obj1);
+ ASSERT (gl_list_get_at (list3, 2) == obj2);
+ }
+ break;
+ case 6: /* add 1 element */
+ {
+ size_t index = RANDOM (gl_list_size (list1) + 1);
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 7: case 8: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_remove_node (list1, node1));
+ ASSERT (gl_list_remove_node (list2, node2));
+ ASSERT (gl_list_remove_node (list3, node3));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 9: case 10: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ size_t index = RANDOM (n);
+ ASSERT (gl_list_remove_at (list1, index));
+ ASSERT (gl_list_remove_at (list2, index));
+ ASSERT (gl_list_remove_at (list3, index));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 11: case 12: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ ASSERT (gl_list_remove (list1, obj));
+ ASSERT (gl_list_remove (list2, obj));
+ ASSERT (gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 13:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = "xyzzy";
+ ASSERT (!gl_list_remove (list1, obj));
+ ASSERT (!gl_list_remove (list2, obj));
+ ASSERT (!gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n);
+ }
+ break;
+ case 14:
+ {
+ size_t n = gl_list_size (list1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator (list1);
+ iter2 = gl_list_iterator (list2);
+ iter3 = gl_list_iterator (list3);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ case 15:
+ {
+ size_t end = RANDOM (gl_list_size (list1) + 1);
+ size_t start = RANDOM (end + 1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator_from_to (list1, start, end);
+ iter2 = gl_list_iterator_from_to (list2, start, end);
+ iter3 = gl_list_iterator_from_to (list3, start, end);
+ for (i = start; i < end; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ }
+ check_all (list1, list2, list3);
+ }
+
+ gl_list_free (list1);
+ gl_list_free (list2);
+ gl_list_free (list3);
+ free (contents);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-avltree_oset.c b/gnulib/tests/test-avltree_oset.c
new file mode 100644
index 00000000..211c8332
--- /dev/null
+++ b/gnulib/tests/test-avltree_oset.c
@@ -0,0 +1,136 @@
+/* Test of ordered set data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_avltree_oset.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gl_array_oset.h"
+#include "progname.h"
+#include "macros.h"
+
+extern void gl_avltree_oset_check_invariants (gl_oset_t set);
+
+static const char *objects[30] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
+ "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "<", ">", "[", "]"
+ };
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_oset_t set1, gl_oset_t set2)
+{
+ size_t n = gl_oset_size (set1);
+ gl_oset_iterator_t iter1, iter2;
+ const void *elt1;
+ const void *elt2;
+ size_t i;
+
+ iter1 = gl_oset_iterator (set1);
+ iter2 = gl_oset_iterator (set2);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_oset_iterator_next (&iter1, &elt1));
+ ASSERT (gl_oset_iterator_next (&iter2, &elt2));
+ ASSERT (elt1 == elt2);
+ }
+ ASSERT (!gl_oset_iterator_next (&iter1, &elt1));
+ ASSERT (!gl_oset_iterator_next (&iter2, &elt2));
+ gl_oset_iterator_free (&iter1);
+ gl_oset_iterator_free (&iter2);
+}
+
+static void
+check_all (gl_oset_t set1, gl_oset_t set2)
+{
+ gl_avltree_oset_check_invariants (set2);
+ check_equals (set1, set2);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_oset_t set1, set2;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (20);
+ size_t i;
+ unsigned int repeat;
+
+ /* Create set1. */
+ set1 = gl_oset_nx_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp, NULL);
+ ASSERT (set1 != NULL);
+
+ /* Create set2. */
+ set2 = gl_oset_nx_create_empty (GL_AVLTREE_OSET, (gl_setelement_compar_fn) strcmp, NULL);
+ ASSERT (set2 != NULL);
+
+ check_all (set1, set2);
+
+ /* Initialize them. */
+ for (i = 0; i < initial_size; i++)
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_nx_add (set1, obj) == gl_oset_nx_add (set2, obj));
+ check_all (set1, set2);
+ }
+
+ for (repeat = 0; repeat < 100000; repeat++)
+ {
+ unsigned int operation = RANDOM (3);
+ switch (operation)
+ {
+ case 0:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_search (set1, obj) == gl_oset_search (set2, obj));
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_nx_add (set1, obj) == gl_oset_nx_add (set2, obj));
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_remove (set1, obj) == gl_oset_remove (set2, obj));
+ }
+ break;
+ }
+ check_all (set1, set2);
+ }
+
+ gl_oset_free (set1);
+ gl_oset_free (set2);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-avltreehash_list.c b/gnulib/tests/test-avltreehash_list.c
new file mode 100644
index 00000000..b94705fd
--- /dev/null
+++ b/gnulib/tests/test-avltreehash_list.c
@@ -0,0 +1,445 @@
+/* Test of sequential list data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_avltreehash_list.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gl_array_list.h"
+#include "progname.h"
+#include "macros.h"
+
+extern void gl_avltreehash_list_check_invariants (gl_list_t list);
+
+static const char *objects[15] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
+ };
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+static bool
+string_equals (const void *x1, const void *x2)
+{
+ const char *s1 = x1;
+ const char *s2 = x2;
+ return strcmp (s1, s2) == 0;
+}
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+static size_t
+string_hash (const void *x)
+{
+ const char *s = x;
+ size_t h = 0;
+
+ for (; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h;
+}
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_list_t list1, gl_list_t list2)
+{
+ size_t n, i;
+
+ n = gl_list_size (list1);
+ ASSERT (n == gl_list_size (list2));
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_get_at (list1, i) == gl_list_get_at (list2, i));
+ }
+}
+
+static void
+check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3)
+{
+ gl_avltreehash_list_check_invariants (list2);
+ gl_avltreehash_list_check_invariants (list3);
+ check_equals (list1, list2);
+ check_equals (list1, list3);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_list_t list1, list2, list3;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (50);
+ const void **contents =
+ (const void **) malloc (initial_size * sizeof (const void *));
+ size_t i;
+ unsigned int repeat;
+
+ for (i = 0; i < initial_size; i++)
+ contents[i] = RANDOM_OBJECT ();
+
+ /* Create list1. */
+ list1 = gl_list_nx_create (GL_ARRAY_LIST,
+ string_equals, string_hash, NULL, true,
+ initial_size, contents);
+ ASSERT (list1 != NULL);
+ /* Create list2. */
+ list2 = gl_list_nx_create_empty (GL_AVLTREEHASH_LIST,
+ string_equals, string_hash, NULL, true);
+ ASSERT (list2 != NULL);
+ for (i = 0; i < initial_size; i++)
+ ASSERT (gl_list_nx_add_last (list2, contents[i]) != NULL);
+
+ /* Create list3. */
+ list3 = gl_list_nx_create (GL_AVLTREEHASH_LIST,
+ string_equals, string_hash, NULL, true,
+ initial_size, contents);
+ ASSERT (list3 != NULL);
+
+ check_all (list1, list2, list3);
+
+ for (repeat = 0; repeat < 10000; repeat++)
+ {
+ unsigned int operation = RANDOM (16);
+ switch (operation)
+ {
+ case 0:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t index = RANDOM (gl_list_size (list1));
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+
+ node1 = gl_list_nx_set_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+
+ node2 = gl_list_nx_set_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+
+ node3 = gl_list_nx_set_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ if (node1 == NULL)
+ {
+ ASSERT (node2 == NULL);
+ ASSERT (node3 == NULL);
+ }
+ else
+ {
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ }
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ size_t index1, index2, index3;
+ index1 = gl_list_indexof (list1, obj);
+ index2 = gl_list_indexof (list2, obj);
+ index3 = gl_list_indexof (list3, obj);
+ if (index1 == (size_t)(-1))
+ {
+ ASSERT (index2 == (size_t)(-1));
+ ASSERT (index3 == (size_t)(-1));
+ }
+ else
+ {
+ ASSERT (index2 != (size_t)(-1));
+ ASSERT (index3 != (size_t)(-1));
+ ASSERT (gl_list_get_at (list1, index1) == obj);
+ ASSERT (gl_list_get_at (list2, index2) == obj);
+ ASSERT (gl_list_get_at (list3, index3) == obj);
+ ASSERT (index2 == index1);
+ ASSERT (index3 == index1);
+ }
+ }
+ break;
+ case 3: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, 0) == obj);
+ ASSERT (gl_list_get_at (list2, 0) == obj);
+ ASSERT (gl_list_get_at (list3, 0) == obj);
+ }
+ break;
+ case 4: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_last (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_last (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_last (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, gl_list_size (list1) - 1) == obj);
+ ASSERT (gl_list_get_at (list2, gl_list_size (list2) - 1) == obj);
+ ASSERT (gl_list_get_at (list3, gl_list_size (list3) - 1) == obj);
+ }
+ break;
+ case 5: /* add 3 elements */
+ {
+ const char *obj0 = RANDOM_OBJECT ();
+ const char *obj1 = RANDOM_OBJECT ();
+ const char *obj2 = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj2);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_before (list1, node1, obj0);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_after (list1, node1, obj1);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj2);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_before (list2, node2, obj0);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_after (list2, node2, obj1);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj2);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_before (list3, node3, obj0);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_after (list3, node3, obj1);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj1);
+ ASSERT (gl_list_node_value (list2, node2) == obj1);
+ ASSERT (gl_list_node_value (list3, node3) == obj1);
+ ASSERT (gl_list_get_at (list1, 0) == obj0);
+ ASSERT (gl_list_get_at (list1, 1) == obj1);
+ ASSERT (gl_list_get_at (list1, 2) == obj2);
+ ASSERT (gl_list_get_at (list2, 0) == obj0);
+ ASSERT (gl_list_get_at (list2, 1) == obj1);
+ ASSERT (gl_list_get_at (list2, 2) == obj2);
+ ASSERT (gl_list_get_at (list3, 0) == obj0);
+ ASSERT (gl_list_get_at (list3, 1) == obj1);
+ ASSERT (gl_list_get_at (list3, 2) == obj2);
+ }
+ break;
+ case 6: /* add 1 element */
+ {
+ size_t index = RANDOM (gl_list_size (list1) + 1);
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 7: case 8: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_remove_node (list1, node1));
+ ASSERT (gl_list_remove_node (list2, node2));
+ ASSERT (gl_list_remove_node (list3, node3));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 9: case 10: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ size_t index = RANDOM (n);
+ ASSERT (gl_list_remove_at (list1, index));
+ ASSERT (gl_list_remove_at (list2, index));
+ ASSERT (gl_list_remove_at (list3, index));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 11: case 12: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ ASSERT (gl_list_remove (list1, obj));
+ ASSERT (gl_list_remove (list2, obj));
+ ASSERT (gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 13:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = "xyzzy";
+ ASSERT (!gl_list_remove (list1, obj));
+ ASSERT (!gl_list_remove (list2, obj));
+ ASSERT (!gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n);
+ }
+ break;
+ case 14:
+ {
+ size_t n = gl_list_size (list1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator (list1);
+ iter2 = gl_list_iterator (list2);
+ iter3 = gl_list_iterator (list3);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ case 15:
+ {
+ size_t end = RANDOM (gl_list_size (list1) + 1);
+ size_t start = RANDOM (end + 1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator_from_to (list1, start, end);
+ iter2 = gl_list_iterator_from_to (list2, start, end);
+ iter3 = gl_list_iterator_from_to (list3, start, end);
+ for (i = start; i < end; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ }
+ check_all (list1, list2, list3);
+ }
+
+ gl_list_free (list1);
+ gl_list_free (list2);
+ gl_list_free (list3);
+ free (contents);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-base64.c b/gnulib/tests/test-base64.c
new file mode 100644
index 00000000..95c26ae0
--- /dev/null
+++ b/gnulib/tests/test-base64.c
@@ -0,0 +1,230 @@
+/* Self tests for base64.
+ Copyright (C) 2004, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "base64.h"
+
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ const char *in = "abcdefghijklmnop";
+ const char *b64in = "YWJjZGVmZw==";
+ char out[255];
+ size_t len;
+ bool ok;
+ char *p;
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 0, out, 0);
+ ASSERT(out[0] == '\x42');
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 1, out, 1);
+ ASSERT (memcmp (out, "YQ==", 1) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 1, out, 2);
+ ASSERT (memcmp (out, "YQ==", 2) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 1, out, 3);
+ ASSERT (memcmp (out, "YQ==", 3) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 1, out, 4);
+ ASSERT (memcmp (out, "YQ==", 4) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 1, out, 8);
+ ASSERT (memcmp (out, "YQ==", 4) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 2, out, 4);
+ ASSERT (memcmp (out, "YWI=", 4) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 3, out, 4);
+ ASSERT (memcmp (out, "YWJj", 4) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 4, out, 5);
+ ASSERT (memcmp (out, "YWJjZA==", 5) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ base64_encode (in, 4, out, 100);
+ ASSERT (memcmp (out, "YWJjZA==", 6) == 0);
+
+ /* Decode. */
+
+ memset (out, 0x42, sizeof (out));
+ len = 0;
+ ok = base64_decode (b64in, 4, out, &len);
+ ASSERT (ok);
+ ASSERT (len == 0);
+
+ memset (out, 0x42, sizeof (out));
+ len = 1;
+ ok = base64_decode (b64in, 4, out, &len);
+ ASSERT (ok);
+ ASSERT (len == 1);
+ ASSERT (memcmp (out, "abcdefg", 1) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ len = 2;
+ ok = base64_decode (b64in, 4, out, &len);
+ ASSERT (ok);
+ ASSERT (len == 2);
+ ASSERT (memcmp (out, "abcdefg", 2) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ len = 3;
+ ok = base64_decode (b64in, 4, out, &len);
+ ASSERT (ok);
+ ASSERT (len == 3);
+ ASSERT (memcmp (out, "abcdefg", 3) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ len = 4;
+ ok = base64_decode (b64in, 4, out, &len);
+ ASSERT (ok);
+ ASSERT (len == 3);
+ ASSERT (memcmp (out, "abcdefg", 3) == 0);
+
+ memset (out, 0x42, sizeof (out));
+ len = 100;
+ ok = base64_decode (b64in, strlen (b64in), out, &len);
+ ASSERT (ok);
+ ASSERT (len == 7);
+ ASSERT (memcmp (out, "abcdefg", 7) == 0);
+
+ /* Allocating encode */
+
+ len = base64_encode_alloc (in, strlen (in), &p);
+ ASSERT (len == 24);
+ ASSERT (strcmp (p, "YWJjZGVmZ2hpamtsbW5vcA==") == 0);
+ free (p);
+
+ len = base64_encode_alloc (in, SIZE_MAX - 5, &p);
+ ASSERT (len == 0);
+
+ /* Decode context function */
+ {
+ struct base64_decode_context ctx;
+
+ base64_decode_ctx_init (&ctx);
+
+ len = sizeof (out);
+ ok = base64_decode_ctx (&ctx, b64in, strlen (b64in), out, &len);
+ ASSERT (ok);
+ ASSERT (len == 7);
+ ASSERT (memcmp (out, "abcdefg", len) == 0);
+ }
+
+ /* Allocating decode context function */
+
+ ok = base64_decode_alloc_ctx (NULL, b64in, strlen (b64in), &p, &len);
+ ASSERT (ok);
+ ASSERT (len == 7);
+ ASSERT (memcmp (out, "abcdefg", len) == 0);
+
+ {
+ struct base64_decode_context ctx;
+ const char *newlineb64 = "YWJjZG\nVmZ2hp\namtsbW5vcA==";
+
+ base64_decode_ctx_init (&ctx);
+
+ ok = base64_decode_alloc_ctx (&ctx, newlineb64, strlen (newlineb64), &p, &len);
+ ASSERT (ok);
+ ASSERT (len == strlen (in));
+ ASSERT (memcmp (p, in, len) == 0);
+ }
+
+ {
+ struct base64_decode_context ctx;
+ base64_decode_ctx_init (&ctx);
+
+ ok = base64_decode_alloc_ctx (&ctx, "YW\nJjZGVmZ2hp", 13, &p, &len);
+ ASSERT (ok);
+ ASSERT (len == 9);
+ ASSERT (memcmp (p, "abcdefghi", len) == 0);
+
+ base64_decode_ctx_init (&ctx);
+
+ ok = base64_decode_alloc_ctx (&ctx, "YW\n", 3, &p, &len);
+ ASSERT (ok);
+ ASSERT (len == 0);
+
+ ok = base64_decode_alloc_ctx (&ctx, "JjZGVmZ2", 8, &p, &len);
+ ASSERT (ok);
+ ASSERT (len == 6);
+ ASSERT (memcmp (p, "abcdef", len) == 0);
+
+ ok = base64_decode_alloc_ctx (&ctx, "hp", 2, &p, &len);
+ ASSERT (ok);
+ ASSERT (len == 2);
+ /* Actually this looks buggy. Shouldn't output be 'ghi'? */
+ ASSERT (memcmp (p, "gh", len) == 0);
+ ok = base64_decode_alloc_ctx (&ctx, "", 0, &p, &len);
+ ASSERT (ok);
+ }
+
+ {
+ struct base64_decode_context ctx;
+ const char *newlineb64 = "\n\n\n\n\n";
+
+ base64_decode_ctx_init (&ctx);
+
+ ok = base64_decode_alloc_ctx (&ctx, newlineb64, strlen (newlineb64), &p, &len);
+ ASSERT (ok);
+ ASSERT (len == 0);
+ }
+
+ ok = base64_decode_alloc_ctx (NULL, " ! ", 3, &p, &len);
+ ASSERT (!ok);
+
+ ok = base64_decode_alloc_ctx (NULL, "abc\ndef", 7, &p, &len);
+ ASSERT (!ok);
+
+ ok = base64_decode_alloc_ctx (NULL, "aa", 2, &p, &len);
+ ASSERT (!ok);
+
+ ok = base64_decode_alloc_ctx (NULL, "aa=", 3, &p, &len);
+ ASSERT (!ok);
+
+ ok = base64_decode_alloc_ctx (NULL, "aax", 3, &p, &len);
+ ASSERT (!ok);
+
+ ok = base64_decode_alloc_ctx (NULL, "aa=X", 4, &p, &len);
+ ASSERT (!ok);
+
+ ok = base64_decode_alloc_ctx (NULL, "aa=X", 4, &p, &len);
+ ASSERT (!ok);
+
+ ok = base64_decode_alloc_ctx (NULL, "aax=X", 5, &p, &len);
+ ASSERT (!ok);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-binary-io.c b/gnulib/tests/test-binary-io.c
new file mode 100644
index 00000000..125150b2
--- /dev/null
+++ b/gnulib/tests/test-binary-io.c
@@ -0,0 +1,64 @@
+/* Test of binary mode I/O.
+ Copyright (C) 2005, 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+#include "binary-io.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test the O_BINARY macro. */
+ {
+ int fd =
+ open ("t-bin-out2.tmp", O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0600);
+ if (write (fd, "Hello\n", 6) < 0)
+ exit (1);
+ close (fd);
+ }
+ {
+ struct stat statbuf;
+ if (stat ("t-bin-out2.tmp", &statbuf) < 0)
+ exit (1);
+ ASSERT (statbuf.st_size == 6);
+ }
+ unlink ("t-bin-out2.tmp");
+
+ /* Test the SET_BINARY macro. */
+ SET_BINARY (1);
+ fputs ("Hello\n", stdout);
+ fclose (stdout);
+ fclose (stderr);
+ {
+ struct stat statbuf;
+ if (stat ("t-bin-out1.tmp", &statbuf) < 0)
+ exit (1);
+ ASSERT (statbuf.st_size == 6);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-binary-io.sh b/gnulib/tests/test-binary-io.sh
new file mode 100755
index 00000000..33e128c3
--- /dev/null
+++ b/gnulib/tests/test-binary-io.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-bin-out1.tmp t-bin-out2.tmp"
+./test-binary-io${EXEEXT} > t-bin-out1.tmp || exit 1
+
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-bitrotate.c b/gnulib/tests/test-bitrotate.c
new file mode 100644
index 00000000..59c95a87
--- /dev/null
+++ b/gnulib/tests/test-bitrotate.c
@@ -0,0 +1,279 @@
+/* Test of <bitrotate.h> substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#include <config.h>
+
+#include "bitrotate.h"
+
+#include "macros.h"
+
+int
+main (void)
+{
+ ASSERT (rotl8 (42, 0) == 42);
+ ASSERT (rotl8 (42, 1) == 84);
+ ASSERT (rotl8 (42, 2) == 168);
+ ASSERT (rotl8 (42, 3) == 81);
+ ASSERT (rotl8 (42, 4) == 162);
+ ASSERT (rotl8 (42, 5) == 69);
+ ASSERT (rotl8 (42, 6) == 138);
+ ASSERT (rotl8 (42, 7) == 21);
+ ASSERT (rotl8 (42, 8) == 42);
+
+ ASSERT (rotr8 (42, 0) == 42);
+ ASSERT (rotr8 (42, 1) == 21);
+ ASSERT (rotr8 (42, 2) == 138);
+ ASSERT (rotr8 (42, 3) == 69);
+ ASSERT (rotr8 (42, 4) == 162);
+ ASSERT (rotr8 (42, 5) == 81);
+ ASSERT (rotr8 (42, 6) == 168);
+ ASSERT (rotr8 (42, 7) == 84);
+ ASSERT (rotr8 (42, 8) == 42);
+
+ ASSERT (rotl16 (43981, 0) == 43981);
+ ASSERT (rotl16 (43981, 1) == 22427);
+ ASSERT (rotl16 (43981, 2) == 44854);
+ ASSERT (rotl16 (43981, 3) == 24173);
+ ASSERT (rotl16 (43981, 4) == 48346);
+ ASSERT (rotl16 (43981, 5) == 31157);
+ ASSERT (rotl16 (43981, 6) == 62314);
+ ASSERT (rotl16 (43981, 7) == 59093);
+ ASSERT (rotl16 (43981, 8) == 52651);
+ ASSERT (rotl16 (43981, 9) == 39767);
+ ASSERT (rotl16 (43981, 10) == 13999);
+ ASSERT (rotl16 (43981, 11) == 27998);
+ ASSERT (rotl16 (43981, 12) == 55996);
+ ASSERT (rotl16 (43981, 13) == 46457);
+ ASSERT (rotl16 (43981, 14) == 27379);
+ ASSERT (rotl16 (43981, 15) == 54758);
+ ASSERT (rotl16 (43981, 16) == 43981);
+
+ ASSERT (rotr16 (43981, 0) == 43981);
+ ASSERT (rotr16 (43981, 1) == 54758);
+ ASSERT (rotr16 (43981, 2) == 27379);
+ ASSERT (rotr16 (43981, 3) == 46457);
+ ASSERT (rotr16 (43981, 4) == 55996);
+ ASSERT (rotr16 (43981, 5) == 27998);
+ ASSERT (rotr16 (43981, 6) == 13999);
+ ASSERT (rotr16 (43981, 7) == 39767);
+ ASSERT (rotr16 (43981, 8) == 52651);
+ ASSERT (rotr16 (43981, 9) == 59093);
+ ASSERT (rotr16 (43981, 10) == 62314);
+ ASSERT (rotr16 (43981, 11) == 31157);
+ ASSERT (rotr16 (43981, 12) == 48346);
+ ASSERT (rotr16 (43981, 13) == 24173);
+ ASSERT (rotr16 (43981, 14) == 44854);
+ ASSERT (rotr16 (43981, 15) == 22427);
+ ASSERT (rotr16 (43981, 16) == 43981);
+
+ ASSERT (rotl32 (2309737967U, 1) == 324508639U);
+ ASSERT (rotl32 (2309737967U, 2) == 649017278U);
+ ASSERT (rotl32 (2309737967U, 3) == 1298034556U);
+ ASSERT (rotl32 (2309737967U, 4) == 2596069112U);
+ ASSERT (rotl32 (2309737967U, 5) == 897170929U);
+ ASSERT (rotl32 (2309737967U, 6) == 1794341858U);
+ ASSERT (rotl32 (2309737967U, 7) == 3588683716U);
+ ASSERT (rotl32 (2309737967U, 8) == 2882400137U);
+ ASSERT (rotl32 (2309737967U, 9) == 1469832979U);
+ ASSERT (rotl32 (2309737967U, 10) == 2939665958U);
+ ASSERT (rotl32 (2309737967U, 11) == 1584364621U);
+ ASSERT (rotl32 (2309737967U, 12) == 3168729242U);
+ ASSERT (rotl32 (2309737967U, 13) == 2042491189U);
+ ASSERT (rotl32 (2309737967U, 14) == 4084982378U);
+ ASSERT (rotl32 (2309737967U, 15) == 3874997461U);
+ ASSERT (rotl32 (2309737967U, 16) == 3455027627U);
+ ASSERT (rotl32 (2309737967U, 17) == 2615087959U);
+ ASSERT (rotl32 (2309737967U, 18) == 935208623U);
+ ASSERT (rotl32 (2309737967U, 19) == 1870417246U);
+ ASSERT (rotl32 (2309737967U, 20) == 3740834492U);
+ ASSERT (rotl32 (2309737967U, 21) == 3186701689U);
+ ASSERT (rotl32 (2309737967U, 22) == 2078436083U);
+ ASSERT (rotl32 (2309737967U, 23) == 4156872166U);
+ ASSERT (rotl32 (2309737967U, 24) == 4018777037U);
+ ASSERT (rotl32 (2309737967U, 25) == 3742586779U);
+ ASSERT (rotl32 (2309737967U, 26) == 3190206263U);
+ ASSERT (rotl32 (2309737967U, 27) == 2085445231U);
+ ASSERT (rotl32 (2309737967U, 28) == 4170890462U);
+ ASSERT (rotl32 (2309737967U, 29) == 4046813629U);
+ ASSERT (rotl32 (2309737967U, 30) == 3798659963U);
+ ASSERT (rotl32 (2309737967U, 31) == 3302352631U);
+
+ ASSERT (rotr32 (2309737967U, 1) == 3302352631lU);
+ ASSERT (rotr32 (2309737967U, 2) == 3798659963lU);
+ ASSERT (rotr32 (2309737967U, 3) == 4046813629lU);
+ ASSERT (rotr32 (2309737967U, 4) == 4170890462lU);
+ ASSERT (rotr32 (2309737967U, 5) == 2085445231lU);
+ ASSERT (rotr32 (2309737967U, 6) == 3190206263lU);
+ ASSERT (rotr32 (2309737967U, 7) == 3742586779lU);
+ ASSERT (rotr32 (2309737967U, 8) == 4018777037lU);
+ ASSERT (rotr32 (2309737967U, 9) == 4156872166lU);
+ ASSERT (rotr32 (2309737967U, 10) == 2078436083lU);
+ ASSERT (rotr32 (2309737967U, 11) == 3186701689lU);
+ ASSERT (rotr32 (2309737967U, 12) == 3740834492lU);
+ ASSERT (rotr32 (2309737967U, 13) == 1870417246lU);
+ ASSERT (rotr32 (2309737967U, 14) == 935208623lU);
+ ASSERT (rotr32 (2309737967U, 15) == 2615087959lU);
+ ASSERT (rotr32 (2309737967U, 16) == 3455027627lU);
+ ASSERT (rotr32 (2309737967U, 17) == 3874997461lU);
+ ASSERT (rotr32 (2309737967U, 18) == 4084982378lU);
+ ASSERT (rotr32 (2309737967U, 19) == 2042491189lU);
+ ASSERT (rotr32 (2309737967U, 20) == 3168729242lU);
+ ASSERT (rotr32 (2309737967U, 21) == 1584364621lU);
+ ASSERT (rotr32 (2309737967U, 22) == 2939665958lU);
+ ASSERT (rotr32 (2309737967U, 23) == 1469832979lU);
+ ASSERT (rotr32 (2309737967U, 24) == 2882400137lU);
+ ASSERT (rotr32 (2309737967U, 25) == 3588683716lU);
+ ASSERT (rotr32 (2309737967U, 26) == 1794341858lU);
+ ASSERT (rotr32 (2309737967U, 27) == 897170929lU);
+ ASSERT (rotr32 (2309737967U, 28) == 2596069112lU);
+ ASSERT (rotr32 (2309737967U, 29) == 1298034556lU);
+ ASSERT (rotr32 (2309737967U, 30) == 649017278lU);
+ ASSERT (rotr32 (2309737967U, 31) == 324508639lU);
+
+#ifdef UINT64_MAX
+ ASSERT (rotl64 (16045690984503098046ULL, 1) == 13644637895296644477ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 2) == 8842531716883737339ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 3) == 17685063433767474678ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 4) == 16923382793825397741ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 5) == 15400021513941243867ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 6) == 12353298954172936119ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 7) == 6259853834636320623ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 8) == 12519707669272641246ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 9) == 6592671264835730877ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 10) == 13185342529671461754ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 11) == 7923940985633371893ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 12) == 15847881971266743786ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 13) == 13249019868823935957ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 14) == 8051295663938320299ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 15) == 16102591327876640598ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 16) == 13758438582043729581ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 17) == 9070133090377907547ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 18) == 18140266180755815094ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 19) == 17833788287802078573ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 20) == 17220832501894605531ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 21) == 15994920930079659447ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 22) == 13543097786449767279ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 23) == 8639451499189982943ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 24) == 17278902998379965886ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 25) == 16111061923050380157ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 26) == 13775379772391208699ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 27) == 9104015471072865783ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 28) == 18208030942145731566ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 29) == 17969317810581911517ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 30) == 17491891547454271419ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 31) == 16537039021198991223ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 32) == 14627333968688430831ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 33) == 10807923863667310047ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 34) == 3169103653625068479ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 35) == 6338207307250136958ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 36) == 12676414614500273916ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 37) == 6906085155290996217ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 38) == 13812170310581992434ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 39) == 9177596547454433253ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 40) == 18355193094908866506ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 41) == 18263642116108181397ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 42) == 18080540158506811179ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 43) == 17714336243304070743ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 44) == 16981928412898589871ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 45) == 15517112752087628127ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 46) == 12587481430465704639ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 47) == 6728218787221857663ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 48) == 13456437574443715326ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 49) == 8466131075177879037ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 50) == 16932262150355758074ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 51) == 15417780227001964533ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 52) == 12388816380294377451ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 53) == 6330888686879203287ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 54) == 12661777373758406574ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 55) == 6876810673807261533ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 56) == 13753621347614523066ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 57) == 9060498621519494517ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 58) == 18120997243038989034ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 59) == 17795250412368426453ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 60) == 17143756751027301291ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 61) == 15840769428345050967ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 62) == 13234794782980550319ULL);
+ ASSERT (rotl64 (16045690984503098046ULL, 63) == 8022845492251549023ULL);
+
+ ASSERT (rotr64 (16045690984503098046ULL, 1) == 8022845492251549023ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 2) == 13234794782980550319ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 3) == 15840769428345050967ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 4) == 17143756751027301291ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 5) == 17795250412368426453ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 6) == 18120997243038989034ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 7) == 9060498621519494517ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 8) == 13753621347614523066ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 9) == 6876810673807261533ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 10) == 12661777373758406574ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 11) == 6330888686879203287ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 12) == 12388816380294377451ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 13) == 15417780227001964533ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 14) == 16932262150355758074ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 15) == 8466131075177879037ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 16) == 13456437574443715326ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 17) == 6728218787221857663ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 18) == 12587481430465704639ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 19) == 15517112752087628127ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 20) == 16981928412898589871ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 21) == 17714336243304070743ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 22) == 18080540158506811179ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 23) == 18263642116108181397ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 24) == 18355193094908866506ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 25) == 9177596547454433253ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 26) == 13812170310581992434ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 27) == 6906085155290996217ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 28) == 12676414614500273916ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 29) == 6338207307250136958ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 30) == 3169103653625068479ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 31) == 10807923863667310047ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 32) == 14627333968688430831ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 33) == 16537039021198991223ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 34) == 17491891547454271419ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 35) == 17969317810581911517ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 36) == 18208030942145731566ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 37) == 9104015471072865783ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 38) == 13775379772391208699ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 39) == 16111061923050380157ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 40) == 17278902998379965886ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 41) == 8639451499189982943ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 42) == 13543097786449767279ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 43) == 15994920930079659447ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 44) == 17220832501894605531ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 45) == 17833788287802078573ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 46) == 18140266180755815094ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 47) == 9070133090377907547ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 48) == 13758438582043729581ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 49) == 16102591327876640598ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 50) == 8051295663938320299ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 51) == 13249019868823935957ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 52) == 15847881971266743786ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 53) == 7923940985633371893ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 54) == 13185342529671461754ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 55) == 6592671264835730877ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 56) == 12519707669272641246ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 57) == 6259853834636320623ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 58) == 12353298954172936119ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 59) == 15400021513941243867ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 60) == 16923382793825397741ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 61) == 17685063433767474678ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 62) == 8842531716883737339ULL);
+ ASSERT (rotr64 (16045690984503098046ULL, 63) == 13644637895296644477ULL);
+#endif /* UINT64_MAX */
+
+ return 0;
+}
diff --git a/gnulib/tests/test-btowc.c b/gnulib/tests/test-btowc.c
new file mode 100644
index 00000000..9d115960
--- /dev/null
+++ b/gnulib/tests/test-btowc.c
@@ -0,0 +1,63 @@
+/* Test of conversion of unibyte character to wide character.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (btowc, wint_t, (int));
+
+#include <locale.h>
+#include <stdio.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ int c;
+
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ ASSERT (btowc (EOF) == WEOF);
+
+ if (argc > 1)
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ for (c = 0; c < 0x80; c++)
+ ASSERT (btowc (c) == c);
+ for (c = 0xA0; c < 0x100; c++)
+ ASSERT (btowc (c) != WEOF);
+ return 0;
+
+ case '2':
+ /* Locale encoding is UTF-8. */
+ for (c = 0; c < 0x80; c++)
+ ASSERT (btowc (c) == c);
+ for (c = 0x80; c < 0x100; c++)
+ ASSERT (btowc (c) == WEOF);
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-btowc1.sh b/gnulib/tests/test-btowc1.sh
new file mode 100755
index 00000000..aaef48d2
--- /dev/null
+++ b/gnulib/tests/test-btowc1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-btowc${EXEEXT} 1
diff --git a/gnulib/tests/test-btowc2.sh b/gnulib/tests/test-btowc2.sh
new file mode 100755
index 00000000..2e060384
--- /dev/null
+++ b/gnulib/tests/test-btowc2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-btowc${EXEEXT} 2
diff --git a/gnulib/tests/test-byteswap.c b/gnulib/tests/test-byteswap.c
new file mode 100644
index 00000000..0c036052
--- /dev/null
+++ b/gnulib/tests/test-byteswap.c
@@ -0,0 +1,32 @@
+/* Test of <byteswap.h> substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <byteswap.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (bswap_16 (0xABCD) == 0xCDAB);
+ ASSERT (bswap_32 (0xDEADBEEF) == 0xEFBEADDE);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-c-ctype.c b/gnulib/tests/test-c-ctype.c
new file mode 100644
index 00000000..ebe594dd
--- /dev/null
+++ b/gnulib/tests/test-c-ctype.c
@@ -0,0 +1,386 @@
+/* Test of character handling in C locale.
+ Copyright (C) 2005, 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+#include "c-ctype.h"
+
+#include <locale.h>
+
+#include "macros.h"
+
+static void
+test_all (void)
+{
+ int c;
+
+ for (c = -0x80; c < 0x100; c++)
+ {
+ ASSERT (c_isascii (c) == (c >= 0 && c < 0x80));
+
+ switch (c)
+ {
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ ASSERT (c_isalnum (c) == 1);
+ break;
+ default:
+ ASSERT (c_isalnum (c) == 0);
+ break;
+ }
+
+ switch (c)
+ {
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ ASSERT (c_isalpha (c) == 1);
+ break;
+ default:
+ ASSERT (c_isalpha (c) == 0);
+ break;
+ }
+
+ switch (c)
+ {
+ case '\t': case ' ':
+ ASSERT (c_isblank (c) == 1);
+ break;
+ default:
+ ASSERT (c_isblank (c) == 0);
+ break;
+ }
+
+ ASSERT (c_iscntrl (c) == ((c >= 0 && c < 0x20) || c == 0x7f));
+
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ ASSERT (c_isdigit (c) == 1);
+ break;
+ default:
+ ASSERT (c_isdigit (c) == 0);
+ break;
+ }
+
+ switch (c)
+ {
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ ASSERT (c_islower (c) == 1);
+ break;
+ default:
+ ASSERT (c_islower (c) == 0);
+ break;
+ }
+
+ ASSERT (c_isgraph (c) == ((c >= 0x20 && c < 0x7f) && c != ' '));
+
+ ASSERT (c_isprint (c) == (c >= 0x20 && c < 0x7f));
+
+ ASSERT (c_ispunct (c) == (c_isgraph (c) && !c_isalnum (c)));
+
+ switch (c)
+ {
+ case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
+ ASSERT (c_isspace (c) == 1);
+ break;
+ default:
+ ASSERT (c_isspace (c) == 0);
+ break;
+ }
+
+ switch (c)
+ {
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ ASSERT (c_isupper (c) == 1);
+ break;
+ default:
+ ASSERT (c_isupper (c) == 0);
+ break;
+ }
+
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ ASSERT (c_isxdigit (c) == 1);
+ break;
+ default:
+ ASSERT (c_isxdigit (c) == 0);
+ break;
+ }
+
+ switch (c)
+ {
+ case 'A':
+ ASSERT (c_tolower (c) == 'a');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'B':
+ ASSERT (c_tolower (c) == 'b');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'C':
+ ASSERT (c_tolower (c) == 'c');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'D':
+ ASSERT (c_tolower (c) == 'd');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'E':
+ ASSERT (c_tolower (c) == 'e');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'F':
+ ASSERT (c_tolower (c) == 'f');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'G':
+ ASSERT (c_tolower (c) == 'g');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'H':
+ ASSERT (c_tolower (c) == 'h');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'I':
+ ASSERT (c_tolower (c) == 'i');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'J':
+ ASSERT (c_tolower (c) == 'j');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'K':
+ ASSERT (c_tolower (c) == 'k');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'L':
+ ASSERT (c_tolower (c) == 'l');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'M':
+ ASSERT (c_tolower (c) == 'm');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'N':
+ ASSERT (c_tolower (c) == 'n');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'O':
+ ASSERT (c_tolower (c) == 'o');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'P':
+ ASSERT (c_tolower (c) == 'p');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'Q':
+ ASSERT (c_tolower (c) == 'q');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'R':
+ ASSERT (c_tolower (c) == 'r');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'S':
+ ASSERT (c_tolower (c) == 's');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'T':
+ ASSERT (c_tolower (c) == 't');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'U':
+ ASSERT (c_tolower (c) == 'u');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'V':
+ ASSERT (c_tolower (c) == 'v');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'W':
+ ASSERT (c_tolower (c) == 'w');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'X':
+ ASSERT (c_tolower (c) == 'x');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'Y':
+ ASSERT (c_tolower (c) == 'y');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'Z':
+ ASSERT (c_tolower (c) == 'z');
+ ASSERT (c_toupper (c) == c);
+ break;
+ case 'a':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'A');
+ break;
+ case 'b':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'B');
+ break;
+ case 'c':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'C');
+ break;
+ case 'd':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'D');
+ break;
+ case 'e':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'E');
+ break;
+ case 'f':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'F');
+ break;
+ case 'g':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'G');
+ break;
+ case 'h':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'H');
+ break;
+ case 'i':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'I');
+ break;
+ case 'j':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'J');
+ break;
+ case 'k':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'K');
+ break;
+ case 'l':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'L');
+ break;
+ case 'm':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'M');
+ break;
+ case 'n':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'N');
+ break;
+ case 'o':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'O');
+ break;
+ case 'p':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'P');
+ break;
+ case 'q':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'Q');
+ break;
+ case 'r':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'R');
+ break;
+ case 's':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'S');
+ break;
+ case 't':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'T');
+ break;
+ case 'u':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'U');
+ break;
+ case 'v':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'V');
+ break;
+ case 'w':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'W');
+ break;
+ case 'x':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'X');
+ break;
+ case 'y':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'Y');
+ break;
+ case 'z':
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == 'Z');
+ break;
+ default:
+ ASSERT (c_tolower (c) == c);
+ ASSERT (c_toupper (c) == c);
+ break;
+ }
+ }
+}
+
+int
+main ()
+{
+ test_all ();
+
+ setlocale (LC_ALL, "de_DE");
+ test_all ();
+
+ setlocale (LC_ALL, "ja_JP.EUC-JP");
+ test_all ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-c-stack.c b/gnulib/tests/test-c-stack.c
new file mode 100644
index 00000000..0b77fbfb
--- /dev/null
+++ b/gnulib/tests/test-c-stack.c
@@ -0,0 +1,76 @@
+/* Test of c-stack module.
+ Copyright (C) 2002, 2004, 2006, 2008-2010 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/>. */
+
+#include <config.h>
+
+#include "c-stack.h"
+
+#include "exitfail.h"
+#include <stdio.h>
+#if HAVE_SETRLIMIT
+/* At least FreeBSD 5.0 needs extra headers before <sys/resource.h>
+ will compile. */
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif
+
+#include "macros.h"
+
+char *program_name;
+
+static volatile int *
+recurse_1 (volatile int n, volatile int *p)
+{
+ if (n >= 0)
+ *recurse_1 (n + 1, p) += n;
+ return p;
+}
+
+static int
+recurse (volatile int n)
+{
+ int sum = 0;
+ return *recurse_1 (n, &sum);
+}
+
+int
+main (int argc, char **argv)
+{
+#if HAVE_SETRLIMIT && defined RLIMIT_STACK
+ /* Before starting the endless recursion, try to be friendly to the
+ user's machine. On some Linux 2.2.x systems, there is no stack
+ limit for user processes at all. We don't want to kill such
+ systems. */
+ struct rlimit rl;
+ rl.rlim_cur = rl.rlim_max = 0x100000; /* 1 MB */
+ setrlimit (RLIMIT_STACK, &rl);
+#endif
+
+ program_name = argv[0];
+ if (c_stack_action (0) == 0)
+ {
+ if (1 < argc)
+ {
+ exit_failure = 77;
+ ++*argv[argc]; /* Intentionally dereference NULL. */
+ }
+ return recurse (0);
+ }
+ fputs ("skipping test: ", stderr);
+ perror ("c_stack_action");
+ return 77;
+}
diff --git a/gnulib/tests/test-c-stack.sh b/gnulib/tests/test-c-stack.sh
new file mode 100755
index 00000000..f9790656
--- /dev/null
+++ b/gnulib/tests/test-c-stack.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="t-c-stack.tmp"
+./test-c-stack${EXEEXT} 2> t-c-stack.tmp
+case $? in
+ 77) cat t-c-stack.tmp >&2; (exit 77); exit 77 ;;
+ 1) ;;
+ *) (exit 1); exit 1 ;;
+esac
+if grep 'stack overflow' t-c-stack.tmp >/dev/null ; then
+ :
+else
+ (exit 1); exit 1
+fi
+
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-c-stack2.sh b/gnulib/tests/test-c-stack2.sh
new file mode 100755
index 00000000..a80373dc
--- /dev/null
+++ b/gnulib/tests/test-c-stack2.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="t-c-stack2.tmp"
+
+# Sanitize exit status within a subshell, since some shells fail to
+# redirect stderr on their message about death due to signal.
+(./test-c-stack${EXEEXT} 1; exit $?) 2> t-c-stack2.tmp
+
+case $? in
+ 77) if grep 'stack overflow' t-c-stack2.tmp >/dev/null ; then
+ if test -z "$LIBSIGSEGV"; then
+ echo 'cannot tell stack overflow from crash; consider installing libsigsegv' >&2
+ exit 77
+ else
+ echo 'cannot tell stack overflow from crash, in spite of libsigsegv' >&2
+ exit 1
+ fi
+ else
+ cat t-c-stack2.tmp >&2
+ exit 77
+ fi
+ ;;
+ 0) (exit 1); exit 1 ;;
+esac
+if grep 'program error' t-c-stack2.tmp >/dev/null ; then
+ :
+else
+ (exit 1); exit 1
+fi
+
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-c-strcase.sh b/gnulib/tests/test-c-strcase.sh
new file mode 100755
index 00000000..5fcf906b
--- /dev/null
+++ b/gnulib/tests/test-c-strcase.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test in the C locale.
+./test-c-strcasecmp${EXEEXT} || exit 1
+./test-c-strncasecmp${EXEEXT} || exit 1
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR != none; then
+ LC_ALL=$LOCALE_FR ./test-c-strcasecmp${EXEEXT} locale || exit 1
+ LC_ALL=$LOCALE_FR ./test-c-strncasecmp${EXEEXT} locale || exit 1
+fi
+
+# Test in a Turkish UTF-8 locale.
+: ${LOCALE_TR_UTF8=tr_TR.UTF-8}
+if test $LOCALE_TR_UTF8 != none; then
+ LC_ALL=$LOCALE_TR_UTF8 ./test-c-strcasecmp${EXEEXT} locale || exit 1
+ LC_ALL=$LOCALE_TR_UTF8 ./test-c-strncasecmp${EXEEXT} locale || exit 1
+fi
+
+exit 0
diff --git a/gnulib/tests/test-c-strcasecmp.c b/gnulib/tests/test-c-strcasecmp.c
new file mode 100644
index 00000000..84ea9b55
--- /dev/null
+++ b/gnulib/tests/test-c-strcasecmp.c
@@ -0,0 +1,65 @@
+/* Test of case-insensitive string comparison function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "c-strcase.h"
+
+#include <locale.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ if (argc > 1)
+ {
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+ }
+
+ ASSERT (c_strcasecmp ("paragraph", "Paragraph") == 0);
+
+ ASSERT (c_strcasecmp ("paragrapH", "parAgRaph") == 0);
+
+ ASSERT (c_strcasecmp ("paragraph", "paraLyzed") < 0);
+ ASSERT (c_strcasecmp ("paraLyzed", "paragraph") > 0);
+
+ ASSERT (c_strcasecmp ("para", "paragraph") < 0);
+ ASSERT (c_strcasecmp ("paragraph", "para") > 0);
+
+ /* The following tests shows how c_strcasecmp() is different from
+ strcasecmp(). */
+
+ ASSERT (c_strcasecmp ("\311mile", "\351mile") < 0);
+ ASSERT (c_strcasecmp ("\351mile", "\311mile") > 0);
+
+ /* The following tests shows how c_strcasecmp() is different from
+ mbscasecmp(). */
+
+ ASSERT (c_strcasecmp ("\303\266zg\303\274r", "\303\226ZG\303\234R") > 0); /* özgür */
+ ASSERT (c_strcasecmp ("\303\226ZG\303\234R", "\303\266zg\303\274r") < 0); /* özgür */
+
+ /* This test shows how strings of different size cannot compare equal. */
+ ASSERT (c_strcasecmp ("turkish", "TURK\304\260SH") < 0);
+ ASSERT (c_strcasecmp ("TURK\304\260SH", "turkish") > 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-c-strcasestr.c b/gnulib/tests/test-c-strcasestr.c
new file mode 100644
index 00000000..a97ea141
--- /dev/null
+++ b/gnulib/tests/test-c-strcasestr.c
@@ -0,0 +1,134 @@
+/* Test of case-insensitive searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "c-strcasestr.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ {
+ const char input[] = "foo";
+ const char *result = c_strcasestr (input, "");
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "foo";
+ const char *result = c_strcasestr (input, "O");
+ ASSERT (result == input + 1);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = c_strcasestr (input, "ABCDaBD");
+ ASSERT (result == input + 15);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = c_strcasestr (input, "ABCDaBE");
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = c_strcasestr (input, "ABCDaBCD");
+ ASSERT (result == input + 11);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaAAAAaaaaaaa"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'A', m);
+ haystack[0] = 'B';
+ haystack[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (c_strcasestr (haystack, needle) == haystack + 1);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+ needle[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (c_strcasestr (haystack, needle) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 2);
+ char *needle = (char *) malloc (m + 2);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ haystack[2 * m + 1] = '\0';
+
+ memset (needle, 'a', m);
+ needle[m] = 'B';
+ needle[m + 1] = '\0';
+
+ result = c_strcasestr (haystack, needle);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-c-strncasecmp.c b/gnulib/tests/test-c-strncasecmp.c
new file mode 100644
index 00000000..f02cb2d6
--- /dev/null
+++ b/gnulib/tests/test-c-strncasecmp.c
@@ -0,0 +1,79 @@
+/* Test of case-insensitive string comparison function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "c-strcase.h"
+
+#include <locale.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ if (argc > 1)
+ {
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+ }
+
+ ASSERT (c_strncasecmp ("paragraph", "Paragraph", 1000000) == 0);
+ ASSERT (c_strncasecmp ("paragraph", "Paragraph", 9) == 0);
+
+ ASSERT (c_strncasecmp ("paragrapH", "parAgRaph", 1000000) == 0);
+ ASSERT (c_strncasecmp ("paragrapH", "parAgRaph", 9) == 0);
+
+ ASSERT (c_strncasecmp ("paragraph", "paraLyzed", 10) < 0);
+ ASSERT (c_strncasecmp ("paragraph", "paraLyzed", 9) < 0);
+ ASSERT (c_strncasecmp ("paragraph", "paraLyzed", 5) < 0);
+ ASSERT (c_strncasecmp ("paragraph", "paraLyzed", 4) == 0);
+ ASSERT (c_strncasecmp ("paraLyzed", "paragraph", 10) > 0);
+ ASSERT (c_strncasecmp ("paraLyzed", "paragraph", 9) > 0);
+ ASSERT (c_strncasecmp ("paraLyzed", "paragraph", 5) > 0);
+ ASSERT (c_strncasecmp ("paraLyzed", "paragraph", 4) == 0);
+
+ ASSERT (c_strncasecmp ("para", "paragraph", 10) < 0);
+ ASSERT (c_strncasecmp ("para", "paragraph", 9) < 0);
+ ASSERT (c_strncasecmp ("para", "paragraph", 5) < 0);
+ ASSERT (c_strncasecmp ("para", "paragraph", 4) == 0);
+ ASSERT (c_strncasecmp ("paragraph", "para", 10) > 0);
+ ASSERT (c_strncasecmp ("paragraph", "para", 9) > 0);
+ ASSERT (c_strncasecmp ("paragraph", "para", 5) > 0);
+ ASSERT (c_strncasecmp ("paragraph", "para", 4) == 0);
+
+ /* The following tests shows how c_strncasecmp() is different from
+ strncasecmp(). */
+
+ ASSERT (c_strncasecmp ("\311mily", "\351mile", 4) < 0);
+ ASSERT (c_strncasecmp ("\351mile", "\311mily", 4) > 0);
+
+ /* The following tests shows how c_strncasecmp() is different from
+ mbsncasecmp(). */
+
+ ASSERT (c_strncasecmp ("\303\266zg\303\274r", "\303\226ZG\303\234R", 99) > 0); /* özgür */
+ ASSERT (c_strncasecmp ("\303\226ZG\303\234R", "\303\266zg\303\274r", 99) < 0); /* özgür */
+
+ /* This test shows how strings of different size cannot compare equal. */
+ ASSERT (c_strncasecmp ("turkish", "TURK\304\260SH", 7) < 0);
+ ASSERT (c_strncasecmp ("TURK\304\260SH", "turkish", 7) > 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-c-strstr.c b/gnulib/tests/test-c-strstr.c
new file mode 100644
index 00000000..41c49661
--- /dev/null
+++ b/gnulib/tests/test-c-strstr.c
@@ -0,0 +1,127 @@
+/* Test of searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "c-strstr.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ {
+ const char input[] = "foo";
+ const char *result = c_strstr (input, "");
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "foo";
+ const char *result = c_strstr (input, "o");
+ ASSERT (result == input + 1);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = c_strstr (input, "ABCDABD");
+ ASSERT (result == input + 15);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = c_strstr (input, "ABCDABE");
+ ASSERT (result == NULL);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'A', m);
+ haystack[0] = 'B';
+ haystack[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (c_strstr (haystack, needle) == haystack + 1);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+ needle[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (c_strstr (haystack, needle) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 2);
+ char *needle = (char *) malloc (m + 2);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ haystack[2 * m + 1] = '\0';
+
+ memset (needle, 'A', m);
+ needle[m] = 'B';
+ needle[m + 1] = '\0';
+
+ result = c_strstr (haystack, needle);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-canonicalize-lgpl.c b/gnulib/tests/test-canonicalize-lgpl.c
new file mode 100644
index 00000000..cbf481d3
--- /dev/null
+++ b/gnulib/tests/test-canonicalize-lgpl.c
@@ -0,0 +1,222 @@
+/* Test of execution of program termination handlers.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (realpath, char *, (const char *, char *));
+SIGNATURE_CHECK (canonicalize_file_name, char *, (const char *));
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "same-inode.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "t-can-lgpl.tmp"
+
+static void *
+null_ptr (void)
+{
+ return NULL;
+}
+
+int
+main (void)
+{
+#ifdef GNULIB_CANONICALIZE
+ /* No need to test canonicalize-lgpl module if canonicalize is also
+ in use. */
+ return 0;
+#endif
+
+ /* Setup some hierarchy to be used by this test. Start by removing
+ any leftovers from a previous partial run. */
+ {
+ int fd;
+ ignore_value (system ("rm -rf " BASE " ise"));
+ ASSERT (mkdir (BASE, 0700) == 0);
+ fd = creat (BASE "/tra", 0600);
+ ASSERT (0 <= fd);
+ ASSERT (close (fd) == 0);
+ }
+
+ /* Check for ., .., intermediate // handling, and for error cases. */
+ {
+ char *result = canonicalize_file_name (BASE "//./..//" BASE "/tra");
+ ASSERT (result != NULL);
+ ASSERT (strstr (result, "/" BASE "/tra")
+ == result + strlen (result) - strlen ("/" BASE "/tra"));
+ free (result);
+ errno = 0;
+ result = canonicalize_file_name ("");
+ ASSERT (result == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ result = canonicalize_file_name (null_ptr ());
+ ASSERT (result == NULL);
+ ASSERT (errno == EINVAL);
+ }
+
+ /* Check that a non-directory with trailing slash yields NULL. */
+ {
+ char *result;
+ errno = 0;
+ result = canonicalize_file_name (BASE "/tra/");
+ ASSERT (result == NULL);
+ ASSERT (errno == ENOTDIR);
+ }
+
+ /* Check that a missing directory yields NULL. */
+ {
+ char *result;
+ errno = 0;
+ result = canonicalize_file_name (BASE "/zzz/..");
+ ASSERT (result == NULL);
+ ASSERT (errno == ENOENT);
+ }
+
+ /* From here on out, tests involve symlinks. */
+ if (symlink (BASE "/ket", "ise") != 0)
+ {
+ ASSERT (remove (BASE "/tra") == 0);
+ ASSERT (rmdir (BASE) == 0);
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (symlink ("bef", BASE "/plo") == 0);
+ ASSERT (symlink ("tra", BASE "/huk") == 0);
+ ASSERT (symlink ("lum", BASE "/bef") == 0);
+ ASSERT (symlink ("wum", BASE "/ouk") == 0);
+ ASSERT (symlink ("../ise", BASE "/ket") == 0);
+ ASSERT (mkdir (BASE "/lum", 0700) == 0);
+ ASSERT (symlink ("//.//../..", BASE "/droot") == 0);
+
+ /* Check that the symbolic link to a file can be resolved. */
+ {
+ char *result1 = canonicalize_file_name (BASE "/huk");
+ char *result2 = canonicalize_file_name (BASE "/tra");
+ ASSERT (result1 != NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (strcmp (result1, result2) == 0);
+ ASSERT (strcmp (result1 + strlen (result1) - strlen ("/" BASE "/tra"),
+ "/" BASE "/tra") == 0);
+ free (result1);
+ free (result2);
+ }
+
+ /* Check that the symbolic link to a directory can be resolved. */
+ {
+ char *result1 = canonicalize_file_name (BASE "/plo");
+ char *result2 = canonicalize_file_name (BASE "/bef");
+ char *result3 = canonicalize_file_name (BASE "/lum");
+ ASSERT (result1 != NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (result3 != NULL);
+ ASSERT (strcmp (result1, result2) == 0);
+ ASSERT (strcmp (result2, result3) == 0);
+ ASSERT (strcmp (result1 + strlen (result1) - strlen ("/" BASE "/lum"),
+ "/" BASE "/lum") == 0);
+ free (result1);
+ free (result2);
+ free (result3);
+ }
+
+ /* Check that a symbolic link to a nonexistent file yields NULL. */
+ {
+ char *result;
+ errno = 0;
+ result = canonicalize_file_name (BASE "/ouk");
+ ASSERT (result == NULL);
+ ASSERT (errno == ENOENT);
+ }
+
+ /* Check that a non-directory symlink with trailing slash yields NULL. */
+ {
+ char *result;
+ errno = 0;
+ result = canonicalize_file_name (BASE "/huk/");
+ ASSERT (result == NULL);
+ ASSERT (errno == ENOTDIR);
+ }
+
+ /* Check that a missing directory via symlink yields NULL. */
+ {
+ char *result;
+ errno = 0;
+ result = canonicalize_file_name (BASE "/ouk/..");
+ ASSERT (result == NULL);
+ ASSERT (errno == ENOENT);
+ }
+
+ /* Check that a loop of symbolic links is detected. */
+ {
+ char *result;
+ errno = 0;
+ result = canonicalize_file_name ("ise");
+ ASSERT (result == NULL);
+ ASSERT (errno == ELOOP);
+ }
+
+ /* Check that leading // is honored correctly. */
+ {
+ struct stat st1;
+ struct stat st2;
+ char *result1 = canonicalize_file_name ("//.");
+ char *result2 = canonicalize_file_name (BASE "/droot");
+ ASSERT (result1);
+ ASSERT (result2);
+ ASSERT (stat ("/", &st1) == 0);
+ ASSERT (stat ("//", &st2) == 0);
+ if (SAME_INODE (st1, st2))
+ {
+ ASSERT (strcmp (result1, "/") == 0);
+ ASSERT (strcmp (result2, "/") == 0);
+ }
+ else
+ {
+ ASSERT (strcmp (result1, "//") == 0);
+ ASSERT (strcmp (result2, "//") == 0);
+ }
+ free (result1);
+ free (result2);
+ }
+
+
+ /* Cleanup. */
+ ASSERT (remove (BASE "/droot") == 0);
+ ASSERT (remove (BASE "/plo") == 0);
+ ASSERT (remove (BASE "/huk") == 0);
+ ASSERT (remove (BASE "/bef") == 0);
+ ASSERT (remove (BASE "/ouk") == 0);
+ ASSERT (remove (BASE "/ket") == 0);
+ ASSERT (remove (BASE "/lum") == 0);
+ ASSERT (remove (BASE "/tra") == 0);
+ ASSERT (remove (BASE) == 0);
+ ASSERT (remove ("ise") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-canonicalize.c b/gnulib/tests/test-canonicalize.c
new file mode 100644
index 00000000..f8d35365
--- /dev/null
+++ b/gnulib/tests/test-canonicalize.c
@@ -0,0 +1,347 @@
+/* Test of execution of file name canonicalization.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "canonicalize.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "same-inode.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "t-can.tmp"
+
+static void *
+null_ptr (void)
+{
+ return NULL;
+}
+
+int
+main (void)
+{
+ /* Setup some hierarchy to be used by this test. Start by removing
+ any leftovers from a previous partial run. */
+ {
+ int fd;
+ ignore_value (system ("rm -rf " BASE " ise"));
+ ASSERT (mkdir (BASE, 0700) == 0);
+ fd = creat (BASE "/tra", 0600);
+ ASSERT (0 <= fd);
+ ASSERT (close (fd) == 0);
+ }
+
+ /* Check for ., .., intermediate // handling, and for error cases. */
+ {
+ char *result1 = canonicalize_file_name (BASE "//./..//" BASE "/tra");
+ char *result2 = canonicalize_filename_mode (BASE "//./..//" BASE "/tra",
+ CAN_EXISTING);
+ ASSERT (result1 != NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (strcmp (result1, result2) == 0);
+ ASSERT (strstr (result1, "/" BASE "/tra")
+ == result1 + strlen (result1) - strlen ("/" BASE "/tra"));
+ free (result1);
+ free (result2);
+ errno = 0;
+ result1 = canonicalize_file_name ("");
+ ASSERT (result1 == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ result2 = canonicalize_filename_mode ("", CAN_EXISTING);
+ ASSERT (result2 == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ result1 = canonicalize_file_name (null_ptr ());
+ ASSERT (result1 == NULL);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ result2 = canonicalize_filename_mode (NULL, CAN_EXISTING);
+ ASSERT (result2 == NULL);
+ ASSERT (errno == EINVAL);
+ }
+
+ /* Check that a non-directory with trailing slash yields NULL. */
+ {
+ char *result1;
+ char *result2;
+ errno = 0;
+ result1 = canonicalize_file_name (BASE "/tra/");
+ ASSERT (result1 == NULL);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ result2 = canonicalize_filename_mode (BASE "/tra/", CAN_EXISTING);
+ ASSERT (result2 == NULL);
+ ASSERT (errno == ENOTDIR);
+ }
+
+ /* Check that a missing directory yields NULL. */
+ {
+ char *result1;
+ char *result2;
+ errno = 0;
+ result1 = canonicalize_file_name (BASE "/zzz/..");
+ ASSERT (result1 == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ result2 = canonicalize_filename_mode (BASE "/zzz/..", CAN_EXISTING);
+ ASSERT (result2 == NULL);
+ ASSERT (errno == ENOENT);
+ }
+
+ /* From here on out, tests involve symlinks. */
+ if (symlink (BASE "/ket", "ise") != 0)
+ {
+ ASSERT (remove (BASE "/tra") == 0);
+ ASSERT (rmdir (BASE) == 0);
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (symlink ("bef", BASE "/plo") == 0);
+ ASSERT (symlink ("tra", BASE "/huk") == 0);
+ ASSERT (symlink ("lum", BASE "/bef") == 0);
+ ASSERT (symlink ("wum", BASE "/ouk") == 0);
+ ASSERT (symlink ("../ise", BASE "/ket") == 0);
+ ASSERT (mkdir (BASE "/lum", 0700) == 0);
+ ASSERT (symlink ("s", BASE "/p") == 0);
+ ASSERT (symlink ("d", BASE "/s") == 0);
+ ASSERT (mkdir (BASE "/d", 0700) == 0);
+ ASSERT (close (creat (BASE "/d/2", 0600)) == 0);
+ ASSERT (symlink ("../s/2", BASE "/d/1") == 0);
+ ASSERT (symlink ("//.//../..", BASE "/droot") == 0);
+
+ /* Check that the symbolic link to a file can be resolved. */
+ {
+ char *result1 = canonicalize_file_name (BASE "/huk");
+ char *result2 = canonicalize_file_name (BASE "/tra");
+ char *result3 = canonicalize_filename_mode (BASE "/huk", CAN_EXISTING);
+ ASSERT (result1 != NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (result3 != NULL);
+ ASSERT (strcmp (result1, result2) == 0);
+ ASSERT (strcmp (result2, result3) == 0);
+ ASSERT (strcmp (result1 + strlen (result1) - strlen ("/" BASE "/tra"),
+ "/" BASE "/tra") == 0);
+ free (result1);
+ free (result2);
+ free (result3);
+ }
+
+ /* Check that the symbolic link to a directory can be resolved. */
+ {
+ char *result1 = canonicalize_file_name (BASE "/plo");
+ char *result2 = canonicalize_file_name (BASE "/bef");
+ char *result3 = canonicalize_file_name (BASE "/lum");
+ char *result4 = canonicalize_filename_mode (BASE "/plo", CAN_EXISTING);
+ ASSERT (result1 != NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (result3 != NULL);
+ ASSERT (result4 != NULL);
+ ASSERT (strcmp (result1, result2) == 0);
+ ASSERT (strcmp (result2, result3) == 0);
+ ASSERT (strcmp (result3, result4) == 0);
+ ASSERT (strcmp (result1 + strlen (result1) - strlen ("/" BASE "/lum"),
+ "/" BASE "/lum") == 0);
+ free (result1);
+ free (result2);
+ free (result3);
+ free (result4);
+ }
+
+ /* Check that a symbolic link to a nonexistent file yields NULL. */
+ {
+ char *result1;
+ char *result2;
+ errno = 0;
+ result1 = canonicalize_file_name (BASE "/ouk");
+ ASSERT (result1 == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ result2 = canonicalize_filename_mode (BASE "/ouk", CAN_EXISTING);
+ ASSERT (result2 == NULL);
+ ASSERT (errno == ENOENT);
+ }
+
+ /* Check that a non-directory symlink with trailing slash yields NULL. */
+ {
+ char *result1;
+ char *result2;
+ errno = 0;
+ result1 = canonicalize_file_name (BASE "/huk/");
+ ASSERT (result1 == NULL);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ result2 = canonicalize_filename_mode (BASE "/huk/", CAN_EXISTING);
+ ASSERT (result2 == NULL);
+ ASSERT (errno == ENOTDIR);
+ }
+
+ /* Check that a missing directory via symlink yields NULL. */
+ {
+ char *result1;
+ char *result2;
+ errno = 0;
+ result1 = canonicalize_file_name (BASE "/ouk/..");
+ ASSERT (result1 == NULL);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ result2 = canonicalize_filename_mode (BASE "/ouk/..", CAN_EXISTING);
+ ASSERT (result2 == NULL);
+ ASSERT (errno == ENOENT);
+ }
+
+ /* Check that a loop of symbolic links is detected. */
+ {
+ char *result1;
+ char *result2;
+ errno = 0;
+ result1 = canonicalize_file_name ("ise");
+ ASSERT (result1 == NULL);
+ ASSERT (errno == ELOOP);
+ errno = 0;
+ result2 = canonicalize_filename_mode ("ise", CAN_EXISTING);
+ ASSERT (result2 == NULL);
+ ASSERT (errno == ELOOP);
+ }
+
+ /* Check that alternate modes can resolve missing basenames. */
+ {
+ char *result1 = canonicalize_filename_mode (BASE "/zzz", CAN_ALL_BUT_LAST);
+ char *result2 = canonicalize_filename_mode (BASE "/zzz", CAN_MISSING);
+ char *result3 = canonicalize_filename_mode (BASE "/zzz/", CAN_ALL_BUT_LAST);
+ char *result4 = canonicalize_filename_mode (BASE "/zzz/", CAN_MISSING);
+ ASSERT (result1 != NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (result3 != NULL);
+ ASSERT (result4 != NULL);
+ ASSERT (strcmp (result1, result2) == 0);
+ ASSERT (strcmp (result2, result3) == 0);
+ ASSERT (strcmp (result3, result4) == 0);
+ ASSERT (strcmp (result1 + strlen (result1) - strlen ("/" BASE "/zzz"),
+ "/" BASE "/zzz") == 0);
+ free (result1);
+ free (result2);
+ free (result3);
+ free (result4);
+ }
+
+ /* Check that alternate modes can resolve broken symlink basenames. */
+ {
+ char *result1 = canonicalize_filename_mode (BASE "/ouk", CAN_ALL_BUT_LAST);
+ char *result2 = canonicalize_filename_mode (BASE "/ouk", CAN_MISSING);
+ char *result3 = canonicalize_filename_mode (BASE "/ouk/", CAN_ALL_BUT_LAST);
+ char *result4 = canonicalize_filename_mode (BASE "/ouk/", CAN_MISSING);
+ ASSERT (result1 != NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (result3 != NULL);
+ ASSERT (result4 != NULL);
+ ASSERT (strcmp (result1, result2) == 0);
+ ASSERT (strcmp (result2, result3) == 0);
+ ASSERT (strcmp (result3, result4) == 0);
+ ASSERT (strcmp (result1 + strlen (result1) - strlen ("/" BASE "/wum"),
+ "/" BASE "/wum") == 0);
+ free (result1);
+ free (result2);
+ free (result3);
+ free (result4);
+ }
+
+ /* Check that alternate modes can handle missing dirnames. */
+ {
+ char *result1 = canonicalize_filename_mode ("t-can.zzz/zzz", CAN_ALL_BUT_LAST);
+ char *result2 = canonicalize_filename_mode ("t-can.zzz/zzz", CAN_MISSING);
+ ASSERT (result1 == NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (strcmp (result2 + strlen (result2) - 14, "/t-can.zzz/zzz") == 0);
+ free (result2);
+ }
+
+ /* Ensure that the following is resolved properly.
+ Before 2007-09-27, it would mistakenly report a loop. */
+ {
+ char *result1 = canonicalize_filename_mode (BASE, CAN_EXISTING);
+ char *result2 = canonicalize_filename_mode (BASE "/p/1", CAN_EXISTING);
+ ASSERT (result1 != NULL);
+ ASSERT (result2 != NULL);
+ ASSERT (strcmp (result2 + strlen (result1), "/d/2") == 0);
+ free (result1);
+ free (result2);
+ }
+
+ /* Check that leading // is honored correctly. */
+ {
+ struct stat st1;
+ struct stat st2;
+ char *result1 = canonicalize_file_name ("//.");
+ char *result2 = canonicalize_filename_mode ("//.", CAN_EXISTING);
+ char *result3 = canonicalize_file_name (BASE "/droot");
+ char *result4 = canonicalize_filename_mode (BASE "/droot", CAN_EXISTING);
+ ASSERT (result1);
+ ASSERT (result2);
+ ASSERT (result3);
+ ASSERT (result4);
+ ASSERT (stat ("/", &st1) == 0);
+ ASSERT (stat ("//", &st2) == 0);
+ if (SAME_INODE (st1, st2))
+ {
+ ASSERT (strcmp (result1, "/") == 0);
+ ASSERT (strcmp (result2, "/") == 0);
+ ASSERT (strcmp (result3, "/") == 0);
+ ASSERT (strcmp (result4, "/") == 0);
+ }
+ else
+ {
+ ASSERT (strcmp (result1, "//") == 0);
+ ASSERT (strcmp (result2, "//") == 0);
+ ASSERT (strcmp (result3, "//") == 0);
+ ASSERT (strcmp (result4, "//") == 0);
+ }
+ free (result1);
+ free (result2);
+ free (result3);
+ free (result4);
+ }
+
+ /* Cleanup. */
+ ASSERT (remove (BASE "/droot") == 0);
+ ASSERT (remove (BASE "/d/1") == 0);
+ ASSERT (remove (BASE "/d/2") == 0);
+ ASSERT (remove (BASE "/d") == 0);
+ ASSERT (remove (BASE "/s") == 0);
+ ASSERT (remove (BASE "/p") == 0);
+ ASSERT (remove (BASE "/plo") == 0);
+ ASSERT (remove (BASE "/huk") == 0);
+ ASSERT (remove (BASE "/bef") == 0);
+ ASSERT (remove (BASE "/ouk") == 0);
+ ASSERT (remove (BASE "/ket") == 0);
+ ASSERT (remove (BASE "/lum") == 0);
+ ASSERT (remove (BASE "/tra") == 0);
+ ASSERT (remove (BASE) == 0);
+ ASSERT (remove ("ise") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-carray_list.c b/gnulib/tests/test-carray_list.c
new file mode 100644
index 00000000..b620a56c
--- /dev/null
+++ b/gnulib/tests/test-carray_list.c
@@ -0,0 +1,411 @@
+/* Test of sequential list data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_carray_list.h"
+
+#include <stdlib.h>
+
+#include "gl_array_list.h"
+#include "progname.h"
+#include "macros.h"
+
+static const char *objects[15] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
+ };
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_list_t list1, gl_list_t list2)
+{
+ size_t n, i;
+
+ n = gl_list_size (list1);
+ ASSERT (n == gl_list_size (list2));
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_get_at (list1, i) == gl_list_get_at (list2, i));
+ }
+}
+
+static void
+check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3)
+{
+ check_equals (list1, list2);
+ check_equals (list1, list3);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_list_t list1, list2, list3;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (50);
+ const void **contents =
+ (const void **) malloc (initial_size * sizeof (const void *));
+ size_t i;
+ unsigned int repeat;
+
+ for (i = 0; i < initial_size; i++)
+ contents[i] = RANDOM_OBJECT ();
+
+ /* Create list1. */
+ list1 = gl_list_nx_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list1 != NULL);
+ /* Create list2. */
+ list2 = gl_list_nx_create_empty (GL_CARRAY_LIST, NULL, NULL, NULL, true);
+ ASSERT (list2 != NULL);
+ for (i = 0; i < initial_size; i++)
+ ASSERT (gl_list_nx_add_last (list2, contents[i]) != NULL);
+
+ /* Create list3. */
+ list3 = gl_list_nx_create (GL_CARRAY_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list3 != NULL);
+
+ check_all (list1, list2, list3);
+
+ for (repeat = 0; repeat < 10000; repeat++)
+ {
+ unsigned int operation = RANDOM (16);
+ switch (operation)
+ {
+ case 0:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t index = RANDOM (gl_list_size (list1));
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+
+ node1 = gl_list_nx_set_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+
+ node2 = gl_list_nx_set_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+
+ node3 = gl_list_nx_set_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ if (node1 == NULL)
+ {
+ ASSERT (node2 == NULL);
+ ASSERT (node3 == NULL);
+ }
+ else
+ {
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ }
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ size_t index1, index2, index3;
+ index1 = gl_list_indexof (list1, obj);
+ index2 = gl_list_indexof (list2, obj);
+ index3 = gl_list_indexof (list3, obj);
+ if (index1 == (size_t)(-1))
+ {
+ ASSERT (index2 == (size_t)(-1));
+ ASSERT (index3 == (size_t)(-1));
+ }
+ else
+ {
+ ASSERT (index2 != (size_t)(-1));
+ ASSERT (index3 != (size_t)(-1));
+ ASSERT (gl_list_get_at (list1, index1) == obj);
+ ASSERT (gl_list_get_at (list2, index2) == obj);
+ ASSERT (gl_list_get_at (list3, index3) == obj);
+ ASSERT (index2 == index1);
+ ASSERT (index3 == index1);
+ }
+ }
+ break;
+ case 3: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, 0) == obj);
+ ASSERT (gl_list_get_at (list2, 0) == obj);
+ ASSERT (gl_list_get_at (list3, 0) == obj);
+ }
+ break;
+ case 4: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_last (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_last (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_last (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, gl_list_size (list1) - 1) == obj);
+ ASSERT (gl_list_get_at (list2, gl_list_size (list2) - 1) == obj);
+ ASSERT (gl_list_get_at (list3, gl_list_size (list3) - 1) == obj);
+ }
+ break;
+ case 5: /* add 3 elements */
+ {
+ const char *obj0 = RANDOM_OBJECT ();
+ const char *obj1 = RANDOM_OBJECT ();
+ const char *obj2 = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj2);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_before (list1, node1, obj0);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_after (list1, node1, obj1);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj2);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_before (list2, node2, obj0);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_after (list2, node2, obj1);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj2);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_before (list3, node3, obj0);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_after (list3, node3, obj1);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj1);
+ ASSERT (gl_list_node_value (list2, node2) == obj1);
+ ASSERT (gl_list_node_value (list3, node3) == obj1);
+ ASSERT (gl_list_get_at (list1, 0) == obj0);
+ ASSERT (gl_list_get_at (list1, 1) == obj1);
+ ASSERT (gl_list_get_at (list1, 2) == obj2);
+ ASSERT (gl_list_get_at (list2, 0) == obj0);
+ ASSERT (gl_list_get_at (list2, 1) == obj1);
+ ASSERT (gl_list_get_at (list2, 2) == obj2);
+ ASSERT (gl_list_get_at (list3, 0) == obj0);
+ ASSERT (gl_list_get_at (list3, 1) == obj1);
+ ASSERT (gl_list_get_at (list3, 2) == obj2);
+ }
+ break;
+ case 6: /* add 1 element */
+ {
+ size_t index = RANDOM (gl_list_size (list1) + 1);
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 7: case 8: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_remove_node (list1, node1));
+ ASSERT (gl_list_remove_node (list2, node2));
+ ASSERT (gl_list_remove_node (list3, node3));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 9: case 10: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ size_t index = RANDOM (n);
+ ASSERT (gl_list_remove_at (list1, index));
+ ASSERT (gl_list_remove_at (list2, index));
+ ASSERT (gl_list_remove_at (list3, index));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 11: case 12: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ ASSERT (gl_list_remove (list1, obj));
+ ASSERT (gl_list_remove (list2, obj));
+ ASSERT (gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 13:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = "xyzzy";
+ ASSERT (!gl_list_remove (list1, obj));
+ ASSERT (!gl_list_remove (list2, obj));
+ ASSERT (!gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n);
+ }
+ break;
+ case 14:
+ {
+ size_t n = gl_list_size (list1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator (list1);
+ iter2 = gl_list_iterator (list2);
+ iter3 = gl_list_iterator (list3);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ case 15:
+ {
+ size_t end = RANDOM (gl_list_size (list1) + 1);
+ size_t start = RANDOM (end + 1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator_from_to (list1, start, end);
+ iter2 = gl_list_iterator_from_to (list2, start, end);
+ iter3 = gl_list_iterator_from_to (list3, start, end);
+ for (i = start; i < end; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ }
+ check_all (list1, list2, list3);
+ }
+
+ gl_list_free (list1);
+ gl_list_free (list2);
+ gl_list_free (list3);
+ free (contents);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-cbrt.c b/gnulib/tests/test-cbrt.c
new file mode 100644
index 00000000..dae88ca7
--- /dev/null
+++ b/gnulib/tests/test-cbrt.c
@@ -0,0 +1,40 @@
+/* Test of cbrt() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (cbrt, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = cbrt (x);
+ ASSERT (y >= 0.8434326653 && y <= 0.8434326654);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-ceilf1.c b/gnulib/tests/test-ceilf1.c
new file mode 100644
index 00000000..ff6db5ed
--- /dev/null
+++ b/gnulib/tests/test-ceilf1.c
@@ -0,0 +1,68 @@
+/* Test of rounding towards positive infinity.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (ceilf, float, (float));
+
+#include "isnanf-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0f.
+ So we use -zero instead. */
+float zero = 0.0f;
+
+int
+main ()
+{
+ /* Zero. */
+ ASSERT (ceilf (0.0f) == 0.0f);
+ ASSERT (ceilf (-zero) == 0.0f);
+ /* Positive numbers. */
+ ASSERT (ceilf (0.3f) == 1.0f);
+ ASSERT (ceilf (0.7f) == 1.0f);
+ ASSERT (ceilf (1.0f) == 1.0f);
+ ASSERT (ceilf (1.001f) == 2.0f);
+ ASSERT (ceilf (1.5f) == 2.0f);
+ ASSERT (ceilf (1.999f) == 2.0f);
+ ASSERT (ceilf (2.0f) == 2.0f);
+ ASSERT (ceilf (65535.99f) == 65536.0f);
+ ASSERT (ceilf (65536.0f) == 65536.0f);
+ ASSERT (ceilf (2.341e31f) == 2.341e31f);
+ /* Negative numbers. */
+ ASSERT (ceilf (-0.3f) == 0.0f);
+ ASSERT (ceilf (-0.7f) == 0.0f);
+ ASSERT (ceilf (-1.0f) == -1.0f);
+ ASSERT (ceilf (-1.5f) == -1.0f);
+ ASSERT (ceilf (-1.999f) == -1.0f);
+ ASSERT (ceilf (-2.0f) == -2.0f);
+ ASSERT (ceilf (-65535.99f) == -65535.0f);
+ ASSERT (ceilf (-65536.0f) == -65536.0f);
+ ASSERT (ceilf (-2.341e31f) == -2.341e31f);
+ /* Infinite numbers. */
+ ASSERT (ceilf (1.0f / 0.0f) == 1.0f / 0.0f);
+ ASSERT (ceilf (-1.0f / 0.0f) == -1.0f / 0.0f);
+ /* NaNs. */
+ ASSERT (isnanf (ceilf (NaNf ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-ceilf2.c b/gnulib/tests/test-ceilf2.c
new file mode 100644
index 00000000..5c923933
--- /dev/null
+++ b/gnulib/tests/test-ceilf2.c
@@ -0,0 +1,151 @@
+/* Test of rounding towards positive infinity.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include <float.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "isnanf-nolibm.h"
+#include "macros.h"
+
+
+/* The reference implementation, taken from lib/ceil.c. */
+
+#define DOUBLE float
+#define MANT_DIG FLT_MANT_DIG
+#define L_(literal) literal##f
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+ceilf_reference (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
+
+
+/* Test for equality. */
+static int
+equal (DOUBLE x, DOUBLE y)
+{
+ return (isnanf (x) ? isnanf (y) : x == y);
+}
+
+/* Test whether the result for a given argument is correct. */
+static bool
+correct_result_p (DOUBLE x, DOUBLE result)
+{
+ return
+ (x > 0 && x <= 1 ? result == L_(1.0) :
+ x + 1 > x ? result >= x && result <= x + 1 && result - x < 1 :
+ equal (result, x));
+}
+
+/* Test the function for a given argument. */
+static int
+check (float x)
+{
+ /* If the reference implementation is incorrect, bail out immediately. */
+ float reference = ceilf_reference (x);
+ ASSERT (correct_result_p (x, reference));
+ /* If the actual implementation is wrong, return an error code. */
+ {
+ float result = ceilf (x);
+ if (correct_result_p (x, result))
+ return 0;
+ else
+ {
+ fprintf (stderr, "ceilf %g(%a) = %g(%a) or %g(%a)?\n",
+ x, x, reference, reference, result, result);
+ return 1;
+ }
+ }
+}
+
+#define NUM_HIGHBITS 12
+#define NUM_LOWBITS 4
+
+int
+main ()
+{
+ unsigned int highbits;
+ unsigned int lowbits;
+ int error = 0;
+ for (highbits = 0; highbits < (1 << NUM_HIGHBITS); highbits++)
+ for (lowbits = 0; lowbits < (1 << NUM_LOWBITS); lowbits++)
+ {
+ /* Combine highbits and lowbits into a floating-point number,
+ sign-extending the lowbits to 32-NUM_HIGHBITS bits. */
+ union { float f; uint32_t i; } janus;
+ janus.i = ((uint32_t) highbits << (32 - NUM_HIGHBITS))
+ | ((uint32_t) ((int32_t) ((uint32_t) lowbits << (32 - NUM_LOWBITS))
+ >> (32 - NUM_LOWBITS - NUM_HIGHBITS))
+ >> NUM_HIGHBITS);
+ error |= check (janus.f);
+ }
+ return (error ? 1 : 0);
+}
diff --git a/gnulib/tests/test-ceill.c b/gnulib/tests/test-ceill.c
new file mode 100644
index 00000000..ec3c6b96
--- /dev/null
+++ b/gnulib/tests/test-ceill.c
@@ -0,0 +1,87 @@
+/* Test of rounding towards positive infinity.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (ceill, long double, (long double));
+
+#include <float.h>
+
+#include "fpucw.h"
+#include "isnanl-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zero instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zero (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+long double minus_zero = -0.0L;
+#endif
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* Zero. */
+ ASSERT (ceill (0.0L) == 0.0L);
+ ASSERT (ceill (minus_zero) == 0.0L);
+ /* Positive numbers. */
+ ASSERT (ceill (0.3L) == 1.0L);
+ ASSERT (ceill (0.7L) == 1.0L);
+ ASSERT (ceill (1.0L) == 1.0L);
+ ASSERT (ceill (1.001L) == 2.0L);
+ ASSERT (ceill (1.5L) == 2.0L);
+ ASSERT (ceill (1.999L) == 2.0L);
+ ASSERT (ceill (2.0L) == 2.0L);
+ ASSERT (ceill (65535.999L) == 65536.0L);
+ ASSERT (ceill (65536.0L) == 65536.0L);
+ ASSERT (ceill (2.341e31L) == 2.341e31L);
+ /* Negative numbers. */
+ ASSERT (ceill (-0.3L) == 0.0L);
+ ASSERT (ceill (-0.7L) == 0.0L);
+ ASSERT (ceill (-1.0L) == -1.0L);
+ ASSERT (ceill (-1.5L) == -1.0L);
+ ASSERT (ceill (-1.999L) == -1.0L);
+ ASSERT (ceill (-2.0L) == -2.0L);
+ ASSERT (ceill (-65535.999L) == -65535.0L);
+ ASSERT (ceill (-65536.0L) == -65536.0L);
+ ASSERT (ceill (-2.341e31L) == -2.341e31L);
+ /* Infinite numbers. */
+ ASSERT (ceill (1.0L / 0.0L) == 1.0L / 0.0L);
+ ASSERT (ceill (-1.0L / 0.0L) == -1.0L / 0.0L);
+ /* NaNs. */
+ ASSERT (isnanl (ceill (NaNl ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-chown.c b/gnulib/tests/test-chown.c
new file mode 100644
index 00000000..380c9a35
--- /dev/null
+++ b/gnulib/tests/test-chown.c
@@ -0,0 +1,49 @@
+/* Tests of chown.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (chown, int, (char const *, uid_t, gid_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "mgetgroups.h"
+#include "stat-time.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-chown.t"
+
+#include "test-chown.h"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_chown (chown, true);
+}
diff --git a/gnulib/tests/test-chown.h b/gnulib/tests/test-chown.h
new file mode 100644
index 00000000..8bf71be2
--- /dev/null
+++ b/gnulib/tests/test-chown.h
@@ -0,0 +1,209 @@
+/* Tests of chown.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include "nap.h"
+
+#if !HAVE_GETEGID
+# define getegid() ((gid_t) -1)
+#endif
+
+/* This file is designed to test chown(n,o,g) and
+ chownat(AT_FDCWD,n,o,g,0). FUNC is the function to test. Assumes
+ that BASE and ASSERT are already defined, and that appropriate
+ headers are already included. If PRINT, warn before skipping
+ symlink tests with status 77. */
+
+static int
+test_chown (int (*func) (char const *, uid_t, gid_t), bool print)
+{
+ struct stat st1;
+ struct stat st2;
+ gid_t *gids = NULL;
+ int gids_count;
+ int result;
+
+ /* Solaris 8 is interesting - if the current process belongs to
+ multiple groups, the current directory is owned by a a group that
+ the current process belongs to but different than getegid(), and
+ the current directory does not have the S_ISGID bit, then regular
+ files created in the directory belong to the directory's group,
+ but symlinks belong to the current effective group id. If
+ S_ISGID is set, then both files and symlinks belong to the
+ directory's group. However, it is possible to run the testsuite
+ from within a directory owned by a group we don't belong to, in
+ which case all things that we create belong to the current
+ effective gid. So, work around the issues by creating a
+ subdirectory (we are guaranteed that the subdirectory will be
+ owned by one of our current groups), change ownership of that
+ directory to the current effective gid (which will thus succeed),
+ then create all other files within that directory (eliminating
+ questions on whether inheritance or current id triumphs, since
+ the two methods resolve to the same gid). */
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (stat (BASE "dir", &st1) == 0);
+
+ /* Filter out mingw, which has no concept of groups. */
+ result = func (BASE "dir", st1.st_uid, getegid ());
+ if (result == -1 && errno == ENOSYS)
+ {
+ ASSERT (rmdir (BASE "dir") == 0);
+ if (print)
+ fputs ("skipping test: no support for ownership\n", stderr);
+ return 77;
+ }
+ ASSERT (result == 0);
+
+ ASSERT (close (creat (BASE "dir/file", 0600)) == 0);
+ ASSERT (stat (BASE "dir/file", &st1) == 0);
+ ASSERT (st1.st_uid != (uid_t) -1);
+ ASSERT (st1.st_gid != (uid_t) -1);
+ ASSERT (st1.st_gid == getegid ());
+
+ /* Sanity check of error cases. */
+ errno = 0;
+ ASSERT (func ("", -1, -1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("no_such", -1, -1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("no_such/", -1, -1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "dir/file/", -1, -1) == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Check that -1 does not alter ownership. */
+ ASSERT (func (BASE "dir/file", -1, st1.st_gid) == 0);
+ ASSERT (func (BASE "dir/file", st1.st_uid, -1) == 0);
+ ASSERT (func (BASE "dir/file", (uid_t) -1, (gid_t) -1) == 0);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+
+ /* Even if the values aren't changing, ctime is required to change
+ if at least one argument is not -1. */
+ nap ();
+ ASSERT (func (BASE "dir/file", st1.st_uid, st1.st_gid) == 0);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+
+ /* Test symlink behavior. */
+ if (symlink ("link", BASE "dir/link2"))
+ {
+ ASSERT (unlink (BASE "dir/file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ errno = 0;
+ ASSERT (func (BASE "dir/link2", -1, -1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "dir/link2/", st1.st_uid, st1.st_gid) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (symlink ("file", BASE "dir/link") == 0);
+
+ /* For non-privileged users, chown can only portably succeed at
+ changing group ownership of a file we own. If we belong to at
+ least two groups, then verifying the correct change is simple.
+ But if we belong to only one group, then we fall back on the
+ other observable effect of chown: the ctime must be updated. */
+ gids_count = mgetgroups (NULL, st1.st_gid, &gids);
+ if (1 < gids_count)
+ {
+ ASSERT (gids[1] != st1.st_gid);
+ ASSERT (gids[1] != (gid_t) -1);
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+
+ errno = 0;
+ ASSERT (func (BASE "dir/link2/", -1, gids[1]) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+
+ ASSERT (func (BASE "dir/link2", -1, gids[1]) == 0);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (gids[1] == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ }
+ else
+ {
+ struct stat l1;
+ struct stat l2;
+ ASSERT (stat (BASE "dir/file", &st1) == 0);
+ ASSERT (lstat (BASE "dir/link", &l1) == 0);
+ ASSERT (lstat (BASE "dir/link2", &l2) == 0);
+
+ nap ();
+ errno = 0;
+ ASSERT (func (BASE "dir/link2/", -1, st1.st_gid) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&st1) == get_stat_ctime_ns (&st2));
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (l1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&l1) == get_stat_ctime_ns (&st2));
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (l2.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&l2) == get_stat_ctime_ns (&st2));
+
+ ASSERT (func (BASE "dir/link2", -1, st1.st_gid) == 0);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (l1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&l1) == get_stat_ctime_ns (&st2));
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (l2.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&l2) == get_stat_ctime_ns (&st2));
+ }
+
+ /* Cleanup. */
+ free (gids);
+ ASSERT (unlink (BASE "dir/file") == 0);
+ ASSERT (unlink (BASE "dir/link") == 0);
+ ASSERT (unlink (BASE "dir/link2") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ return 0;
+}
diff --git a/gnulib/tests/test-cloexec.c b/gnulib/tests/test-cloexec.c
new file mode 100644
index 00000000..801ac232
--- /dev/null
+++ b/gnulib/tests/test-cloexec.c
@@ -0,0 +1,141 @@
+/* Test duplicating non-inheritable file descriptors.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "cloexec.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "binary-io.h"
+#include "macros.h"
+
+/* Return non-zero if FD is open and inheritable across exec/spawn. */
+static int
+is_inheritable (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ if (h == INVALID_HANDLE_VALUE || GetHandleInformation (h, &flags) == 0)
+ return 0;
+ return (flags & HANDLE_FLAG_INHERIT) != 0;
+#else
+# ifndef F_GETFD
+# error Please port fcntl to your platform
+# endif
+ int i = fcntl (fd, F_GETFD);
+ return 0 <= i && (i & FD_CLOEXEC) == 0;
+#endif
+}
+
+#if !O_BINARY
+# define setmode(f,m) zero ()
+static int zero (void) { return 0; }
+#endif
+
+/* Return non-zero if FD is open in the given MODE, which is either
+ O_TEXT or O_BINARY. */
+static int
+is_mode (int fd, int mode)
+{
+ int value = setmode (fd, O_BINARY);
+ setmode (fd, value);
+ return mode == value;
+}
+
+int
+main (void)
+{
+ const char *file = "test-cloexec.tmp";
+ int fd = creat (file, 0600);
+ int fd2;
+
+ /* Assume std descriptors were provided by invoker. */
+ ASSERT (STDERR_FILENO < fd);
+ ASSERT (is_inheritable (fd));
+
+ /* Normal use of set_cloexec_flag. */
+ ASSERT (set_cloexec_flag (fd, true) == 0);
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ ASSERT (!is_inheritable (fd));
+#endif
+ ASSERT (set_cloexec_flag (fd, false) == 0);
+ ASSERT (is_inheritable (fd));
+
+ /* Normal use of dup_cloexec. */
+ fd2 = dup_cloexec (fd);
+ ASSERT (fd < fd2);
+ ASSERT (!is_inheritable (fd2));
+ ASSERT (close (fd) == 0);
+ ASSERT (dup_cloexec (fd2) == fd);
+ ASSERT (!is_inheritable (fd));
+ ASSERT (close (fd2) == 0);
+
+ /* On systems that distinguish between text and binary mode,
+ dup_cloexec reuses the mode of the source. */
+ setmode (fd, O_BINARY);
+ ASSERT (is_mode (fd, O_BINARY));
+ fd2 = dup_cloexec (fd);
+ ASSERT (fd < fd2);
+ ASSERT (is_mode (fd2, O_BINARY));
+ ASSERT (close (fd2) == 0);
+ setmode (fd, O_TEXT);
+ ASSERT (is_mode (fd, O_TEXT));
+ fd2 = dup_cloexec (fd);
+ ASSERT (fd < fd2);
+ ASSERT (is_mode (fd2, O_TEXT));
+ ASSERT (close (fd2) == 0);
+
+ /* Test error handling. */
+ errno = 0;
+ ASSERT (set_cloexec_flag (-1, false) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (set_cloexec_flag (10000000, false) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (set_cloexec_flag (fd2, false) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (dup_cloexec (-1) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (dup_cloexec (10000000) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (dup_cloexec (fd2) == -1);
+ ASSERT (errno == EBADF);
+
+ /* Clean up. */
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (file) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-closein.c b/gnulib/tests/test-closein.c
new file mode 100644
index 00000000..6b99b186
--- /dev/null
+++ b/gnulib/tests/test-closein.c
@@ -0,0 +1,53 @@
+/* Test of closein module.
+ Copyright (C) 2007, 2008, 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "closein.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "binary-io.h"
+#include "ignore-value.h"
+
+char *program_name;
+
+/* With no arguments, do nothing. With arguments, attempt to consume
+ first 6 bytes of stdin. In either case, let exit() take care of
+ closing std streams and changing exit status if ferror(stdin). */
+int
+main (int argc, char **argv)
+{
+ char buf[7];
+ atexit (close_stdin);
+ program_name = argv[0];
+
+ /* close_stdin currently relies on ftell, but mingw ftell is
+ unreliable on text mode input. */
+ SET_BINARY (0);
+
+ if (argc > 2)
+ close (0);
+
+ if (argc > 1)
+ ignore_value (fread (buf, 1, 6, stdin));
+ return 0;
+}
diff --git a/gnulib/tests/test-closein.sh b/gnulib/tests/test-closein.sh
new file mode 100755
index 00000000..a75929a2
--- /dev/null
+++ b/gnulib/tests/test-closein.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+tmpfiles=
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+p=t-closein-
+tmpfiles="${p}in.tmp ${p}xout.tmp ${p}out1.tmp ${p}out2.tmp"
+
+echo Hello world > ${p}in.tmp
+echo world > ${p}xout.tmp
+
+# Test with seekable stdin; followon process must see remaining data
+(./test-closein${EXEEXT}; cat) < ${p}in.tmp > ${p}out1.tmp || exit 1
+cmp ${p}out1.tmp ${p}in.tmp || exit 1
+
+(./test-closein${EXEEXT} consume; cat) < ${p}in.tmp > ${p}out2.tmp || exit 1
+cmp ${p}out2.tmp ${p}xout.tmp || exit 1
+
+# Test for lack of error on pipe. Ignore any EPIPE failures from cat.
+cat ${p}in.tmp 2>/dev/null | ./test-closein${EXEEXT} || exit 1
+
+cat ${p}in.tmp 2>/dev/null | ./test-closein${EXEEXT} consume || exit 1
+
+# Test for lack of error when nothing is read
+./test-closein${EXEEXT} </dev/null || exit 1
+
+./test-closein${EXEEXT} <&- || exit 1
+
+# Test for no error when EOF is read early
+./test-closein${EXEEXT} consume </dev/null || exit 1
+
+# Test for error when read fails because no file available
+./test-closein${EXEEXT} consume close <&- 2>/dev/null && exit 1
+
+# Cleanup
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-cond.c b/gnulib/tests/test-cond.c
new file mode 100644
index 00000000..f9ca22a6
--- /dev/null
+++ b/gnulib/tests/test-cond.c
@@ -0,0 +1,208 @@
+/* Test of condition variables in multithreaded situations.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#if USE_POSIX_THREADS || USE_SOLARIS_THREADS || USE_PTH_THREADS || USE_WIN32_THREADS
+
+/* Which tests to perform.
+ Uncomment some of these, to verify that all tests crash if no locking
+ is enabled. */
+#define DO_TEST_COND 1
+#define DO_TEST_TIMEDCOND 1
+
+
+/* Whether to help the scheduler through explicit yield().
+ Uncomment this to see if the operating system has a fair scheduler. */
+#define EXPLICIT_YIELD 1
+
+/* Whether to print debugging messages. */
+#define ENABLE_DEBUGGING 0
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include "glthread/cond.h"
+#include "glthread/lock.h"
+#include "glthread/thread.h"
+#include "glthread/yield.h"
+
+#if ENABLE_DEBUGGING
+# define dbgprintf printf
+#else
+# define dbgprintf if (0) printf
+#endif
+
+#if EXPLICIT_YIELD
+# define yield() gl_thread_yield ()
+#else
+# define yield()
+#endif
+
+
+/*
+ * Condition check
+ */
+#include <unistd.h>
+static int cond_value = 0;
+gl_cond_define_initialized(static, condtest)
+gl_lock_define_initialized(static, lockcond)
+
+static void *
+cond_routine (void *arg)
+{
+ gl_lock_lock (lockcond);
+ while (!cond_value)
+ {
+ gl_cond_wait (condtest, lockcond);
+ }
+ gl_lock_unlock (lockcond);
+
+ cond_value = 2;
+
+ return NULL;
+}
+
+void
+test_cond ()
+{
+ int remain = 2;
+ gl_thread_t thread;
+
+ cond_value = 0;
+
+ thread = gl_thread_create (cond_routine, NULL);
+ do
+ {
+ yield ();
+ remain = sleep (remain);
+ }
+ while (remain);
+
+ /* signal condition */
+ gl_lock_lock (lockcond);
+ cond_value = 1;
+ gl_cond_signal (condtest);
+ gl_lock_unlock (lockcond);
+
+ gl_thread_join (thread, NULL);
+
+ if (cond_value != 2)
+ abort ();
+}
+
+
+/*
+ * Timed Condition check
+ */
+static int cond_timeout;
+
+static void
+get_ts (struct timespec *ts)
+{
+ struct timeval now;
+
+ gettimeofday (&now, NULL);
+
+ ts->tv_sec = now.tv_sec + 1;
+ ts->tv_nsec = now.tv_usec * 1000;
+}
+
+static void *
+timedcond_routine (void *arg)
+{
+ int ret;
+ struct timespec ts;
+
+ gl_lock_lock (lockcond);
+ while (!cond_value)
+ {
+ get_ts (&ts);
+ ret = glthread_cond_timedwait (&condtest, &lockcond, &ts);
+ if (ret == ETIMEDOUT)
+ cond_timeout = 1;
+ }
+ gl_lock_unlock (lockcond);
+
+ return NULL;
+}
+
+static void
+test_timedcond (void)
+{
+ int remain = 2;
+ gl_thread_t thread;
+
+ cond_value = cond_timeout = 0;
+
+ thread = gl_thread_create (timedcond_routine, NULL);
+
+ remain = 2;
+ do
+ {
+ yield ();
+ remain = sleep (remain);
+ }
+ while (remain);
+
+ /* signal condition */
+ gl_lock_lock (lockcond);
+ cond_value = 1;
+ gl_cond_signal (condtest);
+ gl_lock_unlock (lockcond);
+
+ gl_thread_join (thread, NULL);
+
+ if (!cond_timeout)
+ abort ();
+}
+
+int
+main ()
+{
+#if TEST_PTH_THREADS
+ if (!pth_init ())
+ abort ();
+#endif
+
+#if DO_TEST_COND
+ printf ("Starting test_cond ..."); fflush (stdout);
+ test_cond ();
+ printf (" OK\n"); fflush (stdout);
+#endif
+#if DO_TEST_TIMEDCOND
+ printf ("Starting test_timedcond ..."); fflush (stdout);
+ test_timedcond ();
+ printf (" OK\n"); fflush (stdout);
+#endif
+
+ return 0;
+}
+
+#else
+
+/* No multithreading available. */
+
+int
+main ()
+{
+ fputs ("Skipping test: multithreading not enabled\n", stderr);
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/test-copy-acl.c b/gnulib/tests/test-copy-acl.c
new file mode 100644
index 00000000..19e195ce
--- /dev/null
+++ b/gnulib/tests/test-copy-acl.c
@@ -0,0 +1,76 @@
+/* Test of copying of files.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "progname.h"
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ const char *file1;
+ const char *file2;
+ int fd1;
+ struct stat statbuf;
+ int mode;
+ int fd2;
+
+ set_program_name (argv[0]);
+
+ ASSERT (argc == 3);
+
+ file1 = argv[1];
+ file2 = argv[2];
+
+ fd1 = open (file1, O_RDONLY);
+ if (fd1 < 0 || fstat (fd1, &statbuf) < 0)
+ {
+ fprintf (stderr, "could not open file \"%s\"\n", file1);
+ exit (EXIT_FAILURE);
+ }
+ mode = statbuf.st_mode & 07777;
+
+ fd2 = open (file2, O_WRONLY, 0600);
+ if (fd2 < 0)
+ {
+ fprintf (stderr, "could not open file \"%s\"\n", file2);
+ exit (EXIT_FAILURE);
+ }
+
+#if USE_ACL
+ if (copy_acl (file1, fd1, file2, fd2, mode))
+ exit (EXIT_FAILURE);
+#else
+ chmod (file2, mode);
+#endif
+
+ close (fd2);
+ close (fd1);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-copy-acl.sh b/gnulib/tests/test-copy-acl.sh
new file mode 100755
index 00000000..a16990b2
--- /dev/null
+++ b/gnulib/tests/test-copy-acl.sh
@@ -0,0 +1,534 @@
+#!/bin/sh
+
+# Show all commands when run with environment variable VERBOSE=yes.
+test -z "$VERBOSE" || set -x
+
+test "$USE_ACL" = 0 &&
+ {
+ echo "Skipping test: insufficient ACL support"
+ exit 77
+ }
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gl$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ exit 1
+ }
+}
+
+func_tmpdir
+builddir=`pwd`
+cd "$builddir" ||
+ {
+ echo "$0: cannot determine build directory (unreadable parent dir?)" >&2
+ exit 1
+ }
+# Switch to a temporary directory, to increase the likelihood that ACLs are
+# supported on the current file system. (/tmp is usually locally mounted,
+# whereas the build dir is sometimes NFS-mounted.)
+( cd "$tmp"
+
+ # Prepare tmpfile0.
+ rm -f tmpfile[0-9] tmpaclout[0-2]
+ echo "Simple contents" > tmpfile0
+ chmod 600 tmpfile0
+
+ # Classification of the platform according to the programs available for
+ # manipulating ACLs.
+ # Possible values are:
+ # linux, cygwin, freebsd, solaris, hpux, osf1, aix, macosx, irix, none.
+ # TODO: Support also native Win32 platforms (mingw).
+ acl_flavor=none
+ if (getfacl tmpfile0 >/dev/null) 2>/dev/null; then
+ # Platforms with the getfacl and setfacl programs.
+ # Linux, FreeBSD, Solaris, Cygwin.
+ if (setfacl --help >/dev/null) 2>/dev/null; then
+ # Linux, Cygwin.
+ if (LC_ALL=C setfacl --help | grep ' --set-file' >/dev/null) 2>/dev/null; then
+ # Linux.
+ acl_flavor=linux
+ else
+ acl_flavor=cygwin
+ fi
+ else
+ # FreeBSD, Solaris.
+ if (LC_ALL=C setfacl 2>&1 | grep '\-x entries' >/dev/null) 2>/dev/null; then
+ # FreeBSD.
+ acl_flavor=freebsd
+ else
+ # Solaris.
+ acl_flavor=solaris
+ fi
+ fi
+ else
+ if (lsacl / >/dev/null) 2>/dev/null; then
+ # Platforms with the lsacl and chacl programs.
+ # HP-UX, sometimes also IRIX.
+ acl_flavor=hpux
+ else
+ if (getacl tmpfile0 >/dev/null) 2>/dev/null; then
+ # Tru64.
+ acl_flavor=osf1
+ else
+ if (aclget tmpfile0 >/dev/null) 2>/dev/null; then
+ # AIX.
+ acl_flavor=aix
+ else
+ if (fsaclctl -v >/dev/null) 2>/dev/null; then
+ # MacOS X.
+ acl_flavor=macosx
+ else
+ if test -f /sbin/chacl; then
+ # IRIX.
+ acl_flavor=irix
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ # Define a function to test for the same ACLs, from the point of view of
+ # the programs.
+ # func_test_same_acls file1 file2
+ case $acl_flavor in
+ linux | cygwin | freebsd | solaris)
+ func_test_same_acls ()
+ {
+ getfacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ getfacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ hpux)
+ func_test_same_acls ()
+ {
+ lsacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ lsacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ osf1)
+ func_test_same_acls ()
+ {
+ getacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ getacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ aix)
+ func_test_same_acls ()
+ {
+ aclget "$1" > tmpaclout1
+ aclget "$2" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ macosx)
+ func_test_same_acls ()
+ {
+ /bin/ls -le "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ /bin/ls -le "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ irix)
+ func_test_same_acls ()
+ {
+ /bin/ls -lD "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ /bin/ls -lD "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ none)
+ func_test_same_acls ()
+ {
+ :
+ }
+ ;;
+ esac
+
+ # func_test_copy file1 file2
+ # copies file1 to file2 and verifies the permissions and ACLs are the same
+ # on both.
+ func_test_copy ()
+ {
+ echo "Simple contents" > "$2"
+ chmod 600 "$2"
+ "$builddir"/test-copy-acl${EXEEXT} "$1" "$2" || exit 1
+ "$builddir"/test-sameacls${EXEEXT} "$1" "$2" || exit 1
+ func_test_same_acls "$1" "$2" || exit 1
+ }
+
+ func_test_copy tmpfile0 tmpfile1
+
+ if test $acl_flavor != none; then
+ # A POSIX compliant 'id' program.
+ if test -f /usr/xpg4/bin/id; then
+ ID=/usr/xpg4/bin/id
+ else
+ ID=id
+ fi
+ # Use a user and group id different from the current one, to avoid
+ # redundant/ambiguous ACLs.
+ myuid=`$ID -u`
+ mygid=`$ID -g`
+ auid=1
+ if test "$auid" = "$myuid"; then auid=2; fi
+ agid=1
+ if test "$agid" = "$mygid"; then agid=2; fi
+
+ case $acl_flavor in
+ linux | freebsd | solaris)
+
+ # Set an ACL for a user.
+ setfacl -m user:$auid:1 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ setfacl -m group:$agid:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ case $acl_flavor in
+ freebsd) setfacl -m other::4 tmpfile0 ;;
+ solaris) chmod o+r tmpfile0 ;;
+ *) setfacl -m other:4 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ case $acl_flavor in
+ linux) setfacl -x user:$auid tmpfile0 ;;
+ freebsd) setfacl -x user:$auid:1 tmpfile0 ;;
+ *) setfacl -d user:$auid:1 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for other.
+ case $acl_flavor in
+ linux | solaris) ;; # impossible
+ freebsd) setfacl -x other::4 tmpfile0 ;;
+ *) setfacl -d other:4 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile6
+
+ # Remove the ACL for the group.
+ case $acl_flavor in
+ linux) setfacl -x group:$agid tmpfile0 ;;
+ freebsd) setfacl -x group:$agid:4 tmpfile0 ;;
+ *) setfacl -d group:$agid:4 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile7
+
+ # Delete all optional ACLs.
+ case $acl_flavor in
+ linux | freebsd)
+ setfacl -m user:$auid:1 tmpfile0
+ setfacl -b tmpfile0
+ ;;
+ *)
+ setfacl -s user::6,group::0,other:0 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ case $acl_flavor in
+ linux) getfacl tmpfile9 | setfacl --set-file=- tmpfile0 ;;
+ freebsd) ;;
+ *) getfacl tmpfile9 | setfacl -f - tmpfile0 ;;
+ esac
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ cygwin)
+
+ # Set an ACL for a group.
+ setfacl -m group:0:1 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for other.
+ setfacl -m other:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the group.
+ setfacl -d group:0 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for other.
+ setfacl -d other:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile6
+
+ # Delete all optional ACLs.
+ setfacl -s user::6,group::0,other:0 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ getfacl tmpfile9 | setfacl -f - tmpfile0
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ hpux)
+
+ # Set an ACL for a user.
+ orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+ chacl -r "${orig}($auid.%,--x)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+ chacl -r "${orig}(%.$agid,r--)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+ chacl -r "${orig}(%.%,r--)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ chacl -d "($auid.%,--x)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for the group.
+ chacl -d "(%.$agid,r--)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile6
+
+ # Delete all optional ACLs.
+ chacl -z tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ orig=`lsacl tmpfile9 | sed -e 's/ tmpfile9$//'`
+ rm -f tmpfile9
+ chacl -r "${orig}" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ osf1)
+
+ # Set an ACL for a user.
+ setacl -u user:$auid:1 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ setacl -u group:$agid:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ setacl -u other::4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ setacl -x user:$auid:1 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ if false; then # would give an error "can't set ACL: Invalid argument"
+ # Remove the ACL for other.
+ setacl -x other::4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile6
+ fi
+
+ # Remove the ACL for the group.
+ setacl -x group:$agid:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile7
+
+ # Delete all optional ACLs.
+ setacl -u user:$auid:1 tmpfile0
+ setacl -b tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ getacl tmpfile9 > tmpaclout0
+ setacl -b -U tmpaclout0 tmpfile0
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ aix)
+
+ # Set an ACL for a user.
+ { aclget tmpfile0 | sed -e 's/disabled$/enabled/'; echo " permit --x u:$auid"; } | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ { aclget tmpfile0 | sed -e 's/disabled$/enabled/'; echo " permit r-- g:$agid"; } | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ chmod o+r tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ aclget tmpfile0 | grep -v ' u:[^ ]*$' | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for the group.
+ aclget tmpfile0 | grep -v ' g:[^ ]*$' | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile7
+
+ # Delete all optional ACLs.
+ aclget tmpfile0 | sed -e 's/enabled$/disabled/' | sed -e '/disabled$/q' | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ aclget tmpfile9 | aclput tmpfile0
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ macosx)
+
+ # Set an ACL for a user.
+ /bin/chmod +a "user:daemon allow execute" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ /bin/chmod +a "group:daemon allow read" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ chmod o+r tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ /bin/chmod -a "user:daemon allow execute" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for the group.
+ /bin/chmod -a "group:daemon allow read" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile7
+
+ # Delete all optional ACLs.
+ /bin/chmod -N tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ { /bin/ls -le tmpfile9 | sed -n -e 's/^ [0-9][0-9]*: //p'; echo; } | /bin/chmod -E tmpfile0
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ irix)
+
+ # Set an ACL for a user.
+ /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x,group:$agid:r-- tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ /sbin/chacl user::rw-,group::---,user:$auid:--x,group:$agid:r--,other::r-- tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ /sbin/chacl user::rw-,group::---,group:$agid:r--,other::r-- tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for the group.
+ /sbin/chacl user::rw-,group::---,other::r-- tmpfile0
+
+ func_test_copy tmpfile0 tmpfile7
+
+ ;;
+
+ esac
+ fi
+
+ rm -f tmpfile[0-9] tmpaclout[0-2]
+) || exit 1
+
+rm -rf "$tmp"
+exit 0
diff --git a/gnulib/tests/test-copy-file.c b/gnulib/tests/test-copy-file.c
new file mode 100644
index 00000000..db8e769a
--- /dev/null
+++ b/gnulib/tests/test-copy-file.c
@@ -0,0 +1,42 @@
+/* Test of copying of files.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "copy-file.h"
+
+#include "progname.h"
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ const char *file1;
+ const char *file2;
+
+ set_program_name (argv[0]);
+
+ ASSERT (argc == 3);
+
+ file1 = argv[1];
+ file2 = argv[2];
+
+ copy_file_preserving (file1, file2);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-copy-file.sh b/gnulib/tests/test-copy-file.sh
new file mode 100755
index 00000000..bf71b3b1
--- /dev/null
+++ b/gnulib/tests/test-copy-file.sh
@@ -0,0 +1,528 @@
+#!/bin/sh
+
+# Show all commands when run with environment variable VERBOSE=yes.
+test -z "$VERBOSE" || set -x
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gl$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ exit 1
+ }
+}
+
+func_tmpdir
+builddir=`pwd`
+cd "$builddir" ||
+ {
+ echo "$0: cannot determine build directory (unreadable parent dir?)" >&2
+ exit 1
+ }
+# Switch to a temporary directory, to increase the likelihood that ACLs are
+# supported on the current file system. (/tmp is usually locally mounted,
+# whereas the build dir is sometimes NFS-mounted.)
+( cd "$tmp"
+
+ # Prepare tmpfile0.
+ rm -f tmpfile[0-9] tmpaclout[0-2]
+ echo "Simple contents" > tmpfile0
+ chmod 600 tmpfile0
+
+ # Classification of the platform according to the programs available for
+ # manipulating ACLs.
+ # Possible values are:
+ # linux, cygwin, freebsd, solaris, hpux, osf1, aix, macosx, irix, none.
+ # TODO: Support also native Win32 platforms (mingw).
+ acl_flavor=none
+ if (getfacl tmpfile0 >/dev/null) 2>/dev/null; then
+ # Platforms with the getfacl and setfacl programs.
+ # Linux, FreeBSD, Solaris, Cygwin.
+ if (setfacl --help >/dev/null) 2>/dev/null; then
+ # Linux, Cygwin.
+ if (LC_ALL=C setfacl --help | grep ' --set-file' >/dev/null) 2>/dev/null; then
+ # Linux.
+ acl_flavor=linux
+ else
+ acl_flavor=cygwin
+ fi
+ else
+ # FreeBSD, Solaris.
+ if (LC_ALL=C setfacl 2>&1 | grep '\-x entries' >/dev/null) 2>/dev/null; then
+ # FreeBSD.
+ acl_flavor=freebsd
+ else
+ # Solaris.
+ acl_flavor=solaris
+ fi
+ fi
+ else
+ if (lsacl / >/dev/null) 2>/dev/null; then
+ # Platforms with the lsacl and chacl programs.
+ # HP-UX, sometimes also IRIX.
+ acl_flavor=hpux
+ else
+ if (getacl tmpfile0 >/dev/null) 2>/dev/null; then
+ # Tru64.
+ acl_flavor=osf1
+ else
+ if (aclget tmpfile0 >/dev/null) 2>/dev/null; then
+ # AIX.
+ acl_flavor=aix
+ else
+ if (fsaclctl -v >/dev/null) 2>/dev/null; then
+ # MacOS X.
+ acl_flavor=macosx
+ else
+ if test -f /sbin/chacl; then
+ # IRIX.
+ acl_flavor=irix
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ # Define a function to test for the same ACLs, from the point of view of
+ # the programs.
+ # func_test_same_acls file1 file2
+ case $acl_flavor in
+ linux | cygwin | freebsd | solaris)
+ func_test_same_acls ()
+ {
+ getfacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ getfacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ hpux)
+ func_test_same_acls ()
+ {
+ lsacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ lsacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ osf1)
+ func_test_same_acls ()
+ {
+ getacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ getacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ aix)
+ func_test_same_acls ()
+ {
+ aclget "$1" > tmpaclout1
+ aclget "$2" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ macosx)
+ func_test_same_acls ()
+ {
+ /bin/ls -le "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ /bin/ls -le "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ irix)
+ func_test_same_acls ()
+ {
+ /bin/ls -lD "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+ /bin/ls -lD "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+ cmp tmpaclout1 tmpaclout2 > /dev/null
+ }
+ ;;
+ none)
+ func_test_same_acls ()
+ {
+ :
+ }
+ ;;
+ esac
+
+ # func_test_copy file1 file2
+ # copies file1 to file2 and verifies the permissions and ACLs are the same
+ # on both.
+ func_test_copy ()
+ {
+ "$builddir"/test-copy-file${EXEEXT} "$1" "$2" || exit 1
+ if test "$USE_ACL" != 0; then
+ "$builddir"/test-sameacls${EXEEXT} "$1" "$2" || exit 1
+ func_test_same_acls "$1" "$2" || exit 1
+ fi
+ }
+
+ func_test_copy tmpfile0 tmpfile1
+
+ if test "$USE_ACL" != 0 && test $acl_flavor != none; then
+ # A POSIX compliant 'id' program.
+ if test -f /usr/xpg4/bin/id; then
+ ID=/usr/xpg4/bin/id
+ else
+ ID=id
+ fi
+ # Use a user and group id different from the current one, to avoid
+ # redundant/ambiguous ACLs.
+ myuid=`$ID -u`
+ mygid=`$ID -g`
+ auid=1
+ if test "$auid" = "$myuid"; then auid=2; fi
+ agid=1
+ if test "$agid" = "$mygid"; then agid=2; fi
+
+ case $acl_flavor in
+ linux | freebsd | solaris)
+
+ # Set an ACL for a user.
+ setfacl -m user:$auid:1 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ setfacl -m group:$agid:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ case $acl_flavor in
+ freebsd) setfacl -m other::4 tmpfile0 ;;
+ solaris) chmod o+r tmpfile0 ;;
+ *) setfacl -m other:4 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ case $acl_flavor in
+ linux) setfacl -x user:$auid tmpfile0 ;;
+ freebsd) setfacl -x user:$auid:1 tmpfile0 ;;
+ *) setfacl -d user:$auid:1 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for other.
+ case $acl_flavor in
+ linux | solaris) ;; # impossible
+ freebsd) setfacl -x other::4 tmpfile0 ;;
+ *) setfacl -d other:4 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile6
+
+ # Remove the ACL for the group.
+ case $acl_flavor in
+ linux) setfacl -x group:$agid tmpfile0 ;;
+ freebsd) setfacl -x group:$agid:4 tmpfile0 ;;
+ *) setfacl -d group:$agid:4 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile7
+
+ # Delete all optional ACLs.
+ case $acl_flavor in
+ linux | freebsd)
+ setfacl -m user:$auid:1 tmpfile0
+ setfacl -b tmpfile0
+ ;;
+ *)
+ setfacl -s user::6,group::0,other:0 tmpfile0 ;;
+ esac
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ case $acl_flavor in
+ linux) getfacl tmpfile9 | setfacl --set-file=- tmpfile0 ;;
+ freebsd) ;;
+ *) getfacl tmpfile9 | setfacl -f - tmpfile0 ;;
+ esac
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ cygwin)
+
+ # Set an ACL for a group.
+ setfacl -m group:0:1 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for other.
+ setfacl -m other:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the group.
+ setfacl -d group:0 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for other.
+ setfacl -d other:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile6
+
+ # Delete all optional ACLs.
+ setfacl -s user::6,group::0,other:0 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ getfacl tmpfile9 | setfacl -f - tmpfile0
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ hpux)
+
+ # Set an ACL for a user.
+ orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+ chacl -r "${orig}($auid.%,--x)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+ chacl -r "${orig}(%.$agid,r--)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+ chacl -r "${orig}(%.%,r--)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ chacl -d "($auid.%,--x)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for the group.
+ chacl -d "(%.$agid,r--)" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile6
+
+ # Delete all optional ACLs.
+ chacl -z tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ orig=`lsacl tmpfile9 | sed -e 's/ tmpfile9$//'`
+ rm -f tmpfile9
+ chacl -r "${orig}" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ osf1)
+
+ # Set an ACL for a user.
+ setacl -u user:$auid:1 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ setacl -u group:$agid:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ setacl -u other::4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ setacl -x user:$auid:1 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ if false; then # would give an error "can't set ACL: Invalid argument"
+ # Remove the ACL for other.
+ setacl -x other::4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile6
+ fi
+
+ # Remove the ACL for the group.
+ setacl -x group:$agid:4 tmpfile0
+
+ func_test_copy tmpfile0 tmpfile7
+
+ # Delete all optional ACLs.
+ setacl -u user:$auid:1 tmpfile0
+ setacl -b tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ getacl tmpfile9 > tmpaclout0
+ setacl -b -U tmpaclout0 tmpfile0
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ aix)
+
+ # Set an ACL for a user.
+ { aclget tmpfile0 | sed -e 's/disabled$/enabled/'; echo " permit --x u:$auid"; } | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ { aclget tmpfile0 | sed -e 's/disabled$/enabled/'; echo " permit r-- g:$agid"; } | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ chmod o+r tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ aclget tmpfile0 | grep -v ' u:[^ ]*$' | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for the group.
+ aclget tmpfile0 | grep -v ' g:[^ ]*$' | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile7
+
+ # Delete all optional ACLs.
+ aclget tmpfile0 | sed -e 's/enabled$/disabled/' | sed -e '/disabled$/q' | aclput tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ aclget tmpfile9 | aclput tmpfile0
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ macosx)
+
+ # Set an ACL for a user.
+ /bin/chmod +a "user:daemon allow execute" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ /bin/chmod +a "group:daemon allow read" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ chmod o+r tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ /bin/chmod -a "user:daemon allow execute" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for the group.
+ /bin/chmod -a "group:daemon allow read" tmpfile0
+
+ func_test_copy tmpfile0 tmpfile7
+
+ # Delete all optional ACLs.
+ /bin/chmod -N tmpfile0
+
+ func_test_copy tmpfile0 tmpfile8
+
+ # Copy ACLs from a file that has no ACLs.
+ echo > tmpfile9
+ chmod a+x tmpfile9
+ { /bin/ls -le tmpfile9 | sed -n -e 's/^ [0-9][0-9]*: //p'; echo; } | /bin/chmod -E tmpfile0
+ rm -f tmpfile9
+
+ func_test_copy tmpfile0 tmpfile9
+
+ ;;
+
+ irix)
+
+ # Set an ACL for a user.
+ /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x tmpfile0
+
+ func_test_copy tmpfile0 tmpfile2
+
+ # Set an ACL for a group.
+ /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x,group:$agid:r-- tmpfile0
+
+ func_test_copy tmpfile0 tmpfile3
+
+ # Set an ACL for other.
+ /sbin/chacl user::rw-,group::---,user:$auid:--x,group:$agid:r--,other::r-- tmpfile0
+
+ func_test_copy tmpfile0 tmpfile4
+
+ # Remove the ACL for the user.
+ /sbin/chacl user::rw-,group::---,group:$agid:r--,other::r-- tmpfile0
+
+ func_test_copy tmpfile0 tmpfile5
+
+ # Remove the ACL for the group.
+ /sbin/chacl user::rw-,group::---,other::r-- tmpfile0
+
+ func_test_copy tmpfile0 tmpfile7
+
+ ;;
+
+ esac
+ fi
+
+ rm -f tmpfile[0-9] tmpaclout[0-2]
+) || exit 1
+
+rm -rf "$tmp"
+exit 0
diff --git a/gnulib/tests/test-copysign.c b/gnulib/tests/test-copysign.c
new file mode 100644
index 00000000..60bda2fe
--- /dev/null
+++ b/gnulib/tests/test-copysign.c
@@ -0,0 +1,60 @@
+/* Test of copysign() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (copysign, double, (double, double));
+
+#include "macros.h"
+
+volatile double x;
+volatile double y;
+double z;
+
+int
+main ()
+{
+ /* A particular value in the first quadrant. */
+ x = 0.6;
+ y = 0.8;
+ z = copysign (x, y);
+ ASSERT (z == 0.6);
+
+ /* A particular value in the second quadrant. */
+ x = -0.6;
+ y = 0.8;
+ z = copysign (x, y);
+ ASSERT (z == 0.6);
+
+ /* A particular value in the third quadrant. */
+ x = -0.6;
+ y = -0.8;
+ z = copysign (x, y);
+ ASSERT (z == -0.6);
+
+ /* A particular value in the fourth quadrant. */
+ x = 0.6;
+ y = -0.8;
+ z = copysign (x, y);
+ ASSERT (z == -0.6);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-cos.c b/gnulib/tests/test-cos.c
new file mode 100644
index 00000000..3e321ff6
--- /dev/null
+++ b/gnulib/tests/test-cos.c
@@ -0,0 +1,40 @@
+/* Test of cos() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (cos, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = cos (x);
+ ASSERT (y >= 0.8253356149 && y <= 0.8253356150);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-cosh.c b/gnulib/tests/test-cosh.c
new file mode 100644
index 00000000..9c952fb3
--- /dev/null
+++ b/gnulib/tests/test-cosh.c
@@ -0,0 +1,40 @@
+/* Test of cosh() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (cosh, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = cosh (x);
+ ASSERT (y >= 1.185465218 && y <= 1.185465219);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-cosl.c b/gnulib/tests/test-cosl.c
new file mode 100644
index 00000000..a13e75f8
--- /dev/null
+++ b/gnulib/tests/test-cosl.c
@@ -0,0 +1,45 @@
+/* Test of cosl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (cosl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = cosl (x);
+ ASSERT (y >= 0.8253356149L && y <= 0.8253356150L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-count-one-bits.c b/gnulib/tests/test-count-one-bits.c
new file mode 100644
index 00000000..ad811ace
--- /dev/null
+++ b/gnulib/tests/test-count-one-bits.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2007-2010 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/>. */
+
+/* Written by Ben Pfaff. */
+
+#include <config.h>
+
+#include "count-one-bits.h"
+
+#include <limits.h>
+#include <stdio.h>
+
+#include "macros.h"
+
+#define UINT_BIT (sizeof (unsigned int) * CHAR_BIT)
+#define ULONG_BIT (sizeof (unsigned long int) * CHAR_BIT)
+#define ULLONG_BIT (sizeof (unsigned long long int) * CHAR_BIT)
+
+#ifndef ULLONG_MAX
+# define HALF (1ULL << (sizeof (unsigned long long int) * CHAR_BIT - 1))
+# define ULLONG_MAX (HALF - 1 + HALF)
+#endif
+
+int
+main (int argc, char *argv[])
+{
+ int i, j;
+
+#define TEST_COUNT_ONE_BITS(FUNC, TYPE, BITS, MAX, ONE) \
+ ASSERT (FUNC (0) == 0); \
+ for (i = 0; i < BITS; i++) \
+ { \
+ ASSERT (FUNC (ONE << i) == 1); \
+ for (j = i + 1; j < BITS; j++) \
+ ASSERT (FUNC ((ONE << i) | (ONE << j)) == 2); \
+ } \
+ for (i = 0; i < 1000; i++) \
+ { \
+ TYPE value = rand () ^ (rand () << 31 << 1); \
+ int count = 0; \
+ for (j = 0; j < BITS; j++) \
+ count += (value & (ONE << j)) != 0; \
+ ASSERT (count == FUNC (value)); \
+ } \
+ ASSERT (FUNC (MAX) == BITS);
+
+ TEST_COUNT_ONE_BITS (count_one_bits, unsigned int, UINT_BIT, UINT_MAX, 1U);
+ TEST_COUNT_ONE_BITS (count_one_bits_l, unsigned long int,
+ ULONG_BIT, ULONG_MAX, 1UL);
+#ifdef HAVE_UNSIGNED_LONG_LONG_INT
+ TEST_COUNT_ONE_BITS (count_one_bits_ll,
+ unsigned long long int, ULLONG_BIT, ULLONG_MAX, 1ULL);
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-crc.c b/gnulib/tests/test-crc.c
new file mode 100644
index 00000000..19b66daf
--- /dev/null
+++ b/gnulib/tests/test-crc.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2005, 2006, 2007, 2010 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "crc.h"
+
+#include <stdio.h>
+
+int
+main (int argc, char *argv[])
+{
+ uint32_t p;
+
+ p = crc32_update_no_xor (42, "foo", 3);
+ if (p != 0x46e87f05)
+ {
+ printf ("cunx got %lx\n", (unsigned long) p);
+ return 1;
+ }
+
+ p = crc32_no_xor ("foo", 3);
+ if (p != 0x7332bc33)
+ {
+ printf ("cnx got %lx\n", (unsigned long) p);
+ return 1;
+ }
+
+ p = crc32_update (42, "foo", 3);
+ if (p != 0xb9a9a617)
+ {
+ printf ("cu got %lx\n", (unsigned long) p);
+ return 1;
+ }
+
+ p = crc32 ("foo", 3);
+ if (p != 0x8c736521)
+ {
+ printf ("c got %lx\n", (unsigned long) p);
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-ctype.c b/gnulib/tests/test-ctype.c
new file mode 100644
index 00000000..bbace4a1
--- /dev/null
+++ b/gnulib/tests/test-ctype.c
@@ -0,0 +1,27 @@
+/* Test of <ctype.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <ctype.h>
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-des.c b/gnulib/tests/test-des.c
new file mode 100644
index 00000000..94ba0de7
--- /dev/null
+++ b/gnulib/tests/test-des.c
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2005, 2007, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+/* Adapted for gnulib by Simon Josefsson, based on Libgcrypt. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "des.h"
+
+int
+main (int argc, char *argv[])
+{
+ /*
+ * DES Maintenance Test
+ */
+ {
+ int i;
+ char key[8] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
+ char input[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ char result[8] = { 0x24, 0x6e, 0x9d, 0xb9, 0xc5, 0x50, 0x38, 0x1a };
+ char temp1[8], temp2[8], temp3[8];
+ gl_des_ctx des;
+
+ for (i = 0; i < 64; ++i)
+ {
+ gl_des_setkey (&des, key);
+ gl_des_ecb_encrypt (&des, input, temp1);
+ gl_des_ecb_encrypt (&des, temp1, temp2);
+ gl_des_setkey (&des, temp2);
+ gl_des_ecb_decrypt (&des, temp1, temp3);
+ memcpy (key, temp3, 8);
+ memcpy (input, temp1, 8);
+ }
+ if (memcmp (temp3, result, 8))
+ return 1;
+ }
+
+
+ /*
+ * Self made Triple-DES test (Does somebody know an official test?)
+ */
+ {
+ int i;
+ char input[8] = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
+ char key1[8] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 };
+ char key2[8] = { 0x11, 0x22, 0x33, 0x44, 0xff, 0xaa, 0xcc, 0xdd };
+ char result[8] = { 0x7b, 0x38, 0x3b, 0x23, 0xa2, 0x7d, 0x26, 0xd3 };
+
+ gl_3des_ctx des3;
+
+ for (i = 0; i < 16; ++i)
+ {
+ gl_3des_set2keys (&des3, key1, key2);
+ gl_3des_ecb_encrypt (&des3, input, key1);
+ gl_3des_ecb_decrypt (&des3, input, key2);
+ gl_3des_set3keys (&des3, key1, input, key2);
+ gl_3des_ecb_encrypt (&des3, input, input);
+ }
+ if (memcmp (input, result, 8))
+ return 1;
+ }
+
+ /*
+ * More Triple-DES test. These are testvectors as used by SSLeay,
+ * thanks to Jeroen C. van Gelderen.
+ */
+ {
+ struct
+ {
+ char key[24];
+ char plain[8];
+ char cipher[8];
+ } testdata[] =
+ {
+ {
+ {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
+ {
+ 0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00},
+ {
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
+ {
+ {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
+ {
+ 0x9D, 0x64, 0x55, 0x5A, 0x9A, 0x10, 0xB8, 0x52,},
+ {
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00}
+ },
+ {
+ {
+ 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E,
+ 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E,
+ 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
+ {
+ 0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
+ {
+ 0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A}
+ },
+ {
+ {
+ 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6,
+ 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6,
+ 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
+ {
+ 0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
+ {
+ 0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95}
+ },
+ {
+ {
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {
+ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61},
+ {
+ 0x3D, 0x12, 0x4F, 0xE2, 0x19, 0x8B, 0xA3, 0x18}
+ },
+ {
+ {
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {
+ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61},
+ {
+ 0xFB, 0xAB, 0xA1, 0xFF, 0x9D, 0x05, 0xE9, 0xB1}
+ },
+ {
+ {
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
+ {
+ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61},
+ {
+ 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72}
+ },
+ {
+ {
+ 0x03, 0x52, 0x02, 0x07, 0x67, 0x20, 0x82, 0x17,
+ 0x86, 0x02, 0x87, 0x66, 0x59, 0x08, 0x21, 0x98,
+ 0x64, 0x05, 0x6A, 0xBD, 0xFE, 0xA9, 0x34, 0x57},
+ {
+ 0x73, 0x71, 0x75, 0x69, 0x67, 0x67, 0x6C, 0x65},
+ {
+ 0xc0, 0x7d, 0x2a, 0x0f, 0xa5, 0x66, 0xfa, 0x30}
+ },
+ {
+ {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02},
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {
+ 0xe6, 0xe6, 0xdd, 0x5b, 0x7e, 0x72, 0x29, 0x74}
+ },
+ {
+ {
+ 0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
+ 0x91, 0x07, 0xD0, 0x15, 0x89, 0x19, 0x01, 0x01,
+ 0x19, 0x07, 0x92, 0x10, 0x98, 0x1A, 0x01, 0x01},
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {
+ 0xe1, 0xef, 0x62, 0xc3, 0x32, 0xfe, 0x82, 0x5b}
+ }
+ };
+
+ char result[8];
+ int i;
+ gl_3des_ctx des3;
+
+ for (i = 0; i < sizeof (testdata) / sizeof (*testdata); ++i)
+ {
+ gl_3des_set3keys (&des3, testdata[i].key,
+ testdata[i].key + 8, testdata[i].key + 16);
+
+ gl_3des_ecb_encrypt (&des3, testdata[i].plain, result);
+ if (memcmp (testdata[i].cipher, result, 8))
+ {
+ return 1;
+ }
+
+ gl_3des_ecb_decrypt (&des3, testdata[i].cipher, result);
+ if (memcmp (testdata[i].plain, result, 8))
+ {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-dirent-safer.c b/gnulib/tests/test-dirent-safer.c
new file mode 100644
index 00000000..1a83eeac
--- /dev/null
+++ b/gnulib/tests/test-dirent-safer.c
@@ -0,0 +1,96 @@
+/* Test that directory streams leave standard fds alone.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "dirent--.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "unistd-safer.h"
+
+/* This test intentionally closes stderr. So, we arrange to have fd 10
+ (outside the range of interesting fd's during the test) set up to
+ duplicate the original stderr. */
+
+#define BACKUP_STDERR_FILENO 10
+#define ASSERT_STREAM myerr
+#include "macros.h"
+
+static FILE *myerr;
+
+int
+main (void)
+{
+ int i;
+ DIR *dp;
+ /* The dirent-safer module works without the use of fdopendir (which
+ would also pull in fchdir and openat); but if those modules were
+ also used, we ensure that they are safe. In particular, the
+ gnulib version of fdopendir is unable to guarantee that
+ dirfd(fdopendir(fd))==fd, but we can at least guarantee that if
+ they are not equal, the fd returned by dirfd is safe. */
+#if HAVE_FDOPENDIR || GNULIB_FDOPENDIR
+ int dfd;
+#endif
+
+ /* We close fd 2 later, so save it in fd 10. */
+ if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO
+ || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL)
+ return 2;
+
+#if HAVE_FDOPENDIR || GNULIB_FDOPENDIR
+ dfd = open (".", O_RDONLY);
+ ASSERT (STDERR_FILENO < dfd);
+#endif
+
+ /* Four iterations, with progressively more standard descriptors
+ closed. */
+ for (i = -1; i <= STDERR_FILENO; i++)
+ {
+ if (0 <= i)
+ ASSERT (close (i) == 0);
+ dp = opendir (".");
+ ASSERT (dp);
+ ASSERT (dirfd (dp) == -1 || STDERR_FILENO < dirfd (dp));
+ ASSERT (closedir (dp) == 0);
+
+#if HAVE_FDOPENDIR || GNULIB_FDOPENDIR
+ {
+ int fd = dup_safer (dfd);
+ ASSERT (STDERR_FILENO < fd);
+ dp = fdopendir (fd);
+ ASSERT (dp);
+ ASSERT (dirfd (dp) == -1 || STDERR_FILENO < dirfd (dp));
+ ASSERT (closedir (dp) == 0);
+ errno = 0;
+ ASSERT (close (fd) == -1);
+ ASSERT (errno == EBADF);
+ }
+#endif
+ }
+
+#if HAVE_FDOPENDIR || GNULIB_FDOPENDIR
+ ASSERT (close (dfd) == 0);
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-dirent.c b/gnulib/tests/test-dirent.c
new file mode 100644
index 00000000..2c6d1fdb
--- /dev/null
+++ b/gnulib/tests/test-dirent.c
@@ -0,0 +1,32 @@
+/* Test of <dirent.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <dirent.h>
+
+/* Check for existence of required types. */
+static DIR *dir _GL_UNUSED;
+static struct dirent d;
+static ino_t i;
+
+int
+main (void)
+{
+ return d.d_name[0] + i;
+}
diff --git a/gnulib/tests/test-dirname.c b/gnulib/tests/test-dirname.c
new file mode 100644
index 00000000..88cb8d65
--- /dev/null
+++ b/gnulib/tests/test-dirname.c
@@ -0,0 +1,191 @@
+/* Test the gnulib dirname module.
+ Copyright (C) 2005, 2006, 2007, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct test {
+ const char *name; /* Name under test. */
+ const char *dir; /* dir_name (name). */
+ const char *last; /* last_component (name). */
+ const char *base; /* base_name (name). */
+ const char *stripped; /* name after strip_trailing_slashes (name). */
+ bool modified; /* result of strip_trailing_slashes (name). */
+ bool absolute; /* IS_ABSOLUTE_FILE_NAME (name). */
+};
+
+static struct test tests[] = {
+ {"d/f", "d", "f", "f", "d/f", false, false},
+ {"/d/f", "/d", "f", "f", "/d/f", false, true},
+ {"d/f/", "d", "f/", "f/", "d/f", true, false},
+ {"d/f//", "d", "f//", "f/", "d/f", true, false},
+ {"f", ".", "f", "f", "f", false, false},
+ {"/", "/", "", "/", "/", false, true},
+#if DOUBLE_SLASH_IS_DISTINCT_ROOT
+ {"//", "//", "", "//", "//", false, true},
+ {"//d", "//", "d", "d", "//d", false, true},
+#else
+ {"//", "/", "", "/", "/", true, true},
+ {"//d", "/", "d", "d", "//d", false, true},
+#endif
+ {"///", "/", "", "/", "/", true, true},
+ {"///a///", "/", "a///", "a/", "///a", true, true},
+ /* POSIX requires dirname("") and basename("") to both return ".",
+ but dir_name and base_name are defined differently. */
+ {"", ".", "", "", "", false, false},
+ {".", ".", ".", ".", ".", false, false},
+ {"..", ".", "..", "..", "..", false, false},
+#if FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
+ {"a\\", ".", "a\\", "a\\", "a", true, false},
+ {"a\\b", "a", "b", "b", "a\\b", false, false},
+ {"\\", "\\", "", "\\", "\\", false, true},
+ {"\\/\\", "\\", "", "\\", "\\", true, true},
+ {"\\\\/", "\\", "", "\\", "\\", true, true},
+ {"\\//", "\\", "", "\\", "\\", true, true},
+ {"//\\", "/", "", "/", "/", true, true},
+#else
+ {"a\\", ".", "a\\", "a\\", "a\\", false, false},
+ {"a\\b", ".", "a\\b", "a\\b", "a\\b", false, false},
+ {"\\", ".", "\\", "\\", "\\", false, false},
+ {"\\/\\", "\\", "\\", "\\", "\\/\\",false, false},
+ {"\\\\/", ".", "\\\\/","\\\\/","\\\\", true, false},
+ {"\\//", ".", "\\//", "\\/", "\\", true, false},
+# if DOUBLE_SLASH_IS_DISTINCT_ROOT
+ {"//\\", "//", "\\", "\\", "//\\", false, true},
+# else
+ {"//\\", "/", "\\", "\\", "//\\", false, true},
+# endif
+#endif
+#if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
+# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+ {"c:", "c:", "", "c:", "c:", false, false},
+ {"c:/", "c:/", "", "c:/", "c:/", false, true},
+ {"c://", "c:/", "", "c:/", "c:/", true, true},
+ {"c:/d", "c:/", "d", "d", "c:/d", false, true},
+ {"c://d", "c:/", "d", "d", "c://d",false, true},
+ {"c:/d/", "c:/", "d/", "d/", "c:/d", true, true},
+ {"c:/d/f", "c:/d", "f", "f", "c:/d/f",false, true},
+ {"c:d", "c:.", "d", "d", "c:d", false, false},
+ {"c:d/", "c:.", "d/", "d/", "c:d", true, false},
+ {"c:d/f", "c:d", "f", "f", "c:d/f",false, false},
+ {"a:b:c", "a:.", "b:c", "./b:c","a:b:c",false, false},
+ {"a/b:c", "a", "b:c", "./b:c","a/b:c",false, false},
+ {"a/b:c/", "a", "b:c/", "./b:c/","a/b:c",true, false},
+# else /* ! FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE */
+ {"c:", "c:", "", "c:", "c:", false, true},
+ {"c:/", "c:", "", "c:", "c:", true, true},
+ {"c://", "c:", "", "c:", "c:", true, true},
+ {"c:/d", "c:", "d", "d", "c:/d", false, true},
+ {"c://d", "c:", "d", "d", "c://d",false, true},
+ {"c:/d/", "c:", "d/", "d/", "c:/d", true, true},
+ {"c:/d/f", "c:/d", "f", "f", "c:/d/f",false, true},
+ {"c:d", "c:", "d", "d", "c:d", false, true},
+ {"c:d/", "c:", "d/", "d/", "c:d", true, true},
+ {"c:d/f", "c:d", "f", "f", "c:d/f",false, true},
+ {"a:b:c", "a:", "b:c", "./b:c","a:b:c",false, true},
+ {"a/b:c", "a", "b:c", "./b:c","a/b:c",false, false},
+ {"a/b:c/", "a", "b:c/", "./b:c/","a/b:c",true, false},
+# endif
+#else /* ! FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX */
+ {"c:", ".", "c:", "c:", "c:", false, false},
+ {"c:/", ".", "c:/", "c:/", "c:", true, false},
+ {"c://", ".", "c://", "c:/", "c:", true, false},
+ {"c:/d", "c:", "d", "d", "c:/d", false, false},
+ {"c://d", "c:", "d", "d", "c://d",false, false},
+ {"c:/d/", "c:", "d/", "d/", "c:/d", true, false},
+ {"c:/d/f", "c:/d", "f", "f", "c:/d/f",false, false},
+ {"c:d", ".", "c:d", "c:d", "c:d", false, false},
+ {"c:d/", ".", "c:d/", "c:d/", "c:d", true, false},
+ {"c:d/f", "c:d", "f", "f", "c:d/f",false, false},
+ {"a:b:c", ".", "a:b:c","a:b:c","a:b:c",false, false},
+ {"a/b:c", "a", "b:c", "b:c", "a/b:c",false, false},
+ {"a/b:c/", "a", "b:c/", "b:c/", "a/b:c",true, false},
+#endif
+ {"1:", ".", "1:", "1:", "1:", false, false},
+ {"1:/", ".", "1:/", "1:/", "1:", true, false},
+ {"/:", "/", ":", ":", "/:", false, true},
+ {"/:/", "/", ":/", ":/", "/:", true, true},
+ /* End sentinel. */
+ {NULL, NULL, NULL, NULL, NULL, false, false}
+};
+
+int
+main (void)
+{
+ struct test *t;
+ bool ok = true;
+
+ for (t = tests; t->name; t++)
+ {
+ char *dir = dir_name (t->name);
+ int dirlen = dir_len (t->name);
+ char *last = last_component (t->name);
+ char *base = base_name (t->name);
+ int baselen = base_len (base);
+ char *stripped = strdup (t->name);
+ bool modified = strip_trailing_slashes (stripped);
+ bool absolute = IS_ABSOLUTE_FILE_NAME (t->name);
+ if (! (strcmp (dir, t->dir) == 0
+ && (dirlen == strlen (dir)
+ || (dirlen + 1 == strlen (dir) && dir[dirlen] == '.'))))
+ {
+ ok = false;
+ printf ("dir_name `%s': got `%s' len %d, expected `%s' len %ld\n",
+ t->name, dir, dirlen,
+ t->dir, (unsigned long) strlen (t->dir));
+ }
+ if (strcmp (last, t->last))
+ {
+ ok = false;
+ printf ("last_component `%s': got `%s', expected `%s'\n",
+ t->name, last, t->last);
+ }
+ if (! (strcmp (base, t->base) == 0
+ && (baselen == strlen (base)
+ || (baselen + 1 == strlen (base)
+ && ISSLASH (base[baselen])))))
+ {
+ ok = false;
+ printf ("base_name `%s': got `%s' len %d, expected `%s' len %ld\n",
+ t->name, base, baselen,
+ t->base, (unsigned long) strlen (t->base));
+ }
+ if (strcmp (stripped, t->stripped) || modified != t->modified)
+ {
+ ok = false;
+ printf ("strip_trailing_slashes `%s': got %s %s, expected %s %s\n",
+ t->name, stripped, modified ? "changed" : "unchanged",
+ t->stripped, t->modified ? "changed" : "unchanged");
+ }
+ if (t->absolute != absolute)
+ {
+ ok = false;
+ printf ("`%s': got %s, expected %s\n", t->name,
+ absolute ? "absolute" : "relative",
+ t->absolute ? "absolute" : "relative");
+ }
+ free (dir);
+ free (base);
+ free (stripped);
+ }
+ return ok ? 0 : 1;
+}
diff --git a/gnulib/tests/test-dprintf-posix.c b/gnulib/tests/test-dprintf-posix.c
new file mode 100644
index 00000000..8133cbf6
--- /dev/null
+++ b/gnulib/tests/test-dprintf-posix.c
@@ -0,0 +1,171 @@
+/* Test of POSIX compatible dprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (dprintf, int, (int, const char *, ...));
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "macros.h"
+
+static void
+test_function (int (*my_dprintf) (int, const char *, ...))
+{
+ /* Here we don't test output that may be platform dependent.
+ The bulk of the tests is done as part of the 'vasnprintf-posix' module. */
+
+ /* Test support of size specifiers as in C99. */
+
+ my_dprintf (fileno (stdout), "%ju %d\n", (uintmax_t) 12345671, 33, 44, 55);
+
+ my_dprintf (fileno (stdout), "%zu %d\n", (size_t) 12345672, 33, 44, 55);
+
+ my_dprintf (fileno (stdout), "%tu %d\n", (ptrdiff_t) 12345673, 33, 44, 55);
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ /* Positive zero. */
+ my_dprintf (fileno (stdout), "%a %d\n", 0.0, 33, 44, 55);
+
+ /* Positive infinity. */
+ my_dprintf (fileno (stdout), "%a %d\n", 1.0 / 0.0, 33, 44, 55);
+
+ /* Negative infinity. */
+ my_dprintf (fileno (stdout), "%a %d\n", -1.0 / 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO with infinite number. */
+ my_dprintf (fileno (stdout), "%010a %d\n", 1.0 / 0.0, 33, 44, 55);
+
+ /* Test the support of the %f format directive. */
+
+ /* A positive number. */
+ my_dprintf (fileno (stdout), "%f %d\n", 12.75, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_dprintf (fileno (stdout), "%f %d\n", 1234567.0, 33, 44, 55);
+
+ /* A negative number. */
+ my_dprintf (fileno (stdout), "%f %d\n", -0.03125, 33, 44, 55);
+
+ /* Positive zero. */
+ my_dprintf (fileno (stdout), "%f %d\n", 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_dprintf (fileno (stdout), "%015f %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision. */
+ my_dprintf (fileno (stdout), "%.f %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_dprintf (fileno (stdout), "%.2f %d\n", 999.95, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_dprintf (fileno (stdout), "%.2f %d\n", 999.996, 33, 44, 55);
+
+ /* A positive number. */
+ my_dprintf (fileno (stdout), "%Lf %d\n", 12.75L, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_dprintf (fileno (stdout), "%Lf %d\n", 1234567.0L, 33, 44, 55);
+
+ /* A negative number. */
+ my_dprintf (fileno (stdout), "%Lf %d\n", -0.03125L, 33, 44, 55);
+
+ /* Positive zero. */
+ my_dprintf (fileno (stdout), "%Lf %d\n", 0.0L, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_dprintf (fileno (stdout), "%015Lf %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision. */
+ my_dprintf (fileno (stdout), "%.Lf %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_dprintf (fileno (stdout), "%.2Lf %d\n", 999.95L, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_dprintf (fileno (stdout), "%.2Lf %d\n", 999.996L, 33, 44, 55);
+
+ /* Test the support of the %F format directive. */
+
+ /* A positive number. */
+ my_dprintf (fileno (stdout), "%F %d\n", 12.75, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_dprintf (fileno (stdout), "%F %d\n", 1234567.0, 33, 44, 55);
+
+ /* A negative number. */
+ my_dprintf (fileno (stdout), "%F %d\n", -0.03125, 33, 44, 55);
+
+ /* Positive zero. */
+ my_dprintf (fileno (stdout), "%F %d\n", 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_dprintf (fileno (stdout), "%015F %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision. */
+ my_dprintf (fileno (stdout), "%.F %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_dprintf (fileno (stdout), "%.2F %d\n", 999.95, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_dprintf (fileno (stdout), "%.2F %d\n", 999.996, 33, 44, 55);
+
+ /* A positive number. */
+ my_dprintf (fileno (stdout), "%LF %d\n", 12.75L, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_dprintf (fileno (stdout), "%LF %d\n", 1234567.0L, 33, 44, 55);
+
+ /* A negative number. */
+ my_dprintf (fileno (stdout), "%LF %d\n", -0.03125L, 33, 44, 55);
+
+ /* Positive zero. */
+ my_dprintf (fileno (stdout), "%LF %d\n", 0.0L, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_dprintf (fileno (stdout), "%015LF %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision. */
+ my_dprintf (fileno (stdout), "%.LF %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_dprintf (fileno (stdout), "%.2LF %d\n", 999.95L, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_dprintf (fileno (stdout), "%.2LF %d\n", 999.996L, 33, 44, 55);
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ my_dprintf (fileno (stdout), "%2$d %1$d\n", 33, 55);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_function (dprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-dprintf-posix.sh b/gnulib/tests/test-dprintf-posix.sh
new file mode 100755
index 00000000..75c35938
--- /dev/null
+++ b/gnulib/tests/test-dprintf-posix.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-dprintf-posix.tmp t-dprintf-posix.out"
+./test-dprintf-posix${EXEEXT} > t-dprintf-posix.tmp || exit 1
+LC_ALL=C tr -d '\r' < t-dprintf-posix.tmp > t-dprintf-posix.out || exit 1
+
+: ${DIFF=diff}
+${DIFF} "${srcdir}/test-printf-posix.output" t-dprintf-posix.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-dprintf-posix2.c b/gnulib/tests/test-dprintf-posix2.c
new file mode 100644
index 00000000..fd54070e
--- /dev/null
+++ b/gnulib/tests/test-dprintf-posix2.c
@@ -0,0 +1,109 @@
+/* Test of POSIX compatible dprintf() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* Test against a memory leak in the fprintf replacement. */
+
+/* Number of iterations across the loop. */
+#define NUM_ROUNDS 1000
+
+/* Number of bytes that are allowed to escape per round. */
+#define MAX_ALLOC_ROUND 10000
+
+/* Number of bytes that are allowed to escape in total.
+ This should be at least 10 MB, since it includes the normal memory
+ or address space of the test program. */
+#define MAX_ALLOC_TOTAL (NUM_ROUNDS * MAX_ALLOC_ROUND)
+
+int
+main (int argc, char *argv[])
+{
+ struct rlimit limit;
+ int arg;
+ int repeat;
+
+ /* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
+
+ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
+#ifdef RLIMIT_DATA
+ if (getrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
+ limit.rlim_max = MAX_ALLOC_TOTAL;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+#endif
+ /* On Linux systems, malloc() is limited by RLIMIT_AS. */
+#ifdef RLIMIT_AS
+ if (getrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
+ limit.rlim_max = MAX_ALLOC_TOTAL;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+#endif
+
+ arg = atoi (argv[1]);
+ if (arg == 0)
+ {
+ void *memory = malloc (MAX_ALLOC_TOTAL);
+ if (memory == NULL)
+ return 1;
+ memset (memory, 17, MAX_ALLOC_TOTAL);
+ return 78;
+ }
+
+ /* Perform the test and test whether it triggers a permanent memory
+ allocation of more than MAX_ALLOC_TOTAL bytes. */
+
+ for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
+ {
+ /* This may produce a temporary memory allocation of 11000 bytes.
+ but should not result in a permanent memory allocation. */
+ if (dprintf (STDOUT_FILENO, "%011000d\n", 17) == -1
+ && errno == ENOMEM)
+ return 1;
+ }
+
+ return 0;
+}
+
+#else
+
+int
+main (int argc, char *argv[])
+{
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/test-dprintf-posix2.sh b/gnulib/tests/test-dprintf-posix2.sh
new file mode 100755
index 00000000..f1aeacc7
--- /dev/null
+++ b/gnulib/tests/test-dprintf-posix2.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+# Test against a memory leak.
+
+(./test-dprintf-posix2${EXEEXT} 0
+ result=$?
+ if test $result != 77 && test $result != 78; then result=1; fi
+ exit $result
+) 2>/dev/null
+malloc_result=$?
+if test $malloc_result = 77; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+
+./test-dprintf-posix2${EXEEXT} 1 > /dev/null
+result=$?
+if test $result = 77; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+if test $result != 0; then
+ exit 1
+fi
+
+if test $malloc_result = 78; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+
+exit 0
diff --git a/gnulib/tests/test-dup-safer.c b/gnulib/tests/test-dup-safer.c
new file mode 100644
index 00000000..28f13177
--- /dev/null
+++ b/gnulib/tests/test-dup-safer.c
@@ -0,0 +1,175 @@
+/* Test that dup_safer leaves standard fds alone.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "unistd--.h"
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#include "binary-io.h"
+#include "cloexec.h"
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#if !O_BINARY
+# define setmode(f,m) zero ()
+static int zero (void) { return 0; }
+#endif
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+/* This test intentionally closes stderr. So, we arrange to have fd 10
+ (outside the range of interesting fd's during the test) set up to
+ duplicate the original stderr. */
+
+#define BACKUP_STDERR_FILENO 10
+#define ASSERT_STREAM myerr
+#include "macros.h"
+
+static FILE *myerr;
+
+/* Return true if FD is open. */
+static bool
+is_open (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
+#else
+# ifndef F_GETFL
+# error Please port fcntl to your platform
+# endif
+ return 0 <= fcntl (fd, F_GETFL);
+#endif
+}
+
+/* Return true if FD is open and inheritable across exec/spawn. */
+static bool
+is_inheritable (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ if (h == INVALID_HANDLE_VALUE || GetHandleInformation (h, &flags) == 0)
+ return 0;
+ return (flags & HANDLE_FLAG_INHERIT) != 0;
+#else
+# ifndef F_GETFD
+# error Please port fcntl to your platform
+# endif
+ int i = fcntl (fd, F_GETFD);
+ return 0 <= i && (i & FD_CLOEXEC) == 0;
+#endif
+}
+
+/* Return true if FD is open in the given MODE, which is either
+ O_TEXT or O_BINARY. */
+static bool
+is_mode (int fd, int mode)
+{
+ int value = setmode (fd, O_BINARY);
+ setmode (fd, value);
+ return mode == value;
+}
+
+#define witness "test-dup-safer.txt"
+
+int
+main (void)
+{
+ int i;
+ int fd;
+
+ /* We close fd 2 later, so save it in fd 10. */
+ if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO
+ || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL)
+ return 2;
+
+ /* Create file for later checks. */
+ fd = creat (witness, 0600);
+ ASSERT (STDERR_FILENO < fd);
+
+ /* Four iterations, with progressively more standard descriptors
+ closed. */
+ for (i = -1; i <= STDERR_FILENO; i++)
+ {
+ if (0 <= i)
+ ASSERT (close (i) == 0);
+
+ /* Detect errors. */
+ errno = 0;
+ ASSERT (dup (-1) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (dup (10000000) == -1);
+ ASSERT (errno == EBADF);
+ close (fd + 1);
+ errno = 0;
+ ASSERT (dup (fd + 1) == -1);
+ ASSERT (errno == EBADF);
+
+ /* Preserve text vs. binary. */
+ setmode (fd, O_BINARY);
+ ASSERT (dup (fd) == fd + 1);
+ ASSERT (is_open (fd + 1));
+ ASSERT (is_inheritable (fd + 1));
+ ASSERT (is_mode (fd + 1, O_BINARY));
+
+ ASSERT (close (fd + 1) == 0);
+ setmode (fd, O_TEXT);
+ ASSERT (dup (fd) == fd + 1);
+ ASSERT (is_open (fd + 1));
+ ASSERT (is_inheritable (fd + 1));
+ ASSERT (is_mode (fd + 1, O_TEXT));
+
+ /* Create cloexec copy. */
+ ASSERT (close (fd + 1) == 0);
+ ASSERT (fd_safer_flag (dup_cloexec (fd), O_CLOEXEC) == fd + 1);
+ ASSERT (set_cloexec_flag (fd + 1, true) == 0);
+ ASSERT (is_open (fd + 1));
+ ASSERT (!is_inheritable (fd + 1));
+ ASSERT (close (fd) == 0);
+
+ /* dup always creates inheritable copies. Also, check that
+ earliest slot past std fds is used. */
+ ASSERT (dup (fd + 1) == fd);
+ ASSERT (is_open (fd));
+ ASSERT (is_inheritable (fd));
+ ASSERT (close (fd + 1) == 0);
+ }
+
+ /* Cleanup. */
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (witness) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-dup2.c b/gnulib/tests/test-dup2.c
new file mode 100644
index 00000000..3bad63a0
--- /dev/null
+++ b/gnulib/tests/test-dup2.c
@@ -0,0 +1,193 @@
+/* Test duplicating file descriptors.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (dup2, int, (int, int));
+
+#include <errno.h>
+#include <fcntl.h>
+
+#include "binary-io.h"
+
+#if GNULIB_CLOEXEC
+# include "cloexec.h"
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "macros.h"
+
+/* Return non-zero if FD is open. */
+static int
+is_open (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
+#else
+# ifndef F_GETFL
+# error Please port fcntl to your platform
+# endif
+ return 0 <= fcntl (fd, F_GETFL);
+#endif
+}
+
+#if GNULIB_CLOEXEC
+/* Return non-zero if FD is open and inheritable across exec/spawn. */
+static int
+is_inheritable (int fd)
+{
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ if (h == INVALID_HANDLE_VALUE || GetHandleInformation (h, &flags) == 0)
+ return 0;
+ return (flags & HANDLE_FLAG_INHERIT) != 0;
+# else
+# ifndef F_GETFD
+# error Please port fcntl to your platform
+# endif
+ int i = fcntl (fd, F_GETFD);
+ return 0 <= i && (i & FD_CLOEXEC) == 0;
+# endif
+}
+#endif /* GNULIB_CLOEXEC */
+
+#if !O_BINARY
+# define setmode(f,m) zero ()
+static int zero (void) { return 0; }
+#endif
+
+/* Return non-zero if FD is open in the given MODE, which is either
+ O_TEXT or O_BINARY. */
+static int
+is_mode (int fd, int mode)
+{
+ int value = setmode (fd, O_BINARY);
+ setmode (fd, value);
+ return mode == value;
+}
+
+int
+main (void)
+{
+ const char *file = "test-dup2.tmp";
+ char buffer[1];
+ int fd = open (file, O_CREAT | O_TRUNC | O_RDWR, 0600);
+
+ /* Assume std descriptors were provided by invoker. */
+ ASSERT (STDERR_FILENO < fd);
+ ASSERT (is_open (fd));
+ /* Ignore any other fd's leaked into this process. */
+ close (fd + 1);
+ close (fd + 2);
+ ASSERT (!is_open (fd + 1));
+ ASSERT (!is_open (fd + 2));
+
+ /* Assigning to self must be a no-op. */
+ ASSERT (dup2 (fd, fd) == fd);
+ ASSERT (is_open (fd));
+
+ /* The source must be valid. */
+ errno = 0;
+ ASSERT (dup2 (-1, fd) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (dup2 (AT_FDCWD, fd) == -1);
+ ASSERT (errno == EBADF);
+ ASSERT (is_open (fd));
+
+ /* If the source is not open, then the destination is unaffected. */
+ errno = 0;
+ ASSERT (dup2 (fd + 1, fd + 1) == -1);
+ ASSERT (errno == EBADF);
+ ASSERT (!is_open (fd + 1));
+ errno = 0;
+ ASSERT (dup2 (fd + 1, fd) == -1);
+ ASSERT (errno == EBADF);
+ ASSERT (is_open (fd));
+
+ /* The destination must be valid. */
+ errno = 0;
+ ASSERT (dup2 (fd, -2) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (dup2 (fd, 10000000) == -1);
+ ASSERT (errno == EBADF);
+
+ /* Using dup2 can skip fds. */
+ ASSERT (dup2 (fd, fd + 2) == fd + 2);
+ ASSERT (is_open (fd));
+ ASSERT (!is_open (fd + 1));
+ ASSERT (is_open (fd + 2));
+
+ /* Verify that dup2 closes the previous occupant of a fd. */
+ ASSERT (open ("/dev/null", O_WRONLY, 0600) == fd + 1);
+ ASSERT (dup2 (fd + 1, fd) == fd);
+ ASSERT (close (fd + 1) == 0);
+ ASSERT (write (fd, "1", 1) == 1);
+ ASSERT (dup2 (fd + 2, fd) == fd);
+ ASSERT (lseek (fd, 0, SEEK_END) == 0);
+ ASSERT (write (fd + 2, "2", 1) == 1);
+ ASSERT (lseek (fd, 0, SEEK_SET) == 0);
+ ASSERT (read (fd, buffer, 1) == 1);
+ ASSERT (*buffer == '2');
+
+#if GNULIB_CLOEXEC
+ /* Any new fd created by dup2 must not be cloexec. */
+ ASSERT (close (fd + 2) == 0);
+ ASSERT (dup_cloexec (fd) == fd + 1);
+ ASSERT (!is_inheritable (fd + 1));
+ ASSERT (dup2 (fd + 1, fd + 1) == fd + 1);
+ ASSERT (!is_inheritable (fd + 1));
+ ASSERT (dup2 (fd + 1, fd + 2) == fd + 2);
+ ASSERT (is_inheritable (fd + 2));
+#endif
+
+ /* On systems that distinguish between text and binary mode, dup2
+ reuses the mode of the source. */
+ setmode (fd, O_BINARY);
+ ASSERT (is_mode (fd, O_BINARY));
+ ASSERT (dup2 (fd, fd + 1) == fd + 1);
+ ASSERT (is_mode (fd + 1, O_BINARY));
+ setmode (fd, O_TEXT);
+ ASSERT (is_mode (fd, O_TEXT));
+ ASSERT (dup2 (fd, fd + 1) == fd + 1);
+ ASSERT (is_mode (fd + 1, O_TEXT));
+
+ /* Clean up. */
+ ASSERT (close (fd + 2) == 0);
+ ASSERT (close (fd + 1) == 0);
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (file) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-dup3.c b/gnulib/tests/test-dup3.c
new file mode 100644
index 00000000..a7192341
--- /dev/null
+++ b/gnulib/tests/test-dup3.c
@@ -0,0 +1,157 @@
+/* Test duplicating file descriptors.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009,
+ and Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (dup3, int, (int, int, int));
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "binary-io.h"
+#include "macros.h"
+
+/* Return true if FD is open. */
+static bool
+is_open (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
+#else
+# ifndef F_GETFL
+# error Please port fcntl to your platform
+# endif
+ return 0 <= fcntl (fd, F_GETFL);
+#endif
+}
+
+/* Return true if FD is not inherited to child processes. */
+static bool
+is_cloexec (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ ASSERT (GetHandleInformation (h, &flags));
+ return (flags & HANDLE_FLAG_INHERIT) == 0;
+#else
+ int flags;
+ ASSERT ((flags = fcntl (fd, F_GETFD)) >= 0);
+ return (flags & FD_CLOEXEC) != 0;
+#endif
+}
+
+int
+main ()
+{
+ int use_cloexec;
+
+#if defined O_CLOEXEC
+ for (use_cloexec = 0; use_cloexec <= 1; use_cloexec++)
+#else
+ use_cloexec = 0;
+#endif
+ {
+ const char *file = "test-dup3.tmp";
+ int fd = open (file, O_CREAT | O_TRUNC | O_RDWR, 0600);
+ int o_flags;
+ char buffer[1];
+
+ o_flags = 0;
+#if defined O_CLOEXEC
+ if (use_cloexec)
+ o_flags |= O_CLOEXEC;
+#endif
+
+ /* Assume std descriptors were provided by invoker. */
+ ASSERT (STDERR_FILENO < fd);
+ ASSERT (is_open (fd));
+ /* Ignore any other fd's leaked into this process. */
+ close (fd + 1);
+ close (fd + 2);
+ ASSERT (!is_open (fd + 1));
+ ASSERT (!is_open (fd + 2));
+
+ /* Assigning to self is invalid. */
+ errno = 0;
+ ASSERT (dup3 (fd, fd, o_flags) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (is_open (fd));
+
+ /* If the source is not open, then the destination is unaffected. */
+ errno = 0;
+ ASSERT (dup3 (fd + 1, fd + 2, o_flags) == -1);
+ ASSERT (errno == EBADF);
+ ASSERT (!is_open (fd + 2));
+ errno = 0;
+ ASSERT (dup3 (fd + 1, fd, o_flags) == -1);
+ ASSERT (errno == EBADF);
+ ASSERT (is_open (fd));
+
+ /* The destination must be valid. */
+ errno = 0;
+ ASSERT (dup3 (fd, -2, o_flags) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (dup3 (fd, 10000000, o_flags) == -1);
+ ASSERT (errno == EBADF);
+
+ /* Using dup3 can skip fds. */
+ ASSERT (dup3 (fd, fd + 2, o_flags) == fd + 2);
+ ASSERT (is_open (fd));
+ ASSERT (!is_open (fd + 1));
+ ASSERT (is_open (fd + 2));
+ if (use_cloexec)
+ ASSERT (is_cloexec (fd + 2));
+ else
+ ASSERT (!is_cloexec (fd + 2));
+
+ /* Verify that dup3 closes the previous occupant of a fd. */
+ ASSERT (open ("/dev/null", O_WRONLY, 0600) == fd + 1);
+ ASSERT (dup3 (fd + 1, fd, o_flags) == fd);
+ ASSERT (close (fd + 1) == 0);
+ ASSERT (write (fd, "1", 1) == 1);
+ ASSERT (dup3 (fd + 2, fd, o_flags) == fd);
+ ASSERT (lseek (fd, 0, SEEK_END) == 0);
+ ASSERT (write (fd + 2, "2", 1) == 1);
+ ASSERT (lseek (fd, 0, SEEK_SET) == 0);
+ ASSERT (read (fd, buffer, 1) == 1);
+ ASSERT (*buffer == '2');
+
+ /* Clean up. */
+ ASSERT (close (fd + 2) == 0);
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (file) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-duplocale.c b/gnulib/tests/test-duplocale.c
new file mode 100644
index 00000000..65fa4574
--- /dev/null
+++ b/gnulib/tests/test-duplocale.c
@@ -0,0 +1,122 @@
+/* Test of duplicating a locale object.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <locale.h>
+
+#if HAVE_DUPLOCALE
+
+#include "signature.h"
+SIGNATURE_CHECK (duplocale, locale_t, (locale_t));
+
+#include <langinfo.h>
+#include <monetary.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "macros.h"
+
+struct locale_dependent_values
+{
+ char monetary[100];
+ char numeric[100];
+ char time[100];
+};
+
+static void
+get_locale_dependent_values (struct locale_dependent_values *result)
+{
+ strfmon (result->monetary, sizeof (result->monetary),
+ "%n", 123.75);
+ /* result->monetary is usually "$123.75" */
+ snprintf (result->numeric, sizeof (result->numeric),
+ "%g", 3.5);
+ /* result->numeric is usually "3,5" */
+ strcpy (result->time, nl_langinfo (MON_1));
+ /* result->time is usually "janvier" */
+}
+
+int
+main ()
+{
+ struct locale_dependent_values expected_results;
+ locale_t mixed1;
+ locale_t mixed2;
+
+ /* Set up a locale which is a mix between different system locales. */
+ setlocale (LC_ALL, "en_US.UTF-8");
+ setlocale (LC_NUMERIC, "de_DE.UTF-8");
+ setlocale (LC_TIME, "fr_FR.UTF-8");
+ get_locale_dependent_values (&expected_results);
+
+ /* Save the locale in a locale_t object. */
+ mixed1 = duplocale (LC_GLOBAL_LOCALE);
+ ASSERT (mixed1 != NULL);
+
+ /* Use a per-thread locale. */
+ uselocale (newlocale (LC_ALL_MASK, "es_ES.UTF-8", NULL));
+
+ /* Save the locale in a locale_t object again. */
+ mixed2 = duplocale (LC_GLOBAL_LOCALE);
+ ASSERT (mixed2 != NULL);
+
+ /* Set up a default locale. */
+ setlocale (LC_ALL, "C");
+ uselocale (LC_GLOBAL_LOCALE);
+ {
+ struct locale_dependent_values c_results;
+ get_locale_dependent_values (&c_results);
+ }
+
+ /* Now use the saved locale mixed1 again. */
+ setlocale (LC_ALL, "C");
+ uselocale (LC_GLOBAL_LOCALE);
+ uselocale (mixed1);
+ {
+ struct locale_dependent_values results;
+ get_locale_dependent_values (&results);
+ ASSERT (strcmp (results.monetary, expected_results.monetary) == 0);
+ ASSERT (strcmp (results.numeric, expected_results.numeric) == 0);
+ ASSERT (strcmp (results.time, expected_results.time) == 0);
+ }
+
+ /* Now use the saved locale mixed2 again. */
+ setlocale (LC_ALL, "C");
+ uselocale (LC_GLOBAL_LOCALE);
+ uselocale (mixed2);
+ {
+ struct locale_dependent_values results;
+ get_locale_dependent_values (&results);
+ ASSERT (strcmp (results.monetary, expected_results.monetary) == 0);
+ ASSERT (strcmp (results.numeric, expected_results.numeric) == 0);
+ ASSERT (strcmp (results.time, expected_results.time) == 0);
+ }
+
+ return 0;
+}
+
+#else
+
+int
+main ()
+{
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/test-echo.sh b/gnulib/tests/test-echo.sh
new file mode 100755
index 00000000..f4c62d14
--- /dev/null
+++ b/gnulib/tests/test-echo.sh
@@ -0,0 +1,166 @@
+#! /bin/sh
+
+# func_exit STATUS
+# exit with status
+func_exit ()
+{
+ (exit $1); exit $1
+}
+
+# func_fatal_error message
+# outputs to stderr a fatal error message, and terminates the program.
+func_fatal_error ()
+{
+ echo "test-echo.sh: *** $1" 1>&2
+ echo "test-echo.sh: *** Stop." 1>&2
+ func_exit 1
+}
+
+# Ensure an 'echo' command that does not interpret backslashes.
+# Test cases:
+# echo '\n' | wc -l prints 1 when OK, 2 when KO
+# echo '\t' | grep t > /dev/null has return code 0 when OK, 1 when KO
+# This problem is a weird heritage from SVR4. BSD got it right (except that
+# BSD echo interprets '-n' as an option, which is also not desirable).
+# Nowadays the problem occurs in 4 situations:
+# - in bash, when the shell option xpg_echo is set (bash >= 2.04)
+# or when it was built with --enable-usg-echo-default (bash >= 2.0)
+# or when it was built with DEFAULT_ECHO_TO_USG (bash < 2.0),
+# - in zsh, when sh-emulation is not set,
+# - in ksh (e.g. AIX /bin/sh and Solaris /usr/xpg4/bin/sh are ksh instances,
+# and HP-UX /bin/sh and IRIX /bin/sh behave similarly),
+# - in Solaris /bin/sh and OSF/1 /bin/sh.
+# We try the following workarounds:
+# - for all: respawn using $CONFIG_SHELL if that is set and works.
+# - for bash >= 2.04: unset the shell option xpg_echo.
+# - for bash >= 2.0: define echo to a function that uses the printf built-in.
+# - for bash < 2.0: define echo to a function that uses cat of a here document.
+# - for zsh: turn sh-emulation on.
+# - for ksh: alias echo to 'print -r'.
+# - for ksh: alias echo to a function that uses cat of a here document.
+# - for Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh and rely on
+# the ksh workaround.
+# - otherwise: respawn using /bin/sh and rely on the workarounds.
+# When respawning, we pass --no-reexec as first argument, so as to avoid
+# turning this script into a fork bomb in unlucky situations.
+have_echo=
+if echo '\t' | grep t > /dev/null; then
+ have_echo=yes # Lucky!
+fi
+# Try the workarounds.
+# Respawn using $CONFIG_SHELL if that is set and works.
+if test -z "$have_echo" \
+ && test "X$1" != "X--no-reexec" \
+ && test -n "$CONFIG_SHELL" \
+ && test -f "$CONFIG_SHELL" \
+ && $CONFIG_SHELL -c 'echo '\t' | grep t > /dev/null'; then
+ exec $CONFIG_SHELL "$0" --no-reexec "$@"
+ exit 127
+fi
+# For bash >= 2.04: unset the shell option xpg_echo.
+if test -z "$have_echo" \
+ && test -n "$BASH_VERSION" \
+ && (shopt -o xpg_echo; echo '\t' | grep t > /dev/null) 2>/dev/null; then
+ shopt -o xpg_echo
+ have_echo=yes
+fi
+# For bash >= 2.0: define echo to a function that uses the printf built-in.
+# For bash < 2.0: define echo to a function that uses cat of a here document.
+# (There is no win in using 'printf' over 'cat' if it is not a shell built-in.)
+if test -z "$have_echo" \
+ && test -n "$BASH_VERSION"; then \
+ if type printf 2>/dev/null | grep / > /dev/null; then
+ # 'printf' is not a shell built-in.
+echo ()
+{
+cat <<EOF
+$*
+EOF
+}
+ else
+ # 'printf' is a shell built-in.
+echo ()
+{
+ printf '%s\n' "$*"
+}
+ fi
+ if echo '\t' | grep t > /dev/null; then
+ have_echo=yes
+ fi
+fi
+# For zsh: turn sh-emulation on.
+if test -z "$have_echo" \
+ && test -n "$ZSH_VERSION" \
+ && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+fi
+# For ksh: alias echo to 'print -r'.
+if test -z "$have_echo" \
+ && (type print) >/dev/null 2>&1; then
+ # A 'print' command exists.
+ if type print 2>/dev/null | grep / > /dev/null; then
+ :
+ else
+ # 'print' is a shell built-in.
+ if (print -r '\told' | grep told > /dev/null) 2>/dev/null; then
+ # 'print' is the ksh shell built-in.
+ alias echo='print -r'
+ fi
+ fi
+fi
+if test -z "$have_echo" \
+ && echo '\t' | grep t > /dev/null; then
+ have_echo=yes
+fi
+# For ksh: alias echo to a function that uses cat of a here document.
+# The ksh manual page says:
+# "Aliasing is performed when scripts are read, not while they are executed.
+# Therefore, for an alias to take effect, the alias definition command has
+# to be executed before the command which references the alias is read."
+# Because of this, we have to play strange tricks with have_echo, to ensure
+# that the top-level statement containing the test starts after the 'alias'
+# command.
+if test -z "$have_echo"; then
+bsd_echo ()
+{
+cat <<EOF
+$*
+EOF
+}
+alias echo=bsd_echo 2>/dev/null
+fi
+if test -z "$have_echo" \
+ && echo '\t' | grep t > /dev/null; then
+ have_echo=yes
+fi
+if test -z "$have_echo"; then
+ unalias echo 2>/dev/null
+fi
+# For Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh.
+if test -z "$have_echo" \
+ && test "X$1" != "X--no-reexec" \
+ && test -f /bin/ksh; then
+ exec /bin/ksh "$0" --no-reexec "$@"
+ exit 127
+fi
+# Otherwise: respawn using /bin/sh.
+if test -z "$have_echo" \
+ && test "X$1" != "X--no-reexec" \
+ && test -f /bin/sh; then
+ exec /bin/sh "$0" --no-reexec "$@"
+ exit 127
+fi
+if test -z "$have_echo"; then
+ func_fatal_error "Shell does not support 'echo' correctly. Please install GNU bash and set the environment variable CONFIG_SHELL to point to it."
+fi
+if echo '\t' | grep t > /dev/null; then
+ : # Works fine now.
+else
+ func_fatal_error "Shell does not support 'echo' correctly. Workaround does not work. Please report this as a bug to bug-gnulib@gnu.org."
+fi
+if test "X$1" = "X--no-reexec"; then
+ shift
+fi
+
+# This command determines the exit code.
+echo '\t' | grep t > /dev/null
diff --git a/gnulib/tests/test-environ.c b/gnulib/tests/test-environ.c
new file mode 100644
index 00000000..534c4e60
--- /dev/null
+++ b/gnulib/tests/test-environ.c
@@ -0,0 +1,44 @@
+/* Test of environ variable.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <string.h>
+
+int
+main ()
+{
+ /* The environment variables that are set even in the weirdest situations
+ are HOME and PATH.
+ POSIX says that HOME is initialized by the system, and that PATH may be
+ unset. But in practice it's more frequent to see HOME unset and PATH
+ set. So we test the presence of PATH. */
+ char **remaining_variables = environ;
+ char *string;
+
+ for (; (string = *remaining_variables) != NULL; remaining_variables++)
+ {
+ if (strncmp (string, "PATH=", 5) == 0)
+ /* Found the PATH environment variable. */
+ return 0;
+ }
+ /* Failed to find the PATH environment variable. */
+ return 1;
+}
diff --git a/gnulib/tests/test-erf.c b/gnulib/tests/test-erf.c
new file mode 100644
index 00000000..d23f12ed
--- /dev/null
+++ b/gnulib/tests/test-erf.c
@@ -0,0 +1,40 @@
+/* Test of erf() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (erf, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = erf (x);
+ ASSERT (y >= 0.6038560908 && y <= 0.6038560909);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-erfc.c b/gnulib/tests/test-erfc.c
new file mode 100644
index 00000000..8f950cf5
--- /dev/null
+++ b/gnulib/tests/test-erfc.c
@@ -0,0 +1,40 @@
+/* Test of erfc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (erfc, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = erfc (x);
+ ASSERT (y >= 0.3961439091 && y <= 0.3961439092);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-errno.c b/gnulib/tests/test-errno.c
new file mode 100644
index 00000000..129b236f
--- /dev/null
+++ b/gnulib/tests/test-errno.c
@@ -0,0 +1,117 @@
+/* Test of <errno.h> substitute.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <errno.h>
+
+/* Verify that the POSIX mandated errno values exist and can be used as
+ initializers outside of a function.
+ The variable names happen to match the Linux/x86 error numbers. */
+int e1 = EPERM;
+int e2 = ENOENT;
+int e3 = ESRCH;
+int e4 = EINTR;
+int e5 = EIO;
+int e6 = ENXIO;
+int e7 = E2BIG;
+int e8 = ENOEXEC;
+int e9 = EBADF;
+int e10 = ECHILD;
+int e11 = EAGAIN;
+int e11a = EWOULDBLOCK;
+int e12 = ENOMEM;
+int e13 = EACCES;
+int e14 = EFAULT;
+int e16 = EBUSY;
+int e17 = EEXIST;
+int e18 = EXDEV;
+int e19 = ENODEV;
+int e20 = ENOTDIR;
+int e21 = EISDIR;
+int e22 = EINVAL;
+int e23 = ENFILE;
+int e24 = EMFILE;
+int e25 = ENOTTY;
+int e26 = ETXTBSY;
+int e27 = EFBIG;
+int e28 = ENOSPC;
+int e29 = ESPIPE;
+int e30 = EROFS;
+int e31 = EMLINK;
+int e32 = EPIPE;
+int e33 = EDOM;
+int e34 = ERANGE;
+int e35 = EDEADLK;
+int e36 = ENAMETOOLONG;
+int e37 = ENOLCK;
+int e38 = ENOSYS;
+int e39 = ENOTEMPTY;
+int e40 = ELOOP;
+int e42 = ENOMSG;
+int e43 = EIDRM;
+int e67 = ENOLINK;
+int e71 = EPROTO;
+int e72 = EMULTIHOP;
+int e74 = EBADMSG;
+int e75 = EOVERFLOW;
+int e84 = EILSEQ;
+int e88 = ENOTSOCK;
+int e89 = EDESTADDRREQ;
+int e90 = EMSGSIZE;
+int e91 = EPROTOTYPE;
+int e92 = ENOPROTOOPT;
+int e93 = EPROTONOSUPPORT;
+int e95 = EOPNOTSUPP;
+int e95a = ENOTSUP;
+int e97 = EAFNOSUPPORT;
+int e98 = EADDRINUSE;
+int e99 = EADDRNOTAVAIL;
+int e100 = ENETDOWN;
+int e101 = ENETUNREACH;
+int e102 = ENETRESET;
+int e103 = ECONNABORTED;
+int e104 = ECONNRESET;
+int e105 = ENOBUFS;
+int e106 = EISCONN;
+int e107 = ENOTCONN;
+int e110 = ETIMEDOUT;
+int e111 = ECONNREFUSED;
+int e113 = EHOSTUNREACH;
+int e114 = EALREADY;
+int e115 = EINPROGRESS;
+int e116 = ESTALE;
+int e122 = EDQUOT;
+int e125 = ECANCELED;
+
+/* Don't verify that these errno values are all different, except for possibly
+ EWOULDBLOCK == EAGAIN. Even Linux/x86 does not pass this check: it has
+ ENOTSUP == EOPNOTSUPP. */
+
+int
+main ()
+{
+ /* Verify that errno can be assigned. */
+ errno = EOVERFLOW;
+
+ /* snprintf() callers want to distinguish EINVAL and EOVERFLOW. */
+ if (errno == EINVAL)
+ return 1;
+
+ return 0;
+}
diff --git a/gnulib/tests/test-exclude.c b/gnulib/tests/test-exclude.c
new file mode 100644
index 00000000..bffc62d2
--- /dev/null
+++ b/gnulib/tests/test-exclude.c
@@ -0,0 +1,117 @@
+/* Test suite for exclude.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNUlib Library.
+
+ 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/>. */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <stdbool.h>
+#include <fnmatch.h>
+
+#include "exclude.h"
+#include "progname.h"
+#include "error.h"
+#include "argmatch.h"
+
+#ifndef FNM_CASEFOLD
+# define FNM_CASEFOLD 0
+#endif
+#ifndef FNM_LEADING_DIR
+# define FNM_LEADING_DIR 0
+#endif
+
+char const * const exclude_keywords[] = {
+ "noescape",
+ "pathname",
+ "period",
+ "leading_dir",
+ "casefold",
+ "anchored",
+ "include",
+ "wildcards",
+ NULL
+};
+
+int exclude_flags[] = {
+ FNM_NOESCAPE,
+ FNM_PATHNAME,
+ FNM_PERIOD,
+ FNM_LEADING_DIR,
+ FNM_CASEFOLD,
+ EXCLUDE_ANCHORED,
+ EXCLUDE_INCLUDE,
+ EXCLUDE_WILDCARDS
+};
+
+ARGMATCH_VERIFY (exclude_keywords, exclude_flags);
+
+/* Some packages define ARGMATCH_DIE and ARGMATCH_DIE_DECL in <config.h>, and
+ thus must link with a definition of that function. Provide it here. */
+#ifdef ARGMATCH_DIE_DECL
+ARGMATCH_DIE_DECL { exit (1); }
+#endif
+
+int
+main (int argc, char **argv)
+{
+ int exclude_options = 0;
+ struct exclude *exclude = new_exclude ();
+
+ set_program_name (argv[0]);
+
+ if (argc == 1)
+ error (1, 0, "usage: %s file -- words...", argv[0]);
+
+ while (--argc)
+ {
+ char *opt = *++argv;
+ if (opt[0] == '-')
+ {
+ int neg = 0;
+ int flag;
+ char *s = opt + 1;
+
+ if (opt[1] == '-' && opt[2] == 0)
+ {
+ argc--;
+ break;
+ }
+ if (strlen (s) > 3 && memcmp (s, "no-", 3) == 0)
+ {
+ neg = 1;
+ s += 3;
+ }
+ flag = XARGMATCH (opt, s, exclude_keywords, exclude_flags);
+ if (neg)
+ exclude_options &= ~flag;
+ else
+ exclude_options |= flag;
+ }
+ else if (add_exclude_file (add_exclude, exclude, opt,
+ exclude_options, '\n') != 0)
+ error (1, errno, "error loading %s", opt);
+ }
+
+ for (; argc; --argc)
+ {
+ char *word = *++argv;
+
+ printf ("%s: %d\n", word, excluded_file_name (exclude, word));
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-exclude1.sh b/gnulib/tests/test-exclude1.sh
new file mode 100755
index 00000000..2fe72b9c
--- /dev/null
+++ b/gnulib/tests/test-exclude1.sh
@@ -0,0 +1,45 @@
+#! /bin/sh
+# Test suite for exclude.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=excltmp.$$
+LIST=flist.$$
+ERR=0
+
+# Test literal matches
+
+cat > $LIST <<EOT
+foo*
+bar
+Baz
+EOT
+
+cat > $TMP <<EOT
+foo: 0
+foo*: 1
+bar: 1
+foobar: 0
+baz: 0
+bar/qux: 0
+EOT
+
+./test-exclude$EXEEXT $LIST -- foo 'foo*' bar foobar baz bar/qux |
+ tr -d '\015' |
+ diff -c $TMP - || ERR=1
+
+rm -f $TMP $LIST
+exit $ERR
diff --git a/gnulib/tests/test-exclude2.sh b/gnulib/tests/test-exclude2.sh
new file mode 100755
index 00000000..641a1cf6
--- /dev/null
+++ b/gnulib/tests/test-exclude2.sh
@@ -0,0 +1,45 @@
+#! /bin/sh
+# Test suite for exclude.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=excltmp.$$
+LIST=flist.$$
+ERR=0
+
+cat > $LIST <<EOT
+foo*
+bar
+Baz
+EOT
+
+# Test case-insensitive literal matches
+
+cat > $TMP <<EOT
+foo: 0
+foo*: 1
+bar: 1
+foobar: 0
+baz: 1
+bar/qux: 0
+EOT
+
+./test-exclude$EXEEXT -casefold $LIST -- foo 'foo*' bar foobar baz bar/qux |
+ tr -d '\015' |
+ diff -c $TMP - || ERR=1
+
+rm -f $TMP $LIST
+exit $ERR
diff --git a/gnulib/tests/test-exclude3.sh b/gnulib/tests/test-exclude3.sh
new file mode 100755
index 00000000..216ac528
--- /dev/null
+++ b/gnulib/tests/test-exclude3.sh
@@ -0,0 +1,45 @@
+#! /bin/sh
+# Test suite for exclude.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=excltmp.$$
+LIST=flist.$$
+ERR=0
+
+# Test include
+
+cat > $LIST <<EOT
+foo*
+bar
+Baz
+EOT
+
+cat > $TMP <<EOT
+foo: 1
+foo*: 0
+bar: 0
+foobar: 1
+baz: 1
+bar/qux: 1
+EOT
+
+./test-exclude$EXEEXT -include $LIST -- foo 'foo*' bar foobar baz bar/qux |
+ tr -d '\015' |
+ diff -c $TMP - || ERR=1
+
+rm -f $TMP $LIST
+exit $ERR
diff --git a/gnulib/tests/test-exclude4.sh b/gnulib/tests/test-exclude4.sh
new file mode 100755
index 00000000..e0576146
--- /dev/null
+++ b/gnulib/tests/test-exclude4.sh
@@ -0,0 +1,40 @@
+#! /bin/sh
+# Test suite for exclude.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=excltmp.$$
+LIST=flist.$$
+ERR=0
+
+# Test wildcard matching
+
+cat > $LIST <<EOT
+foo*
+bar
+Baz
+EOT
+
+cat > $TMP <<EOT
+foobar: 1
+EOT
+
+./test-exclude$EXEEXT -wildcards $LIST -- foobar |
+ tr -d '\015' |
+ diff -c $TMP - || ERR=1
+
+rm -f $TMP $LIST
+exit $ERR
diff --git a/gnulib/tests/test-exclude5.sh b/gnulib/tests/test-exclude5.sh
new file mode 100755
index 00000000..b4698f9c
--- /dev/null
+++ b/gnulib/tests/test-exclude5.sh
@@ -0,0 +1,43 @@
+#! /bin/sh
+# Test suite for exclude.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=excltmp.$$
+LIST=flist.$$
+ERR=0
+
+# Test FNM_LEADING_DIR
+
+cat > $LIST <<EOT
+foo*
+bar
+Baz
+EOT
+
+cat > $TMP <<EOT
+bar: 1
+bar/qux: 1
+barz: 0
+foo/bar: 1
+EOT
+
+./test-exclude$EXEEXT -leading_dir $LIST -- bar bar/qux barz foo/bar |
+ tr -d '\015' |
+ diff -c $TMP - || ERR=1
+
+rm -f $TMP $LIST
+exit $ERR
diff --git a/gnulib/tests/test-exclude6.sh b/gnulib/tests/test-exclude6.sh
new file mode 100755
index 00000000..a20f83c8
--- /dev/null
+++ b/gnulib/tests/test-exclude6.sh
@@ -0,0 +1,41 @@
+#! /bin/sh
+# Test suite for exclude.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=excltmp.$$
+LIST=flist.$$
+ERR=0
+
+# Test anchored
+
+cat > $LIST <<EOT
+foo*
+bar
+Baz
+EOT
+
+cat > $TMP <<EOT
+bar: 1
+foo/bar: 0
+EOT
+
+./test-exclude$EXEEXT -anchored $LIST -- bar foo/bar |
+ tr -d '\015' |
+ diff -c $TMP - || ERR=1
+
+rm -f $TMP $LIST
+exit $ERR
diff --git a/gnulib/tests/test-exclude7.sh b/gnulib/tests/test-exclude7.sh
new file mode 100755
index 00000000..b6076da0
--- /dev/null
+++ b/gnulib/tests/test-exclude7.sh
@@ -0,0 +1,44 @@
+#! /bin/sh
+# Test suite for exclude.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=excltmp.$$
+LIST=flist.$$
+ERR=0
+
+# Test exclude precedence
+
+cat > $LIST <<EOT
+foo*
+bar
+Baz
+EOT
+
+cat > $TMP <<EOT
+bar: 1
+bar: 0
+EOT
+
+./test-exclude$EXEEXT $LIST -include $LIST -- bar |
+ tr -d '\015' >$TMP.1
+./test-exclude$EXEEXT -include $LIST -no-include $LIST -- bar |
+ tr -d '\015' >>$TMP.1
+
+diff -c $TMP $TMP.1 || ERR=1
+
+rm -f $TMP $TMP.1 $LIST
+exit $ERR
diff --git a/gnulib/tests/test-exp.c b/gnulib/tests/test-exp.c
new file mode 100644
index 00000000..8b21de70
--- /dev/null
+++ b/gnulib/tests/test-exp.c
@@ -0,0 +1,40 @@
+/* Test of exp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (exp, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = exp (x);
+ ASSERT (y >= 1.822118800 && y <= 1.822118801);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-expl.c b/gnulib/tests/test-expl.c
new file mode 100644
index 00000000..440bc0ef
--- /dev/null
+++ b/gnulib/tests/test-expl.c
@@ -0,0 +1,45 @@
+/* Test of expl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (expl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = expl (x);
+ ASSERT (y >= 1.822118800L && y <= 1.822118801L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fabs.c b/gnulib/tests/test-fabs.c
new file mode 100644
index 00000000..2594d3d7
--- /dev/null
+++ b/gnulib/tests/test-fabs.c
@@ -0,0 +1,45 @@
+/* Test of fabs() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fabs, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular positive value. */
+ x = 0.6;
+ y = fabs (x);
+ ASSERT (y == 0.6);
+
+ /* A particular negative value. */
+ x = -0.6;
+ y = fabs (x);
+ ASSERT (y == 0.6);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fbufmode.c b/gnulib/tests/test-fbufmode.c
new file mode 100644
index 00000000..da32834e
--- /dev/null
+++ b/gnulib/tests/test-fbufmode.c
@@ -0,0 +1,72 @@
+/* Test of fbufmode() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "fbufmode.h"
+
+#include <stdio.h>
+
+#include "macros.h"
+
+#define TESTFILE "t-fbufmode.tmp"
+
+int
+main ()
+{
+ FILE *fp;
+ char buf[5];
+
+ /* Create a file with some contents. */
+ fp = fopen (TESTFILE, "w");
+ if (fp == NULL)
+ goto skip;
+ if (fwrite ("foobarsh", 1, 8, fp) < 8)
+ goto skip;
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it for reading. */
+ fp = fopen (TESTFILE, "r");
+
+ if (setvbuf (fp, NULL, _IONBF, 0))
+ goto skip;
+ ASSERT (fbufmode (fp) == _IONBF);
+
+ /* This setvbuf call can fail, e.g. on HP-UX 11. */
+ if (setvbuf (fp, buf, _IOLBF, 5) == 0)
+ {
+ /* mingw's setvbuf implements _IOLBF the same way as _IOFBF. */
+ ASSERT (fbufmode (fp) == _IOLBF
+ || fbufmode (fp) == _IOFBF);
+ }
+
+ /* This setvbuf call can fail, e.g. on HP-UX 11. */
+ if (setvbuf (fp, buf, _IOFBF, 5) == 0)
+ {
+ ASSERT (fbufmode (fp) == _IOFBF);
+ }
+
+ fclose (fp);
+
+ return 0;
+
+ skip:
+ fprintf (stderr, "Skipping test: file operations failed.\n");
+ return 77;
+}
diff --git a/gnulib/tests/test-fchdir.c b/gnulib/tests/test-fchdir.c
new file mode 100644
index 00000000..fca3ccd6
--- /dev/null
+++ b/gnulib/tests/test-fchdir.c
@@ -0,0 +1,97 @@
+/* Test changing to a directory named by a file descriptor.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fchdir, int, (int));
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "cloexec.h"
+#include "macros.h"
+
+int
+main (void)
+{
+ char *cwd = getcwd (NULL, 0);
+ int fd = open (".", O_RDONLY);
+ int i;
+
+ ASSERT (cwd);
+ ASSERT (0 <= fd);
+
+ /* Check for failure cases. */
+ {
+ int bad_fd = open ("/dev/null", O_RDONLY);
+ ASSERT (0 <= bad_fd);
+ errno = 0;
+ ASSERT (fchdir (bad_fd) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (close (bad_fd) == 0);
+ errno = 0;
+ ASSERT (fchdir (-1) == -1);
+ ASSERT (errno == EBADF);
+ }
+
+ /* Repeat test twice, once in '.' and once in '..'. */
+ for (i = 0; i < 2; i++)
+ {
+ ASSERT (chdir (".." + 1 - i) == 0);
+ ASSERT (fchdir (fd) == 0);
+ {
+ size_t len = strlen (cwd) + 1;
+ char *new_dir = malloc (len);
+ ASSERT (new_dir);
+ ASSERT (getcwd (new_dir, len) == new_dir);
+ ASSERT (strcmp (cwd, new_dir) == 0);
+ free (new_dir);
+ }
+
+ /* For second iteration, use a cloned fd, to ensure that dup
+ remembers whether an fd was associated with a directory. */
+ if (!i)
+ {
+ int new_fd = dup (fd);
+ ASSERT (0 <= new_fd);
+ ASSERT (close (fd) == 0);
+ ASSERT (dup2 (new_fd, fd) == fd);
+ ASSERT (close (new_fd) == 0);
+ ASSERT (dup_cloexec (fd) == new_fd);
+ ASSERT (dup2 (new_fd, fd) == fd);
+ ASSERT (close (new_fd) == 0);
+ ASSERT (fcntl (fd, F_DUPFD_CLOEXEC, new_fd) == new_fd);
+ ASSERT (close (fd) == 0);
+ ASSERT (fcntl (new_fd, F_DUPFD, fd) == fd);
+ ASSERT (close (new_fd) == 0);
+#if GNULIB_DUP3
+ ASSERT (dup3 (fd, new_fd, 0) == new_fd);
+ ASSERT (dup3 (new_fd, fd, 0) == fd);
+ ASSERT (close (new_fd) == 0);
+#endif
+ }
+ }
+
+ free (cwd);
+ return 0;
+}
diff --git a/gnulib/tests/test-fchownat.c b/gnulib/tests/test-fchownat.c
new file mode 100644
index 00000000..0843be7c
--- /dev/null
+++ b/gnulib/tests/test-fchownat.c
@@ -0,0 +1,82 @@
+/* Tests of fchownat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fchownat, int, (int, char const *, uid_t, gid_t, int));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "mgetgroups.h"
+#include "openat.h"
+#include "stat-time.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-fchownat.t"
+
+#include "test-chown.h"
+#include "test-lchown.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper around fchownat to test chown behavior. */
+static int
+do_chown (char const *name, uid_t user, gid_t group)
+{
+ return chownat (dfd, name, user, group);
+}
+
+/* Wrapper around fchownat to test lchown behavior. */
+static int
+do_lchown (char const *name, uid_t user, gid_t group)
+{
+ return lchownat (dfd, name, user, group);
+}
+
+int
+main (void)
+{
+ int result1; /* Skip because of no chown/symlink support. */
+ int result2; /* Skip because of no lchown support. */
+
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Basic tests. */
+ result1 = test_chown (do_chown, true);
+ result2 = test_lchown (do_lchown, result1 == 0);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_chown (do_chown, false) == result1);
+ ASSERT (test_lchown (do_lchown, false) == result2);
+ /* We expect 0/0, 0/77, or 77/77, but not 77/0. */
+ ASSERT (result1 <= result2);
+ ASSERT (close (dfd) == 0);
+
+ /* FIXME - add additional tests of dfd not at current directory. */
+ return result1 | result2;
+}
diff --git a/gnulib/tests/test-fcntl-h.c b/gnulib/tests/test-fcntl-h.c
new file mode 100644
index 00000000..0ce33f0d
--- /dev/null
+++ b/gnulib/tests/test-fcntl-h.c
@@ -0,0 +1,38 @@
+/* Test of <fcntl.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <fcntl.h>
+
+/* Check that the various O_* macros are defined. */
+int o = O_DIRECT | O_DIRECTORY | O_DSYNC | O_NDELAY | O_NOATIME | O_NONBLOCK
+ | O_NOCTTY | O_NOFOLLOW | O_NOLINKS | O_RSYNC | O_SYNC | O_TTY_INIT
+ | O_BINARY | O_TEXT;
+
+/* Check that the various SEEK_* macros are defined. */
+int sk[] = { SEEK_CUR, SEEK_END, SEEK_SET };
+
+/* Check that the FD_* macros are defined. */
+int fd = FD_CLOEXEC;
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-fcntl-safer.c b/gnulib/tests/test-fcntl-safer.c
new file mode 100644
index 00000000..97d8ba2a
--- /dev/null
+++ b/gnulib/tests/test-fcntl-safer.c
@@ -0,0 +1,38 @@
+/* Test of opening a file descriptor.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "fcntl--.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+#define BASE "test-fcntl-safer.t"
+
+#include "test-open.h"
+
+int
+main (void)
+{
+ return test_open (open, true);
+}
diff --git a/gnulib/tests/test-fcntl.c b/gnulib/tests/test-fcntl.c
new file mode 100644
index 00000000..71dfb986
--- /dev/null
+++ b/gnulib/tests/test-fcntl.c
@@ -0,0 +1,346 @@
+/* Test of fcntl(2).
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+/* Specification. */
+#include <fcntl.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fcntl, int, (int, int, ...));
+
+/* Helpers. */
+#include <errno.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "binary-io.h"
+#include "macros.h"
+
+/* Use O_CLOEXEC if available, but test works without it. */
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+#if !O_BINARY
+# define setmode(f,m) zero ()
+static int zero (void) { return 0; }
+#endif
+
+/* Return true if FD is open. */
+static bool
+is_open (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
+#else
+# ifndef F_GETFL
+# error Please port fcntl to your platform
+# endif
+ return 0 <= fcntl (fd, F_GETFL);
+#endif
+}
+
+/* Return true if FD is open and inheritable across exec/spawn. */
+static bool
+is_inheritable (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ if (h == INVALID_HANDLE_VALUE || GetHandleInformation (h, &flags) == 0)
+ return false;
+ return (flags & HANDLE_FLAG_INHERIT) != 0;
+#else
+# ifndef F_GETFD
+# error Please port fcntl to your platform
+# endif
+ int i = fcntl (fd, F_GETFD);
+ return 0 <= i && (i & FD_CLOEXEC) == 0;
+#endif
+}
+
+/* Return non-zero if FD is open in the given MODE, which is either
+ O_TEXT or O_BINARY. */
+static bool
+is_mode (int fd, int mode)
+{
+ int value = setmode (fd, O_BINARY);
+ setmode (fd, value);
+ return mode == value;
+}
+
+/* Since native fcntl can have more supported operations than our
+ replacement is aware of, and since various operations assign
+ different types to the vararg argument, a wrapper around fcntl must
+ be able to pass a vararg of unknown type on through to the original
+ fcntl. Make sure that this works properly: func1 behaves like the
+ original fcntl interpreting the vararg as an int or a pointer to a
+ struct, and func2 behaves like rpl_fcntl that doesn't know what
+ type to forward. */
+struct dummy_struct
+{
+ long filler;
+ int value;
+};
+static int
+func1 (int a, ...)
+{
+ va_list arg;
+ int i;
+ va_start (arg, a);
+ if (a < 4)
+ i = va_arg (arg, int);
+ else
+ {
+ struct dummy_struct *s = va_arg (arg, struct dummy_struct *);
+ i = s->value;
+ }
+ va_end (arg);
+ return i;
+}
+static int
+func2 (int a, ...)
+{
+ va_list arg;
+ void *p;
+ va_start (arg, a);
+ p = va_arg (arg, void *);
+ va_end (arg);
+ return func1 (a, p);
+}
+
+/* Ensure that all supported fcntl actions are distinct, and
+ usable in preprocessor expressions. */
+static void
+check_flags (void)
+{
+ switch (0)
+ {
+ case F_DUPFD:
+#if F_DUPFD
+#endif
+
+ case F_DUPFD_CLOEXEC:
+#if F_DUPFD_CLOEXEC
+#endif
+
+ case F_GETFD:
+#if F_GETFD
+#endif
+
+#ifdef F_SETFD
+ case F_SETFD:
+# if F_SETFD
+# endif
+#endif
+
+#ifdef F_GETFL
+ case F_GETFL:
+# if F_GETFL
+# endif
+#endif
+
+#ifdef F_SETFL
+ case F_SETFL:
+# if F_SETFL
+# endif
+#endif
+
+#ifdef F_GETOWN
+ case F_GETOWN:
+# if F_GETOWN
+# endif
+#endif
+
+#ifdef F_SETOWN
+ case F_SETOWN:
+# if F_SETOWN
+# endif
+#endif
+
+#ifdef F_GETLK
+ case F_GETLK:
+# if F_GETLK
+# endif
+#endif
+
+#ifdef F_SETLK
+ case F_SETLK:
+# if F_SETLK
+# endif
+#endif
+
+#ifdef F_SETLKW
+ case F_SETLKW:
+# if F_SETLKW
+# endif
+#endif
+
+ ;
+ }
+}
+
+int
+main (void)
+{
+ const char *file = "test-fcntl.tmp";
+ int fd;
+
+ /* Sanity check that rpl_fcntl is likely to work. */
+ ASSERT (func2 (1, 2) == 2);
+ ASSERT (func2 (2, -2) == -2);
+ ASSERT (func2 (3, 0x80000000) == 0x80000000);
+ {
+ struct dummy_struct s = { 0L, 4 };
+ ASSERT (func2 (4, &s) == 4);
+ }
+ check_flags ();
+
+ /* Assume std descriptors were provided by invoker, and ignore fds
+ that might have been inherited. */
+ fd = creat (file, 0600);
+ ASSERT (STDERR_FILENO < fd);
+ close (fd + 1);
+ close (fd + 2);
+
+ /* For F_DUPFD*, the source must be valid. */
+ errno = 0;
+ ASSERT (fcntl (-1, F_DUPFD, 0) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (fcntl (fd + 1, F_DUPFD, 0) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (fcntl (10000000, F_DUPFD, 0) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (fcntl (-1, F_DUPFD_CLOEXEC, 0) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (fcntl (fd + 1, F_DUPFD_CLOEXEC, 0) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (fcntl (10000000, F_DUPFD_CLOEXEC, 0) == -1);
+ ASSERT (errno == EBADF);
+
+ /* For F_DUPFD*, the destination must be valid. */
+ ASSERT (getdtablesize () < 10000000);
+ errno = 0;
+ ASSERT (fcntl (fd, F_DUPFD, -1) == -1);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ ASSERT (fcntl (fd, F_DUPFD, 10000000) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (getdtablesize () < 10000000);
+ errno = 0;
+ ASSERT (fcntl (fd, F_DUPFD_CLOEXEC, -1) == -1);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ ASSERT (fcntl (fd, F_DUPFD_CLOEXEC, 10000000) == -1);
+ ASSERT (errno == EINVAL);
+
+ /* For F_DUPFD*, check for correct inheritance, as well as
+ preservation of text vs. binary. */
+ setmode (fd, O_BINARY);
+ ASSERT (is_open (fd));
+ ASSERT (!is_open (fd + 1));
+ ASSERT (!is_open (fd + 2));
+ ASSERT (is_inheritable (fd));
+ ASSERT (is_mode (fd, O_BINARY));
+
+ ASSERT (fcntl (fd, F_DUPFD, fd) == fd + 1);
+ ASSERT (is_open (fd));
+ ASSERT (is_open (fd + 1));
+ ASSERT (!is_open (fd + 2));
+ ASSERT (is_inheritable (fd + 1));
+ ASSERT (is_mode (fd, O_BINARY));
+ ASSERT (is_mode (fd + 1, O_BINARY));
+ ASSERT (close (fd + 1) == 0);
+
+ ASSERT (fcntl (fd, F_DUPFD_CLOEXEC, fd + 2) == fd + 2);
+ ASSERT (is_open (fd));
+ ASSERT (!is_open (fd + 1));
+ ASSERT (is_open (fd + 2));
+ ASSERT (is_inheritable (fd));
+ ASSERT (!is_inheritable (fd + 2));
+ ASSERT (is_mode (fd, O_BINARY));
+ ASSERT (is_mode (fd + 2, O_BINARY));
+ ASSERT (close (fd) == 0);
+
+ setmode (fd + 2, O_TEXT);
+ ASSERT (fcntl (fd + 2, F_DUPFD, fd + 1) == fd + 1);
+ ASSERT (!is_open (fd));
+ ASSERT (is_open (fd + 1));
+ ASSERT (is_open (fd + 2));
+ ASSERT (is_inheritable (fd + 1));
+ ASSERT (!is_inheritable (fd + 2));
+ ASSERT (is_mode (fd + 1, O_TEXT));
+ ASSERT (is_mode (fd + 2, O_TEXT));
+ ASSERT (close (fd + 1) == 0);
+
+ ASSERT (fcntl (fd + 2, F_DUPFD_CLOEXEC, 0) == fd);
+ ASSERT (is_open (fd));
+ ASSERT (!is_open (fd + 1));
+ ASSERT (is_open (fd + 2));
+ ASSERT (!is_inheritable (fd));
+ ASSERT (!is_inheritable (fd + 2));
+ ASSERT (is_mode (fd, O_TEXT));
+ ASSERT (is_mode (fd + 2, O_TEXT));
+ ASSERT (close (fd + 2) == 0);
+
+ /* Test F_GETFD. */
+ errno = 0;
+ ASSERT (fcntl (-1, F_GETFD) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (fcntl (fd + 1, F_GETFD) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (fcntl (10000000, F_GETFD) == -1);
+ ASSERT (errno == EBADF);
+ {
+ int result = fcntl (fd, F_GETFD);
+ ASSERT (0 <= result);
+ ASSERT ((result & FD_CLOEXEC) == FD_CLOEXEC);
+ ASSERT (dup (fd) == fd + 1);
+ result = fcntl (fd + 1, F_GETFD);
+ ASSERT (0 <= result);
+ ASSERT ((result & FD_CLOEXEC) == 0);
+ ASSERT (close (fd + 1) == 0);
+ }
+
+ /* Cleanup. */
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (file) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fdopendir.c b/gnulib/tests/test-fdopendir.c
new file mode 100644
index 00000000..ccbdb7ea
--- /dev/null
+++ b/gnulib/tests/test-fdopendir.c
@@ -0,0 +1,68 @@
+/* Test opening a directory stream from a file descriptor.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fdopendir, DIR *, (int));
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ DIR *d;
+ int fd;
+
+ /* A non-directory cannot be turned into a directory stream. */
+ fd = open ("test-fdopendir.tmp", O_RDONLY | O_CREAT, 0600);
+ ASSERT (0 <= fd);
+ errno = 0;
+ ASSERT (fdopendir (fd) == NULL);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink ("test-fdopendir.tmp") == 0);
+
+ /* A bad fd cannot be turned into a stream. */
+ errno = 0;
+ ASSERT (fdopendir (-1) == NULL);
+ ASSERT (errno == EBADF);
+
+ /* This should work. */
+ fd = open (".", O_RDONLY);
+ ASSERT (0 <= fd);
+ d = fdopendir (fd);
+ /* We know that fd is now out of our reach, but it is not specified
+ whether it is closed now or at the closedir. We also can't
+ guarantee whether dirfd returns fd, some other descriptor, or
+ -1. */
+ ASSERT (d);
+ ASSERT (closedir (d) == 0);
+ /* Now we can guarantee that fd must be closed. */
+ errno = 0;
+ ASSERT (dup2 (fd, fd) == -1);
+ ASSERT (errno == EBADF);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fdutimensat.c b/gnulib/tests/test-fdutimensat.c
new file mode 100644
index 00000000..949ca47a
--- /dev/null
+++ b/gnulib/tests/test-fdutimensat.c
@@ -0,0 +1,133 @@
+/* Tests of fdutimensat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "utimens.h"
+
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-fdutimensat.t"
+
+#include "test-futimens.h"
+#include "test-lutimens.h"
+#include "test-utimens.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrap fdutimensat to behave like futimens. */
+static int
+do_futimens (int fd, struct timespec const times[2])
+{
+ return fdutimensat (dfd, NULL, fd, times);
+}
+
+/* Test the use of file descriptors alongside a name. */
+static int
+do_fdutimens (char const *name, struct timespec const times[2])
+{
+ int result;
+ int fd = openat (dfd, name, O_WRONLY);
+ if (fd < 0)
+ fd = openat (dfd, name, O_RDONLY);
+ errno = 0;
+ result = fdutimensat (dfd, name, fd, times);
+ if (0 <= fd)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ }
+ return result;
+}
+
+/* Wrap lutimensat to behave like lutimens. */
+static int
+do_lutimens (const char *name, struct timespec const times[2])
+{
+ return lutimensat (dfd, name, times);
+}
+
+/* Wrap fdutimensat to behave like utimens. */
+static int
+do_utimens (const char *name, struct timespec const times[2])
+{
+ return fdutimensat (dfd, name, -1, times);
+}
+
+int
+main (void)
+{
+ int result1; /* Skip because of no symlink support. */
+ int result2; /* Skip because of no futimens support. */
+ int result3; /* Skip because of no lutimens support. */
+ int fd;
+
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Basic tests. */
+ result1 = test_utimens (do_utimens, true);
+ ASSERT (test_utimens (do_fdutimens, false) == result1);
+ result2 = test_futimens (do_futimens, result1 == 0);
+ result3 = test_lutimens (do_lutimens, (result1 + result2) == 0);
+ /* We expect 0/0, 0/77, or 77/77, but not 77/0. */
+ ASSERT (result1 <= result3);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_utimens (do_utimens, false) == result1);
+ ASSERT (test_utimens (do_fdutimens, false) == result1);
+ ASSERT (test_futimens (do_futimens, false) == result2);
+ ASSERT (test_lutimens (do_lutimens, false) == result3);
+
+ /* Directory relative tests. */
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (chdir (BASE "dir") == 0);
+ fd = creat ("file", 0600);
+ ASSERT (0 <= fd);
+ errno = 0;
+ ASSERT (fdutimensat (fd, ".", AT_FDCWD, NULL) == -1);
+ ASSERT (errno == ENOTDIR);
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, 0 } };
+ struct stat st;
+ ASSERT (fdutimensat (dfd, BASE "dir/file", fd, ts) == 0);
+ ASSERT (stat ("file", &st) == 0);
+ ASSERT (st.st_atime == Y2K);
+ ASSERT (get_stat_atime_ns (&st) == 0);
+ ASSERT (st.st_mtime == Y2K);
+ ASSERT (get_stat_mtime_ns (&st) == 0);
+ }
+ ASSERT (close (fd) == 0);
+ ASSERT (close (dfd) == 0);
+ errno = 0;
+ ASSERT (fdutimensat (dfd, ".", -1, NULL) == -1);
+ ASSERT (errno == EBADF);
+
+ /* Cleanup. */
+ ASSERT (chdir ("..") == 0);
+ ASSERT (unlink (BASE "dir/file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ return result1 | result2 | result3;
+}
diff --git a/gnulib/tests/test-fflush.c b/gnulib/tests/test-fflush.c
new file mode 100644
index 00000000..12403e2a
--- /dev/null
+++ b/gnulib/tests/test-fflush.c
@@ -0,0 +1,145 @@
+/* Test of POSIX compatible fflush() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Eric Blake, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ ftell link warning if we are not using the gnulib ftell module. */
+#define _GL_NO_LARGE_FILES
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fflush, int, (FILE *));
+
+#include <unistd.h>
+
+int
+main (void)
+{
+ FILE *f;
+ char buffer[10];
+ int fd;
+
+ /* Create test file. */
+ f = fopen ("test-fflush.txt", "w");
+ if (!f || fwrite ("1234567890ABCDEFG", 1, 17, f) != 17 || fclose (f) != 0)
+ {
+ fputs ("Failed to create sample file.\n", stderr);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+
+ /* Test fflush. */
+ f = fopen ("test-fflush.txt", "r");
+ fd = fileno (f);
+ if (!f || 0 > fd || fread (buffer, 1, 5, f) != 5)
+ {
+ fputs ("Failed initial read of sample file.\n", stderr);
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ /* For deterministic results, ensure f read a bigger buffer.
+ This is not the case on BeOS, nor on uClibc. */
+#if !(defined __BEOS__ || defined __UCLIBC__)
+ if (lseek (fd, 0, SEEK_CUR) == 5)
+ {
+ fputs ("Sample file was not buffered after fread.\n", stderr);
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+#endif
+ /* POSIX requires fflush-fseek to set file offset of fd. */
+ if (fflush (f) != 0 || fseeko (f, 0, SEEK_CUR) != 0)
+ {
+ fputs ("Failed to flush-fseek sample file.\n", stderr);
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ /* Check that offset is correct. */
+ if (lseek (fd, 0, SEEK_CUR) != 5)
+ {
+ fprintf (stderr, "File offset is wrong after fseek: %ld.\n",
+ (long) lseek (fd, 0, SEEK_CUR));
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ if (ftell (f) != 5)
+ {
+ fprintf (stderr, "ftell result is wrong after fseek: %ld.\n",
+ (long) ftell (f));
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ /* Check that file reading resumes at correct location. */
+ if (fgetc (f) != '6')
+ {
+ fputs ("Failed to read next byte after fseek.\n", stderr);
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ /* For deterministic results, ensure f read a bigger buffer. */
+ if (lseek (fd, 0, SEEK_CUR) == 6)
+ {
+ fputs ("Sample file was not buffered after fgetc.\n", stderr);
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ /* POSIX requires fflush-fseeko to set file offset of fd. */
+ if (fflush (f) != 0 || fseeko (f, 0, SEEK_CUR) != 0)
+ {
+ fputs ("Failed to flush-fseeko sample file.\n", stderr);
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ /* Check that offset is correct. */
+ if (lseek (fd, 0, SEEK_CUR) != 6)
+ {
+ fprintf (stderr, "File offset is wrong after fseeko: %ld.\n",
+ (long) lseek (fd, 0, SEEK_CUR));
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ if (ftell (f) != 6)
+ {
+ fprintf (stderr, "ftell result is wrong after fseeko: %ld.\n",
+ (long) ftell (f));
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ /* Check that file reading resumes at correct location. */
+ if (fgetc (f) != '7')
+ {
+ fputs ("Failed to read next byte after fseeko.\n", stderr);
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 1;
+ }
+ fclose (f);
+ unlink ("test-fflush.txt");
+ return 0;
+}
diff --git a/gnulib/tests/test-fflush2.c b/gnulib/tests/test-fflush2.c
new file mode 100644
index 00000000..c89dc912
--- /dev/null
+++ b/gnulib/tests/test-fflush2.c
@@ -0,0 +1,108 @@
+/* Test of POSIX compatible fflush() function.
+ Copyright (C) 2008-2010 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "binary-io.h"
+#include "macros.h"
+
+int
+main (int argc, char **argv)
+{
+ int c;
+
+ /* Avoid the well-known bugs of fflush() on streams in O_TEXT mode
+ on native Windows platforms. */
+ SET_BINARY (0);
+
+ if (argc > 1)
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Check fflush after a backup ungetc() call. This is case 1a in
+ terms of
+ <http://lists.gnu.org/archive/html/bug-gnulib/2008-03/msg00131.html>,
+ according to the Austin Group's resolution on 2009-01-08. */
+
+ c = fgetc (stdin);
+ ASSERT (c == '#');
+
+ c = fgetc (stdin);
+ ASSERT (c == '!');
+
+ /* Here the file-position indicator must be 2. */
+
+ c = ungetc ('!', stdin);
+ ASSERT (c == '!');
+
+ fflush (stdin);
+
+ /* Here the file-position indicator must be 1. */
+
+ c = fgetc (stdin);
+ ASSERT (c == '!');
+
+ c = fgetc (stdin);
+ ASSERT (c == '/');
+
+ return 0;
+
+ case '2':
+ /* Check fflush after a non-backup ungetc() call. This is case 2a in
+ terms of
+ <http://lists.gnu.org/archive/html/bug-gnulib/2008-03/msg00131.html>,
+ according to the Austin Group's resolution on 2009-01-08. */
+ /* Check that fflush after a non-backup ungetc() call discards the
+ ungetc buffer. This is mandated by POSIX
+ <http://www.opengroup.org/susv3/functions/ungetc.html>:
+ "The value of the file-position indicator for the stream after
+ reading or discarding all pushed-back bytes shall be the same
+ as it was before the bytes were pushed back."
+ <http://www.opengroup.org/austin/aardvark/latest/xshbug3.txt>
+ "[After fflush(),] the file offset of the underlying open file
+ description shall be set to the file position of the stream, and
+ any characters pushed back onto the stream by ungetc() or
+ ungetwc() that have not subsequently been read from the stream
+ shall be discarded." */
+
+ c = fgetc (stdin);
+ ASSERT (c == '#');
+
+ c = fgetc (stdin);
+ ASSERT (c == '!');
+
+ /* Here the file-position indicator must be 2. */
+
+ c = ungetc ('@', stdin);
+ ASSERT (c == '@');
+
+ fflush (stdin);
+
+ /* Here the file-position indicator must be 1. */
+
+ c = fgetc (stdin);
+ ASSERT (c == '!');
+
+ c = fgetc (stdin);
+ ASSERT (c == '/');
+
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-fflush2.sh b/gnulib/tests/test-fflush2.sh
new file mode 100755
index 00000000..ef77fa48
--- /dev/null
+++ b/gnulib/tests/test-fflush2.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# Execute the test only with seekable input stream.
+# The behaviour of fflush() on a non-seekable input stream is undefined.
+./test-fflush2${EXEEXT} 1 < "$srcdir/test-fflush2.sh" || exit $?
+./test-fflush2${EXEEXT} 2 < "$srcdir/test-fflush2.sh" || exit $?
+#cat "$srcdir/test-fflush2.sh" | ./test-fflush2${EXEEXT} || exit $?
+
+exit 0
diff --git a/gnulib/tests/test-file-has-acl.c b/gnulib/tests/test-file-has-acl.c
new file mode 100644
index 00000000..05d7525a
--- /dev/null
+++ b/gnulib/tests/test-file-has-acl.c
@@ -0,0 +1,71 @@
+/* Test for presence of ACL.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ const char *file;
+ struct stat statbuf;
+
+ ASSERT (argc == 2);
+
+ file = argv[1];
+
+ if (stat (file, &statbuf) < 0)
+ {
+ fprintf (stderr, "could not access file \"%s\"\n", file);
+ exit (EXIT_FAILURE);
+ }
+
+ /* Check against possible infinite loop in file_has_acl. */
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (5);
+#endif
+
+#if USE_ACL
+ {
+ int ret = file_has_acl (file, &statbuf);
+ if (ret < 0)
+ {
+ fprintf (stderr, "could not access the ACL of file \"%s\"\n", file);
+ exit (EXIT_FAILURE);
+ }
+ printf ("%s\n", ret ? "yes" : "no");
+ }
+#else
+ printf ("no\n");
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-file-has-acl.sh b/gnulib/tests/test-file-has-acl.sh
new file mode 100755
index 00000000..db673887
--- /dev/null
+++ b/gnulib/tests/test-file-has-acl.sh
@@ -0,0 +1,344 @@
+#!/bin/sh
+
+# Show all commands when run with environment variable VERBOSE=yes.
+test -z "$VERBOSE" || set -x
+
+test "$USE_ACL" = 0 &&
+ {
+ echo "Skipping test: insufficient ACL support"
+ exit 77
+ }
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gl$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ exit 1
+ }
+}
+
+func_tmpdir
+builddir=`pwd`
+cd "$builddir" ||
+ {
+ echo "$0: cannot determine build directory (unreadable parent dir?)" >&2
+ exit 1
+ }
+# Switch to a temporary directory, to increase the likelihood that ACLs are
+# supported on the current file system. (/tmp is usually locally mounted,
+# whereas the build dir is sometimes NFS-mounted.)
+( cd "$tmp"
+
+ # Prepare tmpfile0.
+ rm -f tmpfile[0-9] tmp.err
+ echo "Simple contents" > tmpfile0
+ chmod 600 tmpfile0
+
+ # Classification of the platform according to the programs available for
+ # manipulating ACLs.
+ # Possible values are:
+ # linux, cygwin, freebsd, solaris, hpux, osf1, aix, macosx, irix, none.
+ # TODO: Support also native Win32 platforms (mingw).
+ acl_flavor=none
+ if (getfacl tmpfile0 >/dev/null) 2>/dev/null; then
+ # Platforms with the getfacl and setfacl programs.
+ # Linux, FreeBSD, Solaris, Cygwin.
+ if (setfacl --help >/dev/null) 2>/dev/null; then
+ # Linux, Cygwin.
+ if (LC_ALL=C setfacl --help | grep ' --set-file' >/dev/null) 2>/dev/null; then
+ # Linux.
+ acl_flavor=linux
+ else
+ acl_flavor=cygwin
+ fi
+ else
+ # FreeBSD, Solaris.
+ if (LC_ALL=C setfacl 2>&1 | grep '\-x entries' >/dev/null) 2>/dev/null; then
+ # FreeBSD.
+ acl_flavor=freebsd
+ else
+ # Solaris.
+ acl_flavor=solaris
+ fi
+ fi
+ else
+ if (lsacl / >/dev/null) 2>/dev/null; then
+ # Platforms with the lsacl and chacl programs.
+ # HP-UX, sometimes also IRIX.
+ acl_flavor=hpux
+ else
+ if (getacl tmpfile0 >/dev/null) 2>/dev/null; then
+ # Tru64.
+ acl_flavor=osf1
+ else
+ if (aclget tmpfile0 >/dev/null) 2>/dev/null; then
+ # AIX.
+ acl_flavor=aix
+ else
+ if (fsaclctl -v >/dev/null) 2>/dev/null; then
+ # MacOS X.
+ acl_flavor=macosx
+ else
+ if test -f /sbin/chacl; then
+ # IRIX.
+ acl_flavor=irix
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ # func_test_file_has_acl file expected
+ # tests the result of the file_has_acl function on file, and checks that it
+ # matches the expected value.
+ func_test_file_has_acl ()
+ {
+ res=`"$builddir"/test-file-has-acl${EXEEXT} "$1"`
+ test "$res" = "$2" || {
+ echo "file_has_acl(\"$1\") returned $res, expected $2" 1>&2
+ exit 1
+ }
+ }
+
+ # func_test_has_acl file expected
+ # tests the result of the file_has_acl function on file, and checks that it
+ # matches the expected value, also taking into account the system's 'ls'
+ # program.
+ case $acl_flavor in
+ freebsd | solaris | hpux | macosx)
+ case $acl_flavor in
+ freebsd | solaris | hpux) acl_ls_option="-ld" ;;
+ macosx) acl_ls_option="-lde" ;;
+ esac
+ func_test_has_acl ()
+ {
+ func_test_file_has_acl "$1" "$2"
+ case `/bin/ls $acl_ls_option "$1" | sed 1q` in
+ ??????????+*)
+ test "$2" = yes || {
+ echo "/bin/ls $acl_ls_option $1 shows an ACL, but expected $2" 1>&2
+ exit 1
+ }
+ ;;
+ ??????????" "*)
+ test "$2" = no || {
+ echo "/bin/ls $acl_ls_option $1 shows no ACL, but expected $2" 1>&2
+ exit 1
+ }
+ ;;
+ esac
+ }
+ ;;
+ irix)
+ func_test_has_acl ()
+ {
+ func_test_file_has_acl "$1" "$2"
+ case `/bin/ls -ldD "$1" | sed 1q` in
+ *" []")
+ test "$2" = no || {
+ echo "/bin/ls -ldD $1 shows no ACL, but expected $2" 1>&2
+ exit 1
+ }
+ ;;
+ *)
+ test "$2" = yes || {
+ echo "/bin/ls -ldD $1 shows an ACL, but expected $2" 1>&2
+ exit 1
+ }
+ ;;
+ esac
+ }
+ ;;
+ *)
+ func_test_has_acl ()
+ {
+ func_test_file_has_acl "$1" "$2"
+ }
+ ;;
+ esac
+
+ func_test_has_acl tmpfile0 no
+
+ mkdir tmpdir0
+ func_test_has_acl tmpdir0 no
+
+ if test $acl_flavor != none; then
+ # A POSIX compliant 'id' program.
+ if test -f /usr/xpg4/bin/id; then
+ ID=/usr/xpg4/bin/id
+ else
+ ID=id
+ fi
+ # Use a user and group id different from the current one, to avoid
+ # redundant/ambiguous ACLs.
+ myuid=`$ID -u`
+ mygid=`$ID -g`
+ auid=1
+ if test "$auid" = "$myuid"; then auid=2; fi
+ agid=1
+ if test "$agid" = "$mygid"; then agid=2; fi
+
+ case $acl_flavor in
+ linux | freebsd | solaris)
+
+ # Set an ACL for a user.
+ if setfacl -m user:$auid:1 tmpfile0; then
+
+ func_test_has_acl tmpfile0 yes
+
+ # Remove the ACL for the user.
+ case $acl_flavor in
+ linux) setfacl -x user:$auid tmpfile0 ;;
+ freebsd) setfacl -x user:$auid:1 tmpfile0 ;;
+ *) setfacl -d user:$auid:1 tmpfile0 ;;
+ esac
+
+ # On Linux and FreeBSD, the ACL for the mask is implicitly added.
+ # On Solaris, it is always there.
+ case $acl_flavor in
+ linux | freebsd) func_test_has_acl tmpfile0 yes ;;
+ *) func_test_has_acl tmpfile0 no ;;
+ esac
+
+ # Remove the ACL for the mask, if it was implicitly added.
+ case $acl_flavor in
+ linux | freebsd) setfacl -x mask: tmpfile0 ;;
+ *) setfacl -d mask: tmpfile0 ;;
+ esac
+
+ func_test_has_acl tmpfile0 no
+
+ fi
+ ;;
+
+ cygwin)
+
+ # Set an ACL for a group.
+ if setfacl -m group:0:1 tmpfile0; then
+
+ func_test_has_acl tmpfile0 yes
+
+ # Remove the ACL for the group.
+ setfacl -d group:0 tmpfile0
+
+ func_test_has_acl tmpfile0 no
+
+ fi
+ ;;
+
+ hpux)
+
+ # Set an ACL for a user.
+ orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+ if chacl -r "${orig}($auid.%,--x)" tmpfile0; then
+
+ func_test_has_acl tmpfile0 yes
+
+ # Remove the ACL for the user.
+ chacl -d "($auid.%,--x)" tmpfile0
+
+ func_test_has_acl tmpfile0 no
+
+ fi
+ ;;
+
+ osf1)
+
+ # Set an ACL for a user.
+ setacl -u user:$auid:1 tmpfile0 2> tmp.err
+ cat tmp.err 1>&2
+ if grep 'Error:' tmp.err > /dev/null \
+ || grep 'Operation not supported' tmp.err > /dev/null; then
+ :
+ else
+
+ func_test_has_acl tmpfile0 yes
+
+ # Remove the ACL for the user.
+ setacl -x user:$auid:1 tmpfile0
+
+ func_test_has_acl tmpfile0 no
+
+ fi
+ ;;
+
+ aix)
+
+ # Set an ACL for a user.
+ { aclget tmpfile0 | sed -e 's/disabled$/enabled/'; echo " permit --x u:$auid"; } | aclput tmpfile0
+ if aclget tmpfile0 | grep enabled > /dev/null; then
+
+ func_test_has_acl tmpfile0 yes
+
+ # Remove the ACL for the user.
+ aclget tmpfile0 | grep -v ' u:[^ ]*$' | aclput tmpfile0
+
+ func_test_has_acl tmpfile0 no
+
+ fi
+ ;;
+
+ macosx)
+
+ # Set an ACL for a user.
+ /bin/chmod +a "user:daemon allow execute" tmpfile0
+
+ func_test_has_acl tmpfile0 yes
+
+ # Remove the ACL for the user.
+ /bin/chmod -a "user:daemon allow execute" tmpfile0
+
+ func_test_has_acl tmpfile0 no
+
+ ;;
+
+ irix)
+
+ # Set an ACL for a user.
+ /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x tmpfile0 2> tmp.err
+ cat tmp.err 1>&2
+ if test -s tmp.err; then :; else
+
+ func_test_has_acl tmpfile0 yes
+
+ # Remove the ACL for the user.
+ /sbin/chacl user::rw-,group::---,other::--- tmpfile0
+
+ func_test_has_acl tmpfile0 no
+
+ fi
+ ;;
+
+ esac
+ fi
+
+ rm -f tmpfile[0-9] tmp.err
+ rm -rf tmpdir0
+) || exit 1
+
+rm -rf "$tmp"
+exit 0
diff --git a/gnulib/tests/test-filenamecat.c b/gnulib/tests/test-filenamecat.c
new file mode 100644
index 00000000..b01645a4
--- /dev/null
+++ b/gnulib/tests/test-filenamecat.c
@@ -0,0 +1,66 @@
+/* Test of concatenation of two arbitrary file names.
+
+ Copyright (C) 1996-2007, 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "filenamecat.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "progname.h"
+
+int
+main (int argc _GL_UNUSED, char *argv[])
+{
+ static char const *const tests[][3] =
+ {
+ {"a", "b", "a/b"},
+ {"a/", "b", "a/b"},
+ {"a/", "/b", "a/b"},
+ {"a", "/b", "a/b"},
+
+ {"/", "b", "/b"},
+ {"/", "/b", "/b"},
+ {"/", "/", "/"},
+ {"a", "/", "a/"}, /* this might deserve a diagnostic */
+ {"/a", "/", "/a/"}, /* this might deserve a diagnostic */
+ {"a", "//b", "a/b"},
+ {"", "a", "a"}, /* this might deserve a diagnostic */
+ };
+ unsigned int i;
+ bool fail = false;
+
+ set_program_name (argv[0]);
+
+ for (i = 0; i < sizeof tests / sizeof tests[0]; i++)
+ {
+ char *base_in_result;
+ char const *const *t = tests[i];
+ char *res = file_name_concat (t[0], t[1], &base_in_result);
+ if (strcmp (res, t[2]) != 0)
+ {
+ fprintf (stderr, "test #%u: got %s, expected %s\n", i, res, t[2]);
+ fail = true;
+ }
+ }
+ exit (fail ? EXIT_FAILURE : EXIT_SUCCESS);
+}
diff --git a/gnulib/tests/test-filevercmp.c b/gnulib/tests/test-filevercmp.c
new file mode 100644
index 00000000..fc68b9c2
--- /dev/null
+++ b/gnulib/tests/test-filevercmp.c
@@ -0,0 +1,121 @@
+/* Test of filevercmp() function.
+ Copyright (C) 2008-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include "filevercmp.h"
+
+#include <stddef.h>
+
+#include "macros.h"
+
+/* set of well sorted examples */
+static const char *const examples[] =
+{
+ "",
+ ".",
+ "..",
+ ".0",
+ ".9",
+ ".A",
+ ".Z",
+ ".a~",
+ ".a",
+ ".b~",
+ ".b",
+ ".z",
+ ".zz~",
+ ".zz",
+ ".zz.~1~",
+ ".zz.0",
+ "0",
+ "9",
+ "A",
+ "Z",
+ "a~",
+ "a",
+ "a.b~",
+ "a.b",
+ "a.bc~",
+ "a.bc",
+ "b~",
+ "b",
+ "gcc-c++-10.fc9.tar.gz",
+ "gcc-c++-10.fc9.tar.gz.~1~",
+ "gcc-c++-10.fc9.tar.gz.~2~",
+ "gcc-c++-10.8.12-0.7rc2.fc9.tar.bz2",
+ "gcc-c++-10.8.12-0.7rc2.fc9.tar.bz2.~1~",
+ "glibc-2-0.1.beta1.fc10.rpm",
+ "glibc-common-5-0.2.beta2.fc9.ebuild",
+ "glibc-common-5-0.2b.deb",
+ "glibc-common-11b.ebuild",
+ "glibc-common-11-0.6rc2.ebuild",
+ "libstdc++-0.5.8.11-0.7rc2.fc10.tar.gz",
+ "libstdc++-4a.fc8.tar.gz",
+ "libstdc++-4.10.4.20040204svn.rpm",
+ "libstdc++-devel-3.fc8.ebuild",
+ "libstdc++-devel-3a.fc9.tar.gz",
+ "libstdc++-devel-8.fc8.deb",
+ "libstdc++-devel-8.6.2-0.4b.fc8",
+ "nss_ldap-1-0.2b.fc9.tar.bz2",
+ "nss_ldap-1-0.6rc2.fc8.tar.gz",
+ "nss_ldap-1.0-0.1a.tar.gz",
+ "nss_ldap-10beta1.fc8.tar.gz",
+ "nss_ldap-10.11.8.6.20040204cvs.fc10.ebuild",
+ "z",
+ "zz~",
+ "zz",
+ "zz.~1~",
+ "zz.0",
+ "#.b#",
+ NULL
+};
+
+int
+main (void)
+{
+ const char *const *i;
+
+ /* Following tests taken from test-strverscmp.c */
+ ASSERT (filevercmp ("", "") == 0);
+ ASSERT (filevercmp ("a", "a") == 0);
+ ASSERT (filevercmp ("a", "b") < 0);
+ ASSERT (filevercmp ("b", "a") > 0);
+ ASSERT (filevercmp ("a0", "a") > 0);
+ ASSERT (filevercmp ("00", "01") < 0);
+ ASSERT (filevercmp ("01", "010") < 0);
+ ASSERT (filevercmp ("9", "10") < 0);
+ ASSERT (filevercmp ("0a", "0") > 0);
+
+ /* compare each version string with each other - O(n^2) */
+ for (i = examples; *i; i++)
+ {
+ const char *const *j;
+ for (j = examples; *j; j++)
+ {
+ int result = filevercmp (*i, *j);
+ if (result < 0)
+ ASSERT (i < j);
+ else if (0 < result)
+ ASSERT (j < i);
+ else
+ ASSERT (i == j);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-flock.c b/gnulib/tests/test-flock.c
new file mode 100644
index 00000000..7dcb94f0
--- /dev/null
+++ b/gnulib/tests/test-flock.c
@@ -0,0 +1,97 @@
+/* Test of flock() function.
+ Copyright (C) 2008-2010 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/>. */
+
+#include <config.h>
+
+#include <sys/file.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (flock, int, (int, int));
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "macros.h"
+
+static void
+test_shared (const char *file, int fd)
+{
+ /* Should be able to acquire several shared locks on a file, through
+ * different file table entries.
+ */
+ int fd2, r;
+
+ ASSERT (flock (fd, LOCK_SH) == 0);
+
+ fd2 = open (file, O_RDWR, 0644);
+ ASSERT (fd2 >= 0);
+
+ r = flock (fd2, LOCK_SH | LOCK_NB);
+ ASSERT (r == 0); /* Was able to acquire a second shared lock. */
+
+ ASSERT (flock (fd, LOCK_UN) == 0);
+ ASSERT (close (fd2) == 0);
+}
+
+static void
+test_exclusive (const char *file, int fd)
+{
+ /* Should not be able to acquire more than one exclusive lock on a file. */
+ int fd2, r;
+
+ ASSERT (flock (fd, LOCK_EX) == 0);
+
+ fd2 = open (file, O_RDWR, 0644);
+ ASSERT (fd2 >= 0);
+
+ r = flock (fd2, LOCK_SH | LOCK_NB);
+ ASSERT (r == -1); /* Was unable to acquire a second exclusive lock. */
+
+ ASSERT (flock (fd, LOCK_UN) == 0);
+ ASSERT (close (fd2) == 0);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int fd;
+ const char *file = "test-flock.txt";
+
+ /* Open a non-empty file for testing. */
+ fd = open (file, O_RDWR | O_CREAT | O_TRUNC, 0644);
+ ASSERT (fd >= 0);
+ ASSERT (write (fd, "hello", 5) == 5);
+
+ /* Some impossible operation codes which should never be accepted. */
+ ASSERT (flock (fd, LOCK_SH | LOCK_EX) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (flock (fd, LOCK_SH | LOCK_UN) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (flock (fd, LOCK_EX | LOCK_UN) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (flock (fd, 0) == -1);
+ ASSERT (errno == EINVAL);
+
+ test_shared (file, fd);
+ test_exclusive (file, fd);
+
+ /* Close and remove the test file. */
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (file) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-floorf1.c b/gnulib/tests/test-floorf1.c
new file mode 100644
index 00000000..389f42b1
--- /dev/null
+++ b/gnulib/tests/test-floorf1.c
@@ -0,0 +1,68 @@
+/* Test of rounding towards negative infinity.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (floorf, float, (float));
+
+#include "isnanf-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0f.
+ So we use -zero instead. */
+float zero = 0.0f;
+
+int
+main ()
+{
+ /* Zero. */
+ ASSERT (floorf (0.0f) == 0.0f);
+ ASSERT (floorf (-zero) == 0.0f);
+ /* Positive numbers. */
+ ASSERT (floorf (0.3f) == 0.0f);
+ ASSERT (floorf (0.7f) == 0.0f);
+ ASSERT (floorf (1.0f) == 1.0f);
+ ASSERT (floorf (1.5f) == 1.0f);
+ ASSERT (floorf (1.999f) == 1.0f);
+ ASSERT (floorf (2.0f) == 2.0f);
+ ASSERT (floorf (65535.99f) == 65535.0f);
+ ASSERT (floorf (65536.0f) == 65536.0f);
+ ASSERT (floorf (2.341e31f) == 2.341e31f);
+ /* Negative numbers. */
+ ASSERT (floorf (-0.3f) == -1.0f);
+ ASSERT (floorf (-0.7f) == -1.0f);
+ ASSERT (floorf (-1.0f) == -1.0f);
+ ASSERT (floorf (-1.001f) == -2.0f);
+ ASSERT (floorf (-1.5f) == -2.0f);
+ ASSERT (floorf (-1.999f) == -2.0f);
+ ASSERT (floorf (-2.0f) == -2.0f);
+ ASSERT (floorf (-65535.99f) == -65536.0f);
+ ASSERT (floorf (-65536.0f) == -65536.0f);
+ ASSERT (floorf (-2.341e31f) == -2.341e31f);
+ /* Infinite numbers. */
+ ASSERT (floorf (1.0f / 0.0f) == 1.0f / 0.0f);
+ ASSERT (floorf (-1.0f / 0.0f) == -1.0f / 0.0f);
+ /* NaNs. */
+ ASSERT (isnanf (floorf (NaNf ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-floorf2.c b/gnulib/tests/test-floorf2.c
new file mode 100644
index 00000000..573a648e
--- /dev/null
+++ b/gnulib/tests/test-floorf2.c
@@ -0,0 +1,151 @@
+/* Test of rounding towards negative infinity.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include <float.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "isnanf-nolibm.h"
+#include "macros.h"
+
+
+/* The reference implementation, taken from lib/floor.c. */
+
+#define DOUBLE float
+#define MANT_DIG FLT_MANT_DIG
+#define L_(literal) literal##f
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+floorf_reference (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ return z;
+}
+
+
+/* Test for equality. */
+static int
+equal (DOUBLE x, DOUBLE y)
+{
+ return (isnanf (x) ? isnanf (y) : x == y);
+}
+
+/* Test whether the result for a given argument is correct. */
+static bool
+correct_result_p (DOUBLE x, DOUBLE result)
+{
+ return
+ (x < 0 && x >= -1 ? result == - L_(1.0) :
+ x - 1 < x ? result <= x && result >= x - 1 && x - result < 1 :
+ equal (result, x));
+}
+
+/* Test the function for a given argument. */
+static int
+check (float x)
+{
+ /* If the reference implementation is incorrect, bail out immediately. */
+ float reference = floorf_reference (x);
+ ASSERT (correct_result_p (x, reference));
+ /* If the actual implementation is wrong, return an error code. */
+ {
+ float result = floorf (x);
+ if (correct_result_p (x, result))
+ return 0;
+ else
+ {
+ fprintf (stderr, "floorf %g(%a) = %g(%a) or %g(%a)?\n",
+ x, x, reference, reference, result, result);
+ return 1;
+ }
+ }
+}
+
+#define NUM_HIGHBITS 12
+#define NUM_LOWBITS 4
+
+int
+main ()
+{
+ unsigned int highbits;
+ unsigned int lowbits;
+ int error = 0;
+ for (highbits = 0; highbits < (1 << NUM_HIGHBITS); highbits++)
+ for (lowbits = 0; lowbits < (1 << NUM_LOWBITS); lowbits++)
+ {
+ /* Combine highbits and lowbits into a floating-point number,
+ sign-extending the lowbits to 32-NUM_HIGHBITS bits. */
+ union { float f; uint32_t i; } janus;
+ janus.i = ((uint32_t) highbits << (32 - NUM_HIGHBITS))
+ | ((uint32_t) ((int32_t) ((uint32_t) lowbits << (32 - NUM_LOWBITS))
+ >> (32 - NUM_LOWBITS - NUM_HIGHBITS))
+ >> NUM_HIGHBITS);
+ error |= check (janus.f);
+ }
+ return (error ? 1 : 0);
+}
diff --git a/gnulib/tests/test-floorl.c b/gnulib/tests/test-floorl.c
new file mode 100644
index 00000000..5bbcaac4
--- /dev/null
+++ b/gnulib/tests/test-floorl.c
@@ -0,0 +1,87 @@
+/* Test of rounding towards negative infinity.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (floorl, long double, (long double));
+
+#include <float.h>
+
+#include "fpucw.h"
+#include "isnanl-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zero instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zero (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+long double minus_zero = -0.0L;
+#endif
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* Zero. */
+ ASSERT (floorl (0.0L) == 0.0L);
+ ASSERT (floorl (minus_zero) == 0.0L);
+ /* Positive numbers. */
+ ASSERT (floorl (0.3L) == 0.0L);
+ ASSERT (floorl (0.7L) == 0.0L);
+ ASSERT (floorl (1.0L) == 1.0L);
+ ASSERT (floorl (1.5L) == 1.0L);
+ ASSERT (floorl (1.999L) == 1.0L);
+ ASSERT (floorl (2.0L) == 2.0L);
+ ASSERT (floorl (65535.999L) == 65535.0L);
+ ASSERT (floorl (65536.0L) == 65536.0L);
+ ASSERT (floorl (2.341e31L) == 2.341e31L);
+ /* Negative numbers. */
+ ASSERT (floorl (-0.3L) == -1.0L);
+ ASSERT (floorl (-0.7L) == -1.0L);
+ ASSERT (floorl (-1.0L) == -1.0L);
+ ASSERT (floorl (-1.001L) == -2.0L);
+ ASSERT (floorl (-1.5L) == -2.0L);
+ ASSERT (floorl (-1.999L) == -2.0L);
+ ASSERT (floorl (-2.0L) == -2.0L);
+ ASSERT (floorl (-65535.999L) == -65536.0L);
+ ASSERT (floorl (-65536.0L) == -65536.0L);
+ ASSERT (floorl (-2.341e31L) == -2.341e31L);
+ /* Infinite numbers. */
+ ASSERT (floorl (1.0L / 0.0L) == 1.0L / 0.0L);
+ ASSERT (floorl (-1.0L / 0.0L) == -1.0L / 0.0L);
+ /* NaNs. */
+ ASSERT (isnanl (floorl (NaNl ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fmod.c b/gnulib/tests/test-fmod.c
new file mode 100644
index 00000000..2cae38da
--- /dev/null
+++ b/gnulib/tests/test-fmod.c
@@ -0,0 +1,42 @@
+/* Test of fmod() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fmod, double, (double, double));
+
+#include "macros.h"
+
+volatile double x;
+volatile double y;
+double z;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 9.245907126;
+ y = 3.141592654;
+ z = fmod (x, y);
+ ASSERT (z >= 2.962721817 && z <= 2.962721819);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fnmatch.c b/gnulib/tests/test-fnmatch.c
new file mode 100644
index 00000000..a85db70b
--- /dev/null
+++ b/gnulib/tests/test-fnmatch.c
@@ -0,0 +1,50 @@
+/* Test of fnmatch string matching function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2009. */
+
+#include <config.h>
+
+#include <fnmatch.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fnmatch, int, (char const *, char const *, int));
+
+#include "macros.h"
+
+int
+main ()
+{
+ int res;
+
+ ASSERT (res = fnmatch ("", "", 0) == 0);
+
+ ASSERT (res = fnmatch ("*", "", 0) == 0);
+ ASSERT (res = fnmatch ("*", "foo", 0) == 0);
+ ASSERT (res = fnmatch ("*", "bar", 0) == 0);
+ ASSERT (res = fnmatch ("*", "*", 0) == 0);
+ ASSERT (res = fnmatch ("**", "f", 0) == 0);
+ ASSERT (res = fnmatch ("**", "foo.txt", 0) == 0);
+ ASSERT (res = fnmatch ("*.*", "foo.txt", 0) == 0);
+
+ ASSERT (res = fnmatch ("foo*.txt", "foobar.txt", 0) == 0);
+
+ ASSERT (res = fnmatch ("foo.txt", "foo.txt", 0) == 0);
+ ASSERT (res = fnmatch ("foo\\.txt", "foo.txt", 0) == 0);
+ ASSERT (res = fnmatch ("foo\\.txt", "foo.txt", FNM_NOESCAPE) == FNM_NOMATCH);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fopen-safer.c b/gnulib/tests/test-fopen-safer.c
new file mode 100644
index 00000000..c12080dc
--- /dev/null
+++ b/gnulib/tests/test-fopen-safer.c
@@ -0,0 +1,31 @@
+/* Test of opening a file stream.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "stdio--.h"
+
+#define BASE "test-fopen-safer.t"
+
+#include "test-fopen.h"
+
+int
+main (void)
+{
+ return test_fopen ();
+}
diff --git a/gnulib/tests/test-fopen.c b/gnulib/tests/test-fopen.c
new file mode 100644
index 00000000..d788d84e
--- /dev/null
+++ b/gnulib/tests/test-fopen.c
@@ -0,0 +1,34 @@
+/* Test of opening a file stream.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fopen, FILE *, (char const *, char const *));
+
+#define BASE "test-fopen.t"
+
+#include "test-fopen.h"
+
+int
+main (void)
+{
+ return test_fopen ();
+}
diff --git a/gnulib/tests/test-fopen.h b/gnulib/tests/test-fopen.h
new file mode 100644
index 00000000..765f2f8a
--- /dev/null
+++ b/gnulib/tests/test-fopen.h
@@ -0,0 +1,73 @@
+/* Test of opening a file stream.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+/* Include <config.h> and a form of <stdio.h> first. */
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+/* Test fopen. Assumes BASE is defined. */
+
+static int
+test_fopen (void)
+{
+ FILE *f;
+ /* Remove anything from prior partial run. */
+ unlink (BASE "file");
+
+ /* Read requires existing file. */
+ errno = 0;
+ ASSERT (fopen (BASE "file", "r") == NULL);
+ ASSERT (errno == ENOENT);
+
+ /* Write can create a file. */
+ f = fopen (BASE "file", "w");
+ ASSERT (f);
+ ASSERT (fclose (f) == 0);
+
+ /* Trailing slash is invalid on non-directory. */
+ errno = 0;
+ ASSERT (fopen (BASE "file/", "r") == NULL);
+ ASSERT (errno == ENOTDIR || errno == EISDIR || errno == EINVAL);
+
+ /* Cannot create a directory. */
+ errno = 0;
+ ASSERT (fopen ("nonexist.ent/", "w") == NULL);
+ ASSERT (errno == ENOTDIR || errno == EISDIR || errno == ENOENT
+ || errno == EINVAL);
+
+ /* Directories cannot be opened for writing. */
+ errno = 0;
+ ASSERT (fopen (".", "w") == NULL);
+ ASSERT (errno == EISDIR || errno == EINVAL || errno == EACCES);
+
+ /* /dev/null must exist, and be writable. */
+ f = fopen ("/dev/null", "r");
+ ASSERT (f);
+ ASSERT (fclose (f) == 0);
+ f = fopen ("/dev/null", "w");
+ ASSERT (f);
+ ASSERT (fclose (f) == 0);
+
+ /* Cleanup. */
+ ASSERT (unlink (BASE "file") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fpending.c b/gnulib/tests/test-fpending.c
new file mode 100644
index 00000000..d79a2083
--- /dev/null
+++ b/gnulib/tests/test-fpending.c
@@ -0,0 +1,41 @@
+/* Ensure that __fpending works.
+
+ Copyright (C) 2004, 2007-2010 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/>.
+
+ Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "fpending.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ ASSERT (__fpending (stdout) == 0);
+
+ fputs ("foo", stdout);
+ ASSERT (__fpending (stdout) == 3);
+
+ fflush (stdout);
+ ASSERT (__fpending (stdout) == 0);
+
+ exit (0);
+}
diff --git a/gnulib/tests/test-fpending.sh b/gnulib/tests/test-fpending.sh
new file mode 100755
index 00000000..636af25a
--- /dev/null
+++ b/gnulib/tests/test-fpending.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+tmpfile=
+trap 'rm -fr $tmpfile' 1 2 3 15
+
+tmpfile=test-fpending.t
+
+./test-fpending${EXEEXT} > $tmpfile || exit 1
+
+rm -fr $tmpfile
+
+exit 0
diff --git a/gnulib/tests/test-fprintf-posix.c b/gnulib/tests/test-fprintf-posix.c
new file mode 100644
index 00000000..f630edc5
--- /dev/null
+++ b/gnulib/tests/test-fprintf-posix.c
@@ -0,0 +1,40 @@
+/* Test of POSIX compatible fprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fprintf, int, (FILE *, char const *, ...));
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-fprintf-posix.h"
+
+int
+main (int argc, char *argv[])
+{
+ test_function (fprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-fprintf-posix.h b/gnulib/tests/test-fprintf-posix.h
new file mode 100644
index 00000000..dcd65021
--- /dev/null
+++ b/gnulib/tests/test-fprintf-posix.h
@@ -0,0 +1,151 @@
+/* Test of POSIX compatible vsprintf() and sprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_function (int (*my_fprintf) (FILE *, const char *, ...))
+{
+ /* Here we don't test output that may be platform dependent.
+ The bulk of the tests is done as part of the 'vasnprintf-posix' module. */
+
+ /* Test support of size specifiers as in C99. */
+
+ my_fprintf (stdout, "%ju %d\n", (uintmax_t) 12345671, 33, 44, 55);
+
+ my_fprintf (stdout, "%zu %d\n", (size_t) 12345672, 33, 44, 55);
+
+ my_fprintf (stdout, "%tu %d\n", (ptrdiff_t) 12345673, 33, 44, 55);
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ /* Positive zero. */
+ my_fprintf (stdout, "%a %d\n", 0.0, 33, 44, 55);
+
+ /* Positive infinity. */
+ my_fprintf (stdout, "%a %d\n", 1.0 / 0.0, 33, 44, 55);
+
+ /* Negative infinity. */
+ my_fprintf (stdout, "%a %d\n", -1.0 / 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO with infinite number. */
+ my_fprintf (stdout, "%010a %d\n", 1.0 / 0.0, 33, 44, 55);
+
+ /* Test the support of the %f format directive. */
+
+ /* A positive number. */
+ my_fprintf (stdout, "%f %d\n", 12.75, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_fprintf (stdout, "%f %d\n", 1234567.0, 33, 44, 55);
+
+ /* A negative number. */
+ my_fprintf (stdout, "%f %d\n", -0.03125, 33, 44, 55);
+
+ /* Positive zero. */
+ my_fprintf (stdout, "%f %d\n", 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_fprintf (stdout, "%015f %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision. */
+ my_fprintf (stdout, "%.f %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_fprintf (stdout, "%.2f %d\n", 999.95, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_fprintf (stdout, "%.2f %d\n", 999.996, 33, 44, 55);
+
+ /* A positive number. */
+ my_fprintf (stdout, "%Lf %d\n", 12.75L, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_fprintf (stdout, "%Lf %d\n", 1234567.0L, 33, 44, 55);
+
+ /* A negative number. */
+ my_fprintf (stdout, "%Lf %d\n", -0.03125L, 33, 44, 55);
+
+ /* Positive zero. */
+ my_fprintf (stdout, "%Lf %d\n", 0.0L, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_fprintf (stdout, "%015Lf %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision. */
+ my_fprintf (stdout, "%.Lf %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_fprintf (stdout, "%.2Lf %d\n", 999.95L, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_fprintf (stdout, "%.2Lf %d\n", 999.996L, 33, 44, 55);
+
+ /* Test the support of the %F format directive. */
+
+ /* A positive number. */
+ my_fprintf (stdout, "%F %d\n", 12.75, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_fprintf (stdout, "%F %d\n", 1234567.0, 33, 44, 55);
+
+ /* A negative number. */
+ my_fprintf (stdout, "%F %d\n", -0.03125, 33, 44, 55);
+
+ /* Positive zero. */
+ my_fprintf (stdout, "%F %d\n", 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_fprintf (stdout, "%015F %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision. */
+ my_fprintf (stdout, "%.F %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_fprintf (stdout, "%.2F %d\n", 999.95, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_fprintf (stdout, "%.2F %d\n", 999.996, 33, 44, 55);
+
+ /* A positive number. */
+ my_fprintf (stdout, "%LF %d\n", 12.75L, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_fprintf (stdout, "%LF %d\n", 1234567.0L, 33, 44, 55);
+
+ /* A negative number. */
+ my_fprintf (stdout, "%LF %d\n", -0.03125L, 33, 44, 55);
+
+ /* Positive zero. */
+ my_fprintf (stdout, "%LF %d\n", 0.0L, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_fprintf (stdout, "%015LF %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision. */
+ my_fprintf (stdout, "%.LF %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_fprintf (stdout, "%.2LF %d\n", 999.95L, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_fprintf (stdout, "%.2LF %d\n", 999.996L, 33, 44, 55);
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ my_fprintf (stdout, "%2$d %1$d\n", 33, 55);
+}
diff --git a/gnulib/tests/test-fprintf-posix.sh b/gnulib/tests/test-fprintf-posix.sh
new file mode 100755
index 00000000..f9acf1f2
--- /dev/null
+++ b/gnulib/tests/test-fprintf-posix.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-fprintf-posix.tmp t-fprintf-posix.out"
+./test-fprintf-posix${EXEEXT} > t-fprintf-posix.tmp || exit 1
+LC_ALL=C tr -d '\r' < t-fprintf-posix.tmp > t-fprintf-posix.out || exit 1
+
+: ${DIFF=diff}
+${DIFF} "${srcdir}/test-printf-posix.output" t-fprintf-posix.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-fprintf-posix2.c b/gnulib/tests/test-fprintf-posix2.c
new file mode 100644
index 00000000..9e032fe1
--- /dev/null
+++ b/gnulib/tests/test-fprintf-posix2.c
@@ -0,0 +1,112 @@
+/* Test of POSIX compatible fprintf() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <string.h>
+#include <errno.h>
+
+int
+main (int argc, char *argv[])
+{
+ struct rlimit limit;
+ int arg;
+ int ret;
+
+ /* Some printf implementations allocate temporary space with malloc. */
+ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
+#ifdef RLIMIT_DATA
+ if (getrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+#endif
+ /* On Linux systems, malloc() is limited by RLIMIT_AS. */
+#ifdef RLIMIT_AS
+ if (getrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+#endif
+ /* Some printf implementations allocate temporary space on the stack. */
+#ifdef RLIMIT_STACK
+ if (getrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+#endif
+
+ arg = atoi (argv[1]);
+ switch (arg)
+ {
+ case 0:
+ {
+ void *memory = malloc (5000000);
+ if (memory == NULL)
+ return 1;
+ memset (memory, 17, 5000000);
+ return 78;
+ }
+ case 1:
+ ret = fprintf (stdout, "%.5000000f", 1.0);
+ return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
+ case 2:
+ ret = fprintf (stdout, "%.5000000f", -1.0);
+ return !(ret == 5000003 || (ret < 0 && errno == ENOMEM));
+ case 3:
+ ret = fprintf (stdout, "%.5000000e", 1.0);
+ return !(ret >= 5000006 || (ret < 0 && errno == ENOMEM));
+ case 4:
+ ret = fprintf (stdout, "%.5000000d", 1);
+ return !(ret == 5000000 || (ret < 0 && errno == ENOMEM));
+ case 5:
+ ret = fprintf (stdout, "%.5000000d", -1);
+ return !(ret == 5000001 || (ret < 0 && errno == ENOMEM));
+ case 6:
+ ret = fprintf (stdout, "%.5000000u", 1);
+ return !(ret == 5000000 || (ret < 0 && errno == ENOMEM));
+ }
+ return 0;
+}
+
+#else
+
+int
+main (int argc, char *argv[])
+{
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/test-fprintf-posix2.sh b/gnulib/tests/test-fprintf-posix2.sh
new file mode 100755
index 00000000..79d92af3
--- /dev/null
+++ b/gnulib/tests/test-fprintf-posix2.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+# Test out-of-memory handling.
+
+(./test-fprintf-posix2${EXEEXT} 0
+ result=$?
+ if test $result != 77 && test $result != 78; then result=1; fi
+ exit $result
+) 2>/dev/null
+malloc_result=$?
+if test $malloc_result = 77; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+
+for arg in 1 2 3 4 5 6
+do
+ ./test-fprintf-posix2${EXEEXT} $arg > /dev/null
+ result=$?
+ if test $result = 77; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+ fi
+ if test $result != 0; then
+ exit 1
+ fi
+done
+
+if test $malloc_result = 78; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+
+exit 0
diff --git a/gnulib/tests/test-fprintf-posix3.c b/gnulib/tests/test-fprintf-posix3.c
new file mode 100644
index 00000000..6c0d5f2d
--- /dev/null
+++ b/gnulib/tests/test-fprintf-posix3.c
@@ -0,0 +1,108 @@
+/* Test of POSIX compatible fprintf() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <string.h>
+#include <errno.h>
+
+/* Test against a memory leak in the fprintf replacement. */
+
+/* Number of iterations across the loop. */
+#define NUM_ROUNDS 1000
+
+/* Number of bytes that are allowed to escape per round. */
+#define MAX_ALLOC_ROUND 10000
+
+/* Number of bytes that are allowed to escape in total.
+ This should be at least 10 MB, since it includes the normal memory
+ or address space of the test program. */
+#define MAX_ALLOC_TOTAL (NUM_ROUNDS * MAX_ALLOC_ROUND)
+
+int
+main (int argc, char *argv[])
+{
+ struct rlimit limit;
+ int arg;
+ int repeat;
+
+ /* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
+
+ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
+#ifdef RLIMIT_DATA
+ if (getrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
+ limit.rlim_max = MAX_ALLOC_TOTAL;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+#endif
+ /* On Linux systems, malloc() is limited by RLIMIT_AS. */
+#ifdef RLIMIT_AS
+ if (getrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
+ limit.rlim_max = MAX_ALLOC_TOTAL;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+#endif
+
+ arg = atoi (argv[1]);
+ if (arg == 0)
+ {
+ void *memory = malloc (MAX_ALLOC_TOTAL);
+ if (memory == NULL)
+ return 1;
+ memset (memory, 17, MAX_ALLOC_TOTAL);
+ return 78;
+ }
+
+ /* Perform the test and test whether it triggers a permanent memory
+ allocation of more than MAX_ALLOC_TOTAL bytes. */
+
+ for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
+ {
+ /* This may produce a temporary memory allocation of 11000 bytes.
+ but should not result in a permanent memory allocation. */
+ if (fprintf (stdout, "%011000d\n", 17) == -1
+ && errno == ENOMEM)
+ return 1;
+ }
+
+ return 0;
+}
+
+#else
+
+int
+main (int argc, char *argv[])
+{
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/test-fprintf-posix3.sh b/gnulib/tests/test-fprintf-posix3.sh
new file mode 100755
index 00000000..6a6976d3
--- /dev/null
+++ b/gnulib/tests/test-fprintf-posix3.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+# Test against a memory leak.
+
+(./test-fprintf-posix3${EXEEXT} 0
+ result=$?
+ if test $result != 77 && test $result != 78; then result=1; fi
+ exit $result
+) 2>/dev/null
+malloc_result=$?
+if test $malloc_result = 77; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+
+./test-fprintf-posix3${EXEEXT} 1 > /dev/null
+result=$?
+if test $result = 77; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+if test $result != 0; then
+ exit 1
+fi
+
+if test $malloc_result = 78; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+
+exit 0
diff --git a/gnulib/tests/test-fpurge.c b/gnulib/tests/test-fpurge.c
new file mode 100644
index 00000000..89fe8c0c
--- /dev/null
+++ b/gnulib/tests/test-fpurge.c
@@ -0,0 +1,132 @@
+/* Test of fpurge() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if we are not using the gnulib fseek module. */
+#define _GL_NO_LARGE_FILES
+#include <stdio.h>
+
+#include <string.h>
+
+#include "macros.h"
+
+#define TESTFILE "t-fpurge.tmp"
+
+int
+main (void)
+{
+ int check_filepos;
+
+ for (check_filepos = 0; check_filepos <= 1; check_filepos++)
+ {
+ FILE *fp;
+
+ /* Create a file with some contents. */
+ fp = fopen (TESTFILE, "w");
+ if (fp == NULL)
+ goto skip;
+ if (fwrite ("foobarsh", 1, 8, fp) < 8)
+ goto skip;
+ if (fclose (fp))
+ goto skip;
+
+ /* The file's contents is now "foobarsh". */
+
+ /* Open it in read-write mode. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ goto skip;
+ if (fseek (fp, 3, SEEK_CUR))
+ goto skip;
+ if (fwrite ("g", 1, 1, fp) < 1)
+ goto skip;
+ if (fflush (fp))
+ goto skip;
+ if (fwrite ("bz", 1, 2, fp) < 2)
+ goto skip;
+ /* Discard pending write. */
+ ASSERT (fpurge (fp) == 0);
+ /* Verify that when discarding pending output, the file position is set
+ back to where it was before the write calls. */
+ if (check_filepos)
+ ASSERT (ftell (fp) == 4);
+ ASSERT (fclose (fp) == 0);
+
+ /* Open it in read-only mode. */
+ fp = fopen (TESTFILE, "r");
+ if (fp == NULL)
+ goto skip;
+ /* Verify that the pending writes before the fpurge were really
+ discarded. */
+ {
+ char buf[8];
+ if (fread (buf, 1, 7, fp) < 7)
+ goto skip;
+ ASSERT (memcmp (buf, "foogars", 7) == 0);
+ }
+ /* Discard the buffered 'h'. */
+ if (check_filepos)
+ ASSERT (ftell (fp) == 7);
+ ASSERT (fpurge (fp) == 0);
+ /* Verify that when discarding pending input, the file position is
+ advanced to match the end of the previously read input. */
+ if (check_filepos)
+ ASSERT (ftell (fp) == 8);
+ ASSERT (getc (fp) == EOF);
+ ASSERT (fclose (fp) == 0);
+
+ /* The file's contents is now "foogarsh". */
+
+ /* Ensure that purging a read does not corrupt subsequent writes. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ goto skip;
+ if (fseek (fp, -1, SEEK_END))
+ goto skip;
+ ASSERT (getc (fp) == 'h');
+ ASSERT (getc (fp) == EOF);
+ if (check_filepos)
+ ASSERT (ftell (fp) == 8);
+ ASSERT (fpurge (fp) == 0);
+ if (check_filepos)
+ ASSERT (ftell (fp) == 8);
+ ASSERT (putc ('!', fp) == '!');
+ ASSERT (fclose (fp) == 0);
+ fp = fopen (TESTFILE, "r");
+ if (fp == NULL)
+ goto skip;
+ {
+ char buf[10];
+ ASSERT (fread (buf, 1, 10, fp) == 9);
+ ASSERT (memcmp (buf, "foogarsh!", 9) == 0);
+ }
+ ASSERT (fclose (fp) == 0);
+
+ /* The file's contents is now "foogarsh!". */
+ }
+
+ remove (TESTFILE);
+ return 0;
+
+ skip:
+ fprintf (stderr, "Skipping test: prerequisite file operations failed.\n");
+ remove (TESTFILE);
+ return 77;
+}
diff --git a/gnulib/tests/test-freadable.c b/gnulib/tests/test-freadable.c
new file mode 100644
index 00000000..2aa6743c
--- /dev/null
+++ b/gnulib/tests/test-freadable.c
@@ -0,0 +1,117 @@
+/* Test of freadable() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if we are not using the gnulib fseek module. */
+#define _GL_NO_LARGE_FILES
+#include "freadable.h"
+
+#include <stdio.h>
+
+#include "macros.h"
+
+#define TESTFILE "t-freadable.tmp"
+
+int
+main ()
+{
+ FILE *fp;
+
+ /* Create a file with some contents. */
+ fp = fopen (TESTFILE, "w");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (!freadable (fp));
+ if (fwrite ("foobarsh", 1, 8, fp) < 8)
+ goto skip;
+ ASSERT (!freadable (fp));
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in read-only mode. */
+ fp = fopen (TESTFILE, "r");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fgetc (fp) != 'f')
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fseek (fp, 2, SEEK_CUR))
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fgetc (fp) != 'b')
+ goto skip;
+ ASSERT (freadable (fp));
+ fflush (fp);
+ ASSERT (freadable (fp));
+ if (fgetc (fp) != 'a')
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fseek (fp, 0, SEEK_END))
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in read-write mode. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fgetc (fp) != 'f')
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fseek (fp, 2, SEEK_CUR))
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fgetc (fp) != 'b')
+ goto skip;
+ ASSERT (freadable (fp));
+ fflush (fp);
+ ASSERT (freadable (fp));
+ if (fgetc (fp) != 'a')
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fputc ('z', fp) != 'z')
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fseek (fp, 0, SEEK_END))
+ goto skip;
+ ASSERT (freadable (fp));
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in append mode. */
+ fp = fopen (TESTFILE, "a");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (!freadable (fp));
+ if (fwrite ("bla", 1, 3, fp) < 3)
+ goto skip;
+ ASSERT (!freadable (fp));
+ if (fclose (fp))
+ goto skip;
+
+ return 0;
+
+ skip:
+ fprintf (stderr, "Skipping test: file operations failed.\n");
+ return 77;
+}
diff --git a/gnulib/tests/test-freadahead.c b/gnulib/tests/test-freadahead.c
new file mode 100644
index 00000000..3f34a421
--- /dev/null
+++ b/gnulib/tests/test-freadahead.c
@@ -0,0 +1,73 @@
+/* Test of freadahead() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "freadahead.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main (int argc, char **argv)
+{
+ int nbytes = atoi (argv[1]);
+ if (nbytes > 0)
+ {
+ void *buf = malloc (nbytes);
+ ASSERT (fread (buf, 1, nbytes, stdin) == nbytes);
+ }
+
+ if (nbytes == 0)
+ ASSERT (freadahead (stdin) == 0);
+ else
+ {
+ if (lseek (0, 0, SEEK_CUR) == nbytes)
+ /* An unbuffered stdio, such as BeOS or on uClibc compiled without
+ __STDIO_BUFFERS. */
+ ASSERT (freadahead (stdin) == 0);
+ else
+ {
+ /* Normal buffered stdio. */
+ size_t buffered;
+ int c, c2;
+
+ ASSERT (freadahead (stdin) != 0);
+ buffered = freadahead (stdin);
+
+ c = fgetc (stdin);
+ ASSERT (freadahead (stdin) == buffered - 1);
+ ungetc (c, stdin);
+ ASSERT (freadahead (stdin) == buffered);
+ c2 = fgetc (stdin);
+ ASSERT (c2 == c);
+ ASSERT (freadahead (stdin) == buffered - 1);
+
+ c = '@';
+ ungetc (c, stdin);
+ ASSERT (freadahead (stdin) == buffered);
+ c2 = fgetc (stdin);
+ ASSERT (c2 == c);
+ ASSERT (freadahead (stdin) == buffered - 1);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-freadahead.sh b/gnulib/tests/test-freadahead.sh
new file mode 100755
index 00000000..27cf5504
--- /dev/null
+++ b/gnulib/tests/test-freadahead.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+./test-freadahead${EXEEXT} 0 < "$srcdir/test-freadahead.sh" || exit 1
+./test-freadahead${EXEEXT} 5 < "$srcdir/test-freadahead.sh" || exit 1
+exit 0
diff --git a/gnulib/tests/test-freading.c b/gnulib/tests/test-freading.c
new file mode 100644
index 00000000..fee82284
--- /dev/null
+++ b/gnulib/tests/test-freading.c
@@ -0,0 +1,130 @@
+/* Test of freading() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if we are not using the gnulib fseek module. */
+#define _GL_NO_LARGE_FILES
+#include "freading.h"
+
+#include <stdio.h>
+
+#include "macros.h"
+
+#define TESTFILE "t-freading.tmp"
+
+int
+main (void)
+{
+ FILE *fp;
+
+ /* Create a file with some contents. Write-only file is never reading. */
+ fp = fopen (TESTFILE, "w");
+ ASSERT (fp);
+ ASSERT (!freading (fp));
+ ASSERT (fwrite ("foobarsh", 1, 8, fp) == 8);
+ ASSERT (!freading (fp));
+ ASSERT (fclose (fp) == 0);
+
+ /* Open it in read-only mode. Read-only file is always reading. */
+ fp = fopen (TESTFILE, "r");
+ ASSERT (fp);
+ ASSERT (freading (fp));
+ ASSERT (fgetc (fp) == 'f');
+ ASSERT (freading (fp));
+ ASSERT (fseek (fp, 2, SEEK_CUR) == 0);
+ ASSERT (freading (fp));
+ ASSERT (fgetc (fp) == 'b');
+ ASSERT (freading (fp));
+ fflush (fp);
+ ASSERT (freading (fp));
+ ASSERT (fgetc (fp) == 'a');
+ ASSERT (freading (fp));
+ ASSERT (fseek (fp, 0, SEEK_END) == 0);
+ ASSERT (freading (fp));
+ ASSERT (fclose (fp) == 0);
+
+ /* Open it in read-write mode. POSIX requires a reposition (fseek,
+ fsetpos, rewind) or EOF when transitioning from read to write;
+ freading is only deterministic after input or output, but this
+ test case should be portable even on open, after reposition, and
+ at EOF. */
+ /* First a scenario with only fgetc, fseek, fputc. */
+ fp = fopen (TESTFILE, "r+");
+ ASSERT (fp);
+ ASSERT (!freading (fp));
+ ASSERT (fgetc (fp) == 'f');
+ ASSERT (freading (fp));
+ ASSERT (fseek (fp, 2, SEEK_CUR) == 0);
+ /* freading (fp) is undefined here, but fwriting (fp) is false. */
+ ASSERT (fgetc (fp) == 'b');
+ ASSERT (freading (fp));
+ /* This fseek call is necessary when switching from reading to writing.
+ See the description of fopen(), ISO C 99 7.19.5.3.(6). */
+ ASSERT (fseek (fp, 0, SEEK_CUR) == 0);
+ /* freading (fp) is undefined here, but fwriting (fp) is false. */
+ ASSERT (fputc ('x', fp) == 'x');
+ ASSERT (!freading (fp));
+ ASSERT (fseek (fp, 0, SEEK_END) == 0);
+ /* freading (fp) is undefined here, because on some implementations (e.g.
+ glibc) fseek causes a buffer to be read.
+ fwriting (fp) is undefined as well. */
+ ASSERT (fclose (fp) == 0);
+
+ /* Open it in read-write mode. POSIX requires a reposition (fseek,
+ fsetpos, rewind) or EOF when transitioning from read to write;
+ freading is only deterministic after input or output, but this
+ test case should be portable even on open, after reposition, and
+ at EOF. */
+ /* Here a scenario that includes fflush. */
+ fp = fopen (TESTFILE, "r+");
+ ASSERT (fp);
+ ASSERT (!freading (fp));
+ ASSERT (fgetc (fp) == 'f');
+ ASSERT (freading (fp));
+ ASSERT (fseek (fp, 2, SEEK_CUR) == 0);
+ /* freading (fp) is undefined here, but fwriting (fp) is false. */
+ ASSERT (fgetc (fp) == 'b');
+ ASSERT (freading (fp));
+ fflush (fp);
+ /* freading (fp) is undefined here, but fwriting (fp) is false. */
+ ASSERT (fgetc (fp) == 'x');
+ ASSERT (freading (fp));
+ /* This fseek call is necessary when switching from reading to writing.
+ See the description of fopen(), ISO C 99 7.19.5.3.(6). */
+ ASSERT (fseek (fp, 0, SEEK_CUR) == 0);
+ /* freading (fp) is undefined here, but fwriting (fp) is false. */
+ ASSERT (fputc ('z', fp) == 'z');
+ ASSERT (!freading (fp));
+ ASSERT (fseek (fp, 0, SEEK_END) == 0);
+ /* freading (fp) is undefined here, because on some implementations (e.g.
+ glibc) fseek causes a buffer to be read.
+ fwriting (fp) is undefined as well. */
+ ASSERT (fclose (fp) == 0);
+
+ /* Open it in append mode. Write-only file is never reading. */
+ fp = fopen (TESTFILE, "a");
+ ASSERT (fp);
+ ASSERT (!freading (fp));
+ ASSERT (fwrite ("bla", 1, 3, fp) == 3);
+ ASSERT (!freading (fp));
+ ASSERT (fclose (fp) == 0);
+ ASSERT (remove (TESTFILE) == 0);
+ return 0;
+}
diff --git a/gnulib/tests/test-freadptr.c b/gnulib/tests/test-freadptr.c
new file mode 100644
index 00000000..f73b0fcd
--- /dev/null
+++ b/gnulib/tests/test-freadptr.c
@@ -0,0 +1,94 @@
+/* Test of freadptr() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "freadptr.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main (int argc, char **argv)
+{
+ int nbytes = atoi (argv[1]);
+ void *buf = malloc (nbytes);
+ ASSERT (fread (buf, 1, nbytes, stdin) == nbytes);
+
+ if (lseek (0, 0, SEEK_CUR) == nbytes)
+ {
+ /* An unbuffered stdio, such as BeOS or on uClibc compiled without
+ __STDIO_BUFFERS. Or stdin is a pipe. */
+ size_t size;
+ ASSERT (freadptr (stdin, &size) == NULL);
+ }
+ else
+ {
+ /* Normal buffered stdio. */
+ const char stdin_contents[] =
+ "#!/bin/sh\n\n./test-freadptr${EXEEXT} 5 < \"$srcdir/test-freadptr.sh\" || exit 1\ncat \"$srcdir/test-freadptr.sh\" | ./test-freadptr${EXEEXT} 5 || exit 1\nexit 0\n";
+ const char *expected = stdin_contents + nbytes;
+ size_t available1;
+ size_t available2;
+ size_t available3;
+
+ /* Test normal behaviour. */
+ {
+ const char *ptr = freadptr (stdin, &available1);
+
+ ASSERT (ptr != NULL);
+ ASSERT (available1 != 0);
+ ASSERT (available1 <= strlen (expected));
+ ASSERT (memcmp (ptr, expected, available1) == 0);
+ }
+
+ /* Test behaviour after normal ungetc. */
+ ungetc (fgetc (stdin), stdin);
+ {
+ const char *ptr = freadptr (stdin, &available2);
+
+ if (ptr != NULL)
+ {
+ ASSERT (available2 == available1);
+ ASSERT (memcmp (ptr, expected, available2) == 0);
+ }
+ }
+
+ /* Test behaviour after arbitrary ungetc. */
+ fgetc (stdin);
+ ungetc ('@', stdin);
+ {
+ const char *ptr = freadptr (stdin, &available3);
+
+ if (ptr != NULL)
+ {
+ ASSERT (available3 == 1 || available3 == available1);
+ ASSERT (ptr[0] == '@');
+ if (available3 > 1)
+ {
+ ASSERT (memcmp (ptr + 1, expected + 1, available3 - 1) == 0);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-freadptr.sh b/gnulib/tests/test-freadptr.sh
new file mode 100755
index 00000000..97819b29
--- /dev/null
+++ b/gnulib/tests/test-freadptr.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+./test-freadptr${EXEEXT} 5 < "$srcdir/test-freadptr.sh" || exit 1
+cat "$srcdir/test-freadptr.sh" | ./test-freadptr${EXEEXT} 5 || exit 1
+exit 0
diff --git a/gnulib/tests/test-freadptr2.c b/gnulib/tests/test-freadptr2.c
new file mode 100644
index 00000000..cec011c5
--- /dev/null
+++ b/gnulib/tests/test-freadptr2.c
@@ -0,0 +1,62 @@
+/* Test of freadptr() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "freadptr.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+static int
+freadptrbufsize (FILE *fp)
+{
+ size_t size = 0;
+
+ freadptr (fp, &size);
+ return size;
+}
+
+int
+main (int argc, char **argv)
+{
+ int nbytes = atoi (argv[1]);
+ if (nbytes > 0)
+ {
+ void *buf = malloc (nbytes);
+ ASSERT (fread (buf, 1, nbytes, stdin) == nbytes);
+ }
+
+ if (nbytes == 0)
+ ASSERT (freadptrbufsize (stdin) == 0);
+ else
+ {
+ if (lseek (0, 0, SEEK_CUR) == nbytes)
+ /* An unbuffered stdio, such as BeOS or on uClibc compiled without
+ __STDIO_BUFFERS. */
+ ASSERT (freadptrbufsize (stdin) == 0);
+ else
+ /* Normal buffered stdio. */
+ ASSERT (freadptrbufsize (stdin) != 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-freadptr2.sh b/gnulib/tests/test-freadptr2.sh
new file mode 100755
index 00000000..7634d85f
--- /dev/null
+++ b/gnulib/tests/test-freadptr2.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+./test-freadptr2${EXEEXT} 0 < "$srcdir/test-freadptr2.sh" || exit 1
+./test-freadptr2${EXEEXT} 5 < "$srcdir/test-freadptr2.sh" || exit 1
+exit 0
diff --git a/gnulib/tests/test-freadseek.c b/gnulib/tests/test-freadseek.c
new file mode 100644
index 00000000..1da24c18
--- /dev/null
+++ b/gnulib/tests/test-freadseek.c
@@ -0,0 +1,93 @@
+/* Test of freadseek() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "freadseek.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main (int argc, char **argv)
+{
+ static const char stdin_contents[] =
+ "#!/bin/sh\n\n./test-freadseek${EXEEXT} 5 19 6 7 18 9 19 < \"$srcdir/test-freadseek.sh\" || exit 1\ncat \"$srcdir/test-freadseek.sh\" | ./test-freadseek${EXEEXT} 5 19 6 7 18 9 19 || exit 1\nexit 0\n";
+ int nbytes1 = atoi (argv[1]);
+ int nbytes2 = atoi (argv[2]);
+ int nbytes3 = atoi (argv[3]);
+ int nbytes4 = atoi (argv[4]);
+ int nbytes5 = atoi (argv[5]);
+ int nbytes6 = atoi (argv[6]);
+ int nbytes7 = atoi (argv[7]);
+ void *buf1 = malloc (nbytes1);
+ void *buf3 = malloc (nbytes3);
+ void *buf5 = malloc (nbytes5);
+ void *buf7 = malloc (nbytes7);
+ /* A private variable to keep track of the position. */
+ size_t position = 0;
+
+ ASSERT (fread (buf1, 1, nbytes1, stdin) == nbytes1);
+ ASSERT (memcmp (buf1, stdin_contents + position, nbytes1) == 0);
+ position += nbytes1;
+
+ /* Test normal behaviour. */
+ ASSERT (freadseek (stdin, nbytes2) == 0);
+ position += nbytes2;
+
+ ASSERT (fread (buf3, 1, nbytes3, stdin) == nbytes3);
+ ASSERT (memcmp (buf3, stdin_contents + position, nbytes3) == 0);
+ position += nbytes3;
+
+ /* Test behaviour after normal ungetc. */
+ ungetc (fgetc (stdin), stdin);
+ ASSERT (freadseek (stdin, nbytes4) == 0);
+ position += nbytes4;
+
+ ASSERT (fread (buf5, 1, nbytes5, stdin) == nbytes5);
+ ASSERT (memcmp (buf5, stdin_contents + position, nbytes5) == 0);
+ position += nbytes5;
+
+ /* Test behaviour after arbitrary ungetc. */
+ fgetc (stdin);
+ ungetc ('@', stdin);
+ ASSERT (freadseek (stdin, nbytes6) == 0);
+ position += nbytes6;
+
+ ASSERT (fread (buf7, 1, nbytes7, stdin) == nbytes7);
+ ASSERT (memcmp (buf7, stdin_contents + position, nbytes7) == 0);
+ position += nbytes7;
+
+ /* Test move to end of file. */
+ ASSERT (freadseek (stdin, strlen (stdin_contents) - position) == 0);
+ ASSERT (fgetc (stdin) == EOF);
+ ASSERT (!ferror (stdin));
+
+#if !defined __MINT__ /* FreeMiNT has problems seeking past end of file */
+ /* Test move beyond end of file. */
+ ASSERT (freadseek (stdin, 1000000) == 0);
+ ASSERT (fgetc (stdin) == EOF);
+ ASSERT (!ferror (stdin));
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-freadseek.sh b/gnulib/tests/test-freadseek.sh
new file mode 100755
index 00000000..453cadfd
--- /dev/null
+++ b/gnulib/tests/test-freadseek.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+./test-freadseek${EXEEXT} 5 19 6 7 18 9 19 < "$srcdir/test-freadseek.sh" || exit 1
+cat "$srcdir/test-freadseek.sh" | ./test-freadseek${EXEEXT} 5 19 6 7 18 9 19 || exit 1
+exit 0
diff --git a/gnulib/tests/test-freopen-safer.c b/gnulib/tests/test-freopen-safer.c
new file mode 100644
index 00000000..4532fbd3
--- /dev/null
+++ b/gnulib/tests/test-freopen-safer.c
@@ -0,0 +1,97 @@
+/* Test of reopening a stream.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+/* Specification. */
+#include "stdio--.h"
+
+/* Helpers. */
+#include <unistd.h>
+
+/* This test intentionally closes stderr. So, we arrange to have fd 10
+ (outside the range of interesting fd's during the test) set up to
+ duplicate the original stderr. */
+
+#define BACKUP_STDERR_FILENO 10
+#define ASSERT_STREAM myerr
+#include "macros.h"
+
+static FILE *myerr;
+
+int
+main (void)
+{
+ FILE *fp;
+
+ /* We close fd 2 later, so save it in fd 10. */
+ if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO
+ || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL)
+ return 2;
+
+ {
+ FILE *tmp;
+ ASSERT (tmp = fopen ("/dev/null", "r"));
+ ASSERT (STDERR_FILENO < fileno (tmp));
+ ASSERT (fp = fopen ("/dev/null", "w"));
+ ASSERT (fileno (tmp) < fileno (fp));
+ ASSERT (fclose (tmp) == 0);
+ }
+
+ /* Gap in fds. */
+ ASSERT (freopen ("/dev/null", "r+", fp) == fp);
+ ASSERT (STDERR_FILENO < fileno (fp));
+
+ ASSERT (freopen ("/dev/null", "r", stdin) == stdin);
+ ASSERT (STDIN_FILENO == fileno (stdin));
+
+ ASSERT (freopen ("/dev/null", "w", stdout) == stdout);
+ ASSERT (STDOUT_FILENO == fileno (stdout));
+
+ ASSERT (freopen ("/dev/null", "w", stderr) == stderr);
+ ASSERT (STDERR_FILENO == fileno (stderr));
+
+ /* fd 0 closed. */
+ ASSERT (close (STDIN_FILENO) == 0);
+
+ ASSERT (freopen ("/dev/null", "w", stdout) == stdout);
+ ASSERT (STDOUT_FILENO == fileno (stdout));
+
+ ASSERT (freopen ("/dev/null", "w", stderr) == stderr);
+ ASSERT (STDERR_FILENO == fileno (stderr));
+
+ ASSERT (freopen ("/dev/null", "a", fp) == fp);
+ ASSERT (STDERR_FILENO < fileno (fp));
+
+ /* fd 1 closed. */
+ ASSERT (close (STDOUT_FILENO) == 0);
+
+ ASSERT (freopen ("/dev/null", "w", stderr) == stderr);
+ ASSERT (STDERR_FILENO == fileno (stderr));
+
+ ASSERT (freopen ("/dev/null", "a+", fp) == fp);
+ ASSERT (STDERR_FILENO < fileno (fp));
+
+ /* fd 2 closed. */
+ ASSERT (close (STDERR_FILENO) == 0);
+
+ ASSERT (freopen ("/dev/null", "w+", fp) == fp);
+ ASSERT (STDERR_FILENO < fileno (fp));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-freopen.c b/gnulib/tests/test-freopen.c
new file mode 100644
index 00000000..08214fa4
--- /dev/null
+++ b/gnulib/tests/test-freopen.c
@@ -0,0 +1,34 @@
+/* Test of opening a file stream.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (freopen, FILE *, (char const *, char const *, FILE *));
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (freopen ("/dev/null", "r", stdin) != NULL);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-frexp.c b/gnulib/tests/test-frexp.c
new file mode 100644
index 00000000..d5ab7e50
--- /dev/null
+++ b/gnulib/tests/test-frexp.c
@@ -0,0 +1,199 @@
+/* Test of splitting a double into fraction and mantissa.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (frexp, double, (double, int *));
+
+#include <float.h>
+
+#include "isnand-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* Avoid some warnings from "gcc -Wshadow".
+ This file doesn't use the exp() function. */
+#undef exp
+#define exp exponent
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zero instead. */
+double zero = 0.0;
+
+static double
+my_ldexp (double x, int d)
+{
+ for (; d > 0; d--)
+ x *= 2.0;
+ for (; d < 0; d++)
+ x *= 0.5;
+ return x;
+}
+
+int
+main ()
+{
+ int i;
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ when dealing with denormalized numbers. It is necessary on x86 systems
+ where double-floats are not IEEE compliant by default, to avoid that the
+ results become platform and compiler option dependent. 'volatile' is a
+ portable alternative to gcc's -ffloat-store option. */
+ volatile double x;
+
+ { /* NaN. */
+ int exp = -9999;
+ double mantissa;
+ x = NaNd ();
+ mantissa = frexp (x, &exp);
+ ASSERT (isnand (mantissa));
+ }
+
+ { /* Positive infinity. */
+ int exp = -9999;
+ double mantissa;
+ x = 1.0 / 0.0;
+ mantissa = frexp (x, &exp);
+ ASSERT (mantissa == x);
+ }
+
+ { /* Negative infinity. */
+ int exp = -9999;
+ double mantissa;
+ x = -1.0 / 0.0;
+ mantissa = frexp (x, &exp);
+ ASSERT (mantissa == x);
+ }
+
+ { /* Positive zero. */
+ int exp = -9999;
+ double mantissa;
+ x = 0.0;
+ mantissa = frexp (x, &exp);
+ ASSERT (exp == 0);
+ ASSERT (mantissa == x);
+ ASSERT (!signbit (mantissa));
+ }
+
+ { /* Negative zero. */
+ int exp = -9999;
+ double mantissa;
+ x = -zero;
+ mantissa = frexp (x, &exp);
+ ASSERT (exp == 0);
+ ASSERT (mantissa == x);
+ ASSERT (signbit (mantissa));
+ }
+
+ for (i = 1, x = 1.0; i <= DBL_MAX_EXP; i++, x *= 2.0)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.5);
+ }
+ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.5);
+ }
+ for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.5);
+ }
+
+ for (i = 1, x = -1.0; i <= DBL_MAX_EXP; i++, x *= 2.0)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == -0.5);
+ }
+ for (i = 1, x = -1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == -0.5);
+ }
+ for (; i >= DBL_MIN_EXP - 100 && x < 0.0; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == -0.5);
+ }
+
+ for (i = 1, x = 1.01; i <= DBL_MAX_EXP; i++, x *= 2.0)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.505);
+ }
+ for (i = 1, x = 1.01; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.505);
+ }
+ for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa >= 0.5);
+ ASSERT (mantissa < 1.0);
+ ASSERT (mantissa == my_ldexp (x, - exp));
+ }
+
+ for (i = 1, x = 1.73205; i <= DBL_MAX_EXP; i++, x *= 2.0)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.866025);
+ }
+ for (i = 1, x = 1.73205; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.866025);
+ }
+ for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = frexp (x, &exp);
+ ASSERT (exp == i || exp == i + 1);
+ ASSERT (mantissa >= 0.5);
+ ASSERT (mantissa < 1.0);
+ ASSERT (mantissa == my_ldexp (x, - exp));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-frexpl.c b/gnulib/tests/test-frexpl.c
new file mode 100644
index 00000000..8d9d41d2
--- /dev/null
+++ b/gnulib/tests/test-frexpl.c
@@ -0,0 +1,223 @@
+/* Test of splitting a 'long double' into fraction and mantissa.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (frexpl, long double, (long double, int *));
+
+#include <float.h>
+
+#include "fpucw.h"
+#include "isnanl-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* Avoid some warnings from "gcc -Wshadow".
+ This file doesn't use the exp() function. */
+#undef exp
+#define exp exponent
+
+/* On MIPS IRIX machines, LDBL_MIN_EXP is -1021, but the smallest reliable
+ exponent for 'long double' is -964. Similarly, on PowerPC machines,
+ LDBL_MIN_EXP is -1021, but the smallest reliable exponent for 'long double'
+ is -968. For exponents below that, the precision may be truncated to the
+ precision used for 'double'. */
+#ifdef __sgi
+# define MIN_NORMAL_EXP (LDBL_MIN_EXP + 57)
+#elif defined __ppc || defined __ppc__ || defined __powerpc || defined __powerpc__
+# define MIN_NORMAL_EXP (LDBL_MIN_EXP + 53)
+#else
+# define MIN_NORMAL_EXP LDBL_MIN_EXP
+#endif
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zero instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zero (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+long double minus_zero = -0.0L;
+#endif
+
+static long double
+my_ldexp (long double x, int d)
+{
+ for (; d > 0; d--)
+ x *= 2.0L;
+ for (; d < 0; d++)
+ x *= 0.5L;
+ return x;
+}
+
+int
+main ()
+{
+ int i;
+ long double x;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ { /* NaN. */
+ int exp = -9999;
+ long double mantissa;
+ x = NaNl ();
+ mantissa = frexpl (x, &exp);
+ ASSERT (isnanl (mantissa));
+ }
+
+ { /* Positive infinity. */
+ int exp = -9999;
+ long double mantissa;
+ x = 1.0L / 0.0L;
+ mantissa = frexpl (x, &exp);
+ ASSERT (mantissa == x);
+ }
+
+ { /* Negative infinity. */
+ int exp = -9999;
+ long double mantissa;
+ x = -1.0L / 0.0L;
+ mantissa = frexpl (x, &exp);
+ ASSERT (mantissa == x);
+ }
+
+ { /* Positive zero. */
+ int exp = -9999;
+ long double mantissa;
+ x = 0.0L;
+ mantissa = frexpl (x, &exp);
+ ASSERT (exp == 0);
+ ASSERT (mantissa == x);
+ ASSERT (!signbit (mantissa));
+ }
+
+ { /* Negative zero. */
+ int exp = -9999;
+ long double mantissa;
+ x = minus_zero;
+ mantissa = frexpl (x, &exp);
+ ASSERT (exp == 0);
+ ASSERT (mantissa == x);
+ ASSERT (signbit (mantissa));
+ }
+
+ for (i = 1, x = 1.0L; i <= LDBL_MAX_EXP; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.5L);
+ }
+ for (i = 1, x = 1.0L; i >= MIN_NORMAL_EXP; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.5L);
+ }
+ for (; i >= LDBL_MIN_EXP - 100 && x > 0.0L; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.5L);
+ }
+
+ for (i = 1, x = -1.0L; i <= LDBL_MAX_EXP; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == -0.5L);
+ }
+ for (i = 1, x = -1.0L; i >= MIN_NORMAL_EXP; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == -0.5L);
+ }
+ for (; i >= LDBL_MIN_EXP - 100 && x < 0.0L; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == -0.5L);
+ }
+
+ for (i = 1, x = 1.01L; i <= LDBL_MAX_EXP; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.505L);
+ }
+ for (i = 1, x = 1.01L; i >= MIN_NORMAL_EXP; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.505L);
+ }
+ for (; i >= LDBL_MIN_EXP - 100 && x > 0.0L; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa >= 0.5L);
+ ASSERT (mantissa < 1.0L);
+ ASSERT (mantissa == my_ldexp (x, - exp));
+ }
+
+ for (i = 1, x = 1.73205L; i <= LDBL_MAX_EXP; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.866025L);
+ }
+ for (i = 1, x = 1.73205L; i >= MIN_NORMAL_EXP; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i);
+ ASSERT (mantissa == 0.866025L);
+ }
+ for (; i >= LDBL_MIN_EXP - 100 && x > 0.0L; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = frexpl (x, &exp);
+ ASSERT (exp == i || exp == i + 1);
+ ASSERT (mantissa >= 0.5L);
+ ASSERT (mantissa < 1.0L);
+ ASSERT (mantissa == my_ldexp (x, - exp));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fseek.c b/gnulib/tests/test-fseek.c
new file mode 100644
index 00000000..46d5c8a9
--- /dev/null
+++ b/gnulib/tests/test-fseek.c
@@ -0,0 +1,70 @@
+/* Test of fseek() function.
+ Copyright (C) 2007, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if the user requested GNULIB_POSIXCHECK. */
+#define _GL_NO_LARGE_FILES
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fseek, int, (FILE *, long, int));
+
+#include "macros.h"
+
+#ifndef FUNC_UNGETC_BROKEN
+# define FUNC_UNGETC_BROKEN 0
+#endif
+
+int
+main (int argc, char **argv)
+{
+ /* Assume stdin is non-empty, seekable, and starts with '#!/bin/sh'
+ iff argc > 1. */
+ int expected = argc > 1 ? 0 : -1;
+ ASSERT (fseek (stdin, 0, SEEK_CUR) == expected);
+ if (argc > 1)
+ {
+ /* Test that fseek discards previously read ungetc data. */
+ int ch = fgetc (stdin);
+ ASSERT (ch == '#');
+ ASSERT (ungetc (ch, stdin) == ch);
+ ASSERT (fseek (stdin, 2, SEEK_SET) == 0);
+ ch = fgetc (stdin);
+ ASSERT (ch == '/');
+ if (2 < argc)
+ {
+ if (FUNC_UNGETC_BROKEN)
+ {
+ fputs ("Skipping test: ungetc cannot handle arbitrary bytes\n",
+ stderr);
+ return 77;
+ }
+ /* Test that fseek discards random ungetc data. */
+ ASSERT (ungetc (ch ^ 0xff, stdin) == (ch ^ 0xff));
+ }
+ ASSERT (fseek (stdin, 0, SEEK_END) == 0);
+ ASSERT (fgetc (stdin) == EOF);
+ /* Test that fseek resets end-of-file marker. */
+ ASSERT (feof (stdin));
+ ASSERT (fseek (stdin, 0, SEEK_END) == 0);
+ ASSERT (!feof (stdin));
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-fseek.sh b/gnulib/tests/test-fseek.sh
new file mode 100755
index 00000000..bad6c08d
--- /dev/null
+++ b/gnulib/tests/test-fseek.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+./test-fseek${EXEEXT} 1 < "$srcdir/test-fseek.sh" || exit 1
+echo hi | ./test-fseek${EXEEXT} || exit 1
+exit 0
diff --git a/gnulib/tests/test-fseek2.sh b/gnulib/tests/test-fseek2.sh
new file mode 100755
index 00000000..a4c9cb7f
--- /dev/null
+++ b/gnulib/tests/test-fseek2.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec ./test-fseek${EXEEXT} 1 2 < "$srcdir/test-fseek2.sh"
diff --git a/gnulib/tests/test-fseeko.c b/gnulib/tests/test-fseeko.c
new file mode 100644
index 00000000..be2a78dc
--- /dev/null
+++ b/gnulib/tests/test-fseeko.c
@@ -0,0 +1,74 @@
+/* Test of fseeko() function.
+ Copyright (C) 2007, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if we are not using the gnulib fseek module. */
+#define _GL_NO_LARGE_FILES
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fseeko, int, (FILE *, off_t, int));
+
+
+#include "macros.h"
+
+#ifndef FUNC_UNGETC_BROKEN
+# define FUNC_UNGETC_BROKEN 0
+#endif
+
+int
+main (int argc, char **argv _GL_UNUSED)
+{
+ /* Assume stdin is non-empty, seekable, and starts with '#!/bin/sh'
+ iff argc > 1. */
+ int expected = argc > 1 ? 0 : -1;
+ /* Exit with success only if fseek/fseeko agree. */
+ int r1 = fseeko (stdin, 0, SEEK_CUR);
+ int r2 = fseek (stdin, 0, SEEK_CUR);
+ ASSERT (r1 == r2 && r1 == expected);
+ if (argc > 1)
+ {
+ /* Test that fseek discards previously read ungetc data. */
+ int ch = fgetc (stdin);
+ ASSERT (ch == '#');
+ ASSERT (ungetc (ch, stdin) == ch);
+ ASSERT (fseeko (stdin, 2, SEEK_SET) == 0);
+ ch = fgetc (stdin);
+ ASSERT (ch == '/');
+ if (2 < argc)
+ {
+ if (FUNC_UNGETC_BROKEN)
+ {
+ fputs ("Skipping test: ungetc cannot handle arbitrary bytes\n",
+ stderr);
+ return 77;
+ }
+ /* Test that fseek discards random ungetc data. */
+ ASSERT (ungetc (ch ^ 0xff, stdin) == (ch ^ 0xff));
+ }
+ ASSERT (fseeko (stdin, 0, SEEK_END) == 0);
+ ASSERT (fgetc (stdin) == EOF);
+ /* Test that fseek resets end-of-file marker. */
+ ASSERT (feof (stdin));
+ ASSERT (fseeko (stdin, 0, SEEK_END) == 0);
+ ASSERT (!feof (stdin));
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-fseeko.sh b/gnulib/tests/test-fseeko.sh
new file mode 100755
index 00000000..5c558272
--- /dev/null
+++ b/gnulib/tests/test-fseeko.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+./test-fseeko${EXEEXT} 1 < "$srcdir/test-fseeko.sh" || exit 1
+echo hi | ./test-fseeko${EXEEXT} || exit 1
+exit 0
diff --git a/gnulib/tests/test-fseeko2.sh b/gnulib/tests/test-fseeko2.sh
new file mode 100755
index 00000000..6e1130cf
--- /dev/null
+++ b/gnulib/tests/test-fseeko2.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec ./test-fseeko${EXEEXT} 1 2 < "$srcdir/test-fseeko2.sh"
diff --git a/gnulib/tests/test-fseterr.c b/gnulib/tests/test-fseterr.c
new file mode 100644
index 00000000..c114f1a1
--- /dev/null
+++ b/gnulib/tests/test-fseterr.c
@@ -0,0 +1,44 @@
+/* Test setting the error indicator of a stream.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "fseterr.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ /* All streams are initially created with the error indicator cleared. */
+ if (ferror (stdout))
+ abort ();
+
+ /* Verify that fseterr() works. */
+ fseterr (stdout);
+ if (!ferror (stdout))
+ abort ();
+
+ /* Verify fseterr's effect can be undone by clearerr(). */
+ clearerr (stdout);
+ if (ferror (stdout))
+ abort ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fstatat.c b/gnulib/tests/test-fstatat.c
new file mode 100644
index 00000000..63e5a139
--- /dev/null
+++ b/gnulib/tests/test-fstatat.c
@@ -0,0 +1,82 @@
+/* Tests of fstatat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fstatat, int, (int, char const *, struct stat *, int));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "openat.h"
+#include "pathmax.h"
+#include "same-inode.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-fstatat.t"
+
+#include "test-lstat.h"
+#include "test-stat.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper around fstatat to test stat behavior. */
+static int
+do_stat (char const *name, struct stat *st)
+{
+ return statat (dfd, name, st);
+}
+
+/* Wrapper around fstatat to test lstat behavior. */
+static int
+do_lstat (char const *name, struct stat *st)
+{
+ return lstatat (dfd, name, st);
+}
+
+int
+main (void)
+{
+ int result;
+
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ result = test_stat_func (do_stat, false);
+ ASSERT (test_lstat_func (do_lstat, false) == result);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_stat_func (do_stat, false) == result);
+ ASSERT (test_lstat_func (do_lstat, false) == result);
+ ASSERT (close (dfd) == 0);
+
+ /* FIXME - add additional tests of dfd not at current directory. */
+
+ if (result == 77)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return result;
+}
diff --git a/gnulib/tests/test-fstrcmp.c b/gnulib/tests/test-fstrcmp.c
new file mode 100644
index 00000000..3cf24fb3
--- /dev/null
+++ b/gnulib/tests/test-fstrcmp.c
@@ -0,0 +1,79 @@
+/* Test of fuzzy string comparison.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "fstrcmp.h"
+
+#include <stdbool.h>
+
+#include "progname.h"
+#include "macros.h"
+
+static bool
+check_fstrcmp (const char *string1, const char *string2, double expected)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ before the addition and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that msgmerge results become platform and
+ compiler option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ {
+ volatile double result = fstrcmp (string1, string2);
+ if (!(result == expected))
+ return false;
+ }
+ {
+ volatile double result = fstrcmp_bounded (string1, string2, expected);
+ if (!(result == expected))
+ return false;
+ }
+ {
+ double bound = expected * 0.5; /* implies bound <= expected */
+ volatile double result = fstrcmp_bounded (string1, string2, bound);
+ if (!(result == expected))
+ return false;
+ }
+ {
+ double bound = (1 + expected) * 0.5;
+ if (expected < bound)
+ {
+ volatile double result = fstrcmp_bounded (string1, string2, bound);
+ if (!(result < bound))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ ASSERT (check_fstrcmp ("Langstrumpf", "Langstrumpf", 1.0));
+ ASSERT (check_fstrcmp ("Levenshtein", "Levenstein", 20./21.));
+ ASSERT (check_fstrcmp ("Levenstein", "Levenshtein", 20./21.));
+ ASSERT (check_fstrcmp ("xy", "yx", 1./2.));
+ ASSERT (check_fstrcmp ("George Bush", "Abraham Lincoln", 2./13.));
+ ASSERT (check_fstrcmp ("George Bush", "George \"Bugs\" Moran", 2./3.));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-fsync.c b/gnulib/tests/test-fsync.c
new file mode 100644
index 00000000..d540f83c
--- /dev/null
+++ b/gnulib/tests/test-fsync.c
@@ -0,0 +1,45 @@
+/* Test of fsync() function.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fsync, int, (int));
+
+#include <errno.h>
+#include <fcntl.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ int fd;
+ const char *file = "test-fsync.txt";
+
+ if (fsync (0) != 0)
+ ASSERT (errno == EINVAL);
+ fd = open (file, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ ASSERT (0 <= fd);
+ ASSERT (write (fd, "hello", 5) == 5);
+ ASSERT (fsync (fd) == 0);
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (file) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-ftell.c b/gnulib/tests/test-ftell.c
new file mode 100644
index 00000000..6ad8e0a9
--- /dev/null
+++ b/gnulib/tests/test-ftell.c
@@ -0,0 +1,107 @@
+/* Test of ftell() function.
+ Copyright (C) 2007, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if we are not using the gnulib fseek module. */
+#define _GL_NO_LARGE_FILES
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (ftell, long, (FILE *));
+
+#include "binary-io.h"
+#include "macros.h"
+
+#ifndef FUNC_UNGETC_BROKEN
+# define FUNC_UNGETC_BROKEN 0
+#endif
+
+int
+main (int argc, char **argv)
+{
+ int ch;
+ /* Assume stdin is seekable iff argc > 1. */
+ if (argc == 1)
+ {
+ ASSERT (ftell (stdin) == -1);
+ return 0;
+ }
+
+ /* mingw ftell is unreliable on text mode input. */
+ SET_BINARY (0);
+
+ /* Simple tests. */
+ ASSERT (ftell (stdin) == 0);
+
+ ch = fgetc (stdin);
+ ASSERT (ch == '#');
+ ASSERT (ftell (stdin) == 1);
+
+ /* Test ftell after ungetc of read input. */
+ ch = ungetc ('#', stdin);
+ ASSERT (ch == '#');
+ ASSERT (ftell (stdin) == 0);
+
+ ch = fgetc (stdin);
+ ASSERT (ch == '#');
+ ASSERT (ftell (stdin) == 1);
+
+ /* Test ftell after fseek. */
+ ASSERT (fseek (stdin, 2, SEEK_SET) == 0);
+ ASSERT (ftell (stdin) == 2);
+
+ /* Test ftell after random ungetc. */
+ ch = fgetc (stdin);
+ ASSERT (ch == '/');
+ ch = ungetc ('@', stdin);
+ ASSERT (ch == '@');
+ ASSERT (ftell (stdin) == 2);
+
+ ch = fgetc (stdin);
+ ASSERT (ch == '@');
+ ASSERT (ftell (stdin) == 3);
+
+ if (2 < argc)
+ {
+ if (FUNC_UNGETC_BROKEN)
+ {
+ fputs ("Skipping test: ungetc cannot handle arbitrary bytes\n",
+ stderr);
+ return 77;
+ }
+ /* Test ftell after ungetc without read. */
+ ASSERT (fseek (stdin, 0, SEEK_CUR) == 0);
+ ASSERT (ftell (stdin) == 3);
+
+ ch = ungetc ('~', stdin);
+ ASSERT (ch == '~');
+ ASSERT (ftell (stdin) == 2);
+ }
+
+#if !defined __MINT__ /* FreeMiNT has problems seeking past end of file */
+ /* Test ftell beyond end of file. */
+ ASSERT (fseek (stdin, 0, SEEK_END) == 0);
+ ch = ftell (stdin);
+ ASSERT (fseek (stdin, 10, SEEK_END) == 0);
+ ASSERT (ftell (stdin) == ch + 10);
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-ftell.sh b/gnulib/tests/test-ftell.sh
new file mode 100755
index 00000000..bf55d2e9
--- /dev/null
+++ b/gnulib/tests/test-ftell.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+./test-ftell${EXEEXT} 1 < "$srcdir/test-ftell.sh" || exit 1
+echo hi | ./test-ftell${EXEEXT} || exit 1
+exit 0
diff --git a/gnulib/tests/test-ftell2.sh b/gnulib/tests/test-ftell2.sh
new file mode 100755
index 00000000..3b645b83
--- /dev/null
+++ b/gnulib/tests/test-ftell2.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec ./test-ftell${EXEEXT} 1 2 < "$srcdir/test-ftell2.sh"
diff --git a/gnulib/tests/test-ftello.c b/gnulib/tests/test-ftello.c
new file mode 100644
index 00000000..5fae570f
--- /dev/null
+++ b/gnulib/tests/test-ftello.c
@@ -0,0 +1,118 @@
+/* Test of ftello() function.
+ Copyright (C) 2007, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if we are not using the gnulib fseek module. */
+#define _GL_NO_LARGE_FILES
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (ftello, off_t, (FILE *));
+
+#include "binary-io.h"
+#include "macros.h"
+
+#ifndef FUNC_UNGETC_BROKEN
+# define FUNC_UNGETC_BROKEN 0
+#endif
+
+int
+main (int argc, char **argv _GL_UNUSED)
+{
+ int ch;
+ /* Assume stdin is seekable iff argc > 1. */
+ if (argc == 1)
+ {
+ ASSERT (ftell (stdin) == -1);
+ ASSERT (ftello (stdin) == -1);
+ return 0;
+ }
+
+ /* mingw ftell is unreliable on text mode input. */
+ SET_BINARY (0);
+
+ /* Simple tests. For each test, make sure ftell and ftello agree. */
+ ASSERT (ftell (stdin) == 0);
+ ASSERT (ftello (stdin) == 0);
+
+ ch = fgetc (stdin);
+ ASSERT (ch == '#');
+ ASSERT (ftell (stdin) == 1);
+ ASSERT (ftello (stdin) == 1);
+
+ /* Test ftell after ungetc of read input. */
+ ch = ungetc ('#', stdin);
+ ASSERT (ch == '#');
+ ASSERT (ftell (stdin) == 0);
+ ASSERT (ftello (stdin) == 0);
+
+ ch = fgetc (stdin);
+ ASSERT (ch == '#');
+ ASSERT (ftell (stdin) == 1);
+ ASSERT (ftello (stdin) == 1);
+
+ /* Test ftell after fseek. */
+ ASSERT (fseek (stdin, 2, SEEK_SET) == 0);
+ ASSERT (ftell (stdin) == 2);
+ ASSERT (ftello (stdin) == 2);
+
+ /* Test ftell after random ungetc. */
+ ch = fgetc (stdin);
+ ASSERT (ch == '/');
+ ch = ungetc ('@', stdin);
+ ASSERT (ch == '@');
+ ASSERT (ftell (stdin) == 2);
+ ASSERT (ftello (stdin) == 2);
+
+ ch = fgetc (stdin);
+ ASSERT (ch == '@');
+ ASSERT (ftell (stdin) == 3);
+ ASSERT (ftello (stdin) == 3);
+
+ if (2 < argc)
+ {
+ if (FUNC_UNGETC_BROKEN)
+ {
+ fputs ("Skipping test: ungetc cannot handle arbitrary bytes\n",
+ stderr);
+ return 77;
+ }
+ /* Test ftell after ungetc without read. */
+ ASSERT (fseek (stdin, 0, SEEK_CUR) == 0);
+ ASSERT (ftell (stdin) == 3);
+ ASSERT (ftello (stdin) == 3);
+
+ ch = ungetc ('~', stdin);
+ ASSERT (ch == '~');
+ ASSERT (ftell (stdin) == 2);
+ ASSERT (ftello (stdin) == 2);
+ }
+
+#if !defined __MINT__ /* FreeMiNT has problems seeking past end of file */
+ /* Test ftell beyond end of file. */
+ ASSERT (fseek (stdin, 0, SEEK_END) == 0);
+ ch = ftello (stdin);
+ ASSERT (fseek (stdin, 10, SEEK_END) == 0);
+ ASSERT (ftell (stdin) == ch + 10);
+ ASSERT (ftello (stdin) == ch + 10);
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-ftello.sh b/gnulib/tests/test-ftello.sh
new file mode 100755
index 00000000..33d2e838
--- /dev/null
+++ b/gnulib/tests/test-ftello.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+./test-ftello${EXEEXT} 1 < "$srcdir/test-ftello.sh" || exit 1
+echo hi | ./test-ftello${EXEEXT} || exit 1
+exit 0
diff --git a/gnulib/tests/test-ftello2.sh b/gnulib/tests/test-ftello2.sh
new file mode 100755
index 00000000..ba750b00
--- /dev/null
+++ b/gnulib/tests/test-ftello2.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec ./test-ftello${EXEEXT} 1 2 < "$srcdir/test-ftello2.sh"
diff --git a/gnulib/tests/test-func.c b/gnulib/tests/test-func.c
new file mode 100644
index 00000000..476e04dd
--- /dev/null
+++ b/gnulib/tests/test-func.c
@@ -0,0 +1,40 @@
+/* Test whether __func__ is available
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (strlen (__func__) > 0);
+
+ /* On SunPRO C 5.9, sizeof __func__ evaluates to 0. The compiler warns:
+ "warning: null dimension: sizeof()". */
+#if !defined __SUNPRO_C
+ ASSERT (strlen (__func__) + 1 == sizeof __func__);
+#endif
+
+ ASSERT (strcmp (__func__, "main") == 0
+ || strcmp (__func__, "<unknown function>") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-futimens.c b/gnulib/tests/test-futimens.c
new file mode 100644
index 00000000..e555312e
--- /dev/null
+++ b/gnulib/tests/test-futimens.c
@@ -0,0 +1,51 @@
+/* Tests of futimens.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (futimens, int, (int, struct timespec const[2]));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "stat-time.h"
+#include "timespec.h"
+#include "utimecmp.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-futimens.t"
+
+#include "test-futimens.h"
+
+int
+main (void)
+{
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_futimens (futimens, true);
+}
diff --git a/gnulib/tests/test-futimens.h b/gnulib/tests/test-futimens.h
new file mode 100644
index 00000000..97c7acdd
--- /dev/null
+++ b/gnulib/tests/test-futimens.h
@@ -0,0 +1,148 @@
+/* Test of file timestamp modification functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include "test-utimens-common.h"
+
+/* This file is designed to test both gl_futimens(a,NULL,b) and
+ futimens(a,b). FUNC is the function to test. Assumes that BASE
+ and ASSERT are already defined. If PRINT, warn before skipping
+ tests with status 77. */
+static int
+test_futimens (int (*func) (int, struct timespec const *),
+ bool print)
+{
+ int fd = creat (BASE "file", 0600);
+ int result;
+ struct stat st1;
+ struct stat st2;
+ ASSERT (0 <= fd);
+
+ /* Sanity check. */
+ ASSERT (fstat (fd, &st1) == 0);
+ nap ();
+ errno = 0;
+ result = func (fd, NULL);
+ if (result == -1 && errno == ENOSYS)
+ {
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (BASE "file") == 0);
+ if (print)
+ fputs ("skipping test: "
+ "setting fd time not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (!result);
+ ASSERT (fstat (fd, &st2) == 0);
+ /* If utimens truncates to less resolution than the file system
+ supports, then time can appear to go backwards between now and a
+ follow-up utimens with UTIME_NOW or a NULL timespec. Use
+ UTIMECMP_TRUNCATE_SOURCE to compensate, with st1 as the
+ source. */
+ ASSERT (0 <= utimecmp (BASE "file", &st2, &st1, UTIMECMP_TRUNCATE_SOURCE));
+ if (check_ctime)
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+ {
+ /* On some NFS systems, the 'now' timestamp of creat or a NULL
+ timespec is determined by the server, but the 'now' timestamp
+ determined by gettime() (as is done when using UTIME_NOW) is
+ determined by the client; since the two machines are not
+ necessarily on the same clock, this is another case where time
+ can appear to go backwards. The rest of this test cares about
+ client time, so manually use gettime() to set both times. */
+ struct timespec ts[2];
+ gettime (&ts[0]);
+ ts[1] = ts[0];
+ ASSERT (func (fd, ts) == 0);
+ ASSERT (fstat (fd, &st1) == 0);
+ nap ();
+ }
+
+ /* Invalid arguments. */
+ errno = 0;
+ ASSERT (func (AT_FDCWD, NULL) == -1);
+ ASSERT (errno == EBADF);
+ {
+ struct timespec ts[2] = { { Y2K, UTIME_BOGUS_POS }, { Y2K, 0 } };
+ errno = 0;
+ ASSERT (func (fd, ts) == -1);
+ ASSERT (errno == EINVAL);
+ }
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, UTIME_BOGUS_NEG } };
+ errno = 0;
+ ASSERT (func (fd, ts) == -1);
+ ASSERT (errno == EINVAL);
+ }
+ ASSERT (fstat (fd, &st2) == 0);
+ ASSERT (st1.st_atime == st2.st_atime);
+ ASSERT (get_stat_atime_ns (&st1) == get_stat_atime_ns (&st2));
+ ASSERT (utimecmp (BASE "file", &st1, &st2, 0) == 0);
+
+ /* Set both times. */
+ {
+ struct timespec ts[2] = { { Y2K, BILLION / 2 - 1 }, { Y2K, BILLION - 1 } };
+ ASSERT (func (fd, ts) == 0);
+ ASSERT (fstat (fd, &st2) == 0);
+ ASSERT (st2.st_atime == Y2K);
+ ASSERT (0 <= get_stat_atime_ns (&st2));
+ ASSERT (get_stat_atime_ns (&st2) < BILLION / 2);
+ ASSERT (st2.st_mtime == Y2K);
+ ASSERT (0 <= get_stat_mtime_ns (&st2));
+ ASSERT (get_stat_mtime_ns (&st2) < BILLION);
+ if (check_ctime)
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+ }
+
+ /* Play with UTIME_OMIT, UTIME_NOW. */
+ {
+ struct stat st3;
+ struct timespec ts[2] = { { BILLION, UTIME_OMIT }, { 0, UTIME_NOW } };
+ nap ();
+ ASSERT (func (fd, ts) == 0);
+ ASSERT (fstat (fd, &st3) == 0);
+ ASSERT (st3.st_atime == Y2K);
+ ASSERT (0 <= get_stat_atime_ns (&st3));
+ ASSERT (get_stat_atime_ns (&st3) <= BILLION / 2);
+ ASSERT (utimecmp (BASE "file", &st1, &st3, 0) <= 0);
+ if (check_ctime)
+ ASSERT (st2.st_ctime < st3.st_ctime
+ || (st2.st_ctime == st3.st_ctime
+ && get_stat_ctime_ns (&st2) < get_stat_ctime_ns (&st3)));
+ nap ();
+ ts[0].tv_nsec = 0;
+ ts[1].tv_nsec = UTIME_OMIT;
+ ASSERT (func (fd, ts) == 0);
+ ASSERT (fstat (fd, &st2) == 0);
+ ASSERT (st2.st_atime == BILLION);
+ ASSERT (get_stat_atime_ns (&st2) == 0);
+ ASSERT (st3.st_mtime == st2.st_mtime);
+ ASSERT (get_stat_mtime_ns (&st3) == get_stat_mtime_ns (&st2));
+ if (check_ctime)
+ ASSERT (st3.st_ctime < st2.st_ctime
+ || (st3.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st3) < get_stat_ctime_ns (&st2)));
+ }
+
+ /* Cleanup. */
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (BASE "file") == 0);
+ return 0;
+}
diff --git a/gnulib/tests/test-fwritable.c b/gnulib/tests/test-fwritable.c
new file mode 100644
index 00000000..ab6ca95f
--- /dev/null
+++ b/gnulib/tests/test-fwritable.c
@@ -0,0 +1,117 @@
+/* Test of fwritable() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if we are not using the gnulib fseek module. */
+#define _GL_NO_LARGE_FILES
+#include "fwritable.h"
+
+#include <stdio.h>
+
+#include "macros.h"
+
+#define TESTFILE "t-fwritable.tmp"
+
+int
+main ()
+{
+ FILE *fp;
+
+ /* Create a file with some contents. */
+ fp = fopen (TESTFILE, "w");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fwrite ("foobarsh", 1, 8, fp) < 8)
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in read-only mode. */
+ fp = fopen (TESTFILE, "r");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (!fwritable (fp));
+ if (fgetc (fp) != 'f')
+ goto skip;
+ ASSERT (!fwritable (fp));
+ if (fseek (fp, 2, SEEK_CUR))
+ goto skip;
+ ASSERT (!fwritable (fp));
+ if (fgetc (fp) != 'b')
+ goto skip;
+ ASSERT (!fwritable (fp));
+ fflush (fp);
+ ASSERT (!fwritable (fp));
+ if (fgetc (fp) != 'a')
+ goto skip;
+ ASSERT (!fwritable (fp));
+ if (fseek (fp, 0, SEEK_END))
+ goto skip;
+ ASSERT (!fwritable (fp));
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in read-write mode. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fgetc (fp) != 'f')
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fseek (fp, 2, SEEK_CUR))
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fgetc (fp) != 'b')
+ goto skip;
+ ASSERT (fwritable (fp));
+ fflush (fp);
+ ASSERT (fwritable (fp));
+ if (fgetc (fp) != 'a')
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fputc ('z', fp) != 'z')
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fseek (fp, 0, SEEK_END))
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in append mode. */
+ fp = fopen (TESTFILE, "a");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fwrite ("bla", 1, 3, fp) < 3)
+ goto skip;
+ ASSERT (fwritable (fp));
+ if (fclose (fp))
+ goto skip;
+
+ return 0;
+
+ skip:
+ fprintf (stderr, "Skipping test: file operations failed.\n");
+ return 77;
+}
diff --git a/gnulib/tests/test-fwriting.c b/gnulib/tests/test-fwriting.c
new file mode 100644
index 00000000..d44d0034
--- /dev/null
+++ b/gnulib/tests/test-fwriting.c
@@ -0,0 +1,164 @@
+/* Test of fwriting() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ fseek link warning if we are not using the gnulib fseek module. */
+#define _GL_NO_LARGE_FILES
+#include "fwriting.h"
+
+#include <stdio.h>
+
+#include "macros.h"
+
+#define TESTFILE "t-fwriting.tmp"
+
+int
+main ()
+{
+ FILE *fp;
+
+ /* Create a file with some contents. Write-only file is always writing. */
+ fp = fopen (TESTFILE, "w");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (fwriting (fp));
+ if (fwrite ("foobarsh", 1, 8, fp) < 8)
+ goto skip;
+ ASSERT (fwriting (fp));
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in read-only mode. Read-only file is never writing. */
+ fp = fopen (TESTFILE, "r");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fgetc (fp) != 'f')
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fseek (fp, 2, SEEK_CUR))
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fgetc (fp) != 'b')
+ goto skip;
+ ASSERT (!fwriting (fp));
+ fflush (fp);
+ ASSERT (!fwriting (fp));
+ if (fgetc (fp) != 'a')
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fseek (fp, 0, SEEK_END))
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in read-write mode. POSIX requires a reposition (fseek,
+ fsetpos, rewind) or fflush when transitioning from write to read,
+ fwriting is only deterministic after input or output, but this
+ test case should be portable even on open, after reposition, and
+ after fflush. */
+ /* First a scenario with only fgetc, fseek, fputc. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fgetc (fp) != 'f')
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fseek (fp, 2, SEEK_CUR))
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fgetc (fp) != 'b')
+ goto skip;
+ ASSERT (!fwriting (fp));
+ /* This fseek call is necessary when switching from reading to writing.
+ See the description of fopen(), ISO C 99 7.19.5.3.(6). */
+ if (fseek (fp, 0, SEEK_CUR) != 0)
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fputc ('x', fp) != 'x')
+ goto skip;
+ ASSERT (fwriting (fp));
+ if (fseek (fp, 0, SEEK_END))
+ goto skip;
+ /* freading (fp) is undefined here, because on some implementations (e.g.
+ glibc) fseek causes a buffer to be read.
+ fwriting (fp) is undefined as well. */
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in read-write mode. POSIX requires a reposition (fseek,
+ fsetpos, rewind) or fflush when transitioning from write to read,
+ fwriting is only deterministic after input or output, but this
+ test case should be portable even on open, after reposition, and
+ after fflush. */
+ /* Here a scenario that includes fflush. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fgetc (fp) != 'f')
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fseek (fp, 2, SEEK_CUR))
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fgetc (fp) != 'b')
+ goto skip;
+ ASSERT (!fwriting (fp));
+ fflush (fp);
+ ASSERT (!fwriting (fp));
+ if (fgetc (fp) != 'x')
+ goto skip;
+ ASSERT (!fwriting (fp));
+ /* This fseek call is necessary when switching from reading to writing.
+ See the description of fopen(), ISO C 99 7.19.5.3.(6). */
+ if (fseek (fp, 0, SEEK_CUR) != 0)
+ goto skip;
+ ASSERT (!fwriting (fp));
+ if (fputc ('z', fp) != 'z')
+ goto skip;
+ ASSERT (fwriting (fp));
+ if (fseek (fp, 0, SEEK_END))
+ goto skip;
+ /* freading (fp) is undefined here, because on some implementations (e.g.
+ glibc) fseek causes a buffer to be read.
+ fwriting (fp) is undefined as well. */
+ if (fclose (fp))
+ goto skip;
+
+ /* Open it in append mode. */
+ fp = fopen (TESTFILE, "a");
+ if (fp == NULL)
+ goto skip;
+ ASSERT (fwriting (fp));
+ if (fwrite ("bla", 1, 3, fp) < 3)
+ goto skip;
+ ASSERT (fwriting (fp));
+ if (fclose (fp))
+ goto skip;
+
+ return 0;
+
+ skip:
+ fprintf (stderr, "Skipping test: file operations failed.\n");
+ return 77;
+}
diff --git a/gnulib/tests/test-gc-arcfour.c b/gnulib/tests/test-gc-arcfour.c
new file mode 100644
index 00000000..e84903ad
--- /dev/null
+++ b/gnulib/tests/test-gc-arcfour.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ gc_cipher_handle ctx;
+ /* Test vector from Cryptlib via Libgcrypt labeled there: "from the
+ State/Commerce Department". */
+ static char key_1[] = { 0x61, 0x8A, 0x63, 0xD2, 0xFB };
+ static char plaintext_1[] = { 0xDC, 0xEE, 0x4C, 0xF9, 0x2C };
+ static const char ciphertext_1[] = { 0xF1, 0x38, 0x29, 0xC9, 0xDE };
+ char scratch[16];
+ Gc_rc rc;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ rc = gc_cipher_open (GC_ARCFOUR40, GC_STREAM, &ctx);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_setkey (ctx, sizeof (key_1), key_1);
+ if (rc != GC_OK)
+ return 1;
+
+ memcpy (scratch, plaintext_1, sizeof (plaintext_1));
+ rc = gc_cipher_encrypt_inline (ctx, sizeof (plaintext_1), scratch);
+ if (rc != GC_OK)
+ return 1;
+
+ if (memcmp (scratch, ciphertext_1, sizeof (ciphertext_1)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", ciphertext_1[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ /* decrypt */
+
+ rc = gc_cipher_setkey (ctx, sizeof (key_1), key_1);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_decrypt_inline (ctx, sizeof (plaintext_1), scratch);
+ if (rc != GC_OK)
+ return 1;
+
+ if (memcmp (scratch, plaintext_1, sizeof (plaintext_1)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", plaintext_1[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-arctwo.c b/gnulib/tests/test-gc-arctwo.c
new file mode 100644
index 00000000..e46b38ee
--- /dev/null
+++ b/gnulib/tests/test-gc-arctwo.c
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ gc_cipher_handle ctx;
+ /* Test vectors from RFC 2268. */
+ static char key[8] = "\xff\xff\xff\xff\xff\xff\xff\xff";
+ static char plaintext[8] = "\xff\xff\xff\xff\xff\xff\xff\xff";
+ static const char ciphertext[8] = "\x27\x8b\x27\xe4\x2e\x2f\x0d\x49";
+ char scratch[16];
+ Gc_rc rc;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ rc = gc_cipher_open (GC_ARCTWO40, GC_ECB, &ctx);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_setkey (ctx, sizeof (key), key);
+ if (rc != GC_OK)
+ return 1;
+
+ memcpy (scratch, plaintext, sizeof (plaintext));
+ rc = gc_cipher_encrypt_inline (ctx, sizeof (plaintext), scratch);
+ if (rc != GC_OK)
+ return 1;
+
+ if (memcmp (scratch, ciphertext, sizeof (ciphertext)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", ciphertext[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ /* decrypt */
+
+ rc = gc_cipher_setkey (ctx, sizeof (key), key);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_decrypt_inline (ctx, sizeof (plaintext), scratch);
+ if (rc != GC_OK)
+ return 1;
+
+ if (memcmp (scratch, plaintext, sizeof (plaintext)))
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", plaintext[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 5; i++)
+ printf ("%02x ", scratch[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-des.c b/gnulib/tests/test-gc-des.c
new file mode 100644
index 00000000..69b17acd
--- /dev/null
+++ b/gnulib/tests/test-gc-des.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ gc_cipher_handle ctx;
+ Gc_rc rc;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ /*
+ * DES Maintenance Test
+ */
+ {
+ int i;
+ char key[8] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
+ char input[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ char result[8] = { 0x24, 0x6e, 0x9d, 0xb9, 0xc5, 0x50, 0x38, 0x1a };
+ char temp1[8], temp2[8], temp3[8];
+
+ for (i = 0; i < 64; ++i)
+ {
+
+ rc = gc_cipher_open (GC_DES, GC_ECB, &ctx);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_setkey (ctx, 8, key);
+ if (rc != GC_OK)
+ return 1;
+
+ memcpy (temp1, input, 8);
+ rc = gc_cipher_encrypt_inline (ctx, 8, temp1);
+ if (rc != GC_OK)
+ return 1;
+
+ memcpy (temp2, temp1, 8);
+ rc = gc_cipher_encrypt_inline (ctx, 8, temp2);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_setkey (ctx, 8, temp2);
+ if (rc != GC_OK)
+ return 1;
+
+ memcpy (temp3, temp1, 8);
+ rc = gc_cipher_decrypt_inline (ctx, 8, temp3);
+ if (rc != GC_OK)
+ return 1;
+
+ memcpy (key, temp3, 8);
+ memcpy (input, temp1, 8);
+ }
+ if (memcmp (temp3, result, 8))
+ return 1;
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-hmac-md5.c b/gnulib/tests/test-gc-hmac-md5.c
new file mode 100644
index 00000000..f843eed5
--- /dev/null
+++ b/gnulib/tests/test-gc-hmac-md5.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ Gc_rc rc;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ /* Test vectors from RFC 2104. */
+
+ {
+ char *key =
+ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
+ size_t key_len = 16;
+ char *data = "Hi There";
+ size_t data_len = 8;
+ char *digest =
+ "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d";
+ char out[16];
+
+ /*
+ key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
+ key_len = 16 bytes
+ data = "Hi There"
+ data_len = 8 bytes
+ digest = 0x9294727a3638bb1c13f48ef8158bfc9d
+ */
+
+ if (gc_hmac_md5 (key, key_len, data, data_len, out) != 0)
+ {
+ printf ("call failure\n");
+ return 1;
+ }
+
+ if (memcmp (digest, out, 16) != 0)
+ {
+ size_t i;
+ printf ("hash 1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", digest[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-hmac-sha1.c b/gnulib/tests/test-gc-hmac-sha1.c
new file mode 100644
index 00000000..3da31969
--- /dev/null
+++ b/gnulib/tests/test-gc-hmac-sha1.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ Gc_rc rc;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ {
+ char *key =
+ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
+ size_t key_len = 16;
+ char *data = "Hi There";
+ size_t data_len = 8;
+ char *digest =
+ "\x67\x5b\x0b\x3a\x1b\x4d\xdf\x4e\x12\x48"
+ "\x72\xda\x6c\x2f\x63\x2b\xfe\xd9\x57\xe9";
+ char out[GC_SHA1_DIGEST_SIZE];
+
+ if (gc_hmac_sha1 (key, key_len, data, data_len, out) != 0)
+ {
+ printf ("call failure\n");
+ return 1;
+ }
+
+ if (memcmp (digest, out, GC_SHA1_DIGEST_SIZE) != 0)
+ {
+ size_t i;
+ printf ("hash 1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", digest[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-md2.c b/gnulib/tests/test-gc-md2.c
new file mode 100644
index 00000000..8cb1ffa2
--- /dev/null
+++ b/gnulib/tests/test-gc-md2.c
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ Gc_rc rc;
+ gc_hash_handle h;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ /* Test vectors from RFC 1319. */
+
+ {
+ char *in = "abcdefghijklmnopqrstuvwxyz";
+ size_t inlen = strlen (in);
+ char *expect =
+ "\x4e\x8d\xdf\xf3\x65\x02\x92\xab\x5a\x41\x08\xc3\xaa\x47\x94\x0b";
+ char out[16];
+ const char *p;
+
+ if (gc_md2 (in, inlen, out) != 0)
+ {
+ printf ("gc_md2 call failed\n");
+ return 1;
+ }
+
+ if (memcmp (out, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md2 1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (gc_hash_buffer (GC_MD2, in, inlen, out) != 0)
+ {
+ printf ("gc_hash_buffer(MD2) call failed\n");
+ return 1;
+ }
+
+ if (memcmp (out, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md2 2 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (gc_hash_digest_length (GC_MD2) != 16)
+ {
+ printf ("gc_hash_digest_length (GC_MD2) failed\n");
+ return 1;
+ }
+
+ if ((rc = gc_hash_open (GC_MD2, 0, &h)) != GC_OK)
+ {
+ printf ("gc_hash_open(GC_MD2) failed (%d)\n", rc);
+ return 1;
+ }
+
+ gc_hash_write (h, inlen, in);
+
+ p = gc_hash_read (h);
+
+ if (!p)
+ {
+ printf ("gc_hash_read failed\n");
+ return 1;
+ }
+
+ if (memcmp (p, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md2 3 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", p[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ gc_hash_close (h);
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-md4.c b/gnulib/tests/test-gc-md4.c
new file mode 100644
index 00000000..9d8083a9
--- /dev/null
+++ b/gnulib/tests/test-gc-md4.c
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ Gc_rc rc;
+ gc_hash_handle h;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ /* Test vectors from RFC 1320. */
+
+ {
+ const char *in = "abc";
+ size_t inlen = strlen (in);
+ const char *expect =
+ "\xa4\x48\x01\x7a\xaf\x21\xd8\x52\x5f\xc1\x0a\xe8\x7a\xa6\x72\x9d";
+ char out[16];
+ const char *p;
+
+ /* MD4 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b */
+
+ if (gc_md4 (in, inlen, out) != 0)
+ {
+ printf ("gc_md4 call failed\n");
+ return 1;
+ }
+
+ if (memcmp (out, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md4 1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (gc_hash_buffer (GC_MD4, in, inlen, out) != 0)
+ {
+ printf ("gc_hash_buffer(MD4) call failed\n");
+ return 1;
+ }
+
+ if (memcmp (out, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md4 1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (gc_hash_digest_length (GC_MD4) != 16)
+ {
+ printf ("gc_hash_digest_length (GC_MD4) failed\n");
+ return 1;
+ }
+
+ if ((rc = gc_hash_open (GC_MD4, 0, &h)) != GC_OK)
+ {
+ printf ("gc_hash_open(GC_MD4) failed (%d)\n", rc);
+ return 1;
+ }
+
+ gc_hash_write (h, inlen, in);
+
+ p = gc_hash_read (h);
+
+ if (!p)
+ {
+ printf ("gc_hash_read failed\n");
+ return 1;
+ }
+
+ if (memcmp (p, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md4 1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", p[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ gc_hash_close (h);
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-md5.c b/gnulib/tests/test-gc-md5.c
new file mode 100644
index 00000000..5a12e485
--- /dev/null
+++ b/gnulib/tests/test-gc-md5.c
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ Gc_rc rc;
+ gc_hash_handle h;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ /* Test vectors from RFC 1321. */
+
+ {
+ char *in = "abcdefghijklmnopqrstuvwxyz";
+ size_t inlen = strlen (in);
+ char *expect =
+ "\xc3\xfc\xd3\xd7\x61\x92\xe4\x00\x7d\xfb\x49\x6c\xca\x67\xe1\x3b";
+ char out[16];
+ const char *p;
+
+ /* MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b */
+
+ if (gc_md5 (in, inlen, out) != 0)
+ {
+ printf ("gc_md5 call failed\n");
+ return 1;
+ }
+
+ if (memcmp (out, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md5 1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (gc_hash_buffer (GC_MD5, in, inlen, out) != 0)
+ {
+ printf ("gc_hash_buffer(MD5) call failed\n");
+ return 1;
+ }
+
+ if (memcmp (out, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md5 2 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (gc_hash_digest_length (GC_MD5) != 16)
+ {
+ printf ("gc_hash_digest_length (GC_MD5) failed\n");
+ return 1;
+ }
+
+ if ((rc = gc_hash_open (GC_MD5, 0, &h)) != GC_OK)
+ {
+ printf ("gc_hash_open(GC_MD5) failed (%d)\n", rc);
+ return 1;
+ }
+
+ gc_hash_write (h, inlen, in);
+
+ p = gc_hash_read (h);
+
+ if (!p)
+ {
+ printf ("gc_hash_read failed\n");
+ return 1;
+ }
+
+ if (memcmp (p, expect, 16) != 0)
+ {
+ size_t i;
+ printf ("md5 3 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", p[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ gc_hash_close (h);
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-pbkdf2-sha1.c b/gnulib/tests/test-gc-pbkdf2-sha1.c
new file mode 100644
index 00000000..d0e6189e
--- /dev/null
+++ b/gnulib/tests/test-gc-pbkdf2-sha1.c
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2002, 2003, 2004, 2005, 2007, 2010 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "gc.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/* Test vectors from RFC 3962. */
+
+#define G_CLEF "\xF0\x9D\x84\x9E"
+
+struct pkcs5
+{
+ int iterations;
+ const char *password;
+ const char *salt;
+ int dklen;
+ const char *expected;
+};
+const struct pkcs5 pkcs5[] = {
+ {1, "password", "ATHENA.MIT.EDUraeburn", 16,
+ "\xCD\xED\xB5\x28\x1B\xB2\xF8\x01\x56\x5A\x11\x22\xB2\x56\x35\x15"},
+ {2, "password", "ATHENA.MIT.EDUraeburn", 16,
+ "\x01\xdb\xee\x7f\x4a\x9e\x24\x3e\x98\x8b\x62\xc7\x3c\xda\x93\x5d"},
+ {2, "password", "ATHENA.MIT.EDUraeburn", 32,
+ "\x01\xdb\xee\x7f\x4a\x9e\x24\x3e\x98\x8b\x62\xc7\x3c\xda\x93\x5d"
+ "\xa0\x53\x78\xb9\x32\x44\xec\x8f\x48\xa9\x9e\x61\xad\x79\x9d\x86"},
+ {1200, "password", "ATHENA.MIT.EDUraeburn", 16,
+ "\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b"},
+ {1200, "password", "ATHENA.MIT.EDUraeburn", 32,
+ "\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b"
+ "\xa7\xe5\x2d\xdb\xc5\xe5\x14\x2f\x70\x8a\x31\xe2\xe6\x2b\x1e\x13"},
+ {5, "password", "\x12\x34\x56\x78\x78\x56\x34\x12\x00", 16,
+ "\xd1\xda\xa7\x86\x15\xf2\x87\xe6\xa1\xc8\xb1\x20\xd7\x06\x2a\x49"},
+ {5, "password", "\x12\x34\x56\x78\x78\x56\x34\x12\x00", 32,
+ "\xd1\xda\xa7\x86\x15\xf2\x87\xe6\xa1\xc8\xb1\x20\xd7\x06\x2a\x49"
+ "\x3f\x98\xd2\x03\xe6\xbe\x49\xa6\xad\xf4\xfa\x57\x4b\x6e\x64\xee"},
+ {1200, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+ "pass phrase equals block size", 16,
+ "\x13\x9c\x30\xc0\x96\x6b\xc3\x2b\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9"},
+ {1200, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+ "pass phrase equals block size", 32,
+ "\x13\x9c\x30\xc0\x96\x6b\xc3\x2b\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9"
+ "\xc5\xec\x59\xf1\xa4\x52\xf5\xcc\x9a\xd9\x40\xfe\xa0\x59\x8e\xd1"},
+ {1200, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+ "pass phrase exceeds block size", 16,
+ "\x9c\xca\xd6\xd4\x68\x77\x0c\xd5\x1b\x10\xe6\xa6\x87\x21\xbe\x61"},
+ {1200, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+ "pass phrase exceeds block size", 32,
+ "\x9c\xca\xd6\xd4\x68\x77\x0c\xd5\x1b\x10\xe6\xa6\x87\x21\xbe\x61"
+ "\x1a\x8b\x4d\x28\x26\x01\xdb\x3b\x36\xbe\x92\x46\x91\x5e\xc8\x2a"},
+ {50, G_CLEF "\x00", "EXAMPLE.COMpianist", 16,
+ "\x6b\x9c\xf2\x6d\x45\x45\x5a\x43\xa5\xb8\xbb\x27\x6a\x40\x3b\x39"},
+ {50, G_CLEF "\x00", "EXAMPLE.COMpianist", 32,
+ "\x6b\x9c\xf2\x6d\x45\x45\x5a\x43\xa5\xb8\xbb\x27\x6a\x40\x3b\x39"
+ "\xe7\xfe\x37\xa0\xc4\x1e\x02\xc2\x81\xff\x30\x69\xe1\xe9\x4f\x52"},
+ {500, "All n-entities must communicate with other n-entities via n-1 "
+ "entiteeheehees", "\x12\x34\x56\x78\x78\x56\x34\x12\x00", 16,
+ "\x6A\x89\x70\xBF\x68\xC9\x2C\xAE\xA8\x4A\x8D\xF2\x85\x10\x85\x86"}
+};
+
+int
+main (int argc, char *argv[])
+{
+ size_t i;
+ int rc;
+ char out[BUFSIZ];
+
+ for (i = 0; i < sizeof (pkcs5) / sizeof (pkcs5[0]); i++)
+ {
+ rc = gc_pbkdf2_sha1 (pkcs5[i].password, strlen (pkcs5[i].password),
+ pkcs5[i].salt, strlen (pkcs5[i].salt),
+ pkcs5[i].iterations, out, pkcs5[i].dklen);
+ if (rc != GC_OK)
+ {
+ printf ("PKCS5 entry %ld failed fatally: %d\n",
+ (unsigned long) i, rc);
+ return 1;
+ }
+
+ if (memcmp (pkcs5[i].expected, out, pkcs5[i].dklen) != 0)
+ {
+ printf ("PKCS5 entry %ld failed\n", (unsigned long) i);
+ return 1;
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-rijndael.c b/gnulib/tests/test-gc-rijndael.c
new file mode 100644
index 00000000..33981d02
--- /dev/null
+++ b/gnulib/tests/test-gc-rijndael.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ Gc_rc rc;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ {
+ char buf[16];
+ char key[] = "\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00";
+ char pt[] = "\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00";
+ char ct[] = "\xC3\x4C\x05\x2C\xC0\xDA\x8D\x73"
+ "\x45\x1A\xFE\x5F\x03\xBE\x29\x7F";
+ gc_cipher_handle ctx;
+ size_t i;
+
+ rc = gc_cipher_open (GC_AES128, GC_ECB, &ctx);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_setkey (ctx, 16, key);
+ if (rc != GC_OK)
+ return 1;
+
+ memcpy (buf, pt, 16);
+
+ for (i = 0; i < 10000; i++)
+ {
+ rc = gc_cipher_encrypt_inline (ctx, 16, buf);
+ if (rc != GC_OK)
+ {
+ printf ("encrypt failed %d\n", rc);
+ return 1;
+ }
+ }
+
+ if (memcmp (buf, ct, 16) != 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", ct[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ for (i = 0; i < 10000; i++)
+ {
+ rc = gc_cipher_decrypt_inline (ctx, 16, buf);
+ if (rc != GC_OK)
+ {
+ printf ("decrypt failed %d\n", rc);
+ return 1;
+ }
+ }
+
+ if (memcmp (buf, pt, 16) != 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", pt[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ gc_cipher_close (ctx);
+ }
+
+
+ {
+ char buf[16];
+ char iv[] = "\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00";
+ char key[] = "\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00";
+ char pt[] = "\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00";
+ char ct[] = "\x66\xe9\x4b\xd4\xef\x8a\x2c\x3b"
+ "\x88\x4c\xfa\x59\xca\x34\x2b\x2e";
+ gc_cipher_handle ctx;
+ size_t i;
+
+ rc = gc_cipher_open (GC_AES128, GC_CBC, &ctx);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_setkey (ctx, 16, key);
+ if (rc != GC_OK)
+ return 1;
+
+ rc = gc_cipher_setiv (ctx, 16, iv);
+ if (rc != GC_OK)
+ return 1;
+
+ memcpy (buf, pt, 16);
+
+ for (i = 0; i < 10000; i++)
+ {
+ rc = gc_cipher_encrypt_inline (ctx, 16, buf);
+ if (rc != GC_OK)
+ {
+ printf ("encrypt failed %d\n", rc);
+ return 1;
+ }
+ }
+
+ if (memcmp (buf, ct, 16) != 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", ct[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ gc_cipher_close (ctx);
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc-sha1.c b/gnulib/tests/test-gc-sha1.c
new file mode 100644
index 00000000..0bdae5e7
--- /dev/null
+++ b/gnulib/tests/test-gc-sha1.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ Gc_rc rc;
+ gc_hash_handle h;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ {
+ char *in = "abcdefgh";
+ size_t inlen = strlen (in);
+ char *expect = "\x42\x5a\xf1\x2a\x07\x43\x50\x2b"
+ "\x32\x2e\x93\xa0\x15\xbc\xf8\x68\xe3\x24\xd5\x6a";
+ char out[20];
+ const char *p;
+
+ if (gc_sha1 (in, inlen, out) != 0)
+ {
+ printf ("gc_sha1 call failed\n");
+ return 1;
+ }
+
+ if (memcmp (out, expect, 20) != 0)
+ {
+ size_t i;
+ printf ("sha1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ rc = gc_hash_buffer (GC_SHA1, "abcdefgh", 8, out);
+ if (rc != GC_OK)
+ {
+ printf ("gc_hash_buffer(sha1) call failed: %d\n", rc);
+ return 1;
+ }
+
+ if (memcmp (out, expect, 20) != 0)
+ {
+ size_t i;
+ printf ("sha1' mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (gc_hash_digest_length (GC_SHA1) != 20)
+ {
+ printf ("gc_hash_digest_length (GC_SHA1) failed\n");
+ return 1;
+ }
+
+ if ((rc = gc_hash_open (GC_SHA1, 0, &h)) != GC_OK)
+ {
+ printf ("gc_hash_open(GC_SHA1) failed (%d)\n", rc);
+ return 1;
+ }
+
+ gc_hash_write (h, inlen, in);
+
+ p = gc_hash_read (h);
+
+ if (!p)
+ {
+ printf ("gc_hash_read failed\n");
+ return 1;
+ }
+
+ if (memcmp (p, expect, 20) != 0)
+ {
+ size_t i;
+ printf ("sha1 1 mismatch. expected:\n");
+ for (i = 0; i < 20; i++)
+ printf ("%02x ", expect[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 20; i++)
+ printf ("%02x ", p[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ gc_hash_close (h);
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gc.c b/gnulib/tests/test-gc.c
new file mode 100644
index 00000000..b5bc27a8
--- /dev/null
+++ b/gnulib/tests/test-gc.c
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2005, 2006, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "gc.h"
+
+int
+main (int argc, char *argv[])
+{
+ Gc_rc rc;
+
+ rc = gc_init ();
+ if (rc != GC_OK)
+ {
+ printf ("gc_init() failed\n");
+ return 1;
+ }
+
+ gc_done ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-getaddrinfo.c b/gnulib/tests/test-getaddrinfo.c
new file mode 100644
index 00000000..bd245b42
--- /dev/null
+++ b/gnulib/tests/test-getaddrinfo.c
@@ -0,0 +1,187 @@
+/* Test the getaddrinfo module.
+
+ Copyright (C) 2006-2010 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <netdb.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (freeaddrinfo, void, (struct addrinfo *));
+SIGNATURE_CHECK (gai_strerror, char const *, (int));
+SIGNATURE_CHECK (getaddrinfo, int, (char const *, char const *,
+ struct addrinfo const *,
+ struct addrinfo **));
+
+#include <arpa/inet.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <string.h>
+
+/* Whether to print debugging messages. */
+#define ENABLE_DEBUGGING 0
+
+#if ENABLE_DEBUGGING
+# define dbgprintf printf
+#else
+# define dbgprintf if (0) printf
+#endif
+
+/* BeOS does not have AF_UNSPEC. */
+#ifndef AF_UNSPEC
+# define AF_UNSPEC 0
+#endif
+
+#ifndef EAI_SERVICE
+# define EAI_SERVICE 0
+#endif
+
+static int
+simple (char const *host, char const *service)
+{
+ char buf[BUFSIZ];
+ static int skip = 0;
+ struct addrinfo hints;
+ struct addrinfo *ai0, *ai;
+ int res;
+ int err;
+
+ /* Once we skipped the test, do not try anything else */
+ if (skip)
+ return 0;
+
+ dbgprintf ("Finding %s service %s...\n", host, service);
+
+ /* This initializes "hints" but does not use it. Is there a reason
+ for this? If so, please fix this comment. */
+ memset (&hints, 0, sizeof (hints));
+ hints.ai_flags = AI_CANONNAME;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+
+ res = getaddrinfo (host, service, 0, &ai0);
+ err = errno;
+
+ dbgprintf ("res %d: %s\n", res, gai_strerror (res));
+
+ if (res != 0)
+ {
+ /* EAI_AGAIN is returned if no network is available. Don't fail
+ the test merely because someone is down the country on their
+ in-law's farm. */
+ if (res == EAI_AGAIN)
+ {
+ skip++;
+ fprintf (stderr, "skipping getaddrinfo test: no network?\n");
+ return 77;
+ }
+ /* IRIX reports EAI_NONAME for "https". Don't fail the test
+ merely because of this. */
+ if (res == EAI_NONAME)
+ return 0;
+ /* Solaris reports EAI_SERVICE for "http" and "https". Don't
+ fail the test merely because of this. */
+ if (res == EAI_SERVICE)
+ return 0;
+#ifdef EAI_NODATA
+ /* AIX reports EAI_NODATA for "https". Don't fail the test
+ merely because of this. */
+ if (res == EAI_NODATA)
+ return 0;
+#endif
+ /* Provide details if errno was set. */
+ if (res == EAI_SYSTEM)
+ dbgprintf ("system error: %s\n", strerror (err));
+
+ return 1;
+ }
+
+ for (ai = ai0; ai; ai = ai->ai_next)
+ {
+ dbgprintf ("\tflags %x\n", ai->ai_flags);
+ dbgprintf ("\tfamily %x\n", ai->ai_family);
+ dbgprintf ("\tsocktype %x\n", ai->ai_socktype);
+ dbgprintf ("\tprotocol %x\n", ai->ai_protocol);
+ dbgprintf ("\taddrlen %ld: ", (unsigned long) ai->ai_addrlen);
+ dbgprintf ("\tFound %s\n",
+ inet_ntop (ai->ai_family,
+ &((struct sockaddr_in *)
+ ai->ai_addr)->sin_addr,
+ buf, sizeof (buf) - 1));
+ if (ai->ai_canonname)
+ dbgprintf ("\tFound %s...\n", ai->ai_canonname);
+
+ {
+ char ipbuf[BUFSIZ];
+ char portbuf[BUFSIZ];
+
+ res = getnameinfo (ai->ai_addr, ai->ai_addrlen,
+ ipbuf, sizeof (ipbuf) - 1,
+ portbuf, sizeof (portbuf) - 1,
+ NI_NUMERICHOST|NI_NUMERICSERV);
+ dbgprintf ("\t\tgetnameinfo %d: %s\n", res, gai_strerror (res));
+ if (res == 0)
+ {
+ dbgprintf ("\t\tip %s\n", ipbuf);
+ dbgprintf ("\t\tport %s\n", portbuf);
+ }
+ }
+
+ }
+
+ freeaddrinfo (ai0);
+
+ return 0;
+}
+
+#define HOST1 "www.gnu.org"
+#define SERV1 "http"
+#define HOST2 "www.ibm.com"
+#define SERV2 "https"
+#define HOST3 "microsoft.com"
+#define SERV3 "http"
+#define HOST4 "google.org"
+#define SERV4 "ldap"
+
+int main (void)
+{
+#if _WIN32
+ {
+ WORD requested;
+ WSADATA data;
+ int err;
+
+ requested = MAKEWORD (1, 1);
+ err = WSAStartup (requested, &data);
+ if (err != 0)
+ return 1;
+
+ if (data.wVersion < requested)
+ {
+ WSACleanup ();
+ return 2;
+ }
+ }
+#endif
+
+ return simple (HOST1, SERV1)
+ + simple (HOST2, SERV2)
+ + simple (HOST3, SERV3)
+ + simple (HOST4, SERV4);
+}
diff --git a/gnulib/tests/test-getcwd.c b/gnulib/tests/test-getcwd.c
new file mode 100644
index 00000000..2502b02c
--- /dev/null
+++ b/gnulib/tests/test-getcwd.c
@@ -0,0 +1,76 @@
+/* Test of getcwd() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (getcwd, char *, (char *, size_t));
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char **argv)
+{
+ char *pwd1;
+ char *pwd2;
+ /* If the user provides an argument, attempt to chdir there first. */
+ if (1 < argc)
+ {
+ if (chdir (argv[1]) == 0)
+ printf ("changed to directory %s\n", argv[1]);
+ }
+
+ pwd1 = getcwd (NULL, 0);
+ ASSERT (pwd1 && *pwd1);
+ if (1 < argc)
+ printf ("cwd=%s\n", pwd1);
+
+ /* Make sure the result is usable. */
+ ASSERT (chdir (pwd1) == 0);
+ ASSERT (chdir ("././.") == 0);
+
+ /* Make sure that result is normalized. */
+ pwd2 = getcwd (NULL, 0);
+ ASSERT (pwd2);
+ ASSERT (strcmp (pwd1, pwd2) == 0);
+ free (pwd2);
+ {
+ size_t len = strlen (pwd1);
+ ssize_t i = len - 10;
+ if (i < 0)
+ i = 0;
+ pwd2 = malloc (len + 2);
+ for ( ; i < len; i++)
+ ASSERT (getcwd (pwd2, i) == NULL);
+ pwd2 = getcwd (pwd2, len + 1);
+ ASSERT (pwd2);
+ pwd2[len] = '/';
+ pwd2[len + 1] = '\0';
+ }
+ ASSERT (strstr (pwd2, "/./") == NULL);
+ ASSERT (strstr (pwd2, "/../") == NULL);
+
+ free (pwd1);
+ free (pwd2);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-getdate.c b/gnulib/tests/test-getdate.c
new file mode 100644
index 00000000..5f7095c5
--- /dev/null
+++ b/gnulib/tests/test-getdate.c
@@ -0,0 +1,255 @@
+/* Test of getdate() function.
+ Copyright (C) 2008, 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#include <config.h>
+
+#include "getdate.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "progname.h"
+#include "macros.h"
+
+#ifdef DEBUG
+#define LOG(str, now, res) \
+ printf ("string `%s' diff %d %d\n", \
+ str, res.tv_sec - now.tv_sec, res.tv_nsec - now.tv_nsec);
+#else
+#define LOG(str, now, res) (void) 0
+#endif
+
+static const char* const day_table[] =
+{
+ "SUNDAY",
+ "MONDAY",
+ "TUESDAY",
+ "WEDNESDAY",
+ "THURSDAY",
+ "FRIDAY",
+ "SATURDAY",
+ NULL
+};
+
+int
+main (int argc _GL_UNUSED, char **argv)
+{
+ struct timespec result;
+ struct timespec result2;
+ struct timespec now;
+ const char *p;
+ int i;
+
+ set_program_name (argv[0]);
+
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "now";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ ASSERT (now.tv_sec == result.tv_sec && now.tv_nsec == result.tv_nsec);
+
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "tomorrow";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ ASSERT (now.tv_sec + 24 * 60 * 60 == result.tv_sec
+ && now.tv_nsec == result.tv_nsec);
+
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "yesterday";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ ASSERT (now.tv_sec - 24 * 60 * 60 == result.tv_sec
+ && now.tv_nsec == result.tv_nsec);
+
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "4 hours";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ ASSERT (now.tv_sec + 4 * 60 * 60 == result.tv_sec
+ && now.tv_nsec == result.tv_nsec);
+
+ /* test if timezone is not being ignored for day offset */
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC+400 +24 hours";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ p = "UTC+400 +1 day";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+
+ /* test if several time zones formats are handled same way */
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC+14:00";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ p = "UTC+14";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+ p = "UTC+1400";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC-14:00";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ p = "UTC-14";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+ p = "UTC-1400";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC+0:15";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ p = "UTC+0015";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC-1:30";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ p = "UTC-130";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+
+
+ /* TZ out of range should cause get_date failure */
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC+25:00";
+ ASSERT (!get_date (&result, p, &now));
+
+ /* Check for several invalid countable dayshifts */
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC+4:00 +40 yesterday";
+ ASSERT (!get_date (&result, p, &now));
+ p = "UTC+4:00 next yesterday";
+ ASSERT (!get_date (&result, p, &now));
+ p = "UTC+4:00 tomorrow ago";
+ ASSERT (!get_date (&result, p, &now));
+ p = "UTC+4:00 40 now ago";
+ ASSERT (!get_date (&result, p, &now));
+ p = "UTC+4:00 last tomorrow";
+ ASSERT (!get_date (&result, p, &now));
+ p = "UTC+4:00 -4 today";
+ ASSERT (!get_date (&result, p, &now));
+
+ /* And check correct usage of dayshifts */
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC+400 tomorrow";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ p = "UTC+400 +1 day";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC+400 yesterday";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ p = "UTC+400 1 day ago";
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ p = "UTC+400 now";
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ p = "UTC+400 +0 minutes"; /* silly, but simple "UTC+400" is different*/
+ ASSERT (get_date (&result2, p, &now));
+ LOG (p, now, result2);
+ ASSERT (result.tv_sec == result2.tv_sec
+ && result.tv_nsec == result2.tv_nsec);
+
+ /* Check that some "next Monday", "last Wednesday", etc. are correct. */
+ setenv ("TZ", "UTC0", 1);
+ for (i = 0; day_table[i]; i++)
+ {
+ unsigned int thur2 = 7 * 24 * 3600; /* 2nd thursday */
+ char tmp[32];
+ sprintf (tmp, "NEXT %s", day_table[i]);
+ now.tv_sec = thur2 + 4711;
+ now.tv_nsec = 1267;
+ ASSERT (get_date (&result, tmp, &now));
+ LOG (tmp, now, result);
+ ASSERT (result.tv_nsec == 0);
+ ASSERT (result.tv_sec == thur2 + (i == 4 ? 7 : (i + 3) % 7) * 24 * 3600);
+
+ sprintf (tmp, "LAST %s", day_table[i]);
+ now.tv_sec = thur2 + 4711;
+ now.tv_nsec = 1267;
+ ASSERT (get_date (&result, tmp, &now));
+ LOG (tmp, now, result);
+ ASSERT (result.tv_nsec == 0);
+ ASSERT (result.tv_sec == thur2 + ((i + 3) % 7 - 7) * 24 * 3600);
+ }
+
+ p = "THURSDAY UTC+00"; /* The epoch was on Thursday. */
+ now.tv_sec = 0;
+ now.tv_nsec = 0;
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ ASSERT (result.tv_sec == now.tv_sec
+ && result.tv_nsec == now.tv_nsec);
+
+ p = "FRIDAY UTC+00";
+ now.tv_sec = 0;
+ now.tv_nsec = 0;
+ ASSERT (get_date (&result, p, &now));
+ LOG (p, now, result);
+ ASSERT (result.tv_sec == 24 * 3600
+ && result.tv_nsec == now.tv_nsec);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-getdelim.c b/gnulib/tests/test-getdelim.c
new file mode 100644
index 00000000..a5df49f1
--- /dev/null
+++ b/gnulib/tests/test-getdelim.c
@@ -0,0 +1,95 @@
+/* Test of getdelim() function.
+ Copyright (C) 2007-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (getdelim, ssize_t, (char **, size_t *, int, FILE *));
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ FILE *f;
+ char *line;
+ size_t len;
+ ssize_t result;
+
+ /* Create test file. */
+ f = fopen ("test-getdelim.txt", "wb");
+ if (!f || fwrite ("anAnbcnd\0f", 1, 10, f) != 10 || fclose (f) != 0)
+ {
+ fputs ("Failed to create sample file.\n", stderr);
+ remove ("test-getdelim.txt");
+ return 1;
+ }
+ f = fopen ("test-getdelim.txt", "rb");
+ if (!f)
+ {
+ fputs ("Failed to reopen sample file.\n", stderr);
+ remove ("test-getdelim.txt");
+ return 1;
+ }
+
+ /* Test initial allocation, which must include trailing NUL. */
+ line = NULL;
+ len = 0;
+ result = getdelim (&line, &len, 'n', f);
+ ASSERT (result == 2);
+ ASSERT (strcmp (line, "an") == 0);
+ ASSERT (2 < len);
+ free (line);
+
+ /* Test initial allocation again, with line = NULL and len != 0. */
+ line = NULL;
+ len = (size_t)(~0) / 4;
+ result = getdelim (&line, &len, 'n', f);
+ ASSERT (result == 2);
+ ASSERT (strcmp (line, "An") == 0);
+ ASSERT (2 < len);
+ free (line);
+
+ /* Test growth of buffer. */
+ line = malloc (1);
+ len = 1;
+ result = getdelim (&line, &len, 'n', f);
+ ASSERT (result == 3);
+ ASSERT (strcmp (line, "bcn") == 0);
+ ASSERT (3 < len);
+
+ /* Test embedded NULs and EOF behavior. */
+ result = getdelim (&line, &len, 'n', f);
+ ASSERT (result == 3);
+ ASSERT (memcmp (line, "d\0f", 4) == 0);
+ ASSERT (3 < len);
+
+ result = getdelim (&line, &len, 'n', f);
+ ASSERT (result == -1);
+
+ free (line);
+ fclose (f);
+ remove ("test-getdelim.txt");
+ return 0;
+}
diff --git a/gnulib/tests/test-getdtablesize.c b/gnulib/tests/test-getdtablesize.c
new file mode 100644
index 00000000..20e18732
--- /dev/null
+++ b/gnulib/tests/test-getdtablesize.c
@@ -0,0 +1,34 @@
+/* Test of getdtablesize() function.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (getdtablesize, int, (void));
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ ASSERT (getdtablesize () >= 3);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-getgroups.c b/gnulib/tests/test-getgroups.c
new file mode 100644
index 00000000..1cc726e8
--- /dev/null
+++ b/gnulib/tests/test-getgroups.c
@@ -0,0 +1,78 @@
+/* Tests of getgroups.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (getgroups, int, (int, gid_t[]));
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "macros.h"
+
+int
+main (int argc, char **argv _GL_UNUSED)
+{
+ int result;
+ gid_t *groups;
+
+ errno = 0;
+ result = getgroups (0, NULL);
+ if (result == -1 && errno == ENOSYS)
+ {
+ fputs ("skipping test: no support for groups\n", stderr);
+ return 77;
+ }
+ ASSERT (0 <= result);
+ ASSERT (result + 1 < SIZE_MAX / sizeof *groups);
+ groups = malloc ((result + 1) * sizeof *groups);
+ ASSERT (groups);
+ groups[result] = -1;
+ /* Check for EINVAL handling. Not all processes have supplemental
+ groups, and getgroups does not have to return the effective gid,
+ so a result of 0 is reasonable. Also, we can't test for EINVAL
+ if result is 1, because of how getgroups treats 0. */
+ if (1 < result)
+ {
+ errno = 0;
+ ASSERT (getgroups (result - 1, groups) == -1);
+ ASSERT (errno == EINVAL);
+ }
+ ASSERT (getgroups (result, groups) == result);
+ ASSERT (getgroups (result + 1, groups) == result);
+ ASSERT (groups[result] == -1);
+ errno = 0;
+ ASSERT (getgroups (-1, NULL) == -1);
+ ASSERT (errno == EINVAL);
+
+ /* The automated unit test, with no arguments, ends here. However,
+ for debugging purposes, you can pass a command-line argument to
+ list the returned groups. */
+ if (1 < argc)
+ {
+ int i;
+ for (i = 0; i < result; i++)
+ printf ("%d\n", (int) groups[i]);
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-gethostname.c b/gnulib/tests/test-gethostname.c
new file mode 100644
index 00000000..c500f416
--- /dev/null
+++ b/gnulib/tests/test-gethostname.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson.
+ *
+ * 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/>. */
+
+#include <config.h>
+
+/* Get gethostname() declaration. */
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (gethostname, int, (char *, size_t));
+
+/* Get HOST_NAME_MAX definition. */
+#include <limits.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#define NOHOSTNAME "magic-gnulib-test-string"
+
+int
+main (int argc, char *argv[] _GL_UNUSED)
+{
+ char buf[HOST_NAME_MAX];
+ int rc;
+
+ if (strlen (NOHOSTNAME) >= HOST_NAME_MAX)
+ {
+ printf ("HOST_NAME_MAX impossibly small?! %d\n", HOST_NAME_MAX);
+ return 2;
+ }
+
+ strcpy (buf, NOHOSTNAME);
+
+ rc = gethostname (buf, sizeof (buf));
+
+ if (rc != 0)
+ {
+ printf ("gethostname failed, rc %d errno %d\n", rc, errno);
+ return 1;
+ }
+
+ if (strcmp (buf, NOHOSTNAME) == 0)
+ {
+ printf ("gethostname left buffer untouched.\n");
+ return 1;
+ }
+
+ if (argc > 1)
+ printf ("hostname: %s\n", buf);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-getline.c b/gnulib/tests/test-getline.c
new file mode 100644
index 00000000..6a661ce5
--- /dev/null
+++ b/gnulib/tests/test-getline.c
@@ -0,0 +1,95 @@
+/* Test of getline() function.
+ Copyright (C) 2007-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (getline, ssize_t, (char **, size_t *, FILE *));
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ FILE *f;
+ char *line;
+ size_t len;
+ ssize_t result;
+
+ /* Create test file. */
+ f = fopen ("test-getline.txt", "wb");
+ if (!f || fwrite ("a\nA\nbc\nd\0f", 1, 10, f) != 10 || fclose (f) != 0)
+ {
+ fputs ("Failed to create sample file.\n", stderr);
+ remove ("test-getline.txt");
+ return 1;
+ }
+ f = fopen ("test-getline.txt", "rb");
+ if (!f)
+ {
+ fputs ("Failed to reopen sample file.\n", stderr);
+ remove ("test-getline.txt");
+ return 1;
+ }
+
+ /* Test initial allocation, which must include trailing NUL. */
+ line = NULL;
+ len = 0;
+ result = getline (&line, &len, f);
+ ASSERT (result == 2);
+ ASSERT (strcmp (line, "a\n") == 0);
+ ASSERT (2 < len);
+ free (line);
+
+ /* Test initial allocation again, with line = NULL and len != 0. */
+ line = NULL;
+ len = (size_t)(~0) / 4;
+ result = getline (&line, &len, f);
+ ASSERT (result == 2);
+ ASSERT (strcmp (line, "A\n") == 0);
+ ASSERT (2 < len);
+ free (line);
+
+ /* Test growth of buffer, must not leak. */
+ line = malloc (1);
+ len = 0;
+ result = getline (&line, &len, f);
+ ASSERT (result == 3);
+ ASSERT (strcmp (line, "bc\n") == 0);
+ ASSERT (3 < len);
+
+ /* Test embedded NULs and EOF behavior. */
+ result = getline (&line, &len, f);
+ ASSERT (result == 3);
+ ASSERT (memcmp (line, "d\0f", 4) == 0);
+ ASSERT (3 < len);
+
+ result = getline (&line, &len, f);
+ ASSERT (result == -1);
+
+ free (line);
+ fclose (f);
+ remove ("test-getline.txt");
+ return 0;
+}
diff --git a/gnulib/tests/test-getlogin.c b/gnulib/tests/test-getlogin.c
new file mode 100644
index 00000000..13651083
--- /dev/null
+++ b/gnulib/tests/test-getlogin.c
@@ -0,0 +1,70 @@
+/* Test of getting user name.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (getlogin, char *, (void));
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ char *buf;
+
+ /* Test value. */
+ buf = getlogin ();
+ if (buf == NULL)
+ {
+ /* getlogin() fails when stdin is not connected to a tty. */
+ ASSERT (! isatty (0));
+ fprintf (stderr, "Skipping test: stdin is not a tty.\n");
+ return 77;
+ }
+
+ /* Compare against the value from the environment. */
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+ /* Unix platform */
+ {
+ const char *name = getenv ("LOGNAME");
+ if (name == NULL || name[0] == '\0')
+ name = getenv ("USER");
+ if (name != NULL && name[0] != '\0')
+ ASSERT (strcmp (buf, name) == 0);
+ }
+#endif
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+ /* Native Windows platform.
+ Note: This test would fail on Cygwin in an ssh session, because sshd
+ sets USERNAME=SYSTEM. */
+ {
+ const char *name = getenv ("USERNAME");
+ if (name != NULL && name[0] != '\0')
+ ASSERT (strcmp (buf, name) == 0);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-getlogin_r.c b/gnulib/tests/test-getlogin_r.c
new file mode 100644
index 00000000..68c68123
--- /dev/null
+++ b/gnulib/tests/test-getlogin_r.c
@@ -0,0 +1,88 @@
+/* Test of getting user name.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (getlogin_r, int, (char *, size_t));
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ /* Test with a large enough buffer. */
+ char buf[1024];
+
+ if (getlogin_r (buf, sizeof (buf)) != 0)
+ {
+ /* getlogin_r() fails when stdin is not connected to a tty. */
+ ASSERT (! isatty (0));
+ fprintf (stderr, "Skipping test: stdin is not a tty.\n");
+ return 77;
+ }
+
+ /* Compare against the value from the environment. */
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+ /* Unix platform */
+ {
+ const char *name = getenv ("LOGNAME");
+ if (name == NULL || name[0] == '\0')
+ name = getenv ("USER");
+ if (name != NULL && name[0] != '\0')
+ ASSERT (strcmp (buf, name) == 0);
+ }
+#endif
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+ /* Native Windows platform.
+ Note: This test would fail on Cygwin in an ssh session, because sshd
+ sets USERNAME=SYSTEM. */
+ {
+ const char *name = getenv ("USERNAME");
+ if (name != NULL && name[0] != '\0')
+ ASSERT (strcmp (buf, name) == 0);
+ }
+#endif
+
+ /* Test with a small buffer. */
+ {
+ char smallbuf[1024];
+ size_t n = strlen (buf);
+ size_t i;
+
+ for (i = 0; i <= n; i++)
+ ASSERT (getlogin_r (smallbuf, i) == ERANGE);
+ }
+
+ /* Test with a huge buffer. */
+ {
+ static char hugebuf[70000];
+
+ ASSERT (getlogin_r (hugebuf, sizeof (hugebuf)) == 0);
+ ASSERT (strcmp (hugebuf, buf) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-getndelim2.c b/gnulib/tests/test-getndelim2.c
new file mode 100644
index 00000000..18e15a21
--- /dev/null
+++ b/gnulib/tests/test-getndelim2.c
@@ -0,0 +1,152 @@
+/* Test of getndelim2() function.
+ Copyright (C) 2008, 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2008. */
+
+#include <config.h>
+
+#include "getndelim2.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ FILE *f;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t result;
+
+ /* Create test file. */
+ f = fopen ("test-getndelim2.txt", "wb+");
+ if (!f || fwrite ("a\nbc\nd\0f", 1, 8, f) != 8)
+ {
+ fputs ("Failed to create sample file.\n", stderr);
+ remove ("test-getndelim2.txt");
+ return 1;
+ }
+ rewind (f);
+
+ /* Unlimited lines. */
+
+ /* Test initial allocation, which must include trailing NUL. */
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, '\n', '\n', f);
+ ASSERT (result == 2);
+ ASSERT (strcmp (line, "a\n") == 0);
+ ASSERT (2 < len);
+
+ /* Test growth of buffer, must not leak. */
+ free (line);
+ line = malloc (1);
+ len = 0;
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, EOF, '\n', f);
+ ASSERT (result == 3);
+ ASSERT (strcmp (line, "bc\n") == 0);
+ ASSERT (3 < len);
+
+ /* Test embedded NULs and EOF behavior. */
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, '\n', EOF, f);
+ ASSERT (result == 3);
+ ASSERT (memcmp (line, "d\0f", 4) == 0);
+ ASSERT (3 < len);
+
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, '\n', EOF, f);
+ ASSERT (result == -1);
+
+ /* Using offset and nmax. */
+
+ /* Limit growth to four bytes, including NUL, but parse to next 'd'. */
+ free (line);
+ rewind (f);
+ line = malloc (8);
+ memset (line, 'e', 8);
+ len = 8;
+ result = getndelim2 (&line, &len, 6, 10, 'd', 'd', f);
+ ASSERT (result == 3);
+ ASSERT (10 == len);
+ ASSERT (strcmp (line, "eeeeeea\nb") == 0);
+
+ /* No change if offset larger than limit. */
+ result = getndelim2 (&line, &len, len, 1, EOF, EOF, f);
+ ASSERT (result == -1);
+ ASSERT (10 == len);
+ ASSERT (strcmp (line, "eeeeeea\nb") == 0);
+
+ /* Consume to end of file, including embedded NUL. */
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, EOF, EOF, f);
+ ASSERT (result == 2);
+ ASSERT (10 == len);
+ ASSERT (memcmp (line, "\0f\0eeea\nb", 10) == 0);
+
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, '\n', '\r', f);
+ ASSERT (result == -1);
+
+ /* Larger file size. */
+ rewind (f);
+ {
+ int i;
+ for (i = 0; i < 16; i++)
+ fprintf (f, "%500x%c", i, i % 2 ? '\n' : '\r');
+ }
+ rewind (f);
+ {
+ char buffer[502];
+
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, '\n', '\r', f);
+ ASSERT (result == 501);
+ ASSERT (501 < len);
+ memset (buffer, ' ', 499);
+ buffer[499] = '0';
+ buffer[500] = '\r';
+ buffer[501] = '\0';
+ ASSERT (strcmp (buffer, line) == 0);
+
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, '\n', '\r', f);
+ ASSERT (result == 501);
+ ASSERT (501 < len);
+ buffer[499] = '1';
+ buffer[500] = '\n';
+ ASSERT (strcmp (buffer, line) == 0);
+
+ result = getndelim2 (&line, &len, 0, GETNLINE_NO_LIMIT, 'g', 'f', f);
+ ASSERT (result == 501 * 14 - 1);
+ ASSERT (501 * 14 <= len);
+ buffer[499] = 'f';
+ buffer[500] = '\0';
+ ASSERT (strcmp (buffer, line + 501 * 13) == 0);
+
+ result = getndelim2 (&line, &len, 501 * 14 - 1, GETNLINE_NO_LIMIT,
+ EOF, EOF, f);
+ ASSERT (result == 1);
+ buffer[500] = '\n';
+ ASSERT (strcmp (buffer, line + 501 * 13) == 0);
+
+ result = getndelim2 (&line, &len, 501 * 14 - 1, GETNLINE_NO_LIMIT,
+ EOF, EOF, f);
+ buffer[500] = '\0';
+ ASSERT (strcmp (buffer, line + 501 * 13) == 0);
+ ASSERT (result == -1);
+ }
+
+ fclose (f);
+ remove ("test-getndelim2.txt");
+ return 0;
+}
diff --git a/gnulib/tests/test-getopt.c b/gnulib/tests/test-getopt.c
new file mode 100644
index 00000000..6bcb8e6a
--- /dev/null
+++ b/gnulib/tests/test-getopt.c
@@ -0,0 +1,99 @@
+/* Test of command line argument processing.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+/* None of the files accessed by this test are large, so disable the
+ ftell link warning if we are not using the gnulib ftell module. */
+#define _GL_NO_LARGE_FILES
+
+#if GNULIB_GETOPT_GNU
+# include <getopt.h>
+
+# ifndef __getopt_argv_const
+# define __getopt_argv_const const
+# endif
+# include "signature.h"
+SIGNATURE_CHECK (getopt_long, int, (int, char *__getopt_argv_const *,
+ char const *, struct option const *,
+ int *));
+SIGNATURE_CHECK (getopt_long_only, int, (int, char *__getopt_argv_const *,
+ char const *, struct option const *,
+ int *));
+
+#endif
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (getopt, int, (int, char * const[], char const *));
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* This test intentionally remaps stderr. So, we arrange to have fd 10
+ (outside the range of interesting fd's during the test) set up to
+ duplicate the original stderr. */
+
+#define BACKUP_STDERR_FILENO 10
+#define ASSERT_STREAM myerr
+#include "macros.h"
+
+static FILE *myerr;
+
+#include "test-getopt.h"
+#if GNULIB_GETOPT_GNU
+# include "test-getopt_long.h"
+#endif
+
+int
+main (void)
+{
+ /* This test validates that stderr is used correctly, so move the
+ original into fd 10. */
+ if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO
+ || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL)
+ return 2;
+
+ ASSERT (freopen ("test-getopt.tmp", "w", stderr) == stderr);
+
+ /* These default values are required by POSIX. */
+ ASSERT (optind == 1);
+ ASSERT (opterr != 0);
+
+ setenv ("POSIXLY_CORRECT", "1", 1);
+ test_getopt ();
+
+#if GNULIB_GETOPT_GNU
+ test_getopt_long_posix ();
+#endif
+
+ unsetenv ("POSIXLY_CORRECT");
+ test_getopt ();
+
+#if GNULIB_GETOPT_GNU
+ test_getopt_long ();
+ test_getopt_long_only ();
+#endif
+
+ ASSERT (fclose (stderr) == 0);
+ ASSERT (remove ("test-getopt.tmp") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-getopt.h b/gnulib/tests/test-getopt.h
new file mode 100644
index 00000000..0db8f1c6
--- /dev/null
+++ b/gnulib/tests/test-getopt.h
@@ -0,0 +1,1268 @@
+/* Test of command line argument processing.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <stdbool.h>
+
+/* The glibc/gnulib implementation of getopt supports setting optind =
+ 0, but not all other implementations do. This matters for getopt.
+ But for getopt_long, we require GNU compatibility. */
+#if defined __GETOPT_PREFIX || (__GLIBC__ >= 2)
+# define OPTIND_MIN 0
+#elif HAVE_DECL_OPTRESET
+# define OPTIND_MIN (optreset = 1)
+#else
+# define OPTIND_MIN 1
+#endif
+
+static void
+getopt_loop (int argc, const char **argv,
+ const char *options,
+ int *a_seen, int *b_seen,
+ const char **p_value, const char **q_value,
+ int *non_options_count, const char **non_options,
+ int *unrecognized, bool *message_issued)
+{
+ int c;
+ int pos = ftell (stderr);
+
+ while ((c = getopt (argc, (char **) argv, options)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ (*a_seen)++;
+ break;
+ case 'b':
+ (*b_seen)++;
+ break;
+ case 'p':
+ *p_value = optarg;
+ break;
+ case 'q':
+ *q_value = optarg;
+ break;
+ case '\1':
+ /* Must only happen with option '-' at the beginning. */
+ ASSERT (options[0] == '-');
+ non_options[(*non_options_count)++] = optarg;
+ break;
+ case ':':
+ /* Must only happen with option ':' at the beginning. */
+ ASSERT (options[0] == ':'
+ || ((options[0] == '-' || options[0] == '+')
+ && options[1] == ':'));
+ /* fall through */
+ case '?':
+ *unrecognized = optopt;
+ break;
+ default:
+ *unrecognized = c;
+ break;
+ }
+ }
+
+ *message_issued = pos < ftell (stderr);
+}
+
+static void
+test_getopt (void)
+{
+ int start;
+ bool posixly = !!getenv ("POSIXLY_CORRECT");
+ /* See comment in getopt.c:
+ glibc gets a LSB-compliant getopt.
+ Standalone applications get a POSIX-compliant getopt. */
+#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
+ /* Using getopt from gnulib or from a non-glibc system. */
+ posixly = true;
+#endif
+
+ /* Test processing of boolean options. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-a";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "ab",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-b";
+ argv[argc++] = "-a";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "ab",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ba";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "ab",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ab";
+ argv[argc++] = "-a";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "ab",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 2);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ ASSERT (!output);
+ }
+
+ /* Test processing of options with arguments. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-pfoo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "p:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "p:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ab";
+ argv[argc++] = "-q";
+ argv[argc++] = "baz";
+ argv[argc++] = "-pfoo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 5);
+ ASSERT (!output);
+ }
+
+#if GNULIB_GETOPT_GNU
+ /* Test processing of options with optional arguments. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-pfoo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "p::q::",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "p::q::",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "abp::q::",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ ASSERT (!output);
+ }
+#endif
+
+ /* Check that invalid options are recognized; and that both opterr
+ and leading ':' can silence output. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "-x";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 42;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 'x');
+ ASSERT (optind == 5);
+ ASSERT (output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "-x";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 0;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 'x');
+ ASSERT (optind == 5);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "-x";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, ":abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 'x');
+ ASSERT (optind == 5);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "-:";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 42;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == ':');
+ ASSERT (optind == 5);
+ ASSERT (output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "-:";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 0;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == ':');
+ ASSERT (optind == 5);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "-:";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, ":abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == ':');
+ ASSERT (optind == 5);
+ ASSERT (!output);
+ }
+
+ /* Check for missing argument behavior. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ap";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 'p');
+ ASSERT (optind == 2);
+ ASSERT (output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ap";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 0;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 'p');
+ ASSERT (optind == 2);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ap";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, ":abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 'p');
+ ASSERT (optind == 2);
+ ASSERT (!output);
+ }
+
+ /* Check that by default, non-options arguments are moved to the end. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ if (posixly)
+ {
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 1);
+ ASSERT (!output);
+ }
+ else
+ {
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "-p") == 0);
+ ASSERT (strcmp (argv[2], "billy") == 0);
+ ASSERT (strcmp (argv[3], "-a") == 0);
+ ASSERT (strcmp (argv[4], "donald") == 0);
+ ASSERT (strcmp (argv[5], "duck") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ ASSERT (!output);
+ }
+ }
+
+ /* Check that '--' ends the argument processing. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[20];
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "--";
+ argv[argc++] = "-b";
+ argv[argc++] = "foo";
+ argv[argc++] = "-q";
+ argv[argc++] = "johnny";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ if (posixly)
+ {
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "--") == 0);
+ ASSERT (strcmp (argv[7], "-b") == 0);
+ ASSERT (strcmp (argv[8], "foo") == 0);
+ ASSERT (strcmp (argv[9], "-q") == 0);
+ ASSERT (strcmp (argv[10], "johnny") == 0);
+ ASSERT (strcmp (argv[11], "bar") == 0);
+ ASSERT (argv[12] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 1);
+ ASSERT (!output);
+ }
+ else
+ {
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "-p") == 0);
+ ASSERT (strcmp (argv[2], "billy") == 0);
+ ASSERT (strcmp (argv[3], "-a") == 0);
+ ASSERT (strcmp (argv[4], "--") == 0);
+ ASSERT (strcmp (argv[5], "donald") == 0);
+ ASSERT (strcmp (argv[6], "duck") == 0);
+ ASSERT (strcmp (argv[7], "-b") == 0);
+ ASSERT (strcmp (argv[8], "foo") == 0);
+ ASSERT (strcmp (argv[9], "-q") == 0);
+ ASSERT (strcmp (argv[10], "johnny") == 0);
+ ASSERT (strcmp (argv[11], "bar") == 0);
+ ASSERT (argv[12] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 5);
+ ASSERT (!output);
+ }
+ }
+
+#if GNULIB_GETOPT_GNU
+ /* Check that the '-' flag causes non-options to be returned in order. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "-abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 3);
+ ASSERT (strcmp (non_options[0], "donald") == 0);
+ ASSERT (strcmp (non_options[1], "duck") == 0);
+ ASSERT (strcmp (non_options[2], "bar") == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 7);
+ ASSERT (!output);
+ }
+
+ /* Check that '--' ends the argument processing. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[20];
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "--";
+ argv[argc++] = "-b";
+ argv[argc++] = "foo";
+ argv[argc++] = "-q";
+ argv[argc++] = "johnny";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "-abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "--") == 0);
+ ASSERT (strcmp (argv[7], "-b") == 0);
+ ASSERT (strcmp (argv[8], "foo") == 0);
+ ASSERT (strcmp (argv[9], "-q") == 0);
+ ASSERT (strcmp (argv[10], "johnny") == 0);
+ ASSERT (strcmp (argv[11], "bar") == 0);
+ ASSERT (argv[12] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (!output);
+ if (non_options_count == 2)
+ {
+ /* glibc behaviour. */
+ ASSERT (non_options_count == 2);
+ ASSERT (strcmp (non_options[0], "donald") == 0);
+ ASSERT (strcmp (non_options[1], "duck") == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 7);
+ }
+ else
+ {
+ /* Another valid behaviour. */
+ ASSERT (non_options_count == 7);
+ ASSERT (strcmp (non_options[0], "donald") == 0);
+ ASSERT (strcmp (non_options[1], "duck") == 0);
+ ASSERT (strcmp (non_options[2], "-b") == 0);
+ ASSERT (strcmp (non_options[3], "foo") == 0);
+ ASSERT (strcmp (non_options[4], "-q") == 0);
+ ASSERT (strcmp (non_options[5], "johnny") == 0);
+ ASSERT (strcmp (non_options[6], "bar") == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 12);
+ }
+ }
+#endif
+
+ /* Check that the '-' flag has to come first. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "abp:q:-",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ if (posixly)
+ {
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 1);
+ ASSERT (!output);
+ }
+ else
+ {
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "-p") == 0);
+ ASSERT (strcmp (argv[2], "billy") == 0);
+ ASSERT (strcmp (argv[3], "-a") == 0);
+ ASSERT (strcmp (argv[4], "donald") == 0);
+ ASSERT (strcmp (argv[5], "duck") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ ASSERT (!output);
+ }
+ }
+
+ /* Check that the '+' flag causes the first non-option to terminate the
+ loop. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "+abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 1);
+ ASSERT (!output);
+ }
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "-+";
+ argv[argc] = NULL;
+ optind = start;
+ /* Suppress output, since glibc is inconsistent on whether this
+ prints a message:
+ http://sources.redhat.com/bugzilla/show_bug.cgi?id=11039 */
+ opterr = 0;
+ getopt_loop (argc, argv, "+abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == '+');
+ ASSERT (optind == 2);
+ ASSERT (!output);
+ }
+
+ /* Check that '--' ends the argument processing. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[20];
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "--";
+ argv[argc++] = "-b";
+ argv[argc++] = "foo";
+ argv[argc++] = "-q";
+ argv[argc++] = "johnny";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "+abp:q:",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "--") == 0);
+ ASSERT (strcmp (argv[7], "-b") == 0);
+ ASSERT (strcmp (argv[8], "foo") == 0);
+ ASSERT (strcmp (argv[9], "-q") == 0);
+ ASSERT (strcmp (argv[10], "johnny") == 0);
+ ASSERT (strcmp (argv[11], "bar") == 0);
+ ASSERT (argv[12] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind = 1);
+ ASSERT (!output);
+ }
+
+ /* Check that the '+' flag has to come first. */
+ for (start = OPTIND_MIN; start <= 1; start++)
+ {
+ int a_seen = 0;
+ int b_seen = 0;
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ bool output;
+ int argc = 0;
+ const char *argv[10];
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ opterr = 1;
+ getopt_loop (argc, argv, "abp:q:+",
+ &a_seen, &b_seen, &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized, &output);
+ if (posixly)
+ {
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 1);
+ ASSERT (!output);
+ }
+ else
+ {
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "-p") == 0);
+ ASSERT (strcmp (argv[2], "billy") == 0);
+ ASSERT (strcmp (argv[3], "-a") == 0);
+ ASSERT (strcmp (argv[4], "donald") == 0);
+ ASSERT (strcmp (argv[5], "duck") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ ASSERT (!output);
+ }
+ }
+
+ /* No tests of "-:..." or "+:...", due to glibc bug:
+ http://sources.redhat.com/bugzilla/show_bug.cgi?id=11039 */
+}
diff --git a/gnulib/tests/test-getopt_long.h b/gnulib/tests/test-getopt_long.h
new file mode 100644
index 00000000..5f103c8e
--- /dev/null
+++ b/gnulib/tests/test-getopt_long.h
@@ -0,0 +1,2120 @@
+/* Test of command line argument processing.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static int a_seen;
+static int b_seen;
+static int q_seen;
+
+static const struct option long_options_required[] =
+ {
+ { "alpha", no_argument, NULL, 'a' },
+ { "beta", no_argument, &b_seen, 1 },
+ { "prune", required_argument, NULL, 'p' },
+ { "quetsche", required_argument, &q_seen, 1 },
+ { "xtremely-",no_argument, NULL, 1003 },
+ { "xtra", no_argument, NULL, 1001 },
+ { "xtreme", no_argument, NULL, 1002 },
+ { "xtremely", no_argument, NULL, 1003 },
+ { NULL, 0, NULL, 0 }
+ };
+
+static const struct option long_options_optional[] =
+ {
+ { "alpha", no_argument, NULL, 'a' },
+ { "beta", no_argument, &b_seen, 1 },
+ { "prune", optional_argument, NULL, 'p' },
+ { "quetsche", optional_argument, &q_seen, 1 },
+ { NULL, 0, NULL, 0 }
+ };
+
+static void
+getopt_long_loop (int argc, const char **argv,
+ const char *options, const struct option *long_options,
+ const char **p_value, const char **q_value,
+ int *non_options_count, const char **non_options,
+ int *unrecognized)
+{
+ int option_index = -1;
+ int c;
+
+ opterr = 0;
+ q_seen = 0;
+ while ((c = getopt_long (argc, (char **) argv, options, long_options,
+ &option_index))
+ != -1)
+ {
+ switch (c)
+ {
+ case 0:
+ /* An option with a non-NULL flag pointer was processed. */
+ if (q_seen)
+ *q_value = optarg;
+ break;
+ case 'a':
+ a_seen++;
+ break;
+ case 'b':
+ b_seen = 1;
+ break;
+ case 'p':
+ *p_value = optarg;
+ break;
+ case 'q':
+ *q_value = optarg;
+ break;
+ case '\1':
+ /* Must only happen with option '-' at the beginning. */
+ ASSERT (options[0] == '-');
+ non_options[(*non_options_count)++] = optarg;
+ break;
+ case ':':
+ /* Must only happen with option ':' at the beginning. */
+ ASSERT (options[0] == ':'
+ || ((options[0] == '-' || options[0] == '+')
+ && options[1] == ':'));
+ /* fall through */
+ case '?':
+ *unrecognized = optopt;
+ break;
+ default:
+ *unrecognized = c;
+ break;
+ }
+ }
+}
+
+/* Reduce casting, so we can use string literals elsewhere.
+ getopt_long takes an array of char*, but luckily does not modify
+ those elements, so we can pass const char*. */
+static int
+do_getopt_long (int argc, const char **argv, const char *shortopts,
+ const struct option *longopts, int *longind)
+{
+ return getopt_long (argc, (char **) argv, shortopts, longopts, longind);
+}
+
+static void
+test_getopt_long (void)
+{
+ int start;
+
+ /* Test disambiguation of options. */
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--x";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--xt";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--xtr";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--xtra";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == 1001);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--xtre";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--xtrem";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--xtreme";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == 1002);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--xtremel";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == 1003);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--xtremely";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
+ ASSERT (c == 1003);
+ }
+
+ /* Check that -W handles unknown options. */
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-W";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 'W');
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-Wunknown";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
+ /* glibc and BSD behave differently here, but for now, we allow
+ both behaviors since W support is not frequently used. */
+ if (c == '?')
+ {
+ ASSERT (optopt == 0);
+ ASSERT (optarg == NULL);
+ }
+ else
+ {
+ ASSERT (c == 'W');
+ ASSERT (strcmp (optarg, "unknown") == 0);
+ }
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-W";
+ argv[argc++] = "unknown";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
+ /* glibc and BSD behave differently here, but for now, we allow
+ both behaviors since W support is not frequently used. */
+ if (c == '?')
+ {
+ ASSERT (optopt == 0);
+ ASSERT (optarg == NULL);
+ }
+ else
+ {
+ ASSERT (c == 'W');
+ ASSERT (strcmp (optarg, "unknown") == 0);
+ }
+ }
+
+ /* Test processing of boolean short options. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-a";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-b";
+ argv[argc++] = "-a";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ba";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ab";
+ argv[argc++] = "-a";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 2);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ }
+
+ /* Test processing of boolean long options. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--alpha";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--beta";
+ argv[argc++] = "--alpha";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--alpha";
+ argv[argc++] = "--beta";
+ argv[argc++] = "--alpha";
+ argv[argc++] = "--beta";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 2);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 5);
+ }
+
+ /* Test processing of boolean long options via -W. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-Walpha";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abW;", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-W";
+ argv[argc++] = "beta";
+ argv[argc++] = "-W";
+ argv[argc++] = "alpha";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "aW;b", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 5);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-Walpha";
+ argv[argc++] = "-Wbeta";
+ argv[argc++] = "-Walpha";
+ argv[argc++] = "-Wbeta";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "W;ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 2);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 5);
+ }
+
+ /* Test processing of short options with arguments. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-pfoo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ab";
+ argv[argc++] = "-q";
+ argv[argc++] = "baz";
+ argv[argc++] = "-pfoo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 5);
+ }
+
+ /* Test processing of long options with arguments. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--p=foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--p";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ab";
+ argv[argc++] = "--q";
+ argv[argc++] = "baz";
+ argv[argc++] = "--p=foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 5);
+ }
+
+ /* Test processing of long options with arguments via -W. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-Wp=foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p:q:W;", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-W";
+ argv[argc++] = "p";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p:W;q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-ab";
+ argv[argc++] = "-Wq";
+ argv[argc++] = "baz";
+ argv[argc++] = "-W";
+ argv[argc++] = "p=foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "W;abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 6);
+ }
+
+ /* Test processing of short options with optional arguments. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-pfoo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ }
+
+ /* Test processing of long options with optional arguments. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--p=foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--p";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--p=";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && *p_value == '\0');
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--p";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ }
+
+ /* Test processing of long options with optional arguments via -W. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-Wp=foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p::q::W;", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-Wp";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p::q::W;", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ /* glibc bug http://sources.redhat.com/bugzilla/show_bug.cgi?id=11041 */
+ /* ASSERT (p_value == NULL); */
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-Wp=";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "W;p::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && *p_value == '\0');
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-W";
+ argv[argc++] = "p=";
+ argv[argc++] = "foo";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "W;p::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && *p_value == '\0');
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 3);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-W";
+ argv[argc++] = "p";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "W;abp::q::", long_options_optional,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ /* ASSERT (p_value == NULL); */
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ }
+
+ /* Check that invalid options are recognized. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "-x";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 'x');
+ ASSERT (optind == 5);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "-:";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == ':');
+ ASSERT (optind == 5);
+ }
+
+ /* Check that unexpected arguments are recognized. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "--a=";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 'a');
+ ASSERT (optind == 4);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "foo";
+ argv[argc++] = "--b=";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ /* When flag is non-zero, glibc sets optopt anyway, but BSD
+ leaves optopt unchanged. */
+ ASSERT (unrecognized == 1 || unrecognized == 0);
+ ASSERT (optind == 4);
+ }
+
+ /* Check that by default, non-options arguments are moved to the end. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "-p") == 0);
+ ASSERT (strcmp (argv[2], "billy") == 0);
+ ASSERT (strcmp (argv[3], "-a") == 0);
+ ASSERT (strcmp (argv[4], "donald") == 0);
+ ASSERT (strcmp (argv[5], "duck") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ }
+
+ /* Check that '--' ends the argument processing. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[20];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "--";
+ argv[argc++] = "-b";
+ argv[argc++] = "foo";
+ argv[argc++] = "-q";
+ argv[argc++] = "johnny";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "-p") == 0);
+ ASSERT (strcmp (argv[2], "billy") == 0);
+ ASSERT (strcmp (argv[3], "-a") == 0);
+ ASSERT (strcmp (argv[4], "--") == 0);
+ ASSERT (strcmp (argv[5], "donald") == 0);
+ ASSERT (strcmp (argv[6], "duck") == 0);
+ ASSERT (strcmp (argv[7], "-b") == 0);
+ ASSERT (strcmp (argv[8], "foo") == 0);
+ ASSERT (strcmp (argv[9], "-q") == 0);
+ ASSERT (strcmp (argv[10], "johnny") == 0);
+ ASSERT (strcmp (argv[11], "bar") == 0);
+ ASSERT (argv[12] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 5);
+ }
+
+ /* Check that the '-' flag causes non-options to be returned in order. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "-abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 3);
+ ASSERT (strcmp (non_options[0], "donald") == 0);
+ ASSERT (strcmp (non_options[1], "duck") == 0);
+ ASSERT (strcmp (non_options[2], "bar") == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 7);
+ }
+
+ /* Check that '--' ends the argument processing. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[20];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "--";
+ argv[argc++] = "-b";
+ argv[argc++] = "foo";
+ argv[argc++] = "-q";
+ argv[argc++] = "johnny";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "-abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "--") == 0);
+ ASSERT (strcmp (argv[7], "-b") == 0);
+ ASSERT (strcmp (argv[8], "foo") == 0);
+ ASSERT (strcmp (argv[9], "-q") == 0);
+ ASSERT (strcmp (argv[10], "johnny") == 0);
+ ASSERT (strcmp (argv[11], "bar") == 0);
+ ASSERT (argv[12] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ if (non_options_count == 2)
+ {
+ /* glibc behaviour. */
+ ASSERT (non_options_count == 2);
+ ASSERT (strcmp (non_options[0], "donald") == 0);
+ ASSERT (strcmp (non_options[1], "duck") == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 7);
+ }
+ else
+ {
+ /* Another valid behaviour. */
+ ASSERT (non_options_count == 7);
+ ASSERT (strcmp (non_options[0], "donald") == 0);
+ ASSERT (strcmp (non_options[1], "duck") == 0);
+ ASSERT (strcmp (non_options[2], "-b") == 0);
+ ASSERT (strcmp (non_options[3], "foo") == 0);
+ ASSERT (strcmp (non_options[4], "-q") == 0);
+ ASSERT (strcmp (non_options[5], "johnny") == 0);
+ ASSERT (strcmp (non_options[6], "bar") == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 12);
+ }
+ }
+
+ /* Check that the '-' flag has to come first. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:-", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "-p") == 0);
+ ASSERT (strcmp (argv[2], "billy") == 0);
+ ASSERT (strcmp (argv[3], "-a") == 0);
+ ASSERT (strcmp (argv[4], "donald") == 0);
+ ASSERT (strcmp (argv[5], "duck") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ }
+
+ /* Check that the '+' flag causes the first non-option to terminate the
+ loop. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 1);
+ }
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-+";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == '+');
+ ASSERT (optind == 2);
+ }
+
+ /* Check that '--' ends the argument processing. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[20];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "--";
+ argv[argc++] = "-b";
+ argv[argc++] = "foo";
+ argv[argc++] = "-q";
+ argv[argc++] = "johnny";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "--") == 0);
+ ASSERT (strcmp (argv[7], "-b") == 0);
+ ASSERT (strcmp (argv[8], "foo") == 0);
+ ASSERT (strcmp (argv[9], "-q") == 0);
+ ASSERT (strcmp (argv[10], "johnny") == 0);
+ ASSERT (strcmp (argv[11], "bar") == 0);
+ ASSERT (argv[12] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind = 1);
+ }
+
+ /* Check that the '+' flag has to come first. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:+", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "-p") == 0);
+ ASSERT (strcmp (argv[2], "billy") == 0);
+ ASSERT (strcmp (argv[3], "-a") == 0);
+ ASSERT (strcmp (argv[4], "donald") == 0);
+ ASSERT (strcmp (argv[5], "duck") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ }
+}
+
+/* Test behavior of getopt_long when POSIXLY_CORRECT is set in the
+ environment. Options with optional arguments should not change
+ behavior just because of an environment variable.
+ http://lists.gnu.org/archive/html/bug-m4/2006-09/msg00028.html */
+static void
+test_getopt_long_posix (void)
+{
+ int start;
+
+ /* Check that POSIXLY_CORRECT stops parsing the same as leading '+'. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "donald";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc++] = "duck";
+ argv[argc++] = "-a";
+ argv[argc++] = "bar";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "abp:q:", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (strcmp (argv[0], "program") == 0);
+ ASSERT (strcmp (argv[1], "donald") == 0);
+ ASSERT (strcmp (argv[2], "-p") == 0);
+ ASSERT (strcmp (argv[3], "billy") == 0);
+ ASSERT (strcmp (argv[4], "duck") == 0);
+ ASSERT (strcmp (argv[5], "-a") == 0);
+ ASSERT (strcmp (argv[6], "bar") == 0);
+ ASSERT (argv[7] == NULL);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 1);
+ }
+
+ /* Check that POSIXLY_CORRECT doesn't change optional arguments. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-p";
+ argv[argc++] = "billy";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "p::", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 0);
+ ASSERT (b_seen == 0);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 2);
+ }
+
+ /* Check that leading - still sees options after non-options. */
+ for (start = 0; start <= 1; start++)
+ {
+ const char *p_value = NULL;
+ const char *q_value = NULL;
+ int non_options_count = 0;
+ const char *non_options[10];
+ int unrecognized = 0;
+ int argc = 0;
+ const char *argv[10];
+ a_seen = 0;
+ b_seen = 0;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-a";
+ argv[argc++] = "billy";
+ argv[argc++] = "-b";
+ argv[argc] = NULL;
+ optind = start;
+ getopt_long_loop (argc, argv, "-ab", long_options_required,
+ &p_value, &q_value,
+ &non_options_count, non_options, &unrecognized);
+ ASSERT (a_seen == 1);
+ ASSERT (b_seen == 1);
+ ASSERT (p_value == NULL);
+ ASSERT (q_value == NULL);
+ ASSERT (non_options_count == 1);
+ ASSERT (strcmp (non_options[0], "billy") == 0);
+ ASSERT (unrecognized == 0);
+ ASSERT (optind == 4);
+ }
+}
+
+/* Reduce casting, so we can use string literals elsewhere.
+ getopt_long_only takes an array of char*, but luckily does not
+ modify those elements, so we can pass const char*. */
+static int
+do_getopt_long_only (int argc, const char **argv, const char *shortopts,
+ const struct option *longopts, int *longind)
+{
+ return getopt_long_only (argc, (char **) argv, shortopts, longopts, longind);
+}
+
+static void
+test_getopt_long_only (void)
+{
+ /* Test disambiguation of options. */
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-x";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "ab", long_options_required,
+ &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-x";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "abx", long_options_required,
+ &option_index);
+ ASSERT (c == 'x');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--x";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "abx", long_options_required,
+ &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-b";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ b_seen = 0;
+ c = do_getopt_long_only (argc, argv, "abx", long_options_required,
+ &option_index);
+ ASSERT (c == 'b');
+ ASSERT (b_seen == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "--b";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ b_seen = 0;
+ c = do_getopt_long_only (argc, argv, "abx", long_options_required,
+ &option_index);
+ ASSERT (c == 0);
+ ASSERT (b_seen == 1);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-xt";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "ab", long_options_required,
+ &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-xt";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "abx", long_options_required,
+ &option_index);
+ ASSERT (c == '?');
+ ASSERT (optopt == 0);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-xtra";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "ab", long_options_required,
+ &option_index);
+ ASSERT (c == 1001);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-xtreme";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "abx:", long_options_required,
+ &option_index);
+ ASSERT (c == 1002);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-xtremel";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "ab", long_options_required,
+ &option_index);
+ /* glibc bug http://sources.redhat.com/bugzilla/show_bug.cgi?id=11041 */
+ /* ASSERT (c == 1003); */
+ ASSERT (optind == 2);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-xtremel";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "abx::", long_options_required,
+ &option_index);
+ /* glibc bug http://sources.redhat.com/bugzilla/show_bug.cgi?id=11041 */
+ /* ASSERT (c == 1003); */
+ ASSERT (optind == 2);
+ ASSERT (optarg == NULL);
+ }
+ {
+ int argc = 0;
+ const char *argv[10];
+ int option_index;
+ int c;
+
+ argv[argc++] = "program";
+ argv[argc++] = "-xtras";
+ argv[argc] = NULL;
+ optind = 1;
+ opterr = 0;
+ c = do_getopt_long_only (argc, argv, "abx::", long_options_required,
+ &option_index);
+ ASSERT (c == 'x');
+ ASSERT (strcmp (optarg, "tras") == 0);
+ }
+}
diff --git a/gnulib/tests/test-getpass.c b/gnulib/tests/test-getpass.c
new file mode 100644
index 00000000..4c5a5a36
--- /dev/null
+++ b/gnulib/tests/test-getpass.c
@@ -0,0 +1,31 @@
+/* Test getpass implementation.
+ Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include "getpass.h"
+
+int
+main (int argc, char *argv[])
+{
+ char *pass = getpass ("Enter password: ");
+
+ printf ("The password is `%s'\n", pass);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-gettimeofday.c b/gnulib/tests/test-gettimeofday.c
new file mode 100644
index 00000000..ff2bc72b
--- /dev/null
+++ b/gnulib/tests/test-gettimeofday.c
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Jim Meyering.
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <sys/time.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (gettimeofday, int,
+ (struct timeval *, GETTIMEOFDAY_TIMEZONE *));
+
+#include <time.h>
+
+#include <stdio.h>
+#include <string.h>
+
+int
+main (void)
+{
+ time_t t = 0;
+ struct tm *lt;
+ struct tm saved_lt;
+ struct timeval tv;
+ lt = localtime (&t);
+ saved_lt = *lt;
+ gettimeofday (&tv, NULL);
+ if (memcmp (lt, &saved_lt, sizeof (struct tm)) != 0)
+ {
+ fprintf (stderr, "gettimeofday still clobbers the localtime buffer!\n");
+ return 1;
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-glob.c b/gnulib/tests/test-glob.c
new file mode 100644
index 00000000..ab2d5311
--- /dev/null
+++ b/gnulib/tests/test-glob.c
@@ -0,0 +1,77 @@
+/* Test of glob/globfree functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2009. */
+
+#include <config.h>
+
+#include <glob.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (glob, int, (char const *, int, int (*) (char const *, int),
+ glob_t *));
+SIGNATURE_CHECK (globfree, void, (glob_t *));
+
+#include <string.h>
+
+#include "macros.h"
+
+#define GL_NO_SUCH_FILE "/gnulib-magic-does-not-exist"
+
+int
+main ()
+{
+ int res;
+ glob_t g;
+
+ /* Make sure glob_t struct members exists. */
+ ASSERT (sizeof (g.gl_pathc));
+ ASSERT (sizeof (g.gl_pathv));
+ ASSERT (sizeof (g.gl_offs));
+
+ res = glob (".", 0, NULL, &g);
+ ASSERT (res == 0 && g.gl_pathc == 1);
+ globfree (&g);
+
+ res = glob (".", GLOB_NOSORT, NULL, &g);
+ ASSERT (res == 0 && g.gl_pathc == 1);
+ globfree (&g);
+
+ res = glob (".", GLOB_MARK, NULL, &g);
+ ASSERT (res == 0 && g.gl_pathc == 1);
+
+ res = glob (".", GLOB_APPEND, NULL, &g);
+ ASSERT (res == 0 && g.gl_pathc == 2);
+ globfree (&g);
+
+ res = glob (".", GLOB_NOESCAPE, NULL, &g);
+ ASSERT (res == 0 && g.gl_pathc == 1);
+ globfree (&g);
+
+ res = glob ("./*", 0, NULL, &g);
+ ASSERT (res == 0 && g.gl_pathc >= 1);
+ globfree (&g);
+
+ res = glob (GL_NO_SUCH_FILE, 0, NULL, &g);
+ ASSERT (res == GLOB_NOMATCH);
+
+ res = glob (GL_NO_SUCH_FILE, GLOB_NOCHECK, NULL, &g);
+ ASSERT (res == 0 && g.gl_pathc == 1);
+ ASSERT (strcmp (g.gl_pathv[0], GL_NO_SUCH_FILE) == 0);
+ globfree (&g);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-hash.c b/gnulib/tests/test-hash.c
new file mode 100644
index 00000000..17150333
--- /dev/null
+++ b/gnulib/tests/test-hash.c
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ * Written by Jim Meyering
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include "hash.h"
+#include "hash-pjw.h"
+#include "inttostr.h"
+#include "xalloc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+#define STREQ(a, b) (strcmp (a, b) == 0)
+#define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
+
+static bool
+hash_compare_strings (void const *x, void const *y)
+{
+ ASSERT (x != y);
+ return STREQ (x, y) ? true : false;
+}
+
+static void
+hash_freer (void *x)
+{
+ free (x);
+}
+
+static void
+insert_new (Hash_table *ht, const void *ent)
+{
+ void *e = hash_insert (ht, ent);
+ ASSERT (e == ent);
+}
+
+static bool
+walk (void *ent, void *data)
+{
+ char *str = ent;
+ unsigned int *map = data;
+ switch (*str)
+ {
+ case 'a': *map |= 1; return true;
+ case 'b': *map |= 2; return true;
+ case 'c': *map |= 4; return true;
+ }
+ *map |= 8;
+ return false;
+}
+
+static int
+get_seed (char const *str, unsigned int *seed)
+{
+ size_t len = strlen (str);
+ if (len == 0 || strspn (str, "0123456789") != len || 10 < len)
+ return 1;
+
+ *seed = atoi (str);
+ return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+ unsigned int i;
+ unsigned int k;
+ unsigned int table_size[] = {1, 2, 3, 4, 5, 23, 53};
+ Hash_table *ht;
+ Hash_tuning tuning;
+
+ hash_reset_tuning (&tuning);
+ tuning.shrink_threshold = 0.3;
+ tuning.shrink_factor = 0.707;
+ tuning.growth_threshold = 1.5;
+ tuning.growth_factor = 2.0;
+ tuning.is_n_buckets = true;
+
+ if (1 < argc)
+ {
+ unsigned int seed;
+ if (get_seed (argv[1], &seed) != 0)
+ {
+ fprintf (stderr, "invalid seed: %s\n", argv[1]);
+ exit (EXIT_FAILURE);
+ }
+
+ srand (seed);
+ }
+
+ for (i = 0; i < ARRAY_CARDINALITY (table_size); i++)
+ {
+ size_t sz = table_size[i];
+ ht = hash_initialize (sz, NULL, hash_pjw, hash_compare_strings, NULL);
+ ASSERT (ht);
+ insert_new (ht, "a");
+ {
+ char *str1 = xstrdup ("a");
+ char *str2 = hash_insert (ht, str1);
+ ASSERT (str1 != str2);
+ ASSERT (STREQ (str1, str2));
+ free (str1);
+ }
+ insert_new (ht, "b");
+ insert_new (ht, "c");
+ i = 0;
+ ASSERT (hash_do_for_each (ht, walk, &i) == 3);
+ ASSERT (i == 7);
+ {
+ void *buf[5] = { NULL };
+ ASSERT (hash_get_entries (ht, NULL, 0) == 0);
+ ASSERT (hash_get_entries (ht, buf, 5) == 3);
+ ASSERT (STREQ (buf[0], "a") || STREQ (buf[0], "b") || STREQ (buf[0], "c"));
+ }
+ ASSERT (hash_delete (ht, "a"));
+ ASSERT (hash_delete (ht, "a") == NULL);
+ ASSERT (hash_delete (ht, "b"));
+ ASSERT (hash_delete (ht, "c"));
+
+ ASSERT (hash_rehash (ht, 47));
+ ASSERT (hash_rehash (ht, 467));
+
+ /* Free an empty table. */
+ hash_clear (ht);
+ hash_free (ht);
+
+ ht = hash_initialize (sz, NULL, hash_pjw, hash_compare_strings, NULL);
+ ASSERT (ht);
+
+ insert_new (ht, "z");
+ insert_new (ht, "y");
+ insert_new (ht, "x");
+ insert_new (ht, "w");
+ insert_new (ht, "v");
+ insert_new (ht, "u");
+
+ hash_clear (ht);
+ ASSERT (hash_get_n_entries (ht) == 0);
+ hash_free (ht);
+
+ /* Test pointer hashing. */
+ ht = hash_initialize (sz, NULL, NULL, NULL, NULL);
+ ASSERT (ht);
+ {
+ char *str = xstrdup ("a");
+ insert_new (ht, "a");
+ insert_new (ht, str);
+ ASSERT (hash_lookup (ht, str) == str);
+ free (str);
+ }
+ hash_free (ht);
+ }
+
+ hash_reset_tuning (&tuning);
+ tuning.shrink_threshold = 0.3;
+ tuning.shrink_factor = 0.707;
+ tuning.growth_threshold = 1.5;
+ tuning.growth_factor = 2.0;
+ tuning.is_n_buckets = true;
+ /* Invalid tuning. */
+ ht = hash_initialize (4651, &tuning, hash_pjw, hash_compare_strings,
+ hash_freer);
+ ASSERT (!ht);
+
+ /* Alternate tuning. */
+ tuning.growth_threshold = 0.89;
+
+ /* Run with default tuning, then with custom tuning settings. */
+ for (k = 0; k < 2; k++)
+ {
+ Hash_tuning const *tune = (k == 0 ? NULL : &tuning);
+ /* Now, each entry is malloc'd. */
+ ht = hash_initialize (4651, tune, hash_pjw,
+ hash_compare_strings, hash_freer);
+ ASSERT (ht);
+ for (i = 0; i < 10000; i++)
+ {
+ unsigned int op = rand () % 10;
+ switch (op)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ {
+ char buf[50];
+ char const *p = uinttostr (i, buf);
+ insert_new (ht, xstrdup (p));
+ }
+ break;
+
+ case 6:
+ {
+ size_t n = hash_get_n_entries (ht);
+ ASSERT (hash_rehash (ht, n + rand () % 20));
+ }
+ break;
+
+ case 7:
+ {
+ size_t n = hash_get_n_entries (ht);
+ size_t delta = rand () % 20;
+ if (delta < n)
+ ASSERT (hash_rehash (ht, n - delta));
+ }
+ break;
+
+ case 8:
+ case 9:
+ {
+ /* Delete a random entry. */
+ size_t n = hash_get_n_entries (ht);
+ if (n)
+ {
+ size_t kk = rand () % n;
+ void const *p;
+ void *v;
+ for (p = hash_get_first (ht); kk;
+ --kk, p = hash_get_next (ht, p))
+ {
+ /* empty */
+ }
+ ASSERT (p);
+ v = hash_delete (ht, p);
+ ASSERT (v);
+ free (v);
+ }
+ break;
+ }
+ }
+ ASSERT (hash_table_ok (ht));
+ }
+
+ hash_free (ht);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-hmac-md5.c b/gnulib/tests/test-hmac-md5.c
new file mode 100644
index 00000000..4b6e43ab
--- /dev/null
+++ b/gnulib/tests/test-hmac-md5.c
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2005, 2010 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "hmac.h"
+
+/* Test vectors from RFC 2104. */
+
+int
+main (int argc, char *argv[])
+{
+ {
+ /*
+ key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
+ key_len = 16 bytes
+ data = "Hi There"
+ data_len = 8 bytes
+ digest = 0x9294727a3638bb1c13f48ef8158bfc9d
+ */
+ char *key =
+ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
+ size_t key_len = 16;
+ char *data = "Hi There";
+ size_t data_len = 8;
+ char *digest =
+ "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d";
+ char out[16];
+
+ if (hmac_md5 (key, key_len, data, data_len, out) != 0)
+ {
+ printf ("call failure\n");
+ return 1;
+ }
+
+ if (memcmp (digest, out, 16) != 0)
+ {
+ size_t i;
+ printf ("hash 1 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", digest[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+ }
+
+ {
+ /*
+ key = "Jefe"
+ data = "what do ya want for nothing?"
+ data_len = 28 bytes
+ digest = 0x750c783e6ab0b503eaa86e310a5db738
+ */
+ char *key = "Jefe";
+ size_t key_len = 4;
+ char *data = "what do ya want for nothing?";
+ size_t data_len = 28;
+ char *digest =
+ "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38";
+ char out[16];
+
+ if (hmac_md5 (key, key_len, data, data_len, out) != 0)
+ {
+ printf ("call failure\n");
+ return 1;
+ }
+
+ if (memcmp (digest, out, 16) != 0)
+ {
+ size_t i;
+ printf ("hash 2 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", digest[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+ }
+
+ {
+ /*
+ key = 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ key_len 16 bytes
+ data = 0xDDDDDDDDDDDDDDDDDDDD...
+ ..DDDDDDDDDDDDDDDDDDDD...
+ ..DDDDDDDDDDDDDDDDDDDD...
+ ..DDDDDDDDDDDDDDDDDDDD...
+ ..DDDDDDDDDDDDDDDDDDDD
+ data_len = 50 bytes
+ digest = 0x56be34521d144c88dbb8c733f0e8b3f6
+ */
+ char *key =
+ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA";
+ size_t key_len = 16;
+ char *data = "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
+ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
+ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
+ "\xDD\xDD";
+ size_t data_len = 50;
+ char *digest =
+ "\x56\xbe\x34\x52\x1d\x14\x4c\x88\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6";
+ char out[16];
+
+ if (hmac_md5 (key, key_len, data, data_len, out) != 0)
+ {
+ printf ("call failure\n");
+ return 1;
+ }
+
+ if (memcmp (digest, out, 16) != 0)
+ {
+ size_t i;
+ printf ("hash 3 mismatch. expected:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", digest[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 16; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-hmac-sha1.c b/gnulib/tests/test-hmac-sha1.c
new file mode 100644
index 00000000..536d1e18
--- /dev/null
+++ b/gnulib/tests/test-hmac-sha1.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2005, 2010 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "hmac.h"
+
+int
+main (int argc, char *argv[])
+{
+ {
+ char *key =
+ "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
+ size_t key_len = 16;
+ char *data = "Hi There";
+ size_t data_len = 8;
+ char *digest =
+ "\x67\x5b\x0b\x3a\x1b\x4d\xdf\x4e\x12\x48\x72\xda\x6c\x2f\x63\x2b\xfe\xd9\x57\xe9";
+ char out[20];
+
+ if (hmac_sha1 (key, key_len, data, data_len, out) != 0)
+ {
+ printf ("call failure\n");
+ return 1;
+ }
+
+ if (memcmp (digest, out, 20) != 0)
+ {
+ size_t i;
+ printf ("hash 1 mismatch. expected:\n");
+ for (i = 0; i < 20; i++)
+ printf ("%02x ", digest[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 20; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+ }
+
+ {
+ char *key = "Jefe";
+ size_t key_len = 4;
+ char *data = "what do ya want for nothing?";
+ size_t data_len = 28;
+ char *digest =
+ "\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79";
+ char out[20];
+
+ if (hmac_sha1 (key, key_len, data, data_len, out) != 0)
+ {
+ printf ("call failure\n");
+ return 1;
+ }
+
+ if (memcmp (digest, out, 20) != 0)
+ {
+ size_t i;
+ printf ("hash 2 mismatch. expected:\n");
+ for (i = 0; i < 20; i++)
+ printf ("%02x ", digest[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 20; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+ }
+
+ {
+ char *key =
+ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA";
+ size_t key_len = 16;
+ char *data = "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
+ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
+ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
+ "\xDD\xDD";
+ size_t data_len = 50;
+ char *digest =
+ "\xd7\x30\x59\x4d\x16\x7e\x35\xd5\x95\x6f\xd8\x00\x3d\x0d\xb3\xd3\xf4\x6d\xc7\xbb";
+ char out[20];
+
+ if (hmac_sha1 (key, key_len, data, data_len, out) != 0)
+ {
+ printf ("call failure\n");
+ return 1;
+ }
+
+ if (memcmp (digest, out, 20) != 0)
+ {
+ size_t i;
+ printf ("hash 3 mismatch. expected:\n");
+ for (i = 0; i < 20; i++)
+ printf ("%02x ", digest[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < 20; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-hypot.c b/gnulib/tests/test-hypot.c
new file mode 100644
index 00000000..d91dd1d2
--- /dev/null
+++ b/gnulib/tests/test-hypot.c
@@ -0,0 +1,42 @@
+/* Test of hypot() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (hypot, double, (double, double));
+
+#include "macros.h"
+
+volatile double x;
+volatile double y;
+double z;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.4;
+ y = 0.6;
+ z = hypot (x, y);
+ ASSERT (z >= 0.7211102550 && z <= 0.7211102551);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-i-ring.c b/gnulib/tests/test-i-ring.c
new file mode 100644
index 00000000..6b604d9f
--- /dev/null
+++ b/gnulib/tests/test-i-ring.c
@@ -0,0 +1,63 @@
+/* Test the simple ring buffer.
+ Copyright (C) 2006-2010 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "i-ring.h"
+
+#include "macros.h"
+
+int
+main (void)
+{
+ int o;
+ I_ring ir;
+ i_ring_init (&ir, -1);
+ o = i_ring_push (&ir, 1);
+ ASSERT (o == -1);
+ o = i_ring_push (&ir, 2);
+ ASSERT (o == -1);
+ o = i_ring_push (&ir, 3);
+ ASSERT (o == -1);
+ o = i_ring_push (&ir, 4);
+ ASSERT (o == -1);
+ o = i_ring_push (&ir, 5);
+ ASSERT (o == 1);
+ o = i_ring_push (&ir, 6);
+ ASSERT (o == 2);
+ o = i_ring_push (&ir, 7);
+ ASSERT (o == 3);
+
+ o = i_ring_pop (&ir);
+ ASSERT (o == 7);
+ o = i_ring_pop (&ir);
+ ASSERT (o == 6);
+ o = i_ring_pop (&ir);
+ ASSERT (o == 5);
+ o = i_ring_pop (&ir);
+ ASSERT (o == 4);
+ ASSERT (i_ring_empty (&ir));
+
+ o = i_ring_push (&ir, 8);
+ ASSERT (o == -1);
+ o = i_ring_pop (&ir);
+ ASSERT (o == 8);
+ ASSERT (i_ring_empty (&ir));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-iconv-utf.c b/gnulib/tests/test-iconv-utf.c
new file mode 100644
index 00000000..e348041b
--- /dev/null
+++ b/gnulib/tests/test-iconv-utf.c
@@ -0,0 +1,288 @@
+/* Test of character set conversion.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encoding UTF-8. */
+
+ /* The text is "Japanese (日本語) [\U0001D50D\U0001D51E\U0001D52D]". */
+
+ /* Test conversion from UTF-8 to UTF-16BE with no errors. */
+ {
+ static const char input[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ static const char expected[] =
+ "\000J\000a\000p\000a\000n\000e\000s\000e\000 \000(\145\345\147\054\212\236\000)\000 \000[\330\065\335\015\330\065\335\036\330\065\335\055\000]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ cd = iconv_open ("UTF-16BE", "UTF-8");
+ ASSERT (cd != (iconv_t)(-1));
+
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+
+ ASSERT (iconv_close (cd) == 0);
+ }
+
+ /* Test conversion from UTF-8 to UTF-16LE with no errors. */
+ {
+ static const char input[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ static const char expected[] =
+ "J\000a\000p\000a\000n\000e\000s\000e\000 \000(\000\345\145\054\147\236\212)\000 \000[\000\065\330\015\335\065\330\036\335\065\330\055\335]\000";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ cd = iconv_open ("UTF-16LE", "UTF-8");
+ ASSERT (cd != (iconv_t)(-1));
+
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+
+ ASSERT (iconv_close (cd) == 0);
+ }
+
+ /* Test conversion from UTF-8 to UTF-32BE with no errors. */
+ {
+ static const char input[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ static const char expected[] =
+ "\000\000\000J\000\000\000a\000\000\000p\000\000\000a\000\000\000n\000\000\000e\000\000\000s\000\000\000e\000\000\000 \000\000\000(\000\000\145\345\000\000\147\054\000\000\212\236\000\000\000)\000\000\000 \000\000\000[\000\001\325\015\000\001\325\036\000\001\325\055\000\000\000]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ cd = iconv_open ("UTF-32BE", "UTF-8");
+ ASSERT (cd != (iconv_t)(-1));
+
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+
+ ASSERT (iconv_close (cd) == 0);
+ }
+
+ /* Test conversion from UTF-8 to UTF-32LE with no errors. */
+ {
+ static const char input[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ static const char expected[] =
+ "J\000\000\000a\000\000\000p\000\000\000a\000\000\000n\000\000\000e\000\000\000s\000\000\000e\000\000\000 \000\000\000(\000\000\000\345\145\000\000\054\147\000\000\236\212\000\000)\000\000\000 \000\000\000[\000\000\000\015\325\001\000\036\325\001\000\055\325\001\000]\000\000\000";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ cd = iconv_open ("UTF-32LE", "UTF-8");
+ ASSERT (cd != (iconv_t)(-1));
+
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+
+ ASSERT (iconv_close (cd) == 0);
+ }
+
+ /* Test conversion from UTF-16BE to UTF-8 with no errors. */
+ {
+ static const char input[] =
+ "\000J\000a\000p\000a\000n\000e\000s\000e\000 \000(\145\345\147\054\212\236\000)\000 \000[\330\065\335\015\330\065\335\036\330\065\335\055\000]";
+ static const char expected[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ cd = iconv_open ("UTF-8", "UTF-16BE");
+ ASSERT (cd != (iconv_t)(-1));
+
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+
+ ASSERT (iconv_close (cd) == 0);
+ }
+
+ /* Test conversion from UTF-16LE to UTF-8 with no errors. */
+ {
+ static const char input[] =
+ "J\000a\000p\000a\000n\000e\000s\000e\000 \000(\000\345\145\054\147\236\212)\000 \000[\000\065\330\015\335\065\330\036\335\065\330\055\335]\000";
+ static const char expected[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ cd = iconv_open ("UTF-8", "UTF-16LE");
+ ASSERT (cd != (iconv_t)(-1));
+
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+
+ ASSERT (iconv_close (cd) == 0);
+ }
+
+ /* Test conversion from UTF-32BE to UTF-8 with no errors. */
+ {
+ static const char input[] =
+ "\000\000\000J\000\000\000a\000\000\000p\000\000\000a\000\000\000n\000\000\000e\000\000\000s\000\000\000e\000\000\000 \000\000\000(\000\000\145\345\000\000\147\054\000\000\212\236\000\000\000)\000\000\000 \000\000\000[\000\001\325\015\000\001\325\036\000\001\325\055\000\000\000]";
+ static const char expected[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ cd = iconv_open ("UTF-8", "UTF-32BE");
+ ASSERT (cd != (iconv_t)(-1));
+
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+
+ ASSERT (iconv_close (cd) == 0);
+ }
+
+ /* Test conversion from UTF-32LE to UTF-8 with no errors. */
+ {
+ static const char input[] =
+ "J\000\000\000a\000\000\000p\000\000\000a\000\000\000n\000\000\000e\000\000\000s\000\000\000e\000\000\000 \000\000\000(\000\000\000\345\145\000\000\054\147\000\000\236\212\000\000)\000\000\000 \000\000\000[\000\000\000\015\325\001\000\036\325\001\000\055\325\001\000]\000\000\000";
+ static const char expected[] =
+ "Japanese (\346\227\245\346\234\254\350\252\236) [\360\235\224\215\360\235\224\236\360\235\224\255]";
+ iconv_t cd;
+ char buf[100];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ cd = iconv_open ("UTF-8", "UTF-32LE");
+ ASSERT (cd != (iconv_t)(-1));
+
+ inptr = input;
+ inbytesleft = sizeof (input) - 1;
+ outptr = buf;
+ outbytesleft = sizeof (buf);
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + (sizeof (expected) - 1));
+ ASSERT (memcmp (buf, expected, sizeof (expected) - 1) == 0);
+
+ ASSERT (iconv_close (cd) == 0);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-iconv.c b/gnulib/tests/test-iconv.c
new file mode 100644
index 00000000..cf00ac89
--- /dev/null
+++ b/gnulib/tests/test-iconv.c
@@ -0,0 +1,148 @@
+/* Test of character set conversion.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+
+# ifndef ICONV_CONST
+# define ICONV_CONST /* empty */
+# endif
+
+#include "signature.h"
+SIGNATURE_CHECK (iconv, size_t, (iconv_t, ICONV_CONST char **, size_t *,
+ char **, size_t *));
+SIGNATURE_CHECK (iconv_close, int, (iconv_t x));
+SIGNATURE_CHECK (iconv_open, iconv_t, (char const *, char const *));
+
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ and UTF-8. */
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8");
+
+ ASSERT (cd_88591_to_utf8 != (iconv_t)(-1));
+ ASSERT (cd_utf8_to_88591 != (iconv_t)(-1));
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ {
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ char buf[50];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + strlen (expected));
+ ASSERT (memcmp (buf, expected, strlen (expected)) == 0);
+ }
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with E2BIG. */
+ {
+ static const char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ const char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == (size_t)(-1) && errno == E2BIG);
+ ASSERT (inbytesleft == 1);
+ ASSERT (outbytesleft == 1);
+ ASSERT ((unsigned char) buf[1] == 0xAD);
+ ASSERT ((unsigned char) buf[0] == 0xDE);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ {
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == 0 && inbytesleft == 0);
+ ASSERT (outptr == buf + strlen (expected));
+ ASSERT (memcmp (buf, expected, strlen (expected)) == 0);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ {
+ static const char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == (size_t)(-1))
+ {
+ ASSERT (errno == EILSEQ);
+ ASSERT (inbytesleft == strlen (input) && outptr == buf);
+ }
+ else
+ {
+ ASSERT (res == 1);
+ ASSERT (inbytesleft == 0);
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ {
+ static const char input[] = "\342";
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ (ICONV_CONST char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ ASSERT (res == (size_t)(-1) && errno == EINVAL);
+ ASSERT (inbytesleft == 1 && outptr == buf);
+ }
+
+ iconv_close (cd_88591_to_utf8);
+ iconv_close (cd_utf8_to_88591);
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-iconvme.c b/gnulib/tests/test-iconvme.c
new file mode 100644
index 00000000..e88b29eb
--- /dev/null
+++ b/gnulib/tests/test-iconvme.c
@@ -0,0 +1,85 @@
+/* Recode strings between character sets, using iconv.
+ Copyright (C) 2004, 2005, 2009, 2010 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "iconvme.h"
+
+int main (int ac, char *av[])
+{
+ char *in = NULL, *out = NULL;
+ char *to = NULL, *from = NULL;
+
+ if (ac > 1)
+ from = av[1];
+
+ if (ac > 2)
+ to = av[2];
+
+ if (ac > 3)
+ in = av[3];
+
+ if (!in)
+ {
+ size_t len = 0;
+ printf ("Enter string to convert:\n\t> ");
+ if (getline (&in, &len, stdin) < 0)
+ perror ("getline");
+ if (in[strlen (in) - 1] == '\n')
+ in[strlen (in) - 1] = '\0';
+ }
+
+ if (!to)
+ {
+ size_t len = 0;
+ printf ("Enter destination code set:\n\t> ");
+ if (getline (&to, &len, stdin) < 0)
+ perror ("getline");
+ if (to[strlen (to) - 1] == '\n')
+ to[strlen (to) - 1] = '\0';
+ }
+
+ if (!from)
+ {
+ size_t len = 0;
+ printf ("Enter source code set:\n\t> ");
+ if (getline (&from, &len, stdin) < 0)
+ perror ("getline");
+ if (from[strlen (from) - 1] == '\n')
+ from[strlen (from) - 1] = '\0';
+ }
+
+ printf (" Input string: `%s'\n"
+ "From code set: `%s'\n"
+ " To code set: `%s'\n",
+ in, from, to);
+
+ out = iconv_string (in, from, to);
+
+ if (out == NULL)
+ perror ("iconv");
+ else
+ {
+ printf ("\nOutput: `%s'\n", out);
+ free (out);
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/gnulib/tests/test-idpriv-drop.c b/gnulib/tests/test-idpriv-drop.c
new file mode 100644
index 00000000..bbc937cd
--- /dev/null
+++ b/gnulib/tests/test-idpriv-drop.c
@@ -0,0 +1,153 @@
+/* Test of dropping uid/gid privileges of the current process permanently.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include "idpriv.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+static void
+show_uids ()
+{
+#if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ ASSERT (getresuid (&real, &effective, &saved) >= 0);
+ printf ("uids: real=%d effective=%d saved=%d",
+ (int) real, (int) effective, (int) saved);
+#elif HAVE_GETEUID
+ printf ("uids: real=%d effective=%d",
+ (int) getuid (), (int) geteuid());
+#elif HAVE_GETUID
+ printf ("uids: real=%d",
+ (int) getuid ());
+#endif
+}
+
+static void
+show_gids ()
+{
+#if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ gid_t real;
+ gid_t effective;
+ gid_t saved;
+ ASSERT (getresgid (&real, &effective, &saved) >= 0);
+ printf ("gids: real=%d effective=%d saved=%d",
+ (int) real, (int) effective, (int) saved);
+#elif HAVE_GETEGID
+ printf ("gids: real=%d effective=%d",
+ (int) getgid (), (int) getegid());
+#elif HAVE_GETGID
+ printf ("gids: real=%d",
+ (int) getgid ());
+#endif
+}
+
+static void
+show (const char *prefix)
+{
+ printf ("%s ", prefix);
+ show_uids ();
+ printf (" ");
+ show_gids ();
+ printf ("\n");
+}
+
+int
+main (int argc, char *argv[])
+{
+ bool verbose = false;
+ int i;
+
+#if HAVE_GETUID
+ int uid = getuid ();
+#endif
+#if HAVE_GETGID
+ int gid = getgid ();
+#endif
+
+ /* Parse arguments.
+ -v enables verbose output.
+ */
+ for (i = 1; i < argc; i++)
+ {
+ const char *arg = argv[i];
+ if (strcmp (arg, "-v") == 0)
+ verbose = true;
+ }
+
+ if (verbose)
+ show ("before drop:");
+
+ ASSERT (idpriv_drop () == 0);
+
+ if (verbose)
+ show ("after drop: ");
+
+ /* Verify that the privileges have really been dropped. */
+#if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresuid (&real, &effective, &saved) < 0
+ || real != uid
+ || effective != uid
+ || saved != uid)
+ abort ();
+ }
+#else
+# if HAVE_GETEUID
+ if (geteuid () != uid)
+ abort ();
+# endif
+# if HAVE_GETUID
+ if (getuid () != uid)
+ abort ();
+# endif
+#endif
+#if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ gid_t real;
+ gid_t effective;
+ gid_t saved;
+ if (getresgid (&real, &effective, &saved) < 0
+ || real != gid
+ || effective != gid
+ || saved != gid)
+ abort ();
+ }
+#else
+# if HAVE_GETEGID
+ if (getegid () != gid)
+ abort ();
+# endif
+# if HAVE_GETGID
+ if (getgid () != gid)
+ abort ();
+# endif
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-idpriv-drop.sh b/gnulib/tests/test-idpriv-drop.sh
new file mode 100755
index 00000000..c5689b16
--- /dev/null
+++ b/gnulib/tests/test-idpriv-drop.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+# A POSIX compliant 'id' program.
+if test -f /usr/xpg4/bin/id; then
+ ID=/usr/xpg4/bin/id
+else
+ ID=id
+fi
+
+# The user's original uid and gid.
+uid=`$ID -u`
+gid=`$ID -g`
+
+if test `$ID -u` = 0; then
+ # No need to ask for a password.
+ "${srcdir}/test-idpriv-drop.su.sh" "$uid" "$gid"
+else
+ echo "Need root privileges for the 'test-idpriv-drop' test. Deny if you don't trust." > /dev/tty
+ if (type sudo) > /dev/null 2>&1; then
+ # Use the 'sudo' program.
+ sudo "${srcdir}/test-idpriv-drop.su.sh" "$uid" "$gid"
+ else
+ # Use the 'su' program.
+ su root -c "${srcdir}/test-idpriv-drop.su.sh \"$uid\" \"$gid\""
+ fi
+ result=$?
+ case $result in
+ 0) exit 0;;
+ 77) exit 77;;
+ 13) exit 1;;
+ *) echo "Skipping test: root privileges not granted"; exit 77;;
+ esac
+fi
diff --git a/gnulib/tests/test-idpriv-drop.su.sh b/gnulib/tests/test-idpriv-drop.su.sh
new file mode 100755
index 00000000..5dadc24a
--- /dev/null
+++ b/gnulib/tests/test-idpriv-drop.su.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# This script must be run as superuser.
+
+origuid=$1
+origgid=$2
+
+# A POSIX compliant 'id' program.
+if test -f /usr/xpg4/bin/id; then
+ ID=/usr/xpg4/bin/id
+else
+ ID=id
+fi
+
+if test `$ID -u` != 0; then
+ echo "Skipping test: not superuser"
+ exit 77
+fi
+
+./test-idpriv-drop${EXEEXT} || exit 13 # normal
+
+chown root:root test-idpriv-drop${EXEEXT} 2>/dev/null || \
+chown root:wheel test-idpriv-drop${EXEEXT} 2>/dev/null || \
+ { echo "Skipping test: root privilege not sufficient on this file system"
+ exit 77
+ }
+chmod 4755 test-idpriv-drop${EXEEXT}
+./test-idpriv-drop${EXEEXT} || exit 13 # setuid root
+chmod 2755 test-idpriv-drop${EXEEXT}
+./test-idpriv-drop${EXEEXT} || exit 13 # setgid root
+chmod 6755 test-idpriv-drop${EXEEXT}
+./test-idpriv-drop${EXEEXT} || exit 13 # setuid and setgid root
+
+if chown nobody test-idpriv-drop${EXEEXT} 2>/dev/null; then
+ chmod 4755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setuid nobody
+ chmod 2755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setgid root
+ chmod 6755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setuid nobody and setgid root
+fi
+
+if chown root:nobody test-idpriv-drop${EXEEXT} 2>/dev/null; then
+ chmod 4755 test-idpriv-drop${EXEEXT}
+ ./test-idpriv-drop${EXEEXT} || exit 13 # setuid root
+ chmod 2755 test-idpriv-drop${EXEEXT}
+ ./test-idpriv-drop${EXEEXT} || exit 13 # setgid nobody
+ chmod 6755 test-idpriv-drop${EXEEXT}
+ ./test-idpriv-drop${EXEEXT} || exit 13 # setuid root and setgid nobody
+fi
+
+chown "$origuid:$origgid" test-idpriv-drop${EXEEXT}
+chmod 755 test-idpriv-drop${EXEEXT}
diff --git a/gnulib/tests/test-idpriv-droptemp.c b/gnulib/tests/test-idpriv-droptemp.c
new file mode 100644
index 00000000..eff1b247
--- /dev/null
+++ b/gnulib/tests/test-idpriv-droptemp.c
@@ -0,0 +1,160 @@
+/* Test of dropping uid/gid privileges of the current process temporarily.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include "idpriv.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+static void
+show_uids ()
+{
+#if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ ASSERT (getresuid (&real, &effective, &saved) >= 0);
+ printf ("uids: real=%d effective=%d saved=%d",
+ (int) real, (int) effective, (int) saved);
+#elif HAVE_GETEUID
+ printf ("uids: real=%d effective=%d",
+ (int) getuid (), (int) geteuid());
+#elif HAVE_GETUID
+ printf ("uids: real=%d",
+ (int) getuid ());
+#endif
+}
+
+static void
+show_gids ()
+{
+#if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ gid_t real;
+ gid_t effective;
+ gid_t saved;
+ ASSERT (getresgid (&real, &effective, &saved) >= 0);
+ printf ("gids: real=%d effective=%d saved=%d",
+ (int) real, (int) effective, (int) saved);
+#elif HAVE_GETEGID
+ printf ("gids: real=%d effective=%d",
+ (int) getgid (), (int) getegid());
+#elif HAVE_GETGID
+ printf ("gids: real=%d",
+ (int) getgid ());
+#endif
+}
+
+static void
+show (const char *prefix)
+{
+ printf ("%s ", prefix);
+ show_uids ();
+ printf (" ");
+ show_gids ();
+ printf ("\n");
+}
+
+int
+main (int argc, char *argv[])
+{
+ bool verbose = false;
+ int i;
+
+#if HAVE_GETUID
+ int uid = getuid ();
+#endif
+#if HAVE_GETEUID
+ int privileged_uid = geteuid ();
+#endif
+#if HAVE_GETGID
+ int gid = getgid ();
+#endif
+#if HAVE_GETEGID
+ int privileged_gid = getegid ();
+#endif
+
+ /* Parse arguments.
+ -v enables verbose output.
+ */
+ for (i = 1; i < argc; i++)
+ {
+ const char *arg = argv[i];
+ if (strcmp (arg, "-v") == 0)
+ verbose = true;
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ if (verbose)
+ show ("before droptemp:");
+
+ ASSERT (idpriv_temp_drop () == 0);
+
+ if (verbose)
+ show ("privileged: ");
+
+ /* Verify that the privileges have really been dropped. */
+#if HAVE_GETEUID
+ if (geteuid () != uid)
+ abort ();
+#endif
+#if HAVE_GETUID
+ if (getuid () != uid)
+ abort ();
+#endif
+#if HAVE_GETEGID
+ if (getegid () != gid)
+ abort ();
+#endif
+#if HAVE_GETGID
+ if (getgid () != gid)
+ abort ();
+#endif
+
+ ASSERT (idpriv_temp_restore () == 0);
+
+ if (verbose)
+ show ("unprivileged: ");
+
+ /* Verify that the privileges have really been acquired again. */
+#if HAVE_GETEUID
+ if (geteuid () != privileged_uid)
+ abort ();
+#endif
+#if HAVE_GETUID
+ if (getuid () != uid)
+ abort ();
+#endif
+#if HAVE_GETEGID
+ if (getegid () != privileged_gid)
+ abort ();
+#endif
+#if HAVE_GETGID
+ if (getgid () != gid)
+ abort ();
+#endif
+ }
+
+
+ return 0;
+}
diff --git a/gnulib/tests/test-idpriv-droptemp.sh b/gnulib/tests/test-idpriv-droptemp.sh
new file mode 100755
index 00000000..9b1b8228
--- /dev/null
+++ b/gnulib/tests/test-idpriv-droptemp.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+# A POSIX compliant 'id' program.
+if test -f /usr/xpg4/bin/id; then
+ ID=/usr/xpg4/bin/id
+else
+ ID=id
+fi
+
+# The user's original uid and gid.
+uid=`$ID -u`
+gid=`$ID -g`
+
+if test `$ID -u` = 0; then
+ # No need to ask for a password.
+ "${srcdir}/test-idpriv-droptemp.su.sh" "$uid" "$gid"
+else
+ echo "Need root privileges for the 'test-idpriv-droptemp' test. Deny if you don't trust." > /dev/tty
+ if (type sudo) > /dev/null 2>&1; then
+ # Use the 'sudo' program.
+ sudo "${srcdir}/test-idpriv-droptemp.su.sh" "$uid" "$gid"
+ else
+ # Use the 'su' program.
+ su root -c "${srcdir}/test-idpriv-droptemp.su.sh \"$uid\" \"$gid\""
+ fi
+ result=$?
+ case $result in
+ 0) exit 0;;
+ 77) exit 77;;
+ 13) exit 1;;
+ *) echo "Skipping test: root privileges not granted"; exit 77;;
+ esac
+fi
diff --git a/gnulib/tests/test-idpriv-droptemp.su.sh b/gnulib/tests/test-idpriv-droptemp.su.sh
new file mode 100755
index 00000000..74358f81
--- /dev/null
+++ b/gnulib/tests/test-idpriv-droptemp.su.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# This script must be run as superuser.
+
+origuid=$1
+origgid=$2
+
+# A POSIX compliant 'id' program.
+if test -f /usr/xpg4/bin/id; then
+ ID=/usr/xpg4/bin/id
+else
+ ID=id
+fi
+
+if test `$ID -u` != 0; then
+ echo "Skipping test: not superuser"
+ exit 77
+fi
+
+./test-idpriv-droptemp${EXEEXT} || exit 13 # normal
+
+chown root:root test-idpriv-droptemp${EXEEXT} 2>/dev/null || \
+chown root:wheel test-idpriv-droptemp${EXEEXT} 2>/dev/null || \
+ { echo "Skipping test: root privilege not sufficient on this file system"
+ exit 77
+ }
+chmod 4755 test-idpriv-droptemp${EXEEXT}
+./test-idpriv-droptemp${EXEEXT} || exit 13 # setuid root
+chmod 2755 test-idpriv-droptemp${EXEEXT}
+./test-idpriv-droptemp${EXEEXT} || exit 13 # setgid root
+chmod 6755 test-idpriv-droptemp${EXEEXT}
+./test-idpriv-droptemp${EXEEXT} || exit 13 # setuid and setgid root
+
+if chown nobody test-idpriv-droptemp${EXEEXT} 2>/dev/null; then
+ chmod 4755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setuid nobody
+ chmod 2755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setgid root
+ chmod 6755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setuid nobody and setgid root
+fi
+
+if chown root:nobody test-idpriv-droptemp${EXEEXT} 2>/dev/null; then
+ chmod 4755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setuid root
+ chmod 2755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setgid nobody
+ chmod 6755 test-idpriv-droptemp${EXEEXT}
+ ./test-idpriv-droptemp${EXEEXT} || exit 13 # setuid root and setgid nobody
+fi
+
+chown "$origuid:$origgid" test-idpriv-droptemp${EXEEXT}
+chmod 755 test-idpriv-droptemp${EXEEXT}
diff --git a/gnulib/tests/test-inet_ntop.c b/gnulib/tests/test-inet_ntop.c
new file mode 100644
index 00000000..d3b045c3
--- /dev/null
+++ b/gnulib/tests/test-inet_ntop.c
@@ -0,0 +1,56 @@
+/* Test of inet_ntop function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <arpa/inet.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (inet_ntop, char const *, (int, void const *, char *,
+ socklen_t));
+
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+#if defined AF_INET /* HAVE_IPV4 */
+ {
+ struct in_addr internal;
+ char printable[16];
+ const char *result;
+
+ /* This machine was for a long time known as
+ ma2s2.mathematik.uni-karlsruhe.de. */
+# ifdef WORDS_BIGENDIAN
+ internal.s_addr = 0x810D7302;
+# else
+ internal.s_addr = 0x02730D81;
+# endif
+ result = inet_ntop (AF_INET, &internal, printable, sizeof (printable));
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "129.13.115.2") == 0);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-inet_pton.c b/gnulib/tests/test-inet_pton.c
new file mode 100644
index 00000000..74afc0c0
--- /dev/null
+++ b/gnulib/tests/test-inet_pton.c
@@ -0,0 +1,58 @@
+/* Test of inet_pton function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <arpa/inet.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (inet_pton, int, (int, const char *, void *));
+
+#include <netinet/in.h>
+#include <sys/socket.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+#if defined AF_INET /* HAVE_IPV4 */
+ {
+ /* This machine was for a long time known as
+ ma2s2.mathematik.uni-karlsruhe.de. */
+ const char printable[] = "129.13.115.2";
+ struct in_addr internal;
+ int ret;
+
+ ret = inet_pton (AF_INET, printable, &internal);
+ ASSERT (ret == 1);
+ /* Verify that internal is filled in network byte order. */
+ ASSERT (((unsigned char *) &internal)[0] == 0x81);
+ ASSERT (((unsigned char *) &internal)[1] == 0x0D);
+ ASSERT (((unsigned char *) &internal)[2] == 0x73);
+ ASSERT (((unsigned char *) &internal)[3] == 0x02);
+# ifdef WORDS_BIGENDIAN
+ ASSERT (internal.s_addr == 0x810D7302);
+# else
+ ASSERT (internal.s_addr == 0x02730D81);
+# endif
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-inttypes.c b/gnulib/tests/test-inttypes.c
new file mode 100644
index 00000000..f055a4e8
--- /dev/null
+++ b/gnulib/tests/test-inttypes.c
@@ -0,0 +1,121 @@
+/* Test of <inttypes.h> substitute.
+ Copyright (C) 2006-2007, 2009-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
+#define __STDC_FORMAT_MACROS 1 /* to make it work also in C++ mode */
+#include <inttypes.h>
+
+#include <stddef.h>
+
+/* Tests for macros supposed to be defined in inttypes.h. */
+
+const char *k = /* implicit string concatenation */
+#ifdef INT8_MAX
+ PRId8 PRIi8
+#endif
+#ifdef UINT8_MAX
+ PRIo8 PRIu8 PRIx8 PRIX8
+#endif
+#ifdef INT16_MAX
+ PRId16 PRIi16
+#endif
+#ifdef UINT16_MAX
+ PRIo16 PRIu16 PRIx16 PRIX16
+#endif
+#ifdef INT32_MAX
+ PRId32 PRIi32
+#endif
+#ifdef UINT32_MAX
+ PRIo32 PRIu32 PRIx32 PRIX32
+#endif
+#ifdef INT64_MAX
+ PRId64 PRIi64
+#endif
+#ifdef UINT64_MAX
+ PRIo64 PRIu64 PRIx64 PRIX64
+#endif
+ PRIdLEAST8 PRIiLEAST8 PRIoLEAST8 PRIuLEAST8 PRIxLEAST8 PRIXLEAST8
+ PRIdLEAST16 PRIiLEAST16 PRIoLEAST16 PRIuLEAST16 PRIxLEAST16 PRIXLEAST16
+ PRIdLEAST32 PRIiLEAST32 PRIoLEAST32 PRIuLEAST32 PRIxLEAST32 PRIXLEAST32
+ PRIdLEAST64 PRIiLEAST64
+ PRIoLEAST64 PRIuLEAST64 PRIxLEAST64 PRIXLEAST64
+ PRIdFAST8 PRIiFAST8 PRIoFAST8 PRIuFAST8 PRIxFAST8 PRIXFAST8
+ PRIdFAST16 PRIiFAST16 PRIoFAST16 PRIuFAST16 PRIxFAST16 PRIXFAST16
+ PRIdFAST32 PRIiFAST32 PRIoFAST32 PRIuFAST32 PRIxFAST32 PRIXFAST32
+ PRIdFAST64 PRIiFAST64
+ PRIoFAST64 PRIuFAST64 PRIxFAST64 PRIXFAST64
+ PRIdMAX PRIiMAX PRIoMAX PRIuMAX PRIxMAX PRIXMAX
+#ifdef INTPTR_MAX
+ PRIdPTR PRIiPTR
+#endif
+#ifdef UINTPTR_MAX
+ PRIoPTR PRIuPTR PRIxPTR PRIXPTR
+#endif
+ ;
+const char *l = /* implicit string concatenation */
+#ifdef INT8_MAX
+ SCNd8 SCNi8
+#endif
+#ifdef UINT8_MAX
+ SCNo8 SCNu8 SCNx8
+#endif
+#ifdef INT16_MAX
+ SCNd16 SCNi16
+#endif
+#ifdef UINT16_MAX
+ SCNo16 SCNu16 SCNx16
+#endif
+#ifdef INT32_MAX
+ SCNd32 SCNi32
+#endif
+#ifdef UINT32_MAX
+ SCNo32 SCNu32 SCNx32
+#endif
+#ifdef INT64_MAX
+ SCNd64 SCNi64
+#endif
+#ifdef UINT64_MAX
+ SCNo64 SCNu64 SCNx64
+#endif
+ SCNdLEAST8 SCNiLEAST8 SCNoLEAST8 SCNuLEAST8 SCNxLEAST8
+ SCNdLEAST16 SCNiLEAST16 SCNoLEAST16 SCNuLEAST16 SCNxLEAST16
+ SCNdLEAST32 SCNiLEAST32 SCNoLEAST32 SCNuLEAST32 SCNxLEAST32
+ SCNdLEAST64 SCNiLEAST64
+ SCNoLEAST64 SCNuLEAST64 SCNxLEAST64
+ SCNdFAST8 SCNiFAST8 SCNoFAST8 SCNuFAST8 SCNxFAST8
+ SCNdFAST16 SCNiFAST16 SCNoFAST16 SCNuFAST16 SCNxFAST16
+ SCNdFAST32 SCNiFAST32 SCNoFAST32 SCNuFAST32 SCNxFAST32
+ SCNdFAST64 SCNiFAST64
+ SCNoFAST64 SCNuFAST64 SCNxFAST64
+ SCNdMAX SCNiMAX SCNoMAX SCNuMAX SCNxMAX
+#ifdef INTPTR_MAX
+ SCNdPTR SCNiPTR
+#endif
+#ifdef UINTPTR_MAX
+ SCNoPTR SCNuPTR SCNxPTR
+#endif
+ ;
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-isblank.c b/gnulib/tests/test-isblank.c
new file mode 100644
index 00000000..17ac7011
--- /dev/null
+++ b/gnulib/tests/test-isblank.c
@@ -0,0 +1,50 @@
+/* Test of isblank() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <ctype.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (isblank, int, (int));
+
+#include <limits.h>
+#include <stdio.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ unsigned int c;
+
+ /* Verify the property in the "C" locale.
+ POSIX specifies in
+ <http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html>
+ that
+ - in all locales, the blank characters include the <space> and <tab>
+ characters,
+ - in the "POSIX" locale (which is usually the same as the "C" locale),
+ the blank characters include only the ASCII <space> and <tab>
+ characters. */
+ for (c = 0; c <= UCHAR_MAX; c++)
+ ASSERT (!isblank (c) == !(c == ' ' || c == '\t'));
+ ASSERT (!isblank (EOF));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-isfinite.c b/gnulib/tests/test-isfinite.c
new file mode 100644
index 00000000..e7bf79c5
--- /dev/null
+++ b/gnulib/tests/test-isfinite.c
@@ -0,0 +1,236 @@
+/* Test of isfinite() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Ben Pfaff, 2007, using Bruno Haible's code as a
+ template. */
+
+#include <config.h>
+
+#include <math.h>
+
+/* isfinite must be a macro. */
+#ifndef isfinite
+# error missing declaration
+#endif
+
+#include <float.h>
+#include <limits.h>
+
+#include "macros.h"
+
+float zerof = 0.0f;
+double zerod = 0.0;
+long double zerol = 0.0L;
+
+static void
+test_isfinitef ()
+{
+ /* Zero. */
+ ASSERT (isfinite (0.0f));
+ /* Subnormal values. */
+ ASSERT (isfinite (FLT_MIN / 2));
+ ASSERT (isfinite (-FLT_MIN / 2));
+ /* Finite values. */
+ ASSERT (isfinite (3.141f));
+ ASSERT (isfinite (3.141e30f));
+ ASSERT (isfinite (3.141e-30f));
+ ASSERT (isfinite (-2.718f));
+ ASSERT (isfinite (-2.718e30f));
+ ASSERT (isfinite (-2.718e-30f));
+ /* Infinite values. */
+ ASSERT (!isfinite (1.0f / 0.0f));
+ ASSERT (!isfinite (-1.0f / 0.0f));
+ /* Quiet NaN. */
+ ASSERT (!isfinite (zerof / zerof));
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+ memory_float m;
+ m.value = zerof / zerof;
+# if FLT_EXPBIT0_BIT > 0
+ m.word[FLT_EXPBIT0_WORD] ^= (unsigned int) 1 << (FLT_EXPBIT0_BIT - 1);
+# else
+ m.word[FLT_EXPBIT0_WORD + (FLT_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ if (FLT_EXPBIT0_WORD < NWORDS / 2)
+ m.word[FLT_EXPBIT0_WORD + 1] |= (unsigned int) 1 << FLT_EXPBIT0_BIT;
+ else
+ m.word[0] |= (unsigned int) 1;
+ ASSERT (!isfinite (m.value));
+ #undef NWORDS
+ }
+#endif
+}
+
+static void
+test_isfinited ()
+{
+ /* Zero. */
+ ASSERT (isfinite (0.0));
+ /* Subnormal values. */
+ ASSERT (isfinite (DBL_MIN / 2));
+ ASSERT (isfinite (-DBL_MIN / 2));
+ /* Finite values. */
+ ASSERT (isfinite (3.141));
+ ASSERT (isfinite (3.141e30));
+ ASSERT (isfinite (3.141e-30));
+ ASSERT (isfinite (-2.718));
+ ASSERT (isfinite (-2.718e30));
+ ASSERT (isfinite (-2.718e-30));
+ /* Infinite values. */
+ ASSERT (!isfinite (1.0 / 0.0));
+ ASSERT (!isfinite (-1.0 / 0.0));
+ /* Quiet NaN. */
+ ASSERT (!isfinite (zerod / zerod));
+#if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+ memory_double m;
+ m.value = zerod / zerod;
+# if DBL_EXPBIT0_BIT > 0
+ m.word[DBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (DBL_EXPBIT0_BIT - 1);
+# else
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << DBL_EXPBIT0_BIT;
+ ASSERT (!isfinite (m.value));
+ #undef NWORDS
+ }
+#endif
+}
+
+static void
+test_isfinitel ()
+{
+ #define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { unsigned int word[NWORDS]; long double value; }
+ memory_long_double;
+
+ /* Zero. */
+ ASSERT (isfinite (0.0L));
+ /* Subnormal values. */
+ ASSERT (isfinite (LDBL_MIN / 2));
+ ASSERT (isfinite (-LDBL_MIN / 2));
+ /* Finite values. */
+ ASSERT (isfinite (3.141L));
+ ASSERT (isfinite (3.141e30L));
+ ASSERT (isfinite (3.141e-30L));
+ ASSERT (isfinite (-2.718L));
+ ASSERT (isfinite (-2.718e30L));
+ ASSERT (isfinite (-2.718e-30L));
+ /* Infinite values. */
+ ASSERT (!isfinite (1.0L / 0.0L));
+ ASSERT (!isfinite (-1.0L / 0.0L));
+ /* Quiet NaN. */
+ ASSERT (!isfinite (zerol / zerol));
+
+#if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
+ /* A bit pattern that is different from a Quiet NaN. With a bit of luck,
+ it's a Signalling NaN. */
+ {
+ memory_long_double m;
+ m.value = zerol / zerol;
+# if LDBL_EXPBIT0_BIT > 0
+ m.word[LDBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (LDBL_EXPBIT0_BIT - 1);
+# else
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << LDBL_EXPBIT0_BIT;
+ ASSERT (!isfinite (m.value));
+ }
+#endif
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ ASSERT (!isfinite (x.value));
+ }
+ {
+ /* Signalling NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ ASSERT (!isfinite (x.value));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ ASSERT (!isfinite (x.value));
+ }
+ { /* Pseudo-Infinity. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ ASSERT (!isfinite (x.value));
+ }
+ { /* Pseudo-Zero. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ ASSERT (!isfinite (x.value));
+ }
+ { /* Unnormalized number. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ ASSERT (!isfinite (x.value));
+ }
+ { /* Pseudo-Denormal. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ ASSERT (!isfinite (x.value));
+ }
+#endif
+
+ #undef NWORDS
+}
+
+int
+main ()
+{
+ test_isfinitef ();
+ test_isfinited ();
+ test_isfinitel ();
+ return 0;
+}
diff --git a/gnulib/tests/test-isinf.c b/gnulib/tests/test-isinf.c
new file mode 100644
index 00000000..0d613a13
--- /dev/null
+++ b/gnulib/tests/test-isinf.c
@@ -0,0 +1,242 @@
+/* Test of isinf() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Ben Pfaff, 2008, using Bruno Haible's code as a
+ template. */
+
+#include <config.h>
+
+#include <math.h>
+
+/* isinf must be a macro. */
+#ifndef isinf
+# error missing declaration
+#endif
+
+#include <float.h>
+#include <limits.h>
+
+#include "macros.h"
+
+float zerof = 0.0f;
+double zerod = 0.0;
+long double zerol = 0.0L;
+
+static void
+test_isinff ()
+{
+ /* Zero. */
+ ASSERT (!isinf (0.0f));
+ /* Subnormal values. */
+ ASSERT (!isinf (FLT_MIN / 2));
+ ASSERT (!isinf (-FLT_MIN / 2));
+ /* Finite values. */
+ ASSERT (!isinf (3.141f));
+ ASSERT (!isinf (3.141e30f));
+ ASSERT (!isinf (3.141e-30f));
+ ASSERT (!isinf (-2.718f));
+ ASSERT (!isinf (-2.718e30f));
+ ASSERT (!isinf (-2.718e-30f));
+ ASSERT (!isinf (FLT_MAX));
+ ASSERT (!isinf (-FLT_MAX));
+ /* Infinite values. */
+ ASSERT (isinf (1.0f / 0.0f));
+ ASSERT (isinf (-1.0f / 0.0f));
+ /* Quiet NaN. */
+ ASSERT (!isinf (zerof / zerof));
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+ memory_float m;
+ m.value = zerof / zerof;
+# if FLT_EXPBIT0_BIT > 0
+ m.word[FLT_EXPBIT0_WORD] ^= (unsigned int) 1 << (FLT_EXPBIT0_BIT - 1);
+# else
+ m.word[FLT_EXPBIT0_WORD + (FLT_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ if (FLT_EXPBIT0_WORD < NWORDS / 2)
+ m.word[FLT_EXPBIT0_WORD + 1] |= (unsigned int) 1 << FLT_EXPBIT0_BIT;
+ else
+ m.word[0] |= (unsigned int) 1;
+ ASSERT (!isinf (m.value));
+ #undef NWORDS
+ }
+#endif
+}
+
+static void
+test_isinfd ()
+{
+ /* Zero. */
+ ASSERT (!isinf (0.0));
+ /* Subnormal values. */
+ ASSERT (!isinf (DBL_MIN / 2));
+ ASSERT (!isinf (-DBL_MIN / 2));
+ /* Finite values. */
+ ASSERT (!isinf (3.141));
+ ASSERT (!isinf (3.141e30));
+ ASSERT (!isinf (3.141e-30));
+ ASSERT (!isinf (-2.718));
+ ASSERT (!isinf (-2.718e30));
+ ASSERT (!isinf (-2.718e-30));
+ ASSERT (!isinf (DBL_MAX));
+ ASSERT (!isinf (-DBL_MAX));
+ /* Infinite values. */
+ ASSERT (isinf (1.0 / 0.0));
+ ASSERT (isinf (-1.0 / 0.0));
+ /* Quiet NaN. */
+ ASSERT (!isinf (zerod / zerod));
+#if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+ memory_double m;
+ m.value = zerod / zerod;
+# if DBL_EXPBIT0_BIT > 0
+ m.word[DBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (DBL_EXPBIT0_BIT - 1);
+# else
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << DBL_EXPBIT0_BIT;
+ ASSERT (!isinf (m.value));
+ #undef NWORDS
+ }
+#endif
+}
+
+static void
+test_isinfl ()
+{
+ #define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { unsigned int word[NWORDS]; long double value; }
+ memory_long_double;
+
+ /* Zero. */
+ ASSERT (!isinf (0.0L));
+ /* Subnormal values. */
+ ASSERT (!isinf (LDBL_MIN / 2));
+ ASSERT (!isinf (-LDBL_MIN / 2));
+ /* Finite values. */
+ ASSERT (!isinf (3.141L));
+ ASSERT (!isinf (3.141e30L));
+ ASSERT (!isinf (3.141e-30L));
+ ASSERT (!isinf (-2.718L));
+ ASSERT (!isinf (-2.718e30L));
+ ASSERT (!isinf (-2.718e-30L));
+ ASSERT (!isinf (LDBL_MAX));
+ ASSERT (!isinf (-LDBL_MAX));
+ /* Infinite values. */
+ ASSERT (isinf (1.0L / 0.0L));
+ ASSERT (isinf (-1.0L / 0.0L));
+ /* Quiet NaN. */
+ ASSERT (!isinf (zerol / zerol));
+
+#if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
+ /* A bit pattern that is different from a Quiet NaN. With a bit of luck,
+ it's a Signalling NaN. */
+ {
+ memory_long_double m;
+ m.value = zerol / zerol;
+# if LDBL_EXPBIT0_BIT > 0
+ m.word[LDBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (LDBL_EXPBIT0_BIT - 1);
+# else
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << LDBL_EXPBIT0_BIT;
+ ASSERT (!isinf (m.value));
+ }
+#endif
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ ASSERT (!isinf (x.value));
+ }
+ {
+ /* Signalling NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ ASSERT (!isinf (x.value));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ ASSERT (!isinf (x.value));
+ }
+ { /* Pseudo-Infinity. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ ASSERT (!isinf (x.value));
+ }
+ { /* Pseudo-Zero. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ ASSERT (!isinf (x.value));
+ }
+ { /* Unnormalized number. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ ASSERT (!isinf (x.value));
+ }
+ { /* Pseudo-Denormal. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ ASSERT (!isinf (x.value));
+ }
+#endif
+
+ #undef NWORDS
+}
+
+int
+main ()
+{
+ test_isinff ();
+ test_isinfd ();
+ test_isinfl ();
+ return 0;
+}
diff --git a/gnulib/tests/test-isnan.c b/gnulib/tests/test-isnan.c
new file mode 100644
index 00000000..d1d05dce
--- /dev/null
+++ b/gnulib/tests/test-isnan.c
@@ -0,0 +1,244 @@
+/* Test of isnand() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Ben Pfaff <blp@cs.stanford.edu>, from code by Bruno
+ Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+#include <math.h>
+
+/* isnan must be a macro. */
+#ifndef isnan
+# error missing declaration
+#endif
+
+#include <float.h>
+#include <limits.h>
+
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0f.
+ So we use -zero instead. */
+float zerof = 0.0f;
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zero instead. */
+double zerod = 0.0;
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zerol instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zerol (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zerol compute_minus_zerol ()
+#else
+long double minus_zerol = -0.0L;
+#endif
+
+static void
+test_float (void)
+{
+ /* Finite values. */
+ ASSERT (!isnan (3.141f));
+ ASSERT (!isnan (3.141e30f));
+ ASSERT (!isnan (3.141e-30f));
+ ASSERT (!isnan (-2.718f));
+ ASSERT (!isnan (-2.718e30f));
+ ASSERT (!isnan (-2.718e-30f));
+ ASSERT (!isnan (0.0f));
+ ASSERT (!isnan (-zerof));
+ /* Infinite values. */
+ ASSERT (!isnan (1.0f / 0.0f));
+ ASSERT (!isnan (-1.0f / 0.0f));
+ /* Quiet NaN. */
+ ASSERT (isnan (NaNf ()));
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDSF \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { float value; unsigned int word[NWORDSF]; } memory_float;
+ memory_float m;
+ m.value = NaNf ();
+# if FLT_EXPBIT0_BIT > 0
+ m.word[FLT_EXPBIT0_WORD] ^= (unsigned int) 1 << (FLT_EXPBIT0_BIT - 1);
+# else
+ m.word[FLT_EXPBIT0_WORD + (FLT_EXPBIT0_WORD < NWORDSF / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ if (FLT_EXPBIT0_WORD < NWORDSF / 2)
+ m.word[FLT_EXPBIT0_WORD + 1] |= (unsigned int) 1 << FLT_EXPBIT0_BIT;
+ else
+ m.word[0] |= (unsigned int) 1;
+ ASSERT (isnan (m.value));
+ }
+#endif
+}
+
+static void
+test_double (void)
+{
+ /* Finite values. */
+ ASSERT (!isnan (3.141));
+ ASSERT (!isnan (3.141e30));
+ ASSERT (!isnan (3.141e-30));
+ ASSERT (!isnan (-2.718));
+ ASSERT (!isnan (-2.718e30));
+ ASSERT (!isnan (-2.718e-30));
+ ASSERT (!isnan (0.0));
+ ASSERT (!isnan (-zerod));
+ /* Infinite values. */
+ ASSERT (!isnan (1.0 / 0.0));
+ ASSERT (!isnan (-1.0 / 0.0));
+ /* Quiet NaN. */
+ ASSERT (isnan (NaNd ()));
+#if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDSD \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { double value; unsigned int word[NWORDSD]; } memory_double;
+ memory_double m;
+ m.value = NaNd ();
+# if DBL_EXPBIT0_BIT > 0
+ m.word[DBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (DBL_EXPBIT0_BIT - 1);
+# else
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDSD / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDSD / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << DBL_EXPBIT0_BIT;
+ ASSERT (isnan (m.value));
+ }
+#endif
+}
+
+static void
+test_long_double (void)
+{
+ #define NWORDSL \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { unsigned int word[NWORDSL]; long double value; }
+ memory_long_double;
+
+ /* Finite values. */
+ ASSERT (!isnan (3.141L));
+ ASSERT (!isnan (3.141e30L));
+ ASSERT (!isnan (3.141e-30L));
+ ASSERT (!isnan (-2.718L));
+ ASSERT (!isnan (-2.718e30L));
+ ASSERT (!isnan (-2.718e-30L));
+ ASSERT (!isnan (0.0L));
+ ASSERT (!isnan (minus_zerol));
+ /* Infinite values. */
+ ASSERT (!isnan (1.0L / 0.0L));
+ ASSERT (!isnan (-1.0L / 0.0L));
+ /* Quiet NaN. */
+ ASSERT (isnan (NaNl ()));
+
+#if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
+ /* A bit pattern that is different from a Quiet NaN. With a bit of luck,
+ it's a Signalling NaN. */
+ {
+ memory_long_double m;
+ m.value = NaNl ();
+# if LDBL_EXPBIT0_BIT > 0
+ m.word[LDBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (LDBL_EXPBIT0_BIT - 1);
+# else
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDSL / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDSL / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << LDBL_EXPBIT0_BIT;
+ ASSERT (isnan (m.value));
+ }
+#endif
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ ASSERT (isnan (x.value));
+ }
+ {
+ /* Signalling NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ ASSERT (isnan (x.value));
+ }
+ /* The isnan function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ ASSERT (isnan (x.value));
+ }
+ { /* Pseudo-Infinity. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ ASSERT (isnan (x.value));
+ }
+ { /* Pseudo-Zero. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ ASSERT (isnan (x.value));
+ }
+ { /* Unnormalized number. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ ASSERT (isnan (x.value));
+ }
+ { /* Pseudo-Denormal. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ ASSERT (isnan (x.value));
+ }
+#endif
+}
+
+int
+main ()
+{
+ test_float ();
+ test_double ();
+ test_long_double ();
+ return 0;
+}
diff --git a/gnulib/tests/test-isnand-nolibm.c b/gnulib/tests/test-isnand-nolibm.c
new file mode 100644
index 00000000..b0ac0ba4
--- /dev/null
+++ b/gnulib/tests/test-isnand-nolibm.c
@@ -0,0 +1,22 @@
+/* Test of isnand() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include "isnand-nolibm.h"
+
+#include "test-isnand.h"
+
diff --git a/gnulib/tests/test-isnand.c b/gnulib/tests/test-isnand.c
new file mode 100644
index 00000000..092e2316
--- /dev/null
+++ b/gnulib/tests/test-isnand.c
@@ -0,0 +1,22 @@
+/* Test of isnand() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "test-isnand.h"
+
diff --git a/gnulib/tests/test-isnand.h b/gnulib/tests/test-isnand.h
new file mode 100644
index 00000000..f9866217
--- /dev/null
+++ b/gnulib/tests/test-isnand.h
@@ -0,0 +1,65 @@
+/* Test of isnand() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <limits.h>
+
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zero instead. */
+double zero = 0.0;
+
+int
+main ()
+{
+ /* Finite values. */
+ ASSERT (!isnand (3.141));
+ ASSERT (!isnand (3.141e30));
+ ASSERT (!isnand (3.141e-30));
+ ASSERT (!isnand (-2.718));
+ ASSERT (!isnand (-2.718e30));
+ ASSERT (!isnand (-2.718e-30));
+ ASSERT (!isnand (0.0));
+ ASSERT (!isnand (-zero));
+ /* Infinite values. */
+ ASSERT (!isnand (1.0 / 0.0));
+ ASSERT (!isnand (-1.0 / 0.0));
+ /* Quiet NaN. */
+ ASSERT (isnand (NaNd ()));
+#if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+ memory_double m;
+ m.value = NaNd ();
+# if DBL_EXPBIT0_BIT > 0
+ m.word[DBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (DBL_EXPBIT0_BIT - 1);
+# else
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << DBL_EXPBIT0_BIT;
+ ASSERT (isnand (m.value));
+ }
+#endif
+ return 0;
+}
diff --git a/gnulib/tests/test-isnanf-nolibm.c b/gnulib/tests/test-isnanf-nolibm.c
new file mode 100644
index 00000000..6ac69e0d
--- /dev/null
+++ b/gnulib/tests/test-isnanf-nolibm.c
@@ -0,0 +1,21 @@
+/* Test of isnanf() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include "isnanf-nolibm.h"
+
+#include "test-isnanf.h"
diff --git a/gnulib/tests/test-isnanf.c b/gnulib/tests/test-isnanf.c
new file mode 100644
index 00000000..4c08c55b
--- /dev/null
+++ b/gnulib/tests/test-isnanf.c
@@ -0,0 +1,21 @@
+/* Test of isnanf() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "test-isnanf.h"
diff --git a/gnulib/tests/test-isnanf.h b/gnulib/tests/test-isnanf.h
new file mode 100644
index 00000000..d071b2cc
--- /dev/null
+++ b/gnulib/tests/test-isnanf.h
@@ -0,0 +1,67 @@
+/* Test of isnanf() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <limits.h>
+
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0f.
+ So we use -zero instead. */
+float zero = 0.0f;
+
+int
+main ()
+{
+ /* Finite values. */
+ ASSERT (!isnanf (3.141f));
+ ASSERT (!isnanf (3.141e30f));
+ ASSERT (!isnanf (3.141e-30f));
+ ASSERT (!isnanf (-2.718f));
+ ASSERT (!isnanf (-2.718e30f));
+ ASSERT (!isnanf (-2.718e-30f));
+ ASSERT (!isnanf (0.0f));
+ ASSERT (!isnanf (-zero));
+ /* Infinite values. */
+ ASSERT (!isnanf (1.0f / 0.0f));
+ ASSERT (!isnanf (-1.0f / 0.0f));
+ /* Quiet NaN. */
+ ASSERT (isnanf (NaNf ()));
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+ memory_float m;
+ m.value = NaNf ();
+# if FLT_EXPBIT0_BIT > 0
+ m.word[FLT_EXPBIT0_WORD] ^= (unsigned int) 1 << (FLT_EXPBIT0_BIT - 1);
+# else
+ m.word[FLT_EXPBIT0_WORD + (FLT_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ if (FLT_EXPBIT0_WORD < NWORDS / 2)
+ m.word[FLT_EXPBIT0_WORD + 1] |= (unsigned int) 1 << FLT_EXPBIT0_BIT;
+ else
+ m.word[0] |= (unsigned int) 1;
+ ASSERT (isnanf (m.value));
+ }
+#endif
+ return 0;
+}
diff --git a/gnulib/tests/test-isnanl-nolibm.c b/gnulib/tests/test-isnanl-nolibm.c
new file mode 100644
index 00000000..eeca6d8f
--- /dev/null
+++ b/gnulib/tests/test-isnanl-nolibm.c
@@ -0,0 +1,23 @@
+/* Test of isnanl() substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "isnanl-nolibm.h"
+
+#include "test-isnanl.h"
diff --git a/gnulib/tests/test-isnanl.c b/gnulib/tests/test-isnanl.c
new file mode 100644
index 00000000..8464a9a0
--- /dev/null
+++ b/gnulib/tests/test-isnanl.c
@@ -0,0 +1,23 @@
+/* Test of isnanl() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "test-isnanl.h"
diff --git a/gnulib/tests/test-isnanl.h b/gnulib/tests/test-isnanl.h
new file mode 100644
index 00000000..1665cf41
--- /dev/null
+++ b/gnulib/tests/test-isnanl.h
@@ -0,0 +1,141 @@
+/* Test of isnanl() substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <float.h>
+#include <limits.h>
+
+#include "nan.h"
+#include "macros.h"
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zero instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zero (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+long double minus_zero = -0.0L;
+#endif
+
+int
+main ()
+{
+ #define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { unsigned int word[NWORDS]; long double value; }
+ memory_long_double;
+
+ /* Finite values. */
+ ASSERT (!isnanl (3.141L));
+ ASSERT (!isnanl (3.141e30L));
+ ASSERT (!isnanl (3.141e-30L));
+ ASSERT (!isnanl (-2.718L));
+ ASSERT (!isnanl (-2.718e30L));
+ ASSERT (!isnanl (-2.718e-30L));
+ ASSERT (!isnanl (0.0L));
+ ASSERT (!isnanl (minus_zero));
+ /* Infinite values. */
+ ASSERT (!isnanl (1.0L / 0.0L));
+ ASSERT (!isnanl (-1.0L / 0.0L));
+ /* Quiet NaN. */
+ ASSERT (isnanl (NaNl ()));
+
+#if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
+ /* A bit pattern that is different from a Quiet NaN. With a bit of luck,
+ it's a Signalling NaN. */
+ {
+ memory_long_double m;
+ m.value = NaNl ();
+# if LDBL_EXPBIT0_BIT > 0
+ m.word[LDBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (LDBL_EXPBIT0_BIT - 1);
+# else
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << LDBL_EXPBIT0_BIT;
+ ASSERT (isnanl (m.value));
+ }
+#endif
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ ASSERT (isnanl (x.value));
+ }
+ {
+ /* Signalling NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ ASSERT (isnanl (x.value));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ ASSERT (isnanl (x.value));
+ }
+ { /* Pseudo-Infinity. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ ASSERT (isnanl (x.value));
+ }
+ { /* Pseudo-Zero. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ ASSERT (isnanl (x.value));
+ }
+ { /* Unnormalized number. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ ASSERT (isnanl (x.value));
+ }
+ { /* Pseudo-Denormal. */
+ static memory_long_double x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ ASSERT (isnanl (x.value));
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-j0.c b/gnulib/tests/test-j0.c
new file mode 100644
index 00000000..5cdf6927
--- /dev/null
+++ b/gnulib/tests/test-j0.c
@@ -0,0 +1,40 @@
+/* Test of j0() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (j0, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 3.8;
+ y = j0 (x);
+ ASSERT (y >= -0.4025564102 && y <= -0.4025564101);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-j1.c b/gnulib/tests/test-j1.c
new file mode 100644
index 00000000..2f480517
--- /dev/null
+++ b/gnulib/tests/test-j1.c
@@ -0,0 +1,40 @@
+/* Test of j1() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (j1, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 3.8;
+ y = j1 (x);
+ ASSERT (y >= 0.0128210029 && y <= 0.0128210030);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-jn.c b/gnulib/tests/test-jn.c
new file mode 100644
index 00000000..c2563717
--- /dev/null
+++ b/gnulib/tests/test-jn.c
@@ -0,0 +1,90 @@
+/* Test of jn() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (jn, double, (int, double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 3.8;
+ y = jn (0, x);
+ ASSERT (y >= -0.4025564102 && y <= -0.4025564101);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (1, x);
+ ASSERT (y >= 0.0128210029 && y <= 0.0128210030);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (2, x);
+ ASSERT (y >= 0.4093043064 && y <= 0.4093043065);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (3, x);
+ ASSERT (y >= 0.4180256354 && y <= 0.4180256355);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (4, x);
+ ASSERT (y >= 0.2507361705 && y <= 0.2507361706);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (5, x);
+ ASSERT (y >= 0.1098399867 && y <= 0.1098399868);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (6, x);
+ ASSERT (y >= 0.0383164262 && y <= 0.0383164263);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (7, x);
+ ASSERT (y >= 0.0111592540 && y <= 0.0111592541);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (8, x);
+ ASSERT (y >= 0.0027966149 && y <= 0.0027966150);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (9, x);
+ ASSERT (y >= 0.0006159669 && y <= 0.0006159670);
+
+ /* A particular value. */
+ x = 3.8;
+ y = jn (10, x);
+ ASSERT (y >= 0.0001211233 && y <= 0.0001211234);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-langinfo.c b/gnulib/tests/test-langinfo.c
new file mode 100644
index 00000000..7547f3bf
--- /dev/null
+++ b/gnulib/tests/test-langinfo.c
@@ -0,0 +1,92 @@
+/* Test of <langinfo.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <langinfo.h>
+
+/* Check that all the nl_item values are defined. */
+int items[] =
+ {
+ /* nl_langinfo items of the LC_CTYPE category */
+ CODESET,
+ /* nl_langinfo items of the LC_NUMERIC category */
+ RADIXCHAR,
+ THOUSEP,
+ /* nl_langinfo items of the LC_TIME category */
+ D_T_FMT,
+ D_FMT,
+ T_FMT,
+ T_FMT_AMPM,
+ AM_STR,
+ PM_STR,
+ DAY_1,
+ DAY_2,
+ DAY_3,
+ DAY_4,
+ DAY_5,
+ DAY_6,
+ DAY_7,
+ ABDAY_1,
+ ABDAY_2,
+ ABDAY_3,
+ ABDAY_4,
+ ABDAY_5,
+ ABDAY_6,
+ ABDAY_7,
+ MON_1,
+ MON_2,
+ MON_3,
+ MON_4,
+ MON_5,
+ MON_6,
+ MON_7,
+ MON_8,
+ MON_9,
+ MON_10,
+ MON_11,
+ MON_12,
+ ABMON_1,
+ ABMON_2,
+ ABMON_3,
+ ABMON_4,
+ ABMON_5,
+ ABMON_6,
+ ABMON_7,
+ ABMON_8,
+ ABMON_9,
+ ABMON_10,
+ ABMON_11,
+ ABMON_12,
+ ERA,
+ ERA_D_FMT,
+ ERA_D_T_FMT,
+ ERA_T_FMT,
+ ALT_DIGITS,
+ /* nl_langinfo items of the LC_MONETARY category */
+ CRNCYSTR,
+ /* nl_langinfo items of the LC_MESSAGES category */
+ YESEXPR,
+ NOEXPR
+ };
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-lchown.c b/gnulib/tests/test-lchown.c
new file mode 100644
index 00000000..9b868ebc
--- /dev/null
+++ b/gnulib/tests/test-lchown.c
@@ -0,0 +1,49 @@
+/* Tests of lchown.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (lchown, int, (char const *, uid_t, gid_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "mgetgroups.h"
+#include "stat-time.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-lchown.t"
+
+#include "test-lchown.h"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_lchown (lchown, true);
+}
diff --git a/gnulib/tests/test-lchown.h b/gnulib/tests/test-lchown.h
new file mode 100644
index 00000000..c8d43f5b
--- /dev/null
+++ b/gnulib/tests/test-lchown.h
@@ -0,0 +1,260 @@
+/* Tests of lchown.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include "nap.h"
+
+#if !HAVE_GETEGID
+# define getegid() ((gid_t) -1)
+#endif
+
+#ifndef HAVE_LCHMOD
+# define HAVE_LCHMOD 0
+#endif
+
+#ifndef CHOWN_CHANGE_TIME_BUG
+# define CHOWN_CHANGE_TIME_BUG 0
+#endif
+
+/* This file is designed to test lchown(n,o,g) and
+ chownat(AT_FDCWD,n,o,g,AT_SYMLINK_NOFOLLOW). FUNC is the function
+ to test. Assumes that BASE and ASSERT are already defined, and
+ that appropriate headers are already included. If PRINT, warn
+ before skipping symlink tests with status 77. */
+
+static int
+test_lchown (int (*func) (char const *, uid_t, gid_t), bool print)
+{
+ struct stat st1;
+ struct stat st2;
+ gid_t *gids = NULL;
+ int gids_count;
+ int result;
+
+ /* Solaris 8 is interesting - if the current process belongs to
+ multiple groups, the current directory is owned by a a group that
+ the current process belongs to but different than getegid(), and
+ the current directory does not have the S_ISGID bit, then regular
+ files created in the directory belong to the directory's group,
+ but symlinks belong to the current effective group id. If
+ S_ISGID is set, then both files and symlinks belong to the
+ directory's group. However, it is possible to run the testsuite
+ from within a directory owned by a group we don't belong to, in
+ which case all things that we create belong to the current
+ effective gid. So, work around the issues by creating a
+ subdirectory (we are guaranteed that the subdirectory will be
+ owned by one of our current groups), change ownership of that
+ directory to the current effective gid (which will thus succeed),
+ then create all other files within that directory (eliminating
+ questions on whether inheritance or current id triumphs, since
+ the two methods resolve to the same gid). */
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (stat (BASE "dir", &st1) == 0);
+
+ /* Filter out mingw, which has no concept of groups. */
+ result = func (BASE "dir", st1.st_uid, getegid ());
+ if (result == -1 && errno == ENOSYS)
+ {
+ ASSERT (rmdir (BASE "dir") == 0);
+ if (print)
+ fputs ("skipping test: no support for ownership\n", stderr);
+ return 77;
+ }
+ ASSERT (result == 0);
+
+ ASSERT (close (creat (BASE "dir/file", 0600)) == 0);
+ ASSERT (stat (BASE "dir/file", &st1) == 0);
+ ASSERT (st1.st_uid != (uid_t) -1);
+ ASSERT (st1.st_gid != (gid_t) -1);
+ ASSERT (st1.st_gid == getegid ());
+
+ /* Sanity check of error cases. */
+ errno = 0;
+ ASSERT (func ("", -1, -1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("no_such", -1, -1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("no_such/", -1, -1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "dir/file/", -1, -1) == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Check that -1 does not alter ownership. */
+ ASSERT (func (BASE "dir/file", -1, st1.st_gid) == 0);
+ ASSERT (func (BASE "dir/file", st1.st_uid, -1) == 0);
+ ASSERT (func (BASE "dir/file", (uid_t) -1, (gid_t) -1) == 0);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+
+ /* Even if the values aren't changing, ctime is required to change
+ if at least one argument is not -1. */
+ nap ();
+ ASSERT (func (BASE "dir/file", st1.st_uid, st1.st_gid) == 0);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+
+ /* Test symlink behavior. */
+ if (symlink ("link", BASE "dir/link2"))
+ {
+ ASSERT (unlink (BASE "dir/file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ result = func (BASE "dir/link2", -1, -1);
+ if (result == -1 && errno == ENOSYS)
+ {
+ ASSERT (unlink (BASE "dir/file") == 0);
+ ASSERT (unlink (BASE "dir/link2") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ if (print)
+ fputs ("skipping test: symlink ownership not supported\n", stderr);
+ return 77;
+ }
+ ASSERT (result == 0);
+ errno = 0;
+ ASSERT (func (BASE "dir/link2/", st1.st_uid, st1.st_gid) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (symlink ("file", BASE "dir/link") == 0);
+ ASSERT (mkdir (BASE "dir/sub", 0700) == 0);
+ ASSERT (symlink ("sub", BASE "dir/link3") == 0);
+
+ /* For non-privileged users, lchown can only portably succeed at
+ changing group ownership of a file we own. If we belong to at
+ least two groups, then verifying the correct change is simple.
+ But if we belong to only one group, then we fall back on the
+ other observable effect of lchown: the ctime must be updated. */
+ gids_count = mgetgroups (NULL, st1.st_gid, &gids);
+ if (1 < gids_count)
+ {
+ ASSERT (gids[1] != st1.st_gid);
+ ASSERT (gids[1] != (gid_t) -1);
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+
+ errno = 0;
+ ASSERT (func (BASE "dir/link2/", -1, gids[1]) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+
+ ASSERT (func (BASE "dir/link2", -1, gids[1]) == 0);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (gids[1] == st2.st_gid);
+
+ /* Trailing slash follows through to directory. */
+ ASSERT (lstat (BASE "dir/link3", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/sub", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+
+ ASSERT (func (BASE "dir/link3/", -1, gids[1]) == 0);
+ ASSERT (lstat (BASE "dir/link3", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (st1.st_gid == st2.st_gid);
+ ASSERT (lstat (BASE "dir/sub", &st2) == 0);
+ ASSERT (st1.st_uid == st2.st_uid);
+ ASSERT (gids[1] == st2.st_gid);
+ }
+ else if (!CHOWN_CHANGE_TIME_BUG || HAVE_LCHMOD)
+ {
+ /* If we don't have lchmod, and lchown fails to change ctime,
+ then we can't test this part of lchown. */
+ struct stat l1;
+ struct stat l2;
+ ASSERT (stat (BASE "dir/file", &st1) == 0);
+ ASSERT (lstat (BASE "dir/link", &l1) == 0);
+ ASSERT (lstat (BASE "dir/link2", &l2) == 0);
+
+ nap ();
+ errno = 0;
+ ASSERT (func (BASE "dir/link2/", -1, st1.st_gid) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&st1) == get_stat_ctime_ns (&st2));
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (l1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&l1) == get_stat_ctime_ns (&st2));
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (l2.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&l2) == get_stat_ctime_ns (&st2));
+
+ ASSERT (func (BASE "dir/link2", -1, st1.st_gid) == 0);
+ ASSERT (stat (BASE "dir/file", &st2) == 0);
+ ASSERT (st1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&st1) == get_stat_ctime_ns (&st2));
+ ASSERT (lstat (BASE "dir/link", &st2) == 0);
+ ASSERT (l1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&l1) == get_stat_ctime_ns (&st2));
+ ASSERT (lstat (BASE "dir/link2", &st2) == 0);
+ ASSERT (l2.st_ctime < st2.st_ctime
+ || (l2.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&l2) < get_stat_ctime_ns (&st2)));
+
+ /* Trailing slash follows through to directory. */
+ ASSERT (lstat (BASE "dir/sub", &st1) == 0);
+ ASSERT (lstat (BASE "dir/link3", &l1) == 0);
+ nap ();
+ ASSERT (func (BASE "dir/link3/", -1, st1.st_gid) == 0);
+ ASSERT (lstat (BASE "dir/link3", &st2) == 0);
+ ASSERT (l1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&l1) == get_stat_ctime_ns (&st2));
+ ASSERT (lstat (BASE "dir/sub", &st2) == 0);
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+ }
+
+ /* Cleanup. */
+ free (gids);
+ ASSERT (unlink (BASE "dir/file") == 0);
+ ASSERT (unlink (BASE "dir/link") == 0);
+ ASSERT (unlink (BASE "dir/link2") == 0);
+ ASSERT (unlink (BASE "dir/link3") == 0);
+ ASSERT (rmdir (BASE "dir/sub") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ return 0;
+}
diff --git a/gnulib/tests/test-ldexp.c b/gnulib/tests/test-ldexp.c
new file mode 100644
index 00000000..4d0339ea
--- /dev/null
+++ b/gnulib/tests/test-ldexp.c
@@ -0,0 +1,48 @@
+/* Test of ldexp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (ldexp, double, (double, int));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = ldexp (x, 0);
+ ASSERT (y >= 0.5999999999 && y <= 0.6000000001);
+
+ x = 0.6;
+ y = ldexp (x, 1);
+ ASSERT (y >= 1.199999999 && y <= 1.200000001);
+
+ x = 0.6;
+ y = ldexp (x, -1);
+ ASSERT (y >= 0.2999999999 && y <= 0.3000000001);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-ldexpl.c b/gnulib/tests/test-ldexpl.c
new file mode 100644
index 00000000..f3b4e6f2
--- /dev/null
+++ b/gnulib/tests/test-ldexpl.c
@@ -0,0 +1,130 @@
+/* Test of multiplying a 'long double' by a power of 2.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (ldexpl, long double, (long double, int));
+
+#include <float.h>
+
+#include "fpucw.h"
+#include "isnanl-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zero instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zero (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+long double minus_zero = -0.0L;
+#endif
+
+int
+main ()
+{
+ int i;
+ long double x;
+ long double y;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ { /* NaN. */
+ x = NaNl ();
+ y = ldexpl (x, 0); ASSERT (isnanl (y));
+ y = ldexpl (x, 5); ASSERT (isnanl (y));
+ y = ldexpl (x, -5); ASSERT (isnanl (y));
+ }
+
+ { /* Positive infinity. */
+ x = 1.0L / 0.0L;
+ y = ldexpl (x, 0); ASSERT (y == x);
+ y = ldexpl (x, 5); ASSERT (y == x);
+ y = ldexpl (x, -5); ASSERT (y == x);
+ }
+
+ { /* Negative infinity. */
+ x = -1.0L / 0.0L;
+ y = ldexpl (x, 0); ASSERT (y == x);
+ y = ldexpl (x, 5); ASSERT (y == x);
+ y = ldexpl (x, -5); ASSERT (y == x);
+ }
+
+ { /* Positive zero. */
+ x = 0.0L;
+ y = ldexpl (x, 0); ASSERT (y == x); ASSERT (!signbit (x));
+ y = ldexpl (x, 5); ASSERT (y == x); ASSERT (!signbit (x));
+ y = ldexpl (x, -5); ASSERT (y == x); ASSERT (!signbit (x));
+ }
+
+ { /* Negative zero. */
+ x = minus_zero;
+ y = ldexpl (x, 0); ASSERT (y == x); ASSERT (signbit (x));
+ y = ldexpl (x, 5); ASSERT (y == x); ASSERT (signbit (x));
+ y = ldexpl (x, -5); ASSERT (y == x); ASSERT (signbit (x));
+ }
+
+ { /* Positive finite number. */
+ x = 1.73205L;
+ y = ldexpl (x, 0); ASSERT (y == x);
+ y = ldexpl (x, 5); ASSERT (y == x * 32.0L);
+ y = ldexpl (x, -5); ASSERT (y == x * 0.03125L);
+ }
+
+ { /* Negative finite number. */
+ x = -20.085536923187667742L;
+ y = ldexpl (x, 0); ASSERT (y == x);
+ y = ldexpl (x, 5); ASSERT (y == x * 32.0L);
+ y = ldexpl (x, -5); ASSERT (y == x * 0.03125L);
+ }
+
+ for (i = 1, x = 1.73205L; i <= LDBL_MAX_EXP; i++, x *= 2.0L)
+ {
+ y = ldexpl (x, 0); ASSERT (y == x);
+ y = ldexpl (x, 5); ASSERT (y == x * 32.0L);
+ y = ldexpl (x, -5); ASSERT (y == x * 0.03125L);
+ }
+ for (i = 1, x = 1.73205L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+ {
+ y = ldexpl (x, 0); ASSERT (y == x);
+ y = ldexpl (x, 5); ASSERT (y == x * 32.0L);
+ if (i - 5 >= LDBL_MIN_EXP)
+ {
+ y = ldexpl (x, -5); ASSERT (y == x * 0.03125L);
+ }
+ }
+ for (; i >= LDBL_MIN_EXP - 100 && x > 0.0L; i--, x *= 0.5L)
+ {
+ y = ldexpl (x, 0); ASSERT (y == x);
+ y = ldexpl (x, 5); ASSERT (y == x * 32.0L);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-lgamma.c b/gnulib/tests/test-lgamma.c
new file mode 100644
index 00000000..361b5af4
--- /dev/null
+++ b/gnulib/tests/test-lgamma.c
@@ -0,0 +1,41 @@
+/* Test of lgamma() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (lgamma, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = lgamma (x);
+ /* Γ(x) = 1.4891922488... */
+ ASSERT (y >= 0.3982338580 && y <= 0.3982338581);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-link.c b/gnulib/tests/test-link.c
new file mode 100644
index 00000000..65ee9e09
--- /dev/null
+++ b/gnulib/tests/test-link.c
@@ -0,0 +1,47 @@
+/* Test of link() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (link, int, (char const *, char const *));
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-link.t"
+
+#include "test-link.h"
+
+int
+main (void)
+{
+ /* Remove any garbage left from previous partial runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_link (link, true);
+}
diff --git a/gnulib/tests/test-link.h b/gnulib/tests/test-link.h
new file mode 100644
index 00000000..28bdcc13
--- /dev/null
+++ b/gnulib/tests/test-link.h
@@ -0,0 +1,176 @@
+/* Test of link() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* This file is designed to test both link(a,b) and
+ linkat(AT_FDCWD,a,AT_FDCWD,b,0). FUNC is the function to test.
+ Assumes that BASE and ASSERT are already defined, and that
+ appropriate headers are already included. If PRINT, warn before
+ skipping tests with status 77. This test does not try to create
+ hard links to symlinks, but does test other aspects of symlink. */
+
+static int
+test_link (int (*func) (char const *, char const *), bool print)
+{
+ int fd;
+ int ret;
+
+ /* Create first file. */
+ fd = open (BASE "a", O_CREAT | O_EXCL | O_WRONLY, 0600);
+ ASSERT (0 <= fd);
+ ASSERT (write (fd, "hello", 5) == 5);
+ ASSERT (close (fd) == 0);
+
+ /* Not all file systems support link. Mingw doesn't have reliable
+ st_nlink on hard links, but our implementation does fail with
+ EPERM on poor file systems, and we can detect the inferior stat()
+ via st_ino. Cygwin 1.5.x copies rather than links files on those
+ file systems, but there, st_nlink and st_ino are reliable. */
+ ret = func (BASE "a", BASE "b");
+ if (!ret)
+ {
+ struct stat st;
+ ASSERT (stat (BASE "b", &st) == 0);
+ if (st.st_ino && st.st_nlink != 2)
+ {
+ ASSERT (unlink (BASE "b") == 0);
+ errno = EPERM;
+ ret = -1;
+ }
+ }
+ if (ret == -1)
+ {
+ /* If the device does not support hard links, errno is
+ EPERM on Linux, EOPNOTSUPP on FreeBSD. */
+ switch (errno)
+ {
+ case EPERM:
+ case EOPNOTSUPP:
+ if (print)
+ fputs ("skipping test: "
+ "hard links not supported on this file system\n",
+ stderr);
+ ASSERT (unlink (BASE "a") == 0);
+ return 77;
+ default:
+ perror ("link");
+ return 1;
+ }
+ }
+ ASSERT (ret == 0);
+
+ /* Now, for some behavior tests. Modify the contents of 'b', and
+ ensure that 'a' can see it, both while 'b' exists and after. */
+ fd = open (BASE "b", O_APPEND | O_WRONLY);
+ ASSERT (0 <= fd);
+ ASSERT (write (fd, "world", 5) == 5);
+ ASSERT (close (fd) == 0);
+ {
+ char buf[11] = { 0 };
+ fd = open (BASE "a", O_RDONLY);
+ ASSERT (0 <= fd);
+ ASSERT (read (fd, buf, 10) == 10);
+ ASSERT (strcmp (buf, "helloworld") == 0);
+ ASSERT (close (fd) == 0);
+ ASSERT (unlink (BASE "b") == 0);
+ fd = open (BASE "a", O_RDONLY);
+ ASSERT (0 <= fd);
+ ASSERT (read (fd, buf, 10) == 10);
+ ASSERT (strcmp (buf, "helloworld") == 0);
+ ASSERT (close (fd) == 0);
+ }
+
+ /* Test for various error conditions. */
+ ASSERT (mkdir (BASE "d", 0700) == 0);
+ errno = 0;
+ ASSERT (func (BASE "a", ".") == -1);
+ ASSERT (errno == EEXIST || errno == EINVAL);
+ errno = 0;
+ ASSERT (func (BASE "a", BASE "a") == -1);
+ ASSERT (errno == EEXIST);
+ ASSERT (func (BASE "a", BASE "b") == 0);
+ errno = 0;
+ ASSERT (func (BASE "a", BASE "b") == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (func (BASE "a", BASE "d") == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (func (BASE "c", BASE "e") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "a", BASE "c/.") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "a/", BASE "c") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "a", BASE "c/") == -1);
+ ASSERT (errno == ENOTDIR || errno == ENOENT);
+
+ /* Most platforms reject hard links to directories, and even on
+ those that do permit it, most users can't create them. We assume
+ that if this test is run as root and we managed to create a hard
+ link, then unlink better be able to clean it up. */
+ {
+ int result;
+ errno = 0;
+ result = func (BASE "d", BASE "c");
+ if (result == 0)
+ {
+ /* Probably root on Solaris. */
+ ASSERT (unlink (BASE "c") == 0);
+ }
+ else
+ {
+ /* Most everyone else. */
+ ASSERT (errno == EPERM || errno == EACCES);
+ errno = 0;
+ ASSERT (func (BASE "d/.", BASE "c") == -1);
+ ASSERT (errno == EPERM || errno == EACCES || errno == EINVAL);
+ errno = 0;
+ ASSERT (func (BASE "d/.//", BASE "c") == -1);
+ ASSERT (errno == EPERM || errno == EACCES || errno == EINVAL);
+ }
+ }
+ ASSERT (unlink (BASE "a") == 0);
+ errno = 0;
+ ASSERT (unlink (BASE "c") == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (rmdir (BASE "d") == 0);
+
+ /* Test invalid use of symlink. */
+ if (symlink (BASE "a", BASE "link") != 0)
+ {
+ ASSERT (unlink (BASE "b") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ errno = 0;
+ ASSERT (func (BASE "b", BASE "link/") == -1);
+ ASSERT (errno == ENOTDIR || errno == ENOENT || errno == EEXIST);
+ ASSERT (rename (BASE "b", BASE "a") == 0);
+ errno = 0;
+ ASSERT (func (BASE "link/", BASE "b") == -1);
+ ASSERT (errno == ENOTDIR || errno == EEXIST);
+
+ /* Clean up. */
+ ASSERT (unlink (BASE "a") == 0);
+ ASSERT (unlink (BASE "link") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-linkat.c b/gnulib/tests/test-linkat.c
new file mode 100644
index 00000000..1dbfad52
--- /dev/null
+++ b/gnulib/tests/test-linkat.c
@@ -0,0 +1,342 @@
+/* Tests of linkat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (linkat, int, (int, char const *, int, char const *, int));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "areadlink.h"
+#include "filenamecat.h"
+#include "same-inode.h"
+#include "xgetcwd.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-linkat.t"
+
+#include "test-link.h"
+
+static int dfd1 = AT_FDCWD;
+static int dfd2 = AT_FDCWD;
+static int flag = AT_SYMLINK_FOLLOW;
+
+/* Wrapper to test linkat like link. */
+static int
+do_link (char const *name1, char const *name2)
+{
+ return linkat (dfd1, name1, dfd2, name2, flag);
+}
+
+/* Wrapper to see if two symlinks act the same. */
+static void
+check_same_link (char const *name1, char const *name2)
+{
+ struct stat st1;
+ struct stat st2;
+ char *contents1;
+ char *contents2;
+ ASSERT (lstat (name1, &st1) == 0);
+ ASSERT (lstat (name2, &st2) == 0);
+ contents1 = areadlink_with_size (name1, st1.st_size);
+ contents2 = areadlink_with_size (name2, st2.st_size);
+ ASSERT (contents1);
+ ASSERT (contents2);
+ ASSERT (strcmp (contents1, contents2) == 0);
+ if (!LINK_FOLLOWS_SYMLINKS)
+ ASSERT (SAME_INODE (st1, st2));
+ free (contents1);
+ free (contents2);
+}
+
+int
+main (void)
+{
+ int i;
+ int dfd;
+ char *cwd;
+ int result;
+
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Test basic link functionality, without mentioning symlinks. */
+ result = test_link (do_link, true);
+ dfd1 = open (".", O_RDONLY);
+ ASSERT (0 <= dfd1);
+ ASSERT (test_link (do_link, false) == result);
+ dfd2 = dfd1;
+ ASSERT (test_link (do_link, false) == result);
+ dfd1 = AT_FDCWD;
+ ASSERT (test_link (do_link, false) == result);
+ flag = 0;
+ ASSERT (test_link (do_link, false) == result);
+ dfd1 = dfd2;
+ ASSERT (test_link (do_link, false) == result);
+ dfd2 = AT_FDCWD;
+ ASSERT (test_link (do_link, false) == result);
+ ASSERT (close (dfd1) == 0);
+ dfd1 = AT_FDCWD;
+ ASSERT (test_link (do_link, false) == result);
+
+ /* Create locations to manipulate. */
+ ASSERT (mkdir (BASE "sub1", 0700) == 0);
+ ASSERT (mkdir (BASE "sub2", 0700) == 0);
+ ASSERT (close (creat (BASE "00", 0600)) == 0);
+ cwd = xgetcwd ();
+
+ dfd = open (BASE "sub1", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (chdir (BASE "sub2") == 0);
+
+ /* There are 16 possible scenarios, based on whether an fd is
+ AT_FDCWD or real, whether a file is absolute or relative, coupled
+ with whether flag is set for 32 iterations.
+
+ To ensure that we test all of the code paths (rather than
+ triggering early normalization optimizations), we use a loop to
+ repeatedly rename a file in the parent directory, use an fd open
+ on subdirectory 1, all while executing in subdirectory 2; all
+ relative names are thus given with a leading "../". Finally, the
+ last scenario (two relative paths given, neither one AT_FDCWD)
+ has two paths, based on whether the two fds are equivalent, so we
+ do the other variant after the loop. */
+ for (i = 0; i < 32; i++)
+ {
+ int fd1 = (i & 8) ? dfd : AT_FDCWD;
+ char *file1 = file_name_concat ((i & 4) ? ".." : cwd, BASE "xx", NULL);
+ int fd2 = (i & 2) ? dfd : AT_FDCWD;
+ char *file2 = file_name_concat ((i & 1) ? ".." : cwd, BASE "xx", NULL);
+ flag = (i & 0x10 ? AT_SYMLINK_FOLLOW : 0);
+
+ ASSERT (sprintf (strchr (file1, '\0') - 2, "%02d", i) == 2);
+ ASSERT (sprintf (strchr (file2, '\0') - 2, "%02d", i + 1) == 2);
+ ASSERT (linkat (fd1, file1, fd2, file2, flag) == 0);
+ ASSERT (unlinkat (fd1, file1, 0) == 0);
+ free (file1);
+ free (file2);
+ }
+ dfd2 = open ("..", O_RDONLY);
+ ASSERT (0 <= dfd2);
+ ASSERT (linkat (dfd, "../" BASE "32", dfd2, BASE "33", 0) == 0);
+ ASSERT (linkat (dfd, "../" BASE "33", dfd2, BASE "34",
+ AT_SYMLINK_FOLLOW) == 0);
+ ASSERT (close (dfd2) == 0);
+
+ /* Now we change back to the parent directory, and set dfd to ".",
+ in order to test behavior on symlinks. */
+ ASSERT (chdir ("..") == 0);
+ ASSERT (close (dfd) == 0);
+ if (symlink (BASE "sub1", BASE "link1"))
+ {
+ ASSERT (unlink (BASE "32") == 0);
+ ASSERT (unlink (BASE "33") == 0);
+ ASSERT (unlink (BASE "34") == 0);
+ ASSERT (rmdir (BASE "sub1") == 0);
+ ASSERT (rmdir (BASE "sub2") == 0);
+ free (cwd);
+ if (!result)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return result;
+ }
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (symlink (BASE "34", BASE "link2") == 0);
+ ASSERT (symlink (BASE "link3", BASE "link3") == 0);
+ ASSERT (symlink (BASE "nowhere", BASE "link4") == 0);
+
+ /* Link cannot overwrite existing files. */
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "sub1", 0) == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1/", dfd, BASE "sub1", 0) == -1);
+ ASSERT (errno == EEXIST || errno == EPERM || errno == EACCES);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "sub1/", 0) == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "sub1",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EEXIST || errno == EPERM || errno == EACCES);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1/", dfd, BASE "sub1",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EEXIST || errno == EPERM || errno == EACCES);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "sub1/",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EEXIST || errno == EPERM || errno == EACCES);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "link2", 0) == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "link2",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EEXIST || errno == EPERM || errno == EACCES);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "link3", 0) == -1);
+ ASSERT (errno == EEXIST || errno == ELOOP);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "link3",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EEXIST || errno == EPERM || errno == EACCES
+ || errno == ELOOP);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link2", dfd, BASE "link3", 0) == -1);
+ ASSERT (errno == EEXIST || errno == ELOOP);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link2", dfd, BASE "link3",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EEXIST || errno == ELOOP);
+
+ /* AT_SYMLINK_FOLLOW only follows first argument, not second. */
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "link4", 0) == -1);
+ ASSERT (errno == EEXIST);
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "link4",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EEXIST || errno == EPERM || errno == EACCES);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "34", dfd, BASE "link4", 0) == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "34", dfd, BASE "link4", AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EEXIST);
+
+ /* Trailing slash handling. */
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link2/", dfd, BASE "link5", 0) == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link2/", dfd, BASE "link5",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link3/", dfd, BASE "link5", 0) == -1);
+ ASSERT (errno == ELOOP);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link3/", dfd, BASE "link5",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == ELOOP);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link4/", dfd, BASE "link5", 0) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link4/", dfd, BASE "link5",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == ENOENT);
+
+ /* Check for hard links to symlinks. */
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "link5", 0) == 0);
+ check_same_link (BASE "link1", BASE "link5");
+ ASSERT (unlink (BASE "link5") == 0);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link1", dfd, BASE "link5",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == EPERM || errno == EACCES);
+ ASSERT (linkat (dfd, BASE "link2", dfd, BASE "link5", 0) == 0);
+ check_same_link (BASE "link2", BASE "link5");
+ ASSERT (unlink (BASE "link5") == 0);
+ ASSERT (linkat (dfd, BASE "link2", dfd, BASE "file", AT_SYMLINK_FOLLOW) == 0);
+ errno = 0;
+ ASSERT (areadlink (BASE "file") == NULL);
+ ASSERT (errno == EINVAL);
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (linkat (dfd, BASE "link3", dfd, BASE "link5", 0) == 0);
+ check_same_link (BASE "link3", BASE "link5");
+ ASSERT (unlink (BASE "link5") == 0);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link3", dfd, BASE "link5",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == ELOOP);
+ ASSERT (linkat (dfd, BASE "link4", dfd, BASE "link5", 0) == 0);
+ check_same_link (BASE "link4", BASE "link5");
+ ASSERT (unlink (BASE "link5") == 0);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link4", dfd, BASE "link5",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == ENOENT);
+
+ /* Check that symlink to symlink to file is followed all the way. */
+ ASSERT (symlink (BASE "link2", BASE "link5") == 0);
+ ASSERT (linkat (dfd, BASE "link5", dfd, BASE "link6", 0) == 0);
+ check_same_link (BASE "link5", BASE "link6");
+ ASSERT (unlink (BASE "link6") == 0);
+ ASSERT (linkat (dfd, BASE "link5", dfd, BASE "file", AT_SYMLINK_FOLLOW) == 0);
+ errno = 0;
+ ASSERT (areadlink (BASE "file") == NULL);
+ ASSERT (errno == EINVAL);
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (unlink (BASE "link5") == 0);
+ ASSERT (symlink (BASE "link3", BASE "link5") == 0);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link5", dfd, BASE "file",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == ELOOP);
+ ASSERT (unlink (BASE "link5") == 0);
+ ASSERT (symlink (BASE "link4", BASE "link5") == 0);
+ errno = 0;
+ ASSERT (linkat (dfd, BASE "link5", dfd, BASE "file",
+ AT_SYMLINK_FOLLOW) == -1);
+ ASSERT (errno == ENOENT);
+
+ /* Now for some real fun with directory crossing. */
+ ASSERT (symlink (cwd, BASE "sub1/link") == 0);
+ ASSERT (symlink (".././/" BASE "sub1/link/" BASE "link2",
+ BASE "sub2/link") == 0);
+ ASSERT (close (dfd) == 0);
+ dfd = open (BASE "sub1", O_RDONLY);
+ ASSERT (0 <= dfd);
+ dfd2 = open (BASE "sub2", O_RDONLY);
+ ASSERT (0 < dfd2);
+ ASSERT (linkat (dfd, "../" BASE "sub2/link", dfd2, "./..//" BASE "sub1/file",
+ AT_SYMLINK_FOLLOW) == 0);
+ errno = 0;
+ ASSERT (areadlink (BASE "sub1/file") == NULL);
+ ASSERT (errno == EINVAL);
+
+ /* Cleanup. */
+ ASSERT (close (dfd) == 0);
+ ASSERT (close (dfd2) == 0);
+ ASSERT (unlink (BASE "sub1/file") == 0);
+ ASSERT (unlink (BASE "sub1/link") == 0);
+ ASSERT (unlink (BASE "sub2/link") == 0);
+ ASSERT (unlink (BASE "32") == 0);
+ ASSERT (unlink (BASE "33") == 0);
+ ASSERT (unlink (BASE "34") == 0);
+ ASSERT (rmdir (BASE "sub1") == 0);
+ ASSERT (rmdir (BASE "sub2") == 0);
+ ASSERT (unlink (BASE "link1") == 0);
+ ASSERT (unlink (BASE "link2") == 0);
+ ASSERT (unlink (BASE "link3") == 0);
+ ASSERT (unlink (BASE "link4") == 0);
+ ASSERT (unlink (BASE "link5") == 0);
+ free (cwd);
+ return result;
+}
diff --git a/gnulib/tests/test-linked_list.c b/gnulib/tests/test-linked_list.c
new file mode 100644
index 00000000..f5cc54ea
--- /dev/null
+++ b/gnulib/tests/test-linked_list.c
@@ -0,0 +1,411 @@
+/* Test of sequential list data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_linked_list.h"
+
+#include <stdlib.h>
+
+#include "gl_array_list.h"
+#include "progname.h"
+#include "macros.h"
+
+static const char *objects[15] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
+ };
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_list_t list1, gl_list_t list2)
+{
+ size_t n, i;
+
+ n = gl_list_size (list1);
+ ASSERT (n == gl_list_size (list2));
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_get_at (list1, i) == gl_list_get_at (list2, i));
+ }
+}
+
+static void
+check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3)
+{
+ check_equals (list1, list2);
+ check_equals (list1, list3);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_list_t list1, list2, list3;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (50);
+ const void **contents =
+ (const void **) malloc (initial_size * sizeof (const void *));
+ size_t i;
+ unsigned int repeat;
+
+ for (i = 0; i < initial_size; i++)
+ contents[i] = RANDOM_OBJECT ();
+
+ /* Create list1. */
+ list1 = gl_list_nx_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list1 != NULL);
+ /* Create list2. */
+ list2 = gl_list_nx_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
+ ASSERT (list2 != NULL);
+ for (i = 0; i < initial_size; i++)
+ ASSERT (gl_list_nx_add_last (list2, contents[i]) != NULL);
+
+ /* Create list3. */
+ list3 = gl_list_nx_create (GL_LINKED_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list3 != NULL);
+
+ check_all (list1, list2, list3);
+
+ for (repeat = 0; repeat < 10000; repeat++)
+ {
+ unsigned int operation = RANDOM (16);
+ switch (operation)
+ {
+ case 0:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t index = RANDOM (gl_list_size (list1));
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+
+ node1 = gl_list_nx_set_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+
+ node2 = gl_list_nx_set_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+
+ node3 = gl_list_nx_set_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ if (node1 == NULL)
+ {
+ ASSERT (node2 == NULL);
+ ASSERT (node3 == NULL);
+ }
+ else
+ {
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ }
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ size_t index1, index2, index3;
+ index1 = gl_list_indexof (list1, obj);
+ index2 = gl_list_indexof (list2, obj);
+ index3 = gl_list_indexof (list3, obj);
+ if (index1 == (size_t)(-1))
+ {
+ ASSERT (index2 == (size_t)(-1));
+ ASSERT (index3 == (size_t)(-1));
+ }
+ else
+ {
+ ASSERT (index2 != (size_t)(-1));
+ ASSERT (index3 != (size_t)(-1));
+ ASSERT (gl_list_get_at (list1, index1) == obj);
+ ASSERT (gl_list_get_at (list2, index2) == obj);
+ ASSERT (gl_list_get_at (list3, index3) == obj);
+ ASSERT (index2 == index1);
+ ASSERT (index3 == index1);
+ }
+ }
+ break;
+ case 3: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, 0) == obj);
+ ASSERT (gl_list_get_at (list2, 0) == obj);
+ ASSERT (gl_list_get_at (list3, 0) == obj);
+ }
+ break;
+ case 4: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_last (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_last (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_last (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, gl_list_size (list1) - 1) == obj);
+ ASSERT (gl_list_get_at (list2, gl_list_size (list2) - 1) == obj);
+ ASSERT (gl_list_get_at (list3, gl_list_size (list3) - 1) == obj);
+ }
+ break;
+ case 5: /* add 3 elements */
+ {
+ const char *obj0 = RANDOM_OBJECT ();
+ const char *obj1 = RANDOM_OBJECT ();
+ const char *obj2 = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj2);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_before (list1, node1, obj0);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_after (list1, node1, obj1);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj2);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_before (list2, node2, obj0);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_after (list2, node2, obj1);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj2);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_before (list3, node3, obj0);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_after (list3, node3, obj1);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj1);
+ ASSERT (gl_list_node_value (list2, node2) == obj1);
+ ASSERT (gl_list_node_value (list3, node3) == obj1);
+ ASSERT (gl_list_get_at (list1, 0) == obj0);
+ ASSERT (gl_list_get_at (list1, 1) == obj1);
+ ASSERT (gl_list_get_at (list1, 2) == obj2);
+ ASSERT (gl_list_get_at (list2, 0) == obj0);
+ ASSERT (gl_list_get_at (list2, 1) == obj1);
+ ASSERT (gl_list_get_at (list2, 2) == obj2);
+ ASSERT (gl_list_get_at (list3, 0) == obj0);
+ ASSERT (gl_list_get_at (list3, 1) == obj1);
+ ASSERT (gl_list_get_at (list3, 2) == obj2);
+ }
+ break;
+ case 6: /* add 1 element */
+ {
+ size_t index = RANDOM (gl_list_size (list1) + 1);
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 7: case 8: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_remove_node (list1, node1));
+ ASSERT (gl_list_remove_node (list2, node2));
+ ASSERT (gl_list_remove_node (list3, node3));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 9: case 10: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ size_t index = RANDOM (n);
+ ASSERT (gl_list_remove_at (list1, index));
+ ASSERT (gl_list_remove_at (list2, index));
+ ASSERT (gl_list_remove_at (list3, index));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 11: case 12: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ ASSERT (gl_list_remove (list1, obj));
+ ASSERT (gl_list_remove (list2, obj));
+ ASSERT (gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 13:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = "xyzzy";
+ ASSERT (!gl_list_remove (list1, obj));
+ ASSERT (!gl_list_remove (list2, obj));
+ ASSERT (!gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n);
+ }
+ break;
+ case 14:
+ {
+ size_t n = gl_list_size (list1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator (list1);
+ iter2 = gl_list_iterator (list2);
+ iter3 = gl_list_iterator (list3);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ case 15:
+ {
+ size_t end = RANDOM (gl_list_size (list1) + 1);
+ size_t start = RANDOM (end + 1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator_from_to (list1, start, end);
+ iter2 = gl_list_iterator_from_to (list2, start, end);
+ iter3 = gl_list_iterator_from_to (list3, start, end);
+ for (i = start; i < end; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ }
+ check_all (list1, list2, list3);
+ }
+
+ gl_list_free (list1);
+ gl_list_free (list2);
+ gl_list_free (list3);
+ free (contents);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-linkedhash_list.c b/gnulib/tests/test-linkedhash_list.c
new file mode 100644
index 00000000..9139c212
--- /dev/null
+++ b/gnulib/tests/test-linkedhash_list.c
@@ -0,0 +1,441 @@
+/* Test of sequential list data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_linkedhash_list.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gl_array_list.h"
+#include "progname.h"
+#include "macros.h"
+
+static const char *objects[15] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
+ };
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+static bool
+string_equals (const void *x1, const void *x2)
+{
+ const char *s1 = x1;
+ const char *s2 = x2;
+ return strcmp (s1, s2) == 0;
+}
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+static size_t
+string_hash (const void *x)
+{
+ const char *s = x;
+ size_t h = 0;
+
+ for (; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h;
+}
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_list_t list1, gl_list_t list2)
+{
+ size_t n, i;
+
+ n = gl_list_size (list1);
+ ASSERT (n == gl_list_size (list2));
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_get_at (list1, i) == gl_list_get_at (list2, i));
+ }
+}
+
+static void
+check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3)
+{
+ check_equals (list1, list2);
+ check_equals (list1, list3);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_list_t list1, list2, list3;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (50);
+ const void **contents =
+ (const void **) malloc (initial_size * sizeof (const void *));
+ size_t i;
+ unsigned int repeat;
+
+ for (i = 0; i < initial_size; i++)
+ contents[i] = RANDOM_OBJECT ();
+
+ /* Create list1. */
+ list1 = gl_list_nx_create (GL_ARRAY_LIST,
+ string_equals, string_hash, NULL, true,
+ initial_size, contents);
+ ASSERT (list1 != NULL);
+ /* Create list2. */
+ list2 = gl_list_nx_create_empty (GL_LINKEDHASH_LIST,
+ string_equals, string_hash, NULL, true);
+ ASSERT (list2 != NULL);
+ for (i = 0; i < initial_size; i++)
+ ASSERT (gl_list_nx_add_last (list2, contents[i]) != NULL);
+
+ /* Create list3. */
+ list3 = gl_list_nx_create (GL_LINKEDHASH_LIST,
+ string_equals, string_hash, NULL, true,
+ initial_size, contents);
+ ASSERT (list3 != NULL);
+
+ check_all (list1, list2, list3);
+
+ for (repeat = 0; repeat < 10000; repeat++)
+ {
+ unsigned int operation = RANDOM (16);
+ switch (operation)
+ {
+ case 0:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t index = RANDOM (gl_list_size (list1));
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+
+ node1 = gl_list_nx_set_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+
+ node2 = gl_list_nx_set_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+
+ node3 = gl_list_nx_set_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ if (node1 == NULL)
+ {
+ ASSERT (node2 == NULL);
+ ASSERT (node3 == NULL);
+ }
+ else
+ {
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ }
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ size_t index1, index2, index3;
+ index1 = gl_list_indexof (list1, obj);
+ index2 = gl_list_indexof (list2, obj);
+ index3 = gl_list_indexof (list3, obj);
+ if (index1 == (size_t)(-1))
+ {
+ ASSERT (index2 == (size_t)(-1));
+ ASSERT (index3 == (size_t)(-1));
+ }
+ else
+ {
+ ASSERT (index2 != (size_t)(-1));
+ ASSERT (index3 != (size_t)(-1));
+ ASSERT (gl_list_get_at (list1, index1) == obj);
+ ASSERT (gl_list_get_at (list2, index2) == obj);
+ ASSERT (gl_list_get_at (list3, index3) == obj);
+ ASSERT (index2 == index1);
+ ASSERT (index3 == index1);
+ }
+ }
+ break;
+ case 3: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, 0) == obj);
+ ASSERT (gl_list_get_at (list2, 0) == obj);
+ ASSERT (gl_list_get_at (list3, 0) == obj);
+ }
+ break;
+ case 4: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_last (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_last (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_last (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, gl_list_size (list1) - 1) == obj);
+ ASSERT (gl_list_get_at (list2, gl_list_size (list2) - 1) == obj);
+ ASSERT (gl_list_get_at (list3, gl_list_size (list3) - 1) == obj);
+ }
+ break;
+ case 5: /* add 3 elements */
+ {
+ const char *obj0 = RANDOM_OBJECT ();
+ const char *obj1 = RANDOM_OBJECT ();
+ const char *obj2 = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj2);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_before (list1, node1, obj0);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_after (list1, node1, obj1);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj2);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_before (list2, node2, obj0);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_after (list2, node2, obj1);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj2);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_before (list3, node3, obj0);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_after (list3, node3, obj1);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj1);
+ ASSERT (gl_list_node_value (list2, node2) == obj1);
+ ASSERT (gl_list_node_value (list3, node3) == obj1);
+ ASSERT (gl_list_get_at (list1, 0) == obj0);
+ ASSERT (gl_list_get_at (list1, 1) == obj1);
+ ASSERT (gl_list_get_at (list1, 2) == obj2);
+ ASSERT (gl_list_get_at (list2, 0) == obj0);
+ ASSERT (gl_list_get_at (list2, 1) == obj1);
+ ASSERT (gl_list_get_at (list2, 2) == obj2);
+ ASSERT (gl_list_get_at (list3, 0) == obj0);
+ ASSERT (gl_list_get_at (list3, 1) == obj1);
+ ASSERT (gl_list_get_at (list3, 2) == obj2);
+ }
+ break;
+ case 6: /* add 1 element */
+ {
+ size_t index = RANDOM (gl_list_size (list1) + 1);
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 7: case 8: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_remove_node (list1, node1));
+ ASSERT (gl_list_remove_node (list2, node2));
+ ASSERT (gl_list_remove_node (list3, node3));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 9: case 10: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ size_t index = RANDOM (n);
+ ASSERT (gl_list_remove_at (list1, index));
+ ASSERT (gl_list_remove_at (list2, index));
+ ASSERT (gl_list_remove_at (list3, index));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 11: case 12: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ ASSERT (gl_list_remove (list1, obj));
+ ASSERT (gl_list_remove (list2, obj));
+ ASSERT (gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 13:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = "xyzzy";
+ ASSERT (!gl_list_remove (list1, obj));
+ ASSERT (!gl_list_remove (list2, obj));
+ ASSERT (!gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n);
+ }
+ break;
+ case 14:
+ {
+ size_t n = gl_list_size (list1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator (list1);
+ iter2 = gl_list_iterator (list2);
+ iter3 = gl_list_iterator (list3);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ case 15:
+ {
+ size_t end = RANDOM (gl_list_size (list1) + 1);
+ size_t start = RANDOM (end + 1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator_from_to (list1, start, end);
+ iter2 = gl_list_iterator_from_to (list2, start, end);
+ iter3 = gl_list_iterator_from_to (list3, start, end);
+ for (i = start; i < end; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ }
+ check_all (list1, list2, list3);
+ }
+
+ gl_list_free (list1);
+ gl_list_free (list2);
+ gl_list_free (list3);
+ free (contents);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-locale.c b/gnulib/tests/test-locale.c
new file mode 100644
index 00000000..2e5c4fc8
--- /dev/null
+++ b/gnulib/tests/test-locale.c
@@ -0,0 +1,49 @@
+/* Test of <locale.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <locale.h>
+
+#include "verify.h"
+
+int a[] =
+ {
+ LC_ALL,
+ LC_COLLATE,
+ LC_CTYPE,
+ LC_MESSAGES,
+ LC_MONETARY,
+ LC_NUMERIC,
+ LC_TIME
+ };
+
+#if HAVE_NEWLOCALE
+/* Check that the locale_t type and the LC_GLOBAL_LOCALE macro are defined. */
+locale_t b = LC_GLOBAL_LOCALE;
+#endif
+
+/* Check that NULL can be passed through varargs as a pointer type,
+ per POSIX 2008. */
+verify (sizeof NULL == sizeof (void *));
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-localename.c b/gnulib/tests/test-localename.c
new file mode 100644
index 00000000..8f081b3a
--- /dev/null
+++ b/gnulib/tests/test-localename.c
@@ -0,0 +1,747 @@
+/* Test of gl_locale_name function and its variants.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "localename.h"
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+
+#if HAVE_NEWLOCALE
+
+static struct { int cat; int mask; const char *string; } const categories[] =
+ {
+ { LC_CTYPE, LC_CTYPE_MASK, "LC_CTYPE" },
+ { LC_NUMERIC, LC_NUMERIC_MASK, "LC_NUMERIC" },
+ { LC_TIME, LC_TIME_MASK, "LC_TIME" },
+ { LC_COLLATE, LC_COLLATE_MASK, "LC_COLLATE" },
+ { LC_MONETARY, LC_MONETARY_MASK, "LC_MONETARY" },
+ { LC_MESSAGES, LC_MESSAGES_MASK, "LC_MESSAGES" }
+# ifdef LC_PAPER
+ , { LC_PAPER, LC_PAPER_MASK, "LC_PAPER" }
+# endif
+# ifdef LC_NAME
+ , { LC_NAME, LC_NAME_MASK, "LC_NAME" }
+# endif
+# ifdef LC_ADDRESS
+ , { LC_ADDRESS, LC_ADDRESS_MASK, "LC_ADDRESS" }
+# endif
+# ifdef LC_TELEPHONE
+ , { LC_TELEPHONE, LC_TELEPHONE_MASK, "LC_TELEPHONE" }
+# endif
+# ifdef LC_MEASUREMENT
+ , { LC_MEASUREMENT, LC_MEASUREMENT_MASK, "LC_MEASUREMENT" }
+# endif
+# ifdef LC_IDENTIFICATION
+ , { LC_IDENTIFICATION, LC_IDENTIFICATION_MASK, "LC_IDENTIFICATION" }
+# endif
+ };
+
+#endif
+
+/* Test the gl_locale_name() function. */
+static void
+test_locale_name (void)
+{
+ const char *name;
+
+ /* Check that gl_locale_name returns non-NULL. */
+ ASSERT (gl_locale_name (LC_MESSAGES, "LC_MESSAGES") != NULL);
+
+ /* Get into a defined state, */
+ setlocale (LC_ALL, "en_US.UTF-8");
+#if HAVE_NEWLOCALE
+ uselocale (LC_GLOBAL_LOCALE);
+#endif
+
+ /* Check that when all environment variables are unset,
+ gl_locale_name returns the default locale. */
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LC_NUMERIC");
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
+ gl_locale_name_default ()) == 0);
+ ASSERT (strcmp (gl_locale_name (LC_NUMERIC, "LC_NUMERIC"),
+ gl_locale_name_default ()) == 0);
+
+ /* Check that an empty environment variable is treated like an unset
+ environment variable. */
+
+ setenv ("LC_ALL", "", 1);
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
+ gl_locale_name_default ()) == 0);
+
+ unsetenv ("LC_ALL");
+ setenv ("LC_CTYPE", "", 1);
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
+ gl_locale_name_default ()) == 0);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "", 1);
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
+ gl_locale_name_default ()) == 0);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ setenv ("LANG", "", 1);
+ setlocale (LC_ALL, "");
+ ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
+ gl_locale_name_default ()) == 0);
+
+ /* Check that LC_ALL overrides the others, and LANG is overridden by the
+ others. */
+
+ setenv ("LC_ALL", "C", 1);
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"), "C") == 0);
+
+ unsetenv ("LC_ALL");
+ setenv ("LC_CTYPE", "C", 1);
+ setenv ("LC_MESSAGES", "C", 1);
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"), "C") == 0);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ setenv ("LANG", "C", 1);
+ setlocale (LC_ALL, "");
+ ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"), "C") == 0);
+
+ /* Check mixed situations. */
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
+ setenv ("LANG", "de_DE.UTF-8", 1);
+ if (setlocale (LC_ALL, "") != NULL)
+ {
+ name = gl_locale_name (LC_CTYPE, "LC_CTYPE");
+ ASSERT (strcmp (name, "de_DE.UTF-8") == 0);
+ name = gl_locale_name (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+ }
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
+ unsetenv ("LANG");
+ if (setlocale (LC_ALL, "") != NULL)
+ {
+ name = gl_locale_name (LC_CTYPE, "LC_CTYPE");
+ ASSERT (strcmp (name, gl_locale_name_default ()) == 0);
+ name = gl_locale_name (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+ }
+
+#if HAVE_NEWLOCALE
+ /* Check that gl_locale_name considers the thread locale. */
+ {
+ locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
+ if (locale != NULL)
+ {
+ uselocale (locale);
+ name = gl_locale_name (LC_CTYPE, "LC_CTYPE");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+ name = gl_locale_name (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+ }
+ }
+
+ /* Check that gl_locale_name distinguishes different categories of the
+ thread locale, and that the name is the right one for each. */
+ {
+ unsigned int i;
+
+ for (i = 0; i < SIZEOF (categories); i++)
+ {
+ int category_mask = categories[i].mask;
+ locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
+ if (locale != NULL)
+ {
+ locale = newlocale (category_mask, "de_DE.UTF-8", locale);
+ if (locale != NULL)
+ {
+ unsigned int j;
+
+ uselocale (locale);
+ for (j = 0; j < SIZEOF (categories); j++)
+ {
+ const char *name_j =
+ gl_locale_name (categories[j].cat, categories[j].string);
+ if (j == i)
+ ASSERT (strcmp (name_j, "de_DE.UTF-8") == 0);
+ else
+ ASSERT (strcmp (name_j, "fr_FR.UTF-8") == 0);
+ }
+ }
+ }
+ }
+ }
+#endif
+}
+
+/* Test the gl_locale_name_thread() function. */
+static void
+test_locale_name_thread (void)
+{
+ /* Get into a defined state, */
+ setlocale (LC_ALL, "en_US.UTF-8");
+
+#if HAVE_NEWLOCALE
+ /* Check that gl_locale_name_thread returns NULL when no thread locale is
+ set. */
+ uselocale (LC_GLOBAL_LOCALE);
+ ASSERT (gl_locale_name_thread (LC_CTYPE, "LC_CTYPE") == NULL);
+ ASSERT (gl_locale_name_thread (LC_MESSAGES, "LC_MESSAGES") == NULL);
+
+ /* Check that gl_locale_name_thread considers the thread locale. */
+ {
+ locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
+ if (locale != NULL)
+ {
+ const char *name;
+
+ uselocale (locale);
+ name = gl_locale_name_thread (LC_CTYPE, "LC_CTYPE");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+ name = gl_locale_name_thread (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+ }
+ }
+
+ /* Check that gl_locale_name_thread distinguishes different categories of the
+ thread locale, and that the name is the right one for each. */
+ {
+ unsigned int i;
+
+ for (i = 0; i < SIZEOF (categories); i++)
+ {
+ int category_mask = categories[i].mask;
+ locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
+ if (locale != NULL)
+ {
+ locale = newlocale (category_mask, "de_DE.UTF-8", locale);
+ if (locale != NULL)
+ {
+ unsigned int j;
+
+ uselocale (locale);
+ for (j = 0; j < SIZEOF (categories); j++)
+ {
+ const char *name_j =
+ gl_locale_name_thread (categories[j].cat,
+ categories[j].string);
+ if (j == i)
+ ASSERT (strcmp (name_j, "de_DE.UTF-8") == 0);
+ else
+ ASSERT (strcmp (name_j, "fr_FR.UTF-8") == 0);
+ }
+ }
+ }
+ }
+ }
+
+ /* Check that gl_locale_name_thread returns a string that is allocated with
+ indefinite extent. */
+ {
+ /* Try many locale names in turn, in order to defeat possible caches. */
+ static const char * const choices[] =
+ {
+ "C",
+ "POSIX",
+ "af_ZA",
+ "af_ZA.UTF-8",
+ "am_ET",
+ "am_ET.UTF-8",
+ "be_BY",
+ "be_BY.UTF-8",
+ "bg_BG",
+ "bg_BG.UTF-8",
+ "ca_ES",
+ "ca_ES.UTF-8",
+ "cs_CZ",
+ "cs_CZ.UTF-8",
+ "da_DK",
+ "da_DK.UTF-8",
+ "de_AT",
+ "de_AT.UTF-8",
+ "de_CH",
+ "de_CH.UTF-8",
+ "de_DE",
+ "de_DE.UTF-8",
+ "el_GR",
+ "el_GR.UTF-8",
+ "en_AU",
+ "en_AU.UTF-8",
+ "en_CA",
+ "en_CA.UTF-8",
+ "en_GB",
+ "en_GB.UTF-8",
+ "en_IE",
+ "en_IE.UTF-8",
+ "en_NZ",
+ "en_NZ.UTF-8",
+ "en_US",
+ "en_US.UTF-8",
+ "es_ES",
+ "es_ES.UTF-8",
+ "et_EE",
+ "et_EE.UTF-8",
+ "eu_ES",
+ "eu_ES.UTF-8",
+ "fi_FI",
+ "fi_FI.UTF-8",
+ "fr_BE",
+ "fr_BE.UTF-8",
+ "fr_CA",
+ "fr_CA.UTF-8",
+ "fr_CH",
+ "fr_CH.UTF-8",
+ "fr_FR",
+ "fr_FR.UTF-8",
+ "he_IL",
+ "he_IL.UTF-8",
+ "hr_HR",
+ "hr_HR.UTF-8",
+ "hu_HU",
+ "hu_HU.UTF-8",
+ "hy_AM",
+ "is_IS",
+ "is_IS.UTF-8",
+ "it_CH",
+ "it_CH.UTF-8",
+ "it_IT",
+ "it_IT.UTF-8",
+ "ja_JP.UTF-8",
+ "kk_KZ",
+ "kk_KZ.UTF-8",
+ "ko_KR.UTF-8",
+ "lt_LT",
+ "lt_LT.UTF-8",
+ "nl_BE",
+ "nl_BE.UTF-8",
+ "nl_NL",
+ "nl_NL.UTF-8",
+ "no_NO",
+ "no_NO.UTF-8",
+ "pl_PL",
+ "pl_PL.UTF-8",
+ "pt_BR",
+ "pt_BR.UTF-8",
+ "pt_PT",
+ "pt_PT.UTF-8",
+ "ro_RO",
+ "ro_RO.UTF-8",
+ "ru_RU",
+ "ru_RU.UTF-8",
+ "sk_SK",
+ "sk_SK.UTF-8",
+ "sl_SI",
+ "sl_SI.UTF-8",
+ "sv_SE",
+ "sv_SE.UTF-8",
+ "tr_TR",
+ "tr_TR.UTF-8",
+ "uk_UA",
+ "uk_UA.UTF-8",
+ "zh_CN",
+ "zh_CN.UTF-8",
+ "zh_HK",
+ "zh_HK.UTF-8",
+ "zh_TW",
+ "zh_TW.UTF-8"
+ };
+ /* Remember which locales are available. */
+ unsigned char /* bool */ available[SIZEOF (choices)];
+ /* Array of remembered results of gl_locale_name_thread. */
+ const char *unsaved_names[SIZEOF (choices)][SIZEOF (categories)];
+ /* Array of remembered results of gl_locale_name_thread, stored in safe
+ memory. */
+ char *saved_names[SIZEOF (choices)][SIZEOF (categories)];
+ unsigned int j;
+
+ for (j = 0; j < SIZEOF (choices); j++)
+ {
+ locale_t locale = newlocale (LC_ALL_MASK, choices[j], NULL);
+ available[j] = (locale != NULL);
+ if (locale != NULL)
+ {
+ unsigned int i;
+
+ uselocale (locale);
+ for (i = 0; i < SIZEOF (categories); i++)
+ {
+ unsaved_names[j][i] = gl_locale_name_thread (categories[i].cat, categories[i].string);
+ saved_names[j][i] = strdup (unsaved_names[j][i]);
+ }
+ uselocale (LC_GLOBAL_LOCALE);
+ freelocale (locale);
+ }
+ }
+ /* Verify the unsaved_names are still valid. */
+ for (j = 0; j < SIZEOF (choices); j++)
+ if (available[j])
+ {
+ unsigned int i;
+
+ for (i = 0; i < SIZEOF (categories); i++)
+ ASSERT (strcmp (unsaved_names[j][i], saved_names[j][i]) == 0);
+ }
+ /* Allocate many locales, without freeing them. This is an attempt at
+ overwriting as much of the previously allocated memory as possible. */
+ for (j = SIZEOF (choices); j > 0; )
+ {
+ j--;
+ if (available[j])
+ {
+ locale_t locale = newlocale (LC_ALL_MASK, choices[j], NULL);
+ unsigned int i;
+
+ ASSERT (locale != NULL);
+ uselocale (locale);
+ for (i = 0; i < SIZEOF (categories); i++)
+ {
+ const char *name = gl_locale_name_thread (categories[i].cat, categories[i].string);
+ ASSERT (strcmp (unsaved_names[j][i], name) == 0);
+ }
+ uselocale (LC_GLOBAL_LOCALE);
+ }
+ }
+ /* Verify the unsaved_names are still valid. */
+ for (j = 0; j < SIZEOF (choices); j++)
+ if (available[j])
+ {
+ unsigned int i;
+
+ for (i = 0; i < SIZEOF (categories); i++)
+ ASSERT (strcmp (unsaved_names[j][i], saved_names[j][i]) == 0);
+ }
+ }
+#else
+ /* Check that gl_locale_name_thread always returns NULL. */
+ ASSERT (gl_locale_name_thread (LC_CTYPE, "LC_CTYPE") == NULL);
+ ASSERT (gl_locale_name_thread (LC_MESSAGES, "LC_MESSAGES") == NULL);
+#endif
+}
+
+/* Test the gl_locale_name_posix() function. */
+static void
+test_locale_name_posix (void)
+{
+ const char *name;
+
+ /* Get into a defined state, */
+ setlocale (LC_ALL, "en_US.UTF-8");
+#if HAVE_NEWLOCALE
+ uselocale (LC_GLOBAL_LOCALE);
+#endif
+
+ /* Check that when all environment variables are unset,
+ gl_locale_name_posix returns either NULL or the default locale. */
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LC_NUMERIC");
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
+ name = gl_locale_name_posix (LC_NUMERIC, "LC_NUMERIC");
+ ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
+
+ /* Check that an empty environment variable is treated like an unset
+ environment variable. */
+
+ setenv ("LC_ALL", "", 1);
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
+
+ unsetenv ("LC_ALL");
+ setenv ("LC_CTYPE", "", 1);
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "", 1);
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ setenv ("LANG", "", 1);
+ setlocale (LC_ALL, "");
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
+
+ /* Check that LC_ALL overrides the others, and LANG is overridden by the
+ others. */
+
+ setenv ("LC_ALL", "C", 1);
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "C") == 0);
+
+ unsetenv ("LC_ALL");
+ setenv ("LC_CTYPE", "C", 1);
+ setenv ("LC_MESSAGES", "C", 1);
+ unsetenv ("LANG");
+ setlocale (LC_ALL, "");
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "C") == 0);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ setenv ("LANG", "C", 1);
+ setlocale (LC_ALL, "");
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "C") == 0);
+
+ /* Check mixed situations. */
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
+ setenv ("LANG", "de_DE.UTF-8", 1);
+ if (setlocale (LC_ALL, "") != NULL)
+ {
+ name = gl_locale_name_posix (LC_CTYPE, "LC_CTYPE");
+ ASSERT (strcmp (name, "de_DE.UTF-8") == 0);
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+ }
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
+ unsetenv ("LANG");
+ if (setlocale (LC_ALL, "") != NULL)
+ {
+ name = gl_locale_name_posix (LC_CTYPE, "LC_CTYPE");
+ ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+ }
+
+#if HAVE_NEWLOCALE
+ /* Check that gl_locale_name_posix ignores the thread locale. */
+ {
+ locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
+ if (locale != NULL)
+ {
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ setenv ("LANG", "C", 1);
+ setlocale (LC_ALL, "");
+ uselocale (locale);
+ name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "C") == 0);
+ }
+ }
+#endif
+}
+
+/* Test the gl_locale_name_environ() function. */
+static void
+test_locale_name_environ (void)
+{
+ const char *name;
+
+ /* Get into a defined state, */
+ setlocale (LC_ALL, "en_US.UTF-8");
+#if HAVE_NEWLOCALE
+ uselocale (LC_GLOBAL_LOCALE);
+#endif
+
+ /* Check that when all environment variables are unset,
+ gl_locale_name_environ returns NULL. */
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LC_NUMERIC");
+ unsetenv ("LANG");
+ ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
+ ASSERT (gl_locale_name_environ (LC_NUMERIC, "LC_NUMERIC") == NULL);
+
+ /* Check that an empty environment variable is treated like an unset
+ environment variable. */
+
+ setenv ("LC_ALL", "", 1);
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
+
+ unsetenv ("LC_ALL");
+ setenv ("LC_CTYPE", "", 1);
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "", 1);
+ unsetenv ("LANG");
+ ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ setenv ("LANG", "", 1);
+ ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
+
+ /* Check that LC_ALL overrides the others, and LANG is overridden by the
+ others. */
+
+ setenv ("LC_ALL", "C", 1);
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LANG");
+ name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "C") == 0);
+
+ unsetenv ("LC_ALL");
+ setenv ("LC_CTYPE", "C", 1);
+ setenv ("LC_MESSAGES", "C", 1);
+ unsetenv ("LANG");
+ name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "C") == 0);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ setenv ("LANG", "C", 1);
+ name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "C") == 0);
+
+ /* Check mixed situations. */
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
+ setenv ("LANG", "de_DE.UTF-8", 1);
+ name = gl_locale_name_environ (LC_CTYPE, "LC_CTYPE");
+ ASSERT (strcmp (name, "de_DE.UTF-8") == 0);
+ name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
+ unsetenv ("LANG");
+ name = gl_locale_name_environ (LC_CTYPE, "LC_CTYPE");
+ ASSERT (name == NULL);
+ name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
+
+#if HAVE_NEWLOCALE
+ /* Check that gl_locale_name_environ ignores the thread locale. */
+ {
+ locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
+ if (locale != NULL)
+ {
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LC_MESSAGES");
+ setenv ("LANG", "C", 1);
+ setlocale (LC_ALL, "");
+ uselocale (locale);
+ name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
+ ASSERT (strcmp (name, "C") == 0);
+ }
+ }
+#endif
+}
+
+/* Test the gl_locale_name_default() function. */
+static void
+test_locale_name_default (void)
+{
+ const char *name = gl_locale_name_default ();
+
+ ASSERT (name != NULL);
+
+ /* Only MacOS X and Windows have a facility for the user to set the default
+ locale. */
+#if !((defined __APPLE__ && defined __MACH__) || (defined _WIN32 || defined __WIN32__ || defined __CYGWIN__))
+ ASSERT (strcmp (name, "C") == 0);
+#endif
+
+#if HAVE_NEWLOCALE
+ /* Check that gl_locale_name_default ignores the thread locale. */
+ {
+ locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
+ if (locale != NULL)
+ {
+ uselocale (locale);
+ ASSERT (strcmp (gl_locale_name_default (), name) == 0);
+ }
+ }
+#endif
+}
+
+int
+main ()
+{
+ test_locale_name ();
+ test_locale_name_thread ();
+ test_locale_name_posix ();
+ test_locale_name_environ ();
+ test_locale_name_default ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-lock.c b/gnulib/tests/test-lock.c
new file mode 100644
index 00000000..aaa4cd35
--- /dev/null
+++ b/gnulib/tests/test-lock.c
@@ -0,0 +1,601 @@
+/* Test of locking in multithreaded situations.
+ Copyright (C) 2005, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+#if USE_POSIX_THREADS || USE_SOLARIS_THREADS || USE_PTH_THREADS || USE_WIN32_THREADS
+
+#if USE_POSIX_THREADS
+# define TEST_POSIX_THREADS 1
+#endif
+#if USE_SOLARIS_THREADS
+# define TEST_SOLARIS_THREADS 1
+#endif
+#if USE_PTH_THREADS
+# define TEST_PTH_THREADS 1
+#endif
+#if USE_WIN32_THREADS
+# define TEST_WIN32_THREADS 1
+#endif
+
+/* Whether to enable locking.
+ Uncomment this to get a test program without locking, to verify that
+ it crashes. */
+#define ENABLE_LOCKING 1
+
+/* Which tests to perform.
+ Uncomment some of these, to verify that all tests crash if no locking
+ is enabled. */
+#define DO_TEST_LOCK 1
+#define DO_TEST_RWLOCK 1
+#define DO_TEST_RECURSIVE_LOCK 1
+#define DO_TEST_ONCE 1
+
+/* Whether to help the scheduler through explicit yield().
+ Uncomment this to see if the operating system has a fair scheduler. */
+#define EXPLICIT_YIELD 1
+
+/* Whether to print debugging messages. */
+#define ENABLE_DEBUGGING 0
+
+/* Number of simultaneous threads. */
+#define THREAD_COUNT 10
+
+/* Number of operations performed in each thread.
+ This is quite high, because with a smaller count, say 5000, we often get
+ an "OK" result even without ENABLE_LOCKING (on Linux/x86). */
+#define REPEAT_COUNT 50000
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !ENABLE_LOCKING
+# undef USE_POSIX_THREADS
+# undef USE_SOLARIS_THREADS
+# undef USE_PTH_THREADS
+# undef USE_WIN32_THREADS
+#endif
+#include "glthread/lock.h"
+
+#if !ENABLE_LOCKING
+# if TEST_POSIX_THREADS
+# define USE_POSIX_THREADS 1
+# endif
+# if TEST_SOLARIS_THREADS
+# define USE_SOLARIS_THREADS 1
+# endif
+# if TEST_PTH_THREADS
+# define USE_PTH_THREADS 1
+# endif
+# if TEST_WIN32_THREADS
+# define USE_WIN32_THREADS 1
+# endif
+#endif
+
+#include "glthread/thread.h"
+#include "glthread/yield.h"
+
+#if ENABLE_DEBUGGING
+# define dbgprintf printf
+#else
+# define dbgprintf if (0) printf
+#endif
+
+#if EXPLICIT_YIELD
+# define yield() gl_thread_yield ()
+#else
+# define yield()
+#endif
+
+#define ACCOUNT_COUNT 4
+
+static int account[ACCOUNT_COUNT];
+
+static int
+random_account (void)
+{
+ return ((unsigned int) rand() >> 3) % ACCOUNT_COUNT;
+}
+
+static void
+check_accounts (void)
+{
+ int i, sum;
+
+ sum = 0;
+ for (i = 0; i < ACCOUNT_COUNT; i++)
+ sum += account[i];
+ if (sum != ACCOUNT_COUNT * 1000)
+ abort ();
+}
+
+
+/* ------------------- Test normal (non-recursive) locks ------------------- */
+
+/* Test normal locks by having several bank accounts and several threads
+ which shuffle around money between the accounts and another thread
+ checking that all the money is still there. */
+
+gl_lock_define_initialized(static, my_lock)
+
+static void *
+lock_mutator_thread (void *arg)
+{
+ int repeat;
+
+ for (repeat = REPEAT_COUNT; repeat > 0; repeat--)
+ {
+ int i1, i2, value;
+
+ dbgprintf ("Mutator %p before lock\n", gl_thread_self ());
+ gl_lock_lock (my_lock);
+ dbgprintf ("Mutator %p after lock\n", gl_thread_self ());
+
+ i1 = random_account ();
+ i2 = random_account ();
+ value = ((unsigned int) rand() >> 3) % 10;
+ account[i1] += value;
+ account[i2] -= value;
+
+ dbgprintf ("Mutator %p before unlock\n", gl_thread_self ());
+ gl_lock_unlock (my_lock);
+ dbgprintf ("Mutator %p after unlock\n", gl_thread_self ());
+
+ dbgprintf ("Mutator %p before check lock\n", gl_thread_self ());
+ gl_lock_lock (my_lock);
+ check_accounts ();
+ gl_lock_unlock (my_lock);
+ dbgprintf ("Mutator %p after check unlock\n", gl_thread_self ());
+
+ yield ();
+ }
+
+ dbgprintf ("Mutator %p dying.\n", gl_thread_self ());
+ return NULL;
+}
+
+static volatile int lock_checker_done;
+
+static void *
+lock_checker_thread (void *arg)
+{
+ while (!lock_checker_done)
+ {
+ dbgprintf ("Checker %p before check lock\n", gl_thread_self ());
+ gl_lock_lock (my_lock);
+ check_accounts ();
+ gl_lock_unlock (my_lock);
+ dbgprintf ("Checker %p after check unlock\n", gl_thread_self ());
+
+ yield ();
+ }
+
+ dbgprintf ("Checker %p dying.\n", gl_thread_self ());
+ return NULL;
+}
+
+static void
+test_lock (void)
+{
+ int i;
+ gl_thread_t checkerthread;
+ gl_thread_t threads[THREAD_COUNT];
+
+ /* Initialization. */
+ for (i = 0; i < ACCOUNT_COUNT; i++)
+ account[i] = 1000;
+ lock_checker_done = 0;
+
+ /* Spawn the threads. */
+ checkerthread = gl_thread_create (lock_checker_thread, NULL);
+ for (i = 0; i < THREAD_COUNT; i++)
+ threads[i] = gl_thread_create (lock_mutator_thread, NULL);
+
+ /* Wait for the threads to terminate. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ gl_thread_join (threads[i], NULL);
+ lock_checker_done = 1;
+ gl_thread_join (checkerthread, NULL);
+ check_accounts ();
+}
+
+
+/* ----------------- Test read-write (non-recursive) locks ----------------- */
+
+/* Test read-write locks by having several bank accounts and several threads
+ which shuffle around money between the accounts and several other threads
+ that check that all the money is still there. */
+
+gl_rwlock_define_initialized(static, my_rwlock)
+
+static void *
+rwlock_mutator_thread (void *arg)
+{
+ int repeat;
+
+ for (repeat = REPEAT_COUNT; repeat > 0; repeat--)
+ {
+ int i1, i2, value;
+
+ dbgprintf ("Mutator %p before wrlock\n", gl_thread_self ());
+ gl_rwlock_wrlock (my_rwlock);
+ dbgprintf ("Mutator %p after wrlock\n", gl_thread_self ());
+
+ i1 = random_account ();
+ i2 = random_account ();
+ value = ((unsigned int) rand() >> 3) % 10;
+ account[i1] += value;
+ account[i2] -= value;
+
+ dbgprintf ("Mutator %p before unlock\n", gl_thread_self ());
+ gl_rwlock_unlock (my_rwlock);
+ dbgprintf ("Mutator %p after unlock\n", gl_thread_self ());
+
+ yield ();
+ }
+
+ dbgprintf ("Mutator %p dying.\n", gl_thread_self ());
+ return NULL;
+}
+
+static volatile int rwlock_checker_done;
+
+static void *
+rwlock_checker_thread (void *arg)
+{
+ while (!rwlock_checker_done)
+ {
+ dbgprintf ("Checker %p before check rdlock\n", gl_thread_self ());
+ gl_rwlock_rdlock (my_rwlock);
+ check_accounts ();
+ gl_rwlock_unlock (my_rwlock);
+ dbgprintf ("Checker %p after check unlock\n", gl_thread_self ());
+
+ yield ();
+ }
+
+ dbgprintf ("Checker %p dying.\n", gl_thread_self ());
+ return NULL;
+}
+
+static void
+test_rwlock (void)
+{
+ int i;
+ gl_thread_t checkerthreads[THREAD_COUNT];
+ gl_thread_t threads[THREAD_COUNT];
+
+ /* Initialization. */
+ for (i = 0; i < ACCOUNT_COUNT; i++)
+ account[i] = 1000;
+ rwlock_checker_done = 0;
+
+ /* Spawn the threads. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ checkerthreads[i] = gl_thread_create (rwlock_checker_thread, NULL);
+ for (i = 0; i < THREAD_COUNT; i++)
+ threads[i] = gl_thread_create (rwlock_mutator_thread, NULL);
+
+ /* Wait for the threads to terminate. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ gl_thread_join (threads[i], NULL);
+ rwlock_checker_done = 1;
+ for (i = 0; i < THREAD_COUNT; i++)
+ gl_thread_join (checkerthreads[i], NULL);
+ check_accounts ();
+}
+
+
+/* -------------------------- Test recursive locks -------------------------- */
+
+/* Test recursive locks by having several bank accounts and several threads
+ which shuffle around money between the accounts (recursively) and another
+ thread checking that all the money is still there. */
+
+gl_recursive_lock_define_initialized(static, my_reclock)
+
+static void
+recshuffle (void)
+{
+ int i1, i2, value;
+
+ dbgprintf ("Mutator %p before lock\n", gl_thread_self ());
+ gl_recursive_lock_lock (my_reclock);
+ dbgprintf ("Mutator %p after lock\n", gl_thread_self ());
+
+ i1 = random_account ();
+ i2 = random_account ();
+ value = ((unsigned int) rand() >> 3) % 10;
+ account[i1] += value;
+ account[i2] -= value;
+
+ /* Recursive with probability 0.5. */
+ if (((unsigned int) rand() >> 3) % 2)
+ recshuffle ();
+
+ dbgprintf ("Mutator %p before unlock\n", gl_thread_self ());
+ gl_recursive_lock_unlock (my_reclock);
+ dbgprintf ("Mutator %p after unlock\n", gl_thread_self ());
+}
+
+static void *
+reclock_mutator_thread (void *arg)
+{
+ int repeat;
+
+ for (repeat = REPEAT_COUNT; repeat > 0; repeat--)
+ {
+ recshuffle ();
+
+ dbgprintf ("Mutator %p before check lock\n", gl_thread_self ());
+ gl_recursive_lock_lock (my_reclock);
+ check_accounts ();
+ gl_recursive_lock_unlock (my_reclock);
+ dbgprintf ("Mutator %p after check unlock\n", gl_thread_self ());
+
+ yield ();
+ }
+
+ dbgprintf ("Mutator %p dying.\n", gl_thread_self ());
+ return NULL;
+}
+
+static volatile int reclock_checker_done;
+
+static void *
+reclock_checker_thread (void *arg)
+{
+ while (!reclock_checker_done)
+ {
+ dbgprintf ("Checker %p before check lock\n", gl_thread_self ());
+ gl_recursive_lock_lock (my_reclock);
+ check_accounts ();
+ gl_recursive_lock_unlock (my_reclock);
+ dbgprintf ("Checker %p after check unlock\n", gl_thread_self ());
+
+ yield ();
+ }
+
+ dbgprintf ("Checker %p dying.\n", gl_thread_self ());
+ return NULL;
+}
+
+static void
+test_recursive_lock (void)
+{
+ int i;
+ gl_thread_t checkerthread;
+ gl_thread_t threads[THREAD_COUNT];
+
+ /* Initialization. */
+ for (i = 0; i < ACCOUNT_COUNT; i++)
+ account[i] = 1000;
+ reclock_checker_done = 0;
+
+ /* Spawn the threads. */
+ checkerthread = gl_thread_create (reclock_checker_thread, NULL);
+ for (i = 0; i < THREAD_COUNT; i++)
+ threads[i] = gl_thread_create (reclock_mutator_thread, NULL);
+
+ /* Wait for the threads to terminate. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ gl_thread_join (threads[i], NULL);
+ reclock_checker_done = 1;
+ gl_thread_join (checkerthread, NULL);
+ check_accounts ();
+}
+
+
+/* ------------------------ Test once-only execution ------------------------ */
+
+/* Test once-only execution by having several threads attempt to grab a
+ once-only task simultaneously (triggered by releasing a read-write lock). */
+
+gl_once_define(static, fresh_once)
+static int ready[THREAD_COUNT];
+static gl_lock_t ready_lock[THREAD_COUNT];
+#if ENABLE_LOCKING
+static gl_rwlock_t fire_signal[REPEAT_COUNT];
+#else
+static volatile int fire_signal_state;
+#endif
+static gl_once_t once_control;
+static int performed;
+gl_lock_define_initialized(static, performed_lock)
+
+static void
+once_execute (void)
+{
+ gl_lock_lock (performed_lock);
+ performed++;
+ gl_lock_unlock (performed_lock);
+}
+
+static void *
+once_contender_thread (void *arg)
+{
+ int id = (int) (long) arg;
+ int repeat;
+
+ for (repeat = 0; repeat <= REPEAT_COUNT; repeat++)
+ {
+ /* Tell the main thread that we're ready. */
+ gl_lock_lock (ready_lock[id]);
+ ready[id] = 1;
+ gl_lock_unlock (ready_lock[id]);
+
+ if (repeat == REPEAT_COUNT)
+ break;
+
+ dbgprintf ("Contender %p waiting for signal for round %d\n",
+ gl_thread_self (), repeat);
+#if ENABLE_LOCKING
+ /* Wait for the signal to go. */
+ gl_rwlock_rdlock (fire_signal[repeat]);
+ /* And don't hinder the others (if the scheduler is unfair). */
+ gl_rwlock_unlock (fire_signal[repeat]);
+#else
+ /* Wait for the signal to go. */
+ while (fire_signal_state <= repeat)
+ yield ();
+#endif
+ dbgprintf ("Contender %p got the signal for round %d\n",
+ gl_thread_self (), repeat);
+
+ /* Contend for execution. */
+ gl_once (once_control, once_execute);
+ }
+
+ return NULL;
+}
+
+static void
+test_once (void)
+{
+ int i, repeat;
+ gl_thread_t threads[THREAD_COUNT];
+
+ /* Initialize all variables. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ {
+ ready[i] = 0;
+ gl_lock_init (ready_lock[i]);
+ }
+#if ENABLE_LOCKING
+ for (i = 0; i < REPEAT_COUNT; i++)
+ gl_rwlock_init (fire_signal[i]);
+#else
+ fire_signal_state = 0;
+#endif
+
+ /* Block all fire_signals. */
+ for (i = REPEAT_COUNT-1; i >= 0; i--)
+ gl_rwlock_wrlock (fire_signal[i]);
+
+ /* Spawn the threads. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ threads[i] = gl_thread_create (once_contender_thread, (void *) (long) i);
+
+ for (repeat = 0; repeat <= REPEAT_COUNT; repeat++)
+ {
+ /* Wait until every thread is ready. */
+ dbgprintf ("Main thread before synchonizing for round %d\n", repeat);
+ for (;;)
+ {
+ int ready_count = 0;
+ for (i = 0; i < THREAD_COUNT; i++)
+ {
+ gl_lock_lock (ready_lock[i]);
+ ready_count += ready[i];
+ gl_lock_unlock (ready_lock[i]);
+ }
+ if (ready_count == THREAD_COUNT)
+ break;
+ yield ();
+ }
+ dbgprintf ("Main thread after synchonizing for round %d\n", repeat);
+
+ if (repeat > 0)
+ {
+ /* Check that exactly one thread executed the once_execute()
+ function. */
+ if (performed != 1)
+ abort ();
+ }
+
+ if (repeat == REPEAT_COUNT)
+ break;
+
+ /* Preparation for the next round: Initialize once_control. */
+ memcpy (&once_control, &fresh_once, sizeof (gl_once_t));
+
+ /* Preparation for the next round: Reset the performed counter. */
+ performed = 0;
+
+ /* Preparation for the next round: Reset the ready flags. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ {
+ gl_lock_lock (ready_lock[i]);
+ ready[i] = 0;
+ gl_lock_unlock (ready_lock[i]);
+ }
+
+ /* Signal all threads simultaneously. */
+ dbgprintf ("Main thread giving signal for round %d\n", repeat);
+#if ENABLE_LOCKING
+ gl_rwlock_unlock (fire_signal[repeat]);
+#else
+ fire_signal_state = repeat + 1;
+#endif
+ }
+
+ /* Wait for the threads to terminate. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ gl_thread_join (threads[i], NULL);
+}
+
+
+/* -------------------------------------------------------------------------- */
+
+int
+main ()
+{
+#if TEST_PTH_THREADS
+ if (!pth_init ())
+ abort ();
+#endif
+
+#if DO_TEST_LOCK
+ printf ("Starting test_lock ..."); fflush (stdout);
+ test_lock ();
+ printf (" OK\n"); fflush (stdout);
+#endif
+#if DO_TEST_RWLOCK
+ printf ("Starting test_rwlock ..."); fflush (stdout);
+ test_rwlock ();
+ printf (" OK\n"); fflush (stdout);
+#endif
+#if DO_TEST_RECURSIVE_LOCK
+ printf ("Starting test_recursive_lock ..."); fflush (stdout);
+ test_recursive_lock ();
+ printf (" OK\n"); fflush (stdout);
+#endif
+#if DO_TEST_ONCE
+ printf ("Starting test_once ..."); fflush (stdout);
+ test_once ();
+ printf (" OK\n"); fflush (stdout);
+#endif
+
+ return 0;
+}
+
+#else
+
+/* No multithreading available. */
+
+#include <stdio.h>
+
+int
+main ()
+{
+ fputs ("Skipping test: multithreading not enabled\n", stderr);
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/test-log.c b/gnulib/tests/test-log.c
new file mode 100644
index 00000000..3fc74d2b
--- /dev/null
+++ b/gnulib/tests/test-log.c
@@ -0,0 +1,40 @@
+/* Test of log() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (log, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = log (x);
+ ASSERT (y >= -0.5108256238 && y <= -0.5108256237);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-log10.c b/gnulib/tests/test-log10.c
new file mode 100644
index 00000000..612a2922
--- /dev/null
+++ b/gnulib/tests/test-log10.c
@@ -0,0 +1,40 @@
+/* Test of log10() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (log10, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = log10 (x);
+ ASSERT (y >= -0.2218487497 && y <= -0.2218487496);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-log1p.c b/gnulib/tests/test-log1p.c
new file mode 100644
index 00000000..aa8d82e7
--- /dev/null
+++ b/gnulib/tests/test-log1p.c
@@ -0,0 +1,40 @@
+/* Test of log1p() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (log1p, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = log1p (x);
+ ASSERT (y >= 0.4700036292 && y <= 0.4700036293);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-logb.c b/gnulib/tests/test-logb.c
new file mode 100644
index 00000000..8b7a612d
--- /dev/null
+++ b/gnulib/tests/test-logb.c
@@ -0,0 +1,62 @@
+/* Test of logb() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (logb, double, (double));
+
+#include <float.h>
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* Some particular values. */
+ x = 0.6;
+ y = logb (x);
+ ASSERT (y == -1.0);
+
+ x = 1.2;
+ y = logb (x);
+ ASSERT (y == 0.0);
+
+ x = 2.1;
+ y = logb (x);
+ ASSERT (y == 1.0);
+
+ x = 3.9;
+ y = logb (x);
+ ASSERT (y == 1.0);
+
+ x = 4.0;
+ y = logb (x);
+ ASSERT (y == (FLT_RADIX == 2 ? 2.0 : 1.0));
+
+ x = 0.25;
+ y = logb (x);
+ ASSERT (y == (FLT_RADIX == 2 ? -2.0 : -1.0));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-logl.c b/gnulib/tests/test-logl.c
new file mode 100644
index 00000000..357df92d
--- /dev/null
+++ b/gnulib/tests/test-logl.c
@@ -0,0 +1,45 @@
+/* Test of logl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (logl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = logl (x);
+ ASSERT (y >= -0.5108256238L && y <= -0.5108256237L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-lseek.c b/gnulib/tests/test-lseek.c
new file mode 100644
index 00000000..bafa9b58
--- /dev/null
+++ b/gnulib/tests/test-lseek.c
@@ -0,0 +1,96 @@
+/* Test of lseek() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Eric Blake, 2007. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (lseek, off_t, (int, off_t, int));
+
+#include <errno.h>
+
+#include "macros.h"
+
+/* ARGC must be 2; *ARGV[1] is '0' if stdin and stdout are files, '1'
+ if they are pipes, and '2' if they are closed. Check for proper
+ semantics of lseek. */
+int
+main (int argc, char **argv)
+{
+ if (argc != 2)
+ return 2;
+ switch (*argv[1])
+ {
+ case '0': /* regular files */
+ ASSERT (lseek (0, (off_t)2, SEEK_SET) == 2);
+ ASSERT (lseek (0, (off_t)-4, SEEK_CUR) == -1);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+#if ! defined __BEOS__
+ /* POSIX says that the last lseek call, when failing, does not change
+ the current offset. But BeOS sets it to 0. */
+ ASSERT (lseek (0, (off_t)0, SEEK_CUR) == 2);
+#endif
+#if 0 /* leads to SIGSYS on IRIX 6.5 */
+ ASSERT (lseek (0, (off_t)0, (SEEK_SET | SEEK_CUR | SEEK_END) + 1) == -1);
+ ASSERT (errno == EINVAL);
+#endif
+ ASSERT (lseek (1, (off_t)2, SEEK_SET) == 2);
+ errno = 0;
+ ASSERT (lseek (1, (off_t)-4, SEEK_CUR) == -1);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+#if ! defined __BEOS__
+ /* POSIX says that the last lseek call, when failing, does not change
+ the current offset. But BeOS sets it to 0. */
+ ASSERT (lseek (1, (off_t)0, SEEK_CUR) == 2);
+#endif
+#if 0 /* leads to SIGSYS on IRIX 6.5 */
+ ASSERT (lseek (1, (off_t)0, (SEEK_SET | SEEK_CUR | SEEK_END) + 1) == -1);
+ ASSERT (errno == EINVAL);
+#endif
+ break;
+
+ case '1': /* pipes */
+ errno = 0;
+ ASSERT (lseek (0, (off_t)0, SEEK_CUR) == -1);
+ ASSERT (errno == ESPIPE);
+ errno = 0;
+ ASSERT (lseek (1, (off_t)0, SEEK_CUR) == -1);
+ ASSERT (errno == ESPIPE);
+ break;
+
+ case '2': /* closed */
+ /* Explicitly close file descriptors 0 and 1. The <&- and >&- in the
+ invoking shell are not enough on HP-UX. */
+ close (0);
+ close (1);
+ errno = 0;
+ ASSERT (lseek (0, (off_t)0, SEEK_CUR) == -1);
+ ASSERT (errno == EBADF);
+ errno = 0;
+ ASSERT (lseek (1, (off_t)0, SEEK_CUR) == -1);
+ ASSERT (errno == EBADF);
+ break;
+
+ default:
+ return 1;
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-lseek.sh b/gnulib/tests/test-lseek.sh
new file mode 100755
index 00000000..e84c2bb4
--- /dev/null
+++ b/gnulib/tests/test-lseek.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+tmpfiles=
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles=t-lseek.tmp
+# seekable files
+./test-lseek${EXEEXT} 0 < "$srcdir/test-lseek.sh" > t-lseek.tmp || exit 1
+
+# pipes
+echo hi | ./test-lseek${EXEEXT} 1 | cat || exit 1
+
+# closed descriptors
+./test-lseek${EXEEXT} 2 <&- >&- || exit 1
+
+rm -rf $tmpfiles
+exit 0
diff --git a/gnulib/tests/test-lstat.c b/gnulib/tests/test-lstat.c
new file mode 100644
index 00000000..b8f9237e
--- /dev/null
+++ b/gnulib/tests/test-lstat.c
@@ -0,0 +1,60 @@
+/* Test of lstat() function.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson, 2008; and Eric Blake, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+/* Caution: lstat may be a function-like macro. Although this
+ signature check must pass, it may be the signature of the real (and
+ broken) lstat rather than rpl_lstat. Most code should not use the
+ address of lstat. */
+#include "signature.h"
+SIGNATURE_CHECK (lstat, int, (char const *, struct stat *));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "same-inode.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-lstat.t"
+
+#include "test-lstat.h"
+
+/* Wrapper around lstat, which works even if lstat is a function-like
+ macro, where test_lstat_func(lstat) would do the wrong thing. */
+static int
+do_lstat (char const *name, struct stat *st)
+{
+ return lstat (name, st);
+}
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_lstat_func (do_lstat, true);
+}
diff --git a/gnulib/tests/test-lstat.h b/gnulib/tests/test-lstat.h
new file mode 100644
index 00000000..f120f4c5
--- /dev/null
+++ b/gnulib/tests/test-lstat.h
@@ -0,0 +1,116 @@
+/* Test of lstat() function.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson, 2008; and Eric Blake, 2009. */
+
+/* This file is designed to test both lstat(n,buf) and
+ fstatat(AT_FDCWD,n,buf,AT_SYMLINK_NOFOLLOW). FUNC is the function
+ to test. Assumes that BASE and ASSERT are already defined, and
+ that appropriate headers are already included. If PRINT, warn
+ before skipping symlink tests with status 77. */
+
+static int
+test_lstat_func (int (*func) (char const *, struct stat *), bool print)
+{
+ struct stat st1;
+ struct stat st2;
+
+ /* Test for common directories. */
+ ASSERT (func (".", &st1) == 0);
+ ASSERT (func ("./", &st2) == 0);
+ ASSERT (SAME_INODE (st1, st2));
+ ASSERT (S_ISDIR (st1.st_mode));
+ ASSERT (S_ISDIR (st2.st_mode));
+ ASSERT (func ("/", &st1) == 0);
+ ASSERT (func ("///", &st2) == 0);
+ ASSERT (SAME_INODE (st1, st2));
+ ASSERT (S_ISDIR (st1.st_mode));
+ ASSERT (S_ISDIR (st2.st_mode));
+ ASSERT (func ("..", &st1) == 0);
+ ASSERT (S_ISDIR (st1.st_mode));
+
+ /* Test for error conditions. */
+ errno = 0;
+ ASSERT (func ("", &st1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("nosuch", &st1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("nosuch/", &st1) == -1);
+ ASSERT (errno == ENOENT);
+
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ ASSERT (func (BASE "file", &st1) == 0);
+ ASSERT (S_ISREG (st1.st_mode));
+ errno = 0;
+ ASSERT (func (BASE "file/", &st1) == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Now for some symlink tests, where supported. We set up:
+ link1 -> directory
+ link2 -> file
+ link3 -> dangling
+ link4 -> loop
+ then test behavior both with and without trailing slash.
+ */
+ if (symlink (".", BASE "link1") != 0)
+ {
+ ASSERT (unlink (BASE "file") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (symlink (BASE "file", BASE "link2") == 0);
+ ASSERT (symlink (BASE "nosuch", BASE "link3") == 0);
+ ASSERT (symlink (BASE "link4", BASE "link4") == 0);
+
+ ASSERT (func (BASE "link1", &st1) == 0);
+ ASSERT (S_ISLNK (st1.st_mode));
+ ASSERT (func (BASE "link1/", &st1) == 0);
+ ASSERT (stat (BASE "link1", &st2) == 0);
+ ASSERT (S_ISDIR (st1.st_mode));
+ ASSERT (S_ISDIR (st2.st_mode));
+ ASSERT (SAME_INODE (st1, st2));
+
+ ASSERT (func (BASE "link2", &st1) == 0);
+ ASSERT (S_ISLNK (st1.st_mode));
+ errno = 0;
+ ASSERT (func (BASE "link2/", &st1) == -1);
+ ASSERT (errno == ENOTDIR);
+
+ ASSERT (func (BASE "link3", &st1) == 0);
+ ASSERT (S_ISLNK (st1.st_mode));
+ errno = 0;
+ ASSERT (func (BASE "link3/", &st1) == -1);
+ ASSERT (errno == ENOENT);
+
+ ASSERT (func (BASE "link4", &st1) == 0);
+ ASSERT (S_ISLNK (st1.st_mode));
+ errno = 0;
+ ASSERT (func (BASE "link4/", &st1) == -1);
+ ASSERT (errno == ELOOP);
+
+ /* Cleanup. */
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (unlink (BASE "link1") == 0);
+ ASSERT (unlink (BASE "link2") == 0);
+ ASSERT (unlink (BASE "link3") == 0);
+ ASSERT (unlink (BASE "link4") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-lutimens.h b/gnulib/tests/test-lutimens.h
new file mode 100644
index 00000000..ab30a067
--- /dev/null
+++ b/gnulib/tests/test-lutimens.h
@@ -0,0 +1,213 @@
+/* Test of file timestamp modification functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include "test-utimens-common.h"
+
+/* This file is designed to test both lutimens(a,b) and
+ utimensat(AT_FDCWD,a,b,AT_SYMLINK_NOFOLLOW). FUNC is the function
+ to test. Assumes that BASE and ASSERT are already defined. If
+ PRINT, warn before skipping tests with status 77. */
+static int
+test_lutimens (int (*func) (char const *, struct timespec const *), bool print)
+{
+ int result;
+ int saved_errno;
+ struct stat st1;
+ struct stat st2;
+ bool atime_supported = true;
+
+ /* Non-symlinks should be handled just like utimens. */
+ errno = 0;
+ ASSERT (func ("no_such", NULL) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("no_such/", NULL) == -1);
+ ASSERT (errno == ENOENT || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func ("", NULL) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ ASSERT (stat (BASE "file", &st1) == 0);
+ ASSERT (st1.st_atime != Y2K);
+ ASSERT (st1.st_mtime != Y2K);
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, 0 } };
+ errno = 0;
+ ASSERT (func (BASE "file/", ts) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (stat (BASE "file", &st2) == 0);
+ ASSERT (st1.st_atime == st2.st_atime);
+ ASSERT (st1.st_mtime == st2.st_mtime);
+ }
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, 0 } };
+ nap ();
+ ASSERT (func (BASE "file", ts) == 0);
+ }
+ ASSERT (stat (BASE "file", &st2) == 0);
+ ASSERT (st2.st_atime == Y2K);
+ ASSERT (st2.st_mtime == Y2K);
+ if (check_ctime)
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+
+ /* Play with symlink timestamps. */
+ if (symlink (BASE "file", BASE "link"))
+ {
+ ASSERT (unlink (BASE "file") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ errno = 0;
+ result = func (BASE "link", NULL);
+ saved_errno = errno;
+ /* Make sure we did not reference through link by accident. */
+ ASSERT (stat (BASE "file", &st1) == 0);
+ ASSERT (st1.st_atime == Y2K);
+ ASSERT (st1.st_mtime == Y2K);
+ ASSERT (lstat (BASE "link", &st1) == 0);
+ ASSERT (st1.st_atime != Y2K);
+ ASSERT (st1.st_mtime != Y2K);
+ ASSERT (unlink (BASE "file") == 0);
+ if (result == -1 && saved_errno == ENOSYS)
+ {
+ ASSERT (unlink (BASE "link") == 0);
+ if (print)
+ fputs ("skipping test: "
+ "setting symlink time not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (!result);
+ ASSERT (lstat (BASE "link", &st1) == 0);
+ /* On cygwin, lstat() changes atime of symlinks, so that lutimens
+ can only effectively modify mtime. */
+ nap ();
+ ASSERT (lstat (BASE "link", &st2) == 0);
+ if (st1.st_atime != st2.st_atime
+ || get_stat_atime_ns (&st1) != get_stat_atime_ns (&st2))
+ atime_supported = false;
+ ASSERT (st1.st_ctime == st2.st_ctime);
+ ASSERT (get_stat_ctime_ns (&st1) == get_stat_ctime_ns (&st2));
+
+ /* Invalid arguments. */
+ {
+ struct timespec ts[2] = { { Y2K, UTIME_BOGUS_POS }, { Y2K, 0 } };
+ errno = 0;
+ ASSERT (func (BASE "link", ts) == -1);
+ ASSERT (errno == EINVAL);
+ }
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, UTIME_BOGUS_NEG } };
+ errno = 0;
+ ASSERT (func (BASE "link", ts) == -1);
+ ASSERT (errno == EINVAL);
+ }
+ ASSERT (lstat (BASE "link", &st2) == 0);
+ if (atime_supported)
+ {
+ ASSERT (st1.st_atime == st2.st_atime);
+ ASSERT (get_stat_atime_ns (&st1) == get_stat_atime_ns (&st2));
+ }
+ ASSERT (utimecmp (BASE "link", &st1, &st2, 0) == 0);
+
+ /* Set both times. */
+ {
+ struct timespec ts[2] = { { Y2K, BILLION / 2 - 1 }, { Y2K, BILLION - 1 } };
+ nap ();
+ ASSERT (func (BASE "link", ts) == 0);
+ ASSERT (lstat (BASE "link", &st2) == 0);
+ if (atime_supported)
+ {
+ ASSERT (st2.st_atime == Y2K);
+ ASSERT (0 <= get_stat_atime_ns (&st2));
+ ASSERT (get_stat_atime_ns (&st2) < BILLION / 2);
+ }
+ ASSERT (st2.st_mtime == Y2K);
+ ASSERT (0 <= get_stat_mtime_ns (&st2));
+ ASSERT (get_stat_mtime_ns (&st2) < BILLION);
+ if (check_ctime)
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+ }
+
+ /* Play with UTIME_OMIT, UTIME_NOW. */
+ {
+ struct stat st3;
+ struct timespec ts[2] = { { BILLION, UTIME_OMIT }, { 0, UTIME_NOW } };
+ nap ();
+ ASSERT (func (BASE "link", ts) == 0);
+ ASSERT (lstat (BASE "link", &st3) == 0);
+ if (atime_supported)
+ {
+ ASSERT (st3.st_atime == Y2K);
+ ASSERT (0 <= get_stat_atime_ns (&st3));
+ ASSERT (get_stat_atime_ns (&st3) < BILLION / 2);
+ }
+ ASSERT (utimecmp (BASE "link", &st1, &st3, 0) <= 0);
+ if (check_ctime)
+ ASSERT (st2.st_ctime < st3.st_ctime
+ || (st2.st_ctime == st3.st_ctime
+ && get_stat_ctime_ns (&st2) < get_stat_ctime_ns (&st3)));
+ nap ();
+ ts[0].tv_nsec = 0;
+ ts[1].tv_nsec = UTIME_OMIT;
+ ASSERT (func (BASE "link", ts) == 0);
+ ASSERT (lstat (BASE "link", &st2) == 0);
+ if (atime_supported)
+ {
+ ASSERT (st2.st_atime == BILLION);
+ ASSERT (get_stat_atime_ns (&st2) == 0);
+ }
+ ASSERT (st3.st_mtime == st2.st_mtime);
+ ASSERT (get_stat_mtime_ns (&st3) == get_stat_mtime_ns (&st2));
+ if (check_ctime)
+ ASSERT (st3.st_ctime < st2.st_ctime
+ || (st3.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st3) < get_stat_ctime_ns (&st2)));
+ }
+
+ /* Symlink to directory. */
+ ASSERT (unlink (BASE "link") == 0);
+ ASSERT (symlink (BASE "dir", BASE "link") == 0);
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, 0 } };
+ ASSERT (func (BASE "link/", ts) == 0);
+ }
+ /* On cygwin 1.5, stat() changes atime of directories, so only check
+ mtime. */
+ ASSERT (stat (BASE "dir", &st1) == 0);
+ ASSERT (st1.st_mtime == Y2K);
+ ASSERT (lstat (BASE "link", &st1) == 0);
+ ASSERT (st1.st_atime != Y2K);
+ ASSERT (st1.st_mtime != Y2K);
+ ASSERT (func (BASE "link", NULL) == 0);
+ ASSERT (stat (BASE "dir", &st1) == 0);
+ ASSERT (st1.st_mtime == Y2K);
+ ASSERT (lstat (BASE "link", &st1) == 0);
+ ASSERT (st1.st_atime != Y2K);
+ ASSERT (st1.st_mtime != Y2K);
+
+ /* Cleanup. */
+ ASSERT (rmdir (BASE "dir") == 0);
+ ASSERT (unlink (BASE "link") == 0);
+ return 0;
+}
diff --git a/gnulib/tests/test-malloca.c b/gnulib/tests/test-malloca.c
new file mode 100644
index 00000000..14ef3a9d
--- /dev/null
+++ b/gnulib/tests/test-malloca.c
@@ -0,0 +1,59 @@
+/* Test of safe automatic memory allocation.
+ Copyright (C) 2005, 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+#include "malloca.h"
+
+#include <stdlib.h>
+
+static void
+do_allocation (int n)
+{
+ void *ptr = malloca (n);
+ freea (ptr);
+ ptr = safe_alloca (n);
+}
+
+void (*func) (int) = do_allocation;
+
+int
+main ()
+{
+ int i;
+
+ /* Repeat a lot of times, to make sure there's no memory leak. */
+ for (i = 0; i < 50000; i++)
+ {
+ /* Try various values.
+ n = 0 gave a crash on Alpha with gcc-2.5.8.
+ Some versions of MacOS X have a stack size limit of 512 KB. */
+ func (34);
+ func (134);
+ func (399);
+ func (510823);
+ func (129321);
+ func (0);
+ func (4070);
+ func (4095);
+ func (1);
+ func (16582);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-math.c b/gnulib/tests/test-math.c
new file mode 100644
index 00000000..f940a249
--- /dev/null
+++ b/gnulib/tests/test-math.c
@@ -0,0 +1,53 @@
+/* Test of <math.h> substitute.
+ Copyright (C) 2007, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#ifndef NAN
+# error NAN should be defined
+choke me
+#endif
+
+#if 0
+/* Check that NAN expands into a constant expression. */
+static float n = NAN;
+#endif
+
+/* Compare two numbers with ==.
+ This is a separate function because IRIX 6.5 "cc -O" miscompiles an
+ 'x == x' test. */
+static int
+numeric_equal (double x, double y)
+{
+ return x == y;
+}
+
+int
+main (void)
+{
+ double d = NAN;
+ double zero = 0.0;
+ if (numeric_equal (d, d))
+ return 1;
+ d = HUGE_VAL;
+ if (!numeric_equal (d, 1.0 / zero))
+ return 1;
+ return 0;
+}
diff --git a/gnulib/tests/test-mbmemcasecmp.c b/gnulib/tests/test-mbmemcasecmp.c
new file mode 100644
index 00000000..4518db41
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecmp.c
@@ -0,0 +1,60 @@
+/* Test of case-insensitive memory area comparison function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "mbmemcasecmp.h"
+
+#include <locale.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-mbmemcasecmp.h"
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_ascii (mbmemcasecmp);
+
+ if (argc > 1)
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ test_iso_8859_1 (mbmemcasecmp, true);
+ return 0;
+
+ case '2':
+ /* Locale encoding is UTF-8, locale is not Turkish. */
+ test_utf_8 (mbmemcasecmp, false);
+ return 0;
+
+ case '3':
+ /* Locale encoding is UTF-8, locale is Turkish. */
+ test_utf_8 (mbmemcasecmp, true);
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-mbmemcasecmp.h b/gnulib/tests/test-mbmemcasecmp.h
new file mode 100644
index 00000000..f41580df
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecmp.h
@@ -0,0 +1,372 @@
+/* Test of case-insensitive memory area comparison function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_casecmp) (const char *, size_t, const char *, size_t))
+{
+ /* Empty string. */
+ {
+ ASSERT (my_casecmp (NULL, 0, NULL, 0) == 0);
+ }
+ {
+ static const char input[] = { 'x', 'y' };
+
+ ASSERT (my_casecmp (input, SIZEOF (input), NULL, 0) > 0);
+
+ ASSERT (my_casecmp (NULL, 0, input, SIZEOF (input)) < 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ /* Normal lexicographic order. */
+ {
+ static const char input1[] = { 'A', 'm', 'e', 'r', 'i', 'c', 'a' };
+ static const char input2[] = { 'A', 'm', 'i', 'g', 'o' };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) < 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1)) > 0);
+ }
+
+ /* Shorter and longer strings. */
+ {
+ static const char input1[] = { 'R', 'e', 'a', 'g', 'a', 'n' };
+ static const char input2[] = { 'R', 'e', 'a', 'g', 'a', 'n', 'o', 'm', 'i', 'c', 's' };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) < 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1)) > 0);
+ }
+
+ ASSERT (my_casecmp ("paragraph", 9, "Paragraph", 9) == 0);
+
+ ASSERT (my_casecmp ("paragrapH", 9, "parAgRaph", 9) == 0);
+
+ ASSERT (my_casecmp ("paragraph", 9, "paraLyzed", 9) < 0);
+ ASSERT (my_casecmp ("paraLyzed", 9, "paragraph", 9) > 0);
+
+ ASSERT (my_casecmp ("para", 4, "paragraph", 9) < 0);
+ ASSERT (my_casecmp ("paragraph", 9, "para", 4) > 0);
+}
+
+static void
+test_iso_8859_1 (int (*my_casecmp) (const char *, size_t, const char *, size_t), bool assume_byte_values)
+{
+ #if ! defined __osf__ /* This test fails on OSF/1 5.1. */
+ {
+ static const char input1[] = { 'H', 0xF6, 'h', 'l', 'e' };
+ static const char input2[] = { 'H', 0xD6, 'h', 'L', 'e' };
+ static const char input3[] = { 'H', 0xF6, 'h', 'l', 'e', 'n' };
+ static const char input4[] = { 'H', 0xD6, 'h', 'L', 'e', 'n' };
+ static const char input5[] = { 'H', 'u', 'r', 'z' };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1)) == 0);
+
+ ASSERT (my_casecmp (input3, SIZEOF (input3), input4, SIZEOF (input4)) == 0);
+
+ ASSERT (my_casecmp (input4, SIZEOF (input4), input3, SIZEOF (input3)) == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3)) < 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input4, SIZEOF (input4)) < 0);
+
+ if (assume_byte_values)
+ {
+ /* These results are the opposite of those in test-ulc-casecmp.c,
+ because my_casecmp compares precomposed characters, whereas
+ ulc_casecmp compares decomposed character sequences. */
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input5, SIZEOF (input5)) > 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input5, SIZEOF (input5)) > 0);
+ }
+ }
+ #endif
+
+ #if 0 /* This functionality requires ulc_casecmp. */
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const char input1[] = { 0x68, 0x65, 0x69, 0xDF };
+ static const char input2[] = { 0x68, 0x65, 0x69, 0x73, 0x73 };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+ }
+ #endif
+}
+
+static void
+test_utf_8 (int (*my_casecmp) (const char *, size_t, const char *, size_t), bool turkish)
+{
+ /* The following tests shows how my_casecmp() is different from
+ strcasecmp(). */
+
+ ASSERT (my_casecmp ("\303\266zg\303\274r", 7, "\303\226ZG\303\234R", 7) == 0); /* özgür */
+ ASSERT (my_casecmp ("\303\226ZG\303\234R", 7, "\303\266zg\303\274r", 7) == 0); /* özgür */
+
+ /* This test shows how strings of different size can compare equal. */
+ if (turkish)
+ {
+ ASSERT (my_casecmp ("turkish", 7, "TURK\304\260SH", 8) == 0);
+ ASSERT (my_casecmp ("TURK\304\260SH", 8, "turkish", 7) == 0);
+ }
+
+ #if 0 /* This functionality requires ulc_casecmp. */
+ /* Normalization effects. */
+ {
+ static const char input1[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e' };
+ static const char input2[] = { 'H', 'O', 0xCC, 0x88, 'h', 'L', 'e' };
+ static const char input3[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e', 'n' };
+ static const char input4[] = { 'H', 'O', 0xCC, 0x88, 'h', 'L', 'e', 'n' };
+ static const char input5[] = { 'H', 'u', 'r', 'z' };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1)) == 0);
+
+ ASSERT (my_casecmp (input3, SIZEOF (input3), input4, SIZEOF (input4)) == 0);
+
+ ASSERT (my_casecmp (input4, SIZEOF (input4), input3, SIZEOF (input3)) == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3)) < 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input4, SIZEOF (input4)) < 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input5, SIZEOF (input5)) < 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input5, SIZEOF (input5)) < 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const char input1[] = { 0xC3, 0x84 };
+ static const char input2[] = { 0x41, 0xCC, 0x88 };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const char input1[] = { 0xC7, 0x9E };
+ static const char input2[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+ }
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const char input1[] = { 0xE1, 0xBF, 0x81 };
+ static const char input2[] = { 0xC2, 0xA8, 0xCD, 0x82 };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+ }
+ { /* HANGUL SYLLABLE GEUL */
+ static const char input1[] = { 0xEA, 0xB8, 0x80 };
+ static const char input2[] = { 0xEA, 0xB7, 0xB8, 0xE1, 0x86, 0xAF };
+ static const char input3[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3)) == 0);
+ }
+ { /* HANGUL SYLLABLE GEU */
+ static const char input1[] = { 0xEA, 0xB7, 0xB8 };
+ static const char input2[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+ }
+ #endif
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const char input1[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const char input2[] =
+ { 'g', 'r', 0xC3, 0xBC, 0x73, 0x73, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0xD0, 0xB7, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const char input3[] =
+ { 'G', 'R', 0xC3, 0x9C, 0x53, 0x53, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0x94, 0xD0, 0xA0, 0xD0, 0x90, 0xD0, 0x92, 0xD0, 0xA1,
+ 0xD0, 0xA2, 0xD0, 0x92, 0xD0, 0xA3, 0xD0, 0x99, 0xD0, 0xA2, 0xD0, 0x95,
+ '!', ' ', 'X', '=', '(', '-', 'B', 0xC2, 0xB1, 'S', 'Q', 'R', 'T', '(',
+ 'B', 0xC2, 0xB2, '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+
+ (void) input1;
+
+ #if 0 /* This functionality requires ulc_casecmp. */
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3)) == 0);
+ #endif
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3)) == 0);
+ }
+
+ #if 0 /* This functionality requires ulc_casecmp. */
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const char input1[] = { 0xC5, 0x89 };
+ static const char input2[] = { 0xCA, 0xBC, 0x6E };
+ static const char input3[] = { 0xCA, 0xBC, 0x4E };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const char input1[] = { 0xCE, 0x90 };
+ static const char input2[] = { 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81 };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+ }
+ #endif
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const char input[] = { 0x49 };
+ static const char casefolded[] = { 0x69 };
+ static const char casefolded_tr[] = { 0xC4, 0xB1 };
+
+ if (!turkish)
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) == 0);
+ else
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const char input[] = { 0x69 };
+ static const char casefolded[] = { 0x49 };
+ static const char casefolded_tr[] = { 0xC4, 0xB0 };
+
+ if (!turkish)
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) == 0);
+ else
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const char input[] = { 0xC4, 0xB0 };
+ static const char casefolded[] = { 0x69, 0xCC, 0x87 };
+ static const char casefolded_tr[] = { 0x69 };
+
+ (void) casefolded;
+
+ if (!turkish)
+ {
+ #if 0 /* This functionality requires ulc_casecmp. */
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) == 0);
+ #endif
+ }
+ else
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const char input[] = { 0xC4, 0xB1 };
+ static const char casefolded[] = { 0x49 };
+
+ if (!turkish)
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) > 0);
+ else
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* "topkapı" */
+ static const char input[] =
+ { 0x54, 0x4F, 0x50, 0x4B, 0x41, 0x50, 0x49 };
+ static const char casefolded[] =
+ { 0x74, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+
+ if (!turkish)
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) < 0);
+ else
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ #if 0 /* This functionality requires ulc_casecmp. */
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const char input1[] = { 0x68, 0x65, 0x69, 0xC3, 0x9F };
+ static const char input2[] = { 0x68, 0x65, 0x69, 0x73, 0x73 };
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+ }
+ #endif
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const char input1[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x82,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x82
+ };
+ static const char input2[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x83,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x83
+ };
+ static const char input3[] =
+ {
+ 0xCE, 0xA0, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x99, 0xCE, 0xA3, 0xCE, 0xA3,
+ 0xCE, 0x8C, 0xCE, 0xA4, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x95, 0xCE, 0xA3,
+ ' ', 0xCE, 0xA0, 0xCE, 0x9B, 0xCE, 0x97, 0xCE, 0xA1, 0xCE, 0x9F,
+ 0xCE, 0xA6, 0xCE, 0x9F, 0xCE, 0xA1, 0xCE, 0x8A, 0xCE, 0x95, 0xCE, 0xA3
+ };
+
+ (void) input1;
+
+ #if 0 /* This functionality requires ulc_casecmp. */
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2)) == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3)) == 0);
+ #endif
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3)) == 0);
+ }
+
+ #if 0 /* This functionality requires ulc_casecmp. */
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const char input[] = { 0xC7, 0xB0, 0xCC, 0xA3 };
+ static const char casefolded[] = { 0x6A, 0xCC, 0x8C, 0xCC, 0xA3 };
+ static const char casefolded_decomposed[] = { 0x6A, 0xCC, 0xA3, 0xCC, 0x8C };
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed)) != 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded)) == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed)) == 0);
+ }
+ #endif
+}
diff --git a/gnulib/tests/test-mbmemcasecmp1.sh b/gnulib/tests/test-mbmemcasecmp1.sh
new file mode 100755
index 00000000..414d958d
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecmp1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-mbmemcasecmp${EXEEXT} 1
diff --git a/gnulib/tests/test-mbmemcasecmp2.sh b/gnulib/tests/test-mbmemcasecmp2.sh
new file mode 100755
index 00000000..78062200
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecmp2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbmemcasecmp${EXEEXT} 2
diff --git a/gnulib/tests/test-mbmemcasecmp3.sh b/gnulib/tests/test-mbmemcasecmp3.sh
new file mode 100755
index 00000000..b834c0a1
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecmp3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific Turkish locale is installed.
+: ${LOCALE_TR_UTF8=tr_TR.UTF-8}
+if test $LOCALE_TR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no turkish Unicode locale is installed"
+ else
+ echo "Skipping test: no turkish Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_TR_UTF8 \
+./test-mbmemcasecmp${EXEEXT} 3
diff --git a/gnulib/tests/test-mbmemcasecoll.c b/gnulib/tests/test-mbmemcasecoll.c
new file mode 100644
index 00000000..f2ca6bae
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecoll.c
@@ -0,0 +1,66 @@
+/* Test of case-insensitive memory area comparison function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "mbmemcasecoll.h"
+
+#include <locale.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-mbmemcasecmp.h"
+
+static int
+mbmemcasecoll_hard (const char *s1, size_t s1len, const char *s2, size_t s2len)
+{
+ return mbmemcasecoll (s1, s1len, s2, s2len, true);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_ascii (mbmemcasecoll_hard);
+
+ if (argc > 1)
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ test_iso_8859_1 (mbmemcasecoll_hard, false);
+ return 0;
+
+ case '2':
+ /* Locale encoding is UTF-8, locale is not Turkish. */
+ test_utf_8 (mbmemcasecoll_hard, false);
+ return 0;
+
+ case '3':
+ /* Locale encoding is UTF-8, locale is Turkish. */
+ test_utf_8 (mbmemcasecoll_hard, true);
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-mbmemcasecoll1.sh b/gnulib/tests/test-mbmemcasecoll1.sh
new file mode 100755
index 00000000..d7a0e69d
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecoll1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-mbmemcasecoll${EXEEXT} 1
diff --git a/gnulib/tests/test-mbmemcasecoll2.sh b/gnulib/tests/test-mbmemcasecoll2.sh
new file mode 100755
index 00000000..1f7b48bd
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecoll2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbmemcasecoll${EXEEXT} 2
diff --git a/gnulib/tests/test-mbmemcasecoll3.sh b/gnulib/tests/test-mbmemcasecoll3.sh
new file mode 100755
index 00000000..95b27337
--- /dev/null
+++ b/gnulib/tests/test-mbmemcasecoll3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific Turkish locale is installed.
+: ${LOCALE_TR_UTF8=tr_TR.UTF-8}
+if test $LOCALE_TR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no turkish Unicode locale is installed"
+ else
+ echo "Skipping test: no turkish Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_TR_UTF8 \
+./test-mbmemcasecoll${EXEEXT} 3
diff --git a/gnulib/tests/test-mbrtowc.c b/gnulib/tests/test-mbrtowc.c
new file mode 100644
index 00000000..5477677c
--- /dev/null
+++ b/gnulib/tests/test-mbrtowc.c
@@ -0,0 +1,323 @@
+/* Test of conversion of multibyte character to wide character.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mbrtowc, size_t, (wchar_t *, char const *, size_t,
+ mbstate_t *));
+
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Test zero-length input. */
+ {
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, "x", 0, &state);
+ /* gnulib's implementation returns (size_t)(-2).
+ The AIX 5.1 implementation returns (size_t)(-1).
+ glibc's implementation returns 0. */
+ ASSERT (ret == (size_t)(-2) || ret == (size_t)(-1) || ret == 0);
+ ASSERT (mbsinit (&state));
+ }
+
+ /* Test NUL byte input. */
+ {
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, "", 1, &state);
+ ASSERT (ret == 0);
+ ASSERT (wc == 0);
+ ASSERT (mbsinit (&state));
+ ret = mbrtowc (NULL, "", 1, &state);
+ ASSERT (ret == 0);
+ ASSERT (mbsinit (&state));
+ }
+
+ /* Test single-byte input. */
+ {
+ int c;
+ char buf[1];
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ for (c = 0; c < 0x100; c++)
+ switch (c)
+ {
+ case '\t': case '\v': case '\f':
+ case ' ': case '!': case '"': case '#': case '%':
+ case '&': case '\'': case '(': case ')': case '*':
+ case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>':
+ case '?':
+ case 'A': case 'B': case 'C': case 'D': case 'E':
+ case 'F': case 'G': case 'H': case 'I': case 'J':
+ case 'K': case 'L': case 'M': case 'N': case 'O':
+ case 'P': case 'Q': case 'R': case 'S': case 'T':
+ case 'U': case 'V': case 'W': case 'X': case 'Y':
+ case 'Z':
+ case '[': case '\\': case ']': case '^': case '_':
+ case 'a': case 'b': case 'c': case 'd': case 'e':
+ case 'f': case 'g': case 'h': case 'i': case 'j':
+ case 'k': case 'l': case 'm': case 'n': case 'o':
+ case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y':
+ case 'z': case '{': case '|': case '}': case '~':
+ /* c is in the ISO C "basic character set". */
+ buf[0] = c;
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, buf, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == c);
+ ASSERT (mbsinit (&state));
+ ret = mbrtowc (NULL, buf, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (mbsinit (&state));
+ break;
+ }
+ }
+
+ /* Test special calling convention, passing a NULL pointer. */
+ {
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, NULL, 5, &state);
+ ASSERT (ret == 0);
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+
+ if (argc > 1)
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ {
+ char input[] = "B\374\337er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wctob (wc) == (unsigned char) '\374');
+ ASSERT (mbsinit (&state));
+ input[1] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 2, 3, &state);
+ ASSERT (ret == 1);
+ ASSERT (wctob (wc) == (unsigned char) '\337');
+ ASSERT (mbsinit (&state));
+ input[2] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 3, 2, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'e');
+ ASSERT (mbsinit (&state));
+ input[3] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 4, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'r');
+ ASSERT (mbsinit (&state));
+ }
+ return 0;
+
+ case '2':
+ /* Locale encoding is UTF-8. */
+ {
+ char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[1] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 2, 5, &state);
+ ASSERT (ret == 1);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[2] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 3, 4, &state);
+ ASSERT (ret == 2);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[3] = '\0';
+ input[4] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 5, 2, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'e');
+ ASSERT (mbsinit (&state));
+ input[5] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 6, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'r');
+ ASSERT (mbsinit (&state));
+ }
+ return 0;
+
+ case '3':
+ /* Locale encoding is EUC-JP. */
+ {
+ char input[] = "<\306\374\313\334\270\354>"; /* "<日本語>" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == '<');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 2, &state);
+ ASSERT (ret == 2);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[1] = '\0';
+ input[2] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 3, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[3] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 4, 4, &state);
+ ASSERT (ret == 1);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[4] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 5, 3, &state);
+ ASSERT (ret == 2);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[5] = '\0';
+ input[6] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 7, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == '>');
+ ASSERT (mbsinit (&state));
+ }
+ return 0;
+
+ case '4':
+ /* Locale encoding is GB18030. */
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[1] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 2, 7, &state);
+ ASSERT (ret == 1);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[2] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 3, 6, &state);
+ ASSERT (ret == 4);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[3] = '\0';
+ input[4] = '\0';
+ input[5] = '\0';
+ input[6] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 7, 2, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'e');
+ ASSERT (mbsinit (&state));
+ input[5] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 8, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'r');
+ ASSERT (mbsinit (&state));
+ }
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-mbrtowc1.sh b/gnulib/tests/test-mbrtowc1.sh
new file mode 100755
index 00000000..3becba3a
--- /dev/null
+++ b/gnulib/tests/test-mbrtowc1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-mbrtowc${EXEEXT} 1
diff --git a/gnulib/tests/test-mbrtowc2.sh b/gnulib/tests/test-mbrtowc2.sh
new file mode 100755
index 00000000..0405abaf
--- /dev/null
+++ b/gnulib/tests/test-mbrtowc2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbrtowc${EXEEXT} 2
diff --git a/gnulib/tests/test-mbrtowc3.sh b/gnulib/tests/test-mbrtowc3.sh
new file mode 100755
index 00000000..63a89a2e
--- /dev/null
+++ b/gnulib/tests/test-mbrtowc3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific EUC-JP locale is installed.
+: ${LOCALE_JA=ja_JP}
+if test $LOCALE_JA = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional japanese locale is installed"
+ else
+ echo "Skipping test: no traditional japanese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_JA \
+./test-mbrtowc${EXEEXT} 3
diff --git a/gnulib/tests/test-mbrtowc4.sh b/gnulib/tests/test-mbrtowc4.sh
new file mode 100755
index 00000000..b299a2c4
--- /dev/null
+++ b/gnulib/tests/test-mbrtowc4.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no transitional chinese locale is installed"
+ else
+ echo "Skipping test: no transitional chinese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-mbrtowc${EXEEXT} 4
diff --git a/gnulib/tests/test-mbscasecmp.c b/gnulib/tests/test-mbscasecmp.c
new file mode 100644
index 00000000..03ebd755
--- /dev/null
+++ b/gnulib/tests/test-mbscasecmp.c
@@ -0,0 +1,55 @@
+/* Test of case-insensitive string comparison function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ ASSERT (mbscasecmp ("paragraph", "Paragraph") == 0);
+
+ ASSERT (mbscasecmp ("paragrapH", "parAgRaph") == 0);
+
+ ASSERT (mbscasecmp ("paragraph", "paraLyzed") < 0);
+ ASSERT (mbscasecmp ("paraLyzed", "paragraph") > 0);
+
+ ASSERT (mbscasecmp ("para", "paragraph") < 0);
+ ASSERT (mbscasecmp ("paragraph", "para") > 0);
+
+ /* The following tests shows how mbscasecmp() is different from
+ strcasecmp(). */
+
+ ASSERT (mbscasecmp ("\303\266zg\303\274r", "\303\226ZG\303\234R") == 0); /* özgür */
+ ASSERT (mbscasecmp ("\303\226ZG\303\234R", "\303\266zg\303\274r") == 0); /* özgür */
+
+ /* This test shows how strings of different size can compare equal. */
+ ASSERT (mbscasecmp ("turkish", "TURK\304\260SH") == 0);
+ ASSERT (mbscasecmp ("TURK\304\260SH", "turkish") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbscasecmp.sh b/gnulib/tests/test-mbscasecmp.sh
new file mode 100755
index 00000000..1ec7d5e8
--- /dev/null
+++ b/gnulib/tests/test-mbscasecmp.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific Turkish locale is installed.
+: ${LOCALE_TR_UTF8=tr_TR.UTF-8}
+if test $LOCALE_TR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no turkish Unicode locale is installed"
+ else
+ echo "Skipping test: no turkish Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_TR_UTF8 \
+./test-mbscasecmp${EXEEXT}
diff --git a/gnulib/tests/test-mbscasestr1.c b/gnulib/tests/test-mbscasestr1.c
new file mode 100644
index 00000000..29cbe036
--- /dev/null
+++ b/gnulib/tests/test-mbscasestr1.c
@@ -0,0 +1,129 @@
+/* Test of case-insensitive searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* This test is executed in the C locale. */
+
+ {
+ const char input[] = "foo";
+ const char *result = mbscasestr (input, "");
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "foo";
+ const char *result = mbscasestr (input, "O");
+ ASSERT (result == input + 1);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = mbscasestr (input, "ABCDaBD");
+ ASSERT (result == input + 15);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = mbscasestr (input, "ABCDaBE");
+ ASSERT (result == NULL);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaAAAAaaaaaaa"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'A', m);
+ haystack[0] = 'B';
+ haystack[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (mbscasestr (haystack, needle) == haystack + 1);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+ needle[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (mbscasestr (haystack, needle) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 2);
+ char *needle = (char *) malloc (m + 2);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ haystack[2 * m + 1] = '\0';
+
+ memset (needle, 'a', m);
+ needle[m] = 'B';
+ needle[m + 1] = '\0';
+
+ result = mbscasestr (haystack, needle);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbscasestr2.c b/gnulib/tests/test-mbscasestr2.c
new file mode 100644
index 00000000..1a95393d
--- /dev/null
+++ b/gnulib/tests/test-mbscasestr2.c
@@ -0,0 +1,141 @@
+/* Test of searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ {
+ const char input[] = "f\303\266\303\266";
+ const char *result = mbscasestr (input, "");
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "f\303\266\303\266";
+ const char *result = mbscasestr (input, "\303\266");
+ ASSERT (result == input + 1);
+ }
+
+ {
+ const char input[] = "f\303\266\303\266";
+ const char *result = mbscasestr (input, "\266\303");
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "\303\204BC \303\204BCD\303\204B \303\204BCD\303\204BCD\303\204BDE"; /* "ÄBC ÄBCDÄB ÄBCDÄBCDÄBDE" */
+ const char *result = mbscasestr (input, "\303\244BCD\303\204BD"); /* "äBCDÄBD" */
+ ASSERT (result == input + 19);
+ }
+
+ {
+ const char input[] = "\303\204BC \303\204BCD\303\204B \303\204BCD\303\204BCD\303\204BDE"; /* "ÄBC ÄBCDÄB ÄBCDÄBCDÄBDE" */
+ const char *result = mbscasestr (input, "\303\204BCD\303\204BE"); /* "ÄBCDÄBE" */
+ ASSERT (result == NULL);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'a', m);
+ haystack[0] = '\303'; haystack[1] = '\204';
+ haystack[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (mbscasestr (haystack, needle) == haystack + 2);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207";
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+ needle[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (mbscasestr (haystack, needle) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 3);
+ char *needle = (char *) malloc (m + 3);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = '\303'; haystack[2 * m + 1] = '\247';
+ haystack[2 * m + 2] = '\0';
+
+ memset (needle, 'a', m);
+ needle[m] = '\303'; needle[m + 1] = '\207';
+ needle[m + 2] = '\0';
+
+ result = mbscasestr (haystack, needle);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbscasestr2.sh b/gnulib/tests/test-mbscasestr2.sh
new file mode 100755
index 00000000..bcb3ecd9
--- /dev/null
+++ b/gnulib/tests/test-mbscasestr2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbscasestr2${EXEEXT}
diff --git a/gnulib/tests/test-mbscasestr3.c b/gnulib/tests/test-mbscasestr3.c
new file mode 100644
index 00000000..b27f4065
--- /dev/null
+++ b/gnulib/tests/test-mbscasestr3.c
@@ -0,0 +1,82 @@
+/* Test of case-insensitive searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Tests with a character < 0x30. */
+ {
+ const char input[] = "\312\276\300\375 \312\276\300\375 \312\276\300\375"; /* "示例 示例 示例" */
+ const char *result = mbscasestr (input, " ");
+ ASSERT (result == input + 4);
+ }
+
+ {
+ const char input[] = "\312\276\300\375"; /* "示例" */
+ const char *result = mbscasestr (input, " ");
+ ASSERT (result == NULL);
+ }
+
+ /* Tests with a character >= 0x30. */
+ {
+ const char input[] = "\272\305123\324\313\320\320\241\243"; /* "号123运行。" */
+ const char *result = mbscasestr (input, "2");
+ ASSERT (result == input + 3);
+ }
+
+ /* The following tests show how mbscasestr() is different from
+ strcasestr(). */
+
+ {
+ const char input[] = "\313\320\320\320"; /* "诵行" */
+ const char *result = mbscasestr (input, "\320\320"); /* "行" */
+ ASSERT (result == input + 2);
+ }
+
+ {
+ const char input[] = "\203\062\332\066123\324\313\320\320\241\243"; /* "씋123运行。" */
+ const char *result = mbscasestr (input, "2");
+ ASSERT (result == input + 5);
+ }
+
+ {
+ const char input[] = "\312\276\300\375 \312\276\300\375 \312\276\300\375"; /* "示例 示例 示例" */
+ const char *result = mbscasestr (input, "\276\300"); /* "纠" */
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "\312\276\300\375 \312\276\300\375 \312\276\300\375"; /* "示例 示例 示例" */
+ const char *result = mbscasestr (input, "\375 "); /* invalid multibyte sequence */
+ ASSERT (result == NULL);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbscasestr3.sh b/gnulib/tests/test-mbscasestr3.sh
new file mode 100755
index 00000000..6e45a7eb
--- /dev/null
+++ b/gnulib/tests/test-mbscasestr3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no chinese GB18030 locale is installed"
+ else
+ echo "Skipping test: no chinese GB18030 locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-mbscasestr3${EXEEXT}
diff --git a/gnulib/tests/test-mbscasestr4.c b/gnulib/tests/test-mbscasestr4.c
new file mode 100644
index 00000000..ad4ca477
--- /dev/null
+++ b/gnulib/tests/test-mbscasestr4.c
@@ -0,0 +1,56 @@
+/* Test of case-insensitive searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ {
+ const char input[] = "GOLD NEEDLE BEATS TIN NEEDLE";
+ ASSERT (mbscasestr (input, "Needle") == input + 5);
+ }
+
+ /* The following tests show how mbscasestr() is different from
+ strcasestr(). */
+
+ {
+ const char input[] = "s\303\266zc\303\274k"; /* sözcük */
+ ASSERT (mbscasestr (input, "\303\266z") == input + 1);
+ ASSERT (mbscasestr (input, "\303\266c") == NULL);
+ }
+
+ /* This test shows how a string of larger size can be found in a string of
+ smaller size. */
+ {
+ const char input[] = "*Tbilisi imini*";
+ ASSERT (mbscasestr (input, "TB\304\260L\304\260S\304\260 \304\260m\304\260n\304\260") == input + 1); /* TBİLİSİ İmİnİ */
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbscasestr4.sh b/gnulib/tests/test-mbscasestr4.sh
new file mode 100755
index 00000000..6c372803
--- /dev/null
+++ b/gnulib/tests/test-mbscasestr4.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific Turkish locale is installed.
+: ${LOCALE_TR_UTF8=tr_TR.UTF-8}
+if test $LOCALE_TR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no turkish Unicode locale is installed"
+ else
+ echo "Skipping test: no turkish Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_TR_UTF8 \
+./test-mbscasestr4${EXEEXT}
diff --git a/gnulib/tests/test-mbschr.c b/gnulib/tests/test-mbschr.c
new file mode 100644
index 00000000..6dc64a4b
--- /dev/null
+++ b/gnulib/tests/test-mbschr.c
@@ -0,0 +1,68 @@
+/* Test of searching a string for a character.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Tests with a character < 0x30. */
+ {
+ const char input[] = "\312\276\300\375 \312\276\300\375 \312\276\300\375"; /* "示例 示例 示例" */
+ const char *result = mbschr (input, ' ');
+ ASSERT (result == input + 4);
+ }
+
+ {
+ const char input[] = "\312\276\300\375"; /* "示例" */
+ const char *result = mbschr (input, ' ');
+ ASSERT (result == NULL);
+ }
+
+ /* Tests with a character >= 0x30. */
+ {
+ const char input[] = "\272\305123\324\313\320\320\241\243"; /* "号123运行。" */
+ const char *result = mbschr (input, '2');
+ ASSERT (result == input + 3);
+ }
+
+ /* This test shows how mbschr() is different from strchr(). */
+ {
+ const char input[] = "\203\062\332\066123\324\313\320\320\241\243"; /* "씋123运行。" */
+ const char *result = mbschr (input, '2');
+ ASSERT (result == input + 5);
+ }
+
+ {
+ const char input[] = "\312\300\275\347\304\343\272\303\243\241"; /* "世界你好!" */
+ const char *result = mbschr (input, '!');
+ ASSERT (result == NULL);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbschr.sh b/gnulib/tests/test-mbschr.sh
new file mode 100755
index 00000000..97955780
--- /dev/null
+++ b/gnulib/tests/test-mbschr.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no chinese GB18030 locale is installed"
+ else
+ echo "Skipping test: no chinese GB18030 locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-mbschr${EXEEXT}
diff --git a/gnulib/tests/test-mbscspn.c b/gnulib/tests/test-mbscspn.c
new file mode 100644
index 00000000..f3ac6900
--- /dev/null
+++ b/gnulib/tests/test-mbscspn.c
@@ -0,0 +1,61 @@
+/* Test of searching a string for a character among a given set of characters.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ ASSERT (mbscspn ("Some text", "") == 9);
+
+ {
+ const char input[] = "A long sentence";
+ ASSERT (mbscspn (input, "aeiou") == 3);
+ ASSERT (mbscspn (input, "iI") == 15);
+ }
+
+ /* The following tests shows how mbscspn() is different from strcspn(). */
+
+ {
+ const char input[] = "B\303\266se B\303\274bchen"; /* "Böse Bübchen" */
+ ASSERT (mbscspn (input, "\303\244\303\274") == 7); /* "äü" */
+ }
+#if 0 /* This would be for a GB18030 locale. */
+ {
+ const char input[] = "B\201\060\213\062se B\250\271bchen"; /* "Böse Bübchen" */
+ ASSERT (mbscspn (input, "\201\060\212\061\250\271") == 9); /* "äü" */
+ }
+#endif
+
+ {
+ const char input[] = "B\303\266se B\303\274bchen"; /* "Böse Bübchen" */
+ ASSERT (mbscspn (input, "\303") == 14); /* invalid multibyte sequence */
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbscspn.sh b/gnulib/tests/test-mbscspn.sh
new file mode 100755
index 00000000..f39aa7a7
--- /dev/null
+++ b/gnulib/tests/test-mbscspn.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbscspn${EXEEXT}
diff --git a/gnulib/tests/test-mbsinit.c b/gnulib/tests/test-mbsinit.c
new file mode 100644
index 00000000..4ca0fc37
--- /dev/null
+++ b/gnulib/tests/test-mbsinit.c
@@ -0,0 +1,53 @@
+/* Test of test for initial conversion state.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mbsinit, int, (const mbstate_t *));
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ static mbstate_t state;
+
+ ASSERT (mbsinit (&state));
+
+ if (argc > 1)
+ {
+ static const char input[1] = "\303";
+ wchar_t wc;
+ size_t ret;
+
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (!mbsinit (&state));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbsinit.sh b/gnulib/tests/test-mbsinit.sh
new file mode 100755
index 00000000..bbda48d2
--- /dev/null
+++ b/gnulib/tests/test-mbsinit.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbsinit${EXEEXT}
diff --git a/gnulib/tests/test-mbsncasecmp.c b/gnulib/tests/test-mbsncasecmp.c
new file mode 100644
index 00000000..0c89334c
--- /dev/null
+++ b/gnulib/tests/test-mbsncasecmp.c
@@ -0,0 +1,69 @@
+/* Test of case-insensitive string comparison function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ ASSERT (mbsncasecmp ("paragraph", "Paragraph", 1000000) == 0);
+ ASSERT (mbsncasecmp ("paragraph", "Paragraph", 9) == 0);
+
+ ASSERT (mbsncasecmp ("paragrapH", "parAgRaph", 1000000) == 0);
+ ASSERT (mbsncasecmp ("paragrapH", "parAgRaph", 9) == 0);
+
+ ASSERT (mbsncasecmp ("paragraph", "paraLyzed", 10) < 0);
+ ASSERT (mbsncasecmp ("paragraph", "paraLyzed", 9) < 0);
+ ASSERT (mbsncasecmp ("paragraph", "paraLyzed", 5) < 0);
+ ASSERT (mbsncasecmp ("paragraph", "paraLyzed", 4) == 0);
+ ASSERT (mbsncasecmp ("paraLyzed", "paragraph", 10) > 0);
+ ASSERT (mbsncasecmp ("paraLyzed", "paragraph", 9) > 0);
+ ASSERT (mbsncasecmp ("paraLyzed", "paragraph", 5) > 0);
+ ASSERT (mbsncasecmp ("paraLyzed", "paragraph", 4) == 0);
+
+ ASSERT (mbsncasecmp ("para", "paragraph", 10) < 0);
+ ASSERT (mbsncasecmp ("para", "paragraph", 9) < 0);
+ ASSERT (mbsncasecmp ("para", "paragraph", 5) < 0);
+ ASSERT (mbsncasecmp ("para", "paragraph", 4) == 0);
+ ASSERT (mbsncasecmp ("paragraph", "para", 10) > 0);
+ ASSERT (mbsncasecmp ("paragraph", "para", 9) > 0);
+ ASSERT (mbsncasecmp ("paragraph", "para", 5) > 0);
+ ASSERT (mbsncasecmp ("paragraph", "para", 4) == 0);
+
+ /* The following tests shows how mbsncasecmp() is different from
+ strncasecmp(). */
+
+ ASSERT (mbsncasecmp ("\303\266zg\303\274r", "\303\226ZG\303\234R", 99) == 0); /* özgür */
+ ASSERT (mbsncasecmp ("\303\226ZG\303\234R", "\303\266zg\303\274r", 99) == 0); /* özgür */
+
+ /* This test shows how strings of different size can compare equal. */
+ ASSERT (mbsncasecmp ("turkish", "TURK\304\260SH", 7) == 0);
+ ASSERT (mbsncasecmp ("TURK\304\260SH", "turkish", 7) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbsncasecmp.sh b/gnulib/tests/test-mbsncasecmp.sh
new file mode 100755
index 00000000..fdb4ad25
--- /dev/null
+++ b/gnulib/tests/test-mbsncasecmp.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific Turkish locale is installed.
+: ${LOCALE_TR_UTF8=tr_TR.UTF-8}
+if test $LOCALE_TR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no turkish Unicode locale is installed"
+ else
+ echo "Skipping test: no turkish Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_TR_UTF8 \
+./test-mbsncasecmp${EXEEXT}
diff --git a/gnulib/tests/test-mbsnrtowcs.c b/gnulib/tests/test-mbsnrtowcs.c
new file mode 100644
index 00000000..3b97a049
--- /dev/null
+++ b/gnulib/tests/test-mbsnrtowcs.c
@@ -0,0 +1,293 @@
+/* Test of conversion of string to wide string.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mbsnrtowcs, size_t, (wchar_t *, char const **, size_t, size_t,
+ mbstate_t *));
+
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Test NUL byte input. */
+ {
+ const char *src;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ src = "";
+ ret = mbsnrtowcs (NULL, &src, 1, 0, &state);
+ ASSERT (ret == 0);
+ ASSERT (mbsinit (&state));
+
+ src = "";
+ ret = mbsnrtowcs (NULL, &src, 1, 1, &state);
+ ASSERT (ret == 0);
+ ASSERT (mbsinit (&state));
+
+ wc = (wchar_t) 0xBADFACE;
+ src = "";
+ ret = mbsnrtowcs (&wc, &src, 1, 0, &state);
+ ASSERT (ret == 0);
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+
+ wc = (wchar_t) 0xBADFACE;
+ src = "";
+ ret = mbsnrtowcs (&wc, &src, 1, 1, &state);
+ ASSERT (ret == 0);
+ ASSERT (wc == 0);
+ ASSERT (mbsinit (&state));
+ }
+
+ if (argc > 1)
+ {
+ int unlimited;
+
+ for (unlimited = 0; unlimited < 2; unlimited++)
+ {
+ #define BUFSIZE 10
+ wchar_t buf[BUFSIZE];
+ const char *src;
+ mbstate_t temp_state;
+
+ {
+ size_t i;
+ for (i = 0; i < BUFSIZE; i++)
+ buf[i] = (wchar_t) 0xBADFACE;
+ }
+
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ {
+ char input[] = "B\374\337er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wctob (wc) == (unsigned char) '\374');
+ ASSERT (mbsinit (&state));
+ input[1] = '\0';
+
+ src = input + 2;
+ temp_state = state;
+ ret = mbsnrtowcs (NULL, &src, 4, unlimited ? BUFSIZE : 1, &temp_state);
+ ASSERT (ret == 3);
+ ASSERT (src == input + 2);
+ ASSERT (mbsinit (&state));
+
+ src = input + 2;
+ ret = mbsnrtowcs (buf, &src, 4, unlimited ? BUFSIZE : 1, &state);
+ ASSERT (ret == (unlimited ? 3 : 1));
+ ASSERT (src == (unlimited ? NULL : input + 3));
+ ASSERT (wctob (buf[0]) == (unsigned char) '\337');
+ if (unlimited)
+ {
+ ASSERT (buf[1] == 'e');
+ ASSERT (buf[2] == 'r');
+ ASSERT (buf[3] == 0);
+ ASSERT (buf[4] == (wchar_t) 0xBADFACE);
+ }
+ else
+ ASSERT (buf[1] == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+ break;
+
+ case '2':
+ /* Locale encoding is UTF-8. */
+ {
+ char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[1] = '\0';
+
+ src = input + 2;
+ temp_state = state;
+ ret = mbsnrtowcs (NULL, &src, 6, unlimited ? BUFSIZE : 2, &temp_state);
+ ASSERT (ret == 4);
+ ASSERT (src == input + 2);
+ ASSERT (!mbsinit (&state));
+
+ src = input + 2;
+ ret = mbsnrtowcs (buf, &src, 6, unlimited ? BUFSIZE : 2, &state);
+ ASSERT (ret == (unlimited ? 4 : 2));
+ ASSERT (src == (unlimited ? NULL : input + 5));
+ ASSERT (wctob (buf[0]) == EOF);
+ ASSERT (wctob (buf[1]) == EOF);
+ if (unlimited)
+ {
+ ASSERT (buf[2] == 'e');
+ ASSERT (buf[3] == 'r');
+ ASSERT (buf[4] == 0);
+ ASSERT (buf[5] == (wchar_t) 0xBADFACE);
+ }
+ else
+ ASSERT (buf[2] == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+ break;
+
+ case '3':
+ /* Locale encoding is EUC-JP. */
+ {
+ char input[] = "<\306\374\313\334\270\354>"; /* "<日本語>" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == '<');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 2, &state);
+ ASSERT (ret == 2);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[1] = '\0';
+ input[2] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 3, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[3] = '\0';
+
+ src = input + 4;
+ temp_state = state;
+ ret = mbsnrtowcs (NULL, &src, 5, unlimited ? BUFSIZE : 2, &temp_state);
+ ASSERT (ret == 3);
+ ASSERT (src == input + 4);
+ ASSERT (!mbsinit (&state));
+
+ src = input + 4;
+ ret = mbsnrtowcs (buf, &src, 5, unlimited ? BUFSIZE : 2, &state);
+ ASSERT (ret == (unlimited ? 3 : 2));
+ ASSERT (src == (unlimited ? NULL : input + 7));
+ ASSERT (wctob (buf[0]) == EOF);
+ ASSERT (wctob (buf[1]) == EOF);
+ if (unlimited)
+ {
+ ASSERT (buf[2] == '>');
+ ASSERT (buf[3] == 0);
+ ASSERT (buf[4] == (wchar_t) 0xBADFACE);
+ }
+ else
+ ASSERT (buf[2] == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+ break;
+
+ case '4':
+ /* Locale encoding is GB18030. */
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[1] = '\0';
+
+ src = input + 2;
+ temp_state = state;
+ ret = mbsnrtowcs (NULL, &src, 8, unlimited ? BUFSIZE : 2, &temp_state);
+ ASSERT (ret == 4);
+ ASSERT (src == input + 2);
+ ASSERT (!mbsinit (&state));
+
+ src = input + 2;
+ ret = mbsnrtowcs (buf, &src, 8, unlimited ? BUFSIZE : 2, &state);
+ ASSERT (ret == (unlimited ? 4 : 2));
+ ASSERT (src == (unlimited ? NULL : input + 7));
+ ASSERT (wctob (buf[0]) == EOF);
+ ASSERT (wctob (buf[1]) == EOF);
+ if (unlimited)
+ {
+ ASSERT (buf[2] == 'e');
+ ASSERT (buf[3] == 'r');
+ ASSERT (buf[4] == 0);
+ ASSERT (buf[5] == (wchar_t) 0xBADFACE);
+ }
+ else
+ ASSERT (buf[2] == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+ break;
+
+ default:
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-mbsnrtowcs1.sh b/gnulib/tests/test-mbsnrtowcs1.sh
new file mode 100755
index 00000000..f0873a3b
--- /dev/null
+++ b/gnulib/tests/test-mbsnrtowcs1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-mbsnrtowcs${EXEEXT} 1
diff --git a/gnulib/tests/test-mbsnrtowcs2.sh b/gnulib/tests/test-mbsnrtowcs2.sh
new file mode 100755
index 00000000..41c9a957
--- /dev/null
+++ b/gnulib/tests/test-mbsnrtowcs2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbsnrtowcs${EXEEXT} 2
diff --git a/gnulib/tests/test-mbsnrtowcs3.sh b/gnulib/tests/test-mbsnrtowcs3.sh
new file mode 100755
index 00000000..4d9ee165
--- /dev/null
+++ b/gnulib/tests/test-mbsnrtowcs3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific EUC-JP locale is installed.
+: ${LOCALE_JA=ja_JP}
+if test $LOCALE_JA = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional japanese locale is installed"
+ else
+ echo "Skipping test: no traditional japanese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_JA \
+./test-mbsnrtowcs${EXEEXT} 3
diff --git a/gnulib/tests/test-mbsnrtowcs4.sh b/gnulib/tests/test-mbsnrtowcs4.sh
new file mode 100755
index 00000000..e43a6a34
--- /dev/null
+++ b/gnulib/tests/test-mbsnrtowcs4.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no transitional chinese locale is installed"
+ else
+ echo "Skipping test: no transitional chinese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-mbsnrtowcs${EXEEXT} 4
diff --git a/gnulib/tests/test-mbspbrk.c b/gnulib/tests/test-mbspbrk.c
new file mode 100644
index 00000000..c6adbaa6
--- /dev/null
+++ b/gnulib/tests/test-mbspbrk.c
@@ -0,0 +1,55 @@
+/* Test of searching a string for a character among a given set of characters.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ ASSERT (mbspbrk ("Some text", "") == NULL);
+
+ {
+ const char input[] = "A long sentence";
+ ASSERT (mbspbrk (input, "aeiou") == input + 3);
+ ASSERT (mbspbrk (input, "iI") == NULL);
+ }
+
+ /* The following tests shows how mbspbrk() is different from strpbrk(). */
+
+ {
+ const char input[] = "B\303\266se B\303\274bchen"; /* "Böse Bübchen" */
+ ASSERT (mbspbrk (input, "\303\244\303\274") == input + 7); /* "äü" */
+ }
+
+ {
+ const char input[] = "B\303\266se B\303\274bchen"; /* "Böse Bübchen" */
+ ASSERT (mbspbrk (input, "\303") == NULL); /* invalid multibyte sequence */
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbspbrk.sh b/gnulib/tests/test-mbspbrk.sh
new file mode 100755
index 00000000..51364890
--- /dev/null
+++ b/gnulib/tests/test-mbspbrk.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbspbrk${EXEEXT}
diff --git a/gnulib/tests/test-mbspcasecmp.c b/gnulib/tests/test-mbspcasecmp.c
new file mode 100644
index 00000000..aa8e702a
--- /dev/null
+++ b/gnulib/tests/test-mbspcasecmp.c
@@ -0,0 +1,90 @@
+/* Test of case-insensitive string comparison function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ {
+ const char string[] = "paragraph";
+ ASSERT (mbspcasecmp (string, "Paragraph") == string + 9);
+ }
+
+ {
+ const char string[] = "paragrapH";
+ ASSERT (mbspcasecmp (string, "parAgRaph") == string + 9);
+ }
+
+ {
+ const char string[] = "paragraph";
+ ASSERT (mbspcasecmp (string, "paraLyzed") == NULL);
+ }
+
+ {
+ const char string[] = "paraLyzed";
+ ASSERT (mbspcasecmp (string, "paragraph") == NULL);
+ }
+
+ {
+ const char string[] = "para";
+ ASSERT (mbspcasecmp (string, "paragraph") == NULL);
+ }
+
+ {
+ const char string[] = "paragraph";
+ ASSERT (mbspcasecmp (string, "para") == string + 4);
+ }
+
+ /* The following tests shows how mbspcasecmp() is different from
+ strncasecmp(). */
+
+ {
+ const char string[] = "\303\266zg\303\274rt\303\274k"; /* özgürtük */
+ ASSERT (mbspcasecmp (string, "\303\226ZG\303\234R") == string + 7); /* özgür */
+ }
+
+ {
+ const char string[] = "\303\226ZG\303\234Rt\303\274k"; /* özgürtük */
+ ASSERT (mbspcasecmp (string, "\303\266zg\303\274r") == string + 7); /* özgür */
+ }
+
+ /* This test shows how strings of different size can compare equal. */
+
+ {
+ const char string[] = "turkishtime";
+ ASSERT (mbspcasecmp (string, "TURK\304\260SH") == string + 7);
+ }
+
+ {
+ const char string[] = "TURK\304\260SHK\303\234LT\303\234R";
+ ASSERT (mbspcasecmp (string, "turkish") == string + 8);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbspcasecmp.sh b/gnulib/tests/test-mbspcasecmp.sh
new file mode 100755
index 00000000..d3a618d4
--- /dev/null
+++ b/gnulib/tests/test-mbspcasecmp.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific Turkish locale is installed.
+: ${LOCALE_TR_UTF8=tr_TR.UTF-8}
+if test $LOCALE_TR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no turkish Unicode locale is installed"
+ else
+ echo "Skipping test: no turkish Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_TR_UTF8 \
+./test-mbspcasecmp${EXEEXT}
diff --git a/gnulib/tests/test-mbsrchr.c b/gnulib/tests/test-mbsrchr.c
new file mode 100644
index 00000000..4efc0daa
--- /dev/null
+++ b/gnulib/tests/test-mbsrchr.c
@@ -0,0 +1,62 @@
+/* Test of searching a string for the last occurrence of a character.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Tests with a character < 0x30. */
+ {
+ const char input[] = "\312\276\300\375 \312\276\300\375 \312\276\300\375"; /* "示例 示例 示例" */
+ const char *result = mbsrchr (input, ' ');
+ ASSERT (result == input + 9);
+ }
+
+ {
+ const char input[] = "\312\276\300\375"; /* "示例" */
+ const char *result = mbsrchr (input, ' ');
+ ASSERT (result == NULL);
+ }
+
+ /* Tests with a character >= 0x30. */
+ {
+ const char input[] = "\272\305123\324\313\320\320\241\243"; /* "号123运行。" */
+ const char *result = mbsrchr (input, '2');
+ ASSERT (result == input + 3);
+ }
+
+ /* This test shows how mbschr() is different from strchr(). */
+ {
+ const char input[] = "\203\062\332\066123\324\313\203\062\332\066\320\320\241\243"; /* "씋123运씋行。" */
+ const char *result = mbsrchr (input, '2');
+ ASSERT (result == input + 5);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbsrchr.sh b/gnulib/tests/test-mbsrchr.sh
new file mode 100755
index 00000000..7bcb29b0
--- /dev/null
+++ b/gnulib/tests/test-mbsrchr.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no chinese GB18030 locale is installed"
+ else
+ echo "Skipping test: no chinese GB18030 locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-mbsrchr${EXEEXT}
diff --git a/gnulib/tests/test-mbsrtowcs.c b/gnulib/tests/test-mbsrtowcs.c
new file mode 100644
index 00000000..85d9e1a9
--- /dev/null
+++ b/gnulib/tests/test-mbsrtowcs.c
@@ -0,0 +1,293 @@
+/* Test of conversion of string to wide string.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mbsrtowcs, size_t, (wchar_t *, char const **, size_t,
+ mbstate_t *));
+
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Test NUL byte input. */
+ {
+ const char *src;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ src = "";
+ ret = mbsrtowcs (NULL, &src, 0, &state);
+ ASSERT (ret == 0);
+ ASSERT (mbsinit (&state));
+
+ src = "";
+ ret = mbsrtowcs (NULL, &src, 1, &state);
+ ASSERT (ret == 0);
+ ASSERT (mbsinit (&state));
+
+ wc = (wchar_t) 0xBADFACE;
+ src = "";
+ ret = mbsrtowcs (&wc, &src, 0, &state);
+ ASSERT (ret == 0);
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+
+ wc = (wchar_t) 0xBADFACE;
+ src = "";
+ ret = mbsrtowcs (&wc, &src, 1, &state);
+ ASSERT (ret == 0);
+ ASSERT (wc == 0);
+ ASSERT (mbsinit (&state));
+ }
+
+ if (argc > 1)
+ {
+ int unlimited;
+
+ for (unlimited = 0; unlimited < 2; unlimited++)
+ {
+ #define BUFSIZE 10
+ wchar_t buf[BUFSIZE];
+ const char *src;
+ mbstate_t temp_state;
+
+ {
+ size_t i;
+ for (i = 0; i < BUFSIZE; i++)
+ buf[i] = (wchar_t) 0xBADFACE;
+ }
+
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ {
+ char input[] = "B\374\337er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wctob (wc) == (unsigned char) '\374');
+ ASSERT (mbsinit (&state));
+ input[1] = '\0';
+
+ src = input + 2;
+ temp_state = state;
+ ret = mbsrtowcs (NULL, &src, unlimited ? BUFSIZE : 1, &temp_state);
+ ASSERT (ret == 3);
+ ASSERT (src == input + 2);
+ ASSERT (mbsinit (&state));
+
+ src = input + 2;
+ ret = mbsrtowcs (buf, &src, unlimited ? BUFSIZE : 1, &state);
+ ASSERT (ret == (unlimited ? 3 : 1));
+ ASSERT (src == (unlimited ? NULL : input + 3));
+ ASSERT (wctob (buf[0]) == (unsigned char) '\337');
+ if (unlimited)
+ {
+ ASSERT (buf[1] == 'e');
+ ASSERT (buf[2] == 'r');
+ ASSERT (buf[3] == 0);
+ ASSERT (buf[4] == (wchar_t) 0xBADFACE);
+ }
+ else
+ ASSERT (buf[1] == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+ break;
+
+ case '2':
+ /* Locale encoding is UTF-8. */
+ {
+ char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[1] = '\0';
+
+ src = input + 2;
+ temp_state = state;
+ ret = mbsrtowcs (NULL, &src, unlimited ? BUFSIZE : 2, &temp_state);
+ ASSERT (ret == 4);
+ ASSERT (src == input + 2);
+ ASSERT (!mbsinit (&state));
+
+ src = input + 2;
+ ret = mbsrtowcs (buf, &src, unlimited ? BUFSIZE : 2, &state);
+ ASSERT (ret == (unlimited ? 4 : 2));
+ ASSERT (src == (unlimited ? NULL : input + 5));
+ ASSERT (wctob (buf[0]) == EOF);
+ ASSERT (wctob (buf[1]) == EOF);
+ if (unlimited)
+ {
+ ASSERT (buf[2] == 'e');
+ ASSERT (buf[3] == 'r');
+ ASSERT (buf[4] == 0);
+ ASSERT (buf[5] == (wchar_t) 0xBADFACE);
+ }
+ else
+ ASSERT (buf[2] == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+ break;
+
+ case '3':
+ /* Locale encoding is EUC-JP. */
+ {
+ char input[] = "<\306\374\313\334\270\354>"; /* "<日本語>" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == '<');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 2, &state);
+ ASSERT (ret == 2);
+ ASSERT (wctob (wc) == EOF);
+ ASSERT (mbsinit (&state));
+ input[1] = '\0';
+ input[2] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 3, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[3] = '\0';
+
+ src = input + 4;
+ temp_state = state;
+ ret = mbsrtowcs (NULL, &src, unlimited ? BUFSIZE : 2, &temp_state);
+ ASSERT (ret == 3);
+ ASSERT (src == input + 4);
+ ASSERT (!mbsinit (&state));
+
+ src = input + 4;
+ ret = mbsrtowcs (buf, &src, unlimited ? BUFSIZE : 2, &state);
+ ASSERT (ret == (unlimited ? 3 : 2));
+ ASSERT (src == (unlimited ? NULL : input + 7));
+ ASSERT (wctob (buf[0]) == EOF);
+ ASSERT (wctob (buf[1]) == EOF);
+ if (unlimited)
+ {
+ ASSERT (buf[2] == '>');
+ ASSERT (buf[3] == 0);
+ ASSERT (buf[4] == (wchar_t) 0xBADFACE);
+ }
+ else
+ ASSERT (buf[2] == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+ break;
+
+ case '4':
+ /* Locale encoding is GB18030. */
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 'B');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input + 1, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (wchar_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[1] = '\0';
+
+ src = input + 2;
+ temp_state = state;
+ ret = mbsrtowcs (NULL, &src, unlimited ? BUFSIZE : 2, &temp_state);
+ ASSERT (ret == 4);
+ ASSERT (src == input + 2);
+ ASSERT (!mbsinit (&state));
+
+ src = input + 2;
+ ret = mbsrtowcs (buf, &src, unlimited ? BUFSIZE : 2, &state);
+ ASSERT (ret == (unlimited ? 4 : 2));
+ ASSERT (src == (unlimited ? NULL : input + 7));
+ ASSERT (wctob (buf[0]) == EOF);
+ ASSERT (wctob (buf[1]) == EOF);
+ if (unlimited)
+ {
+ ASSERT (buf[2] == 'e');
+ ASSERT (buf[3] == 'r');
+ ASSERT (buf[4] == 0);
+ ASSERT (buf[5] == (wchar_t) 0xBADFACE);
+ }
+ else
+ ASSERT (buf[2] == (wchar_t) 0xBADFACE);
+ ASSERT (mbsinit (&state));
+ }
+ break;
+
+ default:
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-mbsrtowcs1.sh b/gnulib/tests/test-mbsrtowcs1.sh
new file mode 100755
index 00000000..01916e77
--- /dev/null
+++ b/gnulib/tests/test-mbsrtowcs1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-mbsrtowcs${EXEEXT} 1
diff --git a/gnulib/tests/test-mbsrtowcs2.sh b/gnulib/tests/test-mbsrtowcs2.sh
new file mode 100755
index 00000000..f72ceb67
--- /dev/null
+++ b/gnulib/tests/test-mbsrtowcs2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbsrtowcs${EXEEXT} 2
diff --git a/gnulib/tests/test-mbsrtowcs3.sh b/gnulib/tests/test-mbsrtowcs3.sh
new file mode 100755
index 00000000..b3c01d4c
--- /dev/null
+++ b/gnulib/tests/test-mbsrtowcs3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific EUC-JP locale is installed.
+: ${LOCALE_JA=ja_JP}
+if test $LOCALE_JA = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional japanese locale is installed"
+ else
+ echo "Skipping test: no traditional japanese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_JA \
+./test-mbsrtowcs${EXEEXT} 3
diff --git a/gnulib/tests/test-mbsrtowcs4.sh b/gnulib/tests/test-mbsrtowcs4.sh
new file mode 100755
index 00000000..226d6ff4
--- /dev/null
+++ b/gnulib/tests/test-mbsrtowcs4.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no transitional chinese locale is installed"
+ else
+ echo "Skipping test: no transitional chinese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-mbsrtowcs${EXEEXT} 4
diff --git a/gnulib/tests/test-mbsspn.c b/gnulib/tests/test-mbsspn.c
new file mode 100644
index 00000000..abfd6909
--- /dev/null
+++ b/gnulib/tests/test-mbsspn.c
@@ -0,0 +1,57 @@
+/* Test of searching a string for a character outside a given set of characters.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ ASSERT (mbsspn ("Some text", "") == 0);
+
+ ASSERT (mbsspn ("A long sentence", " ") == 0);
+ ASSERT (mbsspn (" xy", "aei ou") == 2);
+ ASSERT (mbsspn ("eau", "aeiou") == 3);
+
+ /* The following tests shows how mbsspn() is different from strspn(). */
+
+ {
+ const char input[] = "\303\266\303\274"; /* "öü" */
+ ASSERT (mbsspn (input, "\303\266") == 2); /* "ö" */
+ ASSERT (mbsspn (input, "\303\244") == 0); /* "ä" */
+ ASSERT (mbsspn (input, "\303\274\303\266") == 4); /* "üö" */
+ ASSERT (mbsspn (input, "\303\244\303\274") == 0); /* "äü" */
+ ASSERT (mbsspn (input, "\303\244\303\266") == 2); /* "äö" */
+ }
+
+ {
+ const char input[] = "\303\266\303\274"; /* "öü" */
+ ASSERT (mbsspn (input, "\303") == 0); /* invalid multibyte sequence */
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbsspn.sh b/gnulib/tests/test-mbsspn.sh
new file mode 100755
index 00000000..9a1a0a9b
--- /dev/null
+++ b/gnulib/tests/test-mbsspn.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbsspn${EXEEXT}
diff --git a/gnulib/tests/test-mbsstr1.c b/gnulib/tests/test-mbsstr1.c
new file mode 100644
index 00000000..e9fb50ea
--- /dev/null
+++ b/gnulib/tests/test-mbsstr1.c
@@ -0,0 +1,128 @@
+/* Test of searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* This test is executed in the C locale. */
+
+ {
+ const char input[] = "foo";
+ const char *result = mbsstr (input, "");
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "foo";
+ const char *result = mbsstr (input, "o");
+ ASSERT (result == input + 1);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = mbsstr (input, "ABCDABD");
+ ASSERT (result == input + 15);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = mbsstr (input, "ABCDABE");
+ ASSERT (result == NULL);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'A', m);
+ haystack[0] = 'B';
+ haystack[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (mbsstr (haystack, needle) == haystack + 1);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+ needle[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (mbsstr (haystack, needle) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 2);
+ char *needle = (char *) malloc (m + 2);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ haystack[2 * m + 1] = '\0';
+
+ memset (needle, 'A', m);
+ needle[m] = 'B';
+ needle[m + 1] = '\0';
+
+ result = mbsstr (haystack, needle);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbsstr2.c b/gnulib/tests/test-mbsstr2.c
new file mode 100644
index 00000000..488b2108
--- /dev/null
+++ b/gnulib/tests/test-mbsstr2.c
@@ -0,0 +1,141 @@
+/* Test of searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ {
+ const char input[] = "f\303\266\303\266";
+ const char *result = mbsstr (input, "");
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "f\303\266\303\266";
+ const char *result = mbsstr (input, "\303\266");
+ ASSERT (result == input + 1);
+ }
+
+ {
+ const char input[] = "f\303\266\303\266";
+ const char *result = mbsstr (input, "\266\303");
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "\303\204BC \303\204BCD\303\204B \303\204BCD\303\204BCD\303\204BDE"; /* "ÄBC ÄBCDÄB ÄBCDÄBCDÄBDE" */
+ const char *result = mbsstr (input, "\303\204BCD\303\204BD"); /* "ÄBCDÄBD" */
+ ASSERT (result == input + 19);
+ }
+
+ {
+ const char input[] = "\303\204BC \303\204BCD\303\204B \303\204BCD\303\204BCD\303\204BDE"; /* "ÄBC ÄBCDÄB ÄBCDÄBCDÄBDE" */
+ const char *result = mbsstr (input, "\303\204BCD\303\204BE"); /* "ÄBCDÄBE" */
+ ASSERT (result == NULL);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'A', m);
+ haystack[0] = '\303'; haystack[1] = '\204';
+ haystack[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (mbsstr (haystack, needle) == haystack + 2);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207"
+ "A\303\207A\303\207A\303\207A\303\207A\303\207A\303\207";
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+ needle[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (mbsstr (haystack, needle) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 3);
+ char *needle = (char *) malloc (m + 3);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = '\303'; haystack[2 * m + 1] = '\207';
+ haystack[2 * m + 2] = '\0';
+
+ memset (needle, 'A', m);
+ needle[m] = '\303'; needle[m + 1] = '\207';
+ needle[m + 2] = '\0';
+
+ result = mbsstr (haystack, needle);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbsstr2.sh b/gnulib/tests/test-mbsstr2.sh
new file mode 100755
index 00000000..79d06df6
--- /dev/null
+++ b/gnulib/tests/test-mbsstr2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-mbsstr2${EXEEXT}
diff --git a/gnulib/tests/test-mbsstr3.c b/gnulib/tests/test-mbsstr3.c
new file mode 100644
index 00000000..a1479be4
--- /dev/null
+++ b/gnulib/tests/test-mbsstr3.c
@@ -0,0 +1,81 @@
+/* Test of searching in a string.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <locale.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Tests with a character < 0x30. */
+ {
+ const char input[] = "\312\276\300\375 \312\276\300\375 \312\276\300\375"; /* "示例 示例 示例" */
+ const char *result = mbsstr (input, " ");
+ ASSERT (result == input + 4);
+ }
+
+ {
+ const char input[] = "\312\276\300\375"; /* "示例" */
+ const char *result = mbsstr (input, " ");
+ ASSERT (result == NULL);
+ }
+
+ /* Tests with a character >= 0x30. */
+ {
+ const char input[] = "\272\305123\324\313\320\320\241\243"; /* "号123运行。" */
+ const char *result = mbsstr (input, "2");
+ ASSERT (result == input + 3);
+ }
+
+ /* The following tests show how mbsstr() is different from strstr(). */
+
+ {
+ const char input[] = "\313\320\320\320"; /* "诵行" */
+ const char *result = mbsstr (input, "\320\320"); /* "行" */
+ ASSERT (result == input + 2);
+ }
+
+ {
+ const char input[] = "\203\062\332\066123\324\313\320\320\241\243"; /* "씋123运行。" */
+ const char *result = mbsstr (input, "2");
+ ASSERT (result == input + 5);
+ }
+
+ {
+ const char input[] = "\312\276\300\375 \312\276\300\375 \312\276\300\375"; /* "示例 示例 示例" */
+ const char *result = mbsstr (input, "\276\300"); /* "纠" */
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "\312\276\300\375 \312\276\300\375 \312\276\300\375"; /* "示例 示例 示例" */
+ const char *result = mbsstr (input, "\375 "); /* invalid multibyte sequence */
+ ASSERT (result == NULL);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mbsstr3.sh b/gnulib/tests/test-mbsstr3.sh
new file mode 100755
index 00000000..732c01fd
--- /dev/null
+++ b/gnulib/tests/test-mbsstr3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no chinese GB18030 locale is installed"
+ else
+ echo "Skipping test: no chinese GB18030 locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-mbsstr3${EXEEXT}
diff --git a/gnulib/tests/test-md2.c b/gnulib/tests/test-md2.c
new file mode 100644
index 00000000..d0c4d4b8
--- /dev/null
+++ b/gnulib/tests/test-md2.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2005, 2010 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "md2.h"
+
+int
+main (int argc, char *argv[])
+{
+ const char *in1 = "abc";
+ const char *out1 =
+ "\xda\x85\x3b\x0d\x3f\x88\xd9\x9b\x30\x28\x3a\x69\xe6\xde\xd6\xbb";
+ const char *in2 = "abcdefghijklmnopqrstuvwxyz";
+ const char *out2 =
+ "\x4e\x8d\xdf\xf3\x65\x02\x92\xab\x5a\x41\x08\xc3\xaa\x47\x94\x0b";
+ char buf[MD2_DIGEST_SIZE];
+
+ if (memcmp (md2_buffer (in1, strlen (in1), buf), out1, MD2_DIGEST_SIZE) !=
+ 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < MD2_DIGEST_SIZE; i++)
+ printf ("%02x ", out1[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < MD2_DIGEST_SIZE; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (memcmp (md2_buffer (in2, strlen (in2), buf), out2, MD2_DIGEST_SIZE) !=
+ 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < MD2_DIGEST_SIZE; i++)
+ printf ("%02x ", out2[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < MD2_DIGEST_SIZE; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-md4.c b/gnulib/tests/test-md4.c
new file mode 100644
index 00000000..96026835
--- /dev/null
+++ b/gnulib/tests/test-md4.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "md4.h"
+
+int
+main (int argc, char *argv[])
+{
+ const char *in1 = "abc";
+ const char *out1 =
+ "\xa4\x48\x01\x7a\xaf\x21\xd8\x52\x5f\xc1\x0a\xe8\x7a\xa6\x72\x9d";
+ const char *in2 = "abcdefghijklmnopqrstuvwxyz";
+ const char *out2 =
+ "\xd7\x9e\x1c\x30\x8a\xa5\xbb\xcd\xee\xa8\xed\x63\xdf\x41\x2d\xa9";
+ char buf[MD4_DIGEST_SIZE];
+
+ if (memcmp (md4_buffer (in1, strlen (in1), buf), out1, MD4_DIGEST_SIZE) !=
+ 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < MD4_DIGEST_SIZE; i++)
+ printf ("%02x ", out1[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < MD4_DIGEST_SIZE; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (memcmp (md4_buffer (in2, strlen (in2), buf), out2, MD4_DIGEST_SIZE) !=
+ 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < MD4_DIGEST_SIZE; i++)
+ printf ("%02x ", out2[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < MD4_DIGEST_SIZE; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-md5.c b/gnulib/tests/test-md5.c
new file mode 100644
index 00000000..2392850f
--- /dev/null
+++ b/gnulib/tests/test-md5.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "md5.h"
+
+int
+main (void)
+{
+ /* Test vectors from RFC 1321. */
+
+ const char *in1 = "abc";
+ const char *out1 =
+ "\x90\x01\x50\x98\x3C\xD2\x4F\xB0\xD6\x96\x3F\x7D\x28\xE1\x7F\x72";
+ const char *in2 = "message digest";
+ const char *out2 =
+ "\xF9\x6B\x69\x7D\x7C\xB7\x93\x8D\x52\x5A\x2F\x31\xAA\xF1\x61\xD0";
+ char buf[MD5_DIGEST_SIZE];
+
+ if (memcmp (md5_buffer (in1, strlen (in1), buf), out1, MD5_DIGEST_SIZE) != 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < MD5_DIGEST_SIZE; i++)
+ printf ("%02x ", out1[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < MD5_DIGEST_SIZE; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ if (memcmp (md5_buffer (in2, strlen (in2), buf), out2, MD5_DIGEST_SIZE) != 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < MD5_DIGEST_SIZE; i++)
+ printf ("%02x ", out2[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < MD5_DIGEST_SIZE; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-memchr.c b/gnulib/tests/test-memchr.c
new file mode 100644
index 00000000..a8016140
--- /dev/null
+++ b/gnulib/tests/test-memchr.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ * Written by Eric Blake and Bruno Haible
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (memchr, void *, (void const *, int, size_t));
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+/* Calculating void * + int is not portable, so this wrapper converts
+ to char * to make the tests easier to write. */
+#define MEMCHR (char *) memchr
+
+int
+main (void)
+{
+ size_t n = 0x100000;
+ char *input = malloc (n);
+ ASSERT (input);
+
+ input[0] = 'a';
+ input[1] = 'b';
+ memset (input + 2, 'c', 1024);
+ memset (input + 1026, 'd', n - 1028);
+ input[n - 2] = 'e';
+ input[n - 1] = 'a';
+
+ /* Basic behavior tests. */
+ ASSERT (MEMCHR (input, 'a', n) == input);
+
+ ASSERT (MEMCHR (input, 'a', 0) == NULL);
+ ASSERT (MEMCHR (zerosize_ptr (), 'a', 0) == NULL);
+
+ ASSERT (MEMCHR (input, 'b', n) == input + 1);
+ ASSERT (MEMCHR (input, 'c', n) == input + 2);
+ ASSERT (MEMCHR (input, 'd', n) == input + 1026);
+
+ ASSERT (MEMCHR (input + 1, 'a', n - 1) == input + n - 1);
+ ASSERT (MEMCHR (input + 1, 'e', n - 1) == input + n - 2);
+
+ ASSERT (MEMCHR (input, 'f', n) == NULL);
+ ASSERT (MEMCHR (input, '\0', n) == NULL);
+
+ /* Check that a very long haystack is handled quickly if the byte is
+ found near the beginning. */
+ {
+ size_t repeat = 10000;
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (MEMCHR (input, 'c', n) == input + 2);
+ }
+ }
+
+ /* Alignment tests. */
+ {
+ int i, j;
+ for (i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 256; j++)
+ input[i + j] = j;
+ for (j = 0; j < 256; j++)
+ {
+ ASSERT (MEMCHR (input + i, j, 256) == input + i + j);
+ }
+ }
+ }
+
+ /* Check that memchr() does not read past the first occurrence of the
+ byte being searched. See the Austin Group's clarification
+ <http://www.opengroup.org/austin/docs/austin_454.txt>. */
+ {
+ char *page_boundary = (char *) zerosize_ptr ();
+
+ if (page_boundary != NULL)
+ {
+ for (n = 1; n <= 500; n++)
+ {
+ char *mem = page_boundary - n;
+ memset (mem, 'X', n);
+ ASSERT (MEMCHR (mem, 'U', n) == NULL);
+
+ {
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ mem[i] = 'U';
+ ASSERT (MEMCHR (mem, 'U', 4000) == mem + i);
+ mem[i] = 'X';
+ }
+ }
+ }
+ }
+ }
+
+ free (input);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-memchr2.c b/gnulib/tests/test-memchr2.c
new file mode 100644
index 00000000..bb81c0b4
--- /dev/null
+++ b/gnulib/tests/test-memchr2.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ * Written by Eric Blake
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include "memchr2.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+/* Calculating void * + int is not portable, so this wrapper converts
+ to char * to make the tests easier to write. */
+#define MEMCHR2 (char *) memchr2
+
+int
+main (void)
+{
+ size_t n = 0x100000;
+ char *input = malloc (n);
+ ASSERT (input);
+
+ input[0] = 'a';
+ input[1] = 'b';
+ memset (input + 2, 'c', 1024);
+ memset (input + 1026, 'd', n - 1028);
+ input[n - 2] = 'e';
+ input[n - 1] = 'a';
+
+ /* Basic behavior tests. */
+ ASSERT (MEMCHR2 (input, 'a', 'b', n) == input);
+ ASSERT (MEMCHR2 (input, 'b', 'a', n) == input);
+
+ ASSERT (MEMCHR2 (input, 'a', 'b', 0) == NULL);
+ ASSERT (MEMCHR2 (zerosize_ptr (), 'a', 'b', 0) == NULL);
+
+ ASSERT (MEMCHR2 (input, 'b', 'd', n) == input + 1);
+ ASSERT (MEMCHR2 (input + 2, 'b', 'd', n - 2) == input + 1026);
+
+ ASSERT (MEMCHR2 (input, 'd', 'e', n) == input + 1026);
+ ASSERT (MEMCHR2 (input, 'e', 'd', n) == input + 1026);
+
+ ASSERT (MEMCHR2 (input + 1, 'a', 'e', n - 1) == input + n - 2);
+ ASSERT (MEMCHR2 (input + 1, 'e', 'a', n - 1) == input + n - 2);
+
+ ASSERT (MEMCHR2 (input, 'f', 'g', n) == NULL);
+ ASSERT (MEMCHR2 (input, 'f', '\0', n) == NULL);
+
+ ASSERT (MEMCHR2 (input, 'a', 'a', n) == input);
+ ASSERT (MEMCHR2 (input + 1, 'a', 'a', n - 1) == input + n - 1);
+ ASSERT (MEMCHR2 (input, 'f', 'f', n) == NULL);
+
+ /* Check that a very long haystack is handled quickly if one of the
+ two bytes is found near the beginning. */
+ {
+ size_t repeat = 10000;
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (MEMCHR2 (input, 'c', 'e', n) == input + 2);
+ ASSERT (MEMCHR2 (input, 'e', 'c', n) == input + 2);
+ ASSERT (MEMCHR2 (input, 'c', '\0', n) == input + 2);
+ ASSERT (MEMCHR2 (input, '\0', 'c', n) == input + 2);
+ }
+ }
+
+ /* Alignment tests. */
+ {
+ int i, j;
+ for (i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 256; j++)
+ input[i + j] = j;
+ for (j = 0; j < 256; j++)
+ {
+ ASSERT (MEMCHR2 (input + i, j, 0xff, 256) == input + i + j);
+ ASSERT (MEMCHR2 (input + i, 0xff, j, 256) == input + i + j);
+ }
+ }
+ }
+
+ free (input);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-memcmp.c b/gnulib/tests/test-memcmp.c
new file mode 100644
index 00000000..28b8274d
--- /dev/null
+++ b/gnulib/tests/test-memcmp.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (memcmp, int, (void const *, void const *, size_t));
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+int
+main (void)
+{
+ /* Test equal / not equal distinction. */
+ ASSERT (memcmp (zerosize_ptr (), zerosize_ptr (), 0) == 0);
+ ASSERT (memcmp ("foo", "foobar", 2) == 0);
+ ASSERT (memcmp ("foo", "foobar", 3) == 0);
+ ASSERT (memcmp ("foo", "foobar", 4) != 0);
+ ASSERT (memcmp ("foo", "bar", 1) != 0);
+ ASSERT (memcmp ("foo", "bar", 3) != 0);
+
+ /* Test less / equal / greater distinction. */
+ ASSERT (memcmp ("foo", "moo", 4) < 0);
+ ASSERT (memcmp ("moo", "foo", 4) > 0);
+ ASSERT (memcmp ("oomph", "oops", 3) < 0);
+ ASSERT (memcmp ("oops", "oomph", 3) > 0);
+ ASSERT (memcmp ("foo", "foobar", 4) < 0);
+ ASSERT (memcmp ("foobar", "foo", 4) > 0);
+
+ /* Some old versions of memcmp were not 8-bit clean. */
+ ASSERT (memcmp ("\100", "\201", 1) < 0);
+ ASSERT (memcmp ("\201", "\100", 1) > 0);
+ ASSERT (memcmp ("\200", "\201", 1) < 0);
+ ASSERT (memcmp ("\201", "\200", 1) > 0);
+
+ /* The Next x86 OpenStep bug shows up only when comparing 16 bytes
+ or more and with at least one buffer not starting on a 4-byte boundary.
+ William Lewis provided this test program. */
+ {
+ char foo[21];
+ char bar[21];
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ char *a = foo + i;
+ char *b = bar + i;
+ strcpy (a, "--------01111111");
+ strcpy (b, "--------10000000");
+ ASSERT (memcmp (a, b, 16) < 0);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-memmem.c b/gnulib/tests/test-memmem.c
new file mode 100644
index 00000000..a9d3558c
--- /dev/null
+++ b/gnulib/tests/test-memmem.c
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2004, 2007-2010 Free Software Foundation, Inc.
+ * Written by Bruno Haible and Eric Blake
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (memmem, void *, (void const *, size_t, void const *, size_t));
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+static void *
+null_ptr (void)
+{
+ return NULL;
+}
+
+int
+main (int argc, char *argv[])
+{
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. All known platforms that lack alarm also lack
+ memmem, and the replacement memmem is known to not take too
+ long. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (100);
+#endif
+
+ {
+ const char input[] = "foo";
+ const char *result = memmem (input, strlen (input), "", 0);
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "foo";
+ const char *result = memmem (input, strlen (input), "o", 1);
+ ASSERT (result == input + 1);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = memmem (input, strlen (input), "ABCDABD", 7);
+ ASSERT (result == input + 15);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = memmem (input, strlen (input), "ABCDABE", 7);
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = memmem (input, strlen (input), "ABCDABCD", 8);
+ ASSERT (result == input + 11);
+ }
+
+ /* Check that length 0 does not dereference the pointer. */
+ {
+ const char *result = memmem (zerosize_ptr (), 0, "foo", 3);
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "foo";
+ const char *result = memmem (input, strlen (input), null_ptr (), 0);
+ ASSERT (result == input);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ size_t n = strlen (needle);
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'A', m);
+ haystack[0] = 'B';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (memmem (haystack, m, needle, n) == haystack + 1);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
+ size_t n = strlen (haystack);
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (memmem (haystack, n, needle, m) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 1);
+ char *needle = (char *) malloc (m + 1);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+
+ memset (needle, 'A', m);
+ needle[m] = 'B';
+
+ result = memmem (haystack, 2 * m + 1, needle, m + 1);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ /* Check that long needles not present in a haystack can be handled
+ with sublinear speed. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ size_t n = 1000;
+ char *haystack = (char *) malloc (m);
+ char *needle = (char *) malloc (n);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', m);
+ memset (needle, 'B', n);
+
+ for (; repeat > 0; repeat--)
+ {
+ result = memmem (haystack, m, needle, n);
+ ASSERT (result == NULL);
+ }
+ }
+ free (haystack);
+ free (needle);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-memrchr.c b/gnulib/tests/test-memrchr.c
new file mode 100644
index 00000000..82002443
--- /dev/null
+++ b/gnulib/tests/test-memrchr.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2008-2010 Free Software Foundation, Inc.
+ * Written by Eric Blake and Bruno Haible
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (memrchr, void *, (void const *, int, size_t));
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+/* Calculating void * + int is not portable, so this wrapper converts
+ to char * to make the tests easier to write. */
+#define MEMRCHR (char *) memrchr
+
+int
+main (void)
+{
+ size_t n = 0x100000;
+ char *input = malloc (n);
+ ASSERT (input);
+
+ input[n - 1] = 'a';
+ input[n - 2] = 'b';
+ memset (input + n - 1026, 'c', 1024);
+ memset (input + 2, 'd', n - 1028);
+ input[1] = 'e';
+ input[0] = 'a';
+
+ /* Basic behavior tests. */
+ ASSERT (MEMRCHR (input, 'a', n) == input + n - 1);
+
+ ASSERT (MEMRCHR (input, 'a', 0) == NULL);
+ ASSERT (MEMRCHR (zerosize_ptr (), 'a', 0) == NULL);
+
+ ASSERT (MEMRCHR (input, 'b', n) == input + n - 2);
+ ASSERT (MEMRCHR (input, 'c', n) == input + n - 3);
+ ASSERT (MEMRCHR (input, 'd', n) == input + n - 1027);
+
+ ASSERT (MEMRCHR (input, 'a', n - 1) == input);
+ ASSERT (MEMRCHR (input, 'e', n - 1) == input + 1);
+
+ ASSERT (MEMRCHR (input, 'f', n) == NULL);
+ ASSERT (MEMRCHR (input, '\0', n) == NULL);
+
+ /* Check that a very long haystack is handled quickly if the byte is
+ found near the end. */
+ {
+ size_t repeat = 10000;
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (MEMRCHR (input, 'c', n) == input + n - 3);
+ }
+ }
+
+ /* Alignment tests. */
+ {
+ int i, j;
+ for (i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 256; j++)
+ input[i + j] = j;
+ for (j = 0; j < 256; j++)
+ {
+ ASSERT (MEMRCHR (input + i, j, 256) == input + i + j);
+ }
+ }
+ }
+
+ free (input);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mkdir.c b/gnulib/tests/test-mkdir.c
new file mode 100644
index 00000000..47b242a4
--- /dev/null
+++ b/gnulib/tests/test-mkdir.c
@@ -0,0 +1,47 @@
+/* Tests of mkdir.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mkdir, int, (char const *, mode_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-mkdir.t"
+
+#include "test-mkdir.h"
+
+int
+main (void)
+{
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_mkdir (mkdir, true);
+}
diff --git a/gnulib/tests/test-mkdir.h b/gnulib/tests/test-mkdir.h
new file mode 100644
index 00000000..85894b26
--- /dev/null
+++ b/gnulib/tests/test-mkdir.h
@@ -0,0 +1,98 @@
+/* Test of mkdir() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* This file is designed to test both mkdir(a,b) and
+ mkdirat(AT_FDCWD,a,b). FUNC is the function to test. Assumes that
+ BASE and ASSERT are already defined, and that appropriate headers
+ are already included. If PRINT, warn before skipping tests with
+ status 77 when symlinks are unsupported. */
+
+static int
+test_mkdir (int (*func) (char const *, mode_t), bool print)
+{
+ /* Test basic error handling. */
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ errno = 0;
+ ASSERT (func (BASE "file", 0700) == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (func (BASE "file/", 0700) == -1);
+ ASSERT (errno == ENOTDIR || errno == EEXIST);
+ errno = 0;
+ ASSERT (func (BASE "file/dir", 0700) == -1);
+ ASSERT (errno == ENOTDIR || errno == ENOENT);
+ ASSERT (unlink (BASE "file") == 0);
+ errno = 0;
+ ASSERT (func ("", 0700) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "dir/sub", 0700) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "dir/.", 0700) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "dir/.//", 0700) == -1);
+ ASSERT (errno == ENOENT);
+
+ /* Test trailing slash handling. */
+ ASSERT (func (BASE "dir", 0700) == 0);
+ errno = 0;
+ ASSERT (func (BASE "dir", 0700) == -1);
+ ASSERT (errno == EEXIST);
+ ASSERT (rmdir (BASE "dir") == 0);
+ ASSERT (func (BASE "dir/", 0700) == 0);
+ errno = 0;
+ ASSERT (func (BASE "dir/", 0700) == -1);
+ ASSERT (errno == EEXIST);
+ ASSERT (rmdir (BASE "dir") == 0);
+
+ /* Test symlink behavior. POSIX requires the creation of
+ directories through a dangling symlink with trailing slash, but
+ GNU does not yet implement that, so we support either behavior
+ for now. */
+ if (symlink (BASE "dir", BASE "link"))
+ {
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ errno = 0;
+ ASSERT (func (BASE "link", 0700) == -1);
+ ASSERT (errno == EEXIST);
+ {
+ int result;
+ errno = 0;
+ result = func (BASE "link/", 0700);
+ if (!result)
+ ASSERT (rmdir (BASE "dir") == 0);
+ else
+ {
+ ASSERT (result == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (rmdir (BASE "dir") == -1);
+ ASSERT (errno == ENOENT);
+ }
+ }
+ errno = 0;
+ ASSERT (func (BASE "link/.", 0700) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (unlink (BASE "link") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mkdirat.c b/gnulib/tests/test-mkdirat.c
new file mode 100644
index 00000000..c7451968
--- /dev/null
+++ b/gnulib/tests/test-mkdirat.c
@@ -0,0 +1,85 @@
+/* Tests of mkdirat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mkdirat, int, (int, char const *, mode_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-mkdirat.t"
+
+#include "test-mkdir.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper to test mkdirat like mkdir. */
+static int
+do_mkdir (char const *name, mode_t mode)
+{
+ return mkdirat (dfd, name, mode);
+}
+
+int
+main (void)
+{
+ int result;
+
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Test basic mkdir functionality. */
+ result = test_mkdir (do_mkdir, false);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_mkdir (do_mkdir, false) == result);
+
+ /* Tests specific to mkdirat. */
+ ASSERT (mkdirat (dfd, BASE "dir1", 0700) == 0);
+ ASSERT (chdir (BASE "dir1") == 0);
+ ASSERT (close (dfd) == 0);
+ dfd = open ("..", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (mkdirat (dfd, BASE "dir2", 0700) == 0);
+ ASSERT (close (dfd) == 0);
+ errno = 0;
+ ASSERT (mkdirat (dfd, BASE "dir3", 0700) == -1);
+ ASSERT (errno == EBADF);
+ dfd = open ("/dev/null", O_RDONLY);
+ ASSERT (0 <= dfd);
+ errno = 0;
+ ASSERT (mkdirat (dfd, "dir3", 0700) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (close (dfd) == 0);
+ ASSERT (chdir ("..") == 0);
+ ASSERT (rmdir (BASE "dir1") == 0);
+ ASSERT (rmdir (BASE "dir2") == 0);
+
+ return result;
+}
diff --git a/gnulib/tests/test-mkfifo.c b/gnulib/tests/test-mkfifo.c
new file mode 100644
index 00000000..ecc9570c
--- /dev/null
+++ b/gnulib/tests/test-mkfifo.c
@@ -0,0 +1,47 @@
+/* Tests of mkfifo.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mkfifo, int, (char const *, mode_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-mkfifo.t"
+
+#include "test-mkfifo.h"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_mkfifo (mkfifo, true);
+}
diff --git a/gnulib/tests/test-mkfifo.h b/gnulib/tests/test-mkfifo.h
new file mode 100644
index 00000000..590070a7
--- /dev/null
+++ b/gnulib/tests/test-mkfifo.h
@@ -0,0 +1,74 @@
+/* Tests of mkfifo and friends.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+/* This file is designed to test mkfifo(n,m), mknod(n,m|S_IFIFO,0),
+ mkfifoat(AT_FDCWD,n,m), and mknodat(AT_FDCWD,n,m|S_IFIFO,0). FUNC
+ is the function to test. Assumes that BASE and ASSERT are already
+ defined, and that appropriate headers are already included. If
+ PRINT, warn before skipping symlink tests with status 77. */
+
+static int
+test_mkfifo (int (*func) (char const *, mode_t), bool print)
+{
+ int result = func (BASE "fifo", 0600);
+ struct stat st;
+ if (result == -1 && errno == ENOSYS)
+ {
+ if (print)
+ fputs ("skipping test: no support for named fifos\n", stderr);
+ return 77;
+ }
+ ASSERT (result == 0);
+ ASSERT (stat (BASE "fifo", &st) == 0);
+ ASSERT (S_ISFIFO (st.st_mode));
+
+ /* Sanity checks of failures. */
+ errno = 0;
+ ASSERT (func ("", S_IRUSR | S_IWUSR) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (".", 0600) == -1);
+ ASSERT (errno == EEXIST || errno == EINVAL);
+ errno = 0;
+ ASSERT (func (BASE "fifo", 0600) == -1);
+ ASSERT (errno == EEXIST);
+ ASSERT (unlink (BASE "fifo") == 0);
+ errno = 0;
+ ASSERT (func (BASE "fifo/", 0600) == -1);
+ ASSERT (errno == ENOENT || errno == ENOTDIR);
+
+ /* Test trailing slash behavior. */
+ if (symlink (BASE "fifo", BASE "link"))
+ {
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ errno = 0;
+ ASSERT (func (BASE "link", 0600) == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (func (BASE "link/", 0600) == -1);
+ ASSERT (errno == EEXIST || errno == ENOENT || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (unlink (BASE "fifo") == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (unlink (BASE "link") == 0);
+ return 0;
+}
diff --git a/gnulib/tests/test-mkfifoat.c b/gnulib/tests/test-mkfifoat.c
new file mode 100644
index 00000000..16511433
--- /dev/null
+++ b/gnulib/tests/test-mkfifoat.c
@@ -0,0 +1,124 @@
+/* Tests of mkfifoat and mknodat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mkfifoat, int, (int, char const *, mode_t));
+SIGNATURE_CHECK (mknodat, int, (int, char const *, mode_t, dev_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-mkfifoat.t"
+
+#include "test-mkfifo.h"
+
+typedef int (*test_func) (int, char const *, mode_t);
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper to test mknodat like mkfifoat. */
+static int
+test_mknodat (int fd, char const *name, mode_t mode)
+{
+ /* This is the only portable use of mknodat, per POSIX. */
+ return mknodat (fd, name, mode | S_IFIFO, 0);
+}
+
+/* Wrapper to test mkfifoat like mkfifo. */
+static int
+do_mkfifoat (char const *name, mode_t mode)
+{
+ return mkfifoat (dfd, name, mode);
+}
+
+/* Wrapper to test mknodat like mkfifo. */
+static int
+do_mknodat (char const *name, mode_t mode)
+{
+ return mknodat (dfd, name, mode | S_IFIFO, 0);
+}
+
+int
+main (void)
+{
+ int i;
+ test_func funcs[2] = { mkfifoat, test_mknodat };
+ int result;
+
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Basic tests. */
+ result = test_mkfifo (do_mkfifoat, true);
+ ASSERT (test_mkfifo (do_mknodat, false) == result);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_mkfifo (do_mkfifoat, false) == result);
+ ASSERT (test_mkfifo (do_mknodat, false) == result);
+
+ /* Test directory-relative handling of both functions. */
+ for (i = 0; i < 2; i++)
+ {
+ struct stat st;
+ test_func func = funcs[i];
+
+ /* Create fifo while cwd is '.', then stat it from '..'. */
+ ASSERT (func (AT_FDCWD, BASE "fifo", 0600) == 0);
+ errno = 0;
+ ASSERT (func (dfd, BASE "fifo", 0600) == -1);
+ ASSERT (errno == EEXIST);
+ ASSERT (chdir ("..") == 0);
+ errno = 0;
+ ASSERT (fstatat (AT_FDCWD, BASE "fifo", &st, 0) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (fstatat (dfd, BASE "fifo", &st, 0) == 0);
+ ASSERT (S_ISFIFO (st.st_mode));
+ ASSERT (unlinkat (dfd, BASE "fifo", 0) == 0);
+
+ /* Create fifo while cwd is '..', then stat it from '.'. */
+ ASSERT (func (dfd, BASE "fifo", 0600) == 0);
+ ASSERT (fchdir (dfd) == 0);
+ errno = 0;
+ ASSERT (func (AT_FDCWD, BASE "fifo", 0600) == -1);
+ ASSERT (errno == EEXIST);
+ memset (&st, 0, sizeof st);
+ ASSERT (fstatat (AT_FDCWD, BASE "fifo", &st, AT_SYMLINK_NOFOLLOW) == 0);
+ ASSERT (S_ISFIFO (st.st_mode));
+ memset (&st, 0, sizeof st);
+ ASSERT (fstatat (dfd, BASE "fifo", &st, AT_SYMLINK_NOFOLLOW) == 0);
+ ASSERT (S_ISFIFO (st.st_mode));
+ ASSERT (unlink (BASE "fifo") == 0);
+ }
+
+ ASSERT (close (dfd) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-mknod.c b/gnulib/tests/test-mknod.c
new file mode 100644
index 00000000..16f48e9d
--- /dev/null
+++ b/gnulib/tests/test-mknod.c
@@ -0,0 +1,56 @@
+/* Tests of mknod.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (mknod, int, (char const *, mode_t, dev_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-mknod.t"
+
+#include "test-mkfifo.h"
+
+/* Wrapper around mknod, to create fifos. */
+static int
+do_mknod (char const *name, mode_t mode)
+{
+ return mknod (name, mode | S_IFIFO, 0);
+}
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* We can only portably test creation of fifos. Anything else
+ requires root privileges and knowledge of device numbers. */
+ return test_mkfifo (do_mknod, true);
+}
diff --git a/gnulib/tests/test-modf.c b/gnulib/tests/test-modf.c
new file mode 100644
index 00000000..754a729c
--- /dev/null
+++ b/gnulib/tests/test-modf.c
@@ -0,0 +1,48 @@
+/* Test of modf() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (modf, double, (double, double *));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+double z;
+
+int
+main ()
+{
+ /* A particular positive value. */
+ x = 5.972406760;
+ y = modf (x, &z);
+ ASSERT (y >= 0.972406759 && y <= 0.972406761);
+ ASSERT (z == 5.0);
+
+ /* A particular negative value. */
+ x = -5.972406760;
+ y = modf (x, &z);
+ ASSERT (y >= -0.972406761 && y <= 0.972406759);
+ ASSERT (z == -5.0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-nanosleep.c b/gnulib/tests/test-nanosleep.c
new file mode 100644
index 00000000..bfa7ef01
--- /dev/null
+++ b/gnulib/tests/test-nanosleep.c
@@ -0,0 +1,84 @@
+/* Test of nanosleep() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <time.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (nanosleep, int, (struct timespec const *, struct timespec *));
+
+#include <errno.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "intprops.h"
+#include "macros.h"
+
+#if HAVE_DECL_ALARM
+static void
+handle_alarm (int sig)
+{
+ if (sig != SIGALRM)
+ _exit (1);
+}
+#endif
+
+int
+main (void)
+{
+ struct timespec ts;
+
+ ts.tv_sec = 1000;
+ ts.tv_nsec = -1;
+ errno = 0;
+ ASSERT (nanosleep (&ts, NULL) == -1);
+ ASSERT (errno == EINVAL);
+ ts.tv_nsec = 1000000000;
+ errno = 0;
+ ASSERT (nanosleep (&ts, NULL) == -1);
+ ASSERT (errno == EINVAL);
+
+ ts.tv_sec = 0;
+ ts.tv_nsec = 1;
+ ASSERT (nanosleep (&ts, &ts) == 0);
+ /* Remaining time is only defined on EINTR failure; but on success,
+ it is typically either 0 or unchanged from input. At any rate,
+ it shouldn't be randomly changed to unrelated values. */
+ ASSERT (ts.tv_sec == 0);
+ ASSERT (ts.tv_nsec == 0 || ts.tv_nsec == 1);
+ ts.tv_nsec = 0;
+ ASSERT (nanosleep (&ts, NULL) == 0);
+
+#if HAVE_DECL_ALARM
+ {
+ const time_t pentecost = 50 * 24 * 60 * 60; /* 50 days. */
+ signal (SIGALRM, handle_alarm);
+ alarm (1);
+ ts.tv_sec = pentecost;
+ ts.tv_nsec = 999999999;
+ errno = 0;
+ ASSERT (nanosleep (&ts, &ts) == -1);
+ ASSERT (errno == EINTR);
+ ASSERT (pentecost - 10 < ts.tv_sec && ts.tv_sec <= pentecost);
+ ASSERT (0 <= ts.tv_nsec && ts.tv_nsec <= 999999999);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-netdb.c b/gnulib/tests/test-netdb.c
new file mode 100644
index 00000000..5f2bcd4e
--- /dev/null
+++ b/gnulib/tests/test-netdb.c
@@ -0,0 +1,29 @@
+/* Test of <netdb.h> substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#include <config.h>
+#include <netdb.h>
+
+/* Check that the 'struct hostent' type is defined. */
+struct hostent t1;
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-netinet_in.c b/gnulib/tests/test-netinet_in.c
new file mode 100644
index 00000000..af403ed3
--- /dev/null
+++ b/gnulib/tests/test-netinet_in.c
@@ -0,0 +1,27 @@
+/* Test of <netinet/in.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <netinet/in.h>
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-nextafter.c b/gnulib/tests/test-nextafter.c
new file mode 100644
index 00000000..bc1d40f8
--- /dev/null
+++ b/gnulib/tests/test-nextafter.c
@@ -0,0 +1,53 @@
+/* Test of nextafter() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (nextafter, double, (double, double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 1.628947572;
+ /* Towards 0. */
+ y = nextafter (x, 0);
+ ASSERT (y < x);
+ ASSERT (y > 1.628947571);
+ y = nextafter (y, x + x);
+ ASSERT (y == x);
+ /* Towards infinity. */
+ y = nextafter (x, x + x);
+ ASSERT (y > x);
+ ASSERT (y < 1.628947573);
+ y = nextafter (y, 0);
+ ASSERT (y == x);
+ /* Towards itself. */
+ y = nextafter (x, x);
+ ASSERT (y == x);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-nl_langinfo.c b/gnulib/tests/test-nl_langinfo.c
new file mode 100644
index 00000000..ec89b3f7
--- /dev/null
+++ b/gnulib/tests/test-nl_langinfo.c
@@ -0,0 +1,115 @@
+/* Test of nl_langinfo replacement.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <langinfo.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (nl_langinfo, char *, (nl_item));
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-strcase.h"
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ int pass = atoi (argv[1]);
+ /* pass locale
+ 0 C
+ 1 traditional French locale
+ 2 French UTF-8 locale
+ */
+
+ setlocale (LC_ALL, "");
+
+ /* nl_langinfo items of the LC_CTYPE category */
+ ASSERT (strlen (nl_langinfo (CODESET)) > 0);
+ if (pass == 2)
+ {
+ const char *codeset = nl_langinfo (CODESET);
+ ASSERT (c_strcasecmp (codeset, "UTF-8") == 0 || c_strcasecmp (codeset, "UTF8") == 0);
+ }
+ /* nl_langinfo items of the LC_NUMERIC category */
+ ASSERT (strlen (nl_langinfo (RADIXCHAR)) > 0);
+ ASSERT (strlen (nl_langinfo (THOUSEP)) >= 0);
+ /* nl_langinfo items of the LC_TIME category */
+ ASSERT (strlen (nl_langinfo (D_T_FMT)) > 0);
+ ASSERT (strlen (nl_langinfo (D_FMT)) > 0);
+ ASSERT (strlen (nl_langinfo (T_FMT)) > 0);
+ ASSERT (strlen (nl_langinfo (T_FMT_AMPM)) >= (pass == 0 ? 1 : 0));
+ ASSERT (strlen (nl_langinfo (AM_STR)) >= (pass == 0 ? 1 : 0));
+ ASSERT (strlen (nl_langinfo (PM_STR)) >= (pass == 0 ? 1 : 0));
+ ASSERT (strlen (nl_langinfo (DAY_1)) > 0);
+ ASSERT (strlen (nl_langinfo (DAY_2)) > 0);
+ ASSERT (strlen (nl_langinfo (DAY_3)) > 0);
+ ASSERT (strlen (nl_langinfo (DAY_4)) > 0);
+ ASSERT (strlen (nl_langinfo (DAY_5)) > 0);
+ ASSERT (strlen (nl_langinfo (DAY_6)) > 0);
+ ASSERT (strlen (nl_langinfo (DAY_7)) > 0);
+ ASSERT (strlen (nl_langinfo (ABDAY_1)) > 0);
+ ASSERT (strlen (nl_langinfo (ABDAY_2)) > 0);
+ ASSERT (strlen (nl_langinfo (ABDAY_3)) > 0);
+ ASSERT (strlen (nl_langinfo (ABDAY_4)) > 0);
+ ASSERT (strlen (nl_langinfo (ABDAY_5)) > 0);
+ ASSERT (strlen (nl_langinfo (ABDAY_6)) > 0);
+ ASSERT (strlen (nl_langinfo (ABDAY_7)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_1)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_2)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_3)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_4)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_5)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_6)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_7)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_8)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_9)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_10)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_11)) > 0);
+ ASSERT (strlen (nl_langinfo (MON_12)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_1)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_2)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_3)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_4)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_5)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_6)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_7)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_8)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_9)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_10)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_11)) > 0);
+ ASSERT (strlen (nl_langinfo (ABMON_12)) > 0);
+ ASSERT (strlen (nl_langinfo (ERA)) >= 0);
+ ASSERT (strlen (nl_langinfo (ERA_D_FMT)) >= 0);
+ ASSERT (strlen (nl_langinfo (ERA_D_T_FMT)) >= 0);
+ ASSERT (strlen (nl_langinfo (ERA_T_FMT)) >= 0);
+ ASSERT (nl_langinfo (ALT_DIGITS) != NULL);
+ /* nl_langinfo items of the LC_MONETARY category */
+ {
+ const char *currency = nl_langinfo (CRNCYSTR);
+ ASSERT (strlen (currency) >= (pass > 0 ? 1 : 0));
+ }
+ /* nl_langinfo items of the LC_MESSAGES category */
+ ASSERT (strlen (nl_langinfo (YESEXPR)) > 0);
+ ASSERT (strlen (nl_langinfo (NOEXPR)) > 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-nl_langinfo.sh b/gnulib/tests/test-nl_langinfo.sh
new file mode 100755
index 00000000..3168f426
--- /dev/null
+++ b/gnulib/tests/test-nl_langinfo.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+LC_ALL=C ./test-nl_langinfo${EXEEXT} 0 || exit 1
+
+# Test whether a specific traditional locale is installed.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR != none; then
+ LC_ALL=$LOCALE_FR ./test-nl_langinfo${EXEEXT} 1 || exit 1
+fi
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 != none; then
+ LC_ALL=$LOCALE_FR_UTF8 ./test-nl_langinfo${EXEEXT} 2 || exit 1
+fi
+
+exit 0
diff --git a/gnulib/tests/test-obstack-printf.c b/gnulib/tests/test-obstack-printf.c
new file mode 100644
index 00000000..6d2aceca
--- /dev/null
+++ b/gnulib/tests/test-obstack-printf.c
@@ -0,0 +1,138 @@
+/* Test of obstack_printf() and obstack_vprintf() functions.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2008. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (obstack_printf, int, (struct obstack *, char const *, ...));
+SIGNATURE_CHECK (obstack_vprintf, int, (struct obstack *, char const *,
+ va_list));
+
+#include "obstack.h"
+#include "xalloc.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "progname.h"
+#include "macros.h"
+
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
+
+static void
+test_function (int (*my_obstack_printf) (struct obstack *, const char *, ...))
+{
+ struct obstack obs;
+ obstack_init (&obs);
+ /* In general, be careful that arguments to obstack_* don't have
+ side effects, as not all compilers evaluate macro arguments only
+ once. */
+
+ /* Grow the obstack to near its boundary, then check that short
+ output longer than the obstack free space grows the obstack. */
+ {
+ char *base = obstack_base (&obs);
+ char *new_base;
+ int result;
+ int room = obstack_room (&obs) - 4;
+
+ obstack_blank_fast (&obs, room);
+ result = my_obstack_printf (&obs, "%d %s", 123, "456");
+ ASSERT (result == 7);
+ ASSERT (result + room == obstack_object_size (&obs));
+ obstack_1grow (&obs, 0);
+ new_base = obstack_finish (&obs);
+ ASSERT (base != new_base);
+ ASSERT (strcmp (new_base + room, "123 456") == 0);
+ }
+
+ /* Check that strings shorter than the obstack free space don't
+ cause a reshuffling of the obstack. */
+ {
+ char *base = obstack_base (&obs);
+ char *new_base;
+ int result;
+ int room = obstack_room (&obs);
+
+ ASSERT (8 < room);
+ result = my_obstack_printf (&obs, "%d %s", 123, "456");
+ ASSERT (result == 7);
+ ASSERT (result == obstack_object_size (&obs));
+ new_base = obstack_base (&obs);
+ ASSERT (base == new_base);
+ ASSERT (strncmp (base, "123 456", result) == 0);
+ obstack_finish (&obs);
+ }
+
+ /* Check for generating much more output than a chunk size. */
+ {
+ char *base = obstack_base (&obs);
+ char *new_base;
+ int result;
+ int i;
+
+ ASSERT (obstack_chunk_size (&obs) < 10000);
+ result = my_obstack_printf (&obs, "%010000d", 0);
+ ASSERT (result == 10000);
+ ASSERT (result == obstack_object_size (&obs));
+ new_base = obstack_base (&obs);
+ ASSERT (base != new_base);
+ for (i = 0; i < 10000; i++)
+ ASSERT (new_base[i] == '0');
+ }
+
+ obstack_free (&obs, NULL);
+}
+
+static int
+my_obstack_printf (struct obstack *obs, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = obstack_vprintf (obs, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_obstack_vprintf ()
+{
+ test_function (my_obstack_printf);
+}
+
+static void
+test_obstack_printf ()
+{
+ test_function (obstack_printf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_obstack_vprintf ();
+ test_obstack_printf ();
+ return 0;
+}
diff --git a/gnulib/tests/test-open.c b/gnulib/tests/test-open.c
new file mode 100644
index 00000000..ae9b3aca
--- /dev/null
+++ b/gnulib/tests/test-open.c
@@ -0,0 +1,41 @@
+/* Test of opening a file descriptor.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <fcntl.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (open, int, (char const *, int, ...));
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+#define BASE "test-open.t"
+
+#include "test-open.h"
+
+int
+main (void)
+{
+ return test_open (open, true);
+}
diff --git a/gnulib/tests/test-open.h b/gnulib/tests/test-open.h
new file mode 100644
index 00000000..6341a635
--- /dev/null
+++ b/gnulib/tests/test-open.h
@@ -0,0 +1,87 @@
+/* Test of opening a file descriptor.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+/* This file is designed to test both open(n,buf[,mode]) and
+ openat(AT_FDCWD,n,buf[,mode]). FUNC is the function to test.
+ Assumes that BASE and ASSERT are already defined, and that
+ appropriate headers are already included. If PRINT, warn before
+ skipping symlink tests with status 77. */
+
+static int
+test_open (int (*func) (char const *, int, ...), bool print)
+{
+ int fd;
+ /* Remove anything from prior partial run. */
+ unlink (BASE "file");
+
+ /* Cannot create directory. */
+ errno = 0;
+ ASSERT (func ("nonexist.ent/", O_CREAT | O_RDONLY, 0600) == -1);
+ ASSERT (errno == ENOTDIR || errno == EISDIR || errno == ENOENT
+ || errno == EINVAL);
+
+ /* Create a regular file. */
+ fd = func (BASE "file", O_CREAT | O_RDONLY, 0600);
+ ASSERT (0 <= fd);
+ ASSERT (close (fd) == 0);
+
+ /* Trailing slash handling. */
+ errno = 0;
+ ASSERT (func (BASE "file/", O_RDONLY) == -1);
+ ASSERT (errno == ENOTDIR || errno == EISDIR || errno == EINVAL);
+
+ /* Directories cannot be opened for writing. */
+ errno = 0;
+ ASSERT (func (".", O_WRONLY) == -1);
+ ASSERT (errno == EISDIR || errno == EACCES);
+
+ /* /dev/null must exist, and be writable. */
+ fd = func ("/dev/null", O_RDONLY);
+ ASSERT (0 <= fd);
+ {
+ char c;
+ ASSERT (read (fd, &c, 1) == 0);
+ }
+ ASSERT (close (fd) == 0);
+ fd = func ("/dev/null", O_WRONLY);
+ ASSERT (0 <= fd);
+ ASSERT (write (fd, "c", 1) == 1);
+ ASSERT (close (fd) == 0);
+
+ /* Symlink handling, where supported. */
+ if (symlink (BASE "file", BASE "link") != 0)
+ {
+ ASSERT (unlink (BASE "file") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ errno = 0;
+ ASSERT (func (BASE "link/", O_RDONLY) == -1);
+ ASSERT (errno == ENOTDIR);
+ fd = func (BASE "link", O_RDONLY);
+ ASSERT (0 <= fd);
+ ASSERT (close (fd) == 0);
+
+ /* Cleanup. */
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (unlink (BASE "link") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-openat-safer.c b/gnulib/tests/test-openat-safer.c
new file mode 100644
index 00000000..be63489f
--- /dev/null
+++ b/gnulib/tests/test-openat-safer.c
@@ -0,0 +1,121 @@
+/* Test that openat_safer leave standard fds alone.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "fcntl--.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+/* This test intentionally closes stderr. So, we arrange to have fd 10
+ (outside the range of interesting fd's during the test) set up to
+ duplicate the original stderr. */
+
+#define BACKUP_STDERR_FILENO 10
+#define ASSERT_STREAM myerr
+#include "macros.h"
+
+static FILE *myerr;
+
+#define witness "test-openat-safer.txt"
+
+int
+main (void)
+{
+ int i;
+ int j;
+ int dfd;
+ int fd;
+ char buf[2];
+
+ /* We close fd 2 later, so save it in fd 10. */
+ if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO
+ || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL)
+ return 2;
+
+ /* Create handle for future use. */
+ dfd = openat (AT_FDCWD, ".", O_RDONLY);
+ ASSERT (STDERR_FILENO < dfd);
+
+ /* Create file for later checks. */
+ remove (witness);
+ fd = openat (dfd, witness, O_WRONLY | O_CREAT | O_EXCL, 0600);
+ ASSERT (STDERR_FILENO < fd);
+ ASSERT (write (fd, "hi", 2) == 2);
+ ASSERT (close (fd) == 0);
+
+ /* Four iterations, with progressively more standard descriptors
+ closed. */
+ for (i = -1; i <= STDERR_FILENO; i++)
+ {
+ ASSERT (fchdir (dfd) == 0);
+ if (0 <= i)
+ ASSERT (close (i) == 0);
+
+ /* Execute once in ".", once in "..". */
+ for (j = 0; j <= 1; j++)
+ {
+ if (j)
+ ASSERT (chdir ("..") == 0);
+
+ /* Check for error detection. */
+ errno = 0;
+ ASSERT (openat (AT_FDCWD, "", O_RDONLY) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (openat (dfd, "", O_RDONLY) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (openat (-1, ".", O_RDONLY) == -1);
+ ASSERT (errno == EBADF);
+
+ /* Check for trailing slash and /dev/null handling. */
+ errno = 0;
+ ASSERT (openat (dfd, "nonexist.ent/", O_CREAT | O_RDONLY,
+ S_IRUSR | S_IWUSR) == -1);
+ ASSERT (errno == ENOTDIR || errno == EISDIR || errno == ENOENT
+ || errno == EINVAL);
+ errno = 0;
+ ASSERT (openat (dfd, witness "/", O_RDONLY) == -1);
+ ASSERT (errno == ENOTDIR || errno == EISDIR || errno == EINVAL);
+ /* Using a bad directory is okay for absolute paths. */
+ fd = openat (-1, "/dev/null", O_WRONLY);
+ ASSERT (STDERR_FILENO < fd);
+ /* Using a non-directory is wrong for relative paths. */
+ errno = 0;
+ ASSERT (openat (fd, ".", O_RDONLY) == -1);
+ ASSERT (errno == EBADF || errno == ENOTDIR);
+ ASSERT (close (fd) == 0);
+
+ /* Check for our witness file. */
+ fd = openat (dfd, witness, O_RDONLY | O_NOFOLLOW);
+ ASSERT (STDERR_FILENO < fd);
+ ASSERT (read (fd, buf, 2) == 2);
+ ASSERT (buf[0] == 'h' && buf[1] == 'i');
+ ASSERT (close (fd) == 0);
+ }
+ }
+ ASSERT (fchdir (dfd) == 0);
+ ASSERT (unlink (witness) == 0);
+ ASSERT (close (dfd) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-openat.c b/gnulib/tests/test-openat.c
new file mode 100644
index 00000000..a79081eb
--- /dev/null
+++ b/gnulib/tests/test-openat.c
@@ -0,0 +1,86 @@
+/* Test that openat works.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <fcntl.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (openat, int, (int, char const *, int, ...));
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+#define BASE "test-openat.t"
+
+#include "test-open.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper around openat to test open behavior. */
+static int
+do_open (char const *name, int flags, ...)
+{
+ if (flags & O_CREAT)
+ {
+ mode_t mode = 0;
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ return openat (dfd, name, flags, mode);
+ }
+ return openat (dfd, name, flags);
+}
+
+int
+main (void)
+{
+ int result;
+
+ /* Basic checks. */
+ result = test_open (do_open, false);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_open (do_open, false) == result);
+ ASSERT (close (dfd) == 0);
+
+ /* Check that even when *-safer modules are in use, plain openat can
+ land in fd 0. Do this test last, since it is destructive to
+ stdin. */
+ ASSERT (close (STDIN_FILENO) == 0);
+ ASSERT (openat (AT_FDCWD, ".", O_RDONLY) == STDIN_FILENO);
+ {
+ dfd = open (".", O_RDONLY);
+ ASSERT (STDIN_FILENO < dfd);
+ ASSERT (chdir ("..") == 0);
+ ASSERT (close (STDIN_FILENO) == 0);
+ ASSERT (openat (dfd, ".", O_RDONLY) == STDIN_FILENO);
+ ASSERT (close (dfd) == 0);
+ }
+ return result;
+}
diff --git a/gnulib/tests/test-parse-duration.c b/gnulib/tests/test-parse-duration.c
new file mode 100644
index 00000000..1d513174
--- /dev/null
+++ b/gnulib/tests/test-parse-duration.c
@@ -0,0 +1,59 @@
+/* Test of parsing durations.
+ Copyright (C) 2008-2010 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/>. */
+
+#include <config.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "parse-duration.h"
+
+int
+main (int argc, char *argv[])
+{
+ if (--argc <= 0)
+ {
+ fprintf (stderr, "USAGE: %s <time-spec> [...]", argv[0]);
+ return 1;
+ }
+
+ do
+ {
+ char const * arg = *++argv;
+ time_t res = parse_duration (arg);
+ if (errno != 0)
+ {
+ fprintf (stderr, "could not parse time: %s\n\terr %d - %s\n", arg,
+ errno, strerror (errno));
+ return 1;
+ }
+ printf ("%u\n", (unsigned int)res);
+ } while (--argc > 0);
+
+ return 0;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "gnu"
+ * indent-tabs-mode: nil
+ * End:
+ * end of parse-duration.c */
diff --git a/gnulib/tests/test-parse-duration.sh b/gnulib/tests/test-parse-duration.sh
new file mode 100755
index 00000000..6aeb2253
--- /dev/null
+++ b/gnulib/tests/test-parse-duration.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+
+# Show all commands when run with environment variable VERBOSE=yes.
+test -z "$VERBOSE" || set -x
+prog=test-parse-duration
+
+exe=`pwd`/${prog}${EXEEXT}
+nl='
+'
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gl$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ exit 1
+ }
+}
+
+die ()
+{
+ echo "${prog} fatal error: $*" >&2
+ exit 1
+}
+
+func_tmpdir
+trap 'rm -rf "${tmp}"' EXIT
+tmpf="${tmp}/tests.txt"
+
+cat > "${tmpf}" <<- _EOF_
+ 1 Y 2 M 3 W 4 d 5 h 6 m 7 s
+ P 00010225 T 05:06:07
+ P 1Y2M3W4D T 5H6M7S
+ 1 Y 2 M 25 D 5:6:7
+ 1 Y 2 M 25 d 5h 6:7
+ 1 Y 2 M 25 d 5h 6m 7
+ P 1-2-25 T 5:6:7
+ _EOF_
+
+exec 3< "${tmpf}"
+while read line <&3
+do
+ v=`${exe} "${line}"` || { ls -l "${tmpf}"; die "Failed: ${exe} '${line}'"; }
+ test $v -eq 38898367 || die $v is not 38898367
+done
+exec 3>&-
diff --git a/gnulib/tests/test-perror.c b/gnulib/tests/test-perror.c
new file mode 100644
index 00000000..2b7640c0
--- /dev/null
+++ b/gnulib/tests/test-perror.c
@@ -0,0 +1,37 @@
+/* Test of perror() function.
+ Copyright (C) 2008, 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (perror, void, (char const *));
+
+#include <errno.h>
+
+int
+main (int argc, char **argv)
+{
+ const char *prefix = (argc > 1 ? argv[1] : NULL);
+
+ errno = EACCES; perror (prefix);
+ errno = ETIMEDOUT; perror (prefix);
+ errno = EOVERFLOW; perror (prefix);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-perror.sh b/gnulib/tests/test-perror.sh
new file mode 100755
index 00000000..f2c8fdc3
--- /dev/null
+++ b/gnulib/tests/test-perror.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+# Test NULL prefix. Result should not contain a number.
+tmpfiles="$tmpfiles t-perror.tmp"
+./test-perror${EXEEXT} 2>&1 >/dev/null | LC_ALL=C tr -d '\r' > t-perror.tmp
+if grep '[0-9]' t-perror.tmp > /dev/null; then
+ rm -fr $tmpfiles; exit 1
+fi
+
+# Test empty prefix. Result should be the same.
+tmpfiles="$tmpfiles t-perror1.tmp"
+./test-perror${EXEEXT} '' 2>&1 >/dev/null | LC_ALL=C tr -d '\r' > t-perror1.tmp
+diff t-perror.tmp t-perror1.tmp
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+# Test non-empty prefix.
+tmpfiles="$tmpfiles t-perror2.tmp t-perror3.tmp"
+./test-perror${EXEEXT} 'foo' 2>&1 >/dev/null | LC_ALL=C tr -d '\r' > t-perror3.tmp
+sed -e 's/^/foo: /' < t-perror.tmp > t-perror2.tmp
+diff t-perror2.tmp t-perror3.tmp
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+rm -fr $tmpfiles
+exit 0
diff --git a/gnulib/tests/test-pipe-filter-gi1.c b/gnulib/tests/test-pipe-filter-gi1.c
new file mode 100644
index 00000000..2305fa60
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-gi1.c
@@ -0,0 +1,114 @@
+/* Test of filtering of data through a subprocess.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "pipe-filter.h"
+
+#include "binary-io.h"
+#include "c-ctype.h"
+#include "read-file.h"
+#include "progname.h"
+#include "macros.h"
+
+
+/* Pipe a text file through 'tr a-z A-Z', which converts ASCII characters from
+ lower case to upper case. */
+
+struct locals
+{
+ const char *input;
+ size_t nread;
+ char buf[19];
+};
+
+static void *
+prepare_read (size_t *num_bytes_p, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ *num_bytes_p = sizeof (l->buf);
+ return l->buf;
+}
+
+static void
+done_read (void *data_read, size_t num_bytes_read, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ const char *p = l->input + l->nread;
+ const char *q = (const char *) data_read;
+ size_t i;
+
+ for (i = 0; i < num_bytes_read; i++, q++)
+ {
+ /* Handle conversion NL -> CRLF possibly done by the child process. */
+ if (!(O_BINARY && *q == '\r'))
+ {
+ char orig = *p;
+ char expected = c_toupper (orig);
+ ASSERT (*q == expected);
+ p++;
+ }
+ }
+ l->nread = p - l->input;
+}
+
+int
+main (int argc, char *argv[])
+{
+ const char *tr_program;
+ const char *input_filename;
+ size_t input_size;
+ char *input;
+
+ set_program_name (argv[0]);
+
+ ASSERT (argc == 3);
+
+ tr_program = argv[1];
+
+ /* Read some text from a file. */
+ input_filename = argv[2];
+ input = read_binary_file (input_filename, &input_size);
+ ASSERT (input != NULL);
+
+ /* Convert it to uppercase, line by line. */
+ {
+ const char *argv[4];
+ struct locals l;
+ struct pipe_filter_gi *f;
+ int result;
+
+ l.input = input;
+ l.nread = 0;
+
+ argv[0] = tr_program;
+ argv[1] = "a-z";
+ argv[2] = "A-Z";
+ argv[3] = NULL;
+
+ f = pipe_filter_gi_create ("tr", tr_program, argv, false, true,
+ prepare_read, done_read, &l);
+ ASSERT (f != NULL);
+ result = pipe_filter_gi_write (f, input, input_size);
+ ASSERT (result == 0);
+ result = pipe_filter_gi_close (f);
+ ASSERT (result == 0);
+ ASSERT (l.nread == input_size);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-pipe-filter-gi1.sh b/gnulib/tests/test-pipe-filter-gi1.sh
new file mode 100755
index 00000000..88404701
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-gi1.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Find a 'tr' program that supports character ranges in the POSIX syntax.
+# Solaris /usr/bin/tr does not.
+if test -f /usr/xpg6/bin/tr; then
+ TR=/usr/xpg6/bin/tr
+else
+ if test -f /usr/xpg4/bin/tr; then
+ TR=/usr/xpg4/bin/tr
+ else
+ TR=tr
+ fi
+fi
+
+# A small file.
+./test-pipe-filter-gi1${EXEEXT} ${TR} "${srcdir}/test-pipe-filter-gi1.sh" || exit 1
+# A medium-sized file.
+./test-pipe-filter-gi1${EXEEXT} ${TR} "${srcdir}/test-pipe-filter-gi1.c" || exit 1
+# A large file.
+./test-pipe-filter-gi1${EXEEXT} ${TR} "${srcdir}/test-vasnprintf-posix.c" || exit 1
diff --git a/gnulib/tests/test-pipe-filter-gi2-child.c b/gnulib/tests/test-pipe-filter-gi2-child.c
new file mode 100644
index 00000000..34937b6f
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-gi2-child.c
@@ -0,0 +1,43 @@
+/* Child program invoked by test-pipe-filter-gi2-main.
+
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Paolo Bonzini <bonzini@gnu.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ /* Repeatedly: Read two integers i and j, then output all integers in the
+ range i..j, one per line. */
+ for (;;)
+ {
+ int i, j;
+
+ if (scanf (" %d", &i) != 1)
+ break;
+ if (scanf (" %d", &j) != 1)
+ break;
+ if (j == -1)
+ exit (i);
+ while (i <= j)
+ printf ("abcdefghijklmnopqrstuvwxyz%d\n", i++);
+ }
+ exit (0);
+}
diff --git a/gnulib/tests/test-pipe-filter-gi2-main.c b/gnulib/tests/test-pipe-filter-gi2-main.c
new file mode 100644
index 00000000..e0ec1699
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-gi2-main.c
@@ -0,0 +1,140 @@
+/* Test harness for pipe-filter-gi.
+
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Paolo Bonzini <bonzini@gnu.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "pipe-filter.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+
+#include "full-write.h"
+#include "progname.h"
+#include "macros.h"
+
+/* 0.1 sec pause */
+static void
+small_nap (void)
+{
+ usleep (100000);
+}
+
+static char static_buf[5];
+
+static void *
+prepare_read (size_t *num_bytes_p, void *private_data)
+{
+ *num_bytes_p = sizeof (static_buf);
+ return static_buf;
+}
+
+/* Callback that ignores the data that has been read. */
+
+static void
+ignore_done_read (void *data_read, size_t num_bytes_read, void *private_data)
+{
+}
+
+/* Callback that outputs the data that has been read. */
+
+static void
+output_done_read (void *data_read, size_t num_bytes_read, void *private_data)
+{
+ full_write (STDOUT_FILENO, data_read, num_bytes_read);
+}
+
+static void
+pipe_filter_gi_write_string (struct pipe_filter_gi *f, const char *string)
+{
+ pipe_filter_gi_write (f, string, strlen (string));
+}
+
+int
+main (int argc, char **argv)
+{
+ struct pipe_filter_gi *f;
+ const char *path[] = { NULL, NULL };
+
+ set_program_name (argv[0]);
+
+ ASSERT (argc == 2);
+
+ /* Test writing to a nonexistent program traps sooner or later. */
+ {
+ int rc;
+
+ path[0] = "/nonexistent/blah";
+ f = pipe_filter_gi_create ("pipe-filter-test", path[0], path, true, false,
+ prepare_read, ignore_done_read, NULL);
+ small_nap ();
+ rc = pipe_filter_gi_write (f, "", 1);
+ ASSERT (rc == 127 || rc == -1);
+ rc = pipe_filter_gi_close (f);
+ ASSERT (rc == 127 || rc == -1);
+ printf ("Test 1 passed.\n");
+ fflush (stdout);
+ }
+
+ /* Test returning the exit status. */
+ {
+ path[0] = argv[1];
+ f = pipe_filter_gi_create ("pipe-filter-test", path[0], path, false, false,
+ prepare_read, ignore_done_read, NULL);
+ pipe_filter_gi_write_string (f, "1 -1");
+ ASSERT (pipe_filter_gi_close (f) == 1);
+ printf ("Test 2 passed.\n");
+ fflush (stdout);
+ }
+
+ /* Same, but test returning the status in pipe_filter_gi_write. */
+ {
+ int rc;
+
+ path[0] = argv[1];
+ f = pipe_filter_gi_create ("pipe-filter-test", path[0], path, false, false,
+ prepare_read, ignore_done_read, NULL);
+ pipe_filter_gi_write_string (f, "1 -1\n"); /* tell the child to terminate */
+ small_nap (); /* let the child terminate */
+ rc = pipe_filter_gi_write (f, " ", 1); /* write to a closed pipe */
+ ASSERT (rc == -1 && errno == EPIPE);
+ /* Closing the filter must report same error again, for consistency with
+ pipe_filter_ii_execute. The subprocess' exit status is not returned. */
+ rc = pipe_filter_gi_close (f);
+ ASSERT (rc == -1 && errno == EPIPE);
+ printf ("Test 3 passed.\n");
+ fflush (stdout);
+ }
+
+ /* Now test asynchronous I/O. */
+ {
+ path[0] = argv[1];
+ f = pipe_filter_gi_create ("pipe-filter-test", path[0], path, false, true,
+ prepare_read, output_done_read, NULL);
+ pipe_filter_gi_write_string (f, "1 50\n");
+ pipe_filter_gi_write_string (f, "51\n");
+ pipe_filter_gi_write_string (f, "100");
+ ASSERT (pipe_filter_gi_close (f) == 0);
+ printf ("Test 4 passed.\n");
+ fflush (stdout);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-pipe-filter-gi2.sh b/gnulib/tests/test-pipe-filter-gi2.sh
new file mode 100755
index 00000000..1f7e9e49
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-gi2.sh
@@ -0,0 +1,32 @@
+#! /bin/sh
+
+# pipe-filter test driver.
+#
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# Written by Paolo Bonzini <bonzini@gnu.org>, 2009.
+#
+# 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/>. */
+
+./test-pipe-filter-gi2-main${EXEEXT} ./test-pipe-filter-gi2-child${EXEEXT} | {
+ set -e
+ read a && test "$a" = "Test 1 passed."
+ read a && test "$a" = "Test 2 passed."
+ read a && test "$a" = "Test 3 passed."
+ i=1
+ while test $i -le 100; do
+ read a && test "$a" = "abcdefghijklmnopqrstuvwxyz$i"
+ i=`expr $i + 1`
+ done
+ read a && test "$a" = "Test 4 passed."
+}
diff --git a/gnulib/tests/test-pipe-filter-ii1.c b/gnulib/tests/test-pipe-filter-ii1.c
new file mode 100644
index 00000000..58cc1926
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-ii1.c
@@ -0,0 +1,136 @@
+/* Test of filtering of data through a subprocess.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "pipe-filter.h"
+
+#include "binary-io.h"
+#include "c-ctype.h"
+#include "read-file.h"
+#include "progname.h"
+#include "macros.h"
+
+
+/* Pipe a text file through 'tr a-z A-Z', which converts ASCII characters from
+ lower case to upper case. */
+
+struct locals
+{
+ const char *input;
+ size_t size;
+ size_t nwritten;
+ size_t nread;
+ char buf[19];
+};
+
+static const void *
+prepare_write (size_t *num_bytes_p, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ if (l->nwritten < l->size)
+ {
+ *num_bytes_p = l->size - l->nwritten;
+ return l->input + l->nwritten;
+ }
+ else
+ return NULL;
+}
+
+static void
+done_write (void *data_written, size_t num_bytes_written, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ l->nwritten += num_bytes_written;
+}
+
+static void *
+prepare_read (size_t *num_bytes_p, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ *num_bytes_p = sizeof (l->buf);
+ return l->buf;
+}
+
+static void
+done_read (void *data_read, size_t num_bytes_read, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ const char *p = l->input + l->nread;
+ const char *q = (const char *) data_read;
+ size_t i;
+
+ for (i = 0; i < num_bytes_read; i++, q++)
+ {
+ /* Handle conversion NL -> CRLF possibly done by the child process. */
+ if (!(O_BINARY && *q == '\r'))
+ {
+ char orig = *p;
+ char expected = c_toupper (orig);
+ ASSERT (*q == expected);
+ p++;
+ }
+ }
+ l->nread = p - l->input;
+}
+
+int
+main (int argc, char *argv[])
+{
+ const char *tr_program;
+ const char *input_filename;
+ size_t input_size;
+ char *input;
+
+ set_program_name (argv[0]);
+
+ ASSERT (argc == 3);
+
+ tr_program = argv[1];
+
+ /* Read some text from a file. */
+ input_filename = argv[2];
+ input = read_binary_file (input_filename, &input_size);
+ ASSERT (input != NULL);
+
+ /* Convert it to uppercase, line by line. */
+ {
+ const char *argv[4];
+ struct locals l;
+ int result;
+
+ l.input = input;
+ l.size = input_size;
+ l.nwritten = 0;
+ l.nread = 0;
+
+ argv[0] = tr_program;
+ argv[1] = "a-z";
+ argv[2] = "A-Z";
+ argv[3] = NULL;
+
+ result = pipe_filter_ii_execute ("tr", tr_program, argv, false, true,
+ prepare_write, done_write,
+ prepare_read, done_read,
+ &l);
+ ASSERT (result == 0);
+ ASSERT (l.nwritten == input_size);
+ ASSERT (l.nread == input_size);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-pipe-filter-ii1.sh b/gnulib/tests/test-pipe-filter-ii1.sh
new file mode 100755
index 00000000..e3ea165b
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-ii1.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Find a 'tr' program that supports character ranges in the POSIX syntax.
+# Solaris /usr/bin/tr does not.
+if test -f /usr/xpg6/bin/tr; then
+ TR=/usr/xpg6/bin/tr
+else
+ if test -f /usr/xpg4/bin/tr; then
+ TR=/usr/xpg4/bin/tr
+ else
+ TR=tr
+ fi
+fi
+
+# A small file.
+./test-pipe-filter-ii1${EXEEXT} ${TR} "${srcdir}/test-pipe-filter-ii1.sh" || exit 1
+# A medium-sized file.
+./test-pipe-filter-ii1${EXEEXT} ${TR} "${srcdir}/test-pipe-filter-ii1.c" || exit 1
+# A large file.
+./test-pipe-filter-ii1${EXEEXT} ${TR} "${srcdir}/test-vasnprintf-posix.c" || exit 1
diff --git a/gnulib/tests/test-pipe-filter-ii2-child.c b/gnulib/tests/test-pipe-filter-ii2-child.c
new file mode 100644
index 00000000..f083a06b
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-ii2-child.c
@@ -0,0 +1,43 @@
+/* Child program invoked by test-pipe-filter-ii2-main.
+
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Paolo Bonzini <bonzini@gnu.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ /* Repeatedly: Read two integers i and j, then output all integers in the
+ range i..j, one per line. */
+ for (;;)
+ {
+ int i, j;
+
+ if (scanf (" %d", &i) != 1)
+ break;
+ if (scanf (" %d", &j) != 1)
+ break;
+ if (j == -1)
+ exit (i);
+ while (i <= j)
+ printf ("abcdefghijklmnopqrstuvwxyz%d\n", i++);
+ }
+ exit (0);
+}
diff --git a/gnulib/tests/test-pipe-filter-ii2-main.c b/gnulib/tests/test-pipe-filter-ii2-main.c
new file mode 100644
index 00000000..1e964216
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-ii2-main.c
@@ -0,0 +1,152 @@
+/* Test harness for pipe-filter-ii.
+
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Written by Paolo Bonzini <bonzini@gnu.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "pipe-filter.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+
+#include "full-write.h"
+#include "progname.h"
+#include "macros.h"
+
+struct locals
+{
+ const char *input;
+ size_t size;
+ size_t nwritten;
+ size_t nread;
+ char buf[5];
+};
+
+static const void *
+prepare_write (size_t *num_bytes_p, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ if (l->nwritten < l->size)
+ {
+ *num_bytes_p = l->size - l->nwritten;
+ return l->input + l->nwritten;
+ }
+ else
+ return NULL;
+}
+
+static void
+done_write (void *data_written, size_t num_bytes_written, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ l->nwritten += num_bytes_written;
+}
+
+static void *
+prepare_read (size_t *num_bytes_p, void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ *num_bytes_p = sizeof (l->buf);
+ return l->buf;
+}
+
+/* Callback that ignores the data that has been read. */
+
+static void
+ignore_done_read (void *data_read, size_t num_bytes_read, void *private_data)
+{
+}
+
+/* Callback that outputs the data that has been read. */
+
+static void
+output_done_read (void *data_read, size_t num_bytes_read, void *private_data)
+{
+ full_write (STDOUT_FILENO, data_read, num_bytes_read);
+}
+
+int
+main (int argc, char **argv)
+{
+ const char *path[] = { NULL, NULL };
+
+ set_program_name (argv[0]);
+
+ ASSERT (argc == 2);
+
+ /* Test writing to a nonexistent program traps sooner or later. */
+ {
+ struct locals l;
+ int rc;
+
+ l.input = "";
+ l.size = 1;
+ l.nwritten = 0;
+ l.nread = 0;
+ path[0] = "/nonexistent/blah";
+ rc = pipe_filter_ii_execute ("pipe-filter-test", path[0], path, true, false,
+ prepare_write, done_write,
+ prepare_read, ignore_done_read,
+ &l);
+ ASSERT (rc == 127 || rc == -1);
+ printf ("Test 1 passed.\n");
+ fflush (stdout);
+ }
+
+ /* Test returning the exit status. */
+ {
+ struct locals l;
+ int rc;
+
+ l.input = "1 -1";
+ l.size = strlen (l.input);
+ l.nwritten = 0;
+ l.nread = 0;
+ path[0] = argv[1];
+ rc = pipe_filter_ii_execute ("pipe-filter-test", path[0], path, false, false,
+ prepare_write, done_write,
+ prepare_read, ignore_done_read,
+ &l);
+ ASSERT (rc == 1);
+ printf ("Test 2 passed.\n");
+ fflush (stdout);
+ }
+
+ /* Now test asynchronous I/O. */
+ {
+ struct locals l;
+ int rc;
+
+ l.input = "1 50\n51\n100";
+ l.size = strlen (l.input);
+ l.nwritten = 0;
+ l.nread = 0;
+ path[0] = argv[1];
+ rc = pipe_filter_ii_execute ("pipe-filter-test", path[0], path, false, true,
+ prepare_write, done_write,
+ prepare_read, output_done_read,
+ &l);
+ ASSERT (rc == 0);
+ printf ("Test 3 passed.\n");
+ fflush (stdout);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-pipe-filter-ii2.sh b/gnulib/tests/test-pipe-filter-ii2.sh
new file mode 100755
index 00000000..54660aa6
--- /dev/null
+++ b/gnulib/tests/test-pipe-filter-ii2.sh
@@ -0,0 +1,31 @@
+#! /bin/sh
+
+# pipe-filter test driver.
+#
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# Written by Paolo Bonzini <bonzini@gnu.org>, 2009.
+#
+# 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/>. */
+
+./test-pipe-filter-ii2-main${EXEEXT} ./test-pipe-filter-ii2-child${EXEEXT} | {
+ set -e
+ read a && test "$a" = "Test 1 passed."
+ read a && test "$a" = "Test 2 passed."
+ i=1
+ while test $i -le 100; do
+ read a && test "$a" = "abcdefghijklmnopqrstuvwxyz$i"
+ i=`expr $i + 1`
+ done
+ read a && test "$a" = "Test 3 passed."
+}
diff --git a/gnulib/tests/test-pipe.c b/gnulib/tests/test-pipe.c
new file mode 100644
index 00000000..2dcab58b
--- /dev/null
+++ b/gnulib/tests/test-pipe.c
@@ -0,0 +1,204 @@
+/* Test of create_pipe_bidi/wait_subprocess.
+ Copyright (C) 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include "pipe.h"
+#include "wait-process.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* Depending on arguments, this test intentionally closes stderr or
+ starts life with stderr closed. So, we arrange to have fd 10
+ (outside the range of interesting fd's during the test) set up to
+ duplicate the original stderr. */
+
+#define BACKUP_STDERR_FILENO 10
+#define ASSERT_STREAM myerr
+#include "macros.h"
+
+static FILE *myerr;
+
+/* Code executed by the child process. argv[1] = "child". */
+static int
+child_main (int argc, char *argv[])
+{
+ char buffer[2] = { 's', 't' };
+ int fd;
+ int ret;
+
+ ASSERT (argc == 3);
+
+ /* Read one byte from fd 0, and write its value plus one to fd 1.
+ fd 2 should be closed iff the argument is 1. Check that no other file
+ descriptors leaked. */
+
+ ASSERT (read (STDIN_FILENO, buffer, 2) == 1);
+
+ buffer[0]++;
+ ASSERT (write (STDOUT_FILENO, buffer, 1) == 1);
+
+ errno = 0;
+ ret = dup2 (STDERR_FILENO, STDERR_FILENO);
+ switch (atoi (argv[2]))
+ {
+ case 0:
+ /* Expect fd 2 is open. */
+ ASSERT (ret == STDERR_FILENO);
+ break;
+ case 1:
+ /* Expect fd 2 is closed. */
+ ASSERT (ret == -1);
+ ASSERT (errno == EBADF);
+ break;
+ default:
+ ASSERT (false);
+ }
+
+ for (fd = 3; fd < 7; fd++)
+ {
+ errno = 0;
+ ASSERT (close (fd) == -1);
+ ASSERT (errno == EBADF);
+ }
+
+ return 0;
+}
+
+/* Create a bi-directional pipe to a test child, and validate that the
+ child program returns the expected output. The child is the same
+ program as the parent ARGV0, but with different arguments.
+ STDERR_CLOSED is true if we have already closed fd 2. */
+static void
+test_pipe (const char *argv0, bool stderr_closed)
+{
+ int fd[2];
+ char *argv[4];
+ pid_t pid;
+ char buffer[2] = { 'a', 't' };
+
+ /* Set up child. */
+ argv[0] = (char *) argv0;
+ argv[1] = (char *) "child";
+ argv[2] = (char *) (stderr_closed ? "1" : "0");
+ argv[3] = NULL;
+ pid = create_pipe_bidi (argv0, argv0, argv, false, true, true, fd);
+ ASSERT (0 <= pid);
+ ASSERT (STDERR_FILENO < fd[0]);
+ ASSERT (STDERR_FILENO < fd[1]);
+
+ /* Push child's input. */
+ ASSERT (write (fd[1], buffer, 1) == 1);
+ ASSERT (close (fd[1]) == 0);
+
+ /* Get child's output. */
+ ASSERT (read (fd[0], buffer, 2) == 1);
+
+ /* Wait for child. */
+ ASSERT (wait_subprocess (pid, argv0, true, false, true, true, NULL) == 0);
+ ASSERT (close (fd[0]) == 0);
+
+ /* Check the result. */
+ ASSERT (buffer[0] == 'b');
+ ASSERT (buffer[1] == 't');
+}
+
+/* Code executed by the parent process. */
+static int
+parent_main (int argc, char *argv[])
+{
+ int test;
+ int fd;
+
+ ASSERT (argc == 2);
+
+ /* Selectively close various standard fds, to verify the child process is
+ not impacted by this. */
+ test = atoi (argv[1]);
+ switch (test)
+ {
+ case 0:
+ break;
+ case 1:
+ close (0);
+ break;
+ case 2:
+ close (1);
+ break;
+ case 3:
+ close (0);
+ close (1);
+ break;
+ case 4:
+ close (2);
+ break;
+ case 5:
+ close (0);
+ close (2);
+ break;
+ case 6:
+ close (1);
+ close (2);
+ break;
+ case 7:
+ close (0);
+ close (1);
+ close (2);
+ break;
+ default:
+ ASSERT (false);
+ }
+
+ /* Plug any file descriptor leaks inherited from outside world before
+ starting, so that child has a clean slate (at least for the fds that we
+ might be manipulating). */
+ for (fd = 3; fd < 7; fd++)
+ close (fd);
+
+ test_pipe (argv[0], test >= 4);
+
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ if (argc < 2)
+ {
+ fprintf (stderr, "%s: need arguments\n", argv[0]);
+ return 2;
+ }
+ if (strcmp (argv[1], "child") == 0)
+ {
+ /* fd 2 might be closed, but fd BACKUP_STDERR_FILENO is the original
+ stderr. */
+ myerr = fdopen (BACKUP_STDERR_FILENO, "w");
+ if (!myerr)
+ return 2;
+ return child_main (argc, argv);
+ }
+ /* We might close fd 2 later, so save it in fd 10. */
+ if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO
+ || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL)
+ return 2;
+ return parent_main (argc, argv);
+}
diff --git a/gnulib/tests/test-pipe.sh b/gnulib/tests/test-pipe.sh
new file mode 100755
index 00000000..323c90fb
--- /dev/null
+++ b/gnulib/tests/test-pipe.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+st=0
+for i in 0 1 2 3 4 5 6 7 ; do
+ ./test-pipe${EXEEXT} $i \
+ || { echo test-pipe.sh: iteration $i failed >&2; st=1; }
+done
+exit $st
diff --git a/gnulib/tests/test-pipe2.c b/gnulib/tests/test-pipe2.c
new file mode 100644
index 00000000..bd6df7ce
--- /dev/null
+++ b/gnulib/tests/test-pipe2.c
@@ -0,0 +1,145 @@
+/* Test of pipe2.
+ Copyright (C) 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (pipe2, int, (int[2], int));
+
+#include <fcntl.h>
+#include <stdbool.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "binary-io.h"
+#include "macros.h"
+
+/* Return true if FD is open. */
+static bool
+is_open (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32, the initial state of unassigned standard file
+ descriptors is that they are open but point to an
+ INVALID_HANDLE_VALUE, and there is no fcntl. */
+ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
+#else
+# ifndef F_GETFL
+# error Please port fcntl to your platform
+# endif
+ return 0 <= fcntl (fd, F_GETFL);
+#endif
+}
+
+/* Return true if FD is not inherited to child processes. */
+static bool
+is_cloexec (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ ASSERT (GetHandleInformation (h, &flags));
+ return (flags & HANDLE_FLAG_INHERIT) == 0;
+#else
+ int flags;
+ ASSERT ((flags = fcntl (fd, F_GETFD)) >= 0);
+ return (flags & FD_CLOEXEC) != 0;
+#endif
+}
+
+/* Return true if FD is in non-blocking mode. */
+static bool
+is_nonblocking (int fd)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* We don't use the non-blocking mode for sockets here. */
+ return 0;
+#else
+ int flags;
+ ASSERT ((flags = fcntl (fd, F_GETFL)) >= 0);
+ return (flags & O_NONBLOCK) != 0;
+#endif
+}
+
+int
+main ()
+{
+ int use_nonblocking;
+ int use_cloexec;
+
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ for (use_nonblocking = 0; use_nonblocking <= 1; use_nonblocking++)
+#else
+ use_nonblocking = 0;
+#endif
+#if defined O_CLOEXEC
+ for (use_cloexec = 0; use_cloexec <= 1; use_cloexec++)
+#else
+ use_cloexec = 0;
+#endif
+ {
+ int o_flags;
+ int fd[2];
+
+ o_flags = 0;
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ if (use_nonblocking)
+ o_flags |= O_NONBLOCK;
+#endif
+#if defined O_CLOEXEC
+ if (use_cloexec)
+ o_flags |= O_CLOEXEC;
+#endif
+
+ fd[0] = -1;
+ fd[1] = -1;
+ ASSERT (pipe2 (fd, o_flags) >= 0);
+ ASSERT (fd[0] >= 0);
+ ASSERT (fd[1] >= 0);
+ ASSERT (fd[0] != fd[1]);
+ ASSERT (is_open (fd[0]) >= 0);
+ ASSERT (is_open (fd[1]) >= 0);
+ if (use_cloexec)
+ {
+ ASSERT (is_cloexec (fd[0]));
+ ASSERT (is_cloexec (fd[1]));
+ }
+ else
+ {
+ ASSERT (!is_cloexec (fd[0]));
+ ASSERT (!is_cloexec (fd[1]));
+ }
+ if (use_nonblocking)
+ {
+ ASSERT (is_nonblocking (fd[0]));
+ ASSERT (is_nonblocking (fd[1]));
+ }
+ else
+ {
+ ASSERT (!is_nonblocking (fd[0]));
+ ASSERT (!is_nonblocking (fd[1]));
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-poll.c b/gnulib/tests/test-poll.c
new file mode 100644
index 00000000..74880900
--- /dev/null
+++ b/gnulib/tests/test-poll.c
@@ -0,0 +1,377 @@
+/* Test of poll() function.
+ Copyright (C) 2008-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paolo Bonzini. */
+
+#include <config.h>
+
+#include <poll.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (poll, int, (struct pollfd[], nfds_t, int));
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_NATIVE
+#endif
+
+#ifdef WIN32_NATIVE
+#include <io.h>
+#define pipe(x) _pipe(x, 256, O_BINARY)
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#ifndef SO_REUSEPORT
+#define SO_REUSEPORT SO_REUSEADDR
+#endif
+
+#define TEST_PORT 12345
+
+
+/* Minimal testing infrastructure. */
+
+static int failures;
+
+static void
+failed (const char *reason)
+{
+ if (++failures > 1)
+ printf (" ");
+ printf ("failed (%s)\n", reason);
+}
+
+static int
+test (void (*fn) (void), const char *msg)
+{
+ failures = 0;
+ printf ("%s... ", msg);
+ fflush (stdout);
+ fn ();
+
+ if (!failures)
+ printf ("passed\n");
+
+ return failures;
+}
+
+
+/* Funny socket code. */
+
+static int
+open_server_socket ()
+{
+ int s, x;
+ struct sockaddr_in ia;
+
+ s = socket (AF_INET, SOCK_STREAM, 0);
+
+ memset (&ia, 0, sizeof (ia));
+ ia.sin_family = AF_INET;
+ inet_pton (AF_INET, "127.0.0.1", &ia.sin_addr);
+ ia.sin_port = htons (TEST_PORT);
+ if (bind (s, (struct sockaddr *) &ia, sizeof (ia)) < 0)
+ {
+ perror ("bind");
+ exit (77);
+ }
+
+ x = 1;
+ setsockopt (s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof (x));
+
+ if (listen (s, 1) < 0)
+ {
+ perror ("listen");
+ exit (77);
+ }
+
+ return s;
+}
+
+static int
+connect_to_socket (int blocking)
+{
+ int s;
+ struct sockaddr_in ia;
+
+ s = socket (AF_INET, SOCK_STREAM, 0);
+
+ memset (&ia, 0, sizeof (ia));
+ ia.sin_family = AF_INET;
+ inet_pton (AF_INET, "127.0.0.1", &ia.sin_addr);
+ ia.sin_port = htons (TEST_PORT);
+
+ if (!blocking)
+ {
+#ifdef WIN32_NATIVE
+ unsigned long iMode = 1;
+ ioctl (s, FIONBIO, (char *) &iMode);
+
+#elif defined F_GETFL
+ int oldflags = fcntl (s, F_GETFL, NULL);
+
+ if (!(oldflags & O_NONBLOCK))
+ fcntl (s, F_SETFL, oldflags | O_NONBLOCK);
+#endif
+ }
+
+ if (connect (s, (struct sockaddr *) &ia, sizeof (ia)) < 0
+ && (blocking || errno != EINPROGRESS))
+ {
+ perror ("connect");
+ exit (77);
+ }
+
+ return s;
+}
+
+
+/* A slightly more convenient interface to poll(2). */
+
+static int
+poll1 (int fd, int ev, int time)
+{
+ struct pollfd pfd;
+ int r;
+
+ pfd.fd = fd;
+ pfd.events = ev;
+ pfd.revents = 0;
+ r = poll (&pfd, 1, time);
+ if (r < 0)
+ return r;
+
+ if (pfd.revents & ~(POLLHUP | POLLERR | POLLNVAL | ev))
+ failed ("invalid flag combination (unrequested events)");
+
+ return pfd.revents;
+}
+
+static int
+poll1_nowait (int fd, int ev)
+{
+ return poll1 (fd, ev, 0);
+}
+
+static int
+poll1_wait (int fd, int ev)
+{
+ return poll1 (fd, ev, -1);
+}
+
+
+/* Test poll(2) for TTYs. */
+
+#ifdef INTERACTIVE
+static void
+test_tty (void)
+{
+ if (poll1_nowait (0, POLLIN | POLLRDNORM) != 0)
+ failed ("can read");
+ if (poll1_nowait (0, POLLOUT) == 0)
+ failed ("cannot write");
+
+ if (poll1_wait (0, POLLIN | POLLRDNORM) == 0)
+ failed ("return with infinite timeout");
+
+ getchar ();
+ if (poll1_nowait (0, POLLIN | POLLRDNORM) != 0)
+ failed ("can read after getc");
+}
+#endif
+
+
+/* Test poll(2) for unconnected nonblocking sockets. */
+
+static void
+test_connect_first (void)
+{
+ int s = open_server_socket ();
+ struct sockaddr_in ia;
+ socklen_t addrlen;
+
+ int c1, c2;
+
+ if (poll1_nowait (s, POLLIN | POLLRDNORM | POLLRDBAND) != 0)
+ failed ("can read, socket not connected");
+
+ c1 = connect_to_socket (false);
+
+ if (poll1_wait (s, POLLIN | POLLRDNORM | POLLRDBAND) != (POLLIN | POLLRDNORM))
+ failed ("expecting POLLIN | POLLRDNORM on passive socket");
+ if (poll1_nowait (s, POLLIN | POLLRDBAND) != POLLIN)
+ failed ("expecting POLLIN on passive socket");
+ if (poll1_nowait (s, POLLRDNORM | POLLRDBAND) != POLLRDNORM)
+ failed ("expecting POLLRDNORM on passive socket");
+
+ addrlen = sizeof (ia);
+ c2 = accept (s, (struct sockaddr *) &ia, &addrlen);
+ close (s);
+ close (c1);
+ close (c2);
+}
+
+
+/* Test poll(2) for unconnected blocking sockets. */
+
+static void
+test_accept_first (void)
+{
+#ifndef WIN32_NATIVE
+ int s = open_server_socket ();
+ struct sockaddr_in ia;
+ socklen_t addrlen;
+ char buf[3];
+ int c, pid;
+
+ pid = fork ();
+ if (pid < 0)
+ return;
+
+ if (pid == 0)
+ {
+ addrlen = sizeof (ia);
+ c = accept (s, (struct sockaddr *) &ia, &addrlen);
+ close (s);
+ write (c, "foo", 3);
+ read (c, buf, 3);
+ shutdown (c, SHUT_RD);
+ close (c);
+ exit (0);
+ }
+ else
+ {
+ close (s);
+ c = connect_to_socket (true);
+ if (poll1_nowait (c, POLLOUT | POLLWRNORM | POLLRDBAND)
+ != (POLLOUT | POLLWRNORM))
+ failed ("cannot write after blocking connect");
+ write (c, "foo", 3);
+ wait (&pid);
+ if (poll1_wait (c, POLLIN) != POLLIN)
+ failed ("cannot read data left in the socket by closed process");
+ read (c, buf, 3);
+ write (c, "foo", 3);
+ if ((poll1_wait (c, POLLIN | POLLOUT) & (POLLHUP | POLLERR)) == 0)
+ failed ("expecting POLLHUP after shutdown");
+ close (c);
+ }
+#endif
+}
+
+
+/* Common code for pipes and connected sockets. */
+
+static void
+test_pair (int rd, int wd)
+{
+ char buf[3];
+ if (poll1_wait (wd, POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND)
+ != (POLLOUT | POLLWRNORM))
+ failed ("expecting POLLOUT | POLLWRNORM before writing");
+ if (poll1_nowait (wd, POLLIN | POLLRDNORM | POLLOUT | POLLRDBAND) != POLLOUT)
+ failed ("expecting POLLOUT before writing");
+ if (poll1_nowait (wd, POLLIN | POLLRDNORM | POLLWRNORM | POLLRDBAND)
+ != POLLWRNORM)
+ failed ("expecting POLLWRNORM before writing");
+
+ write (wd, "foo", 3);
+ if (poll1_wait (rd, POLLIN | POLLRDNORM) != (POLLIN | POLLRDNORM))
+ failed ("expecting POLLIN | POLLRDNORM after writing");
+ if (poll1_nowait (rd, POLLIN) != POLLIN)
+ failed ("expecting POLLIN after writing");
+ if (poll1_nowait (rd, POLLRDNORM) != POLLRDNORM)
+ failed ("expecting POLLRDNORM after writing");
+
+ read (rd, buf, 3);
+}
+
+
+/* Test poll(2) on connected sockets. */
+
+static void
+test_socket_pair (void)
+{
+ struct sockaddr_in ia;
+
+ socklen_t addrlen = sizeof (ia);
+ int s = open_server_socket ();
+ int c1 = connect_to_socket (false);
+ int c2 = accept (s, (struct sockaddr *) &ia, &addrlen);
+
+ close (s);
+
+ test_pair (c1, c2);
+ close (c1);
+ write (c2, "foo", 3);
+ if ((poll1_nowait (c2, POLLIN | POLLOUT) & (POLLHUP | POLLERR)) == 0)
+ failed ("expecting POLLHUP after shutdown");
+
+ close (c2);
+}
+
+
+/* Test poll(2) on pipes. */
+
+static void
+test_pipe (void)
+{
+ int fd[2];
+
+ pipe (fd);
+ test_pair (fd[0], fd[1]);
+ close (fd[0]);
+ if ((poll1_wait (fd[1], POLLIN | POLLOUT) & (POLLHUP | POLLERR)) == 0)
+ failed ("expecting POLLHUP after shutdown");
+
+ close (fd[1]);
+}
+
+
+/* Do them all. */
+
+int
+main ()
+{
+ int result;
+
+#ifdef INTERACTIVE
+ printf ("Please press Enter\n");
+ test (test_tty, "TTY");
+#endif
+
+ result = test (test_connect_first, "Unconnected socket test");
+ result += test (test_socket_pair, "Connected sockets test");
+ result += test (test_accept_first, "General socket test with fork");
+ result += test (test_pipe, "Pipe test");
+
+ exit (result);
+}
diff --git a/gnulib/tests/test-popen-safer.c b/gnulib/tests/test-popen-safer.c
new file mode 100644
index 00000000..2293149c
--- /dev/null
+++ b/gnulib/tests/test-popen-safer.c
@@ -0,0 +1,76 @@
+/* Test of opening a subcommand stream.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+/* Specification. */
+#include "stdio--.h"
+
+/* Helpers. */
+#include <sys/wait.h>
+#include <unistd.h>
+
+/* This test intentionally closes stderr. So, we arrange to have fd 10
+ (outside the range of interesting fd's during the test) set up to
+ duplicate the original stderr. */
+
+#define BACKUP_STDERR_FILENO 10
+#define ASSERT_STREAM myerr
+#include "macros.h"
+
+static FILE *myerr;
+
+int
+main (int argc, char **argv)
+{
+ FILE *fp;
+ int status;
+
+ /* We close fd 2 later, so save it in fd 10. */
+ if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO
+ || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL)
+ return 2;
+
+ ASSERT (fp = popen ("exit 0", "r"));
+ ASSERT (STDERR_FILENO < fileno (fp));
+ status = pclose (fp);
+ ASSERT (WIFEXITED (status));
+ ASSERT (!WEXITSTATUS (status));
+
+ ASSERT (fclose (stdin) == 0);
+ ASSERT (fp = popen ("exit 0", "r"));
+ ASSERT (STDERR_FILENO < fileno (fp));
+ status = pclose (fp);
+ ASSERT (WIFEXITED (status));
+ ASSERT (!WEXITSTATUS (status));
+
+ ASSERT (fclose (stdout) == 0);
+ ASSERT (fp = popen ("exit 0", "r"));
+ ASSERT (STDERR_FILENO < fileno (fp));
+ status = pclose (fp);
+ ASSERT (WIFEXITED (status));
+ ASSERT (!WEXITSTATUS (status));
+
+ ASSERT (fclose (stderr) == 0);
+ ASSERT (fp = popen ("exit 0", "r"));
+ ASSERT (STDERR_FILENO < fileno (fp));
+ status = pclose (fp);
+ ASSERT (WIFEXITED (status));
+ ASSERT (!WEXITSTATUS (status));
+ return 0;
+}
diff --git a/gnulib/tests/test-popen-safer2.c b/gnulib/tests/test-popen-safer2.c
new file mode 100644
index 00000000..1fea1946
--- /dev/null
+++ b/gnulib/tests/test-popen-safer2.c
@@ -0,0 +1,24 @@
+/* Test of opening a subcommand stream.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+/* Specification. */
+#include "stdio--.h"
+
+#include "test-popen.h"
diff --git a/gnulib/tests/test-popen.c b/gnulib/tests/test-popen.c
new file mode 100644
index 00000000..c78c4b2c
--- /dev/null
+++ b/gnulib/tests/test-popen.c
@@ -0,0 +1,28 @@
+/* Test of opening a subcommand stream.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (popen, FILE *, (char const *, char const *));
+SIGNATURE_CHECK (pclose, int, (FILE *));
+
+#include "test-popen.h"
diff --git a/gnulib/tests/test-popen.h b/gnulib/tests/test-popen.h
new file mode 100644
index 00000000..f3df9f94
--- /dev/null
+++ b/gnulib/tests/test-popen.h
@@ -0,0 +1,93 @@
+/* Test of opening a subcommand stream.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+/* Include <config.h> and a form of <stdio.h> first. */
+
+/* Helpers. */
+#include <stdlib.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main (int argc, char **argv)
+{
+ size_t len;
+ char *cmd;
+ int i;
+
+ /* Children - use the pipe. */
+ if (argc > 1)
+ {
+ if (*argv[1] == 'r') /* Parent is reading, so we write. */
+ ASSERT (putchar ('c') == 'c');
+ else /* Parent is writing, so we read. */
+ ASSERT (getchar () == 'p');
+ /* Test that parent can read non-zero status. */
+ return 42;
+ }
+
+ /* Parent - create read and write child, once under normal
+ circumstances and once with stdin and stdout closed. */
+ len = strlen (argv[0]);
+ cmd = malloc (len + 3); /* Adding " r" and NUL. */
+ ASSERT (cmd);
+ /* We count on argv[0] not containing any shell metacharacters. */
+ strcpy (cmd, argv[0]);
+ cmd[len] = ' ';
+ cmd[len + 2] = '\0';
+ for (i = 0; i < 2; i++)
+ {
+ FILE *child;
+ int status;
+
+ if (i)
+ {
+ ASSERT (fclose (stdin) == 0);
+ ASSERT (fclose (stdout) == 0);
+ }
+
+ cmd[len + 1] = 'r';
+ ASSERT (child = popen (cmd, "r"));
+ ASSERT (fgetc (child) == 'c');
+ status = pclose (child);
+ ASSERT (WIFEXITED (status));
+ ASSERT (WEXITSTATUS (status) == 42);
+ if (i)
+ {
+ ASSERT (dup2 (STDIN_FILENO, STDIN_FILENO) == -1);
+ ASSERT (dup2 (STDOUT_FILENO, STDOUT_FILENO) == -1);
+ }
+
+ cmd[len + 1] = 'w';
+ ASSERT (child = popen (cmd, "w"));
+ ASSERT (fputc ('p', child) == 'p');
+ status = pclose (child);
+ ASSERT (WIFEXITED (status));
+ ASSERT (WEXITSTATUS (status) == 42);
+ if (i)
+ {
+ ASSERT (dup2 (STDIN_FILENO, STDIN_FILENO) == -1);
+ ASSERT (dup2 (STDOUT_FILENO, STDOUT_FILENO) == -1);
+ }
+ }
+ free (cmd);
+ return 0;
+}
diff --git a/gnulib/tests/test-posix_spawn1.c b/gnulib/tests/test-posix_spawn1.c
new file mode 100644
index 00000000..659d76a1
--- /dev/null
+++ b/gnulib/tests/test-posix_spawn1.c
@@ -0,0 +1,166 @@
+/* Test of posix_spawn() function.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <spawn.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (posix_spawnp, int, (pid_t *, char const *,
+ posix_spawn_file_actions_t const *,
+ posix_spawnattr_t const *,
+ char *const[], char *const[]));
+SIGNATURE_CHECK (posix_spawnattr_init, int, (posix_spawnattr_t *));
+SIGNATURE_CHECK (posix_spawnattr_destroy, int, (posix_spawnattr_t *));
+SIGNATURE_CHECK (posix_spawnattr_setsigmask, int, (posix_spawnattr_t *,
+ sigset_t const *));
+SIGNATURE_CHECK (posix_spawnattr_setflags, int, (posix_spawnattr_t *, short));
+SIGNATURE_CHECK (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *));
+SIGNATURE_CHECK (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *));
+SIGNATURE_CHECK (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *, int));
+SIGNATURE_CHECK (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *, int, char const *, int,
+ mode_t));
+SIGNATURE_CHECK (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *, int, int));
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+extern char **environ;
+
+#define CHILD_PROGRAM_FILENAME "test-posix_spawn1.sh"
+
+static int
+fd_safer (int fd)
+{
+ if (0 <= fd && fd <= 2)
+ {
+ int f = fd_safer (dup (fd));
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
+
+int
+main ()
+{
+ char *argv[3] = { "/bin/sh", CHILD_PROGRAM_FILENAME, NULL };
+ int ifd[2];
+ sigset_t blocked_signals;
+ sigset_t fatal_signal_set;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+ int fd;
+ FILE *fp;
+ char line[80];
+ int status;
+ int exitstatus;
+
+ if (pipe (ifd) < 0 || (ifd[0] = fd_safer (ifd[0])) < 0)
+ {
+ perror ("cannot create pipe");
+ exit (1);
+ }
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ sigemptyset (&fatal_signal_set);
+ sigaddset (&fatal_signal_set, SIGINT);
+ sigaddset (&fatal_signal_set, SIGTERM);
+ sigaddset (&fatal_signal_set, SIGHUP);
+ sigaddset (&fatal_signal_set, SIGPIPE);
+ sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_adddup2 (&actions, ifd[1], STDOUT_FILENO)) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ifd[1])) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ifd[0])) != 0
+ || (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, "/dev/null", O_RDONLY, 0)) != 0
+ || (err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
+ || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
+ || (err = posix_spawnp (&child, "/bin/sh", &actions, &attrs, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ errno = err;
+ perror ("subprocess failed");
+ exit (1);
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ close (ifd[1]);
+ fd = ifd[0];
+ fp = fdopen (fd, "r");
+ if (fp == NULL)
+ {
+ fprintf (stderr, "fdopen() failed\n");
+ exit (1);
+ }
+ if (fread (line, 1, 80, fp) < 12)
+ {
+ fprintf (stderr, "could not read expected output\n");
+ exit (1);
+ }
+ if (memcmp (line, "Halle Potta", 11) != 0)
+ {
+ fprintf (stderr, "read output is not the expected output");
+ exit (1);
+ }
+ fclose (fp);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ exit (1);
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 0)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ exit (1);
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-posix_spawn1.in.sh b/gnulib/tests/test-posix_spawn1.in.sh
new file mode 100644
index 00000000..b370856d
--- /dev/null
+++ b/gnulib/tests/test-posix_spawn1.in.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+echo "Halle Potta"
diff --git a/gnulib/tests/test-posix_spawn2.c b/gnulib/tests/test-posix_spawn2.c
new file mode 100644
index 00000000..d76c25c4
--- /dev/null
+++ b/gnulib/tests/test-posix_spawn2.c
@@ -0,0 +1,139 @@
+/* Test of posix_spawn() function.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <spawn.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+extern char **environ;
+
+#define CHILD_PROGRAM_FILENAME "test-posix_spawn2.sh"
+
+static int
+fd_safer (int fd)
+{
+ if (0 <= fd && fd <= 2)
+ {
+ int f = fd_safer (dup (fd));
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
+
+int
+main ()
+{
+ char *argv[3] = { "/bin/sh", CHILD_PROGRAM_FILENAME, NULL };
+ int ofd[2];
+ sigset_t blocked_signals;
+ sigset_t fatal_signal_set;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+ int fd;
+ FILE *fp;
+ int written;
+ int status;
+ int exitstatus;
+
+ if (pipe (ofd) < 0 || (ofd[1] = fd_safer (ofd[1])) < 0)
+ {
+ perror ("cannot create pipe");
+ exit (1);
+ }
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ sigemptyset (&fatal_signal_set);
+ sigaddset (&fatal_signal_set, SIGINT);
+ sigaddset (&fatal_signal_set, SIGTERM);
+ sigaddset (&fatal_signal_set, SIGHUP);
+ sigaddset (&fatal_signal_set, SIGPIPE);
+ sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_adddup2 (&actions, ofd[0], STDIN_FILENO)) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ofd[0])) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ofd[1])) != 0
+ || (err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
+ || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
+ || (err = posix_spawnp (&child, "/bin/sh", &actions, &attrs, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ errno = err;
+ perror ("subprocess failed");
+ exit (1);
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ close (ofd[0]);
+ fd = ofd[1];
+ fp = fdopen (fd, "w");
+ if (fp == NULL)
+ {
+ fprintf (stderr, "fdopen() failed\n");
+ exit (1);
+ }
+ written = fwrite ("Halle Potta\n", 1, 12, fp);
+ if (written < 12)
+ {
+ fprintf (stderr, "could not write input\n");
+ exit (1);
+ }
+ fclose (fp);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ exit (1);
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 0)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ exit (1);
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-posix_spawn2.in.sh b/gnulib/tests/test-posix_spawn2.in.sh
new file mode 100644
index 00000000..29a9b28f
--- /dev/null
+++ b/gnulib/tests/test-posix_spawn2.in.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+read line
+test "$line" = "Halle Potta"
diff --git a/gnulib/tests/test-posix_spawn3.c b/gnulib/tests/test-posix_spawn3.c
new file mode 100644
index 00000000..c8a1db4b
--- /dev/null
+++ b/gnulib/tests/test-posix_spawn3.c
@@ -0,0 +1,160 @@
+/* Test of posix_spawn() function.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+/* Test whether posix_spawn_file_actions_addopen supports filename arguments
+ that contain special characters such as '*'. */
+
+#include <config.h>
+
+#include <spawn.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (posix_spawn, int, (pid_t *, char const *,
+ posix_spawn_file_actions_t const *,
+ posix_spawnattr_t const *,
+ char *const[], char *const[]));
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+extern char **environ;
+
+#define CHILD_PROGRAM_FILENAME "test-posix_spawn3"
+#define DATA_FILENAME "t!#$%&'()*+,-;=?@[\\]^_`{|}~.tmp"
+/* On Cygwin, '*' '?' '\\' '|' cannot be used in file names. */
+#if defined __CYGWIN__
+# undef DATA_FILENAME
+# define DATA_FILENAME "t!#$%&'()+,-;=@[]^_`{}~.tmp"
+#endif
+
+static int
+parent_main (void)
+{
+ FILE *fp;
+ char *argv[3] = { CHILD_PROGRAM_FILENAME, "-child", NULL };
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ int err;
+ pid_t child;
+ int status;
+ int exitstatus;
+
+ /* Create a data file with specific contents. */
+ fp = fopen (DATA_FILENAME, "wb");
+ if (fp == NULL)
+ {
+ perror ("cannot create data file");
+ return 1;
+ }
+ fwrite ("Halle Potta", 1, 11, fp);
+ if (fflush (fp) || fclose (fp))
+ {
+ perror ("cannot prepare data file");
+ return 1;
+ }
+
+ /* Avoid reading from our stdin, as it could block. */
+ freopen ("/dev/null", "rb", stdin);
+
+ /* Test whether posix_spawn_file_actions_addopen with this file name
+ actually works, but spawning a child that reads from this file. */
+ actions_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, DATA_FILENAME, O_RDONLY, 0600)) != 0
+ || (err = posix_spawn (&child, CHILD_PROGRAM_FILENAME, &actions, NULL, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ errno = err;
+ perror ("subprocess failed");
+ return 1;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ return 1;
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 0)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+child_main (void)
+{
+ char buf[1024];
+
+ /* See if reading from STDIN_FILENO yields the expected contents. */
+ if (fread (buf, 1, sizeof (buf), stdin) == 11
+ && memcmp (buf, "Halle Potta", 11) == 0)
+ return 0;
+ else
+ return 2;
+}
+
+static void
+cleanup_then_die (int sig)
+{
+ /* Clean up data file. */
+ unlink (DATA_FILENAME);
+
+ /* Re-raise the signal and die from it. */
+ signal (sig, SIG_DFL);
+ raise (sig);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int exitstatus;
+
+ if (!(argc > 1 && strcmp (argv[1], "-child") == 0))
+ {
+ /* This is the parent process. */
+ signal (SIGINT, cleanup_then_die);
+ signal (SIGTERM, cleanup_then_die);
+ #ifdef SIGHUP
+ signal (SIGHUP, cleanup_then_die);
+ #endif
+
+ exitstatus = parent_main ();
+ }
+ else
+ {
+ /* This is the child process. */
+
+ exitstatus = child_main ();
+ }
+ unlink (DATA_FILENAME);
+ return exitstatus;
+}
diff --git a/gnulib/tests/test-posixtm.c b/gnulib/tests/test-posixtm.c
new file mode 100644
index 00000000..18e9e36c
--- /dev/null
+++ b/gnulib/tests/test-posixtm.c
@@ -0,0 +1,172 @@
+/* Test that posixtime works as required.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "posixtm.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <time.h>
+
+#include "intprops.h"
+#include "macros.h"
+
+struct posixtm_test
+{
+ char const *in;
+ unsigned int syntax_bits;
+ bool valid;
+ int64_t t_expected;
+};
+
+/* Test mainly with syntax_bits == 13
+ (aka: (PDS_LEADING_YEAR | PDS_CENTURY | PDS_SECONDS)) */
+
+static struct posixtm_test const T[] =
+ {
+ /* no year specified; cross-check via another posixtime call */
+ { "12131415.16", 13, 1, 0}, /* ??? Dec 13 14:15:16 ???? */
+ { "12131415", 13, 1, 0}, /* ??? Dec 13 14:15:00 ???? */
+
+ { "000001010000.00", 13, 1, -62167219200}, /* Sat Jan 1 00:00:00 0 */
+ { "190112132045.51", 13, 1, -2147483649}, /* Fri Dec 13 20:45:51 1901 */
+ { "190112132045.52", 13, 1, -2147483648}, /* Fri Dec 13 20:45:52 1901 */
+ { "190112132045.53", 13, 1, -2147483647}, /* Fri Dec 13 20:45:53 1901 */
+ { "190112132046.52", 13, 1, -2147483588}, /* Fri Dec 13 20:46:52 1901 */
+ { "190112132145.52", 13, 1, -2147480048}, /* Fri Dec 13 21:45:52 1901 */
+ { "190112142045.52", 13, 1, -2147397248}, /* Sat Dec 14 20:45:52 1901 */
+ { "190201132045.52", 13, 1, -2144805248}, /* Mon Jan 13 20:45:52 1902 */
+ { "196912312359.59", 13, 1, -1}, /* Wed Dec 31 23:59:59 1969 */
+ { "197001010000.00", 13, 1, 0}, /* Thu Jan 1 00:00:00 1970 */
+ { "197001010000.01", 13, 1, 1}, /* Thu Jan 1 00:00:01 1970 */
+ { "197001010001.00", 13, 1, 60}, /* Thu Jan 1 00:01:00 1970 */
+ { "197001010000.60", 13, 1, 60}, /* Thu Jan 1 00:01:00 1970 */
+ { "197001010100.00", 13, 1, 3600}, /* Thu Jan 1 01:00:00 1970 */
+ { "197001020000.00", 13, 1, 86400}, /* Fri Jan 2 00:00:00 1970 */
+ { "197002010000.00", 13, 1, 2678400}, /* Sun Feb 1 00:00:00 1970 */
+ { "197101010000.00", 13, 1, 31536000}, /* Fri Jan 1 00:00:00 1971 */
+ { "197001000000.00", 13, 0, 0}, /* -- */
+ { "197000010000.00", 13, 0, 0}, /* -- */
+ { "197001010060.00", 13, 0, 0}, /* -- */
+ { "197001012400.00", 13, 0, 0}, /* -- */
+ { "197001320000.00", 13, 0, 0}, /* -- */
+ { "197013010000.00", 13, 0, 0}, /* -- */
+ { "203801190314.06", 13, 1, 2147483646}, /* Tue Jan 19 03:14:06 2038 */
+ { "203801190314.07", 13, 1, 2147483647}, /* Tue Jan 19 03:14:07 2038 */
+ { "203801190314.08", 13, 1, 2147483648}, /* Tue Jan 19 03:14:08 2038 */
+ { "999912312359.59", 13, 1, 253402300799}, /* Fri Dec 31 23:59:59 9999 */
+ { "1112131415", 13, 1, 1323785700}, /* Tue Dec 13 14:15:00 2011 */
+ { "1112131415.16", 13, 1, 1323785716}, /* Tue Dec 13 14:15:16 2011 */
+ { "201112131415.16", 13, 1, 1323785716}, /* Tue Dec 13 14:15:16 2011 */
+ { "191112131415.16", 13, 1, -1831974284}, /* Wed Dec 13 14:15:16 1911 */
+ { "203712131415.16", 13, 1, 2144326516}, /* Sun Dec 13 14:15:16 2037 */
+ { "3712131415.16", 13, 1, 2144326516}, /* Sun Dec 13 14:15:16 2037 */
+ { "6812131415.16", 13, 1, 3122633716}, /* Thu Dec 13 14:15:16 2068 */
+ { "6912131415.16", 13, 1, -1590284}, /* Sat Dec 13 14:15:16 1969 */
+ { "7012131415.16", 13, 1, 29945716}, /* Sun Dec 13 14:15:16 1970 */
+ { "1213141599", 2, 1, 945094500}, /* Mon Dec 13 14:15:00 1999 */
+ { "1213141500", 2, 1, 976716900}, /* Wed Dec 13 14:15:00 2000 */
+ { NULL, 0, 0, 0}
+ };
+
+int
+main (void)
+{
+ unsigned int i;
+ int fail = 0;
+ char curr_year_str[30];
+ struct tm *tm;
+ time_t t_now;
+ int err;
+ size_t n_bytes;
+
+ /* The above test data requires Universal Time, e.g., TZ="UTC0". */
+ err = setenv ("TZ", "UTC0", 1);
+ ASSERT (err == 0);
+
+ t_now = time (NULL);
+ ASSERT (t_now != (time_t) -1);
+ tm = localtime (&t_now);
+ ASSERT (tm);
+ n_bytes = strftime (curr_year_str, sizeof curr_year_str, "%Y", tm);
+ ASSERT (0 < n_bytes);
+
+ for (i = 0; T[i].in; i++)
+ {
+ time_t t_out;
+ time_t t_exp = T[i].t_expected;
+ bool ok;
+
+ /* Some tests assume that time_t is signed.
+ If it is unsigned and the result is negative, skip the test. */
+ if (T[i].t_expected < 0 && ! TYPE_SIGNED (time_t))
+ {
+ printf ("skipping %s: result is negative, "
+ "but your time_t is unsigned\n", T[i].in);
+ continue;
+ }
+
+ if (T[i].valid && t_exp != T[i].t_expected)
+ {
+ printf ("skipping %s: result is out of range of your time_t\n",
+ T[i].in);
+ continue;
+ }
+
+ /* If an input string does not specify the year number, determine
+ the expected output by calling posixtime with an otherwise
+ equivalent string that starts with the current year. */
+ if (8 <= strlen (T[i].in)
+ && (T[i].in[8] == '.' || T[i].in[8] == '\0'))
+ {
+ char tmp_buf[20];
+ stpcpy (stpcpy (tmp_buf, curr_year_str), T[i].in);
+ ASSERT (posixtime (&t_exp, tmp_buf, T[i].syntax_bits));
+ }
+
+ ok = posixtime (&t_out, T[i].in, T[i].syntax_bits);
+ if (ok != !!T[i].valid)
+ {
+ printf ("%s return value mismatch: got %d, expected %d\n",
+ T[i].in, !!ok, T[i].valid);
+ fail = 1;
+ continue;
+ }
+
+ if (!ok)
+ continue;
+
+ if (t_out != t_exp)
+ {
+ printf ("%s mismatch (-: actual; +:expected)\n-%12ld\n+%12ld\n",
+ T[i].in, t_out, t_exp);
+ fail = 1;
+ }
+ }
+
+ return fail;
+}
+
+/*
+Local Variables:
+indent-tabs-mode: nil
+End:
+*/
diff --git a/gnulib/tests/test-pow.c b/gnulib/tests/test-pow.c
new file mode 100644
index 00000000..ebfa698e
--- /dev/null
+++ b/gnulib/tests/test-pow.c
@@ -0,0 +1,40 @@
+/* Test of pow() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (pow, double, (double, double));
+
+#include "macros.h"
+
+volatile double x;
+volatile double y;
+double z;
+
+int
+main ()
+{
+ /* A particular value. */
+ z = pow (243.0, 1.2);
+ ASSERT (z >= 728.9999999 && z <= 729.0000001);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-pread.c b/gnulib/tests/test-pread.c
new file mode 100644
index 00000000..0f43757d
--- /dev/null
+++ b/gnulib/tests/test-pread.c
@@ -0,0 +1,85 @@
+/* Test the pread function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (pread, ssize_t, (int, void *, size_t, off_t));
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "macros.h"
+
+#define N (sizeof buf - 1)
+
+int
+main (void)
+{
+ char const *file = "in";
+ int fd;
+ char buf[] = "0123456789";
+ off_t pos;
+
+ ASSERT (file);
+
+ fd = open (file, O_CREAT | O_WRONLY, 0600);
+ ASSERT (0 <= fd);
+ ASSERT (write (fd, buf, N) == N);
+ ASSERT (close (fd) == 0);
+
+ fd = open (file, O_RDONLY);
+ ASSERT (0 <= fd);
+
+ for (pos = 0; pos < 3; pos++)
+ {
+ size_t i;
+ off_t init_pos = lseek (fd, pos, SEEK_SET);
+ ASSERT (init_pos == pos);
+
+ for (i = 0; i < N; i++)
+ {
+ char byte_buf;
+ ASSERT (pread (fd, &byte_buf, 1, i) == 1);
+ ASSERT (byte_buf == buf[i]);
+ ASSERT (lseek (fd, 0, SEEK_CUR) == init_pos);
+ }
+ }
+
+ {
+ /* Invalid offset must evoke failure with EINVAL. */
+ char byte;
+ ASSERT (pread (fd, &byte, 1, (off_t) -1) == -1);
+ ASSERT (errno == EINVAL);
+ }
+
+ ASSERT (close (fd) == 0);
+
+ {
+ char byte;
+ /* Trying to operate on a pipe must evoke failure with ESPIPE.
+ This assumes that stdin is a pipe, and hence not seekable. */
+ ASSERT (pread (STDIN_FILENO, &byte, 1, 1) == -1);
+ ASSERT (errno == ESPIPE);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-pread.sh b/gnulib/tests/test-pread.sh
new file mode 100755
index 00000000..cd4c04dc
--- /dev/null
+++ b/gnulib/tests/test-pread.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ .
+
+fail=0
+: | test-pread || fail=1
+
+Exit $fail
diff --git a/gnulib/tests/test-printf-frexp.c b/gnulib/tests/test-printf-frexp.c
new file mode 100644
index 00000000..13e1c30e
--- /dev/null
+++ b/gnulib/tests/test-printf-frexp.c
@@ -0,0 +1,119 @@
+/* Test of splitting a double into fraction and mantissa.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "printf-frexp.h"
+
+#include <float.h>
+
+#include "macros.h"
+
+static double
+my_ldexp (double x, int d)
+{
+ for (; d > 0; d--)
+ x *= 2.0;
+ for (; d < 0; d++)
+ x *= 0.5;
+ return x;
+}
+
+int
+main ()
+{
+ int i;
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ when dealing with denormalized numbers. It is necessary on x86 systems
+ where double-floats are not IEEE compliant by default, to avoid that the
+ results become platform and compiler option dependent. 'volatile' is a
+ portable alternative to gcc's -ffloat-store option. */
+ volatile double x;
+
+ for (i = 1, x = 1.0; i <= DBL_MAX_EXP; i++, x *= 2.0)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.0);
+ }
+ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.0);
+ }
+ for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == DBL_MIN_EXP - 1);
+ ASSERT (mantissa == my_ldexp (1.0, i - DBL_MIN_EXP));
+ }
+
+ for (i = 1, x = 1.01; i <= DBL_MAX_EXP; i++, x *= 2.0)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.01);
+ }
+ for (i = 1, x = 1.01; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.01);
+ }
+ for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == DBL_MIN_EXP - 1);
+ ASSERT (mantissa >= my_ldexp (1.0, i - DBL_MIN_EXP));
+ ASSERT (mantissa <= my_ldexp (2.0, i - DBL_MIN_EXP));
+ ASSERT (mantissa == my_ldexp (x, - exp));
+ }
+
+ for (i = 1, x = 1.73205; i <= DBL_MAX_EXP; i++, x *= 2.0)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.73205);
+ }
+ for (i = 1, x = 1.73205; i >= DBL_MIN_EXP; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.73205);
+ }
+ for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
+ {
+ int exp = -9999;
+ double mantissa = printf_frexp (x, &exp);
+ ASSERT (exp == DBL_MIN_EXP - 1);
+ ASSERT (mantissa >= my_ldexp (1.0, i - DBL_MIN_EXP));
+ ASSERT (mantissa <= my_ldexp (2.0, i - DBL_MIN_EXP));
+ ASSERT (mantissa == my_ldexp (x, - exp));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-printf-frexpl.c b/gnulib/tests/test-printf-frexpl.c
new file mode 100644
index 00000000..6f7e4f7e
--- /dev/null
+++ b/gnulib/tests/test-printf-frexpl.c
@@ -0,0 +1,134 @@
+/* Test of splitting a 'long double' into fraction and mantissa.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "printf-frexpl.h"
+
+#include <float.h>
+
+#include "fpucw.h"
+#include "macros.h"
+
+/* On MIPS IRIX machines, LDBL_MIN_EXP is -1021, but the smallest reliable
+ exponent for 'long double' is -964. Similarly, on PowerPC machines,
+ LDBL_MIN_EXP is -1021, but the smallest reliable exponent for 'long double'
+ is -968. For exponents below that, the precision may be truncated to the
+ precision used for 'double'. */
+#ifdef __sgi
+# define MIN_NORMAL_EXP (LDBL_MIN_EXP + 57)
+# define MIN_SUBNORMAL_EXP MIN_NORMAL_EXP
+#elif defined __ppc || defined __ppc__ || defined __powerpc || defined __powerpc__
+# define MIN_NORMAL_EXP (LDBL_MIN_EXP + 53)
+# define MIN_SUBNORMAL_EXP MIN_NORMAL_EXP
+#else
+# define MIN_NORMAL_EXP LDBL_MIN_EXP
+# define MIN_SUBNORMAL_EXP (LDBL_MIN_EXP - 100)
+#endif
+
+static long double
+my_ldexp (long double x, int d)
+{
+ for (; d > 0; d--)
+ x *= 2.0L;
+ for (; d < 0; d++)
+ x *= 0.5L;
+ return x;
+}
+
+int
+main ()
+{
+ int i;
+ long double x;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ for (i = 1, x = 1.0L; i <= LDBL_MAX_EXP; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.0L);
+ }
+ for (i = 1, x = 1.0L; i >= MIN_NORMAL_EXP; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.0L);
+ }
+ for (; i >= MIN_SUBNORMAL_EXP && x > 0.0L; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == LDBL_MIN_EXP - 1);
+ ASSERT (mantissa == my_ldexp (1.0L, i - LDBL_MIN_EXP));
+ }
+
+ for (i = 1, x = 1.01L; i <= LDBL_MAX_EXP; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.01L);
+ }
+ for (i = 1, x = 1.01L; i >= MIN_NORMAL_EXP; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.01L);
+ }
+ for (; i >= MIN_SUBNORMAL_EXP && x > 0.0L; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == LDBL_MIN_EXP - 1);
+ ASSERT (mantissa >= my_ldexp (1.0L, i - LDBL_MIN_EXP));
+ ASSERT (mantissa <= my_ldexp (2.0L, i - LDBL_MIN_EXP));
+ ASSERT (mantissa == my_ldexp (x, - exp));
+ }
+
+ for (i = 1, x = 1.73205L; i <= LDBL_MAX_EXP; i++, x *= 2.0L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.73205L);
+ }
+ for (i = 1, x = 1.73205L; i >= MIN_NORMAL_EXP; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == i - 1);
+ ASSERT (mantissa == 1.73205L);
+ }
+ for (; i >= MIN_SUBNORMAL_EXP && x > 0.0L; i--, x *= 0.5L)
+ {
+ int exp = -9999;
+ long double mantissa = printf_frexpl (x, &exp);
+ ASSERT (exp == LDBL_MIN_EXP - 1);
+ ASSERT (mantissa >= my_ldexp (1.0L, i - LDBL_MIN_EXP));
+ ASSERT (mantissa <= my_ldexp (2.0L, i - LDBL_MIN_EXP));
+ ASSERT (mantissa == my_ldexp (x, - exp));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-printf-posix.c b/gnulib/tests/test-printf-posix.c
new file mode 100644
index 00000000..d689aab1
--- /dev/null
+++ b/gnulib/tests/test-printf-posix.c
@@ -0,0 +1,51 @@
+/* Test of POSIX compatible printf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (printf, int, (char const *, ...));
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-printf-posix.h"
+
+int
+main (int argc, char *argv[])
+{
+ test_function (printf);
+ return 0;
+}
+
+/* Test whether __attribute__ (__format__ (...)) still works. */
+#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) && !__STRICT_ANSI__
+extern int func1 (char *, size_t, const char *, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+extern int func2 (char *, size_t, const char *, ...)
+ __attribute__ ((__format__ (printf, 3, 4)));
+extern int func3 (char *, size_t, const char *, ...)
+ __attribute__ ((format (__printf__, 3, 4)));
+extern int func4 (char *, size_t, const char *, ...)
+ __attribute__ ((format (printf, 3, 4)));
+#endif
diff --git a/gnulib/tests/test-printf-posix.h b/gnulib/tests/test-printf-posix.h
new file mode 100644
index 00000000..32e6468f
--- /dev/null
+++ b/gnulib/tests/test-printf-posix.h
@@ -0,0 +1,153 @@
+/* Test of POSIX compatible vsprintf() and sprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_function (int (*my_printf) (const char *, ...))
+{
+ /* Here we don't test output that may be platform dependent.
+ The bulk of the tests is done as part of the 'vasnprintf-posix' module. */
+
+ /* Test support of size specifiers as in C99. */
+
+ my_printf ("%ju %d\n", (uintmax_t) 12345671, 33, 44, 55);
+
+ my_printf ("%zu %d\n", (size_t) 12345672, 33, 44, 55);
+
+ my_printf ("%tu %d\n", (ptrdiff_t) 12345673, 33, 44, 55);
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ /* Positive zero. */
+ my_printf ("%a %d\n", 0.0, 33, 44, 55);
+
+ /* Positive infinity. */
+ my_printf ("%a %d\n", 1.0 / 0.0, 33, 44, 55);
+
+ /* Negative infinity. */
+ my_printf ("%a %d\n", -1.0 / 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO with infinite number. */
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ my_printf ("%010a %d\n", 1.0 / 0.0, 33, 44, 55);
+
+ /* Test the support of the %f format directive. */
+
+ /* A positive number. */
+ my_printf ("%f %d\n", 12.75, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_printf ("%f %d\n", 1234567.0, 33, 44, 55);
+
+ /* A negative number. */
+ my_printf ("%f %d\n", -0.03125, 33, 44, 55);
+
+ /* Positive zero. */
+ my_printf ("%f %d\n", 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_printf ("%015f %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision. */
+ my_printf ("%.f %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_printf ("%.2f %d\n", 999.95, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_printf ("%.2f %d\n", 999.996, 33, 44, 55);
+
+ /* A positive number. */
+ my_printf ("%Lf %d\n", 12.75L, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_printf ("%Lf %d\n", 1234567.0L, 33, 44, 55);
+
+ /* A negative number. */
+ my_printf ("%Lf %d\n", -0.03125L, 33, 44, 55);
+
+ /* Positive zero. */
+ my_printf ("%Lf %d\n", 0.0L, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_printf ("%015Lf %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision. */
+ my_printf ("%.Lf %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_printf ("%.2Lf %d\n", 999.95L, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_printf ("%.2Lf %d\n", 999.996L, 33, 44, 55);
+
+ /* Test the support of the %F format directive. */
+
+ /* A positive number. */
+ my_printf ("%F %d\n", 12.75, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_printf ("%F %d\n", 1234567.0, 33, 44, 55);
+
+ /* A negative number. */
+ my_printf ("%F %d\n", -0.03125, 33, 44, 55);
+
+ /* Positive zero. */
+ my_printf ("%F %d\n", 0.0, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_printf ("%015F %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision. */
+ my_printf ("%.F %d\n", 1234.0, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_printf ("%.2F %d\n", 999.95, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_printf ("%.2F %d\n", 999.996, 33, 44, 55);
+
+ /* A positive number. */
+ my_printf ("%LF %d\n", 12.75L, 33, 44, 55);
+
+ /* A larger positive number. */
+ my_printf ("%LF %d\n", 1234567.0L, 33, 44, 55);
+
+ /* A negative number. */
+ my_printf ("%LF %d\n", -0.03125L, 33, 44, 55);
+
+ /* Positive zero. */
+ my_printf ("%LF %d\n", 0.0L, 33, 44, 55);
+
+ /* FLAG_ZERO. */
+ my_printf ("%015LF %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision. */
+ my_printf ("%.LF %d\n", 1234.0L, 33, 44, 55);
+
+ /* Precision with no rounding. */
+ my_printf ("%.2LF %d\n", 999.95L, 33, 44, 55);
+
+ /* Precision with rounding. */
+ my_printf ("%.2LF %d\n", 999.996L, 33, 44, 55);
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ my_printf ("%2$d %1$d\n", 33, 55);
+}
diff --git a/gnulib/tests/test-printf-posix.output b/gnulib/tests/test-printf-posix.output
new file mode 100644
index 00000000..618825bb
--- /dev/null
+++ b/gnulib/tests/test-printf-posix.output
@@ -0,0 +1,40 @@
+12345671 33
+12345672 33
+12345673 33
+0x0p+0 33
+inf 33
+-inf 33
+ inf 33
+12.750000 33
+1234567.000000 33
+-0.031250 33
+0.000000 33
+00001234.000000 33
+1234 33
+999.95 33
+1000.00 33
+12.750000 33
+1234567.000000 33
+-0.031250 33
+0.000000 33
+00001234.000000 33
+1234 33
+999.95 33
+1000.00 33
+12.750000 33
+1234567.000000 33
+-0.031250 33
+0.000000 33
+00001234.000000 33
+1234 33
+999.95 33
+1000.00 33
+12.750000 33
+1234567.000000 33
+-0.031250 33
+0.000000 33
+00001234.000000 33
+1234 33
+999.95 33
+1000.00 33
+55 33
diff --git a/gnulib/tests/test-printf-posix.sh b/gnulib/tests/test-printf-posix.sh
new file mode 100755
index 00000000..a8123450
--- /dev/null
+++ b/gnulib/tests/test-printf-posix.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-printf-posix.tmp t-printf-posix.out"
+./test-printf-posix${EXEEXT} > t-printf-posix.tmp || exit 1
+LC_ALL=C tr -d '\r' < t-printf-posix.tmp > t-printf-posix.out || exit 1
+
+: ${DIFF=diff}
+${DIFF} "${srcdir}/test-printf-posix.output" t-printf-posix.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-printf-posix2.c b/gnulib/tests/test-printf-posix2.c
new file mode 100644
index 00000000..1bf67e05
--- /dev/null
+++ b/gnulib/tests/test-printf-posix2.c
@@ -0,0 +1,112 @@
+/* Test of POSIX compatible printf() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <string.h>
+#include <errno.h>
+
+int
+main (int argc, char *argv[])
+{
+ struct rlimit limit;
+ int arg;
+ int ret;
+
+ /* Some printf implementations allocate temporary space with malloc. */
+ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
+#ifdef RLIMIT_DATA
+ if (getrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+#endif
+ /* On Linux systems, malloc() is limited by RLIMIT_AS. */
+#ifdef RLIMIT_AS
+ if (getrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+#endif
+ /* Some printf implementations allocate temporary space on the stack. */
+#ifdef RLIMIT_STACK
+ if (getrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+#endif
+
+ arg = atoi (argv[1]);
+ switch (arg)
+ {
+ case 0:
+ {
+ void *memory = malloc (5000000);
+ if (memory == NULL)
+ return 1;
+ memset (memory, 17, 5000000);
+ return 78;
+ }
+ case 1:
+ ret = printf ("%.5000000f", 1.0);
+ return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
+ case 2:
+ ret = printf ("%.5000000f", -1.0);
+ return !(ret == 5000003 || (ret < 0 && errno == ENOMEM));
+ case 3:
+ ret = printf ("%.5000000e", 1.0);
+ return !(ret >= 5000006 || (ret < 0 && errno == ENOMEM));
+ case 4:
+ ret = printf ("%.5000000d", 1);
+ return !(ret == 5000000 || (ret < 0 && errno == ENOMEM));
+ case 5:
+ ret = printf ("%.5000000d", -1);
+ return !(ret == 5000001 || (ret < 0 && errno == ENOMEM));
+ case 6:
+ ret = printf ("%.5000000u", 1);
+ return !(ret == 5000000 || (ret < 0 && errno == ENOMEM));
+ }
+ return 0;
+}
+
+#else
+
+int
+main (int argc, char *argv[])
+{
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/test-printf-posix2.sh b/gnulib/tests/test-printf-posix2.sh
new file mode 100755
index 00000000..893c3c9a
--- /dev/null
+++ b/gnulib/tests/test-printf-posix2.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+# Test out-of-memory handling.
+
+(./test-printf-posix2${EXEEXT} 0
+ result=$?
+ if test $result != 77 && test $result != 78; then result=1; fi
+ exit $result
+) 2>/dev/null
+malloc_result=$?
+if test $malloc_result = 77; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+
+for arg in 1 2 3 4 5 6
+do
+ ./test-printf-posix2${EXEEXT} $arg > /dev/null
+ result=$?
+ if test $result = 77; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+ fi
+ if test $result != 0; then
+ exit 1
+ fi
+done
+
+if test $malloc_result = 78; then
+ echo "Skipping test: getrlimit and setrlimit don't work"
+ exit 77
+fi
+
+exit 0
diff --git a/gnulib/tests/test-priv-set.c b/gnulib/tests/test-priv-set.c
new file mode 100644
index 00000000..49ad388f
--- /dev/null
+++ b/gnulib/tests/test-priv-set.c
@@ -0,0 +1,88 @@
+/* Test the priv-set module.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2007. */
+
+#include <config.h>
+
+#include "priv-set.h"
+
+#if HAVE_GETPPRIV
+# include <priv.h>
+#endif
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+#if HAVE_GETPPRIV
+ priv_set_t *set;
+
+ ASSERT (set = priv_allocset ());
+ ASSERT (getppriv (PRIV_EFFECTIVE, set) == 0);
+ ASSERT (priv_ismember (set, PRIV_PROC_EXEC) == 1);
+
+ /* Do a series of removes and restores making sure that the results are
+ consistent with our ismember function and solaris' priv_ismember. */
+ ASSERT (priv_set_ismember (PRIV_PROC_EXEC) == 1);
+ ASSERT (getppriv (PRIV_EFFECTIVE, set) == 0);
+ ASSERT (priv_ismember (set, PRIV_PROC_EXEC) == 1);
+ ASSERT (priv_set_restore (PRIV_PROC_EXEC) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (priv_set_ismember (PRIV_PROC_EXEC) == 1);
+ ASSERT (getppriv (PRIV_EFFECTIVE, set) == 0);
+ ASSERT (priv_ismember (set, PRIV_PROC_EXEC) == 1);
+ ASSERT (priv_set_remove (PRIV_PROC_EXEC) == 0);
+ ASSERT (priv_set_ismember (PRIV_PROC_EXEC) == 0);
+ ASSERT (getppriv (PRIV_EFFECTIVE, set) == 0);
+ ASSERT (priv_ismember (set, PRIV_PROC_EXEC) == 0);
+ ASSERT (priv_set_remove (PRIV_PROC_EXEC) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (priv_set_ismember (PRIV_PROC_EXEC) == 0);
+ ASSERT (getppriv (PRIV_EFFECTIVE, set) == 0);
+ ASSERT (priv_ismember (set, PRIV_PROC_EXEC) == 0);
+ ASSERT (priv_set_restore (PRIV_PROC_EXEC) == 0);
+ ASSERT (priv_set_ismember (PRIV_PROC_EXEC) == 1);
+ ASSERT (getppriv (PRIV_EFFECTIVE, set) == 0);
+ ASSERT (priv_ismember (set, PRIV_PROC_EXEC) == 1);
+ ASSERT (priv_set_restore (PRIV_PROC_EXEC) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (priv_set_ismember (PRIV_PROC_EXEC) == 1);
+ ASSERT (getppriv (PRIV_EFFECTIVE, set) == 0);
+ ASSERT (priv_ismember (set, PRIV_PROC_EXEC) == 1);
+
+ /* Test the priv_set_linkdir wrappers. */
+ ASSERT (getppriv (PRIV_EFFECTIVE, set) == 0);
+ if (priv_ismember (set, PRIV_SYS_LINKDIR))
+ {
+ ASSERT (priv_set_restore_linkdir () == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (priv_set_remove_linkdir () == 0);
+ ASSERT (priv_set_remove_linkdir () == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (priv_set_restore_linkdir () == 0);
+ }
+#else
+ ASSERT (priv_set_restore_linkdir () == -1);
+ ASSERT (priv_set_remove_linkdir () == -1);
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-pty.c b/gnulib/tests/test-pty.c
new file mode 100644
index 00000000..72e126b1
--- /dev/null
+++ b/gnulib/tests/test-pty.c
@@ -0,0 +1,61 @@
+/* Test of pty.h and openpty/forkpty functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2009. */
+
+#include <config.h>
+
+#include <pty.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (forkpty, int, (int *, char *, struct termios *,
+ struct winsize *));
+SIGNATURE_CHECK (openpty, int, (int *, int *, char *, struct termios *,
+ struct winsize *));
+
+#include <stdio.h>
+
+int
+main ()
+{
+ int res;
+ int amaster;
+ int aslave;
+
+ res = openpty (&amaster, &aslave, NULL, NULL, NULL);
+ if (res != 0)
+ {
+ printf ("openpty returned %d\n", res);
+ return 1;
+ }
+
+ res = forkpty (&amaster, NULL, NULL, NULL);
+ if (res == 0)
+ {
+ /* child process */
+ }
+ else if (res > 0)
+ {
+ /* parent */
+ }
+ else
+ {
+ printf ("forkpty returned %d\n", res);
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-quotearg.c b/gnulib/tests/test-quotearg.c
new file mode 100644
index 00000000..1928679f
--- /dev/null
+++ b/gnulib/tests/test-quotearg.c
@@ -0,0 +1,471 @@
+/* Test of quotearg family of functions.
+ Copyright (C) 2008-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2008. */
+
+#include <config.h>
+
+#include "quotearg.h"
+
+#include <ctype.h>
+#include <locale.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "progname.h"
+#include "gettext.h"
+#include "macros.h"
+
+struct result_strings {
+ char const *str1; /* Translation of "". */
+ char const *str2; /* Translation of "\0""1\0". */
+ size_t len2; /* Length of str2. */
+ char const *str3; /* Translation of "simple". */
+ char const *str4; /* Translation of " \t\n'\"\033?""?/\\". */
+ char const *str5; /* Translation of "a:b". */
+ char const *str6; /* Translation of "a\\b". */
+ char const *str7a; /* Translation of LQ RQ, in ASCII charset. */
+ char const *str7b; /* Translation of LQ RQ, in Latin1 or UTF-8 charset. */
+};
+
+struct result_groups {
+ struct result_strings group1; /* Via quotearg_buffer. */
+ struct result_strings group2; /* Via quotearg{,_mem}. */
+ struct result_strings group3; /* Via quotearg_colon{,_mem}. */
+};
+
+/* These quotes are borrowed from a pt_PT.utf8 translation. */
+# define LQ "\302\253"
+# define RQ "\302\273"
+# define LQ_ENC "\\302\\253"
+# define RQ_ENC "\\302\\273"
+# define RQ_ESC "\\\302\273"
+
+static struct result_strings inputs = {
+ "", "\0001\0", 3, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b",
+ LQ RQ, NULL
+};
+
+static struct result_groups results_g[] = {
+ /* literal_quoting_style */
+ { { "", "\0""1\0", 3, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b",
+ LQ RQ, LQ RQ },
+ { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b",
+ LQ RQ, LQ RQ },
+ { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b",
+ LQ RQ, LQ RQ } },
+
+ /* shell_quoting_style */
+ { { "''", "\0""1\0", 3, "simple", "' \t\n'\\''\"\033?""?/\\'", "a:b",
+ "'a\\b'", LQ RQ, LQ RQ },
+ { "''", "1", 1, "simple", "' \t\n'\\''\"\033?""?/\\'", "a:b",
+ "'a\\b'", LQ RQ, LQ RQ },
+ { "''", "1", 1, "simple", "' \t\n'\\''\"\033?""?/\\'", "'a:b'",
+ "'a\\b'", LQ RQ, LQ RQ } },
+
+ /* shell_always_quoting_style */
+ { { "''", "'\0""1\0'", 5, "'simple'", "' \t\n'\\''\"\033?""?/\\'", "'a:b'",
+ "'a\\b'", "'" LQ RQ "'", "'" LQ RQ "'" },
+ { "''", "'1'", 3, "'simple'", "' \t\n'\\''\"\033?""?/\\'", "'a:b'",
+ "'a\\b'", "'" LQ RQ "'", "'" LQ RQ "'" },
+ { "''", "'1'", 3, "'simple'", "' \t\n'\\''\"\033?""?/\\'", "'a:b'",
+ "'a\\b'", "'" LQ RQ "'", "'" LQ RQ "'" } },
+
+ /* c_quoting_style */
+ { { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
+ { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
+ { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a\\:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" } },
+
+ /* c_maybe_quoting_style */
+ { { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
+ "a:b", "a\\b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ },
+ { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
+ "a:b", "a\\b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ },
+ { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
+ "\"a:b\"", "a\\b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ } },
+
+ /* escape_quoting_style */
+ { { "", "\\0001\\0", 7, "simple", " \\t\\n'\"\\033?""?/\\\\", "a:b",
+ "a\\\\b", LQ_ENC RQ_ENC, LQ RQ },
+ { "", "\\0001\\0", 7, "simple", " \\t\\n'\"\\033?""?/\\\\", "a:b",
+ "a\\\\b", LQ_ENC RQ_ENC, LQ RQ },
+ { "", "\\0001\\0", 7, "simple", " \\t\\n'\"\\033?""?/\\\\", "a\\:b",
+ "a\\\\b", LQ_ENC RQ_ENC, LQ RQ } },
+
+ /* locale_quoting_style */
+ { { "`'", "`\\0001\\0'", 9, "`simple'", "` \\t\\n\\'\"\\033?""?/\\\\'",
+ "`a:b'", "`a\\\\b'", "`" LQ_ENC RQ_ENC "'", "`" LQ RQ "'" },
+ { "`'", "`\\0001\\0'", 9, "`simple'", "` \\t\\n\\'\"\\033?""?/\\\\'",
+ "`a:b'", "`a\\\\b'", "`" LQ_ENC RQ_ENC "'", "`" LQ RQ "'" },
+ { "`'", "`\\0001\\0'", 9, "`simple'", "` \\t\\n\\'\"\\033?""?/\\\\'",
+ "`a\\:b'", "`a\\\\b'", "`" LQ_ENC RQ_ENC "'", "`" LQ RQ "'" } },
+
+ /* clocale_quoting_style */
+ { { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
+ { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
+ { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?""?/\\\\\"", "\"a\\:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" } }
+};
+
+static struct result_groups flag_results[] = {
+ /* literal_quoting_style and QA_ELIDE_NULL_BYTES */
+ { { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b", LQ RQ,
+ LQ RQ },
+ { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b", LQ RQ,
+ LQ RQ },
+ { "", "1", 1, "simple", " \t\n'\"\033?""?/\\", "a:b", "a\\b", LQ RQ,
+ LQ RQ } },
+
+ /* c_quoting_style and QA_ELIDE_OUTER_QUOTES */
+ { { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
+ "a:b", "a\\b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ },
+ { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
+ "a:b", "a\\b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ },
+ { "", "\"\\0001\\0\"", 9, "simple", "\" \\t\\n'\\\"\\033?""?/\\\\\"",
+ "\"a:b\"", "a\\b", "\"" LQ_ENC RQ_ENC "\"", LQ RQ } },
+
+ /* c_quoting_style and QA_SPLIT_TRIGRAPHS */
+ { { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?\"\"?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
+ { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?\"\"?/\\\\\"", "\"a:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" },
+ { "\"\"", "\"\\0001\\0\"", 9, "\"simple\"",
+ "\" \\t\\n'\\\"\\033?\"\"?/\\\\\"", "\"a\\:b\"", "\"a\\\\b\"",
+ "\"" LQ_ENC RQ_ENC "\"", "\"" LQ RQ "\"" } }
+};
+
+#if ENABLE_NLS
+
+static struct result_groups locale_results[] = {
+ /* locale_quoting_style */
+ { { LQ RQ, LQ "\\0001\\0" RQ, 11, LQ "simple" RQ,
+ LQ " \\t\\n'\"\\033?""?/\\\\" RQ, LQ "a:b" RQ, LQ "a\\\\b" RQ,
+ LQ LQ RQ_ESC RQ, LQ LQ RQ_ESC RQ },
+ { LQ RQ, LQ "\\0001\\0" RQ, 11, LQ "simple" RQ,
+ LQ " \\t\\n'\"\\033?""?/\\\\" RQ, LQ "a:b" RQ, LQ "a\\\\b" RQ,
+ LQ LQ RQ_ESC RQ, LQ LQ RQ_ESC RQ},
+ { LQ RQ, LQ "\\0001\\0" RQ, 11, LQ "simple" RQ,
+ LQ " \\t\\n'\"\\033?""?/\\\\" RQ, LQ "a\\:b" RQ, LQ "a\\\\b" RQ,
+ LQ LQ RQ_ESC RQ, LQ LQ RQ_ESC RQ } },
+
+ /* clocale_quoting_style */
+ { { LQ RQ, LQ "\\0001\\0" RQ, 11, LQ "simple" RQ,
+ LQ " \\t\\n'\"\\033?""?/\\\\" RQ, LQ "a:b" RQ, LQ "a\\\\b" RQ,
+ LQ LQ RQ_ESC RQ, LQ LQ RQ_ESC RQ },
+ { LQ RQ, LQ "\\0001\\0" RQ, 11, LQ "simple" RQ,
+ LQ " \\t\\n'\"\\033?""?/\\\\" RQ, LQ "a:b" RQ, LQ "a\\\\b" RQ,
+ LQ LQ RQ_ESC RQ, LQ LQ RQ_ESC RQ },
+ { LQ RQ, LQ "\\0001\\0" RQ, 11, LQ "simple" RQ,
+ LQ " \\t\\n'\"\\033?""?/\\\\" RQ, LQ "a\\:b" RQ, LQ "a\\\\b" RQ,
+ LQ LQ RQ_ESC RQ, LQ LQ RQ_ESC RQ } }
+};
+
+#endif /* ENABLE_NLS */
+
+static char const *custom_quotes[][2] = {
+ { "", "" },
+ { "'", "'" },
+ { "(", ")" },
+ { ":", " " },
+ { " ", ":" },
+ { "# ", "\n" },
+ { "\"'", "'\"" }
+};
+
+static struct result_groups custom_results[] = {
+ /* left_quote = right_quote = "" */
+ { { "", "\\0001\\0", 7, "simple",
+ " \\t\\n'\"\\033?""?/\\\\", "a:b", "a\\\\b",
+ LQ_ENC RQ_ENC, LQ RQ },
+ { "", "\\0001\\0", 7, "simple",
+ " \\t\\n'\"\\033?""?/\\\\", "a:b", "a\\\\b",
+ LQ_ENC RQ_ENC, LQ RQ },
+ { "", "\\0001\\0", 7, "simple",
+ " \\t\\n'\"\\033?""?/\\\\", "a\\:b", "a\\\\b",
+ LQ_ENC RQ_ENC, LQ RQ } },
+
+ /* left_quote = right_quote = "'" */
+ { { "''", "'\\0001\\0'", 9, "'simple'",
+ "' \\t\\n\\'\"\\033?""?/\\\\'", "'a:b'", "'a\\\\b'",
+ "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" },
+ { "''", "'\\0001\\0'", 9, "'simple'",
+ "' \\t\\n\\'\"\\033?""?/\\\\'", "'a:b'", "'a\\\\b'",
+ "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" },
+ { "''", "'\\0001\\0'", 9, "'simple'",
+ "' \\t\\n\\'\"\\033?""?/\\\\'", "'a\\:b'", "'a\\\\b'",
+ "'" LQ_ENC RQ_ENC "'", "'" LQ RQ "'" } },
+
+ /* left_quote = "(" and right_quote = ")" */
+ { { "()", "(\\0001\\0)", 9, "(simple)",
+ "( \\t\\n'\"\\033?""?/\\\\)", "(a:b)", "(a\\\\b)",
+ "(" LQ_ENC RQ_ENC ")", "(" LQ RQ ")" },
+ { "()", "(\\0001\\0)", 9, "(simple)",
+ "( \\t\\n'\"\\033?""?/\\\\)", "(a:b)", "(a\\\\b)",
+ "(" LQ_ENC RQ_ENC ")", "(" LQ RQ ")" },
+ { "()", "(\\0001\\0)", 9, "(simple)",
+ "( \\t\\n'\"\\033?""?/\\\\)", "(a\\:b)", "(a\\\\b)",
+ "(" LQ_ENC RQ_ENC ")", "(" LQ RQ ")" } },
+
+ /* left_quote = ":" and right_quote = " " */
+ { { ": ", ":\\0001\\0 ", 9, ":simple ",
+ ":\\ \\t\\n'\"\\033?""?/\\\\ ", ":a:b ", ":a\\\\b ",
+ ":" LQ_ENC RQ_ENC " ", ":" LQ RQ " " },
+ { ": ", ":\\0001\\0 ", 9, ":simple ",
+ ":\\ \\t\\n'\"\\033?""?/\\\\ ", ":a:b ", ":a\\\\b ",
+ ":" LQ_ENC RQ_ENC " ", ":" LQ RQ " " },
+ { ": ", ":\\0001\\0 ", 9, ":simple ",
+ ":\\ \\t\\n'\"\\033?""?/\\\\ ", ":a\\:b ", ":a\\\\b ",
+ ":" LQ_ENC RQ_ENC " ", ":" LQ RQ " " } },
+
+ /* left_quote = " " and right_quote = ":" */
+ { { " :", " \\0001\\0:", 9, " simple:",
+ " \\t\\n'\"\\033?""?/\\\\:", " a\\:b:", " a\\\\b:",
+ " " LQ_ENC RQ_ENC ":", " " LQ RQ ":" },
+ { " :", " \\0001\\0:", 9, " simple:",
+ " \\t\\n'\"\\033?""?/\\\\:", " a\\:b:", " a\\\\b:",
+ " " LQ_ENC RQ_ENC ":", " " LQ RQ ":" },
+ { " :", " \\0001\\0:", 9, " simple:",
+ " \\t\\n'\"\\033?""?/\\\\:", " a\\:b:", " a\\\\b:",
+ " " LQ_ENC RQ_ENC ":", " " LQ RQ ":" } },
+
+ /* left_quote = "# " and right_quote = "\n" */
+ { { "# \n", "# \\0001\\0\n", 10, "# simple\n",
+ "# \\t\\n'\"\\033?""?/\\\\\n", "# a:b\n", "# a\\\\b\n",
+ "# " LQ_ENC RQ_ENC "\n", "# " LQ RQ "\n" },
+ { "# \n", "# \\0001\\0\n", 10, "# simple\n",
+ "# \\t\\n'\"\\033?""?/\\\\\n", "# a:b\n", "# a\\\\b\n",
+ "# " LQ_ENC RQ_ENC "\n", "# " LQ RQ "\n" },
+ { "# \n", "# \\0001\\0\n", 10, "# simple\n",
+ "# \\t\\n'\"\\033?""?/\\\\\n", "# a\\:b\n", "# a\\\\b\n",
+ "# " LQ_ENC RQ_ENC "\n", "# " LQ RQ "\n" } },
+
+ /* left_quote = "\"'" and right_quote = "'\"" */
+ { { "\"''\"", "\"'\\0001\\0'\"", 11, "\"'simple'\"",
+ "\"' \\t\\n\\'\"\\033?""?/\\\\'\"", "\"'a:b'\"", "\"'a\\\\b'\"",
+ "\"'" LQ_ENC RQ_ENC "'\"", "\"'" LQ RQ "'\"" },
+ { "\"''\"", "\"'\\0001\\0'\"", 11, "\"'simple'\"",
+ "\"' \\t\\n\\'\"\\033?""?/\\\\'\"", "\"'a:b'\"", "\"'a\\\\b'\"",
+ "\"'" LQ_ENC RQ_ENC "'\"", "\"'" LQ RQ "'\"" },
+ { "\"''\"", "\"'\\0001\\0'\"", 11, "\"'simple'\"",
+ "\"' \\t\\n\\'\"\\033?""?/\\\\'\"", "\"'a\\:b'\"", "\"'a\\\\b'\"",
+ "\"'" LQ_ENC RQ_ENC "'\"", "\"'" LQ RQ "'\"" } }
+};
+
+static void
+compare (char const *a, size_t la, char const *b, size_t lb)
+{
+ ASSERT (la == lb);
+ ASSERT (memcmp (a, b, la) == 0);
+ ASSERT (b[lb] == '\0');
+}
+
+static void
+compare_strings (char *(func) (char const *, size_t *),
+ struct result_strings *results, bool ascii_only)
+{
+ size_t len;
+ char *p;
+
+ len = 0;
+ p = func (inputs.str1, &len);
+ compare (results->str1, strlen (results->str1), p, len);
+
+ len = inputs.len2;
+ p = func (inputs.str2, &len);
+ compare (results->str2, results->len2, p, len);
+
+ len = SIZE_MAX;
+ p = func (inputs.str3, &len);
+ compare (results->str3, strlen (results->str3), p, len);
+
+ len = strlen (inputs.str4);
+ p = func (inputs.str4, &len);
+ compare (results->str4, strlen (results->str4), p, len);
+
+ len = SIZE_MAX;
+ p = func (inputs.str5, &len);
+ compare (results->str5, strlen (results->str5), p, len);
+
+ len = strlen (inputs.str6);
+ p = func (inputs.str6, &len);
+ compare (results->str6, strlen (results->str6), p, len);
+
+ len = strlen (inputs.str7a);
+ p = func (inputs.str7a, &len);
+ if (ascii_only)
+ compare (results->str7a, strlen (results->str7a), p, len);
+ else
+ compare (results->str7b, strlen (results->str7b), p, len);
+}
+
+static char *
+use_quotearg_buffer (const char *str, size_t *len)
+{
+ static char buf[100];
+ size_t size;
+ memset (buf, 0xa5, 100);
+ size = quotearg_buffer (buf, 100, str, *len, NULL);
+ *len = size;
+ ASSERT ((unsigned char) buf[size + 1] == 0xa5);
+ return buf;
+}
+
+static char *
+use_quotearg (const char *str, size_t *len)
+{
+ char *p = *len == SIZE_MAX ? quotearg (str) : quotearg_mem (str, *len);
+ *len = strlen (p);
+ return p;
+}
+
+static char *
+use_quote_double_quotes (const char *str, size_t *len)
+{
+ char *p = *len == SIZE_MAX ? quotearg_char (str, '"')
+ : quotearg_char_mem (str, *len, '"');
+ *len = strlen (p);
+ return p;
+}
+
+static char *
+use_quotearg_colon (const char *str, size_t *len)
+{
+ char *p = (*len == SIZE_MAX ? quotearg_colon (str)
+ : quotearg_colon_mem (str, *len));
+ *len = strlen (p);
+ return p;
+}
+
+int
+main (int argc _GL_UNUSED, char *argv[])
+{
+ int i;
+ bool ascii_only = MB_CUR_MAX == 1 && !isprint ((unsigned char) LQ[0]);
+
+ set_program_name (argv[0]);
+
+ /* This part of the program is hard-wired to the C locale since it
+ does not call setlocale. However, according to POSIX, the use of
+ 8-bit bytes in a character context in the C locale gives
+ unspecified results (that is, the C locale charset is allowed to
+ be unibyte with 8-bit bytes rejected [ASCII], unibyte with 8-bit
+ bytes being characters [often ISO-8859-1], or multibyte [often
+ UTF-8]). We assume that the latter two cases will be
+ indistinguishable in this test - that is, the LQ and RQ sequences
+ will pass through unchanged in either type of charset. So when
+ testing for quoting of str7, use the ascii_only flag to decide
+ what to expect for the 8-bit data being quoted. */
+ ASSERT (!isprint ('\033'));
+ for (i = literal_quoting_style; i <= clocale_quoting_style; i++)
+ {
+ set_quoting_style (NULL, i);
+ compare_strings (use_quotearg_buffer, &results_g[i].group1, ascii_only);
+ compare_strings (use_quotearg, &results_g[i].group2, ascii_only);
+ if (i == c_quoting_style)
+ compare_strings (use_quote_double_quotes, &results_g[i].group2,
+ ascii_only);
+ compare_strings (use_quotearg_colon, &results_g[i].group3, ascii_only);
+ }
+
+ set_quoting_style (NULL, literal_quoting_style);
+ ASSERT (set_quoting_flags (NULL, QA_ELIDE_NULL_BYTES) == 0);
+ compare_strings (use_quotearg_buffer, &flag_results[0].group1, ascii_only);
+ compare_strings (use_quotearg, &flag_results[0].group2, ascii_only);
+ compare_strings (use_quotearg_colon, &flag_results[0].group3, ascii_only);
+
+ set_quoting_style (NULL, c_quoting_style);
+ ASSERT (set_quoting_flags (NULL, QA_ELIDE_OUTER_QUOTES)
+ == QA_ELIDE_NULL_BYTES);
+ compare_strings (use_quotearg_buffer, &flag_results[1].group1, ascii_only);
+ compare_strings (use_quotearg, &flag_results[1].group2, ascii_only);
+ compare_strings (use_quote_double_quotes, &flag_results[1].group2,
+ ascii_only);
+ compare_strings (use_quotearg_colon, &flag_results[1].group3, ascii_only);
+
+ ASSERT (set_quoting_flags (NULL, QA_SPLIT_TRIGRAPHS)
+ == QA_ELIDE_OUTER_QUOTES);
+ compare_strings (use_quotearg_buffer, &flag_results[2].group1, ascii_only);
+ compare_strings (use_quotearg, &flag_results[2].group2, ascii_only);
+ compare_strings (use_quote_double_quotes, &flag_results[2].group2,
+ ascii_only);
+ compare_strings (use_quotearg_colon, &flag_results[2].group3, ascii_only);
+
+ ASSERT (set_quoting_flags (NULL, 0) == QA_SPLIT_TRIGRAPHS);
+
+ for (i = 0; i < sizeof custom_quotes / sizeof *custom_quotes; ++i)
+ {
+ set_custom_quoting (NULL,
+ custom_quotes[i][0], custom_quotes[i][1]);
+ compare_strings (use_quotearg_buffer, &custom_results[i].group1,
+ ascii_only);
+ compare_strings (use_quotearg, &custom_results[i].group2, ascii_only);
+ compare_strings (use_quotearg_colon, &custom_results[i].group3,
+ ascii_only);
+ }
+
+#if ENABLE_NLS
+ /* Clean up environment. */
+ unsetenv ("LANGUAGE");
+ unsetenv ("LC_ALL");
+ unsetenv ("LC_MESSAGES");
+ unsetenv ("LC_CTYPE");
+ unsetenv ("LANG");
+ unsetenv ("OUTPUT_CHARSET");
+
+ /* This program part runs in a French UTF-8 locale. It uses
+ the test-quotearg.mo message catalog. */
+ {
+ const char *locale_name = getenv ("LOCALE");
+
+ if (locale_name != NULL && strcmp (locale_name, "none") != 0
+ && setenv ("LC_ALL", locale_name, 1) == 0
+ && setlocale (LC_ALL, "") != NULL)
+ {
+ textdomain ("test-quotearg");
+ bindtextdomain ("test-quotearg", getenv ("LOCALEDIR"));
+
+ set_quoting_style (NULL, locale_quoting_style);
+ compare_strings (use_quotearg_buffer, &locale_results[0].group1, false);
+ compare_strings (use_quotearg, &locale_results[0].group2, false);
+ compare_strings (use_quotearg_colon, &locale_results[0].group3, false);
+
+ set_quoting_style (NULL, clocale_quoting_style);
+ compare_strings (use_quotearg_buffer, &locale_results[1].group1, false);
+ compare_strings (use_quotearg, &locale_results[1].group2, false);
+ compare_strings (use_quotearg_colon, &locale_results[1].group3, false);
+ }
+ }
+#endif /* ENABLE_NLS */
+
+ quotearg_free ();
+ return 0;
+}
diff --git a/gnulib/tests/test-quotearg.sh b/gnulib/tests/test-quotearg.sh
new file mode 100755
index 00000000..e050d078
--- /dev/null
+++ b/gnulib/tests/test-quotearg.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Choose an existing locale. The locale encoding does not matter; see the
+# comment in test-quotearg.po.
+if test $LOCALE_FR_UTF8 != none; then
+ locale=$LOCALE_FR_UTF8
+else
+ if test $LOCALE_FR != none; then
+ locale=$LOCALE_FR
+ else
+ locale=none
+ fi
+fi
+
+LOCALE=$locale LOCALEDIR="$srcdir/locale" \
+./test-quotearg${EXEEXT}
diff --git a/gnulib/tests/test-random_r.c b/gnulib/tests/test-random_r.c
new file mode 100644
index 00000000..ba50998b
--- /dev/null
+++ b/gnulib/tests/test-random_r.c
@@ -0,0 +1,54 @@
+/* Test random_r.
+ Copyright (C) 2008-2010 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/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (srandom_r, int, (unsigned int, struct random_data *));
+SIGNATURE_CHECK (initstate_r, int, (unsigned int, char *, size_t,
+ struct random_data *));
+SIGNATURE_CHECK (setstate_r, int, (char *, struct random_data *));
+SIGNATURE_CHECK (random_r, int, (struct random_data *, int32_t *));
+
+#include <time.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ struct random_data rand_state;
+ char buf[128];
+ unsigned int i;
+ unsigned int n_big = 0;
+
+ rand_state.state = NULL;
+ if (initstate_r (time (NULL), buf, sizeof buf, &rand_state))
+ return 1;
+ for (i = 0; i < 1000; i++)
+ {
+ int32_t r;
+ ASSERT (random_r (&rand_state, &r) == 0);
+ ASSERT (0 <= r);
+ if (RAND_MAX / 2 < r)
+ ++n_big;
+ }
+
+ /* Fail if none of the numbers were larger than RAND_MAX / 2. */
+ return !n_big;
+}
diff --git a/gnulib/tests/test-rawmemchr.c b/gnulib/tests/test-rawmemchr.c
new file mode 100644
index 00000000..94768183
--- /dev/null
+++ b/gnulib/tests/test-rawmemchr.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Eric Blake and Bruno Haible
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (rawmemchr, void *, (void const *, int));
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+/* Calculating void * + int is not portable, so this wrapper converts
+ to char * to make the tests easier to write. */
+#define RAWMEMCHR (char *) rawmemchr
+
+int
+main (void)
+{
+ size_t n = 0x100000;
+ char *input = malloc (n + 1);
+ ASSERT (input);
+
+ input[0] = 'a';
+ input[1] = 'b';
+ memset (input + 2, 'c', 1024);
+ memset (input + 1026, 'd', n - 1028);
+ input[n - 2] = 'e';
+ input[n - 1] = 'a';
+ input[n] = '\0';
+
+ /* Basic behavior tests. */
+ ASSERT (RAWMEMCHR (input, 'a') == input);
+ ASSERT (RAWMEMCHR (input, 'b') == input + 1);
+ ASSERT (RAWMEMCHR (input, 'c') == input + 2);
+ ASSERT (RAWMEMCHR (input, 'd') == input + 1026);
+
+ ASSERT (RAWMEMCHR (input + 1, 'a') == input + n - 1);
+ ASSERT (RAWMEMCHR (input + 1, 'e') == input + n - 2);
+
+ ASSERT (RAWMEMCHR (input, '\0') == input + n);
+
+ /* Alignment tests. */
+ {
+ int i, j;
+ for (i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 256; j++)
+ input[i + j] = j;
+ for (j = 0; j < 256; j++)
+ {
+ ASSERT (RAWMEMCHR (input + i, j) == input + i + j);
+ }
+ }
+ }
+
+ free (input);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-rbtree_list.c b/gnulib/tests/test-rbtree_list.c
new file mode 100644
index 00000000..d968bd3f
--- /dev/null
+++ b/gnulib/tests/test-rbtree_list.c
@@ -0,0 +1,415 @@
+/* Test of sequential list data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_rbtree_list.h"
+
+#include <stdlib.h>
+
+#include "gl_array_list.h"
+#include "progname.h"
+#include "macros.h"
+
+extern void gl_rbtree_list_check_invariants (gl_list_t list);
+
+static const char *objects[15] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
+ };
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_list_t list1, gl_list_t list2)
+{
+ size_t n, i;
+
+ n = gl_list_size (list1);
+ ASSERT (n == gl_list_size (list2));
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_get_at (list1, i) == gl_list_get_at (list2, i));
+ }
+}
+
+static void
+check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3)
+{
+ gl_rbtree_list_check_invariants (list2);
+ gl_rbtree_list_check_invariants (list3);
+ check_equals (list1, list2);
+ check_equals (list1, list3);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_list_t list1, list2, list3;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (50);
+ const void **contents =
+ (const void **) malloc (initial_size * sizeof (const void *));
+ size_t i;
+ unsigned int repeat;
+
+ for (i = 0; i < initial_size; i++)
+ contents[i] = RANDOM_OBJECT ();
+
+ /* Create list1. */
+ list1 = gl_list_nx_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list1 != NULL);
+ /* Create list2. */
+ list2 = gl_list_nx_create_empty (GL_RBTREE_LIST, NULL, NULL, NULL, true);
+ ASSERT (list2 != NULL);
+ for (i = 0; i < initial_size; i++)
+ ASSERT (gl_list_nx_add_last (list2, contents[i]) != NULL);
+
+ /* Create list3. */
+ list3 = gl_list_nx_create (GL_RBTREE_LIST, NULL, NULL, NULL, true,
+ initial_size, contents);
+ ASSERT (list3 != NULL);
+
+ check_all (list1, list2, list3);
+
+ for (repeat = 0; repeat < 10000; repeat++)
+ {
+ unsigned int operation = RANDOM (16);
+ switch (operation)
+ {
+ case 0:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t index = RANDOM (gl_list_size (list1));
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+
+ node1 = gl_list_nx_set_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+
+ node2 = gl_list_nx_set_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+
+ node3 = gl_list_nx_set_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ if (node1 == NULL)
+ {
+ ASSERT (node2 == NULL);
+ ASSERT (node3 == NULL);
+ }
+ else
+ {
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ }
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ size_t index1, index2, index3;
+ index1 = gl_list_indexof (list1, obj);
+ index2 = gl_list_indexof (list2, obj);
+ index3 = gl_list_indexof (list3, obj);
+ if (index1 == (size_t)(-1))
+ {
+ ASSERT (index2 == (size_t)(-1));
+ ASSERT (index3 == (size_t)(-1));
+ }
+ else
+ {
+ ASSERT (index2 != (size_t)(-1));
+ ASSERT (index3 != (size_t)(-1));
+ ASSERT (gl_list_get_at (list1, index1) == obj);
+ ASSERT (gl_list_get_at (list2, index2) == obj);
+ ASSERT (gl_list_get_at (list3, index3) == obj);
+ ASSERT (index2 == index1);
+ ASSERT (index3 == index1);
+ }
+ }
+ break;
+ case 3: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, 0) == obj);
+ ASSERT (gl_list_get_at (list2, 0) == obj);
+ ASSERT (gl_list_get_at (list3, 0) == obj);
+ }
+ break;
+ case 4: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_last (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_last (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_last (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, gl_list_size (list1) - 1) == obj);
+ ASSERT (gl_list_get_at (list2, gl_list_size (list2) - 1) == obj);
+ ASSERT (gl_list_get_at (list3, gl_list_size (list3) - 1) == obj);
+ }
+ break;
+ case 5: /* add 3 elements */
+ {
+ const char *obj0 = RANDOM_OBJECT ();
+ const char *obj1 = RANDOM_OBJECT ();
+ const char *obj2 = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj2);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_before (list1, node1, obj0);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_after (list1, node1, obj1);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj2);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_before (list2, node2, obj0);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_after (list2, node2, obj1);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj2);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_before (list3, node3, obj0);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_after (list3, node3, obj1);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj1);
+ ASSERT (gl_list_node_value (list2, node2) == obj1);
+ ASSERT (gl_list_node_value (list3, node3) == obj1);
+ ASSERT (gl_list_get_at (list1, 0) == obj0);
+ ASSERT (gl_list_get_at (list1, 1) == obj1);
+ ASSERT (gl_list_get_at (list1, 2) == obj2);
+ ASSERT (gl_list_get_at (list2, 0) == obj0);
+ ASSERT (gl_list_get_at (list2, 1) == obj1);
+ ASSERT (gl_list_get_at (list2, 2) == obj2);
+ ASSERT (gl_list_get_at (list3, 0) == obj0);
+ ASSERT (gl_list_get_at (list3, 1) == obj1);
+ ASSERT (gl_list_get_at (list3, 2) == obj2);
+ }
+ break;
+ case 6: /* add 1 element */
+ {
+ size_t index = RANDOM (gl_list_size (list1) + 1);
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 7: case 8: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_remove_node (list1, node1));
+ ASSERT (gl_list_remove_node (list2, node2));
+ ASSERT (gl_list_remove_node (list3, node3));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 9: case 10: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ size_t index = RANDOM (n);
+ ASSERT (gl_list_remove_at (list1, index));
+ ASSERT (gl_list_remove_at (list2, index));
+ ASSERT (gl_list_remove_at (list3, index));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 11: case 12: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ ASSERT (gl_list_remove (list1, obj));
+ ASSERT (gl_list_remove (list2, obj));
+ ASSERT (gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 13:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = "xyzzy";
+ ASSERT (!gl_list_remove (list1, obj));
+ ASSERT (!gl_list_remove (list2, obj));
+ ASSERT (!gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n);
+ }
+ break;
+ case 14:
+ {
+ size_t n = gl_list_size (list1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator (list1);
+ iter2 = gl_list_iterator (list2);
+ iter3 = gl_list_iterator (list3);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ case 15:
+ {
+ size_t end = RANDOM (gl_list_size (list1) + 1);
+ size_t start = RANDOM (end + 1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator_from_to (list1, start, end);
+ iter2 = gl_list_iterator_from_to (list2, start, end);
+ iter3 = gl_list_iterator_from_to (list3, start, end);
+ for (i = start; i < end; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ }
+ check_all (list1, list2, list3);
+ }
+
+ gl_list_free (list1);
+ gl_list_free (list2);
+ gl_list_free (list3);
+ free (contents);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-rbtree_oset.c b/gnulib/tests/test-rbtree_oset.c
new file mode 100644
index 00000000..a3985ffe
--- /dev/null
+++ b/gnulib/tests/test-rbtree_oset.c
@@ -0,0 +1,136 @@
+/* Test of ordered set data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_rbtree_oset.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gl_array_oset.h"
+#include "progname.h"
+#include "macros.h"
+
+extern void gl_rbtree_oset_check_invariants (gl_oset_t set);
+
+static const char *objects[30] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
+ "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "<", ">", "[", "]"
+ };
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_oset_t set1, gl_oset_t set2)
+{
+ size_t n = gl_oset_size (set1);
+ gl_oset_iterator_t iter1, iter2;
+ const void *elt1;
+ const void *elt2;
+ size_t i;
+
+ iter1 = gl_oset_iterator (set1);
+ iter2 = gl_oset_iterator (set2);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_oset_iterator_next (&iter1, &elt1));
+ ASSERT (gl_oset_iterator_next (&iter2, &elt2));
+ ASSERT (elt1 == elt2);
+ }
+ ASSERT (!gl_oset_iterator_next (&iter1, &elt1));
+ ASSERT (!gl_oset_iterator_next (&iter2, &elt2));
+ gl_oset_iterator_free (&iter1);
+ gl_oset_iterator_free (&iter2);
+}
+
+static void
+check_all (gl_oset_t set1, gl_oset_t set2)
+{
+ gl_rbtree_oset_check_invariants (set2);
+ check_equals (set1, set2);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_oset_t set1, set2;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (20);
+ size_t i;
+ unsigned int repeat;
+
+ /* Create set1. */
+ set1 = gl_oset_nx_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp, NULL);
+ ASSERT (set1 != NULL);
+
+ /* Create set2. */
+ set2 = gl_oset_nx_create_empty (GL_RBTREE_OSET, (gl_setelement_compar_fn) strcmp, NULL);
+ ASSERT (set2 != NULL);
+
+ check_all (set1, set2);
+
+ /* Initialize them. */
+ for (i = 0; i < initial_size; i++)
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_nx_add (set1, obj) == gl_oset_nx_add (set2, obj));
+ check_all (set1, set2);
+ }
+
+ for (repeat = 0; repeat < 100000; repeat++)
+ {
+ unsigned int operation = RANDOM (3);
+ switch (operation)
+ {
+ case 0:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_search (set1, obj) == gl_oset_search (set2, obj));
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_nx_add (set1, obj) == gl_oset_nx_add (set2, obj));
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ ASSERT (gl_oset_remove (set1, obj) == gl_oset_remove (set2, obj));
+ }
+ break;
+ }
+ check_all (set1, set2);
+ }
+
+ gl_oset_free (set1);
+ gl_oset_free (set2);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-rbtreehash_list.c b/gnulib/tests/test-rbtreehash_list.c
new file mode 100644
index 00000000..1ff907c1
--- /dev/null
+++ b/gnulib/tests/test-rbtreehash_list.c
@@ -0,0 +1,445 @@
+/* Test of sequential list data type implementation.
+ Copyright (C) 2006-2010 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "gl_rbtreehash_list.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gl_array_list.h"
+#include "progname.h"
+#include "macros.h"
+
+extern void gl_rbtreehash_list_check_invariants (gl_list_t list);
+
+static const char *objects[15] =
+ {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
+ };
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+static bool
+string_equals (const void *x1, const void *x2)
+{
+ const char *s1 = x1;
+ const char *s2 = x2;
+ return strcmp (s1, s2) == 0;
+}
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+static size_t
+string_hash (const void *x)
+{
+ const char *s = x;
+ size_t h = 0;
+
+ for (; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h;
+}
+
+#define RANDOM(n) (rand () % (n))
+#define RANDOM_OBJECT() objects[RANDOM (SIZEOF (objects))]
+
+static void
+check_equals (gl_list_t list1, gl_list_t list2)
+{
+ size_t n, i;
+
+ n = gl_list_size (list1);
+ ASSERT (n == gl_list_size (list2));
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_get_at (list1, i) == gl_list_get_at (list2, i));
+ }
+}
+
+static void
+check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3)
+{
+ gl_rbtreehash_list_check_invariants (list2);
+ gl_rbtreehash_list_check_invariants (list3);
+ check_equals (list1, list2);
+ check_equals (list1, list3);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gl_list_t list1, list2, list3;
+
+ set_program_name (argv[0]);
+
+ /* Allow the user to provide a non-default random seed on the command line. */
+ if (argc > 1)
+ srand (atoi (argv[1]));
+
+ {
+ size_t initial_size = RANDOM (50);
+ const void **contents =
+ (const void **) malloc (initial_size * sizeof (const void *));
+ size_t i;
+ unsigned int repeat;
+
+ for (i = 0; i < initial_size; i++)
+ contents[i] = RANDOM_OBJECT ();
+
+ /* Create list1. */
+ list1 = gl_list_nx_create (GL_ARRAY_LIST,
+ string_equals, string_hash, NULL, true,
+ initial_size, contents);
+ ASSERT (list1 != NULL);
+ /* Create list2. */
+ list2 = gl_list_nx_create_empty (GL_RBTREEHASH_LIST,
+ string_equals, string_hash, NULL, true);
+ ASSERT (list2 != NULL);
+ for (i = 0; i < initial_size; i++)
+ ASSERT (gl_list_nx_add_last (list2, contents[i]) != NULL);
+
+ /* Create list3. */
+ list3 = gl_list_nx_create (GL_RBTREEHASH_LIST,
+ string_equals, string_hash, NULL, true,
+ initial_size, contents);
+ ASSERT (list3 != NULL);
+
+ check_all (list1, list2, list3);
+
+ for (repeat = 0; repeat < 10000; repeat++)
+ {
+ unsigned int operation = RANDOM (16);
+ switch (operation)
+ {
+ case 0:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t index = RANDOM (gl_list_size (list1));
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+
+ node1 = gl_list_nx_set_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+
+ node2 = gl_list_nx_set_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+
+ node3 = gl_list_nx_set_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 1:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ if (node1 == NULL)
+ {
+ ASSERT (node2 == NULL);
+ ASSERT (node3 == NULL);
+ }
+ else
+ {
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ }
+ }
+ break;
+ case 2:
+ {
+ const char *obj = RANDOM_OBJECT ();
+ size_t index1, index2, index3;
+ index1 = gl_list_indexof (list1, obj);
+ index2 = gl_list_indexof (list2, obj);
+ index3 = gl_list_indexof (list3, obj);
+ if (index1 == (size_t)(-1))
+ {
+ ASSERT (index2 == (size_t)(-1));
+ ASSERT (index3 == (size_t)(-1));
+ }
+ else
+ {
+ ASSERT (index2 != (size_t)(-1));
+ ASSERT (index3 != (size_t)(-1));
+ ASSERT (gl_list_get_at (list1, index1) == obj);
+ ASSERT (gl_list_get_at (list2, index2) == obj);
+ ASSERT (gl_list_get_at (list3, index3) == obj);
+ ASSERT (index2 == index1);
+ ASSERT (index3 == index1);
+ }
+ }
+ break;
+ case 3: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, 0) == obj);
+ ASSERT (gl_list_get_at (list2, 0) == obj);
+ ASSERT (gl_list_get_at (list3, 0) == obj);
+ }
+ break;
+ case 4: /* add 1 element */
+ {
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_last (list1, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_last (list2, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_last (list3, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ ASSERT (gl_list_get_at (list1, gl_list_size (list1) - 1) == obj);
+ ASSERT (gl_list_get_at (list2, gl_list_size (list2) - 1) == obj);
+ ASSERT (gl_list_get_at (list3, gl_list_size (list3) - 1) == obj);
+ }
+ break;
+ case 5: /* add 3 elements */
+ {
+ const char *obj0 = RANDOM_OBJECT ();
+ const char *obj1 = RANDOM_OBJECT ();
+ const char *obj2 = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_first (list1, obj2);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_before (list1, node1, obj0);
+ ASSERT (node1 != NULL);
+ node1 = gl_list_nx_add_after (list1, node1, obj1);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_first (list2, obj2);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_before (list2, node2, obj0);
+ ASSERT (node2 != NULL);
+ node2 = gl_list_nx_add_after (list2, node2, obj1);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_first (list3, obj2);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_before (list3, node3, obj0);
+ ASSERT (node3 != NULL);
+ node3 = gl_list_nx_add_after (list3, node3, obj1);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_node_value (list1, node1) == obj1);
+ ASSERT (gl_list_node_value (list2, node2) == obj1);
+ ASSERT (gl_list_node_value (list3, node3) == obj1);
+ ASSERT (gl_list_get_at (list1, 0) == obj0);
+ ASSERT (gl_list_get_at (list1, 1) == obj1);
+ ASSERT (gl_list_get_at (list1, 2) == obj2);
+ ASSERT (gl_list_get_at (list2, 0) == obj0);
+ ASSERT (gl_list_get_at (list2, 1) == obj1);
+ ASSERT (gl_list_get_at (list2, 2) == obj2);
+ ASSERT (gl_list_get_at (list3, 0) == obj0);
+ ASSERT (gl_list_get_at (list3, 1) == obj1);
+ ASSERT (gl_list_get_at (list3, 2) == obj2);
+ }
+ break;
+ case 6: /* add 1 element */
+ {
+ size_t index = RANDOM (gl_list_size (list1) + 1);
+ const char *obj = RANDOM_OBJECT ();
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_nx_add_at (list1, index, obj);
+ ASSERT (node1 != NULL);
+ node2 = gl_list_nx_add_at (list2, index, obj);
+ ASSERT (node2 != NULL);
+ node3 = gl_list_nx_add_at (list3, index, obj);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_get_at (list1, index) == obj);
+ ASSERT (gl_list_node_value (list1, node1) == obj);
+ ASSERT (gl_list_get_at (list2, index) == obj);
+ ASSERT (gl_list_node_value (list2, node2) == obj);
+ ASSERT (gl_list_get_at (list3, index) == obj);
+ ASSERT (gl_list_node_value (list3, node3) == obj);
+ if (index > 0)
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_previous_node (list1, node1))
+ == gl_list_get_at (list1, index - 1));
+ ASSERT (gl_list_node_value (list2, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ ASSERT (gl_list_node_value (list3, gl_list_previous_node (list3, node3))
+ == gl_list_get_at (list2, index - 1));
+ }
+ if (index + 1 < gl_list_size (list1))
+ {
+ ASSERT (gl_list_node_value (list1, gl_list_next_node (list1, node1))
+ == gl_list_get_at (list1, index + 1));
+ ASSERT (gl_list_node_value (list2, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ ASSERT (gl_list_node_value (list3, gl_list_next_node (list3, node3))
+ == gl_list_get_at (list2, index + 1));
+ }
+ }
+ break;
+ case 7: case 8: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ gl_list_node_t node1, node2, node3;
+ node1 = gl_list_search (list1, obj);
+ node2 = gl_list_search (list2, obj);
+ node3 = gl_list_search (list3, obj);
+ ASSERT (node1 != NULL);
+ ASSERT (node2 != NULL);
+ ASSERT (node3 != NULL);
+ ASSERT (gl_list_remove_node (list1, node1));
+ ASSERT (gl_list_remove_node (list2, node2));
+ ASSERT (gl_list_remove_node (list3, node3));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 9: case 10: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ size_t index = RANDOM (n);
+ ASSERT (gl_list_remove_at (list1, index));
+ ASSERT (gl_list_remove_at (list2, index));
+ ASSERT (gl_list_remove_at (list3, index));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 11: case 12: /* remove 1 element */
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = gl_list_get_at (list1, RANDOM (n));
+ ASSERT (gl_list_remove (list1, obj));
+ ASSERT (gl_list_remove (list2, obj));
+ ASSERT (gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n - 1);
+ }
+ break;
+ case 13:
+ if (gl_list_size (list1) > 0)
+ {
+ size_t n = gl_list_size (list1);
+ const char *obj = "xyzzy";
+ ASSERT (!gl_list_remove (list1, obj));
+ ASSERT (!gl_list_remove (list2, obj));
+ ASSERT (!gl_list_remove (list3, obj));
+ ASSERT (gl_list_size (list1) == n);
+ }
+ break;
+ case 14:
+ {
+ size_t n = gl_list_size (list1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator (list1);
+ iter2 = gl_list_iterator (list2);
+ iter3 = gl_list_iterator (list3);
+ for (i = 0; i < n; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ case 15:
+ {
+ size_t end = RANDOM (gl_list_size (list1) + 1);
+ size_t start = RANDOM (end + 1);
+ gl_list_iterator_t iter1, iter2, iter3;
+ const void *elt;
+ iter1 = gl_list_iterator_from_to (list1, start, end);
+ iter2 = gl_list_iterator_from_to (list2, start, end);
+ iter3 = gl_list_iterator_from_to (list3, start, end);
+ for (i = start; i < end; i++)
+ {
+ ASSERT (gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (gl_list_get_at (list1, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (gl_list_get_at (list2, i) == elt);
+ ASSERT (gl_list_iterator_next (&iter3, &elt, NULL));
+ ASSERT (gl_list_get_at (list3, i) == elt);
+ }
+ ASSERT (!gl_list_iterator_next (&iter1, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter2, &elt, NULL));
+ ASSERT (!gl_list_iterator_next (&iter3, &elt, NULL));
+ gl_list_iterator_free (&iter1);
+ gl_list_iterator_free (&iter2);
+ gl_list_iterator_free (&iter3);
+ }
+ break;
+ }
+ check_all (list1, list2, list3);
+ }
+
+ gl_list_free (list1);
+ gl_list_free (list2);
+ gl_list_free (list3);
+ free (contents);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-read-file.c b/gnulib/tests/test-read-file.c
new file mode 100644
index 00000000..0a0bf688
--- /dev/null
+++ b/gnulib/tests/test-read-file.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2006-2007, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include "read-file.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#define FILE1 "/etc/resolv.conf"
+#define FILE2 "/dev/null"
+
+int
+main (void)
+{
+ struct stat statbuf;
+ int err = 0;
+
+ /* We can perform the test only if the file exists and is readable.
+ Test whether it exists, then assume it is world-readable. */
+ if (stat (FILE1, &statbuf) >= 0)
+ {
+ size_t len;
+ char *out = read_file (FILE1, &len);
+
+ if (!out)
+ {
+ perror ("Could not read file");
+ err = 1;
+ }
+ else
+ {
+ if (out[len] != '\0')
+ {
+ perror ("BAD: out[len] not zero");
+ err = 1;
+ }
+
+ /* Assume FILE1 is a regular file or a symlink to a regular file. */
+ if (len != statbuf.st_size)
+ {
+ fprintf (stderr, "Read %ld from %s...\n", (unsigned long) len, FILE1);
+ err = 1;
+ }
+ free (out);
+ }
+ }
+
+ /* We can perform the test only if the file exists and is readable.
+ Test whether it exists, then assume it is world-readable. */
+ if (stat (FILE2, &statbuf) >= 0)
+ {
+ size_t len;
+ char *out = read_file (FILE2, &len);
+
+ if (!out)
+ {
+ perror ("Could not read file");
+ err = 1;
+ }
+ else
+ {
+ if (out[len] != '\0')
+ {
+ perror ("BAD: out[len] not zero");
+ err = 1;
+ }
+
+ /* /dev/null should always be empty. Ignore statbuf.st_size, since it
+ is not a regular file. */
+ if (len != 0)
+ {
+ fprintf (stderr, "Read %ld from %s...\n", (unsigned long) len, FILE2);
+ err = 1;
+ }
+ free (out);
+ }
+ }
+
+ return err;
+}
diff --git a/gnulib/tests/test-readlink.c b/gnulib/tests/test-readlink.c
new file mode 100644
index 00000000..a144964f
--- /dev/null
+++ b/gnulib/tests/test-readlink.c
@@ -0,0 +1,48 @@
+/* Tests of readlink.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (readlink, ssize_t, (char const *, char *, size_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-readlink.t"
+
+#include "test-readlink.h"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_readlink (readlink, true);
+}
diff --git a/gnulib/tests/test-readlink.h b/gnulib/tests/test-readlink.h
new file mode 100644
index 00000000..1e482dfe
--- /dev/null
+++ b/gnulib/tests/test-readlink.h
@@ -0,0 +1,119 @@
+/* Tests of readlink.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+/* This file is designed to test both readlink(a,b,c) and
+ readlinkat(AT_FDCWD,a,b,c). FUNC is the function to test. Assumes
+ that BASE and ASSERT are already defined, and that appropriate
+ headers are already included. If PRINT, warn before skipping
+ symlink tests with status 77. */
+
+static int
+test_readlink (ssize_t (*func) (char const *, char *, size_t), bool print)
+{
+ char buf[80];
+
+ /* Sanity checks of failures. Mingw lacks symlink, but readlink can
+ still distinguish between various errors. */
+ memset (buf, 0xff, sizeof buf);
+ errno = 0;
+ ASSERT (func ("no_such", buf, sizeof buf) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("no_such/", buf, sizeof buf) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("", buf, sizeof buf) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (".", buf, sizeof buf) == -1);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ ASSERT (func ("./", buf, sizeof buf) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ errno = 0;
+ ASSERT (func (BASE "file", buf, sizeof buf) == -1);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ ASSERT (func (BASE "file/", buf, sizeof buf) == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Now test actual symlinks. */
+ if (symlink (BASE "dir", BASE "link"))
+ {
+ ASSERT (unlink (BASE "file") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ errno = 0;
+ ASSERT (func (BASE "link/", buf, sizeof buf) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (symlink (BASE "link", BASE "link2") == 0);
+ errno = 0;
+ ASSERT (func (BASE "link2/", buf, sizeof buf) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (unlink (BASE "link2") == 0);
+ ASSERT (symlink (BASE "file", BASE "link2") == 0);
+ errno = 0;
+ ASSERT (func (BASE "link2/", buf, sizeof buf) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (unlink (BASE "link2") == 0);
+ {
+ /* Up till now, no readlink has been successful, so buf should be
+ unchanged. */
+ int i;
+ for (i = 0; i < sizeof buf; i++)
+ ASSERT (buf[i] == (char) 0xff);
+ }
+ {
+ size_t len = strlen (BASE "dir");
+ /* When passing too small of a buffer, expect the truncated
+ length, or an ERANGE failure. However, a size of 0 is not
+ portable enough to test. */
+ ssize_t result;
+ errno = 0;
+ result = readlink (BASE "link", buf, 1);
+ if (result == -1)
+ {
+ ASSERT (errno == ERANGE);
+ ASSERT (buf[0] == (char) 0xff);
+ }
+ else
+ {
+ ASSERT (result == 1);
+ ASSERT (buf[0] == BASE[0]);
+ }
+ ASSERT (buf[1] == (char) 0xff);
+ ASSERT (func (BASE "link", buf, len) == len);
+ ASSERT (strncmp (buf, BASE "dir", len) == 0);
+ ASSERT (buf[len] == (char) 0xff);
+ ASSERT (func (BASE "link", buf, sizeof buf) == len);
+ ASSERT (strncmp (buf, BASE "dir", len) == 0);
+ /* POSIX says rest of buf is unspecified; but in practice, it is
+ either left alone, or NUL-terminated. */
+ ASSERT (buf[len] == '\0' || buf[len] == (char) 0xff);
+ }
+ ASSERT (rmdir (BASE "dir") == 0);
+ ASSERT (unlink (BASE "link") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-remainder.c b/gnulib/tests/test-remainder.c
new file mode 100644
index 00000000..50022e0e
--- /dev/null
+++ b/gnulib/tests/test-remainder.c
@@ -0,0 +1,42 @@
+/* Test of remainder() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (remainder, double, (double, double));
+
+#include "macros.h"
+
+volatile double x;
+volatile double y;
+double z;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 9.245907126;
+ y = 3.141592654;
+ z = remainder (x, y);
+ ASSERT (z >= -0.178870837 && z <= -0.178870835);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-remove.c b/gnulib/tests/test-remove.c
new file mode 100644
index 00000000..4dffcafa
--- /dev/null
+++ b/gnulib/tests/test-remove.c
@@ -0,0 +1,125 @@
+/* Tests of remove.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (remove, int, (char const *));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-remove.t"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Setup. */
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (close (creat (BASE "dir/file", 0600)) == 0);
+
+ /* Basic error conditions. */
+ errno = 0;
+ ASSERT (remove ("") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (remove ("nosuch") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (remove ("nosuch/") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (remove (".") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY);
+ /* Resulting errno after ".." or "/" is too varied to test; it is
+ reasonable to see any of EINVAL, EEXIST, ENOTEMPTY, EACCES. */
+ ASSERT (remove ("..") == -1);
+ ASSERT (remove ("/") == -1);
+ ASSERT (remove ("///") == -1);
+ errno = 0;
+ ASSERT (remove (BASE "dir/file/") == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Non-empty directory. */
+ errno = 0;
+ ASSERT (remove (BASE "dir") == -1);
+ ASSERT (errno == EEXIST || errno == ENOTEMPTY);
+
+ /* Non-directory. */
+ ASSERT (remove (BASE "dir/file") == 0);
+
+ /* Empty directory. */
+ errno = 0;
+ ASSERT (remove (BASE "dir/.//") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY);
+ ASSERT (remove (BASE "dir") == 0);
+
+ /* Test symlink behavior. Specifying trailing slash should remove
+ referent directory, or cause ENOTDIR failure, but not touch
+ symlink. */
+ if (symlink (BASE "dir", BASE "link") != 0)
+ {
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ errno = 0;
+ if (remove (BASE "link/") == 0)
+ {
+ struct stat st;
+ errno = 0;
+ ASSERT (stat (BASE "link", &st) == -1);
+ ASSERT (errno == ENOENT);
+ }
+ else
+ ASSERT (remove (BASE "dir") == 0);
+ {
+ struct stat st;
+ ASSERT (lstat (BASE "link", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+ }
+ ASSERT (remove (BASE "link") == 0);
+ /* Trailing slash on symlink to non-directory is an error. */
+ ASSERT (symlink (BASE "loop", BASE "loop") == 0);
+ errno = 0;
+ ASSERT (remove (BASE "loop/") == -1);
+ ASSERT (errno == ELOOP || errno == ENOTDIR);
+ ASSERT (remove (BASE "loop") == 0);
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ ASSERT (symlink (BASE "file", BASE "link") == 0);
+ errno = 0;
+ ASSERT (remove (BASE "link/") == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (remove (BASE "link") == 0);
+ ASSERT (remove (BASE "file") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-rename.c b/gnulib/tests/test-rename.c
new file mode 100644
index 00000000..c5c6c439
--- /dev/null
+++ b/gnulib/tests/test-rename.c
@@ -0,0 +1,46 @@
+/* Test of rename() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (rename, int, (char const *, char const *));
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-rename.t"
+
+#include "test-rename.h"
+
+int
+main (void)
+{
+ /* Remove any garbage left from previous partial runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_rename (rename, true);
+}
diff --git a/gnulib/tests/test-rename.h b/gnulib/tests/test-rename.h
new file mode 100644
index 00000000..9a3f4ecf
--- /dev/null
+++ b/gnulib/tests/test-rename.h
@@ -0,0 +1,446 @@
+/* Test of rename() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* This file is designed to test both rename(a,b) and
+ renameat(AT_FDCWD,a,AT_FDCWD,b). FUNC is the function to test.
+ Assumes that BASE and ASSERT are already defined, and that
+ appropriate headers are already included. If PRINT, warn before
+ skipping symlink tests with status 77. */
+
+static int
+test_rename (int (*func) (char const *, char const *), bool print)
+{
+ /* Setup. */
+ struct stat st;
+ int fd = creat (BASE "file", 0600);
+ ASSERT (0 <= fd);
+ ASSERT (write (fd, "hi", 2) == 2);
+ ASSERT (close (fd) == 0);
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+
+ /* Obvious errors. */
+
+ errno = 0; /* Missing source. */
+ ASSERT (func (BASE "missing", BASE "missing") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "missing/", BASE "missing") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "missing", BASE "missing/") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0; /* Empty operand. */
+ ASSERT (func ("", BASE "missing") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "file", "") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "", "") == -1);
+ ASSERT (errno == ENOENT);
+
+ /* Files. */
+ errno = 0; /* Trailing slash. */
+ ASSERT (func (BASE "file", BASE "file2/") == -1);
+ ASSERT (errno == ENOENT || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "file/", BASE "file2") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (stat (BASE "file2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (func (BASE "file", BASE "file2") == 0); /* Simple rename. */
+ errno = 0;
+ ASSERT (stat (BASE "file", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (stat (BASE "file2", &st) == 0);
+ ASSERT (st.st_size == 2);
+ ASSERT (close (creat (BASE "file", 0600)) == 0); /* Overwrite. */
+ errno = 0;
+ ASSERT (func (BASE "file2", BASE "file/") == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (func (BASE "file2", BASE "file") == 0);
+ memset (&st, 0, sizeof st);
+ ASSERT (stat (BASE "file", &st) == 0);
+ ASSERT (st.st_size == 2);
+ errno = 0;
+ ASSERT (stat (BASE "file2", &st) == -1);
+ ASSERT (errno == ENOENT);
+
+ /* Directories. */
+ ASSERT (func (BASE "dir", BASE "dir2/") == 0); /* Simple rename. */
+ errno = 0;
+ ASSERT (stat (BASE "dir", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (stat (BASE "dir2", &st) == 0);
+ ASSERT (func (BASE "dir2/", BASE "dir") == 0);
+ ASSERT (stat (BASE "dir", &st) == 0);
+ errno = 0;
+ ASSERT (stat (BASE "dir2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (func (BASE "dir", BASE "dir2") == 0);
+ errno = 0;
+ ASSERT (stat (BASE "dir", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (stat (BASE "dir2", &st) == 0);
+ ASSERT (mkdir (BASE "dir", 0700) == 0); /* Empty onto empty. */
+ ASSERT (func (BASE "dir2", BASE "dir") == 0);
+ ASSERT (mkdir (BASE "dir2", 0700) == 0);
+ ASSERT (func (BASE "dir2", BASE "dir/") == 0);
+ ASSERT (mkdir (BASE "dir2", 0700) == 0);
+ ASSERT (func (BASE "dir2/", BASE "dir") == 0);
+ ASSERT (mkdir (BASE "dir2", 0700) == 0);
+ ASSERT (close (creat (BASE "dir/file", 0600)) == 0); /* Empty onto full. */
+ errno = 0;
+ ASSERT (func (BASE "dir2", BASE "dir") == -1);
+ ASSERT (errno == EEXIST || errno == ENOTEMPTY);
+ errno = 0;
+ ASSERT (func (BASE "dir2/", BASE "dir") == -1);
+ ASSERT (errno == EEXIST || errno == ENOTEMPTY);
+ errno = 0;
+ ASSERT (func (BASE "dir2", BASE "dir/") == -1);
+ ASSERT (errno == EEXIST || errno == ENOTEMPTY);
+ ASSERT (func (BASE "dir", BASE "dir2") == 0); /* Full onto empty. */
+ errno = 0;
+ ASSERT (stat (BASE "dir", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (stat (BASE "dir2/file", &st) == 0);
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (func (BASE "dir2/", BASE "dir") == 0);
+ ASSERT (stat (BASE "dir/file", &st) == 0);
+ errno = 0;
+ ASSERT (stat (BASE "dir2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (mkdir (BASE "dir2", 0700) == 0);
+ ASSERT (func (BASE "dir", BASE "dir2/") == 0);
+ errno = 0;
+ ASSERT (stat (BASE "dir", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (stat (BASE "dir2/file", &st) == 0);
+ ASSERT (unlink (BASE "dir2/file") == 0);
+ errno = 0; /* Reject trailing dot. */
+ ASSERT (func (BASE "dir2", BASE "dir/.") == -1);
+ ASSERT (errno == EINVAL || errno == ENOENT);
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ errno = 0;
+ ASSERT (func (BASE "dir2", BASE "dir/.") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY || errno == EISDIR
+ || errno == ENOTEMPTY);
+ errno = 0;
+ ASSERT (func (BASE "dir2/.", BASE "dir") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY);
+ ASSERT (rmdir (BASE "dir") == 0);
+ errno = 0;
+ ASSERT (func (BASE "dir2", BASE "dir/.//") == -1);
+ ASSERT (errno == EINVAL || errno == ENOENT);
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ errno = 0;
+ ASSERT (func (BASE "dir2", BASE "dir/.//") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY || errno == EISDIR
+ || errno == ENOTEMPTY);
+ errno = 0;
+ ASSERT (func (BASE "dir2/.//", BASE "dir") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY);
+ ASSERT (rmdir (BASE "dir2") == 0);
+ errno = 0; /* Move into subdir. */
+ ASSERT (func (BASE "dir", BASE "dir/sub") == -1);
+ ASSERT (errno == EINVAL || errno == EACCES);
+ errno = 0;
+ ASSERT (stat (BASE "dir/sub", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (mkdir (BASE "dir/sub", 0700) == 0);
+ errno = 0;
+ ASSERT (func (BASE "dir", BASE "dir/sub") == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (stat (BASE "dir/sub", &st) == 0);
+ ASSERT (rmdir (BASE "dir/sub") == 0);
+
+ /* Mixing file and directory. */
+ errno = 0; /* File onto dir. */
+ ASSERT (func (BASE "file", BASE "dir") == -1);
+ ASSERT (errno == EISDIR || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "file", BASE "dir/") == -1);
+ ASSERT (errno == EISDIR || errno == ENOTDIR);
+ errno = 0; /* Dir onto file. */
+ ASSERT (func (BASE "dir", BASE "file") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "dir/", BASE "file") == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Hard links. */
+ ASSERT (func (BASE "file", BASE "file") == 0); /* File onto self. */
+ memset (&st, 0, sizeof st);
+ ASSERT (stat (BASE "file", &st) == 0);
+ ASSERT (st.st_size == 2);
+ ASSERT (func (BASE "dir", BASE "dir") == 0); /* Empty dir onto self. */
+ ASSERT (stat (BASE "dir", &st) == 0);
+ ASSERT (close (creat (BASE "dir/file", 0600)) == 0);
+ ASSERT (func (BASE "dir", BASE "dir") == 0); /* Full dir onto self. */
+ ASSERT (unlink (BASE "dir/file") == 0);
+ {
+ /* Not all file systems support link. Mingw doesn't have
+ reliable st_nlink on hard links, but our implementation does
+ fail with EPERM on poor file systems, and we can detect the
+ inferior stat() via st_ino. Cygwin 1.5.x copies rather than
+ links files on those file systems, but there, st_nlink and
+ st_ino are reliable. */
+ int ret = link (BASE "file", BASE "file2");
+ if (!ret)
+ {
+ memset (&st, 0, sizeof st);
+ ASSERT (stat (BASE "file2", &st) == 0);
+ if (st.st_ino && st.st_nlink != 2)
+ {
+ ASSERT (unlink (BASE "file2") == 0);
+ errno = EPERM;
+ ret = -1;
+ }
+ }
+ if (ret == -1)
+ {
+ /* If the device does not support hard links, errno is
+ EPERM on Linux, EOPNOTSUPP on FreeBSD. */
+ switch (errno)
+ {
+ case EPERM:
+ case EOPNOTSUPP:
+ if (print)
+ fputs ("skipping test: "
+ "hard links not supported on this file system\n",
+ stderr);
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ return 77;
+ default:
+ perror ("link");
+ return 1;
+ }
+ }
+ ASSERT (ret == 0);
+ }
+ ASSERT (func (BASE "file", BASE "file2") == 0); /* File onto hard link. */
+ memset (&st, 0, sizeof st);
+ ASSERT (stat (BASE "file", &st) == 0);
+ ASSERT (st.st_size == 2);
+ memset (&st, 0, sizeof st);
+ ASSERT (stat (BASE "file2", &st) == 0);
+ ASSERT (st.st_size == 2);
+ ASSERT (unlink (BASE "file2") == 0);
+
+ /* Symlinks. */
+ if (symlink (BASE "file", BASE "link1"))
+ {
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ return 77;
+ }
+ ASSERT (func (BASE "link1", BASE "link2") == 0); /* Simple rename. */
+ ASSERT (stat (BASE "file", &st) == 0);
+ errno = 0;
+ ASSERT (lstat (BASE "link1", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link2", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+ ASSERT (symlink (BASE "nowhere", BASE "link1") == 0); /* Overwrite. */
+ ASSERT (func (BASE "link2", BASE "link1") == 0);
+ memset (&st, 0, sizeof st);
+ ASSERT (stat (BASE "link1", &st) == 0);
+ ASSERT (st.st_size == 2);
+ errno = 0;
+ ASSERT (lstat (BASE "link2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (symlink (BASE "link2", BASE "link2") == 0); /* Symlink loop. */
+ ASSERT (func (BASE "link2", BASE "link2") == 0);
+ errno = 0;
+ ASSERT (func (BASE "link2/", BASE "link2") == -1);
+ ASSERT (errno == ELOOP || errno == ENOTDIR);
+ ASSERT (func (BASE "link2", BASE "link3") == 0);
+ ASSERT (unlink (BASE "link3") == 0);
+ ASSERT (symlink (BASE "nowhere", BASE "link2") == 0); /* Dangling link. */
+ ASSERT (func (BASE "link2", BASE "link3") == 0);
+ errno = 0;
+ ASSERT (lstat (BASE "link2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link3", &st) == 0);
+ errno = 0; /* Trailing slash on dangling. */
+ ASSERT (func (BASE "link3/", BASE "link2") == -1);
+ ASSERT (errno == ENOENT || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "link3", BASE "link2/") == -1);
+ ASSERT (errno == ENOENT || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (lstat (BASE "link2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link3", &st) == 0);
+ errno = 0; /* Trailing slash on link to file. */
+ ASSERT (func (BASE "link1/", BASE "link2") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "link1", BASE "link3/") == -1);
+ ASSERT (errno == ENOENT || errno == ENOTDIR);
+
+ /* Mixing symlink and file. */
+ ASSERT (close (creat (BASE "file2", 0600)) == 0); /* File onto link. */
+ ASSERT (func (BASE "file2", BASE "link3") == 0);
+ errno = 0;
+ ASSERT (stat (BASE "file2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link3", &st) == 0);
+ ASSERT (S_ISREG (st.st_mode));
+ ASSERT (unlink (BASE "link3") == 0);
+ ASSERT (symlink (BASE "nowhere", BASE "link2") == 0); /* Link onto file. */
+ ASSERT (close (creat (BASE "file2", 0600)) == 0);
+ ASSERT (func (BASE "link2", BASE "file2") == 0);
+ errno = 0;
+ ASSERT (lstat (BASE "link2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "file2", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+ ASSERT (unlink (BASE "file2") == 0);
+ errno = 0; /* Trailing slash. */
+ ASSERT (func (BASE "file/", BASE "link1") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "file", BASE "link1/") == -1);
+ ASSERT (errno == ENOTDIR || errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "link1/", BASE "file") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "link1", BASE "file/") == -1);
+ ASSERT (errno == ENOTDIR || errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "file", &st) == 0);
+ ASSERT (S_ISREG (st.st_mode));
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link1", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+
+ /* Mixing symlink and directory. */
+ errno = 0; /* Directory onto link. */
+ ASSERT (func (BASE "dir", BASE "link1") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "dir/", BASE "link1") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "dir", BASE "link1/") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0; /* Link onto directory. */
+ ASSERT (func (BASE "link1", BASE "dir") == -1);
+ ASSERT (errno == EISDIR || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "link1", BASE "dir/") == -1);
+ ASSERT (errno == EISDIR || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func (BASE "link1/", BASE "dir") == -1);
+ ASSERT (errno == ENOTDIR);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link1", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "dir", &st) == 0);
+ ASSERT (S_ISDIR (st.st_mode));
+
+ /* POSIX requires rename("link-to-dir/","other") to rename "dir" and
+ leave "link-to-dir" dangling, but GNU rejects this. POSIX
+ requires rename("dir","dangling/") to create the directory so
+ that "dangling/" now resolves, but GNU rejects this. While we
+ prefer GNU behavior, we don't enforce it. However, we do test
+ that the system either follows POSIX in both cases, or follows
+ GNU. */
+ {
+ int result;
+ ASSERT (symlink (BASE "dir2", BASE "link2") == 0);
+ errno = 0;
+ result = func (BASE "dir", BASE "link2/");
+ if (result == 0)
+ {
+ /* POSIX. */
+ errno = 0;
+ ASSERT (lstat (BASE "dir", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "dir2", &st) == 0);
+ ASSERT (S_ISDIR (st.st_mode));
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link2", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+ ASSERT (func (BASE "link2/", BASE "dir") == 0);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "dir", &st) == 0);
+ ASSERT (S_ISDIR (st.st_mode));
+ errno = 0;
+ ASSERT (lstat (BASE "dir2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link2", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+ }
+ else
+ {
+ /* GNU. */
+ ASSERT (result == -1);
+ ASSERT (errno == ENOTDIR);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "dir", &st) == 0);
+ ASSERT (S_ISDIR (st.st_mode));
+ errno = 0;
+ ASSERT (lstat (BASE "dir2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link2", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+ ASSERT (unlink (BASE "link2") == 0);
+ ASSERT (symlink (BASE "dir", BASE "link2") == 0);
+ errno = 0; /* OpenBSD notices that link2/ and dir are the same. */
+ result = func (BASE "link2/", BASE "dir");
+ if (result) /* GNU/Linux rejects attempts to use link2/. */
+ {
+ ASSERT (result == -1);
+ ASSERT (errno == ENOTDIR);
+ }
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "dir", &st) == 0);
+ ASSERT (S_ISDIR (st.st_mode));
+ errno = 0;
+ ASSERT (lstat (BASE "dir2", &st) == -1);
+ ASSERT (errno == ENOENT);
+ memset (&st, 0, sizeof st);
+ ASSERT (lstat (BASE "link2", &st) == 0);
+ ASSERT (S_ISLNK (st.st_mode));
+ }
+ }
+
+ /* Clean up. */
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ ASSERT (unlink (BASE "link1") == 0);
+ ASSERT (unlink (BASE "link2") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-renameat.c b/gnulib/tests/test-renameat.c
new file mode 100644
index 00000000..e5fefa1f
--- /dev/null
+++ b/gnulib/tests/test-renameat.c
@@ -0,0 +1,179 @@
+/* Tests of renameat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (renameat, int, (int, char const *, int, char const *));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "filenamecat.h"
+#include "xgetcwd.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-renameat.t"
+
+#include "test-rename.h"
+
+static int dfd1 = AT_FDCWD;
+static int dfd2 = AT_FDCWD;
+
+/* Wrapper to test renameat like rename. */
+static int
+do_rename (char const *name1, char const *name2)
+{
+ return renameat (dfd1, name1, dfd2, name2);
+}
+
+int
+main (void)
+{
+ int i;
+ int dfd;
+ char *cwd;
+ int result;
+
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Test basic rename functionality, using current directory. */
+ result = test_rename (do_rename, false);
+ dfd1 = open (".", O_RDONLY);
+ ASSERT (0 <= dfd1);
+ ASSERT (test_rename (do_rename, false) == result);
+ dfd2 = dfd1;
+ ASSERT (test_rename (do_rename, false) == result);
+ dfd1 = AT_FDCWD;
+ ASSERT (test_rename (do_rename, false) == result);
+ ASSERT (close (dfd2) == 0);
+
+ /* Create locations to manipulate. */
+ ASSERT (mkdir (BASE "sub1", 0700) == 0);
+ ASSERT (mkdir (BASE "sub2", 0700) == 0);
+ dfd = creat (BASE "00", 0600);
+ ASSERT (0 <= dfd);
+ ASSERT (close (dfd) == 0);
+ cwd = xgetcwd ();
+
+ dfd = open (BASE "sub1", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (chdir (BASE "sub2") == 0);
+
+ /* There are 16 possible scenarios, based on whether an fd is
+ AT_FDCWD or real, and whether a file is absolute or relative.
+
+ To ensure that we test all of the code paths (rather than
+ triggering early normalization optimizations), we use a loop to
+ repeatedly rename a file in the parent directory, use an fd open
+ on subdirectory 1, all while executing in subdirectory 2; all
+ relative names are thus given with a leading "../". Finally, the
+ last scenario (two relative paths given, neither one AT_FDCWD)
+ has two paths, based on whether the two fds are equivalent, so we
+ do the other variant after the loop. */
+ for (i = 0; i < 16; i++)
+ {
+ int fd1 = (i & 8) ? dfd : AT_FDCWD;
+ char *file1 = file_name_concat ((i & 4) ? ".." : cwd, BASE "xx", NULL);
+ int fd2 = (i & 2) ? dfd : AT_FDCWD;
+ char *file2 = file_name_concat ((i & 1) ? ".." : cwd, BASE "xx", NULL);
+
+ ASSERT (sprintf (strchr (file1, '\0') - 2, "%02d", i) == 2);
+ ASSERT (sprintf (strchr (file2, '\0') - 2, "%02d", i + 1) == 2);
+ ASSERT (renameat (fd1, file1, fd2, file2) == 0);
+ free (file1);
+ free (file2);
+ }
+ dfd2 = open ("..", O_RDONLY);
+ ASSERT (0 <= dfd2);
+ ASSERT (renameat (dfd, "../" BASE "16", dfd2, BASE "17") == 0);
+ ASSERT (close (dfd2) == 0);
+
+ /* Now we change back to the parent directory, and set dfd to ".";
+ using dfd in remaining tests will expose any bugs if emulation
+ via /proc/self/fd doesn't check for empty names. */
+ ASSERT (chdir ("..") == 0);
+ ASSERT (close (dfd) == 0);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+
+ ASSERT (close (creat (BASE "sub2/file", 0600)) == 0);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "sub1", dfd, BASE "sub2") == -1);
+ ASSERT (errno == EEXIST || errno == ENOTEMPTY);
+ ASSERT (unlink (BASE "sub2/file") == 0);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "sub2", dfd, BASE "sub1/.") == -1);
+ ASSERT (errno == EINVAL || errno == EISDIR || errno == EBUSY
+ || errno == ENOTEMPTY);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "sub2/.", dfd, BASE "sub1") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "17", dfd, BASE "sub1") == -1);
+ ASSERT (errno == EISDIR);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "nosuch", dfd, BASE "18") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (renameat (dfd, "", dfd, BASE "17") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "17", dfd, "") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "sub2", dfd, BASE "17") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "17/", dfd, BASE "18") == -1);
+ ASSERT (errno == ENOTDIR);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "17", dfd, BASE "18/") == -1);
+ ASSERT (errno == ENOTDIR || errno == ENOENT);
+
+ /* Finally, make sure we can overwrite existing files. */
+ ASSERT (close (creat (BASE "sub2/file", 0600)) == 0);
+ errno = 0;
+ ASSERT (renameat (dfd, BASE "sub2", dfd, BASE "sub1") == 0);
+ ASSERT (renameat (dfd, BASE "sub1/file", dfd, BASE "17") == 0);
+
+ /* Cleanup. */
+ ASSERT (close (dfd) == 0);
+ errno = 0;
+ ASSERT (unlink (BASE "sub1/file") == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (unlink (BASE "17") == 0);
+ ASSERT (rmdir (BASE "sub1") == 0);
+ errno = 0;
+ ASSERT (rmdir (BASE "sub2") == -1);
+ ASSERT (errno == ENOENT);
+ free (cwd);
+
+ if (result)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return result;
+}
diff --git a/gnulib/tests/test-rijndael.c b/gnulib/tests/test-rijndael.c
new file mode 100644
index 00000000..e27a9dbb
--- /dev/null
+++ b/gnulib/tests/test-rijndael.c
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "rijndael-api-fst.h"
+
+int
+main (int argc, char *argv[])
+{
+ int rc;
+ rijndaelKeyInstance key;
+ rijndaelCipherInstance cipher;
+ char in[RIJNDAEL_BITSPERBLOCK / 8];
+ char out[RIJNDAEL_BITSPERBLOCK / 8];
+ char pt[] = "\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00";
+ char ct[] = "\xC3\x4C\x05\x2C\xC0\xDA\x8D\x73"
+ "\x45\x1A\xFE\x5F\x03\xBE\x29\x7F";
+ size_t i;
+
+ rc = rijndaelMakeKey (&key, RIJNDAEL_DIR_ENCRYPT,
+ 128, "00000000000000000000000000000000");
+ if (rc != 0)
+ printf ("makeKey failed %d\n", rc);
+
+ rc = rijndaelCipherInit (&cipher, RIJNDAEL_MODE_ECB, NULL);
+ if (rc != 0)
+ printf ("cipherInit failed %d\n", rc);
+
+ memset (in, 0, RIJNDAEL_BITSPERBLOCK / 8);
+
+ for (i = 0; i < 10000; i++)
+ {
+ rc = rijndaelBlockEncrypt (&cipher, &key, in, 128, out);
+ if (rc < 0)
+ printf ("blockEncrypt failed %d\n", rc);
+
+ memcpy (in, out, RIJNDAEL_BITSPERBLOCK / 8);
+ }
+
+ if (memcmp (out, ct, RIJNDAEL_BITSPERBLOCK / 8) != 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < RIJNDAEL_BITSPERBLOCK / 8; i++)
+ printf ("%02x ", ct[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < RIJNDAEL_BITSPERBLOCK / 8; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ rc = rijndaelMakeKey (&key, RIJNDAEL_DIR_DECRYPT,
+ 128, "00000000000000000000000000000000");
+ if (rc != 0)
+ printf ("makeKey failed %d\n", rc);
+
+ rc = rijndaelCipherInit (&cipher, RIJNDAEL_MODE_ECB, NULL);
+ if (rc != 0)
+ printf ("cipherInit failed %d\n", rc);
+
+ for (i = 0; i < 10000; i++)
+ {
+ memcpy (in, out, RIJNDAEL_BITSPERBLOCK / 8);
+
+ rc = rijndaelBlockDecrypt (&cipher, &key, in, 128, out);
+ if (rc < 0)
+ printf ("blockEncrypt failed %d\n", rc);
+ }
+
+ if (memcmp (out, pt, RIJNDAEL_BITSPERBLOCK / 8) != 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < RIJNDAEL_BITSPERBLOCK / 8; i++)
+ printf ("%02x ", pt[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < RIJNDAEL_BITSPERBLOCK / 8; i++)
+ printf ("%02x ", out[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-rint.c b/gnulib/tests/test-rint.c
new file mode 100644
index 00000000..a2b26da2
--- /dev/null
+++ b/gnulib/tests/test-rint.c
@@ -0,0 +1,61 @@
+/* Test of rint() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (rint, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* Assume round-to-nearest rounding (the default in IEEE 754). */
+
+ x = 2.1;
+ y = rint (x);
+ ASSERT (y == 2.0);
+
+ x = -2.1;
+ y = rint (x);
+ ASSERT (y == -2.0);
+
+ x = 2.7;
+ y = rint (x);
+ ASSERT (y == 3.0);
+
+ x = -2.7;
+ y = rint (x);
+ ASSERT (y == -3.0);
+
+ x = 2.5;
+ y = rint (x);
+ ASSERT (y == 2.0);
+
+ x = 3.5;
+ y = rint (x);
+ ASSERT (y == 4.0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-rmdir.c b/gnulib/tests/test-rmdir.c
new file mode 100644
index 00000000..7b1ef37d
--- /dev/null
+++ b/gnulib/tests/test-rmdir.c
@@ -0,0 +1,47 @@
+/* Tests of rmdir.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (rmdir, int, (char const *));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-rmdir.t"
+
+#include "test-rmdir.h"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_rmdir_func (rmdir, true);
+}
diff --git a/gnulib/tests/test-rmdir.h b/gnulib/tests/test-rmdir.h
new file mode 100644
index 00000000..6d5d56ef
--- /dev/null
+++ b/gnulib/tests/test-rmdir.h
@@ -0,0 +1,101 @@
+/* Tests of rmdir.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+/* This file is designed to test both rmdir(n) and
+ unlinkat(AT_FDCWD,n,AT_REMOVEDIR). FUNC is the function to test.
+ Assumes that BASE and ASSERT are already defined, and that
+ appropriate headers are already included. If PRINT, then warn
+ before returning status 77 when symlinks are unsupported. */
+
+static int
+test_rmdir_func (int (*func) (char const *name), bool print)
+{
+ /* Setup. */
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (close (creat (BASE "dir/file", 0600)) == 0);
+
+ /* Basic error conditions. */
+ errno = 0;
+ ASSERT (func ("") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "nosuch") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "nosuch/") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (".") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY);
+ /* Resulting errno after ".." or "/" is too varied to test; it is
+ reasonable to see any of EINVAL, EBUSY, EEXIST, ENOTEMPTY,
+ EACCES, EPERM. */
+ ASSERT (func ("..") == -1);
+ ASSERT (func ("/") == -1);
+ ASSERT (func ("///") == -1);
+ errno = 0;
+ ASSERT (func (BASE "dir/file/") == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Non-empty directory. */
+ errno = 0;
+ ASSERT (func (BASE "dir") == -1);
+ ASSERT (errno == EEXIST || errno == ENOTEMPTY);
+
+ /* Non-directory. */
+ errno = 0;
+ ASSERT (func (BASE "dir/file") == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Empty directory. */
+ ASSERT (unlink (BASE "dir/file") == 0);
+ errno = 0;
+ ASSERT (func (BASE "dir/.//") == -1);
+ ASSERT (errno == EINVAL || errno == EBUSY);
+ ASSERT (func (BASE "dir") == 0);
+
+ /* Test symlink behavior. Specifying trailing slash should remove
+ referent directory (POSIX), or cause ENOTDIR failure (Linux), but
+ not touch symlink. We prefer the Linux behavior for its
+ intuitiveness (especially compared to rmdir("symlink-to-file/")),
+ but not enough to penalize POSIX systems with an rpl_rmdir. */
+ if (symlink (BASE "dir", BASE "link") != 0)
+ {
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ errno = 0;
+ if (func (BASE "link/") == 0)
+ {
+ struct stat st;
+ errno = 0;
+ ASSERT (stat (BASE "link", &st) == -1);
+ ASSERT (errno == ENOENT);
+ }
+ else
+ {
+ ASSERT (errno == ENOTDIR);
+ ASSERT (func (BASE "dir") == 0);
+ }
+ ASSERT (unlink (BASE "link") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-round1.c b/gnulib/tests/test-round1.c
new file mode 100644
index 00000000..5e20d1b6
--- /dev/null
+++ b/gnulib/tests/test-round1.c
@@ -0,0 +1,75 @@
+/* Test of rounding to nearest, breaking ties away from zero.
+ Copyright (C) 2007-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2007.
+ Based heavily on Bruno Haible's test-trunc.c. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (round, double, (double));
+
+#include "isnand-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zero instead. */
+double zero = 0.0;
+
+int
+main ()
+{
+ /* Zero. */
+ ASSERT (round (0.0) == 0.0);
+ ASSERT (round (-zero) == 0.0);
+ /* Positive numbers. */
+ ASSERT (round (0.3) == 0.0);
+ ASSERT (round (0.5) == 1.0);
+ ASSERT (round (0.7) == 1.0);
+ ASSERT (round (1.0) == 1.0);
+ ASSERT (round (1.5) == 2.0);
+ ASSERT (round (2.5) == 3.0);
+ ASSERT (round (1.999) == 2.0);
+ ASSERT (round (2.0) == 2.0);
+ ASSERT (round (65535.999) == 65536.0);
+ ASSERT (round (65536.0) == 65536.0);
+ ASSERT (round (65536.001) == 65536.0);
+ ASSERT (round (2.341e31) == 2.341e31);
+ /* Negative numbers. */
+ ASSERT (round (-0.3) == 0.0);
+ ASSERT (round (-0.5) == -1.0);
+ ASSERT (round (-0.7) == -1.0);
+ ASSERT (round (-1.0) == -1.0);
+ ASSERT (round (-1.5) == -2.0);
+ ASSERT (round (-2.5) == -3.0);
+ ASSERT (round (-1.999) == -2.0);
+ ASSERT (round (-2.0) == -2.0);
+ ASSERT (round (-65535.999) == -65536.0);
+ ASSERT (round (-65536.0) == -65536.0);
+ ASSERT (round (-65536.001) == -65536.0);
+ ASSERT (round (-2.341e31) == -2.341e31);
+ /* Infinite numbers. */
+ ASSERT (round (1.0 / 0.0) == 1.0 / 0.0);
+ ASSERT (round (-1.0 / 0.0) == -1.0 / 0.0);
+ /* NaNs. */
+ ASSERT (isnand (round (NaNd ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-round2.c b/gnulib/tests/test-round2.c
new file mode 100644
index 00000000..cad256d1
--- /dev/null
+++ b/gnulib/tests/test-round2.c
@@ -0,0 +1,108 @@
+/* Test of rounding to nearest, breaking ties away from zero.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2007.
+ Heavily based on code by Bruno Haible. */
+
+/* Get the two reference implementations of round under the names
+ round_reference1 and round_reference2.
+
+ round.c will #include <config.h> for us. */
+#define FLOOR_BASED_ROUND round_reference1
+#define FLOOR_FREE_ROUND round_reference2
+#include "round.c"
+
+#include <math.h>
+#include <float.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "verify.h"
+
+#ifdef USE_LONG_DOUBLE
+# error Long double not supported.
+#elif ! defined USE_FLOAT
+# include "isnand-nolibm.h"
+# define ISNAN isnand
+# define FUNCTION "round"
+# define DOUBLE_UINT uint64_t
+# define DOUBLE_BITS 64
+# define NUM_HIGHBITS 13
+# define NUM_LOWBITS 4
+#else /* defined USE_FLOAT */
+# include "isnanf-nolibm.h"
+# define ISNAN isnanf
+# define FUNCTION "roundf"
+# define DOUBLE_UINT uint32_t
+# define DOUBLE_BITS 32
+# define NUM_HIGHBITS 12
+# define NUM_LOWBITS 4
+#endif
+
+/* Test for equality. */
+static bool
+equal (const char *message, DOUBLE x, DOUBLE y0, DOUBLE y1)
+{
+ if (ISNAN (y0) ? ISNAN (y1) : y0 == y1)
+ return true;
+ else
+ {
+ fprintf (stderr, "%s: "FUNCTION"(%g(%a)) = %g(%a) or %g(%a)?\n",
+ message, x, x, y0, y0, y1, y1);
+ return false;
+ }
+}
+
+/* Test the function for a given argument. */
+static bool
+check (DOUBLE x)
+{
+ DOUBLE ref1 = round_reference1 (x);
+ DOUBLE ref2 = round_reference2 (x);
+ DOUBLE result = ROUND (x);
+
+ /* If the reference implementations disagree, bail out immediately. */
+ if (!equal ("reference implementations disagree", x, ref1, ref2))
+ exit (EXIT_FAILURE);
+
+ /* If the actual implementation is wrong, return an error code. */
+ return equal ("bad round implementation", x, ref1, result);
+}
+
+int
+main (void)
+{
+ DOUBLE_UINT highbits, lowbits;
+ int error = 0;
+ for (highbits = 0; highbits < (1 << NUM_HIGHBITS); highbits++)
+ for (lowbits = 0; lowbits < (1 << NUM_LOWBITS); lowbits++)
+ {
+ /* Combine highbits and lowbits into a floating-point number,
+ sign-extending the lowbits to DOUBLE_BITS-NUM_HIGHBITS bits. */
+ union { DOUBLE f; DOUBLE_UINT i; } janus;
+ verify (sizeof janus.f == sizeof janus.i);
+ janus.i = lowbits | (highbits << (DOUBLE_BITS - NUM_HIGHBITS));
+ if (lowbits >> (NUM_LOWBITS - 1))
+ janus.i |= ((DOUBLE_UINT) -1
+ >> (NUM_LOWBITS + NUM_HIGHBITS)
+ << NUM_LOWBITS);
+ if (!check (janus.f))
+ error = true;
+ }
+ return (error ? 1 : 0);
+}
diff --git a/gnulib/tests/test-roundf1.c b/gnulib/tests/test-roundf1.c
new file mode 100644
index 00000000..62c580ea
--- /dev/null
+++ b/gnulib/tests/test-roundf1.c
@@ -0,0 +1,75 @@
+/* Test of rounding to nearest, breaking ties away from zero.
+ Copyright (C) 2007, 2008, 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2007.
+ Based heavily on Bruno Haible's test-truncf.c. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (roundf, float, (float));
+
+#include "isnanf-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0f.
+ So we use -zero instead. */
+float zero = 0.0f;
+
+int
+main ()
+{
+ /* Zero. */
+ ASSERT (roundf (0.0f) == 0.0f);
+ ASSERT (roundf (-zero) == 0.0f);
+ /* Positive numbers. */
+ ASSERT (roundf (0.3f) == 0.0f);
+ ASSERT (roundf (0.5f) == 1.0f);
+ ASSERT (roundf (0.7f) == 1.0f);
+ ASSERT (roundf (1.0f) == 1.0f);
+ ASSERT (roundf (1.5f) == 2.0f);
+ ASSERT (roundf (2.5f) == 3.0f);
+ ASSERT (roundf (1.999f) == 2.0f);
+ ASSERT (roundf (2.0f) == 2.0f);
+ ASSERT (roundf (65535.99f) == 65536.0f);
+ ASSERT (roundf (65536.0f) == 65536.0f);
+ ASSERT (roundf (65536.01f) == 65536.0f);
+ ASSERT (roundf (2.341e31f) == 2.341e31f);
+ /* Negative numbers. */
+ ASSERT (roundf (-0.3f) == 0.0f);
+ ASSERT (roundf (-0.5f) == -1.0f);
+ ASSERT (roundf (-0.7f) == -1.0f);
+ ASSERT (roundf (-1.0f) == -1.0f);
+ ASSERT (roundf (-1.5f) == -2.0f);
+ ASSERT (roundf (-2.5f) == -3.0f);
+ ASSERT (roundf (-1.999f) == -2.0f);
+ ASSERT (roundf (-2.0f) == -2.0f);
+ ASSERT (roundf (-65535.99f) == -65536.0f);
+ ASSERT (roundf (-65536.0f) == -65536.0f);
+ ASSERT (roundf (-65536.01f) == -65536.0f);
+ ASSERT (roundf (-2.341e31f) == -2.341e31f);
+ /* Infinite numbers. */
+ ASSERT (roundf (1.0 / 0.0f) == 1.0 / 0.0f);
+ ASSERT (roundf (-1.0 / 0.0f) == -1.0 / 0.0f);
+ /* NaNs. */
+ ASSERT (isnanf (roundf (NaNf ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-roundf2.c b/gnulib/tests/test-roundf2.c
new file mode 100644
index 00000000..5688d933
--- /dev/null
+++ b/gnulib/tests/test-roundf2.c
@@ -0,0 +1,2 @@
+#define USE_FLOAT
+#include "test-round2.c"
diff --git a/gnulib/tests/test-roundl.c b/gnulib/tests/test-roundl.c
new file mode 100644
index 00000000..fca60f05
--- /dev/null
+++ b/gnulib/tests/test-roundl.c
@@ -0,0 +1,94 @@
+/* Test of rounding to nearest, breaking ties away from zero.
+ Copyright (C) 2007-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2007.
+ Based heavily on Bruno Haible's test-truncl.c. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (roundl, long double, (long double));
+
+#include <float.h>
+
+#include "fpucw.h"
+#include "isnanl-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zero instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zero (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+long double minus_zero = -0.0L;
+#endif
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* Zero. */
+ ASSERT (roundl (0.0L) == 0.0L);
+ ASSERT (roundl (minus_zero) == 0.0L);
+ /* Positive numbers. */
+ ASSERT (roundl (0.3L) == 0.0L);
+ ASSERT (roundl (0.5L) == 1.0L);
+ ASSERT (roundl (0.7L) == 1.0L);
+ ASSERT (roundl (1.0L) == 1.0L);
+ ASSERT (roundl (1.5L) == 2.0L);
+ ASSERT (roundl (2.5L) == 3.0L);
+ ASSERT (roundl (1.999L) == 2.0L);
+ ASSERT (roundl (2.0L) == 2.0L);
+ ASSERT (roundl (65535.999L) == 65536.0L);
+ ASSERT (roundl (65536.0L) == 65536.0L);
+ ASSERT (roundl (65536.001L) == 65536.0L);
+ ASSERT (roundl (2.341e31L) == 2.341e31L);
+ /* Negative numbers. */
+ ASSERT (roundl (-0.3L) == 0.0L);
+ ASSERT (roundl (-0.5L) == -1.0L);
+ ASSERT (roundl (-0.7L) == -1.0L);
+ ASSERT (roundl (-1.0L) == -1.0L);
+ ASSERT (roundl (-1.5L) == -2.0L);
+ ASSERT (roundl (-2.5L) == -3.0L);
+ ASSERT (roundl (-1.999L) == -2.0L);
+ ASSERT (roundl (-2.0L) == -2.0L);
+ ASSERT (roundl (-65535.999L) == -65536.0L);
+ ASSERT (roundl (-65536.0L) == -65536.0L);
+ ASSERT (roundl (-65536.001L) == -65536.0L);
+ ASSERT (roundl (-2.341e31L) == -2.341e31L);
+ /* Infinite numbers. */
+ ASSERT (roundl (1.0 / 0.0L) == 1.0 / 0.0L);
+ ASSERT (roundl (-1.0 / 0.0L) == -1.0 / 0.0L);
+ /* NaNs. */
+ ASSERT (isnanl (roundl (NaNl ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-safe-alloc.c b/gnulib/tests/test-safe-alloc.c
new file mode 100644
index 00000000..fba6eec4
--- /dev/null
+++ b/gnulib/tests/test-safe-alloc.c
@@ -0,0 +1,55 @@
+/*
+ * Test the safe-alloc macros
+ *
+ * Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: David Lutterkort <lutter@redhat.com>
+ */
+
+#include <config.h>
+
+#include "safe-alloc.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ struct tst
+ {
+ int a;
+ int b;
+ };
+
+ struct tst *p = NULL;
+ int r;
+
+ r = ALLOC (p);
+ ASSERT (r >= 0);
+
+ ASSERT (p->a == 0 && p->b == 0);
+
+ p->a = p->b = 42;
+ r = REALLOC_N (p, 5);
+
+ ASSERT (p[0].a == 42 && p[0].b == 42);
+
+ FREE (p);
+ ASSERT (p == NULL);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sameacls.c b/gnulib/tests/test-sameacls.c
new file mode 100644
index 00000000..7dcec2ae
--- /dev/null
+++ b/gnulib/tests/test-sameacls.c
@@ -0,0 +1,527 @@
+/* Test whether two files have the same ACLs.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if HAVE_ACL_GET_FILE || HAVE_ACL || HAVE_ACLX_GET || HAVE_STATACL
+# include <sys/types.h>
+# include <sys/acl.h>
+#endif
+
+#include "progname.h"
+#include "read-file.h"
+#include "xalloc.h"
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ const char *file1;
+ const char *file2;
+
+ set_program_name (argv[0]);
+
+ ASSERT (argc == 3);
+
+ file1 = argv[1];
+ file2 = argv[2];
+
+ /* Compare the contents of the two files. */
+ {
+ size_t size1;
+ char *contents1;
+ size_t size2;
+ char *contents2;
+
+ contents1 = read_file (file1, &size1);
+ if (contents1 == NULL)
+ {
+ fprintf (stderr, "error reading file %s: errno = %d\n", file1, errno);
+ fflush (stderr);
+ abort ();
+ }
+ contents2 = read_file (file2, &size2);
+ if (contents2 == NULL)
+ {
+ fprintf (stderr, "error reading file %s: errno = %d\n", file2, errno);
+ fflush (stderr);
+ abort ();
+ }
+
+ if (size2 != size1)
+ {
+ fprintf (stderr, "files %s and %s have different sizes\n",
+ file1, file2);
+ fflush (stderr);
+ abort ();
+ }
+ if (memcmp (contents1, contents2, size1) != 0)
+ {
+ fprintf (stderr, "files %s and %s have different contents\n",
+ file1, file2);
+ fflush (stderr);
+ abort ();
+ }
+ }
+
+ /* Compare the access permissions of the two files, including ACLs. */
+ {
+ struct stat statbuf1;
+ struct stat statbuf2;
+
+ if (stat (file1, &statbuf1) < 0)
+ {
+ fprintf (stderr, "error accessing file %s: errno = %d\n", file1, errno);
+ fflush (stderr);
+ abort ();
+ }
+ if (stat (file2, &statbuf2) < 0)
+ {
+ fprintf (stderr, "error accessing file %s: errno = %d\n", file2, errno);
+ fflush (stderr);
+ abort ();
+ }
+ if (statbuf1.st_mode != statbuf2.st_mode)
+ {
+ fprintf (stderr, "files %s and %s have different access modes: %03o and %03o\n",
+ file1, file2,
+ (unsigned int) statbuf1.st_mode, (unsigned int) statbuf2.st_mode);
+ return 1;
+ }
+ }
+ {
+#if HAVE_ACL_GET_FILE /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+ static const int types[] =
+ {
+ ACL_TYPE_ACCESS
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+ , ACL_TYPE_EXTENDED
+# endif
+ };
+ int t;
+
+ for (t = 0; t < sizeof (types) / sizeof (types[0]); t++)
+ {
+ int type = types[t];
+ acl_t acl1;
+ char *text1;
+ int errno1;
+ acl_t acl2;
+ char *text2;
+ int errno2;
+
+ acl1 = acl_get_file (file1, type);
+ if (acl1 == (acl_t)NULL)
+ {
+ text1 = NULL;
+ errno1 = errno;
+ }
+ else
+ {
+ text1 = acl_to_text (acl1, NULL);
+ if (text1 == NULL)
+ errno1 = errno;
+ else
+ errno1 = 0;
+ }
+ acl2 = acl_get_file (file2, type);
+ if (acl2 == (acl_t)NULL)
+ {
+ text2 = NULL;
+ errno2 = errno;
+ }
+ else
+ {
+ text2 = acl_to_text (acl2, NULL);
+ if (text2 == NULL)
+ errno2 = errno;
+ else
+ errno2 = 0;
+ }
+
+ if (acl1 != (acl_t)NULL)
+ {
+ if (acl2 != (acl_t)NULL)
+ {
+ if (text1 != NULL)
+ {
+ if (text2 != NULL)
+ {
+ if (strcmp (text1, text2) != 0)
+ {
+ fprintf (stderr, "files %s and %s have different ACLs:\n%s\n%s\n",
+ file1, file2, text1, text2);
+ return 1;
+ }
+ }
+ else
+ {
+ fprintf (stderr, "file %s has a valid ACL, but file %s has an invalid ACL\n",
+ file1, file2);
+ return 1;
+ }
+ }
+ else
+ {
+ if (text2 != NULL)
+ {
+ fprintf (stderr, "file %s has an invalid ACL, but file %s has a valid ACL\n",
+ file1, file2);
+ return 1;
+ }
+ else
+ {
+ if (errno1 != errno2)
+ {
+ fprintf (stderr, "files %s and %s have differently invalid ACLs, errno = %d vs. %d\n",
+ file1, file2, errno1, errno2);
+ return 1;
+ }
+ }
+ }
+ }
+ else
+ {
+ fprintf (stderr, "file %s has an ACL, but file %s has no ACL\n",
+ file1, file2);
+ return 1;
+ }
+ }
+ else
+ {
+ if (acl2 != (acl_t)NULL)
+ {
+ fprintf (stderr, "file %s has no ACL, but file %s has an ACL\n",
+ file1, file2);
+ return 1;
+ }
+ }
+ }
+#elif HAVE_ACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
+ int count1;
+ int count2;
+
+ count1 = acl (file1, GETACLCNT, 0, NULL);
+ count2 = acl (file2, GETACLCNT, 0, NULL);
+
+ if (count1 < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (count2 < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+ if (count1 != count2)
+ {
+ fprintf (stderr, "files %s and %s have different number of ACLs: %d and %d\n",
+ file1, file2, count1, count2);
+ return 1;
+ }
+ else
+ {
+ aclent_t *entries1 = XNMALLOC (count1, aclent_t);
+ aclent_t *entries2 = XNMALLOC (count2, aclent_t);
+ int i;
+
+ if (acl (file1, GETACL, count1, entries1) < count1)
+ {
+ fprintf (stderr, "error retrieving the ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (acl (file2, GETACL, count2, entries2) < count1)
+ {
+ fprintf (stderr, "error retrieving the ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+ for (i = 0; i < count1; i++)
+ {
+ if (entries1[i].a_type != entries2[i].a_type)
+ {
+ fprintf (stderr, "files %s and %s: different ACL entry #%d: different types %d and %d\n",
+ file1, file2, i, entries1[i].a_type, entries2[i].a_type);
+ return 1;
+ }
+ if (entries1[i].a_id != entries2[i].a_id)
+ {
+ fprintf (stderr, "files %s and %s: different ACL entry #%d: different ids %d and %d\n",
+ file1, file2, i, (int)entries1[i].a_id, (int)entries2[i].a_id);
+ return 1;
+ }
+ if (entries1[i].a_perm != entries2[i].a_perm)
+ {
+ fprintf (stderr, "files %s and %s: different ACL entry #%d: different permissions %03o and %03o\n",
+ file1, file2, i, (unsigned int) entries1[i].a_perm, (unsigned int) entries2[i].a_perm);
+ return 1;
+ }
+ }
+ }
+# ifdef ACE_GETACL
+ count1 = acl (file1, ACE_GETACLCNT, 0, NULL);
+ if (count1 < 0 && errno == EINVAL)
+ count1 = 0;
+ count2 = acl (file2, ACE_GETACLCNT, 0, NULL);
+ if (count2 < 0 && errno == EINVAL)
+ count2 = 0;
+ if (count1 < 0)
+ {
+ fprintf (stderr, "error accessing the ACE-ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (count2 < 0)
+ {
+ fprintf (stderr, "error accessing the ACE-ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+ if (count1 != count2)
+ {
+ fprintf (stderr, "files %s and %s have different number of ACE-ACLs: %d and %d\n",
+ file1, file2, count1, count2);
+ return 1;
+ }
+ else if (count1 > 0)
+ {
+ ace_t *entries1 = XNMALLOC (count1, ace_t);
+ ace_t *entries2 = XNMALLOC (count2, ace_t);
+ int i;
+
+ if (acl (file1, ACE_GETACL, count1, entries1) < count1)
+ {
+ fprintf (stderr, "error retrieving the ACE-ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (acl (file2, ACE_GETACL, count2, entries2) < count1)
+ {
+ fprintf (stderr, "error retrieving the ACE-ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+ for (i = 0; i < count1; i++)
+ {
+ if (entries1[i].a_type != entries2[i].a_type)
+ {
+ fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different types %d and %d\n",
+ file1, file2, i, entries1[i].a_type, entries2[i].a_type);
+ return 1;
+ }
+ if (entries1[i].a_who != entries2[i].a_who)
+ {
+ fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different ids %d and %d\n",
+ file1, file2, i, (int)entries1[i].a_who, (int)entries2[i].a_who);
+ return 1;
+ }
+ if (entries1[i].a_access_mask != entries2[i].a_access_mask)
+ {
+ fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different access masks %03o and %03o\n",
+ file1, file2, i, (unsigned int) entries1[i].a_access_mask, (unsigned int) entries2[i].a_access_mask);
+ return 1;
+ }
+ if (entries1[i].a_flags != entries2[i].a_flags)
+ {
+ fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different flags 0x%x and 0x%x\n",
+ file1, file2, i, (unsigned int) entries1[i].a_flags, (unsigned int) entries2[i].a_flags);
+ return 1;
+ }
+ }
+ }
+# endif
+#elif HAVE_GETACL /* HP-UX */
+ int count1;
+ int count2;
+
+ count1 = getacl (file1, 0, NULL);
+ if (count1 < 0 && (errno == ENOSYS || errno == EOPNOTSUPP))
+ count1 = 0;
+ count2 = getacl (file2, 0, NULL);
+ if (count2 < 0 && (errno == ENOSYS || errno == EOPNOTSUPP))
+ count2 = 0;
+
+ if (count1 < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (count2 < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+ if (count1 != count2)
+ {
+ fprintf (stderr, "files %s and %s have different number of ACLs: %d and %d\n",
+ file1, file2, count1, count2);
+ return 1;
+ }
+ else if (count1 > 0)
+ {
+ struct acl_entry *entries1 = XNMALLOC (count1, struct acl_entry);
+ struct acl_entry *entries2 = XNMALLOC (count2, struct acl_entry);
+ int i;
+
+ if (getacl (file1, count1, entries1) < count1)
+ {
+ fprintf (stderr, "error retrieving the ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (getacl (file2, count2, entries2) < count1)
+ {
+ fprintf (stderr, "error retrieving the ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+ for (i = 0; i < count1; i++)
+ {
+ if (entries1[i].uid != entries2[i].uid)
+ {
+ fprintf (stderr, "files %s and %s: different ACL entry #%d: different uids %d and %d\n",
+ file1, file2, i, (int)entries1[i].uid, (int)entries2[i].uid);
+ return 1;
+ }
+ if (entries1[i].gid != entries2[i].gid)
+ {
+ fprintf (stderr, "files %s and %s: different ACL entry #%d: different gids %d and %d\n",
+ file1, file2, i, (int)entries1[i].gid, (int)entries2[i].gid);
+ return 1;
+ }
+ if (entries1[i].mode != entries2[i].mode)
+ {
+ fprintf (stderr, "files %s and %s: different ACL entry #%d: different permissions %03o and %03o\n",
+ file1, file2, i, (unsigned int) entries1[i].mode, (unsigned int) entries2[i].mode);
+ return 1;
+ }
+ }
+ }
+#elif HAVE_ACLX_GET /* AIX */
+ acl_type_t type1;
+ char acl1[1000];
+ size_t aclsize1 = sizeof (acl1);
+ mode_t mode1;
+ char text1[1000];
+ acl_type_t type2;
+ char acl2[1000];
+ size_t aclsize2 = sizeof (acl2);
+ mode_t mode2;
+ char text2[1000];
+
+ /* The docs say that type1 being 0 is equivalent to ACL_ANY, but it is not
+ true, in AIX 5.3. */
+ type1.u64 = ACL_ANY;
+ if (aclx_get (file1, 0, &type1, acl1, &aclsize1, &mode1) < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (aclx_printStr (text1, sizeof (text1), acl1, aclsize1, type1, file1, 0) < 0)
+ {
+ fprintf (stderr, "cannot convert the ACLs of file %s to text\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+
+ /* The docs say that type2 being 0 is equivalent to ACL_ANY, but it is not
+ true, in AIX 5.3. */
+ type2.u64 = ACL_ANY;
+ if (aclx_get (file2, 0, &type2, acl2, &aclsize2, &mode2) < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+ if (aclx_printStr (text2, sizeof (text2), acl2, aclsize2, type2, file2, 0) < 0)
+ {
+ fprintf (stderr, "cannot convert the ACLs of file %s to text\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+
+ if (strcmp (text1, text2) != 0)
+ {
+ fprintf (stderr, "files %s and %s have different ACLs:\n%s\n%s\n",
+ file1, file2, text1, text2);
+ return 1;
+ }
+#elif HAVE_STATACL /* older AIX */
+ union { struct acl a; char room[4096]; } acl1;
+ union { struct acl a; char room[4096]; } acl2;
+ unsigned int i;
+
+ if (statacl (file1, STX_NORMAL, &acl1.a, sizeof (acl1)) < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (statacl (file2, STX_NORMAL, &acl2.a, sizeof (acl2)) < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+
+ if (acl1.a.acl_len != acl2.a.acl_len)
+ {
+ fprintf (stderr, "files %s and %s have different ACL lengths: %u and %u\n",
+ file1, file2, acl1.a.acl_len, acl2.a.acl_len);
+ return 1;
+ }
+ if (acl1.a.acl_mode != acl2.a.acl_mode)
+ {
+ fprintf (stderr, "files %s and %s have different ACL modes: %03o and %03o\n",
+ file1, file2, acl1.a.acl_mode, acl2.a.acl_mode);
+ return 1;
+ }
+ if (acl1.a.u_access != acl2.a.u_access
+ || acl1.a.g_access != acl2.a.g_access
+ || acl1.a.o_access != acl2.a.o_access)
+ {
+ fprintf (stderr, "files %s and %s have different ACL access masks: %03o %03o %03o and %03o %03o %03o\n",
+ file1, file2,
+ acl1.a.u_access, acl1.a.g_access, acl1.a.o_access,
+ acl2.a.u_access, acl2.a.g_access, acl2.a.o_access);
+ return 1;
+ }
+ if (memcmp (acl1.a.acl_ext, acl2.a.acl_ext, acl1.a.acl_len) != 0)
+ {
+ fprintf (stderr, "files %s and %s have different ACL entries\n",
+ file1, file2);
+ return 1;
+ }
+#endif
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sched.c b/gnulib/tests/test-sched.c
new file mode 100644
index 00000000..15680d41
--- /dev/null
+++ b/gnulib/tests/test-sched.c
@@ -0,0 +1,38 @@
+/* Test of <sched.h> substitute.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <sched.h>
+
+/* Check that 'struct sched_param' is defined. */
+static struct sched_param a;
+
+/* Check that the SCHED_* macros are defined and compile-time constants. */
+int b[] = { SCHED_FIFO, SCHED_RR, SCHED_OTHER };
+
+static int f1;
+
+int
+main ()
+{
+ /* Check fields of 'struct sched_param'. */
+ f1 = a.sched_priority;
+
+ return 0;
+}
diff --git a/gnulib/tests/test-search.c b/gnulib/tests/test-search.c
new file mode 100644
index 00000000..3248e514
--- /dev/null
+++ b/gnulib/tests/test-search.c
@@ -0,0 +1,27 @@
+/* Test of <search.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <search.h>
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-select-fd.c b/gnulib/tests/test-select-fd.c
new file mode 100644
index 00000000..4527a2fb
--- /dev/null
+++ b/gnulib/tests/test-select-fd.c
@@ -0,0 +1,72 @@
+/* Test of select() substitute, reading or writing from a given file descriptor.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/select.h>
+
+int
+main (int argc, char *argv[])
+{
+ if (argc == 4)
+ {
+ char mode = argv[1][0];
+
+ if (mode == 'r' || mode == 'w')
+ {
+ int fd = atoi (argv[2]);
+
+ if (fd >= 0)
+ {
+ const char *result_file_name = argv[3];
+ FILE *result_file = fopen (result_file_name, "wb");
+
+ if (result_file != NULL)
+ {
+ fd_set fds;
+ struct timeval timeout;
+ int ret;
+
+ FD_ZERO (&fds);
+ FD_SET (fd, &fds);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 10000;
+ ret = (mode == 'r'
+ ? select (fd + 1, &fds, NULL, NULL, &timeout)
+ : select (fd + 1, NULL, &fds, NULL, &timeout));
+ if (ret < 0)
+ {
+ perror ("select failed");
+ exit (1);
+ }
+ if ((ret == 0) != ! FD_ISSET (fd, &fds))
+ {
+ fprintf (stderr, "incorrect return value\n");
+ exit (1);
+ }
+ fprintf (result_file, "%d\n", ret);
+ exit (0);
+ }
+ }
+ }
+ }
+ fprintf (stderr, "Usage: test-select-fd mode fd result-file-name\n");
+ exit (1);
+}
diff --git a/gnulib/tests/test-select-in.sh b/gnulib/tests/test-select-in.sh
new file mode 100755
index 00000000..13f6bbb8
--- /dev/null
+++ b/gnulib/tests/test-select-in.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# Test select() on file descriptors opened for reading.
+
+# This test is known to fail on Solaris 2.6 and older, due to its handling
+# of /dev/null.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-select-in.tmp"
+
+# Regular files.
+
+rm -f t-select-in.tmp
+./test-select-fd${EXEEXT} r 0 t-select-in.tmp < ./test-select-fd${EXEEXT}
+test `cat t-select-in.tmp` = "1" || exit 1
+
+# Pipes.
+
+rm -f t-select-in.tmp
+{ sleep 1; echo abc; } | ./test-select-fd${EXEEXT} r 0 t-select-in.tmp
+test `cat t-select-in.tmp` = "0" || exit 1
+
+rm -f t-select-in.tmp
+echo abc | { sleep 1; ./test-select-fd${EXEEXT} r 0 t-select-in.tmp; }
+test `cat t-select-in.tmp` = "1" || exit 1
+
+# Special files.
+# This part of the test is known to fail on Solaris 2.6 and older.
+
+rm -f t-select-in.tmp
+./test-select-fd${EXEEXT} r 0 t-select-in.tmp < /dev/null
+test `cat t-select-in.tmp` = "1" || exit 1
+
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-select-out.sh b/gnulib/tests/test-select-out.sh
new file mode 100755
index 00000000..c5fd8619
--- /dev/null
+++ b/gnulib/tests/test-select-out.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+# Test select() on file descriptors opened for writing.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-select-out.out t-select-out.tmp"
+
+# Regular files.
+
+rm -f t-select-out.tmp
+./test-select-fd${EXEEXT} w 1 t-select-out.tmp > t-select-out.out
+test `cat t-select-out.tmp` = "1" || exit 1
+
+# Pipes.
+
+if false; then # This test fails on some platforms.
+ rm -f t-select-out.tmp
+ ( { echo abc; ./test-select-fd${EXEEXT} w 1 t-select-out.tmp; } | { sleep 1; cat; } ) > /dev/null
+ test `cat t-select-out.tmp` = "0" || exit 1
+fi
+
+rm -f t-select-out.tmp
+( { sleep 1; echo abc; ./test-select-fd${EXEEXT} w 1 t-select-out.tmp; } | cat) > /dev/null
+test `cat t-select-out.tmp` = "1" || exit 1
+
+# Special files.
+
+rm -f t-select-out.tmp
+./test-select-fd${EXEEXT} w 1 t-select-out.tmp > /dev/null
+test `cat t-select-out.tmp` = "1" || exit 1
+
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-select-stdin.c b/gnulib/tests/test-select-stdin.c
new file mode 100644
index 00000000..e9cee96f
--- /dev/null
+++ b/gnulib/tests/test-select-stdin.c
@@ -0,0 +1,80 @@
+/* Test of select() substitute, reading from stdin.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+int
+main (void)
+{
+ printf ("Applying select() from standard input. Press Ctrl-C to abort.\n");
+ for (;;)
+ {
+ struct timeval before;
+ struct timeval after;
+ unsigned long spent_usec;
+ fd_set readfds;
+ struct timeval timeout;
+ int ret;
+
+ gettimeofday (&before, NULL);
+
+ FD_ZERO (&readfds);
+ FD_SET (0, &readfds);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 500000;
+ ret = select (1, &readfds, NULL, NULL, &timeout);
+
+ gettimeofday (&after, NULL);
+ spent_usec = (after.tv_sec - before.tv_sec) * 1000000
+ + after.tv_usec - before.tv_usec;
+
+ if (ret < 0)
+ {
+ perror ("select failed");
+ exit (1);
+ }
+ if ((ret == 0) != ! FD_ISSET (0, &readfds))
+ {
+ fprintf (stderr, "incorrect return value\n");
+ exit (1);
+ }
+ if (ret == 0)
+ {
+ if (spent_usec < 250000)
+ {
+ fprintf (stderr, "returned too early\n");
+ exit (1);
+ }
+ /* Timeout */
+ printf ("."); fflush (stdout);
+ }
+ else
+ {
+ char c;
+
+ printf ("Input available! Trying to read 1 byte...\n");
+ read (0, &c, 1);
+ }
+ }
+}
diff --git a/gnulib/tests/test-select.c b/gnulib/tests/test-select.c
new file mode 100644
index 00000000..884e8233
--- /dev/null
+++ b/gnulib/tests/test-select.c
@@ -0,0 +1,391 @@
+/* Test of select() substitute.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Paolo Bonzini, 2008. */
+
+#include <config.h>
+
+#include <sys/select.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (select, int, (int, fd_set *, fd_set *, fd_set *,
+ struct timeval *));
+/* The following may be macros without underlying functions, so only
+ check signature if they are not macros. */
+#ifndef FD_CLR
+SIGNATURE_CHECK (FD_CLR, void, (int, fd_set *));
+#endif
+#ifndef FD_ISSET
+SIGNATURE_CHECK (FD_ISSET, void, (int, fd_set *));
+#endif
+#ifndef FD_SET
+SIGNATURE_CHECK (FD_SET, int, (int, fd_set *));
+#endif
+#ifndef FD_ZERO
+SIGNATURE_CHECK (FD_ZERO, void, (fd_set *));
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+enum { SEL_IN = 1, SEL_OUT = 2, SEL_EXC = 4 };
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_NATIVE
+#endif
+
+#ifdef WIN32_NATIVE
+#include <io.h>
+#define pipe(x) _pipe(x, 256, O_BINARY)
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#ifndef SO_REUSEPORT
+#define SO_REUSEPORT SO_REUSEADDR
+#endif
+
+#define TEST_PORT 12345
+
+
+/* Minimal testing infrastructure. */
+
+static int failures;
+
+static void
+failed (const char *reason)
+{
+ if (++failures > 1)
+ printf (" ");
+ printf ("failed (%s)\n", reason);
+}
+
+static int
+test (void (*fn) (void), const char *msg)
+{
+ failures = 0;
+ printf ("%s... ", msg);
+ fflush (stdout);
+ fn ();
+
+ if (!failures)
+ printf ("passed\n");
+
+ return failures;
+}
+
+
+/* Funny socket code. */
+
+static int
+open_server_socket (void)
+{
+ int s, x;
+ struct sockaddr_in ia;
+
+ s = socket (AF_INET, SOCK_STREAM, 0);
+
+ memset (&ia, 0, sizeof (ia));
+ ia.sin_family = AF_INET;
+ inet_pton (AF_INET, "127.0.0.1", &ia.sin_addr);
+ ia.sin_port = htons (TEST_PORT);
+ if (bind (s, (struct sockaddr *) &ia, sizeof (ia)) < 0)
+ {
+ perror ("bind");
+ exit (77);
+ }
+
+ x = 1;
+ setsockopt (s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof (x));
+
+ if (listen (s, 1) < 0)
+ {
+ perror ("listen");
+ exit (77);
+ }
+
+ return s;
+}
+
+static int
+connect_to_socket (int blocking)
+{
+ int s;
+ struct sockaddr_in ia;
+
+ s = socket (AF_INET, SOCK_STREAM, 0);
+
+ memset (&ia, 0, sizeof (ia));
+ ia.sin_family = AF_INET;
+ inet_pton (AF_INET, "127.0.0.1", &ia.sin_addr);
+ ia.sin_port = htons (TEST_PORT);
+
+ if (!blocking)
+ {
+#ifdef WIN32_NATIVE
+ unsigned long iMode = 1;
+ ioctl (s, FIONBIO, (char *) &iMode);
+
+#elif defined F_GETFL
+ int oldflags = fcntl (s, F_GETFL, NULL);
+
+ if (!(oldflags & O_NONBLOCK))
+ fcntl (s, F_SETFL, oldflags | O_NONBLOCK);
+#endif
+ }
+
+ if (connect (s, (struct sockaddr *) &ia, sizeof (ia)) < 0
+ && (blocking || errno != EINPROGRESS))
+ {
+ perror ("connect");
+ exit (77);
+ }
+
+ return s;
+}
+
+
+/* A slightly more convenient interface to select(2). */
+
+static int
+do_select (int fd, int ev, struct timeval *tv)
+{
+ fd_set rfds, wfds, xfds;
+ int r, rev;
+
+ FD_ZERO (&rfds);
+ FD_ZERO (&wfds);
+ FD_ZERO (&xfds);
+ if (ev & SEL_IN)
+ FD_SET (fd, &rfds);
+ if (ev & SEL_OUT)
+ FD_SET (fd, &wfds);
+ if (ev & SEL_EXC)
+ FD_SET (fd, &xfds);
+ r = select (fd + 1, &rfds, &wfds, &xfds, tv);
+ if (r < 0)
+ return r;
+
+ rev = 0;
+ if (FD_ISSET (fd, &rfds))
+ rev |= SEL_IN;
+ if (FD_ISSET (fd, &wfds))
+ rev |= SEL_OUT;
+ if (FD_ISSET (fd, &xfds))
+ rev |= SEL_EXC;
+ if (rev && r == 0)
+ failed ("select returned 0");
+ if (rev & ~ev)
+ failed ("select returned unrequested events");
+
+ return rev;
+}
+
+static int
+do_select_nowait (int fd, int ev)
+{
+ static struct timeval tv0;
+ return do_select (fd, ev, &tv0);
+}
+
+static int
+do_select_wait (int fd, int ev)
+{
+ return do_select (fd, ev, NULL);
+}
+
+
+/* Test poll(2) for TTYs. */
+
+#ifdef INTERACTIVE
+static void
+test_tty (void)
+{
+ if (do_select_nowait (0, SEL_IN) != 0)
+ failed ("can read");
+ if (do_select_nowait (0, SEL_OUT) == 0)
+ failed ("cannot write");
+
+ if (do_select_wait (0, SEL_IN) == 0)
+ failed ("return with infinite timeout");
+
+ getchar ();
+ if (do_select_nowait (0, SEL_IN) != 0)
+ failed ("can read after getc");
+}
+#endif
+
+
+/* Test poll(2) for unconnected nonblocking sockets. */
+
+static void
+test_connect_first (void)
+{
+ int s = open_server_socket ();
+ struct sockaddr_in ia;
+ socklen_t addrlen;
+
+ int c1, c2;
+
+ if (do_select_nowait (s, SEL_IN | SEL_EXC) != 0)
+ failed ("can read, socket not connected");
+
+ c1 = connect_to_socket (false);
+
+ if (do_select_wait (s, SEL_IN | SEL_EXC) != SEL_IN)
+ failed ("expecting readability on passive socket");
+ if (do_select_nowait (s, SEL_IN | SEL_EXC) != SEL_IN)
+ failed ("expecting readability on passive socket");
+
+ addrlen = sizeof (ia);
+ c2 = accept (s, (struct sockaddr *) &ia, &addrlen);
+ close (s);
+ close (c1);
+ close (c2);
+}
+
+
+/* Test poll(2) for unconnected blocking sockets. */
+
+static void
+test_accept_first (void)
+{
+#ifndef WIN32_NATIVE
+ int s = open_server_socket ();
+ struct sockaddr_in ia;
+ socklen_t addrlen;
+ char buf[3];
+ int c, pid;
+
+ pid = fork ();
+ if (pid < 0)
+ return;
+
+ if (pid == 0)
+ {
+ addrlen = sizeof (ia);
+ c = accept (s, (struct sockaddr *) &ia, &addrlen);
+ close (s);
+ write (c, "foo", 3);
+ read (c, buf, 3);
+ shutdown (c, SHUT_RD);
+ close (c);
+ exit (0);
+ }
+ else
+ {
+ close (s);
+ c = connect_to_socket (true);
+ if (do_select_nowait (c, SEL_OUT) != SEL_OUT)
+ failed ("cannot write after blocking connect");
+ write (c, "foo", 3);
+ wait (&pid);
+ if (do_select_wait (c, SEL_IN) != SEL_IN)
+ failed ("cannot read data left in the socket by closed process");
+ read (c, buf, 3);
+ write (c, "foo", 3);
+ close (c);
+ }
+#endif
+}
+
+
+/* Common code for pipes and connected sockets. */
+
+static void
+test_pair (int rd, int wd)
+{
+ char buf[3];
+ if (do_select_wait (wd, SEL_IN | SEL_OUT | SEL_EXC) != SEL_OUT)
+ failed ("expecting writability before writing");
+ if (do_select_nowait (wd, SEL_IN | SEL_OUT | SEL_EXC) != SEL_OUT)
+ failed ("expecting writability before writing");
+
+ write (wd, "foo", 3);
+ if (do_select_wait (rd, SEL_IN) != SEL_IN)
+ failed ("expecting readability after writing");
+ if (do_select_nowait (rd, SEL_IN) != SEL_IN)
+ failed ("expecting readability after writing");
+
+ read (rd, buf, 3);
+}
+
+
+/* Test poll(2) on connected sockets. */
+
+static void
+test_socket_pair (void)
+{
+ struct sockaddr_in ia;
+
+ socklen_t addrlen = sizeof (ia);
+ int s = open_server_socket ();
+ int c1 = connect_to_socket (false);
+ int c2 = accept (s, (struct sockaddr *) &ia, &addrlen);
+
+ close (s);
+
+ test_pair (c1, c2);
+ close (c1);
+ write (c2, "foo", 3);
+ close (c2);
+}
+
+
+/* Test poll(2) on pipes. */
+
+static void
+test_pipe (void)
+{
+ int fd[2];
+
+ pipe (fd);
+ test_pair (fd[0], fd[1]);
+ close (fd[0]);
+ close (fd[1]);
+}
+
+
+/* Do them all. */
+
+int
+main (void)
+{
+ int result;
+
+#ifdef INTERACTIVE
+ printf ("Please press Enter\n");
+ test (test_tty, "TTY");
+#endif
+
+ result = test (test_connect_first, "Unconnected socket test");
+ result += test (test_socket_pair, "Connected sockets test");
+ result += test (test_accept_first, "General socket test with fork");
+ result += test (test_pipe, "Pipe test");
+
+ exit (result);
+}
diff --git a/gnulib/tests/test-set-mode-acl.c b/gnulib/tests/test-set-mode-acl.c
new file mode 100644
index 00000000..82591030
--- /dev/null
+++ b/gnulib/tests/test-set-mode-acl.c
@@ -0,0 +1,44 @@
+/* Test of setting an ACL equivalent to a mode.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include <stdlib.h>
+
+#include "progname.h"
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ const char *file;
+ int mode;
+
+ set_program_name (argv[0]);
+
+ ASSERT (argc == 3);
+
+ file = argv[1];
+ mode = strtol (argv[2], NULL, 8);
+
+ set_acl (file, -1, mode);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-set-mode-acl.sh b/gnulib/tests/test-set-mode-acl.sh
new file mode 100755
index 00000000..5d3d2251
--- /dev/null
+++ b/gnulib/tests/test-set-mode-acl.sh
@@ -0,0 +1,203 @@
+#!/bin/sh
+
+# Show all commands when run with environment variable VERBOSE=yes.
+test -z "$VERBOSE" || set -x
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp pathname of freshly created temporary directory
+func_tmpdir ()
+{
+ # Use the environment variable TMPDIR, falling back to /tmp. This allows
+ # users to specify a different temporary directory, for example, if their
+ # /tmp is filled up or too small.
+ : ${TMPDIR=/tmp}
+ {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=$TMPDIR/gl$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ } ||
+ {
+ echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+ exit 1
+ }
+}
+
+func_tmpdir
+builddir=`pwd`
+cd "$builddir" ||
+ {
+ echo "$0: cannot determine build directory (unreadable parent dir?)" >&2
+ exit 1
+ }
+# Switch to a temporary directory, to increase the likelihood that ACLs are
+# supported on the current file system. (/tmp is usually locally mounted,
+# whereas the build dir is sometimes NFS-mounted.)
+( cd "$tmp"
+
+ # Prepare tmpfile0.
+ rm -f tmpfile[0-9]
+ echo "Simple contents" > tmpfile0
+ chmod 600 tmpfile0
+
+ # Classification of the platform according to the programs available for
+ # manipulating ACLs.
+ # Possible values are:
+ # linux, cygwin, freebsd, solaris, hpux, osf1, aix, macosx, irix, none.
+ # TODO: Support also native Win32 platforms (mingw).
+ acl_flavor=none
+ if (getfacl tmpfile0 >/dev/null) 2>/dev/null; then
+ # Platforms with the getfacl and setfacl programs.
+ # Linux, FreeBSD, Solaris, Cygwin.
+ if (setfacl --help >/dev/null) 2>/dev/null; then
+ # Linux, Cygwin.
+ if (LC_ALL=C setfacl --help | grep ' --set-file' >/dev/null) 2>/dev/null; then
+ # Linux.
+ acl_flavor=linux
+ else
+ acl_flavor=cygwin
+ fi
+ else
+ # FreeBSD, Solaris.
+ if (LC_ALL=C setfacl 2>&1 | grep '\-x entries' >/dev/null) 2>/dev/null; then
+ # FreeBSD.
+ acl_flavor=freebsd
+ else
+ # Solaris.
+ acl_flavor=solaris
+ fi
+ fi
+ else
+ if (lsacl / >/dev/null) 2>/dev/null; then
+ # Platforms with the lsacl and chacl programs.
+ # HP-UX, sometimes also IRIX.
+ acl_flavor=hpux
+ else
+ if (getacl tmpfile0 >/dev/null) 2>/dev/null; then
+ # Tru64.
+ acl_flavor=osf1
+ else
+ if (aclget tmpfile0 >/dev/null) 2>/dev/null; then
+ # AIX.
+ acl_flavor=aix
+ else
+ if (fsaclctl -v >/dev/null) 2>/dev/null; then
+ # MacOS X.
+ acl_flavor=macosx
+ else
+ if test -f /sbin/chacl; then
+ # IRIX.
+ acl_flavor=irix
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ if test $acl_flavor != none; then
+ # A POSIX compliant 'id' program.
+ if test -f /usr/xpg4/bin/id; then
+ ID=/usr/xpg4/bin/id
+ else
+ ID=id
+ fi
+ # Use a user and group id different from the current one, to avoid
+ # redundant/ambiguous ACLs.
+ myuid=`$ID -u`
+ mygid=`$ID -g`
+ auid=1
+ if test "$auid" = "$myuid"; then auid=2; fi
+ agid=1
+ if test "$agid" = "$mygid"; then agid=2; fi
+ fi
+
+ for mode in 700 400 200 100 644 650 605 011 4700 2070; do
+ rm -f tmpfile0 tmpfile1 tmpfile2
+
+ # Prepare a file with no ACL.
+ echo "Anything" > tmpfile0
+ # If a mode is not supported (e.g. 2070 on FreeBSD), we skip testing it.
+ if chmod $mode tmpfile0 2>/dev/null; then
+ modestring0=`ls -l tmpfile0 | dd ibs=1 count=10 2>/dev/null`
+
+ # Prepare a file with no ACL.
+ echo "Some contents" > tmpfile1
+ chmod 600 tmpfile1
+
+ # Try to set the ACL to only the given mode.
+ "$builddir"/test-set-mode-acl${EXEEXT} tmpfile1 $mode
+ # Verify that tmpfile1 has no ACL and has the desired mode.
+ modestring=`ls -l tmpfile1 | dd ibs=1 count=10 2>/dev/null`
+ if test "x$modestring" != "x$modestring0"; then
+ echo "mode = $mode: tmpfile1 has wrong mode: $modestring" 1>&2
+ exit 1
+ fi
+ if test `"$builddir"/test-file-has-acl${EXEEXT} tmpfile1` != no; then
+ echo "mode = $mode: tmpfile1 got an ACL" 1>&2
+ exit 1
+ fi
+
+ if test $acl_flavor != none; then
+
+ # Prepare a file with an ACL.
+ echo "Special contents" > tmpfile2
+ chmod 600 tmpfile2
+ # Set an ACL for a user (or group).
+ case $acl_flavor in
+ linux | freebsd | solaris)
+ setfacl -m user:$auid:1 tmpfile0
+ ;;
+ cygwin)
+ setfacl -m group:0:1 tmpfile0
+ ;;
+ hpux)
+ orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+ chacl -r "${orig}($auid.%,--x)" tmpfile0
+ ;;
+ osf1)
+ setacl -u user:$auid:1 tmpfile0
+ ;;
+ aix)
+ { aclget tmpfile0 | sed -e 's/disabled$/enabled/'; echo " permit --x u:$auid"; } | aclput tmpfile0
+ ;;
+ macosx)
+ /bin/chmod +a "user:daemon allow execute" tmpfile0
+ ;;
+ irix)
+ /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x tmpfile0
+ ;;
+ esac
+
+ # Try to set the ACL to only the given mode.
+ "$builddir"/test-set-mode-acl${EXEEXT} tmpfile2 $mode
+ # Verify that tmpfile2 has no ACL and has the desired mode.
+ modestring=`ls -l tmpfile2 | dd ibs=1 count=10 2>/dev/null`
+ if test "x$modestring" != "x$modestring0"; then
+ echo "mode = $mode: tmpfile2 has wrong mode: $modestring" 1>&2
+ exit 1
+ fi
+ if test `"$builddir"/test-file-has-acl${EXEEXT} tmpfile2` != no; then
+ echo "mode = $mode: tmpfile2 still has an ACL" 1>&2
+ exit 1
+ fi
+ fi
+ fi
+ done
+
+ rm -f tmpfile[0-9]
+) || exit 1
+
+rm -rf "$tmp"
+exit 0
diff --git a/gnulib/tests/test-setenv.c b/gnulib/tests/test-setenv.c
new file mode 100644
index 00000000..de589c1b
--- /dev/null
+++ b/gnulib/tests/test-setenv.c
@@ -0,0 +1,56 @@
+/* Tests of setenv.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (setenv, int, (char const *, char const *, int));
+
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ /* Test overwriting. */
+ ASSERT (setenv ("a", "==", -1) == 0);
+ ASSERT (setenv ("a", "2", 0) == 0);
+ ASSERT (strcmp (getenv ("a"), "==") == 0);
+
+ /* Required to fail with EINVAL. */
+ errno = 0;
+ ASSERT (setenv ("", "", 1) == -1);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ ASSERT (setenv ("a=b", "", 0) == -1);
+ ASSERT (errno == EINVAL);
+#if 0
+ /* glibc and gnulib's implementation guarantee this, but POSIX no
+ longer requires it: http://austingroupbugs.net/view.php?id=185 */
+ errno = 0;
+ ASSERT (setenv (NULL, "", 0) == -1);
+ ASSERT (errno == EINVAL);
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sha1.c b/gnulib/tests/test-sha1.c
new file mode 100644
index 00000000..a326e8f3
--- /dev/null
+++ b/gnulib/tests/test-sha1.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2005, 2008, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "sha1.h"
+
+int
+main (void)
+{
+ const char *in1 = "abcdefgh";
+ const char *out1 = "\x42\x5a\xf1\x2a\x07\x43\x50\x2b"
+ "\x32\x2e\x93\xa0\x15\xbc\xf8\x68\xe3\x24\xd5\x6a";
+ char buf[SHA1_DIGEST_SIZE];
+
+ if (memcmp (sha1_buffer (in1, strlen (in1), buf),
+ out1, SHA1_DIGEST_SIZE) != 0)
+ {
+ size_t i;
+ printf ("expected:\n");
+ for (i = 0; i < SHA1_DIGEST_SIZE; i++)
+ printf ("%02x ", out1[i] & 0xFF);
+ printf ("\ncomputed:\n");
+ for (i = 0; i < SHA1_DIGEST_SIZE; i++)
+ printf ("%02x ", buf[i] & 0xFF);
+ printf ("\n");
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sigaction.c b/gnulib/tests/test-sigaction.c
new file mode 100644
index 00000000..73579d96
--- /dev/null
+++ b/gnulib/tests/test-sigaction.c
@@ -0,0 +1,116 @@
+/* Test of sigaction() function.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2008. */
+
+#include <config.h>
+
+#include <signal.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sigaction, int, (int, struct sigaction const *,
+ struct sigaction *));
+
+#include <stddef.h>
+
+#include "macros.h"
+
+#ifndef SA_NOCLDSTOP
+# define SA_NOCLDSTOP 0
+#endif
+#ifndef SA_ONSTACK
+# define SA_ONSTACK 0
+#endif
+#ifndef SA_SIGINFO
+# define SA_SIGINFO 0
+#endif
+#ifndef SA_NOCLDWAIT
+# define SA_NOCLDWAIT 0
+#endif
+
+/* Define a mask of flags required by POSIX. Some implementations
+ provide other flags as extensions, such as SA_RESTORER, that we
+ must ignore in this test. */
+#define MASK_SA_FLAGS (SA_NOCLDSTOP | SA_ONSTACK | SA_RESETHAND | SA_RESTART \
+ | SA_SIGINFO | SA_NOCLDWAIT | SA_NODEFER)
+
+/* This test is unsafe in the presence of an asynchronous SIGABRT,
+ because we install a signal-handler that is intentionally not
+ async-safe. Hopefully, this does not lead to too many reports of
+ false failures, since people don't generally use 'kill -s SIGABRT'
+ to end a runaway program. */
+
+static void
+handler (int sig)
+{
+ static int entry_count;
+ struct sigaction sa;
+ ASSERT (sig == SIGABRT);
+ ASSERT (sigaction (SIGABRT, NULL, &sa) == 0);
+ ASSERT ((sa.sa_flags & SA_SIGINFO) == 0);
+ switch (entry_count++)
+ {
+ case 0:
+ ASSERT ((sa.sa_flags & SA_RESETHAND) == 0);
+ ASSERT (sa.sa_handler == handler);
+ break;
+ case 1:
+ /* This assertion fails on glibc-2.3.6 systems with LinuxThreads,
+ when this program is linked with -lpthread, due to the sigaction()
+ override in libpthread.so. */
+#if !defined __GLIBC__
+ ASSERT (sa.sa_handler == SIG_DFL);
+#endif
+ break;
+ default:
+ ASSERT (0);
+ }
+}
+
+int
+main (void)
+{
+ struct sigaction sa;
+ struct sigaction old_sa;
+ sa.sa_handler = handler;
+
+ sa.sa_flags = 0;
+ ASSERT (sigemptyset (&sa.sa_mask) == 0);
+ ASSERT (sigaction (SIGABRT, &sa, NULL) == 0);
+ ASSERT (raise (SIGABRT) == 0);
+
+ sa.sa_flags = SA_RESETHAND | SA_NODEFER;
+ ASSERT (sigaction (SIGABRT, &sa, &old_sa) == 0);
+ ASSERT ((old_sa.sa_flags & MASK_SA_FLAGS) == 0);
+ ASSERT (old_sa.sa_handler == handler);
+ ASSERT (raise (SIGABRT) == 0);
+
+ sa.sa_handler = SIG_DFL;
+ ASSERT (sigaction (SIGABRT, &sa, &old_sa) == 0);
+ ASSERT ((old_sa.sa_flags & SA_SIGINFO) == 0);
+#if !defined __GLIBC__ /* see above */
+ ASSERT (old_sa.sa_handler == SIG_DFL);
+#endif
+
+ sa.sa_handler = SIG_IGN;
+ ASSERT (sigaction (SIGABRT, &sa, NULL) == 0);
+ ASSERT (raise (SIGABRT) == 0);
+ ASSERT (sigaction (SIGABRT, NULL, &old_sa) == 0);
+ ASSERT (old_sa.sa_handler == SIG_IGN);
+ ASSERT (raise (SIGABRT) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-signal.c b/gnulib/tests/test-signal.c
new file mode 100644
index 00000000..e4258d3b
--- /dev/null
+++ b/gnulib/tests/test-signal.c
@@ -0,0 +1,125 @@
+/* Test of <signal.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <signal.h>
+
+/* Check for required types. */
+struct
+{
+ size_t a;
+ uid_t b;
+ volatile sig_atomic_t c;
+ sigset_t d;
+ pid_t e;
+#if 0
+ /* Not guaranteed by gnulib. */
+ pthread_t f;
+ struct timespec g;
+#endif
+} s;
+
+int
+main (void)
+{
+ switch (0)
+ {
+ /* The following are guaranteed by C. */
+ case 0:
+ case SIGABRT:
+ case SIGFPE:
+ case SIGILL:
+ case SIGINT:
+ case SIGSEGV:
+ case SIGTERM:
+ /* The following is guaranteed by gnulib. */
+#if GNULIB_SIGPIPE || defined SIGPIPE
+ case SIGPIPE:
+#endif
+ /* Ensure no conflict with other standardized names. */
+#ifdef SIGALRM
+ case SIGALRM:
+#endif
+#ifdef SIGBUS
+ case SIGBUS:
+#endif
+#ifdef SIGCHLD
+ case SIGCHLD:
+#endif
+#ifdef SIGCONT
+ case SIGCONT:
+#endif
+#ifdef SIGHUP
+ case SIGHUP:
+#endif
+#ifdef SIGKILL
+ case SIGKILL:
+#endif
+#ifdef SIGQUIT
+ case SIGQUIT:
+#endif
+#ifdef SIGSTOP
+ case SIGSTOP:
+#endif
+#ifdef SIGTSTP
+ case SIGTSTP:
+#endif
+#ifdef SIGTTIN
+ case SIGTTIN:
+#endif
+#ifdef SIGTTOU
+ case SIGTTOU:
+#endif
+#ifdef SIGUSR1
+ case SIGUSR1:
+#endif
+#ifdef SIGUSR2
+ case SIGUSR2:
+#endif
+#ifdef SIGSYS
+ case SIGSYS:
+#endif
+#ifdef SIGTRAP
+ case SIGTRAP:
+#endif
+#ifdef SIGURG
+ case SIGURG:
+#endif
+#ifdef SIGVTALRM
+ case SIGVTALRM:
+#endif
+#ifdef SIGXCPU
+ case SIGXCPU:
+#endif
+#ifdef SIGXFSZ
+ case SIGXFSZ:
+#endif
+ /* SIGRTMIN and SIGRTMAX need not be compile-time constants. */
+#if 0
+# ifdef SIGRTMIN
+ case SIGRTMIN:
+# endif
+# ifdef SIGRTMAX
+ case SIGRTMAX:
+# endif
+#endif
+ ;
+ }
+ return s.a + s.b + s.c + s.e;
+}
diff --git a/gnulib/tests/test-signbit.c b/gnulib/tests/test-signbit.c
new file mode 100644
index 00000000..9581190c
--- /dev/null
+++ b/gnulib/tests/test-signbit.c
@@ -0,0 +1,197 @@
+/* Test of signbit() substitute.
+ Copyright (C) 2007, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+/* signbit must be a macro. */
+#ifndef signbit
+# error missing declaration
+#endif
+
+#include <float.h>
+#include <limits.h>
+
+#include "macros.h"
+
+float zerof = 0.0f;
+double zerod = 0.0;
+long double zerol = 0.0L;
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0f.
+ So we use -zerof instead. */
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zerod instead. */
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zerol instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zerol (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zerol compute_minus_zerol ()
+#else
+long double minus_zerol = -0.0L;
+#endif
+
+static void
+test_signbitf ()
+{
+ /* Finite values. */
+ ASSERT (!signbit (3.141f));
+ ASSERT (!signbit (3.141e30f));
+ ASSERT (!signbit (3.141e-30f));
+ ASSERT (signbit (-2.718f));
+ ASSERT (signbit (-2.718e30f));
+ ASSERT (signbit (-2.718e-30f));
+ /* Zeros. */
+ ASSERT (!signbit (0.0f));
+ if (1.0f / -zerof < 0)
+ ASSERT (signbit (-zerof));
+ else
+ ASSERT (!signbit (-zerof));
+ /* Infinite values. */
+ ASSERT (!signbit (1.0f / 0.0f));
+ ASSERT (signbit (-1.0f / 0.0f));
+ /* Quiet NaN. */
+ (void) signbit (zerof / zerof);
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+ memory_float m;
+ m.value = zerof / zerof;
+# if FLT_EXPBIT0_BIT > 0
+ m.word[FLT_EXPBIT0_WORD] ^= (unsigned int) 1 << (FLT_EXPBIT0_BIT - 1);
+# else
+ m.word[FLT_EXPBIT0_WORD + (FLT_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ if (FLT_EXPBIT0_WORD < NWORDS / 2)
+ m.word[FLT_EXPBIT0_WORD + 1] |= (unsigned int) 1 << FLT_EXPBIT0_BIT;
+ else
+ m.word[0] |= (unsigned int) 1;
+ (void) signbit (m.value);
+ #undef NWORDS
+ }
+#endif
+}
+
+static void
+test_signbitd ()
+{
+ /* Finite values. */
+ ASSERT (!signbit (3.141));
+ ASSERT (!signbit (3.141e30));
+ ASSERT (!signbit (3.141e-30));
+ ASSERT (signbit (-2.718));
+ ASSERT (signbit (-2.718e30));
+ ASSERT (signbit (-2.718e-30));
+ /* Zeros. */
+ ASSERT (!signbit (0.0));
+ if (1.0 / -zerod < 0)
+ ASSERT (signbit (-zerod));
+ else
+ ASSERT (!signbit (-zerod));
+ /* Infinite values. */
+ ASSERT (!signbit (1.0 / 0.0));
+ ASSERT (signbit (-1.0 / 0.0));
+ /* Quiet NaN. */
+ (void) signbit (zerod / zerod);
+#if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+ memory_double m;
+ m.value = zerod / zerod;
+# if DBL_EXPBIT0_BIT > 0
+ m.word[DBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (DBL_EXPBIT0_BIT - 1);
+# else
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[DBL_EXPBIT0_WORD + (DBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << DBL_EXPBIT0_BIT;
+ (void) signbit (m.value);
+ #undef NWORDS
+ }
+#endif
+}
+
+static void
+test_signbitl ()
+{
+ /* Finite values. */
+ ASSERT (!signbit (3.141L));
+ ASSERT (!signbit (3.141e30L));
+ ASSERT (!signbit (3.141e-30L));
+ ASSERT (signbit (-2.718L));
+ ASSERT (signbit (-2.718e30L));
+ ASSERT (signbit (-2.718e-30L));
+ /* Zeros. */
+ ASSERT (!signbit (0.0L));
+ if (1.0L / minus_zerol < 0)
+ ASSERT (signbit (minus_zerol));
+ else
+ ASSERT (!signbit (minus_zerol));
+ /* Infinite values. */
+ ASSERT (!signbit (1.0L / 0.0L));
+ ASSERT (signbit (-1.0L / 0.0L));
+ /* Quiet NaN. */
+ (void) signbit (zerol / zerol);
+#if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
+ /* Signalling NaN. */
+ {
+ #define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { long double value; unsigned int word[NWORDS]; } memory_long_double;
+ memory_long_double m;
+ m.value = zerol / zerol;
+# if LDBL_EXPBIT0_BIT > 0
+ m.word[LDBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (LDBL_EXPBIT0_BIT - 1);
+# else
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+# endif
+ m.word[LDBL_EXPBIT0_WORD + (LDBL_EXPBIT0_WORD < NWORDS / 2 ? 1 : - 1)]
+ |= (unsigned int) 1 << LDBL_EXPBIT0_BIT;
+ (void) signbit (m.value);
+ #undef NWORDS
+ }
+#endif
+}
+
+int
+main ()
+{
+ test_signbitf ();
+ test_signbitd ();
+ test_signbitl ();
+ return 0;
+}
diff --git a/gnulib/tests/test-sigpipe.c b/gnulib/tests/test-sigpipe.c
new file mode 100644
index 00000000..24390394
--- /dev/null
+++ b/gnulib/tests/test-sigpipe.c
@@ -0,0 +1,69 @@
+/* Test of SIGPIPE handling.
+ Copyright (C) 2008, 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <signal.h>
+
+/* Check that SIGPIPE is defined. */
+int s = SIGPIPE;
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+static void
+handler (int sig)
+{
+ exit (0);
+}
+
+int
+main (int argc, char **argv)
+{
+ char mode = argv[1][0];
+
+ switch (mode)
+ {
+ case 'A': signal (SIGPIPE, SIG_DFL); break;
+ case 'B': signal (SIGPIPE, SIG_IGN); break;
+ case 'C': signal (SIGPIPE, handler); break;
+ }
+
+ /* Produce infinite output. Since it is piped into "head -1", the writes
+ must ultimately fail. */
+ for (;;)
+ {
+ char c[2] = { 'y', '\n' };
+ int ret = write (1, c, sizeof (c));
+ if (ret <= 0)
+ {
+ switch (mode)
+ {
+ case 'B': /* The write() call should have failed with EPIPE. */
+ if (ret < 0 && errno == EPIPE)
+ exit (0);
+ /*FALLTHROUGH*/
+ case 'A': /* The process should silently die. */
+ case 'C': /* The handler should have been called. */
+ fprintf (stderr, "write() returned %d with error %d.\n", ret, errno);
+ exit (1);
+ }
+ }
+ }
+}
diff --git a/gnulib/tests/test-sigpipe.sh b/gnulib/tests/test-sigpipe.sh
new file mode 100755
index 00000000..bc2baf24
--- /dev/null
+++ b/gnulib/tests/test-sigpipe.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+# Test signal's default behaviour.
+tmpfiles="$tmpfiles t-sigpipeA.tmp"
+./test-sigpipe${EXEEXT} A 2> t-sigpipeA.tmp | head -1 > /dev/null
+if test -s t-sigpipeA.tmp; then
+ LC_ALL=C tr -d '\r' < t-sigpipeA.tmp
+ rm -fr $tmpfiles; exit 1
+fi
+
+# Test signal's ignored behaviour.
+tmpfiles="$tmpfiles t-sigpipeB.tmp"
+./test-sigpipe${EXEEXT} B 2> t-sigpipeB.tmp | head -1 > /dev/null
+if test -s t-sigpipeB.tmp; then
+ LC_ALL=C tr -d '\r' < t-sigpipeB.tmp
+ rm -fr $tmpfiles; exit 1
+fi
+
+# Test signal's behaviour when a handler is installed.
+tmpfiles="$tmpfiles t-sigpipeC.tmp"
+./test-sigpipe${EXEEXT} B 2> t-sigpipeC.tmp | head -1 > /dev/null
+if test -s t-sigpipeC.tmp; then
+ LC_ALL=C tr -d '\r' < t-sigpipeC.tmp
+ rm -fr $tmpfiles; exit 1
+fi
+
+rm -fr $tmpfiles
+exit 0
diff --git a/gnulib/tests/test-sin.c b/gnulib/tests/test-sin.c
new file mode 100644
index 00000000..8314e449
--- /dev/null
+++ b/gnulib/tests/test-sin.c
@@ -0,0 +1,40 @@
+/* Test of sin() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sin, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = sin (x);
+ ASSERT (y >= 0.5646424733 && y <= 0.5646424734);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sinh.c b/gnulib/tests/test-sinh.c
new file mode 100644
index 00000000..35a8a827
--- /dev/null
+++ b/gnulib/tests/test-sinh.c
@@ -0,0 +1,40 @@
+/* Test of sinh() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sinh, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = sinh (x);
+ ASSERT (y >= 0.6366535821 && y <= 0.6366535822);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sinl.c b/gnulib/tests/test-sinl.c
new file mode 100644
index 00000000..8d69b26c
--- /dev/null
+++ b/gnulib/tests/test-sinl.c
@@ -0,0 +1,45 @@
+/* Test of sinl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sinl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = sinl (x);
+ ASSERT (y >= 0.5646424733L && y <= 0.5646424734L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sleep.c b/gnulib/tests/test-sleep.c
new file mode 100644
index 00000000..6878ccf5
--- /dev/null
+++ b/gnulib/tests/test-sleep.c
@@ -0,0 +1,58 @@
+/* Test of sleep() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sleep, unsigned int, (unsigned int));
+
+#include <signal.h>
+
+#include "macros.h"
+
+#if HAVE_DECL_ALARM
+static void
+handle_alarm (int sig)
+{
+ if (sig != SIGALRM)
+ _exit (1);
+}
+#endif
+
+int
+main (void)
+{
+ ASSERT (sleep (1) <= 1);
+
+ ASSERT (sleep (0) == 0);
+
+#if HAVE_DECL_ALARM
+ {
+ const unsigned int pentecost = 50 * 24 * 60 * 60; /* 50 days. */
+ unsigned int remaining;
+ signal (SIGALRM, handle_alarm);
+ alarm (1);
+ remaining = sleep (pentecost);
+ ASSERT (pentecost - 10 < remaining && remaining <= pentecost);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-snprintf-posix.c b/gnulib/tests/test-snprintf-posix.c
new file mode 100644
index 00000000..452e90ce
--- /dev/null
+++ b/gnulib/tests/test-snprintf-posix.c
@@ -0,0 +1,38 @@
+/* Test of POSIX compatible snprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include <float.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-snprintf-posix.h"
+
+int
+main (int argc, char *argv[])
+{
+ test_function (snprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-snprintf-posix.h b/gnulib/tests/test-snprintf-posix.h
new file mode 100644
index 00000000..b796d5ba
--- /dev/null
+++ b/gnulib/tests/test-snprintf-posix.h
@@ -0,0 +1,3113 @@
+/* Test of POSIX compatible vsnprintf() and snprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include "nan.h"
+
+/* The SGI MIPS floating-point format does not distinguish 0.0 and -0.0. */
+static int
+have_minus_zero ()
+{
+ static double plus_zero = 0.0;
+ double minus_zero = - plus_zero;
+ return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zerod instead. */
+double zerod = 0.0;
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zerol instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zerol (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zerol compute_minus_zerol ()
+#else
+long double minus_zerol = -0.0L;
+#endif
+
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+#ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+#else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+#endif
+
+static int
+strmatch (const char *pattern, const char *string)
+{
+ if (strlen (pattern) != strlen (string))
+ return 0;
+ for (; *pattern != '\0'; pattern++, string++)
+ if (*pattern != '*' && *string != *pattern)
+ return 0;
+ return 1;
+}
+
+/* Test whether string[start_index..end_index-1] is a valid textual
+ representation of NaN. */
+static int
+strisnan (const char *string, size_t start_index, size_t end_index, int uppercase)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static void
+test_function (int (*my_snprintf) (char *, size_t, const char *, ...))
+{
+ char buf[8];
+ int size;
+
+ /* Test return value convention. */
+
+ for (size = 0; size <= 8; size++)
+ {
+ int retval;
+
+ memcpy (buf, "DEADBEEF", 8);
+ retval = my_snprintf (buf, size, "%d", 12345);
+ ASSERT (retval == 5);
+ if (size < 6)
+ {
+ if (size > 0)
+ {
+ ASSERT (memcmp (buf, "12345", size - 1) == 0);
+ ASSERT (buf[size - 1] == '\0');
+ }
+ ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
+ }
+ else
+ {
+ ASSERT (memcmp (buf, "12345\0EF", 8) == 0);
+ }
+ }
+
+ /* Test support of size specifiers as in C99. */
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
+ ASSERT (strcmp (result, "12345671 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%zu %d", (size_t) 12345672, 33, 44, 55);
+ ASSERT (strcmp (result, "12345672 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
+ ASSERT (strcmp (result, "12345673 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", (long double) 1.5, 33, 44, 55);
+ ASSERT (strcmp (result, "1.5 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%a %d", 3.1416015625, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%A %d", -3.1416015625, 33, 44, 55);
+ ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
+ || strcmp (result, "-0X3.244P+0 33") == 0
+ || strcmp (result, "-0X6.488P-1 33") == 0
+ || strcmp (result, "-0XC.91P-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%a %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%a %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%a %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%a %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%a %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding near the decimal point. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.0a %d", 1.5, 33, 44, 55);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 0. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.0a %d", 1.51, 33, 44, 55);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 1. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.1a %d", 1.51, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.8p+0 33") == 0
+ || strcmp (result, "0x3.0p-1 33") == 0
+ || strcmp (result, "0x6.1p-2 33") == 0
+ || strcmp (result, "0xc.1p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 2. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2a %d", 1.51, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.83p+0 33") == 0
+ || strcmp (result, "0x3.05p-1 33") == 0
+ || strcmp (result, "0x6.0ap-2 33") == 0
+ || strcmp (result, "0xc.14p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 3. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.3a %d", 1.51, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.829p+0 33") == 0
+ || strcmp (result, "0x3.052p-1 33") == 0
+ || strcmp (result, "0x6.0a4p-2 33") == 0
+ || strcmp (result, "0xc.148p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.3a %d", 1.49999, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.800p+0 33") == 0
+ || strcmp (result, "0x3.000p-1 33") == 0
+ || strcmp (result, "0x6.000p-2 33") == 0
+ || strcmp (result, "0xc.000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000.
+ This shows a MacOS X 10.3.9 (Darwin 7.9) bug. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.1a %d", 1.999, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.0p+1 33") == 0
+ || strcmp (result, "0x2.0p+0 33") == 0
+ || strcmp (result, "0x4.0p-1 33") == 0
+ || strcmp (result, "0x8.0p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%10a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.10a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Large precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.50a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%-10a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7p-2 33") == 0
+ || strcmp (result, "0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%+a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
+ || strcmp (result, "+0x3.8p-1 33") == 0
+ || strcmp (result, "+0x7p-2 33") == 0
+ || strcmp (result, "+0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "% a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7.p-2 33") == 0
+ || strcmp (result, "0xe.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#a %d", 1.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.p+0 33") == 0
+ || strcmp (result, "0x2.p-1 33") == 0
+ || strcmp (result, "0x4.p-2 33") == 0
+ || strcmp (result, "0x8.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%010a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x001.cp+0 33") == 0
+ || strcmp (result, "0x003.8p-1 33") == 0
+ || strcmp (result, "0x00007p-2 33") == 0
+ || strcmp (result, "0x0000ep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%010a %d", 1.0 / 0.0, 33, 44, 55);
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strcmp (result, " inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%050a %d", NaNd (), 33, 44, 55);
+ /* "0000000nan 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", 3.1416015625L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LA %d", -3.1416015625L, 33, 44, 55);
+ ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
+ || strcmp (result, "-0X3.244P+0 33") == 0
+ || strcmp (result, "-0X6.488P-1 33") == 0
+ || strcmp (result, "-0XC.91P-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#endif
+
+ { /* Rounding near the decimal point. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.0La %d", 1.5L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 0. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.0La %d", 1.51L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 1. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.1La %d", 1.51L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.8p+0 33") == 0
+ || strcmp (result, "0x3.0p-1 33") == 0
+ || strcmp (result, "0x6.1p-2 33") == 0
+ || strcmp (result, "0xc.1p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 2. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2La %d", 1.51L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.83p+0 33") == 0
+ || strcmp (result, "0x3.05p-1 33") == 0
+ || strcmp (result, "0x6.0ap-2 33") == 0
+ || strcmp (result, "0xc.14p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 3. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.3La %d", 1.51L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.829p+0 33") == 0
+ || strcmp (result, "0x3.052p-1 33") == 0
+ || strcmp (result, "0x6.0a4p-2 33") == 0
+ || strcmp (result, "0xc.148p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.3La %d", 1.49999L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.800p+0 33") == 0
+ || strcmp (result, "0x3.000p-1 33") == 0
+ || strcmp (result, "0x6.000p-2 33") == 0
+ || strcmp (result, "0xc.000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000.
+ This shows a MacOS X 10.3.9 (Darwin 7.9) bug and a
+ glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.1La %d", 1.999L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.0p+1 33") == 0
+ || strcmp (result, "0x2.0p+0 33") == 0
+ || strcmp (result, "0x4.0p-1 33") == 0
+ || strcmp (result, "0x8.0p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%10La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.10La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Large precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.50La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%-10La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7p-2 33") == 0
+ || strcmp (result, "0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%+La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
+ || strcmp (result, "+0x3.8p-1 33") == 0
+ || strcmp (result, "+0x7p-2 33") == 0
+ || strcmp (result, "+0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "% La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7.p-2 33") == 0
+ || strcmp (result, "0xe.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#La %d", 1.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.p+0 33") == 0
+ || strcmp (result, "0x2.p-1 33") == 0
+ || strcmp (result, "0x4.p-2 33") == 0
+ || strcmp (result, "0x8.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%010La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x001.cp+0 33") == 0
+ || strcmp (result, "0x003.8p-1 33") == 0
+ || strcmp (result, "0x00007p-2 33") == 0
+ || strcmp (result, "0x0000ep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%010La %d", 1.0L / 0.0L, 33, 44, 55);
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strcmp (result, " inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%050La %d", NaNl (), 33, 44, 55);
+ /* "0000000nan 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %f format directive. */
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f %d", 12.75, 33, 44, 55);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f %d", 1234567.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "0.000000" },
+ { 1.234321234321234e-36, "0.000000" },
+ { 1.234321234321234e-35, "0.000000" },
+ { 1.234321234321234e-34, "0.000000" },
+ { 1.234321234321234e-33, "0.000000" },
+ { 1.234321234321234e-32, "0.000000" },
+ { 1.234321234321234e-31, "0.000000" },
+ { 1.234321234321234e-30, "0.000000" },
+ { 1.234321234321234e-29, "0.000000" },
+ { 1.234321234321234e-28, "0.000000" },
+ { 1.234321234321234e-27, "0.000000" },
+ { 1.234321234321234e-26, "0.000000" },
+ { 1.234321234321234e-25, "0.000000" },
+ { 1.234321234321234e-24, "0.000000" },
+ { 1.234321234321234e-23, "0.000000" },
+ { 1.234321234321234e-22, "0.000000" },
+ { 1.234321234321234e-21, "0.000000" },
+ { 1.234321234321234e-20, "0.000000" },
+ { 1.234321234321234e-19, "0.000000" },
+ { 1.234321234321234e-18, "0.000000" },
+ { 1.234321234321234e-17, "0.000000" },
+ { 1.234321234321234e-16, "0.000000" },
+ { 1.234321234321234e-15, "0.000000" },
+ { 1.234321234321234e-14, "0.000000" },
+ { 1.234321234321234e-13, "0.000000" },
+ { 1.234321234321234e-12, "0.000000" },
+ { 1.234321234321234e-11, "0.000000" },
+ { 1.234321234321234e-10, "0.000000" },
+ { 1.234321234321234e-9, "0.000000" },
+ { 1.234321234321234e-8, "0.000000" },
+ { 1.234321234321234e-7, "0.000000" },
+ { 1.234321234321234e-6, "0.000001" },
+ { 1.234321234321234e-5, "0.000012" },
+ { 1.234321234321234e-4, "0.000123" },
+ { 1.234321234321234e-3, "0.001234" },
+ { 1.234321234321234e-2, "0.012343" },
+ { 1.234321234321234e-1, "0.123432" },
+ { 1.234321234321234, "1.234321" },
+ { 1.234321234321234e1, "12.343212" },
+ { 1.234321234321234e2, "123.432123" },
+ { 1.234321234321234e3, "1234.321234" },
+ { 1.234321234321234e4, "12343.212343" },
+ { 1.234321234321234e5, "123432.123432" },
+ { 1.234321234321234e6, "1234321.234321" },
+ { 1.234321234321234e7, "12343212.343212" },
+ { 1.234321234321234e8, "123432123.432123" },
+ { 1.234321234321234e9, "1234321234.321234" },
+ { 1.234321234321234e10, "12343212343.2123**" },
+ { 1.234321234321234e11, "123432123432.123***" },
+ { 1.234321234321234e12, "1234321234321.23****" },
+ { 1.234321234321234e13, "12343212343212.3*****" },
+ { 1.234321234321234e14, "123432123432123.******" },
+ { 1.234321234321234e15, "1234321234321234.000000" },
+ { 1.234321234321234e16, "123432123432123**.000000" },
+ { 1.234321234321234e17, "123432123432123***.000000" },
+ { 1.234321234321234e18, "123432123432123****.000000" },
+ { 1.234321234321234e19, "123432123432123*****.000000" },
+ { 1.234321234321234e20, "123432123432123******.000000" },
+ { 1.234321234321234e21, "123432123432123*******.000000" },
+ { 1.234321234321234e22, "123432123432123********.000000" },
+ { 1.234321234321234e23, "123432123432123*********.000000" },
+ { 1.234321234321234e24, "123432123432123**********.000000" },
+ { 1.234321234321234e25, "123432123432123***********.000000" },
+ { 1.234321234321234e26, "123432123432123************.000000" },
+ { 1.234321234321234e27, "123432123432123*************.000000" },
+ { 1.234321234321234e28, "123432123432123**************.000000" },
+ { 1.234321234321234e29, "123432123432123***************.000000" },
+ { 1.234321234321234e30, "123432123432123****************.000000" },
+ { 1.234321234321234e31, "123432123432123*****************.000000" },
+ { 1.234321234321234e32, "123432123432123******************.000000" },
+ { 1.234321234321234e33, "123432123432123*******************.000000" },
+ { 1.234321234321234e34, "123432123432123********************.000000" },
+ { 1.234321234321234e35, "123432123432123*********************.000000" },
+ { 1.234321234321234e36, "123432123432123**********************.000000" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f", data[k].value);
+ ASSERT (strmatch (data[k].string, result));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f %d", -0.03125, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%f %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%10f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%-10f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%+f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "% f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015f %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015f %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%050f %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.f %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2f %d", 999.951, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2f %d", 999.996, 33, 44, 55);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", 12.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", 1234567.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "0.000000" },
+ { 1.234321234321234e-36L, "0.000000" },
+ { 1.234321234321234e-35L, "0.000000" },
+ { 1.234321234321234e-34L, "0.000000" },
+ { 1.234321234321234e-33L, "0.000000" },
+ { 1.234321234321234e-32L, "0.000000" },
+ { 1.234321234321234e-31L, "0.000000" },
+ { 1.234321234321234e-30L, "0.000000" },
+ { 1.234321234321234e-29L, "0.000000" },
+ { 1.234321234321234e-28L, "0.000000" },
+ { 1.234321234321234e-27L, "0.000000" },
+ { 1.234321234321234e-26L, "0.000000" },
+ { 1.234321234321234e-25L, "0.000000" },
+ { 1.234321234321234e-24L, "0.000000" },
+ { 1.234321234321234e-23L, "0.000000" },
+ { 1.234321234321234e-22L, "0.000000" },
+ { 1.234321234321234e-21L, "0.000000" },
+ { 1.234321234321234e-20L, "0.000000" },
+ { 1.234321234321234e-19L, "0.000000" },
+ { 1.234321234321234e-18L, "0.000000" },
+ { 1.234321234321234e-17L, "0.000000" },
+ { 1.234321234321234e-16L, "0.000000" },
+ { 1.234321234321234e-15L, "0.000000" },
+ { 1.234321234321234e-14L, "0.000000" },
+ { 1.234321234321234e-13L, "0.000000" },
+ { 1.234321234321234e-12L, "0.000000" },
+ { 1.234321234321234e-11L, "0.000000" },
+ { 1.234321234321234e-10L, "0.000000" },
+ { 1.234321234321234e-9L, "0.000000" },
+ { 1.234321234321234e-8L, "0.000000" },
+ { 1.234321234321234e-7L, "0.000000" },
+ { 1.234321234321234e-6L, "0.000001" },
+ { 1.234321234321234e-5L, "0.000012" },
+ { 1.234321234321234e-4L, "0.000123" },
+ { 1.234321234321234e-3L, "0.001234" },
+ { 1.234321234321234e-2L, "0.012343" },
+ { 1.234321234321234e-1L, "0.123432" },
+ { 1.234321234321234L, "1.234321" },
+ { 1.234321234321234e1L, "12.343212" },
+ { 1.234321234321234e2L, "123.432123" },
+ { 1.234321234321234e3L, "1234.321234" },
+ { 1.234321234321234e4L, "12343.212343" },
+ { 1.234321234321234e5L, "123432.123432" },
+ { 1.234321234321234e6L, "1234321.234321" },
+ { 1.234321234321234e7L, "12343212.343212" },
+ { 1.234321234321234e8L, "123432123.432123" },
+ { 1.234321234321234e9L, "1234321234.321234" },
+ { 1.234321234321234e10L, "12343212343.2123**" },
+ { 1.234321234321234e11L, "123432123432.123***" },
+ { 1.234321234321234e12L, "1234321234321.23****" },
+ { 1.234321234321234e13L, "12343212343212.3*****" },
+ { 1.234321234321234e14L, "123432123432123.******" },
+ { 1.234321234321234e15L, "1234321234321234.000000" },
+ { 1.234321234321234e16L, "123432123432123**.000000" },
+ { 1.234321234321234e17L, "123432123432123***.000000" },
+ { 1.234321234321234e18L, "123432123432123****.000000" },
+ { 1.234321234321234e19L, "123432123432123*****.000000" },
+ { 1.234321234321234e20L, "123432123432123******.000000" },
+ { 1.234321234321234e21L, "123432123432123*******.000000" },
+ { 1.234321234321234e22L, "123432123432123********.000000" },
+ { 1.234321234321234e23L, "123432123432123*********.000000" },
+ { 1.234321234321234e24L, "123432123432123**********.000000" },
+ { 1.234321234321234e25L, "123432123432123***********.000000" },
+ { 1.234321234321234e26L, "123432123432123************.000000" },
+ { 1.234321234321234e27L, "123432123432123*************.000000" },
+ { 1.234321234321234e28L, "123432123432123**************.000000" },
+ { 1.234321234321234e29L, "123432123432123***************.000000" },
+ { 1.234321234321234e30L, "123432123432123****************.000000" },
+ { 1.234321234321234e31L, "123432123432123*****************.000000" },
+ { 1.234321234321234e32L, "123432123432123******************.000000" },
+ { 1.234321234321234e33L, "123432123432123*******************.000000" },
+ { 1.234321234321234e34L, "123432123432123********************.000000" },
+ { 1.234321234321234e35L, "123432123432123*********************.000000" },
+ { 1.234321234321234e36L, "123432123432123**********************.000000" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf", data[k].value);
+ ASSERT (strmatch (data[k].string, result));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", -0.03125L, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#endif
+
+ { /* Width. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%-10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%+Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "% Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015Lf %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%050Lf %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2Lf %d", 999.951L, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2Lf %d", 999.996L, 33, 44, 55);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %F format directive. */
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%F %d", 12.75, 33, 44, 55);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%F %d", 1234567.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%F %d", -0.03125, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%F %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%F %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%F %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "INF 33") == 0
+ || strcmp (result, "INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%F %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-INF 33") == 0
+ || strcmp (result, "-INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%F %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 1)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015F %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015F %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, " -INF 33") == 0
+ || strcmp (result, " -INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.F %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2F %d", 999.951, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2F %d", 999.996, 33, 44, 55);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LF %d", 12.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LF %d", 1234567.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LF %d", -0.03125L, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LF %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LF %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LF %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "INF 33") == 0
+ || strcmp (result, "INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LF %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-INF 33") == 0
+ || strcmp (result, "-INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%LF %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 1)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015LF %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, " -INF 33") == 0
+ || strcmp (result, " -INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2LF %d", 999.951L, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.2LF %d", 999.996L, 33, 44, 55);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %e format directive. */
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e %d", 12.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e %d", 1234567.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1.234567e+06 33") == 0
+ || strcmp (result, "1.234567e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "1.234321e-37" },
+ { 1.234321234321234e-36, "1.234321e-36" },
+ { 1.234321234321234e-35, "1.234321e-35" },
+ { 1.234321234321234e-34, "1.234321e-34" },
+ { 1.234321234321234e-33, "1.234321e-33" },
+ { 1.234321234321234e-32, "1.234321e-32" },
+ { 1.234321234321234e-31, "1.234321e-31" },
+ { 1.234321234321234e-30, "1.234321e-30" },
+ { 1.234321234321234e-29, "1.234321e-29" },
+ { 1.234321234321234e-28, "1.234321e-28" },
+ { 1.234321234321234e-27, "1.234321e-27" },
+ { 1.234321234321234e-26, "1.234321e-26" },
+ { 1.234321234321234e-25, "1.234321e-25" },
+ { 1.234321234321234e-24, "1.234321e-24" },
+ { 1.234321234321234e-23, "1.234321e-23" },
+ { 1.234321234321234e-22, "1.234321e-22" },
+ { 1.234321234321234e-21, "1.234321e-21" },
+ { 1.234321234321234e-20, "1.234321e-20" },
+ { 1.234321234321234e-19, "1.234321e-19" },
+ { 1.234321234321234e-18, "1.234321e-18" },
+ { 1.234321234321234e-17, "1.234321e-17" },
+ { 1.234321234321234e-16, "1.234321e-16" },
+ { 1.234321234321234e-15, "1.234321e-15" },
+ { 1.234321234321234e-14, "1.234321e-14" },
+ { 1.234321234321234e-13, "1.234321e-13" },
+ { 1.234321234321234e-12, "1.234321e-12" },
+ { 1.234321234321234e-11, "1.234321e-11" },
+ { 1.234321234321234e-10, "1.234321e-10" },
+ { 1.234321234321234e-9, "1.234321e-09" },
+ { 1.234321234321234e-8, "1.234321e-08" },
+ { 1.234321234321234e-7, "1.234321e-07" },
+ { 1.234321234321234e-6, "1.234321e-06" },
+ { 1.234321234321234e-5, "1.234321e-05" },
+ { 1.234321234321234e-4, "1.234321e-04" },
+ { 1.234321234321234e-3, "1.234321e-03" },
+ { 1.234321234321234e-2, "1.234321e-02" },
+ { 1.234321234321234e-1, "1.234321e-01" },
+ { 1.234321234321234, "1.234321e+00" },
+ { 1.234321234321234e1, "1.234321e+01" },
+ { 1.234321234321234e2, "1.234321e+02" },
+ { 1.234321234321234e3, "1.234321e+03" },
+ { 1.234321234321234e4, "1.234321e+04" },
+ { 1.234321234321234e5, "1.234321e+05" },
+ { 1.234321234321234e6, "1.234321e+06" },
+ { 1.234321234321234e7, "1.234321e+07" },
+ { 1.234321234321234e8, "1.234321e+08" },
+ { 1.234321234321234e9, "1.234321e+09" },
+ { 1.234321234321234e10, "1.234321e+10" },
+ { 1.234321234321234e11, "1.234321e+11" },
+ { 1.234321234321234e12, "1.234321e+12" },
+ { 1.234321234321234e13, "1.234321e+13" },
+ { 1.234321234321234e14, "1.234321e+14" },
+ { 1.234321234321234e15, "1.234321e+15" },
+ { 1.234321234321234e16, "1.234321e+16" },
+ { 1.234321234321234e17, "1.234321e+17" },
+ { 1.234321234321234e18, "1.234321e+18" },
+ { 1.234321234321234e19, "1.234321e+19" },
+ { 1.234321234321234e20, "1.234321e+20" },
+ { 1.234321234321234e21, "1.234321e+21" },
+ { 1.234321234321234e22, "1.234321e+22" },
+ { 1.234321234321234e23, "1.234321e+23" },
+ { 1.234321234321234e24, "1.234321e+24" },
+ { 1.234321234321234e25, "1.234321e+25" },
+ { 1.234321234321234e26, "1.234321e+26" },
+ { 1.234321234321234e27, "1.234321e+27" },
+ { 1.234321234321234e28, "1.234321e+28" },
+ { 1.234321234321234e29, "1.234321e+29" },
+ { 1.234321234321234e30, "1.234321e+30" },
+ { 1.234321234321234e31, "1.234321e+31" },
+ { 1.234321234321234e32, "1.234321e+32" },
+ { 1.234321234321234e33, "1.234321e+33" },
+ { 1.234321234321234e34, "1.234321e+34" },
+ { 1.234321234321234e35, "1.234321e+35" },
+ { 1.234321234321234e36, "1.234321e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e %d", -0.03125, 33, 44, 55);
+ ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+ || strcmp (result, "-3.125000e-002 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000e+00 33") == 0
+ || strcmp (result, "0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+ || strcmp (result, "-0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%e %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%15e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%-15e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%+e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+ || strcmp (result, "+1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "% e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "2.e+00 33") == 0
+ || strcmp (result, "2.e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.e %d", 9.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015e %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+ || strcmp (result, "001.234000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015e %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%050e %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.e %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4e %d", 999.951, 33, 44, 55);
+ ASSERT (strcmp (result, "9.9995e+02 33") == 0
+ || strcmp (result, "9.9995e+002 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4e %d", 999.996, 33, 44, 55);
+ ASSERT (strcmp (result, "1.0000e+03 33") == 0
+ || strcmp (result, "1.0000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", 12.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", 1234567.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.234567e+06 33") == 0
+ || strcmp (result, "1.234567e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "1.234321e-37" },
+ { 1.234321234321234e-36L, "1.234321e-36" },
+ { 1.234321234321234e-35L, "1.234321e-35" },
+ { 1.234321234321234e-34L, "1.234321e-34" },
+ { 1.234321234321234e-33L, "1.234321e-33" },
+ { 1.234321234321234e-32L, "1.234321e-32" },
+ { 1.234321234321234e-31L, "1.234321e-31" },
+ { 1.234321234321234e-30L, "1.234321e-30" },
+ { 1.234321234321234e-29L, "1.234321e-29" },
+ { 1.234321234321234e-28L, "1.234321e-28" },
+ { 1.234321234321234e-27L, "1.234321e-27" },
+ { 1.234321234321234e-26L, "1.234321e-26" },
+ { 1.234321234321234e-25L, "1.234321e-25" },
+ { 1.234321234321234e-24L, "1.234321e-24" },
+ { 1.234321234321234e-23L, "1.234321e-23" },
+ { 1.234321234321234e-22L, "1.234321e-22" },
+ { 1.234321234321234e-21L, "1.234321e-21" },
+ { 1.234321234321234e-20L, "1.234321e-20" },
+ { 1.234321234321234e-19L, "1.234321e-19" },
+ { 1.234321234321234e-18L, "1.234321e-18" },
+ { 1.234321234321234e-17L, "1.234321e-17" },
+ { 1.234321234321234e-16L, "1.234321e-16" },
+ { 1.234321234321234e-15L, "1.234321e-15" },
+ { 1.234321234321234e-14L, "1.234321e-14" },
+ { 1.234321234321234e-13L, "1.234321e-13" },
+ { 1.234321234321234e-12L, "1.234321e-12" },
+ { 1.234321234321234e-11L, "1.234321e-11" },
+ { 1.234321234321234e-10L, "1.234321e-10" },
+ { 1.234321234321234e-9L, "1.234321e-09" },
+ { 1.234321234321234e-8L, "1.234321e-08" },
+ { 1.234321234321234e-7L, "1.234321e-07" },
+ { 1.234321234321234e-6L, "1.234321e-06" },
+ { 1.234321234321234e-5L, "1.234321e-05" },
+ { 1.234321234321234e-4L, "1.234321e-04" },
+ { 1.234321234321234e-3L, "1.234321e-03" },
+ { 1.234321234321234e-2L, "1.234321e-02" },
+ { 1.234321234321234e-1L, "1.234321e-01" },
+ { 1.234321234321234L, "1.234321e+00" },
+ { 1.234321234321234e1L, "1.234321e+01" },
+ { 1.234321234321234e2L, "1.234321e+02" },
+ { 1.234321234321234e3L, "1.234321e+03" },
+ { 1.234321234321234e4L, "1.234321e+04" },
+ { 1.234321234321234e5L, "1.234321e+05" },
+ { 1.234321234321234e6L, "1.234321e+06" },
+ { 1.234321234321234e7L, "1.234321e+07" },
+ { 1.234321234321234e8L, "1.234321e+08" },
+ { 1.234321234321234e9L, "1.234321e+09" },
+ { 1.234321234321234e10L, "1.234321e+10" },
+ { 1.234321234321234e11L, "1.234321e+11" },
+ { 1.234321234321234e12L, "1.234321e+12" },
+ { 1.234321234321234e13L, "1.234321e+13" },
+ { 1.234321234321234e14L, "1.234321e+14" },
+ { 1.234321234321234e15L, "1.234321e+15" },
+ { 1.234321234321234e16L, "1.234321e+16" },
+ { 1.234321234321234e17L, "1.234321e+17" },
+ { 1.234321234321234e18L, "1.234321e+18" },
+ { 1.234321234321234e19L, "1.234321e+19" },
+ { 1.234321234321234e20L, "1.234321e+20" },
+ { 1.234321234321234e21L, "1.234321e+21" },
+ { 1.234321234321234e22L, "1.234321e+22" },
+ { 1.234321234321234e23L, "1.234321e+23" },
+ { 1.234321234321234e24L, "1.234321e+24" },
+ { 1.234321234321234e25L, "1.234321e+25" },
+ { 1.234321234321234e26L, "1.234321e+26" },
+ { 1.234321234321234e27L, "1.234321e+27" },
+ { 1.234321234321234e28L, "1.234321e+28" },
+ { 1.234321234321234e29L, "1.234321e+29" },
+ { 1.234321234321234e30L, "1.234321e+30" },
+ { 1.234321234321234e31L, "1.234321e+31" },
+ { 1.234321234321234e32L, "1.234321e+32" },
+ { 1.234321234321234e33L, "1.234321e+33" },
+ { 1.234321234321234e34L, "1.234321e+34" },
+ { 1.234321234321234e35L, "1.234321e+35" },
+ { 1.234321234321234e36L, "1.234321e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", -0.03125L, 33, 44, 55);
+ ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+ || strcmp (result, "-3.125000e-002 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000e+00 33") == 0
+ || strcmp (result, "0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+ || strcmp (result, "-0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#endif
+
+ { /* Width. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%-15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%+Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+ || strcmp (result, "+1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "% Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "2.e+00 33") == 0
+ || strcmp (result, "2.e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.Le %d", 9.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+ || strcmp (result, "001.234000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015Le %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%050Le %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4Le %d", 999.951L, 33, 44, 55);
+ ASSERT (strcmp (result, "9.9995e+02 33") == 0
+ || strcmp (result, "9.9995e+002 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4Le %d", 999.996L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.0000e+03 33") == 0
+ || strcmp (result, "1.0000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %g format directive. */
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g %d", 12.75, 33, 44, 55);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g %d", 1234567.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1.23457e+06 33") == 0
+ || strcmp (result, "1.23457e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "1.23432e-37" },
+ { 1.234321234321234e-36, "1.23432e-36" },
+ { 1.234321234321234e-35, "1.23432e-35" },
+ { 1.234321234321234e-34, "1.23432e-34" },
+ { 1.234321234321234e-33, "1.23432e-33" },
+ { 1.234321234321234e-32, "1.23432e-32" },
+ { 1.234321234321234e-31, "1.23432e-31" },
+ { 1.234321234321234e-30, "1.23432e-30" },
+ { 1.234321234321234e-29, "1.23432e-29" },
+ { 1.234321234321234e-28, "1.23432e-28" },
+ { 1.234321234321234e-27, "1.23432e-27" },
+ { 1.234321234321234e-26, "1.23432e-26" },
+ { 1.234321234321234e-25, "1.23432e-25" },
+ { 1.234321234321234e-24, "1.23432e-24" },
+ { 1.234321234321234e-23, "1.23432e-23" },
+ { 1.234321234321234e-22, "1.23432e-22" },
+ { 1.234321234321234e-21, "1.23432e-21" },
+ { 1.234321234321234e-20, "1.23432e-20" },
+ { 1.234321234321234e-19, "1.23432e-19" },
+ { 1.234321234321234e-18, "1.23432e-18" },
+ { 1.234321234321234e-17, "1.23432e-17" },
+ { 1.234321234321234e-16, "1.23432e-16" },
+ { 1.234321234321234e-15, "1.23432e-15" },
+ { 1.234321234321234e-14, "1.23432e-14" },
+ { 1.234321234321234e-13, "1.23432e-13" },
+ { 1.234321234321234e-12, "1.23432e-12" },
+ { 1.234321234321234e-11, "1.23432e-11" },
+ { 1.234321234321234e-10, "1.23432e-10" },
+ { 1.234321234321234e-9, "1.23432e-09" },
+ { 1.234321234321234e-8, "1.23432e-08" },
+ { 1.234321234321234e-7, "1.23432e-07" },
+ { 1.234321234321234e-6, "1.23432e-06" },
+ { 1.234321234321234e-5, "1.23432e-05" },
+ { 1.234321234321234e-4, "0.000123432" },
+ { 1.234321234321234e-3, "0.00123432" },
+ { 1.234321234321234e-2, "0.0123432" },
+ { 1.234321234321234e-1, "0.123432" },
+ { 1.234321234321234, "1.23432" },
+ { 1.234321234321234e1, "12.3432" },
+ { 1.234321234321234e2, "123.432" },
+ { 1.234321234321234e3, "1234.32" },
+ { 1.234321234321234e4, "12343.2" },
+ { 1.234321234321234e5, "123432" },
+ { 1.234321234321234e6, "1.23432e+06" },
+ { 1.234321234321234e7, "1.23432e+07" },
+ { 1.234321234321234e8, "1.23432e+08" },
+ { 1.234321234321234e9, "1.23432e+09" },
+ { 1.234321234321234e10, "1.23432e+10" },
+ { 1.234321234321234e11, "1.23432e+11" },
+ { 1.234321234321234e12, "1.23432e+12" },
+ { 1.234321234321234e13, "1.23432e+13" },
+ { 1.234321234321234e14, "1.23432e+14" },
+ { 1.234321234321234e15, "1.23432e+15" },
+ { 1.234321234321234e16, "1.23432e+16" },
+ { 1.234321234321234e17, "1.23432e+17" },
+ { 1.234321234321234e18, "1.23432e+18" },
+ { 1.234321234321234e19, "1.23432e+19" },
+ { 1.234321234321234e20, "1.23432e+20" },
+ { 1.234321234321234e21, "1.23432e+21" },
+ { 1.234321234321234e22, "1.23432e+22" },
+ { 1.234321234321234e23, "1.23432e+23" },
+ { 1.234321234321234e24, "1.23432e+24" },
+ { 1.234321234321234e25, "1.23432e+25" },
+ { 1.234321234321234e26, "1.23432e+26" },
+ { 1.234321234321234e27, "1.23432e+27" },
+ { 1.234321234321234e28, "1.23432e+28" },
+ { 1.234321234321234e29, "1.23432e+29" },
+ { 1.234321234321234e30, "1.23432e+30" },
+ { 1.234321234321234e31, "1.23432e+31" },
+ { 1.234321234321234e32, "1.23432e+32" },
+ { 1.234321234321234e33, "1.23432e+33" },
+ { 1.234321234321234e34, "1.23432e+34" },
+ { 1.234321234321234e35, "1.23432e+35" },
+ { 1.234321234321234e36, "1.23432e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (expected[strlen (expected) - 4] == 'e'
+ && strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g %d", -0.03125, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.03125 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%g %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%10g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%-10g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%+g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "% g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.75000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.g %d", 9.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%010g %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0000001234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015g %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%050g %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.g %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.5g %d", 999.951, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.5g %d", 999.996, 33, 44, 55);
+ ASSERT (strcmp (result, "1000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", 12.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", 1234567.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.23457e+06 33") == 0
+ || strcmp (result, "1.23457e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "1.23432e-37" },
+ { 1.234321234321234e-36L, "1.23432e-36" },
+ { 1.234321234321234e-35L, "1.23432e-35" },
+ { 1.234321234321234e-34L, "1.23432e-34" },
+ { 1.234321234321234e-33L, "1.23432e-33" },
+ { 1.234321234321234e-32L, "1.23432e-32" },
+ { 1.234321234321234e-31L, "1.23432e-31" },
+ { 1.234321234321234e-30L, "1.23432e-30" },
+ { 1.234321234321234e-29L, "1.23432e-29" },
+ { 1.234321234321234e-28L, "1.23432e-28" },
+ { 1.234321234321234e-27L, "1.23432e-27" },
+ { 1.234321234321234e-26L, "1.23432e-26" },
+ { 1.234321234321234e-25L, "1.23432e-25" },
+ { 1.234321234321234e-24L, "1.23432e-24" },
+ { 1.234321234321234e-23L, "1.23432e-23" },
+ { 1.234321234321234e-22L, "1.23432e-22" },
+ { 1.234321234321234e-21L, "1.23432e-21" },
+ { 1.234321234321234e-20L, "1.23432e-20" },
+ { 1.234321234321234e-19L, "1.23432e-19" },
+ { 1.234321234321234e-18L, "1.23432e-18" },
+ { 1.234321234321234e-17L, "1.23432e-17" },
+ { 1.234321234321234e-16L, "1.23432e-16" },
+ { 1.234321234321234e-15L, "1.23432e-15" },
+ { 1.234321234321234e-14L, "1.23432e-14" },
+ { 1.234321234321234e-13L, "1.23432e-13" },
+ { 1.234321234321234e-12L, "1.23432e-12" },
+ { 1.234321234321234e-11L, "1.23432e-11" },
+ { 1.234321234321234e-10L, "1.23432e-10" },
+ { 1.234321234321234e-9L, "1.23432e-09" },
+ { 1.234321234321234e-8L, "1.23432e-08" },
+ { 1.234321234321234e-7L, "1.23432e-07" },
+ { 1.234321234321234e-6L, "1.23432e-06" },
+ { 1.234321234321234e-5L, "1.23432e-05" },
+ { 1.234321234321234e-4L, "0.000123432" },
+ { 1.234321234321234e-3L, "0.00123432" },
+ { 1.234321234321234e-2L, "0.0123432" },
+ { 1.234321234321234e-1L, "0.123432" },
+ { 1.234321234321234L, "1.23432" },
+ { 1.234321234321234e1L, "12.3432" },
+ { 1.234321234321234e2L, "123.432" },
+ { 1.234321234321234e3L, "1234.32" },
+ { 1.234321234321234e4L, "12343.2" },
+ { 1.234321234321234e5L, "123432" },
+ { 1.234321234321234e6L, "1.23432e+06" },
+ { 1.234321234321234e7L, "1.23432e+07" },
+ { 1.234321234321234e8L, "1.23432e+08" },
+ { 1.234321234321234e9L, "1.23432e+09" },
+ { 1.234321234321234e10L, "1.23432e+10" },
+ { 1.234321234321234e11L, "1.23432e+11" },
+ { 1.234321234321234e12L, "1.23432e+12" },
+ { 1.234321234321234e13L, "1.23432e+13" },
+ { 1.234321234321234e14L, "1.23432e+14" },
+ { 1.234321234321234e15L, "1.23432e+15" },
+ { 1.234321234321234e16L, "1.23432e+16" },
+ { 1.234321234321234e17L, "1.23432e+17" },
+ { 1.234321234321234e18L, "1.23432e+18" },
+ { 1.234321234321234e19L, "1.23432e+19" },
+ { 1.234321234321234e20L, "1.23432e+20" },
+ { 1.234321234321234e21L, "1.23432e+21" },
+ { 1.234321234321234e22L, "1.23432e+22" },
+ { 1.234321234321234e23L, "1.23432e+23" },
+ { 1.234321234321234e24L, "1.23432e+24" },
+ { 1.234321234321234e25L, "1.23432e+25" },
+ { 1.234321234321234e26L, "1.23432e+26" },
+ { 1.234321234321234e27L, "1.23432e+27" },
+ { 1.234321234321234e28L, "1.23432e+28" },
+ { 1.234321234321234e29L, "1.23432e+29" },
+ { 1.234321234321234e30L, "1.23432e+30" },
+ { 1.234321234321234e31L, "1.23432e+31" },
+ { 1.234321234321234e32L, "1.23432e+32" },
+ { 1.234321234321234e33L, "1.23432e+33" },
+ { 1.234321234321234e34L, "1.23432e+34" },
+ { 1.234321234321234e35L, "1.23432e+35" },
+ { 1.234321234321234e36L, "1.23432e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (expected[strlen (expected) - 4] == 'e'
+ && strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", -0.03125L, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.03125 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#endif
+
+ { /* Width. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%-10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%+Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "% Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.75000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.Lg %d", 9.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%010Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0000001234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%015Lg %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%050Lg %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.5Lg %d", 999.951L, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.5Lg %d", 999.996L, 33, 44, 55);
+ ASSERT (strcmp (result, "1000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %n format directive. */
+
+ {
+ int count = -1;
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%d %n", 123, &count, 33, 44, 55);
+ ASSERT (strcmp (result, "123 ") == 0);
+ ASSERT (retval == strlen (result));
+ ASSERT (count == 4);
+ }
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%2$d %1$d", 33, 55);
+ ASSERT (strcmp (result, "55 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the grouping flag. */
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "%'d %d", 1234567, 99);
+ ASSERT (result[strlen (result) - 1] == '9');
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the left-adjust flag. */
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "a%*sc", -3, "b");
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "a%-*sc", 3, "b");
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[100];
+ int retval =
+ my_snprintf (result, sizeof (result), "a%-*sc", -3, "b");
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of large precision. */
+
+ {
+ char result[5000];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4000d %d", 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.*d %d", 4000, 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4000d %d", -1234567, 99);
+ size_t i;
+ ASSERT (result[0] == '-');
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[1 + i] == '0');
+ ASSERT (strcmp (result + 1 + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4000u %d", 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4000o %d", 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "4553207 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_snprintf (result, sizeof (result), "%.4000x %d", 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 6; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 6, "12d687 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_snprintf (result, sizeof (result), "%#.4000x %d", 1234567, 99);
+ size_t i;
+ ASSERT (result[0] == '0');
+ ASSERT (result[1] == 'x');
+ for (i = 0; i < 4000 - 6; i++)
+ ASSERT (result[2 + i] == '0');
+ ASSERT (strcmp (result + 2 + 4000 - 6, "12d687 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char input[5000];
+ char result[5000];
+ int retval;
+ size_t i;
+
+ for (i = 0; i < sizeof (input) - 1; i++)
+ input[i] = 'a' + ((1000000 / (i + 1)) % 26);
+ input[i] = '\0';
+ retval = my_snprintf (result, sizeof (result), "%.4000s %d", input, 99);
+ ASSERT (memcmp (result, input, 4000) == 0);
+ ASSERT (strcmp (result + 4000, " 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %s format directive. */
+
+ /* To verify that these tests succeed, it is necessary to run them under
+ a tool that checks against invalid memory accesses, such as ElectricFence
+ or "valgrind --tool=memcheck". */
+ {
+ size_t i;
+
+ for (i = 1; i <= 8; i++)
+ {
+ char *block;
+ char result[5000];
+ int retval;
+
+ block = (char *) malloc (i);
+ memcpy (block, "abcdefgh", i);
+ retval = my_snprintf (result, sizeof (result), "%.*s", (int) i, block);
+ ASSERT (memcmp (result, block, i) == 0);
+ ASSERT (result[i] == '\0');
+ ASSERT (retval == strlen (result));
+ free (block);
+ }
+ }
+#if HAVE_WCHAR_T
+ {
+ size_t i;
+
+ for (i = 1; i <= 8; i++)
+ {
+ wchar_t *block;
+ size_t j;
+ char result[5000];
+ int retval;
+
+ block = (wchar_t *) malloc (i * sizeof (wchar_t));
+ for (j = 0; j < i; j++)
+ block[j] = "abcdefgh"[j];
+ retval = my_snprintf (result, sizeof (result), "%.*ls", (int) i, block);
+ ASSERT (memcmp (result, "abcdefgh", i) == 0);
+ ASSERT (result[i] == '\0');
+ ASSERT (retval == strlen (result));
+ free (block);
+ }
+ }
+#endif
+}
diff --git a/gnulib/tests/test-snprintf.c b/gnulib/tests/test-snprintf.c
new file mode 100644
index 00000000..62a411bf
--- /dev/null
+++ b/gnulib/tests/test-snprintf.c
@@ -0,0 +1,64 @@
+/* Test of snprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (snprintf, int, (char *, size_t, char const *, ...));
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ char buf[8];
+ int size;
+ int retval;
+
+ for (size = 0; size <= 8; size++)
+ {
+ memcpy (buf, "DEADBEEF", 8);
+ retval = snprintf (buf, size, "%d", 12345);
+ if (size < 6)
+ {
+#if CHECK_SNPRINTF_POSIX
+ ASSERT (retval < 0 || retval >= size);
+#endif
+ if (size > 0)
+ {
+ ASSERT (memcmp (buf, "12345", size - 1) == 0);
+ ASSERT (buf[size - 1] == '\0' || buf[size - 1] == '0' + size);
+ }
+#if !CHECK_SNPRINTF_POSIX
+ if (size > 0)
+#endif
+ ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
+ }
+ else
+ {
+ ASSERT (retval == 5);
+ ASSERT (memcmp (buf, "12345\0EF", 8) == 0);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sockets.c b/gnulib/tests/test-sockets.c
new file mode 100644
index 00000000..ab5460ad
--- /dev/null
+++ b/gnulib/tests/test-sockets.c
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Simon Josefsson.
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "sockets.h"
+
+int
+main (void)
+{
+ int err;
+
+ err = gl_sockets_startup (SOCKETS_1_1);
+ if (err != 0)
+ {
+ printf ("wsastartup failed %d\n", err);
+ return 1;
+ }
+
+ err = gl_sockets_cleanup ();
+ if (err != 0)
+ {
+ printf ("wsacleanup failed %d\n", err);
+ return 1;
+ }
+
+ (void) gl_fd_to_handle (0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-spawn.c b/gnulib/tests/test-spawn.c
new file mode 100644
index 00000000..dc6b0a8e
--- /dev/null
+++ b/gnulib/tests/test-spawn.c
@@ -0,0 +1,54 @@
+/* Test of <spawn.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <spawn.h>
+
+/* Check for existence of required types. */
+struct check
+{
+ posix_spawnattr_t a;
+ posix_spawn_file_actions_t b;
+ mode_t c;
+ pid_t d;
+ sigset_t e;
+} s;
+
+/* struct sched_param is allowed to be an incomplete type without
+ <sched.h>, but must have a forward declaration to avoid a
+ compilation error in the following usage. */
+extern void f (struct sched_param *g);
+#include <sched.h>
+extern void f (struct sched_param *g);
+
+int
+main (void)
+{
+ switch (0)
+ {
+ case POSIX_SPAWN_RESETIDS:
+ case POSIX_SPAWN_SETPGROUP:
+ case POSIX_SPAWN_SETSIGDEF:
+ case POSIX_SPAWN_SETSIGMASK:
+ case POSIX_SPAWN_SETSCHEDPARAM:
+ case POSIX_SPAWN_SETSCHEDULER:
+ ;
+ }
+ return s.c + s.d;
+}
diff --git a/gnulib/tests/test-sprintf-posix.c b/gnulib/tests/test-sprintf-posix.c
new file mode 100644
index 00000000..db943da2
--- /dev/null
+++ b/gnulib/tests/test-sprintf-posix.c
@@ -0,0 +1,41 @@
+/* Test of POSIX compatible sprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sprintf, int, (char *, char const *, ...));
+
+#include <float.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-sprintf-posix.h"
+
+int
+main (int argc, char *argv[])
+{
+ test_function (sprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-sprintf-posix.h b/gnulib/tests/test-sprintf-posix.h
new file mode 100644
index 00000000..a50e57ca
--- /dev/null
+++ b/gnulib/tests/test-sprintf-posix.h
@@ -0,0 +1,3099 @@
+/* Test of POSIX compatible vsprintf() and sprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include "nan.h"
+
+/* The SGI MIPS floating-point format does not distinguish 0.0 and -0.0. */
+static int
+have_minus_zero ()
+{
+ static double plus_zero = 0.0;
+ double minus_zero = - plus_zero;
+ return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zerod instead. */
+double zerod = 0.0;
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zerol instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zerol (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zerol compute_minus_zerol ()
+#else
+long double minus_zerol = -0.0L;
+#endif
+
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+#ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+#else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+#endif
+
+static int
+strmatch (const char *pattern, const char *string)
+{
+ if (strlen (pattern) != strlen (string))
+ return 0;
+ for (; *pattern != '\0'; pattern++, string++)
+ if (*pattern != '*' && *string != *pattern)
+ return 0;
+ return 1;
+}
+
+/* Test whether string[start_index..end_index-1] is a valid textual
+ representation of NaN. */
+static int
+strisnan (const char *string, size_t start_index, size_t end_index, int uppercase)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static void
+test_function (int (*my_sprintf) (char *, const char *, ...))
+{
+ char buf[8];
+
+ /* Test return value convention. */
+
+ {
+ int retval;
+
+ memcpy (buf, "DEADBEEF", 8);
+ retval = my_sprintf (buf, "%d", 12345);
+ ASSERT (retval == 5);
+ ASSERT (memcmp (buf, "12345\0EF", 8) == 0);
+ }
+
+ /* Test support of size specifiers as in C99. */
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
+ ASSERT (strcmp (result, "12345671 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%zu %d", (size_t) 12345672, 33, 44, 55);
+ ASSERT (strcmp (result, "12345672 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
+ ASSERT (strcmp (result, "12345673 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", (long double) 1.5, 33, 44, 55);
+ ASSERT (strcmp (result, "1.5 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%a %d", 3.1416015625, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%A %d", -3.1416015625, 33, 44, 55);
+ ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
+ || strcmp (result, "-0X3.244P+0 33") == 0
+ || strcmp (result, "-0X6.488P-1 33") == 0
+ || strcmp (result, "-0XC.91P-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%a %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%a %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%a %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%a %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%a %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding near the decimal point. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.0a %d", 1.5, 33, 44, 55);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 0. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.0a %d", 1.51, 33, 44, 55);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 1. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.1a %d", 1.51, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.8p+0 33") == 0
+ || strcmp (result, "0x3.0p-1 33") == 0
+ || strcmp (result, "0x6.1p-2 33") == 0
+ || strcmp (result, "0xc.1p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 2. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.2a %d", 1.51, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.83p+0 33") == 0
+ || strcmp (result, "0x3.05p-1 33") == 0
+ || strcmp (result, "0x6.0ap-2 33") == 0
+ || strcmp (result, "0xc.14p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 3. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.3a %d", 1.51, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.829p+0 33") == 0
+ || strcmp (result, "0x3.052p-1 33") == 0
+ || strcmp (result, "0x6.0a4p-2 33") == 0
+ || strcmp (result, "0xc.148p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.3a %d", 1.49999, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.800p+0 33") == 0
+ || strcmp (result, "0x3.000p-1 33") == 0
+ || strcmp (result, "0x6.000p-2 33") == 0
+ || strcmp (result, "0xc.000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000.
+ This shows a MacOS X 10.3.9 (Darwin 7.9) bug. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.1a %d", 1.999, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.0p+1 33") == 0
+ || strcmp (result, "0x2.0p+0 33") == 0
+ || strcmp (result, "0x4.0p-1 33") == 0
+ || strcmp (result, "0x8.0p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%10a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.10a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Large precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.50a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%-10a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7p-2 33") == 0
+ || strcmp (result, "0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%+a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
+ || strcmp (result, "+0x3.8p-1 33") == 0
+ || strcmp (result, "+0x7p-2 33") == 0
+ || strcmp (result, "+0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "% a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7.p-2 33") == 0
+ || strcmp (result, "0xe.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#a %d", 1.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.p+0 33") == 0
+ || strcmp (result, "0x2.p-1 33") == 0
+ || strcmp (result, "0x4.p-2 33") == 0
+ || strcmp (result, "0x8.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%010a %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "0x001.cp+0 33") == 0
+ || strcmp (result, "0x003.8p-1 33") == 0
+ || strcmp (result, "0x00007p-2 33") == 0
+ || strcmp (result, "0x0000ep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%010a %d", 1.0 / 0.0, 33, 44, 55);
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strcmp (result, " inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%050a %d", NaNd (), 33, 44, 55);
+ /* "0000000nan 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", 3.1416015625L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LA %d", -3.1416015625L, 33, 44, 55);
+ ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
+ || strcmp (result, "-0X3.244P+0 33") == 0
+ || strcmp (result, "-0X6.488P-1 33") == 0
+ || strcmp (result, "-0XC.91P-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#endif
+
+ { /* Rounding near the decimal point. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.0La %d", 1.5L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 0. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.0La %d", 1.51L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 1. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.1La %d", 1.51L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.8p+0 33") == 0
+ || strcmp (result, "0x3.0p-1 33") == 0
+ || strcmp (result, "0x6.1p-2 33") == 0
+ || strcmp (result, "0xc.1p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 2. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.2La %d", 1.51L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.83p+0 33") == 0
+ || strcmp (result, "0x3.05p-1 33") == 0
+ || strcmp (result, "0x6.0ap-2 33") == 0
+ || strcmp (result, "0xc.14p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding with precision 3. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.3La %d", 1.51L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.829p+0 33") == 0
+ || strcmp (result, "0x3.052p-1 33") == 0
+ || strcmp (result, "0x6.0a4p-2 33") == 0
+ || strcmp (result, "0xc.148p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.3La %d", 1.49999L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.800p+0 33") == 0
+ || strcmp (result, "0x3.000p-1 33") == 0
+ || strcmp (result, "0x6.000p-2 33") == 0
+ || strcmp (result, "0xc.000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000.
+ This shows a MacOS X 10.3.9 (Darwin 7.9) bug and a
+ glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.1La %d", 1.999L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.0p+1 33") == 0
+ || strcmp (result, "0x2.0p+0 33") == 0
+ || strcmp (result, "0x4.0p-1 33") == 0
+ || strcmp (result, "0x8.0p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%10La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.10La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Large precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.50La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%-10La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7p-2 33") == 0
+ || strcmp (result, "0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%+La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
+ || strcmp (result, "+0x3.8p-1 33") == 0
+ || strcmp (result, "+0x7p-2 33") == 0
+ || strcmp (result, "+0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "% La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7.p-2 33") == 0
+ || strcmp (result, "0xe.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#La %d", 1.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x1.p+0 33") == 0
+ || strcmp (result, "0x2.p-1 33") == 0
+ || strcmp (result, "0x4.p-2 33") == 0
+ || strcmp (result, "0x8.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%010La %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "0x001.cp+0 33") == 0
+ || strcmp (result, "0x003.8p-1 33") == 0
+ || strcmp (result, "0x00007p-2 33") == 0
+ || strcmp (result, "0x0000ep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%010La %d", 1.0L / 0.0L, 33, 44, 55);
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strcmp (result, " inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%050La %d", NaNl (), 33, 44, 55);
+ /* "0000000nan 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %f format directive. */
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f %d", 12.75, 33, 44, 55);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f %d", 1234567.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "0.000000" },
+ { 1.234321234321234e-36, "0.000000" },
+ { 1.234321234321234e-35, "0.000000" },
+ { 1.234321234321234e-34, "0.000000" },
+ { 1.234321234321234e-33, "0.000000" },
+ { 1.234321234321234e-32, "0.000000" },
+ { 1.234321234321234e-31, "0.000000" },
+ { 1.234321234321234e-30, "0.000000" },
+ { 1.234321234321234e-29, "0.000000" },
+ { 1.234321234321234e-28, "0.000000" },
+ { 1.234321234321234e-27, "0.000000" },
+ { 1.234321234321234e-26, "0.000000" },
+ { 1.234321234321234e-25, "0.000000" },
+ { 1.234321234321234e-24, "0.000000" },
+ { 1.234321234321234e-23, "0.000000" },
+ { 1.234321234321234e-22, "0.000000" },
+ { 1.234321234321234e-21, "0.000000" },
+ { 1.234321234321234e-20, "0.000000" },
+ { 1.234321234321234e-19, "0.000000" },
+ { 1.234321234321234e-18, "0.000000" },
+ { 1.234321234321234e-17, "0.000000" },
+ { 1.234321234321234e-16, "0.000000" },
+ { 1.234321234321234e-15, "0.000000" },
+ { 1.234321234321234e-14, "0.000000" },
+ { 1.234321234321234e-13, "0.000000" },
+ { 1.234321234321234e-12, "0.000000" },
+ { 1.234321234321234e-11, "0.000000" },
+ { 1.234321234321234e-10, "0.000000" },
+ { 1.234321234321234e-9, "0.000000" },
+ { 1.234321234321234e-8, "0.000000" },
+ { 1.234321234321234e-7, "0.000000" },
+ { 1.234321234321234e-6, "0.000001" },
+ { 1.234321234321234e-5, "0.000012" },
+ { 1.234321234321234e-4, "0.000123" },
+ { 1.234321234321234e-3, "0.001234" },
+ { 1.234321234321234e-2, "0.012343" },
+ { 1.234321234321234e-1, "0.123432" },
+ { 1.234321234321234, "1.234321" },
+ { 1.234321234321234e1, "12.343212" },
+ { 1.234321234321234e2, "123.432123" },
+ { 1.234321234321234e3, "1234.321234" },
+ { 1.234321234321234e4, "12343.212343" },
+ { 1.234321234321234e5, "123432.123432" },
+ { 1.234321234321234e6, "1234321.234321" },
+ { 1.234321234321234e7, "12343212.343212" },
+ { 1.234321234321234e8, "123432123.432123" },
+ { 1.234321234321234e9, "1234321234.321234" },
+ { 1.234321234321234e10, "12343212343.2123**" },
+ { 1.234321234321234e11, "123432123432.123***" },
+ { 1.234321234321234e12, "1234321234321.23****" },
+ { 1.234321234321234e13, "12343212343212.3*****" },
+ { 1.234321234321234e14, "123432123432123.******" },
+ { 1.234321234321234e15, "1234321234321234.000000" },
+ { 1.234321234321234e16, "123432123432123**.000000" },
+ { 1.234321234321234e17, "123432123432123***.000000" },
+ { 1.234321234321234e18, "123432123432123****.000000" },
+ { 1.234321234321234e19, "123432123432123*****.000000" },
+ { 1.234321234321234e20, "123432123432123******.000000" },
+ { 1.234321234321234e21, "123432123432123*******.000000" },
+ { 1.234321234321234e22, "123432123432123********.000000" },
+ { 1.234321234321234e23, "123432123432123*********.000000" },
+ { 1.234321234321234e24, "123432123432123**********.000000" },
+ { 1.234321234321234e25, "123432123432123***********.000000" },
+ { 1.234321234321234e26, "123432123432123************.000000" },
+ { 1.234321234321234e27, "123432123432123*************.000000" },
+ { 1.234321234321234e28, "123432123432123**************.000000" },
+ { 1.234321234321234e29, "123432123432123***************.000000" },
+ { 1.234321234321234e30, "123432123432123****************.000000" },
+ { 1.234321234321234e31, "123432123432123*****************.000000" },
+ { 1.234321234321234e32, "123432123432123******************.000000" },
+ { 1.234321234321234e33, "123432123432123*******************.000000" },
+ { 1.234321234321234e34, "123432123432123********************.000000" },
+ { 1.234321234321234e35, "123432123432123*********************.000000" },
+ { 1.234321234321234e36, "123432123432123**********************.000000" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f", data[k].value);
+ ASSERT (strmatch (data[k].string, result));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f %d", -0.03125, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%f %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%10f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%-10f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%+f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "% f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.f %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015f %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015f %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%050f %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.f %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.2f %d", 999.951, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.2f %d", 999.996, 33, 44, 55);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", 12.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", 1234567.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "0.000000" },
+ { 1.234321234321234e-36L, "0.000000" },
+ { 1.234321234321234e-35L, "0.000000" },
+ { 1.234321234321234e-34L, "0.000000" },
+ { 1.234321234321234e-33L, "0.000000" },
+ { 1.234321234321234e-32L, "0.000000" },
+ { 1.234321234321234e-31L, "0.000000" },
+ { 1.234321234321234e-30L, "0.000000" },
+ { 1.234321234321234e-29L, "0.000000" },
+ { 1.234321234321234e-28L, "0.000000" },
+ { 1.234321234321234e-27L, "0.000000" },
+ { 1.234321234321234e-26L, "0.000000" },
+ { 1.234321234321234e-25L, "0.000000" },
+ { 1.234321234321234e-24L, "0.000000" },
+ { 1.234321234321234e-23L, "0.000000" },
+ { 1.234321234321234e-22L, "0.000000" },
+ { 1.234321234321234e-21L, "0.000000" },
+ { 1.234321234321234e-20L, "0.000000" },
+ { 1.234321234321234e-19L, "0.000000" },
+ { 1.234321234321234e-18L, "0.000000" },
+ { 1.234321234321234e-17L, "0.000000" },
+ { 1.234321234321234e-16L, "0.000000" },
+ { 1.234321234321234e-15L, "0.000000" },
+ { 1.234321234321234e-14L, "0.000000" },
+ { 1.234321234321234e-13L, "0.000000" },
+ { 1.234321234321234e-12L, "0.000000" },
+ { 1.234321234321234e-11L, "0.000000" },
+ { 1.234321234321234e-10L, "0.000000" },
+ { 1.234321234321234e-9L, "0.000000" },
+ { 1.234321234321234e-8L, "0.000000" },
+ { 1.234321234321234e-7L, "0.000000" },
+ { 1.234321234321234e-6L, "0.000001" },
+ { 1.234321234321234e-5L, "0.000012" },
+ { 1.234321234321234e-4L, "0.000123" },
+ { 1.234321234321234e-3L, "0.001234" },
+ { 1.234321234321234e-2L, "0.012343" },
+ { 1.234321234321234e-1L, "0.123432" },
+ { 1.234321234321234L, "1.234321" },
+ { 1.234321234321234e1L, "12.343212" },
+ { 1.234321234321234e2L, "123.432123" },
+ { 1.234321234321234e3L, "1234.321234" },
+ { 1.234321234321234e4L, "12343.212343" },
+ { 1.234321234321234e5L, "123432.123432" },
+ { 1.234321234321234e6L, "1234321.234321" },
+ { 1.234321234321234e7L, "12343212.343212" },
+ { 1.234321234321234e8L, "123432123.432123" },
+ { 1.234321234321234e9L, "1234321234.321234" },
+ { 1.234321234321234e10L, "12343212343.2123**" },
+ { 1.234321234321234e11L, "123432123432.123***" },
+ { 1.234321234321234e12L, "1234321234321.23****" },
+ { 1.234321234321234e13L, "12343212343212.3*****" },
+ { 1.234321234321234e14L, "123432123432123.******" },
+ { 1.234321234321234e15L, "1234321234321234.000000" },
+ { 1.234321234321234e16L, "123432123432123**.000000" },
+ { 1.234321234321234e17L, "123432123432123***.000000" },
+ { 1.234321234321234e18L, "123432123432123****.000000" },
+ { 1.234321234321234e19L, "123432123432123*****.000000" },
+ { 1.234321234321234e20L, "123432123432123******.000000" },
+ { 1.234321234321234e21L, "123432123432123*******.000000" },
+ { 1.234321234321234e22L, "123432123432123********.000000" },
+ { 1.234321234321234e23L, "123432123432123*********.000000" },
+ { 1.234321234321234e24L, "123432123432123**********.000000" },
+ { 1.234321234321234e25L, "123432123432123***********.000000" },
+ { 1.234321234321234e26L, "123432123432123************.000000" },
+ { 1.234321234321234e27L, "123432123432123*************.000000" },
+ { 1.234321234321234e28L, "123432123432123**************.000000" },
+ { 1.234321234321234e29L, "123432123432123***************.000000" },
+ { 1.234321234321234e30L, "123432123432123****************.000000" },
+ { 1.234321234321234e31L, "123432123432123*****************.000000" },
+ { 1.234321234321234e32L, "123432123432123******************.000000" },
+ { 1.234321234321234e33L, "123432123432123*******************.000000" },
+ { 1.234321234321234e34L, "123432123432123********************.000000" },
+ { 1.234321234321234e35L, "123432123432123*********************.000000" },
+ { 1.234321234321234e36L, "123432123432123**********************.000000" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf", data[k].value);
+ ASSERT (strmatch (data[k].string, result));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", -0.03125L, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#endif
+
+ { /* Width. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%-10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%+Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "% Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015Lf %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%050Lf %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.2Lf %d", 999.951L, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.2Lf %d", 999.996L, 33, 44, 55);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %F format directive. */
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%F %d", 12.75, 33, 44, 55);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%F %d", 1234567.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%F %d", -0.03125, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%F %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%F %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%F %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "INF 33") == 0
+ || strcmp (result, "INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%F %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-INF 33") == 0
+ || strcmp (result, "-INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%F %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 1)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015F %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015F %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, " -INF 33") == 0
+ || strcmp (result, " -INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.F %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.2F %d", 999.951, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.2F %d", 999.996, 33, 44, 55);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LF %d", 12.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LF %d", 1234567.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LF %d", -0.03125L, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LF %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LF %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LF %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "INF 33") == 0
+ || strcmp (result, "INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LF %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-INF 33") == 0
+ || strcmp (result, "-INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%LF %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 1)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015LF %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, " -INF 33") == 0
+ || strcmp (result, " -INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.2LF %d", 999.951L, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.2LF %d", 999.996L, 33, 44, 55);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %e format directive. */
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e %d", 12.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e %d", 1234567.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1.234567e+06 33") == 0
+ || strcmp (result, "1.234567e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "1.234321e-37" },
+ { 1.234321234321234e-36, "1.234321e-36" },
+ { 1.234321234321234e-35, "1.234321e-35" },
+ { 1.234321234321234e-34, "1.234321e-34" },
+ { 1.234321234321234e-33, "1.234321e-33" },
+ { 1.234321234321234e-32, "1.234321e-32" },
+ { 1.234321234321234e-31, "1.234321e-31" },
+ { 1.234321234321234e-30, "1.234321e-30" },
+ { 1.234321234321234e-29, "1.234321e-29" },
+ { 1.234321234321234e-28, "1.234321e-28" },
+ { 1.234321234321234e-27, "1.234321e-27" },
+ { 1.234321234321234e-26, "1.234321e-26" },
+ { 1.234321234321234e-25, "1.234321e-25" },
+ { 1.234321234321234e-24, "1.234321e-24" },
+ { 1.234321234321234e-23, "1.234321e-23" },
+ { 1.234321234321234e-22, "1.234321e-22" },
+ { 1.234321234321234e-21, "1.234321e-21" },
+ { 1.234321234321234e-20, "1.234321e-20" },
+ { 1.234321234321234e-19, "1.234321e-19" },
+ { 1.234321234321234e-18, "1.234321e-18" },
+ { 1.234321234321234e-17, "1.234321e-17" },
+ { 1.234321234321234e-16, "1.234321e-16" },
+ { 1.234321234321234e-15, "1.234321e-15" },
+ { 1.234321234321234e-14, "1.234321e-14" },
+ { 1.234321234321234e-13, "1.234321e-13" },
+ { 1.234321234321234e-12, "1.234321e-12" },
+ { 1.234321234321234e-11, "1.234321e-11" },
+ { 1.234321234321234e-10, "1.234321e-10" },
+ { 1.234321234321234e-9, "1.234321e-09" },
+ { 1.234321234321234e-8, "1.234321e-08" },
+ { 1.234321234321234e-7, "1.234321e-07" },
+ { 1.234321234321234e-6, "1.234321e-06" },
+ { 1.234321234321234e-5, "1.234321e-05" },
+ { 1.234321234321234e-4, "1.234321e-04" },
+ { 1.234321234321234e-3, "1.234321e-03" },
+ { 1.234321234321234e-2, "1.234321e-02" },
+ { 1.234321234321234e-1, "1.234321e-01" },
+ { 1.234321234321234, "1.234321e+00" },
+ { 1.234321234321234e1, "1.234321e+01" },
+ { 1.234321234321234e2, "1.234321e+02" },
+ { 1.234321234321234e3, "1.234321e+03" },
+ { 1.234321234321234e4, "1.234321e+04" },
+ { 1.234321234321234e5, "1.234321e+05" },
+ { 1.234321234321234e6, "1.234321e+06" },
+ { 1.234321234321234e7, "1.234321e+07" },
+ { 1.234321234321234e8, "1.234321e+08" },
+ { 1.234321234321234e9, "1.234321e+09" },
+ { 1.234321234321234e10, "1.234321e+10" },
+ { 1.234321234321234e11, "1.234321e+11" },
+ { 1.234321234321234e12, "1.234321e+12" },
+ { 1.234321234321234e13, "1.234321e+13" },
+ { 1.234321234321234e14, "1.234321e+14" },
+ { 1.234321234321234e15, "1.234321e+15" },
+ { 1.234321234321234e16, "1.234321e+16" },
+ { 1.234321234321234e17, "1.234321e+17" },
+ { 1.234321234321234e18, "1.234321e+18" },
+ { 1.234321234321234e19, "1.234321e+19" },
+ { 1.234321234321234e20, "1.234321e+20" },
+ { 1.234321234321234e21, "1.234321e+21" },
+ { 1.234321234321234e22, "1.234321e+22" },
+ { 1.234321234321234e23, "1.234321e+23" },
+ { 1.234321234321234e24, "1.234321e+24" },
+ { 1.234321234321234e25, "1.234321e+25" },
+ { 1.234321234321234e26, "1.234321e+26" },
+ { 1.234321234321234e27, "1.234321e+27" },
+ { 1.234321234321234e28, "1.234321e+28" },
+ { 1.234321234321234e29, "1.234321e+29" },
+ { 1.234321234321234e30, "1.234321e+30" },
+ { 1.234321234321234e31, "1.234321e+31" },
+ { 1.234321234321234e32, "1.234321e+32" },
+ { 1.234321234321234e33, "1.234321e+33" },
+ { 1.234321234321234e34, "1.234321e+34" },
+ { 1.234321234321234e35, "1.234321e+35" },
+ { 1.234321234321234e36, "1.234321e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e %d", -0.03125, 33, 44, 55);
+ ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+ || strcmp (result, "-3.125000e-002 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000e+00 33") == 0
+ || strcmp (result, "0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+ || strcmp (result, "-0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%e %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%15e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%-15e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%+e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+ || strcmp (result, "+1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "% e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.e %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "2.e+00 33") == 0
+ || strcmp (result, "2.e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.e %d", 9.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015e %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+ || strcmp (result, "001.234000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015e %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%050e %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.e %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.4e %d", 999.951, 33, 44, 55);
+ ASSERT (strcmp (result, "9.9995e+02 33") == 0
+ || strcmp (result, "9.9995e+002 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.4e %d", 999.996, 33, 44, 55);
+ ASSERT (strcmp (result, "1.0000e+03 33") == 0
+ || strcmp (result, "1.0000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", 12.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", 1234567.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.234567e+06 33") == 0
+ || strcmp (result, "1.234567e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "1.234321e-37" },
+ { 1.234321234321234e-36L, "1.234321e-36" },
+ { 1.234321234321234e-35L, "1.234321e-35" },
+ { 1.234321234321234e-34L, "1.234321e-34" },
+ { 1.234321234321234e-33L, "1.234321e-33" },
+ { 1.234321234321234e-32L, "1.234321e-32" },
+ { 1.234321234321234e-31L, "1.234321e-31" },
+ { 1.234321234321234e-30L, "1.234321e-30" },
+ { 1.234321234321234e-29L, "1.234321e-29" },
+ { 1.234321234321234e-28L, "1.234321e-28" },
+ { 1.234321234321234e-27L, "1.234321e-27" },
+ { 1.234321234321234e-26L, "1.234321e-26" },
+ { 1.234321234321234e-25L, "1.234321e-25" },
+ { 1.234321234321234e-24L, "1.234321e-24" },
+ { 1.234321234321234e-23L, "1.234321e-23" },
+ { 1.234321234321234e-22L, "1.234321e-22" },
+ { 1.234321234321234e-21L, "1.234321e-21" },
+ { 1.234321234321234e-20L, "1.234321e-20" },
+ { 1.234321234321234e-19L, "1.234321e-19" },
+ { 1.234321234321234e-18L, "1.234321e-18" },
+ { 1.234321234321234e-17L, "1.234321e-17" },
+ { 1.234321234321234e-16L, "1.234321e-16" },
+ { 1.234321234321234e-15L, "1.234321e-15" },
+ { 1.234321234321234e-14L, "1.234321e-14" },
+ { 1.234321234321234e-13L, "1.234321e-13" },
+ { 1.234321234321234e-12L, "1.234321e-12" },
+ { 1.234321234321234e-11L, "1.234321e-11" },
+ { 1.234321234321234e-10L, "1.234321e-10" },
+ { 1.234321234321234e-9L, "1.234321e-09" },
+ { 1.234321234321234e-8L, "1.234321e-08" },
+ { 1.234321234321234e-7L, "1.234321e-07" },
+ { 1.234321234321234e-6L, "1.234321e-06" },
+ { 1.234321234321234e-5L, "1.234321e-05" },
+ { 1.234321234321234e-4L, "1.234321e-04" },
+ { 1.234321234321234e-3L, "1.234321e-03" },
+ { 1.234321234321234e-2L, "1.234321e-02" },
+ { 1.234321234321234e-1L, "1.234321e-01" },
+ { 1.234321234321234L, "1.234321e+00" },
+ { 1.234321234321234e1L, "1.234321e+01" },
+ { 1.234321234321234e2L, "1.234321e+02" },
+ { 1.234321234321234e3L, "1.234321e+03" },
+ { 1.234321234321234e4L, "1.234321e+04" },
+ { 1.234321234321234e5L, "1.234321e+05" },
+ { 1.234321234321234e6L, "1.234321e+06" },
+ { 1.234321234321234e7L, "1.234321e+07" },
+ { 1.234321234321234e8L, "1.234321e+08" },
+ { 1.234321234321234e9L, "1.234321e+09" },
+ { 1.234321234321234e10L, "1.234321e+10" },
+ { 1.234321234321234e11L, "1.234321e+11" },
+ { 1.234321234321234e12L, "1.234321e+12" },
+ { 1.234321234321234e13L, "1.234321e+13" },
+ { 1.234321234321234e14L, "1.234321e+14" },
+ { 1.234321234321234e15L, "1.234321e+15" },
+ { 1.234321234321234e16L, "1.234321e+16" },
+ { 1.234321234321234e17L, "1.234321e+17" },
+ { 1.234321234321234e18L, "1.234321e+18" },
+ { 1.234321234321234e19L, "1.234321e+19" },
+ { 1.234321234321234e20L, "1.234321e+20" },
+ { 1.234321234321234e21L, "1.234321e+21" },
+ { 1.234321234321234e22L, "1.234321e+22" },
+ { 1.234321234321234e23L, "1.234321e+23" },
+ { 1.234321234321234e24L, "1.234321e+24" },
+ { 1.234321234321234e25L, "1.234321e+25" },
+ { 1.234321234321234e26L, "1.234321e+26" },
+ { 1.234321234321234e27L, "1.234321e+27" },
+ { 1.234321234321234e28L, "1.234321e+28" },
+ { 1.234321234321234e29L, "1.234321e+29" },
+ { 1.234321234321234e30L, "1.234321e+30" },
+ { 1.234321234321234e31L, "1.234321e+31" },
+ { 1.234321234321234e32L, "1.234321e+32" },
+ { 1.234321234321234e33L, "1.234321e+33" },
+ { 1.234321234321234e34L, "1.234321e+34" },
+ { 1.234321234321234e35L, "1.234321e+35" },
+ { 1.234321234321234e36L, "1.234321e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", -0.03125L, 33, 44, 55);
+ ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+ || strcmp (result, "-3.125000e-002 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0.000000e+00 33") == 0
+ || strcmp (result, "0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+ || strcmp (result, "-0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#endif
+
+ { /* Width. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%-15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%+Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+ || strcmp (result, "+1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "% Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.Le %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "2.e+00 33") == 0
+ || strcmp (result, "2.e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.Le %d", 9.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+ || strcmp (result, "001.234000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015Le %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%050Le %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.4Le %d", 999.951L, 33, 44, 55);
+ ASSERT (strcmp (result, "9.9995e+02 33") == 0
+ || strcmp (result, "9.9995e+002 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.4Le %d", 999.996L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.0000e+03 33") == 0
+ || strcmp (result, "1.0000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %g format directive. */
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g %d", 12.75, 33, 44, 55);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g %d", 1234567.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1.23457e+06 33") == 0
+ || strcmp (result, "1.23457e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "1.23432e-37" },
+ { 1.234321234321234e-36, "1.23432e-36" },
+ { 1.234321234321234e-35, "1.23432e-35" },
+ { 1.234321234321234e-34, "1.23432e-34" },
+ { 1.234321234321234e-33, "1.23432e-33" },
+ { 1.234321234321234e-32, "1.23432e-32" },
+ { 1.234321234321234e-31, "1.23432e-31" },
+ { 1.234321234321234e-30, "1.23432e-30" },
+ { 1.234321234321234e-29, "1.23432e-29" },
+ { 1.234321234321234e-28, "1.23432e-28" },
+ { 1.234321234321234e-27, "1.23432e-27" },
+ { 1.234321234321234e-26, "1.23432e-26" },
+ { 1.234321234321234e-25, "1.23432e-25" },
+ { 1.234321234321234e-24, "1.23432e-24" },
+ { 1.234321234321234e-23, "1.23432e-23" },
+ { 1.234321234321234e-22, "1.23432e-22" },
+ { 1.234321234321234e-21, "1.23432e-21" },
+ { 1.234321234321234e-20, "1.23432e-20" },
+ { 1.234321234321234e-19, "1.23432e-19" },
+ { 1.234321234321234e-18, "1.23432e-18" },
+ { 1.234321234321234e-17, "1.23432e-17" },
+ { 1.234321234321234e-16, "1.23432e-16" },
+ { 1.234321234321234e-15, "1.23432e-15" },
+ { 1.234321234321234e-14, "1.23432e-14" },
+ { 1.234321234321234e-13, "1.23432e-13" },
+ { 1.234321234321234e-12, "1.23432e-12" },
+ { 1.234321234321234e-11, "1.23432e-11" },
+ { 1.234321234321234e-10, "1.23432e-10" },
+ { 1.234321234321234e-9, "1.23432e-09" },
+ { 1.234321234321234e-8, "1.23432e-08" },
+ { 1.234321234321234e-7, "1.23432e-07" },
+ { 1.234321234321234e-6, "1.23432e-06" },
+ { 1.234321234321234e-5, "1.23432e-05" },
+ { 1.234321234321234e-4, "0.000123432" },
+ { 1.234321234321234e-3, "0.00123432" },
+ { 1.234321234321234e-2, "0.0123432" },
+ { 1.234321234321234e-1, "0.123432" },
+ { 1.234321234321234, "1.23432" },
+ { 1.234321234321234e1, "12.3432" },
+ { 1.234321234321234e2, "123.432" },
+ { 1.234321234321234e3, "1234.32" },
+ { 1.234321234321234e4, "12343.2" },
+ { 1.234321234321234e5, "123432" },
+ { 1.234321234321234e6, "1.23432e+06" },
+ { 1.234321234321234e7, "1.23432e+07" },
+ { 1.234321234321234e8, "1.23432e+08" },
+ { 1.234321234321234e9, "1.23432e+09" },
+ { 1.234321234321234e10, "1.23432e+10" },
+ { 1.234321234321234e11, "1.23432e+11" },
+ { 1.234321234321234e12, "1.23432e+12" },
+ { 1.234321234321234e13, "1.23432e+13" },
+ { 1.234321234321234e14, "1.23432e+14" },
+ { 1.234321234321234e15, "1.23432e+15" },
+ { 1.234321234321234e16, "1.23432e+16" },
+ { 1.234321234321234e17, "1.23432e+17" },
+ { 1.234321234321234e18, "1.23432e+18" },
+ { 1.234321234321234e19, "1.23432e+19" },
+ { 1.234321234321234e20, "1.23432e+20" },
+ { 1.234321234321234e21, "1.23432e+21" },
+ { 1.234321234321234e22, "1.23432e+22" },
+ { 1.234321234321234e23, "1.23432e+23" },
+ { 1.234321234321234e24, "1.23432e+24" },
+ { 1.234321234321234e25, "1.23432e+25" },
+ { 1.234321234321234e26, "1.23432e+26" },
+ { 1.234321234321234e27, "1.23432e+27" },
+ { 1.234321234321234e28, "1.23432e+28" },
+ { 1.234321234321234e29, "1.23432e+29" },
+ { 1.234321234321234e30, "1.23432e+30" },
+ { 1.234321234321234e31, "1.23432e+31" },
+ { 1.234321234321234e32, "1.23432e+32" },
+ { 1.234321234321234e33, "1.23432e+33" },
+ { 1.234321234321234e34, "1.23432e+34" },
+ { 1.234321234321234e35, "1.23432e+35" },
+ { 1.234321234321234e36, "1.23432e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (expected[strlen (expected) - 4] == 'e'
+ && strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g %d", -0.03125, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.03125 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g %d", 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g %d", -zerod, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%g %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Width. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%10g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%-10g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%+g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "% g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.75000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.g %d", 1.75, 33, 44, 55);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.g %d", 9.75, 33, 44, 55);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%010g %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "0000001234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015g %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%050g %d", NaNd (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.g %d", 1234.0, 33, 44, 55);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.5g %d", 999.951, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.5g %d", 999.996, 33, 44, 55);
+ ASSERT (strcmp (result, "1000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", 12.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* A larger positive number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", 1234567.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.23457e+06 33") == 0
+ || strcmp (result, "1.23457e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "1.23432e-37" },
+ { 1.234321234321234e-36L, "1.23432e-36" },
+ { 1.234321234321234e-35L, "1.23432e-35" },
+ { 1.234321234321234e-34L, "1.23432e-34" },
+ { 1.234321234321234e-33L, "1.23432e-33" },
+ { 1.234321234321234e-32L, "1.23432e-32" },
+ { 1.234321234321234e-31L, "1.23432e-31" },
+ { 1.234321234321234e-30L, "1.23432e-30" },
+ { 1.234321234321234e-29L, "1.23432e-29" },
+ { 1.234321234321234e-28L, "1.23432e-28" },
+ { 1.234321234321234e-27L, "1.23432e-27" },
+ { 1.234321234321234e-26L, "1.23432e-26" },
+ { 1.234321234321234e-25L, "1.23432e-25" },
+ { 1.234321234321234e-24L, "1.23432e-24" },
+ { 1.234321234321234e-23L, "1.23432e-23" },
+ { 1.234321234321234e-22L, "1.23432e-22" },
+ { 1.234321234321234e-21L, "1.23432e-21" },
+ { 1.234321234321234e-20L, "1.23432e-20" },
+ { 1.234321234321234e-19L, "1.23432e-19" },
+ { 1.234321234321234e-18L, "1.23432e-18" },
+ { 1.234321234321234e-17L, "1.23432e-17" },
+ { 1.234321234321234e-16L, "1.23432e-16" },
+ { 1.234321234321234e-15L, "1.23432e-15" },
+ { 1.234321234321234e-14L, "1.23432e-14" },
+ { 1.234321234321234e-13L, "1.23432e-13" },
+ { 1.234321234321234e-12L, "1.23432e-12" },
+ { 1.234321234321234e-11L, "1.23432e-11" },
+ { 1.234321234321234e-10L, "1.23432e-10" },
+ { 1.234321234321234e-9L, "1.23432e-09" },
+ { 1.234321234321234e-8L, "1.23432e-08" },
+ { 1.234321234321234e-7L, "1.23432e-07" },
+ { 1.234321234321234e-6L, "1.23432e-06" },
+ { 1.234321234321234e-5L, "1.23432e-05" },
+ { 1.234321234321234e-4L, "0.000123432" },
+ { 1.234321234321234e-3L, "0.00123432" },
+ { 1.234321234321234e-2L, "0.0123432" },
+ { 1.234321234321234e-1L, "0.123432" },
+ { 1.234321234321234L, "1.23432" },
+ { 1.234321234321234e1L, "12.3432" },
+ { 1.234321234321234e2L, "123.432" },
+ { 1.234321234321234e3L, "1234.32" },
+ { 1.234321234321234e4L, "12343.2" },
+ { 1.234321234321234e5L, "123432" },
+ { 1.234321234321234e6L, "1.23432e+06" },
+ { 1.234321234321234e7L, "1.23432e+07" },
+ { 1.234321234321234e8L, "1.23432e+08" },
+ { 1.234321234321234e9L, "1.23432e+09" },
+ { 1.234321234321234e10L, "1.23432e+10" },
+ { 1.234321234321234e11L, "1.23432e+11" },
+ { 1.234321234321234e12L, "1.23432e+12" },
+ { 1.234321234321234e13L, "1.23432e+13" },
+ { 1.234321234321234e14L, "1.23432e+14" },
+ { 1.234321234321234e15L, "1.23432e+15" },
+ { 1.234321234321234e16L, "1.23432e+16" },
+ { 1.234321234321234e17L, "1.23432e+17" },
+ { 1.234321234321234e18L, "1.23432e+18" },
+ { 1.234321234321234e19L, "1.23432e+19" },
+ { 1.234321234321234e20L, "1.23432e+20" },
+ { 1.234321234321234e21L, "1.23432e+21" },
+ { 1.234321234321234e22L, "1.23432e+22" },
+ { 1.234321234321234e23L, "1.23432e+23" },
+ { 1.234321234321234e24L, "1.23432e+24" },
+ { 1.234321234321234e25L, "1.23432e+25" },
+ { 1.234321234321234e26L, "1.23432e+26" },
+ { 1.234321234321234e27L, "1.23432e+27" },
+ { 1.234321234321234e28L, "1.23432e+28" },
+ { 1.234321234321234e29L, "1.23432e+29" },
+ { 1.234321234321234e30L, "1.23432e+30" },
+ { 1.234321234321234e31L, "1.23432e+31" },
+ { 1.234321234321234e32L, "1.23432e+32" },
+ { 1.234321234321234e33L, "1.23432e+33" },
+ { 1.234321234321234e34L, "1.23432e+34" },
+ { 1.234321234321234e35L, "1.23432e+35" },
+ { 1.234321234321234e36L, "1.23432e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (expected[strlen (expected) - 4] == 'e'
+ && strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ }
+ }
+
+ { /* A negative number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", -0.03125L, 33, 44, 55);
+ ASSERT (strcmp (result, "-0.03125 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative zero. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", minus_zerol, 33, 44, 55);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Positive infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Negative infinity. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+#endif
+
+ { /* Width. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_LEFT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%-10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%+Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "+1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_SPACE. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "% Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.75000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ALT. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%#.Lg %d", 9.75L, 33, 44, 55);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%010Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "0000001234 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%015Lg %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%050Lg %d", NaNl (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision. */
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%.Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with no rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.5Lg %d", 999.951L, 33, 44, 55);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ { /* Precision with rounding. */
+ char result[100];
+ int retval =
+ my_sprintf (result, "%.5Lg %d", 999.996L, 33, 44, 55);
+ ASSERT (strcmp (result, "1000 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %n format directive. */
+
+ {
+ int count = -1;
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%d %n", 123, &count, 33, 44, 55);
+ ASSERT (strcmp (result, "123 ") == 0);
+ ASSERT (retval == strlen (result));
+ ASSERT (count == 4);
+ }
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%2$d %1$d", 33, 55);
+ ASSERT (strcmp (result, "55 33") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the grouping flag. */
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "%'d %d", 1234567, 99);
+ ASSERT (result[strlen (result) - 1] == '9');
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the left-adjust flag. */
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "a%*sc", -3, "b");
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "a%-*sc", 3, "b");
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[1000];
+ int retval =
+ my_sprintf (result, "a%-*sc", -3, "b");
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of large precision. */
+
+ {
+ char result[5000];
+ int retval =
+ my_sprintf (result, "%.4000d %d", 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_sprintf (result, "%.*d %d", 4000, 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_sprintf (result, "%.4000d %d", -1234567, 99);
+ size_t i;
+ ASSERT (result[0] == '-');
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[1 + i] == '0');
+ ASSERT (strcmp (result + 1 + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_sprintf (result, "%.4000u %d", 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_sprintf (result, "%.4000o %d", 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "4553207 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_sprintf (result, "%.4000x %d", 1234567, 99);
+ size_t i;
+ for (i = 0; i < 4000 - 6; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 6, "12d687 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char result[5000];
+ int retval =
+ my_sprintf (result, "%#.4000x %d", 1234567, 99);
+ size_t i;
+ ASSERT (result[0] == '0');
+ ASSERT (result[1] == 'x');
+ for (i = 0; i < 4000 - 6; i++)
+ ASSERT (result[2 + i] == '0');
+ ASSERT (strcmp (result + 2 + 4000 - 6, "12d687 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ {
+ char input[5000];
+ char result[5000];
+ int retval;
+ size_t i;
+
+ for (i = 0; i < sizeof (input) - 1; i++)
+ input[i] = 'a' + ((1000000 / (i + 1)) % 26);
+ input[i] = '\0';
+ retval = my_sprintf (result, "%.4000s %d", input, 99);
+ ASSERT (memcmp (result, input, 4000) == 0);
+ ASSERT (strcmp (result + 4000, " 99") == 0);
+ ASSERT (retval == strlen (result));
+ }
+
+ /* Test the support of the %s format directive. */
+
+ /* To verify that these tests succeed, it is necessary to run them under
+ a tool that checks against invalid memory accesses, such as ElectricFence
+ or "valgrind --tool=memcheck". */
+ {
+ size_t i;
+
+ for (i = 1; i <= 8; i++)
+ {
+ char *block;
+ char result[5000];
+ int retval;
+
+ block = (char *) malloc (i);
+ memcpy (block, "abcdefgh", i);
+ retval = my_sprintf (result, "%.*s", (int) i, block);
+ ASSERT (memcmp (result, block, i) == 0);
+ ASSERT (result[i] == '\0');
+ ASSERT (retval == strlen (result));
+ free (block);
+ }
+ }
+#if HAVE_WCHAR_T
+ {
+ size_t i;
+
+ for (i = 1; i <= 8; i++)
+ {
+ wchar_t *block;
+ size_t j;
+ char result[5000];
+ int retval;
+
+ block = (wchar_t *) malloc (i * sizeof (wchar_t));
+ for (j = 0; j < i; j++)
+ block[j] = "abcdefgh"[j];
+ retval = my_sprintf (result, "%.*ls", (int) i, block);
+ ASSERT (memcmp (result, "abcdefgh", i) == 0);
+ ASSERT (result[i] == '\0');
+ ASSERT (retval == strlen (result));
+ free (block);
+ }
+ }
+#endif
+}
diff --git a/gnulib/tests/test-sqrt.c b/gnulib/tests/test-sqrt.c
new file mode 100644
index 00000000..ba61c8bc
--- /dev/null
+++ b/gnulib/tests/test-sqrt.c
@@ -0,0 +1,40 @@
+/* Test of sqrt() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sqrt, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = sqrt (x);
+ ASSERT (y >= 0.7745966692 && y <= 0.7745966693);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sqrtl.c b/gnulib/tests/test-sqrtl.c
new file mode 100644
index 00000000..a7baef78
--- /dev/null
+++ b/gnulib/tests/test-sqrtl.c
@@ -0,0 +1,45 @@
+/* Test of sqrtl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (sqrtl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = sqrtl (x);
+ ASSERT (y >= 0.7745966692L && y <= 0.7745966693L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-stat-time.c b/gnulib/tests/test-stat-time.c
new file mode 100644
index 00000000..1cf67c6b
--- /dev/null
+++ b/gnulib/tests/test-stat-time.c
@@ -0,0 +1,263 @@
+/* Test of <stat-time.h>.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by James Youngman <jay@gnu.org>, 2007. */
+
+#include <config.h>
+
+#include "stat-time.h"
+
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+enum { NFILES = 4 };
+
+static int
+force_unlink (const char *filename)
+{
+ /* This chmod is necessary on mingw, where unlink() of a read-only file
+ fails with EPERM. */
+ chmod (filename, 0600);
+ return unlink (filename);
+}
+
+static void
+cleanup (int sig)
+{
+ /* Remove temporary files. */
+ force_unlink ("t-stt-stamp1");
+ force_unlink ("t-stt-testfile");
+ force_unlink ("t-stt-stamp2");
+ force_unlink ("t-stt-renamed");
+ force_unlink ("t-stt-stamp3");
+
+ if (sig != 0)
+ _exit (1);
+}
+
+static int
+open_file (const char *filename, int flags)
+{
+ int fd = open (filename, flags | O_WRONLY, 0500);
+ if (fd >= 0)
+ {
+ close (fd);
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+static void
+create_file (const char *filename)
+{
+ ASSERT (open_file (filename, O_CREAT | O_EXCL));
+}
+
+static void
+do_stat (const char *filename, struct stat *p)
+{
+ ASSERT (stat (filename, p) == 0);
+}
+
+/* Sleep long enough to notice a timestamp difference on the file
+ system in the current directory. */
+static void
+nap (void)
+{
+ static long delay;
+ if (!delay)
+ {
+ /* Initialize only once, by sleeping for 20 milliseconds (needed
+ since xfs has a quantization of about 10 milliseconds, even
+ though it has a granularity of 1 nanosecond, and since NTFS
+ has a default quantization of 15.25 milliseconds, even though
+ it has a granularity of 100 nanoseconds). If the seconds
+ differ, repeat the test one more time (in case we crossed a
+ quantization boundary on a file system with 1 second
+ resolution). If we can't observe a difference in only the
+ nanoseconds, then fall back to 1 second if the time is odd,
+ and 2 seconds (needed for FAT) if time is even. */
+ struct stat st1;
+ struct stat st2;
+ ASSERT (stat ("t-stt-stamp1", &st1) == 0);
+ ASSERT (force_unlink ("t-stt-stamp1") == 0);
+ delay = 20000;
+ usleep (delay);
+ create_file ("t-stt-stamp1");
+ ASSERT (stat ("t-stt-stamp1", &st2) == 0);
+ if (st1.st_mtime != st2.st_mtime)
+ {
+ /* Seconds differ, give it one more shot. */
+ st1 = st2;
+ ASSERT (force_unlink ("t-stt-stamp1") == 0);
+ usleep (delay);
+ create_file ("t-stt-stamp1");
+ ASSERT (stat ("t-stt-stamp1", &st2) == 0);
+ }
+ if (! (st1.st_mtime == st2.st_mtime
+ && get_stat_mtime_ns (&st1) < get_stat_mtime_ns (&st2)))
+ delay = (st1.st_mtime & 1) ? 1000000 : 2000000;
+ }
+ usleep (delay);
+}
+
+static void
+prepare_test (struct stat *statinfo, struct timespec *modtimes)
+{
+ int i;
+
+ create_file ("t-stt-stamp1");
+ nap ();
+ create_file ("t-stt-testfile");
+ nap ();
+ create_file ("t-stt-stamp2");
+ nap ();
+ ASSERT (chmod ("t-stt-testfile", 0400) == 0);
+ nap ();
+ create_file ("t-stt-stamp3");
+
+ do_stat ("t-stt-stamp1", &statinfo[0]);
+ do_stat ("t-stt-testfile", &statinfo[1]);
+ do_stat ("t-stt-stamp2", &statinfo[2]);
+ do_stat ("t-stt-stamp3", &statinfo[3]);
+
+ /* Now use our access functions. */
+ for (i = 0; i < NFILES; ++i)
+ {
+ modtimes[i] = get_stat_mtime (&statinfo[i]);
+ }
+}
+
+static void
+test_mtime (const struct stat *statinfo, struct timespec *modtimes)
+{
+ int i;
+
+ /* Use the struct stat fields directly. */
+ /* mtime(stamp1) < mtime(stamp2) */
+ ASSERT (statinfo[0].st_mtime < statinfo[2].st_mtime
+ || (statinfo[0].st_mtime == statinfo[2].st_mtime
+ && (get_stat_mtime_ns (&statinfo[0])
+ < get_stat_mtime_ns (&statinfo[2]))));
+ /* mtime(stamp2) < mtime(stamp3) */
+ ASSERT (statinfo[2].st_mtime < statinfo[3].st_mtime
+ || (statinfo[2].st_mtime == statinfo[3].st_mtime
+ && (get_stat_mtime_ns (&statinfo[2])
+ < get_stat_mtime_ns (&statinfo[3]))));
+
+ /* Now check the result of the access functions. */
+ /* mtime(stamp1) < mtime(stamp2) */
+ ASSERT (modtimes[0].tv_sec < modtimes[2].tv_sec
+ || (modtimes[0].tv_sec == modtimes[2].tv_sec
+ && modtimes[0].tv_nsec < modtimes[2].tv_nsec));
+ /* mtime(stamp2) < mtime(stamp3) */
+ ASSERT (modtimes[2].tv_sec < modtimes[3].tv_sec
+ || (modtimes[2].tv_sec == modtimes[3].tv_sec
+ && modtimes[2].tv_nsec < modtimes[3].tv_nsec));
+
+ /* verify equivalence */
+ for (i = 0; i < NFILES; ++i)
+ {
+ struct timespec ts;
+ ts = get_stat_mtime (&statinfo[i]);
+ ASSERT (ts.tv_sec == statinfo[i].st_mtime);
+ }
+}
+
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+/* Skip the ctime tests on native Windows platforms, because their
+ st_ctime is either the same as st_mtime (plus or minus an offset)
+ or set to the file _creation_ time, and is not influenced by rename
+ or chmod. */
+# define test_ctime(ignored) ((void) 0)
+#else
+static void
+test_ctime (const struct stat *statinfo)
+{
+ /* On some buggy NFS clients, mtime and ctime are disproportionately
+ skewed from one another. Skip this test in that case. */
+ if (statinfo[0].st_mtime != statinfo[0].st_ctime)
+ return;
+
+ /* mtime(stamp2) < ctime(renamed) */
+ ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime
+ || (statinfo[2].st_mtime == statinfo[1].st_ctime
+ && (get_stat_mtime_ns (&statinfo[2])
+ < get_stat_ctime_ns (&statinfo[1]))));
+}
+#endif
+
+static void
+test_birthtime (const struct stat *statinfo,
+ const struct timespec *modtimes,
+ struct timespec *birthtimes)
+{
+ int i;
+
+ /* Collect the birth times. */
+ for (i = 0; i < NFILES; ++i)
+ {
+ birthtimes[i] = get_stat_birthtime (&statinfo[i]);
+ if (birthtimes[i].tv_nsec < 0)
+ return;
+ }
+
+ /* mtime(stamp1) < birthtime(renamed) */
+ ASSERT (modtimes[0].tv_sec < birthtimes[1].tv_sec
+ || (modtimes[0].tv_sec == birthtimes[1].tv_sec
+ && modtimes[0].tv_nsec < birthtimes[1].tv_nsec));
+ /* birthtime(renamed) < mtime(stamp2) */
+ ASSERT (birthtimes[1].tv_sec < modtimes[2].tv_sec
+ || (birthtimes[1].tv_sec == modtimes[2].tv_sec
+ && birthtimes[1].tv_nsec < modtimes[2].tv_nsec));
+}
+
+int
+main (void)
+{
+ struct stat statinfo[NFILES];
+ struct timespec modtimes[NFILES];
+ struct timespec birthtimes[NFILES];
+
+#ifdef SIGHUP
+ signal (SIGHUP, cleanup);
+#endif
+#ifdef SIGINT
+ signal (SIGINT, cleanup);
+#endif
+#ifdef SIGQUIT
+ signal (SIGQUIT, cleanup);
+#endif
+#ifdef SIGTERM
+ signal (SIGTERM, cleanup);
+#endif
+
+ cleanup (0);
+ prepare_test (statinfo, modtimes);
+ test_mtime (statinfo, modtimes);
+ test_ctime (statinfo);
+ test_birthtime (statinfo, modtimes, birthtimes);
+
+ cleanup (0);
+ return 0;
+}
diff --git a/gnulib/tests/test-stat.c b/gnulib/tests/test-stat.c
new file mode 100644
index 00000000..05dd3759
--- /dev/null
+++ b/gnulib/tests/test-stat.c
@@ -0,0 +1,56 @@
+/* Tests of stat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+/* Caution: stat may be a function-like macro. Although this
+ signature check must pass, it may be the signature of the real (and
+ broken) stat rather than rpl_stat. Most code should not use the
+ address of stat. */
+#include "signature.h"
+SIGNATURE_CHECK (stat, int, (char const *, struct stat *));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "pathmax.h"
+#include "same-inode.h"
+#include "macros.h"
+
+#define BASE "test-stat.t"
+
+#include "test-stat.h"
+
+/* Wrapper around stat, which works even if stat is a function-like
+ macro, where test_stat_func(stat) would do the wrong thing. */
+static int
+do_stat (char const *name, struct stat *st)
+{
+ return stat (name, st);
+}
+
+int
+main (void)
+{
+ return test_stat_func (do_stat, true);
+}
diff --git a/gnulib/tests/test-stat.h b/gnulib/tests/test-stat.h
new file mode 100644
index 00000000..f0904204
--- /dev/null
+++ b/gnulib/tests/test-stat.h
@@ -0,0 +1,100 @@
+/* Tests of stat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+/* This file is designed to test both stat(n,buf) and
+ fstatat(AT_FDCWD,n,buf,0). FUNC is the function to test. Assumes
+ that BASE and ASSERT are already defined, and that appropriate
+ headers are already included. If PRINT, warn before skipping
+ symlink tests with status 77. */
+
+static int
+test_stat_func (int (*func) (char const *, struct stat *), bool print)
+{
+ struct stat st1;
+ struct stat st2;
+ char cwd[PATH_MAX];
+
+ ASSERT (getcwd (cwd, PATH_MAX) == cwd);
+ ASSERT (func (".", &st1) == 0);
+ ASSERT (func ("./", &st2) == 0);
+ ASSERT (SAME_INODE (st1, st2));
+ ASSERT (func (cwd, &st2) == 0);
+ ASSERT (SAME_INODE (st1, st2));
+ ASSERT (func ("/", &st1) == 0);
+ ASSERT (func ("///", &st2) == 0);
+ ASSERT (SAME_INODE (st1, st2));
+
+ errno = 0;
+ ASSERT (func ("", &st1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("nosuch", &st1) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("nosuch/", &st1) == -1);
+ ASSERT (errno == ENOENT);
+
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ ASSERT (func (BASE "file", &st1) == 0);
+ errno = 0;
+ ASSERT (func (BASE "file/", &st1) == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Now for some symlink tests, where supported. We set up:
+ link1 -> directory
+ link2 -> file
+ link3 -> dangling
+ link4 -> loop
+ then test behavior with trailing slash.
+ */
+ if (symlink (".", BASE "link1") != 0)
+ {
+ ASSERT (unlink (BASE "file") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (symlink (BASE "file", BASE "link2") == 0);
+ ASSERT (symlink (BASE "nosuch", BASE "link3") == 0);
+ ASSERT (symlink (BASE "link4", BASE "link4") == 0);
+
+ ASSERT (func (BASE "link1/", &st1) == 0);
+ ASSERT (S_ISDIR (st1.st_mode));
+
+ errno = 0;
+ ASSERT (func (BASE "link2/", &st1) == -1);
+ ASSERT (errno == ENOTDIR);
+
+ errno = 0;
+ ASSERT (func (BASE "link3/", &st1) == -1);
+ ASSERT (errno == ENOENT);
+
+ errno = 0;
+ ASSERT (func (BASE "link4/", &st1) == -1);
+ ASSERT (errno == ELOOP);
+
+ /* Cleanup. */
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (unlink (BASE "link1") == 0);
+ ASSERT (unlink (BASE "link2") == 0);
+ ASSERT (unlink (BASE "link3") == 0);
+ ASSERT (unlink (BASE "link4") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-stdbool.c b/gnulib/tests/test-stdbool.c
new file mode 100644
index 00000000..560e0e53
--- /dev/null
+++ b/gnulib/tests/test-stdbool.c
@@ -0,0 +1,95 @@
+/* Test of <stdbool.h> substitute.
+ Copyright (C) 2002-2007, 2009-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdbool.h>
+
+#ifndef bool
+ "error: bool is not defined"
+#endif
+#ifndef false
+ "error: false is not defined"
+#endif
+#if false
+ "error: false is not 0"
+#endif
+#ifndef true
+ "error: true is not defined"
+#endif
+#if true != 1
+ "error: true is not 1"
+#endif
+#ifndef __bool_true_false_are_defined
+ "error: __bool_true_false_are_defined is not defined"
+#endif
+
+#if 0 /* Cannot be guaranteed with gnulib's <stdbool.h>. */
+struct s { _Bool s: 1; _Bool t; } s;
+#endif
+
+char a[true == 1 ? 1 : -1];
+char b[false == 0 ? 1 : -1];
+char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+#if 0 /* Cannot be guaranteed with gnulib's <stdbool.h>. */
+char d[(bool) 0.5 == true ? 1 : -1];
+bool e = &s;
+#endif
+char f[(_Bool) 0.0 == false ? 1 : -1];
+char g[true];
+char h[sizeof (_Bool)];
+#if 0 /* See above. */
+char i[sizeof s.t];
+#endif
+enum { j = false, k = true, l = false * true, m = true * 256 };
+_Bool n[m];
+char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+#if 0 /* Cannot be guaranteed with gnulib's <stdbool.h>. */
+#if defined __xlc__ || defined __GNUC__
+ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
+ reported by James Lemley on 2005-10-05; see
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
+ This test is not quite right, since xlc is allowed to
+ reject this program, as the initializer for xlcbug is
+ not one of the forms that C requires support for.
+ However, doing the test right would require a run-time
+ test, and that would make cross-compilation harder.
+ Let us hope that IBM fixes the xlc bug, and also adds
+ support for this kind of constant expression. In the
+ meantime, this test will reject xlc, which is OK, since
+ our stdbool.h substitute should suffice. We also test
+ this with GCC, where it should work, to detect more
+ quickly whether someone messes up the test in the
+ future. */
+ char digs[] = "0123456789";
+ int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
+#endif
+#endif
+/* Catch a bug in an HP-UX C compiler. See
+ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ */
+_Bool q = true;
+_Bool *pq = &q;
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-stddef.c b/gnulib/tests/test-stddef.c
new file mode 100644
index 00000000..d047e57b
--- /dev/null
+++ b/gnulib/tests/test-stddef.c
@@ -0,0 +1,38 @@
+/* Test of <stddef.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <stddef.h>
+
+#include "verify.h"
+
+/* Check that appropriate types are defined. */
+wchar_t a = 'c';
+ptrdiff_t b = 1;
+size_t c = 2;
+
+/* Check that NULL can be passed through varargs as a pointer type,
+ per POSIX 2008. */
+verify (sizeof NULL == sizeof (void *));
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-stdint.c b/gnulib/tests/test-stdint.c
new file mode 100644
index 00000000..9cec2e2f
--- /dev/null
+++ b/gnulib/tests/test-stdint.c
@@ -0,0 +1,360 @@
+/* Test of <stdint.h> substitute.
+ Copyright (C) 2006-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2006. */
+
+#include <config.h>
+
+/* Whether to enable pedantic checks. */
+#define DO_PEDANTIC 0
+
+#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
+#include <stdint.h>
+
+#include "verify.h"
+#include "intprops.h"
+
+#if __GNUC__ >= 2 && DO_PEDANTIC
+# define verify_same_types(expr1,expr2) \
+ extern void _verify_func(__LINE__) (__typeof__ (expr1) *); \
+ extern void _verify_func(__LINE__) (__typeof__ (expr2) *);
+# define _verify_func(line) _verify_func2(line)
+# define _verify_func2(line) verify_func_ ## line
+#else
+# define verify_same_types(expr1,expr2) extern void verify_func (int)
+#endif
+
+/* 7.18.1.1. Exact-width integer types */
+/* 7.18.2.1. Limits of exact-width integer types */
+
+int8_t a1[3] = { INT8_C (17), INT8_MIN, INT8_MAX };
+verify (TYPE_MINIMUM (int8_t) == INT8_MIN);
+verify (TYPE_MAXIMUM (int8_t) == INT8_MAX);
+verify_same_types (INT8_MIN, (int8_t) 0 + 0);
+verify_same_types (INT8_MAX, (int8_t) 0 + 0);
+
+int16_t a2[3] = { INT16_C (17), INT16_MIN, INT16_MAX };
+verify (TYPE_MINIMUM (int16_t) == INT16_MIN);
+verify (TYPE_MAXIMUM (int16_t) == INT16_MAX);
+verify_same_types (INT16_MIN, (int16_t) 0 + 0);
+verify_same_types (INT16_MAX, (int16_t) 0 + 0);
+
+int32_t a3[3] = { INT32_C (17), INT32_MIN, INT32_MAX };
+verify (TYPE_MINIMUM (int32_t) == INT32_MIN);
+verify (TYPE_MAXIMUM (int32_t) == INT32_MAX);
+verify_same_types (INT32_MIN, (int32_t) 0 + 0);
+verify_same_types (INT32_MAX, (int32_t) 0 + 0);
+
+#ifdef INT64_MAX
+int64_t a4[3] = { INT64_C (17), INT64_MIN, INT64_MAX };
+verify (TYPE_MINIMUM (int64_t) == INT64_MIN);
+verify (TYPE_MAXIMUM (int64_t) == INT64_MAX);
+verify_same_types (INT64_MIN, (int64_t) 0 + 0);
+verify_same_types (INT64_MAX, (int64_t) 0 + 0);
+#endif
+
+uint8_t b1[2] = { UINT8_C (17), UINT8_MAX };
+verify (TYPE_MAXIMUM (uint8_t) == UINT8_MAX);
+verify_same_types (UINT8_MAX, (uint8_t) 0 + 0);
+
+uint16_t b2[2] = { UINT16_C (17), UINT16_MAX };
+verify (TYPE_MAXIMUM (uint16_t) == UINT16_MAX);
+verify_same_types (UINT16_MAX, (uint16_t) 0 + 0);
+
+uint32_t b3[2] = { UINT32_C (17), UINT32_MAX };
+verify (TYPE_MAXIMUM (uint32_t) == UINT32_MAX);
+verify_same_types (UINT32_MAX, (uint32_t) 0 + 0);
+
+#ifdef UINT64_MAX
+uint64_t b4[2] = { UINT64_C (17), UINT64_MAX };
+verify (TYPE_MAXIMUM (uint64_t) == UINT64_MAX);
+verify_same_types (UINT64_MAX, (uint64_t) 0 + 0);
+#endif
+
+#if INT8_MIN && INT8_MAX && INT16_MIN && INT16_MAX && INT32_MIN && INT32_MAX
+/* ok */
+#else
+err or;
+#endif
+
+#if UINT8_MAX && UINT16_MAX && UINT32_MAX
+/* ok */
+#else
+err or;
+#endif
+
+/* 7.18.1.2. Minimum-width integer types */
+/* 7.18.2.2. Limits of minimum-width integer types */
+
+int_least8_t c1[3] = { 17, INT_LEAST8_MIN, INT_LEAST8_MAX };
+verify (TYPE_MINIMUM (int_least8_t) == INT_LEAST8_MIN);
+verify (TYPE_MAXIMUM (int_least8_t) == INT_LEAST8_MAX);
+verify_same_types (INT_LEAST8_MIN, (int_least8_t) 0 + 0);
+verify_same_types (INT_LEAST8_MAX, (int_least8_t) 0 + 0);
+
+int_least16_t c2[3] = { 17, INT_LEAST16_MIN, INT_LEAST16_MAX };
+verify (TYPE_MINIMUM (int_least16_t) == INT_LEAST16_MIN);
+verify (TYPE_MAXIMUM (int_least16_t) == INT_LEAST16_MAX);
+verify_same_types (INT_LEAST16_MIN, (int_least16_t) 0 + 0);
+verify_same_types (INT_LEAST16_MAX, (int_least16_t) 0 + 0);
+
+int_least32_t c3[3] = { 17, INT_LEAST32_MIN, INT_LEAST32_MAX };
+verify (TYPE_MINIMUM (int_least32_t) == INT_LEAST32_MIN);
+verify (TYPE_MAXIMUM (int_least32_t) == INT_LEAST32_MAX);
+verify_same_types (INT_LEAST32_MIN, (int_least32_t) 0 + 0);
+verify_same_types (INT_LEAST32_MAX, (int_least32_t) 0 + 0);
+
+#ifdef INT_LEAST64_MAX
+int_least64_t c4[3] = { 17, INT_LEAST64_MIN, INT_LEAST64_MAX };
+verify (TYPE_MINIMUM (int_least64_t) == INT_LEAST64_MIN);
+verify (TYPE_MAXIMUM (int_least64_t) == INT_LEAST64_MAX);
+verify_same_types (INT_LEAST64_MIN, (int_least64_t) 0 + 0);
+verify_same_types (INT_LEAST64_MAX, (int_least64_t) 0 + 0);
+#endif
+
+uint_least8_t d1[2] = { 17, UINT_LEAST8_MAX };
+verify (TYPE_MAXIMUM (uint_least8_t) == UINT_LEAST8_MAX);
+verify_same_types (UINT_LEAST8_MAX, (uint_least8_t) 0 + 0);
+
+uint_least16_t d2[2] = { 17, UINT_LEAST16_MAX };
+verify (TYPE_MAXIMUM (uint_least16_t) == UINT_LEAST16_MAX);
+verify_same_types (UINT_LEAST16_MAX, (uint_least16_t) 0 + 0);
+
+uint_least32_t d3[2] = { 17, UINT_LEAST32_MAX };
+verify (TYPE_MAXIMUM (uint_least32_t) == UINT_LEAST32_MAX);
+verify_same_types (UINT_LEAST32_MAX, (uint_least32_t) 0 + 0);
+
+#ifdef UINT_LEAST64_MAX
+uint_least64_t d4[2] = { 17, UINT_LEAST64_MAX };
+verify (TYPE_MAXIMUM (uint_least64_t) == UINT_LEAST64_MAX);
+verify_same_types (UINT_LEAST64_MAX, (uint_least64_t) 0 + 0);
+#endif
+
+#if INT_LEAST8_MIN && INT_LEAST8_MAX && INT_LEAST16_MIN && INT_LEAST16_MAX && INT_LEAST32_MIN && INT_LEAST32_MAX
+/* ok */
+#else
+err or;
+#endif
+
+#if UINT_LEAST8_MAX && UINT_LEAST16_MAX && UINT_LEAST32_MAX
+/* ok */
+#else
+err or;
+#endif
+
+/* 7.18.1.3. Fastest minimum-width integer types */
+/* 7.18.2.3. Limits of fastest minimum-width integer types */
+
+int_fast8_t e1[3] = { 17, INT_FAST8_MIN, INT_FAST8_MAX };
+verify (TYPE_MINIMUM (int_fast8_t) == INT_FAST8_MIN);
+verify (TYPE_MAXIMUM (int_fast8_t) == INT_FAST8_MAX);
+verify_same_types (INT_FAST8_MIN, (int_fast8_t) 0 + 0);
+verify_same_types (INT_FAST8_MAX, (int_fast8_t) 0 + 0);
+
+int_fast16_t e2[3] = { 17, INT_FAST16_MIN, INT_FAST16_MAX };
+verify (TYPE_MINIMUM (int_fast16_t) == INT_FAST16_MIN);
+verify (TYPE_MAXIMUM (int_fast16_t) == INT_FAST16_MAX);
+verify_same_types (INT_FAST16_MIN, (int_fast16_t) 0 + 0);
+verify_same_types (INT_FAST16_MAX, (int_fast16_t) 0 + 0);
+
+int_fast32_t e3[3] = { 17, INT_FAST32_MIN, INT_FAST32_MAX };
+verify (TYPE_MINIMUM (int_fast32_t) == INT_FAST32_MIN);
+verify (TYPE_MAXIMUM (int_fast32_t) == INT_FAST32_MAX);
+verify_same_types (INT_FAST32_MIN, (int_fast32_t) 0 + 0);
+verify_same_types (INT_FAST32_MAX, (int_fast32_t) 0 + 0);
+
+#ifdef INT_FAST64_MAX
+int_fast64_t e4[3] = { 17, INT_FAST64_MIN, INT_FAST64_MAX };
+verify (TYPE_MINIMUM (int_fast64_t) == INT_FAST64_MIN);
+verify (TYPE_MAXIMUM (int_fast64_t) == INT_FAST64_MAX);
+verify_same_types (INT_FAST64_MIN, (int_fast64_t) 0 + 0);
+verify_same_types (INT_FAST64_MAX, (int_fast64_t) 0 + 0);
+#endif
+
+uint_fast8_t f1[2] = { 17, UINT_FAST8_MAX };
+verify (TYPE_MAXIMUM (uint_fast8_t) == UINT_FAST8_MAX);
+verify_same_types (UINT_FAST8_MAX, (uint_fast8_t) 0 + 0);
+
+uint_fast16_t f2[2] = { 17, UINT_FAST16_MAX };
+verify (TYPE_MAXIMUM (uint_fast16_t) == UINT_FAST16_MAX);
+verify_same_types (UINT_FAST16_MAX, (uint_fast16_t) 0 + 0);
+
+uint_fast32_t f3[2] = { 17, UINT_FAST32_MAX };
+verify (TYPE_MAXIMUM (uint_fast32_t) == UINT_FAST32_MAX);
+verify_same_types (UINT_FAST32_MAX, (uint_fast32_t) 0 + 0);
+
+#ifdef UINT_FAST64_MAX
+uint_fast64_t f4[2] = { 17, UINT_FAST64_MAX };
+verify (TYPE_MAXIMUM (uint_fast64_t) == UINT_FAST64_MAX);
+verify_same_types (UINT_FAST64_MAX, (uint_fast64_t) 0 + 0);
+#endif
+
+#if INT_FAST8_MIN && INT_FAST8_MAX && INT_FAST16_MIN && INT_FAST16_MAX && INT_FAST32_MIN && INT_FAST32_MAX
+/* ok */
+#else
+err or;
+#endif
+
+#if UINT_FAST8_MAX && UINT_FAST16_MAX && UINT_FAST32_MAX
+/* ok */
+#else
+err or;
+#endif
+
+/* 7.18.1.4. Integer types capable of holding object pointers */
+/* 7.18.2.4. Limits of integer types capable of holding object pointers */
+
+intptr_t g[3] = { 17, INTPTR_MIN, INTPTR_MAX };
+verify (TYPE_MINIMUM (intptr_t) == INTPTR_MIN);
+verify (TYPE_MAXIMUM (intptr_t) == INTPTR_MAX);
+verify_same_types (INTPTR_MIN, (intptr_t) 0 + 0);
+verify_same_types (INTPTR_MAX, (intptr_t) 0 + 0);
+
+uintptr_t h[2] = { 17, UINTPTR_MAX };
+verify (TYPE_MAXIMUM (uintptr_t) == UINTPTR_MAX);
+verify_same_types (UINTPTR_MAX, (uintptr_t) 0 + 0);
+
+#if INTPTR_MIN && INTPTR_MAX && UINTPTR_MAX
+/* ok */
+#else
+err or;
+#endif
+
+/* 7.18.1.5. Greatest-width integer types */
+/* 7.18.2.5. Limits of greatest-width integer types */
+
+intmax_t i[3] = { INTMAX_C (17), INTMAX_MIN, INTMAX_MAX };
+verify (TYPE_MINIMUM (intmax_t) == INTMAX_MIN);
+verify (TYPE_MAXIMUM (intmax_t) == INTMAX_MAX);
+verify_same_types (INTMAX_MIN, (intmax_t) 0 + 0);
+verify_same_types (INTMAX_MAX, (intmax_t) 0 + 0);
+
+uintmax_t j[2] = { UINTMAX_C (17), UINTMAX_MAX };
+verify (TYPE_MAXIMUM (uintmax_t) == UINTMAX_MAX);
+verify_same_types (UINTMAX_MAX, (uintmax_t) 0 + 0);
+
+/* As of 2007, Sun C and HP-UX 10.20 cc don't support 'long long' constants in
+ the preprocessor. */
+#if !(defined __SUNPRO_C || (defined __hpux && !defined __GNUC__))
+#if INTMAX_MIN && INTMAX_MAX && UINTMAX_MAX
+/* ok */
+#else
+err or;
+#endif
+#endif
+
+/* 7.18.3. Limits of other integer types */
+
+#include <stddef.h>
+
+verify (TYPE_MINIMUM (ptrdiff_t) == PTRDIFF_MIN);
+verify (TYPE_MAXIMUM (ptrdiff_t) == PTRDIFF_MAX);
+verify_same_types (PTRDIFF_MIN, (ptrdiff_t) 0 + 0);
+verify_same_types (PTRDIFF_MAX, (ptrdiff_t) 0 + 0);
+
+#if PTRDIFF_MIN && PTRDIFF_MAX
+/* ok */
+#else
+err or;
+#endif
+
+#include <signal.h>
+
+verify (TYPE_MINIMUM (sig_atomic_t) == SIG_ATOMIC_MIN);
+verify (TYPE_MAXIMUM (sig_atomic_t) == SIG_ATOMIC_MAX);
+verify_same_types (SIG_ATOMIC_MIN, (sig_atomic_t) 0 + 0);
+verify_same_types (SIG_ATOMIC_MAX, (sig_atomic_t) 0 + 0);
+
+#if SIG_ATOMIC_MIN != 17 && SIG_ATOMIC_MAX
+/* ok */
+#else
+err or;
+#endif
+
+verify (TYPE_MAXIMUM (size_t) == SIZE_MAX);
+verify_same_types (SIZE_MAX, (size_t) 0 + 0);
+
+#if SIZE_MAX
+/* ok */
+#else
+err or;
+#endif
+
+#if HAVE_WCHAR_T
+verify (TYPE_MINIMUM (wchar_t) == WCHAR_MIN);
+verify (TYPE_MAXIMUM (wchar_t) == WCHAR_MAX);
+verify_same_types (WCHAR_MIN, (wchar_t) 0 + 0);
+verify_same_types (WCHAR_MAX, (wchar_t) 0 + 0);
+
+# if WCHAR_MIN != 17 && WCHAR_MAX
+/* ok */
+# else
+err or;
+# endif
+#endif
+
+#if HAVE_WINT_T
+# include <wchar.h>
+
+verify (TYPE_MINIMUM (wint_t) == WINT_MIN);
+verify (TYPE_MAXIMUM (wint_t) == WINT_MAX);
+verify_same_types (WINT_MIN, (wint_t) 0 + 0);
+verify_same_types (WINT_MAX, (wint_t) 0 + 0);
+
+# if WINT_MIN != 17 && WINT_MAX
+/* ok */
+# else
+err or;
+# endif
+#endif
+
+/* 7.18.4. Macros for integer constants */
+
+verify (INT8_C (17) == 17);
+verify_same_types (INT8_C (17), (int_least8_t)0 + 0);
+verify (UINT8_C (17) == 17);
+verify_same_types (UINT8_C (17), (uint_least8_t)0 + 0);
+
+verify (INT16_C (17) == 17);
+verify_same_types (INT16_C (17), (int_least16_t)0 + 0);
+verify (UINT16_C (17) == 17);
+verify_same_types (UINT16_C (17), (uint_least16_t)0 + 0);
+
+verify (INT32_C (17) == 17);
+verify_same_types (INT32_C (17), (int_least32_t)0 + 0);
+verify (UINT32_C (17) == 17);
+verify_same_types (UINT32_C (17), (uint_least32_t)0 + 0);
+
+#ifdef INT64_C
+verify (INT64_C (17) == 17);
+verify_same_types (INT64_C (17), (int_least64_t)0 + 0);
+#endif
+#ifdef UINT64_C
+verify (UINT64_C (17) == 17);
+verify_same_types (UINT64_C (17), (uint_least64_t)0 + 0);
+#endif
+
+verify (INTMAX_C (17) == 17);
+verify_same_types (INTMAX_C (17), (intmax_t)0 + 0);
+verify (UINTMAX_C (17) == 17);
+verify_same_types (UINTMAX_C (17), (uintmax_t)0 + 0);
+
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-stdio.c b/gnulib/tests/test-stdio.c
new file mode 100644
index 00000000..87100576
--- /dev/null
+++ b/gnulib/tests/test-stdio.c
@@ -0,0 +1,43 @@
+/* Test of <stdio.h> substitute.
+ Copyright (C) 2007, 2009-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "verify.h"
+
+/* Check that the various SEEK_* macros are defined. */
+int sk[] = { SEEK_CUR, SEEK_END, SEEK_SET };
+
+/* Check that NULL can be passed through varargs as a pointer type,
+ per POSIX 2008. */
+verify (sizeof NULL == sizeof (void *));
+
+/* Check that the types are all defined. */
+fpos_t t1;
+off_t t2;
+size_t t3;
+ssize_t t4;
+va_list t5;
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-stdlib.c b/gnulib/tests/test-stdlib.c
new file mode 100644
index 00000000..4bd8715f
--- /dev/null
+++ b/gnulib/tests/test-stdlib.c
@@ -0,0 +1,43 @@
+/* Test of <stdlib.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "verify.h"
+
+int exitcode;
+
+/* Check that NULL can be passed through varargs as a pointer type,
+ per POSIX 2008. */
+verify (sizeof NULL == sizeof (void *));
+
+int
+main (void)
+{
+ /* Check that some macros are defined and different integer constants. */
+ switch (exitcode)
+ {
+ case EXIT_SUCCESS:
+ case EXIT_FAILURE:
+ break;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-stpncpy.c b/gnulib/tests/test-stpncpy.c
new file mode 100644
index 00000000..ecc82072
--- /dev/null
+++ b/gnulib/tests/test-stpncpy.c
@@ -0,0 +1,61 @@
+/* Test the system defined function stpncpy().
+ Copyright (C) 2003, 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (stpncpy, char *, (char *, char const *, size_t));
+
+#include <stdio.h>
+
+int
+main ()
+{
+ char from[10];
+ char to[10];
+ int i, j, k, h;
+ char *ret;
+
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ for (k = 0; k < 10; k++)
+ {
+ memset (from, 'X', sizeof from);
+ memcpy (from, "SourceString", i);
+ if (i < 10) from[i] = '\0';
+ memset (to, 'Y', sizeof to);
+ memcpy (to, "Destination", k);
+ if (k < 10) to[k] = '\0';
+ ret = stpncpy (to, from, j);
+ printf ("i = %2d, j = %2d, k = %2d: from = ", i, j, k);
+ for (h = 0; h < 10; h++)
+ if (from[h] >= 0x20 && from[h] < 0x7f)
+ putchar (from[h]);
+ else
+ printf ("\\x%02x", from[h]);
+ printf (" to = ");
+ for (h = 0; h < 10; h++)
+ if (to[h] >= 0x20 && to[h] < 0x7f)
+ putchar (to[h]);
+ else
+ printf ("\\x%02x", to[h]);
+ printf (" ret = to + %d\n", ret - to);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-stpncpy.out.aix433 b/gnulib/tests/test-stpncpy.out.aix433
new file mode 100644
index 00000000..28627a93
--- /dev/null
+++ b/gnulib/tests/test-stpncpy.out.aix433
@@ -0,0 +1,1000 @@
+i = 0, j = 0, k = 0: from = \x00XXXXXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 0, j = 0, k = 1: from = \x00XXXXXXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 0, j = 0, k = 2: from = \x00XXXXXXXXX to = De\x00YYYYYYY ret = to + 0
+i = 0, j = 0, k = 3: from = \x00XXXXXXXXX to = Des\x00YYYYYY ret = to + 0
+i = 0, j = 0, k = 4: from = \x00XXXXXXXXX to = Dest\x00YYYYY ret = to + 0
+i = 0, j = 0, k = 5: from = \x00XXXXXXXXX to = Desti\x00YYYY ret = to + 0
+i = 0, j = 0, k = 6: from = \x00XXXXXXXXX to = Destin\x00YYY ret = to + 0
+i = 0, j = 0, k = 7: from = \x00XXXXXXXXX to = Destina\x00YY ret = to + 0
+i = 0, j = 0, k = 8: from = \x00XXXXXXXXX to = Destinat\x00Y ret = to + 0
+i = 0, j = 0, k = 9: from = \x00XXXXXXXXX to = Destinati\x00 ret = to + 0
+i = 0, j = 1, k = 0: from = \x00XXXXXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 0, j = 1, k = 1: from = \x00XXXXXXXXX to = \x00\x00YYYYYYYY ret = to + 0
+i = 0, j = 1, k = 2: from = \x00XXXXXXXXX to = \x00e\x00YYYYYYY ret = to + 0
+i = 0, j = 1, k = 3: from = \x00XXXXXXXXX to = \x00es\x00YYYYYY ret = to + 0
+i = 0, j = 1, k = 4: from = \x00XXXXXXXXX to = \x00est\x00YYYYY ret = to + 0
+i = 0, j = 1, k = 5: from = \x00XXXXXXXXX to = \x00esti\x00YYYY ret = to + 0
+i = 0, j = 1, k = 6: from = \x00XXXXXXXXX to = \x00estin\x00YYY ret = to + 0
+i = 0, j = 1, k = 7: from = \x00XXXXXXXXX to = \x00estina\x00YY ret = to + 0
+i = 0, j = 1, k = 8: from = \x00XXXXXXXXX to = \x00estinat\x00Y ret = to + 0
+i = 0, j = 1, k = 9: from = \x00XXXXXXXXX to = \x00estinati\x00 ret = to + 0
+i = 0, j = 2, k = 0: from = \x00XXXXXXXXX to = \x00\x00YYYYYYYY ret = to + 1
+i = 0, j = 2, k = 1: from = \x00XXXXXXXXX to = \x00\x00YYYYYYYY ret = to + 1
+i = 0, j = 2, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00YYYYYYY ret = to + 1
+i = 0, j = 2, k = 3: from = \x00XXXXXXXXX to = \x00\x00s\x00YYYYYY ret = to + 1
+i = 0, j = 2, k = 4: from = \x00XXXXXXXXX to = \x00\x00st\x00YYYYY ret = to + 1
+i = 0, j = 2, k = 5: from = \x00XXXXXXXXX to = \x00\x00sti\x00YYYY ret = to + 1
+i = 0, j = 2, k = 6: from = \x00XXXXXXXXX to = \x00\x00stin\x00YYY ret = to + 1
+i = 0, j = 2, k = 7: from = \x00XXXXXXXXX to = \x00\x00stina\x00YY ret = to + 1
+i = 0, j = 2, k = 8: from = \x00XXXXXXXXX to = \x00\x00stinat\x00Y ret = to + 1
+i = 0, j = 2, k = 9: from = \x00XXXXXXXXX to = \x00\x00stinati\x00 ret = to + 1
+i = 0, j = 3, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00YYYYYYY ret = to + 2
+i = 0, j = 3, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00YYYYYYY ret = to + 2
+i = 0, j = 3, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00YYYYYYY ret = to + 2
+i = 0, j = 3, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 2
+i = 0, j = 3, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00t\x00YYYYY ret = to + 2
+i = 0, j = 3, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00ti\x00YYYY ret = to + 2
+i = 0, j = 3, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00tin\x00YYY ret = to + 2
+i = 0, j = 3, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00tina\x00YY ret = to + 2
+i = 0, j = 3, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00tinat\x00Y ret = to + 2
+i = 0, j = 3, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00tinati\x00 ret = to + 2
+i = 0, j = 4, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 3
+i = 0, j = 4, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 3
+i = 0, j = 4, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 3
+i = 0, j = 4, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 3
+i = 0, j = 4, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 3
+i = 0, j = 4, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00i\x00YYYY ret = to + 3
+i = 0, j = 4, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00in\x00YYY ret = to + 3
+i = 0, j = 4, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00ina\x00YY ret = to + 3
+i = 0, j = 4, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00inat\x00Y ret = to + 3
+i = 0, j = 4, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00inati\x00 ret = to + 3
+i = 0, j = 5, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 4
+i = 0, j = 5, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 4
+i = 0, j = 5, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 4
+i = 0, j = 5, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 4
+i = 0, j = 5, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 4
+i = 0, j = 5, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 4
+i = 0, j = 5, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00n\x00YYY ret = to + 4
+i = 0, j = 5, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00na\x00YY ret = to + 4
+i = 0, j = 5, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00nat\x00Y ret = to + 4
+i = 0, j = 5, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00nati\x00 ret = to + 4
+i = 0, j = 6, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 0, j = 6, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 0, j = 6, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 0, j = 6, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 0, j = 6, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 0, j = 6, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 0, j = 6, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 5
+i = 0, j = 6, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00a\x00YY ret = to + 5
+i = 0, j = 6, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00at\x00Y ret = to + 5
+i = 0, j = 6, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00ati\x00 ret = to + 5
+i = 0, j = 7, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 0, j = 7, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 0, j = 7, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 0, j = 7, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 0, j = 7, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 0, j = 7, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 0, j = 7, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 0, j = 7, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 6
+i = 0, j = 7, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00t\x00Y ret = to + 6
+i = 0, j = 7, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00ti\x00 ret = to + 6
+i = 0, j = 8, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 0, j = 8, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 0, j = 8, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 0, j = 8, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 0, j = 8, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 0, j = 8, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 0, j = 8, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 0, j = 8, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 0, j = 8, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 7
+i = 0, j = 8, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00i\x00 ret = to + 7
+i = 0, j = 9, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 0, j = 9, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 ret = to + 8
+i = 1, j = 0, k = 0: from = S\x00XXXXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 1, j = 0, k = 1: from = S\x00XXXXXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 1, j = 0, k = 2: from = S\x00XXXXXXXX to = De\x00YYYYYYY ret = to + 0
+i = 1, j = 0, k = 3: from = S\x00XXXXXXXX to = Des\x00YYYYYY ret = to + 0
+i = 1, j = 0, k = 4: from = S\x00XXXXXXXX to = Dest\x00YYYYY ret = to + 0
+i = 1, j = 0, k = 5: from = S\x00XXXXXXXX to = Desti\x00YYYY ret = to + 0
+i = 1, j = 0, k = 6: from = S\x00XXXXXXXX to = Destin\x00YYY ret = to + 0
+i = 1, j = 0, k = 7: from = S\x00XXXXXXXX to = Destina\x00YY ret = to + 0
+i = 1, j = 0, k = 8: from = S\x00XXXXXXXX to = Destinat\x00Y ret = to + 0
+i = 1, j = 0, k = 9: from = S\x00XXXXXXXX to = Destinati\x00 ret = to + 0
+i = 1, j = 1, k = 0: from = S\x00XXXXXXXX to = SYYYYYYYYY ret = to + 0
+i = 1, j = 1, k = 1: from = S\x00XXXXXXXX to = S\x00YYYYYYYY ret = to + 0
+i = 1, j = 1, k = 2: from = S\x00XXXXXXXX to = Se\x00YYYYYYY ret = to + 0
+i = 1, j = 1, k = 3: from = S\x00XXXXXXXX to = Ses\x00YYYYYY ret = to + 0
+i = 1, j = 1, k = 4: from = S\x00XXXXXXXX to = Sest\x00YYYYY ret = to + 0
+i = 1, j = 1, k = 5: from = S\x00XXXXXXXX to = Sesti\x00YYYY ret = to + 0
+i = 1, j = 1, k = 6: from = S\x00XXXXXXXX to = Sestin\x00YYY ret = to + 0
+i = 1, j = 1, k = 7: from = S\x00XXXXXXXX to = Sestina\x00YY ret = to + 0
+i = 1, j = 1, k = 8: from = S\x00XXXXXXXX to = Sestinat\x00Y ret = to + 0
+i = 1, j = 1, k = 9: from = S\x00XXXXXXXX to = Sestinati\x00 ret = to + 0
+i = 1, j = 2, k = 0: from = S\x00XXXXXXXX to = S\x00YYYYYYYY ret = to + 1
+i = 1, j = 2, k = 1: from = S\x00XXXXXXXX to = S\x00YYYYYYYY ret = to + 1
+i = 1, j = 2, k = 2: from = S\x00XXXXXXXX to = S\x00\x00YYYYYYY ret = to + 1
+i = 1, j = 2, k = 3: from = S\x00XXXXXXXX to = S\x00s\x00YYYYYY ret = to + 1
+i = 1, j = 2, k = 4: from = S\x00XXXXXXXX to = S\x00st\x00YYYYY ret = to + 1
+i = 1, j = 2, k = 5: from = S\x00XXXXXXXX to = S\x00sti\x00YYYY ret = to + 1
+i = 1, j = 2, k = 6: from = S\x00XXXXXXXX to = S\x00stin\x00YYY ret = to + 1
+i = 1, j = 2, k = 7: from = S\x00XXXXXXXX to = S\x00stina\x00YY ret = to + 1
+i = 1, j = 2, k = 8: from = S\x00XXXXXXXX to = S\x00stinat\x00Y ret = to + 1
+i = 1, j = 2, k = 9: from = S\x00XXXXXXXX to = S\x00stinati\x00 ret = to + 1
+i = 1, j = 3, k = 0: from = S\x00XXXXXXXX to = S\x00\x00YYYYYYY ret = to + 2
+i = 1, j = 3, k = 1: from = S\x00XXXXXXXX to = S\x00\x00YYYYYYY ret = to + 2
+i = 1, j = 3, k = 2: from = S\x00XXXXXXXX to = S\x00\x00YYYYYYY ret = to + 2
+i = 1, j = 3, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 2
+i = 1, j = 3, k = 4: from = S\x00XXXXXXXX to = S\x00\x00t\x00YYYYY ret = to + 2
+i = 1, j = 3, k = 5: from = S\x00XXXXXXXX to = S\x00\x00ti\x00YYYY ret = to + 2
+i = 1, j = 3, k = 6: from = S\x00XXXXXXXX to = S\x00\x00tin\x00YYY ret = to + 2
+i = 1, j = 3, k = 7: from = S\x00XXXXXXXX to = S\x00\x00tina\x00YY ret = to + 2
+i = 1, j = 3, k = 8: from = S\x00XXXXXXXX to = S\x00\x00tinat\x00Y ret = to + 2
+i = 1, j = 3, k = 9: from = S\x00XXXXXXXX to = S\x00\x00tinati\x00 ret = to + 2
+i = 1, j = 4, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 3
+i = 1, j = 4, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 3
+i = 1, j = 4, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 3
+i = 1, j = 4, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 3
+i = 1, j = 4, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 3
+i = 1, j = 4, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00i\x00YYYY ret = to + 3
+i = 1, j = 4, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00in\x00YYY ret = to + 3
+i = 1, j = 4, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00ina\x00YY ret = to + 3
+i = 1, j = 4, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00inat\x00Y ret = to + 3
+i = 1, j = 4, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00inati\x00 ret = to + 3
+i = 1, j = 5, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 4
+i = 1, j = 5, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 4
+i = 1, j = 5, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 4
+i = 1, j = 5, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 4
+i = 1, j = 5, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 4
+i = 1, j = 5, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 4
+i = 1, j = 5, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00n\x00YYY ret = to + 4
+i = 1, j = 5, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00na\x00YY ret = to + 4
+i = 1, j = 5, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00nat\x00Y ret = to + 4
+i = 1, j = 5, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00nati\x00 ret = to + 4
+i = 1, j = 6, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 1, j = 6, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 1, j = 6, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 1, j = 6, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 1, j = 6, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 1, j = 6, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 5
+i = 1, j = 6, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 5
+i = 1, j = 6, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00a\x00YY ret = to + 5
+i = 1, j = 6, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00at\x00Y ret = to + 5
+i = 1, j = 6, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00ati\x00 ret = to + 5
+i = 1, j = 7, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 1, j = 7, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 1, j = 7, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 1, j = 7, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 1, j = 7, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 1, j = 7, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 1, j = 7, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 1, j = 7, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 6
+i = 1, j = 7, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00t\x00Y ret = to + 6
+i = 1, j = 7, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00ti\x00 ret = to + 6
+i = 1, j = 8, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 1, j = 8, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 1, j = 8, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 1, j = 8, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 1, j = 8, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 1, j = 8, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 1, j = 8, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 1, j = 8, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 1, j = 8, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 7
+i = 1, j = 8, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00i\x00 ret = to + 7
+i = 1, j = 9, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 1, j = 9, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00\x00 ret = to + 8
+i = 2, j = 0, k = 0: from = So\x00XXXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 2, j = 0, k = 1: from = So\x00XXXXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 2, j = 0, k = 2: from = So\x00XXXXXXX to = De\x00YYYYYYY ret = to + 0
+i = 2, j = 0, k = 3: from = So\x00XXXXXXX to = Des\x00YYYYYY ret = to + 0
+i = 2, j = 0, k = 4: from = So\x00XXXXXXX to = Dest\x00YYYYY ret = to + 0
+i = 2, j = 0, k = 5: from = So\x00XXXXXXX to = Desti\x00YYYY ret = to + 0
+i = 2, j = 0, k = 6: from = So\x00XXXXXXX to = Destin\x00YYY ret = to + 0
+i = 2, j = 0, k = 7: from = So\x00XXXXXXX to = Destina\x00YY ret = to + 0
+i = 2, j = 0, k = 8: from = So\x00XXXXXXX to = Destinat\x00Y ret = to + 0
+i = 2, j = 0, k = 9: from = So\x00XXXXXXX to = Destinati\x00 ret = to + 0
+i = 2, j = 1, k = 0: from = So\x00XXXXXXX to = SYYYYYYYYY ret = to + 0
+i = 2, j = 1, k = 1: from = So\x00XXXXXXX to = S\x00YYYYYYYY ret = to + 0
+i = 2, j = 1, k = 2: from = So\x00XXXXXXX to = Se\x00YYYYYYY ret = to + 0
+i = 2, j = 1, k = 3: from = So\x00XXXXXXX to = Ses\x00YYYYYY ret = to + 0
+i = 2, j = 1, k = 4: from = So\x00XXXXXXX to = Sest\x00YYYYY ret = to + 0
+i = 2, j = 1, k = 5: from = So\x00XXXXXXX to = Sesti\x00YYYY ret = to + 0
+i = 2, j = 1, k = 6: from = So\x00XXXXXXX to = Sestin\x00YYY ret = to + 0
+i = 2, j = 1, k = 7: from = So\x00XXXXXXX to = Sestina\x00YY ret = to + 0
+i = 2, j = 1, k = 8: from = So\x00XXXXXXX to = Sestinat\x00Y ret = to + 0
+i = 2, j = 1, k = 9: from = So\x00XXXXXXX to = Sestinati\x00 ret = to + 0
+i = 2, j = 2, k = 0: from = So\x00XXXXXXX to = SoYYYYYYYY ret = to + 1
+i = 2, j = 2, k = 1: from = So\x00XXXXXXX to = SoYYYYYYYY ret = to + 1
+i = 2, j = 2, k = 2: from = So\x00XXXXXXX to = So\x00YYYYYYY ret = to + 1
+i = 2, j = 2, k = 3: from = So\x00XXXXXXX to = Sos\x00YYYYYY ret = to + 1
+i = 2, j = 2, k = 4: from = So\x00XXXXXXX to = Sost\x00YYYYY ret = to + 1
+i = 2, j = 2, k = 5: from = So\x00XXXXXXX to = Sosti\x00YYYY ret = to + 1
+i = 2, j = 2, k = 6: from = So\x00XXXXXXX to = Sostin\x00YYY ret = to + 1
+i = 2, j = 2, k = 7: from = So\x00XXXXXXX to = Sostina\x00YY ret = to + 1
+i = 2, j = 2, k = 8: from = So\x00XXXXXXX to = Sostinat\x00Y ret = to + 1
+i = 2, j = 2, k = 9: from = So\x00XXXXXXX to = Sostinati\x00 ret = to + 1
+i = 2, j = 3, k = 0: from = So\x00XXXXXXX to = So\x00YYYYYYY ret = to + 2
+i = 2, j = 3, k = 1: from = So\x00XXXXXXX to = So\x00YYYYYYY ret = to + 2
+i = 2, j = 3, k = 2: from = So\x00XXXXXXX to = So\x00YYYYYYY ret = to + 2
+i = 2, j = 3, k = 3: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 2
+i = 2, j = 3, k = 4: from = So\x00XXXXXXX to = So\x00t\x00YYYYY ret = to + 2
+i = 2, j = 3, k = 5: from = So\x00XXXXXXX to = So\x00ti\x00YYYY ret = to + 2
+i = 2, j = 3, k = 6: from = So\x00XXXXXXX to = So\x00tin\x00YYY ret = to + 2
+i = 2, j = 3, k = 7: from = So\x00XXXXXXX to = So\x00tina\x00YY ret = to + 2
+i = 2, j = 3, k = 8: from = So\x00XXXXXXX to = So\x00tinat\x00Y ret = to + 2
+i = 2, j = 3, k = 9: from = So\x00XXXXXXX to = So\x00tinati\x00 ret = to + 2
+i = 2, j = 4, k = 0: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 3
+i = 2, j = 4, k = 1: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 3
+i = 2, j = 4, k = 2: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 3
+i = 2, j = 4, k = 3: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 3
+i = 2, j = 4, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 3
+i = 2, j = 4, k = 5: from = So\x00XXXXXXX to = So\x00\x00i\x00YYYY ret = to + 3
+i = 2, j = 4, k = 6: from = So\x00XXXXXXX to = So\x00\x00in\x00YYY ret = to + 3
+i = 2, j = 4, k = 7: from = So\x00XXXXXXX to = So\x00\x00ina\x00YY ret = to + 3
+i = 2, j = 4, k = 8: from = So\x00XXXXXXX to = So\x00\x00inat\x00Y ret = to + 3
+i = 2, j = 4, k = 9: from = So\x00XXXXXXX to = So\x00\x00inati\x00 ret = to + 3
+i = 2, j = 5, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 4
+i = 2, j = 5, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 4
+i = 2, j = 5, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 4
+i = 2, j = 5, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 4
+i = 2, j = 5, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 4
+i = 2, j = 5, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 4
+i = 2, j = 5, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00n\x00YYY ret = to + 4
+i = 2, j = 5, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00na\x00YY ret = to + 4
+i = 2, j = 5, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00nat\x00Y ret = to + 4
+i = 2, j = 5, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00nati\x00 ret = to + 4
+i = 2, j = 6, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 5
+i = 2, j = 6, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 5
+i = 2, j = 6, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 5
+i = 2, j = 6, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 5
+i = 2, j = 6, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 5
+i = 2, j = 6, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 5
+i = 2, j = 6, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 5
+i = 2, j = 6, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00\x00a\x00YY ret = to + 5
+i = 2, j = 6, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00\x00at\x00Y ret = to + 5
+i = 2, j = 6, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00\x00ati\x00 ret = to + 5
+i = 2, j = 7, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 2, j = 7, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 2, j = 7, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 2, j = 7, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 2, j = 7, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 2, j = 7, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 2, j = 7, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 6
+i = 2, j = 7, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 6
+i = 2, j = 7, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00t\x00Y ret = to + 6
+i = 2, j = 7, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00ti\x00 ret = to + 6
+i = 2, j = 8, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 2, j = 8, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 2, j = 8, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 2, j = 8, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 2, j = 8, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 2, j = 8, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 2, j = 8, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 2, j = 8, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 7
+i = 2, j = 8, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 7
+i = 2, j = 8, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00i\x00 ret = to + 7
+i = 2, j = 9, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 2, j = 9, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00\x00 ret = to + 8
+i = 3, j = 0, k = 0: from = Sou\x00XXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 3, j = 0, k = 1: from = Sou\x00XXXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 3, j = 0, k = 2: from = Sou\x00XXXXXX to = De\x00YYYYYYY ret = to + 0
+i = 3, j = 0, k = 3: from = Sou\x00XXXXXX to = Des\x00YYYYYY ret = to + 0
+i = 3, j = 0, k = 4: from = Sou\x00XXXXXX to = Dest\x00YYYYY ret = to + 0
+i = 3, j = 0, k = 5: from = Sou\x00XXXXXX to = Desti\x00YYYY ret = to + 0
+i = 3, j = 0, k = 6: from = Sou\x00XXXXXX to = Destin\x00YYY ret = to + 0
+i = 3, j = 0, k = 7: from = Sou\x00XXXXXX to = Destina\x00YY ret = to + 0
+i = 3, j = 0, k = 8: from = Sou\x00XXXXXX to = Destinat\x00Y ret = to + 0
+i = 3, j = 0, k = 9: from = Sou\x00XXXXXX to = Destinati\x00 ret = to + 0
+i = 3, j = 1, k = 0: from = Sou\x00XXXXXX to = SYYYYYYYYY ret = to + 0
+i = 3, j = 1, k = 1: from = Sou\x00XXXXXX to = S\x00YYYYYYYY ret = to + 0
+i = 3, j = 1, k = 2: from = Sou\x00XXXXXX to = Se\x00YYYYYYY ret = to + 0
+i = 3, j = 1, k = 3: from = Sou\x00XXXXXX to = Ses\x00YYYYYY ret = to + 0
+i = 3, j = 1, k = 4: from = Sou\x00XXXXXX to = Sest\x00YYYYY ret = to + 0
+i = 3, j = 1, k = 5: from = Sou\x00XXXXXX to = Sesti\x00YYYY ret = to + 0
+i = 3, j = 1, k = 6: from = Sou\x00XXXXXX to = Sestin\x00YYY ret = to + 0
+i = 3, j = 1, k = 7: from = Sou\x00XXXXXX to = Sestina\x00YY ret = to + 0
+i = 3, j = 1, k = 8: from = Sou\x00XXXXXX to = Sestinat\x00Y ret = to + 0
+i = 3, j = 1, k = 9: from = Sou\x00XXXXXX to = Sestinati\x00 ret = to + 0
+i = 3, j = 2, k = 0: from = Sou\x00XXXXXX to = SoYYYYYYYY ret = to + 1
+i = 3, j = 2, k = 1: from = Sou\x00XXXXXX to = SoYYYYYYYY ret = to + 1
+i = 3, j = 2, k = 2: from = Sou\x00XXXXXX to = So\x00YYYYYYY ret = to + 1
+i = 3, j = 2, k = 3: from = Sou\x00XXXXXX to = Sos\x00YYYYYY ret = to + 1
+i = 3, j = 2, k = 4: from = Sou\x00XXXXXX to = Sost\x00YYYYY ret = to + 1
+i = 3, j = 2, k = 5: from = Sou\x00XXXXXX to = Sosti\x00YYYY ret = to + 1
+i = 3, j = 2, k = 6: from = Sou\x00XXXXXX to = Sostin\x00YYY ret = to + 1
+i = 3, j = 2, k = 7: from = Sou\x00XXXXXX to = Sostina\x00YY ret = to + 1
+i = 3, j = 2, k = 8: from = Sou\x00XXXXXX to = Sostinat\x00Y ret = to + 1
+i = 3, j = 2, k = 9: from = Sou\x00XXXXXX to = Sostinati\x00 ret = to + 1
+i = 3, j = 3, k = 0: from = Sou\x00XXXXXX to = SouYYYYYYY ret = to + 2
+i = 3, j = 3, k = 1: from = Sou\x00XXXXXX to = SouYYYYYYY ret = to + 2
+i = 3, j = 3, k = 2: from = Sou\x00XXXXXX to = SouYYYYYYY ret = to + 2
+i = 3, j = 3, k = 3: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 2
+i = 3, j = 3, k = 4: from = Sou\x00XXXXXX to = Sout\x00YYYYY ret = to + 2
+i = 3, j = 3, k = 5: from = Sou\x00XXXXXX to = Souti\x00YYYY ret = to + 2
+i = 3, j = 3, k = 6: from = Sou\x00XXXXXX to = Soutin\x00YYY ret = to + 2
+i = 3, j = 3, k = 7: from = Sou\x00XXXXXX to = Soutina\x00YY ret = to + 2
+i = 3, j = 3, k = 8: from = Sou\x00XXXXXX to = Soutinat\x00Y ret = to + 2
+i = 3, j = 3, k = 9: from = Sou\x00XXXXXX to = Soutinati\x00 ret = to + 2
+i = 3, j = 4, k = 0: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 4, k = 1: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 4, k = 2: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 4, k = 3: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 4, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 3
+i = 3, j = 4, k = 5: from = Sou\x00XXXXXX to = Sou\x00i\x00YYYY ret = to + 3
+i = 3, j = 4, k = 6: from = Sou\x00XXXXXX to = Sou\x00in\x00YYY ret = to + 3
+i = 3, j = 4, k = 7: from = Sou\x00XXXXXX to = Sou\x00ina\x00YY ret = to + 3
+i = 3, j = 4, k = 8: from = Sou\x00XXXXXX to = Sou\x00inat\x00Y ret = to + 3
+i = 3, j = 4, k = 9: from = Sou\x00XXXXXX to = Sou\x00inati\x00 ret = to + 3
+i = 3, j = 5, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 4
+i = 3, j = 5, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 4
+i = 3, j = 5, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 4
+i = 3, j = 5, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 4
+i = 3, j = 5, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 4
+i = 3, j = 5, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 4
+i = 3, j = 5, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00n\x00YYY ret = to + 4
+i = 3, j = 5, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00na\x00YY ret = to + 4
+i = 3, j = 5, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00nat\x00Y ret = to + 4
+i = 3, j = 5, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00nati\x00 ret = to + 4
+i = 3, j = 6, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 5
+i = 3, j = 6, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 5
+i = 3, j = 6, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 5
+i = 3, j = 6, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 5
+i = 3, j = 6, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 5
+i = 3, j = 6, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 5
+i = 3, j = 6, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 5
+i = 3, j = 6, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00\x00a\x00YY ret = to + 5
+i = 3, j = 6, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00\x00at\x00Y ret = to + 5
+i = 3, j = 6, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00\x00ati\x00 ret = to + 5
+i = 3, j = 7, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 6
+i = 3, j = 7, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 6
+i = 3, j = 7, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 6
+i = 3, j = 7, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 6
+i = 3, j = 7, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 6
+i = 3, j = 7, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 6
+i = 3, j = 7, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 6
+i = 3, j = 7, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 6
+i = 3, j = 7, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00t\x00Y ret = to + 6
+i = 3, j = 7, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00ti\x00 ret = to + 6
+i = 3, j = 8, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 7
+i = 3, j = 8, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 7
+i = 3, j = 8, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 7
+i = 3, j = 8, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 7
+i = 3, j = 8, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 7
+i = 3, j = 8, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 7
+i = 3, j = 8, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 7
+i = 3, j = 8, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 7
+i = 3, j = 8, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 7
+i = 3, j = 8, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00i\x00 ret = to + 7
+i = 3, j = 9, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 8
+i = 3, j = 9, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00\x00 ret = to + 8
+i = 4, j = 0, k = 0: from = Sour\x00XXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 4, j = 0, k = 1: from = Sour\x00XXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 4, j = 0, k = 2: from = Sour\x00XXXXX to = De\x00YYYYYYY ret = to + 0
+i = 4, j = 0, k = 3: from = Sour\x00XXXXX to = Des\x00YYYYYY ret = to + 0
+i = 4, j = 0, k = 4: from = Sour\x00XXXXX to = Dest\x00YYYYY ret = to + 0
+i = 4, j = 0, k = 5: from = Sour\x00XXXXX to = Desti\x00YYYY ret = to + 0
+i = 4, j = 0, k = 6: from = Sour\x00XXXXX to = Destin\x00YYY ret = to + 0
+i = 4, j = 0, k = 7: from = Sour\x00XXXXX to = Destina\x00YY ret = to + 0
+i = 4, j = 0, k = 8: from = Sour\x00XXXXX to = Destinat\x00Y ret = to + 0
+i = 4, j = 0, k = 9: from = Sour\x00XXXXX to = Destinati\x00 ret = to + 0
+i = 4, j = 1, k = 0: from = Sour\x00XXXXX to = SYYYYYYYYY ret = to + 0
+i = 4, j = 1, k = 1: from = Sour\x00XXXXX to = S\x00YYYYYYYY ret = to + 0
+i = 4, j = 1, k = 2: from = Sour\x00XXXXX to = Se\x00YYYYYYY ret = to + 0
+i = 4, j = 1, k = 3: from = Sour\x00XXXXX to = Ses\x00YYYYYY ret = to + 0
+i = 4, j = 1, k = 4: from = Sour\x00XXXXX to = Sest\x00YYYYY ret = to + 0
+i = 4, j = 1, k = 5: from = Sour\x00XXXXX to = Sesti\x00YYYY ret = to + 0
+i = 4, j = 1, k = 6: from = Sour\x00XXXXX to = Sestin\x00YYY ret = to + 0
+i = 4, j = 1, k = 7: from = Sour\x00XXXXX to = Sestina\x00YY ret = to + 0
+i = 4, j = 1, k = 8: from = Sour\x00XXXXX to = Sestinat\x00Y ret = to + 0
+i = 4, j = 1, k = 9: from = Sour\x00XXXXX to = Sestinati\x00 ret = to + 0
+i = 4, j = 2, k = 0: from = Sour\x00XXXXX to = SoYYYYYYYY ret = to + 1
+i = 4, j = 2, k = 1: from = Sour\x00XXXXX to = SoYYYYYYYY ret = to + 1
+i = 4, j = 2, k = 2: from = Sour\x00XXXXX to = So\x00YYYYYYY ret = to + 1
+i = 4, j = 2, k = 3: from = Sour\x00XXXXX to = Sos\x00YYYYYY ret = to + 1
+i = 4, j = 2, k = 4: from = Sour\x00XXXXX to = Sost\x00YYYYY ret = to + 1
+i = 4, j = 2, k = 5: from = Sour\x00XXXXX to = Sosti\x00YYYY ret = to + 1
+i = 4, j = 2, k = 6: from = Sour\x00XXXXX to = Sostin\x00YYY ret = to + 1
+i = 4, j = 2, k = 7: from = Sour\x00XXXXX to = Sostina\x00YY ret = to + 1
+i = 4, j = 2, k = 8: from = Sour\x00XXXXX to = Sostinat\x00Y ret = to + 1
+i = 4, j = 2, k = 9: from = Sour\x00XXXXX to = Sostinati\x00 ret = to + 1
+i = 4, j = 3, k = 0: from = Sour\x00XXXXX to = SouYYYYYYY ret = to + 2
+i = 4, j = 3, k = 1: from = Sour\x00XXXXX to = SouYYYYYYY ret = to + 2
+i = 4, j = 3, k = 2: from = Sour\x00XXXXX to = SouYYYYYYY ret = to + 2
+i = 4, j = 3, k = 3: from = Sour\x00XXXXX to = Sou\x00YYYYYY ret = to + 2
+i = 4, j = 3, k = 4: from = Sour\x00XXXXX to = Sout\x00YYYYY ret = to + 2
+i = 4, j = 3, k = 5: from = Sour\x00XXXXX to = Souti\x00YYYY ret = to + 2
+i = 4, j = 3, k = 6: from = Sour\x00XXXXX to = Soutin\x00YYY ret = to + 2
+i = 4, j = 3, k = 7: from = Sour\x00XXXXX to = Soutina\x00YY ret = to + 2
+i = 4, j = 3, k = 8: from = Sour\x00XXXXX to = Soutinat\x00Y ret = to + 2
+i = 4, j = 3, k = 9: from = Sour\x00XXXXX to = Soutinati\x00 ret = to + 2
+i = 4, j = 4, k = 0: from = Sour\x00XXXXX to = SourYYYYYY ret = to + 3
+i = 4, j = 4, k = 1: from = Sour\x00XXXXX to = SourYYYYYY ret = to + 3
+i = 4, j = 4, k = 2: from = Sour\x00XXXXX to = SourYYYYYY ret = to + 3
+i = 4, j = 4, k = 3: from = Sour\x00XXXXX to = SourYYYYYY ret = to + 3
+i = 4, j = 4, k = 4: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 3
+i = 4, j = 4, k = 5: from = Sour\x00XXXXX to = Souri\x00YYYY ret = to + 3
+i = 4, j = 4, k = 6: from = Sour\x00XXXXX to = Sourin\x00YYY ret = to + 3
+i = 4, j = 4, k = 7: from = Sour\x00XXXXX to = Sourina\x00YY ret = to + 3
+i = 4, j = 4, k = 8: from = Sour\x00XXXXX to = Sourinat\x00Y ret = to + 3
+i = 4, j = 4, k = 9: from = Sour\x00XXXXX to = Sourinati\x00 ret = to + 3
+i = 4, j = 5, k = 0: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 1: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 2: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 3: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 4: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 4
+i = 4, j = 5, k = 6: from = Sour\x00XXXXX to = Sour\x00n\x00YYY ret = to + 4
+i = 4, j = 5, k = 7: from = Sour\x00XXXXX to = Sour\x00na\x00YY ret = to + 4
+i = 4, j = 5, k = 8: from = Sour\x00XXXXX to = Sour\x00nat\x00Y ret = to + 4
+i = 4, j = 5, k = 9: from = Sour\x00XXXXX to = Sour\x00nati\x00 ret = to + 4
+i = 4, j = 6, k = 0: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 5
+i = 4, j = 6, k = 1: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 5
+i = 4, j = 6, k = 2: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 5
+i = 4, j = 6, k = 3: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 5
+i = 4, j = 6, k = 4: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 5
+i = 4, j = 6, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 5
+i = 4, j = 6, k = 6: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 5
+i = 4, j = 6, k = 7: from = Sour\x00XXXXX to = Sour\x00\x00a\x00YY ret = to + 5
+i = 4, j = 6, k = 8: from = Sour\x00XXXXX to = Sour\x00\x00at\x00Y ret = to + 5
+i = 4, j = 6, k = 9: from = Sour\x00XXXXX to = Sour\x00\x00ati\x00 ret = to + 5
+i = 4, j = 7, k = 0: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 6
+i = 4, j = 7, k = 1: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 6
+i = 4, j = 7, k = 2: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 6
+i = 4, j = 7, k = 3: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 6
+i = 4, j = 7, k = 4: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 6
+i = 4, j = 7, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 6
+i = 4, j = 7, k = 6: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 6
+i = 4, j = 7, k = 7: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 6
+i = 4, j = 7, k = 8: from = Sour\x00XXXXX to = Sour\x00\x00\x00t\x00Y ret = to + 6
+i = 4, j = 7, k = 9: from = Sour\x00XXXXX to = Sour\x00\x00\x00ti\x00 ret = to + 6
+i = 4, j = 8, k = 0: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 7
+i = 4, j = 8, k = 1: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 7
+i = 4, j = 8, k = 2: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 7
+i = 4, j = 8, k = 3: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 7
+i = 4, j = 8, k = 4: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 7
+i = 4, j = 8, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 7
+i = 4, j = 8, k = 6: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 7
+i = 4, j = 8, k = 7: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 7
+i = 4, j = 8, k = 8: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 7
+i = 4, j = 8, k = 9: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00i\x00 ret = to + 7
+i = 4, j = 9, k = 0: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 1: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 2: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 3: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 4: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 6: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 7: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 8: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 8
+i = 4, j = 9, k = 9: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00\x00 ret = to + 8
+i = 5, j = 0, k = 0: from = Sourc\x00XXXX to = \x00YYYYYYYYY ret = to + 0
+i = 5, j = 0, k = 1: from = Sourc\x00XXXX to = D\x00YYYYYYYY ret = to + 0
+i = 5, j = 0, k = 2: from = Sourc\x00XXXX to = De\x00YYYYYYY ret = to + 0
+i = 5, j = 0, k = 3: from = Sourc\x00XXXX to = Des\x00YYYYYY ret = to + 0
+i = 5, j = 0, k = 4: from = Sourc\x00XXXX to = Dest\x00YYYYY ret = to + 0
+i = 5, j = 0, k = 5: from = Sourc\x00XXXX to = Desti\x00YYYY ret = to + 0
+i = 5, j = 0, k = 6: from = Sourc\x00XXXX to = Destin\x00YYY ret = to + 0
+i = 5, j = 0, k = 7: from = Sourc\x00XXXX to = Destina\x00YY ret = to + 0
+i = 5, j = 0, k = 8: from = Sourc\x00XXXX to = Destinat\x00Y ret = to + 0
+i = 5, j = 0, k = 9: from = Sourc\x00XXXX to = Destinati\x00 ret = to + 0
+i = 5, j = 1, k = 0: from = Sourc\x00XXXX to = SYYYYYYYYY ret = to + 0
+i = 5, j = 1, k = 1: from = Sourc\x00XXXX to = S\x00YYYYYYYY ret = to + 0
+i = 5, j = 1, k = 2: from = Sourc\x00XXXX to = Se\x00YYYYYYY ret = to + 0
+i = 5, j = 1, k = 3: from = Sourc\x00XXXX to = Ses\x00YYYYYY ret = to + 0
+i = 5, j = 1, k = 4: from = Sourc\x00XXXX to = Sest\x00YYYYY ret = to + 0
+i = 5, j = 1, k = 5: from = Sourc\x00XXXX to = Sesti\x00YYYY ret = to + 0
+i = 5, j = 1, k = 6: from = Sourc\x00XXXX to = Sestin\x00YYY ret = to + 0
+i = 5, j = 1, k = 7: from = Sourc\x00XXXX to = Sestina\x00YY ret = to + 0
+i = 5, j = 1, k = 8: from = Sourc\x00XXXX to = Sestinat\x00Y ret = to + 0
+i = 5, j = 1, k = 9: from = Sourc\x00XXXX to = Sestinati\x00 ret = to + 0
+i = 5, j = 2, k = 0: from = Sourc\x00XXXX to = SoYYYYYYYY ret = to + 1
+i = 5, j = 2, k = 1: from = Sourc\x00XXXX to = SoYYYYYYYY ret = to + 1
+i = 5, j = 2, k = 2: from = Sourc\x00XXXX to = So\x00YYYYYYY ret = to + 1
+i = 5, j = 2, k = 3: from = Sourc\x00XXXX to = Sos\x00YYYYYY ret = to + 1
+i = 5, j = 2, k = 4: from = Sourc\x00XXXX to = Sost\x00YYYYY ret = to + 1
+i = 5, j = 2, k = 5: from = Sourc\x00XXXX to = Sosti\x00YYYY ret = to + 1
+i = 5, j = 2, k = 6: from = Sourc\x00XXXX to = Sostin\x00YYY ret = to + 1
+i = 5, j = 2, k = 7: from = Sourc\x00XXXX to = Sostina\x00YY ret = to + 1
+i = 5, j = 2, k = 8: from = Sourc\x00XXXX to = Sostinat\x00Y ret = to + 1
+i = 5, j = 2, k = 9: from = Sourc\x00XXXX to = Sostinati\x00 ret = to + 1
+i = 5, j = 3, k = 0: from = Sourc\x00XXXX to = SouYYYYYYY ret = to + 2
+i = 5, j = 3, k = 1: from = Sourc\x00XXXX to = SouYYYYYYY ret = to + 2
+i = 5, j = 3, k = 2: from = Sourc\x00XXXX to = SouYYYYYYY ret = to + 2
+i = 5, j = 3, k = 3: from = Sourc\x00XXXX to = Sou\x00YYYYYY ret = to + 2
+i = 5, j = 3, k = 4: from = Sourc\x00XXXX to = Sout\x00YYYYY ret = to + 2
+i = 5, j = 3, k = 5: from = Sourc\x00XXXX to = Souti\x00YYYY ret = to + 2
+i = 5, j = 3, k = 6: from = Sourc\x00XXXX to = Soutin\x00YYY ret = to + 2
+i = 5, j = 3, k = 7: from = Sourc\x00XXXX to = Soutina\x00YY ret = to + 2
+i = 5, j = 3, k = 8: from = Sourc\x00XXXX to = Soutinat\x00Y ret = to + 2
+i = 5, j = 3, k = 9: from = Sourc\x00XXXX to = Soutinati\x00 ret = to + 2
+i = 5, j = 4, k = 0: from = Sourc\x00XXXX to = SourYYYYYY ret = to + 3
+i = 5, j = 4, k = 1: from = Sourc\x00XXXX to = SourYYYYYY ret = to + 3
+i = 5, j = 4, k = 2: from = Sourc\x00XXXX to = SourYYYYYY ret = to + 3
+i = 5, j = 4, k = 3: from = Sourc\x00XXXX to = SourYYYYYY ret = to + 3
+i = 5, j = 4, k = 4: from = Sourc\x00XXXX to = Sour\x00YYYYY ret = to + 3
+i = 5, j = 4, k = 5: from = Sourc\x00XXXX to = Souri\x00YYYY ret = to + 3
+i = 5, j = 4, k = 6: from = Sourc\x00XXXX to = Sourin\x00YYY ret = to + 3
+i = 5, j = 4, k = 7: from = Sourc\x00XXXX to = Sourina\x00YY ret = to + 3
+i = 5, j = 4, k = 8: from = Sourc\x00XXXX to = Sourinat\x00Y ret = to + 3
+i = 5, j = 4, k = 9: from = Sourc\x00XXXX to = Sourinati\x00 ret = to + 3
+i = 5, j = 5, k = 0: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 4
+i = 5, j = 5, k = 1: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 4
+i = 5, j = 5, k = 2: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 4
+i = 5, j = 5, k = 3: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 4
+i = 5, j = 5, k = 4: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 4
+i = 5, j = 5, k = 5: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 4
+i = 5, j = 5, k = 6: from = Sourc\x00XXXX to = Sourcn\x00YYY ret = to + 4
+i = 5, j = 5, k = 7: from = Sourc\x00XXXX to = Sourcna\x00YY ret = to + 4
+i = 5, j = 5, k = 8: from = Sourc\x00XXXX to = Sourcnat\x00Y ret = to + 4
+i = 5, j = 5, k = 9: from = Sourc\x00XXXX to = Sourcnati\x00 ret = to + 4
+i = 5, j = 6, k = 0: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 1: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 2: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 3: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 4: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 5: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 6: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 6, k = 7: from = Sourc\x00XXXX to = Sourc\x00a\x00YY ret = to + 5
+i = 5, j = 6, k = 8: from = Sourc\x00XXXX to = Sourc\x00at\x00Y ret = to + 5
+i = 5, j = 6, k = 9: from = Sourc\x00XXXX to = Sourc\x00ati\x00 ret = to + 5
+i = 5, j = 7, k = 0: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 6
+i = 5, j = 7, k = 1: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 6
+i = 5, j = 7, k = 2: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 6
+i = 5, j = 7, k = 3: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 6
+i = 5, j = 7, k = 4: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 6
+i = 5, j = 7, k = 5: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 6
+i = 5, j = 7, k = 6: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 6
+i = 5, j = 7, k = 7: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 6
+i = 5, j = 7, k = 8: from = Sourc\x00XXXX to = Sourc\x00\x00t\x00Y ret = to + 6
+i = 5, j = 7, k = 9: from = Sourc\x00XXXX to = Sourc\x00\x00ti\x00 ret = to + 6
+i = 5, j = 8, k = 0: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 7
+i = 5, j = 8, k = 1: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 7
+i = 5, j = 8, k = 2: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 7
+i = 5, j = 8, k = 3: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 7
+i = 5, j = 8, k = 4: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 7
+i = 5, j = 8, k = 5: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 7
+i = 5, j = 8, k = 6: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 7
+i = 5, j = 8, k = 7: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 7
+i = 5, j = 8, k = 8: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 7
+i = 5, j = 8, k = 9: from = Sourc\x00XXXX to = Sourc\x00\x00\x00i\x00 ret = to + 7
+i = 5, j = 9, k = 0: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 1: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 2: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 3: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 4: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 5: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 6: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 7: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 8: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 8
+i = 5, j = 9, k = 9: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00\x00 ret = to + 8
+i = 6, j = 0, k = 0: from = Source\x00XXX to = \x00YYYYYYYYY ret = to + 0
+i = 6, j = 0, k = 1: from = Source\x00XXX to = D\x00YYYYYYYY ret = to + 0
+i = 6, j = 0, k = 2: from = Source\x00XXX to = De\x00YYYYYYY ret = to + 0
+i = 6, j = 0, k = 3: from = Source\x00XXX to = Des\x00YYYYYY ret = to + 0
+i = 6, j = 0, k = 4: from = Source\x00XXX to = Dest\x00YYYYY ret = to + 0
+i = 6, j = 0, k = 5: from = Source\x00XXX to = Desti\x00YYYY ret = to + 0
+i = 6, j = 0, k = 6: from = Source\x00XXX to = Destin\x00YYY ret = to + 0
+i = 6, j = 0, k = 7: from = Source\x00XXX to = Destina\x00YY ret = to + 0
+i = 6, j = 0, k = 8: from = Source\x00XXX to = Destinat\x00Y ret = to + 0
+i = 6, j = 0, k = 9: from = Source\x00XXX to = Destinati\x00 ret = to + 0
+i = 6, j = 1, k = 0: from = Source\x00XXX to = SYYYYYYYYY ret = to + 0
+i = 6, j = 1, k = 1: from = Source\x00XXX to = S\x00YYYYYYYY ret = to + 0
+i = 6, j = 1, k = 2: from = Source\x00XXX to = Se\x00YYYYYYY ret = to + 0
+i = 6, j = 1, k = 3: from = Source\x00XXX to = Ses\x00YYYYYY ret = to + 0
+i = 6, j = 1, k = 4: from = Source\x00XXX to = Sest\x00YYYYY ret = to + 0
+i = 6, j = 1, k = 5: from = Source\x00XXX to = Sesti\x00YYYY ret = to + 0
+i = 6, j = 1, k = 6: from = Source\x00XXX to = Sestin\x00YYY ret = to + 0
+i = 6, j = 1, k = 7: from = Source\x00XXX to = Sestina\x00YY ret = to + 0
+i = 6, j = 1, k = 8: from = Source\x00XXX to = Sestinat\x00Y ret = to + 0
+i = 6, j = 1, k = 9: from = Source\x00XXX to = Sestinati\x00 ret = to + 0
+i = 6, j = 2, k = 0: from = Source\x00XXX to = SoYYYYYYYY ret = to + 1
+i = 6, j = 2, k = 1: from = Source\x00XXX to = SoYYYYYYYY ret = to + 1
+i = 6, j = 2, k = 2: from = Source\x00XXX to = So\x00YYYYYYY ret = to + 1
+i = 6, j = 2, k = 3: from = Source\x00XXX to = Sos\x00YYYYYY ret = to + 1
+i = 6, j = 2, k = 4: from = Source\x00XXX to = Sost\x00YYYYY ret = to + 1
+i = 6, j = 2, k = 5: from = Source\x00XXX to = Sosti\x00YYYY ret = to + 1
+i = 6, j = 2, k = 6: from = Source\x00XXX to = Sostin\x00YYY ret = to + 1
+i = 6, j = 2, k = 7: from = Source\x00XXX to = Sostina\x00YY ret = to + 1
+i = 6, j = 2, k = 8: from = Source\x00XXX to = Sostinat\x00Y ret = to + 1
+i = 6, j = 2, k = 9: from = Source\x00XXX to = Sostinati\x00 ret = to + 1
+i = 6, j = 3, k = 0: from = Source\x00XXX to = SouYYYYYYY ret = to + 2
+i = 6, j = 3, k = 1: from = Source\x00XXX to = SouYYYYYYY ret = to + 2
+i = 6, j = 3, k = 2: from = Source\x00XXX to = SouYYYYYYY ret = to + 2
+i = 6, j = 3, k = 3: from = Source\x00XXX to = Sou\x00YYYYYY ret = to + 2
+i = 6, j = 3, k = 4: from = Source\x00XXX to = Sout\x00YYYYY ret = to + 2
+i = 6, j = 3, k = 5: from = Source\x00XXX to = Souti\x00YYYY ret = to + 2
+i = 6, j = 3, k = 6: from = Source\x00XXX to = Soutin\x00YYY ret = to + 2
+i = 6, j = 3, k = 7: from = Source\x00XXX to = Soutina\x00YY ret = to + 2
+i = 6, j = 3, k = 8: from = Source\x00XXX to = Soutinat\x00Y ret = to + 2
+i = 6, j = 3, k = 9: from = Source\x00XXX to = Soutinati\x00 ret = to + 2
+i = 6, j = 4, k = 0: from = Source\x00XXX to = SourYYYYYY ret = to + 3
+i = 6, j = 4, k = 1: from = Source\x00XXX to = SourYYYYYY ret = to + 3
+i = 6, j = 4, k = 2: from = Source\x00XXX to = SourYYYYYY ret = to + 3
+i = 6, j = 4, k = 3: from = Source\x00XXX to = SourYYYYYY ret = to + 3
+i = 6, j = 4, k = 4: from = Source\x00XXX to = Sour\x00YYYYY ret = to + 3
+i = 6, j = 4, k = 5: from = Source\x00XXX to = Souri\x00YYYY ret = to + 3
+i = 6, j = 4, k = 6: from = Source\x00XXX to = Sourin\x00YYY ret = to + 3
+i = 6, j = 4, k = 7: from = Source\x00XXX to = Sourina\x00YY ret = to + 3
+i = 6, j = 4, k = 8: from = Source\x00XXX to = Sourinat\x00Y ret = to + 3
+i = 6, j = 4, k = 9: from = Source\x00XXX to = Sourinati\x00 ret = to + 3
+i = 6, j = 5, k = 0: from = Source\x00XXX to = SourcYYYYY ret = to + 4
+i = 6, j = 5, k = 1: from = Source\x00XXX to = SourcYYYYY ret = to + 4
+i = 6, j = 5, k = 2: from = Source\x00XXX to = SourcYYYYY ret = to + 4
+i = 6, j = 5, k = 3: from = Source\x00XXX to = SourcYYYYY ret = to + 4
+i = 6, j = 5, k = 4: from = Source\x00XXX to = SourcYYYYY ret = to + 4
+i = 6, j = 5, k = 5: from = Source\x00XXX to = Sourc\x00YYYY ret = to + 4
+i = 6, j = 5, k = 6: from = Source\x00XXX to = Sourcn\x00YYY ret = to + 4
+i = 6, j = 5, k = 7: from = Source\x00XXX to = Sourcna\x00YY ret = to + 4
+i = 6, j = 5, k = 8: from = Source\x00XXX to = Sourcnat\x00Y ret = to + 4
+i = 6, j = 5, k = 9: from = Source\x00XXX to = Sourcnati\x00 ret = to + 4
+i = 6, j = 6, k = 0: from = Source\x00XXX to = SourceYYYY ret = to + 5
+i = 6, j = 6, k = 1: from = Source\x00XXX to = SourceYYYY ret = to + 5
+i = 6, j = 6, k = 2: from = Source\x00XXX to = SourceYYYY ret = to + 5
+i = 6, j = 6, k = 3: from = Source\x00XXX to = SourceYYYY ret = to + 5
+i = 6, j = 6, k = 4: from = Source\x00XXX to = SourceYYYY ret = to + 5
+i = 6, j = 6, k = 5: from = Source\x00XXX to = SourceYYYY ret = to + 5
+i = 6, j = 6, k = 6: from = Source\x00XXX to = Source\x00YYY ret = to + 5
+i = 6, j = 6, k = 7: from = Source\x00XXX to = Sourcea\x00YY ret = to + 5
+i = 6, j = 6, k = 8: from = Source\x00XXX to = Sourceat\x00Y ret = to + 5
+i = 6, j = 6, k = 9: from = Source\x00XXX to = Sourceati\x00 ret = to + 5
+i = 6, j = 7, k = 0: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 1: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 2: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 3: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 4: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 5: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 6: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 7: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 7, k = 8: from = Source\x00XXX to = Source\x00t\x00Y ret = to + 6
+i = 6, j = 7, k = 9: from = Source\x00XXX to = Source\x00ti\x00 ret = to + 6
+i = 6, j = 8, k = 0: from = Source\x00XXX to = Source\x00\x00YY ret = to + 7
+i = 6, j = 8, k = 1: from = Source\x00XXX to = Source\x00\x00YY ret = to + 7
+i = 6, j = 8, k = 2: from = Source\x00XXX to = Source\x00\x00YY ret = to + 7
+i = 6, j = 8, k = 3: from = Source\x00XXX to = Source\x00\x00YY ret = to + 7
+i = 6, j = 8, k = 4: from = Source\x00XXX to = Source\x00\x00YY ret = to + 7
+i = 6, j = 8, k = 5: from = Source\x00XXX to = Source\x00\x00YY ret = to + 7
+i = 6, j = 8, k = 6: from = Source\x00XXX to = Source\x00\x00YY ret = to + 7
+i = 6, j = 8, k = 7: from = Source\x00XXX to = Source\x00\x00YY ret = to + 7
+i = 6, j = 8, k = 8: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 7
+i = 6, j = 8, k = 9: from = Source\x00XXX to = Source\x00\x00i\x00 ret = to + 7
+i = 6, j = 9, k = 0: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 1: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 2: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 3: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 4: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 5: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 6: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 7: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 8: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 8
+i = 6, j = 9, k = 9: from = Source\x00XXX to = Source\x00\x00\x00\x00 ret = to + 8
+i = 7, j = 0, k = 0: from = SourceS\x00XX to = \x00YYYYYYYYY ret = to + 0
+i = 7, j = 0, k = 1: from = SourceS\x00XX to = D\x00YYYYYYYY ret = to + 0
+i = 7, j = 0, k = 2: from = SourceS\x00XX to = De\x00YYYYYYY ret = to + 0
+i = 7, j = 0, k = 3: from = SourceS\x00XX to = Des\x00YYYYYY ret = to + 0
+i = 7, j = 0, k = 4: from = SourceS\x00XX to = Dest\x00YYYYY ret = to + 0
+i = 7, j = 0, k = 5: from = SourceS\x00XX to = Desti\x00YYYY ret = to + 0
+i = 7, j = 0, k = 6: from = SourceS\x00XX to = Destin\x00YYY ret = to + 0
+i = 7, j = 0, k = 7: from = SourceS\x00XX to = Destina\x00YY ret = to + 0
+i = 7, j = 0, k = 8: from = SourceS\x00XX to = Destinat\x00Y ret = to + 0
+i = 7, j = 0, k = 9: from = SourceS\x00XX to = Destinati\x00 ret = to + 0
+i = 7, j = 1, k = 0: from = SourceS\x00XX to = SYYYYYYYYY ret = to + 0
+i = 7, j = 1, k = 1: from = SourceS\x00XX to = S\x00YYYYYYYY ret = to + 0
+i = 7, j = 1, k = 2: from = SourceS\x00XX to = Se\x00YYYYYYY ret = to + 0
+i = 7, j = 1, k = 3: from = SourceS\x00XX to = Ses\x00YYYYYY ret = to + 0
+i = 7, j = 1, k = 4: from = SourceS\x00XX to = Sest\x00YYYYY ret = to + 0
+i = 7, j = 1, k = 5: from = SourceS\x00XX to = Sesti\x00YYYY ret = to + 0
+i = 7, j = 1, k = 6: from = SourceS\x00XX to = Sestin\x00YYY ret = to + 0
+i = 7, j = 1, k = 7: from = SourceS\x00XX to = Sestina\x00YY ret = to + 0
+i = 7, j = 1, k = 8: from = SourceS\x00XX to = Sestinat\x00Y ret = to + 0
+i = 7, j = 1, k = 9: from = SourceS\x00XX to = Sestinati\x00 ret = to + 0
+i = 7, j = 2, k = 0: from = SourceS\x00XX to = SoYYYYYYYY ret = to + 1
+i = 7, j = 2, k = 1: from = SourceS\x00XX to = SoYYYYYYYY ret = to + 1
+i = 7, j = 2, k = 2: from = SourceS\x00XX to = So\x00YYYYYYY ret = to + 1
+i = 7, j = 2, k = 3: from = SourceS\x00XX to = Sos\x00YYYYYY ret = to + 1
+i = 7, j = 2, k = 4: from = SourceS\x00XX to = Sost\x00YYYYY ret = to + 1
+i = 7, j = 2, k = 5: from = SourceS\x00XX to = Sosti\x00YYYY ret = to + 1
+i = 7, j = 2, k = 6: from = SourceS\x00XX to = Sostin\x00YYY ret = to + 1
+i = 7, j = 2, k = 7: from = SourceS\x00XX to = Sostina\x00YY ret = to + 1
+i = 7, j = 2, k = 8: from = SourceS\x00XX to = Sostinat\x00Y ret = to + 1
+i = 7, j = 2, k = 9: from = SourceS\x00XX to = Sostinati\x00 ret = to + 1
+i = 7, j = 3, k = 0: from = SourceS\x00XX to = SouYYYYYYY ret = to + 2
+i = 7, j = 3, k = 1: from = SourceS\x00XX to = SouYYYYYYY ret = to + 2
+i = 7, j = 3, k = 2: from = SourceS\x00XX to = SouYYYYYYY ret = to + 2
+i = 7, j = 3, k = 3: from = SourceS\x00XX to = Sou\x00YYYYYY ret = to + 2
+i = 7, j = 3, k = 4: from = SourceS\x00XX to = Sout\x00YYYYY ret = to + 2
+i = 7, j = 3, k = 5: from = SourceS\x00XX to = Souti\x00YYYY ret = to + 2
+i = 7, j = 3, k = 6: from = SourceS\x00XX to = Soutin\x00YYY ret = to + 2
+i = 7, j = 3, k = 7: from = SourceS\x00XX to = Soutina\x00YY ret = to + 2
+i = 7, j = 3, k = 8: from = SourceS\x00XX to = Soutinat\x00Y ret = to + 2
+i = 7, j = 3, k = 9: from = SourceS\x00XX to = Soutinati\x00 ret = to + 2
+i = 7, j = 4, k = 0: from = SourceS\x00XX to = SourYYYYYY ret = to + 3
+i = 7, j = 4, k = 1: from = SourceS\x00XX to = SourYYYYYY ret = to + 3
+i = 7, j = 4, k = 2: from = SourceS\x00XX to = SourYYYYYY ret = to + 3
+i = 7, j = 4, k = 3: from = SourceS\x00XX to = SourYYYYYY ret = to + 3
+i = 7, j = 4, k = 4: from = SourceS\x00XX to = Sour\x00YYYYY ret = to + 3
+i = 7, j = 4, k = 5: from = SourceS\x00XX to = Souri\x00YYYY ret = to + 3
+i = 7, j = 4, k = 6: from = SourceS\x00XX to = Sourin\x00YYY ret = to + 3
+i = 7, j = 4, k = 7: from = SourceS\x00XX to = Sourina\x00YY ret = to + 3
+i = 7, j = 4, k = 8: from = SourceS\x00XX to = Sourinat\x00Y ret = to + 3
+i = 7, j = 4, k = 9: from = SourceS\x00XX to = Sourinati\x00 ret = to + 3
+i = 7, j = 5, k = 0: from = SourceS\x00XX to = SourcYYYYY ret = to + 4
+i = 7, j = 5, k = 1: from = SourceS\x00XX to = SourcYYYYY ret = to + 4
+i = 7, j = 5, k = 2: from = SourceS\x00XX to = SourcYYYYY ret = to + 4
+i = 7, j = 5, k = 3: from = SourceS\x00XX to = SourcYYYYY ret = to + 4
+i = 7, j = 5, k = 4: from = SourceS\x00XX to = SourcYYYYY ret = to + 4
+i = 7, j = 5, k = 5: from = SourceS\x00XX to = Sourc\x00YYYY ret = to + 4
+i = 7, j = 5, k = 6: from = SourceS\x00XX to = Sourcn\x00YYY ret = to + 4
+i = 7, j = 5, k = 7: from = SourceS\x00XX to = Sourcna\x00YY ret = to + 4
+i = 7, j = 5, k = 8: from = SourceS\x00XX to = Sourcnat\x00Y ret = to + 4
+i = 7, j = 5, k = 9: from = SourceS\x00XX to = Sourcnati\x00 ret = to + 4
+i = 7, j = 6, k = 0: from = SourceS\x00XX to = SourceYYYY ret = to + 5
+i = 7, j = 6, k = 1: from = SourceS\x00XX to = SourceYYYY ret = to + 5
+i = 7, j = 6, k = 2: from = SourceS\x00XX to = SourceYYYY ret = to + 5
+i = 7, j = 6, k = 3: from = SourceS\x00XX to = SourceYYYY ret = to + 5
+i = 7, j = 6, k = 4: from = SourceS\x00XX to = SourceYYYY ret = to + 5
+i = 7, j = 6, k = 5: from = SourceS\x00XX to = SourceYYYY ret = to + 5
+i = 7, j = 6, k = 6: from = SourceS\x00XX to = Source\x00YYY ret = to + 5
+i = 7, j = 6, k = 7: from = SourceS\x00XX to = Sourcea\x00YY ret = to + 5
+i = 7, j = 6, k = 8: from = SourceS\x00XX to = Sourceat\x00Y ret = to + 5
+i = 7, j = 6, k = 9: from = SourceS\x00XX to = Sourceati\x00 ret = to + 5
+i = 7, j = 7, k = 0: from = SourceS\x00XX to = SourceSYYY ret = to + 6
+i = 7, j = 7, k = 1: from = SourceS\x00XX to = SourceSYYY ret = to + 6
+i = 7, j = 7, k = 2: from = SourceS\x00XX to = SourceSYYY ret = to + 6
+i = 7, j = 7, k = 3: from = SourceS\x00XX to = SourceSYYY ret = to + 6
+i = 7, j = 7, k = 4: from = SourceS\x00XX to = SourceSYYY ret = to + 6
+i = 7, j = 7, k = 5: from = SourceS\x00XX to = SourceSYYY ret = to + 6
+i = 7, j = 7, k = 6: from = SourceS\x00XX to = SourceSYYY ret = to + 6
+i = 7, j = 7, k = 7: from = SourceS\x00XX to = SourceS\x00YY ret = to + 6
+i = 7, j = 7, k = 8: from = SourceS\x00XX to = SourceSt\x00Y ret = to + 6
+i = 7, j = 7, k = 9: from = SourceS\x00XX to = SourceSti\x00 ret = to + 6
+i = 7, j = 8, k = 0: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 1: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 2: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 3: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 4: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 5: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 6: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 7: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 8: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 8, k = 9: from = SourceS\x00XX to = SourceS\x00i\x00 ret = to + 7
+i = 7, j = 9, k = 0: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 1: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 2: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 3: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 4: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 5: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 6: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 7: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 8: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 8
+i = 7, j = 9, k = 9: from = SourceS\x00XX to = SourceS\x00\x00\x00 ret = to + 8
+i = 8, j = 0, k = 0: from = SourceSt\x00X to = \x00YYYYYYYYY ret = to + 0
+i = 8, j = 0, k = 1: from = SourceSt\x00X to = D\x00YYYYYYYY ret = to + 0
+i = 8, j = 0, k = 2: from = SourceSt\x00X to = De\x00YYYYYYY ret = to + 0
+i = 8, j = 0, k = 3: from = SourceSt\x00X to = Des\x00YYYYYY ret = to + 0
+i = 8, j = 0, k = 4: from = SourceSt\x00X to = Dest\x00YYYYY ret = to + 0
+i = 8, j = 0, k = 5: from = SourceSt\x00X to = Desti\x00YYYY ret = to + 0
+i = 8, j = 0, k = 6: from = SourceSt\x00X to = Destin\x00YYY ret = to + 0
+i = 8, j = 0, k = 7: from = SourceSt\x00X to = Destina\x00YY ret = to + 0
+i = 8, j = 0, k = 8: from = SourceSt\x00X to = Destinat\x00Y ret = to + 0
+i = 8, j = 0, k = 9: from = SourceSt\x00X to = Destinati\x00 ret = to + 0
+i = 8, j = 1, k = 0: from = SourceSt\x00X to = SYYYYYYYYY ret = to + 0
+i = 8, j = 1, k = 1: from = SourceSt\x00X to = S\x00YYYYYYYY ret = to + 0
+i = 8, j = 1, k = 2: from = SourceSt\x00X to = Se\x00YYYYYYY ret = to + 0
+i = 8, j = 1, k = 3: from = SourceSt\x00X to = Ses\x00YYYYYY ret = to + 0
+i = 8, j = 1, k = 4: from = SourceSt\x00X to = Sest\x00YYYYY ret = to + 0
+i = 8, j = 1, k = 5: from = SourceSt\x00X to = Sesti\x00YYYY ret = to + 0
+i = 8, j = 1, k = 6: from = SourceSt\x00X to = Sestin\x00YYY ret = to + 0
+i = 8, j = 1, k = 7: from = SourceSt\x00X to = Sestina\x00YY ret = to + 0
+i = 8, j = 1, k = 8: from = SourceSt\x00X to = Sestinat\x00Y ret = to + 0
+i = 8, j = 1, k = 9: from = SourceSt\x00X to = Sestinati\x00 ret = to + 0
+i = 8, j = 2, k = 0: from = SourceSt\x00X to = SoYYYYYYYY ret = to + 1
+i = 8, j = 2, k = 1: from = SourceSt\x00X to = SoYYYYYYYY ret = to + 1
+i = 8, j = 2, k = 2: from = SourceSt\x00X to = So\x00YYYYYYY ret = to + 1
+i = 8, j = 2, k = 3: from = SourceSt\x00X to = Sos\x00YYYYYY ret = to + 1
+i = 8, j = 2, k = 4: from = SourceSt\x00X to = Sost\x00YYYYY ret = to + 1
+i = 8, j = 2, k = 5: from = SourceSt\x00X to = Sosti\x00YYYY ret = to + 1
+i = 8, j = 2, k = 6: from = SourceSt\x00X to = Sostin\x00YYY ret = to + 1
+i = 8, j = 2, k = 7: from = SourceSt\x00X to = Sostina\x00YY ret = to + 1
+i = 8, j = 2, k = 8: from = SourceSt\x00X to = Sostinat\x00Y ret = to + 1
+i = 8, j = 2, k = 9: from = SourceSt\x00X to = Sostinati\x00 ret = to + 1
+i = 8, j = 3, k = 0: from = SourceSt\x00X to = SouYYYYYYY ret = to + 2
+i = 8, j = 3, k = 1: from = SourceSt\x00X to = SouYYYYYYY ret = to + 2
+i = 8, j = 3, k = 2: from = SourceSt\x00X to = SouYYYYYYY ret = to + 2
+i = 8, j = 3, k = 3: from = SourceSt\x00X to = Sou\x00YYYYYY ret = to + 2
+i = 8, j = 3, k = 4: from = SourceSt\x00X to = Sout\x00YYYYY ret = to + 2
+i = 8, j = 3, k = 5: from = SourceSt\x00X to = Souti\x00YYYY ret = to + 2
+i = 8, j = 3, k = 6: from = SourceSt\x00X to = Soutin\x00YYY ret = to + 2
+i = 8, j = 3, k = 7: from = SourceSt\x00X to = Soutina\x00YY ret = to + 2
+i = 8, j = 3, k = 8: from = SourceSt\x00X to = Soutinat\x00Y ret = to + 2
+i = 8, j = 3, k = 9: from = SourceSt\x00X to = Soutinati\x00 ret = to + 2
+i = 8, j = 4, k = 0: from = SourceSt\x00X to = SourYYYYYY ret = to + 3
+i = 8, j = 4, k = 1: from = SourceSt\x00X to = SourYYYYYY ret = to + 3
+i = 8, j = 4, k = 2: from = SourceSt\x00X to = SourYYYYYY ret = to + 3
+i = 8, j = 4, k = 3: from = SourceSt\x00X to = SourYYYYYY ret = to + 3
+i = 8, j = 4, k = 4: from = SourceSt\x00X to = Sour\x00YYYYY ret = to + 3
+i = 8, j = 4, k = 5: from = SourceSt\x00X to = Souri\x00YYYY ret = to + 3
+i = 8, j = 4, k = 6: from = SourceSt\x00X to = Sourin\x00YYY ret = to + 3
+i = 8, j = 4, k = 7: from = SourceSt\x00X to = Sourina\x00YY ret = to + 3
+i = 8, j = 4, k = 8: from = SourceSt\x00X to = Sourinat\x00Y ret = to + 3
+i = 8, j = 4, k = 9: from = SourceSt\x00X to = Sourinati\x00 ret = to + 3
+i = 8, j = 5, k = 0: from = SourceSt\x00X to = SourcYYYYY ret = to + 4
+i = 8, j = 5, k = 1: from = SourceSt\x00X to = SourcYYYYY ret = to + 4
+i = 8, j = 5, k = 2: from = SourceSt\x00X to = SourcYYYYY ret = to + 4
+i = 8, j = 5, k = 3: from = SourceSt\x00X to = SourcYYYYY ret = to + 4
+i = 8, j = 5, k = 4: from = SourceSt\x00X to = SourcYYYYY ret = to + 4
+i = 8, j = 5, k = 5: from = SourceSt\x00X to = Sourc\x00YYYY ret = to + 4
+i = 8, j = 5, k = 6: from = SourceSt\x00X to = Sourcn\x00YYY ret = to + 4
+i = 8, j = 5, k = 7: from = SourceSt\x00X to = Sourcna\x00YY ret = to + 4
+i = 8, j = 5, k = 8: from = SourceSt\x00X to = Sourcnat\x00Y ret = to + 4
+i = 8, j = 5, k = 9: from = SourceSt\x00X to = Sourcnati\x00 ret = to + 4
+i = 8, j = 6, k = 0: from = SourceSt\x00X to = SourceYYYY ret = to + 5
+i = 8, j = 6, k = 1: from = SourceSt\x00X to = SourceYYYY ret = to + 5
+i = 8, j = 6, k = 2: from = SourceSt\x00X to = SourceYYYY ret = to + 5
+i = 8, j = 6, k = 3: from = SourceSt\x00X to = SourceYYYY ret = to + 5
+i = 8, j = 6, k = 4: from = SourceSt\x00X to = SourceYYYY ret = to + 5
+i = 8, j = 6, k = 5: from = SourceSt\x00X to = SourceYYYY ret = to + 5
+i = 8, j = 6, k = 6: from = SourceSt\x00X to = Source\x00YYY ret = to + 5
+i = 8, j = 6, k = 7: from = SourceSt\x00X to = Sourcea\x00YY ret = to + 5
+i = 8, j = 6, k = 8: from = SourceSt\x00X to = Sourceat\x00Y ret = to + 5
+i = 8, j = 6, k = 9: from = SourceSt\x00X to = Sourceati\x00 ret = to + 5
+i = 8, j = 7, k = 0: from = SourceSt\x00X to = SourceSYYY ret = to + 6
+i = 8, j = 7, k = 1: from = SourceSt\x00X to = SourceSYYY ret = to + 6
+i = 8, j = 7, k = 2: from = SourceSt\x00X to = SourceSYYY ret = to + 6
+i = 8, j = 7, k = 3: from = SourceSt\x00X to = SourceSYYY ret = to + 6
+i = 8, j = 7, k = 4: from = SourceSt\x00X to = SourceSYYY ret = to + 6
+i = 8, j = 7, k = 5: from = SourceSt\x00X to = SourceSYYY ret = to + 6
+i = 8, j = 7, k = 6: from = SourceSt\x00X to = SourceSYYY ret = to + 6
+i = 8, j = 7, k = 7: from = SourceSt\x00X to = SourceS\x00YY ret = to + 6
+i = 8, j = 7, k = 8: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 6
+i = 8, j = 7, k = 9: from = SourceSt\x00X to = SourceSti\x00 ret = to + 6
+i = 8, j = 8, k = 0: from = SourceSt\x00X to = SourceStYY ret = to + 7
+i = 8, j = 8, k = 1: from = SourceSt\x00X to = SourceStYY ret = to + 7
+i = 8, j = 8, k = 2: from = SourceSt\x00X to = SourceStYY ret = to + 7
+i = 8, j = 8, k = 3: from = SourceSt\x00X to = SourceStYY ret = to + 7
+i = 8, j = 8, k = 4: from = SourceSt\x00X to = SourceStYY ret = to + 7
+i = 8, j = 8, k = 5: from = SourceSt\x00X to = SourceStYY ret = to + 7
+i = 8, j = 8, k = 6: from = SourceSt\x00X to = SourceStYY ret = to + 7
+i = 8, j = 8, k = 7: from = SourceSt\x00X to = SourceStYY ret = to + 7
+i = 8, j = 8, k = 8: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 7
+i = 8, j = 8, k = 9: from = SourceSt\x00X to = SourceSti\x00 ret = to + 7
+i = 8, j = 9, k = 0: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 1: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 2: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 3: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 4: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 5: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 6: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 7: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 8: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 9: from = SourceSt\x00X to = SourceSt\x00\x00 ret = to + 8
+i = 9, j = 0, k = 0: from = SourceStr\x00 to = \x00YYYYYYYYY ret = to + 0
+i = 9, j = 0, k = 1: from = SourceStr\x00 to = D\x00YYYYYYYY ret = to + 0
+i = 9, j = 0, k = 2: from = SourceStr\x00 to = De\x00YYYYYYY ret = to + 0
+i = 9, j = 0, k = 3: from = SourceStr\x00 to = Des\x00YYYYYY ret = to + 0
+i = 9, j = 0, k = 4: from = SourceStr\x00 to = Dest\x00YYYYY ret = to + 0
+i = 9, j = 0, k = 5: from = SourceStr\x00 to = Desti\x00YYYY ret = to + 0
+i = 9, j = 0, k = 6: from = SourceStr\x00 to = Destin\x00YYY ret = to + 0
+i = 9, j = 0, k = 7: from = SourceStr\x00 to = Destina\x00YY ret = to + 0
+i = 9, j = 0, k = 8: from = SourceStr\x00 to = Destinat\x00Y ret = to + 0
+i = 9, j = 0, k = 9: from = SourceStr\x00 to = Destinati\x00 ret = to + 0
+i = 9, j = 1, k = 0: from = SourceStr\x00 to = SYYYYYYYYY ret = to + 0
+i = 9, j = 1, k = 1: from = SourceStr\x00 to = S\x00YYYYYYYY ret = to + 0
+i = 9, j = 1, k = 2: from = SourceStr\x00 to = Se\x00YYYYYYY ret = to + 0
+i = 9, j = 1, k = 3: from = SourceStr\x00 to = Ses\x00YYYYYY ret = to + 0
+i = 9, j = 1, k = 4: from = SourceStr\x00 to = Sest\x00YYYYY ret = to + 0
+i = 9, j = 1, k = 5: from = SourceStr\x00 to = Sesti\x00YYYY ret = to + 0
+i = 9, j = 1, k = 6: from = SourceStr\x00 to = Sestin\x00YYY ret = to + 0
+i = 9, j = 1, k = 7: from = SourceStr\x00 to = Sestina\x00YY ret = to + 0
+i = 9, j = 1, k = 8: from = SourceStr\x00 to = Sestinat\x00Y ret = to + 0
+i = 9, j = 1, k = 9: from = SourceStr\x00 to = Sestinati\x00 ret = to + 0
+i = 9, j = 2, k = 0: from = SourceStr\x00 to = SoYYYYYYYY ret = to + 1
+i = 9, j = 2, k = 1: from = SourceStr\x00 to = SoYYYYYYYY ret = to + 1
+i = 9, j = 2, k = 2: from = SourceStr\x00 to = So\x00YYYYYYY ret = to + 1
+i = 9, j = 2, k = 3: from = SourceStr\x00 to = Sos\x00YYYYYY ret = to + 1
+i = 9, j = 2, k = 4: from = SourceStr\x00 to = Sost\x00YYYYY ret = to + 1
+i = 9, j = 2, k = 5: from = SourceStr\x00 to = Sosti\x00YYYY ret = to + 1
+i = 9, j = 2, k = 6: from = SourceStr\x00 to = Sostin\x00YYY ret = to + 1
+i = 9, j = 2, k = 7: from = SourceStr\x00 to = Sostina\x00YY ret = to + 1
+i = 9, j = 2, k = 8: from = SourceStr\x00 to = Sostinat\x00Y ret = to + 1
+i = 9, j = 2, k = 9: from = SourceStr\x00 to = Sostinati\x00 ret = to + 1
+i = 9, j = 3, k = 0: from = SourceStr\x00 to = SouYYYYYYY ret = to + 2
+i = 9, j = 3, k = 1: from = SourceStr\x00 to = SouYYYYYYY ret = to + 2
+i = 9, j = 3, k = 2: from = SourceStr\x00 to = SouYYYYYYY ret = to + 2
+i = 9, j = 3, k = 3: from = SourceStr\x00 to = Sou\x00YYYYYY ret = to + 2
+i = 9, j = 3, k = 4: from = SourceStr\x00 to = Sout\x00YYYYY ret = to + 2
+i = 9, j = 3, k = 5: from = SourceStr\x00 to = Souti\x00YYYY ret = to + 2
+i = 9, j = 3, k = 6: from = SourceStr\x00 to = Soutin\x00YYY ret = to + 2
+i = 9, j = 3, k = 7: from = SourceStr\x00 to = Soutina\x00YY ret = to + 2
+i = 9, j = 3, k = 8: from = SourceStr\x00 to = Soutinat\x00Y ret = to + 2
+i = 9, j = 3, k = 9: from = SourceStr\x00 to = Soutinati\x00 ret = to + 2
+i = 9, j = 4, k = 0: from = SourceStr\x00 to = SourYYYYYY ret = to + 3
+i = 9, j = 4, k = 1: from = SourceStr\x00 to = SourYYYYYY ret = to + 3
+i = 9, j = 4, k = 2: from = SourceStr\x00 to = SourYYYYYY ret = to + 3
+i = 9, j = 4, k = 3: from = SourceStr\x00 to = SourYYYYYY ret = to + 3
+i = 9, j = 4, k = 4: from = SourceStr\x00 to = Sour\x00YYYYY ret = to + 3
+i = 9, j = 4, k = 5: from = SourceStr\x00 to = Souri\x00YYYY ret = to + 3
+i = 9, j = 4, k = 6: from = SourceStr\x00 to = Sourin\x00YYY ret = to + 3
+i = 9, j = 4, k = 7: from = SourceStr\x00 to = Sourina\x00YY ret = to + 3
+i = 9, j = 4, k = 8: from = SourceStr\x00 to = Sourinat\x00Y ret = to + 3
+i = 9, j = 4, k = 9: from = SourceStr\x00 to = Sourinati\x00 ret = to + 3
+i = 9, j = 5, k = 0: from = SourceStr\x00 to = SourcYYYYY ret = to + 4
+i = 9, j = 5, k = 1: from = SourceStr\x00 to = SourcYYYYY ret = to + 4
+i = 9, j = 5, k = 2: from = SourceStr\x00 to = SourcYYYYY ret = to + 4
+i = 9, j = 5, k = 3: from = SourceStr\x00 to = SourcYYYYY ret = to + 4
+i = 9, j = 5, k = 4: from = SourceStr\x00 to = SourcYYYYY ret = to + 4
+i = 9, j = 5, k = 5: from = SourceStr\x00 to = Sourc\x00YYYY ret = to + 4
+i = 9, j = 5, k = 6: from = SourceStr\x00 to = Sourcn\x00YYY ret = to + 4
+i = 9, j = 5, k = 7: from = SourceStr\x00 to = Sourcna\x00YY ret = to + 4
+i = 9, j = 5, k = 8: from = SourceStr\x00 to = Sourcnat\x00Y ret = to + 4
+i = 9, j = 5, k = 9: from = SourceStr\x00 to = Sourcnati\x00 ret = to + 4
+i = 9, j = 6, k = 0: from = SourceStr\x00 to = SourceYYYY ret = to + 5
+i = 9, j = 6, k = 1: from = SourceStr\x00 to = SourceYYYY ret = to + 5
+i = 9, j = 6, k = 2: from = SourceStr\x00 to = SourceYYYY ret = to + 5
+i = 9, j = 6, k = 3: from = SourceStr\x00 to = SourceYYYY ret = to + 5
+i = 9, j = 6, k = 4: from = SourceStr\x00 to = SourceYYYY ret = to + 5
+i = 9, j = 6, k = 5: from = SourceStr\x00 to = SourceYYYY ret = to + 5
+i = 9, j = 6, k = 6: from = SourceStr\x00 to = Source\x00YYY ret = to + 5
+i = 9, j = 6, k = 7: from = SourceStr\x00 to = Sourcea\x00YY ret = to + 5
+i = 9, j = 6, k = 8: from = SourceStr\x00 to = Sourceat\x00Y ret = to + 5
+i = 9, j = 6, k = 9: from = SourceStr\x00 to = Sourceati\x00 ret = to + 5
+i = 9, j = 7, k = 0: from = SourceStr\x00 to = SourceSYYY ret = to + 6
+i = 9, j = 7, k = 1: from = SourceStr\x00 to = SourceSYYY ret = to + 6
+i = 9, j = 7, k = 2: from = SourceStr\x00 to = SourceSYYY ret = to + 6
+i = 9, j = 7, k = 3: from = SourceStr\x00 to = SourceSYYY ret = to + 6
+i = 9, j = 7, k = 4: from = SourceStr\x00 to = SourceSYYY ret = to + 6
+i = 9, j = 7, k = 5: from = SourceStr\x00 to = SourceSYYY ret = to + 6
+i = 9, j = 7, k = 6: from = SourceStr\x00 to = SourceSYYY ret = to + 6
+i = 9, j = 7, k = 7: from = SourceStr\x00 to = SourceS\x00YY ret = to + 6
+i = 9, j = 7, k = 8: from = SourceStr\x00 to = SourceSt\x00Y ret = to + 6
+i = 9, j = 7, k = 9: from = SourceStr\x00 to = SourceSti\x00 ret = to + 6
+i = 9, j = 8, k = 0: from = SourceStr\x00 to = SourceStYY ret = to + 7
+i = 9, j = 8, k = 1: from = SourceStr\x00 to = SourceStYY ret = to + 7
+i = 9, j = 8, k = 2: from = SourceStr\x00 to = SourceStYY ret = to + 7
+i = 9, j = 8, k = 3: from = SourceStr\x00 to = SourceStYY ret = to + 7
+i = 9, j = 8, k = 4: from = SourceStr\x00 to = SourceStYY ret = to + 7
+i = 9, j = 8, k = 5: from = SourceStr\x00 to = SourceStYY ret = to + 7
+i = 9, j = 8, k = 6: from = SourceStr\x00 to = SourceStYY ret = to + 7
+i = 9, j = 8, k = 7: from = SourceStr\x00 to = SourceStYY ret = to + 7
+i = 9, j = 8, k = 8: from = SourceStr\x00 to = SourceSt\x00Y ret = to + 7
+i = 9, j = 8, k = 9: from = SourceStr\x00 to = SourceSti\x00 ret = to + 7
+i = 9, j = 9, k = 0: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 1: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 2: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 3: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 4: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 5: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 6: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 7: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 8: from = SourceStr\x00 to = SourceStrY ret = to + 8
+i = 9, j = 9, k = 9: from = SourceStr\x00 to = SourceStr\x00 ret = to + 8
diff --git a/gnulib/tests/test-stpncpy.out.glibc b/gnulib/tests/test-stpncpy.out.glibc
new file mode 100644
index 00000000..d5c3ea4e
--- /dev/null
+++ b/gnulib/tests/test-stpncpy.out.glibc
@@ -0,0 +1,1000 @@
+i = 0, j = 0, k = 0: from = \x00XXXXXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 0, j = 0, k = 1: from = \x00XXXXXXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 0, j = 0, k = 2: from = \x00XXXXXXXXX to = De\x00YYYYYYY ret = to + 0
+i = 0, j = 0, k = 3: from = \x00XXXXXXXXX to = Des\x00YYYYYY ret = to + 0
+i = 0, j = 0, k = 4: from = \x00XXXXXXXXX to = Dest\x00YYYYY ret = to + 0
+i = 0, j = 0, k = 5: from = \x00XXXXXXXXX to = Desti\x00YYYY ret = to + 0
+i = 0, j = 0, k = 6: from = \x00XXXXXXXXX to = Destin\x00YYY ret = to + 0
+i = 0, j = 0, k = 7: from = \x00XXXXXXXXX to = Destina\x00YY ret = to + 0
+i = 0, j = 0, k = 8: from = \x00XXXXXXXXX to = Destinat\x00Y ret = to + 0
+i = 0, j = 0, k = 9: from = \x00XXXXXXXXX to = Destinati\x00 ret = to + 0
+i = 0, j = 1, k = 0: from = \x00XXXXXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 0, j = 1, k = 1: from = \x00XXXXXXXXX to = \x00\x00YYYYYYYY ret = to + 0
+i = 0, j = 1, k = 2: from = \x00XXXXXXXXX to = \x00e\x00YYYYYYY ret = to + 0
+i = 0, j = 1, k = 3: from = \x00XXXXXXXXX to = \x00es\x00YYYYYY ret = to + 0
+i = 0, j = 1, k = 4: from = \x00XXXXXXXXX to = \x00est\x00YYYYY ret = to + 0
+i = 0, j = 1, k = 5: from = \x00XXXXXXXXX to = \x00esti\x00YYYY ret = to + 0
+i = 0, j = 1, k = 6: from = \x00XXXXXXXXX to = \x00estin\x00YYY ret = to + 0
+i = 0, j = 1, k = 7: from = \x00XXXXXXXXX to = \x00estina\x00YY ret = to + 0
+i = 0, j = 1, k = 8: from = \x00XXXXXXXXX to = \x00estinat\x00Y ret = to + 0
+i = 0, j = 1, k = 9: from = \x00XXXXXXXXX to = \x00estinati\x00 ret = to + 0
+i = 0, j = 2, k = 0: from = \x00XXXXXXXXX to = \x00\x00YYYYYYYY ret = to + 0
+i = 0, j = 2, k = 1: from = \x00XXXXXXXXX to = \x00\x00YYYYYYYY ret = to + 0
+i = 0, j = 2, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00YYYYYYY ret = to + 0
+i = 0, j = 2, k = 3: from = \x00XXXXXXXXX to = \x00\x00s\x00YYYYYY ret = to + 0
+i = 0, j = 2, k = 4: from = \x00XXXXXXXXX to = \x00\x00st\x00YYYYY ret = to + 0
+i = 0, j = 2, k = 5: from = \x00XXXXXXXXX to = \x00\x00sti\x00YYYY ret = to + 0
+i = 0, j = 2, k = 6: from = \x00XXXXXXXXX to = \x00\x00stin\x00YYY ret = to + 0
+i = 0, j = 2, k = 7: from = \x00XXXXXXXXX to = \x00\x00stina\x00YY ret = to + 0
+i = 0, j = 2, k = 8: from = \x00XXXXXXXXX to = \x00\x00stinat\x00Y ret = to + 0
+i = 0, j = 2, k = 9: from = \x00XXXXXXXXX to = \x00\x00stinati\x00 ret = to + 0
+i = 0, j = 3, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00YYYYYYY ret = to + 0
+i = 0, j = 3, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00YYYYYYY ret = to + 0
+i = 0, j = 3, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00YYYYYYY ret = to + 0
+i = 0, j = 3, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 0
+i = 0, j = 3, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00t\x00YYYYY ret = to + 0
+i = 0, j = 3, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00ti\x00YYYY ret = to + 0
+i = 0, j = 3, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00tin\x00YYY ret = to + 0
+i = 0, j = 3, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00tina\x00YY ret = to + 0
+i = 0, j = 3, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00tinat\x00Y ret = to + 0
+i = 0, j = 3, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00tinati\x00 ret = to + 0
+i = 0, j = 4, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 0
+i = 0, j = 4, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 0
+i = 0, j = 4, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 0
+i = 0, j = 4, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00YYYYYY ret = to + 0
+i = 0, j = 4, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 0
+i = 0, j = 4, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00i\x00YYYY ret = to + 0
+i = 0, j = 4, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00in\x00YYY ret = to + 0
+i = 0, j = 4, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00ina\x00YY ret = to + 0
+i = 0, j = 4, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00inat\x00Y ret = to + 0
+i = 0, j = 4, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00inati\x00 ret = to + 0
+i = 0, j = 5, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 0
+i = 0, j = 5, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 0
+i = 0, j = 5, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 0
+i = 0, j = 5, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 0
+i = 0, j = 5, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00YYYYY ret = to + 0
+i = 0, j = 5, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 0
+i = 0, j = 5, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00n\x00YYY ret = to + 0
+i = 0, j = 5, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00na\x00YY ret = to + 0
+i = 0, j = 5, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00nat\x00Y ret = to + 0
+i = 0, j = 5, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00nati\x00 ret = to + 0
+i = 0, j = 6, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 0
+i = 0, j = 6, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 0
+i = 0, j = 6, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 0
+i = 0, j = 6, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 0
+i = 0, j = 6, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 0
+i = 0, j = 6, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00YYYY ret = to + 0
+i = 0, j = 6, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 0
+i = 0, j = 6, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00a\x00YY ret = to + 0
+i = 0, j = 6, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00at\x00Y ret = to + 0
+i = 0, j = 6, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00ati\x00 ret = to + 0
+i = 0, j = 7, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 0
+i = 0, j = 7, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 0
+i = 0, j = 7, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 0
+i = 0, j = 7, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 0
+i = 0, j = 7, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 0
+i = 0, j = 7, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 0
+i = 0, j = 7, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00YYY ret = to + 0
+i = 0, j = 7, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 7, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00t\x00Y ret = to + 0
+i = 0, j = 7, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00ti\x00 ret = to + 0
+i = 0, j = 8, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 8, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 8, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 8, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 8, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 8, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 8, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 8, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00YY ret = to + 0
+i = 0, j = 8, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 8, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00i\x00 ret = to + 0
+i = 0, j = 9, k = 0: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 1: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 2: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 3: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 4: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 5: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 6: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 7: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 8: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 0
+i = 0, j = 9, k = 9: from = \x00XXXXXXXXX to = \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 ret = to + 0
+i = 1, j = 0, k = 0: from = S\x00XXXXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 1, j = 0, k = 1: from = S\x00XXXXXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 1, j = 0, k = 2: from = S\x00XXXXXXXX to = De\x00YYYYYYY ret = to + 0
+i = 1, j = 0, k = 3: from = S\x00XXXXXXXX to = Des\x00YYYYYY ret = to + 0
+i = 1, j = 0, k = 4: from = S\x00XXXXXXXX to = Dest\x00YYYYY ret = to + 0
+i = 1, j = 0, k = 5: from = S\x00XXXXXXXX to = Desti\x00YYYY ret = to + 0
+i = 1, j = 0, k = 6: from = S\x00XXXXXXXX to = Destin\x00YYY ret = to + 0
+i = 1, j = 0, k = 7: from = S\x00XXXXXXXX to = Destina\x00YY ret = to + 0
+i = 1, j = 0, k = 8: from = S\x00XXXXXXXX to = Destinat\x00Y ret = to + 0
+i = 1, j = 0, k = 9: from = S\x00XXXXXXXX to = Destinati\x00 ret = to + 0
+i = 1, j = 1, k = 0: from = S\x00XXXXXXXX to = SYYYYYYYYY ret = to + 1
+i = 1, j = 1, k = 1: from = S\x00XXXXXXXX to = S\x00YYYYYYYY ret = to + 1
+i = 1, j = 1, k = 2: from = S\x00XXXXXXXX to = Se\x00YYYYYYY ret = to + 1
+i = 1, j = 1, k = 3: from = S\x00XXXXXXXX to = Ses\x00YYYYYY ret = to + 1
+i = 1, j = 1, k = 4: from = S\x00XXXXXXXX to = Sest\x00YYYYY ret = to + 1
+i = 1, j = 1, k = 5: from = S\x00XXXXXXXX to = Sesti\x00YYYY ret = to + 1
+i = 1, j = 1, k = 6: from = S\x00XXXXXXXX to = Sestin\x00YYY ret = to + 1
+i = 1, j = 1, k = 7: from = S\x00XXXXXXXX to = Sestina\x00YY ret = to + 1
+i = 1, j = 1, k = 8: from = S\x00XXXXXXXX to = Sestinat\x00Y ret = to + 1
+i = 1, j = 1, k = 9: from = S\x00XXXXXXXX to = Sestinati\x00 ret = to + 1
+i = 1, j = 2, k = 0: from = S\x00XXXXXXXX to = S\x00YYYYYYYY ret = to + 1
+i = 1, j = 2, k = 1: from = S\x00XXXXXXXX to = S\x00YYYYYYYY ret = to + 1
+i = 1, j = 2, k = 2: from = S\x00XXXXXXXX to = S\x00\x00YYYYYYY ret = to + 1
+i = 1, j = 2, k = 3: from = S\x00XXXXXXXX to = S\x00s\x00YYYYYY ret = to + 1
+i = 1, j = 2, k = 4: from = S\x00XXXXXXXX to = S\x00st\x00YYYYY ret = to + 1
+i = 1, j = 2, k = 5: from = S\x00XXXXXXXX to = S\x00sti\x00YYYY ret = to + 1
+i = 1, j = 2, k = 6: from = S\x00XXXXXXXX to = S\x00stin\x00YYY ret = to + 1
+i = 1, j = 2, k = 7: from = S\x00XXXXXXXX to = S\x00stina\x00YY ret = to + 1
+i = 1, j = 2, k = 8: from = S\x00XXXXXXXX to = S\x00stinat\x00Y ret = to + 1
+i = 1, j = 2, k = 9: from = S\x00XXXXXXXX to = S\x00stinati\x00 ret = to + 1
+i = 1, j = 3, k = 0: from = S\x00XXXXXXXX to = S\x00\x00YYYYYYY ret = to + 1
+i = 1, j = 3, k = 1: from = S\x00XXXXXXXX to = S\x00\x00YYYYYYY ret = to + 1
+i = 1, j = 3, k = 2: from = S\x00XXXXXXXX to = S\x00\x00YYYYYYY ret = to + 1
+i = 1, j = 3, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 1
+i = 1, j = 3, k = 4: from = S\x00XXXXXXXX to = S\x00\x00t\x00YYYYY ret = to + 1
+i = 1, j = 3, k = 5: from = S\x00XXXXXXXX to = S\x00\x00ti\x00YYYY ret = to + 1
+i = 1, j = 3, k = 6: from = S\x00XXXXXXXX to = S\x00\x00tin\x00YYY ret = to + 1
+i = 1, j = 3, k = 7: from = S\x00XXXXXXXX to = S\x00\x00tina\x00YY ret = to + 1
+i = 1, j = 3, k = 8: from = S\x00XXXXXXXX to = S\x00\x00tinat\x00Y ret = to + 1
+i = 1, j = 3, k = 9: from = S\x00XXXXXXXX to = S\x00\x00tinati\x00 ret = to + 1
+i = 1, j = 4, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 1
+i = 1, j = 4, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 1
+i = 1, j = 4, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 1
+i = 1, j = 4, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00YYYYYY ret = to + 1
+i = 1, j = 4, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 1
+i = 1, j = 4, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00i\x00YYYY ret = to + 1
+i = 1, j = 4, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00in\x00YYY ret = to + 1
+i = 1, j = 4, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00ina\x00YY ret = to + 1
+i = 1, j = 4, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00inat\x00Y ret = to + 1
+i = 1, j = 4, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00inati\x00 ret = to + 1
+i = 1, j = 5, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 1
+i = 1, j = 5, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 1
+i = 1, j = 5, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 1
+i = 1, j = 5, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 1
+i = 1, j = 5, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00YYYYY ret = to + 1
+i = 1, j = 5, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 1
+i = 1, j = 5, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00n\x00YYY ret = to + 1
+i = 1, j = 5, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00na\x00YY ret = to + 1
+i = 1, j = 5, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00nat\x00Y ret = to + 1
+i = 1, j = 5, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00nati\x00 ret = to + 1
+i = 1, j = 6, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 1
+i = 1, j = 6, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 1
+i = 1, j = 6, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 1
+i = 1, j = 6, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 1
+i = 1, j = 6, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 1
+i = 1, j = 6, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00YYYY ret = to + 1
+i = 1, j = 6, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 1
+i = 1, j = 6, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00a\x00YY ret = to + 1
+i = 1, j = 6, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00at\x00Y ret = to + 1
+i = 1, j = 6, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00ati\x00 ret = to + 1
+i = 1, j = 7, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 1
+i = 1, j = 7, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 1
+i = 1, j = 7, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 1
+i = 1, j = 7, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 1
+i = 1, j = 7, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 1
+i = 1, j = 7, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 1
+i = 1, j = 7, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00YYY ret = to + 1
+i = 1, j = 7, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 7, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00t\x00Y ret = to + 1
+i = 1, j = 7, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00ti\x00 ret = to + 1
+i = 1, j = 8, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 8, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 8, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 8, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 8, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 8, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 8, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 8, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00YY ret = to + 1
+i = 1, j = 8, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 8, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00i\x00 ret = to + 1
+i = 1, j = 9, k = 0: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 1: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 2: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 3: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 4: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 5: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 6: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 7: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 8: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00Y ret = to + 1
+i = 1, j = 9, k = 9: from = S\x00XXXXXXXX to = S\x00\x00\x00\x00\x00\x00\x00\x00\x00 ret = to + 1
+i = 2, j = 0, k = 0: from = So\x00XXXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 2, j = 0, k = 1: from = So\x00XXXXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 2, j = 0, k = 2: from = So\x00XXXXXXX to = De\x00YYYYYYY ret = to + 0
+i = 2, j = 0, k = 3: from = So\x00XXXXXXX to = Des\x00YYYYYY ret = to + 0
+i = 2, j = 0, k = 4: from = So\x00XXXXXXX to = Dest\x00YYYYY ret = to + 0
+i = 2, j = 0, k = 5: from = So\x00XXXXXXX to = Desti\x00YYYY ret = to + 0
+i = 2, j = 0, k = 6: from = So\x00XXXXXXX to = Destin\x00YYY ret = to + 0
+i = 2, j = 0, k = 7: from = So\x00XXXXXXX to = Destina\x00YY ret = to + 0
+i = 2, j = 0, k = 8: from = So\x00XXXXXXX to = Destinat\x00Y ret = to + 0
+i = 2, j = 0, k = 9: from = So\x00XXXXXXX to = Destinati\x00 ret = to + 0
+i = 2, j = 1, k = 0: from = So\x00XXXXXXX to = SYYYYYYYYY ret = to + 1
+i = 2, j = 1, k = 1: from = So\x00XXXXXXX to = S\x00YYYYYYYY ret = to + 1
+i = 2, j = 1, k = 2: from = So\x00XXXXXXX to = Se\x00YYYYYYY ret = to + 1
+i = 2, j = 1, k = 3: from = So\x00XXXXXXX to = Ses\x00YYYYYY ret = to + 1
+i = 2, j = 1, k = 4: from = So\x00XXXXXXX to = Sest\x00YYYYY ret = to + 1
+i = 2, j = 1, k = 5: from = So\x00XXXXXXX to = Sesti\x00YYYY ret = to + 1
+i = 2, j = 1, k = 6: from = So\x00XXXXXXX to = Sestin\x00YYY ret = to + 1
+i = 2, j = 1, k = 7: from = So\x00XXXXXXX to = Sestina\x00YY ret = to + 1
+i = 2, j = 1, k = 8: from = So\x00XXXXXXX to = Sestinat\x00Y ret = to + 1
+i = 2, j = 1, k = 9: from = So\x00XXXXXXX to = Sestinati\x00 ret = to + 1
+i = 2, j = 2, k = 0: from = So\x00XXXXXXX to = SoYYYYYYYY ret = to + 2
+i = 2, j = 2, k = 1: from = So\x00XXXXXXX to = SoYYYYYYYY ret = to + 2
+i = 2, j = 2, k = 2: from = So\x00XXXXXXX to = So\x00YYYYYYY ret = to + 2
+i = 2, j = 2, k = 3: from = So\x00XXXXXXX to = Sos\x00YYYYYY ret = to + 2
+i = 2, j = 2, k = 4: from = So\x00XXXXXXX to = Sost\x00YYYYY ret = to + 2
+i = 2, j = 2, k = 5: from = So\x00XXXXXXX to = Sosti\x00YYYY ret = to + 2
+i = 2, j = 2, k = 6: from = So\x00XXXXXXX to = Sostin\x00YYY ret = to + 2
+i = 2, j = 2, k = 7: from = So\x00XXXXXXX to = Sostina\x00YY ret = to + 2
+i = 2, j = 2, k = 8: from = So\x00XXXXXXX to = Sostinat\x00Y ret = to + 2
+i = 2, j = 2, k = 9: from = So\x00XXXXXXX to = Sostinati\x00 ret = to + 2
+i = 2, j = 3, k = 0: from = So\x00XXXXXXX to = So\x00YYYYYYY ret = to + 2
+i = 2, j = 3, k = 1: from = So\x00XXXXXXX to = So\x00YYYYYYY ret = to + 2
+i = 2, j = 3, k = 2: from = So\x00XXXXXXX to = So\x00YYYYYYY ret = to + 2
+i = 2, j = 3, k = 3: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 2
+i = 2, j = 3, k = 4: from = So\x00XXXXXXX to = So\x00t\x00YYYYY ret = to + 2
+i = 2, j = 3, k = 5: from = So\x00XXXXXXX to = So\x00ti\x00YYYY ret = to + 2
+i = 2, j = 3, k = 6: from = So\x00XXXXXXX to = So\x00tin\x00YYY ret = to + 2
+i = 2, j = 3, k = 7: from = So\x00XXXXXXX to = So\x00tina\x00YY ret = to + 2
+i = 2, j = 3, k = 8: from = So\x00XXXXXXX to = So\x00tinat\x00Y ret = to + 2
+i = 2, j = 3, k = 9: from = So\x00XXXXXXX to = So\x00tinati\x00 ret = to + 2
+i = 2, j = 4, k = 0: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 2
+i = 2, j = 4, k = 1: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 2
+i = 2, j = 4, k = 2: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 2
+i = 2, j = 4, k = 3: from = So\x00XXXXXXX to = So\x00\x00YYYYYY ret = to + 2
+i = 2, j = 4, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 2
+i = 2, j = 4, k = 5: from = So\x00XXXXXXX to = So\x00\x00i\x00YYYY ret = to + 2
+i = 2, j = 4, k = 6: from = So\x00XXXXXXX to = So\x00\x00in\x00YYY ret = to + 2
+i = 2, j = 4, k = 7: from = So\x00XXXXXXX to = So\x00\x00ina\x00YY ret = to + 2
+i = 2, j = 4, k = 8: from = So\x00XXXXXXX to = So\x00\x00inat\x00Y ret = to + 2
+i = 2, j = 4, k = 9: from = So\x00XXXXXXX to = So\x00\x00inati\x00 ret = to + 2
+i = 2, j = 5, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 2
+i = 2, j = 5, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 2
+i = 2, j = 5, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 2
+i = 2, j = 5, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 2
+i = 2, j = 5, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00YYYYY ret = to + 2
+i = 2, j = 5, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 2
+i = 2, j = 5, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00n\x00YYY ret = to + 2
+i = 2, j = 5, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00na\x00YY ret = to + 2
+i = 2, j = 5, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00nat\x00Y ret = to + 2
+i = 2, j = 5, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00nati\x00 ret = to + 2
+i = 2, j = 6, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 2
+i = 2, j = 6, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 2
+i = 2, j = 6, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 2
+i = 2, j = 6, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 2
+i = 2, j = 6, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 2
+i = 2, j = 6, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00YYYY ret = to + 2
+i = 2, j = 6, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 2
+i = 2, j = 6, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00\x00a\x00YY ret = to + 2
+i = 2, j = 6, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00\x00at\x00Y ret = to + 2
+i = 2, j = 6, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00\x00ati\x00 ret = to + 2
+i = 2, j = 7, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 2
+i = 2, j = 7, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 2
+i = 2, j = 7, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 2
+i = 2, j = 7, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 2
+i = 2, j = 7, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 2
+i = 2, j = 7, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 2
+i = 2, j = 7, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00YYY ret = to + 2
+i = 2, j = 7, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 7, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00t\x00Y ret = to + 2
+i = 2, j = 7, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00ti\x00 ret = to + 2
+i = 2, j = 8, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 8, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 8, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 8, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 8, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 8, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 8, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 8, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00YY ret = to + 2
+i = 2, j = 8, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 8, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00i\x00 ret = to + 2
+i = 2, j = 9, k = 0: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 1: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 2: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 3: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 4: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 5: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 6: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 7: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 8: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00Y ret = to + 2
+i = 2, j = 9, k = 9: from = So\x00XXXXXXX to = So\x00\x00\x00\x00\x00\x00\x00\x00 ret = to + 2
+i = 3, j = 0, k = 0: from = Sou\x00XXXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 3, j = 0, k = 1: from = Sou\x00XXXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 3, j = 0, k = 2: from = Sou\x00XXXXXX to = De\x00YYYYYYY ret = to + 0
+i = 3, j = 0, k = 3: from = Sou\x00XXXXXX to = Des\x00YYYYYY ret = to + 0
+i = 3, j = 0, k = 4: from = Sou\x00XXXXXX to = Dest\x00YYYYY ret = to + 0
+i = 3, j = 0, k = 5: from = Sou\x00XXXXXX to = Desti\x00YYYY ret = to + 0
+i = 3, j = 0, k = 6: from = Sou\x00XXXXXX to = Destin\x00YYY ret = to + 0
+i = 3, j = 0, k = 7: from = Sou\x00XXXXXX to = Destina\x00YY ret = to + 0
+i = 3, j = 0, k = 8: from = Sou\x00XXXXXX to = Destinat\x00Y ret = to + 0
+i = 3, j = 0, k = 9: from = Sou\x00XXXXXX to = Destinati\x00 ret = to + 0
+i = 3, j = 1, k = 0: from = Sou\x00XXXXXX to = SYYYYYYYYY ret = to + 1
+i = 3, j = 1, k = 1: from = Sou\x00XXXXXX to = S\x00YYYYYYYY ret = to + 1
+i = 3, j = 1, k = 2: from = Sou\x00XXXXXX to = Se\x00YYYYYYY ret = to + 1
+i = 3, j = 1, k = 3: from = Sou\x00XXXXXX to = Ses\x00YYYYYY ret = to + 1
+i = 3, j = 1, k = 4: from = Sou\x00XXXXXX to = Sest\x00YYYYY ret = to + 1
+i = 3, j = 1, k = 5: from = Sou\x00XXXXXX to = Sesti\x00YYYY ret = to + 1
+i = 3, j = 1, k = 6: from = Sou\x00XXXXXX to = Sestin\x00YYY ret = to + 1
+i = 3, j = 1, k = 7: from = Sou\x00XXXXXX to = Sestina\x00YY ret = to + 1
+i = 3, j = 1, k = 8: from = Sou\x00XXXXXX to = Sestinat\x00Y ret = to + 1
+i = 3, j = 1, k = 9: from = Sou\x00XXXXXX to = Sestinati\x00 ret = to + 1
+i = 3, j = 2, k = 0: from = Sou\x00XXXXXX to = SoYYYYYYYY ret = to + 2
+i = 3, j = 2, k = 1: from = Sou\x00XXXXXX to = SoYYYYYYYY ret = to + 2
+i = 3, j = 2, k = 2: from = Sou\x00XXXXXX to = So\x00YYYYYYY ret = to + 2
+i = 3, j = 2, k = 3: from = Sou\x00XXXXXX to = Sos\x00YYYYYY ret = to + 2
+i = 3, j = 2, k = 4: from = Sou\x00XXXXXX to = Sost\x00YYYYY ret = to + 2
+i = 3, j = 2, k = 5: from = Sou\x00XXXXXX to = Sosti\x00YYYY ret = to + 2
+i = 3, j = 2, k = 6: from = Sou\x00XXXXXX to = Sostin\x00YYY ret = to + 2
+i = 3, j = 2, k = 7: from = Sou\x00XXXXXX to = Sostina\x00YY ret = to + 2
+i = 3, j = 2, k = 8: from = Sou\x00XXXXXX to = Sostinat\x00Y ret = to + 2
+i = 3, j = 2, k = 9: from = Sou\x00XXXXXX to = Sostinati\x00 ret = to + 2
+i = 3, j = 3, k = 0: from = Sou\x00XXXXXX to = SouYYYYYYY ret = to + 3
+i = 3, j = 3, k = 1: from = Sou\x00XXXXXX to = SouYYYYYYY ret = to + 3
+i = 3, j = 3, k = 2: from = Sou\x00XXXXXX to = SouYYYYYYY ret = to + 3
+i = 3, j = 3, k = 3: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 3, k = 4: from = Sou\x00XXXXXX to = Sout\x00YYYYY ret = to + 3
+i = 3, j = 3, k = 5: from = Sou\x00XXXXXX to = Souti\x00YYYY ret = to + 3
+i = 3, j = 3, k = 6: from = Sou\x00XXXXXX to = Soutin\x00YYY ret = to + 3
+i = 3, j = 3, k = 7: from = Sou\x00XXXXXX to = Soutina\x00YY ret = to + 3
+i = 3, j = 3, k = 8: from = Sou\x00XXXXXX to = Soutinat\x00Y ret = to + 3
+i = 3, j = 3, k = 9: from = Sou\x00XXXXXX to = Soutinati\x00 ret = to + 3
+i = 3, j = 4, k = 0: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 4, k = 1: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 4, k = 2: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 4, k = 3: from = Sou\x00XXXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 3, j = 4, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 3
+i = 3, j = 4, k = 5: from = Sou\x00XXXXXX to = Sou\x00i\x00YYYY ret = to + 3
+i = 3, j = 4, k = 6: from = Sou\x00XXXXXX to = Sou\x00in\x00YYY ret = to + 3
+i = 3, j = 4, k = 7: from = Sou\x00XXXXXX to = Sou\x00ina\x00YY ret = to + 3
+i = 3, j = 4, k = 8: from = Sou\x00XXXXXX to = Sou\x00inat\x00Y ret = to + 3
+i = 3, j = 4, k = 9: from = Sou\x00XXXXXX to = Sou\x00inati\x00 ret = to + 3
+i = 3, j = 5, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 3
+i = 3, j = 5, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 3
+i = 3, j = 5, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 3
+i = 3, j = 5, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 3
+i = 3, j = 5, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00YYYYY ret = to + 3
+i = 3, j = 5, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 3
+i = 3, j = 5, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00n\x00YYY ret = to + 3
+i = 3, j = 5, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00na\x00YY ret = to + 3
+i = 3, j = 5, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00nat\x00Y ret = to + 3
+i = 3, j = 5, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00nati\x00 ret = to + 3
+i = 3, j = 6, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 3
+i = 3, j = 6, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 3
+i = 3, j = 6, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 3
+i = 3, j = 6, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 3
+i = 3, j = 6, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 3
+i = 3, j = 6, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00YYYY ret = to + 3
+i = 3, j = 6, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 3
+i = 3, j = 6, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00\x00a\x00YY ret = to + 3
+i = 3, j = 6, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00\x00at\x00Y ret = to + 3
+i = 3, j = 6, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00\x00ati\x00 ret = to + 3
+i = 3, j = 7, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 3
+i = 3, j = 7, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 3
+i = 3, j = 7, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 3
+i = 3, j = 7, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 3
+i = 3, j = 7, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 3
+i = 3, j = 7, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 3
+i = 3, j = 7, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00YYY ret = to + 3
+i = 3, j = 7, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 7, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00t\x00Y ret = to + 3
+i = 3, j = 7, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00ti\x00 ret = to + 3
+i = 3, j = 8, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 8, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 8, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 8, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 8, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 8, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 8, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 8, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00YY ret = to + 3
+i = 3, j = 8, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 8, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00i\x00 ret = to + 3
+i = 3, j = 9, k = 0: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 1: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 2: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 3: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 4: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 5: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 6: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 7: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 8: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00Y ret = to + 3
+i = 3, j = 9, k = 9: from = Sou\x00XXXXXX to = Sou\x00\x00\x00\x00\x00\x00\x00 ret = to + 3
+i = 4, j = 0, k = 0: from = Sour\x00XXXXX to = \x00YYYYYYYYY ret = to + 0
+i = 4, j = 0, k = 1: from = Sour\x00XXXXX to = D\x00YYYYYYYY ret = to + 0
+i = 4, j = 0, k = 2: from = Sour\x00XXXXX to = De\x00YYYYYYY ret = to + 0
+i = 4, j = 0, k = 3: from = Sour\x00XXXXX to = Des\x00YYYYYY ret = to + 0
+i = 4, j = 0, k = 4: from = Sour\x00XXXXX to = Dest\x00YYYYY ret = to + 0
+i = 4, j = 0, k = 5: from = Sour\x00XXXXX to = Desti\x00YYYY ret = to + 0
+i = 4, j = 0, k = 6: from = Sour\x00XXXXX to = Destin\x00YYY ret = to + 0
+i = 4, j = 0, k = 7: from = Sour\x00XXXXX to = Destina\x00YY ret = to + 0
+i = 4, j = 0, k = 8: from = Sour\x00XXXXX to = Destinat\x00Y ret = to + 0
+i = 4, j = 0, k = 9: from = Sour\x00XXXXX to = Destinati\x00 ret = to + 0
+i = 4, j = 1, k = 0: from = Sour\x00XXXXX to = SYYYYYYYYY ret = to + 1
+i = 4, j = 1, k = 1: from = Sour\x00XXXXX to = S\x00YYYYYYYY ret = to + 1
+i = 4, j = 1, k = 2: from = Sour\x00XXXXX to = Se\x00YYYYYYY ret = to + 1
+i = 4, j = 1, k = 3: from = Sour\x00XXXXX to = Ses\x00YYYYYY ret = to + 1
+i = 4, j = 1, k = 4: from = Sour\x00XXXXX to = Sest\x00YYYYY ret = to + 1
+i = 4, j = 1, k = 5: from = Sour\x00XXXXX to = Sesti\x00YYYY ret = to + 1
+i = 4, j = 1, k = 6: from = Sour\x00XXXXX to = Sestin\x00YYY ret = to + 1
+i = 4, j = 1, k = 7: from = Sour\x00XXXXX to = Sestina\x00YY ret = to + 1
+i = 4, j = 1, k = 8: from = Sour\x00XXXXX to = Sestinat\x00Y ret = to + 1
+i = 4, j = 1, k = 9: from = Sour\x00XXXXX to = Sestinati\x00 ret = to + 1
+i = 4, j = 2, k = 0: from = Sour\x00XXXXX to = SoYYYYYYYY ret = to + 2
+i = 4, j = 2, k = 1: from = Sour\x00XXXXX to = SoYYYYYYYY ret = to + 2
+i = 4, j = 2, k = 2: from = Sour\x00XXXXX to = So\x00YYYYYYY ret = to + 2
+i = 4, j = 2, k = 3: from = Sour\x00XXXXX to = Sos\x00YYYYYY ret = to + 2
+i = 4, j = 2, k = 4: from = Sour\x00XXXXX to = Sost\x00YYYYY ret = to + 2
+i = 4, j = 2, k = 5: from = Sour\x00XXXXX to = Sosti\x00YYYY ret = to + 2
+i = 4, j = 2, k = 6: from = Sour\x00XXXXX to = Sostin\x00YYY ret = to + 2
+i = 4, j = 2, k = 7: from = Sour\x00XXXXX to = Sostina\x00YY ret = to + 2
+i = 4, j = 2, k = 8: from = Sour\x00XXXXX to = Sostinat\x00Y ret = to + 2
+i = 4, j = 2, k = 9: from = Sour\x00XXXXX to = Sostinati\x00 ret = to + 2
+i = 4, j = 3, k = 0: from = Sour\x00XXXXX to = SouYYYYYYY ret = to + 3
+i = 4, j = 3, k = 1: from = Sour\x00XXXXX to = SouYYYYYYY ret = to + 3
+i = 4, j = 3, k = 2: from = Sour\x00XXXXX to = SouYYYYYYY ret = to + 3
+i = 4, j = 3, k = 3: from = Sour\x00XXXXX to = Sou\x00YYYYYY ret = to + 3
+i = 4, j = 3, k = 4: from = Sour\x00XXXXX to = Sout\x00YYYYY ret = to + 3
+i = 4, j = 3, k = 5: from = Sour\x00XXXXX to = Souti\x00YYYY ret = to + 3
+i = 4, j = 3, k = 6: from = Sour\x00XXXXX to = Soutin\x00YYY ret = to + 3
+i = 4, j = 3, k = 7: from = Sour\x00XXXXX to = Soutina\x00YY ret = to + 3
+i = 4, j = 3, k = 8: from = Sour\x00XXXXX to = Soutinat\x00Y ret = to + 3
+i = 4, j = 3, k = 9: from = Sour\x00XXXXX to = Soutinati\x00 ret = to + 3
+i = 4, j = 4, k = 0: from = Sour\x00XXXXX to = SourYYYYYY ret = to + 4
+i = 4, j = 4, k = 1: from = Sour\x00XXXXX to = SourYYYYYY ret = to + 4
+i = 4, j = 4, k = 2: from = Sour\x00XXXXX to = SourYYYYYY ret = to + 4
+i = 4, j = 4, k = 3: from = Sour\x00XXXXX to = SourYYYYYY ret = to + 4
+i = 4, j = 4, k = 4: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 4, k = 5: from = Sour\x00XXXXX to = Souri\x00YYYY ret = to + 4
+i = 4, j = 4, k = 6: from = Sour\x00XXXXX to = Sourin\x00YYY ret = to + 4
+i = 4, j = 4, k = 7: from = Sour\x00XXXXX to = Sourina\x00YY ret = to + 4
+i = 4, j = 4, k = 8: from = Sour\x00XXXXX to = Sourinat\x00Y ret = to + 4
+i = 4, j = 4, k = 9: from = Sour\x00XXXXX to = Sourinati\x00 ret = to + 4
+i = 4, j = 5, k = 0: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 1: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 2: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 3: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 4: from = Sour\x00XXXXX to = Sour\x00YYYYY ret = to + 4
+i = 4, j = 5, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 4
+i = 4, j = 5, k = 6: from = Sour\x00XXXXX to = Sour\x00n\x00YYY ret = to + 4
+i = 4, j = 5, k = 7: from = Sour\x00XXXXX to = Sour\x00na\x00YY ret = to + 4
+i = 4, j = 5, k = 8: from = Sour\x00XXXXX to = Sour\x00nat\x00Y ret = to + 4
+i = 4, j = 5, k = 9: from = Sour\x00XXXXX to = Sour\x00nati\x00 ret = to + 4
+i = 4, j = 6, k = 0: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 4
+i = 4, j = 6, k = 1: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 4
+i = 4, j = 6, k = 2: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 4
+i = 4, j = 6, k = 3: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 4
+i = 4, j = 6, k = 4: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 4
+i = 4, j = 6, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00YYYY ret = to + 4
+i = 4, j = 6, k = 6: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 4
+i = 4, j = 6, k = 7: from = Sour\x00XXXXX to = Sour\x00\x00a\x00YY ret = to + 4
+i = 4, j = 6, k = 8: from = Sour\x00XXXXX to = Sour\x00\x00at\x00Y ret = to + 4
+i = 4, j = 6, k = 9: from = Sour\x00XXXXX to = Sour\x00\x00ati\x00 ret = to + 4
+i = 4, j = 7, k = 0: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 4
+i = 4, j = 7, k = 1: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 4
+i = 4, j = 7, k = 2: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 4
+i = 4, j = 7, k = 3: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 4
+i = 4, j = 7, k = 4: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 4
+i = 4, j = 7, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 4
+i = 4, j = 7, k = 6: from = Sour\x00XXXXX to = Sour\x00\x00\x00YYY ret = to + 4
+i = 4, j = 7, k = 7: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 7, k = 8: from = Sour\x00XXXXX to = Sour\x00\x00\x00t\x00Y ret = to + 4
+i = 4, j = 7, k = 9: from = Sour\x00XXXXX to = Sour\x00\x00\x00ti\x00 ret = to + 4
+i = 4, j = 8, k = 0: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 8, k = 1: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 8, k = 2: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 8, k = 3: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 8, k = 4: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 8, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 8, k = 6: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 8, k = 7: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00YY ret = to + 4
+i = 4, j = 8, k = 8: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 8, k = 9: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00i\x00 ret = to + 4
+i = 4, j = 9, k = 0: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 1: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 2: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 3: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 4: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 5: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 6: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 7: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 8: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00Y ret = to + 4
+i = 4, j = 9, k = 9: from = Sour\x00XXXXX to = Sour\x00\x00\x00\x00\x00\x00 ret = to + 4
+i = 5, j = 0, k = 0: from = Sourc\x00XXXX to = \x00YYYYYYYYY ret = to + 0
+i = 5, j = 0, k = 1: from = Sourc\x00XXXX to = D\x00YYYYYYYY ret = to + 0
+i = 5, j = 0, k = 2: from = Sourc\x00XXXX to = De\x00YYYYYYY ret = to + 0
+i = 5, j = 0, k = 3: from = Sourc\x00XXXX to = Des\x00YYYYYY ret = to + 0
+i = 5, j = 0, k = 4: from = Sourc\x00XXXX to = Dest\x00YYYYY ret = to + 0
+i = 5, j = 0, k = 5: from = Sourc\x00XXXX to = Desti\x00YYYY ret = to + 0
+i = 5, j = 0, k = 6: from = Sourc\x00XXXX to = Destin\x00YYY ret = to + 0
+i = 5, j = 0, k = 7: from = Sourc\x00XXXX to = Destina\x00YY ret = to + 0
+i = 5, j = 0, k = 8: from = Sourc\x00XXXX to = Destinat\x00Y ret = to + 0
+i = 5, j = 0, k = 9: from = Sourc\x00XXXX to = Destinati\x00 ret = to + 0
+i = 5, j = 1, k = 0: from = Sourc\x00XXXX to = SYYYYYYYYY ret = to + 1
+i = 5, j = 1, k = 1: from = Sourc\x00XXXX to = S\x00YYYYYYYY ret = to + 1
+i = 5, j = 1, k = 2: from = Sourc\x00XXXX to = Se\x00YYYYYYY ret = to + 1
+i = 5, j = 1, k = 3: from = Sourc\x00XXXX to = Ses\x00YYYYYY ret = to + 1
+i = 5, j = 1, k = 4: from = Sourc\x00XXXX to = Sest\x00YYYYY ret = to + 1
+i = 5, j = 1, k = 5: from = Sourc\x00XXXX to = Sesti\x00YYYY ret = to + 1
+i = 5, j = 1, k = 6: from = Sourc\x00XXXX to = Sestin\x00YYY ret = to + 1
+i = 5, j = 1, k = 7: from = Sourc\x00XXXX to = Sestina\x00YY ret = to + 1
+i = 5, j = 1, k = 8: from = Sourc\x00XXXX to = Sestinat\x00Y ret = to + 1
+i = 5, j = 1, k = 9: from = Sourc\x00XXXX to = Sestinati\x00 ret = to + 1
+i = 5, j = 2, k = 0: from = Sourc\x00XXXX to = SoYYYYYYYY ret = to + 2
+i = 5, j = 2, k = 1: from = Sourc\x00XXXX to = SoYYYYYYYY ret = to + 2
+i = 5, j = 2, k = 2: from = Sourc\x00XXXX to = So\x00YYYYYYY ret = to + 2
+i = 5, j = 2, k = 3: from = Sourc\x00XXXX to = Sos\x00YYYYYY ret = to + 2
+i = 5, j = 2, k = 4: from = Sourc\x00XXXX to = Sost\x00YYYYY ret = to + 2
+i = 5, j = 2, k = 5: from = Sourc\x00XXXX to = Sosti\x00YYYY ret = to + 2
+i = 5, j = 2, k = 6: from = Sourc\x00XXXX to = Sostin\x00YYY ret = to + 2
+i = 5, j = 2, k = 7: from = Sourc\x00XXXX to = Sostina\x00YY ret = to + 2
+i = 5, j = 2, k = 8: from = Sourc\x00XXXX to = Sostinat\x00Y ret = to + 2
+i = 5, j = 2, k = 9: from = Sourc\x00XXXX to = Sostinati\x00 ret = to + 2
+i = 5, j = 3, k = 0: from = Sourc\x00XXXX to = SouYYYYYYY ret = to + 3
+i = 5, j = 3, k = 1: from = Sourc\x00XXXX to = SouYYYYYYY ret = to + 3
+i = 5, j = 3, k = 2: from = Sourc\x00XXXX to = SouYYYYYYY ret = to + 3
+i = 5, j = 3, k = 3: from = Sourc\x00XXXX to = Sou\x00YYYYYY ret = to + 3
+i = 5, j = 3, k = 4: from = Sourc\x00XXXX to = Sout\x00YYYYY ret = to + 3
+i = 5, j = 3, k = 5: from = Sourc\x00XXXX to = Souti\x00YYYY ret = to + 3
+i = 5, j = 3, k = 6: from = Sourc\x00XXXX to = Soutin\x00YYY ret = to + 3
+i = 5, j = 3, k = 7: from = Sourc\x00XXXX to = Soutina\x00YY ret = to + 3
+i = 5, j = 3, k = 8: from = Sourc\x00XXXX to = Soutinat\x00Y ret = to + 3
+i = 5, j = 3, k = 9: from = Sourc\x00XXXX to = Soutinati\x00 ret = to + 3
+i = 5, j = 4, k = 0: from = Sourc\x00XXXX to = SourYYYYYY ret = to + 4
+i = 5, j = 4, k = 1: from = Sourc\x00XXXX to = SourYYYYYY ret = to + 4
+i = 5, j = 4, k = 2: from = Sourc\x00XXXX to = SourYYYYYY ret = to + 4
+i = 5, j = 4, k = 3: from = Sourc\x00XXXX to = SourYYYYYY ret = to + 4
+i = 5, j = 4, k = 4: from = Sourc\x00XXXX to = Sour\x00YYYYY ret = to + 4
+i = 5, j = 4, k = 5: from = Sourc\x00XXXX to = Souri\x00YYYY ret = to + 4
+i = 5, j = 4, k = 6: from = Sourc\x00XXXX to = Sourin\x00YYY ret = to + 4
+i = 5, j = 4, k = 7: from = Sourc\x00XXXX to = Sourina\x00YY ret = to + 4
+i = 5, j = 4, k = 8: from = Sourc\x00XXXX to = Sourinat\x00Y ret = to + 4
+i = 5, j = 4, k = 9: from = Sourc\x00XXXX to = Sourinati\x00 ret = to + 4
+i = 5, j = 5, k = 0: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 5
+i = 5, j = 5, k = 1: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 5
+i = 5, j = 5, k = 2: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 5
+i = 5, j = 5, k = 3: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 5
+i = 5, j = 5, k = 4: from = Sourc\x00XXXX to = SourcYYYYY ret = to + 5
+i = 5, j = 5, k = 5: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 5, k = 6: from = Sourc\x00XXXX to = Sourcn\x00YYY ret = to + 5
+i = 5, j = 5, k = 7: from = Sourc\x00XXXX to = Sourcna\x00YY ret = to + 5
+i = 5, j = 5, k = 8: from = Sourc\x00XXXX to = Sourcnat\x00Y ret = to + 5
+i = 5, j = 5, k = 9: from = Sourc\x00XXXX to = Sourcnati\x00 ret = to + 5
+i = 5, j = 6, k = 0: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 1: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 2: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 3: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 4: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 5: from = Sourc\x00XXXX to = Sourc\x00YYYY ret = to + 5
+i = 5, j = 6, k = 6: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 6, k = 7: from = Sourc\x00XXXX to = Sourc\x00a\x00YY ret = to + 5
+i = 5, j = 6, k = 8: from = Sourc\x00XXXX to = Sourc\x00at\x00Y ret = to + 5
+i = 5, j = 6, k = 9: from = Sourc\x00XXXX to = Sourc\x00ati\x00 ret = to + 5
+i = 5, j = 7, k = 0: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 7, k = 1: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 7, k = 2: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 7, k = 3: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 7, k = 4: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 7, k = 5: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 7, k = 6: from = Sourc\x00XXXX to = Sourc\x00\x00YYY ret = to + 5
+i = 5, j = 7, k = 7: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 7, k = 8: from = Sourc\x00XXXX to = Sourc\x00\x00t\x00Y ret = to + 5
+i = 5, j = 7, k = 9: from = Sourc\x00XXXX to = Sourc\x00\x00ti\x00 ret = to + 5
+i = 5, j = 8, k = 0: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 8, k = 1: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 8, k = 2: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 8, k = 3: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 8, k = 4: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 8, k = 5: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 8, k = 6: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 8, k = 7: from = Sourc\x00XXXX to = Sourc\x00\x00\x00YY ret = to + 5
+i = 5, j = 8, k = 8: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 8, k = 9: from = Sourc\x00XXXX to = Sourc\x00\x00\x00i\x00 ret = to + 5
+i = 5, j = 9, k = 0: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 1: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 2: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 3: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 4: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 5: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 6: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 7: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 8: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00Y ret = to + 5
+i = 5, j = 9, k = 9: from = Sourc\x00XXXX to = Sourc\x00\x00\x00\x00\x00 ret = to + 5
+i = 6, j = 0, k = 0: from = Source\x00XXX to = \x00YYYYYYYYY ret = to + 0
+i = 6, j = 0, k = 1: from = Source\x00XXX to = D\x00YYYYYYYY ret = to + 0
+i = 6, j = 0, k = 2: from = Source\x00XXX to = De\x00YYYYYYY ret = to + 0
+i = 6, j = 0, k = 3: from = Source\x00XXX to = Des\x00YYYYYY ret = to + 0
+i = 6, j = 0, k = 4: from = Source\x00XXX to = Dest\x00YYYYY ret = to + 0
+i = 6, j = 0, k = 5: from = Source\x00XXX to = Desti\x00YYYY ret = to + 0
+i = 6, j = 0, k = 6: from = Source\x00XXX to = Destin\x00YYY ret = to + 0
+i = 6, j = 0, k = 7: from = Source\x00XXX to = Destina\x00YY ret = to + 0
+i = 6, j = 0, k = 8: from = Source\x00XXX to = Destinat\x00Y ret = to + 0
+i = 6, j = 0, k = 9: from = Source\x00XXX to = Destinati\x00 ret = to + 0
+i = 6, j = 1, k = 0: from = Source\x00XXX to = SYYYYYYYYY ret = to + 1
+i = 6, j = 1, k = 1: from = Source\x00XXX to = S\x00YYYYYYYY ret = to + 1
+i = 6, j = 1, k = 2: from = Source\x00XXX to = Se\x00YYYYYYY ret = to + 1
+i = 6, j = 1, k = 3: from = Source\x00XXX to = Ses\x00YYYYYY ret = to + 1
+i = 6, j = 1, k = 4: from = Source\x00XXX to = Sest\x00YYYYY ret = to + 1
+i = 6, j = 1, k = 5: from = Source\x00XXX to = Sesti\x00YYYY ret = to + 1
+i = 6, j = 1, k = 6: from = Source\x00XXX to = Sestin\x00YYY ret = to + 1
+i = 6, j = 1, k = 7: from = Source\x00XXX to = Sestina\x00YY ret = to + 1
+i = 6, j = 1, k = 8: from = Source\x00XXX to = Sestinat\x00Y ret = to + 1
+i = 6, j = 1, k = 9: from = Source\x00XXX to = Sestinati\x00 ret = to + 1
+i = 6, j = 2, k = 0: from = Source\x00XXX to = SoYYYYYYYY ret = to + 2
+i = 6, j = 2, k = 1: from = Source\x00XXX to = SoYYYYYYYY ret = to + 2
+i = 6, j = 2, k = 2: from = Source\x00XXX to = So\x00YYYYYYY ret = to + 2
+i = 6, j = 2, k = 3: from = Source\x00XXX to = Sos\x00YYYYYY ret = to + 2
+i = 6, j = 2, k = 4: from = Source\x00XXX to = Sost\x00YYYYY ret = to + 2
+i = 6, j = 2, k = 5: from = Source\x00XXX to = Sosti\x00YYYY ret = to + 2
+i = 6, j = 2, k = 6: from = Source\x00XXX to = Sostin\x00YYY ret = to + 2
+i = 6, j = 2, k = 7: from = Source\x00XXX to = Sostina\x00YY ret = to + 2
+i = 6, j = 2, k = 8: from = Source\x00XXX to = Sostinat\x00Y ret = to + 2
+i = 6, j = 2, k = 9: from = Source\x00XXX to = Sostinati\x00 ret = to + 2
+i = 6, j = 3, k = 0: from = Source\x00XXX to = SouYYYYYYY ret = to + 3
+i = 6, j = 3, k = 1: from = Source\x00XXX to = SouYYYYYYY ret = to + 3
+i = 6, j = 3, k = 2: from = Source\x00XXX to = SouYYYYYYY ret = to + 3
+i = 6, j = 3, k = 3: from = Source\x00XXX to = Sou\x00YYYYYY ret = to + 3
+i = 6, j = 3, k = 4: from = Source\x00XXX to = Sout\x00YYYYY ret = to + 3
+i = 6, j = 3, k = 5: from = Source\x00XXX to = Souti\x00YYYY ret = to + 3
+i = 6, j = 3, k = 6: from = Source\x00XXX to = Soutin\x00YYY ret = to + 3
+i = 6, j = 3, k = 7: from = Source\x00XXX to = Soutina\x00YY ret = to + 3
+i = 6, j = 3, k = 8: from = Source\x00XXX to = Soutinat\x00Y ret = to + 3
+i = 6, j = 3, k = 9: from = Source\x00XXX to = Soutinati\x00 ret = to + 3
+i = 6, j = 4, k = 0: from = Source\x00XXX to = SourYYYYYY ret = to + 4
+i = 6, j = 4, k = 1: from = Source\x00XXX to = SourYYYYYY ret = to + 4
+i = 6, j = 4, k = 2: from = Source\x00XXX to = SourYYYYYY ret = to + 4
+i = 6, j = 4, k = 3: from = Source\x00XXX to = SourYYYYYY ret = to + 4
+i = 6, j = 4, k = 4: from = Source\x00XXX to = Sour\x00YYYYY ret = to + 4
+i = 6, j = 4, k = 5: from = Source\x00XXX to = Souri\x00YYYY ret = to + 4
+i = 6, j = 4, k = 6: from = Source\x00XXX to = Sourin\x00YYY ret = to + 4
+i = 6, j = 4, k = 7: from = Source\x00XXX to = Sourina\x00YY ret = to + 4
+i = 6, j = 4, k = 8: from = Source\x00XXX to = Sourinat\x00Y ret = to + 4
+i = 6, j = 4, k = 9: from = Source\x00XXX to = Sourinati\x00 ret = to + 4
+i = 6, j = 5, k = 0: from = Source\x00XXX to = SourcYYYYY ret = to + 5
+i = 6, j = 5, k = 1: from = Source\x00XXX to = SourcYYYYY ret = to + 5
+i = 6, j = 5, k = 2: from = Source\x00XXX to = SourcYYYYY ret = to + 5
+i = 6, j = 5, k = 3: from = Source\x00XXX to = SourcYYYYY ret = to + 5
+i = 6, j = 5, k = 4: from = Source\x00XXX to = SourcYYYYY ret = to + 5
+i = 6, j = 5, k = 5: from = Source\x00XXX to = Sourc\x00YYYY ret = to + 5
+i = 6, j = 5, k = 6: from = Source\x00XXX to = Sourcn\x00YYY ret = to + 5
+i = 6, j = 5, k = 7: from = Source\x00XXX to = Sourcna\x00YY ret = to + 5
+i = 6, j = 5, k = 8: from = Source\x00XXX to = Sourcnat\x00Y ret = to + 5
+i = 6, j = 5, k = 9: from = Source\x00XXX to = Sourcnati\x00 ret = to + 5
+i = 6, j = 6, k = 0: from = Source\x00XXX to = SourceYYYY ret = to + 6
+i = 6, j = 6, k = 1: from = Source\x00XXX to = SourceYYYY ret = to + 6
+i = 6, j = 6, k = 2: from = Source\x00XXX to = SourceYYYY ret = to + 6
+i = 6, j = 6, k = 3: from = Source\x00XXX to = SourceYYYY ret = to + 6
+i = 6, j = 6, k = 4: from = Source\x00XXX to = SourceYYYY ret = to + 6
+i = 6, j = 6, k = 5: from = Source\x00XXX to = SourceYYYY ret = to + 6
+i = 6, j = 6, k = 6: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 6, k = 7: from = Source\x00XXX to = Sourcea\x00YY ret = to + 6
+i = 6, j = 6, k = 8: from = Source\x00XXX to = Sourceat\x00Y ret = to + 6
+i = 6, j = 6, k = 9: from = Source\x00XXX to = Sourceati\x00 ret = to + 6
+i = 6, j = 7, k = 0: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 1: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 2: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 3: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 4: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 5: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 6: from = Source\x00XXX to = Source\x00YYY ret = to + 6
+i = 6, j = 7, k = 7: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 7, k = 8: from = Source\x00XXX to = Source\x00t\x00Y ret = to + 6
+i = 6, j = 7, k = 9: from = Source\x00XXX to = Source\x00ti\x00 ret = to + 6
+i = 6, j = 8, k = 0: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 8, k = 1: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 8, k = 2: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 8, k = 3: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 8, k = 4: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 8, k = 5: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 8, k = 6: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 8, k = 7: from = Source\x00XXX to = Source\x00\x00YY ret = to + 6
+i = 6, j = 8, k = 8: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 8, k = 9: from = Source\x00XXX to = Source\x00\x00i\x00 ret = to + 6
+i = 6, j = 9, k = 0: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 1: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 2: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 3: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 4: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 5: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 6: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 7: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 8: from = Source\x00XXX to = Source\x00\x00\x00Y ret = to + 6
+i = 6, j = 9, k = 9: from = Source\x00XXX to = Source\x00\x00\x00\x00 ret = to + 6
+i = 7, j = 0, k = 0: from = SourceS\x00XX to = \x00YYYYYYYYY ret = to + 0
+i = 7, j = 0, k = 1: from = SourceS\x00XX to = D\x00YYYYYYYY ret = to + 0
+i = 7, j = 0, k = 2: from = SourceS\x00XX to = De\x00YYYYYYY ret = to + 0
+i = 7, j = 0, k = 3: from = SourceS\x00XX to = Des\x00YYYYYY ret = to + 0
+i = 7, j = 0, k = 4: from = SourceS\x00XX to = Dest\x00YYYYY ret = to + 0
+i = 7, j = 0, k = 5: from = SourceS\x00XX to = Desti\x00YYYY ret = to + 0
+i = 7, j = 0, k = 6: from = SourceS\x00XX to = Destin\x00YYY ret = to + 0
+i = 7, j = 0, k = 7: from = SourceS\x00XX to = Destina\x00YY ret = to + 0
+i = 7, j = 0, k = 8: from = SourceS\x00XX to = Destinat\x00Y ret = to + 0
+i = 7, j = 0, k = 9: from = SourceS\x00XX to = Destinati\x00 ret = to + 0
+i = 7, j = 1, k = 0: from = SourceS\x00XX to = SYYYYYYYYY ret = to + 1
+i = 7, j = 1, k = 1: from = SourceS\x00XX to = S\x00YYYYYYYY ret = to + 1
+i = 7, j = 1, k = 2: from = SourceS\x00XX to = Se\x00YYYYYYY ret = to + 1
+i = 7, j = 1, k = 3: from = SourceS\x00XX to = Ses\x00YYYYYY ret = to + 1
+i = 7, j = 1, k = 4: from = SourceS\x00XX to = Sest\x00YYYYY ret = to + 1
+i = 7, j = 1, k = 5: from = SourceS\x00XX to = Sesti\x00YYYY ret = to + 1
+i = 7, j = 1, k = 6: from = SourceS\x00XX to = Sestin\x00YYY ret = to + 1
+i = 7, j = 1, k = 7: from = SourceS\x00XX to = Sestina\x00YY ret = to + 1
+i = 7, j = 1, k = 8: from = SourceS\x00XX to = Sestinat\x00Y ret = to + 1
+i = 7, j = 1, k = 9: from = SourceS\x00XX to = Sestinati\x00 ret = to + 1
+i = 7, j = 2, k = 0: from = SourceS\x00XX to = SoYYYYYYYY ret = to + 2
+i = 7, j = 2, k = 1: from = SourceS\x00XX to = SoYYYYYYYY ret = to + 2
+i = 7, j = 2, k = 2: from = SourceS\x00XX to = So\x00YYYYYYY ret = to + 2
+i = 7, j = 2, k = 3: from = SourceS\x00XX to = Sos\x00YYYYYY ret = to + 2
+i = 7, j = 2, k = 4: from = SourceS\x00XX to = Sost\x00YYYYY ret = to + 2
+i = 7, j = 2, k = 5: from = SourceS\x00XX to = Sosti\x00YYYY ret = to + 2
+i = 7, j = 2, k = 6: from = SourceS\x00XX to = Sostin\x00YYY ret = to + 2
+i = 7, j = 2, k = 7: from = SourceS\x00XX to = Sostina\x00YY ret = to + 2
+i = 7, j = 2, k = 8: from = SourceS\x00XX to = Sostinat\x00Y ret = to + 2
+i = 7, j = 2, k = 9: from = SourceS\x00XX to = Sostinati\x00 ret = to + 2
+i = 7, j = 3, k = 0: from = SourceS\x00XX to = SouYYYYYYY ret = to + 3
+i = 7, j = 3, k = 1: from = SourceS\x00XX to = SouYYYYYYY ret = to + 3
+i = 7, j = 3, k = 2: from = SourceS\x00XX to = SouYYYYYYY ret = to + 3
+i = 7, j = 3, k = 3: from = SourceS\x00XX to = Sou\x00YYYYYY ret = to + 3
+i = 7, j = 3, k = 4: from = SourceS\x00XX to = Sout\x00YYYYY ret = to + 3
+i = 7, j = 3, k = 5: from = SourceS\x00XX to = Souti\x00YYYY ret = to + 3
+i = 7, j = 3, k = 6: from = SourceS\x00XX to = Soutin\x00YYY ret = to + 3
+i = 7, j = 3, k = 7: from = SourceS\x00XX to = Soutina\x00YY ret = to + 3
+i = 7, j = 3, k = 8: from = SourceS\x00XX to = Soutinat\x00Y ret = to + 3
+i = 7, j = 3, k = 9: from = SourceS\x00XX to = Soutinati\x00 ret = to + 3
+i = 7, j = 4, k = 0: from = SourceS\x00XX to = SourYYYYYY ret = to + 4
+i = 7, j = 4, k = 1: from = SourceS\x00XX to = SourYYYYYY ret = to + 4
+i = 7, j = 4, k = 2: from = SourceS\x00XX to = SourYYYYYY ret = to + 4
+i = 7, j = 4, k = 3: from = SourceS\x00XX to = SourYYYYYY ret = to + 4
+i = 7, j = 4, k = 4: from = SourceS\x00XX to = Sour\x00YYYYY ret = to + 4
+i = 7, j = 4, k = 5: from = SourceS\x00XX to = Souri\x00YYYY ret = to + 4
+i = 7, j = 4, k = 6: from = SourceS\x00XX to = Sourin\x00YYY ret = to + 4
+i = 7, j = 4, k = 7: from = SourceS\x00XX to = Sourina\x00YY ret = to + 4
+i = 7, j = 4, k = 8: from = SourceS\x00XX to = Sourinat\x00Y ret = to + 4
+i = 7, j = 4, k = 9: from = SourceS\x00XX to = Sourinati\x00 ret = to + 4
+i = 7, j = 5, k = 0: from = SourceS\x00XX to = SourcYYYYY ret = to + 5
+i = 7, j = 5, k = 1: from = SourceS\x00XX to = SourcYYYYY ret = to + 5
+i = 7, j = 5, k = 2: from = SourceS\x00XX to = SourcYYYYY ret = to + 5
+i = 7, j = 5, k = 3: from = SourceS\x00XX to = SourcYYYYY ret = to + 5
+i = 7, j = 5, k = 4: from = SourceS\x00XX to = SourcYYYYY ret = to + 5
+i = 7, j = 5, k = 5: from = SourceS\x00XX to = Sourc\x00YYYY ret = to + 5
+i = 7, j = 5, k = 6: from = SourceS\x00XX to = Sourcn\x00YYY ret = to + 5
+i = 7, j = 5, k = 7: from = SourceS\x00XX to = Sourcna\x00YY ret = to + 5
+i = 7, j = 5, k = 8: from = SourceS\x00XX to = Sourcnat\x00Y ret = to + 5
+i = 7, j = 5, k = 9: from = SourceS\x00XX to = Sourcnati\x00 ret = to + 5
+i = 7, j = 6, k = 0: from = SourceS\x00XX to = SourceYYYY ret = to + 6
+i = 7, j = 6, k = 1: from = SourceS\x00XX to = SourceYYYY ret = to + 6
+i = 7, j = 6, k = 2: from = SourceS\x00XX to = SourceYYYY ret = to + 6
+i = 7, j = 6, k = 3: from = SourceS\x00XX to = SourceYYYY ret = to + 6
+i = 7, j = 6, k = 4: from = SourceS\x00XX to = SourceYYYY ret = to + 6
+i = 7, j = 6, k = 5: from = SourceS\x00XX to = SourceYYYY ret = to + 6
+i = 7, j = 6, k = 6: from = SourceS\x00XX to = Source\x00YYY ret = to + 6
+i = 7, j = 6, k = 7: from = SourceS\x00XX to = Sourcea\x00YY ret = to + 6
+i = 7, j = 6, k = 8: from = SourceS\x00XX to = Sourceat\x00Y ret = to + 6
+i = 7, j = 6, k = 9: from = SourceS\x00XX to = Sourceati\x00 ret = to + 6
+i = 7, j = 7, k = 0: from = SourceS\x00XX to = SourceSYYY ret = to + 7
+i = 7, j = 7, k = 1: from = SourceS\x00XX to = SourceSYYY ret = to + 7
+i = 7, j = 7, k = 2: from = SourceS\x00XX to = SourceSYYY ret = to + 7
+i = 7, j = 7, k = 3: from = SourceS\x00XX to = SourceSYYY ret = to + 7
+i = 7, j = 7, k = 4: from = SourceS\x00XX to = SourceSYYY ret = to + 7
+i = 7, j = 7, k = 5: from = SourceS\x00XX to = SourceSYYY ret = to + 7
+i = 7, j = 7, k = 6: from = SourceS\x00XX to = SourceSYYY ret = to + 7
+i = 7, j = 7, k = 7: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 7, k = 8: from = SourceS\x00XX to = SourceSt\x00Y ret = to + 7
+i = 7, j = 7, k = 9: from = SourceS\x00XX to = SourceSti\x00 ret = to + 7
+i = 7, j = 8, k = 0: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 1: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 2: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 3: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 4: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 5: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 6: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 7: from = SourceS\x00XX to = SourceS\x00YY ret = to + 7
+i = 7, j = 8, k = 8: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 8, k = 9: from = SourceS\x00XX to = SourceS\x00i\x00 ret = to + 7
+i = 7, j = 9, k = 0: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 1: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 2: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 3: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 4: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 5: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 6: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 7: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 8: from = SourceS\x00XX to = SourceS\x00\x00Y ret = to + 7
+i = 7, j = 9, k = 9: from = SourceS\x00XX to = SourceS\x00\x00\x00 ret = to + 7
+i = 8, j = 0, k = 0: from = SourceSt\x00X to = \x00YYYYYYYYY ret = to + 0
+i = 8, j = 0, k = 1: from = SourceSt\x00X to = D\x00YYYYYYYY ret = to + 0
+i = 8, j = 0, k = 2: from = SourceSt\x00X to = De\x00YYYYYYY ret = to + 0
+i = 8, j = 0, k = 3: from = SourceSt\x00X to = Des\x00YYYYYY ret = to + 0
+i = 8, j = 0, k = 4: from = SourceSt\x00X to = Dest\x00YYYYY ret = to + 0
+i = 8, j = 0, k = 5: from = SourceSt\x00X to = Desti\x00YYYY ret = to + 0
+i = 8, j = 0, k = 6: from = SourceSt\x00X to = Destin\x00YYY ret = to + 0
+i = 8, j = 0, k = 7: from = SourceSt\x00X to = Destina\x00YY ret = to + 0
+i = 8, j = 0, k = 8: from = SourceSt\x00X to = Destinat\x00Y ret = to + 0
+i = 8, j = 0, k = 9: from = SourceSt\x00X to = Destinati\x00 ret = to + 0
+i = 8, j = 1, k = 0: from = SourceSt\x00X to = SYYYYYYYYY ret = to + 1
+i = 8, j = 1, k = 1: from = SourceSt\x00X to = S\x00YYYYYYYY ret = to + 1
+i = 8, j = 1, k = 2: from = SourceSt\x00X to = Se\x00YYYYYYY ret = to + 1
+i = 8, j = 1, k = 3: from = SourceSt\x00X to = Ses\x00YYYYYY ret = to + 1
+i = 8, j = 1, k = 4: from = SourceSt\x00X to = Sest\x00YYYYY ret = to + 1
+i = 8, j = 1, k = 5: from = SourceSt\x00X to = Sesti\x00YYYY ret = to + 1
+i = 8, j = 1, k = 6: from = SourceSt\x00X to = Sestin\x00YYY ret = to + 1
+i = 8, j = 1, k = 7: from = SourceSt\x00X to = Sestina\x00YY ret = to + 1
+i = 8, j = 1, k = 8: from = SourceSt\x00X to = Sestinat\x00Y ret = to + 1
+i = 8, j = 1, k = 9: from = SourceSt\x00X to = Sestinati\x00 ret = to + 1
+i = 8, j = 2, k = 0: from = SourceSt\x00X to = SoYYYYYYYY ret = to + 2
+i = 8, j = 2, k = 1: from = SourceSt\x00X to = SoYYYYYYYY ret = to + 2
+i = 8, j = 2, k = 2: from = SourceSt\x00X to = So\x00YYYYYYY ret = to + 2
+i = 8, j = 2, k = 3: from = SourceSt\x00X to = Sos\x00YYYYYY ret = to + 2
+i = 8, j = 2, k = 4: from = SourceSt\x00X to = Sost\x00YYYYY ret = to + 2
+i = 8, j = 2, k = 5: from = SourceSt\x00X to = Sosti\x00YYYY ret = to + 2
+i = 8, j = 2, k = 6: from = SourceSt\x00X to = Sostin\x00YYY ret = to + 2
+i = 8, j = 2, k = 7: from = SourceSt\x00X to = Sostina\x00YY ret = to + 2
+i = 8, j = 2, k = 8: from = SourceSt\x00X to = Sostinat\x00Y ret = to + 2
+i = 8, j = 2, k = 9: from = SourceSt\x00X to = Sostinati\x00 ret = to + 2
+i = 8, j = 3, k = 0: from = SourceSt\x00X to = SouYYYYYYY ret = to + 3
+i = 8, j = 3, k = 1: from = SourceSt\x00X to = SouYYYYYYY ret = to + 3
+i = 8, j = 3, k = 2: from = SourceSt\x00X to = SouYYYYYYY ret = to + 3
+i = 8, j = 3, k = 3: from = SourceSt\x00X to = Sou\x00YYYYYY ret = to + 3
+i = 8, j = 3, k = 4: from = SourceSt\x00X to = Sout\x00YYYYY ret = to + 3
+i = 8, j = 3, k = 5: from = SourceSt\x00X to = Souti\x00YYYY ret = to + 3
+i = 8, j = 3, k = 6: from = SourceSt\x00X to = Soutin\x00YYY ret = to + 3
+i = 8, j = 3, k = 7: from = SourceSt\x00X to = Soutina\x00YY ret = to + 3
+i = 8, j = 3, k = 8: from = SourceSt\x00X to = Soutinat\x00Y ret = to + 3
+i = 8, j = 3, k = 9: from = SourceSt\x00X to = Soutinati\x00 ret = to + 3
+i = 8, j = 4, k = 0: from = SourceSt\x00X to = SourYYYYYY ret = to + 4
+i = 8, j = 4, k = 1: from = SourceSt\x00X to = SourYYYYYY ret = to + 4
+i = 8, j = 4, k = 2: from = SourceSt\x00X to = SourYYYYYY ret = to + 4
+i = 8, j = 4, k = 3: from = SourceSt\x00X to = SourYYYYYY ret = to + 4
+i = 8, j = 4, k = 4: from = SourceSt\x00X to = Sour\x00YYYYY ret = to + 4
+i = 8, j = 4, k = 5: from = SourceSt\x00X to = Souri\x00YYYY ret = to + 4
+i = 8, j = 4, k = 6: from = SourceSt\x00X to = Sourin\x00YYY ret = to + 4
+i = 8, j = 4, k = 7: from = SourceSt\x00X to = Sourina\x00YY ret = to + 4
+i = 8, j = 4, k = 8: from = SourceSt\x00X to = Sourinat\x00Y ret = to + 4
+i = 8, j = 4, k = 9: from = SourceSt\x00X to = Sourinati\x00 ret = to + 4
+i = 8, j = 5, k = 0: from = SourceSt\x00X to = SourcYYYYY ret = to + 5
+i = 8, j = 5, k = 1: from = SourceSt\x00X to = SourcYYYYY ret = to + 5
+i = 8, j = 5, k = 2: from = SourceSt\x00X to = SourcYYYYY ret = to + 5
+i = 8, j = 5, k = 3: from = SourceSt\x00X to = SourcYYYYY ret = to + 5
+i = 8, j = 5, k = 4: from = SourceSt\x00X to = SourcYYYYY ret = to + 5
+i = 8, j = 5, k = 5: from = SourceSt\x00X to = Sourc\x00YYYY ret = to + 5
+i = 8, j = 5, k = 6: from = SourceSt\x00X to = Sourcn\x00YYY ret = to + 5
+i = 8, j = 5, k = 7: from = SourceSt\x00X to = Sourcna\x00YY ret = to + 5
+i = 8, j = 5, k = 8: from = SourceSt\x00X to = Sourcnat\x00Y ret = to + 5
+i = 8, j = 5, k = 9: from = SourceSt\x00X to = Sourcnati\x00 ret = to + 5
+i = 8, j = 6, k = 0: from = SourceSt\x00X to = SourceYYYY ret = to + 6
+i = 8, j = 6, k = 1: from = SourceSt\x00X to = SourceYYYY ret = to + 6
+i = 8, j = 6, k = 2: from = SourceSt\x00X to = SourceYYYY ret = to + 6
+i = 8, j = 6, k = 3: from = SourceSt\x00X to = SourceYYYY ret = to + 6
+i = 8, j = 6, k = 4: from = SourceSt\x00X to = SourceYYYY ret = to + 6
+i = 8, j = 6, k = 5: from = SourceSt\x00X to = SourceYYYY ret = to + 6
+i = 8, j = 6, k = 6: from = SourceSt\x00X to = Source\x00YYY ret = to + 6
+i = 8, j = 6, k = 7: from = SourceSt\x00X to = Sourcea\x00YY ret = to + 6
+i = 8, j = 6, k = 8: from = SourceSt\x00X to = Sourceat\x00Y ret = to + 6
+i = 8, j = 6, k = 9: from = SourceSt\x00X to = Sourceati\x00 ret = to + 6
+i = 8, j = 7, k = 0: from = SourceSt\x00X to = SourceSYYY ret = to + 7
+i = 8, j = 7, k = 1: from = SourceSt\x00X to = SourceSYYY ret = to + 7
+i = 8, j = 7, k = 2: from = SourceSt\x00X to = SourceSYYY ret = to + 7
+i = 8, j = 7, k = 3: from = SourceSt\x00X to = SourceSYYY ret = to + 7
+i = 8, j = 7, k = 4: from = SourceSt\x00X to = SourceSYYY ret = to + 7
+i = 8, j = 7, k = 5: from = SourceSt\x00X to = SourceSYYY ret = to + 7
+i = 8, j = 7, k = 6: from = SourceSt\x00X to = SourceSYYY ret = to + 7
+i = 8, j = 7, k = 7: from = SourceSt\x00X to = SourceS\x00YY ret = to + 7
+i = 8, j = 7, k = 8: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 7
+i = 8, j = 7, k = 9: from = SourceSt\x00X to = SourceSti\x00 ret = to + 7
+i = 8, j = 8, k = 0: from = SourceSt\x00X to = SourceStYY ret = to + 8
+i = 8, j = 8, k = 1: from = SourceSt\x00X to = SourceStYY ret = to + 8
+i = 8, j = 8, k = 2: from = SourceSt\x00X to = SourceStYY ret = to + 8
+i = 8, j = 8, k = 3: from = SourceSt\x00X to = SourceStYY ret = to + 8
+i = 8, j = 8, k = 4: from = SourceSt\x00X to = SourceStYY ret = to + 8
+i = 8, j = 8, k = 5: from = SourceSt\x00X to = SourceStYY ret = to + 8
+i = 8, j = 8, k = 6: from = SourceSt\x00X to = SourceStYY ret = to + 8
+i = 8, j = 8, k = 7: from = SourceSt\x00X to = SourceStYY ret = to + 8
+i = 8, j = 8, k = 8: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 8, k = 9: from = SourceSt\x00X to = SourceSti\x00 ret = to + 8
+i = 8, j = 9, k = 0: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 1: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 2: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 3: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 4: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 5: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 6: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 7: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 8: from = SourceSt\x00X to = SourceSt\x00Y ret = to + 8
+i = 8, j = 9, k = 9: from = SourceSt\x00X to = SourceSt\x00\x00 ret = to + 8
+i = 9, j = 0, k = 0: from = SourceStr\x00 to = \x00YYYYYYYYY ret = to + 0
+i = 9, j = 0, k = 1: from = SourceStr\x00 to = D\x00YYYYYYYY ret = to + 0
+i = 9, j = 0, k = 2: from = SourceStr\x00 to = De\x00YYYYYYY ret = to + 0
+i = 9, j = 0, k = 3: from = SourceStr\x00 to = Des\x00YYYYYY ret = to + 0
+i = 9, j = 0, k = 4: from = SourceStr\x00 to = Dest\x00YYYYY ret = to + 0
+i = 9, j = 0, k = 5: from = SourceStr\x00 to = Desti\x00YYYY ret = to + 0
+i = 9, j = 0, k = 6: from = SourceStr\x00 to = Destin\x00YYY ret = to + 0
+i = 9, j = 0, k = 7: from = SourceStr\x00 to = Destina\x00YY ret = to + 0
+i = 9, j = 0, k = 8: from = SourceStr\x00 to = Destinat\x00Y ret = to + 0
+i = 9, j = 0, k = 9: from = SourceStr\x00 to = Destinati\x00 ret = to + 0
+i = 9, j = 1, k = 0: from = SourceStr\x00 to = SYYYYYYYYY ret = to + 1
+i = 9, j = 1, k = 1: from = SourceStr\x00 to = S\x00YYYYYYYY ret = to + 1
+i = 9, j = 1, k = 2: from = SourceStr\x00 to = Se\x00YYYYYYY ret = to + 1
+i = 9, j = 1, k = 3: from = SourceStr\x00 to = Ses\x00YYYYYY ret = to + 1
+i = 9, j = 1, k = 4: from = SourceStr\x00 to = Sest\x00YYYYY ret = to + 1
+i = 9, j = 1, k = 5: from = SourceStr\x00 to = Sesti\x00YYYY ret = to + 1
+i = 9, j = 1, k = 6: from = SourceStr\x00 to = Sestin\x00YYY ret = to + 1
+i = 9, j = 1, k = 7: from = SourceStr\x00 to = Sestina\x00YY ret = to + 1
+i = 9, j = 1, k = 8: from = SourceStr\x00 to = Sestinat\x00Y ret = to + 1
+i = 9, j = 1, k = 9: from = SourceStr\x00 to = Sestinati\x00 ret = to + 1
+i = 9, j = 2, k = 0: from = SourceStr\x00 to = SoYYYYYYYY ret = to + 2
+i = 9, j = 2, k = 1: from = SourceStr\x00 to = SoYYYYYYYY ret = to + 2
+i = 9, j = 2, k = 2: from = SourceStr\x00 to = So\x00YYYYYYY ret = to + 2
+i = 9, j = 2, k = 3: from = SourceStr\x00 to = Sos\x00YYYYYY ret = to + 2
+i = 9, j = 2, k = 4: from = SourceStr\x00 to = Sost\x00YYYYY ret = to + 2
+i = 9, j = 2, k = 5: from = SourceStr\x00 to = Sosti\x00YYYY ret = to + 2
+i = 9, j = 2, k = 6: from = SourceStr\x00 to = Sostin\x00YYY ret = to + 2
+i = 9, j = 2, k = 7: from = SourceStr\x00 to = Sostina\x00YY ret = to + 2
+i = 9, j = 2, k = 8: from = SourceStr\x00 to = Sostinat\x00Y ret = to + 2
+i = 9, j = 2, k = 9: from = SourceStr\x00 to = Sostinati\x00 ret = to + 2
+i = 9, j = 3, k = 0: from = SourceStr\x00 to = SouYYYYYYY ret = to + 3
+i = 9, j = 3, k = 1: from = SourceStr\x00 to = SouYYYYYYY ret = to + 3
+i = 9, j = 3, k = 2: from = SourceStr\x00 to = SouYYYYYYY ret = to + 3
+i = 9, j = 3, k = 3: from = SourceStr\x00 to = Sou\x00YYYYYY ret = to + 3
+i = 9, j = 3, k = 4: from = SourceStr\x00 to = Sout\x00YYYYY ret = to + 3
+i = 9, j = 3, k = 5: from = SourceStr\x00 to = Souti\x00YYYY ret = to + 3
+i = 9, j = 3, k = 6: from = SourceStr\x00 to = Soutin\x00YYY ret = to + 3
+i = 9, j = 3, k = 7: from = SourceStr\x00 to = Soutina\x00YY ret = to + 3
+i = 9, j = 3, k = 8: from = SourceStr\x00 to = Soutinat\x00Y ret = to + 3
+i = 9, j = 3, k = 9: from = SourceStr\x00 to = Soutinati\x00 ret = to + 3
+i = 9, j = 4, k = 0: from = SourceStr\x00 to = SourYYYYYY ret = to + 4
+i = 9, j = 4, k = 1: from = SourceStr\x00 to = SourYYYYYY ret = to + 4
+i = 9, j = 4, k = 2: from = SourceStr\x00 to = SourYYYYYY ret = to + 4
+i = 9, j = 4, k = 3: from = SourceStr\x00 to = SourYYYYYY ret = to + 4
+i = 9, j = 4, k = 4: from = SourceStr\x00 to = Sour\x00YYYYY ret = to + 4
+i = 9, j = 4, k = 5: from = SourceStr\x00 to = Souri\x00YYYY ret = to + 4
+i = 9, j = 4, k = 6: from = SourceStr\x00 to = Sourin\x00YYY ret = to + 4
+i = 9, j = 4, k = 7: from = SourceStr\x00 to = Sourina\x00YY ret = to + 4
+i = 9, j = 4, k = 8: from = SourceStr\x00 to = Sourinat\x00Y ret = to + 4
+i = 9, j = 4, k = 9: from = SourceStr\x00 to = Sourinati\x00 ret = to + 4
+i = 9, j = 5, k = 0: from = SourceStr\x00 to = SourcYYYYY ret = to + 5
+i = 9, j = 5, k = 1: from = SourceStr\x00 to = SourcYYYYY ret = to + 5
+i = 9, j = 5, k = 2: from = SourceStr\x00 to = SourcYYYYY ret = to + 5
+i = 9, j = 5, k = 3: from = SourceStr\x00 to = SourcYYYYY ret = to + 5
+i = 9, j = 5, k = 4: from = SourceStr\x00 to = SourcYYYYY ret = to + 5
+i = 9, j = 5, k = 5: from = SourceStr\x00 to = Sourc\x00YYYY ret = to + 5
+i = 9, j = 5, k = 6: from = SourceStr\x00 to = Sourcn\x00YYY ret = to + 5
+i = 9, j = 5, k = 7: from = SourceStr\x00 to = Sourcna\x00YY ret = to + 5
+i = 9, j = 5, k = 8: from = SourceStr\x00 to = Sourcnat\x00Y ret = to + 5
+i = 9, j = 5, k = 9: from = SourceStr\x00 to = Sourcnati\x00 ret = to + 5
+i = 9, j = 6, k = 0: from = SourceStr\x00 to = SourceYYYY ret = to + 6
+i = 9, j = 6, k = 1: from = SourceStr\x00 to = SourceYYYY ret = to + 6
+i = 9, j = 6, k = 2: from = SourceStr\x00 to = SourceYYYY ret = to + 6
+i = 9, j = 6, k = 3: from = SourceStr\x00 to = SourceYYYY ret = to + 6
+i = 9, j = 6, k = 4: from = SourceStr\x00 to = SourceYYYY ret = to + 6
+i = 9, j = 6, k = 5: from = SourceStr\x00 to = SourceYYYY ret = to + 6
+i = 9, j = 6, k = 6: from = SourceStr\x00 to = Source\x00YYY ret = to + 6
+i = 9, j = 6, k = 7: from = SourceStr\x00 to = Sourcea\x00YY ret = to + 6
+i = 9, j = 6, k = 8: from = SourceStr\x00 to = Sourceat\x00Y ret = to + 6
+i = 9, j = 6, k = 9: from = SourceStr\x00 to = Sourceati\x00 ret = to + 6
+i = 9, j = 7, k = 0: from = SourceStr\x00 to = SourceSYYY ret = to + 7
+i = 9, j = 7, k = 1: from = SourceStr\x00 to = SourceSYYY ret = to + 7
+i = 9, j = 7, k = 2: from = SourceStr\x00 to = SourceSYYY ret = to + 7
+i = 9, j = 7, k = 3: from = SourceStr\x00 to = SourceSYYY ret = to + 7
+i = 9, j = 7, k = 4: from = SourceStr\x00 to = SourceSYYY ret = to + 7
+i = 9, j = 7, k = 5: from = SourceStr\x00 to = SourceSYYY ret = to + 7
+i = 9, j = 7, k = 6: from = SourceStr\x00 to = SourceSYYY ret = to + 7
+i = 9, j = 7, k = 7: from = SourceStr\x00 to = SourceS\x00YY ret = to + 7
+i = 9, j = 7, k = 8: from = SourceStr\x00 to = SourceSt\x00Y ret = to + 7
+i = 9, j = 7, k = 9: from = SourceStr\x00 to = SourceSti\x00 ret = to + 7
+i = 9, j = 8, k = 0: from = SourceStr\x00 to = SourceStYY ret = to + 8
+i = 9, j = 8, k = 1: from = SourceStr\x00 to = SourceStYY ret = to + 8
+i = 9, j = 8, k = 2: from = SourceStr\x00 to = SourceStYY ret = to + 8
+i = 9, j = 8, k = 3: from = SourceStr\x00 to = SourceStYY ret = to + 8
+i = 9, j = 8, k = 4: from = SourceStr\x00 to = SourceStYY ret = to + 8
+i = 9, j = 8, k = 5: from = SourceStr\x00 to = SourceStYY ret = to + 8
+i = 9, j = 8, k = 6: from = SourceStr\x00 to = SourceStYY ret = to + 8
+i = 9, j = 8, k = 7: from = SourceStr\x00 to = SourceStYY ret = to + 8
+i = 9, j = 8, k = 8: from = SourceStr\x00 to = SourceSt\x00Y ret = to + 8
+i = 9, j = 8, k = 9: from = SourceStr\x00 to = SourceSti\x00 ret = to + 8
+i = 9, j = 9, k = 0: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 1: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 2: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 3: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 4: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 5: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 6: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 7: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 8: from = SourceStr\x00 to = SourceStrY ret = to + 9
+i = 9, j = 9, k = 9: from = SourceStr\x00 to = SourceStr\x00 ret = to + 9
diff --git a/gnulib/tests/test-strcasestr.c b/gnulib/tests/test-strcasestr.c
new file mode 100644
index 00000000..ed563b2f
--- /dev/null
+++ b/gnulib/tests/test-strcasestr.c
@@ -0,0 +1,147 @@
+/* Test of case-insensitive searching in a string.
+ Copyright (C) 2007, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (strcasestr, char *, (char const *, char const *));
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. All known platforms that lack alarm also lack
+ strcasestr, and the replacement strcasestr is known to not take too
+ long. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ {
+ const char input[] = "foo";
+ const char *result = strcasestr (input, "");
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "foo";
+ const char *result = strcasestr (input, "O");
+ ASSERT (result == input + 1);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = strcasestr (input, "ABCDaBD");
+ ASSERT (result == input + 15);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = strcasestr (input, "ABCDaBE");
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = strcasestr (input, "ABCDaBCD");
+ ASSERT (result == input + 11);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaAAAAaaaaaaa"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'A', m);
+ haystack[0] = 'B';
+ haystack[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (strcasestr (haystack, needle) == haystack + 1);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+ needle[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (strcasestr (haystack, needle) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 2);
+ char *needle = (char *) malloc (m + 2);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ haystack[2 * m + 1] = '\0';
+
+ memset (needle, 'a', m);
+ needle[m] = 'B';
+ needle[m + 1] = '\0';
+
+ result = strcasestr (haystack, needle);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-strchrnul.c b/gnulib/tests/test-strchrnul.c
new file mode 100644
index 00000000..49d8278c
--- /dev/null
+++ b/gnulib/tests/test-strchrnul.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Eric Blake and Bruno Haible
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (strchrnul, char *, (char const *, int));
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ size_t n = 0x100000;
+ char *input = malloc (n + 1);
+ ASSERT (input);
+
+ input[0] = 'a';
+ input[1] = 'b';
+ memset (input + 2, 'c', 1024);
+ memset (input + 1026, 'd', n - 1028);
+ input[n - 2] = 'e';
+ input[n - 1] = 'a';
+ input[n] = '\0';
+
+ /* Basic behavior tests. */
+ ASSERT (strchrnul (input, 'a') == input);
+ ASSERT (strchrnul (input, 'b') == input + 1);
+ ASSERT (strchrnul (input, 'c') == input + 2);
+ ASSERT (strchrnul (input, 'd') == input + 1026);
+
+ ASSERT (strchrnul (input + 1, 'a') == input + n - 1);
+ ASSERT (strchrnul (input + 1, 'e') == input + n - 2);
+
+ ASSERT (strchrnul (input, 'f') == input + n);
+ ASSERT (strchrnul (input, '\0') == input + n);
+
+ /* Check that a very long haystack is handled quickly if the byte is
+ found near the beginning. */
+ {
+ size_t repeat = 10000;
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (strchrnul (input, 'c') == input + 2);
+ }
+ }
+
+ /* Alignment tests. */
+ {
+ int i, j;
+ for (i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 256; j++)
+ input[i + j] = (j + 1) & 0xff;
+ for (j = 1; j < 256; j++)
+ {
+ ASSERT (strchrnul (input + i, j) == input + i + j - 1);
+ input[i + j - 1] = (j == 1 ? 2 : 1);
+ ASSERT (strchrnul (input + i, j) == input + i + 255);
+ input[i + j - 1] = j;
+ }
+ }
+ }
+
+ free (input);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-strerror.c b/gnulib/tests/test-strerror.c
new file mode 100644
index 00000000..11ab7e39
--- /dev/null
+++ b/gnulib/tests/test-strerror.c
@@ -0,0 +1,57 @@
+/* Test of strerror() function.
+ Copyright (C) 2007-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (strerror, char *, (int));
+
+#include <errno.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ char *str;
+
+ str = strerror (EACCES);
+ ASSERT (str);
+ ASSERT (*str);
+
+ str = strerror (ETIMEDOUT);
+ ASSERT (str);
+ ASSERT (*str);
+
+ str = strerror (EOVERFLOW);
+ ASSERT (str);
+ ASSERT (*str);
+
+ str = strerror (0);
+ ASSERT (str);
+ ASSERT (*str);
+
+ str = strerror (-3);
+ ASSERT (str);
+ ASSERT (*str);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-striconv.c b/gnulib/tests/test-striconv.c
new file mode 100644
index 00000000..d0f249da
--- /dev/null
+++ b/gnulib/tests/test-striconv.c
@@ -0,0 +1,180 @@
+/* Test of character set conversion.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "striconv.h"
+
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ and UTF-8. */
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8");
+
+ ASSERT (cd_88591_to_utf8 != (iconv_t)(-1));
+ ASSERT (cd_utf8_to_88591 != (iconv_t)(-1));
+
+ /* ------------------------- Test mem_cd_iconv() ------------------------- */
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ {
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconv (input, strlen (input), cd_88591_to_utf8,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ {
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ {
+ static const char input[] = "\342\202\254"; /* EURO SIGN */
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
+ &result, &length);
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ {
+ static const char input[] = "\342";
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == 0);
+ free (result);
+ }
+
+ /* ------------------------- Test str_cd_iconv() ------------------------- */
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ {
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ char *result = str_cd_iconv (input, cd_88591_to_utf8);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ {
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = str_cd_iconv (input, cd_utf8_to_88591);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ {
+ static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
+ char *result = str_cd_iconv (input, cd_utf8_to_88591);
+ ASSERT (result == NULL && errno == EILSEQ);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ {
+ static const char input[] = "\342";
+ char *result = str_cd_iconv (input, cd_utf8_to_88591);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+
+ iconv_close (cd_88591_to_utf8);
+ iconv_close (cd_utf8_to_88591);
+
+ /* -------------------------- Test str_iconv() -------------------------- */
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ {
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ char *result = str_iconv (input, "ISO-8859-1", "UTF-8");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ {
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ {
+ static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
+ char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
+ ASSERT (result == NULL && errno == EILSEQ);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ {
+ static const char input[] = "\342";
+ char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-striconveh.c b/gnulib/tests/test-striconveh.c
new file mode 100644
index 00000000..679bb0ed
--- /dev/null
+++ b/gnulib/tests/test-striconveh.c
@@ -0,0 +1,1108 @@
+/* Test of character set conversion with error handling.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "striconveh.h"
+
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+/* Magic number for detecting bounds violations. */
+#define MAGIC 0x1983EFF1
+
+static size_t *
+new_offsets (size_t n)
+{
+ size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
+ offsets[n] = MAGIC;
+ return offsets;
+}
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t indirect;
+ size_t h;
+ size_t o;
+ size_t i;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO-8859-1", "ASCII");
+ iconv_t cd_88591_to_88592 = iconv_open ("ISO-8859-2", "ISO-8859-1");
+ iconv_t cd_88592_to_88591 = iconv_open ("ISO-8859-1", "ISO-8859-2");
+ iconv_t cd_ascii_to_utf8 = iconv_open ("UTF-8", "ASCII");
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8");
+ iconv_t cd_88592_to_utf8 = iconv_open ("UTF-8", "ISO-8859-2");
+ iconv_t cd_utf8_to_88592 = iconv_open ("ISO-8859-2", "UTF-8");
+ iconv_t cd_utf7_to_utf8 = iconv_open ("UTF-8", "UTF-7");
+ iconveh_t cdeh_ascii_to_88591;
+ iconveh_t cdeh_ascii_to_88591_indirectly;
+ iconveh_t cdeh_88592_to_88591;
+ iconveh_t cdeh_88592_to_88591_indirectly;
+ iconveh_t cdeh_ascii_to_utf8;
+ iconveh_t cdeh_88591_to_utf8;
+ iconveh_t cdeh_utf8_to_88591;
+ iconveh_t cdeh_utf7_to_utf8;
+
+ ASSERT (cd_ascii_to_utf8 != (iconv_t)(-1));
+ ASSERT (cd_88591_to_utf8 != (iconv_t)(-1));
+ ASSERT (cd_utf8_to_88591 != (iconv_t)(-1));
+ ASSERT (cd_88592_to_utf8 != (iconv_t)(-1));
+ ASSERT (cd_utf8_to_88592 != (iconv_t)(-1));
+
+ cdeh_ascii_to_88591.cd = cd_ascii_to_88591;
+ cdeh_ascii_to_88591.cd1 = cd_ascii_to_utf8;
+ cdeh_ascii_to_88591.cd2 = cd_utf8_to_88591;
+
+ cdeh_ascii_to_88591_indirectly.cd = (iconv_t)(-1);
+ cdeh_ascii_to_88591_indirectly.cd1 = cd_ascii_to_utf8;
+ cdeh_ascii_to_88591_indirectly.cd2 = cd_utf8_to_88591;
+
+ cdeh_88592_to_88591.cd = cd_88592_to_88591;
+ cdeh_88592_to_88591.cd1 = cd_88592_to_utf8;
+ cdeh_88592_to_88591.cd2 = cd_utf8_to_88591;
+
+ cdeh_88592_to_88591_indirectly.cd = (iconv_t)(-1);
+ cdeh_88592_to_88591_indirectly.cd1 = cd_88592_to_utf8;
+ cdeh_88592_to_88591_indirectly.cd2 = cd_utf8_to_88591;
+
+ cdeh_ascii_to_utf8.cd = cd_ascii_to_utf8;
+ cdeh_ascii_to_utf8.cd1 = cd_ascii_to_utf8;
+ cdeh_ascii_to_utf8.cd2 = (iconv_t)(-1);
+
+ cdeh_88591_to_utf8.cd = cd_88591_to_utf8;
+ cdeh_88591_to_utf8.cd1 = cd_88591_to_utf8;
+ cdeh_88591_to_utf8.cd2 = (iconv_t)(-1);
+
+ cdeh_utf8_to_88591.cd = cd_utf8_to_88591;
+ cdeh_utf8_to_88591.cd1 = (iconv_t)(-1);
+ cdeh_utf8_to_88591.cd2 = cd_utf8_to_88591;
+
+ cdeh_utf7_to_utf8.cd = cd_utf7_to_utf8;
+ cdeh_utf7_to_utf8.cd1 = cd_utf7_to_utf8;
+ cdeh_utf7_to_utf8.cd2 = (iconv_t)(-1);
+
+ /* ------------------------ Test mem_cd_iconveh() ------------------------ */
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with no errors. */
+ for (indirect = 0; indirect <= 1; indirect++)
+ {
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ (indirect
+ ? &cdeh_88592_to_88591_indirectly
+ : &cdeh_88592_to_88591),
+ handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ }
+
+ /* Test conversion from ASCII to ISO-8859-1 with invalid input (EILSEQ). */
+ for (indirect = 0; indirect <= 1; indirect++)
+ {
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafa? Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ (indirect
+ ? &cdeh_ascii_to_88591_indirectly
+ : &cdeh_ascii_to_88591),
+ handler,
+ offsets,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ if (o)
+ free (offsets);
+ break;
+ case iconveh_question_mark:
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with EILSEQ. */
+ for (indirect = 0; indirect <= 1; indirect++)
+ {
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ (indirect
+ ? &cdeh_88592_to_88591_indirectly
+ : &cdeh_88592_to_88591),
+ handler,
+ offsets,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ if (o)
+ free (offsets);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i + 5));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ &cdeh_88591_to_utf8,
+ handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == (i < 1 ? i :
+ i < 12 ? i + 1 :
+ i < 18 ? i + 2 :
+ i + 3));
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ &cdeh_utf8_to_88591,
+ handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 41; i++)
+ ASSERT (offsets[i] == (i < 1 ? i :
+ i == 1 ? (size_t)(-1) :
+ i < 13 ? i - 1 :
+ i == 13 ? (size_t)(-1) :
+ i < 20 ? i - 2 :
+ i == 20 ? (size_t)(-1) :
+ i < 40 ? i - 3 :
+ (size_t)(-1)));
+ ASSERT (offsets[41] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from ASCII to UTF-8 with invalid input (EILSEQ). */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafa? Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ &cdeh_ascii_to_utf8,
+ handler,
+ offsets,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ if (o)
+ free (offsets);
+ break;
+ case iconveh_question_mark:
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ &cdeh_utf8_to_88591,
+ handler,
+ offsets,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ if (o)
+ free (offsets);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 17; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i == 5 ? (size_t)(-1) :
+ i - 1));
+ ASSERT (offsets[17] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 17; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i == 5 ? (size_t)(-1) :
+ i + 4));
+ ASSERT (offsets[17] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\342";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ &cdeh_utf8_to_88591,
+ handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == 0);
+ if (o)
+ {
+ ASSERT (offsets[0] == 0);
+ ASSERT (offsets[1] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ if (cd_utf7_to_utf8 != (iconv_t)(-1))
+ {
+ /* Disabled on Solaris, because Solaris 9 iconv() is buggy: it returns
+ -1 / EILSEQ when converting the 7th byte of the input "+VDLYP9hA". */
+# if !(defined __sun && !defined _LIBICONV_VERSION)
+ /* Test conversion from UTF-7 to UTF-8 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ /* This is base64 encoded 0x54 0x32 0xD8 0x3F 0xD8 0x40. It would
+ convert to U+5432 U+D83F U+D840 but these are Unicode surrogates. */
+ static const char input[] = "+VDLYP9hA";
+ static const char expected1[] = "\345\220\262"; /* 吲 glibc */
+ static const char expected2[] = ""; /* libiconv */
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, 7,
+ &cdeh_utf7_to_utf8,
+ handler,
+ NULL,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected1) || length == strlen (expected2));
+ ASSERT (result != NULL);
+ if (length == strlen (expected1))
+ ASSERT (memcmp (result, expected1, strlen (expected1)) == 0);
+ else
+ ASSERT (memcmp (result, expected2, strlen (expected2)) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-7 to UTF-8 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ /* This is base64 encoded 0xD8 0x3F 0xD8 0x40 0xD8 0x41. It would
+ convert to U+D83F U+D840 U+D841 but these are Unicode surrogates. */
+ static const char input[] = "+2D/YQNhB";
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh (input, strlen (input),
+ &cdeh_utf7_to_utf8,
+ handler,
+ NULL,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ break;
+ case iconveh_question_mark:
+ case iconveh_escape_sequence:
+ {
+ /* glibc result */
+ static const char expected1[] = "?????";
+ /* libiconv <= 1.12 result */
+ static const char expected2[] = "?2D/YQNhB";
+ /* libiconv behaviour changed in version 1.13: the result is
+ '?' U+0FF6 U+1036; this is U+D83F U+D840 U+D841 shifted left
+ by 6 bits. */
+ static const char expected3[] = "?\340\277\266\341\200\266";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected1)
+ || length == strlen (expected2)
+ || length == strlen (expected3));
+ ASSERT (result != NULL);
+ if (length == strlen (expected1))
+ ASSERT (memcmp (result, expected1, strlen (expected1)) == 0);
+ else if (length == strlen (expected2))
+ ASSERT (memcmp (result, expected2, strlen (expected2)) == 0);
+ else
+ ASSERT (memcmp (result, expected3, strlen (expected3)) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+# endif
+ }
+
+ /* ------------------------ Test str_cd_iconveh() ------------------------ */
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with no errors. */
+ for (indirect = 0; indirect <= 1; indirect++)
+ {
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = str_cd_iconveh (input,
+ (indirect
+ ? &cdeh_88592_to_88591_indirectly
+ : &cdeh_88592_to_88591),
+ handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ /* Test conversion from ASCII to ISO-8859-1 with invalid input (EILSEQ). */
+ for (indirect = 0; indirect <= 1; indirect++)
+ {
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafa? Maszkowski */
+ char *result = str_cd_iconveh (input,
+ (indirect
+ ? &cdeh_ascii_to_88591_indirectly
+ : &cdeh_ascii_to_88591),
+ handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with EILSEQ. */
+ for (indirect = 0; indirect <= 1; indirect++)
+ {
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ char *result = str_cd_iconveh (input,
+ (indirect
+ ? &cdeh_88592_to_88591_indirectly
+ : &cdeh_88592_to_88591),
+ handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ char *result = str_cd_iconveh (input,
+ &cdeh_88591_to_utf8,
+ handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = str_cd_iconveh (input,
+ &cdeh_utf8_to_88591,
+ handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from ASCII to UTF-8 with invalid input (EILSEQ). */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafa? Maszkowski */
+ char *result = str_cd_iconveh (input,
+ &cdeh_ascii_to_utf8,
+ handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
+ char *result = str_cd_iconveh (input,
+ &cdeh_utf8_to_88591,
+ handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Costs: 27 ?";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Costs: 27 \\u20AC";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\342";
+ char *result = str_cd_iconveh (input,
+ &cdeh_utf8_to_88591,
+ handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+
+ if (cd_88591_to_88592 != (iconv_t)(-1))
+ iconv_close (cd_88591_to_88592);
+ if (cd_88592_to_88591 != (iconv_t)(-1))
+ iconv_close (cd_88592_to_88591);
+ iconv_close (cd_88591_to_utf8);
+ iconv_close (cd_utf8_to_88591);
+ iconv_close (cd_88592_to_utf8);
+ iconv_close (cd_utf8_to_88592);
+
+ /* ------------------------- Test mem_iconveh() ------------------------- */
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveh (input, strlen (input),
+ "ISO-8859-2", "ISO-8859-1",
+ handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveh (input, strlen (input),
+ "ISO-8859-2", "ISO-8859-1",
+ handler,
+ offsets,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ if (o)
+ free (offsets);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i + 5));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveh (input, strlen (input),
+ "ISO-8859-1", "UTF-8",
+ handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == (i < 1 ? i :
+ i < 12 ? i + 1 :
+ i < 18 ? i + 2 :
+ i + 3));
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveh (input, strlen (input),
+ "UTF-8", "ISO-8859-1",
+ handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 41; i++)
+ ASSERT (offsets[i] == (i < 1 ? i :
+ i == 1 ? (size_t)(-1) :
+ i < 13 ? i - 1 :
+ i == 13 ? (size_t)(-1) :
+ i < 20 ? i - 2 :
+ i == 20 ? (size_t)(-1) :
+ i < 40 ? i - 3 :
+ (size_t)(-1)));
+ ASSERT (offsets[41] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveh (input, strlen (input),
+ "UTF-8", "ISO-8859-1",
+ handler,
+ offsets,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ if (o)
+ free (offsets);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 17; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i == 5 ? (size_t)(-1) :
+ i - 1));
+ ASSERT (offsets[17] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 17; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i == 5 ? (size_t)(-1) :
+ i + 4));
+ ASSERT (offsets[17] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\342";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveh (input, strlen (input),
+ "UTF-8", "ISO-8859-1",
+ handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == 0);
+ if (o)
+ {
+ ASSERT (offsets[0] == 0);
+ ASSERT (offsets[1] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* ------------------------- Test str_iconveh() ------------------------- */
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = str_iconveh (input, "ISO-8859-2", "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ char *result = str_iconveh (input, "ISO-8859-2", "ISO-8859-1", handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ char *result = str_iconveh (input, "ISO-8859-1", "UTF-8", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = str_iconveh (input, "UTF-8", "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
+ char *result = str_iconveh (input, "UTF-8", "ISO-8859-1", handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Costs: 27 ?";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Costs: 27 \\u20AC";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\342";
+ char *result = str_iconveh (input, "UTF-8", "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-striconveha.c b/gnulib/tests/test-striconveha.c
new file mode 100644
index 00000000..1da674e1
--- /dev/null
+++ b/gnulib/tests/test-striconveha.c
@@ -0,0 +1,597 @@
+/* Test of character set conversion with error handling and autodetection.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "striconveha.h"
+
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+/* Magic number for detecting bounds violations. */
+#define MAGIC 0x1983EFF1
+
+static size_t *
+new_offsets (size_t n)
+{
+ size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
+ offsets[n] = MAGIC;
+ return offsets;
+}
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+ size_t o;
+ size_t i;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* ------------------------- Test mem_iconveha() ------------------------- */
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "ISO-8859-2", "ISO-8859-1",
+ false, handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "ISO-8859-2", "ISO-8859-1",
+ false, handler,
+ offsets,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ if (o)
+ free (offsets);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i + 5));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "ISO-8859-1", "UTF-8",
+ false, handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == (i < 1 ? i :
+ i < 12 ? i + 1 :
+ i < 18 ? i + 2 :
+ i + 3));
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "UTF-8", "ISO-8859-1",
+ false, handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 41; i++)
+ ASSERT (offsets[i] == (i < 1 ? i :
+ i == 1 ? (size_t)(-1) :
+ i < 13 ? i - 1 :
+ i == 13 ? (size_t)(-1) :
+ i < 20 ? i - 2 :
+ i == 20 ? (size_t)(-1) :
+ i < 40 ? i - 3 :
+ (size_t)(-1)));
+ ASSERT (offsets[41] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "UTF-8", "ISO-8859-1",
+ false, handler,
+ offsets,
+ &result, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (retval == -1 && errno == EILSEQ);
+ ASSERT (result == NULL);
+ if (o)
+ free (offsets);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 17; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i == 5 ? (size_t)(-1) :
+ i - 1));
+ ASSERT (offsets[17] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 17; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i == 5 ? (size_t)(-1) :
+ i + 4));
+ ASSERT (offsets[17] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\342";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "UTF-8", "ISO-8859-1",
+ false, handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == 0);
+ if (o)
+ {
+ ASSERT (offsets[0] == 0);
+ ASSERT (offsets[1] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* autodetect_jp is only supported when iconv() support ISO-2022-JP-2. */
+# if defined _LIBICONV_VERSION || !(defined _AIX || defined __sgi || defined __hpux || defined __osf__ || defined __sun)
+ /* Test conversions from autodetect_jp to UTF-8. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\244\263\244\363\244\313\244\301\244\317"; /* こんにちは in EUC-JP */
+ static const char expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "autodetect_jp", "UTF-8",
+ false, handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 10; i++)
+ ASSERT (offsets[i] == ((i % 2) == 0 ? (i / 2) * 3 : (size_t)(-1)));
+ ASSERT (offsets[10] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\202\261\202\361\202\311\202\277\202\315"; /* こんにちは in Shift_JIS */
+ static const char expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "autodetect_jp", "UTF-8",
+ false, handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 10; i++)
+ ASSERT (offsets[i] == ((i % 2) == 0 ? (i / 2) * 3 : (size_t)(-1)));
+ ASSERT (offsets[10] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\033$B$3$s$K$A$O\033(B"; /* こんにちは in ISO-2022-JP-2 */
+ static const char expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "autodetect_jp", "UTF-8",
+ false, handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i == 0 ? 0 :
+ i == 5 ? 3 :
+ i == 7 ? 6 :
+ i == 9 ? 9 :
+ i == 11 ? 12 :
+ i == 13 ? 15 :
+ (size_t)(-1)));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+# endif
+
+# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 || _LIBICONV_VERSION >= 0x0105
+ /* Test conversion from UTF-8 to ISO-8859-1 with transliteration. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
+ static const char expected[] = "Costs: 27 EUR";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_iconveha (input, strlen (input),
+ "UTF-8", "ISO-8859-1",
+ true, handler,
+ offsets,
+ &result, &length);
+ ASSERT (retval == 0);
+ ASSERT (length == strlen (expected));
+ ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 13; i++)
+ ASSERT (offsets[i] == (i < 11 ? i : (size_t)(-1)));
+ ASSERT (offsets[13] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+# endif
+
+ /* ------------------------- Test str_iconveha() ------------------------- */
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = str_iconveha (input, "ISO-8859-2", "ISO-8859-1", false, handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from ISO-8859-2 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ char *result = str_iconveha (input, "ISO-8859-2", "ISO-8859-1", false, handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ char *result = str_iconveha (input, "ISO-8859-1", "UTF-8", false, handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = str_iconveha (input, "UTF-8", "ISO-8859-1", false, handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
+ char *result = str_iconveha (input, "UTF-8", "ISO-8859-1", false, handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Costs: 27 ?";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Costs: 27 \\u20AC";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\342";
+ char *result = str_iconveha (input, "UTF-8", "ISO-8859-1", false, handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+
+ /* autodetect_jp is only supported when iconv() support ISO-2022-JP-2. */
+# if defined _LIBICONV_VERSION || !(defined _AIX || defined __sgi || defined __hpux || defined __osf__ || defined __sun)
+ /* Test conversions from autodetect_jp to UTF-8. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\244\263\244\363\244\313\244\301\244\317"; /* こんにちは in EUC-JP */
+ static const char expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ char *result = str_iconveha (input, "autodetect_jp", "UTF-8", false, handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\202\261\202\361\202\311\202\277\202\315"; /* こんにちは in Shift_JIS */
+ static const char expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ char *result = str_iconveha (input, "autodetect_jp", "UTF-8", false, handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\033$B$3$s$K$A$O\033(B"; /* こんにちは in ISO-2022-JP-2 */
+ static const char expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ char *result = str_iconveha (input, "autodetect_jp", "UTF-8", false, handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+# endif
+
+# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 || _LIBICONV_VERSION >= 0x0105
+ /* Test conversion from UTF-8 to ISO-8859-1 with transliteration. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
+ static const char expected[] = "Costs: 27 EUR";
+ char *result = str_iconveha (input, "UTF-8", "ISO-8859-1", true, handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-string.c b/gnulib/tests/test-string.c
new file mode 100644
index 00000000..019a8174
--- /dev/null
+++ b/gnulib/tests/test-string.c
@@ -0,0 +1,33 @@
+/* Test of <string.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "verify.h"
+
+/* Check that NULL can be passed through varargs as a pointer type,
+ per POSIX 2008. */
+verify (sizeof NULL == sizeof (void *));
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-strings.c b/gnulib/tests/test-strings.c
new file mode 100644
index 00000000..caba95cd
--- /dev/null
+++ b/gnulib/tests/test-strings.c
@@ -0,0 +1,27 @@
+/* Test of <strings.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <strings.h>
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-strsignal.c b/gnulib/tests/test-strsignal.c
new file mode 100644
index 00000000..cca3a3bf
--- /dev/null
+++ b/gnulib/tests/test-strsignal.c
@@ -0,0 +1,78 @@
+/* Test of strsignal() function.
+ Copyright (C) 2008, 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Colin Watson <cjwatson@debian.org>, 2008. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (strsignal, char *, (int));
+
+#include <signal.h>
+
+#include "macros.h"
+
+#if HAVE_DECL_SYS_SIGLIST
+# define ASSERT_DESCRIPTION(got, expect)
+#else
+/* In this case, we can guarantee some signal descriptions. */
+# define ASSERT_DESCRIPTION(got, expect) ASSERT (!strcmp (got, expect))
+#endif
+
+int
+main (void)
+{
+ /* Work around bug in cygwin 1.5.25 <string.h> by declaring str as
+ const char *, even though strsignal is supposed to return char *.
+ At any rate, this doesn't hurt, since POSIX 200x states that "The
+ string pointed to shall not be modified by the application." */
+ const char *str;
+
+ /* We try a couple of signals, since not all signals are supported
+ everywhere. Notwithstanding the #ifdef for neatness, SIGINT should in
+ fact be available on all platforms. */
+
+#ifdef SIGHUP
+ str = strsignal (SIGHUP);
+ ASSERT (str);
+ ASSERT (*str);
+ ASSERT_DESCRIPTION (str, "Hangup");
+#endif
+
+#ifdef SIGINT
+ str = strsignal (SIGINT);
+ ASSERT (str);
+ ASSERT (*str);
+ ASSERT_DESCRIPTION (str, "Interrupt");
+#endif
+
+ /* Test that for out-of-range signal numbers the result is usable. */
+
+ str = strsignal (-1);
+ ASSERT (str);
+ ASSERT (str != (char *) -1);
+ ASSERT (strlen (str));
+
+ str = strsignal (9249234);
+ ASSERT (str);
+ ASSERT (str != (char *) -1);
+ ASSERT (strlen (str));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-strstr.c b/gnulib/tests/test-strstr.c
new file mode 100644
index 00000000..b6845ab7
--- /dev/null
+++ b/gnulib/tests/test-strstr.c
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Bruno Haible and Eric Blake
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (strstr, char *, (char const *, char const *));
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. All known platforms that lack alarm also have
+ a quadratic strstr, and the replacement strstr is known to not
+ take too long. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ {
+ const char input[] = "foo";
+ const char *result = strstr (input, "");
+ ASSERT (result == input);
+ }
+
+ {
+ const char input[] = "foo";
+ const char *result = strstr (input, "o");
+ ASSERT (result == input + 1);
+ }
+
+ {
+ /* On some platforms, the memchr() functions reads past the first
+ occurrence of the byte to be searched, leading to an out-of-bounds
+ read access for strstr().
+ See <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737>.
+ This is a bug in memchr(), see the Austin Group's clarification
+ <http://www.opengroup.org/austin/docs/austin_454.txt>. */
+ const char *fix = "aBaaaaaaaaaaax";
+ char *page_boundary = (char *) zerosize_ptr ();
+ size_t len = strlen (fix) + 1;
+ char *input = page_boundary ? page_boundary - len : malloc (len);
+ const char *result;
+
+ strcpy (input, fix);
+ result = strstr (input, "B1x");
+ ASSERT (result == NULL);
+ if (!page_boundary)
+ free (input);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = strstr (input, "ABCDABD");
+ ASSERT (result == input + 15);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = strstr (input, "ABCDABE");
+ ASSERT (result == NULL);
+ }
+
+ {
+ const char input[] = "ABC ABCDAB ABCDABCDABDE";
+ const char *result = strstr (input, "ABCDABCD");
+ ASSERT (result == input + 11);
+ }
+
+ /* Check that a very long haystack is handled quickly if the needle is
+ short and occurs near the beginning. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *needle =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+ char *haystack = (char *) malloc (m + 1);
+ if (haystack != NULL)
+ {
+ memset (haystack, 'A', m);
+ haystack[0] = 'B';
+ haystack[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (strstr (haystack, needle) == haystack + 1);
+ }
+
+ free (haystack);
+ }
+ }
+
+ /* Check that a very long needle is discarded quickly if the haystack is
+ short. */
+ {
+ size_t repeat = 10000;
+ size_t m = 1000000;
+ char *haystack =
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
+ char *needle = (char *) malloc (m + 1);
+ if (needle != NULL)
+ {
+ memset (needle, 'A', m);
+ needle[m] = '\0';
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (strstr (haystack, needle) == NULL);
+ }
+
+ free (needle);
+ }
+ }
+
+ /* Check that the asymptotic worst-case complexity is not quadratic. */
+ {
+ size_t m = 1000000;
+ char *haystack = (char *) malloc (2 * m + 2);
+ char *needle = (char *) malloc (m + 2);
+ if (haystack != NULL && needle != NULL)
+ {
+ const char *result;
+
+ memset (haystack, 'A', 2 * m);
+ haystack[2 * m] = 'B';
+ haystack[2 * m + 1] = '\0';
+
+ memset (needle, 'A', m);
+ needle[m] = 'B';
+ needle[m + 1] = '\0';
+
+ result = strstr (haystack, needle);
+ ASSERT (result == haystack + m);
+ }
+ free (needle);
+ free (haystack);
+ }
+
+ /* Sublinear speed is only possible in memmem; strstr must examine
+ every character of haystack to find its length. */
+
+ return 0;
+}
diff --git a/gnulib/tests/test-strtod.c b/gnulib/tests/test-strtod.c
new file mode 100644
index 00000000..cdb57b22
--- /dev/null
+++ b/gnulib/tests/test-strtod.c
@@ -0,0 +1,918 @@
+/*
+ * Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+ * Written by Eric Blake
+ *
+ * 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/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (strtod, double, (char const *, char **));
+
+#include <errno.h>
+#include <float.h>
+#include <math.h>
+#include <string.h>
+
+#include "isnand-nolibm.h"
+#include "macros.h"
+
+/* Avoid requiring -lm just for fabs. */
+#define FABS(d) ((d) < 0.0 ? -(d) : (d))
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zero instead. */
+double zero = 0.0;
+
+int
+main (void)
+{
+ int status = 0;
+ /* Subject sequence empty or invalid. */
+ {
+ const char input[] = "";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input);
+ ASSERT (errno == 0 || errno == EINVAL);
+ }
+ {
+ const char input[] = " ";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input);
+ ASSERT (errno == 0 || errno == EINVAL);
+ }
+ {
+ const char input[] = " +";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input);
+ ASSERT (errno == 0 || errno == EINVAL);
+ }
+ {
+ const char input[] = " .";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input);
+ ASSERT (errno == 0 || errno == EINVAL);
+ }
+ {
+ const char input[] = " .e0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input); /* IRIX 6.5, OSF/1 5.1 */
+ ASSERT (errno == 0 || errno == EINVAL);
+ }
+ {
+ const char input[] = " +.e-0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input); /* IRIX 6.5, OSF/1 5.1 */
+ ASSERT (errno == 0 || errno == EINVAL);
+ }
+ {
+ const char input[] = " in";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input);
+ ASSERT (errno == 0 || errno == EINVAL);
+ }
+ {
+ const char input[] = " na";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input);
+ ASSERT (errno == 0 || errno == EINVAL);
+ }
+
+ /* Simple floating point values. */
+ {
+ const char input[] = "1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 1);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1.";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = ".5";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ /* FIXME - gnulib's version is rather inaccurate. It would be
+ nice to guarantee an exact result, but for now, we settle for a
+ 1-ulp error. */
+ ASSERT (FABS (result - 0.5) < DBL_EPSILON);
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = " 1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "+1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "-1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == -1.0);
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1e0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 3);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1e+0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 4);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1e-0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 4);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1e1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 10.0);
+ ASSERT (ptr == input + 3);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "5e-1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ /* FIXME - gnulib's version is rather inaccurate. It would be
+ nice to guarantee an exact result, but for now, we settle for a
+ 1-ulp error. */
+ ASSERT (FABS (result - 0.5) < DBL_EPSILON);
+ ASSERT (ptr == input + 4);
+ ASSERT (errno == 0);
+ }
+
+ /* Zero. */
+ {
+ const char input[] = "0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 1);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = ".0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0e0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 3);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0e+9999999";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 10);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0e-9999999";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 10);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "-0";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!!signbit (result) == !!signbit (-zero)); /* IRIX 6.5, OSF/1 4.0 */
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+
+ /* Suffixes. */
+ {
+ const char input[] = "1f";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 1);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1.f";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1e";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 1);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1e+";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 1);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1e-";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 1);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1E 2";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0); /* HP-UX 11.11, IRIX 6.5, OSF/1 4.0 */
+ ASSERT (ptr == input + 1); /* HP-UX 11.11, IRIX 6.5 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0x";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "00x1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 2);
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "-0x";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!!signbit (result) == !!signbit (-zero)); /* MacOS X 10.3, FreeBSD 6.2, IRIX 6.5, OSF/1 4.0 */
+ ASSERT (ptr == input + 2); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0xg";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0xp";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0x.";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0xp+";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0xp+1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0x.p+1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "1p+1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + 1);
+ ASSERT (errno == 0);
+ }
+
+ /* Overflow/underflow. */
+ {
+ const char input[] = "1E1000000";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == HUGE_VAL);
+ ASSERT (ptr == input + 9); /* OSF/1 5.1 */
+ ASSERT (errno == ERANGE);
+ }
+ {
+ const char input[] = "-1E1000000";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == -HUGE_VAL);
+ ASSERT (ptr == input + 10);
+ ASSERT (errno == ERANGE);
+ }
+ {
+ const char input[] = "1E-100000";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (0.0 <= result && result <= DBL_MIN);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input + 9);
+ ASSERT (errno == ERANGE);
+ }
+ {
+ const char input[] = "-1E-100000";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (-DBL_MIN <= result && result <= 0.0);
+#if 0
+ /* FIXME - this is glibc bug 5995; POSIX allows returning positive
+ 0 on negative underflow, even though quality of implementation
+ demands preserving the sign. Disable this test until fixed
+ glibc is more prevalent. */
+ ASSERT (!!signbit (result) == !!signbit (-zero)); /* glibc-2.3.6, mingw */
+#endif
+ ASSERT (ptr == input + 10);
+ ASSERT (errno == ERANGE);
+ }
+
+ /* Infinity. */
+ {
+ const char input[] = "iNf";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + 3); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
+ ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
+ }
+ {
+ const char input[] = "-InF";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == -HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + 4); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 4.0, Solaris 9, mingw */
+ ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
+ }
+ {
+ const char input[] = "infinite";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + 3); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (errno == 0); /* OSF/1 4.0 */
+ }
+ {
+ const char input[] = "infinitY";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + 8); /* OpenBSD 4.0, HP-UX 11.00, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw */
+ ASSERT (errno == 0); /* HP-UX 11.11, OSF/1 4.0 */
+ }
+ {
+ const char input[] = "infinitY.";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == HUGE_VAL); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + 8); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (errno == 0); /* OSF/1 4.0 */
+ }
+
+ /* NaN. Some processors set the sign bit of the default NaN, so all
+ we check is that using a sign changes the result. */
+ {
+ const char input[] = "-nan";
+ char *ptr1;
+ char *ptr2;
+ double result1;
+ double result2;
+ errno = 0;
+ result1 = strtod (input, &ptr1);
+ result2 = strtod (input + 1, &ptr2);
+#if 1 /* All known CPUs support NaNs. */
+ ASSERT (isnand (result1)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (isnand (result2)); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+# if 0
+ /* Sign bits of NaN is a portability sticking point, not worth
+ worrying about. */
+ ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
+# endif
+ ASSERT (ptr1 == input + 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
+ ASSERT (ptr2 == input + 4); /* OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
+ ASSERT (errno == 0); /* HP-UX 11.11 */
+#else
+ ASSERT (result1 == 0.0);
+ ASSERT (result2 == 0.0);
+ ASSERT (!signbit (result1));
+ ASSERT (!signbit (result2));
+ ASSERT (ptr1 == input);
+ ASSERT (ptr2 == input + 1);
+ ASSERT (errno == 0 || errno == EINVAL);
+#endif
+ }
+ {
+ const char input[] = "+nan(";
+ char *ptr1;
+ char *ptr2;
+ double result1;
+ double result2;
+ errno = 0;
+ result1 = strtod (input, &ptr1);
+ result2 = strtod (input + 1, &ptr2);
+#if 1 /* All known CPUs support NaNs. */
+ ASSERT (isnand (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (isnand (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (!!signbit (result1) == !!signbit (result2));
+ ASSERT (ptr1 == input + 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
+ ASSERT (ptr2 == input + 4); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 2.5.1, mingw */
+ ASSERT (errno == 0);
+#else
+ ASSERT (result1 == 0.0);
+ ASSERT (result2 == 0.0);
+ ASSERT (!signbit (result1));
+ ASSERT (!signbit (result2));
+ ASSERT (ptr1 == input);
+ ASSERT (ptr2 == input + 1);
+ ASSERT (errno == 0 || errno == EINVAL);
+#endif
+ }
+ {
+ const char input[] = "-nan()";
+ char *ptr1;
+ char *ptr2;
+ double result1;
+ double result2;
+ errno = 0;
+ result1 = strtod (input, &ptr1);
+ result2 = strtod (input + 1, &ptr2);
+#if 1 /* All known CPUs support NaNs. */
+ ASSERT (isnand (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (isnand (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+# if 0
+ /* Sign bits of NaN is a portability sticking point, not worth
+ worrying about. */
+ ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
+# endif
+ ASSERT (ptr1 == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr2 == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (errno == 0);
+#else
+ ASSERT (result1 == 0.0);
+ ASSERT (result2 == 0.0);
+ ASSERT (!signbit (result1));
+ ASSERT (!signbit (result2));
+ ASSERT (ptr1 == input);
+ ASSERT (ptr2 == input + 1);
+ ASSERT (errno == 0 || errno == EINVAL);
+#endif
+ }
+ {
+ const char input[] = " nan().";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+#if 1 /* All known CPUs support NaNs. */
+ ASSERT (isnand (result)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (errno == 0);
+#else
+ ASSERT (result == 0.0);
+ ASSERT (!signbit (result));
+ ASSERT (ptr == input);
+ ASSERT (errno == 0 || errno == EINVAL);
+#endif
+ }
+ {
+ /* The behavior of nan(0) is implementation-defined, but all
+ implementations we know of which handle optional
+ n-char-sequences handle nan(0) the same as nan(). */
+ const char input[] = "-nan(0).";
+ char *ptr1;
+ char *ptr2;
+ double result1;
+ double result2;
+ errno = 0;
+ result1 = strtod (input, &ptr1);
+ result2 = strtod (input + 1, &ptr2);
+#if 1 /* All known CPUs support NaNs. */
+ ASSERT (isnand (result1)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (isnand (result2)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+# if 0
+ /* Sign bits of NaN is a portability sticking point, not worth
+ worrying about. */
+ ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
+# endif
+ ASSERT (ptr1 == input + 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr2 == input + 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (errno == 0);
+#else
+ ASSERT (result1 == 0.0);
+ ASSERT (result2 == 0.0);
+ ASSERT (!signbit (result1));
+ ASSERT (!signbit (result2));
+ ASSERT (ptr1 == input);
+ ASSERT (ptr2 == input + 1);
+ ASSERT (errno == 0 || errno == EINVAL);
+#endif
+ }
+
+ /* Hex. */
+ {
+ const char input[] = "0xa";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 10.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0XA";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 10.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0x1p";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0x1p+";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0x1p+1";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 2.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (ptr == input + 6); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (errno == 0);
+ }
+ {
+ const char input[] = "0x1p+1a";
+ char *ptr;
+ double result;
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 2.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (ptr == input + 6); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (errno == 0);
+ }
+
+ /* Large buffers. */
+ {
+ size_t m = 1000000;
+ char *input = malloc (m + 1);
+ if (input)
+ {
+ char *ptr;
+ double result;
+ memset (input, '\t', m - 1);
+ input[m - 1] = '1';
+ input[m] = '\0';
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + m);
+ ASSERT (errno == 0);
+ }
+ free (input);
+ }
+ {
+ size_t m = 1000000;
+ char *input = malloc (m + 1);
+ if (input)
+ {
+ char *ptr;
+ double result;
+ memset (input, '0', m - 1);
+ input[m - 1] = '1';
+ input[m] = '\0';
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0);
+ ASSERT (ptr == input + m);
+ ASSERT (errno == 0);
+ }
+ free (input);
+ }
+#if 0
+ /* Newlib has an artificial limit of 20000 for the exponent. TODO -
+ gnulib should fix this. */
+ {
+ size_t m = 1000000;
+ char *input = malloc (m + 1);
+ if (input)
+ {
+ char *ptr;
+ double result;
+ input[0] = '.';
+ memset (input + 1, '0', m - 10);
+ input[m - 9] = '1';
+ input[m - 8] = 'e';
+ input[m - 7] = '+';
+ input[m - 6] = '9';
+ input[m - 5] = '9';
+ input[m - 4] = '9';
+ input[m - 3] = '9';
+ input[m - 2] = '9';
+ input[m - 1] = '1';
+ input[m] = '\0';
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + m); /* OSF/1 5.1 */
+ ASSERT (errno == 0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+ }
+ free (input);
+ }
+ {
+ size_t m = 1000000;
+ char *input = malloc (m + 1);
+ if (input)
+ {
+ char *ptr;
+ double result;
+ input[0] = '1';
+ memset (input + 1, '0', m - 9);
+ input[m - 8] = 'e';
+ input[m - 7] = '-';
+ input[m - 6] = '9';
+ input[m - 5] = '9';
+ input[m - 4] = '9';
+ input[m - 3] = '9';
+ input[m - 2] = '9';
+ input[m - 1] = '1';
+ input[m] = '\0';
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 1.0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + m);
+ ASSERT (errno == 0); /* MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, IRIX 6.5, OSF/1 5.1, mingw */
+ }
+ free (input);
+ }
+#endif
+ {
+ size_t m = 1000000;
+ char *input = malloc (m + 1);
+ if (input)
+ {
+ char *ptr;
+ double result;
+ input[0] = '-';
+ input[1] = '0';
+ input[2] = 'e';
+ input[3] = '1';
+ memset (input + 4, '0', m - 3);
+ input[m] = '\0';
+ errno = 0;
+ result = strtod (input, &ptr);
+ ASSERT (result == 0.0);
+ ASSERT (!!signbit (result) == !!signbit (-zero)); /* IRIX 6.5, OSF/1 4.0 */
+ ASSERT (ptr == input + m);
+ ASSERT (errno == 0);
+ }
+ free (input);
+ }
+
+ /* Rounding. */
+ /* TODO - is it worth some tests of rounding for typical IEEE corner
+ cases, such as .5 ULP rounding up to the smallest denormal and
+ not causing underflow, or DBL_MIN - .5 ULP not causing an
+ infinite loop? */
+
+ return status;
+}
diff --git a/gnulib/tests/test-strverscmp.c b/gnulib/tests/test-strverscmp.c
new file mode 100644
index 00000000..d7348150
--- /dev/null
+++ b/gnulib/tests/test-strverscmp.c
@@ -0,0 +1,46 @@
+/* Test of strverscmp() function.
+ Copyright (C) 2008, 2009, 2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2008. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (strverscmp, int, (const char *, const char *));
+
+#include "macros.h"
+
+int
+main (void)
+{
+ ASSERT (strverscmp ("", "") == 0);
+ ASSERT (strverscmp ("a", "a") == 0);
+ ASSERT (strverscmp ("a", "b") < 0);
+ ASSERT (strverscmp ("b", "a") > 0);
+ ASSERT (strverscmp ("000", "00") < 0);
+ ASSERT (strverscmp ("00", "000") > 0);
+ ASSERT (strverscmp ("a0", "a") > 0);
+ ASSERT (strverscmp ("00", "01") < 0);
+ ASSERT (strverscmp ("01", "010") < 0);
+ ASSERT (strverscmp ("010", "09") < 0);
+ ASSERT (strverscmp ("09", "0") < 0);
+ ASSERT (strverscmp ("9", "10") < 0);
+ ASSERT (strverscmp ("0a", "0") > 0);
+ return 0;
+}
diff --git a/gnulib/tests/test-symlink.c b/gnulib/tests/test-symlink.c
new file mode 100644
index 00000000..d2df54c4
--- /dev/null
+++ b/gnulib/tests/test-symlink.c
@@ -0,0 +1,47 @@
+/* Tests of symlink.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (symlink, int, (char const *, char const *));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-symlink.t"
+
+#include "test-symlink.h"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_symlink (symlink, true);
+}
diff --git a/gnulib/tests/test-symlink.h b/gnulib/tests/test-symlink.h
new file mode 100644
index 00000000..0c92bd40
--- /dev/null
+++ b/gnulib/tests/test-symlink.h
@@ -0,0 +1,95 @@
+/* Tests of symlink.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+/* This file is designed to test both symlink(a,b) and
+ symlinkat(a,AT_FDCWD,b). FUNC is the function to test. Assumes
+ that BASE and ASSERT are already defined, and that appropriate
+ headers are already included. If PRINT, warn before skipping
+ symlink tests with status 77. */
+
+static int
+test_symlink (int (*func) (char const *, char const *), bool print)
+{
+ if (func ("nowhere", BASE "link1"))
+ {
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+
+ /* Some systems allow the creation of 0-length symlinks as a synonym
+ for "."; but most reject it. */
+ {
+ int status;
+ errno = 0;
+ status = func ("", BASE "link2");
+ if (status == -1)
+ ASSERT (errno == ENOENT || errno == EINVAL);
+ else
+ {
+ ASSERT (status == 0);
+ ASSERT (unlink (BASE "link2") == 0);
+ }
+ }
+
+ /* Sanity checks of failures. */
+ errno = 0;
+ ASSERT (func ("nowhere", "") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("nowhere", ".") == -1);
+ ASSERT (errno == EEXIST || errno == EINVAL);
+ errno = 0;
+ ASSERT (func ("somewhere", BASE "link1") == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (func ("nowhere", BASE "link2/") == -1);
+ ASSERT (errno == ENOTDIR || errno == ENOENT);
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ errno = 0;
+ ASSERT (func ("nowhere", BASE "dir") == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (func ("nowhere", BASE "dir/") == -1);
+ ASSERT (errno == EEXIST || errno == EINVAL);
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ errno = 0;
+ ASSERT (func ("nowhere", BASE "file") == -1);
+ ASSERT (errno == EEXIST);
+ errno = 0;
+ ASSERT (func ("nowhere", BASE "file/") == -1);
+ ASSERT (errno == EEXIST || errno == ENOTDIR || errno == ENOENT);
+
+ /* Trailing slash must always be rejected. */
+ ASSERT (unlink (BASE "link1") == 0);
+ ASSERT (func (BASE "link2", BASE "link1") == 0);
+ errno = 0;
+ ASSERT (func (BASE "nowhere", BASE "link1/") == -1);
+ ASSERT (errno == EEXIST || errno == ENOTDIR || errno == ENOENT);
+ errno = 0;
+ ASSERT (unlink (BASE "link2") == -1);
+ ASSERT (errno == ENOENT);
+
+ /* Cleanup. */
+ ASSERT (rmdir (BASE "dir") == 0);
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (unlink (BASE "link1") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-symlinkat.c b/gnulib/tests/test-symlinkat.c
new file mode 100644
index 00000000..c3dec293
--- /dev/null
+++ b/gnulib/tests/test-symlinkat.c
@@ -0,0 +1,118 @@
+/* Tests of symlinkat and readlinkat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (symlinkat, int, (char const *, int, char const *));
+SIGNATURE_CHECK (readlinkat, ssize_t, (int, char const *, char *, size_t));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#ifndef HAVE_SYMLINK
+# define HAVE_SYMLINK 0
+#endif
+
+#define BASE "test-symlinkat.t"
+
+#include "test-readlink.h"
+#include "test-symlink.h"
+
+static int dfd = AT_FDCWD;
+
+static int
+do_symlink (char const *contents, char const *name)
+{
+ return symlinkat (contents, dfd, name);
+}
+
+static ssize_t
+do_readlink (char const *name, char *buf, size_t len)
+{
+ return readlinkat (dfd, name, buf, len);
+}
+
+int
+main (void)
+{
+ char buf[80];
+ int result;
+
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Perform same checks as counterpart functions. */
+ result = test_readlink (do_readlink, false);
+ ASSERT (test_symlink (do_symlink, false) == result);
+ dfd = openat (AT_FDCWD, ".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_readlink (do_readlink, false) == result);
+ ASSERT (test_symlink (do_symlink, false) == result);
+
+ /* Now perform some cross-directory checks. Skip everything else on
+ mingw. */
+ if (HAVE_SYMLINK)
+ {
+ const char *contents = "don't matter!";
+ ssize_t exp = strlen (contents);
+
+ /* Create link while cwd is '.', then read it in '..'. */
+ ASSERT (symlinkat (contents, AT_FDCWD, BASE "link") == 0);
+ errno = 0;
+ ASSERT (symlinkat (contents, dfd, BASE "link") == -1);
+ ASSERT (errno == EEXIST);
+ ASSERT (chdir ("..") == 0);
+ errno = 0;
+ ASSERT (readlinkat (AT_FDCWD, BASE "link", buf, sizeof buf) == -1);
+ ASSERT (errno == ENOENT);
+ ASSERT (readlinkat (dfd, BASE "link", buf, sizeof buf) == exp);
+ ASSERT (strncmp (contents, buf, exp) == 0);
+ ASSERT (unlinkat (dfd, BASE "link", 0) == 0);
+
+ /* Create link while cwd is '..', then read it in '.'. */
+ ASSERT (symlinkat (contents, dfd, BASE "link") == 0);
+ ASSERT (fchdir (dfd) == 0);
+ errno = 0;
+ ASSERT (symlinkat (contents, AT_FDCWD, BASE "link") == -1);
+ ASSERT (errno == EEXIST);
+ buf[0] = '\0';
+ ASSERT (readlinkat (AT_FDCWD, BASE "link", buf, sizeof buf) == exp);
+ ASSERT (strncmp (contents, buf, exp) == 0);
+ buf[0] = '\0';
+ ASSERT (readlinkat (dfd, BASE "link", buf, sizeof buf) == exp);
+ ASSERT (strncmp (contents, buf, exp) == 0);
+ ASSERT (unlink (BASE "link") == 0);
+ }
+
+ ASSERT (close (dfd) == 0);
+ if (result == 77)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return result;
+}
diff --git a/gnulib/tests/test-sys_file.c b/gnulib/tests/test-sys_file.c
new file mode 100644
index 00000000..d37d75cd
--- /dev/null
+++ b/gnulib/tests/test-sys_file.c
@@ -0,0 +1,35 @@
+/* Test of <sys/file.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/file.h>
+
+int
+main (void)
+{
+ switch (0)
+ {
+ case LOCK_SH:
+ case LOCK_EX:
+ case LOCK_NB:
+ case LOCK_UN:
+ ;
+ }
+ return 0;
+}
diff --git a/gnulib/tests/test-sys_ioctl.c b/gnulib/tests/test-sys_ioctl.c
new file mode 100644
index 00000000..1f44d4a1
--- /dev/null
+++ b/gnulib/tests/test-sys_ioctl.c
@@ -0,0 +1,27 @@
+/* Test of <sys/ioctl.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/ioctl.h>
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-sys_select.c b/gnulib/tests/test-sys_select.c
new file mode 100644
index 00000000..3a06c648
--- /dev/null
+++ b/gnulib/tests/test-sys_select.c
@@ -0,0 +1,35 @@
+/* Test of <sys/select.h> substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <sys/select.h>
+
+/* Check that the 'struct timeval' type is defined. */
+struct timeval t1;
+
+int
+main (void)
+{
+ /* Check that FD_ZERO can be used. This should not yield a warning
+ such as "warning: implicit declaration of function 'memset'". */
+ fd_set fds;
+ FD_ZERO (&fds);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sys_socket.c b/gnulib/tests/test-sys_socket.c
new file mode 100644
index 00000000..badf308b
--- /dev/null
+++ b/gnulib/tests/test-sys_socket.c
@@ -0,0 +1,53 @@
+/* Test of <sys/socket.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <sys/socket.h>
+
+#include <errno.h>
+
+#if HAVE_SHUTDOWN
+/* Check some integer constant expressions. */
+int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };
+#endif
+
+int
+main (void)
+{
+ struct sockaddr_storage x;
+ sa_family_t i;
+
+ /* Check some errno values. */
+ switch (0)
+ {
+ case ENOTSOCK:
+ case EADDRINUSE:
+ case ENETRESET:
+ case ECONNABORTED:
+ case ECONNRESET:
+ case ENOTCONN:
+ case ESHUTDOWN:
+ break;
+ }
+
+ x.ss_family = 42;
+ i = 42;
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sys_stat.c b/gnulib/tests/test-sys_stat.c
new file mode 100644
index 00000000..5f1aacd1
--- /dev/null
+++ b/gnulib/tests/test-sys_stat.c
@@ -0,0 +1,288 @@
+/* Test of <sys/stat.h> substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "verify.h"
+
+/* Check the existence of some macros. */
+int a[] =
+ {
+ S_IFMT,
+ S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO, S_IFREG,
+#ifdef S_IFLNK /* missing on mingw and djgpp */
+ S_IFLNK,
+#endif
+#ifdef S_IFSOCK /* missing on mingw and djgpp */
+ S_IFSOCK,
+#endif
+ S_IRWXU, S_IRUSR, S_IWUSR, S_IXUSR,
+ S_IRWXG, S_IRGRP, S_IWGRP, S_IXGRP,
+ S_IRWXO, S_IROTH, S_IWOTH, S_IXOTH,
+ S_ISUID, S_ISGID, S_ISVTX,
+ S_ISBLK (S_IFREG),
+ S_ISCHR (S_IFREG),
+ S_ISDIR (S_IFREG),
+ S_ISFIFO (S_IFREG),
+ S_ISREG (S_IFREG),
+ S_ISLNK (S_IFREG),
+ S_ISSOCK (S_IFREG),
+ S_ISDOOR (S_IFREG),
+ S_ISMPB (S_IFREG),
+ S_ISNAM (S_IFREG),
+ S_ISNWK (S_IFREG),
+ S_ISPORT (S_IFREG),
+ S_ISCTG (S_IFREG),
+ S_ISOFD (S_IFREG),
+ S_ISOFL (S_IFREG),
+ S_ISWHT (S_IFREG)
+ };
+
+/* Sanity checks. */
+
+verify (S_IRWXU == (S_IRUSR | S_IWUSR | S_IXUSR));
+verify (S_IRWXG == (S_IRGRP | S_IWGRP | S_IXGRP));
+verify (S_IRWXO == (S_IROTH | S_IWOTH | S_IXOTH));
+
+verify (S_ISBLK (S_IFBLK));
+verify (!S_ISBLK (S_IFCHR));
+verify (!S_ISBLK (S_IFDIR));
+verify (!S_ISBLK (S_IFIFO));
+verify (!S_ISBLK (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISBLK (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISBLK (S_IFSOCK));
+#endif
+
+verify (!S_ISCHR (S_IFBLK));
+verify (S_ISCHR (S_IFCHR));
+verify (!S_ISCHR (S_IFDIR));
+verify (!S_ISCHR (S_IFIFO));
+verify (!S_ISCHR (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISCHR (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISCHR (S_IFSOCK));
+#endif
+
+verify (!S_ISDIR (S_IFBLK));
+verify (!S_ISDIR (S_IFCHR));
+verify (S_ISDIR (S_IFDIR));
+verify (!S_ISDIR (S_IFIFO));
+verify (!S_ISDIR (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISDIR (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISDIR (S_IFSOCK));
+#endif
+
+verify (!S_ISFIFO (S_IFBLK));
+verify (!S_ISFIFO (S_IFCHR));
+verify (!S_ISFIFO (S_IFDIR));
+verify (S_ISFIFO (S_IFIFO));
+verify (!S_ISFIFO (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISFIFO (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISFIFO (S_IFSOCK));
+#endif
+
+verify (!S_ISREG (S_IFBLK));
+verify (!S_ISREG (S_IFCHR));
+verify (!S_ISREG (S_IFDIR));
+verify (!S_ISREG (S_IFIFO));
+verify (S_ISREG (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISREG (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISREG (S_IFSOCK));
+#endif
+
+verify (!S_ISLNK (S_IFBLK));
+verify (!S_ISLNK (S_IFCHR));
+verify (!S_ISLNK (S_IFDIR));
+verify (!S_ISLNK (S_IFIFO));
+verify (!S_ISLNK (S_IFREG));
+#ifdef S_IFLNK
+verify (S_ISLNK (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISLNK (S_IFSOCK));
+#endif
+
+verify (!S_ISSOCK (S_IFBLK));
+verify (!S_ISSOCK (S_IFCHR));
+verify (!S_ISSOCK (S_IFDIR));
+verify (!S_ISSOCK (S_IFIFO));
+verify (!S_ISSOCK (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISSOCK (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (S_ISSOCK (S_IFSOCK));
+#endif
+
+verify (!S_ISDOOR (S_IFBLK));
+verify (!S_ISDOOR (S_IFCHR));
+verify (!S_ISDOOR (S_IFDIR));
+verify (!S_ISDOOR (S_IFIFO));
+verify (!S_ISDOOR (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISDOOR (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISDOOR (S_IFSOCK));
+#endif
+
+verify (!S_ISMPB (S_IFBLK));
+verify (!S_ISMPB (S_IFCHR));
+verify (!S_ISMPB (S_IFDIR));
+verify (!S_ISMPB (S_IFIFO));
+verify (!S_ISMPB (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISMPB (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISMPB (S_IFSOCK));
+#endif
+
+verify (!S_ISNAM (S_IFBLK));
+verify (!S_ISNAM (S_IFCHR));
+verify (!S_ISNAM (S_IFDIR));
+verify (!S_ISNAM (S_IFIFO));
+verify (!S_ISNAM (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISNAM (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISNAM (S_IFSOCK));
+#endif
+
+verify (!S_ISNWK (S_IFBLK));
+verify (!S_ISNWK (S_IFCHR));
+verify (!S_ISNWK (S_IFDIR));
+verify (!S_ISNWK (S_IFIFO));
+verify (!S_ISNWK (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISNWK (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISNWK (S_IFSOCK));
+#endif
+
+verify (!S_ISPORT (S_IFBLK));
+verify (!S_ISPORT (S_IFCHR));
+verify (!S_ISPORT (S_IFDIR));
+verify (!S_ISPORT (S_IFIFO));
+verify (!S_ISPORT (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISPORT (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISPORT (S_IFSOCK));
+#endif
+
+verify (!S_ISCTG (S_IFBLK));
+verify (!S_ISCTG (S_IFCHR));
+verify (!S_ISCTG (S_IFDIR));
+verify (!S_ISCTG (S_IFIFO));
+verify (!S_ISCTG (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISCTG (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISCTG (S_IFSOCK));
+#endif
+
+verify (!S_ISOFD (S_IFBLK));
+verify (!S_ISOFD (S_IFCHR));
+verify (!S_ISOFD (S_IFDIR));
+verify (!S_ISOFD (S_IFIFO));
+verify (!S_ISOFD (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISOFD (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISOFD (S_IFSOCK));
+#endif
+
+verify (!S_ISOFL (S_IFBLK));
+verify (!S_ISOFL (S_IFCHR));
+verify (!S_ISOFL (S_IFDIR));
+verify (!S_ISOFL (S_IFIFO));
+verify (!S_ISOFL (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISOFL (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISOFL (S_IFSOCK));
+#endif
+
+verify (!S_ISWHT (S_IFBLK));
+verify (!S_ISWHT (S_IFCHR));
+verify (!S_ISWHT (S_IFDIR));
+verify (!S_ISWHT (S_IFIFO));
+verify (!S_ISWHT (S_IFREG));
+#ifdef S_IFLNK
+verify (!S_ISWHT (S_IFLNK));
+#endif
+#ifdef S_IFSOCK
+verify (!S_ISWHT (S_IFSOCK));
+#endif
+
+/* POSIX 2008 requires traditional encoding of permission constants. */
+verify (S_IRWXU == 00700);
+verify (S_IRUSR == 00400);
+verify (S_IWUSR == 00200);
+verify (S_IXUSR == 00100);
+verify (S_IRWXG == 00070);
+verify (S_IRGRP == 00040);
+verify (S_IWGRP == 00020);
+verify (S_IXGRP == 00010);
+verify (S_IRWXO == 00007);
+verify (S_IROTH == 00004);
+verify (S_IWOTH == 00002);
+verify (S_IXOTH == 00001);
+verify (S_ISUID == 04000);
+verify (S_ISGID == 02000);
+verify (S_ISVTX == 01000);
+
+#if ((0 <= UTIME_NOW && UTIME_NOW < 1000000000) \
+ || (0 <= UTIME_OMIT && UTIME_OMIT < 1000000000) \
+ || UTIME_NOW == UTIME_OMIT)
+invalid UTIME macros
+#endif
+
+/* Check the existence of some types. */
+nlink_t t1;
+
+struct timespec t2;
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-sys_time.c b/gnulib/tests/test-sys_time.c
new file mode 100644
index 00000000..2ab849e9
--- /dev/null
+++ b/gnulib/tests/test-sys_time.c
@@ -0,0 +1,29 @@
+/* Test of <sys/time.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <sys/time.h>
+
+struct timeval a;
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-sys_times.c b/gnulib/tests/test-sys_times.c
new file mode 100644
index 00000000..70a6bf5a
--- /dev/null
+++ b/gnulib/tests/test-sys_times.c
@@ -0,0 +1,30 @@
+/* Test of <sys/times.h> substitute.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#include <config.h>
+
+#include <sys/times.h>
+
+static struct tms tms;
+
+int
+main (void)
+{
+ clock_t t = tms.tms_utime + tms.tms_stime + tms.tms_cutime + tms.tms_cstime;
+ return t;
+}
diff --git a/gnulib/tests/test-sys_utsname.c b/gnulib/tests/test-sys_utsname.c
new file mode 100644
index 00000000..b4ffea42
--- /dev/null
+++ b/gnulib/tests/test-sys_utsname.c
@@ -0,0 +1,37 @@
+/* Test of <sys/utsname.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <sys/utsname.h>
+
+#include <string.h>
+
+int
+main ()
+{
+ struct utsname buf;
+
+ strcpy (buf.sysname, "Linux");
+ strcpy (buf.nodename, "hobbybox");
+ strcpy (buf.release, "3.141.592");
+ strcpy (buf.version, "GENERIC");
+ strcpy (buf.machine, "i586");
+
+ return 0;
+}
diff --git a/gnulib/tests/test-sys_wait.c b/gnulib/tests/test-sys_wait.c
new file mode 100644
index 00000000..8c0170ed
--- /dev/null
+++ b/gnulib/tests/test-sys_wait.c
@@ -0,0 +1,30 @@
+/* Test of <sys/wait.h> substitute.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/wait.h>
+
+/* Check for existence of required types. */
+static pid_t a;
+
+int
+main (void)
+{
+ return a;
+}
diff --git a/gnulib/tests/test-sysexits.c b/gnulib/tests/test-sysexits.c
new file mode 100644
index 00000000..85083756
--- /dev/null
+++ b/gnulib/tests/test-sysexits.c
@@ -0,0 +1,52 @@
+/* Test of <sysexits.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <sysexits.h>
+
+int exitcode;
+
+int
+main ()
+{
+ /* Check that all EX_* symbols are defined to integer constant expressions
+ with mutually different values. */
+ switch (exitcode)
+ {
+ case EX_OK:
+ case EX_USAGE:
+ case EX_DATAERR:
+ case EX_NOINPUT:
+ case EX_NOUSER:
+ case EX_NOHOST:
+ case EX_UNAVAILABLE:
+ case EX_SOFTWARE:
+ case EX_OSERR:
+ case EX_OSFILE:
+ case EX_CANTCREAT:
+ case EX_IOERR:
+ case EX_TEMPFAIL:
+ case EX_PROTOCOL:
+ case EX_NOPERM:
+ case EX_CONFIG:
+ break;
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-tan.c b/gnulib/tests/test-tan.c
new file mode 100644
index 00000000..32b3bdaa
--- /dev/null
+++ b/gnulib/tests/test-tan.c
@@ -0,0 +1,40 @@
+/* Test of tan() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (tan, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = tan (x);
+ ASSERT (y >= 0.6841368083 && y <= 0.6841368084);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-tanh.c b/gnulib/tests/test-tanh.c
new file mode 100644
index 00000000..b5d8e4f9
--- /dev/null
+++ b/gnulib/tests/test-tanh.c
@@ -0,0 +1,40 @@
+/* Test of tanh() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (tanh, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 0.6;
+ y = tanh (x);
+ ASSERT (y >= 0.5370495669 && y <= 0.5370495670);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-tanl.c b/gnulib/tests/test-tanl.c
new file mode 100644
index 00000000..6e105cb4
--- /dev/null
+++ b/gnulib/tests/test-tanl.c
@@ -0,0 +1,45 @@
+/* Test of tanl() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (tanl, long double, (long double));
+
+#include "fpucw.h"
+#include "macros.h"
+
+volatile long double x;
+long double y;
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* A particular value. */
+ x = 0.6L;
+ y = tanl (x);
+ ASSERT (y >= 0.6841368083L && y <= 0.6841368084L);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-time.c b/gnulib/tests/test-time.c
new file mode 100644
index 00000000..8e250bd2
--- /dev/null
+++ b/gnulib/tests/test-time.c
@@ -0,0 +1,35 @@
+/* Test of <time.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <time.h>
+
+#include "verify.h"
+
+struct timespec a;
+
+/* Check that NULL can be passed through varargs as a pointer type,
+ per POSIX 2008. */
+verify (sizeof NULL == sizeof (void *));
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-times.c b/gnulib/tests/test-times.c
new file mode 100644
index 00000000..dcdcdb46
--- /dev/null
+++ b/gnulib/tests/test-times.c
@@ -0,0 +1,105 @@
+/* Test of times function.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#include <config.h>
+
+#include <sys/times.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (times, clock_t, (struct tms *));
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <math.h>
+
+static int
+doublecmp (const void *p, const void *q)
+{
+ double a = *(double *) p;
+ double b = *(double *) q;
+
+ return a < b;
+}
+
+int
+main (int argc, char *argv[])
+{
+ struct tms tms;
+ clock_t t;
+#ifndef _SC_CLK_TCK
+ clock_t clk_tck = CLK_TCK;
+#else
+ clock_t clk_tck = sysconf (_SC_CLK_TCK);
+#endif
+
+ t = times (&tms);
+ if (t == (clock_t) -1)
+ {
+ perror ("times");
+ return EXIT_FAILURE;
+ }
+
+ if (argc > 1)
+ {
+ printf ("clk_tck %ld\n", (long int) clk_tck);
+
+ printf ("t %ld\n", t);
+ printf ("tms.tms_utime %ldms\n", (tms.tms_utime * 1000) / clk_tck);
+ printf ("tms.tms_stime %ldms\n", (tms.tms_stime * 1000) / clk_tck);
+ printf ("tms.tms_cutime %ldms\n", (tms.tms_cutime * 1000) / clk_tck);
+ printf ("tms.tms_cstime %ldms\n", (tms.tms_cstime * 1000) / clk_tck);
+ }
+
+ if (argc > 1)
+ {
+ size_t size = atoi (argv[1]);
+ double *base;
+ size_t i;
+
+ base = malloc (size * sizeof (double));
+
+ for (i = 0; i < size; i++)
+ base[i] = i * i;
+
+ qsort (base, size, sizeof (double), doublecmp);
+
+ free (base);
+ }
+
+ t = times (&tms);
+ if (t == (clock_t) -1)
+ {
+ perror ("times");
+ return EXIT_FAILURE;
+ }
+
+ if (argc > 1)
+ {
+ printf ("clk_tck %ld\n", (long int) clk_tck);
+
+ printf ("t %ld\n", t);
+ printf ("tms.tms_utime %ldms\n", (tms.tms_utime * 1000) / clk_tck);
+ printf ("tms.tms_stime %ldms\n", (tms.tms_stime * 1000) / clk_tck);
+ printf ("tms.tms_cutime %ldms\n", (tms.tms_cutime * 1000) / clk_tck);
+ printf ("tms.tms_cstime %ldms\n", (tms.tms_cstime * 1000) / clk_tck);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-tls.c b/gnulib/tests/test-tls.c
new file mode 100644
index 00000000..172cdb31
--- /dev/null
+++ b/gnulib/tests/test-tls.c
@@ -0,0 +1,212 @@
+/* Test of thread-local storage in multithreaded situations.
+ Copyright (C) 2005, 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+#if USE_POSIX_THREADS || USE_SOLARIS_THREADS || USE_PTH_THREADS || USE_WIN32_THREADS
+
+#if USE_POSIX_THREADS
+# define TEST_POSIX_THREADS 1
+#endif
+#if USE_SOLARIS_THREADS
+# define TEST_SOLARIS_THREADS 1
+#endif
+#if USE_PTH_THREADS
+# define TEST_PTH_THREADS 1
+#endif
+#if USE_WIN32_THREADS
+# define TEST_WIN32_THREADS 1
+#endif
+
+/* Whether to help the scheduler through explicit yield().
+ Uncomment this to see if the operating system has a fair scheduler. */
+#define EXPLICIT_YIELD 1
+
+/* Whether to print debugging messages. */
+#define ENABLE_DEBUGGING 0
+
+/* Number of simultaneous threads. */
+#define THREAD_COUNT 16
+
+/* Number of operations performed in each thread. */
+#define REPEAT_COUNT 50000
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "glthread/tls.h"
+#include "glthread/thread.h"
+#include "glthread/yield.h"
+
+#if ENABLE_DEBUGGING
+# define dbgprintf printf
+#else
+# define dbgprintf if (0) printf
+#endif
+
+#if EXPLICIT_YIELD
+# define yield() gl_thread_yield ()
+#else
+# define yield()
+#endif
+
+static inline void
+perhaps_yield (void)
+{
+ /* Call yield () only with a certain probability, otherwise with GNU Pth
+ the sequence of thread activations is too predictable. */
+ if ((((unsigned int) rand () >> 3) % 4) == 0)
+ yield ();
+}
+
+
+/* ----------------------- Test thread-local storage ----------------------- */
+
+#define KEYS_COUNT 4
+
+static gl_tls_key_t mykeys[KEYS_COUNT];
+
+static void *
+worker_thread (void *arg)
+{
+ unsigned int id = (unsigned int) (unsigned long) arg;
+ int i, j, repeat;
+ unsigned int values[KEYS_COUNT];
+
+ dbgprintf ("Worker %p started\n", gl_thread_self ());
+
+ /* Initialize the per-thread storage. */
+ for (i = 0; i < KEYS_COUNT; i++)
+ {
+ values[i] = (((unsigned int) rand() >> 3) % 1000000) * THREAD_COUNT + id;
+ /* Hopefully no arithmetic overflow. */
+ if ((values[i] % THREAD_COUNT) != id)
+ abort ();
+ }
+ perhaps_yield ();
+
+ /* Verify that the initial value is NULL. */
+ dbgprintf ("Worker %p before initial verify\n", gl_thread_self ());
+ for (i = 0; i < KEYS_COUNT; i++)
+ if (gl_tls_get (mykeys[i]) != NULL)
+ abort ();
+ dbgprintf ("Worker %p after initial verify\n", gl_thread_self ());
+ perhaps_yield ();
+
+ /* Initialize the per-thread storage. */
+ dbgprintf ("Worker %p before first tls_set\n", gl_thread_self ());
+ for (i = 0; i < KEYS_COUNT; i++)
+ {
+ unsigned int *ptr = (unsigned int *) malloc (sizeof (unsigned int));
+ *ptr = values[i];
+ gl_tls_set (mykeys[i], ptr);
+ }
+ dbgprintf ("Worker %p after first tls_set\n", gl_thread_self ());
+ perhaps_yield ();
+
+ /* Shuffle around the pointers. */
+ for (repeat = REPEAT_COUNT; repeat > 0; repeat--)
+ {
+ dbgprintf ("Worker %p doing value swapping\n", gl_thread_self ());
+ i = ((unsigned int) rand() >> 3) % KEYS_COUNT;
+ j = ((unsigned int) rand() >> 3) % KEYS_COUNT;
+ if (i != j)
+ {
+ void *vi = gl_tls_get (mykeys[i]);
+ void *vj = gl_tls_get (mykeys[j]);
+
+ gl_tls_set (mykeys[i], vj);
+ gl_tls_set (mykeys[j], vi);
+ }
+ perhaps_yield ();
+ }
+
+ /* Verify that all the values are from this thread. */
+ dbgprintf ("Worker %p before final verify\n", gl_thread_self ());
+ for (i = 0; i < KEYS_COUNT; i++)
+ if ((*(unsigned int *) gl_tls_get (mykeys[i]) % THREAD_COUNT) != id)
+ abort ();
+ dbgprintf ("Worker %p after final verify\n", gl_thread_self ());
+ perhaps_yield ();
+
+ dbgprintf ("Worker %p dying.\n", gl_thread_self ());
+ return NULL;
+}
+
+static void
+test_tls (void)
+{
+ int pass, i;
+
+ for (pass = 0; pass < 2; pass++)
+ {
+ gl_thread_t threads[THREAD_COUNT];
+
+ if (pass == 0)
+ for (i = 0; i < KEYS_COUNT; i++)
+ gl_tls_key_init (mykeys[i], free);
+ else
+ for (i = KEYS_COUNT - 1; i >= 0; i--)
+ gl_tls_key_init (mykeys[i], free);
+
+ /* Spawn the threads. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ threads[i] = gl_thread_create (worker_thread, NULL);
+
+ /* Wait for the threads to terminate. */
+ for (i = 0; i < THREAD_COUNT; i++)
+ gl_thread_join (threads[i], NULL);
+
+ for (i = 0; i < KEYS_COUNT; i++)
+ gl_tls_key_destroy (mykeys[i]);
+ }
+}
+
+
+/* -------------------------------------------------------------------------- */
+
+int
+main ()
+{
+#if TEST_PTH_THREADS
+ if (!pth_init ())
+ abort ();
+#endif
+
+ printf ("Starting test_tls ..."); fflush (stdout);
+ test_tls ();
+ printf (" OK\n"); fflush (stdout);
+
+ return 0;
+}
+
+#else
+
+/* No multithreading available. */
+
+#include <stdio.h>
+
+int
+main ()
+{
+ fputs ("Skipping test: multithreading not enabled\n", stderr);
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/test-trunc1.c b/gnulib/tests/test-trunc1.c
new file mode 100644
index 00000000..65b027af
--- /dev/null
+++ b/gnulib/tests/test-trunc1.c
@@ -0,0 +1,67 @@
+/* Test of rounding towards zero.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (trunc, double, (double));
+
+#include "isnand-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zero instead. */
+double zero = 0.0;
+
+int
+main ()
+{
+ /* Zero. */
+ ASSERT (trunc (0.0) == 0.0);
+ ASSERT (trunc (-zero) == 0.0);
+ /* Positive numbers. */
+ ASSERT (trunc (0.3) == 0.0);
+ ASSERT (trunc (0.7) == 0.0);
+ ASSERT (trunc (1.0) == 1.0);
+ ASSERT (trunc (1.5) == 1.0);
+ ASSERT (trunc (1.999) == 1.0);
+ ASSERT (trunc (2.0) == 2.0);
+ ASSERT (trunc (65535.999) == 65535.0);
+ ASSERT (trunc (65536.0) == 65536.0);
+ ASSERT (trunc (2.341e31) == 2.341e31);
+ /* Negative numbers. */
+ ASSERT (trunc (-0.3) == 0.0);
+ ASSERT (trunc (-0.7) == 0.0);
+ ASSERT (trunc (-1.0) == -1.0);
+ ASSERT (trunc (-1.5) == -1.0);
+ ASSERT (trunc (-1.999) == -1.0);
+ ASSERT (trunc (-2.0) == -2.0);
+ ASSERT (trunc (-65535.999) == -65535.0);
+ ASSERT (trunc (-65536.0) == -65536.0);
+ ASSERT (trunc (-2.341e31) == -2.341e31);
+ /* Infinite numbers. */
+ ASSERT (trunc (1.0 / 0.0) == 1.0 / 0.0);
+ ASSERT (trunc (-1.0 / 0.0) == -1.0 / 0.0);
+ /* NaNs. */
+ ASSERT (isnand (trunc (NaNd ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-trunc2.c b/gnulib/tests/test-trunc2.c
new file mode 100644
index 00000000..397e1ade
--- /dev/null
+++ b/gnulib/tests/test-trunc2.c
@@ -0,0 +1,155 @@
+/* Test of rounding towards zero.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include <float.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "isnand-nolibm.h"
+#include "macros.h"
+
+
+/* The reference implementation, taken from lib/trunc.c. */
+
+#define DOUBLE double
+#define MANT_DIG DBL_MANT_DIG
+#define L_(literal) literal
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+trunc_reference (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
+
+
+/* Test for equality. */
+static int
+equal (DOUBLE x, DOUBLE y)
+{
+ return (isnand (x) ? isnand (y) : x == y);
+}
+
+/* Test whether the result for a given argument is correct. */
+static bool
+correct_result_p (DOUBLE x, DOUBLE result)
+{
+ return
+ (x >= 0
+ ? (x < 1 ? result == L_(0.0) :
+ x - 1 < x ? result <= x && result >= x - 1 && x - result < 1 :
+ equal (result, x))
+ : (x > -1 ? result == L_(0.0) :
+ x + 1 > x ? result >= x && result <= x + 1 && result - x < 1 :
+ equal (result, x)));
+}
+
+/* Test the function for a given argument. */
+static int
+check (double x)
+{
+ /* If the reference implementation is incorrect, bail out immediately. */
+ double reference = trunc_reference (x);
+ ASSERT (correct_result_p (x, reference));
+ /* If the actual implementation is wrong, return an error code. */
+ {
+ double result = trunc (x);
+ if (correct_result_p (x, result))
+ return 0;
+ else
+ {
+ fprintf (stderr, "trunc %g(%a) = %g(%a) or %g(%a)?\n",
+ x, x, reference, reference, result, result);
+ return 1;
+ }
+ }
+}
+
+#define NUM_HIGHBITS 13
+#define NUM_LOWBITS 4
+
+int
+main ()
+{
+ unsigned int highbits;
+ unsigned int lowbits;
+ int error = 0;
+ for (highbits = 0; highbits < (1 << NUM_HIGHBITS); highbits++)
+ for (lowbits = 0; lowbits < (1 << NUM_LOWBITS); lowbits++)
+ {
+ /* Combine highbits and lowbits into a floating-point number,
+ sign-extending the lowbits to 32-NUM_HIGHBITS bits. */
+ union { double f; uint64_t i; } janus;
+ janus.i = ((uint64_t) highbits << (64 - NUM_HIGHBITS))
+ | ((uint64_t) ((int64_t) ((uint64_t) lowbits << (64 - NUM_LOWBITS))
+ >> (64 - NUM_LOWBITS - NUM_HIGHBITS))
+ >> NUM_HIGHBITS);
+ error |= check (janus.f);
+ }
+ return (error ? 1 : 0);
+}
diff --git a/gnulib/tests/test-truncf1.c b/gnulib/tests/test-truncf1.c
new file mode 100644
index 00000000..8b125a8b
--- /dev/null
+++ b/gnulib/tests/test-truncf1.c
@@ -0,0 +1,67 @@
+/* Test of rounding towards zero.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (truncf, float, (float));
+
+#include "isnanf-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0f.
+ So we use -zero instead. */
+float zero = 0.0f;
+
+int
+main ()
+{
+ /* Zero. */
+ ASSERT (truncf (0.0f) == 0.0f);
+ ASSERT (truncf (-zero) == 0.0f);
+ /* Positive numbers. */
+ ASSERT (truncf (0.3f) == 0.0f);
+ ASSERT (truncf (0.7f) == 0.0f);
+ ASSERT (truncf (1.0f) == 1.0f);
+ ASSERT (truncf (1.5f) == 1.0f);
+ ASSERT (truncf (1.999f) == 1.0f);
+ ASSERT (truncf (2.0f) == 2.0f);
+ ASSERT (truncf (65535.99f) == 65535.0f);
+ ASSERT (truncf (65536.0f) == 65536.0f);
+ ASSERT (truncf (2.341e31f) == 2.341e31f);
+ /* Negative numbers. */
+ ASSERT (truncf (-0.3f) == 0.0f);
+ ASSERT (truncf (-0.7f) == 0.0f);
+ ASSERT (truncf (-1.0f) == -1.0f);
+ ASSERT (truncf (-1.5f) == -1.0f);
+ ASSERT (truncf (-1.999f) == -1.0f);
+ ASSERT (truncf (-2.0f) == -2.0f);
+ ASSERT (truncf (-65535.99f) == -65535.0f);
+ ASSERT (truncf (-65536.0f) == -65536.0f);
+ ASSERT (truncf (-2.341e31f) == -2.341e31f);
+ /* Infinite numbers. */
+ ASSERT (truncf (1.0f / 0.0f) == 1.0f / 0.0f);
+ ASSERT (truncf (-1.0f / 0.0f) == -1.0f / 0.0f);
+ /* NaNs. */
+ ASSERT (isnanf (truncf (NaNf ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-truncf2.c b/gnulib/tests/test-truncf2.c
new file mode 100644
index 00000000..2d78808f
--- /dev/null
+++ b/gnulib/tests/test-truncf2.c
@@ -0,0 +1,155 @@
+/* Test of rounding towards zero.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include <float.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "isnanf-nolibm.h"
+#include "macros.h"
+
+
+/* The reference implementation, taken from lib/trunc.c. */
+
+#define DOUBLE float
+#define MANT_DIG FLT_MANT_DIG
+#define L_(literal) literal##f
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+truncf_reference (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
+
+
+/* Test for equality. */
+static int
+equal (DOUBLE x, DOUBLE y)
+{
+ return (isnanf (x) ? isnanf (y) : x == y);
+}
+
+/* Test whether the result for a given argument is correct. */
+static bool
+correct_result_p (DOUBLE x, DOUBLE result)
+{
+ return
+ (x >= 0
+ ? (x < 1 ? result == L_(0.0) :
+ x - 1 < x ? result <= x && result >= x - 1 && x - result < 1 :
+ equal (result, x))
+ : (x > -1 ? result == L_(0.0) :
+ x + 1 > x ? result >= x && result <= x + 1 && result - x < 1 :
+ equal (result, x)));
+}
+
+/* Test the function for a given argument. */
+static int
+check (float x)
+{
+ /* If the reference implementation is incorrect, bail out immediately. */
+ float reference = truncf_reference (x);
+ ASSERT (correct_result_p (x, reference));
+ /* If the actual implementation is wrong, return an error code. */
+ {
+ float result = truncf (x);
+ if (correct_result_p (x, result))
+ return 0;
+ else
+ {
+ fprintf (stderr, "truncf %g(%a) = %g(%a) or %g(%a)?\n",
+ x, x, reference, reference, result, result);
+ return 1;
+ }
+ }
+}
+
+#define NUM_HIGHBITS 12
+#define NUM_LOWBITS 4
+
+int
+main ()
+{
+ unsigned int highbits;
+ unsigned int lowbits;
+ int error = 0;
+ for (highbits = 0; highbits < (1 << NUM_HIGHBITS); highbits++)
+ for (lowbits = 0; lowbits < (1 << NUM_LOWBITS); lowbits++)
+ {
+ /* Combine highbits and lowbits into a floating-point number,
+ sign-extending the lowbits to 32-NUM_HIGHBITS bits. */
+ union { float f; uint32_t i; } janus;
+ janus.i = ((uint32_t) highbits << (32 - NUM_HIGHBITS))
+ | ((uint32_t) ((int32_t) ((uint32_t) lowbits << (32 - NUM_LOWBITS))
+ >> (32 - NUM_LOWBITS - NUM_HIGHBITS))
+ >> NUM_HIGHBITS);
+ error |= check (janus.f);
+ }
+ return (error ? 1 : 0);
+}
diff --git a/gnulib/tests/test-truncl.c b/gnulib/tests/test-truncl.c
new file mode 100644
index 00000000..48790755
--- /dev/null
+++ b/gnulib/tests/test-truncl.c
@@ -0,0 +1,86 @@
+/* Test of rounding towards zero.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (truncl, long double, (long double));
+
+#include <float.h>
+
+#include "fpucw.h"
+#include "isnanl-nolibm.h"
+#include "nan.h"
+#include "macros.h"
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zero instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zero (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+long double minus_zero = -0.0L;
+#endif
+
+int
+main ()
+{
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* Zero. */
+ ASSERT (truncl (0.0L) == 0.0L);
+ ASSERT (truncl (minus_zero) == 0.0L);
+ /* Positive numbers. */
+ ASSERT (truncl (0.3L) == 0.0L);
+ ASSERT (truncl (0.7L) == 0.0L);
+ ASSERT (truncl (1.0L) == 1.0L);
+ ASSERT (truncl (1.5L) == 1.0L);
+ ASSERT (truncl (1.999L) == 1.0L);
+ ASSERT (truncl (2.0L) == 2.0L);
+ ASSERT (truncl (65535.999L) == 65535.0L);
+ ASSERT (truncl (65536.0L) == 65536.0L);
+ ASSERT (truncl (2.341e31L) == 2.341e31L);
+ /* Negative numbers. */
+ ASSERT (truncl (-0.3L) == 0.0L);
+ ASSERT (truncl (-0.7L) == 0.0L);
+ ASSERT (truncl (-1.0L) == -1.0L);
+ ASSERT (truncl (-1.5L) == -1.0L);
+ ASSERT (truncl (-1.999L) == -1.0L);
+ ASSERT (truncl (-2.0L) == -2.0L);
+ ASSERT (truncl (-65535.999L) == -65535.0L);
+ ASSERT (truncl (-65536.0L) == -65536.0L);
+ ASSERT (truncl (-2.341e31L) == -2.341e31L);
+ /* Infinite numbers. */
+ ASSERT (truncl (1.0L / 0.0L) == 1.0L / 0.0L);
+ ASSERT (truncl (-1.0L / 0.0L) == -1.0L / 0.0L);
+ /* NaNs. */
+ ASSERT (isnanl (truncl (NaNl ())));
+
+ return 0;
+}
diff --git a/gnulib/tests/test-tsearch.c b/gnulib/tests/test-tsearch.c
new file mode 100644
index 00000000..454fef60
--- /dev/null
+++ b/gnulib/tests/test-tsearch.c
@@ -0,0 +1,352 @@
+/* Test program for tsearch et al.
+ Copyright (C) 1997, 2000-2001, 2007-2010 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software: you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 3 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <search.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (tdelete, void *, (void const *, void **,
+ int (*) (void const *, void const *)));
+SIGNATURE_CHECK (tfind, void *, (void const *, void * const *,
+ int (*) (void const *, void const *)));
+SIGNATURE_CHECK (tsearch, void *, (void const *, void **,
+ int (*) (void const *, void const *)));
+SIGNATURE_CHECK (twalk, void, (void const *,
+ void (*) (void const *, VISIT, int)));
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define SEED 0
+#if HAVE_TSEARCH
+/* The system's tsearch() is not expected to keep the tree balanced. */
+# define BALANCED 0
+#else
+/* The gnulib replacement tsearch() should keep the tree balanced. */
+# define BALANCED 1
+#endif
+#define PASSES 100
+
+#if BALANCED
+#include <math.h>
+#define SIZE 1000
+#else
+#define SIZE 100
+#endif
+
+#undef random
+#define random() (int) ((unsigned int) rand () >> 3)
+
+enum order
+{
+ ascending,
+ descending,
+ randomorder
+};
+
+enum action
+{
+ build,
+ build_and_del,
+ delete,
+ find
+};
+
+/* Set to 1 if a test is flunked. */
+static int error = 0;
+
+/* The keys we add to the tree. */
+static int x[SIZE];
+
+/* Pointers into the key array, possibly permutated, to define an order
+ for insertion/removal. */
+static int y[SIZE];
+
+/* Flags set for each element visited during a tree walk. */
+static int z[SIZE];
+
+/* Depths for all the elements, to check that the depth is constant for
+ all three visits. */
+static int depths[SIZE];
+
+/* Maximum depth during a tree walk. */
+static int max_depth;
+
+/* Compare two keys. */
+static int
+cmp_fn (const void *a, const void *b)
+{
+ return *(const int *) a - *(const int *) b;
+}
+
+/* Permute an array of integers. */
+static void
+memfry (int *string)
+{
+ int i;
+
+ for (i = 0; i < SIZE; ++i)
+ {
+ int32_t j;
+ int c;
+
+ j = random () % SIZE;
+
+ c = string[i];
+ string[i] = string[j];
+ string[j] = c;
+ }
+}
+
+static void
+walk_action (const void *nodep, const VISIT which, const int depth)
+{
+ int key = **(int **) nodep;
+
+ if (depth > max_depth)
+ max_depth = depth;
+ if (which == leaf || which == preorder)
+ {
+ ++z[key];
+ depths[key] = depth;
+ }
+ else
+ {
+ if (depths[key] != depth)
+ {
+ fputs ("Depth for one element is not constant during tree walk.\n",
+ stdout);
+ }
+ }
+}
+
+static void
+walk_tree (void *root, int expected_count)
+{
+ int i;
+
+ memset (z, 0, sizeof z);
+ max_depth = 0;
+
+ twalk (root, walk_action);
+ for (i = 0; i < expected_count; ++i)
+ if (z[i] != 1)
+ {
+ fputs ("Node was not visited.\n", stdout);
+ error = 1;
+ }
+
+#if BALANCED
+ if (max_depth > log (expected_count) * 2 + 2)
+#else
+ if (max_depth > expected_count)
+#endif
+ {
+ fputs ("Depth too large during tree walk.\n", stdout);
+ error = 1;
+ }
+}
+
+/* Perform an operation on a tree. */
+static void
+mangle_tree (enum order how, enum action what, void **root, int lag)
+{
+ int i;
+
+ if (how == randomorder)
+ {
+ for (i = 0; i < SIZE; ++i)
+ y[i] = i;
+ memfry (y);
+ }
+
+ for (i = 0; i < SIZE + lag; ++i)
+ {
+ void *elem;
+ int j, k;
+
+ switch (how)
+ {
+ case randomorder:
+ if (i >= lag)
+ k = y[i - lag];
+ else
+ /* Ensure that the array index is within bounds. */
+ k = y[(SIZE - i - 1 + lag) % SIZE];
+ j = y[i % SIZE];
+ break;
+
+ case ascending:
+ k = i - lag;
+ j = i;
+ break;
+
+ case descending:
+ k = SIZE - i - 1 + lag;
+ j = SIZE - i - 1;
+ break;
+
+ default:
+ /* This never should happen, but gcc isn't smart enough to
+ recognize it. */
+ abort ();
+ }
+
+ switch (what)
+ {
+ case build_and_del:
+ case build:
+ if (i < SIZE)
+ {
+ if (tfind (x + j, (void *const *) root, cmp_fn) != NULL)
+ {
+ fputs ("Found element which is not in tree yet.\n", stdout);
+ error = 1;
+ }
+ elem = tsearch (x + j, root, cmp_fn);
+ if (elem == 0
+ || tfind (x + j, (void *const *) root, cmp_fn) == NULL)
+ {
+ fputs ("Couldn't find element after it was added.\n",
+ stdout);
+ error = 1;
+ }
+ }
+
+ if (what == build || i < lag)
+ break;
+
+ j = k;
+ /* fall through */
+
+ case delete:
+ elem = tfind (x + j, (void *const *) root, cmp_fn);
+ if (elem == NULL || tdelete (x + j, root, cmp_fn) == NULL)
+ {
+ fputs ("Error deleting element.\n", stdout);
+ error = 1;
+ }
+ break;
+
+ case find:
+ if (tfind (x + j, (void *const *) root, cmp_fn) == NULL)
+ {
+ fputs ("Couldn't find element after it was added.\n", stdout);
+ error = 1;
+ }
+ break;
+
+ }
+ }
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int total_error = 0;
+ static char state[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+ void *root = NULL;
+ int i, j;
+
+#if HAVE_INITSTATE
+ initstate (SEED, state, 8);
+#endif
+
+ for (i = 0; i < SIZE; ++i)
+ x[i] = i;
+
+ /* Do this loop several times to get different permutations for the
+ random case. */
+ fputs ("Series I\n", stdout);
+ for (i = 0; i < PASSES; ++i)
+ {
+ fprintf (stdout, "Pass %d... ", i + 1);
+ fflush (stdout);
+ error = 0;
+
+ mangle_tree (ascending, build, &root, 0);
+ mangle_tree (ascending, find, &root, 0);
+ mangle_tree (descending, find, &root, 0);
+ mangle_tree (randomorder, find, &root, 0);
+ walk_tree (root, SIZE);
+ mangle_tree (ascending, delete, &root, 0);
+
+ mangle_tree (ascending, build, &root, 0);
+ walk_tree (root, SIZE);
+ mangle_tree (descending, delete, &root, 0);
+
+ mangle_tree (ascending, build, &root, 0);
+ walk_tree (root, SIZE);
+ mangle_tree (randomorder, delete, &root, 0);
+
+ mangle_tree (descending, build, &root, 0);
+ mangle_tree (ascending, find, &root, 0);
+ mangle_tree (descending, find, &root, 0);
+ mangle_tree (randomorder, find, &root, 0);
+ walk_tree (root, SIZE);
+ mangle_tree (descending, delete, &root, 0);
+
+ mangle_tree (descending, build, &root, 0);
+ walk_tree (root, SIZE);
+ mangle_tree (descending, delete, &root, 0);
+
+ mangle_tree (descending, build, &root, 0);
+ walk_tree (root, SIZE);
+ mangle_tree (randomorder, delete, &root, 0);
+
+ mangle_tree (randomorder, build, &root, 0);
+ mangle_tree (ascending, find, &root, 0);
+ mangle_tree (descending, find, &root, 0);
+ mangle_tree (randomorder, find, &root, 0);
+ walk_tree (root, SIZE);
+ mangle_tree (randomorder, delete, &root, 0);
+
+ for (j = 1; j < SIZE; j *= 2)
+ {
+ mangle_tree (randomorder, build_and_del, &root, j);
+ }
+
+ fputs (error ? " failed!\n" : " ok.\n", stdout);
+ total_error |= error;
+ }
+
+ fputs ("Series II\n", stdout);
+ for (i = 1; i < SIZE; i *= 2)
+ {
+ fprintf (stdout, "For size %d... ", i);
+ fflush (stdout);
+ error = 0;
+
+ mangle_tree (ascending, build_and_del, &root, i);
+ mangle_tree (descending, build_and_del, &root, i);
+ mangle_tree (ascending, build_and_del, &root, i);
+ mangle_tree (descending, build_and_del, &root, i);
+ mangle_tree (ascending, build_and_del, &root, i);
+ mangle_tree (descending, build_and_del, &root, i);
+ mangle_tree (ascending, build_and_del, &root, i);
+ mangle_tree (descending, build_and_del, &root, i);
+
+ fputs (error ? " failed!\n" : " ok.\n", stdout);
+ total_error |= error;
+ }
+
+ return total_error;
+}
diff --git a/gnulib/tests/test-tsearch.sh b/gnulib/tests/test-tsearch.sh
new file mode 100755
index 00000000..c206956b
--- /dev/null
+++ b/gnulib/tests/test-tsearch.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-tsearch.out"
+./test-tsearch${EXEEXT} > t-tsearch.out 2>&1
+test $? = 0 || { cat t-tsearch.out 1>&2; rm -f $tmpfiles; exit 1; }
+
+rm -f $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-u64.c b/gnulib/tests/test-u64.c
new file mode 100644
index 00000000..c3452270
--- /dev/null
+++ b/gnulib/tests/test-u64.c
@@ -0,0 +1,47 @@
+/* Test of <u64.h>
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2009. */
+
+#include <config.h>
+
+#include <u64.h>
+
+int
+main (void)
+{
+ u64 i = u64init (42, 4711);
+ u64 j, k, l;
+
+ j = u64hilo (42, 4711);
+
+ if (u64lt (i, j) || u64lt (j, i))
+ return 1;
+
+ i = u64hilo (0, 42);
+ j = u64hilo (0, 43);
+
+ if (!u64lt (i, j))
+ return 1;
+
+ k = u64plus (i, j);
+ l = u64hilo (0, 42 + 43);
+
+ if (u64lt (k, l) || u64lt (l, k))
+ return 1;
+
+ return 0;
+}
diff --git a/gnulib/tests/test-uname.c b/gnulib/tests/test-uname.c
new file mode 100644
index 00000000..322b58b0
--- /dev/null
+++ b/gnulib/tests/test-uname.c
@@ -0,0 +1,64 @@
+/* Test of system information.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <sys/utsname.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (uname, int, (struct utsname *));
+
+#include <stdio.h>
+#include <string.h>
+
+#include "macros.h"
+
+
+/* This program can be called with no arguments, then it performs a unit
+ test. Or it can be called with 1 argument, then it prints the uname
+ contents to standard output. */
+
+int
+main (int argc, char *argv[])
+{
+ struct utsname buf;
+
+ memset (&buf, '?', sizeof (buf));
+
+ ASSERT (uname (&buf) >= 0);
+
+ /* Verify that every field's value is NUL terminated. */
+ ASSERT (strlen (buf.sysname) < sizeof (buf.sysname));
+ ASSERT (strlen (buf.nodename) < sizeof (buf.nodename));
+ ASSERT (strlen (buf.release) < sizeof (buf.release));
+ ASSERT (strlen (buf.version) < sizeof (buf.version));
+ ASSERT (strlen (buf.machine) < sizeof (buf.machine));
+
+ if (argc > 1)
+ {
+ /* Show the result. */
+
+ printf ("uname -n = nodename = %s\n", buf.nodename);
+ printf ("uname -s = sysname = %s\n", buf.sysname);
+ printf ("uname -r = release = %s\n", buf.release);
+ printf ("uname -v = version = %s\n", buf.version);
+ printf ("uname -m = machine or cpu = %s\n", buf.machine);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-unistd.c b/gnulib/tests/test-unistd.c
new file mode 100644
index 00000000..ec02eeef
--- /dev/null
+++ b/gnulib/tests/test-unistd.c
@@ -0,0 +1,56 @@
+/* Test of <unistd.h> substitute.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "verify.h"
+
+/* Check that NULL can be passed through varargs as a pointer type,
+ per POSIX 2008. */
+verify (sizeof NULL == sizeof (void *));
+
+/* Check that the various SEEK_* macros are defined. */
+int sk[] = { SEEK_CUR, SEEK_END, SEEK_SET };
+
+/* Check that the various *_FILENO macros are defined. */
+#if ! (defined STDIN_FILENO \
+ && (STDIN_FILENO + STDOUT_FILENO + STDERR_FILENO == 3))
+missing or broken *_FILENO macros
+#endif
+
+/* Check that the types are all defined. */
+size_t t1;
+ssize_t t2;
+#ifdef TODO /* Not implemented in gnulib yet */
+uid_t t3;
+gid_t t4;
+#endif
+off_t t5;
+pid_t t6;
+#ifdef TODO
+useconds_t t7;
+intptr_t t8;
+#endif
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-unlink.c b/gnulib/tests/test-unlink.c
new file mode 100644
index 00000000..4f7de5fc
--- /dev/null
+++ b/gnulib/tests/test-unlink.c
@@ -0,0 +1,49 @@
+/* Tests of unlink.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (unlink, int, (char const *));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "unlinkdir.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-unlink.t"
+
+#include "test-unlink.h"
+
+int
+main (void)
+{
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ return test_unlink_func (unlink, true);
+}
diff --git a/gnulib/tests/test-unlink.h b/gnulib/tests/test-unlink.h
new file mode 100644
index 00000000..a8b1db8e
--- /dev/null
+++ b/gnulib/tests/test-unlink.h
@@ -0,0 +1,86 @@
+/* Tests of unlink.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+/* This file is designed to test both unlink(n) and
+ unlinkat(AT_FDCWD,n,0). FUNC is the function to test. Assumes
+ that BASE and ASSERT are already defined, and that appropriate
+ headers are already included. If PRINT, then warn before returning
+ status 77 when symlinks are unsupported. */
+
+static int
+test_unlink_func (int (*func) (char const *name), bool print)
+{
+ /* Setup. */
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (close (creat (BASE "dir/file", 0600)) == 0);
+
+ /* Basic error conditions. */
+ errno = 0;
+ ASSERT (func ("") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "nosuch") == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func (BASE "nosuch/") == -1);
+ ASSERT (errno == ENOENT);
+ /* Resulting errno after directories is rather varied across
+ implementations (EPERM, EINVAL, EACCES, EBUSY, EISDIR, ENOTSUP);
+ however, we must be careful to not attempt unlink on a directory
+ unless we know it must fail. */
+ if (cannot_unlink_dir ())
+ {
+ ASSERT (func (".") == -1);
+ ASSERT (func ("..") == -1);
+ ASSERT (func ("/") == -1);
+ ASSERT (func (BASE "dir") == -1);
+ ASSERT (mkdir (BASE "dir1", 0700) == 0);
+ ASSERT (func (BASE "dir1") == -1);
+ ASSERT (rmdir (BASE "dir1") == 0);
+ }
+ errno = 0;
+ ASSERT (func (BASE "dir/file/") == -1);
+ ASSERT (errno == ENOTDIR);
+
+ /* Test symlink behavior. Specifying trailing slash will attempt
+ unlink of a directory, so only attempt it if we know it must
+ fail. */
+ if (symlink (BASE "dir", BASE "link") != 0)
+ {
+ ASSERT (func (BASE "dir/file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ if (cannot_unlink_dir ())
+ ASSERT (func (BASE "link/") == -1);
+ ASSERT (func (BASE "link") == 0);
+ ASSERT (symlink (BASE "dir/file", BASE "link") == 0);
+ errno = 0;
+ ASSERT (func (BASE "link/") == -1);
+ ASSERT (errno == ENOTDIR);
+ /* Order here proves unlink of a symlink does not follow through to
+ the file. */
+ ASSERT (func (BASE "link") == 0);
+ ASSERT (func (BASE "dir/file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-unlinkat.c b/gnulib/tests/test-unlinkat.c
new file mode 100644
index 00000000..7d805743
--- /dev/null
+++ b/gnulib/tests/test-unlinkat.c
@@ -0,0 +1,82 @@
+/* Tests of unlinkat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (unlinkat, int, (int, char const *, int));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "unlinkdir.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-unlinkat.t"
+
+#include "test-rmdir.h"
+#include "test-unlink.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper around unlinkat to test rmdir behavior. */
+static int
+rmdirat (char const *name)
+{
+ return unlinkat (dfd, name, AT_REMOVEDIR);
+}
+
+/* Wrapper around unlinkat to test unlink behavior. */
+static int
+unlinker (char const *name)
+{
+ return unlinkat (dfd, name, 0);
+}
+
+int
+main (void)
+{
+ /* FIXME: Add tests of fd other than ".". */
+ int result1;
+ int result2;
+
+ /* Remove any leftovers from a previous partial run. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ result1 = test_rmdir_func (rmdirat, false);
+ result2 = test_unlink_func (unlinker, false);
+ ASSERT (result1 == result2);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ result2 = test_rmdir_func (rmdirat, false);
+ ASSERT (result1 == result2);
+ result2 = test_unlink_func (unlinker, false);
+ ASSERT (result1 == result2);
+ ASSERT (close (dfd) == 0);
+ if (result1 == 77)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return result1;
+}
diff --git a/gnulib/tests/test-unsetenv.c b/gnulib/tests/test-unsetenv.c
new file mode 100644
index 00000000..7b92ff37
--- /dev/null
+++ b/gnulib/tests/test-unsetenv.c
@@ -0,0 +1,61 @@
+/* Tests of unsetenv.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (unsetenv, int, (char const *));
+
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+ char entry[] = "b=2";
+
+ /* Test removal when multiple entries present. */
+ ASSERT (putenv ((char *) "a=1") == 0);
+ ASSERT (putenv (entry) == 0);
+ entry[0] = 'a'; /* Unspecified what getenv("a") would be at this point. */
+ ASSERT (unsetenv ("a") == 0); /* Both entries will be removed. */
+ ASSERT (getenv ("a") == NULL);
+ ASSERT (unsetenv ("a") == 0);
+
+ /* Required to fail with EINVAL. */
+ errno = 0;
+ ASSERT (unsetenv ("") == -1);
+ ASSERT (errno == EINVAL);
+ errno = 0;
+ ASSERT (unsetenv ("a=b") == -1);
+ ASSERT (errno == EINVAL);
+#if 0
+ /* glibc and gnulib's implementation guarantee this, but POSIX no
+ longer requires it: http://austingroupbugs.net/view.php?id=185 */
+ errno = 0;
+ ASSERT (unsetenv (NULL) == -1);
+ ASSERT (errno == EINVAL);
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/test-update-copyright.sh b/gnulib/tests/test-update-copyright.sh
new file mode 100755
index 00000000..2d1022a9
--- /dev/null
+++ b/gnulib/tests/test-update-copyright.sh
@@ -0,0 +1,526 @@
+#!/bin/sh
+# Test suite for update-copyright.
+# Copyright (C) 2009-2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+diffout=`diff -u /dev/null /dev/null 2>&1`
+if test x"$diffout" = x"" && test $? -eq 0; then
+ compare() { diff -u "$@"; }
+else
+ compare() { cmp "$@"; }
+fi
+
+TMP_BASE=update-copyright.test
+trap 'rm -f $TMP_BASE*' 0 1 2 3 15
+
+## --------------------------------- ##
+## Skip if user does not have perl. ##
+## --------------------------------- ##
+
+TMP=$TMP_BASE
+s=$TMP-script
+cat <<\EOF > $s
+eval '(exit $?0)' && eval 'exec perl -wS -0777 -pi "$0" ${1+"$@"}'
+ & eval 'exec perl -wS -0777 -pi "$0" $argv:q'
+ if 0;
+s/a/b/
+EOF
+chmod a+x $s
+echo a > $TMP-in
+./$s $TMP-in 2>/dev/null && test b = "`cat $TMP-in 2>/dev/null`" ||
+ {
+ printf '%s\n' "$0: skipping this test;" \
+ 'your system has insufficient support for Perl' 1>&2
+ exit 77
+ }
+
+# Do not let a different envvar setting perturb results.
+UPDATE_COPYRIGHT_MAX_LINE_LENGTH=72
+export UPDATE_COPYRIGHT_MAX_LINE_LENGTH
+
+## ----------------------------- ##
+## Examples from documentation. ##
+## ----------------------------- ##
+
+TMP=$TMP_BASE-ex
+cat > $TMP.1 <<EOF
+Copyright @copyright{} 1990-2005, 2007-2009 Free Software
+Foundation, Inc.
+EOF
+cat > $TMP.2 <<EOF
+# Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+EOF
+cat > $TMP.3 <<EOF
+/*
+ * Copyright &copy; 90,2005,2007-2009
+ * Free Software Foundation, Inc.
+ */
+EOF
+cat > $TMP.4 <<EOF
+## Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+EOF
+cat > $TMP.5 <<EOF
+Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+EOF
+cat > $TMP.6 <<EOF
+## Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+
+Copyright (C) 1990-2005, 2007-2009 Free Software Foundation,
+Inc.
+EOF
+cat > $TMP.7 <<EOF
+Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+
+# Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+EOF
+
+rm -f $TMP.*.bak
+UPDATE_COPYRIGHT_YEAR=2009 \
+ update-copyright $TMP.* 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare - $TMP-stderr <<EOF || exit 1
+$TMP.4: warning: FSF copyright statement not found
+$TMP.5: warning: FSF copyright statement not found
+EOF
+compare - $TMP.1 <<EOF || exit 1
+Copyright @copyright{} 1990-2005, 2007-2009 Free Software
+Foundation, Inc.
+EOF
+compare - $TMP.2 <<EOF || exit 1
+# Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+EOF
+compare - $TMP.3 <<EOF || exit 1
+/*
+ * Copyright &copy; 90,2005,2007-2009
+ * Free Software Foundation, Inc.
+ */
+EOF
+compare - $TMP.4 <<EOF || exit 1
+## Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+EOF
+compare - $TMP.5 <<EOF || exit 1
+Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+EOF
+compare - $TMP.6 <<EOF || exit 1
+## Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+
+Copyright (C) 1990-2005, 2007-2009 Free Software Foundation,
+Inc.
+EOF
+compare - $TMP.7 <<EOF || exit 1
+Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+
+# Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+EOF
+
+rm -f $TMP.*.bak
+UPDATE_COPYRIGHT_YEAR=2010 UPDATE_COPYRIGHT_USE_INTERVALS=1 \
+ update-copyright $TMP.* 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare - $TMP-stderr <<EOF || exit 1
+$TMP.4: warning: FSF copyright statement not found
+$TMP.5: warning: FSF copyright statement not found
+EOF
+compare - $TMP.1 <<EOF || exit 1
+Copyright @copyright{} 1990-2005, 2007-2010 Free Software Foundation,
+Inc.
+EOF
+compare - $TMP.2 <<EOF || exit 1
+# Copyright (C) 1990-2005, 2007-2010 Free Software Foundation, Inc.
+EOF
+compare - $TMP.3 <<EOF || exit 1
+/*
+ * Copyright &copy; 1990, 2005, 2007-2010 Free Software Foundation, Inc.
+ */
+EOF
+compare - $TMP.4 <<EOF || exit 1
+## Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+EOF
+compare - $TMP.5 <<EOF || exit 1
+Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+EOF
+compare - $TMP.6 <<EOF || exit 1
+## Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+
+Copyright (C) 1990-2005, 2007-2010 Free Software Foundation, Inc.
+EOF
+compare - $TMP.7 <<EOF || exit 1
+Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+
+# Copyright (C) 1990-2005, 2007-2010 Free Software Foundation, Inc.
+EOF
+
+rm -f $TMP.*.bak
+UPDATE_COPYRIGHT_YEAR=2010 UPDATE_COPYRIGHT_FORCE=1 \
+ update-copyright $TMP.* 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare - $TMP-stderr <<EOF || exit 1
+$TMP.4: warning: FSF copyright statement not found
+$TMP.5: warning: FSF copyright statement not found
+EOF
+compare - $TMP.1 <<EOF || exit 1
+Copyright @copyright{} 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+Free Software Foundation, Inc.
+EOF
+compare - $TMP.2 <<EOF || exit 1
+# Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+# 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free
+# Software Foundation, Inc.
+EOF
+compare - $TMP.3 <<EOF || exit 1
+/*
+ * Copyright &copy; 1990, 2005, 2007, 2008, 2009, 2010 Free Software
+ * Foundation, Inc.
+ */
+EOF
+compare - $TMP.4 <<EOF || exit 1
+## Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+EOF
+compare - $TMP.5 <<EOF || exit 1
+Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+EOF
+compare - $TMP.6 <<EOF || exit 1
+## Copyright (C) 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+
+Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+EOF
+compare - $TMP.7 <<EOF || exit 1
+Copyright (C) 1990-2005, 2007-2009 Acme, Inc.
+
+# Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+# 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free
+# Software Foundation, Inc.
+EOF
+
+rm $TMP*
+
+## -------------- ##
+## Current year. ##
+## -------------- ##
+
+TMP=$TMP_BASE-current-year
+YEAR=`date +%Y`
+cat > $TMP <<EOF
+'\" Copyright (C) 2006
+'\" Free Software Foundation,
+'\" Inc.
+EOF
+update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+'\" Copyright (C) 2006, $YEAR Free Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_USE_INTERVALS=1 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+'\" Copyright (C) 2006, $YEAR Free Software Foundation, Inc.
+EOF
+rm $TMP*
+
+## ------------------ ##
+## Surrounding text. ##
+## ------------------ ##
+
+TMP=$TMP_BASE-surrounding-text
+cat > $TMP <<EOF
+ Undisturbed text.
+dnl Undisturbed text.
+dnl Copyright (C) 89
+dnl Free Software Foundation, Inc.
+dnl Undisturbed text.
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+ Undisturbed text.
+dnl Undisturbed text.
+dnl Copyright (C) 1989, 2010 Free Software Foundation, Inc.
+dnl Undisturbed text.
+EOF
+rm $TMP*
+
+## --------------- ##
+## Widest prefix. ##
+## --------------- ##
+
+TMP=$TMP_BASE-widest-prefix
+cat > $TMP <<EOF
+#### Copyright (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985,
+#### 1986, 1987, 1988, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+#### 2008 Free Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+#### Copyright (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984,
+#### 1985, 1986, 1987, 1988, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+#### 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2011 UPDATE_COPYRIGHT_USE_INTERVALS=1 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+#### Copyright (C) 1976-1988, 1999-2008, 2010-2011 Free Software
+#### Foundation, Inc.
+EOF
+rm $TMP*
+
+## ------------------- ##
+## Prefix too large. ##
+## ------------------- ##
+
+TMP=$TMP_BASE-prefix-too-large
+cat > $TMP <<EOF
+#### Copyright (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985,
+#### 1986, 1987, 1988, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+#### 2008 Free Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare - $TMP-stderr <<EOF || exit 1
+$TMP: warning: FSF copyright statement not found
+EOF
+compare - $TMP <<EOF || exit 1
+#### Copyright (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985,
+#### 1986, 1987, 1988, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+#### 2008 Free Software Foundation, Inc.
+EOF
+rm $TMP*
+
+## ------------- ##
+## Blank lines. ##
+## ------------- ##
+
+TMP=$TMP_BASE-blank-lines
+cat > $TMP <<EOF
+#Copyright (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985,
+#
+#1986, 1987, 1988, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+#2008 Free Software Foundation, Inc.
+
+Copyright (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985,
+
+1986, 1987, 1988, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 Free Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare - $TMP-stderr <<EOF || exit 1
+$TMP: warning: FSF copyright statement not found
+EOF
+compare - $TMP <<EOF || exit 1
+#Copyright (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985,
+#
+#1986, 1987, 1988, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+#2008 Free Software Foundation, Inc.
+
+Copyright (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985,
+
+1986, 1987, 1988, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 Free Software Foundation, Inc.
+EOF
+rm $TMP*
+
+## -------------- ##
+## Leading tabs. ##
+## -------------- ##
+
+TMP=$TMP_BASE-leading-tabs
+cat > $TMP <<EOF
+ Copyright (C) 87, 88, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 98,
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free
+ Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+ Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996,
+ 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2011 UPDATE_COPYRIGHT_USE_INTERVALS=1 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+ Copyright (C) 1987-1988, 1991-2011 Free Software Foundation,
+ Inc.
+EOF
+rm $TMP*
+
+## -------------------- ##
+## Unusual whitespace. ##
+## -------------------- ##
+
+TMP=$TMP_BASE-unusual-ws
+cat > $TMP <<EOF
+ # Copyright (C) 87-88, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+ # 98, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ # 2009 Free Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+ # Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994,
+ # 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+ # 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+ # Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2011 UPDATE_COPYRIGHT_USE_INTERVALS=1 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+ # Copyright (C) 1987-1988, 1991-2011 Free Software
+ # Foundation, Inc.
+EOF
+rm $TMP*
+
+## --------- ##
+## DOS EOL. ##
+## --------- ##
+
+TMP=$TMP_BASE-dos-eol
+tr @ '\015' > $TMP <<\EOF
+Rem Copyright (C) 87, 88, 1991, 1992, 1993, 1994, 1995, 1996, 1997,@
+Rem 98, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,@
+Rem 2009 Free Software Foundation, Inc.@
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+tr @ '\015' > $TMP-exp <<\EOF
+Rem Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997,@
+Rem 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,@
+Rem 2009, 2010 Free Software Foundation, Inc.@
+EOF
+compare $TMP-exp $TMP || exit 1
+rm $TMP*
+
+## --------------- ##
+## Omitted "(C)". ##
+## --------------- ##
+
+TMP=$TMP_BASE-omitted-circle-c
+cat > $TMP <<EOF
+ Copyright 87, 88, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+ 98, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ 2009 Free Software Foundation, Inc.
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP <<EOF || exit 1
+ Copyright 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Free Software Foundation, Inc.
+EOF
+rm $TMP*
+
+## ------------------ ##
+## C-style comments. ##
+## ------------------ ##
+
+TMP=$TMP_BASE-c-style-comments
+cat > $TMP.star <<EOF
+/* Copyright 87, 88, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+ * 98, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ * 2009 Free Software Foundation, Inc. */
+EOF
+cat > $TMP.space <<EOF
+ /*Copyright 87, 88, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+ 98, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ 2009 Free Software Foundation, Inc. */
+EOF
+cat > $TMP.single-line <<EOF
+/* Copyright 87, 1991, 1992 Free Software Foundation, Inc. */
+EOF
+cat > $TMP.single-line-wrapped <<EOF
+ /* Copyright 1988, 1991, 1992, 1993 Free Software Foundation, Inc. */
+EOF
+cat > $TMP.extra-text-star <<EOF
+ /* Copyright 1987, 1988, 1991, 1992 Free Software Foundation, Inc. End
+ * More comments. */
+EOF
+cat > $TMP.extra-text-space <<EOF
+ /* Copyright 1987, 1988, 1991, 1992 Free Software Foundation, Inc. ***
+ * End of comments. */
+EOF
+UPDATE_COPYRIGHT_YEAR=2010 \
+ update-copyright $TMP.* 1> $TMP-stdout 2> $TMP-stderr
+compare /dev/null $TMP-stdout || exit 1
+compare /dev/null $TMP-stderr || exit 1
+compare - $TMP.star <<EOF || exit 1
+/* Copyright 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+ * 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ * 2009, 2010 Free Software Foundation, Inc. */
+EOF
+compare - $TMP.space <<EOF || exit 1
+ /*Copyright 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+ 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ 2009, 2010 Free Software Foundation, Inc. */
+EOF
+compare - $TMP.single-line <<EOF || exit 1
+/* Copyright 1987, 1991, 1992, 2010 Free Software Foundation, Inc. */
+EOF
+compare - $TMP.single-line-wrapped <<EOF || exit 1
+ /* Copyright 1988, 1991, 1992, 1993, 2010 Free Software Foundation,
+ * Inc. */
+EOF
+compare - $TMP.extra-text-star <<EOF || exit 1
+ /* Copyright 1987, 1988, 1991, 1992, 2010 Free Software Foundation,
+ * Inc. End
+ * More comments. */
+EOF
+compare - $TMP.extra-text-space <<EOF || exit 1
+ /* Copyright 1987, 1988, 1991, 1992, 2010 Free Software Foundation,
+ Inc. ***
+ * End of comments. */
+EOF
+rm $TMP*
+
+exit 0
diff --git a/gnulib/tests/test-userspec.c b/gnulib/tests/test-userspec.c
new file mode 100644
index 00000000..17428f22
--- /dev/null
+++ b/gnulib/tests/test-userspec.c
@@ -0,0 +1,191 @@
+/* Test userspec.c
+ Copyright (C) 2009-2010 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "userspec.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+
+#include "xalloc.h"
+
+#define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
+
+struct test
+{
+ const char *in;
+ uid_t uid;
+ gid_t gid;
+ const char *user_name;
+ const char *group_name;
+ const char *result;
+};
+
+static struct test T[] =
+ {
+ { "", -1, -1, "", "", NULL},
+ { ":", -1, -1, "", "", NULL},
+ { "0:0", 0, 0, "", "", NULL},
+ { ":1", -1, 1, "", "", NULL},
+ { "1", 1, -1, "", "", NULL},
+ { ":+0", -1, 0, "", "", NULL},
+ { "22:42", 22, 42, "", "", NULL},
+ /* (uint32_t)-1 should be invalid everywhere */
+ { "4294967295:4294967295", 0, 0, NULL, NULL, "invalid user"},
+ /* likewise, but with only the group being invalid */
+ { "0:4294967295", 0, 0, NULL, NULL, "invalid group"},
+ { ":4294967295", 0, 0, NULL, NULL, "invalid group"},
+ /* and only the user being invalid */
+ { "4294967295:0", 0, 0, NULL, NULL, "invalid user"},
+ /* and using 2^32 */
+ { "4294967296:4294967296", 0, 0, NULL, NULL, "invalid user"},
+ { "0:4294967296", 0, 0, NULL, NULL, "invalid group"},
+ { ":4294967296", 0, 0, NULL, NULL, "invalid group"},
+ { "4294967296:0", 0, 0, NULL, NULL, "invalid user"},
+ /* numeric user and no group is invalid */
+ { "4294967295:", 0, 0, NULL, NULL, "invalid spec"},
+ { "4294967296:", 0, 0, NULL, NULL, "invalid spec"},
+ { "1:", 0, 0, NULL, NULL, "invalid spec"},
+ { "+0:", 0, 0, NULL, NULL, "invalid spec"},
+
+ /* "username:" must expand to UID:GID where GID is username's login group */
+ /* Add an entry like the following to the table, if possible.
+ { "U_NAME:", UID,GID, U_NAME, G_NAME, NULL}, */
+ { NULL, 0, 0, NULL, NULL, ""}, /* place-holder */
+
+ { NULL, 0, 0, NULL, NULL, ""}
+ };
+
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+static char const *
+maybe_null (char const *s)
+{
+ return s ? s : "NULL";
+}
+
+static bool
+same_diag (char const *s, char const *t)
+{
+ if (s == NULL && t == NULL)
+ return true;
+ if (s == NULL || t == NULL)
+ return false;
+ return STREQ (s, t);
+}
+
+int
+main (void)
+{
+ unsigned int i;
+ int fail = 0;
+
+ /* Find a UID that has both a user name and login group name,
+ but skip UID 0. */
+ {
+ uid_t uid;
+ for (uid = 1200; 0 < uid; uid--)
+ {
+ struct group *gr;
+ struct passwd *pw = getpwuid (uid);
+ unsigned int j;
+ size_t len;
+ if (!pw || !pw->pw_name || !(gr = getgrgid (pw->pw_gid)) || !gr->gr_name)
+ continue;
+ j = ARRAY_CARDINALITY (T) - 2;
+ assert (T[j].in == NULL);
+ assert (T[j+1].in == NULL);
+ len = strlen (pw->pw_name);
+
+ /* Store "username:" in T[j].in. */
+ {
+ char *t = xmalloc (len + 1 + 1);
+ memcpy (t, pw->pw_name, len);
+ t[len] = ':';
+ t[len+1] = '\0';
+ T[j].in = t;
+ }
+
+ T[j].uid = uid;
+ T[j].gid = gr->gr_gid;
+ T[j].user_name = xstrdup (pw->pw_name);
+ T[j].group_name = xstrdup (gr->gr_name);
+ T[j].result = NULL;
+ break;
+ }
+ }
+
+ for (i = 0; T[i].in; i++)
+ {
+ uid_t uid = (uid_t) -1;
+ gid_t gid = (gid_t) -1;
+ char *user_name;
+ char *group_name;
+ char const *diag = parse_user_spec (T[i].in, &uid, &gid,
+ &user_name, &group_name);
+ free (user_name);
+ free (group_name);
+ if (!same_diag (diag, T[i].result))
+ {
+ printf ("%s return value mismatch: got %s, expected %s\n",
+ T[i].in, maybe_null (diag), maybe_null (T[i].result));
+ fail = 1;
+ continue;
+ }
+
+ if (diag)
+ continue;
+
+ if (uid != T[i].uid || gid != T[i].gid)
+ {
+ printf ("%s mismatch (-: expected uid,gid; +:actual)\n"
+ "-%3lu,%3lu\n+%3lu,%3lu\n",
+ T[i].in,
+ (unsigned long int) T[i].uid,
+ (unsigned long int) T[i].gid,
+ (unsigned long int) uid,
+ (unsigned long int) gid);
+ fail = 1;
+ }
+
+ if (!diag && !T[i].result)
+ continue;
+
+ {
+ printf ("%s diagnostic mismatch (-: expected uid,gid; +:actual)\n"
+ "-%s\n+%s\n",
+ T[i].in, T[i].result, diag);
+ fail = 1;
+ }
+ }
+
+ return fail;
+}
+
+/*
+Local Variables:
+indent-tabs-mode: nil
+End:
+*/
diff --git a/gnulib/tests/test-usleep.c b/gnulib/tests/test-usleep.c
new file mode 100644
index 00000000..38c8cdc0
--- /dev/null
+++ b/gnulib/tests/test-usleep.c
@@ -0,0 +1,40 @@
+/* Test of usleep() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (usleep, int, (useconds_t));
+
+#include <time.h>
+
+#include "macros.h"
+
+int
+main(void)
+{
+ time_t start = time (NULL);
+ ASSERT (usleep (1000000) == 0);
+ ASSERT (start < time (NULL));
+
+ ASSERT (usleep (0) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-utimens-common.h b/gnulib/tests/test-utimens-common.h
new file mode 100644
index 00000000..3ea180b0
--- /dev/null
+++ b/gnulib/tests/test-utimens-common.h
@@ -0,0 +1,60 @@
+/* Test of file timestamp modification functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* This file defines some prerequisites useful to utime-related tests. */
+
+#ifndef GL_TEST_UTIMENS_COMMON
+# define GL_TEST_UTIMENS_COMMON
+
+# include <fcntl.h>
+# include <errno.h>
+# include <string.h>
+# include <unistd.h>
+
+/* Gnulib modules. */
+# include "stat-time.h"
+# include "timespec.h"
+# include "utimecmp.h"
+
+/* Gnulib test header. */
+# include "nap.h"
+
+enum {
+ BILLION = 1000 * 1000 * 1000,
+
+ Y2K = 946684800, /* Jan 1, 2000, in seconds since epoch. */
+
+ /* Bogus positive and negative tv_nsec values closest to valid
+ range, but without colliding with UTIME_NOW or UTIME_OMIT. */
+ UTIME_BOGUS_POS = BILLION + ((UTIME_NOW == BILLION || UTIME_OMIT == BILLION)
+ ? (1 + (UTIME_NOW == BILLION + 1)
+ + (UTIME_OMIT == BILLION + 1))
+ : 0),
+ UTIME_BOGUS_NEG = -1 - ((UTIME_NOW == -1 || UTIME_OMIT == -1)
+ ? (1 + (UTIME_NOW == -2) + (UTIME_OMIT == -2))
+ : 0)
+};
+
+# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+/* Skip ctime tests on native Windows, since it is either a copy of
+ mtime or birth time (depending on the file system), rather than a
+ properly tracked change time. */
+# define check_ctime 0
+# else
+# define check_ctime 1
+# endif
+
+#endif /* GL_TEST_UTIMENS_COMMON */
diff --git a/gnulib/tests/test-utimens.c b/gnulib/tests/test-utimens.c
new file mode 100644
index 00000000..f2a31a88
--- /dev/null
+++ b/gnulib/tests/test-utimens.c
@@ -0,0 +1,80 @@
+/* Tests of utimens.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include "utimens.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-utimens.t"
+
+#include "test-futimens.h"
+#include "test-lutimens.h"
+#include "test-utimens.h"
+
+/* Wrap gl_futimens to behave like futimens. */
+static int
+do_futimens (int fd, struct timespec const times[2])
+{
+ return gl_futimens (fd, NULL, times);
+}
+
+/* Test the use of file descriptors alongside a name. */
+static int
+do_fdutimens (char const *name, struct timespec const times[2])
+{
+ int result;
+ int fd = open (name, O_WRONLY);
+ if (fd < 0)
+ fd = open (name, O_RDONLY);
+ errno = 0;
+ result = fdutimens (name, fd, times);
+ if (0 <= fd)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ }
+ return result;
+}
+
+int
+main (void)
+{
+ int result1; /* Skip because of no symlink support. */
+ int result2; /* Skip because of no futimens support. */
+ int result3; /* Skip because of no lutimens support. */
+
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ result1 = test_utimens (utimens, true);
+ ASSERT (test_utimens (do_fdutimens, false) == result1);
+ /* Print only one skip message. */
+ result2 = test_futimens (do_futimens, result1 == 0);
+ result3 = test_lutimens (lutimens, (result1 + result2) == 0);
+ /* We expect 0/0, 0/77, or 77/77, but not 77/0. */
+ ASSERT (result1 <= result3);
+ return result1 | result2 | result3;
+}
diff --git a/gnulib/tests/test-utimens.h b/gnulib/tests/test-utimens.h
new file mode 100644
index 00000000..277bc952
--- /dev/null
+++ b/gnulib/tests/test-utimens.h
@@ -0,0 +1,170 @@
+/* Test of file timestamp modification functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include "test-utimens-common.h"
+
+/* This file is designed to test both utimens(a,b) and
+ utimensat(AT_FDCWD,a,b,0). FUNC is the function to test. Assumes
+ that BASE and ASSERT are already defined. If PRINT, warn before
+ skipping tests with status 77. */
+static int
+test_utimens (int (*func) (char const *, struct timespec const *), bool print)
+{
+ struct stat st1;
+ struct stat st2;
+
+ ASSERT (close (creat (BASE "file", 0600)) == 0);
+ /* If utimens truncates to less resolution than the file system
+ supports, then time can appear to go backwards between now and a
+ follow-up utimens with UTIME_NOW or a NULL timespec. Use
+ UTIMECMP_TRUNCATE_SOURCE to compensate, with st1 as the
+ source. */
+ ASSERT (stat (BASE "file", &st1) == 0);
+ nap ();
+ ASSERT (func (BASE "file", NULL) == 0);
+ ASSERT (stat (BASE "file", &st2) == 0);
+ ASSERT (0 <= utimecmp (BASE "file", &st2, &st1, UTIMECMP_TRUNCATE_SOURCE));
+ if (check_ctime)
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+ {
+ /* On some NFS systems, the 'now' timestamp of creat or a NULL
+ timespec is determined by the server, but the 'now' timestamp
+ determined by gettime() (as is done when using UTIME_NOW) is
+ determined by the client; since the two machines are not
+ necessarily on the same clock, this is another case where time
+ can appear to go backwards. The rest of this test cares about
+ client time, so manually use gettime() to set both times. */
+ struct timespec ts[2];
+ gettime (&ts[0]);
+ ts[1] = ts[0];
+ ASSERT (func (BASE "file", ts) == 0);
+ ASSERT (stat (BASE "file", &st1) == 0);
+ nap ();
+ }
+
+ /* Invalid arguments. */
+ errno = 0;
+ ASSERT (func ("no_such", NULL) == -1);
+ ASSERT (errno == ENOENT);
+ errno = 0;
+ ASSERT (func ("no_such/", NULL) == -1);
+ ASSERT (errno == ENOENT || errno == ENOTDIR);
+ errno = 0;
+ ASSERT (func ("", NULL) == -1);
+ ASSERT (errno == ENOENT);
+ {
+ struct timespec ts[2] = { { Y2K, UTIME_BOGUS_POS }, { Y2K, 0 } };
+ errno = 0;
+ ASSERT (func (BASE "file", ts) == -1);
+ ASSERT (errno == EINVAL);
+ }
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, UTIME_BOGUS_NEG } };
+ errno = 0;
+ ASSERT (func (BASE "file", ts) == -1);
+ ASSERT (errno == EINVAL);
+ }
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, 0 } };
+ errno = 0;
+ ASSERT (func (BASE "file/", ts) == -1);
+ ASSERT (errno == ENOTDIR || errno == EINVAL);
+ }
+ ASSERT (stat (BASE "file", &st2) == 0);
+ ASSERT (st1.st_atime == st2.st_atime);
+ ASSERT (get_stat_atime_ns (&st1) == get_stat_atime_ns (&st2));
+ ASSERT (utimecmp (BASE "file", &st1, &st2, 0) == 0);
+
+ /* Set both times. */
+ {
+ struct timespec ts[2] = { { Y2K, BILLION / 2 - 1 }, { Y2K, BILLION - 1 } };
+ ASSERT (func (BASE "file", ts) == 0);
+ ASSERT (stat (BASE "file", &st2) == 0);
+ ASSERT (st2.st_atime == Y2K);
+ ASSERT (0 <= get_stat_atime_ns (&st2));
+ ASSERT (get_stat_atime_ns (&st2) < BILLION / 2);
+ ASSERT (st2.st_mtime == Y2K);
+ ASSERT (0 <= get_stat_mtime_ns (&st2));
+ ASSERT (get_stat_mtime_ns (&st2) < BILLION);
+ if (check_ctime)
+ ASSERT (st1.st_ctime < st2.st_ctime
+ || (st1.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st1) < get_stat_ctime_ns (&st2)));
+ }
+
+ /* Play with UTIME_OMIT, UTIME_NOW. */
+ {
+ struct stat st3;
+ struct timespec ts[2] = { { BILLION, UTIME_OMIT }, { 0, UTIME_NOW } };
+ nap ();
+ ASSERT (func (BASE "file", ts) == 0);
+ ASSERT (stat (BASE "file", &st3) == 0);
+ ASSERT (st3.st_atime == Y2K);
+ ASSERT (0 <= get_stat_atime_ns (&st3));
+ ASSERT (get_stat_atime_ns (&st3) < BILLION / 2);
+ /* See comment above about this utimecmp call. */
+ ASSERT (0 <= utimecmp (BASE "file", &st3, &st1, UTIMECMP_TRUNCATE_SOURCE));
+ if (check_ctime)
+ ASSERT (st2.st_ctime < st3.st_ctime
+ || (st2.st_ctime == st3.st_ctime
+ && get_stat_ctime_ns (&st2) < get_stat_ctime_ns (&st3)));
+ nap ();
+ ts[0].tv_nsec = 0;
+ ts[1].tv_nsec = UTIME_OMIT;
+ ASSERT (func (BASE "file", ts) == 0);
+ ASSERT (stat (BASE "file", &st2) == 0);
+ ASSERT (st2.st_atime == BILLION);
+ ASSERT (get_stat_atime_ns (&st2) == 0);
+ ASSERT (st3.st_mtime == st2.st_mtime);
+ ASSERT (get_stat_mtime_ns (&st3) == get_stat_mtime_ns (&st2));
+ if (check_ctime)
+ ASSERT (st3.st_ctime < st2.st_ctime
+ || (st3.st_ctime == st2.st_ctime
+ && get_stat_ctime_ns (&st3) < get_stat_ctime_ns (&st2)));
+ }
+
+ /* Make sure this dereferences symlinks. */
+ if (symlink (BASE "file", BASE "link"))
+ {
+ ASSERT (unlink (BASE "file") == 0);
+ if (print)
+ fputs ("skipping test: symlinks not supported on this file system\n",
+ stderr);
+ return 77;
+ }
+ ASSERT (lstat (BASE "link", &st1) == 0);
+ ASSERT (st1.st_mtime != Y2K);
+ errno = 0;
+ ASSERT (func (BASE "link/", NULL) == -1);
+ ASSERT (errno == ENOTDIR);
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, 0 } };
+ ASSERT (func (BASE "link", ts) == 0);
+ ASSERT (lstat (BASE "link", &st2) == 0);
+ /* Can't compare atimes, since lstat() changes symlink atime on cygwin. */
+ ASSERT (st1.st_mtime == st2.st_mtime);
+ ASSERT (stat (BASE "link", &st2) == 0);
+ ASSERT (st2.st_mtime == Y2K);
+ ASSERT (get_stat_mtime_ns (&st2) == 0);
+ }
+
+ /* Cleanup. */
+ ASSERT (unlink (BASE "link") == 0);
+ ASSERT (unlink (BASE "file") == 0);
+ return 0;
+}
diff --git a/gnulib/tests/test-utimensat.c b/gnulib/tests/test-utimensat.c
new file mode 100644
index 00000000..07bdc319
--- /dev/null
+++ b/gnulib/tests/test-utimensat.c
@@ -0,0 +1,111 @@
+/* Tests of utimensat.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (utimensat, int, (int, char const *, struct timespec const[2],
+ int));
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "stat-time.h"
+#include "timespec.h"
+#include "utimecmp.h"
+#include "ignore-value.h"
+#include "macros.h"
+
+#define BASE "test-utimensat.t"
+
+#include "test-lutimens.h"
+#include "test-utimens.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrap utimensat to behave like utimens. */
+static int
+do_utimensat (char const *name, struct timespec const times[2])
+{
+ return utimensat (dfd, name, times, 0);
+}
+
+/* Wrap utimensat to behave like lutimens. */
+static int
+do_lutimensat (char const *name, struct timespec const times[2])
+{
+ return utimensat (dfd, name, times, AT_SYMLINK_NOFOLLOW);
+}
+
+int
+main (void)
+{
+ int result1; /* Skip because of no symlink support. */
+ int result2; /* Skip because of no lutimens support. */
+ int fd;
+
+ /* Clean up any trash from prior testsuite runs. */
+ ignore_value (system ("rm -rf " BASE "*"));
+
+ /* Basic tests. */
+ result1 = test_utimens (do_utimensat, true);
+ result2 = test_lutimens (do_lutimensat, result1 == 0);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_utimens (do_utimensat, false) == result1);
+ ASSERT (test_lutimens (do_lutimensat, false) == result2);
+ /* We expect 0/0, 0/77, or 77/77, but not 77/0. */
+ ASSERT (result1 <= result2);
+
+ /* Directory-relative tests. */
+ ASSERT (mkdir (BASE "dir", 0700) == 0);
+ ASSERT (chdir (BASE "dir") == 0);
+ fd = creat ("file", 0600);
+ ASSERT (0 <= fd);
+ errno = 0;
+ ASSERT (utimensat (fd, ".", NULL, 0) == -1);
+ ASSERT (errno == ENOTDIR);
+ {
+ struct timespec ts[2] = { { Y2K, 0 }, { Y2K, 0 } };
+ struct stat st;
+ ASSERT (utimensat (dfd, BASE "dir/file", ts, AT_SYMLINK_NOFOLLOW) == 0);
+ ASSERT (stat ("file", &st) == 0);
+ ASSERT (st.st_atime == Y2K);
+ ASSERT (get_stat_atime_ns (&st) == 0);
+ ASSERT (st.st_mtime == Y2K);
+ ASSERT (get_stat_mtime_ns (&st) == 0);
+ }
+ ASSERT (close (fd) == 0);
+ ASSERT (close (dfd) == 0);
+ errno = 0;
+ ASSERT (utimensat (dfd, ".", NULL, 0) == -1);
+ ASSERT (errno == EBADF);
+
+ /* Cleanup. */
+ ASSERT (chdir ("..") == 0);
+ ASSERT (unlink (BASE "dir/file") == 0);
+ ASSERT (rmdir (BASE "dir") == 0);
+ return result1 | result2;
+}
diff --git a/gnulib/tests/test-vasnprintf-posix.c b/gnulib/tests/test-vasnprintf-posix.c
new file mode 100644
index 00000000..74ba1653
--- /dev/null
+++ b/gnulib/tests/test-vasnprintf-posix.c
@@ -0,0 +1,3671 @@
+/* Test of POSIX compatible vasnprintf() and asnprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "vasnprintf.h"
+
+#include <float.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+#include "nan.h"
+
+/* The SGI MIPS floating-point format does not distinguish 0.0 and -0.0. */
+static int
+have_minus_zero ()
+{
+ static double plus_zero = 0.0;
+ double minus_zero = - plus_zero;
+ return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zerod instead. */
+double zerod = 0.0;
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zerol instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zerol (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zerol compute_minus_zerol ()
+#else
+long double minus_zerol = -0.0L;
+#endif
+
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+#ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+#else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+#endif
+
+static int
+strmatch (const char *pattern, const char *string)
+{
+ if (strlen (pattern) != strlen (string))
+ return 0;
+ for (; *pattern != '\0'; pattern++, string++)
+ if (*pattern != '*' && *string != *pattern)
+ return 0;
+ return 1;
+}
+
+/* Test whether string[start_index..end_index-1] is a valid textual
+ representation of NaN. */
+static int
+strisnan (const char *string, size_t start_index, size_t end_index, int uppercase)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static void
+test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
+{
+ char buf[8];
+ int size;
+
+ /* Test return value convention. */
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length = size;
+ char *result = my_asnprintf (NULL, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ ASSERT (length == 5);
+ free (result);
+ }
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length;
+ char *result;
+
+ memcpy (buf, "DEADBEEF", 8);
+ length = size;
+ result = my_asnprintf (buf, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ ASSERT (length == 5);
+ if (size < 6)
+ ASSERT (result != buf);
+ ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
+ if (result != buf)
+ free (result);
+ }
+
+ /* Test support of size specifiers as in C99. */
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345671 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%zu %d", (size_t) 12345672, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345672 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345673 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", (long double) 1.5, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.5 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%a %d", 3.1416015625, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%A %d", -3.1416015625, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
+ || strcmp (result, "-0X3.244P+0 33") == 0
+ || strcmp (result, "-0X6.488P-1 33") == 0
+ || strcmp (result, "-0XC.91P-2 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%a %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x0p+0 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%a %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0x0p+0 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%a %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%a %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%a %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding near the decimal point. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.0a %d", 1.5, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 0. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.0a %d", 1.51, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 1. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.1a %d", 1.51, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.8p+0 33") == 0
+ || strcmp (result, "0x3.0p-1 33") == 0
+ || strcmp (result, "0x6.1p-2 33") == 0
+ || strcmp (result, "0xc.1p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 2. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2a %d", 1.51, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.83p+0 33") == 0
+ || strcmp (result, "0x3.05p-1 33") == 0
+ || strcmp (result, "0x6.0ap-2 33") == 0
+ || strcmp (result, "0xc.14p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 3. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.3a %d", 1.51, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.829p+0 33") == 0
+ || strcmp (result, "0x3.052p-1 33") == 0
+ || strcmp (result, "0x6.0a4p-2 33") == 0
+ || strcmp (result, "0xc.148p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.3a %d", 1.49999, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.800p+0 33") == 0
+ || strcmp (result, "0x3.000p-1 33") == 0
+ || strcmp (result, "0x6.000p-2 33") == 0
+ || strcmp (result, "0xc.000p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000.
+ This shows a MacOS X 10.3.9 (Darwin 7.9) bug. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.1a %d", 1.999, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.0p+1 33") == 0
+ || strcmp (result, "0x2.0p+0 33") == 0
+ || strcmp (result, "0x4.0p-1 33") == 0
+ || strcmp (result, "0x8.0p-2 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%10a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Small precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.10a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Large precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.50a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-10a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7p-2 33") == 0
+ || strcmp (result, "0xep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%+a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
+ || strcmp (result, "+0x3.8p-1 33") == 0
+ || strcmp (result, "+0x7p-2 33") == 0
+ || strcmp (result, "+0xep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "% a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7.p-2 33") == 0
+ || strcmp (result, "0xe.p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#a %d", 1.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.p+0 33") == 0
+ || strcmp (result, "0x2.p-1 33") == 0
+ || strcmp (result, "0x4.p-2 33") == 0
+ || strcmp (result, "0x8.p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%010a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x001.cp+0 33") == 0
+ || strcmp (result, "0x003.8p-1 33") == 0
+ || strcmp (result, "0x00007p-2 33") == 0
+ || strcmp (result, "0x0000ep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%010a %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strcmp (result, " inf 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%050a %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ /* "0000000nan 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", 3.1416015625L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LA %d", -3.1416015625L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
+ || strcmp (result, "-0X3.244P+0 33") == 0
+ || strcmp (result, "-0X6.488P-1 33") == 0
+ || strcmp (result, "-0XC.91P-2 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x0p+0 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0x0p+0 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+#endif
+
+ { /* Rounding near the decimal point. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.0La %d", 1.5L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 0. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.0La %d", 1.51L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 1. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.1La %d", 1.51L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.8p+0 33") == 0
+ || strcmp (result, "0x3.0p-1 33") == 0
+ || strcmp (result, "0x6.1p-2 33") == 0
+ || strcmp (result, "0xc.1p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 2. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2La %d", 1.51L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.83p+0 33") == 0
+ || strcmp (result, "0x3.05p-1 33") == 0
+ || strcmp (result, "0x6.0ap-2 33") == 0
+ || strcmp (result, "0xc.14p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 3. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.3La %d", 1.51L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.829p+0 33") == 0
+ || strcmp (result, "0x3.052p-1 33") == 0
+ || strcmp (result, "0x6.0a4p-2 33") == 0
+ || strcmp (result, "0xc.148p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.3La %d", 1.49999L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.800p+0 33") == 0
+ || strcmp (result, "0x3.000p-1 33") == 0
+ || strcmp (result, "0x6.000p-2 33") == 0
+ || strcmp (result, "0xc.000p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000.
+ This shows a MacOS X 10.3.9 (Darwin 7.9) bug and a
+ glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.1La %d", 1.999L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.0p+1 33") == 0
+ || strcmp (result, "0x2.0p+0 33") == 0
+ || strcmp (result, "0x4.0p-1 33") == 0
+ || strcmp (result, "0x8.0p-2 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%10La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Small precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.10La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Large precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.50La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-10La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7p-2 33") == 0
+ || strcmp (result, "0xep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%+La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
+ || strcmp (result, "+0x3.8p-1 33") == 0
+ || strcmp (result, "+0x7p-2 33") == 0
+ || strcmp (result, "+0xep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "% La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7.p-2 33") == 0
+ || strcmp (result, "0xe.p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#La %d", 1.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.p+0 33") == 0
+ || strcmp (result, "0x2.p-1 33") == 0
+ || strcmp (result, "0x4.p-2 33") == 0
+ || strcmp (result, "0x8.p-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%010La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x001.cp+0 33") == 0
+ || strcmp (result, "0x003.8p-1 33") == 0
+ || strcmp (result, "0x00007p-2 33") == 0
+ || strcmp (result, "0x0000ep-3 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%010La %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strcmp (result, " inf 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%050La %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ /* "0000000nan 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %f format directive. */
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f %d", 1234567.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "0.000000" },
+ { 1.234321234321234e-36, "0.000000" },
+ { 1.234321234321234e-35, "0.000000" },
+ { 1.234321234321234e-34, "0.000000" },
+ { 1.234321234321234e-33, "0.000000" },
+ { 1.234321234321234e-32, "0.000000" },
+ { 1.234321234321234e-31, "0.000000" },
+ { 1.234321234321234e-30, "0.000000" },
+ { 1.234321234321234e-29, "0.000000" },
+ { 1.234321234321234e-28, "0.000000" },
+ { 1.234321234321234e-27, "0.000000" },
+ { 1.234321234321234e-26, "0.000000" },
+ { 1.234321234321234e-25, "0.000000" },
+ { 1.234321234321234e-24, "0.000000" },
+ { 1.234321234321234e-23, "0.000000" },
+ { 1.234321234321234e-22, "0.000000" },
+ { 1.234321234321234e-21, "0.000000" },
+ { 1.234321234321234e-20, "0.000000" },
+ { 1.234321234321234e-19, "0.000000" },
+ { 1.234321234321234e-18, "0.000000" },
+ { 1.234321234321234e-17, "0.000000" },
+ { 1.234321234321234e-16, "0.000000" },
+ { 1.234321234321234e-15, "0.000000" },
+ { 1.234321234321234e-14, "0.000000" },
+ { 1.234321234321234e-13, "0.000000" },
+ { 1.234321234321234e-12, "0.000000" },
+ { 1.234321234321234e-11, "0.000000" },
+ { 1.234321234321234e-10, "0.000000" },
+ { 1.234321234321234e-9, "0.000000" },
+ { 1.234321234321234e-8, "0.000000" },
+ { 1.234321234321234e-7, "0.000000" },
+ { 1.234321234321234e-6, "0.000001" },
+ { 1.234321234321234e-5, "0.000012" },
+ { 1.234321234321234e-4, "0.000123" },
+ { 1.234321234321234e-3, "0.001234" },
+ { 1.234321234321234e-2, "0.012343" },
+ { 1.234321234321234e-1, "0.123432" },
+ { 1.234321234321234, "1.234321" },
+ { 1.234321234321234e1, "12.343212" },
+ { 1.234321234321234e2, "123.432123" },
+ { 1.234321234321234e3, "1234.321234" },
+ { 1.234321234321234e4, "12343.212343" },
+ { 1.234321234321234e5, "123432.123432" },
+ { 1.234321234321234e6, "1234321.234321" },
+ { 1.234321234321234e7, "12343212.343212" },
+ { 1.234321234321234e8, "123432123.432123" },
+ { 1.234321234321234e9, "1234321234.321234" },
+ { 1.234321234321234e10, "12343212343.2123**" },
+ { 1.234321234321234e11, "123432123432.123***" },
+ { 1.234321234321234e12, "1234321234321.23****" },
+ { 1.234321234321234e13, "12343212343212.3*****" },
+ { 1.234321234321234e14, "123432123432123.******" },
+ { 1.234321234321234e15, "1234321234321234.000000" },
+ { 1.234321234321234e16, "123432123432123**.000000" },
+ { 1.234321234321234e17, "123432123432123***.000000" },
+ { 1.234321234321234e18, "123432123432123****.000000" },
+ { 1.234321234321234e19, "123432123432123*****.000000" },
+ { 1.234321234321234e20, "123432123432123******.000000" },
+ { 1.234321234321234e21, "123432123432123*******.000000" },
+ { 1.234321234321234e22, "123432123432123********.000000" },
+ { 1.234321234321234e23, "123432123432123*********.000000" },
+ { 1.234321234321234e24, "123432123432123**********.000000" },
+ { 1.234321234321234e25, "123432123432123***********.000000" },
+ { 1.234321234321234e26, "123432123432123************.000000" },
+ { 1.234321234321234e27, "123432123432123*************.000000" },
+ { 1.234321234321234e28, "123432123432123**************.000000" },
+ { 1.234321234321234e29, "123432123432123***************.000000" },
+ { 1.234321234321234e30, "123432123432123****************.000000" },
+ { 1.234321234321234e31, "123432123432123*****************.000000" },
+ { 1.234321234321234e32, "123432123432123******************.000000" },
+ { 1.234321234321234e33, "123432123432123*******************.000000" },
+ { 1.234321234321234e34, "123432123432123********************.000000" },
+ { 1.234321234321234e35, "123432123432123*********************.000000" },
+ { 1.234321234321234e36, "123432123432123**********************.000000" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f", data[k].value);
+ ASSERT (result != NULL);
+ ASSERT (strmatch (data[k].string, result));
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f %d", -0.03125, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%f %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%10f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-10f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%+f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "% f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015f %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015f %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%050f %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.f %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2f %d", 999.951, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2f %d", 999.996, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", 1234567.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "0.000000" },
+ { 1.234321234321234e-36L, "0.000000" },
+ { 1.234321234321234e-35L, "0.000000" },
+ { 1.234321234321234e-34L, "0.000000" },
+ { 1.234321234321234e-33L, "0.000000" },
+ { 1.234321234321234e-32L, "0.000000" },
+ { 1.234321234321234e-31L, "0.000000" },
+ { 1.234321234321234e-30L, "0.000000" },
+ { 1.234321234321234e-29L, "0.000000" },
+ { 1.234321234321234e-28L, "0.000000" },
+ { 1.234321234321234e-27L, "0.000000" },
+ { 1.234321234321234e-26L, "0.000000" },
+ { 1.234321234321234e-25L, "0.000000" },
+ { 1.234321234321234e-24L, "0.000000" },
+ { 1.234321234321234e-23L, "0.000000" },
+ { 1.234321234321234e-22L, "0.000000" },
+ { 1.234321234321234e-21L, "0.000000" },
+ { 1.234321234321234e-20L, "0.000000" },
+ { 1.234321234321234e-19L, "0.000000" },
+ { 1.234321234321234e-18L, "0.000000" },
+ { 1.234321234321234e-17L, "0.000000" },
+ { 1.234321234321234e-16L, "0.000000" },
+ { 1.234321234321234e-15L, "0.000000" },
+ { 1.234321234321234e-14L, "0.000000" },
+ { 1.234321234321234e-13L, "0.000000" },
+ { 1.234321234321234e-12L, "0.000000" },
+ { 1.234321234321234e-11L, "0.000000" },
+ { 1.234321234321234e-10L, "0.000000" },
+ { 1.234321234321234e-9L, "0.000000" },
+ { 1.234321234321234e-8L, "0.000000" },
+ { 1.234321234321234e-7L, "0.000000" },
+ { 1.234321234321234e-6L, "0.000001" },
+ { 1.234321234321234e-5L, "0.000012" },
+ { 1.234321234321234e-4L, "0.000123" },
+ { 1.234321234321234e-3L, "0.001234" },
+ { 1.234321234321234e-2L, "0.012343" },
+ { 1.234321234321234e-1L, "0.123432" },
+ { 1.234321234321234L, "1.234321" },
+ { 1.234321234321234e1L, "12.343212" },
+ { 1.234321234321234e2L, "123.432123" },
+ { 1.234321234321234e3L, "1234.321234" },
+ { 1.234321234321234e4L, "12343.212343" },
+ { 1.234321234321234e5L, "123432.123432" },
+ { 1.234321234321234e6L, "1234321.234321" },
+ { 1.234321234321234e7L, "12343212.343212" },
+ { 1.234321234321234e8L, "123432123.432123" },
+ { 1.234321234321234e9L, "1234321234.321234" },
+ { 1.234321234321234e10L, "12343212343.2123**" },
+ { 1.234321234321234e11L, "123432123432.123***" },
+ { 1.234321234321234e12L, "1234321234321.23****" },
+ { 1.234321234321234e13L, "12343212343212.3*****" },
+ { 1.234321234321234e14L, "123432123432123.******" },
+ { 1.234321234321234e15L, "1234321234321234.000000" },
+ { 1.234321234321234e16L, "123432123432123**.000000" },
+ { 1.234321234321234e17L, "123432123432123***.000000" },
+ { 1.234321234321234e18L, "123432123432123****.000000" },
+ { 1.234321234321234e19L, "123432123432123*****.000000" },
+ { 1.234321234321234e20L, "123432123432123******.000000" },
+ { 1.234321234321234e21L, "123432123432123*******.000000" },
+ { 1.234321234321234e22L, "123432123432123********.000000" },
+ { 1.234321234321234e23L, "123432123432123*********.000000" },
+ { 1.234321234321234e24L, "123432123432123**********.000000" },
+ { 1.234321234321234e25L, "123432123432123***********.000000" },
+ { 1.234321234321234e26L, "123432123432123************.000000" },
+ { 1.234321234321234e27L, "123432123432123*************.000000" },
+ { 1.234321234321234e28L, "123432123432123**************.000000" },
+ { 1.234321234321234e29L, "123432123432123***************.000000" },
+ { 1.234321234321234e30L, "123432123432123****************.000000" },
+ { 1.234321234321234e31L, "123432123432123*****************.000000" },
+ { 1.234321234321234e32L, "123432123432123******************.000000" },
+ { 1.234321234321234e33L, "123432123432123*******************.000000" },
+ { 1.234321234321234e34L, "123432123432123********************.000000" },
+ { 1.234321234321234e35L, "123432123432123*********************.000000" },
+ { 1.234321234321234e36L, "123432123432123**********************.000000" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf", data[k].value);
+ ASSERT (result != NULL);
+ ASSERT (strmatch (data[k].string, result));
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", -0.03125L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+#endif
+
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%+Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "% Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015Lf %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%050Lf %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2Lf %d", 999.951L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2Lf %d", 999.996L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %F format directive. */
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%F %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%F %d", 1234567.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%F %d", -0.03125, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%F %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%F %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%F %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "INF 33") == 0
+ || strcmp (result, "INFINITY 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%F %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-INF 33") == 0
+ || strcmp (result, "-INFINITY 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%F %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 1)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015F %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015F %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -INF 33") == 0
+ || strcmp (result, " -INFINITY 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.F %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2F %d", 999.951, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2F %d", 999.996, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LF %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LF %d", 1234567.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LF %d", -0.03125L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LF %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LF %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LF %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "INF 33") == 0
+ || strcmp (result, "INFINITY 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LF %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-INF 33") == 0
+ || strcmp (result, "-INFINITY 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%LF %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 1)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015LF %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -INF 33") == 0
+ || strcmp (result, " -INFINITY 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2LF %d", 999.951L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.2LF %d", 999.996L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %e format directive. */
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e %d", 1234567.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.234567e+06 33") == 0
+ || strcmp (result, "1.234567e+006 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "1.234321e-37" },
+ { 1.234321234321234e-36, "1.234321e-36" },
+ { 1.234321234321234e-35, "1.234321e-35" },
+ { 1.234321234321234e-34, "1.234321e-34" },
+ { 1.234321234321234e-33, "1.234321e-33" },
+ { 1.234321234321234e-32, "1.234321e-32" },
+ { 1.234321234321234e-31, "1.234321e-31" },
+ { 1.234321234321234e-30, "1.234321e-30" },
+ { 1.234321234321234e-29, "1.234321e-29" },
+ { 1.234321234321234e-28, "1.234321e-28" },
+ { 1.234321234321234e-27, "1.234321e-27" },
+ { 1.234321234321234e-26, "1.234321e-26" },
+ { 1.234321234321234e-25, "1.234321e-25" },
+ { 1.234321234321234e-24, "1.234321e-24" },
+ { 1.234321234321234e-23, "1.234321e-23" },
+ { 1.234321234321234e-22, "1.234321e-22" },
+ { 1.234321234321234e-21, "1.234321e-21" },
+ { 1.234321234321234e-20, "1.234321e-20" },
+ { 1.234321234321234e-19, "1.234321e-19" },
+ { 1.234321234321234e-18, "1.234321e-18" },
+ { 1.234321234321234e-17, "1.234321e-17" },
+ { 1.234321234321234e-16, "1.234321e-16" },
+ { 1.234321234321234e-15, "1.234321e-15" },
+ { 1.234321234321234e-14, "1.234321e-14" },
+ { 1.234321234321234e-13, "1.234321e-13" },
+ { 1.234321234321234e-12, "1.234321e-12" },
+ { 1.234321234321234e-11, "1.234321e-11" },
+ { 1.234321234321234e-10, "1.234321e-10" },
+ { 1.234321234321234e-9, "1.234321e-09" },
+ { 1.234321234321234e-8, "1.234321e-08" },
+ { 1.234321234321234e-7, "1.234321e-07" },
+ { 1.234321234321234e-6, "1.234321e-06" },
+ { 1.234321234321234e-5, "1.234321e-05" },
+ { 1.234321234321234e-4, "1.234321e-04" },
+ { 1.234321234321234e-3, "1.234321e-03" },
+ { 1.234321234321234e-2, "1.234321e-02" },
+ { 1.234321234321234e-1, "1.234321e-01" },
+ { 1.234321234321234, "1.234321e+00" },
+ { 1.234321234321234e1, "1.234321e+01" },
+ { 1.234321234321234e2, "1.234321e+02" },
+ { 1.234321234321234e3, "1.234321e+03" },
+ { 1.234321234321234e4, "1.234321e+04" },
+ { 1.234321234321234e5, "1.234321e+05" },
+ { 1.234321234321234e6, "1.234321e+06" },
+ { 1.234321234321234e7, "1.234321e+07" },
+ { 1.234321234321234e8, "1.234321e+08" },
+ { 1.234321234321234e9, "1.234321e+09" },
+ { 1.234321234321234e10, "1.234321e+10" },
+ { 1.234321234321234e11, "1.234321e+11" },
+ { 1.234321234321234e12, "1.234321e+12" },
+ { 1.234321234321234e13, "1.234321e+13" },
+ { 1.234321234321234e14, "1.234321e+14" },
+ { 1.234321234321234e15, "1.234321e+15" },
+ { 1.234321234321234e16, "1.234321e+16" },
+ { 1.234321234321234e17, "1.234321e+17" },
+ { 1.234321234321234e18, "1.234321e+18" },
+ { 1.234321234321234e19, "1.234321e+19" },
+ { 1.234321234321234e20, "1.234321e+20" },
+ { 1.234321234321234e21, "1.234321e+21" },
+ { 1.234321234321234e22, "1.234321e+22" },
+ { 1.234321234321234e23, "1.234321e+23" },
+ { 1.234321234321234e24, "1.234321e+24" },
+ { 1.234321234321234e25, "1.234321e+25" },
+ { 1.234321234321234e26, "1.234321e+26" },
+ { 1.234321234321234e27, "1.234321e+27" },
+ { 1.234321234321234e28, "1.234321e+28" },
+ { 1.234321234321234e29, "1.234321e+29" },
+ { 1.234321234321234e30, "1.234321e+30" },
+ { 1.234321234321234e31, "1.234321e+31" },
+ { 1.234321234321234e32, "1.234321e+32" },
+ { 1.234321234321234e33, "1.234321e+33" },
+ { 1.234321234321234e34, "1.234321e+34" },
+ { 1.234321234321234e35, "1.234321e+35" },
+ { 1.234321234321234e36, "1.234321e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e %d", -0.03125, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+ || strcmp (result, "-3.125000e-002 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000e+00 33") == 0
+ || strcmp (result, "0.000000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+ || strcmp (result, "-0.000000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%e %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%15e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-15e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%+e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+ || strcmp (result, "+1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "% e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2.e+00 33") == 0
+ || strcmp (result, "2.e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.e %d", 9.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015e %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+ || strcmp (result, "001.234000e+003 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015e %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%050e %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.e %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4e %d", 999.951, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "9.9995e+02 33") == 0
+ || strcmp (result, "9.9995e+002 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4e %d", 999.996, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.0000e+03 33") == 0
+ || strcmp (result, "1.0000e+003 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", 1234567.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.234567e+06 33") == 0
+ || strcmp (result, "1.234567e+006 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "1.234321e-37" },
+ { 1.234321234321234e-36L, "1.234321e-36" },
+ { 1.234321234321234e-35L, "1.234321e-35" },
+ { 1.234321234321234e-34L, "1.234321e-34" },
+ { 1.234321234321234e-33L, "1.234321e-33" },
+ { 1.234321234321234e-32L, "1.234321e-32" },
+ { 1.234321234321234e-31L, "1.234321e-31" },
+ { 1.234321234321234e-30L, "1.234321e-30" },
+ { 1.234321234321234e-29L, "1.234321e-29" },
+ { 1.234321234321234e-28L, "1.234321e-28" },
+ { 1.234321234321234e-27L, "1.234321e-27" },
+ { 1.234321234321234e-26L, "1.234321e-26" },
+ { 1.234321234321234e-25L, "1.234321e-25" },
+ { 1.234321234321234e-24L, "1.234321e-24" },
+ { 1.234321234321234e-23L, "1.234321e-23" },
+ { 1.234321234321234e-22L, "1.234321e-22" },
+ { 1.234321234321234e-21L, "1.234321e-21" },
+ { 1.234321234321234e-20L, "1.234321e-20" },
+ { 1.234321234321234e-19L, "1.234321e-19" },
+ { 1.234321234321234e-18L, "1.234321e-18" },
+ { 1.234321234321234e-17L, "1.234321e-17" },
+ { 1.234321234321234e-16L, "1.234321e-16" },
+ { 1.234321234321234e-15L, "1.234321e-15" },
+ { 1.234321234321234e-14L, "1.234321e-14" },
+ { 1.234321234321234e-13L, "1.234321e-13" },
+ { 1.234321234321234e-12L, "1.234321e-12" },
+ { 1.234321234321234e-11L, "1.234321e-11" },
+ { 1.234321234321234e-10L, "1.234321e-10" },
+ { 1.234321234321234e-9L, "1.234321e-09" },
+ { 1.234321234321234e-8L, "1.234321e-08" },
+ { 1.234321234321234e-7L, "1.234321e-07" },
+ { 1.234321234321234e-6L, "1.234321e-06" },
+ { 1.234321234321234e-5L, "1.234321e-05" },
+ { 1.234321234321234e-4L, "1.234321e-04" },
+ { 1.234321234321234e-3L, "1.234321e-03" },
+ { 1.234321234321234e-2L, "1.234321e-02" },
+ { 1.234321234321234e-1L, "1.234321e-01" },
+ { 1.234321234321234L, "1.234321e+00" },
+ { 1.234321234321234e1L, "1.234321e+01" },
+ { 1.234321234321234e2L, "1.234321e+02" },
+ { 1.234321234321234e3L, "1.234321e+03" },
+ { 1.234321234321234e4L, "1.234321e+04" },
+ { 1.234321234321234e5L, "1.234321e+05" },
+ { 1.234321234321234e6L, "1.234321e+06" },
+ { 1.234321234321234e7L, "1.234321e+07" },
+ { 1.234321234321234e8L, "1.234321e+08" },
+ { 1.234321234321234e9L, "1.234321e+09" },
+ { 1.234321234321234e10L, "1.234321e+10" },
+ { 1.234321234321234e11L, "1.234321e+11" },
+ { 1.234321234321234e12L, "1.234321e+12" },
+ { 1.234321234321234e13L, "1.234321e+13" },
+ { 1.234321234321234e14L, "1.234321e+14" },
+ { 1.234321234321234e15L, "1.234321e+15" },
+ { 1.234321234321234e16L, "1.234321e+16" },
+ { 1.234321234321234e17L, "1.234321e+17" },
+ { 1.234321234321234e18L, "1.234321e+18" },
+ { 1.234321234321234e19L, "1.234321e+19" },
+ { 1.234321234321234e20L, "1.234321e+20" },
+ { 1.234321234321234e21L, "1.234321e+21" },
+ { 1.234321234321234e22L, "1.234321e+22" },
+ { 1.234321234321234e23L, "1.234321e+23" },
+ { 1.234321234321234e24L, "1.234321e+24" },
+ { 1.234321234321234e25L, "1.234321e+25" },
+ { 1.234321234321234e26L, "1.234321e+26" },
+ { 1.234321234321234e27L, "1.234321e+27" },
+ { 1.234321234321234e28L, "1.234321e+28" },
+ { 1.234321234321234e29L, "1.234321e+29" },
+ { 1.234321234321234e30L, "1.234321e+30" },
+ { 1.234321234321234e31L, "1.234321e+31" },
+ { 1.234321234321234e32L, "1.234321e+32" },
+ { 1.234321234321234e33L, "1.234321e+33" },
+ { 1.234321234321234e34L, "1.234321e+34" },
+ { 1.234321234321234e35L, "1.234321e+35" },
+ { 1.234321234321234e36L, "1.234321e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", -0.03125L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+ || strcmp (result, "-3.125000e-002 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000e+00 33") == 0
+ || strcmp (result, "0.000000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+ || strcmp (result, "-0.000000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+#endif
+
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%+Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+ || strcmp (result, "+1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "% Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2.e+00 33") == 0
+ || strcmp (result, "2.e+000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.Le %d", 9.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+ || strcmp (result, "001.234000e+003 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015Le %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%050Le %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4Le %d", 999.951L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "9.9995e+02 33") == 0
+ || strcmp (result, "9.9995e+002 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4Le %d", 999.996L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.0000e+03 33") == 0
+ || strcmp (result, "1.0000e+003 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %g format directive. */
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g %d", 1234567.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.23457e+06 33") == 0
+ || strcmp (result, "1.23457e+006 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "1.23432e-37" },
+ { 1.234321234321234e-36, "1.23432e-36" },
+ { 1.234321234321234e-35, "1.23432e-35" },
+ { 1.234321234321234e-34, "1.23432e-34" },
+ { 1.234321234321234e-33, "1.23432e-33" },
+ { 1.234321234321234e-32, "1.23432e-32" },
+ { 1.234321234321234e-31, "1.23432e-31" },
+ { 1.234321234321234e-30, "1.23432e-30" },
+ { 1.234321234321234e-29, "1.23432e-29" },
+ { 1.234321234321234e-28, "1.23432e-28" },
+ { 1.234321234321234e-27, "1.23432e-27" },
+ { 1.234321234321234e-26, "1.23432e-26" },
+ { 1.234321234321234e-25, "1.23432e-25" },
+ { 1.234321234321234e-24, "1.23432e-24" },
+ { 1.234321234321234e-23, "1.23432e-23" },
+ { 1.234321234321234e-22, "1.23432e-22" },
+ { 1.234321234321234e-21, "1.23432e-21" },
+ { 1.234321234321234e-20, "1.23432e-20" },
+ { 1.234321234321234e-19, "1.23432e-19" },
+ { 1.234321234321234e-18, "1.23432e-18" },
+ { 1.234321234321234e-17, "1.23432e-17" },
+ { 1.234321234321234e-16, "1.23432e-16" },
+ { 1.234321234321234e-15, "1.23432e-15" },
+ { 1.234321234321234e-14, "1.23432e-14" },
+ { 1.234321234321234e-13, "1.23432e-13" },
+ { 1.234321234321234e-12, "1.23432e-12" },
+ { 1.234321234321234e-11, "1.23432e-11" },
+ { 1.234321234321234e-10, "1.23432e-10" },
+ { 1.234321234321234e-9, "1.23432e-09" },
+ { 1.234321234321234e-8, "1.23432e-08" },
+ { 1.234321234321234e-7, "1.23432e-07" },
+ { 1.234321234321234e-6, "1.23432e-06" },
+ { 1.234321234321234e-5, "1.23432e-05" },
+ { 1.234321234321234e-4, "0.000123432" },
+ { 1.234321234321234e-3, "0.00123432" },
+ { 1.234321234321234e-2, "0.0123432" },
+ { 1.234321234321234e-1, "0.123432" },
+ { 1.234321234321234, "1.23432" },
+ { 1.234321234321234e1, "12.3432" },
+ { 1.234321234321234e2, "123.432" },
+ { 1.234321234321234e3, "1234.32" },
+ { 1.234321234321234e4, "12343.2" },
+ { 1.234321234321234e5, "123432" },
+ { 1.234321234321234e6, "1.23432e+06" },
+ { 1.234321234321234e7, "1.23432e+07" },
+ { 1.234321234321234e8, "1.23432e+08" },
+ { 1.234321234321234e9, "1.23432e+09" },
+ { 1.234321234321234e10, "1.23432e+10" },
+ { 1.234321234321234e11, "1.23432e+11" },
+ { 1.234321234321234e12, "1.23432e+12" },
+ { 1.234321234321234e13, "1.23432e+13" },
+ { 1.234321234321234e14, "1.23432e+14" },
+ { 1.234321234321234e15, "1.23432e+15" },
+ { 1.234321234321234e16, "1.23432e+16" },
+ { 1.234321234321234e17, "1.23432e+17" },
+ { 1.234321234321234e18, "1.23432e+18" },
+ { 1.234321234321234e19, "1.23432e+19" },
+ { 1.234321234321234e20, "1.23432e+20" },
+ { 1.234321234321234e21, "1.23432e+21" },
+ { 1.234321234321234e22, "1.23432e+22" },
+ { 1.234321234321234e23, "1.23432e+23" },
+ { 1.234321234321234e24, "1.23432e+24" },
+ { 1.234321234321234e25, "1.23432e+25" },
+ { 1.234321234321234e26, "1.23432e+26" },
+ { 1.234321234321234e27, "1.23432e+27" },
+ { 1.234321234321234e28, "1.23432e+28" },
+ { 1.234321234321234e29, "1.23432e+29" },
+ { 1.234321234321234e30, "1.23432e+30" },
+ { 1.234321234321234e31, "1.23432e+31" },
+ { 1.234321234321234e32, "1.23432e+32" },
+ { 1.234321234321234e33, "1.23432e+33" },
+ { 1.234321234321234e34, "1.23432e+34" },
+ { 1.234321234321234e35, "1.23432e+35" },
+ { 1.234321234321234e36, "1.23432e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (expected[strlen (expected) - 4] == 'e'
+ && strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g %d", -0.03125, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.03125 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%g %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%10g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-10g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%+g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "% g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.75000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.g %d", 9.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%010g %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0000001234 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015g %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%050g %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.g %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.5g %d", 999.951, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.5g %d", 999.996, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", 1234567.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.23457e+06 33") == 0
+ || strcmp (result, "1.23457e+006 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "1.23432e-37" },
+ { 1.234321234321234e-36L, "1.23432e-36" },
+ { 1.234321234321234e-35L, "1.23432e-35" },
+ { 1.234321234321234e-34L, "1.23432e-34" },
+ { 1.234321234321234e-33L, "1.23432e-33" },
+ { 1.234321234321234e-32L, "1.23432e-32" },
+ { 1.234321234321234e-31L, "1.23432e-31" },
+ { 1.234321234321234e-30L, "1.23432e-30" },
+ { 1.234321234321234e-29L, "1.23432e-29" },
+ { 1.234321234321234e-28L, "1.23432e-28" },
+ { 1.234321234321234e-27L, "1.23432e-27" },
+ { 1.234321234321234e-26L, "1.23432e-26" },
+ { 1.234321234321234e-25L, "1.23432e-25" },
+ { 1.234321234321234e-24L, "1.23432e-24" },
+ { 1.234321234321234e-23L, "1.23432e-23" },
+ { 1.234321234321234e-22L, "1.23432e-22" },
+ { 1.234321234321234e-21L, "1.23432e-21" },
+ { 1.234321234321234e-20L, "1.23432e-20" },
+ { 1.234321234321234e-19L, "1.23432e-19" },
+ { 1.234321234321234e-18L, "1.23432e-18" },
+ { 1.234321234321234e-17L, "1.23432e-17" },
+ { 1.234321234321234e-16L, "1.23432e-16" },
+ { 1.234321234321234e-15L, "1.23432e-15" },
+ { 1.234321234321234e-14L, "1.23432e-14" },
+ { 1.234321234321234e-13L, "1.23432e-13" },
+ { 1.234321234321234e-12L, "1.23432e-12" },
+ { 1.234321234321234e-11L, "1.23432e-11" },
+ { 1.234321234321234e-10L, "1.23432e-10" },
+ { 1.234321234321234e-9L, "1.23432e-09" },
+ { 1.234321234321234e-8L, "1.23432e-08" },
+ { 1.234321234321234e-7L, "1.23432e-07" },
+ { 1.234321234321234e-6L, "1.23432e-06" },
+ { 1.234321234321234e-5L, "1.23432e-05" },
+ { 1.234321234321234e-4L, "0.000123432" },
+ { 1.234321234321234e-3L, "0.00123432" },
+ { 1.234321234321234e-2L, "0.0123432" },
+ { 1.234321234321234e-1L, "0.123432" },
+ { 1.234321234321234L, "1.23432" },
+ { 1.234321234321234e1L, "12.3432" },
+ { 1.234321234321234e2L, "123.432" },
+ { 1.234321234321234e3L, "1234.32" },
+ { 1.234321234321234e4L, "12343.2" },
+ { 1.234321234321234e5L, "123432" },
+ { 1.234321234321234e6L, "1.23432e+06" },
+ { 1.234321234321234e7L, "1.23432e+07" },
+ { 1.234321234321234e8L, "1.23432e+08" },
+ { 1.234321234321234e9L, "1.23432e+09" },
+ { 1.234321234321234e10L, "1.23432e+10" },
+ { 1.234321234321234e11L, "1.23432e+11" },
+ { 1.234321234321234e12L, "1.23432e+12" },
+ { 1.234321234321234e13L, "1.23432e+13" },
+ { 1.234321234321234e14L, "1.23432e+14" },
+ { 1.234321234321234e15L, "1.23432e+15" },
+ { 1.234321234321234e16L, "1.23432e+16" },
+ { 1.234321234321234e17L, "1.23432e+17" },
+ { 1.234321234321234e18L, "1.23432e+18" },
+ { 1.234321234321234e19L, "1.23432e+19" },
+ { 1.234321234321234e20L, "1.23432e+20" },
+ { 1.234321234321234e21L, "1.23432e+21" },
+ { 1.234321234321234e22L, "1.23432e+22" },
+ { 1.234321234321234e23L, "1.23432e+23" },
+ { 1.234321234321234e24L, "1.23432e+24" },
+ { 1.234321234321234e25L, "1.23432e+25" },
+ { 1.234321234321234e26L, "1.23432e+26" },
+ { 1.234321234321234e27L, "1.23432e+27" },
+ { 1.234321234321234e28L, "1.23432e+28" },
+ { 1.234321234321234e29L, "1.23432e+29" },
+ { 1.234321234321234e30L, "1.23432e+30" },
+ { 1.234321234321234e31L, "1.23432e+31" },
+ { 1.234321234321234e32L, "1.23432e+32" },
+ { 1.234321234321234e33L, "1.23432e+33" },
+ { 1.234321234321234e34L, "1.23432e+34" },
+ { 1.234321234321234e35L, "1.23432e+35" },
+ { 1.234321234321234e36L, "1.23432e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (expected[strlen (expected) - 4] == 'e'
+ && strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", -0.03125L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.03125 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+#endif
+
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%+Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "% Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.75000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.Lg %d", 9.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%010Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0000001234 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%015Lg %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%050Lg %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.5Lg %d", 999.951L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.5Lg %d", 999.996L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %n format directive. */
+
+ {
+ int count = -1;
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%d %n", 123, &count, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "123 ") == 0);
+ ASSERT (length == strlen (result));
+ ASSERT (count == 4);
+ free (result);
+ }
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%2$d %1$d", 33, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "55 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the grouping flag. */
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%'d %d", 1234567, 99);
+ ASSERT (result != NULL);
+ ASSERT (result[strlen (result) - 1] == '9');
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the left-adjust flag. */
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "a%*sc", -3, "b");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "a%-*sc", 3, "b");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "a%-*sc", -3, "b");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of large precision. */
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4000d %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.*d %d", 4000, 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4000d %d", -1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ ASSERT (result[0] == '-');
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[1 + i] == '0');
+ ASSERT (strcmp (result + 1 + 4000 - 7, "1234567 99") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4000u %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4000o %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "4553207 99") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%.4000x %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 6; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 6, "12d687 99") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%#.4000x %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ ASSERT (result[0] == '0');
+ ASSERT (result[1] == 'x');
+ for (i = 0; i < 4000 - 6; i++)
+ ASSERT (result[2 + i] == '0');
+ ASSERT (strcmp (result + 2 + 4000 - 6, "12d687 99") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ {
+ char input[5000];
+ size_t length;
+ char *result;
+ size_t i;
+
+ for (i = 0; i < sizeof (input) - 1; i++)
+ input[i] = 'a' + ((1000000 / (i + 1)) % 26);
+ input[i] = '\0';
+ result = my_asnprintf (NULL, &length, "%.4000s %d", input, 99);
+ ASSERT (result != NULL);
+ ASSERT (memcmp (result, input, 4000) == 0);
+ ASSERT (strcmp (result + 4000, " 99") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %s format directive. */
+
+ /* To verify that these tests succeed, it is necessary to run them under
+ a tool that checks against invalid memory accesses, such as ElectricFence
+ or "valgrind --tool=memcheck". */
+ {
+ size_t i;
+
+ for (i = 1; i <= 8; i++)
+ {
+ char *block;
+ size_t length;
+ char *result;
+
+ block = (char *) malloc (i);
+ memcpy (block, "abcdefgh", i);
+ result = my_asnprintf (NULL, &length, "%.*s", (int) i, block);
+ ASSERT (result != NULL);
+ ASSERT (memcmp (result, block, i) == 0);
+ ASSERT (result[i] == '\0');
+ ASSERT (length == strlen (result));
+ free (result);
+ free (block);
+ }
+ }
+#if HAVE_WCHAR_T
+ {
+ size_t i;
+
+ for (i = 1; i <= 8; i++)
+ {
+ wchar_t *block;
+ size_t j;
+ size_t length;
+ char *result;
+
+ block = (wchar_t *) malloc (i * sizeof (wchar_t));
+ for (j = 0; j < i; j++)
+ block[j] = "abcdefgh"[j];
+ result = my_asnprintf (NULL, &length, "%.*ls", (int) i, block);
+ ASSERT (result != NULL);
+ ASSERT (memcmp (result, "abcdefgh", i) == 0);
+ ASSERT (result[i] == '\0');
+ ASSERT (length == strlen (result));
+ free (result);
+ free (block);
+ }
+ }
+#endif
+}
+
+static char *
+my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *ret;
+
+ va_start (args, format);
+ ret = vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+static void
+test_asnprintf ()
+{
+ test_function (asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasnprintf ();
+ test_asnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/test-vasnprintf-posix2.c b/gnulib/tests/test-vasnprintf-posix2.c
new file mode 100644
index 00000000..35b49f86
--- /dev/null
+++ b/gnulib/tests/test-vasnprintf-posix2.c
@@ -0,0 +1,63 @@
+/* Test of POSIX compatible vasnprintf() and asnprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "vasnprintf.h"
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Test that a locale dependent decimal point is used. */
+ {
+ size_t length;
+ char *result = asnprintf (NULL, &length, "%.1a", 1.0);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1,0p+0") == 0
+ || strcmp (result, "0x2,0p-1") == 0
+ || strcmp (result, "0x4,0p-2") == 0
+ || strcmp (result, "0x8,0p-3") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ /* Test that a locale dependent decimal point is used. */
+ {
+ size_t length;
+ char *result = asnprintf (NULL, &length, "%.1La", 1.0L);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1,0p+0") == 0
+ || strcmp (result, "0x2,0p-1") == 0
+ || strcmp (result, "0x4,0p-2") == 0
+ || strcmp (result, "0x8,0p-3") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-vasnprintf-posix2.sh b/gnulib/tests/test-vasnprintf-posix2.sh
new file mode 100755
index 00000000..5ee5b475
--- /dev/null
+++ b/gnulib/tests/test-vasnprintf-posix2.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# Test whether a french locale is installed.
+: ${LOCALE_FR=fr_FR}
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR != none; then
+ testlocale=$LOCALE_FR
+else
+ if test $LOCALE_FR_UTF8 != none; then
+ testlocale=$LOCALE_FR_UTF8
+ else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french locale is installed"
+ else
+ echo "Skipping test: no french locale is supported"
+ fi
+ exit 77
+ fi
+fi
+
+LC_ALL=$testlocale \
+./test-vasnprintf-posix2${EXEEXT}
diff --git a/gnulib/tests/test-vasnprintf.c b/gnulib/tests/test-vasnprintf.c
new file mode 100644
index 00000000..e2831420
--- /dev/null
+++ b/gnulib/tests/test-vasnprintf.c
@@ -0,0 +1,117 @@
+/* Test of vasnprintf() and asnprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "vasnprintf.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+static char *
+my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *ret;
+
+ va_start (args, format);
+ ret = vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ char buf[8];
+ int size;
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length = size;
+ char *result = my_asnprintf (NULL, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ ASSERT (length == 5);
+ free (result);
+ }
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length;
+ char *result;
+
+ memcpy (buf, "DEADBEEF", 8);
+ length = size;
+ result = my_asnprintf (buf, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ ASSERT (length == 5);
+ if (size < 6)
+ ASSERT (result != buf);
+ ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
+ if (result != buf)
+ free (result);
+ }
+}
+
+static void
+test_asnprintf ()
+{
+ char buf[8];
+ int size;
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length = size;
+ char *result = asnprintf (NULL, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ ASSERT (length == 5);
+ free (result);
+ }
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length;
+ char *result;
+
+ memcpy (buf, "DEADBEEF", 8);
+ length = size;
+ result = asnprintf (buf, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ ASSERT (length == 5);
+ if (size < 6)
+ ASSERT (result != buf);
+ ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
+ if (result != buf)
+ free (result);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasnprintf ();
+ test_asnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/test-vasprintf-posix.c b/gnulib/tests/test-vasprintf-posix.c
new file mode 100644
index 00000000..ef19df8d
--- /dev/null
+++ b/gnulib/tests/test-vasprintf-posix.c
@@ -0,0 +1,3652 @@
+/* Test of POSIX compatible vasprintf() and asprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include <float.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+#include "nan.h"
+
+/* The SGI MIPS floating-point format does not distinguish 0.0 and -0.0. */
+static int
+have_minus_zero ()
+{
+ static double plus_zero = 0.0;
+ double minus_zero = - plus_zero;
+ return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ So we use -zerod instead. */
+double zerod = 0.0;
+
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+ So we use minus_zerol instead.
+ IRIX cc can't put -0.0L into .data, but can compute at runtime.
+ Note that the expression -LDBL_MIN * LDBL_MIN does not work on other
+ platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi
+static long double
+compute_minus_zerol (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zerol compute_minus_zerol ()
+#else
+long double minus_zerol = -0.0L;
+#endif
+
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+#ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+#else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+#endif
+
+static int
+strmatch (const char *pattern, const char *string)
+{
+ if (strlen (pattern) != strlen (string))
+ return 0;
+ for (; *pattern != '\0'; pattern++, string++)
+ if (*pattern != '*' && *string != *pattern)
+ return 0;
+ return 1;
+}
+
+/* Test whether string[start_index..end_index-1] is a valid textual
+ representation of NaN. */
+static int
+strisnan (const char *string, size_t start_index, size_t end_index, int uppercase)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static void
+test_function (int (*my_asprintf) (char **, const char *, ...))
+{
+ int repeat;
+
+ /* Test return value convention. */
+
+ for (repeat = 0; repeat <= 8; repeat++)
+ {
+ char *result;
+ int retval = asprintf (&result, "%d", 12345);
+ ASSERT (retval == 5);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ free (result);
+ }
+
+ /* Test support of size specifiers as in C99. */
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345671 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%zu %d", (size_t) 12345672, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345672 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345673 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", (long double) 1.5, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.5 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%a %d", 3.1416015625, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%A %d", -3.1416015625, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
+ || strcmp (result, "-0X3.244P+0 33") == 0
+ || strcmp (result, "-0X6.488P-1 33") == 0
+ || strcmp (result, "-0XC.91P-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%a %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%a %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%a %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%a %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%a %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding near the decimal point. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.0a %d", 1.5, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 0. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.0a %d", 1.51, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 1. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.1a %d", 1.51, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.8p+0 33") == 0
+ || strcmp (result, "0x3.0p-1 33") == 0
+ || strcmp (result, "0x6.1p-2 33") == 0
+ || strcmp (result, "0xc.1p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 2. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2a %d", 1.51, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.83p+0 33") == 0
+ || strcmp (result, "0x3.05p-1 33") == 0
+ || strcmp (result, "0x6.0ap-2 33") == 0
+ || strcmp (result, "0xc.14p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 3. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.3a %d", 1.51, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.829p+0 33") == 0
+ || strcmp (result, "0x3.052p-1 33") == 0
+ || strcmp (result, "0x6.0a4p-2 33") == 0
+ || strcmp (result, "0xc.148p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.3a %d", 1.49999, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.800p+0 33") == 0
+ || strcmp (result, "0x3.000p-1 33") == 0
+ || strcmp (result, "0x6.000p-2 33") == 0
+ || strcmp (result, "0xc.000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000.
+ This shows a MacOS X 10.3.9 (Darwin 7.9) bug. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.1a %d", 1.999, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.0p+1 33") == 0
+ || strcmp (result, "0x2.0p+0 33") == 0
+ || strcmp (result, "0x4.0p-1 33") == 0
+ || strcmp (result, "0x8.0p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%10a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Small precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.10a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Large precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.50a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%-10a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7p-2 33") == 0
+ || strcmp (result, "0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%+a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
+ || strcmp (result, "+0x3.8p-1 33") == 0
+ || strcmp (result, "+0x7p-2 33") == 0
+ || strcmp (result, "+0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "% a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7.p-2 33") == 0
+ || strcmp (result, "0xe.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#a %d", 1.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.p+0 33") == 0
+ || strcmp (result, "0x2.p-1 33") == 0
+ || strcmp (result, "0x4.p-2 33") == 0
+ || strcmp (result, "0x8.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%010a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x001.cp+0 33") == 0
+ || strcmp (result, "0x003.8p-1 33") == 0
+ || strcmp (result, "0x00007p-2 33") == 0
+ || strcmp (result, "0x0000ep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%010a %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strcmp (result, " inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%050a %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ /* "0000000nan 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", 3.1416015625L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LA %d", -3.1416015625L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
+ || strcmp (result, "-0X3.244P+0 33") == 0
+ || strcmp (result, "-0X6.488P-1 33") == 0
+ || strcmp (result, "-0XC.91P-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0x0p+0 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+#endif
+
+ { /* Rounding near the decimal point. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.0La %d", 1.5L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 0. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.0La %d", 1.51L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x2p+0 33") == 0
+ || strcmp (result, "0x3p-1 33") == 0
+ || strcmp (result, "0x6p-2 33") == 0
+ || strcmp (result, "0xcp-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 1. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.1La %d", 1.51L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.8p+0 33") == 0
+ || strcmp (result, "0x3.0p-1 33") == 0
+ || strcmp (result, "0x6.1p-2 33") == 0
+ || strcmp (result, "0xc.1p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 2. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2La %d", 1.51L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.83p+0 33") == 0
+ || strcmp (result, "0x3.05p-1 33") == 0
+ || strcmp (result, "0x6.0ap-2 33") == 0
+ || strcmp (result, "0xc.14p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding with precision 3. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.3La %d", 1.51L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.829p+0 33") == 0
+ || strcmp (result, "0x3.052p-1 33") == 0
+ || strcmp (result, "0x6.0a4p-2 33") == 0
+ || strcmp (result, "0xc.148p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.3La %d", 1.49999L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.800p+0 33") == 0
+ || strcmp (result, "0x3.000p-1 33") == 0
+ || strcmp (result, "0x6.000p-2 33") == 0
+ || strcmp (result, "0xc.000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Rounding can turn a ...FFF into a ...000.
+ This shows a MacOS X 10.3.9 (Darwin 7.9) bug and a
+ glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.1La %d", 1.999L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.0p+1 33") == 0
+ || strcmp (result, "0x2.0p+0 33") == 0
+ || strcmp (result, "0x4.0p-1 33") == 0
+ || strcmp (result, "0x8.0p-2 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%10La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Small precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.10La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Large precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.50La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%-10La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7p-2 33") == 0
+ || strcmp (result, "0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%+La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
+ || strcmp (result, "+0x3.8p-1 33") == 0
+ || strcmp (result, "+0x7p-2 33") == 0
+ || strcmp (result, "+0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "% La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.cp+0 33") == 0
+ || strcmp (result, "0x3.8p-1 33") == 0
+ || strcmp (result, "0x7.p-2 33") == 0
+ || strcmp (result, "0xe.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#La %d", 1.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.p+0 33") == 0
+ || strcmp (result, "0x2.p-1 33") == 0
+ || strcmp (result, "0x4.p-2 33") == 0
+ || strcmp (result, "0x8.p-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%010La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x001.cp+0 33") == 0
+ || strcmp (result, "0x003.8p-1 33") == 0
+ || strcmp (result, "0x00007p-2 33") == 0
+ || strcmp (result, "0x0000ep-3 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%010La %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ /* "0000000inf 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strcmp (result, " inf 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%050La %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ /* "0000000nan 33" is not a valid result; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %f format directive. */
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f %d", 1234567.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "0.000000" },
+ { 1.234321234321234e-36, "0.000000" },
+ { 1.234321234321234e-35, "0.000000" },
+ { 1.234321234321234e-34, "0.000000" },
+ { 1.234321234321234e-33, "0.000000" },
+ { 1.234321234321234e-32, "0.000000" },
+ { 1.234321234321234e-31, "0.000000" },
+ { 1.234321234321234e-30, "0.000000" },
+ { 1.234321234321234e-29, "0.000000" },
+ { 1.234321234321234e-28, "0.000000" },
+ { 1.234321234321234e-27, "0.000000" },
+ { 1.234321234321234e-26, "0.000000" },
+ { 1.234321234321234e-25, "0.000000" },
+ { 1.234321234321234e-24, "0.000000" },
+ { 1.234321234321234e-23, "0.000000" },
+ { 1.234321234321234e-22, "0.000000" },
+ { 1.234321234321234e-21, "0.000000" },
+ { 1.234321234321234e-20, "0.000000" },
+ { 1.234321234321234e-19, "0.000000" },
+ { 1.234321234321234e-18, "0.000000" },
+ { 1.234321234321234e-17, "0.000000" },
+ { 1.234321234321234e-16, "0.000000" },
+ { 1.234321234321234e-15, "0.000000" },
+ { 1.234321234321234e-14, "0.000000" },
+ { 1.234321234321234e-13, "0.000000" },
+ { 1.234321234321234e-12, "0.000000" },
+ { 1.234321234321234e-11, "0.000000" },
+ { 1.234321234321234e-10, "0.000000" },
+ { 1.234321234321234e-9, "0.000000" },
+ { 1.234321234321234e-8, "0.000000" },
+ { 1.234321234321234e-7, "0.000000" },
+ { 1.234321234321234e-6, "0.000001" },
+ { 1.234321234321234e-5, "0.000012" },
+ { 1.234321234321234e-4, "0.000123" },
+ { 1.234321234321234e-3, "0.001234" },
+ { 1.234321234321234e-2, "0.012343" },
+ { 1.234321234321234e-1, "0.123432" },
+ { 1.234321234321234, "1.234321" },
+ { 1.234321234321234e1, "12.343212" },
+ { 1.234321234321234e2, "123.432123" },
+ { 1.234321234321234e3, "1234.321234" },
+ { 1.234321234321234e4, "12343.212343" },
+ { 1.234321234321234e5, "123432.123432" },
+ { 1.234321234321234e6, "1234321.234321" },
+ { 1.234321234321234e7, "12343212.343212" },
+ { 1.234321234321234e8, "123432123.432123" },
+ { 1.234321234321234e9, "1234321234.321234" },
+ { 1.234321234321234e10, "12343212343.2123**" },
+ { 1.234321234321234e11, "123432123432.123***" },
+ { 1.234321234321234e12, "1234321234321.23****" },
+ { 1.234321234321234e13, "12343212343212.3*****" },
+ { 1.234321234321234e14, "123432123432123.******" },
+ { 1.234321234321234e15, "1234321234321234.000000" },
+ { 1.234321234321234e16, "123432123432123**.000000" },
+ { 1.234321234321234e17, "123432123432123***.000000" },
+ { 1.234321234321234e18, "123432123432123****.000000" },
+ { 1.234321234321234e19, "123432123432123*****.000000" },
+ { 1.234321234321234e20, "123432123432123******.000000" },
+ { 1.234321234321234e21, "123432123432123*******.000000" },
+ { 1.234321234321234e22, "123432123432123********.000000" },
+ { 1.234321234321234e23, "123432123432123*********.000000" },
+ { 1.234321234321234e24, "123432123432123**********.000000" },
+ { 1.234321234321234e25, "123432123432123***********.000000" },
+ { 1.234321234321234e26, "123432123432123************.000000" },
+ { 1.234321234321234e27, "123432123432123*************.000000" },
+ { 1.234321234321234e28, "123432123432123**************.000000" },
+ { 1.234321234321234e29, "123432123432123***************.000000" },
+ { 1.234321234321234e30, "123432123432123****************.000000" },
+ { 1.234321234321234e31, "123432123432123*****************.000000" },
+ { 1.234321234321234e32, "123432123432123******************.000000" },
+ { 1.234321234321234e33, "123432123432123*******************.000000" },
+ { 1.234321234321234e34, "123432123432123********************.000000" },
+ { 1.234321234321234e35, "123432123432123*********************.000000" },
+ { 1.234321234321234e36, "123432123432123**********************.000000" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f", data[k].value);
+ ASSERT (result != NULL);
+ ASSERT (strmatch (data[k].string, result));
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f %d", -0.03125, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%f %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%10f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%-10f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%+f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "% f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015f %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015f %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%050f %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.f %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2f %d", 999.951, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2f %d", 999.996, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", 1234567.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "0.000000" },
+ { 1.234321234321234e-36L, "0.000000" },
+ { 1.234321234321234e-35L, "0.000000" },
+ { 1.234321234321234e-34L, "0.000000" },
+ { 1.234321234321234e-33L, "0.000000" },
+ { 1.234321234321234e-32L, "0.000000" },
+ { 1.234321234321234e-31L, "0.000000" },
+ { 1.234321234321234e-30L, "0.000000" },
+ { 1.234321234321234e-29L, "0.000000" },
+ { 1.234321234321234e-28L, "0.000000" },
+ { 1.234321234321234e-27L, "0.000000" },
+ { 1.234321234321234e-26L, "0.000000" },
+ { 1.234321234321234e-25L, "0.000000" },
+ { 1.234321234321234e-24L, "0.000000" },
+ { 1.234321234321234e-23L, "0.000000" },
+ { 1.234321234321234e-22L, "0.000000" },
+ { 1.234321234321234e-21L, "0.000000" },
+ { 1.234321234321234e-20L, "0.000000" },
+ { 1.234321234321234e-19L, "0.000000" },
+ { 1.234321234321234e-18L, "0.000000" },
+ { 1.234321234321234e-17L, "0.000000" },
+ { 1.234321234321234e-16L, "0.000000" },
+ { 1.234321234321234e-15L, "0.000000" },
+ { 1.234321234321234e-14L, "0.000000" },
+ { 1.234321234321234e-13L, "0.000000" },
+ { 1.234321234321234e-12L, "0.000000" },
+ { 1.234321234321234e-11L, "0.000000" },
+ { 1.234321234321234e-10L, "0.000000" },
+ { 1.234321234321234e-9L, "0.000000" },
+ { 1.234321234321234e-8L, "0.000000" },
+ { 1.234321234321234e-7L, "0.000000" },
+ { 1.234321234321234e-6L, "0.000001" },
+ { 1.234321234321234e-5L, "0.000012" },
+ { 1.234321234321234e-4L, "0.000123" },
+ { 1.234321234321234e-3L, "0.001234" },
+ { 1.234321234321234e-2L, "0.012343" },
+ { 1.234321234321234e-1L, "0.123432" },
+ { 1.234321234321234L, "1.234321" },
+ { 1.234321234321234e1L, "12.343212" },
+ { 1.234321234321234e2L, "123.432123" },
+ { 1.234321234321234e3L, "1234.321234" },
+ { 1.234321234321234e4L, "12343.212343" },
+ { 1.234321234321234e5L, "123432.123432" },
+ { 1.234321234321234e6L, "1234321.234321" },
+ { 1.234321234321234e7L, "12343212.343212" },
+ { 1.234321234321234e8L, "123432123.432123" },
+ { 1.234321234321234e9L, "1234321234.321234" },
+ { 1.234321234321234e10L, "12343212343.2123**" },
+ { 1.234321234321234e11L, "123432123432.123***" },
+ { 1.234321234321234e12L, "1234321234321.23****" },
+ { 1.234321234321234e13L, "12343212343212.3*****" },
+ { 1.234321234321234e14L, "123432123432123.******" },
+ { 1.234321234321234e15L, "1234321234321234.000000" },
+ { 1.234321234321234e16L, "123432123432123**.000000" },
+ { 1.234321234321234e17L, "123432123432123***.000000" },
+ { 1.234321234321234e18L, "123432123432123****.000000" },
+ { 1.234321234321234e19L, "123432123432123*****.000000" },
+ { 1.234321234321234e20L, "123432123432123******.000000" },
+ { 1.234321234321234e21L, "123432123432123*******.000000" },
+ { 1.234321234321234e22L, "123432123432123********.000000" },
+ { 1.234321234321234e23L, "123432123432123*********.000000" },
+ { 1.234321234321234e24L, "123432123432123**********.000000" },
+ { 1.234321234321234e25L, "123432123432123***********.000000" },
+ { 1.234321234321234e26L, "123432123432123************.000000" },
+ { 1.234321234321234e27L, "123432123432123*************.000000" },
+ { 1.234321234321234e28L, "123432123432123**************.000000" },
+ { 1.234321234321234e29L, "123432123432123***************.000000" },
+ { 1.234321234321234e30L, "123432123432123****************.000000" },
+ { 1.234321234321234e31L, "123432123432123*****************.000000" },
+ { 1.234321234321234e32L, "123432123432123******************.000000" },
+ { 1.234321234321234e33L, "123432123432123*******************.000000" },
+ { 1.234321234321234e34L, "123432123432123********************.000000" },
+ { 1.234321234321234e35L, "123432123432123*********************.000000" },
+ { 1.234321234321234e36L, "123432123432123**********************.000000" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf", data[k].value);
+ ASSERT (result != NULL);
+ ASSERT (strmatch (data[k].string, result));
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", -0.03125L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+#endif
+
+ { /* Width. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%-10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%+Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "% Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015Lf %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%050Lf %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2Lf %d", 999.951L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2Lf %d", 999.996L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %F format directive. */
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%F %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%F %d", 1234567.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%F %d", -0.03125, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%F %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%F %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%F %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "INF 33") == 0
+ || strcmp (result, "INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%F %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-INF 33") == 0
+ || strcmp (result, "-INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%F %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 1)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015F %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015F %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -INF 33") == 0
+ || strcmp (result, " -INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.F %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2F %d", 999.951, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2F %d", 999.996, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LF %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LF %d", 1234567.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234567.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LF %d", -0.03125L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.031250 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LF %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LF %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LF %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "INF 33") == 0
+ || strcmp (result, "INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LF %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-INF 33") == 0
+ || strcmp (result, "-INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%LF %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 1)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "00001234.000000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015LF %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -INF 33") == 0
+ || strcmp (result, " -INFINITY 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2LF %d", 999.951L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.2LF %d", 999.996L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000.00 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %e format directive. */
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e %d", 1234567.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.234567e+06 33") == 0
+ || strcmp (result, "1.234567e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "1.234321e-37" },
+ { 1.234321234321234e-36, "1.234321e-36" },
+ { 1.234321234321234e-35, "1.234321e-35" },
+ { 1.234321234321234e-34, "1.234321e-34" },
+ { 1.234321234321234e-33, "1.234321e-33" },
+ { 1.234321234321234e-32, "1.234321e-32" },
+ { 1.234321234321234e-31, "1.234321e-31" },
+ { 1.234321234321234e-30, "1.234321e-30" },
+ { 1.234321234321234e-29, "1.234321e-29" },
+ { 1.234321234321234e-28, "1.234321e-28" },
+ { 1.234321234321234e-27, "1.234321e-27" },
+ { 1.234321234321234e-26, "1.234321e-26" },
+ { 1.234321234321234e-25, "1.234321e-25" },
+ { 1.234321234321234e-24, "1.234321e-24" },
+ { 1.234321234321234e-23, "1.234321e-23" },
+ { 1.234321234321234e-22, "1.234321e-22" },
+ { 1.234321234321234e-21, "1.234321e-21" },
+ { 1.234321234321234e-20, "1.234321e-20" },
+ { 1.234321234321234e-19, "1.234321e-19" },
+ { 1.234321234321234e-18, "1.234321e-18" },
+ { 1.234321234321234e-17, "1.234321e-17" },
+ { 1.234321234321234e-16, "1.234321e-16" },
+ { 1.234321234321234e-15, "1.234321e-15" },
+ { 1.234321234321234e-14, "1.234321e-14" },
+ { 1.234321234321234e-13, "1.234321e-13" },
+ { 1.234321234321234e-12, "1.234321e-12" },
+ { 1.234321234321234e-11, "1.234321e-11" },
+ { 1.234321234321234e-10, "1.234321e-10" },
+ { 1.234321234321234e-9, "1.234321e-09" },
+ { 1.234321234321234e-8, "1.234321e-08" },
+ { 1.234321234321234e-7, "1.234321e-07" },
+ { 1.234321234321234e-6, "1.234321e-06" },
+ { 1.234321234321234e-5, "1.234321e-05" },
+ { 1.234321234321234e-4, "1.234321e-04" },
+ { 1.234321234321234e-3, "1.234321e-03" },
+ { 1.234321234321234e-2, "1.234321e-02" },
+ { 1.234321234321234e-1, "1.234321e-01" },
+ { 1.234321234321234, "1.234321e+00" },
+ { 1.234321234321234e1, "1.234321e+01" },
+ { 1.234321234321234e2, "1.234321e+02" },
+ { 1.234321234321234e3, "1.234321e+03" },
+ { 1.234321234321234e4, "1.234321e+04" },
+ { 1.234321234321234e5, "1.234321e+05" },
+ { 1.234321234321234e6, "1.234321e+06" },
+ { 1.234321234321234e7, "1.234321e+07" },
+ { 1.234321234321234e8, "1.234321e+08" },
+ { 1.234321234321234e9, "1.234321e+09" },
+ { 1.234321234321234e10, "1.234321e+10" },
+ { 1.234321234321234e11, "1.234321e+11" },
+ { 1.234321234321234e12, "1.234321e+12" },
+ { 1.234321234321234e13, "1.234321e+13" },
+ { 1.234321234321234e14, "1.234321e+14" },
+ { 1.234321234321234e15, "1.234321e+15" },
+ { 1.234321234321234e16, "1.234321e+16" },
+ { 1.234321234321234e17, "1.234321e+17" },
+ { 1.234321234321234e18, "1.234321e+18" },
+ { 1.234321234321234e19, "1.234321e+19" },
+ { 1.234321234321234e20, "1.234321e+20" },
+ { 1.234321234321234e21, "1.234321e+21" },
+ { 1.234321234321234e22, "1.234321e+22" },
+ { 1.234321234321234e23, "1.234321e+23" },
+ { 1.234321234321234e24, "1.234321e+24" },
+ { 1.234321234321234e25, "1.234321e+25" },
+ { 1.234321234321234e26, "1.234321e+26" },
+ { 1.234321234321234e27, "1.234321e+27" },
+ { 1.234321234321234e28, "1.234321e+28" },
+ { 1.234321234321234e29, "1.234321e+29" },
+ { 1.234321234321234e30, "1.234321e+30" },
+ { 1.234321234321234e31, "1.234321e+31" },
+ { 1.234321234321234e32, "1.234321e+32" },
+ { 1.234321234321234e33, "1.234321e+33" },
+ { 1.234321234321234e34, "1.234321e+34" },
+ { 1.234321234321234e35, "1.234321e+35" },
+ { 1.234321234321234e36, "1.234321e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e %d", -0.03125, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+ || strcmp (result, "-3.125000e-002 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000e+00 33") == 0
+ || strcmp (result, "0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+ || strcmp (result, "-0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%e %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%15e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%-15e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%+e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+ || strcmp (result, "+1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "% e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2.e+00 33") == 0
+ || strcmp (result, "2.e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.e %d", 9.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015e %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+ || strcmp (result, "001.234000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015e %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%050e %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.e %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4e %d", 999.951, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "9.9995e+02 33") == 0
+ || strcmp (result, "9.9995e+002 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4e %d", 999.996, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.0000e+03 33") == 0
+ || strcmp (result, "1.0000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", 1234567.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.234567e+06 33") == 0
+ || strcmp (result, "1.234567e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "1.234321e-37" },
+ { 1.234321234321234e-36L, "1.234321e-36" },
+ { 1.234321234321234e-35L, "1.234321e-35" },
+ { 1.234321234321234e-34L, "1.234321e-34" },
+ { 1.234321234321234e-33L, "1.234321e-33" },
+ { 1.234321234321234e-32L, "1.234321e-32" },
+ { 1.234321234321234e-31L, "1.234321e-31" },
+ { 1.234321234321234e-30L, "1.234321e-30" },
+ { 1.234321234321234e-29L, "1.234321e-29" },
+ { 1.234321234321234e-28L, "1.234321e-28" },
+ { 1.234321234321234e-27L, "1.234321e-27" },
+ { 1.234321234321234e-26L, "1.234321e-26" },
+ { 1.234321234321234e-25L, "1.234321e-25" },
+ { 1.234321234321234e-24L, "1.234321e-24" },
+ { 1.234321234321234e-23L, "1.234321e-23" },
+ { 1.234321234321234e-22L, "1.234321e-22" },
+ { 1.234321234321234e-21L, "1.234321e-21" },
+ { 1.234321234321234e-20L, "1.234321e-20" },
+ { 1.234321234321234e-19L, "1.234321e-19" },
+ { 1.234321234321234e-18L, "1.234321e-18" },
+ { 1.234321234321234e-17L, "1.234321e-17" },
+ { 1.234321234321234e-16L, "1.234321e-16" },
+ { 1.234321234321234e-15L, "1.234321e-15" },
+ { 1.234321234321234e-14L, "1.234321e-14" },
+ { 1.234321234321234e-13L, "1.234321e-13" },
+ { 1.234321234321234e-12L, "1.234321e-12" },
+ { 1.234321234321234e-11L, "1.234321e-11" },
+ { 1.234321234321234e-10L, "1.234321e-10" },
+ { 1.234321234321234e-9L, "1.234321e-09" },
+ { 1.234321234321234e-8L, "1.234321e-08" },
+ { 1.234321234321234e-7L, "1.234321e-07" },
+ { 1.234321234321234e-6L, "1.234321e-06" },
+ { 1.234321234321234e-5L, "1.234321e-05" },
+ { 1.234321234321234e-4L, "1.234321e-04" },
+ { 1.234321234321234e-3L, "1.234321e-03" },
+ { 1.234321234321234e-2L, "1.234321e-02" },
+ { 1.234321234321234e-1L, "1.234321e-01" },
+ { 1.234321234321234L, "1.234321e+00" },
+ { 1.234321234321234e1L, "1.234321e+01" },
+ { 1.234321234321234e2L, "1.234321e+02" },
+ { 1.234321234321234e3L, "1.234321e+03" },
+ { 1.234321234321234e4L, "1.234321e+04" },
+ { 1.234321234321234e5L, "1.234321e+05" },
+ { 1.234321234321234e6L, "1.234321e+06" },
+ { 1.234321234321234e7L, "1.234321e+07" },
+ { 1.234321234321234e8L, "1.234321e+08" },
+ { 1.234321234321234e9L, "1.234321e+09" },
+ { 1.234321234321234e10L, "1.234321e+10" },
+ { 1.234321234321234e11L, "1.234321e+11" },
+ { 1.234321234321234e12L, "1.234321e+12" },
+ { 1.234321234321234e13L, "1.234321e+13" },
+ { 1.234321234321234e14L, "1.234321e+14" },
+ { 1.234321234321234e15L, "1.234321e+15" },
+ { 1.234321234321234e16L, "1.234321e+16" },
+ { 1.234321234321234e17L, "1.234321e+17" },
+ { 1.234321234321234e18L, "1.234321e+18" },
+ { 1.234321234321234e19L, "1.234321e+19" },
+ { 1.234321234321234e20L, "1.234321e+20" },
+ { 1.234321234321234e21L, "1.234321e+21" },
+ { 1.234321234321234e22L, "1.234321e+22" },
+ { 1.234321234321234e23L, "1.234321e+23" },
+ { 1.234321234321234e24L, "1.234321e+24" },
+ { 1.234321234321234e25L, "1.234321e+25" },
+ { 1.234321234321234e26L, "1.234321e+26" },
+ { 1.234321234321234e27L, "1.234321e+27" },
+ { 1.234321234321234e28L, "1.234321e+28" },
+ { 1.234321234321234e29L, "1.234321e+29" },
+ { 1.234321234321234e30L, "1.234321e+30" },
+ { 1.234321234321234e31L, "1.234321e+31" },
+ { 1.234321234321234e32L, "1.234321e+32" },
+ { 1.234321234321234e33L, "1.234321e+33" },
+ { 1.234321234321234e34L, "1.234321e+34" },
+ { 1.234321234321234e35L, "1.234321e+35" },
+ { 1.234321234321234e36L, "1.234321e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", -0.03125L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+ || strcmp (result, "-3.125000e-002 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0.000000e+00 33") == 0
+ || strcmp (result, "0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+ || strcmp (result, "-0.000000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+#endif
+
+ { /* Width. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%-15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%+Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+ || strcmp (result, "+1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "% Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.750000e+00 33") == 0
+ || strcmp (result, "1.750000e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2.e+00 33") == 0
+ || strcmp (result, "2.e+000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.Le %d", 9.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+ || strcmp (result, "001.234000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015Le %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%050Le %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4Le %d", 999.951L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "9.9995e+02 33") == 0
+ || strcmp (result, "9.9995e+002 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4Le %d", 999.996L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.0000e+03 33") == 0
+ || strcmp (result, "1.0000e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %g format directive. */
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g %d", 1234567.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.23457e+06 33") == 0
+ || strcmp (result, "1.23457e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37, "1.23432e-37" },
+ { 1.234321234321234e-36, "1.23432e-36" },
+ { 1.234321234321234e-35, "1.23432e-35" },
+ { 1.234321234321234e-34, "1.23432e-34" },
+ { 1.234321234321234e-33, "1.23432e-33" },
+ { 1.234321234321234e-32, "1.23432e-32" },
+ { 1.234321234321234e-31, "1.23432e-31" },
+ { 1.234321234321234e-30, "1.23432e-30" },
+ { 1.234321234321234e-29, "1.23432e-29" },
+ { 1.234321234321234e-28, "1.23432e-28" },
+ { 1.234321234321234e-27, "1.23432e-27" },
+ { 1.234321234321234e-26, "1.23432e-26" },
+ { 1.234321234321234e-25, "1.23432e-25" },
+ { 1.234321234321234e-24, "1.23432e-24" },
+ { 1.234321234321234e-23, "1.23432e-23" },
+ { 1.234321234321234e-22, "1.23432e-22" },
+ { 1.234321234321234e-21, "1.23432e-21" },
+ { 1.234321234321234e-20, "1.23432e-20" },
+ { 1.234321234321234e-19, "1.23432e-19" },
+ { 1.234321234321234e-18, "1.23432e-18" },
+ { 1.234321234321234e-17, "1.23432e-17" },
+ { 1.234321234321234e-16, "1.23432e-16" },
+ { 1.234321234321234e-15, "1.23432e-15" },
+ { 1.234321234321234e-14, "1.23432e-14" },
+ { 1.234321234321234e-13, "1.23432e-13" },
+ { 1.234321234321234e-12, "1.23432e-12" },
+ { 1.234321234321234e-11, "1.23432e-11" },
+ { 1.234321234321234e-10, "1.23432e-10" },
+ { 1.234321234321234e-9, "1.23432e-09" },
+ { 1.234321234321234e-8, "1.23432e-08" },
+ { 1.234321234321234e-7, "1.23432e-07" },
+ { 1.234321234321234e-6, "1.23432e-06" },
+ { 1.234321234321234e-5, "1.23432e-05" },
+ { 1.234321234321234e-4, "0.000123432" },
+ { 1.234321234321234e-3, "0.00123432" },
+ { 1.234321234321234e-2, "0.0123432" },
+ { 1.234321234321234e-1, "0.123432" },
+ { 1.234321234321234, "1.23432" },
+ { 1.234321234321234e1, "12.3432" },
+ { 1.234321234321234e2, "123.432" },
+ { 1.234321234321234e3, "1234.32" },
+ { 1.234321234321234e4, "12343.2" },
+ { 1.234321234321234e5, "123432" },
+ { 1.234321234321234e6, "1.23432e+06" },
+ { 1.234321234321234e7, "1.23432e+07" },
+ { 1.234321234321234e8, "1.23432e+08" },
+ { 1.234321234321234e9, "1.23432e+09" },
+ { 1.234321234321234e10, "1.23432e+10" },
+ { 1.234321234321234e11, "1.23432e+11" },
+ { 1.234321234321234e12, "1.23432e+12" },
+ { 1.234321234321234e13, "1.23432e+13" },
+ { 1.234321234321234e14, "1.23432e+14" },
+ { 1.234321234321234e15, "1.23432e+15" },
+ { 1.234321234321234e16, "1.23432e+16" },
+ { 1.234321234321234e17, "1.23432e+17" },
+ { 1.234321234321234e18, "1.23432e+18" },
+ { 1.234321234321234e19, "1.23432e+19" },
+ { 1.234321234321234e20, "1.23432e+20" },
+ { 1.234321234321234e21, "1.23432e+21" },
+ { 1.234321234321234e22, "1.23432e+22" },
+ { 1.234321234321234e23, "1.23432e+23" },
+ { 1.234321234321234e24, "1.23432e+24" },
+ { 1.234321234321234e25, "1.23432e+25" },
+ { 1.234321234321234e26, "1.23432e+26" },
+ { 1.234321234321234e27, "1.23432e+27" },
+ { 1.234321234321234e28, "1.23432e+28" },
+ { 1.234321234321234e29, "1.23432e+29" },
+ { 1.234321234321234e30, "1.23432e+30" },
+ { 1.234321234321234e31, "1.23432e+31" },
+ { 1.234321234321234e32, "1.23432e+32" },
+ { 1.234321234321234e33, "1.23432e+33" },
+ { 1.234321234321234e34, "1.23432e+34" },
+ { 1.234321234321234e35, "1.23432e+35" },
+ { 1.234321234321234e36, "1.23432e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (expected[strlen (expected) - 4] == 'e'
+ && strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g %d", -0.03125, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.03125 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g %d", 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g %d", -zerod, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g %d", 1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%g %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Width. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%10g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%-10g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%+g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "% g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.75000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.g %d", 9.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%010g %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0000001234 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015g %d", -1.0 / 0.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%050g %d", NaNd (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.g %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.5g %d", 999.951, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.5g %d", 999.996, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* A larger positive number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", 1234567.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.23457e+06 33") == 0
+ || strcmp (result, "1.23457e+006 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Small and large positive numbers. */
+ static struct { long double value; const char *string; } data[] =
+ {
+ { 1.234321234321234e-37L, "1.23432e-37" },
+ { 1.234321234321234e-36L, "1.23432e-36" },
+ { 1.234321234321234e-35L, "1.23432e-35" },
+ { 1.234321234321234e-34L, "1.23432e-34" },
+ { 1.234321234321234e-33L, "1.23432e-33" },
+ { 1.234321234321234e-32L, "1.23432e-32" },
+ { 1.234321234321234e-31L, "1.23432e-31" },
+ { 1.234321234321234e-30L, "1.23432e-30" },
+ { 1.234321234321234e-29L, "1.23432e-29" },
+ { 1.234321234321234e-28L, "1.23432e-28" },
+ { 1.234321234321234e-27L, "1.23432e-27" },
+ { 1.234321234321234e-26L, "1.23432e-26" },
+ { 1.234321234321234e-25L, "1.23432e-25" },
+ { 1.234321234321234e-24L, "1.23432e-24" },
+ { 1.234321234321234e-23L, "1.23432e-23" },
+ { 1.234321234321234e-22L, "1.23432e-22" },
+ { 1.234321234321234e-21L, "1.23432e-21" },
+ { 1.234321234321234e-20L, "1.23432e-20" },
+ { 1.234321234321234e-19L, "1.23432e-19" },
+ { 1.234321234321234e-18L, "1.23432e-18" },
+ { 1.234321234321234e-17L, "1.23432e-17" },
+ { 1.234321234321234e-16L, "1.23432e-16" },
+ { 1.234321234321234e-15L, "1.23432e-15" },
+ { 1.234321234321234e-14L, "1.23432e-14" },
+ { 1.234321234321234e-13L, "1.23432e-13" },
+ { 1.234321234321234e-12L, "1.23432e-12" },
+ { 1.234321234321234e-11L, "1.23432e-11" },
+ { 1.234321234321234e-10L, "1.23432e-10" },
+ { 1.234321234321234e-9L, "1.23432e-09" },
+ { 1.234321234321234e-8L, "1.23432e-08" },
+ { 1.234321234321234e-7L, "1.23432e-07" },
+ { 1.234321234321234e-6L, "1.23432e-06" },
+ { 1.234321234321234e-5L, "1.23432e-05" },
+ { 1.234321234321234e-4L, "0.000123432" },
+ { 1.234321234321234e-3L, "0.00123432" },
+ { 1.234321234321234e-2L, "0.0123432" },
+ { 1.234321234321234e-1L, "0.123432" },
+ { 1.234321234321234L, "1.23432" },
+ { 1.234321234321234e1L, "12.3432" },
+ { 1.234321234321234e2L, "123.432" },
+ { 1.234321234321234e3L, "1234.32" },
+ { 1.234321234321234e4L, "12343.2" },
+ { 1.234321234321234e5L, "123432" },
+ { 1.234321234321234e6L, "1.23432e+06" },
+ { 1.234321234321234e7L, "1.23432e+07" },
+ { 1.234321234321234e8L, "1.23432e+08" },
+ { 1.234321234321234e9L, "1.23432e+09" },
+ { 1.234321234321234e10L, "1.23432e+10" },
+ { 1.234321234321234e11L, "1.23432e+11" },
+ { 1.234321234321234e12L, "1.23432e+12" },
+ { 1.234321234321234e13L, "1.23432e+13" },
+ { 1.234321234321234e14L, "1.23432e+14" },
+ { 1.234321234321234e15L, "1.23432e+15" },
+ { 1.234321234321234e16L, "1.23432e+16" },
+ { 1.234321234321234e17L, "1.23432e+17" },
+ { 1.234321234321234e18L, "1.23432e+18" },
+ { 1.234321234321234e19L, "1.23432e+19" },
+ { 1.234321234321234e20L, "1.23432e+20" },
+ { 1.234321234321234e21L, "1.23432e+21" },
+ { 1.234321234321234e22L, "1.23432e+22" },
+ { 1.234321234321234e23L, "1.23432e+23" },
+ { 1.234321234321234e24L, "1.23432e+24" },
+ { 1.234321234321234e25L, "1.23432e+25" },
+ { 1.234321234321234e26L, "1.23432e+26" },
+ { 1.234321234321234e27L, "1.23432e+27" },
+ { 1.234321234321234e28L, "1.23432e+28" },
+ { 1.234321234321234e29L, "1.23432e+29" },
+ { 1.234321234321234e30L, "1.23432e+30" },
+ { 1.234321234321234e31L, "1.23432e+31" },
+ { 1.234321234321234e32L, "1.23432e+32" },
+ { 1.234321234321234e33L, "1.23432e+33" },
+ { 1.234321234321234e34L, "1.23432e+34" },
+ { 1.234321234321234e35L, "1.23432e+35" },
+ { 1.234321234321234e36L, "1.23432e+36" }
+ };
+ size_t k;
+ for (k = 0; k < SIZEOF (data); k++)
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg", data[k].value);
+ const char *expected = data[k].string;
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ /* Some implementations produce exponents with 3 digits. */
+ || (expected[strlen (expected) - 4] == 'e'
+ && strlen (result) == strlen (expected) + 1
+ && memcmp (result, expected, strlen (expected) - 2) == 0
+ && result[strlen (expected) - 2] == '0'
+ && strcmp (result + strlen (expected) - 1,
+ expected + strlen (expected) - 2)
+ == 0));
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ }
+
+ { /* A negative number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", -0.03125L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-0.03125 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative zero. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", minus_zerol, 33, 44, 55);
+ ASSERT (result != NULL);
+ if (have_minus_zero ())
+ ASSERT (strcmp (result, "-0 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Positive infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", 1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "inf 33") == 0
+ || strcmp (result, "infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Negative infinity. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "-inf 33") == 0
+ || strcmp (result, "-infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+ Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+ Application Architecture.
+ Table 5-2 "Floating-Point Register Encodings"
+ Figure 5-6 "Memory to Floating-Point Register Data Translation"
+ */
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ char *result;
+ int retval =
+ my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) >= 3 + 3
+ && strisnan (result, 0, strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+#endif
+
+ { /* Width. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%-10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SHOWSIGN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%+Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "+1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_SPACE. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "% Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.75000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "2. 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ALT. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.Lg %d", 9.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.e+01 33") == 0
+ || strcmp (result, "1.e+001 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with finite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%010Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0000001234 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with infinite number. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%015Lg %d", -1.0L / 0.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " -inf 33") == 0
+ || strcmp (result, " -infinity 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* FLAG_ZERO with NaN. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%050Lg %d", NaNl (), 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
+ && strcmp (result + strlen (result) - 3, " 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with no rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.5Lg %d", 999.951L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "999.95 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ { /* Precision with rounding. */
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.5Lg %d", 999.996L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1000 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %n format directive. */
+
+ {
+ int count = -1;
+ char *result;
+ int retval =
+ my_asprintf (&result, "%d %n", 123, &count, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "123 ") == 0);
+ ASSERT (retval == strlen (result));
+ ASSERT (count == 4);
+ free (result);
+ }
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%2$d %1$d", 33, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "55 33") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the grouping flag. */
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%'d %d", 1234567, 99);
+ ASSERT (result != NULL);
+ ASSERT (result[strlen (result) - 1] == '9');
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the left-adjust flag. */
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "a%*sc", -3, "b");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "a%-*sc", 3, "b");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "a%-*sc", -3, "b");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "ab c") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of large precision. */
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4000d %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.*d %d", 4000, 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4000d %d", -1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ ASSERT (result[0] == '-');
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[1 + i] == '0');
+ ASSERT (strcmp (result + 1 + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4000u %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4000o %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 7; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 7, "4553207 99") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%.4000x %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ for (i = 0; i < 4000 - 6; i++)
+ ASSERT (result[i] == '0');
+ ASSERT (strcmp (result + 4000 - 6, "12d687 99") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char *result;
+ int retval =
+ my_asprintf (&result, "%#.4000x %d", 1234567, 99);
+ size_t i;
+ ASSERT (result != NULL);
+ ASSERT (result[0] == '0');
+ ASSERT (result[1] == 'x');
+ for (i = 0; i < 4000 - 6; i++)
+ ASSERT (result[2 + i] == '0');
+ ASSERT (strcmp (result + 2 + 4000 - 6, "12d687 99") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ {
+ char input[5000];
+ char *result;
+ int retval;
+ size_t i;
+
+ for (i = 0; i < sizeof (input) - 1; i++)
+ input[i] = 'a' + ((1000000 / (i + 1)) % 26);
+ input[i] = '\0';
+ retval = my_asprintf (&result, "%.4000s %d", input, 99);
+ ASSERT (result != NULL);
+ ASSERT (memcmp (result, input, 4000) == 0);
+ ASSERT (strcmp (result + 4000, " 99") == 0);
+ ASSERT (retval == strlen (result));
+ free (result);
+ }
+
+ /* Test the support of the %s format directive. */
+
+ /* To verify that these tests succeed, it is necessary to run them under
+ a tool that checks against invalid memory accesses, such as ElectricFence
+ or "valgrind --tool=memcheck". */
+ {
+ size_t i;
+
+ for (i = 1; i <= 8; i++)
+ {
+ char *block;
+ char *result;
+ int retval;
+
+ block = (char *) malloc (i);
+ memcpy (block, "abcdefgh", i);
+ retval = my_asprintf (&result, "%.*s", (int) i, block);
+ ASSERT (result != NULL);
+ ASSERT (memcmp (result, block, i) == 0);
+ ASSERT (result[i] == '\0');
+ ASSERT (retval == strlen (result));
+ free (result);
+ free (block);
+ }
+ }
+#if HAVE_WCHAR_T
+ {
+ size_t i;
+
+ for (i = 1; i <= 8; i++)
+ {
+ wchar_t *block;
+ size_t j;
+ char *result;
+ int retval;
+
+ block = (wchar_t *) malloc (i * sizeof (wchar_t));
+ for (j = 0; j < i; j++)
+ block[j] = "abcdefgh"[j];
+ retval = my_asprintf (&result, "%.*ls", (int) i, block);
+ ASSERT (result != NULL);
+ ASSERT (memcmp (result, "abcdefgh", i) == 0);
+ ASSERT (result[i] == '\0');
+ ASSERT (retval == strlen (result));
+ free (result);
+ free (block);
+ }
+ }
+#endif
+}
+
+static int
+my_asprintf (char **result, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = vasprintf (result, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasprintf ()
+{
+ test_function (my_asprintf);
+}
+
+static void
+test_asprintf ()
+{
+ test_function (asprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasprintf ();
+ test_asprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/test-vasprintf.c b/gnulib/tests/test-vasprintf.c
new file mode 100644
index 00000000..e5dc3cd3
--- /dev/null
+++ b/gnulib/tests/test-vasprintf.c
@@ -0,0 +1,83 @@
+/* Test of vasprintf() and asprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (asprintf, int, (char **, char const *, ...));
+SIGNATURE_CHECK (vasprintf, int, (char **, char const *, va_list));
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+static int
+my_asprintf (char **result, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = vasprintf (result, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasprintf ()
+{
+ int repeat;
+
+ for (repeat = 0; repeat <= 8; repeat++)
+ {
+ char *result;
+ int retval = my_asprintf (&result, "%d", 12345);
+ ASSERT (retval == 5);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ free (result);
+ }
+}
+
+static void
+test_asprintf ()
+{
+ int repeat;
+
+ for (repeat = 0; repeat <= 8; repeat++)
+ {
+ char *result;
+ int retval = asprintf (&result, "%d", 12345);
+ ASSERT (retval == 5);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ free (result);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasprintf ();
+ test_asprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/test-vc-list-files-cvs.sh b/gnulib/tests/test-vc-list-files-cvs.sh
new file mode 100755
index 00000000..110be03f
--- /dev/null
+++ b/gnulib/tests/test-vc-list-files-cvs.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+# Unit tests for vc-list-files
+# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>. */
+
+tmpdir=vc-cvs-$$
+trap 'st=$?; cd '"`pwd`"' && rm -rf $tmpdir; exit $st' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+if ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
+ compare() { diff -u "$@"; }
+elif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
+ compare() { cmp -s "$@"; }
+else
+ compare() { cmp "$@"; }
+fi
+
+repo=`pwd`/$tmpdir/repo
+
+fail=0
+for i in with-cvsu without; do
+ # On the first iteration, test using cvsu, if it's in your path.
+ # On the second iteration, ensure that cvsu fails, so we'll
+ # exercise the awk-using code.
+ if test $i = without; then
+ printf '%s\n' '#!/bin/sh' 'exit 1' > cvsu
+ chmod a+x cvsu
+ PATH=`pwd`:$PATH
+ export PATH
+ fi
+ ok=0
+ mkdir $tmpdir && cd $tmpdir &&
+ # without cvs, skip the test
+ # The double use of 'exit' is needed for the reference to $? inside the trap.
+ { ( cvs -Q -d "$repo" init ) > /dev/null 2>&1 \
+ || { echo "Skipping test: cvs not found in PATH"; (exit 77); exit 77; }; } &&
+ mkdir w && cd w &&
+ mkdir d &&
+ touch d/a b c &&
+ cvs -Q -d "$repo" import -m imp m M M0 &&
+ cvs -Q -d "$repo" co m && cd m &&
+ printf '%s\n' b c d/a > expected &&
+ vc-list-files | sort > actual &&
+ compare expected actual &&
+ ok=1
+ test $ok = 0 && fail=1
+done
+
+(exit $fail); exit $fail
diff --git a/gnulib/tests/test-vc-list-files-git.sh b/gnulib/tests/test-vc-list-files-git.sh
new file mode 100755
index 00000000..7b7ff1a5
--- /dev/null
+++ b/gnulib/tests/test-vc-list-files-git.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+# Unit tests for vc-list-files
+# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>. */
+
+if ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
+ compare() { diff -u "$@"; }
+elif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
+ compare() { cmp -s "$@"; }
+else
+ compare() { cmp "$@"; }
+fi
+
+tmpdir=vc-git-$$
+trap 'st=$?; cd '"`pwd`"' && rm -rf $tmpdir; exit $st' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+fail=1
+mkdir $tmpdir && cd $tmpdir &&
+ # without git, skip the test
+ # The double use of 'exit' is needed for the reference to $? inside the trap.
+ { ( git init -q ) > /dev/null 2>&1 \
+ || { echo "Skipping test: git not found in PATH"; (exit 77); exit 77; }; } &&
+ mkdir d &&
+ touch d/a b c &&
+ git config user.email "you@example.com"
+ git config user.name "Your Name"
+ git add . > /dev/null &&
+ git commit -q -a -m log &&
+ printf '%s\n' b c d/a > expected &&
+ vc-list-files > actual &&
+ compare expected actual &&
+ fail=0
+
+(exit $fail); exit $fail
diff --git a/gnulib/tests/test-vdprintf-posix.c b/gnulib/tests/test-vdprintf-posix.c
new file mode 100644
index 00000000..5b775af1
--- /dev/null
+++ b/gnulib/tests/test-vdprintf-posix.c
@@ -0,0 +1,52 @@
+/* Test of POSIX compatible vdprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (vdprintf, int, (int, char const *, va_list));
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-fprintf-posix.h"
+
+static int
+my_fprintf (FILE *fp, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = vdprintf (fileno (fp), format, args);
+ va_end (args);
+ return ret;
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_function (my_fprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-vdprintf-posix.sh b/gnulib/tests/test-vdprintf-posix.sh
new file mode 100755
index 00000000..558c41d0
--- /dev/null
+++ b/gnulib/tests/test-vdprintf-posix.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-vdprintf-posix.tmp t-vdprintf-posix.out"
+./test-vdprintf-posix${EXEEXT} > t-vdprintf-posix.tmp || exit 1
+LC_ALL=C tr -d '\r' < t-vdprintf-posix.tmp > t-vdprintf-posix.out || exit 1
+
+: ${DIFF=diff}
+${DIFF} "${srcdir}/test-printf-posix.output" t-vdprintf-posix.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-verify.c b/gnulib/tests/test-verify.c
new file mode 100644
index 00000000..890762f5
--- /dev/null
+++ b/gnulib/tests/test-verify.c
@@ -0,0 +1,48 @@
+/* Test the "verify" module.
+
+ Copyright (C) 2005, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible. */
+
+#include <config.h>
+
+#include "verify.h"
+
+int x;
+enum { a, b, c };
+
+verify (x >= 0); /* should give ERROR: non-constant expression */
+verify (c == 2); /* should be ok */
+verify (1 + 1 == 3); /* should give ERROR */
+verify (1 == 1); verify (1 == 1); /* should be ok */
+
+enum
+{
+ item = verify_true (1 == 1) * 0 + 17 /* should be ok */
+};
+
+int function (int n)
+{
+ verify (n >= 0); /* should give ERROR: non-constant expression */
+ verify (c == 2); /* should be ok */
+ verify (1 + 1 == 3); /* should give ERROR */
+ verify (1 == 1); verify (1 == 1); /* should be ok */
+
+ if (n)
+ return (verify_true (1 == 1), verify_true (1 == 1), 7); /* should be ok */
+ else
+ return (verify_true (1 == 2), 5); /* should give ERROR */
+}
diff --git a/gnulib/tests/test-version-etc.c b/gnulib/tests/test-version-etc.c
new file mode 100644
index 00000000..fcc86218
--- /dev/null
+++ b/gnulib/tests/test-version-etc.c
@@ -0,0 +1,33 @@
+/* Test suite for version-etc.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ This file is part of the GNUlib Library.
+
+ 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/>. */
+
+#include <config.h>
+
+#include "version-etc.h"
+
+#include "progname.h"
+
+#define AUTHORS "Sergey Poznyakoff", "Eric Blake"
+
+int
+main (int argc _GL_UNUSED, char **argv)
+{
+ set_program_name (argv[0]);
+ version_etc (stdout, "test-version-etc", "dummy", "0", AUTHORS,
+ (const char *) NULL);
+ return 0;
+}
diff --git a/gnulib/tests/test-version-etc.sh b/gnulib/tests/test-version-etc.sh
new file mode 100755
index 00000000..61d40468
--- /dev/null
+++ b/gnulib/tests/test-version-etc.sh
@@ -0,0 +1,43 @@
+#! /bin/sh
+# Test suite for version-etc.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+TMP=ve-expected.tmp
+LC_ALL=C
+export LC_ALL
+ERR=0
+
+cat > $TMP <<EOT
+test-version-etc (PROJECT) VERSION
+COPYRIGHT Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by Sergey Poznyakoff and Eric Blake.
+EOT
+
+./test-version-etc${EXEEXT} --version |
+ sed '1s/test-version-etc (.*) .*/test-version-etc (PROJECT) VERSION/
+ /^Packaged by/d
+ 2,3 s/Copyright (C) [0-9]\{4,4\}/COPYRIGHT/' |
+ tr -d '\015' |
+ diff -c $TMP - || ERR=1
+
+rm $TMP
+
+exit $ERR
diff --git a/gnulib/tests/test-vfprintf-posix.c b/gnulib/tests/test-vfprintf-posix.c
new file mode 100644
index 00000000..3c64afef
--- /dev/null
+++ b/gnulib/tests/test-vfprintf-posix.c
@@ -0,0 +1,52 @@
+/* Test of POSIX compatible vfprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (vfprintf, int, (FILE *, char const *, va_list));
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-fprintf-posix.h"
+
+static int
+my_fprintf (FILE *fp, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = vfprintf (fp, format, args);
+ va_end (args);
+ return ret;
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_function (my_fprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-vfprintf-posix.sh b/gnulib/tests/test-vfprintf-posix.sh
new file mode 100755
index 00000000..74339ba0
--- /dev/null
+++ b/gnulib/tests/test-vfprintf-posix.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-vfprintf-posix.tmp t-vfprintf-posix.out"
+./test-vfprintf-posix${EXEEXT} > t-vfprintf-posix.tmp || exit 1
+LC_ALL=C tr -d '\r' < t-vfprintf-posix.tmp > t-vfprintf-posix.out || exit 1
+
+: ${DIFF=diff}
+${DIFF} "${srcdir}/test-printf-posix.output" t-vfprintf-posix.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-vprintf-posix.c b/gnulib/tests/test-vprintf-posix.c
new file mode 100644
index 00000000..166df533
--- /dev/null
+++ b/gnulib/tests/test-vprintf-posix.c
@@ -0,0 +1,52 @@
+/* Test of POSIX compatible vfprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (vprintf, int, (char const *, va_list));
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-printf-posix.h"
+
+static int
+my_printf (const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = vprintf (format, args);
+ va_end (args);
+ return ret;
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_function (my_printf);
+ return 0;
+}
diff --git a/gnulib/tests/test-vprintf-posix.sh b/gnulib/tests/test-vprintf-posix.sh
new file mode 100755
index 00000000..968a8b2a
--- /dev/null
+++ b/gnulib/tests/test-vprintf-posix.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-vprintf-posix.tmp t-vprintf-posix.out"
+./test-vprintf-posix${EXEEXT} > t-vprintf-posix.tmp || exit 1
+LC_ALL=C tr -d '\r' < t-vprintf-posix.tmp > t-vprintf-posix.out || exit 1
+
+: ${DIFF=diff}
+${DIFF} "${srcdir}/test-printf-posix.output" t-vprintf-posix.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-vsnprintf-posix.c b/gnulib/tests/test-vsnprintf-posix.c
new file mode 100644
index 00000000..8de57556
--- /dev/null
+++ b/gnulib/tests/test-vsnprintf-posix.c
@@ -0,0 +1,51 @@
+/* Test of POSIX compatible vsnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include <float.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-snprintf-posix.h"
+
+static int
+my_snprintf (char *str, size_t size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = vsnprintf (str, size, format, args);
+ va_end (args);
+ return ret;
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_function (my_snprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-vsnprintf.c b/gnulib/tests/test-vsnprintf.c
new file mode 100644
index 00000000..1bfa5540
--- /dev/null
+++ b/gnulib/tests/test-vsnprintf.c
@@ -0,0 +1,77 @@
+/* Test of vsnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (vsnprintf, int, (char *, size_t, char const *, va_list));
+
+#include <stdarg.h>
+#include <string.h>
+
+#include "macros.h"
+
+static int
+my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+
+int
+main (int argc, char *argv[])
+{
+ char buf[8];
+ int size;
+ int retval;
+
+ for (size = 0; size <= 8; size++)
+ {
+ memcpy (buf, "DEADBEEF", 8);
+ retval = my_snprintf (buf, size, "%d", 12345);
+ if (size < 6)
+ {
+#if CHECK_VSNPRINTF_POSIX
+ ASSERT (retval < 0 || retval >= size);
+#endif
+ if (size > 0)
+ {
+ ASSERT (memcmp (buf, "12345", size - 1) == 0);
+ ASSERT (buf[size - 1] == '\0' || buf[size - 1] == '0' + size);
+ }
+#if !CHECK_VSNPRINTF_POSIX
+ if (size > 0)
+#endif
+ ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
+ }
+ else
+ {
+ ASSERT (retval == 5);
+ ASSERT (memcmp (buf, "12345\0EF", 8) == 0);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-vsprintf-posix.c b/gnulib/tests/test-vsprintf-posix.c
new file mode 100644
index 00000000..92ce4369
--- /dev/null
+++ b/gnulib/tests/test-vsprintf-posix.c
@@ -0,0 +1,54 @@
+/* Test of POSIX compatible vsprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (vsprintf, int, (char *, char const *, va_list));
+
+#include <float.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-sprintf-posix.h"
+
+static int
+my_sprintf (char *str, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start (args, format);
+ ret = vsprintf (str, format, args);
+ va_end (args);
+ return ret;
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_function (my_sprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-wchar.c b/gnulib/tests/test-wchar.c
new file mode 100644
index 00000000..2a03d6b6
--- /dev/null
+++ b/gnulib/tests/test-wchar.c
@@ -0,0 +1,37 @@
+/* Test of <wchar.h> substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "verify.h"
+
+/* Check that the types wchar_t and wint_t are defined. */
+wchar_t a = 'c';
+wint_t b = 'x';
+
+/* Check that NULL can be passed through varargs as a pointer type,
+ per POSIX 2008. */
+verify (sizeof NULL == sizeof (void *));
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gnulib/tests/test-wcrtomb.c b/gnulib/tests/test-wcrtomb.c
new file mode 100644
index 00000000..0e844ef0
--- /dev/null
+++ b/gnulib/tests/test-wcrtomb.c
@@ -0,0 +1,154 @@
+/* Test of conversion of wide character to multibyte character.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (wcrtomb, size_t, (char *, wchar_t, mbstate_t *));
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+/* Check the multibyte character s[0..n-1]. */
+static void
+check_character (const char *s, size_t n)
+{
+ wchar_t wc;
+ char buf[64];
+ int iret;
+ size_t ret;
+
+ wc = (wchar_t) 0xBADFACE;
+ iret = mbtowc (&wc, s, n);
+ ASSERT (iret == n);
+
+ ret = wcrtomb (buf, wc, NULL);
+ ASSERT (ret == n);
+ ASSERT (memcmp (buf, s, n) == 0);
+
+ /* Test special calling convention, passing a NULL pointer. */
+ ret = wcrtomb (NULL, wc, NULL);
+ ASSERT (ret == 1);
+}
+
+int
+main (int argc, char *argv[])
+{
+ char buf[64];
+ size_t ret;
+
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Test NUL character. */
+ {
+ buf[0] = 'x';
+ ret = wcrtomb (buf, 0, NULL);
+ ASSERT (ret == 1);
+ ASSERT (buf[0] == '\0');
+ }
+
+ /* Test single bytes. */
+ {
+ int c;
+
+ for (c = 0; c < 0x100; c++)
+ switch (c)
+ {
+ case '\t': case '\v': case '\f':
+ case ' ': case '!': case '"': case '#': case '%':
+ case '&': case '\'': case '(': case ')': case '*':
+ case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>':
+ case '?':
+ case 'A': case 'B': case 'C': case 'D': case 'E':
+ case 'F': case 'G': case 'H': case 'I': case 'J':
+ case 'K': case 'L': case 'M': case 'N': case 'O':
+ case 'P': case 'Q': case 'R': case 'S': case 'T':
+ case 'U': case 'V': case 'W': case 'X': case 'Y':
+ case 'Z':
+ case '[': case '\\': case ']': case '^': case '_':
+ case 'a': case 'b': case 'c': case 'd': case 'e':
+ case 'f': case 'g': case 'h': case 'i': case 'j':
+ case 'k': case 'l': case 'm': case 'n': case 'o':
+ case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y':
+ case 'z': case '{': case '|': case '}': case '~':
+ /* c is in the ISO C "basic character set". */
+ ret = wcrtomb (buf, btowc (c), NULL);
+ ASSERT (ret == 1);
+ ASSERT (buf[0] == (char) c);
+ break;
+ }
+ }
+
+ if (argc > 1)
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ {
+ const char input[] = "B\374\337er"; /* "Büßer" */
+
+ check_character (input + 1, 1);
+ check_character (input + 2, 1);
+ }
+ return 0;
+
+ case '2':
+ /* Locale encoding is UTF-8. */
+ {
+ const char input[] = "B\303\274\303\237er"; /* "Büßer" */
+
+ check_character (input + 1, 2);
+ check_character (input + 3, 2);
+ }
+ return 0;
+
+ case '3':
+ /* Locale encoding is EUC-JP. */
+ {
+ const char input[] = "<\306\374\313\334\270\354>"; /* "<日本語>" */
+
+ check_character (input + 1, 2);
+ check_character (input + 3, 2);
+ check_character (input + 5, 2);
+ }
+ return 0;
+
+ case '4':
+ /* Locale encoding is GB18030. */
+ {
+ const char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+
+ check_character (input + 1, 2);
+ check_character (input + 3, 4);
+ }
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-wcrtomb.sh b/gnulib/tests/test-wcrtomb.sh
new file mode 100755
index 00000000..3eda8f33
--- /dev/null
+++ b/gnulib/tests/test-wcrtomb.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR != none; then
+ LC_ALL=$LOCALE_FR \
+ ./test-wcrtomb${EXEEXT} 1 \
+ || exit 1
+fi
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 != none; then
+ LC_ALL=$LOCALE_FR_UTF8 \
+ ./test-wcrtomb${EXEEXT} 2 \
+ || exit 1
+fi
+
+# Test whether a specific EUC-JP locale is installed.
+: ${LOCALE_JA=ja_JP}
+if test $LOCALE_JA != none; then
+ LC_ALL=$LOCALE_JA \
+ ./test-wcrtomb${EXEEXT} 3 \
+ || exit 1
+fi
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN != none; then
+ LC_ALL=$LOCALE_ZH_CN \
+ ./test-wcrtomb${EXEEXT} 4 \
+ || exit 1
+fi
+
+exit 0
diff --git a/gnulib/tests/test-wcsnrtombs.c b/gnulib/tests/test-wcsnrtombs.c
new file mode 100644
index 00000000..b16e0143
--- /dev/null
+++ b/gnulib/tests/test-wcsnrtombs.c
@@ -0,0 +1,202 @@
+/* Test of conversion of wide string to string.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (wcsnrtombs, size_t, (char *, wchar_t const **, size_t, size_t,
+ mbstate_t *));
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ if (argc > 1)
+ {
+ wchar_t input[10];
+ size_t n;
+ const wchar_t *src;
+ #define BUFSIZE 20
+ char buf[BUFSIZE];
+ size_t ret;
+
+ {
+ size_t i;
+ for (i = 0; i < BUFSIZE; i++)
+ buf[i] = '_';
+ }
+
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ {
+ const char original[] = "B\374\337er"; /* "Büßer" */
+
+ ret = mbstowcs (input, original, 10);
+ ASSERT (ret == 5);
+
+ for (n = 0; n < 10; n++)
+ {
+ src = input;
+ ret = wcsnrtombs (NULL, &src, 6, n, NULL);
+ ASSERT (ret == 5);
+ ASSERT (src == input);
+
+ src = input;
+ ret = wcsnrtombs (buf, &src, 6, n, NULL);
+ ASSERT (ret == (n <= 5 ? n : 5));
+ ASSERT (src == (n <= 5 ? input + n : NULL));
+ ASSERT (memcmp (buf, original, ret) == 0);
+ if (src == NULL)
+ ASSERT (buf[ret] == '\0');
+ ASSERT (buf[ret + (src == NULL) + 0] == '_');
+ ASSERT (buf[ret + (src == NULL) + 1] == '_');
+ ASSERT (buf[ret + (src == NULL) + 2] == '_');
+ }
+ }
+ break;
+
+ case '2':
+ /* Locale encoding is UTF-8. */
+ {
+ const char original[] = "B\303\274\303\237er"; /* "Büßer" */
+
+ ret = mbstowcs (input, original, 10);
+ ASSERT (ret == 5);
+
+ for (n = 0; n < 10; n++)
+ {
+ src = input;
+ ret = wcsnrtombs (NULL, &src, 6, n, NULL);
+ ASSERT (ret == 7);
+ ASSERT (src == input);
+
+ src = input;
+ ret = wcsnrtombs (buf, &src, 6, n, NULL);
+ ASSERT (ret == (n < 1 ? n :
+ n < 3 ? 1 :
+ n < 5 ? 3 :
+ n <= 7 ? n : 7));
+ ASSERT (src == (n < 1 ? input + n :
+ n < 3 ? input + 1 :
+ n < 5 ? input + 2 :
+ n <= 7 ? input + (n - 2) : NULL));
+ ASSERT (memcmp (buf, original, ret) == 0);
+ if (src == NULL)
+ ASSERT (buf[ret] == '\0');
+ ASSERT (buf[ret + (src == NULL) + 0] == '_');
+ ASSERT (buf[ret + (src == NULL) + 1] == '_');
+ ASSERT (buf[ret + (src == NULL) + 2] == '_');
+ }
+ }
+ break;
+
+ case '3':
+ /* Locale encoding is EUC-JP. */
+ {
+ const char original[] = "<\306\374\313\334\270\354>"; /* "<日本語>" */
+
+ ret = mbstowcs (input, original, 10);
+ ASSERT (ret == 5);
+
+ for (n = 0; n < 10; n++)
+ {
+ src = input;
+ ret = wcsnrtombs (NULL, &src, 6, n, NULL);
+ ASSERT (ret == 8);
+ ASSERT (src == input);
+
+ src = input;
+ ret = wcsnrtombs (buf, &src, 6, n, NULL);
+ ASSERT (ret == (n < 1 ? n :
+ n < 3 ? 1 :
+ n < 5 ? 3 :
+ n < 7 ? 5 :
+ n <= 8 ? n : 8));
+ ASSERT (src == (n < 1 ? input + n :
+ n < 3 ? input + 1 :
+ n < 5 ? input + 2 :
+ n < 7 ? input + 3 :
+ n <= 8 ? input + (n - 3) : NULL));
+ ASSERT (memcmp (buf, original, ret) == 0);
+ if (src == NULL)
+ ASSERT (buf[ret] == '\0');
+ ASSERT (buf[ret + (src == NULL) + 0] == '_');
+ ASSERT (buf[ret + (src == NULL) + 1] == '_');
+ ASSERT (buf[ret + (src == NULL) + 2] == '_');
+ }
+ }
+ break;
+
+
+ case '4':
+ /* Locale encoding is GB18030. */
+ {
+ const char original[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+
+ ret = mbstowcs (input, original, 10);
+ ASSERT (ret == 5);
+
+ for (n = 0; n < 10; n++)
+ {
+ src = input;
+ ret = wcsnrtombs (NULL, &src, 6, n, NULL);
+ ASSERT (ret == 9);
+ ASSERT (src == input);
+
+ src = input;
+ ret = wcsnrtombs (buf, &src, 6, n, NULL);
+ ASSERT (ret == (n < 1 ? n :
+ n < 3 ? 1 :
+ n < 7 ? 3 :
+ n <= 9 ? n : 9));
+ ASSERT (src == (n < 1 ? input + n :
+ n < 3 ? input + 1 :
+ n < 7 ? input + 2 :
+ n <= 9 ? input + (n - 4) : NULL));
+ ASSERT (memcmp (buf, original, ret) == 0);
+ if (src == NULL)
+ ASSERT (buf[ret] == '\0');
+ ASSERT (buf[ret + (src == NULL) + 0] == '_');
+ ASSERT (buf[ret + (src == NULL) + 1] == '_');
+ ASSERT (buf[ret + (src == NULL) + 2] == '_');
+ }
+ }
+ break;
+
+ default:
+ return 1;
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-wcsnrtombs1.sh b/gnulib/tests/test-wcsnrtombs1.sh
new file mode 100755
index 00000000..697402b6
--- /dev/null
+++ b/gnulib/tests/test-wcsnrtombs1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-wcsnrtombs${EXEEXT} 1
diff --git a/gnulib/tests/test-wcsnrtombs2.sh b/gnulib/tests/test-wcsnrtombs2.sh
new file mode 100755
index 00000000..3bb0729b
--- /dev/null
+++ b/gnulib/tests/test-wcsnrtombs2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-wcsnrtombs${EXEEXT} 2
diff --git a/gnulib/tests/test-wcsnrtombs3.sh b/gnulib/tests/test-wcsnrtombs3.sh
new file mode 100755
index 00000000..7d37c913
--- /dev/null
+++ b/gnulib/tests/test-wcsnrtombs3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific EUC-JP locale is installed.
+: ${LOCALE_JA=ja_JP}
+if test $LOCALE_JA = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional japanese locale is installed"
+ else
+ echo "Skipping test: no traditional japanese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_JA \
+./test-wcsnrtombs${EXEEXT} 3
diff --git a/gnulib/tests/test-wcsnrtombs4.sh b/gnulib/tests/test-wcsnrtombs4.sh
new file mode 100755
index 00000000..c8a02ce2
--- /dev/null
+++ b/gnulib/tests/test-wcsnrtombs4.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no transitional chinese locale is installed"
+ else
+ echo "Skipping test: no transitional chinese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-wcsnrtombs${EXEEXT} 4
diff --git a/gnulib/tests/test-wcsrtombs.c b/gnulib/tests/test-wcsrtombs.c
new file mode 100644
index 00000000..c94924d6
--- /dev/null
+++ b/gnulib/tests/test-wcsrtombs.c
@@ -0,0 +1,202 @@
+/* Test of conversion of wide string to string.
+ Copyright (C) 2008, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (wcsrtombs, size_t, (char *, wchar_t const **, size_t,
+ mbstate_t *));
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ if (argc > 1)
+ {
+ wchar_t input[10];
+ size_t n;
+ const wchar_t *src;
+ #define BUFSIZE 20
+ char buf[BUFSIZE];
+ size_t ret;
+
+ {
+ size_t i;
+ for (i = 0; i < BUFSIZE; i++)
+ buf[i] = '_';
+ }
+
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ {
+ const char original[] = "B\374\337er"; /* "Büßer" */
+
+ ret = mbstowcs (input, original, 10);
+ ASSERT (ret == 5);
+
+ for (n = 0; n < 10; n++)
+ {
+ src = input;
+ ret = wcsrtombs (NULL, &src, n, NULL);
+ ASSERT (ret == 5);
+ ASSERT (src == input);
+
+ src = input;
+ ret = wcsrtombs (buf, &src, n, NULL);
+ ASSERT (ret == (n <= 5 ? n : 5));
+ ASSERT (src == (n <= 5 ? input + n : NULL));
+ ASSERT (memcmp (buf, original, ret) == 0);
+ if (src == NULL)
+ ASSERT (buf[ret] == '\0');
+ ASSERT (buf[ret + (src == NULL) + 0] == '_');
+ ASSERT (buf[ret + (src == NULL) + 1] == '_');
+ ASSERT (buf[ret + (src == NULL) + 2] == '_');
+ }
+ }
+ break;
+
+ case '2':
+ /* Locale encoding is UTF-8. */
+ {
+ const char original[] = "B\303\274\303\237er"; /* "Büßer" */
+
+ ret = mbstowcs (input, original, 10);
+ ASSERT (ret == 5);
+
+ for (n = 0; n < 10; n++)
+ {
+ src = input;
+ ret = wcsrtombs (NULL, &src, n, NULL);
+ ASSERT (ret == 7);
+ ASSERT (src == input);
+
+ src = input;
+ ret = wcsrtombs (buf, &src, n, NULL);
+ ASSERT (ret == (n < 1 ? n :
+ n < 3 ? 1 :
+ n < 5 ? 3 :
+ n <= 7 ? n : 7));
+ ASSERT (src == (n < 1 ? input + n :
+ n < 3 ? input + 1 :
+ n < 5 ? input + 2 :
+ n <= 7 ? input + (n - 2) : NULL));
+ ASSERT (memcmp (buf, original, ret) == 0);
+ if (src == NULL)
+ ASSERT (buf[ret] == '\0');
+ ASSERT (buf[ret + (src == NULL) + 0] == '_');
+ ASSERT (buf[ret + (src == NULL) + 1] == '_');
+ ASSERT (buf[ret + (src == NULL) + 2] == '_');
+ }
+ }
+ break;
+
+ case '3':
+ /* Locale encoding is EUC-JP. */
+ {
+ const char original[] = "<\306\374\313\334\270\354>"; /* "<日本語>" */
+
+ ret = mbstowcs (input, original, 10);
+ ASSERT (ret == 5);
+
+ for (n = 0; n < 10; n++)
+ {
+ src = input;
+ ret = wcsrtombs (NULL, &src, n, NULL);
+ ASSERT (ret == 8);
+ ASSERT (src == input);
+
+ src = input;
+ ret = wcsrtombs (buf, &src, n, NULL);
+ ASSERT (ret == (n < 1 ? n :
+ n < 3 ? 1 :
+ n < 5 ? 3 :
+ n < 7 ? 5 :
+ n <= 8 ? n : 8));
+ ASSERT (src == (n < 1 ? input + n :
+ n < 3 ? input + 1 :
+ n < 5 ? input + 2 :
+ n < 7 ? input + 3 :
+ n <= 8 ? input + (n - 3) : NULL));
+ ASSERT (memcmp (buf, original, ret) == 0);
+ if (src == NULL)
+ ASSERT (buf[ret] == '\0');
+ ASSERT (buf[ret + (src == NULL) + 0] == '_');
+ ASSERT (buf[ret + (src == NULL) + 1] == '_');
+ ASSERT (buf[ret + (src == NULL) + 2] == '_');
+ }
+ }
+ break;
+
+
+ case '4':
+ /* Locale encoding is GB18030. */
+ {
+ const char original[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+
+ ret = mbstowcs (input, original, 10);
+ ASSERT (ret == 5);
+
+ for (n = 0; n < 10; n++)
+ {
+ src = input;
+ ret = wcsrtombs (NULL, &src, n, NULL);
+ ASSERT (ret == 9);
+ ASSERT (src == input);
+
+ src = input;
+ ret = wcsrtombs (buf, &src, n, NULL);
+ ASSERT (ret == (n < 1 ? n :
+ n < 3 ? 1 :
+ n < 7 ? 3 :
+ n <= 9 ? n : 9));
+ ASSERT (src == (n < 1 ? input + n :
+ n < 3 ? input + 1 :
+ n < 7 ? input + 2 :
+ n <= 9 ? input + (n - 4) : NULL));
+ ASSERT (memcmp (buf, original, ret) == 0);
+ if (src == NULL)
+ ASSERT (buf[ret] == '\0');
+ ASSERT (buf[ret + (src == NULL) + 0] == '_');
+ ASSERT (buf[ret + (src == NULL) + 1] == '_');
+ ASSERT (buf[ret + (src == NULL) + 2] == '_');
+ }
+ }
+ break;
+
+ default:
+ return 1;
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/test-wcsrtombs1.sh b/gnulib/tests/test-wcsrtombs1.sh
new file mode 100755
index 00000000..7cdc9ea5
--- /dev/null
+++ b/gnulib/tests/test-wcsrtombs1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-wcsrtombs${EXEEXT} 1
diff --git a/gnulib/tests/test-wcsrtombs2.sh b/gnulib/tests/test-wcsrtombs2.sh
new file mode 100755
index 00000000..d8e2da67
--- /dev/null
+++ b/gnulib/tests/test-wcsrtombs2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-wcsrtombs${EXEEXT} 2
diff --git a/gnulib/tests/test-wcsrtombs3.sh b/gnulib/tests/test-wcsrtombs3.sh
new file mode 100755
index 00000000..431a584a
--- /dev/null
+++ b/gnulib/tests/test-wcsrtombs3.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific EUC-JP locale is installed.
+: ${LOCALE_JA=ja_JP}
+if test $LOCALE_JA = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional japanese locale is installed"
+ else
+ echo "Skipping test: no traditional japanese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_JA \
+./test-wcsrtombs${EXEEXT} 3
diff --git a/gnulib/tests/test-wcsrtombs4.sh b/gnulib/tests/test-wcsrtombs4.sh
new file mode 100755
index 00000000..4cff704f
--- /dev/null
+++ b/gnulib/tests/test-wcsrtombs4.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific GB18030 locale is installed.
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no transitional chinese locale is installed"
+ else
+ echo "Skipping test: no transitional chinese locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_ZH_CN \
+./test-wcsrtombs${EXEEXT} 4
diff --git a/gnulib/tests/test-wctype.c b/gnulib/tests/test-wctype.c
new file mode 100644
index 00000000..49d7cfa0
--- /dev/null
+++ b/gnulib/tests/test-wctype.c
@@ -0,0 +1,74 @@
+/* Test of <wctype.h> substitute.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <wctype.h>
+
+#include "macros.h"
+
+/* Check that the type wint_t is defined. */
+wint_t a = 'x';
+/* Check that WEOF is defined. */
+wint_t e = WEOF;
+
+int
+main (void)
+{
+ /* Check that the isw* functions exist as functions or as macros. */
+ (void) iswalnum (0);
+ (void) iswalpha (0);
+#if 0 /* not portable: missing on mingw */
+ (void) iswblank (0);
+#endif
+ (void) iswcntrl (0);
+ (void) iswdigit (0);
+ (void) iswgraph (0);
+ (void) iswlower (0);
+ (void) iswprint (0);
+ (void) iswpunct (0);
+ (void) iswspace (0);
+ (void) iswupper (0);
+ (void) iswxdigit (0);
+
+ /* Check that the isw* functions map WEOF to 0. */
+ ASSERT (!iswalnum (e));
+ ASSERT (!iswalpha (e));
+#if 0 /* not portable: missing on mingw */
+ ASSERT (!iswblank (e));
+#endif
+ ASSERT (!iswcntrl (e));
+ ASSERT (!iswdigit (e));
+ ASSERT (!iswgraph (e));
+ ASSERT (!iswlower (e));
+ ASSERT (!iswprint (e));
+ ASSERT (!iswpunct (e));
+ ASSERT (!iswspace (e));
+ ASSERT (!iswupper (e));
+ ASSERT (!iswxdigit (e));
+
+ /* Check that the tow* functions exist as functions or as macros. */
+ (void) towlower (0);
+ (void) towupper (0);
+
+ /* Check that the tow* functions map WEOF to WEOF. */
+ ASSERT (towlower (e) == e);
+ ASSERT (towupper (e) == e);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-wcwidth.c b/gnulib/tests/test-wcwidth.c
new file mode 100644
index 00000000..f6f97924
--- /dev/null
+++ b/gnulib/tests/test-wcwidth.c
@@ -0,0 +1,81 @@
+/* Test of wcwidth() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (wcwidth, int, (wchar_t));
+
+#include <locale.h>
+#include <string.h>
+
+#include "localcharset.h"
+#include "macros.h"
+
+int
+main ()
+{
+ wchar_t wc;
+
+ /* Test width of ASCII characters. */
+ for (wc = 0x20; wc < 0x7F; wc++)
+ ASSERT (wcwidth (wc) == 1);
+
+ /* Switch to an UTF-8 locale. */
+ if (setlocale (LC_ALL, "fr_FR.UTF-8") != NULL
+ /* Check whether it's really an UTF-8 locale.
+ On OpenBSD 4.0, the setlocale call succeeds only for the LC_CTYPE
+ category and therefore returns "C/fr_FR.UTF-8/C/C/C/C", but the
+ LC_CTYPE category is effectively set to an ASCII LC_CTYPE category;
+ in particular, locale_charset() returns "ASCII". */
+ && strcmp (locale_charset (), "UTF-8") == 0)
+ {
+ /* Test width of ASCII characters. */
+ for (wc = 0x20; wc < 0x7F; wc++)
+ ASSERT (wcwidth (wc) == 1);
+
+ /* Test width of some non-spacing characters. */
+ ASSERT (wcwidth (0x0301) == 0);
+ ASSERT (wcwidth (0x05B0) == 0);
+
+ /* Test width of some format control characters. */
+ ASSERT (wcwidth (0x200E) <= 0);
+ ASSERT (wcwidth (0x2060) <= 0);
+#if 0 /* wchar_t may be only 16 bits. */
+ ASSERT (wcwidth (0xE0001) <= 0);
+ ASSERT (wcwidth (0xE0044) <= 0);
+#endif
+
+ /* Test width of some zero width characters. */
+ ASSERT (wcwidth (0x200B) == 0);
+ ASSERT (wcwidth (0xFEFF) <= 0);
+
+ /* Test width of some CJK characters. */
+ ASSERT (wcwidth (0x3000) == 2);
+ ASSERT (wcwidth (0xB250) == 2);
+ ASSERT (wcwidth (0xFF1A) == 2);
+#if 0 /* wchar_t may be only 16 bits. */
+ ASSERT (wcwidth (0x20369) == 2);
+ ASSERT (wcwidth (0x2F876) == 2);
+#endif
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-xalloc-die.c b/gnulib/tests/test-xalloc-die.c
new file mode 100644
index 00000000..67edd92d
--- /dev/null
+++ b/gnulib/tests/test-xalloc-die.c
@@ -0,0 +1,30 @@
+/* Test of xalloc_die() function.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2009. */
+
+#include <config.h>
+
+#include "xalloc.h"
+#include "progname.h"
+
+int
+main (int argc _GL_UNUSED, char **argv)
+{
+ set_program_name (argv[0]);
+ xalloc_die ();
+ return 0;
+}
diff --git a/gnulib/tests/test-xalloc-die.sh b/gnulib/tests/test-xalloc-die.sh
new file mode 100755
index 00000000..80d6208d
--- /dev/null
+++ b/gnulib/tests/test-xalloc-die.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+# Test suite for xalloc_die.
+# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# This file is part of the GNUlib Library.
+#
+# 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/>.
+
+. "${srcdir=.}/init.sh"; path_prepend_ .
+
+test-xalloc-die${EXEEXT} 2> err > out
+case $? in
+ 1) ;;
+ *) Exit 1;;
+esac
+
+tr -d '\015' < err \
+ | sed 's,.*test-xalloc-die[.ex]*:,test-xalloc-die:,' > err2 || Exit 1
+
+compare - err2 <<\EOF || Exit 1
+test-xalloc-die: memory exhausted
+EOF
+
+test -s out && Exit 1
+
+Exit $fail
diff --git a/gnulib/tests/test-xfprintf-posix.c b/gnulib/tests/test-xfprintf-posix.c
new file mode 100644
index 00000000..b8fc6ed2
--- /dev/null
+++ b/gnulib/tests/test-xfprintf-posix.c
@@ -0,0 +1,40 @@
+/* Test of error-checking xfprintf() function with POSIX compatible formatting.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "xprintf.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "progname.h"
+#include "macros.h"
+
+#include "test-fprintf-posix.h"
+
+int
+main (int argc _GL_UNUSED, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_function (xfprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-xmemdup0.c b/gnulib/tests/test-xmemdup0.c
new file mode 100644
index 00000000..eb93336f
--- /dev/null
+++ b/gnulib/tests/test-xmemdup0.c
@@ -0,0 +1,82 @@
+/* Test of xmemdup0() function.
+ Copyright (C) 2008-2010 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, 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2008. */
+
+#include <config.h>
+
+#include "xmemdup0.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "progname.h"
+#include "macros.h"
+
+int
+main (int argc, char **argv)
+{
+ char buffer[10] = { 'a', 'b', 'c', 'd', '\0',
+ 'f', 'g', 'h', 'i', 'j' };
+
+ set_program_name (argv[0]);
+
+ /* Empty string. */
+ {
+ char *result = xmemdup0 (NULL, 0);
+ ASSERT (result);
+ ASSERT (!*result);
+ free (result);
+ }
+ {
+ char *result = xmemdup0 ("", 0);
+ ASSERT (result);
+ ASSERT (!*result);
+ free (result);
+ }
+
+ /* Various buffer lengths. */
+ {
+ char *result = xmemdup0 (buffer, 4);
+ ASSERT (result);
+ ASSERT (strcmp (result, buffer) == 0);
+ free (result);
+ }
+ {
+ char *result = xmemdup0 (buffer, 5);
+ ASSERT (result);
+ ASSERT (strcmp (result, buffer) == 0);
+ ASSERT (result[5] == '\0');
+ free (result);
+ }
+ {
+ char *result = xmemdup0 (buffer, 9);
+ ASSERT (result);
+ ASSERT (memcmp (result, buffer, 9) == 0);
+ ASSERT (result[9] == '\0');
+ free (result);
+ }
+ {
+ char *result = xmemdup0 (buffer, 10);
+ ASSERT (result);
+ ASSERT (memcmp (result, buffer, 10) == 0);
+ ASSERT (result[10] == '\0');
+ free (result);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/test-xprintf-posix.c b/gnulib/tests/test-xprintf-posix.c
new file mode 100644
index 00000000..c907356f
--- /dev/null
+++ b/gnulib/tests/test-xprintf-posix.c
@@ -0,0 +1,39 @@
+/* Test of error-checking xprintf() function with POSIX compatible formatting.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "xprintf.h"
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "progname.h"
+#include "macros.h"
+
+#include "test-printf-posix.h"
+
+int
+main (int argc _GL_UNUSED, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_function (xprintf);
+ return 0;
+}
diff --git a/gnulib/tests/test-xprintf-posix.sh b/gnulib/tests/test-xprintf-posix.sh
new file mode 100755
index 00000000..0087a9d4
--- /dev/null
+++ b/gnulib/tests/test-xprintf-posix.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles t-xprintf-posix.tmp t-xprintf-posix.out"
+./test-xprintf-posix${EXEEXT} > t-xprintf-posix.tmp || exit 1
+LC_ALL=C tr -d '\r' < t-xprintf-posix.tmp > t-xprintf-posix.out || exit 1
+
+: ${DIFF=diff}
+${DIFF} "${srcdir}/test-printf-posix.output" t-xprintf-posix.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles t-xfprintf-posix.tmp t-xfprintf-posix.out"
+./test-xfprintf-posix${EXEEXT} > t-xfprintf-posix.tmp || exit 1
+LC_ALL=C tr -d '\r' < t-xfprintf-posix.tmp > t-xfprintf-posix.out || exit 1
+
+: ${DIFF=diff}
+${DIFF} "${srcdir}/test-printf-posix.output" t-xfprintf-posix.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-xstrtoimax.c b/gnulib/tests/test-xstrtoimax.c
new file mode 100644
index 00000000..cc2f6ae8
--- /dev/null
+++ b/gnulib/tests/test-xstrtoimax.c
@@ -0,0 +1,4 @@
+#define __xstrtol xstrtoimax
+#define __strtol_t intmax_t
+#define __spec PRIdMAX
+#include "test-xstrtol.c"
diff --git a/gnulib/tests/test-xstrtoimax.sh b/gnulib/tests/test-xstrtoimax.sh
new file mode 100755
index 00000000..e6a5e5dd
--- /dev/null
+++ b/gnulib/tests/test-xstrtoimax.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="t-xstrtoimax.tmp t-xstrtoimax.xo"
+: > t-xstrtoimax.tmp
+too_big=99999999999999999999999999999999999999999999999999999999999999999999
+result=0
+
+# test xstrtoimax
+./test-xstrtoimax${EXEEXT} 1 >> t-xstrtoimax.tmp 2>&1 || result=1
+./test-xstrtoimax${EXEEXT} -1 >> t-xstrtoimax.tmp 2>&1 || result=1
+./test-xstrtoimax${EXEEXT} 1k >> t-xstrtoimax.tmp 2>&1 || result=1
+./test-xstrtoimax${EXEEXT} ${too_big}h >> t-xstrtoimax.tmp 2>&1 && result=1
+./test-xstrtoimax${EXEEXT} $too_big >> t-xstrtoimax.tmp 2>&1 && result=1
+./test-xstrtoimax${EXEEXT} x >> t-xstrtoimax.tmp 2>&1 && result=1
+./test-xstrtoimax${EXEEXT} 9x >> t-xstrtoimax.tmp 2>&1 && result=1
+./test-xstrtoimax${EXEEXT} 010 >> t-xstrtoimax.tmp 2>&1 || result=1
+./test-xstrtoimax${EXEEXT} MiB >> t-xstrtoimax.tmp 2>&1 || result=1
+
+# Find out how to remove carriage returns from output. Solaris /usr/ucb/tr
+# does not understand '\r'.
+if echo solaris | tr -d '\r' | grep solais > /dev/null; then
+ cr='\015'
+else
+ cr='\r'
+fi
+
+# normalize output
+LC_ALL=C tr -d "$cr" < t-xstrtoimax.tmp > t-xstrtoimax.xo
+mv t-xstrtoimax.xo t-xstrtoimax.tmp
+
+# compare expected output
+cat > t-xstrtoimax.xo <<EOF
+1->1 ()
+-1->-1 ()
+1k->1024 ()
+invalid suffix in X argument \`${too_big}h'
+X argument \`$too_big' too large
+invalid X argument \`x'
+invalid suffix in X argument \`9x'
+010->8 ()
+MiB->1048576 ()
+EOF
+
+diff t-xstrtoimax.xo t-xstrtoimax.tmp || result=1
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-xstrtol.c b/gnulib/tests/test-xstrtol.c
new file mode 100644
index 00000000..ed0ac220
--- /dev/null
+++ b/gnulib/tests/test-xstrtol.c
@@ -0,0 +1,66 @@
+/* Test of xstrtol module.
+ Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010 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/>. */
+
+#include <config.h>
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "xstrtol.h"
+#include "error.h"
+
+#ifndef __xstrtol
+# define __xstrtol xstrtol
+# define __strtol_t long int
+# define __spec "ld"
+#endif
+
+char *program_name;
+
+/* Don't show the program name in error messages. */
+static void
+print_no_progname (void)
+{
+}
+
+int
+main (int argc, char **argv)
+{
+ strtol_error s_err;
+ int i;
+
+ program_name = argv[0];
+ error_print_progname = print_no_progname;
+
+ for (i = 1; i < argc; i++)
+ {
+ char *p;
+ __strtol_t val;
+
+ s_err = __xstrtol (argv[i], &p, 0, &val, "bckMw0");
+ if (s_err == LONGINT_OK)
+ {
+ printf ("%s->%" __spec " (%s)\n", argv[i], val, p);
+ }
+ else
+ {
+ xstrtol_fatal (s_err, -2, 'X', NULL, argv[i]);
+ }
+ }
+ exit (0);
+}
diff --git a/gnulib/tests/test-xstrtol.sh b/gnulib/tests/test-xstrtol.sh
new file mode 100755
index 00000000..c56c6750
--- /dev/null
+++ b/gnulib/tests/test-xstrtol.sh
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="t-xstrtol.tmp t-xstrtol.xo"
+: > t-xstrtol.tmp
+too_big=99999999999999999999999999999999999999999999999999999999999999999999
+result=0
+
+# test xstrtol
+./test-xstrtol${EXEEXT} 1 >> t-xstrtol.tmp 2>&1 || result=1
+./test-xstrtol${EXEEXT} -1 >> t-xstrtol.tmp 2>&1 || result=1
+./test-xstrtol${EXEEXT} 1k >> t-xstrtol.tmp 2>&1 || result=1
+./test-xstrtol${EXEEXT} ${too_big}h >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtol${EXEEXT} $too_big >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtol${EXEEXT} x >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtol${EXEEXT} 9x >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtol${EXEEXT} 010 >> t-xstrtol.tmp 2>&1 || result=1
+# suffix without integer is valid
+./test-xstrtol${EXEEXT} MiB >> t-xstrtol.tmp 2>&1 || result=1
+
+# test xstrtoul
+./test-xstrtoul${EXEEXT} 1 >> t-xstrtol.tmp 2>&1 || result=1
+./test-xstrtoul${EXEEXT} -1 >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtoul${EXEEXT} 1k >> t-xstrtol.tmp 2>&1 || result=1
+./test-xstrtoul${EXEEXT} ${too_big}h >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtoul${EXEEXT} $too_big >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtoul${EXEEXT} x >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtoul${EXEEXT} 9x >> t-xstrtol.tmp 2>&1 && result=1
+./test-xstrtoul${EXEEXT} 010 >> t-xstrtol.tmp 2>&1 || result=1
+./test-xstrtoul${EXEEXT} MiB >> t-xstrtol.tmp 2>&1 || result=1
+
+# Find out how to remove carriage returns from output. Solaris /usr/ucb/tr
+# does not understand '\r'.
+if echo solaris | tr -d '\r' | grep solais > /dev/null; then
+ cr='\015'
+else
+ cr='\r'
+fi
+
+# normalize output
+LC_ALL=C tr -d "$cr" < t-xstrtol.tmp > t-xstrtol.xo
+mv t-xstrtol.xo t-xstrtol.tmp
+
+# compare expected output
+cat > t-xstrtol.xo <<EOF
+1->1 ()
+-1->-1 ()
+1k->1024 ()
+invalid suffix in X argument \`${too_big}h'
+X argument \`$too_big' too large
+invalid X argument \`x'
+invalid suffix in X argument \`9x'
+010->8 ()
+MiB->1048576 ()
+1->1 ()
+invalid X argument \`-1'
+1k->1024 ()
+invalid suffix in X argument \`${too_big}h'
+X argument \`$too_big' too large
+invalid X argument \`x'
+invalid suffix in X argument \`9x'
+010->8 ()
+MiB->1048576 ()
+EOF
+
+diff t-xstrtol.xo t-xstrtol.tmp || result=1
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-xstrtoll.c b/gnulib/tests/test-xstrtoll.c
new file mode 100644
index 00000000..03dd232a
--- /dev/null
+++ b/gnulib/tests/test-xstrtoll.c
@@ -0,0 +1,4 @@
+#define __xstrtol xstrtoll
+#define __strtol_t long long int
+#define __spec PRId64
+#include "test-xstrtol.c"
diff --git a/gnulib/tests/test-xstrtoll.sh b/gnulib/tests/test-xstrtoll.sh
new file mode 100755
index 00000000..78a08c8f
--- /dev/null
+++ b/gnulib/tests/test-xstrtoll.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+: ${srcdir=.}
+. "$srcdir/init.sh"; path_prepend_ .
+
+too_big=99999999999999999999999999999999999999999999999999999999999999999999
+result=0
+
+# test xstrtoll
+test-xstrtoll 1 >> out 2>&1 || result=1
+test-xstrtoll -1 >> out 2>&1 || result=1
+test-xstrtoll 1k >> out 2>&1 || result=1
+test-xstrtoll ${too_big}h >> out 2>&1 && result=1
+test-xstrtoll $too_big >> out 2>&1 && result=1
+test-xstrtoll x >> out 2>&1 && result=1
+test-xstrtoll 9x >> out 2>&1 && result=1
+test-xstrtoll 010 >> out 2>&1 || result=1
+# suffix without integer is valid
+test-xstrtoll MiB >> out 2>&1 || result=1
+
+# test xstrtoull
+test-xstrtoull 1 >> out 2>&1 || result=1
+test-xstrtoull -1 >> out 2>&1 && result=1
+test-xstrtoull 1k >> out 2>&1 || result=1
+test-xstrtoull ${too_big}h >> out 2>&1 && result=1
+test-xstrtoull $too_big >> out 2>&1 && result=1
+test-xstrtoull x >> out 2>&1 && result=1
+test-xstrtoull 9x >> out 2>&1 && result=1
+test-xstrtoull 010 >> out 2>&1 || result=1
+test-xstrtoull MiB >> out 2>&1 || result=1
+
+# Find out how to remove carriage returns from output. Solaris /usr/ucb/tr
+# does not understand '\r'.
+if echo solaris | tr -d '\r' | grep solais > /dev/null; then
+ cr='\015'
+else
+ cr='\r'
+fi
+
+# normalize output
+LC_ALL=C tr -d "$cr" < out > k
+mv k out
+
+# compare expected output
+cat > expected <<EOF
+1->1 ()
+-1->-1 ()
+1k->1024 ()
+invalid suffix in X argument \`${too_big}h'
+X argument \`$too_big' too large
+invalid X argument \`x'
+invalid suffix in X argument \`9x'
+010->8 ()
+MiB->1048576 ()
+1->1 ()
+invalid X argument \`-1'
+1k->1024 ()
+invalid suffix in X argument \`${too_big}h'
+X argument \`$too_big' too large
+invalid X argument \`x'
+invalid suffix in X argument \`9x'
+010->8 ()
+MiB->1048576 ()
+EOF
+
+compare expected out || result=1
+
+Exit $result
diff --git a/gnulib/tests/test-xstrtoul.c b/gnulib/tests/test-xstrtoul.c
new file mode 100644
index 00000000..9dda9ee6
--- /dev/null
+++ b/gnulib/tests/test-xstrtoul.c
@@ -0,0 +1,4 @@
+#define __xstrtol xstrtoul
+#define __strtol_t unsigned long int
+#define __spec "lu"
+#include "test-xstrtol.c"
diff --git a/gnulib/tests/test-xstrtoull.c b/gnulib/tests/test-xstrtoull.c
new file mode 100644
index 00000000..cb3a91cf
--- /dev/null
+++ b/gnulib/tests/test-xstrtoull.c
@@ -0,0 +1,4 @@
+#define __xstrtol xstrtoull
+#define __strtol_t unsigned long long int
+#define __spec PRIu64
+#include "test-xstrtol.c"
diff --git a/gnulib/tests/test-xstrtoumax.c b/gnulib/tests/test-xstrtoumax.c
new file mode 100644
index 00000000..2e68c2e5
--- /dev/null
+++ b/gnulib/tests/test-xstrtoumax.c
@@ -0,0 +1,4 @@
+#define __xstrtol xstrtoumax
+#define __strtol_t uintmax_t
+#define __spec PRIuMAX
+#include "test-xstrtol.c"
diff --git a/gnulib/tests/test-xstrtoumax.sh b/gnulib/tests/test-xstrtoumax.sh
new file mode 100755
index 00000000..12a7ba9f
--- /dev/null
+++ b/gnulib/tests/test-xstrtoumax.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="t-xstrtoumax.tmp t-xstrtoumax.xo"
+: > t-xstrtoumax.tmp
+too_big=99999999999999999999999999999999999999999999999999999999999999999999
+result=0
+
+# test xstrtoumax
+./test-xstrtoumax${EXEEXT} 1 >> t-xstrtoumax.tmp 2>&1 || result=1
+./test-xstrtoumax${EXEEXT} -1 >> t-xstrtoumax.tmp 2>&1 && result=1
+./test-xstrtoumax${EXEEXT} 1k >> t-xstrtoumax.tmp 2>&1 || result=1
+./test-xstrtoumax${EXEEXT} ${too_big}h >> t-xstrtoumax.tmp 2>&1 && result=1
+./test-xstrtoumax${EXEEXT} $too_big >> t-xstrtoumax.tmp 2>&1 && result=1
+./test-xstrtoumax${EXEEXT} x >> t-xstrtoumax.tmp 2>&1 && result=1
+./test-xstrtoumax${EXEEXT} 9x >> t-xstrtoumax.tmp 2>&1 && result=1
+./test-xstrtoumax${EXEEXT} 010 >> t-xstrtoumax.tmp 2>&1 || result=1
+./test-xstrtoumax${EXEEXT} MiB >> t-xstrtoumax.tmp 2>&1 || result=1
+
+# Find out how to remove carriage returns from output. Solaris /usr/ucb/tr
+# does not understand '\r'.
+if echo solaris | tr -d '\r' | grep solais > /dev/null; then
+ cr='\015'
+else
+ cr='\r'
+fi
+
+# normalize output
+LC_ALL=C tr -d "$cr" < t-xstrtoumax.tmp > t-xstrtoumax.xo
+mv t-xstrtoumax.xo t-xstrtoumax.tmp
+
+# compare expected output
+cat > t-xstrtoumax.xo <<EOF
+1->1 ()
+invalid X argument \`-1'
+1k->1024 ()
+invalid suffix in X argument \`${too_big}h'
+X argument \`$too_big' too large
+invalid X argument \`x'
+invalid suffix in X argument \`9x'
+010->8 ()
+MiB->1048576 ()
+EOF
+
+diff t-xstrtoumax.xo t-xstrtoumax.tmp || result=1
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/test-xvasprintf.c b/gnulib/tests/test-xvasprintf.c
new file mode 100644
index 00000000..df6c2009
--- /dev/null
+++ b/gnulib/tests/test-xvasprintf.c
@@ -0,0 +1,129 @@
+/* Test of xvasprintf() and xasprintf() functions.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "xvasprintf.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "progname.h"
+#include "macros.h"
+
+static char *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ char *ret;
+
+ va_start (args, format);
+ ret = xvasprintf (format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_xvasprintf (void)
+{
+ int repeat;
+ char *result;
+
+ for (repeat = 0; repeat <= 8; repeat++)
+ {
+ result = my_xasprintf ("%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ free (result);
+ }
+
+ {
+ /* Silence gcc warning about zero-length format string. */
+ char *empty = "";
+ result = my_xasprintf (empty);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+
+ result = my_xasprintf ("%s", "foo");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "foo") == 0);
+ free (result);
+
+ result = my_xasprintf ("%s%s", "foo", "bar");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "foobar") == 0);
+ free (result);
+
+ result = my_xasprintf ("%s%sbaz", "foo", "bar");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "foobarbaz") == 0);
+ free (result);
+}
+
+static void
+test_xasprintf ()
+{
+ int repeat;
+ char *result;
+
+ for (repeat = 0; repeat <= 8; repeat++)
+ {
+ result = xasprintf ("%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ free (result);
+ }
+
+ {
+ /* Silence gcc warning about zero-length format string. */
+ char *empty = "";
+ result = xasprintf (empty);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+
+ result = xasprintf ("%s", "foo");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "foo") == 0);
+ free (result);
+
+ result = xasprintf ("%s%s", "foo", "bar");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "foobar") == 0);
+ free (result);
+
+ result = my_xasprintf ("%s%sbaz", "foo", "bar");
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "foobarbaz") == 0);
+ free (result);
+}
+
+int
+main (int argc _GL_UNUSED, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_xvasprintf ();
+ test_xasprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/test-y0.c b/gnulib/tests/test-y0.c
new file mode 100644
index 00000000..c8055fb5
--- /dev/null
+++ b/gnulib/tests/test-y0.c
@@ -0,0 +1,40 @@
+/* Test of y0() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (y0, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 3.8;
+ y = y0 (x);
+ ASSERT (y >= 0.0645032466 && y <= 0.0645032467);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-y1.c b/gnulib/tests/test-y1.c
new file mode 100644
index 00000000..aaf3de91
--- /dev/null
+++ b/gnulib/tests/test-y1.c
@@ -0,0 +1,40 @@
+/* Test of y1() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (y1, double, (double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 3.8;
+ y = y1 (x);
+ ASSERT (y >= 0.4141146893 && y <= 0.4141146894);
+
+ return 0;
+}
diff --git a/gnulib/tests/test-yesno.c b/gnulib/tests/test-yesno.c
new file mode 100644
index 00000000..af91f9cc
--- /dev/null
+++ b/gnulib/tests/test-yesno.c
@@ -0,0 +1,65 @@
+/* Test of yesno module.
+ Copyright (C) 2007-2010 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, 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/>.
+*/
+
+#include <config.h>
+
+/* Specification. */
+#include "yesno.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "closein.h"
+#include "binary-io.h"
+
+char *program_name;
+
+/* Test yesno. Without arguments, read one line. If first argument
+ is zero, close stdin before attempting to read one line.
+ Otherwise, read the number of lines specified by first
+ argument. */
+int
+main (int argc, char **argv)
+{
+ int i = 1;
+ program_name = argv[0];
+
+ /* yesno recommends that all clients use close_stdin in main. */
+ atexit (close_stdin);
+ /* But on mingw, close_stdin leaves stdin's file descriptor at the expected
+ position (i.e. where this program left off reading) only if its mode has
+ been set to O_BINARY. If it has been set to O_TEXT, and the file
+ descriptor is seekable, and stdin is buffered, the MSVCRT runtime ends up
+ setting the file descriptor's position to the expected position _minus_
+ the number of LFs not preceded by CR that were read between the expected
+ position and the last filled buffer end position. (I.e. the repositioning
+ from the end-of-buffer to the expected position does not work if the input
+ file contains end-of-line markers in Unix convention.) */
+ SET_BINARY (0);
+
+ if (1 < argc)
+ i = atoi (argv[1]);
+ if (!i)
+ {
+ i = 1;
+ close (0);
+ }
+ while (i--)
+ puts (yesno () ? "Y" : "N");
+ return 0;
+}
diff --git a/gnulib/tests/test-yesno.sh b/gnulib/tests/test-yesno.sh
new file mode 100755
index 00000000..b1a5b65b
--- /dev/null
+++ b/gnulib/tests/test-yesno.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+tmpfiles=
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+p=t-yesno-
+tmpfiles="${p}in.tmp ${p}xout.tmp ${p}out1.tmp ${p}out.tmp ${p}err.tmp"
+
+# For now, only test with C locale
+LC_ALL=C
+export LC_ALL
+
+# Find out how to remove carriage returns from output. Solaris /usr/ucb/tr
+# does not understand '\r'.
+if echo solaris | tr -d '\r' | grep solais > /dev/null; then
+ cr='\015'
+else
+ cr='\r'
+fi
+
+# Test with seekable stdin; the followon process must see remaining data.
+tr @ '\177' <<EOF > ${p}in.tmp
+nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn - entire line consumed
+y@n - backspace does not change result
+y
+does not match either yesexpr or noexpr
+n
+EOF
+
+cat <<EOF > ${p}xout.tmp
+N
+Y
+Y
+N
+n
+EOF
+
+(./test-yesno${EXEEXT}; ./test-yesno${EXEEXT} 3; cat) \
+ < ${p}in.tmp > ${p}out1.tmp || exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+(./test-yesno${EXEEXT} 3; ./test-yesno${EXEEXT}; cat) \
+ < ${p}in.tmp > ${p}out1.tmp || exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Test for behavior on pipe
+cat <<EOF > ${p}xout.tmp
+Y
+N
+EOF
+echo yes | ./test-yesno${EXEEXT} 2 > ${p}out1.tmp || exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Test for behavior on EOF
+cat <<EOF > ${p}xout.tmp
+N
+EOF
+./test-yesno${EXEEXT} </dev/null > ${p}out1.tmp || exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Test for behavior when stdin is closed
+./test-yesno${EXEEXT} 0 <&- > ${p}out1.tmp 2> ${p}err.tmp && exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+test -s ${p}err.tmp || exit 1
+
+# Cleanup
+rm -fr $tmpfiles
+
+exit 0
diff --git a/gnulib/tests/test-yn.c b/gnulib/tests/test-yn.c
new file mode 100644
index 00000000..0058a9bf
--- /dev/null
+++ b/gnulib/tests/test-yn.c
@@ -0,0 +1,90 @@
+/* Test of yn() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (yn, double, (int, double));
+
+#include "macros.h"
+
+volatile double x;
+double y;
+
+int
+main ()
+{
+ /* A particular value. */
+ x = 3.8;
+ y = yn (0, x);
+ ASSERT (y >= 0.0645032466 && y <= 0.0645032467);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (1, x);
+ ASSERT (y >= 0.4141146893 && y <= 0.4141146894);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (2, x);
+ ASSERT (y >= 0.1534518529 && y <= 0.1534518530);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (3, x);
+ ASSERT (y >= -0.2525864231 && y <= -0.2525864230);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (4, x);
+ ASSERT (y >= -0.5522725209 && y <= -0.5522725208);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (5, x);
+ ASSERT (y >= -0.9100925684 && y <= -0.9100925683);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (6, x);
+ ASSERT (y >= -1.842707923 && y <= -1.842707922);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (7, x);
+ ASSERT (y >= -4.908985081 && y <= -4.908985080);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (8, x);
+ ASSERT (y >= -16.24302659 && y <= -16.24302658);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (9, x);
+ ASSERT (y >= -63.48270581 && y <= -63.48270580);
+
+ /* A particular value. */
+ x = 3.8;
+ y = yn (10, x);
+ ASSERT (y >= -284.4645273 && y <= -284.4645272);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-casecmp.h b/gnulib/tests/unicase/test-casecmp.h
new file mode 100644
index 00000000..eb061132
--- /dev/null
+++ b/gnulib/tests/unicase/test-casecmp.h
@@ -0,0 +1,69 @@
+/* Test of case and normalization insensitive comparison of Unicode strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_casecmp) (const UNIT *, size_t, const UNIT *, size_t, const char *, uninorm_t, int *),
+ uninorm_t nf)
+{
+ /* Empty string. */
+ {
+ int cmp;
+
+ ASSERT (my_casecmp (NULL, 0, NULL, 0, NULL, nf, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ {
+ static const UNIT input[] = { 'x', 'y' };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), NULL, 0, NULL, nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+
+ ASSERT (my_casecmp (NULL, 0, input, SIZEOF (input), NULL, nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), input, SIZEOF (input), NULL, nf, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Normal lexicographic order. */
+ {
+ static const UNIT input1[] = { 'A', 'm', 'e', 'r', 'i', 'c', 'a' };
+ static const UNIT input2[] = { 'A', 'm', 'i', 'g', 'o' };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1), NULL, nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+ }
+
+ /* Shorter and longer strings. */
+ {
+ static const UNIT input1[] = { 'R', 'e', 'a', 'g', 'a', 'n' };
+ static const UNIT input2[] = { 'R', 'e', 'a', 'g', 'a', 'n', 'o', 'm', 'i', 'c', 's' };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1), NULL, nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+ }
+}
diff --git a/gnulib/tests/unicase/test-cased.c b/gnulib/tests/unicase/test-cased.c
new file mode 100644
index 00000000..d9cc4329
--- /dev/null
+++ b/gnulib/tests/unicase/test-cased.c
@@ -0,0 +1,135 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x01BA },
+ { 0x01BC, 0x01BF },
+ { 0x01C4, 0x0293 },
+ { 0x0295, 0x02B8 },
+ { 0x02C0, 0x02C1 },
+ { 0x02E0, 0x02E4 },
+ { 0x0345, 0x0345 },
+ { 0x0370, 0x0373 },
+ { 0x0376, 0x0377 },
+ { 0x037A, 0x037D },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0561, 0x0587 },
+ { 0x10A0, 0x10C5 },
+ { 0x1D00, 0x1DBF },
+ { 0x1E00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x212D },
+ { 0x212F, 0x2134 },
+ { 0x2139, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2160, 0x217F },
+ { 0x2183, 0x2184 },
+ { 0x24B6, 0x24E9 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66D },
+ { 0xA680, 0xA697 },
+ { 0xA722, 0xA787 },
+ { 0xA78B, 0xA78C },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFF21, 0xFF3A },
+ { 0xFF41, 0xFF5A },
+ { 0x10400, 0x1044F },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB }
+
+#define PREDICATE(c) uc_is_cased (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unicase/test-ignorable.c b/gnulib/tests/unicase/test-ignorable.c
new file mode 100644
index 00000000..90f7b8ea
--- /dev/null
+++ b/gnulib/tests/unicase/test-ignorable.c
@@ -0,0 +1,246 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0027, 0x0027 },
+ { 0x002E, 0x002E },
+ { 0x003A, 0x003A },
+ { 0x005E, 0x005E },
+ { 0x0060, 0x0060 },
+ { 0x00A8, 0x00A8 },
+ { 0x00AD, 0x00AD },
+ { 0x00AF, 0x00AF },
+ { 0x00B4, 0x00B4 },
+ { 0x00B7, 0x00B8 },
+ { 0x02B9, 0x02BF },
+ { 0x02C2, 0x02DF },
+ { 0x02E5, 0x0344 },
+ { 0x0346, 0x036F },
+ { 0x0374, 0x0375 },
+ { 0x0384, 0x0385 },
+ { 0x0387, 0x0387 },
+ { 0x0483, 0x0489 },
+ { 0x0559, 0x0559 },
+ { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x05F4, 0x05F4 },
+ { 0x0600, 0x0603 },
+ { 0x0610, 0x061A },
+ { 0x0640, 0x0640 },
+ { 0x064B, 0x065E },
+ { 0x0670, 0x0670 },
+ { 0x06D6, 0x06E8 },
+ { 0x06EA, 0x06ED },
+ { 0x070F, 0x070F },
+ { 0x0711, 0x0711 },
+ { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 },
+ { 0x07EB, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0901, 0x0902 },
+ { 0x093C, 0x093C },
+ { 0x0941, 0x0948 },
+ { 0x094D, 0x094D },
+ { 0x0951, 0x0954 },
+ { 0x0962, 0x0963 },
+ { 0x0971, 0x0971 },
+ { 0x0981, 0x0981 },
+ { 0x09BC, 0x09BC },
+ { 0x09C1, 0x09C4 },
+ { 0x09CD, 0x09CD },
+ { 0x09E2, 0x09E3 },
+ { 0x0A01, 0x0A02 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A41, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 },
+ { 0x0A81, 0x0A82 },
+ { 0x0ABC, 0x0ABC },
+ { 0x0AC1, 0x0AC5 },
+ { 0x0AC7, 0x0AC8 },
+ { 0x0ACD, 0x0ACD },
+ { 0x0AE2, 0x0AE3 },
+ { 0x0B01, 0x0B01 },
+ { 0x0B3C, 0x0B3C },
+ { 0x0B3F, 0x0B3F },
+ { 0x0B41, 0x0B44 },
+ { 0x0B4D, 0x0B4D },
+ { 0x0B56, 0x0B56 },
+ { 0x0B62, 0x0B63 },
+ { 0x0B82, 0x0B82 },
+ { 0x0BC0, 0x0BC0 },
+ { 0x0BCD, 0x0BCD },
+ { 0x0C3E, 0x0C40 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C62, 0x0C63 },
+ { 0x0CBC, 0x0CBC },
+ { 0x0CBF, 0x0CBF },
+ { 0x0CC6, 0x0CC6 },
+ { 0x0CCC, 0x0CCD },
+ { 0x0CE2, 0x0CE3 },
+ { 0x0D41, 0x0D44 },
+ { 0x0D4D, 0x0D4D },
+ { 0x0D62, 0x0D63 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DD2, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0E31, 0x0E31 },
+ { 0x0E34, 0x0E3A },
+ { 0x0E46, 0x0E4E },
+ { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 },
+ { 0x0EBB, 0x0EBC },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0EC8, 0x0ECD },
+ { 0x0F18, 0x0F19 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F71, 0x0F7E },
+ { 0x0F80, 0x0F84 },
+ { 0x0F86, 0x0F87 },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 },
+ { 0x102D, 0x1030 },
+ { 0x1032, 0x1037 },
+ { 0x1039, 0x103A },
+ { 0x103D, 0x103E },
+ { 0x1058, 0x1059 },
+ { 0x105E, 0x1060 },
+ { 0x1071, 0x1074 },
+ { 0x1082, 0x1082 },
+ { 0x1085, 0x1086 },
+ { 0x108D, 0x108D },
+ { 0x10FC, 0x10FC },
+ { 0x135F, 0x135F },
+ { 0x1712, 0x1714 },
+ { 0x1732, 0x1734 },
+ { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 },
+ { 0x17B4, 0x17B5 },
+ { 0x17B7, 0x17BD },
+ { 0x17C6, 0x17C6 },
+ { 0x17C9, 0x17D3 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DD, 0x17DD },
+ { 0x180B, 0x180D },
+ { 0x1843, 0x1843 },
+ { 0x18A9, 0x18A9 },
+ { 0x1920, 0x1922 },
+ { 0x1927, 0x1928 },
+ { 0x1932, 0x1932 },
+ { 0x1939, 0x193B },
+ { 0x1A17, 0x1A18 },
+ { 0x1B00, 0x1B03 },
+ { 0x1B34, 0x1B34 },
+ { 0x1B36, 0x1B3A },
+ { 0x1B3C, 0x1B3C },
+ { 0x1B42, 0x1B42 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1B80, 0x1B81 },
+ { 0x1BA2, 0x1BA5 },
+ { 0x1BA8, 0x1BA9 },
+ { 0x1C2C, 0x1C33 },
+ { 0x1C36, 0x1C37 },
+ { 0x1C78, 0x1C7D },
+ { 0x1DC0, 0x1DE6 },
+ { 0x1DFE, 0x1DFF },
+ { 0x1FBD, 0x1FBD },
+ { 0x1FBF, 0x1FC1 },
+ { 0x1FCD, 0x1FCF },
+ { 0x1FDD, 0x1FDF },
+ { 0x1FED, 0x1FEF },
+ { 0x1FFD, 0x1FFE },
+ { 0x200B, 0x200F },
+ { 0x2018, 0x2019 },
+ { 0x2024, 0x2024 },
+ { 0x2027, 0x2027 },
+ { 0x202A, 0x202E },
+ { 0x2060, 0x2064 },
+ { 0x206A, 0x206F },
+ { 0x20D0, 0x20F0 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2DE0, 0x2DFF },
+ { 0x2E2F, 0x2E2F },
+ { 0x3005, 0x3005 },
+ { 0x302A, 0x302F },
+ { 0x3031, 0x3035 },
+ { 0x303B, 0x303B },
+ { 0x3099, 0x309E },
+ { 0x30FC, 0x30FE },
+ { 0xA015, 0xA015 },
+ { 0xA60C, 0xA60C },
+ { 0xA66F, 0xA672 },
+ { 0xA67C, 0xA67D },
+ { 0xA67F, 0xA67F },
+ { 0xA700, 0xA721 },
+ { 0xA788, 0xA78A },
+ { 0xA802, 0xA802 },
+ { 0xA806, 0xA806 },
+ { 0xA80B, 0xA80B },
+ { 0xA825, 0xA826 },
+ { 0xA8C4, 0xA8C4 },
+ { 0xA926, 0xA92D },
+ { 0xA947, 0xA951 },
+ { 0xAA29, 0xAA2E },
+ { 0xAA31, 0xAA32 },
+ { 0xAA35, 0xAA36 },
+ { 0xAA43, 0xAA43 },
+ { 0xAA4C, 0xAA4C },
+ { 0xFB1E, 0xFB1E },
+ { 0xFE00, 0xFE0F },
+ { 0xFE13, 0xFE13 },
+ { 0xFE20, 0xFE26 },
+ { 0xFE52, 0xFE52 },
+ { 0xFE55, 0xFE55 },
+ { 0xFEFF, 0xFEFF },
+ { 0xFF07, 0xFF07 },
+ { 0xFF0E, 0xFF0E },
+ { 0xFF1A, 0xFF1A },
+ { 0xFF3E, 0xFF3E },
+ { 0xFF40, 0xFF40 },
+ { 0xFF70, 0xFF70 },
+ { 0xFF9E, 0xFF9F },
+ { 0xFFE3, 0xFFE3 },
+ { 0xFFF9, 0xFFFB },
+ { 0x101FD, 0x101FD },
+ { 0x10A01, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A3F },
+ { 0x1D167, 0x1D169 },
+ { 0x1D173, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_case_ignorable (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unicase/test-is-cased.h b/gnulib/tests/unicase/test-is-cased.h
new file mode 100644
index 00000000..a00b8b82
--- /dev/null
+++ b/gnulib/tests/unicase/test-is-cased.h
@@ -0,0 +1,58 @@
+/* Test of test whether case matters for a Unicode string.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_is) (const UNIT *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.0, chapter 3. */
+ {
+ static const UNIT input[] = { 'A', 'B', 'C' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'a', 'b', 'c' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'a', 'B', 'c' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'a', 'B', 'c', '1', '2', '3' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { '1', '2', '3' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+}
diff --git a/gnulib/tests/unicase/test-is-casefolded.h b/gnulib/tests/unicase/test-is-casefolded.h
new file mode 100644
index 00000000..9a1f3d8a
--- /dev/null
+++ b/gnulib/tests/unicase/test-is-casefolded.h
@@ -0,0 +1,43 @@
+/* Test of test whether a Unicode string is already case-folded.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_is) (const UNIT *, size_t, const char *, bool *))
+{
+ {
+ static const UNIT input[] = { 'J', 'O', 'H', 'N', ' ', 'S', 'M', 'I', 'T', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'J', 'o', 'h', 'n', ' ', 'S', 'm', 'i', 't', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'j', 'o', 'h', 'n', ' ', 's', 'm', 'i', 't', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+}
diff --git a/gnulib/tests/unicase/test-is-lowercase.h b/gnulib/tests/unicase/test-is-lowercase.h
new file mode 100644
index 00000000..b780fcd4
--- /dev/null
+++ b/gnulib/tests/unicase/test-is-lowercase.h
@@ -0,0 +1,95 @@
+/* Test of test whether a Unicode string is entirely lower case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_is) (const UNIT *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.0, chapter 3. */
+ {
+ static const UNIT input[] = { 'a' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'J', 'O', 'H', 'N', ' ', 'S', 'M', 'I', 'T', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'J', 'o', 'h', 'n', ' ', 'S', 'm', 'i', 't', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'j', 'o', 'h', 'n', ' ', 's', 'm', 'i', 't', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'a', '2' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { '3' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const UNIT input[] = { 'H', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'h', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'H', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'h', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+}
diff --git a/gnulib/tests/unicase/test-is-titlecase.h b/gnulib/tests/unicase/test-is-titlecase.h
new file mode 100644
index 00000000..edfc60b8
--- /dev/null
+++ b/gnulib/tests/unicase/test-is-titlecase.h
@@ -0,0 +1,95 @@
+/* Test of test whether a Unicode string is entirely title case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_is) (const UNIT *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.0, chapter 3. */
+ {
+ static const UNIT input[] = { 'A' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'J', 'O', 'H', 'N', ' ', 'S', 'M', 'I', 'T', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'J', 'o', 'h', 'n', ' ', 'S', 'm', 'i', 't', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'j', 'o', 'h', 'n', ' ', 's', 'm', 'i', 't', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'A', '2' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { '3' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const UNIT input[] = { 'H', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'h', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'H', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'h', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+}
diff --git a/gnulib/tests/unicase/test-is-uppercase.h b/gnulib/tests/unicase/test-is-uppercase.h
new file mode 100644
index 00000000..6134d9df
--- /dev/null
+++ b/gnulib/tests/unicase/test-is-uppercase.h
@@ -0,0 +1,95 @@
+/* Test of test whether a Unicode string is entirely upper case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_is) (const UNIT *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.0, chapter 3. */
+ {
+ static const UNIT input[] = { 'A' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'J', 'O', 'H', 'N', ' ', 'S', 'M', 'I', 'T', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'J', 'o', 'h', 'n', ' ', 'S', 'm', 'i', 't', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'j', 'o', 'h', 'n', ' ', 's', 'm', 'i', 't', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'A', '2' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { '3' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const UNIT input[] = { 'H', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const UNIT input[] = { 'h', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'H', 'h' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const UNIT input[] = { 'h', 'H' };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+}
diff --git a/gnulib/tests/unicase/test-locale-language.c b/gnulib/tests/unicase/test-locale-language.c
new file mode 100644
index 00000000..4a62261b
--- /dev/null
+++ b/gnulib/tests/unicase/test-locale-language.c
@@ -0,0 +1,44 @@
+/* Test of language code determination.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <locale.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+ const char *expected;
+ const char *language;
+
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ expected = argv[1];
+
+ language = uc_locale_language ();
+ ASSERT (strcmp (language, expected) == 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-locale-language.sh b/gnulib/tests/unicase/test-locale-language.sh
new file mode 100755
index 00000000..0a04a0da
--- /dev/null
+++ b/gnulib/tests/unicase/test-locale-language.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+LC_ALL=C ./test-locale-language${EXEEXT} '' || exit 1
+
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR_UTF8 != none; then
+ LC_ALL=$LOCALE_FR_UTF8 ./test-locale-language${EXEEXT} fr || exit 1
+fi
+
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 != none; then
+ LC_ALL=$LOCALE_FR_UTF8 ./test-locale-language${EXEEXT} fr || exit 1
+fi
+
+: ${LOCALE_JA=ja_JP}
+if test $LOCALE_JA != none; then
+ LC_ALL=$LOCALE_JA ./test-locale-language${EXEEXT} ja || exit 1
+fi
+
+: ${LOCALE_TR_UTF8=tr_TR.UTF-8}
+if test $LOCALE_TR_UTF8 != none; then
+ LC_ALL=$LOCALE_TR_UTF8 ./test-locale-language${EXEEXT} tr || exit 1
+fi
+
+: ${LOCALE_ZH_CN=zh_CN.GB18030}
+if test $LOCALE_ZH_CN != none; then
+ LC_ALL=$LOCALE_ZH_CN ./test-locale-language${EXEEXT} zh || exit 1
+fi
+
+exit 0
diff --git a/gnulib/tests/unicase/test-mapping-part1.h b/gnulib/tests/unicase/test-mapping-part1.h
new file mode 100644
index 00000000..dbb93db2
--- /dev/null
+++ b/gnulib/tests/unicase/test-mapping-part1.h
@@ -0,0 +1,31 @@
+/* Test of single character case mapping functions.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+/* Pair of Unicode characters. */
+typedef struct { ucs4_t ch; ucs4_t value; } pair_t;
+
+/* Characters and their mapping values, ignoring no-op mappings, in increasing
+ order. */
+static const pair_t mapping[] =
+ {
diff --git a/gnulib/tests/unicase/test-mapping-part2.h b/gnulib/tests/unicase/test-mapping-part2.h
new file mode 100644
index 00000000..15c24c42
--- /dev/null
+++ b/gnulib/tests/unicase/test-mapping-part2.h
@@ -0,0 +1,37 @@
+/* Test of single character case mapping functions.
+ Copyright (C) 2007-2010 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/>. */
+
+ };
+
+int
+main ()
+{
+ unsigned int c;
+ size_t i;
+
+ c = 0;
+ for (i = 0; i < SIZEOF (mapping); i++)
+ {
+ for (; c < mapping[i].ch; c++)
+ ASSERT (MAP (c) == c);
+ ASSERT (MAP (c) == mapping[i].value);
+ c++;
+ }
+ for (; c < 0x110000; c++)
+ ASSERT (MAP (c) == c);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-predicate-part1.h b/gnulib/tests/unicase/test-predicate-part1.h
new file mode 100644
index 00000000..8aca7a8e
--- /dev/null
+++ b/gnulib/tests/unicase/test-predicate-part1.h
@@ -0,0 +1,31 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include "unicase/caseprop.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+/* Interval of Unicode characters. */
+typedef struct { ucs4_t start; ucs4_t end; } interval_t;
+
+/* Set of Unicode characters, described as list of intervals, in increasing
+ order. */
+static const interval_t set[] =
+ {
diff --git a/gnulib/tests/unicase/test-predicate-part2.h b/gnulib/tests/unicase/test-predicate-part2.h
new file mode 100644
index 00000000..ac95ba20
--- /dev/null
+++ b/gnulib/tests/unicase/test-predicate-part2.h
@@ -0,0 +1,37 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+ };
+
+int
+main ()
+{
+ unsigned int c;
+ size_t i;
+
+ c = 0;
+ for (i = 0; i < SIZEOF (set); i++)
+ {
+ for (; c < set[i].start; c++)
+ ASSERT (!PREDICATE (c));
+ for (; c <= set[i].end; c++)
+ ASSERT (PREDICATE (c));
+ }
+ for (; c < 0x110000; c++)
+ ASSERT (!PREDICATE (c));
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-casecmp.c b/gnulib/tests/unicase/test-u16-casecmp.c
new file mode 100644
index 00000000..d70b3565
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-casecmp.c
@@ -0,0 +1,321 @@
+/* Test of case and normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "uninorm.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#include "test-casecmp.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_casecmp) (const uint16_t *, size_t, const uint16_t *, size_t, const char *, uninorm_t, int *))
+{
+ /* Normalization effects. */
+ {
+ static const uint16_t input1[] = { 'H', 0x00F6, 'h', 'l', 'e' };
+ static const uint16_t input2[] = { 'H', 'O', 0x0308, 'h', 'L', 'e' };
+ static const uint16_t input3[] = { 'H', 0x00F6, 'h', 'l', 'e', 'n' };
+ static const uint16_t input4[] = { 'H', 'O', 0x0308, 'h', 'L', 'e', 'n' };
+ static const uint16_t input5[] = { 'H', 'u', 'r', 'z' };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input3, SIZEOF (input3), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input4, SIZEOF (input4), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint16_t input1[] = { 0x00C4 };
+ static const uint16_t input2[] = { 0x0041, 0x0308 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint16_t input1[] = { 0x01DE };
+ static const uint16_t input2[] = { 0x0041, 0x0308, 0x0304 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint16_t input1[] = { 0x1FC1 };
+ static const uint16_t input2[] = { 0x00A8, 0x0342 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint16_t input1[] = { 0xAE00 };
+ static const uint16_t input2[] = { 0xADF8, 0x11AF };
+ static const uint16_t input3[] = { 0x1100, 0x1173, 0x11AF };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEU */
+ static const uint16_t input1[] = { 0xADF8 };
+ static const uint16_t input2[] = { 0x1100, 0x1173 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input1[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t input2[] =
+ { 'g', 'r', 0x00FC, 0x0073, 0x0073, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0x0437, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t input3[] =
+ { 'G', 'R', 0x00DC, 0x0053, 0x0053, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0x0417, 0x0414, 0x0420, 0x0410, 0x0412, 0x0421, 0x0422, 0x0412, 0x0423,
+ 0x0419, 0x0422, 0x0415, '!', ' ',
+ 'X', '=', '(', '-', 'B', 0x00B1, 'S', 'Q', 'R', 'T', '(', 'B', 0x00B2,
+ '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint16_t input1[] = { 0x0149 };
+ static const uint16_t input2[] = { 0x02BC, 0x006E };
+ static const uint16_t input3[] = { 0x02BC, 0x004E };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint16_t input1[] = { 0x0390 };
+ static const uint16_t input2[] = { 0x03B9, 0x0308, 0x0301 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint16_t input[] = { 0x0049 };
+ static const uint16_t casefolded[] = { 0x0069 };
+ static const uint16_t casefolded_tr[] = { 0x0131 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint16_t input[] = { 0x0069 };
+ static const uint16_t casefolded[] = { 0x0049 };
+ static const uint16_t casefolded_tr[] = { 0x0130 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint16_t input[] = { 0x0130 };
+ static const uint16_t casefolded[] = { 0x0069, 0x0307 };
+ static const uint16_t casefolded_tr[] = { 0x0069 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint16_t input[] = { 0x0131 };
+ static const uint16_t casefolded[] = { 0x0049 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* "topkapı" */
+ static const uint16_t input[] =
+ { 0x0054, 0x004F, 0x0050, 0x004B, 0x0041, 0x0050, 0x0049 };
+ static const uint16_t casefolded[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint16_t input1[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ static const uint16_t input2[] = { 0x0068, 0x0065, 0x0069, 0x0073, 0x0073 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint16_t input1[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ static const uint16_t input2[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C3, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C3
+ };
+ static const uint16_t input3[] =
+ {
+ 0x03A0, 0x0395, 0x03A1, 0x0399, 0x03A3, 0x03A3, 0x038C, 0x03A4,
+ 0x0395, 0x03A1, 0x0395, 0x03A3, 0x0020, 0x03A0, 0x039B, 0x0397,
+ 0x03A1, 0x039F, 0x03A6, 0x039F, 0x03A1, 0x038A, 0x0395, 0x03A3
+ };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint16_t input[] = { 0x01F0, 0x0323 };
+ static const uint16_t casefolded[] = { 0x006A, 0x030C, 0x0323 };
+ static const uint16_t casefolded_decomposed[] = { 0x006A, 0x0323, 0x030C };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp != 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u16_casecmp, UNINORM_NFD);
+ test_nonascii (u16_casecmp);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-casecoll.c b/gnulib/tests/unicase/test-u16-casecoll.c
new file mode 100644
index 00000000..253aadcb
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-casecoll.c
@@ -0,0 +1,39 @@
+/* Test of locale dependent, case and normalization insensitive comparison of
+ UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "uninorm.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#include "test-casecmp.h"
+#undef UNIT
+
+int
+main ()
+{
+ /* In the "C" locale, strcoll is equivalent to strcmp, therefore u8_casecoll
+ on ASCII strings should behave like strcasecmp. */
+ test_ascii (u16_casecoll, UNINORM_NFC);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-casefold.c b/gnulib/tests/unicase/test-u16-casefold.c
new file mode 100644
index 00000000..1c188e4e
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-casefold.c
@@ -0,0 +1,201 @@
+/* Test of casefolding mapping for UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_casefold (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_casefold (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_casefold (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t casefolded[] =
+ { 'g', 'r', 0x00FC, 0x0073, 0x0073, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0x0437, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint16_t input[] = { 0x0149 };
+ static const uint16_t casefolded[] = { 0x02BC, 0x006E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint16_t input[] = { 0x0390 };
+ static const uint16_t casefolded[] = { 0x03B9, 0x0308, 0x0301 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint16_t input[] = { 0x0049 };
+ static const uint16_t casefolded[] = { 0x0069 };
+ static const uint16_t casefolded_tr[] = { 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint16_t input[] = { 0x0069 };
+ static const uint16_t casefolded[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint16_t input[] = { 0x0130 };
+ static const uint16_t casefolded[] = { 0x0069, 0x0307 };
+ static const uint16_t casefolded_tr[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint16_t input[] = { 0x0131 };
+ static const uint16_t casefolded[] = { 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint16_t input[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ static const uint16_t casefolded[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint16_t input[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ static const uint16_t casefolded[] = { 0x0068, 0x0065, 0x0069, 0x0073, 0x0073 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint16_t input[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ static const uint16_t casefolded[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C3, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C3
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint16_t input[] = { 0x01F0, 0x0323 };
+ static const uint16_t casefolded[] = { 0x006A, 0x030C, 0x0323 };
+ static const uint16_t casefolded_decomposed[] = { 0x006A, 0x0323, 0x030C };
+ static const uint16_t casefolded_normalized[] = { 0x01F0, 0x0323 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFD, casefolded_decomposed, SIZEOF (casefolded_decomposed)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casefolded_normalized, SIZEOF (casefolded_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-is-cased.c b/gnulib/tests/unicase/test-u16-is-cased.c
new file mode 100644
index 00000000..801d4ee2
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-is-cased.c
@@ -0,0 +1,36 @@
+/* Test of test whether case matters for an UTF-16 string.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#include "test-is-cased.h"
+#undef UNIT
+
+int
+main ()
+{
+ test_ascii (u16_is_cased);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-is-casefolded.c b/gnulib/tests/unicase/test-u16-is-casefolded.c
new file mode 100644
index 00000000..cd242f6f
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-is-casefolded.c
@@ -0,0 +1,50 @@
+/* Test of test whether an UTF-16 string is already case-folded.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#include "test-is-casefolded.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint16_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint16_t input[] = { 0x00DF };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u16_is_casefolded);
+ test_nonascii (u16_is_casefolded);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-is-lowercase.c b/gnulib/tests/unicase/test-u16-is-lowercase.c
new file mode 100644
index 00000000..9f17439c
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-is-lowercase.c
@@ -0,0 +1,78 @@
+/* Test of test whether an UTF-16 string is entirely lower case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#include "test-is-lowercase.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint16_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint16_t input[] = { 0x24D7 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint16_t input[] = { 0x24BD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const uint16_t input[] = { 0x02B0 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint16_t input[] = { 0x1D34 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint16_t input[] = { 0x02BD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u16_is_lowercase);
+ test_nonascii (u16_is_lowercase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-is-titlecase.c b/gnulib/tests/unicase/test-u16-is-titlecase.c
new file mode 100644
index 00000000..e7000dbc
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-is-titlecase.c
@@ -0,0 +1,36 @@
+/* Test of test whether an UTF-16 string is entirely title case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#include "test-is-titlecase.h"
+#undef UNIT
+
+int
+main ()
+{
+ test_ascii (u16_is_titlecase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-is-uppercase.c b/gnulib/tests/unicase/test-u16-is-uppercase.c
new file mode 100644
index 00000000..98448467
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-is-uppercase.c
@@ -0,0 +1,78 @@
+/* Test of test whether an UTF-16 string is entirely upper case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#include "test-is-uppercase.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint16_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint16_t input[] = { 0x24D7 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const uint16_t input[] = { 0x24BD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint16_t input[] = { 0x02B0 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint16_t input[] = { 0x1D34 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint16_t input[] = { 0x02BD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u16_is_uppercase);
+ test_nonascii (u16_is_uppercase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-tolower.c b/gnulib/tests/unicase/test-u16-tolower.c
new file mode 100644
index 00000000..af5f9d27
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-tolower.c
@@ -0,0 +1,238 @@
+/* Test of lowercase mapping for UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_tolower (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_tolower (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_tolower (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t casemapped[] =
+ { 'g', 'r', 0x00FC, 0x00DF, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0x0437, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint16_t input[] = { 0x0049 };
+ static const uint16_t casemapped[] = { 0x0069 };
+ static const uint16_t casemapped_tr[] = { 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint16_t input[] = { 0x0069 };
+ static const uint16_t casemapped[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint16_t input[] = { 0x0130 };
+ static const uint16_t casemapped[] = { 0x0069, 0x0307 };
+ static const uint16_t casemapped_tr[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint16_t input[] = { 0x0131 };
+ static const uint16_t casemapped[] = { 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "TOPKAPI" */
+ static const uint16_t input[] =
+ { 0x0054, 0x004F, 0x0050, 0x004B, 0x0041, 0x0050, 0x0049 };
+ static const uint16_t casemapped[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "HEIß" */
+ static const uint16_t input[] = { 0x0048, 0x0045, 0x0049, 0x00DF };
+ static const uint16_t casemapped[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "ΠΕΡΙΣΣΌΤΕΡΕΣ ΠΛΗΡΟΦΟΡΊΕΣ" */
+ static const uint16_t input[] =
+ {
+ 0x03A0, 0x0395, 0x03A1, 0x0399, 0x03A3, 0x03A3, 0x038C, 0x03A4,
+ 0x0395, 0x03A1, 0x0395, 0x03A3, 0x0020, 0x03A0, 0x039B, 0x0397,
+ 0x03A1, 0x039F, 0x03A6, 0x039F, 0x03A1, 0x038A, 0x0395, 0x03A3
+ };
+ static const uint16_t casemapped[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "Σ" -> "σ" */
+ static const uint16_t input[] = { 0x03A3 };
+ static const uint16_t casemapped[] = { 0x03C3 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ" -> "ας" */
+ static const uint16_t input[] = { 0x0391, 0x03A3 };
+ static const uint16_t casemapped[] = { 0x03B1, 0x03C2 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ /* It's a final sigma only if not followed by a case-ignorable sequence and
+ then a cased letter. Note that U+0345 and U+037A are simultaneously
+ case-ignorable and cased (which is a bit paradoxical). */
+ { /* "ΑΣΑ" -> "ασα" */
+ static const uint16_t input[] = { 0x0391, 0x03A3, 0x0391 };
+ static const uint16_t casemapped[] = { 0x03B1, 0x03C3, 0x03B1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:" -> "ας:" */
+ static const uint16_t input[] = { 0x0391, 0x03A3, 0x003A };
+ static const uint16_t casemapped[] = { 0x03B1, 0x03C2, 0x003A };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:Α" -> "ασ:α" */
+ static const uint16_t input[] = { 0x0391, 0x03A3, 0x003A, 0x0391 };
+ static const uint16_t casemapped[] = { 0x03B1, 0x03C3, 0x003A, 0x03B1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:ͺ" -> "ασ:ͺ" */
+ static const uint16_t input[] = { 0x0391, 0x03A3, 0x003A, 0x037A };
+ static const uint16_t casemapped[] = { 0x03B1, 0x03C3, 0x003A, 0x037A };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:ͺ " -> "ασ:ͺ " */
+ static const uint16_t input[] = { 0x0391, 0x03A3, 0x003A, 0x037A, 0x0020 };
+ static const uint16_t casemapped[] = { 0x03B1, 0x03C3, 0x003A, 0x037A, 0x0020 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ /* It's a final sigma only if preceded by a case-ignorable sequence and
+ a cased letter before it. Note that U+0345 and U+037A are simultaneously
+ case-ignorable and cased (which is a bit paradoxical). */
+ { /* ":Σ" -> ":σ" */
+ static const uint16_t input[] = { 0x003A, 0x03A3 };
+ static const uint16_t casemapped[] = { 0x003A, 0x03C3 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "Α:Σ" -> "α:ς" */
+ static const uint16_t input[] = { 0x0391, 0x003A, 0x03A3 };
+ static const uint16_t casemapped[] = { 0x03B1, 0x003A, 0x03C2 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ͺ:Σ" -> "ͺ:ς" */
+ static const uint16_t input[] = { 0x037A, 0x003A, 0x03A3 };
+ static const uint16_t casemapped[] = { 0x037A, 0x003A, 0x03C2 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* " ͺ:Σ" -> " ͺ:ς" */
+ static const uint16_t input[] = { 0x0020, 0x037A, 0x003A, 0x03A3 };
+ static const uint16_t casemapped[] = { 0x0020, 0x037A, 0x003A, 0x03C2 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-totitle.c b/gnulib/tests/unicase/test-u16-totitle.c
new file mode 100644
index 00000000..e08b82e4
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-totitle.c
@@ -0,0 +1,198 @@
+/* Test of titlecase mapping for UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_totitle (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_totitle (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_totitle (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "GRÜß GOTT. ЗДРАВСТВУЙТЕ! X=(-B±SQRT(B²-4AC))/(2A) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'R', 0x00DC, 0x00DF, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0x0417, 0x0414, 0x0420, 0x0410, 0x0412, 0x0421, 0x0422, 0x0412, 0x0423,
+ 0x0419, 0x0422, 0x0415, '!', ' ',
+ 'X', '=', '(', '-', 'B', 0x00B1, 'S', 'Q', 'R', 'T', '(', 'B', 0x00B2,
+ '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t casemapped[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'X', '=', '(', '-', 'B', 0x00B1, 'S', 'q', 'r', 't', '(', 'B', 0x00B2,
+ '-', '4', 'A', 'c', ')', ')', '/', '(', '2', 'A', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint16_t input[] = { 0x0149 };
+ static const uint16_t casemapped[] = { 0x02BC, 0x004E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint16_t input[] = { 0x0390 };
+ static const uint16_t casemapped[] = { 0x0399, 0x0308, 0x0301 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint16_t input[] = { 0x0049 };
+ static const uint16_t casemapped[] = { 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint16_t input[] = { 0x0069 };
+ static const uint16_t casemapped[] = { 0x0049 };
+ static const uint16_t casemapped_tr[] = { 0x0130 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint16_t input[] = { 0x0130 };
+ static const uint16_t casemapped[] = { 0x0130 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint16_t input[] = { 0x0131 };
+ static const uint16_t casemapped[] = { 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint16_t input[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ static const uint16_t casemapped[] =
+ { 0x0054, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint16_t input[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ static const uint16_t casemapped[] = { 0x0048, 0x0065, 0x0069, 0x00DF };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint16_t input[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ static const uint16_t casemapped[] =
+ {
+ 0x03A0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03A0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint16_t input[] = { 0x01F0, 0x0323 };
+ static const uint16_t casemapped[] = { 0x004A, 0x030C, 0x0323 };
+ static const uint16_t casemapped_normalized[] = { 0x004A, 0x0323, 0x030C };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casemapped_normalized, SIZEOF (casemapped_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u16-toupper.c b/gnulib/tests/unicase/test-u16-toupper.c
new file mode 100644
index 00000000..ec87fc72
--- /dev/null
+++ b/gnulib/tests/unicase/test-u16-toupper.c
@@ -0,0 +1,198 @@
+/* Test of uppercase mapping for UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_toupper (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_toupper (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_toupper (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t casemapped[] =
+ { 'G', 'R', 0x00DC, 0x0053, 0x0053, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0x0417, 0x0414, 0x0420, 0x0410, 0x0412, 0x0421, 0x0422, 0x0412, 0x0423,
+ 0x0419, 0x0422, 0x0415, '!', ' ',
+ 'X', '=', '(', '-', 'B', 0x00B1, 'S', 'Q', 'R', 'T', '(', 'B', 0x00B2,
+ '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint16_t input[] = { 0x0149 };
+ static const uint16_t casemapped[] = { 0x02BC, 0x004E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint16_t input[] = { 0x0390 };
+ static const uint16_t casemapped[] = { 0x0399, 0x0308, 0x0301 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint16_t input[] = { 0x0049 };
+ static const uint16_t casemapped[] = { 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint16_t input[] = { 0x0069 };
+ static const uint16_t casemapped[] = { 0x0049 };
+ static const uint16_t casemapped_tr[] = { 0x0130 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint16_t input[] = { 0x0130 };
+ static const uint16_t casemapped[] = { 0x0130 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint16_t input[] = { 0x0131 };
+ static const uint16_t casemapped[] = { 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint16_t input[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ static const uint16_t casemapped[] =
+ { 0x0054, 0x004F, 0x0050, 0x004B, 0x0041, 0x0050, 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint16_t input[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ static const uint16_t casemapped[] = { 0x0048, 0x0045, 0x0049, 0x0053, 0x0053 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint16_t input[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ static const uint16_t casemapped[] =
+ {
+ 0x03A0, 0x0395, 0x03A1, 0x0399, 0x03A3, 0x03A3, 0x038C, 0x03A4,
+ 0x0395, 0x03A1, 0x0395, 0x03A3, 0x0020, 0x03A0, 0x039B, 0x0397,
+ 0x03A1, 0x039F, 0x03A6, 0x039F, 0x03A1, 0x038A, 0x0395, 0x03A3
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint16_t input[] = { 0x01F0, 0x0323 };
+ static const uint16_t casemapped[] = { 0x004A, 0x030C, 0x0323 };
+ static const uint16_t casemapped_normalized[] = { 0x004A, 0x0323, 0x030C };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casemapped_normalized, SIZEOF (casemapped_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-casecmp.c b/gnulib/tests/unicase/test-u32-casecmp.c
new file mode 100644
index 00000000..97f6277d
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-casecmp.c
@@ -0,0 +1,321 @@
+/* Test of case and normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "uninorm.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#include "test-casecmp.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_casecmp) (const uint32_t *, size_t, const uint32_t *, size_t, const char *, uninorm_t, int *))
+{
+ /* Normalization effects. */
+ {
+ static const uint32_t input1[] = { 'H', 0x00F6, 'h', 'l', 'e' };
+ static const uint32_t input2[] = { 'H', 'O', 0x0308, 'h', 'L', 'e' };
+ static const uint32_t input3[] = { 'H', 0x00F6, 'h', 'l', 'e', 'n' };
+ static const uint32_t input4[] = { 'H', 'O', 0x0308, 'h', 'L', 'e', 'n' };
+ static const uint32_t input5[] = { 'H', 'u', 'r', 'z' };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input3, SIZEOF (input3), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input4, SIZEOF (input4), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint32_t input1[] = { 0x00C4 };
+ static const uint32_t input2[] = { 0x0041, 0x0308 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint32_t input1[] = { 0x01DE };
+ static const uint32_t input2[] = { 0x0041, 0x0308, 0x0304 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint32_t input1[] = { 0x1FC1 };
+ static const uint32_t input2[] = { 0x00A8, 0x0342 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint32_t input1[] = { 0xAE00 };
+ static const uint32_t input2[] = { 0xADF8, 0x11AF };
+ static const uint32_t input3[] = { 0x1100, 0x1173, 0x11AF };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEU */
+ static const uint32_t input1[] = { 0xADF8 };
+ static const uint32_t input2[] = { 0x1100, 0x1173 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input1[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t input2[] =
+ { 'g', 'r', 0x00FC, 0x0073, 0x0073, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0x0437, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t input3[] =
+ { 'G', 'R', 0x00DC, 0x0053, 0x0053, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0x0417, 0x0414, 0x0420, 0x0410, 0x0412, 0x0421, 0x0422, 0x0412, 0x0423,
+ 0x0419, 0x0422, 0x0415, '!', ' ',
+ 'X', '=', '(', '-', 'B', 0x00B1, 'S', 'Q', 'R', 'T', '(', 'B', 0x00B2,
+ '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint32_t input1[] = { 0x0149 };
+ static const uint32_t input2[] = { 0x02BC, 0x006E };
+ static const uint32_t input3[] = { 0x02BC, 0x004E };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint32_t input1[] = { 0x0390 };
+ static const uint32_t input2[] = { 0x03B9, 0x0308, 0x0301 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint32_t input[] = { 0x0049 };
+ static const uint32_t casefolded[] = { 0x0069 };
+ static const uint32_t casefolded_tr[] = { 0x0131 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint32_t input[] = { 0x0069 };
+ static const uint32_t casefolded[] = { 0x0049 };
+ static const uint32_t casefolded_tr[] = { 0x0130 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint32_t input[] = { 0x0130 };
+ static const uint32_t casefolded[] = { 0x0069, 0x0307 };
+ static const uint32_t casefolded_tr[] = { 0x0069 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint32_t input[] = { 0x0131 };
+ static const uint32_t casefolded[] = { 0x0049 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* "topkapı" */
+ static const uint32_t input[] =
+ { 0x0054, 0x004F, 0x0050, 0x004B, 0x0041, 0x0050, 0x0049 };
+ static const uint32_t casefolded[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint32_t input1[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ static const uint32_t input2[] = { 0x0068, 0x0065, 0x0069, 0x0073, 0x0073 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint32_t input1[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ static const uint32_t input2[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C3, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C3
+ };
+ static const uint32_t input3[] =
+ {
+ 0x03A0, 0x0395, 0x03A1, 0x0399, 0x03A3, 0x03A3, 0x038C, 0x03A4,
+ 0x0395, 0x03A1, 0x0395, 0x03A3, 0x0020, 0x03A0, 0x039B, 0x0397,
+ 0x03A1, 0x039F, 0x03A6, 0x039F, 0x03A1, 0x038A, 0x0395, 0x03A3
+ };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint32_t input[] = { 0x01F0, 0x0323 };
+ static const uint32_t casefolded[] = { 0x006A, 0x030C, 0x0323 };
+ static const uint32_t casefolded_decomposed[] = { 0x006A, 0x0323, 0x030C };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp != 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u32_casecmp, UNINORM_NFD);
+ test_nonascii (u32_casecmp);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-casecoll.c b/gnulib/tests/unicase/test-u32-casecoll.c
new file mode 100644
index 00000000..65e2aed3
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-casecoll.c
@@ -0,0 +1,39 @@
+/* Test of locale dependent, case and normalization insensitive comparison of
+ UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "uninorm.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#include "test-casecmp.h"
+#undef UNIT
+
+int
+main ()
+{
+ /* In the "C" locale, strcoll is equivalent to strcmp, therefore u8_casecoll
+ on ASCII strings should behave like strcasecmp. */
+ test_ascii (u32_casecoll, UNINORM_NFC);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-casefold.c b/gnulib/tests/unicase/test-u32-casefold.c
new file mode 100644
index 00000000..77b037d7
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-casefold.c
@@ -0,0 +1,201 @@
+/* Test of casefolding mapping for UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_casefold (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_casefold (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_casefold (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t casefolded[] =
+ { 'g', 'r', 0x00FC, 0x0073, 0x0073, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0x0437, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint32_t input[] = { 0x0149 };
+ static const uint32_t casefolded[] = { 0x02BC, 0x006E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint32_t input[] = { 0x0390 };
+ static const uint32_t casefolded[] = { 0x03B9, 0x0308, 0x0301 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint32_t input[] = { 0x0049 };
+ static const uint32_t casefolded[] = { 0x0069 };
+ static const uint32_t casefolded_tr[] = { 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint32_t input[] = { 0x0069 };
+ static const uint32_t casefolded[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint32_t input[] = { 0x0130 };
+ static const uint32_t casefolded[] = { 0x0069, 0x0307 };
+ static const uint32_t casefolded_tr[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint32_t input[] = { 0x0131 };
+ static const uint32_t casefolded[] = { 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint32_t input[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ static const uint32_t casefolded[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint32_t input[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ static const uint32_t casefolded[] = { 0x0068, 0x0065, 0x0069, 0x0073, 0x0073 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint32_t input[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ static const uint32_t casefolded[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C3, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C3
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint32_t input[] = { 0x01F0, 0x0323 };
+ static const uint32_t casefolded[] = { 0x006A, 0x030C, 0x0323 };
+ static const uint32_t casefolded_decomposed[] = { 0x006A, 0x0323, 0x030C };
+ static const uint32_t casefolded_normalized[] = { 0x01F0, 0x0323 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFD, casefolded_decomposed, SIZEOF (casefolded_decomposed)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casefolded_normalized, SIZEOF (casefolded_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-is-cased.c b/gnulib/tests/unicase/test-u32-is-cased.c
new file mode 100644
index 00000000..6f0f5357
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-is-cased.c
@@ -0,0 +1,36 @@
+/* Test of test whether case matters for an UTF-32 string.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#include "test-is-cased.h"
+#undef UNIT
+
+int
+main ()
+{
+ test_ascii (u32_is_cased);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-is-casefolded.c b/gnulib/tests/unicase/test-u32-is-casefolded.c
new file mode 100644
index 00000000..440c8d3c
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-is-casefolded.c
@@ -0,0 +1,50 @@
+/* Test of test whether an UTF-32 string is already case-folded.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#include "test-is-casefolded.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint32_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint32_t input[] = { 0x00DF };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u32_is_casefolded);
+ test_nonascii (u32_is_casefolded);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-is-lowercase.c b/gnulib/tests/unicase/test-u32-is-lowercase.c
new file mode 100644
index 00000000..a4b95111
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-is-lowercase.c
@@ -0,0 +1,78 @@
+/* Test of test whether an UTF-32 string is entirely lower case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#include "test-is-lowercase.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint32_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint32_t input[] = { 0x24D7 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint32_t input[] = { 0x24BD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const uint32_t input[] = { 0x02B0 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint32_t input[] = { 0x1D34 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint32_t input[] = { 0x02BD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u32_is_lowercase);
+ test_nonascii (u32_is_lowercase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-is-titlecase.c b/gnulib/tests/unicase/test-u32-is-titlecase.c
new file mode 100644
index 00000000..0ce24988
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-is-titlecase.c
@@ -0,0 +1,36 @@
+/* Test of test whether an UTF-32 string is entirely title case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#include "test-is-titlecase.h"
+#undef UNIT
+
+int
+main ()
+{
+ test_ascii (u32_is_titlecase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-is-uppercase.c b/gnulib/tests/unicase/test-u32-is-uppercase.c
new file mode 100644
index 00000000..b1b8320e
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-is-uppercase.c
@@ -0,0 +1,78 @@
+/* Test of test whether an UTF-32 string is entirely upper case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#include "test-is-uppercase.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint32_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint32_t input[] = { 0x24D7 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const uint32_t input[] = { 0x24BD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint32_t input[] = { 0x02B0 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint32_t input[] = { 0x1D34 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint32_t input[] = { 0x02BD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u32_is_uppercase);
+ test_nonascii (u32_is_uppercase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-tolower.c b/gnulib/tests/unicase/test-u32-tolower.c
new file mode 100644
index 00000000..530f0e74
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-tolower.c
@@ -0,0 +1,238 @@
+/* Test of lowercase mapping for UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_tolower (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_tolower (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_tolower (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t casemapped[] =
+ { 'g', 'r', 0x00FC, 0x00DF, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0x0437, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint32_t input[] = { 0x0049 };
+ static const uint32_t casemapped[] = { 0x0069 };
+ static const uint32_t casemapped_tr[] = { 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint32_t input[] = { 0x0069 };
+ static const uint32_t casemapped[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint32_t input[] = { 0x0130 };
+ static const uint32_t casemapped[] = { 0x0069, 0x0307 };
+ static const uint32_t casemapped_tr[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint32_t input[] = { 0x0131 };
+ static const uint32_t casemapped[] = { 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "TOPKAPI" */
+ static const uint32_t input[] =
+ { 0x0054, 0x004F, 0x0050, 0x004B, 0x0041, 0x0050, 0x0049 };
+ static const uint32_t casemapped[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "HEIß" */
+ static const uint32_t input[] = { 0x0048, 0x0045, 0x0049, 0x00DF };
+ static const uint32_t casemapped[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "ΠΕΡΙΣΣΌΤΕΡΕΣ ΠΛΗΡΟΦΟΡΊΕΣ" */
+ static const uint32_t input[] =
+ {
+ 0x03A0, 0x0395, 0x03A1, 0x0399, 0x03A3, 0x03A3, 0x038C, 0x03A4,
+ 0x0395, 0x03A1, 0x0395, 0x03A3, 0x0020, 0x03A0, 0x039B, 0x0397,
+ 0x03A1, 0x039F, 0x03A6, 0x039F, 0x03A1, 0x038A, 0x0395, 0x03A3
+ };
+ static const uint32_t casemapped[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "Σ" -> "σ" */
+ static const uint32_t input[] = { 0x03A3 };
+ static const uint32_t casemapped[] = { 0x03C3 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ" -> "ας" */
+ static const uint32_t input[] = { 0x0391, 0x03A3 };
+ static const uint32_t casemapped[] = { 0x03B1, 0x03C2 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ /* It's a final sigma only if not followed by a case-ignorable sequence and
+ then a cased letter. Note that U+0345 and U+037A are simultaneously
+ case-ignorable and cased (which is a bit paradoxical). */
+ { /* "ΑΣΑ" -> "ασα" */
+ static const uint32_t input[] = { 0x0391, 0x03A3, 0x0391 };
+ static const uint32_t casemapped[] = { 0x03B1, 0x03C3, 0x03B1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:" -> "ας:" */
+ static const uint32_t input[] = { 0x0391, 0x03A3, 0x003A };
+ static const uint32_t casemapped[] = { 0x03B1, 0x03C2, 0x003A };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:Α" -> "ασ:α" */
+ static const uint32_t input[] = { 0x0391, 0x03A3, 0x003A, 0x0391 };
+ static const uint32_t casemapped[] = { 0x03B1, 0x03C3, 0x003A, 0x03B1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:ͺ" -> "ασ:ͺ" */
+ static const uint32_t input[] = { 0x0391, 0x03A3, 0x003A, 0x037A };
+ static const uint32_t casemapped[] = { 0x03B1, 0x03C3, 0x003A, 0x037A };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:ͺ " -> "ασ:ͺ " */
+ static const uint32_t input[] = { 0x0391, 0x03A3, 0x003A, 0x037A, 0x0020 };
+ static const uint32_t casemapped[] = { 0x03B1, 0x03C3, 0x003A, 0x037A, 0x0020 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ /* It's a final sigma only if preceded by a case-ignorable sequence and
+ a cased letter before it. Note that U+0345 and U+037A are simultaneously
+ case-ignorable and cased (which is a bit paradoxical). */
+ { /* ":Σ" -> ":σ" */
+ static const uint32_t input[] = { 0x003A, 0x03A3 };
+ static const uint32_t casemapped[] = { 0x003A, 0x03C3 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "Α:Σ" -> "α:ς" */
+ static const uint32_t input[] = { 0x0391, 0x003A, 0x03A3 };
+ static const uint32_t casemapped[] = { 0x03B1, 0x003A, 0x03C2 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ͺ:Σ" -> "ͺ:ς" */
+ static const uint32_t input[] = { 0x037A, 0x003A, 0x03A3 };
+ static const uint32_t casemapped[] = { 0x037A, 0x003A, 0x03C2 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* " ͺ:Σ" -> " ͺ:ς" */
+ static const uint32_t input[] = { 0x0020, 0x037A, 0x003A, 0x03A3 };
+ static const uint32_t casemapped[] = { 0x0020, 0x037A, 0x003A, 0x03C2 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-totitle.c b/gnulib/tests/unicase/test-u32-totitle.c
new file mode 100644
index 00000000..9e1b3e67
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-totitle.c
@@ -0,0 +1,198 @@
+/* Test of titlecase mapping for UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_totitle (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_totitle (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_totitle (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "GRÜß GOTT. ЗДРАВСТВУЙТЕ! X=(-B±SQRT(B²-4AC))/(2A) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'R', 0x00DC, 0x00DF, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0x0417, 0x0414, 0x0420, 0x0410, 0x0412, 0x0421, 0x0422, 0x0412, 0x0423,
+ 0x0419, 0x0422, 0x0415, '!', ' ',
+ 'X', '=', '(', '-', 'B', 0x00B1, 'S', 'Q', 'R', 'T', '(', 'B', 0x00B2,
+ '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t casemapped[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'X', '=', '(', '-', 'B', 0x00B1, 'S', 'q', 'r', 't', '(', 'B', 0x00B2,
+ '-', '4', 'A', 'c', ')', ')', '/', '(', '2', 'A', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint32_t input[] = { 0x0149 };
+ static const uint32_t casemapped[] = { 0x02BC, 0x004E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint32_t input[] = { 0x0390 };
+ static const uint32_t casemapped[] = { 0x0399, 0x0308, 0x0301 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint32_t input[] = { 0x0049 };
+ static const uint32_t casemapped[] = { 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint32_t input[] = { 0x0069 };
+ static const uint32_t casemapped[] = { 0x0049 };
+ static const uint32_t casemapped_tr[] = { 0x0130 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint32_t input[] = { 0x0130 };
+ static const uint32_t casemapped[] = { 0x0130 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint32_t input[] = { 0x0131 };
+ static const uint32_t casemapped[] = { 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint32_t input[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ static const uint32_t casemapped[] =
+ { 0x0054, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint32_t input[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ static const uint32_t casemapped[] = { 0x0048, 0x0065, 0x0069, 0x00DF };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint32_t input[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ static const uint32_t casemapped[] =
+ {
+ 0x03A0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03A0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint32_t input[] = { 0x01F0, 0x0323 };
+ static const uint32_t casemapped[] = { 0x004A, 0x030C, 0x0323 };
+ static const uint32_t casemapped_normalized[] = { 0x004A, 0x0323, 0x030C };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casemapped_normalized, SIZEOF (casemapped_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u32-toupper.c b/gnulib/tests/unicase/test-u32-toupper.c
new file mode 100644
index 00000000..17ce1feb
--- /dev/null
+++ b/gnulib/tests/unicase/test-u32-toupper.c
@@ -0,0 +1,198 @@
+/* Test of uppercase mapping for UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_toupper (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_toupper (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_toupper (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t casemapped[] =
+ { 'G', 'R', 0x00DC, 0x0053, 0x0053, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0x0417, 0x0414, 0x0420, 0x0410, 0x0412, 0x0421, 0x0422, 0x0412, 0x0423,
+ 0x0419, 0x0422, 0x0415, '!', ' ',
+ 'X', '=', '(', '-', 'B', 0x00B1, 'S', 'Q', 'R', 'T', '(', 'B', 0x00B2,
+ '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint32_t input[] = { 0x0149 };
+ static const uint32_t casemapped[] = { 0x02BC, 0x004E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint32_t input[] = { 0x0390 };
+ static const uint32_t casemapped[] = { 0x0399, 0x0308, 0x0301 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint32_t input[] = { 0x0049 };
+ static const uint32_t casemapped[] = { 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint32_t input[] = { 0x0069 };
+ static const uint32_t casemapped[] = { 0x0049 };
+ static const uint32_t casemapped_tr[] = { 0x0130 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint32_t input[] = { 0x0130 };
+ static const uint32_t casemapped[] = { 0x0130 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint32_t input[] = { 0x0131 };
+ static const uint32_t casemapped[] = { 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint32_t input[] =
+ { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
+ static const uint32_t casemapped[] =
+ { 0x0054, 0x004F, 0x0050, 0x004B, 0x0041, 0x0050, 0x0049 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint32_t input[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
+ static const uint32_t casemapped[] = { 0x0048, 0x0045, 0x0049, 0x0053, 0x0053 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint32_t input[] =
+ {
+ 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
+ 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
+ 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
+ };
+ static const uint32_t casemapped[] =
+ {
+ 0x03A0, 0x0395, 0x03A1, 0x0399, 0x03A3, 0x03A3, 0x038C, 0x03A4,
+ 0x0395, 0x03A1, 0x0395, 0x03A3, 0x0020, 0x03A0, 0x039B, 0x0397,
+ 0x03A1, 0x039F, 0x03A6, 0x039F, 0x03A1, 0x038A, 0x0395, 0x03A3
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint32_t input[] = { 0x01F0, 0x0323 };
+ static const uint32_t casemapped[] = { 0x004A, 0x030C, 0x0323 };
+ static const uint32_t casemapped_normalized[] = { 0x004A, 0x0323, 0x030C };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casemapped_normalized, SIZEOF (casemapped_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-casecmp.c b/gnulib/tests/unicase/test-u8-casecmp.c
new file mode 100644
index 00000000..cb854eb1
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-casecmp.c
@@ -0,0 +1,330 @@
+/* Test of case and normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "uninorm.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#include "test-casecmp.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_casecmp) (const uint8_t *, size_t, const uint8_t *, size_t, const char *, uninorm_t, int *))
+{
+ /* Normalization effects. */
+ {
+ static const uint8_t input1[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e' };
+ static const uint8_t input2[] = { 'H', 'O', 0xCC, 0x88, 'h', 'L', 'e' };
+ static const uint8_t input3[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e', 'n' };
+ static const uint8_t input4[] = { 'H', 'O', 0xCC, 0x88, 'h', 'L', 'e', 'n' };
+ static const uint8_t input5[] = { 'H', 'u', 'r', 'z' };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input3, SIZEOF (input3), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input4, SIZEOF (input4), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint8_t input1[] = { 0xC3, 0x84 };
+ static const uint8_t input2[] = { 0x41, 0xCC, 0x88 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint8_t input1[] = { 0xC7, 0x9E };
+ static const uint8_t input2[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint8_t input1[] = { 0xE1, 0xBF, 0x81 };
+ static const uint8_t input2[] = { 0xC2, 0xA8, 0xCD, 0x82 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint8_t input1[] = { 0xEA, 0xB8, 0x80 };
+ static const uint8_t input2[] = { 0xEA, 0xB7, 0xB8, 0xE1, 0x86, 0xAF };
+ static const uint8_t input3[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEU */
+ static const uint8_t input1[] = { 0xEA, 0xB7, 0xB8 };
+ static const uint8_t input2[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input1[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t input2[] =
+ { 'g', 'r', 0xC3, 0xBC, 0x73, 0x73, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0xD0, 0xB7, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t input3[] =
+ { 'G', 'R', 0xC3, 0x9C, 0x53, 0x53, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0x94, 0xD0, 0xA0, 0xD0, 0x90, 0xD0, 0x92, 0xD0, 0xA1,
+ 0xD0, 0xA2, 0xD0, 0x92, 0xD0, 0xA3, 0xD0, 0x99, 0xD0, 0xA2, 0xD0, 0x95,
+ '!', ' ', 'X', '=', '(', '-', 'B', 0xC2, 0xB1, 'S', 'Q', 'R', 'T', '(',
+ 'B', 0xC2, 0xB2, '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint8_t input1[] = { 0xC5, 0x89 };
+ static const uint8_t input2[] = { 0xCA, 0xBC, 0x6E };
+ static const uint8_t input3[] = { 0xCA, 0xBC, 0x4E };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint8_t input1[] = { 0xCE, 0x90 };
+ static const uint8_t input2[] = { 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint8_t input[] = { 0x49 };
+ static const uint8_t casefolded[] = { 0x69 };
+ static const uint8_t casefolded_tr[] = { 0xC4, 0xB1 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint8_t input[] = { 0x69 };
+ static const uint8_t casefolded[] = { 0x49 };
+ static const uint8_t casefolded_tr[] = { 0xC4, 0xB0 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint8_t input[] = { 0xC4, 0xB0 };
+ static const uint8_t casefolded[] = { 0x69, 0xCC, 0x87 };
+ static const uint8_t casefolded_tr[] = { 0x69 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint8_t input[] = { 0xC4, 0xB1 };
+ static const uint8_t casefolded[] = { 0x49 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* "topkapı" */
+ static const uint8_t input[] =
+ { 0x54, 0x4F, 0x50, 0x4B, 0x41, 0x50, 0x49 };
+ static const uint8_t casefolded[] =
+ { 0x74, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint8_t input1[] = { 0x68, 0x65, 0x69, 0xC3, 0x9F };
+ static const uint8_t input2[] = { 0x68, 0x65, 0x69, 0x73, 0x73 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint8_t input1[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x82,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x82
+ };
+ static const uint8_t input2[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x83,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x83
+ };
+ static const uint8_t input3[] =
+ {
+ 0xCE, 0xA0, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x99, 0xCE, 0xA3, 0xCE, 0xA3,
+ 0xCE, 0x8C, 0xCE, 0xA4, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x95, 0xCE, 0xA3,
+ ' ', 0xCE, 0xA0, 0xCE, 0x9B, 0xCE, 0x97, 0xCE, 0xA1, 0xCE, 0x9F,
+ 0xCE, 0xA6, 0xCE, 0x9F, 0xCE, 0xA1, 0xCE, 0x8A, 0xCE, 0x95, 0xCE, 0xA3
+ };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint8_t input[] = { 0xC7, 0xB0, 0xCC, 0xA3 };
+ static const uint8_t casefolded[] = { 0x6A, 0xCC, 0x8C, 0xCC, 0xA3 };
+ static const uint8_t casefolded_decomposed[] = { 0x6A, 0xCC, 0xA3, 0xCC, 0x8C };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp != 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u8_casecmp, UNINORM_NFD);
+ test_nonascii (u8_casecmp);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-casecoll.c b/gnulib/tests/unicase/test-u8-casecoll.c
new file mode 100644
index 00000000..861ee2c6
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-casecoll.c
@@ -0,0 +1,39 @@
+/* Test of locale dependent, case and normalization insensitive comparison of
+ UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "uninorm.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#include "test-casecmp.h"
+#undef UNIT
+
+int
+main ()
+{
+ /* In the "C" locale, strcoll is equivalent to strcmp, therefore u8_casecoll
+ on ASCII strings should behave like strcasecmp. */
+ test_ascii (u8_casecoll, UNINORM_NFC);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-casefold.c b/gnulib/tests/unicase/test-u8-casefold.c
new file mode 100644
index 00000000..b110d5c5
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-casefold.c
@@ -0,0 +1,207 @@
+/* Test of casefolding mapping for UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_casefold (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_casefold (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_casefold (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t casefolded[] =
+ { 'g', 'r', 0xC3, 0xBC, 0x73, 0x73, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0xD0, 0xB7, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint8_t input[] = { 0xC5, 0x89 };
+ static const uint8_t casefolded[] = { 0xCA, 0xBC, 0x6E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint8_t input[] = { 0xCE, 0x90 };
+ static const uint8_t casefolded[] = { 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint8_t input[] = { 0x49 };
+ static const uint8_t casefolded[] = { 0x69 };
+ static const uint8_t casefolded_tr[] = { 0xC4, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint8_t input[] = { 0x69 };
+ static const uint8_t casefolded[] = { 0x69 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint8_t input[] = { 0xC4, 0xB0 };
+ static const uint8_t casefolded[] = { 0x69, 0xCC, 0x87 };
+ static const uint8_t casefolded_tr[] = { 0x69 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded_tr, SIZEOF (casefolded_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint8_t input[] = { 0xC4, 0xB1 };
+ static const uint8_t casefolded[] = { 0xC4, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint8_t input[] =
+ { 0x74, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+ static const uint8_t casefolded[] =
+ { 0x74, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint8_t input[] = { 0x68, 0x65, 0x69, 0xC3, 0x9F };
+ static const uint8_t casefolded[] = { 0x68, 0x65, 0x69, 0x73, 0x73 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint8_t input[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x82,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x82
+ };
+ static const uint8_t casefolded[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x83,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x83
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint8_t input[] = { 0xC7, 0xB0, 0xCC, 0xA3 };
+ static const uint8_t casefolded[] = { 0x6A, 0xCC, 0x8C, 0xCC, 0xA3 };
+ static const uint8_t casefolded_decomposed[] = { 0x6A, 0xCC, 0xA3, 0xCC, 0x8C };
+ static const uint8_t casefolded_normalized[] = { 0xC7, 0xB0, 0xCC, 0xA3 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casefolded, SIZEOF (casefolded)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFD, casefolded_decomposed, SIZEOF (casefolded_decomposed)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casefolded_normalized, SIZEOF (casefolded_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-is-cased.c b/gnulib/tests/unicase/test-u8-is-cased.c
new file mode 100644
index 00000000..15109bab
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-is-cased.c
@@ -0,0 +1,36 @@
+/* Test of test whether case matters for an UTF-8 string.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#include "test-is-cased.h"
+#undef UNIT
+
+int
+main ()
+{
+ test_ascii (u8_is_cased);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-is-casefolded.c b/gnulib/tests/unicase/test-u8-is-casefolded.c
new file mode 100644
index 00000000..fc421ab4
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-is-casefolded.c
@@ -0,0 +1,50 @@
+/* Test of test whether an UTF-8 string is already case-folded.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#include "test-is-casefolded.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint8_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint8_t input[] = { 0xC3, 0x9F };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u8_is_casefolded);
+ test_nonascii (u8_is_casefolded);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-is-lowercase.c b/gnulib/tests/unicase/test-u8-is-lowercase.c
new file mode 100644
index 00000000..2b0800f3
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-is-lowercase.c
@@ -0,0 +1,78 @@
+/* Test of test whether an UTF-8 string is entirely lower case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#include "test-is-lowercase.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint8_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x93, 0x97 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x92, 0xBD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const uint8_t input[] = { 0xCA, 0xB0 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint8_t input[] = { 0xE1, 0x80, 0xB4 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint8_t input[] = { 0xCA, 0xBD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u8_is_lowercase);
+ test_nonascii (u8_is_lowercase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-is-titlecase.c b/gnulib/tests/unicase/test-u8-is-titlecase.c
new file mode 100644
index 00000000..40716a1a
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-is-titlecase.c
@@ -0,0 +1,36 @@
+/* Test of test whether an UTF-8 string is entirely title case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#include "test-is-titlecase.h"
+#undef UNIT
+
+int
+main ()
+{
+ test_ascii (u8_is_titlecase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-is-uppercase.c b/gnulib/tests/unicase/test-u8-is-uppercase.c
new file mode 100644
index 00000000..a6be37e6
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-is-uppercase.c
@@ -0,0 +1,78 @@
+/* Test of test whether an UTF-8 string is entirely upper case.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include "unistr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#include "test-is-uppercase.h"
+#undef UNIT
+
+static void
+test_nonascii (int (*my_is) (const uint8_t *, size_t, const char *, bool *))
+{
+ /* Test cases from Unicode 5.1.0. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x93, 0x97 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == false);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x92, 0xBD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint8_t input[] = { 0xCA, 0xB0 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint8_t input[] = { 0xE1, 0x80, 0xB4 };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+ {
+ static const uint8_t input[] = { 0xCA, 0xBD };
+ bool result;
+
+ ASSERT (my_is (input, SIZEOF (input), NULL, &result) == 0);
+ ASSERT (result == true);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u8_is_uppercase);
+ test_nonascii (u8_is_uppercase);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-tolower.c b/gnulib/tests/unicase/test-u8-tolower.c
new file mode 100644
index 00000000..8c625e81
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-tolower.c
@@ -0,0 +1,244 @@
+/* Test of lowercase mapping for UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_tolower (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_tolower (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_tolower (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t casemapped[] =
+ { 'g', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0xD0, 0xB7, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint8_t input[] = { 0x49 };
+ static const uint8_t casemapped[] = { 0x69 };
+ static const uint8_t casemapped_tr[] = { 0xC4, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint8_t input[] = { 0x69 };
+ static const uint8_t casemapped[] = { 0x69 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint8_t input[] = { 0xC4, 0xB0 };
+ static const uint8_t casemapped[] = { 0x69, 0xCC, 0x87 };
+ static const uint8_t casemapped_tr[] = { 0x69 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint8_t input[] = { 0xC4, 0xB1};
+ static const uint8_t casemapped[] = { 0xC4, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "TOPKAPI" */
+ static const uint8_t input[] =
+ { 0x54, 0x4F, 0x50, 0x4B, 0x41, 0x50, 0x49 };
+ static const uint8_t casemapped[] =
+ { 0x74, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "HEIß" */
+ static const uint8_t input[] = { 0x48, 0x45, 0x49, 0xC3, 0x9F };
+ static const uint8_t casemapped[] = { 0x68, 0x65, 0x69, 0xC3, 0x9F };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "ΠΕΡΙΣΣΌΤΕΡΕΣ ΠΛΗΡΟΦΟΡΊΕΣ" */
+ static const uint8_t input[] =
+ {
+ 0xCE, 0xA0, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x99, 0xCE, 0xA3, 0xCE, 0xA3,
+ 0xCE, 0x8C, 0xCE, 0xA4, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x95, 0xCE, 0xA3,
+ ' ', 0xCE, 0xA0, 0xCE, 0x9B, 0xCE, 0x97, 0xCE, 0xA1, 0xCE, 0x9F,
+ 0xCE, 0xA6, 0xCE, 0x9F, 0xCE, 0xA1, 0xCE, 0x8A, 0xCE, 0x95, 0xCE, 0xA3
+ };
+ static const uint8_t casemapped[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x82,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x82
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "Σ" -> "σ" */
+ static const uint8_t input[] = { 0xCE, 0xA3 };
+ static const uint8_t casemapped[] = { 0xCF, 0x83 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ" -> "ας" */
+ static const uint8_t input[] = { 0xCE, 0x91, 0xCE, 0xA3 };
+ static const uint8_t casemapped[] = { 0xCE, 0xB1, 0xCF, 0x82 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ /* It's a final sigma only if not followed by a case-ignorable sequence and
+ then a cased letter. Note that U+0345 and U+037A are simultaneously
+ case-ignorable and cased (which is a bit paradoxical). */
+ { /* "ΑΣΑ" -> "ασα" */
+ static const uint8_t input[] = { 0xCE, 0x91, 0xCE, 0xA3, 0xCE, 0x91 };
+ static const uint8_t casemapped[] = { 0xCE, 0xB1, 0xCF, 0x83, 0xCE, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:" -> "ας:" */
+ static const uint8_t input[] = { 0xCE, 0x91, 0xCE, 0xA3, 0x3A };
+ static const uint8_t casemapped[] = { 0xCE, 0xB1, 0xCF, 0x82, 0x3A };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:Α" -> "ασ:α" */
+ static const uint8_t input[] = { 0xCE, 0x91, 0xCE, 0xA3, 0x3A, 0xCE, 0x91 };
+ static const uint8_t casemapped[] = { 0xCE, 0xB1, 0xCF, 0x83, 0x3A, 0xCE, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:ͺ" -> "ασ:ͺ" */
+ static const uint8_t input[] = { 0xCE, 0x91, 0xCE, 0xA3, 0x3A, 0xCD, 0xBA };
+ static const uint8_t casemapped[] = { 0xCE, 0xB1, 0xCF, 0x83, 0x3A, 0xCD, 0xBA };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ΑΣ:ͺ " -> "ασ:ͺ " */
+ static const uint8_t input[] = { 0xCE, 0x91, 0xCE, 0xA3, 0x3A, 0xCD, 0xBA, 0x20 };
+ static const uint8_t casemapped[] = { 0xCE, 0xB1, 0xCF, 0x83, 0x3A, 0xCD, 0xBA, 0x20 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ /* It's a final sigma only if preceded by a case-ignorable sequence and
+ a cased letter before it. Note that U+0345 and U+037A are simultaneously
+ case-ignorable and cased (which is a bit paradoxical). */
+ { /* ":Σ" -> ":σ" */
+ static const uint8_t input[] = { 0x3A, 0xCE, 0xA3 };
+ static const uint8_t casemapped[] = { 0x3A, 0xCF, 0x83 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "Α:Σ" -> "α:ς" */
+ static const uint8_t input[] = { 0xCE, 0x91, 0x3A, 0xCE, 0xA3 };
+ static const uint8_t casemapped[] = { 0xCE, 0xB1, 0x3A, 0xCF, 0x82 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "ͺ:Σ" -> "ͺ:ς" */
+ static const uint8_t input[] = { 0xCD, 0xBA, 0x3A, 0xCE, 0xA3 };
+ static const uint8_t casemapped[] = { 0xCD, 0xBA, 0x3A, 0xCF, 0x82 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* " ͺ:Σ" -> " ͺ:ς" */
+ static const uint8_t input[] = { 0x20, 0xCD, 0xBA, 0x3A, 0xCE, 0xA3 };
+ static const uint8_t casemapped[] = { 0x20, 0xCD, 0xBA, 0x3A, 0xCF, 0x82 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-totitle.c b/gnulib/tests/unicase/test-u8-totitle.c
new file mode 100644
index 00000000..93284c0c
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-totitle.c
@@ -0,0 +1,204 @@
+/* Test of titlecase mapping for UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_totitle (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_totitle (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_totitle (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "GRÜß GOTT. ЗДРАВСТВУЙТЕ! X=(-B±SQRT(B²-4AC))/(2A) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'R', 0xC3, 0x9C, 0xC3, 0x9F, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0x94, 0xD0, 0xA0, 0xD0, 0x90, 0xD0, 0x92, 0xD0, 0xA1,
+ 0xD0, 0xA2, 0xD0, 0x92, 0xD0, 0xA3, 0xD0, 0x99, 0xD0, 0xA2, 0xD0, 0x95,
+ '!', ' ', 'X', '=', '(', '-', 'B', 0xC2, 0xB1, 'S', 'Q', 'R', 'T', '(',
+ 'B', 0xC2, 0xB2, '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t casemapped[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'X', '=', '(', '-', 'B', 0xC2, 0xB1, 'S', 'q', 'r', 't', '(',
+ 'B', 0xC2, 0xB2, '-', '4', 'A', 'c', ')', ')', '/', '(', '2', 'A', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint8_t input[] = { 0xC5, 0x89 };
+ static const uint8_t casemapped[] = { 0xCA, 0xBC, 0x4E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint8_t input[] = { 0xCE, 0x90 };
+ static const uint8_t casemapped[] = { 0xCE, 0x99, 0xCC, 0x88, 0xCC, 0x81 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint8_t input[] = { 0x49 };
+ static const uint8_t casemapped[] = { 0x49 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint8_t input[] = { 0x69 };
+ static const uint8_t casemapped[] = { 0x49 };
+ static const uint8_t casemapped_tr[] = { 0xC4, 0xB0 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint8_t input[] = { 0xC4, 0xB0 };
+ static const uint8_t casemapped[] = { 0xC4, 0xB0 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint8_t input[] = { 0xC4, 0xB1 };
+ static const uint8_t casemapped[] = { 0x49 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint8_t input[] =
+ { 0x74, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+ static const uint8_t casemapped[] =
+ { 0x54, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint8_t input[] = { 0x68, 0x65, 0x69, 0xC3, 0x9F };
+ static const uint8_t casemapped[] = { 0x48, 0x65, 0x69, 0xC3, 0x9F };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint8_t input[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x82,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x82
+ };
+ static const uint8_t casemapped[] =
+ {
+ 0xCE, 0xA0, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x82,
+ ' ', 0xCE, 0xA0, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x82
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint8_t input[] = { 0xC7, 0xB0, 0xCC, 0xA3 };
+ static const uint8_t casemapped[] = { 0x4A, 0xCC, 0x8C, 0xCC, 0xA3 };
+ static const uint8_t casemapped_normalized[] = { 0x4A, 0xCC, 0xA3, 0xCC, 0x8C };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casemapped_normalized, SIZEOF (casemapped_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-u8-toupper.c b/gnulib/tests/unicase/test-u8-toupper.c
new file mode 100644
index 00000000..23e418fd
--- /dev/null
+++ b/gnulib/tests/unicase/test-u8-toupper.c
@@ -0,0 +1,204 @@
+/* Test of uppercase mapping for UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "uninorm.h"
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const char *iso639_language, uninorm_t nf,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_toupper (input, input_length, iso639_language, nf, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_toupper (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_toupper (input, input_length, iso639_language, nf, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
+ ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t casemapped[] =
+ { 'G', 'R', 0xC3, 0x9C, 0x53, 0x53, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0x94, 0xD0, 0xA0, 0xD0, 0x90, 0xD0, 0x92, 0xD0, 0xA1,
+ 0xD0, 0xA2, 0xD0, 0x92, 0xD0, 0xA3, 0xD0, 0x99, 0xD0, 0xA2, 0xD0, 0x95,
+ '!', ' ', 'X', '=', '(', '-', 'B', 0xC2, 0xB1, 'S', 'Q', 'R', 'T', '(',
+ 'B', 0xC2, 0xB2, '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const uint8_t input[] = { 0xC5, 0x89 };
+ static const uint8_t casemapped[] = { 0xCA, 0xBC, 0x4E };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const uint8_t input[] = { 0xCE, 0x90 };
+ static const uint8_t casemapped[] = { 0xCE, 0x99, 0xCC, 0x88, 0xCC, 0x81 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const uint8_t input[] = { 0x49 };
+ static const uint8_t casemapped[] = { 0x49 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const uint8_t input[] = { 0x69 };
+ static const uint8_t casemapped[] = { 0x49 };
+ static const uint8_t casemapped_tr[] = { 0xC4, 0xB0 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const uint8_t input[] = { 0xC4, 0xB0 };
+ static const uint8_t casemapped[] = { 0xC4, 0xB0 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const uint8_t input[] = { 0xC4, 0xB1 };
+ static const uint8_t casemapped[] = { 0x49 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+ { /* "topkapı" */
+ static const uint8_t input[] =
+ { 0x74, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+ static const uint8_t casemapped[] =
+ { 0x54, 0x4F, 0x50, 0x4B, 0x41, 0x50, 0x49 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const uint8_t input[] = { 0x68, 0x65, 0x69, 0xC3, 0x9F };
+ static const uint8_t casemapped[] = { 0x48, 0x45, 0x49, 0x53, 0x53 };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const uint8_t input[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x82,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x82
+ };
+ static const uint8_t casemapped[] =
+ {
+ 0xCE, 0xA0, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x99, 0xCE, 0xA3, 0xCE, 0xA3,
+ 0xCE, 0x8C, 0xCE, 0xA4, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x95, 0xCE, 0xA3,
+ ' ', 0xCE, 0xA0, 0xCE, 0x9B, 0xCE, 0x97, 0xCE, 0xA1, 0xCE, 0x9F,
+ 0xCE, 0xA6, 0xCE, 0x9F, 0xCE, 0xA1, 0xCE, 0x8A, 0xCE, 0x95, 0xCE, 0xA3
+ };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const uint8_t input[] = { 0xC7, 0xB0, 0xCC, 0xA3 };
+ static const uint8_t casemapped[] = { 0x4A, 0xCC, 0x8C, 0xCC, 0xA3 };
+ static const uint8_t casemapped_normalized[] = { 0x4A, 0xCC, 0xA3, 0xCC, 0x8C };
+ ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
+ ASSERT (check (input, SIZEOF (input), NULL, UNINORM_NFC, casemapped_normalized, SIZEOF (casemapped_normalized)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-uc_tolower.c b/gnulib/tests/unicase/test-uc_tolower.c
new file mode 100644
index 00000000..6ed3fde8
--- /dev/null
+++ b/gnulib/tests/unicase/test-uc_tolower.c
@@ -0,0 +1,1047 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character mapping functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Generated automatically by gen-case.c for Unicode 5.1.0. */
+
+#include "test-mapping-part1.h"
+
+ { 0x0041, 0x0061 },
+ { 0x0042, 0x0062 },
+ { 0x0043, 0x0063 },
+ { 0x0044, 0x0064 },
+ { 0x0045, 0x0065 },
+ { 0x0046, 0x0066 },
+ { 0x0047, 0x0067 },
+ { 0x0048, 0x0068 },
+ { 0x0049, 0x0069 },
+ { 0x004A, 0x006A },
+ { 0x004B, 0x006B },
+ { 0x004C, 0x006C },
+ { 0x004D, 0x006D },
+ { 0x004E, 0x006E },
+ { 0x004F, 0x006F },
+ { 0x0050, 0x0070 },
+ { 0x0051, 0x0071 },
+ { 0x0052, 0x0072 },
+ { 0x0053, 0x0073 },
+ { 0x0054, 0x0074 },
+ { 0x0055, 0x0075 },
+ { 0x0056, 0x0076 },
+ { 0x0057, 0x0077 },
+ { 0x0058, 0x0078 },
+ { 0x0059, 0x0079 },
+ { 0x005A, 0x007A },
+ { 0x00C0, 0x00E0 },
+ { 0x00C1, 0x00E1 },
+ { 0x00C2, 0x00E2 },
+ { 0x00C3, 0x00E3 },
+ { 0x00C4, 0x00E4 },
+ { 0x00C5, 0x00E5 },
+ { 0x00C6, 0x00E6 },
+ { 0x00C7, 0x00E7 },
+ { 0x00C8, 0x00E8 },
+ { 0x00C9, 0x00E9 },
+ { 0x00CA, 0x00EA },
+ { 0x00CB, 0x00EB },
+ { 0x00CC, 0x00EC },
+ { 0x00CD, 0x00ED },
+ { 0x00CE, 0x00EE },
+ { 0x00CF, 0x00EF },
+ { 0x00D0, 0x00F0 },
+ { 0x00D1, 0x00F1 },
+ { 0x00D2, 0x00F2 },
+ { 0x00D3, 0x00F3 },
+ { 0x00D4, 0x00F4 },
+ { 0x00D5, 0x00F5 },
+ { 0x00D6, 0x00F6 },
+ { 0x00D8, 0x00F8 },
+ { 0x00D9, 0x00F9 },
+ { 0x00DA, 0x00FA },
+ { 0x00DB, 0x00FB },
+ { 0x00DC, 0x00FC },
+ { 0x00DD, 0x00FD },
+ { 0x00DE, 0x00FE },
+ { 0x0100, 0x0101 },
+ { 0x0102, 0x0103 },
+ { 0x0104, 0x0105 },
+ { 0x0106, 0x0107 },
+ { 0x0108, 0x0109 },
+ { 0x010A, 0x010B },
+ { 0x010C, 0x010D },
+ { 0x010E, 0x010F },
+ { 0x0110, 0x0111 },
+ { 0x0112, 0x0113 },
+ { 0x0114, 0x0115 },
+ { 0x0116, 0x0117 },
+ { 0x0118, 0x0119 },
+ { 0x011A, 0x011B },
+ { 0x011C, 0x011D },
+ { 0x011E, 0x011F },
+ { 0x0120, 0x0121 },
+ { 0x0122, 0x0123 },
+ { 0x0124, 0x0125 },
+ { 0x0126, 0x0127 },
+ { 0x0128, 0x0129 },
+ { 0x012A, 0x012B },
+ { 0x012C, 0x012D },
+ { 0x012E, 0x012F },
+ { 0x0130, 0x0069 },
+ { 0x0132, 0x0133 },
+ { 0x0134, 0x0135 },
+ { 0x0136, 0x0137 },
+ { 0x0139, 0x013A },
+ { 0x013B, 0x013C },
+ { 0x013D, 0x013E },
+ { 0x013F, 0x0140 },
+ { 0x0141, 0x0142 },
+ { 0x0143, 0x0144 },
+ { 0x0145, 0x0146 },
+ { 0x0147, 0x0148 },
+ { 0x014A, 0x014B },
+ { 0x014C, 0x014D },
+ { 0x014E, 0x014F },
+ { 0x0150, 0x0151 },
+ { 0x0152, 0x0153 },
+ { 0x0154, 0x0155 },
+ { 0x0156, 0x0157 },
+ { 0x0158, 0x0159 },
+ { 0x015A, 0x015B },
+ { 0x015C, 0x015D },
+ { 0x015E, 0x015F },
+ { 0x0160, 0x0161 },
+ { 0x0162, 0x0163 },
+ { 0x0164, 0x0165 },
+ { 0x0166, 0x0167 },
+ { 0x0168, 0x0169 },
+ { 0x016A, 0x016B },
+ { 0x016C, 0x016D },
+ { 0x016E, 0x016F },
+ { 0x0170, 0x0171 },
+ { 0x0172, 0x0173 },
+ { 0x0174, 0x0175 },
+ { 0x0176, 0x0177 },
+ { 0x0178, 0x00FF },
+ { 0x0179, 0x017A },
+ { 0x017B, 0x017C },
+ { 0x017D, 0x017E },
+ { 0x0181, 0x0253 },
+ { 0x0182, 0x0183 },
+ { 0x0184, 0x0185 },
+ { 0x0186, 0x0254 },
+ { 0x0187, 0x0188 },
+ { 0x0189, 0x0256 },
+ { 0x018A, 0x0257 },
+ { 0x018B, 0x018C },
+ { 0x018E, 0x01DD },
+ { 0x018F, 0x0259 },
+ { 0x0190, 0x025B },
+ { 0x0191, 0x0192 },
+ { 0x0193, 0x0260 },
+ { 0x0194, 0x0263 },
+ { 0x0196, 0x0269 },
+ { 0x0197, 0x0268 },
+ { 0x0198, 0x0199 },
+ { 0x019C, 0x026F },
+ { 0x019D, 0x0272 },
+ { 0x019F, 0x0275 },
+ { 0x01A0, 0x01A1 },
+ { 0x01A2, 0x01A3 },
+ { 0x01A4, 0x01A5 },
+ { 0x01A6, 0x0280 },
+ { 0x01A7, 0x01A8 },
+ { 0x01A9, 0x0283 },
+ { 0x01AC, 0x01AD },
+ { 0x01AE, 0x0288 },
+ { 0x01AF, 0x01B0 },
+ { 0x01B1, 0x028A },
+ { 0x01B2, 0x028B },
+ { 0x01B3, 0x01B4 },
+ { 0x01B5, 0x01B6 },
+ { 0x01B7, 0x0292 },
+ { 0x01B8, 0x01B9 },
+ { 0x01BC, 0x01BD },
+ { 0x01C4, 0x01C6 },
+ { 0x01C5, 0x01C6 },
+ { 0x01C7, 0x01C9 },
+ { 0x01C8, 0x01C9 },
+ { 0x01CA, 0x01CC },
+ { 0x01CB, 0x01CC },
+ { 0x01CD, 0x01CE },
+ { 0x01CF, 0x01D0 },
+ { 0x01D1, 0x01D2 },
+ { 0x01D3, 0x01D4 },
+ { 0x01D5, 0x01D6 },
+ { 0x01D7, 0x01D8 },
+ { 0x01D9, 0x01DA },
+ { 0x01DB, 0x01DC },
+ { 0x01DE, 0x01DF },
+ { 0x01E0, 0x01E1 },
+ { 0x01E2, 0x01E3 },
+ { 0x01E4, 0x01E5 },
+ { 0x01E6, 0x01E7 },
+ { 0x01E8, 0x01E9 },
+ { 0x01EA, 0x01EB },
+ { 0x01EC, 0x01ED },
+ { 0x01EE, 0x01EF },
+ { 0x01F1, 0x01F3 },
+ { 0x01F2, 0x01F3 },
+ { 0x01F4, 0x01F5 },
+ { 0x01F6, 0x0195 },
+ { 0x01F7, 0x01BF },
+ { 0x01F8, 0x01F9 },
+ { 0x01FA, 0x01FB },
+ { 0x01FC, 0x01FD },
+ { 0x01FE, 0x01FF },
+ { 0x0200, 0x0201 },
+ { 0x0202, 0x0203 },
+ { 0x0204, 0x0205 },
+ { 0x0206, 0x0207 },
+ { 0x0208, 0x0209 },
+ { 0x020A, 0x020B },
+ { 0x020C, 0x020D },
+ { 0x020E, 0x020F },
+ { 0x0210, 0x0211 },
+ { 0x0212, 0x0213 },
+ { 0x0214, 0x0215 },
+ { 0x0216, 0x0217 },
+ { 0x0218, 0x0219 },
+ { 0x021A, 0x021B },
+ { 0x021C, 0x021D },
+ { 0x021E, 0x021F },
+ { 0x0220, 0x019E },
+ { 0x0222, 0x0223 },
+ { 0x0224, 0x0225 },
+ { 0x0226, 0x0227 },
+ { 0x0228, 0x0229 },
+ { 0x022A, 0x022B },
+ { 0x022C, 0x022D },
+ { 0x022E, 0x022F },
+ { 0x0230, 0x0231 },
+ { 0x0232, 0x0233 },
+ { 0x023A, 0x2C65 },
+ { 0x023B, 0x023C },
+ { 0x023D, 0x019A },
+ { 0x023E, 0x2C66 },
+ { 0x0241, 0x0242 },
+ { 0x0243, 0x0180 },
+ { 0x0244, 0x0289 },
+ { 0x0245, 0x028C },
+ { 0x0246, 0x0247 },
+ { 0x0248, 0x0249 },
+ { 0x024A, 0x024B },
+ { 0x024C, 0x024D },
+ { 0x024E, 0x024F },
+ { 0x0370, 0x0371 },
+ { 0x0372, 0x0373 },
+ { 0x0376, 0x0377 },
+ { 0x0386, 0x03AC },
+ { 0x0388, 0x03AD },
+ { 0x0389, 0x03AE },
+ { 0x038A, 0x03AF },
+ { 0x038C, 0x03CC },
+ { 0x038E, 0x03CD },
+ { 0x038F, 0x03CE },
+ { 0x0391, 0x03B1 },
+ { 0x0392, 0x03B2 },
+ { 0x0393, 0x03B3 },
+ { 0x0394, 0x03B4 },
+ { 0x0395, 0x03B5 },
+ { 0x0396, 0x03B6 },
+ { 0x0397, 0x03B7 },
+ { 0x0398, 0x03B8 },
+ { 0x0399, 0x03B9 },
+ { 0x039A, 0x03BA },
+ { 0x039B, 0x03BB },
+ { 0x039C, 0x03BC },
+ { 0x039D, 0x03BD },
+ { 0x039E, 0x03BE },
+ { 0x039F, 0x03BF },
+ { 0x03A0, 0x03C0 },
+ { 0x03A1, 0x03C1 },
+ { 0x03A3, 0x03C3 },
+ { 0x03A4, 0x03C4 },
+ { 0x03A5, 0x03C5 },
+ { 0x03A6, 0x03C6 },
+ { 0x03A7, 0x03C7 },
+ { 0x03A8, 0x03C8 },
+ { 0x03A9, 0x03C9 },
+ { 0x03AA, 0x03CA },
+ { 0x03AB, 0x03CB },
+ { 0x03CF, 0x03D7 },
+ { 0x03D8, 0x03D9 },
+ { 0x03DA, 0x03DB },
+ { 0x03DC, 0x03DD },
+ { 0x03DE, 0x03DF },
+ { 0x03E0, 0x03E1 },
+ { 0x03E2, 0x03E3 },
+ { 0x03E4, 0x03E5 },
+ { 0x03E6, 0x03E7 },
+ { 0x03E8, 0x03E9 },
+ { 0x03EA, 0x03EB },
+ { 0x03EC, 0x03ED },
+ { 0x03EE, 0x03EF },
+ { 0x03F4, 0x03B8 },
+ { 0x03F7, 0x03F8 },
+ { 0x03F9, 0x03F2 },
+ { 0x03FA, 0x03FB },
+ { 0x03FD, 0x037B },
+ { 0x03FE, 0x037C },
+ { 0x03FF, 0x037D },
+ { 0x0400, 0x0450 },
+ { 0x0401, 0x0451 },
+ { 0x0402, 0x0452 },
+ { 0x0403, 0x0453 },
+ { 0x0404, 0x0454 },
+ { 0x0405, 0x0455 },
+ { 0x0406, 0x0456 },
+ { 0x0407, 0x0457 },
+ { 0x0408, 0x0458 },
+ { 0x0409, 0x0459 },
+ { 0x040A, 0x045A },
+ { 0x040B, 0x045B },
+ { 0x040C, 0x045C },
+ { 0x040D, 0x045D },
+ { 0x040E, 0x045E },
+ { 0x040F, 0x045F },
+ { 0x0410, 0x0430 },
+ { 0x0411, 0x0431 },
+ { 0x0412, 0x0432 },
+ { 0x0413, 0x0433 },
+ { 0x0414, 0x0434 },
+ { 0x0415, 0x0435 },
+ { 0x0416, 0x0436 },
+ { 0x0417, 0x0437 },
+ { 0x0418, 0x0438 },
+ { 0x0419, 0x0439 },
+ { 0x041A, 0x043A },
+ { 0x041B, 0x043B },
+ { 0x041C, 0x043C },
+ { 0x041D, 0x043D },
+ { 0x041E, 0x043E },
+ { 0x041F, 0x043F },
+ { 0x0420, 0x0440 },
+ { 0x0421, 0x0441 },
+ { 0x0422, 0x0442 },
+ { 0x0423, 0x0443 },
+ { 0x0424, 0x0444 },
+ { 0x0425, 0x0445 },
+ { 0x0426, 0x0446 },
+ { 0x0427, 0x0447 },
+ { 0x0428, 0x0448 },
+ { 0x0429, 0x0449 },
+ { 0x042A, 0x044A },
+ { 0x042B, 0x044B },
+ { 0x042C, 0x044C },
+ { 0x042D, 0x044D },
+ { 0x042E, 0x044E },
+ { 0x042F, 0x044F },
+ { 0x0460, 0x0461 },
+ { 0x0462, 0x0463 },
+ { 0x0464, 0x0465 },
+ { 0x0466, 0x0467 },
+ { 0x0468, 0x0469 },
+ { 0x046A, 0x046B },
+ { 0x046C, 0x046D },
+ { 0x046E, 0x046F },
+ { 0x0470, 0x0471 },
+ { 0x0472, 0x0473 },
+ { 0x0474, 0x0475 },
+ { 0x0476, 0x0477 },
+ { 0x0478, 0x0479 },
+ { 0x047A, 0x047B },
+ { 0x047C, 0x047D },
+ { 0x047E, 0x047F },
+ { 0x0480, 0x0481 },
+ { 0x048A, 0x048B },
+ { 0x048C, 0x048D },
+ { 0x048E, 0x048F },
+ { 0x0490, 0x0491 },
+ { 0x0492, 0x0493 },
+ { 0x0494, 0x0495 },
+ { 0x0496, 0x0497 },
+ { 0x0498, 0x0499 },
+ { 0x049A, 0x049B },
+ { 0x049C, 0x049D },
+ { 0x049E, 0x049F },
+ { 0x04A0, 0x04A1 },
+ { 0x04A2, 0x04A3 },
+ { 0x04A4, 0x04A5 },
+ { 0x04A6, 0x04A7 },
+ { 0x04A8, 0x04A9 },
+ { 0x04AA, 0x04AB },
+ { 0x04AC, 0x04AD },
+ { 0x04AE, 0x04AF },
+ { 0x04B0, 0x04B1 },
+ { 0x04B2, 0x04B3 },
+ { 0x04B4, 0x04B5 },
+ { 0x04B6, 0x04B7 },
+ { 0x04B8, 0x04B9 },
+ { 0x04BA, 0x04BB },
+ { 0x04BC, 0x04BD },
+ { 0x04BE, 0x04BF },
+ { 0x04C0, 0x04CF },
+ { 0x04C1, 0x04C2 },
+ { 0x04C3, 0x04C4 },
+ { 0x04C5, 0x04C6 },
+ { 0x04C7, 0x04C8 },
+ { 0x04C9, 0x04CA },
+ { 0x04CB, 0x04CC },
+ { 0x04CD, 0x04CE },
+ { 0x04D0, 0x04D1 },
+ { 0x04D2, 0x04D3 },
+ { 0x04D4, 0x04D5 },
+ { 0x04D6, 0x04D7 },
+ { 0x04D8, 0x04D9 },
+ { 0x04DA, 0x04DB },
+ { 0x04DC, 0x04DD },
+ { 0x04DE, 0x04DF },
+ { 0x04E0, 0x04E1 },
+ { 0x04E2, 0x04E3 },
+ { 0x04E4, 0x04E5 },
+ { 0x04E6, 0x04E7 },
+ { 0x04E8, 0x04E9 },
+ { 0x04EA, 0x04EB },
+ { 0x04EC, 0x04ED },
+ { 0x04EE, 0x04EF },
+ { 0x04F0, 0x04F1 },
+ { 0x04F2, 0x04F3 },
+ { 0x04F4, 0x04F5 },
+ { 0x04F6, 0x04F7 },
+ { 0x04F8, 0x04F9 },
+ { 0x04FA, 0x04FB },
+ { 0x04FC, 0x04FD },
+ { 0x04FE, 0x04FF },
+ { 0x0500, 0x0501 },
+ { 0x0502, 0x0503 },
+ { 0x0504, 0x0505 },
+ { 0x0506, 0x0507 },
+ { 0x0508, 0x0509 },
+ { 0x050A, 0x050B },
+ { 0x050C, 0x050D },
+ { 0x050E, 0x050F },
+ { 0x0510, 0x0511 },
+ { 0x0512, 0x0513 },
+ { 0x0514, 0x0515 },
+ { 0x0516, 0x0517 },
+ { 0x0518, 0x0519 },
+ { 0x051A, 0x051B },
+ { 0x051C, 0x051D },
+ { 0x051E, 0x051F },
+ { 0x0520, 0x0521 },
+ { 0x0522, 0x0523 },
+ { 0x0531, 0x0561 },
+ { 0x0532, 0x0562 },
+ { 0x0533, 0x0563 },
+ { 0x0534, 0x0564 },
+ { 0x0535, 0x0565 },
+ { 0x0536, 0x0566 },
+ { 0x0537, 0x0567 },
+ { 0x0538, 0x0568 },
+ { 0x0539, 0x0569 },
+ { 0x053A, 0x056A },
+ { 0x053B, 0x056B },
+ { 0x053C, 0x056C },
+ { 0x053D, 0x056D },
+ { 0x053E, 0x056E },
+ { 0x053F, 0x056F },
+ { 0x0540, 0x0570 },
+ { 0x0541, 0x0571 },
+ { 0x0542, 0x0572 },
+ { 0x0543, 0x0573 },
+ { 0x0544, 0x0574 },
+ { 0x0545, 0x0575 },
+ { 0x0546, 0x0576 },
+ { 0x0547, 0x0577 },
+ { 0x0548, 0x0578 },
+ { 0x0549, 0x0579 },
+ { 0x054A, 0x057A },
+ { 0x054B, 0x057B },
+ { 0x054C, 0x057C },
+ { 0x054D, 0x057D },
+ { 0x054E, 0x057E },
+ { 0x054F, 0x057F },
+ { 0x0550, 0x0580 },
+ { 0x0551, 0x0581 },
+ { 0x0552, 0x0582 },
+ { 0x0553, 0x0583 },
+ { 0x0554, 0x0584 },
+ { 0x0555, 0x0585 },
+ { 0x0556, 0x0586 },
+ { 0x10A0, 0x2D00 },
+ { 0x10A1, 0x2D01 },
+ { 0x10A2, 0x2D02 },
+ { 0x10A3, 0x2D03 },
+ { 0x10A4, 0x2D04 },
+ { 0x10A5, 0x2D05 },
+ { 0x10A6, 0x2D06 },
+ { 0x10A7, 0x2D07 },
+ { 0x10A8, 0x2D08 },
+ { 0x10A9, 0x2D09 },
+ { 0x10AA, 0x2D0A },
+ { 0x10AB, 0x2D0B },
+ { 0x10AC, 0x2D0C },
+ { 0x10AD, 0x2D0D },
+ { 0x10AE, 0x2D0E },
+ { 0x10AF, 0x2D0F },
+ { 0x10B0, 0x2D10 },
+ { 0x10B1, 0x2D11 },
+ { 0x10B2, 0x2D12 },
+ { 0x10B3, 0x2D13 },
+ { 0x10B4, 0x2D14 },
+ { 0x10B5, 0x2D15 },
+ { 0x10B6, 0x2D16 },
+ { 0x10B7, 0x2D17 },
+ { 0x10B8, 0x2D18 },
+ { 0x10B9, 0x2D19 },
+ { 0x10BA, 0x2D1A },
+ { 0x10BB, 0x2D1B },
+ { 0x10BC, 0x2D1C },
+ { 0x10BD, 0x2D1D },
+ { 0x10BE, 0x2D1E },
+ { 0x10BF, 0x2D1F },
+ { 0x10C0, 0x2D20 },
+ { 0x10C1, 0x2D21 },
+ { 0x10C2, 0x2D22 },
+ { 0x10C3, 0x2D23 },
+ { 0x10C4, 0x2D24 },
+ { 0x10C5, 0x2D25 },
+ { 0x1E00, 0x1E01 },
+ { 0x1E02, 0x1E03 },
+ { 0x1E04, 0x1E05 },
+ { 0x1E06, 0x1E07 },
+ { 0x1E08, 0x1E09 },
+ { 0x1E0A, 0x1E0B },
+ { 0x1E0C, 0x1E0D },
+ { 0x1E0E, 0x1E0F },
+ { 0x1E10, 0x1E11 },
+ { 0x1E12, 0x1E13 },
+ { 0x1E14, 0x1E15 },
+ { 0x1E16, 0x1E17 },
+ { 0x1E18, 0x1E19 },
+ { 0x1E1A, 0x1E1B },
+ { 0x1E1C, 0x1E1D },
+ { 0x1E1E, 0x1E1F },
+ { 0x1E20, 0x1E21 },
+ { 0x1E22, 0x1E23 },
+ { 0x1E24, 0x1E25 },
+ { 0x1E26, 0x1E27 },
+ { 0x1E28, 0x1E29 },
+ { 0x1E2A, 0x1E2B },
+ { 0x1E2C, 0x1E2D },
+ { 0x1E2E, 0x1E2F },
+ { 0x1E30, 0x1E31 },
+ { 0x1E32, 0x1E33 },
+ { 0x1E34, 0x1E35 },
+ { 0x1E36, 0x1E37 },
+ { 0x1E38, 0x1E39 },
+ { 0x1E3A, 0x1E3B },
+ { 0x1E3C, 0x1E3D },
+ { 0x1E3E, 0x1E3F },
+ { 0x1E40, 0x1E41 },
+ { 0x1E42, 0x1E43 },
+ { 0x1E44, 0x1E45 },
+ { 0x1E46, 0x1E47 },
+ { 0x1E48, 0x1E49 },
+ { 0x1E4A, 0x1E4B },
+ { 0x1E4C, 0x1E4D },
+ { 0x1E4E, 0x1E4F },
+ { 0x1E50, 0x1E51 },
+ { 0x1E52, 0x1E53 },
+ { 0x1E54, 0x1E55 },
+ { 0x1E56, 0x1E57 },
+ { 0x1E58, 0x1E59 },
+ { 0x1E5A, 0x1E5B },
+ { 0x1E5C, 0x1E5D },
+ { 0x1E5E, 0x1E5F },
+ { 0x1E60, 0x1E61 },
+ { 0x1E62, 0x1E63 },
+ { 0x1E64, 0x1E65 },
+ { 0x1E66, 0x1E67 },
+ { 0x1E68, 0x1E69 },
+ { 0x1E6A, 0x1E6B },
+ { 0x1E6C, 0x1E6D },
+ { 0x1E6E, 0x1E6F },
+ { 0x1E70, 0x1E71 },
+ { 0x1E72, 0x1E73 },
+ { 0x1E74, 0x1E75 },
+ { 0x1E76, 0x1E77 },
+ { 0x1E78, 0x1E79 },
+ { 0x1E7A, 0x1E7B },
+ { 0x1E7C, 0x1E7D },
+ { 0x1E7E, 0x1E7F },
+ { 0x1E80, 0x1E81 },
+ { 0x1E82, 0x1E83 },
+ { 0x1E84, 0x1E85 },
+ { 0x1E86, 0x1E87 },
+ { 0x1E88, 0x1E89 },
+ { 0x1E8A, 0x1E8B },
+ { 0x1E8C, 0x1E8D },
+ { 0x1E8E, 0x1E8F },
+ { 0x1E90, 0x1E91 },
+ { 0x1E92, 0x1E93 },
+ { 0x1E94, 0x1E95 },
+ { 0x1E9E, 0x00DF },
+ { 0x1EA0, 0x1EA1 },
+ { 0x1EA2, 0x1EA3 },
+ { 0x1EA4, 0x1EA5 },
+ { 0x1EA6, 0x1EA7 },
+ { 0x1EA8, 0x1EA9 },
+ { 0x1EAA, 0x1EAB },
+ { 0x1EAC, 0x1EAD },
+ { 0x1EAE, 0x1EAF },
+ { 0x1EB0, 0x1EB1 },
+ { 0x1EB2, 0x1EB3 },
+ { 0x1EB4, 0x1EB5 },
+ { 0x1EB6, 0x1EB7 },
+ { 0x1EB8, 0x1EB9 },
+ { 0x1EBA, 0x1EBB },
+ { 0x1EBC, 0x1EBD },
+ { 0x1EBE, 0x1EBF },
+ { 0x1EC0, 0x1EC1 },
+ { 0x1EC2, 0x1EC3 },
+ { 0x1EC4, 0x1EC5 },
+ { 0x1EC6, 0x1EC7 },
+ { 0x1EC8, 0x1EC9 },
+ { 0x1ECA, 0x1ECB },
+ { 0x1ECC, 0x1ECD },
+ { 0x1ECE, 0x1ECF },
+ { 0x1ED0, 0x1ED1 },
+ { 0x1ED2, 0x1ED3 },
+ { 0x1ED4, 0x1ED5 },
+ { 0x1ED6, 0x1ED7 },
+ { 0x1ED8, 0x1ED9 },
+ { 0x1EDA, 0x1EDB },
+ { 0x1EDC, 0x1EDD },
+ { 0x1EDE, 0x1EDF },
+ { 0x1EE0, 0x1EE1 },
+ { 0x1EE2, 0x1EE3 },
+ { 0x1EE4, 0x1EE5 },
+ { 0x1EE6, 0x1EE7 },
+ { 0x1EE8, 0x1EE9 },
+ { 0x1EEA, 0x1EEB },
+ { 0x1EEC, 0x1EED },
+ { 0x1EEE, 0x1EEF },
+ { 0x1EF0, 0x1EF1 },
+ { 0x1EF2, 0x1EF3 },
+ { 0x1EF4, 0x1EF5 },
+ { 0x1EF6, 0x1EF7 },
+ { 0x1EF8, 0x1EF9 },
+ { 0x1EFA, 0x1EFB },
+ { 0x1EFC, 0x1EFD },
+ { 0x1EFE, 0x1EFF },
+ { 0x1F08, 0x1F00 },
+ { 0x1F09, 0x1F01 },
+ { 0x1F0A, 0x1F02 },
+ { 0x1F0B, 0x1F03 },
+ { 0x1F0C, 0x1F04 },
+ { 0x1F0D, 0x1F05 },
+ { 0x1F0E, 0x1F06 },
+ { 0x1F0F, 0x1F07 },
+ { 0x1F18, 0x1F10 },
+ { 0x1F19, 0x1F11 },
+ { 0x1F1A, 0x1F12 },
+ { 0x1F1B, 0x1F13 },
+ { 0x1F1C, 0x1F14 },
+ { 0x1F1D, 0x1F15 },
+ { 0x1F28, 0x1F20 },
+ { 0x1F29, 0x1F21 },
+ { 0x1F2A, 0x1F22 },
+ { 0x1F2B, 0x1F23 },
+ { 0x1F2C, 0x1F24 },
+ { 0x1F2D, 0x1F25 },
+ { 0x1F2E, 0x1F26 },
+ { 0x1F2F, 0x1F27 },
+ { 0x1F38, 0x1F30 },
+ { 0x1F39, 0x1F31 },
+ { 0x1F3A, 0x1F32 },
+ { 0x1F3B, 0x1F33 },
+ { 0x1F3C, 0x1F34 },
+ { 0x1F3D, 0x1F35 },
+ { 0x1F3E, 0x1F36 },
+ { 0x1F3F, 0x1F37 },
+ { 0x1F48, 0x1F40 },
+ { 0x1F49, 0x1F41 },
+ { 0x1F4A, 0x1F42 },
+ { 0x1F4B, 0x1F43 },
+ { 0x1F4C, 0x1F44 },
+ { 0x1F4D, 0x1F45 },
+ { 0x1F59, 0x1F51 },
+ { 0x1F5B, 0x1F53 },
+ { 0x1F5D, 0x1F55 },
+ { 0x1F5F, 0x1F57 },
+ { 0x1F68, 0x1F60 },
+ { 0x1F69, 0x1F61 },
+ { 0x1F6A, 0x1F62 },
+ { 0x1F6B, 0x1F63 },
+ { 0x1F6C, 0x1F64 },
+ { 0x1F6D, 0x1F65 },
+ { 0x1F6E, 0x1F66 },
+ { 0x1F6F, 0x1F67 },
+ { 0x1F88, 0x1F80 },
+ { 0x1F89, 0x1F81 },
+ { 0x1F8A, 0x1F82 },
+ { 0x1F8B, 0x1F83 },
+ { 0x1F8C, 0x1F84 },
+ { 0x1F8D, 0x1F85 },
+ { 0x1F8E, 0x1F86 },
+ { 0x1F8F, 0x1F87 },
+ { 0x1F98, 0x1F90 },
+ { 0x1F99, 0x1F91 },
+ { 0x1F9A, 0x1F92 },
+ { 0x1F9B, 0x1F93 },
+ { 0x1F9C, 0x1F94 },
+ { 0x1F9D, 0x1F95 },
+ { 0x1F9E, 0x1F96 },
+ { 0x1F9F, 0x1F97 },
+ { 0x1FA8, 0x1FA0 },
+ { 0x1FA9, 0x1FA1 },
+ { 0x1FAA, 0x1FA2 },
+ { 0x1FAB, 0x1FA3 },
+ { 0x1FAC, 0x1FA4 },
+ { 0x1FAD, 0x1FA5 },
+ { 0x1FAE, 0x1FA6 },
+ { 0x1FAF, 0x1FA7 },
+ { 0x1FB8, 0x1FB0 },
+ { 0x1FB9, 0x1FB1 },
+ { 0x1FBA, 0x1F70 },
+ { 0x1FBB, 0x1F71 },
+ { 0x1FBC, 0x1FB3 },
+ { 0x1FC8, 0x1F72 },
+ { 0x1FC9, 0x1F73 },
+ { 0x1FCA, 0x1F74 },
+ { 0x1FCB, 0x1F75 },
+ { 0x1FCC, 0x1FC3 },
+ { 0x1FD8, 0x1FD0 },
+ { 0x1FD9, 0x1FD1 },
+ { 0x1FDA, 0x1F76 },
+ { 0x1FDB, 0x1F77 },
+ { 0x1FE8, 0x1FE0 },
+ { 0x1FE9, 0x1FE1 },
+ { 0x1FEA, 0x1F7A },
+ { 0x1FEB, 0x1F7B },
+ { 0x1FEC, 0x1FE5 },
+ { 0x1FF8, 0x1F78 },
+ { 0x1FF9, 0x1F79 },
+ { 0x1FFA, 0x1F7C },
+ { 0x1FFB, 0x1F7D },
+ { 0x1FFC, 0x1FF3 },
+ { 0x2126, 0x03C9 },
+ { 0x212A, 0x006B },
+ { 0x212B, 0x00E5 },
+ { 0x2132, 0x214E },
+ { 0x2160, 0x2170 },
+ { 0x2161, 0x2171 },
+ { 0x2162, 0x2172 },
+ { 0x2163, 0x2173 },
+ { 0x2164, 0x2174 },
+ { 0x2165, 0x2175 },
+ { 0x2166, 0x2176 },
+ { 0x2167, 0x2177 },
+ { 0x2168, 0x2178 },
+ { 0x2169, 0x2179 },
+ { 0x216A, 0x217A },
+ { 0x216B, 0x217B },
+ { 0x216C, 0x217C },
+ { 0x216D, 0x217D },
+ { 0x216E, 0x217E },
+ { 0x216F, 0x217F },
+ { 0x2183, 0x2184 },
+ { 0x24B6, 0x24D0 },
+ { 0x24B7, 0x24D1 },
+ { 0x24B8, 0x24D2 },
+ { 0x24B9, 0x24D3 },
+ { 0x24BA, 0x24D4 },
+ { 0x24BB, 0x24D5 },
+ { 0x24BC, 0x24D6 },
+ { 0x24BD, 0x24D7 },
+ { 0x24BE, 0x24D8 },
+ { 0x24BF, 0x24D9 },
+ { 0x24C0, 0x24DA },
+ { 0x24C1, 0x24DB },
+ { 0x24C2, 0x24DC },
+ { 0x24C3, 0x24DD },
+ { 0x24C4, 0x24DE },
+ { 0x24C5, 0x24DF },
+ { 0x24C6, 0x24E0 },
+ { 0x24C7, 0x24E1 },
+ { 0x24C8, 0x24E2 },
+ { 0x24C9, 0x24E3 },
+ { 0x24CA, 0x24E4 },
+ { 0x24CB, 0x24E5 },
+ { 0x24CC, 0x24E6 },
+ { 0x24CD, 0x24E7 },
+ { 0x24CE, 0x24E8 },
+ { 0x24CF, 0x24E9 },
+ { 0x2C00, 0x2C30 },
+ { 0x2C01, 0x2C31 },
+ { 0x2C02, 0x2C32 },
+ { 0x2C03, 0x2C33 },
+ { 0x2C04, 0x2C34 },
+ { 0x2C05, 0x2C35 },
+ { 0x2C06, 0x2C36 },
+ { 0x2C07, 0x2C37 },
+ { 0x2C08, 0x2C38 },
+ { 0x2C09, 0x2C39 },
+ { 0x2C0A, 0x2C3A },
+ { 0x2C0B, 0x2C3B },
+ { 0x2C0C, 0x2C3C },
+ { 0x2C0D, 0x2C3D },
+ { 0x2C0E, 0x2C3E },
+ { 0x2C0F, 0x2C3F },
+ { 0x2C10, 0x2C40 },
+ { 0x2C11, 0x2C41 },
+ { 0x2C12, 0x2C42 },
+ { 0x2C13, 0x2C43 },
+ { 0x2C14, 0x2C44 },
+ { 0x2C15, 0x2C45 },
+ { 0x2C16, 0x2C46 },
+ { 0x2C17, 0x2C47 },
+ { 0x2C18, 0x2C48 },
+ { 0x2C19, 0x2C49 },
+ { 0x2C1A, 0x2C4A },
+ { 0x2C1B, 0x2C4B },
+ { 0x2C1C, 0x2C4C },
+ { 0x2C1D, 0x2C4D },
+ { 0x2C1E, 0x2C4E },
+ { 0x2C1F, 0x2C4F },
+ { 0x2C20, 0x2C50 },
+ { 0x2C21, 0x2C51 },
+ { 0x2C22, 0x2C52 },
+ { 0x2C23, 0x2C53 },
+ { 0x2C24, 0x2C54 },
+ { 0x2C25, 0x2C55 },
+ { 0x2C26, 0x2C56 },
+ { 0x2C27, 0x2C57 },
+ { 0x2C28, 0x2C58 },
+ { 0x2C29, 0x2C59 },
+ { 0x2C2A, 0x2C5A },
+ { 0x2C2B, 0x2C5B },
+ { 0x2C2C, 0x2C5C },
+ { 0x2C2D, 0x2C5D },
+ { 0x2C2E, 0x2C5E },
+ { 0x2C60, 0x2C61 },
+ { 0x2C62, 0x026B },
+ { 0x2C63, 0x1D7D },
+ { 0x2C64, 0x027D },
+ { 0x2C67, 0x2C68 },
+ { 0x2C69, 0x2C6A },
+ { 0x2C6B, 0x2C6C },
+ { 0x2C6D, 0x0251 },
+ { 0x2C6E, 0x0271 },
+ { 0x2C6F, 0x0250 },
+ { 0x2C72, 0x2C73 },
+ { 0x2C75, 0x2C76 },
+ { 0x2C80, 0x2C81 },
+ { 0x2C82, 0x2C83 },
+ { 0x2C84, 0x2C85 },
+ { 0x2C86, 0x2C87 },
+ { 0x2C88, 0x2C89 },
+ { 0x2C8A, 0x2C8B },
+ { 0x2C8C, 0x2C8D },
+ { 0x2C8E, 0x2C8F },
+ { 0x2C90, 0x2C91 },
+ { 0x2C92, 0x2C93 },
+ { 0x2C94, 0x2C95 },
+ { 0x2C96, 0x2C97 },
+ { 0x2C98, 0x2C99 },
+ { 0x2C9A, 0x2C9B },
+ { 0x2C9C, 0x2C9D },
+ { 0x2C9E, 0x2C9F },
+ { 0x2CA0, 0x2CA1 },
+ { 0x2CA2, 0x2CA3 },
+ { 0x2CA4, 0x2CA5 },
+ { 0x2CA6, 0x2CA7 },
+ { 0x2CA8, 0x2CA9 },
+ { 0x2CAA, 0x2CAB },
+ { 0x2CAC, 0x2CAD },
+ { 0x2CAE, 0x2CAF },
+ { 0x2CB0, 0x2CB1 },
+ { 0x2CB2, 0x2CB3 },
+ { 0x2CB4, 0x2CB5 },
+ { 0x2CB6, 0x2CB7 },
+ { 0x2CB8, 0x2CB9 },
+ { 0x2CBA, 0x2CBB },
+ { 0x2CBC, 0x2CBD },
+ { 0x2CBE, 0x2CBF },
+ { 0x2CC0, 0x2CC1 },
+ { 0x2CC2, 0x2CC3 },
+ { 0x2CC4, 0x2CC5 },
+ { 0x2CC6, 0x2CC7 },
+ { 0x2CC8, 0x2CC9 },
+ { 0x2CCA, 0x2CCB },
+ { 0x2CCC, 0x2CCD },
+ { 0x2CCE, 0x2CCF },
+ { 0x2CD0, 0x2CD1 },
+ { 0x2CD2, 0x2CD3 },
+ { 0x2CD4, 0x2CD5 },
+ { 0x2CD6, 0x2CD7 },
+ { 0x2CD8, 0x2CD9 },
+ { 0x2CDA, 0x2CDB },
+ { 0x2CDC, 0x2CDD },
+ { 0x2CDE, 0x2CDF },
+ { 0x2CE0, 0x2CE1 },
+ { 0x2CE2, 0x2CE3 },
+ { 0xA640, 0xA641 },
+ { 0xA642, 0xA643 },
+ { 0xA644, 0xA645 },
+ { 0xA646, 0xA647 },
+ { 0xA648, 0xA649 },
+ { 0xA64A, 0xA64B },
+ { 0xA64C, 0xA64D },
+ { 0xA64E, 0xA64F },
+ { 0xA650, 0xA651 },
+ { 0xA652, 0xA653 },
+ { 0xA654, 0xA655 },
+ { 0xA656, 0xA657 },
+ { 0xA658, 0xA659 },
+ { 0xA65A, 0xA65B },
+ { 0xA65C, 0xA65D },
+ { 0xA65E, 0xA65F },
+ { 0xA662, 0xA663 },
+ { 0xA664, 0xA665 },
+ { 0xA666, 0xA667 },
+ { 0xA668, 0xA669 },
+ { 0xA66A, 0xA66B },
+ { 0xA66C, 0xA66D },
+ { 0xA680, 0xA681 },
+ { 0xA682, 0xA683 },
+ { 0xA684, 0xA685 },
+ { 0xA686, 0xA687 },
+ { 0xA688, 0xA689 },
+ { 0xA68A, 0xA68B },
+ { 0xA68C, 0xA68D },
+ { 0xA68E, 0xA68F },
+ { 0xA690, 0xA691 },
+ { 0xA692, 0xA693 },
+ { 0xA694, 0xA695 },
+ { 0xA696, 0xA697 },
+ { 0xA722, 0xA723 },
+ { 0xA724, 0xA725 },
+ { 0xA726, 0xA727 },
+ { 0xA728, 0xA729 },
+ { 0xA72A, 0xA72B },
+ { 0xA72C, 0xA72D },
+ { 0xA72E, 0xA72F },
+ { 0xA732, 0xA733 },
+ { 0xA734, 0xA735 },
+ { 0xA736, 0xA737 },
+ { 0xA738, 0xA739 },
+ { 0xA73A, 0xA73B },
+ { 0xA73C, 0xA73D },
+ { 0xA73E, 0xA73F },
+ { 0xA740, 0xA741 },
+ { 0xA742, 0xA743 },
+ { 0xA744, 0xA745 },
+ { 0xA746, 0xA747 },
+ { 0xA748, 0xA749 },
+ { 0xA74A, 0xA74B },
+ { 0xA74C, 0xA74D },
+ { 0xA74E, 0xA74F },
+ { 0xA750, 0xA751 },
+ { 0xA752, 0xA753 },
+ { 0xA754, 0xA755 },
+ { 0xA756, 0xA757 },
+ { 0xA758, 0xA759 },
+ { 0xA75A, 0xA75B },
+ { 0xA75C, 0xA75D },
+ { 0xA75E, 0xA75F },
+ { 0xA760, 0xA761 },
+ { 0xA762, 0xA763 },
+ { 0xA764, 0xA765 },
+ { 0xA766, 0xA767 },
+ { 0xA768, 0xA769 },
+ { 0xA76A, 0xA76B },
+ { 0xA76C, 0xA76D },
+ { 0xA76E, 0xA76F },
+ { 0xA779, 0xA77A },
+ { 0xA77B, 0xA77C },
+ { 0xA77D, 0x1D79 },
+ { 0xA77E, 0xA77F },
+ { 0xA780, 0xA781 },
+ { 0xA782, 0xA783 },
+ { 0xA784, 0xA785 },
+ { 0xA786, 0xA787 },
+ { 0xA78B, 0xA78C },
+ { 0xFF21, 0xFF41 },
+ { 0xFF22, 0xFF42 },
+ { 0xFF23, 0xFF43 },
+ { 0xFF24, 0xFF44 },
+ { 0xFF25, 0xFF45 },
+ { 0xFF26, 0xFF46 },
+ { 0xFF27, 0xFF47 },
+ { 0xFF28, 0xFF48 },
+ { 0xFF29, 0xFF49 },
+ { 0xFF2A, 0xFF4A },
+ { 0xFF2B, 0xFF4B },
+ { 0xFF2C, 0xFF4C },
+ { 0xFF2D, 0xFF4D },
+ { 0xFF2E, 0xFF4E },
+ { 0xFF2F, 0xFF4F },
+ { 0xFF30, 0xFF50 },
+ { 0xFF31, 0xFF51 },
+ { 0xFF32, 0xFF52 },
+ { 0xFF33, 0xFF53 },
+ { 0xFF34, 0xFF54 },
+ { 0xFF35, 0xFF55 },
+ { 0xFF36, 0xFF56 },
+ { 0xFF37, 0xFF57 },
+ { 0xFF38, 0xFF58 },
+ { 0xFF39, 0xFF59 },
+ { 0xFF3A, 0xFF5A },
+ { 0x10400, 0x10428 },
+ { 0x10401, 0x10429 },
+ { 0x10402, 0x1042A },
+ { 0x10403, 0x1042B },
+ { 0x10404, 0x1042C },
+ { 0x10405, 0x1042D },
+ { 0x10406, 0x1042E },
+ { 0x10407, 0x1042F },
+ { 0x10408, 0x10430 },
+ { 0x10409, 0x10431 },
+ { 0x1040A, 0x10432 },
+ { 0x1040B, 0x10433 },
+ { 0x1040C, 0x10434 },
+ { 0x1040D, 0x10435 },
+ { 0x1040E, 0x10436 },
+ { 0x1040F, 0x10437 },
+ { 0x10410, 0x10438 },
+ { 0x10411, 0x10439 },
+ { 0x10412, 0x1043A },
+ { 0x10413, 0x1043B },
+ { 0x10414, 0x1043C },
+ { 0x10415, 0x1043D },
+ { 0x10416, 0x1043E },
+ { 0x10417, 0x1043F },
+ { 0x10418, 0x10440 },
+ { 0x10419, 0x10441 },
+ { 0x1041A, 0x10442 },
+ { 0x1041B, 0x10443 },
+ { 0x1041C, 0x10444 },
+ { 0x1041D, 0x10445 },
+ { 0x1041E, 0x10446 },
+ { 0x1041F, 0x10447 },
+ { 0x10420, 0x10448 },
+ { 0x10421, 0x10449 },
+ { 0x10422, 0x1044A },
+ { 0x10423, 0x1044B },
+ { 0x10424, 0x1044C },
+ { 0x10425, 0x1044D },
+ { 0x10426, 0x1044E },
+ { 0x10427, 0x1044F }
+
+#define MAP(c) uc_tolower (c)
+#include "test-mapping-part2.h"
diff --git a/gnulib/tests/unicase/test-uc_totitle.c b/gnulib/tests/unicase/test-uc_totitle.c
new file mode 100644
index 00000000..e187bd4b
--- /dev/null
+++ b/gnulib/tests/unicase/test-uc_totitle.c
@@ -0,0 +1,1055 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character mapping functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Generated automatically by gen-case.c for Unicode 5.1.0. */
+
+#include "test-mapping-part1.h"
+
+ { 0x0061, 0x0041 },
+ { 0x0062, 0x0042 },
+ { 0x0063, 0x0043 },
+ { 0x0064, 0x0044 },
+ { 0x0065, 0x0045 },
+ { 0x0066, 0x0046 },
+ { 0x0067, 0x0047 },
+ { 0x0068, 0x0048 },
+ { 0x0069, 0x0049 },
+ { 0x006A, 0x004A },
+ { 0x006B, 0x004B },
+ { 0x006C, 0x004C },
+ { 0x006D, 0x004D },
+ { 0x006E, 0x004E },
+ { 0x006F, 0x004F },
+ { 0x0070, 0x0050 },
+ { 0x0071, 0x0051 },
+ { 0x0072, 0x0052 },
+ { 0x0073, 0x0053 },
+ { 0x0074, 0x0054 },
+ { 0x0075, 0x0055 },
+ { 0x0076, 0x0056 },
+ { 0x0077, 0x0057 },
+ { 0x0078, 0x0058 },
+ { 0x0079, 0x0059 },
+ { 0x007A, 0x005A },
+ { 0x00B5, 0x039C },
+ { 0x00E0, 0x00C0 },
+ { 0x00E1, 0x00C1 },
+ { 0x00E2, 0x00C2 },
+ { 0x00E3, 0x00C3 },
+ { 0x00E4, 0x00C4 },
+ { 0x00E5, 0x00C5 },
+ { 0x00E6, 0x00C6 },
+ { 0x00E7, 0x00C7 },
+ { 0x00E8, 0x00C8 },
+ { 0x00E9, 0x00C9 },
+ { 0x00EA, 0x00CA },
+ { 0x00EB, 0x00CB },
+ { 0x00EC, 0x00CC },
+ { 0x00ED, 0x00CD },
+ { 0x00EE, 0x00CE },
+ { 0x00EF, 0x00CF },
+ { 0x00F0, 0x00D0 },
+ { 0x00F1, 0x00D1 },
+ { 0x00F2, 0x00D2 },
+ { 0x00F3, 0x00D3 },
+ { 0x00F4, 0x00D4 },
+ { 0x00F5, 0x00D5 },
+ { 0x00F6, 0x00D6 },
+ { 0x00F8, 0x00D8 },
+ { 0x00F9, 0x00D9 },
+ { 0x00FA, 0x00DA },
+ { 0x00FB, 0x00DB },
+ { 0x00FC, 0x00DC },
+ { 0x00FD, 0x00DD },
+ { 0x00FE, 0x00DE },
+ { 0x00FF, 0x0178 },
+ { 0x0101, 0x0100 },
+ { 0x0103, 0x0102 },
+ { 0x0105, 0x0104 },
+ { 0x0107, 0x0106 },
+ { 0x0109, 0x0108 },
+ { 0x010B, 0x010A },
+ { 0x010D, 0x010C },
+ { 0x010F, 0x010E },
+ { 0x0111, 0x0110 },
+ { 0x0113, 0x0112 },
+ { 0x0115, 0x0114 },
+ { 0x0117, 0x0116 },
+ { 0x0119, 0x0118 },
+ { 0x011B, 0x011A },
+ { 0x011D, 0x011C },
+ { 0x011F, 0x011E },
+ { 0x0121, 0x0120 },
+ { 0x0123, 0x0122 },
+ { 0x0125, 0x0124 },
+ { 0x0127, 0x0126 },
+ { 0x0129, 0x0128 },
+ { 0x012B, 0x012A },
+ { 0x012D, 0x012C },
+ { 0x012F, 0x012E },
+ { 0x0131, 0x0049 },
+ { 0x0133, 0x0132 },
+ { 0x0135, 0x0134 },
+ { 0x0137, 0x0136 },
+ { 0x013A, 0x0139 },
+ { 0x013C, 0x013B },
+ { 0x013E, 0x013D },
+ { 0x0140, 0x013F },
+ { 0x0142, 0x0141 },
+ { 0x0144, 0x0143 },
+ { 0x0146, 0x0145 },
+ { 0x0148, 0x0147 },
+ { 0x014B, 0x014A },
+ { 0x014D, 0x014C },
+ { 0x014F, 0x014E },
+ { 0x0151, 0x0150 },
+ { 0x0153, 0x0152 },
+ { 0x0155, 0x0154 },
+ { 0x0157, 0x0156 },
+ { 0x0159, 0x0158 },
+ { 0x015B, 0x015A },
+ { 0x015D, 0x015C },
+ { 0x015F, 0x015E },
+ { 0x0161, 0x0160 },
+ { 0x0163, 0x0162 },
+ { 0x0165, 0x0164 },
+ { 0x0167, 0x0166 },
+ { 0x0169, 0x0168 },
+ { 0x016B, 0x016A },
+ { 0x016D, 0x016C },
+ { 0x016F, 0x016E },
+ { 0x0171, 0x0170 },
+ { 0x0173, 0x0172 },
+ { 0x0175, 0x0174 },
+ { 0x0177, 0x0176 },
+ { 0x017A, 0x0179 },
+ { 0x017C, 0x017B },
+ { 0x017E, 0x017D },
+ { 0x017F, 0x0053 },
+ { 0x0180, 0x0243 },
+ { 0x0183, 0x0182 },
+ { 0x0185, 0x0184 },
+ { 0x0188, 0x0187 },
+ { 0x018C, 0x018B },
+ { 0x0192, 0x0191 },
+ { 0x0195, 0x01F6 },
+ { 0x0199, 0x0198 },
+ { 0x019A, 0x023D },
+ { 0x019E, 0x0220 },
+ { 0x01A1, 0x01A0 },
+ { 0x01A3, 0x01A2 },
+ { 0x01A5, 0x01A4 },
+ { 0x01A8, 0x01A7 },
+ { 0x01AD, 0x01AC },
+ { 0x01B0, 0x01AF },
+ { 0x01B4, 0x01B3 },
+ { 0x01B6, 0x01B5 },
+ { 0x01B9, 0x01B8 },
+ { 0x01BD, 0x01BC },
+ { 0x01BF, 0x01F7 },
+ { 0x01C4, 0x01C5 },
+ { 0x01C6, 0x01C5 },
+ { 0x01C7, 0x01C8 },
+ { 0x01C9, 0x01C8 },
+ { 0x01CA, 0x01CB },
+ { 0x01CC, 0x01CB },
+ { 0x01CE, 0x01CD },
+ { 0x01D0, 0x01CF },
+ { 0x01D2, 0x01D1 },
+ { 0x01D4, 0x01D3 },
+ { 0x01D6, 0x01D5 },
+ { 0x01D8, 0x01D7 },
+ { 0x01DA, 0x01D9 },
+ { 0x01DC, 0x01DB },
+ { 0x01DD, 0x018E },
+ { 0x01DF, 0x01DE },
+ { 0x01E1, 0x01E0 },
+ { 0x01E3, 0x01E2 },
+ { 0x01E5, 0x01E4 },
+ { 0x01E7, 0x01E6 },
+ { 0x01E9, 0x01E8 },
+ { 0x01EB, 0x01EA },
+ { 0x01ED, 0x01EC },
+ { 0x01EF, 0x01EE },
+ { 0x01F1, 0x01F2 },
+ { 0x01F3, 0x01F2 },
+ { 0x01F5, 0x01F4 },
+ { 0x01F9, 0x01F8 },
+ { 0x01FB, 0x01FA },
+ { 0x01FD, 0x01FC },
+ { 0x01FF, 0x01FE },
+ { 0x0201, 0x0200 },
+ { 0x0203, 0x0202 },
+ { 0x0205, 0x0204 },
+ { 0x0207, 0x0206 },
+ { 0x0209, 0x0208 },
+ { 0x020B, 0x020A },
+ { 0x020D, 0x020C },
+ { 0x020F, 0x020E },
+ { 0x0211, 0x0210 },
+ { 0x0213, 0x0212 },
+ { 0x0215, 0x0214 },
+ { 0x0217, 0x0216 },
+ { 0x0219, 0x0218 },
+ { 0x021B, 0x021A },
+ { 0x021D, 0x021C },
+ { 0x021F, 0x021E },
+ { 0x0223, 0x0222 },
+ { 0x0225, 0x0224 },
+ { 0x0227, 0x0226 },
+ { 0x0229, 0x0228 },
+ { 0x022B, 0x022A },
+ { 0x022D, 0x022C },
+ { 0x022F, 0x022E },
+ { 0x0231, 0x0230 },
+ { 0x0233, 0x0232 },
+ { 0x023C, 0x023B },
+ { 0x0242, 0x0241 },
+ { 0x0247, 0x0246 },
+ { 0x0249, 0x0248 },
+ { 0x024B, 0x024A },
+ { 0x024D, 0x024C },
+ { 0x024F, 0x024E },
+ { 0x0250, 0x2C6F },
+ { 0x0251, 0x2C6D },
+ { 0x0253, 0x0181 },
+ { 0x0254, 0x0186 },
+ { 0x0256, 0x0189 },
+ { 0x0257, 0x018A },
+ { 0x0259, 0x018F },
+ { 0x025B, 0x0190 },
+ { 0x0260, 0x0193 },
+ { 0x0263, 0x0194 },
+ { 0x0268, 0x0197 },
+ { 0x0269, 0x0196 },
+ { 0x026B, 0x2C62 },
+ { 0x026F, 0x019C },
+ { 0x0271, 0x2C6E },
+ { 0x0272, 0x019D },
+ { 0x0275, 0x019F },
+ { 0x027D, 0x2C64 },
+ { 0x0280, 0x01A6 },
+ { 0x0283, 0x01A9 },
+ { 0x0288, 0x01AE },
+ { 0x0289, 0x0244 },
+ { 0x028A, 0x01B1 },
+ { 0x028B, 0x01B2 },
+ { 0x028C, 0x0245 },
+ { 0x0292, 0x01B7 },
+ { 0x0345, 0x0399 },
+ { 0x0371, 0x0370 },
+ { 0x0373, 0x0372 },
+ { 0x0377, 0x0376 },
+ { 0x037B, 0x03FD },
+ { 0x037C, 0x03FE },
+ { 0x037D, 0x03FF },
+ { 0x03AC, 0x0386 },
+ { 0x03AD, 0x0388 },
+ { 0x03AE, 0x0389 },
+ { 0x03AF, 0x038A },
+ { 0x03B1, 0x0391 },
+ { 0x03B2, 0x0392 },
+ { 0x03B3, 0x0393 },
+ { 0x03B4, 0x0394 },
+ { 0x03B5, 0x0395 },
+ { 0x03B6, 0x0396 },
+ { 0x03B7, 0x0397 },
+ { 0x03B8, 0x0398 },
+ { 0x03B9, 0x0399 },
+ { 0x03BA, 0x039A },
+ { 0x03BB, 0x039B },
+ { 0x03BC, 0x039C },
+ { 0x03BD, 0x039D },
+ { 0x03BE, 0x039E },
+ { 0x03BF, 0x039F },
+ { 0x03C0, 0x03A0 },
+ { 0x03C1, 0x03A1 },
+ { 0x03C2, 0x03A3 },
+ { 0x03C3, 0x03A3 },
+ { 0x03C4, 0x03A4 },
+ { 0x03C5, 0x03A5 },
+ { 0x03C6, 0x03A6 },
+ { 0x03C7, 0x03A7 },
+ { 0x03C8, 0x03A8 },
+ { 0x03C9, 0x03A9 },
+ { 0x03CA, 0x03AA },
+ { 0x03CB, 0x03AB },
+ { 0x03CC, 0x038C },
+ { 0x03CD, 0x038E },
+ { 0x03CE, 0x038F },
+ { 0x03D0, 0x0392 },
+ { 0x03D1, 0x0398 },
+ { 0x03D5, 0x03A6 },
+ { 0x03D6, 0x03A0 },
+ { 0x03D7, 0x03CF },
+ { 0x03D9, 0x03D8 },
+ { 0x03DB, 0x03DA },
+ { 0x03DD, 0x03DC },
+ { 0x03DF, 0x03DE },
+ { 0x03E1, 0x03E0 },
+ { 0x03E3, 0x03E2 },
+ { 0x03E5, 0x03E4 },
+ { 0x03E7, 0x03E6 },
+ { 0x03E9, 0x03E8 },
+ { 0x03EB, 0x03EA },
+ { 0x03ED, 0x03EC },
+ { 0x03EF, 0x03EE },
+ { 0x03F0, 0x039A },
+ { 0x03F1, 0x03A1 },
+ { 0x03F2, 0x03F9 },
+ { 0x03F5, 0x0395 },
+ { 0x03F8, 0x03F7 },
+ { 0x03FB, 0x03FA },
+ { 0x0430, 0x0410 },
+ { 0x0431, 0x0411 },
+ { 0x0432, 0x0412 },
+ { 0x0433, 0x0413 },
+ { 0x0434, 0x0414 },
+ { 0x0435, 0x0415 },
+ { 0x0436, 0x0416 },
+ { 0x0437, 0x0417 },
+ { 0x0438, 0x0418 },
+ { 0x0439, 0x0419 },
+ { 0x043A, 0x041A },
+ { 0x043B, 0x041B },
+ { 0x043C, 0x041C },
+ { 0x043D, 0x041D },
+ { 0x043E, 0x041E },
+ { 0x043F, 0x041F },
+ { 0x0440, 0x0420 },
+ { 0x0441, 0x0421 },
+ { 0x0442, 0x0422 },
+ { 0x0443, 0x0423 },
+ { 0x0444, 0x0424 },
+ { 0x0445, 0x0425 },
+ { 0x0446, 0x0426 },
+ { 0x0447, 0x0427 },
+ { 0x0448, 0x0428 },
+ { 0x0449, 0x0429 },
+ { 0x044A, 0x042A },
+ { 0x044B, 0x042B },
+ { 0x044C, 0x042C },
+ { 0x044D, 0x042D },
+ { 0x044E, 0x042E },
+ { 0x044F, 0x042F },
+ { 0x0450, 0x0400 },
+ { 0x0451, 0x0401 },
+ { 0x0452, 0x0402 },
+ { 0x0453, 0x0403 },
+ { 0x0454, 0x0404 },
+ { 0x0455, 0x0405 },
+ { 0x0456, 0x0406 },
+ { 0x0457, 0x0407 },
+ { 0x0458, 0x0408 },
+ { 0x0459, 0x0409 },
+ { 0x045A, 0x040A },
+ { 0x045B, 0x040B },
+ { 0x045C, 0x040C },
+ { 0x045D, 0x040D },
+ { 0x045E, 0x040E },
+ { 0x045F, 0x040F },
+ { 0x0461, 0x0460 },
+ { 0x0463, 0x0462 },
+ { 0x0465, 0x0464 },
+ { 0x0467, 0x0466 },
+ { 0x0469, 0x0468 },
+ { 0x046B, 0x046A },
+ { 0x046D, 0x046C },
+ { 0x046F, 0x046E },
+ { 0x0471, 0x0470 },
+ { 0x0473, 0x0472 },
+ { 0x0475, 0x0474 },
+ { 0x0477, 0x0476 },
+ { 0x0479, 0x0478 },
+ { 0x047B, 0x047A },
+ { 0x047D, 0x047C },
+ { 0x047F, 0x047E },
+ { 0x0481, 0x0480 },
+ { 0x048B, 0x048A },
+ { 0x048D, 0x048C },
+ { 0x048F, 0x048E },
+ { 0x0491, 0x0490 },
+ { 0x0493, 0x0492 },
+ { 0x0495, 0x0494 },
+ { 0x0497, 0x0496 },
+ { 0x0499, 0x0498 },
+ { 0x049B, 0x049A },
+ { 0x049D, 0x049C },
+ { 0x049F, 0x049E },
+ { 0x04A1, 0x04A0 },
+ { 0x04A3, 0x04A2 },
+ { 0x04A5, 0x04A4 },
+ { 0x04A7, 0x04A6 },
+ { 0x04A9, 0x04A8 },
+ { 0x04AB, 0x04AA },
+ { 0x04AD, 0x04AC },
+ { 0x04AF, 0x04AE },
+ { 0x04B1, 0x04B0 },
+ { 0x04B3, 0x04B2 },
+ { 0x04B5, 0x04B4 },
+ { 0x04B7, 0x04B6 },
+ { 0x04B9, 0x04B8 },
+ { 0x04BB, 0x04BA },
+ { 0x04BD, 0x04BC },
+ { 0x04BF, 0x04BE },
+ { 0x04C2, 0x04C1 },
+ { 0x04C4, 0x04C3 },
+ { 0x04C6, 0x04C5 },
+ { 0x04C8, 0x04C7 },
+ { 0x04CA, 0x04C9 },
+ { 0x04CC, 0x04CB },
+ { 0x04CE, 0x04CD },
+ { 0x04CF, 0x04C0 },
+ { 0x04D1, 0x04D0 },
+ { 0x04D3, 0x04D2 },
+ { 0x04D5, 0x04D4 },
+ { 0x04D7, 0x04D6 },
+ { 0x04D9, 0x04D8 },
+ { 0x04DB, 0x04DA },
+ { 0x04DD, 0x04DC },
+ { 0x04DF, 0x04DE },
+ { 0x04E1, 0x04E0 },
+ { 0x04E3, 0x04E2 },
+ { 0x04E5, 0x04E4 },
+ { 0x04E7, 0x04E6 },
+ { 0x04E9, 0x04E8 },
+ { 0x04EB, 0x04EA },
+ { 0x04ED, 0x04EC },
+ { 0x04EF, 0x04EE },
+ { 0x04F1, 0x04F0 },
+ { 0x04F3, 0x04F2 },
+ { 0x04F5, 0x04F4 },
+ { 0x04F7, 0x04F6 },
+ { 0x04F9, 0x04F8 },
+ { 0x04FB, 0x04FA },
+ { 0x04FD, 0x04FC },
+ { 0x04FF, 0x04FE },
+ { 0x0501, 0x0500 },
+ { 0x0503, 0x0502 },
+ { 0x0505, 0x0504 },
+ { 0x0507, 0x0506 },
+ { 0x0509, 0x0508 },
+ { 0x050B, 0x050A },
+ { 0x050D, 0x050C },
+ { 0x050F, 0x050E },
+ { 0x0511, 0x0510 },
+ { 0x0513, 0x0512 },
+ { 0x0515, 0x0514 },
+ { 0x0517, 0x0516 },
+ { 0x0519, 0x0518 },
+ { 0x051B, 0x051A },
+ { 0x051D, 0x051C },
+ { 0x051F, 0x051E },
+ { 0x0521, 0x0520 },
+ { 0x0523, 0x0522 },
+ { 0x0561, 0x0531 },
+ { 0x0562, 0x0532 },
+ { 0x0563, 0x0533 },
+ { 0x0564, 0x0534 },
+ { 0x0565, 0x0535 },
+ { 0x0566, 0x0536 },
+ { 0x0567, 0x0537 },
+ { 0x0568, 0x0538 },
+ { 0x0569, 0x0539 },
+ { 0x056A, 0x053A },
+ { 0x056B, 0x053B },
+ { 0x056C, 0x053C },
+ { 0x056D, 0x053D },
+ { 0x056E, 0x053E },
+ { 0x056F, 0x053F },
+ { 0x0570, 0x0540 },
+ { 0x0571, 0x0541 },
+ { 0x0572, 0x0542 },
+ { 0x0573, 0x0543 },
+ { 0x0574, 0x0544 },
+ { 0x0575, 0x0545 },
+ { 0x0576, 0x0546 },
+ { 0x0577, 0x0547 },
+ { 0x0578, 0x0548 },
+ { 0x0579, 0x0549 },
+ { 0x057A, 0x054A },
+ { 0x057B, 0x054B },
+ { 0x057C, 0x054C },
+ { 0x057D, 0x054D },
+ { 0x057E, 0x054E },
+ { 0x057F, 0x054F },
+ { 0x0580, 0x0550 },
+ { 0x0581, 0x0551 },
+ { 0x0582, 0x0552 },
+ { 0x0583, 0x0553 },
+ { 0x0584, 0x0554 },
+ { 0x0585, 0x0555 },
+ { 0x0586, 0x0556 },
+ { 0x1D79, 0xA77D },
+ { 0x1D7D, 0x2C63 },
+ { 0x1E01, 0x1E00 },
+ { 0x1E03, 0x1E02 },
+ { 0x1E05, 0x1E04 },
+ { 0x1E07, 0x1E06 },
+ { 0x1E09, 0x1E08 },
+ { 0x1E0B, 0x1E0A },
+ { 0x1E0D, 0x1E0C },
+ { 0x1E0F, 0x1E0E },
+ { 0x1E11, 0x1E10 },
+ { 0x1E13, 0x1E12 },
+ { 0x1E15, 0x1E14 },
+ { 0x1E17, 0x1E16 },
+ { 0x1E19, 0x1E18 },
+ { 0x1E1B, 0x1E1A },
+ { 0x1E1D, 0x1E1C },
+ { 0x1E1F, 0x1E1E },
+ { 0x1E21, 0x1E20 },
+ { 0x1E23, 0x1E22 },
+ { 0x1E25, 0x1E24 },
+ { 0x1E27, 0x1E26 },
+ { 0x1E29, 0x1E28 },
+ { 0x1E2B, 0x1E2A },
+ { 0x1E2D, 0x1E2C },
+ { 0x1E2F, 0x1E2E },
+ { 0x1E31, 0x1E30 },
+ { 0x1E33, 0x1E32 },
+ { 0x1E35, 0x1E34 },
+ { 0x1E37, 0x1E36 },
+ { 0x1E39, 0x1E38 },
+ { 0x1E3B, 0x1E3A },
+ { 0x1E3D, 0x1E3C },
+ { 0x1E3F, 0x1E3E },
+ { 0x1E41, 0x1E40 },
+ { 0x1E43, 0x1E42 },
+ { 0x1E45, 0x1E44 },
+ { 0x1E47, 0x1E46 },
+ { 0x1E49, 0x1E48 },
+ { 0x1E4B, 0x1E4A },
+ { 0x1E4D, 0x1E4C },
+ { 0x1E4F, 0x1E4E },
+ { 0x1E51, 0x1E50 },
+ { 0x1E53, 0x1E52 },
+ { 0x1E55, 0x1E54 },
+ { 0x1E57, 0x1E56 },
+ { 0x1E59, 0x1E58 },
+ { 0x1E5B, 0x1E5A },
+ { 0x1E5D, 0x1E5C },
+ { 0x1E5F, 0x1E5E },
+ { 0x1E61, 0x1E60 },
+ { 0x1E63, 0x1E62 },
+ { 0x1E65, 0x1E64 },
+ { 0x1E67, 0x1E66 },
+ { 0x1E69, 0x1E68 },
+ { 0x1E6B, 0x1E6A },
+ { 0x1E6D, 0x1E6C },
+ { 0x1E6F, 0x1E6E },
+ { 0x1E71, 0x1E70 },
+ { 0x1E73, 0x1E72 },
+ { 0x1E75, 0x1E74 },
+ { 0x1E77, 0x1E76 },
+ { 0x1E79, 0x1E78 },
+ { 0x1E7B, 0x1E7A },
+ { 0x1E7D, 0x1E7C },
+ { 0x1E7F, 0x1E7E },
+ { 0x1E81, 0x1E80 },
+ { 0x1E83, 0x1E82 },
+ { 0x1E85, 0x1E84 },
+ { 0x1E87, 0x1E86 },
+ { 0x1E89, 0x1E88 },
+ { 0x1E8B, 0x1E8A },
+ { 0x1E8D, 0x1E8C },
+ { 0x1E8F, 0x1E8E },
+ { 0x1E91, 0x1E90 },
+ { 0x1E93, 0x1E92 },
+ { 0x1E95, 0x1E94 },
+ { 0x1E9B, 0x1E60 },
+ { 0x1EA1, 0x1EA0 },
+ { 0x1EA3, 0x1EA2 },
+ { 0x1EA5, 0x1EA4 },
+ { 0x1EA7, 0x1EA6 },
+ { 0x1EA9, 0x1EA8 },
+ { 0x1EAB, 0x1EAA },
+ { 0x1EAD, 0x1EAC },
+ { 0x1EAF, 0x1EAE },
+ { 0x1EB1, 0x1EB0 },
+ { 0x1EB3, 0x1EB2 },
+ { 0x1EB5, 0x1EB4 },
+ { 0x1EB7, 0x1EB6 },
+ { 0x1EB9, 0x1EB8 },
+ { 0x1EBB, 0x1EBA },
+ { 0x1EBD, 0x1EBC },
+ { 0x1EBF, 0x1EBE },
+ { 0x1EC1, 0x1EC0 },
+ { 0x1EC3, 0x1EC2 },
+ { 0x1EC5, 0x1EC4 },
+ { 0x1EC7, 0x1EC6 },
+ { 0x1EC9, 0x1EC8 },
+ { 0x1ECB, 0x1ECA },
+ { 0x1ECD, 0x1ECC },
+ { 0x1ECF, 0x1ECE },
+ { 0x1ED1, 0x1ED0 },
+ { 0x1ED3, 0x1ED2 },
+ { 0x1ED5, 0x1ED4 },
+ { 0x1ED7, 0x1ED6 },
+ { 0x1ED9, 0x1ED8 },
+ { 0x1EDB, 0x1EDA },
+ { 0x1EDD, 0x1EDC },
+ { 0x1EDF, 0x1EDE },
+ { 0x1EE1, 0x1EE0 },
+ { 0x1EE3, 0x1EE2 },
+ { 0x1EE5, 0x1EE4 },
+ { 0x1EE7, 0x1EE6 },
+ { 0x1EE9, 0x1EE8 },
+ { 0x1EEB, 0x1EEA },
+ { 0x1EED, 0x1EEC },
+ { 0x1EEF, 0x1EEE },
+ { 0x1EF1, 0x1EF0 },
+ { 0x1EF3, 0x1EF2 },
+ { 0x1EF5, 0x1EF4 },
+ { 0x1EF7, 0x1EF6 },
+ { 0x1EF9, 0x1EF8 },
+ { 0x1EFB, 0x1EFA },
+ { 0x1EFD, 0x1EFC },
+ { 0x1EFF, 0x1EFE },
+ { 0x1F00, 0x1F08 },
+ { 0x1F01, 0x1F09 },
+ { 0x1F02, 0x1F0A },
+ { 0x1F03, 0x1F0B },
+ { 0x1F04, 0x1F0C },
+ { 0x1F05, 0x1F0D },
+ { 0x1F06, 0x1F0E },
+ { 0x1F07, 0x1F0F },
+ { 0x1F10, 0x1F18 },
+ { 0x1F11, 0x1F19 },
+ { 0x1F12, 0x1F1A },
+ { 0x1F13, 0x1F1B },
+ { 0x1F14, 0x1F1C },
+ { 0x1F15, 0x1F1D },
+ { 0x1F20, 0x1F28 },
+ { 0x1F21, 0x1F29 },
+ { 0x1F22, 0x1F2A },
+ { 0x1F23, 0x1F2B },
+ { 0x1F24, 0x1F2C },
+ { 0x1F25, 0x1F2D },
+ { 0x1F26, 0x1F2E },
+ { 0x1F27, 0x1F2F },
+ { 0x1F30, 0x1F38 },
+ { 0x1F31, 0x1F39 },
+ { 0x1F32, 0x1F3A },
+ { 0x1F33, 0x1F3B },
+ { 0x1F34, 0x1F3C },
+ { 0x1F35, 0x1F3D },
+ { 0x1F36, 0x1F3E },
+ { 0x1F37, 0x1F3F },
+ { 0x1F40, 0x1F48 },
+ { 0x1F41, 0x1F49 },
+ { 0x1F42, 0x1F4A },
+ { 0x1F43, 0x1F4B },
+ { 0x1F44, 0x1F4C },
+ { 0x1F45, 0x1F4D },
+ { 0x1F51, 0x1F59 },
+ { 0x1F53, 0x1F5B },
+ { 0x1F55, 0x1F5D },
+ { 0x1F57, 0x1F5F },
+ { 0x1F60, 0x1F68 },
+ { 0x1F61, 0x1F69 },
+ { 0x1F62, 0x1F6A },
+ { 0x1F63, 0x1F6B },
+ { 0x1F64, 0x1F6C },
+ { 0x1F65, 0x1F6D },
+ { 0x1F66, 0x1F6E },
+ { 0x1F67, 0x1F6F },
+ { 0x1F70, 0x1FBA },
+ { 0x1F71, 0x1FBB },
+ { 0x1F72, 0x1FC8 },
+ { 0x1F73, 0x1FC9 },
+ { 0x1F74, 0x1FCA },
+ { 0x1F75, 0x1FCB },
+ { 0x1F76, 0x1FDA },
+ { 0x1F77, 0x1FDB },
+ { 0x1F78, 0x1FF8 },
+ { 0x1F79, 0x1FF9 },
+ { 0x1F7A, 0x1FEA },
+ { 0x1F7B, 0x1FEB },
+ { 0x1F7C, 0x1FFA },
+ { 0x1F7D, 0x1FFB },
+ { 0x1F80, 0x1F88 },
+ { 0x1F81, 0x1F89 },
+ { 0x1F82, 0x1F8A },
+ { 0x1F83, 0x1F8B },
+ { 0x1F84, 0x1F8C },
+ { 0x1F85, 0x1F8D },
+ { 0x1F86, 0x1F8E },
+ { 0x1F87, 0x1F8F },
+ { 0x1F90, 0x1F98 },
+ { 0x1F91, 0x1F99 },
+ { 0x1F92, 0x1F9A },
+ { 0x1F93, 0x1F9B },
+ { 0x1F94, 0x1F9C },
+ { 0x1F95, 0x1F9D },
+ { 0x1F96, 0x1F9E },
+ { 0x1F97, 0x1F9F },
+ { 0x1FA0, 0x1FA8 },
+ { 0x1FA1, 0x1FA9 },
+ { 0x1FA2, 0x1FAA },
+ { 0x1FA3, 0x1FAB },
+ { 0x1FA4, 0x1FAC },
+ { 0x1FA5, 0x1FAD },
+ { 0x1FA6, 0x1FAE },
+ { 0x1FA7, 0x1FAF },
+ { 0x1FB0, 0x1FB8 },
+ { 0x1FB1, 0x1FB9 },
+ { 0x1FB3, 0x1FBC },
+ { 0x1FBE, 0x0399 },
+ { 0x1FC3, 0x1FCC },
+ { 0x1FD0, 0x1FD8 },
+ { 0x1FD1, 0x1FD9 },
+ { 0x1FE0, 0x1FE8 },
+ { 0x1FE1, 0x1FE9 },
+ { 0x1FE5, 0x1FEC },
+ { 0x1FF3, 0x1FFC },
+ { 0x214E, 0x2132 },
+ { 0x2170, 0x2160 },
+ { 0x2171, 0x2161 },
+ { 0x2172, 0x2162 },
+ { 0x2173, 0x2163 },
+ { 0x2174, 0x2164 },
+ { 0x2175, 0x2165 },
+ { 0x2176, 0x2166 },
+ { 0x2177, 0x2167 },
+ { 0x2178, 0x2168 },
+ { 0x2179, 0x2169 },
+ { 0x217A, 0x216A },
+ { 0x217B, 0x216B },
+ { 0x217C, 0x216C },
+ { 0x217D, 0x216D },
+ { 0x217E, 0x216E },
+ { 0x217F, 0x216F },
+ { 0x2184, 0x2183 },
+ { 0x24D0, 0x24B6 },
+ { 0x24D1, 0x24B7 },
+ { 0x24D2, 0x24B8 },
+ { 0x24D3, 0x24B9 },
+ { 0x24D4, 0x24BA },
+ { 0x24D5, 0x24BB },
+ { 0x24D6, 0x24BC },
+ { 0x24D7, 0x24BD },
+ { 0x24D8, 0x24BE },
+ { 0x24D9, 0x24BF },
+ { 0x24DA, 0x24C0 },
+ { 0x24DB, 0x24C1 },
+ { 0x24DC, 0x24C2 },
+ { 0x24DD, 0x24C3 },
+ { 0x24DE, 0x24C4 },
+ { 0x24DF, 0x24C5 },
+ { 0x24E0, 0x24C6 },
+ { 0x24E1, 0x24C7 },
+ { 0x24E2, 0x24C8 },
+ { 0x24E3, 0x24C9 },
+ { 0x24E4, 0x24CA },
+ { 0x24E5, 0x24CB },
+ { 0x24E6, 0x24CC },
+ { 0x24E7, 0x24CD },
+ { 0x24E8, 0x24CE },
+ { 0x24E9, 0x24CF },
+ { 0x2C30, 0x2C00 },
+ { 0x2C31, 0x2C01 },
+ { 0x2C32, 0x2C02 },
+ { 0x2C33, 0x2C03 },
+ { 0x2C34, 0x2C04 },
+ { 0x2C35, 0x2C05 },
+ { 0x2C36, 0x2C06 },
+ { 0x2C37, 0x2C07 },
+ { 0x2C38, 0x2C08 },
+ { 0x2C39, 0x2C09 },
+ { 0x2C3A, 0x2C0A },
+ { 0x2C3B, 0x2C0B },
+ { 0x2C3C, 0x2C0C },
+ { 0x2C3D, 0x2C0D },
+ { 0x2C3E, 0x2C0E },
+ { 0x2C3F, 0x2C0F },
+ { 0x2C40, 0x2C10 },
+ { 0x2C41, 0x2C11 },
+ { 0x2C42, 0x2C12 },
+ { 0x2C43, 0x2C13 },
+ { 0x2C44, 0x2C14 },
+ { 0x2C45, 0x2C15 },
+ { 0x2C46, 0x2C16 },
+ { 0x2C47, 0x2C17 },
+ { 0x2C48, 0x2C18 },
+ { 0x2C49, 0x2C19 },
+ { 0x2C4A, 0x2C1A },
+ { 0x2C4B, 0x2C1B },
+ { 0x2C4C, 0x2C1C },
+ { 0x2C4D, 0x2C1D },
+ { 0x2C4E, 0x2C1E },
+ { 0x2C4F, 0x2C1F },
+ { 0x2C50, 0x2C20 },
+ { 0x2C51, 0x2C21 },
+ { 0x2C52, 0x2C22 },
+ { 0x2C53, 0x2C23 },
+ { 0x2C54, 0x2C24 },
+ { 0x2C55, 0x2C25 },
+ { 0x2C56, 0x2C26 },
+ { 0x2C57, 0x2C27 },
+ { 0x2C58, 0x2C28 },
+ { 0x2C59, 0x2C29 },
+ { 0x2C5A, 0x2C2A },
+ { 0x2C5B, 0x2C2B },
+ { 0x2C5C, 0x2C2C },
+ { 0x2C5D, 0x2C2D },
+ { 0x2C5E, 0x2C2E },
+ { 0x2C61, 0x2C60 },
+ { 0x2C65, 0x023A },
+ { 0x2C66, 0x023E },
+ { 0x2C68, 0x2C67 },
+ { 0x2C6A, 0x2C69 },
+ { 0x2C6C, 0x2C6B },
+ { 0x2C73, 0x2C72 },
+ { 0x2C76, 0x2C75 },
+ { 0x2C81, 0x2C80 },
+ { 0x2C83, 0x2C82 },
+ { 0x2C85, 0x2C84 },
+ { 0x2C87, 0x2C86 },
+ { 0x2C89, 0x2C88 },
+ { 0x2C8B, 0x2C8A },
+ { 0x2C8D, 0x2C8C },
+ { 0x2C8F, 0x2C8E },
+ { 0x2C91, 0x2C90 },
+ { 0x2C93, 0x2C92 },
+ { 0x2C95, 0x2C94 },
+ { 0x2C97, 0x2C96 },
+ { 0x2C99, 0x2C98 },
+ { 0x2C9B, 0x2C9A },
+ { 0x2C9D, 0x2C9C },
+ { 0x2C9F, 0x2C9E },
+ { 0x2CA1, 0x2CA0 },
+ { 0x2CA3, 0x2CA2 },
+ { 0x2CA5, 0x2CA4 },
+ { 0x2CA7, 0x2CA6 },
+ { 0x2CA9, 0x2CA8 },
+ { 0x2CAB, 0x2CAA },
+ { 0x2CAD, 0x2CAC },
+ { 0x2CAF, 0x2CAE },
+ { 0x2CB1, 0x2CB0 },
+ { 0x2CB3, 0x2CB2 },
+ { 0x2CB5, 0x2CB4 },
+ { 0x2CB7, 0x2CB6 },
+ { 0x2CB9, 0x2CB8 },
+ { 0x2CBB, 0x2CBA },
+ { 0x2CBD, 0x2CBC },
+ { 0x2CBF, 0x2CBE },
+ { 0x2CC1, 0x2CC0 },
+ { 0x2CC3, 0x2CC2 },
+ { 0x2CC5, 0x2CC4 },
+ { 0x2CC7, 0x2CC6 },
+ { 0x2CC9, 0x2CC8 },
+ { 0x2CCB, 0x2CCA },
+ { 0x2CCD, 0x2CCC },
+ { 0x2CCF, 0x2CCE },
+ { 0x2CD1, 0x2CD0 },
+ { 0x2CD3, 0x2CD2 },
+ { 0x2CD5, 0x2CD4 },
+ { 0x2CD7, 0x2CD6 },
+ { 0x2CD9, 0x2CD8 },
+ { 0x2CDB, 0x2CDA },
+ { 0x2CDD, 0x2CDC },
+ { 0x2CDF, 0x2CDE },
+ { 0x2CE1, 0x2CE0 },
+ { 0x2CE3, 0x2CE2 },
+ { 0x2D00, 0x10A0 },
+ { 0x2D01, 0x10A1 },
+ { 0x2D02, 0x10A2 },
+ { 0x2D03, 0x10A3 },
+ { 0x2D04, 0x10A4 },
+ { 0x2D05, 0x10A5 },
+ { 0x2D06, 0x10A6 },
+ { 0x2D07, 0x10A7 },
+ { 0x2D08, 0x10A8 },
+ { 0x2D09, 0x10A9 },
+ { 0x2D0A, 0x10AA },
+ { 0x2D0B, 0x10AB },
+ { 0x2D0C, 0x10AC },
+ { 0x2D0D, 0x10AD },
+ { 0x2D0E, 0x10AE },
+ { 0x2D0F, 0x10AF },
+ { 0x2D10, 0x10B0 },
+ { 0x2D11, 0x10B1 },
+ { 0x2D12, 0x10B2 },
+ { 0x2D13, 0x10B3 },
+ { 0x2D14, 0x10B4 },
+ { 0x2D15, 0x10B5 },
+ { 0x2D16, 0x10B6 },
+ { 0x2D17, 0x10B7 },
+ { 0x2D18, 0x10B8 },
+ { 0x2D19, 0x10B9 },
+ { 0x2D1A, 0x10BA },
+ { 0x2D1B, 0x10BB },
+ { 0x2D1C, 0x10BC },
+ { 0x2D1D, 0x10BD },
+ { 0x2D1E, 0x10BE },
+ { 0x2D1F, 0x10BF },
+ { 0x2D20, 0x10C0 },
+ { 0x2D21, 0x10C1 },
+ { 0x2D22, 0x10C2 },
+ { 0x2D23, 0x10C3 },
+ { 0x2D24, 0x10C4 },
+ { 0x2D25, 0x10C5 },
+ { 0xA641, 0xA640 },
+ { 0xA643, 0xA642 },
+ { 0xA645, 0xA644 },
+ { 0xA647, 0xA646 },
+ { 0xA649, 0xA648 },
+ { 0xA64B, 0xA64A },
+ { 0xA64D, 0xA64C },
+ { 0xA64F, 0xA64E },
+ { 0xA651, 0xA650 },
+ { 0xA653, 0xA652 },
+ { 0xA655, 0xA654 },
+ { 0xA657, 0xA656 },
+ { 0xA659, 0xA658 },
+ { 0xA65B, 0xA65A },
+ { 0xA65D, 0xA65C },
+ { 0xA65F, 0xA65E },
+ { 0xA663, 0xA662 },
+ { 0xA665, 0xA664 },
+ { 0xA667, 0xA666 },
+ { 0xA669, 0xA668 },
+ { 0xA66B, 0xA66A },
+ { 0xA66D, 0xA66C },
+ { 0xA681, 0xA680 },
+ { 0xA683, 0xA682 },
+ { 0xA685, 0xA684 },
+ { 0xA687, 0xA686 },
+ { 0xA689, 0xA688 },
+ { 0xA68B, 0xA68A },
+ { 0xA68D, 0xA68C },
+ { 0xA68F, 0xA68E },
+ { 0xA691, 0xA690 },
+ { 0xA693, 0xA692 },
+ { 0xA695, 0xA694 },
+ { 0xA697, 0xA696 },
+ { 0xA723, 0xA722 },
+ { 0xA725, 0xA724 },
+ { 0xA727, 0xA726 },
+ { 0xA729, 0xA728 },
+ { 0xA72B, 0xA72A },
+ { 0xA72D, 0xA72C },
+ { 0xA72F, 0xA72E },
+ { 0xA733, 0xA732 },
+ { 0xA735, 0xA734 },
+ { 0xA737, 0xA736 },
+ { 0xA739, 0xA738 },
+ { 0xA73B, 0xA73A },
+ { 0xA73D, 0xA73C },
+ { 0xA73F, 0xA73E },
+ { 0xA741, 0xA740 },
+ { 0xA743, 0xA742 },
+ { 0xA745, 0xA744 },
+ { 0xA747, 0xA746 },
+ { 0xA749, 0xA748 },
+ { 0xA74B, 0xA74A },
+ { 0xA74D, 0xA74C },
+ { 0xA74F, 0xA74E },
+ { 0xA751, 0xA750 },
+ { 0xA753, 0xA752 },
+ { 0xA755, 0xA754 },
+ { 0xA757, 0xA756 },
+ { 0xA759, 0xA758 },
+ { 0xA75B, 0xA75A },
+ { 0xA75D, 0xA75C },
+ { 0xA75F, 0xA75E },
+ { 0xA761, 0xA760 },
+ { 0xA763, 0xA762 },
+ { 0xA765, 0xA764 },
+ { 0xA767, 0xA766 },
+ { 0xA769, 0xA768 },
+ { 0xA76B, 0xA76A },
+ { 0xA76D, 0xA76C },
+ { 0xA76F, 0xA76E },
+ { 0xA77A, 0xA779 },
+ { 0xA77C, 0xA77B },
+ { 0xA77F, 0xA77E },
+ { 0xA781, 0xA780 },
+ { 0xA783, 0xA782 },
+ { 0xA785, 0xA784 },
+ { 0xA787, 0xA786 },
+ { 0xA78C, 0xA78B },
+ { 0xFF41, 0xFF21 },
+ { 0xFF42, 0xFF22 },
+ { 0xFF43, 0xFF23 },
+ { 0xFF44, 0xFF24 },
+ { 0xFF45, 0xFF25 },
+ { 0xFF46, 0xFF26 },
+ { 0xFF47, 0xFF27 },
+ { 0xFF48, 0xFF28 },
+ { 0xFF49, 0xFF29 },
+ { 0xFF4A, 0xFF2A },
+ { 0xFF4B, 0xFF2B },
+ { 0xFF4C, 0xFF2C },
+ { 0xFF4D, 0xFF2D },
+ { 0xFF4E, 0xFF2E },
+ { 0xFF4F, 0xFF2F },
+ { 0xFF50, 0xFF30 },
+ { 0xFF51, 0xFF31 },
+ { 0xFF52, 0xFF32 },
+ { 0xFF53, 0xFF33 },
+ { 0xFF54, 0xFF34 },
+ { 0xFF55, 0xFF35 },
+ { 0xFF56, 0xFF36 },
+ { 0xFF57, 0xFF37 },
+ { 0xFF58, 0xFF38 },
+ { 0xFF59, 0xFF39 },
+ { 0xFF5A, 0xFF3A },
+ { 0x10428, 0x10400 },
+ { 0x10429, 0x10401 },
+ { 0x1042A, 0x10402 },
+ { 0x1042B, 0x10403 },
+ { 0x1042C, 0x10404 },
+ { 0x1042D, 0x10405 },
+ { 0x1042E, 0x10406 },
+ { 0x1042F, 0x10407 },
+ { 0x10430, 0x10408 },
+ { 0x10431, 0x10409 },
+ { 0x10432, 0x1040A },
+ { 0x10433, 0x1040B },
+ { 0x10434, 0x1040C },
+ { 0x10435, 0x1040D },
+ { 0x10436, 0x1040E },
+ { 0x10437, 0x1040F },
+ { 0x10438, 0x10410 },
+ { 0x10439, 0x10411 },
+ { 0x1043A, 0x10412 },
+ { 0x1043B, 0x10413 },
+ { 0x1043C, 0x10414 },
+ { 0x1043D, 0x10415 },
+ { 0x1043E, 0x10416 },
+ { 0x1043F, 0x10417 },
+ { 0x10440, 0x10418 },
+ { 0x10441, 0x10419 },
+ { 0x10442, 0x1041A },
+ { 0x10443, 0x1041B },
+ { 0x10444, 0x1041C },
+ { 0x10445, 0x1041D },
+ { 0x10446, 0x1041E },
+ { 0x10447, 0x1041F },
+ { 0x10448, 0x10420 },
+ { 0x10449, 0x10421 },
+ { 0x1044A, 0x10422 },
+ { 0x1044B, 0x10423 },
+ { 0x1044C, 0x10424 },
+ { 0x1044D, 0x10425 },
+ { 0x1044E, 0x10426 },
+ { 0x1044F, 0x10427 }
+
+#define MAP(c) uc_totitle (c)
+#include "test-mapping-part2.h"
diff --git a/gnulib/tests/unicase/test-uc_toupper.c b/gnulib/tests/unicase/test-uc_toupper.c
new file mode 100644
index 00000000..481e9f02
--- /dev/null
+++ b/gnulib/tests/unicase/test-uc_toupper.c
@@ -0,0 +1,1055 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character mapping functions.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Generated automatically by gen-case.c for Unicode 5.1.0. */
+
+#include "test-mapping-part1.h"
+
+ { 0x0061, 0x0041 },
+ { 0x0062, 0x0042 },
+ { 0x0063, 0x0043 },
+ { 0x0064, 0x0044 },
+ { 0x0065, 0x0045 },
+ { 0x0066, 0x0046 },
+ { 0x0067, 0x0047 },
+ { 0x0068, 0x0048 },
+ { 0x0069, 0x0049 },
+ { 0x006A, 0x004A },
+ { 0x006B, 0x004B },
+ { 0x006C, 0x004C },
+ { 0x006D, 0x004D },
+ { 0x006E, 0x004E },
+ { 0x006F, 0x004F },
+ { 0x0070, 0x0050 },
+ { 0x0071, 0x0051 },
+ { 0x0072, 0x0052 },
+ { 0x0073, 0x0053 },
+ { 0x0074, 0x0054 },
+ { 0x0075, 0x0055 },
+ { 0x0076, 0x0056 },
+ { 0x0077, 0x0057 },
+ { 0x0078, 0x0058 },
+ { 0x0079, 0x0059 },
+ { 0x007A, 0x005A },
+ { 0x00B5, 0x039C },
+ { 0x00E0, 0x00C0 },
+ { 0x00E1, 0x00C1 },
+ { 0x00E2, 0x00C2 },
+ { 0x00E3, 0x00C3 },
+ { 0x00E4, 0x00C4 },
+ { 0x00E5, 0x00C5 },
+ { 0x00E6, 0x00C6 },
+ { 0x00E7, 0x00C7 },
+ { 0x00E8, 0x00C8 },
+ { 0x00E9, 0x00C9 },
+ { 0x00EA, 0x00CA },
+ { 0x00EB, 0x00CB },
+ { 0x00EC, 0x00CC },
+ { 0x00ED, 0x00CD },
+ { 0x00EE, 0x00CE },
+ { 0x00EF, 0x00CF },
+ { 0x00F0, 0x00D0 },
+ { 0x00F1, 0x00D1 },
+ { 0x00F2, 0x00D2 },
+ { 0x00F3, 0x00D3 },
+ { 0x00F4, 0x00D4 },
+ { 0x00F5, 0x00D5 },
+ { 0x00F6, 0x00D6 },
+ { 0x00F8, 0x00D8 },
+ { 0x00F9, 0x00D9 },
+ { 0x00FA, 0x00DA },
+ { 0x00FB, 0x00DB },
+ { 0x00FC, 0x00DC },
+ { 0x00FD, 0x00DD },
+ { 0x00FE, 0x00DE },
+ { 0x00FF, 0x0178 },
+ { 0x0101, 0x0100 },
+ { 0x0103, 0x0102 },
+ { 0x0105, 0x0104 },
+ { 0x0107, 0x0106 },
+ { 0x0109, 0x0108 },
+ { 0x010B, 0x010A },
+ { 0x010D, 0x010C },
+ { 0x010F, 0x010E },
+ { 0x0111, 0x0110 },
+ { 0x0113, 0x0112 },
+ { 0x0115, 0x0114 },
+ { 0x0117, 0x0116 },
+ { 0x0119, 0x0118 },
+ { 0x011B, 0x011A },
+ { 0x011D, 0x011C },
+ { 0x011F, 0x011E },
+ { 0x0121, 0x0120 },
+ { 0x0123, 0x0122 },
+ { 0x0125, 0x0124 },
+ { 0x0127, 0x0126 },
+ { 0x0129, 0x0128 },
+ { 0x012B, 0x012A },
+ { 0x012D, 0x012C },
+ { 0x012F, 0x012E },
+ { 0x0131, 0x0049 },
+ { 0x0133, 0x0132 },
+ { 0x0135, 0x0134 },
+ { 0x0137, 0x0136 },
+ { 0x013A, 0x0139 },
+ { 0x013C, 0x013B },
+ { 0x013E, 0x013D },
+ { 0x0140, 0x013F },
+ { 0x0142, 0x0141 },
+ { 0x0144, 0x0143 },
+ { 0x0146, 0x0145 },
+ { 0x0148, 0x0147 },
+ { 0x014B, 0x014A },
+ { 0x014D, 0x014C },
+ { 0x014F, 0x014E },
+ { 0x0151, 0x0150 },
+ { 0x0153, 0x0152 },
+ { 0x0155, 0x0154 },
+ { 0x0157, 0x0156 },
+ { 0x0159, 0x0158 },
+ { 0x015B, 0x015A },
+ { 0x015D, 0x015C },
+ { 0x015F, 0x015E },
+ { 0x0161, 0x0160 },
+ { 0x0163, 0x0162 },
+ { 0x0165, 0x0164 },
+ { 0x0167, 0x0166 },
+ { 0x0169, 0x0168 },
+ { 0x016B, 0x016A },
+ { 0x016D, 0x016C },
+ { 0x016F, 0x016E },
+ { 0x0171, 0x0170 },
+ { 0x0173, 0x0172 },
+ { 0x0175, 0x0174 },
+ { 0x0177, 0x0176 },
+ { 0x017A, 0x0179 },
+ { 0x017C, 0x017B },
+ { 0x017E, 0x017D },
+ { 0x017F, 0x0053 },
+ { 0x0180, 0x0243 },
+ { 0x0183, 0x0182 },
+ { 0x0185, 0x0184 },
+ { 0x0188, 0x0187 },
+ { 0x018C, 0x018B },
+ { 0x0192, 0x0191 },
+ { 0x0195, 0x01F6 },
+ { 0x0199, 0x0198 },
+ { 0x019A, 0x023D },
+ { 0x019E, 0x0220 },
+ { 0x01A1, 0x01A0 },
+ { 0x01A3, 0x01A2 },
+ { 0x01A5, 0x01A4 },
+ { 0x01A8, 0x01A7 },
+ { 0x01AD, 0x01AC },
+ { 0x01B0, 0x01AF },
+ { 0x01B4, 0x01B3 },
+ { 0x01B6, 0x01B5 },
+ { 0x01B9, 0x01B8 },
+ { 0x01BD, 0x01BC },
+ { 0x01BF, 0x01F7 },
+ { 0x01C5, 0x01C4 },
+ { 0x01C6, 0x01C4 },
+ { 0x01C8, 0x01C7 },
+ { 0x01C9, 0x01C7 },
+ { 0x01CB, 0x01CA },
+ { 0x01CC, 0x01CA },
+ { 0x01CE, 0x01CD },
+ { 0x01D0, 0x01CF },
+ { 0x01D2, 0x01D1 },
+ { 0x01D4, 0x01D3 },
+ { 0x01D6, 0x01D5 },
+ { 0x01D8, 0x01D7 },
+ { 0x01DA, 0x01D9 },
+ { 0x01DC, 0x01DB },
+ { 0x01DD, 0x018E },
+ { 0x01DF, 0x01DE },
+ { 0x01E1, 0x01E0 },
+ { 0x01E3, 0x01E2 },
+ { 0x01E5, 0x01E4 },
+ { 0x01E7, 0x01E6 },
+ { 0x01E9, 0x01E8 },
+ { 0x01EB, 0x01EA },
+ { 0x01ED, 0x01EC },
+ { 0x01EF, 0x01EE },
+ { 0x01F2, 0x01F1 },
+ { 0x01F3, 0x01F1 },
+ { 0x01F5, 0x01F4 },
+ { 0x01F9, 0x01F8 },
+ { 0x01FB, 0x01FA },
+ { 0x01FD, 0x01FC },
+ { 0x01FF, 0x01FE },
+ { 0x0201, 0x0200 },
+ { 0x0203, 0x0202 },
+ { 0x0205, 0x0204 },
+ { 0x0207, 0x0206 },
+ { 0x0209, 0x0208 },
+ { 0x020B, 0x020A },
+ { 0x020D, 0x020C },
+ { 0x020F, 0x020E },
+ { 0x0211, 0x0210 },
+ { 0x0213, 0x0212 },
+ { 0x0215, 0x0214 },
+ { 0x0217, 0x0216 },
+ { 0x0219, 0x0218 },
+ { 0x021B, 0x021A },
+ { 0x021D, 0x021C },
+ { 0x021F, 0x021E },
+ { 0x0223, 0x0222 },
+ { 0x0225, 0x0224 },
+ { 0x0227, 0x0226 },
+ { 0x0229, 0x0228 },
+ { 0x022B, 0x022A },
+ { 0x022D, 0x022C },
+ { 0x022F, 0x022E },
+ { 0x0231, 0x0230 },
+ { 0x0233, 0x0232 },
+ { 0x023C, 0x023B },
+ { 0x0242, 0x0241 },
+ { 0x0247, 0x0246 },
+ { 0x0249, 0x0248 },
+ { 0x024B, 0x024A },
+ { 0x024D, 0x024C },
+ { 0x024F, 0x024E },
+ { 0x0250, 0x2C6F },
+ { 0x0251, 0x2C6D },
+ { 0x0253, 0x0181 },
+ { 0x0254, 0x0186 },
+ { 0x0256, 0x0189 },
+ { 0x0257, 0x018A },
+ { 0x0259, 0x018F },
+ { 0x025B, 0x0190 },
+ { 0x0260, 0x0193 },
+ { 0x0263, 0x0194 },
+ { 0x0268, 0x0197 },
+ { 0x0269, 0x0196 },
+ { 0x026B, 0x2C62 },
+ { 0x026F, 0x019C },
+ { 0x0271, 0x2C6E },
+ { 0x0272, 0x019D },
+ { 0x0275, 0x019F },
+ { 0x027D, 0x2C64 },
+ { 0x0280, 0x01A6 },
+ { 0x0283, 0x01A9 },
+ { 0x0288, 0x01AE },
+ { 0x0289, 0x0244 },
+ { 0x028A, 0x01B1 },
+ { 0x028B, 0x01B2 },
+ { 0x028C, 0x0245 },
+ { 0x0292, 0x01B7 },
+ { 0x0345, 0x0399 },
+ { 0x0371, 0x0370 },
+ { 0x0373, 0x0372 },
+ { 0x0377, 0x0376 },
+ { 0x037B, 0x03FD },
+ { 0x037C, 0x03FE },
+ { 0x037D, 0x03FF },
+ { 0x03AC, 0x0386 },
+ { 0x03AD, 0x0388 },
+ { 0x03AE, 0x0389 },
+ { 0x03AF, 0x038A },
+ { 0x03B1, 0x0391 },
+ { 0x03B2, 0x0392 },
+ { 0x03B3, 0x0393 },
+ { 0x03B4, 0x0394 },
+ { 0x03B5, 0x0395 },
+ { 0x03B6, 0x0396 },
+ { 0x03B7, 0x0397 },
+ { 0x03B8, 0x0398 },
+ { 0x03B9, 0x0399 },
+ { 0x03BA, 0x039A },
+ { 0x03BB, 0x039B },
+ { 0x03BC, 0x039C },
+ { 0x03BD, 0x039D },
+ { 0x03BE, 0x039E },
+ { 0x03BF, 0x039F },
+ { 0x03C0, 0x03A0 },
+ { 0x03C1, 0x03A1 },
+ { 0x03C2, 0x03A3 },
+ { 0x03C3, 0x03A3 },
+ { 0x03C4, 0x03A4 },
+ { 0x03C5, 0x03A5 },
+ { 0x03C6, 0x03A6 },
+ { 0x03C7, 0x03A7 },
+ { 0x03C8, 0x03A8 },
+ { 0x03C9, 0x03A9 },
+ { 0x03CA, 0x03AA },
+ { 0x03CB, 0x03AB },
+ { 0x03CC, 0x038C },
+ { 0x03CD, 0x038E },
+ { 0x03CE, 0x038F },
+ { 0x03D0, 0x0392 },
+ { 0x03D1, 0x0398 },
+ { 0x03D5, 0x03A6 },
+ { 0x03D6, 0x03A0 },
+ { 0x03D7, 0x03CF },
+ { 0x03D9, 0x03D8 },
+ { 0x03DB, 0x03DA },
+ { 0x03DD, 0x03DC },
+ { 0x03DF, 0x03DE },
+ { 0x03E1, 0x03E0 },
+ { 0x03E3, 0x03E2 },
+ { 0x03E5, 0x03E4 },
+ { 0x03E7, 0x03E6 },
+ { 0x03E9, 0x03E8 },
+ { 0x03EB, 0x03EA },
+ { 0x03ED, 0x03EC },
+ { 0x03EF, 0x03EE },
+ { 0x03F0, 0x039A },
+ { 0x03F1, 0x03A1 },
+ { 0x03F2, 0x03F9 },
+ { 0x03F5, 0x0395 },
+ { 0x03F8, 0x03F7 },
+ { 0x03FB, 0x03FA },
+ { 0x0430, 0x0410 },
+ { 0x0431, 0x0411 },
+ { 0x0432, 0x0412 },
+ { 0x0433, 0x0413 },
+ { 0x0434, 0x0414 },
+ { 0x0435, 0x0415 },
+ { 0x0436, 0x0416 },
+ { 0x0437, 0x0417 },
+ { 0x0438, 0x0418 },
+ { 0x0439, 0x0419 },
+ { 0x043A, 0x041A },
+ { 0x043B, 0x041B },
+ { 0x043C, 0x041C },
+ { 0x043D, 0x041D },
+ { 0x043E, 0x041E },
+ { 0x043F, 0x041F },
+ { 0x0440, 0x0420 },
+ { 0x0441, 0x0421 },
+ { 0x0442, 0x0422 },
+ { 0x0443, 0x0423 },
+ { 0x0444, 0x0424 },
+ { 0x0445, 0x0425 },
+ { 0x0446, 0x0426 },
+ { 0x0447, 0x0427 },
+ { 0x0448, 0x0428 },
+ { 0x0449, 0x0429 },
+ { 0x044A, 0x042A },
+ { 0x044B, 0x042B },
+ { 0x044C, 0x042C },
+ { 0x044D, 0x042D },
+ { 0x044E, 0x042E },
+ { 0x044F, 0x042F },
+ { 0x0450, 0x0400 },
+ { 0x0451, 0x0401 },
+ { 0x0452, 0x0402 },
+ { 0x0453, 0x0403 },
+ { 0x0454, 0x0404 },
+ { 0x0455, 0x0405 },
+ { 0x0456, 0x0406 },
+ { 0x0457, 0x0407 },
+ { 0x0458, 0x0408 },
+ { 0x0459, 0x0409 },
+ { 0x045A, 0x040A },
+ { 0x045B, 0x040B },
+ { 0x045C, 0x040C },
+ { 0x045D, 0x040D },
+ { 0x045E, 0x040E },
+ { 0x045F, 0x040F },
+ { 0x0461, 0x0460 },
+ { 0x0463, 0x0462 },
+ { 0x0465, 0x0464 },
+ { 0x0467, 0x0466 },
+ { 0x0469, 0x0468 },
+ { 0x046B, 0x046A },
+ { 0x046D, 0x046C },
+ { 0x046F, 0x046E },
+ { 0x0471, 0x0470 },
+ { 0x0473, 0x0472 },
+ { 0x0475, 0x0474 },
+ { 0x0477, 0x0476 },
+ { 0x0479, 0x0478 },
+ { 0x047B, 0x047A },
+ { 0x047D, 0x047C },
+ { 0x047F, 0x047E },
+ { 0x0481, 0x0480 },
+ { 0x048B, 0x048A },
+ { 0x048D, 0x048C },
+ { 0x048F, 0x048E },
+ { 0x0491, 0x0490 },
+ { 0x0493, 0x0492 },
+ { 0x0495, 0x0494 },
+ { 0x0497, 0x0496 },
+ { 0x0499, 0x0498 },
+ { 0x049B, 0x049A },
+ { 0x049D, 0x049C },
+ { 0x049F, 0x049E },
+ { 0x04A1, 0x04A0 },
+ { 0x04A3, 0x04A2 },
+ { 0x04A5, 0x04A4 },
+ { 0x04A7, 0x04A6 },
+ { 0x04A9, 0x04A8 },
+ { 0x04AB, 0x04AA },
+ { 0x04AD, 0x04AC },
+ { 0x04AF, 0x04AE },
+ { 0x04B1, 0x04B0 },
+ { 0x04B3, 0x04B2 },
+ { 0x04B5, 0x04B4 },
+ { 0x04B7, 0x04B6 },
+ { 0x04B9, 0x04B8 },
+ { 0x04BB, 0x04BA },
+ { 0x04BD, 0x04BC },
+ { 0x04BF, 0x04BE },
+ { 0x04C2, 0x04C1 },
+ { 0x04C4, 0x04C3 },
+ { 0x04C6, 0x04C5 },
+ { 0x04C8, 0x04C7 },
+ { 0x04CA, 0x04C9 },
+ { 0x04CC, 0x04CB },
+ { 0x04CE, 0x04CD },
+ { 0x04CF, 0x04C0 },
+ { 0x04D1, 0x04D0 },
+ { 0x04D3, 0x04D2 },
+ { 0x04D5, 0x04D4 },
+ { 0x04D7, 0x04D6 },
+ { 0x04D9, 0x04D8 },
+ { 0x04DB, 0x04DA },
+ { 0x04DD, 0x04DC },
+ { 0x04DF, 0x04DE },
+ { 0x04E1, 0x04E0 },
+ { 0x04E3, 0x04E2 },
+ { 0x04E5, 0x04E4 },
+ { 0x04E7, 0x04E6 },
+ { 0x04E9, 0x04E8 },
+ { 0x04EB, 0x04EA },
+ { 0x04ED, 0x04EC },
+ { 0x04EF, 0x04EE },
+ { 0x04F1, 0x04F0 },
+ { 0x04F3, 0x04F2 },
+ { 0x04F5, 0x04F4 },
+ { 0x04F7, 0x04F6 },
+ { 0x04F9, 0x04F8 },
+ { 0x04FB, 0x04FA },
+ { 0x04FD, 0x04FC },
+ { 0x04FF, 0x04FE },
+ { 0x0501, 0x0500 },
+ { 0x0503, 0x0502 },
+ { 0x0505, 0x0504 },
+ { 0x0507, 0x0506 },
+ { 0x0509, 0x0508 },
+ { 0x050B, 0x050A },
+ { 0x050D, 0x050C },
+ { 0x050F, 0x050E },
+ { 0x0511, 0x0510 },
+ { 0x0513, 0x0512 },
+ { 0x0515, 0x0514 },
+ { 0x0517, 0x0516 },
+ { 0x0519, 0x0518 },
+ { 0x051B, 0x051A },
+ { 0x051D, 0x051C },
+ { 0x051F, 0x051E },
+ { 0x0521, 0x0520 },
+ { 0x0523, 0x0522 },
+ { 0x0561, 0x0531 },
+ { 0x0562, 0x0532 },
+ { 0x0563, 0x0533 },
+ { 0x0564, 0x0534 },
+ { 0x0565, 0x0535 },
+ { 0x0566, 0x0536 },
+ { 0x0567, 0x0537 },
+ { 0x0568, 0x0538 },
+ { 0x0569, 0x0539 },
+ { 0x056A, 0x053A },
+ { 0x056B, 0x053B },
+ { 0x056C, 0x053C },
+ { 0x056D, 0x053D },
+ { 0x056E, 0x053E },
+ { 0x056F, 0x053F },
+ { 0x0570, 0x0540 },
+ { 0x0571, 0x0541 },
+ { 0x0572, 0x0542 },
+ { 0x0573, 0x0543 },
+ { 0x0574, 0x0544 },
+ { 0x0575, 0x0545 },
+ { 0x0576, 0x0546 },
+ { 0x0577, 0x0547 },
+ { 0x0578, 0x0548 },
+ { 0x0579, 0x0549 },
+ { 0x057A, 0x054A },
+ { 0x057B, 0x054B },
+ { 0x057C, 0x054C },
+ { 0x057D, 0x054D },
+ { 0x057E, 0x054E },
+ { 0x057F, 0x054F },
+ { 0x0580, 0x0550 },
+ { 0x0581, 0x0551 },
+ { 0x0582, 0x0552 },
+ { 0x0583, 0x0553 },
+ { 0x0584, 0x0554 },
+ { 0x0585, 0x0555 },
+ { 0x0586, 0x0556 },
+ { 0x1D79, 0xA77D },
+ { 0x1D7D, 0x2C63 },
+ { 0x1E01, 0x1E00 },
+ { 0x1E03, 0x1E02 },
+ { 0x1E05, 0x1E04 },
+ { 0x1E07, 0x1E06 },
+ { 0x1E09, 0x1E08 },
+ { 0x1E0B, 0x1E0A },
+ { 0x1E0D, 0x1E0C },
+ { 0x1E0F, 0x1E0E },
+ { 0x1E11, 0x1E10 },
+ { 0x1E13, 0x1E12 },
+ { 0x1E15, 0x1E14 },
+ { 0x1E17, 0x1E16 },
+ { 0x1E19, 0x1E18 },
+ { 0x1E1B, 0x1E1A },
+ { 0x1E1D, 0x1E1C },
+ { 0x1E1F, 0x1E1E },
+ { 0x1E21, 0x1E20 },
+ { 0x1E23, 0x1E22 },
+ { 0x1E25, 0x1E24 },
+ { 0x1E27, 0x1E26 },
+ { 0x1E29, 0x1E28 },
+ { 0x1E2B, 0x1E2A },
+ { 0x1E2D, 0x1E2C },
+ { 0x1E2F, 0x1E2E },
+ { 0x1E31, 0x1E30 },
+ { 0x1E33, 0x1E32 },
+ { 0x1E35, 0x1E34 },
+ { 0x1E37, 0x1E36 },
+ { 0x1E39, 0x1E38 },
+ { 0x1E3B, 0x1E3A },
+ { 0x1E3D, 0x1E3C },
+ { 0x1E3F, 0x1E3E },
+ { 0x1E41, 0x1E40 },
+ { 0x1E43, 0x1E42 },
+ { 0x1E45, 0x1E44 },
+ { 0x1E47, 0x1E46 },
+ { 0x1E49, 0x1E48 },
+ { 0x1E4B, 0x1E4A },
+ { 0x1E4D, 0x1E4C },
+ { 0x1E4F, 0x1E4E },
+ { 0x1E51, 0x1E50 },
+ { 0x1E53, 0x1E52 },
+ { 0x1E55, 0x1E54 },
+ { 0x1E57, 0x1E56 },
+ { 0x1E59, 0x1E58 },
+ { 0x1E5B, 0x1E5A },
+ { 0x1E5D, 0x1E5C },
+ { 0x1E5F, 0x1E5E },
+ { 0x1E61, 0x1E60 },
+ { 0x1E63, 0x1E62 },
+ { 0x1E65, 0x1E64 },
+ { 0x1E67, 0x1E66 },
+ { 0x1E69, 0x1E68 },
+ { 0x1E6B, 0x1E6A },
+ { 0x1E6D, 0x1E6C },
+ { 0x1E6F, 0x1E6E },
+ { 0x1E71, 0x1E70 },
+ { 0x1E73, 0x1E72 },
+ { 0x1E75, 0x1E74 },
+ { 0x1E77, 0x1E76 },
+ { 0x1E79, 0x1E78 },
+ { 0x1E7B, 0x1E7A },
+ { 0x1E7D, 0x1E7C },
+ { 0x1E7F, 0x1E7E },
+ { 0x1E81, 0x1E80 },
+ { 0x1E83, 0x1E82 },
+ { 0x1E85, 0x1E84 },
+ { 0x1E87, 0x1E86 },
+ { 0x1E89, 0x1E88 },
+ { 0x1E8B, 0x1E8A },
+ { 0x1E8D, 0x1E8C },
+ { 0x1E8F, 0x1E8E },
+ { 0x1E91, 0x1E90 },
+ { 0x1E93, 0x1E92 },
+ { 0x1E95, 0x1E94 },
+ { 0x1E9B, 0x1E60 },
+ { 0x1EA1, 0x1EA0 },
+ { 0x1EA3, 0x1EA2 },
+ { 0x1EA5, 0x1EA4 },
+ { 0x1EA7, 0x1EA6 },
+ { 0x1EA9, 0x1EA8 },
+ { 0x1EAB, 0x1EAA },
+ { 0x1EAD, 0x1EAC },
+ { 0x1EAF, 0x1EAE },
+ { 0x1EB1, 0x1EB0 },
+ { 0x1EB3, 0x1EB2 },
+ { 0x1EB5, 0x1EB4 },
+ { 0x1EB7, 0x1EB6 },
+ { 0x1EB9, 0x1EB8 },
+ { 0x1EBB, 0x1EBA },
+ { 0x1EBD, 0x1EBC },
+ { 0x1EBF, 0x1EBE },
+ { 0x1EC1, 0x1EC0 },
+ { 0x1EC3, 0x1EC2 },
+ { 0x1EC5, 0x1EC4 },
+ { 0x1EC7, 0x1EC6 },
+ { 0x1EC9, 0x1EC8 },
+ { 0x1ECB, 0x1ECA },
+ { 0x1ECD, 0x1ECC },
+ { 0x1ECF, 0x1ECE },
+ { 0x1ED1, 0x1ED0 },
+ { 0x1ED3, 0x1ED2 },
+ { 0x1ED5, 0x1ED4 },
+ { 0x1ED7, 0x1ED6 },
+ { 0x1ED9, 0x1ED8 },
+ { 0x1EDB, 0x1EDA },
+ { 0x1EDD, 0x1EDC },
+ { 0x1EDF, 0x1EDE },
+ { 0x1EE1, 0x1EE0 },
+ { 0x1EE3, 0x1EE2 },
+ { 0x1EE5, 0x1EE4 },
+ { 0x1EE7, 0x1EE6 },
+ { 0x1EE9, 0x1EE8 },
+ { 0x1EEB, 0x1EEA },
+ { 0x1EED, 0x1EEC },
+ { 0x1EEF, 0x1EEE },
+ { 0x1EF1, 0x1EF0 },
+ { 0x1EF3, 0x1EF2 },
+ { 0x1EF5, 0x1EF4 },
+ { 0x1EF7, 0x1EF6 },
+ { 0x1EF9, 0x1EF8 },
+ { 0x1EFB, 0x1EFA },
+ { 0x1EFD, 0x1EFC },
+ { 0x1EFF, 0x1EFE },
+ { 0x1F00, 0x1F08 },
+ { 0x1F01, 0x1F09 },
+ { 0x1F02, 0x1F0A },
+ { 0x1F03, 0x1F0B },
+ { 0x1F04, 0x1F0C },
+ { 0x1F05, 0x1F0D },
+ { 0x1F06, 0x1F0E },
+ { 0x1F07, 0x1F0F },
+ { 0x1F10, 0x1F18 },
+ { 0x1F11, 0x1F19 },
+ { 0x1F12, 0x1F1A },
+ { 0x1F13, 0x1F1B },
+ { 0x1F14, 0x1F1C },
+ { 0x1F15, 0x1F1D },
+ { 0x1F20, 0x1F28 },
+ { 0x1F21, 0x1F29 },
+ { 0x1F22, 0x1F2A },
+ { 0x1F23, 0x1F2B },
+ { 0x1F24, 0x1F2C },
+ { 0x1F25, 0x1F2D },
+ { 0x1F26, 0x1F2E },
+ { 0x1F27, 0x1F2F },
+ { 0x1F30, 0x1F38 },
+ { 0x1F31, 0x1F39 },
+ { 0x1F32, 0x1F3A },
+ { 0x1F33, 0x1F3B },
+ { 0x1F34, 0x1F3C },
+ { 0x1F35, 0x1F3D },
+ { 0x1F36, 0x1F3E },
+ { 0x1F37, 0x1F3F },
+ { 0x1F40, 0x1F48 },
+ { 0x1F41, 0x1F49 },
+ { 0x1F42, 0x1F4A },
+ { 0x1F43, 0x1F4B },
+ { 0x1F44, 0x1F4C },
+ { 0x1F45, 0x1F4D },
+ { 0x1F51, 0x1F59 },
+ { 0x1F53, 0x1F5B },
+ { 0x1F55, 0x1F5D },
+ { 0x1F57, 0x1F5F },
+ { 0x1F60, 0x1F68 },
+ { 0x1F61, 0x1F69 },
+ { 0x1F62, 0x1F6A },
+ { 0x1F63, 0x1F6B },
+ { 0x1F64, 0x1F6C },
+ { 0x1F65, 0x1F6D },
+ { 0x1F66, 0x1F6E },
+ { 0x1F67, 0x1F6F },
+ { 0x1F70, 0x1FBA },
+ { 0x1F71, 0x1FBB },
+ { 0x1F72, 0x1FC8 },
+ { 0x1F73, 0x1FC9 },
+ { 0x1F74, 0x1FCA },
+ { 0x1F75, 0x1FCB },
+ { 0x1F76, 0x1FDA },
+ { 0x1F77, 0x1FDB },
+ { 0x1F78, 0x1FF8 },
+ { 0x1F79, 0x1FF9 },
+ { 0x1F7A, 0x1FEA },
+ { 0x1F7B, 0x1FEB },
+ { 0x1F7C, 0x1FFA },
+ { 0x1F7D, 0x1FFB },
+ { 0x1F80, 0x1F88 },
+ { 0x1F81, 0x1F89 },
+ { 0x1F82, 0x1F8A },
+ { 0x1F83, 0x1F8B },
+ { 0x1F84, 0x1F8C },
+ { 0x1F85, 0x1F8D },
+ { 0x1F86, 0x1F8E },
+ { 0x1F87, 0x1F8F },
+ { 0x1F90, 0x1F98 },
+ { 0x1F91, 0x1F99 },
+ { 0x1F92, 0x1F9A },
+ { 0x1F93, 0x1F9B },
+ { 0x1F94, 0x1F9C },
+ { 0x1F95, 0x1F9D },
+ { 0x1F96, 0x1F9E },
+ { 0x1F97, 0x1F9F },
+ { 0x1FA0, 0x1FA8 },
+ { 0x1FA1, 0x1FA9 },
+ { 0x1FA2, 0x1FAA },
+ { 0x1FA3, 0x1FAB },
+ { 0x1FA4, 0x1FAC },
+ { 0x1FA5, 0x1FAD },
+ { 0x1FA6, 0x1FAE },
+ { 0x1FA7, 0x1FAF },
+ { 0x1FB0, 0x1FB8 },
+ { 0x1FB1, 0x1FB9 },
+ { 0x1FB3, 0x1FBC },
+ { 0x1FBE, 0x0399 },
+ { 0x1FC3, 0x1FCC },
+ { 0x1FD0, 0x1FD8 },
+ { 0x1FD1, 0x1FD9 },
+ { 0x1FE0, 0x1FE8 },
+ { 0x1FE1, 0x1FE9 },
+ { 0x1FE5, 0x1FEC },
+ { 0x1FF3, 0x1FFC },
+ { 0x214E, 0x2132 },
+ { 0x2170, 0x2160 },
+ { 0x2171, 0x2161 },
+ { 0x2172, 0x2162 },
+ { 0x2173, 0x2163 },
+ { 0x2174, 0x2164 },
+ { 0x2175, 0x2165 },
+ { 0x2176, 0x2166 },
+ { 0x2177, 0x2167 },
+ { 0x2178, 0x2168 },
+ { 0x2179, 0x2169 },
+ { 0x217A, 0x216A },
+ { 0x217B, 0x216B },
+ { 0x217C, 0x216C },
+ { 0x217D, 0x216D },
+ { 0x217E, 0x216E },
+ { 0x217F, 0x216F },
+ { 0x2184, 0x2183 },
+ { 0x24D0, 0x24B6 },
+ { 0x24D1, 0x24B7 },
+ { 0x24D2, 0x24B8 },
+ { 0x24D3, 0x24B9 },
+ { 0x24D4, 0x24BA },
+ { 0x24D5, 0x24BB },
+ { 0x24D6, 0x24BC },
+ { 0x24D7, 0x24BD },
+ { 0x24D8, 0x24BE },
+ { 0x24D9, 0x24BF },
+ { 0x24DA, 0x24C0 },
+ { 0x24DB, 0x24C1 },
+ { 0x24DC, 0x24C2 },
+ { 0x24DD, 0x24C3 },
+ { 0x24DE, 0x24C4 },
+ { 0x24DF, 0x24C5 },
+ { 0x24E0, 0x24C6 },
+ { 0x24E1, 0x24C7 },
+ { 0x24E2, 0x24C8 },
+ { 0x24E3, 0x24C9 },
+ { 0x24E4, 0x24CA },
+ { 0x24E5, 0x24CB },
+ { 0x24E6, 0x24CC },
+ { 0x24E7, 0x24CD },
+ { 0x24E8, 0x24CE },
+ { 0x24E9, 0x24CF },
+ { 0x2C30, 0x2C00 },
+ { 0x2C31, 0x2C01 },
+ { 0x2C32, 0x2C02 },
+ { 0x2C33, 0x2C03 },
+ { 0x2C34, 0x2C04 },
+ { 0x2C35, 0x2C05 },
+ { 0x2C36, 0x2C06 },
+ { 0x2C37, 0x2C07 },
+ { 0x2C38, 0x2C08 },
+ { 0x2C39, 0x2C09 },
+ { 0x2C3A, 0x2C0A },
+ { 0x2C3B, 0x2C0B },
+ { 0x2C3C, 0x2C0C },
+ { 0x2C3D, 0x2C0D },
+ { 0x2C3E, 0x2C0E },
+ { 0x2C3F, 0x2C0F },
+ { 0x2C40, 0x2C10 },
+ { 0x2C41, 0x2C11 },
+ { 0x2C42, 0x2C12 },
+ { 0x2C43, 0x2C13 },
+ { 0x2C44, 0x2C14 },
+ { 0x2C45, 0x2C15 },
+ { 0x2C46, 0x2C16 },
+ { 0x2C47, 0x2C17 },
+ { 0x2C48, 0x2C18 },
+ { 0x2C49, 0x2C19 },
+ { 0x2C4A, 0x2C1A },
+ { 0x2C4B, 0x2C1B },
+ { 0x2C4C, 0x2C1C },
+ { 0x2C4D, 0x2C1D },
+ { 0x2C4E, 0x2C1E },
+ { 0x2C4F, 0x2C1F },
+ { 0x2C50, 0x2C20 },
+ { 0x2C51, 0x2C21 },
+ { 0x2C52, 0x2C22 },
+ { 0x2C53, 0x2C23 },
+ { 0x2C54, 0x2C24 },
+ { 0x2C55, 0x2C25 },
+ { 0x2C56, 0x2C26 },
+ { 0x2C57, 0x2C27 },
+ { 0x2C58, 0x2C28 },
+ { 0x2C59, 0x2C29 },
+ { 0x2C5A, 0x2C2A },
+ { 0x2C5B, 0x2C2B },
+ { 0x2C5C, 0x2C2C },
+ { 0x2C5D, 0x2C2D },
+ { 0x2C5E, 0x2C2E },
+ { 0x2C61, 0x2C60 },
+ { 0x2C65, 0x023A },
+ { 0x2C66, 0x023E },
+ { 0x2C68, 0x2C67 },
+ { 0x2C6A, 0x2C69 },
+ { 0x2C6C, 0x2C6B },
+ { 0x2C73, 0x2C72 },
+ { 0x2C76, 0x2C75 },
+ { 0x2C81, 0x2C80 },
+ { 0x2C83, 0x2C82 },
+ { 0x2C85, 0x2C84 },
+ { 0x2C87, 0x2C86 },
+ { 0x2C89, 0x2C88 },
+ { 0x2C8B, 0x2C8A },
+ { 0x2C8D, 0x2C8C },
+ { 0x2C8F, 0x2C8E },
+ { 0x2C91, 0x2C90 },
+ { 0x2C93, 0x2C92 },
+ { 0x2C95, 0x2C94 },
+ { 0x2C97, 0x2C96 },
+ { 0x2C99, 0x2C98 },
+ { 0x2C9B, 0x2C9A },
+ { 0x2C9D, 0x2C9C },
+ { 0x2C9F, 0x2C9E },
+ { 0x2CA1, 0x2CA0 },
+ { 0x2CA3, 0x2CA2 },
+ { 0x2CA5, 0x2CA4 },
+ { 0x2CA7, 0x2CA6 },
+ { 0x2CA9, 0x2CA8 },
+ { 0x2CAB, 0x2CAA },
+ { 0x2CAD, 0x2CAC },
+ { 0x2CAF, 0x2CAE },
+ { 0x2CB1, 0x2CB0 },
+ { 0x2CB3, 0x2CB2 },
+ { 0x2CB5, 0x2CB4 },
+ { 0x2CB7, 0x2CB6 },
+ { 0x2CB9, 0x2CB8 },
+ { 0x2CBB, 0x2CBA },
+ { 0x2CBD, 0x2CBC },
+ { 0x2CBF, 0x2CBE },
+ { 0x2CC1, 0x2CC0 },
+ { 0x2CC3, 0x2CC2 },
+ { 0x2CC5, 0x2CC4 },
+ { 0x2CC7, 0x2CC6 },
+ { 0x2CC9, 0x2CC8 },
+ { 0x2CCB, 0x2CCA },
+ { 0x2CCD, 0x2CCC },
+ { 0x2CCF, 0x2CCE },
+ { 0x2CD1, 0x2CD0 },
+ { 0x2CD3, 0x2CD2 },
+ { 0x2CD5, 0x2CD4 },
+ { 0x2CD7, 0x2CD6 },
+ { 0x2CD9, 0x2CD8 },
+ { 0x2CDB, 0x2CDA },
+ { 0x2CDD, 0x2CDC },
+ { 0x2CDF, 0x2CDE },
+ { 0x2CE1, 0x2CE0 },
+ { 0x2CE3, 0x2CE2 },
+ { 0x2D00, 0x10A0 },
+ { 0x2D01, 0x10A1 },
+ { 0x2D02, 0x10A2 },
+ { 0x2D03, 0x10A3 },
+ { 0x2D04, 0x10A4 },
+ { 0x2D05, 0x10A5 },
+ { 0x2D06, 0x10A6 },
+ { 0x2D07, 0x10A7 },
+ { 0x2D08, 0x10A8 },
+ { 0x2D09, 0x10A9 },
+ { 0x2D0A, 0x10AA },
+ { 0x2D0B, 0x10AB },
+ { 0x2D0C, 0x10AC },
+ { 0x2D0D, 0x10AD },
+ { 0x2D0E, 0x10AE },
+ { 0x2D0F, 0x10AF },
+ { 0x2D10, 0x10B0 },
+ { 0x2D11, 0x10B1 },
+ { 0x2D12, 0x10B2 },
+ { 0x2D13, 0x10B3 },
+ { 0x2D14, 0x10B4 },
+ { 0x2D15, 0x10B5 },
+ { 0x2D16, 0x10B6 },
+ { 0x2D17, 0x10B7 },
+ { 0x2D18, 0x10B8 },
+ { 0x2D19, 0x10B9 },
+ { 0x2D1A, 0x10BA },
+ { 0x2D1B, 0x10BB },
+ { 0x2D1C, 0x10BC },
+ { 0x2D1D, 0x10BD },
+ { 0x2D1E, 0x10BE },
+ { 0x2D1F, 0x10BF },
+ { 0x2D20, 0x10C0 },
+ { 0x2D21, 0x10C1 },
+ { 0x2D22, 0x10C2 },
+ { 0x2D23, 0x10C3 },
+ { 0x2D24, 0x10C4 },
+ { 0x2D25, 0x10C5 },
+ { 0xA641, 0xA640 },
+ { 0xA643, 0xA642 },
+ { 0xA645, 0xA644 },
+ { 0xA647, 0xA646 },
+ { 0xA649, 0xA648 },
+ { 0xA64B, 0xA64A },
+ { 0xA64D, 0xA64C },
+ { 0xA64F, 0xA64E },
+ { 0xA651, 0xA650 },
+ { 0xA653, 0xA652 },
+ { 0xA655, 0xA654 },
+ { 0xA657, 0xA656 },
+ { 0xA659, 0xA658 },
+ { 0xA65B, 0xA65A },
+ { 0xA65D, 0xA65C },
+ { 0xA65F, 0xA65E },
+ { 0xA663, 0xA662 },
+ { 0xA665, 0xA664 },
+ { 0xA667, 0xA666 },
+ { 0xA669, 0xA668 },
+ { 0xA66B, 0xA66A },
+ { 0xA66D, 0xA66C },
+ { 0xA681, 0xA680 },
+ { 0xA683, 0xA682 },
+ { 0xA685, 0xA684 },
+ { 0xA687, 0xA686 },
+ { 0xA689, 0xA688 },
+ { 0xA68B, 0xA68A },
+ { 0xA68D, 0xA68C },
+ { 0xA68F, 0xA68E },
+ { 0xA691, 0xA690 },
+ { 0xA693, 0xA692 },
+ { 0xA695, 0xA694 },
+ { 0xA697, 0xA696 },
+ { 0xA723, 0xA722 },
+ { 0xA725, 0xA724 },
+ { 0xA727, 0xA726 },
+ { 0xA729, 0xA728 },
+ { 0xA72B, 0xA72A },
+ { 0xA72D, 0xA72C },
+ { 0xA72F, 0xA72E },
+ { 0xA733, 0xA732 },
+ { 0xA735, 0xA734 },
+ { 0xA737, 0xA736 },
+ { 0xA739, 0xA738 },
+ { 0xA73B, 0xA73A },
+ { 0xA73D, 0xA73C },
+ { 0xA73F, 0xA73E },
+ { 0xA741, 0xA740 },
+ { 0xA743, 0xA742 },
+ { 0xA745, 0xA744 },
+ { 0xA747, 0xA746 },
+ { 0xA749, 0xA748 },
+ { 0xA74B, 0xA74A },
+ { 0xA74D, 0xA74C },
+ { 0xA74F, 0xA74E },
+ { 0xA751, 0xA750 },
+ { 0xA753, 0xA752 },
+ { 0xA755, 0xA754 },
+ { 0xA757, 0xA756 },
+ { 0xA759, 0xA758 },
+ { 0xA75B, 0xA75A },
+ { 0xA75D, 0xA75C },
+ { 0xA75F, 0xA75E },
+ { 0xA761, 0xA760 },
+ { 0xA763, 0xA762 },
+ { 0xA765, 0xA764 },
+ { 0xA767, 0xA766 },
+ { 0xA769, 0xA768 },
+ { 0xA76B, 0xA76A },
+ { 0xA76D, 0xA76C },
+ { 0xA76F, 0xA76E },
+ { 0xA77A, 0xA779 },
+ { 0xA77C, 0xA77B },
+ { 0xA77F, 0xA77E },
+ { 0xA781, 0xA780 },
+ { 0xA783, 0xA782 },
+ { 0xA785, 0xA784 },
+ { 0xA787, 0xA786 },
+ { 0xA78C, 0xA78B },
+ { 0xFF41, 0xFF21 },
+ { 0xFF42, 0xFF22 },
+ { 0xFF43, 0xFF23 },
+ { 0xFF44, 0xFF24 },
+ { 0xFF45, 0xFF25 },
+ { 0xFF46, 0xFF26 },
+ { 0xFF47, 0xFF27 },
+ { 0xFF48, 0xFF28 },
+ { 0xFF49, 0xFF29 },
+ { 0xFF4A, 0xFF2A },
+ { 0xFF4B, 0xFF2B },
+ { 0xFF4C, 0xFF2C },
+ { 0xFF4D, 0xFF2D },
+ { 0xFF4E, 0xFF2E },
+ { 0xFF4F, 0xFF2F },
+ { 0xFF50, 0xFF30 },
+ { 0xFF51, 0xFF31 },
+ { 0xFF52, 0xFF32 },
+ { 0xFF53, 0xFF33 },
+ { 0xFF54, 0xFF34 },
+ { 0xFF55, 0xFF35 },
+ { 0xFF56, 0xFF36 },
+ { 0xFF57, 0xFF37 },
+ { 0xFF58, 0xFF38 },
+ { 0xFF59, 0xFF39 },
+ { 0xFF5A, 0xFF3A },
+ { 0x10428, 0x10400 },
+ { 0x10429, 0x10401 },
+ { 0x1042A, 0x10402 },
+ { 0x1042B, 0x10403 },
+ { 0x1042C, 0x10404 },
+ { 0x1042D, 0x10405 },
+ { 0x1042E, 0x10406 },
+ { 0x1042F, 0x10407 },
+ { 0x10430, 0x10408 },
+ { 0x10431, 0x10409 },
+ { 0x10432, 0x1040A },
+ { 0x10433, 0x1040B },
+ { 0x10434, 0x1040C },
+ { 0x10435, 0x1040D },
+ { 0x10436, 0x1040E },
+ { 0x10437, 0x1040F },
+ { 0x10438, 0x10410 },
+ { 0x10439, 0x10411 },
+ { 0x1043A, 0x10412 },
+ { 0x1043B, 0x10413 },
+ { 0x1043C, 0x10414 },
+ { 0x1043D, 0x10415 },
+ { 0x1043E, 0x10416 },
+ { 0x1043F, 0x10417 },
+ { 0x10440, 0x10418 },
+ { 0x10441, 0x10419 },
+ { 0x10442, 0x1041A },
+ { 0x10443, 0x1041B },
+ { 0x10444, 0x1041C },
+ { 0x10445, 0x1041D },
+ { 0x10446, 0x1041E },
+ { 0x10447, 0x1041F },
+ { 0x10448, 0x10420 },
+ { 0x10449, 0x10421 },
+ { 0x1044A, 0x10422 },
+ { 0x1044B, 0x10423 },
+ { 0x1044C, 0x10424 },
+ { 0x1044D, 0x10425 },
+ { 0x1044E, 0x10426 },
+ { 0x1044F, 0x10427 }
+
+#define MAP(c) uc_toupper (c)
+#include "test-mapping-part2.h"
diff --git a/gnulib/tests/unicase/test-ulc-casecmp.c b/gnulib/tests/unicase/test-ulc-casecmp.c
new file mode 100644
index 00000000..fd866135
--- /dev/null
+++ b/gnulib/tests/unicase/test-ulc-casecmp.c
@@ -0,0 +1,394 @@
+/* Test of case and normalization insensitive comparison of strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <locale.h>
+#include "macros.h"
+
+#define UNIT char
+#include "test-casecmp.h"
+#undef UNIT
+
+static void
+test_iso_8859_1 (int (*my_casecmp) (const char *, size_t, const char *, size_t, const char *, uninorm_t, int *))
+{
+ {
+ static const char input1[] = { 'H', 0xF6, 'h', 'l', 'e' };
+ static const char input2[] = { 'H', 0xD6, 'h', 'L', 'e' };
+ static const char input3[] = { 'H', 0xF6, 'h', 'l', 'e', 'n' };
+ static const char input4[] = { 'H', 0xD6, 'h', 'L', 'e', 'n' };
+ static const char input5[] = { 'H', 'u', 'r', 'z' };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input3, SIZEOF (input3), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input4, SIZEOF (input4), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const char input1[] = { 0x68, 0x65, 0x69, 0xDF };
+ static const char input2[] = { 0x68, 0x65, 0x69, 0x73, 0x73 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+}
+
+static void
+test_utf_8 (int (*my_casecmp) (const char *, size_t, const char *, size_t, const char *, uninorm_t, int *))
+{
+ /* Normalization effects. */
+ {
+ static const char input1[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e' };
+ static const char input2[] = { 'H', 'O', 0xCC, 0x88, 'h', 'L', 'e' };
+ static const char input3[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e', 'n' };
+ static const char input4[] = { 'H', 'O', 0xCC, 0x88, 'h', 'L', 'e', 'n' };
+ static const char input5[] = { 'H', 'u', 'r', 'z' };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input1, SIZEOF (input1), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input3, SIZEOF (input3), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input4, SIZEOF (input4), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input4, SIZEOF (input4), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input5, SIZEOF (input5), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const char input1[] = { 0xC3, 0x84 };
+ static const char input2[] = { 0x41, 0xCC, 0x88 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const char input1[] = { 0xC7, 0x9E };
+ static const char input2[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const char input1[] = { 0xE1, 0xBF, 0x81 };
+ static const char input2[] = { 0xC2, 0xA8, 0xCD, 0x82 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEUL */
+ static const char input1[] = { 0xEA, 0xB8, 0x80 };
+ static const char input2[] = { 0xEA, 0xB7, 0xB8, 0xE1, 0x86, 0xAF };
+ static const char input3[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEU */
+ static const char input1[] = { 0xEA, 0xB7, 0xB8 };
+ static const char input2[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const char input1[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const char input2[] =
+ { 'g', 'r', 0xC3, 0xBC, 0x73, 0x73, ' ', 'g', 'o', 't', 't', '.', ' ',
+ 0xD0, 0xB7, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const char input3[] =
+ { 'G', 'R', 0xC3, 0x9C, 0x53, 0x53, ' ', 'G', 'O', 'T', 'T', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0x94, 0xD0, 0xA0, 0xD0, 0x90, 0xD0, 0x92, 0xD0, 0xA1,
+ 0xD0, 0xA2, 0xD0, 0x92, 0xD0, 0xA3, 0xD0, 0x99, 0xD0, 0xA2, 0xD0, 0x95,
+ '!', ' ', 'X', '=', '(', '-', 'B', 0xC2, 0xB1, 'S', 'Q', 'R', 'T', '(',
+ 'B', 0xC2, 0xB2, '-', '4', 'A', 'C', ')', ')', '/', '(', '2', 'A', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mapping can increase the number of Unicode characters. */
+ { /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ static const char input1[] = { 0xC5, 0x89 };
+ static const char input2[] = { 0xCA, 0xBC, 0x6E };
+ static const char input3[] = { 0xCA, 0xBC, 0x4E };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ static const char input1[] = { 0xCE, 0x90 };
+ static const char input2[] = { 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Turkish letters i İ ı I */
+ { /* LATIN CAPITAL LETTER I */
+ static const char input[] = { 0x49 };
+ static const char casefolded[] = { 0x69 };
+ static const char casefolded_tr[] = { 0xC4, 0xB1 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN SMALL LETTER I */
+ static const char input[] = { 0x69 };
+ static const char casefolded[] = { 0x49 };
+ static const char casefolded_tr[] = { 0xC4, 0xB0 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ static const char input[] = { 0xC4, 0xB0 };
+ static const char casefolded[] = { 0x69, 0xCC, 0x87 };
+ static const char casefolded_tr[] = { 0x69 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_tr, SIZEOF (casefolded_tr), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN SMALL LETTER DOTLESS I */
+ static const char input[] = { 0xC4, 0xB1 };
+ static const char casefolded[] = { 0x49 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* "topkapı" */
+ static const char input[] =
+ { 0x54, 0x4F, 0x50, 0x4B, 0x41, 0x50, 0x49 };
+ static const char casefolded[] =
+ { 0x74, 0x6F, 0x70, 0x6B, 0x61, 0x70, 0xC4, 0xB1 };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), "tr", NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Uppercasing can increase the number of Unicode characters. */
+ { /* "heiß" */
+ static const char input1[] = { 0x68, 0x65, 0x69, 0xC3, 0x9F };
+ static const char input2[] = { 0x68, 0x65, 0x69, 0x73, 0x73 };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mappings for some characters can depend on the surrounding characters. */
+ { /* "περισσότερες πληροφορίες" */
+ static const char input1[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x82,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x82
+ };
+ static const char input2[] =
+ {
+ 0xCF, 0x80, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB9, 0xCF, 0x83, 0xCF, 0x83,
+ 0xCF, 0x8C, 0xCF, 0x84, 0xCE, 0xB5, 0xCF, 0x81, 0xCE, 0xB5, 0xCF, 0x83,
+ ' ', 0xCF, 0x80, 0xCE, 0xBB, 0xCE, 0xB7, 0xCF, 0x81, 0xCE, 0xBF,
+ 0xCF, 0x86, 0xCE, 0xBF, 0xCF, 0x81, 0xCE, 0xAF, 0xCE, 0xB5, 0xCF, 0x83
+ };
+ static const char input3[] =
+ {
+ 0xCE, 0xA0, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x99, 0xCE, 0xA3, 0xCE, 0xA3,
+ 0xCE, 0x8C, 0xCE, 0xA4, 0xCE, 0x95, 0xCE, 0xA1, 0xCE, 0x95, 0xCE, 0xA3,
+ ' ', 0xCE, 0xA0, 0xCE, 0x9B, 0xCE, 0x97, 0xCE, 0xA1, 0xCE, 0x9F,
+ 0xCE, 0xA6, 0xCE, 0x9F, 0xCE, 0xA1, 0xCE, 0x8A, 0xCE, 0x95, 0xCE, 0xA3
+ };
+ int cmp;
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input2, SIZEOF (input2), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input1, SIZEOF (input1), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input2, SIZEOF (input2), input3, SIZEOF (input3), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Case mapping can require subsequent normalization. */
+ { /* LATIN SMALL LETTER J WITH CARON, COMBINING DOT BELOW */
+ static const char input[] = { 0xC7, 0xB0, 0xCC, 0xA3 };
+ static const char casefolded[] = { 0x6A, 0xCC, 0x8C, 0xCC, 0xA3 };
+ static const char casefolded_decomposed[] = { 0x6A, 0xCC, 0xA3, 0xCC, 0x8C };
+ int cmp;
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed), NULL, NULL, &cmp) == 0);
+ ASSERT (cmp != 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded, SIZEOF (casefolded), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_casecmp (input, SIZEOF (input), casefolded_decomposed, SIZEOF (casefolded_decomposed), NULL, UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_ascii (ulc_casecmp, UNINORM_NFD);
+
+ if (argc > 1)
+ switch (argv[1][0])
+ {
+ case '1':
+ /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
+ test_iso_8859_1 (ulc_casecmp);
+ return 0;
+
+ case '2':
+ /* Locale encoding is UTF-8. */
+ test_utf_8 (ulc_casecmp);
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/gnulib/tests/unicase/test-ulc-casecmp1.sh b/gnulib/tests/unicase/test-ulc-casecmp1.sh
new file mode 100755
index 00000000..7be2cca1
--- /dev/null
+++ b/gnulib/tests/unicase/test-ulc-casecmp1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-ulc-casecmp${EXEEXT} 1
diff --git a/gnulib/tests/unicase/test-ulc-casecmp2.sh b/gnulib/tests/unicase/test-ulc-casecmp2.sh
new file mode 100755
index 00000000..a7f06e88
--- /dev/null
+++ b/gnulib/tests/unicase/test-ulc-casecmp2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-ulc-casecmp${EXEEXT} 2
diff --git a/gnulib/tests/unicase/test-ulc-casecoll.c b/gnulib/tests/unicase/test-ulc-casecoll.c
new file mode 100644
index 00000000..d3b759cb
--- /dev/null
+++ b/gnulib/tests/unicase/test-ulc-casecoll.c
@@ -0,0 +1,45 @@
+/* Test of locale dependent, case and normalization insensitive comparison of
+ strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "unicase.h"
+
+#include <locale.h>
+
+#include "uninorm.h"
+#include "macros.h"
+
+#define UNIT char
+#include "test-casecmp.h"
+#undef UNIT
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* In the "C" locale, strcoll is equivalent to strcmp, therefore u8_casecoll
+ on ASCII strings should behave like strcasecmp. */
+ test_ascii (ulc_casecoll, UNINORM_NFC);
+
+ return 0;
+}
diff --git a/gnulib/tests/unicase/test-ulc-casecoll1.sh b/gnulib/tests/unicase/test-ulc-casecoll1.sh
new file mode 100755
index 00000000..3760ed82
--- /dev/null
+++ b/gnulib/tests/unicase/test-ulc-casecoll1.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-ulc-casecoll${EXEEXT}
diff --git a/gnulib/tests/unicase/test-ulc-casecoll2.sh b/gnulib/tests/unicase/test-ulc-casecoll2.sh
new file mode 100755
index 00000000..b179a4c6
--- /dev/null
+++ b/gnulib/tests/unicase/test-ulc-casecoll2.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test whether a specific UTF-8 locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR_UTF8 \
+./test-ulc-casecoll${EXEEXT}
diff --git a/gnulib/tests/uniconv/test-u16-conv-from-enc.c b/gnulib/tests/uniconv/test-u16-conv-from-enc.c
new file mode 100644
index 00000000..05e8b248
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u16-conv-from-enc.c
@@ -0,0 +1,219 @@
+/* Test of conversion to UTF-16 from legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+/* Magic number for detecting bounds violations. */
+#define MAGIC 0x1983EFF1
+
+static size_t *
+new_offsets (size_t n)
+{
+ size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
+ offsets[n] = MAGIC;
+ return offsets;
+}
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+ size_t o;
+ size_t i;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from ISO-8859-1 to UTF-16 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const uint16_t expected[] = /* Ärger mit bösen Bübchen ohne Augenmaß */
+ {
+ 0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
+ 'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
+ 'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint16_t *result = u16_conv_from_encoding ("ISO-8859-1", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u16_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from ISO-8859-2 to UTF-16 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ static const uint16_t expected[] =
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i'
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint16_t *result = u16_conv_from_encoding ("ISO-8859-2", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u16_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* autodetect_jp is only supported when iconv() support ISO-2022-JP-2. */
+# if defined _LIBICONV_VERSION || !(defined _AIX || defined __sgi || defined __hpux || defined __osf__ || defined __sun)
+ /* Test conversions from autodetect_jp to UTF-16. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\244\263\244\363\244\313\244\301\244\317"; /* こんにちは in EUC-JP */
+ static const uint16_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint16_t *result = u16_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u16_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 10; i++)
+ ASSERT (offsets[i] == ((i % 2) == 0 ? i / 2 : (size_t)(-1)));
+ ASSERT (offsets[10] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\202\261\202\361\202\311\202\277\202\315"; /* こんにちは in Shift_JIS */
+ static const uint16_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint16_t *result = u16_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u16_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 10; i++)
+ ASSERT (offsets[i] == ((i % 2) == 0 ? i / 2 : (size_t)(-1)));
+ ASSERT (offsets[10] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\033$B$3$s$K$A$O\033(B"; /* こんにちは in ISO-2022-JP-2 */
+ static const uint16_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint16_t *result = u16_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u16_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i == 0 ? 0 :
+ i == 5 ? 1 :
+ i == 7 ? 2 :
+ i == 9 ? 3 :
+ i == 11 ? 4 :
+ i == 13 ? 5 :
+ (size_t)(-1)));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u16-conv-to-enc.c b/gnulib/tests/uniconv/test-u16-conv-to-enc.c
new file mode 100644
index 00000000..27b2b44d
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u16-conv-to-enc.c
@@ -0,0 +1,176 @@
+/* Test of conversion from UTF-16 to legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+/* Magic number for detecting bounds violations. */
+#define MAGIC 0x1983EFF1
+
+static size_t *
+new_offsets (size_t n)
+{
+ size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
+ offsets[n] = MAGIC;
+ return offsets;
+}
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+ size_t o;
+ size_t i;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from UTF-16 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint16_t input[] = /* Ärger mit bösen Bübchen ohne Augenmaß */
+ {
+ 0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
+ 'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
+ 'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF
+ };
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (SIZEOF (input)) : NULL);
+ size_t length;
+ char *result = u16_conv_to_encoding ("ISO-8859-1", handler,
+ input, SIZEOF (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from UTF-16 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint16_t input[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i'
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (SIZEOF (input)) : NULL);
+ size_t length = 0xdead;
+ char *result = u16_conv_to_encoding ("ISO-8859-1", handler,
+ input, SIZEOF (input),
+ offsets,
+ NULL, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+ ASSERT (length == 0xdead);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ static const char expected_translit[] = "Rafal Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0
+ || memcmp (result, expected_translit, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i < 5 ? i : i + 5));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from UTF-16 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint16_t input[] = { 0xD845 };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (SIZEOF (input)) : NULL);
+ size_t length;
+ char *result = u16_conv_to_encoding ("ISO-8859-1", handler,
+ input, SIZEOF (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (""));
+ if (o)
+ {
+ ASSERT (offsets[0] == 0);
+ ASSERT (offsets[1] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u16-strconv-from-enc.c b/gnulib/tests/uniconv/test-u16-strconv-from-enc.c
new file mode 100644
index 00000000..fb6696ab
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u16-strconv-from-enc.c
@@ -0,0 +1,119 @@
+/* Test of conversion to UTF-16 from legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from ISO-8859-1 to UTF-16 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const uint16_t expected[] = /* Ärger mit bösen Bübchen ohne Augenmaß */
+ {
+ 0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
+ 'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
+ 'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF, 0
+ };
+ uint16_t *result = u16_strconv_from_encoding (input, "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from ISO-8859-2 to UTF-16 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ static const uint16_t expected[] =
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ uint16_t *result = u16_strconv_from_encoding (input, "ISO-8859-2", handler);
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* autodetect_jp is only supported when iconv() support ISO-2022-JP-2. */
+# if defined _LIBICONV_VERSION || !(defined _AIX || defined __sgi || defined __hpux || defined __osf__ || defined __sun)
+ /* Test conversions from autodetect_jp to UTF-16. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\244\263\244\363\244\313\244\301\244\317"; /* こんにちは in EUC-JP */
+ static const uint16_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F, 0
+ };
+ uint16_t *result = u16_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\202\261\202\361\202\311\202\277\202\315"; /* こんにちは in Shift_JIS */
+ static const uint16_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F, 0
+ };
+ uint16_t *result = u16_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\033$B$3$s$K$A$O\033(B"; /* こんにちは in ISO-2022-JP-2 */
+ static const uint16_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F, 0
+ };
+ uint16_t *result = u16_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u16-strconv-to-enc.c b/gnulib/tests/uniconv/test-u16-strconv-to-enc.c
new file mode 100644
index 00000000..819a9933
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u16-strconv-to-enc.c
@@ -0,0 +1,109 @@
+/* Test of conversion from UTF-16 to legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from UTF-16 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint16_t input[] = /* Ärger mit bösen Bübchen ohne Augenmaß */
+ {
+ 0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
+ 'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
+ 'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF, 0
+ };
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = u16_strconv_to_encoding (input, "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-16 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint16_t input[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ char *result = u16_strconv_to_encoding (input, "ISO-8859-1", handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ static const char expected_translit[] = "Rafal Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ || strcmp (result, expected_translit) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+# if 0
+ /* Test conversion from UTF-16 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint16_t input[] = { 0xD845, 0 };
+ char *result = u16_strconv_to_encoding (input, "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u32-conv-from-enc.c b/gnulib/tests/uniconv/test-u32-conv-from-enc.c
new file mode 100644
index 00000000..6dcb615f
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u32-conv-from-enc.c
@@ -0,0 +1,219 @@
+/* Test of conversion to UTF-32 from legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+/* Magic number for detecting bounds violations. */
+#define MAGIC 0x1983EFF1
+
+static size_t *
+new_offsets (size_t n)
+{
+ size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
+ offsets[n] = MAGIC;
+ return offsets;
+}
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+ size_t o;
+ size_t i;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from ISO-8859-1 to UTF-16 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const uint32_t expected[] = /* Ärger mit bösen Bübchen ohne Augenmaß */
+ {
+ 0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
+ 'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
+ 'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint32_t *result = u32_conv_from_encoding ("ISO-8859-1", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u32_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from ISO-8859-2 to UTF-16 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ static const uint32_t expected[] =
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i'
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint32_t *result = u32_conv_from_encoding ("ISO-8859-2", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u32_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* autodetect_jp is only supported when iconv() support ISO-2022-JP-2. */
+# if defined _LIBICONV_VERSION || !(defined _AIX || defined __sgi || defined __hpux || defined __osf__ || defined __sun)
+ /* Test conversions from autodetect_jp to UTF-16. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\244\263\244\363\244\313\244\301\244\317"; /* こんにちは in EUC-JP */
+ static const uint32_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint32_t *result = u32_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u32_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 10; i++)
+ ASSERT (offsets[i] == ((i % 2) == 0 ? i / 2 : (size_t)(-1)));
+ ASSERT (offsets[10] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\202\261\202\361\202\311\202\277\202\315"; /* こんにちは in Shift_JIS */
+ static const uint32_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint32_t *result = u32_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u32_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 10; i++)
+ ASSERT (offsets[i] == ((i % 2) == 0 ? i / 2 : (size_t)(-1)));
+ ASSERT (offsets[10] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\033$B$3$s$K$A$O\033(B"; /* こんにちは in ISO-2022-JP-2 */
+ static const uint32_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint32_t *result = u32_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == SIZEOF (expected));
+ ASSERT (u32_cmp (result, expected, SIZEOF (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i == 0 ? 0 :
+ i == 5 ? 1 :
+ i == 7 ? 2 :
+ i == 9 ? 3 :
+ i == 11 ? 4 :
+ i == 13 ? 5 :
+ (size_t)(-1)));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u32-conv-to-enc.c b/gnulib/tests/uniconv/test-u32-conv-to-enc.c
new file mode 100644
index 00000000..24cb72a8
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u32-conv-to-enc.c
@@ -0,0 +1,151 @@
+/* Test of conversion from UTF-32 to legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+/* Magic number for detecting bounds violations. */
+#define MAGIC 0x1983EFF1
+
+static size_t *
+new_offsets (size_t n)
+{
+ size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
+ offsets[n] = MAGIC;
+ return offsets;
+}
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+ size_t o;
+ size_t i;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from UTF-32 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint32_t input[] = /* Ärger mit bösen Bübchen ohne Augenmaß */
+ {
+ 0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
+ 'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
+ 'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF
+ };
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (SIZEOF (input)) : NULL);
+ size_t length;
+ char *result = u32_conv_to_encoding ("ISO-8859-1", handler,
+ input, SIZEOF (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from UTF-32 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint32_t input[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i'
+ };
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (SIZEOF (input)) : NULL);
+ size_t length = 0xdead;
+ char *result = u32_conv_to_encoding ("ISO-8859-1", handler,
+ input, SIZEOF (input),
+ offsets,
+ NULL, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+ ASSERT (length == 0xdead);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ static const char expected_translit[] = "Rafal Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0
+ || memcmp (result, expected_translit, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == i);
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i < 5 ? i : i + 5));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u32-strconv-from-enc.c b/gnulib/tests/uniconv/test-u32-strconv-from-enc.c
new file mode 100644
index 00000000..e1a46f57
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u32-strconv-from-enc.c
@@ -0,0 +1,119 @@
+/* Test of conversion to UTF-32 from legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from ISO-8859-1 to UTF-16 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const uint32_t expected[] = /* Ärger mit bösen Bübchen ohne Augenmaß */
+ {
+ 0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
+ 'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
+ 'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF, 0
+ };
+ uint32_t *result = u32_strconv_from_encoding (input, "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from ISO-8859-2 to UTF-16 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ static const uint32_t expected[] =
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ uint32_t *result = u32_strconv_from_encoding (input, "ISO-8859-2", handler);
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* autodetect_jp is only supported when iconv() support ISO-2022-JP-2. */
+# if defined _LIBICONV_VERSION || !(defined _AIX || defined __sgi || defined __hpux || defined __osf__ || defined __sun)
+ /* Test conversions from autodetect_jp to UTF-16. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\244\263\244\363\244\313\244\301\244\317"; /* こんにちは in EUC-JP */
+ static const uint32_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F, 0
+ };
+ uint32_t *result = u32_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\202\261\202\361\202\311\202\277\202\315"; /* こんにちは in Shift_JIS */
+ static const uint32_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F, 0
+ };
+ uint32_t *result = u32_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\033$B$3$s$K$A$O\033(B"; /* こんにちは in ISO-2022-JP-2 */
+ static const uint32_t expected[] = /* こんにちは */
+ {
+ 0x3053, 0x3093, 0x306B, 0x3061, 0x306F, 0
+ };
+ uint32_t *result = u32_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u32-strconv-to-enc.c b/gnulib/tests/uniconv/test-u32-strconv-to-enc.c
new file mode 100644
index 00000000..2ce125c2
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u32-strconv-to-enc.c
@@ -0,0 +1,95 @@
+/* Test of conversion from UTF-32 to legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include "macros.h"
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from UTF-32 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint32_t input[] = /* Ärger mit bösen Bübchen ohne Augenmaß */
+ {
+ 0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
+ 'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
+ 'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF, 0
+ };
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = u32_strconv_to_encoding (input, "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-32 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint32_t input[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ char *result = u32_strconv_to_encoding (input, "ISO-8859-1", handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ static const char expected_translit[] = "Rafal Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ || strcmp (result, expected_translit) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u8-conv-from-enc.c b/gnulib/tests/uniconv/test-u8-conv-from-enc.c
new file mode 100644
index 00000000..9655c751
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u8-conv-from-enc.c
@@ -0,0 +1,205 @@
+/* Test of conversion to UTF-8 from legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+/* Magic number for detecting bounds violations. */
+#define MAGIC 0x1983EFF1
+
+static size_t *
+new_offsets (size_t n)
+{
+ size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
+ offsets[n] = MAGIC;
+ return offsets;
+}
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+ size_t o;
+ size_t i;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const uint8_t expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint8_t *result = u8_conv_from_encoding ("ISO-8859-1", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == u8_strlen (expected));
+ ASSERT (u8_cmp (result, expected, u8_strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 37; i++)
+ ASSERT (offsets[i] == (i < 1 ? i :
+ i < 12 ? i + 1 :
+ i < 18 ? i + 2 :
+ i + 3));
+ ASSERT (offsets[37] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from ISO-8859-2 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ static const uint8_t expected[] = "Rafa\305\202 Maszkowski";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint8_t *result = u8_conv_from_encoding ("ISO-8859-2", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == u8_strlen (expected));
+ ASSERT (u8_cmp (result, expected, u8_strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i + 1));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* autodetect_jp is only supported when iconv() support ISO-2022-JP-2. */
+# if defined _LIBICONV_VERSION || !(defined _AIX || defined __sgi || defined __hpux || defined __osf__ || defined __sun)
+ /* Test conversions from autodetect_jp to UTF-8. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\244\263\244\363\244\313\244\301\244\317"; /* こんにちは in EUC-JP */
+ static const uint8_t expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint8_t *result = u8_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == u8_strlen (expected));
+ ASSERT (u8_cmp (result, expected, u8_strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 10; i++)
+ ASSERT (offsets[i] == ((i % 2) == 0 ? (i / 2) * 3 : (size_t)(-1)));
+ ASSERT (offsets[10] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\202\261\202\361\202\311\202\277\202\315"; /* こんにちは in Shift_JIS */
+ static const uint8_t expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint8_t *result = u8_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == u8_strlen (expected));
+ ASSERT (u8_cmp (result, expected, u8_strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 10; i++)
+ ASSERT (offsets[i] == ((i % 2) == 0 ? (i / 2) * 3 : (size_t)(-1)));
+ ASSERT (offsets[10] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\033$B$3$s$K$A$O\033(B"; /* こんにちは in ISO-2022-JP-2 */
+ static const uint8_t expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (strlen (input)) : NULL);
+ size_t length;
+ uint8_t *result = u8_conv_from_encoding ("autodetect_jp", handler,
+ input, strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == u8_strlen (expected));
+ ASSERT (u8_cmp (result, expected, u8_strlen (expected)) == 0);
+ if (o)
+ {
+ for (i = 0; i < 16; i++)
+ ASSERT (offsets[i] == (i == 0 ? 0 :
+ i == 5 ? 3 :
+ i == 7 ? 6 :
+ i == 9 ? 9 :
+ i == 11 ? 12 :
+ i == 13 ? 15 :
+ (size_t)(-1)));
+ ASSERT (offsets[16] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u8-conv-to-enc.c b/gnulib/tests/uniconv/test-u8-conv-to-enc.c
new file mode 100644
index 00000000..d758e9b3
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u8-conv-to-enc.c
@@ -0,0 +1,180 @@
+/* Test of conversion from UTF-8 to legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+/* Magic number for detecting bounds violations. */
+#define MAGIC 0x1983EFF1
+
+static size_t *
+new_offsets (size_t n)
+{
+ size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
+ offsets[n] = MAGIC;
+ return offsets;
+}
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+ size_t o;
+ size_t i;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint8_t input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (u8_strlen (input)) : NULL);
+ size_t length;
+ char *result = u8_conv_to_encoding ("ISO-8859-1", handler,
+ input, u8_strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 41; i++)
+ ASSERT (offsets[i] == (i < 1 ? i :
+ i == 1 ? (size_t)(-1) :
+ i < 13 ? i - 1 :
+ i == 13 ? (size_t)(-1) :
+ i < 20 ? i - 2 :
+ i == 20 ? (size_t)(-1) :
+ i < 40 ? i - 3 :
+ i == 40 ? (size_t)(-1) :
+ i - 4));
+ ASSERT (offsets[41] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint8_t input[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (u8_strlen (input)) : NULL);
+ size_t length = 0xdead;
+ char *result = u8_conv_to_encoding ("ISO-8859-1", handler,
+ input, u8_strlen (input),
+ offsets,
+ NULL, &length);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+ ASSERT (length == 0xdead);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ static const char expected_translit[] = "Rafal Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0
+ || memcmp (result, expected_translit, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 17; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i == 5 ? (size_t)(-1) :
+ i - 1));
+ ASSERT (offsets[17] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (expected));
+ ASSERT (memcmp (result, expected, length) == 0);
+ if (o)
+ {
+ for (i = 0; i < 17; i++)
+ ASSERT (offsets[i] == (i < 5 ? i :
+ i == 5 ? (size_t)(-1) :
+ i + 4));
+ ASSERT (offsets[17] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint8_t input[] = "\342";
+ for (o = 0; o < 2; o++)
+ {
+ size_t *offsets = (o ? new_offsets (u8_strlen (input)) : NULL);
+ size_t length;
+ char *result = u8_conv_to_encoding ("ISO-8859-1", handler,
+ input, u8_strlen (input),
+ offsets,
+ NULL, &length);
+ ASSERT (result != NULL);
+ ASSERT (length == strlen (""));
+ if (o)
+ {
+ ASSERT (offsets[0] == 0);
+ ASSERT (offsets[1] == MAGIC);
+ free (offsets);
+ }
+ free (result);
+ }
+ }
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u8-strconv-from-enc.c b/gnulib/tests/uniconv/test-u8-strconv-from-enc.c
new file mode 100644
index 00000000..30ebe767
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u8-strconv-from-enc.c
@@ -0,0 +1,101 @@
+/* Test of conversion to UTF-8 from legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ static const uint8_t expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ uint8_t *result = u8_strconv_from_encoding (input, "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from ISO-8859-2 to UTF-8 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "Rafa\263 Maszkowski"; /* Rafał Maszkowski */
+ static const uint8_t expected[] = "Rafa\305\202 Maszkowski";
+ uint8_t *result = u8_strconv_from_encoding (input, "ISO-8859-2", handler);
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* autodetect_jp is only supported when iconv() support ISO-2022-JP-2. */
+# if defined _LIBICONV_VERSION || !(defined _AIX || defined __sgi || defined __hpux || defined __osf__ || defined __sun)
+ /* Test conversions from autodetect_jp to UTF-8. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\244\263\244\363\244\313\244\301\244\317"; /* こんにちは in EUC-JP */
+ static const uint8_t expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ uint8_t *result = u8_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\202\261\202\361\202\311\202\277\202\315"; /* こんにちは in Shift_JIS */
+ static const uint8_t expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ uint8_t *result = u8_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const char input[] = "\033$B$3$s$K$A$O\033(B"; /* こんにちは in ISO-2022-JP-2 */
+ static const uint8_t expected[] = "\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257"; /* こんにちは */
+ uint8_t *result = u8_strconv_from_encoding (input, "autodetect_jp", handler);
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniconv/test-u8-strconv-to-enc.c b/gnulib/tests/uniconv/test-u8-strconv-to-enc.c
new file mode 100644
index 00000000..bbdb6d81
--- /dev/null
+++ b/gnulib/tests/uniconv/test-u8-strconv-to-enc.c
@@ -0,0 +1,100 @@
+/* Test of conversion from UTF-8 to legacy encodings.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ static enum iconv_ilseq_handler handlers[] =
+ { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
+ size_t h;
+
+#if HAVE_ICONV
+ /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
+ ISO-8859-2, and UTF-8. */
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint8_t input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
+ static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char *result = u8_strconv_to_encoding (input, "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint8_t input[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ char *result = u8_strconv_to_encoding (input, "ISO-8859-1", handler);
+ switch (handler)
+ {
+ case iconveh_error:
+ ASSERT (result == NULL && errno == EILSEQ);
+ break;
+ case iconveh_question_mark:
+ {
+ static const char expected[] = "Rafa? Maszkowski";
+ static const char expected_translit[] = "Rafal Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0
+ || strcmp (result, expected_translit) == 0);
+ free (result);
+ }
+ break;
+ case iconveh_escape_sequence:
+ {
+ static const char expected[] = "Rafa\\u0142 Maszkowski";
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, expected) == 0);
+ free (result);
+ }
+ break;
+ }
+ }
+
+# if 0
+ /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
+ for (h = 0; h < SIZEOF (handlers); h++)
+ {
+ enum iconv_ilseq_handler handler = handlers[h];
+ static const uint8_t input[] = "\342";
+ char *result = u8_strconv_to_encoding (input, "ISO-8859-1", handler);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "") == 0);
+ free (result);
+ }
+# endif
+
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-bidi_byname.c b/gnulib/tests/unictype/test-bidi_byname.c
new file mode 100644
index 00000000..9139131b
--- /dev/null
+++ b/gnulib/tests/unictype/test-bidi_byname.c
@@ -0,0 +1,51 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (uc_bidi_category_byname ("L") == UC_BIDI_L);
+ ASSERT (uc_bidi_category_byname ("LRE") == UC_BIDI_LRE);
+ ASSERT (uc_bidi_category_byname ("LRO") == UC_BIDI_LRO);
+ ASSERT (uc_bidi_category_byname ("R") == UC_BIDI_R);
+ ASSERT (uc_bidi_category_byname ("AL") == UC_BIDI_AL);
+ ASSERT (uc_bidi_category_byname ("RLE") == UC_BIDI_RLE);
+ ASSERT (uc_bidi_category_byname ("RLO") == UC_BIDI_RLO);
+ ASSERT (uc_bidi_category_byname ("PDF") == UC_BIDI_PDF);
+ ASSERT (uc_bidi_category_byname ("EN") == UC_BIDI_EN);
+ ASSERT (uc_bidi_category_byname ("ES") == UC_BIDI_ES);
+ ASSERT (uc_bidi_category_byname ("ET") == UC_BIDI_ET);
+ ASSERT (uc_bidi_category_byname ("AN") == UC_BIDI_AN);
+ ASSERT (uc_bidi_category_byname ("CS") == UC_BIDI_CS);
+ ASSERT (uc_bidi_category_byname ("NSM") == UC_BIDI_NSM);
+ ASSERT (uc_bidi_category_byname ("BN") == UC_BIDI_BN);
+ ASSERT (uc_bidi_category_byname ("B") == UC_BIDI_B);
+ ASSERT (uc_bidi_category_byname ("S") == UC_BIDI_S);
+ ASSERT (uc_bidi_category_byname ("WS") == UC_BIDI_WS);
+ ASSERT (uc_bidi_category_byname ("ON") == UC_BIDI_ON);
+ ASSERT (uc_bidi_category_byname ("X") < 0);
+ ASSERT (uc_bidi_category_byname ("") < 0);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-bidi_name.c b/gnulib/tests/unictype/test-bidi_name.c
new file mode 100644
index 00000000..1a4ef0ba
--- /dev/null
+++ b/gnulib/tests/unictype/test-bidi_name.c
@@ -0,0 +1,32 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (strcmp (uc_bidi_category_name (UC_BIDI_NSM), "NSM") == 0);
+ ASSERT (uc_bidi_category_name (-1) == NULL);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-bidi_of.c b/gnulib/tests/unictype/test-bidi_of.c
new file mode 100644
index 00000000..91fda153
--- /dev/null
+++ b/gnulib/tests/unictype/test-bidi_of.c
@@ -0,0 +1,33 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (uc_bidi_category ('x') == UC_BIDI_L);
+ ASSERT (uc_bidi_category (0x05D7) == UC_BIDI_R);
+ ASSERT (uc_bidi_category ('7') == UC_BIDI_EN);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-bidi_test.c b/gnulib/tests/unictype/test-bidi_test.c
new file mode 100644
index 00000000..c9e7b39f
--- /dev/null
+++ b/gnulib/tests/unictype/test-bidi_test.c
@@ -0,0 +1,48 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (uc_is_bidi_category ('x', UC_BIDI_L));
+ ASSERT (!uc_is_bidi_category ('x', UC_BIDI_R));
+ ASSERT (!uc_is_bidi_category ('x', UC_BIDI_EN));
+
+ ASSERT (uc_is_bidi_category (0x05D7, UC_BIDI_R));
+ ASSERT (!uc_is_bidi_category (0x05D7, UC_BIDI_L));
+ ASSERT (!uc_is_bidi_category (0x05D7, UC_BIDI_EN));
+
+ ASSERT (uc_is_bidi_category ('7', UC_BIDI_EN));
+ ASSERT (!uc_is_bidi_category ('7', UC_BIDI_L));
+ ASSERT (!uc_is_bidi_category ('7', UC_BIDI_R));
+
+ {
+ unsigned int c;
+
+ for (c = 0; c < 0x110000; c++)
+ ASSERT (uc_is_bidi_category (c, uc_bidi_category (c)));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-block_list.c b/gnulib/tests/unictype/test-block_list.c
new file mode 100644
index 00000000..d4755464
--- /dev/null
+++ b/gnulib/tests/unictype/test-block_list.c
@@ -0,0 +1,50 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ const uc_block_t *blocks;
+ size_t nblocks;
+
+ uc_all_blocks (&blocks, &nblocks);
+
+ {
+ const uc_block_t *latin_block = NULL;
+ const uc_block_t *hebrew_block = NULL;
+ size_t i;
+
+ for (i = 0; i < nblocks; i++)
+ {
+ if (strcmp (blocks[i].name, "Latin") == 0)
+ latin_block = &blocks[i];
+ if (strcmp (blocks[i].name, "Hebrew") == 0)
+ hebrew_block = &blocks[i];
+ }
+ ASSERT (latin_block == NULL);
+ ASSERT (hebrew_block != NULL);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-block_of.c b/gnulib/tests/unictype/test-block_of.c
new file mode 100644
index 00000000..230fa87d
--- /dev/null
+++ b/gnulib/tests/unictype/test-block_of.c
@@ -0,0 +1,67 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (strcmp (uc_block ('x')->name, "Basic Latin") == 0);
+ ASSERT (strcmp (uc_block (0x20AC)->name, "Currency Symbols") == 0);
+
+ {
+ unsigned int c;
+
+ for (c = 0; c < 0x110000; c++)
+ {
+ const uc_block_t *block = uc_block (c);
+ ASSERT (block == NULL || uc_is_block (c, block));
+ }
+ }
+
+ {
+ const uc_block_t *blocks;
+ size_t nblocks;
+ size_t i;
+
+ uc_all_blocks (&blocks, &nblocks);
+
+ for (i = 0; i < nblocks; i++)
+ {
+ if (strcmp (blocks[i].name, "Hebrew") == 0)
+ {
+ ASSERT (uc_block (0x05DE) == &blocks[i]);
+ ASSERT (uc_is_block (0x05DE, &blocks[i]));
+ }
+ }
+
+ for (i = 0; i < nblocks; i++)
+ {
+ unsigned int c;
+
+ for (c = blocks[i].start; c <= blocks[i].end; c++)
+ ASSERT (uc_block (c) == &blocks[i]);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-block_test.c b/gnulib/tests/unictype/test-block_test.c
new file mode 100644
index 00000000..8971a399
--- /dev/null
+++ b/gnulib/tests/unictype/test-block_test.c
@@ -0,0 +1,42 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ uc_block_t b;
+
+ b.start = 0x20000;
+ b.end = 0x2A6D6;
+ b.name = "CJK Supplemental Area";
+
+ ASSERT (!uc_is_block (0x5678, &b));
+ ASSERT (!uc_is_block (0x1FFFF, &b));
+ ASSERT (uc_is_block (0x20000, &b));
+ ASSERT (uc_is_block (0x25678, &b));
+ ASSERT (uc_is_block (0x2A6D6, &b));
+ ASSERT (!uc_is_block (0x2A6D7, &b));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-categ_C.c b/gnulib/tests/unictype/test-categ_C.c
new file mode 100644
index 00000000..e057af87
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_C.c
@@ -0,0 +1,469 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0000, 0x001F },
+ { 0x007F, 0x009F },
+ { 0x00AD, 0x00AD },
+ { 0x0378, 0x0379 },
+ { 0x037F, 0x0383 },
+ { 0x038B, 0x038B },
+ { 0x038D, 0x038D },
+ { 0x03A2, 0x03A2 },
+ { 0x0524, 0x0530 },
+ { 0x0557, 0x0558 },
+ { 0x0560, 0x0560 },
+ { 0x0588, 0x0588 },
+ { 0x058B, 0x0590 },
+ { 0x05C8, 0x05CF },
+ { 0x05EB, 0x05EF },
+ { 0x05F5, 0x0605 },
+ { 0x061C, 0x061D },
+ { 0x0620, 0x0620 },
+ { 0x065F, 0x065F },
+ { 0x06DD, 0x06DD },
+ { 0x070E, 0x070F },
+ { 0x074B, 0x074C },
+ { 0x07B2, 0x07BF },
+ { 0x07FB, 0x0900 },
+ { 0x093A, 0x093B },
+ { 0x094E, 0x094F },
+ { 0x0955, 0x0957 },
+ { 0x0973, 0x097A },
+ { 0x0980, 0x0980 },
+ { 0x0984, 0x0984 },
+ { 0x098D, 0x098E },
+ { 0x0991, 0x0992 },
+ { 0x09A9, 0x09A9 },
+ { 0x09B1, 0x09B1 },
+ { 0x09B3, 0x09B5 },
+ { 0x09BA, 0x09BB },
+ { 0x09C5, 0x09C6 },
+ { 0x09C9, 0x09CA },
+ { 0x09CF, 0x09D6 },
+ { 0x09D8, 0x09DB },
+ { 0x09DE, 0x09DE },
+ { 0x09E4, 0x09E5 },
+ { 0x09FB, 0x0A00 },
+ { 0x0A04, 0x0A04 },
+ { 0x0A0B, 0x0A0E },
+ { 0x0A11, 0x0A12 },
+ { 0x0A29, 0x0A29 },
+ { 0x0A31, 0x0A31 },
+ { 0x0A34, 0x0A34 },
+ { 0x0A37, 0x0A37 },
+ { 0x0A3A, 0x0A3B },
+ { 0x0A3D, 0x0A3D },
+ { 0x0A43, 0x0A46 },
+ { 0x0A49, 0x0A4A },
+ { 0x0A4E, 0x0A50 },
+ { 0x0A52, 0x0A58 },
+ { 0x0A5D, 0x0A5D },
+ { 0x0A5F, 0x0A65 },
+ { 0x0A76, 0x0A80 },
+ { 0x0A84, 0x0A84 },
+ { 0x0A8E, 0x0A8E },
+ { 0x0A92, 0x0A92 },
+ { 0x0AA9, 0x0AA9 },
+ { 0x0AB1, 0x0AB1 },
+ { 0x0AB4, 0x0AB4 },
+ { 0x0ABA, 0x0ABB },
+ { 0x0AC6, 0x0AC6 },
+ { 0x0ACA, 0x0ACA },
+ { 0x0ACE, 0x0ACF },
+ { 0x0AD1, 0x0ADF },
+ { 0x0AE4, 0x0AE5 },
+ { 0x0AF0, 0x0AF0 },
+ { 0x0AF2, 0x0B00 },
+ { 0x0B04, 0x0B04 },
+ { 0x0B0D, 0x0B0E },
+ { 0x0B11, 0x0B12 },
+ { 0x0B29, 0x0B29 },
+ { 0x0B31, 0x0B31 },
+ { 0x0B34, 0x0B34 },
+ { 0x0B3A, 0x0B3B },
+ { 0x0B45, 0x0B46 },
+ { 0x0B49, 0x0B4A },
+ { 0x0B4E, 0x0B55 },
+ { 0x0B58, 0x0B5B },
+ { 0x0B5E, 0x0B5E },
+ { 0x0B64, 0x0B65 },
+ { 0x0B72, 0x0B81 },
+ { 0x0B84, 0x0B84 },
+ { 0x0B8B, 0x0B8D },
+ { 0x0B91, 0x0B91 },
+ { 0x0B96, 0x0B98 },
+ { 0x0B9B, 0x0B9B },
+ { 0x0B9D, 0x0B9D },
+ { 0x0BA0, 0x0BA2 },
+ { 0x0BA5, 0x0BA7 },
+ { 0x0BAB, 0x0BAD },
+ { 0x0BBA, 0x0BBD },
+ { 0x0BC3, 0x0BC5 },
+ { 0x0BC9, 0x0BC9 },
+ { 0x0BCE, 0x0BCF },
+ { 0x0BD1, 0x0BD6 },
+ { 0x0BD8, 0x0BE5 },
+ { 0x0BFB, 0x0C00 },
+ { 0x0C04, 0x0C04 },
+ { 0x0C0D, 0x0C0D },
+ { 0x0C11, 0x0C11 },
+ { 0x0C29, 0x0C29 },
+ { 0x0C34, 0x0C34 },
+ { 0x0C3A, 0x0C3C },
+ { 0x0C45, 0x0C45 },
+ { 0x0C49, 0x0C49 },
+ { 0x0C4E, 0x0C54 },
+ { 0x0C57, 0x0C57 },
+ { 0x0C5A, 0x0C5F },
+ { 0x0C64, 0x0C65 },
+ { 0x0C70, 0x0C77 },
+ { 0x0C80, 0x0C81 },
+ { 0x0C84, 0x0C84 },
+ { 0x0C8D, 0x0C8D },
+ { 0x0C91, 0x0C91 },
+ { 0x0CA9, 0x0CA9 },
+ { 0x0CB4, 0x0CB4 },
+ { 0x0CBA, 0x0CBB },
+ { 0x0CC5, 0x0CC5 },
+ { 0x0CC9, 0x0CC9 },
+ { 0x0CCE, 0x0CD4 },
+ { 0x0CD7, 0x0CDD },
+ { 0x0CDF, 0x0CDF },
+ { 0x0CE4, 0x0CE5 },
+ { 0x0CF0, 0x0CF0 },
+ { 0x0CF3, 0x0D01 },
+ { 0x0D04, 0x0D04 },
+ { 0x0D0D, 0x0D0D },
+ { 0x0D11, 0x0D11 },
+ { 0x0D29, 0x0D29 },
+ { 0x0D3A, 0x0D3C },
+ { 0x0D45, 0x0D45 },
+ { 0x0D49, 0x0D49 },
+ { 0x0D4E, 0x0D56 },
+ { 0x0D58, 0x0D5F },
+ { 0x0D64, 0x0D65 },
+ { 0x0D76, 0x0D78 },
+ { 0x0D80, 0x0D81 },
+ { 0x0D84, 0x0D84 },
+ { 0x0D97, 0x0D99 },
+ { 0x0DB2, 0x0DB2 },
+ { 0x0DBC, 0x0DBC },
+ { 0x0DBE, 0x0DBF },
+ { 0x0DC7, 0x0DC9 },
+ { 0x0DCB, 0x0DCE },
+ { 0x0DD5, 0x0DD5 },
+ { 0x0DD7, 0x0DD7 },
+ { 0x0DE0, 0x0DF1 },
+ { 0x0DF5, 0x0E00 },
+ { 0x0E3B, 0x0E3E },
+ { 0x0E5C, 0x0E80 },
+ { 0x0E83, 0x0E83 },
+ { 0x0E85, 0x0E86 },
+ { 0x0E89, 0x0E89 },
+ { 0x0E8B, 0x0E8C },
+ { 0x0E8E, 0x0E93 },
+ { 0x0E98, 0x0E98 },
+ { 0x0EA0, 0x0EA0 },
+ { 0x0EA4, 0x0EA4 },
+ { 0x0EA6, 0x0EA6 },
+ { 0x0EA8, 0x0EA9 },
+ { 0x0EAC, 0x0EAC },
+ { 0x0EBA, 0x0EBA },
+ { 0x0EBE, 0x0EBF },
+ { 0x0EC5, 0x0EC5 },
+ { 0x0EC7, 0x0EC7 },
+ { 0x0ECE, 0x0ECF },
+ { 0x0EDA, 0x0EDB },
+ { 0x0EDE, 0x0EFF },
+ { 0x0F48, 0x0F48 },
+ { 0x0F6D, 0x0F70 },
+ { 0x0F8C, 0x0F8F },
+ { 0x0F98, 0x0F98 },
+ { 0x0FBD, 0x0FBD },
+ { 0x0FCD, 0x0FCD },
+ { 0x0FD5, 0x0FFF },
+ { 0x109A, 0x109D },
+ { 0x10C6, 0x10CF },
+ { 0x10FD, 0x10FF },
+ { 0x115A, 0x115E },
+ { 0x11A3, 0x11A7 },
+ { 0x11FA, 0x11FF },
+ { 0x1249, 0x1249 },
+ { 0x124E, 0x124F },
+ { 0x1257, 0x1257 },
+ { 0x1259, 0x1259 },
+ { 0x125E, 0x125F },
+ { 0x1289, 0x1289 },
+ { 0x128E, 0x128F },
+ { 0x12B1, 0x12B1 },
+ { 0x12B6, 0x12B7 },
+ { 0x12BF, 0x12BF },
+ { 0x12C1, 0x12C1 },
+ { 0x12C6, 0x12C7 },
+ { 0x12D7, 0x12D7 },
+ { 0x1311, 0x1311 },
+ { 0x1316, 0x1317 },
+ { 0x135B, 0x135E },
+ { 0x137D, 0x137F },
+ { 0x139A, 0x139F },
+ { 0x13F5, 0x1400 },
+ { 0x1677, 0x167F },
+ { 0x169D, 0x169F },
+ { 0x16F1, 0x16FF },
+ { 0x170D, 0x170D },
+ { 0x1715, 0x171F },
+ { 0x1737, 0x173F },
+ { 0x1754, 0x175F },
+ { 0x176D, 0x176D },
+ { 0x1771, 0x1771 },
+ { 0x1774, 0x177F },
+ { 0x17B4, 0x17B5 },
+ { 0x17DE, 0x17DF },
+ { 0x17EA, 0x17EF },
+ { 0x17FA, 0x17FF },
+ { 0x180F, 0x180F },
+ { 0x181A, 0x181F },
+ { 0x1878, 0x187F },
+ { 0x18AB, 0x18FF },
+ { 0x191D, 0x191F },
+ { 0x192C, 0x192F },
+ { 0x193C, 0x193F },
+ { 0x1941, 0x1943 },
+ { 0x196E, 0x196F },
+ { 0x1975, 0x197F },
+ { 0x19AA, 0x19AF },
+ { 0x19CA, 0x19CF },
+ { 0x19DA, 0x19DD },
+ { 0x1A1C, 0x1A1D },
+ { 0x1A20, 0x1AFF },
+ { 0x1B4C, 0x1B4F },
+ { 0x1B7D, 0x1B7F },
+ { 0x1BAB, 0x1BAD },
+ { 0x1BBA, 0x1BFF },
+ { 0x1C38, 0x1C3A },
+ { 0x1C4A, 0x1C4C },
+ { 0x1C80, 0x1CFF },
+ { 0x1DE7, 0x1DFD },
+ { 0x1F16, 0x1F17 },
+ { 0x1F1E, 0x1F1F },
+ { 0x1F46, 0x1F47 },
+ { 0x1F4E, 0x1F4F },
+ { 0x1F58, 0x1F58 },
+ { 0x1F5A, 0x1F5A },
+ { 0x1F5C, 0x1F5C },
+ { 0x1F5E, 0x1F5E },
+ { 0x1F7E, 0x1F7F },
+ { 0x1FB5, 0x1FB5 },
+ { 0x1FC5, 0x1FC5 },
+ { 0x1FD4, 0x1FD5 },
+ { 0x1FDC, 0x1FDC },
+ { 0x1FF0, 0x1FF1 },
+ { 0x1FF5, 0x1FF5 },
+ { 0x1FFF, 0x1FFF },
+ { 0x200B, 0x200F },
+ { 0x202A, 0x202E },
+ { 0x2060, 0x206F },
+ { 0x2072, 0x2073 },
+ { 0x208F, 0x208F },
+ { 0x2095, 0x209F },
+ { 0x20B6, 0x20CF },
+ { 0x20F1, 0x20FF },
+ { 0x2150, 0x2152 },
+ { 0x2189, 0x218F },
+ { 0x23E8, 0x23FF },
+ { 0x2427, 0x243F },
+ { 0x244B, 0x245F },
+ { 0x269E, 0x269F },
+ { 0x26BD, 0x26BF },
+ { 0x26C4, 0x2700 },
+ { 0x2705, 0x2705 },
+ { 0x270A, 0x270B },
+ { 0x2728, 0x2728 },
+ { 0x274C, 0x274C },
+ { 0x274E, 0x274E },
+ { 0x2753, 0x2755 },
+ { 0x2757, 0x2757 },
+ { 0x275F, 0x2760 },
+ { 0x2795, 0x2797 },
+ { 0x27B0, 0x27B0 },
+ { 0x27BF, 0x27BF },
+ { 0x27CB, 0x27CB },
+ { 0x27CD, 0x27CF },
+ { 0x2B4D, 0x2B4F },
+ { 0x2B55, 0x2BFF },
+ { 0x2C2F, 0x2C2F },
+ { 0x2C5F, 0x2C5F },
+ { 0x2C70, 0x2C70 },
+ { 0x2C7E, 0x2C7F },
+ { 0x2CEB, 0x2CF8 },
+ { 0x2D26, 0x2D2F },
+ { 0x2D66, 0x2D6E },
+ { 0x2D70, 0x2D7F },
+ { 0x2D97, 0x2D9F },
+ { 0x2DA7, 0x2DA7 },
+ { 0x2DAF, 0x2DAF },
+ { 0x2DB7, 0x2DB7 },
+ { 0x2DBF, 0x2DBF },
+ { 0x2DC7, 0x2DC7 },
+ { 0x2DCF, 0x2DCF },
+ { 0x2DD7, 0x2DD7 },
+ { 0x2DDF, 0x2DDF },
+ { 0x2E31, 0x2E7F },
+ { 0x2E9A, 0x2E9A },
+ { 0x2EF4, 0x2EFF },
+ { 0x2FD6, 0x2FEF },
+ { 0x2FFC, 0x2FFF },
+ { 0x3040, 0x3040 },
+ { 0x3097, 0x3098 },
+ { 0x3100, 0x3104 },
+ { 0x312E, 0x3130 },
+ { 0x318F, 0x318F },
+ { 0x31B8, 0x31BF },
+ { 0x31E4, 0x31EF },
+ { 0x321F, 0x321F },
+ { 0x3244, 0x324F },
+ { 0x32FF, 0x32FF },
+ { 0x4DB6, 0x4DBF },
+ { 0x9FC4, 0x9FFF },
+ { 0xA48D, 0xA48F },
+ { 0xA4C7, 0xA4FF },
+ { 0xA62C, 0xA63F },
+ { 0xA660, 0xA661 },
+ { 0xA674, 0xA67B },
+ { 0xA698, 0xA6FF },
+ { 0xA78D, 0xA7FA },
+ { 0xA82C, 0xA83F },
+ { 0xA878, 0xA87F },
+ { 0xA8C5, 0xA8CD },
+ { 0xA8DA, 0xA8FF },
+ { 0xA954, 0xA95E },
+ { 0xA960, 0xA9FF },
+ { 0xAA37, 0xAA3F },
+ { 0xAA4E, 0xAA4F },
+ { 0xAA5A, 0xAA5B },
+ { 0xAA60, 0xABFF },
+ { 0xD7A4, 0xF8FF },
+ { 0xFA2E, 0xFA2F },
+ { 0xFA6B, 0xFA6F },
+ { 0xFADA, 0xFAFF },
+ { 0xFB07, 0xFB12 },
+ { 0xFB18, 0xFB1C },
+ { 0xFB37, 0xFB37 },
+ { 0xFB3D, 0xFB3D },
+ { 0xFB3F, 0xFB3F },
+ { 0xFB42, 0xFB42 },
+ { 0xFB45, 0xFB45 },
+ { 0xFBB2, 0xFBD2 },
+ { 0xFD40, 0xFD4F },
+ { 0xFD90, 0xFD91 },
+ { 0xFDC8, 0xFDEF },
+ { 0xFDFE, 0xFDFF },
+ { 0xFE1A, 0xFE1F },
+ { 0xFE27, 0xFE2F },
+ { 0xFE53, 0xFE53 },
+ { 0xFE67, 0xFE67 },
+ { 0xFE6C, 0xFE6F },
+ { 0xFE75, 0xFE75 },
+ { 0xFEFD, 0xFF00 },
+ { 0xFFBF, 0xFFC1 },
+ { 0xFFC8, 0xFFC9 },
+ { 0xFFD0, 0xFFD1 },
+ { 0xFFD8, 0xFFD9 },
+ { 0xFFDD, 0xFFDF },
+ { 0xFFE7, 0xFFE7 },
+ { 0xFFEF, 0xFFFB },
+ { 0xFFFE, 0xFFFF },
+ { 0x1000C, 0x1000C },
+ { 0x10027, 0x10027 },
+ { 0x1003B, 0x1003B },
+ { 0x1003E, 0x1003E },
+ { 0x1004E, 0x1004F },
+ { 0x1005E, 0x1007F },
+ { 0x100FB, 0x100FF },
+ { 0x10103, 0x10106 },
+ { 0x10134, 0x10136 },
+ { 0x1018B, 0x1018F },
+ { 0x1019C, 0x101CF },
+ { 0x101FE, 0x1027F },
+ { 0x1029D, 0x1029F },
+ { 0x102D1, 0x102FF },
+ { 0x1031F, 0x1031F },
+ { 0x10324, 0x1032F },
+ { 0x1034B, 0x1037F },
+ { 0x1039E, 0x1039E },
+ { 0x103C4, 0x103C7 },
+ { 0x103D6, 0x103FF },
+ { 0x1049E, 0x1049F },
+ { 0x104AA, 0x107FF },
+ { 0x10806, 0x10807 },
+ { 0x10809, 0x10809 },
+ { 0x10836, 0x10836 },
+ { 0x10839, 0x1083B },
+ { 0x1083D, 0x1083E },
+ { 0x10840, 0x108FF },
+ { 0x1091A, 0x1091E },
+ { 0x1093A, 0x1093E },
+ { 0x10940, 0x109FF },
+ { 0x10A04, 0x10A04 },
+ { 0x10A07, 0x10A0B },
+ { 0x10A14, 0x10A14 },
+ { 0x10A18, 0x10A18 },
+ { 0x10A34, 0x10A37 },
+ { 0x10A3B, 0x10A3E },
+ { 0x10A48, 0x10A4F },
+ { 0x10A59, 0x11FFF },
+ { 0x1236F, 0x123FF },
+ { 0x12463, 0x1246F },
+ { 0x12474, 0x1CFFF },
+ { 0x1D0F6, 0x1D0FF },
+ { 0x1D127, 0x1D128 },
+ { 0x1D173, 0x1D17A },
+ { 0x1D1DE, 0x1D1FF },
+ { 0x1D246, 0x1D2FF },
+ { 0x1D357, 0x1D35F },
+ { 0x1D372, 0x1D3FF },
+ { 0x1D455, 0x1D455 },
+ { 0x1D49D, 0x1D49D },
+ { 0x1D4A0, 0x1D4A1 },
+ { 0x1D4A3, 0x1D4A4 },
+ { 0x1D4A7, 0x1D4A8 },
+ { 0x1D4AD, 0x1D4AD },
+ { 0x1D4BA, 0x1D4BA },
+ { 0x1D4BC, 0x1D4BC },
+ { 0x1D4C4, 0x1D4C4 },
+ { 0x1D506, 0x1D506 },
+ { 0x1D50B, 0x1D50C },
+ { 0x1D515, 0x1D515 },
+ { 0x1D51D, 0x1D51D },
+ { 0x1D53A, 0x1D53A },
+ { 0x1D53F, 0x1D53F },
+ { 0x1D545, 0x1D545 },
+ { 0x1D547, 0x1D549 },
+ { 0x1D551, 0x1D551 },
+ { 0x1D6A6, 0x1D6A7 },
+ { 0x1D7CC, 0x1D7CD },
+ { 0x1D800, 0x1EFFF },
+ { 0x1F02C, 0x1F02F },
+ { 0x1F094, 0x1FFFF },
+ { 0x2A6D7, 0x2F7FF },
+ { 0x2FA1E, 0xE00FF },
+ { 0xE01F0, 0x10FFFF }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_C)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Cc.c b/gnulib/tests/unictype/test-categ_Cc.c
new file mode 100644
index 00000000..9740dd47
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Cc.c
@@ -0,0 +1,24 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0000, 0x001F },
+ { 0x007F, 0x009F }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Cc)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Cf.c b/gnulib/tests/unictype/test-categ_Cf.c
new file mode 100644
index 00000000..bcaf2f2b
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Cf.c
@@ -0,0 +1,36 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00AD, 0x00AD },
+ { 0x0600, 0x0603 },
+ { 0x06DD, 0x06DD },
+ { 0x070F, 0x070F },
+ { 0x17B4, 0x17B5 },
+ { 0x200B, 0x200F },
+ { 0x202A, 0x202E },
+ { 0x2060, 0x2064 },
+ { 0x206A, 0x206F },
+ { 0xFEFF, 0xFEFF },
+ { 0xFFF9, 0xFFFB },
+ { 0x1D173, 0x1D17A },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Cf)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Cn.c b/gnulib/tests/unictype/test-categ_Cn.c
new file mode 100644
index 00000000..5430ea28
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Cn.c
@@ -0,0 +1,467 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0378, 0x0379 },
+ { 0x037F, 0x0383 },
+ { 0x038B, 0x038B },
+ { 0x038D, 0x038D },
+ { 0x03A2, 0x03A2 },
+ { 0x0524, 0x0530 },
+ { 0x0557, 0x0558 },
+ { 0x0560, 0x0560 },
+ { 0x0588, 0x0588 },
+ { 0x058B, 0x0590 },
+ { 0x05C8, 0x05CF },
+ { 0x05EB, 0x05EF },
+ { 0x05F5, 0x05FF },
+ { 0x0604, 0x0605 },
+ { 0x061C, 0x061D },
+ { 0x0620, 0x0620 },
+ { 0x065F, 0x065F },
+ { 0x070E, 0x070E },
+ { 0x074B, 0x074C },
+ { 0x07B2, 0x07BF },
+ { 0x07FB, 0x0900 },
+ { 0x093A, 0x093B },
+ { 0x094E, 0x094F },
+ { 0x0955, 0x0957 },
+ { 0x0973, 0x097A },
+ { 0x0980, 0x0980 },
+ { 0x0984, 0x0984 },
+ { 0x098D, 0x098E },
+ { 0x0991, 0x0992 },
+ { 0x09A9, 0x09A9 },
+ { 0x09B1, 0x09B1 },
+ { 0x09B3, 0x09B5 },
+ { 0x09BA, 0x09BB },
+ { 0x09C5, 0x09C6 },
+ { 0x09C9, 0x09CA },
+ { 0x09CF, 0x09D6 },
+ { 0x09D8, 0x09DB },
+ { 0x09DE, 0x09DE },
+ { 0x09E4, 0x09E5 },
+ { 0x09FB, 0x0A00 },
+ { 0x0A04, 0x0A04 },
+ { 0x0A0B, 0x0A0E },
+ { 0x0A11, 0x0A12 },
+ { 0x0A29, 0x0A29 },
+ { 0x0A31, 0x0A31 },
+ { 0x0A34, 0x0A34 },
+ { 0x0A37, 0x0A37 },
+ { 0x0A3A, 0x0A3B },
+ { 0x0A3D, 0x0A3D },
+ { 0x0A43, 0x0A46 },
+ { 0x0A49, 0x0A4A },
+ { 0x0A4E, 0x0A50 },
+ { 0x0A52, 0x0A58 },
+ { 0x0A5D, 0x0A5D },
+ { 0x0A5F, 0x0A65 },
+ { 0x0A76, 0x0A80 },
+ { 0x0A84, 0x0A84 },
+ { 0x0A8E, 0x0A8E },
+ { 0x0A92, 0x0A92 },
+ { 0x0AA9, 0x0AA9 },
+ { 0x0AB1, 0x0AB1 },
+ { 0x0AB4, 0x0AB4 },
+ { 0x0ABA, 0x0ABB },
+ { 0x0AC6, 0x0AC6 },
+ { 0x0ACA, 0x0ACA },
+ { 0x0ACE, 0x0ACF },
+ { 0x0AD1, 0x0ADF },
+ { 0x0AE4, 0x0AE5 },
+ { 0x0AF0, 0x0AF0 },
+ { 0x0AF2, 0x0B00 },
+ { 0x0B04, 0x0B04 },
+ { 0x0B0D, 0x0B0E },
+ { 0x0B11, 0x0B12 },
+ { 0x0B29, 0x0B29 },
+ { 0x0B31, 0x0B31 },
+ { 0x0B34, 0x0B34 },
+ { 0x0B3A, 0x0B3B },
+ { 0x0B45, 0x0B46 },
+ { 0x0B49, 0x0B4A },
+ { 0x0B4E, 0x0B55 },
+ { 0x0B58, 0x0B5B },
+ { 0x0B5E, 0x0B5E },
+ { 0x0B64, 0x0B65 },
+ { 0x0B72, 0x0B81 },
+ { 0x0B84, 0x0B84 },
+ { 0x0B8B, 0x0B8D },
+ { 0x0B91, 0x0B91 },
+ { 0x0B96, 0x0B98 },
+ { 0x0B9B, 0x0B9B },
+ { 0x0B9D, 0x0B9D },
+ { 0x0BA0, 0x0BA2 },
+ { 0x0BA5, 0x0BA7 },
+ { 0x0BAB, 0x0BAD },
+ { 0x0BBA, 0x0BBD },
+ { 0x0BC3, 0x0BC5 },
+ { 0x0BC9, 0x0BC9 },
+ { 0x0BCE, 0x0BCF },
+ { 0x0BD1, 0x0BD6 },
+ { 0x0BD8, 0x0BE5 },
+ { 0x0BFB, 0x0C00 },
+ { 0x0C04, 0x0C04 },
+ { 0x0C0D, 0x0C0D },
+ { 0x0C11, 0x0C11 },
+ { 0x0C29, 0x0C29 },
+ { 0x0C34, 0x0C34 },
+ { 0x0C3A, 0x0C3C },
+ { 0x0C45, 0x0C45 },
+ { 0x0C49, 0x0C49 },
+ { 0x0C4E, 0x0C54 },
+ { 0x0C57, 0x0C57 },
+ { 0x0C5A, 0x0C5F },
+ { 0x0C64, 0x0C65 },
+ { 0x0C70, 0x0C77 },
+ { 0x0C80, 0x0C81 },
+ { 0x0C84, 0x0C84 },
+ { 0x0C8D, 0x0C8D },
+ { 0x0C91, 0x0C91 },
+ { 0x0CA9, 0x0CA9 },
+ { 0x0CB4, 0x0CB4 },
+ { 0x0CBA, 0x0CBB },
+ { 0x0CC5, 0x0CC5 },
+ { 0x0CC9, 0x0CC9 },
+ { 0x0CCE, 0x0CD4 },
+ { 0x0CD7, 0x0CDD },
+ { 0x0CDF, 0x0CDF },
+ { 0x0CE4, 0x0CE5 },
+ { 0x0CF0, 0x0CF0 },
+ { 0x0CF3, 0x0D01 },
+ { 0x0D04, 0x0D04 },
+ { 0x0D0D, 0x0D0D },
+ { 0x0D11, 0x0D11 },
+ { 0x0D29, 0x0D29 },
+ { 0x0D3A, 0x0D3C },
+ { 0x0D45, 0x0D45 },
+ { 0x0D49, 0x0D49 },
+ { 0x0D4E, 0x0D56 },
+ { 0x0D58, 0x0D5F },
+ { 0x0D64, 0x0D65 },
+ { 0x0D76, 0x0D78 },
+ { 0x0D80, 0x0D81 },
+ { 0x0D84, 0x0D84 },
+ { 0x0D97, 0x0D99 },
+ { 0x0DB2, 0x0DB2 },
+ { 0x0DBC, 0x0DBC },
+ { 0x0DBE, 0x0DBF },
+ { 0x0DC7, 0x0DC9 },
+ { 0x0DCB, 0x0DCE },
+ { 0x0DD5, 0x0DD5 },
+ { 0x0DD7, 0x0DD7 },
+ { 0x0DE0, 0x0DF1 },
+ { 0x0DF5, 0x0E00 },
+ { 0x0E3B, 0x0E3E },
+ { 0x0E5C, 0x0E80 },
+ { 0x0E83, 0x0E83 },
+ { 0x0E85, 0x0E86 },
+ { 0x0E89, 0x0E89 },
+ { 0x0E8B, 0x0E8C },
+ { 0x0E8E, 0x0E93 },
+ { 0x0E98, 0x0E98 },
+ { 0x0EA0, 0x0EA0 },
+ { 0x0EA4, 0x0EA4 },
+ { 0x0EA6, 0x0EA6 },
+ { 0x0EA8, 0x0EA9 },
+ { 0x0EAC, 0x0EAC },
+ { 0x0EBA, 0x0EBA },
+ { 0x0EBE, 0x0EBF },
+ { 0x0EC5, 0x0EC5 },
+ { 0x0EC7, 0x0EC7 },
+ { 0x0ECE, 0x0ECF },
+ { 0x0EDA, 0x0EDB },
+ { 0x0EDE, 0x0EFF },
+ { 0x0F48, 0x0F48 },
+ { 0x0F6D, 0x0F70 },
+ { 0x0F8C, 0x0F8F },
+ { 0x0F98, 0x0F98 },
+ { 0x0FBD, 0x0FBD },
+ { 0x0FCD, 0x0FCD },
+ { 0x0FD5, 0x0FFF },
+ { 0x109A, 0x109D },
+ { 0x10C6, 0x10CF },
+ { 0x10FD, 0x10FF },
+ { 0x115A, 0x115E },
+ { 0x11A3, 0x11A7 },
+ { 0x11FA, 0x11FF },
+ { 0x1249, 0x1249 },
+ { 0x124E, 0x124F },
+ { 0x1257, 0x1257 },
+ { 0x1259, 0x1259 },
+ { 0x125E, 0x125F },
+ { 0x1289, 0x1289 },
+ { 0x128E, 0x128F },
+ { 0x12B1, 0x12B1 },
+ { 0x12B6, 0x12B7 },
+ { 0x12BF, 0x12BF },
+ { 0x12C1, 0x12C1 },
+ { 0x12C6, 0x12C7 },
+ { 0x12D7, 0x12D7 },
+ { 0x1311, 0x1311 },
+ { 0x1316, 0x1317 },
+ { 0x135B, 0x135E },
+ { 0x137D, 0x137F },
+ { 0x139A, 0x139F },
+ { 0x13F5, 0x1400 },
+ { 0x1677, 0x167F },
+ { 0x169D, 0x169F },
+ { 0x16F1, 0x16FF },
+ { 0x170D, 0x170D },
+ { 0x1715, 0x171F },
+ { 0x1737, 0x173F },
+ { 0x1754, 0x175F },
+ { 0x176D, 0x176D },
+ { 0x1771, 0x1771 },
+ { 0x1774, 0x177F },
+ { 0x17DE, 0x17DF },
+ { 0x17EA, 0x17EF },
+ { 0x17FA, 0x17FF },
+ { 0x180F, 0x180F },
+ { 0x181A, 0x181F },
+ { 0x1878, 0x187F },
+ { 0x18AB, 0x18FF },
+ { 0x191D, 0x191F },
+ { 0x192C, 0x192F },
+ { 0x193C, 0x193F },
+ { 0x1941, 0x1943 },
+ { 0x196E, 0x196F },
+ { 0x1975, 0x197F },
+ { 0x19AA, 0x19AF },
+ { 0x19CA, 0x19CF },
+ { 0x19DA, 0x19DD },
+ { 0x1A1C, 0x1A1D },
+ { 0x1A20, 0x1AFF },
+ { 0x1B4C, 0x1B4F },
+ { 0x1B7D, 0x1B7F },
+ { 0x1BAB, 0x1BAD },
+ { 0x1BBA, 0x1BFF },
+ { 0x1C38, 0x1C3A },
+ { 0x1C4A, 0x1C4C },
+ { 0x1C80, 0x1CFF },
+ { 0x1DE7, 0x1DFD },
+ { 0x1F16, 0x1F17 },
+ { 0x1F1E, 0x1F1F },
+ { 0x1F46, 0x1F47 },
+ { 0x1F4E, 0x1F4F },
+ { 0x1F58, 0x1F58 },
+ { 0x1F5A, 0x1F5A },
+ { 0x1F5C, 0x1F5C },
+ { 0x1F5E, 0x1F5E },
+ { 0x1F7E, 0x1F7F },
+ { 0x1FB5, 0x1FB5 },
+ { 0x1FC5, 0x1FC5 },
+ { 0x1FD4, 0x1FD5 },
+ { 0x1FDC, 0x1FDC },
+ { 0x1FF0, 0x1FF1 },
+ { 0x1FF5, 0x1FF5 },
+ { 0x1FFF, 0x1FFF },
+ { 0x2065, 0x2069 },
+ { 0x2072, 0x2073 },
+ { 0x208F, 0x208F },
+ { 0x2095, 0x209F },
+ { 0x20B6, 0x20CF },
+ { 0x20F1, 0x20FF },
+ { 0x2150, 0x2152 },
+ { 0x2189, 0x218F },
+ { 0x23E8, 0x23FF },
+ { 0x2427, 0x243F },
+ { 0x244B, 0x245F },
+ { 0x269E, 0x269F },
+ { 0x26BD, 0x26BF },
+ { 0x26C4, 0x2700 },
+ { 0x2705, 0x2705 },
+ { 0x270A, 0x270B },
+ { 0x2728, 0x2728 },
+ { 0x274C, 0x274C },
+ { 0x274E, 0x274E },
+ { 0x2753, 0x2755 },
+ { 0x2757, 0x2757 },
+ { 0x275F, 0x2760 },
+ { 0x2795, 0x2797 },
+ { 0x27B0, 0x27B0 },
+ { 0x27BF, 0x27BF },
+ { 0x27CB, 0x27CB },
+ { 0x27CD, 0x27CF },
+ { 0x2B4D, 0x2B4F },
+ { 0x2B55, 0x2BFF },
+ { 0x2C2F, 0x2C2F },
+ { 0x2C5F, 0x2C5F },
+ { 0x2C70, 0x2C70 },
+ { 0x2C7E, 0x2C7F },
+ { 0x2CEB, 0x2CF8 },
+ { 0x2D26, 0x2D2F },
+ { 0x2D66, 0x2D6E },
+ { 0x2D70, 0x2D7F },
+ { 0x2D97, 0x2D9F },
+ { 0x2DA7, 0x2DA7 },
+ { 0x2DAF, 0x2DAF },
+ { 0x2DB7, 0x2DB7 },
+ { 0x2DBF, 0x2DBF },
+ { 0x2DC7, 0x2DC7 },
+ { 0x2DCF, 0x2DCF },
+ { 0x2DD7, 0x2DD7 },
+ { 0x2DDF, 0x2DDF },
+ { 0x2E31, 0x2E7F },
+ { 0x2E9A, 0x2E9A },
+ { 0x2EF4, 0x2EFF },
+ { 0x2FD6, 0x2FEF },
+ { 0x2FFC, 0x2FFF },
+ { 0x3040, 0x3040 },
+ { 0x3097, 0x3098 },
+ { 0x3100, 0x3104 },
+ { 0x312E, 0x3130 },
+ { 0x318F, 0x318F },
+ { 0x31B8, 0x31BF },
+ { 0x31E4, 0x31EF },
+ { 0x321F, 0x321F },
+ { 0x3244, 0x324F },
+ { 0x32FF, 0x32FF },
+ { 0x4DB6, 0x4DBF },
+ { 0x9FC4, 0x9FFF },
+ { 0xA48D, 0xA48F },
+ { 0xA4C7, 0xA4FF },
+ { 0xA62C, 0xA63F },
+ { 0xA660, 0xA661 },
+ { 0xA674, 0xA67B },
+ { 0xA698, 0xA6FF },
+ { 0xA78D, 0xA7FA },
+ { 0xA82C, 0xA83F },
+ { 0xA878, 0xA87F },
+ { 0xA8C5, 0xA8CD },
+ { 0xA8DA, 0xA8FF },
+ { 0xA954, 0xA95E },
+ { 0xA960, 0xA9FF },
+ { 0xAA37, 0xAA3F },
+ { 0xAA4E, 0xAA4F },
+ { 0xAA5A, 0xAA5B },
+ { 0xAA60, 0xABFF },
+ { 0xD7A4, 0xD7FF },
+ { 0xFA2E, 0xFA2F },
+ { 0xFA6B, 0xFA6F },
+ { 0xFADA, 0xFAFF },
+ { 0xFB07, 0xFB12 },
+ { 0xFB18, 0xFB1C },
+ { 0xFB37, 0xFB37 },
+ { 0xFB3D, 0xFB3D },
+ { 0xFB3F, 0xFB3F },
+ { 0xFB42, 0xFB42 },
+ { 0xFB45, 0xFB45 },
+ { 0xFBB2, 0xFBD2 },
+ { 0xFD40, 0xFD4F },
+ { 0xFD90, 0xFD91 },
+ { 0xFDC8, 0xFDEF },
+ { 0xFDFE, 0xFDFF },
+ { 0xFE1A, 0xFE1F },
+ { 0xFE27, 0xFE2F },
+ { 0xFE53, 0xFE53 },
+ { 0xFE67, 0xFE67 },
+ { 0xFE6C, 0xFE6F },
+ { 0xFE75, 0xFE75 },
+ { 0xFEFD, 0xFEFE },
+ { 0xFF00, 0xFF00 },
+ { 0xFFBF, 0xFFC1 },
+ { 0xFFC8, 0xFFC9 },
+ { 0xFFD0, 0xFFD1 },
+ { 0xFFD8, 0xFFD9 },
+ { 0xFFDD, 0xFFDF },
+ { 0xFFE7, 0xFFE7 },
+ { 0xFFEF, 0xFFF8 },
+ { 0xFFFE, 0xFFFF },
+ { 0x1000C, 0x1000C },
+ { 0x10027, 0x10027 },
+ { 0x1003B, 0x1003B },
+ { 0x1003E, 0x1003E },
+ { 0x1004E, 0x1004F },
+ { 0x1005E, 0x1007F },
+ { 0x100FB, 0x100FF },
+ { 0x10103, 0x10106 },
+ { 0x10134, 0x10136 },
+ { 0x1018B, 0x1018F },
+ { 0x1019C, 0x101CF },
+ { 0x101FE, 0x1027F },
+ { 0x1029D, 0x1029F },
+ { 0x102D1, 0x102FF },
+ { 0x1031F, 0x1031F },
+ { 0x10324, 0x1032F },
+ { 0x1034B, 0x1037F },
+ { 0x1039E, 0x1039E },
+ { 0x103C4, 0x103C7 },
+ { 0x103D6, 0x103FF },
+ { 0x1049E, 0x1049F },
+ { 0x104AA, 0x107FF },
+ { 0x10806, 0x10807 },
+ { 0x10809, 0x10809 },
+ { 0x10836, 0x10836 },
+ { 0x10839, 0x1083B },
+ { 0x1083D, 0x1083E },
+ { 0x10840, 0x108FF },
+ { 0x1091A, 0x1091E },
+ { 0x1093A, 0x1093E },
+ { 0x10940, 0x109FF },
+ { 0x10A04, 0x10A04 },
+ { 0x10A07, 0x10A0B },
+ { 0x10A14, 0x10A14 },
+ { 0x10A18, 0x10A18 },
+ { 0x10A34, 0x10A37 },
+ { 0x10A3B, 0x10A3E },
+ { 0x10A48, 0x10A4F },
+ { 0x10A59, 0x11FFF },
+ { 0x1236F, 0x123FF },
+ { 0x12463, 0x1246F },
+ { 0x12474, 0x1CFFF },
+ { 0x1D0F6, 0x1D0FF },
+ { 0x1D127, 0x1D128 },
+ { 0x1D1DE, 0x1D1FF },
+ { 0x1D246, 0x1D2FF },
+ { 0x1D357, 0x1D35F },
+ { 0x1D372, 0x1D3FF },
+ { 0x1D455, 0x1D455 },
+ { 0x1D49D, 0x1D49D },
+ { 0x1D4A0, 0x1D4A1 },
+ { 0x1D4A3, 0x1D4A4 },
+ { 0x1D4A7, 0x1D4A8 },
+ { 0x1D4AD, 0x1D4AD },
+ { 0x1D4BA, 0x1D4BA },
+ { 0x1D4BC, 0x1D4BC },
+ { 0x1D4C4, 0x1D4C4 },
+ { 0x1D506, 0x1D506 },
+ { 0x1D50B, 0x1D50C },
+ { 0x1D515, 0x1D515 },
+ { 0x1D51D, 0x1D51D },
+ { 0x1D53A, 0x1D53A },
+ { 0x1D53F, 0x1D53F },
+ { 0x1D545, 0x1D545 },
+ { 0x1D547, 0x1D549 },
+ { 0x1D551, 0x1D551 },
+ { 0x1D6A6, 0x1D6A7 },
+ { 0x1D7CC, 0x1D7CD },
+ { 0x1D800, 0x1EFFF },
+ { 0x1F02C, 0x1F02F },
+ { 0x1F094, 0x1FFFF },
+ { 0x2A6D7, 0x2F7FF },
+ { 0x2FA1E, 0xE0000 },
+ { 0xE0002, 0xE001F },
+ { 0xE0080, 0xE00FF },
+ { 0xE01F0, 0xEFFFF },
+ { 0xFFFFE, 0xFFFFF },
+ { 0x10FFFE, 0x10FFFF }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Cn)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Co.c b/gnulib/tests/unictype/test-categ_Co.c
new file mode 100644
index 00000000..f524db4c
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Co.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0xE000, 0xF8FF },
+ { 0xF0000, 0xFFFFD },
+ { 0x100000, 0x10FFFD }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Co)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Cs.c b/gnulib/tests/unictype/test-categ_Cs.c
new file mode 100644
index 00000000..cb8cc969
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Cs.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0xD800, 0xDFFF }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Cs)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_L.c b/gnulib/tests/unictype/test-categ_L.c
new file mode 100644
index 00000000..f4019171
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_L.c
@@ -0,0 +1,412 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0370, 0x0374 },
+ { 0x0376, 0x0377 },
+ { 0x037A, 0x037D },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x0559 },
+ { 0x0561, 0x0587 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0621, 0x064A },
+ { 0x066E, 0x066F },
+ { 0x0671, 0x06D3 },
+ { 0x06D5, 0x06D5 },
+ { 0x06E5, 0x06E6 },
+ { 0x06EE, 0x06EF },
+ { 0x06FA, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x0710 },
+ { 0x0712, 0x072F },
+ { 0x074D, 0x07A5 },
+ { 0x07B1, 0x07B1 },
+ { 0x07CA, 0x07EA },
+ { 0x07F4, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0904, 0x0939 },
+ { 0x093D, 0x093D },
+ { 0x0950, 0x0950 },
+ { 0x0958, 0x0961 },
+ { 0x0971, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BD, 0x09BD },
+ { 0x09CE, 0x09CE },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E1 },
+ { 0x09F0, 0x09F1 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A72, 0x0A74 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABD, 0x0ABD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE1 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3D, 0x0B3D },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B61 },
+ { 0x0B71, 0x0B71 },
+ { 0x0B83, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C3D },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C61 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBD, 0x0CBD },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE1 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D3D },
+ { 0x0D60, 0x0D61 },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0E01, 0x0E30 },
+ { 0x0E32, 0x0E33 },
+ { 0x0E40, 0x0E46 },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB0 },
+ { 0x0EB2, 0x0EB3 },
+ { 0x0EBD, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F40, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F88, 0x0F8B },
+ { 0x1000, 0x102A },
+ { 0x103F, 0x103F },
+ { 0x1050, 0x1055 },
+ { 0x105A, 0x105D },
+ { 0x1061, 0x1061 },
+ { 0x1065, 0x1066 },
+ { 0x106E, 0x1070 },
+ { 0x1075, 0x1081 },
+ { 0x108E, 0x108E },
+ { 0x10A0, 0x10C5 },
+ { 0x10D0, 0x10FA },
+ { 0x10FC, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1711 },
+ { 0x1720, 0x1731 },
+ { 0x1740, 0x1751 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1780, 0x17B3 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DC, 0x17DC },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18A8 },
+ { 0x18AA, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1950, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19C1, 0x19C7 },
+ { 0x1A00, 0x1A16 },
+ { 0x1B05, 0x1B33 },
+ { 0x1B45, 0x1B4B },
+ { 0x1B83, 0x1BA0 },
+ { 0x1BAE, 0x1BAF },
+ { 0x1C00, 0x1C23 },
+ { 0x1C4D, 0x1C4F },
+ { 0x1C5A, 0x1C7D },
+ { 0x1D00, 0x1DBF },
+ { 0x1E00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x212D },
+ { 0x212F, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2183, 0x2184 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2E2F, 0x2E2F },
+ { 0x3005, 0x3006 },
+ { 0x3031, 0x3035 },
+ { 0x303B, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x309D, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA500, 0xA60C },
+ { 0xA610, 0xA61F },
+ { 0xA62A, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66E },
+ { 0xA67F, 0xA697 },
+ { 0xA717, 0xA71F },
+ { 0xA722, 0xA788 },
+ { 0xA78B, 0xA78C },
+ { 0xA7FB, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA822 },
+ { 0xA840, 0xA873 },
+ { 0xA882, 0xA8B3 },
+ { 0xA90A, 0xA925 },
+ { 0xA930, 0xA946 },
+ { 0xAA00, 0xAA28 },
+ { 0xAA40, 0xAA42 },
+ { 0xAA44, 0xAA4B },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFB },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFF21, 0xFF3A },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x10340 },
+ { 0x10342, 0x10349 },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x10400, 0x1049D },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A00 },
+ { 0x10A10, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x12000, 0x1236E },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_L)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Ll.c b/gnulib/tests/unictype/test-categ_Ll.c
new file mode 100644
index 00000000..7cd4ac36
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Ll.c
@@ -0,0 +1,620 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00DF, 0x00F6 },
+ { 0x00F8, 0x00FF },
+ { 0x0101, 0x0101 },
+ { 0x0103, 0x0103 },
+ { 0x0105, 0x0105 },
+ { 0x0107, 0x0107 },
+ { 0x0109, 0x0109 },
+ { 0x010B, 0x010B },
+ { 0x010D, 0x010D },
+ { 0x010F, 0x010F },
+ { 0x0111, 0x0111 },
+ { 0x0113, 0x0113 },
+ { 0x0115, 0x0115 },
+ { 0x0117, 0x0117 },
+ { 0x0119, 0x0119 },
+ { 0x011B, 0x011B },
+ { 0x011D, 0x011D },
+ { 0x011F, 0x011F },
+ { 0x0121, 0x0121 },
+ { 0x0123, 0x0123 },
+ { 0x0125, 0x0125 },
+ { 0x0127, 0x0127 },
+ { 0x0129, 0x0129 },
+ { 0x012B, 0x012B },
+ { 0x012D, 0x012D },
+ { 0x012F, 0x012F },
+ { 0x0131, 0x0131 },
+ { 0x0133, 0x0133 },
+ { 0x0135, 0x0135 },
+ { 0x0137, 0x0138 },
+ { 0x013A, 0x013A },
+ { 0x013C, 0x013C },
+ { 0x013E, 0x013E },
+ { 0x0140, 0x0140 },
+ { 0x0142, 0x0142 },
+ { 0x0144, 0x0144 },
+ { 0x0146, 0x0146 },
+ { 0x0148, 0x0149 },
+ { 0x014B, 0x014B },
+ { 0x014D, 0x014D },
+ { 0x014F, 0x014F },
+ { 0x0151, 0x0151 },
+ { 0x0153, 0x0153 },
+ { 0x0155, 0x0155 },
+ { 0x0157, 0x0157 },
+ { 0x0159, 0x0159 },
+ { 0x015B, 0x015B },
+ { 0x015D, 0x015D },
+ { 0x015F, 0x015F },
+ { 0x0161, 0x0161 },
+ { 0x0163, 0x0163 },
+ { 0x0165, 0x0165 },
+ { 0x0167, 0x0167 },
+ { 0x0169, 0x0169 },
+ { 0x016B, 0x016B },
+ { 0x016D, 0x016D },
+ { 0x016F, 0x016F },
+ { 0x0171, 0x0171 },
+ { 0x0173, 0x0173 },
+ { 0x0175, 0x0175 },
+ { 0x0177, 0x0177 },
+ { 0x017A, 0x017A },
+ { 0x017C, 0x017C },
+ { 0x017E, 0x0180 },
+ { 0x0183, 0x0183 },
+ { 0x0185, 0x0185 },
+ { 0x0188, 0x0188 },
+ { 0x018C, 0x018D },
+ { 0x0192, 0x0192 },
+ { 0x0195, 0x0195 },
+ { 0x0199, 0x019B },
+ { 0x019E, 0x019E },
+ { 0x01A1, 0x01A1 },
+ { 0x01A3, 0x01A3 },
+ { 0x01A5, 0x01A5 },
+ { 0x01A8, 0x01A8 },
+ { 0x01AA, 0x01AB },
+ { 0x01AD, 0x01AD },
+ { 0x01B0, 0x01B0 },
+ { 0x01B4, 0x01B4 },
+ { 0x01B6, 0x01B6 },
+ { 0x01B9, 0x01BA },
+ { 0x01BD, 0x01BF },
+ { 0x01C6, 0x01C6 },
+ { 0x01C9, 0x01C9 },
+ { 0x01CC, 0x01CC },
+ { 0x01CE, 0x01CE },
+ { 0x01D0, 0x01D0 },
+ { 0x01D2, 0x01D2 },
+ { 0x01D4, 0x01D4 },
+ { 0x01D6, 0x01D6 },
+ { 0x01D8, 0x01D8 },
+ { 0x01DA, 0x01DA },
+ { 0x01DC, 0x01DD },
+ { 0x01DF, 0x01DF },
+ { 0x01E1, 0x01E1 },
+ { 0x01E3, 0x01E3 },
+ { 0x01E5, 0x01E5 },
+ { 0x01E7, 0x01E7 },
+ { 0x01E9, 0x01E9 },
+ { 0x01EB, 0x01EB },
+ { 0x01ED, 0x01ED },
+ { 0x01EF, 0x01F0 },
+ { 0x01F3, 0x01F3 },
+ { 0x01F5, 0x01F5 },
+ { 0x01F9, 0x01F9 },
+ { 0x01FB, 0x01FB },
+ { 0x01FD, 0x01FD },
+ { 0x01FF, 0x01FF },
+ { 0x0201, 0x0201 },
+ { 0x0203, 0x0203 },
+ { 0x0205, 0x0205 },
+ { 0x0207, 0x0207 },
+ { 0x0209, 0x0209 },
+ { 0x020B, 0x020B },
+ { 0x020D, 0x020D },
+ { 0x020F, 0x020F },
+ { 0x0211, 0x0211 },
+ { 0x0213, 0x0213 },
+ { 0x0215, 0x0215 },
+ { 0x0217, 0x0217 },
+ { 0x0219, 0x0219 },
+ { 0x021B, 0x021B },
+ { 0x021D, 0x021D },
+ { 0x021F, 0x021F },
+ { 0x0221, 0x0221 },
+ { 0x0223, 0x0223 },
+ { 0x0225, 0x0225 },
+ { 0x0227, 0x0227 },
+ { 0x0229, 0x0229 },
+ { 0x022B, 0x022B },
+ { 0x022D, 0x022D },
+ { 0x022F, 0x022F },
+ { 0x0231, 0x0231 },
+ { 0x0233, 0x0239 },
+ { 0x023C, 0x023C },
+ { 0x023F, 0x0240 },
+ { 0x0242, 0x0242 },
+ { 0x0247, 0x0247 },
+ { 0x0249, 0x0249 },
+ { 0x024B, 0x024B },
+ { 0x024D, 0x024D },
+ { 0x024F, 0x0293 },
+ { 0x0295, 0x02AF },
+ { 0x0371, 0x0371 },
+ { 0x0373, 0x0373 },
+ { 0x0377, 0x0377 },
+ { 0x037B, 0x037D },
+ { 0x0390, 0x0390 },
+ { 0x03AC, 0x03CE },
+ { 0x03D0, 0x03D1 },
+ { 0x03D5, 0x03D7 },
+ { 0x03D9, 0x03D9 },
+ { 0x03DB, 0x03DB },
+ { 0x03DD, 0x03DD },
+ { 0x03DF, 0x03DF },
+ { 0x03E1, 0x03E1 },
+ { 0x03E3, 0x03E3 },
+ { 0x03E5, 0x03E5 },
+ { 0x03E7, 0x03E7 },
+ { 0x03E9, 0x03E9 },
+ { 0x03EB, 0x03EB },
+ { 0x03ED, 0x03ED },
+ { 0x03EF, 0x03F3 },
+ { 0x03F5, 0x03F5 },
+ { 0x03F8, 0x03F8 },
+ { 0x03FB, 0x03FC },
+ { 0x0430, 0x045F },
+ { 0x0461, 0x0461 },
+ { 0x0463, 0x0463 },
+ { 0x0465, 0x0465 },
+ { 0x0467, 0x0467 },
+ { 0x0469, 0x0469 },
+ { 0x046B, 0x046B },
+ { 0x046D, 0x046D },
+ { 0x046F, 0x046F },
+ { 0x0471, 0x0471 },
+ { 0x0473, 0x0473 },
+ { 0x0475, 0x0475 },
+ { 0x0477, 0x0477 },
+ { 0x0479, 0x0479 },
+ { 0x047B, 0x047B },
+ { 0x047D, 0x047D },
+ { 0x047F, 0x047F },
+ { 0x0481, 0x0481 },
+ { 0x048B, 0x048B },
+ { 0x048D, 0x048D },
+ { 0x048F, 0x048F },
+ { 0x0491, 0x0491 },
+ { 0x0493, 0x0493 },
+ { 0x0495, 0x0495 },
+ { 0x0497, 0x0497 },
+ { 0x0499, 0x0499 },
+ { 0x049B, 0x049B },
+ { 0x049D, 0x049D },
+ { 0x049F, 0x049F },
+ { 0x04A1, 0x04A1 },
+ { 0x04A3, 0x04A3 },
+ { 0x04A5, 0x04A5 },
+ { 0x04A7, 0x04A7 },
+ { 0x04A9, 0x04A9 },
+ { 0x04AB, 0x04AB },
+ { 0x04AD, 0x04AD },
+ { 0x04AF, 0x04AF },
+ { 0x04B1, 0x04B1 },
+ { 0x04B3, 0x04B3 },
+ { 0x04B5, 0x04B5 },
+ { 0x04B7, 0x04B7 },
+ { 0x04B9, 0x04B9 },
+ { 0x04BB, 0x04BB },
+ { 0x04BD, 0x04BD },
+ { 0x04BF, 0x04BF },
+ { 0x04C2, 0x04C2 },
+ { 0x04C4, 0x04C4 },
+ { 0x04C6, 0x04C6 },
+ { 0x04C8, 0x04C8 },
+ { 0x04CA, 0x04CA },
+ { 0x04CC, 0x04CC },
+ { 0x04CE, 0x04CF },
+ { 0x04D1, 0x04D1 },
+ { 0x04D3, 0x04D3 },
+ { 0x04D5, 0x04D5 },
+ { 0x04D7, 0x04D7 },
+ { 0x04D9, 0x04D9 },
+ { 0x04DB, 0x04DB },
+ { 0x04DD, 0x04DD },
+ { 0x04DF, 0x04DF },
+ { 0x04E1, 0x04E1 },
+ { 0x04E3, 0x04E3 },
+ { 0x04E5, 0x04E5 },
+ { 0x04E7, 0x04E7 },
+ { 0x04E9, 0x04E9 },
+ { 0x04EB, 0x04EB },
+ { 0x04ED, 0x04ED },
+ { 0x04EF, 0x04EF },
+ { 0x04F1, 0x04F1 },
+ { 0x04F3, 0x04F3 },
+ { 0x04F5, 0x04F5 },
+ { 0x04F7, 0x04F7 },
+ { 0x04F9, 0x04F9 },
+ { 0x04FB, 0x04FB },
+ { 0x04FD, 0x04FD },
+ { 0x04FF, 0x04FF },
+ { 0x0501, 0x0501 },
+ { 0x0503, 0x0503 },
+ { 0x0505, 0x0505 },
+ { 0x0507, 0x0507 },
+ { 0x0509, 0x0509 },
+ { 0x050B, 0x050B },
+ { 0x050D, 0x050D },
+ { 0x050F, 0x050F },
+ { 0x0511, 0x0511 },
+ { 0x0513, 0x0513 },
+ { 0x0515, 0x0515 },
+ { 0x0517, 0x0517 },
+ { 0x0519, 0x0519 },
+ { 0x051B, 0x051B },
+ { 0x051D, 0x051D },
+ { 0x051F, 0x051F },
+ { 0x0521, 0x0521 },
+ { 0x0523, 0x0523 },
+ { 0x0561, 0x0587 },
+ { 0x1D00, 0x1D2B },
+ { 0x1D62, 0x1D77 },
+ { 0x1D79, 0x1D9A },
+ { 0x1E01, 0x1E01 },
+ { 0x1E03, 0x1E03 },
+ { 0x1E05, 0x1E05 },
+ { 0x1E07, 0x1E07 },
+ { 0x1E09, 0x1E09 },
+ { 0x1E0B, 0x1E0B },
+ { 0x1E0D, 0x1E0D },
+ { 0x1E0F, 0x1E0F },
+ { 0x1E11, 0x1E11 },
+ { 0x1E13, 0x1E13 },
+ { 0x1E15, 0x1E15 },
+ { 0x1E17, 0x1E17 },
+ { 0x1E19, 0x1E19 },
+ { 0x1E1B, 0x1E1B },
+ { 0x1E1D, 0x1E1D },
+ { 0x1E1F, 0x1E1F },
+ { 0x1E21, 0x1E21 },
+ { 0x1E23, 0x1E23 },
+ { 0x1E25, 0x1E25 },
+ { 0x1E27, 0x1E27 },
+ { 0x1E29, 0x1E29 },
+ { 0x1E2B, 0x1E2B },
+ { 0x1E2D, 0x1E2D },
+ { 0x1E2F, 0x1E2F },
+ { 0x1E31, 0x1E31 },
+ { 0x1E33, 0x1E33 },
+ { 0x1E35, 0x1E35 },
+ { 0x1E37, 0x1E37 },
+ { 0x1E39, 0x1E39 },
+ { 0x1E3B, 0x1E3B },
+ { 0x1E3D, 0x1E3D },
+ { 0x1E3F, 0x1E3F },
+ { 0x1E41, 0x1E41 },
+ { 0x1E43, 0x1E43 },
+ { 0x1E45, 0x1E45 },
+ { 0x1E47, 0x1E47 },
+ { 0x1E49, 0x1E49 },
+ { 0x1E4B, 0x1E4B },
+ { 0x1E4D, 0x1E4D },
+ { 0x1E4F, 0x1E4F },
+ { 0x1E51, 0x1E51 },
+ { 0x1E53, 0x1E53 },
+ { 0x1E55, 0x1E55 },
+ { 0x1E57, 0x1E57 },
+ { 0x1E59, 0x1E59 },
+ { 0x1E5B, 0x1E5B },
+ { 0x1E5D, 0x1E5D },
+ { 0x1E5F, 0x1E5F },
+ { 0x1E61, 0x1E61 },
+ { 0x1E63, 0x1E63 },
+ { 0x1E65, 0x1E65 },
+ { 0x1E67, 0x1E67 },
+ { 0x1E69, 0x1E69 },
+ { 0x1E6B, 0x1E6B },
+ { 0x1E6D, 0x1E6D },
+ { 0x1E6F, 0x1E6F },
+ { 0x1E71, 0x1E71 },
+ { 0x1E73, 0x1E73 },
+ { 0x1E75, 0x1E75 },
+ { 0x1E77, 0x1E77 },
+ { 0x1E79, 0x1E79 },
+ { 0x1E7B, 0x1E7B },
+ { 0x1E7D, 0x1E7D },
+ { 0x1E7F, 0x1E7F },
+ { 0x1E81, 0x1E81 },
+ { 0x1E83, 0x1E83 },
+ { 0x1E85, 0x1E85 },
+ { 0x1E87, 0x1E87 },
+ { 0x1E89, 0x1E89 },
+ { 0x1E8B, 0x1E8B },
+ { 0x1E8D, 0x1E8D },
+ { 0x1E8F, 0x1E8F },
+ { 0x1E91, 0x1E91 },
+ { 0x1E93, 0x1E93 },
+ { 0x1E95, 0x1E9D },
+ { 0x1E9F, 0x1E9F },
+ { 0x1EA1, 0x1EA1 },
+ { 0x1EA3, 0x1EA3 },
+ { 0x1EA5, 0x1EA5 },
+ { 0x1EA7, 0x1EA7 },
+ { 0x1EA9, 0x1EA9 },
+ { 0x1EAB, 0x1EAB },
+ { 0x1EAD, 0x1EAD },
+ { 0x1EAF, 0x1EAF },
+ { 0x1EB1, 0x1EB1 },
+ { 0x1EB3, 0x1EB3 },
+ { 0x1EB5, 0x1EB5 },
+ { 0x1EB7, 0x1EB7 },
+ { 0x1EB9, 0x1EB9 },
+ { 0x1EBB, 0x1EBB },
+ { 0x1EBD, 0x1EBD },
+ { 0x1EBF, 0x1EBF },
+ { 0x1EC1, 0x1EC1 },
+ { 0x1EC3, 0x1EC3 },
+ { 0x1EC5, 0x1EC5 },
+ { 0x1EC7, 0x1EC7 },
+ { 0x1EC9, 0x1EC9 },
+ { 0x1ECB, 0x1ECB },
+ { 0x1ECD, 0x1ECD },
+ { 0x1ECF, 0x1ECF },
+ { 0x1ED1, 0x1ED1 },
+ { 0x1ED3, 0x1ED3 },
+ { 0x1ED5, 0x1ED5 },
+ { 0x1ED7, 0x1ED7 },
+ { 0x1ED9, 0x1ED9 },
+ { 0x1EDB, 0x1EDB },
+ { 0x1EDD, 0x1EDD },
+ { 0x1EDF, 0x1EDF },
+ { 0x1EE1, 0x1EE1 },
+ { 0x1EE3, 0x1EE3 },
+ { 0x1EE5, 0x1EE5 },
+ { 0x1EE7, 0x1EE7 },
+ { 0x1EE9, 0x1EE9 },
+ { 0x1EEB, 0x1EEB },
+ { 0x1EED, 0x1EED },
+ { 0x1EEF, 0x1EEF },
+ { 0x1EF1, 0x1EF1 },
+ { 0x1EF3, 0x1EF3 },
+ { 0x1EF5, 0x1EF5 },
+ { 0x1EF7, 0x1EF7 },
+ { 0x1EF9, 0x1EF9 },
+ { 0x1EFB, 0x1EFB },
+ { 0x1EFD, 0x1EFD },
+ { 0x1EFF, 0x1F07 },
+ { 0x1F10, 0x1F15 },
+ { 0x1F20, 0x1F27 },
+ { 0x1F30, 0x1F37 },
+ { 0x1F40, 0x1F45 },
+ { 0x1F50, 0x1F57 },
+ { 0x1F60, 0x1F67 },
+ { 0x1F70, 0x1F7D },
+ { 0x1F80, 0x1F87 },
+ { 0x1F90, 0x1F97 },
+ { 0x1FA0, 0x1FA7 },
+ { 0x1FB0, 0x1FB4 },
+ { 0x1FB6, 0x1FB7 },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FC7 },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FD7 },
+ { 0x1FE0, 0x1FE7 },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FF7 },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x210A, 0x210A },
+ { 0x210E, 0x210F },
+ { 0x2113, 0x2113 },
+ { 0x212F, 0x212F },
+ { 0x2134, 0x2134 },
+ { 0x2139, 0x2139 },
+ { 0x213C, 0x213D },
+ { 0x2146, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2184, 0x2184 },
+ { 0x2C30, 0x2C5E },
+ { 0x2C61, 0x2C61 },
+ { 0x2C65, 0x2C66 },
+ { 0x2C68, 0x2C68 },
+ { 0x2C6A, 0x2C6A },
+ { 0x2C6C, 0x2C6C },
+ { 0x2C71, 0x2C71 },
+ { 0x2C73, 0x2C74 },
+ { 0x2C76, 0x2C7C },
+ { 0x2C81, 0x2C81 },
+ { 0x2C83, 0x2C83 },
+ { 0x2C85, 0x2C85 },
+ { 0x2C87, 0x2C87 },
+ { 0x2C89, 0x2C89 },
+ { 0x2C8B, 0x2C8B },
+ { 0x2C8D, 0x2C8D },
+ { 0x2C8F, 0x2C8F },
+ { 0x2C91, 0x2C91 },
+ { 0x2C93, 0x2C93 },
+ { 0x2C95, 0x2C95 },
+ { 0x2C97, 0x2C97 },
+ { 0x2C99, 0x2C99 },
+ { 0x2C9B, 0x2C9B },
+ { 0x2C9D, 0x2C9D },
+ { 0x2C9F, 0x2C9F },
+ { 0x2CA1, 0x2CA1 },
+ { 0x2CA3, 0x2CA3 },
+ { 0x2CA5, 0x2CA5 },
+ { 0x2CA7, 0x2CA7 },
+ { 0x2CA9, 0x2CA9 },
+ { 0x2CAB, 0x2CAB },
+ { 0x2CAD, 0x2CAD },
+ { 0x2CAF, 0x2CAF },
+ { 0x2CB1, 0x2CB1 },
+ { 0x2CB3, 0x2CB3 },
+ { 0x2CB5, 0x2CB5 },
+ { 0x2CB7, 0x2CB7 },
+ { 0x2CB9, 0x2CB9 },
+ { 0x2CBB, 0x2CBB },
+ { 0x2CBD, 0x2CBD },
+ { 0x2CBF, 0x2CBF },
+ { 0x2CC1, 0x2CC1 },
+ { 0x2CC3, 0x2CC3 },
+ { 0x2CC5, 0x2CC5 },
+ { 0x2CC7, 0x2CC7 },
+ { 0x2CC9, 0x2CC9 },
+ { 0x2CCB, 0x2CCB },
+ { 0x2CCD, 0x2CCD },
+ { 0x2CCF, 0x2CCF },
+ { 0x2CD1, 0x2CD1 },
+ { 0x2CD3, 0x2CD3 },
+ { 0x2CD5, 0x2CD5 },
+ { 0x2CD7, 0x2CD7 },
+ { 0x2CD9, 0x2CD9 },
+ { 0x2CDB, 0x2CDB },
+ { 0x2CDD, 0x2CDD },
+ { 0x2CDF, 0x2CDF },
+ { 0x2CE1, 0x2CE1 },
+ { 0x2CE3, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0xA641, 0xA641 },
+ { 0xA643, 0xA643 },
+ { 0xA645, 0xA645 },
+ { 0xA647, 0xA647 },
+ { 0xA649, 0xA649 },
+ { 0xA64B, 0xA64B },
+ { 0xA64D, 0xA64D },
+ { 0xA64F, 0xA64F },
+ { 0xA651, 0xA651 },
+ { 0xA653, 0xA653 },
+ { 0xA655, 0xA655 },
+ { 0xA657, 0xA657 },
+ { 0xA659, 0xA659 },
+ { 0xA65B, 0xA65B },
+ { 0xA65D, 0xA65D },
+ { 0xA65F, 0xA65F },
+ { 0xA663, 0xA663 },
+ { 0xA665, 0xA665 },
+ { 0xA667, 0xA667 },
+ { 0xA669, 0xA669 },
+ { 0xA66B, 0xA66B },
+ { 0xA66D, 0xA66D },
+ { 0xA681, 0xA681 },
+ { 0xA683, 0xA683 },
+ { 0xA685, 0xA685 },
+ { 0xA687, 0xA687 },
+ { 0xA689, 0xA689 },
+ { 0xA68B, 0xA68B },
+ { 0xA68D, 0xA68D },
+ { 0xA68F, 0xA68F },
+ { 0xA691, 0xA691 },
+ { 0xA693, 0xA693 },
+ { 0xA695, 0xA695 },
+ { 0xA697, 0xA697 },
+ { 0xA723, 0xA723 },
+ { 0xA725, 0xA725 },
+ { 0xA727, 0xA727 },
+ { 0xA729, 0xA729 },
+ { 0xA72B, 0xA72B },
+ { 0xA72D, 0xA72D },
+ { 0xA72F, 0xA731 },
+ { 0xA733, 0xA733 },
+ { 0xA735, 0xA735 },
+ { 0xA737, 0xA737 },
+ { 0xA739, 0xA739 },
+ { 0xA73B, 0xA73B },
+ { 0xA73D, 0xA73D },
+ { 0xA73F, 0xA73F },
+ { 0xA741, 0xA741 },
+ { 0xA743, 0xA743 },
+ { 0xA745, 0xA745 },
+ { 0xA747, 0xA747 },
+ { 0xA749, 0xA749 },
+ { 0xA74B, 0xA74B },
+ { 0xA74D, 0xA74D },
+ { 0xA74F, 0xA74F },
+ { 0xA751, 0xA751 },
+ { 0xA753, 0xA753 },
+ { 0xA755, 0xA755 },
+ { 0xA757, 0xA757 },
+ { 0xA759, 0xA759 },
+ { 0xA75B, 0xA75B },
+ { 0xA75D, 0xA75D },
+ { 0xA75F, 0xA75F },
+ { 0xA761, 0xA761 },
+ { 0xA763, 0xA763 },
+ { 0xA765, 0xA765 },
+ { 0xA767, 0xA767 },
+ { 0xA769, 0xA769 },
+ { 0xA76B, 0xA76B },
+ { 0xA76D, 0xA76D },
+ { 0xA76F, 0xA76F },
+ { 0xA771, 0xA778 },
+ { 0xA77A, 0xA77A },
+ { 0xA77C, 0xA77C },
+ { 0xA77F, 0xA77F },
+ { 0xA781, 0xA781 },
+ { 0xA783, 0xA783 },
+ { 0xA785, 0xA785 },
+ { 0xA787, 0xA787 },
+ { 0xA78C, 0xA78C },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFF41, 0xFF5A },
+ { 0x10428, 0x1044F },
+ { 0x1D41A, 0x1D433 },
+ { 0x1D44E, 0x1D454 },
+ { 0x1D456, 0x1D467 },
+ { 0x1D482, 0x1D49B },
+ { 0x1D4B6, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D4CF },
+ { 0x1D4EA, 0x1D503 },
+ { 0x1D51E, 0x1D537 },
+ { 0x1D552, 0x1D56B },
+ { 0x1D586, 0x1D59F },
+ { 0x1D5BA, 0x1D5D3 },
+ { 0x1D5EE, 0x1D607 },
+ { 0x1D622, 0x1D63B },
+ { 0x1D656, 0x1D66F },
+ { 0x1D68A, 0x1D6A5 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6E1 },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D71B },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D755 },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D78F },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7C9 },
+ { 0x1D7CB, 0x1D7CB }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Ll)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Lm.c b/gnulib/tests/unictype/test-categ_Lm.c
new file mode 100644
index 00000000..7444b164
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Lm.c
@@ -0,0 +1,61 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x02B0, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0374, 0x0374 },
+ { 0x037A, 0x037A },
+ { 0x0559, 0x0559 },
+ { 0x0640, 0x0640 },
+ { 0x06E5, 0x06E6 },
+ { 0x07F4, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0971, 0x0971 },
+ { 0x0E46, 0x0E46 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x10FC, 0x10FC },
+ { 0x17D7, 0x17D7 },
+ { 0x1843, 0x1843 },
+ { 0x1C78, 0x1C7D },
+ { 0x1D2C, 0x1D61 },
+ { 0x1D78, 0x1D78 },
+ { 0x1D9B, 0x1DBF },
+ { 0x2090, 0x2094 },
+ { 0x2C7D, 0x2C7D },
+ { 0x2D6F, 0x2D6F },
+ { 0x2E2F, 0x2E2F },
+ { 0x3005, 0x3005 },
+ { 0x3031, 0x3035 },
+ { 0x303B, 0x303B },
+ { 0x309D, 0x309E },
+ { 0x30FC, 0x30FE },
+ { 0xA015, 0xA015 },
+ { 0xA60C, 0xA60C },
+ { 0xA67F, 0xA67F },
+ { 0xA717, 0xA71F },
+ { 0xA770, 0xA770 },
+ { 0xA788, 0xA788 },
+ { 0xFF70, 0xFF70 },
+ { 0xFF9E, 0xFF9F }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Lm)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Lo.c b/gnulib/tests/unictype/test-categ_Lo.c
new file mode 100644
index 00000000..aaf69963
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Lo.c
@@ -0,0 +1,304 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x01BB, 0x01BB },
+ { 0x01C0, 0x01C3 },
+ { 0x0294, 0x0294 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0621, 0x063F },
+ { 0x0641, 0x064A },
+ { 0x066E, 0x066F },
+ { 0x0671, 0x06D3 },
+ { 0x06D5, 0x06D5 },
+ { 0x06EE, 0x06EF },
+ { 0x06FA, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x0710 },
+ { 0x0712, 0x072F },
+ { 0x074D, 0x07A5 },
+ { 0x07B1, 0x07B1 },
+ { 0x07CA, 0x07EA },
+ { 0x0904, 0x0939 },
+ { 0x093D, 0x093D },
+ { 0x0950, 0x0950 },
+ { 0x0958, 0x0961 },
+ { 0x0972, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BD, 0x09BD },
+ { 0x09CE, 0x09CE },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E1 },
+ { 0x09F0, 0x09F1 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A72, 0x0A74 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABD, 0x0ABD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE1 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3D, 0x0B3D },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B61 },
+ { 0x0B71, 0x0B71 },
+ { 0x0B83, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C3D },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C61 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBD, 0x0CBD },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE1 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D3D },
+ { 0x0D60, 0x0D61 },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0E01, 0x0E30 },
+ { 0x0E32, 0x0E33 },
+ { 0x0E40, 0x0E45 },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB0 },
+ { 0x0EB2, 0x0EB3 },
+ { 0x0EBD, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F40, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F88, 0x0F8B },
+ { 0x1000, 0x102A },
+ { 0x103F, 0x103F },
+ { 0x1050, 0x1055 },
+ { 0x105A, 0x105D },
+ { 0x1061, 0x1061 },
+ { 0x1065, 0x1066 },
+ { 0x106E, 0x1070 },
+ { 0x1075, 0x1081 },
+ { 0x108E, 0x108E },
+ { 0x10D0, 0x10FA },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1711 },
+ { 0x1720, 0x1731 },
+ { 0x1740, 0x1751 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1780, 0x17B3 },
+ { 0x17DC, 0x17DC },
+ { 0x1820, 0x1842 },
+ { 0x1844, 0x1877 },
+ { 0x1880, 0x18A8 },
+ { 0x18AA, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1950, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19C1, 0x19C7 },
+ { 0x1A00, 0x1A16 },
+ { 0x1B05, 0x1B33 },
+ { 0x1B45, 0x1B4B },
+ { 0x1B83, 0x1BA0 },
+ { 0x1BAE, 0x1BAF },
+ { 0x1C00, 0x1C23 },
+ { 0x1C4D, 0x1C4F },
+ { 0x1C5A, 0x1C77 },
+ { 0x2135, 0x2138 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x3006, 0x3006 },
+ { 0x303C, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x309F, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FF, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA014 },
+ { 0xA016, 0xA48C },
+ { 0xA500, 0xA60B },
+ { 0xA610, 0xA61F },
+ { 0xA62A, 0xA62B },
+ { 0xA66E, 0xA66E },
+ { 0xA7FB, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA822 },
+ { 0xA840, 0xA873 },
+ { 0xA882, 0xA8B3 },
+ { 0xA90A, 0xA925 },
+ { 0xA930, 0xA946 },
+ { 0xAA00, 0xAA28 },
+ { 0xAA40, 0xAA42 },
+ { 0xAA44, 0xAA4B },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFB },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFF66, 0xFF6F },
+ { 0xFF71, 0xFF9D },
+ { 0xFFA0, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x10340 },
+ { 0x10342, 0x10349 },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x10450, 0x1049D },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A00 },
+ { 0x10A10, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x12000, 0x1236E },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Lo)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Lt.c b/gnulib/tests/unictype/test-categ_Lt.c
new file mode 100644
index 00000000..6f319237
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Lt.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x01C5, 0x01C5 },
+ { 0x01C8, 0x01C8 },
+ { 0x01CB, 0x01CB },
+ { 0x01F2, 0x01F2 },
+ { 0x1F88, 0x1F8F },
+ { 0x1F98, 0x1F9F },
+ { 0x1FA8, 0x1FAF },
+ { 0x1FBC, 0x1FBC },
+ { 0x1FCC, 0x1FCC },
+ { 0x1FFC, 0x1FFC }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Lt)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Lu.c b/gnulib/tests/unictype/test-categ_Lu.c
new file mode 100644
index 00000000..1ed6b403
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Lu.c
@@ -0,0 +1,613 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00DE },
+ { 0x0100, 0x0100 },
+ { 0x0102, 0x0102 },
+ { 0x0104, 0x0104 },
+ { 0x0106, 0x0106 },
+ { 0x0108, 0x0108 },
+ { 0x010A, 0x010A },
+ { 0x010C, 0x010C },
+ { 0x010E, 0x010E },
+ { 0x0110, 0x0110 },
+ { 0x0112, 0x0112 },
+ { 0x0114, 0x0114 },
+ { 0x0116, 0x0116 },
+ { 0x0118, 0x0118 },
+ { 0x011A, 0x011A },
+ { 0x011C, 0x011C },
+ { 0x011E, 0x011E },
+ { 0x0120, 0x0120 },
+ { 0x0122, 0x0122 },
+ { 0x0124, 0x0124 },
+ { 0x0126, 0x0126 },
+ { 0x0128, 0x0128 },
+ { 0x012A, 0x012A },
+ { 0x012C, 0x012C },
+ { 0x012E, 0x012E },
+ { 0x0130, 0x0130 },
+ { 0x0132, 0x0132 },
+ { 0x0134, 0x0134 },
+ { 0x0136, 0x0136 },
+ { 0x0139, 0x0139 },
+ { 0x013B, 0x013B },
+ { 0x013D, 0x013D },
+ { 0x013F, 0x013F },
+ { 0x0141, 0x0141 },
+ { 0x0143, 0x0143 },
+ { 0x0145, 0x0145 },
+ { 0x0147, 0x0147 },
+ { 0x014A, 0x014A },
+ { 0x014C, 0x014C },
+ { 0x014E, 0x014E },
+ { 0x0150, 0x0150 },
+ { 0x0152, 0x0152 },
+ { 0x0154, 0x0154 },
+ { 0x0156, 0x0156 },
+ { 0x0158, 0x0158 },
+ { 0x015A, 0x015A },
+ { 0x015C, 0x015C },
+ { 0x015E, 0x015E },
+ { 0x0160, 0x0160 },
+ { 0x0162, 0x0162 },
+ { 0x0164, 0x0164 },
+ { 0x0166, 0x0166 },
+ { 0x0168, 0x0168 },
+ { 0x016A, 0x016A },
+ { 0x016C, 0x016C },
+ { 0x016E, 0x016E },
+ { 0x0170, 0x0170 },
+ { 0x0172, 0x0172 },
+ { 0x0174, 0x0174 },
+ { 0x0176, 0x0176 },
+ { 0x0178, 0x0179 },
+ { 0x017B, 0x017B },
+ { 0x017D, 0x017D },
+ { 0x0181, 0x0182 },
+ { 0x0184, 0x0184 },
+ { 0x0186, 0x0187 },
+ { 0x0189, 0x018B },
+ { 0x018E, 0x0191 },
+ { 0x0193, 0x0194 },
+ { 0x0196, 0x0198 },
+ { 0x019C, 0x019D },
+ { 0x019F, 0x01A0 },
+ { 0x01A2, 0x01A2 },
+ { 0x01A4, 0x01A4 },
+ { 0x01A6, 0x01A7 },
+ { 0x01A9, 0x01A9 },
+ { 0x01AC, 0x01AC },
+ { 0x01AE, 0x01AF },
+ { 0x01B1, 0x01B3 },
+ { 0x01B5, 0x01B5 },
+ { 0x01B7, 0x01B8 },
+ { 0x01BC, 0x01BC },
+ { 0x01C4, 0x01C4 },
+ { 0x01C7, 0x01C7 },
+ { 0x01CA, 0x01CA },
+ { 0x01CD, 0x01CD },
+ { 0x01CF, 0x01CF },
+ { 0x01D1, 0x01D1 },
+ { 0x01D3, 0x01D3 },
+ { 0x01D5, 0x01D5 },
+ { 0x01D7, 0x01D7 },
+ { 0x01D9, 0x01D9 },
+ { 0x01DB, 0x01DB },
+ { 0x01DE, 0x01DE },
+ { 0x01E0, 0x01E0 },
+ { 0x01E2, 0x01E2 },
+ { 0x01E4, 0x01E4 },
+ { 0x01E6, 0x01E6 },
+ { 0x01E8, 0x01E8 },
+ { 0x01EA, 0x01EA },
+ { 0x01EC, 0x01EC },
+ { 0x01EE, 0x01EE },
+ { 0x01F1, 0x01F1 },
+ { 0x01F4, 0x01F4 },
+ { 0x01F6, 0x01F8 },
+ { 0x01FA, 0x01FA },
+ { 0x01FC, 0x01FC },
+ { 0x01FE, 0x01FE },
+ { 0x0200, 0x0200 },
+ { 0x0202, 0x0202 },
+ { 0x0204, 0x0204 },
+ { 0x0206, 0x0206 },
+ { 0x0208, 0x0208 },
+ { 0x020A, 0x020A },
+ { 0x020C, 0x020C },
+ { 0x020E, 0x020E },
+ { 0x0210, 0x0210 },
+ { 0x0212, 0x0212 },
+ { 0x0214, 0x0214 },
+ { 0x0216, 0x0216 },
+ { 0x0218, 0x0218 },
+ { 0x021A, 0x021A },
+ { 0x021C, 0x021C },
+ { 0x021E, 0x021E },
+ { 0x0220, 0x0220 },
+ { 0x0222, 0x0222 },
+ { 0x0224, 0x0224 },
+ { 0x0226, 0x0226 },
+ { 0x0228, 0x0228 },
+ { 0x022A, 0x022A },
+ { 0x022C, 0x022C },
+ { 0x022E, 0x022E },
+ { 0x0230, 0x0230 },
+ { 0x0232, 0x0232 },
+ { 0x023A, 0x023B },
+ { 0x023D, 0x023E },
+ { 0x0241, 0x0241 },
+ { 0x0243, 0x0246 },
+ { 0x0248, 0x0248 },
+ { 0x024A, 0x024A },
+ { 0x024C, 0x024C },
+ { 0x024E, 0x024E },
+ { 0x0370, 0x0370 },
+ { 0x0372, 0x0372 },
+ { 0x0376, 0x0376 },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x038F },
+ { 0x0391, 0x03A1 },
+ { 0x03A3, 0x03AB },
+ { 0x03CF, 0x03CF },
+ { 0x03D2, 0x03D4 },
+ { 0x03D8, 0x03D8 },
+ { 0x03DA, 0x03DA },
+ { 0x03DC, 0x03DC },
+ { 0x03DE, 0x03DE },
+ { 0x03E0, 0x03E0 },
+ { 0x03E2, 0x03E2 },
+ { 0x03E4, 0x03E4 },
+ { 0x03E6, 0x03E6 },
+ { 0x03E8, 0x03E8 },
+ { 0x03EA, 0x03EA },
+ { 0x03EC, 0x03EC },
+ { 0x03EE, 0x03EE },
+ { 0x03F4, 0x03F4 },
+ { 0x03F7, 0x03F7 },
+ { 0x03F9, 0x03FA },
+ { 0x03FD, 0x042F },
+ { 0x0460, 0x0460 },
+ { 0x0462, 0x0462 },
+ { 0x0464, 0x0464 },
+ { 0x0466, 0x0466 },
+ { 0x0468, 0x0468 },
+ { 0x046A, 0x046A },
+ { 0x046C, 0x046C },
+ { 0x046E, 0x046E },
+ { 0x0470, 0x0470 },
+ { 0x0472, 0x0472 },
+ { 0x0474, 0x0474 },
+ { 0x0476, 0x0476 },
+ { 0x0478, 0x0478 },
+ { 0x047A, 0x047A },
+ { 0x047C, 0x047C },
+ { 0x047E, 0x047E },
+ { 0x0480, 0x0480 },
+ { 0x048A, 0x048A },
+ { 0x048C, 0x048C },
+ { 0x048E, 0x048E },
+ { 0x0490, 0x0490 },
+ { 0x0492, 0x0492 },
+ { 0x0494, 0x0494 },
+ { 0x0496, 0x0496 },
+ { 0x0498, 0x0498 },
+ { 0x049A, 0x049A },
+ { 0x049C, 0x049C },
+ { 0x049E, 0x049E },
+ { 0x04A0, 0x04A0 },
+ { 0x04A2, 0x04A2 },
+ { 0x04A4, 0x04A4 },
+ { 0x04A6, 0x04A6 },
+ { 0x04A8, 0x04A8 },
+ { 0x04AA, 0x04AA },
+ { 0x04AC, 0x04AC },
+ { 0x04AE, 0x04AE },
+ { 0x04B0, 0x04B0 },
+ { 0x04B2, 0x04B2 },
+ { 0x04B4, 0x04B4 },
+ { 0x04B6, 0x04B6 },
+ { 0x04B8, 0x04B8 },
+ { 0x04BA, 0x04BA },
+ { 0x04BC, 0x04BC },
+ { 0x04BE, 0x04BE },
+ { 0x04C0, 0x04C1 },
+ { 0x04C3, 0x04C3 },
+ { 0x04C5, 0x04C5 },
+ { 0x04C7, 0x04C7 },
+ { 0x04C9, 0x04C9 },
+ { 0x04CB, 0x04CB },
+ { 0x04CD, 0x04CD },
+ { 0x04D0, 0x04D0 },
+ { 0x04D2, 0x04D2 },
+ { 0x04D4, 0x04D4 },
+ { 0x04D6, 0x04D6 },
+ { 0x04D8, 0x04D8 },
+ { 0x04DA, 0x04DA },
+ { 0x04DC, 0x04DC },
+ { 0x04DE, 0x04DE },
+ { 0x04E0, 0x04E0 },
+ { 0x04E2, 0x04E2 },
+ { 0x04E4, 0x04E4 },
+ { 0x04E6, 0x04E6 },
+ { 0x04E8, 0x04E8 },
+ { 0x04EA, 0x04EA },
+ { 0x04EC, 0x04EC },
+ { 0x04EE, 0x04EE },
+ { 0x04F0, 0x04F0 },
+ { 0x04F2, 0x04F2 },
+ { 0x04F4, 0x04F4 },
+ { 0x04F6, 0x04F6 },
+ { 0x04F8, 0x04F8 },
+ { 0x04FA, 0x04FA },
+ { 0x04FC, 0x04FC },
+ { 0x04FE, 0x04FE },
+ { 0x0500, 0x0500 },
+ { 0x0502, 0x0502 },
+ { 0x0504, 0x0504 },
+ { 0x0506, 0x0506 },
+ { 0x0508, 0x0508 },
+ { 0x050A, 0x050A },
+ { 0x050C, 0x050C },
+ { 0x050E, 0x050E },
+ { 0x0510, 0x0510 },
+ { 0x0512, 0x0512 },
+ { 0x0514, 0x0514 },
+ { 0x0516, 0x0516 },
+ { 0x0518, 0x0518 },
+ { 0x051A, 0x051A },
+ { 0x051C, 0x051C },
+ { 0x051E, 0x051E },
+ { 0x0520, 0x0520 },
+ { 0x0522, 0x0522 },
+ { 0x0531, 0x0556 },
+ { 0x10A0, 0x10C5 },
+ { 0x1E00, 0x1E00 },
+ { 0x1E02, 0x1E02 },
+ { 0x1E04, 0x1E04 },
+ { 0x1E06, 0x1E06 },
+ { 0x1E08, 0x1E08 },
+ { 0x1E0A, 0x1E0A },
+ { 0x1E0C, 0x1E0C },
+ { 0x1E0E, 0x1E0E },
+ { 0x1E10, 0x1E10 },
+ { 0x1E12, 0x1E12 },
+ { 0x1E14, 0x1E14 },
+ { 0x1E16, 0x1E16 },
+ { 0x1E18, 0x1E18 },
+ { 0x1E1A, 0x1E1A },
+ { 0x1E1C, 0x1E1C },
+ { 0x1E1E, 0x1E1E },
+ { 0x1E20, 0x1E20 },
+ { 0x1E22, 0x1E22 },
+ { 0x1E24, 0x1E24 },
+ { 0x1E26, 0x1E26 },
+ { 0x1E28, 0x1E28 },
+ { 0x1E2A, 0x1E2A },
+ { 0x1E2C, 0x1E2C },
+ { 0x1E2E, 0x1E2E },
+ { 0x1E30, 0x1E30 },
+ { 0x1E32, 0x1E32 },
+ { 0x1E34, 0x1E34 },
+ { 0x1E36, 0x1E36 },
+ { 0x1E38, 0x1E38 },
+ { 0x1E3A, 0x1E3A },
+ { 0x1E3C, 0x1E3C },
+ { 0x1E3E, 0x1E3E },
+ { 0x1E40, 0x1E40 },
+ { 0x1E42, 0x1E42 },
+ { 0x1E44, 0x1E44 },
+ { 0x1E46, 0x1E46 },
+ { 0x1E48, 0x1E48 },
+ { 0x1E4A, 0x1E4A },
+ { 0x1E4C, 0x1E4C },
+ { 0x1E4E, 0x1E4E },
+ { 0x1E50, 0x1E50 },
+ { 0x1E52, 0x1E52 },
+ { 0x1E54, 0x1E54 },
+ { 0x1E56, 0x1E56 },
+ { 0x1E58, 0x1E58 },
+ { 0x1E5A, 0x1E5A },
+ { 0x1E5C, 0x1E5C },
+ { 0x1E5E, 0x1E5E },
+ { 0x1E60, 0x1E60 },
+ { 0x1E62, 0x1E62 },
+ { 0x1E64, 0x1E64 },
+ { 0x1E66, 0x1E66 },
+ { 0x1E68, 0x1E68 },
+ { 0x1E6A, 0x1E6A },
+ { 0x1E6C, 0x1E6C },
+ { 0x1E6E, 0x1E6E },
+ { 0x1E70, 0x1E70 },
+ { 0x1E72, 0x1E72 },
+ { 0x1E74, 0x1E74 },
+ { 0x1E76, 0x1E76 },
+ { 0x1E78, 0x1E78 },
+ { 0x1E7A, 0x1E7A },
+ { 0x1E7C, 0x1E7C },
+ { 0x1E7E, 0x1E7E },
+ { 0x1E80, 0x1E80 },
+ { 0x1E82, 0x1E82 },
+ { 0x1E84, 0x1E84 },
+ { 0x1E86, 0x1E86 },
+ { 0x1E88, 0x1E88 },
+ { 0x1E8A, 0x1E8A },
+ { 0x1E8C, 0x1E8C },
+ { 0x1E8E, 0x1E8E },
+ { 0x1E90, 0x1E90 },
+ { 0x1E92, 0x1E92 },
+ { 0x1E94, 0x1E94 },
+ { 0x1E9E, 0x1E9E },
+ { 0x1EA0, 0x1EA0 },
+ { 0x1EA2, 0x1EA2 },
+ { 0x1EA4, 0x1EA4 },
+ { 0x1EA6, 0x1EA6 },
+ { 0x1EA8, 0x1EA8 },
+ { 0x1EAA, 0x1EAA },
+ { 0x1EAC, 0x1EAC },
+ { 0x1EAE, 0x1EAE },
+ { 0x1EB0, 0x1EB0 },
+ { 0x1EB2, 0x1EB2 },
+ { 0x1EB4, 0x1EB4 },
+ { 0x1EB6, 0x1EB6 },
+ { 0x1EB8, 0x1EB8 },
+ { 0x1EBA, 0x1EBA },
+ { 0x1EBC, 0x1EBC },
+ { 0x1EBE, 0x1EBE },
+ { 0x1EC0, 0x1EC0 },
+ { 0x1EC2, 0x1EC2 },
+ { 0x1EC4, 0x1EC4 },
+ { 0x1EC6, 0x1EC6 },
+ { 0x1EC8, 0x1EC8 },
+ { 0x1ECA, 0x1ECA },
+ { 0x1ECC, 0x1ECC },
+ { 0x1ECE, 0x1ECE },
+ { 0x1ED0, 0x1ED0 },
+ { 0x1ED2, 0x1ED2 },
+ { 0x1ED4, 0x1ED4 },
+ { 0x1ED6, 0x1ED6 },
+ { 0x1ED8, 0x1ED8 },
+ { 0x1EDA, 0x1EDA },
+ { 0x1EDC, 0x1EDC },
+ { 0x1EDE, 0x1EDE },
+ { 0x1EE0, 0x1EE0 },
+ { 0x1EE2, 0x1EE2 },
+ { 0x1EE4, 0x1EE4 },
+ { 0x1EE6, 0x1EE6 },
+ { 0x1EE8, 0x1EE8 },
+ { 0x1EEA, 0x1EEA },
+ { 0x1EEC, 0x1EEC },
+ { 0x1EEE, 0x1EEE },
+ { 0x1EF0, 0x1EF0 },
+ { 0x1EF2, 0x1EF2 },
+ { 0x1EF4, 0x1EF4 },
+ { 0x1EF6, 0x1EF6 },
+ { 0x1EF8, 0x1EF8 },
+ { 0x1EFA, 0x1EFA },
+ { 0x1EFC, 0x1EFC },
+ { 0x1EFE, 0x1EFE },
+ { 0x1F08, 0x1F0F },
+ { 0x1F18, 0x1F1D },
+ { 0x1F28, 0x1F2F },
+ { 0x1F38, 0x1F3F },
+ { 0x1F48, 0x1F4D },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F5F },
+ { 0x1F68, 0x1F6F },
+ { 0x1FB8, 0x1FBB },
+ { 0x1FC8, 0x1FCB },
+ { 0x1FD8, 0x1FDB },
+ { 0x1FE8, 0x1FEC },
+ { 0x1FF8, 0x1FFB },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210B, 0x210D },
+ { 0x2110, 0x2112 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x212D },
+ { 0x2130, 0x2133 },
+ { 0x213E, 0x213F },
+ { 0x2145, 0x2145 },
+ { 0x2183, 0x2183 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C60, 0x2C60 },
+ { 0x2C62, 0x2C64 },
+ { 0x2C67, 0x2C67 },
+ { 0x2C69, 0x2C69 },
+ { 0x2C6B, 0x2C6B },
+ { 0x2C6D, 0x2C6F },
+ { 0x2C72, 0x2C72 },
+ { 0x2C75, 0x2C75 },
+ { 0x2C80, 0x2C80 },
+ { 0x2C82, 0x2C82 },
+ { 0x2C84, 0x2C84 },
+ { 0x2C86, 0x2C86 },
+ { 0x2C88, 0x2C88 },
+ { 0x2C8A, 0x2C8A },
+ { 0x2C8C, 0x2C8C },
+ { 0x2C8E, 0x2C8E },
+ { 0x2C90, 0x2C90 },
+ { 0x2C92, 0x2C92 },
+ { 0x2C94, 0x2C94 },
+ { 0x2C96, 0x2C96 },
+ { 0x2C98, 0x2C98 },
+ { 0x2C9A, 0x2C9A },
+ { 0x2C9C, 0x2C9C },
+ { 0x2C9E, 0x2C9E },
+ { 0x2CA0, 0x2CA0 },
+ { 0x2CA2, 0x2CA2 },
+ { 0x2CA4, 0x2CA4 },
+ { 0x2CA6, 0x2CA6 },
+ { 0x2CA8, 0x2CA8 },
+ { 0x2CAA, 0x2CAA },
+ { 0x2CAC, 0x2CAC },
+ { 0x2CAE, 0x2CAE },
+ { 0x2CB0, 0x2CB0 },
+ { 0x2CB2, 0x2CB2 },
+ { 0x2CB4, 0x2CB4 },
+ { 0x2CB6, 0x2CB6 },
+ { 0x2CB8, 0x2CB8 },
+ { 0x2CBA, 0x2CBA },
+ { 0x2CBC, 0x2CBC },
+ { 0x2CBE, 0x2CBE },
+ { 0x2CC0, 0x2CC0 },
+ { 0x2CC2, 0x2CC2 },
+ { 0x2CC4, 0x2CC4 },
+ { 0x2CC6, 0x2CC6 },
+ { 0x2CC8, 0x2CC8 },
+ { 0x2CCA, 0x2CCA },
+ { 0x2CCC, 0x2CCC },
+ { 0x2CCE, 0x2CCE },
+ { 0x2CD0, 0x2CD0 },
+ { 0x2CD2, 0x2CD2 },
+ { 0x2CD4, 0x2CD4 },
+ { 0x2CD6, 0x2CD6 },
+ { 0x2CD8, 0x2CD8 },
+ { 0x2CDA, 0x2CDA },
+ { 0x2CDC, 0x2CDC },
+ { 0x2CDE, 0x2CDE },
+ { 0x2CE0, 0x2CE0 },
+ { 0x2CE2, 0x2CE2 },
+ { 0xA640, 0xA640 },
+ { 0xA642, 0xA642 },
+ { 0xA644, 0xA644 },
+ { 0xA646, 0xA646 },
+ { 0xA648, 0xA648 },
+ { 0xA64A, 0xA64A },
+ { 0xA64C, 0xA64C },
+ { 0xA64E, 0xA64E },
+ { 0xA650, 0xA650 },
+ { 0xA652, 0xA652 },
+ { 0xA654, 0xA654 },
+ { 0xA656, 0xA656 },
+ { 0xA658, 0xA658 },
+ { 0xA65A, 0xA65A },
+ { 0xA65C, 0xA65C },
+ { 0xA65E, 0xA65E },
+ { 0xA662, 0xA662 },
+ { 0xA664, 0xA664 },
+ { 0xA666, 0xA666 },
+ { 0xA668, 0xA668 },
+ { 0xA66A, 0xA66A },
+ { 0xA66C, 0xA66C },
+ { 0xA680, 0xA680 },
+ { 0xA682, 0xA682 },
+ { 0xA684, 0xA684 },
+ { 0xA686, 0xA686 },
+ { 0xA688, 0xA688 },
+ { 0xA68A, 0xA68A },
+ { 0xA68C, 0xA68C },
+ { 0xA68E, 0xA68E },
+ { 0xA690, 0xA690 },
+ { 0xA692, 0xA692 },
+ { 0xA694, 0xA694 },
+ { 0xA696, 0xA696 },
+ { 0xA722, 0xA722 },
+ { 0xA724, 0xA724 },
+ { 0xA726, 0xA726 },
+ { 0xA728, 0xA728 },
+ { 0xA72A, 0xA72A },
+ { 0xA72C, 0xA72C },
+ { 0xA72E, 0xA72E },
+ { 0xA732, 0xA732 },
+ { 0xA734, 0xA734 },
+ { 0xA736, 0xA736 },
+ { 0xA738, 0xA738 },
+ { 0xA73A, 0xA73A },
+ { 0xA73C, 0xA73C },
+ { 0xA73E, 0xA73E },
+ { 0xA740, 0xA740 },
+ { 0xA742, 0xA742 },
+ { 0xA744, 0xA744 },
+ { 0xA746, 0xA746 },
+ { 0xA748, 0xA748 },
+ { 0xA74A, 0xA74A },
+ { 0xA74C, 0xA74C },
+ { 0xA74E, 0xA74E },
+ { 0xA750, 0xA750 },
+ { 0xA752, 0xA752 },
+ { 0xA754, 0xA754 },
+ { 0xA756, 0xA756 },
+ { 0xA758, 0xA758 },
+ { 0xA75A, 0xA75A },
+ { 0xA75C, 0xA75C },
+ { 0xA75E, 0xA75E },
+ { 0xA760, 0xA760 },
+ { 0xA762, 0xA762 },
+ { 0xA764, 0xA764 },
+ { 0xA766, 0xA766 },
+ { 0xA768, 0xA768 },
+ { 0xA76A, 0xA76A },
+ { 0xA76C, 0xA76C },
+ { 0xA76E, 0xA76E },
+ { 0xA779, 0xA779 },
+ { 0xA77B, 0xA77B },
+ { 0xA77D, 0xA77E },
+ { 0xA780, 0xA780 },
+ { 0xA782, 0xA782 },
+ { 0xA784, 0xA784 },
+ { 0xA786, 0xA786 },
+ { 0xA78B, 0xA78B },
+ { 0xFF21, 0xFF3A },
+ { 0x10400, 0x10427 },
+ { 0x1D400, 0x1D419 },
+ { 0x1D434, 0x1D44D },
+ { 0x1D468, 0x1D481 },
+ { 0x1D49C, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B5 },
+ { 0x1D4D0, 0x1D4E9 },
+ { 0x1D504, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D538, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D56C, 0x1D585 },
+ { 0x1D5A0, 0x1D5B9 },
+ { 0x1D5D4, 0x1D5ED },
+ { 0x1D608, 0x1D621 },
+ { 0x1D63C, 0x1D655 },
+ { 0x1D670, 0x1D689 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6E2, 0x1D6FA },
+ { 0x1D71C, 0x1D734 },
+ { 0x1D756, 0x1D76E },
+ { 0x1D790, 0x1D7A8 },
+ { 0x1D7CA, 0x1D7CA }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Lu)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_M.c b/gnulib/tests/unictype/test-categ_M.c
new file mode 100644
index 00000000..c6138d6e
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_M.c
@@ -0,0 +1,183 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0300, 0x036F },
+ { 0x0483, 0x0489 },
+ { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x0610, 0x061A },
+ { 0x064B, 0x065E },
+ { 0x0670, 0x0670 },
+ { 0x06D6, 0x06DC },
+ { 0x06DE, 0x06E4 },
+ { 0x06E7, 0x06E8 },
+ { 0x06EA, 0x06ED },
+ { 0x0711, 0x0711 },
+ { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 },
+ { 0x07EB, 0x07F3 },
+ { 0x0901, 0x0903 },
+ { 0x093C, 0x093C },
+ { 0x093E, 0x094D },
+ { 0x0951, 0x0954 },
+ { 0x0962, 0x0963 },
+ { 0x0981, 0x0983 },
+ { 0x09BC, 0x09BC },
+ { 0x09BE, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CD },
+ { 0x09D7, 0x09D7 },
+ { 0x09E2, 0x09E3 },
+ { 0x0A01, 0x0A03 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0ABC, 0x0ABC },
+ { 0x0ABE, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACD },
+ { 0x0AE2, 0x0AE3 },
+ { 0x0B01, 0x0B03 },
+ { 0x0B3C, 0x0B3C },
+ { 0x0B3E, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4D },
+ { 0x0B56, 0x0B57 },
+ { 0x0B62, 0x0B63 },
+ { 0x0B82, 0x0B82 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCD },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0C01, 0x0C03 },
+ { 0x0C3E, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C62, 0x0C63 },
+ { 0x0C82, 0x0C83 },
+ { 0x0CBC, 0x0CBC },
+ { 0x0CBE, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCD },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CE2, 0x0CE3 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D3E, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4D },
+ { 0x0D57, 0x0D57 },
+ { 0x0D62, 0x0D63 },
+ { 0x0D82, 0x0D83 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF3 },
+ { 0x0E31, 0x0E31 },
+ { 0x0E34, 0x0E3A },
+ { 0x0E47, 0x0E4E },
+ { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 },
+ { 0x0EBB, 0x0EBC },
+ { 0x0EC8, 0x0ECD },
+ { 0x0F18, 0x0F19 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F3E, 0x0F3F },
+ { 0x0F71, 0x0F84 },
+ { 0x0F86, 0x0F87 },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 },
+ { 0x102B, 0x103E },
+ { 0x1056, 0x1059 },
+ { 0x105E, 0x1060 },
+ { 0x1062, 0x1064 },
+ { 0x1067, 0x106D },
+ { 0x1071, 0x1074 },
+ { 0x1082, 0x108D },
+ { 0x108F, 0x108F },
+ { 0x135F, 0x135F },
+ { 0x1712, 0x1714 },
+ { 0x1732, 0x1734 },
+ { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 },
+ { 0x17B6, 0x17D3 },
+ { 0x17DD, 0x17DD },
+ { 0x180B, 0x180D },
+ { 0x18A9, 0x18A9 },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x193B },
+ { 0x19B0, 0x19C0 },
+ { 0x19C8, 0x19C9 },
+ { 0x1A17, 0x1A1B },
+ { 0x1B00, 0x1B04 },
+ { 0x1B34, 0x1B44 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1B80, 0x1B82 },
+ { 0x1BA1, 0x1BAA },
+ { 0x1C24, 0x1C37 },
+ { 0x1DC0, 0x1DE6 },
+ { 0x1DFE, 0x1DFF },
+ { 0x20D0, 0x20F0 },
+ { 0x2DE0, 0x2DFF },
+ { 0x302A, 0x302F },
+ { 0x3099, 0x309A },
+ { 0xA66F, 0xA672 },
+ { 0xA67C, 0xA67D },
+ { 0xA802, 0xA802 },
+ { 0xA806, 0xA806 },
+ { 0xA80B, 0xA80B },
+ { 0xA823, 0xA827 },
+ { 0xA880, 0xA881 },
+ { 0xA8B4, 0xA8C4 },
+ { 0xA926, 0xA92D },
+ { 0xA947, 0xA953 },
+ { 0xAA29, 0xAA36 },
+ { 0xAA43, 0xAA43 },
+ { 0xAA4C, 0xAA4D },
+ { 0xFB1E, 0xFB1E },
+ { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE26 },
+ { 0x101FD, 0x101FD },
+ { 0x10A01, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A3F },
+ { 0x1D165, 0x1D169 },
+ { 0x1D16D, 0x1D172 },
+ { 0x1D17B, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_M)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Mc.c b/gnulib/tests/unictype/test-categ_Mc.c
new file mode 100644
index 00000000..4984b4b9
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Mc.c
@@ -0,0 +1,107 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0903, 0x0903 },
+ { 0x093E, 0x0940 },
+ { 0x0949, 0x094C },
+ { 0x0982, 0x0983 },
+ { 0x09BE, 0x09C0 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CC },
+ { 0x09D7, 0x09D7 },
+ { 0x0A03, 0x0A03 },
+ { 0x0A3E, 0x0A40 },
+ { 0x0A83, 0x0A83 },
+ { 0x0ABE, 0x0AC0 },
+ { 0x0AC9, 0x0AC9 },
+ { 0x0ACB, 0x0ACC },
+ { 0x0B02, 0x0B03 },
+ { 0x0B3E, 0x0B3E },
+ { 0x0B40, 0x0B40 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4C },
+ { 0x0B57, 0x0B57 },
+ { 0x0BBE, 0x0BBF },
+ { 0x0BC1, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCC },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0C01, 0x0C03 },
+ { 0x0C41, 0x0C44 },
+ { 0x0C82, 0x0C83 },
+ { 0x0CBE, 0x0CBE },
+ { 0x0CC0, 0x0CC4 },
+ { 0x0CC7, 0x0CC8 },
+ { 0x0CCA, 0x0CCB },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D3E, 0x0D40 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4C },
+ { 0x0D57, 0x0D57 },
+ { 0x0D82, 0x0D83 },
+ { 0x0DCF, 0x0DD1 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF3 },
+ { 0x0F3E, 0x0F3F },
+ { 0x0F7F, 0x0F7F },
+ { 0x102B, 0x102C },
+ { 0x1031, 0x1031 },
+ { 0x1038, 0x1038 },
+ { 0x103B, 0x103C },
+ { 0x1056, 0x1057 },
+ { 0x1062, 0x1064 },
+ { 0x1067, 0x106D },
+ { 0x1083, 0x1084 },
+ { 0x1087, 0x108C },
+ { 0x108F, 0x108F },
+ { 0x17B6, 0x17B6 },
+ { 0x17BE, 0x17C5 },
+ { 0x17C7, 0x17C8 },
+ { 0x1923, 0x1926 },
+ { 0x1929, 0x192B },
+ { 0x1930, 0x1931 },
+ { 0x1933, 0x1938 },
+ { 0x19B0, 0x19C0 },
+ { 0x19C8, 0x19C9 },
+ { 0x1A19, 0x1A1B },
+ { 0x1B04, 0x1B04 },
+ { 0x1B35, 0x1B35 },
+ { 0x1B3B, 0x1B3B },
+ { 0x1B3D, 0x1B41 },
+ { 0x1B43, 0x1B44 },
+ { 0x1B82, 0x1B82 },
+ { 0x1BA1, 0x1BA1 },
+ { 0x1BA6, 0x1BA7 },
+ { 0x1BAA, 0x1BAA },
+ { 0x1C24, 0x1C2B },
+ { 0x1C34, 0x1C35 },
+ { 0xA823, 0xA824 },
+ { 0xA827, 0xA827 },
+ { 0xA880, 0xA881 },
+ { 0xA8B4, 0xA8C3 },
+ { 0xA952, 0xA953 },
+ { 0xAA2F, 0xAA30 },
+ { 0xAA33, 0xAA34 },
+ { 0xAA4D, 0xAA4D },
+ { 0x1D165, 0x1D166 },
+ { 0x1D16D, 0x1D172 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Mc)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Me.c b/gnulib/tests/unictype/test-categ_Me.c
new file mode 100644
index 00000000..f8aa3855
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Me.c
@@ -0,0 +1,27 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0488, 0x0489 },
+ { 0x06DE, 0x06DE },
+ { 0x20DD, 0x20E0 },
+ { 0x20E2, 0x20E4 },
+ { 0xA670, 0xA672 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Me)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Mn.c b/gnulib/tests/unictype/test-categ_Mn.c
new file mode 100644
index 00000000..a29b6e5c
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Mn.c
@@ -0,0 +1,182 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0300, 0x036F },
+ { 0x0483, 0x0487 },
+ { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x0610, 0x061A },
+ { 0x064B, 0x065E },
+ { 0x0670, 0x0670 },
+ { 0x06D6, 0x06DC },
+ { 0x06DF, 0x06E4 },
+ { 0x06E7, 0x06E8 },
+ { 0x06EA, 0x06ED },
+ { 0x0711, 0x0711 },
+ { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 },
+ { 0x07EB, 0x07F3 },
+ { 0x0901, 0x0902 },
+ { 0x093C, 0x093C },
+ { 0x0941, 0x0948 },
+ { 0x094D, 0x094D },
+ { 0x0951, 0x0954 },
+ { 0x0962, 0x0963 },
+ { 0x0981, 0x0981 },
+ { 0x09BC, 0x09BC },
+ { 0x09C1, 0x09C4 },
+ { 0x09CD, 0x09CD },
+ { 0x09E2, 0x09E3 },
+ { 0x0A01, 0x0A02 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A41, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 },
+ { 0x0A81, 0x0A82 },
+ { 0x0ABC, 0x0ABC },
+ { 0x0AC1, 0x0AC5 },
+ { 0x0AC7, 0x0AC8 },
+ { 0x0ACD, 0x0ACD },
+ { 0x0AE2, 0x0AE3 },
+ { 0x0B01, 0x0B01 },
+ { 0x0B3C, 0x0B3C },
+ { 0x0B3F, 0x0B3F },
+ { 0x0B41, 0x0B44 },
+ { 0x0B4D, 0x0B4D },
+ { 0x0B56, 0x0B56 },
+ { 0x0B62, 0x0B63 },
+ { 0x0B82, 0x0B82 },
+ { 0x0BC0, 0x0BC0 },
+ { 0x0BCD, 0x0BCD },
+ { 0x0C3E, 0x0C40 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C62, 0x0C63 },
+ { 0x0CBC, 0x0CBC },
+ { 0x0CBF, 0x0CBF },
+ { 0x0CC6, 0x0CC6 },
+ { 0x0CCC, 0x0CCD },
+ { 0x0CE2, 0x0CE3 },
+ { 0x0D41, 0x0D44 },
+ { 0x0D4D, 0x0D4D },
+ { 0x0D62, 0x0D63 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DD2, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0E31, 0x0E31 },
+ { 0x0E34, 0x0E3A },
+ { 0x0E47, 0x0E4E },
+ { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 },
+ { 0x0EBB, 0x0EBC },
+ { 0x0EC8, 0x0ECD },
+ { 0x0F18, 0x0F19 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F71, 0x0F7E },
+ { 0x0F80, 0x0F84 },
+ { 0x0F86, 0x0F87 },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 },
+ { 0x102D, 0x1030 },
+ { 0x1032, 0x1037 },
+ { 0x1039, 0x103A },
+ { 0x103D, 0x103E },
+ { 0x1058, 0x1059 },
+ { 0x105E, 0x1060 },
+ { 0x1071, 0x1074 },
+ { 0x1082, 0x1082 },
+ { 0x1085, 0x1086 },
+ { 0x108D, 0x108D },
+ { 0x135F, 0x135F },
+ { 0x1712, 0x1714 },
+ { 0x1732, 0x1734 },
+ { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 },
+ { 0x17B7, 0x17BD },
+ { 0x17C6, 0x17C6 },
+ { 0x17C9, 0x17D3 },
+ { 0x17DD, 0x17DD },
+ { 0x180B, 0x180D },
+ { 0x18A9, 0x18A9 },
+ { 0x1920, 0x1922 },
+ { 0x1927, 0x1928 },
+ { 0x1932, 0x1932 },
+ { 0x1939, 0x193B },
+ { 0x1A17, 0x1A18 },
+ { 0x1B00, 0x1B03 },
+ { 0x1B34, 0x1B34 },
+ { 0x1B36, 0x1B3A },
+ { 0x1B3C, 0x1B3C },
+ { 0x1B42, 0x1B42 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1B80, 0x1B81 },
+ { 0x1BA2, 0x1BA5 },
+ { 0x1BA8, 0x1BA9 },
+ { 0x1C2C, 0x1C33 },
+ { 0x1C36, 0x1C37 },
+ { 0x1DC0, 0x1DE6 },
+ { 0x1DFE, 0x1DFF },
+ { 0x20D0, 0x20DC },
+ { 0x20E1, 0x20E1 },
+ { 0x20E5, 0x20F0 },
+ { 0x2DE0, 0x2DFF },
+ { 0x302A, 0x302F },
+ { 0x3099, 0x309A },
+ { 0xA66F, 0xA66F },
+ { 0xA67C, 0xA67D },
+ { 0xA802, 0xA802 },
+ { 0xA806, 0xA806 },
+ { 0xA80B, 0xA80B },
+ { 0xA825, 0xA826 },
+ { 0xA8C4, 0xA8C4 },
+ { 0xA926, 0xA92D },
+ { 0xA947, 0xA951 },
+ { 0xAA29, 0xAA2E },
+ { 0xAA31, 0xAA32 },
+ { 0xAA35, 0xAA36 },
+ { 0xAA43, 0xAA43 },
+ { 0xAA4C, 0xAA4C },
+ { 0xFB1E, 0xFB1E },
+ { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE26 },
+ { 0x101FD, 0x101FD },
+ { 0x10A01, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A3F },
+ { 0x1D167, 0x1D169 },
+ { 0x1D17B, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Mn)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_N.c b/gnulib/tests/unictype/test-categ_N.c
new file mode 100644
index 00000000..219b6c77
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_N.c
@@ -0,0 +1,91 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x00B2, 0x00B3 },
+ { 0x00B9, 0x00B9 },
+ { 0x00BC, 0x00BE },
+ { 0x0660, 0x0669 },
+ { 0x06F0, 0x06F9 },
+ { 0x07C0, 0x07C9 },
+ { 0x0966, 0x096F },
+ { 0x09E6, 0x09EF },
+ { 0x09F4, 0x09F9 },
+ { 0x0A66, 0x0A6F },
+ { 0x0AE6, 0x0AEF },
+ { 0x0B66, 0x0B6F },
+ { 0x0BE6, 0x0BF2 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C78, 0x0C7E },
+ { 0x0CE6, 0x0CEF },
+ { 0x0D66, 0x0D75 },
+ { 0x0E50, 0x0E59 },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0F20, 0x0F33 },
+ { 0x1040, 0x1049 },
+ { 0x1090, 0x1099 },
+ { 0x1369, 0x137C },
+ { 0x16EE, 0x16F0 },
+ { 0x17E0, 0x17E9 },
+ { 0x17F0, 0x17F9 },
+ { 0x1810, 0x1819 },
+ { 0x1946, 0x194F },
+ { 0x19D0, 0x19D9 },
+ { 0x1B50, 0x1B59 },
+ { 0x1BB0, 0x1BB9 },
+ { 0x1C40, 0x1C49 },
+ { 0x1C50, 0x1C59 },
+ { 0x2070, 0x2070 },
+ { 0x2074, 0x2079 },
+ { 0x2080, 0x2089 },
+ { 0x2153, 0x2182 },
+ { 0x2185, 0x2188 },
+ { 0x2460, 0x249B },
+ { 0x24EA, 0x24FF },
+ { 0x2776, 0x2793 },
+ { 0x2CFD, 0x2CFD },
+ { 0x3007, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3038, 0x303A },
+ { 0x3192, 0x3195 },
+ { 0x3220, 0x3229 },
+ { 0x3251, 0x325F },
+ { 0x3280, 0x3289 },
+ { 0x32B1, 0x32BF },
+ { 0xA620, 0xA629 },
+ { 0xA8D0, 0xA8D9 },
+ { 0xA900, 0xA909 },
+ { 0xAA50, 0xAA59 },
+ { 0xFF10, 0xFF19 },
+ { 0x10107, 0x10133 },
+ { 0x10140, 0x10178 },
+ { 0x1018A, 0x1018A },
+ { 0x10320, 0x10323 },
+ { 0x10341, 0x10341 },
+ { 0x1034A, 0x1034A },
+ { 0x103D1, 0x103D5 },
+ { 0x104A0, 0x104A9 },
+ { 0x10916, 0x10919 },
+ { 0x10A40, 0x10A47 },
+ { 0x12400, 0x12462 },
+ { 0x1D360, 0x1D371 },
+ { 0x1D7CE, 0x1D7FF }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_N)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Nd.c b/gnulib/tests/unictype/test-categ_Nd.c
new file mode 100644
index 00000000..a6170aef
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Nd.c
@@ -0,0 +1,55 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x0660, 0x0669 },
+ { 0x06F0, 0x06F9 },
+ { 0x07C0, 0x07C9 },
+ { 0x0966, 0x096F },
+ { 0x09E6, 0x09EF },
+ { 0x0A66, 0x0A6F },
+ { 0x0AE6, 0x0AEF },
+ { 0x0B66, 0x0B6F },
+ { 0x0BE6, 0x0BEF },
+ { 0x0C66, 0x0C6F },
+ { 0x0CE6, 0x0CEF },
+ { 0x0D66, 0x0D6F },
+ { 0x0E50, 0x0E59 },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0F20, 0x0F29 },
+ { 0x1040, 0x1049 },
+ { 0x1090, 0x1099 },
+ { 0x17E0, 0x17E9 },
+ { 0x1810, 0x1819 },
+ { 0x1946, 0x194F },
+ { 0x19D0, 0x19D9 },
+ { 0x1B50, 0x1B59 },
+ { 0x1BB0, 0x1BB9 },
+ { 0x1C40, 0x1C49 },
+ { 0x1C50, 0x1C59 },
+ { 0xA620, 0xA629 },
+ { 0xA8D0, 0xA8D9 },
+ { 0xA900, 0xA909 },
+ { 0xAA50, 0xAA59 },
+ { 0xFF10, 0xFF19 },
+ { 0x104A0, 0x104A9 },
+ { 0x1D7CE, 0x1D7FF }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Nd)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Nl.c b/gnulib/tests/unictype/test-categ_Nl.c
new file mode 100644
index 00000000..0a3207f6
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Nl.c
@@ -0,0 +1,33 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x16EE, 0x16F0 },
+ { 0x2160, 0x2182 },
+ { 0x2185, 0x2188 },
+ { 0x3007, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3038, 0x303A },
+ { 0x10140, 0x10174 },
+ { 0x10341, 0x10341 },
+ { 0x1034A, 0x1034A },
+ { 0x103D1, 0x103D5 },
+ { 0x12400, 0x12462 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Nl)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_No.c b/gnulib/tests/unictype/test-categ_No.c
new file mode 100644
index 00000000..d800a592
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_No.c
@@ -0,0 +1,52 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00B2, 0x00B3 },
+ { 0x00B9, 0x00B9 },
+ { 0x00BC, 0x00BE },
+ { 0x09F4, 0x09F9 },
+ { 0x0BF0, 0x0BF2 },
+ { 0x0C78, 0x0C7E },
+ { 0x0D70, 0x0D75 },
+ { 0x0F2A, 0x0F33 },
+ { 0x1369, 0x137C },
+ { 0x17F0, 0x17F9 },
+ { 0x2070, 0x2070 },
+ { 0x2074, 0x2079 },
+ { 0x2080, 0x2089 },
+ { 0x2153, 0x215F },
+ { 0x2460, 0x249B },
+ { 0x24EA, 0x24FF },
+ { 0x2776, 0x2793 },
+ { 0x2CFD, 0x2CFD },
+ { 0x3192, 0x3195 },
+ { 0x3220, 0x3229 },
+ { 0x3251, 0x325F },
+ { 0x3280, 0x3289 },
+ { 0x32B1, 0x32BF },
+ { 0x10107, 0x10133 },
+ { 0x10175, 0x10178 },
+ { 0x1018A, 0x1018A },
+ { 0x10320, 0x10323 },
+ { 0x10916, 0x10919 },
+ { 0x10A40, 0x10A47 },
+ { 0x1D360, 0x1D371 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_No)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_P.c b/gnulib/tests/unictype/test-categ_P.c
new file mode 100644
index 00000000..38587b0e
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_P.c
@@ -0,0 +1,134 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x0023 },
+ { 0x0025, 0x002A },
+ { 0x002C, 0x002F },
+ { 0x003A, 0x003B },
+ { 0x003F, 0x0040 },
+ { 0x005B, 0x005D },
+ { 0x005F, 0x005F },
+ { 0x007B, 0x007B },
+ { 0x007D, 0x007D },
+ { 0x00A1, 0x00A1 },
+ { 0x00AB, 0x00AB },
+ { 0x00B7, 0x00B7 },
+ { 0x00BB, 0x00BB },
+ { 0x00BF, 0x00BF },
+ { 0x037E, 0x037E },
+ { 0x0387, 0x0387 },
+ { 0x055A, 0x055F },
+ { 0x0589, 0x058A },
+ { 0x05BE, 0x05BE },
+ { 0x05C0, 0x05C0 },
+ { 0x05C3, 0x05C3 },
+ { 0x05C6, 0x05C6 },
+ { 0x05F3, 0x05F4 },
+ { 0x0609, 0x060A },
+ { 0x060C, 0x060D },
+ { 0x061B, 0x061B },
+ { 0x061E, 0x061F },
+ { 0x066A, 0x066D },
+ { 0x06D4, 0x06D4 },
+ { 0x0700, 0x070D },
+ { 0x07F7, 0x07F9 },
+ { 0x0964, 0x0965 },
+ { 0x0970, 0x0970 },
+ { 0x0DF4, 0x0DF4 },
+ { 0x0E4F, 0x0E4F },
+ { 0x0E5A, 0x0E5B },
+ { 0x0F04, 0x0F12 },
+ { 0x0F3A, 0x0F3D },
+ { 0x0F85, 0x0F85 },
+ { 0x0FD0, 0x0FD4 },
+ { 0x104A, 0x104F },
+ { 0x10FB, 0x10FB },
+ { 0x1361, 0x1368 },
+ { 0x166D, 0x166E },
+ { 0x169B, 0x169C },
+ { 0x16EB, 0x16ED },
+ { 0x1735, 0x1736 },
+ { 0x17D4, 0x17D6 },
+ { 0x17D8, 0x17DA },
+ { 0x1800, 0x180A },
+ { 0x1944, 0x1945 },
+ { 0x19DE, 0x19DF },
+ { 0x1A1E, 0x1A1F },
+ { 0x1B5A, 0x1B60 },
+ { 0x1C3B, 0x1C3F },
+ { 0x1C7E, 0x1C7F },
+ { 0x2010, 0x2027 },
+ { 0x2030, 0x2043 },
+ { 0x2045, 0x2051 },
+ { 0x2053, 0x205E },
+ { 0x207D, 0x207E },
+ { 0x208D, 0x208E },
+ { 0x2329, 0x232A },
+ { 0x2768, 0x2775 },
+ { 0x27C5, 0x27C6 },
+ { 0x27E6, 0x27EF },
+ { 0x2983, 0x2998 },
+ { 0x29D8, 0x29DB },
+ { 0x29FC, 0x29FD },
+ { 0x2CF9, 0x2CFC },
+ { 0x2CFE, 0x2CFF },
+ { 0x2E00, 0x2E2E },
+ { 0x2E30, 0x2E30 },
+ { 0x3001, 0x3003 },
+ { 0x3008, 0x3011 },
+ { 0x3014, 0x301F },
+ { 0x3030, 0x3030 },
+ { 0x303D, 0x303D },
+ { 0x30A0, 0x30A0 },
+ { 0x30FB, 0x30FB },
+ { 0xA60D, 0xA60F },
+ { 0xA673, 0xA673 },
+ { 0xA67E, 0xA67E },
+ { 0xA874, 0xA877 },
+ { 0xA8CE, 0xA8CF },
+ { 0xA92E, 0xA92F },
+ { 0xA95F, 0xA95F },
+ { 0xAA5C, 0xAA5F },
+ { 0xFD3E, 0xFD3F },
+ { 0xFE10, 0xFE19 },
+ { 0xFE30, 0xFE52 },
+ { 0xFE54, 0xFE61 },
+ { 0xFE63, 0xFE63 },
+ { 0xFE68, 0xFE68 },
+ { 0xFE6A, 0xFE6B },
+ { 0xFF01, 0xFF03 },
+ { 0xFF05, 0xFF0A },
+ { 0xFF0C, 0xFF0F },
+ { 0xFF1A, 0xFF1B },
+ { 0xFF1F, 0xFF20 },
+ { 0xFF3B, 0xFF3D },
+ { 0xFF3F, 0xFF3F },
+ { 0xFF5B, 0xFF5B },
+ { 0xFF5D, 0xFF5D },
+ { 0xFF5F, 0xFF65 },
+ { 0x10100, 0x10101 },
+ { 0x1039F, 0x1039F },
+ { 0x103D0, 0x103D0 },
+ { 0x1091F, 0x1091F },
+ { 0x1093F, 0x1093F },
+ { 0x10A50, 0x10A58 },
+ { 0x12470, 0x12473 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_P)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Pc.c b/gnulib/tests/unictype/test-categ_Pc.c
new file mode 100644
index 00000000..db291030
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Pc.c
@@ -0,0 +1,28 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x005F, 0x005F },
+ { 0x203F, 0x2040 },
+ { 0x2054, 0x2054 },
+ { 0xFE33, 0xFE34 },
+ { 0xFE4D, 0xFE4F },
+ { 0xFF3F, 0xFF3F }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Pc)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Pd.c b/gnulib/tests/unictype/test-categ_Pd.c
new file mode 100644
index 00000000..aae4aea3
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Pd.c
@@ -0,0 +1,36 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x002D, 0x002D },
+ { 0x058A, 0x058A },
+ { 0x05BE, 0x05BE },
+ { 0x1806, 0x1806 },
+ { 0x2010, 0x2015 },
+ { 0x2E17, 0x2E17 },
+ { 0x2E1A, 0x2E1A },
+ { 0x301C, 0x301C },
+ { 0x3030, 0x3030 },
+ { 0x30A0, 0x30A0 },
+ { 0xFE31, 0xFE32 },
+ { 0xFE58, 0xFE58 },
+ { 0xFE63, 0xFE63 },
+ { 0xFF0D, 0xFF0D }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Pd)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Pe.c b/gnulib/tests/unictype/test-categ_Pe.c
new file mode 100644
index 00000000..01c77ecf
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Pe.c
@@ -0,0 +1,92 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0029, 0x0029 },
+ { 0x005D, 0x005D },
+ { 0x007D, 0x007D },
+ { 0x0F3B, 0x0F3B },
+ { 0x0F3D, 0x0F3D },
+ { 0x169C, 0x169C },
+ { 0x2046, 0x2046 },
+ { 0x207E, 0x207E },
+ { 0x208E, 0x208E },
+ { 0x232A, 0x232A },
+ { 0x2769, 0x2769 },
+ { 0x276B, 0x276B },
+ { 0x276D, 0x276D },
+ { 0x276F, 0x276F },
+ { 0x2771, 0x2771 },
+ { 0x2773, 0x2773 },
+ { 0x2775, 0x2775 },
+ { 0x27C6, 0x27C6 },
+ { 0x27E7, 0x27E7 },
+ { 0x27E9, 0x27E9 },
+ { 0x27EB, 0x27EB },
+ { 0x27ED, 0x27ED },
+ { 0x27EF, 0x27EF },
+ { 0x2984, 0x2984 },
+ { 0x2986, 0x2986 },
+ { 0x2988, 0x2988 },
+ { 0x298A, 0x298A },
+ { 0x298C, 0x298C },
+ { 0x298E, 0x298E },
+ { 0x2990, 0x2990 },
+ { 0x2992, 0x2992 },
+ { 0x2994, 0x2994 },
+ { 0x2996, 0x2996 },
+ { 0x2998, 0x2998 },
+ { 0x29D9, 0x29D9 },
+ { 0x29DB, 0x29DB },
+ { 0x29FD, 0x29FD },
+ { 0x2E23, 0x2E23 },
+ { 0x2E25, 0x2E25 },
+ { 0x2E27, 0x2E27 },
+ { 0x2E29, 0x2E29 },
+ { 0x3009, 0x3009 },
+ { 0x300B, 0x300B },
+ { 0x300D, 0x300D },
+ { 0x300F, 0x300F },
+ { 0x3011, 0x3011 },
+ { 0x3015, 0x3015 },
+ { 0x3017, 0x3017 },
+ { 0x3019, 0x3019 },
+ { 0x301B, 0x301B },
+ { 0x301E, 0x301F },
+ { 0xFD3F, 0xFD3F },
+ { 0xFE18, 0xFE18 },
+ { 0xFE36, 0xFE36 },
+ { 0xFE38, 0xFE38 },
+ { 0xFE3A, 0xFE3A },
+ { 0xFE3C, 0xFE3C },
+ { 0xFE3E, 0xFE3E },
+ { 0xFE40, 0xFE40 },
+ { 0xFE42, 0xFE42 },
+ { 0xFE44, 0xFE44 },
+ { 0xFE48, 0xFE48 },
+ { 0xFE5A, 0xFE5A },
+ { 0xFE5C, 0xFE5C },
+ { 0xFE5E, 0xFE5E },
+ { 0xFF09, 0xFF09 },
+ { 0xFF3D, 0xFF3D },
+ { 0xFF5D, 0xFF5D },
+ { 0xFF60, 0xFF60 },
+ { 0xFF63, 0xFF63 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Pe)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Pf.c b/gnulib/tests/unictype/test-categ_Pf.c
new file mode 100644
index 00000000..b94173e1
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Pf.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00BB, 0x00BB },
+ { 0x2019, 0x2019 },
+ { 0x201D, 0x201D },
+ { 0x203A, 0x203A },
+ { 0x2E03, 0x2E03 },
+ { 0x2E05, 0x2E05 },
+ { 0x2E0A, 0x2E0A },
+ { 0x2E0D, 0x2E0D },
+ { 0x2E1D, 0x2E1D },
+ { 0x2E21, 0x2E21 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Pf)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Pi.c b/gnulib/tests/unictype/test-categ_Pi.c
new file mode 100644
index 00000000..2a9dcd4b
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Pi.c
@@ -0,0 +1,33 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00AB, 0x00AB },
+ { 0x2018, 0x2018 },
+ { 0x201B, 0x201C },
+ { 0x201F, 0x201F },
+ { 0x2039, 0x2039 },
+ { 0x2E02, 0x2E02 },
+ { 0x2E04, 0x2E04 },
+ { 0x2E09, 0x2E09 },
+ { 0x2E0C, 0x2E0C },
+ { 0x2E1C, 0x2E1C },
+ { 0x2E20, 0x2E20 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Pi)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Po.c b/gnulib/tests/unictype/test-categ_Po.c
new file mode 100644
index 00000000..e84ec765
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Po.c
@@ -0,0 +1,130 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x0023 },
+ { 0x0025, 0x0027 },
+ { 0x002A, 0x002A },
+ { 0x002C, 0x002C },
+ { 0x002E, 0x002F },
+ { 0x003A, 0x003B },
+ { 0x003F, 0x0040 },
+ { 0x005C, 0x005C },
+ { 0x00A1, 0x00A1 },
+ { 0x00B7, 0x00B7 },
+ { 0x00BF, 0x00BF },
+ { 0x037E, 0x037E },
+ { 0x0387, 0x0387 },
+ { 0x055A, 0x055F },
+ { 0x0589, 0x0589 },
+ { 0x05C0, 0x05C0 },
+ { 0x05C3, 0x05C3 },
+ { 0x05C6, 0x05C6 },
+ { 0x05F3, 0x05F4 },
+ { 0x0609, 0x060A },
+ { 0x060C, 0x060D },
+ { 0x061B, 0x061B },
+ { 0x061E, 0x061F },
+ { 0x066A, 0x066D },
+ { 0x06D4, 0x06D4 },
+ { 0x0700, 0x070D },
+ { 0x07F7, 0x07F9 },
+ { 0x0964, 0x0965 },
+ { 0x0970, 0x0970 },
+ { 0x0DF4, 0x0DF4 },
+ { 0x0E4F, 0x0E4F },
+ { 0x0E5A, 0x0E5B },
+ { 0x0F04, 0x0F12 },
+ { 0x0F85, 0x0F85 },
+ { 0x0FD0, 0x0FD4 },
+ { 0x104A, 0x104F },
+ { 0x10FB, 0x10FB },
+ { 0x1361, 0x1368 },
+ { 0x166D, 0x166E },
+ { 0x16EB, 0x16ED },
+ { 0x1735, 0x1736 },
+ { 0x17D4, 0x17D6 },
+ { 0x17D8, 0x17DA },
+ { 0x1800, 0x1805 },
+ { 0x1807, 0x180A },
+ { 0x1944, 0x1945 },
+ { 0x19DE, 0x19DF },
+ { 0x1A1E, 0x1A1F },
+ { 0x1B5A, 0x1B60 },
+ { 0x1C3B, 0x1C3F },
+ { 0x1C7E, 0x1C7F },
+ { 0x2016, 0x2017 },
+ { 0x2020, 0x2027 },
+ { 0x2030, 0x2038 },
+ { 0x203B, 0x203E },
+ { 0x2041, 0x2043 },
+ { 0x2047, 0x2051 },
+ { 0x2053, 0x2053 },
+ { 0x2055, 0x205E },
+ { 0x2CF9, 0x2CFC },
+ { 0x2CFE, 0x2CFF },
+ { 0x2E00, 0x2E01 },
+ { 0x2E06, 0x2E08 },
+ { 0x2E0B, 0x2E0B },
+ { 0x2E0E, 0x2E16 },
+ { 0x2E18, 0x2E19 },
+ { 0x2E1B, 0x2E1B },
+ { 0x2E1E, 0x2E1F },
+ { 0x2E2A, 0x2E2E },
+ { 0x2E30, 0x2E30 },
+ { 0x3001, 0x3003 },
+ { 0x303D, 0x303D },
+ { 0x30FB, 0x30FB },
+ { 0xA60D, 0xA60F },
+ { 0xA673, 0xA673 },
+ { 0xA67E, 0xA67E },
+ { 0xA874, 0xA877 },
+ { 0xA8CE, 0xA8CF },
+ { 0xA92E, 0xA92F },
+ { 0xA95F, 0xA95F },
+ { 0xAA5C, 0xAA5F },
+ { 0xFE10, 0xFE16 },
+ { 0xFE19, 0xFE19 },
+ { 0xFE30, 0xFE30 },
+ { 0xFE45, 0xFE46 },
+ { 0xFE49, 0xFE4C },
+ { 0xFE50, 0xFE52 },
+ { 0xFE54, 0xFE57 },
+ { 0xFE5F, 0xFE61 },
+ { 0xFE68, 0xFE68 },
+ { 0xFE6A, 0xFE6B },
+ { 0xFF01, 0xFF03 },
+ { 0xFF05, 0xFF07 },
+ { 0xFF0A, 0xFF0A },
+ { 0xFF0C, 0xFF0C },
+ { 0xFF0E, 0xFF0F },
+ { 0xFF1A, 0xFF1B },
+ { 0xFF1F, 0xFF20 },
+ { 0xFF3C, 0xFF3C },
+ { 0xFF61, 0xFF61 },
+ { 0xFF64, 0xFF65 },
+ { 0x10100, 0x10101 },
+ { 0x1039F, 0x1039F },
+ { 0x103D0, 0x103D0 },
+ { 0x1091F, 0x1091F },
+ { 0x1093F, 0x1093F },
+ { 0x10A50, 0x10A58 },
+ { 0x12470, 0x12473 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Po)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Ps.c b/gnulib/tests/unictype/test-categ_Ps.c
new file mode 100644
index 00000000..7e3be746
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Ps.c
@@ -0,0 +1,94 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0028, 0x0028 },
+ { 0x005B, 0x005B },
+ { 0x007B, 0x007B },
+ { 0x0F3A, 0x0F3A },
+ { 0x0F3C, 0x0F3C },
+ { 0x169B, 0x169B },
+ { 0x201A, 0x201A },
+ { 0x201E, 0x201E },
+ { 0x2045, 0x2045 },
+ { 0x207D, 0x207D },
+ { 0x208D, 0x208D },
+ { 0x2329, 0x2329 },
+ { 0x2768, 0x2768 },
+ { 0x276A, 0x276A },
+ { 0x276C, 0x276C },
+ { 0x276E, 0x276E },
+ { 0x2770, 0x2770 },
+ { 0x2772, 0x2772 },
+ { 0x2774, 0x2774 },
+ { 0x27C5, 0x27C5 },
+ { 0x27E6, 0x27E6 },
+ { 0x27E8, 0x27E8 },
+ { 0x27EA, 0x27EA },
+ { 0x27EC, 0x27EC },
+ { 0x27EE, 0x27EE },
+ { 0x2983, 0x2983 },
+ { 0x2985, 0x2985 },
+ { 0x2987, 0x2987 },
+ { 0x2989, 0x2989 },
+ { 0x298B, 0x298B },
+ { 0x298D, 0x298D },
+ { 0x298F, 0x298F },
+ { 0x2991, 0x2991 },
+ { 0x2993, 0x2993 },
+ { 0x2995, 0x2995 },
+ { 0x2997, 0x2997 },
+ { 0x29D8, 0x29D8 },
+ { 0x29DA, 0x29DA },
+ { 0x29FC, 0x29FC },
+ { 0x2E22, 0x2E22 },
+ { 0x2E24, 0x2E24 },
+ { 0x2E26, 0x2E26 },
+ { 0x2E28, 0x2E28 },
+ { 0x3008, 0x3008 },
+ { 0x300A, 0x300A },
+ { 0x300C, 0x300C },
+ { 0x300E, 0x300E },
+ { 0x3010, 0x3010 },
+ { 0x3014, 0x3014 },
+ { 0x3016, 0x3016 },
+ { 0x3018, 0x3018 },
+ { 0x301A, 0x301A },
+ { 0x301D, 0x301D },
+ { 0xFD3E, 0xFD3E },
+ { 0xFE17, 0xFE17 },
+ { 0xFE35, 0xFE35 },
+ { 0xFE37, 0xFE37 },
+ { 0xFE39, 0xFE39 },
+ { 0xFE3B, 0xFE3B },
+ { 0xFE3D, 0xFE3D },
+ { 0xFE3F, 0xFE3F },
+ { 0xFE41, 0xFE41 },
+ { 0xFE43, 0xFE43 },
+ { 0xFE47, 0xFE47 },
+ { 0xFE59, 0xFE59 },
+ { 0xFE5B, 0xFE5B },
+ { 0xFE5D, 0xFE5D },
+ { 0xFF08, 0xFF08 },
+ { 0xFF3B, 0xFF3B },
+ { 0xFF5B, 0xFF5B },
+ { 0xFF5F, 0xFF5F },
+ { 0xFF62, 0xFF62 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Ps)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_S.c b/gnulib/tests/unictype/test-categ_S.c
new file mode 100644
index 00000000..6f6cdd58
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_S.c
@@ -0,0 +1,201 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0024, 0x0024 },
+ { 0x002B, 0x002B },
+ { 0x003C, 0x003E },
+ { 0x005E, 0x005E },
+ { 0x0060, 0x0060 },
+ { 0x007C, 0x007C },
+ { 0x007E, 0x007E },
+ { 0x00A2, 0x00A9 },
+ { 0x00AC, 0x00AC },
+ { 0x00AE, 0x00B1 },
+ { 0x00B4, 0x00B4 },
+ { 0x00B6, 0x00B6 },
+ { 0x00B8, 0x00B8 },
+ { 0x00D7, 0x00D7 },
+ { 0x00F7, 0x00F7 },
+ { 0x02C2, 0x02C5 },
+ { 0x02D2, 0x02DF },
+ { 0x02E5, 0x02EB },
+ { 0x02ED, 0x02ED },
+ { 0x02EF, 0x02FF },
+ { 0x0375, 0x0375 },
+ { 0x0384, 0x0385 },
+ { 0x03F6, 0x03F6 },
+ { 0x0482, 0x0482 },
+ { 0x0606, 0x0608 },
+ { 0x060B, 0x060B },
+ { 0x060E, 0x060F },
+ { 0x06E9, 0x06E9 },
+ { 0x06FD, 0x06FE },
+ { 0x07F6, 0x07F6 },
+ { 0x09F2, 0x09F3 },
+ { 0x09FA, 0x09FA },
+ { 0x0AF1, 0x0AF1 },
+ { 0x0B70, 0x0B70 },
+ { 0x0BF3, 0x0BFA },
+ { 0x0C7F, 0x0C7F },
+ { 0x0CF1, 0x0CF2 },
+ { 0x0D79, 0x0D79 },
+ { 0x0E3F, 0x0E3F },
+ { 0x0F01, 0x0F03 },
+ { 0x0F13, 0x0F17 },
+ { 0x0F1A, 0x0F1F },
+ { 0x0F34, 0x0F34 },
+ { 0x0F36, 0x0F36 },
+ { 0x0F38, 0x0F38 },
+ { 0x0FBE, 0x0FC5 },
+ { 0x0FC7, 0x0FCC },
+ { 0x0FCE, 0x0FCF },
+ { 0x109E, 0x109F },
+ { 0x1360, 0x1360 },
+ { 0x1390, 0x1399 },
+ { 0x17DB, 0x17DB },
+ { 0x1940, 0x1940 },
+ { 0x19E0, 0x19FF },
+ { 0x1B61, 0x1B6A },
+ { 0x1B74, 0x1B7C },
+ { 0x1FBD, 0x1FBD },
+ { 0x1FBF, 0x1FC1 },
+ { 0x1FCD, 0x1FCF },
+ { 0x1FDD, 0x1FDF },
+ { 0x1FED, 0x1FEF },
+ { 0x1FFD, 0x1FFE },
+ { 0x2044, 0x2044 },
+ { 0x2052, 0x2052 },
+ { 0x207A, 0x207C },
+ { 0x208A, 0x208C },
+ { 0x20A0, 0x20B5 },
+ { 0x2100, 0x2101 },
+ { 0x2103, 0x2106 },
+ { 0x2108, 0x2109 },
+ { 0x2114, 0x2114 },
+ { 0x2116, 0x2118 },
+ { 0x211E, 0x2123 },
+ { 0x2125, 0x2125 },
+ { 0x2127, 0x2127 },
+ { 0x2129, 0x2129 },
+ { 0x212E, 0x212E },
+ { 0x213A, 0x213B },
+ { 0x2140, 0x2144 },
+ { 0x214A, 0x214D },
+ { 0x214F, 0x214F },
+ { 0x2190, 0x2328 },
+ { 0x232B, 0x23E7 },
+ { 0x2400, 0x2426 },
+ { 0x2440, 0x244A },
+ { 0x249C, 0x24E9 },
+ { 0x2500, 0x269D },
+ { 0x26A0, 0x26BC },
+ { 0x26C0, 0x26C3 },
+ { 0x2701, 0x2704 },
+ { 0x2706, 0x2709 },
+ { 0x270C, 0x2727 },
+ { 0x2729, 0x274B },
+ { 0x274D, 0x274D },
+ { 0x274F, 0x2752 },
+ { 0x2756, 0x2756 },
+ { 0x2758, 0x275E },
+ { 0x2761, 0x2767 },
+ { 0x2794, 0x2794 },
+ { 0x2798, 0x27AF },
+ { 0x27B1, 0x27BE },
+ { 0x27C0, 0x27C4 },
+ { 0x27C7, 0x27CA },
+ { 0x27CC, 0x27CC },
+ { 0x27D0, 0x27E5 },
+ { 0x27F0, 0x2982 },
+ { 0x2999, 0x29D7 },
+ { 0x29DC, 0x29FB },
+ { 0x29FE, 0x2B4C },
+ { 0x2B50, 0x2B54 },
+ { 0x2CE5, 0x2CEA },
+ { 0x2E80, 0x2E99 },
+ { 0x2E9B, 0x2EF3 },
+ { 0x2F00, 0x2FD5 },
+ { 0x2FF0, 0x2FFB },
+ { 0x3004, 0x3004 },
+ { 0x3012, 0x3013 },
+ { 0x3020, 0x3020 },
+ { 0x3036, 0x3037 },
+ { 0x303E, 0x303F },
+ { 0x309B, 0x309C },
+ { 0x3190, 0x3191 },
+ { 0x3196, 0x319F },
+ { 0x31C0, 0x31E3 },
+ { 0x3200, 0x321E },
+ { 0x322A, 0x3243 },
+ { 0x3250, 0x3250 },
+ { 0x3260, 0x327F },
+ { 0x328A, 0x32B0 },
+ { 0x32C0, 0x32FE },
+ { 0x3300, 0x33FF },
+ { 0x4DC0, 0x4DFF },
+ { 0xA490, 0xA4C6 },
+ { 0xA700, 0xA716 },
+ { 0xA720, 0xA721 },
+ { 0xA789, 0xA78A },
+ { 0xA828, 0xA82B },
+ { 0xFB29, 0xFB29 },
+ { 0xFDFC, 0xFDFD },
+ { 0xFE62, 0xFE62 },
+ { 0xFE64, 0xFE66 },
+ { 0xFE69, 0xFE69 },
+ { 0xFF04, 0xFF04 },
+ { 0xFF0B, 0xFF0B },
+ { 0xFF1C, 0xFF1E },
+ { 0xFF3E, 0xFF3E },
+ { 0xFF40, 0xFF40 },
+ { 0xFF5C, 0xFF5C },
+ { 0xFF5E, 0xFF5E },
+ { 0xFFE0, 0xFFE6 },
+ { 0xFFE8, 0xFFEE },
+ { 0xFFFC, 0xFFFD },
+ { 0x10102, 0x10102 },
+ { 0x10137, 0x1013F },
+ { 0x10179, 0x10189 },
+ { 0x10190, 0x1019B },
+ { 0x101D0, 0x101FC },
+ { 0x1D000, 0x1D0F5 },
+ { 0x1D100, 0x1D126 },
+ { 0x1D129, 0x1D164 },
+ { 0x1D16A, 0x1D16C },
+ { 0x1D183, 0x1D184 },
+ { 0x1D18C, 0x1D1A9 },
+ { 0x1D1AE, 0x1D1DD },
+ { 0x1D200, 0x1D241 },
+ { 0x1D245, 0x1D245 },
+ { 0x1D300, 0x1D356 },
+ { 0x1D6C1, 0x1D6C1 },
+ { 0x1D6DB, 0x1D6DB },
+ { 0x1D6FB, 0x1D6FB },
+ { 0x1D715, 0x1D715 },
+ { 0x1D735, 0x1D735 },
+ { 0x1D74F, 0x1D74F },
+ { 0x1D76F, 0x1D76F },
+ { 0x1D789, 0x1D789 },
+ { 0x1D7A9, 0x1D7A9 },
+ { 0x1D7C3, 0x1D7C3 },
+ { 0x1F000, 0x1F02B },
+ { 0x1F030, 0x1F093 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_S)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Sc.c b/gnulib/tests/unictype/test-categ_Sc.c
new file mode 100644
index 00000000..8ec99a68
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Sc.c
@@ -0,0 +1,36 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0024, 0x0024 },
+ { 0x00A2, 0x00A5 },
+ { 0x060B, 0x060B },
+ { 0x09F2, 0x09F3 },
+ { 0x0AF1, 0x0AF1 },
+ { 0x0BF9, 0x0BF9 },
+ { 0x0E3F, 0x0E3F },
+ { 0x17DB, 0x17DB },
+ { 0x20A0, 0x20B5 },
+ { 0xFDFC, 0xFDFC },
+ { 0xFE69, 0xFE69 },
+ { 0xFF04, 0xFF04 },
+ { 0xFFE0, 0xFFE1 },
+ { 0xFFE5, 0xFFE6 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Sc)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Sk.c b/gnulib/tests/unictype/test-categ_Sk.c
new file mode 100644
index 00000000..b0961aab
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Sk.c
@@ -0,0 +1,48 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x005E, 0x005E },
+ { 0x0060, 0x0060 },
+ { 0x00A8, 0x00A8 },
+ { 0x00AF, 0x00AF },
+ { 0x00B4, 0x00B4 },
+ { 0x00B8, 0x00B8 },
+ { 0x02C2, 0x02C5 },
+ { 0x02D2, 0x02DF },
+ { 0x02E5, 0x02EB },
+ { 0x02ED, 0x02ED },
+ { 0x02EF, 0x02FF },
+ { 0x0375, 0x0375 },
+ { 0x0384, 0x0385 },
+ { 0x1FBD, 0x1FBD },
+ { 0x1FBF, 0x1FC1 },
+ { 0x1FCD, 0x1FCF },
+ { 0x1FDD, 0x1FDF },
+ { 0x1FED, 0x1FEF },
+ { 0x1FFD, 0x1FFE },
+ { 0x309B, 0x309C },
+ { 0xA700, 0xA716 },
+ { 0xA720, 0xA721 },
+ { 0xA789, 0xA78A },
+ { 0xFF3E, 0xFF3E },
+ { 0xFF40, 0xFF40 },
+ { 0xFFE3, 0xFFE3 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Sk)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Sm.c b/gnulib/tests/unictype/test-categ_Sm.c
new file mode 100644
index 00000000..b373cb44
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Sm.c
@@ -0,0 +1,87 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x002B, 0x002B },
+ { 0x003C, 0x003E },
+ { 0x007C, 0x007C },
+ { 0x007E, 0x007E },
+ { 0x00AC, 0x00AC },
+ { 0x00B1, 0x00B1 },
+ { 0x00D7, 0x00D7 },
+ { 0x00F7, 0x00F7 },
+ { 0x03F6, 0x03F6 },
+ { 0x0606, 0x0608 },
+ { 0x2044, 0x2044 },
+ { 0x2052, 0x2052 },
+ { 0x207A, 0x207C },
+ { 0x208A, 0x208C },
+ { 0x2140, 0x2144 },
+ { 0x214B, 0x214B },
+ { 0x2190, 0x2194 },
+ { 0x219A, 0x219B },
+ { 0x21A0, 0x21A0 },
+ { 0x21A3, 0x21A3 },
+ { 0x21A6, 0x21A6 },
+ { 0x21AE, 0x21AE },
+ { 0x21CE, 0x21CF },
+ { 0x21D2, 0x21D2 },
+ { 0x21D4, 0x21D4 },
+ { 0x21F4, 0x22FF },
+ { 0x2308, 0x230B },
+ { 0x2320, 0x2321 },
+ { 0x237C, 0x237C },
+ { 0x239B, 0x23B3 },
+ { 0x23DC, 0x23E1 },
+ { 0x25B7, 0x25B7 },
+ { 0x25C1, 0x25C1 },
+ { 0x25F8, 0x25FF },
+ { 0x266F, 0x266F },
+ { 0x27C0, 0x27C4 },
+ { 0x27C7, 0x27CA },
+ { 0x27CC, 0x27CC },
+ { 0x27D0, 0x27E5 },
+ { 0x27F0, 0x27FF },
+ { 0x2900, 0x2982 },
+ { 0x2999, 0x29D7 },
+ { 0x29DC, 0x29FB },
+ { 0x29FE, 0x2AFF },
+ { 0x2B30, 0x2B44 },
+ { 0x2B47, 0x2B4C },
+ { 0xFB29, 0xFB29 },
+ { 0xFE62, 0xFE62 },
+ { 0xFE64, 0xFE66 },
+ { 0xFF0B, 0xFF0B },
+ { 0xFF1C, 0xFF1E },
+ { 0xFF5C, 0xFF5C },
+ { 0xFF5E, 0xFF5E },
+ { 0xFFE2, 0xFFE2 },
+ { 0xFFE9, 0xFFEC },
+ { 0x1D6C1, 0x1D6C1 },
+ { 0x1D6DB, 0x1D6DB },
+ { 0x1D6FB, 0x1D6FB },
+ { 0x1D715, 0x1D715 },
+ { 0x1D735, 0x1D735 },
+ { 0x1D74F, 0x1D74F },
+ { 0x1D76F, 0x1D76F },
+ { 0x1D789, 0x1D789 },
+ { 0x1D7A9, 0x1D7A9 },
+ { 0x1D7C3, 0x1D7C3 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Sm)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_So.c b/gnulib/tests/unictype/test-categ_So.c
new file mode 100644
index 00000000..c4c5e3ee
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_So.c
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00A6, 0x00A7 },
+ { 0x00A9, 0x00A9 },
+ { 0x00AE, 0x00AE },
+ { 0x00B0, 0x00B0 },
+ { 0x00B6, 0x00B6 },
+ { 0x0482, 0x0482 },
+ { 0x060E, 0x060F },
+ { 0x06E9, 0x06E9 },
+ { 0x06FD, 0x06FE },
+ { 0x07F6, 0x07F6 },
+ { 0x09FA, 0x09FA },
+ { 0x0B70, 0x0B70 },
+ { 0x0BF3, 0x0BF8 },
+ { 0x0BFA, 0x0BFA },
+ { 0x0C7F, 0x0C7F },
+ { 0x0CF1, 0x0CF2 },
+ { 0x0D79, 0x0D79 },
+ { 0x0F01, 0x0F03 },
+ { 0x0F13, 0x0F17 },
+ { 0x0F1A, 0x0F1F },
+ { 0x0F34, 0x0F34 },
+ { 0x0F36, 0x0F36 },
+ { 0x0F38, 0x0F38 },
+ { 0x0FBE, 0x0FC5 },
+ { 0x0FC7, 0x0FCC },
+ { 0x0FCE, 0x0FCF },
+ { 0x109E, 0x109F },
+ { 0x1360, 0x1360 },
+ { 0x1390, 0x1399 },
+ { 0x1940, 0x1940 },
+ { 0x19E0, 0x19FF },
+ { 0x1B61, 0x1B6A },
+ { 0x1B74, 0x1B7C },
+ { 0x2100, 0x2101 },
+ { 0x2103, 0x2106 },
+ { 0x2108, 0x2109 },
+ { 0x2114, 0x2114 },
+ { 0x2116, 0x2118 },
+ { 0x211E, 0x2123 },
+ { 0x2125, 0x2125 },
+ { 0x2127, 0x2127 },
+ { 0x2129, 0x2129 },
+ { 0x212E, 0x212E },
+ { 0x213A, 0x213B },
+ { 0x214A, 0x214A },
+ { 0x214C, 0x214D },
+ { 0x214F, 0x214F },
+ { 0x2195, 0x2199 },
+ { 0x219C, 0x219F },
+ { 0x21A1, 0x21A2 },
+ { 0x21A4, 0x21A5 },
+ { 0x21A7, 0x21AD },
+ { 0x21AF, 0x21CD },
+ { 0x21D0, 0x21D1 },
+ { 0x21D3, 0x21D3 },
+ { 0x21D5, 0x21F3 },
+ { 0x2300, 0x2307 },
+ { 0x230C, 0x231F },
+ { 0x2322, 0x2328 },
+ { 0x232B, 0x237B },
+ { 0x237D, 0x239A },
+ { 0x23B4, 0x23DB },
+ { 0x23E2, 0x23E7 },
+ { 0x2400, 0x2426 },
+ { 0x2440, 0x244A },
+ { 0x249C, 0x24E9 },
+ { 0x2500, 0x25B6 },
+ { 0x25B8, 0x25C0 },
+ { 0x25C2, 0x25F7 },
+ { 0x2600, 0x266E },
+ { 0x2670, 0x269D },
+ { 0x26A0, 0x26BC },
+ { 0x26C0, 0x26C3 },
+ { 0x2701, 0x2704 },
+ { 0x2706, 0x2709 },
+ { 0x270C, 0x2727 },
+ { 0x2729, 0x274B },
+ { 0x274D, 0x274D },
+ { 0x274F, 0x2752 },
+ { 0x2756, 0x2756 },
+ { 0x2758, 0x275E },
+ { 0x2761, 0x2767 },
+ { 0x2794, 0x2794 },
+ { 0x2798, 0x27AF },
+ { 0x27B1, 0x27BE },
+ { 0x2800, 0x28FF },
+ { 0x2B00, 0x2B2F },
+ { 0x2B45, 0x2B46 },
+ { 0x2B50, 0x2B54 },
+ { 0x2CE5, 0x2CEA },
+ { 0x2E80, 0x2E99 },
+ { 0x2E9B, 0x2EF3 },
+ { 0x2F00, 0x2FD5 },
+ { 0x2FF0, 0x2FFB },
+ { 0x3004, 0x3004 },
+ { 0x3012, 0x3013 },
+ { 0x3020, 0x3020 },
+ { 0x3036, 0x3037 },
+ { 0x303E, 0x303F },
+ { 0x3190, 0x3191 },
+ { 0x3196, 0x319F },
+ { 0x31C0, 0x31E3 },
+ { 0x3200, 0x321E },
+ { 0x322A, 0x3243 },
+ { 0x3250, 0x3250 },
+ { 0x3260, 0x327F },
+ { 0x328A, 0x32B0 },
+ { 0x32C0, 0x32FE },
+ { 0x3300, 0x33FF },
+ { 0x4DC0, 0x4DFF },
+ { 0xA490, 0xA4C6 },
+ { 0xA828, 0xA82B },
+ { 0xFDFD, 0xFDFD },
+ { 0xFFE4, 0xFFE4 },
+ { 0xFFE8, 0xFFE8 },
+ { 0xFFED, 0xFFEE },
+ { 0xFFFC, 0xFFFD },
+ { 0x10102, 0x10102 },
+ { 0x10137, 0x1013F },
+ { 0x10179, 0x10189 },
+ { 0x10190, 0x1019B },
+ { 0x101D0, 0x101FC },
+ { 0x1D000, 0x1D0F5 },
+ { 0x1D100, 0x1D126 },
+ { 0x1D129, 0x1D164 },
+ { 0x1D16A, 0x1D16C },
+ { 0x1D183, 0x1D184 },
+ { 0x1D18C, 0x1D1A9 },
+ { 0x1D1AE, 0x1D1DD },
+ { 0x1D200, 0x1D241 },
+ { 0x1D245, 0x1D245 },
+ { 0x1D300, 0x1D356 },
+ { 0x1F000, 0x1F02B },
+ { 0x1F030, 0x1F093 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_So)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Z.c b/gnulib/tests/unictype/test-categ_Z.c
new file mode 100644
index 00000000..f3745943
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Z.c
@@ -0,0 +1,31 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0020, 0x0020 },
+ { 0x00A0, 0x00A0 },
+ { 0x1680, 0x1680 },
+ { 0x180E, 0x180E },
+ { 0x2000, 0x200A },
+ { 0x2028, 0x2029 },
+ { 0x202F, 0x202F },
+ { 0x205F, 0x205F },
+ { 0x3000, 0x3000 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Z)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Zl.c b/gnulib/tests/unictype/test-categ_Zl.c
new file mode 100644
index 00000000..ce9d36c1
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Zl.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2028, 0x2028 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Zl)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Zp.c b/gnulib/tests/unictype/test-categ_Zp.c
new file mode 100644
index 00000000..84866d85
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Zp.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2029, 0x2029 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Zp)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_Zs.c b/gnulib/tests/unictype/test-categ_Zs.c
new file mode 100644
index 00000000..982ee0bb
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_Zs.c
@@ -0,0 +1,30 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0020, 0x0020 },
+ { 0x00A0, 0x00A0 },
+ { 0x1680, 0x1680 },
+ { 0x180E, 0x180E },
+ { 0x2000, 0x200A },
+ { 0x202F, 0x202F },
+ { 0x205F, 0x205F },
+ { 0x3000, 0x3000 }
+
+#define PREDICATE(c) uc_is_general_category (c, UC_CATEGORY_Zs)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-categ_and.c b/gnulib/tests/unictype/test-categ_and.c
new file mode 100644
index 00000000..70d28cc0
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_and.c
@@ -0,0 +1,39 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ uc_general_category_t ct =
+ uc_general_category_and (
+ uc_general_category_or (UC_LETTER, UC_DECIMAL_DIGIT_NUMBER),
+ uc_general_category_or (UC_UPPERCASE_LETTER, UC_NUMBER));
+
+ ASSERT (uc_is_general_category ('A', ct));
+ ASSERT (!uc_is_general_category ('a', ct));
+ ASSERT (uc_is_general_category ('7', ct));
+ ASSERT (!uc_is_general_category (0x00B2, ct));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-categ_and_not.c b/gnulib/tests/unictype/test-categ_and_not.c
new file mode 100644
index 00000000..72afe83f
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_and_not.c
@@ -0,0 +1,39 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ uc_general_category_t ct =
+ uc_general_category_and_not (
+ uc_general_category_or (UC_LETTER, UC_NUMBER),
+ uc_general_category_or (UC_UPPERCASE_LETTER, UC_DECIMAL_DIGIT_NUMBER));
+
+ ASSERT (!uc_is_general_category ('A', ct));
+ ASSERT (uc_is_general_category ('a', ct));
+ ASSERT (!uc_is_general_category ('7', ct));
+ ASSERT (uc_is_general_category (0x00B2, ct));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-categ_byname.c b/gnulib/tests/unictype/test-categ_byname.c
new file mode 100644
index 00000000..0da16259
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_byname.c
@@ -0,0 +1,99 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-2010 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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <stdbool.h>
+#include <string.h>
+
+#include "macros.h"
+
+static bool
+category_equals (uc_general_category_t category1,
+ uc_general_category_t category2)
+{
+ return (category1.bitmask == category2.bitmask
+ && category1.generic == category2.generic
+ && (category1.generic
+ ? category1.lookup.lookup_fn == category2.lookup.lookup_fn
+ : category1.lookup.table == category2.lookup.table));
+}
+
+int
+main ()
+{
+ ASSERT (category_equals (uc_general_category_byname ("L"), UC_CATEGORY_L));
+ ASSERT (category_equals (uc_general_category_byname ("Lu"), UC_CATEGORY_Lu));
+ ASSERT (category_equals (uc_general_category_byname ("Ll"), UC_CATEGORY_Ll));
+ ASSERT (category_equals (uc_general_category_byname ("Lt"), UC_CATEGORY_Lt));
+ ASSERT (category_equals (uc_general_category_byname ("Lm"), UC_CATEGORY_Lm));
+ ASSERT (category_equals (uc_general_category_byname ("Lo"), UC_CATEGORY_Lo));
+ ASSERT (category_equals (uc_general_category_byname ("M"), UC_CATEGORY_M));
+ ASSERT (category_equals (uc_general_category_byname ("Mn"), UC_CATEGORY_Mn));
+ ASSERT (category_equals (uc_general_category_byname ("Mc"), UC_CATEGORY_Mc));
+ ASSERT (category_equals (uc_general_category_byname ("Me"), UC_CATEGORY_Me));
+ ASSERT (category_equals (uc_general_category_byname ("N"), UC_CATEGORY_N));
+ ASSERT (category_equals (uc_general_category_byname ("Nd"), UC_CATEGORY_Nd));
+ ASSERT (category_equals (uc_general_category_byname ("Nl"), UC_CATEGORY_Nl));
+ ASSERT (category_equals (uc_general_category_byname ("No"), UC_CATEGORY_No));
+ ASSERT (category_equals (uc_general_category_byname ("P"), UC_CATEGORY_P));
+ ASSERT (category_equals (uc_general_category_byname ("Pc"), UC_CATEGORY_Pc));
+ ASSERT (category_equals (uc_general_category_byname ("Pd"), UC_CATEGORY_Pd));
+ ASSERT (category_equals (uc_general_category_byname ("Ps"), UC_CATEGORY_Ps));
+ ASSERT (category_equals (uc_general_category_byname ("Pe"), UC_CATEGORY_Pe));
+ ASSERT (category_equals (uc_general_category_byname ("Pi"), UC_CATEGORY_Pi));
+ ASSERT (category_equals (uc_general_category_byname ("Pf"), UC_CATEGORY_Pf));
+ ASSERT (category_equals (uc_general_category_byname ("Po"), UC_CATEGORY_Po));
+ ASSERT (category_equals (uc_general_category_byname ("S"), UC_CATEGORY_S));
+ ASSERT (category_equals (uc_general_category_byname ("Sm"), UC_CATEGORY_Sm));
+ ASSERT (category_equals (uc_general_category_byname ("Sc"), UC_CATEGORY_Sc));
+ ASSERT (category_equals (uc_general_category_byname ("Sk"), UC_CATEGORY_Sk));
+ ASSERT (category_equals (uc_general_category_byname ("So"), UC_CATEGORY_So));
+ ASSERT (category_equals (uc_general_category_byname ("Z"), UC_CATEGORY_Z));
+ ASSERT (category_equals (uc_general_category_byname ("Zs"), UC_CATEGORY_Zs));
+ ASSERT (category_equals (uc_general_category_byname ("Zl"), UC_CATEGORY_Zl));
+ ASSERT (category_equals (uc_general_category_byname ("Zp"), UC_CATEGORY_Zp));
+ ASSERT (category_equals (uc_general_category_byname ("C"), UC_CATEGORY_C));
+ ASSERT (category_equals (uc_general_category_byname ("Cc"), UC_CATEGORY_Cc));
+ ASSERT (category_equals (uc_general_category_byname ("Cf"), UC_CATEGORY_Cf));
+ ASSERT (category_equals (uc_general_category_byname ("Cs"), UC_CATEGORY_Cs));
+ ASSERT (category_equals (uc_general_category_byname ("Co"), UC_CATEGORY_Co));
+ ASSERT (category_equals (uc_general_category_byname ("Cn"), UC_CATEGORY_Cn));
+
+ uc_general_category_byname ("Nl");
+
+ {
+ uc_general_category_t ct = uc_general_category_byname ("Nd");
+ unsigned int c;
+
+ for (c = 0x30; c <= 0x39; c++)
+ ASSERT (uc_is_general_category (c, ct));
+ for (c = 0x40; c < 0x80; c++)
+ ASSERT (!uc_is_general_category (c, ct));
+ }
+
+ {
+ uc_general_category_t ct = uc_general_category_byname ("Foo");
+ unsigned int c;
+
+ for (c = 0; c < 0x110000; c++)
+ ASSERT (!uc_is_general_category (c, ct));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-categ_name.c b/gnulib/tests/unictype/test-categ_name.c
new file mode 100644
index 00000000..bef66007
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_name.c
@@ -0,0 +1,33 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (strcmp (uc_general_category_name (UC_CATEGORY_Z), "Z") == 0);
+ ASSERT (strcmp (uc_general_category_name (UC_CATEGORY_Nl), "Nl") == 0);
+ ASSERT (uc_general_category_name (uc_general_category_or (UC_CATEGORY_Z, UC_CATEGORY_Nl)) == NULL);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-categ_none.c b/gnulib/tests/unictype/test-categ_none.c
new file mode 100644
index 00000000..bc0a9a7b
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_none.c
@@ -0,0 +1,35 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ uc_general_category_t ct = _UC_CATEGORY_NONE;
+ unsigned int c;
+
+ for (c = 0; c < 0x110000; c++)
+ ASSERT (!uc_is_general_category (c, ct));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-categ_of.c b/gnulib/tests/unictype/test-categ_of.c
new file mode 100644
index 00000000..26d04634
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_of.c
@@ -0,0 +1,55 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ {
+ unsigned int c;
+ for (c = 0; c < 0x110000; c++)
+ ASSERT (uc_is_general_category (c, uc_general_category (c)));
+ }
+
+ {
+ uc_general_category_t decimal_digits = uc_general_category ('7');
+ unsigned int c;
+
+ for (c = 0x30; c <= 0x39; c++)
+ ASSERT (uc_is_general_category (c, decimal_digits));
+ for (c = 0x40; c < 0x80; c++)
+ ASSERT (!uc_is_general_category (c, decimal_digits));
+ }
+
+ {
+ uc_general_category_t lowercase_letters = uc_general_category ('x');
+ unsigned int c;
+
+ for (c = 0x41; c <= 0x5A; c++)
+ ASSERT (!uc_is_general_category (c, lowercase_letters));
+ for (c = 0x61; c <= 0x7A; c++)
+ ASSERT (uc_is_general_category (c, lowercase_letters));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-categ_or.c b/gnulib/tests/unictype/test-categ_or.c
new file mode 100644
index 00000000..7973eb00
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_or.c
@@ -0,0 +1,36 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ uc_general_category_t ct =
+ uc_general_category_or (UC_LETTER, UC_NUMBER);
+
+ ASSERT (uc_is_general_category ('a', ct));
+ ASSERT (uc_is_general_category ('7', ct));
+ ASSERT (!uc_is_general_category ('$', ct));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-categ_test_withtable.c b/gnulib/tests/unictype/test-categ_test_withtable.c
new file mode 100644
index 00000000..8e52a370
--- /dev/null
+++ b/gnulib/tests/unictype/test-categ_test_withtable.c
@@ -0,0 +1,38 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ uint32_t ctmask =
+ (UC_CATEGORY_MASK_L | UC_CATEGORY_MASK_N)
+ & ~(UC_CATEGORY_MASK_Lu | UC_CATEGORY_MASK_Nd);
+
+ ASSERT (!uc_is_general_category_withtable ('A', ctmask));
+ ASSERT (uc_is_general_category_withtable ('a', ctmask));
+ ASSERT (!uc_is_general_category_withtable ('7', ctmask));
+ ASSERT (uc_is_general_category_withtable (0x00B2, ctmask));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-combining.c b/gnulib/tests/unictype/test-combining.c
new file mode 100644
index 00000000..d890f1d4
--- /dev/null
+++ b/gnulib/tests/unictype/test-combining.c
@@ -0,0 +1,35 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (uc_combining_class ('x') == UC_CCC_NR);
+ ASSERT (uc_combining_class (0x0300) == UC_CCC_A);
+ ASSERT (uc_combining_class (0x0319) == UC_CCC_B);
+ ASSERT (uc_combining_class (0x0327) == UC_CCC_ATB);
+ ASSERT (uc_combining_class (0x093C) == UC_CCC_NK);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-ctype_alnum.c b/gnulib/tests/unictype/test-ctype_alnum.c
new file mode 100644
index 00000000..9a1c6cac
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_alnum.c
@@ -0,0 +1,439 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x0041, 0x005A },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0345, 0x0345 },
+ { 0x0370, 0x0374 },
+ { 0x0376, 0x0377 },
+ { 0x037A, 0x037D },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x0559 },
+ { 0x0561, 0x0587 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0621, 0x064A },
+ { 0x0660, 0x0669 },
+ { 0x066E, 0x066F },
+ { 0x0671, 0x06D3 },
+ { 0x06D5, 0x06D5 },
+ { 0x06E5, 0x06E6 },
+ { 0x06EE, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x0710 },
+ { 0x0712, 0x072F },
+ { 0x074D, 0x07A5 },
+ { 0x07B1, 0x07B1 },
+ { 0x07C0, 0x07EA },
+ { 0x07F4, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0904, 0x0939 },
+ { 0x093D, 0x093D },
+ { 0x0950, 0x0950 },
+ { 0x0958, 0x0961 },
+ { 0x0966, 0x096F },
+ { 0x0971, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BD, 0x09BD },
+ { 0x09CE, 0x09CE },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E1 },
+ { 0x09E6, 0x09F1 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A66, 0x0A6F },
+ { 0x0A72, 0x0A74 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABD, 0x0ABD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE1 },
+ { 0x0AE6, 0x0AEF },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3D, 0x0B3D },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B61 },
+ { 0x0B66, 0x0B6F },
+ { 0x0B71, 0x0B71 },
+ { 0x0B83, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0BE6, 0x0BEF },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C3D },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C61 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBD, 0x0CBD },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE1 },
+ { 0x0CE6, 0x0CEF },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D3D },
+ { 0x0D60, 0x0D61 },
+ { 0x0D66, 0x0D6F },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0E01, 0x0E2E },
+ { 0x0E30, 0x0E3A },
+ { 0x0E40, 0x0E45 },
+ { 0x0E47, 0x0E4E },
+ { 0x0E50, 0x0E59 },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB0 },
+ { 0x0EB2, 0x0EB3 },
+ { 0x0EBD, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F20, 0x0F29 },
+ { 0x0F40, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F88, 0x0F8B },
+ { 0x1000, 0x102A },
+ { 0x103F, 0x1049 },
+ { 0x1050, 0x1055 },
+ { 0x105A, 0x105D },
+ { 0x1061, 0x1061 },
+ { 0x1065, 0x1066 },
+ { 0x106E, 0x1070 },
+ { 0x1075, 0x1081 },
+ { 0x108E, 0x108E },
+ { 0x1090, 0x1099 },
+ { 0x10A0, 0x10C5 },
+ { 0x10D0, 0x10FA },
+ { 0x10FC, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x16EE, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1711 },
+ { 0x1720, 0x1731 },
+ { 0x1740, 0x1751 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1780, 0x17B3 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DC, 0x17DC },
+ { 0x17E0, 0x17E9 },
+ { 0x1810, 0x1819 },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18A8 },
+ { 0x18AA, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1946, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19C1, 0x19C7 },
+ { 0x19D0, 0x19D9 },
+ { 0x1A00, 0x1A16 },
+ { 0x1B05, 0x1B33 },
+ { 0x1B45, 0x1B4B },
+ { 0x1B50, 0x1B59 },
+ { 0x1B83, 0x1BA0 },
+ { 0x1BAE, 0x1BB9 },
+ { 0x1C00, 0x1C23 },
+ { 0x1C40, 0x1C49 },
+ { 0x1C4D, 0x1C7D },
+ { 0x1D00, 0x1DBF },
+ { 0x1E00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x212D },
+ { 0x212F, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2160, 0x2188 },
+ { 0x249C, 0x24E9 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2E2F, 0x2E2F },
+ { 0x3005, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3031, 0x3035 },
+ { 0x3038, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x309D, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA500, 0xA60C },
+ { 0xA610, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66E },
+ { 0xA67F, 0xA697 },
+ { 0xA717, 0xA71F },
+ { 0xA722, 0xA788 },
+ { 0xA78B, 0xA78C },
+ { 0xA7FB, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA822 },
+ { 0xA840, 0xA873 },
+ { 0xA882, 0xA8B3 },
+ { 0xA8D0, 0xA8D9 },
+ { 0xA900, 0xA925 },
+ { 0xA930, 0xA946 },
+ { 0xAA00, 0xAA28 },
+ { 0xAA40, 0xAA42 },
+ { 0xAA44, 0xAA4B },
+ { 0xAA50, 0xAA59 },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFB },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFF10, 0xFF19 },
+ { 0xFF21, 0xFF3A },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10140, 0x10174 },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x103D1, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x104A0, 0x104A9 },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A00 },
+ { 0x10A10, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_alnum (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_alpha.c b/gnulib/tests/unictype/test-ctype_alpha.c
new file mode 100644
index 00000000..c6100cfa
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_alpha.c
@@ -0,0 +1,438 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0345, 0x0345 },
+ { 0x0370, 0x0374 },
+ { 0x0376, 0x0377 },
+ { 0x037A, 0x037D },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x0559 },
+ { 0x0561, 0x0587 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0621, 0x064A },
+ { 0x0660, 0x0669 },
+ { 0x066E, 0x066F },
+ { 0x0671, 0x06D3 },
+ { 0x06D5, 0x06D5 },
+ { 0x06E5, 0x06E6 },
+ { 0x06EE, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x0710 },
+ { 0x0712, 0x072F },
+ { 0x074D, 0x07A5 },
+ { 0x07B1, 0x07B1 },
+ { 0x07C0, 0x07EA },
+ { 0x07F4, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0904, 0x0939 },
+ { 0x093D, 0x093D },
+ { 0x0950, 0x0950 },
+ { 0x0958, 0x0961 },
+ { 0x0966, 0x096F },
+ { 0x0971, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BD, 0x09BD },
+ { 0x09CE, 0x09CE },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E1 },
+ { 0x09E6, 0x09F1 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A66, 0x0A6F },
+ { 0x0A72, 0x0A74 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABD, 0x0ABD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE1 },
+ { 0x0AE6, 0x0AEF },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3D, 0x0B3D },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B61 },
+ { 0x0B66, 0x0B6F },
+ { 0x0B71, 0x0B71 },
+ { 0x0B83, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0BE6, 0x0BEF },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C3D },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C61 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBD, 0x0CBD },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE1 },
+ { 0x0CE6, 0x0CEF },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D3D },
+ { 0x0D60, 0x0D61 },
+ { 0x0D66, 0x0D6F },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0E01, 0x0E2E },
+ { 0x0E30, 0x0E3A },
+ { 0x0E40, 0x0E45 },
+ { 0x0E47, 0x0E4E },
+ { 0x0E50, 0x0E59 },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB0 },
+ { 0x0EB2, 0x0EB3 },
+ { 0x0EBD, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F20, 0x0F29 },
+ { 0x0F40, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F88, 0x0F8B },
+ { 0x1000, 0x102A },
+ { 0x103F, 0x1049 },
+ { 0x1050, 0x1055 },
+ { 0x105A, 0x105D },
+ { 0x1061, 0x1061 },
+ { 0x1065, 0x1066 },
+ { 0x106E, 0x1070 },
+ { 0x1075, 0x1081 },
+ { 0x108E, 0x108E },
+ { 0x1090, 0x1099 },
+ { 0x10A0, 0x10C5 },
+ { 0x10D0, 0x10FA },
+ { 0x10FC, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x16EE, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1711 },
+ { 0x1720, 0x1731 },
+ { 0x1740, 0x1751 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1780, 0x17B3 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DC, 0x17DC },
+ { 0x17E0, 0x17E9 },
+ { 0x1810, 0x1819 },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18A8 },
+ { 0x18AA, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1946, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19C1, 0x19C7 },
+ { 0x19D0, 0x19D9 },
+ { 0x1A00, 0x1A16 },
+ { 0x1B05, 0x1B33 },
+ { 0x1B45, 0x1B4B },
+ { 0x1B50, 0x1B59 },
+ { 0x1B83, 0x1BA0 },
+ { 0x1BAE, 0x1BB9 },
+ { 0x1C00, 0x1C23 },
+ { 0x1C40, 0x1C49 },
+ { 0x1C4D, 0x1C7D },
+ { 0x1D00, 0x1DBF },
+ { 0x1E00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x212D },
+ { 0x212F, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2160, 0x2188 },
+ { 0x249C, 0x24E9 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2E2F, 0x2E2F },
+ { 0x3005, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3031, 0x3035 },
+ { 0x3038, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x309D, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA500, 0xA60C },
+ { 0xA610, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66E },
+ { 0xA67F, 0xA697 },
+ { 0xA717, 0xA71F },
+ { 0xA722, 0xA788 },
+ { 0xA78B, 0xA78C },
+ { 0xA7FB, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA822 },
+ { 0xA840, 0xA873 },
+ { 0xA882, 0xA8B3 },
+ { 0xA8D0, 0xA8D9 },
+ { 0xA900, 0xA925 },
+ { 0xA930, 0xA946 },
+ { 0xAA00, 0xAA28 },
+ { 0xAA40, 0xAA42 },
+ { 0xAA44, 0xAA4B },
+ { 0xAA50, 0xAA59 },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFB },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFF10, 0xFF19 },
+ { 0xFF21, 0xFF3A },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10140, 0x10174 },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x103D1, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x104A0, 0x104A9 },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A00 },
+ { 0x10A10, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_alpha (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_blank.c b/gnulib/tests/unictype/test-ctype_blank.c
new file mode 100644
index 00000000..15aa3087
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_blank.c
@@ -0,0 +1,30 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0009, 0x0009 },
+ { 0x0020, 0x0020 },
+ { 0x1680, 0x1680 },
+ { 0x180E, 0x180E },
+ { 0x2000, 0x2006 },
+ { 0x2008, 0x200A },
+ { 0x205F, 0x205F },
+ { 0x3000, 0x3000 }
+
+#define PREDICATE(c) uc_is_blank (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_cntrl.c b/gnulib/tests/unictype/test-ctype_cntrl.c
new file mode 100644
index 00000000..ea886b9a
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_cntrl.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0000, 0x001F },
+ { 0x007F, 0x009F },
+ { 0x2028, 0x2029 }
+
+#define PREDICATE(c) uc_is_cntrl (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_digit.c b/gnulib/tests/unictype/test-ctype_digit.c
new file mode 100644
index 00000000..acf5b4ac
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_digit.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 }
+
+#define PREDICATE(c) uc_is_digit (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_graph.c b/gnulib/tests/unictype/test-ctype_graph.c
new file mode 100644
index 00000000..32055ede
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_graph.c
@@ -0,0 +1,471 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x007E },
+ { 0x00A0, 0x0377 },
+ { 0x037A, 0x037E },
+ { 0x0384, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x055F },
+ { 0x0561, 0x0587 },
+ { 0x0589, 0x058A },
+ { 0x0591, 0x05C7 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F4 },
+ { 0x0600, 0x0603 },
+ { 0x0606, 0x061B },
+ { 0x061E, 0x061F },
+ { 0x0621, 0x065E },
+ { 0x0660, 0x070D },
+ { 0x070F, 0x074A },
+ { 0x074D, 0x07B1 },
+ { 0x07C0, 0x07FA },
+ { 0x0901, 0x0939 },
+ { 0x093C, 0x094D },
+ { 0x0950, 0x0954 },
+ { 0x0958, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0981, 0x0983 },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BC, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CE },
+ { 0x09D7, 0x09D7 },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E3 },
+ { 0x09E6, 0x09FA },
+ { 0x0A01, 0x0A03 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A66, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABC, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE3 },
+ { 0x0AE6, 0x0AEF },
+ { 0x0AF1, 0x0AF1 },
+ { 0x0B01, 0x0B03 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3C, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4D },
+ { 0x0B56, 0x0B57 },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B63 },
+ { 0x0B66, 0x0B71 },
+ { 0x0B82, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCD },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0BE6, 0x0BFA },
+ { 0x0C01, 0x0C03 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C63 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C78, 0x0C7F },
+ { 0x0C82, 0x0C83 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBC, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCD },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE3 },
+ { 0x0CE6, 0x0CEF },
+ { 0x0CF1, 0x0CF2 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4D },
+ { 0x0D57, 0x0D57 },
+ { 0x0D60, 0x0D63 },
+ { 0x0D66, 0x0D75 },
+ { 0x0D79, 0x0D7F },
+ { 0x0D82, 0x0D83 },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF4 },
+ { 0x0E01, 0x0E3A },
+ { 0x0E3F, 0x0E5B },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB9 },
+ { 0x0EBB, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0EC8, 0x0ECD },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F71, 0x0F8B },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FBE, 0x0FCC },
+ { 0x0FCE, 0x0FD4 },
+ { 0x1000, 0x1099 },
+ { 0x109E, 0x10C5 },
+ { 0x10D0, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x135F, 0x137C },
+ { 0x1380, 0x1399 },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x1676 },
+ { 0x1681, 0x169C },
+ { 0x16A0, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1714 },
+ { 0x1720, 0x1736 },
+ { 0x1740, 0x1753 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1772, 0x1773 },
+ { 0x1780, 0x17DD },
+ { 0x17E0, 0x17E9 },
+ { 0x17F0, 0x17F9 },
+ { 0x1800, 0x180D },
+ { 0x1810, 0x1819 },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x193B },
+ { 0x1940, 0x1940 },
+ { 0x1944, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19B0, 0x19C9 },
+ { 0x19D0, 0x19D9 },
+ { 0x19DE, 0x1A1B },
+ { 0x1A1E, 0x1A1F },
+ { 0x1B00, 0x1B4B },
+ { 0x1B50, 0x1B7C },
+ { 0x1B80, 0x1BAA },
+ { 0x1BAE, 0x1BB9 },
+ { 0x1C00, 0x1C37 },
+ { 0x1C3B, 0x1C49 },
+ { 0x1C4D, 0x1C7F },
+ { 0x1D00, 0x1DE6 },
+ { 0x1DFE, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FC4 },
+ { 0x1FC6, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FDD, 0x1FEF },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFE },
+ { 0x2007, 0x2007 },
+ { 0x200B, 0x2027 },
+ { 0x202A, 0x205E },
+ { 0x2060, 0x2064 },
+ { 0x206A, 0x2071 },
+ { 0x2074, 0x208E },
+ { 0x2090, 0x2094 },
+ { 0x20A0, 0x20B5 },
+ { 0x20D0, 0x20F0 },
+ { 0x2100, 0x214F },
+ { 0x2153, 0x2188 },
+ { 0x2190, 0x23E7 },
+ { 0x2400, 0x2426 },
+ { 0x2440, 0x244A },
+ { 0x2460, 0x269D },
+ { 0x26A0, 0x26BC },
+ { 0x26C0, 0x26C3 },
+ { 0x2701, 0x2704 },
+ { 0x2706, 0x2709 },
+ { 0x270C, 0x2727 },
+ { 0x2729, 0x274B },
+ { 0x274D, 0x274D },
+ { 0x274F, 0x2752 },
+ { 0x2756, 0x2756 },
+ { 0x2758, 0x275E },
+ { 0x2761, 0x2794 },
+ { 0x2798, 0x27AF },
+ { 0x27B1, 0x27BE },
+ { 0x27C0, 0x27CA },
+ { 0x27CC, 0x27CC },
+ { 0x27D0, 0x2B4C },
+ { 0x2B50, 0x2B54 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CEA },
+ { 0x2CF9, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2DE0, 0x2E30 },
+ { 0x2E80, 0x2E99 },
+ { 0x2E9B, 0x2EF3 },
+ { 0x2F00, 0x2FD5 },
+ { 0x2FF0, 0x2FFB },
+ { 0x3001, 0x303F },
+ { 0x3041, 0x3096 },
+ { 0x3099, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x3190, 0x31B7 },
+ { 0x31C0, 0x31E3 },
+ { 0x31F0, 0x321E },
+ { 0x3220, 0x3243 },
+ { 0x3250, 0x32FE },
+ { 0x3300, 0x4DB5 },
+ { 0x4DC0, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA490, 0xA4C6 },
+ { 0xA500, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA673 },
+ { 0xA67C, 0xA697 },
+ { 0xA700, 0xA78C },
+ { 0xA7FB, 0xA82B },
+ { 0xA840, 0xA877 },
+ { 0xA880, 0xA8C4 },
+ { 0xA8CE, 0xA8D9 },
+ { 0xA900, 0xA953 },
+ { 0xA95F, 0xA95F },
+ { 0xAA00, 0xAA36 },
+ { 0xAA40, 0xAA4D },
+ { 0xAA50, 0xAA59 },
+ { 0xAA5C, 0xAA5F },
+ { 0xAC00, 0xD7A3 },
+ { 0xE000, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3F },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFD },
+ { 0xFE00, 0xFE19 },
+ { 0xFE20, 0xFE26 },
+ { 0xFE30, 0xFE52 },
+ { 0xFE54, 0xFE66 },
+ { 0xFE68, 0xFE6B },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFEFF, 0xFEFF },
+ { 0xFF01, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0xFFE0, 0xFFE6 },
+ { 0xFFE8, 0xFFEE },
+ { 0xFFF9, 0xFFFD },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10100, 0x10102 },
+ { 0x10107, 0x10133 },
+ { 0x10137, 0x1018A },
+ { 0x10190, 0x1019B },
+ { 0x101D0, 0x101FD },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10320, 0x10323 },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x1039F, 0x103C3 },
+ { 0x103C8, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x104A0, 0x104A9 },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10919 },
+ { 0x1091F, 0x10939 },
+ { 0x1093F, 0x1093F },
+ { 0x10A00, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A47 },
+ { 0x10A50, 0x10A58 },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x12470, 0x12473 },
+ { 0x1D000, 0x1D0F5 },
+ { 0x1D100, 0x1D126 },
+ { 0x1D129, 0x1D1DD },
+ { 0x1D200, 0x1D245 },
+ { 0x1D300, 0x1D356 },
+ { 0x1D360, 0x1D371 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF },
+ { 0x1F000, 0x1F02B },
+ { 0x1F030, 0x1F093 },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F },
+ { 0xE0100, 0xE01EF },
+ { 0xF0000, 0xFFFFD },
+ { 0x100000, 0x10FFFD }
+
+#define PREDICATE(c) uc_is_graph (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_lower.c b/gnulib/tests/unictype/test-ctype_lower.c
new file mode 100644
index 00000000..f7135fa7
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_lower.c
@@ -0,0 +1,592 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0061, 0x007A },
+ { 0x00B5, 0x00B5 },
+ { 0x00DF, 0x00F6 },
+ { 0x00F8, 0x00FF },
+ { 0x0101, 0x0101 },
+ { 0x0103, 0x0103 },
+ { 0x0105, 0x0105 },
+ { 0x0107, 0x0107 },
+ { 0x0109, 0x0109 },
+ { 0x010B, 0x010B },
+ { 0x010D, 0x010D },
+ { 0x010F, 0x010F },
+ { 0x0111, 0x0111 },
+ { 0x0113, 0x0113 },
+ { 0x0115, 0x0115 },
+ { 0x0117, 0x0117 },
+ { 0x0119, 0x0119 },
+ { 0x011B, 0x011B },
+ { 0x011D, 0x011D },
+ { 0x011F, 0x011F },
+ { 0x0121, 0x0121 },
+ { 0x0123, 0x0123 },
+ { 0x0125, 0x0125 },
+ { 0x0127, 0x0127 },
+ { 0x0129, 0x0129 },
+ { 0x012B, 0x012B },
+ { 0x012D, 0x012D },
+ { 0x012F, 0x012F },
+ { 0x0131, 0x0131 },
+ { 0x0133, 0x0133 },
+ { 0x0135, 0x0135 },
+ { 0x0137, 0x0137 },
+ { 0x013A, 0x013A },
+ { 0x013C, 0x013C },
+ { 0x013E, 0x013E },
+ { 0x0140, 0x0140 },
+ { 0x0142, 0x0142 },
+ { 0x0144, 0x0144 },
+ { 0x0146, 0x0146 },
+ { 0x0148, 0x0148 },
+ { 0x014B, 0x014B },
+ { 0x014D, 0x014D },
+ { 0x014F, 0x014F },
+ { 0x0151, 0x0151 },
+ { 0x0153, 0x0153 },
+ { 0x0155, 0x0155 },
+ { 0x0157, 0x0157 },
+ { 0x0159, 0x0159 },
+ { 0x015B, 0x015B },
+ { 0x015D, 0x015D },
+ { 0x015F, 0x015F },
+ { 0x0161, 0x0161 },
+ { 0x0163, 0x0163 },
+ { 0x0165, 0x0165 },
+ { 0x0167, 0x0167 },
+ { 0x0169, 0x0169 },
+ { 0x016B, 0x016B },
+ { 0x016D, 0x016D },
+ { 0x016F, 0x016F },
+ { 0x0171, 0x0171 },
+ { 0x0173, 0x0173 },
+ { 0x0175, 0x0175 },
+ { 0x0177, 0x0177 },
+ { 0x017A, 0x017A },
+ { 0x017C, 0x017C },
+ { 0x017E, 0x0180 },
+ { 0x0183, 0x0183 },
+ { 0x0185, 0x0185 },
+ { 0x0188, 0x0188 },
+ { 0x018C, 0x018C },
+ { 0x0192, 0x0192 },
+ { 0x0195, 0x0195 },
+ { 0x0199, 0x019A },
+ { 0x019E, 0x019E },
+ { 0x01A1, 0x01A1 },
+ { 0x01A3, 0x01A3 },
+ { 0x01A5, 0x01A5 },
+ { 0x01A8, 0x01A8 },
+ { 0x01AD, 0x01AD },
+ { 0x01B0, 0x01B0 },
+ { 0x01B4, 0x01B4 },
+ { 0x01B6, 0x01B6 },
+ { 0x01B9, 0x01B9 },
+ { 0x01BD, 0x01BD },
+ { 0x01BF, 0x01BF },
+ { 0x01C5, 0x01C6 },
+ { 0x01C8, 0x01C9 },
+ { 0x01CB, 0x01CC },
+ { 0x01CE, 0x01CE },
+ { 0x01D0, 0x01D0 },
+ { 0x01D2, 0x01D2 },
+ { 0x01D4, 0x01D4 },
+ { 0x01D6, 0x01D6 },
+ { 0x01D8, 0x01D8 },
+ { 0x01DA, 0x01DA },
+ { 0x01DC, 0x01DD },
+ { 0x01DF, 0x01DF },
+ { 0x01E1, 0x01E1 },
+ { 0x01E3, 0x01E3 },
+ { 0x01E5, 0x01E5 },
+ { 0x01E7, 0x01E7 },
+ { 0x01E9, 0x01E9 },
+ { 0x01EB, 0x01EB },
+ { 0x01ED, 0x01ED },
+ { 0x01EF, 0x01EF },
+ { 0x01F2, 0x01F3 },
+ { 0x01F5, 0x01F5 },
+ { 0x01F9, 0x01F9 },
+ { 0x01FB, 0x01FB },
+ { 0x01FD, 0x01FD },
+ { 0x01FF, 0x01FF },
+ { 0x0201, 0x0201 },
+ { 0x0203, 0x0203 },
+ { 0x0205, 0x0205 },
+ { 0x0207, 0x0207 },
+ { 0x0209, 0x0209 },
+ { 0x020B, 0x020B },
+ { 0x020D, 0x020D },
+ { 0x020F, 0x020F },
+ { 0x0211, 0x0211 },
+ { 0x0213, 0x0213 },
+ { 0x0215, 0x0215 },
+ { 0x0217, 0x0217 },
+ { 0x0219, 0x0219 },
+ { 0x021B, 0x021B },
+ { 0x021D, 0x021D },
+ { 0x021F, 0x021F },
+ { 0x0223, 0x0223 },
+ { 0x0225, 0x0225 },
+ { 0x0227, 0x0227 },
+ { 0x0229, 0x0229 },
+ { 0x022B, 0x022B },
+ { 0x022D, 0x022D },
+ { 0x022F, 0x022F },
+ { 0x0231, 0x0231 },
+ { 0x0233, 0x0233 },
+ { 0x023C, 0x023C },
+ { 0x0242, 0x0242 },
+ { 0x0247, 0x0247 },
+ { 0x0249, 0x0249 },
+ { 0x024B, 0x024B },
+ { 0x024D, 0x024D },
+ { 0x024F, 0x0251 },
+ { 0x0253, 0x0254 },
+ { 0x0256, 0x0257 },
+ { 0x0259, 0x0259 },
+ { 0x025B, 0x025B },
+ { 0x0260, 0x0260 },
+ { 0x0263, 0x0263 },
+ { 0x0268, 0x0269 },
+ { 0x026B, 0x026B },
+ { 0x026F, 0x026F },
+ { 0x0271, 0x0272 },
+ { 0x0275, 0x0275 },
+ { 0x027D, 0x027D },
+ { 0x0280, 0x0280 },
+ { 0x0283, 0x0283 },
+ { 0x0288, 0x028C },
+ { 0x0292, 0x0292 },
+ { 0x0345, 0x0345 },
+ { 0x0371, 0x0371 },
+ { 0x0373, 0x0373 },
+ { 0x0377, 0x0377 },
+ { 0x037B, 0x037D },
+ { 0x03AC, 0x03AF },
+ { 0x03B1, 0x03CE },
+ { 0x03D0, 0x03D1 },
+ { 0x03D5, 0x03D7 },
+ { 0x03D9, 0x03D9 },
+ { 0x03DB, 0x03DB },
+ { 0x03DD, 0x03DD },
+ { 0x03DF, 0x03DF },
+ { 0x03E1, 0x03E1 },
+ { 0x03E3, 0x03E3 },
+ { 0x03E5, 0x03E5 },
+ { 0x03E7, 0x03E7 },
+ { 0x03E9, 0x03E9 },
+ { 0x03EB, 0x03EB },
+ { 0x03ED, 0x03ED },
+ { 0x03EF, 0x03F2 },
+ { 0x03F5, 0x03F5 },
+ { 0x03F8, 0x03F8 },
+ { 0x03FB, 0x03FB },
+ { 0x0430, 0x045F },
+ { 0x0461, 0x0461 },
+ { 0x0463, 0x0463 },
+ { 0x0465, 0x0465 },
+ { 0x0467, 0x0467 },
+ { 0x0469, 0x0469 },
+ { 0x046B, 0x046B },
+ { 0x046D, 0x046D },
+ { 0x046F, 0x046F },
+ { 0x0471, 0x0471 },
+ { 0x0473, 0x0473 },
+ { 0x0475, 0x0475 },
+ { 0x0477, 0x0477 },
+ { 0x0479, 0x0479 },
+ { 0x047B, 0x047B },
+ { 0x047D, 0x047D },
+ { 0x047F, 0x047F },
+ { 0x0481, 0x0481 },
+ { 0x048B, 0x048B },
+ { 0x048D, 0x048D },
+ { 0x048F, 0x048F },
+ { 0x0491, 0x0491 },
+ { 0x0493, 0x0493 },
+ { 0x0495, 0x0495 },
+ { 0x0497, 0x0497 },
+ { 0x0499, 0x0499 },
+ { 0x049B, 0x049B },
+ { 0x049D, 0x049D },
+ { 0x049F, 0x049F },
+ { 0x04A1, 0x04A1 },
+ { 0x04A3, 0x04A3 },
+ { 0x04A5, 0x04A5 },
+ { 0x04A7, 0x04A7 },
+ { 0x04A9, 0x04A9 },
+ { 0x04AB, 0x04AB },
+ { 0x04AD, 0x04AD },
+ { 0x04AF, 0x04AF },
+ { 0x04B1, 0x04B1 },
+ { 0x04B3, 0x04B3 },
+ { 0x04B5, 0x04B5 },
+ { 0x04B7, 0x04B7 },
+ { 0x04B9, 0x04B9 },
+ { 0x04BB, 0x04BB },
+ { 0x04BD, 0x04BD },
+ { 0x04BF, 0x04BF },
+ { 0x04C2, 0x04C2 },
+ { 0x04C4, 0x04C4 },
+ { 0x04C6, 0x04C6 },
+ { 0x04C8, 0x04C8 },
+ { 0x04CA, 0x04CA },
+ { 0x04CC, 0x04CC },
+ { 0x04CE, 0x04CF },
+ { 0x04D1, 0x04D1 },
+ { 0x04D3, 0x04D3 },
+ { 0x04D5, 0x04D5 },
+ { 0x04D7, 0x04D7 },
+ { 0x04D9, 0x04D9 },
+ { 0x04DB, 0x04DB },
+ { 0x04DD, 0x04DD },
+ { 0x04DF, 0x04DF },
+ { 0x04E1, 0x04E1 },
+ { 0x04E3, 0x04E3 },
+ { 0x04E5, 0x04E5 },
+ { 0x04E7, 0x04E7 },
+ { 0x04E9, 0x04E9 },
+ { 0x04EB, 0x04EB },
+ { 0x04ED, 0x04ED },
+ { 0x04EF, 0x04EF },
+ { 0x04F1, 0x04F1 },
+ { 0x04F3, 0x04F3 },
+ { 0x04F5, 0x04F5 },
+ { 0x04F7, 0x04F7 },
+ { 0x04F9, 0x04F9 },
+ { 0x04FB, 0x04FB },
+ { 0x04FD, 0x04FD },
+ { 0x04FF, 0x04FF },
+ { 0x0501, 0x0501 },
+ { 0x0503, 0x0503 },
+ { 0x0505, 0x0505 },
+ { 0x0507, 0x0507 },
+ { 0x0509, 0x0509 },
+ { 0x050B, 0x050B },
+ { 0x050D, 0x050D },
+ { 0x050F, 0x050F },
+ { 0x0511, 0x0511 },
+ { 0x0513, 0x0513 },
+ { 0x0515, 0x0515 },
+ { 0x0517, 0x0517 },
+ { 0x0519, 0x0519 },
+ { 0x051B, 0x051B },
+ { 0x051D, 0x051D },
+ { 0x051F, 0x051F },
+ { 0x0521, 0x0521 },
+ { 0x0523, 0x0523 },
+ { 0x0561, 0x0586 },
+ { 0x1D79, 0x1D79 },
+ { 0x1D7D, 0x1D7D },
+ { 0x1E01, 0x1E01 },
+ { 0x1E03, 0x1E03 },
+ { 0x1E05, 0x1E05 },
+ { 0x1E07, 0x1E07 },
+ { 0x1E09, 0x1E09 },
+ { 0x1E0B, 0x1E0B },
+ { 0x1E0D, 0x1E0D },
+ { 0x1E0F, 0x1E0F },
+ { 0x1E11, 0x1E11 },
+ { 0x1E13, 0x1E13 },
+ { 0x1E15, 0x1E15 },
+ { 0x1E17, 0x1E17 },
+ { 0x1E19, 0x1E19 },
+ { 0x1E1B, 0x1E1B },
+ { 0x1E1D, 0x1E1D },
+ { 0x1E1F, 0x1E1F },
+ { 0x1E21, 0x1E21 },
+ { 0x1E23, 0x1E23 },
+ { 0x1E25, 0x1E25 },
+ { 0x1E27, 0x1E27 },
+ { 0x1E29, 0x1E29 },
+ { 0x1E2B, 0x1E2B },
+ { 0x1E2D, 0x1E2D },
+ { 0x1E2F, 0x1E2F },
+ { 0x1E31, 0x1E31 },
+ { 0x1E33, 0x1E33 },
+ { 0x1E35, 0x1E35 },
+ { 0x1E37, 0x1E37 },
+ { 0x1E39, 0x1E39 },
+ { 0x1E3B, 0x1E3B },
+ { 0x1E3D, 0x1E3D },
+ { 0x1E3F, 0x1E3F },
+ { 0x1E41, 0x1E41 },
+ { 0x1E43, 0x1E43 },
+ { 0x1E45, 0x1E45 },
+ { 0x1E47, 0x1E47 },
+ { 0x1E49, 0x1E49 },
+ { 0x1E4B, 0x1E4B },
+ { 0x1E4D, 0x1E4D },
+ { 0x1E4F, 0x1E4F },
+ { 0x1E51, 0x1E51 },
+ { 0x1E53, 0x1E53 },
+ { 0x1E55, 0x1E55 },
+ { 0x1E57, 0x1E57 },
+ { 0x1E59, 0x1E59 },
+ { 0x1E5B, 0x1E5B },
+ { 0x1E5D, 0x1E5D },
+ { 0x1E5F, 0x1E5F },
+ { 0x1E61, 0x1E61 },
+ { 0x1E63, 0x1E63 },
+ { 0x1E65, 0x1E65 },
+ { 0x1E67, 0x1E67 },
+ { 0x1E69, 0x1E69 },
+ { 0x1E6B, 0x1E6B },
+ { 0x1E6D, 0x1E6D },
+ { 0x1E6F, 0x1E6F },
+ { 0x1E71, 0x1E71 },
+ { 0x1E73, 0x1E73 },
+ { 0x1E75, 0x1E75 },
+ { 0x1E77, 0x1E77 },
+ { 0x1E79, 0x1E79 },
+ { 0x1E7B, 0x1E7B },
+ { 0x1E7D, 0x1E7D },
+ { 0x1E7F, 0x1E7F },
+ { 0x1E81, 0x1E81 },
+ { 0x1E83, 0x1E83 },
+ { 0x1E85, 0x1E85 },
+ { 0x1E87, 0x1E87 },
+ { 0x1E89, 0x1E89 },
+ { 0x1E8B, 0x1E8B },
+ { 0x1E8D, 0x1E8D },
+ { 0x1E8F, 0x1E8F },
+ { 0x1E91, 0x1E91 },
+ { 0x1E93, 0x1E93 },
+ { 0x1E95, 0x1E95 },
+ { 0x1E9B, 0x1E9B },
+ { 0x1EA1, 0x1EA1 },
+ { 0x1EA3, 0x1EA3 },
+ { 0x1EA5, 0x1EA5 },
+ { 0x1EA7, 0x1EA7 },
+ { 0x1EA9, 0x1EA9 },
+ { 0x1EAB, 0x1EAB },
+ { 0x1EAD, 0x1EAD },
+ { 0x1EAF, 0x1EAF },
+ { 0x1EB1, 0x1EB1 },
+ { 0x1EB3, 0x1EB3 },
+ { 0x1EB5, 0x1EB5 },
+ { 0x1EB7, 0x1EB7 },
+ { 0x1EB9, 0x1EB9 },
+ { 0x1EBB, 0x1EBB },
+ { 0x1EBD, 0x1EBD },
+ { 0x1EBF, 0x1EBF },
+ { 0x1EC1, 0x1EC1 },
+ { 0x1EC3, 0x1EC3 },
+ { 0x1EC5, 0x1EC5 },
+ { 0x1EC7, 0x1EC7 },
+ { 0x1EC9, 0x1EC9 },
+ { 0x1ECB, 0x1ECB },
+ { 0x1ECD, 0x1ECD },
+ { 0x1ECF, 0x1ECF },
+ { 0x1ED1, 0x1ED1 },
+ { 0x1ED3, 0x1ED3 },
+ { 0x1ED5, 0x1ED5 },
+ { 0x1ED7, 0x1ED7 },
+ { 0x1ED9, 0x1ED9 },
+ { 0x1EDB, 0x1EDB },
+ { 0x1EDD, 0x1EDD },
+ { 0x1EDF, 0x1EDF },
+ { 0x1EE1, 0x1EE1 },
+ { 0x1EE3, 0x1EE3 },
+ { 0x1EE5, 0x1EE5 },
+ { 0x1EE7, 0x1EE7 },
+ { 0x1EE9, 0x1EE9 },
+ { 0x1EEB, 0x1EEB },
+ { 0x1EED, 0x1EED },
+ { 0x1EEF, 0x1EEF },
+ { 0x1EF1, 0x1EF1 },
+ { 0x1EF3, 0x1EF3 },
+ { 0x1EF5, 0x1EF5 },
+ { 0x1EF7, 0x1EF7 },
+ { 0x1EF9, 0x1EF9 },
+ { 0x1EFB, 0x1EFB },
+ { 0x1EFD, 0x1EFD },
+ { 0x1EFF, 0x1F07 },
+ { 0x1F10, 0x1F15 },
+ { 0x1F20, 0x1F27 },
+ { 0x1F30, 0x1F37 },
+ { 0x1F40, 0x1F45 },
+ { 0x1F51, 0x1F51 },
+ { 0x1F53, 0x1F53 },
+ { 0x1F55, 0x1F55 },
+ { 0x1F57, 0x1F57 },
+ { 0x1F60, 0x1F67 },
+ { 0x1F70, 0x1F7D },
+ { 0x1F80, 0x1F87 },
+ { 0x1F90, 0x1F97 },
+ { 0x1FA0, 0x1FA7 },
+ { 0x1FB0, 0x1FB1 },
+ { 0x1FB3, 0x1FB3 },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC3, 0x1FC3 },
+ { 0x1FD0, 0x1FD1 },
+ { 0x1FE0, 0x1FE1 },
+ { 0x1FE5, 0x1FE5 },
+ { 0x1FF3, 0x1FF3 },
+ { 0x214E, 0x214E },
+ { 0x2170, 0x217F },
+ { 0x2184, 0x2184 },
+ { 0x24D0, 0x24E9 },
+ { 0x2C30, 0x2C5E },
+ { 0x2C61, 0x2C61 },
+ { 0x2C65, 0x2C66 },
+ { 0x2C68, 0x2C68 },
+ { 0x2C6A, 0x2C6A },
+ { 0x2C6C, 0x2C6C },
+ { 0x2C73, 0x2C73 },
+ { 0x2C76, 0x2C76 },
+ { 0x2C81, 0x2C81 },
+ { 0x2C83, 0x2C83 },
+ { 0x2C85, 0x2C85 },
+ { 0x2C87, 0x2C87 },
+ { 0x2C89, 0x2C89 },
+ { 0x2C8B, 0x2C8B },
+ { 0x2C8D, 0x2C8D },
+ { 0x2C8F, 0x2C8F },
+ { 0x2C91, 0x2C91 },
+ { 0x2C93, 0x2C93 },
+ { 0x2C95, 0x2C95 },
+ { 0x2C97, 0x2C97 },
+ { 0x2C99, 0x2C99 },
+ { 0x2C9B, 0x2C9B },
+ { 0x2C9D, 0x2C9D },
+ { 0x2C9F, 0x2C9F },
+ { 0x2CA1, 0x2CA1 },
+ { 0x2CA3, 0x2CA3 },
+ { 0x2CA5, 0x2CA5 },
+ { 0x2CA7, 0x2CA7 },
+ { 0x2CA9, 0x2CA9 },
+ { 0x2CAB, 0x2CAB },
+ { 0x2CAD, 0x2CAD },
+ { 0x2CAF, 0x2CAF },
+ { 0x2CB1, 0x2CB1 },
+ { 0x2CB3, 0x2CB3 },
+ { 0x2CB5, 0x2CB5 },
+ { 0x2CB7, 0x2CB7 },
+ { 0x2CB9, 0x2CB9 },
+ { 0x2CBB, 0x2CBB },
+ { 0x2CBD, 0x2CBD },
+ { 0x2CBF, 0x2CBF },
+ { 0x2CC1, 0x2CC1 },
+ { 0x2CC3, 0x2CC3 },
+ { 0x2CC5, 0x2CC5 },
+ { 0x2CC7, 0x2CC7 },
+ { 0x2CC9, 0x2CC9 },
+ { 0x2CCB, 0x2CCB },
+ { 0x2CCD, 0x2CCD },
+ { 0x2CCF, 0x2CCF },
+ { 0x2CD1, 0x2CD1 },
+ { 0x2CD3, 0x2CD3 },
+ { 0x2CD5, 0x2CD5 },
+ { 0x2CD7, 0x2CD7 },
+ { 0x2CD9, 0x2CD9 },
+ { 0x2CDB, 0x2CDB },
+ { 0x2CDD, 0x2CDD },
+ { 0x2CDF, 0x2CDF },
+ { 0x2CE1, 0x2CE1 },
+ { 0x2CE3, 0x2CE3 },
+ { 0x2D00, 0x2D25 },
+ { 0xA641, 0xA641 },
+ { 0xA643, 0xA643 },
+ { 0xA645, 0xA645 },
+ { 0xA647, 0xA647 },
+ { 0xA649, 0xA649 },
+ { 0xA64B, 0xA64B },
+ { 0xA64D, 0xA64D },
+ { 0xA64F, 0xA64F },
+ { 0xA651, 0xA651 },
+ { 0xA653, 0xA653 },
+ { 0xA655, 0xA655 },
+ { 0xA657, 0xA657 },
+ { 0xA659, 0xA659 },
+ { 0xA65B, 0xA65B },
+ { 0xA65D, 0xA65D },
+ { 0xA65F, 0xA65F },
+ { 0xA663, 0xA663 },
+ { 0xA665, 0xA665 },
+ { 0xA667, 0xA667 },
+ { 0xA669, 0xA669 },
+ { 0xA66B, 0xA66B },
+ { 0xA66D, 0xA66D },
+ { 0xA681, 0xA681 },
+ { 0xA683, 0xA683 },
+ { 0xA685, 0xA685 },
+ { 0xA687, 0xA687 },
+ { 0xA689, 0xA689 },
+ { 0xA68B, 0xA68B },
+ { 0xA68D, 0xA68D },
+ { 0xA68F, 0xA68F },
+ { 0xA691, 0xA691 },
+ { 0xA693, 0xA693 },
+ { 0xA695, 0xA695 },
+ { 0xA697, 0xA697 },
+ { 0xA723, 0xA723 },
+ { 0xA725, 0xA725 },
+ { 0xA727, 0xA727 },
+ { 0xA729, 0xA729 },
+ { 0xA72B, 0xA72B },
+ { 0xA72D, 0xA72D },
+ { 0xA72F, 0xA72F },
+ { 0xA733, 0xA733 },
+ { 0xA735, 0xA735 },
+ { 0xA737, 0xA737 },
+ { 0xA739, 0xA739 },
+ { 0xA73B, 0xA73B },
+ { 0xA73D, 0xA73D },
+ { 0xA73F, 0xA73F },
+ { 0xA741, 0xA741 },
+ { 0xA743, 0xA743 },
+ { 0xA745, 0xA745 },
+ { 0xA747, 0xA747 },
+ { 0xA749, 0xA749 },
+ { 0xA74B, 0xA74B },
+ { 0xA74D, 0xA74D },
+ { 0xA74F, 0xA74F },
+ { 0xA751, 0xA751 },
+ { 0xA753, 0xA753 },
+ { 0xA755, 0xA755 },
+ { 0xA757, 0xA757 },
+ { 0xA759, 0xA759 },
+ { 0xA75B, 0xA75B },
+ { 0xA75D, 0xA75D },
+ { 0xA75F, 0xA75F },
+ { 0xA761, 0xA761 },
+ { 0xA763, 0xA763 },
+ { 0xA765, 0xA765 },
+ { 0xA767, 0xA767 },
+ { 0xA769, 0xA769 },
+ { 0xA76B, 0xA76B },
+ { 0xA76D, 0xA76D },
+ { 0xA76F, 0xA76F },
+ { 0xA77A, 0xA77A },
+ { 0xA77C, 0xA77C },
+ { 0xA77F, 0xA77F },
+ { 0xA781, 0xA781 },
+ { 0xA783, 0xA783 },
+ { 0xA785, 0xA785 },
+ { 0xA787, 0xA787 },
+ { 0xA78C, 0xA78C },
+ { 0xFF41, 0xFF5A },
+ { 0x10428, 0x1044F }
+
+#define PREDICATE(c) uc_is_lower (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_print.c b/gnulib/tests/unictype/test-ctype_print.c
new file mode 100644
index 00000000..7333d75e
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_print.c
@@ -0,0 +1,469 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0020, 0x007E },
+ { 0x00A0, 0x0377 },
+ { 0x037A, 0x037E },
+ { 0x0384, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x055F },
+ { 0x0561, 0x0587 },
+ { 0x0589, 0x058A },
+ { 0x0591, 0x05C7 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F4 },
+ { 0x0600, 0x0603 },
+ { 0x0606, 0x061B },
+ { 0x061E, 0x061F },
+ { 0x0621, 0x065E },
+ { 0x0660, 0x070D },
+ { 0x070F, 0x074A },
+ { 0x074D, 0x07B1 },
+ { 0x07C0, 0x07FA },
+ { 0x0901, 0x0939 },
+ { 0x093C, 0x094D },
+ { 0x0950, 0x0954 },
+ { 0x0958, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0981, 0x0983 },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BC, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CE },
+ { 0x09D7, 0x09D7 },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E3 },
+ { 0x09E6, 0x09FA },
+ { 0x0A01, 0x0A03 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A66, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABC, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE3 },
+ { 0x0AE6, 0x0AEF },
+ { 0x0AF1, 0x0AF1 },
+ { 0x0B01, 0x0B03 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3C, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4D },
+ { 0x0B56, 0x0B57 },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B63 },
+ { 0x0B66, 0x0B71 },
+ { 0x0B82, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCD },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0BE6, 0x0BFA },
+ { 0x0C01, 0x0C03 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C63 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C78, 0x0C7F },
+ { 0x0C82, 0x0C83 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBC, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCD },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE3 },
+ { 0x0CE6, 0x0CEF },
+ { 0x0CF1, 0x0CF2 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4D },
+ { 0x0D57, 0x0D57 },
+ { 0x0D60, 0x0D63 },
+ { 0x0D66, 0x0D75 },
+ { 0x0D79, 0x0D7F },
+ { 0x0D82, 0x0D83 },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF4 },
+ { 0x0E01, 0x0E3A },
+ { 0x0E3F, 0x0E5B },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB9 },
+ { 0x0EBB, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0EC8, 0x0ECD },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F71, 0x0F8B },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FBE, 0x0FCC },
+ { 0x0FCE, 0x0FD4 },
+ { 0x1000, 0x1099 },
+ { 0x109E, 0x10C5 },
+ { 0x10D0, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x135F, 0x137C },
+ { 0x1380, 0x1399 },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x1676 },
+ { 0x1680, 0x169C },
+ { 0x16A0, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1714 },
+ { 0x1720, 0x1736 },
+ { 0x1740, 0x1753 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1772, 0x1773 },
+ { 0x1780, 0x17DD },
+ { 0x17E0, 0x17E9 },
+ { 0x17F0, 0x17F9 },
+ { 0x1800, 0x180E },
+ { 0x1810, 0x1819 },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x193B },
+ { 0x1940, 0x1940 },
+ { 0x1944, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19B0, 0x19C9 },
+ { 0x19D0, 0x19D9 },
+ { 0x19DE, 0x1A1B },
+ { 0x1A1E, 0x1A1F },
+ { 0x1B00, 0x1B4B },
+ { 0x1B50, 0x1B7C },
+ { 0x1B80, 0x1BAA },
+ { 0x1BAE, 0x1BB9 },
+ { 0x1C00, 0x1C37 },
+ { 0x1C3B, 0x1C49 },
+ { 0x1C4D, 0x1C7F },
+ { 0x1D00, 0x1DE6 },
+ { 0x1DFE, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FC4 },
+ { 0x1FC6, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FDD, 0x1FEF },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFE },
+ { 0x2000, 0x2027 },
+ { 0x202A, 0x2064 },
+ { 0x206A, 0x2071 },
+ { 0x2074, 0x208E },
+ { 0x2090, 0x2094 },
+ { 0x20A0, 0x20B5 },
+ { 0x20D0, 0x20F0 },
+ { 0x2100, 0x214F },
+ { 0x2153, 0x2188 },
+ { 0x2190, 0x23E7 },
+ { 0x2400, 0x2426 },
+ { 0x2440, 0x244A },
+ { 0x2460, 0x269D },
+ { 0x26A0, 0x26BC },
+ { 0x26C0, 0x26C3 },
+ { 0x2701, 0x2704 },
+ { 0x2706, 0x2709 },
+ { 0x270C, 0x2727 },
+ { 0x2729, 0x274B },
+ { 0x274D, 0x274D },
+ { 0x274F, 0x2752 },
+ { 0x2756, 0x2756 },
+ { 0x2758, 0x275E },
+ { 0x2761, 0x2794 },
+ { 0x2798, 0x27AF },
+ { 0x27B1, 0x27BE },
+ { 0x27C0, 0x27CA },
+ { 0x27CC, 0x27CC },
+ { 0x27D0, 0x2B4C },
+ { 0x2B50, 0x2B54 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CEA },
+ { 0x2CF9, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2DE0, 0x2E30 },
+ { 0x2E80, 0x2E99 },
+ { 0x2E9B, 0x2EF3 },
+ { 0x2F00, 0x2FD5 },
+ { 0x2FF0, 0x2FFB },
+ { 0x3000, 0x303F },
+ { 0x3041, 0x3096 },
+ { 0x3099, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x3190, 0x31B7 },
+ { 0x31C0, 0x31E3 },
+ { 0x31F0, 0x321E },
+ { 0x3220, 0x3243 },
+ { 0x3250, 0x32FE },
+ { 0x3300, 0x4DB5 },
+ { 0x4DC0, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA490, 0xA4C6 },
+ { 0xA500, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA673 },
+ { 0xA67C, 0xA697 },
+ { 0xA700, 0xA78C },
+ { 0xA7FB, 0xA82B },
+ { 0xA840, 0xA877 },
+ { 0xA880, 0xA8C4 },
+ { 0xA8CE, 0xA8D9 },
+ { 0xA900, 0xA953 },
+ { 0xA95F, 0xA95F },
+ { 0xAA00, 0xAA36 },
+ { 0xAA40, 0xAA4D },
+ { 0xAA50, 0xAA59 },
+ { 0xAA5C, 0xAA5F },
+ { 0xAC00, 0xD7A3 },
+ { 0xE000, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3F },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFD },
+ { 0xFE00, 0xFE19 },
+ { 0xFE20, 0xFE26 },
+ { 0xFE30, 0xFE52 },
+ { 0xFE54, 0xFE66 },
+ { 0xFE68, 0xFE6B },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFEFF, 0xFEFF },
+ { 0xFF01, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0xFFE0, 0xFFE6 },
+ { 0xFFE8, 0xFFEE },
+ { 0xFFF9, 0xFFFD },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10100, 0x10102 },
+ { 0x10107, 0x10133 },
+ { 0x10137, 0x1018A },
+ { 0x10190, 0x1019B },
+ { 0x101D0, 0x101FD },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10320, 0x10323 },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x1039F, 0x103C3 },
+ { 0x103C8, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x104A0, 0x104A9 },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10919 },
+ { 0x1091F, 0x10939 },
+ { 0x1093F, 0x1093F },
+ { 0x10A00, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A47 },
+ { 0x10A50, 0x10A58 },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x12470, 0x12473 },
+ { 0x1D000, 0x1D0F5 },
+ { 0x1D100, 0x1D126 },
+ { 0x1D129, 0x1D1DD },
+ { 0x1D200, 0x1D245 },
+ { 0x1D300, 0x1D356 },
+ { 0x1D360, 0x1D371 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF },
+ { 0x1F000, 0x1F02B },
+ { 0x1F030, 0x1F093 },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F },
+ { 0xE0100, 0xE01EF },
+ { 0xF0000, 0xFFFFD },
+ { 0x100000, 0x10FFFD }
+
+#define PREDICATE(c) uc_is_print (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_punct.c b/gnulib/tests/unictype/test-ctype_punct.c
new file mode 100644
index 00000000..e9aa3f0b
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_punct.c
@@ -0,0 +1,354 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x002F },
+ { 0x003A, 0x0040 },
+ { 0x005B, 0x0060 },
+ { 0x007B, 0x007E },
+ { 0x00A0, 0x00A9 },
+ { 0x00AB, 0x00B4 },
+ { 0x00B6, 0x00B9 },
+ { 0x00BB, 0x00BF },
+ { 0x00D7, 0x00D7 },
+ { 0x00F7, 0x00F7 },
+ { 0x02C2, 0x02C5 },
+ { 0x02D2, 0x02DF },
+ { 0x02E5, 0x02EB },
+ { 0x02ED, 0x02ED },
+ { 0x02EF, 0x0344 },
+ { 0x0346, 0x036F },
+ { 0x0375, 0x0375 },
+ { 0x037E, 0x037E },
+ { 0x0384, 0x0385 },
+ { 0x0387, 0x0387 },
+ { 0x03F6, 0x03F6 },
+ { 0x0482, 0x0489 },
+ { 0x055A, 0x055F },
+ { 0x0589, 0x058A },
+ { 0x0591, 0x05C7 },
+ { 0x05F3, 0x05F4 },
+ { 0x0600, 0x0603 },
+ { 0x0606, 0x061B },
+ { 0x061E, 0x061F },
+ { 0x064B, 0x065E },
+ { 0x066A, 0x066D },
+ { 0x0670, 0x0670 },
+ { 0x06D4, 0x06D4 },
+ { 0x06D6, 0x06E4 },
+ { 0x06E7, 0x06ED },
+ { 0x06FD, 0x06FE },
+ { 0x0700, 0x070D },
+ { 0x070F, 0x070F },
+ { 0x0711, 0x0711 },
+ { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 },
+ { 0x07EB, 0x07F3 },
+ { 0x07F6, 0x07F9 },
+ { 0x0901, 0x0903 },
+ { 0x093C, 0x093C },
+ { 0x093E, 0x094D },
+ { 0x0951, 0x0954 },
+ { 0x0962, 0x0965 },
+ { 0x0970, 0x0970 },
+ { 0x0981, 0x0983 },
+ { 0x09BC, 0x09BC },
+ { 0x09BE, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CD },
+ { 0x09D7, 0x09D7 },
+ { 0x09E2, 0x09E3 },
+ { 0x09F2, 0x09FA },
+ { 0x0A01, 0x0A03 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0ABC, 0x0ABC },
+ { 0x0ABE, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACD },
+ { 0x0AE2, 0x0AE3 },
+ { 0x0AF1, 0x0AF1 },
+ { 0x0B01, 0x0B03 },
+ { 0x0B3C, 0x0B3C },
+ { 0x0B3E, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4D },
+ { 0x0B56, 0x0B57 },
+ { 0x0B62, 0x0B63 },
+ { 0x0B70, 0x0B70 },
+ { 0x0B82, 0x0B82 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCD },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0BF0, 0x0BFA },
+ { 0x0C01, 0x0C03 },
+ { 0x0C3E, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C62, 0x0C63 },
+ { 0x0C78, 0x0C7F },
+ { 0x0C82, 0x0C83 },
+ { 0x0CBC, 0x0CBC },
+ { 0x0CBE, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCD },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CE2, 0x0CE3 },
+ { 0x0CF1, 0x0CF2 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D3E, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4D },
+ { 0x0D57, 0x0D57 },
+ { 0x0D62, 0x0D63 },
+ { 0x0D70, 0x0D75 },
+ { 0x0D79, 0x0D79 },
+ { 0x0D82, 0x0D83 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF4 },
+ { 0x0E2F, 0x0E2F },
+ { 0x0E3F, 0x0E3F },
+ { 0x0E46, 0x0E46 },
+ { 0x0E4F, 0x0E4F },
+ { 0x0E5A, 0x0E5B },
+ { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 },
+ { 0x0EBB, 0x0EBC },
+ { 0x0EC8, 0x0ECD },
+ { 0x0F01, 0x0F1F },
+ { 0x0F2A, 0x0F3F },
+ { 0x0F71, 0x0F87 },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FBE, 0x0FCC },
+ { 0x0FCE, 0x0FD4 },
+ { 0x102B, 0x103E },
+ { 0x104A, 0x104F },
+ { 0x1056, 0x1059 },
+ { 0x105E, 0x1060 },
+ { 0x1062, 0x1064 },
+ { 0x1067, 0x106D },
+ { 0x1071, 0x1074 },
+ { 0x1082, 0x108D },
+ { 0x108F, 0x108F },
+ { 0x109E, 0x109F },
+ { 0x10FB, 0x10FB },
+ { 0x135F, 0x137C },
+ { 0x1390, 0x1399 },
+ { 0x166D, 0x166E },
+ { 0x169B, 0x169C },
+ { 0x16EB, 0x16ED },
+ { 0x1712, 0x1714 },
+ { 0x1732, 0x1736 },
+ { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 },
+ { 0x17B4, 0x17D6 },
+ { 0x17D8, 0x17DB },
+ { 0x17DD, 0x17DD },
+ { 0x17F0, 0x17F9 },
+ { 0x1800, 0x180D },
+ { 0x18A9, 0x18A9 },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x193B },
+ { 0x1940, 0x1940 },
+ { 0x1944, 0x1945 },
+ { 0x19B0, 0x19C0 },
+ { 0x19C8, 0x19C9 },
+ { 0x19DE, 0x19FF },
+ { 0x1A17, 0x1A1B },
+ { 0x1A1E, 0x1A1F },
+ { 0x1B00, 0x1B04 },
+ { 0x1B34, 0x1B44 },
+ { 0x1B5A, 0x1B7C },
+ { 0x1B80, 0x1B82 },
+ { 0x1BA1, 0x1BAA },
+ { 0x1C24, 0x1C37 },
+ { 0x1C3B, 0x1C3F },
+ { 0x1C7E, 0x1C7F },
+ { 0x1DC0, 0x1DE6 },
+ { 0x1DFE, 0x1DFF },
+ { 0x1FBD, 0x1FBD },
+ { 0x1FBF, 0x1FC1 },
+ { 0x1FCD, 0x1FCF },
+ { 0x1FDD, 0x1FDF },
+ { 0x1FED, 0x1FEF },
+ { 0x1FFD, 0x1FFE },
+ { 0x2007, 0x2007 },
+ { 0x200B, 0x2027 },
+ { 0x202A, 0x205E },
+ { 0x2060, 0x2064 },
+ { 0x206A, 0x2070 },
+ { 0x2074, 0x207E },
+ { 0x2080, 0x208E },
+ { 0x20A0, 0x20B5 },
+ { 0x20D0, 0x20F0 },
+ { 0x2100, 0x2101 },
+ { 0x2103, 0x2106 },
+ { 0x2108, 0x2109 },
+ { 0x2114, 0x2114 },
+ { 0x2116, 0x2118 },
+ { 0x211E, 0x2123 },
+ { 0x2125, 0x2125 },
+ { 0x2127, 0x2127 },
+ { 0x212E, 0x212E },
+ { 0x213A, 0x213B },
+ { 0x2140, 0x2144 },
+ { 0x214A, 0x214D },
+ { 0x214F, 0x214F },
+ { 0x2153, 0x215F },
+ { 0x2190, 0x23E7 },
+ { 0x2400, 0x2426 },
+ { 0x2440, 0x244A },
+ { 0x2460, 0x249B },
+ { 0x24EA, 0x269D },
+ { 0x26A0, 0x26BC },
+ { 0x26C0, 0x26C3 },
+ { 0x2701, 0x2704 },
+ { 0x2706, 0x2709 },
+ { 0x270C, 0x2727 },
+ { 0x2729, 0x274B },
+ { 0x274D, 0x274D },
+ { 0x274F, 0x2752 },
+ { 0x2756, 0x2756 },
+ { 0x2758, 0x275E },
+ { 0x2761, 0x2794 },
+ { 0x2798, 0x27AF },
+ { 0x27B1, 0x27BE },
+ { 0x27C0, 0x27CA },
+ { 0x27CC, 0x27CC },
+ { 0x27D0, 0x2B4C },
+ { 0x2B50, 0x2B54 },
+ { 0x2CE5, 0x2CEA },
+ { 0x2CF9, 0x2CFF },
+ { 0x2DE0, 0x2E2E },
+ { 0x2E30, 0x2E30 },
+ { 0x2E80, 0x2E99 },
+ { 0x2E9B, 0x2EF3 },
+ { 0x2F00, 0x2FD5 },
+ { 0x2FF0, 0x2FFB },
+ { 0x3001, 0x3004 },
+ { 0x3008, 0x3020 },
+ { 0x302A, 0x3030 },
+ { 0x3036, 0x3037 },
+ { 0x303D, 0x303F },
+ { 0x3099, 0x309C },
+ { 0x30A0, 0x30A0 },
+ { 0x30FB, 0x30FB },
+ { 0x3190, 0x319F },
+ { 0x31C0, 0x31E3 },
+ { 0x3200, 0x321E },
+ { 0x3220, 0x3243 },
+ { 0x3250, 0x32FE },
+ { 0x3300, 0x33FF },
+ { 0x4DC0, 0x4DFF },
+ { 0xA490, 0xA4C6 },
+ { 0xA60D, 0xA60F },
+ { 0xA66F, 0xA673 },
+ { 0xA67C, 0xA67E },
+ { 0xA700, 0xA716 },
+ { 0xA720, 0xA721 },
+ { 0xA789, 0xA78A },
+ { 0xA802, 0xA802 },
+ { 0xA806, 0xA806 },
+ { 0xA80B, 0xA80B },
+ { 0xA823, 0xA82B },
+ { 0xA874, 0xA877 },
+ { 0xA880, 0xA881 },
+ { 0xA8B4, 0xA8C4 },
+ { 0xA8CE, 0xA8CF },
+ { 0xA926, 0xA92F },
+ { 0xA947, 0xA953 },
+ { 0xA95F, 0xA95F },
+ { 0xAA29, 0xAA36 },
+ { 0xAA43, 0xAA43 },
+ { 0xAA4C, 0xAA4D },
+ { 0xAA5C, 0xAA5F },
+ { 0xE000, 0xF8FF },
+ { 0xFB1E, 0xFB1E },
+ { 0xFB29, 0xFB29 },
+ { 0xFD3E, 0xFD3F },
+ { 0xFDFC, 0xFDFD },
+ { 0xFE00, 0xFE19 },
+ { 0xFE20, 0xFE26 },
+ { 0xFE30, 0xFE52 },
+ { 0xFE54, 0xFE66 },
+ { 0xFE68, 0xFE6B },
+ { 0xFEFF, 0xFEFF },
+ { 0xFF01, 0xFF0F },
+ { 0xFF1A, 0xFF20 },
+ { 0xFF3B, 0xFF40 },
+ { 0xFF5B, 0xFF65 },
+ { 0xFFE0, 0xFFE6 },
+ { 0xFFE8, 0xFFEE },
+ { 0xFFF9, 0xFFFD },
+ { 0x10100, 0x10102 },
+ { 0x10107, 0x10133 },
+ { 0x10137, 0x1013F },
+ { 0x10175, 0x1018A },
+ { 0x10190, 0x1019B },
+ { 0x101D0, 0x101FD },
+ { 0x10320, 0x10323 },
+ { 0x1039F, 0x1039F },
+ { 0x103D0, 0x103D0 },
+ { 0x10916, 0x10919 },
+ { 0x1091F, 0x1091F },
+ { 0x1093F, 0x1093F },
+ { 0x10A01, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A47 },
+ { 0x10A50, 0x10A58 },
+ { 0x12470, 0x12473 },
+ { 0x1D000, 0x1D0F5 },
+ { 0x1D100, 0x1D126 },
+ { 0x1D129, 0x1D1DD },
+ { 0x1D200, 0x1D245 },
+ { 0x1D300, 0x1D356 },
+ { 0x1D360, 0x1D371 },
+ { 0x1D6C1, 0x1D6C1 },
+ { 0x1D6DB, 0x1D6DB },
+ { 0x1D6FB, 0x1D6FB },
+ { 0x1D715, 0x1D715 },
+ { 0x1D735, 0x1D735 },
+ { 0x1D74F, 0x1D74F },
+ { 0x1D76F, 0x1D76F },
+ { 0x1D789, 0x1D789 },
+ { 0x1D7A9, 0x1D7A9 },
+ { 0x1D7C3, 0x1D7C3 },
+ { 0x1F000, 0x1F02B },
+ { 0x1F030, 0x1F093 },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F },
+ { 0xE0100, 0xE01EF },
+ { 0xF0000, 0xFFFFD },
+ { 0x100000, 0x10FFFD }
+
+#define PREDICATE(c) uc_is_punct (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_space.c b/gnulib/tests/unictype/test-ctype_space.c
new file mode 100644
index 00000000..c02fa963
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_space.c
@@ -0,0 +1,31 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0009, 0x000D },
+ { 0x0020, 0x0020 },
+ { 0x1680, 0x1680 },
+ { 0x180E, 0x180E },
+ { 0x2000, 0x2006 },
+ { 0x2008, 0x200A },
+ { 0x2028, 0x2029 },
+ { 0x205F, 0x205F },
+ { 0x3000, 0x3000 }
+
+#define PREDICATE(c) uc_is_space (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_upper.c b/gnulib/tests/unictype/test-ctype_upper.c
new file mode 100644
index 00000000..d7f0c035
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_upper.c
@@ -0,0 +1,576 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00DE },
+ { 0x0100, 0x0100 },
+ { 0x0102, 0x0102 },
+ { 0x0104, 0x0104 },
+ { 0x0106, 0x0106 },
+ { 0x0108, 0x0108 },
+ { 0x010A, 0x010A },
+ { 0x010C, 0x010C },
+ { 0x010E, 0x010E },
+ { 0x0110, 0x0110 },
+ { 0x0112, 0x0112 },
+ { 0x0114, 0x0114 },
+ { 0x0116, 0x0116 },
+ { 0x0118, 0x0118 },
+ { 0x011A, 0x011A },
+ { 0x011C, 0x011C },
+ { 0x011E, 0x011E },
+ { 0x0120, 0x0120 },
+ { 0x0122, 0x0122 },
+ { 0x0124, 0x0124 },
+ { 0x0126, 0x0126 },
+ { 0x0128, 0x0128 },
+ { 0x012A, 0x012A },
+ { 0x012C, 0x012C },
+ { 0x012E, 0x012E },
+ { 0x0130, 0x0130 },
+ { 0x0132, 0x0132 },
+ { 0x0134, 0x0134 },
+ { 0x0136, 0x0136 },
+ { 0x0139, 0x0139 },
+ { 0x013B, 0x013B },
+ { 0x013D, 0x013D },
+ { 0x013F, 0x013F },
+ { 0x0141, 0x0141 },
+ { 0x0143, 0x0143 },
+ { 0x0145, 0x0145 },
+ { 0x0147, 0x0147 },
+ { 0x014A, 0x014A },
+ { 0x014C, 0x014C },
+ { 0x014E, 0x014E },
+ { 0x0150, 0x0150 },
+ { 0x0152, 0x0152 },
+ { 0x0154, 0x0154 },
+ { 0x0156, 0x0156 },
+ { 0x0158, 0x0158 },
+ { 0x015A, 0x015A },
+ { 0x015C, 0x015C },
+ { 0x015E, 0x015E },
+ { 0x0160, 0x0160 },
+ { 0x0162, 0x0162 },
+ { 0x0164, 0x0164 },
+ { 0x0166, 0x0166 },
+ { 0x0168, 0x0168 },
+ { 0x016A, 0x016A },
+ { 0x016C, 0x016C },
+ { 0x016E, 0x016E },
+ { 0x0170, 0x0170 },
+ { 0x0172, 0x0172 },
+ { 0x0174, 0x0174 },
+ { 0x0176, 0x0176 },
+ { 0x0178, 0x0179 },
+ { 0x017B, 0x017B },
+ { 0x017D, 0x017D },
+ { 0x0181, 0x0182 },
+ { 0x0184, 0x0184 },
+ { 0x0186, 0x0187 },
+ { 0x0189, 0x018B },
+ { 0x018E, 0x0191 },
+ { 0x0193, 0x0194 },
+ { 0x0196, 0x0198 },
+ { 0x019C, 0x019D },
+ { 0x019F, 0x01A0 },
+ { 0x01A2, 0x01A2 },
+ { 0x01A4, 0x01A4 },
+ { 0x01A6, 0x01A7 },
+ { 0x01A9, 0x01A9 },
+ { 0x01AC, 0x01AC },
+ { 0x01AE, 0x01AF },
+ { 0x01B1, 0x01B3 },
+ { 0x01B5, 0x01B5 },
+ { 0x01B7, 0x01B8 },
+ { 0x01BC, 0x01BC },
+ { 0x01C4, 0x01C5 },
+ { 0x01C7, 0x01C8 },
+ { 0x01CA, 0x01CB },
+ { 0x01CD, 0x01CD },
+ { 0x01CF, 0x01CF },
+ { 0x01D1, 0x01D1 },
+ { 0x01D3, 0x01D3 },
+ { 0x01D5, 0x01D5 },
+ { 0x01D7, 0x01D7 },
+ { 0x01D9, 0x01D9 },
+ { 0x01DB, 0x01DB },
+ { 0x01DE, 0x01DE },
+ { 0x01E0, 0x01E0 },
+ { 0x01E2, 0x01E2 },
+ { 0x01E4, 0x01E4 },
+ { 0x01E6, 0x01E6 },
+ { 0x01E8, 0x01E8 },
+ { 0x01EA, 0x01EA },
+ { 0x01EC, 0x01EC },
+ { 0x01EE, 0x01EE },
+ { 0x01F1, 0x01F2 },
+ { 0x01F4, 0x01F4 },
+ { 0x01F6, 0x01F8 },
+ { 0x01FA, 0x01FA },
+ { 0x01FC, 0x01FC },
+ { 0x01FE, 0x01FE },
+ { 0x0200, 0x0200 },
+ { 0x0202, 0x0202 },
+ { 0x0204, 0x0204 },
+ { 0x0206, 0x0206 },
+ { 0x0208, 0x0208 },
+ { 0x020A, 0x020A },
+ { 0x020C, 0x020C },
+ { 0x020E, 0x020E },
+ { 0x0210, 0x0210 },
+ { 0x0212, 0x0212 },
+ { 0x0214, 0x0214 },
+ { 0x0216, 0x0216 },
+ { 0x0218, 0x0218 },
+ { 0x021A, 0x021A },
+ { 0x021C, 0x021C },
+ { 0x021E, 0x021E },
+ { 0x0220, 0x0220 },
+ { 0x0222, 0x0222 },
+ { 0x0224, 0x0224 },
+ { 0x0226, 0x0226 },
+ { 0x0228, 0x0228 },
+ { 0x022A, 0x022A },
+ { 0x022C, 0x022C },
+ { 0x022E, 0x022E },
+ { 0x0230, 0x0230 },
+ { 0x0232, 0x0232 },
+ { 0x023A, 0x023B },
+ { 0x023D, 0x023E },
+ { 0x0241, 0x0241 },
+ { 0x0243, 0x0246 },
+ { 0x0248, 0x0248 },
+ { 0x024A, 0x024A },
+ { 0x024C, 0x024C },
+ { 0x024E, 0x024E },
+ { 0x0370, 0x0370 },
+ { 0x0372, 0x0372 },
+ { 0x0376, 0x0376 },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x038F },
+ { 0x0391, 0x03A1 },
+ { 0x03A3, 0x03AB },
+ { 0x03CF, 0x03CF },
+ { 0x03D8, 0x03D8 },
+ { 0x03DA, 0x03DA },
+ { 0x03DC, 0x03DC },
+ { 0x03DE, 0x03DE },
+ { 0x03E0, 0x03E0 },
+ { 0x03E2, 0x03E2 },
+ { 0x03E4, 0x03E4 },
+ { 0x03E6, 0x03E6 },
+ { 0x03E8, 0x03E8 },
+ { 0x03EA, 0x03EA },
+ { 0x03EC, 0x03EC },
+ { 0x03EE, 0x03EE },
+ { 0x03F4, 0x03F4 },
+ { 0x03F7, 0x03F7 },
+ { 0x03F9, 0x03FA },
+ { 0x03FD, 0x042F },
+ { 0x0460, 0x0460 },
+ { 0x0462, 0x0462 },
+ { 0x0464, 0x0464 },
+ { 0x0466, 0x0466 },
+ { 0x0468, 0x0468 },
+ { 0x046A, 0x046A },
+ { 0x046C, 0x046C },
+ { 0x046E, 0x046E },
+ { 0x0470, 0x0470 },
+ { 0x0472, 0x0472 },
+ { 0x0474, 0x0474 },
+ { 0x0476, 0x0476 },
+ { 0x0478, 0x0478 },
+ { 0x047A, 0x047A },
+ { 0x047C, 0x047C },
+ { 0x047E, 0x047E },
+ { 0x0480, 0x0480 },
+ { 0x048A, 0x048A },
+ { 0x048C, 0x048C },
+ { 0x048E, 0x048E },
+ { 0x0490, 0x0490 },
+ { 0x0492, 0x0492 },
+ { 0x0494, 0x0494 },
+ { 0x0496, 0x0496 },
+ { 0x0498, 0x0498 },
+ { 0x049A, 0x049A },
+ { 0x049C, 0x049C },
+ { 0x049E, 0x049E },
+ { 0x04A0, 0x04A0 },
+ { 0x04A2, 0x04A2 },
+ { 0x04A4, 0x04A4 },
+ { 0x04A6, 0x04A6 },
+ { 0x04A8, 0x04A8 },
+ { 0x04AA, 0x04AA },
+ { 0x04AC, 0x04AC },
+ { 0x04AE, 0x04AE },
+ { 0x04B0, 0x04B0 },
+ { 0x04B2, 0x04B2 },
+ { 0x04B4, 0x04B4 },
+ { 0x04B6, 0x04B6 },
+ { 0x04B8, 0x04B8 },
+ { 0x04BA, 0x04BA },
+ { 0x04BC, 0x04BC },
+ { 0x04BE, 0x04BE },
+ { 0x04C0, 0x04C1 },
+ { 0x04C3, 0x04C3 },
+ { 0x04C5, 0x04C5 },
+ { 0x04C7, 0x04C7 },
+ { 0x04C9, 0x04C9 },
+ { 0x04CB, 0x04CB },
+ { 0x04CD, 0x04CD },
+ { 0x04D0, 0x04D0 },
+ { 0x04D2, 0x04D2 },
+ { 0x04D4, 0x04D4 },
+ { 0x04D6, 0x04D6 },
+ { 0x04D8, 0x04D8 },
+ { 0x04DA, 0x04DA },
+ { 0x04DC, 0x04DC },
+ { 0x04DE, 0x04DE },
+ { 0x04E0, 0x04E0 },
+ { 0x04E2, 0x04E2 },
+ { 0x04E4, 0x04E4 },
+ { 0x04E6, 0x04E6 },
+ { 0x04E8, 0x04E8 },
+ { 0x04EA, 0x04EA },
+ { 0x04EC, 0x04EC },
+ { 0x04EE, 0x04EE },
+ { 0x04F0, 0x04F0 },
+ { 0x04F2, 0x04F2 },
+ { 0x04F4, 0x04F4 },
+ { 0x04F6, 0x04F6 },
+ { 0x04F8, 0x04F8 },
+ { 0x04FA, 0x04FA },
+ { 0x04FC, 0x04FC },
+ { 0x04FE, 0x04FE },
+ { 0x0500, 0x0500 },
+ { 0x0502, 0x0502 },
+ { 0x0504, 0x0504 },
+ { 0x0506, 0x0506 },
+ { 0x0508, 0x0508 },
+ { 0x050A, 0x050A },
+ { 0x050C, 0x050C },
+ { 0x050E, 0x050E },
+ { 0x0510, 0x0510 },
+ { 0x0512, 0x0512 },
+ { 0x0514, 0x0514 },
+ { 0x0516, 0x0516 },
+ { 0x0518, 0x0518 },
+ { 0x051A, 0x051A },
+ { 0x051C, 0x051C },
+ { 0x051E, 0x051E },
+ { 0x0520, 0x0520 },
+ { 0x0522, 0x0522 },
+ { 0x0531, 0x0556 },
+ { 0x10A0, 0x10C5 },
+ { 0x1E00, 0x1E00 },
+ { 0x1E02, 0x1E02 },
+ { 0x1E04, 0x1E04 },
+ { 0x1E06, 0x1E06 },
+ { 0x1E08, 0x1E08 },
+ { 0x1E0A, 0x1E0A },
+ { 0x1E0C, 0x1E0C },
+ { 0x1E0E, 0x1E0E },
+ { 0x1E10, 0x1E10 },
+ { 0x1E12, 0x1E12 },
+ { 0x1E14, 0x1E14 },
+ { 0x1E16, 0x1E16 },
+ { 0x1E18, 0x1E18 },
+ { 0x1E1A, 0x1E1A },
+ { 0x1E1C, 0x1E1C },
+ { 0x1E1E, 0x1E1E },
+ { 0x1E20, 0x1E20 },
+ { 0x1E22, 0x1E22 },
+ { 0x1E24, 0x1E24 },
+ { 0x1E26, 0x1E26 },
+ { 0x1E28, 0x1E28 },
+ { 0x1E2A, 0x1E2A },
+ { 0x1E2C, 0x1E2C },
+ { 0x1E2E, 0x1E2E },
+ { 0x1E30, 0x1E30 },
+ { 0x1E32, 0x1E32 },
+ { 0x1E34, 0x1E34 },
+ { 0x1E36, 0x1E36 },
+ { 0x1E38, 0x1E38 },
+ { 0x1E3A, 0x1E3A },
+ { 0x1E3C, 0x1E3C },
+ { 0x1E3E, 0x1E3E },
+ { 0x1E40, 0x1E40 },
+ { 0x1E42, 0x1E42 },
+ { 0x1E44, 0x1E44 },
+ { 0x1E46, 0x1E46 },
+ { 0x1E48, 0x1E48 },
+ { 0x1E4A, 0x1E4A },
+ { 0x1E4C, 0x1E4C },
+ { 0x1E4E, 0x1E4E },
+ { 0x1E50, 0x1E50 },
+ { 0x1E52, 0x1E52 },
+ { 0x1E54, 0x1E54 },
+ { 0x1E56, 0x1E56 },
+ { 0x1E58, 0x1E58 },
+ { 0x1E5A, 0x1E5A },
+ { 0x1E5C, 0x1E5C },
+ { 0x1E5E, 0x1E5E },
+ { 0x1E60, 0x1E60 },
+ { 0x1E62, 0x1E62 },
+ { 0x1E64, 0x1E64 },
+ { 0x1E66, 0x1E66 },
+ { 0x1E68, 0x1E68 },
+ { 0x1E6A, 0x1E6A },
+ { 0x1E6C, 0x1E6C },
+ { 0x1E6E, 0x1E6E },
+ { 0x1E70, 0x1E70 },
+ { 0x1E72, 0x1E72 },
+ { 0x1E74, 0x1E74 },
+ { 0x1E76, 0x1E76 },
+ { 0x1E78, 0x1E78 },
+ { 0x1E7A, 0x1E7A },
+ { 0x1E7C, 0x1E7C },
+ { 0x1E7E, 0x1E7E },
+ { 0x1E80, 0x1E80 },
+ { 0x1E82, 0x1E82 },
+ { 0x1E84, 0x1E84 },
+ { 0x1E86, 0x1E86 },
+ { 0x1E88, 0x1E88 },
+ { 0x1E8A, 0x1E8A },
+ { 0x1E8C, 0x1E8C },
+ { 0x1E8E, 0x1E8E },
+ { 0x1E90, 0x1E90 },
+ { 0x1E92, 0x1E92 },
+ { 0x1E94, 0x1E94 },
+ { 0x1E9E, 0x1E9E },
+ { 0x1EA0, 0x1EA0 },
+ { 0x1EA2, 0x1EA2 },
+ { 0x1EA4, 0x1EA4 },
+ { 0x1EA6, 0x1EA6 },
+ { 0x1EA8, 0x1EA8 },
+ { 0x1EAA, 0x1EAA },
+ { 0x1EAC, 0x1EAC },
+ { 0x1EAE, 0x1EAE },
+ { 0x1EB0, 0x1EB0 },
+ { 0x1EB2, 0x1EB2 },
+ { 0x1EB4, 0x1EB4 },
+ { 0x1EB6, 0x1EB6 },
+ { 0x1EB8, 0x1EB8 },
+ { 0x1EBA, 0x1EBA },
+ { 0x1EBC, 0x1EBC },
+ { 0x1EBE, 0x1EBE },
+ { 0x1EC0, 0x1EC0 },
+ { 0x1EC2, 0x1EC2 },
+ { 0x1EC4, 0x1EC4 },
+ { 0x1EC6, 0x1EC6 },
+ { 0x1EC8, 0x1EC8 },
+ { 0x1ECA, 0x1ECA },
+ { 0x1ECC, 0x1ECC },
+ { 0x1ECE, 0x1ECE },
+ { 0x1ED0, 0x1ED0 },
+ { 0x1ED2, 0x1ED2 },
+ { 0x1ED4, 0x1ED4 },
+ { 0x1ED6, 0x1ED6 },
+ { 0x1ED8, 0x1ED8 },
+ { 0x1EDA, 0x1EDA },
+ { 0x1EDC, 0x1EDC },
+ { 0x1EDE, 0x1EDE },
+ { 0x1EE0, 0x1EE0 },
+ { 0x1EE2, 0x1EE2 },
+ { 0x1EE4, 0x1EE4 },
+ { 0x1EE6, 0x1EE6 },
+ { 0x1EE8, 0x1EE8 },
+ { 0x1EEA, 0x1EEA },
+ { 0x1EEC, 0x1EEC },
+ { 0x1EEE, 0x1EEE },
+ { 0x1EF0, 0x1EF0 },
+ { 0x1EF2, 0x1EF2 },
+ { 0x1EF4, 0x1EF4 },
+ { 0x1EF6, 0x1EF6 },
+ { 0x1EF8, 0x1EF8 },
+ { 0x1EFA, 0x1EFA },
+ { 0x1EFC, 0x1EFC },
+ { 0x1EFE, 0x1EFE },
+ { 0x1F08, 0x1F0F },
+ { 0x1F18, 0x1F1D },
+ { 0x1F28, 0x1F2F },
+ { 0x1F38, 0x1F3F },
+ { 0x1F48, 0x1F4D },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F5F },
+ { 0x1F68, 0x1F6F },
+ { 0x1F88, 0x1F8F },
+ { 0x1F98, 0x1F9F },
+ { 0x1FA8, 0x1FAF },
+ { 0x1FB8, 0x1FBC },
+ { 0x1FC8, 0x1FCC },
+ { 0x1FD8, 0x1FDB },
+ { 0x1FE8, 0x1FEC },
+ { 0x1FF8, 0x1FFC },
+ { 0x2126, 0x2126 },
+ { 0x212A, 0x212B },
+ { 0x2132, 0x2132 },
+ { 0x2160, 0x216F },
+ { 0x2183, 0x2183 },
+ { 0x24B6, 0x24CF },
+ { 0x2C00, 0x2C2E },
+ { 0x2C60, 0x2C60 },
+ { 0x2C62, 0x2C64 },
+ { 0x2C67, 0x2C67 },
+ { 0x2C69, 0x2C69 },
+ { 0x2C6B, 0x2C6B },
+ { 0x2C6D, 0x2C6F },
+ { 0x2C72, 0x2C72 },
+ { 0x2C75, 0x2C75 },
+ { 0x2C80, 0x2C80 },
+ { 0x2C82, 0x2C82 },
+ { 0x2C84, 0x2C84 },
+ { 0x2C86, 0x2C86 },
+ { 0x2C88, 0x2C88 },
+ { 0x2C8A, 0x2C8A },
+ { 0x2C8C, 0x2C8C },
+ { 0x2C8E, 0x2C8E },
+ { 0x2C90, 0x2C90 },
+ { 0x2C92, 0x2C92 },
+ { 0x2C94, 0x2C94 },
+ { 0x2C96, 0x2C96 },
+ { 0x2C98, 0x2C98 },
+ { 0x2C9A, 0x2C9A },
+ { 0x2C9C, 0x2C9C },
+ { 0x2C9E, 0x2C9E },
+ { 0x2CA0, 0x2CA0 },
+ { 0x2CA2, 0x2CA2 },
+ { 0x2CA4, 0x2CA4 },
+ { 0x2CA6, 0x2CA6 },
+ { 0x2CA8, 0x2CA8 },
+ { 0x2CAA, 0x2CAA },
+ { 0x2CAC, 0x2CAC },
+ { 0x2CAE, 0x2CAE },
+ { 0x2CB0, 0x2CB0 },
+ { 0x2CB2, 0x2CB2 },
+ { 0x2CB4, 0x2CB4 },
+ { 0x2CB6, 0x2CB6 },
+ { 0x2CB8, 0x2CB8 },
+ { 0x2CBA, 0x2CBA },
+ { 0x2CBC, 0x2CBC },
+ { 0x2CBE, 0x2CBE },
+ { 0x2CC0, 0x2CC0 },
+ { 0x2CC2, 0x2CC2 },
+ { 0x2CC4, 0x2CC4 },
+ { 0x2CC6, 0x2CC6 },
+ { 0x2CC8, 0x2CC8 },
+ { 0x2CCA, 0x2CCA },
+ { 0x2CCC, 0x2CCC },
+ { 0x2CCE, 0x2CCE },
+ { 0x2CD0, 0x2CD0 },
+ { 0x2CD2, 0x2CD2 },
+ { 0x2CD4, 0x2CD4 },
+ { 0x2CD6, 0x2CD6 },
+ { 0x2CD8, 0x2CD8 },
+ { 0x2CDA, 0x2CDA },
+ { 0x2CDC, 0x2CDC },
+ { 0x2CDE, 0x2CDE },
+ { 0x2CE0, 0x2CE0 },
+ { 0x2CE2, 0x2CE2 },
+ { 0xA640, 0xA640 },
+ { 0xA642, 0xA642 },
+ { 0xA644, 0xA644 },
+ { 0xA646, 0xA646 },
+ { 0xA648, 0xA648 },
+ { 0xA64A, 0xA64A },
+ { 0xA64C, 0xA64C },
+ { 0xA64E, 0xA64E },
+ { 0xA650, 0xA650 },
+ { 0xA652, 0xA652 },
+ { 0xA654, 0xA654 },
+ { 0xA656, 0xA656 },
+ { 0xA658, 0xA658 },
+ { 0xA65A, 0xA65A },
+ { 0xA65C, 0xA65C },
+ { 0xA65E, 0xA65E },
+ { 0xA662, 0xA662 },
+ { 0xA664, 0xA664 },
+ { 0xA666, 0xA666 },
+ { 0xA668, 0xA668 },
+ { 0xA66A, 0xA66A },
+ { 0xA66C, 0xA66C },
+ { 0xA680, 0xA680 },
+ { 0xA682, 0xA682 },
+ { 0xA684, 0xA684 },
+ { 0xA686, 0xA686 },
+ { 0xA688, 0xA688 },
+ { 0xA68A, 0xA68A },
+ { 0xA68C, 0xA68C },
+ { 0xA68E, 0xA68E },
+ { 0xA690, 0xA690 },
+ { 0xA692, 0xA692 },
+ { 0xA694, 0xA694 },
+ { 0xA696, 0xA696 },
+ { 0xA722, 0xA722 },
+ { 0xA724, 0xA724 },
+ { 0xA726, 0xA726 },
+ { 0xA728, 0xA728 },
+ { 0xA72A, 0xA72A },
+ { 0xA72C, 0xA72C },
+ { 0xA72E, 0xA72E },
+ { 0xA732, 0xA732 },
+ { 0xA734, 0xA734 },
+ { 0xA736, 0xA736 },
+ { 0xA738, 0xA738 },
+ { 0xA73A, 0xA73A },
+ { 0xA73C, 0xA73C },
+ { 0xA73E, 0xA73E },
+ { 0xA740, 0xA740 },
+ { 0xA742, 0xA742 },
+ { 0xA744, 0xA744 },
+ { 0xA746, 0xA746 },
+ { 0xA748, 0xA748 },
+ { 0xA74A, 0xA74A },
+ { 0xA74C, 0xA74C },
+ { 0xA74E, 0xA74E },
+ { 0xA750, 0xA750 },
+ { 0xA752, 0xA752 },
+ { 0xA754, 0xA754 },
+ { 0xA756, 0xA756 },
+ { 0xA758, 0xA758 },
+ { 0xA75A, 0xA75A },
+ { 0xA75C, 0xA75C },
+ { 0xA75E, 0xA75E },
+ { 0xA760, 0xA760 },
+ { 0xA762, 0xA762 },
+ { 0xA764, 0xA764 },
+ { 0xA766, 0xA766 },
+ { 0xA768, 0xA768 },
+ { 0xA76A, 0xA76A },
+ { 0xA76C, 0xA76C },
+ { 0xA76E, 0xA76E },
+ { 0xA779, 0xA779 },
+ { 0xA77B, 0xA77B },
+ { 0xA77D, 0xA77E },
+ { 0xA780, 0xA780 },
+ { 0xA782, 0xA782 },
+ { 0xA784, 0xA784 },
+ { 0xA786, 0xA786 },
+ { 0xA78B, 0xA78B },
+ { 0xFF21, 0xFF3A },
+ { 0x10400, 0x10427 }
+
+#define PREDICATE(c) uc_is_upper (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-ctype_xdigit.c b/gnulib/tests/unictype/test-ctype_xdigit.c
new file mode 100644
index 00000000..d4e57178
--- /dev/null
+++ b/gnulib/tests/unictype/test-ctype_xdigit.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x0041, 0x0046 },
+ { 0x0061, 0x0066 }
+
+#define PREDICATE(c) uc_is_xdigit (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-decdigit.c b/gnulib/tests/unictype/test-decdigit.c
new file mode 100644
index 00000000..f94605ef
--- /dev/null
+++ b/gnulib/tests/unictype/test-decdigit.c
@@ -0,0 +1,49 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+static const struct { unsigned int ch; int value; } mapping[] =
+ {
+#include "test-decdigit.h"
+ };
+
+int
+main ()
+{
+ unsigned int c;
+ size_t i;
+
+ c = 0;
+ for (i = 0; i < SIZEOF (mapping); i++)
+ {
+ for (; c < mapping[i].ch; c++)
+ ASSERT (uc_decimal_value (c) == -1);
+ /* Here c = mapping[i].ch. */
+ ASSERT (uc_decimal_value (c) == mapping[i].value);
+ c++;
+ }
+ for (; c < 0x110000; c++)
+ ASSERT (uc_decimal_value (c) == -1);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-decdigit.h b/gnulib/tests/unictype/test-decdigit.h
new file mode 100644
index 00000000..afa88de7
--- /dev/null
+++ b/gnulib/tests/unictype/test-decdigit.h
@@ -0,0 +1,373 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Decimal digit values of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+ { 0x0030, 0 },
+ { 0x0031, 1 },
+ { 0x0032, 2 },
+ { 0x0033, 3 },
+ { 0x0034, 4 },
+ { 0x0035, 5 },
+ { 0x0036, 6 },
+ { 0x0037, 7 },
+ { 0x0038, 8 },
+ { 0x0039, 9 },
+ { 0x0660, 0 },
+ { 0x0661, 1 },
+ { 0x0662, 2 },
+ { 0x0663, 3 },
+ { 0x0664, 4 },
+ { 0x0665, 5 },
+ { 0x0666, 6 },
+ { 0x0667, 7 },
+ { 0x0668, 8 },
+ { 0x0669, 9 },
+ { 0x06F0, 0 },
+ { 0x06F1, 1 },
+ { 0x06F2, 2 },
+ { 0x06F3, 3 },
+ { 0x06F4, 4 },
+ { 0x06F5, 5 },
+ { 0x06F6, 6 },
+ { 0x06F7, 7 },
+ { 0x06F8, 8 },
+ { 0x06F9, 9 },
+ { 0x07C0, 0 },
+ { 0x07C1, 1 },
+ { 0x07C2, 2 },
+ { 0x07C3, 3 },
+ { 0x07C4, 4 },
+ { 0x07C5, 5 },
+ { 0x07C6, 6 },
+ { 0x07C7, 7 },
+ { 0x07C8, 8 },
+ { 0x07C9, 9 },
+ { 0x0966, 0 },
+ { 0x0967, 1 },
+ { 0x0968, 2 },
+ { 0x0969, 3 },
+ { 0x096A, 4 },
+ { 0x096B, 5 },
+ { 0x096C, 6 },
+ { 0x096D, 7 },
+ { 0x096E, 8 },
+ { 0x096F, 9 },
+ { 0x09E6, 0 },
+ { 0x09E7, 1 },
+ { 0x09E8, 2 },
+ { 0x09E9, 3 },
+ { 0x09EA, 4 },
+ { 0x09EB, 5 },
+ { 0x09EC, 6 },
+ { 0x09ED, 7 },
+ { 0x09EE, 8 },
+ { 0x09EF, 9 },
+ { 0x0A66, 0 },
+ { 0x0A67, 1 },
+ { 0x0A68, 2 },
+ { 0x0A69, 3 },
+ { 0x0A6A, 4 },
+ { 0x0A6B, 5 },
+ { 0x0A6C, 6 },
+ { 0x0A6D, 7 },
+ { 0x0A6E, 8 },
+ { 0x0A6F, 9 },
+ { 0x0AE6, 0 },
+ { 0x0AE7, 1 },
+ { 0x0AE8, 2 },
+ { 0x0AE9, 3 },
+ { 0x0AEA, 4 },
+ { 0x0AEB, 5 },
+ { 0x0AEC, 6 },
+ { 0x0AED, 7 },
+ { 0x0AEE, 8 },
+ { 0x0AEF, 9 },
+ { 0x0B66, 0 },
+ { 0x0B67, 1 },
+ { 0x0B68, 2 },
+ { 0x0B69, 3 },
+ { 0x0B6A, 4 },
+ { 0x0B6B, 5 },
+ { 0x0B6C, 6 },
+ { 0x0B6D, 7 },
+ { 0x0B6E, 8 },
+ { 0x0B6F, 9 },
+ { 0x0BE6, 0 },
+ { 0x0BE7, 1 },
+ { 0x0BE8, 2 },
+ { 0x0BE9, 3 },
+ { 0x0BEA, 4 },
+ { 0x0BEB, 5 },
+ { 0x0BEC, 6 },
+ { 0x0BED, 7 },
+ { 0x0BEE, 8 },
+ { 0x0BEF, 9 },
+ { 0x0C66, 0 },
+ { 0x0C67, 1 },
+ { 0x0C68, 2 },
+ { 0x0C69, 3 },
+ { 0x0C6A, 4 },
+ { 0x0C6B, 5 },
+ { 0x0C6C, 6 },
+ { 0x0C6D, 7 },
+ { 0x0C6E, 8 },
+ { 0x0C6F, 9 },
+ { 0x0CE6, 0 },
+ { 0x0CE7, 1 },
+ { 0x0CE8, 2 },
+ { 0x0CE9, 3 },
+ { 0x0CEA, 4 },
+ { 0x0CEB, 5 },
+ { 0x0CEC, 6 },
+ { 0x0CED, 7 },
+ { 0x0CEE, 8 },
+ { 0x0CEF, 9 },
+ { 0x0D66, 0 },
+ { 0x0D67, 1 },
+ { 0x0D68, 2 },
+ { 0x0D69, 3 },
+ { 0x0D6A, 4 },
+ { 0x0D6B, 5 },
+ { 0x0D6C, 6 },
+ { 0x0D6D, 7 },
+ { 0x0D6E, 8 },
+ { 0x0D6F, 9 },
+ { 0x0E50, 0 },
+ { 0x0E51, 1 },
+ { 0x0E52, 2 },
+ { 0x0E53, 3 },
+ { 0x0E54, 4 },
+ { 0x0E55, 5 },
+ { 0x0E56, 6 },
+ { 0x0E57, 7 },
+ { 0x0E58, 8 },
+ { 0x0E59, 9 },
+ { 0x0ED0, 0 },
+ { 0x0ED1, 1 },
+ { 0x0ED2, 2 },
+ { 0x0ED3, 3 },
+ { 0x0ED4, 4 },
+ { 0x0ED5, 5 },
+ { 0x0ED6, 6 },
+ { 0x0ED7, 7 },
+ { 0x0ED8, 8 },
+ { 0x0ED9, 9 },
+ { 0x0F20, 0 },
+ { 0x0F21, 1 },
+ { 0x0F22, 2 },
+ { 0x0F23, 3 },
+ { 0x0F24, 4 },
+ { 0x0F25, 5 },
+ { 0x0F26, 6 },
+ { 0x0F27, 7 },
+ { 0x0F28, 8 },
+ { 0x0F29, 9 },
+ { 0x1040, 0 },
+ { 0x1041, 1 },
+ { 0x1042, 2 },
+ { 0x1043, 3 },
+ { 0x1044, 4 },
+ { 0x1045, 5 },
+ { 0x1046, 6 },
+ { 0x1047, 7 },
+ { 0x1048, 8 },
+ { 0x1049, 9 },
+ { 0x1090, 0 },
+ { 0x1091, 1 },
+ { 0x1092, 2 },
+ { 0x1093, 3 },
+ { 0x1094, 4 },
+ { 0x1095, 5 },
+ { 0x1096, 6 },
+ { 0x1097, 7 },
+ { 0x1098, 8 },
+ { 0x1099, 9 },
+ { 0x17E0, 0 },
+ { 0x17E1, 1 },
+ { 0x17E2, 2 },
+ { 0x17E3, 3 },
+ { 0x17E4, 4 },
+ { 0x17E5, 5 },
+ { 0x17E6, 6 },
+ { 0x17E7, 7 },
+ { 0x17E8, 8 },
+ { 0x17E9, 9 },
+ { 0x1810, 0 },
+ { 0x1811, 1 },
+ { 0x1812, 2 },
+ { 0x1813, 3 },
+ { 0x1814, 4 },
+ { 0x1815, 5 },
+ { 0x1816, 6 },
+ { 0x1817, 7 },
+ { 0x1818, 8 },
+ { 0x1819, 9 },
+ { 0x1946, 0 },
+ { 0x1947, 1 },
+ { 0x1948, 2 },
+ { 0x1949, 3 },
+ { 0x194A, 4 },
+ { 0x194B, 5 },
+ { 0x194C, 6 },
+ { 0x194D, 7 },
+ { 0x194E, 8 },
+ { 0x194F, 9 },
+ { 0x19D0, 0 },
+ { 0x19D1, 1 },
+ { 0x19D2, 2 },
+ { 0x19D3, 3 },
+ { 0x19D4, 4 },
+ { 0x19D5, 5 },
+ { 0x19D6, 6 },
+ { 0x19D7, 7 },
+ { 0x19D8, 8 },
+ { 0x19D9, 9 },
+ { 0x1B50, 0 },
+ { 0x1B51, 1 },
+ { 0x1B52, 2 },
+ { 0x1B53, 3 },
+ { 0x1B54, 4 },
+ { 0x1B55, 5 },
+ { 0x1B56, 6 },
+ { 0x1B57, 7 },
+ { 0x1B58, 8 },
+ { 0x1B59, 9 },
+ { 0x1BB0, 0 },
+ { 0x1BB1, 1 },
+ { 0x1BB2, 2 },
+ { 0x1BB3, 3 },
+ { 0x1BB4, 4 },
+ { 0x1BB5, 5 },
+ { 0x1BB6, 6 },
+ { 0x1BB7, 7 },
+ { 0x1BB8, 8 },
+ { 0x1BB9, 9 },
+ { 0x1C40, 0 },
+ { 0x1C41, 1 },
+ { 0x1C42, 2 },
+ { 0x1C43, 3 },
+ { 0x1C44, 4 },
+ { 0x1C45, 5 },
+ { 0x1C46, 6 },
+ { 0x1C47, 7 },
+ { 0x1C48, 8 },
+ { 0x1C49, 9 },
+ { 0x1C50, 0 },
+ { 0x1C51, 1 },
+ { 0x1C52, 2 },
+ { 0x1C53, 3 },
+ { 0x1C54, 4 },
+ { 0x1C55, 5 },
+ { 0x1C56, 6 },
+ { 0x1C57, 7 },
+ { 0x1C58, 8 },
+ { 0x1C59, 9 },
+ { 0xA620, 0 },
+ { 0xA621, 1 },
+ { 0xA622, 2 },
+ { 0xA623, 3 },
+ { 0xA624, 4 },
+ { 0xA625, 5 },
+ { 0xA626, 6 },
+ { 0xA627, 7 },
+ { 0xA628, 8 },
+ { 0xA629, 9 },
+ { 0xA8D0, 0 },
+ { 0xA8D1, 1 },
+ { 0xA8D2, 2 },
+ { 0xA8D3, 3 },
+ { 0xA8D4, 4 },
+ { 0xA8D5, 5 },
+ { 0xA8D6, 6 },
+ { 0xA8D7, 7 },
+ { 0xA8D8, 8 },
+ { 0xA8D9, 9 },
+ { 0xA900, 0 },
+ { 0xA901, 1 },
+ { 0xA902, 2 },
+ { 0xA903, 3 },
+ { 0xA904, 4 },
+ { 0xA905, 5 },
+ { 0xA906, 6 },
+ { 0xA907, 7 },
+ { 0xA908, 8 },
+ { 0xA909, 9 },
+ { 0xAA50, 0 },
+ { 0xAA51, 1 },
+ { 0xAA52, 2 },
+ { 0xAA53, 3 },
+ { 0xAA54, 4 },
+ { 0xAA55, 5 },
+ { 0xAA56, 6 },
+ { 0xAA57, 7 },
+ { 0xAA58, 8 },
+ { 0xAA59, 9 },
+ { 0xFF10, 0 },
+ { 0xFF11, 1 },
+ { 0xFF12, 2 },
+ { 0xFF13, 3 },
+ { 0xFF14, 4 },
+ { 0xFF15, 5 },
+ { 0xFF16, 6 },
+ { 0xFF17, 7 },
+ { 0xFF18, 8 },
+ { 0xFF19, 9 },
+ { 0x104A0, 0 },
+ { 0x104A1, 1 },
+ { 0x104A2, 2 },
+ { 0x104A3, 3 },
+ { 0x104A4, 4 },
+ { 0x104A5, 5 },
+ { 0x104A6, 6 },
+ { 0x104A7, 7 },
+ { 0x104A8, 8 },
+ { 0x104A9, 9 },
+ { 0x1D7CE, 0 },
+ { 0x1D7CF, 1 },
+ { 0x1D7D0, 2 },
+ { 0x1D7D1, 3 },
+ { 0x1D7D2, 4 },
+ { 0x1D7D3, 5 },
+ { 0x1D7D4, 6 },
+ { 0x1D7D5, 7 },
+ { 0x1D7D6, 8 },
+ { 0x1D7D7, 9 },
+ { 0x1D7D8, 0 },
+ { 0x1D7D9, 1 },
+ { 0x1D7DA, 2 },
+ { 0x1D7DB, 3 },
+ { 0x1D7DC, 4 },
+ { 0x1D7DD, 5 },
+ { 0x1D7DE, 6 },
+ { 0x1D7DF, 7 },
+ { 0x1D7E0, 8 },
+ { 0x1D7E1, 9 },
+ { 0x1D7E2, 0 },
+ { 0x1D7E3, 1 },
+ { 0x1D7E4, 2 },
+ { 0x1D7E5, 3 },
+ { 0x1D7E6, 4 },
+ { 0x1D7E7, 5 },
+ { 0x1D7E8, 6 },
+ { 0x1D7E9, 7 },
+ { 0x1D7EA, 8 },
+ { 0x1D7EB, 9 },
+ { 0x1D7EC, 0 },
+ { 0x1D7ED, 1 },
+ { 0x1D7EE, 2 },
+ { 0x1D7EF, 3 },
+ { 0x1D7F0, 4 },
+ { 0x1D7F1, 5 },
+ { 0x1D7F2, 6 },
+ { 0x1D7F3, 7 },
+ { 0x1D7F4, 8 },
+ { 0x1D7F5, 9 },
+ { 0x1D7F6, 0 },
+ { 0x1D7F7, 1 },
+ { 0x1D7F8, 2 },
+ { 0x1D7F9, 3 },
+ { 0x1D7FA, 4 },
+ { 0x1D7FB, 5 },
+ { 0x1D7FC, 6 },
+ { 0x1D7FD, 7 },
+ { 0x1D7FE, 8 },
+ { 0x1D7FF, 9 }
diff --git a/gnulib/tests/unictype/test-digit.c b/gnulib/tests/unictype/test-digit.c
new file mode 100644
index 00000000..e87f3f75
--- /dev/null
+++ b/gnulib/tests/unictype/test-digit.c
@@ -0,0 +1,49 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+static const struct { unsigned int ch; int value; } mapping[] =
+ {
+#include "test-digit.h"
+ };
+
+int
+main ()
+{
+ unsigned int c;
+ size_t i;
+
+ c = 0;
+ for (i = 0; i < SIZEOF (mapping); i++)
+ {
+ for (; c < mapping[i].ch; c++)
+ ASSERT (uc_digit_value (c) == -1);
+ /* Here c = mapping[i].ch. */
+ ASSERT (uc_digit_value (c) == mapping[i].value);
+ c++;
+ }
+ for (; c < 0x110000; c++)
+ ASSERT (uc_digit_value (c) == -1);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-digit.h b/gnulib/tests/unictype/test-digit.h
new file mode 100644
index 00000000..9902a7fe
--- /dev/null
+++ b/gnulib/tests/unictype/test-digit.h
@@ -0,0 +1,471 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Digit values of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+ { 0x0030, 0 },
+ { 0x0031, 1 },
+ { 0x0032, 2 },
+ { 0x0033, 3 },
+ { 0x0034, 4 },
+ { 0x0035, 5 },
+ { 0x0036, 6 },
+ { 0x0037, 7 },
+ { 0x0038, 8 },
+ { 0x0039, 9 },
+ { 0x00B2, 2 },
+ { 0x00B3, 3 },
+ { 0x00B9, 1 },
+ { 0x0660, 0 },
+ { 0x0661, 1 },
+ { 0x0662, 2 },
+ { 0x0663, 3 },
+ { 0x0664, 4 },
+ { 0x0665, 5 },
+ { 0x0666, 6 },
+ { 0x0667, 7 },
+ { 0x0668, 8 },
+ { 0x0669, 9 },
+ { 0x06F0, 0 },
+ { 0x06F1, 1 },
+ { 0x06F2, 2 },
+ { 0x06F3, 3 },
+ { 0x06F4, 4 },
+ { 0x06F5, 5 },
+ { 0x06F6, 6 },
+ { 0x06F7, 7 },
+ { 0x06F8, 8 },
+ { 0x06F9, 9 },
+ { 0x07C0, 0 },
+ { 0x07C1, 1 },
+ { 0x07C2, 2 },
+ { 0x07C3, 3 },
+ { 0x07C4, 4 },
+ { 0x07C5, 5 },
+ { 0x07C6, 6 },
+ { 0x07C7, 7 },
+ { 0x07C8, 8 },
+ { 0x07C9, 9 },
+ { 0x0966, 0 },
+ { 0x0967, 1 },
+ { 0x0968, 2 },
+ { 0x0969, 3 },
+ { 0x096A, 4 },
+ { 0x096B, 5 },
+ { 0x096C, 6 },
+ { 0x096D, 7 },
+ { 0x096E, 8 },
+ { 0x096F, 9 },
+ { 0x09E6, 0 },
+ { 0x09E7, 1 },
+ { 0x09E8, 2 },
+ { 0x09E9, 3 },
+ { 0x09EA, 4 },
+ { 0x09EB, 5 },
+ { 0x09EC, 6 },
+ { 0x09ED, 7 },
+ { 0x09EE, 8 },
+ { 0x09EF, 9 },
+ { 0x0A66, 0 },
+ { 0x0A67, 1 },
+ { 0x0A68, 2 },
+ { 0x0A69, 3 },
+ { 0x0A6A, 4 },
+ { 0x0A6B, 5 },
+ { 0x0A6C, 6 },
+ { 0x0A6D, 7 },
+ { 0x0A6E, 8 },
+ { 0x0A6F, 9 },
+ { 0x0AE6, 0 },
+ { 0x0AE7, 1 },
+ { 0x0AE8, 2 },
+ { 0x0AE9, 3 },
+ { 0x0AEA, 4 },
+ { 0x0AEB, 5 },
+ { 0x0AEC, 6 },
+ { 0x0AED, 7 },
+ { 0x0AEE, 8 },
+ { 0x0AEF, 9 },
+ { 0x0B66, 0 },
+ { 0x0B67, 1 },
+ { 0x0B68, 2 },
+ { 0x0B69, 3 },
+ { 0x0B6A, 4 },
+ { 0x0B6B, 5 },
+ { 0x0B6C, 6 },
+ { 0x0B6D, 7 },
+ { 0x0B6E, 8 },
+ { 0x0B6F, 9 },
+ { 0x0BE6, 0 },
+ { 0x0BE7, 1 },
+ { 0x0BE8, 2 },
+ { 0x0BE9, 3 },
+ { 0x0BEA, 4 },
+ { 0x0BEB, 5 },
+ { 0x0BEC, 6 },
+ { 0x0BED, 7 },
+ { 0x0BEE, 8 },
+ { 0x0BEF, 9 },
+ { 0x0C66, 0 },
+ { 0x0C67, 1 },
+ { 0x0C68, 2 },
+ { 0x0C69, 3 },
+ { 0x0C6A, 4 },
+ { 0x0C6B, 5 },
+ { 0x0C6C, 6 },
+ { 0x0C6D, 7 },
+ { 0x0C6E, 8 },
+ { 0x0C6F, 9 },
+ { 0x0CE6, 0 },
+ { 0x0CE7, 1 },
+ { 0x0CE8, 2 },
+ { 0x0CE9, 3 },
+ { 0x0CEA, 4 },
+ { 0x0CEB, 5 },
+ { 0x0CEC, 6 },
+ { 0x0CED, 7 },
+ { 0x0CEE, 8 },
+ { 0x0CEF, 9 },
+ { 0x0D66, 0 },
+ { 0x0D67, 1 },
+ { 0x0D68, 2 },
+ { 0x0D69, 3 },
+ { 0x0D6A, 4 },
+ { 0x0D6B, 5 },
+ { 0x0D6C, 6 },
+ { 0x0D6D, 7 },
+ { 0x0D6E, 8 },
+ { 0x0D6F, 9 },
+ { 0x0E50, 0 },
+ { 0x0E51, 1 },
+ { 0x0E52, 2 },
+ { 0x0E53, 3 },
+ { 0x0E54, 4 },
+ { 0x0E55, 5 },
+ { 0x0E56, 6 },
+ { 0x0E57, 7 },
+ { 0x0E58, 8 },
+ { 0x0E59, 9 },
+ { 0x0ED0, 0 },
+ { 0x0ED1, 1 },
+ { 0x0ED2, 2 },
+ { 0x0ED3, 3 },
+ { 0x0ED4, 4 },
+ { 0x0ED5, 5 },
+ { 0x0ED6, 6 },
+ { 0x0ED7, 7 },
+ { 0x0ED8, 8 },
+ { 0x0ED9, 9 },
+ { 0x0F20, 0 },
+ { 0x0F21, 1 },
+ { 0x0F22, 2 },
+ { 0x0F23, 3 },
+ { 0x0F24, 4 },
+ { 0x0F25, 5 },
+ { 0x0F26, 6 },
+ { 0x0F27, 7 },
+ { 0x0F28, 8 },
+ { 0x0F29, 9 },
+ { 0x1040, 0 },
+ { 0x1041, 1 },
+ { 0x1042, 2 },
+ { 0x1043, 3 },
+ { 0x1044, 4 },
+ { 0x1045, 5 },
+ { 0x1046, 6 },
+ { 0x1047, 7 },
+ { 0x1048, 8 },
+ { 0x1049, 9 },
+ { 0x1090, 0 },
+ { 0x1091, 1 },
+ { 0x1092, 2 },
+ { 0x1093, 3 },
+ { 0x1094, 4 },
+ { 0x1095, 5 },
+ { 0x1096, 6 },
+ { 0x1097, 7 },
+ { 0x1098, 8 },
+ { 0x1099, 9 },
+ { 0x1369, 1 },
+ { 0x136A, 2 },
+ { 0x136B, 3 },
+ { 0x136C, 4 },
+ { 0x136D, 5 },
+ { 0x136E, 6 },
+ { 0x136F, 7 },
+ { 0x1370, 8 },
+ { 0x1371, 9 },
+ { 0x17E0, 0 },
+ { 0x17E1, 1 },
+ { 0x17E2, 2 },
+ { 0x17E3, 3 },
+ { 0x17E4, 4 },
+ { 0x17E5, 5 },
+ { 0x17E6, 6 },
+ { 0x17E7, 7 },
+ { 0x17E8, 8 },
+ { 0x17E9, 9 },
+ { 0x1810, 0 },
+ { 0x1811, 1 },
+ { 0x1812, 2 },
+ { 0x1813, 3 },
+ { 0x1814, 4 },
+ { 0x1815, 5 },
+ { 0x1816, 6 },
+ { 0x1817, 7 },
+ { 0x1818, 8 },
+ { 0x1819, 9 },
+ { 0x1946, 0 },
+ { 0x1947, 1 },
+ { 0x1948, 2 },
+ { 0x1949, 3 },
+ { 0x194A, 4 },
+ { 0x194B, 5 },
+ { 0x194C, 6 },
+ { 0x194D, 7 },
+ { 0x194E, 8 },
+ { 0x194F, 9 },
+ { 0x19D0, 0 },
+ { 0x19D1, 1 },
+ { 0x19D2, 2 },
+ { 0x19D3, 3 },
+ { 0x19D4, 4 },
+ { 0x19D5, 5 },
+ { 0x19D6, 6 },
+ { 0x19D7, 7 },
+ { 0x19D8, 8 },
+ { 0x19D9, 9 },
+ { 0x1B50, 0 },
+ { 0x1B51, 1 },
+ { 0x1B52, 2 },
+ { 0x1B53, 3 },
+ { 0x1B54, 4 },
+ { 0x1B55, 5 },
+ { 0x1B56, 6 },
+ { 0x1B57, 7 },
+ { 0x1B58, 8 },
+ { 0x1B59, 9 },
+ { 0x1BB0, 0 },
+ { 0x1BB1, 1 },
+ { 0x1BB2, 2 },
+ { 0x1BB3, 3 },
+ { 0x1BB4, 4 },
+ { 0x1BB5, 5 },
+ { 0x1BB6, 6 },
+ { 0x1BB7, 7 },
+ { 0x1BB8, 8 },
+ { 0x1BB9, 9 },
+ { 0x1C40, 0 },
+ { 0x1C41, 1 },
+ { 0x1C42, 2 },
+ { 0x1C43, 3 },
+ { 0x1C44, 4 },
+ { 0x1C45, 5 },
+ { 0x1C46, 6 },
+ { 0x1C47, 7 },
+ { 0x1C48, 8 },
+ { 0x1C49, 9 },
+ { 0x1C50, 0 },
+ { 0x1C51, 1 },
+ { 0x1C52, 2 },
+ { 0x1C53, 3 },
+ { 0x1C54, 4 },
+ { 0x1C55, 5 },
+ { 0x1C56, 6 },
+ { 0x1C57, 7 },
+ { 0x1C58, 8 },
+ { 0x1C59, 9 },
+ { 0x2070, 0 },
+ { 0x2074, 4 },
+ { 0x2075, 5 },
+ { 0x2076, 6 },
+ { 0x2077, 7 },
+ { 0x2078, 8 },
+ { 0x2079, 9 },
+ { 0x2080, 0 },
+ { 0x2081, 1 },
+ { 0x2082, 2 },
+ { 0x2083, 3 },
+ { 0x2084, 4 },
+ { 0x2085, 5 },
+ { 0x2086, 6 },
+ { 0x2087, 7 },
+ { 0x2088, 8 },
+ { 0x2089, 9 },
+ { 0x2460, 1 },
+ { 0x2461, 2 },
+ { 0x2462, 3 },
+ { 0x2463, 4 },
+ { 0x2464, 5 },
+ { 0x2465, 6 },
+ { 0x2466, 7 },
+ { 0x2467, 8 },
+ { 0x2468, 9 },
+ { 0x2474, 1 },
+ { 0x2475, 2 },
+ { 0x2476, 3 },
+ { 0x2477, 4 },
+ { 0x2478, 5 },
+ { 0x2479, 6 },
+ { 0x247A, 7 },
+ { 0x247B, 8 },
+ { 0x247C, 9 },
+ { 0x2488, 1 },
+ { 0x2489, 2 },
+ { 0x248A, 3 },
+ { 0x248B, 4 },
+ { 0x248C, 5 },
+ { 0x248D, 6 },
+ { 0x248E, 7 },
+ { 0x248F, 8 },
+ { 0x2490, 9 },
+ { 0x24EA, 0 },
+ { 0x24F5, 1 },
+ { 0x24F6, 2 },
+ { 0x24F7, 3 },
+ { 0x24F8, 4 },
+ { 0x24F9, 5 },
+ { 0x24FA, 6 },
+ { 0x24FB, 7 },
+ { 0x24FC, 8 },
+ { 0x24FD, 9 },
+ { 0x24FF, 0 },
+ { 0x2776, 1 },
+ { 0x2777, 2 },
+ { 0x2778, 3 },
+ { 0x2779, 4 },
+ { 0x277A, 5 },
+ { 0x277B, 6 },
+ { 0x277C, 7 },
+ { 0x277D, 8 },
+ { 0x277E, 9 },
+ { 0x2780, 1 },
+ { 0x2781, 2 },
+ { 0x2782, 3 },
+ { 0x2783, 4 },
+ { 0x2784, 5 },
+ { 0x2785, 6 },
+ { 0x2786, 7 },
+ { 0x2787, 8 },
+ { 0x2788, 9 },
+ { 0x278A, 1 },
+ { 0x278B, 2 },
+ { 0x278C, 3 },
+ { 0x278D, 4 },
+ { 0x278E, 5 },
+ { 0x278F, 6 },
+ { 0x2790, 7 },
+ { 0x2791, 8 },
+ { 0x2792, 9 },
+ { 0xA620, 0 },
+ { 0xA621, 1 },
+ { 0xA622, 2 },
+ { 0xA623, 3 },
+ { 0xA624, 4 },
+ { 0xA625, 5 },
+ { 0xA626, 6 },
+ { 0xA627, 7 },
+ { 0xA628, 8 },
+ { 0xA629, 9 },
+ { 0xA8D0, 0 },
+ { 0xA8D1, 1 },
+ { 0xA8D2, 2 },
+ { 0xA8D3, 3 },
+ { 0xA8D4, 4 },
+ { 0xA8D5, 5 },
+ { 0xA8D6, 6 },
+ { 0xA8D7, 7 },
+ { 0xA8D8, 8 },
+ { 0xA8D9, 9 },
+ { 0xA900, 0 },
+ { 0xA901, 1 },
+ { 0xA902, 2 },
+ { 0xA903, 3 },
+ { 0xA904, 4 },
+ { 0xA905, 5 },
+ { 0xA906, 6 },
+ { 0xA907, 7 },
+ { 0xA908, 8 },
+ { 0xA909, 9 },
+ { 0xAA50, 0 },
+ { 0xAA51, 1 },
+ { 0xAA52, 2 },
+ { 0xAA53, 3 },
+ { 0xAA54, 4 },
+ { 0xAA55, 5 },
+ { 0xAA56, 6 },
+ { 0xAA57, 7 },
+ { 0xAA58, 8 },
+ { 0xAA59, 9 },
+ { 0xFF10, 0 },
+ { 0xFF11, 1 },
+ { 0xFF12, 2 },
+ { 0xFF13, 3 },
+ { 0xFF14, 4 },
+ { 0xFF15, 5 },
+ { 0xFF16, 6 },
+ { 0xFF17, 7 },
+ { 0xFF18, 8 },
+ { 0xFF19, 9 },
+ { 0x104A0, 0 },
+ { 0x104A1, 1 },
+ { 0x104A2, 2 },
+ { 0x104A3, 3 },
+ { 0x104A4, 4 },
+ { 0x104A5, 5 },
+ { 0x104A6, 6 },
+ { 0x104A7, 7 },
+ { 0x104A8, 8 },
+ { 0x104A9, 9 },
+ { 0x10A40, 1 },
+ { 0x10A41, 2 },
+ { 0x10A42, 3 },
+ { 0x10A43, 4 },
+ { 0x1D7CE, 0 },
+ { 0x1D7CF, 1 },
+ { 0x1D7D0, 2 },
+ { 0x1D7D1, 3 },
+ { 0x1D7D2, 4 },
+ { 0x1D7D3, 5 },
+ { 0x1D7D4, 6 },
+ { 0x1D7D5, 7 },
+ { 0x1D7D6, 8 },
+ { 0x1D7D7, 9 },
+ { 0x1D7D8, 0 },
+ { 0x1D7D9, 1 },
+ { 0x1D7DA, 2 },
+ { 0x1D7DB, 3 },
+ { 0x1D7DC, 4 },
+ { 0x1D7DD, 5 },
+ { 0x1D7DE, 6 },
+ { 0x1D7DF, 7 },
+ { 0x1D7E0, 8 },
+ { 0x1D7E1, 9 },
+ { 0x1D7E2, 0 },
+ { 0x1D7E3, 1 },
+ { 0x1D7E4, 2 },
+ { 0x1D7E5, 3 },
+ { 0x1D7E6, 4 },
+ { 0x1D7E7, 5 },
+ { 0x1D7E8, 6 },
+ { 0x1D7E9, 7 },
+ { 0x1D7EA, 8 },
+ { 0x1D7EB, 9 },
+ { 0x1D7EC, 0 },
+ { 0x1D7ED, 1 },
+ { 0x1D7EE, 2 },
+ { 0x1D7EF, 3 },
+ { 0x1D7F0, 4 },
+ { 0x1D7F1, 5 },
+ { 0x1D7F2, 6 },
+ { 0x1D7F3, 7 },
+ { 0x1D7F4, 8 },
+ { 0x1D7F5, 9 },
+ { 0x1D7F6, 0 },
+ { 0x1D7F7, 1 },
+ { 0x1D7F8, 2 },
+ { 0x1D7F9, 3 },
+ { 0x1D7FA, 4 },
+ { 0x1D7FB, 5 },
+ { 0x1D7FC, 6 },
+ { 0x1D7FD, 7 },
+ { 0x1D7FE, 8 },
+ { 0x1D7FF, 9 }
diff --git a/gnulib/tests/unictype/test-mirror.c b/gnulib/tests/unictype/test-mirror.c
new file mode 100644
index 00000000..457c502b
--- /dev/null
+++ b/gnulib/tests/unictype/test-mirror.c
@@ -0,0 +1,41 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t mirrored;
+
+ ASSERT (uc_mirror_char ('(', &mirrored) && mirrored == ')');
+ ASSERT (uc_mirror_char (')', &mirrored) && mirrored == '(');
+ ASSERT (uc_mirror_char ('<', &mirrored) && mirrored == '>');
+ ASSERT (uc_mirror_char ('>', &mirrored) && mirrored == '<');
+ ASSERT (uc_mirror_char ('[', &mirrored) && mirrored == ']');
+ ASSERT (uc_mirror_char (']', &mirrored) && mirrored == '[');
+ ASSERT (uc_mirror_char ('{', &mirrored) && mirrored == '}');
+ ASSERT (uc_mirror_char ('}', &mirrored) && mirrored == '{');
+ ASSERT (!uc_mirror_char ('X', &mirrored));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-numeric.c b/gnulib/tests/unictype/test-numeric.c
new file mode 100644
index 00000000..d6023831
--- /dev/null
+++ b/gnulib/tests/unictype/test-numeric.c
@@ -0,0 +1,59 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+static const struct { unsigned int ch; int numerator; int denominator; }
+ mapping[] =
+ {
+#include "test-numeric.h"
+ };
+
+int
+main ()
+{
+ unsigned int c;
+ uc_fraction_t value;
+ size_t i;
+
+ c = 0;
+ for (i = 0; i < SIZEOF (mapping); i++)
+ {
+ for (; c < mapping[i].ch; c++)
+ {
+ value = uc_numeric_value (c);
+ ASSERT (value.numerator == 0 && value.denominator == 0);
+ }
+ /* Here c = mapping[i].ch. */
+ value = uc_numeric_value (c);
+ ASSERT (value.numerator == mapping[i].numerator
+ && value.denominator == mapping[i].denominator);
+ c++;
+ }
+ for (; c < 0x110000; c++)
+ {
+ value = uc_numeric_value (c);
+ ASSERT (value.numerator == 0 && value.denominator == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-numeric.h b/gnulib/tests/unictype/test-numeric.h
new file mode 100644
index 00000000..32679424
--- /dev/null
+++ b/gnulib/tests/unictype/test-numeric.h
@@ -0,0 +1,939 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Numeric values of Unicode characters. */
+/* Generated automatically by gen-ctype.c for Unicode 5.1.0. */
+ { 0x0030, 0, 1 },
+ { 0x0031, 1, 1 },
+ { 0x0032, 2, 1 },
+ { 0x0033, 3, 1 },
+ { 0x0034, 4, 1 },
+ { 0x0035, 5, 1 },
+ { 0x0036, 6, 1 },
+ { 0x0037, 7, 1 },
+ { 0x0038, 8, 1 },
+ { 0x0039, 9, 1 },
+ { 0x00B2, 2, 1 },
+ { 0x00B3, 3, 1 },
+ { 0x00B9, 1, 1 },
+ { 0x00BC, 1, 4 },
+ { 0x00BD, 1, 2 },
+ { 0x00BE, 3, 4 },
+ { 0x0660, 0, 1 },
+ { 0x0661, 1, 1 },
+ { 0x0662, 2, 1 },
+ { 0x0663, 3, 1 },
+ { 0x0664, 4, 1 },
+ { 0x0665, 5, 1 },
+ { 0x0666, 6, 1 },
+ { 0x0667, 7, 1 },
+ { 0x0668, 8, 1 },
+ { 0x0669, 9, 1 },
+ { 0x06F0, 0, 1 },
+ { 0x06F1, 1, 1 },
+ { 0x06F2, 2, 1 },
+ { 0x06F3, 3, 1 },
+ { 0x06F4, 4, 1 },
+ { 0x06F5, 5, 1 },
+ { 0x06F6, 6, 1 },
+ { 0x06F7, 7, 1 },
+ { 0x06F8, 8, 1 },
+ { 0x06F9, 9, 1 },
+ { 0x07C0, 0, 1 },
+ { 0x07C1, 1, 1 },
+ { 0x07C2, 2, 1 },
+ { 0x07C3, 3, 1 },
+ { 0x07C4, 4, 1 },
+ { 0x07C5, 5, 1 },
+ { 0x07C6, 6, 1 },
+ { 0x07C7, 7, 1 },
+ { 0x07C8, 8, 1 },
+ { 0x07C9, 9, 1 },
+ { 0x0966, 0, 1 },
+ { 0x0967, 1, 1 },
+ { 0x0968, 2, 1 },
+ { 0x0969, 3, 1 },
+ { 0x096A, 4, 1 },
+ { 0x096B, 5, 1 },
+ { 0x096C, 6, 1 },
+ { 0x096D, 7, 1 },
+ { 0x096E, 8, 1 },
+ { 0x096F, 9, 1 },
+ { 0x09E6, 0, 1 },
+ { 0x09E7, 1, 1 },
+ { 0x09E8, 2, 1 },
+ { 0x09E9, 3, 1 },
+ { 0x09EA, 4, 1 },
+ { 0x09EB, 5, 1 },
+ { 0x09EC, 6, 1 },
+ { 0x09ED, 7, 1 },
+ { 0x09EE, 8, 1 },
+ { 0x09EF, 9, 1 },
+ { 0x09F4, 1, 1 },
+ { 0x09F5, 2, 1 },
+ { 0x09F6, 3, 1 },
+ { 0x09F7, 4, 1 },
+ { 0x09F9, 16, 1 },
+ { 0x0A66, 0, 1 },
+ { 0x0A67, 1, 1 },
+ { 0x0A68, 2, 1 },
+ { 0x0A69, 3, 1 },
+ { 0x0A6A, 4, 1 },
+ { 0x0A6B, 5, 1 },
+ { 0x0A6C, 6, 1 },
+ { 0x0A6D, 7, 1 },
+ { 0x0A6E, 8, 1 },
+ { 0x0A6F, 9, 1 },
+ { 0x0AE6, 0, 1 },
+ { 0x0AE7, 1, 1 },
+ { 0x0AE8, 2, 1 },
+ { 0x0AE9, 3, 1 },
+ { 0x0AEA, 4, 1 },
+ { 0x0AEB, 5, 1 },
+ { 0x0AEC, 6, 1 },
+ { 0x0AED, 7, 1 },
+ { 0x0AEE, 8, 1 },
+ { 0x0AEF, 9, 1 },
+ { 0x0B66, 0, 1 },
+ { 0x0B67, 1, 1 },
+ { 0x0B68, 2, 1 },
+ { 0x0B69, 3, 1 },
+ { 0x0B6A, 4, 1 },
+ { 0x0B6B, 5, 1 },
+ { 0x0B6C, 6, 1 },
+ { 0x0B6D, 7, 1 },
+ { 0x0B6E, 8, 1 },
+ { 0x0B6F, 9, 1 },
+ { 0x0BE6, 0, 1 },
+ { 0x0BE7, 1, 1 },
+ { 0x0BE8, 2, 1 },
+ { 0x0BE9, 3, 1 },
+ { 0x0BEA, 4, 1 },
+ { 0x0BEB, 5, 1 },
+ { 0x0BEC, 6, 1 },
+ { 0x0BED, 7, 1 },
+ { 0x0BEE, 8, 1 },
+ { 0x0BEF, 9, 1 },
+ { 0x0BF0, 10, 1 },
+ { 0x0BF1, 100, 1 },
+ { 0x0BF2, 1000, 1 },
+ { 0x0C66, 0, 1 },
+ { 0x0C67, 1, 1 },
+ { 0x0C68, 2, 1 },
+ { 0x0C69, 3, 1 },
+ { 0x0C6A, 4, 1 },
+ { 0x0C6B, 5, 1 },
+ { 0x0C6C, 6, 1 },
+ { 0x0C6D, 7, 1 },
+ { 0x0C6E, 8, 1 },
+ { 0x0C6F, 9, 1 },
+ { 0x0C78, 0, 1 },
+ { 0x0C79, 1, 1 },
+ { 0x0C7A, 2, 1 },
+ { 0x0C7B, 3, 1 },
+ { 0x0C7C, 1, 1 },
+ { 0x0C7D, 2, 1 },
+ { 0x0C7E, 3, 1 },
+ { 0x0CE6, 0, 1 },
+ { 0x0CE7, 1, 1 },
+ { 0x0CE8, 2, 1 },
+ { 0x0CE9, 3, 1 },
+ { 0x0CEA, 4, 1 },
+ { 0x0CEB, 5, 1 },
+ { 0x0CEC, 6, 1 },
+ { 0x0CED, 7, 1 },
+ { 0x0CEE, 8, 1 },
+ { 0x0CEF, 9, 1 },
+ { 0x0D66, 0, 1 },
+ { 0x0D67, 1, 1 },
+ { 0x0D68, 2, 1 },
+ { 0x0D69, 3, 1 },
+ { 0x0D6A, 4, 1 },
+ { 0x0D6B, 5, 1 },
+ { 0x0D6C, 6, 1 },
+ { 0x0D6D, 7, 1 },
+ { 0x0D6E, 8, 1 },
+ { 0x0D6F, 9, 1 },
+ { 0x0D70, 10, 1 },
+ { 0x0D71, 100, 1 },
+ { 0x0D72, 1000, 1 },
+ { 0x0D73, 1, 4 },
+ { 0x0D74, 1, 2 },
+ { 0x0D75, 3, 4 },
+ { 0x0E50, 0, 1 },
+ { 0x0E51, 1, 1 },
+ { 0x0E52, 2, 1 },
+ { 0x0E53, 3, 1 },
+ { 0x0E54, 4, 1 },
+ { 0x0E55, 5, 1 },
+ { 0x0E56, 6, 1 },
+ { 0x0E57, 7, 1 },
+ { 0x0E58, 8, 1 },
+ { 0x0E59, 9, 1 },
+ { 0x0ED0, 0, 1 },
+ { 0x0ED1, 1, 1 },
+ { 0x0ED2, 2, 1 },
+ { 0x0ED3, 3, 1 },
+ { 0x0ED4, 4, 1 },
+ { 0x0ED5, 5, 1 },
+ { 0x0ED6, 6, 1 },
+ { 0x0ED7, 7, 1 },
+ { 0x0ED8, 8, 1 },
+ { 0x0ED9, 9, 1 },
+ { 0x0F20, 0, 1 },
+ { 0x0F21, 1, 1 },
+ { 0x0F22, 2, 1 },
+ { 0x0F23, 3, 1 },
+ { 0x0F24, 4, 1 },
+ { 0x0F25, 5, 1 },
+ { 0x0F26, 6, 1 },
+ { 0x0F27, 7, 1 },
+ { 0x0F28, 8, 1 },
+ { 0x0F29, 9, 1 },
+ { 0x0F2A, 1, 2 },
+ { 0x0F2B, 3, 2 },
+ { 0x0F2C, 5, 2 },
+ { 0x0F2D, 7, 2 },
+ { 0x0F2E, 9, 2 },
+ { 0x0F2F, 11, 2 },
+ { 0x0F30, 13, 2 },
+ { 0x0F31, 15, 2 },
+ { 0x0F32, 17, 2 },
+ { 0x0F33, -1, 2 },
+ { 0x1040, 0, 1 },
+ { 0x1041, 1, 1 },
+ { 0x1042, 2, 1 },
+ { 0x1043, 3, 1 },
+ { 0x1044, 4, 1 },
+ { 0x1045, 5, 1 },
+ { 0x1046, 6, 1 },
+ { 0x1047, 7, 1 },
+ { 0x1048, 8, 1 },
+ { 0x1049, 9, 1 },
+ { 0x1090, 0, 1 },
+ { 0x1091, 1, 1 },
+ { 0x1092, 2, 1 },
+ { 0x1093, 3, 1 },
+ { 0x1094, 4, 1 },
+ { 0x1095, 5, 1 },
+ { 0x1096, 6, 1 },
+ { 0x1097, 7, 1 },
+ { 0x1098, 8, 1 },
+ { 0x1099, 9, 1 },
+ { 0x1369, 1, 1 },
+ { 0x136A, 2, 1 },
+ { 0x136B, 3, 1 },
+ { 0x136C, 4, 1 },
+ { 0x136D, 5, 1 },
+ { 0x136E, 6, 1 },
+ { 0x136F, 7, 1 },
+ { 0x1370, 8, 1 },
+ { 0x1371, 9, 1 },
+ { 0x1372, 10, 1 },
+ { 0x1373, 20, 1 },
+ { 0x1374, 30, 1 },
+ { 0x1375, 40, 1 },
+ { 0x1376, 50, 1 },
+ { 0x1377, 60, 1 },
+ { 0x1378, 70, 1 },
+ { 0x1379, 80, 1 },
+ { 0x137A, 90, 1 },
+ { 0x137B, 100, 1 },
+ { 0x137C, 10000, 1 },
+ { 0x16EE, 17, 1 },
+ { 0x16EF, 18, 1 },
+ { 0x16F0, 19, 1 },
+ { 0x17E0, 0, 1 },
+ { 0x17E1, 1, 1 },
+ { 0x17E2, 2, 1 },
+ { 0x17E3, 3, 1 },
+ { 0x17E4, 4, 1 },
+ { 0x17E5, 5, 1 },
+ { 0x17E6, 6, 1 },
+ { 0x17E7, 7, 1 },
+ { 0x17E8, 8, 1 },
+ { 0x17E9, 9, 1 },
+ { 0x17F0, 0, 1 },
+ { 0x17F1, 1, 1 },
+ { 0x17F2, 2, 1 },
+ { 0x17F3, 3, 1 },
+ { 0x17F4, 4, 1 },
+ { 0x17F5, 5, 1 },
+ { 0x17F6, 6, 1 },
+ { 0x17F7, 7, 1 },
+ { 0x17F8, 8, 1 },
+ { 0x17F9, 9, 1 },
+ { 0x1810, 0, 1 },
+ { 0x1811, 1, 1 },
+ { 0x1812, 2, 1 },
+ { 0x1813, 3, 1 },
+ { 0x1814, 4, 1 },
+ { 0x1815, 5, 1 },
+ { 0x1816, 6, 1 },
+ { 0x1817, 7, 1 },
+ { 0x1818, 8, 1 },
+ { 0x1819, 9, 1 },
+ { 0x1946, 0, 1 },
+ { 0x1947, 1, 1 },
+ { 0x1948, 2, 1 },
+ { 0x1949, 3, 1 },
+ { 0x194A, 4, 1 },
+ { 0x194B, 5, 1 },
+ { 0x194C, 6, 1 },
+ { 0x194D, 7, 1 },
+ { 0x194E, 8, 1 },
+ { 0x194F, 9, 1 },
+ { 0x19D0, 0, 1 },
+ { 0x19D1, 1, 1 },
+ { 0x19D2, 2, 1 },
+ { 0x19D3, 3, 1 },
+ { 0x19D4, 4, 1 },
+ { 0x19D5, 5, 1 },
+ { 0x19D6, 6, 1 },
+ { 0x19D7, 7, 1 },
+ { 0x19D8, 8, 1 },
+ { 0x19D9, 9, 1 },
+ { 0x1B50, 0, 1 },
+ { 0x1B51, 1, 1 },
+ { 0x1B52, 2, 1 },
+ { 0x1B53, 3, 1 },
+ { 0x1B54, 4, 1 },
+ { 0x1B55, 5, 1 },
+ { 0x1B56, 6, 1 },
+ { 0x1B57, 7, 1 },
+ { 0x1B58, 8, 1 },
+ { 0x1B59, 9, 1 },
+ { 0x1BB0, 0, 1 },
+ { 0x1BB1, 1, 1 },
+ { 0x1BB2, 2, 1 },
+ { 0x1BB3, 3, 1 },
+ { 0x1BB4, 4, 1 },
+ { 0x1BB5, 5, 1 },
+ { 0x1BB6, 6, 1 },
+ { 0x1BB7, 7, 1 },
+ { 0x1BB8, 8, 1 },
+ { 0x1BB9, 9, 1 },
+ { 0x1C40, 0, 1 },
+ { 0x1C41, 1, 1 },
+ { 0x1C42, 2, 1 },
+ { 0x1C43, 3, 1 },
+ { 0x1C44, 4, 1 },
+ { 0x1C45, 5, 1 },
+ { 0x1C46, 6, 1 },
+ { 0x1C47, 7, 1 },
+ { 0x1C48, 8, 1 },
+ { 0x1C49, 9, 1 },
+ { 0x1C50, 0, 1 },
+ { 0x1C51, 1, 1 },
+ { 0x1C52, 2, 1 },
+ { 0x1C53, 3, 1 },
+ { 0x1C54, 4, 1 },
+ { 0x1C55, 5, 1 },
+ { 0x1C56, 6, 1 },
+ { 0x1C57, 7, 1 },
+ { 0x1C58, 8, 1 },
+ { 0x1C59, 9, 1 },
+ { 0x2070, 0, 1 },
+ { 0x2074, 4, 1 },
+ { 0x2075, 5, 1 },
+ { 0x2076, 6, 1 },
+ { 0x2077, 7, 1 },
+ { 0x2078, 8, 1 },
+ { 0x2079, 9, 1 },
+ { 0x2080, 0, 1 },
+ { 0x2081, 1, 1 },
+ { 0x2082, 2, 1 },
+ { 0x2083, 3, 1 },
+ { 0x2084, 4, 1 },
+ { 0x2085, 5, 1 },
+ { 0x2086, 6, 1 },
+ { 0x2087, 7, 1 },
+ { 0x2088, 8, 1 },
+ { 0x2089, 9, 1 },
+ { 0x2153, 1, 3 },
+ { 0x2154, 2, 3 },
+ { 0x2155, 1, 5 },
+ { 0x2156, 2, 5 },
+ { 0x2157, 3, 5 },
+ { 0x2158, 4, 5 },
+ { 0x2159, 1, 6 },
+ { 0x215A, 5, 6 },
+ { 0x215B, 1, 8 },
+ { 0x215C, 3, 8 },
+ { 0x215D, 5, 8 },
+ { 0x215E, 7, 8 },
+ { 0x215F, 1, 1 },
+ { 0x2160, 1, 1 },
+ { 0x2161, 2, 1 },
+ { 0x2162, 3, 1 },
+ { 0x2163, 4, 1 },
+ { 0x2164, 5, 1 },
+ { 0x2165, 6, 1 },
+ { 0x2166, 7, 1 },
+ { 0x2167, 8, 1 },
+ { 0x2168, 9, 1 },
+ { 0x2169, 10, 1 },
+ { 0x216A, 11, 1 },
+ { 0x216B, 12, 1 },
+ { 0x216C, 50, 1 },
+ { 0x216D, 100, 1 },
+ { 0x216E, 500, 1 },
+ { 0x216F, 1000, 1 },
+ { 0x2170, 1, 1 },
+ { 0x2171, 2, 1 },
+ { 0x2172, 3, 1 },
+ { 0x2173, 4, 1 },
+ { 0x2174, 5, 1 },
+ { 0x2175, 6, 1 },
+ { 0x2176, 7, 1 },
+ { 0x2177, 8, 1 },
+ { 0x2178, 9, 1 },
+ { 0x2179, 10, 1 },
+ { 0x217A, 11, 1 },
+ { 0x217B, 12, 1 },
+ { 0x217C, 50, 1 },
+ { 0x217D, 100, 1 },
+ { 0x217E, 500, 1 },
+ { 0x217F, 1000, 1 },
+ { 0x2180, 1000, 1 },
+ { 0x2181, 5000, 1 },
+ { 0x2182, 10000, 1 },
+ { 0x2185, 6, 1 },
+ { 0x2186, 50, 1 },
+ { 0x2187, 50000, 1 },
+ { 0x2188, 100000, 1 },
+ { 0x2460, 1, 1 },
+ { 0x2461, 2, 1 },
+ { 0x2462, 3, 1 },
+ { 0x2463, 4, 1 },
+ { 0x2464, 5, 1 },
+ { 0x2465, 6, 1 },
+ { 0x2466, 7, 1 },
+ { 0x2467, 8, 1 },
+ { 0x2468, 9, 1 },
+ { 0x2469, 10, 1 },
+ { 0x246A, 11, 1 },
+ { 0x246B, 12, 1 },
+ { 0x246C, 13, 1 },
+ { 0x246D, 14, 1 },
+ { 0x246E, 15, 1 },
+ { 0x246F, 16, 1 },
+ { 0x2470, 17, 1 },
+ { 0x2471, 18, 1 },
+ { 0x2472, 19, 1 },
+ { 0x2473, 20, 1 },
+ { 0x2474, 1, 1 },
+ { 0x2475, 2, 1 },
+ { 0x2476, 3, 1 },
+ { 0x2477, 4, 1 },
+ { 0x2478, 5, 1 },
+ { 0x2479, 6, 1 },
+ { 0x247A, 7, 1 },
+ { 0x247B, 8, 1 },
+ { 0x247C, 9, 1 },
+ { 0x247D, 10, 1 },
+ { 0x247E, 11, 1 },
+ { 0x247F, 12, 1 },
+ { 0x2480, 13, 1 },
+ { 0x2481, 14, 1 },
+ { 0x2482, 15, 1 },
+ { 0x2483, 16, 1 },
+ { 0x2484, 17, 1 },
+ { 0x2485, 18, 1 },
+ { 0x2486, 19, 1 },
+ { 0x2487, 20, 1 },
+ { 0x2488, 1, 1 },
+ { 0x2489, 2, 1 },
+ { 0x248A, 3, 1 },
+ { 0x248B, 4, 1 },
+ { 0x248C, 5, 1 },
+ { 0x248D, 6, 1 },
+ { 0x248E, 7, 1 },
+ { 0x248F, 8, 1 },
+ { 0x2490, 9, 1 },
+ { 0x2491, 10, 1 },
+ { 0x2492, 11, 1 },
+ { 0x2493, 12, 1 },
+ { 0x2494, 13, 1 },
+ { 0x2495, 14, 1 },
+ { 0x2496, 15, 1 },
+ { 0x2497, 16, 1 },
+ { 0x2498, 17, 1 },
+ { 0x2499, 18, 1 },
+ { 0x249A, 19, 1 },
+ { 0x249B, 20, 1 },
+ { 0x24EA, 0, 1 },
+ { 0x24EB, 11, 1 },
+ { 0x24EC, 12, 1 },
+ { 0x24ED, 13, 1 },
+ { 0x24EE, 14, 1 },
+ { 0x24EF, 15, 1 },
+ { 0x24F0, 16, 1 },
+ { 0x24F1, 17, 1 },
+ { 0x24F2, 18, 1 },
+ { 0x24F3, 19, 1 },
+ { 0x24F4, 20, 1 },
+ { 0x24F5, 1, 1 },
+ { 0x24F6, 2, 1 },
+ { 0x24F7, 3, 1 },
+ { 0x24F8, 4, 1 },
+ { 0x24F9, 5, 1 },
+ { 0x24FA, 6, 1 },
+ { 0x24FB, 7, 1 },
+ { 0x24FC, 8, 1 },
+ { 0x24FD, 9, 1 },
+ { 0x24FE, 10, 1 },
+ { 0x24FF, 0, 1 },
+ { 0x2776, 1, 1 },
+ { 0x2777, 2, 1 },
+ { 0x2778, 3, 1 },
+ { 0x2779, 4, 1 },
+ { 0x277A, 5, 1 },
+ { 0x277B, 6, 1 },
+ { 0x277C, 7, 1 },
+ { 0x277D, 8, 1 },
+ { 0x277E, 9, 1 },
+ { 0x277F, 10, 1 },
+ { 0x2780, 1, 1 },
+ { 0x2781, 2, 1 },
+ { 0x2782, 3, 1 },
+ { 0x2783, 4, 1 },
+ { 0x2784, 5, 1 },
+ { 0x2785, 6, 1 },
+ { 0x2786, 7, 1 },
+ { 0x2787, 8, 1 },
+ { 0x2788, 9, 1 },
+ { 0x2789, 10, 1 },
+ { 0x278A, 1, 1 },
+ { 0x278B, 2, 1 },
+ { 0x278C, 3, 1 },
+ { 0x278D, 4, 1 },
+ { 0x278E, 5, 1 },
+ { 0x278F, 6, 1 },
+ { 0x2790, 7, 1 },
+ { 0x2791, 8, 1 },
+ { 0x2792, 9, 1 },
+ { 0x2793, 10, 1 },
+ { 0x2CFD, 1, 2 },
+ { 0x3007, 0, 1 },
+ { 0x3021, 1, 1 },
+ { 0x3022, 2, 1 },
+ { 0x3023, 3, 1 },
+ { 0x3024, 4, 1 },
+ { 0x3025, 5, 1 },
+ { 0x3026, 6, 1 },
+ { 0x3027, 7, 1 },
+ { 0x3028, 8, 1 },
+ { 0x3029, 9, 1 },
+ { 0x3038, 10, 1 },
+ { 0x3039, 20, 1 },
+ { 0x303A, 30, 1 },
+ { 0x3192, 1, 1 },
+ { 0x3193, 2, 1 },
+ { 0x3194, 3, 1 },
+ { 0x3195, 4, 1 },
+ { 0x3220, 1, 1 },
+ { 0x3221, 2, 1 },
+ { 0x3222, 3, 1 },
+ { 0x3223, 4, 1 },
+ { 0x3224, 5, 1 },
+ { 0x3225, 6, 1 },
+ { 0x3226, 7, 1 },
+ { 0x3227, 8, 1 },
+ { 0x3228, 9, 1 },
+ { 0x3229, 10, 1 },
+ { 0x3251, 21, 1 },
+ { 0x3252, 22, 1 },
+ { 0x3253, 23, 1 },
+ { 0x3254, 24, 1 },
+ { 0x3255, 25, 1 },
+ { 0x3256, 26, 1 },
+ { 0x3257, 27, 1 },
+ { 0x3258, 28, 1 },
+ { 0x3259, 29, 1 },
+ { 0x325A, 30, 1 },
+ { 0x325B, 31, 1 },
+ { 0x325C, 32, 1 },
+ { 0x325D, 33, 1 },
+ { 0x325E, 34, 1 },
+ { 0x325F, 35, 1 },
+ { 0x3280, 1, 1 },
+ { 0x3281, 2, 1 },
+ { 0x3282, 3, 1 },
+ { 0x3283, 4, 1 },
+ { 0x3284, 5, 1 },
+ { 0x3285, 6, 1 },
+ { 0x3286, 7, 1 },
+ { 0x3287, 8, 1 },
+ { 0x3288, 9, 1 },
+ { 0x3289, 10, 1 },
+ { 0x32B1, 36, 1 },
+ { 0x32B2, 37, 1 },
+ { 0x32B3, 38, 1 },
+ { 0x32B4, 39, 1 },
+ { 0x32B5, 40, 1 },
+ { 0x32B6, 41, 1 },
+ { 0x32B7, 42, 1 },
+ { 0x32B8, 43, 1 },
+ { 0x32B9, 44, 1 },
+ { 0x32BA, 45, 1 },
+ { 0x32BB, 46, 1 },
+ { 0x32BC, 47, 1 },
+ { 0x32BD, 48, 1 },
+ { 0x32BE, 49, 1 },
+ { 0x32BF, 50, 1 },
+ { 0xA620, 0, 1 },
+ { 0xA621, 1, 1 },
+ { 0xA622, 2, 1 },
+ { 0xA623, 3, 1 },
+ { 0xA624, 4, 1 },
+ { 0xA625, 5, 1 },
+ { 0xA626, 6, 1 },
+ { 0xA627, 7, 1 },
+ { 0xA628, 8, 1 },
+ { 0xA629, 9, 1 },
+ { 0xA8D0, 0, 1 },
+ { 0xA8D1, 1, 1 },
+ { 0xA8D2, 2, 1 },
+ { 0xA8D3, 3, 1 },
+ { 0xA8D4, 4, 1 },
+ { 0xA8D5, 5, 1 },
+ { 0xA8D6, 6, 1 },
+ { 0xA8D7, 7, 1 },
+ { 0xA8D8, 8, 1 },
+ { 0xA8D9, 9, 1 },
+ { 0xA900, 0, 1 },
+ { 0xA901, 1, 1 },
+ { 0xA902, 2, 1 },
+ { 0xA903, 3, 1 },
+ { 0xA904, 4, 1 },
+ { 0xA905, 5, 1 },
+ { 0xA906, 6, 1 },
+ { 0xA907, 7, 1 },
+ { 0xA908, 8, 1 },
+ { 0xA909, 9, 1 },
+ { 0xAA50, 0, 1 },
+ { 0xAA51, 1, 1 },
+ { 0xAA52, 2, 1 },
+ { 0xAA53, 3, 1 },
+ { 0xAA54, 4, 1 },
+ { 0xAA55, 5, 1 },
+ { 0xAA56, 6, 1 },
+ { 0xAA57, 7, 1 },
+ { 0xAA58, 8, 1 },
+ { 0xAA59, 9, 1 },
+ { 0xF96B, 3, 1 },
+ { 0xF973, 10, 1 },
+ { 0xF978, 2, 1 },
+ { 0xF9B2, 0, 1 },
+ { 0xF9D1, 6, 1 },
+ { 0xF9D3, 6, 1 },
+ { 0xF9FD, 10, 1 },
+ { 0xFF10, 0, 1 },
+ { 0xFF11, 1, 1 },
+ { 0xFF12, 2, 1 },
+ { 0xFF13, 3, 1 },
+ { 0xFF14, 4, 1 },
+ { 0xFF15, 5, 1 },
+ { 0xFF16, 6, 1 },
+ { 0xFF17, 7, 1 },
+ { 0xFF18, 8, 1 },
+ { 0xFF19, 9, 1 },
+ { 0x10107, 1, 1 },
+ { 0x10108, 2, 1 },
+ { 0x10109, 3, 1 },
+ { 0x1010A, 4, 1 },
+ { 0x1010B, 5, 1 },
+ { 0x1010C, 6, 1 },
+ { 0x1010D, 7, 1 },
+ { 0x1010E, 8, 1 },
+ { 0x1010F, 9, 1 },
+ { 0x10110, 10, 1 },
+ { 0x10111, 20, 1 },
+ { 0x10112, 30, 1 },
+ { 0x10113, 40, 1 },
+ { 0x10114, 50, 1 },
+ { 0x10115, 60, 1 },
+ { 0x10116, 70, 1 },
+ { 0x10117, 80, 1 },
+ { 0x10118, 90, 1 },
+ { 0x10119, 100, 1 },
+ { 0x1011A, 200, 1 },
+ { 0x1011B, 300, 1 },
+ { 0x1011C, 400, 1 },
+ { 0x1011D, 500, 1 },
+ { 0x1011E, 600, 1 },
+ { 0x1011F, 700, 1 },
+ { 0x10120, 800, 1 },
+ { 0x10121, 900, 1 },
+ { 0x10122, 1000, 1 },
+ { 0x10123, 2000, 1 },
+ { 0x10124, 3000, 1 },
+ { 0x10125, 4000, 1 },
+ { 0x10126, 5000, 1 },
+ { 0x10127, 6000, 1 },
+ { 0x10128, 7000, 1 },
+ { 0x10129, 8000, 1 },
+ { 0x1012A, 9000, 1 },
+ { 0x1012B, 10000, 1 },
+ { 0x1012C, 20000, 1 },
+ { 0x1012D, 30000, 1 },
+ { 0x1012E, 40000, 1 },
+ { 0x1012F, 50000, 1 },
+ { 0x10130, 60000, 1 },
+ { 0x10131, 70000, 1 },
+ { 0x10132, 80000, 1 },
+ { 0x10133, 90000, 1 },
+ { 0x10140, 1, 4 },
+ { 0x10141, 1, 2 },
+ { 0x10142, 1, 1 },
+ { 0x10143, 5, 1 },
+ { 0x10144, 50, 1 },
+ { 0x10145, 500, 1 },
+ { 0x10146, 5000, 1 },
+ { 0x10147, 50000, 1 },
+ { 0x10148, 5, 1 },
+ { 0x10149, 10, 1 },
+ { 0x1014A, 50, 1 },
+ { 0x1014B, 100, 1 },
+ { 0x1014C, 500, 1 },
+ { 0x1014D, 1000, 1 },
+ { 0x1014E, 5000, 1 },
+ { 0x1014F, 5, 1 },
+ { 0x10150, 10, 1 },
+ { 0x10151, 50, 1 },
+ { 0x10152, 100, 1 },
+ { 0x10153, 500, 1 },
+ { 0x10154, 1000, 1 },
+ { 0x10155, 10000, 1 },
+ { 0x10156, 50000, 1 },
+ { 0x10157, 10, 1 },
+ { 0x10158, 1, 1 },
+ { 0x10159, 1, 1 },
+ { 0x1015A, 1, 1 },
+ { 0x1015B, 2, 1 },
+ { 0x1015C, 2, 1 },
+ { 0x1015D, 2, 1 },
+ { 0x1015E, 2, 1 },
+ { 0x1015F, 5, 1 },
+ { 0x10160, 10, 1 },
+ { 0x10161, 10, 1 },
+ { 0x10162, 10, 1 },
+ { 0x10163, 10, 1 },
+ { 0x10164, 10, 1 },
+ { 0x10165, 30, 1 },
+ { 0x10166, 50, 1 },
+ { 0x10167, 50, 1 },
+ { 0x10168, 50, 1 },
+ { 0x10169, 50, 1 },
+ { 0x1016A, 100, 1 },
+ { 0x1016B, 300, 1 },
+ { 0x1016C, 500, 1 },
+ { 0x1016D, 500, 1 },
+ { 0x1016E, 500, 1 },
+ { 0x1016F, 500, 1 },
+ { 0x10170, 500, 1 },
+ { 0x10171, 1000, 1 },
+ { 0x10172, 5000, 1 },
+ { 0x10173, 5, 1 },
+ { 0x10174, 50, 1 },
+ { 0x10175, 1, 2 },
+ { 0x10176, 1, 2 },
+ { 0x10177, 2, 3 },
+ { 0x10178, 3, 4 },
+ { 0x1018A, 0, 1 },
+ { 0x10320, 1, 1 },
+ { 0x10321, 5, 1 },
+ { 0x10322, 10, 1 },
+ { 0x10323, 50, 1 },
+ { 0x10341, 90, 1 },
+ { 0x1034A, 900, 1 },
+ { 0x103D1, 1, 1 },
+ { 0x103D2, 2, 1 },
+ { 0x103D3, 10, 1 },
+ { 0x103D4, 20, 1 },
+ { 0x103D5, 100, 1 },
+ { 0x104A0, 0, 1 },
+ { 0x104A1, 1, 1 },
+ { 0x104A2, 2, 1 },
+ { 0x104A3, 3, 1 },
+ { 0x104A4, 4, 1 },
+ { 0x104A5, 5, 1 },
+ { 0x104A6, 6, 1 },
+ { 0x104A7, 7, 1 },
+ { 0x104A8, 8, 1 },
+ { 0x104A9, 9, 1 },
+ { 0x10916, 1, 1 },
+ { 0x10917, 10, 1 },
+ { 0x10918, 20, 1 },
+ { 0x10919, 100, 1 },
+ { 0x10A40, 1, 1 },
+ { 0x10A41, 2, 1 },
+ { 0x10A42, 3, 1 },
+ { 0x10A43, 4, 1 },
+ { 0x10A44, 10, 1 },
+ { 0x10A45, 20, 1 },
+ { 0x10A46, 100, 1 },
+ { 0x10A47, 1000, 1 },
+ { 0x12400, 2, 1 },
+ { 0x12401, 3, 1 },
+ { 0x12402, 4, 1 },
+ { 0x12403, 5, 1 },
+ { 0x12404, 6, 1 },
+ { 0x12405, 7, 1 },
+ { 0x12406, 8, 1 },
+ { 0x12407, 9, 1 },
+ { 0x12408, 3, 1 },
+ { 0x12409, 4, 1 },
+ { 0x1240A, 5, 1 },
+ { 0x1240B, 6, 1 },
+ { 0x1240C, 7, 1 },
+ { 0x1240D, 8, 1 },
+ { 0x1240E, 9, 1 },
+ { 0x1240F, 4, 1 },
+ { 0x12410, 5, 1 },
+ { 0x12411, 6, 1 },
+ { 0x12412, 7, 1 },
+ { 0x12413, 8, 1 },
+ { 0x12414, 9, 1 },
+ { 0x12415, 1, 1 },
+ { 0x12416, 2, 1 },
+ { 0x12417, 3, 1 },
+ { 0x12418, 4, 1 },
+ { 0x12419, 5, 1 },
+ { 0x1241A, 6, 1 },
+ { 0x1241B, 7, 1 },
+ { 0x1241C, 8, 1 },
+ { 0x1241D, 9, 1 },
+ { 0x1241E, 1, 1 },
+ { 0x1241F, 2, 1 },
+ { 0x12420, 3, 1 },
+ { 0x12421, 4, 1 },
+ { 0x12422, 5, 1 },
+ { 0x12423, 2, 1 },
+ { 0x12424, 3, 1 },
+ { 0x12425, 3, 1 },
+ { 0x12426, 4, 1 },
+ { 0x12427, 5, 1 },
+ { 0x12428, 6, 1 },
+ { 0x12429, 7, 1 },
+ { 0x1242A, 8, 1 },
+ { 0x1242B, 9, 1 },
+ { 0x1242C, 1, 1 },
+ { 0x1242D, 2, 1 },
+ { 0x1242E, 3, 1 },
+ { 0x1242F, 3, 1 },
+ { 0x12430, 4, 1 },
+ { 0x12431, 5, 1 },
+ { 0x12434, 1, 1 },
+ { 0x12435, 2, 1 },
+ { 0x12436, 3, 1 },
+ { 0x12437, 3, 1 },
+ { 0x12438, 4, 1 },
+ { 0x12439, 5, 1 },
+ { 0x1243A, 3, 1 },
+ { 0x1243B, 3, 1 },
+ { 0x1243C, 4, 1 },
+ { 0x1243D, 4, 1 },
+ { 0x1243E, 4, 1 },
+ { 0x1243F, 4, 1 },
+ { 0x12440, 6, 1 },
+ { 0x12441, 7, 1 },
+ { 0x12442, 7, 1 },
+ { 0x12443, 7, 1 },
+ { 0x12444, 8, 1 },
+ { 0x12445, 8, 1 },
+ { 0x12446, 9, 1 },
+ { 0x12447, 9, 1 },
+ { 0x12448, 9, 1 },
+ { 0x12449, 9, 1 },
+ { 0x1244A, 2, 1 },
+ { 0x1244B, 3, 1 },
+ { 0x1244C, 4, 1 },
+ { 0x1244D, 5, 1 },
+ { 0x1244E, 6, 1 },
+ { 0x1244F, 1, 1 },
+ { 0x12450, 2, 1 },
+ { 0x12451, 3, 1 },
+ { 0x12452, 4, 1 },
+ { 0x12453, 4, 1 },
+ { 0x12454, 5, 1 },
+ { 0x12455, 5, 1 },
+ { 0x12458, 1, 1 },
+ { 0x12459, 2, 1 },
+ { 0x1245A, 1, 3 },
+ { 0x1245B, 2, 3 },
+ { 0x1245C, 5, 6 },
+ { 0x1245D, 1, 3 },
+ { 0x1245E, 2, 3 },
+ { 0x1245F, 1, 8 },
+ { 0x12460, 1, 4 },
+ { 0x12461, 1, 6 },
+ { 0x12462, 1, 4 },
+ { 0x1D360, 1, 1 },
+ { 0x1D361, 2, 1 },
+ { 0x1D362, 3, 1 },
+ { 0x1D363, 4, 1 },
+ { 0x1D364, 5, 1 },
+ { 0x1D365, 6, 1 },
+ { 0x1D366, 7, 1 },
+ { 0x1D367, 8, 1 },
+ { 0x1D368, 9, 1 },
+ { 0x1D369, 10, 1 },
+ { 0x1D36A, 20, 1 },
+ { 0x1D36B, 30, 1 },
+ { 0x1D36C, 40, 1 },
+ { 0x1D36D, 50, 1 },
+ { 0x1D36E, 60, 1 },
+ { 0x1D36F, 70, 1 },
+ { 0x1D370, 80, 1 },
+ { 0x1D371, 90, 1 },
+ { 0x1D7CE, 0, 1 },
+ { 0x1D7CF, 1, 1 },
+ { 0x1D7D0, 2, 1 },
+ { 0x1D7D1, 3, 1 },
+ { 0x1D7D2, 4, 1 },
+ { 0x1D7D3, 5, 1 },
+ { 0x1D7D4, 6, 1 },
+ { 0x1D7D5, 7, 1 },
+ { 0x1D7D6, 8, 1 },
+ { 0x1D7D7, 9, 1 },
+ { 0x1D7D8, 0, 1 },
+ { 0x1D7D9, 1, 1 },
+ { 0x1D7DA, 2, 1 },
+ { 0x1D7DB, 3, 1 },
+ { 0x1D7DC, 4, 1 },
+ { 0x1D7DD, 5, 1 },
+ { 0x1D7DE, 6, 1 },
+ { 0x1D7DF, 7, 1 },
+ { 0x1D7E0, 8, 1 },
+ { 0x1D7E1, 9, 1 },
+ { 0x1D7E2, 0, 1 },
+ { 0x1D7E3, 1, 1 },
+ { 0x1D7E4, 2, 1 },
+ { 0x1D7E5, 3, 1 },
+ { 0x1D7E6, 4, 1 },
+ { 0x1D7E7, 5, 1 },
+ { 0x1D7E8, 6, 1 },
+ { 0x1D7E9, 7, 1 },
+ { 0x1D7EA, 8, 1 },
+ { 0x1D7EB, 9, 1 },
+ { 0x1D7EC, 0, 1 },
+ { 0x1D7ED, 1, 1 },
+ { 0x1D7EE, 2, 1 },
+ { 0x1D7EF, 3, 1 },
+ { 0x1D7F0, 4, 1 },
+ { 0x1D7F1, 5, 1 },
+ { 0x1D7F2, 6, 1 },
+ { 0x1D7F3, 7, 1 },
+ { 0x1D7F4, 8, 1 },
+ { 0x1D7F5, 9, 1 },
+ { 0x1D7F6, 0, 1 },
+ { 0x1D7F7, 1, 1 },
+ { 0x1D7F8, 2, 1 },
+ { 0x1D7F9, 3, 1 },
+ { 0x1D7FA, 4, 1 },
+ { 0x1D7FB, 5, 1 },
+ { 0x1D7FC, 6, 1 },
+ { 0x1D7FD, 7, 1 },
+ { 0x1D7FE, 8, 1 },
+ { 0x1D7FF, 9, 1 },
+ { 0x2F890, 9, 1 }
diff --git a/gnulib/tests/unictype/test-pr_alphabetic.c b/gnulib/tests/unictype/test-pr_alphabetic.c
new file mode 100644
index 00000000..b13da5d7
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_alphabetic.c
@@ -0,0 +1,465 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0345, 0x0345 },
+ { 0x0370, 0x0374 },
+ { 0x0376, 0x0377 },
+ { 0x037A, 0x037D },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x0559 },
+ { 0x0561, 0x0587 },
+ { 0x05B0, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0610, 0x061A },
+ { 0x0621, 0x0657 },
+ { 0x0659, 0x065E },
+ { 0x066E, 0x06D3 },
+ { 0x06D5, 0x06DC },
+ { 0x06E1, 0x06E8 },
+ { 0x06ED, 0x06EF },
+ { 0x06FA, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x073F },
+ { 0x074D, 0x07B1 },
+ { 0x07CA, 0x07EA },
+ { 0x07F4, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0901, 0x0939 },
+ { 0x093D, 0x094C },
+ { 0x0950, 0x0950 },
+ { 0x0958, 0x0963 },
+ { 0x0971, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0981, 0x0983 },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BD, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CC },
+ { 0x09CE, 0x09CE },
+ { 0x09D7, 0x09D7 },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E3 },
+ { 0x09F0, 0x09F1 },
+ { 0x0A01, 0x0A03 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4C },
+ { 0x0A51, 0x0A51 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A70, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABD, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACC },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE3 },
+ { 0x0B01, 0x0B03 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3D, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4C },
+ { 0x0B56, 0x0B57 },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B63 },
+ { 0x0B71, 0x0B71 },
+ { 0x0B82, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCC },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0C01, 0x0C03 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4C },
+ { 0x0C55, 0x0C56 },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C63 },
+ { 0x0C82, 0x0C83 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBD, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCC },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE3 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4C },
+ { 0x0D57, 0x0D57 },
+ { 0x0D60, 0x0D63 },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D82, 0x0D83 },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF3 },
+ { 0x0E01, 0x0E3A },
+ { 0x0E40, 0x0E46 },
+ { 0x0E4D, 0x0E4D },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB9 },
+ { 0x0EBB, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0ECD, 0x0ECD },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F40, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F71, 0x0F81 },
+ { 0x0F88, 0x0F8B },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x1000, 0x1036 },
+ { 0x1038, 0x1038 },
+ { 0x103B, 0x103F },
+ { 0x1050, 0x1062 },
+ { 0x1065, 0x1068 },
+ { 0x106E, 0x1086 },
+ { 0x108E, 0x108E },
+ { 0x10A0, 0x10C5 },
+ { 0x10D0, 0x10FA },
+ { 0x10FC, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x135F, 0x135F },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x16EE, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1713 },
+ { 0x1720, 0x1733 },
+ { 0x1740, 0x1753 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1772, 0x1773 },
+ { 0x1780, 0x17B3 },
+ { 0x17B6, 0x17C8 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DC, 0x17DC },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x1938 },
+ { 0x1950, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19B0, 0x19C9 },
+ { 0x1A00, 0x1A1B },
+ { 0x1B00, 0x1B33 },
+ { 0x1B35, 0x1B43 },
+ { 0x1B45, 0x1B4B },
+ { 0x1B80, 0x1BA9 },
+ { 0x1BAE, 0x1BAF },
+ { 0x1C00, 0x1C35 },
+ { 0x1C4D, 0x1C4F },
+ { 0x1C5A, 0x1C7D },
+ { 0x1D00, 0x1DBF },
+ { 0x1E00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x212D },
+ { 0x212F, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2160, 0x2188 },
+ { 0x24B6, 0x24E9 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2DE0, 0x2DFF },
+ { 0x2E2F, 0x2E2F },
+ { 0x3005, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3031, 0x3035 },
+ { 0x3038, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x309D, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA500, 0xA60C },
+ { 0xA610, 0xA61F },
+ { 0xA62A, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66E },
+ { 0xA67F, 0xA697 },
+ { 0xA717, 0xA71F },
+ { 0xA722, 0xA788 },
+ { 0xA78B, 0xA78C },
+ { 0xA7FB, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA827 },
+ { 0xA840, 0xA873 },
+ { 0xA880, 0xA8C3 },
+ { 0xA90A, 0xA92A },
+ { 0xA930, 0xA952 },
+ { 0xAA00, 0xAA36 },
+ { 0xAA40, 0xAA4D },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFB },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFF21, 0xFF3A },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10140, 0x10174 },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x103D1, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_property_alphabetic (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_ascii_hex_digit.c b/gnulib/tests/unictype/test-pr_ascii_hex_digit.c
new file mode 100644
index 00000000..df600d7b
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_ascii_hex_digit.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x0041, 0x0046 },
+ { 0x0061, 0x0066 }
+
+#define PREDICATE(c) uc_is_property_ascii_hex_digit (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_arabic_digit.c b/gnulib/tests/unictype/test-pr_bidi_arabic_digit.c
new file mode 100644
index 00000000..f4e4edb8
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_arabic_digit.c
@@ -0,0 +1,26 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0600, 0x0603 },
+ { 0x0660, 0x0669 },
+ { 0x066B, 0x066C },
+ { 0x06DD, 0x06DD }
+
+#define PREDICATE(c) uc_is_property_bidi_arabic_digit (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_arabic_right_to_left.c b/gnulib/tests/unictype/test-pr_bidi_arabic_right_to_left.c
new file mode 100644
index 00000000..f329ccf1
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_arabic_right_to_left.c
@@ -0,0 +1,47 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0604, 0x0605 },
+ { 0x0608, 0x0608 },
+ { 0x060B, 0x060B },
+ { 0x060D, 0x060D },
+ { 0x061B, 0x064A },
+ { 0x065F, 0x065F },
+ { 0x066D, 0x066F },
+ { 0x0671, 0x06D5 },
+ { 0x06E5, 0x06E6 },
+ { 0x06EE, 0x06EF },
+ { 0x06FA, 0x070E },
+ { 0x0710, 0x0710 },
+ { 0x0712, 0x072F },
+ { 0x074B, 0x07A5 },
+ { 0x07B1, 0x07BF },
+ { 0x2065, 0x2069 },
+ { 0xFB50, 0xFD3D },
+ { 0xFD40, 0xFDCF },
+ { 0xFDF0, 0xFDFC },
+ { 0xFDFE, 0xFDFF },
+ { 0xFE1A, 0xFE1F },
+ { 0xFE27, 0xFE2F },
+ { 0xFE53, 0xFE53 },
+ { 0xFE67, 0xFE67 },
+ { 0xFE6C, 0xFEFE }
+
+#define PREDICATE(c) uc_is_property_bidi_arabic_right_to_left (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_block_separator.c b/gnulib/tests/unictype/test-pr_bidi_block_separator.c
new file mode 100644
index 00000000..4b4353d2
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_block_separator.c
@@ -0,0 +1,27 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x000A, 0x000A },
+ { 0x000D, 0x000D },
+ { 0x001C, 0x001E },
+ { 0x0085, 0x0085 },
+ { 0x2029, 0x2029 }
+
+#define PREDICATE(c) uc_is_property_bidi_block_separator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_boundary_neutral.c b/gnulib/tests/unictype/test-pr_bidi_boundary_neutral.c
new file mode 100644
index 00000000..19a67d1b
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_boundary_neutral.c
@@ -0,0 +1,53 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0000, 0x0008 },
+ { 0x000E, 0x001B },
+ { 0x007F, 0x0084 },
+ { 0x0086, 0x009F },
+ { 0x00AD, 0x00AD },
+ { 0x070F, 0x070F },
+ { 0x200B, 0x200D },
+ { 0x2060, 0x2064 },
+ { 0x206A, 0x206F },
+ { 0xFDD0, 0xFDEF },
+ { 0xFEFF, 0xFEFF },
+ { 0xFFF0, 0xFFF8 },
+ { 0xFFFE, 0xFFFF },
+ { 0x1D173, 0x1D17A },
+ { 0x1FFFE, 0x1FFFF },
+ { 0x2FFFE, 0x2FFFF },
+ { 0x3FFFE, 0x3FFFF },
+ { 0x4FFFE, 0x4FFFF },
+ { 0x5FFFE, 0x5FFFF },
+ { 0x6FFFE, 0x6FFFF },
+ { 0x7FFFE, 0x7FFFF },
+ { 0x8FFFE, 0x8FFFF },
+ { 0x9FFFE, 0x9FFFF },
+ { 0xAFFFE, 0xAFFFF },
+ { 0xBFFFE, 0xBFFFF },
+ { 0xCFFFE, 0xCFFFF },
+ { 0xDFFFE, 0xE00FF },
+ { 0xE01F0, 0xE0FFF },
+ { 0xEFFFE, 0xEFFFF },
+ { 0xFFFFE, 0xFFFFF },
+ { 0x10FFFE, 0x10FFFF }
+
+#define PREDICATE(c) uc_is_property_bidi_boundary_neutral (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_common_separator.c b/gnulib/tests/unictype/test-pr_bidi_common_separator.c
new file mode 100644
index 00000000..eeca1825
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_common_separator.c
@@ -0,0 +1,35 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x002C, 0x002C },
+ { 0x002E, 0x002F },
+ { 0x003A, 0x003A },
+ { 0x00A0, 0x00A0 },
+ { 0x060C, 0x060C },
+ { 0x202F, 0x202F },
+ { 0x2044, 0x2044 },
+ { 0xFE50, 0xFE50 },
+ { 0xFE52, 0xFE52 },
+ { 0xFE55, 0xFE55 },
+ { 0xFF0C, 0xFF0C },
+ { 0xFF0E, 0xFF0F },
+ { 0xFF1A, 0xFF1A }
+
+#define PREDICATE(c) uc_is_property_bidi_common_separator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_control.c b/gnulib/tests/unictype/test-pr_bidi_control.c
new file mode 100644
index 00000000..151f116f
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_control.c
@@ -0,0 +1,24 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x200E, 0x200F },
+ { 0x202A, 0x202E }
+
+#define PREDICATE(c) uc_is_property_bidi_control (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_embedding_or_override.c b/gnulib/tests/unictype/test-pr_bidi_embedding_or_override.c
new file mode 100644
index 00000000..4a977170
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_embedding_or_override.c
@@ -0,0 +1,24 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x202A, 0x202B },
+ { 0x202D, 0x202E }
+
+#define PREDICATE(c) uc_is_property_bidi_embedding_or_override (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_eur_num_separator.c b/gnulib/tests/unictype/test-pr_bidi_eur_num_separator.c
new file mode 100644
index 00000000..9b984f6b
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_eur_num_separator.c
@@ -0,0 +1,31 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x002B, 0x002B },
+ { 0x002D, 0x002D },
+ { 0x207A, 0x207B },
+ { 0x208A, 0x208B },
+ { 0x2212, 0x2212 },
+ { 0xFB29, 0xFB29 },
+ { 0xFE62, 0xFE63 },
+ { 0xFF0B, 0xFF0B },
+ { 0xFF0D, 0xFF0D }
+
+#define PREDICATE(c) uc_is_property_bidi_eur_num_separator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_eur_num_terminator.c b/gnulib/tests/unictype/test-pr_bidi_eur_num_terminator.c
new file mode 100644
index 00000000..22f28381
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_eur_num_terminator.c
@@ -0,0 +1,41 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0023, 0x0025 },
+ { 0x00A2, 0x00A5 },
+ { 0x00B0, 0x00B1 },
+ { 0x0609, 0x060A },
+ { 0x066A, 0x066A },
+ { 0x09F2, 0x09F3 },
+ { 0x0AF1, 0x0AF1 },
+ { 0x0BF9, 0x0BF9 },
+ { 0x0E3F, 0x0E3F },
+ { 0x17DB, 0x17DB },
+ { 0x2030, 0x2034 },
+ { 0x20A0, 0x20B5 },
+ { 0x212E, 0x212E },
+ { 0x2213, 0x2213 },
+ { 0xFE5F, 0xFE5F },
+ { 0xFE69, 0xFE6A },
+ { 0xFF03, 0xFF05 },
+ { 0xFFE0, 0xFFE1 },
+ { 0xFFE5, 0xFFE6 }
+
+#define PREDICATE(c) uc_is_property_bidi_eur_num_terminator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_european_digit.c b/gnulib/tests/unictype/test-pr_bidi_european_digit.c
new file mode 100644
index 00000000..63a3a87c
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_european_digit.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x00B2, 0x00B3 },
+ { 0x00B9, 0x00B9 },
+ { 0x06F0, 0x06F9 },
+ { 0x2070, 0x2070 },
+ { 0x2074, 0x2079 },
+ { 0x2080, 0x2089 },
+ { 0x2488, 0x249B },
+ { 0xFF10, 0xFF19 },
+ { 0x1D7CE, 0x1D7FF }
+
+#define PREDICATE(c) uc_is_property_bidi_european_digit (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_hebrew_right_to_left.c b/gnulib/tests/unictype/test-pr_bidi_hebrew_right_to_left.c
new file mode 100644
index 00000000..5a0a4e4b
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_hebrew_right_to_left.c
@@ -0,0 +1,42 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0590, 0x0590 },
+ { 0x05BE, 0x05BE },
+ { 0x05C0, 0x05C0 },
+ { 0x05C3, 0x05C3 },
+ { 0x05C6, 0x05C6 },
+ { 0x05C8, 0x05FF },
+ { 0x07C0, 0x07EA },
+ { 0x07F4, 0x07F5 },
+ { 0x07FA, 0x08FF },
+ { 0x200F, 0x200F },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB28 },
+ { 0xFB2A, 0xFB4F },
+ { 0x10800, 0x1091E },
+ { 0x10920, 0x10A00 },
+ { 0x10A04, 0x10A04 },
+ { 0x10A07, 0x10A0B },
+ { 0x10A10, 0x10A37 },
+ { 0x10A3B, 0x10A3E },
+ { 0x10A40, 0x10FFF }
+
+#define PREDICATE(c) uc_is_property_bidi_hebrew_right_to_left (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_left_to_right.c b/gnulib/tests/unictype/test-pr_bidi_left_to_right.c
new file mode 100644
index 00000000..09617edb
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_left_to_right.c
@@ -0,0 +1,295 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02B8 },
+ { 0x02BB, 0x02C1 },
+ { 0x02D0, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EE, 0x02EE },
+ { 0x0370, 0x0373 },
+ { 0x0376, 0x037D },
+ { 0x037F, 0x0383 },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x03F5 },
+ { 0x03F7, 0x0482 },
+ { 0x048A, 0x0589 },
+ { 0x058B, 0x058F },
+ { 0x0900, 0x0900 },
+ { 0x0903, 0x093B },
+ { 0x093D, 0x0940 },
+ { 0x0949, 0x094C },
+ { 0x094E, 0x0950 },
+ { 0x0955, 0x0961 },
+ { 0x0964, 0x0980 },
+ { 0x0982, 0x09BB },
+ { 0x09BD, 0x09C0 },
+ { 0x09C5, 0x09CC },
+ { 0x09CE, 0x09E1 },
+ { 0x09E4, 0x09F1 },
+ { 0x09F4, 0x0A00 },
+ { 0x0A03, 0x0A3B },
+ { 0x0A3D, 0x0A40 },
+ { 0x0A43, 0x0A46 },
+ { 0x0A49, 0x0A4A },
+ { 0x0A4E, 0x0A50 },
+ { 0x0A52, 0x0A6F },
+ { 0x0A72, 0x0A74 },
+ { 0x0A76, 0x0A80 },
+ { 0x0A83, 0x0ABB },
+ { 0x0ABD, 0x0AC0 },
+ { 0x0AC6, 0x0AC6 },
+ { 0x0AC9, 0x0ACC },
+ { 0x0ACE, 0x0AE1 },
+ { 0x0AE4, 0x0AF0 },
+ { 0x0AF2, 0x0B00 },
+ { 0x0B02, 0x0B3B },
+ { 0x0B3D, 0x0B3E },
+ { 0x0B40, 0x0B40 },
+ { 0x0B45, 0x0B4C },
+ { 0x0B4E, 0x0B55 },
+ { 0x0B57, 0x0B61 },
+ { 0x0B64, 0x0B81 },
+ { 0x0B83, 0x0BBF },
+ { 0x0BC1, 0x0BCC },
+ { 0x0BCE, 0x0BF2 },
+ { 0x0BFB, 0x0C3D },
+ { 0x0C41, 0x0C45 },
+ { 0x0C49, 0x0C49 },
+ { 0x0C4E, 0x0C54 },
+ { 0x0C57, 0x0C61 },
+ { 0x0C64, 0x0C77 },
+ { 0x0C7F, 0x0CBB },
+ { 0x0CBD, 0x0CCB },
+ { 0x0CCE, 0x0CE1 },
+ { 0x0CE4, 0x0CF0 },
+ { 0x0CF3, 0x0D40 },
+ { 0x0D45, 0x0D4C },
+ { 0x0D4E, 0x0D61 },
+ { 0x0D64, 0x0DC9 },
+ { 0x0DCB, 0x0DD1 },
+ { 0x0DD5, 0x0DD5 },
+ { 0x0DD7, 0x0E30 },
+ { 0x0E32, 0x0E33 },
+ { 0x0E3B, 0x0E3E },
+ { 0x0E40, 0x0E46 },
+ { 0x0E4F, 0x0EB0 },
+ { 0x0EB2, 0x0EB3 },
+ { 0x0EBA, 0x0EBA },
+ { 0x0EBD, 0x0EC7 },
+ { 0x0ECE, 0x0F17 },
+ { 0x0F1A, 0x0F34 },
+ { 0x0F36, 0x0F36 },
+ { 0x0F38, 0x0F38 },
+ { 0x0F3E, 0x0F70 },
+ { 0x0F7F, 0x0F7F },
+ { 0x0F85, 0x0F85 },
+ { 0x0F88, 0x0F8F },
+ { 0x0F98, 0x0F98 },
+ { 0x0FBD, 0x0FC5 },
+ { 0x0FC7, 0x102C },
+ { 0x1031, 0x1031 },
+ { 0x1038, 0x1038 },
+ { 0x103B, 0x103C },
+ { 0x103F, 0x1057 },
+ { 0x105A, 0x105D },
+ { 0x1061, 0x1070 },
+ { 0x1075, 0x1081 },
+ { 0x1083, 0x1084 },
+ { 0x1087, 0x108C },
+ { 0x108E, 0x135E },
+ { 0x1360, 0x138F },
+ { 0x139A, 0x167F },
+ { 0x1681, 0x169A },
+ { 0x169D, 0x1711 },
+ { 0x1715, 0x1731 },
+ { 0x1735, 0x1751 },
+ { 0x1754, 0x1771 },
+ { 0x1774, 0x17B6 },
+ { 0x17BE, 0x17C5 },
+ { 0x17C7, 0x17C8 },
+ { 0x17D4, 0x17DA },
+ { 0x17DC, 0x17DC },
+ { 0x17DE, 0x17EF },
+ { 0x17FA, 0x17FF },
+ { 0x180F, 0x18A8 },
+ { 0x18AA, 0x191F },
+ { 0x1923, 0x1926 },
+ { 0x1929, 0x1931 },
+ { 0x1933, 0x1938 },
+ { 0x193C, 0x193F },
+ { 0x1941, 0x1943 },
+ { 0x1946, 0x19DD },
+ { 0x1A00, 0x1A16 },
+ { 0x1A19, 0x1AFF },
+ { 0x1B04, 0x1B33 },
+ { 0x1B35, 0x1B35 },
+ { 0x1B3B, 0x1B3B },
+ { 0x1B3D, 0x1B41 },
+ { 0x1B43, 0x1B6A },
+ { 0x1B74, 0x1B7F },
+ { 0x1B82, 0x1BA1 },
+ { 0x1BA6, 0x1BA7 },
+ { 0x1BAA, 0x1C2B },
+ { 0x1C34, 0x1C35 },
+ { 0x1C38, 0x1DBF },
+ { 0x1DE7, 0x1DFD },
+ { 0x1E00, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FCC },
+ { 0x1FD0, 0x1FDC },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF0, 0x1FFC },
+ { 0x1FFF, 0x1FFF },
+ { 0x200E, 0x200E },
+ { 0x2071, 0x2073 },
+ { 0x207F, 0x207F },
+ { 0x208F, 0x209F },
+ { 0x20B6, 0x20CF },
+ { 0x20F1, 0x20FF },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x212D },
+ { 0x212F, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x2152 },
+ { 0x2160, 0x218F },
+ { 0x2336, 0x237A },
+ { 0x2395, 0x2395 },
+ { 0x23E8, 0x23FF },
+ { 0x2427, 0x243F },
+ { 0x244B, 0x245F },
+ { 0x249C, 0x24E9 },
+ { 0x269E, 0x269F },
+ { 0x26AC, 0x26AC },
+ { 0x26BD, 0x26BF },
+ { 0x26C4, 0x2700 },
+ { 0x2705, 0x2705 },
+ { 0x270A, 0x270B },
+ { 0x2728, 0x2728 },
+ { 0x274C, 0x274C },
+ { 0x274E, 0x274E },
+ { 0x2753, 0x2755 },
+ { 0x2757, 0x2757 },
+ { 0x275F, 0x2760 },
+ { 0x2795, 0x2797 },
+ { 0x27B0, 0x27B0 },
+ { 0x27BF, 0x27BF },
+ { 0x27CB, 0x27CB },
+ { 0x27CD, 0x27CF },
+ { 0x2800, 0x28FF },
+ { 0x2B4D, 0x2B4F },
+ { 0x2B55, 0x2CE4 },
+ { 0x2CEB, 0x2CF8 },
+ { 0x2D00, 0x2DDF },
+ { 0x2E31, 0x2E7F },
+ { 0x2E9A, 0x2E9A },
+ { 0x2EF4, 0x2EFF },
+ { 0x2FD6, 0x2FEF },
+ { 0x2FFC, 0x2FFF },
+ { 0x3005, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3031, 0x3035 },
+ { 0x3038, 0x303C },
+ { 0x3040, 0x3098 },
+ { 0x309D, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x31BF },
+ { 0x31E4, 0x321C },
+ { 0x321F, 0x324F },
+ { 0x3260, 0x327B },
+ { 0x327F, 0x32B0 },
+ { 0x32C0, 0x32CB },
+ { 0x32D0, 0x3376 },
+ { 0x337B, 0x33DD },
+ { 0x33E0, 0x33FE },
+ { 0x3400, 0x4DBF },
+ { 0x4E00, 0xA48F },
+ { 0xA4C7, 0xA60C },
+ { 0xA610, 0xA66E },
+ { 0xA674, 0xA67B },
+ { 0xA680, 0xA6FF },
+ { 0xA722, 0xA787 },
+ { 0xA789, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA824 },
+ { 0xA827, 0xA827 },
+ { 0xA82C, 0xA873 },
+ { 0xA878, 0xA8C3 },
+ { 0xA8C5, 0xA925 },
+ { 0xA92E, 0xA946 },
+ { 0xA952, 0xAA28 },
+ { 0xAA2F, 0xAA30 },
+ { 0xAA33, 0xAA34 },
+ { 0xAA37, 0xAA42 },
+ { 0xAA44, 0xAA4B },
+ { 0xAA4D, 0xFB1C },
+ { 0xFF00, 0xFF00 },
+ { 0xFF21, 0xFF3A },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFFDF },
+ { 0xFFE7, 0xFFE7 },
+ { 0xFFEF, 0xFFEF },
+ { 0x10000, 0x10100 },
+ { 0x10102, 0x1013F },
+ { 0x1018B, 0x1018F },
+ { 0x1019C, 0x101FC },
+ { 0x101FE, 0x107FF },
+ { 0x11000, 0x1D166 },
+ { 0x1D16A, 0x1D172 },
+ { 0x1D183, 0x1D184 },
+ { 0x1D18C, 0x1D1A9 },
+ { 0x1D1AE, 0x1D1FF },
+ { 0x1D246, 0x1D2FF },
+ { 0x1D357, 0x1D7CD },
+ { 0x1D800, 0x1EFFF },
+ { 0x1F02C, 0x1F02F },
+ { 0x1F094, 0x1FFFD },
+ { 0x20000, 0x2FFFD },
+ { 0x30000, 0x3FFFD },
+ { 0x40000, 0x4FFFD },
+ { 0x50000, 0x5FFFD },
+ { 0x60000, 0x6FFFD },
+ { 0x70000, 0x7FFFD },
+ { 0x80000, 0x8FFFD },
+ { 0x90000, 0x9FFFD },
+ { 0xA0000, 0xAFFFD },
+ { 0xB0000, 0xBFFFD },
+ { 0xC0000, 0xCFFFD },
+ { 0xD0000, 0xDFFFD },
+ { 0xE1000, 0xEFFFD },
+ { 0xF0000, 0xFFFFD },
+ { 0x100000, 0x10FFFD }
+
+#define PREDICATE(c) uc_is_property_bidi_left_to_right (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_non_spacing_mark.c b/gnulib/tests/unictype/test-pr_bidi_non_spacing_mark.c
new file mode 100644
index 00000000..927ab845
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_non_spacing_mark.c
@@ -0,0 +1,178 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0300, 0x036F },
+ { 0x0483, 0x0489 },
+ { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x0610, 0x061A },
+ { 0x064B, 0x065E },
+ { 0x0670, 0x0670 },
+ { 0x06D6, 0x06DC },
+ { 0x06DE, 0x06E4 },
+ { 0x06E7, 0x06E8 },
+ { 0x06EA, 0x06ED },
+ { 0x0711, 0x0711 },
+ { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 },
+ { 0x07EB, 0x07F3 },
+ { 0x0901, 0x0902 },
+ { 0x093C, 0x093C },
+ { 0x0941, 0x0948 },
+ { 0x094D, 0x094D },
+ { 0x0951, 0x0954 },
+ { 0x0962, 0x0963 },
+ { 0x0981, 0x0981 },
+ { 0x09BC, 0x09BC },
+ { 0x09C1, 0x09C4 },
+ { 0x09CD, 0x09CD },
+ { 0x09E2, 0x09E3 },
+ { 0x0A01, 0x0A02 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A41, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 },
+ { 0x0A81, 0x0A82 },
+ { 0x0ABC, 0x0ABC },
+ { 0x0AC1, 0x0AC5 },
+ { 0x0AC7, 0x0AC8 },
+ { 0x0ACD, 0x0ACD },
+ { 0x0AE2, 0x0AE3 },
+ { 0x0B01, 0x0B01 },
+ { 0x0B3C, 0x0B3C },
+ { 0x0B3F, 0x0B3F },
+ { 0x0B41, 0x0B44 },
+ { 0x0B4D, 0x0B4D },
+ { 0x0B56, 0x0B56 },
+ { 0x0B62, 0x0B63 },
+ { 0x0B82, 0x0B82 },
+ { 0x0BC0, 0x0BC0 },
+ { 0x0BCD, 0x0BCD },
+ { 0x0C3E, 0x0C40 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C62, 0x0C63 },
+ { 0x0CBC, 0x0CBC },
+ { 0x0CCC, 0x0CCD },
+ { 0x0CE2, 0x0CE3 },
+ { 0x0D41, 0x0D44 },
+ { 0x0D4D, 0x0D4D },
+ { 0x0D62, 0x0D63 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DD2, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0E31, 0x0E31 },
+ { 0x0E34, 0x0E3A },
+ { 0x0E47, 0x0E4E },
+ { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 },
+ { 0x0EBB, 0x0EBC },
+ { 0x0EC8, 0x0ECD },
+ { 0x0F18, 0x0F19 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F71, 0x0F7E },
+ { 0x0F80, 0x0F84 },
+ { 0x0F86, 0x0F87 },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 },
+ { 0x102D, 0x1030 },
+ { 0x1032, 0x1037 },
+ { 0x1039, 0x103A },
+ { 0x103D, 0x103E },
+ { 0x1058, 0x1059 },
+ { 0x105E, 0x1060 },
+ { 0x1071, 0x1074 },
+ { 0x1082, 0x1082 },
+ { 0x1085, 0x1086 },
+ { 0x108D, 0x108D },
+ { 0x135F, 0x135F },
+ { 0x1712, 0x1714 },
+ { 0x1732, 0x1734 },
+ { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 },
+ { 0x17B7, 0x17BD },
+ { 0x17C6, 0x17C6 },
+ { 0x17C9, 0x17D3 },
+ { 0x17DD, 0x17DD },
+ { 0x180B, 0x180D },
+ { 0x18A9, 0x18A9 },
+ { 0x1920, 0x1922 },
+ { 0x1927, 0x1928 },
+ { 0x1932, 0x1932 },
+ { 0x1939, 0x193B },
+ { 0x1A17, 0x1A18 },
+ { 0x1B00, 0x1B03 },
+ { 0x1B34, 0x1B34 },
+ { 0x1B36, 0x1B3A },
+ { 0x1B3C, 0x1B3C },
+ { 0x1B42, 0x1B42 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1B80, 0x1B81 },
+ { 0x1BA2, 0x1BA5 },
+ { 0x1BA8, 0x1BA9 },
+ { 0x1C2C, 0x1C33 },
+ { 0x1C36, 0x1C37 },
+ { 0x1DC0, 0x1DE6 },
+ { 0x1DFE, 0x1DFF },
+ { 0x20D0, 0x20F0 },
+ { 0x2DE0, 0x2DFF },
+ { 0x302A, 0x302F },
+ { 0x3099, 0x309A },
+ { 0xA66F, 0xA672 },
+ { 0xA67C, 0xA67D },
+ { 0xA802, 0xA802 },
+ { 0xA806, 0xA806 },
+ { 0xA80B, 0xA80B },
+ { 0xA825, 0xA826 },
+ { 0xA8C4, 0xA8C4 },
+ { 0xA926, 0xA92D },
+ { 0xA947, 0xA951 },
+ { 0xAA29, 0xAA2E },
+ { 0xAA31, 0xAA32 },
+ { 0xAA35, 0xAA36 },
+ { 0xAA43, 0xAA43 },
+ { 0xAA4C, 0xAA4C },
+ { 0xFB1E, 0xFB1E },
+ { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE26 },
+ { 0x101FD, 0x101FD },
+ { 0x10A01, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A3F },
+ { 0x1D167, 0x1D169 },
+ { 0x1D17B, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_property_bidi_non_spacing_mark (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_other_neutral.c b/gnulib/tests/unictype/test-pr_bidi_other_neutral.c
new file mode 100644
index 00000000..b3efed8b
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_other_neutral.c
@@ -0,0 +1,175 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x0022 },
+ { 0x0026, 0x002A },
+ { 0x003B, 0x0040 },
+ { 0x005B, 0x0060 },
+ { 0x007B, 0x007E },
+ { 0x00A1, 0x00A1 },
+ { 0x00A6, 0x00A9 },
+ { 0x00AB, 0x00AC },
+ { 0x00AE, 0x00AF },
+ { 0x00B4, 0x00B4 },
+ { 0x00B6, 0x00B8 },
+ { 0x00BB, 0x00BF },
+ { 0x00D7, 0x00D7 },
+ { 0x00F7, 0x00F7 },
+ { 0x02B9, 0x02BA },
+ { 0x02C2, 0x02CF },
+ { 0x02D2, 0x02DF },
+ { 0x02E5, 0x02ED },
+ { 0x02EF, 0x02FF },
+ { 0x0374, 0x0375 },
+ { 0x037E, 0x037E },
+ { 0x0384, 0x0385 },
+ { 0x0387, 0x0387 },
+ { 0x03F6, 0x03F6 },
+ { 0x058A, 0x058A },
+ { 0x0606, 0x0607 },
+ { 0x060E, 0x060F },
+ { 0x06E9, 0x06E9 },
+ { 0x07F6, 0x07F9 },
+ { 0x0BF3, 0x0BF8 },
+ { 0x0BFA, 0x0BFA },
+ { 0x0C78, 0x0C7E },
+ { 0x0CF1, 0x0CF2 },
+ { 0x0F3A, 0x0F3D },
+ { 0x1390, 0x1399 },
+ { 0x169B, 0x169C },
+ { 0x17F0, 0x17F9 },
+ { 0x1800, 0x180A },
+ { 0x1940, 0x1940 },
+ { 0x1944, 0x1945 },
+ { 0x19DE, 0x19FF },
+ { 0x1FBD, 0x1FBD },
+ { 0x1FBF, 0x1FC1 },
+ { 0x1FCD, 0x1FCF },
+ { 0x1FDD, 0x1FDF },
+ { 0x1FED, 0x1FEF },
+ { 0x1FFD, 0x1FFE },
+ { 0x2010, 0x2027 },
+ { 0x2035, 0x2043 },
+ { 0x2045, 0x205E },
+ { 0x207C, 0x207E },
+ { 0x208C, 0x208E },
+ { 0x2100, 0x2101 },
+ { 0x2103, 0x2106 },
+ { 0x2108, 0x2109 },
+ { 0x2114, 0x2114 },
+ { 0x2116, 0x2118 },
+ { 0x211E, 0x2123 },
+ { 0x2125, 0x2125 },
+ { 0x2127, 0x2127 },
+ { 0x2129, 0x2129 },
+ { 0x213A, 0x213B },
+ { 0x2140, 0x2144 },
+ { 0x214A, 0x214D },
+ { 0x2153, 0x215F },
+ { 0x2190, 0x2211 },
+ { 0x2214, 0x2335 },
+ { 0x237B, 0x2394 },
+ { 0x2396, 0x23E7 },
+ { 0x2400, 0x2426 },
+ { 0x2440, 0x244A },
+ { 0x2460, 0x2487 },
+ { 0x24EA, 0x269D },
+ { 0x26A0, 0x26AB },
+ { 0x26AD, 0x26BC },
+ { 0x26C0, 0x26C3 },
+ { 0x2701, 0x2704 },
+ { 0x2706, 0x2709 },
+ { 0x270C, 0x2727 },
+ { 0x2729, 0x274B },
+ { 0x274D, 0x274D },
+ { 0x274F, 0x2752 },
+ { 0x2756, 0x2756 },
+ { 0x2758, 0x275E },
+ { 0x2761, 0x2794 },
+ { 0x2798, 0x27AF },
+ { 0x27B1, 0x27BE },
+ { 0x27C0, 0x27CA },
+ { 0x27CC, 0x27CC },
+ { 0x27D0, 0x27FF },
+ { 0x2900, 0x2B4C },
+ { 0x2B50, 0x2B54 },
+ { 0x2CE5, 0x2CEA },
+ { 0x2CF9, 0x2CFF },
+ { 0x2E00, 0x2E30 },
+ { 0x2E80, 0x2E99 },
+ { 0x2E9B, 0x2EF3 },
+ { 0x2F00, 0x2FD5 },
+ { 0x2FF0, 0x2FFB },
+ { 0x3001, 0x3004 },
+ { 0x3008, 0x3020 },
+ { 0x3030, 0x3030 },
+ { 0x3036, 0x3037 },
+ { 0x303D, 0x303F },
+ { 0x309B, 0x309C },
+ { 0x30A0, 0x30A0 },
+ { 0x30FB, 0x30FB },
+ { 0x31C0, 0x31E3 },
+ { 0x321D, 0x321E },
+ { 0x3250, 0x325F },
+ { 0x327C, 0x327E },
+ { 0x32B1, 0x32BF },
+ { 0x32CC, 0x32CF },
+ { 0x3377, 0x337A },
+ { 0x33DE, 0x33DF },
+ { 0x33FF, 0x33FF },
+ { 0x4DC0, 0x4DFF },
+ { 0xA490, 0xA4C6 },
+ { 0xA60D, 0xA60F },
+ { 0xA673, 0xA673 },
+ { 0xA67E, 0xA67F },
+ { 0xA700, 0xA721 },
+ { 0xA788, 0xA788 },
+ { 0xA828, 0xA82B },
+ { 0xA874, 0xA877 },
+ { 0xFD3E, 0xFD3F },
+ { 0xFDFD, 0xFDFD },
+ { 0xFE10, 0xFE19 },
+ { 0xFE30, 0xFE4F },
+ { 0xFE51, 0xFE51 },
+ { 0xFE54, 0xFE54 },
+ { 0xFE56, 0xFE5E },
+ { 0xFE60, 0xFE61 },
+ { 0xFE64, 0xFE66 },
+ { 0xFE68, 0xFE68 },
+ { 0xFE6B, 0xFE6B },
+ { 0xFF01, 0xFF02 },
+ { 0xFF06, 0xFF0A },
+ { 0xFF1B, 0xFF20 },
+ { 0xFF3B, 0xFF40 },
+ { 0xFF5B, 0xFF65 },
+ { 0xFFE2, 0xFFE4 },
+ { 0xFFE8, 0xFFEE },
+ { 0xFFF9, 0xFFFD },
+ { 0x10101, 0x10101 },
+ { 0x10140, 0x1018A },
+ { 0x10190, 0x1019B },
+ { 0x1091F, 0x1091F },
+ { 0x1D200, 0x1D241 },
+ { 0x1D245, 0x1D245 },
+ { 0x1D300, 0x1D356 },
+ { 0x1F000, 0x1F02B },
+ { 0x1F030, 0x1F093 }
+
+#define PREDICATE(c) uc_is_property_bidi_other_neutral (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_pdf.c b/gnulib/tests/unictype/test-pr_bidi_pdf.c
new file mode 100644
index 00000000..e8ff8dd8
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_pdf.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x202C, 0x202C }
+
+#define PREDICATE(c) uc_is_property_bidi_pdf (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_segment_separator.c b/gnulib/tests/unictype/test-pr_bidi_segment_separator.c
new file mode 100644
index 00000000..86ba97b4
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_segment_separator.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0009, 0x0009 },
+ { 0x000B, 0x000B },
+ { 0x001F, 0x001F }
+
+#define PREDICATE(c) uc_is_property_bidi_segment_separator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_bidi_whitespace.c b/gnulib/tests/unictype/test-pr_bidi_whitespace.c
new file mode 100644
index 00000000..646ef4f4
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_bidi_whitespace.c
@@ -0,0 +1,30 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x000C, 0x000C },
+ { 0x0020, 0x0020 },
+ { 0x1680, 0x1680 },
+ { 0x180E, 0x180E },
+ { 0x2000, 0x200A },
+ { 0x2028, 0x2028 },
+ { 0x205F, 0x205F },
+ { 0x3000, 0x3000 }
+
+#define PREDICATE(c) uc_is_property_bidi_whitespace (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_byname.c b/gnulib/tests/unictype/test-pr_byname.c
new file mode 100644
index 00000000..aa2676f0
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_byname.c
@@ -0,0 +1,42 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ {
+ uc_property_t pr = uc_property_byname ("composite");
+ unsigned int c;
+
+ for (c = 0; c < 0x110000; c++)
+ ASSERT (uc_is_property (c, pr) == uc_is_property_composite (c));
+ }
+
+ {
+ uc_property_t pr = uc_property_byname ("foobar");
+ ASSERT (! uc_property_is_valid (pr));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-pr_combining.c b/gnulib/tests/unictype/test-pr_combining.c
new file mode 100644
index 00000000..2a8377a3
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_combining.c
@@ -0,0 +1,183 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0300, 0x036F },
+ { 0x0483, 0x0489 },
+ { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x0610, 0x061A },
+ { 0x064B, 0x065E },
+ { 0x0670, 0x0670 },
+ { 0x06D6, 0x06DC },
+ { 0x06DE, 0x06E4 },
+ { 0x06E7, 0x06E8 },
+ { 0x06EA, 0x06ED },
+ { 0x0711, 0x0711 },
+ { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 },
+ { 0x07EB, 0x07F3 },
+ { 0x0901, 0x0903 },
+ { 0x093C, 0x093C },
+ { 0x093E, 0x094D },
+ { 0x0951, 0x0954 },
+ { 0x0962, 0x0963 },
+ { 0x0981, 0x0983 },
+ { 0x09BC, 0x09BC },
+ { 0x09BE, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CD },
+ { 0x09D7, 0x09D7 },
+ { 0x09E2, 0x09E3 },
+ { 0x0A01, 0x0A03 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0ABC, 0x0ABC },
+ { 0x0ABE, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACD },
+ { 0x0AE2, 0x0AE3 },
+ { 0x0B01, 0x0B03 },
+ { 0x0B3C, 0x0B3C },
+ { 0x0B3E, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4D },
+ { 0x0B56, 0x0B57 },
+ { 0x0B62, 0x0B63 },
+ { 0x0B82, 0x0B82 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCD },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0C01, 0x0C03 },
+ { 0x0C3E, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C62, 0x0C63 },
+ { 0x0C82, 0x0C83 },
+ { 0x0CBC, 0x0CBC },
+ { 0x0CBE, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCD },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CE2, 0x0CE3 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D3E, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4D },
+ { 0x0D57, 0x0D57 },
+ { 0x0D62, 0x0D63 },
+ { 0x0D82, 0x0D83 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF3 },
+ { 0x0E31, 0x0E31 },
+ { 0x0E34, 0x0E3A },
+ { 0x0E47, 0x0E4E },
+ { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 },
+ { 0x0EBB, 0x0EBC },
+ { 0x0EC8, 0x0ECD },
+ { 0x0F18, 0x0F19 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F3E, 0x0F3F },
+ { 0x0F71, 0x0F84 },
+ { 0x0F86, 0x0F87 },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 },
+ { 0x102B, 0x103E },
+ { 0x1056, 0x1059 },
+ { 0x105E, 0x1060 },
+ { 0x1062, 0x1064 },
+ { 0x1067, 0x106D },
+ { 0x1071, 0x1074 },
+ { 0x1082, 0x108D },
+ { 0x108F, 0x108F },
+ { 0x135F, 0x135F },
+ { 0x1712, 0x1714 },
+ { 0x1732, 0x1734 },
+ { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 },
+ { 0x17B6, 0x17D3 },
+ { 0x17DD, 0x17DD },
+ { 0x180B, 0x180D },
+ { 0x18A9, 0x18A9 },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x193B },
+ { 0x19B0, 0x19C0 },
+ { 0x19C8, 0x19C9 },
+ { 0x1A17, 0x1A1B },
+ { 0x1B00, 0x1B04 },
+ { 0x1B34, 0x1B44 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1B80, 0x1B82 },
+ { 0x1BA1, 0x1BAA },
+ { 0x1C24, 0x1C37 },
+ { 0x1DC0, 0x1DE6 },
+ { 0x1DFE, 0x1DFF },
+ { 0x20D0, 0x20F0 },
+ { 0x2DE0, 0x2DFF },
+ { 0x302A, 0x302F },
+ { 0x3099, 0x309A },
+ { 0xA66F, 0xA672 },
+ { 0xA67C, 0xA67D },
+ { 0xA802, 0xA802 },
+ { 0xA806, 0xA806 },
+ { 0xA80B, 0xA80B },
+ { 0xA823, 0xA827 },
+ { 0xA880, 0xA881 },
+ { 0xA8B4, 0xA8C4 },
+ { 0xA926, 0xA92D },
+ { 0xA947, 0xA953 },
+ { 0xAA29, 0xAA36 },
+ { 0xAA43, 0xAA43 },
+ { 0xAA4C, 0xAA4D },
+ { 0xFB1E, 0xFB1E },
+ { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE26 },
+ { 0x101FD, 0x101FD },
+ { 0x10A01, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A3F },
+ { 0x1D165, 0x1D169 },
+ { 0x1D16D, 0x1D172 },
+ { 0x1D17B, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_property_combining (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_composite.c b/gnulib/tests/unictype/test-pr_composite.c
new file mode 100644
index 00000000..c7aff1e8
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_composite.c
@@ -0,0 +1,291 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00BC, 0x00BE },
+ { 0x00C0, 0x00C5 },
+ { 0x00C7, 0x00CF },
+ { 0x00D1, 0x00D6 },
+ { 0x00D9, 0x00DD },
+ { 0x00E0, 0x00E5 },
+ { 0x00E7, 0x00EF },
+ { 0x00F1, 0x00F6 },
+ { 0x00F9, 0x00FD },
+ { 0x00FF, 0x010F },
+ { 0x0112, 0x0125 },
+ { 0x0128, 0x0130 },
+ { 0x0132, 0x0137 },
+ { 0x0139, 0x0140 },
+ { 0x0143, 0x0149 },
+ { 0x014C, 0x0151 },
+ { 0x0154, 0x0165 },
+ { 0x0168, 0x017E },
+ { 0x01A0, 0x01A1 },
+ { 0x01AF, 0x01B0 },
+ { 0x01C4, 0x01DC },
+ { 0x01DE, 0x01E3 },
+ { 0x01E6, 0x01F5 },
+ { 0x01F8, 0x021B },
+ { 0x021E, 0x021F },
+ { 0x0226, 0x0233 },
+ { 0x0344, 0x0344 },
+ { 0x0385, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x0390 },
+ { 0x03AA, 0x03B0 },
+ { 0x03CA, 0x03CE },
+ { 0x03D3, 0x03D4 },
+ { 0x0400, 0x0401 },
+ { 0x0403, 0x0403 },
+ { 0x0407, 0x0407 },
+ { 0x040C, 0x040E },
+ { 0x0419, 0x0419 },
+ { 0x0439, 0x0439 },
+ { 0x0450, 0x0451 },
+ { 0x0453, 0x0453 },
+ { 0x0457, 0x0457 },
+ { 0x045C, 0x045E },
+ { 0x0476, 0x0477 },
+ { 0x04C1, 0x04C2 },
+ { 0x04D0, 0x04D3 },
+ { 0x04D6, 0x04D7 },
+ { 0x04DA, 0x04DF },
+ { 0x04E2, 0x04E7 },
+ { 0x04EA, 0x04F5 },
+ { 0x04F8, 0x04F9 },
+ { 0x0587, 0x0587 },
+ { 0x0622, 0x0626 },
+ { 0x0675, 0x0678 },
+ { 0x06C0, 0x06C0 },
+ { 0x06C2, 0x06C2 },
+ { 0x06D3, 0x06D3 },
+ { 0x0929, 0x0929 },
+ { 0x0931, 0x0931 },
+ { 0x0934, 0x0934 },
+ { 0x0958, 0x095F },
+ { 0x09CB, 0x09CC },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09DF },
+ { 0x0A33, 0x0A33 },
+ { 0x0A36, 0x0A36 },
+ { 0x0A59, 0x0A5B },
+ { 0x0A5E, 0x0A5E },
+ { 0x0B48, 0x0B48 },
+ { 0x0B4B, 0x0B4C },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B94, 0x0B94 },
+ { 0x0BCA, 0x0BCC },
+ { 0x0C48, 0x0C48 },
+ { 0x0CC0, 0x0CC0 },
+ { 0x0CC7, 0x0CC8 },
+ { 0x0CCA, 0x0CCB },
+ { 0x0D4A, 0x0D4C },
+ { 0x0DDA, 0x0DDA },
+ { 0x0DDC, 0x0DDE },
+ { 0x0E33, 0x0E33 },
+ { 0x0EB3, 0x0EB3 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F43, 0x0F43 },
+ { 0x0F4D, 0x0F4D },
+ { 0x0F52, 0x0F52 },
+ { 0x0F57, 0x0F57 },
+ { 0x0F5C, 0x0F5C },
+ { 0x0F69, 0x0F69 },
+ { 0x0F73, 0x0F73 },
+ { 0x0F75, 0x0F79 },
+ { 0x0F81, 0x0F81 },
+ { 0x0F93, 0x0F93 },
+ { 0x0F9D, 0x0F9D },
+ { 0x0FA2, 0x0FA2 },
+ { 0x0FA7, 0x0FA7 },
+ { 0x0FAC, 0x0FAC },
+ { 0x0FB9, 0x0FB9 },
+ { 0x1026, 0x1026 },
+ { 0x1B06, 0x1B06 },
+ { 0x1B08, 0x1B08 },
+ { 0x1B0A, 0x1B0A },
+ { 0x1B0C, 0x1B0C },
+ { 0x1B0E, 0x1B0E },
+ { 0x1B12, 0x1B12 },
+ { 0x1B3B, 0x1B3B },
+ { 0x1B3D, 0x1B3D },
+ { 0x1B40, 0x1B41 },
+ { 0x1B43, 0x1B43 },
+ { 0x1E00, 0x1E9B },
+ { 0x1EA0, 0x1EF9 },
+ { 0x1F00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F70 },
+ { 0x1F72, 0x1F72 },
+ { 0x1F74, 0x1F74 },
+ { 0x1F76, 0x1F76 },
+ { 0x1F78, 0x1F78 },
+ { 0x1F7A, 0x1F7A },
+ { 0x1F7C, 0x1F7C },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBA },
+ { 0x1FBC, 0x1FBC },
+ { 0x1FC1, 0x1FC4 },
+ { 0x1FC6, 0x1FC8 },
+ { 0x1FCA, 0x1FCA },
+ { 0x1FCC, 0x1FD2 },
+ { 0x1FD6, 0x1FDA },
+ { 0x1FDD, 0x1FE2 },
+ { 0x1FE4, 0x1FEA },
+ { 0x1FEC, 0x1FED },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FF8 },
+ { 0x1FFA, 0x1FFA },
+ { 0x1FFC, 0x1FFC },
+ { 0x2025, 0x2026 },
+ { 0x2033, 0x2034 },
+ { 0x2036, 0x2037 },
+ { 0x203C, 0x203C },
+ { 0x2047, 0x2049 },
+ { 0x2057, 0x2057 },
+ { 0x20A8, 0x20A8 },
+ { 0x2100, 0x2101 },
+ { 0x2103, 0x2103 },
+ { 0x2105, 0x2106 },
+ { 0x2109, 0x2109 },
+ { 0x2116, 0x2116 },
+ { 0x2120, 0x2122 },
+ { 0x213B, 0x213B },
+ { 0x2153, 0x215F },
+ { 0x2161, 0x2163 },
+ { 0x2165, 0x2168 },
+ { 0x216A, 0x216B },
+ { 0x2171, 0x2173 },
+ { 0x2175, 0x2178 },
+ { 0x217A, 0x217B },
+ { 0x219A, 0x219B },
+ { 0x21AE, 0x21AE },
+ { 0x21CD, 0x21CF },
+ { 0x2204, 0x2204 },
+ { 0x2209, 0x2209 },
+ { 0x220C, 0x220C },
+ { 0x2224, 0x2224 },
+ { 0x2226, 0x2226 },
+ { 0x222C, 0x222D },
+ { 0x222F, 0x2230 },
+ { 0x2241, 0x2241 },
+ { 0x2244, 0x2244 },
+ { 0x2247, 0x2247 },
+ { 0x2249, 0x2249 },
+ { 0x2260, 0x2260 },
+ { 0x2262, 0x2262 },
+ { 0x226D, 0x2271 },
+ { 0x2274, 0x2275 },
+ { 0x2278, 0x2279 },
+ { 0x2280, 0x2281 },
+ { 0x2284, 0x2285 },
+ { 0x2288, 0x2289 },
+ { 0x22AC, 0x22AF },
+ { 0x22E0, 0x22E3 },
+ { 0x22EA, 0x22ED },
+ { 0x2469, 0x24B5 },
+ { 0x2A0C, 0x2A0C },
+ { 0x2A74, 0x2A76 },
+ { 0x2ADC, 0x2ADC },
+ { 0x304C, 0x304C },
+ { 0x304E, 0x304E },
+ { 0x3050, 0x3050 },
+ { 0x3052, 0x3052 },
+ { 0x3054, 0x3054 },
+ { 0x3056, 0x3056 },
+ { 0x3058, 0x3058 },
+ { 0x305A, 0x305A },
+ { 0x305C, 0x305C },
+ { 0x305E, 0x305E },
+ { 0x3060, 0x3060 },
+ { 0x3062, 0x3062 },
+ { 0x3065, 0x3065 },
+ { 0x3067, 0x3067 },
+ { 0x3069, 0x3069 },
+ { 0x3070, 0x3071 },
+ { 0x3073, 0x3074 },
+ { 0x3076, 0x3077 },
+ { 0x3079, 0x307A },
+ { 0x307C, 0x307D },
+ { 0x3094, 0x3094 },
+ { 0x309E, 0x309F },
+ { 0x30AC, 0x30AC },
+ { 0x30AE, 0x30AE },
+ { 0x30B0, 0x30B0 },
+ { 0x30B2, 0x30B2 },
+ { 0x30B4, 0x30B4 },
+ { 0x30B6, 0x30B6 },
+ { 0x30B8, 0x30B8 },
+ { 0x30BA, 0x30BA },
+ { 0x30BC, 0x30BC },
+ { 0x30BE, 0x30BE },
+ { 0x30C0, 0x30C0 },
+ { 0x30C2, 0x30C2 },
+ { 0x30C5, 0x30C5 },
+ { 0x30C7, 0x30C7 },
+ { 0x30C9, 0x30C9 },
+ { 0x30D0, 0x30D1 },
+ { 0x30D3, 0x30D4 },
+ { 0x30D6, 0x30D7 },
+ { 0x30D9, 0x30DA },
+ { 0x30DC, 0x30DD },
+ { 0x30F4, 0x30F4 },
+ { 0x30F7, 0x30FA },
+ { 0x30FE, 0x30FF },
+ { 0x3200, 0x321E },
+ { 0x3220, 0x3243 },
+ { 0x3250, 0x325F },
+ { 0x326E, 0x327E },
+ { 0x32B1, 0x32CF },
+ { 0x3300, 0x33FF },
+ { 0xAC00, 0xD7A4 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB1F },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFB4F },
+ { 0xFBEA, 0xFBFB },
+ { 0xFC00, 0xFC5D },
+ { 0xFC64, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFC },
+ { 0xFE71, 0xFE71 },
+ { 0xFE77, 0xFE77 },
+ { 0xFE79, 0xFE79 },
+ { 0xFE7B, 0xFE7B },
+ { 0xFE7D, 0xFE7D },
+ { 0xFE7F, 0xFE7F },
+ { 0xFEF5, 0xFEFC },
+ { 0x1D15E, 0x1D164 },
+ { 0x1D1BB, 0x1D1C0 }
+
+#define PREDICATE(c) uc_is_property_composite (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_currency_symbol.c b/gnulib/tests/unictype/test-pr_currency_symbol.c
new file mode 100644
index 00000000..79a37068
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_currency_symbol.c
@@ -0,0 +1,36 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0024, 0x0024 },
+ { 0x00A2, 0x00A5 },
+ { 0x060B, 0x060B },
+ { 0x09F2, 0x09F3 },
+ { 0x0AF1, 0x0AF1 },
+ { 0x0BF9, 0x0BF9 },
+ { 0x0E3F, 0x0E3F },
+ { 0x17DB, 0x17DB },
+ { 0x20A0, 0x20B5 },
+ { 0xFDFC, 0xFDFC },
+ { 0xFE69, 0xFE69 },
+ { 0xFF04, 0xFF04 },
+ { 0xFFE0, 0xFFE1 },
+ { 0xFFE5, 0xFFE6 }
+
+#define PREDICATE(c) uc_is_property_currency_symbol (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_dash.c b/gnulib/tests/unictype/test-pr_dash.c
new file mode 100644
index 00000000..8089772a
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_dash.c
@@ -0,0 +1,40 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x002D, 0x002D },
+ { 0x058A, 0x058A },
+ { 0x05BE, 0x05BE },
+ { 0x1806, 0x1806 },
+ { 0x2010, 0x2015 },
+ { 0x2053, 0x2053 },
+ { 0x207B, 0x207B },
+ { 0x208B, 0x208B },
+ { 0x2212, 0x2212 },
+ { 0x2E17, 0x2E17 },
+ { 0x2E1A, 0x2E1A },
+ { 0x301C, 0x301C },
+ { 0x3030, 0x3030 },
+ { 0x30A0, 0x30A0 },
+ { 0xFE31, 0xFE32 },
+ { 0xFE58, 0xFE58 },
+ { 0xFE63, 0xFE63 },
+ { 0xFF0D, 0xFF0D }
+
+#define PREDICATE(c) uc_is_property_dash (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_decimal_digit.c b/gnulib/tests/unictype/test-pr_decimal_digit.c
new file mode 100644
index 00000000..8d6c284b
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_decimal_digit.c
@@ -0,0 +1,55 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x0660, 0x0669 },
+ { 0x06F0, 0x06F9 },
+ { 0x07C0, 0x07C9 },
+ { 0x0966, 0x096F },
+ { 0x09E6, 0x09EF },
+ { 0x0A66, 0x0A6F },
+ { 0x0AE6, 0x0AEF },
+ { 0x0B66, 0x0B6F },
+ { 0x0BE6, 0x0BEF },
+ { 0x0C66, 0x0C6F },
+ { 0x0CE6, 0x0CEF },
+ { 0x0D66, 0x0D6F },
+ { 0x0E50, 0x0E59 },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0F20, 0x0F29 },
+ { 0x1040, 0x1049 },
+ { 0x1090, 0x1099 },
+ { 0x17E0, 0x17E9 },
+ { 0x1810, 0x1819 },
+ { 0x1946, 0x194F },
+ { 0x19D0, 0x19D9 },
+ { 0x1B50, 0x1B59 },
+ { 0x1BB0, 0x1BB9 },
+ { 0x1C40, 0x1C49 },
+ { 0x1C50, 0x1C59 },
+ { 0xA620, 0xA629 },
+ { 0xA8D0, 0xA8D9 },
+ { 0xA900, 0xA909 },
+ { 0xAA50, 0xAA59 },
+ { 0xFF10, 0xFF19 },
+ { 0x104A0, 0x104A9 },
+ { 0x1D7CE, 0x1D7FF }
+
+#define PREDICATE(c) uc_is_property_decimal_digit (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_default_ignorable_code_point.c b/gnulib/tests/unictype/test-pr_default_ignorable_code_point.c
new file mode 100644
index 00000000..894bc7fd
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_default_ignorable_code_point.c
@@ -0,0 +1,37 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00AD, 0x00AD },
+ { 0x034F, 0x034F },
+ { 0x115F, 0x1160 },
+ { 0x17B4, 0x17B5 },
+ { 0x180B, 0x180D },
+ { 0x200B, 0x200F },
+ { 0x202A, 0x202E },
+ { 0x2060, 0x206F },
+ { 0x3164, 0x3164 },
+ { 0xFE00, 0xFE0F },
+ { 0xFEFF, 0xFEFF },
+ { 0xFFA0, 0xFFA0 },
+ { 0xFFF0, 0xFFF8 },
+ { 0x1D173, 0x1D17A },
+ { 0xE0000, 0xE0FFF }
+
+#define PREDICATE(c) uc_is_property_default_ignorable_code_point (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_deprecated.c b/gnulib/tests/unictype/test-pr_deprecated.c
new file mode 100644
index 00000000..f8af73d9
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_deprecated.c
@@ -0,0 +1,28 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0340, 0x0341 },
+ { 0x17A3, 0x17A3 },
+ { 0x17D3, 0x17D3 },
+ { 0x206A, 0x206F },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F }
+
+#define PREDICATE(c) uc_is_property_deprecated (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_diacritic.c b/gnulib/tests/unictype/test-pr_diacritic.c
new file mode 100644
index 00000000..ae21cd42
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_diacritic.c
@@ -0,0 +1,124 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x005E, 0x005E },
+ { 0x0060, 0x0060 },
+ { 0x00A8, 0x00A8 },
+ { 0x00AF, 0x00AF },
+ { 0x00B4, 0x00B4 },
+ { 0x00B7, 0x00B8 },
+ { 0x02B0, 0x034E },
+ { 0x0350, 0x0357 },
+ { 0x035D, 0x0362 },
+ { 0x0374, 0x0375 },
+ { 0x037A, 0x037A },
+ { 0x0384, 0x0385 },
+ { 0x0483, 0x0487 },
+ { 0x0559, 0x0559 },
+ { 0x0591, 0x05A1 },
+ { 0x05A3, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C4 },
+ { 0x064B, 0x0652 },
+ { 0x0657, 0x0658 },
+ { 0x06DF, 0x06E0 },
+ { 0x06E5, 0x06E6 },
+ { 0x06EA, 0x06EC },
+ { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 },
+ { 0x07EB, 0x07F5 },
+ { 0x093C, 0x093C },
+ { 0x094D, 0x094D },
+ { 0x0951, 0x0954 },
+ { 0x0971, 0x0971 },
+ { 0x09BC, 0x09BC },
+ { 0x09CD, 0x09CD },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A4D, 0x0A4D },
+ { 0x0ABC, 0x0ABC },
+ { 0x0ACD, 0x0ACD },
+ { 0x0B3C, 0x0B3C },
+ { 0x0B4D, 0x0B4D },
+ { 0x0BCD, 0x0BCD },
+ { 0x0C4D, 0x0C4D },
+ { 0x0CBC, 0x0CBC },
+ { 0x0CCD, 0x0CCD },
+ { 0x0D4D, 0x0D4D },
+ { 0x0DCA, 0x0DCA },
+ { 0x0E47, 0x0E4C },
+ { 0x0E4E, 0x0E4E },
+ { 0x0EC8, 0x0ECC },
+ { 0x0F18, 0x0F19 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F3E, 0x0F3F },
+ { 0x0F82, 0x0F84 },
+ { 0x0F86, 0x0F87 },
+ { 0x0FC6, 0x0FC6 },
+ { 0x1037, 0x1037 },
+ { 0x1039, 0x103A },
+ { 0x1087, 0x108D },
+ { 0x108F, 0x108F },
+ { 0x17C9, 0x17D3 },
+ { 0x17DD, 0x17DD },
+ { 0x1939, 0x193B },
+ { 0x1B34, 0x1B34 },
+ { 0x1B44, 0x1B44 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1BAA, 0x1BAA },
+ { 0x1C36, 0x1C37 },
+ { 0x1C78, 0x1C7D },
+ { 0x1D2C, 0x1D6A },
+ { 0x1DC4, 0x1DCF },
+ { 0x1DFE, 0x1DFF },
+ { 0x1FBD, 0x1FBD },
+ { 0x1FBF, 0x1FC1 },
+ { 0x1FCD, 0x1FCF },
+ { 0x1FDD, 0x1FDF },
+ { 0x1FED, 0x1FEF },
+ { 0x1FFD, 0x1FFE },
+ { 0x2E2F, 0x2E2F },
+ { 0x302A, 0x302F },
+ { 0x3099, 0x309C },
+ { 0x30FC, 0x30FC },
+ { 0xA66F, 0xA66F },
+ { 0xA67C, 0xA67D },
+ { 0xA67F, 0xA67F },
+ { 0xA717, 0xA721 },
+ { 0xA788, 0xA788 },
+ { 0xA8C4, 0xA8C4 },
+ { 0xA92B, 0xA92E },
+ { 0xA953, 0xA953 },
+ { 0xFB1E, 0xFB1E },
+ { 0xFE20, 0xFE26 },
+ { 0xFF3E, 0xFF3E },
+ { 0xFF40, 0xFF40 },
+ { 0xFF70, 0xFF70 },
+ { 0xFF9E, 0xFF9F },
+ { 0xFFE3, 0xFFE3 },
+ { 0x1D167, 0x1D169 },
+ { 0x1D16D, 0x1D172 },
+ { 0x1D17B, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD }
+
+#define PREDICATE(c) uc_is_property_diacritic (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_extender.c b/gnulib/tests/unictype/test-pr_extender.c
new file mode 100644
index 00000000..acca2ed0
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_extender.c
@@ -0,0 +1,38 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00B7, 0x00B7 },
+ { 0x02D0, 0x02D1 },
+ { 0x0640, 0x0640 },
+ { 0x07FA, 0x07FA },
+ { 0x0E46, 0x0E46 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x1843, 0x1843 },
+ { 0x1C36, 0x1C36 },
+ { 0x1C7B, 0x1C7B },
+ { 0x3005, 0x3005 },
+ { 0x3031, 0x3035 },
+ { 0x309D, 0x309E },
+ { 0x30FC, 0x30FE },
+ { 0xA015, 0xA015 },
+ { 0xA60C, 0xA60C },
+ { 0xFF70, 0xFF70 }
+
+#define PREDICATE(c) uc_is_property_extender (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_format_control.c b/gnulib/tests/unictype/test-pr_format_control.c
new file mode 100644
index 00000000..258996bd
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_format_control.c
@@ -0,0 +1,30 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00AD, 0x00AD },
+ { 0x070F, 0x070F },
+ { 0x200B, 0x200B },
+ { 0x2060, 0x2064 },
+ { 0x206A, 0x206F },
+ { 0x1D173, 0x1D17A },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F }
+
+#define PREDICATE(c) uc_is_property_format_control (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_grapheme_base.c b/gnulib/tests/unictype/test-pr_grapheme_base.c
new file mode 100644
index 00000000..2fe8bf24
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_grapheme_base.c
@@ -0,0 +1,524 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0020, 0x007E },
+ { 0x00A0, 0x00AC },
+ { 0x00AE, 0x02FF },
+ { 0x0370, 0x0377 },
+ { 0x037A, 0x037E },
+ { 0x0384, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x0482 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x055F },
+ { 0x0561, 0x0587 },
+ { 0x0589, 0x058A },
+ { 0x05BE, 0x05BE },
+ { 0x05C0, 0x05C0 },
+ { 0x05C3, 0x05C3 },
+ { 0x05C6, 0x05C6 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F4 },
+ { 0x0606, 0x060F },
+ { 0x061B, 0x061B },
+ { 0x061E, 0x061F },
+ { 0x0621, 0x064A },
+ { 0x0660, 0x066F },
+ { 0x0671, 0x06D5 },
+ { 0x06E5, 0x06E6 },
+ { 0x06E9, 0x06E9 },
+ { 0x06EE, 0x070D },
+ { 0x0710, 0x0710 },
+ { 0x0712, 0x072F },
+ { 0x074D, 0x07A5 },
+ { 0x07B1, 0x07B1 },
+ { 0x07C0, 0x07EA },
+ { 0x07F4, 0x07FA },
+ { 0x0903, 0x0939 },
+ { 0x093D, 0x0940 },
+ { 0x0949, 0x094C },
+ { 0x0950, 0x0950 },
+ { 0x0958, 0x0961 },
+ { 0x0964, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0982, 0x0983 },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BD, 0x09BD },
+ { 0x09BF, 0x09C0 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CC },
+ { 0x09CE, 0x09CE },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E1 },
+ { 0x09E6, 0x09FA },
+ { 0x0A03, 0x0A03 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A3E, 0x0A40 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A66, 0x0A6F },
+ { 0x0A72, 0x0A74 },
+ { 0x0A83, 0x0A83 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABD, 0x0AC0 },
+ { 0x0AC9, 0x0AC9 },
+ { 0x0ACB, 0x0ACC },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE1 },
+ { 0x0AE6, 0x0AEF },
+ { 0x0AF1, 0x0AF1 },
+ { 0x0B02, 0x0B03 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3D, 0x0B3D },
+ { 0x0B40, 0x0B40 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4C },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B61 },
+ { 0x0B66, 0x0B71 },
+ { 0x0B83, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BBF, 0x0BBF },
+ { 0x0BC1, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCC },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0BE6, 0x0BFA },
+ { 0x0C01, 0x0C03 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C3D },
+ { 0x0C41, 0x0C44 },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C61 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C78, 0x0C7F },
+ { 0x0C82, 0x0C83 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBD, 0x0CBE },
+ { 0x0CC0, 0x0CC1 },
+ { 0x0CC3, 0x0CC4 },
+ { 0x0CC7, 0x0CC8 },
+ { 0x0CCA, 0x0CCB },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE1 },
+ { 0x0CE6, 0x0CEF },
+ { 0x0CF1, 0x0CF2 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D3D },
+ { 0x0D3F, 0x0D40 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4C },
+ { 0x0D60, 0x0D61 },
+ { 0x0D66, 0x0D75 },
+ { 0x0D79, 0x0D7F },
+ { 0x0D82, 0x0D83 },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0DD0, 0x0DD1 },
+ { 0x0DD8, 0x0DDE },
+ { 0x0DF2, 0x0DF4 },
+ { 0x0E01, 0x0E30 },
+ { 0x0E32, 0x0E33 },
+ { 0x0E3F, 0x0E46 },
+ { 0x0E4F, 0x0E5B },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB0 },
+ { 0x0EB2, 0x0EB3 },
+ { 0x0EBD, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F17 },
+ { 0x0F1A, 0x0F34 },
+ { 0x0F36, 0x0F36 },
+ { 0x0F38, 0x0F38 },
+ { 0x0F3A, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F7F, 0x0F7F },
+ { 0x0F85, 0x0F85 },
+ { 0x0F88, 0x0F8B },
+ { 0x0FBE, 0x0FC5 },
+ { 0x0FC7, 0x0FCC },
+ { 0x0FCE, 0x0FD4 },
+ { 0x1000, 0x102C },
+ { 0x1031, 0x1031 },
+ { 0x1038, 0x1038 },
+ { 0x103B, 0x103C },
+ { 0x103F, 0x1057 },
+ { 0x105A, 0x105D },
+ { 0x1061, 0x1070 },
+ { 0x1075, 0x1081 },
+ { 0x1083, 0x1084 },
+ { 0x1087, 0x108C },
+ { 0x108E, 0x1099 },
+ { 0x109E, 0x10C5 },
+ { 0x10D0, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x1360, 0x137C },
+ { 0x1380, 0x1399 },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x1676 },
+ { 0x1680, 0x169C },
+ { 0x16A0, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1711 },
+ { 0x1720, 0x1731 },
+ { 0x1735, 0x1736 },
+ { 0x1740, 0x1751 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1780, 0x17B3 },
+ { 0x17B6, 0x17B6 },
+ { 0x17BE, 0x17C5 },
+ { 0x17C7, 0x17C8 },
+ { 0x17D4, 0x17DC },
+ { 0x17E0, 0x17E9 },
+ { 0x17F0, 0x17F9 },
+ { 0x1800, 0x180A },
+ { 0x180E, 0x180E },
+ { 0x1810, 0x1819 },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18A8 },
+ { 0x18AA, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1923, 0x1926 },
+ { 0x1929, 0x192B },
+ { 0x1930, 0x1931 },
+ { 0x1933, 0x1938 },
+ { 0x1940, 0x1940 },
+ { 0x1944, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19B0, 0x19C9 },
+ { 0x19D0, 0x19D9 },
+ { 0x19DE, 0x1A16 },
+ { 0x1A19, 0x1A1B },
+ { 0x1A1E, 0x1A1F },
+ { 0x1B04, 0x1B33 },
+ { 0x1B35, 0x1B35 },
+ { 0x1B3B, 0x1B3B },
+ { 0x1B3D, 0x1B41 },
+ { 0x1B43, 0x1B4B },
+ { 0x1B50, 0x1B6A },
+ { 0x1B74, 0x1B7C },
+ { 0x1B82, 0x1BA1 },
+ { 0x1BA6, 0x1BA7 },
+ { 0x1BAA, 0x1BAA },
+ { 0x1BAE, 0x1BB9 },
+ { 0x1C00, 0x1C2B },
+ { 0x1C34, 0x1C35 },
+ { 0x1C3B, 0x1C49 },
+ { 0x1C4D, 0x1C7F },
+ { 0x1D00, 0x1DBF },
+ { 0x1E00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FC4 },
+ { 0x1FC6, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FDD, 0x1FEF },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFE },
+ { 0x2000, 0x200A },
+ { 0x2010, 0x2027 },
+ { 0x202F, 0x205F },
+ { 0x2070, 0x2071 },
+ { 0x2074, 0x208E },
+ { 0x2090, 0x2094 },
+ { 0x20A0, 0x20B5 },
+ { 0x2100, 0x214F },
+ { 0x2153, 0x2188 },
+ { 0x2190, 0x23E7 },
+ { 0x2400, 0x2426 },
+ { 0x2440, 0x244A },
+ { 0x2460, 0x269D },
+ { 0x26A0, 0x26BC },
+ { 0x26C0, 0x26C3 },
+ { 0x2701, 0x2704 },
+ { 0x2706, 0x2709 },
+ { 0x270C, 0x2727 },
+ { 0x2729, 0x274B },
+ { 0x274D, 0x274D },
+ { 0x274F, 0x2752 },
+ { 0x2756, 0x2756 },
+ { 0x2758, 0x275E },
+ { 0x2761, 0x2794 },
+ { 0x2798, 0x27AF },
+ { 0x27B1, 0x27BE },
+ { 0x27C0, 0x27CA },
+ { 0x27CC, 0x27CC },
+ { 0x27D0, 0x2B4C },
+ { 0x2B50, 0x2B54 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CEA },
+ { 0x2CF9, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2E00, 0x2E30 },
+ { 0x2E80, 0x2E99 },
+ { 0x2E9B, 0x2EF3 },
+ { 0x2F00, 0x2FD5 },
+ { 0x2FF0, 0x2FFB },
+ { 0x3000, 0x3029 },
+ { 0x3030, 0x303F },
+ { 0x3041, 0x3096 },
+ { 0x309B, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x3190, 0x31B7 },
+ { 0x31C0, 0x31E3 },
+ { 0x31F0, 0x321E },
+ { 0x3220, 0x3243 },
+ { 0x3250, 0x32FE },
+ { 0x3300, 0x4DB5 },
+ { 0x4DC0, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA490, 0xA4C6 },
+ { 0xA500, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66E },
+ { 0xA673, 0xA673 },
+ { 0xA67E, 0xA697 },
+ { 0xA700, 0xA78C },
+ { 0xA7FB, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA824 },
+ { 0xA827, 0xA82B },
+ { 0xA840, 0xA877 },
+ { 0xA880, 0xA8C3 },
+ { 0xA8CE, 0xA8D9 },
+ { 0xA900, 0xA925 },
+ { 0xA92E, 0xA946 },
+ { 0xA952, 0xA953 },
+ { 0xA95F, 0xA95F },
+ { 0xAA00, 0xAA28 },
+ { 0xAA2F, 0xAA30 },
+ { 0xAA33, 0xAA34 },
+ { 0xAA40, 0xAA42 },
+ { 0xAA44, 0xAA4B },
+ { 0xAA4D, 0xAA4D },
+ { 0xAA50, 0xAA59 },
+ { 0xAA5C, 0xAA5F },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3F },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFD },
+ { 0xFE10, 0xFE19 },
+ { 0xFE30, 0xFE52 },
+ { 0xFE54, 0xFE66 },
+ { 0xFE68, 0xFE6B },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFF01, 0xFF9D },
+ { 0xFFA0, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0xFFE0, 0xFFE6 },
+ { 0xFFE8, 0xFFEE },
+ { 0xFFFC, 0xFFFD },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10100, 0x10102 },
+ { 0x10107, 0x10133 },
+ { 0x10137, 0x1018A },
+ { 0x10190, 0x1019B },
+ { 0x101D0, 0x101FC },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10320, 0x10323 },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x1039F, 0x103C3 },
+ { 0x103C8, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x104A0, 0x104A9 },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10919 },
+ { 0x1091F, 0x10939 },
+ { 0x1093F, 0x1093F },
+ { 0x10A00, 0x10A00 },
+ { 0x10A10, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x10A40, 0x10A47 },
+ { 0x10A50, 0x10A58 },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x12470, 0x12473 },
+ { 0x1D000, 0x1D0F5 },
+ { 0x1D100, 0x1D126 },
+ { 0x1D129, 0x1D164 },
+ { 0x1D166, 0x1D166 },
+ { 0x1D16A, 0x1D16D },
+ { 0x1D183, 0x1D184 },
+ { 0x1D18C, 0x1D1A9 },
+ { 0x1D1AE, 0x1D1DD },
+ { 0x1D200, 0x1D241 },
+ { 0x1D245, 0x1D245 },
+ { 0x1D300, 0x1D356 },
+ { 0x1D360, 0x1D371 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF },
+ { 0x1F000, 0x1F02B },
+ { 0x1F030, 0x1F093 },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_property_grapheme_base (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_grapheme_extend.c b/gnulib/tests/unictype/test-pr_grapheme_extend.c
new file mode 100644
index 00000000..fa859bbe
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_grapheme_extend.c
@@ -0,0 +1,194 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0300, 0x036F },
+ { 0x0483, 0x0489 },
+ { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x0610, 0x061A },
+ { 0x064B, 0x065E },
+ { 0x0670, 0x0670 },
+ { 0x06D6, 0x06DC },
+ { 0x06DE, 0x06E4 },
+ { 0x06E7, 0x06E8 },
+ { 0x06EA, 0x06ED },
+ { 0x0711, 0x0711 },
+ { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 },
+ { 0x07EB, 0x07F3 },
+ { 0x0901, 0x0902 },
+ { 0x093C, 0x093C },
+ { 0x0941, 0x0948 },
+ { 0x094D, 0x094D },
+ { 0x0951, 0x0954 },
+ { 0x0962, 0x0963 },
+ { 0x0981, 0x0981 },
+ { 0x09BC, 0x09BC },
+ { 0x09BE, 0x09BE },
+ { 0x09C1, 0x09C4 },
+ { 0x09CD, 0x09CD },
+ { 0x09D7, 0x09D7 },
+ { 0x09E2, 0x09E3 },
+ { 0x0A01, 0x0A02 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A41, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 },
+ { 0x0A81, 0x0A82 },
+ { 0x0ABC, 0x0ABC },
+ { 0x0AC1, 0x0AC5 },
+ { 0x0AC7, 0x0AC8 },
+ { 0x0ACD, 0x0ACD },
+ { 0x0AE2, 0x0AE3 },
+ { 0x0B01, 0x0B01 },
+ { 0x0B3C, 0x0B3C },
+ { 0x0B3E, 0x0B3F },
+ { 0x0B41, 0x0B44 },
+ { 0x0B4D, 0x0B4D },
+ { 0x0B56, 0x0B57 },
+ { 0x0B62, 0x0B63 },
+ { 0x0B82, 0x0B82 },
+ { 0x0BBE, 0x0BBE },
+ { 0x0BC0, 0x0BC0 },
+ { 0x0BCD, 0x0BCD },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0C3E, 0x0C40 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C62, 0x0C63 },
+ { 0x0CBC, 0x0CBC },
+ { 0x0CBF, 0x0CBF },
+ { 0x0CC2, 0x0CC2 },
+ { 0x0CC6, 0x0CC6 },
+ { 0x0CCC, 0x0CCD },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CE2, 0x0CE3 },
+ { 0x0D3E, 0x0D3E },
+ { 0x0D41, 0x0D44 },
+ { 0x0D4D, 0x0D4D },
+ { 0x0D57, 0x0D57 },
+ { 0x0D62, 0x0D63 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DCF, 0x0DCF },
+ { 0x0DD2, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DDF, 0x0DDF },
+ { 0x0E31, 0x0E31 },
+ { 0x0E34, 0x0E3A },
+ { 0x0E47, 0x0E4E },
+ { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 },
+ { 0x0EBB, 0x0EBC },
+ { 0x0EC8, 0x0ECD },
+ { 0x0F18, 0x0F19 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F71, 0x0F7E },
+ { 0x0F80, 0x0F84 },
+ { 0x0F86, 0x0F87 },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 },
+ { 0x102D, 0x1030 },
+ { 0x1032, 0x1037 },
+ { 0x1039, 0x103A },
+ { 0x103D, 0x103E },
+ { 0x1058, 0x1059 },
+ { 0x105E, 0x1060 },
+ { 0x1071, 0x1074 },
+ { 0x1082, 0x1082 },
+ { 0x1085, 0x1086 },
+ { 0x108D, 0x108D },
+ { 0x135F, 0x135F },
+ { 0x1712, 0x1714 },
+ { 0x1732, 0x1734 },
+ { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 },
+ { 0x17B7, 0x17BD },
+ { 0x17C6, 0x17C6 },
+ { 0x17C9, 0x17D3 },
+ { 0x17DD, 0x17DD },
+ { 0x180B, 0x180D },
+ { 0x18A9, 0x18A9 },
+ { 0x1920, 0x1922 },
+ { 0x1927, 0x1928 },
+ { 0x1932, 0x1932 },
+ { 0x1939, 0x193B },
+ { 0x1A17, 0x1A18 },
+ { 0x1B00, 0x1B03 },
+ { 0x1B34, 0x1B34 },
+ { 0x1B36, 0x1B3A },
+ { 0x1B3C, 0x1B3C },
+ { 0x1B42, 0x1B42 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1B80, 0x1B81 },
+ { 0x1BA2, 0x1BA5 },
+ { 0x1BA8, 0x1BA9 },
+ { 0x1C2C, 0x1C33 },
+ { 0x1C36, 0x1C37 },
+ { 0x1DC0, 0x1DE6 },
+ { 0x1DFE, 0x1DFF },
+ { 0x200C, 0x200D },
+ { 0x20D0, 0x20F0 },
+ { 0x2DE0, 0x2DFF },
+ { 0x302A, 0x302F },
+ { 0x3099, 0x309A },
+ { 0xA66F, 0xA672 },
+ { 0xA67C, 0xA67D },
+ { 0xA802, 0xA802 },
+ { 0xA806, 0xA806 },
+ { 0xA80B, 0xA80B },
+ { 0xA825, 0xA826 },
+ { 0xA8C4, 0xA8C4 },
+ { 0xA926, 0xA92D },
+ { 0xA947, 0xA951 },
+ { 0xAA29, 0xAA2E },
+ { 0xAA31, 0xAA32 },
+ { 0xAA35, 0xAA36 },
+ { 0xAA43, 0xAA43 },
+ { 0xAA4C, 0xAA4C },
+ { 0xFB1E, 0xFB1E },
+ { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE26 },
+ { 0xFF9E, 0xFF9F },
+ { 0x101FD, 0x101FD },
+ { 0x10A01, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A3F },
+ { 0x1D165, 0x1D165 },
+ { 0x1D167, 0x1D169 },
+ { 0x1D16E, 0x1D172 },
+ { 0x1D17B, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_property_grapheme_extend (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_grapheme_link.c b/gnulib/tests/unictype/test-pr_grapheme_link.c
new file mode 100644
index 00000000..ff1fa5a4
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_grapheme_link.c
@@ -0,0 +1,44 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x094D, 0x094D },
+ { 0x09CD, 0x09CD },
+ { 0x0A4D, 0x0A4D },
+ { 0x0ACD, 0x0ACD },
+ { 0x0B4D, 0x0B4D },
+ { 0x0BCD, 0x0BCD },
+ { 0x0C4D, 0x0C4D },
+ { 0x0CCD, 0x0CCD },
+ { 0x0D4D, 0x0D4D },
+ { 0x0DCA, 0x0DCA },
+ { 0x0E3A, 0x0E3A },
+ { 0x0F84, 0x0F84 },
+ { 0x1039, 0x103A },
+ { 0x1714, 0x1714 },
+ { 0x1734, 0x1734 },
+ { 0x17D2, 0x17D2 },
+ { 0x1B44, 0x1B44 },
+ { 0x1BAA, 0x1BAA },
+ { 0xA806, 0xA806 },
+ { 0xA8C4, 0xA8C4 },
+ { 0xA953, 0xA953 },
+ { 0x10A3F, 0x10A3F }
+
+#define PREDICATE(c) uc_is_property_grapheme_link (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_hex_digit.c b/gnulib/tests/unictype/test-pr_hex_digit.c
new file mode 100644
index 00000000..1a761b83
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_hex_digit.c
@@ -0,0 +1,28 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x0041, 0x0046 },
+ { 0x0061, 0x0066 },
+ { 0xFF10, 0xFF19 },
+ { 0xFF21, 0xFF26 },
+ { 0xFF41, 0xFF46 }
+
+#define PREDICATE(c) uc_is_property_hex_digit (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_hyphen.c b/gnulib/tests/unictype/test-pr_hyphen.c
new file mode 100644
index 00000000..9557fbad
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_hyphen.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x002D, 0x002D },
+ { 0x00AD, 0x00AD },
+ { 0x058A, 0x058A },
+ { 0x1806, 0x1806 },
+ { 0x2010, 0x2011 },
+ { 0x2E17, 0x2E17 },
+ { 0x30FB, 0x30FB },
+ { 0xFE63, 0xFE63 },
+ { 0xFF0D, 0xFF0D },
+ { 0xFF65, 0xFF65 }
+
+#define PREDICATE(c) uc_is_property_hyphen (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_id_continue.c b/gnulib/tests/unictype/test-pr_id_continue.c
new file mode 100644
index 00000000..a900ec93
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_id_continue.c
@@ -0,0 +1,499 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x0041, 0x005A },
+ { 0x005F, 0x005F },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00B7, 0x00B7 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0300, 0x0374 },
+ { 0x0376, 0x0377 },
+ { 0x037A, 0x037D },
+ { 0x0386, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x0483, 0x0487 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x0559 },
+ { 0x0561, 0x0587 },
+ { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0610, 0x061A },
+ { 0x0621, 0x065E },
+ { 0x0660, 0x0669 },
+ { 0x066E, 0x06D3 },
+ { 0x06D5, 0x06DC },
+ { 0x06DF, 0x06E8 },
+ { 0x06EA, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x074A },
+ { 0x074D, 0x07B1 },
+ { 0x07C0, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0901, 0x0939 },
+ { 0x093C, 0x094D },
+ { 0x0950, 0x0954 },
+ { 0x0958, 0x0963 },
+ { 0x0966, 0x096F },
+ { 0x0971, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0981, 0x0983 },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BC, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CE },
+ { 0x09D7, 0x09D7 },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E3 },
+ { 0x09E6, 0x09F1 },
+ { 0x0A01, 0x0A03 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A66, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABC, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE3 },
+ { 0x0AE6, 0x0AEF },
+ { 0x0B01, 0x0B03 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3C, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4D },
+ { 0x0B56, 0x0B57 },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B63 },
+ { 0x0B66, 0x0B6F },
+ { 0x0B71, 0x0B71 },
+ { 0x0B82, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCD },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0BE6, 0x0BEF },
+ { 0x0C01, 0x0C03 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C63 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C82, 0x0C83 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBC, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCD },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE3 },
+ { 0x0CE6, 0x0CEF },
+ { 0x0D02, 0x0D03 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4D },
+ { 0x0D57, 0x0D57 },
+ { 0x0D60, 0x0D63 },
+ { 0x0D66, 0x0D6F },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D82, 0x0D83 },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF3 },
+ { 0x0E01, 0x0E3A },
+ { 0x0E40, 0x0E4E },
+ { 0x0E50, 0x0E59 },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB9 },
+ { 0x0EBB, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0EC8, 0x0ECD },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F18, 0x0F19 },
+ { 0x0F20, 0x0F29 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F3E, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F71, 0x0F84 },
+ { 0x0F86, 0x0F8B },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 },
+ { 0x1000, 0x1049 },
+ { 0x1050, 0x1099 },
+ { 0x10A0, 0x10C5 },
+ { 0x10D0, 0x10FA },
+ { 0x10FC, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x135F, 0x135F },
+ { 0x1369, 0x1371 },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x16EE, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1714 },
+ { 0x1720, 0x1734 },
+ { 0x1740, 0x1753 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1772, 0x1773 },
+ { 0x1780, 0x17B3 },
+ { 0x17B6, 0x17D3 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DC, 0x17DD },
+ { 0x17E0, 0x17E9 },
+ { 0x180B, 0x180D },
+ { 0x1810, 0x1819 },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x193B },
+ { 0x1946, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19B0, 0x19C9 },
+ { 0x19D0, 0x19D9 },
+ { 0x1A00, 0x1A1B },
+ { 0x1B00, 0x1B4B },
+ { 0x1B50, 0x1B59 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1B80, 0x1BAA },
+ { 0x1BAE, 0x1BB9 },
+ { 0x1C00, 0x1C37 },
+ { 0x1C40, 0x1C49 },
+ { 0x1C4D, 0x1C7D },
+ { 0x1D00, 0x1DE6 },
+ { 0x1DFE, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x203F, 0x2040 },
+ { 0x2054, 0x2054 },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x20D0, 0x20DC },
+ { 0x20E1, 0x20E1 },
+ { 0x20E5, 0x20F0 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2118, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2160, 0x2188 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2DE0, 0x2DFF },
+ { 0x3005, 0x3007 },
+ { 0x3021, 0x302F },
+ { 0x3031, 0x3035 },
+ { 0x3038, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x3099, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA500, 0xA60C },
+ { 0xA610, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66F },
+ { 0xA67C, 0xA67D },
+ { 0xA67F, 0xA697 },
+ { 0xA717, 0xA71F },
+ { 0xA722, 0xA788 },
+ { 0xA78B, 0xA78C },
+ { 0xA7FB, 0xA827 },
+ { 0xA840, 0xA873 },
+ { 0xA880, 0xA8C4 },
+ { 0xA8D0, 0xA8D9 },
+ { 0xA900, 0xA92D },
+ { 0xA930, 0xA953 },
+ { 0xAA00, 0xAA36 },
+ { 0xAA40, 0xAA4D },
+ { 0xAA50, 0xAA59 },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFB },
+ { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE26 },
+ { 0xFE33, 0xFE34 },
+ { 0xFE4D, 0xFE4F },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFF10, 0xFF19 },
+ { 0xFF21, 0xFF3A },
+ { 0xFF3F, 0xFF3F },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10140, 0x10174 },
+ { 0x101FD, 0x101FD },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x103D1, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x104A0, 0x104A9 },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A3F },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x1D165, 0x1D169 },
+ { 0x1D16D, 0x1D172 },
+ { 0x1D17B, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_property_id_continue (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_id_start.c b/gnulib/tests/unictype/test-pr_id_start.c
new file mode 100644
index 00000000..15b4bd9e
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_id_start.c
@@ -0,0 +1,414 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0370, 0x0374 },
+ { 0x0376, 0x0377 },
+ { 0x037A, 0x037D },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x0559 },
+ { 0x0561, 0x0587 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0621, 0x064A },
+ { 0x066E, 0x066F },
+ { 0x0671, 0x06D3 },
+ { 0x06D5, 0x06D5 },
+ { 0x06E5, 0x06E6 },
+ { 0x06EE, 0x06EF },
+ { 0x06FA, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x0710 },
+ { 0x0712, 0x072F },
+ { 0x074D, 0x07A5 },
+ { 0x07B1, 0x07B1 },
+ { 0x07CA, 0x07EA },
+ { 0x07F4, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0904, 0x0939 },
+ { 0x093D, 0x093D },
+ { 0x0950, 0x0950 },
+ { 0x0958, 0x0961 },
+ { 0x0971, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BD, 0x09BD },
+ { 0x09CE, 0x09CE },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E1 },
+ { 0x09F0, 0x09F1 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A72, 0x0A74 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABD, 0x0ABD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE1 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3D, 0x0B3D },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B61 },
+ { 0x0B71, 0x0B71 },
+ { 0x0B83, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C3D },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C61 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBD, 0x0CBD },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE1 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D3D },
+ { 0x0D60, 0x0D61 },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0E01, 0x0E30 },
+ { 0x0E32, 0x0E33 },
+ { 0x0E40, 0x0E46 },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB0 },
+ { 0x0EB2, 0x0EB3 },
+ { 0x0EBD, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F40, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F88, 0x0F8B },
+ { 0x1000, 0x102A },
+ { 0x103F, 0x103F },
+ { 0x1050, 0x1055 },
+ { 0x105A, 0x105D },
+ { 0x1061, 0x1061 },
+ { 0x1065, 0x1066 },
+ { 0x106E, 0x1070 },
+ { 0x1075, 0x1081 },
+ { 0x108E, 0x108E },
+ { 0x10A0, 0x10C5 },
+ { 0x10D0, 0x10FA },
+ { 0x10FC, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x16EE, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1711 },
+ { 0x1720, 0x1731 },
+ { 0x1740, 0x1751 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1780, 0x17B3 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DC, 0x17DC },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18A8 },
+ { 0x18AA, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1950, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19C1, 0x19C7 },
+ { 0x1A00, 0x1A16 },
+ { 0x1B05, 0x1B33 },
+ { 0x1B45, 0x1B4B },
+ { 0x1B83, 0x1BA0 },
+ { 0x1BAE, 0x1BAF },
+ { 0x1C00, 0x1C23 },
+ { 0x1C4D, 0x1C4F },
+ { 0x1C5A, 0x1C7D },
+ { 0x1D00, 0x1DBF },
+ { 0x1E00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2118, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2160, 0x2188 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x3005, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3031, 0x3035 },
+ { 0x3038, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x309B, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA500, 0xA60C },
+ { 0xA610, 0xA61F },
+ { 0xA62A, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66E },
+ { 0xA67F, 0xA697 },
+ { 0xA717, 0xA71F },
+ { 0xA722, 0xA788 },
+ { 0xA78B, 0xA78C },
+ { 0xA7FB, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA822 },
+ { 0xA840, 0xA873 },
+ { 0xA882, 0xA8B3 },
+ { 0xA90A, 0xA925 },
+ { 0xA930, 0xA946 },
+ { 0xAA00, 0xAA28 },
+ { 0xAA40, 0xAA42 },
+ { 0xAA44, 0xAA4B },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDFB },
+ { 0xFE70, 0xFE74 },
+ { 0xFE76, 0xFEFC },
+ { 0xFF21, 0xFF3A },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10140, 0x10174 },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x103D1, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A00 },
+ { 0x10A10, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_property_id_start (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_ideographic.c b/gnulib/tests/unictype/test-pr_ideographic.c
new file mode 100644
index 00000000..c61195db
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_ideographic.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x3006, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3038, 0x303A },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_property_ideographic (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_ids_binary_operator.c b/gnulib/tests/unictype/test-pr_ids_binary_operator.c
new file mode 100644
index 00000000..cc6e39a6
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_ids_binary_operator.c
@@ -0,0 +1,24 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2FF0, 0x2FF1 },
+ { 0x2FF4, 0x2FFB }
+
+#define PREDICATE(c) uc_is_property_ids_binary_operator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_ids_trinary_operator.c b/gnulib/tests/unictype/test-pr_ids_trinary_operator.c
new file mode 100644
index 00000000..c95de7fe
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_ids_trinary_operator.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2FF2, 0x2FF3 }
+
+#define PREDICATE(c) uc_is_property_ids_trinary_operator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_ignorable_control.c b/gnulib/tests/unictype/test-pr_ignorable_control.c
new file mode 100644
index 00000000..58d38b52
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_ignorable_control.c
@@ -0,0 +1,40 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0001, 0x0008 },
+ { 0x000E, 0x001B },
+ { 0x007F, 0x0084 },
+ { 0x0086, 0x009F },
+ { 0x00AD, 0x00AD },
+ { 0x0600, 0x0603 },
+ { 0x06DD, 0x06DD },
+ { 0x070F, 0x070F },
+ { 0x17B4, 0x17B5 },
+ { 0x200B, 0x200F },
+ { 0x202A, 0x202E },
+ { 0x2060, 0x2064 },
+ { 0x206A, 0x206F },
+ { 0xFEFF, 0xFEFF },
+ { 0xFFF9, 0xFFFB },
+ { 0x1D173, 0x1D17A },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F }
+
+#define PREDICATE(c) uc_is_property_ignorable_control (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_iso_control.c b/gnulib/tests/unictype/test-pr_iso_control.c
new file mode 100644
index 00000000..c7d26971
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_iso_control.c
@@ -0,0 +1,24 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0000, 0x001F },
+ { 0x007F, 0x009F }
+
+#define PREDICATE(c) uc_is_property_iso_control (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_join_control.c b/gnulib/tests/unictype/test-pr_join_control.c
new file mode 100644
index 00000000..a452700c
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_join_control.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x200C, 0x200D }
+
+#define PREDICATE(c) uc_is_property_join_control (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_left_of_pair.c b/gnulib/tests/unictype/test-pr_left_of_pair.c
new file mode 100644
index 00000000..5aed7aa0
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_left_of_pair.c
@@ -0,0 +1,63 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0028, 0x0028 },
+ { 0x005B, 0x005B },
+ { 0x007B, 0x007B },
+ { 0x00AB, 0x00AB },
+ { 0x0F3A, 0x0F3A },
+ { 0x0F3C, 0x0F3C },
+ { 0x169B, 0x169B },
+ { 0x2018, 0x2018 },
+ { 0x201A, 0x201C },
+ { 0x201E, 0x201F },
+ { 0x2039, 0x2039 },
+ { 0x2045, 0x2045 },
+ { 0x207D, 0x207D },
+ { 0x208D, 0x208D },
+ { 0x2329, 0x2329 },
+ { 0x3008, 0x3008 },
+ { 0x300A, 0x300A },
+ { 0x300C, 0x300C },
+ { 0x300E, 0x300E },
+ { 0x3010, 0x3010 },
+ { 0x3014, 0x3014 },
+ { 0x3016, 0x3016 },
+ { 0x3018, 0x3018 },
+ { 0x301A, 0x301A },
+ { 0x301D, 0x301D },
+ { 0xFD3E, 0xFD3E },
+ { 0xFE35, 0xFE35 },
+ { 0xFE37, 0xFE37 },
+ { 0xFE39, 0xFE39 },
+ { 0xFE3B, 0xFE3B },
+ { 0xFE3D, 0xFE3D },
+ { 0xFE3F, 0xFE3F },
+ { 0xFE41, 0xFE41 },
+ { 0xFE43, 0xFE43 },
+ { 0xFE59, 0xFE59 },
+ { 0xFE5B, 0xFE5B },
+ { 0xFE5D, 0xFE5D },
+ { 0xFF08, 0xFF08 },
+ { 0xFF3B, 0xFF3B },
+ { 0xFF5B, 0xFF5B },
+ { 0xFF62, 0xFF62 }
+
+#define PREDICATE(c) uc_is_property_left_of_pair (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_line_separator.c b/gnulib/tests/unictype/test-pr_line_separator.c
new file mode 100644
index 00000000..2f16de13
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_line_separator.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2028, 0x2028 }
+
+#define PREDICATE(c) uc_is_property_line_separator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_logical_order_exception.c b/gnulib/tests/unictype/test-pr_logical_order_exception.c
new file mode 100644
index 00000000..b9ca4327
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_logical_order_exception.c
@@ -0,0 +1,24 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0E40, 0x0E44 },
+ { 0x0EC0, 0x0EC4 }
+
+#define PREDICATE(c) uc_is_property_logical_order_exception (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_lowercase.c b/gnulib/tests/unictype/test-pr_lowercase.c
new file mode 100644
index 00000000..cac34e7d
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_lowercase.c
@@ -0,0 +1,623 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00DF, 0x00F6 },
+ { 0x00F8, 0x00FF },
+ { 0x0101, 0x0101 },
+ { 0x0103, 0x0103 },
+ { 0x0105, 0x0105 },
+ { 0x0107, 0x0107 },
+ { 0x0109, 0x0109 },
+ { 0x010B, 0x010B },
+ { 0x010D, 0x010D },
+ { 0x010F, 0x010F },
+ { 0x0111, 0x0111 },
+ { 0x0113, 0x0113 },
+ { 0x0115, 0x0115 },
+ { 0x0117, 0x0117 },
+ { 0x0119, 0x0119 },
+ { 0x011B, 0x011B },
+ { 0x011D, 0x011D },
+ { 0x011F, 0x011F },
+ { 0x0121, 0x0121 },
+ { 0x0123, 0x0123 },
+ { 0x0125, 0x0125 },
+ { 0x0127, 0x0127 },
+ { 0x0129, 0x0129 },
+ { 0x012B, 0x012B },
+ { 0x012D, 0x012D },
+ { 0x012F, 0x012F },
+ { 0x0131, 0x0131 },
+ { 0x0133, 0x0133 },
+ { 0x0135, 0x0135 },
+ { 0x0137, 0x0138 },
+ { 0x013A, 0x013A },
+ { 0x013C, 0x013C },
+ { 0x013E, 0x013E },
+ { 0x0140, 0x0140 },
+ { 0x0142, 0x0142 },
+ { 0x0144, 0x0144 },
+ { 0x0146, 0x0146 },
+ { 0x0148, 0x0149 },
+ { 0x014B, 0x014B },
+ { 0x014D, 0x014D },
+ { 0x014F, 0x014F },
+ { 0x0151, 0x0151 },
+ { 0x0153, 0x0153 },
+ { 0x0155, 0x0155 },
+ { 0x0157, 0x0157 },
+ { 0x0159, 0x0159 },
+ { 0x015B, 0x015B },
+ { 0x015D, 0x015D },
+ { 0x015F, 0x015F },
+ { 0x0161, 0x0161 },
+ { 0x0163, 0x0163 },
+ { 0x0165, 0x0165 },
+ { 0x0167, 0x0167 },
+ { 0x0169, 0x0169 },
+ { 0x016B, 0x016B },
+ { 0x016D, 0x016D },
+ { 0x016F, 0x016F },
+ { 0x0171, 0x0171 },
+ { 0x0173, 0x0173 },
+ { 0x0175, 0x0175 },
+ { 0x0177, 0x0177 },
+ { 0x017A, 0x017A },
+ { 0x017C, 0x017C },
+ { 0x017E, 0x0180 },
+ { 0x0183, 0x0183 },
+ { 0x0185, 0x0185 },
+ { 0x0188, 0x0188 },
+ { 0x018C, 0x018D },
+ { 0x0192, 0x0192 },
+ { 0x0195, 0x0195 },
+ { 0x0199, 0x019B },
+ { 0x019E, 0x019E },
+ { 0x01A1, 0x01A1 },
+ { 0x01A3, 0x01A3 },
+ { 0x01A5, 0x01A5 },
+ { 0x01A8, 0x01A8 },
+ { 0x01AA, 0x01AB },
+ { 0x01AD, 0x01AD },
+ { 0x01B0, 0x01B0 },
+ { 0x01B4, 0x01B4 },
+ { 0x01B6, 0x01B6 },
+ { 0x01B9, 0x01BA },
+ { 0x01BD, 0x01BF },
+ { 0x01C6, 0x01C6 },
+ { 0x01C9, 0x01C9 },
+ { 0x01CC, 0x01CC },
+ { 0x01CE, 0x01CE },
+ { 0x01D0, 0x01D0 },
+ { 0x01D2, 0x01D2 },
+ { 0x01D4, 0x01D4 },
+ { 0x01D6, 0x01D6 },
+ { 0x01D8, 0x01D8 },
+ { 0x01DA, 0x01DA },
+ { 0x01DC, 0x01DD },
+ { 0x01DF, 0x01DF },
+ { 0x01E1, 0x01E1 },
+ { 0x01E3, 0x01E3 },
+ { 0x01E5, 0x01E5 },
+ { 0x01E7, 0x01E7 },
+ { 0x01E9, 0x01E9 },
+ { 0x01EB, 0x01EB },
+ { 0x01ED, 0x01ED },
+ { 0x01EF, 0x01F0 },
+ { 0x01F3, 0x01F3 },
+ { 0x01F5, 0x01F5 },
+ { 0x01F9, 0x01F9 },
+ { 0x01FB, 0x01FB },
+ { 0x01FD, 0x01FD },
+ { 0x01FF, 0x01FF },
+ { 0x0201, 0x0201 },
+ { 0x0203, 0x0203 },
+ { 0x0205, 0x0205 },
+ { 0x0207, 0x0207 },
+ { 0x0209, 0x0209 },
+ { 0x020B, 0x020B },
+ { 0x020D, 0x020D },
+ { 0x020F, 0x020F },
+ { 0x0211, 0x0211 },
+ { 0x0213, 0x0213 },
+ { 0x0215, 0x0215 },
+ { 0x0217, 0x0217 },
+ { 0x0219, 0x0219 },
+ { 0x021B, 0x021B },
+ { 0x021D, 0x021D },
+ { 0x021F, 0x021F },
+ { 0x0221, 0x0221 },
+ { 0x0223, 0x0223 },
+ { 0x0225, 0x0225 },
+ { 0x0227, 0x0227 },
+ { 0x0229, 0x0229 },
+ { 0x022B, 0x022B },
+ { 0x022D, 0x022D },
+ { 0x022F, 0x022F },
+ { 0x0231, 0x0231 },
+ { 0x0233, 0x0239 },
+ { 0x023C, 0x023C },
+ { 0x023F, 0x0240 },
+ { 0x0242, 0x0242 },
+ { 0x0247, 0x0247 },
+ { 0x0249, 0x0249 },
+ { 0x024B, 0x024B },
+ { 0x024D, 0x024D },
+ { 0x024F, 0x0293 },
+ { 0x0295, 0x02B8 },
+ { 0x02C0, 0x02C1 },
+ { 0x02E0, 0x02E4 },
+ { 0x0345, 0x0345 },
+ { 0x0371, 0x0371 },
+ { 0x0373, 0x0373 },
+ { 0x0377, 0x0377 },
+ { 0x037A, 0x037D },
+ { 0x0390, 0x0390 },
+ { 0x03AC, 0x03CE },
+ { 0x03D0, 0x03D1 },
+ { 0x03D5, 0x03D7 },
+ { 0x03D9, 0x03D9 },
+ { 0x03DB, 0x03DB },
+ { 0x03DD, 0x03DD },
+ { 0x03DF, 0x03DF },
+ { 0x03E1, 0x03E1 },
+ { 0x03E3, 0x03E3 },
+ { 0x03E5, 0x03E5 },
+ { 0x03E7, 0x03E7 },
+ { 0x03E9, 0x03E9 },
+ { 0x03EB, 0x03EB },
+ { 0x03ED, 0x03ED },
+ { 0x03EF, 0x03F3 },
+ { 0x03F5, 0x03F5 },
+ { 0x03F8, 0x03F8 },
+ { 0x03FB, 0x03FC },
+ { 0x0430, 0x045F },
+ { 0x0461, 0x0461 },
+ { 0x0463, 0x0463 },
+ { 0x0465, 0x0465 },
+ { 0x0467, 0x0467 },
+ { 0x0469, 0x0469 },
+ { 0x046B, 0x046B },
+ { 0x046D, 0x046D },
+ { 0x046F, 0x046F },
+ { 0x0471, 0x0471 },
+ { 0x0473, 0x0473 },
+ { 0x0475, 0x0475 },
+ { 0x0477, 0x0477 },
+ { 0x0479, 0x0479 },
+ { 0x047B, 0x047B },
+ { 0x047D, 0x047D },
+ { 0x047F, 0x047F },
+ { 0x0481, 0x0481 },
+ { 0x048B, 0x048B },
+ { 0x048D, 0x048D },
+ { 0x048F, 0x048F },
+ { 0x0491, 0x0491 },
+ { 0x0493, 0x0493 },
+ { 0x0495, 0x0495 },
+ { 0x0497, 0x0497 },
+ { 0x0499, 0x0499 },
+ { 0x049B, 0x049B },
+ { 0x049D, 0x049D },
+ { 0x049F, 0x049F },
+ { 0x04A1, 0x04A1 },
+ { 0x04A3, 0x04A3 },
+ { 0x04A5, 0x04A5 },
+ { 0x04A7, 0x04A7 },
+ { 0x04A9, 0x04A9 },
+ { 0x04AB, 0x04AB },
+ { 0x04AD, 0x04AD },
+ { 0x04AF, 0x04AF },
+ { 0x04B1, 0x04B1 },
+ { 0x04B3, 0x04B3 },
+ { 0x04B5, 0x04B5 },
+ { 0x04B7, 0x04B7 },
+ { 0x04B9, 0x04B9 },
+ { 0x04BB, 0x04BB },
+ { 0x04BD, 0x04BD },
+ { 0x04BF, 0x04BF },
+ { 0x04C2, 0x04C2 },
+ { 0x04C4, 0x04C4 },
+ { 0x04C6, 0x04C6 },
+ { 0x04C8, 0x04C8 },
+ { 0x04CA, 0x04CA },
+ { 0x04CC, 0x04CC },
+ { 0x04CE, 0x04CF },
+ { 0x04D1, 0x04D1 },
+ { 0x04D3, 0x04D3 },
+ { 0x04D5, 0x04D5 },
+ { 0x04D7, 0x04D7 },
+ { 0x04D9, 0x04D9 },
+ { 0x04DB, 0x04DB },
+ { 0x04DD, 0x04DD },
+ { 0x04DF, 0x04DF },
+ { 0x04E1, 0x04E1 },
+ { 0x04E3, 0x04E3 },
+ { 0x04E5, 0x04E5 },
+ { 0x04E7, 0x04E7 },
+ { 0x04E9, 0x04E9 },
+ { 0x04EB, 0x04EB },
+ { 0x04ED, 0x04ED },
+ { 0x04EF, 0x04EF },
+ { 0x04F1, 0x04F1 },
+ { 0x04F3, 0x04F3 },
+ { 0x04F5, 0x04F5 },
+ { 0x04F7, 0x04F7 },
+ { 0x04F9, 0x04F9 },
+ { 0x04FB, 0x04FB },
+ { 0x04FD, 0x04FD },
+ { 0x04FF, 0x04FF },
+ { 0x0501, 0x0501 },
+ { 0x0503, 0x0503 },
+ { 0x0505, 0x0505 },
+ { 0x0507, 0x0507 },
+ { 0x0509, 0x0509 },
+ { 0x050B, 0x050B },
+ { 0x050D, 0x050D },
+ { 0x050F, 0x050F },
+ { 0x0511, 0x0511 },
+ { 0x0513, 0x0513 },
+ { 0x0515, 0x0515 },
+ { 0x0517, 0x0517 },
+ { 0x0519, 0x0519 },
+ { 0x051B, 0x051B },
+ { 0x051D, 0x051D },
+ { 0x051F, 0x051F },
+ { 0x0521, 0x0521 },
+ { 0x0523, 0x0523 },
+ { 0x0561, 0x0587 },
+ { 0x1D00, 0x1DBF },
+ { 0x1E01, 0x1E01 },
+ { 0x1E03, 0x1E03 },
+ { 0x1E05, 0x1E05 },
+ { 0x1E07, 0x1E07 },
+ { 0x1E09, 0x1E09 },
+ { 0x1E0B, 0x1E0B },
+ { 0x1E0D, 0x1E0D },
+ { 0x1E0F, 0x1E0F },
+ { 0x1E11, 0x1E11 },
+ { 0x1E13, 0x1E13 },
+ { 0x1E15, 0x1E15 },
+ { 0x1E17, 0x1E17 },
+ { 0x1E19, 0x1E19 },
+ { 0x1E1B, 0x1E1B },
+ { 0x1E1D, 0x1E1D },
+ { 0x1E1F, 0x1E1F },
+ { 0x1E21, 0x1E21 },
+ { 0x1E23, 0x1E23 },
+ { 0x1E25, 0x1E25 },
+ { 0x1E27, 0x1E27 },
+ { 0x1E29, 0x1E29 },
+ { 0x1E2B, 0x1E2B },
+ { 0x1E2D, 0x1E2D },
+ { 0x1E2F, 0x1E2F },
+ { 0x1E31, 0x1E31 },
+ { 0x1E33, 0x1E33 },
+ { 0x1E35, 0x1E35 },
+ { 0x1E37, 0x1E37 },
+ { 0x1E39, 0x1E39 },
+ { 0x1E3B, 0x1E3B },
+ { 0x1E3D, 0x1E3D },
+ { 0x1E3F, 0x1E3F },
+ { 0x1E41, 0x1E41 },
+ { 0x1E43, 0x1E43 },
+ { 0x1E45, 0x1E45 },
+ { 0x1E47, 0x1E47 },
+ { 0x1E49, 0x1E49 },
+ { 0x1E4B, 0x1E4B },
+ { 0x1E4D, 0x1E4D },
+ { 0x1E4F, 0x1E4F },
+ { 0x1E51, 0x1E51 },
+ { 0x1E53, 0x1E53 },
+ { 0x1E55, 0x1E55 },
+ { 0x1E57, 0x1E57 },
+ { 0x1E59, 0x1E59 },
+ { 0x1E5B, 0x1E5B },
+ { 0x1E5D, 0x1E5D },
+ { 0x1E5F, 0x1E5F },
+ { 0x1E61, 0x1E61 },
+ { 0x1E63, 0x1E63 },
+ { 0x1E65, 0x1E65 },
+ { 0x1E67, 0x1E67 },
+ { 0x1E69, 0x1E69 },
+ { 0x1E6B, 0x1E6B },
+ { 0x1E6D, 0x1E6D },
+ { 0x1E6F, 0x1E6F },
+ { 0x1E71, 0x1E71 },
+ { 0x1E73, 0x1E73 },
+ { 0x1E75, 0x1E75 },
+ { 0x1E77, 0x1E77 },
+ { 0x1E79, 0x1E79 },
+ { 0x1E7B, 0x1E7B },
+ { 0x1E7D, 0x1E7D },
+ { 0x1E7F, 0x1E7F },
+ { 0x1E81, 0x1E81 },
+ { 0x1E83, 0x1E83 },
+ { 0x1E85, 0x1E85 },
+ { 0x1E87, 0x1E87 },
+ { 0x1E89, 0x1E89 },
+ { 0x1E8B, 0x1E8B },
+ { 0x1E8D, 0x1E8D },
+ { 0x1E8F, 0x1E8F },
+ { 0x1E91, 0x1E91 },
+ { 0x1E93, 0x1E93 },
+ { 0x1E95, 0x1E9D },
+ { 0x1E9F, 0x1E9F },
+ { 0x1EA1, 0x1EA1 },
+ { 0x1EA3, 0x1EA3 },
+ { 0x1EA5, 0x1EA5 },
+ { 0x1EA7, 0x1EA7 },
+ { 0x1EA9, 0x1EA9 },
+ { 0x1EAB, 0x1EAB },
+ { 0x1EAD, 0x1EAD },
+ { 0x1EAF, 0x1EAF },
+ { 0x1EB1, 0x1EB1 },
+ { 0x1EB3, 0x1EB3 },
+ { 0x1EB5, 0x1EB5 },
+ { 0x1EB7, 0x1EB7 },
+ { 0x1EB9, 0x1EB9 },
+ { 0x1EBB, 0x1EBB },
+ { 0x1EBD, 0x1EBD },
+ { 0x1EBF, 0x1EBF },
+ { 0x1EC1, 0x1EC1 },
+ { 0x1EC3, 0x1EC3 },
+ { 0x1EC5, 0x1EC5 },
+ { 0x1EC7, 0x1EC7 },
+ { 0x1EC9, 0x1EC9 },
+ { 0x1ECB, 0x1ECB },
+ { 0x1ECD, 0x1ECD },
+ { 0x1ECF, 0x1ECF },
+ { 0x1ED1, 0x1ED1 },
+ { 0x1ED3, 0x1ED3 },
+ { 0x1ED5, 0x1ED5 },
+ { 0x1ED7, 0x1ED7 },
+ { 0x1ED9, 0x1ED9 },
+ { 0x1EDB, 0x1EDB },
+ { 0x1EDD, 0x1EDD },
+ { 0x1EDF, 0x1EDF },
+ { 0x1EE1, 0x1EE1 },
+ { 0x1EE3, 0x1EE3 },
+ { 0x1EE5, 0x1EE5 },
+ { 0x1EE7, 0x1EE7 },
+ { 0x1EE9, 0x1EE9 },
+ { 0x1EEB, 0x1EEB },
+ { 0x1EED, 0x1EED },
+ { 0x1EEF, 0x1EEF },
+ { 0x1EF1, 0x1EF1 },
+ { 0x1EF3, 0x1EF3 },
+ { 0x1EF5, 0x1EF5 },
+ { 0x1EF7, 0x1EF7 },
+ { 0x1EF9, 0x1EF9 },
+ { 0x1EFB, 0x1EFB },
+ { 0x1EFD, 0x1EFD },
+ { 0x1EFF, 0x1F07 },
+ { 0x1F10, 0x1F15 },
+ { 0x1F20, 0x1F27 },
+ { 0x1F30, 0x1F37 },
+ { 0x1F40, 0x1F45 },
+ { 0x1F50, 0x1F57 },
+ { 0x1F60, 0x1F67 },
+ { 0x1F70, 0x1F7D },
+ { 0x1F80, 0x1F87 },
+ { 0x1F90, 0x1F97 },
+ { 0x1FA0, 0x1FA7 },
+ { 0x1FB0, 0x1FB4 },
+ { 0x1FB6, 0x1FB7 },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FC7 },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FD7 },
+ { 0x1FE0, 0x1FE7 },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FF7 },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x210A, 0x210A },
+ { 0x210E, 0x210F },
+ { 0x2113, 0x2113 },
+ { 0x212F, 0x212F },
+ { 0x2134, 0x2134 },
+ { 0x2139, 0x2139 },
+ { 0x213C, 0x213D },
+ { 0x2146, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2170, 0x217F },
+ { 0x2184, 0x2184 },
+ { 0x24D0, 0x24E9 },
+ { 0x2C30, 0x2C5E },
+ { 0x2C61, 0x2C61 },
+ { 0x2C65, 0x2C66 },
+ { 0x2C68, 0x2C68 },
+ { 0x2C6A, 0x2C6A },
+ { 0x2C6C, 0x2C6C },
+ { 0x2C71, 0x2C71 },
+ { 0x2C73, 0x2C74 },
+ { 0x2C76, 0x2C7D },
+ { 0x2C81, 0x2C81 },
+ { 0x2C83, 0x2C83 },
+ { 0x2C85, 0x2C85 },
+ { 0x2C87, 0x2C87 },
+ { 0x2C89, 0x2C89 },
+ { 0x2C8B, 0x2C8B },
+ { 0x2C8D, 0x2C8D },
+ { 0x2C8F, 0x2C8F },
+ { 0x2C91, 0x2C91 },
+ { 0x2C93, 0x2C93 },
+ { 0x2C95, 0x2C95 },
+ { 0x2C97, 0x2C97 },
+ { 0x2C99, 0x2C99 },
+ { 0x2C9B, 0x2C9B },
+ { 0x2C9D, 0x2C9D },
+ { 0x2C9F, 0x2C9F },
+ { 0x2CA1, 0x2CA1 },
+ { 0x2CA3, 0x2CA3 },
+ { 0x2CA5, 0x2CA5 },
+ { 0x2CA7, 0x2CA7 },
+ { 0x2CA9, 0x2CA9 },
+ { 0x2CAB, 0x2CAB },
+ { 0x2CAD, 0x2CAD },
+ { 0x2CAF, 0x2CAF },
+ { 0x2CB1, 0x2CB1 },
+ { 0x2CB3, 0x2CB3 },
+ { 0x2CB5, 0x2CB5 },
+ { 0x2CB7, 0x2CB7 },
+ { 0x2CB9, 0x2CB9 },
+ { 0x2CBB, 0x2CBB },
+ { 0x2CBD, 0x2CBD },
+ { 0x2CBF, 0x2CBF },
+ { 0x2CC1, 0x2CC1 },
+ { 0x2CC3, 0x2CC3 },
+ { 0x2CC5, 0x2CC5 },
+ { 0x2CC7, 0x2CC7 },
+ { 0x2CC9, 0x2CC9 },
+ { 0x2CCB, 0x2CCB },
+ { 0x2CCD, 0x2CCD },
+ { 0x2CCF, 0x2CCF },
+ { 0x2CD1, 0x2CD1 },
+ { 0x2CD3, 0x2CD3 },
+ { 0x2CD5, 0x2CD5 },
+ { 0x2CD7, 0x2CD7 },
+ { 0x2CD9, 0x2CD9 },
+ { 0x2CDB, 0x2CDB },
+ { 0x2CDD, 0x2CDD },
+ { 0x2CDF, 0x2CDF },
+ { 0x2CE1, 0x2CE1 },
+ { 0x2CE3, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0xA641, 0xA641 },
+ { 0xA643, 0xA643 },
+ { 0xA645, 0xA645 },
+ { 0xA647, 0xA647 },
+ { 0xA649, 0xA649 },
+ { 0xA64B, 0xA64B },
+ { 0xA64D, 0xA64D },
+ { 0xA64F, 0xA64F },
+ { 0xA651, 0xA651 },
+ { 0xA653, 0xA653 },
+ { 0xA655, 0xA655 },
+ { 0xA657, 0xA657 },
+ { 0xA659, 0xA659 },
+ { 0xA65B, 0xA65B },
+ { 0xA65D, 0xA65D },
+ { 0xA65F, 0xA65F },
+ { 0xA663, 0xA663 },
+ { 0xA665, 0xA665 },
+ { 0xA667, 0xA667 },
+ { 0xA669, 0xA669 },
+ { 0xA66B, 0xA66B },
+ { 0xA66D, 0xA66D },
+ { 0xA681, 0xA681 },
+ { 0xA683, 0xA683 },
+ { 0xA685, 0xA685 },
+ { 0xA687, 0xA687 },
+ { 0xA689, 0xA689 },
+ { 0xA68B, 0xA68B },
+ { 0xA68D, 0xA68D },
+ { 0xA68F, 0xA68F },
+ { 0xA691, 0xA691 },
+ { 0xA693, 0xA693 },
+ { 0xA695, 0xA695 },
+ { 0xA697, 0xA697 },
+ { 0xA723, 0xA723 },
+ { 0xA725, 0xA725 },
+ { 0xA727, 0xA727 },
+ { 0xA729, 0xA729 },
+ { 0xA72B, 0xA72B },
+ { 0xA72D, 0xA72D },
+ { 0xA72F, 0xA731 },
+ { 0xA733, 0xA733 },
+ { 0xA735, 0xA735 },
+ { 0xA737, 0xA737 },
+ { 0xA739, 0xA739 },
+ { 0xA73B, 0xA73B },
+ { 0xA73D, 0xA73D },
+ { 0xA73F, 0xA73F },
+ { 0xA741, 0xA741 },
+ { 0xA743, 0xA743 },
+ { 0xA745, 0xA745 },
+ { 0xA747, 0xA747 },
+ { 0xA749, 0xA749 },
+ { 0xA74B, 0xA74B },
+ { 0xA74D, 0xA74D },
+ { 0xA74F, 0xA74F },
+ { 0xA751, 0xA751 },
+ { 0xA753, 0xA753 },
+ { 0xA755, 0xA755 },
+ { 0xA757, 0xA757 },
+ { 0xA759, 0xA759 },
+ { 0xA75B, 0xA75B },
+ { 0xA75D, 0xA75D },
+ { 0xA75F, 0xA75F },
+ { 0xA761, 0xA761 },
+ { 0xA763, 0xA763 },
+ { 0xA765, 0xA765 },
+ { 0xA767, 0xA767 },
+ { 0xA769, 0xA769 },
+ { 0xA76B, 0xA76B },
+ { 0xA76D, 0xA76D },
+ { 0xA76F, 0xA778 },
+ { 0xA77A, 0xA77A },
+ { 0xA77C, 0xA77C },
+ { 0xA77F, 0xA77F },
+ { 0xA781, 0xA781 },
+ { 0xA783, 0xA783 },
+ { 0xA785, 0xA785 },
+ { 0xA787, 0xA787 },
+ { 0xA78C, 0xA78C },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFF41, 0xFF5A },
+ { 0x10428, 0x1044F },
+ { 0x1D41A, 0x1D433 },
+ { 0x1D44E, 0x1D454 },
+ { 0x1D456, 0x1D467 },
+ { 0x1D482, 0x1D49B },
+ { 0x1D4B6, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D4CF },
+ { 0x1D4EA, 0x1D503 },
+ { 0x1D51E, 0x1D537 },
+ { 0x1D552, 0x1D56B },
+ { 0x1D586, 0x1D59F },
+ { 0x1D5BA, 0x1D5D3 },
+ { 0x1D5EE, 0x1D607 },
+ { 0x1D622, 0x1D63B },
+ { 0x1D656, 0x1D66F },
+ { 0x1D68A, 0x1D6A5 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6E1 },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D71B },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D755 },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D78F },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7C9 },
+ { 0x1D7CB, 0x1D7CB }
+
+#define PREDICATE(c) uc_is_property_lowercase (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_math.c b/gnulib/tests/unictype/test-pr_math.c
new file mode 100644
index 00000000..5f250871
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_math.c
@@ -0,0 +1,127 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x002B, 0x002B },
+ { 0x003C, 0x003E },
+ { 0x005E, 0x005E },
+ { 0x007C, 0x007C },
+ { 0x007E, 0x007E },
+ { 0x00AC, 0x00AC },
+ { 0x00B1, 0x00B1 },
+ { 0x00D7, 0x00D7 },
+ { 0x00F7, 0x00F7 },
+ { 0x03D0, 0x03D2 },
+ { 0x03D5, 0x03D5 },
+ { 0x03F0, 0x03F1 },
+ { 0x03F4, 0x03F6 },
+ { 0x0606, 0x0608 },
+ { 0x2016, 0x2016 },
+ { 0x2032, 0x2034 },
+ { 0x2040, 0x2040 },
+ { 0x2044, 0x2044 },
+ { 0x2052, 0x2052 },
+ { 0x2061, 0x2064 },
+ { 0x207A, 0x207E },
+ { 0x208A, 0x208E },
+ { 0x20D0, 0x20DC },
+ { 0x20E1, 0x20E1 },
+ { 0x20E5, 0x20E6 },
+ { 0x20EB, 0x20EF },
+ { 0x2102, 0x2102 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2128, 0x2129 },
+ { 0x212C, 0x212D },
+ { 0x212F, 0x2131 },
+ { 0x2133, 0x2138 },
+ { 0x213C, 0x2149 },
+ { 0x214B, 0x214B },
+ { 0x2190, 0x21A7 },
+ { 0x21A9, 0x21AE },
+ { 0x21B0, 0x21B1 },
+ { 0x21B6, 0x21B7 },
+ { 0x21BC, 0x21DB },
+ { 0x21DD, 0x21DD },
+ { 0x21E4, 0x21E5 },
+ { 0x21F4, 0x22FF },
+ { 0x2308, 0x230B },
+ { 0x2320, 0x2321 },
+ { 0x237C, 0x237C },
+ { 0x239B, 0x23B5 },
+ { 0x23B7, 0x23B7 },
+ { 0x23D0, 0x23D0 },
+ { 0x23DC, 0x23E2 },
+ { 0x25A0, 0x25A1 },
+ { 0x25AE, 0x25B7 },
+ { 0x25BC, 0x25C1 },
+ { 0x25C6, 0x25C7 },
+ { 0x25CA, 0x25CB },
+ { 0x25CF, 0x25D3 },
+ { 0x25E2, 0x25E2 },
+ { 0x25E4, 0x25E4 },
+ { 0x25E7, 0x25EC },
+ { 0x25F8, 0x25FF },
+ { 0x2605, 0x2606 },
+ { 0x2640, 0x2640 },
+ { 0x2642, 0x2642 },
+ { 0x2660, 0x2663 },
+ { 0x266D, 0x266F },
+ { 0x27C0, 0x27CA },
+ { 0x27CC, 0x27CC },
+ { 0x27D0, 0x27FF },
+ { 0x2900, 0x2AFF },
+ { 0x2B30, 0x2B44 },
+ { 0x2B47, 0x2B4C },
+ { 0xFB29, 0xFB29 },
+ { 0xFE61, 0xFE66 },
+ { 0xFE68, 0xFE68 },
+ { 0xFF0B, 0xFF0B },
+ { 0xFF1C, 0xFF1E },
+ { 0xFF3C, 0xFF3C },
+ { 0xFF3E, 0xFF3E },
+ { 0xFF5C, 0xFF5C },
+ { 0xFF5E, 0xFF5E },
+ { 0xFFE2, 0xFFE2 },
+ { 0xFFE9, 0xFFEC },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF }
+
+#define PREDICATE(c) uc_is_property_math (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_non_break.c b/gnulib/tests/unictype/test-pr_non_break.c
new file mode 100644
index 00000000..06794c58
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_non_break.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00A0, 0x00A0 },
+ { 0x034F, 0x034F },
+ { 0x035C, 0x0362 },
+ { 0x0F08, 0x0F08 },
+ { 0x0F0C, 0x0F0C },
+ { 0x0F12, 0x0F12 },
+ { 0x180E, 0x180E },
+ { 0x2007, 0x2007 },
+ { 0x2011, 0x2011 },
+ { 0x202F, 0x202F }
+
+#define PREDICATE(c) uc_is_property_non_break (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_not_a_character.c b/gnulib/tests/unictype/test-pr_not_a_character.c
new file mode 100644
index 00000000..7ce96431
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_not_a_character.c
@@ -0,0 +1,40 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0xFDD0, 0xFDEF },
+ { 0xFFFE, 0xFFFF },
+ { 0x1FFFE, 0x1FFFF },
+ { 0x2FFFE, 0x2FFFF },
+ { 0x3FFFE, 0x3FFFF },
+ { 0x4FFFE, 0x4FFFF },
+ { 0x5FFFE, 0x5FFFF },
+ { 0x6FFFE, 0x6FFFF },
+ { 0x7FFFE, 0x7FFFF },
+ { 0x8FFFE, 0x8FFFF },
+ { 0x9FFFE, 0x9FFFF },
+ { 0xAFFFE, 0xAFFFF },
+ { 0xBFFFE, 0xBFFFF },
+ { 0xCFFFE, 0xCFFFF },
+ { 0xDFFFE, 0xDFFFF },
+ { 0xEFFFE, 0xEFFFF },
+ { 0xFFFFE, 0xFFFFF },
+ { 0x10FFFE, 0x10FFFF }
+
+#define PREDICATE(c) uc_is_property_not_a_character (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_numeric.c b/gnulib/tests/unictype/test-pr_numeric.c
new file mode 100644
index 00000000..4449802b
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_numeric.c
@@ -0,0 +1,101 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x00B2, 0x00B3 },
+ { 0x00B9, 0x00B9 },
+ { 0x00BC, 0x00BE },
+ { 0x0660, 0x0669 },
+ { 0x06F0, 0x06F9 },
+ { 0x07C0, 0x07C9 },
+ { 0x0966, 0x096F },
+ { 0x09E6, 0x09EF },
+ { 0x09F4, 0x09F9 },
+ { 0x0A66, 0x0A6F },
+ { 0x0AE6, 0x0AEF },
+ { 0x0B66, 0x0B6F },
+ { 0x0BE6, 0x0BF2 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C78, 0x0C7E },
+ { 0x0CE6, 0x0CEF },
+ { 0x0D66, 0x0D75 },
+ { 0x0E50, 0x0E59 },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0F20, 0x0F33 },
+ { 0x1040, 0x1049 },
+ { 0x1090, 0x1099 },
+ { 0x1369, 0x137C },
+ { 0x16EE, 0x16F0 },
+ { 0x17E0, 0x17E9 },
+ { 0x17F0, 0x17F9 },
+ { 0x1810, 0x1819 },
+ { 0x1946, 0x194F },
+ { 0x19D0, 0x19D9 },
+ { 0x1B50, 0x1B59 },
+ { 0x1BB0, 0x1BB9 },
+ { 0x1C40, 0x1C49 },
+ { 0x1C50, 0x1C59 },
+ { 0x2070, 0x2070 },
+ { 0x2074, 0x2079 },
+ { 0x2080, 0x2089 },
+ { 0x2153, 0x2183 },
+ { 0x2185, 0x2188 },
+ { 0x2460, 0x249B },
+ { 0x24EA, 0x24FF },
+ { 0x2776, 0x2793 },
+ { 0x2CFD, 0x2CFD },
+ { 0x3007, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3038, 0x303A },
+ { 0x3192, 0x3195 },
+ { 0x3220, 0x3229 },
+ { 0x3251, 0x325F },
+ { 0x3280, 0x3289 },
+ { 0x32B1, 0x32BF },
+ { 0xA620, 0xA629 },
+ { 0xA8D0, 0xA8D9 },
+ { 0xA900, 0xA909 },
+ { 0xAA50, 0xAA59 },
+ { 0xF96B, 0xF96B },
+ { 0xF973, 0xF973 },
+ { 0xF978, 0xF978 },
+ { 0xF9B2, 0xF9B2 },
+ { 0xF9D1, 0xF9D1 },
+ { 0xF9D3, 0xF9D3 },
+ { 0xF9FD, 0xF9FD },
+ { 0xFF10, 0xFF19 },
+ { 0x10107, 0x10133 },
+ { 0x10140, 0x10178 },
+ { 0x1018A, 0x1018A },
+ { 0x10320, 0x10323 },
+ { 0x10341, 0x10341 },
+ { 0x1034A, 0x1034A },
+ { 0x103D1, 0x103D5 },
+ { 0x104A0, 0x104A9 },
+ { 0x10916, 0x10919 },
+ { 0x10A40, 0x10A47 },
+ { 0x12400, 0x12431 },
+ { 0x12434, 0x12455 },
+ { 0x12458, 0x12462 },
+ { 0x1D360, 0x1D371 },
+ { 0x1D7CE, 0x1D7FF },
+ { 0x2F890, 0x2F890 }
+
+#define PREDICATE(c) uc_is_property_numeric (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_other_alphabetic.c b/gnulib/tests/unictype/test-pr_other_alphabetic.c
new file mode 100644
index 00000000..f603dee3
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_other_alphabetic.c
@@ -0,0 +1,144 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0345, 0x0345 },
+ { 0x05B0, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x0610, 0x061A },
+ { 0x064B, 0x0657 },
+ { 0x0659, 0x065E },
+ { 0x0670, 0x0670 },
+ { 0x06D6, 0x06DC },
+ { 0x06E1, 0x06E4 },
+ { 0x06E7, 0x06E8 },
+ { 0x06ED, 0x06ED },
+ { 0x0711, 0x0711 },
+ { 0x0730, 0x073F },
+ { 0x07A6, 0x07B0 },
+ { 0x0901, 0x0903 },
+ { 0x093E, 0x094C },
+ { 0x0962, 0x0963 },
+ { 0x0981, 0x0983 },
+ { 0x09BE, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CC },
+ { 0x09D7, 0x09D7 },
+ { 0x09E2, 0x09E3 },
+ { 0x0A01, 0x0A03 },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4C },
+ { 0x0A51, 0x0A51 },
+ { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0ABE, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACC },
+ { 0x0AE2, 0x0AE3 },
+ { 0x0B01, 0x0B03 },
+ { 0x0B3E, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4C },
+ { 0x0B56, 0x0B57 },
+ { 0x0B62, 0x0B63 },
+ { 0x0B82, 0x0B82 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCC },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0C01, 0x0C03 },
+ { 0x0C3E, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4C },
+ { 0x0C55, 0x0C56 },
+ { 0x0C62, 0x0C63 },
+ { 0x0C82, 0x0C83 },
+ { 0x0CBE, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCC },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CE2, 0x0CE3 },
+ { 0x0D02, 0x0D03 },
+ { 0x0D3E, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4C },
+ { 0x0D57, 0x0D57 },
+ { 0x0D62, 0x0D63 },
+ { 0x0D82, 0x0D83 },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF3 },
+ { 0x0E31, 0x0E31 },
+ { 0x0E34, 0x0E3A },
+ { 0x0E4D, 0x0E4D },
+ { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 },
+ { 0x0EBB, 0x0EBC },
+ { 0x0ECD, 0x0ECD },
+ { 0x0F71, 0x0F81 },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x102B, 0x1036 },
+ { 0x1038, 0x1038 },
+ { 0x103B, 0x103E },
+ { 0x1056, 0x1059 },
+ { 0x105E, 0x1060 },
+ { 0x1062, 0x1062 },
+ { 0x1067, 0x1068 },
+ { 0x1071, 0x1074 },
+ { 0x1082, 0x1086 },
+ { 0x135F, 0x135F },
+ { 0x1712, 0x1713 },
+ { 0x1732, 0x1733 },
+ { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 },
+ { 0x17B6, 0x17C8 },
+ { 0x18A9, 0x18A9 },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x1938 },
+ { 0x19B0, 0x19C0 },
+ { 0x19C8, 0x19C9 },
+ { 0x1A17, 0x1A1B },
+ { 0x1B00, 0x1B04 },
+ { 0x1B35, 0x1B43 },
+ { 0x1B80, 0x1B82 },
+ { 0x1BA1, 0x1BA9 },
+ { 0x1C24, 0x1C35 },
+ { 0x24B6, 0x24E9 },
+ { 0x2DE0, 0x2DFF },
+ { 0xA823, 0xA827 },
+ { 0xA880, 0xA881 },
+ { 0xA8B4, 0xA8C3 },
+ { 0xA926, 0xA92A },
+ { 0xA947, 0xA952 },
+ { 0xAA29, 0xAA36 },
+ { 0xAA43, 0xAA43 },
+ { 0xAA4C, 0xAA4D },
+ { 0xFB1E, 0xFB1E },
+ { 0x10A01, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F }
+
+#define PREDICATE(c) uc_is_property_other_alphabetic (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_other_default_ignorable_code_point.c b/gnulib/tests/unictype/test-pr_other_default_ignorable_code_point.c
new file mode 100644
index 00000000..69068aa2
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_other_default_ignorable_code_point.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x034F, 0x034F },
+ { 0x115F, 0x1160 },
+ { 0x2065, 0x2069 },
+ { 0x3164, 0x3164 },
+ { 0xFFA0, 0xFFA0 },
+ { 0xFFF0, 0xFFF8 },
+ { 0xE0000, 0xE0000 },
+ { 0xE0002, 0xE001F },
+ { 0xE0080, 0xE00FF },
+ { 0xE01F0, 0xE0FFF }
+
+#define PREDICATE(c) uc_is_property_other_default_ignorable_code_point (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_other_grapheme_extend.c b/gnulib/tests/unictype/test-pr_other_grapheme_extend.c
new file mode 100644
index 00000000..aff4377d
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_other_grapheme_extend.c
@@ -0,0 +1,38 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x09BE, 0x09BE },
+ { 0x09D7, 0x09D7 },
+ { 0x0B3E, 0x0B3E },
+ { 0x0B57, 0x0B57 },
+ { 0x0BBE, 0x0BBE },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0CC2, 0x0CC2 },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0D3E, 0x0D3E },
+ { 0x0D57, 0x0D57 },
+ { 0x0DCF, 0x0DCF },
+ { 0x0DDF, 0x0DDF },
+ { 0x200C, 0x200D },
+ { 0xFF9E, 0xFF9F },
+ { 0x1D165, 0x1D165 },
+ { 0x1D16E, 0x1D172 }
+
+#define PREDICATE(c) uc_is_property_other_grapheme_extend (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_other_id_continue.c b/gnulib/tests/unictype/test-pr_other_id_continue.c
new file mode 100644
index 00000000..b30a7df1
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_other_id_continue.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00B7, 0x00B7 },
+ { 0x0387, 0x0387 },
+ { 0x1369, 0x1371 }
+
+#define PREDICATE(c) uc_is_property_other_id_continue (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_other_id_start.c b/gnulib/tests/unictype/test-pr_other_id_start.c
new file mode 100644
index 00000000..d1cc5f09
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_other_id_start.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2118, 0x2118 },
+ { 0x212E, 0x212E },
+ { 0x309B, 0x309C }
+
+#define PREDICATE(c) uc_is_property_other_id_start (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_other_lowercase.c b/gnulib/tests/unictype/test-pr_other_lowercase.c
new file mode 100644
index 00000000..a2810dca
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_other_lowercase.c
@@ -0,0 +1,35 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x02B0, 0x02B8 },
+ { 0x02C0, 0x02C1 },
+ { 0x02E0, 0x02E4 },
+ { 0x0345, 0x0345 },
+ { 0x037A, 0x037A },
+ { 0x1D2C, 0x1D61 },
+ { 0x1D78, 0x1D78 },
+ { 0x1D9B, 0x1DBF },
+ { 0x2090, 0x2094 },
+ { 0x2170, 0x217F },
+ { 0x24D0, 0x24E9 },
+ { 0x2C7D, 0x2C7D },
+ { 0xA770, 0xA770 }
+
+#define PREDICATE(c) uc_is_property_other_lowercase (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_other_math.c b/gnulib/tests/unictype/test-pr_other_math.c
new file mode 100644
index 00000000..b563303b
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_other_math.c
@@ -0,0 +1,121 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x005E, 0x005E },
+ { 0x03D0, 0x03D2 },
+ { 0x03D5, 0x03D5 },
+ { 0x03F0, 0x03F1 },
+ { 0x03F4, 0x03F5 },
+ { 0x2016, 0x2016 },
+ { 0x2032, 0x2034 },
+ { 0x2040, 0x2040 },
+ { 0x2061, 0x2064 },
+ { 0x207D, 0x207E },
+ { 0x208D, 0x208E },
+ { 0x20D0, 0x20DC },
+ { 0x20E1, 0x20E1 },
+ { 0x20E5, 0x20E6 },
+ { 0x20EB, 0x20EF },
+ { 0x2102, 0x2102 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2128, 0x2129 },
+ { 0x212C, 0x212D },
+ { 0x212F, 0x2131 },
+ { 0x2133, 0x2138 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x2195, 0x2199 },
+ { 0x219C, 0x219F },
+ { 0x21A1, 0x21A2 },
+ { 0x21A4, 0x21A5 },
+ { 0x21A7, 0x21A7 },
+ { 0x21A9, 0x21AD },
+ { 0x21B0, 0x21B1 },
+ { 0x21B6, 0x21B7 },
+ { 0x21BC, 0x21CD },
+ { 0x21D0, 0x21D1 },
+ { 0x21D3, 0x21D3 },
+ { 0x21D5, 0x21DB },
+ { 0x21DD, 0x21DD },
+ { 0x21E4, 0x21E5 },
+ { 0x23B4, 0x23B5 },
+ { 0x23B7, 0x23B7 },
+ { 0x23D0, 0x23D0 },
+ { 0x23E2, 0x23E2 },
+ { 0x25A0, 0x25A1 },
+ { 0x25AE, 0x25B6 },
+ { 0x25BC, 0x25C0 },
+ { 0x25C6, 0x25C7 },
+ { 0x25CA, 0x25CB },
+ { 0x25CF, 0x25D3 },
+ { 0x25E2, 0x25E2 },
+ { 0x25E4, 0x25E4 },
+ { 0x25E7, 0x25EC },
+ { 0x2605, 0x2606 },
+ { 0x2640, 0x2640 },
+ { 0x2642, 0x2642 },
+ { 0x2660, 0x2663 },
+ { 0x266D, 0x266E },
+ { 0x27C5, 0x27C6 },
+ { 0x27E6, 0x27EF },
+ { 0x2983, 0x2998 },
+ { 0x29D8, 0x29DB },
+ { 0x29FC, 0x29FD },
+ { 0xFE61, 0xFE61 },
+ { 0xFE63, 0xFE63 },
+ { 0xFE68, 0xFE68 },
+ { 0xFF3C, 0xFF3C },
+ { 0xFF3E, 0xFF3E },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF }
+
+#define PREDICATE(c) uc_is_property_other_math (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_other_uppercase.c b/gnulib/tests/unictype/test-pr_other_uppercase.c
new file mode 100644
index 00000000..a98cb44e
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_other_uppercase.c
@@ -0,0 +1,24 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2160, 0x216F },
+ { 0x24B6, 0x24CF }
+
+#define PREDICATE(c) uc_is_property_other_uppercase (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_paired_punctuation.c b/gnulib/tests/unictype/test-pr_paired_punctuation.c
new file mode 100644
index 00000000..3df878cc
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_paired_punctuation.c
@@ -0,0 +1,49 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0028, 0x0029 },
+ { 0x005B, 0x005B },
+ { 0x005D, 0x005D },
+ { 0x007B, 0x007B },
+ { 0x007D, 0x007D },
+ { 0x00AB, 0x00AB },
+ { 0x00BB, 0x00BB },
+ { 0x0F3A, 0x0F3D },
+ { 0x169B, 0x169C },
+ { 0x2018, 0x201F },
+ { 0x2039, 0x203A },
+ { 0x2045, 0x2046 },
+ { 0x207D, 0x207E },
+ { 0x208D, 0x208E },
+ { 0x2329, 0x232A },
+ { 0x3008, 0x3011 },
+ { 0x3014, 0x301B },
+ { 0x301D, 0x301F },
+ { 0xFD3E, 0xFD3F },
+ { 0xFE35, 0xFE44 },
+ { 0xFE59, 0xFE5E },
+ { 0xFF08, 0xFF09 },
+ { 0xFF3B, 0xFF3B },
+ { 0xFF3D, 0xFF3D },
+ { 0xFF5B, 0xFF5B },
+ { 0xFF5D, 0xFF5D },
+ { 0xFF62, 0xFF63 }
+
+#define PREDICATE(c) uc_is_property_paired_punctuation (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_paragraph_separator.c b/gnulib/tests/unictype/test-pr_paragraph_separator.c
new file mode 100644
index 00000000..dca0b19a
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_paragraph_separator.c
@@ -0,0 +1,23 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2029, 0x2029 }
+
+#define PREDICATE(c) uc_is_property_paragraph_separator (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_pattern_syntax.c b/gnulib/tests/unictype/test-pr_pattern_syntax.c
new file mode 100644
index 00000000..40a056b3
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_pattern_syntax.c
@@ -0,0 +1,50 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x002F },
+ { 0x003A, 0x0040 },
+ { 0x005B, 0x005E },
+ { 0x0060, 0x0060 },
+ { 0x007B, 0x007E },
+ { 0x00A1, 0x00A7 },
+ { 0x00A9, 0x00A9 },
+ { 0x00AB, 0x00AC },
+ { 0x00AE, 0x00AE },
+ { 0x00B0, 0x00B1 },
+ { 0x00B6, 0x00B6 },
+ { 0x00BB, 0x00BB },
+ { 0x00BF, 0x00BF },
+ { 0x00D7, 0x00D7 },
+ { 0x00F7, 0x00F7 },
+ { 0x2010, 0x2027 },
+ { 0x2030, 0x203E },
+ { 0x2041, 0x2053 },
+ { 0x2055, 0x205E },
+ { 0x2190, 0x245F },
+ { 0x2500, 0x2775 },
+ { 0x2794, 0x2BFF },
+ { 0x2E00, 0x2E7F },
+ { 0x3001, 0x3003 },
+ { 0x3008, 0x3020 },
+ { 0x3030, 0x3030 },
+ { 0xFD3E, 0xFD3F },
+ { 0xFE45, 0xFE46 }
+
+#define PREDICATE(c) uc_is_property_pattern_syntax (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_pattern_white_space.c b/gnulib/tests/unictype/test-pr_pattern_white_space.c
new file mode 100644
index 00000000..347cb0b0
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_pattern_white_space.c
@@ -0,0 +1,27 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0009, 0x000D },
+ { 0x0020, 0x0020 },
+ { 0x0085, 0x0085 },
+ { 0x200E, 0x200F },
+ { 0x2028, 0x2029 }
+
+#define PREDICATE(c) uc_is_property_pattern_white_space (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_private_use.c b/gnulib/tests/unictype/test-pr_private_use.c
new file mode 100644
index 00000000..6cfa1929
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_private_use.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0xE000, 0xF8FF },
+ { 0xF0000, 0xFFFFD },
+ { 0x100000, 0x10FFFD }
+
+#define PREDICATE(c) uc_is_property_private_use (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_punctuation.c b/gnulib/tests/unictype/test-pr_punctuation.c
new file mode 100644
index 00000000..936e62ce
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_punctuation.c
@@ -0,0 +1,134 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x0023 },
+ { 0x0025, 0x002A },
+ { 0x002C, 0x002F },
+ { 0x003A, 0x003B },
+ { 0x003F, 0x0040 },
+ { 0x005B, 0x005D },
+ { 0x005F, 0x005F },
+ { 0x007B, 0x007B },
+ { 0x007D, 0x007D },
+ { 0x00A1, 0x00A1 },
+ { 0x00AB, 0x00AB },
+ { 0x00B7, 0x00B7 },
+ { 0x00BB, 0x00BB },
+ { 0x00BF, 0x00BF },
+ { 0x037E, 0x037E },
+ { 0x0387, 0x0387 },
+ { 0x055A, 0x055F },
+ { 0x0589, 0x058A },
+ { 0x05BE, 0x05BE },
+ { 0x05C0, 0x05C0 },
+ { 0x05C3, 0x05C3 },
+ { 0x05C6, 0x05C6 },
+ { 0x05F3, 0x05F4 },
+ { 0x0609, 0x060A },
+ { 0x060C, 0x060D },
+ { 0x061B, 0x061B },
+ { 0x061E, 0x061F },
+ { 0x066A, 0x066D },
+ { 0x06D4, 0x06D4 },
+ { 0x0700, 0x070D },
+ { 0x07F7, 0x07F9 },
+ { 0x0964, 0x0965 },
+ { 0x0970, 0x0970 },
+ { 0x0DF4, 0x0DF4 },
+ { 0x0E4F, 0x0E4F },
+ { 0x0E5A, 0x0E5B },
+ { 0x0F04, 0x0F12 },
+ { 0x0F3A, 0x0F3D },
+ { 0x0F85, 0x0F85 },
+ { 0x0FD0, 0x0FD4 },
+ { 0x104A, 0x104F },
+ { 0x10FB, 0x10FB },
+ { 0x1361, 0x1368 },
+ { 0x166D, 0x166E },
+ { 0x169B, 0x169C },
+ { 0x16EB, 0x16ED },
+ { 0x1735, 0x1736 },
+ { 0x17D4, 0x17D6 },
+ { 0x17D8, 0x17DA },
+ { 0x1800, 0x180A },
+ { 0x1944, 0x1945 },
+ { 0x19DE, 0x19DF },
+ { 0x1A1E, 0x1A1F },
+ { 0x1B5A, 0x1B60 },
+ { 0x1C3B, 0x1C3F },
+ { 0x1C7E, 0x1C7F },
+ { 0x2010, 0x2027 },
+ { 0x2030, 0x2043 },
+ { 0x2045, 0x2051 },
+ { 0x2053, 0x205E },
+ { 0x207D, 0x207E },
+ { 0x208D, 0x208E },
+ { 0x2329, 0x232A },
+ { 0x2768, 0x2775 },
+ { 0x27C5, 0x27C6 },
+ { 0x27E6, 0x27EF },
+ { 0x2983, 0x2998 },
+ { 0x29D8, 0x29DB },
+ { 0x29FC, 0x29FD },
+ { 0x2CF9, 0x2CFC },
+ { 0x2CFE, 0x2CFF },
+ { 0x2E00, 0x2E2E },
+ { 0x2E30, 0x2E30 },
+ { 0x3001, 0x3003 },
+ { 0x3008, 0x3011 },
+ { 0x3014, 0x301F },
+ { 0x3030, 0x3030 },
+ { 0x303D, 0x303D },
+ { 0x30A0, 0x30A0 },
+ { 0x30FB, 0x30FB },
+ { 0xA60D, 0xA60F },
+ { 0xA673, 0xA673 },
+ { 0xA67E, 0xA67E },
+ { 0xA874, 0xA877 },
+ { 0xA8CE, 0xA8CF },
+ { 0xA92E, 0xA92F },
+ { 0xA95F, 0xA95F },
+ { 0xAA5C, 0xAA5F },
+ { 0xFD3E, 0xFD3F },
+ { 0xFE10, 0xFE19 },
+ { 0xFE30, 0xFE52 },
+ { 0xFE54, 0xFE61 },
+ { 0xFE63, 0xFE63 },
+ { 0xFE68, 0xFE68 },
+ { 0xFE6A, 0xFE6B },
+ { 0xFF01, 0xFF03 },
+ { 0xFF05, 0xFF0A },
+ { 0xFF0C, 0xFF0F },
+ { 0xFF1A, 0xFF1B },
+ { 0xFF1F, 0xFF20 },
+ { 0xFF3B, 0xFF3D },
+ { 0xFF3F, 0xFF3F },
+ { 0xFF5B, 0xFF5B },
+ { 0xFF5D, 0xFF5D },
+ { 0xFF5F, 0xFF65 },
+ { 0x10100, 0x10101 },
+ { 0x1039F, 0x1039F },
+ { 0x103D0, 0x103D0 },
+ { 0x1091F, 0x1091F },
+ { 0x1093F, 0x1093F },
+ { 0x10A50, 0x10A58 },
+ { 0x12470, 0x12473 }
+
+#define PREDICATE(c) uc_is_property_punctuation (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_quotation_mark.c b/gnulib/tests/unictype/test-pr_quotation_mark.c
new file mode 100644
index 00000000..e592463f
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_quotation_mark.c
@@ -0,0 +1,34 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0022, 0x0022 },
+ { 0x0027, 0x0027 },
+ { 0x00AB, 0x00AB },
+ { 0x00BB, 0x00BB },
+ { 0x2018, 0x201F },
+ { 0x2039, 0x203A },
+ { 0x300C, 0x300F },
+ { 0x301D, 0x301F },
+ { 0xFE41, 0xFE44 },
+ { 0xFF02, 0xFF02 },
+ { 0xFF07, 0xFF07 },
+ { 0xFF62, 0xFF63 }
+
+#define PREDICATE(c) uc_is_property_quotation_mark (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_radical.c b/gnulib/tests/unictype/test-pr_radical.c
new file mode 100644
index 00000000..23c30260
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_radical.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x2E80, 0x2E99 },
+ { 0x2E9B, 0x2EF3 },
+ { 0x2F00, 0x2FD5 }
+
+#define PREDICATE(c) uc_is_property_radical (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_sentence_terminal.c b/gnulib/tests/unictype/test-pr_sentence_terminal.c
new file mode 100644
index 00000000..107649e7
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_sentence_terminal.c
@@ -0,0 +1,59 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x0021 },
+ { 0x002E, 0x002E },
+ { 0x003F, 0x003F },
+ { 0x055C, 0x055C },
+ { 0x055E, 0x055E },
+ { 0x0589, 0x0589 },
+ { 0x061F, 0x061F },
+ { 0x06D4, 0x06D4 },
+ { 0x0700, 0x0702 },
+ { 0x07F9, 0x07F9 },
+ { 0x0964, 0x0965 },
+ { 0x104A, 0x104B },
+ { 0x1362, 0x1362 },
+ { 0x1367, 0x1368 },
+ { 0x166E, 0x166E },
+ { 0x1803, 0x1803 },
+ { 0x1809, 0x1809 },
+ { 0x1944, 0x1945 },
+ { 0x1B5A, 0x1B5B },
+ { 0x1B5E, 0x1B5F },
+ { 0x1C3B, 0x1C3C },
+ { 0x1C7E, 0x1C7F },
+ { 0x203C, 0x203D },
+ { 0x2047, 0x2049 },
+ { 0x2E2E, 0x2E2E },
+ { 0x3002, 0x3002 },
+ { 0xA60E, 0xA60F },
+ { 0xA876, 0xA877 },
+ { 0xA8CE, 0xA8CF },
+ { 0xA92F, 0xA92F },
+ { 0xAA5D, 0xAA5F },
+ { 0xFE52, 0xFE52 },
+ { 0xFE56, 0xFE57 },
+ { 0xFF01, 0xFF01 },
+ { 0xFF0E, 0xFF0E },
+ { 0xFF1F, 0xFF1F },
+ { 0xFF61, 0xFF61 }
+
+#define PREDICATE(c) uc_is_property_sentence_terminal (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_soft_dotted.c b/gnulib/tests/unictype/test-pr_soft_dotted.c
new file mode 100644
index 00000000..ad8b0fb7
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_soft_dotted.c
@@ -0,0 +1,53 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0069, 0x006A },
+ { 0x012F, 0x012F },
+ { 0x0249, 0x0249 },
+ { 0x0268, 0x0268 },
+ { 0x029D, 0x029D },
+ { 0x02B2, 0x02B2 },
+ { 0x03F3, 0x03F3 },
+ { 0x0456, 0x0456 },
+ { 0x0458, 0x0458 },
+ { 0x1D62, 0x1D62 },
+ { 0x1D96, 0x1D96 },
+ { 0x1DA4, 0x1DA4 },
+ { 0x1DA8, 0x1DA8 },
+ { 0x1E2D, 0x1E2D },
+ { 0x1ECB, 0x1ECB },
+ { 0x2071, 0x2071 },
+ { 0x2148, 0x2149 },
+ { 0x2C7C, 0x2C7C },
+ { 0x1D422, 0x1D423 },
+ { 0x1D456, 0x1D457 },
+ { 0x1D48A, 0x1D48B },
+ { 0x1D4BE, 0x1D4BF },
+ { 0x1D4F2, 0x1D4F3 },
+ { 0x1D526, 0x1D527 },
+ { 0x1D55A, 0x1D55B },
+ { 0x1D58E, 0x1D58F },
+ { 0x1D5C2, 0x1D5C3 },
+ { 0x1D5F6, 0x1D5F7 },
+ { 0x1D62A, 0x1D62B },
+ { 0x1D65E, 0x1D65F },
+ { 0x1D692, 0x1D693 }
+
+#define PREDICATE(c) uc_is_property_soft_dotted (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_space.c b/gnulib/tests/unictype/test-pr_space.c
new file mode 100644
index 00000000..64a3e72c
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_space.c
@@ -0,0 +1,30 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0020, 0x0020 },
+ { 0x00A0, 0x00A0 },
+ { 0x1680, 0x1680 },
+ { 0x180E, 0x180E },
+ { 0x2000, 0x200A },
+ { 0x202F, 0x202F },
+ { 0x205F, 0x205F },
+ { 0x3000, 0x3000 }
+
+#define PREDICATE(c) uc_is_property_space (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_terminal_punctuation.c b/gnulib/tests/unictype/test-pr_terminal_punctuation.c
new file mode 100644
index 00000000..3ded06d9
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_terminal_punctuation.c
@@ -0,0 +1,77 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0021, 0x0021 },
+ { 0x002C, 0x002C },
+ { 0x002E, 0x002E },
+ { 0x003A, 0x003B },
+ { 0x003F, 0x003F },
+ { 0x037E, 0x037E },
+ { 0x0387, 0x0387 },
+ { 0x0589, 0x0589 },
+ { 0x05C3, 0x05C3 },
+ { 0x060C, 0x060C },
+ { 0x061B, 0x061B },
+ { 0x061F, 0x061F },
+ { 0x06D4, 0x06D4 },
+ { 0x0700, 0x070A },
+ { 0x070C, 0x070C },
+ { 0x07F8, 0x07F9 },
+ { 0x0964, 0x0965 },
+ { 0x0E5A, 0x0E5B },
+ { 0x0F08, 0x0F08 },
+ { 0x0F0D, 0x0F12 },
+ { 0x104A, 0x104B },
+ { 0x1361, 0x1368 },
+ { 0x166D, 0x166E },
+ { 0x16EB, 0x16ED },
+ { 0x17D4, 0x17D6 },
+ { 0x17DA, 0x17DA },
+ { 0x1802, 0x1805 },
+ { 0x1808, 0x1809 },
+ { 0x1944, 0x1945 },
+ { 0x1B5A, 0x1B5B },
+ { 0x1B5D, 0x1B5F },
+ { 0x1C3B, 0x1C3F },
+ { 0x1C7E, 0x1C7F },
+ { 0x203C, 0x203D },
+ { 0x2047, 0x2049 },
+ { 0x2E2E, 0x2E2E },
+ { 0x3001, 0x3002 },
+ { 0xA60D, 0xA60F },
+ { 0xA876, 0xA877 },
+ { 0xA8CE, 0xA8CF },
+ { 0xA92F, 0xA92F },
+ { 0xAA5D, 0xAA5F },
+ { 0xFE50, 0xFE52 },
+ { 0xFE54, 0xFE57 },
+ { 0xFF01, 0xFF01 },
+ { 0xFF0C, 0xFF0C },
+ { 0xFF0E, 0xFF0E },
+ { 0xFF1A, 0xFF1B },
+ { 0xFF1F, 0xFF1F },
+ { 0xFF61, 0xFF61 },
+ { 0xFF64, 0xFF64 },
+ { 0x1039F, 0x1039F },
+ { 0x103D0, 0x103D0 },
+ { 0x1091F, 0x1091F },
+ { 0x12470, 0x12473 }
+
+#define PREDICATE(c) uc_is_property_terminal_punctuation (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_test.c b/gnulib/tests/unictype/test-pr_test.c
new file mode 100644
index 00000000..6bacc078
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_test.c
@@ -0,0 +1,35 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ uc_property_t pr = UC_PROPERTY_COMPOSITE;
+ unsigned int c;
+
+ for (c = 0; c < 0x110000; c++)
+ ASSERT (uc_is_property (c, pr) == uc_is_property_composite (c));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-pr_titlecase.c b/gnulib/tests/unictype/test-pr_titlecase.c
new file mode 100644
index 00000000..10043865
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_titlecase.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x01C5, 0x01C5 },
+ { 0x01C8, 0x01C8 },
+ { 0x01CB, 0x01CB },
+ { 0x01F2, 0x01F2 },
+ { 0x1F88, 0x1F8F },
+ { 0x1F98, 0x1F9F },
+ { 0x1FA8, 0x1FAF },
+ { 0x1FBC, 0x1FBC },
+ { 0x1FCC, 0x1FCC },
+ { 0x1FFC, 0x1FFC }
+
+#define PREDICATE(c) uc_is_property_titlecase (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_unassigned_code_value.c b/gnulib/tests/unictype/test-pr_unassigned_code_value.c
new file mode 100644
index 00000000..91bd1611
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_unassigned_code_value.c
@@ -0,0 +1,476 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0378, 0x0379 },
+ { 0x037F, 0x0383 },
+ { 0x038B, 0x038B },
+ { 0x038D, 0x038D },
+ { 0x03A2, 0x03A2 },
+ { 0x0524, 0x0530 },
+ { 0x0557, 0x0558 },
+ { 0x0560, 0x0560 },
+ { 0x0588, 0x0588 },
+ { 0x058B, 0x0590 },
+ { 0x05C8, 0x05CF },
+ { 0x05EB, 0x05EF },
+ { 0x05F5, 0x05FF },
+ { 0x0604, 0x0605 },
+ { 0x061C, 0x061D },
+ { 0x0620, 0x0620 },
+ { 0x065F, 0x065F },
+ { 0x070E, 0x070E },
+ { 0x074B, 0x074C },
+ { 0x07B2, 0x07BF },
+ { 0x07FB, 0x0900 },
+ { 0x093A, 0x093B },
+ { 0x094E, 0x094F },
+ { 0x0955, 0x0957 },
+ { 0x0973, 0x097A },
+ { 0x0980, 0x0980 },
+ { 0x0984, 0x0984 },
+ { 0x098D, 0x098E },
+ { 0x0991, 0x0992 },
+ { 0x09A9, 0x09A9 },
+ { 0x09B1, 0x09B1 },
+ { 0x09B3, 0x09B5 },
+ { 0x09BA, 0x09BB },
+ { 0x09C5, 0x09C6 },
+ { 0x09C9, 0x09CA },
+ { 0x09CF, 0x09D6 },
+ { 0x09D8, 0x09DB },
+ { 0x09DE, 0x09DE },
+ { 0x09E4, 0x09E5 },
+ { 0x09FB, 0x0A00 },
+ { 0x0A04, 0x0A04 },
+ { 0x0A0B, 0x0A0E },
+ { 0x0A11, 0x0A12 },
+ { 0x0A29, 0x0A29 },
+ { 0x0A31, 0x0A31 },
+ { 0x0A34, 0x0A34 },
+ { 0x0A37, 0x0A37 },
+ { 0x0A3A, 0x0A3B },
+ { 0x0A3D, 0x0A3D },
+ { 0x0A43, 0x0A46 },
+ { 0x0A49, 0x0A4A },
+ { 0x0A4E, 0x0A50 },
+ { 0x0A52, 0x0A58 },
+ { 0x0A5D, 0x0A5D },
+ { 0x0A5F, 0x0A65 },
+ { 0x0A76, 0x0A80 },
+ { 0x0A84, 0x0A84 },
+ { 0x0A8E, 0x0A8E },
+ { 0x0A92, 0x0A92 },
+ { 0x0AA9, 0x0AA9 },
+ { 0x0AB1, 0x0AB1 },
+ { 0x0AB4, 0x0AB4 },
+ { 0x0ABA, 0x0ABB },
+ { 0x0AC6, 0x0AC6 },
+ { 0x0ACA, 0x0ACA },
+ { 0x0ACE, 0x0ACF },
+ { 0x0AD1, 0x0ADF },
+ { 0x0AE4, 0x0AE5 },
+ { 0x0AF0, 0x0AF0 },
+ { 0x0AF2, 0x0B00 },
+ { 0x0B04, 0x0B04 },
+ { 0x0B0D, 0x0B0E },
+ { 0x0B11, 0x0B12 },
+ { 0x0B29, 0x0B29 },
+ { 0x0B31, 0x0B31 },
+ { 0x0B34, 0x0B34 },
+ { 0x0B3A, 0x0B3B },
+ { 0x0B45, 0x0B46 },
+ { 0x0B49, 0x0B4A },
+ { 0x0B4E, 0x0B55 },
+ { 0x0B58, 0x0B5B },
+ { 0x0B5E, 0x0B5E },
+ { 0x0B64, 0x0B65 },
+ { 0x0B72, 0x0B81 },
+ { 0x0B84, 0x0B84 },
+ { 0x0B8B, 0x0B8D },
+ { 0x0B91, 0x0B91 },
+ { 0x0B96, 0x0B98 },
+ { 0x0B9B, 0x0B9B },
+ { 0x0B9D, 0x0B9D },
+ { 0x0BA0, 0x0BA2 },
+ { 0x0BA5, 0x0BA7 },
+ { 0x0BAB, 0x0BAD },
+ { 0x0BBA, 0x0BBD },
+ { 0x0BC3, 0x0BC5 },
+ { 0x0BC9, 0x0BC9 },
+ { 0x0BCE, 0x0BCF },
+ { 0x0BD1, 0x0BD6 },
+ { 0x0BD8, 0x0BE5 },
+ { 0x0BFB, 0x0C00 },
+ { 0x0C04, 0x0C04 },
+ { 0x0C0D, 0x0C0D },
+ { 0x0C11, 0x0C11 },
+ { 0x0C29, 0x0C29 },
+ { 0x0C34, 0x0C34 },
+ { 0x0C3A, 0x0C3C },
+ { 0x0C45, 0x0C45 },
+ { 0x0C49, 0x0C49 },
+ { 0x0C4E, 0x0C54 },
+ { 0x0C57, 0x0C57 },
+ { 0x0C5A, 0x0C5F },
+ { 0x0C64, 0x0C65 },
+ { 0x0C70, 0x0C77 },
+ { 0x0C80, 0x0C81 },
+ { 0x0C84, 0x0C84 },
+ { 0x0C8D, 0x0C8D },
+ { 0x0C91, 0x0C91 },
+ { 0x0CA9, 0x0CA9 },
+ { 0x0CB4, 0x0CB4 },
+ { 0x0CBA, 0x0CBB },
+ { 0x0CC5, 0x0CC5 },
+ { 0x0CC9, 0x0CC9 },
+ { 0x0CCE, 0x0CD4 },
+ { 0x0CD7, 0x0CDD },
+ { 0x0CDF, 0x0CDF },
+ { 0x0CE4, 0x0CE5 },
+ { 0x0CF0, 0x0CF0 },
+ { 0x0CF3, 0x0D01 },
+ { 0x0D04, 0x0D04 },
+ { 0x0D0D, 0x0D0D },
+ { 0x0D11, 0x0D11 },
+ { 0x0D29, 0x0D29 },
+ { 0x0D3A, 0x0D3C },
+ { 0x0D45, 0x0D45 },
+ { 0x0D49, 0x0D49 },
+ { 0x0D4E, 0x0D56 },
+ { 0x0D58, 0x0D5F },
+ { 0x0D64, 0x0D65 },
+ { 0x0D76, 0x0D78 },
+ { 0x0D80, 0x0D81 },
+ { 0x0D84, 0x0D84 },
+ { 0x0D97, 0x0D99 },
+ { 0x0DB2, 0x0DB2 },
+ { 0x0DBC, 0x0DBC },
+ { 0x0DBE, 0x0DBF },
+ { 0x0DC7, 0x0DC9 },
+ { 0x0DCB, 0x0DCE },
+ { 0x0DD5, 0x0DD5 },
+ { 0x0DD7, 0x0DD7 },
+ { 0x0DE0, 0x0DF1 },
+ { 0x0DF5, 0x0E00 },
+ { 0x0E3B, 0x0E3E },
+ { 0x0E5C, 0x0E80 },
+ { 0x0E83, 0x0E83 },
+ { 0x0E85, 0x0E86 },
+ { 0x0E89, 0x0E89 },
+ { 0x0E8B, 0x0E8C },
+ { 0x0E8E, 0x0E93 },
+ { 0x0E98, 0x0E98 },
+ { 0x0EA0, 0x0EA0 },
+ { 0x0EA4, 0x0EA4 },
+ { 0x0EA6, 0x0EA6 },
+ { 0x0EA8, 0x0EA9 },
+ { 0x0EAC, 0x0EAC },
+ { 0x0EBA, 0x0EBA },
+ { 0x0EBE, 0x0EBF },
+ { 0x0EC5, 0x0EC5 },
+ { 0x0EC7, 0x0EC7 },
+ { 0x0ECE, 0x0ECF },
+ { 0x0EDA, 0x0EDB },
+ { 0x0EDE, 0x0EFF },
+ { 0x0F48, 0x0F48 },
+ { 0x0F6D, 0x0F70 },
+ { 0x0F8C, 0x0F8F },
+ { 0x0F98, 0x0F98 },
+ { 0x0FBD, 0x0FBD },
+ { 0x0FCD, 0x0FCD },
+ { 0x0FD5, 0x0FFF },
+ { 0x109A, 0x109D },
+ { 0x10C6, 0x10CF },
+ { 0x10FD, 0x10FF },
+ { 0x115A, 0x115E },
+ { 0x11A3, 0x11A7 },
+ { 0x11FA, 0x11FF },
+ { 0x1249, 0x1249 },
+ { 0x124E, 0x124F },
+ { 0x1257, 0x1257 },
+ { 0x1259, 0x1259 },
+ { 0x125E, 0x125F },
+ { 0x1289, 0x1289 },
+ { 0x128E, 0x128F },
+ { 0x12B1, 0x12B1 },
+ { 0x12B6, 0x12B7 },
+ { 0x12BF, 0x12BF },
+ { 0x12C1, 0x12C1 },
+ { 0x12C6, 0x12C7 },
+ { 0x12D7, 0x12D7 },
+ { 0x1311, 0x1311 },
+ { 0x1316, 0x1317 },
+ { 0x135B, 0x135E },
+ { 0x137D, 0x137F },
+ { 0x139A, 0x139F },
+ { 0x13F5, 0x1400 },
+ { 0x1677, 0x167F },
+ { 0x169D, 0x169F },
+ { 0x16F1, 0x16FF },
+ { 0x170D, 0x170D },
+ { 0x1715, 0x171F },
+ { 0x1737, 0x173F },
+ { 0x1754, 0x175F },
+ { 0x176D, 0x176D },
+ { 0x1771, 0x1771 },
+ { 0x1774, 0x177F },
+ { 0x17DE, 0x17DF },
+ { 0x17EA, 0x17EF },
+ { 0x17FA, 0x17FF },
+ { 0x180F, 0x180F },
+ { 0x181A, 0x181F },
+ { 0x1878, 0x187F },
+ { 0x18AB, 0x18FF },
+ { 0x191D, 0x191F },
+ { 0x192C, 0x192F },
+ { 0x193C, 0x193F },
+ { 0x1941, 0x1943 },
+ { 0x196E, 0x196F },
+ { 0x1975, 0x197F },
+ { 0x19AA, 0x19AF },
+ { 0x19CA, 0x19CF },
+ { 0x19DA, 0x19DD },
+ { 0x1A1C, 0x1A1D },
+ { 0x1A20, 0x1AFF },
+ { 0x1B4C, 0x1B4F },
+ { 0x1B7D, 0x1B7F },
+ { 0x1BAB, 0x1BAD },
+ { 0x1BBA, 0x1BFF },
+ { 0x1C38, 0x1C3A },
+ { 0x1C4A, 0x1C4C },
+ { 0x1C80, 0x1CFF },
+ { 0x1DE7, 0x1DFD },
+ { 0x1F16, 0x1F17 },
+ { 0x1F1E, 0x1F1F },
+ { 0x1F46, 0x1F47 },
+ { 0x1F4E, 0x1F4F },
+ { 0x1F58, 0x1F58 },
+ { 0x1F5A, 0x1F5A },
+ { 0x1F5C, 0x1F5C },
+ { 0x1F5E, 0x1F5E },
+ { 0x1F7E, 0x1F7F },
+ { 0x1FB5, 0x1FB5 },
+ { 0x1FC5, 0x1FC5 },
+ { 0x1FD4, 0x1FD5 },
+ { 0x1FDC, 0x1FDC },
+ { 0x1FF0, 0x1FF1 },
+ { 0x1FF5, 0x1FF5 },
+ { 0x1FFF, 0x1FFF },
+ { 0x2065, 0x2069 },
+ { 0x2072, 0x2073 },
+ { 0x208F, 0x208F },
+ { 0x2095, 0x209F },
+ { 0x20B6, 0x20CF },
+ { 0x20F1, 0x20FF },
+ { 0x2150, 0x2152 },
+ { 0x2189, 0x218F },
+ { 0x23E8, 0x23FF },
+ { 0x2427, 0x243F },
+ { 0x244B, 0x245F },
+ { 0x269E, 0x269F },
+ { 0x26BD, 0x26BF },
+ { 0x26C4, 0x2700 },
+ { 0x2705, 0x2705 },
+ { 0x270A, 0x270B },
+ { 0x2728, 0x2728 },
+ { 0x274C, 0x274C },
+ { 0x274E, 0x274E },
+ { 0x2753, 0x2755 },
+ { 0x2757, 0x2757 },
+ { 0x275F, 0x2760 },
+ { 0x2795, 0x2797 },
+ { 0x27B0, 0x27B0 },
+ { 0x27BF, 0x27BF },
+ { 0x27CB, 0x27CB },
+ { 0x27CD, 0x27CF },
+ { 0x2B4D, 0x2B4F },
+ { 0x2B55, 0x2BFF },
+ { 0x2C2F, 0x2C2F },
+ { 0x2C5F, 0x2C5F },
+ { 0x2C70, 0x2C70 },
+ { 0x2C7E, 0x2C7F },
+ { 0x2CEB, 0x2CF8 },
+ { 0x2D26, 0x2D2F },
+ { 0x2D66, 0x2D6E },
+ { 0x2D70, 0x2D7F },
+ { 0x2D97, 0x2D9F },
+ { 0x2DA7, 0x2DA7 },
+ { 0x2DAF, 0x2DAF },
+ { 0x2DB7, 0x2DB7 },
+ { 0x2DBF, 0x2DBF },
+ { 0x2DC7, 0x2DC7 },
+ { 0x2DCF, 0x2DCF },
+ { 0x2DD7, 0x2DD7 },
+ { 0x2DDF, 0x2DDF },
+ { 0x2E31, 0x2E7F },
+ { 0x2E9A, 0x2E9A },
+ { 0x2EF4, 0x2EFF },
+ { 0x2FD6, 0x2FEF },
+ { 0x2FFC, 0x2FFF },
+ { 0x3040, 0x3040 },
+ { 0x3097, 0x3098 },
+ { 0x3100, 0x3104 },
+ { 0x312E, 0x3130 },
+ { 0x318F, 0x318F },
+ { 0x31B8, 0x31BF },
+ { 0x31E4, 0x31EF },
+ { 0x321F, 0x321F },
+ { 0x3244, 0x324F },
+ { 0x32FF, 0x32FF },
+ { 0x4DB6, 0x4DBF },
+ { 0x9FC4, 0x9FFF },
+ { 0xA48D, 0xA48F },
+ { 0xA4C7, 0xA4FF },
+ { 0xA62C, 0xA63F },
+ { 0xA660, 0xA661 },
+ { 0xA674, 0xA67B },
+ { 0xA698, 0xA6FF },
+ { 0xA78D, 0xA7FA },
+ { 0xA82C, 0xA83F },
+ { 0xA878, 0xA87F },
+ { 0xA8C5, 0xA8CD },
+ { 0xA8DA, 0xA8FF },
+ { 0xA954, 0xA95E },
+ { 0xA960, 0xA9FF },
+ { 0xAA37, 0xAA3F },
+ { 0xAA4E, 0xAA4F },
+ { 0xAA5A, 0xAA5B },
+ { 0xAA60, 0xABFF },
+ { 0xD7A4, 0xD7FF },
+ { 0xFA2E, 0xFA2F },
+ { 0xFA6B, 0xFA6F },
+ { 0xFADA, 0xFAFF },
+ { 0xFB07, 0xFB12 },
+ { 0xFB18, 0xFB1C },
+ { 0xFB37, 0xFB37 },
+ { 0xFB3D, 0xFB3D },
+ { 0xFB3F, 0xFB3F },
+ { 0xFB42, 0xFB42 },
+ { 0xFB45, 0xFB45 },
+ { 0xFBB2, 0xFBD2 },
+ { 0xFD40, 0xFD4F },
+ { 0xFD90, 0xFD91 },
+ { 0xFDC8, 0xFDCF },
+ { 0xFDFE, 0xFDFF },
+ { 0xFE1A, 0xFE1F },
+ { 0xFE27, 0xFE2F },
+ { 0xFE53, 0xFE53 },
+ { 0xFE67, 0xFE67 },
+ { 0xFE6C, 0xFE6F },
+ { 0xFE75, 0xFE75 },
+ { 0xFEFD, 0xFEFE },
+ { 0xFF00, 0xFF00 },
+ { 0xFFBF, 0xFFC1 },
+ { 0xFFC8, 0xFFC9 },
+ { 0xFFD0, 0xFFD1 },
+ { 0xFFD8, 0xFFD9 },
+ { 0xFFDD, 0xFFDF },
+ { 0xFFE7, 0xFFE7 },
+ { 0xFFEF, 0xFFF8 },
+ { 0x1000C, 0x1000C },
+ { 0x10027, 0x10027 },
+ { 0x1003B, 0x1003B },
+ { 0x1003E, 0x1003E },
+ { 0x1004E, 0x1004F },
+ { 0x1005E, 0x1007F },
+ { 0x100FB, 0x100FF },
+ { 0x10103, 0x10106 },
+ { 0x10134, 0x10136 },
+ { 0x1018B, 0x1018F },
+ { 0x1019C, 0x101CF },
+ { 0x101FE, 0x1027F },
+ { 0x1029D, 0x1029F },
+ { 0x102D1, 0x102FF },
+ { 0x1031F, 0x1031F },
+ { 0x10324, 0x1032F },
+ { 0x1034B, 0x1037F },
+ { 0x1039E, 0x1039E },
+ { 0x103C4, 0x103C7 },
+ { 0x103D6, 0x103FF },
+ { 0x1049E, 0x1049F },
+ { 0x104AA, 0x107FF },
+ { 0x10806, 0x10807 },
+ { 0x10809, 0x10809 },
+ { 0x10836, 0x10836 },
+ { 0x10839, 0x1083B },
+ { 0x1083D, 0x1083E },
+ { 0x10840, 0x108FF },
+ { 0x1091A, 0x1091E },
+ { 0x1093A, 0x1093E },
+ { 0x10940, 0x109FF },
+ { 0x10A04, 0x10A04 },
+ { 0x10A07, 0x10A0B },
+ { 0x10A14, 0x10A14 },
+ { 0x10A18, 0x10A18 },
+ { 0x10A34, 0x10A37 },
+ { 0x10A3B, 0x10A3E },
+ { 0x10A48, 0x10A4F },
+ { 0x10A59, 0x11FFF },
+ { 0x1236F, 0x123FF },
+ { 0x12463, 0x1246F },
+ { 0x12474, 0x1CFFF },
+ { 0x1D0F6, 0x1D0FF },
+ { 0x1D127, 0x1D128 },
+ { 0x1D1DE, 0x1D1FF },
+ { 0x1D246, 0x1D2FF },
+ { 0x1D357, 0x1D35F },
+ { 0x1D372, 0x1D3FF },
+ { 0x1D455, 0x1D455 },
+ { 0x1D49D, 0x1D49D },
+ { 0x1D4A0, 0x1D4A1 },
+ { 0x1D4A3, 0x1D4A4 },
+ { 0x1D4A7, 0x1D4A8 },
+ { 0x1D4AD, 0x1D4AD },
+ { 0x1D4BA, 0x1D4BA },
+ { 0x1D4BC, 0x1D4BC },
+ { 0x1D4C4, 0x1D4C4 },
+ { 0x1D506, 0x1D506 },
+ { 0x1D50B, 0x1D50C },
+ { 0x1D515, 0x1D515 },
+ { 0x1D51D, 0x1D51D },
+ { 0x1D53A, 0x1D53A },
+ { 0x1D53F, 0x1D53F },
+ { 0x1D545, 0x1D545 },
+ { 0x1D547, 0x1D549 },
+ { 0x1D551, 0x1D551 },
+ { 0x1D6A6, 0x1D6A7 },
+ { 0x1D7CC, 0x1D7CD },
+ { 0x1D800, 0x1EFFF },
+ { 0x1F02C, 0x1F02F },
+ { 0x1F094, 0x1FFFD },
+ { 0x2A6D7, 0x2F7FF },
+ { 0x2FA1E, 0x2FFFD },
+ { 0x30000, 0x3FFFD },
+ { 0x40000, 0x4FFFD },
+ { 0x50000, 0x5FFFD },
+ { 0x60000, 0x6FFFD },
+ { 0x70000, 0x7FFFD },
+ { 0x80000, 0x8FFFD },
+ { 0x90000, 0x9FFFD },
+ { 0xA0000, 0xAFFFD },
+ { 0xB0000, 0xBFFFD },
+ { 0xC0000, 0xCFFFD },
+ { 0xD0000, 0xDFFFD },
+ { 0xE0000, 0xE0000 },
+ { 0xE0002, 0xE001F },
+ { 0xE0080, 0xE00FF },
+ { 0xE01F0, 0xEFFFD }
+
+#define PREDICATE(c) uc_is_property_unassigned_code_value (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_unified_ideograph.c b/gnulib/tests/unictype/test-pr_unified_ideograph.c
new file mode 100644
index 00000000..e394751d
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_unified_ideograph.c
@@ -0,0 +1,32 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xFA0E, 0xFA0F },
+ { 0xFA11, 0xFA11 },
+ { 0xFA13, 0xFA14 },
+ { 0xFA1F, 0xFA1F },
+ { 0xFA21, 0xFA21 },
+ { 0xFA23, 0xFA24 },
+ { 0xFA27, 0xFA29 },
+ { 0x20000, 0x2A6D6 }
+
+#define PREDICATE(c) uc_is_property_unified_ideograph (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_uppercase.c b/gnulib/tests/unictype/test-pr_uppercase.c
new file mode 100644
index 00000000..f44611ba
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_uppercase.c
@@ -0,0 +1,615 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00DE },
+ { 0x0100, 0x0100 },
+ { 0x0102, 0x0102 },
+ { 0x0104, 0x0104 },
+ { 0x0106, 0x0106 },
+ { 0x0108, 0x0108 },
+ { 0x010A, 0x010A },
+ { 0x010C, 0x010C },
+ { 0x010E, 0x010E },
+ { 0x0110, 0x0110 },
+ { 0x0112, 0x0112 },
+ { 0x0114, 0x0114 },
+ { 0x0116, 0x0116 },
+ { 0x0118, 0x0118 },
+ { 0x011A, 0x011A },
+ { 0x011C, 0x011C },
+ { 0x011E, 0x011E },
+ { 0x0120, 0x0120 },
+ { 0x0122, 0x0122 },
+ { 0x0124, 0x0124 },
+ { 0x0126, 0x0126 },
+ { 0x0128, 0x0128 },
+ { 0x012A, 0x012A },
+ { 0x012C, 0x012C },
+ { 0x012E, 0x012E },
+ { 0x0130, 0x0130 },
+ { 0x0132, 0x0132 },
+ { 0x0134, 0x0134 },
+ { 0x0136, 0x0136 },
+ { 0x0139, 0x0139 },
+ { 0x013B, 0x013B },
+ { 0x013D, 0x013D },
+ { 0x013F, 0x013F },
+ { 0x0141, 0x0141 },
+ { 0x0143, 0x0143 },
+ { 0x0145, 0x0145 },
+ { 0x0147, 0x0147 },
+ { 0x014A, 0x014A },
+ { 0x014C, 0x014C },
+ { 0x014E, 0x014E },
+ { 0x0150, 0x0150 },
+ { 0x0152, 0x0152 },
+ { 0x0154, 0x0154 },
+ { 0x0156, 0x0156 },
+ { 0x0158, 0x0158 },
+ { 0x015A, 0x015A },
+ { 0x015C, 0x015C },
+ { 0x015E, 0x015E },
+ { 0x0160, 0x0160 },
+ { 0x0162, 0x0162 },
+ { 0x0164, 0x0164 },
+ { 0x0166, 0x0166 },
+ { 0x0168, 0x0168 },
+ { 0x016A, 0x016A },
+ { 0x016C, 0x016C },
+ { 0x016E, 0x016E },
+ { 0x0170, 0x0170 },
+ { 0x0172, 0x0172 },
+ { 0x0174, 0x0174 },
+ { 0x0176, 0x0176 },
+ { 0x0178, 0x0179 },
+ { 0x017B, 0x017B },
+ { 0x017D, 0x017D },
+ { 0x0181, 0x0182 },
+ { 0x0184, 0x0184 },
+ { 0x0186, 0x0187 },
+ { 0x0189, 0x018B },
+ { 0x018E, 0x0191 },
+ { 0x0193, 0x0194 },
+ { 0x0196, 0x0198 },
+ { 0x019C, 0x019D },
+ { 0x019F, 0x01A0 },
+ { 0x01A2, 0x01A2 },
+ { 0x01A4, 0x01A4 },
+ { 0x01A6, 0x01A7 },
+ { 0x01A9, 0x01A9 },
+ { 0x01AC, 0x01AC },
+ { 0x01AE, 0x01AF },
+ { 0x01B1, 0x01B3 },
+ { 0x01B5, 0x01B5 },
+ { 0x01B7, 0x01B8 },
+ { 0x01BC, 0x01BC },
+ { 0x01C4, 0x01C4 },
+ { 0x01C7, 0x01C7 },
+ { 0x01CA, 0x01CA },
+ { 0x01CD, 0x01CD },
+ { 0x01CF, 0x01CF },
+ { 0x01D1, 0x01D1 },
+ { 0x01D3, 0x01D3 },
+ { 0x01D5, 0x01D5 },
+ { 0x01D7, 0x01D7 },
+ { 0x01D9, 0x01D9 },
+ { 0x01DB, 0x01DB },
+ { 0x01DE, 0x01DE },
+ { 0x01E0, 0x01E0 },
+ { 0x01E2, 0x01E2 },
+ { 0x01E4, 0x01E4 },
+ { 0x01E6, 0x01E6 },
+ { 0x01E8, 0x01E8 },
+ { 0x01EA, 0x01EA },
+ { 0x01EC, 0x01EC },
+ { 0x01EE, 0x01EE },
+ { 0x01F1, 0x01F1 },
+ { 0x01F4, 0x01F4 },
+ { 0x01F6, 0x01F8 },
+ { 0x01FA, 0x01FA },
+ { 0x01FC, 0x01FC },
+ { 0x01FE, 0x01FE },
+ { 0x0200, 0x0200 },
+ { 0x0202, 0x0202 },
+ { 0x0204, 0x0204 },
+ { 0x0206, 0x0206 },
+ { 0x0208, 0x0208 },
+ { 0x020A, 0x020A },
+ { 0x020C, 0x020C },
+ { 0x020E, 0x020E },
+ { 0x0210, 0x0210 },
+ { 0x0212, 0x0212 },
+ { 0x0214, 0x0214 },
+ { 0x0216, 0x0216 },
+ { 0x0218, 0x0218 },
+ { 0x021A, 0x021A },
+ { 0x021C, 0x021C },
+ { 0x021E, 0x021E },
+ { 0x0220, 0x0220 },
+ { 0x0222, 0x0222 },
+ { 0x0224, 0x0224 },
+ { 0x0226, 0x0226 },
+ { 0x0228, 0x0228 },
+ { 0x022A, 0x022A },
+ { 0x022C, 0x022C },
+ { 0x022E, 0x022E },
+ { 0x0230, 0x0230 },
+ { 0x0232, 0x0232 },
+ { 0x023A, 0x023B },
+ { 0x023D, 0x023E },
+ { 0x0241, 0x0241 },
+ { 0x0243, 0x0246 },
+ { 0x0248, 0x0248 },
+ { 0x024A, 0x024A },
+ { 0x024C, 0x024C },
+ { 0x024E, 0x024E },
+ { 0x0370, 0x0370 },
+ { 0x0372, 0x0372 },
+ { 0x0376, 0x0376 },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x038F },
+ { 0x0391, 0x03A1 },
+ { 0x03A3, 0x03AB },
+ { 0x03CF, 0x03CF },
+ { 0x03D2, 0x03D4 },
+ { 0x03D8, 0x03D8 },
+ { 0x03DA, 0x03DA },
+ { 0x03DC, 0x03DC },
+ { 0x03DE, 0x03DE },
+ { 0x03E0, 0x03E0 },
+ { 0x03E2, 0x03E2 },
+ { 0x03E4, 0x03E4 },
+ { 0x03E6, 0x03E6 },
+ { 0x03E8, 0x03E8 },
+ { 0x03EA, 0x03EA },
+ { 0x03EC, 0x03EC },
+ { 0x03EE, 0x03EE },
+ { 0x03F4, 0x03F4 },
+ { 0x03F7, 0x03F7 },
+ { 0x03F9, 0x03FA },
+ { 0x03FD, 0x042F },
+ { 0x0460, 0x0460 },
+ { 0x0462, 0x0462 },
+ { 0x0464, 0x0464 },
+ { 0x0466, 0x0466 },
+ { 0x0468, 0x0468 },
+ { 0x046A, 0x046A },
+ { 0x046C, 0x046C },
+ { 0x046E, 0x046E },
+ { 0x0470, 0x0470 },
+ { 0x0472, 0x0472 },
+ { 0x0474, 0x0474 },
+ { 0x0476, 0x0476 },
+ { 0x0478, 0x0478 },
+ { 0x047A, 0x047A },
+ { 0x047C, 0x047C },
+ { 0x047E, 0x047E },
+ { 0x0480, 0x0480 },
+ { 0x048A, 0x048A },
+ { 0x048C, 0x048C },
+ { 0x048E, 0x048E },
+ { 0x0490, 0x0490 },
+ { 0x0492, 0x0492 },
+ { 0x0494, 0x0494 },
+ { 0x0496, 0x0496 },
+ { 0x0498, 0x0498 },
+ { 0x049A, 0x049A },
+ { 0x049C, 0x049C },
+ { 0x049E, 0x049E },
+ { 0x04A0, 0x04A0 },
+ { 0x04A2, 0x04A2 },
+ { 0x04A4, 0x04A4 },
+ { 0x04A6, 0x04A6 },
+ { 0x04A8, 0x04A8 },
+ { 0x04AA, 0x04AA },
+ { 0x04AC, 0x04AC },
+ { 0x04AE, 0x04AE },
+ { 0x04B0, 0x04B0 },
+ { 0x04B2, 0x04B2 },
+ { 0x04B4, 0x04B4 },
+ { 0x04B6, 0x04B6 },
+ { 0x04B8, 0x04B8 },
+ { 0x04BA, 0x04BA },
+ { 0x04BC, 0x04BC },
+ { 0x04BE, 0x04BE },
+ { 0x04C0, 0x04C1 },
+ { 0x04C3, 0x04C3 },
+ { 0x04C5, 0x04C5 },
+ { 0x04C7, 0x04C7 },
+ { 0x04C9, 0x04C9 },
+ { 0x04CB, 0x04CB },
+ { 0x04CD, 0x04CD },
+ { 0x04D0, 0x04D0 },
+ { 0x04D2, 0x04D2 },
+ { 0x04D4, 0x04D4 },
+ { 0x04D6, 0x04D6 },
+ { 0x04D8, 0x04D8 },
+ { 0x04DA, 0x04DA },
+ { 0x04DC, 0x04DC },
+ { 0x04DE, 0x04DE },
+ { 0x04E0, 0x04E0 },
+ { 0x04E2, 0x04E2 },
+ { 0x04E4, 0x04E4 },
+ { 0x04E6, 0x04E6 },
+ { 0x04E8, 0x04E8 },
+ { 0x04EA, 0x04EA },
+ { 0x04EC, 0x04EC },
+ { 0x04EE, 0x04EE },
+ { 0x04F0, 0x04F0 },
+ { 0x04F2, 0x04F2 },
+ { 0x04F4, 0x04F4 },
+ { 0x04F6, 0x04F6 },
+ { 0x04F8, 0x04F8 },
+ { 0x04FA, 0x04FA },
+ { 0x04FC, 0x04FC },
+ { 0x04FE, 0x04FE },
+ { 0x0500, 0x0500 },
+ { 0x0502, 0x0502 },
+ { 0x0504, 0x0504 },
+ { 0x0506, 0x0506 },
+ { 0x0508, 0x0508 },
+ { 0x050A, 0x050A },
+ { 0x050C, 0x050C },
+ { 0x050E, 0x050E },
+ { 0x0510, 0x0510 },
+ { 0x0512, 0x0512 },
+ { 0x0514, 0x0514 },
+ { 0x0516, 0x0516 },
+ { 0x0518, 0x0518 },
+ { 0x051A, 0x051A },
+ { 0x051C, 0x051C },
+ { 0x051E, 0x051E },
+ { 0x0520, 0x0520 },
+ { 0x0522, 0x0522 },
+ { 0x0531, 0x0556 },
+ { 0x10A0, 0x10C5 },
+ { 0x1E00, 0x1E00 },
+ { 0x1E02, 0x1E02 },
+ { 0x1E04, 0x1E04 },
+ { 0x1E06, 0x1E06 },
+ { 0x1E08, 0x1E08 },
+ { 0x1E0A, 0x1E0A },
+ { 0x1E0C, 0x1E0C },
+ { 0x1E0E, 0x1E0E },
+ { 0x1E10, 0x1E10 },
+ { 0x1E12, 0x1E12 },
+ { 0x1E14, 0x1E14 },
+ { 0x1E16, 0x1E16 },
+ { 0x1E18, 0x1E18 },
+ { 0x1E1A, 0x1E1A },
+ { 0x1E1C, 0x1E1C },
+ { 0x1E1E, 0x1E1E },
+ { 0x1E20, 0x1E20 },
+ { 0x1E22, 0x1E22 },
+ { 0x1E24, 0x1E24 },
+ { 0x1E26, 0x1E26 },
+ { 0x1E28, 0x1E28 },
+ { 0x1E2A, 0x1E2A },
+ { 0x1E2C, 0x1E2C },
+ { 0x1E2E, 0x1E2E },
+ { 0x1E30, 0x1E30 },
+ { 0x1E32, 0x1E32 },
+ { 0x1E34, 0x1E34 },
+ { 0x1E36, 0x1E36 },
+ { 0x1E38, 0x1E38 },
+ { 0x1E3A, 0x1E3A },
+ { 0x1E3C, 0x1E3C },
+ { 0x1E3E, 0x1E3E },
+ { 0x1E40, 0x1E40 },
+ { 0x1E42, 0x1E42 },
+ { 0x1E44, 0x1E44 },
+ { 0x1E46, 0x1E46 },
+ { 0x1E48, 0x1E48 },
+ { 0x1E4A, 0x1E4A },
+ { 0x1E4C, 0x1E4C },
+ { 0x1E4E, 0x1E4E },
+ { 0x1E50, 0x1E50 },
+ { 0x1E52, 0x1E52 },
+ { 0x1E54, 0x1E54 },
+ { 0x1E56, 0x1E56 },
+ { 0x1E58, 0x1E58 },
+ { 0x1E5A, 0x1E5A },
+ { 0x1E5C, 0x1E5C },
+ { 0x1E5E, 0x1E5E },
+ { 0x1E60, 0x1E60 },
+ { 0x1E62, 0x1E62 },
+ { 0x1E64, 0x1E64 },
+ { 0x1E66, 0x1E66 },
+ { 0x1E68, 0x1E68 },
+ { 0x1E6A, 0x1E6A },
+ { 0x1E6C, 0x1E6C },
+ { 0x1E6E, 0x1E6E },
+ { 0x1E70, 0x1E70 },
+ { 0x1E72, 0x1E72 },
+ { 0x1E74, 0x1E74 },
+ { 0x1E76, 0x1E76 },
+ { 0x1E78, 0x1E78 },
+ { 0x1E7A, 0x1E7A },
+ { 0x1E7C, 0x1E7C },
+ { 0x1E7E, 0x1E7E },
+ { 0x1E80, 0x1E80 },
+ { 0x1E82, 0x1E82 },
+ { 0x1E84, 0x1E84 },
+ { 0x1E86, 0x1E86 },
+ { 0x1E88, 0x1E88 },
+ { 0x1E8A, 0x1E8A },
+ { 0x1E8C, 0x1E8C },
+ { 0x1E8E, 0x1E8E },
+ { 0x1E90, 0x1E90 },
+ { 0x1E92, 0x1E92 },
+ { 0x1E94, 0x1E94 },
+ { 0x1E9E, 0x1E9E },
+ { 0x1EA0, 0x1EA0 },
+ { 0x1EA2, 0x1EA2 },
+ { 0x1EA4, 0x1EA4 },
+ { 0x1EA6, 0x1EA6 },
+ { 0x1EA8, 0x1EA8 },
+ { 0x1EAA, 0x1EAA },
+ { 0x1EAC, 0x1EAC },
+ { 0x1EAE, 0x1EAE },
+ { 0x1EB0, 0x1EB0 },
+ { 0x1EB2, 0x1EB2 },
+ { 0x1EB4, 0x1EB4 },
+ { 0x1EB6, 0x1EB6 },
+ { 0x1EB8, 0x1EB8 },
+ { 0x1EBA, 0x1EBA },
+ { 0x1EBC, 0x1EBC },
+ { 0x1EBE, 0x1EBE },
+ { 0x1EC0, 0x1EC0 },
+ { 0x1EC2, 0x1EC2 },
+ { 0x1EC4, 0x1EC4 },
+ { 0x1EC6, 0x1EC6 },
+ { 0x1EC8, 0x1EC8 },
+ { 0x1ECA, 0x1ECA },
+ { 0x1ECC, 0x1ECC },
+ { 0x1ECE, 0x1ECE },
+ { 0x1ED0, 0x1ED0 },
+ { 0x1ED2, 0x1ED2 },
+ { 0x1ED4, 0x1ED4 },
+ { 0x1ED6, 0x1ED6 },
+ { 0x1ED8, 0x1ED8 },
+ { 0x1EDA, 0x1EDA },
+ { 0x1EDC, 0x1EDC },
+ { 0x1EDE, 0x1EDE },
+ { 0x1EE0, 0x1EE0 },
+ { 0x1EE2, 0x1EE2 },
+ { 0x1EE4, 0x1EE4 },
+ { 0x1EE6, 0x1EE6 },
+ { 0x1EE8, 0x1EE8 },
+ { 0x1EEA, 0x1EEA },
+ { 0x1EEC, 0x1EEC },
+ { 0x1EEE, 0x1EEE },
+ { 0x1EF0, 0x1EF0 },
+ { 0x1EF2, 0x1EF2 },
+ { 0x1EF4, 0x1EF4 },
+ { 0x1EF6, 0x1EF6 },
+ { 0x1EF8, 0x1EF8 },
+ { 0x1EFA, 0x1EFA },
+ { 0x1EFC, 0x1EFC },
+ { 0x1EFE, 0x1EFE },
+ { 0x1F08, 0x1F0F },
+ { 0x1F18, 0x1F1D },
+ { 0x1F28, 0x1F2F },
+ { 0x1F38, 0x1F3F },
+ { 0x1F48, 0x1F4D },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F5F },
+ { 0x1F68, 0x1F6F },
+ { 0x1FB8, 0x1FBB },
+ { 0x1FC8, 0x1FCB },
+ { 0x1FD8, 0x1FDB },
+ { 0x1FE8, 0x1FEC },
+ { 0x1FF8, 0x1FFB },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210B, 0x210D },
+ { 0x2110, 0x2112 },
+ { 0x2115, 0x2115 },
+ { 0x2119, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x212D },
+ { 0x2130, 0x2133 },
+ { 0x213E, 0x213F },
+ { 0x2145, 0x2145 },
+ { 0x2160, 0x216F },
+ { 0x2183, 0x2183 },
+ { 0x24B6, 0x24CF },
+ { 0x2C00, 0x2C2E },
+ { 0x2C60, 0x2C60 },
+ { 0x2C62, 0x2C64 },
+ { 0x2C67, 0x2C67 },
+ { 0x2C69, 0x2C69 },
+ { 0x2C6B, 0x2C6B },
+ { 0x2C6D, 0x2C6F },
+ { 0x2C72, 0x2C72 },
+ { 0x2C75, 0x2C75 },
+ { 0x2C80, 0x2C80 },
+ { 0x2C82, 0x2C82 },
+ { 0x2C84, 0x2C84 },
+ { 0x2C86, 0x2C86 },
+ { 0x2C88, 0x2C88 },
+ { 0x2C8A, 0x2C8A },
+ { 0x2C8C, 0x2C8C },
+ { 0x2C8E, 0x2C8E },
+ { 0x2C90, 0x2C90 },
+ { 0x2C92, 0x2C92 },
+ { 0x2C94, 0x2C94 },
+ { 0x2C96, 0x2C96 },
+ { 0x2C98, 0x2C98 },
+ { 0x2C9A, 0x2C9A },
+ { 0x2C9C, 0x2C9C },
+ { 0x2C9E, 0x2C9E },
+ { 0x2CA0, 0x2CA0 },
+ { 0x2CA2, 0x2CA2 },
+ { 0x2CA4, 0x2CA4 },
+ { 0x2CA6, 0x2CA6 },
+ { 0x2CA8, 0x2CA8 },
+ { 0x2CAA, 0x2CAA },
+ { 0x2CAC, 0x2CAC },
+ { 0x2CAE, 0x2CAE },
+ { 0x2CB0, 0x2CB0 },
+ { 0x2CB2, 0x2CB2 },
+ { 0x2CB4, 0x2CB4 },
+ { 0x2CB6, 0x2CB6 },
+ { 0x2CB8, 0x2CB8 },
+ { 0x2CBA, 0x2CBA },
+ { 0x2CBC, 0x2CBC },
+ { 0x2CBE, 0x2CBE },
+ { 0x2CC0, 0x2CC0 },
+ { 0x2CC2, 0x2CC2 },
+ { 0x2CC4, 0x2CC4 },
+ { 0x2CC6, 0x2CC6 },
+ { 0x2CC8, 0x2CC8 },
+ { 0x2CCA, 0x2CCA },
+ { 0x2CCC, 0x2CCC },
+ { 0x2CCE, 0x2CCE },
+ { 0x2CD0, 0x2CD0 },
+ { 0x2CD2, 0x2CD2 },
+ { 0x2CD4, 0x2CD4 },
+ { 0x2CD6, 0x2CD6 },
+ { 0x2CD8, 0x2CD8 },
+ { 0x2CDA, 0x2CDA },
+ { 0x2CDC, 0x2CDC },
+ { 0x2CDE, 0x2CDE },
+ { 0x2CE0, 0x2CE0 },
+ { 0x2CE2, 0x2CE2 },
+ { 0xA640, 0xA640 },
+ { 0xA642, 0xA642 },
+ { 0xA644, 0xA644 },
+ { 0xA646, 0xA646 },
+ { 0xA648, 0xA648 },
+ { 0xA64A, 0xA64A },
+ { 0xA64C, 0xA64C },
+ { 0xA64E, 0xA64E },
+ { 0xA650, 0xA650 },
+ { 0xA652, 0xA652 },
+ { 0xA654, 0xA654 },
+ { 0xA656, 0xA656 },
+ { 0xA658, 0xA658 },
+ { 0xA65A, 0xA65A },
+ { 0xA65C, 0xA65C },
+ { 0xA65E, 0xA65E },
+ { 0xA662, 0xA662 },
+ { 0xA664, 0xA664 },
+ { 0xA666, 0xA666 },
+ { 0xA668, 0xA668 },
+ { 0xA66A, 0xA66A },
+ { 0xA66C, 0xA66C },
+ { 0xA680, 0xA680 },
+ { 0xA682, 0xA682 },
+ { 0xA684, 0xA684 },
+ { 0xA686, 0xA686 },
+ { 0xA688, 0xA688 },
+ { 0xA68A, 0xA68A },
+ { 0xA68C, 0xA68C },
+ { 0xA68E, 0xA68E },
+ { 0xA690, 0xA690 },
+ { 0xA692, 0xA692 },
+ { 0xA694, 0xA694 },
+ { 0xA696, 0xA696 },
+ { 0xA722, 0xA722 },
+ { 0xA724, 0xA724 },
+ { 0xA726, 0xA726 },
+ { 0xA728, 0xA728 },
+ { 0xA72A, 0xA72A },
+ { 0xA72C, 0xA72C },
+ { 0xA72E, 0xA72E },
+ { 0xA732, 0xA732 },
+ { 0xA734, 0xA734 },
+ { 0xA736, 0xA736 },
+ { 0xA738, 0xA738 },
+ { 0xA73A, 0xA73A },
+ { 0xA73C, 0xA73C },
+ { 0xA73E, 0xA73E },
+ { 0xA740, 0xA740 },
+ { 0xA742, 0xA742 },
+ { 0xA744, 0xA744 },
+ { 0xA746, 0xA746 },
+ { 0xA748, 0xA748 },
+ { 0xA74A, 0xA74A },
+ { 0xA74C, 0xA74C },
+ { 0xA74E, 0xA74E },
+ { 0xA750, 0xA750 },
+ { 0xA752, 0xA752 },
+ { 0xA754, 0xA754 },
+ { 0xA756, 0xA756 },
+ { 0xA758, 0xA758 },
+ { 0xA75A, 0xA75A },
+ { 0xA75C, 0xA75C },
+ { 0xA75E, 0xA75E },
+ { 0xA760, 0xA760 },
+ { 0xA762, 0xA762 },
+ { 0xA764, 0xA764 },
+ { 0xA766, 0xA766 },
+ { 0xA768, 0xA768 },
+ { 0xA76A, 0xA76A },
+ { 0xA76C, 0xA76C },
+ { 0xA76E, 0xA76E },
+ { 0xA779, 0xA779 },
+ { 0xA77B, 0xA77B },
+ { 0xA77D, 0xA77E },
+ { 0xA780, 0xA780 },
+ { 0xA782, 0xA782 },
+ { 0xA784, 0xA784 },
+ { 0xA786, 0xA786 },
+ { 0xA78B, 0xA78B },
+ { 0xFF21, 0xFF3A },
+ { 0x10400, 0x10427 },
+ { 0x1D400, 0x1D419 },
+ { 0x1D434, 0x1D44D },
+ { 0x1D468, 0x1D481 },
+ { 0x1D49C, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B5 },
+ { 0x1D4D0, 0x1D4E9 },
+ { 0x1D504, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D538, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D56C, 0x1D585 },
+ { 0x1D5A0, 0x1D5B9 },
+ { 0x1D5D4, 0x1D5ED },
+ { 0x1D608, 0x1D621 },
+ { 0x1D63C, 0x1D655 },
+ { 0x1D670, 0x1D689 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6E2, 0x1D6FA },
+ { 0x1D71C, 0x1D734 },
+ { 0x1D756, 0x1D76E },
+ { 0x1D790, 0x1D7A8 },
+ { 0x1D7CA, 0x1D7CA }
+
+#define PREDICATE(c) uc_is_property_uppercase (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_variation_selector.c b/gnulib/tests/unictype/test-pr_variation_selector.c
new file mode 100644
index 00000000..50aaa434
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_variation_selector.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x180B, 0x180D },
+ { 0xFE00, 0xFE0F },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_property_variation_selector (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_white_space.c b/gnulib/tests/unictype/test-pr_white_space.c
new file mode 100644
index 00000000..a7d82173
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_white_space.c
@@ -0,0 +1,33 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0009, 0x000D },
+ { 0x0020, 0x0020 },
+ { 0x0085, 0x0085 },
+ { 0x00A0, 0x00A0 },
+ { 0x1680, 0x1680 },
+ { 0x180E, 0x180E },
+ { 0x2000, 0x200A },
+ { 0x2028, 0x2029 },
+ { 0x202F, 0x202F },
+ { 0x205F, 0x205F },
+ { 0x3000, 0x3000 }
+
+#define PREDICATE(c) uc_is_property_white_space (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_xid_continue.c b/gnulib/tests/unictype/test-pr_xid_continue.c
new file mode 100644
index 00000000..14148c52
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_xid_continue.c
@@ -0,0 +1,506 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0030, 0x0039 },
+ { 0x0041, 0x005A },
+ { 0x005F, 0x005F },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00B7, 0x00B7 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0300, 0x0374 },
+ { 0x0376, 0x0377 },
+ { 0x037B, 0x037D },
+ { 0x0386, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x0483, 0x0487 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x0559 },
+ { 0x0561, 0x0587 },
+ { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF },
+ { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0610, 0x061A },
+ { 0x0621, 0x065E },
+ { 0x0660, 0x0669 },
+ { 0x066E, 0x06D3 },
+ { 0x06D5, 0x06DC },
+ { 0x06DF, 0x06E8 },
+ { 0x06EA, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x074A },
+ { 0x074D, 0x07B1 },
+ { 0x07C0, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0901, 0x0939 },
+ { 0x093C, 0x094D },
+ { 0x0950, 0x0954 },
+ { 0x0958, 0x0963 },
+ { 0x0966, 0x096F },
+ { 0x0971, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0981, 0x0983 },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BC, 0x09C4 },
+ { 0x09C7, 0x09C8 },
+ { 0x09CB, 0x09CE },
+ { 0x09D7, 0x09D7 },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E3 },
+ { 0x09E6, 0x09F1 },
+ { 0x0A01, 0x0A03 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A3C, 0x0A3C },
+ { 0x0A3E, 0x0A42 },
+ { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D },
+ { 0x0A51, 0x0A51 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A66, 0x0A75 },
+ { 0x0A81, 0x0A83 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABC, 0x0AC5 },
+ { 0x0AC7, 0x0AC9 },
+ { 0x0ACB, 0x0ACD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE3 },
+ { 0x0AE6, 0x0AEF },
+ { 0x0B01, 0x0B03 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3C, 0x0B44 },
+ { 0x0B47, 0x0B48 },
+ { 0x0B4B, 0x0B4D },
+ { 0x0B56, 0x0B57 },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B63 },
+ { 0x0B66, 0x0B6F },
+ { 0x0B71, 0x0B71 },
+ { 0x0B82, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BBE, 0x0BC2 },
+ { 0x0BC6, 0x0BC8 },
+ { 0x0BCA, 0x0BCD },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0BD7, 0x0BD7 },
+ { 0x0BE6, 0x0BEF },
+ { 0x0C01, 0x0C03 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C44 },
+ { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D },
+ { 0x0C55, 0x0C56 },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C63 },
+ { 0x0C66, 0x0C6F },
+ { 0x0C82, 0x0C83 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBC, 0x0CC4 },
+ { 0x0CC6, 0x0CC8 },
+ { 0x0CCA, 0x0CCD },
+ { 0x0CD5, 0x0CD6 },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE3 },
+ { 0x0CE6, 0x0CEF },
+ { 0x0D02, 0x0D03 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D44 },
+ { 0x0D46, 0x0D48 },
+ { 0x0D4A, 0x0D4D },
+ { 0x0D57, 0x0D57 },
+ { 0x0D60, 0x0D63 },
+ { 0x0D66, 0x0D6F },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D82, 0x0D83 },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0DCA, 0x0DCA },
+ { 0x0DCF, 0x0DD4 },
+ { 0x0DD6, 0x0DD6 },
+ { 0x0DD8, 0x0DDF },
+ { 0x0DF2, 0x0DF3 },
+ { 0x0E01, 0x0E3A },
+ { 0x0E40, 0x0E4E },
+ { 0x0E50, 0x0E59 },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB9 },
+ { 0x0EBB, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0EC8, 0x0ECD },
+ { 0x0ED0, 0x0ED9 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F18, 0x0F19 },
+ { 0x0F20, 0x0F29 },
+ { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 },
+ { 0x0F3E, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F71, 0x0F84 },
+ { 0x0F86, 0x0F8B },
+ { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 },
+ { 0x1000, 0x1049 },
+ { 0x1050, 0x1099 },
+ { 0x10A0, 0x10C5 },
+ { 0x10D0, 0x10FA },
+ { 0x10FC, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x135F, 0x135F },
+ { 0x1369, 0x1371 },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x16EE, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1714 },
+ { 0x1720, 0x1734 },
+ { 0x1740, 0x1753 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1772, 0x1773 },
+ { 0x1780, 0x17B3 },
+ { 0x17B6, 0x17D3 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DC, 0x17DD },
+ { 0x17E0, 0x17E9 },
+ { 0x180B, 0x180D },
+ { 0x1810, 0x1819 },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1920, 0x192B },
+ { 0x1930, 0x193B },
+ { 0x1946, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19B0, 0x19C9 },
+ { 0x19D0, 0x19D9 },
+ { 0x1A00, 0x1A1B },
+ { 0x1B00, 0x1B4B },
+ { 0x1B50, 0x1B59 },
+ { 0x1B6B, 0x1B73 },
+ { 0x1B80, 0x1BAA },
+ { 0x1BAE, 0x1BB9 },
+ { 0x1C00, 0x1C37 },
+ { 0x1C40, 0x1C49 },
+ { 0x1C4D, 0x1C7D },
+ { 0x1D00, 0x1DE6 },
+ { 0x1DFE, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x203F, 0x2040 },
+ { 0x2054, 0x2054 },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x20D0, 0x20DC },
+ { 0x20E1, 0x20E1 },
+ { 0x20E5, 0x20F0 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2118, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2160, 0x2188 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x2DE0, 0x2DFF },
+ { 0x3005, 0x3007 },
+ { 0x3021, 0x302F },
+ { 0x3031, 0x3035 },
+ { 0x3038, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x3099, 0x309A },
+ { 0x309D, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA500, 0xA60C },
+ { 0xA610, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66F },
+ { 0xA67C, 0xA67D },
+ { 0xA67F, 0xA697 },
+ { 0xA717, 0xA71F },
+ { 0xA722, 0xA788 },
+ { 0xA78B, 0xA78C },
+ { 0xA7FB, 0xA827 },
+ { 0xA840, 0xA873 },
+ { 0xA880, 0xA8C4 },
+ { 0xA8D0, 0xA8D9 },
+ { 0xA900, 0xA92D },
+ { 0xA930, 0xA953 },
+ { 0xAA00, 0xAA36 },
+ { 0xAA40, 0xAA4D },
+ { 0xAA50, 0xAA59 },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFC5D },
+ { 0xFC64, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDF9 },
+ { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE26 },
+ { 0xFE33, 0xFE34 },
+ { 0xFE4D, 0xFE4F },
+ { 0xFE71, 0xFE71 },
+ { 0xFE73, 0xFE73 },
+ { 0xFE77, 0xFE77 },
+ { 0xFE79, 0xFE79 },
+ { 0xFE7B, 0xFE7B },
+ { 0xFE7D, 0xFE7D },
+ { 0xFE7F, 0xFEFC },
+ { 0xFF10, 0xFF19 },
+ { 0xFF21, 0xFF3A },
+ { 0xFF3F, 0xFF3F },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10140, 0x10174 },
+ { 0x101FD, 0x101FD },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x103D1, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x104A0, 0x104A9 },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A03 },
+ { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x10A38, 0x10A3A },
+ { 0x10A3F, 0x10A3F },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x1D165, 0x1D169 },
+ { 0x1D16D, 0x1D172 },
+ { 0x1D17B, 0x1D182 },
+ { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x1D7CE, 0x1D7FF },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D },
+ { 0xE0100, 0xE01EF }
+
+#define PREDICATE(c) uc_is_property_xid_continue (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_xid_start.c b/gnulib/tests/unictype/test-pr_xid_start.c
new file mode 100644
index 00000000..57326c0f
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_xid_start.c
@@ -0,0 +1,421 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0041, 0x005A },
+ { 0x0061, 0x007A },
+ { 0x00AA, 0x00AA },
+ { 0x00B5, 0x00B5 },
+ { 0x00BA, 0x00BA },
+ { 0x00C0, 0x00D6 },
+ { 0x00D8, 0x00F6 },
+ { 0x00F8, 0x02C1 },
+ { 0x02C6, 0x02D1 },
+ { 0x02E0, 0x02E4 },
+ { 0x02EC, 0x02EC },
+ { 0x02EE, 0x02EE },
+ { 0x0370, 0x0374 },
+ { 0x0376, 0x0377 },
+ { 0x037B, 0x037D },
+ { 0x0386, 0x0386 },
+ { 0x0388, 0x038A },
+ { 0x038C, 0x038C },
+ { 0x038E, 0x03A1 },
+ { 0x03A3, 0x03F5 },
+ { 0x03F7, 0x0481 },
+ { 0x048A, 0x0523 },
+ { 0x0531, 0x0556 },
+ { 0x0559, 0x0559 },
+ { 0x0561, 0x0587 },
+ { 0x05D0, 0x05EA },
+ { 0x05F0, 0x05F2 },
+ { 0x0621, 0x064A },
+ { 0x066E, 0x066F },
+ { 0x0671, 0x06D3 },
+ { 0x06D5, 0x06D5 },
+ { 0x06E5, 0x06E6 },
+ { 0x06EE, 0x06EF },
+ { 0x06FA, 0x06FC },
+ { 0x06FF, 0x06FF },
+ { 0x0710, 0x0710 },
+ { 0x0712, 0x072F },
+ { 0x074D, 0x07A5 },
+ { 0x07B1, 0x07B1 },
+ { 0x07CA, 0x07EA },
+ { 0x07F4, 0x07F5 },
+ { 0x07FA, 0x07FA },
+ { 0x0904, 0x0939 },
+ { 0x093D, 0x093D },
+ { 0x0950, 0x0950 },
+ { 0x0958, 0x0961 },
+ { 0x0971, 0x0972 },
+ { 0x097B, 0x097F },
+ { 0x0985, 0x098C },
+ { 0x098F, 0x0990 },
+ { 0x0993, 0x09A8 },
+ { 0x09AA, 0x09B0 },
+ { 0x09B2, 0x09B2 },
+ { 0x09B6, 0x09B9 },
+ { 0x09BD, 0x09BD },
+ { 0x09CE, 0x09CE },
+ { 0x09DC, 0x09DD },
+ { 0x09DF, 0x09E1 },
+ { 0x09F0, 0x09F1 },
+ { 0x0A05, 0x0A0A },
+ { 0x0A0F, 0x0A10 },
+ { 0x0A13, 0x0A28 },
+ { 0x0A2A, 0x0A30 },
+ { 0x0A32, 0x0A33 },
+ { 0x0A35, 0x0A36 },
+ { 0x0A38, 0x0A39 },
+ { 0x0A59, 0x0A5C },
+ { 0x0A5E, 0x0A5E },
+ { 0x0A72, 0x0A74 },
+ { 0x0A85, 0x0A8D },
+ { 0x0A8F, 0x0A91 },
+ { 0x0A93, 0x0AA8 },
+ { 0x0AAA, 0x0AB0 },
+ { 0x0AB2, 0x0AB3 },
+ { 0x0AB5, 0x0AB9 },
+ { 0x0ABD, 0x0ABD },
+ { 0x0AD0, 0x0AD0 },
+ { 0x0AE0, 0x0AE1 },
+ { 0x0B05, 0x0B0C },
+ { 0x0B0F, 0x0B10 },
+ { 0x0B13, 0x0B28 },
+ { 0x0B2A, 0x0B30 },
+ { 0x0B32, 0x0B33 },
+ { 0x0B35, 0x0B39 },
+ { 0x0B3D, 0x0B3D },
+ { 0x0B5C, 0x0B5D },
+ { 0x0B5F, 0x0B61 },
+ { 0x0B71, 0x0B71 },
+ { 0x0B83, 0x0B83 },
+ { 0x0B85, 0x0B8A },
+ { 0x0B8E, 0x0B90 },
+ { 0x0B92, 0x0B95 },
+ { 0x0B99, 0x0B9A },
+ { 0x0B9C, 0x0B9C },
+ { 0x0B9E, 0x0B9F },
+ { 0x0BA3, 0x0BA4 },
+ { 0x0BA8, 0x0BAA },
+ { 0x0BAE, 0x0BB9 },
+ { 0x0BD0, 0x0BD0 },
+ { 0x0C05, 0x0C0C },
+ { 0x0C0E, 0x0C10 },
+ { 0x0C12, 0x0C28 },
+ { 0x0C2A, 0x0C33 },
+ { 0x0C35, 0x0C39 },
+ { 0x0C3D, 0x0C3D },
+ { 0x0C58, 0x0C59 },
+ { 0x0C60, 0x0C61 },
+ { 0x0C85, 0x0C8C },
+ { 0x0C8E, 0x0C90 },
+ { 0x0C92, 0x0CA8 },
+ { 0x0CAA, 0x0CB3 },
+ { 0x0CB5, 0x0CB9 },
+ { 0x0CBD, 0x0CBD },
+ { 0x0CDE, 0x0CDE },
+ { 0x0CE0, 0x0CE1 },
+ { 0x0D05, 0x0D0C },
+ { 0x0D0E, 0x0D10 },
+ { 0x0D12, 0x0D28 },
+ { 0x0D2A, 0x0D39 },
+ { 0x0D3D, 0x0D3D },
+ { 0x0D60, 0x0D61 },
+ { 0x0D7A, 0x0D7F },
+ { 0x0D85, 0x0D96 },
+ { 0x0D9A, 0x0DB1 },
+ { 0x0DB3, 0x0DBB },
+ { 0x0DBD, 0x0DBD },
+ { 0x0DC0, 0x0DC6 },
+ { 0x0E01, 0x0E30 },
+ { 0x0E32, 0x0E32 },
+ { 0x0E40, 0x0E46 },
+ { 0x0E81, 0x0E82 },
+ { 0x0E84, 0x0E84 },
+ { 0x0E87, 0x0E88 },
+ { 0x0E8A, 0x0E8A },
+ { 0x0E8D, 0x0E8D },
+ { 0x0E94, 0x0E97 },
+ { 0x0E99, 0x0E9F },
+ { 0x0EA1, 0x0EA3 },
+ { 0x0EA5, 0x0EA5 },
+ { 0x0EA7, 0x0EA7 },
+ { 0x0EAA, 0x0EAB },
+ { 0x0EAD, 0x0EB0 },
+ { 0x0EB2, 0x0EB2 },
+ { 0x0EBD, 0x0EBD },
+ { 0x0EC0, 0x0EC4 },
+ { 0x0EC6, 0x0EC6 },
+ { 0x0EDC, 0x0EDD },
+ { 0x0F00, 0x0F00 },
+ { 0x0F40, 0x0F47 },
+ { 0x0F49, 0x0F6C },
+ { 0x0F88, 0x0F8B },
+ { 0x1000, 0x102A },
+ { 0x103F, 0x103F },
+ { 0x1050, 0x1055 },
+ { 0x105A, 0x105D },
+ { 0x1061, 0x1061 },
+ { 0x1065, 0x1066 },
+ { 0x106E, 0x1070 },
+ { 0x1075, 0x1081 },
+ { 0x108E, 0x108E },
+ { 0x10A0, 0x10C5 },
+ { 0x10D0, 0x10FA },
+ { 0x10FC, 0x10FC },
+ { 0x1100, 0x1159 },
+ { 0x115F, 0x11A2 },
+ { 0x11A8, 0x11F9 },
+ { 0x1200, 0x1248 },
+ { 0x124A, 0x124D },
+ { 0x1250, 0x1256 },
+ { 0x1258, 0x1258 },
+ { 0x125A, 0x125D },
+ { 0x1260, 0x1288 },
+ { 0x128A, 0x128D },
+ { 0x1290, 0x12B0 },
+ { 0x12B2, 0x12B5 },
+ { 0x12B8, 0x12BE },
+ { 0x12C0, 0x12C0 },
+ { 0x12C2, 0x12C5 },
+ { 0x12C8, 0x12D6 },
+ { 0x12D8, 0x1310 },
+ { 0x1312, 0x1315 },
+ { 0x1318, 0x135A },
+ { 0x1380, 0x138F },
+ { 0x13A0, 0x13F4 },
+ { 0x1401, 0x166C },
+ { 0x166F, 0x1676 },
+ { 0x1681, 0x169A },
+ { 0x16A0, 0x16EA },
+ { 0x16EE, 0x16F0 },
+ { 0x1700, 0x170C },
+ { 0x170E, 0x1711 },
+ { 0x1720, 0x1731 },
+ { 0x1740, 0x1751 },
+ { 0x1760, 0x176C },
+ { 0x176E, 0x1770 },
+ { 0x1780, 0x17B3 },
+ { 0x17D7, 0x17D7 },
+ { 0x17DC, 0x17DC },
+ { 0x1820, 0x1877 },
+ { 0x1880, 0x18A8 },
+ { 0x18AA, 0x18AA },
+ { 0x1900, 0x191C },
+ { 0x1950, 0x196D },
+ { 0x1970, 0x1974 },
+ { 0x1980, 0x19A9 },
+ { 0x19C1, 0x19C7 },
+ { 0x1A00, 0x1A16 },
+ { 0x1B05, 0x1B33 },
+ { 0x1B45, 0x1B4B },
+ { 0x1B83, 0x1BA0 },
+ { 0x1BAE, 0x1BAF },
+ { 0x1C00, 0x1C23 },
+ { 0x1C4D, 0x1C4F },
+ { 0x1C5A, 0x1C7D },
+ { 0x1D00, 0x1DBF },
+ { 0x1E00, 0x1F15 },
+ { 0x1F18, 0x1F1D },
+ { 0x1F20, 0x1F45 },
+ { 0x1F48, 0x1F4D },
+ { 0x1F50, 0x1F57 },
+ { 0x1F59, 0x1F59 },
+ { 0x1F5B, 0x1F5B },
+ { 0x1F5D, 0x1F5D },
+ { 0x1F5F, 0x1F7D },
+ { 0x1F80, 0x1FB4 },
+ { 0x1FB6, 0x1FBC },
+ { 0x1FBE, 0x1FBE },
+ { 0x1FC2, 0x1FC4 },
+ { 0x1FC6, 0x1FCC },
+ { 0x1FD0, 0x1FD3 },
+ { 0x1FD6, 0x1FDB },
+ { 0x1FE0, 0x1FEC },
+ { 0x1FF2, 0x1FF4 },
+ { 0x1FF6, 0x1FFC },
+ { 0x2071, 0x2071 },
+ { 0x207F, 0x207F },
+ { 0x2090, 0x2094 },
+ { 0x2102, 0x2102 },
+ { 0x2107, 0x2107 },
+ { 0x210A, 0x2113 },
+ { 0x2115, 0x2115 },
+ { 0x2118, 0x211D },
+ { 0x2124, 0x2124 },
+ { 0x2126, 0x2126 },
+ { 0x2128, 0x2128 },
+ { 0x212A, 0x2139 },
+ { 0x213C, 0x213F },
+ { 0x2145, 0x2149 },
+ { 0x214E, 0x214E },
+ { 0x2160, 0x2188 },
+ { 0x2C00, 0x2C2E },
+ { 0x2C30, 0x2C5E },
+ { 0x2C60, 0x2C6F },
+ { 0x2C71, 0x2C7D },
+ { 0x2C80, 0x2CE4 },
+ { 0x2D00, 0x2D25 },
+ { 0x2D30, 0x2D65 },
+ { 0x2D6F, 0x2D6F },
+ { 0x2D80, 0x2D96 },
+ { 0x2DA0, 0x2DA6 },
+ { 0x2DA8, 0x2DAE },
+ { 0x2DB0, 0x2DB6 },
+ { 0x2DB8, 0x2DBE },
+ { 0x2DC0, 0x2DC6 },
+ { 0x2DC8, 0x2DCE },
+ { 0x2DD0, 0x2DD6 },
+ { 0x2DD8, 0x2DDE },
+ { 0x3005, 0x3007 },
+ { 0x3021, 0x3029 },
+ { 0x3031, 0x3035 },
+ { 0x3038, 0x303C },
+ { 0x3041, 0x3096 },
+ { 0x309D, 0x309F },
+ { 0x30A1, 0x30FA },
+ { 0x30FC, 0x30FF },
+ { 0x3105, 0x312D },
+ { 0x3131, 0x318E },
+ { 0x31A0, 0x31B7 },
+ { 0x31F0, 0x31FF },
+ { 0x3400, 0x4DB5 },
+ { 0x4E00, 0x9FC3 },
+ { 0xA000, 0xA48C },
+ { 0xA500, 0xA60C },
+ { 0xA610, 0xA61F },
+ { 0xA62A, 0xA62B },
+ { 0xA640, 0xA65F },
+ { 0xA662, 0xA66E },
+ { 0xA67F, 0xA697 },
+ { 0xA717, 0xA71F },
+ { 0xA722, 0xA788 },
+ { 0xA78B, 0xA78C },
+ { 0xA7FB, 0xA801 },
+ { 0xA803, 0xA805 },
+ { 0xA807, 0xA80A },
+ { 0xA80C, 0xA822 },
+ { 0xA840, 0xA873 },
+ { 0xA882, 0xA8B3 },
+ { 0xA90A, 0xA925 },
+ { 0xA930, 0xA946 },
+ { 0xAA00, 0xAA28 },
+ { 0xAA40, 0xAA42 },
+ { 0xAA44, 0xAA4B },
+ { 0xAC00, 0xD7A3 },
+ { 0xF900, 0xFA2D },
+ { 0xFA30, 0xFA6A },
+ { 0xFA70, 0xFAD9 },
+ { 0xFB00, 0xFB06 },
+ { 0xFB13, 0xFB17 },
+ { 0xFB1D, 0xFB1D },
+ { 0xFB1F, 0xFB28 },
+ { 0xFB2A, 0xFB36 },
+ { 0xFB38, 0xFB3C },
+ { 0xFB3E, 0xFB3E },
+ { 0xFB40, 0xFB41 },
+ { 0xFB43, 0xFB44 },
+ { 0xFB46, 0xFBB1 },
+ { 0xFBD3, 0xFC5D },
+ { 0xFC64, 0xFD3D },
+ { 0xFD50, 0xFD8F },
+ { 0xFD92, 0xFDC7 },
+ { 0xFDF0, 0xFDF9 },
+ { 0xFE71, 0xFE71 },
+ { 0xFE73, 0xFE73 },
+ { 0xFE77, 0xFE77 },
+ { 0xFE79, 0xFE79 },
+ { 0xFE7B, 0xFE7B },
+ { 0xFE7D, 0xFE7D },
+ { 0xFE7F, 0xFEFC },
+ { 0xFF21, 0xFF3A },
+ { 0xFF41, 0xFF5A },
+ { 0xFF66, 0xFF9D },
+ { 0xFFA0, 0xFFBE },
+ { 0xFFC2, 0xFFC7 },
+ { 0xFFCA, 0xFFCF },
+ { 0xFFD2, 0xFFD7 },
+ { 0xFFDA, 0xFFDC },
+ { 0x10000, 0x1000B },
+ { 0x1000D, 0x10026 },
+ { 0x10028, 0x1003A },
+ { 0x1003C, 0x1003D },
+ { 0x1003F, 0x1004D },
+ { 0x10050, 0x1005D },
+ { 0x10080, 0x100FA },
+ { 0x10140, 0x10174 },
+ { 0x10280, 0x1029C },
+ { 0x102A0, 0x102D0 },
+ { 0x10300, 0x1031E },
+ { 0x10330, 0x1034A },
+ { 0x10380, 0x1039D },
+ { 0x103A0, 0x103C3 },
+ { 0x103C8, 0x103CF },
+ { 0x103D1, 0x103D5 },
+ { 0x10400, 0x1049D },
+ { 0x10800, 0x10805 },
+ { 0x10808, 0x10808 },
+ { 0x1080A, 0x10835 },
+ { 0x10837, 0x10838 },
+ { 0x1083C, 0x1083C },
+ { 0x1083F, 0x1083F },
+ { 0x10900, 0x10915 },
+ { 0x10920, 0x10939 },
+ { 0x10A00, 0x10A00 },
+ { 0x10A10, 0x10A13 },
+ { 0x10A15, 0x10A17 },
+ { 0x10A19, 0x10A33 },
+ { 0x12000, 0x1236E },
+ { 0x12400, 0x12462 },
+ { 0x1D400, 0x1D454 },
+ { 0x1D456, 0x1D49C },
+ { 0x1D49E, 0x1D49F },
+ { 0x1D4A2, 0x1D4A2 },
+ { 0x1D4A5, 0x1D4A6 },
+ { 0x1D4A9, 0x1D4AC },
+ { 0x1D4AE, 0x1D4B9 },
+ { 0x1D4BB, 0x1D4BB },
+ { 0x1D4BD, 0x1D4C3 },
+ { 0x1D4C5, 0x1D505 },
+ { 0x1D507, 0x1D50A },
+ { 0x1D50D, 0x1D514 },
+ { 0x1D516, 0x1D51C },
+ { 0x1D51E, 0x1D539 },
+ { 0x1D53B, 0x1D53E },
+ { 0x1D540, 0x1D544 },
+ { 0x1D546, 0x1D546 },
+ { 0x1D54A, 0x1D550 },
+ { 0x1D552, 0x1D6A5 },
+ { 0x1D6A8, 0x1D6C0 },
+ { 0x1D6C2, 0x1D6DA },
+ { 0x1D6DC, 0x1D6FA },
+ { 0x1D6FC, 0x1D714 },
+ { 0x1D716, 0x1D734 },
+ { 0x1D736, 0x1D74E },
+ { 0x1D750, 0x1D76E },
+ { 0x1D770, 0x1D788 },
+ { 0x1D78A, 0x1D7A8 },
+ { 0x1D7AA, 0x1D7C2 },
+ { 0x1D7C4, 0x1D7CB },
+ { 0x20000, 0x2A6D6 },
+ { 0x2F800, 0x2FA1D }
+
+#define PREDICATE(c) uc_is_property_xid_start (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-pr_zero_width.c b/gnulib/tests/unictype/test-pr_zero_width.c
new file mode 100644
index 00000000..faefd5e4
--- /dev/null
+++ b/gnulib/tests/unictype/test-pr_zero_width.c
@@ -0,0 +1,36 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x00AD, 0x00AD },
+ { 0x0600, 0x0603 },
+ { 0x06DD, 0x06DD },
+ { 0x070F, 0x070F },
+ { 0x17B4, 0x17B5 },
+ { 0x200B, 0x200F },
+ { 0x202A, 0x202E },
+ { 0x2060, 0x2064 },
+ { 0x206A, 0x206F },
+ { 0xFEFF, 0xFEFF },
+ { 0xFFF9, 0xFFFB },
+ { 0x1D173, 0x1D17A },
+ { 0xE0001, 0xE0001 },
+ { 0xE0020, 0xE007F }
+
+#define PREDICATE(c) uc_is_property_zero_width (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-predicate-part1.h b/gnulib/tests/unictype/test-predicate-part1.h
new file mode 100644
index 00000000..1031856d
--- /dev/null
+++ b/gnulib/tests/unictype/test-predicate-part1.h
@@ -0,0 +1,31 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+/* Interval of Unicode characters. */
+typedef struct { ucs4_t start; ucs4_t end; } interval_t;
+
+/* Set of Unicode characters, described as list of intervals, in increasing
+ order. */
+static const interval_t set[] =
+ {
diff --git a/gnulib/tests/unictype/test-predicate-part2.h b/gnulib/tests/unictype/test-predicate-part2.h
new file mode 100644
index 00000000..eeeb934b
--- /dev/null
+++ b/gnulib/tests/unictype/test-predicate-part2.h
@@ -0,0 +1,37 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+ };
+
+int
+main ()
+{
+ unsigned int c;
+ size_t i;
+
+ c = 0;
+ for (i = 0; i < SIZEOF (set); i++)
+ {
+ for (; c < set[i].start; c++)
+ ASSERT (!PREDICATE (c));
+ for (; c <= set[i].end; c++)
+ ASSERT (PREDICATE (c));
+ }
+ for (; c < 0x110000; c++)
+ ASSERT (!PREDICATE (c));
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-scripts.c b/gnulib/tests/unictype/test-scripts.c
new file mode 100644
index 00000000..610b4733
--- /dev/null
+++ b/gnulib/tests/unictype/test-scripts.c
@@ -0,0 +1,74 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test the uc_script function. */
+ ASSERT (strcmp (uc_script ('A')->name, "Latin") == 0);
+ ASSERT (strcmp (uc_script ('%')->name, "Common") == 0);
+ ASSERT (uc_script (0xE0000) == NULL);
+
+ /* Test the uc_script_byname function. */
+ ASSERT (strcmp (uc_script_byname ("Armenian")->name, "Armenian") == 0);
+ ASSERT (uc_script_byname ("Pekinese") == NULL);
+
+ /* Test the uc_is_script function. */
+ ASSERT (uc_is_script ('A', uc_script_byname ("Latin")));
+ ASSERT (!uc_is_script ('A', uc_script_byname ("Common")));
+ ASSERT (!uc_is_script (0x05DA, uc_script_byname ("Latin")));
+ ASSERT (uc_is_script (0x05DA, uc_script_byname ("Hebrew")));
+
+ {
+ unsigned int c;
+
+ for (c = 0; c < 0x110000; c++)
+ {
+ const uc_script_t *script = uc_script (c);
+ if (script != NULL)
+ ASSERT (uc_is_script (c, script));
+ }
+ }
+
+ /* Test the uc_all_scripts function. */
+ {
+ const uc_script_t *scripts;
+ size_t nscripts;
+ size_t i;
+ bool found;
+
+ uc_all_scripts (&scripts, &nscripts);
+
+ found = false;
+ for (i = 0; i < nscripts; i++)
+ {
+ ASSERT (scripts[i].name != NULL);
+ if (strcmp (scripts[i].name, "Hebrew") == 0)
+ found = true;
+ }
+ ASSERT (found);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-sy_c_ident.c b/gnulib/tests/unictype/test-sy_c_ident.c
new file mode 100644
index 00000000..026db181
--- /dev/null
+++ b/gnulib/tests/unictype/test-sy_c_ident.c
@@ -0,0 +1,38 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (uc_c_ident_category ('0') == UC_IDENTIFIER_VALID);
+ ASSERT (uc_c_ident_category ('X') == UC_IDENTIFIER_START);
+ ASSERT (uc_c_ident_category ('+') == UC_IDENTIFIER_INVALID);
+ ASSERT (uc_c_ident_category (0x00B2) == UC_IDENTIFIER_INVALID);
+ ASSERT (uc_c_ident_category (0x05DA) == UC_IDENTIFIER_START);
+
+ ASSERT (uc_c_ident_category (0x001B) == UC_IDENTIFIER_INVALID);
+ ASSERT (uc_c_ident_category (0xE0001) == UC_IDENTIFIER_INVALID);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-sy_c_whitespace.c b/gnulib/tests/unictype/test-sy_c_whitespace.c
new file mode 100644
index 00000000..45b9bc0e
--- /dev/null
+++ b/gnulib/tests/unictype/test-sy_c_whitespace.c
@@ -0,0 +1,24 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0009, 0x000D },
+ { 0x0020, 0x0020 }
+
+#define PREDICATE(c) uc_is_c_whitespace (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unictype/test-sy_java_ident.c b/gnulib/tests/unictype/test-sy_java_ident.c
new file mode 100644
index 00000000..ed9ddeb9
--- /dev/null
+++ b/gnulib/tests/unictype/test-sy_java_ident.c
@@ -0,0 +1,38 @@
+/* Test the Unicode character type functions.
+ Copyright (C) 2007-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/>. */
+
+#include <config.h>
+
+#include "unictype.h"
+
+#include <string.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (uc_java_ident_category ('0') == UC_IDENTIFIER_VALID);
+ ASSERT (uc_java_ident_category ('X') == UC_IDENTIFIER_START);
+ ASSERT (uc_java_ident_category ('+') == UC_IDENTIFIER_INVALID);
+ ASSERT (uc_java_ident_category (0x00B2) == UC_IDENTIFIER_INVALID);
+ ASSERT (uc_java_ident_category (0x05DA) == UC_IDENTIFIER_START);
+
+ ASSERT (uc_java_ident_category (0x001B) == UC_IDENTIFIER_IGNORABLE);
+ ASSERT (uc_java_ident_category (0xE0001) == UC_IDENTIFIER_IGNORABLE);
+
+ return 0;
+}
diff --git a/gnulib/tests/unictype/test-sy_java_whitespace.c b/gnulib/tests/unictype/test-sy_java_whitespace.c
new file mode 100644
index 00000000..9e2943bf
--- /dev/null
+++ b/gnulib/tests/unictype/test-sy_java_whitespace.c
@@ -0,0 +1,25 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Test the Unicode character type functions.
+ Copyright (C) 2007 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/>. */
+
+#include "test-predicate-part1.h"
+
+ { 0x0009, 0x000A },
+ { 0x000C, 0x000D },
+ { 0x0020, 0x0020 }
+
+#define PREDICATE(c) uc_is_java_whitespace (c)
+#include "test-predicate-part2.h"
diff --git a/gnulib/tests/unilbrk/test-u16-possible-linebreaks.c b/gnulib/tests/unilbrk/test-u16-possible-linebreaks.c
new file mode 100644
index 00000000..cdfa75cf
--- /dev/null
+++ b/gnulib/tests/unilbrk/test-u16-possible-linebreaks.c
@@ -0,0 +1,84 @@
+/* Test of line breaking of UTF-16 strings.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u16_possible_linebreaks (NULL, 0, "GB18030", NULL);
+
+ {
+ static const uint16_t input[61] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u16_possible_linebreaks (input, SIZEOF (input), "GB18030", p);
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == (i == 60 ? UC_BREAK_MANDATORY :
+ i == 5
+ || i == 11 || i == 25
+ || i == 27 || i == 29 || i == 30 || i == 35
+ || i == 45 || i == 51
+ || i == 52 || i == 53 || i == 55 || i == 56
+ || i == 58 || i == 59 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u16_possible_linebreaks (input, SIZEOF (input), "GB2312", p);
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == (i == 60 ? UC_BREAK_MANDATORY :
+ i == 5
+ || i == 11 || i == 25
+ || i == 27 || i == 29 || i == 30 || i == 35
+ || i == 37 || i == 45 || i == 51
+ || i == 52 || i == 53 || i == 55 || i == 56
+ || i == 58 || i == 59 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unilbrk/test-u16-width-linebreaks.c b/gnulib/tests/unilbrk/test-u16-width-linebreaks.c
new file mode 100644
index 00000000..2523afb6
--- /dev/null
+++ b/gnulib/tests/unilbrk/test-u16-width-linebreaks.c
@@ -0,0 +1,74 @@
+/* Test of line breaking of UTF-16 strings.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u16_width_linebreaks (NULL, 0, 80, 0, 0, NULL, "GB18030", NULL);
+
+ {
+ static const uint16_t input[61] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u16_width_linebreaks (input, SIZEOF (input), 25, 0, 0, NULL, "GB18030", p);
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == (i == 60 ? UC_BREAK_MANDATORY :
+ i == 25 || i == 45 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u16_width_linebreaks (input, SIZEOF (input), 25, 0, 0, NULL, "GB2312", p);
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == (i == 60 ? UC_BREAK_MANDATORY :
+ i == 11 || i == 25 || i == 45 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unilbrk/test-u32-possible-linebreaks.c b/gnulib/tests/unilbrk/test-u32-possible-linebreaks.c
new file mode 100644
index 00000000..d775ebcd
--- /dev/null
+++ b/gnulib/tests/unilbrk/test-u32-possible-linebreaks.c
@@ -0,0 +1,84 @@
+/* Test of line breaking of UTF-32 strings.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u32_possible_linebreaks (NULL, 0, "GB18030", NULL);
+
+ {
+ static const uint32_t input[61] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u32_possible_linebreaks (input, SIZEOF (input), "GB18030", p);
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == (i == 60 ? UC_BREAK_MANDATORY :
+ i == 5
+ || i == 11 || i == 25
+ || i == 27 || i == 29 || i == 30 || i == 35
+ || i == 45 || i == 51
+ || i == 52 || i == 53 || i == 55 || i == 56
+ || i == 58 || i == 59 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u32_possible_linebreaks (input, SIZEOF (input), "GB2312", p);
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == (i == 60 ? UC_BREAK_MANDATORY :
+ i == 5
+ || i == 11 || i == 25
+ || i == 27 || i == 29 || i == 30 || i == 35
+ || i == 37 || i == 45 || i == 51
+ || i == 52 || i == 53 || i == 55 || i == 56
+ || i == 58 || i == 59 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unilbrk/test-u32-width-linebreaks.c b/gnulib/tests/unilbrk/test-u32-width-linebreaks.c
new file mode 100644
index 00000000..050c2197
--- /dev/null
+++ b/gnulib/tests/unilbrk/test-u32-width-linebreaks.c
@@ -0,0 +1,74 @@
+/* Test of line breaking of UTF-32 strings.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u32_width_linebreaks (NULL, 0, 80, 0, 0, NULL, "GB18030", NULL);
+
+ {
+ static const uint32_t input[61] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u32_width_linebreaks (input, SIZEOF (input), 25, 0, 0, NULL, "GB18030", p);
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == (i == 60 ? UC_BREAK_MANDATORY :
+ i == 25 || i == 45 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u32_width_linebreaks (input, SIZEOF (input), 25, 0, 0, NULL, "GB2312", p);
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == (i == 60 ? UC_BREAK_MANDATORY :
+ i == 11 || i == 25 || i == 45 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unilbrk/test-u8-possible-linebreaks.c b/gnulib/tests/unilbrk/test-u8-possible-linebreaks.c
new file mode 100644
index 00000000..555acf62
--- /dev/null
+++ b/gnulib/tests/unilbrk/test-u8-possible-linebreaks.c
@@ -0,0 +1,78 @@
+/* Test of line breaking of UTF-8 strings.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u8_possible_linebreaks (NULL, 0, "GB18030", NULL);
+
+ {
+ static const uint8_t input[91] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ "Gr\303\274\303\237 Gott. \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265! x=(-b\302\261sqrt(b\302\262-4ac))/(2a) \346\227\245\346\234\254\350\252\236,\344\270\255\346\226\207,\355\225\234\352\270\200\n";
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u8_possible_linebreaks (input, SIZEOF (input), "GB18030", p);
+ for (i = 0; i < 91; i++)
+ {
+ ASSERT (p[i] == (i == 90 ? UC_BREAK_MANDATORY :
+ i == 7
+ || i == 13 || i == 39
+ || i == 41 || i == 43 || i == 44 || i == 50
+ || i == 61 || i == 67
+ || i == 70 || i == 73 || i == 77 || i == 80
+ || i == 84 || i == 87 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u8_possible_linebreaks (input, SIZEOF (input), "GB2312", p);
+ for (i = 0; i < 91; i++)
+ {
+ ASSERT (p[i] == (i == 90 ? UC_BREAK_MANDATORY :
+ i == 7
+ || i == 13 || i == 39
+ || i == 41 || i == 43 || i == 44 || i == 50
+ || i == 52 || i == 61 || i == 67
+ || i == 70 || i == 73 || i == 77 || i == 80
+ || i == 84 || i == 87 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unilbrk/test-u8-width-linebreaks.c b/gnulib/tests/unilbrk/test-u8-width-linebreaks.c
new file mode 100644
index 00000000..e78b075c
--- /dev/null
+++ b/gnulib/tests/unilbrk/test-u8-width-linebreaks.c
@@ -0,0 +1,68 @@
+/* Test of line breaking of UTF-8 strings.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u8_width_linebreaks (NULL, 0, 80, 0, 0, NULL, "GB18030", NULL);
+
+ {
+ static const uint8_t input[91] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ "Gr\303\274\303\237 Gott. \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265! x=(-b\302\261sqrt(b\302\262-4ac))/(2a) \346\227\245\346\234\254\350\252\236,\344\270\255\346\226\207,\355\225\234\352\270\200\n";
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u8_width_linebreaks (input, SIZEOF (input), 25, 0, 0, NULL, "GB18030", p);
+ for (i = 0; i < 91; i++)
+ {
+ ASSERT (p[i] == (i == 90 ? UC_BREAK_MANDATORY :
+ i == 39 || i == 61 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+
+ {
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u8_width_linebreaks (input, SIZEOF (input), 25, 0, 0, NULL, "GB2312", p);
+ for (i = 0; i < 91; i++)
+ {
+ ASSERT (p[i] == (i == 90 ? UC_BREAK_MANDATORY :
+ i == 13 || i == 39 || i == 61 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unilbrk/test-ulc-possible-linebreaks.c b/gnulib/tests/unilbrk/test-ulc-possible-linebreaks.c
new file mode 100644
index 00000000..c64fade9
--- /dev/null
+++ b/gnulib/tests/unilbrk/test-ulc-possible-linebreaks.c
@@ -0,0 +1,54 @@
+/* Test of line breaking of strings.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ ulc_possible_linebreaks (NULL, 0, "GB18030", NULL);
+
+#if HAVE_ICONV
+ {
+ static const char input[36] =
+ /* "Grüß Gott. x=(-b±sqrt(b²-4ac))/(2a)" */
+ "Gr\374\337 Gott. x=(-b\261sqrt(b\262-4ac))/(2a)\n";
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ ulc_possible_linebreaks (input, SIZEOF (input), "ISO-8859-1", p);
+ for (i = 0; i < 36; i++)
+ {
+ ASSERT (p[i] == (i == 35 ? UC_BREAK_MANDATORY :
+ i == 5 || i == 11 || i == 13 || i == 15 || i == 16
+ || i == 21 || i == 31 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/unilbrk/test-ulc-width-linebreaks.c b/gnulib/tests/unilbrk/test-ulc-width-linebreaks.c
new file mode 100644
index 00000000..875554a8
--- /dev/null
+++ b/gnulib/tests/unilbrk/test-ulc-width-linebreaks.c
@@ -0,0 +1,53 @@
+/* Test of line breaking of strings.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ ulc_width_linebreaks (NULL, 0, 80, 0, 0, NULL, "GB18030", NULL);
+
+#if HAVE_ICONV
+ {
+ static const char input[36] =
+ /* "Grüß Gott. x=(-b±sqrt(b²-4ac))/(2a)" */
+ "Gr\374\337 Gott. x=(-b\261sqrt(b\262-4ac))/(2a)\n";
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ ulc_width_linebreaks (input, SIZEOF (input), 12, 0, 0, NULL, "ISO-8859-1", p);
+ for (i = 0; i < 36; i++)
+ {
+ ASSERT (p[i] == (i == 35 ? UC_BREAK_MANDATORY :
+ i == 11 || i == 21 || i == 31 ? UC_BREAK_POSSIBLE :
+ UC_BREAK_PROHIBITED));
+ }
+ free (p);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniname/UnicodeDataNames.txt b/gnulib/tests/uniname/UnicodeDataNames.txt
new file mode 100644
index 00000000..5a4cf1a4
--- /dev/null
+++ b/gnulib/tests/uniname/UnicodeDataNames.txt
@@ -0,0 +1,30423 @@
+0020;SPACE;Zs;0;WS;;;;;N;;;;;
+0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;;
+0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;;
+0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;;
+0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+0026;AMPERSAND;Po;0;ON;;;;;N;;;;;
+0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
+0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
+0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
+002A;ASTERISK;Po;0;ON;;;;;N;;;;;
+002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;;
+002C;COMMA;Po;0;CS;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
+002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
+002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;;
+0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
+0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
+0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
+0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
+0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
+0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
+0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
+0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
+0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
+0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
+003A;COLON;Po;0;CS;;;;;N;;;;;
+003B;SEMICOLON;Po;0;ON;;;;;N;;;;;
+003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003F;QUESTION MARK;Po;0;ON;;;;;N;;;;;
+0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;;
+0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
+0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062;
+0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063;
+0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064;
+0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065;
+0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066;
+0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067;
+0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068;
+0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069;
+004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A;
+004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B;
+004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C;
+004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D;
+004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E;
+004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F;
+0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070;
+0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071;
+0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072;
+0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073;
+0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074;
+0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075;
+0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076;
+0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077;
+0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078;
+0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079;
+005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A;
+005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;;
+005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;;
+005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;;
+005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;;
+005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;;
+0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;;
+0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
+0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042
+0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043
+0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044
+0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045
+0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046
+0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047
+0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048
+0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
+006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A
+006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B
+006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C
+006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D
+006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E
+006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F
+0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050
+0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
+0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052
+0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053
+0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054
+0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055
+0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056
+0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057
+0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058
+0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059
+007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
+007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;;
+007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;;
+007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;;
+007E;TILDE;Sm;0;ON;;;;;N;;;;;
+00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;;
+00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;;
+00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;;
+00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;;
+00A7;SECTION SIGN;So;0;ON;;;;;N;;;;;
+00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;;
+00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;;
+00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;;
+00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;;
+00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;;
+00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
+00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
+00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
+00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
+00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
+00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;;
+00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C
+00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;;
+00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;;
+00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
+00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;;
+00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;;
+00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
+00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;;
+00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;;
+00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0;
+00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1;
+00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2;
+00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3;
+00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4;
+00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5;
+00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6;
+00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7;
+00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8;
+00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9;
+00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA;
+00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB;
+00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC;
+00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED;
+00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE;
+00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF;
+00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0;
+00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1;
+00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2;
+00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3;
+00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4;
+00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5;
+00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6;
+00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;;
+00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8;
+00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9;
+00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA;
+00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB;
+00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC;
+00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD;
+00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE;
+00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;;
+00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0
+00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1
+00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2
+00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3
+00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4
+00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5
+00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6
+00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7
+00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8
+00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9
+00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA
+00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB
+00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC
+00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD
+00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE
+00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF
+00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0
+00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1
+00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2
+00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3
+00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4
+00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5
+00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6
+00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8
+00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9
+00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA
+00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB
+00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC
+00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD
+00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE
+00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178
+0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101;
+0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100
+0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103;
+0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102
+0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105;
+0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104
+0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107;
+0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106
+0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109;
+0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108
+010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B;
+010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A
+010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D;
+010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C
+010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F;
+010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E
+0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111;
+0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110
+0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113;
+0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112
+0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115;
+0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114
+0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117;
+0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116
+0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119;
+0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118
+011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B;
+011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A
+011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D;
+011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C
+011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F;
+011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E
+0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121;
+0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120
+0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123;
+0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122
+0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125;
+0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124
+0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127;
+0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126
+0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129;
+0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128
+012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
+012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
+012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D;
+012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C
+012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F;
+012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E
+0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069;
+0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
+0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133;
+0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
+0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135;
+0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134
+0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137;
+0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136
+0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;;
+0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
+013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139
+013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C;
+013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B
+013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E;
+013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D
+013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
+0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F
+0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
+0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141
+0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144;
+0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143
+0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146;
+0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145
+0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148;
+0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
+0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;;
+014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B;
+014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A
+014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D;
+014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C
+014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F;
+014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E
+0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151;
+0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150
+0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153;
+0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152
+0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155;
+0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154
+0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157;
+0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156
+0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159;
+0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158
+015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B;
+015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A
+015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D;
+015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C
+015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F;
+015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E
+0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161;
+0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160
+0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163;
+0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162
+0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165;
+0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164
+0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167;
+0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166
+0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169;
+0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168
+016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B;
+016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A
+016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D;
+016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C
+016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F;
+016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E
+0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171;
+0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170
+0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173;
+0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172
+0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175;
+0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174
+0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177;
+0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176
+0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF;
+0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A;
+017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179
+017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C;
+017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B
+017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
+017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
+017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053
+0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243
+0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
+0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
+0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
+0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185;
+0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184
+0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254;
+0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188;
+0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187
+0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256;
+018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257;
+018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C;
+018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B
+018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;;
+018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD;
+018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259;
+0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B;
+0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192;
+0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191
+0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260;
+0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263;
+0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6
+0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269;
+0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
+0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
+0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
+019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D
+019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
+019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
+019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
+019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220
+019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275;
+01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1;
+01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0
+01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3;
+01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2
+01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
+01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
+01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280;
+01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
+01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
+01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
+01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;;
+01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;;
+01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD;
+01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC
+01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288;
+01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0;
+01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF
+01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A;
+01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B;
+01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4;
+01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3
+01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6;
+01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5
+01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292;
+01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9;
+01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8
+01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;;
+01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;;
+01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD;
+01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC
+01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;;
+01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7
+01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;;
+01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;;
+01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
+01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
+01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
+01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5
+01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
+01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
+01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8
+01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
+01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
+01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB
+01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
+01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
+01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
+01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0;
+01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF
+01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2;
+01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1
+01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4;
+01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3
+01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6;
+01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5
+01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8;
+01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7
+01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA;
+01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9
+01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC;
+01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB
+01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E
+01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF;
+01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE
+01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1;
+01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0
+01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3;
+01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2
+01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5;
+01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4
+01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7;
+01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6
+01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9;
+01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8
+01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB;
+01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA
+01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED;
+01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC
+01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF;
+01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
+01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
+01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2
+01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2
+01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2
+01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
+01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
+01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195;
+01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF;
+01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9;
+01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8
+01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB;
+01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA
+01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD;
+01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC
+01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF;
+01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE
+0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201;
+0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200
+0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203;
+0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202
+0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205;
+0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204
+0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207;
+0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206
+0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209;
+0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208
+020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B;
+020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A
+020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D;
+020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C
+020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F;
+020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E
+0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211;
+0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210
+0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213;
+0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212
+0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215;
+0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214
+0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217;
+0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216
+0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219;
+0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218
+021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B;
+021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A
+021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D;
+021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C
+021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
+021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
+0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E;
+0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;;
+0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
+0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
+0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
+0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224
+0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227;
+0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226
+0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229;
+0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228
+022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B;
+022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A
+022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D;
+022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C
+022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F;
+022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E
+0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231;
+0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
+0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
+0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
+0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
+0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
+0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
+0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;;
+0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;;
+0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;;
+023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65;
+023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C;
+023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B
+023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A;
+023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66;
+023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242;
+0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241
+0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180;
+0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289;
+0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C;
+0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247;
+0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246
+0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249;
+0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248
+024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B;
+024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A
+024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D;
+024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C
+024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F;
+024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E
+0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F
+0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D
+0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;;
+0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
+0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
+0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;;
+0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189
+0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A
+0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;;
+0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F
+025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;;
+025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190
+025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;;
+025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;;
+025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;;
+025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;;
+0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193
+0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;;
+0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;;
+0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194
+0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;;
+0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;;
+0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;;
+0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;;
+0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
+0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
+026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;;
+026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62
+026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;;
+026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
+026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
+026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
+0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E
+0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
+0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
+0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
+0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F
+0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;;
+0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;;
+0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;;
+0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;;
+027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
+027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64
+027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
+027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
+0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6
+0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
+0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
+0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
+0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
+0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
+0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
+0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;;
+0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
+0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244
+028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
+028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
+028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245
+028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
+028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
+028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
+0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;;
+0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
+0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
+0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
+0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
+0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
+0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;;
+0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;;
+029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;;
+029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;;
+029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;;
+029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;;
+029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;;
+029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;;
+02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;;
+02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;;
+02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;;
+02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;;
+02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;;
+02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;;
+02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;;
+02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;;
+02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;;
+02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
+02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
+02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
+02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;;
+02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;;
+02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;;
+02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;;
+02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;;
+02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;;
+02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;;
+02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;;
+02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
+02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
+02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;;
+02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;Mandarin Chinese first tone;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
+02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
+02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;;
+02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;;
+02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;;
+02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;;
+02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;;
+02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;;
+02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;;
+02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;;
+02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;;
+02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;;
+02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;;
+02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;;
+02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;;
+02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;;
+02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;;
+02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;;
+02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;;
+02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
+02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;;
+02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;;
+02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;;
+02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;;
+02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;;
+02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;;
+0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;;
+0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia, Tonos;;;
+0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
+0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;;
+0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;;
+0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;;
+0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;;
+0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
+0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;;
+0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;;
+030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;;
+030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;;
+030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;;
+030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;;
+030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;;
+030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;;
+0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;;
+0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;;
+0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;;
+0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;;
+0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;;
+0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;;
+0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;;
+0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;;
+0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;;
+0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;;
+031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;;
+031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;;
+031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;;
+031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;;
+031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;;
+031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;;
+0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;;
+0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;;
+0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;;
+0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;
+0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;;
+0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;;
+0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;;
+0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;;
+0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;;
+0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;;
+032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;;
+032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;;
+032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;;
+032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
+032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;;
+032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;;
+0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;;
+0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;;
+0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;;
+0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;;
+0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;;
+0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;;
+0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;;
+0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;;
+0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;;
+0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;;
+033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;;
+033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;;
+033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;;
+033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;;
+033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;;
+033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;;
+0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;;
+0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;;
+0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;;
+0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;;
+0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;;
+0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399
+0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
+0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;;
+034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;;
+034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;;
+034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;;
+034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;;
+0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;;
+0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;;
+0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
+0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;;
+035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;;
+035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
+035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
+035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
+035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;;
+0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
+0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
+0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
+0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;;
+0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;;
+0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;;
+0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;;
+0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;;
+0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;;
+0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;;
+036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;;
+036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;;
+036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;;
+036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;;
+036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;;
+036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;;
+0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371;
+0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370
+0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373;
+0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372
+0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
+0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;;
+0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377;
+0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376
+037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
+037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD
+037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE
+037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF
+037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;;
+0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;;
+0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
+0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC;
+0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;;
+0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD;
+0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE;
+038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF;
+038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC;
+038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD;
+038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE;
+0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;;
+0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1;
+0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2;
+0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3;
+0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4;
+0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5;
+0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6;
+0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7;
+0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;
+0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9;
+039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA;
+039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB;
+039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC;
+039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD;
+039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE;
+039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF;
+03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0;
+03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
+03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
+03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4;
+03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5;
+03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6;
+03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7;
+03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8;
+03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9;
+03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA;
+03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB;
+03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386
+03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388
+03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389
+03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A
+03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;;
+03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391
+03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
+03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393
+03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394
+03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395
+03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396
+03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397
+03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399
+03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A
+03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B
+03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C
+03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D
+03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E
+03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F
+03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0
+03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
+03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4
+03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5
+03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6
+03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7
+03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8
+03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9
+03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA
+03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB
+03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
+03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
+03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
+03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7;
+03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
+03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
+03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;;
+03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
+03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
+03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
+03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF
+03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9;
+03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8
+03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
+03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA
+03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD;
+03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC
+03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF;
+03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE
+03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1;
+03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0
+03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3;
+03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2
+03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5;
+03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4
+03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7;
+03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6
+03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9;
+03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8
+03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB;
+03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA
+03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED;
+03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC
+03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF;
+03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
+03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
+03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
+03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9
+03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;;
+03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;
+03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395
+03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;;
+03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8;
+03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7
+03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2;
+03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
+03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
+03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;;
+03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B;
+03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C;
+03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D;
+0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
+0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
+0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452;
+0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453;
+0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454;
+0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455;
+0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456;
+0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457;
+0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458;
+0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459;
+040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A;
+040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B;
+040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C;
+040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D;
+040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E;
+040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F;
+0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430;
+0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431;
+0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432;
+0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433;
+0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434;
+0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435;
+0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436;
+0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437;
+0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438;
+0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439;
+041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A;
+041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B;
+041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C;
+041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D;
+041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E;
+041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F;
+0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440;
+0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441;
+0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442;
+0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443;
+0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444;
+0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445;
+0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446;
+0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447;
+0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448;
+0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449;
+042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A;
+042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B;
+042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C;
+042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D;
+042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E;
+042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F;
+0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410
+0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411
+0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412
+0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413
+0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414
+0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415
+0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416
+0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417
+0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418
+0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419
+043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A
+043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B
+043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C
+043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D
+043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E
+043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F
+0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420
+0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421
+0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422
+0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423
+0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424
+0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425
+0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426
+0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427
+0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428
+0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429
+044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
+044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B
+044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C
+044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D
+044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E
+044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F
+0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400
+0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401
+0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402
+0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403
+0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404
+0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
+0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406
+0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407
+0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408
+0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409
+045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A
+045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B
+045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C
+045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D
+045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E
+045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F
+0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461;
+0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460
+0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463;
+0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462
+0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465;
+0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464
+0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467;
+0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466
+0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469;
+0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468
+046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B;
+046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A
+046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D;
+046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C
+046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F;
+046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E
+0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471;
+0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470
+0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473;
+0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472
+0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475;
+0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474
+0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477;
+0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476
+0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479;
+0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478
+047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B;
+047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A
+047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D;
+047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C
+047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F;
+047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E
+0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481;
+0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480
+0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;;
+0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;;
+0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
+0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
+0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
+0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;;
+0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
+0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B;
+048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A
+048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D;
+048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C
+048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F;
+048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E
+0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491;
+0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490
+0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493;
+0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492
+0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495;
+0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494
+0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497;
+0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496
+0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499;
+0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498
+049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B;
+049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A
+049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D;
+049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C
+049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F;
+049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E
+04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1;
+04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0
+04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3;
+04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2
+04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5;
+04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4
+04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7;
+04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6
+04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9;
+04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8
+04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB;
+04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA
+04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD;
+04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC
+04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF;
+04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE
+04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1;
+04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0
+04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3;
+04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2
+04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5;
+04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4
+04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7;
+04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6
+04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9;
+04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8
+04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB;
+04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA
+04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD;
+04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
+04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
+04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
+04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF;
+04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
+04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
+04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
+04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3
+04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6;
+04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5
+04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8;
+04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7
+04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA;
+04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9
+04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC;
+04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
+04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE;
+04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD
+04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0
+04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
+04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
+04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
+04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2
+04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5;
+04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4
+04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7;
+04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6
+04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9;
+04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8
+04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB;
+04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA
+04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD;
+04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC
+04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF;
+04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE
+04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1;
+04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0
+04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3;
+04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2
+04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5;
+04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4
+04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7;
+04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6
+04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9;
+04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8
+04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB;
+04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA
+04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED;
+04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC
+04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF;
+04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE
+04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1;
+04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0
+04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3;
+04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
+04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
+04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
+04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7;
+04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6
+04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
+04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
+04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB;
+04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA
+04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD;
+04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC
+04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF;
+04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE
+0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501;
+0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500
+0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503;
+0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502
+0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505;
+0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504
+0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507;
+0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506
+0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509;
+0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508
+050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B;
+050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A
+050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D;
+050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C
+050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F;
+050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E
+0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511;
+0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510
+0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513;
+0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512
+0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515;
+0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514
+0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517;
+0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516
+0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519;
+0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518
+051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B;
+051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A
+051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D;
+051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C
+051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F;
+051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E
+0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521;
+0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520
+0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523;
+0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522
+0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
+0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
+0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
+0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564;
+0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565;
+0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566;
+0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567;
+0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568;
+0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569;
+053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A;
+053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B;
+053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C;
+053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D;
+053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E;
+053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F;
+0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570;
+0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571;
+0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572;
+0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573;
+0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574;
+0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575;
+0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576;
+0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577;
+0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578;
+0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579;
+054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A;
+054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B;
+054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C;
+054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D;
+054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E;
+054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F;
+0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580;
+0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581;
+0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582;
+0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583;
+0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584;
+0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585;
+0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586;
+0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;;
+055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;;
+055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;;
+055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
+055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
+055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
+0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
+0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
+0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534
+0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535
+0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536
+0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537
+0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538
+0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539
+056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A
+056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B
+056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C
+056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D
+056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E
+056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F
+0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540
+0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541
+0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542
+0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543
+0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544
+0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545
+0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546
+0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547
+0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548
+0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549
+057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A
+057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B
+057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C
+057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D
+057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E
+057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F
+0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550
+0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551
+0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552
+0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553
+0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554
+0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
+0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
+0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
+058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
+0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;;
+0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;;
+0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;;
+0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;;
+0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;;
+0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;;
+0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;;
+0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;;
+0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;;
+059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;;
+059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;;
+059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;;
+059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;;
+059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;;
+059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
+05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
+05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
+05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;;
+05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
+05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
+05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;;
+05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;;
+05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;;
+05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;;
+05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;;
+05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;;
+05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;;
+05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;;
+05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;;
+05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;;
+05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;;
+05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;;
+05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;;
+05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;;
+05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;;
+05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;;
+05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;;
+05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;;
+05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
+05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
+05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
+05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;;
+05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
+05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;;
+05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;;
+05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;;
+05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
+05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;;
+05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
+05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
+05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;;
+05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
+05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;;
+05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;;
+05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;;
+05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
+05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
+05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;;
+05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;;
+05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;;
+05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;;
+05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;;
+05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;;
+05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;;
+05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;;
+05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;;
+05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
+05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;;
+05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;;
+05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;;
+05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;;
+05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;;
+05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;;
+05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;;
+05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;;
+05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
+05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
+05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
+05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
+05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
+05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
+05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
+0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;;
+0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;;
+0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;;
+0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;;
+0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;;
+0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;;
+0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;;
+0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;;
+060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
+060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
+060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;;
+0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
+0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
+0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
+0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;;
+0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;;
+0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;;
+0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;;
+0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;;
+061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;;
+061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;;
+061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
+0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
+0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
+0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;;
+0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;;
+0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;;
+0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;;
+0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;;
+0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;;
+0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;;
+062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;;
+062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;;
+062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
+062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;;
+062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;;
+062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;;
+0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;;
+0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;;
+0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;;
+0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;;
+0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;;
+0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;;
+0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;;
+0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
+0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
+063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
+063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
+0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
+0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
+0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;;
+0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;;
+0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;;
+0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;;
+0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;;
+0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;;
+064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;;
+064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;;
+064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;;
+064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;;
+064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;;
+064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;;
+0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;;
+0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;;
+0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;;
+0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
+0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
+0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
+0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
+0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;;
+065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;;
+065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;;
+0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
+066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;;
+066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;;
+066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;;
+066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;;
+066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;;
+0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;;
+0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;;
+0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;;
+0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;;
+0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;;
+0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;;
+0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;;
+0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;;
+0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;;
+0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;;
+067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;;
+067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;;
+067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;;
+067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;;
+067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;;
+067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;;
+0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;;
+0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;;
+0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;;
+0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;;
+0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;;
+0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;;
+0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;;
+0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;;
+0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;;
+0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;;
+068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;;
+068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;;
+068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;;
+068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;;
+0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;;
+0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;;
+0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;;
+0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;;
+0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;;
+0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;;
+0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;;
+0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;;
+0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;;
+069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;;
+06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;;
+06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;;
+06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;;
+06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;;
+06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;;
+06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;;
+06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;;
+06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;;
+06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;;
+06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;;
+06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;;
+06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;;
+06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;;
+06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;;
+06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;;
+06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;;
+06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;;
+06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;;
+06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;;
+06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;;
+06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;;
+06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;;
+06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;;
+06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;;
+06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;;
+06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;;
+06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;;
+06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;;
+06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;;
+06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;;
+06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;;
+06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;;
+06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;;
+06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;;
+06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;;
+06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;;
+06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;;
+06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;;
+06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;;
+06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;;
+06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;;
+06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;;
+06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;;
+06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;;
+06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;;
+06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;;
+06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;;
+06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;;
+06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;;
+06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;;
+06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;;
+06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;;
+06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;;
+06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;;
+06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;;
+06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;;
+06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;;
+06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;;
+06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;;
+06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;;
+06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;;
+06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;;
+06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;;
+06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;;
+06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;;
+06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;;
+06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;;
+06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;;
+06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;;
+06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;;
+06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;;
+06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;;
+06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;;
+06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;;
+0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;;
+0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;;
+0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;;
+0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;;
+070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;;
+070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;;
+070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;;
+070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;;
+0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;;
+0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;;
+0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;;
+0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;;
+0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;;
+0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;;
+0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;;
+0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;;
+0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;;
+071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;;
+071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;;
+071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;;
+071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;;
+071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;;
+0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;;
+0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;;
+0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;;
+0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;;
+0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;;
+0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;;
+0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;;
+0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;;
+072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;;
+072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;;
+072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;;
+072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;;
+072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;;
+0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;;
+0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;;
+073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;;
+073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;;
+0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;;
+0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;;
+0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;;
+0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;;
+074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;;
+074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;;
+074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;;
+074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;;
+0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;;
+0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;;
+075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;;
+075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;;
+0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;;
+076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;;
+076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;;
+0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;;
+077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
+0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
+0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;;
+0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;;
+0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;;
+0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;;
+0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;;
+0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;;
+078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;;
+078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;;
+078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;;
+078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;;
+078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;;
+078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;;
+0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;;
+0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;;
+0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;;
+0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;;
+0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;;
+0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;;
+0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;;
+0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;;
+0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;;
+079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;;
+079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;;
+079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;;
+079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;;
+079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;;
+079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;;
+07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;;
+07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;;
+07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;;
+07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;;
+07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;;
+07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;;
+07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;;
+07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;;
+07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;;
+07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;;
+07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;;
+07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;;
+07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;;
+07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;;
+07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;;
+07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;;
+07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;;
+07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;;
+07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
+07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
+07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
+07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;;
+07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;;
+07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;;
+07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;;
+07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;;
+07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;;
+07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
+07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;;
+07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;;
+07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;;
+07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;;
+07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;;
+07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;;
+07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;;
+07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;;
+07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;;
+07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;;
+07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;;
+07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;;
+07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;;
+07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;;
+07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;;
+07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;;
+07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;;
+07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;;
+07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;;
+07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;;
+07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;;
+07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;;
+07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;;
+07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;;
+07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;;
+07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;;
+07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;;
+07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;;
+07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;;
+07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;;
+07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;;
+07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;;
+07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
+07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;;
+07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;;
+07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
+07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;;
+0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;;
+0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;;
+0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
+0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;;
+0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;;
+0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;;
+090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;;
+090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;;
+090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;;
+090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;;
+0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;;
+0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;;
+0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;;
+0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;;
+0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;;
+0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;;
+0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;;
+0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;;
+091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;;
+091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;;
+091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;;
+091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;;
+091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;;
+091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;;
+0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;;
+0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;;
+0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;;
+0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;;
+092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;;
+092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;;
+092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;;
+092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;;
+092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;;
+092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;;
+0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;;
+0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;;
+0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;;
+0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;;
+0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;;
+0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;;
+0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;;
+093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;;
+0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;;
+094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;;
+0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;;
+0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;;
+0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;;
+0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;;
+095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;;
+095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;;
+095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;;
+095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;;
+095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;;
+095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;;
+0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;;
+0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;;
+0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;;
+097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;;
+097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;;
+0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;;
+0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;;
+0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;;
+0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;;
+0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;;
+098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;;
+098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;;
+0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;;
+0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;;
+0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;;
+0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;;
+0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;;
+0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;;
+099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;;
+099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;;
+099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;;
+099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;;
+099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;;
+099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;;
+09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;;
+09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;;
+09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;;
+09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;;
+09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;;
+09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;;
+09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;;
+09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;;
+09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;;
+09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;;
+09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;;
+09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;;
+09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;;
+09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;;
+09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;;
+09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;;
+09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;;
+09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;;
+09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;;
+09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;;
+09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;;
+09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;;
+09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;;
+09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;;
+09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;;
+09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;;
+09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;;
+09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;;
+09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;;
+09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;;
+09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;;
+09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;;
+09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;;
+09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
+09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
+0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;;
+0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;;
+0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;;
+0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;;
+0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;;
+0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;;
+0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;;
+0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;;
+0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;;
+0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;;
+0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;;
+0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;;
+0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;;
+0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;;
+0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;;
+0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;;
+0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;;
+0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;;
+0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;;
+0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;;
+0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;;
+0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;;
+0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;;
+0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;;
+0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;;
+0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;;
+0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;;
+0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;;
+0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;;
+0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;;
+0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
+0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
+0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;;
+0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;;
+0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;;
+0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;;
+0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;;
+0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;;
+0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;;
+0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;;
+0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;;
+0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;;
+0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;;
+0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;;
+0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;;
+0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;;
+0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;;
+0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;;
+0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;;
+0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;;
+0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;;
+0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;;
+0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;;
+0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;;
+0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;;
+0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;;
+0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;;
+0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;;
+0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;;
+0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;;
+0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;;
+0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;;
+0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;;
+0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;;
+0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;;
+0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;;
+0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;;
+0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;;
+0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;;
+0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;;
+0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;;
+0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;;
+0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;;
+0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;;
+0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;;
+0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;;
+0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;;
+0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;;
+0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;;
+0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;;
+0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;;
+0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;;
+0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;;
+0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;;
+0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;;
+0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;;
+0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;;
+0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;;
+0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;;
+0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;;
+0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;;
+0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;;
+0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;;
+0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;;
+0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;;
+0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;;
+0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;;
+0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;;
+0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;;
+0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;;
+0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;;
+0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;;
+0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;;
+0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;;
+0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;;
+0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;;
+0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;;
+0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;;
+0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;;
+0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;;
+0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;;
+0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;;
+0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;;
+0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;;
+0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;;
+0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;;
+0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;;
+0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;;
+0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;;
+0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;;
+0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;;
+0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;;
+0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;;
+0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;;
+0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;;
+0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;;
+0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;;
+0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;Naal;;;
+0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;Maatham;;;
+0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;Varudam;;;
+0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;Patru;;;
+0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;Varavu;;;
+0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;Merpadi;;;
+0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;Rupai;;;
+0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;Enn;;;
+0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
+0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
+0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
+0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
+0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;;
+0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;;
+0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;;
+0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;;
+0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;;
+0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;;
+0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;;
+0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;;
+0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;;
+0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;;
+0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;;
+0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;;
+0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;;
+0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;;
+0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;;
+0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;;
+0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;;
+0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;;
+0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;;
+0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;;
+0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;;
+0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;;
+0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;;
+0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;;
+0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;;
+0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;;
+0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;;
+0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;;
+0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;;
+0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;;
+0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;;
+0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;;
+0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;;
+0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
+0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
+0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;;
+0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;;
+0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;;
+0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;;
+0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;;
+0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;;
+0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;;
+0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
+0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
+0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
+0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;;
+0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;;
+0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;;
+0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;;
+0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;;
+0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;;
+0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;;
+0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;;
+0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;;
+0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;;
+0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;;
+0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;;
+0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;;
+0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;;
+0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;;
+0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;;
+0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;;
+0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;;
+0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;;
+0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;;
+0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;;
+0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;;
+0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;;
+0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;;
+0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;;
+0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;;
+0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;;
+0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;;
+0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;;
+0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;;
+0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;;
+0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;;
+0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;;
+0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;;
+0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
+0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;;
+0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;N;;;;;
+0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
+0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;;
+0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;;
+0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;;
+0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;;
+0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;;
+0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;;
+0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;;
+0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;;
+0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;;
+0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;;
+0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;;
+0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;;
+0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;;
+0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;;
+0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;;
+0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;;
+0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;;
+0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;;
+0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;;
+0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;;
+0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;;
+0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;;
+0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;;
+0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;;
+0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;;
+0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;;
+0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;;
+0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
+0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;;
+0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;;
+0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;;
+0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;;
+0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
+0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;;
+0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
+0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;;
+0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;;
+0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;;
+0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;;
+0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;;
+0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;;
+0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;;
+0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
+0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
+0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
+0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;;
+0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;;
+0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;;
+0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;;
+0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;;
+0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;;
+0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;;
+0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;;
+0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;;
+0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;;
+0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;;
+0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;;
+0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;;
+0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;;
+0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;;
+0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;;
+0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;;
+0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;;
+0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;;
+0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;;
+0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;;
+0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;;
+0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;;
+0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;;
+0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;;
+0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;;
+0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;;
+0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;;
+0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;;
+0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;;
+0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;;
+0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;;
+0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;;
+0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;;
+0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;;
+0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;;
+0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;;
+0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;;
+0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;;
+0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;;
+0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;;
+0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;;
+0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;;
+0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;;
+0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;;
+0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;;
+0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;;
+0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;;
+0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;;
+0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;;
+0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;;
+0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;;
+0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;;
+0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;;
+0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;;
+0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;;
+0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;;
+0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;;
+0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;;
+0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;;
+0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;;
+0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;;
+0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;;
+0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;;
+0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;;
+0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;;
+0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;;
+0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;;
+0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;;
+0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;;
+0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;;
+0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;;
+0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;;
+0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;;
+0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;;
+0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;;
+0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;;
+0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;;
+0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;;
+0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;;
+0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;;
+0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;;
+0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;;
+0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;;
+0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;;
+0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;;
+0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;;
+0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;;
+0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;;
+0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;;
+0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;;
+0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;;
+0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;;
+0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;;
+0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;;
+0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;;
+0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;;
+0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;;
+0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;;
+0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;;
+0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;;
+0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;;
+0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;;
+0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;;
+0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;;
+0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;;
+0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;;
+0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;;
+0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;;
+0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
+0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
+0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
+0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
+0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
+0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
+0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
+0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
+0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
+0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;;
+0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
+0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
+0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
+0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
+0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
+0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
+0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
+0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
+0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
+0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
+0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;;
+0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;;
+0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;;
+0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
+0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
+0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
+0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
+0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;;
+0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;;
+0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;;
+0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;;
+0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;;
+0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;;
+0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
+0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
+0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;;
+0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;;
+0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;;
+0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;;
+0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;;
+0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;;
+0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;;
+0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;;
+0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;;
+0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;;
+0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;;
+0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;;
+0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;;
+0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;tsek tar;;;
+0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;;
+0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;;
+0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;;
+0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;;
+0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;;
+0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;;
+0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;;
+0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;;
+0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;;
+0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;;
+0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;;
+0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;;
+0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;;
+0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;;
+0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;;
+0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;;
+0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;;
+0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;;
+0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;;
+0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;
+0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;;
+0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;;
+0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;;
+0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;;
+0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;;
+0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;ang kang ye;;;
+0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;;
+0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;;
+0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
+0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;;
+0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;;
+0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;;
+0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;;
+0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;;
+0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;;
+0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;;
+0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;;
+0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;;
+0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;;
+0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;;
+0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;;
+0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;;
+0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;;
+0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;;
+0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;;
+0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;;
+0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;;
+0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;;
+0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;;
+0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;;
+0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;;
+0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;;
+0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;;
+0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;;
+0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;;
+0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;;
+0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;;
+0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;;
+0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;;
+0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;;
+0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
+0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
+0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;;
+0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;;
+0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;;
+0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
+0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
+0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
+0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;;
+0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;;
+0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;;
+0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;;
+0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;;
+0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;;
+0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;;
+0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;;
+0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;;
+0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;;
+0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;;
+0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;;
+0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;;
+0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;;
+0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;;
+0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;;
+0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;;
+0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;;
+0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;;
+0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;;
+0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;;
+0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;;
+0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;;
+0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;;
+0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;;
+0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;;
+0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;;
+0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;;
+0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;;
+0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;;
+0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;;
+0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;;
+0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;;
+0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;;
+0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;;
+0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;;
+0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;;
+0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;;
+0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;;
+0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;;
+0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;;
+0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;;
+0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;;
+0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;;
+0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;;
+0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;;
+0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;;
+0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;;
+0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;;
+0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;;
+0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;;
+0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;;
+0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;;
+0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;;
+0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
+0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
+0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
+0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;dena deka;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;;
+0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;;
+0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;;
+0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;nyi tsek;;;
+0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;da nying yik go dun ma;;;
+0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;da nying yik go kab ma;;;
+1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
+1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
+1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
+1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;;
+1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;;
+1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;;
+1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;;
+1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;;
+1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;;
+100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;;
+100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;;
+100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;;
+100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;;
+100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;;
+1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;;
+1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;;
+1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;;
+1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;;
+1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;;
+1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;;
+1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;;
+1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;;
+1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;;
+1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;;
+101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;;
+101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;;
+101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;;
+101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;;
+101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;;
+101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;;
+1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;;
+1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;;
+1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;;
+1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;;
+1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;;
+1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;;
+1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;;
+1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;;
+1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;;
+1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;;
+102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;;
+102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;;
+102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;;
+1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;;
+1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;;
+1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;;
+103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;;
+103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;;
+103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;;
+103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;;
+1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;;
+104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;;
+104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;;
+104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;;
+104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;;
+104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;;
+1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;;
+1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;;
+1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;;
+105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;;
+105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;;
+105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;;
+105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;;
+105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;;
+1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
+1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;;
+1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;;
+1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;;
+1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;;
+1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;;
+1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;;
+1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;;
+1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;;
+1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;;
+106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;;
+106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;;
+106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;;
+106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;;
+106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;;
+106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;;
+1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;;
+1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;;
+1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;;
+1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;;
+1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;;
+1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;;
+1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;;
+1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;;
+1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;;
+1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;;
+107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;;
+107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;;
+107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;;
+107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;;
+107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;;
+107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;;
+1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;;
+1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;;
+1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;;
+1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;;
+1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;;
+1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;;
+1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;;
+1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;;
+108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;;
+108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;;
+108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;;
+108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;;
+108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;;
+108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;;
+1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;;
+109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;;
+10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;2D00;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25;
+10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
+10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
+10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
+10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
+10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
+10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
+10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
+10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
+10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
+10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
+10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
+10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
+10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
+10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
+10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
+10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
+10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
+10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
+10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
+10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
+10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
+10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
+10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
+10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
+10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
+10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
+10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
+10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
+10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
+10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
+10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
+10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
+10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
+10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
+10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
+10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
+10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
+10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
+10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
+10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
+10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
+10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
+10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
+10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;;
+1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;;
+1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;;
+1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;;
+1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;;
+110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;;
+110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;;
+1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;;
+111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;;
+111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;;
+1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;;
+1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;;
+112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;;
+112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;;
+112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;;
+1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;;
+1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;;
+113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;;
+113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;;
+113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;;
+113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;;
+1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;;
+1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;;
+1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;;
+1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;;
+114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;;
+114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;;
+114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;;
+114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;;
+114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;;
+1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;;
+1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;;
+1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;;
+1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;;
+1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;;
+1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;;
+1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;;
+1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;;
+1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;;
+1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;;
+1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;;
+116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;;
+116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;;
+116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;;
+116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;;
+116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;;
+116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;;
+1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;;
+1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;;
+1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;;
+1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;;
+1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;;
+1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;;
+1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;;
+1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;;
+1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;;
+1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;;
+117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;;
+117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;;
+117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;;
+117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;;
+117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;;
+117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;;
+1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;;
+1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;;
+1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;;
+1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;;
+1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;;
+1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;;
+1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;;
+1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;;
+1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;;
+1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;;
+118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;;
+118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;;
+118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;;
+118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;;
+118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;;
+118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;;
+1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;;
+1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;;
+1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;;
+1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;;
+1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;;
+1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;;
+1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;;
+1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;;
+1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;;
+1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;;
+119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;;
+119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;;
+119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;;
+119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;;
+119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;;
+119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;;
+11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;;
+11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;;
+11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;;
+11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;;
+11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;;
+11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;;
+11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;;
+11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;;
+11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;;
+11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;;
+11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;;
+11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;;
+11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;;
+11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;;
+11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;;
+11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;;
+11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;;
+11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;;
+11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;;
+11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;;
+11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;;
+11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;;
+11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;;
+11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;;
+11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;;
+11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;;
+11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;;
+11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;;
+11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;;
+11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;;
+11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;;
+11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;;
+11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;;
+11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;;
+1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;;
+1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;;
+120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;;
+1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;;
+1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;;
+1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;;
+1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;;
+1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;;
+1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;;
+1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;;
+1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;;
+1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;;
+121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;;
+1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;;
+1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;;
+1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;;
+1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;;
+1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;;
+1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;;
+1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;;
+1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;;
+1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;;
+122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;;
+1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;;
+1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;;
+1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;;
+123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;;
+1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;;
+1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;;
+1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;;
+1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;;
+1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;;
+1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;;
+124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;;
+124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;;
+124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;;
+124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;;
+1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;;
+1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;;
+1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;;
+1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;;
+1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;;
+1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;;
+1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;;
+1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;;
+125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;;
+125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;;
+125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;;
+125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;;
+1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;;
+1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;;
+1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;;
+126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;;
+1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;;
+1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;;
+1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;;
+127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;;
+1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;;
+1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;;
+1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;;
+1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;;
+1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;;
+1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;;
+1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;;
+128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;;
+128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;;
+128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;;
+128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;;
+1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;;
+1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;;
+1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;;
+129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;;
+12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;;
+12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;;
+12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;;
+12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;;
+12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;;
+12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;;
+12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;;
+12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;;
+12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;;
+12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;;
+12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
+12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
+12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;;
+12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;;
+12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;;
+12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;;
+12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;;
+12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;;
+12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;;
+12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;;
+12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;;
+12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;;
+12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;;
+12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;;
+12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;;
+12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;;
+12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;;
+12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;;
+12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;;
+12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;;
+12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;;
+12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;;
+12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;;
+12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;;
+12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;;
+12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;;
+12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;;
+12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;;
+12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;;
+12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;;
+12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;;
+12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;;
+12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;;
+12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;;
+12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;;
+12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;;
+12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;;
+1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;;
+1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;;
+1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;;
+130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;;
+1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
+1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
+1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;;
+1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;;
+1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;;
+1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;;
+131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;;
+131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;;
+1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;;
+1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;;
+1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;;
+132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;;
+132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;;
+132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;;
+1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;;
+1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;;
+1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;;
+1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;;
+1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;;
+1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;;
+1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;;
+1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;;
+1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;;
+1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;;
+133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;;
+133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;;
+133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;;
+133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;;
+133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;;
+133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;;
+1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;;
+1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;;
+1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;;
+1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;;
+1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;;
+1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;;
+1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;;
+1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;;
+1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;;
+134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;;
+1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;;
+1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;;
+1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
+1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
+135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;;
+135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;;
+1360;ETHIOPIC SECTION MARK;So;0;L;;;;;N;;;;;
+1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;;
+1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;;
+1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;;
+1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;;
+1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;;
+1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;;
+1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;;
+1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;;
+1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;;
+1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;;
+1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
+137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;;
+137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;;
+1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;;
+1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;;
+1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;;
+1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;;
+1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;;
+1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;;
+1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;;
+1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;;
+1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;;
+138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;;
+138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;;
+138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;;
+138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;;
+138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;;
+138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;;
+1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;;
+1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;;
+1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;;
+1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;;
+1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;;
+1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;;
+1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;;
+1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;;
+1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;;
+1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;;
+13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;;
+13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;;
+13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;;
+13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;;
+13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;;
+13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;;
+13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;;
+13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;;
+13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;;
+13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;;
+13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;;
+13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;;
+13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;;
+13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;;
+13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;;
+13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;;
+13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;;
+13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;;
+13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;;
+13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;;
+13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;;
+13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;;
+13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;;
+13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;;
+13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;;
+13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;;
+13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;;
+13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;;
+13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;;
+13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;;
+13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;;
+13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;;
+13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;;
+13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;;
+13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;;
+13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;;
+13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;;
+13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;;
+13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;;
+13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;;
+13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;;
+13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;;
+13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;;
+13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;;
+13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;;
+13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;;
+13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;;
+13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;;
+13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;;
+13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;;
+13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;;
+13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;;
+13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;;
+13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;;
+13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;;
+13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;;
+13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;;
+13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;;
+13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;;
+13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;;
+13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;;
+13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;;
+13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;;
+13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;;
+13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;;
+13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;;
+13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;;
+13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;;
+13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;;
+13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;;
+13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;;
+13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;;
+13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;;
+13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;;
+13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;;
+13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;;
+13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;;
+13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;;
+13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;;
+13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;;
+13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;;
+13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;;
+13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;;
+13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;;
+13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;;
+1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;;
+1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;;
+1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;;
+1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;;
+1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;;
+1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;;
+1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;;
+1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;;
+1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;;
+140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;;
+140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;;
+140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;;
+140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;;
+140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;;
+140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;;
+1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;;
+1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;;
+1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;;
+1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;;
+1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;;
+1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;;
+1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;;
+1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;;
+1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;;
+1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;;
+141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;;
+141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;;
+141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;;
+141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;;
+141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;;
+1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;;
+1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;;
+1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;;
+1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;;
+1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;;
+1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;;
+1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;;
+1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;;
+1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;;
+1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;;
+142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;;
+142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;;
+142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;;
+142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;;
+142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;;
+142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;;
+1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;;
+1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;;
+1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;;
+1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;;
+1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;;
+1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;;
+1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;;
+1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;;
+1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;;
+1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;;
+143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;;
+143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;;
+143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;;
+143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;;
+143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;;
+143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;;
+1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;;
+1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;;
+1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;;
+1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;;
+1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;;
+1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;;
+1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;;
+1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;;
+144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;;
+144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;;
+144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;;
+144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;;
+144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;;
+144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;;
+1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;;
+1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;;
+1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;;
+1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;;
+1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;;
+1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;;
+1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;;
+1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;;
+1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;;
+1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;;
+145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;;
+145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;;
+145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;;
+145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;;
+145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;;
+145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;;
+1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;;
+1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;;
+1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;;
+1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;;
+1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;;
+1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;;
+1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;;
+1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;;
+1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;;
+1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;;
+146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;;
+146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;;
+146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;;
+146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;;
+146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;;
+146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;;
+1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;;
+1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;;
+1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;;
+1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;;
+1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;;
+1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;;
+1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;;
+1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;;
+1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;;
+1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;;
+147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;;
+147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;;
+147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;;
+147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;;
+147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;;
+147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;;
+1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;;
+1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;;
+1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;;
+1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;;
+1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;;
+1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;;
+1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;;
+1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;;
+1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;;
+1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;;
+148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;;
+148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;;
+148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;;
+148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;;
+148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;;
+148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;;
+1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;;
+1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;;
+1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;;
+1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;;
+1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;;
+1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;;
+1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;;
+1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;;
+1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;;
+1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;;
+149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;;
+149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;;
+149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;;
+149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;;
+149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;;
+149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;;
+14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;;
+14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;;
+14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;;
+14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;;
+14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;;
+14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;;
+14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;;
+14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;;
+14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;;
+14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;;
+14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;;
+14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;;
+14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;;
+14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;;
+14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;;
+14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;;
+14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;;
+14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;;
+14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;;
+14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;;
+14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;;
+14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;;
+14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;;
+14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;;
+14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;;
+14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;;
+14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;;
+14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;;
+14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;;
+14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;;
+14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;;
+14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;;
+14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;;
+14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;;
+14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;;
+14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;;
+14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;;
+14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;;
+14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;;
+14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;;
+14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;;
+14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;;
+14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;;
+14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;;
+14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;;
+14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;;
+14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;;
+14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;;
+14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;;
+14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;;
+14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;;
+14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;;
+14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;;
+14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;;
+14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;;
+14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;;
+14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;;
+14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;;
+14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;;
+14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;;
+14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;;
+14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;;
+14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;;
+14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;;
+14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;;
+14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;;
+14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;;
+14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;;
+14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;;
+14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;;
+14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;;
+14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;;
+14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;;
+14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;;
+14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;;
+14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;;
+14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;;
+14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;;
+14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;;
+14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;;
+14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;;
+14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;;
+14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;;
+14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;;
+14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;;
+14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;;
+14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;;
+14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;;
+14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;;
+14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;;
+14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;;
+14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;;
+14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;;
+14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;;
+14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;;
+14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;;
+1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;;
+1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;;
+1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;;
+1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;;
+1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;;
+1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;;
+1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;;
+1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;;
+1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;;
+1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;;
+150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;;
+150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;;
+150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;;
+150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;;
+150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;;
+150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;;
+1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;;
+1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;;
+1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;;
+1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;;
+1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;;
+1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;;
+1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;;
+1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;;
+1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;;
+1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;;
+151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;;
+151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;;
+151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;;
+151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;;
+151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;;
+151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;;
+1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;;
+1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;;
+1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;;
+1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;;
+1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;;
+1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;;
+1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;;
+1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;;
+1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;;
+1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;;
+152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;;
+152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;;
+152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;;
+152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;;
+152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;;
+152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;;
+1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;;
+1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;;
+1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;;
+1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;;
+1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;;
+1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;;
+1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;;
+1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;;
+1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;;
+1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;;
+153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;;
+153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;;
+153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;;
+153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;;
+153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;;
+153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;;
+1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;;
+1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;;
+1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;;
+1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;;
+1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;;
+1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;;
+1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;;
+1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;;
+1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;;
+1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;;
+154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;;
+154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;;
+154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;;
+154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;;
+154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;;
+154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;;
+1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;;
+1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;;
+1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;;
+1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;;
+1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;;
+1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;;
+1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;;
+1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;;
+1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;;
+1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;;
+155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;;
+155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;;
+155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;;
+155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;;
+155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;;
+155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;;
+1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;;
+1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;;
+1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;;
+1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;;
+1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;;
+1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;;
+1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;;
+1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;;
+1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;;
+1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;;
+156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;;
+156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;;
+156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;;
+156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;;
+156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;;
+156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;;
+1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;;
+1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;;
+1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;;
+1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;;
+1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;;
+1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;;
+1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;;
+1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;;
+1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;;
+1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;;
+157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;;
+157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;;
+157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;;
+157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;;
+157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;;
+157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;;
+1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;;
+1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;;
+1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;;
+1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;;
+1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;;
+1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;;
+1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;;
+1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;;
+1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;;
+1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;;
+158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;;
+158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;;
+158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;;
+158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;;
+158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;;
+158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;;
+1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;;
+1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;;
+1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;;
+1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;;
+1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;;
+1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;;
+1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;;
+1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;;
+1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;;
+1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;;
+159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;;
+159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;;
+159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;;
+159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;;
+159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;;
+159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;;
+15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;;
+15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;;
+15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;;
+15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;;
+15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;;
+15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;;
+15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;;
+15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;;
+15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;;
+15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;;
+15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;;
+15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;;
+15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;;
+15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;;
+15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;;
+15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;;
+15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;;
+15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;;
+15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;;
+15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;;
+15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;;
+15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;;
+15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;;
+15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;;
+15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;;
+15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;;
+15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;;
+15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;;
+15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;;
+15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;;
+15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;;
+15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;;
+15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;;
+15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;;
+15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;;
+15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;;
+15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;;
+15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;;
+15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;;
+15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;;
+15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;;
+15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;;
+15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;;
+15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;;
+15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;;
+15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;;
+15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;;
+15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;;
+15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;;
+15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;;
+15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;;
+15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;;
+15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;;
+15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;;
+15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;;
+15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;;
+15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;;
+15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;;
+15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;;
+15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;;
+15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;;
+15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;;
+15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;;
+15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;;
+15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;;
+15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;;
+15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;;
+15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;;
+15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;;
+15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;;
+15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;;
+15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;;
+15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;;
+15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;;
+15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;;
+15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;;
+15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;;
+15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;;
+15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;;
+15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;;
+15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;;
+15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;;
+15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;;
+15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;;
+15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;;
+15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;;
+15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;;
+15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;;
+15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;;
+15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;;
+15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;;
+15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;;
+15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;;
+15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;;
+15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;;
+15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;;
+1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;;
+1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;;
+1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;;
+1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;;
+1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;;
+1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;;
+1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;;
+1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;;
+1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;;
+1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;;
+160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;;
+160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;;
+160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;;
+160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;;
+160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;;
+160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;;
+1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;;
+1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;;
+1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;;
+1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;;
+1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;;
+1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;;
+1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;;
+1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;;
+1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;;
+1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;;
+161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;;
+161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;;
+161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;;
+161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;;
+161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;;
+161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;;
+1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;;
+1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;;
+1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;;
+1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;;
+1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;;
+1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;;
+1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;;
+1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;;
+1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;;
+1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;;
+162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;;
+162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;;
+162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;;
+162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;;
+162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;;
+162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;;
+1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;;
+1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;;
+1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;;
+1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;;
+1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;;
+1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;;
+1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;;
+1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;;
+1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;;
+1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;;
+163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;;
+163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;;
+163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;;
+163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;;
+163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;;
+163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;;
+1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;;
+1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;;
+1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;;
+1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;;
+1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;;
+1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;;
+1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;;
+1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;;
+1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;;
+1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;;
+164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;;
+164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;;
+164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;;
+164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;;
+164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;;
+164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;;
+1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;;
+1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;;
+1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;;
+1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;;
+1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;;
+1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;;
+1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;;
+1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;;
+1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;;
+1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;;
+165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;;
+165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;;
+165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;;
+165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;;
+165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;;
+165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;;
+1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;;
+1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;;
+1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;;
+1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;;
+1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;;
+1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;;
+1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;;
+1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;;
+1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;;
+1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;;
+166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;;
+166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;;
+166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;;
+166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;;
+166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;;
+166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;;
+1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;;
+1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;;
+1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;;
+1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;;
+1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;;
+1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;;
+1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;;
+1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;
+1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;;
+1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;;
+1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;;
+1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;;
+1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;;
+1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;;
+1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;;
+1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;;
+1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;;
+168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;;
+168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;;
+168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;;
+168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;;
+168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;;
+168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;;
+1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;;
+1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;;
+1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;;
+1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;;
+1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;;
+1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;;
+1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;;
+1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;;
+1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;;
+1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;;
+169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;;
+169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;;
+16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;;
+16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;;
+16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;;
+16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;;
+16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;;
+16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;;
+16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;;
+16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;;
+16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;;
+16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;;
+16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;;
+16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;;
+16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;;
+16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;;
+16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;;
+16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;;
+16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;;
+16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;;
+16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;;
+16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;;
+16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;;
+16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;;
+16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;;
+16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;;
+16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;;
+16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;;
+16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;;
+16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;;
+16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;;
+16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;;
+16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;;
+16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;;
+16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;;
+16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;;
+16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;;
+16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;;
+16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;;
+16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;;
+16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;;
+16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;;
+16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;;
+16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;;
+16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;;
+16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;;
+16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;;
+16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;;
+16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;;
+16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;;
+16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;;
+16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;;
+16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;;
+16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;;
+16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;;
+16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;;
+16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;;
+16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;;
+16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;;
+16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;;
+16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;;
+16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;;
+16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;;
+16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;;
+16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;;
+16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;;
+16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;;
+16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;;
+16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;;
+16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;;
+16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;;
+16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;;
+16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;;
+16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;golden number 17;;;
+16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;golden number 18;;;
+16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;golden number 19;;;
+1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;;
+1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;;
+1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;;
+1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;;
+1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;;
+1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;;
+1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;;
+1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;;
+1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;;
+1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;;
+170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;;
+170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;;
+170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;;
+170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;;
+170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;;
+1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;;
+1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;;
+1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;;
+1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;;
+1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;;
+1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;;
+1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;;
+1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;;
+1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;;
+1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;;
+1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;;
+1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;;
+172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;;
+172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;;
+172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;;
+172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;;
+172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;;
+172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;;
+1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;;
+1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;;
+1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;;
+1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;;
+1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;;
+1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;;
+1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;;
+1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;;
+1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;;
+1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;;
+1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;;
+1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;;
+1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;;
+174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;;
+174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;;
+174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;;
+174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;;
+174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;;
+174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;;
+1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;;
+1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;;
+1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;;
+1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;;
+1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;;
+1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;;
+1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;;
+1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;;
+1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;;
+1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;;
+1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;;
+176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;;
+176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;;
+176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;;
+176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;;
+176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;;
+1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;;
+1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;;
+1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;;
+1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;;
+1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;;
+1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;;
+1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;;
+1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;;
+1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;;
+1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;;
+1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;;
+178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;;
+178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;;
+178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;;
+178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;;
+178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;;
+178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;;
+1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;;
+1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;;
+1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;;
+1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;;
+1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;;
+1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;;
+1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;;
+1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;;
+1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;;
+1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;;
+179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;;
+179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;;
+179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;;
+179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;;
+179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;;
+179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;;
+17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;;
+17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;;
+17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;;
+17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;*;;;
+17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;*;;;
+17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;;
+17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;;
+17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;;
+17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;;
+17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;;
+17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;;
+17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;;
+17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;;
+17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;;
+17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;;
+17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;;
+17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;;
+17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;;
+17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;;
+17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;;
+17B4;KHMER VOWEL INHERENT AQ;Cf;0;L;;;;;N;;*;;;
+17B5;KHMER VOWEL INHERENT AA;Cf;0;L;;;;;N;;*;;;
+17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;;
+17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;;
+17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;;
+17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;;
+17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;;
+17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;;
+17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;;
+17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;;
+17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;;
+17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;;
+17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;;
+17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;;
+17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;;
+17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;;
+17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;;
+17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;;
+17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;;
+17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;*;;;
+17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;;
+17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;;
+17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;;
+17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;;
+17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;*;;;
+17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;;
+17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;;
+17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;;
+17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;;
+17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;;
+17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;;
+17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;;
+17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;;
+17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;;
+17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;;
+17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;;
+17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;;
+17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;;
+17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;;
+17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;;
+1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;;
+1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;;
+1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;;
+1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;;
+1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;;
+1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;;
+1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;;
+1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;;
+180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;;
+180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;;
+180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;;
+180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;;
+1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;;
+1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;;
+1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;;
+1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;;
+1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;;
+1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;;
+1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;;
+1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;;
+1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;;
+1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;;
+182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;;
+182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;;
+182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;;
+182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;;
+182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;;
+182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;;
+1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;;
+1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;;
+1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;;
+1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;;
+1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;;
+1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;;
+1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;;
+1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;;
+183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;;
+183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;;
+183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;;
+1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;;
+1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;;
+1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;;
+1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;;
+1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;;
+1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;;
+1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;;
+1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;;
+1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;;
+1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;;
+184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;;
+184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;;
+184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;;
+184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;;
+184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;;
+184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;;
+1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;;
+1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;;
+1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;;
+1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;;
+1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;;
+1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;;
+1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;;
+1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;;
+1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;;
+1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;;
+185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;;
+185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;;
+185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;;
+185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;;
+185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;;
+185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;;
+1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;;
+1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;;
+1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;;
+1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;;
+1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;;
+1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;;
+1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;;
+1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;;
+1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;;
+1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;;
+186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;;
+186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;;
+186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;;
+186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;;
+186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;;
+186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;;
+1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;;
+1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;;
+1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;;
+1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;;
+1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;;
+1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
+1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
+1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
+1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
+1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
+1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;;
+1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;;
+1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;;
+1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;;
+1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;;
+1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;;
+1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;;
+188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;;
+188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;;
+188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;;
+188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;;
+1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;;
+1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;;
+1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;;
+1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;;
+1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;;
+189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;;
+189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;;
+189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;;
+18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;;
+18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;;
+18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;;
+18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;;
+18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
+18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
+18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;;
+1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;;
+1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;;
+1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;;
+1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;;
+1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;;
+1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;;
+1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;;
+1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;;
+1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;;
+1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;;
+190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;;
+190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;;
+190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;;
+190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;;
+190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;;
+190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;;
+1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;;
+1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;;
+1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;;
+1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;;
+1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;;
+1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;;
+1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;;
+1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;;
+1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;;
+1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;;
+191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;;
+191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;;
+191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;;
+1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;;
+1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;;
+1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;;
+1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;;
+1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;;
+1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;;
+1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;;
+1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;;
+1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;;
+1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;;
+1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;;
+193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;;
+193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;;
+1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;;
+1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;;
+1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;;
+1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;;
+1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;;
+1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;;
+1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;;
+1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;;
+1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;;
+1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;;
+1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;;
+195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;;
+195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;;
+195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;;
+195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;;
+195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;;
+195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;;
+1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;;
+1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;;
+1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;;
+1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;;
+1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;;
+1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;;
+1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;;
+1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;;
+196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;;
+196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;;
+196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;;
+196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;;
+1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;;
+1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;;
+1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;;
+1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;;
+1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;;
+1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;;
+1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;;
+1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;;
+1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;;
+1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;;
+1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;;
+1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;;
+1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;;
+1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;;
+1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;;
+198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;;
+198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;;
+198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;;
+198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;;
+198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;;
+198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;;
+1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;;
+1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;;
+1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;;
+1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;;
+1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;;
+1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;;
+1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;;
+1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;;
+1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;;
+1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;;
+199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;;
+199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;;
+199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;;
+199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;;
+199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;;
+199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;;
+19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;;
+19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;;
+19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;;
+19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;;
+19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;;
+19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;;
+19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;;
+19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;;
+19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;;
+19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;;
+19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;;
+19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;;
+19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;;
+19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;;
+19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;;
+19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;;
+19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;;
+19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;;
+19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;;
+19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;;
+19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;;
+19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;;
+19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;;
+19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;;
+19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;;
+19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;;
+19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;;
+19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;;
+19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;;
+19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;;
+19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;;
+19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;;
+19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;;
+19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;;
+19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;;
+19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;;
+19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;;
+19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;;
+19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;;
+19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;;
+19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;;
+19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;;
+19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;;
+19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;;
+19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;;
+19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;;
+19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;;
+19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;;
+19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;;
+19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;;
+19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;;
+19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;;
+19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;;
+19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;;
+19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;;
+19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;;
+19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;;
+19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;;
+19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;;
+1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;;
+1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;;
+1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;;
+1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;;
+1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;;
+1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;;
+1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;;
+1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;;
+1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;;
+1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;ardhacandra;;;
+1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;candrabindu;;;
+1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;anusvara;;;
+1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;repha;;;
+1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;visarga;;;
+1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;a;;;
+1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;aa;;;
+1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;i;;;
+1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;ii;;;
+1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;u;;;
+1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;uu;;;
+1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;vocalic r;;;
+1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;vocalic rr;;;
+1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;vocalic l;;;
+1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;vocalic ll;;;
+1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;e;;;
+1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;ai;;;
+1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;o;;;
+1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;au;;;
+1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;kha;;;
+1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;gha;;;
+1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;cha;;;
+1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;jha;;;
+1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;tta;;;
+1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ttha;;;
+1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;dda;;;
+1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ddha;;;
+1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;nna;;;
+1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;tha;;;
+1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;dha;;;
+1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;pha;;;
+1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;bha;;;
+1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;sha;;;
+1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;ssa;;;
+1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;nukta;;;
+1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;aa;;;
+1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;i;;;
+1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;ii;;;
+1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;u;;;
+1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;uu;;;
+1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;vocalic r;;;
+1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;vocalic rr;;;
+1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;vocalic l;;;
+1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;vocalic ll;;;
+1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;e;;;
+1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;ai;;;
+1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;o;;;
+1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;au;;;
+1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;ae;;;
+1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;oe;;;
+1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;virama;;;
+1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;;
+1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;;
+1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;;
+1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;;
+1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;;
+1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;;
+1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;;
+1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1B5A;BALINESE PANTI;Po;0;L;;;;;N;;section;;;
+1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;honorific section;;;
+1B5C;BALINESE WINDU;Po;0;L;;;;;N;;punctuation ring;;;
+1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;colon;;;
+1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;danda;;;
+1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;double danda;;;
+1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;line-breaking hyphen;;;
+1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;;
+1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;;
+1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;;
+1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;;
+1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;;
+1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;;
+1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;;
+1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;;
+1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;;
+1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;;
+1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;;
+1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;;
+1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;;
+1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;;
+1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;;
+1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;;
+1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;;
+1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;;
+1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;;
+1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;;
+1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;;
+1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;;
+1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;;
+1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;;
+1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;;
+1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;;
+1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;;
+1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;;
+1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;;
+1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;;
+1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;;
+1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;;
+1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;;
+1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;;
+1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;;
+1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;;
+1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;;
+1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;;
+1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;;
+1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;;
+1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;;
+1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;;
+1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;;
+1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;;
+1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;;
+1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;;
+1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;;
+1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;;
+1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;;
+1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;;
+1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;;
+1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;;
+1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;;
+1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;;
+1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;;
+1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;;
+1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;;
+1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;;
+1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;;
+1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;;
+1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;;
+1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;;
+1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;;
+1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;;
+1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;;
+1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;;
+1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;;
+1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;;
+1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;;
+1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;;
+1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;;
+1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;;
+1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;;
+1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;;
+1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;;
+1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;;
+1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;;
+1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;;
+1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;;
+1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;;
+1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;;
+1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;;
+1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;;
+1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;;
+1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;;
+1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;;
+1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;;
+1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;;
+1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;;
+1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;;
+1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;;
+1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;;
+1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;;
+1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;;
+1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;;
+1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;;
+1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;;
+1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;;
+1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;;
+1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;;
+1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;;
+1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;;
+1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;;
+1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;;
+1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;;
+1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;;
+1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;;
+1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;;
+1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;;
+1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;;
+1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;;
+1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;;
+1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;;
+1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;;
+1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;;
+1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;;
+1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;;
+1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;;
+1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;;
+1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;;
+1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;;
+1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;;
+1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;;
+1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;;
+1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;;
+1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;;
+1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;;
+1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;;
+1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;;
+1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;;
+1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;;
+1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;;
+1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
+1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
+1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
+1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;;
+1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;;
+1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;;
+1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;;
+1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;;
+1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;;
+1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;;
+1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;;
+1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;;
+1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;;
+1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;;
+1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;;
+1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;;
+1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;;
+1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;;
+1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;;
+1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;;
+1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;;
+1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;;
+1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;;
+1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;;
+1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;;
+1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;;
+1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;;
+1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;;
+1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;;
+1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;;
+1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;;
+1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;;
+1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;;
+1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;;
+1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;;
+1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;;
+1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;;
+1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;;
+1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;;
+1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;;
+1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;;
+1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;;
+1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;;
+1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;;
+1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;;
+1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;;
+1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;;
+1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;;
+1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;;
+1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;;
+1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;;
+1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;;
+1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;;
+1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;;
+1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;;
+1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;;
+1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;;
+1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;;
+1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;;
+1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;;
+1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;;
+1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;;
+1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;;
+1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;;
+1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;;
+1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;;
+1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;;
+1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;;
+1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;;
+1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;;
+1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;;
+1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;;
+1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;;
+1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;;
+1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;;
+1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;;
+1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;;
+1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;;
+1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;;
+1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;;
+1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;;
+1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;;
+1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;;
+1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;;
+1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;;
+1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;;
+1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;;
+1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;;
+1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;;
+1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;;
+1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;;
+1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;;
+1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;;
+1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;;
+1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;;
+1D62;LATIN SUBSCRIPT SMALL LETTER I;Ll;0;L;<sub> 0069;;;;N;;;;;
+1D63;LATIN SUBSCRIPT SMALL LETTER R;Ll;0;L;<sub> 0072;;;;N;;;;;
+1D64;LATIN SUBSCRIPT SMALL LETTER U;Ll;0;L;<sub> 0075;;;;N;;;;;
+1D65;LATIN SUBSCRIPT SMALL LETTER V;Ll;0;L;<sub> 0076;;;;N;;;;;
+1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Ll;0;L;<sub> 03B2;;;;N;;;;;
+1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Ll;0;L;<sub> 03B3;;;;N;;;;;
+1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Ll;0;L;<sub> 03C1;;;;N;;;;;
+1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;;
+1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;;
+1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;;
+1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;;
+1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;;
+1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D
+1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;;
+1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63
+1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;;
+1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;;
+1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;;
+1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;;
+1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;;
+1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;;
+1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;;
+1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;;
+1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;;
+1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;;
+1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;;
+1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;;
+1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;;
+1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;;
+1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;;
+1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;;
+1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;;
+1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;;
+1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;;
+1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;;
+1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;;
+1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;;
+1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;;
+1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;;
+1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;;
+1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;;
+1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;;
+1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;;
+1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;;
+1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;;
+1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;;
+1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;;
+1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;;
+1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;;
+1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;;
+1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;;
+1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;;
+1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;;
+1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;;
+1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;;
+1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;;
+1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;;
+1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;;
+1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;;
+1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;;
+1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;;
+1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;;
+1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;;
+1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;;
+1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;;
+1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;;
+1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;;
+1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;;
+1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;;
+1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;;
+1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;;
+1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;;
+1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;;
+1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;;
+1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;;
+1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;;
+1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;;
+1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
+1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
+1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
+1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02
+1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05;
+1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04
+1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07;
+1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06
+1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09;
+1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08
+1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B;
+1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A
+1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D;
+1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C
+1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F;
+1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E
+1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11;
+1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10
+1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13;
+1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12
+1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15;
+1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14
+1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17;
+1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16
+1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19;
+1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18
+1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B;
+1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A
+1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D;
+1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C
+1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F;
+1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E
+1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21;
+1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20
+1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23;
+1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22
+1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25;
+1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24
+1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27;
+1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26
+1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29;
+1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28
+1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B;
+1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A
+1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D;
+1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C
+1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F;
+1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E
+1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31;
+1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30
+1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33;
+1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32
+1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35;
+1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34
+1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37;
+1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36
+1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39;
+1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38
+1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B;
+1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A
+1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D;
+1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C
+1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F;
+1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E
+1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41;
+1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40
+1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43;
+1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42
+1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45;
+1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44
+1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47;
+1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46
+1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49;
+1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48
+1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B;
+1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A
+1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D;
+1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C
+1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F;
+1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E
+1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51;
+1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50
+1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53;
+1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52
+1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55;
+1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54
+1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57;
+1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56
+1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59;
+1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58
+1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B;
+1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A
+1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D;
+1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C
+1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F;
+1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E
+1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61;
+1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60
+1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63;
+1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62
+1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65;
+1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64
+1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67;
+1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66
+1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69;
+1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68
+1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B;
+1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A
+1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D;
+1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C
+1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F;
+1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E
+1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71;
+1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70
+1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73;
+1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72
+1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75;
+1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74
+1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77;
+1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76
+1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79;
+1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78
+1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B;
+1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A
+1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D;
+1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C
+1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F;
+1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E
+1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81;
+1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80
+1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83;
+1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82
+1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85;
+1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84
+1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87;
+1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86
+1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89;
+1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88
+1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B;
+1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A
+1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D;
+1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C
+1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F;
+1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E
+1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91;
+1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90
+1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93;
+1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92
+1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95;
+1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94
+1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;;
+1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;;
+1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;;
+1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;;
+1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
+1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60
+1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;;
+1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;;
+1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF;
+1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;;
+1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1;
+1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0
+1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3;
+1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2
+1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5;
+1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4
+1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7;
+1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6
+1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9;
+1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8
+1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB;
+1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA
+1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD;
+1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC
+1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF;
+1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE
+1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1;
+1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0
+1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3;
+1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2
+1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5;
+1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4
+1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7;
+1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6
+1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9;
+1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8
+1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB;
+1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA
+1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD;
+1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC
+1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF;
+1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE
+1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1;
+1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0
+1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3;
+1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2
+1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5;
+1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4
+1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7;
+1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6
+1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9;
+1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8
+1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB;
+1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA
+1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD;
+1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC
+1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF;
+1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE
+1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1;
+1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0
+1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3;
+1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2
+1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5;
+1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4
+1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7;
+1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6
+1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9;
+1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8
+1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB;
+1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA
+1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD;
+1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC
+1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF;
+1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE
+1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1;
+1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0
+1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3;
+1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2
+1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5;
+1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4
+1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7;
+1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6
+1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9;
+1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8
+1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB;
+1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA
+1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED;
+1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC
+1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF;
+1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE
+1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1;
+1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0
+1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3;
+1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2
+1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5;
+1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4
+1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7;
+1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6
+1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9;
+1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8
+1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB;
+1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA
+1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD;
+1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC
+1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF;
+1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE
+1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08
+1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09
+1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A
+1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B
+1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C
+1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D
+1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E
+1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F
+1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00;
+1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01;
+1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02;
+1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03;
+1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04;
+1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05;
+1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06;
+1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07;
+1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18
+1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19
+1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A
+1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B
+1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C
+1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D
+1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10;
+1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11;
+1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12;
+1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13;
+1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14;
+1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15;
+1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28
+1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29
+1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A
+1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B
+1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C
+1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D
+1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E
+1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F
+1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20;
+1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21;
+1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22;
+1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23;
+1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24;
+1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25;
+1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26;
+1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27;
+1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38
+1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39
+1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A
+1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B
+1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C
+1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D
+1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E
+1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F
+1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30;
+1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31;
+1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32;
+1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33;
+1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34;
+1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35;
+1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36;
+1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37;
+1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48
+1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49
+1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A
+1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B
+1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C
+1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D
+1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40;
+1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41;
+1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42;
+1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43;
+1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44;
+1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45;
+1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;;
+1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59
+1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;;
+1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B
+1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;;
+1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D
+1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;;
+1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F
+1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51;
+1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53;
+1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55;
+1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57;
+1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68
+1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69
+1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A
+1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B
+1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C
+1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D
+1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E
+1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F
+1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60;
+1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61;
+1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62;
+1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63;
+1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64;
+1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65;
+1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66;
+1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67;
+1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA
+1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB
+1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8
+1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9
+1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA
+1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB
+1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA
+1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB
+1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8
+1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9
+1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA
+1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB
+1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA
+1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB
+1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88
+1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89
+1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A
+1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B
+1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C
+1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D
+1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E
+1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F
+1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80;
+1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81;
+1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82;
+1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83;
+1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84;
+1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85;
+1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86;
+1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87;
+1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98
+1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99
+1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A
+1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B
+1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C
+1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D
+1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E
+1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F
+1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90;
+1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91;
+1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92;
+1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93;
+1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94;
+1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95;
+1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96;
+1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97;
+1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8
+1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9
+1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA
+1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB
+1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC
+1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD
+1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE
+1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF
+1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0;
+1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1;
+1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2;
+1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3;
+1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4;
+1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5;
+1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6;
+1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7;
+1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8
+1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9
+1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;;
+1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC
+1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;;
+1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;;
+1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;;
+1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0;
+1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1;
+1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70;
+1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71;
+1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3;
+1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399
+1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;;
+1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;;
+1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;;
+1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC
+1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;;
+1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;;
+1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;;
+1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72;
+1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73;
+1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74;
+1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75;
+1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3;
+1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;;
+1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;;
+1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;;
+1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8
+1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9
+1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;;
+1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;;
+1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;;
+1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;;
+1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0;
+1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1;
+1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76;
+1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77;
+1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;;
+1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;;
+1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;;
+1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8
+1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9
+1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;;
+1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;;
+1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;;
+1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC
+1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;;
+1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;;
+1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0;
+1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1;
+1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A;
+1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B;
+1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5;
+1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;;
+1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;;
+1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;;
+1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;;
+1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC
+1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;;
+1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;;
+1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;;
+1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78;
+1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79;
+1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C;
+1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D;
+1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3;
+1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;;
+1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;;
+2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;
+2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;
+2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;;
+200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;;
+200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;;
+200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;;
+200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;;
+2010;HYPHEN;Pd;0;ON;;;;;N;;;;;
+2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;;
+2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;;
+2013;EN DASH;Pd;0;ON;;;;;N;;;;;
+2014;EM DASH;Pd;0;ON;;;;;N;;;;;
+2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;;
+2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;;
+2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;;
+2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;;
+2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;;
+201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;;
+201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;;
+201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;;
+201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;;
+201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;;
+201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;;
+2020;DAGGER;Po;0;ON;;;;;N;;;;;
+2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;;
+2022;BULLET;Po;0;ON;;;;;N;;;;;
+2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;;
+2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;;
+2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;;
+2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;;
+2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;;
+2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;;
+2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;;
+202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;;
+202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;;
+202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;;
+202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;;
+202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;;
+202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;;
+2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+2032;PRIME;Po;0;ET;;;;;N;;;;;
+2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;;
+2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;;
+2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;;
+2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;;
+2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;;
+2038;CARET;Po;0;ON;;;;;N;;;;;
+2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;;
+203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;;
+203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;;
+203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;;
+203D;INTERROBANG;Po;0;ON;;;;;N;;;;;
+203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;;
+203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;;
+2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;;
+2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;;
+2042;ASTERISM;Po;0;ON;;;;;N;;;;;
+2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;;
+2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;;
+2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
+2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
+2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;;
+2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;;
+2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;;
+204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;;
+204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;;
+204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;;
+204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;;
+2050;CLOSE UP;Po;0;ON;;;;;N;;;;;
+2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;;
+2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2053;SWUNG DASH;Po;0;ON;;;;;N;;;;;
+2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;;
+2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;;
+2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;;
+2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;;
+205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;;
+205D;TRICOLON;Po;0;ON;;;;;N;;;;;
+205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;;
+205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2060;WORD JOINER;Cf;0;BN;;;;;N;;;;;
+2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;;
+2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;;
+2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;;
+2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;;
+206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
+2071;SUPERSCRIPT LATIN SMALL LETTER I;Ll;0;L;<super> 0069;;;;N;;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
+207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
+207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
+207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
+207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L;<super> 006E;;;;N;;;;;
+2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
+208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
+208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;;
+208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;;
+2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;;
+2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;;
+2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;;
+2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;;
+2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;;
+20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;;
+20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;;
+20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;;
+20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;;
+20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;;
+20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;;
+20A9;WON SIGN;Sc;0;ET;;;;;N;;;;;
+20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;;
+20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;;
+20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;;
+20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;;
+20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;;
+20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;;
+20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;;
+20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;;
+20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;;
+20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;;
+20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;;
+20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;;
+20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
+20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
+20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
+20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;;
+20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;;
+20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;;
+20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;;
+20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;;
+20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;;
+20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;;
+20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;;
+20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;;
+20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;;
+20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;;
+20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;;
+20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;;
+20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;;
+20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;;
+20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;;
+20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;;
+20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;;
+20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;;
+20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;;
+20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;;
+2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;;
+2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;;
+2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;;
+2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;;
+2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;;
+2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;;
+2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;;
+2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;;
+2108;SCRUPLE;So;0;ON;;;;;N;;;;;
+2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;;
+210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;;
+210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;;
+210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;;
+210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;;
+210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;;
+2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;;
+2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;;
+2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;;
+2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;;
+2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;;
+2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;;
+2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;;
+2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;;
+2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;;
+211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;;
+211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;;
+211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;;
+211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;;
+211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;;
+211F;RESPONSE;So;0;ON;;;;;N;;;;;
+2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;;
+2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;;
+2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;;
+2123;VERSICLE;So;0;ON;;;;;N;;;;;
+2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;;
+2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;;
+2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9;
+2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;;
+2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;;
+2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;;
+212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
+212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5;
+212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;;
+212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;;
+212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;;
+212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;;
+2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;;
+2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E;
+2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;;
+2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;;
+2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;;
+2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;;
+2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;;
+2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
+213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
+213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;;
+213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;;
+2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;;
+2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;;
+2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+214A;PROPERTY LINE;So;0;ON;;;;;N;;;;;
+214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;;
+214C;PER SIGN;So;0;ON;;;;;N;;;;;
+214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;;
+214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132
+214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;;
+2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;;
+2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;;
+2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;;
+2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;;
+2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;;
+2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;;
+2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;;
+215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;;
+215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;;
+215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;;
+215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;;
+215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;;
+215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;;
+2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
+2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171;
+2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172;
+2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173;
+2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174;
+2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175;
+2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176;
+2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177;
+2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178;
+2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179;
+216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A;
+216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B;
+216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C;
+216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D;
+216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E;
+216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F;
+2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160
+2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161
+2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162
+2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163
+2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164
+2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165
+2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166
+2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167
+2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168
+2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169
+217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A
+217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B
+217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C
+217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D
+217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E
+217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F
+2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;;
+2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;;
+2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;;
+2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184;
+2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183
+2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;;
+2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;;
+2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;;
+2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;;
+2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;;
+2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;;
+2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;
+2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;;
+2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;;
+2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;;
+2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;;
+2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;;
+2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;;
+219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;;
+219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;;
+219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;;
+219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;;
+219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;;
+219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;;
+21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;;
+21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;;
+21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;;
+21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;;
+21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;;
+21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;;
+21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;;
+21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;;
+21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;;
+21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;;
+21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;;
+21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;;
+21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;;
+21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;;
+21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;;
+21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;;
+21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;;
+21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;;
+21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;;
+21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;;
+21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;;
+21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;;
+21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;;
+21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;;
+21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;;
+21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;;
+21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;;
+21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;;
+21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;;
+21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;;
+21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;;
+21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;;
+21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;;
+21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;;
+21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;;
+21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;;
+21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;;
+21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;;
+21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;;
+21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;;
+21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;;
+21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;;
+21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;;
+21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;;
+21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;;
+21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;;
+21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;;
+21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;;
+21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;;
+21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;;
+21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;;
+21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;;
+21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;;
+21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;;
+21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;;
+21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;;
+21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;;
+21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;;
+21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;;
+21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;;
+21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;;
+21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;;
+21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;;
+21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;;
+21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;;
+21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;;
+21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;;
+21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;;
+21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;;
+21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
+21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;;
+21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;;
+21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+2200;FOR ALL;Sm;0;ON;;;;;N;;;;;
+2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;;
+2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;;
+2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;;
+2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;;
+2205;EMPTY SET;Sm;0;ON;;;;;N;;;;;
+2206;INCREMENT;Sm;0;ON;;;;;N;;;;;
+2207;NABLA;Sm;0;ON;;;;;N;;;;;
+2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;;
+220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;;
+220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220E;END OF PROOF;Sm;0;ON;;;;;N;;;;;
+220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;;
+2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;;
+2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;;
+2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+2214;DOT PLUS;Sm;0;ON;;;;;N;;;;;
+2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2216;SET MINUS;Sm;0;ON;;;;;Y;;;;;
+2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;;
+221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;;
+221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;;
+221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;;
+221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;;
+221E;INFINITY;Sm;0;ON;;;;;N;;;;;
+221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;;
+2220;ANGLE;Sm;0;ON;;;;;Y;;;;;
+2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;;
+2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+2223;DIVIDES;Sm;0;ON;;;;;N;;;;;
+2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;;
+2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;;
+2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2229;INTERSECTION;Sm;0;ON;;;;;N;;;;;
+222A;UNION;Sm;0;ON;;;;;N;;;;;
+222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;;
+222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;;
+222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;;
+2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;;
+2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2234;THEREFORE;Sm;0;ON;;;;;N;;;;;
+2235;BECAUSE;Sm;0;ON;;;;;N;;;;;
+2236;RATIO;Sm;0;ON;;;;;N;;;;;
+2237;PROPORTION;Sm;0;ON;;;;;N;;;;;
+2238;DOT MINUS;Sm;0;ON;;;;;N;;;;;
+2239;EXCESS;Sm;0;ON;;;;;Y;;;;;
+223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;;
+223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;;
+223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;;
+223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;;
+223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;;
+2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;;
+2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;;
+2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;;
+2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;;
+2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;;
+224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;;
+224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;;
+2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;;
+2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;;
+2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;;
+2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;;
+2259;ESTIMATES;Sm;0;ON;;;;;N;;;;;
+225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;;
+225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;;
+225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;;
+225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;;
+225E;MEASURED BY;Sm;0;ON;;;;;N;;;;;
+225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;;
+2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;;
+2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;;
+2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;;
+2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;;
+2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;;
+2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;;
+2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;;
+2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;;
+226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;;
+226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;;
+226C;BETWEEN;Sm;0;ON;;;;;N;;;;;
+226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;;
+226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;;
+226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;;
+2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;;
+2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;;
+2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;;
+2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;;
+2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;;
+2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;;
+2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;;
+2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;;
+2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;;
+2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;;
+227A;PRECEDES;Sm;0;ON;;;;;Y;;;;;
+227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;;
+2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;;
+2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;;
+2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;;
+2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;;
+2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;;
+2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;;
+2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;;
+228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;;
+228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;;
+228C;MULTISET;Sm;0;ON;;;;;Y;;;;;
+228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;;
+228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;;
+228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;;
+2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;;
+2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;;
+2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;;
+2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;;
+229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;;
+229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;;
+229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;;
+22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;;
+22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;;
+22A5;UP TACK;Sm;0;ON;;;;;N;;;;;
+22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;;
+22A7;MODELS;Sm;0;ON;;;;;Y;;;;;
+22A8;TRUE;Sm;0;ON;;;;;Y;;;;;
+22A9;FORCES;Sm;0;ON;;;;;Y;;;;;
+22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;;
+22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;;
+22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;;
+22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;;
+22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;;
+22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;;
+22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;;
+22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;;
+22BB;XOR;Sm;0;ON;;;;;N;;;;;
+22BC;NAND;Sm;0;ON;;;;;N;;;;;
+22BD;NOR;Sm;0;ON;;;;;N;;;;;
+22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;;
+22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;;
+22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;;
+22C8;BOWTIE;Sm;0;ON;;;;;N;;;;;
+22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;;
+22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;;
+22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;;
+22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;;
+22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;;
+22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;;
+22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;;
+22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;;
+22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;;
+22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;;
+22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;;
+22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;;
+22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;;
+22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;;
+22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;;
+22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;;
+22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;;
+22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;;
+22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;;
+22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;;
+22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;;
+22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;;
+22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;;
+22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;;
+22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;;
+2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;;
+2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;;
+2302;HOUSE;So;0;ON;;;;;N;;;;;
+2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;;
+2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;;
+2305;PROJECTIVE;So;0;ON;;;;;N;;;;;
+2306;PERSPECTIVE;So;0;ON;;;;;N;;;;;
+2307;WAVY LINE;So;0;ON;;;;;N;;;;;
+2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;;
+2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;;
+230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;;
+230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;;
+230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;;
+230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;;
+2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;;
+2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;;
+2312;ARC;So;0;ON;;;;;N;;;;;
+2313;SEGMENT;So;0;ON;;;;;N;;;;;
+2314;SECTOR;So;0;ON;;;;;N;;;;;
+2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;;
+2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;;
+2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;;
+2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;;
+2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;;
+231A;WATCH;So;0;ON;;;;;N;;;;;
+231B;HOURGLASS;So;0;ON;;;;;N;;;;;
+231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;;
+231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;;
+231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;;
+231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;;
+2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2322;FROWN;So;0;ON;;;;;N;;;;;
+2323;SMILE;So;0;ON;;;;;N;;;;;
+2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;;
+2325;OPTION KEY;So;0;ON;;;;;N;;;;;
+2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;;
+2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;;
+2328;KEYBOARD;So;0;ON;;;;;N;;;;;
+2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;;
+232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;;
+232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;;
+232C;BENZENE RING;So;0;ON;;;;;N;;;;;
+232D;CYLINDRICITY;So;0;ON;;;;;N;;;;;
+232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;;
+232F;SYMMETRY;So;0;ON;;;;;N;;;;;
+2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;;
+2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;;
+2332;CONICAL TAPER;So;0;ON;;;;;N;;;;;
+2333;SLOPE;So;0;ON;;;;;N;;;;;
+2334;COUNTERBORE;So;0;ON;;;;;N;;;;;
+2335;COUNTERSINK;So;0;ON;;;;;N;;;;;
+2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;;
+2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;;
+2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;;
+2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;;
+233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;;
+233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;;
+233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;;
+233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;;
+233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;;
+233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;;
+2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;;
+2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;;
+2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;;
+2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;;
+2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;;
+2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;;
+2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;;
+2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;;
+2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;;
+2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;;
+234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;;
+234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;;
+234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;;
+234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;;
+234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;;
+234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;;
+2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;;
+2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;;
+2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;;
+2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;;
+2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;;
+2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;;
+2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;;
+2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;;
+2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;;
+2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;;
+235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;;
+235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;;
+235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;;
+235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;;
+235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;;
+235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;;
+2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;;
+2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;;
+2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;;
+2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;;
+2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;;
+2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;;
+2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;;
+2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;;
+2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;;
+2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;;
+236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;;
+236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;;
+236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;;
+236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;;
+236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;;
+236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;;
+2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;;
+2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;;
+2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;;
+2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;;
+2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;;
+2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;;
+2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;;
+2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;;
+2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;;
+2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;;
+237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;;
+237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;;
+237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;;
+237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;;
+237E;BELL SYMBOL;So;0;ON;;;;;N;;;;;
+237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;;
+2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;;
+2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;;
+2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;;
+2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;;
+2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;;
+2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2388;HELM SYMBOL;So;0;ON;;;;;N;;;;;
+2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;;
+238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;;
+238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;;
+238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;;
+238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;;
+238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;;
+238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;;
+2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;;
+2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;;
+2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;;
+2398;NEXT PAGE;So;0;ON;;;;;N;;;;;
+2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;;
+23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;;
+23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;;
+23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;;
+23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;;
+23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;;
+23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;;
+23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;;
+23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;;
+23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;;
+23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;;
+23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;;
+23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;;
+23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;;
+23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;;
+23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;;
+23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;;
+23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;;
+23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;;
+23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;;
+23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;;
+23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;;
+23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;;
+23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;;
+23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;;
+23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;;
+23DA;EARTH GROUND;So;0;ON;;;;;N;;;;;
+23DB;FUSE;So;0;ON;;;;;N;;;;;
+23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;;
+23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;;
+23E5;FLATNESS;So;0;ON;;;;;N;;;;;
+23E6;AC CURRENT;So;0;ON;;;;;N;;;;;
+23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;;
+2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
+2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
+2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
+2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;;
+2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;;
+2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;;
+2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;;
+2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;;
+2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;;
+2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;;
+240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;;
+240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;;
+240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;;
+240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;;
+240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;;
+240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;;
+2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;;
+2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;;
+2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;;
+2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;;
+2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;;
+2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;;
+2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;;
+2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;;
+2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;;
+2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;;
+241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;;
+241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;;
+241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;;
+241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;;
+241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;;
+241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;;
+2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;;
+2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;;
+2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;;
+2423;OPEN BOX;So;0;ON;;;;;N;;;;;
+2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;;
+2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;;
+2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;;
+2440;OCR HOOK;So;0;ON;;;;;N;;;;;
+2441;OCR CHAIR;So;0;ON;;;;;N;;;;;
+2442;OCR FORK;So;0;ON;;;;;N;;;;;
+2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;;
+2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;;
+2445;OCR BOW TIE;So;0;ON;;;;;N;;;;;
+2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;;
+2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;;
+2448;OCR DASH;So;0;ON;;;;;N;;;;;
+2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;;
+244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;;
+2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;;
+2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;;
+2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;;
+248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;;
+248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;;
+248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;;
+248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;;
+248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;;
+248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;;
+2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;;
+2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;;
+2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;;
+2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;;
+2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;;
+2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;;
+2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;;
+2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;;
+2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;;
+2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;;
+249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;;
+249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;;
+249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;;
+249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;;
+249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;;
+249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;;
+24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;;
+24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;;
+24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;;
+24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;;
+24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;;
+24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;;
+24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;;
+24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;;
+24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;;
+24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;;
+24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;;
+24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;;
+24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;;
+24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;;
+24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;;
+24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;;
+24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;;
+24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;;
+24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;;
+24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;;
+24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;;
+24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;;
+24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0;
+24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1;
+24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2;
+24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3;
+24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4;
+24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5;
+24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6;
+24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7;
+24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8;
+24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9;
+24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA;
+24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB;
+24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC;
+24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD;
+24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE;
+24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF;
+24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0;
+24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1;
+24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2;
+24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3;
+24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4;
+24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5;
+24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6;
+24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7;
+24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8;
+24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9;
+24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6
+24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7
+24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8
+24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9
+24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA
+24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB
+24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC
+24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD
+24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE
+24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF
+24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0
+24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1
+24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2
+24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3
+24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4
+24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5
+24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6
+24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7
+24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8
+24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9
+24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA
+24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB
+24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC
+24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD
+24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE
+24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF
+24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;;
+24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;;
+24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;;
+24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;;
+24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;;
+24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;;
+24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;;
+24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;;
+24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;;
+24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;;
+24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;;
+24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;;
+24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;;
+24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;;
+24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;;
+24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;;
+24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;;
+24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;;
+24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;;
+24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;;
+24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;;
+24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;;
+2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;;
+2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;;
+2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;;
+2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;;
+2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;;
+2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;;
+2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;;
+2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;;
+2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;;
+2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;;
+250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;;
+250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;;
+250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;;
+250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;;
+250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;;
+250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;;
+2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;;
+2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;;
+2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;;
+2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;;
+2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;;
+2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;;
+2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;;
+2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;;
+2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;;
+2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;;
+251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;;
+251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;;
+251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;;
+251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;;
+251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;;
+251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;;
+2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;;
+2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;;
+2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;;
+2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;;
+2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;;
+2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;;
+2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;;
+2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;;
+2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;;
+252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;;
+252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;;
+252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;;
+252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;;
+252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;;
+252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;;
+2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;;
+2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;;
+2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;;
+2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;;
+2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;;
+2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;;
+2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;;
+2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;;
+2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;;
+2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;;
+253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;;
+253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;;
+253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;;
+253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;;
+253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;;
+253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;;
+2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;;
+2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;;
+2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;;
+2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;;
+2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;;
+2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;;
+2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;;
+2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;;
+2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;;
+254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;;
+254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;;
+254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;;
+254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;;
+254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;;
+254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;;
+2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;;
+2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;;
+2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;;
+2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;;
+2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;;
+2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;;
+2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;;
+2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;;
+2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;;
+2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;;
+255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;;
+255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;;
+255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;;
+255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;;
+255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;;
+255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;;
+2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;;
+2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;;
+2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;;
+2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;;
+2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;;
+2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;;
+2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;;
+2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;;
+2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;;
+2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;;
+256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;;
+256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;;
+256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;;
+256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;;
+256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;;
+256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;;
+2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;;
+2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;;
+2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;;
+2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;;
+2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;;
+2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;;
+2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;;
+2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;;
+2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;;
+2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;;
+257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;;
+257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;;
+257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;;
+257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;;
+257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;;
+257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;;
+2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;;
+2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2588;FULL BLOCK;So;0;ON;;;;;N;;;;;
+2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;;
+258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;;
+258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;;
+2591;LIGHT SHADE;So;0;ON;;;;;N;;;;;
+2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+2593;DARK SHADE;So;0;ON;;;;;N;;;;;
+2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;;
+2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;;
+2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;;
+2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;;
+259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;;
+25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;;
+25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;;
+25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;;
+25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;;
+25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;;
+25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;;
+25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;;
+25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;;
+25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;;
+25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;;
+25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;;
+25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;;
+25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;;
+25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;;
+25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;;
+25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;;
+25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;;
+25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;;
+25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;;
+25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;;
+25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;;
+25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;;
+25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;;
+25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;;
+25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;;
+25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;;
+25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;;
+25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;;
+25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+25C9;FISHEYE;So;0;ON;;;;;N;;;;;
+25CA;LOZENGE;So;0;ON;;;;;N;;;;;
+25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;;
+25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25CE;BULLSEYE;So;0;ON;;;;;N;;;;;
+25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;;
+25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E6;WHITE BULLET;So;0;ON;;;;;N;;;;;
+25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;;
+25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;;
+25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;;
+25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;;
+25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+2601;CLOUD;So;0;ON;;;;;N;;;;;
+2602;UMBRELLA;So;0;ON;;;;;N;;;;;
+2603;SNOWMAN;So;0;ON;;;;;N;;;;;
+2604;COMET;So;0;ON;;;;;N;;;;;
+2605;BLACK STAR;So;0;ON;;;;;N;;;;;
+2606;WHITE STAR;So;0;ON;;;;;N;;;;;
+2607;LIGHTNING;So;0;ON;;;;;N;;;;;
+2608;THUNDERSTORM;So;0;ON;;;;;N;;;;;
+2609;SUN;So;0;ON;;;;;N;;;;;
+260A;ASCENDING NODE;So;0;ON;;;;;N;;;;;
+260B;DESCENDING NODE;So;0;ON;;;;;N;;;;;
+260C;CONJUNCTION;So;0;ON;;;;;N;;;;;
+260D;OPPOSITION;So;0;ON;;;;;N;;;;;
+260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;;
+260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;;
+2610;BALLOT BOX;So;0;ON;;;;;N;;;;;
+2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;;
+2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;;
+2613;SALTIRE;So;0;ON;;;;;N;;;;;
+2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;;
+2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;;
+2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2618;SHAMROCK;So;0;ON;;;;;N;;;;;
+2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;;
+2621;CAUTION SIGN;So;0;ON;;;;;N;;;;;
+2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;;
+2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;;
+2624;CADUCEUS;So;0;ON;;;;;N;;;;;
+2625;ANKH;So;0;ON;;;;;N;;;;;
+2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;;
+2627;CHI RHO;So;0;ON;;;;;N;;;;;
+2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;;
+2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;;
+262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;;
+262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;;
+262C;ADI SHAKTI;So;0;ON;;;;;N;;;;;
+262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;;
+262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;;
+262F;YIN YANG;So;0;ON;;;;;N;;;;;
+2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;;
+2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;;
+2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;;
+2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;;
+2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;;
+2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;;
+2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;;
+2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;;
+2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;;
+263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;;
+263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;;
+263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263F;MERCURY;So;0;ON;;;;;N;;;;;
+2640;FEMALE SIGN;So;0;ON;;;;;N;;;;;
+2641;EARTH;So;0;ON;;;;;N;;;;;
+2642;MALE SIGN;So;0;ON;;;;;N;;;;;
+2643;JUPITER;So;0;ON;;;;;N;;;;;
+2644;SATURN;So;0;ON;;;;;N;;;;;
+2645;URANUS;So;0;ON;;;;;N;;;;;
+2646;NEPTUNE;So;0;ON;;;;;N;;;;;
+2647;PLUTO;So;0;ON;;;;;N;;;;;
+2648;ARIES;So;0;ON;;;;;N;;;;;
+2649;TAURUS;So;0;ON;;;;;N;;;;;
+264A;GEMINI;So;0;ON;;;;;N;;;;;
+264B;CANCER;So;0;ON;;;;;N;;;;;
+264C;LEO;So;0;ON;;;;;N;;;;;
+264D;VIRGO;So;0;ON;;;;;N;;;;;
+264E;LIBRA;So;0;ON;;;;;N;;;;;
+264F;SCORPIUS;So;0;ON;;;;;N;;;;;
+2650;SAGITTARIUS;So;0;ON;;;;;N;;;;;
+2651;CAPRICORN;So;0;ON;;;;;N;;;;;
+2652;AQUARIUS;So;0;ON;;;;;N;;;;;
+2653;PISCES;So;0;ON;;;;;N;;;;;
+2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;;
+2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;;
+2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;;
+2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;;
+2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;;
+265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;;
+265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;;
+265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;;
+265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;;
+265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;;
+2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;;
+2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;;
+2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;;
+2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;;
+2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;;
+2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;;
+2668;HOT SPRINGS;So;0;ON;;;;;N;;;;;
+2669;QUARTER NOTE;So;0;ON;;;;;N;;;;;
+266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;;
+266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;;
+266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;;
+266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;;
+266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;;
+266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;;
+2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;pete;;;
+2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;hdpe;;;
+2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;pvc;;;
+2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;ldpe;;;
+2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;pp;;;
+2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;ps;;;
+2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;other;;;
+267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;;
+267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;;
+267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;;
+2680;DIE FACE-1;So;0;ON;;;;;N;;;;;
+2681;DIE FACE-2;So;0;ON;;;;;N;;;;;
+2682;DIE FACE-3;So;0;ON;;;;;N;;;;;
+2683;DIE FACE-4;So;0;ON;;;;;N;;;;;
+2684;DIE FACE-5;So;0;ON;;;;;N;;;;;
+2685;DIE FACE-6;So;0;ON;;;;;N;;;;;
+2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;;
+2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
+2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;;
+2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;;
+268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;;
+268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;;
+268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;;
+268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;;
+268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;;
+268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;;
+2690;WHITE FLAG;So;0;ON;;;;;N;;;;;
+2691;BLACK FLAG;So;0;ON;;;;;N;;;;;
+2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;;
+2693;ANCHOR;So;0;ON;;;;;N;;;;;
+2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;;
+2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;;
+2696;SCALES;So;0;ON;;;;;N;;;;;
+2697;ALEMBIC;So;0;ON;;;;;N;;;;;
+2698;FLOWER;So;0;ON;;;;;N;;;;;
+2699;GEAR;So;0;ON;;;;;N;;;;;
+269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;;
+269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;;
+269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;;
+269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+26A0;WARNING SIGN;So;0;ON;;;;;N;;;;;
+26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;;
+26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;;
+26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;;
+26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;;
+26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;;
+26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;;
+26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;;
+26B0;COFFIN;So;0;ON;;;;;N;;;;;
+26B1;FUNERAL URN;So;0;ON;;;;;N;;;;;
+26B2;NEUTER;So;0;ON;;;;;N;;;;;
+26B3;CERES;So;0;ON;;;;;N;;;;;
+26B4;PALLAS;So;0;ON;;;;;N;;;;;
+26B5;JUNO;So;0;ON;;;;;N;;;;;
+26B6;VESTA;So;0;ON;;;;;N;;;;;
+26B7;CHIRON;So;0;ON;;;;;N;;;;;
+26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;;
+26B9;SEXTILE;So;0;ON;;;;;N;;;;;
+26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;;
+26BB;QUINCUNX;So;0;ON;;;;;N;;;;;
+26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;;
+26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
+2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;;
+2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;;
+2707;TAPE DRIVE;So;0;ON;;;;;N;;;;;
+2708;AIRPLANE;So;0;ON;;;;;N;;;;;
+2709;ENVELOPE;So;0;ON;;;;;N;;;;;
+270C;VICTORY HAND;So;0;ON;;;;;N;;;;;
+270D;WRITING HAND;So;0;ON;;;;;N;;;;;
+270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+270F;PENCIL;So;0;ON;;;;;N;;;;;
+2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+2711;WHITE NIB;So;0;ON;;;;;N;;;;;
+2712;BLACK NIB;So;0;ON;;;;;N;;;;;
+2713;CHECK MARK;So;0;ON;;;;;N;;;;;
+2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;;
+2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2717;BALLOT X;So;0;ON;;;;;N;;;;;
+2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;;
+2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;;
+271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;;
+271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;;
+271D;LATIN CROSS;So;0;ON;;;;;N;;;;;
+271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;;
+271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;;
+2720;MALTESE CROSS;So;0;ON;;;;;N;;;;;
+2721;STAR OF DAVID;So;0;ON;;;;;N;;;;;
+2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;;
+272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;;
+272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;;
+272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;;
+2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;;
+2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;;
+2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;;
+273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;;
+273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;;
+2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;;
+2744;SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2747;SPARKLE;So;0;ON;;;;;N;;;;;
+2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;;
+2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;;
+2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;;
+2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;;
+2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;;
+2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;;
+2766;FLORAL HEART;So;0;ON;;;;;N;;;;;
+2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;;
+2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;;
+2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;;
+2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;;
+277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;;
+277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;;
+277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;;
+277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;;
+277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;;
+277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;;
+2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;;
+2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;;
+2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;;
+2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;;
+2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;;
+2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;;
+2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;;
+2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;;
+278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;;
+278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;;
+278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;;
+278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;;
+278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;;
+278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;;
+2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;;
+2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;;
+2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;;
+2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;;
+2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;;
+279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;;
+279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;;
+279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;;
+279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;;
+279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;;
+279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;;
+27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;;
+27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;;
+27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;;
+27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;;
+27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;;
+27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;;
+27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;;
+27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;;
+27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;;
+27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;;
+27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;;
+27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;;
+27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;;
+27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;;
+27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;;
+27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;;
+27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;;
+27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;;
+27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;;
+27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;;
+27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;;
+27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;;
+27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;;
+27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;;
+27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;;
+27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;;
+27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;;
+27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;;
+27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;;
+27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;;
+27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;;
+27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;;
+27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;;
+27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;;
+2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;;
+2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;;
+2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;;
+2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;;
+2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;;
+293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;;
+293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;;
+2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;;
+297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;;
+2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;;
+2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;;
+2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;;
+2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;;
+2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;;
+2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;;
+2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;;
+2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;;
+298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;;
+298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;;
+298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;;
+298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;;
+298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;;
+298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;;
+2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;;
+2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;;
+2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;;
+2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;;
+299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;;
+299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;;
+299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;;
+299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;;
+299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;;
+29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;;
+29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;;
+29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;;
+29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;;
+29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;;
+29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;;
+29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;;
+29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;;
+29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;;
+29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;;
+29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;;
+29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;;
+29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;;
+29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;;
+29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;;
+29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;;
+29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;;
+29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;;
+29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;;
+29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;;
+29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;;
+29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;;
+29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;;
+29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;;
+29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;;
+29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+29FE;TINY;Sm;0;ON;;;;;N;;;;;
+29FF;MINY;Sm;0;ON;;;;;N;;;;;
+2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;;
+2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;;
+2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;;
+2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;;
+2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;;
+2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;;
+2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;;
+2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;;
+2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;;
+2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;;
+2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;;
+2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;;
+2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1D;JOIN;Sm;0;ON;;;;;N;;;;;
+2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;;
+2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;;
+2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;;
+2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;;
+2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;;
+2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;;
+2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;;
+2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;;
+2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;;
+2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;;
+2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;;
+2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;;
+2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;;
+2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;;
+2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;;
+2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;;
+2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;;
+2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;;
+2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;;
+2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;;
+2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;;
+2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;;
+2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;;
+2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;;
+2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;not independent;;;
+2ADD;NONFORKING;Sm;0;ON;;;;;N;;independent;;;
+2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;;
+2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;;
+2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;;
+2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;;
+2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;;
+2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;;
+2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;;
+2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;;
+2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;;
+2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;;
+2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;;
+2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;;
+2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;;
+2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;;
+2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;;
+2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;;
+2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;;
+2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
+2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
+2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
+2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33;
+2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34;
+2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35;
+2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36;
+2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37;
+2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38;
+2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39;
+2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A;
+2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B;
+2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C;
+2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D;
+2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E;
+2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F;
+2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40;
+2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41;
+2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42;
+2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43;
+2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44;
+2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45;
+2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46;
+2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47;
+2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48;
+2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49;
+2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A;
+2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B;
+2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C;
+2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D;
+2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E;
+2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F;
+2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50;
+2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51;
+2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52;
+2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53;
+2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54;
+2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55;
+2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56;
+2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57;
+2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58;
+2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59;
+2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A;
+2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B;
+2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C;
+2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D;
+2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E;
+2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00
+2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01
+2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02
+2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03
+2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04
+2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05
+2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06
+2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07
+2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08
+2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09
+2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A
+2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B
+2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C
+2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D
+2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E
+2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F
+2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10
+2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11
+2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12
+2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13
+2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14
+2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15
+2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16
+2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17
+2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18
+2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19
+2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A
+2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B
+2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C
+2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D
+2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E
+2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F
+2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20
+2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21
+2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22
+2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23
+2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24
+2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25
+2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26
+2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27
+2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28
+2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29
+2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A
+2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B
+2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C
+2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D
+2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E
+2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61;
+2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60
+2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B;
+2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D;
+2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D;
+2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A
+2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E
+2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68;
+2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67
+2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A;
+2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69
+2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C;
+2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B
+2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251;
+2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271;
+2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250;
+2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;;
+2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73;
+2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72
+2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;;
+2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76;
+2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75
+2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;;
+2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;;
+2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;;
+2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;;
+2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;;
+2C7C;LATIN SUBSCRIPT SMALL LETTER J;Ll;0;L;<sub> 006A;;;;N;;;;;
+2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;;
+2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81;
+2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80
+2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83;
+2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82
+2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85;
+2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84
+2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87;
+2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86
+2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89;
+2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88
+2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B;
+2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A
+2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D;
+2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C
+2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F;
+2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E
+2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91;
+2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90
+2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93;
+2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92
+2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95;
+2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94
+2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97;
+2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96
+2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99;
+2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98
+2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B;
+2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A
+2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D;
+2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C
+2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F;
+2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E
+2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1;
+2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0
+2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3;
+2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2
+2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5;
+2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4
+2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7;
+2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6
+2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9;
+2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8
+2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB;
+2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA
+2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD;
+2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC
+2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF;
+2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE
+2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1;
+2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0
+2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3;
+2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2
+2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5;
+2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4
+2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7;
+2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6
+2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9;
+2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8
+2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB;
+2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA
+2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD;
+2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC
+2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF;
+2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE
+2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1;
+2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0
+2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3;
+2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2
+2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5;
+2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4
+2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7;
+2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6
+2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9;
+2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8
+2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB;
+2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA
+2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD;
+2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC
+2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF;
+2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE
+2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1;
+2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0
+2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3;
+2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2
+2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5;
+2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4
+2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7;
+2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6
+2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9;
+2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8
+2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB;
+2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA
+2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD;
+2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC
+2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF;
+2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE
+2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1;
+2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0
+2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3;
+2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2
+2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;;
+2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;;
+2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;;
+2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;;
+2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;;
+2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;;
+2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;;
+2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
+2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;;
+2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;;
+2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0
+2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1
+2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2
+2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3
+2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4
+2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5
+2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6
+2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7
+2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8
+2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9
+2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA
+2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB
+2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC
+2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD
+2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE
+2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF
+2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0
+2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1
+2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2
+2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3
+2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4
+2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5
+2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6
+2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7
+2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8
+2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9
+2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA
+2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB
+2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC
+2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD
+2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE
+2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF
+2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0
+2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1
+2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2
+2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3
+2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4
+2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5
+2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;;
+2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;;
+2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;;
+2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;;
+2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;;
+2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;;
+2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;;
+2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;;
+2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;;
+2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;;
+2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;;
+2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;;
+2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;;
+2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;;
+2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;;
+2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;;
+2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;;
+2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;;
+2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;;
+2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;;
+2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;;
+2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;;
+2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;;
+2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;;
+2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;;
+2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;;
+2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;;
+2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;;
+2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;;
+2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;;
+2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;;
+2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;;
+2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;;
+2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;;
+2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;;
+2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;;
+2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;;
+2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;;
+2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;;
+2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;;
+2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;;
+2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;;
+2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;;
+2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;;
+2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;;
+2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;;
+2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;;
+2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;;
+2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;;
+2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;;
+2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;;
+2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;;
+2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;;
+2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;;
+2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;;
+2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;;
+2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;;
+2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;;
+2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;;
+2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;;
+2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;;
+2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;;
+2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;;
+2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;;
+2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;;
+2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;;
+2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;;
+2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;;
+2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;;
+2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;;
+2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;;
+2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;;
+2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;;
+2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;;
+2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;;
+2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;;
+2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;;
+2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;;
+2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;;
+2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;;
+2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;;
+2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;;
+2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;;
+2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;;
+2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;;
+2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;;
+2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;;
+2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;;
+2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;;
+2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;;
+2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;;
+2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;;
+2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;;
+2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;;
+2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;;
+2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;;
+2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;;
+2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;;
+2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;;
+2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;;
+2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;;
+2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;;
+2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;;
+2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;;
+2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;;
+2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;;
+2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;;
+2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;;
+2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;;
+2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;;
+2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;;
+2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;;
+2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;;
+2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;;
+2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;;
+2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;;
+2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;;
+2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;;
+2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;;
+2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;;
+2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;;
+2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;;
+2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;;
+2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;;
+2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;;
+2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;;
+2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;;
+2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;;
+2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;;
+2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;;
+2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;;
+2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;;
+2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;;
+2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;;
+2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;;
+2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;;
+2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;;
+2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;;
+2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;;
+2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;;
+2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;;
+2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;;
+2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;;
+2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;;
+2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;;
+2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;;
+2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;;
+2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;;
+2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;;
+2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;;
+2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;;
+2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;;
+2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;;
+2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;;
+2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;;
+2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;;
+2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;;
+2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;;
+2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;;
+2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;;
+2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;;
+2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;;
+2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;;
+2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;;
+2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;;
+2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;;
+2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;;
+2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;;
+2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;;
+2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;;
+2E30;RING POINT;Po;0;ON;;;;;N;;;;;
+2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
+2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
+2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
+2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;;
+2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;;
+2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;;
+2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;;
+2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;;
+2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;;
+2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;;
+2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;;
+2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;;
+2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;;
+2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;;
+2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;;
+2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;;
+2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;;
+2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;;
+2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;;
+2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;;
+2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;;
+2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;;
+2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;;
+2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;;
+2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;;
+2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;;
+2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;;
+2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;;
+2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;;
+2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;;
+2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;;
+2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;;
+2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;;
+2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;;
+2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;;
+2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;;
+2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;;
+2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;;
+2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;;
+2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;;
+2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;;
+2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;;
+2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;;
+2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;;
+2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;;
+2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;;
+2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;;
+2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;;
+2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;;
+2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;;
+2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;;
+2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;;
+2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;;
+2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;;
+2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;;
+2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;;
+2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;;
+2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;;
+2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;;
+2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;;
+2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;;
+2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;;
+2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;;
+2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;;
+2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;;
+2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;;
+2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;;
+2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;;
+2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;;
+2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;;
+2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;;
+2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;;
+2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;;
+2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;;
+2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;;
+2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;;
+2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;;
+2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;;
+2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;;
+2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;;
+2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;;
+2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;;
+2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;;
+2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;;
+2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;;
+2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;;
+2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;;
+2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;;
+2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;;
+2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;;
+2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;;
+2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;;
+2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;;
+2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;;
+2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;;
+2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;;
+2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;;
+2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;;
+2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;;
+2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;;
+2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;;
+2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;;
+2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;;
+2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;;
+2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;;
+2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;;
+2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;;
+2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;;
+2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;;
+2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;;
+2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;;
+2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;;
+2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;;
+2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;;
+2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;;
+2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;;
+2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;;
+2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;;
+2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;;
+2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;;
+2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;;
+2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;;
+2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;;
+2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;;
+2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;;
+2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;;
+2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;;
+2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;;
+2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;;
+2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;;
+2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;;
+2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;;
+2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;;
+2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;;
+2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;;
+2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;;
+2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;;
+2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;;
+2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;;
+2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;;
+2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;;
+2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;;
+2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;;
+2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;;
+2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;;
+2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;;
+2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;;
+2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;;
+2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;;
+2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;;
+2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;
+2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;;
+2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;;
+2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;;
+2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;;
+2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;;
+2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;;
+2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;;
+2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;;
+2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;;
+2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;;
+2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;;
+2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;;
+2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;;
+2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;;
+2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;;
+2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;;
+2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;;
+2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;;
+2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;;
+2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;;
+2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;;
+2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;;
+2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;;
+2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;;
+2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;;
+2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;;
+2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;;
+2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;;
+2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;;
+2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;;
+2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;;
+2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;;
+2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;;
+2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;;
+2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;;
+2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;;
+2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;;
+2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;;
+2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;;
+2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;;
+2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;;
+2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;;
+2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;;
+2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;;
+2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;;
+2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;;
+2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;;
+2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;;
+2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;;
+2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;;
+2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;;
+2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;;
+2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;;
+2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;;
+2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;;
+2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;;
+2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;;
+2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;;
+2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;;
+2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;;
+2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;;
+2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;;
+2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;;
+2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;;
+2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;;
+2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;;
+2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;;
+2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;;
+2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;;
+2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;;
+2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;;
+2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;;
+2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;;
+2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;;
+2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;;
+2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;;
+2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;;
+2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;;
+2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;;
+2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;;
+2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;;
+2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;;
+2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;;
+2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;;
+2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;;
+2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;;
+2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;;
+2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;;
+2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;;
+2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;;
+2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;;
+2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;;
+2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;;
+2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;;
+2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;;
+2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;;
+2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;;
+2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;;
+2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;;
+2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;;
+2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;;
+2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;;
+2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;;
+2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;;
+2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;;
+2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;;
+2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;;
+2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;;
+2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;;
+2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;;
+2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;;
+2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;;
+2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;;
+2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;;
+2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;;
+2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;;
+2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;;
+2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;;
+2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;;
+2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;;
+2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;;
+2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;;
+2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;;
+2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;;
+2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;;
+2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;;
+2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;;
+2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;;
+2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;;
+2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;;
+2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;;
+2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;;
+2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;;
+2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;;
+2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;;
+2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;;
+2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;;
+2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;;
+2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;;
+2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;;
+2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;;
+2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;
+2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;;
+2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;;
+2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;;
+2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;;
+2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;;
+2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;;
+2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;;
+2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;;
+2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;;
+2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;;
+2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;;
+2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;;
+2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;;
+2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;;
+2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;;
+2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;;
+2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;;
+2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;;
+2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;;
+2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;;
+2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;;
+2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;;
+2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;;
+2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;;
+2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;;
+2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;;
+2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;;
+2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;;
+2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;;
+2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;;
+2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;;
+2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;;
+2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;;
+2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;;
+2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;;
+2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;;
+2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;;
+2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;;
+2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;;
+2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;;
+2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;;
+2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;;
+3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;
+3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;;
+3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;;
+3003;DITTO MARK;Po;0;ON;;;;;N;;;;;
+3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;;
+3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;;
+3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;;
+3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;;
+3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;;
+300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;;
+300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;;
+300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;;
+300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;;
+300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;;
+300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;;
+3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;;
+3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;;
+3012;POSTAL MARK;So;0;ON;;;;;N;;;;;
+3013;GETA MARK;So;0;ON;;;;;N;;;;;
+3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;;
+3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;;
+3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;;
+3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;;
+3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;;
+3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;;
+301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;;
+301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;;
+301C;WAVE DASH;Pd;0;ON;;;;;N;;;;;
+301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
+301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;;
+3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;;
+3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;;
+3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;
+3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;;
+3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;;
+3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;;
+3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;;
+3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;;
+3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;;
+302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;;
+302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;;
+302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;;
+302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;;
+302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+3030;WAVY DASH;Pd;0;ON;;;;;N;;;;;
+3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;;
+3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;;
+3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;;
+3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;;
+3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;;
+3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;;
+3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;;
+303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;;
+303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+303C;MASU MARK;Lo;0;L;;;;;N;;;;;
+303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;;
+303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;;
+303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;;
+3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;;
+3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;;
+3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;;
+3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;;
+3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;;
+304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;;
+304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;;
+304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;;
+304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;;
+304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;;
+3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;;
+3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;;
+3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;;
+3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;;
+3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;;
+3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;;
+3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;;
+3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;;
+3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;;
+3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;;
+305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;;
+305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;;
+305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;;
+305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;;
+305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;;
+305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;;
+3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;;
+3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;;
+3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;;
+3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;;
+3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;;
+3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;;
+3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;;
+3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;;
+3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;;
+306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;;
+306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;;
+306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;;
+306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;;
+306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;;
+306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;;
+3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;;
+3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;;
+3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;;
+3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;;
+3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;;
+3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;;
+3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;;
+3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;;
+3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;;
+3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;;
+307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;;
+307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;;
+307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;;
+307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;;
+307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;;
+307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;;
+3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;;
+3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;;
+3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;;
+3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;;
+3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;;
+3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;;
+3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;;
+308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;;
+308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;;
+308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;;
+308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;;
+308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;;
+3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;;
+3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;;
+3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;;
+3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;;
+3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;;
+3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;;
+309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;;
+309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;;
+309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;;
+309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;;
+309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;;
+30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;;
+30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;;
+30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;;
+30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;;
+30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;;
+30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;;
+30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;;
+30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;;
+30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;;
+30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;;
+30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;;
+30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;;
+30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;;
+30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;;
+30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;;
+30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;;
+30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;;
+30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;;
+30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;;
+30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;;
+30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;;
+30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;;
+30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;;
+30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;;
+30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;;
+30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;;
+30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;;
+30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;;
+30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;;
+30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;;
+30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;;
+30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;;
+30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;;
+30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;;
+30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;;
+30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;;
+30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;;
+30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;;
+30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;;
+30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;;
+30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;;
+30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;;
+30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;;
+30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;;
+30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;;
+30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;;
+30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;;
+30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;;
+30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;;
+30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;;
+30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;;
+30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;;
+30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;;
+30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;;
+30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;;
+30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;;
+30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;;
+30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;;
+30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;;
+30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;;
+30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;;
+30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;;
+30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;;
+30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;;
+30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;;
+30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;;
+30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;;
+30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;;
+30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;;
+30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;;
+30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;;
+30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;;
+30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;;
+30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;;
+30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;;
+30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;;
+30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;;
+30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;;
+30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;;
+30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;;
+30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;;
+30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;;
+3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;;
+3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;;
+3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;;
+3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;;
+3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;;
+310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;;
+310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;;
+310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;;
+310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;;
+310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;;
+310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;;
+3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;;
+3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;;
+3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;;
+3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;;
+3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;;
+3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;;
+3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;;
+3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;;
+3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;;
+3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;;
+311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;;
+311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;;
+311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;;
+311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;;
+311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;;
+311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;;
+3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;;
+3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;;
+3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;;
+3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;;
+3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;;
+3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;;
+3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;;
+3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;;
+3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;;
+3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;;
+312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;;
+312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
+312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
+312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;;
+3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
+3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
+3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
+3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;;
+3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;;
+3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;;
+3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;;
+3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;;
+3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;;
+313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;;
+313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;;
+313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;;
+313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;;
+313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;;
+313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;;
+3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;;
+3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;;
+3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;;
+3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;;
+3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;;
+3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;;
+3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;;
+3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;;
+3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;;
+3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;;
+314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;;
+314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;;
+314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;;
+314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;;
+314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;;
+314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;;
+3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;;
+3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;;
+3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;;
+3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;;
+3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;;
+3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;;
+3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;;
+3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;;
+3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;;
+3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;;
+315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;;
+315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;;
+315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;;
+315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;;
+315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;;
+315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;;
+3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;;
+3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;;
+3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;;
+3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;;
+3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;;
+3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;;
+3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;;
+3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;;
+3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;;
+3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;;
+316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;;
+316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;;
+316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;;
+316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;;
+316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;;
+316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;;
+3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;;
+3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;;
+3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;;
+3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;;
+3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;;
+3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;;
+3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;;
+3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;;
+3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;;
+3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;;
+317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;;
+317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;;
+317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;;
+317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;;
+317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;;
+317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;;
+3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;;
+3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;;
+3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;;
+3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;;
+3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;;
+3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;;
+3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;;
+3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;;
+3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;;
+3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;;
+318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;;
+318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;;
+318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;;
+318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;;
+318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
+3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;;
+3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;;
+3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;Kaeriten;;;
+3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;;
+3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;;
+3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;Kaeriten;;;
+3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;Kaeriten;;;
+319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;Kaeriten;;;
+319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;Kaeriten;;;
+319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;Kaeriten;;;
+319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;Kaeriten;;;
+319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;Kaeriten;;;
+319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;;
+31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;;
+31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;;
+31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;;
+31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;;
+31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;;
+31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;;
+31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;;
+31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;;
+31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;;
+31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;;
+31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;;
+31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;;
+31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;;
+31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;;
+31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;;
+31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;;
+31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;;
+31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;;
+31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;;
+31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;;
+31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;;
+31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;;
+31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;;
+31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;;
+31C0;CJK STROKE T;So;0;ON;;;;;N;;;;;
+31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;;
+31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;;
+31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;;
+31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;;
+31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;;
+31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;;
+31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;;
+31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;;
+31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;;
+31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;;
+31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;;
+31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;;
+31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;;
+31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;;
+31CF;CJK STROKE N;So;0;ON;;;;;N;;;;;
+31D0;CJK STROKE H;So;0;ON;;;;;N;;;;;
+31D1;CJK STROKE S;So;0;ON;;;;;N;;;;;
+31D2;CJK STROKE P;So;0;ON;;;;;N;;;;;
+31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;;
+31D4;CJK STROKE D;So;0;ON;;;;;N;;;;;
+31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;;
+31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;;
+31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;;
+31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;;
+31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;;
+31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;;
+31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;;
+31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;;
+31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;;
+31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;;
+31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;;
+31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;;
+31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;;
+31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;;
+31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;;
+31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;;
+31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;;
+31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;;
+31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;;
+31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;;
+31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;;
+31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;;
+31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;;
+31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;;
+31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;;
+31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;;
+31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;;
+31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;;
+31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;;
+31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;;
+31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;;
+3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;;
+3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;;
+3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;;
+3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;;
+3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;;
+3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;;
+3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;;
+3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;;
+3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;;
+3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;;
+320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;;
+320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;;
+320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;;
+320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;;
+320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;;
+320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;;
+3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;;
+3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;;
+3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;;
+3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;;
+3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;;
+3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;;
+3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;;
+3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;;
+3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;;
+3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;;
+321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
+321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
+321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
+321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;;
+321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;;
+3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;;
+322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;;
+322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;;
+322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;;
+322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;;
+322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;;
+322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;;
+3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;;
+3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;;
+3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;;
+3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;;
+3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;;
+3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;;
+3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;;
+3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;;
+3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;;
+3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;;
+323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;;
+323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;;
+323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;;
+323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;;
+323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;;
+323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;;
+3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;;
+3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;;
+3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;;
+3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;;
+3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;;
+3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;;
+3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;;
+3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;;
+3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;;
+3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;;
+3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;;
+3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;;
+3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;;
+3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;;
+325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;;
+325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;;
+325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;;
+325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;;
+325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;;
+325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;;
+3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;;
+3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;;
+3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;;
+3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;;
+3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;;
+3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;;
+3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;;
+3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;;
+3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;;
+3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;;
+326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;;
+326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;;
+326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;;
+326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;;
+326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;;
+326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;;
+3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;;
+3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;;
+3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;;
+3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;;
+3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;;
+3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;;
+3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;;
+3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;;
+3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;;
+3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;;
+327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;;
+327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
+327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;;
+327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;;
+327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;;
+327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
+3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
+3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
+3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;;
+3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;;
+3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;;
+3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;;
+3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;;
+3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;;
+3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;;
+3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;;
+328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;;
+328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;;
+328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;;
+328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;;
+328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;;
+328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;;
+3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;;
+3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;;
+3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;;
+3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;;
+3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;;
+3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;;
+3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;;
+3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;;
+3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;;
+3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;;
+329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;;
+329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;;
+329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;;
+329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;;
+329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;;
+329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;;
+32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;;
+32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;;
+32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;;
+32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;;
+32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;;
+32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;;
+32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;;
+32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;;
+32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;;
+32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;;
+32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;;
+32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;;
+32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;;
+32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;;
+32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;;
+32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;;
+32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;;
+32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;;
+32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;;
+32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;;
+32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;;
+32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;;
+32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;;
+32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;;
+32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;;
+32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;;
+32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;;
+32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;;
+32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;;
+32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;;
+32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;;
+32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;;
+32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;;
+32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;;
+32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;;
+32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;;
+32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;;
+32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;;
+32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;;
+32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;;
+32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;;
+32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;;
+32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;;
+32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;;
+32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;;
+32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;;
+32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;;
+32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;;
+32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;;
+32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;;
+32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;;
+32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;;
+32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;;
+32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;;
+32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;;
+32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;;
+32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;;
+32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;;
+32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;;
+32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;;
+32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;;
+32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;;
+32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;;
+32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;;
+32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;;
+32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;;
+32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;;
+32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;;
+32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;;
+32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;;
+32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;;
+32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;;
+32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;;
+32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;;
+32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;;
+32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;;
+32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;;
+32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;;
+32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;;
+32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;;
+32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;;
+32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;;
+32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;;
+32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;;
+32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;;
+32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;;
+32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;;
+32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;;
+32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;;
+32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;;
+32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;;
+32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;;
+32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;;
+32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;;
+32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;;
+3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;;
+3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;;
+3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;;
+3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;;
+3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;;
+3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;;
+3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;;
+3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;;
+3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;;
+3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;;
+330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;;
+330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;;
+330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;;
+330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;;
+330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;;
+330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;;
+3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;;
+3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;;
+3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;;
+3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;;
+3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;;
+3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;;
+3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;;
+3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;;
+3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;;
+3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;;
+331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;;
+331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;;
+331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;;
+331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;;
+331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;;
+331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;;
+3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;;
+3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;;
+3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;;
+3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;;
+3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;;
+3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;;
+3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;;
+3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;;
+3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;;
+3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;;
+332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;;
+332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;;
+332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;;
+332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;;
+332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;;
+332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;;
+3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;;
+3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;;
+3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;;
+3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;;
+3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;;
+3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;;
+3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;;
+3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;;
+3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;;
+3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;;
+333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;;
+333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;;
+333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;;
+333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;;
+333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;;
+333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;;
+3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;;
+3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;;
+3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;;
+3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;;
+3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;;
+3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;;
+3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;;
+3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;;
+3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;;
+3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;;
+334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;;
+334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;;
+334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;;
+334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;;
+334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;;
+334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;;
+3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;;
+3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;;
+3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;;
+3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;;
+3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;;
+3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;;
+3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;;
+3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;;
+3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;;
+3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;;
+335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;;
+335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;;
+335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;;
+335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;;
+335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;;
+335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;;
+3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;;
+3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;;
+3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;;
+3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;;
+3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;;
+3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;;
+3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;;
+3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;;
+3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;;
+3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;;
+336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;;
+336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;;
+336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;;
+336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;;
+336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;;
+336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;;
+3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;;
+3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;;
+3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;;
+3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;;
+3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;;
+3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;;
+3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;;
+3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;;
+3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;;
+3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;;
+337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;;
+337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;;
+337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;;
+337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;;
+337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;;
+337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;;
+3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;;
+3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;;
+3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;;
+3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;;
+3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;;
+3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;;
+3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;;
+3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;;
+3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;;
+3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;;
+338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;;
+338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;;
+338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;;
+338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;;
+338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;;
+338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;;
+3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;;
+3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;;
+3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;;
+3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;;
+3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;;
+3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;;
+3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;;
+3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;;
+3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;;
+3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;;
+339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;;
+339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;;
+339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;;
+339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;;
+339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;;
+339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;;
+33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;;
+33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;;
+33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;;
+33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;;
+33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;;
+33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;;
+33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;;
+33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;;
+33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;;
+33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;;
+33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;;
+33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;;
+33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;;
+33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;;
+33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;;
+33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;;
+33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;;
+33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;;
+33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;;
+33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;;
+33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;;
+33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;;
+33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;;
+33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;;
+33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;;
+33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;;
+33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;;
+33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;;
+33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;;
+33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;;
+33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;;
+33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;;
+33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;;
+33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;;
+33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;;
+33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;;
+33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;;
+33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;;
+33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;;
+33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;;
+33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;;
+33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;;
+33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;;
+33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;;
+33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;;
+33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;;
+33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;;
+33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;;
+33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;;
+33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;;
+33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;;
+33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;;
+33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;;
+33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;;
+33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;;
+33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;;
+33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;;
+33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;;
+33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;;
+33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;;
+33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;;
+33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;;
+33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;;
+33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;;
+33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;;
+33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;;
+33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;;
+33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;;
+33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;;
+33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;;
+33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;;
+33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;;
+33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;;
+33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;;
+33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;;
+33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;;
+33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;;
+33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;;
+33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;;
+33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;;
+33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;;
+33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;;
+33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;;
+33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;;
+33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;;
+33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;;
+33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;;
+33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;;
+33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;;
+33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;;
+33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;;
+33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;;
+33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;;
+33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;;
+33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;;
+33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;;
+4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;;
+4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;;
+4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;;
+4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;;
+4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;;
+4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;;
+4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;;
+4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;;
+4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;;
+4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;;
+4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;;
+4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;;
+4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;;
+4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;;
+4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;;
+4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;;
+4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;;
+4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;;
+4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;;
+4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;;
+4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;;
+4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;;
+4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;;
+4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;;
+4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;;
+4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;;
+4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;;
+4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;;
+4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;;
+4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;;
+4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;;
+4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;;
+4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;;
+4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;;
+4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;;
+4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;;
+4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;;
+4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;;
+4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;;
+4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;;
+4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;;
+4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;;
+4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;;
+4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;;
+4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;;
+4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;;
+4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;;
+4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;;
+4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;;
+4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;;
+4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;;
+4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;;
+4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;;
+4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;;
+4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;;
+4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;;
+4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
+4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
+A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
+A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
+A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;;
+A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;;
+A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;;
+A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;;
+A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;;
+A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;;
+A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;;
+A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;;
+A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;;
+A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;;
+A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;;
+A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;;
+A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;;
+A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;;
+A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;;
+A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;;
+A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
+A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;;
+A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;;
+A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;;
+A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;;
+A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;;
+A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;;
+A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;;
+A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;;
+A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;;
+A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;;
+A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;;
+A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;;
+A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;;
+A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;;
+A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;;
+A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;;
+A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;;
+A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;;
+A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;;
+A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;;
+A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;;
+A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;;
+A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;;
+A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;;
+A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;;
+A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;;
+A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;;
+A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;;
+A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;;
+A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;;
+A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;;
+A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;;
+A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;;
+A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;;
+A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;;
+A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;;
+A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;;
+A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;;
+A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;;
+A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;;
+A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;;
+A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;;
+A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;;
+A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;;
+A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;;
+A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;;
+A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;;
+A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;;
+A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;;
+A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;;
+A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;;
+A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;;
+A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;;
+A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;;
+A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;;
+A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;;
+A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;;
+A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;;
+A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;;
+A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;;
+A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;;
+A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;;
+A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;;
+A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;;
+A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;;
+A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;;
+A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;;
+A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;;
+A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;;
+A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;;
+A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;;
+A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;;
+A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;;
+A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;;
+A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;;
+A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;;
+A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;;
+A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;;
+A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;;
+A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;;
+A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;;
+A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;;
+A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;;
+A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;;
+A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;;
+A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;;
+A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;;
+A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;;
+A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;;
+A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;;
+A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;;
+A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;;
+A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;;
+A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;;
+A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;;
+A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;;
+A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;;
+A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;;
+A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;;
+A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;;
+A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;;
+A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;;
+A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;;
+A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;;
+A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;;
+A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;;
+A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;;
+A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;;
+A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;;
+A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;;
+A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;;
+A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;;
+A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;;
+A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;;
+A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;;
+A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;;
+A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;;
+A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;;
+A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;;
+A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;;
+A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;;
+A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;;
+A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;;
+A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;;
+A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;;
+A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;;
+A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;;
+A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;;
+A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;;
+A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;;
+A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;;
+A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;;
+A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;;
+A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;;
+A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;;
+A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;;
+A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;;
+A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;;
+A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;;
+A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;;
+A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;;
+A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;;
+A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;;
+A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;;
+A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;;
+A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;;
+A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;;
+A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;;
+A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;;
+A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;;
+A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;;
+A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;;
+A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;;
+A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;;
+A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;;
+A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;;
+A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;;
+A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;;
+A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;;
+A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;;
+A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;;
+A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;;
+A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;;
+A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;;
+A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;;
+A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;;
+A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;;
+A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;;
+A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;;
+A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;;
+A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;;
+A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;;
+A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;;
+A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;;
+A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;;
+A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;;
+A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;;
+A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;;
+A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;;
+A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;;
+A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;;
+A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;;
+A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;;
+A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;;
+A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;;
+A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;;
+A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;;
+A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;;
+A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;;
+A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;;
+A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;;
+A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;;
+A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;;
+A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;;
+A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;;
+A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;;
+A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;;
+A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;;
+A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;;
+A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;;
+A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;;
+A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;;
+A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;;
+A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;;
+A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;;
+A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;;
+A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;;
+A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;;
+A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;;
+A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;;
+A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;;
+A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;;
+A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;;
+A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;;
+A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;;
+A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;;
+A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;;
+A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;;
+A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;;
+A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;;
+A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;;
+A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;;
+A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;;
+A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;;
+A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;;
+A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;;
+A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;;
+A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;;
+A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;;
+A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;;
+A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;;
+A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;;
+A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;;
+A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;;
+A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;;
+A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;;
+A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;;
+A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;;
+A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;;
+A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;;
+A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;;
+A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;;
+A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;;
+A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;;
+A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;;
+A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;;
+A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;;
+A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;;
+A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;;
+A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;;
+A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;;
+A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;;
+A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;;
+A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;;
+A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;;
+A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;;
+A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;;
+A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;;
+A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;;
+A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;;
+A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;;
+A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;;
+A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;;
+A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;;
+A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;;
+A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;;
+A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;;
+A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;;
+A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;;
+A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;;
+A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;;
+A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;;
+A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;;
+A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;;
+A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;;
+A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;;
+A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;;
+A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;;
+A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;;
+A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;;
+A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;;
+A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;;
+A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;;
+A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;;
+A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;;
+A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;;
+A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;;
+A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;;
+A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;;
+A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;;
+A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;;
+A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;;
+A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;;
+A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;;
+A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;;
+A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;;
+A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;;
+A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;;
+A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;;
+A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;;
+A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;;
+A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;;
+A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;;
+A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;;
+A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;;
+A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;;
+A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;;
+A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;;
+A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;;
+A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;;
+A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;;
+A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;;
+A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;;
+A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;;
+A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;;
+A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;;
+A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;;
+A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;;
+A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;;
+A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;;
+A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;;
+A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;;
+A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;;
+A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;;
+A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;;
+A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;;
+A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;;
+A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;;
+A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;;
+A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;;
+A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;;
+A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;;
+A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;;
+A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;;
+A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;;
+A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;;
+A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;;
+A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;;
+A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;;
+A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;;
+A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;;
+A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;;
+A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;;
+A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;;
+A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;;
+A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;;
+A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;;
+A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;;
+A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;;
+A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;;
+A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;;
+A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;;
+A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;;
+A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;;
+A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;;
+A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;;
+A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;;
+A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;;
+A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;;
+A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;;
+A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;;
+A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;;
+A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;;
+A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;;
+A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;;
+A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;;
+A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;;
+A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;;
+A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;;
+A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;;
+A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;;
+A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;;
+A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;;
+A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;;
+A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;;
+A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;;
+A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;;
+A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;;
+A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;;
+A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;;
+A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;;
+A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;;
+A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;;
+A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;;
+A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;;
+A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;;
+A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;;
+A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;;
+A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;;
+A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;;
+A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;;
+A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;;
+A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;;
+A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;;
+A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;;
+A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;;
+A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;;
+A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;;
+A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;;
+A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;;
+A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;;
+A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;;
+A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;;
+A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;;
+A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;;
+A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;;
+A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;;
+A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;;
+A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;;
+A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;;
+A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;;
+A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;;
+A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;;
+A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;;
+A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;;
+A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;;
+A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;;
+A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;;
+A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;;
+A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;;
+A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;;
+A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;;
+A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;;
+A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;;
+A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;;
+A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;;
+A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;;
+A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;;
+A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;;
+A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;;
+A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;;
+A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;;
+A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;;
+A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;;
+A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;;
+A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;;
+A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;;
+A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;;
+A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;;
+A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;;
+A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;;
+A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;;
+A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;;
+A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;;
+A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;;
+A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;;
+A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;;
+A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;;
+A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;;
+A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;;
+A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;;
+A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;;
+A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;;
+A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;;
+A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;;
+A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;;
+A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;;
+A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;;
+A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;;
+A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;;
+A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;;
+A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;;
+A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;;
+A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;;
+A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;;
+A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;;
+A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;;
+A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;;
+A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;;
+A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;;
+A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;;
+A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;;
+A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;;
+A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;;
+A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;;
+A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;;
+A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;;
+A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;;
+A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;;
+A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;;
+A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;;
+A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;;
+A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;;
+A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;;
+A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;;
+A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;;
+A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;;
+A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;;
+A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;;
+A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;;
+A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;;
+A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;;
+A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;;
+A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;;
+A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;;
+A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;;
+A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;;
+A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;;
+A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;;
+A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;;
+A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;;
+A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;;
+A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;;
+A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;;
+A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;;
+A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;;
+A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;;
+A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;;
+A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;;
+A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;;
+A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;;
+A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;;
+A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;;
+A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;;
+A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;;
+A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;;
+A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;;
+A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;;
+A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;;
+A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;;
+A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;;
+A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;;
+A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;;
+A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;;
+A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;;
+A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;;
+A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;;
+A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;;
+A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;;
+A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;;
+A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;;
+A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;;
+A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;;
+A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;;
+A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;;
+A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;;
+A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;;
+A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;;
+A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;;
+A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;;
+A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;;
+A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;;
+A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;;
+A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;;
+A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;;
+A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;;
+A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;;
+A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;;
+A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;;
+A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;;
+A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;;
+A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;;
+A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;;
+A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;;
+A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;;
+A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;;
+A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;;
+A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;;
+A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;;
+A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;;
+A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;;
+A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;;
+A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;;
+A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;;
+A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;;
+A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;;
+A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;;
+A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;;
+A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;;
+A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;;
+A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;;
+A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;;
+A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;;
+A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;;
+A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;;
+A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;;
+A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;;
+A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;;
+A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;;
+A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;;
+A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;;
+A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;;
+A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;;
+A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;;
+A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;;
+A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;;
+A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;;
+A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;;
+A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;;
+A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;;
+A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;;
+A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;;
+A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;;
+A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;;
+A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;;
+A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;;
+A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;;
+A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;;
+A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;;
+A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;;
+A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;;
+A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;;
+A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;;
+A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;;
+A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;;
+A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;;
+A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;;
+A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;;
+A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;;
+A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;;
+A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;;
+A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;;
+A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;;
+A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;;
+A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;;
+A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;;
+A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;;
+A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;;
+A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;;
+A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;;
+A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;;
+A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;;
+A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;;
+A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;;
+A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;;
+A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;;
+A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;;
+A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;;
+A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;;
+A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;;
+A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;;
+A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;;
+A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;;
+A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;;
+A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;;
+A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;;
+A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;;
+A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;;
+A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;;
+A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;;
+A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;;
+A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;;
+A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;;
+A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;;
+A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;;
+A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;;
+A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;;
+A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;;
+A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;;
+A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;;
+A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;;
+A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;;
+A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;;
+A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;;
+A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;;
+A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;;
+A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;;
+A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;;
+A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;;
+A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;;
+A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;;
+A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;;
+A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;;
+A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;;
+A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;;
+A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;;
+A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;;
+A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;;
+A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;;
+A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;;
+A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;;
+A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;;
+A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;;
+A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;;
+A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;;
+A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;;
+A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;;
+A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;;
+A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;;
+A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;;
+A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;;
+A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;;
+A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;;
+A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;;
+A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;;
+A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;;
+A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;;
+A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;;
+A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;;
+A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;;
+A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;;
+A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;;
+A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;;
+A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;;
+A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;;
+A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;;
+A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;;
+A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;;
+A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;;
+A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;;
+A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;;
+A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;;
+A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;;
+A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;;
+A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;;
+A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;;
+A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;;
+A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;;
+A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;;
+A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;;
+A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;;
+A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;;
+A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;;
+A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;;
+A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;;
+A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;;
+A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;;
+A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;;
+A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;;
+A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;;
+A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;;
+A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;;
+A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;;
+A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;;
+A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;;
+A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;;
+A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;;
+A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;;
+A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;;
+A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;;
+A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;;
+A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;;
+A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;;
+A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;;
+A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;;
+A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;;
+A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;;
+A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;;
+A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;;
+A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;;
+A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;;
+A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;;
+A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;;
+A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;;
+A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;;
+A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;;
+A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;;
+A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;;
+A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;;
+A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;;
+A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;;
+A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;;
+A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;;
+A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;;
+A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;;
+A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;;
+A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;;
+A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;;
+A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;;
+A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;;
+A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;;
+A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;;
+A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;;
+A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;;
+A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;;
+A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;;
+A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;;
+A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;;
+A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;;
+A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;;
+A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;;
+A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;;
+A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;;
+A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;;
+A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;;
+A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;;
+A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;;
+A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;;
+A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;;
+A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;;
+A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;;
+A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;;
+A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;;
+A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;;
+A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;;
+A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;;
+A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;;
+A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;;
+A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;;
+A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;;
+A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;;
+A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;;
+A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;;
+A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;;
+A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;;
+A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;;
+A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;;
+A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;;
+A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;;
+A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;;
+A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;;
+A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;;
+A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;;
+A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;;
+A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;;
+A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;;
+A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;;
+A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;;
+A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;;
+A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;;
+A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;;
+A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;;
+A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;;
+A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;;
+A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;;
+A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;;
+A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;;
+A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;;
+A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;;
+A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;;
+A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;;
+A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;;
+A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;;
+A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;;
+A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;;
+A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;;
+A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;;
+A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;;
+A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;;
+A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;;
+A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;;
+A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;;
+A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;;
+A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;;
+A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;;
+A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;;
+A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;;
+A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;;
+A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;;
+A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;;
+A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;;
+A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;;
+A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;;
+A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;;
+A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;;
+A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;;
+A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;;
+A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;;
+A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;;
+A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;;
+A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;;
+A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;;
+A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;;
+A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;;
+A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;;
+A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;;
+A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;;
+A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;;
+A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;;
+A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;;
+A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;;
+A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;;
+A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;;
+A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;;
+A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;;
+A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;;
+A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;;
+A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;;
+A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;;
+A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;;
+A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;;
+A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;;
+A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;;
+A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;;
+A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;;
+A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;;
+A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;;
+A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;;
+A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;;
+A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;;
+A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;;
+A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;;
+A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;;
+A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;;
+A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;;
+A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;;
+A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;;
+A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;;
+A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;;
+A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;;
+A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;;
+A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;;
+A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;;
+A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;;
+A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;;
+A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;;
+A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;;
+A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;;
+A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;;
+A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;;
+A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;;
+A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;;
+A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;;
+A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;;
+A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;;
+A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;;
+A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;;
+A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;;
+A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;;
+A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;;
+A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;;
+A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;;
+A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;;
+A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;;
+A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;;
+A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;;
+A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;;
+A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;;
+A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;;
+A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;;
+A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;;
+A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;;
+A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;;
+A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;;
+A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;;
+A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;;
+A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;;
+A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;;
+A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;;
+A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;;
+A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;;
+A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;;
+A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;;
+A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;;
+A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;;
+A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;;
+A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;;
+A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;;
+A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;;
+A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;;
+A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;;
+A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;;
+A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;;
+A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;;
+A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;;
+A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;;
+A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;;
+A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;;
+A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;;
+A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;;
+A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;;
+A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;;
+A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;;
+A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;;
+A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;;
+A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;;
+A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;;
+A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;;
+A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;;
+A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;;
+A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;;
+A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;;
+A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;;
+A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;;
+A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;;
+A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;;
+A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;;
+A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;;
+A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;;
+A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;;
+A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;;
+A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;;
+A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;;
+A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;;
+A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;;
+A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;;
+A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;;
+A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;;
+A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;;
+A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;;
+A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;;
+A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;;
+A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;;
+A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;;
+A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;;
+A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;;
+A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;;
+A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;;
+A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;;
+A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;;
+A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;;
+A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;;
+A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;;
+A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;;
+A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;;
+A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;;
+A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;;
+A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;;
+A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;;
+A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;;
+A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;;
+A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;;
+A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;;
+A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;;
+A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;;
+A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;;
+A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;;
+A491;YI RADICAL LI;So;0;ON;;;;;N;;;;;
+A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;;
+A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;;
+A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;;
+A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;;
+A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;;
+A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;;
+A498;YI RADICAL MI;So;0;ON;;;;;N;;;;;
+A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;;
+A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;;
+A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;;
+A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;;
+A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;;
+A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;;
+A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;;
+A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;;
+A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;;
+A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;;
+A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;;
+A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;;
+A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;;
+A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;;
+A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;;
+A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;;
+A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;;
+A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;;
+A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;;
+A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;;
+A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;;
+A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;;
+A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;;
+A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;;
+A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;;
+A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;;
+A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;;
+A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;;
+A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;;
+A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;;
+A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;;
+A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;;
+A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;;
+A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;;
+A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;;
+A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;;
+A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;;
+A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;;
+A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;;
+A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;;
+A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;;
+A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;;
+A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;;
+A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;;
+A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;;
+A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;;
+A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;;
+A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;;
+A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;;
+A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;;
+A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;;
+A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;;
+A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;;
+A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;;
+A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;;
+A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;;
+A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;;
+A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;;
+A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;;
+A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;;
+A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;;
+A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;;
+A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;;
+A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;;
+A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;;
+A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;;
+A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;;
+A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;;
+A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;;
+A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;;
+A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;;
+A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;;
+A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;;
+A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;;
+A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;;
+A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;;
+A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;;
+A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;;
+A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;;
+A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;;
+A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;;
+A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;;
+A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;;
+A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;;
+A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;;
+A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;;
+A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;;
+A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;;
+A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;;
+A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;;
+A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;;
+A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;;
+A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;;
+A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;;
+A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;;
+A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;;
+A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;;
+A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;;
+A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;;
+A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;;
+A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;;
+A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;;
+A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;;
+A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;;
+A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;;
+A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;;
+A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;;
+A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;;
+A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;;
+A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;;
+A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;;
+A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;;
+A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;;
+A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;;
+A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;;
+A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;;
+A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;;
+A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;;
+A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;;
+A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;;
+A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;;
+A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;;
+A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;;
+A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;;
+A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;;
+A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;;
+A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;;
+A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;;
+A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;;
+A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;;
+A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;;
+A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;;
+A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;;
+A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;;
+A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;;
+A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;;
+A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;;
+A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;;
+A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;;
+A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;;
+A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;;
+A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;;
+A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;;
+A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;;
+A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;;
+A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;;
+A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;;
+A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;;
+A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;;
+A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;;
+A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;;
+A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;;
+A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;;
+A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;;
+A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;;
+A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;;
+A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;;
+A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;;
+A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;;
+A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;;
+A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;;
+A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;;
+A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;;
+A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;;
+A60D;VAI COMMA;Po;0;ON;;;;;N;;;;;
+A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;;
+A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;;
+A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;;
+A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;;
+A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;;
+A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;;
+A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;;
+A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;;
+A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;;
+A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;;
+A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;;
+A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;;
+A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;;
+A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;;
+A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;;
+A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;;
+A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;;
+A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;;
+A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;;
+A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;;
+A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
+A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
+A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643;
+A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642
+A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645;
+A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644
+A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647;
+A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646
+A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649;
+A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648
+A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B;
+A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A
+A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D;
+A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C
+A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
+A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E
+A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651;
+A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650
+A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653;
+A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652
+A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655;
+A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654
+A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657;
+A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656
+A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659;
+A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658
+A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B;
+A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A
+A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D;
+A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C
+A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F;
+A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
+A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663;
+A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662
+A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665;
+A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664
+A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667;
+A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666
+A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669;
+A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668
+A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B;
+A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A
+A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D;
+A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C
+A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;;
+A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;;
+A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;;
+A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;;
+A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;;
+A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;;
+A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;;
+A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681;
+A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680
+A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683;
+A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682
+A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685;
+A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684
+A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687;
+A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686
+A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689;
+A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688
+A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B;
+A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A
+A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D;
+A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C
+A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F;
+A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E
+A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691;
+A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690
+A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693;
+A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692
+A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695;
+A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694
+A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697;
+A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696
+A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;;
+A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;;
+A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;;
+A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;;
+A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;;
+A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;;
+A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;;
+A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;;
+A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;;
+A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;;
+A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;;
+A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;;
+A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;;
+A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;;
+A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;;
+A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;;
+A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723;
+A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722
+A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725;
+A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724
+A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727;
+A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726
+A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729;
+A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728
+A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B;
+A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A
+A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D;
+A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C
+A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F;
+A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E
+A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;;
+A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;;
+A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733;
+A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732
+A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735;
+A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734
+A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737;
+A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736
+A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739;
+A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738
+A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B;
+A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A
+A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D;
+A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C
+A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F;
+A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E
+A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741;
+A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740
+A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743;
+A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742
+A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745;
+A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744
+A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747;
+A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746
+A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749;
+A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748
+A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B;
+A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A
+A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D;
+A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C
+A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F;
+A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E
+A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751;
+A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750
+A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753;
+A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752
+A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755;
+A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754
+A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757;
+A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756
+A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759;
+A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758
+A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B;
+A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A
+A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D;
+A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C
+A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F;
+A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E
+A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761;
+A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760
+A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763;
+A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762
+A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765;
+A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764
+A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767;
+A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766
+A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769;
+A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768
+A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B;
+A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A
+A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D;
+A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C
+A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F;
+A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E
+A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;;
+A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;;
+A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;;
+A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;;
+A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;;
+A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;;
+A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;;
+A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;;
+A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;;
+A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A;
+A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779
+A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C;
+A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B
+A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79;
+A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F;
+A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E
+A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781;
+A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780
+A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783;
+A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782
+A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785;
+A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784
+A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787;
+A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786
+A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;;
+A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;;
+A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;;
+A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C;
+A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B
+A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;;
+A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;;
+A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;;
+A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;;
+A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;;
+A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;;
+A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;;
+A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;;
+A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;;
+A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;;
+A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;;
+A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;;
+A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;;
+A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;;
+A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;;
+A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;;
+A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;;
+A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;;
+A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;;
+A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;;
+A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;;
+A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;;
+A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;;
+A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;;
+A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;;
+A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;;
+A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;;
+A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;;
+A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;;
+A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;;
+A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;;
+A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;;
+A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;;
+A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;;
+A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;;
+A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;;
+A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;;
+A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;;
+A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;;
+A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;;
+A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;;
+A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;;
+A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;;
+A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;;
+A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;;
+A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;;
+A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;;
+A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;;
+A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;;
+A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;;
+A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;;
+A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;;
+A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;;
+A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;;
+A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;;
+A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;;
+A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;;
+A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;;
+A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;;
+A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;;
+A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;;
+A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;;
+A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;;
+A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;;
+A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;;
+A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;;
+A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;;
+A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;;
+A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;;
+A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;;
+A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;;
+A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;;
+A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;;
+A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;;
+A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;;
+A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;;
+A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;;
+A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;;
+A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;;
+A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;;
+A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;;
+A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;;
+A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;;
+A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;;
+A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;;
+A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;;
+A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;;
+A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;;
+A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;;
+A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;;
+A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;;
+A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;;
+A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;;
+A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;;
+A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;;
+A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;;
+A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;;
+A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;;
+A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;;
+A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;;
+A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;;
+A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;;
+A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;;
+A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;;
+A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;;
+A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;;
+A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;;
+A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;;
+A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;;
+A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;;
+A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;;
+A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;;
+A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;;
+A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;;
+A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;;
+A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;;
+A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;;
+A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;;
+A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;;
+A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;;
+A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;;
+A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;;
+A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;;
+A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;;
+A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;;
+A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;;
+A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;;
+A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;;
+A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;;
+A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;;
+A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;;
+A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;;
+A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;;
+A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;;
+A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;;
+A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;;
+A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;;
+A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;;
+A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;;
+A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;;
+A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;;
+A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;;
+A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;;
+A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;;
+A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;;
+A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;;
+A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;;
+A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;;
+A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;;
+A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;;
+A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;;
+A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;;
+A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;;
+A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;;
+A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;;
+A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;;
+A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;;
+A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;;
+A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;;
+A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;;
+A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;;
+A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;;
+A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;;
+A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;;
+A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;;
+A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;;
+A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;;
+A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;;
+A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;;
+A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;;
+A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;;
+A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;;
+A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;;
+A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;;
+A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;;
+A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;;
+A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;;
+A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;;
+A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;;
+A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;;
+A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;;
+A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;;
+A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;;
+A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;;
+A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;;
+A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;;
+A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;;
+A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;;
+A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;;
+AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;;
+AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;;
+AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;;
+AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;;
+AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;;
+AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;;
+AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;;
+AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;;
+AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;;
+AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;;
+AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;;
+AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;;
+AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;;
+AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;;
+AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;;
+AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;;
+AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;;
+AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;;
+AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;;
+AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;;
+AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;;
+AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;;
+AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;;
+AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;;
+AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;;
+AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;;
+AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;;
+AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;;
+AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;;
+AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;;
+AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;;
+AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;;
+AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;;
+AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;;
+AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;;
+AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;;
+AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;;
+AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;;
+AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;;
+AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;;
+AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;;
+AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;;
+AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;;
+AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;;
+AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;;
+AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;;
+AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;;
+AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;;
+AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;;
+AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;;
+AC00;HANGUL SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+AC01;HANGUL SYLLABLE GAG;Lo;0;L;;;;;N;;;;;
+AC02;HANGUL SYLLABLE GAGG;Lo;0;L;;;;;N;;;;;
+AC03;HANGUL SYLLABLE GAGS;Lo;0;L;;;;;N;;;;;
+AC04;HANGUL SYLLABLE GAN;Lo;0;L;;;;;N;;;;;
+AC05;HANGUL SYLLABLE GANI;Lo;0;L;;;;;N;;;;;
+AC06;HANGUL SYLLABLE GANH;Lo;0;L;;;;;N;;;;;
+AC07;HANGUL SYLLABLE GAD;Lo;0;L;;;;;N;;;;;
+AC08;HANGUL SYLLABLE GAL;Lo;0;L;;;;;N;;;;;
+AC09;HANGUL SYLLABLE GALG;Lo;0;L;;;;;N;;;;;
+AC0A;HANGUL SYLLABLE GALM;Lo;0;L;;;;;N;;;;;
+AC0B;HANGUL SYLLABLE GALB;Lo;0;L;;;;;N;;;;;
+AC0C;HANGUL SYLLABLE GALS;Lo;0;L;;;;;N;;;;;
+AC0D;HANGUL SYLLABLE GALT;Lo;0;L;;;;;N;;;;;
+AC0E;HANGUL SYLLABLE GALP;Lo;0;L;;;;;N;;;;;
+AC0F;HANGUL SYLLABLE GALH;Lo;0;L;;;;;N;;;;;
+AC10;HANGUL SYLLABLE GAM;Lo;0;L;;;;;N;;;;;
+AC11;HANGUL SYLLABLE GAB;Lo;0;L;;;;;N;;;;;
+AC12;HANGUL SYLLABLE GABS;Lo;0;L;;;;;N;;;;;
+AC13;HANGUL SYLLABLE GAS;Lo;0;L;;;;;N;;;;;
+AC14;HANGUL SYLLABLE GASS;Lo;0;L;;;;;N;;;;;
+AC15;HANGUL SYLLABLE GANG;Lo;0;L;;;;;N;;;;;
+AC16;HANGUL SYLLABLE GAJ;Lo;0;L;;;;;N;;;;;
+AC17;HANGUL SYLLABLE GAC;Lo;0;L;;;;;N;;;;;
+AC18;HANGUL SYLLABLE GAK;Lo;0;L;;;;;N;;;;;
+AC19;HANGUL SYLLABLE GAT;Lo;0;L;;;;;N;;;;;
+AC1A;HANGUL SYLLABLE GAP;Lo;0;L;;;;;N;;;;;
+AC1B;HANGUL SYLLABLE GAH;Lo;0;L;;;;;N;;;;;
+AC1C;HANGUL SYLLABLE GAE;Lo;0;L;;;;;N;;;;;
+AC1D;HANGUL SYLLABLE GAEG;Lo;0;L;;;;;N;;;;;
+AC1E;HANGUL SYLLABLE GAEGG;Lo;0;L;;;;;N;;;;;
+AC1F;HANGUL SYLLABLE GAEGS;Lo;0;L;;;;;N;;;;;
+AC20;HANGUL SYLLABLE GAEN;Lo;0;L;;;;;N;;;;;
+AC21;HANGUL SYLLABLE GAENI;Lo;0;L;;;;;N;;;;;
+AC22;HANGUL SYLLABLE GAENH;Lo;0;L;;;;;N;;;;;
+AC23;HANGUL SYLLABLE GAED;Lo;0;L;;;;;N;;;;;
+AC24;HANGUL SYLLABLE GAEL;Lo;0;L;;;;;N;;;;;
+AC25;HANGUL SYLLABLE GAELG;Lo;0;L;;;;;N;;;;;
+AC26;HANGUL SYLLABLE GAELM;Lo;0;L;;;;;N;;;;;
+AC27;HANGUL SYLLABLE GAELB;Lo;0;L;;;;;N;;;;;
+AC28;HANGUL SYLLABLE GAELS;Lo;0;L;;;;;N;;;;;
+AC29;HANGUL SYLLABLE GAELT;Lo;0;L;;;;;N;;;;;
+AC2A;HANGUL SYLLABLE GAELP;Lo;0;L;;;;;N;;;;;
+AC2B;HANGUL SYLLABLE GAELH;Lo;0;L;;;;;N;;;;;
+AC2C;HANGUL SYLLABLE GAEM;Lo;0;L;;;;;N;;;;;
+AC2D;HANGUL SYLLABLE GAEB;Lo;0;L;;;;;N;;;;;
+AC2E;HANGUL SYLLABLE GAEBS;Lo;0;L;;;;;N;;;;;
+AC2F;HANGUL SYLLABLE GAES;Lo;0;L;;;;;N;;;;;
+AC30;HANGUL SYLLABLE GAESS;Lo;0;L;;;;;N;;;;;
+AC31;HANGUL SYLLABLE GAENG;Lo;0;L;;;;;N;;;;;
+AC32;HANGUL SYLLABLE GAEJ;Lo;0;L;;;;;N;;;;;
+AC33;HANGUL SYLLABLE GAEC;Lo;0;L;;;;;N;;;;;
+AC34;HANGUL SYLLABLE GAEK;Lo;0;L;;;;;N;;;;;
+AC35;HANGUL SYLLABLE GAET;Lo;0;L;;;;;N;;;;;
+AC36;HANGUL SYLLABLE GAEP;Lo;0;L;;;;;N;;;;;
+AC37;HANGUL SYLLABLE GAEH;Lo;0;L;;;;;N;;;;;
+AC38;HANGUL SYLLABLE GYA;Lo;0;L;;;;;N;;;;;
+AC39;HANGUL SYLLABLE GYAG;Lo;0;L;;;;;N;;;;;
+AC3A;HANGUL SYLLABLE GYAGG;Lo;0;L;;;;;N;;;;;
+AC3B;HANGUL SYLLABLE GYAGS;Lo;0;L;;;;;N;;;;;
+AC3C;HANGUL SYLLABLE GYAN;Lo;0;L;;;;;N;;;;;
+AC3D;HANGUL SYLLABLE GYANI;Lo;0;L;;;;;N;;;;;
+AC3E;HANGUL SYLLABLE GYANH;Lo;0;L;;;;;N;;;;;
+AC3F;HANGUL SYLLABLE GYAD;Lo;0;L;;;;;N;;;;;
+AC40;HANGUL SYLLABLE GYAL;Lo;0;L;;;;;N;;;;;
+AC41;HANGUL SYLLABLE GYALG;Lo;0;L;;;;;N;;;;;
+AC42;HANGUL SYLLABLE GYALM;Lo;0;L;;;;;N;;;;;
+AC43;HANGUL SYLLABLE GYALB;Lo;0;L;;;;;N;;;;;
+AC44;HANGUL SYLLABLE GYALS;Lo;0;L;;;;;N;;;;;
+AC45;HANGUL SYLLABLE GYALT;Lo;0;L;;;;;N;;;;;
+AC46;HANGUL SYLLABLE GYALP;Lo;0;L;;;;;N;;;;;
+AC47;HANGUL SYLLABLE GYALH;Lo;0;L;;;;;N;;;;;
+AC48;HANGUL SYLLABLE GYAM;Lo;0;L;;;;;N;;;;;
+AC49;HANGUL SYLLABLE GYAB;Lo;0;L;;;;;N;;;;;
+AC4A;HANGUL SYLLABLE GYABS;Lo;0;L;;;;;N;;;;;
+AC4B;HANGUL SYLLABLE GYAS;Lo;0;L;;;;;N;;;;;
+AC4C;HANGUL SYLLABLE GYASS;Lo;0;L;;;;;N;;;;;
+AC4D;HANGUL SYLLABLE GYANG;Lo;0;L;;;;;N;;;;;
+AC4E;HANGUL SYLLABLE GYAJ;Lo;0;L;;;;;N;;;;;
+AC4F;HANGUL SYLLABLE GYAC;Lo;0;L;;;;;N;;;;;
+AC50;HANGUL SYLLABLE GYAK;Lo;0;L;;;;;N;;;;;
+AC51;HANGUL SYLLABLE GYAT;Lo;0;L;;;;;N;;;;;
+AC52;HANGUL SYLLABLE GYAP;Lo;0;L;;;;;N;;;;;
+AC53;HANGUL SYLLABLE GYAH;Lo;0;L;;;;;N;;;;;
+AC54;HANGUL SYLLABLE GYAE;Lo;0;L;;;;;N;;;;;
+AC55;HANGUL SYLLABLE GYAEG;Lo;0;L;;;;;N;;;;;
+AC56;HANGUL SYLLABLE GYAEGG;Lo;0;L;;;;;N;;;;;
+AC57;HANGUL SYLLABLE GYAEGS;Lo;0;L;;;;;N;;;;;
+AC58;HANGUL SYLLABLE GYAEN;Lo;0;L;;;;;N;;;;;
+AC59;HANGUL SYLLABLE GYAENI;Lo;0;L;;;;;N;;;;;
+AC5A;HANGUL SYLLABLE GYAENH;Lo;0;L;;;;;N;;;;;
+AC5B;HANGUL SYLLABLE GYAED;Lo;0;L;;;;;N;;;;;
+AC5C;HANGUL SYLLABLE GYAEL;Lo;0;L;;;;;N;;;;;
+AC5D;HANGUL SYLLABLE GYAELG;Lo;0;L;;;;;N;;;;;
+AC5E;HANGUL SYLLABLE GYAELM;Lo;0;L;;;;;N;;;;;
+AC5F;HANGUL SYLLABLE GYAELB;Lo;0;L;;;;;N;;;;;
+AC60;HANGUL SYLLABLE GYAELS;Lo;0;L;;;;;N;;;;;
+AC61;HANGUL SYLLABLE GYAELT;Lo;0;L;;;;;N;;;;;
+AC62;HANGUL SYLLABLE GYAELP;Lo;0;L;;;;;N;;;;;
+AC63;HANGUL SYLLABLE GYAELH;Lo;0;L;;;;;N;;;;;
+AC64;HANGUL SYLLABLE GYAEM;Lo;0;L;;;;;N;;;;;
+AC65;HANGUL SYLLABLE GYAEB;Lo;0;L;;;;;N;;;;;
+AC66;HANGUL SYLLABLE GYAEBS;Lo;0;L;;;;;N;;;;;
+AC67;HANGUL SYLLABLE GYAES;Lo;0;L;;;;;N;;;;;
+AC68;HANGUL SYLLABLE GYAESS;Lo;0;L;;;;;N;;;;;
+AC69;HANGUL SYLLABLE GYAENG;Lo;0;L;;;;;N;;;;;
+AC6A;HANGUL SYLLABLE GYAEJ;Lo;0;L;;;;;N;;;;;
+AC6B;HANGUL SYLLABLE GYAEC;Lo;0;L;;;;;N;;;;;
+AC6C;HANGUL SYLLABLE GYAEK;Lo;0;L;;;;;N;;;;;
+AC6D;HANGUL SYLLABLE GYAET;Lo;0;L;;;;;N;;;;;
+AC6E;HANGUL SYLLABLE GYAEP;Lo;0;L;;;;;N;;;;;
+AC6F;HANGUL SYLLABLE GYAEH;Lo;0;L;;;;;N;;;;;
+AC70;HANGUL SYLLABLE GEO;Lo;0;L;;;;;N;;;;;
+AC71;HANGUL SYLLABLE GEOG;Lo;0;L;;;;;N;;;;;
+AC72;HANGUL SYLLABLE GEOGG;Lo;0;L;;;;;N;;;;;
+AC73;HANGUL SYLLABLE GEOGS;Lo;0;L;;;;;N;;;;;
+AC74;HANGUL SYLLABLE GEON;Lo;0;L;;;;;N;;;;;
+AC75;HANGUL SYLLABLE GEONI;Lo;0;L;;;;;N;;;;;
+AC76;HANGUL SYLLABLE GEONH;Lo;0;L;;;;;N;;;;;
+AC77;HANGUL SYLLABLE GEOD;Lo;0;L;;;;;N;;;;;
+AC78;HANGUL SYLLABLE GEOL;Lo;0;L;;;;;N;;;;;
+AC79;HANGUL SYLLABLE GEOLG;Lo;0;L;;;;;N;;;;;
+AC7A;HANGUL SYLLABLE GEOLM;Lo;0;L;;;;;N;;;;;
+AC7B;HANGUL SYLLABLE GEOLB;Lo;0;L;;;;;N;;;;;
+AC7C;HANGUL SYLLABLE GEOLS;Lo;0;L;;;;;N;;;;;
+AC7D;HANGUL SYLLABLE GEOLT;Lo;0;L;;;;;N;;;;;
+AC7E;HANGUL SYLLABLE GEOLP;Lo;0;L;;;;;N;;;;;
+AC7F;HANGUL SYLLABLE GEOLH;Lo;0;L;;;;;N;;;;;
+AC80;HANGUL SYLLABLE GEOM;Lo;0;L;;;;;N;;;;;
+AC81;HANGUL SYLLABLE GEOB;Lo;0;L;;;;;N;;;;;
+AC82;HANGUL SYLLABLE GEOBS;Lo;0;L;;;;;N;;;;;
+AC83;HANGUL SYLLABLE GEOS;Lo;0;L;;;;;N;;;;;
+AC84;HANGUL SYLLABLE GEOSS;Lo;0;L;;;;;N;;;;;
+AC85;HANGUL SYLLABLE GEONG;Lo;0;L;;;;;N;;;;;
+AC86;HANGUL SYLLABLE GEOJ;Lo;0;L;;;;;N;;;;;
+AC87;HANGUL SYLLABLE GEOC;Lo;0;L;;;;;N;;;;;
+AC88;HANGUL SYLLABLE GEOK;Lo;0;L;;;;;N;;;;;
+AC89;HANGUL SYLLABLE GEOT;Lo;0;L;;;;;N;;;;;
+AC8A;HANGUL SYLLABLE GEOP;Lo;0;L;;;;;N;;;;;
+AC8B;HANGUL SYLLABLE GEOH;Lo;0;L;;;;;N;;;;;
+AC8C;HANGUL SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+AC8D;HANGUL SYLLABLE GEG;Lo;0;L;;;;;N;;;;;
+AC8E;HANGUL SYLLABLE GEGG;Lo;0;L;;;;;N;;;;;
+AC8F;HANGUL SYLLABLE GEGS;Lo;0;L;;;;;N;;;;;
+AC90;HANGUL SYLLABLE GEN;Lo;0;L;;;;;N;;;;;
+AC91;HANGUL SYLLABLE GENI;Lo;0;L;;;;;N;;;;;
+AC92;HANGUL SYLLABLE GENH;Lo;0;L;;;;;N;;;;;
+AC93;HANGUL SYLLABLE GED;Lo;0;L;;;;;N;;;;;
+AC94;HANGUL SYLLABLE GEL;Lo;0;L;;;;;N;;;;;
+AC95;HANGUL SYLLABLE GELG;Lo;0;L;;;;;N;;;;;
+AC96;HANGUL SYLLABLE GELM;Lo;0;L;;;;;N;;;;;
+AC97;HANGUL SYLLABLE GELB;Lo;0;L;;;;;N;;;;;
+AC98;HANGUL SYLLABLE GELS;Lo;0;L;;;;;N;;;;;
+AC99;HANGUL SYLLABLE GELT;Lo;0;L;;;;;N;;;;;
+AC9A;HANGUL SYLLABLE GELP;Lo;0;L;;;;;N;;;;;
+AC9B;HANGUL SYLLABLE GELH;Lo;0;L;;;;;N;;;;;
+AC9C;HANGUL SYLLABLE GEM;Lo;0;L;;;;;N;;;;;
+AC9D;HANGUL SYLLABLE GEB;Lo;0;L;;;;;N;;;;;
+AC9E;HANGUL SYLLABLE GEBS;Lo;0;L;;;;;N;;;;;
+AC9F;HANGUL SYLLABLE GES;Lo;0;L;;;;;N;;;;;
+ACA0;HANGUL SYLLABLE GESS;Lo;0;L;;;;;N;;;;;
+ACA1;HANGUL SYLLABLE GENG;Lo;0;L;;;;;N;;;;;
+ACA2;HANGUL SYLLABLE GEJ;Lo;0;L;;;;;N;;;;;
+ACA3;HANGUL SYLLABLE GEC;Lo;0;L;;;;;N;;;;;
+ACA4;HANGUL SYLLABLE GEK;Lo;0;L;;;;;N;;;;;
+ACA5;HANGUL SYLLABLE GET;Lo;0;L;;;;;N;;;;;
+ACA6;HANGUL SYLLABLE GEP;Lo;0;L;;;;;N;;;;;
+ACA7;HANGUL SYLLABLE GEH;Lo;0;L;;;;;N;;;;;
+ACA8;HANGUL SYLLABLE GYEO;Lo;0;L;;;;;N;;;;;
+ACA9;HANGUL SYLLABLE GYEOG;Lo;0;L;;;;;N;;;;;
+ACAA;HANGUL SYLLABLE GYEOGG;Lo;0;L;;;;;N;;;;;
+ACAB;HANGUL SYLLABLE GYEOGS;Lo;0;L;;;;;N;;;;;
+ACAC;HANGUL SYLLABLE GYEON;Lo;0;L;;;;;N;;;;;
+ACAD;HANGUL SYLLABLE GYEONI;Lo;0;L;;;;;N;;;;;
+ACAE;HANGUL SYLLABLE GYEONH;Lo;0;L;;;;;N;;;;;
+ACAF;HANGUL SYLLABLE GYEOD;Lo;0;L;;;;;N;;;;;
+ACB0;HANGUL SYLLABLE GYEOL;Lo;0;L;;;;;N;;;;;
+ACB1;HANGUL SYLLABLE GYEOLG;Lo;0;L;;;;;N;;;;;
+ACB2;HANGUL SYLLABLE GYEOLM;Lo;0;L;;;;;N;;;;;
+ACB3;HANGUL SYLLABLE GYEOLB;Lo;0;L;;;;;N;;;;;
+ACB4;HANGUL SYLLABLE GYEOLS;Lo;0;L;;;;;N;;;;;
+ACB5;HANGUL SYLLABLE GYEOLT;Lo;0;L;;;;;N;;;;;
+ACB6;HANGUL SYLLABLE GYEOLP;Lo;0;L;;;;;N;;;;;
+ACB7;HANGUL SYLLABLE GYEOLH;Lo;0;L;;;;;N;;;;;
+ACB8;HANGUL SYLLABLE GYEOM;Lo;0;L;;;;;N;;;;;
+ACB9;HANGUL SYLLABLE GYEOB;Lo;0;L;;;;;N;;;;;
+ACBA;HANGUL SYLLABLE GYEOBS;Lo;0;L;;;;;N;;;;;
+ACBB;HANGUL SYLLABLE GYEOS;Lo;0;L;;;;;N;;;;;
+ACBC;HANGUL SYLLABLE GYEOSS;Lo;0;L;;;;;N;;;;;
+ACBD;HANGUL SYLLABLE GYEONG;Lo;0;L;;;;;N;;;;;
+ACBE;HANGUL SYLLABLE GYEOJ;Lo;0;L;;;;;N;;;;;
+ACBF;HANGUL SYLLABLE GYEOC;Lo;0;L;;;;;N;;;;;
+ACC0;HANGUL SYLLABLE GYEOK;Lo;0;L;;;;;N;;;;;
+ACC1;HANGUL SYLLABLE GYEOT;Lo;0;L;;;;;N;;;;;
+ACC2;HANGUL SYLLABLE GYEOP;Lo;0;L;;;;;N;;;;;
+ACC3;HANGUL SYLLABLE GYEOH;Lo;0;L;;;;;N;;;;;
+ACC4;HANGUL SYLLABLE GYE;Lo;0;L;;;;;N;;;;;
+ACC5;HANGUL SYLLABLE GYEG;Lo;0;L;;;;;N;;;;;
+ACC6;HANGUL SYLLABLE GYEGG;Lo;0;L;;;;;N;;;;;
+ACC7;HANGUL SYLLABLE GYEGS;Lo;0;L;;;;;N;;;;;
+ACC8;HANGUL SYLLABLE GYEN;Lo;0;L;;;;;N;;;;;
+ACC9;HANGUL SYLLABLE GYENI;Lo;0;L;;;;;N;;;;;
+ACCA;HANGUL SYLLABLE GYENH;Lo;0;L;;;;;N;;;;;
+ACCB;HANGUL SYLLABLE GYED;Lo;0;L;;;;;N;;;;;
+ACCC;HANGUL SYLLABLE GYEL;Lo;0;L;;;;;N;;;;;
+ACCD;HANGUL SYLLABLE GYELG;Lo;0;L;;;;;N;;;;;
+ACCE;HANGUL SYLLABLE GYELM;Lo;0;L;;;;;N;;;;;
+ACCF;HANGUL SYLLABLE GYELB;Lo;0;L;;;;;N;;;;;
+ACD0;HANGUL SYLLABLE GYELS;Lo;0;L;;;;;N;;;;;
+ACD1;HANGUL SYLLABLE GYELT;Lo;0;L;;;;;N;;;;;
+ACD2;HANGUL SYLLABLE GYELP;Lo;0;L;;;;;N;;;;;
+ACD3;HANGUL SYLLABLE GYELH;Lo;0;L;;;;;N;;;;;
+ACD4;HANGUL SYLLABLE GYEM;Lo;0;L;;;;;N;;;;;
+ACD5;HANGUL SYLLABLE GYEB;Lo;0;L;;;;;N;;;;;
+ACD6;HANGUL SYLLABLE GYEBS;Lo;0;L;;;;;N;;;;;
+ACD7;HANGUL SYLLABLE GYES;Lo;0;L;;;;;N;;;;;
+ACD8;HANGUL SYLLABLE GYESS;Lo;0;L;;;;;N;;;;;
+ACD9;HANGUL SYLLABLE GYENG;Lo;0;L;;;;;N;;;;;
+ACDA;HANGUL SYLLABLE GYEJ;Lo;0;L;;;;;N;;;;;
+ACDB;HANGUL SYLLABLE GYEC;Lo;0;L;;;;;N;;;;;
+ACDC;HANGUL SYLLABLE GYEK;Lo;0;L;;;;;N;;;;;
+ACDD;HANGUL SYLLABLE GYET;Lo;0;L;;;;;N;;;;;
+ACDE;HANGUL SYLLABLE GYEP;Lo;0;L;;;;;N;;;;;
+ACDF;HANGUL SYLLABLE GYEH;Lo;0;L;;;;;N;;;;;
+ACE0;HANGUL SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+ACE1;HANGUL SYLLABLE GOG;Lo;0;L;;;;;N;;;;;
+ACE2;HANGUL SYLLABLE GOGG;Lo;0;L;;;;;N;;;;;
+ACE3;HANGUL SYLLABLE GOGS;Lo;0;L;;;;;N;;;;;
+ACE4;HANGUL SYLLABLE GON;Lo;0;L;;;;;N;;;;;
+ACE5;HANGUL SYLLABLE GONI;Lo;0;L;;;;;N;;;;;
+ACE6;HANGUL SYLLABLE GONH;Lo;0;L;;;;;N;;;;;
+ACE7;HANGUL SYLLABLE GOD;Lo;0;L;;;;;N;;;;;
+ACE8;HANGUL SYLLABLE GOL;Lo;0;L;;;;;N;;;;;
+ACE9;HANGUL SYLLABLE GOLG;Lo;0;L;;;;;N;;;;;
+ACEA;HANGUL SYLLABLE GOLM;Lo;0;L;;;;;N;;;;;
+ACEB;HANGUL SYLLABLE GOLB;Lo;0;L;;;;;N;;;;;
+ACEC;HANGUL SYLLABLE GOLS;Lo;0;L;;;;;N;;;;;
+ACED;HANGUL SYLLABLE GOLT;Lo;0;L;;;;;N;;;;;
+ACEE;HANGUL SYLLABLE GOLP;Lo;0;L;;;;;N;;;;;
+ACEF;HANGUL SYLLABLE GOLH;Lo;0;L;;;;;N;;;;;
+ACF0;HANGUL SYLLABLE GOM;Lo;0;L;;;;;N;;;;;
+ACF1;HANGUL SYLLABLE GOB;Lo;0;L;;;;;N;;;;;
+ACF2;HANGUL SYLLABLE GOBS;Lo;0;L;;;;;N;;;;;
+ACF3;HANGUL SYLLABLE GOS;Lo;0;L;;;;;N;;;;;
+ACF4;HANGUL SYLLABLE GOSS;Lo;0;L;;;;;N;;;;;
+ACF5;HANGUL SYLLABLE GONG;Lo;0;L;;;;;N;;;;;
+ACF6;HANGUL SYLLABLE GOJ;Lo;0;L;;;;;N;;;;;
+ACF7;HANGUL SYLLABLE GOC;Lo;0;L;;;;;N;;;;;
+ACF8;HANGUL SYLLABLE GOK;Lo;0;L;;;;;N;;;;;
+ACF9;HANGUL SYLLABLE GOT;Lo;0;L;;;;;N;;;;;
+ACFA;HANGUL SYLLABLE GOP;Lo;0;L;;;;;N;;;;;
+ACFB;HANGUL SYLLABLE GOH;Lo;0;L;;;;;N;;;;;
+ACFC;HANGUL SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
+ACFD;HANGUL SYLLABLE GWAG;Lo;0;L;;;;;N;;;;;
+ACFE;HANGUL SYLLABLE GWAGG;Lo;0;L;;;;;N;;;;;
+ACFF;HANGUL SYLLABLE GWAGS;Lo;0;L;;;;;N;;;;;
+AD00;HANGUL SYLLABLE GWAN;Lo;0;L;;;;;N;;;;;
+AD01;HANGUL SYLLABLE GWANI;Lo;0;L;;;;;N;;;;;
+AD02;HANGUL SYLLABLE GWANH;Lo;0;L;;;;;N;;;;;
+AD03;HANGUL SYLLABLE GWAD;Lo;0;L;;;;;N;;;;;
+AD04;HANGUL SYLLABLE GWAL;Lo;0;L;;;;;N;;;;;
+AD05;HANGUL SYLLABLE GWALG;Lo;0;L;;;;;N;;;;;
+AD06;HANGUL SYLLABLE GWALM;Lo;0;L;;;;;N;;;;;
+AD07;HANGUL SYLLABLE GWALB;Lo;0;L;;;;;N;;;;;
+AD08;HANGUL SYLLABLE GWALS;Lo;0;L;;;;;N;;;;;
+AD09;HANGUL SYLLABLE GWALT;Lo;0;L;;;;;N;;;;;
+AD0A;HANGUL SYLLABLE GWALP;Lo;0;L;;;;;N;;;;;
+AD0B;HANGUL SYLLABLE GWALH;Lo;0;L;;;;;N;;;;;
+AD0C;HANGUL SYLLABLE GWAM;Lo;0;L;;;;;N;;;;;
+AD0D;HANGUL SYLLABLE GWAB;Lo;0;L;;;;;N;;;;;
+AD0E;HANGUL SYLLABLE GWABS;Lo;0;L;;;;;N;;;;;
+AD0F;HANGUL SYLLABLE GWAS;Lo;0;L;;;;;N;;;;;
+AD10;HANGUL SYLLABLE GWASS;Lo;0;L;;;;;N;;;;;
+AD11;HANGUL SYLLABLE GWANG;Lo;0;L;;;;;N;;;;;
+AD12;HANGUL SYLLABLE GWAJ;Lo;0;L;;;;;N;;;;;
+AD13;HANGUL SYLLABLE GWAC;Lo;0;L;;;;;N;;;;;
+AD14;HANGUL SYLLABLE GWAK;Lo;0;L;;;;;N;;;;;
+AD15;HANGUL SYLLABLE GWAT;Lo;0;L;;;;;N;;;;;
+AD16;HANGUL SYLLABLE GWAP;Lo;0;L;;;;;N;;;;;
+AD17;HANGUL SYLLABLE GWAH;Lo;0;L;;;;;N;;;;;
+AD18;HANGUL SYLLABLE GWAE;Lo;0;L;;;;;N;;;;;
+AD19;HANGUL SYLLABLE GWAEG;Lo;0;L;;;;;N;;;;;
+AD1A;HANGUL SYLLABLE GWAEGG;Lo;0;L;;;;;N;;;;;
+AD1B;HANGUL SYLLABLE GWAEGS;Lo;0;L;;;;;N;;;;;
+AD1C;HANGUL SYLLABLE GWAEN;Lo;0;L;;;;;N;;;;;
+AD1D;HANGUL SYLLABLE GWAENI;Lo;0;L;;;;;N;;;;;
+AD1E;HANGUL SYLLABLE GWAENH;Lo;0;L;;;;;N;;;;;
+AD1F;HANGUL SYLLABLE GWAED;Lo;0;L;;;;;N;;;;;
+AD20;HANGUL SYLLABLE GWAEL;Lo;0;L;;;;;N;;;;;
+AD21;HANGUL SYLLABLE GWAELG;Lo;0;L;;;;;N;;;;;
+AD22;HANGUL SYLLABLE GWAELM;Lo;0;L;;;;;N;;;;;
+AD23;HANGUL SYLLABLE GWAELB;Lo;0;L;;;;;N;;;;;
+AD24;HANGUL SYLLABLE GWAELS;Lo;0;L;;;;;N;;;;;
+AD25;HANGUL SYLLABLE GWAELT;Lo;0;L;;;;;N;;;;;
+AD26;HANGUL SYLLABLE GWAELP;Lo;0;L;;;;;N;;;;;
+AD27;HANGUL SYLLABLE GWAELH;Lo;0;L;;;;;N;;;;;
+AD28;HANGUL SYLLABLE GWAEM;Lo;0;L;;;;;N;;;;;
+AD29;HANGUL SYLLABLE GWAEB;Lo;0;L;;;;;N;;;;;
+AD2A;HANGUL SYLLABLE GWAEBS;Lo;0;L;;;;;N;;;;;
+AD2B;HANGUL SYLLABLE GWAES;Lo;0;L;;;;;N;;;;;
+AD2C;HANGUL SYLLABLE GWAESS;Lo;0;L;;;;;N;;;;;
+AD2D;HANGUL SYLLABLE GWAENG;Lo;0;L;;;;;N;;;;;
+AD2E;HANGUL SYLLABLE GWAEJ;Lo;0;L;;;;;N;;;;;
+AD2F;HANGUL SYLLABLE GWAEC;Lo;0;L;;;;;N;;;;;
+AD30;HANGUL SYLLABLE GWAEK;Lo;0;L;;;;;N;;;;;
+AD31;HANGUL SYLLABLE GWAET;Lo;0;L;;;;;N;;;;;
+AD32;HANGUL SYLLABLE GWAEP;Lo;0;L;;;;;N;;;;;
+AD33;HANGUL SYLLABLE GWAEH;Lo;0;L;;;;;N;;;;;
+AD34;HANGUL SYLLABLE GOE;Lo;0;L;;;;;N;;;;;
+AD35;HANGUL SYLLABLE GOEG;Lo;0;L;;;;;N;;;;;
+AD36;HANGUL SYLLABLE GOEGG;Lo;0;L;;;;;N;;;;;
+AD37;HANGUL SYLLABLE GOEGS;Lo;0;L;;;;;N;;;;;
+AD38;HANGUL SYLLABLE GOEN;Lo;0;L;;;;;N;;;;;
+AD39;HANGUL SYLLABLE GOENI;Lo;0;L;;;;;N;;;;;
+AD3A;HANGUL SYLLABLE GOENH;Lo;0;L;;;;;N;;;;;
+AD3B;HANGUL SYLLABLE GOED;Lo;0;L;;;;;N;;;;;
+AD3C;HANGUL SYLLABLE GOEL;Lo;0;L;;;;;N;;;;;
+AD3D;HANGUL SYLLABLE GOELG;Lo;0;L;;;;;N;;;;;
+AD3E;HANGUL SYLLABLE GOELM;Lo;0;L;;;;;N;;;;;
+AD3F;HANGUL SYLLABLE GOELB;Lo;0;L;;;;;N;;;;;
+AD40;HANGUL SYLLABLE GOELS;Lo;0;L;;;;;N;;;;;
+AD41;HANGUL SYLLABLE GOELT;Lo;0;L;;;;;N;;;;;
+AD42;HANGUL SYLLABLE GOELP;Lo;0;L;;;;;N;;;;;
+AD43;HANGUL SYLLABLE GOELH;Lo;0;L;;;;;N;;;;;
+AD44;HANGUL SYLLABLE GOEM;Lo;0;L;;;;;N;;;;;
+AD45;HANGUL SYLLABLE GOEB;Lo;0;L;;;;;N;;;;;
+AD46;HANGUL SYLLABLE GOEBS;Lo;0;L;;;;;N;;;;;
+AD47;HANGUL SYLLABLE GOES;Lo;0;L;;;;;N;;;;;
+AD48;HANGUL SYLLABLE GOESS;Lo;0;L;;;;;N;;;;;
+AD49;HANGUL SYLLABLE GOENG;Lo;0;L;;;;;N;;;;;
+AD4A;HANGUL SYLLABLE GOEJ;Lo;0;L;;;;;N;;;;;
+AD4B;HANGUL SYLLABLE GOEC;Lo;0;L;;;;;N;;;;;
+AD4C;HANGUL SYLLABLE GOEK;Lo;0;L;;;;;N;;;;;
+AD4D;HANGUL SYLLABLE GOET;Lo;0;L;;;;;N;;;;;
+AD4E;HANGUL SYLLABLE GOEP;Lo;0;L;;;;;N;;;;;
+AD4F;HANGUL SYLLABLE GOEH;Lo;0;L;;;;;N;;;;;
+AD50;HANGUL SYLLABLE GYO;Lo;0;L;;;;;N;;;;;
+AD51;HANGUL SYLLABLE GYOG;Lo;0;L;;;;;N;;;;;
+AD52;HANGUL SYLLABLE GYOGG;Lo;0;L;;;;;N;;;;;
+AD53;HANGUL SYLLABLE GYOGS;Lo;0;L;;;;;N;;;;;
+AD54;HANGUL SYLLABLE GYON;Lo;0;L;;;;;N;;;;;
+AD55;HANGUL SYLLABLE GYONI;Lo;0;L;;;;;N;;;;;
+AD56;HANGUL SYLLABLE GYONH;Lo;0;L;;;;;N;;;;;
+AD57;HANGUL SYLLABLE GYOD;Lo;0;L;;;;;N;;;;;
+AD58;HANGUL SYLLABLE GYOL;Lo;0;L;;;;;N;;;;;
+AD59;HANGUL SYLLABLE GYOLG;Lo;0;L;;;;;N;;;;;
+AD5A;HANGUL SYLLABLE GYOLM;Lo;0;L;;;;;N;;;;;
+AD5B;HANGUL SYLLABLE GYOLB;Lo;0;L;;;;;N;;;;;
+AD5C;HANGUL SYLLABLE GYOLS;Lo;0;L;;;;;N;;;;;
+AD5D;HANGUL SYLLABLE GYOLT;Lo;0;L;;;;;N;;;;;
+AD5E;HANGUL SYLLABLE GYOLP;Lo;0;L;;;;;N;;;;;
+AD5F;HANGUL SYLLABLE GYOLH;Lo;0;L;;;;;N;;;;;
+AD60;HANGUL SYLLABLE GYOM;Lo;0;L;;;;;N;;;;;
+AD61;HANGUL SYLLABLE GYOB;Lo;0;L;;;;;N;;;;;
+AD62;HANGUL SYLLABLE GYOBS;Lo;0;L;;;;;N;;;;;
+AD63;HANGUL SYLLABLE GYOS;Lo;0;L;;;;;N;;;;;
+AD64;HANGUL SYLLABLE GYOSS;Lo;0;L;;;;;N;;;;;
+AD65;HANGUL SYLLABLE GYONG;Lo;0;L;;;;;N;;;;;
+AD66;HANGUL SYLLABLE GYOJ;Lo;0;L;;;;;N;;;;;
+AD67;HANGUL SYLLABLE GYOC;Lo;0;L;;;;;N;;;;;
+AD68;HANGUL SYLLABLE GYOK;Lo;0;L;;;;;N;;;;;
+AD69;HANGUL SYLLABLE GYOT;Lo;0;L;;;;;N;;;;;
+AD6A;HANGUL SYLLABLE GYOP;Lo;0;L;;;;;N;;;;;
+AD6B;HANGUL SYLLABLE GYOH;Lo;0;L;;;;;N;;;;;
+AD6C;HANGUL SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+AD6D;HANGUL SYLLABLE GUG;Lo;0;L;;;;;N;;;;;
+AD6E;HANGUL SYLLABLE GUGG;Lo;0;L;;;;;N;;;;;
+AD6F;HANGUL SYLLABLE GUGS;Lo;0;L;;;;;N;;;;;
+AD70;HANGUL SYLLABLE GUN;Lo;0;L;;;;;N;;;;;
+AD71;HANGUL SYLLABLE GUNI;Lo;0;L;;;;;N;;;;;
+AD72;HANGUL SYLLABLE GUNH;Lo;0;L;;;;;N;;;;;
+AD73;HANGUL SYLLABLE GUD;Lo;0;L;;;;;N;;;;;
+AD74;HANGUL SYLLABLE GUL;Lo;0;L;;;;;N;;;;;
+AD75;HANGUL SYLLABLE GULG;Lo;0;L;;;;;N;;;;;
+AD76;HANGUL SYLLABLE GULM;Lo;0;L;;;;;N;;;;;
+AD77;HANGUL SYLLABLE GULB;Lo;0;L;;;;;N;;;;;
+AD78;HANGUL SYLLABLE GULS;Lo;0;L;;;;;N;;;;;
+AD79;HANGUL SYLLABLE GULT;Lo;0;L;;;;;N;;;;;
+AD7A;HANGUL SYLLABLE GULP;Lo;0;L;;;;;N;;;;;
+AD7B;HANGUL SYLLABLE GULH;Lo;0;L;;;;;N;;;;;
+AD7C;HANGUL SYLLABLE GUM;Lo;0;L;;;;;N;;;;;
+AD7D;HANGUL SYLLABLE GUB;Lo;0;L;;;;;N;;;;;
+AD7E;HANGUL SYLLABLE GUBS;Lo;0;L;;;;;N;;;;;
+AD7F;HANGUL SYLLABLE GUS;Lo;0;L;;;;;N;;;;;
+AD80;HANGUL SYLLABLE GUSS;Lo;0;L;;;;;N;;;;;
+AD81;HANGUL SYLLABLE GUNG;Lo;0;L;;;;;N;;;;;
+AD82;HANGUL SYLLABLE GUJ;Lo;0;L;;;;;N;;;;;
+AD83;HANGUL SYLLABLE GUC;Lo;0;L;;;;;N;;;;;
+AD84;HANGUL SYLLABLE GUK;Lo;0;L;;;;;N;;;;;
+AD85;HANGUL SYLLABLE GUT;Lo;0;L;;;;;N;;;;;
+AD86;HANGUL SYLLABLE GUP;Lo;0;L;;;;;N;;;;;
+AD87;HANGUL SYLLABLE GUH;Lo;0;L;;;;;N;;;;;
+AD88;HANGUL SYLLABLE GWEO;Lo;0;L;;;;;N;;;;;
+AD89;HANGUL SYLLABLE GWEOG;Lo;0;L;;;;;N;;;;;
+AD8A;HANGUL SYLLABLE GWEOGG;Lo;0;L;;;;;N;;;;;
+AD8B;HANGUL SYLLABLE GWEOGS;Lo;0;L;;;;;N;;;;;
+AD8C;HANGUL SYLLABLE GWEON;Lo;0;L;;;;;N;;;;;
+AD8D;HANGUL SYLLABLE GWEONI;Lo;0;L;;;;;N;;;;;
+AD8E;HANGUL SYLLABLE GWEONH;Lo;0;L;;;;;N;;;;;
+AD8F;HANGUL SYLLABLE GWEOD;Lo;0;L;;;;;N;;;;;
+AD90;HANGUL SYLLABLE GWEOL;Lo;0;L;;;;;N;;;;;
+AD91;HANGUL SYLLABLE GWEOLG;Lo;0;L;;;;;N;;;;;
+AD92;HANGUL SYLLABLE GWEOLM;Lo;0;L;;;;;N;;;;;
+AD93;HANGUL SYLLABLE GWEOLB;Lo;0;L;;;;;N;;;;;
+AD94;HANGUL SYLLABLE GWEOLS;Lo;0;L;;;;;N;;;;;
+AD95;HANGUL SYLLABLE GWEOLT;Lo;0;L;;;;;N;;;;;
+AD96;HANGUL SYLLABLE GWEOLP;Lo;0;L;;;;;N;;;;;
+AD97;HANGUL SYLLABLE GWEOLH;Lo;0;L;;;;;N;;;;;
+AD98;HANGUL SYLLABLE GWEOM;Lo;0;L;;;;;N;;;;;
+AD99;HANGUL SYLLABLE GWEOB;Lo;0;L;;;;;N;;;;;
+AD9A;HANGUL SYLLABLE GWEOBS;Lo;0;L;;;;;N;;;;;
+AD9B;HANGUL SYLLABLE GWEOS;Lo;0;L;;;;;N;;;;;
+AD9C;HANGUL SYLLABLE GWEOSS;Lo;0;L;;;;;N;;;;;
+AD9D;HANGUL SYLLABLE GWEONG;Lo;0;L;;;;;N;;;;;
+AD9E;HANGUL SYLLABLE GWEOJ;Lo;0;L;;;;;N;;;;;
+AD9F;HANGUL SYLLABLE GWEOC;Lo;0;L;;;;;N;;;;;
+ADA0;HANGUL SYLLABLE GWEOK;Lo;0;L;;;;;N;;;;;
+ADA1;HANGUL SYLLABLE GWEOT;Lo;0;L;;;;;N;;;;;
+ADA2;HANGUL SYLLABLE GWEOP;Lo;0;L;;;;;N;;;;;
+ADA3;HANGUL SYLLABLE GWEOH;Lo;0;L;;;;;N;;;;;
+ADA4;HANGUL SYLLABLE GWE;Lo;0;L;;;;;N;;;;;
+ADA5;HANGUL SYLLABLE GWEG;Lo;0;L;;;;;N;;;;;
+ADA6;HANGUL SYLLABLE GWEGG;Lo;0;L;;;;;N;;;;;
+ADA7;HANGUL SYLLABLE GWEGS;Lo;0;L;;;;;N;;;;;
+ADA8;HANGUL SYLLABLE GWEN;Lo;0;L;;;;;N;;;;;
+ADA9;HANGUL SYLLABLE GWENI;Lo;0;L;;;;;N;;;;;
+ADAA;HANGUL SYLLABLE GWENH;Lo;0;L;;;;;N;;;;;
+ADAB;HANGUL SYLLABLE GWED;Lo;0;L;;;;;N;;;;;
+ADAC;HANGUL SYLLABLE GWEL;Lo;0;L;;;;;N;;;;;
+ADAD;HANGUL SYLLABLE GWELG;Lo;0;L;;;;;N;;;;;
+ADAE;HANGUL SYLLABLE GWELM;Lo;0;L;;;;;N;;;;;
+ADAF;HANGUL SYLLABLE GWELB;Lo;0;L;;;;;N;;;;;
+ADB0;HANGUL SYLLABLE GWELS;Lo;0;L;;;;;N;;;;;
+ADB1;HANGUL SYLLABLE GWELT;Lo;0;L;;;;;N;;;;;
+ADB2;HANGUL SYLLABLE GWELP;Lo;0;L;;;;;N;;;;;
+ADB3;HANGUL SYLLABLE GWELH;Lo;0;L;;;;;N;;;;;
+ADB4;HANGUL SYLLABLE GWEM;Lo;0;L;;;;;N;;;;;
+ADB5;HANGUL SYLLABLE GWEB;Lo;0;L;;;;;N;;;;;
+ADB6;HANGUL SYLLABLE GWEBS;Lo;0;L;;;;;N;;;;;
+ADB7;HANGUL SYLLABLE GWES;Lo;0;L;;;;;N;;;;;
+ADB8;HANGUL SYLLABLE GWESS;Lo;0;L;;;;;N;;;;;
+ADB9;HANGUL SYLLABLE GWENG;Lo;0;L;;;;;N;;;;;
+ADBA;HANGUL SYLLABLE GWEJ;Lo;0;L;;;;;N;;;;;
+ADBB;HANGUL SYLLABLE GWEC;Lo;0;L;;;;;N;;;;;
+ADBC;HANGUL SYLLABLE GWEK;Lo;0;L;;;;;N;;;;;
+ADBD;HANGUL SYLLABLE GWET;Lo;0;L;;;;;N;;;;;
+ADBE;HANGUL SYLLABLE GWEP;Lo;0;L;;;;;N;;;;;
+ADBF;HANGUL SYLLABLE GWEH;Lo;0;L;;;;;N;;;;;
+ADC0;HANGUL SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
+ADC1;HANGUL SYLLABLE GWIG;Lo;0;L;;;;;N;;;;;
+ADC2;HANGUL SYLLABLE GWIGG;Lo;0;L;;;;;N;;;;;
+ADC3;HANGUL SYLLABLE GWIGS;Lo;0;L;;;;;N;;;;;
+ADC4;HANGUL SYLLABLE GWIN;Lo;0;L;;;;;N;;;;;
+ADC5;HANGUL SYLLABLE GWINI;Lo;0;L;;;;;N;;;;;
+ADC6;HANGUL SYLLABLE GWINH;Lo;0;L;;;;;N;;;;;
+ADC7;HANGUL SYLLABLE GWID;Lo;0;L;;;;;N;;;;;
+ADC8;HANGUL SYLLABLE GWIL;Lo;0;L;;;;;N;;;;;
+ADC9;HANGUL SYLLABLE GWILG;Lo;0;L;;;;;N;;;;;
+ADCA;HANGUL SYLLABLE GWILM;Lo;0;L;;;;;N;;;;;
+ADCB;HANGUL SYLLABLE GWILB;Lo;0;L;;;;;N;;;;;
+ADCC;HANGUL SYLLABLE GWILS;Lo;0;L;;;;;N;;;;;
+ADCD;HANGUL SYLLABLE GWILT;Lo;0;L;;;;;N;;;;;
+ADCE;HANGUL SYLLABLE GWILP;Lo;0;L;;;;;N;;;;;
+ADCF;HANGUL SYLLABLE GWILH;Lo;0;L;;;;;N;;;;;
+ADD0;HANGUL SYLLABLE GWIM;Lo;0;L;;;;;N;;;;;
+ADD1;HANGUL SYLLABLE GWIB;Lo;0;L;;;;;N;;;;;
+ADD2;HANGUL SYLLABLE GWIBS;Lo;0;L;;;;;N;;;;;
+ADD3;HANGUL SYLLABLE GWIS;Lo;0;L;;;;;N;;;;;
+ADD4;HANGUL SYLLABLE GWISS;Lo;0;L;;;;;N;;;;;
+ADD5;HANGUL SYLLABLE GWING;Lo;0;L;;;;;N;;;;;
+ADD6;HANGUL SYLLABLE GWIJ;Lo;0;L;;;;;N;;;;;
+ADD7;HANGUL SYLLABLE GWIC;Lo;0;L;;;;;N;;;;;
+ADD8;HANGUL SYLLABLE GWIK;Lo;0;L;;;;;N;;;;;
+ADD9;HANGUL SYLLABLE GWIT;Lo;0;L;;;;;N;;;;;
+ADDA;HANGUL SYLLABLE GWIP;Lo;0;L;;;;;N;;;;;
+ADDB;HANGUL SYLLABLE GWIH;Lo;0;L;;;;;N;;;;;
+ADDC;HANGUL SYLLABLE GYU;Lo;0;L;;;;;N;;;;;
+ADDD;HANGUL SYLLABLE GYUG;Lo;0;L;;;;;N;;;;;
+ADDE;HANGUL SYLLABLE GYUGG;Lo;0;L;;;;;N;;;;;
+ADDF;HANGUL SYLLABLE GYUGS;Lo;0;L;;;;;N;;;;;
+ADE0;HANGUL SYLLABLE GYUN;Lo;0;L;;;;;N;;;;;
+ADE1;HANGUL SYLLABLE GYUNI;Lo;0;L;;;;;N;;;;;
+ADE2;HANGUL SYLLABLE GYUNH;Lo;0;L;;;;;N;;;;;
+ADE3;HANGUL SYLLABLE GYUD;Lo;0;L;;;;;N;;;;;
+ADE4;HANGUL SYLLABLE GYUL;Lo;0;L;;;;;N;;;;;
+ADE5;HANGUL SYLLABLE GYULG;Lo;0;L;;;;;N;;;;;
+ADE6;HANGUL SYLLABLE GYULM;Lo;0;L;;;;;N;;;;;
+ADE7;HANGUL SYLLABLE GYULB;Lo;0;L;;;;;N;;;;;
+ADE8;HANGUL SYLLABLE GYULS;Lo;0;L;;;;;N;;;;;
+ADE9;HANGUL SYLLABLE GYULT;Lo;0;L;;;;;N;;;;;
+ADEA;HANGUL SYLLABLE GYULP;Lo;0;L;;;;;N;;;;;
+ADEB;HANGUL SYLLABLE GYULH;Lo;0;L;;;;;N;;;;;
+ADEC;HANGUL SYLLABLE GYUM;Lo;0;L;;;;;N;;;;;
+ADED;HANGUL SYLLABLE GYUB;Lo;0;L;;;;;N;;;;;
+ADEE;HANGUL SYLLABLE GYUBS;Lo;0;L;;;;;N;;;;;
+ADEF;HANGUL SYLLABLE GYUS;Lo;0;L;;;;;N;;;;;
+ADF0;HANGUL SYLLABLE GYUSS;Lo;0;L;;;;;N;;;;;
+ADF1;HANGUL SYLLABLE GYUNG;Lo;0;L;;;;;N;;;;;
+ADF2;HANGUL SYLLABLE GYUJ;Lo;0;L;;;;;N;;;;;
+ADF3;HANGUL SYLLABLE GYUC;Lo;0;L;;;;;N;;;;;
+ADF4;HANGUL SYLLABLE GYUK;Lo;0;L;;;;;N;;;;;
+ADF5;HANGUL SYLLABLE GYUT;Lo;0;L;;;;;N;;;;;
+ADF6;HANGUL SYLLABLE GYUP;Lo;0;L;;;;;N;;;;;
+ADF7;HANGUL SYLLABLE GYUH;Lo;0;L;;;;;N;;;;;
+ADF8;HANGUL SYLLABLE GEU;Lo;0;L;;;;;N;;;;;
+ADF9;HANGUL SYLLABLE GEUG;Lo;0;L;;;;;N;;;;;
+ADFA;HANGUL SYLLABLE GEUGG;Lo;0;L;;;;;N;;;;;
+ADFB;HANGUL SYLLABLE GEUGS;Lo;0;L;;;;;N;;;;;
+ADFC;HANGUL SYLLABLE GEUN;Lo;0;L;;;;;N;;;;;
+ADFD;HANGUL SYLLABLE GEUNI;Lo;0;L;;;;;N;;;;;
+ADFE;HANGUL SYLLABLE GEUNH;Lo;0;L;;;;;N;;;;;
+ADFF;HANGUL SYLLABLE GEUD;Lo;0;L;;;;;N;;;;;
+AE00;HANGUL SYLLABLE GEUL;Lo;0;L;;;;;N;;;;;
+AE01;HANGUL SYLLABLE GEULG;Lo;0;L;;;;;N;;;;;
+AE02;HANGUL SYLLABLE GEULM;Lo;0;L;;;;;N;;;;;
+AE03;HANGUL SYLLABLE GEULB;Lo;0;L;;;;;N;;;;;
+AE04;HANGUL SYLLABLE GEULS;Lo;0;L;;;;;N;;;;;
+AE05;HANGUL SYLLABLE GEULT;Lo;0;L;;;;;N;;;;;
+AE06;HANGUL SYLLABLE GEULP;Lo;0;L;;;;;N;;;;;
+AE07;HANGUL SYLLABLE GEULH;Lo;0;L;;;;;N;;;;;
+AE08;HANGUL SYLLABLE GEUM;Lo;0;L;;;;;N;;;;;
+AE09;HANGUL SYLLABLE GEUB;Lo;0;L;;;;;N;;;;;
+AE0A;HANGUL SYLLABLE GEUBS;Lo;0;L;;;;;N;;;;;
+AE0B;HANGUL SYLLABLE GEUS;Lo;0;L;;;;;N;;;;;
+AE0C;HANGUL SYLLABLE GEUSS;Lo;0;L;;;;;N;;;;;
+AE0D;HANGUL SYLLABLE GEUNG;Lo;0;L;;;;;N;;;;;
+AE0E;HANGUL SYLLABLE GEUJ;Lo;0;L;;;;;N;;;;;
+AE0F;HANGUL SYLLABLE GEUC;Lo;0;L;;;;;N;;;;;
+AE10;HANGUL SYLLABLE GEUK;Lo;0;L;;;;;N;;;;;
+AE11;HANGUL SYLLABLE GEUT;Lo;0;L;;;;;N;;;;;
+AE12;HANGUL SYLLABLE GEUP;Lo;0;L;;;;;N;;;;;
+AE13;HANGUL SYLLABLE GEUH;Lo;0;L;;;;;N;;;;;
+AE14;HANGUL SYLLABLE GYI;Lo;0;L;;;;;N;;;;;
+AE15;HANGUL SYLLABLE GYIG;Lo;0;L;;;;;N;;;;;
+AE16;HANGUL SYLLABLE GYIGG;Lo;0;L;;;;;N;;;;;
+AE17;HANGUL SYLLABLE GYIGS;Lo;0;L;;;;;N;;;;;
+AE18;HANGUL SYLLABLE GYIN;Lo;0;L;;;;;N;;;;;
+AE19;HANGUL SYLLABLE GYINI;Lo;0;L;;;;;N;;;;;
+AE1A;HANGUL SYLLABLE GYINH;Lo;0;L;;;;;N;;;;;
+AE1B;HANGUL SYLLABLE GYID;Lo;0;L;;;;;N;;;;;
+AE1C;HANGUL SYLLABLE GYIL;Lo;0;L;;;;;N;;;;;
+AE1D;HANGUL SYLLABLE GYILG;Lo;0;L;;;;;N;;;;;
+AE1E;HANGUL SYLLABLE GYILM;Lo;0;L;;;;;N;;;;;
+AE1F;HANGUL SYLLABLE GYILB;Lo;0;L;;;;;N;;;;;
+AE20;HANGUL SYLLABLE GYILS;Lo;0;L;;;;;N;;;;;
+AE21;HANGUL SYLLABLE GYILT;Lo;0;L;;;;;N;;;;;
+AE22;HANGUL SYLLABLE GYILP;Lo;0;L;;;;;N;;;;;
+AE23;HANGUL SYLLABLE GYILH;Lo;0;L;;;;;N;;;;;
+AE24;HANGUL SYLLABLE GYIM;Lo;0;L;;;;;N;;;;;
+AE25;HANGUL SYLLABLE GYIB;Lo;0;L;;;;;N;;;;;
+AE26;HANGUL SYLLABLE GYIBS;Lo;0;L;;;;;N;;;;;
+AE27;HANGUL SYLLABLE GYIS;Lo;0;L;;;;;N;;;;;
+AE28;HANGUL SYLLABLE GYISS;Lo;0;L;;;;;N;;;;;
+AE29;HANGUL SYLLABLE GYING;Lo;0;L;;;;;N;;;;;
+AE2A;HANGUL SYLLABLE GYIJ;Lo;0;L;;;;;N;;;;;
+AE2B;HANGUL SYLLABLE GYIC;Lo;0;L;;;;;N;;;;;
+AE2C;HANGUL SYLLABLE GYIK;Lo;0;L;;;;;N;;;;;
+AE2D;HANGUL SYLLABLE GYIT;Lo;0;L;;;;;N;;;;;
+AE2E;HANGUL SYLLABLE GYIP;Lo;0;L;;;;;N;;;;;
+AE2F;HANGUL SYLLABLE GYIH;Lo;0;L;;;;;N;;;;;
+AE30;HANGUL SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+AE31;HANGUL SYLLABLE GIG;Lo;0;L;;;;;N;;;;;
+AE32;HANGUL SYLLABLE GIGG;Lo;0;L;;;;;N;;;;;
+AE33;HANGUL SYLLABLE GIGS;Lo;0;L;;;;;N;;;;;
+AE34;HANGUL SYLLABLE GIN;Lo;0;L;;;;;N;;;;;
+AE35;HANGUL SYLLABLE GINI;Lo;0;L;;;;;N;;;;;
+AE36;HANGUL SYLLABLE GINH;Lo;0;L;;;;;N;;;;;
+AE37;HANGUL SYLLABLE GID;Lo;0;L;;;;;N;;;;;
+AE38;HANGUL SYLLABLE GIL;Lo;0;L;;;;;N;;;;;
+AE39;HANGUL SYLLABLE GILG;Lo;0;L;;;;;N;;;;;
+AE3A;HANGUL SYLLABLE GILM;Lo;0;L;;;;;N;;;;;
+AE3B;HANGUL SYLLABLE GILB;Lo;0;L;;;;;N;;;;;
+AE3C;HANGUL SYLLABLE GILS;Lo;0;L;;;;;N;;;;;
+AE3D;HANGUL SYLLABLE GILT;Lo;0;L;;;;;N;;;;;
+AE3E;HANGUL SYLLABLE GILP;Lo;0;L;;;;;N;;;;;
+AE3F;HANGUL SYLLABLE GILH;Lo;0;L;;;;;N;;;;;
+AE40;HANGUL SYLLABLE GIM;Lo;0;L;;;;;N;;;;;
+AE41;HANGUL SYLLABLE GIB;Lo;0;L;;;;;N;;;;;
+AE42;HANGUL SYLLABLE GIBS;Lo;0;L;;;;;N;;;;;
+AE43;HANGUL SYLLABLE GIS;Lo;0;L;;;;;N;;;;;
+AE44;HANGUL SYLLABLE GISS;Lo;0;L;;;;;N;;;;;
+AE45;HANGUL SYLLABLE GING;Lo;0;L;;;;;N;;;;;
+AE46;HANGUL SYLLABLE GIJ;Lo;0;L;;;;;N;;;;;
+AE47;HANGUL SYLLABLE GIC;Lo;0;L;;;;;N;;;;;
+AE48;HANGUL SYLLABLE GIK;Lo;0;L;;;;;N;;;;;
+AE49;HANGUL SYLLABLE GIT;Lo;0;L;;;;;N;;;;;
+AE4A;HANGUL SYLLABLE GIP;Lo;0;L;;;;;N;;;;;
+AE4B;HANGUL SYLLABLE GIH;Lo;0;L;;;;;N;;;;;
+AE4C;HANGUL SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+AE4D;HANGUL SYLLABLE GGAG;Lo;0;L;;;;;N;;;;;
+AE4E;HANGUL SYLLABLE GGAGG;Lo;0;L;;;;;N;;;;;
+AE4F;HANGUL SYLLABLE GGAGS;Lo;0;L;;;;;N;;;;;
+AE50;HANGUL SYLLABLE GGAN;Lo;0;L;;;;;N;;;;;
+AE51;HANGUL SYLLABLE GGANI;Lo;0;L;;;;;N;;;;;
+AE52;HANGUL SYLLABLE GGANH;Lo;0;L;;;;;N;;;;;
+AE53;HANGUL SYLLABLE GGAD;Lo;0;L;;;;;N;;;;;
+AE54;HANGUL SYLLABLE GGAL;Lo;0;L;;;;;N;;;;;
+AE55;HANGUL SYLLABLE GGALG;Lo;0;L;;;;;N;;;;;
+AE56;HANGUL SYLLABLE GGALM;Lo;0;L;;;;;N;;;;;
+AE57;HANGUL SYLLABLE GGALB;Lo;0;L;;;;;N;;;;;
+AE58;HANGUL SYLLABLE GGALS;Lo;0;L;;;;;N;;;;;
+AE59;HANGUL SYLLABLE GGALT;Lo;0;L;;;;;N;;;;;
+AE5A;HANGUL SYLLABLE GGALP;Lo;0;L;;;;;N;;;;;
+AE5B;HANGUL SYLLABLE GGALH;Lo;0;L;;;;;N;;;;;
+AE5C;HANGUL SYLLABLE GGAM;Lo;0;L;;;;;N;;;;;
+AE5D;HANGUL SYLLABLE GGAB;Lo;0;L;;;;;N;;;;;
+AE5E;HANGUL SYLLABLE GGABS;Lo;0;L;;;;;N;;;;;
+AE5F;HANGUL SYLLABLE GGAS;Lo;0;L;;;;;N;;;;;
+AE60;HANGUL SYLLABLE GGASS;Lo;0;L;;;;;N;;;;;
+AE61;HANGUL SYLLABLE GGANG;Lo;0;L;;;;;N;;;;;
+AE62;HANGUL SYLLABLE GGAJ;Lo;0;L;;;;;N;;;;;
+AE63;HANGUL SYLLABLE GGAC;Lo;0;L;;;;;N;;;;;
+AE64;HANGUL SYLLABLE GGAK;Lo;0;L;;;;;N;;;;;
+AE65;HANGUL SYLLABLE GGAT;Lo;0;L;;;;;N;;;;;
+AE66;HANGUL SYLLABLE GGAP;Lo;0;L;;;;;N;;;;;
+AE67;HANGUL SYLLABLE GGAH;Lo;0;L;;;;;N;;;;;
+AE68;HANGUL SYLLABLE GGAE;Lo;0;L;;;;;N;;;;;
+AE69;HANGUL SYLLABLE GGAEG;Lo;0;L;;;;;N;;;;;
+AE6A;HANGUL SYLLABLE GGAEGG;Lo;0;L;;;;;N;;;;;
+AE6B;HANGUL SYLLABLE GGAEGS;Lo;0;L;;;;;N;;;;;
+AE6C;HANGUL SYLLABLE GGAEN;Lo;0;L;;;;;N;;;;;
+AE6D;HANGUL SYLLABLE GGAENI;Lo;0;L;;;;;N;;;;;
+AE6E;HANGUL SYLLABLE GGAENH;Lo;0;L;;;;;N;;;;;
+AE6F;HANGUL SYLLABLE GGAED;Lo;0;L;;;;;N;;;;;
+AE70;HANGUL SYLLABLE GGAEL;Lo;0;L;;;;;N;;;;;
+AE71;HANGUL SYLLABLE GGAELG;Lo;0;L;;;;;N;;;;;
+AE72;HANGUL SYLLABLE GGAELM;Lo;0;L;;;;;N;;;;;
+AE73;HANGUL SYLLABLE GGAELB;Lo;0;L;;;;;N;;;;;
+AE74;HANGUL SYLLABLE GGAELS;Lo;0;L;;;;;N;;;;;
+AE75;HANGUL SYLLABLE GGAELT;Lo;0;L;;;;;N;;;;;
+AE76;HANGUL SYLLABLE GGAELP;Lo;0;L;;;;;N;;;;;
+AE77;HANGUL SYLLABLE GGAELH;Lo;0;L;;;;;N;;;;;
+AE78;HANGUL SYLLABLE GGAEM;Lo;0;L;;;;;N;;;;;
+AE79;HANGUL SYLLABLE GGAEB;Lo;0;L;;;;;N;;;;;
+AE7A;HANGUL SYLLABLE GGAEBS;Lo;0;L;;;;;N;;;;;
+AE7B;HANGUL SYLLABLE GGAES;Lo;0;L;;;;;N;;;;;
+AE7C;HANGUL SYLLABLE GGAESS;Lo;0;L;;;;;N;;;;;
+AE7D;HANGUL SYLLABLE GGAENG;Lo;0;L;;;;;N;;;;;
+AE7E;HANGUL SYLLABLE GGAEJ;Lo;0;L;;;;;N;;;;;
+AE7F;HANGUL SYLLABLE GGAEC;Lo;0;L;;;;;N;;;;;
+AE80;HANGUL SYLLABLE GGAEK;Lo;0;L;;;;;N;;;;;
+AE81;HANGUL SYLLABLE GGAET;Lo;0;L;;;;;N;;;;;
+AE82;HANGUL SYLLABLE GGAEP;Lo;0;L;;;;;N;;;;;
+AE83;HANGUL SYLLABLE GGAEH;Lo;0;L;;;;;N;;;;;
+AE84;HANGUL SYLLABLE GGYA;Lo;0;L;;;;;N;;;;;
+AE85;HANGUL SYLLABLE GGYAG;Lo;0;L;;;;;N;;;;;
+AE86;HANGUL SYLLABLE GGYAGG;Lo;0;L;;;;;N;;;;;
+AE87;HANGUL SYLLABLE GGYAGS;Lo;0;L;;;;;N;;;;;
+AE88;HANGUL SYLLABLE GGYAN;Lo;0;L;;;;;N;;;;;
+AE89;HANGUL SYLLABLE GGYANI;Lo;0;L;;;;;N;;;;;
+AE8A;HANGUL SYLLABLE GGYANH;Lo;0;L;;;;;N;;;;;
+AE8B;HANGUL SYLLABLE GGYAD;Lo;0;L;;;;;N;;;;;
+AE8C;HANGUL SYLLABLE GGYAL;Lo;0;L;;;;;N;;;;;
+AE8D;HANGUL SYLLABLE GGYALG;Lo;0;L;;;;;N;;;;;
+AE8E;HANGUL SYLLABLE GGYALM;Lo;0;L;;;;;N;;;;;
+AE8F;HANGUL SYLLABLE GGYALB;Lo;0;L;;;;;N;;;;;
+AE90;HANGUL SYLLABLE GGYALS;Lo;0;L;;;;;N;;;;;
+AE91;HANGUL SYLLABLE GGYALT;Lo;0;L;;;;;N;;;;;
+AE92;HANGUL SYLLABLE GGYALP;Lo;0;L;;;;;N;;;;;
+AE93;HANGUL SYLLABLE GGYALH;Lo;0;L;;;;;N;;;;;
+AE94;HANGUL SYLLABLE GGYAM;Lo;0;L;;;;;N;;;;;
+AE95;HANGUL SYLLABLE GGYAB;Lo;0;L;;;;;N;;;;;
+AE96;HANGUL SYLLABLE GGYABS;Lo;0;L;;;;;N;;;;;
+AE97;HANGUL SYLLABLE GGYAS;Lo;0;L;;;;;N;;;;;
+AE98;HANGUL SYLLABLE GGYASS;Lo;0;L;;;;;N;;;;;
+AE99;HANGUL SYLLABLE GGYANG;Lo;0;L;;;;;N;;;;;
+AE9A;HANGUL SYLLABLE GGYAJ;Lo;0;L;;;;;N;;;;;
+AE9B;HANGUL SYLLABLE GGYAC;Lo;0;L;;;;;N;;;;;
+AE9C;HANGUL SYLLABLE GGYAK;Lo;0;L;;;;;N;;;;;
+AE9D;HANGUL SYLLABLE GGYAT;Lo;0;L;;;;;N;;;;;
+AE9E;HANGUL SYLLABLE GGYAP;Lo;0;L;;;;;N;;;;;
+AE9F;HANGUL SYLLABLE GGYAH;Lo;0;L;;;;;N;;;;;
+AEA0;HANGUL SYLLABLE GGYAE;Lo;0;L;;;;;N;;;;;
+AEA1;HANGUL SYLLABLE GGYAEG;Lo;0;L;;;;;N;;;;;
+AEA2;HANGUL SYLLABLE GGYAEGG;Lo;0;L;;;;;N;;;;;
+AEA3;HANGUL SYLLABLE GGYAEGS;Lo;0;L;;;;;N;;;;;
+AEA4;HANGUL SYLLABLE GGYAEN;Lo;0;L;;;;;N;;;;;
+AEA5;HANGUL SYLLABLE GGYAENI;Lo;0;L;;;;;N;;;;;
+AEA6;HANGUL SYLLABLE GGYAENH;Lo;0;L;;;;;N;;;;;
+AEA7;HANGUL SYLLABLE GGYAED;Lo;0;L;;;;;N;;;;;
+AEA8;HANGUL SYLLABLE GGYAEL;Lo;0;L;;;;;N;;;;;
+AEA9;HANGUL SYLLABLE GGYAELG;Lo;0;L;;;;;N;;;;;
+AEAA;HANGUL SYLLABLE GGYAELM;Lo;0;L;;;;;N;;;;;
+AEAB;HANGUL SYLLABLE GGYAELB;Lo;0;L;;;;;N;;;;;
+AEAC;HANGUL SYLLABLE GGYAELS;Lo;0;L;;;;;N;;;;;
+AEAD;HANGUL SYLLABLE GGYAELT;Lo;0;L;;;;;N;;;;;
+AEAE;HANGUL SYLLABLE GGYAELP;Lo;0;L;;;;;N;;;;;
+AEAF;HANGUL SYLLABLE GGYAELH;Lo;0;L;;;;;N;;;;;
+AEB0;HANGUL SYLLABLE GGYAEM;Lo;0;L;;;;;N;;;;;
+AEB1;HANGUL SYLLABLE GGYAEB;Lo;0;L;;;;;N;;;;;
+AEB2;HANGUL SYLLABLE GGYAEBS;Lo;0;L;;;;;N;;;;;
+AEB3;HANGUL SYLLABLE GGYAES;Lo;0;L;;;;;N;;;;;
+AEB4;HANGUL SYLLABLE GGYAESS;Lo;0;L;;;;;N;;;;;
+AEB5;HANGUL SYLLABLE GGYAENG;Lo;0;L;;;;;N;;;;;
+AEB6;HANGUL SYLLABLE GGYAEJ;Lo;0;L;;;;;N;;;;;
+AEB7;HANGUL SYLLABLE GGYAEC;Lo;0;L;;;;;N;;;;;
+AEB8;HANGUL SYLLABLE GGYAEK;Lo;0;L;;;;;N;;;;;
+AEB9;HANGUL SYLLABLE GGYAET;Lo;0;L;;;;;N;;;;;
+AEBA;HANGUL SYLLABLE GGYAEP;Lo;0;L;;;;;N;;;;;
+AEBB;HANGUL SYLLABLE GGYAEH;Lo;0;L;;;;;N;;;;;
+AEBC;HANGUL SYLLABLE GGEO;Lo;0;L;;;;;N;;;;;
+AEBD;HANGUL SYLLABLE GGEOG;Lo;0;L;;;;;N;;;;;
+AEBE;HANGUL SYLLABLE GGEOGG;Lo;0;L;;;;;N;;;;;
+AEBF;HANGUL SYLLABLE GGEOGS;Lo;0;L;;;;;N;;;;;
+AEC0;HANGUL SYLLABLE GGEON;Lo;0;L;;;;;N;;;;;
+AEC1;HANGUL SYLLABLE GGEONI;Lo;0;L;;;;;N;;;;;
+AEC2;HANGUL SYLLABLE GGEONH;Lo;0;L;;;;;N;;;;;
+AEC3;HANGUL SYLLABLE GGEOD;Lo;0;L;;;;;N;;;;;
+AEC4;HANGUL SYLLABLE GGEOL;Lo;0;L;;;;;N;;;;;
+AEC5;HANGUL SYLLABLE GGEOLG;Lo;0;L;;;;;N;;;;;
+AEC6;HANGUL SYLLABLE GGEOLM;Lo;0;L;;;;;N;;;;;
+AEC7;HANGUL SYLLABLE GGEOLB;Lo;0;L;;;;;N;;;;;
+AEC8;HANGUL SYLLABLE GGEOLS;Lo;0;L;;;;;N;;;;;
+AEC9;HANGUL SYLLABLE GGEOLT;Lo;0;L;;;;;N;;;;;
+AECA;HANGUL SYLLABLE GGEOLP;Lo;0;L;;;;;N;;;;;
+AECB;HANGUL SYLLABLE GGEOLH;Lo;0;L;;;;;N;;;;;
+AECC;HANGUL SYLLABLE GGEOM;Lo;0;L;;;;;N;;;;;
+AECD;HANGUL SYLLABLE GGEOB;Lo;0;L;;;;;N;;;;;
+AECE;HANGUL SYLLABLE GGEOBS;Lo;0;L;;;;;N;;;;;
+AECF;HANGUL SYLLABLE GGEOS;Lo;0;L;;;;;N;;;;;
+AED0;HANGUL SYLLABLE GGEOSS;Lo;0;L;;;;;N;;;;;
+AED1;HANGUL SYLLABLE GGEONG;Lo;0;L;;;;;N;;;;;
+AED2;HANGUL SYLLABLE GGEOJ;Lo;0;L;;;;;N;;;;;
+AED3;HANGUL SYLLABLE GGEOC;Lo;0;L;;;;;N;;;;;
+AED4;HANGUL SYLLABLE GGEOK;Lo;0;L;;;;;N;;;;;
+AED5;HANGUL SYLLABLE GGEOT;Lo;0;L;;;;;N;;;;;
+AED6;HANGUL SYLLABLE GGEOP;Lo;0;L;;;;;N;;;;;
+AED7;HANGUL SYLLABLE GGEOH;Lo;0;L;;;;;N;;;;;
+AED8;HANGUL SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+AED9;HANGUL SYLLABLE GGEG;Lo;0;L;;;;;N;;;;;
+AEDA;HANGUL SYLLABLE GGEGG;Lo;0;L;;;;;N;;;;;
+AEDB;HANGUL SYLLABLE GGEGS;Lo;0;L;;;;;N;;;;;
+AEDC;HANGUL SYLLABLE GGEN;Lo;0;L;;;;;N;;;;;
+AEDD;HANGUL SYLLABLE GGENI;Lo;0;L;;;;;N;;;;;
+AEDE;HANGUL SYLLABLE GGENH;Lo;0;L;;;;;N;;;;;
+AEDF;HANGUL SYLLABLE GGED;Lo;0;L;;;;;N;;;;;
+AEE0;HANGUL SYLLABLE GGEL;Lo;0;L;;;;;N;;;;;
+AEE1;HANGUL SYLLABLE GGELG;Lo;0;L;;;;;N;;;;;
+AEE2;HANGUL SYLLABLE GGELM;Lo;0;L;;;;;N;;;;;
+AEE3;HANGUL SYLLABLE GGELB;Lo;0;L;;;;;N;;;;;
+AEE4;HANGUL SYLLABLE GGELS;Lo;0;L;;;;;N;;;;;
+AEE5;HANGUL SYLLABLE GGELT;Lo;0;L;;;;;N;;;;;
+AEE6;HANGUL SYLLABLE GGELP;Lo;0;L;;;;;N;;;;;
+AEE7;HANGUL SYLLABLE GGELH;Lo;0;L;;;;;N;;;;;
+AEE8;HANGUL SYLLABLE GGEM;Lo;0;L;;;;;N;;;;;
+AEE9;HANGUL SYLLABLE GGEB;Lo;0;L;;;;;N;;;;;
+AEEA;HANGUL SYLLABLE GGEBS;Lo;0;L;;;;;N;;;;;
+AEEB;HANGUL SYLLABLE GGES;Lo;0;L;;;;;N;;;;;
+AEEC;HANGUL SYLLABLE GGESS;Lo;0;L;;;;;N;;;;;
+AEED;HANGUL SYLLABLE GGENG;Lo;0;L;;;;;N;;;;;
+AEEE;HANGUL SYLLABLE GGEJ;Lo;0;L;;;;;N;;;;;
+AEEF;HANGUL SYLLABLE GGEC;Lo;0;L;;;;;N;;;;;
+AEF0;HANGUL SYLLABLE GGEK;Lo;0;L;;;;;N;;;;;
+AEF1;HANGUL SYLLABLE GGET;Lo;0;L;;;;;N;;;;;
+AEF2;HANGUL SYLLABLE GGEP;Lo;0;L;;;;;N;;;;;
+AEF3;HANGUL SYLLABLE GGEH;Lo;0;L;;;;;N;;;;;
+AEF4;HANGUL SYLLABLE GGYEO;Lo;0;L;;;;;N;;;;;
+AEF5;HANGUL SYLLABLE GGYEOG;Lo;0;L;;;;;N;;;;;
+AEF6;HANGUL SYLLABLE GGYEOGG;Lo;0;L;;;;;N;;;;;
+AEF7;HANGUL SYLLABLE GGYEOGS;Lo;0;L;;;;;N;;;;;
+AEF8;HANGUL SYLLABLE GGYEON;Lo;0;L;;;;;N;;;;;
+AEF9;HANGUL SYLLABLE GGYEONI;Lo;0;L;;;;;N;;;;;
+AEFA;HANGUL SYLLABLE GGYEONH;Lo;0;L;;;;;N;;;;;
+AEFB;HANGUL SYLLABLE GGYEOD;Lo;0;L;;;;;N;;;;;
+AEFC;HANGUL SYLLABLE GGYEOL;Lo;0;L;;;;;N;;;;;
+AEFD;HANGUL SYLLABLE GGYEOLG;Lo;0;L;;;;;N;;;;;
+AEFE;HANGUL SYLLABLE GGYEOLM;Lo;0;L;;;;;N;;;;;
+AEFF;HANGUL SYLLABLE GGYEOLB;Lo;0;L;;;;;N;;;;;
+AF00;HANGUL SYLLABLE GGYEOLS;Lo;0;L;;;;;N;;;;;
+AF01;HANGUL SYLLABLE GGYEOLT;Lo;0;L;;;;;N;;;;;
+AF02;HANGUL SYLLABLE GGYEOLP;Lo;0;L;;;;;N;;;;;
+AF03;HANGUL SYLLABLE GGYEOLH;Lo;0;L;;;;;N;;;;;
+AF04;HANGUL SYLLABLE GGYEOM;Lo;0;L;;;;;N;;;;;
+AF05;HANGUL SYLLABLE GGYEOB;Lo;0;L;;;;;N;;;;;
+AF06;HANGUL SYLLABLE GGYEOBS;Lo;0;L;;;;;N;;;;;
+AF07;HANGUL SYLLABLE GGYEOS;Lo;0;L;;;;;N;;;;;
+AF08;HANGUL SYLLABLE GGYEOSS;Lo;0;L;;;;;N;;;;;
+AF09;HANGUL SYLLABLE GGYEONG;Lo;0;L;;;;;N;;;;;
+AF0A;HANGUL SYLLABLE GGYEOJ;Lo;0;L;;;;;N;;;;;
+AF0B;HANGUL SYLLABLE GGYEOC;Lo;0;L;;;;;N;;;;;
+AF0C;HANGUL SYLLABLE GGYEOK;Lo;0;L;;;;;N;;;;;
+AF0D;HANGUL SYLLABLE GGYEOT;Lo;0;L;;;;;N;;;;;
+AF0E;HANGUL SYLLABLE GGYEOP;Lo;0;L;;;;;N;;;;;
+AF0F;HANGUL SYLLABLE GGYEOH;Lo;0;L;;;;;N;;;;;
+AF10;HANGUL SYLLABLE GGYE;Lo;0;L;;;;;N;;;;;
+AF11;HANGUL SYLLABLE GGYEG;Lo;0;L;;;;;N;;;;;
+AF12;HANGUL SYLLABLE GGYEGG;Lo;0;L;;;;;N;;;;;
+AF13;HANGUL SYLLABLE GGYEGS;Lo;0;L;;;;;N;;;;;
+AF14;HANGUL SYLLABLE GGYEN;Lo;0;L;;;;;N;;;;;
+AF15;HANGUL SYLLABLE GGYENI;Lo;0;L;;;;;N;;;;;
+AF16;HANGUL SYLLABLE GGYENH;Lo;0;L;;;;;N;;;;;
+AF17;HANGUL SYLLABLE GGYED;Lo;0;L;;;;;N;;;;;
+AF18;HANGUL SYLLABLE GGYEL;Lo;0;L;;;;;N;;;;;
+AF19;HANGUL SYLLABLE GGYELG;Lo;0;L;;;;;N;;;;;
+AF1A;HANGUL SYLLABLE GGYELM;Lo;0;L;;;;;N;;;;;
+AF1B;HANGUL SYLLABLE GGYELB;Lo;0;L;;;;;N;;;;;
+AF1C;HANGUL SYLLABLE GGYELS;Lo;0;L;;;;;N;;;;;
+AF1D;HANGUL SYLLABLE GGYELT;Lo;0;L;;;;;N;;;;;
+AF1E;HANGUL SYLLABLE GGYELP;Lo;0;L;;;;;N;;;;;
+AF1F;HANGUL SYLLABLE GGYELH;Lo;0;L;;;;;N;;;;;
+AF20;HANGUL SYLLABLE GGYEM;Lo;0;L;;;;;N;;;;;
+AF21;HANGUL SYLLABLE GGYEB;Lo;0;L;;;;;N;;;;;
+AF22;HANGUL SYLLABLE GGYEBS;Lo;0;L;;;;;N;;;;;
+AF23;HANGUL SYLLABLE GGYES;Lo;0;L;;;;;N;;;;;
+AF24;HANGUL SYLLABLE GGYESS;Lo;0;L;;;;;N;;;;;
+AF25;HANGUL SYLLABLE GGYENG;Lo;0;L;;;;;N;;;;;
+AF26;HANGUL SYLLABLE GGYEJ;Lo;0;L;;;;;N;;;;;
+AF27;HANGUL SYLLABLE GGYEC;Lo;0;L;;;;;N;;;;;
+AF28;HANGUL SYLLABLE GGYEK;Lo;0;L;;;;;N;;;;;
+AF29;HANGUL SYLLABLE GGYET;Lo;0;L;;;;;N;;;;;
+AF2A;HANGUL SYLLABLE GGYEP;Lo;0;L;;;;;N;;;;;
+AF2B;HANGUL SYLLABLE GGYEH;Lo;0;L;;;;;N;;;;;
+AF2C;HANGUL SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+AF2D;HANGUL SYLLABLE GGOG;Lo;0;L;;;;;N;;;;;
+AF2E;HANGUL SYLLABLE GGOGG;Lo;0;L;;;;;N;;;;;
+AF2F;HANGUL SYLLABLE GGOGS;Lo;0;L;;;;;N;;;;;
+AF30;HANGUL SYLLABLE GGON;Lo;0;L;;;;;N;;;;;
+AF31;HANGUL SYLLABLE GGONI;Lo;0;L;;;;;N;;;;;
+AF32;HANGUL SYLLABLE GGONH;Lo;0;L;;;;;N;;;;;
+AF33;HANGUL SYLLABLE GGOD;Lo;0;L;;;;;N;;;;;
+AF34;HANGUL SYLLABLE GGOL;Lo;0;L;;;;;N;;;;;
+AF35;HANGUL SYLLABLE GGOLG;Lo;0;L;;;;;N;;;;;
+AF36;HANGUL SYLLABLE GGOLM;Lo;0;L;;;;;N;;;;;
+AF37;HANGUL SYLLABLE GGOLB;Lo;0;L;;;;;N;;;;;
+AF38;HANGUL SYLLABLE GGOLS;Lo;0;L;;;;;N;;;;;
+AF39;HANGUL SYLLABLE GGOLT;Lo;0;L;;;;;N;;;;;
+AF3A;HANGUL SYLLABLE GGOLP;Lo;0;L;;;;;N;;;;;
+AF3B;HANGUL SYLLABLE GGOLH;Lo;0;L;;;;;N;;;;;
+AF3C;HANGUL SYLLABLE GGOM;Lo;0;L;;;;;N;;;;;
+AF3D;HANGUL SYLLABLE GGOB;Lo;0;L;;;;;N;;;;;
+AF3E;HANGUL SYLLABLE GGOBS;Lo;0;L;;;;;N;;;;;
+AF3F;HANGUL SYLLABLE GGOS;Lo;0;L;;;;;N;;;;;
+AF40;HANGUL SYLLABLE GGOSS;Lo;0;L;;;;;N;;;;;
+AF41;HANGUL SYLLABLE GGONG;Lo;0;L;;;;;N;;;;;
+AF42;HANGUL SYLLABLE GGOJ;Lo;0;L;;;;;N;;;;;
+AF43;HANGUL SYLLABLE GGOC;Lo;0;L;;;;;N;;;;;
+AF44;HANGUL SYLLABLE GGOK;Lo;0;L;;;;;N;;;;;
+AF45;HANGUL SYLLABLE GGOT;Lo;0;L;;;;;N;;;;;
+AF46;HANGUL SYLLABLE GGOP;Lo;0;L;;;;;N;;;;;
+AF47;HANGUL SYLLABLE GGOH;Lo;0;L;;;;;N;;;;;
+AF48;HANGUL SYLLABLE GGWA;Lo;0;L;;;;;N;;;;;
+AF49;HANGUL SYLLABLE GGWAG;Lo;0;L;;;;;N;;;;;
+AF4A;HANGUL SYLLABLE GGWAGG;Lo;0;L;;;;;N;;;;;
+AF4B;HANGUL SYLLABLE GGWAGS;Lo;0;L;;;;;N;;;;;
+AF4C;HANGUL SYLLABLE GGWAN;Lo;0;L;;;;;N;;;;;
+AF4D;HANGUL SYLLABLE GGWANI;Lo;0;L;;;;;N;;;;;
+AF4E;HANGUL SYLLABLE GGWANH;Lo;0;L;;;;;N;;;;;
+AF4F;HANGUL SYLLABLE GGWAD;Lo;0;L;;;;;N;;;;;
+AF50;HANGUL SYLLABLE GGWAL;Lo;0;L;;;;;N;;;;;
+AF51;HANGUL SYLLABLE GGWALG;Lo;0;L;;;;;N;;;;;
+AF52;HANGUL SYLLABLE GGWALM;Lo;0;L;;;;;N;;;;;
+AF53;HANGUL SYLLABLE GGWALB;Lo;0;L;;;;;N;;;;;
+AF54;HANGUL SYLLABLE GGWALS;Lo;0;L;;;;;N;;;;;
+AF55;HANGUL SYLLABLE GGWALT;Lo;0;L;;;;;N;;;;;
+AF56;HANGUL SYLLABLE GGWALP;Lo;0;L;;;;;N;;;;;
+AF57;HANGUL SYLLABLE GGWALH;Lo;0;L;;;;;N;;;;;
+AF58;HANGUL SYLLABLE GGWAM;Lo;0;L;;;;;N;;;;;
+AF59;HANGUL SYLLABLE GGWAB;Lo;0;L;;;;;N;;;;;
+AF5A;HANGUL SYLLABLE GGWABS;Lo;0;L;;;;;N;;;;;
+AF5B;HANGUL SYLLABLE GGWAS;Lo;0;L;;;;;N;;;;;
+AF5C;HANGUL SYLLABLE GGWASS;Lo;0;L;;;;;N;;;;;
+AF5D;HANGUL SYLLABLE GGWANG;Lo;0;L;;;;;N;;;;;
+AF5E;HANGUL SYLLABLE GGWAJ;Lo;0;L;;;;;N;;;;;
+AF5F;HANGUL SYLLABLE GGWAC;Lo;0;L;;;;;N;;;;;
+AF60;HANGUL SYLLABLE GGWAK;Lo;0;L;;;;;N;;;;;
+AF61;HANGUL SYLLABLE GGWAT;Lo;0;L;;;;;N;;;;;
+AF62;HANGUL SYLLABLE GGWAP;Lo;0;L;;;;;N;;;;;
+AF63;HANGUL SYLLABLE GGWAH;Lo;0;L;;;;;N;;;;;
+AF64;HANGUL SYLLABLE GGWAE;Lo;0;L;;;;;N;;;;;
+AF65;HANGUL SYLLABLE GGWAEG;Lo;0;L;;;;;N;;;;;
+AF66;HANGUL SYLLABLE GGWAEGG;Lo;0;L;;;;;N;;;;;
+AF67;HANGUL SYLLABLE GGWAEGS;Lo;0;L;;;;;N;;;;;
+AF68;HANGUL SYLLABLE GGWAEN;Lo;0;L;;;;;N;;;;;
+AF69;HANGUL SYLLABLE GGWAENI;Lo;0;L;;;;;N;;;;;
+AF6A;HANGUL SYLLABLE GGWAENH;Lo;0;L;;;;;N;;;;;
+AF6B;HANGUL SYLLABLE GGWAED;Lo;0;L;;;;;N;;;;;
+AF6C;HANGUL SYLLABLE GGWAEL;Lo;0;L;;;;;N;;;;;
+AF6D;HANGUL SYLLABLE GGWAELG;Lo;0;L;;;;;N;;;;;
+AF6E;HANGUL SYLLABLE GGWAELM;Lo;0;L;;;;;N;;;;;
+AF6F;HANGUL SYLLABLE GGWAELB;Lo;0;L;;;;;N;;;;;
+AF70;HANGUL SYLLABLE GGWAELS;Lo;0;L;;;;;N;;;;;
+AF71;HANGUL SYLLABLE GGWAELT;Lo;0;L;;;;;N;;;;;
+AF72;HANGUL SYLLABLE GGWAELP;Lo;0;L;;;;;N;;;;;
+AF73;HANGUL SYLLABLE GGWAELH;Lo;0;L;;;;;N;;;;;
+AF74;HANGUL SYLLABLE GGWAEM;Lo;0;L;;;;;N;;;;;
+AF75;HANGUL SYLLABLE GGWAEB;Lo;0;L;;;;;N;;;;;
+AF76;HANGUL SYLLABLE GGWAEBS;Lo;0;L;;;;;N;;;;;
+AF77;HANGUL SYLLABLE GGWAES;Lo;0;L;;;;;N;;;;;
+AF78;HANGUL SYLLABLE GGWAESS;Lo;0;L;;;;;N;;;;;
+AF79;HANGUL SYLLABLE GGWAENG;Lo;0;L;;;;;N;;;;;
+AF7A;HANGUL SYLLABLE GGWAEJ;Lo;0;L;;;;;N;;;;;
+AF7B;HANGUL SYLLABLE GGWAEC;Lo;0;L;;;;;N;;;;;
+AF7C;HANGUL SYLLABLE GGWAEK;Lo;0;L;;;;;N;;;;;
+AF7D;HANGUL SYLLABLE GGWAET;Lo;0;L;;;;;N;;;;;
+AF7E;HANGUL SYLLABLE GGWAEP;Lo;0;L;;;;;N;;;;;
+AF7F;HANGUL SYLLABLE GGWAEH;Lo;0;L;;;;;N;;;;;
+AF80;HANGUL SYLLABLE GGOE;Lo;0;L;;;;;N;;;;;
+AF81;HANGUL SYLLABLE GGOEG;Lo;0;L;;;;;N;;;;;
+AF82;HANGUL SYLLABLE GGOEGG;Lo;0;L;;;;;N;;;;;
+AF83;HANGUL SYLLABLE GGOEGS;Lo;0;L;;;;;N;;;;;
+AF84;HANGUL SYLLABLE GGOEN;Lo;0;L;;;;;N;;;;;
+AF85;HANGUL SYLLABLE GGOENI;Lo;0;L;;;;;N;;;;;
+AF86;HANGUL SYLLABLE GGOENH;Lo;0;L;;;;;N;;;;;
+AF87;HANGUL SYLLABLE GGOED;Lo;0;L;;;;;N;;;;;
+AF88;HANGUL SYLLABLE GGOEL;Lo;0;L;;;;;N;;;;;
+AF89;HANGUL SYLLABLE GGOELG;Lo;0;L;;;;;N;;;;;
+AF8A;HANGUL SYLLABLE GGOELM;Lo;0;L;;;;;N;;;;;
+AF8B;HANGUL SYLLABLE GGOELB;Lo;0;L;;;;;N;;;;;
+AF8C;HANGUL SYLLABLE GGOELS;Lo;0;L;;;;;N;;;;;
+AF8D;HANGUL SYLLABLE GGOELT;Lo;0;L;;;;;N;;;;;
+AF8E;HANGUL SYLLABLE GGOELP;Lo;0;L;;;;;N;;;;;
+AF8F;HANGUL SYLLABLE GGOELH;Lo;0;L;;;;;N;;;;;
+AF90;HANGUL SYLLABLE GGOEM;Lo;0;L;;;;;N;;;;;
+AF91;HANGUL SYLLABLE GGOEB;Lo;0;L;;;;;N;;;;;
+AF92;HANGUL SYLLABLE GGOEBS;Lo;0;L;;;;;N;;;;;
+AF93;HANGUL SYLLABLE GGOES;Lo;0;L;;;;;N;;;;;
+AF94;HANGUL SYLLABLE GGOESS;Lo;0;L;;;;;N;;;;;
+AF95;HANGUL SYLLABLE GGOENG;Lo;0;L;;;;;N;;;;;
+AF96;HANGUL SYLLABLE GGOEJ;Lo;0;L;;;;;N;;;;;
+AF97;HANGUL SYLLABLE GGOEC;Lo;0;L;;;;;N;;;;;
+AF98;HANGUL SYLLABLE GGOEK;Lo;0;L;;;;;N;;;;;
+AF99;HANGUL SYLLABLE GGOET;Lo;0;L;;;;;N;;;;;
+AF9A;HANGUL SYLLABLE GGOEP;Lo;0;L;;;;;N;;;;;
+AF9B;HANGUL SYLLABLE GGOEH;Lo;0;L;;;;;N;;;;;
+AF9C;HANGUL SYLLABLE GGYO;Lo;0;L;;;;;N;;;;;
+AF9D;HANGUL SYLLABLE GGYOG;Lo;0;L;;;;;N;;;;;
+AF9E;HANGUL SYLLABLE GGYOGG;Lo;0;L;;;;;N;;;;;
+AF9F;HANGUL SYLLABLE GGYOGS;Lo;0;L;;;;;N;;;;;
+AFA0;HANGUL SYLLABLE GGYON;Lo;0;L;;;;;N;;;;;
+AFA1;HANGUL SYLLABLE GGYONI;Lo;0;L;;;;;N;;;;;
+AFA2;HANGUL SYLLABLE GGYONH;Lo;0;L;;;;;N;;;;;
+AFA3;HANGUL SYLLABLE GGYOD;Lo;0;L;;;;;N;;;;;
+AFA4;HANGUL SYLLABLE GGYOL;Lo;0;L;;;;;N;;;;;
+AFA5;HANGUL SYLLABLE GGYOLG;Lo;0;L;;;;;N;;;;;
+AFA6;HANGUL SYLLABLE GGYOLM;Lo;0;L;;;;;N;;;;;
+AFA7;HANGUL SYLLABLE GGYOLB;Lo;0;L;;;;;N;;;;;
+AFA8;HANGUL SYLLABLE GGYOLS;Lo;0;L;;;;;N;;;;;
+AFA9;HANGUL SYLLABLE GGYOLT;Lo;0;L;;;;;N;;;;;
+AFAA;HANGUL SYLLABLE GGYOLP;Lo;0;L;;;;;N;;;;;
+AFAB;HANGUL SYLLABLE GGYOLH;Lo;0;L;;;;;N;;;;;
+AFAC;HANGUL SYLLABLE GGYOM;Lo;0;L;;;;;N;;;;;
+AFAD;HANGUL SYLLABLE GGYOB;Lo;0;L;;;;;N;;;;;
+AFAE;HANGUL SYLLABLE GGYOBS;Lo;0;L;;;;;N;;;;;
+AFAF;HANGUL SYLLABLE GGYOS;Lo;0;L;;;;;N;;;;;
+AFB0;HANGUL SYLLABLE GGYOSS;Lo;0;L;;;;;N;;;;;
+AFB1;HANGUL SYLLABLE GGYONG;Lo;0;L;;;;;N;;;;;
+AFB2;HANGUL SYLLABLE GGYOJ;Lo;0;L;;;;;N;;;;;
+AFB3;HANGUL SYLLABLE GGYOC;Lo;0;L;;;;;N;;;;;
+AFB4;HANGUL SYLLABLE GGYOK;Lo;0;L;;;;;N;;;;;
+AFB5;HANGUL SYLLABLE GGYOT;Lo;0;L;;;;;N;;;;;
+AFB6;HANGUL SYLLABLE GGYOP;Lo;0;L;;;;;N;;;;;
+AFB7;HANGUL SYLLABLE GGYOH;Lo;0;L;;;;;N;;;;;
+AFB8;HANGUL SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+AFB9;HANGUL SYLLABLE GGUG;Lo;0;L;;;;;N;;;;;
+AFBA;HANGUL SYLLABLE GGUGG;Lo;0;L;;;;;N;;;;;
+AFBB;HANGUL SYLLABLE GGUGS;Lo;0;L;;;;;N;;;;;
+AFBC;HANGUL SYLLABLE GGUN;Lo;0;L;;;;;N;;;;;
+AFBD;HANGUL SYLLABLE GGUNI;Lo;0;L;;;;;N;;;;;
+AFBE;HANGUL SYLLABLE GGUNH;Lo;0;L;;;;;N;;;;;
+AFBF;HANGUL SYLLABLE GGUD;Lo;0;L;;;;;N;;;;;
+AFC0;HANGUL SYLLABLE GGUL;Lo;0;L;;;;;N;;;;;
+AFC1;HANGUL SYLLABLE GGULG;Lo;0;L;;;;;N;;;;;
+AFC2;HANGUL SYLLABLE GGULM;Lo;0;L;;;;;N;;;;;
+AFC3;HANGUL SYLLABLE GGULB;Lo;0;L;;;;;N;;;;;
+AFC4;HANGUL SYLLABLE GGULS;Lo;0;L;;;;;N;;;;;
+AFC5;HANGUL SYLLABLE GGULT;Lo;0;L;;;;;N;;;;;
+AFC6;HANGUL SYLLABLE GGULP;Lo;0;L;;;;;N;;;;;
+AFC7;HANGUL SYLLABLE GGULH;Lo;0;L;;;;;N;;;;;
+AFC8;HANGUL SYLLABLE GGUM;Lo;0;L;;;;;N;;;;;
+AFC9;HANGUL SYLLABLE GGUB;Lo;0;L;;;;;N;;;;;
+AFCA;HANGUL SYLLABLE GGUBS;Lo;0;L;;;;;N;;;;;
+AFCB;HANGUL SYLLABLE GGUS;Lo;0;L;;;;;N;;;;;
+AFCC;HANGUL SYLLABLE GGUSS;Lo;0;L;;;;;N;;;;;
+AFCD;HANGUL SYLLABLE GGUNG;Lo;0;L;;;;;N;;;;;
+AFCE;HANGUL SYLLABLE GGUJ;Lo;0;L;;;;;N;;;;;
+AFCF;HANGUL SYLLABLE GGUC;Lo;0;L;;;;;N;;;;;
+AFD0;HANGUL SYLLABLE GGUK;Lo;0;L;;;;;N;;;;;
+AFD1;HANGUL SYLLABLE GGUT;Lo;0;L;;;;;N;;;;;
+AFD2;HANGUL SYLLABLE GGUP;Lo;0;L;;;;;N;;;;;
+AFD3;HANGUL SYLLABLE GGUH;Lo;0;L;;;;;N;;;;;
+AFD4;HANGUL SYLLABLE GGWEO;Lo;0;L;;;;;N;;;;;
+AFD5;HANGUL SYLLABLE GGWEOG;Lo;0;L;;;;;N;;;;;
+AFD6;HANGUL SYLLABLE GGWEOGG;Lo;0;L;;;;;N;;;;;
+AFD7;HANGUL SYLLABLE GGWEOGS;Lo;0;L;;;;;N;;;;;
+AFD8;HANGUL SYLLABLE GGWEON;Lo;0;L;;;;;N;;;;;
+AFD9;HANGUL SYLLABLE GGWEONI;Lo;0;L;;;;;N;;;;;
+AFDA;HANGUL SYLLABLE GGWEONH;Lo;0;L;;;;;N;;;;;
+AFDB;HANGUL SYLLABLE GGWEOD;Lo;0;L;;;;;N;;;;;
+AFDC;HANGUL SYLLABLE GGWEOL;Lo;0;L;;;;;N;;;;;
+AFDD;HANGUL SYLLABLE GGWEOLG;Lo;0;L;;;;;N;;;;;
+AFDE;HANGUL SYLLABLE GGWEOLM;Lo;0;L;;;;;N;;;;;
+AFDF;HANGUL SYLLABLE GGWEOLB;Lo;0;L;;;;;N;;;;;
+AFE0;HANGUL SYLLABLE GGWEOLS;Lo;0;L;;;;;N;;;;;
+AFE1;HANGUL SYLLABLE GGWEOLT;Lo;0;L;;;;;N;;;;;
+AFE2;HANGUL SYLLABLE GGWEOLP;Lo;0;L;;;;;N;;;;;
+AFE3;HANGUL SYLLABLE GGWEOLH;Lo;0;L;;;;;N;;;;;
+AFE4;HANGUL SYLLABLE GGWEOM;Lo;0;L;;;;;N;;;;;
+AFE5;HANGUL SYLLABLE GGWEOB;Lo;0;L;;;;;N;;;;;
+AFE6;HANGUL SYLLABLE GGWEOBS;Lo;0;L;;;;;N;;;;;
+AFE7;HANGUL SYLLABLE GGWEOS;Lo;0;L;;;;;N;;;;;
+AFE8;HANGUL SYLLABLE GGWEOSS;Lo;0;L;;;;;N;;;;;
+AFE9;HANGUL SYLLABLE GGWEONG;Lo;0;L;;;;;N;;;;;
+AFEA;HANGUL SYLLABLE GGWEOJ;Lo;0;L;;;;;N;;;;;
+AFEB;HANGUL SYLLABLE GGWEOC;Lo;0;L;;;;;N;;;;;
+AFEC;HANGUL SYLLABLE GGWEOK;Lo;0;L;;;;;N;;;;;
+AFED;HANGUL SYLLABLE GGWEOT;Lo;0;L;;;;;N;;;;;
+AFEE;HANGUL SYLLABLE GGWEOP;Lo;0;L;;;;;N;;;;;
+AFEF;HANGUL SYLLABLE GGWEOH;Lo;0;L;;;;;N;;;;;
+AFF0;HANGUL SYLLABLE GGWE;Lo;0;L;;;;;N;;;;;
+AFF1;HANGUL SYLLABLE GGWEG;Lo;0;L;;;;;N;;;;;
+AFF2;HANGUL SYLLABLE GGWEGG;Lo;0;L;;;;;N;;;;;
+AFF3;HANGUL SYLLABLE GGWEGS;Lo;0;L;;;;;N;;;;;
+AFF4;HANGUL SYLLABLE GGWEN;Lo;0;L;;;;;N;;;;;
+AFF5;HANGUL SYLLABLE GGWENI;Lo;0;L;;;;;N;;;;;
+AFF6;HANGUL SYLLABLE GGWENH;Lo;0;L;;;;;N;;;;;
+AFF7;HANGUL SYLLABLE GGWED;Lo;0;L;;;;;N;;;;;
+AFF8;HANGUL SYLLABLE GGWEL;Lo;0;L;;;;;N;;;;;
+AFF9;HANGUL SYLLABLE GGWELG;Lo;0;L;;;;;N;;;;;
+AFFA;HANGUL SYLLABLE GGWELM;Lo;0;L;;;;;N;;;;;
+AFFB;HANGUL SYLLABLE GGWELB;Lo;0;L;;;;;N;;;;;
+AFFC;HANGUL SYLLABLE GGWELS;Lo;0;L;;;;;N;;;;;
+AFFD;HANGUL SYLLABLE GGWELT;Lo;0;L;;;;;N;;;;;
+AFFE;HANGUL SYLLABLE GGWELP;Lo;0;L;;;;;N;;;;;
+AFFF;HANGUL SYLLABLE GGWELH;Lo;0;L;;;;;N;;;;;
+B000;HANGUL SYLLABLE GGWEM;Lo;0;L;;;;;N;;;;;
+B001;HANGUL SYLLABLE GGWEB;Lo;0;L;;;;;N;;;;;
+B002;HANGUL SYLLABLE GGWEBS;Lo;0;L;;;;;N;;;;;
+B003;HANGUL SYLLABLE GGWES;Lo;0;L;;;;;N;;;;;
+B004;HANGUL SYLLABLE GGWESS;Lo;0;L;;;;;N;;;;;
+B005;HANGUL SYLLABLE GGWENG;Lo;0;L;;;;;N;;;;;
+B006;HANGUL SYLLABLE GGWEJ;Lo;0;L;;;;;N;;;;;
+B007;HANGUL SYLLABLE GGWEC;Lo;0;L;;;;;N;;;;;
+B008;HANGUL SYLLABLE GGWEK;Lo;0;L;;;;;N;;;;;
+B009;HANGUL SYLLABLE GGWET;Lo;0;L;;;;;N;;;;;
+B00A;HANGUL SYLLABLE GGWEP;Lo;0;L;;;;;N;;;;;
+B00B;HANGUL SYLLABLE GGWEH;Lo;0;L;;;;;N;;;;;
+B00C;HANGUL SYLLABLE GGWI;Lo;0;L;;;;;N;;;;;
+B00D;HANGUL SYLLABLE GGWIG;Lo;0;L;;;;;N;;;;;
+B00E;HANGUL SYLLABLE GGWIGG;Lo;0;L;;;;;N;;;;;
+B00F;HANGUL SYLLABLE GGWIGS;Lo;0;L;;;;;N;;;;;
+B010;HANGUL SYLLABLE GGWIN;Lo;0;L;;;;;N;;;;;
+B011;HANGUL SYLLABLE GGWINI;Lo;0;L;;;;;N;;;;;
+B012;HANGUL SYLLABLE GGWINH;Lo;0;L;;;;;N;;;;;
+B013;HANGUL SYLLABLE GGWID;Lo;0;L;;;;;N;;;;;
+B014;HANGUL SYLLABLE GGWIL;Lo;0;L;;;;;N;;;;;
+B015;HANGUL SYLLABLE GGWILG;Lo;0;L;;;;;N;;;;;
+B016;HANGUL SYLLABLE GGWILM;Lo;0;L;;;;;N;;;;;
+B017;HANGUL SYLLABLE GGWILB;Lo;0;L;;;;;N;;;;;
+B018;HANGUL SYLLABLE GGWILS;Lo;0;L;;;;;N;;;;;
+B019;HANGUL SYLLABLE GGWILT;Lo;0;L;;;;;N;;;;;
+B01A;HANGUL SYLLABLE GGWILP;Lo;0;L;;;;;N;;;;;
+B01B;HANGUL SYLLABLE GGWILH;Lo;0;L;;;;;N;;;;;
+B01C;HANGUL SYLLABLE GGWIM;Lo;0;L;;;;;N;;;;;
+B01D;HANGUL SYLLABLE GGWIB;Lo;0;L;;;;;N;;;;;
+B01E;HANGUL SYLLABLE GGWIBS;Lo;0;L;;;;;N;;;;;
+B01F;HANGUL SYLLABLE GGWIS;Lo;0;L;;;;;N;;;;;
+B020;HANGUL SYLLABLE GGWISS;Lo;0;L;;;;;N;;;;;
+B021;HANGUL SYLLABLE GGWING;Lo;0;L;;;;;N;;;;;
+B022;HANGUL SYLLABLE GGWIJ;Lo;0;L;;;;;N;;;;;
+B023;HANGUL SYLLABLE GGWIC;Lo;0;L;;;;;N;;;;;
+B024;HANGUL SYLLABLE GGWIK;Lo;0;L;;;;;N;;;;;
+B025;HANGUL SYLLABLE GGWIT;Lo;0;L;;;;;N;;;;;
+B026;HANGUL SYLLABLE GGWIP;Lo;0;L;;;;;N;;;;;
+B027;HANGUL SYLLABLE GGWIH;Lo;0;L;;;;;N;;;;;
+B028;HANGUL SYLLABLE GGYU;Lo;0;L;;;;;N;;;;;
+B029;HANGUL SYLLABLE GGYUG;Lo;0;L;;;;;N;;;;;
+B02A;HANGUL SYLLABLE GGYUGG;Lo;0;L;;;;;N;;;;;
+B02B;HANGUL SYLLABLE GGYUGS;Lo;0;L;;;;;N;;;;;
+B02C;HANGUL SYLLABLE GGYUN;Lo;0;L;;;;;N;;;;;
+B02D;HANGUL SYLLABLE GGYUNI;Lo;0;L;;;;;N;;;;;
+B02E;HANGUL SYLLABLE GGYUNH;Lo;0;L;;;;;N;;;;;
+B02F;HANGUL SYLLABLE GGYUD;Lo;0;L;;;;;N;;;;;
+B030;HANGUL SYLLABLE GGYUL;Lo;0;L;;;;;N;;;;;
+B031;HANGUL SYLLABLE GGYULG;Lo;0;L;;;;;N;;;;;
+B032;HANGUL SYLLABLE GGYULM;Lo;0;L;;;;;N;;;;;
+B033;HANGUL SYLLABLE GGYULB;Lo;0;L;;;;;N;;;;;
+B034;HANGUL SYLLABLE GGYULS;Lo;0;L;;;;;N;;;;;
+B035;HANGUL SYLLABLE GGYULT;Lo;0;L;;;;;N;;;;;
+B036;HANGUL SYLLABLE GGYULP;Lo;0;L;;;;;N;;;;;
+B037;HANGUL SYLLABLE GGYULH;Lo;0;L;;;;;N;;;;;
+B038;HANGUL SYLLABLE GGYUM;Lo;0;L;;;;;N;;;;;
+B039;HANGUL SYLLABLE GGYUB;Lo;0;L;;;;;N;;;;;
+B03A;HANGUL SYLLABLE GGYUBS;Lo;0;L;;;;;N;;;;;
+B03B;HANGUL SYLLABLE GGYUS;Lo;0;L;;;;;N;;;;;
+B03C;HANGUL SYLLABLE GGYUSS;Lo;0;L;;;;;N;;;;;
+B03D;HANGUL SYLLABLE GGYUNG;Lo;0;L;;;;;N;;;;;
+B03E;HANGUL SYLLABLE GGYUJ;Lo;0;L;;;;;N;;;;;
+B03F;HANGUL SYLLABLE GGYUC;Lo;0;L;;;;;N;;;;;
+B040;HANGUL SYLLABLE GGYUK;Lo;0;L;;;;;N;;;;;
+B041;HANGUL SYLLABLE GGYUT;Lo;0;L;;;;;N;;;;;
+B042;HANGUL SYLLABLE GGYUP;Lo;0;L;;;;;N;;;;;
+B043;HANGUL SYLLABLE GGYUH;Lo;0;L;;;;;N;;;;;
+B044;HANGUL SYLLABLE GGEU;Lo;0;L;;;;;N;;;;;
+B045;HANGUL SYLLABLE GGEUG;Lo;0;L;;;;;N;;;;;
+B046;HANGUL SYLLABLE GGEUGG;Lo;0;L;;;;;N;;;;;
+B047;HANGUL SYLLABLE GGEUGS;Lo;0;L;;;;;N;;;;;
+B048;HANGUL SYLLABLE GGEUN;Lo;0;L;;;;;N;;;;;
+B049;HANGUL SYLLABLE GGEUNI;Lo;0;L;;;;;N;;;;;
+B04A;HANGUL SYLLABLE GGEUNH;Lo;0;L;;;;;N;;;;;
+B04B;HANGUL SYLLABLE GGEUD;Lo;0;L;;;;;N;;;;;
+B04C;HANGUL SYLLABLE GGEUL;Lo;0;L;;;;;N;;;;;
+B04D;HANGUL SYLLABLE GGEULG;Lo;0;L;;;;;N;;;;;
+B04E;HANGUL SYLLABLE GGEULM;Lo;0;L;;;;;N;;;;;
+B04F;HANGUL SYLLABLE GGEULB;Lo;0;L;;;;;N;;;;;
+B050;HANGUL SYLLABLE GGEULS;Lo;0;L;;;;;N;;;;;
+B051;HANGUL SYLLABLE GGEULT;Lo;0;L;;;;;N;;;;;
+B052;HANGUL SYLLABLE GGEULP;Lo;0;L;;;;;N;;;;;
+B053;HANGUL SYLLABLE GGEULH;Lo;0;L;;;;;N;;;;;
+B054;HANGUL SYLLABLE GGEUM;Lo;0;L;;;;;N;;;;;
+B055;HANGUL SYLLABLE GGEUB;Lo;0;L;;;;;N;;;;;
+B056;HANGUL SYLLABLE GGEUBS;Lo;0;L;;;;;N;;;;;
+B057;HANGUL SYLLABLE GGEUS;Lo;0;L;;;;;N;;;;;
+B058;HANGUL SYLLABLE GGEUSS;Lo;0;L;;;;;N;;;;;
+B059;HANGUL SYLLABLE GGEUNG;Lo;0;L;;;;;N;;;;;
+B05A;HANGUL SYLLABLE GGEUJ;Lo;0;L;;;;;N;;;;;
+B05B;HANGUL SYLLABLE GGEUC;Lo;0;L;;;;;N;;;;;
+B05C;HANGUL SYLLABLE GGEUK;Lo;0;L;;;;;N;;;;;
+B05D;HANGUL SYLLABLE GGEUT;Lo;0;L;;;;;N;;;;;
+B05E;HANGUL SYLLABLE GGEUP;Lo;0;L;;;;;N;;;;;
+B05F;HANGUL SYLLABLE GGEUH;Lo;0;L;;;;;N;;;;;
+B060;HANGUL SYLLABLE GGYI;Lo;0;L;;;;;N;;;;;
+B061;HANGUL SYLLABLE GGYIG;Lo;0;L;;;;;N;;;;;
+B062;HANGUL SYLLABLE GGYIGG;Lo;0;L;;;;;N;;;;;
+B063;HANGUL SYLLABLE GGYIGS;Lo;0;L;;;;;N;;;;;
+B064;HANGUL SYLLABLE GGYIN;Lo;0;L;;;;;N;;;;;
+B065;HANGUL SYLLABLE GGYINI;Lo;0;L;;;;;N;;;;;
+B066;HANGUL SYLLABLE GGYINH;Lo;0;L;;;;;N;;;;;
+B067;HANGUL SYLLABLE GGYID;Lo;0;L;;;;;N;;;;;
+B068;HANGUL SYLLABLE GGYIL;Lo;0;L;;;;;N;;;;;
+B069;HANGUL SYLLABLE GGYILG;Lo;0;L;;;;;N;;;;;
+B06A;HANGUL SYLLABLE GGYILM;Lo;0;L;;;;;N;;;;;
+B06B;HANGUL SYLLABLE GGYILB;Lo;0;L;;;;;N;;;;;
+B06C;HANGUL SYLLABLE GGYILS;Lo;0;L;;;;;N;;;;;
+B06D;HANGUL SYLLABLE GGYILT;Lo;0;L;;;;;N;;;;;
+B06E;HANGUL SYLLABLE GGYILP;Lo;0;L;;;;;N;;;;;
+B06F;HANGUL SYLLABLE GGYILH;Lo;0;L;;;;;N;;;;;
+B070;HANGUL SYLLABLE GGYIM;Lo;0;L;;;;;N;;;;;
+B071;HANGUL SYLLABLE GGYIB;Lo;0;L;;;;;N;;;;;
+B072;HANGUL SYLLABLE GGYIBS;Lo;0;L;;;;;N;;;;;
+B073;HANGUL SYLLABLE GGYIS;Lo;0;L;;;;;N;;;;;
+B074;HANGUL SYLLABLE GGYISS;Lo;0;L;;;;;N;;;;;
+B075;HANGUL SYLLABLE GGYING;Lo;0;L;;;;;N;;;;;
+B076;HANGUL SYLLABLE GGYIJ;Lo;0;L;;;;;N;;;;;
+B077;HANGUL SYLLABLE GGYIC;Lo;0;L;;;;;N;;;;;
+B078;HANGUL SYLLABLE GGYIK;Lo;0;L;;;;;N;;;;;
+B079;HANGUL SYLLABLE GGYIT;Lo;0;L;;;;;N;;;;;
+B07A;HANGUL SYLLABLE GGYIP;Lo;0;L;;;;;N;;;;;
+B07B;HANGUL SYLLABLE GGYIH;Lo;0;L;;;;;N;;;;;
+B07C;HANGUL SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+B07D;HANGUL SYLLABLE GGIG;Lo;0;L;;;;;N;;;;;
+B07E;HANGUL SYLLABLE GGIGG;Lo;0;L;;;;;N;;;;;
+B07F;HANGUL SYLLABLE GGIGS;Lo;0;L;;;;;N;;;;;
+B080;HANGUL SYLLABLE GGIN;Lo;0;L;;;;;N;;;;;
+B081;HANGUL SYLLABLE GGINI;Lo;0;L;;;;;N;;;;;
+B082;HANGUL SYLLABLE GGINH;Lo;0;L;;;;;N;;;;;
+B083;HANGUL SYLLABLE GGID;Lo;0;L;;;;;N;;;;;
+B084;HANGUL SYLLABLE GGIL;Lo;0;L;;;;;N;;;;;
+B085;HANGUL SYLLABLE GGILG;Lo;0;L;;;;;N;;;;;
+B086;HANGUL SYLLABLE GGILM;Lo;0;L;;;;;N;;;;;
+B087;HANGUL SYLLABLE GGILB;Lo;0;L;;;;;N;;;;;
+B088;HANGUL SYLLABLE GGILS;Lo;0;L;;;;;N;;;;;
+B089;HANGUL SYLLABLE GGILT;Lo;0;L;;;;;N;;;;;
+B08A;HANGUL SYLLABLE GGILP;Lo;0;L;;;;;N;;;;;
+B08B;HANGUL SYLLABLE GGILH;Lo;0;L;;;;;N;;;;;
+B08C;HANGUL SYLLABLE GGIM;Lo;0;L;;;;;N;;;;;
+B08D;HANGUL SYLLABLE GGIB;Lo;0;L;;;;;N;;;;;
+B08E;HANGUL SYLLABLE GGIBS;Lo;0;L;;;;;N;;;;;
+B08F;HANGUL SYLLABLE GGIS;Lo;0;L;;;;;N;;;;;
+B090;HANGUL SYLLABLE GGISS;Lo;0;L;;;;;N;;;;;
+B091;HANGUL SYLLABLE GGING;Lo;0;L;;;;;N;;;;;
+B092;HANGUL SYLLABLE GGIJ;Lo;0;L;;;;;N;;;;;
+B093;HANGUL SYLLABLE GGIC;Lo;0;L;;;;;N;;;;;
+B094;HANGUL SYLLABLE GGIK;Lo;0;L;;;;;N;;;;;
+B095;HANGUL SYLLABLE GGIT;Lo;0;L;;;;;N;;;;;
+B096;HANGUL SYLLABLE GGIP;Lo;0;L;;;;;N;;;;;
+B097;HANGUL SYLLABLE GGIH;Lo;0;L;;;;;N;;;;;
+B098;HANGUL SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+B099;HANGUL SYLLABLE NAG;Lo;0;L;;;;;N;;;;;
+B09A;HANGUL SYLLABLE NAGG;Lo;0;L;;;;;N;;;;;
+B09B;HANGUL SYLLABLE NAGS;Lo;0;L;;;;;N;;;;;
+B09C;HANGUL SYLLABLE NAN;Lo;0;L;;;;;N;;;;;
+B09D;HANGUL SYLLABLE NANI;Lo;0;L;;;;;N;;;;;
+B09E;HANGUL SYLLABLE NANH;Lo;0;L;;;;;N;;;;;
+B09F;HANGUL SYLLABLE NAD;Lo;0;L;;;;;N;;;;;
+B0A0;HANGUL SYLLABLE NAL;Lo;0;L;;;;;N;;;;;
+B0A1;HANGUL SYLLABLE NALG;Lo;0;L;;;;;N;;;;;
+B0A2;HANGUL SYLLABLE NALM;Lo;0;L;;;;;N;;;;;
+B0A3;HANGUL SYLLABLE NALB;Lo;0;L;;;;;N;;;;;
+B0A4;HANGUL SYLLABLE NALS;Lo;0;L;;;;;N;;;;;
+B0A5;HANGUL SYLLABLE NALT;Lo;0;L;;;;;N;;;;;
+B0A6;HANGUL SYLLABLE NALP;Lo;0;L;;;;;N;;;;;
+B0A7;HANGUL SYLLABLE NALH;Lo;0;L;;;;;N;;;;;
+B0A8;HANGUL SYLLABLE NAM;Lo;0;L;;;;;N;;;;;
+B0A9;HANGUL SYLLABLE NAB;Lo;0;L;;;;;N;;;;;
+B0AA;HANGUL SYLLABLE NABS;Lo;0;L;;;;;N;;;;;
+B0AB;HANGUL SYLLABLE NAS;Lo;0;L;;;;;N;;;;;
+B0AC;HANGUL SYLLABLE NASS;Lo;0;L;;;;;N;;;;;
+B0AD;HANGUL SYLLABLE NANG;Lo;0;L;;;;;N;;;;;
+B0AE;HANGUL SYLLABLE NAJ;Lo;0;L;;;;;N;;;;;
+B0AF;HANGUL SYLLABLE NAC;Lo;0;L;;;;;N;;;;;
+B0B0;HANGUL SYLLABLE NAK;Lo;0;L;;;;;N;;;;;
+B0B1;HANGUL SYLLABLE NAT;Lo;0;L;;;;;N;;;;;
+B0B2;HANGUL SYLLABLE NAP;Lo;0;L;;;;;N;;;;;
+B0B3;HANGUL SYLLABLE NAH;Lo;0;L;;;;;N;;;;;
+B0B4;HANGUL SYLLABLE NAE;Lo;0;L;;;;;N;;;;;
+B0B5;HANGUL SYLLABLE NAEG;Lo;0;L;;;;;N;;;;;
+B0B6;HANGUL SYLLABLE NAEGG;Lo;0;L;;;;;N;;;;;
+B0B7;HANGUL SYLLABLE NAEGS;Lo;0;L;;;;;N;;;;;
+B0B8;HANGUL SYLLABLE NAEN;Lo;0;L;;;;;N;;;;;
+B0B9;HANGUL SYLLABLE NAENI;Lo;0;L;;;;;N;;;;;
+B0BA;HANGUL SYLLABLE NAENH;Lo;0;L;;;;;N;;;;;
+B0BB;HANGUL SYLLABLE NAED;Lo;0;L;;;;;N;;;;;
+B0BC;HANGUL SYLLABLE NAEL;Lo;0;L;;;;;N;;;;;
+B0BD;HANGUL SYLLABLE NAELG;Lo;0;L;;;;;N;;;;;
+B0BE;HANGUL SYLLABLE NAELM;Lo;0;L;;;;;N;;;;;
+B0BF;HANGUL SYLLABLE NAELB;Lo;0;L;;;;;N;;;;;
+B0C0;HANGUL SYLLABLE NAELS;Lo;0;L;;;;;N;;;;;
+B0C1;HANGUL SYLLABLE NAELT;Lo;0;L;;;;;N;;;;;
+B0C2;HANGUL SYLLABLE NAELP;Lo;0;L;;;;;N;;;;;
+B0C3;HANGUL SYLLABLE NAELH;Lo;0;L;;;;;N;;;;;
+B0C4;HANGUL SYLLABLE NAEM;Lo;0;L;;;;;N;;;;;
+B0C5;HANGUL SYLLABLE NAEB;Lo;0;L;;;;;N;;;;;
+B0C6;HANGUL SYLLABLE NAEBS;Lo;0;L;;;;;N;;;;;
+B0C7;HANGUL SYLLABLE NAES;Lo;0;L;;;;;N;;;;;
+B0C8;HANGUL SYLLABLE NAESS;Lo;0;L;;;;;N;;;;;
+B0C9;HANGUL SYLLABLE NAENG;Lo;0;L;;;;;N;;;;;
+B0CA;HANGUL SYLLABLE NAEJ;Lo;0;L;;;;;N;;;;;
+B0CB;HANGUL SYLLABLE NAEC;Lo;0;L;;;;;N;;;;;
+B0CC;HANGUL SYLLABLE NAEK;Lo;0;L;;;;;N;;;;;
+B0CD;HANGUL SYLLABLE NAET;Lo;0;L;;;;;N;;;;;
+B0CE;HANGUL SYLLABLE NAEP;Lo;0;L;;;;;N;;;;;
+B0CF;HANGUL SYLLABLE NAEH;Lo;0;L;;;;;N;;;;;
+B0D0;HANGUL SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+B0D1;HANGUL SYLLABLE NYAG;Lo;0;L;;;;;N;;;;;
+B0D2;HANGUL SYLLABLE NYAGG;Lo;0;L;;;;;N;;;;;
+B0D3;HANGUL SYLLABLE NYAGS;Lo;0;L;;;;;N;;;;;
+B0D4;HANGUL SYLLABLE NYAN;Lo;0;L;;;;;N;;;;;
+B0D5;HANGUL SYLLABLE NYANI;Lo;0;L;;;;;N;;;;;
+B0D6;HANGUL SYLLABLE NYANH;Lo;0;L;;;;;N;;;;;
+B0D7;HANGUL SYLLABLE NYAD;Lo;0;L;;;;;N;;;;;
+B0D8;HANGUL SYLLABLE NYAL;Lo;0;L;;;;;N;;;;;
+B0D9;HANGUL SYLLABLE NYALG;Lo;0;L;;;;;N;;;;;
+B0DA;HANGUL SYLLABLE NYALM;Lo;0;L;;;;;N;;;;;
+B0DB;HANGUL SYLLABLE NYALB;Lo;0;L;;;;;N;;;;;
+B0DC;HANGUL SYLLABLE NYALS;Lo;0;L;;;;;N;;;;;
+B0DD;HANGUL SYLLABLE NYALT;Lo;0;L;;;;;N;;;;;
+B0DE;HANGUL SYLLABLE NYALP;Lo;0;L;;;;;N;;;;;
+B0DF;HANGUL SYLLABLE NYALH;Lo;0;L;;;;;N;;;;;
+B0E0;HANGUL SYLLABLE NYAM;Lo;0;L;;;;;N;;;;;
+B0E1;HANGUL SYLLABLE NYAB;Lo;0;L;;;;;N;;;;;
+B0E2;HANGUL SYLLABLE NYABS;Lo;0;L;;;;;N;;;;;
+B0E3;HANGUL SYLLABLE NYAS;Lo;0;L;;;;;N;;;;;
+B0E4;HANGUL SYLLABLE NYASS;Lo;0;L;;;;;N;;;;;
+B0E5;HANGUL SYLLABLE NYANG;Lo;0;L;;;;;N;;;;;
+B0E6;HANGUL SYLLABLE NYAJ;Lo;0;L;;;;;N;;;;;
+B0E7;HANGUL SYLLABLE NYAC;Lo;0;L;;;;;N;;;;;
+B0E8;HANGUL SYLLABLE NYAK;Lo;0;L;;;;;N;;;;;
+B0E9;HANGUL SYLLABLE NYAT;Lo;0;L;;;;;N;;;;;
+B0EA;HANGUL SYLLABLE NYAP;Lo;0;L;;;;;N;;;;;
+B0EB;HANGUL SYLLABLE NYAH;Lo;0;L;;;;;N;;;;;
+B0EC;HANGUL SYLLABLE NYAE;Lo;0;L;;;;;N;;;;;
+B0ED;HANGUL SYLLABLE NYAEG;Lo;0;L;;;;;N;;;;;
+B0EE;HANGUL SYLLABLE NYAEGG;Lo;0;L;;;;;N;;;;;
+B0EF;HANGUL SYLLABLE NYAEGS;Lo;0;L;;;;;N;;;;;
+B0F0;HANGUL SYLLABLE NYAEN;Lo;0;L;;;;;N;;;;;
+B0F1;HANGUL SYLLABLE NYAENI;Lo;0;L;;;;;N;;;;;
+B0F2;HANGUL SYLLABLE NYAENH;Lo;0;L;;;;;N;;;;;
+B0F3;HANGUL SYLLABLE NYAED;Lo;0;L;;;;;N;;;;;
+B0F4;HANGUL SYLLABLE NYAEL;Lo;0;L;;;;;N;;;;;
+B0F5;HANGUL SYLLABLE NYAELG;Lo;0;L;;;;;N;;;;;
+B0F6;HANGUL SYLLABLE NYAELM;Lo;0;L;;;;;N;;;;;
+B0F7;HANGUL SYLLABLE NYAELB;Lo;0;L;;;;;N;;;;;
+B0F8;HANGUL SYLLABLE NYAELS;Lo;0;L;;;;;N;;;;;
+B0F9;HANGUL SYLLABLE NYAELT;Lo;0;L;;;;;N;;;;;
+B0FA;HANGUL SYLLABLE NYAELP;Lo;0;L;;;;;N;;;;;
+B0FB;HANGUL SYLLABLE NYAELH;Lo;0;L;;;;;N;;;;;
+B0FC;HANGUL SYLLABLE NYAEM;Lo;0;L;;;;;N;;;;;
+B0FD;HANGUL SYLLABLE NYAEB;Lo;0;L;;;;;N;;;;;
+B0FE;HANGUL SYLLABLE NYAEBS;Lo;0;L;;;;;N;;;;;
+B0FF;HANGUL SYLLABLE NYAES;Lo;0;L;;;;;N;;;;;
+B100;HANGUL SYLLABLE NYAESS;Lo;0;L;;;;;N;;;;;
+B101;HANGUL SYLLABLE NYAENG;Lo;0;L;;;;;N;;;;;
+B102;HANGUL SYLLABLE NYAEJ;Lo;0;L;;;;;N;;;;;
+B103;HANGUL SYLLABLE NYAEC;Lo;0;L;;;;;N;;;;;
+B104;HANGUL SYLLABLE NYAEK;Lo;0;L;;;;;N;;;;;
+B105;HANGUL SYLLABLE NYAET;Lo;0;L;;;;;N;;;;;
+B106;HANGUL SYLLABLE NYAEP;Lo;0;L;;;;;N;;;;;
+B107;HANGUL SYLLABLE NYAEH;Lo;0;L;;;;;N;;;;;
+B108;HANGUL SYLLABLE NEO;Lo;0;L;;;;;N;;;;;
+B109;HANGUL SYLLABLE NEOG;Lo;0;L;;;;;N;;;;;
+B10A;HANGUL SYLLABLE NEOGG;Lo;0;L;;;;;N;;;;;
+B10B;HANGUL SYLLABLE NEOGS;Lo;0;L;;;;;N;;;;;
+B10C;HANGUL SYLLABLE NEON;Lo;0;L;;;;;N;;;;;
+B10D;HANGUL SYLLABLE NEONI;Lo;0;L;;;;;N;;;;;
+B10E;HANGUL SYLLABLE NEONH;Lo;0;L;;;;;N;;;;;
+B10F;HANGUL SYLLABLE NEOD;Lo;0;L;;;;;N;;;;;
+B110;HANGUL SYLLABLE NEOL;Lo;0;L;;;;;N;;;;;
+B111;HANGUL SYLLABLE NEOLG;Lo;0;L;;;;;N;;;;;
+B112;HANGUL SYLLABLE NEOLM;Lo;0;L;;;;;N;;;;;
+B113;HANGUL SYLLABLE NEOLB;Lo;0;L;;;;;N;;;;;
+B114;HANGUL SYLLABLE NEOLS;Lo;0;L;;;;;N;;;;;
+B115;HANGUL SYLLABLE NEOLT;Lo;0;L;;;;;N;;;;;
+B116;HANGUL SYLLABLE NEOLP;Lo;0;L;;;;;N;;;;;
+B117;HANGUL SYLLABLE NEOLH;Lo;0;L;;;;;N;;;;;
+B118;HANGUL SYLLABLE NEOM;Lo;0;L;;;;;N;;;;;
+B119;HANGUL SYLLABLE NEOB;Lo;0;L;;;;;N;;;;;
+B11A;HANGUL SYLLABLE NEOBS;Lo;0;L;;;;;N;;;;;
+B11B;HANGUL SYLLABLE NEOS;Lo;0;L;;;;;N;;;;;
+B11C;HANGUL SYLLABLE NEOSS;Lo;0;L;;;;;N;;;;;
+B11D;HANGUL SYLLABLE NEONG;Lo;0;L;;;;;N;;;;;
+B11E;HANGUL SYLLABLE NEOJ;Lo;0;L;;;;;N;;;;;
+B11F;HANGUL SYLLABLE NEOC;Lo;0;L;;;;;N;;;;;
+B120;HANGUL SYLLABLE NEOK;Lo;0;L;;;;;N;;;;;
+B121;HANGUL SYLLABLE NEOT;Lo;0;L;;;;;N;;;;;
+B122;HANGUL SYLLABLE NEOP;Lo;0;L;;;;;N;;;;;
+B123;HANGUL SYLLABLE NEOH;Lo;0;L;;;;;N;;;;;
+B124;HANGUL SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+B125;HANGUL SYLLABLE NEG;Lo;0;L;;;;;N;;;;;
+B126;HANGUL SYLLABLE NEGG;Lo;0;L;;;;;N;;;;;
+B127;HANGUL SYLLABLE NEGS;Lo;0;L;;;;;N;;;;;
+B128;HANGUL SYLLABLE NEN;Lo;0;L;;;;;N;;;;;
+B129;HANGUL SYLLABLE NENI;Lo;0;L;;;;;N;;;;;
+B12A;HANGUL SYLLABLE NENH;Lo;0;L;;;;;N;;;;;
+B12B;HANGUL SYLLABLE NED;Lo;0;L;;;;;N;;;;;
+B12C;HANGUL SYLLABLE NEL;Lo;0;L;;;;;N;;;;;
+B12D;HANGUL SYLLABLE NELG;Lo;0;L;;;;;N;;;;;
+B12E;HANGUL SYLLABLE NELM;Lo;0;L;;;;;N;;;;;
+B12F;HANGUL SYLLABLE NELB;Lo;0;L;;;;;N;;;;;
+B130;HANGUL SYLLABLE NELS;Lo;0;L;;;;;N;;;;;
+B131;HANGUL SYLLABLE NELT;Lo;0;L;;;;;N;;;;;
+B132;HANGUL SYLLABLE NELP;Lo;0;L;;;;;N;;;;;
+B133;HANGUL SYLLABLE NELH;Lo;0;L;;;;;N;;;;;
+B134;HANGUL SYLLABLE NEM;Lo;0;L;;;;;N;;;;;
+B135;HANGUL SYLLABLE NEB;Lo;0;L;;;;;N;;;;;
+B136;HANGUL SYLLABLE NEBS;Lo;0;L;;;;;N;;;;;
+B137;HANGUL SYLLABLE NES;Lo;0;L;;;;;N;;;;;
+B138;HANGUL SYLLABLE NESS;Lo;0;L;;;;;N;;;;;
+B139;HANGUL SYLLABLE NENG;Lo;0;L;;;;;N;;;;;
+B13A;HANGUL SYLLABLE NEJ;Lo;0;L;;;;;N;;;;;
+B13B;HANGUL SYLLABLE NEC;Lo;0;L;;;;;N;;;;;
+B13C;HANGUL SYLLABLE NEK;Lo;0;L;;;;;N;;;;;
+B13D;HANGUL SYLLABLE NET;Lo;0;L;;;;;N;;;;;
+B13E;HANGUL SYLLABLE NEP;Lo;0;L;;;;;N;;;;;
+B13F;HANGUL SYLLABLE NEH;Lo;0;L;;;;;N;;;;;
+B140;HANGUL SYLLABLE NYEO;Lo;0;L;;;;;N;;;;;
+B141;HANGUL SYLLABLE NYEOG;Lo;0;L;;;;;N;;;;;
+B142;HANGUL SYLLABLE NYEOGG;Lo;0;L;;;;;N;;;;;
+B143;HANGUL SYLLABLE NYEOGS;Lo;0;L;;;;;N;;;;;
+B144;HANGUL SYLLABLE NYEON;Lo;0;L;;;;;N;;;;;
+B145;HANGUL SYLLABLE NYEONI;Lo;0;L;;;;;N;;;;;
+B146;HANGUL SYLLABLE NYEONH;Lo;0;L;;;;;N;;;;;
+B147;HANGUL SYLLABLE NYEOD;Lo;0;L;;;;;N;;;;;
+B148;HANGUL SYLLABLE NYEOL;Lo;0;L;;;;;N;;;;;
+B149;HANGUL SYLLABLE NYEOLG;Lo;0;L;;;;;N;;;;;
+B14A;HANGUL SYLLABLE NYEOLM;Lo;0;L;;;;;N;;;;;
+B14B;HANGUL SYLLABLE NYEOLB;Lo;0;L;;;;;N;;;;;
+B14C;HANGUL SYLLABLE NYEOLS;Lo;0;L;;;;;N;;;;;
+B14D;HANGUL SYLLABLE NYEOLT;Lo;0;L;;;;;N;;;;;
+B14E;HANGUL SYLLABLE NYEOLP;Lo;0;L;;;;;N;;;;;
+B14F;HANGUL SYLLABLE NYEOLH;Lo;0;L;;;;;N;;;;;
+B150;HANGUL SYLLABLE NYEOM;Lo;0;L;;;;;N;;;;;
+B151;HANGUL SYLLABLE NYEOB;Lo;0;L;;;;;N;;;;;
+B152;HANGUL SYLLABLE NYEOBS;Lo;0;L;;;;;N;;;;;
+B153;HANGUL SYLLABLE NYEOS;Lo;0;L;;;;;N;;;;;
+B154;HANGUL SYLLABLE NYEOSS;Lo;0;L;;;;;N;;;;;
+B155;HANGUL SYLLABLE NYEONG;Lo;0;L;;;;;N;;;;;
+B156;HANGUL SYLLABLE NYEOJ;Lo;0;L;;;;;N;;;;;
+B157;HANGUL SYLLABLE NYEOC;Lo;0;L;;;;;N;;;;;
+B158;HANGUL SYLLABLE NYEOK;Lo;0;L;;;;;N;;;;;
+B159;HANGUL SYLLABLE NYEOT;Lo;0;L;;;;;N;;;;;
+B15A;HANGUL SYLLABLE NYEOP;Lo;0;L;;;;;N;;;;;
+B15B;HANGUL SYLLABLE NYEOH;Lo;0;L;;;;;N;;;;;
+B15C;HANGUL SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+B15D;HANGUL SYLLABLE NYEG;Lo;0;L;;;;;N;;;;;
+B15E;HANGUL SYLLABLE NYEGG;Lo;0;L;;;;;N;;;;;
+B15F;HANGUL SYLLABLE NYEGS;Lo;0;L;;;;;N;;;;;
+B160;HANGUL SYLLABLE NYEN;Lo;0;L;;;;;N;;;;;
+B161;HANGUL SYLLABLE NYENI;Lo;0;L;;;;;N;;;;;
+B162;HANGUL SYLLABLE NYENH;Lo;0;L;;;;;N;;;;;
+B163;HANGUL SYLLABLE NYED;Lo;0;L;;;;;N;;;;;
+B164;HANGUL SYLLABLE NYEL;Lo;0;L;;;;;N;;;;;
+B165;HANGUL SYLLABLE NYELG;Lo;0;L;;;;;N;;;;;
+B166;HANGUL SYLLABLE NYELM;Lo;0;L;;;;;N;;;;;
+B167;HANGUL SYLLABLE NYELB;Lo;0;L;;;;;N;;;;;
+B168;HANGUL SYLLABLE NYELS;Lo;0;L;;;;;N;;;;;
+B169;HANGUL SYLLABLE NYELT;Lo;0;L;;;;;N;;;;;
+B16A;HANGUL SYLLABLE NYELP;Lo;0;L;;;;;N;;;;;
+B16B;HANGUL SYLLABLE NYELH;Lo;0;L;;;;;N;;;;;
+B16C;HANGUL SYLLABLE NYEM;Lo;0;L;;;;;N;;;;;
+B16D;HANGUL SYLLABLE NYEB;Lo;0;L;;;;;N;;;;;
+B16E;HANGUL SYLLABLE NYEBS;Lo;0;L;;;;;N;;;;;
+B16F;HANGUL SYLLABLE NYES;Lo;0;L;;;;;N;;;;;
+B170;HANGUL SYLLABLE NYESS;Lo;0;L;;;;;N;;;;;
+B171;HANGUL SYLLABLE NYENG;Lo;0;L;;;;;N;;;;;
+B172;HANGUL SYLLABLE NYEJ;Lo;0;L;;;;;N;;;;;
+B173;HANGUL SYLLABLE NYEC;Lo;0;L;;;;;N;;;;;
+B174;HANGUL SYLLABLE NYEK;Lo;0;L;;;;;N;;;;;
+B175;HANGUL SYLLABLE NYET;Lo;0;L;;;;;N;;;;;
+B176;HANGUL SYLLABLE NYEP;Lo;0;L;;;;;N;;;;;
+B177;HANGUL SYLLABLE NYEH;Lo;0;L;;;;;N;;;;;
+B178;HANGUL SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+B179;HANGUL SYLLABLE NOG;Lo;0;L;;;;;N;;;;;
+B17A;HANGUL SYLLABLE NOGG;Lo;0;L;;;;;N;;;;;
+B17B;HANGUL SYLLABLE NOGS;Lo;0;L;;;;;N;;;;;
+B17C;HANGUL SYLLABLE NON;Lo;0;L;;;;;N;;;;;
+B17D;HANGUL SYLLABLE NONI;Lo;0;L;;;;;N;;;;;
+B17E;HANGUL SYLLABLE NONH;Lo;0;L;;;;;N;;;;;
+B17F;HANGUL SYLLABLE NOD;Lo;0;L;;;;;N;;;;;
+B180;HANGUL SYLLABLE NOL;Lo;0;L;;;;;N;;;;;
+B181;HANGUL SYLLABLE NOLG;Lo;0;L;;;;;N;;;;;
+B182;HANGUL SYLLABLE NOLM;Lo;0;L;;;;;N;;;;;
+B183;HANGUL SYLLABLE NOLB;Lo;0;L;;;;;N;;;;;
+B184;HANGUL SYLLABLE NOLS;Lo;0;L;;;;;N;;;;;
+B185;HANGUL SYLLABLE NOLT;Lo;0;L;;;;;N;;;;;
+B186;HANGUL SYLLABLE NOLP;Lo;0;L;;;;;N;;;;;
+B187;HANGUL SYLLABLE NOLH;Lo;0;L;;;;;N;;;;;
+B188;HANGUL SYLLABLE NOM;Lo;0;L;;;;;N;;;;;
+B189;HANGUL SYLLABLE NOB;Lo;0;L;;;;;N;;;;;
+B18A;HANGUL SYLLABLE NOBS;Lo;0;L;;;;;N;;;;;
+B18B;HANGUL SYLLABLE NOS;Lo;0;L;;;;;N;;;;;
+B18C;HANGUL SYLLABLE NOSS;Lo;0;L;;;;;N;;;;;
+B18D;HANGUL SYLLABLE NONG;Lo;0;L;;;;;N;;;;;
+B18E;HANGUL SYLLABLE NOJ;Lo;0;L;;;;;N;;;;;
+B18F;HANGUL SYLLABLE NOC;Lo;0;L;;;;;N;;;;;
+B190;HANGUL SYLLABLE NOK;Lo;0;L;;;;;N;;;;;
+B191;HANGUL SYLLABLE NOT;Lo;0;L;;;;;N;;;;;
+B192;HANGUL SYLLABLE NOP;Lo;0;L;;;;;N;;;;;
+B193;HANGUL SYLLABLE NOH;Lo;0;L;;;;;N;;;;;
+B194;HANGUL SYLLABLE NWA;Lo;0;L;;;;;N;;;;;
+B195;HANGUL SYLLABLE NWAG;Lo;0;L;;;;;N;;;;;
+B196;HANGUL SYLLABLE NWAGG;Lo;0;L;;;;;N;;;;;
+B197;HANGUL SYLLABLE NWAGS;Lo;0;L;;;;;N;;;;;
+B198;HANGUL SYLLABLE NWAN;Lo;0;L;;;;;N;;;;;
+B199;HANGUL SYLLABLE NWANI;Lo;0;L;;;;;N;;;;;
+B19A;HANGUL SYLLABLE NWANH;Lo;0;L;;;;;N;;;;;
+B19B;HANGUL SYLLABLE NWAD;Lo;0;L;;;;;N;;;;;
+B19C;HANGUL SYLLABLE NWAL;Lo;0;L;;;;;N;;;;;
+B19D;HANGUL SYLLABLE NWALG;Lo;0;L;;;;;N;;;;;
+B19E;HANGUL SYLLABLE NWALM;Lo;0;L;;;;;N;;;;;
+B19F;HANGUL SYLLABLE NWALB;Lo;0;L;;;;;N;;;;;
+B1A0;HANGUL SYLLABLE NWALS;Lo;0;L;;;;;N;;;;;
+B1A1;HANGUL SYLLABLE NWALT;Lo;0;L;;;;;N;;;;;
+B1A2;HANGUL SYLLABLE NWALP;Lo;0;L;;;;;N;;;;;
+B1A3;HANGUL SYLLABLE NWALH;Lo;0;L;;;;;N;;;;;
+B1A4;HANGUL SYLLABLE NWAM;Lo;0;L;;;;;N;;;;;
+B1A5;HANGUL SYLLABLE NWAB;Lo;0;L;;;;;N;;;;;
+B1A6;HANGUL SYLLABLE NWABS;Lo;0;L;;;;;N;;;;;
+B1A7;HANGUL SYLLABLE NWAS;Lo;0;L;;;;;N;;;;;
+B1A8;HANGUL SYLLABLE NWASS;Lo;0;L;;;;;N;;;;;
+B1A9;HANGUL SYLLABLE NWANG;Lo;0;L;;;;;N;;;;;
+B1AA;HANGUL SYLLABLE NWAJ;Lo;0;L;;;;;N;;;;;
+B1AB;HANGUL SYLLABLE NWAC;Lo;0;L;;;;;N;;;;;
+B1AC;HANGUL SYLLABLE NWAK;Lo;0;L;;;;;N;;;;;
+B1AD;HANGUL SYLLABLE NWAT;Lo;0;L;;;;;N;;;;;
+B1AE;HANGUL SYLLABLE NWAP;Lo;0;L;;;;;N;;;;;
+B1AF;HANGUL SYLLABLE NWAH;Lo;0;L;;;;;N;;;;;
+B1B0;HANGUL SYLLABLE NWAE;Lo;0;L;;;;;N;;;;;
+B1B1;HANGUL SYLLABLE NWAEG;Lo;0;L;;;;;N;;;;;
+B1B2;HANGUL SYLLABLE NWAEGG;Lo;0;L;;;;;N;;;;;
+B1B3;HANGUL SYLLABLE NWAEGS;Lo;0;L;;;;;N;;;;;
+B1B4;HANGUL SYLLABLE NWAEN;Lo;0;L;;;;;N;;;;;
+B1B5;HANGUL SYLLABLE NWAENI;Lo;0;L;;;;;N;;;;;
+B1B6;HANGUL SYLLABLE NWAENH;Lo;0;L;;;;;N;;;;;
+B1B7;HANGUL SYLLABLE NWAED;Lo;0;L;;;;;N;;;;;
+B1B8;HANGUL SYLLABLE NWAEL;Lo;0;L;;;;;N;;;;;
+B1B9;HANGUL SYLLABLE NWAELG;Lo;0;L;;;;;N;;;;;
+B1BA;HANGUL SYLLABLE NWAELM;Lo;0;L;;;;;N;;;;;
+B1BB;HANGUL SYLLABLE NWAELB;Lo;0;L;;;;;N;;;;;
+B1BC;HANGUL SYLLABLE NWAELS;Lo;0;L;;;;;N;;;;;
+B1BD;HANGUL SYLLABLE NWAELT;Lo;0;L;;;;;N;;;;;
+B1BE;HANGUL SYLLABLE NWAELP;Lo;0;L;;;;;N;;;;;
+B1BF;HANGUL SYLLABLE NWAELH;Lo;0;L;;;;;N;;;;;
+B1C0;HANGUL SYLLABLE NWAEM;Lo;0;L;;;;;N;;;;;
+B1C1;HANGUL SYLLABLE NWAEB;Lo;0;L;;;;;N;;;;;
+B1C2;HANGUL SYLLABLE NWAEBS;Lo;0;L;;;;;N;;;;;
+B1C3;HANGUL SYLLABLE NWAES;Lo;0;L;;;;;N;;;;;
+B1C4;HANGUL SYLLABLE NWAESS;Lo;0;L;;;;;N;;;;;
+B1C5;HANGUL SYLLABLE NWAENG;Lo;0;L;;;;;N;;;;;
+B1C6;HANGUL SYLLABLE NWAEJ;Lo;0;L;;;;;N;;;;;
+B1C7;HANGUL SYLLABLE NWAEC;Lo;0;L;;;;;N;;;;;
+B1C8;HANGUL SYLLABLE NWAEK;Lo;0;L;;;;;N;;;;;
+B1C9;HANGUL SYLLABLE NWAET;Lo;0;L;;;;;N;;;;;
+B1CA;HANGUL SYLLABLE NWAEP;Lo;0;L;;;;;N;;;;;
+B1CB;HANGUL SYLLABLE NWAEH;Lo;0;L;;;;;N;;;;;
+B1CC;HANGUL SYLLABLE NOE;Lo;0;L;;;;;N;;;;;
+B1CD;HANGUL SYLLABLE NOEG;Lo;0;L;;;;;N;;;;;
+B1CE;HANGUL SYLLABLE NOEGG;Lo;0;L;;;;;N;;;;;
+B1CF;HANGUL SYLLABLE NOEGS;Lo;0;L;;;;;N;;;;;
+B1D0;HANGUL SYLLABLE NOEN;Lo;0;L;;;;;N;;;;;
+B1D1;HANGUL SYLLABLE NOENI;Lo;0;L;;;;;N;;;;;
+B1D2;HANGUL SYLLABLE NOENH;Lo;0;L;;;;;N;;;;;
+B1D3;HANGUL SYLLABLE NOED;Lo;0;L;;;;;N;;;;;
+B1D4;HANGUL SYLLABLE NOEL;Lo;0;L;;;;;N;;;;;
+B1D5;HANGUL SYLLABLE NOELG;Lo;0;L;;;;;N;;;;;
+B1D6;HANGUL SYLLABLE NOELM;Lo;0;L;;;;;N;;;;;
+B1D7;HANGUL SYLLABLE NOELB;Lo;0;L;;;;;N;;;;;
+B1D8;HANGUL SYLLABLE NOELS;Lo;0;L;;;;;N;;;;;
+B1D9;HANGUL SYLLABLE NOELT;Lo;0;L;;;;;N;;;;;
+B1DA;HANGUL SYLLABLE NOELP;Lo;0;L;;;;;N;;;;;
+B1DB;HANGUL SYLLABLE NOELH;Lo;0;L;;;;;N;;;;;
+B1DC;HANGUL SYLLABLE NOEM;Lo;0;L;;;;;N;;;;;
+B1DD;HANGUL SYLLABLE NOEB;Lo;0;L;;;;;N;;;;;
+B1DE;HANGUL SYLLABLE NOEBS;Lo;0;L;;;;;N;;;;;
+B1DF;HANGUL SYLLABLE NOES;Lo;0;L;;;;;N;;;;;
+B1E0;HANGUL SYLLABLE NOESS;Lo;0;L;;;;;N;;;;;
+B1E1;HANGUL SYLLABLE NOENG;Lo;0;L;;;;;N;;;;;
+B1E2;HANGUL SYLLABLE NOEJ;Lo;0;L;;;;;N;;;;;
+B1E3;HANGUL SYLLABLE NOEC;Lo;0;L;;;;;N;;;;;
+B1E4;HANGUL SYLLABLE NOEK;Lo;0;L;;;;;N;;;;;
+B1E5;HANGUL SYLLABLE NOET;Lo;0;L;;;;;N;;;;;
+B1E6;HANGUL SYLLABLE NOEP;Lo;0;L;;;;;N;;;;;
+B1E7;HANGUL SYLLABLE NOEH;Lo;0;L;;;;;N;;;;;
+B1E8;HANGUL SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+B1E9;HANGUL SYLLABLE NYOG;Lo;0;L;;;;;N;;;;;
+B1EA;HANGUL SYLLABLE NYOGG;Lo;0;L;;;;;N;;;;;
+B1EB;HANGUL SYLLABLE NYOGS;Lo;0;L;;;;;N;;;;;
+B1EC;HANGUL SYLLABLE NYON;Lo;0;L;;;;;N;;;;;
+B1ED;HANGUL SYLLABLE NYONI;Lo;0;L;;;;;N;;;;;
+B1EE;HANGUL SYLLABLE NYONH;Lo;0;L;;;;;N;;;;;
+B1EF;HANGUL SYLLABLE NYOD;Lo;0;L;;;;;N;;;;;
+B1F0;HANGUL SYLLABLE NYOL;Lo;0;L;;;;;N;;;;;
+B1F1;HANGUL SYLLABLE NYOLG;Lo;0;L;;;;;N;;;;;
+B1F2;HANGUL SYLLABLE NYOLM;Lo;0;L;;;;;N;;;;;
+B1F3;HANGUL SYLLABLE NYOLB;Lo;0;L;;;;;N;;;;;
+B1F4;HANGUL SYLLABLE NYOLS;Lo;0;L;;;;;N;;;;;
+B1F5;HANGUL SYLLABLE NYOLT;Lo;0;L;;;;;N;;;;;
+B1F6;HANGUL SYLLABLE NYOLP;Lo;0;L;;;;;N;;;;;
+B1F7;HANGUL SYLLABLE NYOLH;Lo;0;L;;;;;N;;;;;
+B1F8;HANGUL SYLLABLE NYOM;Lo;0;L;;;;;N;;;;;
+B1F9;HANGUL SYLLABLE NYOB;Lo;0;L;;;;;N;;;;;
+B1FA;HANGUL SYLLABLE NYOBS;Lo;0;L;;;;;N;;;;;
+B1FB;HANGUL SYLLABLE NYOS;Lo;0;L;;;;;N;;;;;
+B1FC;HANGUL SYLLABLE NYOSS;Lo;0;L;;;;;N;;;;;
+B1FD;HANGUL SYLLABLE NYONG;Lo;0;L;;;;;N;;;;;
+B1FE;HANGUL SYLLABLE NYOJ;Lo;0;L;;;;;N;;;;;
+B1FF;HANGUL SYLLABLE NYOC;Lo;0;L;;;;;N;;;;;
+B200;HANGUL SYLLABLE NYOK;Lo;0;L;;;;;N;;;;;
+B201;HANGUL SYLLABLE NYOT;Lo;0;L;;;;;N;;;;;
+B202;HANGUL SYLLABLE NYOP;Lo;0;L;;;;;N;;;;;
+B203;HANGUL SYLLABLE NYOH;Lo;0;L;;;;;N;;;;;
+B204;HANGUL SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+B205;HANGUL SYLLABLE NUG;Lo;0;L;;;;;N;;;;;
+B206;HANGUL SYLLABLE NUGG;Lo;0;L;;;;;N;;;;;
+B207;HANGUL SYLLABLE NUGS;Lo;0;L;;;;;N;;;;;
+B208;HANGUL SYLLABLE NUN;Lo;0;L;;;;;N;;;;;
+B209;HANGUL SYLLABLE NUNI;Lo;0;L;;;;;N;;;;;
+B20A;HANGUL SYLLABLE NUNH;Lo;0;L;;;;;N;;;;;
+B20B;HANGUL SYLLABLE NUD;Lo;0;L;;;;;N;;;;;
+B20C;HANGUL SYLLABLE NUL;Lo;0;L;;;;;N;;;;;
+B20D;HANGUL SYLLABLE NULG;Lo;0;L;;;;;N;;;;;
+B20E;HANGUL SYLLABLE NULM;Lo;0;L;;;;;N;;;;;
+B20F;HANGUL SYLLABLE NULB;Lo;0;L;;;;;N;;;;;
+B210;HANGUL SYLLABLE NULS;Lo;0;L;;;;;N;;;;;
+B211;HANGUL SYLLABLE NULT;Lo;0;L;;;;;N;;;;;
+B212;HANGUL SYLLABLE NULP;Lo;0;L;;;;;N;;;;;
+B213;HANGUL SYLLABLE NULH;Lo;0;L;;;;;N;;;;;
+B214;HANGUL SYLLABLE NUM;Lo;0;L;;;;;N;;;;;
+B215;HANGUL SYLLABLE NUB;Lo;0;L;;;;;N;;;;;
+B216;HANGUL SYLLABLE NUBS;Lo;0;L;;;;;N;;;;;
+B217;HANGUL SYLLABLE NUS;Lo;0;L;;;;;N;;;;;
+B218;HANGUL SYLLABLE NUSS;Lo;0;L;;;;;N;;;;;
+B219;HANGUL SYLLABLE NUNG;Lo;0;L;;;;;N;;;;;
+B21A;HANGUL SYLLABLE NUJ;Lo;0;L;;;;;N;;;;;
+B21B;HANGUL SYLLABLE NUC;Lo;0;L;;;;;N;;;;;
+B21C;HANGUL SYLLABLE NUK;Lo;0;L;;;;;N;;;;;
+B21D;HANGUL SYLLABLE NUT;Lo;0;L;;;;;N;;;;;
+B21E;HANGUL SYLLABLE NUP;Lo;0;L;;;;;N;;;;;
+B21F;HANGUL SYLLABLE NUH;Lo;0;L;;;;;N;;;;;
+B220;HANGUL SYLLABLE NWEO;Lo;0;L;;;;;N;;;;;
+B221;HANGUL SYLLABLE NWEOG;Lo;0;L;;;;;N;;;;;
+B222;HANGUL SYLLABLE NWEOGG;Lo;0;L;;;;;N;;;;;
+B223;HANGUL SYLLABLE NWEOGS;Lo;0;L;;;;;N;;;;;
+B224;HANGUL SYLLABLE NWEON;Lo;0;L;;;;;N;;;;;
+B225;HANGUL SYLLABLE NWEONI;Lo;0;L;;;;;N;;;;;
+B226;HANGUL SYLLABLE NWEONH;Lo;0;L;;;;;N;;;;;
+B227;HANGUL SYLLABLE NWEOD;Lo;0;L;;;;;N;;;;;
+B228;HANGUL SYLLABLE NWEOL;Lo;0;L;;;;;N;;;;;
+B229;HANGUL SYLLABLE NWEOLG;Lo;0;L;;;;;N;;;;;
+B22A;HANGUL SYLLABLE NWEOLM;Lo;0;L;;;;;N;;;;;
+B22B;HANGUL SYLLABLE NWEOLB;Lo;0;L;;;;;N;;;;;
+B22C;HANGUL SYLLABLE NWEOLS;Lo;0;L;;;;;N;;;;;
+B22D;HANGUL SYLLABLE NWEOLT;Lo;0;L;;;;;N;;;;;
+B22E;HANGUL SYLLABLE NWEOLP;Lo;0;L;;;;;N;;;;;
+B22F;HANGUL SYLLABLE NWEOLH;Lo;0;L;;;;;N;;;;;
+B230;HANGUL SYLLABLE NWEOM;Lo;0;L;;;;;N;;;;;
+B231;HANGUL SYLLABLE NWEOB;Lo;0;L;;;;;N;;;;;
+B232;HANGUL SYLLABLE NWEOBS;Lo;0;L;;;;;N;;;;;
+B233;HANGUL SYLLABLE NWEOS;Lo;0;L;;;;;N;;;;;
+B234;HANGUL SYLLABLE NWEOSS;Lo;0;L;;;;;N;;;;;
+B235;HANGUL SYLLABLE NWEONG;Lo;0;L;;;;;N;;;;;
+B236;HANGUL SYLLABLE NWEOJ;Lo;0;L;;;;;N;;;;;
+B237;HANGUL SYLLABLE NWEOC;Lo;0;L;;;;;N;;;;;
+B238;HANGUL SYLLABLE NWEOK;Lo;0;L;;;;;N;;;;;
+B239;HANGUL SYLLABLE NWEOT;Lo;0;L;;;;;N;;;;;
+B23A;HANGUL SYLLABLE NWEOP;Lo;0;L;;;;;N;;;;;
+B23B;HANGUL SYLLABLE NWEOH;Lo;0;L;;;;;N;;;;;
+B23C;HANGUL SYLLABLE NWE;Lo;0;L;;;;;N;;;;;
+B23D;HANGUL SYLLABLE NWEG;Lo;0;L;;;;;N;;;;;
+B23E;HANGUL SYLLABLE NWEGG;Lo;0;L;;;;;N;;;;;
+B23F;HANGUL SYLLABLE NWEGS;Lo;0;L;;;;;N;;;;;
+B240;HANGUL SYLLABLE NWEN;Lo;0;L;;;;;N;;;;;
+B241;HANGUL SYLLABLE NWENI;Lo;0;L;;;;;N;;;;;
+B242;HANGUL SYLLABLE NWENH;Lo;0;L;;;;;N;;;;;
+B243;HANGUL SYLLABLE NWED;Lo;0;L;;;;;N;;;;;
+B244;HANGUL SYLLABLE NWEL;Lo;0;L;;;;;N;;;;;
+B245;HANGUL SYLLABLE NWELG;Lo;0;L;;;;;N;;;;;
+B246;HANGUL SYLLABLE NWELM;Lo;0;L;;;;;N;;;;;
+B247;HANGUL SYLLABLE NWELB;Lo;0;L;;;;;N;;;;;
+B248;HANGUL SYLLABLE NWELS;Lo;0;L;;;;;N;;;;;
+B249;HANGUL SYLLABLE NWELT;Lo;0;L;;;;;N;;;;;
+B24A;HANGUL SYLLABLE NWELP;Lo;0;L;;;;;N;;;;;
+B24B;HANGUL SYLLABLE NWELH;Lo;0;L;;;;;N;;;;;
+B24C;HANGUL SYLLABLE NWEM;Lo;0;L;;;;;N;;;;;
+B24D;HANGUL SYLLABLE NWEB;Lo;0;L;;;;;N;;;;;
+B24E;HANGUL SYLLABLE NWEBS;Lo;0;L;;;;;N;;;;;
+B24F;HANGUL SYLLABLE NWES;Lo;0;L;;;;;N;;;;;
+B250;HANGUL SYLLABLE NWESS;Lo;0;L;;;;;N;;;;;
+B251;HANGUL SYLLABLE NWENG;Lo;0;L;;;;;N;;;;;
+B252;HANGUL SYLLABLE NWEJ;Lo;0;L;;;;;N;;;;;
+B253;HANGUL SYLLABLE NWEC;Lo;0;L;;;;;N;;;;;
+B254;HANGUL SYLLABLE NWEK;Lo;0;L;;;;;N;;;;;
+B255;HANGUL SYLLABLE NWET;Lo;0;L;;;;;N;;;;;
+B256;HANGUL SYLLABLE NWEP;Lo;0;L;;;;;N;;;;;
+B257;HANGUL SYLLABLE NWEH;Lo;0;L;;;;;N;;;;;
+B258;HANGUL SYLLABLE NWI;Lo;0;L;;;;;N;;;;;
+B259;HANGUL SYLLABLE NWIG;Lo;0;L;;;;;N;;;;;
+B25A;HANGUL SYLLABLE NWIGG;Lo;0;L;;;;;N;;;;;
+B25B;HANGUL SYLLABLE NWIGS;Lo;0;L;;;;;N;;;;;
+B25C;HANGUL SYLLABLE NWIN;Lo;0;L;;;;;N;;;;;
+B25D;HANGUL SYLLABLE NWINI;Lo;0;L;;;;;N;;;;;
+B25E;HANGUL SYLLABLE NWINH;Lo;0;L;;;;;N;;;;;
+B25F;HANGUL SYLLABLE NWID;Lo;0;L;;;;;N;;;;;
+B260;HANGUL SYLLABLE NWIL;Lo;0;L;;;;;N;;;;;
+B261;HANGUL SYLLABLE NWILG;Lo;0;L;;;;;N;;;;;
+B262;HANGUL SYLLABLE NWILM;Lo;0;L;;;;;N;;;;;
+B263;HANGUL SYLLABLE NWILB;Lo;0;L;;;;;N;;;;;
+B264;HANGUL SYLLABLE NWILS;Lo;0;L;;;;;N;;;;;
+B265;HANGUL SYLLABLE NWILT;Lo;0;L;;;;;N;;;;;
+B266;HANGUL SYLLABLE NWILP;Lo;0;L;;;;;N;;;;;
+B267;HANGUL SYLLABLE NWILH;Lo;0;L;;;;;N;;;;;
+B268;HANGUL SYLLABLE NWIM;Lo;0;L;;;;;N;;;;;
+B269;HANGUL SYLLABLE NWIB;Lo;0;L;;;;;N;;;;;
+B26A;HANGUL SYLLABLE NWIBS;Lo;0;L;;;;;N;;;;;
+B26B;HANGUL SYLLABLE NWIS;Lo;0;L;;;;;N;;;;;
+B26C;HANGUL SYLLABLE NWISS;Lo;0;L;;;;;N;;;;;
+B26D;HANGUL SYLLABLE NWING;Lo;0;L;;;;;N;;;;;
+B26E;HANGUL SYLLABLE NWIJ;Lo;0;L;;;;;N;;;;;
+B26F;HANGUL SYLLABLE NWIC;Lo;0;L;;;;;N;;;;;
+B270;HANGUL SYLLABLE NWIK;Lo;0;L;;;;;N;;;;;
+B271;HANGUL SYLLABLE NWIT;Lo;0;L;;;;;N;;;;;
+B272;HANGUL SYLLABLE NWIP;Lo;0;L;;;;;N;;;;;
+B273;HANGUL SYLLABLE NWIH;Lo;0;L;;;;;N;;;;;
+B274;HANGUL SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+B275;HANGUL SYLLABLE NYUG;Lo;0;L;;;;;N;;;;;
+B276;HANGUL SYLLABLE NYUGG;Lo;0;L;;;;;N;;;;;
+B277;HANGUL SYLLABLE NYUGS;Lo;0;L;;;;;N;;;;;
+B278;HANGUL SYLLABLE NYUN;Lo;0;L;;;;;N;;;;;
+B279;HANGUL SYLLABLE NYUNI;Lo;0;L;;;;;N;;;;;
+B27A;HANGUL SYLLABLE NYUNH;Lo;0;L;;;;;N;;;;;
+B27B;HANGUL SYLLABLE NYUD;Lo;0;L;;;;;N;;;;;
+B27C;HANGUL SYLLABLE NYUL;Lo;0;L;;;;;N;;;;;
+B27D;HANGUL SYLLABLE NYULG;Lo;0;L;;;;;N;;;;;
+B27E;HANGUL SYLLABLE NYULM;Lo;0;L;;;;;N;;;;;
+B27F;HANGUL SYLLABLE NYULB;Lo;0;L;;;;;N;;;;;
+B280;HANGUL SYLLABLE NYULS;Lo;0;L;;;;;N;;;;;
+B281;HANGUL SYLLABLE NYULT;Lo;0;L;;;;;N;;;;;
+B282;HANGUL SYLLABLE NYULP;Lo;0;L;;;;;N;;;;;
+B283;HANGUL SYLLABLE NYULH;Lo;0;L;;;;;N;;;;;
+B284;HANGUL SYLLABLE NYUM;Lo;0;L;;;;;N;;;;;
+B285;HANGUL SYLLABLE NYUB;Lo;0;L;;;;;N;;;;;
+B286;HANGUL SYLLABLE NYUBS;Lo;0;L;;;;;N;;;;;
+B287;HANGUL SYLLABLE NYUS;Lo;0;L;;;;;N;;;;;
+B288;HANGUL SYLLABLE NYUSS;Lo;0;L;;;;;N;;;;;
+B289;HANGUL SYLLABLE NYUNG;Lo;0;L;;;;;N;;;;;
+B28A;HANGUL SYLLABLE NYUJ;Lo;0;L;;;;;N;;;;;
+B28B;HANGUL SYLLABLE NYUC;Lo;0;L;;;;;N;;;;;
+B28C;HANGUL SYLLABLE NYUK;Lo;0;L;;;;;N;;;;;
+B28D;HANGUL SYLLABLE NYUT;Lo;0;L;;;;;N;;;;;
+B28E;HANGUL SYLLABLE NYUP;Lo;0;L;;;;;N;;;;;
+B28F;HANGUL SYLLABLE NYUH;Lo;0;L;;;;;N;;;;;
+B290;HANGUL SYLLABLE NEU;Lo;0;L;;;;;N;;;;;
+B291;HANGUL SYLLABLE NEUG;Lo;0;L;;;;;N;;;;;
+B292;HANGUL SYLLABLE NEUGG;Lo;0;L;;;;;N;;;;;
+B293;HANGUL SYLLABLE NEUGS;Lo;0;L;;;;;N;;;;;
+B294;HANGUL SYLLABLE NEUN;Lo;0;L;;;;;N;;;;;
+B295;HANGUL SYLLABLE NEUNI;Lo;0;L;;;;;N;;;;;
+B296;HANGUL SYLLABLE NEUNH;Lo;0;L;;;;;N;;;;;
+B297;HANGUL SYLLABLE NEUD;Lo;0;L;;;;;N;;;;;
+B298;HANGUL SYLLABLE NEUL;Lo;0;L;;;;;N;;;;;
+B299;HANGUL SYLLABLE NEULG;Lo;0;L;;;;;N;;;;;
+B29A;HANGUL SYLLABLE NEULM;Lo;0;L;;;;;N;;;;;
+B29B;HANGUL SYLLABLE NEULB;Lo;0;L;;;;;N;;;;;
+B29C;HANGUL SYLLABLE NEULS;Lo;0;L;;;;;N;;;;;
+B29D;HANGUL SYLLABLE NEULT;Lo;0;L;;;;;N;;;;;
+B29E;HANGUL SYLLABLE NEULP;Lo;0;L;;;;;N;;;;;
+B29F;HANGUL SYLLABLE NEULH;Lo;0;L;;;;;N;;;;;
+B2A0;HANGUL SYLLABLE NEUM;Lo;0;L;;;;;N;;;;;
+B2A1;HANGUL SYLLABLE NEUB;Lo;0;L;;;;;N;;;;;
+B2A2;HANGUL SYLLABLE NEUBS;Lo;0;L;;;;;N;;;;;
+B2A3;HANGUL SYLLABLE NEUS;Lo;0;L;;;;;N;;;;;
+B2A4;HANGUL SYLLABLE NEUSS;Lo;0;L;;;;;N;;;;;
+B2A5;HANGUL SYLLABLE NEUNG;Lo;0;L;;;;;N;;;;;
+B2A6;HANGUL SYLLABLE NEUJ;Lo;0;L;;;;;N;;;;;
+B2A7;HANGUL SYLLABLE NEUC;Lo;0;L;;;;;N;;;;;
+B2A8;HANGUL SYLLABLE NEUK;Lo;0;L;;;;;N;;;;;
+B2A9;HANGUL SYLLABLE NEUT;Lo;0;L;;;;;N;;;;;
+B2AA;HANGUL SYLLABLE NEUP;Lo;0;L;;;;;N;;;;;
+B2AB;HANGUL SYLLABLE NEUH;Lo;0;L;;;;;N;;;;;
+B2AC;HANGUL SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+B2AD;HANGUL SYLLABLE NYIG;Lo;0;L;;;;;N;;;;;
+B2AE;HANGUL SYLLABLE NYIGG;Lo;0;L;;;;;N;;;;;
+B2AF;HANGUL SYLLABLE NYIGS;Lo;0;L;;;;;N;;;;;
+B2B0;HANGUL SYLLABLE NYIN;Lo;0;L;;;;;N;;;;;
+B2B1;HANGUL SYLLABLE NYINI;Lo;0;L;;;;;N;;;;;
+B2B2;HANGUL SYLLABLE NYINH;Lo;0;L;;;;;N;;;;;
+B2B3;HANGUL SYLLABLE NYID;Lo;0;L;;;;;N;;;;;
+B2B4;HANGUL SYLLABLE NYIL;Lo;0;L;;;;;N;;;;;
+B2B5;HANGUL SYLLABLE NYILG;Lo;0;L;;;;;N;;;;;
+B2B6;HANGUL SYLLABLE NYILM;Lo;0;L;;;;;N;;;;;
+B2B7;HANGUL SYLLABLE NYILB;Lo;0;L;;;;;N;;;;;
+B2B8;HANGUL SYLLABLE NYILS;Lo;0;L;;;;;N;;;;;
+B2B9;HANGUL SYLLABLE NYILT;Lo;0;L;;;;;N;;;;;
+B2BA;HANGUL SYLLABLE NYILP;Lo;0;L;;;;;N;;;;;
+B2BB;HANGUL SYLLABLE NYILH;Lo;0;L;;;;;N;;;;;
+B2BC;HANGUL SYLLABLE NYIM;Lo;0;L;;;;;N;;;;;
+B2BD;HANGUL SYLLABLE NYIB;Lo;0;L;;;;;N;;;;;
+B2BE;HANGUL SYLLABLE NYIBS;Lo;0;L;;;;;N;;;;;
+B2BF;HANGUL SYLLABLE NYIS;Lo;0;L;;;;;N;;;;;
+B2C0;HANGUL SYLLABLE NYISS;Lo;0;L;;;;;N;;;;;
+B2C1;HANGUL SYLLABLE NYING;Lo;0;L;;;;;N;;;;;
+B2C2;HANGUL SYLLABLE NYIJ;Lo;0;L;;;;;N;;;;;
+B2C3;HANGUL SYLLABLE NYIC;Lo;0;L;;;;;N;;;;;
+B2C4;HANGUL SYLLABLE NYIK;Lo;0;L;;;;;N;;;;;
+B2C5;HANGUL SYLLABLE NYIT;Lo;0;L;;;;;N;;;;;
+B2C6;HANGUL SYLLABLE NYIP;Lo;0;L;;;;;N;;;;;
+B2C7;HANGUL SYLLABLE NYIH;Lo;0;L;;;;;N;;;;;
+B2C8;HANGUL SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+B2C9;HANGUL SYLLABLE NIG;Lo;0;L;;;;;N;;;;;
+B2CA;HANGUL SYLLABLE NIGG;Lo;0;L;;;;;N;;;;;
+B2CB;HANGUL SYLLABLE NIGS;Lo;0;L;;;;;N;;;;;
+B2CC;HANGUL SYLLABLE NIN;Lo;0;L;;;;;N;;;;;
+B2CD;HANGUL SYLLABLE NINI;Lo;0;L;;;;;N;;;;;
+B2CE;HANGUL SYLLABLE NINH;Lo;0;L;;;;;N;;;;;
+B2CF;HANGUL SYLLABLE NID;Lo;0;L;;;;;N;;;;;
+B2D0;HANGUL SYLLABLE NIL;Lo;0;L;;;;;N;;;;;
+B2D1;HANGUL SYLLABLE NILG;Lo;0;L;;;;;N;;;;;
+B2D2;HANGUL SYLLABLE NILM;Lo;0;L;;;;;N;;;;;
+B2D3;HANGUL SYLLABLE NILB;Lo;0;L;;;;;N;;;;;
+B2D4;HANGUL SYLLABLE NILS;Lo;0;L;;;;;N;;;;;
+B2D5;HANGUL SYLLABLE NILT;Lo;0;L;;;;;N;;;;;
+B2D6;HANGUL SYLLABLE NILP;Lo;0;L;;;;;N;;;;;
+B2D7;HANGUL SYLLABLE NILH;Lo;0;L;;;;;N;;;;;
+B2D8;HANGUL SYLLABLE NIM;Lo;0;L;;;;;N;;;;;
+B2D9;HANGUL SYLLABLE NIB;Lo;0;L;;;;;N;;;;;
+B2DA;HANGUL SYLLABLE NIBS;Lo;0;L;;;;;N;;;;;
+B2DB;HANGUL SYLLABLE NIS;Lo;0;L;;;;;N;;;;;
+B2DC;HANGUL SYLLABLE NISS;Lo;0;L;;;;;N;;;;;
+B2DD;HANGUL SYLLABLE NING;Lo;0;L;;;;;N;;;;;
+B2DE;HANGUL SYLLABLE NIJ;Lo;0;L;;;;;N;;;;;
+B2DF;HANGUL SYLLABLE NIC;Lo;0;L;;;;;N;;;;;
+B2E0;HANGUL SYLLABLE NIK;Lo;0;L;;;;;N;;;;;
+B2E1;HANGUL SYLLABLE NIT;Lo;0;L;;;;;N;;;;;
+B2E2;HANGUL SYLLABLE NIP;Lo;0;L;;;;;N;;;;;
+B2E3;HANGUL SYLLABLE NIH;Lo;0;L;;;;;N;;;;;
+B2E4;HANGUL SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+B2E5;HANGUL SYLLABLE DAG;Lo;0;L;;;;;N;;;;;
+B2E6;HANGUL SYLLABLE DAGG;Lo;0;L;;;;;N;;;;;
+B2E7;HANGUL SYLLABLE DAGS;Lo;0;L;;;;;N;;;;;
+B2E8;HANGUL SYLLABLE DAN;Lo;0;L;;;;;N;;;;;
+B2E9;HANGUL SYLLABLE DANI;Lo;0;L;;;;;N;;;;;
+B2EA;HANGUL SYLLABLE DANH;Lo;0;L;;;;;N;;;;;
+B2EB;HANGUL SYLLABLE DAD;Lo;0;L;;;;;N;;;;;
+B2EC;HANGUL SYLLABLE DAL;Lo;0;L;;;;;N;;;;;
+B2ED;HANGUL SYLLABLE DALG;Lo;0;L;;;;;N;;;;;
+B2EE;HANGUL SYLLABLE DALM;Lo;0;L;;;;;N;;;;;
+B2EF;HANGUL SYLLABLE DALB;Lo;0;L;;;;;N;;;;;
+B2F0;HANGUL SYLLABLE DALS;Lo;0;L;;;;;N;;;;;
+B2F1;HANGUL SYLLABLE DALT;Lo;0;L;;;;;N;;;;;
+B2F2;HANGUL SYLLABLE DALP;Lo;0;L;;;;;N;;;;;
+B2F3;HANGUL SYLLABLE DALH;Lo;0;L;;;;;N;;;;;
+B2F4;HANGUL SYLLABLE DAM;Lo;0;L;;;;;N;;;;;
+B2F5;HANGUL SYLLABLE DAB;Lo;0;L;;;;;N;;;;;
+B2F6;HANGUL SYLLABLE DABS;Lo;0;L;;;;;N;;;;;
+B2F7;HANGUL SYLLABLE DAS;Lo;0;L;;;;;N;;;;;
+B2F8;HANGUL SYLLABLE DASS;Lo;0;L;;;;;N;;;;;
+B2F9;HANGUL SYLLABLE DANG;Lo;0;L;;;;;N;;;;;
+B2FA;HANGUL SYLLABLE DAJ;Lo;0;L;;;;;N;;;;;
+B2FB;HANGUL SYLLABLE DAC;Lo;0;L;;;;;N;;;;;
+B2FC;HANGUL SYLLABLE DAK;Lo;0;L;;;;;N;;;;;
+B2FD;HANGUL SYLLABLE DAT;Lo;0;L;;;;;N;;;;;
+B2FE;HANGUL SYLLABLE DAP;Lo;0;L;;;;;N;;;;;
+B2FF;HANGUL SYLLABLE DAH;Lo;0;L;;;;;N;;;;;
+B300;HANGUL SYLLABLE DAE;Lo;0;L;;;;;N;;;;;
+B301;HANGUL SYLLABLE DAEG;Lo;0;L;;;;;N;;;;;
+B302;HANGUL SYLLABLE DAEGG;Lo;0;L;;;;;N;;;;;
+B303;HANGUL SYLLABLE DAEGS;Lo;0;L;;;;;N;;;;;
+B304;HANGUL SYLLABLE DAEN;Lo;0;L;;;;;N;;;;;
+B305;HANGUL SYLLABLE DAENI;Lo;0;L;;;;;N;;;;;
+B306;HANGUL SYLLABLE DAENH;Lo;0;L;;;;;N;;;;;
+B307;HANGUL SYLLABLE DAED;Lo;0;L;;;;;N;;;;;
+B308;HANGUL SYLLABLE DAEL;Lo;0;L;;;;;N;;;;;
+B309;HANGUL SYLLABLE DAELG;Lo;0;L;;;;;N;;;;;
+B30A;HANGUL SYLLABLE DAELM;Lo;0;L;;;;;N;;;;;
+B30B;HANGUL SYLLABLE DAELB;Lo;0;L;;;;;N;;;;;
+B30C;HANGUL SYLLABLE DAELS;Lo;0;L;;;;;N;;;;;
+B30D;HANGUL SYLLABLE DAELT;Lo;0;L;;;;;N;;;;;
+B30E;HANGUL SYLLABLE DAELP;Lo;0;L;;;;;N;;;;;
+B30F;HANGUL SYLLABLE DAELH;Lo;0;L;;;;;N;;;;;
+B310;HANGUL SYLLABLE DAEM;Lo;0;L;;;;;N;;;;;
+B311;HANGUL SYLLABLE DAEB;Lo;0;L;;;;;N;;;;;
+B312;HANGUL SYLLABLE DAEBS;Lo;0;L;;;;;N;;;;;
+B313;HANGUL SYLLABLE DAES;Lo;0;L;;;;;N;;;;;
+B314;HANGUL SYLLABLE DAESS;Lo;0;L;;;;;N;;;;;
+B315;HANGUL SYLLABLE DAENG;Lo;0;L;;;;;N;;;;;
+B316;HANGUL SYLLABLE DAEJ;Lo;0;L;;;;;N;;;;;
+B317;HANGUL SYLLABLE DAEC;Lo;0;L;;;;;N;;;;;
+B318;HANGUL SYLLABLE DAEK;Lo;0;L;;;;;N;;;;;
+B319;HANGUL SYLLABLE DAET;Lo;0;L;;;;;N;;;;;
+B31A;HANGUL SYLLABLE DAEP;Lo;0;L;;;;;N;;;;;
+B31B;HANGUL SYLLABLE DAEH;Lo;0;L;;;;;N;;;;;
+B31C;HANGUL SYLLABLE DYA;Lo;0;L;;;;;N;;;;;
+B31D;HANGUL SYLLABLE DYAG;Lo;0;L;;;;;N;;;;;
+B31E;HANGUL SYLLABLE DYAGG;Lo;0;L;;;;;N;;;;;
+B31F;HANGUL SYLLABLE DYAGS;Lo;0;L;;;;;N;;;;;
+B320;HANGUL SYLLABLE DYAN;Lo;0;L;;;;;N;;;;;
+B321;HANGUL SYLLABLE DYANI;Lo;0;L;;;;;N;;;;;
+B322;HANGUL SYLLABLE DYANH;Lo;0;L;;;;;N;;;;;
+B323;HANGUL SYLLABLE DYAD;Lo;0;L;;;;;N;;;;;
+B324;HANGUL SYLLABLE DYAL;Lo;0;L;;;;;N;;;;;
+B325;HANGUL SYLLABLE DYALG;Lo;0;L;;;;;N;;;;;
+B326;HANGUL SYLLABLE DYALM;Lo;0;L;;;;;N;;;;;
+B327;HANGUL SYLLABLE DYALB;Lo;0;L;;;;;N;;;;;
+B328;HANGUL SYLLABLE DYALS;Lo;0;L;;;;;N;;;;;
+B329;HANGUL SYLLABLE DYALT;Lo;0;L;;;;;N;;;;;
+B32A;HANGUL SYLLABLE DYALP;Lo;0;L;;;;;N;;;;;
+B32B;HANGUL SYLLABLE DYALH;Lo;0;L;;;;;N;;;;;
+B32C;HANGUL SYLLABLE DYAM;Lo;0;L;;;;;N;;;;;
+B32D;HANGUL SYLLABLE DYAB;Lo;0;L;;;;;N;;;;;
+B32E;HANGUL SYLLABLE DYABS;Lo;0;L;;;;;N;;;;;
+B32F;HANGUL SYLLABLE DYAS;Lo;0;L;;;;;N;;;;;
+B330;HANGUL SYLLABLE DYASS;Lo;0;L;;;;;N;;;;;
+B331;HANGUL SYLLABLE DYANG;Lo;0;L;;;;;N;;;;;
+B332;HANGUL SYLLABLE DYAJ;Lo;0;L;;;;;N;;;;;
+B333;HANGUL SYLLABLE DYAC;Lo;0;L;;;;;N;;;;;
+B334;HANGUL SYLLABLE DYAK;Lo;0;L;;;;;N;;;;;
+B335;HANGUL SYLLABLE DYAT;Lo;0;L;;;;;N;;;;;
+B336;HANGUL SYLLABLE DYAP;Lo;0;L;;;;;N;;;;;
+B337;HANGUL SYLLABLE DYAH;Lo;0;L;;;;;N;;;;;
+B338;HANGUL SYLLABLE DYAE;Lo;0;L;;;;;N;;;;;
+B339;HANGUL SYLLABLE DYAEG;Lo;0;L;;;;;N;;;;;
+B33A;HANGUL SYLLABLE DYAEGG;Lo;0;L;;;;;N;;;;;
+B33B;HANGUL SYLLABLE DYAEGS;Lo;0;L;;;;;N;;;;;
+B33C;HANGUL SYLLABLE DYAEN;Lo;0;L;;;;;N;;;;;
+B33D;HANGUL SYLLABLE DYAENI;Lo;0;L;;;;;N;;;;;
+B33E;HANGUL SYLLABLE DYAENH;Lo;0;L;;;;;N;;;;;
+B33F;HANGUL SYLLABLE DYAED;Lo;0;L;;;;;N;;;;;
+B340;HANGUL SYLLABLE DYAEL;Lo;0;L;;;;;N;;;;;
+B341;HANGUL SYLLABLE DYAELG;Lo;0;L;;;;;N;;;;;
+B342;HANGUL SYLLABLE DYAELM;Lo;0;L;;;;;N;;;;;
+B343;HANGUL SYLLABLE DYAELB;Lo;0;L;;;;;N;;;;;
+B344;HANGUL SYLLABLE DYAELS;Lo;0;L;;;;;N;;;;;
+B345;HANGUL SYLLABLE DYAELT;Lo;0;L;;;;;N;;;;;
+B346;HANGUL SYLLABLE DYAELP;Lo;0;L;;;;;N;;;;;
+B347;HANGUL SYLLABLE DYAELH;Lo;0;L;;;;;N;;;;;
+B348;HANGUL SYLLABLE DYAEM;Lo;0;L;;;;;N;;;;;
+B349;HANGUL SYLLABLE DYAEB;Lo;0;L;;;;;N;;;;;
+B34A;HANGUL SYLLABLE DYAEBS;Lo;0;L;;;;;N;;;;;
+B34B;HANGUL SYLLABLE DYAES;Lo;0;L;;;;;N;;;;;
+B34C;HANGUL SYLLABLE DYAESS;Lo;0;L;;;;;N;;;;;
+B34D;HANGUL SYLLABLE DYAENG;Lo;0;L;;;;;N;;;;;
+B34E;HANGUL SYLLABLE DYAEJ;Lo;0;L;;;;;N;;;;;
+B34F;HANGUL SYLLABLE DYAEC;Lo;0;L;;;;;N;;;;;
+B350;HANGUL SYLLABLE DYAEK;Lo;0;L;;;;;N;;;;;
+B351;HANGUL SYLLABLE DYAET;Lo;0;L;;;;;N;;;;;
+B352;HANGUL SYLLABLE DYAEP;Lo;0;L;;;;;N;;;;;
+B353;HANGUL SYLLABLE DYAEH;Lo;0;L;;;;;N;;;;;
+B354;HANGUL SYLLABLE DEO;Lo;0;L;;;;;N;;;;;
+B355;HANGUL SYLLABLE DEOG;Lo;0;L;;;;;N;;;;;
+B356;HANGUL SYLLABLE DEOGG;Lo;0;L;;;;;N;;;;;
+B357;HANGUL SYLLABLE DEOGS;Lo;0;L;;;;;N;;;;;
+B358;HANGUL SYLLABLE DEON;Lo;0;L;;;;;N;;;;;
+B359;HANGUL SYLLABLE DEONI;Lo;0;L;;;;;N;;;;;
+B35A;HANGUL SYLLABLE DEONH;Lo;0;L;;;;;N;;;;;
+B35B;HANGUL SYLLABLE DEOD;Lo;0;L;;;;;N;;;;;
+B35C;HANGUL SYLLABLE DEOL;Lo;0;L;;;;;N;;;;;
+B35D;HANGUL SYLLABLE DEOLG;Lo;0;L;;;;;N;;;;;
+B35E;HANGUL SYLLABLE DEOLM;Lo;0;L;;;;;N;;;;;
+B35F;HANGUL SYLLABLE DEOLB;Lo;0;L;;;;;N;;;;;
+B360;HANGUL SYLLABLE DEOLS;Lo;0;L;;;;;N;;;;;
+B361;HANGUL SYLLABLE DEOLT;Lo;0;L;;;;;N;;;;;
+B362;HANGUL SYLLABLE DEOLP;Lo;0;L;;;;;N;;;;;
+B363;HANGUL SYLLABLE DEOLH;Lo;0;L;;;;;N;;;;;
+B364;HANGUL SYLLABLE DEOM;Lo;0;L;;;;;N;;;;;
+B365;HANGUL SYLLABLE DEOB;Lo;0;L;;;;;N;;;;;
+B366;HANGUL SYLLABLE DEOBS;Lo;0;L;;;;;N;;;;;
+B367;HANGUL SYLLABLE DEOS;Lo;0;L;;;;;N;;;;;
+B368;HANGUL SYLLABLE DEOSS;Lo;0;L;;;;;N;;;;;
+B369;HANGUL SYLLABLE DEONG;Lo;0;L;;;;;N;;;;;
+B36A;HANGUL SYLLABLE DEOJ;Lo;0;L;;;;;N;;;;;
+B36B;HANGUL SYLLABLE DEOC;Lo;0;L;;;;;N;;;;;
+B36C;HANGUL SYLLABLE DEOK;Lo;0;L;;;;;N;;;;;
+B36D;HANGUL SYLLABLE DEOT;Lo;0;L;;;;;N;;;;;
+B36E;HANGUL SYLLABLE DEOP;Lo;0;L;;;;;N;;;;;
+B36F;HANGUL SYLLABLE DEOH;Lo;0;L;;;;;N;;;;;
+B370;HANGUL SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+B371;HANGUL SYLLABLE DEG;Lo;0;L;;;;;N;;;;;
+B372;HANGUL SYLLABLE DEGG;Lo;0;L;;;;;N;;;;;
+B373;HANGUL SYLLABLE DEGS;Lo;0;L;;;;;N;;;;;
+B374;HANGUL SYLLABLE DEN;Lo;0;L;;;;;N;;;;;
+B375;HANGUL SYLLABLE DENI;Lo;0;L;;;;;N;;;;;
+B376;HANGUL SYLLABLE DENH;Lo;0;L;;;;;N;;;;;
+B377;HANGUL SYLLABLE DED;Lo;0;L;;;;;N;;;;;
+B378;HANGUL SYLLABLE DEL;Lo;0;L;;;;;N;;;;;
+B379;HANGUL SYLLABLE DELG;Lo;0;L;;;;;N;;;;;
+B37A;HANGUL SYLLABLE DELM;Lo;0;L;;;;;N;;;;;
+B37B;HANGUL SYLLABLE DELB;Lo;0;L;;;;;N;;;;;
+B37C;HANGUL SYLLABLE DELS;Lo;0;L;;;;;N;;;;;
+B37D;HANGUL SYLLABLE DELT;Lo;0;L;;;;;N;;;;;
+B37E;HANGUL SYLLABLE DELP;Lo;0;L;;;;;N;;;;;
+B37F;HANGUL SYLLABLE DELH;Lo;0;L;;;;;N;;;;;
+B380;HANGUL SYLLABLE DEM;Lo;0;L;;;;;N;;;;;
+B381;HANGUL SYLLABLE DEB;Lo;0;L;;;;;N;;;;;
+B382;HANGUL SYLLABLE DEBS;Lo;0;L;;;;;N;;;;;
+B383;HANGUL SYLLABLE DES;Lo;0;L;;;;;N;;;;;
+B384;HANGUL SYLLABLE DESS;Lo;0;L;;;;;N;;;;;
+B385;HANGUL SYLLABLE DENG;Lo;0;L;;;;;N;;;;;
+B386;HANGUL SYLLABLE DEJ;Lo;0;L;;;;;N;;;;;
+B387;HANGUL SYLLABLE DEC;Lo;0;L;;;;;N;;;;;
+B388;HANGUL SYLLABLE DEK;Lo;0;L;;;;;N;;;;;
+B389;HANGUL SYLLABLE DET;Lo;0;L;;;;;N;;;;;
+B38A;HANGUL SYLLABLE DEP;Lo;0;L;;;;;N;;;;;
+B38B;HANGUL SYLLABLE DEH;Lo;0;L;;;;;N;;;;;
+B38C;HANGUL SYLLABLE DYEO;Lo;0;L;;;;;N;;;;;
+B38D;HANGUL SYLLABLE DYEOG;Lo;0;L;;;;;N;;;;;
+B38E;HANGUL SYLLABLE DYEOGG;Lo;0;L;;;;;N;;;;;
+B38F;HANGUL SYLLABLE DYEOGS;Lo;0;L;;;;;N;;;;;
+B390;HANGUL SYLLABLE DYEON;Lo;0;L;;;;;N;;;;;
+B391;HANGUL SYLLABLE DYEONI;Lo;0;L;;;;;N;;;;;
+B392;HANGUL SYLLABLE DYEONH;Lo;0;L;;;;;N;;;;;
+B393;HANGUL SYLLABLE DYEOD;Lo;0;L;;;;;N;;;;;
+B394;HANGUL SYLLABLE DYEOL;Lo;0;L;;;;;N;;;;;
+B395;HANGUL SYLLABLE DYEOLG;Lo;0;L;;;;;N;;;;;
+B396;HANGUL SYLLABLE DYEOLM;Lo;0;L;;;;;N;;;;;
+B397;HANGUL SYLLABLE DYEOLB;Lo;0;L;;;;;N;;;;;
+B398;HANGUL SYLLABLE DYEOLS;Lo;0;L;;;;;N;;;;;
+B399;HANGUL SYLLABLE DYEOLT;Lo;0;L;;;;;N;;;;;
+B39A;HANGUL SYLLABLE DYEOLP;Lo;0;L;;;;;N;;;;;
+B39B;HANGUL SYLLABLE DYEOLH;Lo;0;L;;;;;N;;;;;
+B39C;HANGUL SYLLABLE DYEOM;Lo;0;L;;;;;N;;;;;
+B39D;HANGUL SYLLABLE DYEOB;Lo;0;L;;;;;N;;;;;
+B39E;HANGUL SYLLABLE DYEOBS;Lo;0;L;;;;;N;;;;;
+B39F;HANGUL SYLLABLE DYEOS;Lo;0;L;;;;;N;;;;;
+B3A0;HANGUL SYLLABLE DYEOSS;Lo;0;L;;;;;N;;;;;
+B3A1;HANGUL SYLLABLE DYEONG;Lo;0;L;;;;;N;;;;;
+B3A2;HANGUL SYLLABLE DYEOJ;Lo;0;L;;;;;N;;;;;
+B3A3;HANGUL SYLLABLE DYEOC;Lo;0;L;;;;;N;;;;;
+B3A4;HANGUL SYLLABLE DYEOK;Lo;0;L;;;;;N;;;;;
+B3A5;HANGUL SYLLABLE DYEOT;Lo;0;L;;;;;N;;;;;
+B3A6;HANGUL SYLLABLE DYEOP;Lo;0;L;;;;;N;;;;;
+B3A7;HANGUL SYLLABLE DYEOH;Lo;0;L;;;;;N;;;;;
+B3A8;HANGUL SYLLABLE DYE;Lo;0;L;;;;;N;;;;;
+B3A9;HANGUL SYLLABLE DYEG;Lo;0;L;;;;;N;;;;;
+B3AA;HANGUL SYLLABLE DYEGG;Lo;0;L;;;;;N;;;;;
+B3AB;HANGUL SYLLABLE DYEGS;Lo;0;L;;;;;N;;;;;
+B3AC;HANGUL SYLLABLE DYEN;Lo;0;L;;;;;N;;;;;
+B3AD;HANGUL SYLLABLE DYENI;Lo;0;L;;;;;N;;;;;
+B3AE;HANGUL SYLLABLE DYENH;Lo;0;L;;;;;N;;;;;
+B3AF;HANGUL SYLLABLE DYED;Lo;0;L;;;;;N;;;;;
+B3B0;HANGUL SYLLABLE DYEL;Lo;0;L;;;;;N;;;;;
+B3B1;HANGUL SYLLABLE DYELG;Lo;0;L;;;;;N;;;;;
+B3B2;HANGUL SYLLABLE DYELM;Lo;0;L;;;;;N;;;;;
+B3B3;HANGUL SYLLABLE DYELB;Lo;0;L;;;;;N;;;;;
+B3B4;HANGUL SYLLABLE DYELS;Lo;0;L;;;;;N;;;;;
+B3B5;HANGUL SYLLABLE DYELT;Lo;0;L;;;;;N;;;;;
+B3B6;HANGUL SYLLABLE DYELP;Lo;0;L;;;;;N;;;;;
+B3B7;HANGUL SYLLABLE DYELH;Lo;0;L;;;;;N;;;;;
+B3B8;HANGUL SYLLABLE DYEM;Lo;0;L;;;;;N;;;;;
+B3B9;HANGUL SYLLABLE DYEB;Lo;0;L;;;;;N;;;;;
+B3BA;HANGUL SYLLABLE DYEBS;Lo;0;L;;;;;N;;;;;
+B3BB;HANGUL SYLLABLE DYES;Lo;0;L;;;;;N;;;;;
+B3BC;HANGUL SYLLABLE DYESS;Lo;0;L;;;;;N;;;;;
+B3BD;HANGUL SYLLABLE DYENG;Lo;0;L;;;;;N;;;;;
+B3BE;HANGUL SYLLABLE DYEJ;Lo;0;L;;;;;N;;;;;
+B3BF;HANGUL SYLLABLE DYEC;Lo;0;L;;;;;N;;;;;
+B3C0;HANGUL SYLLABLE DYEK;Lo;0;L;;;;;N;;;;;
+B3C1;HANGUL SYLLABLE DYET;Lo;0;L;;;;;N;;;;;
+B3C2;HANGUL SYLLABLE DYEP;Lo;0;L;;;;;N;;;;;
+B3C3;HANGUL SYLLABLE DYEH;Lo;0;L;;;;;N;;;;;
+B3C4;HANGUL SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+B3C5;HANGUL SYLLABLE DOG;Lo;0;L;;;;;N;;;;;
+B3C6;HANGUL SYLLABLE DOGG;Lo;0;L;;;;;N;;;;;
+B3C7;HANGUL SYLLABLE DOGS;Lo;0;L;;;;;N;;;;;
+B3C8;HANGUL SYLLABLE DON;Lo;0;L;;;;;N;;;;;
+B3C9;HANGUL SYLLABLE DONI;Lo;0;L;;;;;N;;;;;
+B3CA;HANGUL SYLLABLE DONH;Lo;0;L;;;;;N;;;;;
+B3CB;HANGUL SYLLABLE DOD;Lo;0;L;;;;;N;;;;;
+B3CC;HANGUL SYLLABLE DOL;Lo;0;L;;;;;N;;;;;
+B3CD;HANGUL SYLLABLE DOLG;Lo;0;L;;;;;N;;;;;
+B3CE;HANGUL SYLLABLE DOLM;Lo;0;L;;;;;N;;;;;
+B3CF;HANGUL SYLLABLE DOLB;Lo;0;L;;;;;N;;;;;
+B3D0;HANGUL SYLLABLE DOLS;Lo;0;L;;;;;N;;;;;
+B3D1;HANGUL SYLLABLE DOLT;Lo;0;L;;;;;N;;;;;
+B3D2;HANGUL SYLLABLE DOLP;Lo;0;L;;;;;N;;;;;
+B3D3;HANGUL SYLLABLE DOLH;Lo;0;L;;;;;N;;;;;
+B3D4;HANGUL SYLLABLE DOM;Lo;0;L;;;;;N;;;;;
+B3D5;HANGUL SYLLABLE DOB;Lo;0;L;;;;;N;;;;;
+B3D6;HANGUL SYLLABLE DOBS;Lo;0;L;;;;;N;;;;;
+B3D7;HANGUL SYLLABLE DOS;Lo;0;L;;;;;N;;;;;
+B3D8;HANGUL SYLLABLE DOSS;Lo;0;L;;;;;N;;;;;
+B3D9;HANGUL SYLLABLE DONG;Lo;0;L;;;;;N;;;;;
+B3DA;HANGUL SYLLABLE DOJ;Lo;0;L;;;;;N;;;;;
+B3DB;HANGUL SYLLABLE DOC;Lo;0;L;;;;;N;;;;;
+B3DC;HANGUL SYLLABLE DOK;Lo;0;L;;;;;N;;;;;
+B3DD;HANGUL SYLLABLE DOT;Lo;0;L;;;;;N;;;;;
+B3DE;HANGUL SYLLABLE DOP;Lo;0;L;;;;;N;;;;;
+B3DF;HANGUL SYLLABLE DOH;Lo;0;L;;;;;N;;;;;
+B3E0;HANGUL SYLLABLE DWA;Lo;0;L;;;;;N;;;;;
+B3E1;HANGUL SYLLABLE DWAG;Lo;0;L;;;;;N;;;;;
+B3E2;HANGUL SYLLABLE DWAGG;Lo;0;L;;;;;N;;;;;
+B3E3;HANGUL SYLLABLE DWAGS;Lo;0;L;;;;;N;;;;;
+B3E4;HANGUL SYLLABLE DWAN;Lo;0;L;;;;;N;;;;;
+B3E5;HANGUL SYLLABLE DWANI;Lo;0;L;;;;;N;;;;;
+B3E6;HANGUL SYLLABLE DWANH;Lo;0;L;;;;;N;;;;;
+B3E7;HANGUL SYLLABLE DWAD;Lo;0;L;;;;;N;;;;;
+B3E8;HANGUL SYLLABLE DWAL;Lo;0;L;;;;;N;;;;;
+B3E9;HANGUL SYLLABLE DWALG;Lo;0;L;;;;;N;;;;;
+B3EA;HANGUL SYLLABLE DWALM;Lo;0;L;;;;;N;;;;;
+B3EB;HANGUL SYLLABLE DWALB;Lo;0;L;;;;;N;;;;;
+B3EC;HANGUL SYLLABLE DWALS;Lo;0;L;;;;;N;;;;;
+B3ED;HANGUL SYLLABLE DWALT;Lo;0;L;;;;;N;;;;;
+B3EE;HANGUL SYLLABLE DWALP;Lo;0;L;;;;;N;;;;;
+B3EF;HANGUL SYLLABLE DWALH;Lo;0;L;;;;;N;;;;;
+B3F0;HANGUL SYLLABLE DWAM;Lo;0;L;;;;;N;;;;;
+B3F1;HANGUL SYLLABLE DWAB;Lo;0;L;;;;;N;;;;;
+B3F2;HANGUL SYLLABLE DWABS;Lo;0;L;;;;;N;;;;;
+B3F3;HANGUL SYLLABLE DWAS;Lo;0;L;;;;;N;;;;;
+B3F4;HANGUL SYLLABLE DWASS;Lo;0;L;;;;;N;;;;;
+B3F5;HANGUL SYLLABLE DWANG;Lo;0;L;;;;;N;;;;;
+B3F6;HANGUL SYLLABLE DWAJ;Lo;0;L;;;;;N;;;;;
+B3F7;HANGUL SYLLABLE DWAC;Lo;0;L;;;;;N;;;;;
+B3F8;HANGUL SYLLABLE DWAK;Lo;0;L;;;;;N;;;;;
+B3F9;HANGUL SYLLABLE DWAT;Lo;0;L;;;;;N;;;;;
+B3FA;HANGUL SYLLABLE DWAP;Lo;0;L;;;;;N;;;;;
+B3FB;HANGUL SYLLABLE DWAH;Lo;0;L;;;;;N;;;;;
+B3FC;HANGUL SYLLABLE DWAE;Lo;0;L;;;;;N;;;;;
+B3FD;HANGUL SYLLABLE DWAEG;Lo;0;L;;;;;N;;;;;
+B3FE;HANGUL SYLLABLE DWAEGG;Lo;0;L;;;;;N;;;;;
+B3FF;HANGUL SYLLABLE DWAEGS;Lo;0;L;;;;;N;;;;;
+B400;HANGUL SYLLABLE DWAEN;Lo;0;L;;;;;N;;;;;
+B401;HANGUL SYLLABLE DWAENI;Lo;0;L;;;;;N;;;;;
+B402;HANGUL SYLLABLE DWAENH;Lo;0;L;;;;;N;;;;;
+B403;HANGUL SYLLABLE DWAED;Lo;0;L;;;;;N;;;;;
+B404;HANGUL SYLLABLE DWAEL;Lo;0;L;;;;;N;;;;;
+B405;HANGUL SYLLABLE DWAELG;Lo;0;L;;;;;N;;;;;
+B406;HANGUL SYLLABLE DWAELM;Lo;0;L;;;;;N;;;;;
+B407;HANGUL SYLLABLE DWAELB;Lo;0;L;;;;;N;;;;;
+B408;HANGUL SYLLABLE DWAELS;Lo;0;L;;;;;N;;;;;
+B409;HANGUL SYLLABLE DWAELT;Lo;0;L;;;;;N;;;;;
+B40A;HANGUL SYLLABLE DWAELP;Lo;0;L;;;;;N;;;;;
+B40B;HANGUL SYLLABLE DWAELH;Lo;0;L;;;;;N;;;;;
+B40C;HANGUL SYLLABLE DWAEM;Lo;0;L;;;;;N;;;;;
+B40D;HANGUL SYLLABLE DWAEB;Lo;0;L;;;;;N;;;;;
+B40E;HANGUL SYLLABLE DWAEBS;Lo;0;L;;;;;N;;;;;
+B40F;HANGUL SYLLABLE DWAES;Lo;0;L;;;;;N;;;;;
+B410;HANGUL SYLLABLE DWAESS;Lo;0;L;;;;;N;;;;;
+B411;HANGUL SYLLABLE DWAENG;Lo;0;L;;;;;N;;;;;
+B412;HANGUL SYLLABLE DWAEJ;Lo;0;L;;;;;N;;;;;
+B413;HANGUL SYLLABLE DWAEC;Lo;0;L;;;;;N;;;;;
+B414;HANGUL SYLLABLE DWAEK;Lo;0;L;;;;;N;;;;;
+B415;HANGUL SYLLABLE DWAET;Lo;0;L;;;;;N;;;;;
+B416;HANGUL SYLLABLE DWAEP;Lo;0;L;;;;;N;;;;;
+B417;HANGUL SYLLABLE DWAEH;Lo;0;L;;;;;N;;;;;
+B418;HANGUL SYLLABLE DOE;Lo;0;L;;;;;N;;;;;
+B419;HANGUL SYLLABLE DOEG;Lo;0;L;;;;;N;;;;;
+B41A;HANGUL SYLLABLE DOEGG;Lo;0;L;;;;;N;;;;;
+B41B;HANGUL SYLLABLE DOEGS;Lo;0;L;;;;;N;;;;;
+B41C;HANGUL SYLLABLE DOEN;Lo;0;L;;;;;N;;;;;
+B41D;HANGUL SYLLABLE DOENI;Lo;0;L;;;;;N;;;;;
+B41E;HANGUL SYLLABLE DOENH;Lo;0;L;;;;;N;;;;;
+B41F;HANGUL SYLLABLE DOED;Lo;0;L;;;;;N;;;;;
+B420;HANGUL SYLLABLE DOEL;Lo;0;L;;;;;N;;;;;
+B421;HANGUL SYLLABLE DOELG;Lo;0;L;;;;;N;;;;;
+B422;HANGUL SYLLABLE DOELM;Lo;0;L;;;;;N;;;;;
+B423;HANGUL SYLLABLE DOELB;Lo;0;L;;;;;N;;;;;
+B424;HANGUL SYLLABLE DOELS;Lo;0;L;;;;;N;;;;;
+B425;HANGUL SYLLABLE DOELT;Lo;0;L;;;;;N;;;;;
+B426;HANGUL SYLLABLE DOELP;Lo;0;L;;;;;N;;;;;
+B427;HANGUL SYLLABLE DOELH;Lo;0;L;;;;;N;;;;;
+B428;HANGUL SYLLABLE DOEM;Lo;0;L;;;;;N;;;;;
+B429;HANGUL SYLLABLE DOEB;Lo;0;L;;;;;N;;;;;
+B42A;HANGUL SYLLABLE DOEBS;Lo;0;L;;;;;N;;;;;
+B42B;HANGUL SYLLABLE DOES;Lo;0;L;;;;;N;;;;;
+B42C;HANGUL SYLLABLE DOESS;Lo;0;L;;;;;N;;;;;
+B42D;HANGUL SYLLABLE DOENG;Lo;0;L;;;;;N;;;;;
+B42E;HANGUL SYLLABLE DOEJ;Lo;0;L;;;;;N;;;;;
+B42F;HANGUL SYLLABLE DOEC;Lo;0;L;;;;;N;;;;;
+B430;HANGUL SYLLABLE DOEK;Lo;0;L;;;;;N;;;;;
+B431;HANGUL SYLLABLE DOET;Lo;0;L;;;;;N;;;;;
+B432;HANGUL SYLLABLE DOEP;Lo;0;L;;;;;N;;;;;
+B433;HANGUL SYLLABLE DOEH;Lo;0;L;;;;;N;;;;;
+B434;HANGUL SYLLABLE DYO;Lo;0;L;;;;;N;;;;;
+B435;HANGUL SYLLABLE DYOG;Lo;0;L;;;;;N;;;;;
+B436;HANGUL SYLLABLE DYOGG;Lo;0;L;;;;;N;;;;;
+B437;HANGUL SYLLABLE DYOGS;Lo;0;L;;;;;N;;;;;
+B438;HANGUL SYLLABLE DYON;Lo;0;L;;;;;N;;;;;
+B439;HANGUL SYLLABLE DYONI;Lo;0;L;;;;;N;;;;;
+B43A;HANGUL SYLLABLE DYONH;Lo;0;L;;;;;N;;;;;
+B43B;HANGUL SYLLABLE DYOD;Lo;0;L;;;;;N;;;;;
+B43C;HANGUL SYLLABLE DYOL;Lo;0;L;;;;;N;;;;;
+B43D;HANGUL SYLLABLE DYOLG;Lo;0;L;;;;;N;;;;;
+B43E;HANGUL SYLLABLE DYOLM;Lo;0;L;;;;;N;;;;;
+B43F;HANGUL SYLLABLE DYOLB;Lo;0;L;;;;;N;;;;;
+B440;HANGUL SYLLABLE DYOLS;Lo;0;L;;;;;N;;;;;
+B441;HANGUL SYLLABLE DYOLT;Lo;0;L;;;;;N;;;;;
+B442;HANGUL SYLLABLE DYOLP;Lo;0;L;;;;;N;;;;;
+B443;HANGUL SYLLABLE DYOLH;Lo;0;L;;;;;N;;;;;
+B444;HANGUL SYLLABLE DYOM;Lo;0;L;;;;;N;;;;;
+B445;HANGUL SYLLABLE DYOB;Lo;0;L;;;;;N;;;;;
+B446;HANGUL SYLLABLE DYOBS;Lo;0;L;;;;;N;;;;;
+B447;HANGUL SYLLABLE DYOS;Lo;0;L;;;;;N;;;;;
+B448;HANGUL SYLLABLE DYOSS;Lo;0;L;;;;;N;;;;;
+B449;HANGUL SYLLABLE DYONG;Lo;0;L;;;;;N;;;;;
+B44A;HANGUL SYLLABLE DYOJ;Lo;0;L;;;;;N;;;;;
+B44B;HANGUL SYLLABLE DYOC;Lo;0;L;;;;;N;;;;;
+B44C;HANGUL SYLLABLE DYOK;Lo;0;L;;;;;N;;;;;
+B44D;HANGUL SYLLABLE DYOT;Lo;0;L;;;;;N;;;;;
+B44E;HANGUL SYLLABLE DYOP;Lo;0;L;;;;;N;;;;;
+B44F;HANGUL SYLLABLE DYOH;Lo;0;L;;;;;N;;;;;
+B450;HANGUL SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+B451;HANGUL SYLLABLE DUG;Lo;0;L;;;;;N;;;;;
+B452;HANGUL SYLLABLE DUGG;Lo;0;L;;;;;N;;;;;
+B453;HANGUL SYLLABLE DUGS;Lo;0;L;;;;;N;;;;;
+B454;HANGUL SYLLABLE DUN;Lo;0;L;;;;;N;;;;;
+B455;HANGUL SYLLABLE DUNI;Lo;0;L;;;;;N;;;;;
+B456;HANGUL SYLLABLE DUNH;Lo;0;L;;;;;N;;;;;
+B457;HANGUL SYLLABLE DUD;Lo;0;L;;;;;N;;;;;
+B458;HANGUL SYLLABLE DUL;Lo;0;L;;;;;N;;;;;
+B459;HANGUL SYLLABLE DULG;Lo;0;L;;;;;N;;;;;
+B45A;HANGUL SYLLABLE DULM;Lo;0;L;;;;;N;;;;;
+B45B;HANGUL SYLLABLE DULB;Lo;0;L;;;;;N;;;;;
+B45C;HANGUL SYLLABLE DULS;Lo;0;L;;;;;N;;;;;
+B45D;HANGUL SYLLABLE DULT;Lo;0;L;;;;;N;;;;;
+B45E;HANGUL SYLLABLE DULP;Lo;0;L;;;;;N;;;;;
+B45F;HANGUL SYLLABLE DULH;Lo;0;L;;;;;N;;;;;
+B460;HANGUL SYLLABLE DUM;Lo;0;L;;;;;N;;;;;
+B461;HANGUL SYLLABLE DUB;Lo;0;L;;;;;N;;;;;
+B462;HANGUL SYLLABLE DUBS;Lo;0;L;;;;;N;;;;;
+B463;HANGUL SYLLABLE DUS;Lo;0;L;;;;;N;;;;;
+B464;HANGUL SYLLABLE DUSS;Lo;0;L;;;;;N;;;;;
+B465;HANGUL SYLLABLE DUNG;Lo;0;L;;;;;N;;;;;
+B466;HANGUL SYLLABLE DUJ;Lo;0;L;;;;;N;;;;;
+B467;HANGUL SYLLABLE DUC;Lo;0;L;;;;;N;;;;;
+B468;HANGUL SYLLABLE DUK;Lo;0;L;;;;;N;;;;;
+B469;HANGUL SYLLABLE DUT;Lo;0;L;;;;;N;;;;;
+B46A;HANGUL SYLLABLE DUP;Lo;0;L;;;;;N;;;;;
+B46B;HANGUL SYLLABLE DUH;Lo;0;L;;;;;N;;;;;
+B46C;HANGUL SYLLABLE DWEO;Lo;0;L;;;;;N;;;;;
+B46D;HANGUL SYLLABLE DWEOG;Lo;0;L;;;;;N;;;;;
+B46E;HANGUL SYLLABLE DWEOGG;Lo;0;L;;;;;N;;;;;
+B46F;HANGUL SYLLABLE DWEOGS;Lo;0;L;;;;;N;;;;;
+B470;HANGUL SYLLABLE DWEON;Lo;0;L;;;;;N;;;;;
+B471;HANGUL SYLLABLE DWEONI;Lo;0;L;;;;;N;;;;;
+B472;HANGUL SYLLABLE DWEONH;Lo;0;L;;;;;N;;;;;
+B473;HANGUL SYLLABLE DWEOD;Lo;0;L;;;;;N;;;;;
+B474;HANGUL SYLLABLE DWEOL;Lo;0;L;;;;;N;;;;;
+B475;HANGUL SYLLABLE DWEOLG;Lo;0;L;;;;;N;;;;;
+B476;HANGUL SYLLABLE DWEOLM;Lo;0;L;;;;;N;;;;;
+B477;HANGUL SYLLABLE DWEOLB;Lo;0;L;;;;;N;;;;;
+B478;HANGUL SYLLABLE DWEOLS;Lo;0;L;;;;;N;;;;;
+B479;HANGUL SYLLABLE DWEOLT;Lo;0;L;;;;;N;;;;;
+B47A;HANGUL SYLLABLE DWEOLP;Lo;0;L;;;;;N;;;;;
+B47B;HANGUL SYLLABLE DWEOLH;Lo;0;L;;;;;N;;;;;
+B47C;HANGUL SYLLABLE DWEOM;Lo;0;L;;;;;N;;;;;
+B47D;HANGUL SYLLABLE DWEOB;Lo;0;L;;;;;N;;;;;
+B47E;HANGUL SYLLABLE DWEOBS;Lo;0;L;;;;;N;;;;;
+B47F;HANGUL SYLLABLE DWEOS;Lo;0;L;;;;;N;;;;;
+B480;HANGUL SYLLABLE DWEOSS;Lo;0;L;;;;;N;;;;;
+B481;HANGUL SYLLABLE DWEONG;Lo;0;L;;;;;N;;;;;
+B482;HANGUL SYLLABLE DWEOJ;Lo;0;L;;;;;N;;;;;
+B483;HANGUL SYLLABLE DWEOC;Lo;0;L;;;;;N;;;;;
+B484;HANGUL SYLLABLE DWEOK;Lo;0;L;;;;;N;;;;;
+B485;HANGUL SYLLABLE DWEOT;Lo;0;L;;;;;N;;;;;
+B486;HANGUL SYLLABLE DWEOP;Lo;0;L;;;;;N;;;;;
+B487;HANGUL SYLLABLE DWEOH;Lo;0;L;;;;;N;;;;;
+B488;HANGUL SYLLABLE DWE;Lo;0;L;;;;;N;;;;;
+B489;HANGUL SYLLABLE DWEG;Lo;0;L;;;;;N;;;;;
+B48A;HANGUL SYLLABLE DWEGG;Lo;0;L;;;;;N;;;;;
+B48B;HANGUL SYLLABLE DWEGS;Lo;0;L;;;;;N;;;;;
+B48C;HANGUL SYLLABLE DWEN;Lo;0;L;;;;;N;;;;;
+B48D;HANGUL SYLLABLE DWENI;Lo;0;L;;;;;N;;;;;
+B48E;HANGUL SYLLABLE DWENH;Lo;0;L;;;;;N;;;;;
+B48F;HANGUL SYLLABLE DWED;Lo;0;L;;;;;N;;;;;
+B490;HANGUL SYLLABLE DWEL;Lo;0;L;;;;;N;;;;;
+B491;HANGUL SYLLABLE DWELG;Lo;0;L;;;;;N;;;;;
+B492;HANGUL SYLLABLE DWELM;Lo;0;L;;;;;N;;;;;
+B493;HANGUL SYLLABLE DWELB;Lo;0;L;;;;;N;;;;;
+B494;HANGUL SYLLABLE DWELS;Lo;0;L;;;;;N;;;;;
+B495;HANGUL SYLLABLE DWELT;Lo;0;L;;;;;N;;;;;
+B496;HANGUL SYLLABLE DWELP;Lo;0;L;;;;;N;;;;;
+B497;HANGUL SYLLABLE DWELH;Lo;0;L;;;;;N;;;;;
+B498;HANGUL SYLLABLE DWEM;Lo;0;L;;;;;N;;;;;
+B499;HANGUL SYLLABLE DWEB;Lo;0;L;;;;;N;;;;;
+B49A;HANGUL SYLLABLE DWEBS;Lo;0;L;;;;;N;;;;;
+B49B;HANGUL SYLLABLE DWES;Lo;0;L;;;;;N;;;;;
+B49C;HANGUL SYLLABLE DWESS;Lo;0;L;;;;;N;;;;;
+B49D;HANGUL SYLLABLE DWENG;Lo;0;L;;;;;N;;;;;
+B49E;HANGUL SYLLABLE DWEJ;Lo;0;L;;;;;N;;;;;
+B49F;HANGUL SYLLABLE DWEC;Lo;0;L;;;;;N;;;;;
+B4A0;HANGUL SYLLABLE DWEK;Lo;0;L;;;;;N;;;;;
+B4A1;HANGUL SYLLABLE DWET;Lo;0;L;;;;;N;;;;;
+B4A2;HANGUL SYLLABLE DWEP;Lo;0;L;;;;;N;;;;;
+B4A3;HANGUL SYLLABLE DWEH;Lo;0;L;;;;;N;;;;;
+B4A4;HANGUL SYLLABLE DWI;Lo;0;L;;;;;N;;;;;
+B4A5;HANGUL SYLLABLE DWIG;Lo;0;L;;;;;N;;;;;
+B4A6;HANGUL SYLLABLE DWIGG;Lo;0;L;;;;;N;;;;;
+B4A7;HANGUL SYLLABLE DWIGS;Lo;0;L;;;;;N;;;;;
+B4A8;HANGUL SYLLABLE DWIN;Lo;0;L;;;;;N;;;;;
+B4A9;HANGUL SYLLABLE DWINI;Lo;0;L;;;;;N;;;;;
+B4AA;HANGUL SYLLABLE DWINH;Lo;0;L;;;;;N;;;;;
+B4AB;HANGUL SYLLABLE DWID;Lo;0;L;;;;;N;;;;;
+B4AC;HANGUL SYLLABLE DWIL;Lo;0;L;;;;;N;;;;;
+B4AD;HANGUL SYLLABLE DWILG;Lo;0;L;;;;;N;;;;;
+B4AE;HANGUL SYLLABLE DWILM;Lo;0;L;;;;;N;;;;;
+B4AF;HANGUL SYLLABLE DWILB;Lo;0;L;;;;;N;;;;;
+B4B0;HANGUL SYLLABLE DWILS;Lo;0;L;;;;;N;;;;;
+B4B1;HANGUL SYLLABLE DWILT;Lo;0;L;;;;;N;;;;;
+B4B2;HANGUL SYLLABLE DWILP;Lo;0;L;;;;;N;;;;;
+B4B3;HANGUL SYLLABLE DWILH;Lo;0;L;;;;;N;;;;;
+B4B4;HANGUL SYLLABLE DWIM;Lo;0;L;;;;;N;;;;;
+B4B5;HANGUL SYLLABLE DWIB;Lo;0;L;;;;;N;;;;;
+B4B6;HANGUL SYLLABLE DWIBS;Lo;0;L;;;;;N;;;;;
+B4B7;HANGUL SYLLABLE DWIS;Lo;0;L;;;;;N;;;;;
+B4B8;HANGUL SYLLABLE DWISS;Lo;0;L;;;;;N;;;;;
+B4B9;HANGUL SYLLABLE DWING;Lo;0;L;;;;;N;;;;;
+B4BA;HANGUL SYLLABLE DWIJ;Lo;0;L;;;;;N;;;;;
+B4BB;HANGUL SYLLABLE DWIC;Lo;0;L;;;;;N;;;;;
+B4BC;HANGUL SYLLABLE DWIK;Lo;0;L;;;;;N;;;;;
+B4BD;HANGUL SYLLABLE DWIT;Lo;0;L;;;;;N;;;;;
+B4BE;HANGUL SYLLABLE DWIP;Lo;0;L;;;;;N;;;;;
+B4BF;HANGUL SYLLABLE DWIH;Lo;0;L;;;;;N;;;;;
+B4C0;HANGUL SYLLABLE DYU;Lo;0;L;;;;;N;;;;;
+B4C1;HANGUL SYLLABLE DYUG;Lo;0;L;;;;;N;;;;;
+B4C2;HANGUL SYLLABLE DYUGG;Lo;0;L;;;;;N;;;;;
+B4C3;HANGUL SYLLABLE DYUGS;Lo;0;L;;;;;N;;;;;
+B4C4;HANGUL SYLLABLE DYUN;Lo;0;L;;;;;N;;;;;
+B4C5;HANGUL SYLLABLE DYUNI;Lo;0;L;;;;;N;;;;;
+B4C6;HANGUL SYLLABLE DYUNH;Lo;0;L;;;;;N;;;;;
+B4C7;HANGUL SYLLABLE DYUD;Lo;0;L;;;;;N;;;;;
+B4C8;HANGUL SYLLABLE DYUL;Lo;0;L;;;;;N;;;;;
+B4C9;HANGUL SYLLABLE DYULG;Lo;0;L;;;;;N;;;;;
+B4CA;HANGUL SYLLABLE DYULM;Lo;0;L;;;;;N;;;;;
+B4CB;HANGUL SYLLABLE DYULB;Lo;0;L;;;;;N;;;;;
+B4CC;HANGUL SYLLABLE DYULS;Lo;0;L;;;;;N;;;;;
+B4CD;HANGUL SYLLABLE DYULT;Lo;0;L;;;;;N;;;;;
+B4CE;HANGUL SYLLABLE DYULP;Lo;0;L;;;;;N;;;;;
+B4CF;HANGUL SYLLABLE DYULH;Lo;0;L;;;;;N;;;;;
+B4D0;HANGUL SYLLABLE DYUM;Lo;0;L;;;;;N;;;;;
+B4D1;HANGUL SYLLABLE DYUB;Lo;0;L;;;;;N;;;;;
+B4D2;HANGUL SYLLABLE DYUBS;Lo;0;L;;;;;N;;;;;
+B4D3;HANGUL SYLLABLE DYUS;Lo;0;L;;;;;N;;;;;
+B4D4;HANGUL SYLLABLE DYUSS;Lo;0;L;;;;;N;;;;;
+B4D5;HANGUL SYLLABLE DYUNG;Lo;0;L;;;;;N;;;;;
+B4D6;HANGUL SYLLABLE DYUJ;Lo;0;L;;;;;N;;;;;
+B4D7;HANGUL SYLLABLE DYUC;Lo;0;L;;;;;N;;;;;
+B4D8;HANGUL SYLLABLE DYUK;Lo;0;L;;;;;N;;;;;
+B4D9;HANGUL SYLLABLE DYUT;Lo;0;L;;;;;N;;;;;
+B4DA;HANGUL SYLLABLE DYUP;Lo;0;L;;;;;N;;;;;
+B4DB;HANGUL SYLLABLE DYUH;Lo;0;L;;;;;N;;;;;
+B4DC;HANGUL SYLLABLE DEU;Lo;0;L;;;;;N;;;;;
+B4DD;HANGUL SYLLABLE DEUG;Lo;0;L;;;;;N;;;;;
+B4DE;HANGUL SYLLABLE DEUGG;Lo;0;L;;;;;N;;;;;
+B4DF;HANGUL SYLLABLE DEUGS;Lo;0;L;;;;;N;;;;;
+B4E0;HANGUL SYLLABLE DEUN;Lo;0;L;;;;;N;;;;;
+B4E1;HANGUL SYLLABLE DEUNI;Lo;0;L;;;;;N;;;;;
+B4E2;HANGUL SYLLABLE DEUNH;Lo;0;L;;;;;N;;;;;
+B4E3;HANGUL SYLLABLE DEUD;Lo;0;L;;;;;N;;;;;
+B4E4;HANGUL SYLLABLE DEUL;Lo;0;L;;;;;N;;;;;
+B4E5;HANGUL SYLLABLE DEULG;Lo;0;L;;;;;N;;;;;
+B4E6;HANGUL SYLLABLE DEULM;Lo;0;L;;;;;N;;;;;
+B4E7;HANGUL SYLLABLE DEULB;Lo;0;L;;;;;N;;;;;
+B4E8;HANGUL SYLLABLE DEULS;Lo;0;L;;;;;N;;;;;
+B4E9;HANGUL SYLLABLE DEULT;Lo;0;L;;;;;N;;;;;
+B4EA;HANGUL SYLLABLE DEULP;Lo;0;L;;;;;N;;;;;
+B4EB;HANGUL SYLLABLE DEULH;Lo;0;L;;;;;N;;;;;
+B4EC;HANGUL SYLLABLE DEUM;Lo;0;L;;;;;N;;;;;
+B4ED;HANGUL SYLLABLE DEUB;Lo;0;L;;;;;N;;;;;
+B4EE;HANGUL SYLLABLE DEUBS;Lo;0;L;;;;;N;;;;;
+B4EF;HANGUL SYLLABLE DEUS;Lo;0;L;;;;;N;;;;;
+B4F0;HANGUL SYLLABLE DEUSS;Lo;0;L;;;;;N;;;;;
+B4F1;HANGUL SYLLABLE DEUNG;Lo;0;L;;;;;N;;;;;
+B4F2;HANGUL SYLLABLE DEUJ;Lo;0;L;;;;;N;;;;;
+B4F3;HANGUL SYLLABLE DEUC;Lo;0;L;;;;;N;;;;;
+B4F4;HANGUL SYLLABLE DEUK;Lo;0;L;;;;;N;;;;;
+B4F5;HANGUL SYLLABLE DEUT;Lo;0;L;;;;;N;;;;;
+B4F6;HANGUL SYLLABLE DEUP;Lo;0;L;;;;;N;;;;;
+B4F7;HANGUL SYLLABLE DEUH;Lo;0;L;;;;;N;;;;;
+B4F8;HANGUL SYLLABLE DYI;Lo;0;L;;;;;N;;;;;
+B4F9;HANGUL SYLLABLE DYIG;Lo;0;L;;;;;N;;;;;
+B4FA;HANGUL SYLLABLE DYIGG;Lo;0;L;;;;;N;;;;;
+B4FB;HANGUL SYLLABLE DYIGS;Lo;0;L;;;;;N;;;;;
+B4FC;HANGUL SYLLABLE DYIN;Lo;0;L;;;;;N;;;;;
+B4FD;HANGUL SYLLABLE DYINI;Lo;0;L;;;;;N;;;;;
+B4FE;HANGUL SYLLABLE DYINH;Lo;0;L;;;;;N;;;;;
+B4FF;HANGUL SYLLABLE DYID;Lo;0;L;;;;;N;;;;;
+B500;HANGUL SYLLABLE DYIL;Lo;0;L;;;;;N;;;;;
+B501;HANGUL SYLLABLE DYILG;Lo;0;L;;;;;N;;;;;
+B502;HANGUL SYLLABLE DYILM;Lo;0;L;;;;;N;;;;;
+B503;HANGUL SYLLABLE DYILB;Lo;0;L;;;;;N;;;;;
+B504;HANGUL SYLLABLE DYILS;Lo;0;L;;;;;N;;;;;
+B505;HANGUL SYLLABLE DYILT;Lo;0;L;;;;;N;;;;;
+B506;HANGUL SYLLABLE DYILP;Lo;0;L;;;;;N;;;;;
+B507;HANGUL SYLLABLE DYILH;Lo;0;L;;;;;N;;;;;
+B508;HANGUL SYLLABLE DYIM;Lo;0;L;;;;;N;;;;;
+B509;HANGUL SYLLABLE DYIB;Lo;0;L;;;;;N;;;;;
+B50A;HANGUL SYLLABLE DYIBS;Lo;0;L;;;;;N;;;;;
+B50B;HANGUL SYLLABLE DYIS;Lo;0;L;;;;;N;;;;;
+B50C;HANGUL SYLLABLE DYISS;Lo;0;L;;;;;N;;;;;
+B50D;HANGUL SYLLABLE DYING;Lo;0;L;;;;;N;;;;;
+B50E;HANGUL SYLLABLE DYIJ;Lo;0;L;;;;;N;;;;;
+B50F;HANGUL SYLLABLE DYIC;Lo;0;L;;;;;N;;;;;
+B510;HANGUL SYLLABLE DYIK;Lo;0;L;;;;;N;;;;;
+B511;HANGUL SYLLABLE DYIT;Lo;0;L;;;;;N;;;;;
+B512;HANGUL SYLLABLE DYIP;Lo;0;L;;;;;N;;;;;
+B513;HANGUL SYLLABLE DYIH;Lo;0;L;;;;;N;;;;;
+B514;HANGUL SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+B515;HANGUL SYLLABLE DIG;Lo;0;L;;;;;N;;;;;
+B516;HANGUL SYLLABLE DIGG;Lo;0;L;;;;;N;;;;;
+B517;HANGUL SYLLABLE DIGS;Lo;0;L;;;;;N;;;;;
+B518;HANGUL SYLLABLE DIN;Lo;0;L;;;;;N;;;;;
+B519;HANGUL SYLLABLE DINI;Lo;0;L;;;;;N;;;;;
+B51A;HANGUL SYLLABLE DINH;Lo;0;L;;;;;N;;;;;
+B51B;HANGUL SYLLABLE DID;Lo;0;L;;;;;N;;;;;
+B51C;HANGUL SYLLABLE DIL;Lo;0;L;;;;;N;;;;;
+B51D;HANGUL SYLLABLE DILG;Lo;0;L;;;;;N;;;;;
+B51E;HANGUL SYLLABLE DILM;Lo;0;L;;;;;N;;;;;
+B51F;HANGUL SYLLABLE DILB;Lo;0;L;;;;;N;;;;;
+B520;HANGUL SYLLABLE DILS;Lo;0;L;;;;;N;;;;;
+B521;HANGUL SYLLABLE DILT;Lo;0;L;;;;;N;;;;;
+B522;HANGUL SYLLABLE DILP;Lo;0;L;;;;;N;;;;;
+B523;HANGUL SYLLABLE DILH;Lo;0;L;;;;;N;;;;;
+B524;HANGUL SYLLABLE DIM;Lo;0;L;;;;;N;;;;;
+B525;HANGUL SYLLABLE DIB;Lo;0;L;;;;;N;;;;;
+B526;HANGUL SYLLABLE DIBS;Lo;0;L;;;;;N;;;;;
+B527;HANGUL SYLLABLE DIS;Lo;0;L;;;;;N;;;;;
+B528;HANGUL SYLLABLE DISS;Lo;0;L;;;;;N;;;;;
+B529;HANGUL SYLLABLE DING;Lo;0;L;;;;;N;;;;;
+B52A;HANGUL SYLLABLE DIJ;Lo;0;L;;;;;N;;;;;
+B52B;HANGUL SYLLABLE DIC;Lo;0;L;;;;;N;;;;;
+B52C;HANGUL SYLLABLE DIK;Lo;0;L;;;;;N;;;;;
+B52D;HANGUL SYLLABLE DIT;Lo;0;L;;;;;N;;;;;
+B52E;HANGUL SYLLABLE DIP;Lo;0;L;;;;;N;;;;;
+B52F;HANGUL SYLLABLE DIH;Lo;0;L;;;;;N;;;;;
+B530;HANGUL SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+B531;HANGUL SYLLABLE DDAG;Lo;0;L;;;;;N;;;;;
+B532;HANGUL SYLLABLE DDAGG;Lo;0;L;;;;;N;;;;;
+B533;HANGUL SYLLABLE DDAGS;Lo;0;L;;;;;N;;;;;
+B534;HANGUL SYLLABLE DDAN;Lo;0;L;;;;;N;;;;;
+B535;HANGUL SYLLABLE DDANI;Lo;0;L;;;;;N;;;;;
+B536;HANGUL SYLLABLE DDANH;Lo;0;L;;;;;N;;;;;
+B537;HANGUL SYLLABLE DDAD;Lo;0;L;;;;;N;;;;;
+B538;HANGUL SYLLABLE DDAL;Lo;0;L;;;;;N;;;;;
+B539;HANGUL SYLLABLE DDALG;Lo;0;L;;;;;N;;;;;
+B53A;HANGUL SYLLABLE DDALM;Lo;0;L;;;;;N;;;;;
+B53B;HANGUL SYLLABLE DDALB;Lo;0;L;;;;;N;;;;;
+B53C;HANGUL SYLLABLE DDALS;Lo;0;L;;;;;N;;;;;
+B53D;HANGUL SYLLABLE DDALT;Lo;0;L;;;;;N;;;;;
+B53E;HANGUL SYLLABLE DDALP;Lo;0;L;;;;;N;;;;;
+B53F;HANGUL SYLLABLE DDALH;Lo;0;L;;;;;N;;;;;
+B540;HANGUL SYLLABLE DDAM;Lo;0;L;;;;;N;;;;;
+B541;HANGUL SYLLABLE DDAB;Lo;0;L;;;;;N;;;;;
+B542;HANGUL SYLLABLE DDABS;Lo;0;L;;;;;N;;;;;
+B543;HANGUL SYLLABLE DDAS;Lo;0;L;;;;;N;;;;;
+B544;HANGUL SYLLABLE DDASS;Lo;0;L;;;;;N;;;;;
+B545;HANGUL SYLLABLE DDANG;Lo;0;L;;;;;N;;;;;
+B546;HANGUL SYLLABLE DDAJ;Lo;0;L;;;;;N;;;;;
+B547;HANGUL SYLLABLE DDAC;Lo;0;L;;;;;N;;;;;
+B548;HANGUL SYLLABLE DDAK;Lo;0;L;;;;;N;;;;;
+B549;HANGUL SYLLABLE DDAT;Lo;0;L;;;;;N;;;;;
+B54A;HANGUL SYLLABLE DDAP;Lo;0;L;;;;;N;;;;;
+B54B;HANGUL SYLLABLE DDAH;Lo;0;L;;;;;N;;;;;
+B54C;HANGUL SYLLABLE DDAE;Lo;0;L;;;;;N;;;;;
+B54D;HANGUL SYLLABLE DDAEG;Lo;0;L;;;;;N;;;;;
+B54E;HANGUL SYLLABLE DDAEGG;Lo;0;L;;;;;N;;;;;
+B54F;HANGUL SYLLABLE DDAEGS;Lo;0;L;;;;;N;;;;;
+B550;HANGUL SYLLABLE DDAEN;Lo;0;L;;;;;N;;;;;
+B551;HANGUL SYLLABLE DDAENI;Lo;0;L;;;;;N;;;;;
+B552;HANGUL SYLLABLE DDAENH;Lo;0;L;;;;;N;;;;;
+B553;HANGUL SYLLABLE DDAED;Lo;0;L;;;;;N;;;;;
+B554;HANGUL SYLLABLE DDAEL;Lo;0;L;;;;;N;;;;;
+B555;HANGUL SYLLABLE DDAELG;Lo;0;L;;;;;N;;;;;
+B556;HANGUL SYLLABLE DDAELM;Lo;0;L;;;;;N;;;;;
+B557;HANGUL SYLLABLE DDAELB;Lo;0;L;;;;;N;;;;;
+B558;HANGUL SYLLABLE DDAELS;Lo;0;L;;;;;N;;;;;
+B559;HANGUL SYLLABLE DDAELT;Lo;0;L;;;;;N;;;;;
+B55A;HANGUL SYLLABLE DDAELP;Lo;0;L;;;;;N;;;;;
+B55B;HANGUL SYLLABLE DDAELH;Lo;0;L;;;;;N;;;;;
+B55C;HANGUL SYLLABLE DDAEM;Lo;0;L;;;;;N;;;;;
+B55D;HANGUL SYLLABLE DDAEB;Lo;0;L;;;;;N;;;;;
+B55E;HANGUL SYLLABLE DDAEBS;Lo;0;L;;;;;N;;;;;
+B55F;HANGUL SYLLABLE DDAES;Lo;0;L;;;;;N;;;;;
+B560;HANGUL SYLLABLE DDAESS;Lo;0;L;;;;;N;;;;;
+B561;HANGUL SYLLABLE DDAENG;Lo;0;L;;;;;N;;;;;
+B562;HANGUL SYLLABLE DDAEJ;Lo;0;L;;;;;N;;;;;
+B563;HANGUL SYLLABLE DDAEC;Lo;0;L;;;;;N;;;;;
+B564;HANGUL SYLLABLE DDAEK;Lo;0;L;;;;;N;;;;;
+B565;HANGUL SYLLABLE DDAET;Lo;0;L;;;;;N;;;;;
+B566;HANGUL SYLLABLE DDAEP;Lo;0;L;;;;;N;;;;;
+B567;HANGUL SYLLABLE DDAEH;Lo;0;L;;;;;N;;;;;
+B568;HANGUL SYLLABLE DDYA;Lo;0;L;;;;;N;;;;;
+B569;HANGUL SYLLABLE DDYAG;Lo;0;L;;;;;N;;;;;
+B56A;HANGUL SYLLABLE DDYAGG;Lo;0;L;;;;;N;;;;;
+B56B;HANGUL SYLLABLE DDYAGS;Lo;0;L;;;;;N;;;;;
+B56C;HANGUL SYLLABLE DDYAN;Lo;0;L;;;;;N;;;;;
+B56D;HANGUL SYLLABLE DDYANI;Lo;0;L;;;;;N;;;;;
+B56E;HANGUL SYLLABLE DDYANH;Lo;0;L;;;;;N;;;;;
+B56F;HANGUL SYLLABLE DDYAD;Lo;0;L;;;;;N;;;;;
+B570;HANGUL SYLLABLE DDYAL;Lo;0;L;;;;;N;;;;;
+B571;HANGUL SYLLABLE DDYALG;Lo;0;L;;;;;N;;;;;
+B572;HANGUL SYLLABLE DDYALM;Lo;0;L;;;;;N;;;;;
+B573;HANGUL SYLLABLE DDYALB;Lo;0;L;;;;;N;;;;;
+B574;HANGUL SYLLABLE DDYALS;Lo;0;L;;;;;N;;;;;
+B575;HANGUL SYLLABLE DDYALT;Lo;0;L;;;;;N;;;;;
+B576;HANGUL SYLLABLE DDYALP;Lo;0;L;;;;;N;;;;;
+B577;HANGUL SYLLABLE DDYALH;Lo;0;L;;;;;N;;;;;
+B578;HANGUL SYLLABLE DDYAM;Lo;0;L;;;;;N;;;;;
+B579;HANGUL SYLLABLE DDYAB;Lo;0;L;;;;;N;;;;;
+B57A;HANGUL SYLLABLE DDYABS;Lo;0;L;;;;;N;;;;;
+B57B;HANGUL SYLLABLE DDYAS;Lo;0;L;;;;;N;;;;;
+B57C;HANGUL SYLLABLE DDYASS;Lo;0;L;;;;;N;;;;;
+B57D;HANGUL SYLLABLE DDYANG;Lo;0;L;;;;;N;;;;;
+B57E;HANGUL SYLLABLE DDYAJ;Lo;0;L;;;;;N;;;;;
+B57F;HANGUL SYLLABLE DDYAC;Lo;0;L;;;;;N;;;;;
+B580;HANGUL SYLLABLE DDYAK;Lo;0;L;;;;;N;;;;;
+B581;HANGUL SYLLABLE DDYAT;Lo;0;L;;;;;N;;;;;
+B582;HANGUL SYLLABLE DDYAP;Lo;0;L;;;;;N;;;;;
+B583;HANGUL SYLLABLE DDYAH;Lo;0;L;;;;;N;;;;;
+B584;HANGUL SYLLABLE DDYAE;Lo;0;L;;;;;N;;;;;
+B585;HANGUL SYLLABLE DDYAEG;Lo;0;L;;;;;N;;;;;
+B586;HANGUL SYLLABLE DDYAEGG;Lo;0;L;;;;;N;;;;;
+B587;HANGUL SYLLABLE DDYAEGS;Lo;0;L;;;;;N;;;;;
+B588;HANGUL SYLLABLE DDYAEN;Lo;0;L;;;;;N;;;;;
+B589;HANGUL SYLLABLE DDYAENI;Lo;0;L;;;;;N;;;;;
+B58A;HANGUL SYLLABLE DDYAENH;Lo;0;L;;;;;N;;;;;
+B58B;HANGUL SYLLABLE DDYAED;Lo;0;L;;;;;N;;;;;
+B58C;HANGUL SYLLABLE DDYAEL;Lo;0;L;;;;;N;;;;;
+B58D;HANGUL SYLLABLE DDYAELG;Lo;0;L;;;;;N;;;;;
+B58E;HANGUL SYLLABLE DDYAELM;Lo;0;L;;;;;N;;;;;
+B58F;HANGUL SYLLABLE DDYAELB;Lo;0;L;;;;;N;;;;;
+B590;HANGUL SYLLABLE DDYAELS;Lo;0;L;;;;;N;;;;;
+B591;HANGUL SYLLABLE DDYAELT;Lo;0;L;;;;;N;;;;;
+B592;HANGUL SYLLABLE DDYAELP;Lo;0;L;;;;;N;;;;;
+B593;HANGUL SYLLABLE DDYAELH;Lo;0;L;;;;;N;;;;;
+B594;HANGUL SYLLABLE DDYAEM;Lo;0;L;;;;;N;;;;;
+B595;HANGUL SYLLABLE DDYAEB;Lo;0;L;;;;;N;;;;;
+B596;HANGUL SYLLABLE DDYAEBS;Lo;0;L;;;;;N;;;;;
+B597;HANGUL SYLLABLE DDYAES;Lo;0;L;;;;;N;;;;;
+B598;HANGUL SYLLABLE DDYAESS;Lo;0;L;;;;;N;;;;;
+B599;HANGUL SYLLABLE DDYAENG;Lo;0;L;;;;;N;;;;;
+B59A;HANGUL SYLLABLE DDYAEJ;Lo;0;L;;;;;N;;;;;
+B59B;HANGUL SYLLABLE DDYAEC;Lo;0;L;;;;;N;;;;;
+B59C;HANGUL SYLLABLE DDYAEK;Lo;0;L;;;;;N;;;;;
+B59D;HANGUL SYLLABLE DDYAET;Lo;0;L;;;;;N;;;;;
+B59E;HANGUL SYLLABLE DDYAEP;Lo;0;L;;;;;N;;;;;
+B59F;HANGUL SYLLABLE DDYAEH;Lo;0;L;;;;;N;;;;;
+B5A0;HANGUL SYLLABLE DDEO;Lo;0;L;;;;;N;;;;;
+B5A1;HANGUL SYLLABLE DDEOG;Lo;0;L;;;;;N;;;;;
+B5A2;HANGUL SYLLABLE DDEOGG;Lo;0;L;;;;;N;;;;;
+B5A3;HANGUL SYLLABLE DDEOGS;Lo;0;L;;;;;N;;;;;
+B5A4;HANGUL SYLLABLE DDEON;Lo;0;L;;;;;N;;;;;
+B5A5;HANGUL SYLLABLE DDEONI;Lo;0;L;;;;;N;;;;;
+B5A6;HANGUL SYLLABLE DDEONH;Lo;0;L;;;;;N;;;;;
+B5A7;HANGUL SYLLABLE DDEOD;Lo;0;L;;;;;N;;;;;
+B5A8;HANGUL SYLLABLE DDEOL;Lo;0;L;;;;;N;;;;;
+B5A9;HANGUL SYLLABLE DDEOLG;Lo;0;L;;;;;N;;;;;
+B5AA;HANGUL SYLLABLE DDEOLM;Lo;0;L;;;;;N;;;;;
+B5AB;HANGUL SYLLABLE DDEOLB;Lo;0;L;;;;;N;;;;;
+B5AC;HANGUL SYLLABLE DDEOLS;Lo;0;L;;;;;N;;;;;
+B5AD;HANGUL SYLLABLE DDEOLT;Lo;0;L;;;;;N;;;;;
+B5AE;HANGUL SYLLABLE DDEOLP;Lo;0;L;;;;;N;;;;;
+B5AF;HANGUL SYLLABLE DDEOLH;Lo;0;L;;;;;N;;;;;
+B5B0;HANGUL SYLLABLE DDEOM;Lo;0;L;;;;;N;;;;;
+B5B1;HANGUL SYLLABLE DDEOB;Lo;0;L;;;;;N;;;;;
+B5B2;HANGUL SYLLABLE DDEOBS;Lo;0;L;;;;;N;;;;;
+B5B3;HANGUL SYLLABLE DDEOS;Lo;0;L;;;;;N;;;;;
+B5B4;HANGUL SYLLABLE DDEOSS;Lo;0;L;;;;;N;;;;;
+B5B5;HANGUL SYLLABLE DDEONG;Lo;0;L;;;;;N;;;;;
+B5B6;HANGUL SYLLABLE DDEOJ;Lo;0;L;;;;;N;;;;;
+B5B7;HANGUL SYLLABLE DDEOC;Lo;0;L;;;;;N;;;;;
+B5B8;HANGUL SYLLABLE DDEOK;Lo;0;L;;;;;N;;;;;
+B5B9;HANGUL SYLLABLE DDEOT;Lo;0;L;;;;;N;;;;;
+B5BA;HANGUL SYLLABLE DDEOP;Lo;0;L;;;;;N;;;;;
+B5BB;HANGUL SYLLABLE DDEOH;Lo;0;L;;;;;N;;;;;
+B5BC;HANGUL SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+B5BD;HANGUL SYLLABLE DDEG;Lo;0;L;;;;;N;;;;;
+B5BE;HANGUL SYLLABLE DDEGG;Lo;0;L;;;;;N;;;;;
+B5BF;HANGUL SYLLABLE DDEGS;Lo;0;L;;;;;N;;;;;
+B5C0;HANGUL SYLLABLE DDEN;Lo;0;L;;;;;N;;;;;
+B5C1;HANGUL SYLLABLE DDENI;Lo;0;L;;;;;N;;;;;
+B5C2;HANGUL SYLLABLE DDENH;Lo;0;L;;;;;N;;;;;
+B5C3;HANGUL SYLLABLE DDED;Lo;0;L;;;;;N;;;;;
+B5C4;HANGUL SYLLABLE DDEL;Lo;0;L;;;;;N;;;;;
+B5C5;HANGUL SYLLABLE DDELG;Lo;0;L;;;;;N;;;;;
+B5C6;HANGUL SYLLABLE DDELM;Lo;0;L;;;;;N;;;;;
+B5C7;HANGUL SYLLABLE DDELB;Lo;0;L;;;;;N;;;;;
+B5C8;HANGUL SYLLABLE DDELS;Lo;0;L;;;;;N;;;;;
+B5C9;HANGUL SYLLABLE DDELT;Lo;0;L;;;;;N;;;;;
+B5CA;HANGUL SYLLABLE DDELP;Lo;0;L;;;;;N;;;;;
+B5CB;HANGUL SYLLABLE DDELH;Lo;0;L;;;;;N;;;;;
+B5CC;HANGUL SYLLABLE DDEM;Lo;0;L;;;;;N;;;;;
+B5CD;HANGUL SYLLABLE DDEB;Lo;0;L;;;;;N;;;;;
+B5CE;HANGUL SYLLABLE DDEBS;Lo;0;L;;;;;N;;;;;
+B5CF;HANGUL SYLLABLE DDES;Lo;0;L;;;;;N;;;;;
+B5D0;HANGUL SYLLABLE DDESS;Lo;0;L;;;;;N;;;;;
+B5D1;HANGUL SYLLABLE DDENG;Lo;0;L;;;;;N;;;;;
+B5D2;HANGUL SYLLABLE DDEJ;Lo;0;L;;;;;N;;;;;
+B5D3;HANGUL SYLLABLE DDEC;Lo;0;L;;;;;N;;;;;
+B5D4;HANGUL SYLLABLE DDEK;Lo;0;L;;;;;N;;;;;
+B5D5;HANGUL SYLLABLE DDET;Lo;0;L;;;;;N;;;;;
+B5D6;HANGUL SYLLABLE DDEP;Lo;0;L;;;;;N;;;;;
+B5D7;HANGUL SYLLABLE DDEH;Lo;0;L;;;;;N;;;;;
+B5D8;HANGUL SYLLABLE DDYEO;Lo;0;L;;;;;N;;;;;
+B5D9;HANGUL SYLLABLE DDYEOG;Lo;0;L;;;;;N;;;;;
+B5DA;HANGUL SYLLABLE DDYEOGG;Lo;0;L;;;;;N;;;;;
+B5DB;HANGUL SYLLABLE DDYEOGS;Lo;0;L;;;;;N;;;;;
+B5DC;HANGUL SYLLABLE DDYEON;Lo;0;L;;;;;N;;;;;
+B5DD;HANGUL SYLLABLE DDYEONI;Lo;0;L;;;;;N;;;;;
+B5DE;HANGUL SYLLABLE DDYEONH;Lo;0;L;;;;;N;;;;;
+B5DF;HANGUL SYLLABLE DDYEOD;Lo;0;L;;;;;N;;;;;
+B5E0;HANGUL SYLLABLE DDYEOL;Lo;0;L;;;;;N;;;;;
+B5E1;HANGUL SYLLABLE DDYEOLG;Lo;0;L;;;;;N;;;;;
+B5E2;HANGUL SYLLABLE DDYEOLM;Lo;0;L;;;;;N;;;;;
+B5E3;HANGUL SYLLABLE DDYEOLB;Lo;0;L;;;;;N;;;;;
+B5E4;HANGUL SYLLABLE DDYEOLS;Lo;0;L;;;;;N;;;;;
+B5E5;HANGUL SYLLABLE DDYEOLT;Lo;0;L;;;;;N;;;;;
+B5E6;HANGUL SYLLABLE DDYEOLP;Lo;0;L;;;;;N;;;;;
+B5E7;HANGUL SYLLABLE DDYEOLH;Lo;0;L;;;;;N;;;;;
+B5E8;HANGUL SYLLABLE DDYEOM;Lo;0;L;;;;;N;;;;;
+B5E9;HANGUL SYLLABLE DDYEOB;Lo;0;L;;;;;N;;;;;
+B5EA;HANGUL SYLLABLE DDYEOBS;Lo;0;L;;;;;N;;;;;
+B5EB;HANGUL SYLLABLE DDYEOS;Lo;0;L;;;;;N;;;;;
+B5EC;HANGUL SYLLABLE DDYEOSS;Lo;0;L;;;;;N;;;;;
+B5ED;HANGUL SYLLABLE DDYEONG;Lo;0;L;;;;;N;;;;;
+B5EE;HANGUL SYLLABLE DDYEOJ;Lo;0;L;;;;;N;;;;;
+B5EF;HANGUL SYLLABLE DDYEOC;Lo;0;L;;;;;N;;;;;
+B5F0;HANGUL SYLLABLE DDYEOK;Lo;0;L;;;;;N;;;;;
+B5F1;HANGUL SYLLABLE DDYEOT;Lo;0;L;;;;;N;;;;;
+B5F2;HANGUL SYLLABLE DDYEOP;Lo;0;L;;;;;N;;;;;
+B5F3;HANGUL SYLLABLE DDYEOH;Lo;0;L;;;;;N;;;;;
+B5F4;HANGUL SYLLABLE DDYE;Lo;0;L;;;;;N;;;;;
+B5F5;HANGUL SYLLABLE DDYEG;Lo;0;L;;;;;N;;;;;
+B5F6;HANGUL SYLLABLE DDYEGG;Lo;0;L;;;;;N;;;;;
+B5F7;HANGUL SYLLABLE DDYEGS;Lo;0;L;;;;;N;;;;;
+B5F8;HANGUL SYLLABLE DDYEN;Lo;0;L;;;;;N;;;;;
+B5F9;HANGUL SYLLABLE DDYENI;Lo;0;L;;;;;N;;;;;
+B5FA;HANGUL SYLLABLE DDYENH;Lo;0;L;;;;;N;;;;;
+B5FB;HANGUL SYLLABLE DDYED;Lo;0;L;;;;;N;;;;;
+B5FC;HANGUL SYLLABLE DDYEL;Lo;0;L;;;;;N;;;;;
+B5FD;HANGUL SYLLABLE DDYELG;Lo;0;L;;;;;N;;;;;
+B5FE;HANGUL SYLLABLE DDYELM;Lo;0;L;;;;;N;;;;;
+B5FF;HANGUL SYLLABLE DDYELB;Lo;0;L;;;;;N;;;;;
+B600;HANGUL SYLLABLE DDYELS;Lo;0;L;;;;;N;;;;;
+B601;HANGUL SYLLABLE DDYELT;Lo;0;L;;;;;N;;;;;
+B602;HANGUL SYLLABLE DDYELP;Lo;0;L;;;;;N;;;;;
+B603;HANGUL SYLLABLE DDYELH;Lo;0;L;;;;;N;;;;;
+B604;HANGUL SYLLABLE DDYEM;Lo;0;L;;;;;N;;;;;
+B605;HANGUL SYLLABLE DDYEB;Lo;0;L;;;;;N;;;;;
+B606;HANGUL SYLLABLE DDYEBS;Lo;0;L;;;;;N;;;;;
+B607;HANGUL SYLLABLE DDYES;Lo;0;L;;;;;N;;;;;
+B608;HANGUL SYLLABLE DDYESS;Lo;0;L;;;;;N;;;;;
+B609;HANGUL SYLLABLE DDYENG;Lo;0;L;;;;;N;;;;;
+B60A;HANGUL SYLLABLE DDYEJ;Lo;0;L;;;;;N;;;;;
+B60B;HANGUL SYLLABLE DDYEC;Lo;0;L;;;;;N;;;;;
+B60C;HANGUL SYLLABLE DDYEK;Lo;0;L;;;;;N;;;;;
+B60D;HANGUL SYLLABLE DDYET;Lo;0;L;;;;;N;;;;;
+B60E;HANGUL SYLLABLE DDYEP;Lo;0;L;;;;;N;;;;;
+B60F;HANGUL SYLLABLE DDYEH;Lo;0;L;;;;;N;;;;;
+B610;HANGUL SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+B611;HANGUL SYLLABLE DDOG;Lo;0;L;;;;;N;;;;;
+B612;HANGUL SYLLABLE DDOGG;Lo;0;L;;;;;N;;;;;
+B613;HANGUL SYLLABLE DDOGS;Lo;0;L;;;;;N;;;;;
+B614;HANGUL SYLLABLE DDON;Lo;0;L;;;;;N;;;;;
+B615;HANGUL SYLLABLE DDONI;Lo;0;L;;;;;N;;;;;
+B616;HANGUL SYLLABLE DDONH;Lo;0;L;;;;;N;;;;;
+B617;HANGUL SYLLABLE DDOD;Lo;0;L;;;;;N;;;;;
+B618;HANGUL SYLLABLE DDOL;Lo;0;L;;;;;N;;;;;
+B619;HANGUL SYLLABLE DDOLG;Lo;0;L;;;;;N;;;;;
+B61A;HANGUL SYLLABLE DDOLM;Lo;0;L;;;;;N;;;;;
+B61B;HANGUL SYLLABLE DDOLB;Lo;0;L;;;;;N;;;;;
+B61C;HANGUL SYLLABLE DDOLS;Lo;0;L;;;;;N;;;;;
+B61D;HANGUL SYLLABLE DDOLT;Lo;0;L;;;;;N;;;;;
+B61E;HANGUL SYLLABLE DDOLP;Lo;0;L;;;;;N;;;;;
+B61F;HANGUL SYLLABLE DDOLH;Lo;0;L;;;;;N;;;;;
+B620;HANGUL SYLLABLE DDOM;Lo;0;L;;;;;N;;;;;
+B621;HANGUL SYLLABLE DDOB;Lo;0;L;;;;;N;;;;;
+B622;HANGUL SYLLABLE DDOBS;Lo;0;L;;;;;N;;;;;
+B623;HANGUL SYLLABLE DDOS;Lo;0;L;;;;;N;;;;;
+B624;HANGUL SYLLABLE DDOSS;Lo;0;L;;;;;N;;;;;
+B625;HANGUL SYLLABLE DDONG;Lo;0;L;;;;;N;;;;;
+B626;HANGUL SYLLABLE DDOJ;Lo;0;L;;;;;N;;;;;
+B627;HANGUL SYLLABLE DDOC;Lo;0;L;;;;;N;;;;;
+B628;HANGUL SYLLABLE DDOK;Lo;0;L;;;;;N;;;;;
+B629;HANGUL SYLLABLE DDOT;Lo;0;L;;;;;N;;;;;
+B62A;HANGUL SYLLABLE DDOP;Lo;0;L;;;;;N;;;;;
+B62B;HANGUL SYLLABLE DDOH;Lo;0;L;;;;;N;;;;;
+B62C;HANGUL SYLLABLE DDWA;Lo;0;L;;;;;N;;;;;
+B62D;HANGUL SYLLABLE DDWAG;Lo;0;L;;;;;N;;;;;
+B62E;HANGUL SYLLABLE DDWAGG;Lo;0;L;;;;;N;;;;;
+B62F;HANGUL SYLLABLE DDWAGS;Lo;0;L;;;;;N;;;;;
+B630;HANGUL SYLLABLE DDWAN;Lo;0;L;;;;;N;;;;;
+B631;HANGUL SYLLABLE DDWANI;Lo;0;L;;;;;N;;;;;
+B632;HANGUL SYLLABLE DDWANH;Lo;0;L;;;;;N;;;;;
+B633;HANGUL SYLLABLE DDWAD;Lo;0;L;;;;;N;;;;;
+B634;HANGUL SYLLABLE DDWAL;Lo;0;L;;;;;N;;;;;
+B635;HANGUL SYLLABLE DDWALG;Lo;0;L;;;;;N;;;;;
+B636;HANGUL SYLLABLE DDWALM;Lo;0;L;;;;;N;;;;;
+B637;HANGUL SYLLABLE DDWALB;Lo;0;L;;;;;N;;;;;
+B638;HANGUL SYLLABLE DDWALS;Lo;0;L;;;;;N;;;;;
+B639;HANGUL SYLLABLE DDWALT;Lo;0;L;;;;;N;;;;;
+B63A;HANGUL SYLLABLE DDWALP;Lo;0;L;;;;;N;;;;;
+B63B;HANGUL SYLLABLE DDWALH;Lo;0;L;;;;;N;;;;;
+B63C;HANGUL SYLLABLE DDWAM;Lo;0;L;;;;;N;;;;;
+B63D;HANGUL SYLLABLE DDWAB;Lo;0;L;;;;;N;;;;;
+B63E;HANGUL SYLLABLE DDWABS;Lo;0;L;;;;;N;;;;;
+B63F;HANGUL SYLLABLE DDWAS;Lo;0;L;;;;;N;;;;;
+B640;HANGUL SYLLABLE DDWASS;Lo;0;L;;;;;N;;;;;
+B641;HANGUL SYLLABLE DDWANG;Lo;0;L;;;;;N;;;;;
+B642;HANGUL SYLLABLE DDWAJ;Lo;0;L;;;;;N;;;;;
+B643;HANGUL SYLLABLE DDWAC;Lo;0;L;;;;;N;;;;;
+B644;HANGUL SYLLABLE DDWAK;Lo;0;L;;;;;N;;;;;
+B645;HANGUL SYLLABLE DDWAT;Lo;0;L;;;;;N;;;;;
+B646;HANGUL SYLLABLE DDWAP;Lo;0;L;;;;;N;;;;;
+B647;HANGUL SYLLABLE DDWAH;Lo;0;L;;;;;N;;;;;
+B648;HANGUL SYLLABLE DDWAE;Lo;0;L;;;;;N;;;;;
+B649;HANGUL SYLLABLE DDWAEG;Lo;0;L;;;;;N;;;;;
+B64A;HANGUL SYLLABLE DDWAEGG;Lo;0;L;;;;;N;;;;;
+B64B;HANGUL SYLLABLE DDWAEGS;Lo;0;L;;;;;N;;;;;
+B64C;HANGUL SYLLABLE DDWAEN;Lo;0;L;;;;;N;;;;;
+B64D;HANGUL SYLLABLE DDWAENI;Lo;0;L;;;;;N;;;;;
+B64E;HANGUL SYLLABLE DDWAENH;Lo;0;L;;;;;N;;;;;
+B64F;HANGUL SYLLABLE DDWAED;Lo;0;L;;;;;N;;;;;
+B650;HANGUL SYLLABLE DDWAEL;Lo;0;L;;;;;N;;;;;
+B651;HANGUL SYLLABLE DDWAELG;Lo;0;L;;;;;N;;;;;
+B652;HANGUL SYLLABLE DDWAELM;Lo;0;L;;;;;N;;;;;
+B653;HANGUL SYLLABLE DDWAELB;Lo;0;L;;;;;N;;;;;
+B654;HANGUL SYLLABLE DDWAELS;Lo;0;L;;;;;N;;;;;
+B655;HANGUL SYLLABLE DDWAELT;Lo;0;L;;;;;N;;;;;
+B656;HANGUL SYLLABLE DDWAELP;Lo;0;L;;;;;N;;;;;
+B657;HANGUL SYLLABLE DDWAELH;Lo;0;L;;;;;N;;;;;
+B658;HANGUL SYLLABLE DDWAEM;Lo;0;L;;;;;N;;;;;
+B659;HANGUL SYLLABLE DDWAEB;Lo;0;L;;;;;N;;;;;
+B65A;HANGUL SYLLABLE DDWAEBS;Lo;0;L;;;;;N;;;;;
+B65B;HANGUL SYLLABLE DDWAES;Lo;0;L;;;;;N;;;;;
+B65C;HANGUL SYLLABLE DDWAESS;Lo;0;L;;;;;N;;;;;
+B65D;HANGUL SYLLABLE DDWAENG;Lo;0;L;;;;;N;;;;;
+B65E;HANGUL SYLLABLE DDWAEJ;Lo;0;L;;;;;N;;;;;
+B65F;HANGUL SYLLABLE DDWAEC;Lo;0;L;;;;;N;;;;;
+B660;HANGUL SYLLABLE DDWAEK;Lo;0;L;;;;;N;;;;;
+B661;HANGUL SYLLABLE DDWAET;Lo;0;L;;;;;N;;;;;
+B662;HANGUL SYLLABLE DDWAEP;Lo;0;L;;;;;N;;;;;
+B663;HANGUL SYLLABLE DDWAEH;Lo;0;L;;;;;N;;;;;
+B664;HANGUL SYLLABLE DDOE;Lo;0;L;;;;;N;;;;;
+B665;HANGUL SYLLABLE DDOEG;Lo;0;L;;;;;N;;;;;
+B666;HANGUL SYLLABLE DDOEGG;Lo;0;L;;;;;N;;;;;
+B667;HANGUL SYLLABLE DDOEGS;Lo;0;L;;;;;N;;;;;
+B668;HANGUL SYLLABLE DDOEN;Lo;0;L;;;;;N;;;;;
+B669;HANGUL SYLLABLE DDOENI;Lo;0;L;;;;;N;;;;;
+B66A;HANGUL SYLLABLE DDOENH;Lo;0;L;;;;;N;;;;;
+B66B;HANGUL SYLLABLE DDOED;Lo;0;L;;;;;N;;;;;
+B66C;HANGUL SYLLABLE DDOEL;Lo;0;L;;;;;N;;;;;
+B66D;HANGUL SYLLABLE DDOELG;Lo;0;L;;;;;N;;;;;
+B66E;HANGUL SYLLABLE DDOELM;Lo;0;L;;;;;N;;;;;
+B66F;HANGUL SYLLABLE DDOELB;Lo;0;L;;;;;N;;;;;
+B670;HANGUL SYLLABLE DDOELS;Lo;0;L;;;;;N;;;;;
+B671;HANGUL SYLLABLE DDOELT;Lo;0;L;;;;;N;;;;;
+B672;HANGUL SYLLABLE DDOELP;Lo;0;L;;;;;N;;;;;
+B673;HANGUL SYLLABLE DDOELH;Lo;0;L;;;;;N;;;;;
+B674;HANGUL SYLLABLE DDOEM;Lo;0;L;;;;;N;;;;;
+B675;HANGUL SYLLABLE DDOEB;Lo;0;L;;;;;N;;;;;
+B676;HANGUL SYLLABLE DDOEBS;Lo;0;L;;;;;N;;;;;
+B677;HANGUL SYLLABLE DDOES;Lo;0;L;;;;;N;;;;;
+B678;HANGUL SYLLABLE DDOESS;Lo;0;L;;;;;N;;;;;
+B679;HANGUL SYLLABLE DDOENG;Lo;0;L;;;;;N;;;;;
+B67A;HANGUL SYLLABLE DDOEJ;Lo;0;L;;;;;N;;;;;
+B67B;HANGUL SYLLABLE DDOEC;Lo;0;L;;;;;N;;;;;
+B67C;HANGUL SYLLABLE DDOEK;Lo;0;L;;;;;N;;;;;
+B67D;HANGUL SYLLABLE DDOET;Lo;0;L;;;;;N;;;;;
+B67E;HANGUL SYLLABLE DDOEP;Lo;0;L;;;;;N;;;;;
+B67F;HANGUL SYLLABLE DDOEH;Lo;0;L;;;;;N;;;;;
+B680;HANGUL SYLLABLE DDYO;Lo;0;L;;;;;N;;;;;
+B681;HANGUL SYLLABLE DDYOG;Lo;0;L;;;;;N;;;;;
+B682;HANGUL SYLLABLE DDYOGG;Lo;0;L;;;;;N;;;;;
+B683;HANGUL SYLLABLE DDYOGS;Lo;0;L;;;;;N;;;;;
+B684;HANGUL SYLLABLE DDYON;Lo;0;L;;;;;N;;;;;
+B685;HANGUL SYLLABLE DDYONI;Lo;0;L;;;;;N;;;;;
+B686;HANGUL SYLLABLE DDYONH;Lo;0;L;;;;;N;;;;;
+B687;HANGUL SYLLABLE DDYOD;Lo;0;L;;;;;N;;;;;
+B688;HANGUL SYLLABLE DDYOL;Lo;0;L;;;;;N;;;;;
+B689;HANGUL SYLLABLE DDYOLG;Lo;0;L;;;;;N;;;;;
+B68A;HANGUL SYLLABLE DDYOLM;Lo;0;L;;;;;N;;;;;
+B68B;HANGUL SYLLABLE DDYOLB;Lo;0;L;;;;;N;;;;;
+B68C;HANGUL SYLLABLE DDYOLS;Lo;0;L;;;;;N;;;;;
+B68D;HANGUL SYLLABLE DDYOLT;Lo;0;L;;;;;N;;;;;
+B68E;HANGUL SYLLABLE DDYOLP;Lo;0;L;;;;;N;;;;;
+B68F;HANGUL SYLLABLE DDYOLH;Lo;0;L;;;;;N;;;;;
+B690;HANGUL SYLLABLE DDYOM;Lo;0;L;;;;;N;;;;;
+B691;HANGUL SYLLABLE DDYOB;Lo;0;L;;;;;N;;;;;
+B692;HANGUL SYLLABLE DDYOBS;Lo;0;L;;;;;N;;;;;
+B693;HANGUL SYLLABLE DDYOS;Lo;0;L;;;;;N;;;;;
+B694;HANGUL SYLLABLE DDYOSS;Lo;0;L;;;;;N;;;;;
+B695;HANGUL SYLLABLE DDYONG;Lo;0;L;;;;;N;;;;;
+B696;HANGUL SYLLABLE DDYOJ;Lo;0;L;;;;;N;;;;;
+B697;HANGUL SYLLABLE DDYOC;Lo;0;L;;;;;N;;;;;
+B698;HANGUL SYLLABLE DDYOK;Lo;0;L;;;;;N;;;;;
+B699;HANGUL SYLLABLE DDYOT;Lo;0;L;;;;;N;;;;;
+B69A;HANGUL SYLLABLE DDYOP;Lo;0;L;;;;;N;;;;;
+B69B;HANGUL SYLLABLE DDYOH;Lo;0;L;;;;;N;;;;;
+B69C;HANGUL SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+B69D;HANGUL SYLLABLE DDUG;Lo;0;L;;;;;N;;;;;
+B69E;HANGUL SYLLABLE DDUGG;Lo;0;L;;;;;N;;;;;
+B69F;HANGUL SYLLABLE DDUGS;Lo;0;L;;;;;N;;;;;
+B6A0;HANGUL SYLLABLE DDUN;Lo;0;L;;;;;N;;;;;
+B6A1;HANGUL SYLLABLE DDUNI;Lo;0;L;;;;;N;;;;;
+B6A2;HANGUL SYLLABLE DDUNH;Lo;0;L;;;;;N;;;;;
+B6A3;HANGUL SYLLABLE DDUD;Lo;0;L;;;;;N;;;;;
+B6A4;HANGUL SYLLABLE DDUL;Lo;0;L;;;;;N;;;;;
+B6A5;HANGUL SYLLABLE DDULG;Lo;0;L;;;;;N;;;;;
+B6A6;HANGUL SYLLABLE DDULM;Lo;0;L;;;;;N;;;;;
+B6A7;HANGUL SYLLABLE DDULB;Lo;0;L;;;;;N;;;;;
+B6A8;HANGUL SYLLABLE DDULS;Lo;0;L;;;;;N;;;;;
+B6A9;HANGUL SYLLABLE DDULT;Lo;0;L;;;;;N;;;;;
+B6AA;HANGUL SYLLABLE DDULP;Lo;0;L;;;;;N;;;;;
+B6AB;HANGUL SYLLABLE DDULH;Lo;0;L;;;;;N;;;;;
+B6AC;HANGUL SYLLABLE DDUM;Lo;0;L;;;;;N;;;;;
+B6AD;HANGUL SYLLABLE DDUB;Lo;0;L;;;;;N;;;;;
+B6AE;HANGUL SYLLABLE DDUBS;Lo;0;L;;;;;N;;;;;
+B6AF;HANGUL SYLLABLE DDUS;Lo;0;L;;;;;N;;;;;
+B6B0;HANGUL SYLLABLE DDUSS;Lo;0;L;;;;;N;;;;;
+B6B1;HANGUL SYLLABLE DDUNG;Lo;0;L;;;;;N;;;;;
+B6B2;HANGUL SYLLABLE DDUJ;Lo;0;L;;;;;N;;;;;
+B6B3;HANGUL SYLLABLE DDUC;Lo;0;L;;;;;N;;;;;
+B6B4;HANGUL SYLLABLE DDUK;Lo;0;L;;;;;N;;;;;
+B6B5;HANGUL SYLLABLE DDUT;Lo;0;L;;;;;N;;;;;
+B6B6;HANGUL SYLLABLE DDUP;Lo;0;L;;;;;N;;;;;
+B6B7;HANGUL SYLLABLE DDUH;Lo;0;L;;;;;N;;;;;
+B6B8;HANGUL SYLLABLE DDWEO;Lo;0;L;;;;;N;;;;;
+B6B9;HANGUL SYLLABLE DDWEOG;Lo;0;L;;;;;N;;;;;
+B6BA;HANGUL SYLLABLE DDWEOGG;Lo;0;L;;;;;N;;;;;
+B6BB;HANGUL SYLLABLE DDWEOGS;Lo;0;L;;;;;N;;;;;
+B6BC;HANGUL SYLLABLE DDWEON;Lo;0;L;;;;;N;;;;;
+B6BD;HANGUL SYLLABLE DDWEONI;Lo;0;L;;;;;N;;;;;
+B6BE;HANGUL SYLLABLE DDWEONH;Lo;0;L;;;;;N;;;;;
+B6BF;HANGUL SYLLABLE DDWEOD;Lo;0;L;;;;;N;;;;;
+B6C0;HANGUL SYLLABLE DDWEOL;Lo;0;L;;;;;N;;;;;
+B6C1;HANGUL SYLLABLE DDWEOLG;Lo;0;L;;;;;N;;;;;
+B6C2;HANGUL SYLLABLE DDWEOLM;Lo;0;L;;;;;N;;;;;
+B6C3;HANGUL SYLLABLE DDWEOLB;Lo;0;L;;;;;N;;;;;
+B6C4;HANGUL SYLLABLE DDWEOLS;Lo;0;L;;;;;N;;;;;
+B6C5;HANGUL SYLLABLE DDWEOLT;Lo;0;L;;;;;N;;;;;
+B6C6;HANGUL SYLLABLE DDWEOLP;Lo;0;L;;;;;N;;;;;
+B6C7;HANGUL SYLLABLE DDWEOLH;Lo;0;L;;;;;N;;;;;
+B6C8;HANGUL SYLLABLE DDWEOM;Lo;0;L;;;;;N;;;;;
+B6C9;HANGUL SYLLABLE DDWEOB;Lo;0;L;;;;;N;;;;;
+B6CA;HANGUL SYLLABLE DDWEOBS;Lo;0;L;;;;;N;;;;;
+B6CB;HANGUL SYLLABLE DDWEOS;Lo;0;L;;;;;N;;;;;
+B6CC;HANGUL SYLLABLE DDWEOSS;Lo;0;L;;;;;N;;;;;
+B6CD;HANGUL SYLLABLE DDWEONG;Lo;0;L;;;;;N;;;;;
+B6CE;HANGUL SYLLABLE DDWEOJ;Lo;0;L;;;;;N;;;;;
+B6CF;HANGUL SYLLABLE DDWEOC;Lo;0;L;;;;;N;;;;;
+B6D0;HANGUL SYLLABLE DDWEOK;Lo;0;L;;;;;N;;;;;
+B6D1;HANGUL SYLLABLE DDWEOT;Lo;0;L;;;;;N;;;;;
+B6D2;HANGUL SYLLABLE DDWEOP;Lo;0;L;;;;;N;;;;;
+B6D3;HANGUL SYLLABLE DDWEOH;Lo;0;L;;;;;N;;;;;
+B6D4;HANGUL SYLLABLE DDWE;Lo;0;L;;;;;N;;;;;
+B6D5;HANGUL SYLLABLE DDWEG;Lo;0;L;;;;;N;;;;;
+B6D6;HANGUL SYLLABLE DDWEGG;Lo;0;L;;;;;N;;;;;
+B6D7;HANGUL SYLLABLE DDWEGS;Lo;0;L;;;;;N;;;;;
+B6D8;HANGUL SYLLABLE DDWEN;Lo;0;L;;;;;N;;;;;
+B6D9;HANGUL SYLLABLE DDWENI;Lo;0;L;;;;;N;;;;;
+B6DA;HANGUL SYLLABLE DDWENH;Lo;0;L;;;;;N;;;;;
+B6DB;HANGUL SYLLABLE DDWED;Lo;0;L;;;;;N;;;;;
+B6DC;HANGUL SYLLABLE DDWEL;Lo;0;L;;;;;N;;;;;
+B6DD;HANGUL SYLLABLE DDWELG;Lo;0;L;;;;;N;;;;;
+B6DE;HANGUL SYLLABLE DDWELM;Lo;0;L;;;;;N;;;;;
+B6DF;HANGUL SYLLABLE DDWELB;Lo;0;L;;;;;N;;;;;
+B6E0;HANGUL SYLLABLE DDWELS;Lo;0;L;;;;;N;;;;;
+B6E1;HANGUL SYLLABLE DDWELT;Lo;0;L;;;;;N;;;;;
+B6E2;HANGUL SYLLABLE DDWELP;Lo;0;L;;;;;N;;;;;
+B6E3;HANGUL SYLLABLE DDWELH;Lo;0;L;;;;;N;;;;;
+B6E4;HANGUL SYLLABLE DDWEM;Lo;0;L;;;;;N;;;;;
+B6E5;HANGUL SYLLABLE DDWEB;Lo;0;L;;;;;N;;;;;
+B6E6;HANGUL SYLLABLE DDWEBS;Lo;0;L;;;;;N;;;;;
+B6E7;HANGUL SYLLABLE DDWES;Lo;0;L;;;;;N;;;;;
+B6E8;HANGUL SYLLABLE DDWESS;Lo;0;L;;;;;N;;;;;
+B6E9;HANGUL SYLLABLE DDWENG;Lo;0;L;;;;;N;;;;;
+B6EA;HANGUL SYLLABLE DDWEJ;Lo;0;L;;;;;N;;;;;
+B6EB;HANGUL SYLLABLE DDWEC;Lo;0;L;;;;;N;;;;;
+B6EC;HANGUL SYLLABLE DDWEK;Lo;0;L;;;;;N;;;;;
+B6ED;HANGUL SYLLABLE DDWET;Lo;0;L;;;;;N;;;;;
+B6EE;HANGUL SYLLABLE DDWEP;Lo;0;L;;;;;N;;;;;
+B6EF;HANGUL SYLLABLE DDWEH;Lo;0;L;;;;;N;;;;;
+B6F0;HANGUL SYLLABLE DDWI;Lo;0;L;;;;;N;;;;;
+B6F1;HANGUL SYLLABLE DDWIG;Lo;0;L;;;;;N;;;;;
+B6F2;HANGUL SYLLABLE DDWIGG;Lo;0;L;;;;;N;;;;;
+B6F3;HANGUL SYLLABLE DDWIGS;Lo;0;L;;;;;N;;;;;
+B6F4;HANGUL SYLLABLE DDWIN;Lo;0;L;;;;;N;;;;;
+B6F5;HANGUL SYLLABLE DDWINI;Lo;0;L;;;;;N;;;;;
+B6F6;HANGUL SYLLABLE DDWINH;Lo;0;L;;;;;N;;;;;
+B6F7;HANGUL SYLLABLE DDWID;Lo;0;L;;;;;N;;;;;
+B6F8;HANGUL SYLLABLE DDWIL;Lo;0;L;;;;;N;;;;;
+B6F9;HANGUL SYLLABLE DDWILG;Lo;0;L;;;;;N;;;;;
+B6FA;HANGUL SYLLABLE DDWILM;Lo;0;L;;;;;N;;;;;
+B6FB;HANGUL SYLLABLE DDWILB;Lo;0;L;;;;;N;;;;;
+B6FC;HANGUL SYLLABLE DDWILS;Lo;0;L;;;;;N;;;;;
+B6FD;HANGUL SYLLABLE DDWILT;Lo;0;L;;;;;N;;;;;
+B6FE;HANGUL SYLLABLE DDWILP;Lo;0;L;;;;;N;;;;;
+B6FF;HANGUL SYLLABLE DDWILH;Lo;0;L;;;;;N;;;;;
+B700;HANGUL SYLLABLE DDWIM;Lo;0;L;;;;;N;;;;;
+B701;HANGUL SYLLABLE DDWIB;Lo;0;L;;;;;N;;;;;
+B702;HANGUL SYLLABLE DDWIBS;Lo;0;L;;;;;N;;;;;
+B703;HANGUL SYLLABLE DDWIS;Lo;0;L;;;;;N;;;;;
+B704;HANGUL SYLLABLE DDWISS;Lo;0;L;;;;;N;;;;;
+B705;HANGUL SYLLABLE DDWING;Lo;0;L;;;;;N;;;;;
+B706;HANGUL SYLLABLE DDWIJ;Lo;0;L;;;;;N;;;;;
+B707;HANGUL SYLLABLE DDWIC;Lo;0;L;;;;;N;;;;;
+B708;HANGUL SYLLABLE DDWIK;Lo;0;L;;;;;N;;;;;
+B709;HANGUL SYLLABLE DDWIT;Lo;0;L;;;;;N;;;;;
+B70A;HANGUL SYLLABLE DDWIP;Lo;0;L;;;;;N;;;;;
+B70B;HANGUL SYLLABLE DDWIH;Lo;0;L;;;;;N;;;;;
+B70C;HANGUL SYLLABLE DDYU;Lo;0;L;;;;;N;;;;;
+B70D;HANGUL SYLLABLE DDYUG;Lo;0;L;;;;;N;;;;;
+B70E;HANGUL SYLLABLE DDYUGG;Lo;0;L;;;;;N;;;;;
+B70F;HANGUL SYLLABLE DDYUGS;Lo;0;L;;;;;N;;;;;
+B710;HANGUL SYLLABLE DDYUN;Lo;0;L;;;;;N;;;;;
+B711;HANGUL SYLLABLE DDYUNI;Lo;0;L;;;;;N;;;;;
+B712;HANGUL SYLLABLE DDYUNH;Lo;0;L;;;;;N;;;;;
+B713;HANGUL SYLLABLE DDYUD;Lo;0;L;;;;;N;;;;;
+B714;HANGUL SYLLABLE DDYUL;Lo;0;L;;;;;N;;;;;
+B715;HANGUL SYLLABLE DDYULG;Lo;0;L;;;;;N;;;;;
+B716;HANGUL SYLLABLE DDYULM;Lo;0;L;;;;;N;;;;;
+B717;HANGUL SYLLABLE DDYULB;Lo;0;L;;;;;N;;;;;
+B718;HANGUL SYLLABLE DDYULS;Lo;0;L;;;;;N;;;;;
+B719;HANGUL SYLLABLE DDYULT;Lo;0;L;;;;;N;;;;;
+B71A;HANGUL SYLLABLE DDYULP;Lo;0;L;;;;;N;;;;;
+B71B;HANGUL SYLLABLE DDYULH;Lo;0;L;;;;;N;;;;;
+B71C;HANGUL SYLLABLE DDYUM;Lo;0;L;;;;;N;;;;;
+B71D;HANGUL SYLLABLE DDYUB;Lo;0;L;;;;;N;;;;;
+B71E;HANGUL SYLLABLE DDYUBS;Lo;0;L;;;;;N;;;;;
+B71F;HANGUL SYLLABLE DDYUS;Lo;0;L;;;;;N;;;;;
+B720;HANGUL SYLLABLE DDYUSS;Lo;0;L;;;;;N;;;;;
+B721;HANGUL SYLLABLE DDYUNG;Lo;0;L;;;;;N;;;;;
+B722;HANGUL SYLLABLE DDYUJ;Lo;0;L;;;;;N;;;;;
+B723;HANGUL SYLLABLE DDYUC;Lo;0;L;;;;;N;;;;;
+B724;HANGUL SYLLABLE DDYUK;Lo;0;L;;;;;N;;;;;
+B725;HANGUL SYLLABLE DDYUT;Lo;0;L;;;;;N;;;;;
+B726;HANGUL SYLLABLE DDYUP;Lo;0;L;;;;;N;;;;;
+B727;HANGUL SYLLABLE DDYUH;Lo;0;L;;;;;N;;;;;
+B728;HANGUL SYLLABLE DDEU;Lo;0;L;;;;;N;;;;;
+B729;HANGUL SYLLABLE DDEUG;Lo;0;L;;;;;N;;;;;
+B72A;HANGUL SYLLABLE DDEUGG;Lo;0;L;;;;;N;;;;;
+B72B;HANGUL SYLLABLE DDEUGS;Lo;0;L;;;;;N;;;;;
+B72C;HANGUL SYLLABLE DDEUN;Lo;0;L;;;;;N;;;;;
+B72D;HANGUL SYLLABLE DDEUNI;Lo;0;L;;;;;N;;;;;
+B72E;HANGUL SYLLABLE DDEUNH;Lo;0;L;;;;;N;;;;;
+B72F;HANGUL SYLLABLE DDEUD;Lo;0;L;;;;;N;;;;;
+B730;HANGUL SYLLABLE DDEUL;Lo;0;L;;;;;N;;;;;
+B731;HANGUL SYLLABLE DDEULG;Lo;0;L;;;;;N;;;;;
+B732;HANGUL SYLLABLE DDEULM;Lo;0;L;;;;;N;;;;;
+B733;HANGUL SYLLABLE DDEULB;Lo;0;L;;;;;N;;;;;
+B734;HANGUL SYLLABLE DDEULS;Lo;0;L;;;;;N;;;;;
+B735;HANGUL SYLLABLE DDEULT;Lo;0;L;;;;;N;;;;;
+B736;HANGUL SYLLABLE DDEULP;Lo;0;L;;;;;N;;;;;
+B737;HANGUL SYLLABLE DDEULH;Lo;0;L;;;;;N;;;;;
+B738;HANGUL SYLLABLE DDEUM;Lo;0;L;;;;;N;;;;;
+B739;HANGUL SYLLABLE DDEUB;Lo;0;L;;;;;N;;;;;
+B73A;HANGUL SYLLABLE DDEUBS;Lo;0;L;;;;;N;;;;;
+B73B;HANGUL SYLLABLE DDEUS;Lo;0;L;;;;;N;;;;;
+B73C;HANGUL SYLLABLE DDEUSS;Lo;0;L;;;;;N;;;;;
+B73D;HANGUL SYLLABLE DDEUNG;Lo;0;L;;;;;N;;;;;
+B73E;HANGUL SYLLABLE DDEUJ;Lo;0;L;;;;;N;;;;;
+B73F;HANGUL SYLLABLE DDEUC;Lo;0;L;;;;;N;;;;;
+B740;HANGUL SYLLABLE DDEUK;Lo;0;L;;;;;N;;;;;
+B741;HANGUL SYLLABLE DDEUT;Lo;0;L;;;;;N;;;;;
+B742;HANGUL SYLLABLE DDEUP;Lo;0;L;;;;;N;;;;;
+B743;HANGUL SYLLABLE DDEUH;Lo;0;L;;;;;N;;;;;
+B744;HANGUL SYLLABLE DDYI;Lo;0;L;;;;;N;;;;;
+B745;HANGUL SYLLABLE DDYIG;Lo;0;L;;;;;N;;;;;
+B746;HANGUL SYLLABLE DDYIGG;Lo;0;L;;;;;N;;;;;
+B747;HANGUL SYLLABLE DDYIGS;Lo;0;L;;;;;N;;;;;
+B748;HANGUL SYLLABLE DDYIN;Lo;0;L;;;;;N;;;;;
+B749;HANGUL SYLLABLE DDYINI;Lo;0;L;;;;;N;;;;;
+B74A;HANGUL SYLLABLE DDYINH;Lo;0;L;;;;;N;;;;;
+B74B;HANGUL SYLLABLE DDYID;Lo;0;L;;;;;N;;;;;
+B74C;HANGUL SYLLABLE DDYIL;Lo;0;L;;;;;N;;;;;
+B74D;HANGUL SYLLABLE DDYILG;Lo;0;L;;;;;N;;;;;
+B74E;HANGUL SYLLABLE DDYILM;Lo;0;L;;;;;N;;;;;
+B74F;HANGUL SYLLABLE DDYILB;Lo;0;L;;;;;N;;;;;
+B750;HANGUL SYLLABLE DDYILS;Lo;0;L;;;;;N;;;;;
+B751;HANGUL SYLLABLE DDYILT;Lo;0;L;;;;;N;;;;;
+B752;HANGUL SYLLABLE DDYILP;Lo;0;L;;;;;N;;;;;
+B753;HANGUL SYLLABLE DDYILH;Lo;0;L;;;;;N;;;;;
+B754;HANGUL SYLLABLE DDYIM;Lo;0;L;;;;;N;;;;;
+B755;HANGUL SYLLABLE DDYIB;Lo;0;L;;;;;N;;;;;
+B756;HANGUL SYLLABLE DDYIBS;Lo;0;L;;;;;N;;;;;
+B757;HANGUL SYLLABLE DDYIS;Lo;0;L;;;;;N;;;;;
+B758;HANGUL SYLLABLE DDYISS;Lo;0;L;;;;;N;;;;;
+B759;HANGUL SYLLABLE DDYING;Lo;0;L;;;;;N;;;;;
+B75A;HANGUL SYLLABLE DDYIJ;Lo;0;L;;;;;N;;;;;
+B75B;HANGUL SYLLABLE DDYIC;Lo;0;L;;;;;N;;;;;
+B75C;HANGUL SYLLABLE DDYIK;Lo;0;L;;;;;N;;;;;
+B75D;HANGUL SYLLABLE DDYIT;Lo;0;L;;;;;N;;;;;
+B75E;HANGUL SYLLABLE DDYIP;Lo;0;L;;;;;N;;;;;
+B75F;HANGUL SYLLABLE DDYIH;Lo;0;L;;;;;N;;;;;
+B760;HANGUL SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+B761;HANGUL SYLLABLE DDIG;Lo;0;L;;;;;N;;;;;
+B762;HANGUL SYLLABLE DDIGG;Lo;0;L;;;;;N;;;;;
+B763;HANGUL SYLLABLE DDIGS;Lo;0;L;;;;;N;;;;;
+B764;HANGUL SYLLABLE DDIN;Lo;0;L;;;;;N;;;;;
+B765;HANGUL SYLLABLE DDINI;Lo;0;L;;;;;N;;;;;
+B766;HANGUL SYLLABLE DDINH;Lo;0;L;;;;;N;;;;;
+B767;HANGUL SYLLABLE DDID;Lo;0;L;;;;;N;;;;;
+B768;HANGUL SYLLABLE DDIL;Lo;0;L;;;;;N;;;;;
+B769;HANGUL SYLLABLE DDILG;Lo;0;L;;;;;N;;;;;
+B76A;HANGUL SYLLABLE DDILM;Lo;0;L;;;;;N;;;;;
+B76B;HANGUL SYLLABLE DDILB;Lo;0;L;;;;;N;;;;;
+B76C;HANGUL SYLLABLE DDILS;Lo;0;L;;;;;N;;;;;
+B76D;HANGUL SYLLABLE DDILT;Lo;0;L;;;;;N;;;;;
+B76E;HANGUL SYLLABLE DDILP;Lo;0;L;;;;;N;;;;;
+B76F;HANGUL SYLLABLE DDILH;Lo;0;L;;;;;N;;;;;
+B770;HANGUL SYLLABLE DDIM;Lo;0;L;;;;;N;;;;;
+B771;HANGUL SYLLABLE DDIB;Lo;0;L;;;;;N;;;;;
+B772;HANGUL SYLLABLE DDIBS;Lo;0;L;;;;;N;;;;;
+B773;HANGUL SYLLABLE DDIS;Lo;0;L;;;;;N;;;;;
+B774;HANGUL SYLLABLE DDISS;Lo;0;L;;;;;N;;;;;
+B775;HANGUL SYLLABLE DDING;Lo;0;L;;;;;N;;;;;
+B776;HANGUL SYLLABLE DDIJ;Lo;0;L;;;;;N;;;;;
+B777;HANGUL SYLLABLE DDIC;Lo;0;L;;;;;N;;;;;
+B778;HANGUL SYLLABLE DDIK;Lo;0;L;;;;;N;;;;;
+B779;HANGUL SYLLABLE DDIT;Lo;0;L;;;;;N;;;;;
+B77A;HANGUL SYLLABLE DDIP;Lo;0;L;;;;;N;;;;;
+B77B;HANGUL SYLLABLE DDIH;Lo;0;L;;;;;N;;;;;
+B77C;HANGUL SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+B77D;HANGUL SYLLABLE RAG;Lo;0;L;;;;;N;;;;;
+B77E;HANGUL SYLLABLE RAGG;Lo;0;L;;;;;N;;;;;
+B77F;HANGUL SYLLABLE RAGS;Lo;0;L;;;;;N;;;;;
+B780;HANGUL SYLLABLE RAN;Lo;0;L;;;;;N;;;;;
+B781;HANGUL SYLLABLE RANI;Lo;0;L;;;;;N;;;;;
+B782;HANGUL SYLLABLE RANH;Lo;0;L;;;;;N;;;;;
+B783;HANGUL SYLLABLE RAD;Lo;0;L;;;;;N;;;;;
+B784;HANGUL SYLLABLE RAL;Lo;0;L;;;;;N;;;;;
+B785;HANGUL SYLLABLE RALG;Lo;0;L;;;;;N;;;;;
+B786;HANGUL SYLLABLE RALM;Lo;0;L;;;;;N;;;;;
+B787;HANGUL SYLLABLE RALB;Lo;0;L;;;;;N;;;;;
+B788;HANGUL SYLLABLE RALS;Lo;0;L;;;;;N;;;;;
+B789;HANGUL SYLLABLE RALT;Lo;0;L;;;;;N;;;;;
+B78A;HANGUL SYLLABLE RALP;Lo;0;L;;;;;N;;;;;
+B78B;HANGUL SYLLABLE RALH;Lo;0;L;;;;;N;;;;;
+B78C;HANGUL SYLLABLE RAM;Lo;0;L;;;;;N;;;;;
+B78D;HANGUL SYLLABLE RAB;Lo;0;L;;;;;N;;;;;
+B78E;HANGUL SYLLABLE RABS;Lo;0;L;;;;;N;;;;;
+B78F;HANGUL SYLLABLE RAS;Lo;0;L;;;;;N;;;;;
+B790;HANGUL SYLLABLE RASS;Lo;0;L;;;;;N;;;;;
+B791;HANGUL SYLLABLE RANG;Lo;0;L;;;;;N;;;;;
+B792;HANGUL SYLLABLE RAJ;Lo;0;L;;;;;N;;;;;
+B793;HANGUL SYLLABLE RAC;Lo;0;L;;;;;N;;;;;
+B794;HANGUL SYLLABLE RAK;Lo;0;L;;;;;N;;;;;
+B795;HANGUL SYLLABLE RAT;Lo;0;L;;;;;N;;;;;
+B796;HANGUL SYLLABLE RAP;Lo;0;L;;;;;N;;;;;
+B797;HANGUL SYLLABLE RAH;Lo;0;L;;;;;N;;;;;
+B798;HANGUL SYLLABLE RAE;Lo;0;L;;;;;N;;;;;
+B799;HANGUL SYLLABLE RAEG;Lo;0;L;;;;;N;;;;;
+B79A;HANGUL SYLLABLE RAEGG;Lo;0;L;;;;;N;;;;;
+B79B;HANGUL SYLLABLE RAEGS;Lo;0;L;;;;;N;;;;;
+B79C;HANGUL SYLLABLE RAEN;Lo;0;L;;;;;N;;;;;
+B79D;HANGUL SYLLABLE RAENI;Lo;0;L;;;;;N;;;;;
+B79E;HANGUL SYLLABLE RAENH;Lo;0;L;;;;;N;;;;;
+B79F;HANGUL SYLLABLE RAED;Lo;0;L;;;;;N;;;;;
+B7A0;HANGUL SYLLABLE RAEL;Lo;0;L;;;;;N;;;;;
+B7A1;HANGUL SYLLABLE RAELG;Lo;0;L;;;;;N;;;;;
+B7A2;HANGUL SYLLABLE RAELM;Lo;0;L;;;;;N;;;;;
+B7A3;HANGUL SYLLABLE RAELB;Lo;0;L;;;;;N;;;;;
+B7A4;HANGUL SYLLABLE RAELS;Lo;0;L;;;;;N;;;;;
+B7A5;HANGUL SYLLABLE RAELT;Lo;0;L;;;;;N;;;;;
+B7A6;HANGUL SYLLABLE RAELP;Lo;0;L;;;;;N;;;;;
+B7A7;HANGUL SYLLABLE RAELH;Lo;0;L;;;;;N;;;;;
+B7A8;HANGUL SYLLABLE RAEM;Lo;0;L;;;;;N;;;;;
+B7A9;HANGUL SYLLABLE RAEB;Lo;0;L;;;;;N;;;;;
+B7AA;HANGUL SYLLABLE RAEBS;Lo;0;L;;;;;N;;;;;
+B7AB;HANGUL SYLLABLE RAES;Lo;0;L;;;;;N;;;;;
+B7AC;HANGUL SYLLABLE RAESS;Lo;0;L;;;;;N;;;;;
+B7AD;HANGUL SYLLABLE RAENG;Lo;0;L;;;;;N;;;;;
+B7AE;HANGUL SYLLABLE RAEJ;Lo;0;L;;;;;N;;;;;
+B7AF;HANGUL SYLLABLE RAEC;Lo;0;L;;;;;N;;;;;
+B7B0;HANGUL SYLLABLE RAEK;Lo;0;L;;;;;N;;;;;
+B7B1;HANGUL SYLLABLE RAET;Lo;0;L;;;;;N;;;;;
+B7B2;HANGUL SYLLABLE RAEP;Lo;0;L;;;;;N;;;;;
+B7B3;HANGUL SYLLABLE RAEH;Lo;0;L;;;;;N;;;;;
+B7B4;HANGUL SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
+B7B5;HANGUL SYLLABLE RYAG;Lo;0;L;;;;;N;;;;;
+B7B6;HANGUL SYLLABLE RYAGG;Lo;0;L;;;;;N;;;;;
+B7B7;HANGUL SYLLABLE RYAGS;Lo;0;L;;;;;N;;;;;
+B7B8;HANGUL SYLLABLE RYAN;Lo;0;L;;;;;N;;;;;
+B7B9;HANGUL SYLLABLE RYANI;Lo;0;L;;;;;N;;;;;
+B7BA;HANGUL SYLLABLE RYANH;Lo;0;L;;;;;N;;;;;
+B7BB;HANGUL SYLLABLE RYAD;Lo;0;L;;;;;N;;;;;
+B7BC;HANGUL SYLLABLE RYAL;Lo;0;L;;;;;N;;;;;
+B7BD;HANGUL SYLLABLE RYALG;Lo;0;L;;;;;N;;;;;
+B7BE;HANGUL SYLLABLE RYALM;Lo;0;L;;;;;N;;;;;
+B7BF;HANGUL SYLLABLE RYALB;Lo;0;L;;;;;N;;;;;
+B7C0;HANGUL SYLLABLE RYALS;Lo;0;L;;;;;N;;;;;
+B7C1;HANGUL SYLLABLE RYALT;Lo;0;L;;;;;N;;;;;
+B7C2;HANGUL SYLLABLE RYALP;Lo;0;L;;;;;N;;;;;
+B7C3;HANGUL SYLLABLE RYALH;Lo;0;L;;;;;N;;;;;
+B7C4;HANGUL SYLLABLE RYAM;Lo;0;L;;;;;N;;;;;
+B7C5;HANGUL SYLLABLE RYAB;Lo;0;L;;;;;N;;;;;
+B7C6;HANGUL SYLLABLE RYABS;Lo;0;L;;;;;N;;;;;
+B7C7;HANGUL SYLLABLE RYAS;Lo;0;L;;;;;N;;;;;
+B7C8;HANGUL SYLLABLE RYASS;Lo;0;L;;;;;N;;;;;
+B7C9;HANGUL SYLLABLE RYANG;Lo;0;L;;;;;N;;;;;
+B7CA;HANGUL SYLLABLE RYAJ;Lo;0;L;;;;;N;;;;;
+B7CB;HANGUL SYLLABLE RYAC;Lo;0;L;;;;;N;;;;;
+B7CC;HANGUL SYLLABLE RYAK;Lo;0;L;;;;;N;;;;;
+B7CD;HANGUL SYLLABLE RYAT;Lo;0;L;;;;;N;;;;;
+B7CE;HANGUL SYLLABLE RYAP;Lo;0;L;;;;;N;;;;;
+B7CF;HANGUL SYLLABLE RYAH;Lo;0;L;;;;;N;;;;;
+B7D0;HANGUL SYLLABLE RYAE;Lo;0;L;;;;;N;;;;;
+B7D1;HANGUL SYLLABLE RYAEG;Lo;0;L;;;;;N;;;;;
+B7D2;HANGUL SYLLABLE RYAEGG;Lo;0;L;;;;;N;;;;;
+B7D3;HANGUL SYLLABLE RYAEGS;Lo;0;L;;;;;N;;;;;
+B7D4;HANGUL SYLLABLE RYAEN;Lo;0;L;;;;;N;;;;;
+B7D5;HANGUL SYLLABLE RYAENI;Lo;0;L;;;;;N;;;;;
+B7D6;HANGUL SYLLABLE RYAENH;Lo;0;L;;;;;N;;;;;
+B7D7;HANGUL SYLLABLE RYAED;Lo;0;L;;;;;N;;;;;
+B7D8;HANGUL SYLLABLE RYAEL;Lo;0;L;;;;;N;;;;;
+B7D9;HANGUL SYLLABLE RYAELG;Lo;0;L;;;;;N;;;;;
+B7DA;HANGUL SYLLABLE RYAELM;Lo;0;L;;;;;N;;;;;
+B7DB;HANGUL SYLLABLE RYAELB;Lo;0;L;;;;;N;;;;;
+B7DC;HANGUL SYLLABLE RYAELS;Lo;0;L;;;;;N;;;;;
+B7DD;HANGUL SYLLABLE RYAELT;Lo;0;L;;;;;N;;;;;
+B7DE;HANGUL SYLLABLE RYAELP;Lo;0;L;;;;;N;;;;;
+B7DF;HANGUL SYLLABLE RYAELH;Lo;0;L;;;;;N;;;;;
+B7E0;HANGUL SYLLABLE RYAEM;Lo;0;L;;;;;N;;;;;
+B7E1;HANGUL SYLLABLE RYAEB;Lo;0;L;;;;;N;;;;;
+B7E2;HANGUL SYLLABLE RYAEBS;Lo;0;L;;;;;N;;;;;
+B7E3;HANGUL SYLLABLE RYAES;Lo;0;L;;;;;N;;;;;
+B7E4;HANGUL SYLLABLE RYAESS;Lo;0;L;;;;;N;;;;;
+B7E5;HANGUL SYLLABLE RYAENG;Lo;0;L;;;;;N;;;;;
+B7E6;HANGUL SYLLABLE RYAEJ;Lo;0;L;;;;;N;;;;;
+B7E7;HANGUL SYLLABLE RYAEC;Lo;0;L;;;;;N;;;;;
+B7E8;HANGUL SYLLABLE RYAEK;Lo;0;L;;;;;N;;;;;
+B7E9;HANGUL SYLLABLE RYAET;Lo;0;L;;;;;N;;;;;
+B7EA;HANGUL SYLLABLE RYAEP;Lo;0;L;;;;;N;;;;;
+B7EB;HANGUL SYLLABLE RYAEH;Lo;0;L;;;;;N;;;;;
+B7EC;HANGUL SYLLABLE REO;Lo;0;L;;;;;N;;;;;
+B7ED;HANGUL SYLLABLE REOG;Lo;0;L;;;;;N;;;;;
+B7EE;HANGUL SYLLABLE REOGG;Lo;0;L;;;;;N;;;;;
+B7EF;HANGUL SYLLABLE REOGS;Lo;0;L;;;;;N;;;;;
+B7F0;HANGUL SYLLABLE REON;Lo;0;L;;;;;N;;;;;
+B7F1;HANGUL SYLLABLE REONI;Lo;0;L;;;;;N;;;;;
+B7F2;HANGUL SYLLABLE REONH;Lo;0;L;;;;;N;;;;;
+B7F3;HANGUL SYLLABLE REOD;Lo;0;L;;;;;N;;;;;
+B7F4;HANGUL SYLLABLE REOL;Lo;0;L;;;;;N;;;;;
+B7F5;HANGUL SYLLABLE REOLG;Lo;0;L;;;;;N;;;;;
+B7F6;HANGUL SYLLABLE REOLM;Lo;0;L;;;;;N;;;;;
+B7F7;HANGUL SYLLABLE REOLB;Lo;0;L;;;;;N;;;;;
+B7F8;HANGUL SYLLABLE REOLS;Lo;0;L;;;;;N;;;;;
+B7F9;HANGUL SYLLABLE REOLT;Lo;0;L;;;;;N;;;;;
+B7FA;HANGUL SYLLABLE REOLP;Lo;0;L;;;;;N;;;;;
+B7FB;HANGUL SYLLABLE REOLH;Lo;0;L;;;;;N;;;;;
+B7FC;HANGUL SYLLABLE REOM;Lo;0;L;;;;;N;;;;;
+B7FD;HANGUL SYLLABLE REOB;Lo;0;L;;;;;N;;;;;
+B7FE;HANGUL SYLLABLE REOBS;Lo;0;L;;;;;N;;;;;
+B7FF;HANGUL SYLLABLE REOS;Lo;0;L;;;;;N;;;;;
+B800;HANGUL SYLLABLE REOSS;Lo;0;L;;;;;N;;;;;
+B801;HANGUL SYLLABLE REONG;Lo;0;L;;;;;N;;;;;
+B802;HANGUL SYLLABLE REOJ;Lo;0;L;;;;;N;;;;;
+B803;HANGUL SYLLABLE REOC;Lo;0;L;;;;;N;;;;;
+B804;HANGUL SYLLABLE REOK;Lo;0;L;;;;;N;;;;;
+B805;HANGUL SYLLABLE REOT;Lo;0;L;;;;;N;;;;;
+B806;HANGUL SYLLABLE REOP;Lo;0;L;;;;;N;;;;;
+B807;HANGUL SYLLABLE REOH;Lo;0;L;;;;;N;;;;;
+B808;HANGUL SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+B809;HANGUL SYLLABLE REG;Lo;0;L;;;;;N;;;;;
+B80A;HANGUL SYLLABLE REGG;Lo;0;L;;;;;N;;;;;
+B80B;HANGUL SYLLABLE REGS;Lo;0;L;;;;;N;;;;;
+B80C;HANGUL SYLLABLE REN;Lo;0;L;;;;;N;;;;;
+B80D;HANGUL SYLLABLE RENI;Lo;0;L;;;;;N;;;;;
+B80E;HANGUL SYLLABLE RENH;Lo;0;L;;;;;N;;;;;
+B80F;HANGUL SYLLABLE RED;Lo;0;L;;;;;N;;;;;
+B810;HANGUL SYLLABLE REL;Lo;0;L;;;;;N;;;;;
+B811;HANGUL SYLLABLE RELG;Lo;0;L;;;;;N;;;;;
+B812;HANGUL SYLLABLE RELM;Lo;0;L;;;;;N;;;;;
+B813;HANGUL SYLLABLE RELB;Lo;0;L;;;;;N;;;;;
+B814;HANGUL SYLLABLE RELS;Lo;0;L;;;;;N;;;;;
+B815;HANGUL SYLLABLE RELT;Lo;0;L;;;;;N;;;;;
+B816;HANGUL SYLLABLE RELP;Lo;0;L;;;;;N;;;;;
+B817;HANGUL SYLLABLE RELH;Lo;0;L;;;;;N;;;;;
+B818;HANGUL SYLLABLE REM;Lo;0;L;;;;;N;;;;;
+B819;HANGUL SYLLABLE REB;Lo;0;L;;;;;N;;;;;
+B81A;HANGUL SYLLABLE REBS;Lo;0;L;;;;;N;;;;;
+B81B;HANGUL SYLLABLE RES;Lo;0;L;;;;;N;;;;;
+B81C;HANGUL SYLLABLE RESS;Lo;0;L;;;;;N;;;;;
+B81D;HANGUL SYLLABLE RENG;Lo;0;L;;;;;N;;;;;
+B81E;HANGUL SYLLABLE REJ;Lo;0;L;;;;;N;;;;;
+B81F;HANGUL SYLLABLE REC;Lo;0;L;;;;;N;;;;;
+B820;HANGUL SYLLABLE REK;Lo;0;L;;;;;N;;;;;
+B821;HANGUL SYLLABLE RET;Lo;0;L;;;;;N;;;;;
+B822;HANGUL SYLLABLE REP;Lo;0;L;;;;;N;;;;;
+B823;HANGUL SYLLABLE REH;Lo;0;L;;;;;N;;;;;
+B824;HANGUL SYLLABLE RYEO;Lo;0;L;;;;;N;;;;;
+B825;HANGUL SYLLABLE RYEOG;Lo;0;L;;;;;N;;;;;
+B826;HANGUL SYLLABLE RYEOGG;Lo;0;L;;;;;N;;;;;
+B827;HANGUL SYLLABLE RYEOGS;Lo;0;L;;;;;N;;;;;
+B828;HANGUL SYLLABLE RYEON;Lo;0;L;;;;;N;;;;;
+B829;HANGUL SYLLABLE RYEONI;Lo;0;L;;;;;N;;;;;
+B82A;HANGUL SYLLABLE RYEONH;Lo;0;L;;;;;N;;;;;
+B82B;HANGUL SYLLABLE RYEOD;Lo;0;L;;;;;N;;;;;
+B82C;HANGUL SYLLABLE RYEOL;Lo;0;L;;;;;N;;;;;
+B82D;HANGUL SYLLABLE RYEOLG;Lo;0;L;;;;;N;;;;;
+B82E;HANGUL SYLLABLE RYEOLM;Lo;0;L;;;;;N;;;;;
+B82F;HANGUL SYLLABLE RYEOLB;Lo;0;L;;;;;N;;;;;
+B830;HANGUL SYLLABLE RYEOLS;Lo;0;L;;;;;N;;;;;
+B831;HANGUL SYLLABLE RYEOLT;Lo;0;L;;;;;N;;;;;
+B832;HANGUL SYLLABLE RYEOLP;Lo;0;L;;;;;N;;;;;
+B833;HANGUL SYLLABLE RYEOLH;Lo;0;L;;;;;N;;;;;
+B834;HANGUL SYLLABLE RYEOM;Lo;0;L;;;;;N;;;;;
+B835;HANGUL SYLLABLE RYEOB;Lo;0;L;;;;;N;;;;;
+B836;HANGUL SYLLABLE RYEOBS;Lo;0;L;;;;;N;;;;;
+B837;HANGUL SYLLABLE RYEOS;Lo;0;L;;;;;N;;;;;
+B838;HANGUL SYLLABLE RYEOSS;Lo;0;L;;;;;N;;;;;
+B839;HANGUL SYLLABLE RYEONG;Lo;0;L;;;;;N;;;;;
+B83A;HANGUL SYLLABLE RYEOJ;Lo;0;L;;;;;N;;;;;
+B83B;HANGUL SYLLABLE RYEOC;Lo;0;L;;;;;N;;;;;
+B83C;HANGUL SYLLABLE RYEOK;Lo;0;L;;;;;N;;;;;
+B83D;HANGUL SYLLABLE RYEOT;Lo;0;L;;;;;N;;;;;
+B83E;HANGUL SYLLABLE RYEOP;Lo;0;L;;;;;N;;;;;
+B83F;HANGUL SYLLABLE RYEOH;Lo;0;L;;;;;N;;;;;
+B840;HANGUL SYLLABLE RYE;Lo;0;L;;;;;N;;;;;
+B841;HANGUL SYLLABLE RYEG;Lo;0;L;;;;;N;;;;;
+B842;HANGUL SYLLABLE RYEGG;Lo;0;L;;;;;N;;;;;
+B843;HANGUL SYLLABLE RYEGS;Lo;0;L;;;;;N;;;;;
+B844;HANGUL SYLLABLE RYEN;Lo;0;L;;;;;N;;;;;
+B845;HANGUL SYLLABLE RYENI;Lo;0;L;;;;;N;;;;;
+B846;HANGUL SYLLABLE RYENH;Lo;0;L;;;;;N;;;;;
+B847;HANGUL SYLLABLE RYED;Lo;0;L;;;;;N;;;;;
+B848;HANGUL SYLLABLE RYEL;Lo;0;L;;;;;N;;;;;
+B849;HANGUL SYLLABLE RYELG;Lo;0;L;;;;;N;;;;;
+B84A;HANGUL SYLLABLE RYELM;Lo;0;L;;;;;N;;;;;
+B84B;HANGUL SYLLABLE RYELB;Lo;0;L;;;;;N;;;;;
+B84C;HANGUL SYLLABLE RYELS;Lo;0;L;;;;;N;;;;;
+B84D;HANGUL SYLLABLE RYELT;Lo;0;L;;;;;N;;;;;
+B84E;HANGUL SYLLABLE RYELP;Lo;0;L;;;;;N;;;;;
+B84F;HANGUL SYLLABLE RYELH;Lo;0;L;;;;;N;;;;;
+B850;HANGUL SYLLABLE RYEM;Lo;0;L;;;;;N;;;;;
+B851;HANGUL SYLLABLE RYEB;Lo;0;L;;;;;N;;;;;
+B852;HANGUL SYLLABLE RYEBS;Lo;0;L;;;;;N;;;;;
+B853;HANGUL SYLLABLE RYES;Lo;0;L;;;;;N;;;;;
+B854;HANGUL SYLLABLE RYESS;Lo;0;L;;;;;N;;;;;
+B855;HANGUL SYLLABLE RYENG;Lo;0;L;;;;;N;;;;;
+B856;HANGUL SYLLABLE RYEJ;Lo;0;L;;;;;N;;;;;
+B857;HANGUL SYLLABLE RYEC;Lo;0;L;;;;;N;;;;;
+B858;HANGUL SYLLABLE RYEK;Lo;0;L;;;;;N;;;;;
+B859;HANGUL SYLLABLE RYET;Lo;0;L;;;;;N;;;;;
+B85A;HANGUL SYLLABLE RYEP;Lo;0;L;;;;;N;;;;;
+B85B;HANGUL SYLLABLE RYEH;Lo;0;L;;;;;N;;;;;
+B85C;HANGUL SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+B85D;HANGUL SYLLABLE ROG;Lo;0;L;;;;;N;;;;;
+B85E;HANGUL SYLLABLE ROGG;Lo;0;L;;;;;N;;;;;
+B85F;HANGUL SYLLABLE ROGS;Lo;0;L;;;;;N;;;;;
+B860;HANGUL SYLLABLE RON;Lo;0;L;;;;;N;;;;;
+B861;HANGUL SYLLABLE RONI;Lo;0;L;;;;;N;;;;;
+B862;HANGUL SYLLABLE RONH;Lo;0;L;;;;;N;;;;;
+B863;HANGUL SYLLABLE ROD;Lo;0;L;;;;;N;;;;;
+B864;HANGUL SYLLABLE ROL;Lo;0;L;;;;;N;;;;;
+B865;HANGUL SYLLABLE ROLG;Lo;0;L;;;;;N;;;;;
+B866;HANGUL SYLLABLE ROLM;Lo;0;L;;;;;N;;;;;
+B867;HANGUL SYLLABLE ROLB;Lo;0;L;;;;;N;;;;;
+B868;HANGUL SYLLABLE ROLS;Lo;0;L;;;;;N;;;;;
+B869;HANGUL SYLLABLE ROLT;Lo;0;L;;;;;N;;;;;
+B86A;HANGUL SYLLABLE ROLP;Lo;0;L;;;;;N;;;;;
+B86B;HANGUL SYLLABLE ROLH;Lo;0;L;;;;;N;;;;;
+B86C;HANGUL SYLLABLE ROM;Lo;0;L;;;;;N;;;;;
+B86D;HANGUL SYLLABLE ROB;Lo;0;L;;;;;N;;;;;
+B86E;HANGUL SYLLABLE ROBS;Lo;0;L;;;;;N;;;;;
+B86F;HANGUL SYLLABLE ROS;Lo;0;L;;;;;N;;;;;
+B870;HANGUL SYLLABLE ROSS;Lo;0;L;;;;;N;;;;;
+B871;HANGUL SYLLABLE RONG;Lo;0;L;;;;;N;;;;;
+B872;HANGUL SYLLABLE ROJ;Lo;0;L;;;;;N;;;;;
+B873;HANGUL SYLLABLE ROC;Lo;0;L;;;;;N;;;;;
+B874;HANGUL SYLLABLE ROK;Lo;0;L;;;;;N;;;;;
+B875;HANGUL SYLLABLE ROT;Lo;0;L;;;;;N;;;;;
+B876;HANGUL SYLLABLE ROP;Lo;0;L;;;;;N;;;;;
+B877;HANGUL SYLLABLE ROH;Lo;0;L;;;;;N;;;;;
+B878;HANGUL SYLLABLE RWA;Lo;0;L;;;;;N;;;;;
+B879;HANGUL SYLLABLE RWAG;Lo;0;L;;;;;N;;;;;
+B87A;HANGUL SYLLABLE RWAGG;Lo;0;L;;;;;N;;;;;
+B87B;HANGUL SYLLABLE RWAGS;Lo;0;L;;;;;N;;;;;
+B87C;HANGUL SYLLABLE RWAN;Lo;0;L;;;;;N;;;;;
+B87D;HANGUL SYLLABLE RWANI;Lo;0;L;;;;;N;;;;;
+B87E;HANGUL SYLLABLE RWANH;Lo;0;L;;;;;N;;;;;
+B87F;HANGUL SYLLABLE RWAD;Lo;0;L;;;;;N;;;;;
+B880;HANGUL SYLLABLE RWAL;Lo;0;L;;;;;N;;;;;
+B881;HANGUL SYLLABLE RWALG;Lo;0;L;;;;;N;;;;;
+B882;HANGUL SYLLABLE RWALM;Lo;0;L;;;;;N;;;;;
+B883;HANGUL SYLLABLE RWALB;Lo;0;L;;;;;N;;;;;
+B884;HANGUL SYLLABLE RWALS;Lo;0;L;;;;;N;;;;;
+B885;HANGUL SYLLABLE RWALT;Lo;0;L;;;;;N;;;;;
+B886;HANGUL SYLLABLE RWALP;Lo;0;L;;;;;N;;;;;
+B887;HANGUL SYLLABLE RWALH;Lo;0;L;;;;;N;;;;;
+B888;HANGUL SYLLABLE RWAM;Lo;0;L;;;;;N;;;;;
+B889;HANGUL SYLLABLE RWAB;Lo;0;L;;;;;N;;;;;
+B88A;HANGUL SYLLABLE RWABS;Lo;0;L;;;;;N;;;;;
+B88B;HANGUL SYLLABLE RWAS;Lo;0;L;;;;;N;;;;;
+B88C;HANGUL SYLLABLE RWASS;Lo;0;L;;;;;N;;;;;
+B88D;HANGUL SYLLABLE RWANG;Lo;0;L;;;;;N;;;;;
+B88E;HANGUL SYLLABLE RWAJ;Lo;0;L;;;;;N;;;;;
+B88F;HANGUL SYLLABLE RWAC;Lo;0;L;;;;;N;;;;;
+B890;HANGUL SYLLABLE RWAK;Lo;0;L;;;;;N;;;;;
+B891;HANGUL SYLLABLE RWAT;Lo;0;L;;;;;N;;;;;
+B892;HANGUL SYLLABLE RWAP;Lo;0;L;;;;;N;;;;;
+B893;HANGUL SYLLABLE RWAH;Lo;0;L;;;;;N;;;;;
+B894;HANGUL SYLLABLE RWAE;Lo;0;L;;;;;N;;;;;
+B895;HANGUL SYLLABLE RWAEG;Lo;0;L;;;;;N;;;;;
+B896;HANGUL SYLLABLE RWAEGG;Lo;0;L;;;;;N;;;;;
+B897;HANGUL SYLLABLE RWAEGS;Lo;0;L;;;;;N;;;;;
+B898;HANGUL SYLLABLE RWAEN;Lo;0;L;;;;;N;;;;;
+B899;HANGUL SYLLABLE RWAENI;Lo;0;L;;;;;N;;;;;
+B89A;HANGUL SYLLABLE RWAENH;Lo;0;L;;;;;N;;;;;
+B89B;HANGUL SYLLABLE RWAED;Lo;0;L;;;;;N;;;;;
+B89C;HANGUL SYLLABLE RWAEL;Lo;0;L;;;;;N;;;;;
+B89D;HANGUL SYLLABLE RWAELG;Lo;0;L;;;;;N;;;;;
+B89E;HANGUL SYLLABLE RWAELM;Lo;0;L;;;;;N;;;;;
+B89F;HANGUL SYLLABLE RWAELB;Lo;0;L;;;;;N;;;;;
+B8A0;HANGUL SYLLABLE RWAELS;Lo;0;L;;;;;N;;;;;
+B8A1;HANGUL SYLLABLE RWAELT;Lo;0;L;;;;;N;;;;;
+B8A2;HANGUL SYLLABLE RWAELP;Lo;0;L;;;;;N;;;;;
+B8A3;HANGUL SYLLABLE RWAELH;Lo;0;L;;;;;N;;;;;
+B8A4;HANGUL SYLLABLE RWAEM;Lo;0;L;;;;;N;;;;;
+B8A5;HANGUL SYLLABLE RWAEB;Lo;0;L;;;;;N;;;;;
+B8A6;HANGUL SYLLABLE RWAEBS;Lo;0;L;;;;;N;;;;;
+B8A7;HANGUL SYLLABLE RWAES;Lo;0;L;;;;;N;;;;;
+B8A8;HANGUL SYLLABLE RWAESS;Lo;0;L;;;;;N;;;;;
+B8A9;HANGUL SYLLABLE RWAENG;Lo;0;L;;;;;N;;;;;
+B8AA;HANGUL SYLLABLE RWAEJ;Lo;0;L;;;;;N;;;;;
+B8AB;HANGUL SYLLABLE RWAEC;Lo;0;L;;;;;N;;;;;
+B8AC;HANGUL SYLLABLE RWAEK;Lo;0;L;;;;;N;;;;;
+B8AD;HANGUL SYLLABLE RWAET;Lo;0;L;;;;;N;;;;;
+B8AE;HANGUL SYLLABLE RWAEP;Lo;0;L;;;;;N;;;;;
+B8AF;HANGUL SYLLABLE RWAEH;Lo;0;L;;;;;N;;;;;
+B8B0;HANGUL SYLLABLE ROE;Lo;0;L;;;;;N;;;;;
+B8B1;HANGUL SYLLABLE ROEG;Lo;0;L;;;;;N;;;;;
+B8B2;HANGUL SYLLABLE ROEGG;Lo;0;L;;;;;N;;;;;
+B8B3;HANGUL SYLLABLE ROEGS;Lo;0;L;;;;;N;;;;;
+B8B4;HANGUL SYLLABLE ROEN;Lo;0;L;;;;;N;;;;;
+B8B5;HANGUL SYLLABLE ROENI;Lo;0;L;;;;;N;;;;;
+B8B6;HANGUL SYLLABLE ROENH;Lo;0;L;;;;;N;;;;;
+B8B7;HANGUL SYLLABLE ROED;Lo;0;L;;;;;N;;;;;
+B8B8;HANGUL SYLLABLE ROEL;Lo;0;L;;;;;N;;;;;
+B8B9;HANGUL SYLLABLE ROELG;Lo;0;L;;;;;N;;;;;
+B8BA;HANGUL SYLLABLE ROELM;Lo;0;L;;;;;N;;;;;
+B8BB;HANGUL SYLLABLE ROELB;Lo;0;L;;;;;N;;;;;
+B8BC;HANGUL SYLLABLE ROELS;Lo;0;L;;;;;N;;;;;
+B8BD;HANGUL SYLLABLE ROELT;Lo;0;L;;;;;N;;;;;
+B8BE;HANGUL SYLLABLE ROELP;Lo;0;L;;;;;N;;;;;
+B8BF;HANGUL SYLLABLE ROELH;Lo;0;L;;;;;N;;;;;
+B8C0;HANGUL SYLLABLE ROEM;Lo;0;L;;;;;N;;;;;
+B8C1;HANGUL SYLLABLE ROEB;Lo;0;L;;;;;N;;;;;
+B8C2;HANGUL SYLLABLE ROEBS;Lo;0;L;;;;;N;;;;;
+B8C3;HANGUL SYLLABLE ROES;Lo;0;L;;;;;N;;;;;
+B8C4;HANGUL SYLLABLE ROESS;Lo;0;L;;;;;N;;;;;
+B8C5;HANGUL SYLLABLE ROENG;Lo;0;L;;;;;N;;;;;
+B8C6;HANGUL SYLLABLE ROEJ;Lo;0;L;;;;;N;;;;;
+B8C7;HANGUL SYLLABLE ROEC;Lo;0;L;;;;;N;;;;;
+B8C8;HANGUL SYLLABLE ROEK;Lo;0;L;;;;;N;;;;;
+B8C9;HANGUL SYLLABLE ROET;Lo;0;L;;;;;N;;;;;
+B8CA;HANGUL SYLLABLE ROEP;Lo;0;L;;;;;N;;;;;
+B8CB;HANGUL SYLLABLE ROEH;Lo;0;L;;;;;N;;;;;
+B8CC;HANGUL SYLLABLE RYO;Lo;0;L;;;;;N;;;;;
+B8CD;HANGUL SYLLABLE RYOG;Lo;0;L;;;;;N;;;;;
+B8CE;HANGUL SYLLABLE RYOGG;Lo;0;L;;;;;N;;;;;
+B8CF;HANGUL SYLLABLE RYOGS;Lo;0;L;;;;;N;;;;;
+B8D0;HANGUL SYLLABLE RYON;Lo;0;L;;;;;N;;;;;
+B8D1;HANGUL SYLLABLE RYONI;Lo;0;L;;;;;N;;;;;
+B8D2;HANGUL SYLLABLE RYONH;Lo;0;L;;;;;N;;;;;
+B8D3;HANGUL SYLLABLE RYOD;Lo;0;L;;;;;N;;;;;
+B8D4;HANGUL SYLLABLE RYOL;Lo;0;L;;;;;N;;;;;
+B8D5;HANGUL SYLLABLE RYOLG;Lo;0;L;;;;;N;;;;;
+B8D6;HANGUL SYLLABLE RYOLM;Lo;0;L;;;;;N;;;;;
+B8D7;HANGUL SYLLABLE RYOLB;Lo;0;L;;;;;N;;;;;
+B8D8;HANGUL SYLLABLE RYOLS;Lo;0;L;;;;;N;;;;;
+B8D9;HANGUL SYLLABLE RYOLT;Lo;0;L;;;;;N;;;;;
+B8DA;HANGUL SYLLABLE RYOLP;Lo;0;L;;;;;N;;;;;
+B8DB;HANGUL SYLLABLE RYOLH;Lo;0;L;;;;;N;;;;;
+B8DC;HANGUL SYLLABLE RYOM;Lo;0;L;;;;;N;;;;;
+B8DD;HANGUL SYLLABLE RYOB;Lo;0;L;;;;;N;;;;;
+B8DE;HANGUL SYLLABLE RYOBS;Lo;0;L;;;;;N;;;;;
+B8DF;HANGUL SYLLABLE RYOS;Lo;0;L;;;;;N;;;;;
+B8E0;HANGUL SYLLABLE RYOSS;Lo;0;L;;;;;N;;;;;
+B8E1;HANGUL SYLLABLE RYONG;Lo;0;L;;;;;N;;;;;
+B8E2;HANGUL SYLLABLE RYOJ;Lo;0;L;;;;;N;;;;;
+B8E3;HANGUL SYLLABLE RYOC;Lo;0;L;;;;;N;;;;;
+B8E4;HANGUL SYLLABLE RYOK;Lo;0;L;;;;;N;;;;;
+B8E5;HANGUL SYLLABLE RYOT;Lo;0;L;;;;;N;;;;;
+B8E6;HANGUL SYLLABLE RYOP;Lo;0;L;;;;;N;;;;;
+B8E7;HANGUL SYLLABLE RYOH;Lo;0;L;;;;;N;;;;;
+B8E8;HANGUL SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+B8E9;HANGUL SYLLABLE RUG;Lo;0;L;;;;;N;;;;;
+B8EA;HANGUL SYLLABLE RUGG;Lo;0;L;;;;;N;;;;;
+B8EB;HANGUL SYLLABLE RUGS;Lo;0;L;;;;;N;;;;;
+B8EC;HANGUL SYLLABLE RUN;Lo;0;L;;;;;N;;;;;
+B8ED;HANGUL SYLLABLE RUNI;Lo;0;L;;;;;N;;;;;
+B8EE;HANGUL SYLLABLE RUNH;Lo;0;L;;;;;N;;;;;
+B8EF;HANGUL SYLLABLE RUD;Lo;0;L;;;;;N;;;;;
+B8F0;HANGUL SYLLABLE RUL;Lo;0;L;;;;;N;;;;;
+B8F1;HANGUL SYLLABLE RULG;Lo;0;L;;;;;N;;;;;
+B8F2;HANGUL SYLLABLE RULM;Lo;0;L;;;;;N;;;;;
+B8F3;HANGUL SYLLABLE RULB;Lo;0;L;;;;;N;;;;;
+B8F4;HANGUL SYLLABLE RULS;Lo;0;L;;;;;N;;;;;
+B8F5;HANGUL SYLLABLE RULT;Lo;0;L;;;;;N;;;;;
+B8F6;HANGUL SYLLABLE RULP;Lo;0;L;;;;;N;;;;;
+B8F7;HANGUL SYLLABLE RULH;Lo;0;L;;;;;N;;;;;
+B8F8;HANGUL SYLLABLE RUM;Lo;0;L;;;;;N;;;;;
+B8F9;HANGUL SYLLABLE RUB;Lo;0;L;;;;;N;;;;;
+B8FA;HANGUL SYLLABLE RUBS;Lo;0;L;;;;;N;;;;;
+B8FB;HANGUL SYLLABLE RUS;Lo;0;L;;;;;N;;;;;
+B8FC;HANGUL SYLLABLE RUSS;Lo;0;L;;;;;N;;;;;
+B8FD;HANGUL SYLLABLE RUNG;Lo;0;L;;;;;N;;;;;
+B8FE;HANGUL SYLLABLE RUJ;Lo;0;L;;;;;N;;;;;
+B8FF;HANGUL SYLLABLE RUC;Lo;0;L;;;;;N;;;;;
+B900;HANGUL SYLLABLE RUK;Lo;0;L;;;;;N;;;;;
+B901;HANGUL SYLLABLE RUT;Lo;0;L;;;;;N;;;;;
+B902;HANGUL SYLLABLE RUP;Lo;0;L;;;;;N;;;;;
+B903;HANGUL SYLLABLE RUH;Lo;0;L;;;;;N;;;;;
+B904;HANGUL SYLLABLE RWEO;Lo;0;L;;;;;N;;;;;
+B905;HANGUL SYLLABLE RWEOG;Lo;0;L;;;;;N;;;;;
+B906;HANGUL SYLLABLE RWEOGG;Lo;0;L;;;;;N;;;;;
+B907;HANGUL SYLLABLE RWEOGS;Lo;0;L;;;;;N;;;;;
+B908;HANGUL SYLLABLE RWEON;Lo;0;L;;;;;N;;;;;
+B909;HANGUL SYLLABLE RWEONI;Lo;0;L;;;;;N;;;;;
+B90A;HANGUL SYLLABLE RWEONH;Lo;0;L;;;;;N;;;;;
+B90B;HANGUL SYLLABLE RWEOD;Lo;0;L;;;;;N;;;;;
+B90C;HANGUL SYLLABLE RWEOL;Lo;0;L;;;;;N;;;;;
+B90D;HANGUL SYLLABLE RWEOLG;Lo;0;L;;;;;N;;;;;
+B90E;HANGUL SYLLABLE RWEOLM;Lo;0;L;;;;;N;;;;;
+B90F;HANGUL SYLLABLE RWEOLB;Lo;0;L;;;;;N;;;;;
+B910;HANGUL SYLLABLE RWEOLS;Lo;0;L;;;;;N;;;;;
+B911;HANGUL SYLLABLE RWEOLT;Lo;0;L;;;;;N;;;;;
+B912;HANGUL SYLLABLE RWEOLP;Lo;0;L;;;;;N;;;;;
+B913;HANGUL SYLLABLE RWEOLH;Lo;0;L;;;;;N;;;;;
+B914;HANGUL SYLLABLE RWEOM;Lo;0;L;;;;;N;;;;;
+B915;HANGUL SYLLABLE RWEOB;Lo;0;L;;;;;N;;;;;
+B916;HANGUL SYLLABLE RWEOBS;Lo;0;L;;;;;N;;;;;
+B917;HANGUL SYLLABLE RWEOS;Lo;0;L;;;;;N;;;;;
+B918;HANGUL SYLLABLE RWEOSS;Lo;0;L;;;;;N;;;;;
+B919;HANGUL SYLLABLE RWEONG;Lo;0;L;;;;;N;;;;;
+B91A;HANGUL SYLLABLE RWEOJ;Lo;0;L;;;;;N;;;;;
+B91B;HANGUL SYLLABLE RWEOC;Lo;0;L;;;;;N;;;;;
+B91C;HANGUL SYLLABLE RWEOK;Lo;0;L;;;;;N;;;;;
+B91D;HANGUL SYLLABLE RWEOT;Lo;0;L;;;;;N;;;;;
+B91E;HANGUL SYLLABLE RWEOP;Lo;0;L;;;;;N;;;;;
+B91F;HANGUL SYLLABLE RWEOH;Lo;0;L;;;;;N;;;;;
+B920;HANGUL SYLLABLE RWE;Lo;0;L;;;;;N;;;;;
+B921;HANGUL SYLLABLE RWEG;Lo;0;L;;;;;N;;;;;
+B922;HANGUL SYLLABLE RWEGG;Lo;0;L;;;;;N;;;;;
+B923;HANGUL SYLLABLE RWEGS;Lo;0;L;;;;;N;;;;;
+B924;HANGUL SYLLABLE RWEN;Lo;0;L;;;;;N;;;;;
+B925;HANGUL SYLLABLE RWENI;Lo;0;L;;;;;N;;;;;
+B926;HANGUL SYLLABLE RWENH;Lo;0;L;;;;;N;;;;;
+B927;HANGUL SYLLABLE RWED;Lo;0;L;;;;;N;;;;;
+B928;HANGUL SYLLABLE RWEL;Lo;0;L;;;;;N;;;;;
+B929;HANGUL SYLLABLE RWELG;Lo;0;L;;;;;N;;;;;
+B92A;HANGUL SYLLABLE RWELM;Lo;0;L;;;;;N;;;;;
+B92B;HANGUL SYLLABLE RWELB;Lo;0;L;;;;;N;;;;;
+B92C;HANGUL SYLLABLE RWELS;Lo;0;L;;;;;N;;;;;
+B92D;HANGUL SYLLABLE RWELT;Lo;0;L;;;;;N;;;;;
+B92E;HANGUL SYLLABLE RWELP;Lo;0;L;;;;;N;;;;;
+B92F;HANGUL SYLLABLE RWELH;Lo;0;L;;;;;N;;;;;
+B930;HANGUL SYLLABLE RWEM;Lo;0;L;;;;;N;;;;;
+B931;HANGUL SYLLABLE RWEB;Lo;0;L;;;;;N;;;;;
+B932;HANGUL SYLLABLE RWEBS;Lo;0;L;;;;;N;;;;;
+B933;HANGUL SYLLABLE RWES;Lo;0;L;;;;;N;;;;;
+B934;HANGUL SYLLABLE RWESS;Lo;0;L;;;;;N;;;;;
+B935;HANGUL SYLLABLE RWENG;Lo;0;L;;;;;N;;;;;
+B936;HANGUL SYLLABLE RWEJ;Lo;0;L;;;;;N;;;;;
+B937;HANGUL SYLLABLE RWEC;Lo;0;L;;;;;N;;;;;
+B938;HANGUL SYLLABLE RWEK;Lo;0;L;;;;;N;;;;;
+B939;HANGUL SYLLABLE RWET;Lo;0;L;;;;;N;;;;;
+B93A;HANGUL SYLLABLE RWEP;Lo;0;L;;;;;N;;;;;
+B93B;HANGUL SYLLABLE RWEH;Lo;0;L;;;;;N;;;;;
+B93C;HANGUL SYLLABLE RWI;Lo;0;L;;;;;N;;;;;
+B93D;HANGUL SYLLABLE RWIG;Lo;0;L;;;;;N;;;;;
+B93E;HANGUL SYLLABLE RWIGG;Lo;0;L;;;;;N;;;;;
+B93F;HANGUL SYLLABLE RWIGS;Lo;0;L;;;;;N;;;;;
+B940;HANGUL SYLLABLE RWIN;Lo;0;L;;;;;N;;;;;
+B941;HANGUL SYLLABLE RWINI;Lo;0;L;;;;;N;;;;;
+B942;HANGUL SYLLABLE RWINH;Lo;0;L;;;;;N;;;;;
+B943;HANGUL SYLLABLE RWID;Lo;0;L;;;;;N;;;;;
+B944;HANGUL SYLLABLE RWIL;Lo;0;L;;;;;N;;;;;
+B945;HANGUL SYLLABLE RWILG;Lo;0;L;;;;;N;;;;;
+B946;HANGUL SYLLABLE RWILM;Lo;0;L;;;;;N;;;;;
+B947;HANGUL SYLLABLE RWILB;Lo;0;L;;;;;N;;;;;
+B948;HANGUL SYLLABLE RWILS;Lo;0;L;;;;;N;;;;;
+B949;HANGUL SYLLABLE RWILT;Lo;0;L;;;;;N;;;;;
+B94A;HANGUL SYLLABLE RWILP;Lo;0;L;;;;;N;;;;;
+B94B;HANGUL SYLLABLE RWILH;Lo;0;L;;;;;N;;;;;
+B94C;HANGUL SYLLABLE RWIM;Lo;0;L;;;;;N;;;;;
+B94D;HANGUL SYLLABLE RWIB;Lo;0;L;;;;;N;;;;;
+B94E;HANGUL SYLLABLE RWIBS;Lo;0;L;;;;;N;;;;;
+B94F;HANGUL SYLLABLE RWIS;Lo;0;L;;;;;N;;;;;
+B950;HANGUL SYLLABLE RWISS;Lo;0;L;;;;;N;;;;;
+B951;HANGUL SYLLABLE RWING;Lo;0;L;;;;;N;;;;;
+B952;HANGUL SYLLABLE RWIJ;Lo;0;L;;;;;N;;;;;
+B953;HANGUL SYLLABLE RWIC;Lo;0;L;;;;;N;;;;;
+B954;HANGUL SYLLABLE RWIK;Lo;0;L;;;;;N;;;;;
+B955;HANGUL SYLLABLE RWIT;Lo;0;L;;;;;N;;;;;
+B956;HANGUL SYLLABLE RWIP;Lo;0;L;;;;;N;;;;;
+B957;HANGUL SYLLABLE RWIH;Lo;0;L;;;;;N;;;;;
+B958;HANGUL SYLLABLE RYU;Lo;0;L;;;;;N;;;;;
+B959;HANGUL SYLLABLE RYUG;Lo;0;L;;;;;N;;;;;
+B95A;HANGUL SYLLABLE RYUGG;Lo;0;L;;;;;N;;;;;
+B95B;HANGUL SYLLABLE RYUGS;Lo;0;L;;;;;N;;;;;
+B95C;HANGUL SYLLABLE RYUN;Lo;0;L;;;;;N;;;;;
+B95D;HANGUL SYLLABLE RYUNI;Lo;0;L;;;;;N;;;;;
+B95E;HANGUL SYLLABLE RYUNH;Lo;0;L;;;;;N;;;;;
+B95F;HANGUL SYLLABLE RYUD;Lo;0;L;;;;;N;;;;;
+B960;HANGUL SYLLABLE RYUL;Lo;0;L;;;;;N;;;;;
+B961;HANGUL SYLLABLE RYULG;Lo;0;L;;;;;N;;;;;
+B962;HANGUL SYLLABLE RYULM;Lo;0;L;;;;;N;;;;;
+B963;HANGUL SYLLABLE RYULB;Lo;0;L;;;;;N;;;;;
+B964;HANGUL SYLLABLE RYULS;Lo;0;L;;;;;N;;;;;
+B965;HANGUL SYLLABLE RYULT;Lo;0;L;;;;;N;;;;;
+B966;HANGUL SYLLABLE RYULP;Lo;0;L;;;;;N;;;;;
+B967;HANGUL SYLLABLE RYULH;Lo;0;L;;;;;N;;;;;
+B968;HANGUL SYLLABLE RYUM;Lo;0;L;;;;;N;;;;;
+B969;HANGUL SYLLABLE RYUB;Lo;0;L;;;;;N;;;;;
+B96A;HANGUL SYLLABLE RYUBS;Lo;0;L;;;;;N;;;;;
+B96B;HANGUL SYLLABLE RYUS;Lo;0;L;;;;;N;;;;;
+B96C;HANGUL SYLLABLE RYUSS;Lo;0;L;;;;;N;;;;;
+B96D;HANGUL SYLLABLE RYUNG;Lo;0;L;;;;;N;;;;;
+B96E;HANGUL SYLLABLE RYUJ;Lo;0;L;;;;;N;;;;;
+B96F;HANGUL SYLLABLE RYUC;Lo;0;L;;;;;N;;;;;
+B970;HANGUL SYLLABLE RYUK;Lo;0;L;;;;;N;;;;;
+B971;HANGUL SYLLABLE RYUT;Lo;0;L;;;;;N;;;;;
+B972;HANGUL SYLLABLE RYUP;Lo;0;L;;;;;N;;;;;
+B973;HANGUL SYLLABLE RYUH;Lo;0;L;;;;;N;;;;;
+B974;HANGUL SYLLABLE REU;Lo;0;L;;;;;N;;;;;
+B975;HANGUL SYLLABLE REUG;Lo;0;L;;;;;N;;;;;
+B976;HANGUL SYLLABLE REUGG;Lo;0;L;;;;;N;;;;;
+B977;HANGUL SYLLABLE REUGS;Lo;0;L;;;;;N;;;;;
+B978;HANGUL SYLLABLE REUN;Lo;0;L;;;;;N;;;;;
+B979;HANGUL SYLLABLE REUNI;Lo;0;L;;;;;N;;;;;
+B97A;HANGUL SYLLABLE REUNH;Lo;0;L;;;;;N;;;;;
+B97B;HANGUL SYLLABLE REUD;Lo;0;L;;;;;N;;;;;
+B97C;HANGUL SYLLABLE REUL;Lo;0;L;;;;;N;;;;;
+B97D;HANGUL SYLLABLE REULG;Lo;0;L;;;;;N;;;;;
+B97E;HANGUL SYLLABLE REULM;Lo;0;L;;;;;N;;;;;
+B97F;HANGUL SYLLABLE REULB;Lo;0;L;;;;;N;;;;;
+B980;HANGUL SYLLABLE REULS;Lo;0;L;;;;;N;;;;;
+B981;HANGUL SYLLABLE REULT;Lo;0;L;;;;;N;;;;;
+B982;HANGUL SYLLABLE REULP;Lo;0;L;;;;;N;;;;;
+B983;HANGUL SYLLABLE REULH;Lo;0;L;;;;;N;;;;;
+B984;HANGUL SYLLABLE REUM;Lo;0;L;;;;;N;;;;;
+B985;HANGUL SYLLABLE REUB;Lo;0;L;;;;;N;;;;;
+B986;HANGUL SYLLABLE REUBS;Lo;0;L;;;;;N;;;;;
+B987;HANGUL SYLLABLE REUS;Lo;0;L;;;;;N;;;;;
+B988;HANGUL SYLLABLE REUSS;Lo;0;L;;;;;N;;;;;
+B989;HANGUL SYLLABLE REUNG;Lo;0;L;;;;;N;;;;;
+B98A;HANGUL SYLLABLE REUJ;Lo;0;L;;;;;N;;;;;
+B98B;HANGUL SYLLABLE REUC;Lo;0;L;;;;;N;;;;;
+B98C;HANGUL SYLLABLE REUK;Lo;0;L;;;;;N;;;;;
+B98D;HANGUL SYLLABLE REUT;Lo;0;L;;;;;N;;;;;
+B98E;HANGUL SYLLABLE REUP;Lo;0;L;;;;;N;;;;;
+B98F;HANGUL SYLLABLE REUH;Lo;0;L;;;;;N;;;;;
+B990;HANGUL SYLLABLE RYI;Lo;0;L;;;;;N;;;;;
+B991;HANGUL SYLLABLE RYIG;Lo;0;L;;;;;N;;;;;
+B992;HANGUL SYLLABLE RYIGG;Lo;0;L;;;;;N;;;;;
+B993;HANGUL SYLLABLE RYIGS;Lo;0;L;;;;;N;;;;;
+B994;HANGUL SYLLABLE RYIN;Lo;0;L;;;;;N;;;;;
+B995;HANGUL SYLLABLE RYINI;Lo;0;L;;;;;N;;;;;
+B996;HANGUL SYLLABLE RYINH;Lo;0;L;;;;;N;;;;;
+B997;HANGUL SYLLABLE RYID;Lo;0;L;;;;;N;;;;;
+B998;HANGUL SYLLABLE RYIL;Lo;0;L;;;;;N;;;;;
+B999;HANGUL SYLLABLE RYILG;Lo;0;L;;;;;N;;;;;
+B99A;HANGUL SYLLABLE RYILM;Lo;0;L;;;;;N;;;;;
+B99B;HANGUL SYLLABLE RYILB;Lo;0;L;;;;;N;;;;;
+B99C;HANGUL SYLLABLE RYILS;Lo;0;L;;;;;N;;;;;
+B99D;HANGUL SYLLABLE RYILT;Lo;0;L;;;;;N;;;;;
+B99E;HANGUL SYLLABLE RYILP;Lo;0;L;;;;;N;;;;;
+B99F;HANGUL SYLLABLE RYILH;Lo;0;L;;;;;N;;;;;
+B9A0;HANGUL SYLLABLE RYIM;Lo;0;L;;;;;N;;;;;
+B9A1;HANGUL SYLLABLE RYIB;Lo;0;L;;;;;N;;;;;
+B9A2;HANGUL SYLLABLE RYIBS;Lo;0;L;;;;;N;;;;;
+B9A3;HANGUL SYLLABLE RYIS;Lo;0;L;;;;;N;;;;;
+B9A4;HANGUL SYLLABLE RYISS;Lo;0;L;;;;;N;;;;;
+B9A5;HANGUL SYLLABLE RYING;Lo;0;L;;;;;N;;;;;
+B9A6;HANGUL SYLLABLE RYIJ;Lo;0;L;;;;;N;;;;;
+B9A7;HANGUL SYLLABLE RYIC;Lo;0;L;;;;;N;;;;;
+B9A8;HANGUL SYLLABLE RYIK;Lo;0;L;;;;;N;;;;;
+B9A9;HANGUL SYLLABLE RYIT;Lo;0;L;;;;;N;;;;;
+B9AA;HANGUL SYLLABLE RYIP;Lo;0;L;;;;;N;;;;;
+B9AB;HANGUL SYLLABLE RYIH;Lo;0;L;;;;;N;;;;;
+B9AC;HANGUL SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+B9AD;HANGUL SYLLABLE RIG;Lo;0;L;;;;;N;;;;;
+B9AE;HANGUL SYLLABLE RIGG;Lo;0;L;;;;;N;;;;;
+B9AF;HANGUL SYLLABLE RIGS;Lo;0;L;;;;;N;;;;;
+B9B0;HANGUL SYLLABLE RIN;Lo;0;L;;;;;N;;;;;
+B9B1;HANGUL SYLLABLE RINI;Lo;0;L;;;;;N;;;;;
+B9B2;HANGUL SYLLABLE RINH;Lo;0;L;;;;;N;;;;;
+B9B3;HANGUL SYLLABLE RID;Lo;0;L;;;;;N;;;;;
+B9B4;HANGUL SYLLABLE RIL;Lo;0;L;;;;;N;;;;;
+B9B5;HANGUL SYLLABLE RILG;Lo;0;L;;;;;N;;;;;
+B9B6;HANGUL SYLLABLE RILM;Lo;0;L;;;;;N;;;;;
+B9B7;HANGUL SYLLABLE RILB;Lo;0;L;;;;;N;;;;;
+B9B8;HANGUL SYLLABLE RILS;Lo;0;L;;;;;N;;;;;
+B9B9;HANGUL SYLLABLE RILT;Lo;0;L;;;;;N;;;;;
+B9BA;HANGUL SYLLABLE RILP;Lo;0;L;;;;;N;;;;;
+B9BB;HANGUL SYLLABLE RILH;Lo;0;L;;;;;N;;;;;
+B9BC;HANGUL SYLLABLE RIM;Lo;0;L;;;;;N;;;;;
+B9BD;HANGUL SYLLABLE RIB;Lo;0;L;;;;;N;;;;;
+B9BE;HANGUL SYLLABLE RIBS;Lo;0;L;;;;;N;;;;;
+B9BF;HANGUL SYLLABLE RIS;Lo;0;L;;;;;N;;;;;
+B9C0;HANGUL SYLLABLE RISS;Lo;0;L;;;;;N;;;;;
+B9C1;HANGUL SYLLABLE RING;Lo;0;L;;;;;N;;;;;
+B9C2;HANGUL SYLLABLE RIJ;Lo;0;L;;;;;N;;;;;
+B9C3;HANGUL SYLLABLE RIC;Lo;0;L;;;;;N;;;;;
+B9C4;HANGUL SYLLABLE RIK;Lo;0;L;;;;;N;;;;;
+B9C5;HANGUL SYLLABLE RIT;Lo;0;L;;;;;N;;;;;
+B9C6;HANGUL SYLLABLE RIP;Lo;0;L;;;;;N;;;;;
+B9C7;HANGUL SYLLABLE RIH;Lo;0;L;;;;;N;;;;;
+B9C8;HANGUL SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+B9C9;HANGUL SYLLABLE MAG;Lo;0;L;;;;;N;;;;;
+B9CA;HANGUL SYLLABLE MAGG;Lo;0;L;;;;;N;;;;;
+B9CB;HANGUL SYLLABLE MAGS;Lo;0;L;;;;;N;;;;;
+B9CC;HANGUL SYLLABLE MAN;Lo;0;L;;;;;N;;;;;
+B9CD;HANGUL SYLLABLE MANI;Lo;0;L;;;;;N;;;;;
+B9CE;HANGUL SYLLABLE MANH;Lo;0;L;;;;;N;;;;;
+B9CF;HANGUL SYLLABLE MAD;Lo;0;L;;;;;N;;;;;
+B9D0;HANGUL SYLLABLE MAL;Lo;0;L;;;;;N;;;;;
+B9D1;HANGUL SYLLABLE MALG;Lo;0;L;;;;;N;;;;;
+B9D2;HANGUL SYLLABLE MALM;Lo;0;L;;;;;N;;;;;
+B9D3;HANGUL SYLLABLE MALB;Lo;0;L;;;;;N;;;;;
+B9D4;HANGUL SYLLABLE MALS;Lo;0;L;;;;;N;;;;;
+B9D5;HANGUL SYLLABLE MALT;Lo;0;L;;;;;N;;;;;
+B9D6;HANGUL SYLLABLE MALP;Lo;0;L;;;;;N;;;;;
+B9D7;HANGUL SYLLABLE MALH;Lo;0;L;;;;;N;;;;;
+B9D8;HANGUL SYLLABLE MAM;Lo;0;L;;;;;N;;;;;
+B9D9;HANGUL SYLLABLE MAB;Lo;0;L;;;;;N;;;;;
+B9DA;HANGUL SYLLABLE MABS;Lo;0;L;;;;;N;;;;;
+B9DB;HANGUL SYLLABLE MAS;Lo;0;L;;;;;N;;;;;
+B9DC;HANGUL SYLLABLE MASS;Lo;0;L;;;;;N;;;;;
+B9DD;HANGUL SYLLABLE MANG;Lo;0;L;;;;;N;;;;;
+B9DE;HANGUL SYLLABLE MAJ;Lo;0;L;;;;;N;;;;;
+B9DF;HANGUL SYLLABLE MAC;Lo;0;L;;;;;N;;;;;
+B9E0;HANGUL SYLLABLE MAK;Lo;0;L;;;;;N;;;;;
+B9E1;HANGUL SYLLABLE MAT;Lo;0;L;;;;;N;;;;;
+B9E2;HANGUL SYLLABLE MAP;Lo;0;L;;;;;N;;;;;
+B9E3;HANGUL SYLLABLE MAH;Lo;0;L;;;;;N;;;;;
+B9E4;HANGUL SYLLABLE MAE;Lo;0;L;;;;;N;;;;;
+B9E5;HANGUL SYLLABLE MAEG;Lo;0;L;;;;;N;;;;;
+B9E6;HANGUL SYLLABLE MAEGG;Lo;0;L;;;;;N;;;;;
+B9E7;HANGUL SYLLABLE MAEGS;Lo;0;L;;;;;N;;;;;
+B9E8;HANGUL SYLLABLE MAEN;Lo;0;L;;;;;N;;;;;
+B9E9;HANGUL SYLLABLE MAENI;Lo;0;L;;;;;N;;;;;
+B9EA;HANGUL SYLLABLE MAENH;Lo;0;L;;;;;N;;;;;
+B9EB;HANGUL SYLLABLE MAED;Lo;0;L;;;;;N;;;;;
+B9EC;HANGUL SYLLABLE MAEL;Lo;0;L;;;;;N;;;;;
+B9ED;HANGUL SYLLABLE MAELG;Lo;0;L;;;;;N;;;;;
+B9EE;HANGUL SYLLABLE MAELM;Lo;0;L;;;;;N;;;;;
+B9EF;HANGUL SYLLABLE MAELB;Lo;0;L;;;;;N;;;;;
+B9F0;HANGUL SYLLABLE MAELS;Lo;0;L;;;;;N;;;;;
+B9F1;HANGUL SYLLABLE MAELT;Lo;0;L;;;;;N;;;;;
+B9F2;HANGUL SYLLABLE MAELP;Lo;0;L;;;;;N;;;;;
+B9F3;HANGUL SYLLABLE MAELH;Lo;0;L;;;;;N;;;;;
+B9F4;HANGUL SYLLABLE MAEM;Lo;0;L;;;;;N;;;;;
+B9F5;HANGUL SYLLABLE MAEB;Lo;0;L;;;;;N;;;;;
+B9F6;HANGUL SYLLABLE MAEBS;Lo;0;L;;;;;N;;;;;
+B9F7;HANGUL SYLLABLE MAES;Lo;0;L;;;;;N;;;;;
+B9F8;HANGUL SYLLABLE MAESS;Lo;0;L;;;;;N;;;;;
+B9F9;HANGUL SYLLABLE MAENG;Lo;0;L;;;;;N;;;;;
+B9FA;HANGUL SYLLABLE MAEJ;Lo;0;L;;;;;N;;;;;
+B9FB;HANGUL SYLLABLE MAEC;Lo;0;L;;;;;N;;;;;
+B9FC;HANGUL SYLLABLE MAEK;Lo;0;L;;;;;N;;;;;
+B9FD;HANGUL SYLLABLE MAET;Lo;0;L;;;;;N;;;;;
+B9FE;HANGUL SYLLABLE MAEP;Lo;0;L;;;;;N;;;;;
+B9FF;HANGUL SYLLABLE MAEH;Lo;0;L;;;;;N;;;;;
+BA00;HANGUL SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
+BA01;HANGUL SYLLABLE MYAG;Lo;0;L;;;;;N;;;;;
+BA02;HANGUL SYLLABLE MYAGG;Lo;0;L;;;;;N;;;;;
+BA03;HANGUL SYLLABLE MYAGS;Lo;0;L;;;;;N;;;;;
+BA04;HANGUL SYLLABLE MYAN;Lo;0;L;;;;;N;;;;;
+BA05;HANGUL SYLLABLE MYANI;Lo;0;L;;;;;N;;;;;
+BA06;HANGUL SYLLABLE MYANH;Lo;0;L;;;;;N;;;;;
+BA07;HANGUL SYLLABLE MYAD;Lo;0;L;;;;;N;;;;;
+BA08;HANGUL SYLLABLE MYAL;Lo;0;L;;;;;N;;;;;
+BA09;HANGUL SYLLABLE MYALG;Lo;0;L;;;;;N;;;;;
+BA0A;HANGUL SYLLABLE MYALM;Lo;0;L;;;;;N;;;;;
+BA0B;HANGUL SYLLABLE MYALB;Lo;0;L;;;;;N;;;;;
+BA0C;HANGUL SYLLABLE MYALS;Lo;0;L;;;;;N;;;;;
+BA0D;HANGUL SYLLABLE MYALT;Lo;0;L;;;;;N;;;;;
+BA0E;HANGUL SYLLABLE MYALP;Lo;0;L;;;;;N;;;;;
+BA0F;HANGUL SYLLABLE MYALH;Lo;0;L;;;;;N;;;;;
+BA10;HANGUL SYLLABLE MYAM;Lo;0;L;;;;;N;;;;;
+BA11;HANGUL SYLLABLE MYAB;Lo;0;L;;;;;N;;;;;
+BA12;HANGUL SYLLABLE MYABS;Lo;0;L;;;;;N;;;;;
+BA13;HANGUL SYLLABLE MYAS;Lo;0;L;;;;;N;;;;;
+BA14;HANGUL SYLLABLE MYASS;Lo;0;L;;;;;N;;;;;
+BA15;HANGUL SYLLABLE MYANG;Lo;0;L;;;;;N;;;;;
+BA16;HANGUL SYLLABLE MYAJ;Lo;0;L;;;;;N;;;;;
+BA17;HANGUL SYLLABLE MYAC;Lo;0;L;;;;;N;;;;;
+BA18;HANGUL SYLLABLE MYAK;Lo;0;L;;;;;N;;;;;
+BA19;HANGUL SYLLABLE MYAT;Lo;0;L;;;;;N;;;;;
+BA1A;HANGUL SYLLABLE MYAP;Lo;0;L;;;;;N;;;;;
+BA1B;HANGUL SYLLABLE MYAH;Lo;0;L;;;;;N;;;;;
+BA1C;HANGUL SYLLABLE MYAE;Lo;0;L;;;;;N;;;;;
+BA1D;HANGUL SYLLABLE MYAEG;Lo;0;L;;;;;N;;;;;
+BA1E;HANGUL SYLLABLE MYAEGG;Lo;0;L;;;;;N;;;;;
+BA1F;HANGUL SYLLABLE MYAEGS;Lo;0;L;;;;;N;;;;;
+BA20;HANGUL SYLLABLE MYAEN;Lo;0;L;;;;;N;;;;;
+BA21;HANGUL SYLLABLE MYAENI;Lo;0;L;;;;;N;;;;;
+BA22;HANGUL SYLLABLE MYAENH;Lo;0;L;;;;;N;;;;;
+BA23;HANGUL SYLLABLE MYAED;Lo;0;L;;;;;N;;;;;
+BA24;HANGUL SYLLABLE MYAEL;Lo;0;L;;;;;N;;;;;
+BA25;HANGUL SYLLABLE MYAELG;Lo;0;L;;;;;N;;;;;
+BA26;HANGUL SYLLABLE MYAELM;Lo;0;L;;;;;N;;;;;
+BA27;HANGUL SYLLABLE MYAELB;Lo;0;L;;;;;N;;;;;
+BA28;HANGUL SYLLABLE MYAELS;Lo;0;L;;;;;N;;;;;
+BA29;HANGUL SYLLABLE MYAELT;Lo;0;L;;;;;N;;;;;
+BA2A;HANGUL SYLLABLE MYAELP;Lo;0;L;;;;;N;;;;;
+BA2B;HANGUL SYLLABLE MYAELH;Lo;0;L;;;;;N;;;;;
+BA2C;HANGUL SYLLABLE MYAEM;Lo;0;L;;;;;N;;;;;
+BA2D;HANGUL SYLLABLE MYAEB;Lo;0;L;;;;;N;;;;;
+BA2E;HANGUL SYLLABLE MYAEBS;Lo;0;L;;;;;N;;;;;
+BA2F;HANGUL SYLLABLE MYAES;Lo;0;L;;;;;N;;;;;
+BA30;HANGUL SYLLABLE MYAESS;Lo;0;L;;;;;N;;;;;
+BA31;HANGUL SYLLABLE MYAENG;Lo;0;L;;;;;N;;;;;
+BA32;HANGUL SYLLABLE MYAEJ;Lo;0;L;;;;;N;;;;;
+BA33;HANGUL SYLLABLE MYAEC;Lo;0;L;;;;;N;;;;;
+BA34;HANGUL SYLLABLE MYAEK;Lo;0;L;;;;;N;;;;;
+BA35;HANGUL SYLLABLE MYAET;Lo;0;L;;;;;N;;;;;
+BA36;HANGUL SYLLABLE MYAEP;Lo;0;L;;;;;N;;;;;
+BA37;HANGUL SYLLABLE MYAEH;Lo;0;L;;;;;N;;;;;
+BA38;HANGUL SYLLABLE MEO;Lo;0;L;;;;;N;;;;;
+BA39;HANGUL SYLLABLE MEOG;Lo;0;L;;;;;N;;;;;
+BA3A;HANGUL SYLLABLE MEOGG;Lo;0;L;;;;;N;;;;;
+BA3B;HANGUL SYLLABLE MEOGS;Lo;0;L;;;;;N;;;;;
+BA3C;HANGUL SYLLABLE MEON;Lo;0;L;;;;;N;;;;;
+BA3D;HANGUL SYLLABLE MEONI;Lo;0;L;;;;;N;;;;;
+BA3E;HANGUL SYLLABLE MEONH;Lo;0;L;;;;;N;;;;;
+BA3F;HANGUL SYLLABLE MEOD;Lo;0;L;;;;;N;;;;;
+BA40;HANGUL SYLLABLE MEOL;Lo;0;L;;;;;N;;;;;
+BA41;HANGUL SYLLABLE MEOLG;Lo;0;L;;;;;N;;;;;
+BA42;HANGUL SYLLABLE MEOLM;Lo;0;L;;;;;N;;;;;
+BA43;HANGUL SYLLABLE MEOLB;Lo;0;L;;;;;N;;;;;
+BA44;HANGUL SYLLABLE MEOLS;Lo;0;L;;;;;N;;;;;
+BA45;HANGUL SYLLABLE MEOLT;Lo;0;L;;;;;N;;;;;
+BA46;HANGUL SYLLABLE MEOLP;Lo;0;L;;;;;N;;;;;
+BA47;HANGUL SYLLABLE MEOLH;Lo;0;L;;;;;N;;;;;
+BA48;HANGUL SYLLABLE MEOM;Lo;0;L;;;;;N;;;;;
+BA49;HANGUL SYLLABLE MEOB;Lo;0;L;;;;;N;;;;;
+BA4A;HANGUL SYLLABLE MEOBS;Lo;0;L;;;;;N;;;;;
+BA4B;HANGUL SYLLABLE MEOS;Lo;0;L;;;;;N;;;;;
+BA4C;HANGUL SYLLABLE MEOSS;Lo;0;L;;;;;N;;;;;
+BA4D;HANGUL SYLLABLE MEONG;Lo;0;L;;;;;N;;;;;
+BA4E;HANGUL SYLLABLE MEOJ;Lo;0;L;;;;;N;;;;;
+BA4F;HANGUL SYLLABLE MEOC;Lo;0;L;;;;;N;;;;;
+BA50;HANGUL SYLLABLE MEOK;Lo;0;L;;;;;N;;;;;
+BA51;HANGUL SYLLABLE MEOT;Lo;0;L;;;;;N;;;;;
+BA52;HANGUL SYLLABLE MEOP;Lo;0;L;;;;;N;;;;;
+BA53;HANGUL SYLLABLE MEOH;Lo;0;L;;;;;N;;;;;
+BA54;HANGUL SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+BA55;HANGUL SYLLABLE MEG;Lo;0;L;;;;;N;;;;;
+BA56;HANGUL SYLLABLE MEGG;Lo;0;L;;;;;N;;;;;
+BA57;HANGUL SYLLABLE MEGS;Lo;0;L;;;;;N;;;;;
+BA58;HANGUL SYLLABLE MEN;Lo;0;L;;;;;N;;;;;
+BA59;HANGUL SYLLABLE MENI;Lo;0;L;;;;;N;;;;;
+BA5A;HANGUL SYLLABLE MENH;Lo;0;L;;;;;N;;;;;
+BA5B;HANGUL SYLLABLE MED;Lo;0;L;;;;;N;;;;;
+BA5C;HANGUL SYLLABLE MEL;Lo;0;L;;;;;N;;;;;
+BA5D;HANGUL SYLLABLE MELG;Lo;0;L;;;;;N;;;;;
+BA5E;HANGUL SYLLABLE MELM;Lo;0;L;;;;;N;;;;;
+BA5F;HANGUL SYLLABLE MELB;Lo;0;L;;;;;N;;;;;
+BA60;HANGUL SYLLABLE MELS;Lo;0;L;;;;;N;;;;;
+BA61;HANGUL SYLLABLE MELT;Lo;0;L;;;;;N;;;;;
+BA62;HANGUL SYLLABLE MELP;Lo;0;L;;;;;N;;;;;
+BA63;HANGUL SYLLABLE MELH;Lo;0;L;;;;;N;;;;;
+BA64;HANGUL SYLLABLE MEM;Lo;0;L;;;;;N;;;;;
+BA65;HANGUL SYLLABLE MEB;Lo;0;L;;;;;N;;;;;
+BA66;HANGUL SYLLABLE MEBS;Lo;0;L;;;;;N;;;;;
+BA67;HANGUL SYLLABLE MES;Lo;0;L;;;;;N;;;;;
+BA68;HANGUL SYLLABLE MESS;Lo;0;L;;;;;N;;;;;
+BA69;HANGUL SYLLABLE MENG;Lo;0;L;;;;;N;;;;;
+BA6A;HANGUL SYLLABLE MEJ;Lo;0;L;;;;;N;;;;;
+BA6B;HANGUL SYLLABLE MEC;Lo;0;L;;;;;N;;;;;
+BA6C;HANGUL SYLLABLE MEK;Lo;0;L;;;;;N;;;;;
+BA6D;HANGUL SYLLABLE MET;Lo;0;L;;;;;N;;;;;
+BA6E;HANGUL SYLLABLE MEP;Lo;0;L;;;;;N;;;;;
+BA6F;HANGUL SYLLABLE MEH;Lo;0;L;;;;;N;;;;;
+BA70;HANGUL SYLLABLE MYEO;Lo;0;L;;;;;N;;;;;
+BA71;HANGUL SYLLABLE MYEOG;Lo;0;L;;;;;N;;;;;
+BA72;HANGUL SYLLABLE MYEOGG;Lo;0;L;;;;;N;;;;;
+BA73;HANGUL SYLLABLE MYEOGS;Lo;0;L;;;;;N;;;;;
+BA74;HANGUL SYLLABLE MYEON;Lo;0;L;;;;;N;;;;;
+BA75;HANGUL SYLLABLE MYEONI;Lo;0;L;;;;;N;;;;;
+BA76;HANGUL SYLLABLE MYEONH;Lo;0;L;;;;;N;;;;;
+BA77;HANGUL SYLLABLE MYEOD;Lo;0;L;;;;;N;;;;;
+BA78;HANGUL SYLLABLE MYEOL;Lo;0;L;;;;;N;;;;;
+BA79;HANGUL SYLLABLE MYEOLG;Lo;0;L;;;;;N;;;;;
+BA7A;HANGUL SYLLABLE MYEOLM;Lo;0;L;;;;;N;;;;;
+BA7B;HANGUL SYLLABLE MYEOLB;Lo;0;L;;;;;N;;;;;
+BA7C;HANGUL SYLLABLE MYEOLS;Lo;0;L;;;;;N;;;;;
+BA7D;HANGUL SYLLABLE MYEOLT;Lo;0;L;;;;;N;;;;;
+BA7E;HANGUL SYLLABLE MYEOLP;Lo;0;L;;;;;N;;;;;
+BA7F;HANGUL SYLLABLE MYEOLH;Lo;0;L;;;;;N;;;;;
+BA80;HANGUL SYLLABLE MYEOM;Lo;0;L;;;;;N;;;;;
+BA81;HANGUL SYLLABLE MYEOB;Lo;0;L;;;;;N;;;;;
+BA82;HANGUL SYLLABLE MYEOBS;Lo;0;L;;;;;N;;;;;
+BA83;HANGUL SYLLABLE MYEOS;Lo;0;L;;;;;N;;;;;
+BA84;HANGUL SYLLABLE MYEOSS;Lo;0;L;;;;;N;;;;;
+BA85;HANGUL SYLLABLE MYEONG;Lo;0;L;;;;;N;;;;;
+BA86;HANGUL SYLLABLE MYEOJ;Lo;0;L;;;;;N;;;;;
+BA87;HANGUL SYLLABLE MYEOC;Lo;0;L;;;;;N;;;;;
+BA88;HANGUL SYLLABLE MYEOK;Lo;0;L;;;;;N;;;;;
+BA89;HANGUL SYLLABLE MYEOT;Lo;0;L;;;;;N;;;;;
+BA8A;HANGUL SYLLABLE MYEOP;Lo;0;L;;;;;N;;;;;
+BA8B;HANGUL SYLLABLE MYEOH;Lo;0;L;;;;;N;;;;;
+BA8C;HANGUL SYLLABLE MYE;Lo;0;L;;;;;N;;;;;
+BA8D;HANGUL SYLLABLE MYEG;Lo;0;L;;;;;N;;;;;
+BA8E;HANGUL SYLLABLE MYEGG;Lo;0;L;;;;;N;;;;;
+BA8F;HANGUL SYLLABLE MYEGS;Lo;0;L;;;;;N;;;;;
+BA90;HANGUL SYLLABLE MYEN;Lo;0;L;;;;;N;;;;;
+BA91;HANGUL SYLLABLE MYENI;Lo;0;L;;;;;N;;;;;
+BA92;HANGUL SYLLABLE MYENH;Lo;0;L;;;;;N;;;;;
+BA93;HANGUL SYLLABLE MYED;Lo;0;L;;;;;N;;;;;
+BA94;HANGUL SYLLABLE MYEL;Lo;0;L;;;;;N;;;;;
+BA95;HANGUL SYLLABLE MYELG;Lo;0;L;;;;;N;;;;;
+BA96;HANGUL SYLLABLE MYELM;Lo;0;L;;;;;N;;;;;
+BA97;HANGUL SYLLABLE MYELB;Lo;0;L;;;;;N;;;;;
+BA98;HANGUL SYLLABLE MYELS;Lo;0;L;;;;;N;;;;;
+BA99;HANGUL SYLLABLE MYELT;Lo;0;L;;;;;N;;;;;
+BA9A;HANGUL SYLLABLE MYELP;Lo;0;L;;;;;N;;;;;
+BA9B;HANGUL SYLLABLE MYELH;Lo;0;L;;;;;N;;;;;
+BA9C;HANGUL SYLLABLE MYEM;Lo;0;L;;;;;N;;;;;
+BA9D;HANGUL SYLLABLE MYEB;Lo;0;L;;;;;N;;;;;
+BA9E;HANGUL SYLLABLE MYEBS;Lo;0;L;;;;;N;;;;;
+BA9F;HANGUL SYLLABLE MYES;Lo;0;L;;;;;N;;;;;
+BAA0;HANGUL SYLLABLE MYESS;Lo;0;L;;;;;N;;;;;
+BAA1;HANGUL SYLLABLE MYENG;Lo;0;L;;;;;N;;;;;
+BAA2;HANGUL SYLLABLE MYEJ;Lo;0;L;;;;;N;;;;;
+BAA3;HANGUL SYLLABLE MYEC;Lo;0;L;;;;;N;;;;;
+BAA4;HANGUL SYLLABLE MYEK;Lo;0;L;;;;;N;;;;;
+BAA5;HANGUL SYLLABLE MYET;Lo;0;L;;;;;N;;;;;
+BAA6;HANGUL SYLLABLE MYEP;Lo;0;L;;;;;N;;;;;
+BAA7;HANGUL SYLLABLE MYEH;Lo;0;L;;;;;N;;;;;
+BAA8;HANGUL SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+BAA9;HANGUL SYLLABLE MOG;Lo;0;L;;;;;N;;;;;
+BAAA;HANGUL SYLLABLE MOGG;Lo;0;L;;;;;N;;;;;
+BAAB;HANGUL SYLLABLE MOGS;Lo;0;L;;;;;N;;;;;
+BAAC;HANGUL SYLLABLE MON;Lo;0;L;;;;;N;;;;;
+BAAD;HANGUL SYLLABLE MONI;Lo;0;L;;;;;N;;;;;
+BAAE;HANGUL SYLLABLE MONH;Lo;0;L;;;;;N;;;;;
+BAAF;HANGUL SYLLABLE MOD;Lo;0;L;;;;;N;;;;;
+BAB0;HANGUL SYLLABLE MOL;Lo;0;L;;;;;N;;;;;
+BAB1;HANGUL SYLLABLE MOLG;Lo;0;L;;;;;N;;;;;
+BAB2;HANGUL SYLLABLE MOLM;Lo;0;L;;;;;N;;;;;
+BAB3;HANGUL SYLLABLE MOLB;Lo;0;L;;;;;N;;;;;
+BAB4;HANGUL SYLLABLE MOLS;Lo;0;L;;;;;N;;;;;
+BAB5;HANGUL SYLLABLE MOLT;Lo;0;L;;;;;N;;;;;
+BAB6;HANGUL SYLLABLE MOLP;Lo;0;L;;;;;N;;;;;
+BAB7;HANGUL SYLLABLE MOLH;Lo;0;L;;;;;N;;;;;
+BAB8;HANGUL SYLLABLE MOM;Lo;0;L;;;;;N;;;;;
+BAB9;HANGUL SYLLABLE MOB;Lo;0;L;;;;;N;;;;;
+BABA;HANGUL SYLLABLE MOBS;Lo;0;L;;;;;N;;;;;
+BABB;HANGUL SYLLABLE MOS;Lo;0;L;;;;;N;;;;;
+BABC;HANGUL SYLLABLE MOSS;Lo;0;L;;;;;N;;;;;
+BABD;HANGUL SYLLABLE MONG;Lo;0;L;;;;;N;;;;;
+BABE;HANGUL SYLLABLE MOJ;Lo;0;L;;;;;N;;;;;
+BABF;HANGUL SYLLABLE MOC;Lo;0;L;;;;;N;;;;;
+BAC0;HANGUL SYLLABLE MOK;Lo;0;L;;;;;N;;;;;
+BAC1;HANGUL SYLLABLE MOT;Lo;0;L;;;;;N;;;;;
+BAC2;HANGUL SYLLABLE MOP;Lo;0;L;;;;;N;;;;;
+BAC3;HANGUL SYLLABLE MOH;Lo;0;L;;;;;N;;;;;
+BAC4;HANGUL SYLLABLE MWA;Lo;0;L;;;;;N;;;;;
+BAC5;HANGUL SYLLABLE MWAG;Lo;0;L;;;;;N;;;;;
+BAC6;HANGUL SYLLABLE MWAGG;Lo;0;L;;;;;N;;;;;
+BAC7;HANGUL SYLLABLE MWAGS;Lo;0;L;;;;;N;;;;;
+BAC8;HANGUL SYLLABLE MWAN;Lo;0;L;;;;;N;;;;;
+BAC9;HANGUL SYLLABLE MWANI;Lo;0;L;;;;;N;;;;;
+BACA;HANGUL SYLLABLE MWANH;Lo;0;L;;;;;N;;;;;
+BACB;HANGUL SYLLABLE MWAD;Lo;0;L;;;;;N;;;;;
+BACC;HANGUL SYLLABLE MWAL;Lo;0;L;;;;;N;;;;;
+BACD;HANGUL SYLLABLE MWALG;Lo;0;L;;;;;N;;;;;
+BACE;HANGUL SYLLABLE MWALM;Lo;0;L;;;;;N;;;;;
+BACF;HANGUL SYLLABLE MWALB;Lo;0;L;;;;;N;;;;;
+BAD0;HANGUL SYLLABLE MWALS;Lo;0;L;;;;;N;;;;;
+BAD1;HANGUL SYLLABLE MWALT;Lo;0;L;;;;;N;;;;;
+BAD2;HANGUL SYLLABLE MWALP;Lo;0;L;;;;;N;;;;;
+BAD3;HANGUL SYLLABLE MWALH;Lo;0;L;;;;;N;;;;;
+BAD4;HANGUL SYLLABLE MWAM;Lo;0;L;;;;;N;;;;;
+BAD5;HANGUL SYLLABLE MWAB;Lo;0;L;;;;;N;;;;;
+BAD6;HANGUL SYLLABLE MWABS;Lo;0;L;;;;;N;;;;;
+BAD7;HANGUL SYLLABLE MWAS;Lo;0;L;;;;;N;;;;;
+BAD8;HANGUL SYLLABLE MWASS;Lo;0;L;;;;;N;;;;;
+BAD9;HANGUL SYLLABLE MWANG;Lo;0;L;;;;;N;;;;;
+BADA;HANGUL SYLLABLE MWAJ;Lo;0;L;;;;;N;;;;;
+BADB;HANGUL SYLLABLE MWAC;Lo;0;L;;;;;N;;;;;
+BADC;HANGUL SYLLABLE MWAK;Lo;0;L;;;;;N;;;;;
+BADD;HANGUL SYLLABLE MWAT;Lo;0;L;;;;;N;;;;;
+BADE;HANGUL SYLLABLE MWAP;Lo;0;L;;;;;N;;;;;
+BADF;HANGUL SYLLABLE MWAH;Lo;0;L;;;;;N;;;;;
+BAE0;HANGUL SYLLABLE MWAE;Lo;0;L;;;;;N;;;;;
+BAE1;HANGUL SYLLABLE MWAEG;Lo;0;L;;;;;N;;;;;
+BAE2;HANGUL SYLLABLE MWAEGG;Lo;0;L;;;;;N;;;;;
+BAE3;HANGUL SYLLABLE MWAEGS;Lo;0;L;;;;;N;;;;;
+BAE4;HANGUL SYLLABLE MWAEN;Lo;0;L;;;;;N;;;;;
+BAE5;HANGUL SYLLABLE MWAENI;Lo;0;L;;;;;N;;;;;
+BAE6;HANGUL SYLLABLE MWAENH;Lo;0;L;;;;;N;;;;;
+BAE7;HANGUL SYLLABLE MWAED;Lo;0;L;;;;;N;;;;;
+BAE8;HANGUL SYLLABLE MWAEL;Lo;0;L;;;;;N;;;;;
+BAE9;HANGUL SYLLABLE MWAELG;Lo;0;L;;;;;N;;;;;
+BAEA;HANGUL SYLLABLE MWAELM;Lo;0;L;;;;;N;;;;;
+BAEB;HANGUL SYLLABLE MWAELB;Lo;0;L;;;;;N;;;;;
+BAEC;HANGUL SYLLABLE MWAELS;Lo;0;L;;;;;N;;;;;
+BAED;HANGUL SYLLABLE MWAELT;Lo;0;L;;;;;N;;;;;
+BAEE;HANGUL SYLLABLE MWAELP;Lo;0;L;;;;;N;;;;;
+BAEF;HANGUL SYLLABLE MWAELH;Lo;0;L;;;;;N;;;;;
+BAF0;HANGUL SYLLABLE MWAEM;Lo;0;L;;;;;N;;;;;
+BAF1;HANGUL SYLLABLE MWAEB;Lo;0;L;;;;;N;;;;;
+BAF2;HANGUL SYLLABLE MWAEBS;Lo;0;L;;;;;N;;;;;
+BAF3;HANGUL SYLLABLE MWAES;Lo;0;L;;;;;N;;;;;
+BAF4;HANGUL SYLLABLE MWAESS;Lo;0;L;;;;;N;;;;;
+BAF5;HANGUL SYLLABLE MWAENG;Lo;0;L;;;;;N;;;;;
+BAF6;HANGUL SYLLABLE MWAEJ;Lo;0;L;;;;;N;;;;;
+BAF7;HANGUL SYLLABLE MWAEC;Lo;0;L;;;;;N;;;;;
+BAF8;HANGUL SYLLABLE MWAEK;Lo;0;L;;;;;N;;;;;
+BAF9;HANGUL SYLLABLE MWAET;Lo;0;L;;;;;N;;;;;
+BAFA;HANGUL SYLLABLE MWAEP;Lo;0;L;;;;;N;;;;;
+BAFB;HANGUL SYLLABLE MWAEH;Lo;0;L;;;;;N;;;;;
+BAFC;HANGUL SYLLABLE MOE;Lo;0;L;;;;;N;;;;;
+BAFD;HANGUL SYLLABLE MOEG;Lo;0;L;;;;;N;;;;;
+BAFE;HANGUL SYLLABLE MOEGG;Lo;0;L;;;;;N;;;;;
+BAFF;HANGUL SYLLABLE MOEGS;Lo;0;L;;;;;N;;;;;
+BB00;HANGUL SYLLABLE MOEN;Lo;0;L;;;;;N;;;;;
+BB01;HANGUL SYLLABLE MOENI;Lo;0;L;;;;;N;;;;;
+BB02;HANGUL SYLLABLE MOENH;Lo;0;L;;;;;N;;;;;
+BB03;HANGUL SYLLABLE MOED;Lo;0;L;;;;;N;;;;;
+BB04;HANGUL SYLLABLE MOEL;Lo;0;L;;;;;N;;;;;
+BB05;HANGUL SYLLABLE MOELG;Lo;0;L;;;;;N;;;;;
+BB06;HANGUL SYLLABLE MOELM;Lo;0;L;;;;;N;;;;;
+BB07;HANGUL SYLLABLE MOELB;Lo;0;L;;;;;N;;;;;
+BB08;HANGUL SYLLABLE MOELS;Lo;0;L;;;;;N;;;;;
+BB09;HANGUL SYLLABLE MOELT;Lo;0;L;;;;;N;;;;;
+BB0A;HANGUL SYLLABLE MOELP;Lo;0;L;;;;;N;;;;;
+BB0B;HANGUL SYLLABLE MOELH;Lo;0;L;;;;;N;;;;;
+BB0C;HANGUL SYLLABLE MOEM;Lo;0;L;;;;;N;;;;;
+BB0D;HANGUL SYLLABLE MOEB;Lo;0;L;;;;;N;;;;;
+BB0E;HANGUL SYLLABLE MOEBS;Lo;0;L;;;;;N;;;;;
+BB0F;HANGUL SYLLABLE MOES;Lo;0;L;;;;;N;;;;;
+BB10;HANGUL SYLLABLE MOESS;Lo;0;L;;;;;N;;;;;
+BB11;HANGUL SYLLABLE MOENG;Lo;0;L;;;;;N;;;;;
+BB12;HANGUL SYLLABLE MOEJ;Lo;0;L;;;;;N;;;;;
+BB13;HANGUL SYLLABLE MOEC;Lo;0;L;;;;;N;;;;;
+BB14;HANGUL SYLLABLE MOEK;Lo;0;L;;;;;N;;;;;
+BB15;HANGUL SYLLABLE MOET;Lo;0;L;;;;;N;;;;;
+BB16;HANGUL SYLLABLE MOEP;Lo;0;L;;;;;N;;;;;
+BB17;HANGUL SYLLABLE MOEH;Lo;0;L;;;;;N;;;;;
+BB18;HANGUL SYLLABLE MYO;Lo;0;L;;;;;N;;;;;
+BB19;HANGUL SYLLABLE MYOG;Lo;0;L;;;;;N;;;;;
+BB1A;HANGUL SYLLABLE MYOGG;Lo;0;L;;;;;N;;;;;
+BB1B;HANGUL SYLLABLE MYOGS;Lo;0;L;;;;;N;;;;;
+BB1C;HANGUL SYLLABLE MYON;Lo;0;L;;;;;N;;;;;
+BB1D;HANGUL SYLLABLE MYONI;Lo;0;L;;;;;N;;;;;
+BB1E;HANGUL SYLLABLE MYONH;Lo;0;L;;;;;N;;;;;
+BB1F;HANGUL SYLLABLE MYOD;Lo;0;L;;;;;N;;;;;
+BB20;HANGUL SYLLABLE MYOL;Lo;0;L;;;;;N;;;;;
+BB21;HANGUL SYLLABLE MYOLG;Lo;0;L;;;;;N;;;;;
+BB22;HANGUL SYLLABLE MYOLM;Lo;0;L;;;;;N;;;;;
+BB23;HANGUL SYLLABLE MYOLB;Lo;0;L;;;;;N;;;;;
+BB24;HANGUL SYLLABLE MYOLS;Lo;0;L;;;;;N;;;;;
+BB25;HANGUL SYLLABLE MYOLT;Lo;0;L;;;;;N;;;;;
+BB26;HANGUL SYLLABLE MYOLP;Lo;0;L;;;;;N;;;;;
+BB27;HANGUL SYLLABLE MYOLH;Lo;0;L;;;;;N;;;;;
+BB28;HANGUL SYLLABLE MYOM;Lo;0;L;;;;;N;;;;;
+BB29;HANGUL SYLLABLE MYOB;Lo;0;L;;;;;N;;;;;
+BB2A;HANGUL SYLLABLE MYOBS;Lo;0;L;;;;;N;;;;;
+BB2B;HANGUL SYLLABLE MYOS;Lo;0;L;;;;;N;;;;;
+BB2C;HANGUL SYLLABLE MYOSS;Lo;0;L;;;;;N;;;;;
+BB2D;HANGUL SYLLABLE MYONG;Lo;0;L;;;;;N;;;;;
+BB2E;HANGUL SYLLABLE MYOJ;Lo;0;L;;;;;N;;;;;
+BB2F;HANGUL SYLLABLE MYOC;Lo;0;L;;;;;N;;;;;
+BB30;HANGUL SYLLABLE MYOK;Lo;0;L;;;;;N;;;;;
+BB31;HANGUL SYLLABLE MYOT;Lo;0;L;;;;;N;;;;;
+BB32;HANGUL SYLLABLE MYOP;Lo;0;L;;;;;N;;;;;
+BB33;HANGUL SYLLABLE MYOH;Lo;0;L;;;;;N;;;;;
+BB34;HANGUL SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+BB35;HANGUL SYLLABLE MUG;Lo;0;L;;;;;N;;;;;
+BB36;HANGUL SYLLABLE MUGG;Lo;0;L;;;;;N;;;;;
+BB37;HANGUL SYLLABLE MUGS;Lo;0;L;;;;;N;;;;;
+BB38;HANGUL SYLLABLE MUN;Lo;0;L;;;;;N;;;;;
+BB39;HANGUL SYLLABLE MUNI;Lo;0;L;;;;;N;;;;;
+BB3A;HANGUL SYLLABLE MUNH;Lo;0;L;;;;;N;;;;;
+BB3B;HANGUL SYLLABLE MUD;Lo;0;L;;;;;N;;;;;
+BB3C;HANGUL SYLLABLE MUL;Lo;0;L;;;;;N;;;;;
+BB3D;HANGUL SYLLABLE MULG;Lo;0;L;;;;;N;;;;;
+BB3E;HANGUL SYLLABLE MULM;Lo;0;L;;;;;N;;;;;
+BB3F;HANGUL SYLLABLE MULB;Lo;0;L;;;;;N;;;;;
+BB40;HANGUL SYLLABLE MULS;Lo;0;L;;;;;N;;;;;
+BB41;HANGUL SYLLABLE MULT;Lo;0;L;;;;;N;;;;;
+BB42;HANGUL SYLLABLE MULP;Lo;0;L;;;;;N;;;;;
+BB43;HANGUL SYLLABLE MULH;Lo;0;L;;;;;N;;;;;
+BB44;HANGUL SYLLABLE MUM;Lo;0;L;;;;;N;;;;;
+BB45;HANGUL SYLLABLE MUB;Lo;0;L;;;;;N;;;;;
+BB46;HANGUL SYLLABLE MUBS;Lo;0;L;;;;;N;;;;;
+BB47;HANGUL SYLLABLE MUS;Lo;0;L;;;;;N;;;;;
+BB48;HANGUL SYLLABLE MUSS;Lo;0;L;;;;;N;;;;;
+BB49;HANGUL SYLLABLE MUNG;Lo;0;L;;;;;N;;;;;
+BB4A;HANGUL SYLLABLE MUJ;Lo;0;L;;;;;N;;;;;
+BB4B;HANGUL SYLLABLE MUC;Lo;0;L;;;;;N;;;;;
+BB4C;HANGUL SYLLABLE MUK;Lo;0;L;;;;;N;;;;;
+BB4D;HANGUL SYLLABLE MUT;Lo;0;L;;;;;N;;;;;
+BB4E;HANGUL SYLLABLE MUP;Lo;0;L;;;;;N;;;;;
+BB4F;HANGUL SYLLABLE MUH;Lo;0;L;;;;;N;;;;;
+BB50;HANGUL SYLLABLE MWEO;Lo;0;L;;;;;N;;;;;
+BB51;HANGUL SYLLABLE MWEOG;Lo;0;L;;;;;N;;;;;
+BB52;HANGUL SYLLABLE MWEOGG;Lo;0;L;;;;;N;;;;;
+BB53;HANGUL SYLLABLE MWEOGS;Lo;0;L;;;;;N;;;;;
+BB54;HANGUL SYLLABLE MWEON;Lo;0;L;;;;;N;;;;;
+BB55;HANGUL SYLLABLE MWEONI;Lo;0;L;;;;;N;;;;;
+BB56;HANGUL SYLLABLE MWEONH;Lo;0;L;;;;;N;;;;;
+BB57;HANGUL SYLLABLE MWEOD;Lo;0;L;;;;;N;;;;;
+BB58;HANGUL SYLLABLE MWEOL;Lo;0;L;;;;;N;;;;;
+BB59;HANGUL SYLLABLE MWEOLG;Lo;0;L;;;;;N;;;;;
+BB5A;HANGUL SYLLABLE MWEOLM;Lo;0;L;;;;;N;;;;;
+BB5B;HANGUL SYLLABLE MWEOLB;Lo;0;L;;;;;N;;;;;
+BB5C;HANGUL SYLLABLE MWEOLS;Lo;0;L;;;;;N;;;;;
+BB5D;HANGUL SYLLABLE MWEOLT;Lo;0;L;;;;;N;;;;;
+BB5E;HANGUL SYLLABLE MWEOLP;Lo;0;L;;;;;N;;;;;
+BB5F;HANGUL SYLLABLE MWEOLH;Lo;0;L;;;;;N;;;;;
+BB60;HANGUL SYLLABLE MWEOM;Lo;0;L;;;;;N;;;;;
+BB61;HANGUL SYLLABLE MWEOB;Lo;0;L;;;;;N;;;;;
+BB62;HANGUL SYLLABLE MWEOBS;Lo;0;L;;;;;N;;;;;
+BB63;HANGUL SYLLABLE MWEOS;Lo;0;L;;;;;N;;;;;
+BB64;HANGUL SYLLABLE MWEOSS;Lo;0;L;;;;;N;;;;;
+BB65;HANGUL SYLLABLE MWEONG;Lo;0;L;;;;;N;;;;;
+BB66;HANGUL SYLLABLE MWEOJ;Lo;0;L;;;;;N;;;;;
+BB67;HANGUL SYLLABLE MWEOC;Lo;0;L;;;;;N;;;;;
+BB68;HANGUL SYLLABLE MWEOK;Lo;0;L;;;;;N;;;;;
+BB69;HANGUL SYLLABLE MWEOT;Lo;0;L;;;;;N;;;;;
+BB6A;HANGUL SYLLABLE MWEOP;Lo;0;L;;;;;N;;;;;
+BB6B;HANGUL SYLLABLE MWEOH;Lo;0;L;;;;;N;;;;;
+BB6C;HANGUL SYLLABLE MWE;Lo;0;L;;;;;N;;;;;
+BB6D;HANGUL SYLLABLE MWEG;Lo;0;L;;;;;N;;;;;
+BB6E;HANGUL SYLLABLE MWEGG;Lo;0;L;;;;;N;;;;;
+BB6F;HANGUL SYLLABLE MWEGS;Lo;0;L;;;;;N;;;;;
+BB70;HANGUL SYLLABLE MWEN;Lo;0;L;;;;;N;;;;;
+BB71;HANGUL SYLLABLE MWENI;Lo;0;L;;;;;N;;;;;
+BB72;HANGUL SYLLABLE MWENH;Lo;0;L;;;;;N;;;;;
+BB73;HANGUL SYLLABLE MWED;Lo;0;L;;;;;N;;;;;
+BB74;HANGUL SYLLABLE MWEL;Lo;0;L;;;;;N;;;;;
+BB75;HANGUL SYLLABLE MWELG;Lo;0;L;;;;;N;;;;;
+BB76;HANGUL SYLLABLE MWELM;Lo;0;L;;;;;N;;;;;
+BB77;HANGUL SYLLABLE MWELB;Lo;0;L;;;;;N;;;;;
+BB78;HANGUL SYLLABLE MWELS;Lo;0;L;;;;;N;;;;;
+BB79;HANGUL SYLLABLE MWELT;Lo;0;L;;;;;N;;;;;
+BB7A;HANGUL SYLLABLE MWELP;Lo;0;L;;;;;N;;;;;
+BB7B;HANGUL SYLLABLE MWELH;Lo;0;L;;;;;N;;;;;
+BB7C;HANGUL SYLLABLE MWEM;Lo;0;L;;;;;N;;;;;
+BB7D;HANGUL SYLLABLE MWEB;Lo;0;L;;;;;N;;;;;
+BB7E;HANGUL SYLLABLE MWEBS;Lo;0;L;;;;;N;;;;;
+BB7F;HANGUL SYLLABLE MWES;Lo;0;L;;;;;N;;;;;
+BB80;HANGUL SYLLABLE MWESS;Lo;0;L;;;;;N;;;;;
+BB81;HANGUL SYLLABLE MWENG;Lo;0;L;;;;;N;;;;;
+BB82;HANGUL SYLLABLE MWEJ;Lo;0;L;;;;;N;;;;;
+BB83;HANGUL SYLLABLE MWEC;Lo;0;L;;;;;N;;;;;
+BB84;HANGUL SYLLABLE MWEK;Lo;0;L;;;;;N;;;;;
+BB85;HANGUL SYLLABLE MWET;Lo;0;L;;;;;N;;;;;
+BB86;HANGUL SYLLABLE MWEP;Lo;0;L;;;;;N;;;;;
+BB87;HANGUL SYLLABLE MWEH;Lo;0;L;;;;;N;;;;;
+BB88;HANGUL SYLLABLE MWI;Lo;0;L;;;;;N;;;;;
+BB89;HANGUL SYLLABLE MWIG;Lo;0;L;;;;;N;;;;;
+BB8A;HANGUL SYLLABLE MWIGG;Lo;0;L;;;;;N;;;;;
+BB8B;HANGUL SYLLABLE MWIGS;Lo;0;L;;;;;N;;;;;
+BB8C;HANGUL SYLLABLE MWIN;Lo;0;L;;;;;N;;;;;
+BB8D;HANGUL SYLLABLE MWINI;Lo;0;L;;;;;N;;;;;
+BB8E;HANGUL SYLLABLE MWINH;Lo;0;L;;;;;N;;;;;
+BB8F;HANGUL SYLLABLE MWID;Lo;0;L;;;;;N;;;;;
+BB90;HANGUL SYLLABLE MWIL;Lo;0;L;;;;;N;;;;;
+BB91;HANGUL SYLLABLE MWILG;Lo;0;L;;;;;N;;;;;
+BB92;HANGUL SYLLABLE MWILM;Lo;0;L;;;;;N;;;;;
+BB93;HANGUL SYLLABLE MWILB;Lo;0;L;;;;;N;;;;;
+BB94;HANGUL SYLLABLE MWILS;Lo;0;L;;;;;N;;;;;
+BB95;HANGUL SYLLABLE MWILT;Lo;0;L;;;;;N;;;;;
+BB96;HANGUL SYLLABLE MWILP;Lo;0;L;;;;;N;;;;;
+BB97;HANGUL SYLLABLE MWILH;Lo;0;L;;;;;N;;;;;
+BB98;HANGUL SYLLABLE MWIM;Lo;0;L;;;;;N;;;;;
+BB99;HANGUL SYLLABLE MWIB;Lo;0;L;;;;;N;;;;;
+BB9A;HANGUL SYLLABLE MWIBS;Lo;0;L;;;;;N;;;;;
+BB9B;HANGUL SYLLABLE MWIS;Lo;0;L;;;;;N;;;;;
+BB9C;HANGUL SYLLABLE MWISS;Lo;0;L;;;;;N;;;;;
+BB9D;HANGUL SYLLABLE MWING;Lo;0;L;;;;;N;;;;;
+BB9E;HANGUL SYLLABLE MWIJ;Lo;0;L;;;;;N;;;;;
+BB9F;HANGUL SYLLABLE MWIC;Lo;0;L;;;;;N;;;;;
+BBA0;HANGUL SYLLABLE MWIK;Lo;0;L;;;;;N;;;;;
+BBA1;HANGUL SYLLABLE MWIT;Lo;0;L;;;;;N;;;;;
+BBA2;HANGUL SYLLABLE MWIP;Lo;0;L;;;;;N;;;;;
+BBA3;HANGUL SYLLABLE MWIH;Lo;0;L;;;;;N;;;;;
+BBA4;HANGUL SYLLABLE MYU;Lo;0;L;;;;;N;;;;;
+BBA5;HANGUL SYLLABLE MYUG;Lo;0;L;;;;;N;;;;;
+BBA6;HANGUL SYLLABLE MYUGG;Lo;0;L;;;;;N;;;;;
+BBA7;HANGUL SYLLABLE MYUGS;Lo;0;L;;;;;N;;;;;
+BBA8;HANGUL SYLLABLE MYUN;Lo;0;L;;;;;N;;;;;
+BBA9;HANGUL SYLLABLE MYUNI;Lo;0;L;;;;;N;;;;;
+BBAA;HANGUL SYLLABLE MYUNH;Lo;0;L;;;;;N;;;;;
+BBAB;HANGUL SYLLABLE MYUD;Lo;0;L;;;;;N;;;;;
+BBAC;HANGUL SYLLABLE MYUL;Lo;0;L;;;;;N;;;;;
+BBAD;HANGUL SYLLABLE MYULG;Lo;0;L;;;;;N;;;;;
+BBAE;HANGUL SYLLABLE MYULM;Lo;0;L;;;;;N;;;;;
+BBAF;HANGUL SYLLABLE MYULB;Lo;0;L;;;;;N;;;;;
+BBB0;HANGUL SYLLABLE MYULS;Lo;0;L;;;;;N;;;;;
+BBB1;HANGUL SYLLABLE MYULT;Lo;0;L;;;;;N;;;;;
+BBB2;HANGUL SYLLABLE MYULP;Lo;0;L;;;;;N;;;;;
+BBB3;HANGUL SYLLABLE MYULH;Lo;0;L;;;;;N;;;;;
+BBB4;HANGUL SYLLABLE MYUM;Lo;0;L;;;;;N;;;;;
+BBB5;HANGUL SYLLABLE MYUB;Lo;0;L;;;;;N;;;;;
+BBB6;HANGUL SYLLABLE MYUBS;Lo;0;L;;;;;N;;;;;
+BBB7;HANGUL SYLLABLE MYUS;Lo;0;L;;;;;N;;;;;
+BBB8;HANGUL SYLLABLE MYUSS;Lo;0;L;;;;;N;;;;;
+BBB9;HANGUL SYLLABLE MYUNG;Lo;0;L;;;;;N;;;;;
+BBBA;HANGUL SYLLABLE MYUJ;Lo;0;L;;;;;N;;;;;
+BBBB;HANGUL SYLLABLE MYUC;Lo;0;L;;;;;N;;;;;
+BBBC;HANGUL SYLLABLE MYUK;Lo;0;L;;;;;N;;;;;
+BBBD;HANGUL SYLLABLE MYUT;Lo;0;L;;;;;N;;;;;
+BBBE;HANGUL SYLLABLE MYUP;Lo;0;L;;;;;N;;;;;
+BBBF;HANGUL SYLLABLE MYUH;Lo;0;L;;;;;N;;;;;
+BBC0;HANGUL SYLLABLE MEU;Lo;0;L;;;;;N;;;;;
+BBC1;HANGUL SYLLABLE MEUG;Lo;0;L;;;;;N;;;;;
+BBC2;HANGUL SYLLABLE MEUGG;Lo;0;L;;;;;N;;;;;
+BBC3;HANGUL SYLLABLE MEUGS;Lo;0;L;;;;;N;;;;;
+BBC4;HANGUL SYLLABLE MEUN;Lo;0;L;;;;;N;;;;;
+BBC5;HANGUL SYLLABLE MEUNI;Lo;0;L;;;;;N;;;;;
+BBC6;HANGUL SYLLABLE MEUNH;Lo;0;L;;;;;N;;;;;
+BBC7;HANGUL SYLLABLE MEUD;Lo;0;L;;;;;N;;;;;
+BBC8;HANGUL SYLLABLE MEUL;Lo;0;L;;;;;N;;;;;
+BBC9;HANGUL SYLLABLE MEULG;Lo;0;L;;;;;N;;;;;
+BBCA;HANGUL SYLLABLE MEULM;Lo;0;L;;;;;N;;;;;
+BBCB;HANGUL SYLLABLE MEULB;Lo;0;L;;;;;N;;;;;
+BBCC;HANGUL SYLLABLE MEULS;Lo;0;L;;;;;N;;;;;
+BBCD;HANGUL SYLLABLE MEULT;Lo;0;L;;;;;N;;;;;
+BBCE;HANGUL SYLLABLE MEULP;Lo;0;L;;;;;N;;;;;
+BBCF;HANGUL SYLLABLE MEULH;Lo;0;L;;;;;N;;;;;
+BBD0;HANGUL SYLLABLE MEUM;Lo;0;L;;;;;N;;;;;
+BBD1;HANGUL SYLLABLE MEUB;Lo;0;L;;;;;N;;;;;
+BBD2;HANGUL SYLLABLE MEUBS;Lo;0;L;;;;;N;;;;;
+BBD3;HANGUL SYLLABLE MEUS;Lo;0;L;;;;;N;;;;;
+BBD4;HANGUL SYLLABLE MEUSS;Lo;0;L;;;;;N;;;;;
+BBD5;HANGUL SYLLABLE MEUNG;Lo;0;L;;;;;N;;;;;
+BBD6;HANGUL SYLLABLE MEUJ;Lo;0;L;;;;;N;;;;;
+BBD7;HANGUL SYLLABLE MEUC;Lo;0;L;;;;;N;;;;;
+BBD8;HANGUL SYLLABLE MEUK;Lo;0;L;;;;;N;;;;;
+BBD9;HANGUL SYLLABLE MEUT;Lo;0;L;;;;;N;;;;;
+BBDA;HANGUL SYLLABLE MEUP;Lo;0;L;;;;;N;;;;;
+BBDB;HANGUL SYLLABLE MEUH;Lo;0;L;;;;;N;;;;;
+BBDC;HANGUL SYLLABLE MYI;Lo;0;L;;;;;N;;;;;
+BBDD;HANGUL SYLLABLE MYIG;Lo;0;L;;;;;N;;;;;
+BBDE;HANGUL SYLLABLE MYIGG;Lo;0;L;;;;;N;;;;;
+BBDF;HANGUL SYLLABLE MYIGS;Lo;0;L;;;;;N;;;;;
+BBE0;HANGUL SYLLABLE MYIN;Lo;0;L;;;;;N;;;;;
+BBE1;HANGUL SYLLABLE MYINI;Lo;0;L;;;;;N;;;;;
+BBE2;HANGUL SYLLABLE MYINH;Lo;0;L;;;;;N;;;;;
+BBE3;HANGUL SYLLABLE MYID;Lo;0;L;;;;;N;;;;;
+BBE4;HANGUL SYLLABLE MYIL;Lo;0;L;;;;;N;;;;;
+BBE5;HANGUL SYLLABLE MYILG;Lo;0;L;;;;;N;;;;;
+BBE6;HANGUL SYLLABLE MYILM;Lo;0;L;;;;;N;;;;;
+BBE7;HANGUL SYLLABLE MYILB;Lo;0;L;;;;;N;;;;;
+BBE8;HANGUL SYLLABLE MYILS;Lo;0;L;;;;;N;;;;;
+BBE9;HANGUL SYLLABLE MYILT;Lo;0;L;;;;;N;;;;;
+BBEA;HANGUL SYLLABLE MYILP;Lo;0;L;;;;;N;;;;;
+BBEB;HANGUL SYLLABLE MYILH;Lo;0;L;;;;;N;;;;;
+BBEC;HANGUL SYLLABLE MYIM;Lo;0;L;;;;;N;;;;;
+BBED;HANGUL SYLLABLE MYIB;Lo;0;L;;;;;N;;;;;
+BBEE;HANGUL SYLLABLE MYIBS;Lo;0;L;;;;;N;;;;;
+BBEF;HANGUL SYLLABLE MYIS;Lo;0;L;;;;;N;;;;;
+BBF0;HANGUL SYLLABLE MYISS;Lo;0;L;;;;;N;;;;;
+BBF1;HANGUL SYLLABLE MYING;Lo;0;L;;;;;N;;;;;
+BBF2;HANGUL SYLLABLE MYIJ;Lo;0;L;;;;;N;;;;;
+BBF3;HANGUL SYLLABLE MYIC;Lo;0;L;;;;;N;;;;;
+BBF4;HANGUL SYLLABLE MYIK;Lo;0;L;;;;;N;;;;;
+BBF5;HANGUL SYLLABLE MYIT;Lo;0;L;;;;;N;;;;;
+BBF6;HANGUL SYLLABLE MYIP;Lo;0;L;;;;;N;;;;;
+BBF7;HANGUL SYLLABLE MYIH;Lo;0;L;;;;;N;;;;;
+BBF8;HANGUL SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+BBF9;HANGUL SYLLABLE MIG;Lo;0;L;;;;;N;;;;;
+BBFA;HANGUL SYLLABLE MIGG;Lo;0;L;;;;;N;;;;;
+BBFB;HANGUL SYLLABLE MIGS;Lo;0;L;;;;;N;;;;;
+BBFC;HANGUL SYLLABLE MIN;Lo;0;L;;;;;N;;;;;
+BBFD;HANGUL SYLLABLE MINI;Lo;0;L;;;;;N;;;;;
+BBFE;HANGUL SYLLABLE MINH;Lo;0;L;;;;;N;;;;;
+BBFF;HANGUL SYLLABLE MID;Lo;0;L;;;;;N;;;;;
+BC00;HANGUL SYLLABLE MIL;Lo;0;L;;;;;N;;;;;
+BC01;HANGUL SYLLABLE MILG;Lo;0;L;;;;;N;;;;;
+BC02;HANGUL SYLLABLE MILM;Lo;0;L;;;;;N;;;;;
+BC03;HANGUL SYLLABLE MILB;Lo;0;L;;;;;N;;;;;
+BC04;HANGUL SYLLABLE MILS;Lo;0;L;;;;;N;;;;;
+BC05;HANGUL SYLLABLE MILT;Lo;0;L;;;;;N;;;;;
+BC06;HANGUL SYLLABLE MILP;Lo;0;L;;;;;N;;;;;
+BC07;HANGUL SYLLABLE MILH;Lo;0;L;;;;;N;;;;;
+BC08;HANGUL SYLLABLE MIM;Lo;0;L;;;;;N;;;;;
+BC09;HANGUL SYLLABLE MIB;Lo;0;L;;;;;N;;;;;
+BC0A;HANGUL SYLLABLE MIBS;Lo;0;L;;;;;N;;;;;
+BC0B;HANGUL SYLLABLE MIS;Lo;0;L;;;;;N;;;;;
+BC0C;HANGUL SYLLABLE MISS;Lo;0;L;;;;;N;;;;;
+BC0D;HANGUL SYLLABLE MING;Lo;0;L;;;;;N;;;;;
+BC0E;HANGUL SYLLABLE MIJ;Lo;0;L;;;;;N;;;;;
+BC0F;HANGUL SYLLABLE MIC;Lo;0;L;;;;;N;;;;;
+BC10;HANGUL SYLLABLE MIK;Lo;0;L;;;;;N;;;;;
+BC11;HANGUL SYLLABLE MIT;Lo;0;L;;;;;N;;;;;
+BC12;HANGUL SYLLABLE MIP;Lo;0;L;;;;;N;;;;;
+BC13;HANGUL SYLLABLE MIH;Lo;0;L;;;;;N;;;;;
+BC14;HANGUL SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+BC15;HANGUL SYLLABLE BAG;Lo;0;L;;;;;N;;;;;
+BC16;HANGUL SYLLABLE BAGG;Lo;0;L;;;;;N;;;;;
+BC17;HANGUL SYLLABLE BAGS;Lo;0;L;;;;;N;;;;;
+BC18;HANGUL SYLLABLE BAN;Lo;0;L;;;;;N;;;;;
+BC19;HANGUL SYLLABLE BANI;Lo;0;L;;;;;N;;;;;
+BC1A;HANGUL SYLLABLE BANH;Lo;0;L;;;;;N;;;;;
+BC1B;HANGUL SYLLABLE BAD;Lo;0;L;;;;;N;;;;;
+BC1C;HANGUL SYLLABLE BAL;Lo;0;L;;;;;N;;;;;
+BC1D;HANGUL SYLLABLE BALG;Lo;0;L;;;;;N;;;;;
+BC1E;HANGUL SYLLABLE BALM;Lo;0;L;;;;;N;;;;;
+BC1F;HANGUL SYLLABLE BALB;Lo;0;L;;;;;N;;;;;
+BC20;HANGUL SYLLABLE BALS;Lo;0;L;;;;;N;;;;;
+BC21;HANGUL SYLLABLE BALT;Lo;0;L;;;;;N;;;;;
+BC22;HANGUL SYLLABLE BALP;Lo;0;L;;;;;N;;;;;
+BC23;HANGUL SYLLABLE BALH;Lo;0;L;;;;;N;;;;;
+BC24;HANGUL SYLLABLE BAM;Lo;0;L;;;;;N;;;;;
+BC25;HANGUL SYLLABLE BAB;Lo;0;L;;;;;N;;;;;
+BC26;HANGUL SYLLABLE BABS;Lo;0;L;;;;;N;;;;;
+BC27;HANGUL SYLLABLE BAS;Lo;0;L;;;;;N;;;;;
+BC28;HANGUL SYLLABLE BASS;Lo;0;L;;;;;N;;;;;
+BC29;HANGUL SYLLABLE BANG;Lo;0;L;;;;;N;;;;;
+BC2A;HANGUL SYLLABLE BAJ;Lo;0;L;;;;;N;;;;;
+BC2B;HANGUL SYLLABLE BAC;Lo;0;L;;;;;N;;;;;
+BC2C;HANGUL SYLLABLE BAK;Lo;0;L;;;;;N;;;;;
+BC2D;HANGUL SYLLABLE BAT;Lo;0;L;;;;;N;;;;;
+BC2E;HANGUL SYLLABLE BAP;Lo;0;L;;;;;N;;;;;
+BC2F;HANGUL SYLLABLE BAH;Lo;0;L;;;;;N;;;;;
+BC30;HANGUL SYLLABLE BAE;Lo;0;L;;;;;N;;;;;
+BC31;HANGUL SYLLABLE BAEG;Lo;0;L;;;;;N;;;;;
+BC32;HANGUL SYLLABLE BAEGG;Lo;0;L;;;;;N;;;;;
+BC33;HANGUL SYLLABLE BAEGS;Lo;0;L;;;;;N;;;;;
+BC34;HANGUL SYLLABLE BAEN;Lo;0;L;;;;;N;;;;;
+BC35;HANGUL SYLLABLE BAENI;Lo;0;L;;;;;N;;;;;
+BC36;HANGUL SYLLABLE BAENH;Lo;0;L;;;;;N;;;;;
+BC37;HANGUL SYLLABLE BAED;Lo;0;L;;;;;N;;;;;
+BC38;HANGUL SYLLABLE BAEL;Lo;0;L;;;;;N;;;;;
+BC39;HANGUL SYLLABLE BAELG;Lo;0;L;;;;;N;;;;;
+BC3A;HANGUL SYLLABLE BAELM;Lo;0;L;;;;;N;;;;;
+BC3B;HANGUL SYLLABLE BAELB;Lo;0;L;;;;;N;;;;;
+BC3C;HANGUL SYLLABLE BAELS;Lo;0;L;;;;;N;;;;;
+BC3D;HANGUL SYLLABLE BAELT;Lo;0;L;;;;;N;;;;;
+BC3E;HANGUL SYLLABLE BAELP;Lo;0;L;;;;;N;;;;;
+BC3F;HANGUL SYLLABLE BAELH;Lo;0;L;;;;;N;;;;;
+BC40;HANGUL SYLLABLE BAEM;Lo;0;L;;;;;N;;;;;
+BC41;HANGUL SYLLABLE BAEB;Lo;0;L;;;;;N;;;;;
+BC42;HANGUL SYLLABLE BAEBS;Lo;0;L;;;;;N;;;;;
+BC43;HANGUL SYLLABLE BAES;Lo;0;L;;;;;N;;;;;
+BC44;HANGUL SYLLABLE BAESS;Lo;0;L;;;;;N;;;;;
+BC45;HANGUL SYLLABLE BAENG;Lo;0;L;;;;;N;;;;;
+BC46;HANGUL SYLLABLE BAEJ;Lo;0;L;;;;;N;;;;;
+BC47;HANGUL SYLLABLE BAEC;Lo;0;L;;;;;N;;;;;
+BC48;HANGUL SYLLABLE BAEK;Lo;0;L;;;;;N;;;;;
+BC49;HANGUL SYLLABLE BAET;Lo;0;L;;;;;N;;;;;
+BC4A;HANGUL SYLLABLE BAEP;Lo;0;L;;;;;N;;;;;
+BC4B;HANGUL SYLLABLE BAEH;Lo;0;L;;;;;N;;;;;
+BC4C;HANGUL SYLLABLE BYA;Lo;0;L;;;;;N;;;;;
+BC4D;HANGUL SYLLABLE BYAG;Lo;0;L;;;;;N;;;;;
+BC4E;HANGUL SYLLABLE BYAGG;Lo;0;L;;;;;N;;;;;
+BC4F;HANGUL SYLLABLE BYAGS;Lo;0;L;;;;;N;;;;;
+BC50;HANGUL SYLLABLE BYAN;Lo;0;L;;;;;N;;;;;
+BC51;HANGUL SYLLABLE BYANI;Lo;0;L;;;;;N;;;;;
+BC52;HANGUL SYLLABLE BYANH;Lo;0;L;;;;;N;;;;;
+BC53;HANGUL SYLLABLE BYAD;Lo;0;L;;;;;N;;;;;
+BC54;HANGUL SYLLABLE BYAL;Lo;0;L;;;;;N;;;;;
+BC55;HANGUL SYLLABLE BYALG;Lo;0;L;;;;;N;;;;;
+BC56;HANGUL SYLLABLE BYALM;Lo;0;L;;;;;N;;;;;
+BC57;HANGUL SYLLABLE BYALB;Lo;0;L;;;;;N;;;;;
+BC58;HANGUL SYLLABLE BYALS;Lo;0;L;;;;;N;;;;;
+BC59;HANGUL SYLLABLE BYALT;Lo;0;L;;;;;N;;;;;
+BC5A;HANGUL SYLLABLE BYALP;Lo;0;L;;;;;N;;;;;
+BC5B;HANGUL SYLLABLE BYALH;Lo;0;L;;;;;N;;;;;
+BC5C;HANGUL SYLLABLE BYAM;Lo;0;L;;;;;N;;;;;
+BC5D;HANGUL SYLLABLE BYAB;Lo;0;L;;;;;N;;;;;
+BC5E;HANGUL SYLLABLE BYABS;Lo;0;L;;;;;N;;;;;
+BC5F;HANGUL SYLLABLE BYAS;Lo;0;L;;;;;N;;;;;
+BC60;HANGUL SYLLABLE BYASS;Lo;0;L;;;;;N;;;;;
+BC61;HANGUL SYLLABLE BYANG;Lo;0;L;;;;;N;;;;;
+BC62;HANGUL SYLLABLE BYAJ;Lo;0;L;;;;;N;;;;;
+BC63;HANGUL SYLLABLE BYAC;Lo;0;L;;;;;N;;;;;
+BC64;HANGUL SYLLABLE BYAK;Lo;0;L;;;;;N;;;;;
+BC65;HANGUL SYLLABLE BYAT;Lo;0;L;;;;;N;;;;;
+BC66;HANGUL SYLLABLE BYAP;Lo;0;L;;;;;N;;;;;
+BC67;HANGUL SYLLABLE BYAH;Lo;0;L;;;;;N;;;;;
+BC68;HANGUL SYLLABLE BYAE;Lo;0;L;;;;;N;;;;;
+BC69;HANGUL SYLLABLE BYAEG;Lo;0;L;;;;;N;;;;;
+BC6A;HANGUL SYLLABLE BYAEGG;Lo;0;L;;;;;N;;;;;
+BC6B;HANGUL SYLLABLE BYAEGS;Lo;0;L;;;;;N;;;;;
+BC6C;HANGUL SYLLABLE BYAEN;Lo;0;L;;;;;N;;;;;
+BC6D;HANGUL SYLLABLE BYAENI;Lo;0;L;;;;;N;;;;;
+BC6E;HANGUL SYLLABLE BYAENH;Lo;0;L;;;;;N;;;;;
+BC6F;HANGUL SYLLABLE BYAED;Lo;0;L;;;;;N;;;;;
+BC70;HANGUL SYLLABLE BYAEL;Lo;0;L;;;;;N;;;;;
+BC71;HANGUL SYLLABLE BYAELG;Lo;0;L;;;;;N;;;;;
+BC72;HANGUL SYLLABLE BYAELM;Lo;0;L;;;;;N;;;;;
+BC73;HANGUL SYLLABLE BYAELB;Lo;0;L;;;;;N;;;;;
+BC74;HANGUL SYLLABLE BYAELS;Lo;0;L;;;;;N;;;;;
+BC75;HANGUL SYLLABLE BYAELT;Lo;0;L;;;;;N;;;;;
+BC76;HANGUL SYLLABLE BYAELP;Lo;0;L;;;;;N;;;;;
+BC77;HANGUL SYLLABLE BYAELH;Lo;0;L;;;;;N;;;;;
+BC78;HANGUL SYLLABLE BYAEM;Lo;0;L;;;;;N;;;;;
+BC79;HANGUL SYLLABLE BYAEB;Lo;0;L;;;;;N;;;;;
+BC7A;HANGUL SYLLABLE BYAEBS;Lo;0;L;;;;;N;;;;;
+BC7B;HANGUL SYLLABLE BYAES;Lo;0;L;;;;;N;;;;;
+BC7C;HANGUL SYLLABLE BYAESS;Lo;0;L;;;;;N;;;;;
+BC7D;HANGUL SYLLABLE BYAENG;Lo;0;L;;;;;N;;;;;
+BC7E;HANGUL SYLLABLE BYAEJ;Lo;0;L;;;;;N;;;;;
+BC7F;HANGUL SYLLABLE BYAEC;Lo;0;L;;;;;N;;;;;
+BC80;HANGUL SYLLABLE BYAEK;Lo;0;L;;;;;N;;;;;
+BC81;HANGUL SYLLABLE BYAET;Lo;0;L;;;;;N;;;;;
+BC82;HANGUL SYLLABLE BYAEP;Lo;0;L;;;;;N;;;;;
+BC83;HANGUL SYLLABLE BYAEH;Lo;0;L;;;;;N;;;;;
+BC84;HANGUL SYLLABLE BEO;Lo;0;L;;;;;N;;;;;
+BC85;HANGUL SYLLABLE BEOG;Lo;0;L;;;;;N;;;;;
+BC86;HANGUL SYLLABLE BEOGG;Lo;0;L;;;;;N;;;;;
+BC87;HANGUL SYLLABLE BEOGS;Lo;0;L;;;;;N;;;;;
+BC88;HANGUL SYLLABLE BEON;Lo;0;L;;;;;N;;;;;
+BC89;HANGUL SYLLABLE BEONI;Lo;0;L;;;;;N;;;;;
+BC8A;HANGUL SYLLABLE BEONH;Lo;0;L;;;;;N;;;;;
+BC8B;HANGUL SYLLABLE BEOD;Lo;0;L;;;;;N;;;;;
+BC8C;HANGUL SYLLABLE BEOL;Lo;0;L;;;;;N;;;;;
+BC8D;HANGUL SYLLABLE BEOLG;Lo;0;L;;;;;N;;;;;
+BC8E;HANGUL SYLLABLE BEOLM;Lo;0;L;;;;;N;;;;;
+BC8F;HANGUL SYLLABLE BEOLB;Lo;0;L;;;;;N;;;;;
+BC90;HANGUL SYLLABLE BEOLS;Lo;0;L;;;;;N;;;;;
+BC91;HANGUL SYLLABLE BEOLT;Lo;0;L;;;;;N;;;;;
+BC92;HANGUL SYLLABLE BEOLP;Lo;0;L;;;;;N;;;;;
+BC93;HANGUL SYLLABLE BEOLH;Lo;0;L;;;;;N;;;;;
+BC94;HANGUL SYLLABLE BEOM;Lo;0;L;;;;;N;;;;;
+BC95;HANGUL SYLLABLE BEOB;Lo;0;L;;;;;N;;;;;
+BC96;HANGUL SYLLABLE BEOBS;Lo;0;L;;;;;N;;;;;
+BC97;HANGUL SYLLABLE BEOS;Lo;0;L;;;;;N;;;;;
+BC98;HANGUL SYLLABLE BEOSS;Lo;0;L;;;;;N;;;;;
+BC99;HANGUL SYLLABLE BEONG;Lo;0;L;;;;;N;;;;;
+BC9A;HANGUL SYLLABLE BEOJ;Lo;0;L;;;;;N;;;;;
+BC9B;HANGUL SYLLABLE BEOC;Lo;0;L;;;;;N;;;;;
+BC9C;HANGUL SYLLABLE BEOK;Lo;0;L;;;;;N;;;;;
+BC9D;HANGUL SYLLABLE BEOT;Lo;0;L;;;;;N;;;;;
+BC9E;HANGUL SYLLABLE BEOP;Lo;0;L;;;;;N;;;;;
+BC9F;HANGUL SYLLABLE BEOH;Lo;0;L;;;;;N;;;;;
+BCA0;HANGUL SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+BCA1;HANGUL SYLLABLE BEG;Lo;0;L;;;;;N;;;;;
+BCA2;HANGUL SYLLABLE BEGG;Lo;0;L;;;;;N;;;;;
+BCA3;HANGUL SYLLABLE BEGS;Lo;0;L;;;;;N;;;;;
+BCA4;HANGUL SYLLABLE BEN;Lo;0;L;;;;;N;;;;;
+BCA5;HANGUL SYLLABLE BENI;Lo;0;L;;;;;N;;;;;
+BCA6;HANGUL SYLLABLE BENH;Lo;0;L;;;;;N;;;;;
+BCA7;HANGUL SYLLABLE BED;Lo;0;L;;;;;N;;;;;
+BCA8;HANGUL SYLLABLE BEL;Lo;0;L;;;;;N;;;;;
+BCA9;HANGUL SYLLABLE BELG;Lo;0;L;;;;;N;;;;;
+BCAA;HANGUL SYLLABLE BELM;Lo;0;L;;;;;N;;;;;
+BCAB;HANGUL SYLLABLE BELB;Lo;0;L;;;;;N;;;;;
+BCAC;HANGUL SYLLABLE BELS;Lo;0;L;;;;;N;;;;;
+BCAD;HANGUL SYLLABLE BELT;Lo;0;L;;;;;N;;;;;
+BCAE;HANGUL SYLLABLE BELP;Lo;0;L;;;;;N;;;;;
+BCAF;HANGUL SYLLABLE BELH;Lo;0;L;;;;;N;;;;;
+BCB0;HANGUL SYLLABLE BEM;Lo;0;L;;;;;N;;;;;
+BCB1;HANGUL SYLLABLE BEB;Lo;0;L;;;;;N;;;;;
+BCB2;HANGUL SYLLABLE BEBS;Lo;0;L;;;;;N;;;;;
+BCB3;HANGUL SYLLABLE BES;Lo;0;L;;;;;N;;;;;
+BCB4;HANGUL SYLLABLE BESS;Lo;0;L;;;;;N;;;;;
+BCB5;HANGUL SYLLABLE BENG;Lo;0;L;;;;;N;;;;;
+BCB6;HANGUL SYLLABLE BEJ;Lo;0;L;;;;;N;;;;;
+BCB7;HANGUL SYLLABLE BEC;Lo;0;L;;;;;N;;;;;
+BCB8;HANGUL SYLLABLE BEK;Lo;0;L;;;;;N;;;;;
+BCB9;HANGUL SYLLABLE BET;Lo;0;L;;;;;N;;;;;
+BCBA;HANGUL SYLLABLE BEP;Lo;0;L;;;;;N;;;;;
+BCBB;HANGUL SYLLABLE BEH;Lo;0;L;;;;;N;;;;;
+BCBC;HANGUL SYLLABLE BYEO;Lo;0;L;;;;;N;;;;;
+BCBD;HANGUL SYLLABLE BYEOG;Lo;0;L;;;;;N;;;;;
+BCBE;HANGUL SYLLABLE BYEOGG;Lo;0;L;;;;;N;;;;;
+BCBF;HANGUL SYLLABLE BYEOGS;Lo;0;L;;;;;N;;;;;
+BCC0;HANGUL SYLLABLE BYEON;Lo;0;L;;;;;N;;;;;
+BCC1;HANGUL SYLLABLE BYEONI;Lo;0;L;;;;;N;;;;;
+BCC2;HANGUL SYLLABLE BYEONH;Lo;0;L;;;;;N;;;;;
+BCC3;HANGUL SYLLABLE BYEOD;Lo;0;L;;;;;N;;;;;
+BCC4;HANGUL SYLLABLE BYEOL;Lo;0;L;;;;;N;;;;;
+BCC5;HANGUL SYLLABLE BYEOLG;Lo;0;L;;;;;N;;;;;
+BCC6;HANGUL SYLLABLE BYEOLM;Lo;0;L;;;;;N;;;;;
+BCC7;HANGUL SYLLABLE BYEOLB;Lo;0;L;;;;;N;;;;;
+BCC8;HANGUL SYLLABLE BYEOLS;Lo;0;L;;;;;N;;;;;
+BCC9;HANGUL SYLLABLE BYEOLT;Lo;0;L;;;;;N;;;;;
+BCCA;HANGUL SYLLABLE BYEOLP;Lo;0;L;;;;;N;;;;;
+BCCB;HANGUL SYLLABLE BYEOLH;Lo;0;L;;;;;N;;;;;
+BCCC;HANGUL SYLLABLE BYEOM;Lo;0;L;;;;;N;;;;;
+BCCD;HANGUL SYLLABLE BYEOB;Lo;0;L;;;;;N;;;;;
+BCCE;HANGUL SYLLABLE BYEOBS;Lo;0;L;;;;;N;;;;;
+BCCF;HANGUL SYLLABLE BYEOS;Lo;0;L;;;;;N;;;;;
+BCD0;HANGUL SYLLABLE BYEOSS;Lo;0;L;;;;;N;;;;;
+BCD1;HANGUL SYLLABLE BYEONG;Lo;0;L;;;;;N;;;;;
+BCD2;HANGUL SYLLABLE BYEOJ;Lo;0;L;;;;;N;;;;;
+BCD3;HANGUL SYLLABLE BYEOC;Lo;0;L;;;;;N;;;;;
+BCD4;HANGUL SYLLABLE BYEOK;Lo;0;L;;;;;N;;;;;
+BCD5;HANGUL SYLLABLE BYEOT;Lo;0;L;;;;;N;;;;;
+BCD6;HANGUL SYLLABLE BYEOP;Lo;0;L;;;;;N;;;;;
+BCD7;HANGUL SYLLABLE BYEOH;Lo;0;L;;;;;N;;;;;
+BCD8;HANGUL SYLLABLE BYE;Lo;0;L;;;;;N;;;;;
+BCD9;HANGUL SYLLABLE BYEG;Lo;0;L;;;;;N;;;;;
+BCDA;HANGUL SYLLABLE BYEGG;Lo;0;L;;;;;N;;;;;
+BCDB;HANGUL SYLLABLE BYEGS;Lo;0;L;;;;;N;;;;;
+BCDC;HANGUL SYLLABLE BYEN;Lo;0;L;;;;;N;;;;;
+BCDD;HANGUL SYLLABLE BYENI;Lo;0;L;;;;;N;;;;;
+BCDE;HANGUL SYLLABLE BYENH;Lo;0;L;;;;;N;;;;;
+BCDF;HANGUL SYLLABLE BYED;Lo;0;L;;;;;N;;;;;
+BCE0;HANGUL SYLLABLE BYEL;Lo;0;L;;;;;N;;;;;
+BCE1;HANGUL SYLLABLE BYELG;Lo;0;L;;;;;N;;;;;
+BCE2;HANGUL SYLLABLE BYELM;Lo;0;L;;;;;N;;;;;
+BCE3;HANGUL SYLLABLE BYELB;Lo;0;L;;;;;N;;;;;
+BCE4;HANGUL SYLLABLE BYELS;Lo;0;L;;;;;N;;;;;
+BCE5;HANGUL SYLLABLE BYELT;Lo;0;L;;;;;N;;;;;
+BCE6;HANGUL SYLLABLE BYELP;Lo;0;L;;;;;N;;;;;
+BCE7;HANGUL SYLLABLE BYELH;Lo;0;L;;;;;N;;;;;
+BCE8;HANGUL SYLLABLE BYEM;Lo;0;L;;;;;N;;;;;
+BCE9;HANGUL SYLLABLE BYEB;Lo;0;L;;;;;N;;;;;
+BCEA;HANGUL SYLLABLE BYEBS;Lo;0;L;;;;;N;;;;;
+BCEB;HANGUL SYLLABLE BYES;Lo;0;L;;;;;N;;;;;
+BCEC;HANGUL SYLLABLE BYESS;Lo;0;L;;;;;N;;;;;
+BCED;HANGUL SYLLABLE BYENG;Lo;0;L;;;;;N;;;;;
+BCEE;HANGUL SYLLABLE BYEJ;Lo;0;L;;;;;N;;;;;
+BCEF;HANGUL SYLLABLE BYEC;Lo;0;L;;;;;N;;;;;
+BCF0;HANGUL SYLLABLE BYEK;Lo;0;L;;;;;N;;;;;
+BCF1;HANGUL SYLLABLE BYET;Lo;0;L;;;;;N;;;;;
+BCF2;HANGUL SYLLABLE BYEP;Lo;0;L;;;;;N;;;;;
+BCF3;HANGUL SYLLABLE BYEH;Lo;0;L;;;;;N;;;;;
+BCF4;HANGUL SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+BCF5;HANGUL SYLLABLE BOG;Lo;0;L;;;;;N;;;;;
+BCF6;HANGUL SYLLABLE BOGG;Lo;0;L;;;;;N;;;;;
+BCF7;HANGUL SYLLABLE BOGS;Lo;0;L;;;;;N;;;;;
+BCF8;HANGUL SYLLABLE BON;Lo;0;L;;;;;N;;;;;
+BCF9;HANGUL SYLLABLE BONI;Lo;0;L;;;;;N;;;;;
+BCFA;HANGUL SYLLABLE BONH;Lo;0;L;;;;;N;;;;;
+BCFB;HANGUL SYLLABLE BOD;Lo;0;L;;;;;N;;;;;
+BCFC;HANGUL SYLLABLE BOL;Lo;0;L;;;;;N;;;;;
+BCFD;HANGUL SYLLABLE BOLG;Lo;0;L;;;;;N;;;;;
+BCFE;HANGUL SYLLABLE BOLM;Lo;0;L;;;;;N;;;;;
+BCFF;HANGUL SYLLABLE BOLB;Lo;0;L;;;;;N;;;;;
+BD00;HANGUL SYLLABLE BOLS;Lo;0;L;;;;;N;;;;;
+BD01;HANGUL SYLLABLE BOLT;Lo;0;L;;;;;N;;;;;
+BD02;HANGUL SYLLABLE BOLP;Lo;0;L;;;;;N;;;;;
+BD03;HANGUL SYLLABLE BOLH;Lo;0;L;;;;;N;;;;;
+BD04;HANGUL SYLLABLE BOM;Lo;0;L;;;;;N;;;;;
+BD05;HANGUL SYLLABLE BOB;Lo;0;L;;;;;N;;;;;
+BD06;HANGUL SYLLABLE BOBS;Lo;0;L;;;;;N;;;;;
+BD07;HANGUL SYLLABLE BOS;Lo;0;L;;;;;N;;;;;
+BD08;HANGUL SYLLABLE BOSS;Lo;0;L;;;;;N;;;;;
+BD09;HANGUL SYLLABLE BONG;Lo;0;L;;;;;N;;;;;
+BD0A;HANGUL SYLLABLE BOJ;Lo;0;L;;;;;N;;;;;
+BD0B;HANGUL SYLLABLE BOC;Lo;0;L;;;;;N;;;;;
+BD0C;HANGUL SYLLABLE BOK;Lo;0;L;;;;;N;;;;;
+BD0D;HANGUL SYLLABLE BOT;Lo;0;L;;;;;N;;;;;
+BD0E;HANGUL SYLLABLE BOP;Lo;0;L;;;;;N;;;;;
+BD0F;HANGUL SYLLABLE BOH;Lo;0;L;;;;;N;;;;;
+BD10;HANGUL SYLLABLE BWA;Lo;0;L;;;;;N;;;;;
+BD11;HANGUL SYLLABLE BWAG;Lo;0;L;;;;;N;;;;;
+BD12;HANGUL SYLLABLE BWAGG;Lo;0;L;;;;;N;;;;;
+BD13;HANGUL SYLLABLE BWAGS;Lo;0;L;;;;;N;;;;;
+BD14;HANGUL SYLLABLE BWAN;Lo;0;L;;;;;N;;;;;
+BD15;HANGUL SYLLABLE BWANI;Lo;0;L;;;;;N;;;;;
+BD16;HANGUL SYLLABLE BWANH;Lo;0;L;;;;;N;;;;;
+BD17;HANGUL SYLLABLE BWAD;Lo;0;L;;;;;N;;;;;
+BD18;HANGUL SYLLABLE BWAL;Lo;0;L;;;;;N;;;;;
+BD19;HANGUL SYLLABLE BWALG;Lo;0;L;;;;;N;;;;;
+BD1A;HANGUL SYLLABLE BWALM;Lo;0;L;;;;;N;;;;;
+BD1B;HANGUL SYLLABLE BWALB;Lo;0;L;;;;;N;;;;;
+BD1C;HANGUL SYLLABLE BWALS;Lo;0;L;;;;;N;;;;;
+BD1D;HANGUL SYLLABLE BWALT;Lo;0;L;;;;;N;;;;;
+BD1E;HANGUL SYLLABLE BWALP;Lo;0;L;;;;;N;;;;;
+BD1F;HANGUL SYLLABLE BWALH;Lo;0;L;;;;;N;;;;;
+BD20;HANGUL SYLLABLE BWAM;Lo;0;L;;;;;N;;;;;
+BD21;HANGUL SYLLABLE BWAB;Lo;0;L;;;;;N;;;;;
+BD22;HANGUL SYLLABLE BWABS;Lo;0;L;;;;;N;;;;;
+BD23;HANGUL SYLLABLE BWAS;Lo;0;L;;;;;N;;;;;
+BD24;HANGUL SYLLABLE BWASS;Lo;0;L;;;;;N;;;;;
+BD25;HANGUL SYLLABLE BWANG;Lo;0;L;;;;;N;;;;;
+BD26;HANGUL SYLLABLE BWAJ;Lo;0;L;;;;;N;;;;;
+BD27;HANGUL SYLLABLE BWAC;Lo;0;L;;;;;N;;;;;
+BD28;HANGUL SYLLABLE BWAK;Lo;0;L;;;;;N;;;;;
+BD29;HANGUL SYLLABLE BWAT;Lo;0;L;;;;;N;;;;;
+BD2A;HANGUL SYLLABLE BWAP;Lo;0;L;;;;;N;;;;;
+BD2B;HANGUL SYLLABLE BWAH;Lo;0;L;;;;;N;;;;;
+BD2C;HANGUL SYLLABLE BWAE;Lo;0;L;;;;;N;;;;;
+BD2D;HANGUL SYLLABLE BWAEG;Lo;0;L;;;;;N;;;;;
+BD2E;HANGUL SYLLABLE BWAEGG;Lo;0;L;;;;;N;;;;;
+BD2F;HANGUL SYLLABLE BWAEGS;Lo;0;L;;;;;N;;;;;
+BD30;HANGUL SYLLABLE BWAEN;Lo;0;L;;;;;N;;;;;
+BD31;HANGUL SYLLABLE BWAENI;Lo;0;L;;;;;N;;;;;
+BD32;HANGUL SYLLABLE BWAENH;Lo;0;L;;;;;N;;;;;
+BD33;HANGUL SYLLABLE BWAED;Lo;0;L;;;;;N;;;;;
+BD34;HANGUL SYLLABLE BWAEL;Lo;0;L;;;;;N;;;;;
+BD35;HANGUL SYLLABLE BWAELG;Lo;0;L;;;;;N;;;;;
+BD36;HANGUL SYLLABLE BWAELM;Lo;0;L;;;;;N;;;;;
+BD37;HANGUL SYLLABLE BWAELB;Lo;0;L;;;;;N;;;;;
+BD38;HANGUL SYLLABLE BWAELS;Lo;0;L;;;;;N;;;;;
+BD39;HANGUL SYLLABLE BWAELT;Lo;0;L;;;;;N;;;;;
+BD3A;HANGUL SYLLABLE BWAELP;Lo;0;L;;;;;N;;;;;
+BD3B;HANGUL SYLLABLE BWAELH;Lo;0;L;;;;;N;;;;;
+BD3C;HANGUL SYLLABLE BWAEM;Lo;0;L;;;;;N;;;;;
+BD3D;HANGUL SYLLABLE BWAEB;Lo;0;L;;;;;N;;;;;
+BD3E;HANGUL SYLLABLE BWAEBS;Lo;0;L;;;;;N;;;;;
+BD3F;HANGUL SYLLABLE BWAES;Lo;0;L;;;;;N;;;;;
+BD40;HANGUL SYLLABLE BWAESS;Lo;0;L;;;;;N;;;;;
+BD41;HANGUL SYLLABLE BWAENG;Lo;0;L;;;;;N;;;;;
+BD42;HANGUL SYLLABLE BWAEJ;Lo;0;L;;;;;N;;;;;
+BD43;HANGUL SYLLABLE BWAEC;Lo;0;L;;;;;N;;;;;
+BD44;HANGUL SYLLABLE BWAEK;Lo;0;L;;;;;N;;;;;
+BD45;HANGUL SYLLABLE BWAET;Lo;0;L;;;;;N;;;;;
+BD46;HANGUL SYLLABLE BWAEP;Lo;0;L;;;;;N;;;;;
+BD47;HANGUL SYLLABLE BWAEH;Lo;0;L;;;;;N;;;;;
+BD48;HANGUL SYLLABLE BOE;Lo;0;L;;;;;N;;;;;
+BD49;HANGUL SYLLABLE BOEG;Lo;0;L;;;;;N;;;;;
+BD4A;HANGUL SYLLABLE BOEGG;Lo;0;L;;;;;N;;;;;
+BD4B;HANGUL SYLLABLE BOEGS;Lo;0;L;;;;;N;;;;;
+BD4C;HANGUL SYLLABLE BOEN;Lo;0;L;;;;;N;;;;;
+BD4D;HANGUL SYLLABLE BOENI;Lo;0;L;;;;;N;;;;;
+BD4E;HANGUL SYLLABLE BOENH;Lo;0;L;;;;;N;;;;;
+BD4F;HANGUL SYLLABLE BOED;Lo;0;L;;;;;N;;;;;
+BD50;HANGUL SYLLABLE BOEL;Lo;0;L;;;;;N;;;;;
+BD51;HANGUL SYLLABLE BOELG;Lo;0;L;;;;;N;;;;;
+BD52;HANGUL SYLLABLE BOELM;Lo;0;L;;;;;N;;;;;
+BD53;HANGUL SYLLABLE BOELB;Lo;0;L;;;;;N;;;;;
+BD54;HANGUL SYLLABLE BOELS;Lo;0;L;;;;;N;;;;;
+BD55;HANGUL SYLLABLE BOELT;Lo;0;L;;;;;N;;;;;
+BD56;HANGUL SYLLABLE BOELP;Lo;0;L;;;;;N;;;;;
+BD57;HANGUL SYLLABLE BOELH;Lo;0;L;;;;;N;;;;;
+BD58;HANGUL SYLLABLE BOEM;Lo;0;L;;;;;N;;;;;
+BD59;HANGUL SYLLABLE BOEB;Lo;0;L;;;;;N;;;;;
+BD5A;HANGUL SYLLABLE BOEBS;Lo;0;L;;;;;N;;;;;
+BD5B;HANGUL SYLLABLE BOES;Lo;0;L;;;;;N;;;;;
+BD5C;HANGUL SYLLABLE BOESS;Lo;0;L;;;;;N;;;;;
+BD5D;HANGUL SYLLABLE BOENG;Lo;0;L;;;;;N;;;;;
+BD5E;HANGUL SYLLABLE BOEJ;Lo;0;L;;;;;N;;;;;
+BD5F;HANGUL SYLLABLE BOEC;Lo;0;L;;;;;N;;;;;
+BD60;HANGUL SYLLABLE BOEK;Lo;0;L;;;;;N;;;;;
+BD61;HANGUL SYLLABLE BOET;Lo;0;L;;;;;N;;;;;
+BD62;HANGUL SYLLABLE BOEP;Lo;0;L;;;;;N;;;;;
+BD63;HANGUL SYLLABLE BOEH;Lo;0;L;;;;;N;;;;;
+BD64;HANGUL SYLLABLE BYO;Lo;0;L;;;;;N;;;;;
+BD65;HANGUL SYLLABLE BYOG;Lo;0;L;;;;;N;;;;;
+BD66;HANGUL SYLLABLE BYOGG;Lo;0;L;;;;;N;;;;;
+BD67;HANGUL SYLLABLE BYOGS;Lo;0;L;;;;;N;;;;;
+BD68;HANGUL SYLLABLE BYON;Lo;0;L;;;;;N;;;;;
+BD69;HANGUL SYLLABLE BYONI;Lo;0;L;;;;;N;;;;;
+BD6A;HANGUL SYLLABLE BYONH;Lo;0;L;;;;;N;;;;;
+BD6B;HANGUL SYLLABLE BYOD;Lo;0;L;;;;;N;;;;;
+BD6C;HANGUL SYLLABLE BYOL;Lo;0;L;;;;;N;;;;;
+BD6D;HANGUL SYLLABLE BYOLG;Lo;0;L;;;;;N;;;;;
+BD6E;HANGUL SYLLABLE BYOLM;Lo;0;L;;;;;N;;;;;
+BD6F;HANGUL SYLLABLE BYOLB;Lo;0;L;;;;;N;;;;;
+BD70;HANGUL SYLLABLE BYOLS;Lo;0;L;;;;;N;;;;;
+BD71;HANGUL SYLLABLE BYOLT;Lo;0;L;;;;;N;;;;;
+BD72;HANGUL SYLLABLE BYOLP;Lo;0;L;;;;;N;;;;;
+BD73;HANGUL SYLLABLE BYOLH;Lo;0;L;;;;;N;;;;;
+BD74;HANGUL SYLLABLE BYOM;Lo;0;L;;;;;N;;;;;
+BD75;HANGUL SYLLABLE BYOB;Lo;0;L;;;;;N;;;;;
+BD76;HANGUL SYLLABLE BYOBS;Lo;0;L;;;;;N;;;;;
+BD77;HANGUL SYLLABLE BYOS;Lo;0;L;;;;;N;;;;;
+BD78;HANGUL SYLLABLE BYOSS;Lo;0;L;;;;;N;;;;;
+BD79;HANGUL SYLLABLE BYONG;Lo;0;L;;;;;N;;;;;
+BD7A;HANGUL SYLLABLE BYOJ;Lo;0;L;;;;;N;;;;;
+BD7B;HANGUL SYLLABLE BYOC;Lo;0;L;;;;;N;;;;;
+BD7C;HANGUL SYLLABLE BYOK;Lo;0;L;;;;;N;;;;;
+BD7D;HANGUL SYLLABLE BYOT;Lo;0;L;;;;;N;;;;;
+BD7E;HANGUL SYLLABLE BYOP;Lo;0;L;;;;;N;;;;;
+BD7F;HANGUL SYLLABLE BYOH;Lo;0;L;;;;;N;;;;;
+BD80;HANGUL SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+BD81;HANGUL SYLLABLE BUG;Lo;0;L;;;;;N;;;;;
+BD82;HANGUL SYLLABLE BUGG;Lo;0;L;;;;;N;;;;;
+BD83;HANGUL SYLLABLE BUGS;Lo;0;L;;;;;N;;;;;
+BD84;HANGUL SYLLABLE BUN;Lo;0;L;;;;;N;;;;;
+BD85;HANGUL SYLLABLE BUNI;Lo;0;L;;;;;N;;;;;
+BD86;HANGUL SYLLABLE BUNH;Lo;0;L;;;;;N;;;;;
+BD87;HANGUL SYLLABLE BUD;Lo;0;L;;;;;N;;;;;
+BD88;HANGUL SYLLABLE BUL;Lo;0;L;;;;;N;;;;;
+BD89;HANGUL SYLLABLE BULG;Lo;0;L;;;;;N;;;;;
+BD8A;HANGUL SYLLABLE BULM;Lo;0;L;;;;;N;;;;;
+BD8B;HANGUL SYLLABLE BULB;Lo;0;L;;;;;N;;;;;
+BD8C;HANGUL SYLLABLE BULS;Lo;0;L;;;;;N;;;;;
+BD8D;HANGUL SYLLABLE BULT;Lo;0;L;;;;;N;;;;;
+BD8E;HANGUL SYLLABLE BULP;Lo;0;L;;;;;N;;;;;
+BD8F;HANGUL SYLLABLE BULH;Lo;0;L;;;;;N;;;;;
+BD90;HANGUL SYLLABLE BUM;Lo;0;L;;;;;N;;;;;
+BD91;HANGUL SYLLABLE BUB;Lo;0;L;;;;;N;;;;;
+BD92;HANGUL SYLLABLE BUBS;Lo;0;L;;;;;N;;;;;
+BD93;HANGUL SYLLABLE BUS;Lo;0;L;;;;;N;;;;;
+BD94;HANGUL SYLLABLE BUSS;Lo;0;L;;;;;N;;;;;
+BD95;HANGUL SYLLABLE BUNG;Lo;0;L;;;;;N;;;;;
+BD96;HANGUL SYLLABLE BUJ;Lo;0;L;;;;;N;;;;;
+BD97;HANGUL SYLLABLE BUC;Lo;0;L;;;;;N;;;;;
+BD98;HANGUL SYLLABLE BUK;Lo;0;L;;;;;N;;;;;
+BD99;HANGUL SYLLABLE BUT;Lo;0;L;;;;;N;;;;;
+BD9A;HANGUL SYLLABLE BUP;Lo;0;L;;;;;N;;;;;
+BD9B;HANGUL SYLLABLE BUH;Lo;0;L;;;;;N;;;;;
+BD9C;HANGUL SYLLABLE BWEO;Lo;0;L;;;;;N;;;;;
+BD9D;HANGUL SYLLABLE BWEOG;Lo;0;L;;;;;N;;;;;
+BD9E;HANGUL SYLLABLE BWEOGG;Lo;0;L;;;;;N;;;;;
+BD9F;HANGUL SYLLABLE BWEOGS;Lo;0;L;;;;;N;;;;;
+BDA0;HANGUL SYLLABLE BWEON;Lo;0;L;;;;;N;;;;;
+BDA1;HANGUL SYLLABLE BWEONI;Lo;0;L;;;;;N;;;;;
+BDA2;HANGUL SYLLABLE BWEONH;Lo;0;L;;;;;N;;;;;
+BDA3;HANGUL SYLLABLE BWEOD;Lo;0;L;;;;;N;;;;;
+BDA4;HANGUL SYLLABLE BWEOL;Lo;0;L;;;;;N;;;;;
+BDA5;HANGUL SYLLABLE BWEOLG;Lo;0;L;;;;;N;;;;;
+BDA6;HANGUL SYLLABLE BWEOLM;Lo;0;L;;;;;N;;;;;
+BDA7;HANGUL SYLLABLE BWEOLB;Lo;0;L;;;;;N;;;;;
+BDA8;HANGUL SYLLABLE BWEOLS;Lo;0;L;;;;;N;;;;;
+BDA9;HANGUL SYLLABLE BWEOLT;Lo;0;L;;;;;N;;;;;
+BDAA;HANGUL SYLLABLE BWEOLP;Lo;0;L;;;;;N;;;;;
+BDAB;HANGUL SYLLABLE BWEOLH;Lo;0;L;;;;;N;;;;;
+BDAC;HANGUL SYLLABLE BWEOM;Lo;0;L;;;;;N;;;;;
+BDAD;HANGUL SYLLABLE BWEOB;Lo;0;L;;;;;N;;;;;
+BDAE;HANGUL SYLLABLE BWEOBS;Lo;0;L;;;;;N;;;;;
+BDAF;HANGUL SYLLABLE BWEOS;Lo;0;L;;;;;N;;;;;
+BDB0;HANGUL SYLLABLE BWEOSS;Lo;0;L;;;;;N;;;;;
+BDB1;HANGUL SYLLABLE BWEONG;Lo;0;L;;;;;N;;;;;
+BDB2;HANGUL SYLLABLE BWEOJ;Lo;0;L;;;;;N;;;;;
+BDB3;HANGUL SYLLABLE BWEOC;Lo;0;L;;;;;N;;;;;
+BDB4;HANGUL SYLLABLE BWEOK;Lo;0;L;;;;;N;;;;;
+BDB5;HANGUL SYLLABLE BWEOT;Lo;0;L;;;;;N;;;;;
+BDB6;HANGUL SYLLABLE BWEOP;Lo;0;L;;;;;N;;;;;
+BDB7;HANGUL SYLLABLE BWEOH;Lo;0;L;;;;;N;;;;;
+BDB8;HANGUL SYLLABLE BWE;Lo;0;L;;;;;N;;;;;
+BDB9;HANGUL SYLLABLE BWEG;Lo;0;L;;;;;N;;;;;
+BDBA;HANGUL SYLLABLE BWEGG;Lo;0;L;;;;;N;;;;;
+BDBB;HANGUL SYLLABLE BWEGS;Lo;0;L;;;;;N;;;;;
+BDBC;HANGUL SYLLABLE BWEN;Lo;0;L;;;;;N;;;;;
+BDBD;HANGUL SYLLABLE BWENI;Lo;0;L;;;;;N;;;;;
+BDBE;HANGUL SYLLABLE BWENH;Lo;0;L;;;;;N;;;;;
+BDBF;HANGUL SYLLABLE BWED;Lo;0;L;;;;;N;;;;;
+BDC0;HANGUL SYLLABLE BWEL;Lo;0;L;;;;;N;;;;;
+BDC1;HANGUL SYLLABLE BWELG;Lo;0;L;;;;;N;;;;;
+BDC2;HANGUL SYLLABLE BWELM;Lo;0;L;;;;;N;;;;;
+BDC3;HANGUL SYLLABLE BWELB;Lo;0;L;;;;;N;;;;;
+BDC4;HANGUL SYLLABLE BWELS;Lo;0;L;;;;;N;;;;;
+BDC5;HANGUL SYLLABLE BWELT;Lo;0;L;;;;;N;;;;;
+BDC6;HANGUL SYLLABLE BWELP;Lo;0;L;;;;;N;;;;;
+BDC7;HANGUL SYLLABLE BWELH;Lo;0;L;;;;;N;;;;;
+BDC8;HANGUL SYLLABLE BWEM;Lo;0;L;;;;;N;;;;;
+BDC9;HANGUL SYLLABLE BWEB;Lo;0;L;;;;;N;;;;;
+BDCA;HANGUL SYLLABLE BWEBS;Lo;0;L;;;;;N;;;;;
+BDCB;HANGUL SYLLABLE BWES;Lo;0;L;;;;;N;;;;;
+BDCC;HANGUL SYLLABLE BWESS;Lo;0;L;;;;;N;;;;;
+BDCD;HANGUL SYLLABLE BWENG;Lo;0;L;;;;;N;;;;;
+BDCE;HANGUL SYLLABLE BWEJ;Lo;0;L;;;;;N;;;;;
+BDCF;HANGUL SYLLABLE BWEC;Lo;0;L;;;;;N;;;;;
+BDD0;HANGUL SYLLABLE BWEK;Lo;0;L;;;;;N;;;;;
+BDD1;HANGUL SYLLABLE BWET;Lo;0;L;;;;;N;;;;;
+BDD2;HANGUL SYLLABLE BWEP;Lo;0;L;;;;;N;;;;;
+BDD3;HANGUL SYLLABLE BWEH;Lo;0;L;;;;;N;;;;;
+BDD4;HANGUL SYLLABLE BWI;Lo;0;L;;;;;N;;;;;
+BDD5;HANGUL SYLLABLE BWIG;Lo;0;L;;;;;N;;;;;
+BDD6;HANGUL SYLLABLE BWIGG;Lo;0;L;;;;;N;;;;;
+BDD7;HANGUL SYLLABLE BWIGS;Lo;0;L;;;;;N;;;;;
+BDD8;HANGUL SYLLABLE BWIN;Lo;0;L;;;;;N;;;;;
+BDD9;HANGUL SYLLABLE BWINI;Lo;0;L;;;;;N;;;;;
+BDDA;HANGUL SYLLABLE BWINH;Lo;0;L;;;;;N;;;;;
+BDDB;HANGUL SYLLABLE BWID;Lo;0;L;;;;;N;;;;;
+BDDC;HANGUL SYLLABLE BWIL;Lo;0;L;;;;;N;;;;;
+BDDD;HANGUL SYLLABLE BWILG;Lo;0;L;;;;;N;;;;;
+BDDE;HANGUL SYLLABLE BWILM;Lo;0;L;;;;;N;;;;;
+BDDF;HANGUL SYLLABLE BWILB;Lo;0;L;;;;;N;;;;;
+BDE0;HANGUL SYLLABLE BWILS;Lo;0;L;;;;;N;;;;;
+BDE1;HANGUL SYLLABLE BWILT;Lo;0;L;;;;;N;;;;;
+BDE2;HANGUL SYLLABLE BWILP;Lo;0;L;;;;;N;;;;;
+BDE3;HANGUL SYLLABLE BWILH;Lo;0;L;;;;;N;;;;;
+BDE4;HANGUL SYLLABLE BWIM;Lo;0;L;;;;;N;;;;;
+BDE5;HANGUL SYLLABLE BWIB;Lo;0;L;;;;;N;;;;;
+BDE6;HANGUL SYLLABLE BWIBS;Lo;0;L;;;;;N;;;;;
+BDE7;HANGUL SYLLABLE BWIS;Lo;0;L;;;;;N;;;;;
+BDE8;HANGUL SYLLABLE BWISS;Lo;0;L;;;;;N;;;;;
+BDE9;HANGUL SYLLABLE BWING;Lo;0;L;;;;;N;;;;;
+BDEA;HANGUL SYLLABLE BWIJ;Lo;0;L;;;;;N;;;;;
+BDEB;HANGUL SYLLABLE BWIC;Lo;0;L;;;;;N;;;;;
+BDEC;HANGUL SYLLABLE BWIK;Lo;0;L;;;;;N;;;;;
+BDED;HANGUL SYLLABLE BWIT;Lo;0;L;;;;;N;;;;;
+BDEE;HANGUL SYLLABLE BWIP;Lo;0;L;;;;;N;;;;;
+BDEF;HANGUL SYLLABLE BWIH;Lo;0;L;;;;;N;;;;;
+BDF0;HANGUL SYLLABLE BYU;Lo;0;L;;;;;N;;;;;
+BDF1;HANGUL SYLLABLE BYUG;Lo;0;L;;;;;N;;;;;
+BDF2;HANGUL SYLLABLE BYUGG;Lo;0;L;;;;;N;;;;;
+BDF3;HANGUL SYLLABLE BYUGS;Lo;0;L;;;;;N;;;;;
+BDF4;HANGUL SYLLABLE BYUN;Lo;0;L;;;;;N;;;;;
+BDF5;HANGUL SYLLABLE BYUNI;Lo;0;L;;;;;N;;;;;
+BDF6;HANGUL SYLLABLE BYUNH;Lo;0;L;;;;;N;;;;;
+BDF7;HANGUL SYLLABLE BYUD;Lo;0;L;;;;;N;;;;;
+BDF8;HANGUL SYLLABLE BYUL;Lo;0;L;;;;;N;;;;;
+BDF9;HANGUL SYLLABLE BYULG;Lo;0;L;;;;;N;;;;;
+BDFA;HANGUL SYLLABLE BYULM;Lo;0;L;;;;;N;;;;;
+BDFB;HANGUL SYLLABLE BYULB;Lo;0;L;;;;;N;;;;;
+BDFC;HANGUL SYLLABLE BYULS;Lo;0;L;;;;;N;;;;;
+BDFD;HANGUL SYLLABLE BYULT;Lo;0;L;;;;;N;;;;;
+BDFE;HANGUL SYLLABLE BYULP;Lo;0;L;;;;;N;;;;;
+BDFF;HANGUL SYLLABLE BYULH;Lo;0;L;;;;;N;;;;;
+BE00;HANGUL SYLLABLE BYUM;Lo;0;L;;;;;N;;;;;
+BE01;HANGUL SYLLABLE BYUB;Lo;0;L;;;;;N;;;;;
+BE02;HANGUL SYLLABLE BYUBS;Lo;0;L;;;;;N;;;;;
+BE03;HANGUL SYLLABLE BYUS;Lo;0;L;;;;;N;;;;;
+BE04;HANGUL SYLLABLE BYUSS;Lo;0;L;;;;;N;;;;;
+BE05;HANGUL SYLLABLE BYUNG;Lo;0;L;;;;;N;;;;;
+BE06;HANGUL SYLLABLE BYUJ;Lo;0;L;;;;;N;;;;;
+BE07;HANGUL SYLLABLE BYUC;Lo;0;L;;;;;N;;;;;
+BE08;HANGUL SYLLABLE BYUK;Lo;0;L;;;;;N;;;;;
+BE09;HANGUL SYLLABLE BYUT;Lo;0;L;;;;;N;;;;;
+BE0A;HANGUL SYLLABLE BYUP;Lo;0;L;;;;;N;;;;;
+BE0B;HANGUL SYLLABLE BYUH;Lo;0;L;;;;;N;;;;;
+BE0C;HANGUL SYLLABLE BEU;Lo;0;L;;;;;N;;;;;
+BE0D;HANGUL SYLLABLE BEUG;Lo;0;L;;;;;N;;;;;
+BE0E;HANGUL SYLLABLE BEUGG;Lo;0;L;;;;;N;;;;;
+BE0F;HANGUL SYLLABLE BEUGS;Lo;0;L;;;;;N;;;;;
+BE10;HANGUL SYLLABLE BEUN;Lo;0;L;;;;;N;;;;;
+BE11;HANGUL SYLLABLE BEUNI;Lo;0;L;;;;;N;;;;;
+BE12;HANGUL SYLLABLE BEUNH;Lo;0;L;;;;;N;;;;;
+BE13;HANGUL SYLLABLE BEUD;Lo;0;L;;;;;N;;;;;
+BE14;HANGUL SYLLABLE BEUL;Lo;0;L;;;;;N;;;;;
+BE15;HANGUL SYLLABLE BEULG;Lo;0;L;;;;;N;;;;;
+BE16;HANGUL SYLLABLE BEULM;Lo;0;L;;;;;N;;;;;
+BE17;HANGUL SYLLABLE BEULB;Lo;0;L;;;;;N;;;;;
+BE18;HANGUL SYLLABLE BEULS;Lo;0;L;;;;;N;;;;;
+BE19;HANGUL SYLLABLE BEULT;Lo;0;L;;;;;N;;;;;
+BE1A;HANGUL SYLLABLE BEULP;Lo;0;L;;;;;N;;;;;
+BE1B;HANGUL SYLLABLE BEULH;Lo;0;L;;;;;N;;;;;
+BE1C;HANGUL SYLLABLE BEUM;Lo;0;L;;;;;N;;;;;
+BE1D;HANGUL SYLLABLE BEUB;Lo;0;L;;;;;N;;;;;
+BE1E;HANGUL SYLLABLE BEUBS;Lo;0;L;;;;;N;;;;;
+BE1F;HANGUL SYLLABLE BEUS;Lo;0;L;;;;;N;;;;;
+BE20;HANGUL SYLLABLE BEUSS;Lo;0;L;;;;;N;;;;;
+BE21;HANGUL SYLLABLE BEUNG;Lo;0;L;;;;;N;;;;;
+BE22;HANGUL SYLLABLE BEUJ;Lo;0;L;;;;;N;;;;;
+BE23;HANGUL SYLLABLE BEUC;Lo;0;L;;;;;N;;;;;
+BE24;HANGUL SYLLABLE BEUK;Lo;0;L;;;;;N;;;;;
+BE25;HANGUL SYLLABLE BEUT;Lo;0;L;;;;;N;;;;;
+BE26;HANGUL SYLLABLE BEUP;Lo;0;L;;;;;N;;;;;
+BE27;HANGUL SYLLABLE BEUH;Lo;0;L;;;;;N;;;;;
+BE28;HANGUL SYLLABLE BYI;Lo;0;L;;;;;N;;;;;
+BE29;HANGUL SYLLABLE BYIG;Lo;0;L;;;;;N;;;;;
+BE2A;HANGUL SYLLABLE BYIGG;Lo;0;L;;;;;N;;;;;
+BE2B;HANGUL SYLLABLE BYIGS;Lo;0;L;;;;;N;;;;;
+BE2C;HANGUL SYLLABLE BYIN;Lo;0;L;;;;;N;;;;;
+BE2D;HANGUL SYLLABLE BYINI;Lo;0;L;;;;;N;;;;;
+BE2E;HANGUL SYLLABLE BYINH;Lo;0;L;;;;;N;;;;;
+BE2F;HANGUL SYLLABLE BYID;Lo;0;L;;;;;N;;;;;
+BE30;HANGUL SYLLABLE BYIL;Lo;0;L;;;;;N;;;;;
+BE31;HANGUL SYLLABLE BYILG;Lo;0;L;;;;;N;;;;;
+BE32;HANGUL SYLLABLE BYILM;Lo;0;L;;;;;N;;;;;
+BE33;HANGUL SYLLABLE BYILB;Lo;0;L;;;;;N;;;;;
+BE34;HANGUL SYLLABLE BYILS;Lo;0;L;;;;;N;;;;;
+BE35;HANGUL SYLLABLE BYILT;Lo;0;L;;;;;N;;;;;
+BE36;HANGUL SYLLABLE BYILP;Lo;0;L;;;;;N;;;;;
+BE37;HANGUL SYLLABLE BYILH;Lo;0;L;;;;;N;;;;;
+BE38;HANGUL SYLLABLE BYIM;Lo;0;L;;;;;N;;;;;
+BE39;HANGUL SYLLABLE BYIB;Lo;0;L;;;;;N;;;;;
+BE3A;HANGUL SYLLABLE BYIBS;Lo;0;L;;;;;N;;;;;
+BE3B;HANGUL SYLLABLE BYIS;Lo;0;L;;;;;N;;;;;
+BE3C;HANGUL SYLLABLE BYISS;Lo;0;L;;;;;N;;;;;
+BE3D;HANGUL SYLLABLE BYING;Lo;0;L;;;;;N;;;;;
+BE3E;HANGUL SYLLABLE BYIJ;Lo;0;L;;;;;N;;;;;
+BE3F;HANGUL SYLLABLE BYIC;Lo;0;L;;;;;N;;;;;
+BE40;HANGUL SYLLABLE BYIK;Lo;0;L;;;;;N;;;;;
+BE41;HANGUL SYLLABLE BYIT;Lo;0;L;;;;;N;;;;;
+BE42;HANGUL SYLLABLE BYIP;Lo;0;L;;;;;N;;;;;
+BE43;HANGUL SYLLABLE BYIH;Lo;0;L;;;;;N;;;;;
+BE44;HANGUL SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+BE45;HANGUL SYLLABLE BIG;Lo;0;L;;;;;N;;;;;
+BE46;HANGUL SYLLABLE BIGG;Lo;0;L;;;;;N;;;;;
+BE47;HANGUL SYLLABLE BIGS;Lo;0;L;;;;;N;;;;;
+BE48;HANGUL SYLLABLE BIN;Lo;0;L;;;;;N;;;;;
+BE49;HANGUL SYLLABLE BINI;Lo;0;L;;;;;N;;;;;
+BE4A;HANGUL SYLLABLE BINH;Lo;0;L;;;;;N;;;;;
+BE4B;HANGUL SYLLABLE BID;Lo;0;L;;;;;N;;;;;
+BE4C;HANGUL SYLLABLE BIL;Lo;0;L;;;;;N;;;;;
+BE4D;HANGUL SYLLABLE BILG;Lo;0;L;;;;;N;;;;;
+BE4E;HANGUL SYLLABLE BILM;Lo;0;L;;;;;N;;;;;
+BE4F;HANGUL SYLLABLE BILB;Lo;0;L;;;;;N;;;;;
+BE50;HANGUL SYLLABLE BILS;Lo;0;L;;;;;N;;;;;
+BE51;HANGUL SYLLABLE BILT;Lo;0;L;;;;;N;;;;;
+BE52;HANGUL SYLLABLE BILP;Lo;0;L;;;;;N;;;;;
+BE53;HANGUL SYLLABLE BILH;Lo;0;L;;;;;N;;;;;
+BE54;HANGUL SYLLABLE BIM;Lo;0;L;;;;;N;;;;;
+BE55;HANGUL SYLLABLE BIB;Lo;0;L;;;;;N;;;;;
+BE56;HANGUL SYLLABLE BIBS;Lo;0;L;;;;;N;;;;;
+BE57;HANGUL SYLLABLE BIS;Lo;0;L;;;;;N;;;;;
+BE58;HANGUL SYLLABLE BISS;Lo;0;L;;;;;N;;;;;
+BE59;HANGUL SYLLABLE BING;Lo;0;L;;;;;N;;;;;
+BE5A;HANGUL SYLLABLE BIJ;Lo;0;L;;;;;N;;;;;
+BE5B;HANGUL SYLLABLE BIC;Lo;0;L;;;;;N;;;;;
+BE5C;HANGUL SYLLABLE BIK;Lo;0;L;;;;;N;;;;;
+BE5D;HANGUL SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
+BE5E;HANGUL SYLLABLE BIP;Lo;0;L;;;;;N;;;;;
+BE5F;HANGUL SYLLABLE BIH;Lo;0;L;;;;;N;;;;;
+BE60;HANGUL SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+BE61;HANGUL SYLLABLE BBAG;Lo;0;L;;;;;N;;;;;
+BE62;HANGUL SYLLABLE BBAGG;Lo;0;L;;;;;N;;;;;
+BE63;HANGUL SYLLABLE BBAGS;Lo;0;L;;;;;N;;;;;
+BE64;HANGUL SYLLABLE BBAN;Lo;0;L;;;;;N;;;;;
+BE65;HANGUL SYLLABLE BBANI;Lo;0;L;;;;;N;;;;;
+BE66;HANGUL SYLLABLE BBANH;Lo;0;L;;;;;N;;;;;
+BE67;HANGUL SYLLABLE BBAD;Lo;0;L;;;;;N;;;;;
+BE68;HANGUL SYLLABLE BBAL;Lo;0;L;;;;;N;;;;;
+BE69;HANGUL SYLLABLE BBALG;Lo;0;L;;;;;N;;;;;
+BE6A;HANGUL SYLLABLE BBALM;Lo;0;L;;;;;N;;;;;
+BE6B;HANGUL SYLLABLE BBALB;Lo;0;L;;;;;N;;;;;
+BE6C;HANGUL SYLLABLE BBALS;Lo;0;L;;;;;N;;;;;
+BE6D;HANGUL SYLLABLE BBALT;Lo;0;L;;;;;N;;;;;
+BE6E;HANGUL SYLLABLE BBALP;Lo;0;L;;;;;N;;;;;
+BE6F;HANGUL SYLLABLE BBALH;Lo;0;L;;;;;N;;;;;
+BE70;HANGUL SYLLABLE BBAM;Lo;0;L;;;;;N;;;;;
+BE71;HANGUL SYLLABLE BBAB;Lo;0;L;;;;;N;;;;;
+BE72;HANGUL SYLLABLE BBABS;Lo;0;L;;;;;N;;;;;
+BE73;HANGUL SYLLABLE BBAS;Lo;0;L;;;;;N;;;;;
+BE74;HANGUL SYLLABLE BBASS;Lo;0;L;;;;;N;;;;;
+BE75;HANGUL SYLLABLE BBANG;Lo;0;L;;;;;N;;;;;
+BE76;HANGUL SYLLABLE BBAJ;Lo;0;L;;;;;N;;;;;
+BE77;HANGUL SYLLABLE BBAC;Lo;0;L;;;;;N;;;;;
+BE78;HANGUL SYLLABLE BBAK;Lo;0;L;;;;;N;;;;;
+BE79;HANGUL SYLLABLE BBAT;Lo;0;L;;;;;N;;;;;
+BE7A;HANGUL SYLLABLE BBAP;Lo;0;L;;;;;N;;;;;
+BE7B;HANGUL SYLLABLE BBAH;Lo;0;L;;;;;N;;;;;
+BE7C;HANGUL SYLLABLE BBAE;Lo;0;L;;;;;N;;;;;
+BE7D;HANGUL SYLLABLE BBAEG;Lo;0;L;;;;;N;;;;;
+BE7E;HANGUL SYLLABLE BBAEGG;Lo;0;L;;;;;N;;;;;
+BE7F;HANGUL SYLLABLE BBAEGS;Lo;0;L;;;;;N;;;;;
+BE80;HANGUL SYLLABLE BBAEN;Lo;0;L;;;;;N;;;;;
+BE81;HANGUL SYLLABLE BBAENI;Lo;0;L;;;;;N;;;;;
+BE82;HANGUL SYLLABLE BBAENH;Lo;0;L;;;;;N;;;;;
+BE83;HANGUL SYLLABLE BBAED;Lo;0;L;;;;;N;;;;;
+BE84;HANGUL SYLLABLE BBAEL;Lo;0;L;;;;;N;;;;;
+BE85;HANGUL SYLLABLE BBAELG;Lo;0;L;;;;;N;;;;;
+BE86;HANGUL SYLLABLE BBAELM;Lo;0;L;;;;;N;;;;;
+BE87;HANGUL SYLLABLE BBAELB;Lo;0;L;;;;;N;;;;;
+BE88;HANGUL SYLLABLE BBAELS;Lo;0;L;;;;;N;;;;;
+BE89;HANGUL SYLLABLE BBAELT;Lo;0;L;;;;;N;;;;;
+BE8A;HANGUL SYLLABLE BBAELP;Lo;0;L;;;;;N;;;;;
+BE8B;HANGUL SYLLABLE BBAELH;Lo;0;L;;;;;N;;;;;
+BE8C;HANGUL SYLLABLE BBAEM;Lo;0;L;;;;;N;;;;;
+BE8D;HANGUL SYLLABLE BBAEB;Lo;0;L;;;;;N;;;;;
+BE8E;HANGUL SYLLABLE BBAEBS;Lo;0;L;;;;;N;;;;;
+BE8F;HANGUL SYLLABLE BBAES;Lo;0;L;;;;;N;;;;;
+BE90;HANGUL SYLLABLE BBAESS;Lo;0;L;;;;;N;;;;;
+BE91;HANGUL SYLLABLE BBAENG;Lo;0;L;;;;;N;;;;;
+BE92;HANGUL SYLLABLE BBAEJ;Lo;0;L;;;;;N;;;;;
+BE93;HANGUL SYLLABLE BBAEC;Lo;0;L;;;;;N;;;;;
+BE94;HANGUL SYLLABLE BBAEK;Lo;0;L;;;;;N;;;;;
+BE95;HANGUL SYLLABLE BBAET;Lo;0;L;;;;;N;;;;;
+BE96;HANGUL SYLLABLE BBAEP;Lo;0;L;;;;;N;;;;;
+BE97;HANGUL SYLLABLE BBAEH;Lo;0;L;;;;;N;;;;;
+BE98;HANGUL SYLLABLE BBYA;Lo;0;L;;;;;N;;;;;
+BE99;HANGUL SYLLABLE BBYAG;Lo;0;L;;;;;N;;;;;
+BE9A;HANGUL SYLLABLE BBYAGG;Lo;0;L;;;;;N;;;;;
+BE9B;HANGUL SYLLABLE BBYAGS;Lo;0;L;;;;;N;;;;;
+BE9C;HANGUL SYLLABLE BBYAN;Lo;0;L;;;;;N;;;;;
+BE9D;HANGUL SYLLABLE BBYANI;Lo;0;L;;;;;N;;;;;
+BE9E;HANGUL SYLLABLE BBYANH;Lo;0;L;;;;;N;;;;;
+BE9F;HANGUL SYLLABLE BBYAD;Lo;0;L;;;;;N;;;;;
+BEA0;HANGUL SYLLABLE BBYAL;Lo;0;L;;;;;N;;;;;
+BEA1;HANGUL SYLLABLE BBYALG;Lo;0;L;;;;;N;;;;;
+BEA2;HANGUL SYLLABLE BBYALM;Lo;0;L;;;;;N;;;;;
+BEA3;HANGUL SYLLABLE BBYALB;Lo;0;L;;;;;N;;;;;
+BEA4;HANGUL SYLLABLE BBYALS;Lo;0;L;;;;;N;;;;;
+BEA5;HANGUL SYLLABLE BBYALT;Lo;0;L;;;;;N;;;;;
+BEA6;HANGUL SYLLABLE BBYALP;Lo;0;L;;;;;N;;;;;
+BEA7;HANGUL SYLLABLE BBYALH;Lo;0;L;;;;;N;;;;;
+BEA8;HANGUL SYLLABLE BBYAM;Lo;0;L;;;;;N;;;;;
+BEA9;HANGUL SYLLABLE BBYAB;Lo;0;L;;;;;N;;;;;
+BEAA;HANGUL SYLLABLE BBYABS;Lo;0;L;;;;;N;;;;;
+BEAB;HANGUL SYLLABLE BBYAS;Lo;0;L;;;;;N;;;;;
+BEAC;HANGUL SYLLABLE BBYASS;Lo;0;L;;;;;N;;;;;
+BEAD;HANGUL SYLLABLE BBYANG;Lo;0;L;;;;;N;;;;;
+BEAE;HANGUL SYLLABLE BBYAJ;Lo;0;L;;;;;N;;;;;
+BEAF;HANGUL SYLLABLE BBYAC;Lo;0;L;;;;;N;;;;;
+BEB0;HANGUL SYLLABLE BBYAK;Lo;0;L;;;;;N;;;;;
+BEB1;HANGUL SYLLABLE BBYAT;Lo;0;L;;;;;N;;;;;
+BEB2;HANGUL SYLLABLE BBYAP;Lo;0;L;;;;;N;;;;;
+BEB3;HANGUL SYLLABLE BBYAH;Lo;0;L;;;;;N;;;;;
+BEB4;HANGUL SYLLABLE BBYAE;Lo;0;L;;;;;N;;;;;
+BEB5;HANGUL SYLLABLE BBYAEG;Lo;0;L;;;;;N;;;;;
+BEB6;HANGUL SYLLABLE BBYAEGG;Lo;0;L;;;;;N;;;;;
+BEB7;HANGUL SYLLABLE BBYAEGS;Lo;0;L;;;;;N;;;;;
+BEB8;HANGUL SYLLABLE BBYAEN;Lo;0;L;;;;;N;;;;;
+BEB9;HANGUL SYLLABLE BBYAENI;Lo;0;L;;;;;N;;;;;
+BEBA;HANGUL SYLLABLE BBYAENH;Lo;0;L;;;;;N;;;;;
+BEBB;HANGUL SYLLABLE BBYAED;Lo;0;L;;;;;N;;;;;
+BEBC;HANGUL SYLLABLE BBYAEL;Lo;0;L;;;;;N;;;;;
+BEBD;HANGUL SYLLABLE BBYAELG;Lo;0;L;;;;;N;;;;;
+BEBE;HANGUL SYLLABLE BBYAELM;Lo;0;L;;;;;N;;;;;
+BEBF;HANGUL SYLLABLE BBYAELB;Lo;0;L;;;;;N;;;;;
+BEC0;HANGUL SYLLABLE BBYAELS;Lo;0;L;;;;;N;;;;;
+BEC1;HANGUL SYLLABLE BBYAELT;Lo;0;L;;;;;N;;;;;
+BEC2;HANGUL SYLLABLE BBYAELP;Lo;0;L;;;;;N;;;;;
+BEC3;HANGUL SYLLABLE BBYAELH;Lo;0;L;;;;;N;;;;;
+BEC4;HANGUL SYLLABLE BBYAEM;Lo;0;L;;;;;N;;;;;
+BEC5;HANGUL SYLLABLE BBYAEB;Lo;0;L;;;;;N;;;;;
+BEC6;HANGUL SYLLABLE BBYAEBS;Lo;0;L;;;;;N;;;;;
+BEC7;HANGUL SYLLABLE BBYAES;Lo;0;L;;;;;N;;;;;
+BEC8;HANGUL SYLLABLE BBYAESS;Lo;0;L;;;;;N;;;;;
+BEC9;HANGUL SYLLABLE BBYAENG;Lo;0;L;;;;;N;;;;;
+BECA;HANGUL SYLLABLE BBYAEJ;Lo;0;L;;;;;N;;;;;
+BECB;HANGUL SYLLABLE BBYAEC;Lo;0;L;;;;;N;;;;;
+BECC;HANGUL SYLLABLE BBYAEK;Lo;0;L;;;;;N;;;;;
+BECD;HANGUL SYLLABLE BBYAET;Lo;0;L;;;;;N;;;;;
+BECE;HANGUL SYLLABLE BBYAEP;Lo;0;L;;;;;N;;;;;
+BECF;HANGUL SYLLABLE BBYAEH;Lo;0;L;;;;;N;;;;;
+BED0;HANGUL SYLLABLE BBEO;Lo;0;L;;;;;N;;;;;
+BED1;HANGUL SYLLABLE BBEOG;Lo;0;L;;;;;N;;;;;
+BED2;HANGUL SYLLABLE BBEOGG;Lo;0;L;;;;;N;;;;;
+BED3;HANGUL SYLLABLE BBEOGS;Lo;0;L;;;;;N;;;;;
+BED4;HANGUL SYLLABLE BBEON;Lo;0;L;;;;;N;;;;;
+BED5;HANGUL SYLLABLE BBEONI;Lo;0;L;;;;;N;;;;;
+BED6;HANGUL SYLLABLE BBEONH;Lo;0;L;;;;;N;;;;;
+BED7;HANGUL SYLLABLE BBEOD;Lo;0;L;;;;;N;;;;;
+BED8;HANGUL SYLLABLE BBEOL;Lo;0;L;;;;;N;;;;;
+BED9;HANGUL SYLLABLE BBEOLG;Lo;0;L;;;;;N;;;;;
+BEDA;HANGUL SYLLABLE BBEOLM;Lo;0;L;;;;;N;;;;;
+BEDB;HANGUL SYLLABLE BBEOLB;Lo;0;L;;;;;N;;;;;
+BEDC;HANGUL SYLLABLE BBEOLS;Lo;0;L;;;;;N;;;;;
+BEDD;HANGUL SYLLABLE BBEOLT;Lo;0;L;;;;;N;;;;;
+BEDE;HANGUL SYLLABLE BBEOLP;Lo;0;L;;;;;N;;;;;
+BEDF;HANGUL SYLLABLE BBEOLH;Lo;0;L;;;;;N;;;;;
+BEE0;HANGUL SYLLABLE BBEOM;Lo;0;L;;;;;N;;;;;
+BEE1;HANGUL SYLLABLE BBEOB;Lo;0;L;;;;;N;;;;;
+BEE2;HANGUL SYLLABLE BBEOBS;Lo;0;L;;;;;N;;;;;
+BEE3;HANGUL SYLLABLE BBEOS;Lo;0;L;;;;;N;;;;;
+BEE4;HANGUL SYLLABLE BBEOSS;Lo;0;L;;;;;N;;;;;
+BEE5;HANGUL SYLLABLE BBEONG;Lo;0;L;;;;;N;;;;;
+BEE6;HANGUL SYLLABLE BBEOJ;Lo;0;L;;;;;N;;;;;
+BEE7;HANGUL SYLLABLE BBEOC;Lo;0;L;;;;;N;;;;;
+BEE8;HANGUL SYLLABLE BBEOK;Lo;0;L;;;;;N;;;;;
+BEE9;HANGUL SYLLABLE BBEOT;Lo;0;L;;;;;N;;;;;
+BEEA;HANGUL SYLLABLE BBEOP;Lo;0;L;;;;;N;;;;;
+BEEB;HANGUL SYLLABLE BBEOH;Lo;0;L;;;;;N;;;;;
+BEEC;HANGUL SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+BEED;HANGUL SYLLABLE BBEG;Lo;0;L;;;;;N;;;;;
+BEEE;HANGUL SYLLABLE BBEGG;Lo;0;L;;;;;N;;;;;
+BEEF;HANGUL SYLLABLE BBEGS;Lo;0;L;;;;;N;;;;;
+BEF0;HANGUL SYLLABLE BBEN;Lo;0;L;;;;;N;;;;;
+BEF1;HANGUL SYLLABLE BBENI;Lo;0;L;;;;;N;;;;;
+BEF2;HANGUL SYLLABLE BBENH;Lo;0;L;;;;;N;;;;;
+BEF3;HANGUL SYLLABLE BBED;Lo;0;L;;;;;N;;;;;
+BEF4;HANGUL SYLLABLE BBEL;Lo;0;L;;;;;N;;;;;
+BEF5;HANGUL SYLLABLE BBELG;Lo;0;L;;;;;N;;;;;
+BEF6;HANGUL SYLLABLE BBELM;Lo;0;L;;;;;N;;;;;
+BEF7;HANGUL SYLLABLE BBELB;Lo;0;L;;;;;N;;;;;
+BEF8;HANGUL SYLLABLE BBELS;Lo;0;L;;;;;N;;;;;
+BEF9;HANGUL SYLLABLE BBELT;Lo;0;L;;;;;N;;;;;
+BEFA;HANGUL SYLLABLE BBELP;Lo;0;L;;;;;N;;;;;
+BEFB;HANGUL SYLLABLE BBELH;Lo;0;L;;;;;N;;;;;
+BEFC;HANGUL SYLLABLE BBEM;Lo;0;L;;;;;N;;;;;
+BEFD;HANGUL SYLLABLE BBEB;Lo;0;L;;;;;N;;;;;
+BEFE;HANGUL SYLLABLE BBEBS;Lo;0;L;;;;;N;;;;;
+BEFF;HANGUL SYLLABLE BBES;Lo;0;L;;;;;N;;;;;
+BF00;HANGUL SYLLABLE BBESS;Lo;0;L;;;;;N;;;;;
+BF01;HANGUL SYLLABLE BBENG;Lo;0;L;;;;;N;;;;;
+BF02;HANGUL SYLLABLE BBEJ;Lo;0;L;;;;;N;;;;;
+BF03;HANGUL SYLLABLE BBEC;Lo;0;L;;;;;N;;;;;
+BF04;HANGUL SYLLABLE BBEK;Lo;0;L;;;;;N;;;;;
+BF05;HANGUL SYLLABLE BBET;Lo;0;L;;;;;N;;;;;
+BF06;HANGUL SYLLABLE BBEP;Lo;0;L;;;;;N;;;;;
+BF07;HANGUL SYLLABLE BBEH;Lo;0;L;;;;;N;;;;;
+BF08;HANGUL SYLLABLE BBYEO;Lo;0;L;;;;;N;;;;;
+BF09;HANGUL SYLLABLE BBYEOG;Lo;0;L;;;;;N;;;;;
+BF0A;HANGUL SYLLABLE BBYEOGG;Lo;0;L;;;;;N;;;;;
+BF0B;HANGUL SYLLABLE BBYEOGS;Lo;0;L;;;;;N;;;;;
+BF0C;HANGUL SYLLABLE BBYEON;Lo;0;L;;;;;N;;;;;
+BF0D;HANGUL SYLLABLE BBYEONI;Lo;0;L;;;;;N;;;;;
+BF0E;HANGUL SYLLABLE BBYEONH;Lo;0;L;;;;;N;;;;;
+BF0F;HANGUL SYLLABLE BBYEOD;Lo;0;L;;;;;N;;;;;
+BF10;HANGUL SYLLABLE BBYEOL;Lo;0;L;;;;;N;;;;;
+BF11;HANGUL SYLLABLE BBYEOLG;Lo;0;L;;;;;N;;;;;
+BF12;HANGUL SYLLABLE BBYEOLM;Lo;0;L;;;;;N;;;;;
+BF13;HANGUL SYLLABLE BBYEOLB;Lo;0;L;;;;;N;;;;;
+BF14;HANGUL SYLLABLE BBYEOLS;Lo;0;L;;;;;N;;;;;
+BF15;HANGUL SYLLABLE BBYEOLT;Lo;0;L;;;;;N;;;;;
+BF16;HANGUL SYLLABLE BBYEOLP;Lo;0;L;;;;;N;;;;;
+BF17;HANGUL SYLLABLE BBYEOLH;Lo;0;L;;;;;N;;;;;
+BF18;HANGUL SYLLABLE BBYEOM;Lo;0;L;;;;;N;;;;;
+BF19;HANGUL SYLLABLE BBYEOB;Lo;0;L;;;;;N;;;;;
+BF1A;HANGUL SYLLABLE BBYEOBS;Lo;0;L;;;;;N;;;;;
+BF1B;HANGUL SYLLABLE BBYEOS;Lo;0;L;;;;;N;;;;;
+BF1C;HANGUL SYLLABLE BBYEOSS;Lo;0;L;;;;;N;;;;;
+BF1D;HANGUL SYLLABLE BBYEONG;Lo;0;L;;;;;N;;;;;
+BF1E;HANGUL SYLLABLE BBYEOJ;Lo;0;L;;;;;N;;;;;
+BF1F;HANGUL SYLLABLE BBYEOC;Lo;0;L;;;;;N;;;;;
+BF20;HANGUL SYLLABLE BBYEOK;Lo;0;L;;;;;N;;;;;
+BF21;HANGUL SYLLABLE BBYEOT;Lo;0;L;;;;;N;;;;;
+BF22;HANGUL SYLLABLE BBYEOP;Lo;0;L;;;;;N;;;;;
+BF23;HANGUL SYLLABLE BBYEOH;Lo;0;L;;;;;N;;;;;
+BF24;HANGUL SYLLABLE BBYE;Lo;0;L;;;;;N;;;;;
+BF25;HANGUL SYLLABLE BBYEG;Lo;0;L;;;;;N;;;;;
+BF26;HANGUL SYLLABLE BBYEGG;Lo;0;L;;;;;N;;;;;
+BF27;HANGUL SYLLABLE BBYEGS;Lo;0;L;;;;;N;;;;;
+BF28;HANGUL SYLLABLE BBYEN;Lo;0;L;;;;;N;;;;;
+BF29;HANGUL SYLLABLE BBYENI;Lo;0;L;;;;;N;;;;;
+BF2A;HANGUL SYLLABLE BBYENH;Lo;0;L;;;;;N;;;;;
+BF2B;HANGUL SYLLABLE BBYED;Lo;0;L;;;;;N;;;;;
+BF2C;HANGUL SYLLABLE BBYEL;Lo;0;L;;;;;N;;;;;
+BF2D;HANGUL SYLLABLE BBYELG;Lo;0;L;;;;;N;;;;;
+BF2E;HANGUL SYLLABLE BBYELM;Lo;0;L;;;;;N;;;;;
+BF2F;HANGUL SYLLABLE BBYELB;Lo;0;L;;;;;N;;;;;
+BF30;HANGUL SYLLABLE BBYELS;Lo;0;L;;;;;N;;;;;
+BF31;HANGUL SYLLABLE BBYELT;Lo;0;L;;;;;N;;;;;
+BF32;HANGUL SYLLABLE BBYELP;Lo;0;L;;;;;N;;;;;
+BF33;HANGUL SYLLABLE BBYELH;Lo;0;L;;;;;N;;;;;
+BF34;HANGUL SYLLABLE BBYEM;Lo;0;L;;;;;N;;;;;
+BF35;HANGUL SYLLABLE BBYEB;Lo;0;L;;;;;N;;;;;
+BF36;HANGUL SYLLABLE BBYEBS;Lo;0;L;;;;;N;;;;;
+BF37;HANGUL SYLLABLE BBYES;Lo;0;L;;;;;N;;;;;
+BF38;HANGUL SYLLABLE BBYESS;Lo;0;L;;;;;N;;;;;
+BF39;HANGUL SYLLABLE BBYENG;Lo;0;L;;;;;N;;;;;
+BF3A;HANGUL SYLLABLE BBYEJ;Lo;0;L;;;;;N;;;;;
+BF3B;HANGUL SYLLABLE BBYEC;Lo;0;L;;;;;N;;;;;
+BF3C;HANGUL SYLLABLE BBYEK;Lo;0;L;;;;;N;;;;;
+BF3D;HANGUL SYLLABLE BBYET;Lo;0;L;;;;;N;;;;;
+BF3E;HANGUL SYLLABLE BBYEP;Lo;0;L;;;;;N;;;;;
+BF3F;HANGUL SYLLABLE BBYEH;Lo;0;L;;;;;N;;;;;
+BF40;HANGUL SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+BF41;HANGUL SYLLABLE BBOG;Lo;0;L;;;;;N;;;;;
+BF42;HANGUL SYLLABLE BBOGG;Lo;0;L;;;;;N;;;;;
+BF43;HANGUL SYLLABLE BBOGS;Lo;0;L;;;;;N;;;;;
+BF44;HANGUL SYLLABLE BBON;Lo;0;L;;;;;N;;;;;
+BF45;HANGUL SYLLABLE BBONI;Lo;0;L;;;;;N;;;;;
+BF46;HANGUL SYLLABLE BBONH;Lo;0;L;;;;;N;;;;;
+BF47;HANGUL SYLLABLE BBOD;Lo;0;L;;;;;N;;;;;
+BF48;HANGUL SYLLABLE BBOL;Lo;0;L;;;;;N;;;;;
+BF49;HANGUL SYLLABLE BBOLG;Lo;0;L;;;;;N;;;;;
+BF4A;HANGUL SYLLABLE BBOLM;Lo;0;L;;;;;N;;;;;
+BF4B;HANGUL SYLLABLE BBOLB;Lo;0;L;;;;;N;;;;;
+BF4C;HANGUL SYLLABLE BBOLS;Lo;0;L;;;;;N;;;;;
+BF4D;HANGUL SYLLABLE BBOLT;Lo;0;L;;;;;N;;;;;
+BF4E;HANGUL SYLLABLE BBOLP;Lo;0;L;;;;;N;;;;;
+BF4F;HANGUL SYLLABLE BBOLH;Lo;0;L;;;;;N;;;;;
+BF50;HANGUL SYLLABLE BBOM;Lo;0;L;;;;;N;;;;;
+BF51;HANGUL SYLLABLE BBOB;Lo;0;L;;;;;N;;;;;
+BF52;HANGUL SYLLABLE BBOBS;Lo;0;L;;;;;N;;;;;
+BF53;HANGUL SYLLABLE BBOS;Lo;0;L;;;;;N;;;;;
+BF54;HANGUL SYLLABLE BBOSS;Lo;0;L;;;;;N;;;;;
+BF55;HANGUL SYLLABLE BBONG;Lo;0;L;;;;;N;;;;;
+BF56;HANGUL SYLLABLE BBOJ;Lo;0;L;;;;;N;;;;;
+BF57;HANGUL SYLLABLE BBOC;Lo;0;L;;;;;N;;;;;
+BF58;HANGUL SYLLABLE BBOK;Lo;0;L;;;;;N;;;;;
+BF59;HANGUL SYLLABLE BBOT;Lo;0;L;;;;;N;;;;;
+BF5A;HANGUL SYLLABLE BBOP;Lo;0;L;;;;;N;;;;;
+BF5B;HANGUL SYLLABLE BBOH;Lo;0;L;;;;;N;;;;;
+BF5C;HANGUL SYLLABLE BBWA;Lo;0;L;;;;;N;;;;;
+BF5D;HANGUL SYLLABLE BBWAG;Lo;0;L;;;;;N;;;;;
+BF5E;HANGUL SYLLABLE BBWAGG;Lo;0;L;;;;;N;;;;;
+BF5F;HANGUL SYLLABLE BBWAGS;Lo;0;L;;;;;N;;;;;
+BF60;HANGUL SYLLABLE BBWAN;Lo;0;L;;;;;N;;;;;
+BF61;HANGUL SYLLABLE BBWANI;Lo;0;L;;;;;N;;;;;
+BF62;HANGUL SYLLABLE BBWANH;Lo;0;L;;;;;N;;;;;
+BF63;HANGUL SYLLABLE BBWAD;Lo;0;L;;;;;N;;;;;
+BF64;HANGUL SYLLABLE BBWAL;Lo;0;L;;;;;N;;;;;
+BF65;HANGUL SYLLABLE BBWALG;Lo;0;L;;;;;N;;;;;
+BF66;HANGUL SYLLABLE BBWALM;Lo;0;L;;;;;N;;;;;
+BF67;HANGUL SYLLABLE BBWALB;Lo;0;L;;;;;N;;;;;
+BF68;HANGUL SYLLABLE BBWALS;Lo;0;L;;;;;N;;;;;
+BF69;HANGUL SYLLABLE BBWALT;Lo;0;L;;;;;N;;;;;
+BF6A;HANGUL SYLLABLE BBWALP;Lo;0;L;;;;;N;;;;;
+BF6B;HANGUL SYLLABLE BBWALH;Lo;0;L;;;;;N;;;;;
+BF6C;HANGUL SYLLABLE BBWAM;Lo;0;L;;;;;N;;;;;
+BF6D;HANGUL SYLLABLE BBWAB;Lo;0;L;;;;;N;;;;;
+BF6E;HANGUL SYLLABLE BBWABS;Lo;0;L;;;;;N;;;;;
+BF6F;HANGUL SYLLABLE BBWAS;Lo;0;L;;;;;N;;;;;
+BF70;HANGUL SYLLABLE BBWASS;Lo;0;L;;;;;N;;;;;
+BF71;HANGUL SYLLABLE BBWANG;Lo;0;L;;;;;N;;;;;
+BF72;HANGUL SYLLABLE BBWAJ;Lo;0;L;;;;;N;;;;;
+BF73;HANGUL SYLLABLE BBWAC;Lo;0;L;;;;;N;;;;;
+BF74;HANGUL SYLLABLE BBWAK;Lo;0;L;;;;;N;;;;;
+BF75;HANGUL SYLLABLE BBWAT;Lo;0;L;;;;;N;;;;;
+BF76;HANGUL SYLLABLE BBWAP;Lo;0;L;;;;;N;;;;;
+BF77;HANGUL SYLLABLE BBWAH;Lo;0;L;;;;;N;;;;;
+BF78;HANGUL SYLLABLE BBWAE;Lo;0;L;;;;;N;;;;;
+BF79;HANGUL SYLLABLE BBWAEG;Lo;0;L;;;;;N;;;;;
+BF7A;HANGUL SYLLABLE BBWAEGG;Lo;0;L;;;;;N;;;;;
+BF7B;HANGUL SYLLABLE BBWAEGS;Lo;0;L;;;;;N;;;;;
+BF7C;HANGUL SYLLABLE BBWAEN;Lo;0;L;;;;;N;;;;;
+BF7D;HANGUL SYLLABLE BBWAENI;Lo;0;L;;;;;N;;;;;
+BF7E;HANGUL SYLLABLE BBWAENH;Lo;0;L;;;;;N;;;;;
+BF7F;HANGUL SYLLABLE BBWAED;Lo;0;L;;;;;N;;;;;
+BF80;HANGUL SYLLABLE BBWAEL;Lo;0;L;;;;;N;;;;;
+BF81;HANGUL SYLLABLE BBWAELG;Lo;0;L;;;;;N;;;;;
+BF82;HANGUL SYLLABLE BBWAELM;Lo;0;L;;;;;N;;;;;
+BF83;HANGUL SYLLABLE BBWAELB;Lo;0;L;;;;;N;;;;;
+BF84;HANGUL SYLLABLE BBWAELS;Lo;0;L;;;;;N;;;;;
+BF85;HANGUL SYLLABLE BBWAELT;Lo;0;L;;;;;N;;;;;
+BF86;HANGUL SYLLABLE BBWAELP;Lo;0;L;;;;;N;;;;;
+BF87;HANGUL SYLLABLE BBWAELH;Lo;0;L;;;;;N;;;;;
+BF88;HANGUL SYLLABLE BBWAEM;Lo;0;L;;;;;N;;;;;
+BF89;HANGUL SYLLABLE BBWAEB;Lo;0;L;;;;;N;;;;;
+BF8A;HANGUL SYLLABLE BBWAEBS;Lo;0;L;;;;;N;;;;;
+BF8B;HANGUL SYLLABLE BBWAES;Lo;0;L;;;;;N;;;;;
+BF8C;HANGUL SYLLABLE BBWAESS;Lo;0;L;;;;;N;;;;;
+BF8D;HANGUL SYLLABLE BBWAENG;Lo;0;L;;;;;N;;;;;
+BF8E;HANGUL SYLLABLE BBWAEJ;Lo;0;L;;;;;N;;;;;
+BF8F;HANGUL SYLLABLE BBWAEC;Lo;0;L;;;;;N;;;;;
+BF90;HANGUL SYLLABLE BBWAEK;Lo;0;L;;;;;N;;;;;
+BF91;HANGUL SYLLABLE BBWAET;Lo;0;L;;;;;N;;;;;
+BF92;HANGUL SYLLABLE BBWAEP;Lo;0;L;;;;;N;;;;;
+BF93;HANGUL SYLLABLE BBWAEH;Lo;0;L;;;;;N;;;;;
+BF94;HANGUL SYLLABLE BBOE;Lo;0;L;;;;;N;;;;;
+BF95;HANGUL SYLLABLE BBOEG;Lo;0;L;;;;;N;;;;;
+BF96;HANGUL SYLLABLE BBOEGG;Lo;0;L;;;;;N;;;;;
+BF97;HANGUL SYLLABLE BBOEGS;Lo;0;L;;;;;N;;;;;
+BF98;HANGUL SYLLABLE BBOEN;Lo;0;L;;;;;N;;;;;
+BF99;HANGUL SYLLABLE BBOENI;Lo;0;L;;;;;N;;;;;
+BF9A;HANGUL SYLLABLE BBOENH;Lo;0;L;;;;;N;;;;;
+BF9B;HANGUL SYLLABLE BBOED;Lo;0;L;;;;;N;;;;;
+BF9C;HANGUL SYLLABLE BBOEL;Lo;0;L;;;;;N;;;;;
+BF9D;HANGUL SYLLABLE BBOELG;Lo;0;L;;;;;N;;;;;
+BF9E;HANGUL SYLLABLE BBOELM;Lo;0;L;;;;;N;;;;;
+BF9F;HANGUL SYLLABLE BBOELB;Lo;0;L;;;;;N;;;;;
+BFA0;HANGUL SYLLABLE BBOELS;Lo;0;L;;;;;N;;;;;
+BFA1;HANGUL SYLLABLE BBOELT;Lo;0;L;;;;;N;;;;;
+BFA2;HANGUL SYLLABLE BBOELP;Lo;0;L;;;;;N;;;;;
+BFA3;HANGUL SYLLABLE BBOELH;Lo;0;L;;;;;N;;;;;
+BFA4;HANGUL SYLLABLE BBOEM;Lo;0;L;;;;;N;;;;;
+BFA5;HANGUL SYLLABLE BBOEB;Lo;0;L;;;;;N;;;;;
+BFA6;HANGUL SYLLABLE BBOEBS;Lo;0;L;;;;;N;;;;;
+BFA7;HANGUL SYLLABLE BBOES;Lo;0;L;;;;;N;;;;;
+BFA8;HANGUL SYLLABLE BBOESS;Lo;0;L;;;;;N;;;;;
+BFA9;HANGUL SYLLABLE BBOENG;Lo;0;L;;;;;N;;;;;
+BFAA;HANGUL SYLLABLE BBOEJ;Lo;0;L;;;;;N;;;;;
+BFAB;HANGUL SYLLABLE BBOEC;Lo;0;L;;;;;N;;;;;
+BFAC;HANGUL SYLLABLE BBOEK;Lo;0;L;;;;;N;;;;;
+BFAD;HANGUL SYLLABLE BBOET;Lo;0;L;;;;;N;;;;;
+BFAE;HANGUL SYLLABLE BBOEP;Lo;0;L;;;;;N;;;;;
+BFAF;HANGUL SYLLABLE BBOEH;Lo;0;L;;;;;N;;;;;
+BFB0;HANGUL SYLLABLE BBYO;Lo;0;L;;;;;N;;;;;
+BFB1;HANGUL SYLLABLE BBYOG;Lo;0;L;;;;;N;;;;;
+BFB2;HANGUL SYLLABLE BBYOGG;Lo;0;L;;;;;N;;;;;
+BFB3;HANGUL SYLLABLE BBYOGS;Lo;0;L;;;;;N;;;;;
+BFB4;HANGUL SYLLABLE BBYON;Lo;0;L;;;;;N;;;;;
+BFB5;HANGUL SYLLABLE BBYONI;Lo;0;L;;;;;N;;;;;
+BFB6;HANGUL SYLLABLE BBYONH;Lo;0;L;;;;;N;;;;;
+BFB7;HANGUL SYLLABLE BBYOD;Lo;0;L;;;;;N;;;;;
+BFB8;HANGUL SYLLABLE BBYOL;Lo;0;L;;;;;N;;;;;
+BFB9;HANGUL SYLLABLE BBYOLG;Lo;0;L;;;;;N;;;;;
+BFBA;HANGUL SYLLABLE BBYOLM;Lo;0;L;;;;;N;;;;;
+BFBB;HANGUL SYLLABLE BBYOLB;Lo;0;L;;;;;N;;;;;
+BFBC;HANGUL SYLLABLE BBYOLS;Lo;0;L;;;;;N;;;;;
+BFBD;HANGUL SYLLABLE BBYOLT;Lo;0;L;;;;;N;;;;;
+BFBE;HANGUL SYLLABLE BBYOLP;Lo;0;L;;;;;N;;;;;
+BFBF;HANGUL SYLLABLE BBYOLH;Lo;0;L;;;;;N;;;;;
+BFC0;HANGUL SYLLABLE BBYOM;Lo;0;L;;;;;N;;;;;
+BFC1;HANGUL SYLLABLE BBYOB;Lo;0;L;;;;;N;;;;;
+BFC2;HANGUL SYLLABLE BBYOBS;Lo;0;L;;;;;N;;;;;
+BFC3;HANGUL SYLLABLE BBYOS;Lo;0;L;;;;;N;;;;;
+BFC4;HANGUL SYLLABLE BBYOSS;Lo;0;L;;;;;N;;;;;
+BFC5;HANGUL SYLLABLE BBYONG;Lo;0;L;;;;;N;;;;;
+BFC6;HANGUL SYLLABLE BBYOJ;Lo;0;L;;;;;N;;;;;
+BFC7;HANGUL SYLLABLE BBYOC;Lo;0;L;;;;;N;;;;;
+BFC8;HANGUL SYLLABLE BBYOK;Lo;0;L;;;;;N;;;;;
+BFC9;HANGUL SYLLABLE BBYOT;Lo;0;L;;;;;N;;;;;
+BFCA;HANGUL SYLLABLE BBYOP;Lo;0;L;;;;;N;;;;;
+BFCB;HANGUL SYLLABLE BBYOH;Lo;0;L;;;;;N;;;;;
+BFCC;HANGUL SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+BFCD;HANGUL SYLLABLE BBUG;Lo;0;L;;;;;N;;;;;
+BFCE;HANGUL SYLLABLE BBUGG;Lo;0;L;;;;;N;;;;;
+BFCF;HANGUL SYLLABLE BBUGS;Lo;0;L;;;;;N;;;;;
+BFD0;HANGUL SYLLABLE BBUN;Lo;0;L;;;;;N;;;;;
+BFD1;HANGUL SYLLABLE BBUNI;Lo;0;L;;;;;N;;;;;
+BFD2;HANGUL SYLLABLE BBUNH;Lo;0;L;;;;;N;;;;;
+BFD3;HANGUL SYLLABLE BBUD;Lo;0;L;;;;;N;;;;;
+BFD4;HANGUL SYLLABLE BBUL;Lo;0;L;;;;;N;;;;;
+BFD5;HANGUL SYLLABLE BBULG;Lo;0;L;;;;;N;;;;;
+BFD6;HANGUL SYLLABLE BBULM;Lo;0;L;;;;;N;;;;;
+BFD7;HANGUL SYLLABLE BBULB;Lo;0;L;;;;;N;;;;;
+BFD8;HANGUL SYLLABLE BBULS;Lo;0;L;;;;;N;;;;;
+BFD9;HANGUL SYLLABLE BBULT;Lo;0;L;;;;;N;;;;;
+BFDA;HANGUL SYLLABLE BBULP;Lo;0;L;;;;;N;;;;;
+BFDB;HANGUL SYLLABLE BBULH;Lo;0;L;;;;;N;;;;;
+BFDC;HANGUL SYLLABLE BBUM;Lo;0;L;;;;;N;;;;;
+BFDD;HANGUL SYLLABLE BBUB;Lo;0;L;;;;;N;;;;;
+BFDE;HANGUL SYLLABLE BBUBS;Lo;0;L;;;;;N;;;;;
+BFDF;HANGUL SYLLABLE BBUS;Lo;0;L;;;;;N;;;;;
+BFE0;HANGUL SYLLABLE BBUSS;Lo;0;L;;;;;N;;;;;
+BFE1;HANGUL SYLLABLE BBUNG;Lo;0;L;;;;;N;;;;;
+BFE2;HANGUL SYLLABLE BBUJ;Lo;0;L;;;;;N;;;;;
+BFE3;HANGUL SYLLABLE BBUC;Lo;0;L;;;;;N;;;;;
+BFE4;HANGUL SYLLABLE BBUK;Lo;0;L;;;;;N;;;;;
+BFE5;HANGUL SYLLABLE BBUT;Lo;0;L;;;;;N;;;;;
+BFE6;HANGUL SYLLABLE BBUP;Lo;0;L;;;;;N;;;;;
+BFE7;HANGUL SYLLABLE BBUH;Lo;0;L;;;;;N;;;;;
+BFE8;HANGUL SYLLABLE BBWEO;Lo;0;L;;;;;N;;;;;
+BFE9;HANGUL SYLLABLE BBWEOG;Lo;0;L;;;;;N;;;;;
+BFEA;HANGUL SYLLABLE BBWEOGG;Lo;0;L;;;;;N;;;;;
+BFEB;HANGUL SYLLABLE BBWEOGS;Lo;0;L;;;;;N;;;;;
+BFEC;HANGUL SYLLABLE BBWEON;Lo;0;L;;;;;N;;;;;
+BFED;HANGUL SYLLABLE BBWEONI;Lo;0;L;;;;;N;;;;;
+BFEE;HANGUL SYLLABLE BBWEONH;Lo;0;L;;;;;N;;;;;
+BFEF;HANGUL SYLLABLE BBWEOD;Lo;0;L;;;;;N;;;;;
+BFF0;HANGUL SYLLABLE BBWEOL;Lo;0;L;;;;;N;;;;;
+BFF1;HANGUL SYLLABLE BBWEOLG;Lo;0;L;;;;;N;;;;;
+BFF2;HANGUL SYLLABLE BBWEOLM;Lo;0;L;;;;;N;;;;;
+BFF3;HANGUL SYLLABLE BBWEOLB;Lo;0;L;;;;;N;;;;;
+BFF4;HANGUL SYLLABLE BBWEOLS;Lo;0;L;;;;;N;;;;;
+BFF5;HANGUL SYLLABLE BBWEOLT;Lo;0;L;;;;;N;;;;;
+BFF6;HANGUL SYLLABLE BBWEOLP;Lo;0;L;;;;;N;;;;;
+BFF7;HANGUL SYLLABLE BBWEOLH;Lo;0;L;;;;;N;;;;;
+BFF8;HANGUL SYLLABLE BBWEOM;Lo;0;L;;;;;N;;;;;
+BFF9;HANGUL SYLLABLE BBWEOB;Lo;0;L;;;;;N;;;;;
+BFFA;HANGUL SYLLABLE BBWEOBS;Lo;0;L;;;;;N;;;;;
+BFFB;HANGUL SYLLABLE BBWEOS;Lo;0;L;;;;;N;;;;;
+BFFC;HANGUL SYLLABLE BBWEOSS;Lo;0;L;;;;;N;;;;;
+BFFD;HANGUL SYLLABLE BBWEONG;Lo;0;L;;;;;N;;;;;
+BFFE;HANGUL SYLLABLE BBWEOJ;Lo;0;L;;;;;N;;;;;
+BFFF;HANGUL SYLLABLE BBWEOC;Lo;0;L;;;;;N;;;;;
+C000;HANGUL SYLLABLE BBWEOK;Lo;0;L;;;;;N;;;;;
+C001;HANGUL SYLLABLE BBWEOT;Lo;0;L;;;;;N;;;;;
+C002;HANGUL SYLLABLE BBWEOP;Lo;0;L;;;;;N;;;;;
+C003;HANGUL SYLLABLE BBWEOH;Lo;0;L;;;;;N;;;;;
+C004;HANGUL SYLLABLE BBWE;Lo;0;L;;;;;N;;;;;
+C005;HANGUL SYLLABLE BBWEG;Lo;0;L;;;;;N;;;;;
+C006;HANGUL SYLLABLE BBWEGG;Lo;0;L;;;;;N;;;;;
+C007;HANGUL SYLLABLE BBWEGS;Lo;0;L;;;;;N;;;;;
+C008;HANGUL SYLLABLE BBWEN;Lo;0;L;;;;;N;;;;;
+C009;HANGUL SYLLABLE BBWENI;Lo;0;L;;;;;N;;;;;
+C00A;HANGUL SYLLABLE BBWENH;Lo;0;L;;;;;N;;;;;
+C00B;HANGUL SYLLABLE BBWED;Lo;0;L;;;;;N;;;;;
+C00C;HANGUL SYLLABLE BBWEL;Lo;0;L;;;;;N;;;;;
+C00D;HANGUL SYLLABLE BBWELG;Lo;0;L;;;;;N;;;;;
+C00E;HANGUL SYLLABLE BBWELM;Lo;0;L;;;;;N;;;;;
+C00F;HANGUL SYLLABLE BBWELB;Lo;0;L;;;;;N;;;;;
+C010;HANGUL SYLLABLE BBWELS;Lo;0;L;;;;;N;;;;;
+C011;HANGUL SYLLABLE BBWELT;Lo;0;L;;;;;N;;;;;
+C012;HANGUL SYLLABLE BBWELP;Lo;0;L;;;;;N;;;;;
+C013;HANGUL SYLLABLE BBWELH;Lo;0;L;;;;;N;;;;;
+C014;HANGUL SYLLABLE BBWEM;Lo;0;L;;;;;N;;;;;
+C015;HANGUL SYLLABLE BBWEB;Lo;0;L;;;;;N;;;;;
+C016;HANGUL SYLLABLE BBWEBS;Lo;0;L;;;;;N;;;;;
+C017;HANGUL SYLLABLE BBWES;Lo;0;L;;;;;N;;;;;
+C018;HANGUL SYLLABLE BBWESS;Lo;0;L;;;;;N;;;;;
+C019;HANGUL SYLLABLE BBWENG;Lo;0;L;;;;;N;;;;;
+C01A;HANGUL SYLLABLE BBWEJ;Lo;0;L;;;;;N;;;;;
+C01B;HANGUL SYLLABLE BBWEC;Lo;0;L;;;;;N;;;;;
+C01C;HANGUL SYLLABLE BBWEK;Lo;0;L;;;;;N;;;;;
+C01D;HANGUL SYLLABLE BBWET;Lo;0;L;;;;;N;;;;;
+C01E;HANGUL SYLLABLE BBWEP;Lo;0;L;;;;;N;;;;;
+C01F;HANGUL SYLLABLE BBWEH;Lo;0;L;;;;;N;;;;;
+C020;HANGUL SYLLABLE BBWI;Lo;0;L;;;;;N;;;;;
+C021;HANGUL SYLLABLE BBWIG;Lo;0;L;;;;;N;;;;;
+C022;HANGUL SYLLABLE BBWIGG;Lo;0;L;;;;;N;;;;;
+C023;HANGUL SYLLABLE BBWIGS;Lo;0;L;;;;;N;;;;;
+C024;HANGUL SYLLABLE BBWIN;Lo;0;L;;;;;N;;;;;
+C025;HANGUL SYLLABLE BBWINI;Lo;0;L;;;;;N;;;;;
+C026;HANGUL SYLLABLE BBWINH;Lo;0;L;;;;;N;;;;;
+C027;HANGUL SYLLABLE BBWID;Lo;0;L;;;;;N;;;;;
+C028;HANGUL SYLLABLE BBWIL;Lo;0;L;;;;;N;;;;;
+C029;HANGUL SYLLABLE BBWILG;Lo;0;L;;;;;N;;;;;
+C02A;HANGUL SYLLABLE BBWILM;Lo;0;L;;;;;N;;;;;
+C02B;HANGUL SYLLABLE BBWILB;Lo;0;L;;;;;N;;;;;
+C02C;HANGUL SYLLABLE BBWILS;Lo;0;L;;;;;N;;;;;
+C02D;HANGUL SYLLABLE BBWILT;Lo;0;L;;;;;N;;;;;
+C02E;HANGUL SYLLABLE BBWILP;Lo;0;L;;;;;N;;;;;
+C02F;HANGUL SYLLABLE BBWILH;Lo;0;L;;;;;N;;;;;
+C030;HANGUL SYLLABLE BBWIM;Lo;0;L;;;;;N;;;;;
+C031;HANGUL SYLLABLE BBWIB;Lo;0;L;;;;;N;;;;;
+C032;HANGUL SYLLABLE BBWIBS;Lo;0;L;;;;;N;;;;;
+C033;HANGUL SYLLABLE BBWIS;Lo;0;L;;;;;N;;;;;
+C034;HANGUL SYLLABLE BBWISS;Lo;0;L;;;;;N;;;;;
+C035;HANGUL SYLLABLE BBWING;Lo;0;L;;;;;N;;;;;
+C036;HANGUL SYLLABLE BBWIJ;Lo;0;L;;;;;N;;;;;
+C037;HANGUL SYLLABLE BBWIC;Lo;0;L;;;;;N;;;;;
+C038;HANGUL SYLLABLE BBWIK;Lo;0;L;;;;;N;;;;;
+C039;HANGUL SYLLABLE BBWIT;Lo;0;L;;;;;N;;;;;
+C03A;HANGUL SYLLABLE BBWIP;Lo;0;L;;;;;N;;;;;
+C03B;HANGUL SYLLABLE BBWIH;Lo;0;L;;;;;N;;;;;
+C03C;HANGUL SYLLABLE BBYU;Lo;0;L;;;;;N;;;;;
+C03D;HANGUL SYLLABLE BBYUG;Lo;0;L;;;;;N;;;;;
+C03E;HANGUL SYLLABLE BBYUGG;Lo;0;L;;;;;N;;;;;
+C03F;HANGUL SYLLABLE BBYUGS;Lo;0;L;;;;;N;;;;;
+C040;HANGUL SYLLABLE BBYUN;Lo;0;L;;;;;N;;;;;
+C041;HANGUL SYLLABLE BBYUNI;Lo;0;L;;;;;N;;;;;
+C042;HANGUL SYLLABLE BBYUNH;Lo;0;L;;;;;N;;;;;
+C043;HANGUL SYLLABLE BBYUD;Lo;0;L;;;;;N;;;;;
+C044;HANGUL SYLLABLE BBYUL;Lo;0;L;;;;;N;;;;;
+C045;HANGUL SYLLABLE BBYULG;Lo;0;L;;;;;N;;;;;
+C046;HANGUL SYLLABLE BBYULM;Lo;0;L;;;;;N;;;;;
+C047;HANGUL SYLLABLE BBYULB;Lo;0;L;;;;;N;;;;;
+C048;HANGUL SYLLABLE BBYULS;Lo;0;L;;;;;N;;;;;
+C049;HANGUL SYLLABLE BBYULT;Lo;0;L;;;;;N;;;;;
+C04A;HANGUL SYLLABLE BBYULP;Lo;0;L;;;;;N;;;;;
+C04B;HANGUL SYLLABLE BBYULH;Lo;0;L;;;;;N;;;;;
+C04C;HANGUL SYLLABLE BBYUM;Lo;0;L;;;;;N;;;;;
+C04D;HANGUL SYLLABLE BBYUB;Lo;0;L;;;;;N;;;;;
+C04E;HANGUL SYLLABLE BBYUBS;Lo;0;L;;;;;N;;;;;
+C04F;HANGUL SYLLABLE BBYUS;Lo;0;L;;;;;N;;;;;
+C050;HANGUL SYLLABLE BBYUSS;Lo;0;L;;;;;N;;;;;
+C051;HANGUL SYLLABLE BBYUNG;Lo;0;L;;;;;N;;;;;
+C052;HANGUL SYLLABLE BBYUJ;Lo;0;L;;;;;N;;;;;
+C053;HANGUL SYLLABLE BBYUC;Lo;0;L;;;;;N;;;;;
+C054;HANGUL SYLLABLE BBYUK;Lo;0;L;;;;;N;;;;;
+C055;HANGUL SYLLABLE BBYUT;Lo;0;L;;;;;N;;;;;
+C056;HANGUL SYLLABLE BBYUP;Lo;0;L;;;;;N;;;;;
+C057;HANGUL SYLLABLE BBYUH;Lo;0;L;;;;;N;;;;;
+C058;HANGUL SYLLABLE BBEU;Lo;0;L;;;;;N;;;;;
+C059;HANGUL SYLLABLE BBEUG;Lo;0;L;;;;;N;;;;;
+C05A;HANGUL SYLLABLE BBEUGG;Lo;0;L;;;;;N;;;;;
+C05B;HANGUL SYLLABLE BBEUGS;Lo;0;L;;;;;N;;;;;
+C05C;HANGUL SYLLABLE BBEUN;Lo;0;L;;;;;N;;;;;
+C05D;HANGUL SYLLABLE BBEUNI;Lo;0;L;;;;;N;;;;;
+C05E;HANGUL SYLLABLE BBEUNH;Lo;0;L;;;;;N;;;;;
+C05F;HANGUL SYLLABLE BBEUD;Lo;0;L;;;;;N;;;;;
+C060;HANGUL SYLLABLE BBEUL;Lo;0;L;;;;;N;;;;;
+C061;HANGUL SYLLABLE BBEULG;Lo;0;L;;;;;N;;;;;
+C062;HANGUL SYLLABLE BBEULM;Lo;0;L;;;;;N;;;;;
+C063;HANGUL SYLLABLE BBEULB;Lo;0;L;;;;;N;;;;;
+C064;HANGUL SYLLABLE BBEULS;Lo;0;L;;;;;N;;;;;
+C065;HANGUL SYLLABLE BBEULT;Lo;0;L;;;;;N;;;;;
+C066;HANGUL SYLLABLE BBEULP;Lo;0;L;;;;;N;;;;;
+C067;HANGUL SYLLABLE BBEULH;Lo;0;L;;;;;N;;;;;
+C068;HANGUL SYLLABLE BBEUM;Lo;0;L;;;;;N;;;;;
+C069;HANGUL SYLLABLE BBEUB;Lo;0;L;;;;;N;;;;;
+C06A;HANGUL SYLLABLE BBEUBS;Lo;0;L;;;;;N;;;;;
+C06B;HANGUL SYLLABLE BBEUS;Lo;0;L;;;;;N;;;;;
+C06C;HANGUL SYLLABLE BBEUSS;Lo;0;L;;;;;N;;;;;
+C06D;HANGUL SYLLABLE BBEUNG;Lo;0;L;;;;;N;;;;;
+C06E;HANGUL SYLLABLE BBEUJ;Lo;0;L;;;;;N;;;;;
+C06F;HANGUL SYLLABLE BBEUC;Lo;0;L;;;;;N;;;;;
+C070;HANGUL SYLLABLE BBEUK;Lo;0;L;;;;;N;;;;;
+C071;HANGUL SYLLABLE BBEUT;Lo;0;L;;;;;N;;;;;
+C072;HANGUL SYLLABLE BBEUP;Lo;0;L;;;;;N;;;;;
+C073;HANGUL SYLLABLE BBEUH;Lo;0;L;;;;;N;;;;;
+C074;HANGUL SYLLABLE BBYI;Lo;0;L;;;;;N;;;;;
+C075;HANGUL SYLLABLE BBYIG;Lo;0;L;;;;;N;;;;;
+C076;HANGUL SYLLABLE BBYIGG;Lo;0;L;;;;;N;;;;;
+C077;HANGUL SYLLABLE BBYIGS;Lo;0;L;;;;;N;;;;;
+C078;HANGUL SYLLABLE BBYIN;Lo;0;L;;;;;N;;;;;
+C079;HANGUL SYLLABLE BBYINI;Lo;0;L;;;;;N;;;;;
+C07A;HANGUL SYLLABLE BBYINH;Lo;0;L;;;;;N;;;;;
+C07B;HANGUL SYLLABLE BBYID;Lo;0;L;;;;;N;;;;;
+C07C;HANGUL SYLLABLE BBYIL;Lo;0;L;;;;;N;;;;;
+C07D;HANGUL SYLLABLE BBYILG;Lo;0;L;;;;;N;;;;;
+C07E;HANGUL SYLLABLE BBYILM;Lo;0;L;;;;;N;;;;;
+C07F;HANGUL SYLLABLE BBYILB;Lo;0;L;;;;;N;;;;;
+C080;HANGUL SYLLABLE BBYILS;Lo;0;L;;;;;N;;;;;
+C081;HANGUL SYLLABLE BBYILT;Lo;0;L;;;;;N;;;;;
+C082;HANGUL SYLLABLE BBYILP;Lo;0;L;;;;;N;;;;;
+C083;HANGUL SYLLABLE BBYILH;Lo;0;L;;;;;N;;;;;
+C084;HANGUL SYLLABLE BBYIM;Lo;0;L;;;;;N;;;;;
+C085;HANGUL SYLLABLE BBYIB;Lo;0;L;;;;;N;;;;;
+C086;HANGUL SYLLABLE BBYIBS;Lo;0;L;;;;;N;;;;;
+C087;HANGUL SYLLABLE BBYIS;Lo;0;L;;;;;N;;;;;
+C088;HANGUL SYLLABLE BBYISS;Lo;0;L;;;;;N;;;;;
+C089;HANGUL SYLLABLE BBYING;Lo;0;L;;;;;N;;;;;
+C08A;HANGUL SYLLABLE BBYIJ;Lo;0;L;;;;;N;;;;;
+C08B;HANGUL SYLLABLE BBYIC;Lo;0;L;;;;;N;;;;;
+C08C;HANGUL SYLLABLE BBYIK;Lo;0;L;;;;;N;;;;;
+C08D;HANGUL SYLLABLE BBYIT;Lo;0;L;;;;;N;;;;;
+C08E;HANGUL SYLLABLE BBYIP;Lo;0;L;;;;;N;;;;;
+C08F;HANGUL SYLLABLE BBYIH;Lo;0;L;;;;;N;;;;;
+C090;HANGUL SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+C091;HANGUL SYLLABLE BBIG;Lo;0;L;;;;;N;;;;;
+C092;HANGUL SYLLABLE BBIGG;Lo;0;L;;;;;N;;;;;
+C093;HANGUL SYLLABLE BBIGS;Lo;0;L;;;;;N;;;;;
+C094;HANGUL SYLLABLE BBIN;Lo;0;L;;;;;N;;;;;
+C095;HANGUL SYLLABLE BBINI;Lo;0;L;;;;;N;;;;;
+C096;HANGUL SYLLABLE BBINH;Lo;0;L;;;;;N;;;;;
+C097;HANGUL SYLLABLE BBID;Lo;0;L;;;;;N;;;;;
+C098;HANGUL SYLLABLE BBIL;Lo;0;L;;;;;N;;;;;
+C099;HANGUL SYLLABLE BBILG;Lo;0;L;;;;;N;;;;;
+C09A;HANGUL SYLLABLE BBILM;Lo;0;L;;;;;N;;;;;
+C09B;HANGUL SYLLABLE BBILB;Lo;0;L;;;;;N;;;;;
+C09C;HANGUL SYLLABLE BBILS;Lo;0;L;;;;;N;;;;;
+C09D;HANGUL SYLLABLE BBILT;Lo;0;L;;;;;N;;;;;
+C09E;HANGUL SYLLABLE BBILP;Lo;0;L;;;;;N;;;;;
+C09F;HANGUL SYLLABLE BBILH;Lo;0;L;;;;;N;;;;;
+C0A0;HANGUL SYLLABLE BBIM;Lo;0;L;;;;;N;;;;;
+C0A1;HANGUL SYLLABLE BBIB;Lo;0;L;;;;;N;;;;;
+C0A2;HANGUL SYLLABLE BBIBS;Lo;0;L;;;;;N;;;;;
+C0A3;HANGUL SYLLABLE BBIS;Lo;0;L;;;;;N;;;;;
+C0A4;HANGUL SYLLABLE BBISS;Lo;0;L;;;;;N;;;;;
+C0A5;HANGUL SYLLABLE BBING;Lo;0;L;;;;;N;;;;;
+C0A6;HANGUL SYLLABLE BBIJ;Lo;0;L;;;;;N;;;;;
+C0A7;HANGUL SYLLABLE BBIC;Lo;0;L;;;;;N;;;;;
+C0A8;HANGUL SYLLABLE BBIK;Lo;0;L;;;;;N;;;;;
+C0A9;HANGUL SYLLABLE BBIT;Lo;0;L;;;;;N;;;;;
+C0AA;HANGUL SYLLABLE BBIP;Lo;0;L;;;;;N;;;;;
+C0AB;HANGUL SYLLABLE BBIH;Lo;0;L;;;;;N;;;;;
+C0AC;HANGUL SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+C0AD;HANGUL SYLLABLE SAG;Lo;0;L;;;;;N;;;;;
+C0AE;HANGUL SYLLABLE SAGG;Lo;0;L;;;;;N;;;;;
+C0AF;HANGUL SYLLABLE SAGS;Lo;0;L;;;;;N;;;;;
+C0B0;HANGUL SYLLABLE SAN;Lo;0;L;;;;;N;;;;;
+C0B1;HANGUL SYLLABLE SANI;Lo;0;L;;;;;N;;;;;
+C0B2;HANGUL SYLLABLE SANH;Lo;0;L;;;;;N;;;;;
+C0B3;HANGUL SYLLABLE SAD;Lo;0;L;;;;;N;;;;;
+C0B4;HANGUL SYLLABLE SAL;Lo;0;L;;;;;N;;;;;
+C0B5;HANGUL SYLLABLE SALG;Lo;0;L;;;;;N;;;;;
+C0B6;HANGUL SYLLABLE SALM;Lo;0;L;;;;;N;;;;;
+C0B7;HANGUL SYLLABLE SALB;Lo;0;L;;;;;N;;;;;
+C0B8;HANGUL SYLLABLE SALS;Lo;0;L;;;;;N;;;;;
+C0B9;HANGUL SYLLABLE SALT;Lo;0;L;;;;;N;;;;;
+C0BA;HANGUL SYLLABLE SALP;Lo;0;L;;;;;N;;;;;
+C0BB;HANGUL SYLLABLE SALH;Lo;0;L;;;;;N;;;;;
+C0BC;HANGUL SYLLABLE SAM;Lo;0;L;;;;;N;;;;;
+C0BD;HANGUL SYLLABLE SAB;Lo;0;L;;;;;N;;;;;
+C0BE;HANGUL SYLLABLE SABS;Lo;0;L;;;;;N;;;;;
+C0BF;HANGUL SYLLABLE SAS;Lo;0;L;;;;;N;;;;;
+C0C0;HANGUL SYLLABLE SASS;Lo;0;L;;;;;N;;;;;
+C0C1;HANGUL SYLLABLE SANG;Lo;0;L;;;;;N;;;;;
+C0C2;HANGUL SYLLABLE SAJ;Lo;0;L;;;;;N;;;;;
+C0C3;HANGUL SYLLABLE SAC;Lo;0;L;;;;;N;;;;;
+C0C4;HANGUL SYLLABLE SAK;Lo;0;L;;;;;N;;;;;
+C0C5;HANGUL SYLLABLE SAT;Lo;0;L;;;;;N;;;;;
+C0C6;HANGUL SYLLABLE SAP;Lo;0;L;;;;;N;;;;;
+C0C7;HANGUL SYLLABLE SAH;Lo;0;L;;;;;N;;;;;
+C0C8;HANGUL SYLLABLE SAE;Lo;0;L;;;;;N;;;;;
+C0C9;HANGUL SYLLABLE SAEG;Lo;0;L;;;;;N;;;;;
+C0CA;HANGUL SYLLABLE SAEGG;Lo;0;L;;;;;N;;;;;
+C0CB;HANGUL SYLLABLE SAEGS;Lo;0;L;;;;;N;;;;;
+C0CC;HANGUL SYLLABLE SAEN;Lo;0;L;;;;;N;;;;;
+C0CD;HANGUL SYLLABLE SAENI;Lo;0;L;;;;;N;;;;;
+C0CE;HANGUL SYLLABLE SAENH;Lo;0;L;;;;;N;;;;;
+C0CF;HANGUL SYLLABLE SAED;Lo;0;L;;;;;N;;;;;
+C0D0;HANGUL SYLLABLE SAEL;Lo;0;L;;;;;N;;;;;
+C0D1;HANGUL SYLLABLE SAELG;Lo;0;L;;;;;N;;;;;
+C0D2;HANGUL SYLLABLE SAELM;Lo;0;L;;;;;N;;;;;
+C0D3;HANGUL SYLLABLE SAELB;Lo;0;L;;;;;N;;;;;
+C0D4;HANGUL SYLLABLE SAELS;Lo;0;L;;;;;N;;;;;
+C0D5;HANGUL SYLLABLE SAELT;Lo;0;L;;;;;N;;;;;
+C0D6;HANGUL SYLLABLE SAELP;Lo;0;L;;;;;N;;;;;
+C0D7;HANGUL SYLLABLE SAELH;Lo;0;L;;;;;N;;;;;
+C0D8;HANGUL SYLLABLE SAEM;Lo;0;L;;;;;N;;;;;
+C0D9;HANGUL SYLLABLE SAEB;Lo;0;L;;;;;N;;;;;
+C0DA;HANGUL SYLLABLE SAEBS;Lo;0;L;;;;;N;;;;;
+C0DB;HANGUL SYLLABLE SAES;Lo;0;L;;;;;N;;;;;
+C0DC;HANGUL SYLLABLE SAESS;Lo;0;L;;;;;N;;;;;
+C0DD;HANGUL SYLLABLE SAENG;Lo;0;L;;;;;N;;;;;
+C0DE;HANGUL SYLLABLE SAEJ;Lo;0;L;;;;;N;;;;;
+C0DF;HANGUL SYLLABLE SAEC;Lo;0;L;;;;;N;;;;;
+C0E0;HANGUL SYLLABLE SAEK;Lo;0;L;;;;;N;;;;;
+C0E1;HANGUL SYLLABLE SAET;Lo;0;L;;;;;N;;;;;
+C0E2;HANGUL SYLLABLE SAEP;Lo;0;L;;;;;N;;;;;
+C0E3;HANGUL SYLLABLE SAEH;Lo;0;L;;;;;N;;;;;
+C0E4;HANGUL SYLLABLE SYA;Lo;0;L;;;;;N;;;;;
+C0E5;HANGUL SYLLABLE SYAG;Lo;0;L;;;;;N;;;;;
+C0E6;HANGUL SYLLABLE SYAGG;Lo;0;L;;;;;N;;;;;
+C0E7;HANGUL SYLLABLE SYAGS;Lo;0;L;;;;;N;;;;;
+C0E8;HANGUL SYLLABLE SYAN;Lo;0;L;;;;;N;;;;;
+C0E9;HANGUL SYLLABLE SYANI;Lo;0;L;;;;;N;;;;;
+C0EA;HANGUL SYLLABLE SYANH;Lo;0;L;;;;;N;;;;;
+C0EB;HANGUL SYLLABLE SYAD;Lo;0;L;;;;;N;;;;;
+C0EC;HANGUL SYLLABLE SYAL;Lo;0;L;;;;;N;;;;;
+C0ED;HANGUL SYLLABLE SYALG;Lo;0;L;;;;;N;;;;;
+C0EE;HANGUL SYLLABLE SYALM;Lo;0;L;;;;;N;;;;;
+C0EF;HANGUL SYLLABLE SYALB;Lo;0;L;;;;;N;;;;;
+C0F0;HANGUL SYLLABLE SYALS;Lo;0;L;;;;;N;;;;;
+C0F1;HANGUL SYLLABLE SYALT;Lo;0;L;;;;;N;;;;;
+C0F2;HANGUL SYLLABLE SYALP;Lo;0;L;;;;;N;;;;;
+C0F3;HANGUL SYLLABLE SYALH;Lo;0;L;;;;;N;;;;;
+C0F4;HANGUL SYLLABLE SYAM;Lo;0;L;;;;;N;;;;;
+C0F5;HANGUL SYLLABLE SYAB;Lo;0;L;;;;;N;;;;;
+C0F6;HANGUL SYLLABLE SYABS;Lo;0;L;;;;;N;;;;;
+C0F7;HANGUL SYLLABLE SYAS;Lo;0;L;;;;;N;;;;;
+C0F8;HANGUL SYLLABLE SYASS;Lo;0;L;;;;;N;;;;;
+C0F9;HANGUL SYLLABLE SYANG;Lo;0;L;;;;;N;;;;;
+C0FA;HANGUL SYLLABLE SYAJ;Lo;0;L;;;;;N;;;;;
+C0FB;HANGUL SYLLABLE SYAC;Lo;0;L;;;;;N;;;;;
+C0FC;HANGUL SYLLABLE SYAK;Lo;0;L;;;;;N;;;;;
+C0FD;HANGUL SYLLABLE SYAT;Lo;0;L;;;;;N;;;;;
+C0FE;HANGUL SYLLABLE SYAP;Lo;0;L;;;;;N;;;;;
+C0FF;HANGUL SYLLABLE SYAH;Lo;0;L;;;;;N;;;;;
+C100;HANGUL SYLLABLE SYAE;Lo;0;L;;;;;N;;;;;
+C101;HANGUL SYLLABLE SYAEG;Lo;0;L;;;;;N;;;;;
+C102;HANGUL SYLLABLE SYAEGG;Lo;0;L;;;;;N;;;;;
+C103;HANGUL SYLLABLE SYAEGS;Lo;0;L;;;;;N;;;;;
+C104;HANGUL SYLLABLE SYAEN;Lo;0;L;;;;;N;;;;;
+C105;HANGUL SYLLABLE SYAENI;Lo;0;L;;;;;N;;;;;
+C106;HANGUL SYLLABLE SYAENH;Lo;0;L;;;;;N;;;;;
+C107;HANGUL SYLLABLE SYAED;Lo;0;L;;;;;N;;;;;
+C108;HANGUL SYLLABLE SYAEL;Lo;0;L;;;;;N;;;;;
+C109;HANGUL SYLLABLE SYAELG;Lo;0;L;;;;;N;;;;;
+C10A;HANGUL SYLLABLE SYAELM;Lo;0;L;;;;;N;;;;;
+C10B;HANGUL SYLLABLE SYAELB;Lo;0;L;;;;;N;;;;;
+C10C;HANGUL SYLLABLE SYAELS;Lo;0;L;;;;;N;;;;;
+C10D;HANGUL SYLLABLE SYAELT;Lo;0;L;;;;;N;;;;;
+C10E;HANGUL SYLLABLE SYAELP;Lo;0;L;;;;;N;;;;;
+C10F;HANGUL SYLLABLE SYAELH;Lo;0;L;;;;;N;;;;;
+C110;HANGUL SYLLABLE SYAEM;Lo;0;L;;;;;N;;;;;
+C111;HANGUL SYLLABLE SYAEB;Lo;0;L;;;;;N;;;;;
+C112;HANGUL SYLLABLE SYAEBS;Lo;0;L;;;;;N;;;;;
+C113;HANGUL SYLLABLE SYAES;Lo;0;L;;;;;N;;;;;
+C114;HANGUL SYLLABLE SYAESS;Lo;0;L;;;;;N;;;;;
+C115;HANGUL SYLLABLE SYAENG;Lo;0;L;;;;;N;;;;;
+C116;HANGUL SYLLABLE SYAEJ;Lo;0;L;;;;;N;;;;;
+C117;HANGUL SYLLABLE SYAEC;Lo;0;L;;;;;N;;;;;
+C118;HANGUL SYLLABLE SYAEK;Lo;0;L;;;;;N;;;;;
+C119;HANGUL SYLLABLE SYAET;Lo;0;L;;;;;N;;;;;
+C11A;HANGUL SYLLABLE SYAEP;Lo;0;L;;;;;N;;;;;
+C11B;HANGUL SYLLABLE SYAEH;Lo;0;L;;;;;N;;;;;
+C11C;HANGUL SYLLABLE SEO;Lo;0;L;;;;;N;;;;;
+C11D;HANGUL SYLLABLE SEOG;Lo;0;L;;;;;N;;;;;
+C11E;HANGUL SYLLABLE SEOGG;Lo;0;L;;;;;N;;;;;
+C11F;HANGUL SYLLABLE SEOGS;Lo;0;L;;;;;N;;;;;
+C120;HANGUL SYLLABLE SEON;Lo;0;L;;;;;N;;;;;
+C121;HANGUL SYLLABLE SEONI;Lo;0;L;;;;;N;;;;;
+C122;HANGUL SYLLABLE SEONH;Lo;0;L;;;;;N;;;;;
+C123;HANGUL SYLLABLE SEOD;Lo;0;L;;;;;N;;;;;
+C124;HANGUL SYLLABLE SEOL;Lo;0;L;;;;;N;;;;;
+C125;HANGUL SYLLABLE SEOLG;Lo;0;L;;;;;N;;;;;
+C126;HANGUL SYLLABLE SEOLM;Lo;0;L;;;;;N;;;;;
+C127;HANGUL SYLLABLE SEOLB;Lo;0;L;;;;;N;;;;;
+C128;HANGUL SYLLABLE SEOLS;Lo;0;L;;;;;N;;;;;
+C129;HANGUL SYLLABLE SEOLT;Lo;0;L;;;;;N;;;;;
+C12A;HANGUL SYLLABLE SEOLP;Lo;0;L;;;;;N;;;;;
+C12B;HANGUL SYLLABLE SEOLH;Lo;0;L;;;;;N;;;;;
+C12C;HANGUL SYLLABLE SEOM;Lo;0;L;;;;;N;;;;;
+C12D;HANGUL SYLLABLE SEOB;Lo;0;L;;;;;N;;;;;
+C12E;HANGUL SYLLABLE SEOBS;Lo;0;L;;;;;N;;;;;
+C12F;HANGUL SYLLABLE SEOS;Lo;0;L;;;;;N;;;;;
+C130;HANGUL SYLLABLE SEOSS;Lo;0;L;;;;;N;;;;;
+C131;HANGUL SYLLABLE SEONG;Lo;0;L;;;;;N;;;;;
+C132;HANGUL SYLLABLE SEOJ;Lo;0;L;;;;;N;;;;;
+C133;HANGUL SYLLABLE SEOC;Lo;0;L;;;;;N;;;;;
+C134;HANGUL SYLLABLE SEOK;Lo;0;L;;;;;N;;;;;
+C135;HANGUL SYLLABLE SEOT;Lo;0;L;;;;;N;;;;;
+C136;HANGUL SYLLABLE SEOP;Lo;0;L;;;;;N;;;;;
+C137;HANGUL SYLLABLE SEOH;Lo;0;L;;;;;N;;;;;
+C138;HANGUL SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+C139;HANGUL SYLLABLE SEG;Lo;0;L;;;;;N;;;;;
+C13A;HANGUL SYLLABLE SEGG;Lo;0;L;;;;;N;;;;;
+C13B;HANGUL SYLLABLE SEGS;Lo;0;L;;;;;N;;;;;
+C13C;HANGUL SYLLABLE SEN;Lo;0;L;;;;;N;;;;;
+C13D;HANGUL SYLLABLE SENI;Lo;0;L;;;;;N;;;;;
+C13E;HANGUL SYLLABLE SENH;Lo;0;L;;;;;N;;;;;
+C13F;HANGUL SYLLABLE SED;Lo;0;L;;;;;N;;;;;
+C140;HANGUL SYLLABLE SEL;Lo;0;L;;;;;N;;;;;
+C141;HANGUL SYLLABLE SELG;Lo;0;L;;;;;N;;;;;
+C142;HANGUL SYLLABLE SELM;Lo;0;L;;;;;N;;;;;
+C143;HANGUL SYLLABLE SELB;Lo;0;L;;;;;N;;;;;
+C144;HANGUL SYLLABLE SELS;Lo;0;L;;;;;N;;;;;
+C145;HANGUL SYLLABLE SELT;Lo;0;L;;;;;N;;;;;
+C146;HANGUL SYLLABLE SELP;Lo;0;L;;;;;N;;;;;
+C147;HANGUL SYLLABLE SELH;Lo;0;L;;;;;N;;;;;
+C148;HANGUL SYLLABLE SEM;Lo;0;L;;;;;N;;;;;
+C149;HANGUL SYLLABLE SEB;Lo;0;L;;;;;N;;;;;
+C14A;HANGUL SYLLABLE SEBS;Lo;0;L;;;;;N;;;;;
+C14B;HANGUL SYLLABLE SES;Lo;0;L;;;;;N;;;;;
+C14C;HANGUL SYLLABLE SESS;Lo;0;L;;;;;N;;;;;
+C14D;HANGUL SYLLABLE SENG;Lo;0;L;;;;;N;;;;;
+C14E;HANGUL SYLLABLE SEJ;Lo;0;L;;;;;N;;;;;
+C14F;HANGUL SYLLABLE SEC;Lo;0;L;;;;;N;;;;;
+C150;HANGUL SYLLABLE SEK;Lo;0;L;;;;;N;;;;;
+C151;HANGUL SYLLABLE SET;Lo;0;L;;;;;N;;;;;
+C152;HANGUL SYLLABLE SEP;Lo;0;L;;;;;N;;;;;
+C153;HANGUL SYLLABLE SEH;Lo;0;L;;;;;N;;;;;
+C154;HANGUL SYLLABLE SYEO;Lo;0;L;;;;;N;;;;;
+C155;HANGUL SYLLABLE SYEOG;Lo;0;L;;;;;N;;;;;
+C156;HANGUL SYLLABLE SYEOGG;Lo;0;L;;;;;N;;;;;
+C157;HANGUL SYLLABLE SYEOGS;Lo;0;L;;;;;N;;;;;
+C158;HANGUL SYLLABLE SYEON;Lo;0;L;;;;;N;;;;;
+C159;HANGUL SYLLABLE SYEONI;Lo;0;L;;;;;N;;;;;
+C15A;HANGUL SYLLABLE SYEONH;Lo;0;L;;;;;N;;;;;
+C15B;HANGUL SYLLABLE SYEOD;Lo;0;L;;;;;N;;;;;
+C15C;HANGUL SYLLABLE SYEOL;Lo;0;L;;;;;N;;;;;
+C15D;HANGUL SYLLABLE SYEOLG;Lo;0;L;;;;;N;;;;;
+C15E;HANGUL SYLLABLE SYEOLM;Lo;0;L;;;;;N;;;;;
+C15F;HANGUL SYLLABLE SYEOLB;Lo;0;L;;;;;N;;;;;
+C160;HANGUL SYLLABLE SYEOLS;Lo;0;L;;;;;N;;;;;
+C161;HANGUL SYLLABLE SYEOLT;Lo;0;L;;;;;N;;;;;
+C162;HANGUL SYLLABLE SYEOLP;Lo;0;L;;;;;N;;;;;
+C163;HANGUL SYLLABLE SYEOLH;Lo;0;L;;;;;N;;;;;
+C164;HANGUL SYLLABLE SYEOM;Lo;0;L;;;;;N;;;;;
+C165;HANGUL SYLLABLE SYEOB;Lo;0;L;;;;;N;;;;;
+C166;HANGUL SYLLABLE SYEOBS;Lo;0;L;;;;;N;;;;;
+C167;HANGUL SYLLABLE SYEOS;Lo;0;L;;;;;N;;;;;
+C168;HANGUL SYLLABLE SYEOSS;Lo;0;L;;;;;N;;;;;
+C169;HANGUL SYLLABLE SYEONG;Lo;0;L;;;;;N;;;;;
+C16A;HANGUL SYLLABLE SYEOJ;Lo;0;L;;;;;N;;;;;
+C16B;HANGUL SYLLABLE SYEOC;Lo;0;L;;;;;N;;;;;
+C16C;HANGUL SYLLABLE SYEOK;Lo;0;L;;;;;N;;;;;
+C16D;HANGUL SYLLABLE SYEOT;Lo;0;L;;;;;N;;;;;
+C16E;HANGUL SYLLABLE SYEOP;Lo;0;L;;;;;N;;;;;
+C16F;HANGUL SYLLABLE SYEOH;Lo;0;L;;;;;N;;;;;
+C170;HANGUL SYLLABLE SYE;Lo;0;L;;;;;N;;;;;
+C171;HANGUL SYLLABLE SYEG;Lo;0;L;;;;;N;;;;;
+C172;HANGUL SYLLABLE SYEGG;Lo;0;L;;;;;N;;;;;
+C173;HANGUL SYLLABLE SYEGS;Lo;0;L;;;;;N;;;;;
+C174;HANGUL SYLLABLE SYEN;Lo;0;L;;;;;N;;;;;
+C175;HANGUL SYLLABLE SYENI;Lo;0;L;;;;;N;;;;;
+C176;HANGUL SYLLABLE SYENH;Lo;0;L;;;;;N;;;;;
+C177;HANGUL SYLLABLE SYED;Lo;0;L;;;;;N;;;;;
+C178;HANGUL SYLLABLE SYEL;Lo;0;L;;;;;N;;;;;
+C179;HANGUL SYLLABLE SYELG;Lo;0;L;;;;;N;;;;;
+C17A;HANGUL SYLLABLE SYELM;Lo;0;L;;;;;N;;;;;
+C17B;HANGUL SYLLABLE SYELB;Lo;0;L;;;;;N;;;;;
+C17C;HANGUL SYLLABLE SYELS;Lo;0;L;;;;;N;;;;;
+C17D;HANGUL SYLLABLE SYELT;Lo;0;L;;;;;N;;;;;
+C17E;HANGUL SYLLABLE SYELP;Lo;0;L;;;;;N;;;;;
+C17F;HANGUL SYLLABLE SYELH;Lo;0;L;;;;;N;;;;;
+C180;HANGUL SYLLABLE SYEM;Lo;0;L;;;;;N;;;;;
+C181;HANGUL SYLLABLE SYEB;Lo;0;L;;;;;N;;;;;
+C182;HANGUL SYLLABLE SYEBS;Lo;0;L;;;;;N;;;;;
+C183;HANGUL SYLLABLE SYES;Lo;0;L;;;;;N;;;;;
+C184;HANGUL SYLLABLE SYESS;Lo;0;L;;;;;N;;;;;
+C185;HANGUL SYLLABLE SYENG;Lo;0;L;;;;;N;;;;;
+C186;HANGUL SYLLABLE SYEJ;Lo;0;L;;;;;N;;;;;
+C187;HANGUL SYLLABLE SYEC;Lo;0;L;;;;;N;;;;;
+C188;HANGUL SYLLABLE SYEK;Lo;0;L;;;;;N;;;;;
+C189;HANGUL SYLLABLE SYET;Lo;0;L;;;;;N;;;;;
+C18A;HANGUL SYLLABLE SYEP;Lo;0;L;;;;;N;;;;;
+C18B;HANGUL SYLLABLE SYEH;Lo;0;L;;;;;N;;;;;
+C18C;HANGUL SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+C18D;HANGUL SYLLABLE SOG;Lo;0;L;;;;;N;;;;;
+C18E;HANGUL SYLLABLE SOGG;Lo;0;L;;;;;N;;;;;
+C18F;HANGUL SYLLABLE SOGS;Lo;0;L;;;;;N;;;;;
+C190;HANGUL SYLLABLE SON;Lo;0;L;;;;;N;;;;;
+C191;HANGUL SYLLABLE SONI;Lo;0;L;;;;;N;;;;;
+C192;HANGUL SYLLABLE SONH;Lo;0;L;;;;;N;;;;;
+C193;HANGUL SYLLABLE SOD;Lo;0;L;;;;;N;;;;;
+C194;HANGUL SYLLABLE SOL;Lo;0;L;;;;;N;;;;;
+C195;HANGUL SYLLABLE SOLG;Lo;0;L;;;;;N;;;;;
+C196;HANGUL SYLLABLE SOLM;Lo;0;L;;;;;N;;;;;
+C197;HANGUL SYLLABLE SOLB;Lo;0;L;;;;;N;;;;;
+C198;HANGUL SYLLABLE SOLS;Lo;0;L;;;;;N;;;;;
+C199;HANGUL SYLLABLE SOLT;Lo;0;L;;;;;N;;;;;
+C19A;HANGUL SYLLABLE SOLP;Lo;0;L;;;;;N;;;;;
+C19B;HANGUL SYLLABLE SOLH;Lo;0;L;;;;;N;;;;;
+C19C;HANGUL SYLLABLE SOM;Lo;0;L;;;;;N;;;;;
+C19D;HANGUL SYLLABLE SOB;Lo;0;L;;;;;N;;;;;
+C19E;HANGUL SYLLABLE SOBS;Lo;0;L;;;;;N;;;;;
+C19F;HANGUL SYLLABLE SOS;Lo;0;L;;;;;N;;;;;
+C1A0;HANGUL SYLLABLE SOSS;Lo;0;L;;;;;N;;;;;
+C1A1;HANGUL SYLLABLE SONG;Lo;0;L;;;;;N;;;;;
+C1A2;HANGUL SYLLABLE SOJ;Lo;0;L;;;;;N;;;;;
+C1A3;HANGUL SYLLABLE SOC;Lo;0;L;;;;;N;;;;;
+C1A4;HANGUL SYLLABLE SOK;Lo;0;L;;;;;N;;;;;
+C1A5;HANGUL SYLLABLE SOT;Lo;0;L;;;;;N;;;;;
+C1A6;HANGUL SYLLABLE SOP;Lo;0;L;;;;;N;;;;;
+C1A7;HANGUL SYLLABLE SOH;Lo;0;L;;;;;N;;;;;
+C1A8;HANGUL SYLLABLE SWA;Lo;0;L;;;;;N;;;;;
+C1A9;HANGUL SYLLABLE SWAG;Lo;0;L;;;;;N;;;;;
+C1AA;HANGUL SYLLABLE SWAGG;Lo;0;L;;;;;N;;;;;
+C1AB;HANGUL SYLLABLE SWAGS;Lo;0;L;;;;;N;;;;;
+C1AC;HANGUL SYLLABLE SWAN;Lo;0;L;;;;;N;;;;;
+C1AD;HANGUL SYLLABLE SWANI;Lo;0;L;;;;;N;;;;;
+C1AE;HANGUL SYLLABLE SWANH;Lo;0;L;;;;;N;;;;;
+C1AF;HANGUL SYLLABLE SWAD;Lo;0;L;;;;;N;;;;;
+C1B0;HANGUL SYLLABLE SWAL;Lo;0;L;;;;;N;;;;;
+C1B1;HANGUL SYLLABLE SWALG;Lo;0;L;;;;;N;;;;;
+C1B2;HANGUL SYLLABLE SWALM;Lo;0;L;;;;;N;;;;;
+C1B3;HANGUL SYLLABLE SWALB;Lo;0;L;;;;;N;;;;;
+C1B4;HANGUL SYLLABLE SWALS;Lo;0;L;;;;;N;;;;;
+C1B5;HANGUL SYLLABLE SWALT;Lo;0;L;;;;;N;;;;;
+C1B6;HANGUL SYLLABLE SWALP;Lo;0;L;;;;;N;;;;;
+C1B7;HANGUL SYLLABLE SWALH;Lo;0;L;;;;;N;;;;;
+C1B8;HANGUL SYLLABLE SWAM;Lo;0;L;;;;;N;;;;;
+C1B9;HANGUL SYLLABLE SWAB;Lo;0;L;;;;;N;;;;;
+C1BA;HANGUL SYLLABLE SWABS;Lo;0;L;;;;;N;;;;;
+C1BB;HANGUL SYLLABLE SWAS;Lo;0;L;;;;;N;;;;;
+C1BC;HANGUL SYLLABLE SWASS;Lo;0;L;;;;;N;;;;;
+C1BD;HANGUL SYLLABLE SWANG;Lo;0;L;;;;;N;;;;;
+C1BE;HANGUL SYLLABLE SWAJ;Lo;0;L;;;;;N;;;;;
+C1BF;HANGUL SYLLABLE SWAC;Lo;0;L;;;;;N;;;;;
+C1C0;HANGUL SYLLABLE SWAK;Lo;0;L;;;;;N;;;;;
+C1C1;HANGUL SYLLABLE SWAT;Lo;0;L;;;;;N;;;;;
+C1C2;HANGUL SYLLABLE SWAP;Lo;0;L;;;;;N;;;;;
+C1C3;HANGUL SYLLABLE SWAH;Lo;0;L;;;;;N;;;;;
+C1C4;HANGUL SYLLABLE SWAE;Lo;0;L;;;;;N;;;;;
+C1C5;HANGUL SYLLABLE SWAEG;Lo;0;L;;;;;N;;;;;
+C1C6;HANGUL SYLLABLE SWAEGG;Lo;0;L;;;;;N;;;;;
+C1C7;HANGUL SYLLABLE SWAEGS;Lo;0;L;;;;;N;;;;;
+C1C8;HANGUL SYLLABLE SWAEN;Lo;0;L;;;;;N;;;;;
+C1C9;HANGUL SYLLABLE SWAENI;Lo;0;L;;;;;N;;;;;
+C1CA;HANGUL SYLLABLE SWAENH;Lo;0;L;;;;;N;;;;;
+C1CB;HANGUL SYLLABLE SWAED;Lo;0;L;;;;;N;;;;;
+C1CC;HANGUL SYLLABLE SWAEL;Lo;0;L;;;;;N;;;;;
+C1CD;HANGUL SYLLABLE SWAELG;Lo;0;L;;;;;N;;;;;
+C1CE;HANGUL SYLLABLE SWAELM;Lo;0;L;;;;;N;;;;;
+C1CF;HANGUL SYLLABLE SWAELB;Lo;0;L;;;;;N;;;;;
+C1D0;HANGUL SYLLABLE SWAELS;Lo;0;L;;;;;N;;;;;
+C1D1;HANGUL SYLLABLE SWAELT;Lo;0;L;;;;;N;;;;;
+C1D2;HANGUL SYLLABLE SWAELP;Lo;0;L;;;;;N;;;;;
+C1D3;HANGUL SYLLABLE SWAELH;Lo;0;L;;;;;N;;;;;
+C1D4;HANGUL SYLLABLE SWAEM;Lo;0;L;;;;;N;;;;;
+C1D5;HANGUL SYLLABLE SWAEB;Lo;0;L;;;;;N;;;;;
+C1D6;HANGUL SYLLABLE SWAEBS;Lo;0;L;;;;;N;;;;;
+C1D7;HANGUL SYLLABLE SWAES;Lo;0;L;;;;;N;;;;;
+C1D8;HANGUL SYLLABLE SWAESS;Lo;0;L;;;;;N;;;;;
+C1D9;HANGUL SYLLABLE SWAENG;Lo;0;L;;;;;N;;;;;
+C1DA;HANGUL SYLLABLE SWAEJ;Lo;0;L;;;;;N;;;;;
+C1DB;HANGUL SYLLABLE SWAEC;Lo;0;L;;;;;N;;;;;
+C1DC;HANGUL SYLLABLE SWAEK;Lo;0;L;;;;;N;;;;;
+C1DD;HANGUL SYLLABLE SWAET;Lo;0;L;;;;;N;;;;;
+C1DE;HANGUL SYLLABLE SWAEP;Lo;0;L;;;;;N;;;;;
+C1DF;HANGUL SYLLABLE SWAEH;Lo;0;L;;;;;N;;;;;
+C1E0;HANGUL SYLLABLE SOE;Lo;0;L;;;;;N;;;;;
+C1E1;HANGUL SYLLABLE SOEG;Lo;0;L;;;;;N;;;;;
+C1E2;HANGUL SYLLABLE SOEGG;Lo;0;L;;;;;N;;;;;
+C1E3;HANGUL SYLLABLE SOEGS;Lo;0;L;;;;;N;;;;;
+C1E4;HANGUL SYLLABLE SOEN;Lo;0;L;;;;;N;;;;;
+C1E5;HANGUL SYLLABLE SOENI;Lo;0;L;;;;;N;;;;;
+C1E6;HANGUL SYLLABLE SOENH;Lo;0;L;;;;;N;;;;;
+C1E7;HANGUL SYLLABLE SOED;Lo;0;L;;;;;N;;;;;
+C1E8;HANGUL SYLLABLE SOEL;Lo;0;L;;;;;N;;;;;
+C1E9;HANGUL SYLLABLE SOELG;Lo;0;L;;;;;N;;;;;
+C1EA;HANGUL SYLLABLE SOELM;Lo;0;L;;;;;N;;;;;
+C1EB;HANGUL SYLLABLE SOELB;Lo;0;L;;;;;N;;;;;
+C1EC;HANGUL SYLLABLE SOELS;Lo;0;L;;;;;N;;;;;
+C1ED;HANGUL SYLLABLE SOELT;Lo;0;L;;;;;N;;;;;
+C1EE;HANGUL SYLLABLE SOELP;Lo;0;L;;;;;N;;;;;
+C1EF;HANGUL SYLLABLE SOELH;Lo;0;L;;;;;N;;;;;
+C1F0;HANGUL SYLLABLE SOEM;Lo;0;L;;;;;N;;;;;
+C1F1;HANGUL SYLLABLE SOEB;Lo;0;L;;;;;N;;;;;
+C1F2;HANGUL SYLLABLE SOEBS;Lo;0;L;;;;;N;;;;;
+C1F3;HANGUL SYLLABLE SOES;Lo;0;L;;;;;N;;;;;
+C1F4;HANGUL SYLLABLE SOESS;Lo;0;L;;;;;N;;;;;
+C1F5;HANGUL SYLLABLE SOENG;Lo;0;L;;;;;N;;;;;
+C1F6;HANGUL SYLLABLE SOEJ;Lo;0;L;;;;;N;;;;;
+C1F7;HANGUL SYLLABLE SOEC;Lo;0;L;;;;;N;;;;;
+C1F8;HANGUL SYLLABLE SOEK;Lo;0;L;;;;;N;;;;;
+C1F9;HANGUL SYLLABLE SOET;Lo;0;L;;;;;N;;;;;
+C1FA;HANGUL SYLLABLE SOEP;Lo;0;L;;;;;N;;;;;
+C1FB;HANGUL SYLLABLE SOEH;Lo;0;L;;;;;N;;;;;
+C1FC;HANGUL SYLLABLE SYO;Lo;0;L;;;;;N;;;;;
+C1FD;HANGUL SYLLABLE SYOG;Lo;0;L;;;;;N;;;;;
+C1FE;HANGUL SYLLABLE SYOGG;Lo;0;L;;;;;N;;;;;
+C1FF;HANGUL SYLLABLE SYOGS;Lo;0;L;;;;;N;;;;;
+C200;HANGUL SYLLABLE SYON;Lo;0;L;;;;;N;;;;;
+C201;HANGUL SYLLABLE SYONI;Lo;0;L;;;;;N;;;;;
+C202;HANGUL SYLLABLE SYONH;Lo;0;L;;;;;N;;;;;
+C203;HANGUL SYLLABLE SYOD;Lo;0;L;;;;;N;;;;;
+C204;HANGUL SYLLABLE SYOL;Lo;0;L;;;;;N;;;;;
+C205;HANGUL SYLLABLE SYOLG;Lo;0;L;;;;;N;;;;;
+C206;HANGUL SYLLABLE SYOLM;Lo;0;L;;;;;N;;;;;
+C207;HANGUL SYLLABLE SYOLB;Lo;0;L;;;;;N;;;;;
+C208;HANGUL SYLLABLE SYOLS;Lo;0;L;;;;;N;;;;;
+C209;HANGUL SYLLABLE SYOLT;Lo;0;L;;;;;N;;;;;
+C20A;HANGUL SYLLABLE SYOLP;Lo;0;L;;;;;N;;;;;
+C20B;HANGUL SYLLABLE SYOLH;Lo;0;L;;;;;N;;;;;
+C20C;HANGUL SYLLABLE SYOM;Lo;0;L;;;;;N;;;;;
+C20D;HANGUL SYLLABLE SYOB;Lo;0;L;;;;;N;;;;;
+C20E;HANGUL SYLLABLE SYOBS;Lo;0;L;;;;;N;;;;;
+C20F;HANGUL SYLLABLE SYOS;Lo;0;L;;;;;N;;;;;
+C210;HANGUL SYLLABLE SYOSS;Lo;0;L;;;;;N;;;;;
+C211;HANGUL SYLLABLE SYONG;Lo;0;L;;;;;N;;;;;
+C212;HANGUL SYLLABLE SYOJ;Lo;0;L;;;;;N;;;;;
+C213;HANGUL SYLLABLE SYOC;Lo;0;L;;;;;N;;;;;
+C214;HANGUL SYLLABLE SYOK;Lo;0;L;;;;;N;;;;;
+C215;HANGUL SYLLABLE SYOT;Lo;0;L;;;;;N;;;;;
+C216;HANGUL SYLLABLE SYOP;Lo;0;L;;;;;N;;;;;
+C217;HANGUL SYLLABLE SYOH;Lo;0;L;;;;;N;;;;;
+C218;HANGUL SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+C219;HANGUL SYLLABLE SUG;Lo;0;L;;;;;N;;;;;
+C21A;HANGUL SYLLABLE SUGG;Lo;0;L;;;;;N;;;;;
+C21B;HANGUL SYLLABLE SUGS;Lo;0;L;;;;;N;;;;;
+C21C;HANGUL SYLLABLE SUN;Lo;0;L;;;;;N;;;;;
+C21D;HANGUL SYLLABLE SUNI;Lo;0;L;;;;;N;;;;;
+C21E;HANGUL SYLLABLE SUNH;Lo;0;L;;;;;N;;;;;
+C21F;HANGUL SYLLABLE SUD;Lo;0;L;;;;;N;;;;;
+C220;HANGUL SYLLABLE SUL;Lo;0;L;;;;;N;;;;;
+C221;HANGUL SYLLABLE SULG;Lo;0;L;;;;;N;;;;;
+C222;HANGUL SYLLABLE SULM;Lo;0;L;;;;;N;;;;;
+C223;HANGUL SYLLABLE SULB;Lo;0;L;;;;;N;;;;;
+C224;HANGUL SYLLABLE SULS;Lo;0;L;;;;;N;;;;;
+C225;HANGUL SYLLABLE SULT;Lo;0;L;;;;;N;;;;;
+C226;HANGUL SYLLABLE SULP;Lo;0;L;;;;;N;;;;;
+C227;HANGUL SYLLABLE SULH;Lo;0;L;;;;;N;;;;;
+C228;HANGUL SYLLABLE SUM;Lo;0;L;;;;;N;;;;;
+C229;HANGUL SYLLABLE SUB;Lo;0;L;;;;;N;;;;;
+C22A;HANGUL SYLLABLE SUBS;Lo;0;L;;;;;N;;;;;
+C22B;HANGUL SYLLABLE SUS;Lo;0;L;;;;;N;;;;;
+C22C;HANGUL SYLLABLE SUSS;Lo;0;L;;;;;N;;;;;
+C22D;HANGUL SYLLABLE SUNG;Lo;0;L;;;;;N;;;;;
+C22E;HANGUL SYLLABLE SUJ;Lo;0;L;;;;;N;;;;;
+C22F;HANGUL SYLLABLE SUC;Lo;0;L;;;;;N;;;;;
+C230;HANGUL SYLLABLE SUK;Lo;0;L;;;;;N;;;;;
+C231;HANGUL SYLLABLE SUT;Lo;0;L;;;;;N;;;;;
+C232;HANGUL SYLLABLE SUP;Lo;0;L;;;;;N;;;;;
+C233;HANGUL SYLLABLE SUH;Lo;0;L;;;;;N;;;;;
+C234;HANGUL SYLLABLE SWEO;Lo;0;L;;;;;N;;;;;
+C235;HANGUL SYLLABLE SWEOG;Lo;0;L;;;;;N;;;;;
+C236;HANGUL SYLLABLE SWEOGG;Lo;0;L;;;;;N;;;;;
+C237;HANGUL SYLLABLE SWEOGS;Lo;0;L;;;;;N;;;;;
+C238;HANGUL SYLLABLE SWEON;Lo;0;L;;;;;N;;;;;
+C239;HANGUL SYLLABLE SWEONI;Lo;0;L;;;;;N;;;;;
+C23A;HANGUL SYLLABLE SWEONH;Lo;0;L;;;;;N;;;;;
+C23B;HANGUL SYLLABLE SWEOD;Lo;0;L;;;;;N;;;;;
+C23C;HANGUL SYLLABLE SWEOL;Lo;0;L;;;;;N;;;;;
+C23D;HANGUL SYLLABLE SWEOLG;Lo;0;L;;;;;N;;;;;
+C23E;HANGUL SYLLABLE SWEOLM;Lo;0;L;;;;;N;;;;;
+C23F;HANGUL SYLLABLE SWEOLB;Lo;0;L;;;;;N;;;;;
+C240;HANGUL SYLLABLE SWEOLS;Lo;0;L;;;;;N;;;;;
+C241;HANGUL SYLLABLE SWEOLT;Lo;0;L;;;;;N;;;;;
+C242;HANGUL SYLLABLE SWEOLP;Lo;0;L;;;;;N;;;;;
+C243;HANGUL SYLLABLE SWEOLH;Lo;0;L;;;;;N;;;;;
+C244;HANGUL SYLLABLE SWEOM;Lo;0;L;;;;;N;;;;;
+C245;HANGUL SYLLABLE SWEOB;Lo;0;L;;;;;N;;;;;
+C246;HANGUL SYLLABLE SWEOBS;Lo;0;L;;;;;N;;;;;
+C247;HANGUL SYLLABLE SWEOS;Lo;0;L;;;;;N;;;;;
+C248;HANGUL SYLLABLE SWEOSS;Lo;0;L;;;;;N;;;;;
+C249;HANGUL SYLLABLE SWEONG;Lo;0;L;;;;;N;;;;;
+C24A;HANGUL SYLLABLE SWEOJ;Lo;0;L;;;;;N;;;;;
+C24B;HANGUL SYLLABLE SWEOC;Lo;0;L;;;;;N;;;;;
+C24C;HANGUL SYLLABLE SWEOK;Lo;0;L;;;;;N;;;;;
+C24D;HANGUL SYLLABLE SWEOT;Lo;0;L;;;;;N;;;;;
+C24E;HANGUL SYLLABLE SWEOP;Lo;0;L;;;;;N;;;;;
+C24F;HANGUL SYLLABLE SWEOH;Lo;0;L;;;;;N;;;;;
+C250;HANGUL SYLLABLE SWE;Lo;0;L;;;;;N;;;;;
+C251;HANGUL SYLLABLE SWEG;Lo;0;L;;;;;N;;;;;
+C252;HANGUL SYLLABLE SWEGG;Lo;0;L;;;;;N;;;;;
+C253;HANGUL SYLLABLE SWEGS;Lo;0;L;;;;;N;;;;;
+C254;HANGUL SYLLABLE SWEN;Lo;0;L;;;;;N;;;;;
+C255;HANGUL SYLLABLE SWENI;Lo;0;L;;;;;N;;;;;
+C256;HANGUL SYLLABLE SWENH;Lo;0;L;;;;;N;;;;;
+C257;HANGUL SYLLABLE SWED;Lo;0;L;;;;;N;;;;;
+C258;HANGUL SYLLABLE SWEL;Lo;0;L;;;;;N;;;;;
+C259;HANGUL SYLLABLE SWELG;Lo;0;L;;;;;N;;;;;
+C25A;HANGUL SYLLABLE SWELM;Lo;0;L;;;;;N;;;;;
+C25B;HANGUL SYLLABLE SWELB;Lo;0;L;;;;;N;;;;;
+C25C;HANGUL SYLLABLE SWELS;Lo;0;L;;;;;N;;;;;
+C25D;HANGUL SYLLABLE SWELT;Lo;0;L;;;;;N;;;;;
+C25E;HANGUL SYLLABLE SWELP;Lo;0;L;;;;;N;;;;;
+C25F;HANGUL SYLLABLE SWELH;Lo;0;L;;;;;N;;;;;
+C260;HANGUL SYLLABLE SWEM;Lo;0;L;;;;;N;;;;;
+C261;HANGUL SYLLABLE SWEB;Lo;0;L;;;;;N;;;;;
+C262;HANGUL SYLLABLE SWEBS;Lo;0;L;;;;;N;;;;;
+C263;HANGUL SYLLABLE SWES;Lo;0;L;;;;;N;;;;;
+C264;HANGUL SYLLABLE SWESS;Lo;0;L;;;;;N;;;;;
+C265;HANGUL SYLLABLE SWENG;Lo;0;L;;;;;N;;;;;
+C266;HANGUL SYLLABLE SWEJ;Lo;0;L;;;;;N;;;;;
+C267;HANGUL SYLLABLE SWEC;Lo;0;L;;;;;N;;;;;
+C268;HANGUL SYLLABLE SWEK;Lo;0;L;;;;;N;;;;;
+C269;HANGUL SYLLABLE SWET;Lo;0;L;;;;;N;;;;;
+C26A;HANGUL SYLLABLE SWEP;Lo;0;L;;;;;N;;;;;
+C26B;HANGUL SYLLABLE SWEH;Lo;0;L;;;;;N;;;;;
+C26C;HANGUL SYLLABLE SWI;Lo;0;L;;;;;N;;;;;
+C26D;HANGUL SYLLABLE SWIG;Lo;0;L;;;;;N;;;;;
+C26E;HANGUL SYLLABLE SWIGG;Lo;0;L;;;;;N;;;;;
+C26F;HANGUL SYLLABLE SWIGS;Lo;0;L;;;;;N;;;;;
+C270;HANGUL SYLLABLE SWIN;Lo;0;L;;;;;N;;;;;
+C271;HANGUL SYLLABLE SWINI;Lo;0;L;;;;;N;;;;;
+C272;HANGUL SYLLABLE SWINH;Lo;0;L;;;;;N;;;;;
+C273;HANGUL SYLLABLE SWID;Lo;0;L;;;;;N;;;;;
+C274;HANGUL SYLLABLE SWIL;Lo;0;L;;;;;N;;;;;
+C275;HANGUL SYLLABLE SWILG;Lo;0;L;;;;;N;;;;;
+C276;HANGUL SYLLABLE SWILM;Lo;0;L;;;;;N;;;;;
+C277;HANGUL SYLLABLE SWILB;Lo;0;L;;;;;N;;;;;
+C278;HANGUL SYLLABLE SWILS;Lo;0;L;;;;;N;;;;;
+C279;HANGUL SYLLABLE SWILT;Lo;0;L;;;;;N;;;;;
+C27A;HANGUL SYLLABLE SWILP;Lo;0;L;;;;;N;;;;;
+C27B;HANGUL SYLLABLE SWILH;Lo;0;L;;;;;N;;;;;
+C27C;HANGUL SYLLABLE SWIM;Lo;0;L;;;;;N;;;;;
+C27D;HANGUL SYLLABLE SWIB;Lo;0;L;;;;;N;;;;;
+C27E;HANGUL SYLLABLE SWIBS;Lo;0;L;;;;;N;;;;;
+C27F;HANGUL SYLLABLE SWIS;Lo;0;L;;;;;N;;;;;
+C280;HANGUL SYLLABLE SWISS;Lo;0;L;;;;;N;;;;;
+C281;HANGUL SYLLABLE SWING;Lo;0;L;;;;;N;;;;;
+C282;HANGUL SYLLABLE SWIJ;Lo;0;L;;;;;N;;;;;
+C283;HANGUL SYLLABLE SWIC;Lo;0;L;;;;;N;;;;;
+C284;HANGUL SYLLABLE SWIK;Lo;0;L;;;;;N;;;;;
+C285;HANGUL SYLLABLE SWIT;Lo;0;L;;;;;N;;;;;
+C286;HANGUL SYLLABLE SWIP;Lo;0;L;;;;;N;;;;;
+C287;HANGUL SYLLABLE SWIH;Lo;0;L;;;;;N;;;;;
+C288;HANGUL SYLLABLE SYU;Lo;0;L;;;;;N;;;;;
+C289;HANGUL SYLLABLE SYUG;Lo;0;L;;;;;N;;;;;
+C28A;HANGUL SYLLABLE SYUGG;Lo;0;L;;;;;N;;;;;
+C28B;HANGUL SYLLABLE SYUGS;Lo;0;L;;;;;N;;;;;
+C28C;HANGUL SYLLABLE SYUN;Lo;0;L;;;;;N;;;;;
+C28D;HANGUL SYLLABLE SYUNI;Lo;0;L;;;;;N;;;;;
+C28E;HANGUL SYLLABLE SYUNH;Lo;0;L;;;;;N;;;;;
+C28F;HANGUL SYLLABLE SYUD;Lo;0;L;;;;;N;;;;;
+C290;HANGUL SYLLABLE SYUL;Lo;0;L;;;;;N;;;;;
+C291;HANGUL SYLLABLE SYULG;Lo;0;L;;;;;N;;;;;
+C292;HANGUL SYLLABLE SYULM;Lo;0;L;;;;;N;;;;;
+C293;HANGUL SYLLABLE SYULB;Lo;0;L;;;;;N;;;;;
+C294;HANGUL SYLLABLE SYULS;Lo;0;L;;;;;N;;;;;
+C295;HANGUL SYLLABLE SYULT;Lo;0;L;;;;;N;;;;;
+C296;HANGUL SYLLABLE SYULP;Lo;0;L;;;;;N;;;;;
+C297;HANGUL SYLLABLE SYULH;Lo;0;L;;;;;N;;;;;
+C298;HANGUL SYLLABLE SYUM;Lo;0;L;;;;;N;;;;;
+C299;HANGUL SYLLABLE SYUB;Lo;0;L;;;;;N;;;;;
+C29A;HANGUL SYLLABLE SYUBS;Lo;0;L;;;;;N;;;;;
+C29B;HANGUL SYLLABLE SYUS;Lo;0;L;;;;;N;;;;;
+C29C;HANGUL SYLLABLE SYUSS;Lo;0;L;;;;;N;;;;;
+C29D;HANGUL SYLLABLE SYUNG;Lo;0;L;;;;;N;;;;;
+C29E;HANGUL SYLLABLE SYUJ;Lo;0;L;;;;;N;;;;;
+C29F;HANGUL SYLLABLE SYUC;Lo;0;L;;;;;N;;;;;
+C2A0;HANGUL SYLLABLE SYUK;Lo;0;L;;;;;N;;;;;
+C2A1;HANGUL SYLLABLE SYUT;Lo;0;L;;;;;N;;;;;
+C2A2;HANGUL SYLLABLE SYUP;Lo;0;L;;;;;N;;;;;
+C2A3;HANGUL SYLLABLE SYUH;Lo;0;L;;;;;N;;;;;
+C2A4;HANGUL SYLLABLE SEU;Lo;0;L;;;;;N;;;;;
+C2A5;HANGUL SYLLABLE SEUG;Lo;0;L;;;;;N;;;;;
+C2A6;HANGUL SYLLABLE SEUGG;Lo;0;L;;;;;N;;;;;
+C2A7;HANGUL SYLLABLE SEUGS;Lo;0;L;;;;;N;;;;;
+C2A8;HANGUL SYLLABLE SEUN;Lo;0;L;;;;;N;;;;;
+C2A9;HANGUL SYLLABLE SEUNI;Lo;0;L;;;;;N;;;;;
+C2AA;HANGUL SYLLABLE SEUNH;Lo;0;L;;;;;N;;;;;
+C2AB;HANGUL SYLLABLE SEUD;Lo;0;L;;;;;N;;;;;
+C2AC;HANGUL SYLLABLE SEUL;Lo;0;L;;;;;N;;;;;
+C2AD;HANGUL SYLLABLE SEULG;Lo;0;L;;;;;N;;;;;
+C2AE;HANGUL SYLLABLE SEULM;Lo;0;L;;;;;N;;;;;
+C2AF;HANGUL SYLLABLE SEULB;Lo;0;L;;;;;N;;;;;
+C2B0;HANGUL SYLLABLE SEULS;Lo;0;L;;;;;N;;;;;
+C2B1;HANGUL SYLLABLE SEULT;Lo;0;L;;;;;N;;;;;
+C2B2;HANGUL SYLLABLE SEULP;Lo;0;L;;;;;N;;;;;
+C2B3;HANGUL SYLLABLE SEULH;Lo;0;L;;;;;N;;;;;
+C2B4;HANGUL SYLLABLE SEUM;Lo;0;L;;;;;N;;;;;
+C2B5;HANGUL SYLLABLE SEUB;Lo;0;L;;;;;N;;;;;
+C2B6;HANGUL SYLLABLE SEUBS;Lo;0;L;;;;;N;;;;;
+C2B7;HANGUL SYLLABLE SEUS;Lo;0;L;;;;;N;;;;;
+C2B8;HANGUL SYLLABLE SEUSS;Lo;0;L;;;;;N;;;;;
+C2B9;HANGUL SYLLABLE SEUNG;Lo;0;L;;;;;N;;;;;
+C2BA;HANGUL SYLLABLE SEUJ;Lo;0;L;;;;;N;;;;;
+C2BB;HANGUL SYLLABLE SEUC;Lo;0;L;;;;;N;;;;;
+C2BC;HANGUL SYLLABLE SEUK;Lo;0;L;;;;;N;;;;;
+C2BD;HANGUL SYLLABLE SEUT;Lo;0;L;;;;;N;;;;;
+C2BE;HANGUL SYLLABLE SEUP;Lo;0;L;;;;;N;;;;;
+C2BF;HANGUL SYLLABLE SEUH;Lo;0;L;;;;;N;;;;;
+C2C0;HANGUL SYLLABLE SYI;Lo;0;L;;;;;N;;;;;
+C2C1;HANGUL SYLLABLE SYIG;Lo;0;L;;;;;N;;;;;
+C2C2;HANGUL SYLLABLE SYIGG;Lo;0;L;;;;;N;;;;;
+C2C3;HANGUL SYLLABLE SYIGS;Lo;0;L;;;;;N;;;;;
+C2C4;HANGUL SYLLABLE SYIN;Lo;0;L;;;;;N;;;;;
+C2C5;HANGUL SYLLABLE SYINI;Lo;0;L;;;;;N;;;;;
+C2C6;HANGUL SYLLABLE SYINH;Lo;0;L;;;;;N;;;;;
+C2C7;HANGUL SYLLABLE SYID;Lo;0;L;;;;;N;;;;;
+C2C8;HANGUL SYLLABLE SYIL;Lo;0;L;;;;;N;;;;;
+C2C9;HANGUL SYLLABLE SYILG;Lo;0;L;;;;;N;;;;;
+C2CA;HANGUL SYLLABLE SYILM;Lo;0;L;;;;;N;;;;;
+C2CB;HANGUL SYLLABLE SYILB;Lo;0;L;;;;;N;;;;;
+C2CC;HANGUL SYLLABLE SYILS;Lo;0;L;;;;;N;;;;;
+C2CD;HANGUL SYLLABLE SYILT;Lo;0;L;;;;;N;;;;;
+C2CE;HANGUL SYLLABLE SYILP;Lo;0;L;;;;;N;;;;;
+C2CF;HANGUL SYLLABLE SYILH;Lo;0;L;;;;;N;;;;;
+C2D0;HANGUL SYLLABLE SYIM;Lo;0;L;;;;;N;;;;;
+C2D1;HANGUL SYLLABLE SYIB;Lo;0;L;;;;;N;;;;;
+C2D2;HANGUL SYLLABLE SYIBS;Lo;0;L;;;;;N;;;;;
+C2D3;HANGUL SYLLABLE SYIS;Lo;0;L;;;;;N;;;;;
+C2D4;HANGUL SYLLABLE SYISS;Lo;0;L;;;;;N;;;;;
+C2D5;HANGUL SYLLABLE SYING;Lo;0;L;;;;;N;;;;;
+C2D6;HANGUL SYLLABLE SYIJ;Lo;0;L;;;;;N;;;;;
+C2D7;HANGUL SYLLABLE SYIC;Lo;0;L;;;;;N;;;;;
+C2D8;HANGUL SYLLABLE SYIK;Lo;0;L;;;;;N;;;;;
+C2D9;HANGUL SYLLABLE SYIT;Lo;0;L;;;;;N;;;;;
+C2DA;HANGUL SYLLABLE SYIP;Lo;0;L;;;;;N;;;;;
+C2DB;HANGUL SYLLABLE SYIH;Lo;0;L;;;;;N;;;;;
+C2DC;HANGUL SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+C2DD;HANGUL SYLLABLE SIG;Lo;0;L;;;;;N;;;;;
+C2DE;HANGUL SYLLABLE SIGG;Lo;0;L;;;;;N;;;;;
+C2DF;HANGUL SYLLABLE SIGS;Lo;0;L;;;;;N;;;;;
+C2E0;HANGUL SYLLABLE SIN;Lo;0;L;;;;;N;;;;;
+C2E1;HANGUL SYLLABLE SINI;Lo;0;L;;;;;N;;;;;
+C2E2;HANGUL SYLLABLE SINH;Lo;0;L;;;;;N;;;;;
+C2E3;HANGUL SYLLABLE SID;Lo;0;L;;;;;N;;;;;
+C2E4;HANGUL SYLLABLE SIL;Lo;0;L;;;;;N;;;;;
+C2E5;HANGUL SYLLABLE SILG;Lo;0;L;;;;;N;;;;;
+C2E6;HANGUL SYLLABLE SILM;Lo;0;L;;;;;N;;;;;
+C2E7;HANGUL SYLLABLE SILB;Lo;0;L;;;;;N;;;;;
+C2E8;HANGUL SYLLABLE SILS;Lo;0;L;;;;;N;;;;;
+C2E9;HANGUL SYLLABLE SILT;Lo;0;L;;;;;N;;;;;
+C2EA;HANGUL SYLLABLE SILP;Lo;0;L;;;;;N;;;;;
+C2EB;HANGUL SYLLABLE SILH;Lo;0;L;;;;;N;;;;;
+C2EC;HANGUL SYLLABLE SIM;Lo;0;L;;;;;N;;;;;
+C2ED;HANGUL SYLLABLE SIB;Lo;0;L;;;;;N;;;;;
+C2EE;HANGUL SYLLABLE SIBS;Lo;0;L;;;;;N;;;;;
+C2EF;HANGUL SYLLABLE SIS;Lo;0;L;;;;;N;;;;;
+C2F0;HANGUL SYLLABLE SISS;Lo;0;L;;;;;N;;;;;
+C2F1;HANGUL SYLLABLE SING;Lo;0;L;;;;;N;;;;;
+C2F2;HANGUL SYLLABLE SIJ;Lo;0;L;;;;;N;;;;;
+C2F3;HANGUL SYLLABLE SIC;Lo;0;L;;;;;N;;;;;
+C2F4;HANGUL SYLLABLE SIK;Lo;0;L;;;;;N;;;;;
+C2F5;HANGUL SYLLABLE SIT;Lo;0;L;;;;;N;;;;;
+C2F6;HANGUL SYLLABLE SIP;Lo;0;L;;;;;N;;;;;
+C2F7;HANGUL SYLLABLE SIH;Lo;0;L;;;;;N;;;;;
+C2F8;HANGUL SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+C2F9;HANGUL SYLLABLE SSAG;Lo;0;L;;;;;N;;;;;
+C2FA;HANGUL SYLLABLE SSAGG;Lo;0;L;;;;;N;;;;;
+C2FB;HANGUL SYLLABLE SSAGS;Lo;0;L;;;;;N;;;;;
+C2FC;HANGUL SYLLABLE SSAN;Lo;0;L;;;;;N;;;;;
+C2FD;HANGUL SYLLABLE SSANI;Lo;0;L;;;;;N;;;;;
+C2FE;HANGUL SYLLABLE SSANH;Lo;0;L;;;;;N;;;;;
+C2FF;HANGUL SYLLABLE SSAD;Lo;0;L;;;;;N;;;;;
+C300;HANGUL SYLLABLE SSAL;Lo;0;L;;;;;N;;;;;
+C301;HANGUL SYLLABLE SSALG;Lo;0;L;;;;;N;;;;;
+C302;HANGUL SYLLABLE SSALM;Lo;0;L;;;;;N;;;;;
+C303;HANGUL SYLLABLE SSALB;Lo;0;L;;;;;N;;;;;
+C304;HANGUL SYLLABLE SSALS;Lo;0;L;;;;;N;;;;;
+C305;HANGUL SYLLABLE SSALT;Lo;0;L;;;;;N;;;;;
+C306;HANGUL SYLLABLE SSALP;Lo;0;L;;;;;N;;;;;
+C307;HANGUL SYLLABLE SSALH;Lo;0;L;;;;;N;;;;;
+C308;HANGUL SYLLABLE SSAM;Lo;0;L;;;;;N;;;;;
+C309;HANGUL SYLLABLE SSAB;Lo;0;L;;;;;N;;;;;
+C30A;HANGUL SYLLABLE SSABS;Lo;0;L;;;;;N;;;;;
+C30B;HANGUL SYLLABLE SSAS;Lo;0;L;;;;;N;;;;;
+C30C;HANGUL SYLLABLE SSASS;Lo;0;L;;;;;N;;;;;
+C30D;HANGUL SYLLABLE SSANG;Lo;0;L;;;;;N;;;;;
+C30E;HANGUL SYLLABLE SSAJ;Lo;0;L;;;;;N;;;;;
+C30F;HANGUL SYLLABLE SSAC;Lo;0;L;;;;;N;;;;;
+C310;HANGUL SYLLABLE SSAK;Lo;0;L;;;;;N;;;;;
+C311;HANGUL SYLLABLE SSAT;Lo;0;L;;;;;N;;;;;
+C312;HANGUL SYLLABLE SSAP;Lo;0;L;;;;;N;;;;;
+C313;HANGUL SYLLABLE SSAH;Lo;0;L;;;;;N;;;;;
+C314;HANGUL SYLLABLE SSAE;Lo;0;L;;;;;N;;;;;
+C315;HANGUL SYLLABLE SSAEG;Lo;0;L;;;;;N;;;;;
+C316;HANGUL SYLLABLE SSAEGG;Lo;0;L;;;;;N;;;;;
+C317;HANGUL SYLLABLE SSAEGS;Lo;0;L;;;;;N;;;;;
+C318;HANGUL SYLLABLE SSAEN;Lo;0;L;;;;;N;;;;;
+C319;HANGUL SYLLABLE SSAENI;Lo;0;L;;;;;N;;;;;
+C31A;HANGUL SYLLABLE SSAENH;Lo;0;L;;;;;N;;;;;
+C31B;HANGUL SYLLABLE SSAED;Lo;0;L;;;;;N;;;;;
+C31C;HANGUL SYLLABLE SSAEL;Lo;0;L;;;;;N;;;;;
+C31D;HANGUL SYLLABLE SSAELG;Lo;0;L;;;;;N;;;;;
+C31E;HANGUL SYLLABLE SSAELM;Lo;0;L;;;;;N;;;;;
+C31F;HANGUL SYLLABLE SSAELB;Lo;0;L;;;;;N;;;;;
+C320;HANGUL SYLLABLE SSAELS;Lo;0;L;;;;;N;;;;;
+C321;HANGUL SYLLABLE SSAELT;Lo;0;L;;;;;N;;;;;
+C322;HANGUL SYLLABLE SSAELP;Lo;0;L;;;;;N;;;;;
+C323;HANGUL SYLLABLE SSAELH;Lo;0;L;;;;;N;;;;;
+C324;HANGUL SYLLABLE SSAEM;Lo;0;L;;;;;N;;;;;
+C325;HANGUL SYLLABLE SSAEB;Lo;0;L;;;;;N;;;;;
+C326;HANGUL SYLLABLE SSAEBS;Lo;0;L;;;;;N;;;;;
+C327;HANGUL SYLLABLE SSAES;Lo;0;L;;;;;N;;;;;
+C328;HANGUL SYLLABLE SSAESS;Lo;0;L;;;;;N;;;;;
+C329;HANGUL SYLLABLE SSAENG;Lo;0;L;;;;;N;;;;;
+C32A;HANGUL SYLLABLE SSAEJ;Lo;0;L;;;;;N;;;;;
+C32B;HANGUL SYLLABLE SSAEC;Lo;0;L;;;;;N;;;;;
+C32C;HANGUL SYLLABLE SSAEK;Lo;0;L;;;;;N;;;;;
+C32D;HANGUL SYLLABLE SSAET;Lo;0;L;;;;;N;;;;;
+C32E;HANGUL SYLLABLE SSAEP;Lo;0;L;;;;;N;;;;;
+C32F;HANGUL SYLLABLE SSAEH;Lo;0;L;;;;;N;;;;;
+C330;HANGUL SYLLABLE SSYA;Lo;0;L;;;;;N;;;;;
+C331;HANGUL SYLLABLE SSYAG;Lo;0;L;;;;;N;;;;;
+C332;HANGUL SYLLABLE SSYAGG;Lo;0;L;;;;;N;;;;;
+C333;HANGUL SYLLABLE SSYAGS;Lo;0;L;;;;;N;;;;;
+C334;HANGUL SYLLABLE SSYAN;Lo;0;L;;;;;N;;;;;
+C335;HANGUL SYLLABLE SSYANI;Lo;0;L;;;;;N;;;;;
+C336;HANGUL SYLLABLE SSYANH;Lo;0;L;;;;;N;;;;;
+C337;HANGUL SYLLABLE SSYAD;Lo;0;L;;;;;N;;;;;
+C338;HANGUL SYLLABLE SSYAL;Lo;0;L;;;;;N;;;;;
+C339;HANGUL SYLLABLE SSYALG;Lo;0;L;;;;;N;;;;;
+C33A;HANGUL SYLLABLE SSYALM;Lo;0;L;;;;;N;;;;;
+C33B;HANGUL SYLLABLE SSYALB;Lo;0;L;;;;;N;;;;;
+C33C;HANGUL SYLLABLE SSYALS;Lo;0;L;;;;;N;;;;;
+C33D;HANGUL SYLLABLE SSYALT;Lo;0;L;;;;;N;;;;;
+C33E;HANGUL SYLLABLE SSYALP;Lo;0;L;;;;;N;;;;;
+C33F;HANGUL SYLLABLE SSYALH;Lo;0;L;;;;;N;;;;;
+C340;HANGUL SYLLABLE SSYAM;Lo;0;L;;;;;N;;;;;
+C341;HANGUL SYLLABLE SSYAB;Lo;0;L;;;;;N;;;;;
+C342;HANGUL SYLLABLE SSYABS;Lo;0;L;;;;;N;;;;;
+C343;HANGUL SYLLABLE SSYAS;Lo;0;L;;;;;N;;;;;
+C344;HANGUL SYLLABLE SSYASS;Lo;0;L;;;;;N;;;;;
+C345;HANGUL SYLLABLE SSYANG;Lo;0;L;;;;;N;;;;;
+C346;HANGUL SYLLABLE SSYAJ;Lo;0;L;;;;;N;;;;;
+C347;HANGUL SYLLABLE SSYAC;Lo;0;L;;;;;N;;;;;
+C348;HANGUL SYLLABLE SSYAK;Lo;0;L;;;;;N;;;;;
+C349;HANGUL SYLLABLE SSYAT;Lo;0;L;;;;;N;;;;;
+C34A;HANGUL SYLLABLE SSYAP;Lo;0;L;;;;;N;;;;;
+C34B;HANGUL SYLLABLE SSYAH;Lo;0;L;;;;;N;;;;;
+C34C;HANGUL SYLLABLE SSYAE;Lo;0;L;;;;;N;;;;;
+C34D;HANGUL SYLLABLE SSYAEG;Lo;0;L;;;;;N;;;;;
+C34E;HANGUL SYLLABLE SSYAEGG;Lo;0;L;;;;;N;;;;;
+C34F;HANGUL SYLLABLE SSYAEGS;Lo;0;L;;;;;N;;;;;
+C350;HANGUL SYLLABLE SSYAEN;Lo;0;L;;;;;N;;;;;
+C351;HANGUL SYLLABLE SSYAENI;Lo;0;L;;;;;N;;;;;
+C352;HANGUL SYLLABLE SSYAENH;Lo;0;L;;;;;N;;;;;
+C353;HANGUL SYLLABLE SSYAED;Lo;0;L;;;;;N;;;;;
+C354;HANGUL SYLLABLE SSYAEL;Lo;0;L;;;;;N;;;;;
+C355;HANGUL SYLLABLE SSYAELG;Lo;0;L;;;;;N;;;;;
+C356;HANGUL SYLLABLE SSYAELM;Lo;0;L;;;;;N;;;;;
+C357;HANGUL SYLLABLE SSYAELB;Lo;0;L;;;;;N;;;;;
+C358;HANGUL SYLLABLE SSYAELS;Lo;0;L;;;;;N;;;;;
+C359;HANGUL SYLLABLE SSYAELT;Lo;0;L;;;;;N;;;;;
+C35A;HANGUL SYLLABLE SSYAELP;Lo;0;L;;;;;N;;;;;
+C35B;HANGUL SYLLABLE SSYAELH;Lo;0;L;;;;;N;;;;;
+C35C;HANGUL SYLLABLE SSYAEM;Lo;0;L;;;;;N;;;;;
+C35D;HANGUL SYLLABLE SSYAEB;Lo;0;L;;;;;N;;;;;
+C35E;HANGUL SYLLABLE SSYAEBS;Lo;0;L;;;;;N;;;;;
+C35F;HANGUL SYLLABLE SSYAES;Lo;0;L;;;;;N;;;;;
+C360;HANGUL SYLLABLE SSYAESS;Lo;0;L;;;;;N;;;;;
+C361;HANGUL SYLLABLE SSYAENG;Lo;0;L;;;;;N;;;;;
+C362;HANGUL SYLLABLE SSYAEJ;Lo;0;L;;;;;N;;;;;
+C363;HANGUL SYLLABLE SSYAEC;Lo;0;L;;;;;N;;;;;
+C364;HANGUL SYLLABLE SSYAEK;Lo;0;L;;;;;N;;;;;
+C365;HANGUL SYLLABLE SSYAET;Lo;0;L;;;;;N;;;;;
+C366;HANGUL SYLLABLE SSYAEP;Lo;0;L;;;;;N;;;;;
+C367;HANGUL SYLLABLE SSYAEH;Lo;0;L;;;;;N;;;;;
+C368;HANGUL SYLLABLE SSEO;Lo;0;L;;;;;N;;;;;
+C369;HANGUL SYLLABLE SSEOG;Lo;0;L;;;;;N;;;;;
+C36A;HANGUL SYLLABLE SSEOGG;Lo;0;L;;;;;N;;;;;
+C36B;HANGUL SYLLABLE SSEOGS;Lo;0;L;;;;;N;;;;;
+C36C;HANGUL SYLLABLE SSEON;Lo;0;L;;;;;N;;;;;
+C36D;HANGUL SYLLABLE SSEONI;Lo;0;L;;;;;N;;;;;
+C36E;HANGUL SYLLABLE SSEONH;Lo;0;L;;;;;N;;;;;
+C36F;HANGUL SYLLABLE SSEOD;Lo;0;L;;;;;N;;;;;
+C370;HANGUL SYLLABLE SSEOL;Lo;0;L;;;;;N;;;;;
+C371;HANGUL SYLLABLE SSEOLG;Lo;0;L;;;;;N;;;;;
+C372;HANGUL SYLLABLE SSEOLM;Lo;0;L;;;;;N;;;;;
+C373;HANGUL SYLLABLE SSEOLB;Lo;0;L;;;;;N;;;;;
+C374;HANGUL SYLLABLE SSEOLS;Lo;0;L;;;;;N;;;;;
+C375;HANGUL SYLLABLE SSEOLT;Lo;0;L;;;;;N;;;;;
+C376;HANGUL SYLLABLE SSEOLP;Lo;0;L;;;;;N;;;;;
+C377;HANGUL SYLLABLE SSEOLH;Lo;0;L;;;;;N;;;;;
+C378;HANGUL SYLLABLE SSEOM;Lo;0;L;;;;;N;;;;;
+C379;HANGUL SYLLABLE SSEOB;Lo;0;L;;;;;N;;;;;
+C37A;HANGUL SYLLABLE SSEOBS;Lo;0;L;;;;;N;;;;;
+C37B;HANGUL SYLLABLE SSEOS;Lo;0;L;;;;;N;;;;;
+C37C;HANGUL SYLLABLE SSEOSS;Lo;0;L;;;;;N;;;;;
+C37D;HANGUL SYLLABLE SSEONG;Lo;0;L;;;;;N;;;;;
+C37E;HANGUL SYLLABLE SSEOJ;Lo;0;L;;;;;N;;;;;
+C37F;HANGUL SYLLABLE SSEOC;Lo;0;L;;;;;N;;;;;
+C380;HANGUL SYLLABLE SSEOK;Lo;0;L;;;;;N;;;;;
+C381;HANGUL SYLLABLE SSEOT;Lo;0;L;;;;;N;;;;;
+C382;HANGUL SYLLABLE SSEOP;Lo;0;L;;;;;N;;;;;
+C383;HANGUL SYLLABLE SSEOH;Lo;0;L;;;;;N;;;;;
+C384;HANGUL SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+C385;HANGUL SYLLABLE SSEG;Lo;0;L;;;;;N;;;;;
+C386;HANGUL SYLLABLE SSEGG;Lo;0;L;;;;;N;;;;;
+C387;HANGUL SYLLABLE SSEGS;Lo;0;L;;;;;N;;;;;
+C388;HANGUL SYLLABLE SSEN;Lo;0;L;;;;;N;;;;;
+C389;HANGUL SYLLABLE SSENI;Lo;0;L;;;;;N;;;;;
+C38A;HANGUL SYLLABLE SSENH;Lo;0;L;;;;;N;;;;;
+C38B;HANGUL SYLLABLE SSED;Lo;0;L;;;;;N;;;;;
+C38C;HANGUL SYLLABLE SSEL;Lo;0;L;;;;;N;;;;;
+C38D;HANGUL SYLLABLE SSELG;Lo;0;L;;;;;N;;;;;
+C38E;HANGUL SYLLABLE SSELM;Lo;0;L;;;;;N;;;;;
+C38F;HANGUL SYLLABLE SSELB;Lo;0;L;;;;;N;;;;;
+C390;HANGUL SYLLABLE SSELS;Lo;0;L;;;;;N;;;;;
+C391;HANGUL SYLLABLE SSELT;Lo;0;L;;;;;N;;;;;
+C392;HANGUL SYLLABLE SSELP;Lo;0;L;;;;;N;;;;;
+C393;HANGUL SYLLABLE SSELH;Lo;0;L;;;;;N;;;;;
+C394;HANGUL SYLLABLE SSEM;Lo;0;L;;;;;N;;;;;
+C395;HANGUL SYLLABLE SSEB;Lo;0;L;;;;;N;;;;;
+C396;HANGUL SYLLABLE SSEBS;Lo;0;L;;;;;N;;;;;
+C397;HANGUL SYLLABLE SSES;Lo;0;L;;;;;N;;;;;
+C398;HANGUL SYLLABLE SSESS;Lo;0;L;;;;;N;;;;;
+C399;HANGUL SYLLABLE SSENG;Lo;0;L;;;;;N;;;;;
+C39A;HANGUL SYLLABLE SSEJ;Lo;0;L;;;;;N;;;;;
+C39B;HANGUL SYLLABLE SSEC;Lo;0;L;;;;;N;;;;;
+C39C;HANGUL SYLLABLE SSEK;Lo;0;L;;;;;N;;;;;
+C39D;HANGUL SYLLABLE SSET;Lo;0;L;;;;;N;;;;;
+C39E;HANGUL SYLLABLE SSEP;Lo;0;L;;;;;N;;;;;
+C39F;HANGUL SYLLABLE SSEH;Lo;0;L;;;;;N;;;;;
+C3A0;HANGUL SYLLABLE SSYEO;Lo;0;L;;;;;N;;;;;
+C3A1;HANGUL SYLLABLE SSYEOG;Lo;0;L;;;;;N;;;;;
+C3A2;HANGUL SYLLABLE SSYEOGG;Lo;0;L;;;;;N;;;;;
+C3A3;HANGUL SYLLABLE SSYEOGS;Lo;0;L;;;;;N;;;;;
+C3A4;HANGUL SYLLABLE SSYEON;Lo;0;L;;;;;N;;;;;
+C3A5;HANGUL SYLLABLE SSYEONI;Lo;0;L;;;;;N;;;;;
+C3A6;HANGUL SYLLABLE SSYEONH;Lo;0;L;;;;;N;;;;;
+C3A7;HANGUL SYLLABLE SSYEOD;Lo;0;L;;;;;N;;;;;
+C3A8;HANGUL SYLLABLE SSYEOL;Lo;0;L;;;;;N;;;;;
+C3A9;HANGUL SYLLABLE SSYEOLG;Lo;0;L;;;;;N;;;;;
+C3AA;HANGUL SYLLABLE SSYEOLM;Lo;0;L;;;;;N;;;;;
+C3AB;HANGUL SYLLABLE SSYEOLB;Lo;0;L;;;;;N;;;;;
+C3AC;HANGUL SYLLABLE SSYEOLS;Lo;0;L;;;;;N;;;;;
+C3AD;HANGUL SYLLABLE SSYEOLT;Lo;0;L;;;;;N;;;;;
+C3AE;HANGUL SYLLABLE SSYEOLP;Lo;0;L;;;;;N;;;;;
+C3AF;HANGUL SYLLABLE SSYEOLH;Lo;0;L;;;;;N;;;;;
+C3B0;HANGUL SYLLABLE SSYEOM;Lo;0;L;;;;;N;;;;;
+C3B1;HANGUL SYLLABLE SSYEOB;Lo;0;L;;;;;N;;;;;
+C3B2;HANGUL SYLLABLE SSYEOBS;Lo;0;L;;;;;N;;;;;
+C3B3;HANGUL SYLLABLE SSYEOS;Lo;0;L;;;;;N;;;;;
+C3B4;HANGUL SYLLABLE SSYEOSS;Lo;0;L;;;;;N;;;;;
+C3B5;HANGUL SYLLABLE SSYEONG;Lo;0;L;;;;;N;;;;;
+C3B6;HANGUL SYLLABLE SSYEOJ;Lo;0;L;;;;;N;;;;;
+C3B7;HANGUL SYLLABLE SSYEOC;Lo;0;L;;;;;N;;;;;
+C3B8;HANGUL SYLLABLE SSYEOK;Lo;0;L;;;;;N;;;;;
+C3B9;HANGUL SYLLABLE SSYEOT;Lo;0;L;;;;;N;;;;;
+C3BA;HANGUL SYLLABLE SSYEOP;Lo;0;L;;;;;N;;;;;
+C3BB;HANGUL SYLLABLE SSYEOH;Lo;0;L;;;;;N;;;;;
+C3BC;HANGUL SYLLABLE SSYE;Lo;0;L;;;;;N;;;;;
+C3BD;HANGUL SYLLABLE SSYEG;Lo;0;L;;;;;N;;;;;
+C3BE;HANGUL SYLLABLE SSYEGG;Lo;0;L;;;;;N;;;;;
+C3BF;HANGUL SYLLABLE SSYEGS;Lo;0;L;;;;;N;;;;;
+C3C0;HANGUL SYLLABLE SSYEN;Lo;0;L;;;;;N;;;;;
+C3C1;HANGUL SYLLABLE SSYENI;Lo;0;L;;;;;N;;;;;
+C3C2;HANGUL SYLLABLE SSYENH;Lo;0;L;;;;;N;;;;;
+C3C3;HANGUL SYLLABLE SSYED;Lo;0;L;;;;;N;;;;;
+C3C4;HANGUL SYLLABLE SSYEL;Lo;0;L;;;;;N;;;;;
+C3C5;HANGUL SYLLABLE SSYELG;Lo;0;L;;;;;N;;;;;
+C3C6;HANGUL SYLLABLE SSYELM;Lo;0;L;;;;;N;;;;;
+C3C7;HANGUL SYLLABLE SSYELB;Lo;0;L;;;;;N;;;;;
+C3C8;HANGUL SYLLABLE SSYELS;Lo;0;L;;;;;N;;;;;
+C3C9;HANGUL SYLLABLE SSYELT;Lo;0;L;;;;;N;;;;;
+C3CA;HANGUL SYLLABLE SSYELP;Lo;0;L;;;;;N;;;;;
+C3CB;HANGUL SYLLABLE SSYELH;Lo;0;L;;;;;N;;;;;
+C3CC;HANGUL SYLLABLE SSYEM;Lo;0;L;;;;;N;;;;;
+C3CD;HANGUL SYLLABLE SSYEB;Lo;0;L;;;;;N;;;;;
+C3CE;HANGUL SYLLABLE SSYEBS;Lo;0;L;;;;;N;;;;;
+C3CF;HANGUL SYLLABLE SSYES;Lo;0;L;;;;;N;;;;;
+C3D0;HANGUL SYLLABLE SSYESS;Lo;0;L;;;;;N;;;;;
+C3D1;HANGUL SYLLABLE SSYENG;Lo;0;L;;;;;N;;;;;
+C3D2;HANGUL SYLLABLE SSYEJ;Lo;0;L;;;;;N;;;;;
+C3D3;HANGUL SYLLABLE SSYEC;Lo;0;L;;;;;N;;;;;
+C3D4;HANGUL SYLLABLE SSYEK;Lo;0;L;;;;;N;;;;;
+C3D5;HANGUL SYLLABLE SSYET;Lo;0;L;;;;;N;;;;;
+C3D6;HANGUL SYLLABLE SSYEP;Lo;0;L;;;;;N;;;;;
+C3D7;HANGUL SYLLABLE SSYEH;Lo;0;L;;;;;N;;;;;
+C3D8;HANGUL SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+C3D9;HANGUL SYLLABLE SSOG;Lo;0;L;;;;;N;;;;;
+C3DA;HANGUL SYLLABLE SSOGG;Lo;0;L;;;;;N;;;;;
+C3DB;HANGUL SYLLABLE SSOGS;Lo;0;L;;;;;N;;;;;
+C3DC;HANGUL SYLLABLE SSON;Lo;0;L;;;;;N;;;;;
+C3DD;HANGUL SYLLABLE SSONI;Lo;0;L;;;;;N;;;;;
+C3DE;HANGUL SYLLABLE SSONH;Lo;0;L;;;;;N;;;;;
+C3DF;HANGUL SYLLABLE SSOD;Lo;0;L;;;;;N;;;;;
+C3E0;HANGUL SYLLABLE SSOL;Lo;0;L;;;;;N;;;;;
+C3E1;HANGUL SYLLABLE SSOLG;Lo;0;L;;;;;N;;;;;
+C3E2;HANGUL SYLLABLE SSOLM;Lo;0;L;;;;;N;;;;;
+C3E3;HANGUL SYLLABLE SSOLB;Lo;0;L;;;;;N;;;;;
+C3E4;HANGUL SYLLABLE SSOLS;Lo;0;L;;;;;N;;;;;
+C3E5;HANGUL SYLLABLE SSOLT;Lo;0;L;;;;;N;;;;;
+C3E6;HANGUL SYLLABLE SSOLP;Lo;0;L;;;;;N;;;;;
+C3E7;HANGUL SYLLABLE SSOLH;Lo;0;L;;;;;N;;;;;
+C3E8;HANGUL SYLLABLE SSOM;Lo;0;L;;;;;N;;;;;
+C3E9;HANGUL SYLLABLE SSOB;Lo;0;L;;;;;N;;;;;
+C3EA;HANGUL SYLLABLE SSOBS;Lo;0;L;;;;;N;;;;;
+C3EB;HANGUL SYLLABLE SSOS;Lo;0;L;;;;;N;;;;;
+C3EC;HANGUL SYLLABLE SSOSS;Lo;0;L;;;;;N;;;;;
+C3ED;HANGUL SYLLABLE SSONG;Lo;0;L;;;;;N;;;;;
+C3EE;HANGUL SYLLABLE SSOJ;Lo;0;L;;;;;N;;;;;
+C3EF;HANGUL SYLLABLE SSOC;Lo;0;L;;;;;N;;;;;
+C3F0;HANGUL SYLLABLE SSOK;Lo;0;L;;;;;N;;;;;
+C3F1;HANGUL SYLLABLE SSOT;Lo;0;L;;;;;N;;;;;
+C3F2;HANGUL SYLLABLE SSOP;Lo;0;L;;;;;N;;;;;
+C3F3;HANGUL SYLLABLE SSOH;Lo;0;L;;;;;N;;;;;
+C3F4;HANGUL SYLLABLE SSWA;Lo;0;L;;;;;N;;;;;
+C3F5;HANGUL SYLLABLE SSWAG;Lo;0;L;;;;;N;;;;;
+C3F6;HANGUL SYLLABLE SSWAGG;Lo;0;L;;;;;N;;;;;
+C3F7;HANGUL SYLLABLE SSWAGS;Lo;0;L;;;;;N;;;;;
+C3F8;HANGUL SYLLABLE SSWAN;Lo;0;L;;;;;N;;;;;
+C3F9;HANGUL SYLLABLE SSWANI;Lo;0;L;;;;;N;;;;;
+C3FA;HANGUL SYLLABLE SSWANH;Lo;0;L;;;;;N;;;;;
+C3FB;HANGUL SYLLABLE SSWAD;Lo;0;L;;;;;N;;;;;
+C3FC;HANGUL SYLLABLE SSWAL;Lo;0;L;;;;;N;;;;;
+C3FD;HANGUL SYLLABLE SSWALG;Lo;0;L;;;;;N;;;;;
+C3FE;HANGUL SYLLABLE SSWALM;Lo;0;L;;;;;N;;;;;
+C3FF;HANGUL SYLLABLE SSWALB;Lo;0;L;;;;;N;;;;;
+C400;HANGUL SYLLABLE SSWALS;Lo;0;L;;;;;N;;;;;
+C401;HANGUL SYLLABLE SSWALT;Lo;0;L;;;;;N;;;;;
+C402;HANGUL SYLLABLE SSWALP;Lo;0;L;;;;;N;;;;;
+C403;HANGUL SYLLABLE SSWALH;Lo;0;L;;;;;N;;;;;
+C404;HANGUL SYLLABLE SSWAM;Lo;0;L;;;;;N;;;;;
+C405;HANGUL SYLLABLE SSWAB;Lo;0;L;;;;;N;;;;;
+C406;HANGUL SYLLABLE SSWABS;Lo;0;L;;;;;N;;;;;
+C407;HANGUL SYLLABLE SSWAS;Lo;0;L;;;;;N;;;;;
+C408;HANGUL SYLLABLE SSWASS;Lo;0;L;;;;;N;;;;;
+C409;HANGUL SYLLABLE SSWANG;Lo;0;L;;;;;N;;;;;
+C40A;HANGUL SYLLABLE SSWAJ;Lo;0;L;;;;;N;;;;;
+C40B;HANGUL SYLLABLE SSWAC;Lo;0;L;;;;;N;;;;;
+C40C;HANGUL SYLLABLE SSWAK;Lo;0;L;;;;;N;;;;;
+C40D;HANGUL SYLLABLE SSWAT;Lo;0;L;;;;;N;;;;;
+C40E;HANGUL SYLLABLE SSWAP;Lo;0;L;;;;;N;;;;;
+C40F;HANGUL SYLLABLE SSWAH;Lo;0;L;;;;;N;;;;;
+C410;HANGUL SYLLABLE SSWAE;Lo;0;L;;;;;N;;;;;
+C411;HANGUL SYLLABLE SSWAEG;Lo;0;L;;;;;N;;;;;
+C412;HANGUL SYLLABLE SSWAEGG;Lo;0;L;;;;;N;;;;;
+C413;HANGUL SYLLABLE SSWAEGS;Lo;0;L;;;;;N;;;;;
+C414;HANGUL SYLLABLE SSWAEN;Lo;0;L;;;;;N;;;;;
+C415;HANGUL SYLLABLE SSWAENI;Lo;0;L;;;;;N;;;;;
+C416;HANGUL SYLLABLE SSWAENH;Lo;0;L;;;;;N;;;;;
+C417;HANGUL SYLLABLE SSWAED;Lo;0;L;;;;;N;;;;;
+C418;HANGUL SYLLABLE SSWAEL;Lo;0;L;;;;;N;;;;;
+C419;HANGUL SYLLABLE SSWAELG;Lo;0;L;;;;;N;;;;;
+C41A;HANGUL SYLLABLE SSWAELM;Lo;0;L;;;;;N;;;;;
+C41B;HANGUL SYLLABLE SSWAELB;Lo;0;L;;;;;N;;;;;
+C41C;HANGUL SYLLABLE SSWAELS;Lo;0;L;;;;;N;;;;;
+C41D;HANGUL SYLLABLE SSWAELT;Lo;0;L;;;;;N;;;;;
+C41E;HANGUL SYLLABLE SSWAELP;Lo;0;L;;;;;N;;;;;
+C41F;HANGUL SYLLABLE SSWAELH;Lo;0;L;;;;;N;;;;;
+C420;HANGUL SYLLABLE SSWAEM;Lo;0;L;;;;;N;;;;;
+C421;HANGUL SYLLABLE SSWAEB;Lo;0;L;;;;;N;;;;;
+C422;HANGUL SYLLABLE SSWAEBS;Lo;0;L;;;;;N;;;;;
+C423;HANGUL SYLLABLE SSWAES;Lo;0;L;;;;;N;;;;;
+C424;HANGUL SYLLABLE SSWAESS;Lo;0;L;;;;;N;;;;;
+C425;HANGUL SYLLABLE SSWAENG;Lo;0;L;;;;;N;;;;;
+C426;HANGUL SYLLABLE SSWAEJ;Lo;0;L;;;;;N;;;;;
+C427;HANGUL SYLLABLE SSWAEC;Lo;0;L;;;;;N;;;;;
+C428;HANGUL SYLLABLE SSWAEK;Lo;0;L;;;;;N;;;;;
+C429;HANGUL SYLLABLE SSWAET;Lo;0;L;;;;;N;;;;;
+C42A;HANGUL SYLLABLE SSWAEP;Lo;0;L;;;;;N;;;;;
+C42B;HANGUL SYLLABLE SSWAEH;Lo;0;L;;;;;N;;;;;
+C42C;HANGUL SYLLABLE SSOE;Lo;0;L;;;;;N;;;;;
+C42D;HANGUL SYLLABLE SSOEG;Lo;0;L;;;;;N;;;;;
+C42E;HANGUL SYLLABLE SSOEGG;Lo;0;L;;;;;N;;;;;
+C42F;HANGUL SYLLABLE SSOEGS;Lo;0;L;;;;;N;;;;;
+C430;HANGUL SYLLABLE SSOEN;Lo;0;L;;;;;N;;;;;
+C431;HANGUL SYLLABLE SSOENI;Lo;0;L;;;;;N;;;;;
+C432;HANGUL SYLLABLE SSOENH;Lo;0;L;;;;;N;;;;;
+C433;HANGUL SYLLABLE SSOED;Lo;0;L;;;;;N;;;;;
+C434;HANGUL SYLLABLE SSOEL;Lo;0;L;;;;;N;;;;;
+C435;HANGUL SYLLABLE SSOELG;Lo;0;L;;;;;N;;;;;
+C436;HANGUL SYLLABLE SSOELM;Lo;0;L;;;;;N;;;;;
+C437;HANGUL SYLLABLE SSOELB;Lo;0;L;;;;;N;;;;;
+C438;HANGUL SYLLABLE SSOELS;Lo;0;L;;;;;N;;;;;
+C439;HANGUL SYLLABLE SSOELT;Lo;0;L;;;;;N;;;;;
+C43A;HANGUL SYLLABLE SSOELP;Lo;0;L;;;;;N;;;;;
+C43B;HANGUL SYLLABLE SSOELH;Lo;0;L;;;;;N;;;;;
+C43C;HANGUL SYLLABLE SSOEM;Lo;0;L;;;;;N;;;;;
+C43D;HANGUL SYLLABLE SSOEB;Lo;0;L;;;;;N;;;;;
+C43E;HANGUL SYLLABLE SSOEBS;Lo;0;L;;;;;N;;;;;
+C43F;HANGUL SYLLABLE SSOES;Lo;0;L;;;;;N;;;;;
+C440;HANGUL SYLLABLE SSOESS;Lo;0;L;;;;;N;;;;;
+C441;HANGUL SYLLABLE SSOENG;Lo;0;L;;;;;N;;;;;
+C442;HANGUL SYLLABLE SSOEJ;Lo;0;L;;;;;N;;;;;
+C443;HANGUL SYLLABLE SSOEC;Lo;0;L;;;;;N;;;;;
+C444;HANGUL SYLLABLE SSOEK;Lo;0;L;;;;;N;;;;;
+C445;HANGUL SYLLABLE SSOET;Lo;0;L;;;;;N;;;;;
+C446;HANGUL SYLLABLE SSOEP;Lo;0;L;;;;;N;;;;;
+C447;HANGUL SYLLABLE SSOEH;Lo;0;L;;;;;N;;;;;
+C448;HANGUL SYLLABLE SSYO;Lo;0;L;;;;;N;;;;;
+C449;HANGUL SYLLABLE SSYOG;Lo;0;L;;;;;N;;;;;
+C44A;HANGUL SYLLABLE SSYOGG;Lo;0;L;;;;;N;;;;;
+C44B;HANGUL SYLLABLE SSYOGS;Lo;0;L;;;;;N;;;;;
+C44C;HANGUL SYLLABLE SSYON;Lo;0;L;;;;;N;;;;;
+C44D;HANGUL SYLLABLE SSYONI;Lo;0;L;;;;;N;;;;;
+C44E;HANGUL SYLLABLE SSYONH;Lo;0;L;;;;;N;;;;;
+C44F;HANGUL SYLLABLE SSYOD;Lo;0;L;;;;;N;;;;;
+C450;HANGUL SYLLABLE SSYOL;Lo;0;L;;;;;N;;;;;
+C451;HANGUL SYLLABLE SSYOLG;Lo;0;L;;;;;N;;;;;
+C452;HANGUL SYLLABLE SSYOLM;Lo;0;L;;;;;N;;;;;
+C453;HANGUL SYLLABLE SSYOLB;Lo;0;L;;;;;N;;;;;
+C454;HANGUL SYLLABLE SSYOLS;Lo;0;L;;;;;N;;;;;
+C455;HANGUL SYLLABLE SSYOLT;Lo;0;L;;;;;N;;;;;
+C456;HANGUL SYLLABLE SSYOLP;Lo;0;L;;;;;N;;;;;
+C457;HANGUL SYLLABLE SSYOLH;Lo;0;L;;;;;N;;;;;
+C458;HANGUL SYLLABLE SSYOM;Lo;0;L;;;;;N;;;;;
+C459;HANGUL SYLLABLE SSYOB;Lo;0;L;;;;;N;;;;;
+C45A;HANGUL SYLLABLE SSYOBS;Lo;0;L;;;;;N;;;;;
+C45B;HANGUL SYLLABLE SSYOS;Lo;0;L;;;;;N;;;;;
+C45C;HANGUL SYLLABLE SSYOSS;Lo;0;L;;;;;N;;;;;
+C45D;HANGUL SYLLABLE SSYONG;Lo;0;L;;;;;N;;;;;
+C45E;HANGUL SYLLABLE SSYOJ;Lo;0;L;;;;;N;;;;;
+C45F;HANGUL SYLLABLE SSYOC;Lo;0;L;;;;;N;;;;;
+C460;HANGUL SYLLABLE SSYOK;Lo;0;L;;;;;N;;;;;
+C461;HANGUL SYLLABLE SSYOT;Lo;0;L;;;;;N;;;;;
+C462;HANGUL SYLLABLE SSYOP;Lo;0;L;;;;;N;;;;;
+C463;HANGUL SYLLABLE SSYOH;Lo;0;L;;;;;N;;;;;
+C464;HANGUL SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+C465;HANGUL SYLLABLE SSUG;Lo;0;L;;;;;N;;;;;
+C466;HANGUL SYLLABLE SSUGG;Lo;0;L;;;;;N;;;;;
+C467;HANGUL SYLLABLE SSUGS;Lo;0;L;;;;;N;;;;;
+C468;HANGUL SYLLABLE SSUN;Lo;0;L;;;;;N;;;;;
+C469;HANGUL SYLLABLE SSUNI;Lo;0;L;;;;;N;;;;;
+C46A;HANGUL SYLLABLE SSUNH;Lo;0;L;;;;;N;;;;;
+C46B;HANGUL SYLLABLE SSUD;Lo;0;L;;;;;N;;;;;
+C46C;HANGUL SYLLABLE SSUL;Lo;0;L;;;;;N;;;;;
+C46D;HANGUL SYLLABLE SSULG;Lo;0;L;;;;;N;;;;;
+C46E;HANGUL SYLLABLE SSULM;Lo;0;L;;;;;N;;;;;
+C46F;HANGUL SYLLABLE SSULB;Lo;0;L;;;;;N;;;;;
+C470;HANGUL SYLLABLE SSULS;Lo;0;L;;;;;N;;;;;
+C471;HANGUL SYLLABLE SSULT;Lo;0;L;;;;;N;;;;;
+C472;HANGUL SYLLABLE SSULP;Lo;0;L;;;;;N;;;;;
+C473;HANGUL SYLLABLE SSULH;Lo;0;L;;;;;N;;;;;
+C474;HANGUL SYLLABLE SSUM;Lo;0;L;;;;;N;;;;;
+C475;HANGUL SYLLABLE SSUB;Lo;0;L;;;;;N;;;;;
+C476;HANGUL SYLLABLE SSUBS;Lo;0;L;;;;;N;;;;;
+C477;HANGUL SYLLABLE SSUS;Lo;0;L;;;;;N;;;;;
+C478;HANGUL SYLLABLE SSUSS;Lo;0;L;;;;;N;;;;;
+C479;HANGUL SYLLABLE SSUNG;Lo;0;L;;;;;N;;;;;
+C47A;HANGUL SYLLABLE SSUJ;Lo;0;L;;;;;N;;;;;
+C47B;HANGUL SYLLABLE SSUC;Lo;0;L;;;;;N;;;;;
+C47C;HANGUL SYLLABLE SSUK;Lo;0;L;;;;;N;;;;;
+C47D;HANGUL SYLLABLE SSUT;Lo;0;L;;;;;N;;;;;
+C47E;HANGUL SYLLABLE SSUP;Lo;0;L;;;;;N;;;;;
+C47F;HANGUL SYLLABLE SSUH;Lo;0;L;;;;;N;;;;;
+C480;HANGUL SYLLABLE SSWEO;Lo;0;L;;;;;N;;;;;
+C481;HANGUL SYLLABLE SSWEOG;Lo;0;L;;;;;N;;;;;
+C482;HANGUL SYLLABLE SSWEOGG;Lo;0;L;;;;;N;;;;;
+C483;HANGUL SYLLABLE SSWEOGS;Lo;0;L;;;;;N;;;;;
+C484;HANGUL SYLLABLE SSWEON;Lo;0;L;;;;;N;;;;;
+C485;HANGUL SYLLABLE SSWEONI;Lo;0;L;;;;;N;;;;;
+C486;HANGUL SYLLABLE SSWEONH;Lo;0;L;;;;;N;;;;;
+C487;HANGUL SYLLABLE SSWEOD;Lo;0;L;;;;;N;;;;;
+C488;HANGUL SYLLABLE SSWEOL;Lo;0;L;;;;;N;;;;;
+C489;HANGUL SYLLABLE SSWEOLG;Lo;0;L;;;;;N;;;;;
+C48A;HANGUL SYLLABLE SSWEOLM;Lo;0;L;;;;;N;;;;;
+C48B;HANGUL SYLLABLE SSWEOLB;Lo;0;L;;;;;N;;;;;
+C48C;HANGUL SYLLABLE SSWEOLS;Lo;0;L;;;;;N;;;;;
+C48D;HANGUL SYLLABLE SSWEOLT;Lo;0;L;;;;;N;;;;;
+C48E;HANGUL SYLLABLE SSWEOLP;Lo;0;L;;;;;N;;;;;
+C48F;HANGUL SYLLABLE SSWEOLH;Lo;0;L;;;;;N;;;;;
+C490;HANGUL SYLLABLE SSWEOM;Lo;0;L;;;;;N;;;;;
+C491;HANGUL SYLLABLE SSWEOB;Lo;0;L;;;;;N;;;;;
+C492;HANGUL SYLLABLE SSWEOBS;Lo;0;L;;;;;N;;;;;
+C493;HANGUL SYLLABLE SSWEOS;Lo;0;L;;;;;N;;;;;
+C494;HANGUL SYLLABLE SSWEOSS;Lo;0;L;;;;;N;;;;;
+C495;HANGUL SYLLABLE SSWEONG;Lo;0;L;;;;;N;;;;;
+C496;HANGUL SYLLABLE SSWEOJ;Lo;0;L;;;;;N;;;;;
+C497;HANGUL SYLLABLE SSWEOC;Lo;0;L;;;;;N;;;;;
+C498;HANGUL SYLLABLE SSWEOK;Lo;0;L;;;;;N;;;;;
+C499;HANGUL SYLLABLE SSWEOT;Lo;0;L;;;;;N;;;;;
+C49A;HANGUL SYLLABLE SSWEOP;Lo;0;L;;;;;N;;;;;
+C49B;HANGUL SYLLABLE SSWEOH;Lo;0;L;;;;;N;;;;;
+C49C;HANGUL SYLLABLE SSWE;Lo;0;L;;;;;N;;;;;
+C49D;HANGUL SYLLABLE SSWEG;Lo;0;L;;;;;N;;;;;
+C49E;HANGUL SYLLABLE SSWEGG;Lo;0;L;;;;;N;;;;;
+C49F;HANGUL SYLLABLE SSWEGS;Lo;0;L;;;;;N;;;;;
+C4A0;HANGUL SYLLABLE SSWEN;Lo;0;L;;;;;N;;;;;
+C4A1;HANGUL SYLLABLE SSWENI;Lo;0;L;;;;;N;;;;;
+C4A2;HANGUL SYLLABLE SSWENH;Lo;0;L;;;;;N;;;;;
+C4A3;HANGUL SYLLABLE SSWED;Lo;0;L;;;;;N;;;;;
+C4A4;HANGUL SYLLABLE SSWEL;Lo;0;L;;;;;N;;;;;
+C4A5;HANGUL SYLLABLE SSWELG;Lo;0;L;;;;;N;;;;;
+C4A6;HANGUL SYLLABLE SSWELM;Lo;0;L;;;;;N;;;;;
+C4A7;HANGUL SYLLABLE SSWELB;Lo;0;L;;;;;N;;;;;
+C4A8;HANGUL SYLLABLE SSWELS;Lo;0;L;;;;;N;;;;;
+C4A9;HANGUL SYLLABLE SSWELT;Lo;0;L;;;;;N;;;;;
+C4AA;HANGUL SYLLABLE SSWELP;Lo;0;L;;;;;N;;;;;
+C4AB;HANGUL SYLLABLE SSWELH;Lo;0;L;;;;;N;;;;;
+C4AC;HANGUL SYLLABLE SSWEM;Lo;0;L;;;;;N;;;;;
+C4AD;HANGUL SYLLABLE SSWEB;Lo;0;L;;;;;N;;;;;
+C4AE;HANGUL SYLLABLE SSWEBS;Lo;0;L;;;;;N;;;;;
+C4AF;HANGUL SYLLABLE SSWES;Lo;0;L;;;;;N;;;;;
+C4B0;HANGUL SYLLABLE SSWESS;Lo;0;L;;;;;N;;;;;
+C4B1;HANGUL SYLLABLE SSWENG;Lo;0;L;;;;;N;;;;;
+C4B2;HANGUL SYLLABLE SSWEJ;Lo;0;L;;;;;N;;;;;
+C4B3;HANGUL SYLLABLE SSWEC;Lo;0;L;;;;;N;;;;;
+C4B4;HANGUL SYLLABLE SSWEK;Lo;0;L;;;;;N;;;;;
+C4B5;HANGUL SYLLABLE SSWET;Lo;0;L;;;;;N;;;;;
+C4B6;HANGUL SYLLABLE SSWEP;Lo;0;L;;;;;N;;;;;
+C4B7;HANGUL SYLLABLE SSWEH;Lo;0;L;;;;;N;;;;;
+C4B8;HANGUL SYLLABLE SSWI;Lo;0;L;;;;;N;;;;;
+C4B9;HANGUL SYLLABLE SSWIG;Lo;0;L;;;;;N;;;;;
+C4BA;HANGUL SYLLABLE SSWIGG;Lo;0;L;;;;;N;;;;;
+C4BB;HANGUL SYLLABLE SSWIGS;Lo;0;L;;;;;N;;;;;
+C4BC;HANGUL SYLLABLE SSWIN;Lo;0;L;;;;;N;;;;;
+C4BD;HANGUL SYLLABLE SSWINI;Lo;0;L;;;;;N;;;;;
+C4BE;HANGUL SYLLABLE SSWINH;Lo;0;L;;;;;N;;;;;
+C4BF;HANGUL SYLLABLE SSWID;Lo;0;L;;;;;N;;;;;
+C4C0;HANGUL SYLLABLE SSWIL;Lo;0;L;;;;;N;;;;;
+C4C1;HANGUL SYLLABLE SSWILG;Lo;0;L;;;;;N;;;;;
+C4C2;HANGUL SYLLABLE SSWILM;Lo;0;L;;;;;N;;;;;
+C4C3;HANGUL SYLLABLE SSWILB;Lo;0;L;;;;;N;;;;;
+C4C4;HANGUL SYLLABLE SSWILS;Lo;0;L;;;;;N;;;;;
+C4C5;HANGUL SYLLABLE SSWILT;Lo;0;L;;;;;N;;;;;
+C4C6;HANGUL SYLLABLE SSWILP;Lo;0;L;;;;;N;;;;;
+C4C7;HANGUL SYLLABLE SSWILH;Lo;0;L;;;;;N;;;;;
+C4C8;HANGUL SYLLABLE SSWIM;Lo;0;L;;;;;N;;;;;
+C4C9;HANGUL SYLLABLE SSWIB;Lo;0;L;;;;;N;;;;;
+C4CA;HANGUL SYLLABLE SSWIBS;Lo;0;L;;;;;N;;;;;
+C4CB;HANGUL SYLLABLE SSWIS;Lo;0;L;;;;;N;;;;;
+C4CC;HANGUL SYLLABLE SSWISS;Lo;0;L;;;;;N;;;;;
+C4CD;HANGUL SYLLABLE SSWING;Lo;0;L;;;;;N;;;;;
+C4CE;HANGUL SYLLABLE SSWIJ;Lo;0;L;;;;;N;;;;;
+C4CF;HANGUL SYLLABLE SSWIC;Lo;0;L;;;;;N;;;;;
+C4D0;HANGUL SYLLABLE SSWIK;Lo;0;L;;;;;N;;;;;
+C4D1;HANGUL SYLLABLE SSWIT;Lo;0;L;;;;;N;;;;;
+C4D2;HANGUL SYLLABLE SSWIP;Lo;0;L;;;;;N;;;;;
+C4D3;HANGUL SYLLABLE SSWIH;Lo;0;L;;;;;N;;;;;
+C4D4;HANGUL SYLLABLE SSYU;Lo;0;L;;;;;N;;;;;
+C4D5;HANGUL SYLLABLE SSYUG;Lo;0;L;;;;;N;;;;;
+C4D6;HANGUL SYLLABLE SSYUGG;Lo;0;L;;;;;N;;;;;
+C4D7;HANGUL SYLLABLE SSYUGS;Lo;0;L;;;;;N;;;;;
+C4D8;HANGUL SYLLABLE SSYUN;Lo;0;L;;;;;N;;;;;
+C4D9;HANGUL SYLLABLE SSYUNI;Lo;0;L;;;;;N;;;;;
+C4DA;HANGUL SYLLABLE SSYUNH;Lo;0;L;;;;;N;;;;;
+C4DB;HANGUL SYLLABLE SSYUD;Lo;0;L;;;;;N;;;;;
+C4DC;HANGUL SYLLABLE SSYUL;Lo;0;L;;;;;N;;;;;
+C4DD;HANGUL SYLLABLE SSYULG;Lo;0;L;;;;;N;;;;;
+C4DE;HANGUL SYLLABLE SSYULM;Lo;0;L;;;;;N;;;;;
+C4DF;HANGUL SYLLABLE SSYULB;Lo;0;L;;;;;N;;;;;
+C4E0;HANGUL SYLLABLE SSYULS;Lo;0;L;;;;;N;;;;;
+C4E1;HANGUL SYLLABLE SSYULT;Lo;0;L;;;;;N;;;;;
+C4E2;HANGUL SYLLABLE SSYULP;Lo;0;L;;;;;N;;;;;
+C4E3;HANGUL SYLLABLE SSYULH;Lo;0;L;;;;;N;;;;;
+C4E4;HANGUL SYLLABLE SSYUM;Lo;0;L;;;;;N;;;;;
+C4E5;HANGUL SYLLABLE SSYUB;Lo;0;L;;;;;N;;;;;
+C4E6;HANGUL SYLLABLE SSYUBS;Lo;0;L;;;;;N;;;;;
+C4E7;HANGUL SYLLABLE SSYUS;Lo;0;L;;;;;N;;;;;
+C4E8;HANGUL SYLLABLE SSYUSS;Lo;0;L;;;;;N;;;;;
+C4E9;HANGUL SYLLABLE SSYUNG;Lo;0;L;;;;;N;;;;;
+C4EA;HANGUL SYLLABLE SSYUJ;Lo;0;L;;;;;N;;;;;
+C4EB;HANGUL SYLLABLE SSYUC;Lo;0;L;;;;;N;;;;;
+C4EC;HANGUL SYLLABLE SSYUK;Lo;0;L;;;;;N;;;;;
+C4ED;HANGUL SYLLABLE SSYUT;Lo;0;L;;;;;N;;;;;
+C4EE;HANGUL SYLLABLE SSYUP;Lo;0;L;;;;;N;;;;;
+C4EF;HANGUL SYLLABLE SSYUH;Lo;0;L;;;;;N;;;;;
+C4F0;HANGUL SYLLABLE SSEU;Lo;0;L;;;;;N;;;;;
+C4F1;HANGUL SYLLABLE SSEUG;Lo;0;L;;;;;N;;;;;
+C4F2;HANGUL SYLLABLE SSEUGG;Lo;0;L;;;;;N;;;;;
+C4F3;HANGUL SYLLABLE SSEUGS;Lo;0;L;;;;;N;;;;;
+C4F4;HANGUL SYLLABLE SSEUN;Lo;0;L;;;;;N;;;;;
+C4F5;HANGUL SYLLABLE SSEUNI;Lo;0;L;;;;;N;;;;;
+C4F6;HANGUL SYLLABLE SSEUNH;Lo;0;L;;;;;N;;;;;
+C4F7;HANGUL SYLLABLE SSEUD;Lo;0;L;;;;;N;;;;;
+C4F8;HANGUL SYLLABLE SSEUL;Lo;0;L;;;;;N;;;;;
+C4F9;HANGUL SYLLABLE SSEULG;Lo;0;L;;;;;N;;;;;
+C4FA;HANGUL SYLLABLE SSEULM;Lo;0;L;;;;;N;;;;;
+C4FB;HANGUL SYLLABLE SSEULB;Lo;0;L;;;;;N;;;;;
+C4FC;HANGUL SYLLABLE SSEULS;Lo;0;L;;;;;N;;;;;
+C4FD;HANGUL SYLLABLE SSEULT;Lo;0;L;;;;;N;;;;;
+C4FE;HANGUL SYLLABLE SSEULP;Lo;0;L;;;;;N;;;;;
+C4FF;HANGUL SYLLABLE SSEULH;Lo;0;L;;;;;N;;;;;
+C500;HANGUL SYLLABLE SSEUM;Lo;0;L;;;;;N;;;;;
+C501;HANGUL SYLLABLE SSEUB;Lo;0;L;;;;;N;;;;;
+C502;HANGUL SYLLABLE SSEUBS;Lo;0;L;;;;;N;;;;;
+C503;HANGUL SYLLABLE SSEUS;Lo;0;L;;;;;N;;;;;
+C504;HANGUL SYLLABLE SSEUSS;Lo;0;L;;;;;N;;;;;
+C505;HANGUL SYLLABLE SSEUNG;Lo;0;L;;;;;N;;;;;
+C506;HANGUL SYLLABLE SSEUJ;Lo;0;L;;;;;N;;;;;
+C507;HANGUL SYLLABLE SSEUC;Lo;0;L;;;;;N;;;;;
+C508;HANGUL SYLLABLE SSEUK;Lo;0;L;;;;;N;;;;;
+C509;HANGUL SYLLABLE SSEUT;Lo;0;L;;;;;N;;;;;
+C50A;HANGUL SYLLABLE SSEUP;Lo;0;L;;;;;N;;;;;
+C50B;HANGUL SYLLABLE SSEUH;Lo;0;L;;;;;N;;;;;
+C50C;HANGUL SYLLABLE SSYI;Lo;0;L;;;;;N;;;;;
+C50D;HANGUL SYLLABLE SSYIG;Lo;0;L;;;;;N;;;;;
+C50E;HANGUL SYLLABLE SSYIGG;Lo;0;L;;;;;N;;;;;
+C50F;HANGUL SYLLABLE SSYIGS;Lo;0;L;;;;;N;;;;;
+C510;HANGUL SYLLABLE SSYIN;Lo;0;L;;;;;N;;;;;
+C511;HANGUL SYLLABLE SSYINI;Lo;0;L;;;;;N;;;;;
+C512;HANGUL SYLLABLE SSYINH;Lo;0;L;;;;;N;;;;;
+C513;HANGUL SYLLABLE SSYID;Lo;0;L;;;;;N;;;;;
+C514;HANGUL SYLLABLE SSYIL;Lo;0;L;;;;;N;;;;;
+C515;HANGUL SYLLABLE SSYILG;Lo;0;L;;;;;N;;;;;
+C516;HANGUL SYLLABLE SSYILM;Lo;0;L;;;;;N;;;;;
+C517;HANGUL SYLLABLE SSYILB;Lo;0;L;;;;;N;;;;;
+C518;HANGUL SYLLABLE SSYILS;Lo;0;L;;;;;N;;;;;
+C519;HANGUL SYLLABLE SSYILT;Lo;0;L;;;;;N;;;;;
+C51A;HANGUL SYLLABLE SSYILP;Lo;0;L;;;;;N;;;;;
+C51B;HANGUL SYLLABLE SSYILH;Lo;0;L;;;;;N;;;;;
+C51C;HANGUL SYLLABLE SSYIM;Lo;0;L;;;;;N;;;;;
+C51D;HANGUL SYLLABLE SSYIB;Lo;0;L;;;;;N;;;;;
+C51E;HANGUL SYLLABLE SSYIBS;Lo;0;L;;;;;N;;;;;
+C51F;HANGUL SYLLABLE SSYIS;Lo;0;L;;;;;N;;;;;
+C520;HANGUL SYLLABLE SSYISS;Lo;0;L;;;;;N;;;;;
+C521;HANGUL SYLLABLE SSYING;Lo;0;L;;;;;N;;;;;
+C522;HANGUL SYLLABLE SSYIJ;Lo;0;L;;;;;N;;;;;
+C523;HANGUL SYLLABLE SSYIC;Lo;0;L;;;;;N;;;;;
+C524;HANGUL SYLLABLE SSYIK;Lo;0;L;;;;;N;;;;;
+C525;HANGUL SYLLABLE SSYIT;Lo;0;L;;;;;N;;;;;
+C526;HANGUL SYLLABLE SSYIP;Lo;0;L;;;;;N;;;;;
+C527;HANGUL SYLLABLE SSYIH;Lo;0;L;;;;;N;;;;;
+C528;HANGUL SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+C529;HANGUL SYLLABLE SSIG;Lo;0;L;;;;;N;;;;;
+C52A;HANGUL SYLLABLE SSIGG;Lo;0;L;;;;;N;;;;;
+C52B;HANGUL SYLLABLE SSIGS;Lo;0;L;;;;;N;;;;;
+C52C;HANGUL SYLLABLE SSIN;Lo;0;L;;;;;N;;;;;
+C52D;HANGUL SYLLABLE SSINI;Lo;0;L;;;;;N;;;;;
+C52E;HANGUL SYLLABLE SSINH;Lo;0;L;;;;;N;;;;;
+C52F;HANGUL SYLLABLE SSID;Lo;0;L;;;;;N;;;;;
+C530;HANGUL SYLLABLE SSIL;Lo;0;L;;;;;N;;;;;
+C531;HANGUL SYLLABLE SSILG;Lo;0;L;;;;;N;;;;;
+C532;HANGUL SYLLABLE SSILM;Lo;0;L;;;;;N;;;;;
+C533;HANGUL SYLLABLE SSILB;Lo;0;L;;;;;N;;;;;
+C534;HANGUL SYLLABLE SSILS;Lo;0;L;;;;;N;;;;;
+C535;HANGUL SYLLABLE SSILT;Lo;0;L;;;;;N;;;;;
+C536;HANGUL SYLLABLE SSILP;Lo;0;L;;;;;N;;;;;
+C537;HANGUL SYLLABLE SSILH;Lo;0;L;;;;;N;;;;;
+C538;HANGUL SYLLABLE SSIM;Lo;0;L;;;;;N;;;;;
+C539;HANGUL SYLLABLE SSIB;Lo;0;L;;;;;N;;;;;
+C53A;HANGUL SYLLABLE SSIBS;Lo;0;L;;;;;N;;;;;
+C53B;HANGUL SYLLABLE SSIS;Lo;0;L;;;;;N;;;;;
+C53C;HANGUL SYLLABLE SSISS;Lo;0;L;;;;;N;;;;;
+C53D;HANGUL SYLLABLE SSING;Lo;0;L;;;;;N;;;;;
+C53E;HANGUL SYLLABLE SSIJ;Lo;0;L;;;;;N;;;;;
+C53F;HANGUL SYLLABLE SSIC;Lo;0;L;;;;;N;;;;;
+C540;HANGUL SYLLABLE SSIK;Lo;0;L;;;;;N;;;;;
+C541;HANGUL SYLLABLE SSIT;Lo;0;L;;;;;N;;;;;
+C542;HANGUL SYLLABLE SSIP;Lo;0;L;;;;;N;;;;;
+C543;HANGUL SYLLABLE SSIH;Lo;0;L;;;;;N;;;;;
+C544;HANGUL SYLLABLE A;Lo;0;L;;;;;N;;;;;
+C545;HANGUL SYLLABLE AG;Lo;0;L;;;;;N;;;;;
+C546;HANGUL SYLLABLE AGG;Lo;0;L;;;;;N;;;;;
+C547;HANGUL SYLLABLE AGS;Lo;0;L;;;;;N;;;;;
+C548;HANGUL SYLLABLE AN;Lo;0;L;;;;;N;;;;;
+C549;HANGUL SYLLABLE ANI;Lo;0;L;;;;;N;;;;;
+C54A;HANGUL SYLLABLE ANH;Lo;0;L;;;;;N;;;;;
+C54B;HANGUL SYLLABLE AD;Lo;0;L;;;;;N;;;;;
+C54C;HANGUL SYLLABLE AL;Lo;0;L;;;;;N;;;;;
+C54D;HANGUL SYLLABLE ALG;Lo;0;L;;;;;N;;;;;
+C54E;HANGUL SYLLABLE ALM;Lo;0;L;;;;;N;;;;;
+C54F;HANGUL SYLLABLE ALB;Lo;0;L;;;;;N;;;;;
+C550;HANGUL SYLLABLE ALS;Lo;0;L;;;;;N;;;;;
+C551;HANGUL SYLLABLE ALT;Lo;0;L;;;;;N;;;;;
+C552;HANGUL SYLLABLE ALP;Lo;0;L;;;;;N;;;;;
+C553;HANGUL SYLLABLE ALH;Lo;0;L;;;;;N;;;;;
+C554;HANGUL SYLLABLE AM;Lo;0;L;;;;;N;;;;;
+C555;HANGUL SYLLABLE AB;Lo;0;L;;;;;N;;;;;
+C556;HANGUL SYLLABLE ABS;Lo;0;L;;;;;N;;;;;
+C557;HANGUL SYLLABLE AS;Lo;0;L;;;;;N;;;;;
+C558;HANGUL SYLLABLE ASS;Lo;0;L;;;;;N;;;;;
+C559;HANGUL SYLLABLE ANG;Lo;0;L;;;;;N;;;;;
+C55A;HANGUL SYLLABLE AJ;Lo;0;L;;;;;N;;;;;
+C55B;HANGUL SYLLABLE AC;Lo;0;L;;;;;N;;;;;
+C55C;HANGUL SYLLABLE AK;Lo;0;L;;;;;N;;;;;
+C55D;HANGUL SYLLABLE AT;Lo;0;L;;;;;N;;;;;
+C55E;HANGUL SYLLABLE AP;Lo;0;L;;;;;N;;;;;
+C55F;HANGUL SYLLABLE AH;Lo;0;L;;;;;N;;;;;
+C560;HANGUL SYLLABLE AE;Lo;0;L;;;;;N;;;;;
+C561;HANGUL SYLLABLE AEG;Lo;0;L;;;;;N;;;;;
+C562;HANGUL SYLLABLE AEGG;Lo;0;L;;;;;N;;;;;
+C563;HANGUL SYLLABLE AEGS;Lo;0;L;;;;;N;;;;;
+C564;HANGUL SYLLABLE AEN;Lo;0;L;;;;;N;;;;;
+C565;HANGUL SYLLABLE AENI;Lo;0;L;;;;;N;;;;;
+C566;HANGUL SYLLABLE AENH;Lo;0;L;;;;;N;;;;;
+C567;HANGUL SYLLABLE AED;Lo;0;L;;;;;N;;;;;
+C568;HANGUL SYLLABLE AEL;Lo;0;L;;;;;N;;;;;
+C569;HANGUL SYLLABLE AELG;Lo;0;L;;;;;N;;;;;
+C56A;HANGUL SYLLABLE AELM;Lo;0;L;;;;;N;;;;;
+C56B;HANGUL SYLLABLE AELB;Lo;0;L;;;;;N;;;;;
+C56C;HANGUL SYLLABLE AELS;Lo;0;L;;;;;N;;;;;
+C56D;HANGUL SYLLABLE AELT;Lo;0;L;;;;;N;;;;;
+C56E;HANGUL SYLLABLE AELP;Lo;0;L;;;;;N;;;;;
+C56F;HANGUL SYLLABLE AELH;Lo;0;L;;;;;N;;;;;
+C570;HANGUL SYLLABLE AEM;Lo;0;L;;;;;N;;;;;
+C571;HANGUL SYLLABLE AEB;Lo;0;L;;;;;N;;;;;
+C572;HANGUL SYLLABLE AEBS;Lo;0;L;;;;;N;;;;;
+C573;HANGUL SYLLABLE AES;Lo;0;L;;;;;N;;;;;
+C574;HANGUL SYLLABLE AESS;Lo;0;L;;;;;N;;;;;
+C575;HANGUL SYLLABLE AENG;Lo;0;L;;;;;N;;;;;
+C576;HANGUL SYLLABLE AEJ;Lo;0;L;;;;;N;;;;;
+C577;HANGUL SYLLABLE AEC;Lo;0;L;;;;;N;;;;;
+C578;HANGUL SYLLABLE AEK;Lo;0;L;;;;;N;;;;;
+C579;HANGUL SYLLABLE AET;Lo;0;L;;;;;N;;;;;
+C57A;HANGUL SYLLABLE AEP;Lo;0;L;;;;;N;;;;;
+C57B;HANGUL SYLLABLE AEH;Lo;0;L;;;;;N;;;;;
+C57C;HANGUL SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+C57D;HANGUL SYLLABLE YAG;Lo;0;L;;;;;N;;;;;
+C57E;HANGUL SYLLABLE YAGG;Lo;0;L;;;;;N;;;;;
+C57F;HANGUL SYLLABLE YAGS;Lo;0;L;;;;;N;;;;;
+C580;HANGUL SYLLABLE YAN;Lo;0;L;;;;;N;;;;;
+C581;HANGUL SYLLABLE YANI;Lo;0;L;;;;;N;;;;;
+C582;HANGUL SYLLABLE YANH;Lo;0;L;;;;;N;;;;;
+C583;HANGUL SYLLABLE YAD;Lo;0;L;;;;;N;;;;;
+C584;HANGUL SYLLABLE YAL;Lo;0;L;;;;;N;;;;;
+C585;HANGUL SYLLABLE YALG;Lo;0;L;;;;;N;;;;;
+C586;HANGUL SYLLABLE YALM;Lo;0;L;;;;;N;;;;;
+C587;HANGUL SYLLABLE YALB;Lo;0;L;;;;;N;;;;;
+C588;HANGUL SYLLABLE YALS;Lo;0;L;;;;;N;;;;;
+C589;HANGUL SYLLABLE YALT;Lo;0;L;;;;;N;;;;;
+C58A;HANGUL SYLLABLE YALP;Lo;0;L;;;;;N;;;;;
+C58B;HANGUL SYLLABLE YALH;Lo;0;L;;;;;N;;;;;
+C58C;HANGUL SYLLABLE YAM;Lo;0;L;;;;;N;;;;;
+C58D;HANGUL SYLLABLE YAB;Lo;0;L;;;;;N;;;;;
+C58E;HANGUL SYLLABLE YABS;Lo;0;L;;;;;N;;;;;
+C58F;HANGUL SYLLABLE YAS;Lo;0;L;;;;;N;;;;;
+C590;HANGUL SYLLABLE YASS;Lo;0;L;;;;;N;;;;;
+C591;HANGUL SYLLABLE YANG;Lo;0;L;;;;;N;;;;;
+C592;HANGUL SYLLABLE YAJ;Lo;0;L;;;;;N;;;;;
+C593;HANGUL SYLLABLE YAC;Lo;0;L;;;;;N;;;;;
+C594;HANGUL SYLLABLE YAK;Lo;0;L;;;;;N;;;;;
+C595;HANGUL SYLLABLE YAT;Lo;0;L;;;;;N;;;;;
+C596;HANGUL SYLLABLE YAP;Lo;0;L;;;;;N;;;;;
+C597;HANGUL SYLLABLE YAH;Lo;0;L;;;;;N;;;;;
+C598;HANGUL SYLLABLE YAE;Lo;0;L;;;;;N;;;;;
+C599;HANGUL SYLLABLE YAEG;Lo;0;L;;;;;N;;;;;
+C59A;HANGUL SYLLABLE YAEGG;Lo;0;L;;;;;N;;;;;
+C59B;HANGUL SYLLABLE YAEGS;Lo;0;L;;;;;N;;;;;
+C59C;HANGUL SYLLABLE YAEN;Lo;0;L;;;;;N;;;;;
+C59D;HANGUL SYLLABLE YAENI;Lo;0;L;;;;;N;;;;;
+C59E;HANGUL SYLLABLE YAENH;Lo;0;L;;;;;N;;;;;
+C59F;HANGUL SYLLABLE YAED;Lo;0;L;;;;;N;;;;;
+C5A0;HANGUL SYLLABLE YAEL;Lo;0;L;;;;;N;;;;;
+C5A1;HANGUL SYLLABLE YAELG;Lo;0;L;;;;;N;;;;;
+C5A2;HANGUL SYLLABLE YAELM;Lo;0;L;;;;;N;;;;;
+C5A3;HANGUL SYLLABLE YAELB;Lo;0;L;;;;;N;;;;;
+C5A4;HANGUL SYLLABLE YAELS;Lo;0;L;;;;;N;;;;;
+C5A5;HANGUL SYLLABLE YAELT;Lo;0;L;;;;;N;;;;;
+C5A6;HANGUL SYLLABLE YAELP;Lo;0;L;;;;;N;;;;;
+C5A7;HANGUL SYLLABLE YAELH;Lo;0;L;;;;;N;;;;;
+C5A8;HANGUL SYLLABLE YAEM;Lo;0;L;;;;;N;;;;;
+C5A9;HANGUL SYLLABLE YAEB;Lo;0;L;;;;;N;;;;;
+C5AA;HANGUL SYLLABLE YAEBS;Lo;0;L;;;;;N;;;;;
+C5AB;HANGUL SYLLABLE YAES;Lo;0;L;;;;;N;;;;;
+C5AC;HANGUL SYLLABLE YAESS;Lo;0;L;;;;;N;;;;;
+C5AD;HANGUL SYLLABLE YAENG;Lo;0;L;;;;;N;;;;;
+C5AE;HANGUL SYLLABLE YAEJ;Lo;0;L;;;;;N;;;;;
+C5AF;HANGUL SYLLABLE YAEC;Lo;0;L;;;;;N;;;;;
+C5B0;HANGUL SYLLABLE YAEK;Lo;0;L;;;;;N;;;;;
+C5B1;HANGUL SYLLABLE YAET;Lo;0;L;;;;;N;;;;;
+C5B2;HANGUL SYLLABLE YAEP;Lo;0;L;;;;;N;;;;;
+C5B3;HANGUL SYLLABLE YAEH;Lo;0;L;;;;;N;;;;;
+C5B4;HANGUL SYLLABLE EO;Lo;0;L;;;;;N;;;;;
+C5B5;HANGUL SYLLABLE EOG;Lo;0;L;;;;;N;;;;;
+C5B6;HANGUL SYLLABLE EOGG;Lo;0;L;;;;;N;;;;;
+C5B7;HANGUL SYLLABLE EOGS;Lo;0;L;;;;;N;;;;;
+C5B8;HANGUL SYLLABLE EON;Lo;0;L;;;;;N;;;;;
+C5B9;HANGUL SYLLABLE EONI;Lo;0;L;;;;;N;;;;;
+C5BA;HANGUL SYLLABLE EONH;Lo;0;L;;;;;N;;;;;
+C5BB;HANGUL SYLLABLE EOD;Lo;0;L;;;;;N;;;;;
+C5BC;HANGUL SYLLABLE EOL;Lo;0;L;;;;;N;;;;;
+C5BD;HANGUL SYLLABLE EOLG;Lo;0;L;;;;;N;;;;;
+C5BE;HANGUL SYLLABLE EOLM;Lo;0;L;;;;;N;;;;;
+C5BF;HANGUL SYLLABLE EOLB;Lo;0;L;;;;;N;;;;;
+C5C0;HANGUL SYLLABLE EOLS;Lo;0;L;;;;;N;;;;;
+C5C1;HANGUL SYLLABLE EOLT;Lo;0;L;;;;;N;;;;;
+C5C2;HANGUL SYLLABLE EOLP;Lo;0;L;;;;;N;;;;;
+C5C3;HANGUL SYLLABLE EOLH;Lo;0;L;;;;;N;;;;;
+C5C4;HANGUL SYLLABLE EOM;Lo;0;L;;;;;N;;;;;
+C5C5;HANGUL SYLLABLE EOB;Lo;0;L;;;;;N;;;;;
+C5C6;HANGUL SYLLABLE EOBS;Lo;0;L;;;;;N;;;;;
+C5C7;HANGUL SYLLABLE EOS;Lo;0;L;;;;;N;;;;;
+C5C8;HANGUL SYLLABLE EOSS;Lo;0;L;;;;;N;;;;;
+C5C9;HANGUL SYLLABLE EONG;Lo;0;L;;;;;N;;;;;
+C5CA;HANGUL SYLLABLE EOJ;Lo;0;L;;;;;N;;;;;
+C5CB;HANGUL SYLLABLE EOC;Lo;0;L;;;;;N;;;;;
+C5CC;HANGUL SYLLABLE EOK;Lo;0;L;;;;;N;;;;;
+C5CD;HANGUL SYLLABLE EOT;Lo;0;L;;;;;N;;;;;
+C5CE;HANGUL SYLLABLE EOP;Lo;0;L;;;;;N;;;;;
+C5CF;HANGUL SYLLABLE EOH;Lo;0;L;;;;;N;;;;;
+C5D0;HANGUL SYLLABLE E;Lo;0;L;;;;;N;;;;;
+C5D1;HANGUL SYLLABLE EG;Lo;0;L;;;;;N;;;;;
+C5D2;HANGUL SYLLABLE EGG;Lo;0;L;;;;;N;;;;;
+C5D3;HANGUL SYLLABLE EGS;Lo;0;L;;;;;N;;;;;
+C5D4;HANGUL SYLLABLE EN;Lo;0;L;;;;;N;;;;;
+C5D5;HANGUL SYLLABLE ENI;Lo;0;L;;;;;N;;;;;
+C5D6;HANGUL SYLLABLE ENH;Lo;0;L;;;;;N;;;;;
+C5D7;HANGUL SYLLABLE ED;Lo;0;L;;;;;N;;;;;
+C5D8;HANGUL SYLLABLE EL;Lo;0;L;;;;;N;;;;;
+C5D9;HANGUL SYLLABLE ELG;Lo;0;L;;;;;N;;;;;
+C5DA;HANGUL SYLLABLE ELM;Lo;0;L;;;;;N;;;;;
+C5DB;HANGUL SYLLABLE ELB;Lo;0;L;;;;;N;;;;;
+C5DC;HANGUL SYLLABLE ELS;Lo;0;L;;;;;N;;;;;
+C5DD;HANGUL SYLLABLE ELT;Lo;0;L;;;;;N;;;;;
+C5DE;HANGUL SYLLABLE ELP;Lo;0;L;;;;;N;;;;;
+C5DF;HANGUL SYLLABLE ELH;Lo;0;L;;;;;N;;;;;
+C5E0;HANGUL SYLLABLE EM;Lo;0;L;;;;;N;;;;;
+C5E1;HANGUL SYLLABLE EB;Lo;0;L;;;;;N;;;;;
+C5E2;HANGUL SYLLABLE EBS;Lo;0;L;;;;;N;;;;;
+C5E3;HANGUL SYLLABLE ES;Lo;0;L;;;;;N;;;;;
+C5E4;HANGUL SYLLABLE ESS;Lo;0;L;;;;;N;;;;;
+C5E5;HANGUL SYLLABLE ENG;Lo;0;L;;;;;N;;;;;
+C5E6;HANGUL SYLLABLE EJ;Lo;0;L;;;;;N;;;;;
+C5E7;HANGUL SYLLABLE EC;Lo;0;L;;;;;N;;;;;
+C5E8;HANGUL SYLLABLE EK;Lo;0;L;;;;;N;;;;;
+C5E9;HANGUL SYLLABLE ET;Lo;0;L;;;;;N;;;;;
+C5EA;HANGUL SYLLABLE EP;Lo;0;L;;;;;N;;;;;
+C5EB;HANGUL SYLLABLE EH;Lo;0;L;;;;;N;;;;;
+C5EC;HANGUL SYLLABLE YEO;Lo;0;L;;;;;N;;;;;
+C5ED;HANGUL SYLLABLE YEOG;Lo;0;L;;;;;N;;;;;
+C5EE;HANGUL SYLLABLE YEOGG;Lo;0;L;;;;;N;;;;;
+C5EF;HANGUL SYLLABLE YEOGS;Lo;0;L;;;;;N;;;;;
+C5F0;HANGUL SYLLABLE YEON;Lo;0;L;;;;;N;;;;;
+C5F1;HANGUL SYLLABLE YEONI;Lo;0;L;;;;;N;;;;;
+C5F2;HANGUL SYLLABLE YEONH;Lo;0;L;;;;;N;;;;;
+C5F3;HANGUL SYLLABLE YEOD;Lo;0;L;;;;;N;;;;;
+C5F4;HANGUL SYLLABLE YEOL;Lo;0;L;;;;;N;;;;;
+C5F5;HANGUL SYLLABLE YEOLG;Lo;0;L;;;;;N;;;;;
+C5F6;HANGUL SYLLABLE YEOLM;Lo;0;L;;;;;N;;;;;
+C5F7;HANGUL SYLLABLE YEOLB;Lo;0;L;;;;;N;;;;;
+C5F8;HANGUL SYLLABLE YEOLS;Lo;0;L;;;;;N;;;;;
+C5F9;HANGUL SYLLABLE YEOLT;Lo;0;L;;;;;N;;;;;
+C5FA;HANGUL SYLLABLE YEOLP;Lo;0;L;;;;;N;;;;;
+C5FB;HANGUL SYLLABLE YEOLH;Lo;0;L;;;;;N;;;;;
+C5FC;HANGUL SYLLABLE YEOM;Lo;0;L;;;;;N;;;;;
+C5FD;HANGUL SYLLABLE YEOB;Lo;0;L;;;;;N;;;;;
+C5FE;HANGUL SYLLABLE YEOBS;Lo;0;L;;;;;N;;;;;
+C5FF;HANGUL SYLLABLE YEOS;Lo;0;L;;;;;N;;;;;
+C600;HANGUL SYLLABLE YEOSS;Lo;0;L;;;;;N;;;;;
+C601;HANGUL SYLLABLE YEONG;Lo;0;L;;;;;N;;;;;
+C602;HANGUL SYLLABLE YEOJ;Lo;0;L;;;;;N;;;;;
+C603;HANGUL SYLLABLE YEOC;Lo;0;L;;;;;N;;;;;
+C604;HANGUL SYLLABLE YEOK;Lo;0;L;;;;;N;;;;;
+C605;HANGUL SYLLABLE YEOT;Lo;0;L;;;;;N;;;;;
+C606;HANGUL SYLLABLE YEOP;Lo;0;L;;;;;N;;;;;
+C607;HANGUL SYLLABLE YEOH;Lo;0;L;;;;;N;;;;;
+C608;HANGUL SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+C609;HANGUL SYLLABLE YEG;Lo;0;L;;;;;N;;;;;
+C60A;HANGUL SYLLABLE YEGG;Lo;0;L;;;;;N;;;;;
+C60B;HANGUL SYLLABLE YEGS;Lo;0;L;;;;;N;;;;;
+C60C;HANGUL SYLLABLE YEN;Lo;0;L;;;;;N;;;;;
+C60D;HANGUL SYLLABLE YENI;Lo;0;L;;;;;N;;;;;
+C60E;HANGUL SYLLABLE YENH;Lo;0;L;;;;;N;;;;;
+C60F;HANGUL SYLLABLE YED;Lo;0;L;;;;;N;;;;;
+C610;HANGUL SYLLABLE YEL;Lo;0;L;;;;;N;;;;;
+C611;HANGUL SYLLABLE YELG;Lo;0;L;;;;;N;;;;;
+C612;HANGUL SYLLABLE YELM;Lo;0;L;;;;;N;;;;;
+C613;HANGUL SYLLABLE YELB;Lo;0;L;;;;;N;;;;;
+C614;HANGUL SYLLABLE YELS;Lo;0;L;;;;;N;;;;;
+C615;HANGUL SYLLABLE YELT;Lo;0;L;;;;;N;;;;;
+C616;HANGUL SYLLABLE YELP;Lo;0;L;;;;;N;;;;;
+C617;HANGUL SYLLABLE YELH;Lo;0;L;;;;;N;;;;;
+C618;HANGUL SYLLABLE YEM;Lo;0;L;;;;;N;;;;;
+C619;HANGUL SYLLABLE YEB;Lo;0;L;;;;;N;;;;;
+C61A;HANGUL SYLLABLE YEBS;Lo;0;L;;;;;N;;;;;
+C61B;HANGUL SYLLABLE YES;Lo;0;L;;;;;N;;;;;
+C61C;HANGUL SYLLABLE YESS;Lo;0;L;;;;;N;;;;;
+C61D;HANGUL SYLLABLE YENG;Lo;0;L;;;;;N;;;;;
+C61E;HANGUL SYLLABLE YEJ;Lo;0;L;;;;;N;;;;;
+C61F;HANGUL SYLLABLE YEC;Lo;0;L;;;;;N;;;;;
+C620;HANGUL SYLLABLE YEK;Lo;0;L;;;;;N;;;;;
+C621;HANGUL SYLLABLE YET;Lo;0;L;;;;;N;;;;;
+C622;HANGUL SYLLABLE YEP;Lo;0;L;;;;;N;;;;;
+C623;HANGUL SYLLABLE YEH;Lo;0;L;;;;;N;;;;;
+C624;HANGUL SYLLABLE O;Lo;0;L;;;;;N;;;;;
+C625;HANGUL SYLLABLE OG;Lo;0;L;;;;;N;;;;;
+C626;HANGUL SYLLABLE OGG;Lo;0;L;;;;;N;;;;;
+C627;HANGUL SYLLABLE OGS;Lo;0;L;;;;;N;;;;;
+C628;HANGUL SYLLABLE ON;Lo;0;L;;;;;N;;;;;
+C629;HANGUL SYLLABLE ONI;Lo;0;L;;;;;N;;;;;
+C62A;HANGUL SYLLABLE ONH;Lo;0;L;;;;;N;;;;;
+C62B;HANGUL SYLLABLE OD;Lo;0;L;;;;;N;;;;;
+C62C;HANGUL SYLLABLE OL;Lo;0;L;;;;;N;;;;;
+C62D;HANGUL SYLLABLE OLG;Lo;0;L;;;;;N;;;;;
+C62E;HANGUL SYLLABLE OLM;Lo;0;L;;;;;N;;;;;
+C62F;HANGUL SYLLABLE OLB;Lo;0;L;;;;;N;;;;;
+C630;HANGUL SYLLABLE OLS;Lo;0;L;;;;;N;;;;;
+C631;HANGUL SYLLABLE OLT;Lo;0;L;;;;;N;;;;;
+C632;HANGUL SYLLABLE OLP;Lo;0;L;;;;;N;;;;;
+C633;HANGUL SYLLABLE OLH;Lo;0;L;;;;;N;;;;;
+C634;HANGUL SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+C635;HANGUL SYLLABLE OB;Lo;0;L;;;;;N;;;;;
+C636;HANGUL SYLLABLE OBS;Lo;0;L;;;;;N;;;;;
+C637;HANGUL SYLLABLE OS;Lo;0;L;;;;;N;;;;;
+C638;HANGUL SYLLABLE OSS;Lo;0;L;;;;;N;;;;;
+C639;HANGUL SYLLABLE ONG;Lo;0;L;;;;;N;;;;;
+C63A;HANGUL SYLLABLE OJ;Lo;0;L;;;;;N;;;;;
+C63B;HANGUL SYLLABLE OC;Lo;0;L;;;;;N;;;;;
+C63C;HANGUL SYLLABLE OK;Lo;0;L;;;;;N;;;;;
+C63D;HANGUL SYLLABLE OT;Lo;0;L;;;;;N;;;;;
+C63E;HANGUL SYLLABLE OP;Lo;0;L;;;;;N;;;;;
+C63F;HANGUL SYLLABLE OH;Lo;0;L;;;;;N;;;;;
+C640;HANGUL SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+C641;HANGUL SYLLABLE WAG;Lo;0;L;;;;;N;;;;;
+C642;HANGUL SYLLABLE WAGG;Lo;0;L;;;;;N;;;;;
+C643;HANGUL SYLLABLE WAGS;Lo;0;L;;;;;N;;;;;
+C644;HANGUL SYLLABLE WAN;Lo;0;L;;;;;N;;;;;
+C645;HANGUL SYLLABLE WANI;Lo;0;L;;;;;N;;;;;
+C646;HANGUL SYLLABLE WANH;Lo;0;L;;;;;N;;;;;
+C647;HANGUL SYLLABLE WAD;Lo;0;L;;;;;N;;;;;
+C648;HANGUL SYLLABLE WAL;Lo;0;L;;;;;N;;;;;
+C649;HANGUL SYLLABLE WALG;Lo;0;L;;;;;N;;;;;
+C64A;HANGUL SYLLABLE WALM;Lo;0;L;;;;;N;;;;;
+C64B;HANGUL SYLLABLE WALB;Lo;0;L;;;;;N;;;;;
+C64C;HANGUL SYLLABLE WALS;Lo;0;L;;;;;N;;;;;
+C64D;HANGUL SYLLABLE WALT;Lo;0;L;;;;;N;;;;;
+C64E;HANGUL SYLLABLE WALP;Lo;0;L;;;;;N;;;;;
+C64F;HANGUL SYLLABLE WALH;Lo;0;L;;;;;N;;;;;
+C650;HANGUL SYLLABLE WAM;Lo;0;L;;;;;N;;;;;
+C651;HANGUL SYLLABLE WAB;Lo;0;L;;;;;N;;;;;
+C652;HANGUL SYLLABLE WABS;Lo;0;L;;;;;N;;;;;
+C653;HANGUL SYLLABLE WAS;Lo;0;L;;;;;N;;;;;
+C654;HANGUL SYLLABLE WASS;Lo;0;L;;;;;N;;;;;
+C655;HANGUL SYLLABLE WANG;Lo;0;L;;;;;N;;;;;
+C656;HANGUL SYLLABLE WAJ;Lo;0;L;;;;;N;;;;;
+C657;HANGUL SYLLABLE WAC;Lo;0;L;;;;;N;;;;;
+C658;HANGUL SYLLABLE WAK;Lo;0;L;;;;;N;;;;;
+C659;HANGUL SYLLABLE WAT;Lo;0;L;;;;;N;;;;;
+C65A;HANGUL SYLLABLE WAP;Lo;0;L;;;;;N;;;;;
+C65B;HANGUL SYLLABLE WAH;Lo;0;L;;;;;N;;;;;
+C65C;HANGUL SYLLABLE WAE;Lo;0;L;;;;;N;;;;;
+C65D;HANGUL SYLLABLE WAEG;Lo;0;L;;;;;N;;;;;
+C65E;HANGUL SYLLABLE WAEGG;Lo;0;L;;;;;N;;;;;
+C65F;HANGUL SYLLABLE WAEGS;Lo;0;L;;;;;N;;;;;
+C660;HANGUL SYLLABLE WAEN;Lo;0;L;;;;;N;;;;;
+C661;HANGUL SYLLABLE WAENI;Lo;0;L;;;;;N;;;;;
+C662;HANGUL SYLLABLE WAENH;Lo;0;L;;;;;N;;;;;
+C663;HANGUL SYLLABLE WAED;Lo;0;L;;;;;N;;;;;
+C664;HANGUL SYLLABLE WAEL;Lo;0;L;;;;;N;;;;;
+C665;HANGUL SYLLABLE WAELG;Lo;0;L;;;;;N;;;;;
+C666;HANGUL SYLLABLE WAELM;Lo;0;L;;;;;N;;;;;
+C667;HANGUL SYLLABLE WAELB;Lo;0;L;;;;;N;;;;;
+C668;HANGUL SYLLABLE WAELS;Lo;0;L;;;;;N;;;;;
+C669;HANGUL SYLLABLE WAELT;Lo;0;L;;;;;N;;;;;
+C66A;HANGUL SYLLABLE WAELP;Lo;0;L;;;;;N;;;;;
+C66B;HANGUL SYLLABLE WAELH;Lo;0;L;;;;;N;;;;;
+C66C;HANGUL SYLLABLE WAEM;Lo;0;L;;;;;N;;;;;
+C66D;HANGUL SYLLABLE WAEB;Lo;0;L;;;;;N;;;;;
+C66E;HANGUL SYLLABLE WAEBS;Lo;0;L;;;;;N;;;;;
+C66F;HANGUL SYLLABLE WAES;Lo;0;L;;;;;N;;;;;
+C670;HANGUL SYLLABLE WAESS;Lo;0;L;;;;;N;;;;;
+C671;HANGUL SYLLABLE WAENG;Lo;0;L;;;;;N;;;;;
+C672;HANGUL SYLLABLE WAEJ;Lo;0;L;;;;;N;;;;;
+C673;HANGUL SYLLABLE WAEC;Lo;0;L;;;;;N;;;;;
+C674;HANGUL SYLLABLE WAEK;Lo;0;L;;;;;N;;;;;
+C675;HANGUL SYLLABLE WAET;Lo;0;L;;;;;N;;;;;
+C676;HANGUL SYLLABLE WAEP;Lo;0;L;;;;;N;;;;;
+C677;HANGUL SYLLABLE WAEH;Lo;0;L;;;;;N;;;;;
+C678;HANGUL SYLLABLE OE;Lo;0;L;;;;;N;;;;;
+C679;HANGUL SYLLABLE OEG;Lo;0;L;;;;;N;;;;;
+C67A;HANGUL SYLLABLE OEGG;Lo;0;L;;;;;N;;;;;
+C67B;HANGUL SYLLABLE OEGS;Lo;0;L;;;;;N;;;;;
+C67C;HANGUL SYLLABLE OEN;Lo;0;L;;;;;N;;;;;
+C67D;HANGUL SYLLABLE OENI;Lo;0;L;;;;;N;;;;;
+C67E;HANGUL SYLLABLE OENH;Lo;0;L;;;;;N;;;;;
+C67F;HANGUL SYLLABLE OED;Lo;0;L;;;;;N;;;;;
+C680;HANGUL SYLLABLE OEL;Lo;0;L;;;;;N;;;;;
+C681;HANGUL SYLLABLE OELG;Lo;0;L;;;;;N;;;;;
+C682;HANGUL SYLLABLE OELM;Lo;0;L;;;;;N;;;;;
+C683;HANGUL SYLLABLE OELB;Lo;0;L;;;;;N;;;;;
+C684;HANGUL SYLLABLE OELS;Lo;0;L;;;;;N;;;;;
+C685;HANGUL SYLLABLE OELT;Lo;0;L;;;;;N;;;;;
+C686;HANGUL SYLLABLE OELP;Lo;0;L;;;;;N;;;;;
+C687;HANGUL SYLLABLE OELH;Lo;0;L;;;;;N;;;;;
+C688;HANGUL SYLLABLE OEM;Lo;0;L;;;;;N;;;;;
+C689;HANGUL SYLLABLE OEB;Lo;0;L;;;;;N;;;;;
+C68A;HANGUL SYLLABLE OEBS;Lo;0;L;;;;;N;;;;;
+C68B;HANGUL SYLLABLE OES;Lo;0;L;;;;;N;;;;;
+C68C;HANGUL SYLLABLE OESS;Lo;0;L;;;;;N;;;;;
+C68D;HANGUL SYLLABLE OENG;Lo;0;L;;;;;N;;;;;
+C68E;HANGUL SYLLABLE OEJ;Lo;0;L;;;;;N;;;;;
+C68F;HANGUL SYLLABLE OEC;Lo;0;L;;;;;N;;;;;
+C690;HANGUL SYLLABLE OEK;Lo;0;L;;;;;N;;;;;
+C691;HANGUL SYLLABLE OET;Lo;0;L;;;;;N;;;;;
+C692;HANGUL SYLLABLE OEP;Lo;0;L;;;;;N;;;;;
+C693;HANGUL SYLLABLE OEH;Lo;0;L;;;;;N;;;;;
+C694;HANGUL SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+C695;HANGUL SYLLABLE YOG;Lo;0;L;;;;;N;;;;;
+C696;HANGUL SYLLABLE YOGG;Lo;0;L;;;;;N;;;;;
+C697;HANGUL SYLLABLE YOGS;Lo;0;L;;;;;N;;;;;
+C698;HANGUL SYLLABLE YON;Lo;0;L;;;;;N;;;;;
+C699;HANGUL SYLLABLE YONI;Lo;0;L;;;;;N;;;;;
+C69A;HANGUL SYLLABLE YONH;Lo;0;L;;;;;N;;;;;
+C69B;HANGUL SYLLABLE YOD;Lo;0;L;;;;;N;;;;;
+C69C;HANGUL SYLLABLE YOL;Lo;0;L;;;;;N;;;;;
+C69D;HANGUL SYLLABLE YOLG;Lo;0;L;;;;;N;;;;;
+C69E;HANGUL SYLLABLE YOLM;Lo;0;L;;;;;N;;;;;
+C69F;HANGUL SYLLABLE YOLB;Lo;0;L;;;;;N;;;;;
+C6A0;HANGUL SYLLABLE YOLS;Lo;0;L;;;;;N;;;;;
+C6A1;HANGUL SYLLABLE YOLT;Lo;0;L;;;;;N;;;;;
+C6A2;HANGUL SYLLABLE YOLP;Lo;0;L;;;;;N;;;;;
+C6A3;HANGUL SYLLABLE YOLH;Lo;0;L;;;;;N;;;;;
+C6A4;HANGUL SYLLABLE YOM;Lo;0;L;;;;;N;;;;;
+C6A5;HANGUL SYLLABLE YOB;Lo;0;L;;;;;N;;;;;
+C6A6;HANGUL SYLLABLE YOBS;Lo;0;L;;;;;N;;;;;
+C6A7;HANGUL SYLLABLE YOS;Lo;0;L;;;;;N;;;;;
+C6A8;HANGUL SYLLABLE YOSS;Lo;0;L;;;;;N;;;;;
+C6A9;HANGUL SYLLABLE YONG;Lo;0;L;;;;;N;;;;;
+C6AA;HANGUL SYLLABLE YOJ;Lo;0;L;;;;;N;;;;;
+C6AB;HANGUL SYLLABLE YOC;Lo;0;L;;;;;N;;;;;
+C6AC;HANGUL SYLLABLE YOK;Lo;0;L;;;;;N;;;;;
+C6AD;HANGUL SYLLABLE YOT;Lo;0;L;;;;;N;;;;;
+C6AE;HANGUL SYLLABLE YOP;Lo;0;L;;;;;N;;;;;
+C6AF;HANGUL SYLLABLE YOH;Lo;0;L;;;;;N;;;;;
+C6B0;HANGUL SYLLABLE U;Lo;0;L;;;;;N;;;;;
+C6B1;HANGUL SYLLABLE UG;Lo;0;L;;;;;N;;;;;
+C6B2;HANGUL SYLLABLE UGG;Lo;0;L;;;;;N;;;;;
+C6B3;HANGUL SYLLABLE UGS;Lo;0;L;;;;;N;;;;;
+C6B4;HANGUL SYLLABLE UN;Lo;0;L;;;;;N;;;;;
+C6B5;HANGUL SYLLABLE UNI;Lo;0;L;;;;;N;;;;;
+C6B6;HANGUL SYLLABLE UNH;Lo;0;L;;;;;N;;;;;
+C6B7;HANGUL SYLLABLE UD;Lo;0;L;;;;;N;;;;;
+C6B8;HANGUL SYLLABLE UL;Lo;0;L;;;;;N;;;;;
+C6B9;HANGUL SYLLABLE ULG;Lo;0;L;;;;;N;;;;;
+C6BA;HANGUL SYLLABLE ULM;Lo;0;L;;;;;N;;;;;
+C6BB;HANGUL SYLLABLE ULB;Lo;0;L;;;;;N;;;;;
+C6BC;HANGUL SYLLABLE ULS;Lo;0;L;;;;;N;;;;;
+C6BD;HANGUL SYLLABLE ULT;Lo;0;L;;;;;N;;;;;
+C6BE;HANGUL SYLLABLE ULP;Lo;0;L;;;;;N;;;;;
+C6BF;HANGUL SYLLABLE ULH;Lo;0;L;;;;;N;;;;;
+C6C0;HANGUL SYLLABLE UM;Lo;0;L;;;;;N;;;;;
+C6C1;HANGUL SYLLABLE UB;Lo;0;L;;;;;N;;;;;
+C6C2;HANGUL SYLLABLE UBS;Lo;0;L;;;;;N;;;;;
+C6C3;HANGUL SYLLABLE US;Lo;0;L;;;;;N;;;;;
+C6C4;HANGUL SYLLABLE USS;Lo;0;L;;;;;N;;;;;
+C6C5;HANGUL SYLLABLE UNG;Lo;0;L;;;;;N;;;;;
+C6C6;HANGUL SYLLABLE UJ;Lo;0;L;;;;;N;;;;;
+C6C7;HANGUL SYLLABLE UC;Lo;0;L;;;;;N;;;;;
+C6C8;HANGUL SYLLABLE UK;Lo;0;L;;;;;N;;;;;
+C6C9;HANGUL SYLLABLE UT;Lo;0;L;;;;;N;;;;;
+C6CA;HANGUL SYLLABLE UP;Lo;0;L;;;;;N;;;;;
+C6CB;HANGUL SYLLABLE UH;Lo;0;L;;;;;N;;;;;
+C6CC;HANGUL SYLLABLE WEO;Lo;0;L;;;;;N;;;;;
+C6CD;HANGUL SYLLABLE WEOG;Lo;0;L;;;;;N;;;;;
+C6CE;HANGUL SYLLABLE WEOGG;Lo;0;L;;;;;N;;;;;
+C6CF;HANGUL SYLLABLE WEOGS;Lo;0;L;;;;;N;;;;;
+C6D0;HANGUL SYLLABLE WEON;Lo;0;L;;;;;N;;;;;
+C6D1;HANGUL SYLLABLE WEONI;Lo;0;L;;;;;N;;;;;
+C6D2;HANGUL SYLLABLE WEONH;Lo;0;L;;;;;N;;;;;
+C6D3;HANGUL SYLLABLE WEOD;Lo;0;L;;;;;N;;;;;
+C6D4;HANGUL SYLLABLE WEOL;Lo;0;L;;;;;N;;;;;
+C6D5;HANGUL SYLLABLE WEOLG;Lo;0;L;;;;;N;;;;;
+C6D6;HANGUL SYLLABLE WEOLM;Lo;0;L;;;;;N;;;;;
+C6D7;HANGUL SYLLABLE WEOLB;Lo;0;L;;;;;N;;;;;
+C6D8;HANGUL SYLLABLE WEOLS;Lo;0;L;;;;;N;;;;;
+C6D9;HANGUL SYLLABLE WEOLT;Lo;0;L;;;;;N;;;;;
+C6DA;HANGUL SYLLABLE WEOLP;Lo;0;L;;;;;N;;;;;
+C6DB;HANGUL SYLLABLE WEOLH;Lo;0;L;;;;;N;;;;;
+C6DC;HANGUL SYLLABLE WEOM;Lo;0;L;;;;;N;;;;;
+C6DD;HANGUL SYLLABLE WEOB;Lo;0;L;;;;;N;;;;;
+C6DE;HANGUL SYLLABLE WEOBS;Lo;0;L;;;;;N;;;;;
+C6DF;HANGUL SYLLABLE WEOS;Lo;0;L;;;;;N;;;;;
+C6E0;HANGUL SYLLABLE WEOSS;Lo;0;L;;;;;N;;;;;
+C6E1;HANGUL SYLLABLE WEONG;Lo;0;L;;;;;N;;;;;
+C6E2;HANGUL SYLLABLE WEOJ;Lo;0;L;;;;;N;;;;;
+C6E3;HANGUL SYLLABLE WEOC;Lo;0;L;;;;;N;;;;;
+C6E4;HANGUL SYLLABLE WEOK;Lo;0;L;;;;;N;;;;;
+C6E5;HANGUL SYLLABLE WEOT;Lo;0;L;;;;;N;;;;;
+C6E6;HANGUL SYLLABLE WEOP;Lo;0;L;;;;;N;;;;;
+C6E7;HANGUL SYLLABLE WEOH;Lo;0;L;;;;;N;;;;;
+C6E8;HANGUL SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+C6E9;HANGUL SYLLABLE WEG;Lo;0;L;;;;;N;;;;;
+C6EA;HANGUL SYLLABLE WEGG;Lo;0;L;;;;;N;;;;;
+C6EB;HANGUL SYLLABLE WEGS;Lo;0;L;;;;;N;;;;;
+C6EC;HANGUL SYLLABLE WEN;Lo;0;L;;;;;N;;;;;
+C6ED;HANGUL SYLLABLE WENI;Lo;0;L;;;;;N;;;;;
+C6EE;HANGUL SYLLABLE WENH;Lo;0;L;;;;;N;;;;;
+C6EF;HANGUL SYLLABLE WED;Lo;0;L;;;;;N;;;;;
+C6F0;HANGUL SYLLABLE WEL;Lo;0;L;;;;;N;;;;;
+C6F1;HANGUL SYLLABLE WELG;Lo;0;L;;;;;N;;;;;
+C6F2;HANGUL SYLLABLE WELM;Lo;0;L;;;;;N;;;;;
+C6F3;HANGUL SYLLABLE WELB;Lo;0;L;;;;;N;;;;;
+C6F4;HANGUL SYLLABLE WELS;Lo;0;L;;;;;N;;;;;
+C6F5;HANGUL SYLLABLE WELT;Lo;0;L;;;;;N;;;;;
+C6F6;HANGUL SYLLABLE WELP;Lo;0;L;;;;;N;;;;;
+C6F7;HANGUL SYLLABLE WELH;Lo;0;L;;;;;N;;;;;
+C6F8;HANGUL SYLLABLE WEM;Lo;0;L;;;;;N;;;;;
+C6F9;HANGUL SYLLABLE WEB;Lo;0;L;;;;;N;;;;;
+C6FA;HANGUL SYLLABLE WEBS;Lo;0;L;;;;;N;;;;;
+C6FB;HANGUL SYLLABLE WES;Lo;0;L;;;;;N;;;;;
+C6FC;HANGUL SYLLABLE WESS;Lo;0;L;;;;;N;;;;;
+C6FD;HANGUL SYLLABLE WENG;Lo;0;L;;;;;N;;;;;
+C6FE;HANGUL SYLLABLE WEJ;Lo;0;L;;;;;N;;;;;
+C6FF;HANGUL SYLLABLE WEC;Lo;0;L;;;;;N;;;;;
+C700;HANGUL SYLLABLE WEK;Lo;0;L;;;;;N;;;;;
+C701;HANGUL SYLLABLE WET;Lo;0;L;;;;;N;;;;;
+C702;HANGUL SYLLABLE WEP;Lo;0;L;;;;;N;;;;;
+C703;HANGUL SYLLABLE WEH;Lo;0;L;;;;;N;;;;;
+C704;HANGUL SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+C705;HANGUL SYLLABLE WIG;Lo;0;L;;;;;N;;;;;
+C706;HANGUL SYLLABLE WIGG;Lo;0;L;;;;;N;;;;;
+C707;HANGUL SYLLABLE WIGS;Lo;0;L;;;;;N;;;;;
+C708;HANGUL SYLLABLE WIN;Lo;0;L;;;;;N;;;;;
+C709;HANGUL SYLLABLE WINI;Lo;0;L;;;;;N;;;;;
+C70A;HANGUL SYLLABLE WINH;Lo;0;L;;;;;N;;;;;
+C70B;HANGUL SYLLABLE WID;Lo;0;L;;;;;N;;;;;
+C70C;HANGUL SYLLABLE WIL;Lo;0;L;;;;;N;;;;;
+C70D;HANGUL SYLLABLE WILG;Lo;0;L;;;;;N;;;;;
+C70E;HANGUL SYLLABLE WILM;Lo;0;L;;;;;N;;;;;
+C70F;HANGUL SYLLABLE WILB;Lo;0;L;;;;;N;;;;;
+C710;HANGUL SYLLABLE WILS;Lo;0;L;;;;;N;;;;;
+C711;HANGUL SYLLABLE WILT;Lo;0;L;;;;;N;;;;;
+C712;HANGUL SYLLABLE WILP;Lo;0;L;;;;;N;;;;;
+C713;HANGUL SYLLABLE WILH;Lo;0;L;;;;;N;;;;;
+C714;HANGUL SYLLABLE WIM;Lo;0;L;;;;;N;;;;;
+C715;HANGUL SYLLABLE WIB;Lo;0;L;;;;;N;;;;;
+C716;HANGUL SYLLABLE WIBS;Lo;0;L;;;;;N;;;;;
+C717;HANGUL SYLLABLE WIS;Lo;0;L;;;;;N;;;;;
+C718;HANGUL SYLLABLE WISS;Lo;0;L;;;;;N;;;;;
+C719;HANGUL SYLLABLE WING;Lo;0;L;;;;;N;;;;;
+C71A;HANGUL SYLLABLE WIJ;Lo;0;L;;;;;N;;;;;
+C71B;HANGUL SYLLABLE WIC;Lo;0;L;;;;;N;;;;;
+C71C;HANGUL SYLLABLE WIK;Lo;0;L;;;;;N;;;;;
+C71D;HANGUL SYLLABLE WIT;Lo;0;L;;;;;N;;;;;
+C71E;HANGUL SYLLABLE WIP;Lo;0;L;;;;;N;;;;;
+C71F;HANGUL SYLLABLE WIH;Lo;0;L;;;;;N;;;;;
+C720;HANGUL SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+C721;HANGUL SYLLABLE YUG;Lo;0;L;;;;;N;;;;;
+C722;HANGUL SYLLABLE YUGG;Lo;0;L;;;;;N;;;;;
+C723;HANGUL SYLLABLE YUGS;Lo;0;L;;;;;N;;;;;
+C724;HANGUL SYLLABLE YUN;Lo;0;L;;;;;N;;;;;
+C725;HANGUL SYLLABLE YUNI;Lo;0;L;;;;;N;;;;;
+C726;HANGUL SYLLABLE YUNH;Lo;0;L;;;;;N;;;;;
+C727;HANGUL SYLLABLE YUD;Lo;0;L;;;;;N;;;;;
+C728;HANGUL SYLLABLE YUL;Lo;0;L;;;;;N;;;;;
+C729;HANGUL SYLLABLE YULG;Lo;0;L;;;;;N;;;;;
+C72A;HANGUL SYLLABLE YULM;Lo;0;L;;;;;N;;;;;
+C72B;HANGUL SYLLABLE YULB;Lo;0;L;;;;;N;;;;;
+C72C;HANGUL SYLLABLE YULS;Lo;0;L;;;;;N;;;;;
+C72D;HANGUL SYLLABLE YULT;Lo;0;L;;;;;N;;;;;
+C72E;HANGUL SYLLABLE YULP;Lo;0;L;;;;;N;;;;;
+C72F;HANGUL SYLLABLE YULH;Lo;0;L;;;;;N;;;;;
+C730;HANGUL SYLLABLE YUM;Lo;0;L;;;;;N;;;;;
+C731;HANGUL SYLLABLE YUB;Lo;0;L;;;;;N;;;;;
+C732;HANGUL SYLLABLE YUBS;Lo;0;L;;;;;N;;;;;
+C733;HANGUL SYLLABLE YUS;Lo;0;L;;;;;N;;;;;
+C734;HANGUL SYLLABLE YUSS;Lo;0;L;;;;;N;;;;;
+C735;HANGUL SYLLABLE YUNG;Lo;0;L;;;;;N;;;;;
+C736;HANGUL SYLLABLE YUJ;Lo;0;L;;;;;N;;;;;
+C737;HANGUL SYLLABLE YUC;Lo;0;L;;;;;N;;;;;
+C738;HANGUL SYLLABLE YUK;Lo;0;L;;;;;N;;;;;
+C739;HANGUL SYLLABLE YUT;Lo;0;L;;;;;N;;;;;
+C73A;HANGUL SYLLABLE YUP;Lo;0;L;;;;;N;;;;;
+C73B;HANGUL SYLLABLE YUH;Lo;0;L;;;;;N;;;;;
+C73C;HANGUL SYLLABLE EU;Lo;0;L;;;;;N;;;;;
+C73D;HANGUL SYLLABLE EUG;Lo;0;L;;;;;N;;;;;
+C73E;HANGUL SYLLABLE EUGG;Lo;0;L;;;;;N;;;;;
+C73F;HANGUL SYLLABLE EUGS;Lo;0;L;;;;;N;;;;;
+C740;HANGUL SYLLABLE EUN;Lo;0;L;;;;;N;;;;;
+C741;HANGUL SYLLABLE EUNI;Lo;0;L;;;;;N;;;;;
+C742;HANGUL SYLLABLE EUNH;Lo;0;L;;;;;N;;;;;
+C743;HANGUL SYLLABLE EUD;Lo;0;L;;;;;N;;;;;
+C744;HANGUL SYLLABLE EUL;Lo;0;L;;;;;N;;;;;
+C745;HANGUL SYLLABLE EULG;Lo;0;L;;;;;N;;;;;
+C746;HANGUL SYLLABLE EULM;Lo;0;L;;;;;N;;;;;
+C747;HANGUL SYLLABLE EULB;Lo;0;L;;;;;N;;;;;
+C748;HANGUL SYLLABLE EULS;Lo;0;L;;;;;N;;;;;
+C749;HANGUL SYLLABLE EULT;Lo;0;L;;;;;N;;;;;
+C74A;HANGUL SYLLABLE EULP;Lo;0;L;;;;;N;;;;;
+C74B;HANGUL SYLLABLE EULH;Lo;0;L;;;;;N;;;;;
+C74C;HANGUL SYLLABLE EUM;Lo;0;L;;;;;N;;;;;
+C74D;HANGUL SYLLABLE EUB;Lo;0;L;;;;;N;;;;;
+C74E;HANGUL SYLLABLE EUBS;Lo;0;L;;;;;N;;;;;
+C74F;HANGUL SYLLABLE EUS;Lo;0;L;;;;;N;;;;;
+C750;HANGUL SYLLABLE EUSS;Lo;0;L;;;;;N;;;;;
+C751;HANGUL SYLLABLE EUNG;Lo;0;L;;;;;N;;;;;
+C752;HANGUL SYLLABLE EUJ;Lo;0;L;;;;;N;;;;;
+C753;HANGUL SYLLABLE EUC;Lo;0;L;;;;;N;;;;;
+C754;HANGUL SYLLABLE EUK;Lo;0;L;;;;;N;;;;;
+C755;HANGUL SYLLABLE EUT;Lo;0;L;;;;;N;;;;;
+C756;HANGUL SYLLABLE EUP;Lo;0;L;;;;;N;;;;;
+C757;HANGUL SYLLABLE EUH;Lo;0;L;;;;;N;;;;;
+C758;HANGUL SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+C759;HANGUL SYLLABLE YIG;Lo;0;L;;;;;N;;;;;
+C75A;HANGUL SYLLABLE YIGG;Lo;0;L;;;;;N;;;;;
+C75B;HANGUL SYLLABLE YIGS;Lo;0;L;;;;;N;;;;;
+C75C;HANGUL SYLLABLE YIN;Lo;0;L;;;;;N;;;;;
+C75D;HANGUL SYLLABLE YINI;Lo;0;L;;;;;N;;;;;
+C75E;HANGUL SYLLABLE YINH;Lo;0;L;;;;;N;;;;;
+C75F;HANGUL SYLLABLE YID;Lo;0;L;;;;;N;;;;;
+C760;HANGUL SYLLABLE YIL;Lo;0;L;;;;;N;;;;;
+C761;HANGUL SYLLABLE YILG;Lo;0;L;;;;;N;;;;;
+C762;HANGUL SYLLABLE YILM;Lo;0;L;;;;;N;;;;;
+C763;HANGUL SYLLABLE YILB;Lo;0;L;;;;;N;;;;;
+C764;HANGUL SYLLABLE YILS;Lo;0;L;;;;;N;;;;;
+C765;HANGUL SYLLABLE YILT;Lo;0;L;;;;;N;;;;;
+C766;HANGUL SYLLABLE YILP;Lo;0;L;;;;;N;;;;;
+C767;HANGUL SYLLABLE YILH;Lo;0;L;;;;;N;;;;;
+C768;HANGUL SYLLABLE YIM;Lo;0;L;;;;;N;;;;;
+C769;HANGUL SYLLABLE YIB;Lo;0;L;;;;;N;;;;;
+C76A;HANGUL SYLLABLE YIBS;Lo;0;L;;;;;N;;;;;
+C76B;HANGUL SYLLABLE YIS;Lo;0;L;;;;;N;;;;;
+C76C;HANGUL SYLLABLE YISS;Lo;0;L;;;;;N;;;;;
+C76D;HANGUL SYLLABLE YING;Lo;0;L;;;;;N;;;;;
+C76E;HANGUL SYLLABLE YIJ;Lo;0;L;;;;;N;;;;;
+C76F;HANGUL SYLLABLE YIC;Lo;0;L;;;;;N;;;;;
+C770;HANGUL SYLLABLE YIK;Lo;0;L;;;;;N;;;;;
+C771;HANGUL SYLLABLE YIT;Lo;0;L;;;;;N;;;;;
+C772;HANGUL SYLLABLE YIP;Lo;0;L;;;;;N;;;;;
+C773;HANGUL SYLLABLE YIH;Lo;0;L;;;;;N;;;;;
+C774;HANGUL SYLLABLE I;Lo;0;L;;;;;N;;;;;
+C775;HANGUL SYLLABLE IG;Lo;0;L;;;;;N;;;;;
+C776;HANGUL SYLLABLE IGG;Lo;0;L;;;;;N;;;;;
+C777;HANGUL SYLLABLE IGS;Lo;0;L;;;;;N;;;;;
+C778;HANGUL SYLLABLE IN;Lo;0;L;;;;;N;;;;;
+C779;HANGUL SYLLABLE INI;Lo;0;L;;;;;N;;;;;
+C77A;HANGUL SYLLABLE INH;Lo;0;L;;;;;N;;;;;
+C77B;HANGUL SYLLABLE ID;Lo;0;L;;;;;N;;;;;
+C77C;HANGUL SYLLABLE IL;Lo;0;L;;;;;N;;;;;
+C77D;HANGUL SYLLABLE ILG;Lo;0;L;;;;;N;;;;;
+C77E;HANGUL SYLLABLE ILM;Lo;0;L;;;;;N;;;;;
+C77F;HANGUL SYLLABLE ILB;Lo;0;L;;;;;N;;;;;
+C780;HANGUL SYLLABLE ILS;Lo;0;L;;;;;N;;;;;
+C781;HANGUL SYLLABLE ILT;Lo;0;L;;;;;N;;;;;
+C782;HANGUL SYLLABLE ILP;Lo;0;L;;;;;N;;;;;
+C783;HANGUL SYLLABLE ILH;Lo;0;L;;;;;N;;;;;
+C784;HANGUL SYLLABLE IM;Lo;0;L;;;;;N;;;;;
+C785;HANGUL SYLLABLE IB;Lo;0;L;;;;;N;;;;;
+C786;HANGUL SYLLABLE IBS;Lo;0;L;;;;;N;;;;;
+C787;HANGUL SYLLABLE IS;Lo;0;L;;;;;N;;;;;
+C788;HANGUL SYLLABLE ISS;Lo;0;L;;;;;N;;;;;
+C789;HANGUL SYLLABLE ING;Lo;0;L;;;;;N;;;;;
+C78A;HANGUL SYLLABLE IJ;Lo;0;L;;;;;N;;;;;
+C78B;HANGUL SYLLABLE IC;Lo;0;L;;;;;N;;;;;
+C78C;HANGUL SYLLABLE IK;Lo;0;L;;;;;N;;;;;
+C78D;HANGUL SYLLABLE IT;Lo;0;L;;;;;N;;;;;
+C78E;HANGUL SYLLABLE IP;Lo;0;L;;;;;N;;;;;
+C78F;HANGUL SYLLABLE IH;Lo;0;L;;;;;N;;;;;
+C790;HANGUL SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+C791;HANGUL SYLLABLE JAG;Lo;0;L;;;;;N;;;;;
+C792;HANGUL SYLLABLE JAGG;Lo;0;L;;;;;N;;;;;
+C793;HANGUL SYLLABLE JAGS;Lo;0;L;;;;;N;;;;;
+C794;HANGUL SYLLABLE JAN;Lo;0;L;;;;;N;;;;;
+C795;HANGUL SYLLABLE JANI;Lo;0;L;;;;;N;;;;;
+C796;HANGUL SYLLABLE JANH;Lo;0;L;;;;;N;;;;;
+C797;HANGUL SYLLABLE JAD;Lo;0;L;;;;;N;;;;;
+C798;HANGUL SYLLABLE JAL;Lo;0;L;;;;;N;;;;;
+C799;HANGUL SYLLABLE JALG;Lo;0;L;;;;;N;;;;;
+C79A;HANGUL SYLLABLE JALM;Lo;0;L;;;;;N;;;;;
+C79B;HANGUL SYLLABLE JALB;Lo;0;L;;;;;N;;;;;
+C79C;HANGUL SYLLABLE JALS;Lo;0;L;;;;;N;;;;;
+C79D;HANGUL SYLLABLE JALT;Lo;0;L;;;;;N;;;;;
+C79E;HANGUL SYLLABLE JALP;Lo;0;L;;;;;N;;;;;
+C79F;HANGUL SYLLABLE JALH;Lo;0;L;;;;;N;;;;;
+C7A0;HANGUL SYLLABLE JAM;Lo;0;L;;;;;N;;;;;
+C7A1;HANGUL SYLLABLE JAB;Lo;0;L;;;;;N;;;;;
+C7A2;HANGUL SYLLABLE JABS;Lo;0;L;;;;;N;;;;;
+C7A3;HANGUL SYLLABLE JAS;Lo;0;L;;;;;N;;;;;
+C7A4;HANGUL SYLLABLE JASS;Lo;0;L;;;;;N;;;;;
+C7A5;HANGUL SYLLABLE JANG;Lo;0;L;;;;;N;;;;;
+C7A6;HANGUL SYLLABLE JAJ;Lo;0;L;;;;;N;;;;;
+C7A7;HANGUL SYLLABLE JAC;Lo;0;L;;;;;N;;;;;
+C7A8;HANGUL SYLLABLE JAK;Lo;0;L;;;;;N;;;;;
+C7A9;HANGUL SYLLABLE JAT;Lo;0;L;;;;;N;;;;;
+C7AA;HANGUL SYLLABLE JAP;Lo;0;L;;;;;N;;;;;
+C7AB;HANGUL SYLLABLE JAH;Lo;0;L;;;;;N;;;;;
+C7AC;HANGUL SYLLABLE JAE;Lo;0;L;;;;;N;;;;;
+C7AD;HANGUL SYLLABLE JAEG;Lo;0;L;;;;;N;;;;;
+C7AE;HANGUL SYLLABLE JAEGG;Lo;0;L;;;;;N;;;;;
+C7AF;HANGUL SYLLABLE JAEGS;Lo;0;L;;;;;N;;;;;
+C7B0;HANGUL SYLLABLE JAEN;Lo;0;L;;;;;N;;;;;
+C7B1;HANGUL SYLLABLE JAENI;Lo;0;L;;;;;N;;;;;
+C7B2;HANGUL SYLLABLE JAENH;Lo;0;L;;;;;N;;;;;
+C7B3;HANGUL SYLLABLE JAED;Lo;0;L;;;;;N;;;;;
+C7B4;HANGUL SYLLABLE JAEL;Lo;0;L;;;;;N;;;;;
+C7B5;HANGUL SYLLABLE JAELG;Lo;0;L;;;;;N;;;;;
+C7B6;HANGUL SYLLABLE JAELM;Lo;0;L;;;;;N;;;;;
+C7B7;HANGUL SYLLABLE JAELB;Lo;0;L;;;;;N;;;;;
+C7B8;HANGUL SYLLABLE JAELS;Lo;0;L;;;;;N;;;;;
+C7B9;HANGUL SYLLABLE JAELT;Lo;0;L;;;;;N;;;;;
+C7BA;HANGUL SYLLABLE JAELP;Lo;0;L;;;;;N;;;;;
+C7BB;HANGUL SYLLABLE JAELH;Lo;0;L;;;;;N;;;;;
+C7BC;HANGUL SYLLABLE JAEM;Lo;0;L;;;;;N;;;;;
+C7BD;HANGUL SYLLABLE JAEB;Lo;0;L;;;;;N;;;;;
+C7BE;HANGUL SYLLABLE JAEBS;Lo;0;L;;;;;N;;;;;
+C7BF;HANGUL SYLLABLE JAES;Lo;0;L;;;;;N;;;;;
+C7C0;HANGUL SYLLABLE JAESS;Lo;0;L;;;;;N;;;;;
+C7C1;HANGUL SYLLABLE JAENG;Lo;0;L;;;;;N;;;;;
+C7C2;HANGUL SYLLABLE JAEJ;Lo;0;L;;;;;N;;;;;
+C7C3;HANGUL SYLLABLE JAEC;Lo;0;L;;;;;N;;;;;
+C7C4;HANGUL SYLLABLE JAEK;Lo;0;L;;;;;N;;;;;
+C7C5;HANGUL SYLLABLE JAET;Lo;0;L;;;;;N;;;;;
+C7C6;HANGUL SYLLABLE JAEP;Lo;0;L;;;;;N;;;;;
+C7C7;HANGUL SYLLABLE JAEH;Lo;0;L;;;;;N;;;;;
+C7C8;HANGUL SYLLABLE JYA;Lo;0;L;;;;;N;;;;;
+C7C9;HANGUL SYLLABLE JYAG;Lo;0;L;;;;;N;;;;;
+C7CA;HANGUL SYLLABLE JYAGG;Lo;0;L;;;;;N;;;;;
+C7CB;HANGUL SYLLABLE JYAGS;Lo;0;L;;;;;N;;;;;
+C7CC;HANGUL SYLLABLE JYAN;Lo;0;L;;;;;N;;;;;
+C7CD;HANGUL SYLLABLE JYANI;Lo;0;L;;;;;N;;;;;
+C7CE;HANGUL SYLLABLE JYANH;Lo;0;L;;;;;N;;;;;
+C7CF;HANGUL SYLLABLE JYAD;Lo;0;L;;;;;N;;;;;
+C7D0;HANGUL SYLLABLE JYAL;Lo;0;L;;;;;N;;;;;
+C7D1;HANGUL SYLLABLE JYALG;Lo;0;L;;;;;N;;;;;
+C7D2;HANGUL SYLLABLE JYALM;Lo;0;L;;;;;N;;;;;
+C7D3;HANGUL SYLLABLE JYALB;Lo;0;L;;;;;N;;;;;
+C7D4;HANGUL SYLLABLE JYALS;Lo;0;L;;;;;N;;;;;
+C7D5;HANGUL SYLLABLE JYALT;Lo;0;L;;;;;N;;;;;
+C7D6;HANGUL SYLLABLE JYALP;Lo;0;L;;;;;N;;;;;
+C7D7;HANGUL SYLLABLE JYALH;Lo;0;L;;;;;N;;;;;
+C7D8;HANGUL SYLLABLE JYAM;Lo;0;L;;;;;N;;;;;
+C7D9;HANGUL SYLLABLE JYAB;Lo;0;L;;;;;N;;;;;
+C7DA;HANGUL SYLLABLE JYABS;Lo;0;L;;;;;N;;;;;
+C7DB;HANGUL SYLLABLE JYAS;Lo;0;L;;;;;N;;;;;
+C7DC;HANGUL SYLLABLE JYASS;Lo;0;L;;;;;N;;;;;
+C7DD;HANGUL SYLLABLE JYANG;Lo;0;L;;;;;N;;;;;
+C7DE;HANGUL SYLLABLE JYAJ;Lo;0;L;;;;;N;;;;;
+C7DF;HANGUL SYLLABLE JYAC;Lo;0;L;;;;;N;;;;;
+C7E0;HANGUL SYLLABLE JYAK;Lo;0;L;;;;;N;;;;;
+C7E1;HANGUL SYLLABLE JYAT;Lo;0;L;;;;;N;;;;;
+C7E2;HANGUL SYLLABLE JYAP;Lo;0;L;;;;;N;;;;;
+C7E3;HANGUL SYLLABLE JYAH;Lo;0;L;;;;;N;;;;;
+C7E4;HANGUL SYLLABLE JYAE;Lo;0;L;;;;;N;;;;;
+C7E5;HANGUL SYLLABLE JYAEG;Lo;0;L;;;;;N;;;;;
+C7E6;HANGUL SYLLABLE JYAEGG;Lo;0;L;;;;;N;;;;;
+C7E7;HANGUL SYLLABLE JYAEGS;Lo;0;L;;;;;N;;;;;
+C7E8;HANGUL SYLLABLE JYAEN;Lo;0;L;;;;;N;;;;;
+C7E9;HANGUL SYLLABLE JYAENI;Lo;0;L;;;;;N;;;;;
+C7EA;HANGUL SYLLABLE JYAENH;Lo;0;L;;;;;N;;;;;
+C7EB;HANGUL SYLLABLE JYAED;Lo;0;L;;;;;N;;;;;
+C7EC;HANGUL SYLLABLE JYAEL;Lo;0;L;;;;;N;;;;;
+C7ED;HANGUL SYLLABLE JYAELG;Lo;0;L;;;;;N;;;;;
+C7EE;HANGUL SYLLABLE JYAELM;Lo;0;L;;;;;N;;;;;
+C7EF;HANGUL SYLLABLE JYAELB;Lo;0;L;;;;;N;;;;;
+C7F0;HANGUL SYLLABLE JYAELS;Lo;0;L;;;;;N;;;;;
+C7F1;HANGUL SYLLABLE JYAELT;Lo;0;L;;;;;N;;;;;
+C7F2;HANGUL SYLLABLE JYAELP;Lo;0;L;;;;;N;;;;;
+C7F3;HANGUL SYLLABLE JYAELH;Lo;0;L;;;;;N;;;;;
+C7F4;HANGUL SYLLABLE JYAEM;Lo;0;L;;;;;N;;;;;
+C7F5;HANGUL SYLLABLE JYAEB;Lo;0;L;;;;;N;;;;;
+C7F6;HANGUL SYLLABLE JYAEBS;Lo;0;L;;;;;N;;;;;
+C7F7;HANGUL SYLLABLE JYAES;Lo;0;L;;;;;N;;;;;
+C7F8;HANGUL SYLLABLE JYAESS;Lo;0;L;;;;;N;;;;;
+C7F9;HANGUL SYLLABLE JYAENG;Lo;0;L;;;;;N;;;;;
+C7FA;HANGUL SYLLABLE JYAEJ;Lo;0;L;;;;;N;;;;;
+C7FB;HANGUL SYLLABLE JYAEC;Lo;0;L;;;;;N;;;;;
+C7FC;HANGUL SYLLABLE JYAEK;Lo;0;L;;;;;N;;;;;
+C7FD;HANGUL SYLLABLE JYAET;Lo;0;L;;;;;N;;;;;
+C7FE;HANGUL SYLLABLE JYAEP;Lo;0;L;;;;;N;;;;;
+C7FF;HANGUL SYLLABLE JYAEH;Lo;0;L;;;;;N;;;;;
+C800;HANGUL SYLLABLE JEO;Lo;0;L;;;;;N;;;;;
+C801;HANGUL SYLLABLE JEOG;Lo;0;L;;;;;N;;;;;
+C802;HANGUL SYLLABLE JEOGG;Lo;0;L;;;;;N;;;;;
+C803;HANGUL SYLLABLE JEOGS;Lo;0;L;;;;;N;;;;;
+C804;HANGUL SYLLABLE JEON;Lo;0;L;;;;;N;;;;;
+C805;HANGUL SYLLABLE JEONI;Lo;0;L;;;;;N;;;;;
+C806;HANGUL SYLLABLE JEONH;Lo;0;L;;;;;N;;;;;
+C807;HANGUL SYLLABLE JEOD;Lo;0;L;;;;;N;;;;;
+C808;HANGUL SYLLABLE JEOL;Lo;0;L;;;;;N;;;;;
+C809;HANGUL SYLLABLE JEOLG;Lo;0;L;;;;;N;;;;;
+C80A;HANGUL SYLLABLE JEOLM;Lo;0;L;;;;;N;;;;;
+C80B;HANGUL SYLLABLE JEOLB;Lo;0;L;;;;;N;;;;;
+C80C;HANGUL SYLLABLE JEOLS;Lo;0;L;;;;;N;;;;;
+C80D;HANGUL SYLLABLE JEOLT;Lo;0;L;;;;;N;;;;;
+C80E;HANGUL SYLLABLE JEOLP;Lo;0;L;;;;;N;;;;;
+C80F;HANGUL SYLLABLE JEOLH;Lo;0;L;;;;;N;;;;;
+C810;HANGUL SYLLABLE JEOM;Lo;0;L;;;;;N;;;;;
+C811;HANGUL SYLLABLE JEOB;Lo;0;L;;;;;N;;;;;
+C812;HANGUL SYLLABLE JEOBS;Lo;0;L;;;;;N;;;;;
+C813;HANGUL SYLLABLE JEOS;Lo;0;L;;;;;N;;;;;
+C814;HANGUL SYLLABLE JEOSS;Lo;0;L;;;;;N;;;;;
+C815;HANGUL SYLLABLE JEONG;Lo;0;L;;;;;N;;;;;
+C816;HANGUL SYLLABLE JEOJ;Lo;0;L;;;;;N;;;;;
+C817;HANGUL SYLLABLE JEOC;Lo;0;L;;;;;N;;;;;
+C818;HANGUL SYLLABLE JEOK;Lo;0;L;;;;;N;;;;;
+C819;HANGUL SYLLABLE JEOT;Lo;0;L;;;;;N;;;;;
+C81A;HANGUL SYLLABLE JEOP;Lo;0;L;;;;;N;;;;;
+C81B;HANGUL SYLLABLE JEOH;Lo;0;L;;;;;N;;;;;
+C81C;HANGUL SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+C81D;HANGUL SYLLABLE JEG;Lo;0;L;;;;;N;;;;;
+C81E;HANGUL SYLLABLE JEGG;Lo;0;L;;;;;N;;;;;
+C81F;HANGUL SYLLABLE JEGS;Lo;0;L;;;;;N;;;;;
+C820;HANGUL SYLLABLE JEN;Lo;0;L;;;;;N;;;;;
+C821;HANGUL SYLLABLE JENI;Lo;0;L;;;;;N;;;;;
+C822;HANGUL SYLLABLE JENH;Lo;0;L;;;;;N;;;;;
+C823;HANGUL SYLLABLE JED;Lo;0;L;;;;;N;;;;;
+C824;HANGUL SYLLABLE JEL;Lo;0;L;;;;;N;;;;;
+C825;HANGUL SYLLABLE JELG;Lo;0;L;;;;;N;;;;;
+C826;HANGUL SYLLABLE JELM;Lo;0;L;;;;;N;;;;;
+C827;HANGUL SYLLABLE JELB;Lo;0;L;;;;;N;;;;;
+C828;HANGUL SYLLABLE JELS;Lo;0;L;;;;;N;;;;;
+C829;HANGUL SYLLABLE JELT;Lo;0;L;;;;;N;;;;;
+C82A;HANGUL SYLLABLE JELP;Lo;0;L;;;;;N;;;;;
+C82B;HANGUL SYLLABLE JELH;Lo;0;L;;;;;N;;;;;
+C82C;HANGUL SYLLABLE JEM;Lo;0;L;;;;;N;;;;;
+C82D;HANGUL SYLLABLE JEB;Lo;0;L;;;;;N;;;;;
+C82E;HANGUL SYLLABLE JEBS;Lo;0;L;;;;;N;;;;;
+C82F;HANGUL SYLLABLE JES;Lo;0;L;;;;;N;;;;;
+C830;HANGUL SYLLABLE JESS;Lo;0;L;;;;;N;;;;;
+C831;HANGUL SYLLABLE JENG;Lo;0;L;;;;;N;;;;;
+C832;HANGUL SYLLABLE JEJ;Lo;0;L;;;;;N;;;;;
+C833;HANGUL SYLLABLE JEC;Lo;0;L;;;;;N;;;;;
+C834;HANGUL SYLLABLE JEK;Lo;0;L;;;;;N;;;;;
+C835;HANGUL SYLLABLE JET;Lo;0;L;;;;;N;;;;;
+C836;HANGUL SYLLABLE JEP;Lo;0;L;;;;;N;;;;;
+C837;HANGUL SYLLABLE JEH;Lo;0;L;;;;;N;;;;;
+C838;HANGUL SYLLABLE JYEO;Lo;0;L;;;;;N;;;;;
+C839;HANGUL SYLLABLE JYEOG;Lo;0;L;;;;;N;;;;;
+C83A;HANGUL SYLLABLE JYEOGG;Lo;0;L;;;;;N;;;;;
+C83B;HANGUL SYLLABLE JYEOGS;Lo;0;L;;;;;N;;;;;
+C83C;HANGUL SYLLABLE JYEON;Lo;0;L;;;;;N;;;;;
+C83D;HANGUL SYLLABLE JYEONI;Lo;0;L;;;;;N;;;;;
+C83E;HANGUL SYLLABLE JYEONH;Lo;0;L;;;;;N;;;;;
+C83F;HANGUL SYLLABLE JYEOD;Lo;0;L;;;;;N;;;;;
+C840;HANGUL SYLLABLE JYEOL;Lo;0;L;;;;;N;;;;;
+C841;HANGUL SYLLABLE JYEOLG;Lo;0;L;;;;;N;;;;;
+C842;HANGUL SYLLABLE JYEOLM;Lo;0;L;;;;;N;;;;;
+C843;HANGUL SYLLABLE JYEOLB;Lo;0;L;;;;;N;;;;;
+C844;HANGUL SYLLABLE JYEOLS;Lo;0;L;;;;;N;;;;;
+C845;HANGUL SYLLABLE JYEOLT;Lo;0;L;;;;;N;;;;;
+C846;HANGUL SYLLABLE JYEOLP;Lo;0;L;;;;;N;;;;;
+C847;HANGUL SYLLABLE JYEOLH;Lo;0;L;;;;;N;;;;;
+C848;HANGUL SYLLABLE JYEOM;Lo;0;L;;;;;N;;;;;
+C849;HANGUL SYLLABLE JYEOB;Lo;0;L;;;;;N;;;;;
+C84A;HANGUL SYLLABLE JYEOBS;Lo;0;L;;;;;N;;;;;
+C84B;HANGUL SYLLABLE JYEOS;Lo;0;L;;;;;N;;;;;
+C84C;HANGUL SYLLABLE JYEOSS;Lo;0;L;;;;;N;;;;;
+C84D;HANGUL SYLLABLE JYEONG;Lo;0;L;;;;;N;;;;;
+C84E;HANGUL SYLLABLE JYEOJ;Lo;0;L;;;;;N;;;;;
+C84F;HANGUL SYLLABLE JYEOC;Lo;0;L;;;;;N;;;;;
+C850;HANGUL SYLLABLE JYEOK;Lo;0;L;;;;;N;;;;;
+C851;HANGUL SYLLABLE JYEOT;Lo;0;L;;;;;N;;;;;
+C852;HANGUL SYLLABLE JYEOP;Lo;0;L;;;;;N;;;;;
+C853;HANGUL SYLLABLE JYEOH;Lo;0;L;;;;;N;;;;;
+C854;HANGUL SYLLABLE JYE;Lo;0;L;;;;;N;;;;;
+C855;HANGUL SYLLABLE JYEG;Lo;0;L;;;;;N;;;;;
+C856;HANGUL SYLLABLE JYEGG;Lo;0;L;;;;;N;;;;;
+C857;HANGUL SYLLABLE JYEGS;Lo;0;L;;;;;N;;;;;
+C858;HANGUL SYLLABLE JYEN;Lo;0;L;;;;;N;;;;;
+C859;HANGUL SYLLABLE JYENI;Lo;0;L;;;;;N;;;;;
+C85A;HANGUL SYLLABLE JYENH;Lo;0;L;;;;;N;;;;;
+C85B;HANGUL SYLLABLE JYED;Lo;0;L;;;;;N;;;;;
+C85C;HANGUL SYLLABLE JYEL;Lo;0;L;;;;;N;;;;;
+C85D;HANGUL SYLLABLE JYELG;Lo;0;L;;;;;N;;;;;
+C85E;HANGUL SYLLABLE JYELM;Lo;0;L;;;;;N;;;;;
+C85F;HANGUL SYLLABLE JYELB;Lo;0;L;;;;;N;;;;;
+C860;HANGUL SYLLABLE JYELS;Lo;0;L;;;;;N;;;;;
+C861;HANGUL SYLLABLE JYELT;Lo;0;L;;;;;N;;;;;
+C862;HANGUL SYLLABLE JYELP;Lo;0;L;;;;;N;;;;;
+C863;HANGUL SYLLABLE JYELH;Lo;0;L;;;;;N;;;;;
+C864;HANGUL SYLLABLE JYEM;Lo;0;L;;;;;N;;;;;
+C865;HANGUL SYLLABLE JYEB;Lo;0;L;;;;;N;;;;;
+C866;HANGUL SYLLABLE JYEBS;Lo;0;L;;;;;N;;;;;
+C867;HANGUL SYLLABLE JYES;Lo;0;L;;;;;N;;;;;
+C868;HANGUL SYLLABLE JYESS;Lo;0;L;;;;;N;;;;;
+C869;HANGUL SYLLABLE JYENG;Lo;0;L;;;;;N;;;;;
+C86A;HANGUL SYLLABLE JYEJ;Lo;0;L;;;;;N;;;;;
+C86B;HANGUL SYLLABLE JYEC;Lo;0;L;;;;;N;;;;;
+C86C;HANGUL SYLLABLE JYEK;Lo;0;L;;;;;N;;;;;
+C86D;HANGUL SYLLABLE JYET;Lo;0;L;;;;;N;;;;;
+C86E;HANGUL SYLLABLE JYEP;Lo;0;L;;;;;N;;;;;
+C86F;HANGUL SYLLABLE JYEH;Lo;0;L;;;;;N;;;;;
+C870;HANGUL SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+C871;HANGUL SYLLABLE JOG;Lo;0;L;;;;;N;;;;;
+C872;HANGUL SYLLABLE JOGG;Lo;0;L;;;;;N;;;;;
+C873;HANGUL SYLLABLE JOGS;Lo;0;L;;;;;N;;;;;
+C874;HANGUL SYLLABLE JON;Lo;0;L;;;;;N;;;;;
+C875;HANGUL SYLLABLE JONI;Lo;0;L;;;;;N;;;;;
+C876;HANGUL SYLLABLE JONH;Lo;0;L;;;;;N;;;;;
+C877;HANGUL SYLLABLE JOD;Lo;0;L;;;;;N;;;;;
+C878;HANGUL SYLLABLE JOL;Lo;0;L;;;;;N;;;;;
+C879;HANGUL SYLLABLE JOLG;Lo;0;L;;;;;N;;;;;
+C87A;HANGUL SYLLABLE JOLM;Lo;0;L;;;;;N;;;;;
+C87B;HANGUL SYLLABLE JOLB;Lo;0;L;;;;;N;;;;;
+C87C;HANGUL SYLLABLE JOLS;Lo;0;L;;;;;N;;;;;
+C87D;HANGUL SYLLABLE JOLT;Lo;0;L;;;;;N;;;;;
+C87E;HANGUL SYLLABLE JOLP;Lo;0;L;;;;;N;;;;;
+C87F;HANGUL SYLLABLE JOLH;Lo;0;L;;;;;N;;;;;
+C880;HANGUL SYLLABLE JOM;Lo;0;L;;;;;N;;;;;
+C881;HANGUL SYLLABLE JOB;Lo;0;L;;;;;N;;;;;
+C882;HANGUL SYLLABLE JOBS;Lo;0;L;;;;;N;;;;;
+C883;HANGUL SYLLABLE JOS;Lo;0;L;;;;;N;;;;;
+C884;HANGUL SYLLABLE JOSS;Lo;0;L;;;;;N;;;;;
+C885;HANGUL SYLLABLE JONG;Lo;0;L;;;;;N;;;;;
+C886;HANGUL SYLLABLE JOJ;Lo;0;L;;;;;N;;;;;
+C887;HANGUL SYLLABLE JOC;Lo;0;L;;;;;N;;;;;
+C888;HANGUL SYLLABLE JOK;Lo;0;L;;;;;N;;;;;
+C889;HANGUL SYLLABLE JOT;Lo;0;L;;;;;N;;;;;
+C88A;HANGUL SYLLABLE JOP;Lo;0;L;;;;;N;;;;;
+C88B;HANGUL SYLLABLE JOH;Lo;0;L;;;;;N;;;;;
+C88C;HANGUL SYLLABLE JWA;Lo;0;L;;;;;N;;;;;
+C88D;HANGUL SYLLABLE JWAG;Lo;0;L;;;;;N;;;;;
+C88E;HANGUL SYLLABLE JWAGG;Lo;0;L;;;;;N;;;;;
+C88F;HANGUL SYLLABLE JWAGS;Lo;0;L;;;;;N;;;;;
+C890;HANGUL SYLLABLE JWAN;Lo;0;L;;;;;N;;;;;
+C891;HANGUL SYLLABLE JWANI;Lo;0;L;;;;;N;;;;;
+C892;HANGUL SYLLABLE JWANH;Lo;0;L;;;;;N;;;;;
+C893;HANGUL SYLLABLE JWAD;Lo;0;L;;;;;N;;;;;
+C894;HANGUL SYLLABLE JWAL;Lo;0;L;;;;;N;;;;;
+C895;HANGUL SYLLABLE JWALG;Lo;0;L;;;;;N;;;;;
+C896;HANGUL SYLLABLE JWALM;Lo;0;L;;;;;N;;;;;
+C897;HANGUL SYLLABLE JWALB;Lo;0;L;;;;;N;;;;;
+C898;HANGUL SYLLABLE JWALS;Lo;0;L;;;;;N;;;;;
+C899;HANGUL SYLLABLE JWALT;Lo;0;L;;;;;N;;;;;
+C89A;HANGUL SYLLABLE JWALP;Lo;0;L;;;;;N;;;;;
+C89B;HANGUL SYLLABLE JWALH;Lo;0;L;;;;;N;;;;;
+C89C;HANGUL SYLLABLE JWAM;Lo;0;L;;;;;N;;;;;
+C89D;HANGUL SYLLABLE JWAB;Lo;0;L;;;;;N;;;;;
+C89E;HANGUL SYLLABLE JWABS;Lo;0;L;;;;;N;;;;;
+C89F;HANGUL SYLLABLE JWAS;Lo;0;L;;;;;N;;;;;
+C8A0;HANGUL SYLLABLE JWASS;Lo;0;L;;;;;N;;;;;
+C8A1;HANGUL SYLLABLE JWANG;Lo;0;L;;;;;N;;;;;
+C8A2;HANGUL SYLLABLE JWAJ;Lo;0;L;;;;;N;;;;;
+C8A3;HANGUL SYLLABLE JWAC;Lo;0;L;;;;;N;;;;;
+C8A4;HANGUL SYLLABLE JWAK;Lo;0;L;;;;;N;;;;;
+C8A5;HANGUL SYLLABLE JWAT;Lo;0;L;;;;;N;;;;;
+C8A6;HANGUL SYLLABLE JWAP;Lo;0;L;;;;;N;;;;;
+C8A7;HANGUL SYLLABLE JWAH;Lo;0;L;;;;;N;;;;;
+C8A8;HANGUL SYLLABLE JWAE;Lo;0;L;;;;;N;;;;;
+C8A9;HANGUL SYLLABLE JWAEG;Lo;0;L;;;;;N;;;;;
+C8AA;HANGUL SYLLABLE JWAEGG;Lo;0;L;;;;;N;;;;;
+C8AB;HANGUL SYLLABLE JWAEGS;Lo;0;L;;;;;N;;;;;
+C8AC;HANGUL SYLLABLE JWAEN;Lo;0;L;;;;;N;;;;;
+C8AD;HANGUL SYLLABLE JWAENI;Lo;0;L;;;;;N;;;;;
+C8AE;HANGUL SYLLABLE JWAENH;Lo;0;L;;;;;N;;;;;
+C8AF;HANGUL SYLLABLE JWAED;Lo;0;L;;;;;N;;;;;
+C8B0;HANGUL SYLLABLE JWAEL;Lo;0;L;;;;;N;;;;;
+C8B1;HANGUL SYLLABLE JWAELG;Lo;0;L;;;;;N;;;;;
+C8B2;HANGUL SYLLABLE JWAELM;Lo;0;L;;;;;N;;;;;
+C8B3;HANGUL SYLLABLE JWAELB;Lo;0;L;;;;;N;;;;;
+C8B4;HANGUL SYLLABLE JWAELS;Lo;0;L;;;;;N;;;;;
+C8B5;HANGUL SYLLABLE JWAELT;Lo;0;L;;;;;N;;;;;
+C8B6;HANGUL SYLLABLE JWAELP;Lo;0;L;;;;;N;;;;;
+C8B7;HANGUL SYLLABLE JWAELH;Lo;0;L;;;;;N;;;;;
+C8B8;HANGUL SYLLABLE JWAEM;Lo;0;L;;;;;N;;;;;
+C8B9;HANGUL SYLLABLE JWAEB;Lo;0;L;;;;;N;;;;;
+C8BA;HANGUL SYLLABLE JWAEBS;Lo;0;L;;;;;N;;;;;
+C8BB;HANGUL SYLLABLE JWAES;Lo;0;L;;;;;N;;;;;
+C8BC;HANGUL SYLLABLE JWAESS;Lo;0;L;;;;;N;;;;;
+C8BD;HANGUL SYLLABLE JWAENG;Lo;0;L;;;;;N;;;;;
+C8BE;HANGUL SYLLABLE JWAEJ;Lo;0;L;;;;;N;;;;;
+C8BF;HANGUL SYLLABLE JWAEC;Lo;0;L;;;;;N;;;;;
+C8C0;HANGUL SYLLABLE JWAEK;Lo;0;L;;;;;N;;;;;
+C8C1;HANGUL SYLLABLE JWAET;Lo;0;L;;;;;N;;;;;
+C8C2;HANGUL SYLLABLE JWAEP;Lo;0;L;;;;;N;;;;;
+C8C3;HANGUL SYLLABLE JWAEH;Lo;0;L;;;;;N;;;;;
+C8C4;HANGUL SYLLABLE JOE;Lo;0;L;;;;;N;;;;;
+C8C5;HANGUL SYLLABLE JOEG;Lo;0;L;;;;;N;;;;;
+C8C6;HANGUL SYLLABLE JOEGG;Lo;0;L;;;;;N;;;;;
+C8C7;HANGUL SYLLABLE JOEGS;Lo;0;L;;;;;N;;;;;
+C8C8;HANGUL SYLLABLE JOEN;Lo;0;L;;;;;N;;;;;
+C8C9;HANGUL SYLLABLE JOENI;Lo;0;L;;;;;N;;;;;
+C8CA;HANGUL SYLLABLE JOENH;Lo;0;L;;;;;N;;;;;
+C8CB;HANGUL SYLLABLE JOED;Lo;0;L;;;;;N;;;;;
+C8CC;HANGUL SYLLABLE JOEL;Lo;0;L;;;;;N;;;;;
+C8CD;HANGUL SYLLABLE JOELG;Lo;0;L;;;;;N;;;;;
+C8CE;HANGUL SYLLABLE JOELM;Lo;0;L;;;;;N;;;;;
+C8CF;HANGUL SYLLABLE JOELB;Lo;0;L;;;;;N;;;;;
+C8D0;HANGUL SYLLABLE JOELS;Lo;0;L;;;;;N;;;;;
+C8D1;HANGUL SYLLABLE JOELT;Lo;0;L;;;;;N;;;;;
+C8D2;HANGUL SYLLABLE JOELP;Lo;0;L;;;;;N;;;;;
+C8D3;HANGUL SYLLABLE JOELH;Lo;0;L;;;;;N;;;;;
+C8D4;HANGUL SYLLABLE JOEM;Lo;0;L;;;;;N;;;;;
+C8D5;HANGUL SYLLABLE JOEB;Lo;0;L;;;;;N;;;;;
+C8D6;HANGUL SYLLABLE JOEBS;Lo;0;L;;;;;N;;;;;
+C8D7;HANGUL SYLLABLE JOES;Lo;0;L;;;;;N;;;;;
+C8D8;HANGUL SYLLABLE JOESS;Lo;0;L;;;;;N;;;;;
+C8D9;HANGUL SYLLABLE JOENG;Lo;0;L;;;;;N;;;;;
+C8DA;HANGUL SYLLABLE JOEJ;Lo;0;L;;;;;N;;;;;
+C8DB;HANGUL SYLLABLE JOEC;Lo;0;L;;;;;N;;;;;
+C8DC;HANGUL SYLLABLE JOEK;Lo;0;L;;;;;N;;;;;
+C8DD;HANGUL SYLLABLE JOET;Lo;0;L;;;;;N;;;;;
+C8DE;HANGUL SYLLABLE JOEP;Lo;0;L;;;;;N;;;;;
+C8DF;HANGUL SYLLABLE JOEH;Lo;0;L;;;;;N;;;;;
+C8E0;HANGUL SYLLABLE JYO;Lo;0;L;;;;;N;;;;;
+C8E1;HANGUL SYLLABLE JYOG;Lo;0;L;;;;;N;;;;;
+C8E2;HANGUL SYLLABLE JYOGG;Lo;0;L;;;;;N;;;;;
+C8E3;HANGUL SYLLABLE JYOGS;Lo;0;L;;;;;N;;;;;
+C8E4;HANGUL SYLLABLE JYON;Lo;0;L;;;;;N;;;;;
+C8E5;HANGUL SYLLABLE JYONI;Lo;0;L;;;;;N;;;;;
+C8E6;HANGUL SYLLABLE JYONH;Lo;0;L;;;;;N;;;;;
+C8E7;HANGUL SYLLABLE JYOD;Lo;0;L;;;;;N;;;;;
+C8E8;HANGUL SYLLABLE JYOL;Lo;0;L;;;;;N;;;;;
+C8E9;HANGUL SYLLABLE JYOLG;Lo;0;L;;;;;N;;;;;
+C8EA;HANGUL SYLLABLE JYOLM;Lo;0;L;;;;;N;;;;;
+C8EB;HANGUL SYLLABLE JYOLB;Lo;0;L;;;;;N;;;;;
+C8EC;HANGUL SYLLABLE JYOLS;Lo;0;L;;;;;N;;;;;
+C8ED;HANGUL SYLLABLE JYOLT;Lo;0;L;;;;;N;;;;;
+C8EE;HANGUL SYLLABLE JYOLP;Lo;0;L;;;;;N;;;;;
+C8EF;HANGUL SYLLABLE JYOLH;Lo;0;L;;;;;N;;;;;
+C8F0;HANGUL SYLLABLE JYOM;Lo;0;L;;;;;N;;;;;
+C8F1;HANGUL SYLLABLE JYOB;Lo;0;L;;;;;N;;;;;
+C8F2;HANGUL SYLLABLE JYOBS;Lo;0;L;;;;;N;;;;;
+C8F3;HANGUL SYLLABLE JYOS;Lo;0;L;;;;;N;;;;;
+C8F4;HANGUL SYLLABLE JYOSS;Lo;0;L;;;;;N;;;;;
+C8F5;HANGUL SYLLABLE JYONG;Lo;0;L;;;;;N;;;;;
+C8F6;HANGUL SYLLABLE JYOJ;Lo;0;L;;;;;N;;;;;
+C8F7;HANGUL SYLLABLE JYOC;Lo;0;L;;;;;N;;;;;
+C8F8;HANGUL SYLLABLE JYOK;Lo;0;L;;;;;N;;;;;
+C8F9;HANGUL SYLLABLE JYOT;Lo;0;L;;;;;N;;;;;
+C8FA;HANGUL SYLLABLE JYOP;Lo;0;L;;;;;N;;;;;
+C8FB;HANGUL SYLLABLE JYOH;Lo;0;L;;;;;N;;;;;
+C8FC;HANGUL SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+C8FD;HANGUL SYLLABLE JUG;Lo;0;L;;;;;N;;;;;
+C8FE;HANGUL SYLLABLE JUGG;Lo;0;L;;;;;N;;;;;
+C8FF;HANGUL SYLLABLE JUGS;Lo;0;L;;;;;N;;;;;
+C900;HANGUL SYLLABLE JUN;Lo;0;L;;;;;N;;;;;
+C901;HANGUL SYLLABLE JUNI;Lo;0;L;;;;;N;;;;;
+C902;HANGUL SYLLABLE JUNH;Lo;0;L;;;;;N;;;;;
+C903;HANGUL SYLLABLE JUD;Lo;0;L;;;;;N;;;;;
+C904;HANGUL SYLLABLE JUL;Lo;0;L;;;;;N;;;;;
+C905;HANGUL SYLLABLE JULG;Lo;0;L;;;;;N;;;;;
+C906;HANGUL SYLLABLE JULM;Lo;0;L;;;;;N;;;;;
+C907;HANGUL SYLLABLE JULB;Lo;0;L;;;;;N;;;;;
+C908;HANGUL SYLLABLE JULS;Lo;0;L;;;;;N;;;;;
+C909;HANGUL SYLLABLE JULT;Lo;0;L;;;;;N;;;;;
+C90A;HANGUL SYLLABLE JULP;Lo;0;L;;;;;N;;;;;
+C90B;HANGUL SYLLABLE JULH;Lo;0;L;;;;;N;;;;;
+C90C;HANGUL SYLLABLE JUM;Lo;0;L;;;;;N;;;;;
+C90D;HANGUL SYLLABLE JUB;Lo;0;L;;;;;N;;;;;
+C90E;HANGUL SYLLABLE JUBS;Lo;0;L;;;;;N;;;;;
+C90F;HANGUL SYLLABLE JUS;Lo;0;L;;;;;N;;;;;
+C910;HANGUL SYLLABLE JUSS;Lo;0;L;;;;;N;;;;;
+C911;HANGUL SYLLABLE JUNG;Lo;0;L;;;;;N;;;;;
+C912;HANGUL SYLLABLE JUJ;Lo;0;L;;;;;N;;;;;
+C913;HANGUL SYLLABLE JUC;Lo;0;L;;;;;N;;;;;
+C914;HANGUL SYLLABLE JUK;Lo;0;L;;;;;N;;;;;
+C915;HANGUL SYLLABLE JUT;Lo;0;L;;;;;N;;;;;
+C916;HANGUL SYLLABLE JUP;Lo;0;L;;;;;N;;;;;
+C917;HANGUL SYLLABLE JUH;Lo;0;L;;;;;N;;;;;
+C918;HANGUL SYLLABLE JWEO;Lo;0;L;;;;;N;;;;;
+C919;HANGUL SYLLABLE JWEOG;Lo;0;L;;;;;N;;;;;
+C91A;HANGUL SYLLABLE JWEOGG;Lo;0;L;;;;;N;;;;;
+C91B;HANGUL SYLLABLE JWEOGS;Lo;0;L;;;;;N;;;;;
+C91C;HANGUL SYLLABLE JWEON;Lo;0;L;;;;;N;;;;;
+C91D;HANGUL SYLLABLE JWEONI;Lo;0;L;;;;;N;;;;;
+C91E;HANGUL SYLLABLE JWEONH;Lo;0;L;;;;;N;;;;;
+C91F;HANGUL SYLLABLE JWEOD;Lo;0;L;;;;;N;;;;;
+C920;HANGUL SYLLABLE JWEOL;Lo;0;L;;;;;N;;;;;
+C921;HANGUL SYLLABLE JWEOLG;Lo;0;L;;;;;N;;;;;
+C922;HANGUL SYLLABLE JWEOLM;Lo;0;L;;;;;N;;;;;
+C923;HANGUL SYLLABLE JWEOLB;Lo;0;L;;;;;N;;;;;
+C924;HANGUL SYLLABLE JWEOLS;Lo;0;L;;;;;N;;;;;
+C925;HANGUL SYLLABLE JWEOLT;Lo;0;L;;;;;N;;;;;
+C926;HANGUL SYLLABLE JWEOLP;Lo;0;L;;;;;N;;;;;
+C927;HANGUL SYLLABLE JWEOLH;Lo;0;L;;;;;N;;;;;
+C928;HANGUL SYLLABLE JWEOM;Lo;0;L;;;;;N;;;;;
+C929;HANGUL SYLLABLE JWEOB;Lo;0;L;;;;;N;;;;;
+C92A;HANGUL SYLLABLE JWEOBS;Lo;0;L;;;;;N;;;;;
+C92B;HANGUL SYLLABLE JWEOS;Lo;0;L;;;;;N;;;;;
+C92C;HANGUL SYLLABLE JWEOSS;Lo;0;L;;;;;N;;;;;
+C92D;HANGUL SYLLABLE JWEONG;Lo;0;L;;;;;N;;;;;
+C92E;HANGUL SYLLABLE JWEOJ;Lo;0;L;;;;;N;;;;;
+C92F;HANGUL SYLLABLE JWEOC;Lo;0;L;;;;;N;;;;;
+C930;HANGUL SYLLABLE JWEOK;Lo;0;L;;;;;N;;;;;
+C931;HANGUL SYLLABLE JWEOT;Lo;0;L;;;;;N;;;;;
+C932;HANGUL SYLLABLE JWEOP;Lo;0;L;;;;;N;;;;;
+C933;HANGUL SYLLABLE JWEOH;Lo;0;L;;;;;N;;;;;
+C934;HANGUL SYLLABLE JWE;Lo;0;L;;;;;N;;;;;
+C935;HANGUL SYLLABLE JWEG;Lo;0;L;;;;;N;;;;;
+C936;HANGUL SYLLABLE JWEGG;Lo;0;L;;;;;N;;;;;
+C937;HANGUL SYLLABLE JWEGS;Lo;0;L;;;;;N;;;;;
+C938;HANGUL SYLLABLE JWEN;Lo;0;L;;;;;N;;;;;
+C939;HANGUL SYLLABLE JWENI;Lo;0;L;;;;;N;;;;;
+C93A;HANGUL SYLLABLE JWENH;Lo;0;L;;;;;N;;;;;
+C93B;HANGUL SYLLABLE JWED;Lo;0;L;;;;;N;;;;;
+C93C;HANGUL SYLLABLE JWEL;Lo;0;L;;;;;N;;;;;
+C93D;HANGUL SYLLABLE JWELG;Lo;0;L;;;;;N;;;;;
+C93E;HANGUL SYLLABLE JWELM;Lo;0;L;;;;;N;;;;;
+C93F;HANGUL SYLLABLE JWELB;Lo;0;L;;;;;N;;;;;
+C940;HANGUL SYLLABLE JWELS;Lo;0;L;;;;;N;;;;;
+C941;HANGUL SYLLABLE JWELT;Lo;0;L;;;;;N;;;;;
+C942;HANGUL SYLLABLE JWELP;Lo;0;L;;;;;N;;;;;
+C943;HANGUL SYLLABLE JWELH;Lo;0;L;;;;;N;;;;;
+C944;HANGUL SYLLABLE JWEM;Lo;0;L;;;;;N;;;;;
+C945;HANGUL SYLLABLE JWEB;Lo;0;L;;;;;N;;;;;
+C946;HANGUL SYLLABLE JWEBS;Lo;0;L;;;;;N;;;;;
+C947;HANGUL SYLLABLE JWES;Lo;0;L;;;;;N;;;;;
+C948;HANGUL SYLLABLE JWESS;Lo;0;L;;;;;N;;;;;
+C949;HANGUL SYLLABLE JWENG;Lo;0;L;;;;;N;;;;;
+C94A;HANGUL SYLLABLE JWEJ;Lo;0;L;;;;;N;;;;;
+C94B;HANGUL SYLLABLE JWEC;Lo;0;L;;;;;N;;;;;
+C94C;HANGUL SYLLABLE JWEK;Lo;0;L;;;;;N;;;;;
+C94D;HANGUL SYLLABLE JWET;Lo;0;L;;;;;N;;;;;
+C94E;HANGUL SYLLABLE JWEP;Lo;0;L;;;;;N;;;;;
+C94F;HANGUL SYLLABLE JWEH;Lo;0;L;;;;;N;;;;;
+C950;HANGUL SYLLABLE JWI;Lo;0;L;;;;;N;;;;;
+C951;HANGUL SYLLABLE JWIG;Lo;0;L;;;;;N;;;;;
+C952;HANGUL SYLLABLE JWIGG;Lo;0;L;;;;;N;;;;;
+C953;HANGUL SYLLABLE JWIGS;Lo;0;L;;;;;N;;;;;
+C954;HANGUL SYLLABLE JWIN;Lo;0;L;;;;;N;;;;;
+C955;HANGUL SYLLABLE JWINI;Lo;0;L;;;;;N;;;;;
+C956;HANGUL SYLLABLE JWINH;Lo;0;L;;;;;N;;;;;
+C957;HANGUL SYLLABLE JWID;Lo;0;L;;;;;N;;;;;
+C958;HANGUL SYLLABLE JWIL;Lo;0;L;;;;;N;;;;;
+C959;HANGUL SYLLABLE JWILG;Lo;0;L;;;;;N;;;;;
+C95A;HANGUL SYLLABLE JWILM;Lo;0;L;;;;;N;;;;;
+C95B;HANGUL SYLLABLE JWILB;Lo;0;L;;;;;N;;;;;
+C95C;HANGUL SYLLABLE JWILS;Lo;0;L;;;;;N;;;;;
+C95D;HANGUL SYLLABLE JWILT;Lo;0;L;;;;;N;;;;;
+C95E;HANGUL SYLLABLE JWILP;Lo;0;L;;;;;N;;;;;
+C95F;HANGUL SYLLABLE JWILH;Lo;0;L;;;;;N;;;;;
+C960;HANGUL SYLLABLE JWIM;Lo;0;L;;;;;N;;;;;
+C961;HANGUL SYLLABLE JWIB;Lo;0;L;;;;;N;;;;;
+C962;HANGUL SYLLABLE JWIBS;Lo;0;L;;;;;N;;;;;
+C963;HANGUL SYLLABLE JWIS;Lo;0;L;;;;;N;;;;;
+C964;HANGUL SYLLABLE JWISS;Lo;0;L;;;;;N;;;;;
+C965;HANGUL SYLLABLE JWING;Lo;0;L;;;;;N;;;;;
+C966;HANGUL SYLLABLE JWIJ;Lo;0;L;;;;;N;;;;;
+C967;HANGUL SYLLABLE JWIC;Lo;0;L;;;;;N;;;;;
+C968;HANGUL SYLLABLE JWIK;Lo;0;L;;;;;N;;;;;
+C969;HANGUL SYLLABLE JWIT;Lo;0;L;;;;;N;;;;;
+C96A;HANGUL SYLLABLE JWIP;Lo;0;L;;;;;N;;;;;
+C96B;HANGUL SYLLABLE JWIH;Lo;0;L;;;;;N;;;;;
+C96C;HANGUL SYLLABLE JYU;Lo;0;L;;;;;N;;;;;
+C96D;HANGUL SYLLABLE JYUG;Lo;0;L;;;;;N;;;;;
+C96E;HANGUL SYLLABLE JYUGG;Lo;0;L;;;;;N;;;;;
+C96F;HANGUL SYLLABLE JYUGS;Lo;0;L;;;;;N;;;;;
+C970;HANGUL SYLLABLE JYUN;Lo;0;L;;;;;N;;;;;
+C971;HANGUL SYLLABLE JYUNI;Lo;0;L;;;;;N;;;;;
+C972;HANGUL SYLLABLE JYUNH;Lo;0;L;;;;;N;;;;;
+C973;HANGUL SYLLABLE JYUD;Lo;0;L;;;;;N;;;;;
+C974;HANGUL SYLLABLE JYUL;Lo;0;L;;;;;N;;;;;
+C975;HANGUL SYLLABLE JYULG;Lo;0;L;;;;;N;;;;;
+C976;HANGUL SYLLABLE JYULM;Lo;0;L;;;;;N;;;;;
+C977;HANGUL SYLLABLE JYULB;Lo;0;L;;;;;N;;;;;
+C978;HANGUL SYLLABLE JYULS;Lo;0;L;;;;;N;;;;;
+C979;HANGUL SYLLABLE JYULT;Lo;0;L;;;;;N;;;;;
+C97A;HANGUL SYLLABLE JYULP;Lo;0;L;;;;;N;;;;;
+C97B;HANGUL SYLLABLE JYULH;Lo;0;L;;;;;N;;;;;
+C97C;HANGUL SYLLABLE JYUM;Lo;0;L;;;;;N;;;;;
+C97D;HANGUL SYLLABLE JYUB;Lo;0;L;;;;;N;;;;;
+C97E;HANGUL SYLLABLE JYUBS;Lo;0;L;;;;;N;;;;;
+C97F;HANGUL SYLLABLE JYUS;Lo;0;L;;;;;N;;;;;
+C980;HANGUL SYLLABLE JYUSS;Lo;0;L;;;;;N;;;;;
+C981;HANGUL SYLLABLE JYUNG;Lo;0;L;;;;;N;;;;;
+C982;HANGUL SYLLABLE JYUJ;Lo;0;L;;;;;N;;;;;
+C983;HANGUL SYLLABLE JYUC;Lo;0;L;;;;;N;;;;;
+C984;HANGUL SYLLABLE JYUK;Lo;0;L;;;;;N;;;;;
+C985;HANGUL SYLLABLE JYUT;Lo;0;L;;;;;N;;;;;
+C986;HANGUL SYLLABLE JYUP;Lo;0;L;;;;;N;;;;;
+C987;HANGUL SYLLABLE JYUH;Lo;0;L;;;;;N;;;;;
+C988;HANGUL SYLLABLE JEU;Lo;0;L;;;;;N;;;;;
+C989;HANGUL SYLLABLE JEUG;Lo;0;L;;;;;N;;;;;
+C98A;HANGUL SYLLABLE JEUGG;Lo;0;L;;;;;N;;;;;
+C98B;HANGUL SYLLABLE JEUGS;Lo;0;L;;;;;N;;;;;
+C98C;HANGUL SYLLABLE JEUN;Lo;0;L;;;;;N;;;;;
+C98D;HANGUL SYLLABLE JEUNI;Lo;0;L;;;;;N;;;;;
+C98E;HANGUL SYLLABLE JEUNH;Lo;0;L;;;;;N;;;;;
+C98F;HANGUL SYLLABLE JEUD;Lo;0;L;;;;;N;;;;;
+C990;HANGUL SYLLABLE JEUL;Lo;0;L;;;;;N;;;;;
+C991;HANGUL SYLLABLE JEULG;Lo;0;L;;;;;N;;;;;
+C992;HANGUL SYLLABLE JEULM;Lo;0;L;;;;;N;;;;;
+C993;HANGUL SYLLABLE JEULB;Lo;0;L;;;;;N;;;;;
+C994;HANGUL SYLLABLE JEULS;Lo;0;L;;;;;N;;;;;
+C995;HANGUL SYLLABLE JEULT;Lo;0;L;;;;;N;;;;;
+C996;HANGUL SYLLABLE JEULP;Lo;0;L;;;;;N;;;;;
+C997;HANGUL SYLLABLE JEULH;Lo;0;L;;;;;N;;;;;
+C998;HANGUL SYLLABLE JEUM;Lo;0;L;;;;;N;;;;;
+C999;HANGUL SYLLABLE JEUB;Lo;0;L;;;;;N;;;;;
+C99A;HANGUL SYLLABLE JEUBS;Lo;0;L;;;;;N;;;;;
+C99B;HANGUL SYLLABLE JEUS;Lo;0;L;;;;;N;;;;;
+C99C;HANGUL SYLLABLE JEUSS;Lo;0;L;;;;;N;;;;;
+C99D;HANGUL SYLLABLE JEUNG;Lo;0;L;;;;;N;;;;;
+C99E;HANGUL SYLLABLE JEUJ;Lo;0;L;;;;;N;;;;;
+C99F;HANGUL SYLLABLE JEUC;Lo;0;L;;;;;N;;;;;
+C9A0;HANGUL SYLLABLE JEUK;Lo;0;L;;;;;N;;;;;
+C9A1;HANGUL SYLLABLE JEUT;Lo;0;L;;;;;N;;;;;
+C9A2;HANGUL SYLLABLE JEUP;Lo;0;L;;;;;N;;;;;
+C9A3;HANGUL SYLLABLE JEUH;Lo;0;L;;;;;N;;;;;
+C9A4;HANGUL SYLLABLE JYI;Lo;0;L;;;;;N;;;;;
+C9A5;HANGUL SYLLABLE JYIG;Lo;0;L;;;;;N;;;;;
+C9A6;HANGUL SYLLABLE JYIGG;Lo;0;L;;;;;N;;;;;
+C9A7;HANGUL SYLLABLE JYIGS;Lo;0;L;;;;;N;;;;;
+C9A8;HANGUL SYLLABLE JYIN;Lo;0;L;;;;;N;;;;;
+C9A9;HANGUL SYLLABLE JYINI;Lo;0;L;;;;;N;;;;;
+C9AA;HANGUL SYLLABLE JYINH;Lo;0;L;;;;;N;;;;;
+C9AB;HANGUL SYLLABLE JYID;Lo;0;L;;;;;N;;;;;
+C9AC;HANGUL SYLLABLE JYIL;Lo;0;L;;;;;N;;;;;
+C9AD;HANGUL SYLLABLE JYILG;Lo;0;L;;;;;N;;;;;
+C9AE;HANGUL SYLLABLE JYILM;Lo;0;L;;;;;N;;;;;
+C9AF;HANGUL SYLLABLE JYILB;Lo;0;L;;;;;N;;;;;
+C9B0;HANGUL SYLLABLE JYILS;Lo;0;L;;;;;N;;;;;
+C9B1;HANGUL SYLLABLE JYILT;Lo;0;L;;;;;N;;;;;
+C9B2;HANGUL SYLLABLE JYILP;Lo;0;L;;;;;N;;;;;
+C9B3;HANGUL SYLLABLE JYILH;Lo;0;L;;;;;N;;;;;
+C9B4;HANGUL SYLLABLE JYIM;Lo;0;L;;;;;N;;;;;
+C9B5;HANGUL SYLLABLE JYIB;Lo;0;L;;;;;N;;;;;
+C9B6;HANGUL SYLLABLE JYIBS;Lo;0;L;;;;;N;;;;;
+C9B7;HANGUL SYLLABLE JYIS;Lo;0;L;;;;;N;;;;;
+C9B8;HANGUL SYLLABLE JYISS;Lo;0;L;;;;;N;;;;;
+C9B9;HANGUL SYLLABLE JYING;Lo;0;L;;;;;N;;;;;
+C9BA;HANGUL SYLLABLE JYIJ;Lo;0;L;;;;;N;;;;;
+C9BB;HANGUL SYLLABLE JYIC;Lo;0;L;;;;;N;;;;;
+C9BC;HANGUL SYLLABLE JYIK;Lo;0;L;;;;;N;;;;;
+C9BD;HANGUL SYLLABLE JYIT;Lo;0;L;;;;;N;;;;;
+C9BE;HANGUL SYLLABLE JYIP;Lo;0;L;;;;;N;;;;;
+C9BF;HANGUL SYLLABLE JYIH;Lo;0;L;;;;;N;;;;;
+C9C0;HANGUL SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+C9C1;HANGUL SYLLABLE JIG;Lo;0;L;;;;;N;;;;;
+C9C2;HANGUL SYLLABLE JIGG;Lo;0;L;;;;;N;;;;;
+C9C3;HANGUL SYLLABLE JIGS;Lo;0;L;;;;;N;;;;;
+C9C4;HANGUL SYLLABLE JIN;Lo;0;L;;;;;N;;;;;
+C9C5;HANGUL SYLLABLE JINI;Lo;0;L;;;;;N;;;;;
+C9C6;HANGUL SYLLABLE JINH;Lo;0;L;;;;;N;;;;;
+C9C7;HANGUL SYLLABLE JID;Lo;0;L;;;;;N;;;;;
+C9C8;HANGUL SYLLABLE JIL;Lo;0;L;;;;;N;;;;;
+C9C9;HANGUL SYLLABLE JILG;Lo;0;L;;;;;N;;;;;
+C9CA;HANGUL SYLLABLE JILM;Lo;0;L;;;;;N;;;;;
+C9CB;HANGUL SYLLABLE JILB;Lo;0;L;;;;;N;;;;;
+C9CC;HANGUL SYLLABLE JILS;Lo;0;L;;;;;N;;;;;
+C9CD;HANGUL SYLLABLE JILT;Lo;0;L;;;;;N;;;;;
+C9CE;HANGUL SYLLABLE JILP;Lo;0;L;;;;;N;;;;;
+C9CF;HANGUL SYLLABLE JILH;Lo;0;L;;;;;N;;;;;
+C9D0;HANGUL SYLLABLE JIM;Lo;0;L;;;;;N;;;;;
+C9D1;HANGUL SYLLABLE JIB;Lo;0;L;;;;;N;;;;;
+C9D2;HANGUL SYLLABLE JIBS;Lo;0;L;;;;;N;;;;;
+C9D3;HANGUL SYLLABLE JIS;Lo;0;L;;;;;N;;;;;
+C9D4;HANGUL SYLLABLE JISS;Lo;0;L;;;;;N;;;;;
+C9D5;HANGUL SYLLABLE JING;Lo;0;L;;;;;N;;;;;
+C9D6;HANGUL SYLLABLE JIJ;Lo;0;L;;;;;N;;;;;
+C9D7;HANGUL SYLLABLE JIC;Lo;0;L;;;;;N;;;;;
+C9D8;HANGUL SYLLABLE JIK;Lo;0;L;;;;;N;;;;;
+C9D9;HANGUL SYLLABLE JIT;Lo;0;L;;;;;N;;;;;
+C9DA;HANGUL SYLLABLE JIP;Lo;0;L;;;;;N;;;;;
+C9DB;HANGUL SYLLABLE JIH;Lo;0;L;;;;;N;;;;;
+C9DC;HANGUL SYLLABLE JJA;Lo;0;L;;;;;N;;;;;
+C9DD;HANGUL SYLLABLE JJAG;Lo;0;L;;;;;N;;;;;
+C9DE;HANGUL SYLLABLE JJAGG;Lo;0;L;;;;;N;;;;;
+C9DF;HANGUL SYLLABLE JJAGS;Lo;0;L;;;;;N;;;;;
+C9E0;HANGUL SYLLABLE JJAN;Lo;0;L;;;;;N;;;;;
+C9E1;HANGUL SYLLABLE JJANI;Lo;0;L;;;;;N;;;;;
+C9E2;HANGUL SYLLABLE JJANH;Lo;0;L;;;;;N;;;;;
+C9E3;HANGUL SYLLABLE JJAD;Lo;0;L;;;;;N;;;;;
+C9E4;HANGUL SYLLABLE JJAL;Lo;0;L;;;;;N;;;;;
+C9E5;HANGUL SYLLABLE JJALG;Lo;0;L;;;;;N;;;;;
+C9E6;HANGUL SYLLABLE JJALM;Lo;0;L;;;;;N;;;;;
+C9E7;HANGUL SYLLABLE JJALB;Lo;0;L;;;;;N;;;;;
+C9E8;HANGUL SYLLABLE JJALS;Lo;0;L;;;;;N;;;;;
+C9E9;HANGUL SYLLABLE JJALT;Lo;0;L;;;;;N;;;;;
+C9EA;HANGUL SYLLABLE JJALP;Lo;0;L;;;;;N;;;;;
+C9EB;HANGUL SYLLABLE JJALH;Lo;0;L;;;;;N;;;;;
+C9EC;HANGUL SYLLABLE JJAM;Lo;0;L;;;;;N;;;;;
+C9ED;HANGUL SYLLABLE JJAB;Lo;0;L;;;;;N;;;;;
+C9EE;HANGUL SYLLABLE JJABS;Lo;0;L;;;;;N;;;;;
+C9EF;HANGUL SYLLABLE JJAS;Lo;0;L;;;;;N;;;;;
+C9F0;HANGUL SYLLABLE JJASS;Lo;0;L;;;;;N;;;;;
+C9F1;HANGUL SYLLABLE JJANG;Lo;0;L;;;;;N;;;;;
+C9F2;HANGUL SYLLABLE JJAJ;Lo;0;L;;;;;N;;;;;
+C9F3;HANGUL SYLLABLE JJAC;Lo;0;L;;;;;N;;;;;
+C9F4;HANGUL SYLLABLE JJAK;Lo;0;L;;;;;N;;;;;
+C9F5;HANGUL SYLLABLE JJAT;Lo;0;L;;;;;N;;;;;
+C9F6;HANGUL SYLLABLE JJAP;Lo;0;L;;;;;N;;;;;
+C9F7;HANGUL SYLLABLE JJAH;Lo;0;L;;;;;N;;;;;
+C9F8;HANGUL SYLLABLE JJAE;Lo;0;L;;;;;N;;;;;
+C9F9;HANGUL SYLLABLE JJAEG;Lo;0;L;;;;;N;;;;;
+C9FA;HANGUL SYLLABLE JJAEGG;Lo;0;L;;;;;N;;;;;
+C9FB;HANGUL SYLLABLE JJAEGS;Lo;0;L;;;;;N;;;;;
+C9FC;HANGUL SYLLABLE JJAEN;Lo;0;L;;;;;N;;;;;
+C9FD;HANGUL SYLLABLE JJAENI;Lo;0;L;;;;;N;;;;;
+C9FE;HANGUL SYLLABLE JJAENH;Lo;0;L;;;;;N;;;;;
+C9FF;HANGUL SYLLABLE JJAED;Lo;0;L;;;;;N;;;;;
+CA00;HANGUL SYLLABLE JJAEL;Lo;0;L;;;;;N;;;;;
+CA01;HANGUL SYLLABLE JJAELG;Lo;0;L;;;;;N;;;;;
+CA02;HANGUL SYLLABLE JJAELM;Lo;0;L;;;;;N;;;;;
+CA03;HANGUL SYLLABLE JJAELB;Lo;0;L;;;;;N;;;;;
+CA04;HANGUL SYLLABLE JJAELS;Lo;0;L;;;;;N;;;;;
+CA05;HANGUL SYLLABLE JJAELT;Lo;0;L;;;;;N;;;;;
+CA06;HANGUL SYLLABLE JJAELP;Lo;0;L;;;;;N;;;;;
+CA07;HANGUL SYLLABLE JJAELH;Lo;0;L;;;;;N;;;;;
+CA08;HANGUL SYLLABLE JJAEM;Lo;0;L;;;;;N;;;;;
+CA09;HANGUL SYLLABLE JJAEB;Lo;0;L;;;;;N;;;;;
+CA0A;HANGUL SYLLABLE JJAEBS;Lo;0;L;;;;;N;;;;;
+CA0B;HANGUL SYLLABLE JJAES;Lo;0;L;;;;;N;;;;;
+CA0C;HANGUL SYLLABLE JJAESS;Lo;0;L;;;;;N;;;;;
+CA0D;HANGUL SYLLABLE JJAENG;Lo;0;L;;;;;N;;;;;
+CA0E;HANGUL SYLLABLE JJAEJ;Lo;0;L;;;;;N;;;;;
+CA0F;HANGUL SYLLABLE JJAEC;Lo;0;L;;;;;N;;;;;
+CA10;HANGUL SYLLABLE JJAEK;Lo;0;L;;;;;N;;;;;
+CA11;HANGUL SYLLABLE JJAET;Lo;0;L;;;;;N;;;;;
+CA12;HANGUL SYLLABLE JJAEP;Lo;0;L;;;;;N;;;;;
+CA13;HANGUL SYLLABLE JJAEH;Lo;0;L;;;;;N;;;;;
+CA14;HANGUL SYLLABLE JJYA;Lo;0;L;;;;;N;;;;;
+CA15;HANGUL SYLLABLE JJYAG;Lo;0;L;;;;;N;;;;;
+CA16;HANGUL SYLLABLE JJYAGG;Lo;0;L;;;;;N;;;;;
+CA17;HANGUL SYLLABLE JJYAGS;Lo;0;L;;;;;N;;;;;
+CA18;HANGUL SYLLABLE JJYAN;Lo;0;L;;;;;N;;;;;
+CA19;HANGUL SYLLABLE JJYANI;Lo;0;L;;;;;N;;;;;
+CA1A;HANGUL SYLLABLE JJYANH;Lo;0;L;;;;;N;;;;;
+CA1B;HANGUL SYLLABLE JJYAD;Lo;0;L;;;;;N;;;;;
+CA1C;HANGUL SYLLABLE JJYAL;Lo;0;L;;;;;N;;;;;
+CA1D;HANGUL SYLLABLE JJYALG;Lo;0;L;;;;;N;;;;;
+CA1E;HANGUL SYLLABLE JJYALM;Lo;0;L;;;;;N;;;;;
+CA1F;HANGUL SYLLABLE JJYALB;Lo;0;L;;;;;N;;;;;
+CA20;HANGUL SYLLABLE JJYALS;Lo;0;L;;;;;N;;;;;
+CA21;HANGUL SYLLABLE JJYALT;Lo;0;L;;;;;N;;;;;
+CA22;HANGUL SYLLABLE JJYALP;Lo;0;L;;;;;N;;;;;
+CA23;HANGUL SYLLABLE JJYALH;Lo;0;L;;;;;N;;;;;
+CA24;HANGUL SYLLABLE JJYAM;Lo;0;L;;;;;N;;;;;
+CA25;HANGUL SYLLABLE JJYAB;Lo;0;L;;;;;N;;;;;
+CA26;HANGUL SYLLABLE JJYABS;Lo;0;L;;;;;N;;;;;
+CA27;HANGUL SYLLABLE JJYAS;Lo;0;L;;;;;N;;;;;
+CA28;HANGUL SYLLABLE JJYASS;Lo;0;L;;;;;N;;;;;
+CA29;HANGUL SYLLABLE JJYANG;Lo;0;L;;;;;N;;;;;
+CA2A;HANGUL SYLLABLE JJYAJ;Lo;0;L;;;;;N;;;;;
+CA2B;HANGUL SYLLABLE JJYAC;Lo;0;L;;;;;N;;;;;
+CA2C;HANGUL SYLLABLE JJYAK;Lo;0;L;;;;;N;;;;;
+CA2D;HANGUL SYLLABLE JJYAT;Lo;0;L;;;;;N;;;;;
+CA2E;HANGUL SYLLABLE JJYAP;Lo;0;L;;;;;N;;;;;
+CA2F;HANGUL SYLLABLE JJYAH;Lo;0;L;;;;;N;;;;;
+CA30;HANGUL SYLLABLE JJYAE;Lo;0;L;;;;;N;;;;;
+CA31;HANGUL SYLLABLE JJYAEG;Lo;0;L;;;;;N;;;;;
+CA32;HANGUL SYLLABLE JJYAEGG;Lo;0;L;;;;;N;;;;;
+CA33;HANGUL SYLLABLE JJYAEGS;Lo;0;L;;;;;N;;;;;
+CA34;HANGUL SYLLABLE JJYAEN;Lo;0;L;;;;;N;;;;;
+CA35;HANGUL SYLLABLE JJYAENI;Lo;0;L;;;;;N;;;;;
+CA36;HANGUL SYLLABLE JJYAENH;Lo;0;L;;;;;N;;;;;
+CA37;HANGUL SYLLABLE JJYAED;Lo;0;L;;;;;N;;;;;
+CA38;HANGUL SYLLABLE JJYAEL;Lo;0;L;;;;;N;;;;;
+CA39;HANGUL SYLLABLE JJYAELG;Lo;0;L;;;;;N;;;;;
+CA3A;HANGUL SYLLABLE JJYAELM;Lo;0;L;;;;;N;;;;;
+CA3B;HANGUL SYLLABLE JJYAELB;Lo;0;L;;;;;N;;;;;
+CA3C;HANGUL SYLLABLE JJYAELS;Lo;0;L;;;;;N;;;;;
+CA3D;HANGUL SYLLABLE JJYAELT;Lo;0;L;;;;;N;;;;;
+CA3E;HANGUL SYLLABLE JJYAELP;Lo;0;L;;;;;N;;;;;
+CA3F;HANGUL SYLLABLE JJYAELH;Lo;0;L;;;;;N;;;;;
+CA40;HANGUL SYLLABLE JJYAEM;Lo;0;L;;;;;N;;;;;
+CA41;HANGUL SYLLABLE JJYAEB;Lo;0;L;;;;;N;;;;;
+CA42;HANGUL SYLLABLE JJYAEBS;Lo;0;L;;;;;N;;;;;
+CA43;HANGUL SYLLABLE JJYAES;Lo;0;L;;;;;N;;;;;
+CA44;HANGUL SYLLABLE JJYAESS;Lo;0;L;;;;;N;;;;;
+CA45;HANGUL SYLLABLE JJYAENG;Lo;0;L;;;;;N;;;;;
+CA46;HANGUL SYLLABLE JJYAEJ;Lo;0;L;;;;;N;;;;;
+CA47;HANGUL SYLLABLE JJYAEC;Lo;0;L;;;;;N;;;;;
+CA48;HANGUL SYLLABLE JJYAEK;Lo;0;L;;;;;N;;;;;
+CA49;HANGUL SYLLABLE JJYAET;Lo;0;L;;;;;N;;;;;
+CA4A;HANGUL SYLLABLE JJYAEP;Lo;0;L;;;;;N;;;;;
+CA4B;HANGUL SYLLABLE JJYAEH;Lo;0;L;;;;;N;;;;;
+CA4C;HANGUL SYLLABLE JJEO;Lo;0;L;;;;;N;;;;;
+CA4D;HANGUL SYLLABLE JJEOG;Lo;0;L;;;;;N;;;;;
+CA4E;HANGUL SYLLABLE JJEOGG;Lo;0;L;;;;;N;;;;;
+CA4F;HANGUL SYLLABLE JJEOGS;Lo;0;L;;;;;N;;;;;
+CA50;HANGUL SYLLABLE JJEON;Lo;0;L;;;;;N;;;;;
+CA51;HANGUL SYLLABLE JJEONI;Lo;0;L;;;;;N;;;;;
+CA52;HANGUL SYLLABLE JJEONH;Lo;0;L;;;;;N;;;;;
+CA53;HANGUL SYLLABLE JJEOD;Lo;0;L;;;;;N;;;;;
+CA54;HANGUL SYLLABLE JJEOL;Lo;0;L;;;;;N;;;;;
+CA55;HANGUL SYLLABLE JJEOLG;Lo;0;L;;;;;N;;;;;
+CA56;HANGUL SYLLABLE JJEOLM;Lo;0;L;;;;;N;;;;;
+CA57;HANGUL SYLLABLE JJEOLB;Lo;0;L;;;;;N;;;;;
+CA58;HANGUL SYLLABLE JJEOLS;Lo;0;L;;;;;N;;;;;
+CA59;HANGUL SYLLABLE JJEOLT;Lo;0;L;;;;;N;;;;;
+CA5A;HANGUL SYLLABLE JJEOLP;Lo;0;L;;;;;N;;;;;
+CA5B;HANGUL SYLLABLE JJEOLH;Lo;0;L;;;;;N;;;;;
+CA5C;HANGUL SYLLABLE JJEOM;Lo;0;L;;;;;N;;;;;
+CA5D;HANGUL SYLLABLE JJEOB;Lo;0;L;;;;;N;;;;;
+CA5E;HANGUL SYLLABLE JJEOBS;Lo;0;L;;;;;N;;;;;
+CA5F;HANGUL SYLLABLE JJEOS;Lo;0;L;;;;;N;;;;;
+CA60;HANGUL SYLLABLE JJEOSS;Lo;0;L;;;;;N;;;;;
+CA61;HANGUL SYLLABLE JJEONG;Lo;0;L;;;;;N;;;;;
+CA62;HANGUL SYLLABLE JJEOJ;Lo;0;L;;;;;N;;;;;
+CA63;HANGUL SYLLABLE JJEOC;Lo;0;L;;;;;N;;;;;
+CA64;HANGUL SYLLABLE JJEOK;Lo;0;L;;;;;N;;;;;
+CA65;HANGUL SYLLABLE JJEOT;Lo;0;L;;;;;N;;;;;
+CA66;HANGUL SYLLABLE JJEOP;Lo;0;L;;;;;N;;;;;
+CA67;HANGUL SYLLABLE JJEOH;Lo;0;L;;;;;N;;;;;
+CA68;HANGUL SYLLABLE JJE;Lo;0;L;;;;;N;;;;;
+CA69;HANGUL SYLLABLE JJEG;Lo;0;L;;;;;N;;;;;
+CA6A;HANGUL SYLLABLE JJEGG;Lo;0;L;;;;;N;;;;;
+CA6B;HANGUL SYLLABLE JJEGS;Lo;0;L;;;;;N;;;;;
+CA6C;HANGUL SYLLABLE JJEN;Lo;0;L;;;;;N;;;;;
+CA6D;HANGUL SYLLABLE JJENI;Lo;0;L;;;;;N;;;;;
+CA6E;HANGUL SYLLABLE JJENH;Lo;0;L;;;;;N;;;;;
+CA6F;HANGUL SYLLABLE JJED;Lo;0;L;;;;;N;;;;;
+CA70;HANGUL SYLLABLE JJEL;Lo;0;L;;;;;N;;;;;
+CA71;HANGUL SYLLABLE JJELG;Lo;0;L;;;;;N;;;;;
+CA72;HANGUL SYLLABLE JJELM;Lo;0;L;;;;;N;;;;;
+CA73;HANGUL SYLLABLE JJELB;Lo;0;L;;;;;N;;;;;
+CA74;HANGUL SYLLABLE JJELS;Lo;0;L;;;;;N;;;;;
+CA75;HANGUL SYLLABLE JJELT;Lo;0;L;;;;;N;;;;;
+CA76;HANGUL SYLLABLE JJELP;Lo;0;L;;;;;N;;;;;
+CA77;HANGUL SYLLABLE JJELH;Lo;0;L;;;;;N;;;;;
+CA78;HANGUL SYLLABLE JJEM;Lo;0;L;;;;;N;;;;;
+CA79;HANGUL SYLLABLE JJEB;Lo;0;L;;;;;N;;;;;
+CA7A;HANGUL SYLLABLE JJEBS;Lo;0;L;;;;;N;;;;;
+CA7B;HANGUL SYLLABLE JJES;Lo;0;L;;;;;N;;;;;
+CA7C;HANGUL SYLLABLE JJESS;Lo;0;L;;;;;N;;;;;
+CA7D;HANGUL SYLLABLE JJENG;Lo;0;L;;;;;N;;;;;
+CA7E;HANGUL SYLLABLE JJEJ;Lo;0;L;;;;;N;;;;;
+CA7F;HANGUL SYLLABLE JJEC;Lo;0;L;;;;;N;;;;;
+CA80;HANGUL SYLLABLE JJEK;Lo;0;L;;;;;N;;;;;
+CA81;HANGUL SYLLABLE JJET;Lo;0;L;;;;;N;;;;;
+CA82;HANGUL SYLLABLE JJEP;Lo;0;L;;;;;N;;;;;
+CA83;HANGUL SYLLABLE JJEH;Lo;0;L;;;;;N;;;;;
+CA84;HANGUL SYLLABLE JJYEO;Lo;0;L;;;;;N;;;;;
+CA85;HANGUL SYLLABLE JJYEOG;Lo;0;L;;;;;N;;;;;
+CA86;HANGUL SYLLABLE JJYEOGG;Lo;0;L;;;;;N;;;;;
+CA87;HANGUL SYLLABLE JJYEOGS;Lo;0;L;;;;;N;;;;;
+CA88;HANGUL SYLLABLE JJYEON;Lo;0;L;;;;;N;;;;;
+CA89;HANGUL SYLLABLE JJYEONI;Lo;0;L;;;;;N;;;;;
+CA8A;HANGUL SYLLABLE JJYEONH;Lo;0;L;;;;;N;;;;;
+CA8B;HANGUL SYLLABLE JJYEOD;Lo;0;L;;;;;N;;;;;
+CA8C;HANGUL SYLLABLE JJYEOL;Lo;0;L;;;;;N;;;;;
+CA8D;HANGUL SYLLABLE JJYEOLG;Lo;0;L;;;;;N;;;;;
+CA8E;HANGUL SYLLABLE JJYEOLM;Lo;0;L;;;;;N;;;;;
+CA8F;HANGUL SYLLABLE JJYEOLB;Lo;0;L;;;;;N;;;;;
+CA90;HANGUL SYLLABLE JJYEOLS;Lo;0;L;;;;;N;;;;;
+CA91;HANGUL SYLLABLE JJYEOLT;Lo;0;L;;;;;N;;;;;
+CA92;HANGUL SYLLABLE JJYEOLP;Lo;0;L;;;;;N;;;;;
+CA93;HANGUL SYLLABLE JJYEOLH;Lo;0;L;;;;;N;;;;;
+CA94;HANGUL SYLLABLE JJYEOM;Lo;0;L;;;;;N;;;;;
+CA95;HANGUL SYLLABLE JJYEOB;Lo;0;L;;;;;N;;;;;
+CA96;HANGUL SYLLABLE JJYEOBS;Lo;0;L;;;;;N;;;;;
+CA97;HANGUL SYLLABLE JJYEOS;Lo;0;L;;;;;N;;;;;
+CA98;HANGUL SYLLABLE JJYEOSS;Lo;0;L;;;;;N;;;;;
+CA99;HANGUL SYLLABLE JJYEONG;Lo;0;L;;;;;N;;;;;
+CA9A;HANGUL SYLLABLE JJYEOJ;Lo;0;L;;;;;N;;;;;
+CA9B;HANGUL SYLLABLE JJYEOC;Lo;0;L;;;;;N;;;;;
+CA9C;HANGUL SYLLABLE JJYEOK;Lo;0;L;;;;;N;;;;;
+CA9D;HANGUL SYLLABLE JJYEOT;Lo;0;L;;;;;N;;;;;
+CA9E;HANGUL SYLLABLE JJYEOP;Lo;0;L;;;;;N;;;;;
+CA9F;HANGUL SYLLABLE JJYEOH;Lo;0;L;;;;;N;;;;;
+CAA0;HANGUL SYLLABLE JJYE;Lo;0;L;;;;;N;;;;;
+CAA1;HANGUL SYLLABLE JJYEG;Lo;0;L;;;;;N;;;;;
+CAA2;HANGUL SYLLABLE JJYEGG;Lo;0;L;;;;;N;;;;;
+CAA3;HANGUL SYLLABLE JJYEGS;Lo;0;L;;;;;N;;;;;
+CAA4;HANGUL SYLLABLE JJYEN;Lo;0;L;;;;;N;;;;;
+CAA5;HANGUL SYLLABLE JJYENI;Lo;0;L;;;;;N;;;;;
+CAA6;HANGUL SYLLABLE JJYENH;Lo;0;L;;;;;N;;;;;
+CAA7;HANGUL SYLLABLE JJYED;Lo;0;L;;;;;N;;;;;
+CAA8;HANGUL SYLLABLE JJYEL;Lo;0;L;;;;;N;;;;;
+CAA9;HANGUL SYLLABLE JJYELG;Lo;0;L;;;;;N;;;;;
+CAAA;HANGUL SYLLABLE JJYELM;Lo;0;L;;;;;N;;;;;
+CAAB;HANGUL SYLLABLE JJYELB;Lo;0;L;;;;;N;;;;;
+CAAC;HANGUL SYLLABLE JJYELS;Lo;0;L;;;;;N;;;;;
+CAAD;HANGUL SYLLABLE JJYELT;Lo;0;L;;;;;N;;;;;
+CAAE;HANGUL SYLLABLE JJYELP;Lo;0;L;;;;;N;;;;;
+CAAF;HANGUL SYLLABLE JJYELH;Lo;0;L;;;;;N;;;;;
+CAB0;HANGUL SYLLABLE JJYEM;Lo;0;L;;;;;N;;;;;
+CAB1;HANGUL SYLLABLE JJYEB;Lo;0;L;;;;;N;;;;;
+CAB2;HANGUL SYLLABLE JJYEBS;Lo;0;L;;;;;N;;;;;
+CAB3;HANGUL SYLLABLE JJYES;Lo;0;L;;;;;N;;;;;
+CAB4;HANGUL SYLLABLE JJYESS;Lo;0;L;;;;;N;;;;;
+CAB5;HANGUL SYLLABLE JJYENG;Lo;0;L;;;;;N;;;;;
+CAB6;HANGUL SYLLABLE JJYEJ;Lo;0;L;;;;;N;;;;;
+CAB7;HANGUL SYLLABLE JJYEC;Lo;0;L;;;;;N;;;;;
+CAB8;HANGUL SYLLABLE JJYEK;Lo;0;L;;;;;N;;;;;
+CAB9;HANGUL SYLLABLE JJYET;Lo;0;L;;;;;N;;;;;
+CABA;HANGUL SYLLABLE JJYEP;Lo;0;L;;;;;N;;;;;
+CABB;HANGUL SYLLABLE JJYEH;Lo;0;L;;;;;N;;;;;
+CABC;HANGUL SYLLABLE JJO;Lo;0;L;;;;;N;;;;;
+CABD;HANGUL SYLLABLE JJOG;Lo;0;L;;;;;N;;;;;
+CABE;HANGUL SYLLABLE JJOGG;Lo;0;L;;;;;N;;;;;
+CABF;HANGUL SYLLABLE JJOGS;Lo;0;L;;;;;N;;;;;
+CAC0;HANGUL SYLLABLE JJON;Lo;0;L;;;;;N;;;;;
+CAC1;HANGUL SYLLABLE JJONI;Lo;0;L;;;;;N;;;;;
+CAC2;HANGUL SYLLABLE JJONH;Lo;0;L;;;;;N;;;;;
+CAC3;HANGUL SYLLABLE JJOD;Lo;0;L;;;;;N;;;;;
+CAC4;HANGUL SYLLABLE JJOL;Lo;0;L;;;;;N;;;;;
+CAC5;HANGUL SYLLABLE JJOLG;Lo;0;L;;;;;N;;;;;
+CAC6;HANGUL SYLLABLE JJOLM;Lo;0;L;;;;;N;;;;;
+CAC7;HANGUL SYLLABLE JJOLB;Lo;0;L;;;;;N;;;;;
+CAC8;HANGUL SYLLABLE JJOLS;Lo;0;L;;;;;N;;;;;
+CAC9;HANGUL SYLLABLE JJOLT;Lo;0;L;;;;;N;;;;;
+CACA;HANGUL SYLLABLE JJOLP;Lo;0;L;;;;;N;;;;;
+CACB;HANGUL SYLLABLE JJOLH;Lo;0;L;;;;;N;;;;;
+CACC;HANGUL SYLLABLE JJOM;Lo;0;L;;;;;N;;;;;
+CACD;HANGUL SYLLABLE JJOB;Lo;0;L;;;;;N;;;;;
+CACE;HANGUL SYLLABLE JJOBS;Lo;0;L;;;;;N;;;;;
+CACF;HANGUL SYLLABLE JJOS;Lo;0;L;;;;;N;;;;;
+CAD0;HANGUL SYLLABLE JJOSS;Lo;0;L;;;;;N;;;;;
+CAD1;HANGUL SYLLABLE JJONG;Lo;0;L;;;;;N;;;;;
+CAD2;HANGUL SYLLABLE JJOJ;Lo;0;L;;;;;N;;;;;
+CAD3;HANGUL SYLLABLE JJOC;Lo;0;L;;;;;N;;;;;
+CAD4;HANGUL SYLLABLE JJOK;Lo;0;L;;;;;N;;;;;
+CAD5;HANGUL SYLLABLE JJOT;Lo;0;L;;;;;N;;;;;
+CAD6;HANGUL SYLLABLE JJOP;Lo;0;L;;;;;N;;;;;
+CAD7;HANGUL SYLLABLE JJOH;Lo;0;L;;;;;N;;;;;
+CAD8;HANGUL SYLLABLE JJWA;Lo;0;L;;;;;N;;;;;
+CAD9;HANGUL SYLLABLE JJWAG;Lo;0;L;;;;;N;;;;;
+CADA;HANGUL SYLLABLE JJWAGG;Lo;0;L;;;;;N;;;;;
+CADB;HANGUL SYLLABLE JJWAGS;Lo;0;L;;;;;N;;;;;
+CADC;HANGUL SYLLABLE JJWAN;Lo;0;L;;;;;N;;;;;
+CADD;HANGUL SYLLABLE JJWANI;Lo;0;L;;;;;N;;;;;
+CADE;HANGUL SYLLABLE JJWANH;Lo;0;L;;;;;N;;;;;
+CADF;HANGUL SYLLABLE JJWAD;Lo;0;L;;;;;N;;;;;
+CAE0;HANGUL SYLLABLE JJWAL;Lo;0;L;;;;;N;;;;;
+CAE1;HANGUL SYLLABLE JJWALG;Lo;0;L;;;;;N;;;;;
+CAE2;HANGUL SYLLABLE JJWALM;Lo;0;L;;;;;N;;;;;
+CAE3;HANGUL SYLLABLE JJWALB;Lo;0;L;;;;;N;;;;;
+CAE4;HANGUL SYLLABLE JJWALS;Lo;0;L;;;;;N;;;;;
+CAE5;HANGUL SYLLABLE JJWALT;Lo;0;L;;;;;N;;;;;
+CAE6;HANGUL SYLLABLE JJWALP;Lo;0;L;;;;;N;;;;;
+CAE7;HANGUL SYLLABLE JJWALH;Lo;0;L;;;;;N;;;;;
+CAE8;HANGUL SYLLABLE JJWAM;Lo;0;L;;;;;N;;;;;
+CAE9;HANGUL SYLLABLE JJWAB;Lo;0;L;;;;;N;;;;;
+CAEA;HANGUL SYLLABLE JJWABS;Lo;0;L;;;;;N;;;;;
+CAEB;HANGUL SYLLABLE JJWAS;Lo;0;L;;;;;N;;;;;
+CAEC;HANGUL SYLLABLE JJWASS;Lo;0;L;;;;;N;;;;;
+CAED;HANGUL SYLLABLE JJWANG;Lo;0;L;;;;;N;;;;;
+CAEE;HANGUL SYLLABLE JJWAJ;Lo;0;L;;;;;N;;;;;
+CAEF;HANGUL SYLLABLE JJWAC;Lo;0;L;;;;;N;;;;;
+CAF0;HANGUL SYLLABLE JJWAK;Lo;0;L;;;;;N;;;;;
+CAF1;HANGUL SYLLABLE JJWAT;Lo;0;L;;;;;N;;;;;
+CAF2;HANGUL SYLLABLE JJWAP;Lo;0;L;;;;;N;;;;;
+CAF3;HANGUL SYLLABLE JJWAH;Lo;0;L;;;;;N;;;;;
+CAF4;HANGUL SYLLABLE JJWAE;Lo;0;L;;;;;N;;;;;
+CAF5;HANGUL SYLLABLE JJWAEG;Lo;0;L;;;;;N;;;;;
+CAF6;HANGUL SYLLABLE JJWAEGG;Lo;0;L;;;;;N;;;;;
+CAF7;HANGUL SYLLABLE JJWAEGS;Lo;0;L;;;;;N;;;;;
+CAF8;HANGUL SYLLABLE JJWAEN;Lo;0;L;;;;;N;;;;;
+CAF9;HANGUL SYLLABLE JJWAENI;Lo;0;L;;;;;N;;;;;
+CAFA;HANGUL SYLLABLE JJWAENH;Lo;0;L;;;;;N;;;;;
+CAFB;HANGUL SYLLABLE JJWAED;Lo;0;L;;;;;N;;;;;
+CAFC;HANGUL SYLLABLE JJWAEL;Lo;0;L;;;;;N;;;;;
+CAFD;HANGUL SYLLABLE JJWAELG;Lo;0;L;;;;;N;;;;;
+CAFE;HANGUL SYLLABLE JJWAELM;Lo;0;L;;;;;N;;;;;
+CAFF;HANGUL SYLLABLE JJWAELB;Lo;0;L;;;;;N;;;;;
+CB00;HANGUL SYLLABLE JJWAELS;Lo;0;L;;;;;N;;;;;
+CB01;HANGUL SYLLABLE JJWAELT;Lo;0;L;;;;;N;;;;;
+CB02;HANGUL SYLLABLE JJWAELP;Lo;0;L;;;;;N;;;;;
+CB03;HANGUL SYLLABLE JJWAELH;Lo;0;L;;;;;N;;;;;
+CB04;HANGUL SYLLABLE JJWAEM;Lo;0;L;;;;;N;;;;;
+CB05;HANGUL SYLLABLE JJWAEB;Lo;0;L;;;;;N;;;;;
+CB06;HANGUL SYLLABLE JJWAEBS;Lo;0;L;;;;;N;;;;;
+CB07;HANGUL SYLLABLE JJWAES;Lo;0;L;;;;;N;;;;;
+CB08;HANGUL SYLLABLE JJWAESS;Lo;0;L;;;;;N;;;;;
+CB09;HANGUL SYLLABLE JJWAENG;Lo;0;L;;;;;N;;;;;
+CB0A;HANGUL SYLLABLE JJWAEJ;Lo;0;L;;;;;N;;;;;
+CB0B;HANGUL SYLLABLE JJWAEC;Lo;0;L;;;;;N;;;;;
+CB0C;HANGUL SYLLABLE JJWAEK;Lo;0;L;;;;;N;;;;;
+CB0D;HANGUL SYLLABLE JJWAET;Lo;0;L;;;;;N;;;;;
+CB0E;HANGUL SYLLABLE JJWAEP;Lo;0;L;;;;;N;;;;;
+CB0F;HANGUL SYLLABLE JJWAEH;Lo;0;L;;;;;N;;;;;
+CB10;HANGUL SYLLABLE JJOE;Lo;0;L;;;;;N;;;;;
+CB11;HANGUL SYLLABLE JJOEG;Lo;0;L;;;;;N;;;;;
+CB12;HANGUL SYLLABLE JJOEGG;Lo;0;L;;;;;N;;;;;
+CB13;HANGUL SYLLABLE JJOEGS;Lo;0;L;;;;;N;;;;;
+CB14;HANGUL SYLLABLE JJOEN;Lo;0;L;;;;;N;;;;;
+CB15;HANGUL SYLLABLE JJOENI;Lo;0;L;;;;;N;;;;;
+CB16;HANGUL SYLLABLE JJOENH;Lo;0;L;;;;;N;;;;;
+CB17;HANGUL SYLLABLE JJOED;Lo;0;L;;;;;N;;;;;
+CB18;HANGUL SYLLABLE JJOEL;Lo;0;L;;;;;N;;;;;
+CB19;HANGUL SYLLABLE JJOELG;Lo;0;L;;;;;N;;;;;
+CB1A;HANGUL SYLLABLE JJOELM;Lo;0;L;;;;;N;;;;;
+CB1B;HANGUL SYLLABLE JJOELB;Lo;0;L;;;;;N;;;;;
+CB1C;HANGUL SYLLABLE JJOELS;Lo;0;L;;;;;N;;;;;
+CB1D;HANGUL SYLLABLE JJOELT;Lo;0;L;;;;;N;;;;;
+CB1E;HANGUL SYLLABLE JJOELP;Lo;0;L;;;;;N;;;;;
+CB1F;HANGUL SYLLABLE JJOELH;Lo;0;L;;;;;N;;;;;
+CB20;HANGUL SYLLABLE JJOEM;Lo;0;L;;;;;N;;;;;
+CB21;HANGUL SYLLABLE JJOEB;Lo;0;L;;;;;N;;;;;
+CB22;HANGUL SYLLABLE JJOEBS;Lo;0;L;;;;;N;;;;;
+CB23;HANGUL SYLLABLE JJOES;Lo;0;L;;;;;N;;;;;
+CB24;HANGUL SYLLABLE JJOESS;Lo;0;L;;;;;N;;;;;
+CB25;HANGUL SYLLABLE JJOENG;Lo;0;L;;;;;N;;;;;
+CB26;HANGUL SYLLABLE JJOEJ;Lo;0;L;;;;;N;;;;;
+CB27;HANGUL SYLLABLE JJOEC;Lo;0;L;;;;;N;;;;;
+CB28;HANGUL SYLLABLE JJOEK;Lo;0;L;;;;;N;;;;;
+CB29;HANGUL SYLLABLE JJOET;Lo;0;L;;;;;N;;;;;
+CB2A;HANGUL SYLLABLE JJOEP;Lo;0;L;;;;;N;;;;;
+CB2B;HANGUL SYLLABLE JJOEH;Lo;0;L;;;;;N;;;;;
+CB2C;HANGUL SYLLABLE JJYO;Lo;0;L;;;;;N;;;;;
+CB2D;HANGUL SYLLABLE JJYOG;Lo;0;L;;;;;N;;;;;
+CB2E;HANGUL SYLLABLE JJYOGG;Lo;0;L;;;;;N;;;;;
+CB2F;HANGUL SYLLABLE JJYOGS;Lo;0;L;;;;;N;;;;;
+CB30;HANGUL SYLLABLE JJYON;Lo;0;L;;;;;N;;;;;
+CB31;HANGUL SYLLABLE JJYONI;Lo;0;L;;;;;N;;;;;
+CB32;HANGUL SYLLABLE JJYONH;Lo;0;L;;;;;N;;;;;
+CB33;HANGUL SYLLABLE JJYOD;Lo;0;L;;;;;N;;;;;
+CB34;HANGUL SYLLABLE JJYOL;Lo;0;L;;;;;N;;;;;
+CB35;HANGUL SYLLABLE JJYOLG;Lo;0;L;;;;;N;;;;;
+CB36;HANGUL SYLLABLE JJYOLM;Lo;0;L;;;;;N;;;;;
+CB37;HANGUL SYLLABLE JJYOLB;Lo;0;L;;;;;N;;;;;
+CB38;HANGUL SYLLABLE JJYOLS;Lo;0;L;;;;;N;;;;;
+CB39;HANGUL SYLLABLE JJYOLT;Lo;0;L;;;;;N;;;;;
+CB3A;HANGUL SYLLABLE JJYOLP;Lo;0;L;;;;;N;;;;;
+CB3B;HANGUL SYLLABLE JJYOLH;Lo;0;L;;;;;N;;;;;
+CB3C;HANGUL SYLLABLE JJYOM;Lo;0;L;;;;;N;;;;;
+CB3D;HANGUL SYLLABLE JJYOB;Lo;0;L;;;;;N;;;;;
+CB3E;HANGUL SYLLABLE JJYOBS;Lo;0;L;;;;;N;;;;;
+CB3F;HANGUL SYLLABLE JJYOS;Lo;0;L;;;;;N;;;;;
+CB40;HANGUL SYLLABLE JJYOSS;Lo;0;L;;;;;N;;;;;
+CB41;HANGUL SYLLABLE JJYONG;Lo;0;L;;;;;N;;;;;
+CB42;HANGUL SYLLABLE JJYOJ;Lo;0;L;;;;;N;;;;;
+CB43;HANGUL SYLLABLE JJYOC;Lo;0;L;;;;;N;;;;;
+CB44;HANGUL SYLLABLE JJYOK;Lo;0;L;;;;;N;;;;;
+CB45;HANGUL SYLLABLE JJYOT;Lo;0;L;;;;;N;;;;;
+CB46;HANGUL SYLLABLE JJYOP;Lo;0;L;;;;;N;;;;;
+CB47;HANGUL SYLLABLE JJYOH;Lo;0;L;;;;;N;;;;;
+CB48;HANGUL SYLLABLE JJU;Lo;0;L;;;;;N;;;;;
+CB49;HANGUL SYLLABLE JJUG;Lo;0;L;;;;;N;;;;;
+CB4A;HANGUL SYLLABLE JJUGG;Lo;0;L;;;;;N;;;;;
+CB4B;HANGUL SYLLABLE JJUGS;Lo;0;L;;;;;N;;;;;
+CB4C;HANGUL SYLLABLE JJUN;Lo;0;L;;;;;N;;;;;
+CB4D;HANGUL SYLLABLE JJUNI;Lo;0;L;;;;;N;;;;;
+CB4E;HANGUL SYLLABLE JJUNH;Lo;0;L;;;;;N;;;;;
+CB4F;HANGUL SYLLABLE JJUD;Lo;0;L;;;;;N;;;;;
+CB50;HANGUL SYLLABLE JJUL;Lo;0;L;;;;;N;;;;;
+CB51;HANGUL SYLLABLE JJULG;Lo;0;L;;;;;N;;;;;
+CB52;HANGUL SYLLABLE JJULM;Lo;0;L;;;;;N;;;;;
+CB53;HANGUL SYLLABLE JJULB;Lo;0;L;;;;;N;;;;;
+CB54;HANGUL SYLLABLE JJULS;Lo;0;L;;;;;N;;;;;
+CB55;HANGUL SYLLABLE JJULT;Lo;0;L;;;;;N;;;;;
+CB56;HANGUL SYLLABLE JJULP;Lo;0;L;;;;;N;;;;;
+CB57;HANGUL SYLLABLE JJULH;Lo;0;L;;;;;N;;;;;
+CB58;HANGUL SYLLABLE JJUM;Lo;0;L;;;;;N;;;;;
+CB59;HANGUL SYLLABLE JJUB;Lo;0;L;;;;;N;;;;;
+CB5A;HANGUL SYLLABLE JJUBS;Lo;0;L;;;;;N;;;;;
+CB5B;HANGUL SYLLABLE JJUS;Lo;0;L;;;;;N;;;;;
+CB5C;HANGUL SYLLABLE JJUSS;Lo;0;L;;;;;N;;;;;
+CB5D;HANGUL SYLLABLE JJUNG;Lo;0;L;;;;;N;;;;;
+CB5E;HANGUL SYLLABLE JJUJ;Lo;0;L;;;;;N;;;;;
+CB5F;HANGUL SYLLABLE JJUC;Lo;0;L;;;;;N;;;;;
+CB60;HANGUL SYLLABLE JJUK;Lo;0;L;;;;;N;;;;;
+CB61;HANGUL SYLLABLE JJUT;Lo;0;L;;;;;N;;;;;
+CB62;HANGUL SYLLABLE JJUP;Lo;0;L;;;;;N;;;;;
+CB63;HANGUL SYLLABLE JJUH;Lo;0;L;;;;;N;;;;;
+CB64;HANGUL SYLLABLE JJWEO;Lo;0;L;;;;;N;;;;;
+CB65;HANGUL SYLLABLE JJWEOG;Lo;0;L;;;;;N;;;;;
+CB66;HANGUL SYLLABLE JJWEOGG;Lo;0;L;;;;;N;;;;;
+CB67;HANGUL SYLLABLE JJWEOGS;Lo;0;L;;;;;N;;;;;
+CB68;HANGUL SYLLABLE JJWEON;Lo;0;L;;;;;N;;;;;
+CB69;HANGUL SYLLABLE JJWEONI;Lo;0;L;;;;;N;;;;;
+CB6A;HANGUL SYLLABLE JJWEONH;Lo;0;L;;;;;N;;;;;
+CB6B;HANGUL SYLLABLE JJWEOD;Lo;0;L;;;;;N;;;;;
+CB6C;HANGUL SYLLABLE JJWEOL;Lo;0;L;;;;;N;;;;;
+CB6D;HANGUL SYLLABLE JJWEOLG;Lo;0;L;;;;;N;;;;;
+CB6E;HANGUL SYLLABLE JJWEOLM;Lo;0;L;;;;;N;;;;;
+CB6F;HANGUL SYLLABLE JJWEOLB;Lo;0;L;;;;;N;;;;;
+CB70;HANGUL SYLLABLE JJWEOLS;Lo;0;L;;;;;N;;;;;
+CB71;HANGUL SYLLABLE JJWEOLT;Lo;0;L;;;;;N;;;;;
+CB72;HANGUL SYLLABLE JJWEOLP;Lo;0;L;;;;;N;;;;;
+CB73;HANGUL SYLLABLE JJWEOLH;Lo;0;L;;;;;N;;;;;
+CB74;HANGUL SYLLABLE JJWEOM;Lo;0;L;;;;;N;;;;;
+CB75;HANGUL SYLLABLE JJWEOB;Lo;0;L;;;;;N;;;;;
+CB76;HANGUL SYLLABLE JJWEOBS;Lo;0;L;;;;;N;;;;;
+CB77;HANGUL SYLLABLE JJWEOS;Lo;0;L;;;;;N;;;;;
+CB78;HANGUL SYLLABLE JJWEOSS;Lo;0;L;;;;;N;;;;;
+CB79;HANGUL SYLLABLE JJWEONG;Lo;0;L;;;;;N;;;;;
+CB7A;HANGUL SYLLABLE JJWEOJ;Lo;0;L;;;;;N;;;;;
+CB7B;HANGUL SYLLABLE JJWEOC;Lo;0;L;;;;;N;;;;;
+CB7C;HANGUL SYLLABLE JJWEOK;Lo;0;L;;;;;N;;;;;
+CB7D;HANGUL SYLLABLE JJWEOT;Lo;0;L;;;;;N;;;;;
+CB7E;HANGUL SYLLABLE JJWEOP;Lo;0;L;;;;;N;;;;;
+CB7F;HANGUL SYLLABLE JJWEOH;Lo;0;L;;;;;N;;;;;
+CB80;HANGUL SYLLABLE JJWE;Lo;0;L;;;;;N;;;;;
+CB81;HANGUL SYLLABLE JJWEG;Lo;0;L;;;;;N;;;;;
+CB82;HANGUL SYLLABLE JJWEGG;Lo;0;L;;;;;N;;;;;
+CB83;HANGUL SYLLABLE JJWEGS;Lo;0;L;;;;;N;;;;;
+CB84;HANGUL SYLLABLE JJWEN;Lo;0;L;;;;;N;;;;;
+CB85;HANGUL SYLLABLE JJWENI;Lo;0;L;;;;;N;;;;;
+CB86;HANGUL SYLLABLE JJWENH;Lo;0;L;;;;;N;;;;;
+CB87;HANGUL SYLLABLE JJWED;Lo;0;L;;;;;N;;;;;
+CB88;HANGUL SYLLABLE JJWEL;Lo;0;L;;;;;N;;;;;
+CB89;HANGUL SYLLABLE JJWELG;Lo;0;L;;;;;N;;;;;
+CB8A;HANGUL SYLLABLE JJWELM;Lo;0;L;;;;;N;;;;;
+CB8B;HANGUL SYLLABLE JJWELB;Lo;0;L;;;;;N;;;;;
+CB8C;HANGUL SYLLABLE JJWELS;Lo;0;L;;;;;N;;;;;
+CB8D;HANGUL SYLLABLE JJWELT;Lo;0;L;;;;;N;;;;;
+CB8E;HANGUL SYLLABLE JJWELP;Lo;0;L;;;;;N;;;;;
+CB8F;HANGUL SYLLABLE JJWELH;Lo;0;L;;;;;N;;;;;
+CB90;HANGUL SYLLABLE JJWEM;Lo;0;L;;;;;N;;;;;
+CB91;HANGUL SYLLABLE JJWEB;Lo;0;L;;;;;N;;;;;
+CB92;HANGUL SYLLABLE JJWEBS;Lo;0;L;;;;;N;;;;;
+CB93;HANGUL SYLLABLE JJWES;Lo;0;L;;;;;N;;;;;
+CB94;HANGUL SYLLABLE JJWESS;Lo;0;L;;;;;N;;;;;
+CB95;HANGUL SYLLABLE JJWENG;Lo;0;L;;;;;N;;;;;
+CB96;HANGUL SYLLABLE JJWEJ;Lo;0;L;;;;;N;;;;;
+CB97;HANGUL SYLLABLE JJWEC;Lo;0;L;;;;;N;;;;;
+CB98;HANGUL SYLLABLE JJWEK;Lo;0;L;;;;;N;;;;;
+CB99;HANGUL SYLLABLE JJWET;Lo;0;L;;;;;N;;;;;
+CB9A;HANGUL SYLLABLE JJWEP;Lo;0;L;;;;;N;;;;;
+CB9B;HANGUL SYLLABLE JJWEH;Lo;0;L;;;;;N;;;;;
+CB9C;HANGUL SYLLABLE JJWI;Lo;0;L;;;;;N;;;;;
+CB9D;HANGUL SYLLABLE JJWIG;Lo;0;L;;;;;N;;;;;
+CB9E;HANGUL SYLLABLE JJWIGG;Lo;0;L;;;;;N;;;;;
+CB9F;HANGUL SYLLABLE JJWIGS;Lo;0;L;;;;;N;;;;;
+CBA0;HANGUL SYLLABLE JJWIN;Lo;0;L;;;;;N;;;;;
+CBA1;HANGUL SYLLABLE JJWINI;Lo;0;L;;;;;N;;;;;
+CBA2;HANGUL SYLLABLE JJWINH;Lo;0;L;;;;;N;;;;;
+CBA3;HANGUL SYLLABLE JJWID;Lo;0;L;;;;;N;;;;;
+CBA4;HANGUL SYLLABLE JJWIL;Lo;0;L;;;;;N;;;;;
+CBA5;HANGUL SYLLABLE JJWILG;Lo;0;L;;;;;N;;;;;
+CBA6;HANGUL SYLLABLE JJWILM;Lo;0;L;;;;;N;;;;;
+CBA7;HANGUL SYLLABLE JJWILB;Lo;0;L;;;;;N;;;;;
+CBA8;HANGUL SYLLABLE JJWILS;Lo;0;L;;;;;N;;;;;
+CBA9;HANGUL SYLLABLE JJWILT;Lo;0;L;;;;;N;;;;;
+CBAA;HANGUL SYLLABLE JJWILP;Lo;0;L;;;;;N;;;;;
+CBAB;HANGUL SYLLABLE JJWILH;Lo;0;L;;;;;N;;;;;
+CBAC;HANGUL SYLLABLE JJWIM;Lo;0;L;;;;;N;;;;;
+CBAD;HANGUL SYLLABLE JJWIB;Lo;0;L;;;;;N;;;;;
+CBAE;HANGUL SYLLABLE JJWIBS;Lo;0;L;;;;;N;;;;;
+CBAF;HANGUL SYLLABLE JJWIS;Lo;0;L;;;;;N;;;;;
+CBB0;HANGUL SYLLABLE JJWISS;Lo;0;L;;;;;N;;;;;
+CBB1;HANGUL SYLLABLE JJWING;Lo;0;L;;;;;N;;;;;
+CBB2;HANGUL SYLLABLE JJWIJ;Lo;0;L;;;;;N;;;;;
+CBB3;HANGUL SYLLABLE JJWIC;Lo;0;L;;;;;N;;;;;
+CBB4;HANGUL SYLLABLE JJWIK;Lo;0;L;;;;;N;;;;;
+CBB5;HANGUL SYLLABLE JJWIT;Lo;0;L;;;;;N;;;;;
+CBB6;HANGUL SYLLABLE JJWIP;Lo;0;L;;;;;N;;;;;
+CBB7;HANGUL SYLLABLE JJWIH;Lo;0;L;;;;;N;;;;;
+CBB8;HANGUL SYLLABLE JJYU;Lo;0;L;;;;;N;;;;;
+CBB9;HANGUL SYLLABLE JJYUG;Lo;0;L;;;;;N;;;;;
+CBBA;HANGUL SYLLABLE JJYUGG;Lo;0;L;;;;;N;;;;;
+CBBB;HANGUL SYLLABLE JJYUGS;Lo;0;L;;;;;N;;;;;
+CBBC;HANGUL SYLLABLE JJYUN;Lo;0;L;;;;;N;;;;;
+CBBD;HANGUL SYLLABLE JJYUNI;Lo;0;L;;;;;N;;;;;
+CBBE;HANGUL SYLLABLE JJYUNH;Lo;0;L;;;;;N;;;;;
+CBBF;HANGUL SYLLABLE JJYUD;Lo;0;L;;;;;N;;;;;
+CBC0;HANGUL SYLLABLE JJYUL;Lo;0;L;;;;;N;;;;;
+CBC1;HANGUL SYLLABLE JJYULG;Lo;0;L;;;;;N;;;;;
+CBC2;HANGUL SYLLABLE JJYULM;Lo;0;L;;;;;N;;;;;
+CBC3;HANGUL SYLLABLE JJYULB;Lo;0;L;;;;;N;;;;;
+CBC4;HANGUL SYLLABLE JJYULS;Lo;0;L;;;;;N;;;;;
+CBC5;HANGUL SYLLABLE JJYULT;Lo;0;L;;;;;N;;;;;
+CBC6;HANGUL SYLLABLE JJYULP;Lo;0;L;;;;;N;;;;;
+CBC7;HANGUL SYLLABLE JJYULH;Lo;0;L;;;;;N;;;;;
+CBC8;HANGUL SYLLABLE JJYUM;Lo;0;L;;;;;N;;;;;
+CBC9;HANGUL SYLLABLE JJYUB;Lo;0;L;;;;;N;;;;;
+CBCA;HANGUL SYLLABLE JJYUBS;Lo;0;L;;;;;N;;;;;
+CBCB;HANGUL SYLLABLE JJYUS;Lo;0;L;;;;;N;;;;;
+CBCC;HANGUL SYLLABLE JJYUSS;Lo;0;L;;;;;N;;;;;
+CBCD;HANGUL SYLLABLE JJYUNG;Lo;0;L;;;;;N;;;;;
+CBCE;HANGUL SYLLABLE JJYUJ;Lo;0;L;;;;;N;;;;;
+CBCF;HANGUL SYLLABLE JJYUC;Lo;0;L;;;;;N;;;;;
+CBD0;HANGUL SYLLABLE JJYUK;Lo;0;L;;;;;N;;;;;
+CBD1;HANGUL SYLLABLE JJYUT;Lo;0;L;;;;;N;;;;;
+CBD2;HANGUL SYLLABLE JJYUP;Lo;0;L;;;;;N;;;;;
+CBD3;HANGUL SYLLABLE JJYUH;Lo;0;L;;;;;N;;;;;
+CBD4;HANGUL SYLLABLE JJEU;Lo;0;L;;;;;N;;;;;
+CBD5;HANGUL SYLLABLE JJEUG;Lo;0;L;;;;;N;;;;;
+CBD6;HANGUL SYLLABLE JJEUGG;Lo;0;L;;;;;N;;;;;
+CBD7;HANGUL SYLLABLE JJEUGS;Lo;0;L;;;;;N;;;;;
+CBD8;HANGUL SYLLABLE JJEUN;Lo;0;L;;;;;N;;;;;
+CBD9;HANGUL SYLLABLE JJEUNI;Lo;0;L;;;;;N;;;;;
+CBDA;HANGUL SYLLABLE JJEUNH;Lo;0;L;;;;;N;;;;;
+CBDB;HANGUL SYLLABLE JJEUD;Lo;0;L;;;;;N;;;;;
+CBDC;HANGUL SYLLABLE JJEUL;Lo;0;L;;;;;N;;;;;
+CBDD;HANGUL SYLLABLE JJEULG;Lo;0;L;;;;;N;;;;;
+CBDE;HANGUL SYLLABLE JJEULM;Lo;0;L;;;;;N;;;;;
+CBDF;HANGUL SYLLABLE JJEULB;Lo;0;L;;;;;N;;;;;
+CBE0;HANGUL SYLLABLE JJEULS;Lo;0;L;;;;;N;;;;;
+CBE1;HANGUL SYLLABLE JJEULT;Lo;0;L;;;;;N;;;;;
+CBE2;HANGUL SYLLABLE JJEULP;Lo;0;L;;;;;N;;;;;
+CBE3;HANGUL SYLLABLE JJEULH;Lo;0;L;;;;;N;;;;;
+CBE4;HANGUL SYLLABLE JJEUM;Lo;0;L;;;;;N;;;;;
+CBE5;HANGUL SYLLABLE JJEUB;Lo;0;L;;;;;N;;;;;
+CBE6;HANGUL SYLLABLE JJEUBS;Lo;0;L;;;;;N;;;;;
+CBE7;HANGUL SYLLABLE JJEUS;Lo;0;L;;;;;N;;;;;
+CBE8;HANGUL SYLLABLE JJEUSS;Lo;0;L;;;;;N;;;;;
+CBE9;HANGUL SYLLABLE JJEUNG;Lo;0;L;;;;;N;;;;;
+CBEA;HANGUL SYLLABLE JJEUJ;Lo;0;L;;;;;N;;;;;
+CBEB;HANGUL SYLLABLE JJEUC;Lo;0;L;;;;;N;;;;;
+CBEC;HANGUL SYLLABLE JJEUK;Lo;0;L;;;;;N;;;;;
+CBED;HANGUL SYLLABLE JJEUT;Lo;0;L;;;;;N;;;;;
+CBEE;HANGUL SYLLABLE JJEUP;Lo;0;L;;;;;N;;;;;
+CBEF;HANGUL SYLLABLE JJEUH;Lo;0;L;;;;;N;;;;;
+CBF0;HANGUL SYLLABLE JJYI;Lo;0;L;;;;;N;;;;;
+CBF1;HANGUL SYLLABLE JJYIG;Lo;0;L;;;;;N;;;;;
+CBF2;HANGUL SYLLABLE JJYIGG;Lo;0;L;;;;;N;;;;;
+CBF3;HANGUL SYLLABLE JJYIGS;Lo;0;L;;;;;N;;;;;
+CBF4;HANGUL SYLLABLE JJYIN;Lo;0;L;;;;;N;;;;;
+CBF5;HANGUL SYLLABLE JJYINI;Lo;0;L;;;;;N;;;;;
+CBF6;HANGUL SYLLABLE JJYINH;Lo;0;L;;;;;N;;;;;
+CBF7;HANGUL SYLLABLE JJYID;Lo;0;L;;;;;N;;;;;
+CBF8;HANGUL SYLLABLE JJYIL;Lo;0;L;;;;;N;;;;;
+CBF9;HANGUL SYLLABLE JJYILG;Lo;0;L;;;;;N;;;;;
+CBFA;HANGUL SYLLABLE JJYILM;Lo;0;L;;;;;N;;;;;
+CBFB;HANGUL SYLLABLE JJYILB;Lo;0;L;;;;;N;;;;;
+CBFC;HANGUL SYLLABLE JJYILS;Lo;0;L;;;;;N;;;;;
+CBFD;HANGUL SYLLABLE JJYILT;Lo;0;L;;;;;N;;;;;
+CBFE;HANGUL SYLLABLE JJYILP;Lo;0;L;;;;;N;;;;;
+CBFF;HANGUL SYLLABLE JJYILH;Lo;0;L;;;;;N;;;;;
+CC00;HANGUL SYLLABLE JJYIM;Lo;0;L;;;;;N;;;;;
+CC01;HANGUL SYLLABLE JJYIB;Lo;0;L;;;;;N;;;;;
+CC02;HANGUL SYLLABLE JJYIBS;Lo;0;L;;;;;N;;;;;
+CC03;HANGUL SYLLABLE JJYIS;Lo;0;L;;;;;N;;;;;
+CC04;HANGUL SYLLABLE JJYISS;Lo;0;L;;;;;N;;;;;
+CC05;HANGUL SYLLABLE JJYING;Lo;0;L;;;;;N;;;;;
+CC06;HANGUL SYLLABLE JJYIJ;Lo;0;L;;;;;N;;;;;
+CC07;HANGUL SYLLABLE JJYIC;Lo;0;L;;;;;N;;;;;
+CC08;HANGUL SYLLABLE JJYIK;Lo;0;L;;;;;N;;;;;
+CC09;HANGUL SYLLABLE JJYIT;Lo;0;L;;;;;N;;;;;
+CC0A;HANGUL SYLLABLE JJYIP;Lo;0;L;;;;;N;;;;;
+CC0B;HANGUL SYLLABLE JJYIH;Lo;0;L;;;;;N;;;;;
+CC0C;HANGUL SYLLABLE JJI;Lo;0;L;;;;;N;;;;;
+CC0D;HANGUL SYLLABLE JJIG;Lo;0;L;;;;;N;;;;;
+CC0E;HANGUL SYLLABLE JJIGG;Lo;0;L;;;;;N;;;;;
+CC0F;HANGUL SYLLABLE JJIGS;Lo;0;L;;;;;N;;;;;
+CC10;HANGUL SYLLABLE JJIN;Lo;0;L;;;;;N;;;;;
+CC11;HANGUL SYLLABLE JJINI;Lo;0;L;;;;;N;;;;;
+CC12;HANGUL SYLLABLE JJINH;Lo;0;L;;;;;N;;;;;
+CC13;HANGUL SYLLABLE JJID;Lo;0;L;;;;;N;;;;;
+CC14;HANGUL SYLLABLE JJIL;Lo;0;L;;;;;N;;;;;
+CC15;HANGUL SYLLABLE JJILG;Lo;0;L;;;;;N;;;;;
+CC16;HANGUL SYLLABLE JJILM;Lo;0;L;;;;;N;;;;;
+CC17;HANGUL SYLLABLE JJILB;Lo;0;L;;;;;N;;;;;
+CC18;HANGUL SYLLABLE JJILS;Lo;0;L;;;;;N;;;;;
+CC19;HANGUL SYLLABLE JJILT;Lo;0;L;;;;;N;;;;;
+CC1A;HANGUL SYLLABLE JJILP;Lo;0;L;;;;;N;;;;;
+CC1B;HANGUL SYLLABLE JJILH;Lo;0;L;;;;;N;;;;;
+CC1C;HANGUL SYLLABLE JJIM;Lo;0;L;;;;;N;;;;;
+CC1D;HANGUL SYLLABLE JJIB;Lo;0;L;;;;;N;;;;;
+CC1E;HANGUL SYLLABLE JJIBS;Lo;0;L;;;;;N;;;;;
+CC1F;HANGUL SYLLABLE JJIS;Lo;0;L;;;;;N;;;;;
+CC20;HANGUL SYLLABLE JJISS;Lo;0;L;;;;;N;;;;;
+CC21;HANGUL SYLLABLE JJING;Lo;0;L;;;;;N;;;;;
+CC22;HANGUL SYLLABLE JJIJ;Lo;0;L;;;;;N;;;;;
+CC23;HANGUL SYLLABLE JJIC;Lo;0;L;;;;;N;;;;;
+CC24;HANGUL SYLLABLE JJIK;Lo;0;L;;;;;N;;;;;
+CC25;HANGUL SYLLABLE JJIT;Lo;0;L;;;;;N;;;;;
+CC26;HANGUL SYLLABLE JJIP;Lo;0;L;;;;;N;;;;;
+CC27;HANGUL SYLLABLE JJIH;Lo;0;L;;;;;N;;;;;
+CC28;HANGUL SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+CC29;HANGUL SYLLABLE CAG;Lo;0;L;;;;;N;;;;;
+CC2A;HANGUL SYLLABLE CAGG;Lo;0;L;;;;;N;;;;;
+CC2B;HANGUL SYLLABLE CAGS;Lo;0;L;;;;;N;;;;;
+CC2C;HANGUL SYLLABLE CAN;Lo;0;L;;;;;N;;;;;
+CC2D;HANGUL SYLLABLE CANI;Lo;0;L;;;;;N;;;;;
+CC2E;HANGUL SYLLABLE CANH;Lo;0;L;;;;;N;;;;;
+CC2F;HANGUL SYLLABLE CAD;Lo;0;L;;;;;N;;;;;
+CC30;HANGUL SYLLABLE CAL;Lo;0;L;;;;;N;;;;;
+CC31;HANGUL SYLLABLE CALG;Lo;0;L;;;;;N;;;;;
+CC32;HANGUL SYLLABLE CALM;Lo;0;L;;;;;N;;;;;
+CC33;HANGUL SYLLABLE CALB;Lo;0;L;;;;;N;;;;;
+CC34;HANGUL SYLLABLE CALS;Lo;0;L;;;;;N;;;;;
+CC35;HANGUL SYLLABLE CALT;Lo;0;L;;;;;N;;;;;
+CC36;HANGUL SYLLABLE CALP;Lo;0;L;;;;;N;;;;;
+CC37;HANGUL SYLLABLE CALH;Lo;0;L;;;;;N;;;;;
+CC38;HANGUL SYLLABLE CAM;Lo;0;L;;;;;N;;;;;
+CC39;HANGUL SYLLABLE CAB;Lo;0;L;;;;;N;;;;;
+CC3A;HANGUL SYLLABLE CABS;Lo;0;L;;;;;N;;;;;
+CC3B;HANGUL SYLLABLE CAS;Lo;0;L;;;;;N;;;;;
+CC3C;HANGUL SYLLABLE CASS;Lo;0;L;;;;;N;;;;;
+CC3D;HANGUL SYLLABLE CANG;Lo;0;L;;;;;N;;;;;
+CC3E;HANGUL SYLLABLE CAJ;Lo;0;L;;;;;N;;;;;
+CC3F;HANGUL SYLLABLE CAC;Lo;0;L;;;;;N;;;;;
+CC40;HANGUL SYLLABLE CAK;Lo;0;L;;;;;N;;;;;
+CC41;HANGUL SYLLABLE CAT;Lo;0;L;;;;;N;;;;;
+CC42;HANGUL SYLLABLE CAP;Lo;0;L;;;;;N;;;;;
+CC43;HANGUL SYLLABLE CAH;Lo;0;L;;;;;N;;;;;
+CC44;HANGUL SYLLABLE CAE;Lo;0;L;;;;;N;;;;;
+CC45;HANGUL SYLLABLE CAEG;Lo;0;L;;;;;N;;;;;
+CC46;HANGUL SYLLABLE CAEGG;Lo;0;L;;;;;N;;;;;
+CC47;HANGUL SYLLABLE CAEGS;Lo;0;L;;;;;N;;;;;
+CC48;HANGUL SYLLABLE CAEN;Lo;0;L;;;;;N;;;;;
+CC49;HANGUL SYLLABLE CAENI;Lo;0;L;;;;;N;;;;;
+CC4A;HANGUL SYLLABLE CAENH;Lo;0;L;;;;;N;;;;;
+CC4B;HANGUL SYLLABLE CAED;Lo;0;L;;;;;N;;;;;
+CC4C;HANGUL SYLLABLE CAEL;Lo;0;L;;;;;N;;;;;
+CC4D;HANGUL SYLLABLE CAELG;Lo;0;L;;;;;N;;;;;
+CC4E;HANGUL SYLLABLE CAELM;Lo;0;L;;;;;N;;;;;
+CC4F;HANGUL SYLLABLE CAELB;Lo;0;L;;;;;N;;;;;
+CC50;HANGUL SYLLABLE CAELS;Lo;0;L;;;;;N;;;;;
+CC51;HANGUL SYLLABLE CAELT;Lo;0;L;;;;;N;;;;;
+CC52;HANGUL SYLLABLE CAELP;Lo;0;L;;;;;N;;;;;
+CC53;HANGUL SYLLABLE CAELH;Lo;0;L;;;;;N;;;;;
+CC54;HANGUL SYLLABLE CAEM;Lo;0;L;;;;;N;;;;;
+CC55;HANGUL SYLLABLE CAEB;Lo;0;L;;;;;N;;;;;
+CC56;HANGUL SYLLABLE CAEBS;Lo;0;L;;;;;N;;;;;
+CC57;HANGUL SYLLABLE CAES;Lo;0;L;;;;;N;;;;;
+CC58;HANGUL SYLLABLE CAESS;Lo;0;L;;;;;N;;;;;
+CC59;HANGUL SYLLABLE CAENG;Lo;0;L;;;;;N;;;;;
+CC5A;HANGUL SYLLABLE CAEJ;Lo;0;L;;;;;N;;;;;
+CC5B;HANGUL SYLLABLE CAEC;Lo;0;L;;;;;N;;;;;
+CC5C;HANGUL SYLLABLE CAEK;Lo;0;L;;;;;N;;;;;
+CC5D;HANGUL SYLLABLE CAET;Lo;0;L;;;;;N;;;;;
+CC5E;HANGUL SYLLABLE CAEP;Lo;0;L;;;;;N;;;;;
+CC5F;HANGUL SYLLABLE CAEH;Lo;0;L;;;;;N;;;;;
+CC60;HANGUL SYLLABLE CYA;Lo;0;L;;;;;N;;;;;
+CC61;HANGUL SYLLABLE CYAG;Lo;0;L;;;;;N;;;;;
+CC62;HANGUL SYLLABLE CYAGG;Lo;0;L;;;;;N;;;;;
+CC63;HANGUL SYLLABLE CYAGS;Lo;0;L;;;;;N;;;;;
+CC64;HANGUL SYLLABLE CYAN;Lo;0;L;;;;;N;;;;;
+CC65;HANGUL SYLLABLE CYANI;Lo;0;L;;;;;N;;;;;
+CC66;HANGUL SYLLABLE CYANH;Lo;0;L;;;;;N;;;;;
+CC67;HANGUL SYLLABLE CYAD;Lo;0;L;;;;;N;;;;;
+CC68;HANGUL SYLLABLE CYAL;Lo;0;L;;;;;N;;;;;
+CC69;HANGUL SYLLABLE CYALG;Lo;0;L;;;;;N;;;;;
+CC6A;HANGUL SYLLABLE CYALM;Lo;0;L;;;;;N;;;;;
+CC6B;HANGUL SYLLABLE CYALB;Lo;0;L;;;;;N;;;;;
+CC6C;HANGUL SYLLABLE CYALS;Lo;0;L;;;;;N;;;;;
+CC6D;HANGUL SYLLABLE CYALT;Lo;0;L;;;;;N;;;;;
+CC6E;HANGUL SYLLABLE CYALP;Lo;0;L;;;;;N;;;;;
+CC6F;HANGUL SYLLABLE CYALH;Lo;0;L;;;;;N;;;;;
+CC70;HANGUL SYLLABLE CYAM;Lo;0;L;;;;;N;;;;;
+CC71;HANGUL SYLLABLE CYAB;Lo;0;L;;;;;N;;;;;
+CC72;HANGUL SYLLABLE CYABS;Lo;0;L;;;;;N;;;;;
+CC73;HANGUL SYLLABLE CYAS;Lo;0;L;;;;;N;;;;;
+CC74;HANGUL SYLLABLE CYASS;Lo;0;L;;;;;N;;;;;
+CC75;HANGUL SYLLABLE CYANG;Lo;0;L;;;;;N;;;;;
+CC76;HANGUL SYLLABLE CYAJ;Lo;0;L;;;;;N;;;;;
+CC77;HANGUL SYLLABLE CYAC;Lo;0;L;;;;;N;;;;;
+CC78;HANGUL SYLLABLE CYAK;Lo;0;L;;;;;N;;;;;
+CC79;HANGUL SYLLABLE CYAT;Lo;0;L;;;;;N;;;;;
+CC7A;HANGUL SYLLABLE CYAP;Lo;0;L;;;;;N;;;;;
+CC7B;HANGUL SYLLABLE CYAH;Lo;0;L;;;;;N;;;;;
+CC7C;HANGUL SYLLABLE CYAE;Lo;0;L;;;;;N;;;;;
+CC7D;HANGUL SYLLABLE CYAEG;Lo;0;L;;;;;N;;;;;
+CC7E;HANGUL SYLLABLE CYAEGG;Lo;0;L;;;;;N;;;;;
+CC7F;HANGUL SYLLABLE CYAEGS;Lo;0;L;;;;;N;;;;;
+CC80;HANGUL SYLLABLE CYAEN;Lo;0;L;;;;;N;;;;;
+CC81;HANGUL SYLLABLE CYAENI;Lo;0;L;;;;;N;;;;;
+CC82;HANGUL SYLLABLE CYAENH;Lo;0;L;;;;;N;;;;;
+CC83;HANGUL SYLLABLE CYAED;Lo;0;L;;;;;N;;;;;
+CC84;HANGUL SYLLABLE CYAEL;Lo;0;L;;;;;N;;;;;
+CC85;HANGUL SYLLABLE CYAELG;Lo;0;L;;;;;N;;;;;
+CC86;HANGUL SYLLABLE CYAELM;Lo;0;L;;;;;N;;;;;
+CC87;HANGUL SYLLABLE CYAELB;Lo;0;L;;;;;N;;;;;
+CC88;HANGUL SYLLABLE CYAELS;Lo;0;L;;;;;N;;;;;
+CC89;HANGUL SYLLABLE CYAELT;Lo;0;L;;;;;N;;;;;
+CC8A;HANGUL SYLLABLE CYAELP;Lo;0;L;;;;;N;;;;;
+CC8B;HANGUL SYLLABLE CYAELH;Lo;0;L;;;;;N;;;;;
+CC8C;HANGUL SYLLABLE CYAEM;Lo;0;L;;;;;N;;;;;
+CC8D;HANGUL SYLLABLE CYAEB;Lo;0;L;;;;;N;;;;;
+CC8E;HANGUL SYLLABLE CYAEBS;Lo;0;L;;;;;N;;;;;
+CC8F;HANGUL SYLLABLE CYAES;Lo;0;L;;;;;N;;;;;
+CC90;HANGUL SYLLABLE CYAESS;Lo;0;L;;;;;N;;;;;
+CC91;HANGUL SYLLABLE CYAENG;Lo;0;L;;;;;N;;;;;
+CC92;HANGUL SYLLABLE CYAEJ;Lo;0;L;;;;;N;;;;;
+CC93;HANGUL SYLLABLE CYAEC;Lo;0;L;;;;;N;;;;;
+CC94;HANGUL SYLLABLE CYAEK;Lo;0;L;;;;;N;;;;;
+CC95;HANGUL SYLLABLE CYAET;Lo;0;L;;;;;N;;;;;
+CC96;HANGUL SYLLABLE CYAEP;Lo;0;L;;;;;N;;;;;
+CC97;HANGUL SYLLABLE CYAEH;Lo;0;L;;;;;N;;;;;
+CC98;HANGUL SYLLABLE CEO;Lo;0;L;;;;;N;;;;;
+CC99;HANGUL SYLLABLE CEOG;Lo;0;L;;;;;N;;;;;
+CC9A;HANGUL SYLLABLE CEOGG;Lo;0;L;;;;;N;;;;;
+CC9B;HANGUL SYLLABLE CEOGS;Lo;0;L;;;;;N;;;;;
+CC9C;HANGUL SYLLABLE CEON;Lo;0;L;;;;;N;;;;;
+CC9D;HANGUL SYLLABLE CEONI;Lo;0;L;;;;;N;;;;;
+CC9E;HANGUL SYLLABLE CEONH;Lo;0;L;;;;;N;;;;;
+CC9F;HANGUL SYLLABLE CEOD;Lo;0;L;;;;;N;;;;;
+CCA0;HANGUL SYLLABLE CEOL;Lo;0;L;;;;;N;;;;;
+CCA1;HANGUL SYLLABLE CEOLG;Lo;0;L;;;;;N;;;;;
+CCA2;HANGUL SYLLABLE CEOLM;Lo;0;L;;;;;N;;;;;
+CCA3;HANGUL SYLLABLE CEOLB;Lo;0;L;;;;;N;;;;;
+CCA4;HANGUL SYLLABLE CEOLS;Lo;0;L;;;;;N;;;;;
+CCA5;HANGUL SYLLABLE CEOLT;Lo;0;L;;;;;N;;;;;
+CCA6;HANGUL SYLLABLE CEOLP;Lo;0;L;;;;;N;;;;;
+CCA7;HANGUL SYLLABLE CEOLH;Lo;0;L;;;;;N;;;;;
+CCA8;HANGUL SYLLABLE CEOM;Lo;0;L;;;;;N;;;;;
+CCA9;HANGUL SYLLABLE CEOB;Lo;0;L;;;;;N;;;;;
+CCAA;HANGUL SYLLABLE CEOBS;Lo;0;L;;;;;N;;;;;
+CCAB;HANGUL SYLLABLE CEOS;Lo;0;L;;;;;N;;;;;
+CCAC;HANGUL SYLLABLE CEOSS;Lo;0;L;;;;;N;;;;;
+CCAD;HANGUL SYLLABLE CEONG;Lo;0;L;;;;;N;;;;;
+CCAE;HANGUL SYLLABLE CEOJ;Lo;0;L;;;;;N;;;;;
+CCAF;HANGUL SYLLABLE CEOC;Lo;0;L;;;;;N;;;;;
+CCB0;HANGUL SYLLABLE CEOK;Lo;0;L;;;;;N;;;;;
+CCB1;HANGUL SYLLABLE CEOT;Lo;0;L;;;;;N;;;;;
+CCB2;HANGUL SYLLABLE CEOP;Lo;0;L;;;;;N;;;;;
+CCB3;HANGUL SYLLABLE CEOH;Lo;0;L;;;;;N;;;;;
+CCB4;HANGUL SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+CCB5;HANGUL SYLLABLE CEG;Lo;0;L;;;;;N;;;;;
+CCB6;HANGUL SYLLABLE CEGG;Lo;0;L;;;;;N;;;;;
+CCB7;HANGUL SYLLABLE CEGS;Lo;0;L;;;;;N;;;;;
+CCB8;HANGUL SYLLABLE CEN;Lo;0;L;;;;;N;;;;;
+CCB9;HANGUL SYLLABLE CENI;Lo;0;L;;;;;N;;;;;
+CCBA;HANGUL SYLLABLE CENH;Lo;0;L;;;;;N;;;;;
+CCBB;HANGUL SYLLABLE CED;Lo;0;L;;;;;N;;;;;
+CCBC;HANGUL SYLLABLE CEL;Lo;0;L;;;;;N;;;;;
+CCBD;HANGUL SYLLABLE CELG;Lo;0;L;;;;;N;;;;;
+CCBE;HANGUL SYLLABLE CELM;Lo;0;L;;;;;N;;;;;
+CCBF;HANGUL SYLLABLE CELB;Lo;0;L;;;;;N;;;;;
+CCC0;HANGUL SYLLABLE CELS;Lo;0;L;;;;;N;;;;;
+CCC1;HANGUL SYLLABLE CELT;Lo;0;L;;;;;N;;;;;
+CCC2;HANGUL SYLLABLE CELP;Lo;0;L;;;;;N;;;;;
+CCC3;HANGUL SYLLABLE CELH;Lo;0;L;;;;;N;;;;;
+CCC4;HANGUL SYLLABLE CEM;Lo;0;L;;;;;N;;;;;
+CCC5;HANGUL SYLLABLE CEB;Lo;0;L;;;;;N;;;;;
+CCC6;HANGUL SYLLABLE CEBS;Lo;0;L;;;;;N;;;;;
+CCC7;HANGUL SYLLABLE CES;Lo;0;L;;;;;N;;;;;
+CCC8;HANGUL SYLLABLE CESS;Lo;0;L;;;;;N;;;;;
+CCC9;HANGUL SYLLABLE CENG;Lo;0;L;;;;;N;;;;;
+CCCA;HANGUL SYLLABLE CEJ;Lo;0;L;;;;;N;;;;;
+CCCB;HANGUL SYLLABLE CEC;Lo;0;L;;;;;N;;;;;
+CCCC;HANGUL SYLLABLE CEK;Lo;0;L;;;;;N;;;;;
+CCCD;HANGUL SYLLABLE CET;Lo;0;L;;;;;N;;;;;
+CCCE;HANGUL SYLLABLE CEP;Lo;0;L;;;;;N;;;;;
+CCCF;HANGUL SYLLABLE CEH;Lo;0;L;;;;;N;;;;;
+CCD0;HANGUL SYLLABLE CYEO;Lo;0;L;;;;;N;;;;;
+CCD1;HANGUL SYLLABLE CYEOG;Lo;0;L;;;;;N;;;;;
+CCD2;HANGUL SYLLABLE CYEOGG;Lo;0;L;;;;;N;;;;;
+CCD3;HANGUL SYLLABLE CYEOGS;Lo;0;L;;;;;N;;;;;
+CCD4;HANGUL SYLLABLE CYEON;Lo;0;L;;;;;N;;;;;
+CCD5;HANGUL SYLLABLE CYEONI;Lo;0;L;;;;;N;;;;;
+CCD6;HANGUL SYLLABLE CYEONH;Lo;0;L;;;;;N;;;;;
+CCD7;HANGUL SYLLABLE CYEOD;Lo;0;L;;;;;N;;;;;
+CCD8;HANGUL SYLLABLE CYEOL;Lo;0;L;;;;;N;;;;;
+CCD9;HANGUL SYLLABLE CYEOLG;Lo;0;L;;;;;N;;;;;
+CCDA;HANGUL SYLLABLE CYEOLM;Lo;0;L;;;;;N;;;;;
+CCDB;HANGUL SYLLABLE CYEOLB;Lo;0;L;;;;;N;;;;;
+CCDC;HANGUL SYLLABLE CYEOLS;Lo;0;L;;;;;N;;;;;
+CCDD;HANGUL SYLLABLE CYEOLT;Lo;0;L;;;;;N;;;;;
+CCDE;HANGUL SYLLABLE CYEOLP;Lo;0;L;;;;;N;;;;;
+CCDF;HANGUL SYLLABLE CYEOLH;Lo;0;L;;;;;N;;;;;
+CCE0;HANGUL SYLLABLE CYEOM;Lo;0;L;;;;;N;;;;;
+CCE1;HANGUL SYLLABLE CYEOB;Lo;0;L;;;;;N;;;;;
+CCE2;HANGUL SYLLABLE CYEOBS;Lo;0;L;;;;;N;;;;;
+CCE3;HANGUL SYLLABLE CYEOS;Lo;0;L;;;;;N;;;;;
+CCE4;HANGUL SYLLABLE CYEOSS;Lo;0;L;;;;;N;;;;;
+CCE5;HANGUL SYLLABLE CYEONG;Lo;0;L;;;;;N;;;;;
+CCE6;HANGUL SYLLABLE CYEOJ;Lo;0;L;;;;;N;;;;;
+CCE7;HANGUL SYLLABLE CYEOC;Lo;0;L;;;;;N;;;;;
+CCE8;HANGUL SYLLABLE CYEOK;Lo;0;L;;;;;N;;;;;
+CCE9;HANGUL SYLLABLE CYEOT;Lo;0;L;;;;;N;;;;;
+CCEA;HANGUL SYLLABLE CYEOP;Lo;0;L;;;;;N;;;;;
+CCEB;HANGUL SYLLABLE CYEOH;Lo;0;L;;;;;N;;;;;
+CCEC;HANGUL SYLLABLE CYE;Lo;0;L;;;;;N;;;;;
+CCED;HANGUL SYLLABLE CYEG;Lo;0;L;;;;;N;;;;;
+CCEE;HANGUL SYLLABLE CYEGG;Lo;0;L;;;;;N;;;;;
+CCEF;HANGUL SYLLABLE CYEGS;Lo;0;L;;;;;N;;;;;
+CCF0;HANGUL SYLLABLE CYEN;Lo;0;L;;;;;N;;;;;
+CCF1;HANGUL SYLLABLE CYENI;Lo;0;L;;;;;N;;;;;
+CCF2;HANGUL SYLLABLE CYENH;Lo;0;L;;;;;N;;;;;
+CCF3;HANGUL SYLLABLE CYED;Lo;0;L;;;;;N;;;;;
+CCF4;HANGUL SYLLABLE CYEL;Lo;0;L;;;;;N;;;;;
+CCF5;HANGUL SYLLABLE CYELG;Lo;0;L;;;;;N;;;;;
+CCF6;HANGUL SYLLABLE CYELM;Lo;0;L;;;;;N;;;;;
+CCF7;HANGUL SYLLABLE CYELB;Lo;0;L;;;;;N;;;;;
+CCF8;HANGUL SYLLABLE CYELS;Lo;0;L;;;;;N;;;;;
+CCF9;HANGUL SYLLABLE CYELT;Lo;0;L;;;;;N;;;;;
+CCFA;HANGUL SYLLABLE CYELP;Lo;0;L;;;;;N;;;;;
+CCFB;HANGUL SYLLABLE CYELH;Lo;0;L;;;;;N;;;;;
+CCFC;HANGUL SYLLABLE CYEM;Lo;0;L;;;;;N;;;;;
+CCFD;HANGUL SYLLABLE CYEB;Lo;0;L;;;;;N;;;;;
+CCFE;HANGUL SYLLABLE CYEBS;Lo;0;L;;;;;N;;;;;
+CCFF;HANGUL SYLLABLE CYES;Lo;0;L;;;;;N;;;;;
+CD00;HANGUL SYLLABLE CYESS;Lo;0;L;;;;;N;;;;;
+CD01;HANGUL SYLLABLE CYENG;Lo;0;L;;;;;N;;;;;
+CD02;HANGUL SYLLABLE CYEJ;Lo;0;L;;;;;N;;;;;
+CD03;HANGUL SYLLABLE CYEC;Lo;0;L;;;;;N;;;;;
+CD04;HANGUL SYLLABLE CYEK;Lo;0;L;;;;;N;;;;;
+CD05;HANGUL SYLLABLE CYET;Lo;0;L;;;;;N;;;;;
+CD06;HANGUL SYLLABLE CYEP;Lo;0;L;;;;;N;;;;;
+CD07;HANGUL SYLLABLE CYEH;Lo;0;L;;;;;N;;;;;
+CD08;HANGUL SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+CD09;HANGUL SYLLABLE COG;Lo;0;L;;;;;N;;;;;
+CD0A;HANGUL SYLLABLE COGG;Lo;0;L;;;;;N;;;;;
+CD0B;HANGUL SYLLABLE COGS;Lo;0;L;;;;;N;;;;;
+CD0C;HANGUL SYLLABLE CON;Lo;0;L;;;;;N;;;;;
+CD0D;HANGUL SYLLABLE CONI;Lo;0;L;;;;;N;;;;;
+CD0E;HANGUL SYLLABLE CONH;Lo;0;L;;;;;N;;;;;
+CD0F;HANGUL SYLLABLE COD;Lo;0;L;;;;;N;;;;;
+CD10;HANGUL SYLLABLE COL;Lo;0;L;;;;;N;;;;;
+CD11;HANGUL SYLLABLE COLG;Lo;0;L;;;;;N;;;;;
+CD12;HANGUL SYLLABLE COLM;Lo;0;L;;;;;N;;;;;
+CD13;HANGUL SYLLABLE COLB;Lo;0;L;;;;;N;;;;;
+CD14;HANGUL SYLLABLE COLS;Lo;0;L;;;;;N;;;;;
+CD15;HANGUL SYLLABLE COLT;Lo;0;L;;;;;N;;;;;
+CD16;HANGUL SYLLABLE COLP;Lo;0;L;;;;;N;;;;;
+CD17;HANGUL SYLLABLE COLH;Lo;0;L;;;;;N;;;;;
+CD18;HANGUL SYLLABLE COM;Lo;0;L;;;;;N;;;;;
+CD19;HANGUL SYLLABLE COB;Lo;0;L;;;;;N;;;;;
+CD1A;HANGUL SYLLABLE COBS;Lo;0;L;;;;;N;;;;;
+CD1B;HANGUL SYLLABLE COS;Lo;0;L;;;;;N;;;;;
+CD1C;HANGUL SYLLABLE COSS;Lo;0;L;;;;;N;;;;;
+CD1D;HANGUL SYLLABLE CONG;Lo;0;L;;;;;N;;;;;
+CD1E;HANGUL SYLLABLE COJ;Lo;0;L;;;;;N;;;;;
+CD1F;HANGUL SYLLABLE COC;Lo;0;L;;;;;N;;;;;
+CD20;HANGUL SYLLABLE COK;Lo;0;L;;;;;N;;;;;
+CD21;HANGUL SYLLABLE COT;Lo;0;L;;;;;N;;;;;
+CD22;HANGUL SYLLABLE COP;Lo;0;L;;;;;N;;;;;
+CD23;HANGUL SYLLABLE COH;Lo;0;L;;;;;N;;;;;
+CD24;HANGUL SYLLABLE CWA;Lo;0;L;;;;;N;;;;;
+CD25;HANGUL SYLLABLE CWAG;Lo;0;L;;;;;N;;;;;
+CD26;HANGUL SYLLABLE CWAGG;Lo;0;L;;;;;N;;;;;
+CD27;HANGUL SYLLABLE CWAGS;Lo;0;L;;;;;N;;;;;
+CD28;HANGUL SYLLABLE CWAN;Lo;0;L;;;;;N;;;;;
+CD29;HANGUL SYLLABLE CWANI;Lo;0;L;;;;;N;;;;;
+CD2A;HANGUL SYLLABLE CWANH;Lo;0;L;;;;;N;;;;;
+CD2B;HANGUL SYLLABLE CWAD;Lo;0;L;;;;;N;;;;;
+CD2C;HANGUL SYLLABLE CWAL;Lo;0;L;;;;;N;;;;;
+CD2D;HANGUL SYLLABLE CWALG;Lo;0;L;;;;;N;;;;;
+CD2E;HANGUL SYLLABLE CWALM;Lo;0;L;;;;;N;;;;;
+CD2F;HANGUL SYLLABLE CWALB;Lo;0;L;;;;;N;;;;;
+CD30;HANGUL SYLLABLE CWALS;Lo;0;L;;;;;N;;;;;
+CD31;HANGUL SYLLABLE CWALT;Lo;0;L;;;;;N;;;;;
+CD32;HANGUL SYLLABLE CWALP;Lo;0;L;;;;;N;;;;;
+CD33;HANGUL SYLLABLE CWALH;Lo;0;L;;;;;N;;;;;
+CD34;HANGUL SYLLABLE CWAM;Lo;0;L;;;;;N;;;;;
+CD35;HANGUL SYLLABLE CWAB;Lo;0;L;;;;;N;;;;;
+CD36;HANGUL SYLLABLE CWABS;Lo;0;L;;;;;N;;;;;
+CD37;HANGUL SYLLABLE CWAS;Lo;0;L;;;;;N;;;;;
+CD38;HANGUL SYLLABLE CWASS;Lo;0;L;;;;;N;;;;;
+CD39;HANGUL SYLLABLE CWANG;Lo;0;L;;;;;N;;;;;
+CD3A;HANGUL SYLLABLE CWAJ;Lo;0;L;;;;;N;;;;;
+CD3B;HANGUL SYLLABLE CWAC;Lo;0;L;;;;;N;;;;;
+CD3C;HANGUL SYLLABLE CWAK;Lo;0;L;;;;;N;;;;;
+CD3D;HANGUL SYLLABLE CWAT;Lo;0;L;;;;;N;;;;;
+CD3E;HANGUL SYLLABLE CWAP;Lo;0;L;;;;;N;;;;;
+CD3F;HANGUL SYLLABLE CWAH;Lo;0;L;;;;;N;;;;;
+CD40;HANGUL SYLLABLE CWAE;Lo;0;L;;;;;N;;;;;
+CD41;HANGUL SYLLABLE CWAEG;Lo;0;L;;;;;N;;;;;
+CD42;HANGUL SYLLABLE CWAEGG;Lo;0;L;;;;;N;;;;;
+CD43;HANGUL SYLLABLE CWAEGS;Lo;0;L;;;;;N;;;;;
+CD44;HANGUL SYLLABLE CWAEN;Lo;0;L;;;;;N;;;;;
+CD45;HANGUL SYLLABLE CWAENI;Lo;0;L;;;;;N;;;;;
+CD46;HANGUL SYLLABLE CWAENH;Lo;0;L;;;;;N;;;;;
+CD47;HANGUL SYLLABLE CWAED;Lo;0;L;;;;;N;;;;;
+CD48;HANGUL SYLLABLE CWAEL;Lo;0;L;;;;;N;;;;;
+CD49;HANGUL SYLLABLE CWAELG;Lo;0;L;;;;;N;;;;;
+CD4A;HANGUL SYLLABLE CWAELM;Lo;0;L;;;;;N;;;;;
+CD4B;HANGUL SYLLABLE CWAELB;Lo;0;L;;;;;N;;;;;
+CD4C;HANGUL SYLLABLE CWAELS;Lo;0;L;;;;;N;;;;;
+CD4D;HANGUL SYLLABLE CWAELT;Lo;0;L;;;;;N;;;;;
+CD4E;HANGUL SYLLABLE CWAELP;Lo;0;L;;;;;N;;;;;
+CD4F;HANGUL SYLLABLE CWAELH;Lo;0;L;;;;;N;;;;;
+CD50;HANGUL SYLLABLE CWAEM;Lo;0;L;;;;;N;;;;;
+CD51;HANGUL SYLLABLE CWAEB;Lo;0;L;;;;;N;;;;;
+CD52;HANGUL SYLLABLE CWAEBS;Lo;0;L;;;;;N;;;;;
+CD53;HANGUL SYLLABLE CWAES;Lo;0;L;;;;;N;;;;;
+CD54;HANGUL SYLLABLE CWAESS;Lo;0;L;;;;;N;;;;;
+CD55;HANGUL SYLLABLE CWAENG;Lo;0;L;;;;;N;;;;;
+CD56;HANGUL SYLLABLE CWAEJ;Lo;0;L;;;;;N;;;;;
+CD57;HANGUL SYLLABLE CWAEC;Lo;0;L;;;;;N;;;;;
+CD58;HANGUL SYLLABLE CWAEK;Lo;0;L;;;;;N;;;;;
+CD59;HANGUL SYLLABLE CWAET;Lo;0;L;;;;;N;;;;;
+CD5A;HANGUL SYLLABLE CWAEP;Lo;0;L;;;;;N;;;;;
+CD5B;HANGUL SYLLABLE CWAEH;Lo;0;L;;;;;N;;;;;
+CD5C;HANGUL SYLLABLE COE;Lo;0;L;;;;;N;;;;;
+CD5D;HANGUL SYLLABLE COEG;Lo;0;L;;;;;N;;;;;
+CD5E;HANGUL SYLLABLE COEGG;Lo;0;L;;;;;N;;;;;
+CD5F;HANGUL SYLLABLE COEGS;Lo;0;L;;;;;N;;;;;
+CD60;HANGUL SYLLABLE COEN;Lo;0;L;;;;;N;;;;;
+CD61;HANGUL SYLLABLE COENI;Lo;0;L;;;;;N;;;;;
+CD62;HANGUL SYLLABLE COENH;Lo;0;L;;;;;N;;;;;
+CD63;HANGUL SYLLABLE COED;Lo;0;L;;;;;N;;;;;
+CD64;HANGUL SYLLABLE COEL;Lo;0;L;;;;;N;;;;;
+CD65;HANGUL SYLLABLE COELG;Lo;0;L;;;;;N;;;;;
+CD66;HANGUL SYLLABLE COELM;Lo;0;L;;;;;N;;;;;
+CD67;HANGUL SYLLABLE COELB;Lo;0;L;;;;;N;;;;;
+CD68;HANGUL SYLLABLE COELS;Lo;0;L;;;;;N;;;;;
+CD69;HANGUL SYLLABLE COELT;Lo;0;L;;;;;N;;;;;
+CD6A;HANGUL SYLLABLE COELP;Lo;0;L;;;;;N;;;;;
+CD6B;HANGUL SYLLABLE COELH;Lo;0;L;;;;;N;;;;;
+CD6C;HANGUL SYLLABLE COEM;Lo;0;L;;;;;N;;;;;
+CD6D;HANGUL SYLLABLE COEB;Lo;0;L;;;;;N;;;;;
+CD6E;HANGUL SYLLABLE COEBS;Lo;0;L;;;;;N;;;;;
+CD6F;HANGUL SYLLABLE COES;Lo;0;L;;;;;N;;;;;
+CD70;HANGUL SYLLABLE COESS;Lo;0;L;;;;;N;;;;;
+CD71;HANGUL SYLLABLE COENG;Lo;0;L;;;;;N;;;;;
+CD72;HANGUL SYLLABLE COEJ;Lo;0;L;;;;;N;;;;;
+CD73;HANGUL SYLLABLE COEC;Lo;0;L;;;;;N;;;;;
+CD74;HANGUL SYLLABLE COEK;Lo;0;L;;;;;N;;;;;
+CD75;HANGUL SYLLABLE COET;Lo;0;L;;;;;N;;;;;
+CD76;HANGUL SYLLABLE COEP;Lo;0;L;;;;;N;;;;;
+CD77;HANGUL SYLLABLE COEH;Lo;0;L;;;;;N;;;;;
+CD78;HANGUL SYLLABLE CYO;Lo;0;L;;;;;N;;;;;
+CD79;HANGUL SYLLABLE CYOG;Lo;0;L;;;;;N;;;;;
+CD7A;HANGUL SYLLABLE CYOGG;Lo;0;L;;;;;N;;;;;
+CD7B;HANGUL SYLLABLE CYOGS;Lo;0;L;;;;;N;;;;;
+CD7C;HANGUL SYLLABLE CYON;Lo;0;L;;;;;N;;;;;
+CD7D;HANGUL SYLLABLE CYONI;Lo;0;L;;;;;N;;;;;
+CD7E;HANGUL SYLLABLE CYONH;Lo;0;L;;;;;N;;;;;
+CD7F;HANGUL SYLLABLE CYOD;Lo;0;L;;;;;N;;;;;
+CD80;HANGUL SYLLABLE CYOL;Lo;0;L;;;;;N;;;;;
+CD81;HANGUL SYLLABLE CYOLG;Lo;0;L;;;;;N;;;;;
+CD82;HANGUL SYLLABLE CYOLM;Lo;0;L;;;;;N;;;;;
+CD83;HANGUL SYLLABLE CYOLB;Lo;0;L;;;;;N;;;;;
+CD84;HANGUL SYLLABLE CYOLS;Lo;0;L;;;;;N;;;;;
+CD85;HANGUL SYLLABLE CYOLT;Lo;0;L;;;;;N;;;;;
+CD86;HANGUL SYLLABLE CYOLP;Lo;0;L;;;;;N;;;;;
+CD87;HANGUL SYLLABLE CYOLH;Lo;0;L;;;;;N;;;;;
+CD88;HANGUL SYLLABLE CYOM;Lo;0;L;;;;;N;;;;;
+CD89;HANGUL SYLLABLE CYOB;Lo;0;L;;;;;N;;;;;
+CD8A;HANGUL SYLLABLE CYOBS;Lo;0;L;;;;;N;;;;;
+CD8B;HANGUL SYLLABLE CYOS;Lo;0;L;;;;;N;;;;;
+CD8C;HANGUL SYLLABLE CYOSS;Lo;0;L;;;;;N;;;;;
+CD8D;HANGUL SYLLABLE CYONG;Lo;0;L;;;;;N;;;;;
+CD8E;HANGUL SYLLABLE CYOJ;Lo;0;L;;;;;N;;;;;
+CD8F;HANGUL SYLLABLE CYOC;Lo;0;L;;;;;N;;;;;
+CD90;HANGUL SYLLABLE CYOK;Lo;0;L;;;;;N;;;;;
+CD91;HANGUL SYLLABLE CYOT;Lo;0;L;;;;;N;;;;;
+CD92;HANGUL SYLLABLE CYOP;Lo;0;L;;;;;N;;;;;
+CD93;HANGUL SYLLABLE CYOH;Lo;0;L;;;;;N;;;;;
+CD94;HANGUL SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+CD95;HANGUL SYLLABLE CUG;Lo;0;L;;;;;N;;;;;
+CD96;HANGUL SYLLABLE CUGG;Lo;0;L;;;;;N;;;;;
+CD97;HANGUL SYLLABLE CUGS;Lo;0;L;;;;;N;;;;;
+CD98;HANGUL SYLLABLE CUN;Lo;0;L;;;;;N;;;;;
+CD99;HANGUL SYLLABLE CUNI;Lo;0;L;;;;;N;;;;;
+CD9A;HANGUL SYLLABLE CUNH;Lo;0;L;;;;;N;;;;;
+CD9B;HANGUL SYLLABLE CUD;Lo;0;L;;;;;N;;;;;
+CD9C;HANGUL SYLLABLE CUL;Lo;0;L;;;;;N;;;;;
+CD9D;HANGUL SYLLABLE CULG;Lo;0;L;;;;;N;;;;;
+CD9E;HANGUL SYLLABLE CULM;Lo;0;L;;;;;N;;;;;
+CD9F;HANGUL SYLLABLE CULB;Lo;0;L;;;;;N;;;;;
+CDA0;HANGUL SYLLABLE CULS;Lo;0;L;;;;;N;;;;;
+CDA1;HANGUL SYLLABLE CULT;Lo;0;L;;;;;N;;;;;
+CDA2;HANGUL SYLLABLE CULP;Lo;0;L;;;;;N;;;;;
+CDA3;HANGUL SYLLABLE CULH;Lo;0;L;;;;;N;;;;;
+CDA4;HANGUL SYLLABLE CUM;Lo;0;L;;;;;N;;;;;
+CDA5;HANGUL SYLLABLE CUB;Lo;0;L;;;;;N;;;;;
+CDA6;HANGUL SYLLABLE CUBS;Lo;0;L;;;;;N;;;;;
+CDA7;HANGUL SYLLABLE CUS;Lo;0;L;;;;;N;;;;;
+CDA8;HANGUL SYLLABLE CUSS;Lo;0;L;;;;;N;;;;;
+CDA9;HANGUL SYLLABLE CUNG;Lo;0;L;;;;;N;;;;;
+CDAA;HANGUL SYLLABLE CUJ;Lo;0;L;;;;;N;;;;;
+CDAB;HANGUL SYLLABLE CUC;Lo;0;L;;;;;N;;;;;
+CDAC;HANGUL SYLLABLE CUK;Lo;0;L;;;;;N;;;;;
+CDAD;HANGUL SYLLABLE CUT;Lo;0;L;;;;;N;;;;;
+CDAE;HANGUL SYLLABLE CUP;Lo;0;L;;;;;N;;;;;
+CDAF;HANGUL SYLLABLE CUH;Lo;0;L;;;;;N;;;;;
+CDB0;HANGUL SYLLABLE CWEO;Lo;0;L;;;;;N;;;;;
+CDB1;HANGUL SYLLABLE CWEOG;Lo;0;L;;;;;N;;;;;
+CDB2;HANGUL SYLLABLE CWEOGG;Lo;0;L;;;;;N;;;;;
+CDB3;HANGUL SYLLABLE CWEOGS;Lo;0;L;;;;;N;;;;;
+CDB4;HANGUL SYLLABLE CWEON;Lo;0;L;;;;;N;;;;;
+CDB5;HANGUL SYLLABLE CWEONI;Lo;0;L;;;;;N;;;;;
+CDB6;HANGUL SYLLABLE CWEONH;Lo;0;L;;;;;N;;;;;
+CDB7;HANGUL SYLLABLE CWEOD;Lo;0;L;;;;;N;;;;;
+CDB8;HANGUL SYLLABLE CWEOL;Lo;0;L;;;;;N;;;;;
+CDB9;HANGUL SYLLABLE CWEOLG;Lo;0;L;;;;;N;;;;;
+CDBA;HANGUL SYLLABLE CWEOLM;Lo;0;L;;;;;N;;;;;
+CDBB;HANGUL SYLLABLE CWEOLB;Lo;0;L;;;;;N;;;;;
+CDBC;HANGUL SYLLABLE CWEOLS;Lo;0;L;;;;;N;;;;;
+CDBD;HANGUL SYLLABLE CWEOLT;Lo;0;L;;;;;N;;;;;
+CDBE;HANGUL SYLLABLE CWEOLP;Lo;0;L;;;;;N;;;;;
+CDBF;HANGUL SYLLABLE CWEOLH;Lo;0;L;;;;;N;;;;;
+CDC0;HANGUL SYLLABLE CWEOM;Lo;0;L;;;;;N;;;;;
+CDC1;HANGUL SYLLABLE CWEOB;Lo;0;L;;;;;N;;;;;
+CDC2;HANGUL SYLLABLE CWEOBS;Lo;0;L;;;;;N;;;;;
+CDC3;HANGUL SYLLABLE CWEOS;Lo;0;L;;;;;N;;;;;
+CDC4;HANGUL SYLLABLE CWEOSS;Lo;0;L;;;;;N;;;;;
+CDC5;HANGUL SYLLABLE CWEONG;Lo;0;L;;;;;N;;;;;
+CDC6;HANGUL SYLLABLE CWEOJ;Lo;0;L;;;;;N;;;;;
+CDC7;HANGUL SYLLABLE CWEOC;Lo;0;L;;;;;N;;;;;
+CDC8;HANGUL SYLLABLE CWEOK;Lo;0;L;;;;;N;;;;;
+CDC9;HANGUL SYLLABLE CWEOT;Lo;0;L;;;;;N;;;;;
+CDCA;HANGUL SYLLABLE CWEOP;Lo;0;L;;;;;N;;;;;
+CDCB;HANGUL SYLLABLE CWEOH;Lo;0;L;;;;;N;;;;;
+CDCC;HANGUL SYLLABLE CWE;Lo;0;L;;;;;N;;;;;
+CDCD;HANGUL SYLLABLE CWEG;Lo;0;L;;;;;N;;;;;
+CDCE;HANGUL SYLLABLE CWEGG;Lo;0;L;;;;;N;;;;;
+CDCF;HANGUL SYLLABLE CWEGS;Lo;0;L;;;;;N;;;;;
+CDD0;HANGUL SYLLABLE CWEN;Lo;0;L;;;;;N;;;;;
+CDD1;HANGUL SYLLABLE CWENI;Lo;0;L;;;;;N;;;;;
+CDD2;HANGUL SYLLABLE CWENH;Lo;0;L;;;;;N;;;;;
+CDD3;HANGUL SYLLABLE CWED;Lo;0;L;;;;;N;;;;;
+CDD4;HANGUL SYLLABLE CWEL;Lo;0;L;;;;;N;;;;;
+CDD5;HANGUL SYLLABLE CWELG;Lo;0;L;;;;;N;;;;;
+CDD6;HANGUL SYLLABLE CWELM;Lo;0;L;;;;;N;;;;;
+CDD7;HANGUL SYLLABLE CWELB;Lo;0;L;;;;;N;;;;;
+CDD8;HANGUL SYLLABLE CWELS;Lo;0;L;;;;;N;;;;;
+CDD9;HANGUL SYLLABLE CWELT;Lo;0;L;;;;;N;;;;;
+CDDA;HANGUL SYLLABLE CWELP;Lo;0;L;;;;;N;;;;;
+CDDB;HANGUL SYLLABLE CWELH;Lo;0;L;;;;;N;;;;;
+CDDC;HANGUL SYLLABLE CWEM;Lo;0;L;;;;;N;;;;;
+CDDD;HANGUL SYLLABLE CWEB;Lo;0;L;;;;;N;;;;;
+CDDE;HANGUL SYLLABLE CWEBS;Lo;0;L;;;;;N;;;;;
+CDDF;HANGUL SYLLABLE CWES;Lo;0;L;;;;;N;;;;;
+CDE0;HANGUL SYLLABLE CWESS;Lo;0;L;;;;;N;;;;;
+CDE1;HANGUL SYLLABLE CWENG;Lo;0;L;;;;;N;;;;;
+CDE2;HANGUL SYLLABLE CWEJ;Lo;0;L;;;;;N;;;;;
+CDE3;HANGUL SYLLABLE CWEC;Lo;0;L;;;;;N;;;;;
+CDE4;HANGUL SYLLABLE CWEK;Lo;0;L;;;;;N;;;;;
+CDE5;HANGUL SYLLABLE CWET;Lo;0;L;;;;;N;;;;;
+CDE6;HANGUL SYLLABLE CWEP;Lo;0;L;;;;;N;;;;;
+CDE7;HANGUL SYLLABLE CWEH;Lo;0;L;;;;;N;;;;;
+CDE8;HANGUL SYLLABLE CWI;Lo;0;L;;;;;N;;;;;
+CDE9;HANGUL SYLLABLE CWIG;Lo;0;L;;;;;N;;;;;
+CDEA;HANGUL SYLLABLE CWIGG;Lo;0;L;;;;;N;;;;;
+CDEB;HANGUL SYLLABLE CWIGS;Lo;0;L;;;;;N;;;;;
+CDEC;HANGUL SYLLABLE CWIN;Lo;0;L;;;;;N;;;;;
+CDED;HANGUL SYLLABLE CWINI;Lo;0;L;;;;;N;;;;;
+CDEE;HANGUL SYLLABLE CWINH;Lo;0;L;;;;;N;;;;;
+CDEF;HANGUL SYLLABLE CWID;Lo;0;L;;;;;N;;;;;
+CDF0;HANGUL SYLLABLE CWIL;Lo;0;L;;;;;N;;;;;
+CDF1;HANGUL SYLLABLE CWILG;Lo;0;L;;;;;N;;;;;
+CDF2;HANGUL SYLLABLE CWILM;Lo;0;L;;;;;N;;;;;
+CDF3;HANGUL SYLLABLE CWILB;Lo;0;L;;;;;N;;;;;
+CDF4;HANGUL SYLLABLE CWILS;Lo;0;L;;;;;N;;;;;
+CDF5;HANGUL SYLLABLE CWILT;Lo;0;L;;;;;N;;;;;
+CDF6;HANGUL SYLLABLE CWILP;Lo;0;L;;;;;N;;;;;
+CDF7;HANGUL SYLLABLE CWILH;Lo;0;L;;;;;N;;;;;
+CDF8;HANGUL SYLLABLE CWIM;Lo;0;L;;;;;N;;;;;
+CDF9;HANGUL SYLLABLE CWIB;Lo;0;L;;;;;N;;;;;
+CDFA;HANGUL SYLLABLE CWIBS;Lo;0;L;;;;;N;;;;;
+CDFB;HANGUL SYLLABLE CWIS;Lo;0;L;;;;;N;;;;;
+CDFC;HANGUL SYLLABLE CWISS;Lo;0;L;;;;;N;;;;;
+CDFD;HANGUL SYLLABLE CWING;Lo;0;L;;;;;N;;;;;
+CDFE;HANGUL SYLLABLE CWIJ;Lo;0;L;;;;;N;;;;;
+CDFF;HANGUL SYLLABLE CWIC;Lo;0;L;;;;;N;;;;;
+CE00;HANGUL SYLLABLE CWIK;Lo;0;L;;;;;N;;;;;
+CE01;HANGUL SYLLABLE CWIT;Lo;0;L;;;;;N;;;;;
+CE02;HANGUL SYLLABLE CWIP;Lo;0;L;;;;;N;;;;;
+CE03;HANGUL SYLLABLE CWIH;Lo;0;L;;;;;N;;;;;
+CE04;HANGUL SYLLABLE CYU;Lo;0;L;;;;;N;;;;;
+CE05;HANGUL SYLLABLE CYUG;Lo;0;L;;;;;N;;;;;
+CE06;HANGUL SYLLABLE CYUGG;Lo;0;L;;;;;N;;;;;
+CE07;HANGUL SYLLABLE CYUGS;Lo;0;L;;;;;N;;;;;
+CE08;HANGUL SYLLABLE CYUN;Lo;0;L;;;;;N;;;;;
+CE09;HANGUL SYLLABLE CYUNI;Lo;0;L;;;;;N;;;;;
+CE0A;HANGUL SYLLABLE CYUNH;Lo;0;L;;;;;N;;;;;
+CE0B;HANGUL SYLLABLE CYUD;Lo;0;L;;;;;N;;;;;
+CE0C;HANGUL SYLLABLE CYUL;Lo;0;L;;;;;N;;;;;
+CE0D;HANGUL SYLLABLE CYULG;Lo;0;L;;;;;N;;;;;
+CE0E;HANGUL SYLLABLE CYULM;Lo;0;L;;;;;N;;;;;
+CE0F;HANGUL SYLLABLE CYULB;Lo;0;L;;;;;N;;;;;
+CE10;HANGUL SYLLABLE CYULS;Lo;0;L;;;;;N;;;;;
+CE11;HANGUL SYLLABLE CYULT;Lo;0;L;;;;;N;;;;;
+CE12;HANGUL SYLLABLE CYULP;Lo;0;L;;;;;N;;;;;
+CE13;HANGUL SYLLABLE CYULH;Lo;0;L;;;;;N;;;;;
+CE14;HANGUL SYLLABLE CYUM;Lo;0;L;;;;;N;;;;;
+CE15;HANGUL SYLLABLE CYUB;Lo;0;L;;;;;N;;;;;
+CE16;HANGUL SYLLABLE CYUBS;Lo;0;L;;;;;N;;;;;
+CE17;HANGUL SYLLABLE CYUS;Lo;0;L;;;;;N;;;;;
+CE18;HANGUL SYLLABLE CYUSS;Lo;0;L;;;;;N;;;;;
+CE19;HANGUL SYLLABLE CYUNG;Lo;0;L;;;;;N;;;;;
+CE1A;HANGUL SYLLABLE CYUJ;Lo;0;L;;;;;N;;;;;
+CE1B;HANGUL SYLLABLE CYUC;Lo;0;L;;;;;N;;;;;
+CE1C;HANGUL SYLLABLE CYUK;Lo;0;L;;;;;N;;;;;
+CE1D;HANGUL SYLLABLE CYUT;Lo;0;L;;;;;N;;;;;
+CE1E;HANGUL SYLLABLE CYUP;Lo;0;L;;;;;N;;;;;
+CE1F;HANGUL SYLLABLE CYUH;Lo;0;L;;;;;N;;;;;
+CE20;HANGUL SYLLABLE CEU;Lo;0;L;;;;;N;;;;;
+CE21;HANGUL SYLLABLE CEUG;Lo;0;L;;;;;N;;;;;
+CE22;HANGUL SYLLABLE CEUGG;Lo;0;L;;;;;N;;;;;
+CE23;HANGUL SYLLABLE CEUGS;Lo;0;L;;;;;N;;;;;
+CE24;HANGUL SYLLABLE CEUN;Lo;0;L;;;;;N;;;;;
+CE25;HANGUL SYLLABLE CEUNI;Lo;0;L;;;;;N;;;;;
+CE26;HANGUL SYLLABLE CEUNH;Lo;0;L;;;;;N;;;;;
+CE27;HANGUL SYLLABLE CEUD;Lo;0;L;;;;;N;;;;;
+CE28;HANGUL SYLLABLE CEUL;Lo;0;L;;;;;N;;;;;
+CE29;HANGUL SYLLABLE CEULG;Lo;0;L;;;;;N;;;;;
+CE2A;HANGUL SYLLABLE CEULM;Lo;0;L;;;;;N;;;;;
+CE2B;HANGUL SYLLABLE CEULB;Lo;0;L;;;;;N;;;;;
+CE2C;HANGUL SYLLABLE CEULS;Lo;0;L;;;;;N;;;;;
+CE2D;HANGUL SYLLABLE CEULT;Lo;0;L;;;;;N;;;;;
+CE2E;HANGUL SYLLABLE CEULP;Lo;0;L;;;;;N;;;;;
+CE2F;HANGUL SYLLABLE CEULH;Lo;0;L;;;;;N;;;;;
+CE30;HANGUL SYLLABLE CEUM;Lo;0;L;;;;;N;;;;;
+CE31;HANGUL SYLLABLE CEUB;Lo;0;L;;;;;N;;;;;
+CE32;HANGUL SYLLABLE CEUBS;Lo;0;L;;;;;N;;;;;
+CE33;HANGUL SYLLABLE CEUS;Lo;0;L;;;;;N;;;;;
+CE34;HANGUL SYLLABLE CEUSS;Lo;0;L;;;;;N;;;;;
+CE35;HANGUL SYLLABLE CEUNG;Lo;0;L;;;;;N;;;;;
+CE36;HANGUL SYLLABLE CEUJ;Lo;0;L;;;;;N;;;;;
+CE37;HANGUL SYLLABLE CEUC;Lo;0;L;;;;;N;;;;;
+CE38;HANGUL SYLLABLE CEUK;Lo;0;L;;;;;N;;;;;
+CE39;HANGUL SYLLABLE CEUT;Lo;0;L;;;;;N;;;;;
+CE3A;HANGUL SYLLABLE CEUP;Lo;0;L;;;;;N;;;;;
+CE3B;HANGUL SYLLABLE CEUH;Lo;0;L;;;;;N;;;;;
+CE3C;HANGUL SYLLABLE CYI;Lo;0;L;;;;;N;;;;;
+CE3D;HANGUL SYLLABLE CYIG;Lo;0;L;;;;;N;;;;;
+CE3E;HANGUL SYLLABLE CYIGG;Lo;0;L;;;;;N;;;;;
+CE3F;HANGUL SYLLABLE CYIGS;Lo;0;L;;;;;N;;;;;
+CE40;HANGUL SYLLABLE CYIN;Lo;0;L;;;;;N;;;;;
+CE41;HANGUL SYLLABLE CYINI;Lo;0;L;;;;;N;;;;;
+CE42;HANGUL SYLLABLE CYINH;Lo;0;L;;;;;N;;;;;
+CE43;HANGUL SYLLABLE CYID;Lo;0;L;;;;;N;;;;;
+CE44;HANGUL SYLLABLE CYIL;Lo;0;L;;;;;N;;;;;
+CE45;HANGUL SYLLABLE CYILG;Lo;0;L;;;;;N;;;;;
+CE46;HANGUL SYLLABLE CYILM;Lo;0;L;;;;;N;;;;;
+CE47;HANGUL SYLLABLE CYILB;Lo;0;L;;;;;N;;;;;
+CE48;HANGUL SYLLABLE CYILS;Lo;0;L;;;;;N;;;;;
+CE49;HANGUL SYLLABLE CYILT;Lo;0;L;;;;;N;;;;;
+CE4A;HANGUL SYLLABLE CYILP;Lo;0;L;;;;;N;;;;;
+CE4B;HANGUL SYLLABLE CYILH;Lo;0;L;;;;;N;;;;;
+CE4C;HANGUL SYLLABLE CYIM;Lo;0;L;;;;;N;;;;;
+CE4D;HANGUL SYLLABLE CYIB;Lo;0;L;;;;;N;;;;;
+CE4E;HANGUL SYLLABLE CYIBS;Lo;0;L;;;;;N;;;;;
+CE4F;HANGUL SYLLABLE CYIS;Lo;0;L;;;;;N;;;;;
+CE50;HANGUL SYLLABLE CYISS;Lo;0;L;;;;;N;;;;;
+CE51;HANGUL SYLLABLE CYING;Lo;0;L;;;;;N;;;;;
+CE52;HANGUL SYLLABLE CYIJ;Lo;0;L;;;;;N;;;;;
+CE53;HANGUL SYLLABLE CYIC;Lo;0;L;;;;;N;;;;;
+CE54;HANGUL SYLLABLE CYIK;Lo;0;L;;;;;N;;;;;
+CE55;HANGUL SYLLABLE CYIT;Lo;0;L;;;;;N;;;;;
+CE56;HANGUL SYLLABLE CYIP;Lo;0;L;;;;;N;;;;;
+CE57;HANGUL SYLLABLE CYIH;Lo;0;L;;;;;N;;;;;
+CE58;HANGUL SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+CE59;HANGUL SYLLABLE CIG;Lo;0;L;;;;;N;;;;;
+CE5A;HANGUL SYLLABLE CIGG;Lo;0;L;;;;;N;;;;;
+CE5B;HANGUL SYLLABLE CIGS;Lo;0;L;;;;;N;;;;;
+CE5C;HANGUL SYLLABLE CIN;Lo;0;L;;;;;N;;;;;
+CE5D;HANGUL SYLLABLE CINI;Lo;0;L;;;;;N;;;;;
+CE5E;HANGUL SYLLABLE CINH;Lo;0;L;;;;;N;;;;;
+CE5F;HANGUL SYLLABLE CID;Lo;0;L;;;;;N;;;;;
+CE60;HANGUL SYLLABLE CIL;Lo;0;L;;;;;N;;;;;
+CE61;HANGUL SYLLABLE CILG;Lo;0;L;;;;;N;;;;;
+CE62;HANGUL SYLLABLE CILM;Lo;0;L;;;;;N;;;;;
+CE63;HANGUL SYLLABLE CILB;Lo;0;L;;;;;N;;;;;
+CE64;HANGUL SYLLABLE CILS;Lo;0;L;;;;;N;;;;;
+CE65;HANGUL SYLLABLE CILT;Lo;0;L;;;;;N;;;;;
+CE66;HANGUL SYLLABLE CILP;Lo;0;L;;;;;N;;;;;
+CE67;HANGUL SYLLABLE CILH;Lo;0;L;;;;;N;;;;;
+CE68;HANGUL SYLLABLE CIM;Lo;0;L;;;;;N;;;;;
+CE69;HANGUL SYLLABLE CIB;Lo;0;L;;;;;N;;;;;
+CE6A;HANGUL SYLLABLE CIBS;Lo;0;L;;;;;N;;;;;
+CE6B;HANGUL SYLLABLE CIS;Lo;0;L;;;;;N;;;;;
+CE6C;HANGUL SYLLABLE CISS;Lo;0;L;;;;;N;;;;;
+CE6D;HANGUL SYLLABLE CING;Lo;0;L;;;;;N;;;;;
+CE6E;HANGUL SYLLABLE CIJ;Lo;0;L;;;;;N;;;;;
+CE6F;HANGUL SYLLABLE CIC;Lo;0;L;;;;;N;;;;;
+CE70;HANGUL SYLLABLE CIK;Lo;0;L;;;;;N;;;;;
+CE71;HANGUL SYLLABLE CIT;Lo;0;L;;;;;N;;;;;
+CE72;HANGUL SYLLABLE CIP;Lo;0;L;;;;;N;;;;;
+CE73;HANGUL SYLLABLE CIH;Lo;0;L;;;;;N;;;;;
+CE74;HANGUL SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+CE75;HANGUL SYLLABLE KAG;Lo;0;L;;;;;N;;;;;
+CE76;HANGUL SYLLABLE KAGG;Lo;0;L;;;;;N;;;;;
+CE77;HANGUL SYLLABLE KAGS;Lo;0;L;;;;;N;;;;;
+CE78;HANGUL SYLLABLE KAN;Lo;0;L;;;;;N;;;;;
+CE79;HANGUL SYLLABLE KANI;Lo;0;L;;;;;N;;;;;
+CE7A;HANGUL SYLLABLE KANH;Lo;0;L;;;;;N;;;;;
+CE7B;HANGUL SYLLABLE KAD;Lo;0;L;;;;;N;;;;;
+CE7C;HANGUL SYLLABLE KAL;Lo;0;L;;;;;N;;;;;
+CE7D;HANGUL SYLLABLE KALG;Lo;0;L;;;;;N;;;;;
+CE7E;HANGUL SYLLABLE KALM;Lo;0;L;;;;;N;;;;;
+CE7F;HANGUL SYLLABLE KALB;Lo;0;L;;;;;N;;;;;
+CE80;HANGUL SYLLABLE KALS;Lo;0;L;;;;;N;;;;;
+CE81;HANGUL SYLLABLE KALT;Lo;0;L;;;;;N;;;;;
+CE82;HANGUL SYLLABLE KALP;Lo;0;L;;;;;N;;;;;
+CE83;HANGUL SYLLABLE KALH;Lo;0;L;;;;;N;;;;;
+CE84;HANGUL SYLLABLE KAM;Lo;0;L;;;;;N;;;;;
+CE85;HANGUL SYLLABLE KAB;Lo;0;L;;;;;N;;;;;
+CE86;HANGUL SYLLABLE KABS;Lo;0;L;;;;;N;;;;;
+CE87;HANGUL SYLLABLE KAS;Lo;0;L;;;;;N;;;;;
+CE88;HANGUL SYLLABLE KASS;Lo;0;L;;;;;N;;;;;
+CE89;HANGUL SYLLABLE KANG;Lo;0;L;;;;;N;;;;;
+CE8A;HANGUL SYLLABLE KAJ;Lo;0;L;;;;;N;;;;;
+CE8B;HANGUL SYLLABLE KAC;Lo;0;L;;;;;N;;;;;
+CE8C;HANGUL SYLLABLE KAK;Lo;0;L;;;;;N;;;;;
+CE8D;HANGUL SYLLABLE KAT;Lo;0;L;;;;;N;;;;;
+CE8E;HANGUL SYLLABLE KAP;Lo;0;L;;;;;N;;;;;
+CE8F;HANGUL SYLLABLE KAH;Lo;0;L;;;;;N;;;;;
+CE90;HANGUL SYLLABLE KAE;Lo;0;L;;;;;N;;;;;
+CE91;HANGUL SYLLABLE KAEG;Lo;0;L;;;;;N;;;;;
+CE92;HANGUL SYLLABLE KAEGG;Lo;0;L;;;;;N;;;;;
+CE93;HANGUL SYLLABLE KAEGS;Lo;0;L;;;;;N;;;;;
+CE94;HANGUL SYLLABLE KAEN;Lo;0;L;;;;;N;;;;;
+CE95;HANGUL SYLLABLE KAENI;Lo;0;L;;;;;N;;;;;
+CE96;HANGUL SYLLABLE KAENH;Lo;0;L;;;;;N;;;;;
+CE97;HANGUL SYLLABLE KAED;Lo;0;L;;;;;N;;;;;
+CE98;HANGUL SYLLABLE KAEL;Lo;0;L;;;;;N;;;;;
+CE99;HANGUL SYLLABLE KAELG;Lo;0;L;;;;;N;;;;;
+CE9A;HANGUL SYLLABLE KAELM;Lo;0;L;;;;;N;;;;;
+CE9B;HANGUL SYLLABLE KAELB;Lo;0;L;;;;;N;;;;;
+CE9C;HANGUL SYLLABLE KAELS;Lo;0;L;;;;;N;;;;;
+CE9D;HANGUL SYLLABLE KAELT;Lo;0;L;;;;;N;;;;;
+CE9E;HANGUL SYLLABLE KAELP;Lo;0;L;;;;;N;;;;;
+CE9F;HANGUL SYLLABLE KAELH;Lo;0;L;;;;;N;;;;;
+CEA0;HANGUL SYLLABLE KAEM;Lo;0;L;;;;;N;;;;;
+CEA1;HANGUL SYLLABLE KAEB;Lo;0;L;;;;;N;;;;;
+CEA2;HANGUL SYLLABLE KAEBS;Lo;0;L;;;;;N;;;;;
+CEA3;HANGUL SYLLABLE KAES;Lo;0;L;;;;;N;;;;;
+CEA4;HANGUL SYLLABLE KAESS;Lo;0;L;;;;;N;;;;;
+CEA5;HANGUL SYLLABLE KAENG;Lo;0;L;;;;;N;;;;;
+CEA6;HANGUL SYLLABLE KAEJ;Lo;0;L;;;;;N;;;;;
+CEA7;HANGUL SYLLABLE KAEC;Lo;0;L;;;;;N;;;;;
+CEA8;HANGUL SYLLABLE KAEK;Lo;0;L;;;;;N;;;;;
+CEA9;HANGUL SYLLABLE KAET;Lo;0;L;;;;;N;;;;;
+CEAA;HANGUL SYLLABLE KAEP;Lo;0;L;;;;;N;;;;;
+CEAB;HANGUL SYLLABLE KAEH;Lo;0;L;;;;;N;;;;;
+CEAC;HANGUL SYLLABLE KYA;Lo;0;L;;;;;N;;;;;
+CEAD;HANGUL SYLLABLE KYAG;Lo;0;L;;;;;N;;;;;
+CEAE;HANGUL SYLLABLE KYAGG;Lo;0;L;;;;;N;;;;;
+CEAF;HANGUL SYLLABLE KYAGS;Lo;0;L;;;;;N;;;;;
+CEB0;HANGUL SYLLABLE KYAN;Lo;0;L;;;;;N;;;;;
+CEB1;HANGUL SYLLABLE KYANI;Lo;0;L;;;;;N;;;;;
+CEB2;HANGUL SYLLABLE KYANH;Lo;0;L;;;;;N;;;;;
+CEB3;HANGUL SYLLABLE KYAD;Lo;0;L;;;;;N;;;;;
+CEB4;HANGUL SYLLABLE KYAL;Lo;0;L;;;;;N;;;;;
+CEB5;HANGUL SYLLABLE KYALG;Lo;0;L;;;;;N;;;;;
+CEB6;HANGUL SYLLABLE KYALM;Lo;0;L;;;;;N;;;;;
+CEB7;HANGUL SYLLABLE KYALB;Lo;0;L;;;;;N;;;;;
+CEB8;HANGUL SYLLABLE KYALS;Lo;0;L;;;;;N;;;;;
+CEB9;HANGUL SYLLABLE KYALT;Lo;0;L;;;;;N;;;;;
+CEBA;HANGUL SYLLABLE KYALP;Lo;0;L;;;;;N;;;;;
+CEBB;HANGUL SYLLABLE KYALH;Lo;0;L;;;;;N;;;;;
+CEBC;HANGUL SYLLABLE KYAM;Lo;0;L;;;;;N;;;;;
+CEBD;HANGUL SYLLABLE KYAB;Lo;0;L;;;;;N;;;;;
+CEBE;HANGUL SYLLABLE KYABS;Lo;0;L;;;;;N;;;;;
+CEBF;HANGUL SYLLABLE KYAS;Lo;0;L;;;;;N;;;;;
+CEC0;HANGUL SYLLABLE KYASS;Lo;0;L;;;;;N;;;;;
+CEC1;HANGUL SYLLABLE KYANG;Lo;0;L;;;;;N;;;;;
+CEC2;HANGUL SYLLABLE KYAJ;Lo;0;L;;;;;N;;;;;
+CEC3;HANGUL SYLLABLE KYAC;Lo;0;L;;;;;N;;;;;
+CEC4;HANGUL SYLLABLE KYAK;Lo;0;L;;;;;N;;;;;
+CEC5;HANGUL SYLLABLE KYAT;Lo;0;L;;;;;N;;;;;
+CEC6;HANGUL SYLLABLE KYAP;Lo;0;L;;;;;N;;;;;
+CEC7;HANGUL SYLLABLE KYAH;Lo;0;L;;;;;N;;;;;
+CEC8;HANGUL SYLLABLE KYAE;Lo;0;L;;;;;N;;;;;
+CEC9;HANGUL SYLLABLE KYAEG;Lo;0;L;;;;;N;;;;;
+CECA;HANGUL SYLLABLE KYAEGG;Lo;0;L;;;;;N;;;;;
+CECB;HANGUL SYLLABLE KYAEGS;Lo;0;L;;;;;N;;;;;
+CECC;HANGUL SYLLABLE KYAEN;Lo;0;L;;;;;N;;;;;
+CECD;HANGUL SYLLABLE KYAENI;Lo;0;L;;;;;N;;;;;
+CECE;HANGUL SYLLABLE KYAENH;Lo;0;L;;;;;N;;;;;
+CECF;HANGUL SYLLABLE KYAED;Lo;0;L;;;;;N;;;;;
+CED0;HANGUL SYLLABLE KYAEL;Lo;0;L;;;;;N;;;;;
+CED1;HANGUL SYLLABLE KYAELG;Lo;0;L;;;;;N;;;;;
+CED2;HANGUL SYLLABLE KYAELM;Lo;0;L;;;;;N;;;;;
+CED3;HANGUL SYLLABLE KYAELB;Lo;0;L;;;;;N;;;;;
+CED4;HANGUL SYLLABLE KYAELS;Lo;0;L;;;;;N;;;;;
+CED5;HANGUL SYLLABLE KYAELT;Lo;0;L;;;;;N;;;;;
+CED6;HANGUL SYLLABLE KYAELP;Lo;0;L;;;;;N;;;;;
+CED7;HANGUL SYLLABLE KYAELH;Lo;0;L;;;;;N;;;;;
+CED8;HANGUL SYLLABLE KYAEM;Lo;0;L;;;;;N;;;;;
+CED9;HANGUL SYLLABLE KYAEB;Lo;0;L;;;;;N;;;;;
+CEDA;HANGUL SYLLABLE KYAEBS;Lo;0;L;;;;;N;;;;;
+CEDB;HANGUL SYLLABLE KYAES;Lo;0;L;;;;;N;;;;;
+CEDC;HANGUL SYLLABLE KYAESS;Lo;0;L;;;;;N;;;;;
+CEDD;HANGUL SYLLABLE KYAENG;Lo;0;L;;;;;N;;;;;
+CEDE;HANGUL SYLLABLE KYAEJ;Lo;0;L;;;;;N;;;;;
+CEDF;HANGUL SYLLABLE KYAEC;Lo;0;L;;;;;N;;;;;
+CEE0;HANGUL SYLLABLE KYAEK;Lo;0;L;;;;;N;;;;;
+CEE1;HANGUL SYLLABLE KYAET;Lo;0;L;;;;;N;;;;;
+CEE2;HANGUL SYLLABLE KYAEP;Lo;0;L;;;;;N;;;;;
+CEE3;HANGUL SYLLABLE KYAEH;Lo;0;L;;;;;N;;;;;
+CEE4;HANGUL SYLLABLE KEO;Lo;0;L;;;;;N;;;;;
+CEE5;HANGUL SYLLABLE KEOG;Lo;0;L;;;;;N;;;;;
+CEE6;HANGUL SYLLABLE KEOGG;Lo;0;L;;;;;N;;;;;
+CEE7;HANGUL SYLLABLE KEOGS;Lo;0;L;;;;;N;;;;;
+CEE8;HANGUL SYLLABLE KEON;Lo;0;L;;;;;N;;;;;
+CEE9;HANGUL SYLLABLE KEONI;Lo;0;L;;;;;N;;;;;
+CEEA;HANGUL SYLLABLE KEONH;Lo;0;L;;;;;N;;;;;
+CEEB;HANGUL SYLLABLE KEOD;Lo;0;L;;;;;N;;;;;
+CEEC;HANGUL SYLLABLE KEOL;Lo;0;L;;;;;N;;;;;
+CEED;HANGUL SYLLABLE KEOLG;Lo;0;L;;;;;N;;;;;
+CEEE;HANGUL SYLLABLE KEOLM;Lo;0;L;;;;;N;;;;;
+CEEF;HANGUL SYLLABLE KEOLB;Lo;0;L;;;;;N;;;;;
+CEF0;HANGUL SYLLABLE KEOLS;Lo;0;L;;;;;N;;;;;
+CEF1;HANGUL SYLLABLE KEOLT;Lo;0;L;;;;;N;;;;;
+CEF2;HANGUL SYLLABLE KEOLP;Lo;0;L;;;;;N;;;;;
+CEF3;HANGUL SYLLABLE KEOLH;Lo;0;L;;;;;N;;;;;
+CEF4;HANGUL SYLLABLE KEOM;Lo;0;L;;;;;N;;;;;
+CEF5;HANGUL SYLLABLE KEOB;Lo;0;L;;;;;N;;;;;
+CEF6;HANGUL SYLLABLE KEOBS;Lo;0;L;;;;;N;;;;;
+CEF7;HANGUL SYLLABLE KEOS;Lo;0;L;;;;;N;;;;;
+CEF8;HANGUL SYLLABLE KEOSS;Lo;0;L;;;;;N;;;;;
+CEF9;HANGUL SYLLABLE KEONG;Lo;0;L;;;;;N;;;;;
+CEFA;HANGUL SYLLABLE KEOJ;Lo;0;L;;;;;N;;;;;
+CEFB;HANGUL SYLLABLE KEOC;Lo;0;L;;;;;N;;;;;
+CEFC;HANGUL SYLLABLE KEOK;Lo;0;L;;;;;N;;;;;
+CEFD;HANGUL SYLLABLE KEOT;Lo;0;L;;;;;N;;;;;
+CEFE;HANGUL SYLLABLE KEOP;Lo;0;L;;;;;N;;;;;
+CEFF;HANGUL SYLLABLE KEOH;Lo;0;L;;;;;N;;;;;
+CF00;HANGUL SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+CF01;HANGUL SYLLABLE KEG;Lo;0;L;;;;;N;;;;;
+CF02;HANGUL SYLLABLE KEGG;Lo;0;L;;;;;N;;;;;
+CF03;HANGUL SYLLABLE KEGS;Lo;0;L;;;;;N;;;;;
+CF04;HANGUL SYLLABLE KEN;Lo;0;L;;;;;N;;;;;
+CF05;HANGUL SYLLABLE KENI;Lo;0;L;;;;;N;;;;;
+CF06;HANGUL SYLLABLE KENH;Lo;0;L;;;;;N;;;;;
+CF07;HANGUL SYLLABLE KED;Lo;0;L;;;;;N;;;;;
+CF08;HANGUL SYLLABLE KEL;Lo;0;L;;;;;N;;;;;
+CF09;HANGUL SYLLABLE KELG;Lo;0;L;;;;;N;;;;;
+CF0A;HANGUL SYLLABLE KELM;Lo;0;L;;;;;N;;;;;
+CF0B;HANGUL SYLLABLE KELB;Lo;0;L;;;;;N;;;;;
+CF0C;HANGUL SYLLABLE KELS;Lo;0;L;;;;;N;;;;;
+CF0D;HANGUL SYLLABLE KELT;Lo;0;L;;;;;N;;;;;
+CF0E;HANGUL SYLLABLE KELP;Lo;0;L;;;;;N;;;;;
+CF0F;HANGUL SYLLABLE KELH;Lo;0;L;;;;;N;;;;;
+CF10;HANGUL SYLLABLE KEM;Lo;0;L;;;;;N;;;;;
+CF11;HANGUL SYLLABLE KEB;Lo;0;L;;;;;N;;;;;
+CF12;HANGUL SYLLABLE KEBS;Lo;0;L;;;;;N;;;;;
+CF13;HANGUL SYLLABLE KES;Lo;0;L;;;;;N;;;;;
+CF14;HANGUL SYLLABLE KESS;Lo;0;L;;;;;N;;;;;
+CF15;HANGUL SYLLABLE KENG;Lo;0;L;;;;;N;;;;;
+CF16;HANGUL SYLLABLE KEJ;Lo;0;L;;;;;N;;;;;
+CF17;HANGUL SYLLABLE KEC;Lo;0;L;;;;;N;;;;;
+CF18;HANGUL SYLLABLE KEK;Lo;0;L;;;;;N;;;;;
+CF19;HANGUL SYLLABLE KET;Lo;0;L;;;;;N;;;;;
+CF1A;HANGUL SYLLABLE KEP;Lo;0;L;;;;;N;;;;;
+CF1B;HANGUL SYLLABLE KEH;Lo;0;L;;;;;N;;;;;
+CF1C;HANGUL SYLLABLE KYEO;Lo;0;L;;;;;N;;;;;
+CF1D;HANGUL SYLLABLE KYEOG;Lo;0;L;;;;;N;;;;;
+CF1E;HANGUL SYLLABLE KYEOGG;Lo;0;L;;;;;N;;;;;
+CF1F;HANGUL SYLLABLE KYEOGS;Lo;0;L;;;;;N;;;;;
+CF20;HANGUL SYLLABLE KYEON;Lo;0;L;;;;;N;;;;;
+CF21;HANGUL SYLLABLE KYEONI;Lo;0;L;;;;;N;;;;;
+CF22;HANGUL SYLLABLE KYEONH;Lo;0;L;;;;;N;;;;;
+CF23;HANGUL SYLLABLE KYEOD;Lo;0;L;;;;;N;;;;;
+CF24;HANGUL SYLLABLE KYEOL;Lo;0;L;;;;;N;;;;;
+CF25;HANGUL SYLLABLE KYEOLG;Lo;0;L;;;;;N;;;;;
+CF26;HANGUL SYLLABLE KYEOLM;Lo;0;L;;;;;N;;;;;
+CF27;HANGUL SYLLABLE KYEOLB;Lo;0;L;;;;;N;;;;;
+CF28;HANGUL SYLLABLE KYEOLS;Lo;0;L;;;;;N;;;;;
+CF29;HANGUL SYLLABLE KYEOLT;Lo;0;L;;;;;N;;;;;
+CF2A;HANGUL SYLLABLE KYEOLP;Lo;0;L;;;;;N;;;;;
+CF2B;HANGUL SYLLABLE KYEOLH;Lo;0;L;;;;;N;;;;;
+CF2C;HANGUL SYLLABLE KYEOM;Lo;0;L;;;;;N;;;;;
+CF2D;HANGUL SYLLABLE KYEOB;Lo;0;L;;;;;N;;;;;
+CF2E;HANGUL SYLLABLE KYEOBS;Lo;0;L;;;;;N;;;;;
+CF2F;HANGUL SYLLABLE KYEOS;Lo;0;L;;;;;N;;;;;
+CF30;HANGUL SYLLABLE KYEOSS;Lo;0;L;;;;;N;;;;;
+CF31;HANGUL SYLLABLE KYEONG;Lo;0;L;;;;;N;;;;;
+CF32;HANGUL SYLLABLE KYEOJ;Lo;0;L;;;;;N;;;;;
+CF33;HANGUL SYLLABLE KYEOC;Lo;0;L;;;;;N;;;;;
+CF34;HANGUL SYLLABLE KYEOK;Lo;0;L;;;;;N;;;;;
+CF35;HANGUL SYLLABLE KYEOT;Lo;0;L;;;;;N;;;;;
+CF36;HANGUL SYLLABLE KYEOP;Lo;0;L;;;;;N;;;;;
+CF37;HANGUL SYLLABLE KYEOH;Lo;0;L;;;;;N;;;;;
+CF38;HANGUL SYLLABLE KYE;Lo;0;L;;;;;N;;;;;
+CF39;HANGUL SYLLABLE KYEG;Lo;0;L;;;;;N;;;;;
+CF3A;HANGUL SYLLABLE KYEGG;Lo;0;L;;;;;N;;;;;
+CF3B;HANGUL SYLLABLE KYEGS;Lo;0;L;;;;;N;;;;;
+CF3C;HANGUL SYLLABLE KYEN;Lo;0;L;;;;;N;;;;;
+CF3D;HANGUL SYLLABLE KYENI;Lo;0;L;;;;;N;;;;;
+CF3E;HANGUL SYLLABLE KYENH;Lo;0;L;;;;;N;;;;;
+CF3F;HANGUL SYLLABLE KYED;Lo;0;L;;;;;N;;;;;
+CF40;HANGUL SYLLABLE KYEL;Lo;0;L;;;;;N;;;;;
+CF41;HANGUL SYLLABLE KYELG;Lo;0;L;;;;;N;;;;;
+CF42;HANGUL SYLLABLE KYELM;Lo;0;L;;;;;N;;;;;
+CF43;HANGUL SYLLABLE KYELB;Lo;0;L;;;;;N;;;;;
+CF44;HANGUL SYLLABLE KYELS;Lo;0;L;;;;;N;;;;;
+CF45;HANGUL SYLLABLE KYELT;Lo;0;L;;;;;N;;;;;
+CF46;HANGUL SYLLABLE KYELP;Lo;0;L;;;;;N;;;;;
+CF47;HANGUL SYLLABLE KYELH;Lo;0;L;;;;;N;;;;;
+CF48;HANGUL SYLLABLE KYEM;Lo;0;L;;;;;N;;;;;
+CF49;HANGUL SYLLABLE KYEB;Lo;0;L;;;;;N;;;;;
+CF4A;HANGUL SYLLABLE KYEBS;Lo;0;L;;;;;N;;;;;
+CF4B;HANGUL SYLLABLE KYES;Lo;0;L;;;;;N;;;;;
+CF4C;HANGUL SYLLABLE KYESS;Lo;0;L;;;;;N;;;;;
+CF4D;HANGUL SYLLABLE KYENG;Lo;0;L;;;;;N;;;;;
+CF4E;HANGUL SYLLABLE KYEJ;Lo;0;L;;;;;N;;;;;
+CF4F;HANGUL SYLLABLE KYEC;Lo;0;L;;;;;N;;;;;
+CF50;HANGUL SYLLABLE KYEK;Lo;0;L;;;;;N;;;;;
+CF51;HANGUL SYLLABLE KYET;Lo;0;L;;;;;N;;;;;
+CF52;HANGUL SYLLABLE KYEP;Lo;0;L;;;;;N;;;;;
+CF53;HANGUL SYLLABLE KYEH;Lo;0;L;;;;;N;;;;;
+CF54;HANGUL SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+CF55;HANGUL SYLLABLE KOG;Lo;0;L;;;;;N;;;;;
+CF56;HANGUL SYLLABLE KOGG;Lo;0;L;;;;;N;;;;;
+CF57;HANGUL SYLLABLE KOGS;Lo;0;L;;;;;N;;;;;
+CF58;HANGUL SYLLABLE KON;Lo;0;L;;;;;N;;;;;
+CF59;HANGUL SYLLABLE KONI;Lo;0;L;;;;;N;;;;;
+CF5A;HANGUL SYLLABLE KONH;Lo;0;L;;;;;N;;;;;
+CF5B;HANGUL SYLLABLE KOD;Lo;0;L;;;;;N;;;;;
+CF5C;HANGUL SYLLABLE KOL;Lo;0;L;;;;;N;;;;;
+CF5D;HANGUL SYLLABLE KOLG;Lo;0;L;;;;;N;;;;;
+CF5E;HANGUL SYLLABLE KOLM;Lo;0;L;;;;;N;;;;;
+CF5F;HANGUL SYLLABLE KOLB;Lo;0;L;;;;;N;;;;;
+CF60;HANGUL SYLLABLE KOLS;Lo;0;L;;;;;N;;;;;
+CF61;HANGUL SYLLABLE KOLT;Lo;0;L;;;;;N;;;;;
+CF62;HANGUL SYLLABLE KOLP;Lo;0;L;;;;;N;;;;;
+CF63;HANGUL SYLLABLE KOLH;Lo;0;L;;;;;N;;;;;
+CF64;HANGUL SYLLABLE KOM;Lo;0;L;;;;;N;;;;;
+CF65;HANGUL SYLLABLE KOB;Lo;0;L;;;;;N;;;;;
+CF66;HANGUL SYLLABLE KOBS;Lo;0;L;;;;;N;;;;;
+CF67;HANGUL SYLLABLE KOS;Lo;0;L;;;;;N;;;;;
+CF68;HANGUL SYLLABLE KOSS;Lo;0;L;;;;;N;;;;;
+CF69;HANGUL SYLLABLE KONG;Lo;0;L;;;;;N;;;;;
+CF6A;HANGUL SYLLABLE KOJ;Lo;0;L;;;;;N;;;;;
+CF6B;HANGUL SYLLABLE KOC;Lo;0;L;;;;;N;;;;;
+CF6C;HANGUL SYLLABLE KOK;Lo;0;L;;;;;N;;;;;
+CF6D;HANGUL SYLLABLE KOT;Lo;0;L;;;;;N;;;;;
+CF6E;HANGUL SYLLABLE KOP;Lo;0;L;;;;;N;;;;;
+CF6F;HANGUL SYLLABLE KOH;Lo;0;L;;;;;N;;;;;
+CF70;HANGUL SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
+CF71;HANGUL SYLLABLE KWAG;Lo;0;L;;;;;N;;;;;
+CF72;HANGUL SYLLABLE KWAGG;Lo;0;L;;;;;N;;;;;
+CF73;HANGUL SYLLABLE KWAGS;Lo;0;L;;;;;N;;;;;
+CF74;HANGUL SYLLABLE KWAN;Lo;0;L;;;;;N;;;;;
+CF75;HANGUL SYLLABLE KWANI;Lo;0;L;;;;;N;;;;;
+CF76;HANGUL SYLLABLE KWANH;Lo;0;L;;;;;N;;;;;
+CF77;HANGUL SYLLABLE KWAD;Lo;0;L;;;;;N;;;;;
+CF78;HANGUL SYLLABLE KWAL;Lo;0;L;;;;;N;;;;;
+CF79;HANGUL SYLLABLE KWALG;Lo;0;L;;;;;N;;;;;
+CF7A;HANGUL SYLLABLE KWALM;Lo;0;L;;;;;N;;;;;
+CF7B;HANGUL SYLLABLE KWALB;Lo;0;L;;;;;N;;;;;
+CF7C;HANGUL SYLLABLE KWALS;Lo;0;L;;;;;N;;;;;
+CF7D;HANGUL SYLLABLE KWALT;Lo;0;L;;;;;N;;;;;
+CF7E;HANGUL SYLLABLE KWALP;Lo;0;L;;;;;N;;;;;
+CF7F;HANGUL SYLLABLE KWALH;Lo;0;L;;;;;N;;;;;
+CF80;HANGUL SYLLABLE KWAM;Lo;0;L;;;;;N;;;;;
+CF81;HANGUL SYLLABLE KWAB;Lo;0;L;;;;;N;;;;;
+CF82;HANGUL SYLLABLE KWABS;Lo;0;L;;;;;N;;;;;
+CF83;HANGUL SYLLABLE KWAS;Lo;0;L;;;;;N;;;;;
+CF84;HANGUL SYLLABLE KWASS;Lo;0;L;;;;;N;;;;;
+CF85;HANGUL SYLLABLE KWANG;Lo;0;L;;;;;N;;;;;
+CF86;HANGUL SYLLABLE KWAJ;Lo;0;L;;;;;N;;;;;
+CF87;HANGUL SYLLABLE KWAC;Lo;0;L;;;;;N;;;;;
+CF88;HANGUL SYLLABLE KWAK;Lo;0;L;;;;;N;;;;;
+CF89;HANGUL SYLLABLE KWAT;Lo;0;L;;;;;N;;;;;
+CF8A;HANGUL SYLLABLE KWAP;Lo;0;L;;;;;N;;;;;
+CF8B;HANGUL SYLLABLE KWAH;Lo;0;L;;;;;N;;;;;
+CF8C;HANGUL SYLLABLE KWAE;Lo;0;L;;;;;N;;;;;
+CF8D;HANGUL SYLLABLE KWAEG;Lo;0;L;;;;;N;;;;;
+CF8E;HANGUL SYLLABLE KWAEGG;Lo;0;L;;;;;N;;;;;
+CF8F;HANGUL SYLLABLE KWAEGS;Lo;0;L;;;;;N;;;;;
+CF90;HANGUL SYLLABLE KWAEN;Lo;0;L;;;;;N;;;;;
+CF91;HANGUL SYLLABLE KWAENI;Lo;0;L;;;;;N;;;;;
+CF92;HANGUL SYLLABLE KWAENH;Lo;0;L;;;;;N;;;;;
+CF93;HANGUL SYLLABLE KWAED;Lo;0;L;;;;;N;;;;;
+CF94;HANGUL SYLLABLE KWAEL;Lo;0;L;;;;;N;;;;;
+CF95;HANGUL SYLLABLE KWAELG;Lo;0;L;;;;;N;;;;;
+CF96;HANGUL SYLLABLE KWAELM;Lo;0;L;;;;;N;;;;;
+CF97;HANGUL SYLLABLE KWAELB;Lo;0;L;;;;;N;;;;;
+CF98;HANGUL SYLLABLE KWAELS;Lo;0;L;;;;;N;;;;;
+CF99;HANGUL SYLLABLE KWAELT;Lo;0;L;;;;;N;;;;;
+CF9A;HANGUL SYLLABLE KWAELP;Lo;0;L;;;;;N;;;;;
+CF9B;HANGUL SYLLABLE KWAELH;Lo;0;L;;;;;N;;;;;
+CF9C;HANGUL SYLLABLE KWAEM;Lo;0;L;;;;;N;;;;;
+CF9D;HANGUL SYLLABLE KWAEB;Lo;0;L;;;;;N;;;;;
+CF9E;HANGUL SYLLABLE KWAEBS;Lo;0;L;;;;;N;;;;;
+CF9F;HANGUL SYLLABLE KWAES;Lo;0;L;;;;;N;;;;;
+CFA0;HANGUL SYLLABLE KWAESS;Lo;0;L;;;;;N;;;;;
+CFA1;HANGUL SYLLABLE KWAENG;Lo;0;L;;;;;N;;;;;
+CFA2;HANGUL SYLLABLE KWAEJ;Lo;0;L;;;;;N;;;;;
+CFA3;HANGUL SYLLABLE KWAEC;Lo;0;L;;;;;N;;;;;
+CFA4;HANGUL SYLLABLE KWAEK;Lo;0;L;;;;;N;;;;;
+CFA5;HANGUL SYLLABLE KWAET;Lo;0;L;;;;;N;;;;;
+CFA6;HANGUL SYLLABLE KWAEP;Lo;0;L;;;;;N;;;;;
+CFA7;HANGUL SYLLABLE KWAEH;Lo;0;L;;;;;N;;;;;
+CFA8;HANGUL SYLLABLE KOE;Lo;0;L;;;;;N;;;;;
+CFA9;HANGUL SYLLABLE KOEG;Lo;0;L;;;;;N;;;;;
+CFAA;HANGUL SYLLABLE KOEGG;Lo;0;L;;;;;N;;;;;
+CFAB;HANGUL SYLLABLE KOEGS;Lo;0;L;;;;;N;;;;;
+CFAC;HANGUL SYLLABLE KOEN;Lo;0;L;;;;;N;;;;;
+CFAD;HANGUL SYLLABLE KOENI;Lo;0;L;;;;;N;;;;;
+CFAE;HANGUL SYLLABLE KOENH;Lo;0;L;;;;;N;;;;;
+CFAF;HANGUL SYLLABLE KOED;Lo;0;L;;;;;N;;;;;
+CFB0;HANGUL SYLLABLE KOEL;Lo;0;L;;;;;N;;;;;
+CFB1;HANGUL SYLLABLE KOELG;Lo;0;L;;;;;N;;;;;
+CFB2;HANGUL SYLLABLE KOELM;Lo;0;L;;;;;N;;;;;
+CFB3;HANGUL SYLLABLE KOELB;Lo;0;L;;;;;N;;;;;
+CFB4;HANGUL SYLLABLE KOELS;Lo;0;L;;;;;N;;;;;
+CFB5;HANGUL SYLLABLE KOELT;Lo;0;L;;;;;N;;;;;
+CFB6;HANGUL SYLLABLE KOELP;Lo;0;L;;;;;N;;;;;
+CFB7;HANGUL SYLLABLE KOELH;Lo;0;L;;;;;N;;;;;
+CFB8;HANGUL SYLLABLE KOEM;Lo;0;L;;;;;N;;;;;
+CFB9;HANGUL SYLLABLE KOEB;Lo;0;L;;;;;N;;;;;
+CFBA;HANGUL SYLLABLE KOEBS;Lo;0;L;;;;;N;;;;;
+CFBB;HANGUL SYLLABLE KOES;Lo;0;L;;;;;N;;;;;
+CFBC;HANGUL SYLLABLE KOESS;Lo;0;L;;;;;N;;;;;
+CFBD;HANGUL SYLLABLE KOENG;Lo;0;L;;;;;N;;;;;
+CFBE;HANGUL SYLLABLE KOEJ;Lo;0;L;;;;;N;;;;;
+CFBF;HANGUL SYLLABLE KOEC;Lo;0;L;;;;;N;;;;;
+CFC0;HANGUL SYLLABLE KOEK;Lo;0;L;;;;;N;;;;;
+CFC1;HANGUL SYLLABLE KOET;Lo;0;L;;;;;N;;;;;
+CFC2;HANGUL SYLLABLE KOEP;Lo;0;L;;;;;N;;;;;
+CFC3;HANGUL SYLLABLE KOEH;Lo;0;L;;;;;N;;;;;
+CFC4;HANGUL SYLLABLE KYO;Lo;0;L;;;;;N;;;;;
+CFC5;HANGUL SYLLABLE KYOG;Lo;0;L;;;;;N;;;;;
+CFC6;HANGUL SYLLABLE KYOGG;Lo;0;L;;;;;N;;;;;
+CFC7;HANGUL SYLLABLE KYOGS;Lo;0;L;;;;;N;;;;;
+CFC8;HANGUL SYLLABLE KYON;Lo;0;L;;;;;N;;;;;
+CFC9;HANGUL SYLLABLE KYONI;Lo;0;L;;;;;N;;;;;
+CFCA;HANGUL SYLLABLE KYONH;Lo;0;L;;;;;N;;;;;
+CFCB;HANGUL SYLLABLE KYOD;Lo;0;L;;;;;N;;;;;
+CFCC;HANGUL SYLLABLE KYOL;Lo;0;L;;;;;N;;;;;
+CFCD;HANGUL SYLLABLE KYOLG;Lo;0;L;;;;;N;;;;;
+CFCE;HANGUL SYLLABLE KYOLM;Lo;0;L;;;;;N;;;;;
+CFCF;HANGUL SYLLABLE KYOLB;Lo;0;L;;;;;N;;;;;
+CFD0;HANGUL SYLLABLE KYOLS;Lo;0;L;;;;;N;;;;;
+CFD1;HANGUL SYLLABLE KYOLT;Lo;0;L;;;;;N;;;;;
+CFD2;HANGUL SYLLABLE KYOLP;Lo;0;L;;;;;N;;;;;
+CFD3;HANGUL SYLLABLE KYOLH;Lo;0;L;;;;;N;;;;;
+CFD4;HANGUL SYLLABLE KYOM;Lo;0;L;;;;;N;;;;;
+CFD5;HANGUL SYLLABLE KYOB;Lo;0;L;;;;;N;;;;;
+CFD6;HANGUL SYLLABLE KYOBS;Lo;0;L;;;;;N;;;;;
+CFD7;HANGUL SYLLABLE KYOS;Lo;0;L;;;;;N;;;;;
+CFD8;HANGUL SYLLABLE KYOSS;Lo;0;L;;;;;N;;;;;
+CFD9;HANGUL SYLLABLE KYONG;Lo;0;L;;;;;N;;;;;
+CFDA;HANGUL SYLLABLE KYOJ;Lo;0;L;;;;;N;;;;;
+CFDB;HANGUL SYLLABLE KYOC;Lo;0;L;;;;;N;;;;;
+CFDC;HANGUL SYLLABLE KYOK;Lo;0;L;;;;;N;;;;;
+CFDD;HANGUL SYLLABLE KYOT;Lo;0;L;;;;;N;;;;;
+CFDE;HANGUL SYLLABLE KYOP;Lo;0;L;;;;;N;;;;;
+CFDF;HANGUL SYLLABLE KYOH;Lo;0;L;;;;;N;;;;;
+CFE0;HANGUL SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+CFE1;HANGUL SYLLABLE KUG;Lo;0;L;;;;;N;;;;;
+CFE2;HANGUL SYLLABLE KUGG;Lo;0;L;;;;;N;;;;;
+CFE3;HANGUL SYLLABLE KUGS;Lo;0;L;;;;;N;;;;;
+CFE4;HANGUL SYLLABLE KUN;Lo;0;L;;;;;N;;;;;
+CFE5;HANGUL SYLLABLE KUNI;Lo;0;L;;;;;N;;;;;
+CFE6;HANGUL SYLLABLE KUNH;Lo;0;L;;;;;N;;;;;
+CFE7;HANGUL SYLLABLE KUD;Lo;0;L;;;;;N;;;;;
+CFE8;HANGUL SYLLABLE KUL;Lo;0;L;;;;;N;;;;;
+CFE9;HANGUL SYLLABLE KULG;Lo;0;L;;;;;N;;;;;
+CFEA;HANGUL SYLLABLE KULM;Lo;0;L;;;;;N;;;;;
+CFEB;HANGUL SYLLABLE KULB;Lo;0;L;;;;;N;;;;;
+CFEC;HANGUL SYLLABLE KULS;Lo;0;L;;;;;N;;;;;
+CFED;HANGUL SYLLABLE KULT;Lo;0;L;;;;;N;;;;;
+CFEE;HANGUL SYLLABLE KULP;Lo;0;L;;;;;N;;;;;
+CFEF;HANGUL SYLLABLE KULH;Lo;0;L;;;;;N;;;;;
+CFF0;HANGUL SYLLABLE KUM;Lo;0;L;;;;;N;;;;;
+CFF1;HANGUL SYLLABLE KUB;Lo;0;L;;;;;N;;;;;
+CFF2;HANGUL SYLLABLE KUBS;Lo;0;L;;;;;N;;;;;
+CFF3;HANGUL SYLLABLE KUS;Lo;0;L;;;;;N;;;;;
+CFF4;HANGUL SYLLABLE KUSS;Lo;0;L;;;;;N;;;;;
+CFF5;HANGUL SYLLABLE KUNG;Lo;0;L;;;;;N;;;;;
+CFF6;HANGUL SYLLABLE KUJ;Lo;0;L;;;;;N;;;;;
+CFF7;HANGUL SYLLABLE KUC;Lo;0;L;;;;;N;;;;;
+CFF8;HANGUL SYLLABLE KUK;Lo;0;L;;;;;N;;;;;
+CFF9;HANGUL SYLLABLE KUT;Lo;0;L;;;;;N;;;;;
+CFFA;HANGUL SYLLABLE KUP;Lo;0;L;;;;;N;;;;;
+CFFB;HANGUL SYLLABLE KUH;Lo;0;L;;;;;N;;;;;
+CFFC;HANGUL SYLLABLE KWEO;Lo;0;L;;;;;N;;;;;
+CFFD;HANGUL SYLLABLE KWEOG;Lo;0;L;;;;;N;;;;;
+CFFE;HANGUL SYLLABLE KWEOGG;Lo;0;L;;;;;N;;;;;
+CFFF;HANGUL SYLLABLE KWEOGS;Lo;0;L;;;;;N;;;;;
+D000;HANGUL SYLLABLE KWEON;Lo;0;L;;;;;N;;;;;
+D001;HANGUL SYLLABLE KWEONI;Lo;0;L;;;;;N;;;;;
+D002;HANGUL SYLLABLE KWEONH;Lo;0;L;;;;;N;;;;;
+D003;HANGUL SYLLABLE KWEOD;Lo;0;L;;;;;N;;;;;
+D004;HANGUL SYLLABLE KWEOL;Lo;0;L;;;;;N;;;;;
+D005;HANGUL SYLLABLE KWEOLG;Lo;0;L;;;;;N;;;;;
+D006;HANGUL SYLLABLE KWEOLM;Lo;0;L;;;;;N;;;;;
+D007;HANGUL SYLLABLE KWEOLB;Lo;0;L;;;;;N;;;;;
+D008;HANGUL SYLLABLE KWEOLS;Lo;0;L;;;;;N;;;;;
+D009;HANGUL SYLLABLE KWEOLT;Lo;0;L;;;;;N;;;;;
+D00A;HANGUL SYLLABLE KWEOLP;Lo;0;L;;;;;N;;;;;
+D00B;HANGUL SYLLABLE KWEOLH;Lo;0;L;;;;;N;;;;;
+D00C;HANGUL SYLLABLE KWEOM;Lo;0;L;;;;;N;;;;;
+D00D;HANGUL SYLLABLE KWEOB;Lo;0;L;;;;;N;;;;;
+D00E;HANGUL SYLLABLE KWEOBS;Lo;0;L;;;;;N;;;;;
+D00F;HANGUL SYLLABLE KWEOS;Lo;0;L;;;;;N;;;;;
+D010;HANGUL SYLLABLE KWEOSS;Lo;0;L;;;;;N;;;;;
+D011;HANGUL SYLLABLE KWEONG;Lo;0;L;;;;;N;;;;;
+D012;HANGUL SYLLABLE KWEOJ;Lo;0;L;;;;;N;;;;;
+D013;HANGUL SYLLABLE KWEOC;Lo;0;L;;;;;N;;;;;
+D014;HANGUL SYLLABLE KWEOK;Lo;0;L;;;;;N;;;;;
+D015;HANGUL SYLLABLE KWEOT;Lo;0;L;;;;;N;;;;;
+D016;HANGUL SYLLABLE KWEOP;Lo;0;L;;;;;N;;;;;
+D017;HANGUL SYLLABLE KWEOH;Lo;0;L;;;;;N;;;;;
+D018;HANGUL SYLLABLE KWE;Lo;0;L;;;;;N;;;;;
+D019;HANGUL SYLLABLE KWEG;Lo;0;L;;;;;N;;;;;
+D01A;HANGUL SYLLABLE KWEGG;Lo;0;L;;;;;N;;;;;
+D01B;HANGUL SYLLABLE KWEGS;Lo;0;L;;;;;N;;;;;
+D01C;HANGUL SYLLABLE KWEN;Lo;0;L;;;;;N;;;;;
+D01D;HANGUL SYLLABLE KWENI;Lo;0;L;;;;;N;;;;;
+D01E;HANGUL SYLLABLE KWENH;Lo;0;L;;;;;N;;;;;
+D01F;HANGUL SYLLABLE KWED;Lo;0;L;;;;;N;;;;;
+D020;HANGUL SYLLABLE KWEL;Lo;0;L;;;;;N;;;;;
+D021;HANGUL SYLLABLE KWELG;Lo;0;L;;;;;N;;;;;
+D022;HANGUL SYLLABLE KWELM;Lo;0;L;;;;;N;;;;;
+D023;HANGUL SYLLABLE KWELB;Lo;0;L;;;;;N;;;;;
+D024;HANGUL SYLLABLE KWELS;Lo;0;L;;;;;N;;;;;
+D025;HANGUL SYLLABLE KWELT;Lo;0;L;;;;;N;;;;;
+D026;HANGUL SYLLABLE KWELP;Lo;0;L;;;;;N;;;;;
+D027;HANGUL SYLLABLE KWELH;Lo;0;L;;;;;N;;;;;
+D028;HANGUL SYLLABLE KWEM;Lo;0;L;;;;;N;;;;;
+D029;HANGUL SYLLABLE KWEB;Lo;0;L;;;;;N;;;;;
+D02A;HANGUL SYLLABLE KWEBS;Lo;0;L;;;;;N;;;;;
+D02B;HANGUL SYLLABLE KWES;Lo;0;L;;;;;N;;;;;
+D02C;HANGUL SYLLABLE KWESS;Lo;0;L;;;;;N;;;;;
+D02D;HANGUL SYLLABLE KWENG;Lo;0;L;;;;;N;;;;;
+D02E;HANGUL SYLLABLE KWEJ;Lo;0;L;;;;;N;;;;;
+D02F;HANGUL SYLLABLE KWEC;Lo;0;L;;;;;N;;;;;
+D030;HANGUL SYLLABLE KWEK;Lo;0;L;;;;;N;;;;;
+D031;HANGUL SYLLABLE KWET;Lo;0;L;;;;;N;;;;;
+D032;HANGUL SYLLABLE KWEP;Lo;0;L;;;;;N;;;;;
+D033;HANGUL SYLLABLE KWEH;Lo;0;L;;;;;N;;;;;
+D034;HANGUL SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
+D035;HANGUL SYLLABLE KWIG;Lo;0;L;;;;;N;;;;;
+D036;HANGUL SYLLABLE KWIGG;Lo;0;L;;;;;N;;;;;
+D037;HANGUL SYLLABLE KWIGS;Lo;0;L;;;;;N;;;;;
+D038;HANGUL SYLLABLE KWIN;Lo;0;L;;;;;N;;;;;
+D039;HANGUL SYLLABLE KWINI;Lo;0;L;;;;;N;;;;;
+D03A;HANGUL SYLLABLE KWINH;Lo;0;L;;;;;N;;;;;
+D03B;HANGUL SYLLABLE KWID;Lo;0;L;;;;;N;;;;;
+D03C;HANGUL SYLLABLE KWIL;Lo;0;L;;;;;N;;;;;
+D03D;HANGUL SYLLABLE KWILG;Lo;0;L;;;;;N;;;;;
+D03E;HANGUL SYLLABLE KWILM;Lo;0;L;;;;;N;;;;;
+D03F;HANGUL SYLLABLE KWILB;Lo;0;L;;;;;N;;;;;
+D040;HANGUL SYLLABLE KWILS;Lo;0;L;;;;;N;;;;;
+D041;HANGUL SYLLABLE KWILT;Lo;0;L;;;;;N;;;;;
+D042;HANGUL SYLLABLE KWILP;Lo;0;L;;;;;N;;;;;
+D043;HANGUL SYLLABLE KWILH;Lo;0;L;;;;;N;;;;;
+D044;HANGUL SYLLABLE KWIM;Lo;0;L;;;;;N;;;;;
+D045;HANGUL SYLLABLE KWIB;Lo;0;L;;;;;N;;;;;
+D046;HANGUL SYLLABLE KWIBS;Lo;0;L;;;;;N;;;;;
+D047;HANGUL SYLLABLE KWIS;Lo;0;L;;;;;N;;;;;
+D048;HANGUL SYLLABLE KWISS;Lo;0;L;;;;;N;;;;;
+D049;HANGUL SYLLABLE KWING;Lo;0;L;;;;;N;;;;;
+D04A;HANGUL SYLLABLE KWIJ;Lo;0;L;;;;;N;;;;;
+D04B;HANGUL SYLLABLE KWIC;Lo;0;L;;;;;N;;;;;
+D04C;HANGUL SYLLABLE KWIK;Lo;0;L;;;;;N;;;;;
+D04D;HANGUL SYLLABLE KWIT;Lo;0;L;;;;;N;;;;;
+D04E;HANGUL SYLLABLE KWIP;Lo;0;L;;;;;N;;;;;
+D04F;HANGUL SYLLABLE KWIH;Lo;0;L;;;;;N;;;;;
+D050;HANGUL SYLLABLE KYU;Lo;0;L;;;;;N;;;;;
+D051;HANGUL SYLLABLE KYUG;Lo;0;L;;;;;N;;;;;
+D052;HANGUL SYLLABLE KYUGG;Lo;0;L;;;;;N;;;;;
+D053;HANGUL SYLLABLE KYUGS;Lo;0;L;;;;;N;;;;;
+D054;HANGUL SYLLABLE KYUN;Lo;0;L;;;;;N;;;;;
+D055;HANGUL SYLLABLE KYUNI;Lo;0;L;;;;;N;;;;;
+D056;HANGUL SYLLABLE KYUNH;Lo;0;L;;;;;N;;;;;
+D057;HANGUL SYLLABLE KYUD;Lo;0;L;;;;;N;;;;;
+D058;HANGUL SYLLABLE KYUL;Lo;0;L;;;;;N;;;;;
+D059;HANGUL SYLLABLE KYULG;Lo;0;L;;;;;N;;;;;
+D05A;HANGUL SYLLABLE KYULM;Lo;0;L;;;;;N;;;;;
+D05B;HANGUL SYLLABLE KYULB;Lo;0;L;;;;;N;;;;;
+D05C;HANGUL SYLLABLE KYULS;Lo;0;L;;;;;N;;;;;
+D05D;HANGUL SYLLABLE KYULT;Lo;0;L;;;;;N;;;;;
+D05E;HANGUL SYLLABLE KYULP;Lo;0;L;;;;;N;;;;;
+D05F;HANGUL SYLLABLE KYULH;Lo;0;L;;;;;N;;;;;
+D060;HANGUL SYLLABLE KYUM;Lo;0;L;;;;;N;;;;;
+D061;HANGUL SYLLABLE KYUB;Lo;0;L;;;;;N;;;;;
+D062;HANGUL SYLLABLE KYUBS;Lo;0;L;;;;;N;;;;;
+D063;HANGUL SYLLABLE KYUS;Lo;0;L;;;;;N;;;;;
+D064;HANGUL SYLLABLE KYUSS;Lo;0;L;;;;;N;;;;;
+D065;HANGUL SYLLABLE KYUNG;Lo;0;L;;;;;N;;;;;
+D066;HANGUL SYLLABLE KYUJ;Lo;0;L;;;;;N;;;;;
+D067;HANGUL SYLLABLE KYUC;Lo;0;L;;;;;N;;;;;
+D068;HANGUL SYLLABLE KYUK;Lo;0;L;;;;;N;;;;;
+D069;HANGUL SYLLABLE KYUT;Lo;0;L;;;;;N;;;;;
+D06A;HANGUL SYLLABLE KYUP;Lo;0;L;;;;;N;;;;;
+D06B;HANGUL SYLLABLE KYUH;Lo;0;L;;;;;N;;;;;
+D06C;HANGUL SYLLABLE KEU;Lo;0;L;;;;;N;;;;;
+D06D;HANGUL SYLLABLE KEUG;Lo;0;L;;;;;N;;;;;
+D06E;HANGUL SYLLABLE KEUGG;Lo;0;L;;;;;N;;;;;
+D06F;HANGUL SYLLABLE KEUGS;Lo;0;L;;;;;N;;;;;
+D070;HANGUL SYLLABLE KEUN;Lo;0;L;;;;;N;;;;;
+D071;HANGUL SYLLABLE KEUNI;Lo;0;L;;;;;N;;;;;
+D072;HANGUL SYLLABLE KEUNH;Lo;0;L;;;;;N;;;;;
+D073;HANGUL SYLLABLE KEUD;Lo;0;L;;;;;N;;;;;
+D074;HANGUL SYLLABLE KEUL;Lo;0;L;;;;;N;;;;;
+D075;HANGUL SYLLABLE KEULG;Lo;0;L;;;;;N;;;;;
+D076;HANGUL SYLLABLE KEULM;Lo;0;L;;;;;N;;;;;
+D077;HANGUL SYLLABLE KEULB;Lo;0;L;;;;;N;;;;;
+D078;HANGUL SYLLABLE KEULS;Lo;0;L;;;;;N;;;;;
+D079;HANGUL SYLLABLE KEULT;Lo;0;L;;;;;N;;;;;
+D07A;HANGUL SYLLABLE KEULP;Lo;0;L;;;;;N;;;;;
+D07B;HANGUL SYLLABLE KEULH;Lo;0;L;;;;;N;;;;;
+D07C;HANGUL SYLLABLE KEUM;Lo;0;L;;;;;N;;;;;
+D07D;HANGUL SYLLABLE KEUB;Lo;0;L;;;;;N;;;;;
+D07E;HANGUL SYLLABLE KEUBS;Lo;0;L;;;;;N;;;;;
+D07F;HANGUL SYLLABLE KEUS;Lo;0;L;;;;;N;;;;;
+D080;HANGUL SYLLABLE KEUSS;Lo;0;L;;;;;N;;;;;
+D081;HANGUL SYLLABLE KEUNG;Lo;0;L;;;;;N;;;;;
+D082;HANGUL SYLLABLE KEUJ;Lo;0;L;;;;;N;;;;;
+D083;HANGUL SYLLABLE KEUC;Lo;0;L;;;;;N;;;;;
+D084;HANGUL SYLLABLE KEUK;Lo;0;L;;;;;N;;;;;
+D085;HANGUL SYLLABLE KEUT;Lo;0;L;;;;;N;;;;;
+D086;HANGUL SYLLABLE KEUP;Lo;0;L;;;;;N;;;;;
+D087;HANGUL SYLLABLE KEUH;Lo;0;L;;;;;N;;;;;
+D088;HANGUL SYLLABLE KYI;Lo;0;L;;;;;N;;;;;
+D089;HANGUL SYLLABLE KYIG;Lo;0;L;;;;;N;;;;;
+D08A;HANGUL SYLLABLE KYIGG;Lo;0;L;;;;;N;;;;;
+D08B;HANGUL SYLLABLE KYIGS;Lo;0;L;;;;;N;;;;;
+D08C;HANGUL SYLLABLE KYIN;Lo;0;L;;;;;N;;;;;
+D08D;HANGUL SYLLABLE KYINI;Lo;0;L;;;;;N;;;;;
+D08E;HANGUL SYLLABLE KYINH;Lo;0;L;;;;;N;;;;;
+D08F;HANGUL SYLLABLE KYID;Lo;0;L;;;;;N;;;;;
+D090;HANGUL SYLLABLE KYIL;Lo;0;L;;;;;N;;;;;
+D091;HANGUL SYLLABLE KYILG;Lo;0;L;;;;;N;;;;;
+D092;HANGUL SYLLABLE KYILM;Lo;0;L;;;;;N;;;;;
+D093;HANGUL SYLLABLE KYILB;Lo;0;L;;;;;N;;;;;
+D094;HANGUL SYLLABLE KYILS;Lo;0;L;;;;;N;;;;;
+D095;HANGUL SYLLABLE KYILT;Lo;0;L;;;;;N;;;;;
+D096;HANGUL SYLLABLE KYILP;Lo;0;L;;;;;N;;;;;
+D097;HANGUL SYLLABLE KYILH;Lo;0;L;;;;;N;;;;;
+D098;HANGUL SYLLABLE KYIM;Lo;0;L;;;;;N;;;;;
+D099;HANGUL SYLLABLE KYIB;Lo;0;L;;;;;N;;;;;
+D09A;HANGUL SYLLABLE KYIBS;Lo;0;L;;;;;N;;;;;
+D09B;HANGUL SYLLABLE KYIS;Lo;0;L;;;;;N;;;;;
+D09C;HANGUL SYLLABLE KYISS;Lo;0;L;;;;;N;;;;;
+D09D;HANGUL SYLLABLE KYING;Lo;0;L;;;;;N;;;;;
+D09E;HANGUL SYLLABLE KYIJ;Lo;0;L;;;;;N;;;;;
+D09F;HANGUL SYLLABLE KYIC;Lo;0;L;;;;;N;;;;;
+D0A0;HANGUL SYLLABLE KYIK;Lo;0;L;;;;;N;;;;;
+D0A1;HANGUL SYLLABLE KYIT;Lo;0;L;;;;;N;;;;;
+D0A2;HANGUL SYLLABLE KYIP;Lo;0;L;;;;;N;;;;;
+D0A3;HANGUL SYLLABLE KYIH;Lo;0;L;;;;;N;;;;;
+D0A4;HANGUL SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+D0A5;HANGUL SYLLABLE KIG;Lo;0;L;;;;;N;;;;;
+D0A6;HANGUL SYLLABLE KIGG;Lo;0;L;;;;;N;;;;;
+D0A7;HANGUL SYLLABLE KIGS;Lo;0;L;;;;;N;;;;;
+D0A8;HANGUL SYLLABLE KIN;Lo;0;L;;;;;N;;;;;
+D0A9;HANGUL SYLLABLE KINI;Lo;0;L;;;;;N;;;;;
+D0AA;HANGUL SYLLABLE KINH;Lo;0;L;;;;;N;;;;;
+D0AB;HANGUL SYLLABLE KID;Lo;0;L;;;;;N;;;;;
+D0AC;HANGUL SYLLABLE KIL;Lo;0;L;;;;;N;;;;;
+D0AD;HANGUL SYLLABLE KILG;Lo;0;L;;;;;N;;;;;
+D0AE;HANGUL SYLLABLE KILM;Lo;0;L;;;;;N;;;;;
+D0AF;HANGUL SYLLABLE KILB;Lo;0;L;;;;;N;;;;;
+D0B0;HANGUL SYLLABLE KILS;Lo;0;L;;;;;N;;;;;
+D0B1;HANGUL SYLLABLE KILT;Lo;0;L;;;;;N;;;;;
+D0B2;HANGUL SYLLABLE KILP;Lo;0;L;;;;;N;;;;;
+D0B3;HANGUL SYLLABLE KILH;Lo;0;L;;;;;N;;;;;
+D0B4;HANGUL SYLLABLE KIM;Lo;0;L;;;;;N;;;;;
+D0B5;HANGUL SYLLABLE KIB;Lo;0;L;;;;;N;;;;;
+D0B6;HANGUL SYLLABLE KIBS;Lo;0;L;;;;;N;;;;;
+D0B7;HANGUL SYLLABLE KIS;Lo;0;L;;;;;N;;;;;
+D0B8;HANGUL SYLLABLE KISS;Lo;0;L;;;;;N;;;;;
+D0B9;HANGUL SYLLABLE KING;Lo;0;L;;;;;N;;;;;
+D0BA;HANGUL SYLLABLE KIJ;Lo;0;L;;;;;N;;;;;
+D0BB;HANGUL SYLLABLE KIC;Lo;0;L;;;;;N;;;;;
+D0BC;HANGUL SYLLABLE KIK;Lo;0;L;;;;;N;;;;;
+D0BD;HANGUL SYLLABLE KIT;Lo;0;L;;;;;N;;;;;
+D0BE;HANGUL SYLLABLE KIP;Lo;0;L;;;;;N;;;;;
+D0BF;HANGUL SYLLABLE KIH;Lo;0;L;;;;;N;;;;;
+D0C0;HANGUL SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+D0C1;HANGUL SYLLABLE TAG;Lo;0;L;;;;;N;;;;;
+D0C2;HANGUL SYLLABLE TAGG;Lo;0;L;;;;;N;;;;;
+D0C3;HANGUL SYLLABLE TAGS;Lo;0;L;;;;;N;;;;;
+D0C4;HANGUL SYLLABLE TAN;Lo;0;L;;;;;N;;;;;
+D0C5;HANGUL SYLLABLE TANI;Lo;0;L;;;;;N;;;;;
+D0C6;HANGUL SYLLABLE TANH;Lo;0;L;;;;;N;;;;;
+D0C7;HANGUL SYLLABLE TAD;Lo;0;L;;;;;N;;;;;
+D0C8;HANGUL SYLLABLE TAL;Lo;0;L;;;;;N;;;;;
+D0C9;HANGUL SYLLABLE TALG;Lo;0;L;;;;;N;;;;;
+D0CA;HANGUL SYLLABLE TALM;Lo;0;L;;;;;N;;;;;
+D0CB;HANGUL SYLLABLE TALB;Lo;0;L;;;;;N;;;;;
+D0CC;HANGUL SYLLABLE TALS;Lo;0;L;;;;;N;;;;;
+D0CD;HANGUL SYLLABLE TALT;Lo;0;L;;;;;N;;;;;
+D0CE;HANGUL SYLLABLE TALP;Lo;0;L;;;;;N;;;;;
+D0CF;HANGUL SYLLABLE TALH;Lo;0;L;;;;;N;;;;;
+D0D0;HANGUL SYLLABLE TAM;Lo;0;L;;;;;N;;;;;
+D0D1;HANGUL SYLLABLE TAB;Lo;0;L;;;;;N;;;;;
+D0D2;HANGUL SYLLABLE TABS;Lo;0;L;;;;;N;;;;;
+D0D3;HANGUL SYLLABLE TAS;Lo;0;L;;;;;N;;;;;
+D0D4;HANGUL SYLLABLE TASS;Lo;0;L;;;;;N;;;;;
+D0D5;HANGUL SYLLABLE TANG;Lo;0;L;;;;;N;;;;;
+D0D6;HANGUL SYLLABLE TAJ;Lo;0;L;;;;;N;;;;;
+D0D7;HANGUL SYLLABLE TAC;Lo;0;L;;;;;N;;;;;
+D0D8;HANGUL SYLLABLE TAK;Lo;0;L;;;;;N;;;;;
+D0D9;HANGUL SYLLABLE TAT;Lo;0;L;;;;;N;;;;;
+D0DA;HANGUL SYLLABLE TAP;Lo;0;L;;;;;N;;;;;
+D0DB;HANGUL SYLLABLE TAH;Lo;0;L;;;;;N;;;;;
+D0DC;HANGUL SYLLABLE TAE;Lo;0;L;;;;;N;;;;;
+D0DD;HANGUL SYLLABLE TAEG;Lo;0;L;;;;;N;;;;;
+D0DE;HANGUL SYLLABLE TAEGG;Lo;0;L;;;;;N;;;;;
+D0DF;HANGUL SYLLABLE TAEGS;Lo;0;L;;;;;N;;;;;
+D0E0;HANGUL SYLLABLE TAEN;Lo;0;L;;;;;N;;;;;
+D0E1;HANGUL SYLLABLE TAENI;Lo;0;L;;;;;N;;;;;
+D0E2;HANGUL SYLLABLE TAENH;Lo;0;L;;;;;N;;;;;
+D0E3;HANGUL SYLLABLE TAED;Lo;0;L;;;;;N;;;;;
+D0E4;HANGUL SYLLABLE TAEL;Lo;0;L;;;;;N;;;;;
+D0E5;HANGUL SYLLABLE TAELG;Lo;0;L;;;;;N;;;;;
+D0E6;HANGUL SYLLABLE TAELM;Lo;0;L;;;;;N;;;;;
+D0E7;HANGUL SYLLABLE TAELB;Lo;0;L;;;;;N;;;;;
+D0E8;HANGUL SYLLABLE TAELS;Lo;0;L;;;;;N;;;;;
+D0E9;HANGUL SYLLABLE TAELT;Lo;0;L;;;;;N;;;;;
+D0EA;HANGUL SYLLABLE TAELP;Lo;0;L;;;;;N;;;;;
+D0EB;HANGUL SYLLABLE TAELH;Lo;0;L;;;;;N;;;;;
+D0EC;HANGUL SYLLABLE TAEM;Lo;0;L;;;;;N;;;;;
+D0ED;HANGUL SYLLABLE TAEB;Lo;0;L;;;;;N;;;;;
+D0EE;HANGUL SYLLABLE TAEBS;Lo;0;L;;;;;N;;;;;
+D0EF;HANGUL SYLLABLE TAES;Lo;0;L;;;;;N;;;;;
+D0F0;HANGUL SYLLABLE TAESS;Lo;0;L;;;;;N;;;;;
+D0F1;HANGUL SYLLABLE TAENG;Lo;0;L;;;;;N;;;;;
+D0F2;HANGUL SYLLABLE TAEJ;Lo;0;L;;;;;N;;;;;
+D0F3;HANGUL SYLLABLE TAEC;Lo;0;L;;;;;N;;;;;
+D0F4;HANGUL SYLLABLE TAEK;Lo;0;L;;;;;N;;;;;
+D0F5;HANGUL SYLLABLE TAET;Lo;0;L;;;;;N;;;;;
+D0F6;HANGUL SYLLABLE TAEP;Lo;0;L;;;;;N;;;;;
+D0F7;HANGUL SYLLABLE TAEH;Lo;0;L;;;;;N;;;;;
+D0F8;HANGUL SYLLABLE TYA;Lo;0;L;;;;;N;;;;;
+D0F9;HANGUL SYLLABLE TYAG;Lo;0;L;;;;;N;;;;;
+D0FA;HANGUL SYLLABLE TYAGG;Lo;0;L;;;;;N;;;;;
+D0FB;HANGUL SYLLABLE TYAGS;Lo;0;L;;;;;N;;;;;
+D0FC;HANGUL SYLLABLE TYAN;Lo;0;L;;;;;N;;;;;
+D0FD;HANGUL SYLLABLE TYANI;Lo;0;L;;;;;N;;;;;
+D0FE;HANGUL SYLLABLE TYANH;Lo;0;L;;;;;N;;;;;
+D0FF;HANGUL SYLLABLE TYAD;Lo;0;L;;;;;N;;;;;
+D100;HANGUL SYLLABLE TYAL;Lo;0;L;;;;;N;;;;;
+D101;HANGUL SYLLABLE TYALG;Lo;0;L;;;;;N;;;;;
+D102;HANGUL SYLLABLE TYALM;Lo;0;L;;;;;N;;;;;
+D103;HANGUL SYLLABLE TYALB;Lo;0;L;;;;;N;;;;;
+D104;HANGUL SYLLABLE TYALS;Lo;0;L;;;;;N;;;;;
+D105;HANGUL SYLLABLE TYALT;Lo;0;L;;;;;N;;;;;
+D106;HANGUL SYLLABLE TYALP;Lo;0;L;;;;;N;;;;;
+D107;HANGUL SYLLABLE TYALH;Lo;0;L;;;;;N;;;;;
+D108;HANGUL SYLLABLE TYAM;Lo;0;L;;;;;N;;;;;
+D109;HANGUL SYLLABLE TYAB;Lo;0;L;;;;;N;;;;;
+D10A;HANGUL SYLLABLE TYABS;Lo;0;L;;;;;N;;;;;
+D10B;HANGUL SYLLABLE TYAS;Lo;0;L;;;;;N;;;;;
+D10C;HANGUL SYLLABLE TYASS;Lo;0;L;;;;;N;;;;;
+D10D;HANGUL SYLLABLE TYANG;Lo;0;L;;;;;N;;;;;
+D10E;HANGUL SYLLABLE TYAJ;Lo;0;L;;;;;N;;;;;
+D10F;HANGUL SYLLABLE TYAC;Lo;0;L;;;;;N;;;;;
+D110;HANGUL SYLLABLE TYAK;Lo;0;L;;;;;N;;;;;
+D111;HANGUL SYLLABLE TYAT;Lo;0;L;;;;;N;;;;;
+D112;HANGUL SYLLABLE TYAP;Lo;0;L;;;;;N;;;;;
+D113;HANGUL SYLLABLE TYAH;Lo;0;L;;;;;N;;;;;
+D114;HANGUL SYLLABLE TYAE;Lo;0;L;;;;;N;;;;;
+D115;HANGUL SYLLABLE TYAEG;Lo;0;L;;;;;N;;;;;
+D116;HANGUL SYLLABLE TYAEGG;Lo;0;L;;;;;N;;;;;
+D117;HANGUL SYLLABLE TYAEGS;Lo;0;L;;;;;N;;;;;
+D118;HANGUL SYLLABLE TYAEN;Lo;0;L;;;;;N;;;;;
+D119;HANGUL SYLLABLE TYAENI;Lo;0;L;;;;;N;;;;;
+D11A;HANGUL SYLLABLE TYAENH;Lo;0;L;;;;;N;;;;;
+D11B;HANGUL SYLLABLE TYAED;Lo;0;L;;;;;N;;;;;
+D11C;HANGUL SYLLABLE TYAEL;Lo;0;L;;;;;N;;;;;
+D11D;HANGUL SYLLABLE TYAELG;Lo;0;L;;;;;N;;;;;
+D11E;HANGUL SYLLABLE TYAELM;Lo;0;L;;;;;N;;;;;
+D11F;HANGUL SYLLABLE TYAELB;Lo;0;L;;;;;N;;;;;
+D120;HANGUL SYLLABLE TYAELS;Lo;0;L;;;;;N;;;;;
+D121;HANGUL SYLLABLE TYAELT;Lo;0;L;;;;;N;;;;;
+D122;HANGUL SYLLABLE TYAELP;Lo;0;L;;;;;N;;;;;
+D123;HANGUL SYLLABLE TYAELH;Lo;0;L;;;;;N;;;;;
+D124;HANGUL SYLLABLE TYAEM;Lo;0;L;;;;;N;;;;;
+D125;HANGUL SYLLABLE TYAEB;Lo;0;L;;;;;N;;;;;
+D126;HANGUL SYLLABLE TYAEBS;Lo;0;L;;;;;N;;;;;
+D127;HANGUL SYLLABLE TYAES;Lo;0;L;;;;;N;;;;;
+D128;HANGUL SYLLABLE TYAESS;Lo;0;L;;;;;N;;;;;
+D129;HANGUL SYLLABLE TYAENG;Lo;0;L;;;;;N;;;;;
+D12A;HANGUL SYLLABLE TYAEJ;Lo;0;L;;;;;N;;;;;
+D12B;HANGUL SYLLABLE TYAEC;Lo;0;L;;;;;N;;;;;
+D12C;HANGUL SYLLABLE TYAEK;Lo;0;L;;;;;N;;;;;
+D12D;HANGUL SYLLABLE TYAET;Lo;0;L;;;;;N;;;;;
+D12E;HANGUL SYLLABLE TYAEP;Lo;0;L;;;;;N;;;;;
+D12F;HANGUL SYLLABLE TYAEH;Lo;0;L;;;;;N;;;;;
+D130;HANGUL SYLLABLE TEO;Lo;0;L;;;;;N;;;;;
+D131;HANGUL SYLLABLE TEOG;Lo;0;L;;;;;N;;;;;
+D132;HANGUL SYLLABLE TEOGG;Lo;0;L;;;;;N;;;;;
+D133;HANGUL SYLLABLE TEOGS;Lo;0;L;;;;;N;;;;;
+D134;HANGUL SYLLABLE TEON;Lo;0;L;;;;;N;;;;;
+D135;HANGUL SYLLABLE TEONI;Lo;0;L;;;;;N;;;;;
+D136;HANGUL SYLLABLE TEONH;Lo;0;L;;;;;N;;;;;
+D137;HANGUL SYLLABLE TEOD;Lo;0;L;;;;;N;;;;;
+D138;HANGUL SYLLABLE TEOL;Lo;0;L;;;;;N;;;;;
+D139;HANGUL SYLLABLE TEOLG;Lo;0;L;;;;;N;;;;;
+D13A;HANGUL SYLLABLE TEOLM;Lo;0;L;;;;;N;;;;;
+D13B;HANGUL SYLLABLE TEOLB;Lo;0;L;;;;;N;;;;;
+D13C;HANGUL SYLLABLE TEOLS;Lo;0;L;;;;;N;;;;;
+D13D;HANGUL SYLLABLE TEOLT;Lo;0;L;;;;;N;;;;;
+D13E;HANGUL SYLLABLE TEOLP;Lo;0;L;;;;;N;;;;;
+D13F;HANGUL SYLLABLE TEOLH;Lo;0;L;;;;;N;;;;;
+D140;HANGUL SYLLABLE TEOM;Lo;0;L;;;;;N;;;;;
+D141;HANGUL SYLLABLE TEOB;Lo;0;L;;;;;N;;;;;
+D142;HANGUL SYLLABLE TEOBS;Lo;0;L;;;;;N;;;;;
+D143;HANGUL SYLLABLE TEOS;Lo;0;L;;;;;N;;;;;
+D144;HANGUL SYLLABLE TEOSS;Lo;0;L;;;;;N;;;;;
+D145;HANGUL SYLLABLE TEONG;Lo;0;L;;;;;N;;;;;
+D146;HANGUL SYLLABLE TEOJ;Lo;0;L;;;;;N;;;;;
+D147;HANGUL SYLLABLE TEOC;Lo;0;L;;;;;N;;;;;
+D148;HANGUL SYLLABLE TEOK;Lo;0;L;;;;;N;;;;;
+D149;HANGUL SYLLABLE TEOT;Lo;0;L;;;;;N;;;;;
+D14A;HANGUL SYLLABLE TEOP;Lo;0;L;;;;;N;;;;;
+D14B;HANGUL SYLLABLE TEOH;Lo;0;L;;;;;N;;;;;
+D14C;HANGUL SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+D14D;HANGUL SYLLABLE TEG;Lo;0;L;;;;;N;;;;;
+D14E;HANGUL SYLLABLE TEGG;Lo;0;L;;;;;N;;;;;
+D14F;HANGUL SYLLABLE TEGS;Lo;0;L;;;;;N;;;;;
+D150;HANGUL SYLLABLE TEN;Lo;0;L;;;;;N;;;;;
+D151;HANGUL SYLLABLE TENI;Lo;0;L;;;;;N;;;;;
+D152;HANGUL SYLLABLE TENH;Lo;0;L;;;;;N;;;;;
+D153;HANGUL SYLLABLE TED;Lo;0;L;;;;;N;;;;;
+D154;HANGUL SYLLABLE TEL;Lo;0;L;;;;;N;;;;;
+D155;HANGUL SYLLABLE TELG;Lo;0;L;;;;;N;;;;;
+D156;HANGUL SYLLABLE TELM;Lo;0;L;;;;;N;;;;;
+D157;HANGUL SYLLABLE TELB;Lo;0;L;;;;;N;;;;;
+D158;HANGUL SYLLABLE TELS;Lo;0;L;;;;;N;;;;;
+D159;HANGUL SYLLABLE TELT;Lo;0;L;;;;;N;;;;;
+D15A;HANGUL SYLLABLE TELP;Lo;0;L;;;;;N;;;;;
+D15B;HANGUL SYLLABLE TELH;Lo;0;L;;;;;N;;;;;
+D15C;HANGUL SYLLABLE TEM;Lo;0;L;;;;;N;;;;;
+D15D;HANGUL SYLLABLE TEB;Lo;0;L;;;;;N;;;;;
+D15E;HANGUL SYLLABLE TEBS;Lo;0;L;;;;;N;;;;;
+D15F;HANGUL SYLLABLE TES;Lo;0;L;;;;;N;;;;;
+D160;HANGUL SYLLABLE TESS;Lo;0;L;;;;;N;;;;;
+D161;HANGUL SYLLABLE TENG;Lo;0;L;;;;;N;;;;;
+D162;HANGUL SYLLABLE TEJ;Lo;0;L;;;;;N;;;;;
+D163;HANGUL SYLLABLE TEC;Lo;0;L;;;;;N;;;;;
+D164;HANGUL SYLLABLE TEK;Lo;0;L;;;;;N;;;;;
+D165;HANGUL SYLLABLE TET;Lo;0;L;;;;;N;;;;;
+D166;HANGUL SYLLABLE TEP;Lo;0;L;;;;;N;;;;;
+D167;HANGUL SYLLABLE TEH;Lo;0;L;;;;;N;;;;;
+D168;HANGUL SYLLABLE TYEO;Lo;0;L;;;;;N;;;;;
+D169;HANGUL SYLLABLE TYEOG;Lo;0;L;;;;;N;;;;;
+D16A;HANGUL SYLLABLE TYEOGG;Lo;0;L;;;;;N;;;;;
+D16B;HANGUL SYLLABLE TYEOGS;Lo;0;L;;;;;N;;;;;
+D16C;HANGUL SYLLABLE TYEON;Lo;0;L;;;;;N;;;;;
+D16D;HANGUL SYLLABLE TYEONI;Lo;0;L;;;;;N;;;;;
+D16E;HANGUL SYLLABLE TYEONH;Lo;0;L;;;;;N;;;;;
+D16F;HANGUL SYLLABLE TYEOD;Lo;0;L;;;;;N;;;;;
+D170;HANGUL SYLLABLE TYEOL;Lo;0;L;;;;;N;;;;;
+D171;HANGUL SYLLABLE TYEOLG;Lo;0;L;;;;;N;;;;;
+D172;HANGUL SYLLABLE TYEOLM;Lo;0;L;;;;;N;;;;;
+D173;HANGUL SYLLABLE TYEOLB;Lo;0;L;;;;;N;;;;;
+D174;HANGUL SYLLABLE TYEOLS;Lo;0;L;;;;;N;;;;;
+D175;HANGUL SYLLABLE TYEOLT;Lo;0;L;;;;;N;;;;;
+D176;HANGUL SYLLABLE TYEOLP;Lo;0;L;;;;;N;;;;;
+D177;HANGUL SYLLABLE TYEOLH;Lo;0;L;;;;;N;;;;;
+D178;HANGUL SYLLABLE TYEOM;Lo;0;L;;;;;N;;;;;
+D179;HANGUL SYLLABLE TYEOB;Lo;0;L;;;;;N;;;;;
+D17A;HANGUL SYLLABLE TYEOBS;Lo;0;L;;;;;N;;;;;
+D17B;HANGUL SYLLABLE TYEOS;Lo;0;L;;;;;N;;;;;
+D17C;HANGUL SYLLABLE TYEOSS;Lo;0;L;;;;;N;;;;;
+D17D;HANGUL SYLLABLE TYEONG;Lo;0;L;;;;;N;;;;;
+D17E;HANGUL SYLLABLE TYEOJ;Lo;0;L;;;;;N;;;;;
+D17F;HANGUL SYLLABLE TYEOC;Lo;0;L;;;;;N;;;;;
+D180;HANGUL SYLLABLE TYEOK;Lo;0;L;;;;;N;;;;;
+D181;HANGUL SYLLABLE TYEOT;Lo;0;L;;;;;N;;;;;
+D182;HANGUL SYLLABLE TYEOP;Lo;0;L;;;;;N;;;;;
+D183;HANGUL SYLLABLE TYEOH;Lo;0;L;;;;;N;;;;;
+D184;HANGUL SYLLABLE TYE;Lo;0;L;;;;;N;;;;;
+D185;HANGUL SYLLABLE TYEG;Lo;0;L;;;;;N;;;;;
+D186;HANGUL SYLLABLE TYEGG;Lo;0;L;;;;;N;;;;;
+D187;HANGUL SYLLABLE TYEGS;Lo;0;L;;;;;N;;;;;
+D188;HANGUL SYLLABLE TYEN;Lo;0;L;;;;;N;;;;;
+D189;HANGUL SYLLABLE TYENI;Lo;0;L;;;;;N;;;;;
+D18A;HANGUL SYLLABLE TYENH;Lo;0;L;;;;;N;;;;;
+D18B;HANGUL SYLLABLE TYED;Lo;0;L;;;;;N;;;;;
+D18C;HANGUL SYLLABLE TYEL;Lo;0;L;;;;;N;;;;;
+D18D;HANGUL SYLLABLE TYELG;Lo;0;L;;;;;N;;;;;
+D18E;HANGUL SYLLABLE TYELM;Lo;0;L;;;;;N;;;;;
+D18F;HANGUL SYLLABLE TYELB;Lo;0;L;;;;;N;;;;;
+D190;HANGUL SYLLABLE TYELS;Lo;0;L;;;;;N;;;;;
+D191;HANGUL SYLLABLE TYELT;Lo;0;L;;;;;N;;;;;
+D192;HANGUL SYLLABLE TYELP;Lo;0;L;;;;;N;;;;;
+D193;HANGUL SYLLABLE TYELH;Lo;0;L;;;;;N;;;;;
+D194;HANGUL SYLLABLE TYEM;Lo;0;L;;;;;N;;;;;
+D195;HANGUL SYLLABLE TYEB;Lo;0;L;;;;;N;;;;;
+D196;HANGUL SYLLABLE TYEBS;Lo;0;L;;;;;N;;;;;
+D197;HANGUL SYLLABLE TYES;Lo;0;L;;;;;N;;;;;
+D198;HANGUL SYLLABLE TYESS;Lo;0;L;;;;;N;;;;;
+D199;HANGUL SYLLABLE TYENG;Lo;0;L;;;;;N;;;;;
+D19A;HANGUL SYLLABLE TYEJ;Lo;0;L;;;;;N;;;;;
+D19B;HANGUL SYLLABLE TYEC;Lo;0;L;;;;;N;;;;;
+D19C;HANGUL SYLLABLE TYEK;Lo;0;L;;;;;N;;;;;
+D19D;HANGUL SYLLABLE TYET;Lo;0;L;;;;;N;;;;;
+D19E;HANGUL SYLLABLE TYEP;Lo;0;L;;;;;N;;;;;
+D19F;HANGUL SYLLABLE TYEH;Lo;0;L;;;;;N;;;;;
+D1A0;HANGUL SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+D1A1;HANGUL SYLLABLE TOG;Lo;0;L;;;;;N;;;;;
+D1A2;HANGUL SYLLABLE TOGG;Lo;0;L;;;;;N;;;;;
+D1A3;HANGUL SYLLABLE TOGS;Lo;0;L;;;;;N;;;;;
+D1A4;HANGUL SYLLABLE TON;Lo;0;L;;;;;N;;;;;
+D1A5;HANGUL SYLLABLE TONI;Lo;0;L;;;;;N;;;;;
+D1A6;HANGUL SYLLABLE TONH;Lo;0;L;;;;;N;;;;;
+D1A7;HANGUL SYLLABLE TOD;Lo;0;L;;;;;N;;;;;
+D1A8;HANGUL SYLLABLE TOL;Lo;0;L;;;;;N;;;;;
+D1A9;HANGUL SYLLABLE TOLG;Lo;0;L;;;;;N;;;;;
+D1AA;HANGUL SYLLABLE TOLM;Lo;0;L;;;;;N;;;;;
+D1AB;HANGUL SYLLABLE TOLB;Lo;0;L;;;;;N;;;;;
+D1AC;HANGUL SYLLABLE TOLS;Lo;0;L;;;;;N;;;;;
+D1AD;HANGUL SYLLABLE TOLT;Lo;0;L;;;;;N;;;;;
+D1AE;HANGUL SYLLABLE TOLP;Lo;0;L;;;;;N;;;;;
+D1AF;HANGUL SYLLABLE TOLH;Lo;0;L;;;;;N;;;;;
+D1B0;HANGUL SYLLABLE TOM;Lo;0;L;;;;;N;;;;;
+D1B1;HANGUL SYLLABLE TOB;Lo;0;L;;;;;N;;;;;
+D1B2;HANGUL SYLLABLE TOBS;Lo;0;L;;;;;N;;;;;
+D1B3;HANGUL SYLLABLE TOS;Lo;0;L;;;;;N;;;;;
+D1B4;HANGUL SYLLABLE TOSS;Lo;0;L;;;;;N;;;;;
+D1B5;HANGUL SYLLABLE TONG;Lo;0;L;;;;;N;;;;;
+D1B6;HANGUL SYLLABLE TOJ;Lo;0;L;;;;;N;;;;;
+D1B7;HANGUL SYLLABLE TOC;Lo;0;L;;;;;N;;;;;
+D1B8;HANGUL SYLLABLE TOK;Lo;0;L;;;;;N;;;;;
+D1B9;HANGUL SYLLABLE TOT;Lo;0;L;;;;;N;;;;;
+D1BA;HANGUL SYLLABLE TOP;Lo;0;L;;;;;N;;;;;
+D1BB;HANGUL SYLLABLE TOH;Lo;0;L;;;;;N;;;;;
+D1BC;HANGUL SYLLABLE TWA;Lo;0;L;;;;;N;;;;;
+D1BD;HANGUL SYLLABLE TWAG;Lo;0;L;;;;;N;;;;;
+D1BE;HANGUL SYLLABLE TWAGG;Lo;0;L;;;;;N;;;;;
+D1BF;HANGUL SYLLABLE TWAGS;Lo;0;L;;;;;N;;;;;
+D1C0;HANGUL SYLLABLE TWAN;Lo;0;L;;;;;N;;;;;
+D1C1;HANGUL SYLLABLE TWANI;Lo;0;L;;;;;N;;;;;
+D1C2;HANGUL SYLLABLE TWANH;Lo;0;L;;;;;N;;;;;
+D1C3;HANGUL SYLLABLE TWAD;Lo;0;L;;;;;N;;;;;
+D1C4;HANGUL SYLLABLE TWAL;Lo;0;L;;;;;N;;;;;
+D1C5;HANGUL SYLLABLE TWALG;Lo;0;L;;;;;N;;;;;
+D1C6;HANGUL SYLLABLE TWALM;Lo;0;L;;;;;N;;;;;
+D1C7;HANGUL SYLLABLE TWALB;Lo;0;L;;;;;N;;;;;
+D1C8;HANGUL SYLLABLE TWALS;Lo;0;L;;;;;N;;;;;
+D1C9;HANGUL SYLLABLE TWALT;Lo;0;L;;;;;N;;;;;
+D1CA;HANGUL SYLLABLE TWALP;Lo;0;L;;;;;N;;;;;
+D1CB;HANGUL SYLLABLE TWALH;Lo;0;L;;;;;N;;;;;
+D1CC;HANGUL SYLLABLE TWAM;Lo;0;L;;;;;N;;;;;
+D1CD;HANGUL SYLLABLE TWAB;Lo;0;L;;;;;N;;;;;
+D1CE;HANGUL SYLLABLE TWABS;Lo;0;L;;;;;N;;;;;
+D1CF;HANGUL SYLLABLE TWAS;Lo;0;L;;;;;N;;;;;
+D1D0;HANGUL SYLLABLE TWASS;Lo;0;L;;;;;N;;;;;
+D1D1;HANGUL SYLLABLE TWANG;Lo;0;L;;;;;N;;;;;
+D1D2;HANGUL SYLLABLE TWAJ;Lo;0;L;;;;;N;;;;;
+D1D3;HANGUL SYLLABLE TWAC;Lo;0;L;;;;;N;;;;;
+D1D4;HANGUL SYLLABLE TWAK;Lo;0;L;;;;;N;;;;;
+D1D5;HANGUL SYLLABLE TWAT;Lo;0;L;;;;;N;;;;;
+D1D6;HANGUL SYLLABLE TWAP;Lo;0;L;;;;;N;;;;;
+D1D7;HANGUL SYLLABLE TWAH;Lo;0;L;;;;;N;;;;;
+D1D8;HANGUL SYLLABLE TWAE;Lo;0;L;;;;;N;;;;;
+D1D9;HANGUL SYLLABLE TWAEG;Lo;0;L;;;;;N;;;;;
+D1DA;HANGUL SYLLABLE TWAEGG;Lo;0;L;;;;;N;;;;;
+D1DB;HANGUL SYLLABLE TWAEGS;Lo;0;L;;;;;N;;;;;
+D1DC;HANGUL SYLLABLE TWAEN;Lo;0;L;;;;;N;;;;;
+D1DD;HANGUL SYLLABLE TWAENI;Lo;0;L;;;;;N;;;;;
+D1DE;HANGUL SYLLABLE TWAENH;Lo;0;L;;;;;N;;;;;
+D1DF;HANGUL SYLLABLE TWAED;Lo;0;L;;;;;N;;;;;
+D1E0;HANGUL SYLLABLE TWAEL;Lo;0;L;;;;;N;;;;;
+D1E1;HANGUL SYLLABLE TWAELG;Lo;0;L;;;;;N;;;;;
+D1E2;HANGUL SYLLABLE TWAELM;Lo;0;L;;;;;N;;;;;
+D1E3;HANGUL SYLLABLE TWAELB;Lo;0;L;;;;;N;;;;;
+D1E4;HANGUL SYLLABLE TWAELS;Lo;0;L;;;;;N;;;;;
+D1E5;HANGUL SYLLABLE TWAELT;Lo;0;L;;;;;N;;;;;
+D1E6;HANGUL SYLLABLE TWAELP;Lo;0;L;;;;;N;;;;;
+D1E7;HANGUL SYLLABLE TWAELH;Lo;0;L;;;;;N;;;;;
+D1E8;HANGUL SYLLABLE TWAEM;Lo;0;L;;;;;N;;;;;
+D1E9;HANGUL SYLLABLE TWAEB;Lo;0;L;;;;;N;;;;;
+D1EA;HANGUL SYLLABLE TWAEBS;Lo;0;L;;;;;N;;;;;
+D1EB;HANGUL SYLLABLE TWAES;Lo;0;L;;;;;N;;;;;
+D1EC;HANGUL SYLLABLE TWAESS;Lo;0;L;;;;;N;;;;;
+D1ED;HANGUL SYLLABLE TWAENG;Lo;0;L;;;;;N;;;;;
+D1EE;HANGUL SYLLABLE TWAEJ;Lo;0;L;;;;;N;;;;;
+D1EF;HANGUL SYLLABLE TWAEC;Lo;0;L;;;;;N;;;;;
+D1F0;HANGUL SYLLABLE TWAEK;Lo;0;L;;;;;N;;;;;
+D1F1;HANGUL SYLLABLE TWAET;Lo;0;L;;;;;N;;;;;
+D1F2;HANGUL SYLLABLE TWAEP;Lo;0;L;;;;;N;;;;;
+D1F3;HANGUL SYLLABLE TWAEH;Lo;0;L;;;;;N;;;;;
+D1F4;HANGUL SYLLABLE TOE;Lo;0;L;;;;;N;;;;;
+D1F5;HANGUL SYLLABLE TOEG;Lo;0;L;;;;;N;;;;;
+D1F6;HANGUL SYLLABLE TOEGG;Lo;0;L;;;;;N;;;;;
+D1F7;HANGUL SYLLABLE TOEGS;Lo;0;L;;;;;N;;;;;
+D1F8;HANGUL SYLLABLE TOEN;Lo;0;L;;;;;N;;;;;
+D1F9;HANGUL SYLLABLE TOENI;Lo;0;L;;;;;N;;;;;
+D1FA;HANGUL SYLLABLE TOENH;Lo;0;L;;;;;N;;;;;
+D1FB;HANGUL SYLLABLE TOED;Lo;0;L;;;;;N;;;;;
+D1FC;HANGUL SYLLABLE TOEL;Lo;0;L;;;;;N;;;;;
+D1FD;HANGUL SYLLABLE TOELG;Lo;0;L;;;;;N;;;;;
+D1FE;HANGUL SYLLABLE TOELM;Lo;0;L;;;;;N;;;;;
+D1FF;HANGUL SYLLABLE TOELB;Lo;0;L;;;;;N;;;;;
+D200;HANGUL SYLLABLE TOELS;Lo;0;L;;;;;N;;;;;
+D201;HANGUL SYLLABLE TOELT;Lo;0;L;;;;;N;;;;;
+D202;HANGUL SYLLABLE TOELP;Lo;0;L;;;;;N;;;;;
+D203;HANGUL SYLLABLE TOELH;Lo;0;L;;;;;N;;;;;
+D204;HANGUL SYLLABLE TOEM;Lo;0;L;;;;;N;;;;;
+D205;HANGUL SYLLABLE TOEB;Lo;0;L;;;;;N;;;;;
+D206;HANGUL SYLLABLE TOEBS;Lo;0;L;;;;;N;;;;;
+D207;HANGUL SYLLABLE TOES;Lo;0;L;;;;;N;;;;;
+D208;HANGUL SYLLABLE TOESS;Lo;0;L;;;;;N;;;;;
+D209;HANGUL SYLLABLE TOENG;Lo;0;L;;;;;N;;;;;
+D20A;HANGUL SYLLABLE TOEJ;Lo;0;L;;;;;N;;;;;
+D20B;HANGUL SYLLABLE TOEC;Lo;0;L;;;;;N;;;;;
+D20C;HANGUL SYLLABLE TOEK;Lo;0;L;;;;;N;;;;;
+D20D;HANGUL SYLLABLE TOET;Lo;0;L;;;;;N;;;;;
+D20E;HANGUL SYLLABLE TOEP;Lo;0;L;;;;;N;;;;;
+D20F;HANGUL SYLLABLE TOEH;Lo;0;L;;;;;N;;;;;
+D210;HANGUL SYLLABLE TYO;Lo;0;L;;;;;N;;;;;
+D211;HANGUL SYLLABLE TYOG;Lo;0;L;;;;;N;;;;;
+D212;HANGUL SYLLABLE TYOGG;Lo;0;L;;;;;N;;;;;
+D213;HANGUL SYLLABLE TYOGS;Lo;0;L;;;;;N;;;;;
+D214;HANGUL SYLLABLE TYON;Lo;0;L;;;;;N;;;;;
+D215;HANGUL SYLLABLE TYONI;Lo;0;L;;;;;N;;;;;
+D216;HANGUL SYLLABLE TYONH;Lo;0;L;;;;;N;;;;;
+D217;HANGUL SYLLABLE TYOD;Lo;0;L;;;;;N;;;;;
+D218;HANGUL SYLLABLE TYOL;Lo;0;L;;;;;N;;;;;
+D219;HANGUL SYLLABLE TYOLG;Lo;0;L;;;;;N;;;;;
+D21A;HANGUL SYLLABLE TYOLM;Lo;0;L;;;;;N;;;;;
+D21B;HANGUL SYLLABLE TYOLB;Lo;0;L;;;;;N;;;;;
+D21C;HANGUL SYLLABLE TYOLS;Lo;0;L;;;;;N;;;;;
+D21D;HANGUL SYLLABLE TYOLT;Lo;0;L;;;;;N;;;;;
+D21E;HANGUL SYLLABLE TYOLP;Lo;0;L;;;;;N;;;;;
+D21F;HANGUL SYLLABLE TYOLH;Lo;0;L;;;;;N;;;;;
+D220;HANGUL SYLLABLE TYOM;Lo;0;L;;;;;N;;;;;
+D221;HANGUL SYLLABLE TYOB;Lo;0;L;;;;;N;;;;;
+D222;HANGUL SYLLABLE TYOBS;Lo;0;L;;;;;N;;;;;
+D223;HANGUL SYLLABLE TYOS;Lo;0;L;;;;;N;;;;;
+D224;HANGUL SYLLABLE TYOSS;Lo;0;L;;;;;N;;;;;
+D225;HANGUL SYLLABLE TYONG;Lo;0;L;;;;;N;;;;;
+D226;HANGUL SYLLABLE TYOJ;Lo;0;L;;;;;N;;;;;
+D227;HANGUL SYLLABLE TYOC;Lo;0;L;;;;;N;;;;;
+D228;HANGUL SYLLABLE TYOK;Lo;0;L;;;;;N;;;;;
+D229;HANGUL SYLLABLE TYOT;Lo;0;L;;;;;N;;;;;
+D22A;HANGUL SYLLABLE TYOP;Lo;0;L;;;;;N;;;;;
+D22B;HANGUL SYLLABLE TYOH;Lo;0;L;;;;;N;;;;;
+D22C;HANGUL SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+D22D;HANGUL SYLLABLE TUG;Lo;0;L;;;;;N;;;;;
+D22E;HANGUL SYLLABLE TUGG;Lo;0;L;;;;;N;;;;;
+D22F;HANGUL SYLLABLE TUGS;Lo;0;L;;;;;N;;;;;
+D230;HANGUL SYLLABLE TUN;Lo;0;L;;;;;N;;;;;
+D231;HANGUL SYLLABLE TUNI;Lo;0;L;;;;;N;;;;;
+D232;HANGUL SYLLABLE TUNH;Lo;0;L;;;;;N;;;;;
+D233;HANGUL SYLLABLE TUD;Lo;0;L;;;;;N;;;;;
+D234;HANGUL SYLLABLE TUL;Lo;0;L;;;;;N;;;;;
+D235;HANGUL SYLLABLE TULG;Lo;0;L;;;;;N;;;;;
+D236;HANGUL SYLLABLE TULM;Lo;0;L;;;;;N;;;;;
+D237;HANGUL SYLLABLE TULB;Lo;0;L;;;;;N;;;;;
+D238;HANGUL SYLLABLE TULS;Lo;0;L;;;;;N;;;;;
+D239;HANGUL SYLLABLE TULT;Lo;0;L;;;;;N;;;;;
+D23A;HANGUL SYLLABLE TULP;Lo;0;L;;;;;N;;;;;
+D23B;HANGUL SYLLABLE TULH;Lo;0;L;;;;;N;;;;;
+D23C;HANGUL SYLLABLE TUM;Lo;0;L;;;;;N;;;;;
+D23D;HANGUL SYLLABLE TUB;Lo;0;L;;;;;N;;;;;
+D23E;HANGUL SYLLABLE TUBS;Lo;0;L;;;;;N;;;;;
+D23F;HANGUL SYLLABLE TUS;Lo;0;L;;;;;N;;;;;
+D240;HANGUL SYLLABLE TUSS;Lo;0;L;;;;;N;;;;;
+D241;HANGUL SYLLABLE TUNG;Lo;0;L;;;;;N;;;;;
+D242;HANGUL SYLLABLE TUJ;Lo;0;L;;;;;N;;;;;
+D243;HANGUL SYLLABLE TUC;Lo;0;L;;;;;N;;;;;
+D244;HANGUL SYLLABLE TUK;Lo;0;L;;;;;N;;;;;
+D245;HANGUL SYLLABLE TUT;Lo;0;L;;;;;N;;;;;
+D246;HANGUL SYLLABLE TUP;Lo;0;L;;;;;N;;;;;
+D247;HANGUL SYLLABLE TUH;Lo;0;L;;;;;N;;;;;
+D248;HANGUL SYLLABLE TWEO;Lo;0;L;;;;;N;;;;;
+D249;HANGUL SYLLABLE TWEOG;Lo;0;L;;;;;N;;;;;
+D24A;HANGUL SYLLABLE TWEOGG;Lo;0;L;;;;;N;;;;;
+D24B;HANGUL SYLLABLE TWEOGS;Lo;0;L;;;;;N;;;;;
+D24C;HANGUL SYLLABLE TWEON;Lo;0;L;;;;;N;;;;;
+D24D;HANGUL SYLLABLE TWEONI;Lo;0;L;;;;;N;;;;;
+D24E;HANGUL SYLLABLE TWEONH;Lo;0;L;;;;;N;;;;;
+D24F;HANGUL SYLLABLE TWEOD;Lo;0;L;;;;;N;;;;;
+D250;HANGUL SYLLABLE TWEOL;Lo;0;L;;;;;N;;;;;
+D251;HANGUL SYLLABLE TWEOLG;Lo;0;L;;;;;N;;;;;
+D252;HANGUL SYLLABLE TWEOLM;Lo;0;L;;;;;N;;;;;
+D253;HANGUL SYLLABLE TWEOLB;Lo;0;L;;;;;N;;;;;
+D254;HANGUL SYLLABLE TWEOLS;Lo;0;L;;;;;N;;;;;
+D255;HANGUL SYLLABLE TWEOLT;Lo;0;L;;;;;N;;;;;
+D256;HANGUL SYLLABLE TWEOLP;Lo;0;L;;;;;N;;;;;
+D257;HANGUL SYLLABLE TWEOLH;Lo;0;L;;;;;N;;;;;
+D258;HANGUL SYLLABLE TWEOM;Lo;0;L;;;;;N;;;;;
+D259;HANGUL SYLLABLE TWEOB;Lo;0;L;;;;;N;;;;;
+D25A;HANGUL SYLLABLE TWEOBS;Lo;0;L;;;;;N;;;;;
+D25B;HANGUL SYLLABLE TWEOS;Lo;0;L;;;;;N;;;;;
+D25C;HANGUL SYLLABLE TWEOSS;Lo;0;L;;;;;N;;;;;
+D25D;HANGUL SYLLABLE TWEONG;Lo;0;L;;;;;N;;;;;
+D25E;HANGUL SYLLABLE TWEOJ;Lo;0;L;;;;;N;;;;;
+D25F;HANGUL SYLLABLE TWEOC;Lo;0;L;;;;;N;;;;;
+D260;HANGUL SYLLABLE TWEOK;Lo;0;L;;;;;N;;;;;
+D261;HANGUL SYLLABLE TWEOT;Lo;0;L;;;;;N;;;;;
+D262;HANGUL SYLLABLE TWEOP;Lo;0;L;;;;;N;;;;;
+D263;HANGUL SYLLABLE TWEOH;Lo;0;L;;;;;N;;;;;
+D264;HANGUL SYLLABLE TWE;Lo;0;L;;;;;N;;;;;
+D265;HANGUL SYLLABLE TWEG;Lo;0;L;;;;;N;;;;;
+D266;HANGUL SYLLABLE TWEGG;Lo;0;L;;;;;N;;;;;
+D267;HANGUL SYLLABLE TWEGS;Lo;0;L;;;;;N;;;;;
+D268;HANGUL SYLLABLE TWEN;Lo;0;L;;;;;N;;;;;
+D269;HANGUL SYLLABLE TWENI;Lo;0;L;;;;;N;;;;;
+D26A;HANGUL SYLLABLE TWENH;Lo;0;L;;;;;N;;;;;
+D26B;HANGUL SYLLABLE TWED;Lo;0;L;;;;;N;;;;;
+D26C;HANGUL SYLLABLE TWEL;Lo;0;L;;;;;N;;;;;
+D26D;HANGUL SYLLABLE TWELG;Lo;0;L;;;;;N;;;;;
+D26E;HANGUL SYLLABLE TWELM;Lo;0;L;;;;;N;;;;;
+D26F;HANGUL SYLLABLE TWELB;Lo;0;L;;;;;N;;;;;
+D270;HANGUL SYLLABLE TWELS;Lo;0;L;;;;;N;;;;;
+D271;HANGUL SYLLABLE TWELT;Lo;0;L;;;;;N;;;;;
+D272;HANGUL SYLLABLE TWELP;Lo;0;L;;;;;N;;;;;
+D273;HANGUL SYLLABLE TWELH;Lo;0;L;;;;;N;;;;;
+D274;HANGUL SYLLABLE TWEM;Lo;0;L;;;;;N;;;;;
+D275;HANGUL SYLLABLE TWEB;Lo;0;L;;;;;N;;;;;
+D276;HANGUL SYLLABLE TWEBS;Lo;0;L;;;;;N;;;;;
+D277;HANGUL SYLLABLE TWES;Lo;0;L;;;;;N;;;;;
+D278;HANGUL SYLLABLE TWESS;Lo;0;L;;;;;N;;;;;
+D279;HANGUL SYLLABLE TWENG;Lo;0;L;;;;;N;;;;;
+D27A;HANGUL SYLLABLE TWEJ;Lo;0;L;;;;;N;;;;;
+D27B;HANGUL SYLLABLE TWEC;Lo;0;L;;;;;N;;;;;
+D27C;HANGUL SYLLABLE TWEK;Lo;0;L;;;;;N;;;;;
+D27D;HANGUL SYLLABLE TWET;Lo;0;L;;;;;N;;;;;
+D27E;HANGUL SYLLABLE TWEP;Lo;0;L;;;;;N;;;;;
+D27F;HANGUL SYLLABLE TWEH;Lo;0;L;;;;;N;;;;;
+D280;HANGUL SYLLABLE TWI;Lo;0;L;;;;;N;;;;;
+D281;HANGUL SYLLABLE TWIG;Lo;0;L;;;;;N;;;;;
+D282;HANGUL SYLLABLE TWIGG;Lo;0;L;;;;;N;;;;;
+D283;HANGUL SYLLABLE TWIGS;Lo;0;L;;;;;N;;;;;
+D284;HANGUL SYLLABLE TWIN;Lo;0;L;;;;;N;;;;;
+D285;HANGUL SYLLABLE TWINI;Lo;0;L;;;;;N;;;;;
+D286;HANGUL SYLLABLE TWINH;Lo;0;L;;;;;N;;;;;
+D287;HANGUL SYLLABLE TWID;Lo;0;L;;;;;N;;;;;
+D288;HANGUL SYLLABLE TWIL;Lo;0;L;;;;;N;;;;;
+D289;HANGUL SYLLABLE TWILG;Lo;0;L;;;;;N;;;;;
+D28A;HANGUL SYLLABLE TWILM;Lo;0;L;;;;;N;;;;;
+D28B;HANGUL SYLLABLE TWILB;Lo;0;L;;;;;N;;;;;
+D28C;HANGUL SYLLABLE TWILS;Lo;0;L;;;;;N;;;;;
+D28D;HANGUL SYLLABLE TWILT;Lo;0;L;;;;;N;;;;;
+D28E;HANGUL SYLLABLE TWILP;Lo;0;L;;;;;N;;;;;
+D28F;HANGUL SYLLABLE TWILH;Lo;0;L;;;;;N;;;;;
+D290;HANGUL SYLLABLE TWIM;Lo;0;L;;;;;N;;;;;
+D291;HANGUL SYLLABLE TWIB;Lo;0;L;;;;;N;;;;;
+D292;HANGUL SYLLABLE TWIBS;Lo;0;L;;;;;N;;;;;
+D293;HANGUL SYLLABLE TWIS;Lo;0;L;;;;;N;;;;;
+D294;HANGUL SYLLABLE TWISS;Lo;0;L;;;;;N;;;;;
+D295;HANGUL SYLLABLE TWING;Lo;0;L;;;;;N;;;;;
+D296;HANGUL SYLLABLE TWIJ;Lo;0;L;;;;;N;;;;;
+D297;HANGUL SYLLABLE TWIC;Lo;0;L;;;;;N;;;;;
+D298;HANGUL SYLLABLE TWIK;Lo;0;L;;;;;N;;;;;
+D299;HANGUL SYLLABLE TWIT;Lo;0;L;;;;;N;;;;;
+D29A;HANGUL SYLLABLE TWIP;Lo;0;L;;;;;N;;;;;
+D29B;HANGUL SYLLABLE TWIH;Lo;0;L;;;;;N;;;;;
+D29C;HANGUL SYLLABLE TYU;Lo;0;L;;;;;N;;;;;
+D29D;HANGUL SYLLABLE TYUG;Lo;0;L;;;;;N;;;;;
+D29E;HANGUL SYLLABLE TYUGG;Lo;0;L;;;;;N;;;;;
+D29F;HANGUL SYLLABLE TYUGS;Lo;0;L;;;;;N;;;;;
+D2A0;HANGUL SYLLABLE TYUN;Lo;0;L;;;;;N;;;;;
+D2A1;HANGUL SYLLABLE TYUNI;Lo;0;L;;;;;N;;;;;
+D2A2;HANGUL SYLLABLE TYUNH;Lo;0;L;;;;;N;;;;;
+D2A3;HANGUL SYLLABLE TYUD;Lo;0;L;;;;;N;;;;;
+D2A4;HANGUL SYLLABLE TYUL;Lo;0;L;;;;;N;;;;;
+D2A5;HANGUL SYLLABLE TYULG;Lo;0;L;;;;;N;;;;;
+D2A6;HANGUL SYLLABLE TYULM;Lo;0;L;;;;;N;;;;;
+D2A7;HANGUL SYLLABLE TYULB;Lo;0;L;;;;;N;;;;;
+D2A8;HANGUL SYLLABLE TYULS;Lo;0;L;;;;;N;;;;;
+D2A9;HANGUL SYLLABLE TYULT;Lo;0;L;;;;;N;;;;;
+D2AA;HANGUL SYLLABLE TYULP;Lo;0;L;;;;;N;;;;;
+D2AB;HANGUL SYLLABLE TYULH;Lo;0;L;;;;;N;;;;;
+D2AC;HANGUL SYLLABLE TYUM;Lo;0;L;;;;;N;;;;;
+D2AD;HANGUL SYLLABLE TYUB;Lo;0;L;;;;;N;;;;;
+D2AE;HANGUL SYLLABLE TYUBS;Lo;0;L;;;;;N;;;;;
+D2AF;HANGUL SYLLABLE TYUS;Lo;0;L;;;;;N;;;;;
+D2B0;HANGUL SYLLABLE TYUSS;Lo;0;L;;;;;N;;;;;
+D2B1;HANGUL SYLLABLE TYUNG;Lo;0;L;;;;;N;;;;;
+D2B2;HANGUL SYLLABLE TYUJ;Lo;0;L;;;;;N;;;;;
+D2B3;HANGUL SYLLABLE TYUC;Lo;0;L;;;;;N;;;;;
+D2B4;HANGUL SYLLABLE TYUK;Lo;0;L;;;;;N;;;;;
+D2B5;HANGUL SYLLABLE TYUT;Lo;0;L;;;;;N;;;;;
+D2B6;HANGUL SYLLABLE TYUP;Lo;0;L;;;;;N;;;;;
+D2B7;HANGUL SYLLABLE TYUH;Lo;0;L;;;;;N;;;;;
+D2B8;HANGUL SYLLABLE TEU;Lo;0;L;;;;;N;;;;;
+D2B9;HANGUL SYLLABLE TEUG;Lo;0;L;;;;;N;;;;;
+D2BA;HANGUL SYLLABLE TEUGG;Lo;0;L;;;;;N;;;;;
+D2BB;HANGUL SYLLABLE TEUGS;Lo;0;L;;;;;N;;;;;
+D2BC;HANGUL SYLLABLE TEUN;Lo;0;L;;;;;N;;;;;
+D2BD;HANGUL SYLLABLE TEUNI;Lo;0;L;;;;;N;;;;;
+D2BE;HANGUL SYLLABLE TEUNH;Lo;0;L;;;;;N;;;;;
+D2BF;HANGUL SYLLABLE TEUD;Lo;0;L;;;;;N;;;;;
+D2C0;HANGUL SYLLABLE TEUL;Lo;0;L;;;;;N;;;;;
+D2C1;HANGUL SYLLABLE TEULG;Lo;0;L;;;;;N;;;;;
+D2C2;HANGUL SYLLABLE TEULM;Lo;0;L;;;;;N;;;;;
+D2C3;HANGUL SYLLABLE TEULB;Lo;0;L;;;;;N;;;;;
+D2C4;HANGUL SYLLABLE TEULS;Lo;0;L;;;;;N;;;;;
+D2C5;HANGUL SYLLABLE TEULT;Lo;0;L;;;;;N;;;;;
+D2C6;HANGUL SYLLABLE TEULP;Lo;0;L;;;;;N;;;;;
+D2C7;HANGUL SYLLABLE TEULH;Lo;0;L;;;;;N;;;;;
+D2C8;HANGUL SYLLABLE TEUM;Lo;0;L;;;;;N;;;;;
+D2C9;HANGUL SYLLABLE TEUB;Lo;0;L;;;;;N;;;;;
+D2CA;HANGUL SYLLABLE TEUBS;Lo;0;L;;;;;N;;;;;
+D2CB;HANGUL SYLLABLE TEUS;Lo;0;L;;;;;N;;;;;
+D2CC;HANGUL SYLLABLE TEUSS;Lo;0;L;;;;;N;;;;;
+D2CD;HANGUL SYLLABLE TEUNG;Lo;0;L;;;;;N;;;;;
+D2CE;HANGUL SYLLABLE TEUJ;Lo;0;L;;;;;N;;;;;
+D2CF;HANGUL SYLLABLE TEUC;Lo;0;L;;;;;N;;;;;
+D2D0;HANGUL SYLLABLE TEUK;Lo;0;L;;;;;N;;;;;
+D2D1;HANGUL SYLLABLE TEUT;Lo;0;L;;;;;N;;;;;
+D2D2;HANGUL SYLLABLE TEUP;Lo;0;L;;;;;N;;;;;
+D2D3;HANGUL SYLLABLE TEUH;Lo;0;L;;;;;N;;;;;
+D2D4;HANGUL SYLLABLE TYI;Lo;0;L;;;;;N;;;;;
+D2D5;HANGUL SYLLABLE TYIG;Lo;0;L;;;;;N;;;;;
+D2D6;HANGUL SYLLABLE TYIGG;Lo;0;L;;;;;N;;;;;
+D2D7;HANGUL SYLLABLE TYIGS;Lo;0;L;;;;;N;;;;;
+D2D8;HANGUL SYLLABLE TYIN;Lo;0;L;;;;;N;;;;;
+D2D9;HANGUL SYLLABLE TYINI;Lo;0;L;;;;;N;;;;;
+D2DA;HANGUL SYLLABLE TYINH;Lo;0;L;;;;;N;;;;;
+D2DB;HANGUL SYLLABLE TYID;Lo;0;L;;;;;N;;;;;
+D2DC;HANGUL SYLLABLE TYIL;Lo;0;L;;;;;N;;;;;
+D2DD;HANGUL SYLLABLE TYILG;Lo;0;L;;;;;N;;;;;
+D2DE;HANGUL SYLLABLE TYILM;Lo;0;L;;;;;N;;;;;
+D2DF;HANGUL SYLLABLE TYILB;Lo;0;L;;;;;N;;;;;
+D2E0;HANGUL SYLLABLE TYILS;Lo;0;L;;;;;N;;;;;
+D2E1;HANGUL SYLLABLE TYILT;Lo;0;L;;;;;N;;;;;
+D2E2;HANGUL SYLLABLE TYILP;Lo;0;L;;;;;N;;;;;
+D2E3;HANGUL SYLLABLE TYILH;Lo;0;L;;;;;N;;;;;
+D2E4;HANGUL SYLLABLE TYIM;Lo;0;L;;;;;N;;;;;
+D2E5;HANGUL SYLLABLE TYIB;Lo;0;L;;;;;N;;;;;
+D2E6;HANGUL SYLLABLE TYIBS;Lo;0;L;;;;;N;;;;;
+D2E7;HANGUL SYLLABLE TYIS;Lo;0;L;;;;;N;;;;;
+D2E8;HANGUL SYLLABLE TYISS;Lo;0;L;;;;;N;;;;;
+D2E9;HANGUL SYLLABLE TYING;Lo;0;L;;;;;N;;;;;
+D2EA;HANGUL SYLLABLE TYIJ;Lo;0;L;;;;;N;;;;;
+D2EB;HANGUL SYLLABLE TYIC;Lo;0;L;;;;;N;;;;;
+D2EC;HANGUL SYLLABLE TYIK;Lo;0;L;;;;;N;;;;;
+D2ED;HANGUL SYLLABLE TYIT;Lo;0;L;;;;;N;;;;;
+D2EE;HANGUL SYLLABLE TYIP;Lo;0;L;;;;;N;;;;;
+D2EF;HANGUL SYLLABLE TYIH;Lo;0;L;;;;;N;;;;;
+D2F0;HANGUL SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+D2F1;HANGUL SYLLABLE TIG;Lo;0;L;;;;;N;;;;;
+D2F2;HANGUL SYLLABLE TIGG;Lo;0;L;;;;;N;;;;;
+D2F3;HANGUL SYLLABLE TIGS;Lo;0;L;;;;;N;;;;;
+D2F4;HANGUL SYLLABLE TIN;Lo;0;L;;;;;N;;;;;
+D2F5;HANGUL SYLLABLE TINI;Lo;0;L;;;;;N;;;;;
+D2F6;HANGUL SYLLABLE TINH;Lo;0;L;;;;;N;;;;;
+D2F7;HANGUL SYLLABLE TID;Lo;0;L;;;;;N;;;;;
+D2F8;HANGUL SYLLABLE TIL;Lo;0;L;;;;;N;;;;;
+D2F9;HANGUL SYLLABLE TILG;Lo;0;L;;;;;N;;;;;
+D2FA;HANGUL SYLLABLE TILM;Lo;0;L;;;;;N;;;;;
+D2FB;HANGUL SYLLABLE TILB;Lo;0;L;;;;;N;;;;;
+D2FC;HANGUL SYLLABLE TILS;Lo;0;L;;;;;N;;;;;
+D2FD;HANGUL SYLLABLE TILT;Lo;0;L;;;;;N;;;;;
+D2FE;HANGUL SYLLABLE TILP;Lo;0;L;;;;;N;;;;;
+D2FF;HANGUL SYLLABLE TILH;Lo;0;L;;;;;N;;;;;
+D300;HANGUL SYLLABLE TIM;Lo;0;L;;;;;N;;;;;
+D301;HANGUL SYLLABLE TIB;Lo;0;L;;;;;N;;;;;
+D302;HANGUL SYLLABLE TIBS;Lo;0;L;;;;;N;;;;;
+D303;HANGUL SYLLABLE TIS;Lo;0;L;;;;;N;;;;;
+D304;HANGUL SYLLABLE TISS;Lo;0;L;;;;;N;;;;;
+D305;HANGUL SYLLABLE TING;Lo;0;L;;;;;N;;;;;
+D306;HANGUL SYLLABLE TIJ;Lo;0;L;;;;;N;;;;;
+D307;HANGUL SYLLABLE TIC;Lo;0;L;;;;;N;;;;;
+D308;HANGUL SYLLABLE TIK;Lo;0;L;;;;;N;;;;;
+D309;HANGUL SYLLABLE TIT;Lo;0;L;;;;;N;;;;;
+D30A;HANGUL SYLLABLE TIP;Lo;0;L;;;;;N;;;;;
+D30B;HANGUL SYLLABLE TIH;Lo;0;L;;;;;N;;;;;
+D30C;HANGUL SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+D30D;HANGUL SYLLABLE PAG;Lo;0;L;;;;;N;;;;;
+D30E;HANGUL SYLLABLE PAGG;Lo;0;L;;;;;N;;;;;
+D30F;HANGUL SYLLABLE PAGS;Lo;0;L;;;;;N;;;;;
+D310;HANGUL SYLLABLE PAN;Lo;0;L;;;;;N;;;;;
+D311;HANGUL SYLLABLE PANI;Lo;0;L;;;;;N;;;;;
+D312;HANGUL SYLLABLE PANH;Lo;0;L;;;;;N;;;;;
+D313;HANGUL SYLLABLE PAD;Lo;0;L;;;;;N;;;;;
+D314;HANGUL SYLLABLE PAL;Lo;0;L;;;;;N;;;;;
+D315;HANGUL SYLLABLE PALG;Lo;0;L;;;;;N;;;;;
+D316;HANGUL SYLLABLE PALM;Lo;0;L;;;;;N;;;;;
+D317;HANGUL SYLLABLE PALB;Lo;0;L;;;;;N;;;;;
+D318;HANGUL SYLLABLE PALS;Lo;0;L;;;;;N;;;;;
+D319;HANGUL SYLLABLE PALT;Lo;0;L;;;;;N;;;;;
+D31A;HANGUL SYLLABLE PALP;Lo;0;L;;;;;N;;;;;
+D31B;HANGUL SYLLABLE PALH;Lo;0;L;;;;;N;;;;;
+D31C;HANGUL SYLLABLE PAM;Lo;0;L;;;;;N;;;;;
+D31D;HANGUL SYLLABLE PAB;Lo;0;L;;;;;N;;;;;
+D31E;HANGUL SYLLABLE PABS;Lo;0;L;;;;;N;;;;;
+D31F;HANGUL SYLLABLE PAS;Lo;0;L;;;;;N;;;;;
+D320;HANGUL SYLLABLE PASS;Lo;0;L;;;;;N;;;;;
+D321;HANGUL SYLLABLE PANG;Lo;0;L;;;;;N;;;;;
+D322;HANGUL SYLLABLE PAJ;Lo;0;L;;;;;N;;;;;
+D323;HANGUL SYLLABLE PAC;Lo;0;L;;;;;N;;;;;
+D324;HANGUL SYLLABLE PAK;Lo;0;L;;;;;N;;;;;
+D325;HANGUL SYLLABLE PAT;Lo;0;L;;;;;N;;;;;
+D326;HANGUL SYLLABLE PAP;Lo;0;L;;;;;N;;;;;
+D327;HANGUL SYLLABLE PAH;Lo;0;L;;;;;N;;;;;
+D328;HANGUL SYLLABLE PAE;Lo;0;L;;;;;N;;;;;
+D329;HANGUL SYLLABLE PAEG;Lo;0;L;;;;;N;;;;;
+D32A;HANGUL SYLLABLE PAEGG;Lo;0;L;;;;;N;;;;;
+D32B;HANGUL SYLLABLE PAEGS;Lo;0;L;;;;;N;;;;;
+D32C;HANGUL SYLLABLE PAEN;Lo;0;L;;;;;N;;;;;
+D32D;HANGUL SYLLABLE PAENI;Lo;0;L;;;;;N;;;;;
+D32E;HANGUL SYLLABLE PAENH;Lo;0;L;;;;;N;;;;;
+D32F;HANGUL SYLLABLE PAED;Lo;0;L;;;;;N;;;;;
+D330;HANGUL SYLLABLE PAEL;Lo;0;L;;;;;N;;;;;
+D331;HANGUL SYLLABLE PAELG;Lo;0;L;;;;;N;;;;;
+D332;HANGUL SYLLABLE PAELM;Lo;0;L;;;;;N;;;;;
+D333;HANGUL SYLLABLE PAELB;Lo;0;L;;;;;N;;;;;
+D334;HANGUL SYLLABLE PAELS;Lo;0;L;;;;;N;;;;;
+D335;HANGUL SYLLABLE PAELT;Lo;0;L;;;;;N;;;;;
+D336;HANGUL SYLLABLE PAELP;Lo;0;L;;;;;N;;;;;
+D337;HANGUL SYLLABLE PAELH;Lo;0;L;;;;;N;;;;;
+D338;HANGUL SYLLABLE PAEM;Lo;0;L;;;;;N;;;;;
+D339;HANGUL SYLLABLE PAEB;Lo;0;L;;;;;N;;;;;
+D33A;HANGUL SYLLABLE PAEBS;Lo;0;L;;;;;N;;;;;
+D33B;HANGUL SYLLABLE PAES;Lo;0;L;;;;;N;;;;;
+D33C;HANGUL SYLLABLE PAESS;Lo;0;L;;;;;N;;;;;
+D33D;HANGUL SYLLABLE PAENG;Lo;0;L;;;;;N;;;;;
+D33E;HANGUL SYLLABLE PAEJ;Lo;0;L;;;;;N;;;;;
+D33F;HANGUL SYLLABLE PAEC;Lo;0;L;;;;;N;;;;;
+D340;HANGUL SYLLABLE PAEK;Lo;0;L;;;;;N;;;;;
+D341;HANGUL SYLLABLE PAET;Lo;0;L;;;;;N;;;;;
+D342;HANGUL SYLLABLE PAEP;Lo;0;L;;;;;N;;;;;
+D343;HANGUL SYLLABLE PAEH;Lo;0;L;;;;;N;;;;;
+D344;HANGUL SYLLABLE PYA;Lo;0;L;;;;;N;;;;;
+D345;HANGUL SYLLABLE PYAG;Lo;0;L;;;;;N;;;;;
+D346;HANGUL SYLLABLE PYAGG;Lo;0;L;;;;;N;;;;;
+D347;HANGUL SYLLABLE PYAGS;Lo;0;L;;;;;N;;;;;
+D348;HANGUL SYLLABLE PYAN;Lo;0;L;;;;;N;;;;;
+D349;HANGUL SYLLABLE PYANI;Lo;0;L;;;;;N;;;;;
+D34A;HANGUL SYLLABLE PYANH;Lo;0;L;;;;;N;;;;;
+D34B;HANGUL SYLLABLE PYAD;Lo;0;L;;;;;N;;;;;
+D34C;HANGUL SYLLABLE PYAL;Lo;0;L;;;;;N;;;;;
+D34D;HANGUL SYLLABLE PYALG;Lo;0;L;;;;;N;;;;;
+D34E;HANGUL SYLLABLE PYALM;Lo;0;L;;;;;N;;;;;
+D34F;HANGUL SYLLABLE PYALB;Lo;0;L;;;;;N;;;;;
+D350;HANGUL SYLLABLE PYALS;Lo;0;L;;;;;N;;;;;
+D351;HANGUL SYLLABLE PYALT;Lo;0;L;;;;;N;;;;;
+D352;HANGUL SYLLABLE PYALP;Lo;0;L;;;;;N;;;;;
+D353;HANGUL SYLLABLE PYALH;Lo;0;L;;;;;N;;;;;
+D354;HANGUL SYLLABLE PYAM;Lo;0;L;;;;;N;;;;;
+D355;HANGUL SYLLABLE PYAB;Lo;0;L;;;;;N;;;;;
+D356;HANGUL SYLLABLE PYABS;Lo;0;L;;;;;N;;;;;
+D357;HANGUL SYLLABLE PYAS;Lo;0;L;;;;;N;;;;;
+D358;HANGUL SYLLABLE PYASS;Lo;0;L;;;;;N;;;;;
+D359;HANGUL SYLLABLE PYANG;Lo;0;L;;;;;N;;;;;
+D35A;HANGUL SYLLABLE PYAJ;Lo;0;L;;;;;N;;;;;
+D35B;HANGUL SYLLABLE PYAC;Lo;0;L;;;;;N;;;;;
+D35C;HANGUL SYLLABLE PYAK;Lo;0;L;;;;;N;;;;;
+D35D;HANGUL SYLLABLE PYAT;Lo;0;L;;;;;N;;;;;
+D35E;HANGUL SYLLABLE PYAP;Lo;0;L;;;;;N;;;;;
+D35F;HANGUL SYLLABLE PYAH;Lo;0;L;;;;;N;;;;;
+D360;HANGUL SYLLABLE PYAE;Lo;0;L;;;;;N;;;;;
+D361;HANGUL SYLLABLE PYAEG;Lo;0;L;;;;;N;;;;;
+D362;HANGUL SYLLABLE PYAEGG;Lo;0;L;;;;;N;;;;;
+D363;HANGUL SYLLABLE PYAEGS;Lo;0;L;;;;;N;;;;;
+D364;HANGUL SYLLABLE PYAEN;Lo;0;L;;;;;N;;;;;
+D365;HANGUL SYLLABLE PYAENI;Lo;0;L;;;;;N;;;;;
+D366;HANGUL SYLLABLE PYAENH;Lo;0;L;;;;;N;;;;;
+D367;HANGUL SYLLABLE PYAED;Lo;0;L;;;;;N;;;;;
+D368;HANGUL SYLLABLE PYAEL;Lo;0;L;;;;;N;;;;;
+D369;HANGUL SYLLABLE PYAELG;Lo;0;L;;;;;N;;;;;
+D36A;HANGUL SYLLABLE PYAELM;Lo;0;L;;;;;N;;;;;
+D36B;HANGUL SYLLABLE PYAELB;Lo;0;L;;;;;N;;;;;
+D36C;HANGUL SYLLABLE PYAELS;Lo;0;L;;;;;N;;;;;
+D36D;HANGUL SYLLABLE PYAELT;Lo;0;L;;;;;N;;;;;
+D36E;HANGUL SYLLABLE PYAELP;Lo;0;L;;;;;N;;;;;
+D36F;HANGUL SYLLABLE PYAELH;Lo;0;L;;;;;N;;;;;
+D370;HANGUL SYLLABLE PYAEM;Lo;0;L;;;;;N;;;;;
+D371;HANGUL SYLLABLE PYAEB;Lo;0;L;;;;;N;;;;;
+D372;HANGUL SYLLABLE PYAEBS;Lo;0;L;;;;;N;;;;;
+D373;HANGUL SYLLABLE PYAES;Lo;0;L;;;;;N;;;;;
+D374;HANGUL SYLLABLE PYAESS;Lo;0;L;;;;;N;;;;;
+D375;HANGUL SYLLABLE PYAENG;Lo;0;L;;;;;N;;;;;
+D376;HANGUL SYLLABLE PYAEJ;Lo;0;L;;;;;N;;;;;
+D377;HANGUL SYLLABLE PYAEC;Lo;0;L;;;;;N;;;;;
+D378;HANGUL SYLLABLE PYAEK;Lo;0;L;;;;;N;;;;;
+D379;HANGUL SYLLABLE PYAET;Lo;0;L;;;;;N;;;;;
+D37A;HANGUL SYLLABLE PYAEP;Lo;0;L;;;;;N;;;;;
+D37B;HANGUL SYLLABLE PYAEH;Lo;0;L;;;;;N;;;;;
+D37C;HANGUL SYLLABLE PEO;Lo;0;L;;;;;N;;;;;
+D37D;HANGUL SYLLABLE PEOG;Lo;0;L;;;;;N;;;;;
+D37E;HANGUL SYLLABLE PEOGG;Lo;0;L;;;;;N;;;;;
+D37F;HANGUL SYLLABLE PEOGS;Lo;0;L;;;;;N;;;;;
+D380;HANGUL SYLLABLE PEON;Lo;0;L;;;;;N;;;;;
+D381;HANGUL SYLLABLE PEONI;Lo;0;L;;;;;N;;;;;
+D382;HANGUL SYLLABLE PEONH;Lo;0;L;;;;;N;;;;;
+D383;HANGUL SYLLABLE PEOD;Lo;0;L;;;;;N;;;;;
+D384;HANGUL SYLLABLE PEOL;Lo;0;L;;;;;N;;;;;
+D385;HANGUL SYLLABLE PEOLG;Lo;0;L;;;;;N;;;;;
+D386;HANGUL SYLLABLE PEOLM;Lo;0;L;;;;;N;;;;;
+D387;HANGUL SYLLABLE PEOLB;Lo;0;L;;;;;N;;;;;
+D388;HANGUL SYLLABLE PEOLS;Lo;0;L;;;;;N;;;;;
+D389;HANGUL SYLLABLE PEOLT;Lo;0;L;;;;;N;;;;;
+D38A;HANGUL SYLLABLE PEOLP;Lo;0;L;;;;;N;;;;;
+D38B;HANGUL SYLLABLE PEOLH;Lo;0;L;;;;;N;;;;;
+D38C;HANGUL SYLLABLE PEOM;Lo;0;L;;;;;N;;;;;
+D38D;HANGUL SYLLABLE PEOB;Lo;0;L;;;;;N;;;;;
+D38E;HANGUL SYLLABLE PEOBS;Lo;0;L;;;;;N;;;;;
+D38F;HANGUL SYLLABLE PEOS;Lo;0;L;;;;;N;;;;;
+D390;HANGUL SYLLABLE PEOSS;Lo;0;L;;;;;N;;;;;
+D391;HANGUL SYLLABLE PEONG;Lo;0;L;;;;;N;;;;;
+D392;HANGUL SYLLABLE PEOJ;Lo;0;L;;;;;N;;;;;
+D393;HANGUL SYLLABLE PEOC;Lo;0;L;;;;;N;;;;;
+D394;HANGUL SYLLABLE PEOK;Lo;0;L;;;;;N;;;;;
+D395;HANGUL SYLLABLE PEOT;Lo;0;L;;;;;N;;;;;
+D396;HANGUL SYLLABLE PEOP;Lo;0;L;;;;;N;;;;;
+D397;HANGUL SYLLABLE PEOH;Lo;0;L;;;;;N;;;;;
+D398;HANGUL SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+D399;HANGUL SYLLABLE PEG;Lo;0;L;;;;;N;;;;;
+D39A;HANGUL SYLLABLE PEGG;Lo;0;L;;;;;N;;;;;
+D39B;HANGUL SYLLABLE PEGS;Lo;0;L;;;;;N;;;;;
+D39C;HANGUL SYLLABLE PEN;Lo;0;L;;;;;N;;;;;
+D39D;HANGUL SYLLABLE PENI;Lo;0;L;;;;;N;;;;;
+D39E;HANGUL SYLLABLE PENH;Lo;0;L;;;;;N;;;;;
+D39F;HANGUL SYLLABLE PED;Lo;0;L;;;;;N;;;;;
+D3A0;HANGUL SYLLABLE PEL;Lo;0;L;;;;;N;;;;;
+D3A1;HANGUL SYLLABLE PELG;Lo;0;L;;;;;N;;;;;
+D3A2;HANGUL SYLLABLE PELM;Lo;0;L;;;;;N;;;;;
+D3A3;HANGUL SYLLABLE PELB;Lo;0;L;;;;;N;;;;;
+D3A4;HANGUL SYLLABLE PELS;Lo;0;L;;;;;N;;;;;
+D3A5;HANGUL SYLLABLE PELT;Lo;0;L;;;;;N;;;;;
+D3A6;HANGUL SYLLABLE PELP;Lo;0;L;;;;;N;;;;;
+D3A7;HANGUL SYLLABLE PELH;Lo;0;L;;;;;N;;;;;
+D3A8;HANGUL SYLLABLE PEM;Lo;0;L;;;;;N;;;;;
+D3A9;HANGUL SYLLABLE PEB;Lo;0;L;;;;;N;;;;;
+D3AA;HANGUL SYLLABLE PEBS;Lo;0;L;;;;;N;;;;;
+D3AB;HANGUL SYLLABLE PES;Lo;0;L;;;;;N;;;;;
+D3AC;HANGUL SYLLABLE PESS;Lo;0;L;;;;;N;;;;;
+D3AD;HANGUL SYLLABLE PENG;Lo;0;L;;;;;N;;;;;
+D3AE;HANGUL SYLLABLE PEJ;Lo;0;L;;;;;N;;;;;
+D3AF;HANGUL SYLLABLE PEC;Lo;0;L;;;;;N;;;;;
+D3B0;HANGUL SYLLABLE PEK;Lo;0;L;;;;;N;;;;;
+D3B1;HANGUL SYLLABLE PET;Lo;0;L;;;;;N;;;;;
+D3B2;HANGUL SYLLABLE PEP;Lo;0;L;;;;;N;;;;;
+D3B3;HANGUL SYLLABLE PEH;Lo;0;L;;;;;N;;;;;
+D3B4;HANGUL SYLLABLE PYEO;Lo;0;L;;;;;N;;;;;
+D3B5;HANGUL SYLLABLE PYEOG;Lo;0;L;;;;;N;;;;;
+D3B6;HANGUL SYLLABLE PYEOGG;Lo;0;L;;;;;N;;;;;
+D3B7;HANGUL SYLLABLE PYEOGS;Lo;0;L;;;;;N;;;;;
+D3B8;HANGUL SYLLABLE PYEON;Lo;0;L;;;;;N;;;;;
+D3B9;HANGUL SYLLABLE PYEONI;Lo;0;L;;;;;N;;;;;
+D3BA;HANGUL SYLLABLE PYEONH;Lo;0;L;;;;;N;;;;;
+D3BB;HANGUL SYLLABLE PYEOD;Lo;0;L;;;;;N;;;;;
+D3BC;HANGUL SYLLABLE PYEOL;Lo;0;L;;;;;N;;;;;
+D3BD;HANGUL SYLLABLE PYEOLG;Lo;0;L;;;;;N;;;;;
+D3BE;HANGUL SYLLABLE PYEOLM;Lo;0;L;;;;;N;;;;;
+D3BF;HANGUL SYLLABLE PYEOLB;Lo;0;L;;;;;N;;;;;
+D3C0;HANGUL SYLLABLE PYEOLS;Lo;0;L;;;;;N;;;;;
+D3C1;HANGUL SYLLABLE PYEOLT;Lo;0;L;;;;;N;;;;;
+D3C2;HANGUL SYLLABLE PYEOLP;Lo;0;L;;;;;N;;;;;
+D3C3;HANGUL SYLLABLE PYEOLH;Lo;0;L;;;;;N;;;;;
+D3C4;HANGUL SYLLABLE PYEOM;Lo;0;L;;;;;N;;;;;
+D3C5;HANGUL SYLLABLE PYEOB;Lo;0;L;;;;;N;;;;;
+D3C6;HANGUL SYLLABLE PYEOBS;Lo;0;L;;;;;N;;;;;
+D3C7;HANGUL SYLLABLE PYEOS;Lo;0;L;;;;;N;;;;;
+D3C8;HANGUL SYLLABLE PYEOSS;Lo;0;L;;;;;N;;;;;
+D3C9;HANGUL SYLLABLE PYEONG;Lo;0;L;;;;;N;;;;;
+D3CA;HANGUL SYLLABLE PYEOJ;Lo;0;L;;;;;N;;;;;
+D3CB;HANGUL SYLLABLE PYEOC;Lo;0;L;;;;;N;;;;;
+D3CC;HANGUL SYLLABLE PYEOK;Lo;0;L;;;;;N;;;;;
+D3CD;HANGUL SYLLABLE PYEOT;Lo;0;L;;;;;N;;;;;
+D3CE;HANGUL SYLLABLE PYEOP;Lo;0;L;;;;;N;;;;;
+D3CF;HANGUL SYLLABLE PYEOH;Lo;0;L;;;;;N;;;;;
+D3D0;HANGUL SYLLABLE PYE;Lo;0;L;;;;;N;;;;;
+D3D1;HANGUL SYLLABLE PYEG;Lo;0;L;;;;;N;;;;;
+D3D2;HANGUL SYLLABLE PYEGG;Lo;0;L;;;;;N;;;;;
+D3D3;HANGUL SYLLABLE PYEGS;Lo;0;L;;;;;N;;;;;
+D3D4;HANGUL SYLLABLE PYEN;Lo;0;L;;;;;N;;;;;
+D3D5;HANGUL SYLLABLE PYENI;Lo;0;L;;;;;N;;;;;
+D3D6;HANGUL SYLLABLE PYENH;Lo;0;L;;;;;N;;;;;
+D3D7;HANGUL SYLLABLE PYED;Lo;0;L;;;;;N;;;;;
+D3D8;HANGUL SYLLABLE PYEL;Lo;0;L;;;;;N;;;;;
+D3D9;HANGUL SYLLABLE PYELG;Lo;0;L;;;;;N;;;;;
+D3DA;HANGUL SYLLABLE PYELM;Lo;0;L;;;;;N;;;;;
+D3DB;HANGUL SYLLABLE PYELB;Lo;0;L;;;;;N;;;;;
+D3DC;HANGUL SYLLABLE PYELS;Lo;0;L;;;;;N;;;;;
+D3DD;HANGUL SYLLABLE PYELT;Lo;0;L;;;;;N;;;;;
+D3DE;HANGUL SYLLABLE PYELP;Lo;0;L;;;;;N;;;;;
+D3DF;HANGUL SYLLABLE PYELH;Lo;0;L;;;;;N;;;;;
+D3E0;HANGUL SYLLABLE PYEM;Lo;0;L;;;;;N;;;;;
+D3E1;HANGUL SYLLABLE PYEB;Lo;0;L;;;;;N;;;;;
+D3E2;HANGUL SYLLABLE PYEBS;Lo;0;L;;;;;N;;;;;
+D3E3;HANGUL SYLLABLE PYES;Lo;0;L;;;;;N;;;;;
+D3E4;HANGUL SYLLABLE PYESS;Lo;0;L;;;;;N;;;;;
+D3E5;HANGUL SYLLABLE PYENG;Lo;0;L;;;;;N;;;;;
+D3E6;HANGUL SYLLABLE PYEJ;Lo;0;L;;;;;N;;;;;
+D3E7;HANGUL SYLLABLE PYEC;Lo;0;L;;;;;N;;;;;
+D3E8;HANGUL SYLLABLE PYEK;Lo;0;L;;;;;N;;;;;
+D3E9;HANGUL SYLLABLE PYET;Lo;0;L;;;;;N;;;;;
+D3EA;HANGUL SYLLABLE PYEP;Lo;0;L;;;;;N;;;;;
+D3EB;HANGUL SYLLABLE PYEH;Lo;0;L;;;;;N;;;;;
+D3EC;HANGUL SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+D3ED;HANGUL SYLLABLE POG;Lo;0;L;;;;;N;;;;;
+D3EE;HANGUL SYLLABLE POGG;Lo;0;L;;;;;N;;;;;
+D3EF;HANGUL SYLLABLE POGS;Lo;0;L;;;;;N;;;;;
+D3F0;HANGUL SYLLABLE PON;Lo;0;L;;;;;N;;;;;
+D3F1;HANGUL SYLLABLE PONI;Lo;0;L;;;;;N;;;;;
+D3F2;HANGUL SYLLABLE PONH;Lo;0;L;;;;;N;;;;;
+D3F3;HANGUL SYLLABLE POD;Lo;0;L;;;;;N;;;;;
+D3F4;HANGUL SYLLABLE POL;Lo;0;L;;;;;N;;;;;
+D3F5;HANGUL SYLLABLE POLG;Lo;0;L;;;;;N;;;;;
+D3F6;HANGUL SYLLABLE POLM;Lo;0;L;;;;;N;;;;;
+D3F7;HANGUL SYLLABLE POLB;Lo;0;L;;;;;N;;;;;
+D3F8;HANGUL SYLLABLE POLS;Lo;0;L;;;;;N;;;;;
+D3F9;HANGUL SYLLABLE POLT;Lo;0;L;;;;;N;;;;;
+D3FA;HANGUL SYLLABLE POLP;Lo;0;L;;;;;N;;;;;
+D3FB;HANGUL SYLLABLE POLH;Lo;0;L;;;;;N;;;;;
+D3FC;HANGUL SYLLABLE POM;Lo;0;L;;;;;N;;;;;
+D3FD;HANGUL SYLLABLE POB;Lo;0;L;;;;;N;;;;;
+D3FE;HANGUL SYLLABLE POBS;Lo;0;L;;;;;N;;;;;
+D3FF;HANGUL SYLLABLE POS;Lo;0;L;;;;;N;;;;;
+D400;HANGUL SYLLABLE POSS;Lo;0;L;;;;;N;;;;;
+D401;HANGUL SYLLABLE PONG;Lo;0;L;;;;;N;;;;;
+D402;HANGUL SYLLABLE POJ;Lo;0;L;;;;;N;;;;;
+D403;HANGUL SYLLABLE POC;Lo;0;L;;;;;N;;;;;
+D404;HANGUL SYLLABLE POK;Lo;0;L;;;;;N;;;;;
+D405;HANGUL SYLLABLE POT;Lo;0;L;;;;;N;;;;;
+D406;HANGUL SYLLABLE POP;Lo;0;L;;;;;N;;;;;
+D407;HANGUL SYLLABLE POH;Lo;0;L;;;;;N;;;;;
+D408;HANGUL SYLLABLE PWA;Lo;0;L;;;;;N;;;;;
+D409;HANGUL SYLLABLE PWAG;Lo;0;L;;;;;N;;;;;
+D40A;HANGUL SYLLABLE PWAGG;Lo;0;L;;;;;N;;;;;
+D40B;HANGUL SYLLABLE PWAGS;Lo;0;L;;;;;N;;;;;
+D40C;HANGUL SYLLABLE PWAN;Lo;0;L;;;;;N;;;;;
+D40D;HANGUL SYLLABLE PWANI;Lo;0;L;;;;;N;;;;;
+D40E;HANGUL SYLLABLE PWANH;Lo;0;L;;;;;N;;;;;
+D40F;HANGUL SYLLABLE PWAD;Lo;0;L;;;;;N;;;;;
+D410;HANGUL SYLLABLE PWAL;Lo;0;L;;;;;N;;;;;
+D411;HANGUL SYLLABLE PWALG;Lo;0;L;;;;;N;;;;;
+D412;HANGUL SYLLABLE PWALM;Lo;0;L;;;;;N;;;;;
+D413;HANGUL SYLLABLE PWALB;Lo;0;L;;;;;N;;;;;
+D414;HANGUL SYLLABLE PWALS;Lo;0;L;;;;;N;;;;;
+D415;HANGUL SYLLABLE PWALT;Lo;0;L;;;;;N;;;;;
+D416;HANGUL SYLLABLE PWALP;Lo;0;L;;;;;N;;;;;
+D417;HANGUL SYLLABLE PWALH;Lo;0;L;;;;;N;;;;;
+D418;HANGUL SYLLABLE PWAM;Lo;0;L;;;;;N;;;;;
+D419;HANGUL SYLLABLE PWAB;Lo;0;L;;;;;N;;;;;
+D41A;HANGUL SYLLABLE PWABS;Lo;0;L;;;;;N;;;;;
+D41B;HANGUL SYLLABLE PWAS;Lo;0;L;;;;;N;;;;;
+D41C;HANGUL SYLLABLE PWASS;Lo;0;L;;;;;N;;;;;
+D41D;HANGUL SYLLABLE PWANG;Lo;0;L;;;;;N;;;;;
+D41E;HANGUL SYLLABLE PWAJ;Lo;0;L;;;;;N;;;;;
+D41F;HANGUL SYLLABLE PWAC;Lo;0;L;;;;;N;;;;;
+D420;HANGUL SYLLABLE PWAK;Lo;0;L;;;;;N;;;;;
+D421;HANGUL SYLLABLE PWAT;Lo;0;L;;;;;N;;;;;
+D422;HANGUL SYLLABLE PWAP;Lo;0;L;;;;;N;;;;;
+D423;HANGUL SYLLABLE PWAH;Lo;0;L;;;;;N;;;;;
+D424;HANGUL SYLLABLE PWAE;Lo;0;L;;;;;N;;;;;
+D425;HANGUL SYLLABLE PWAEG;Lo;0;L;;;;;N;;;;;
+D426;HANGUL SYLLABLE PWAEGG;Lo;0;L;;;;;N;;;;;
+D427;HANGUL SYLLABLE PWAEGS;Lo;0;L;;;;;N;;;;;
+D428;HANGUL SYLLABLE PWAEN;Lo;0;L;;;;;N;;;;;
+D429;HANGUL SYLLABLE PWAENI;Lo;0;L;;;;;N;;;;;
+D42A;HANGUL SYLLABLE PWAENH;Lo;0;L;;;;;N;;;;;
+D42B;HANGUL SYLLABLE PWAED;Lo;0;L;;;;;N;;;;;
+D42C;HANGUL SYLLABLE PWAEL;Lo;0;L;;;;;N;;;;;
+D42D;HANGUL SYLLABLE PWAELG;Lo;0;L;;;;;N;;;;;
+D42E;HANGUL SYLLABLE PWAELM;Lo;0;L;;;;;N;;;;;
+D42F;HANGUL SYLLABLE PWAELB;Lo;0;L;;;;;N;;;;;
+D430;HANGUL SYLLABLE PWAELS;Lo;0;L;;;;;N;;;;;
+D431;HANGUL SYLLABLE PWAELT;Lo;0;L;;;;;N;;;;;
+D432;HANGUL SYLLABLE PWAELP;Lo;0;L;;;;;N;;;;;
+D433;HANGUL SYLLABLE PWAELH;Lo;0;L;;;;;N;;;;;
+D434;HANGUL SYLLABLE PWAEM;Lo;0;L;;;;;N;;;;;
+D435;HANGUL SYLLABLE PWAEB;Lo;0;L;;;;;N;;;;;
+D436;HANGUL SYLLABLE PWAEBS;Lo;0;L;;;;;N;;;;;
+D437;HANGUL SYLLABLE PWAES;Lo;0;L;;;;;N;;;;;
+D438;HANGUL SYLLABLE PWAESS;Lo;0;L;;;;;N;;;;;
+D439;HANGUL SYLLABLE PWAENG;Lo;0;L;;;;;N;;;;;
+D43A;HANGUL SYLLABLE PWAEJ;Lo;0;L;;;;;N;;;;;
+D43B;HANGUL SYLLABLE PWAEC;Lo;0;L;;;;;N;;;;;
+D43C;HANGUL SYLLABLE PWAEK;Lo;0;L;;;;;N;;;;;
+D43D;HANGUL SYLLABLE PWAET;Lo;0;L;;;;;N;;;;;
+D43E;HANGUL SYLLABLE PWAEP;Lo;0;L;;;;;N;;;;;
+D43F;HANGUL SYLLABLE PWAEH;Lo;0;L;;;;;N;;;;;
+D440;HANGUL SYLLABLE POE;Lo;0;L;;;;;N;;;;;
+D441;HANGUL SYLLABLE POEG;Lo;0;L;;;;;N;;;;;
+D442;HANGUL SYLLABLE POEGG;Lo;0;L;;;;;N;;;;;
+D443;HANGUL SYLLABLE POEGS;Lo;0;L;;;;;N;;;;;
+D444;HANGUL SYLLABLE POEN;Lo;0;L;;;;;N;;;;;
+D445;HANGUL SYLLABLE POENI;Lo;0;L;;;;;N;;;;;
+D446;HANGUL SYLLABLE POENH;Lo;0;L;;;;;N;;;;;
+D447;HANGUL SYLLABLE POED;Lo;0;L;;;;;N;;;;;
+D448;HANGUL SYLLABLE POEL;Lo;0;L;;;;;N;;;;;
+D449;HANGUL SYLLABLE POELG;Lo;0;L;;;;;N;;;;;
+D44A;HANGUL SYLLABLE POELM;Lo;0;L;;;;;N;;;;;
+D44B;HANGUL SYLLABLE POELB;Lo;0;L;;;;;N;;;;;
+D44C;HANGUL SYLLABLE POELS;Lo;0;L;;;;;N;;;;;
+D44D;HANGUL SYLLABLE POELT;Lo;0;L;;;;;N;;;;;
+D44E;HANGUL SYLLABLE POELP;Lo;0;L;;;;;N;;;;;
+D44F;HANGUL SYLLABLE POELH;Lo;0;L;;;;;N;;;;;
+D450;HANGUL SYLLABLE POEM;Lo;0;L;;;;;N;;;;;
+D451;HANGUL SYLLABLE POEB;Lo;0;L;;;;;N;;;;;
+D452;HANGUL SYLLABLE POEBS;Lo;0;L;;;;;N;;;;;
+D453;HANGUL SYLLABLE POES;Lo;0;L;;;;;N;;;;;
+D454;HANGUL SYLLABLE POESS;Lo;0;L;;;;;N;;;;;
+D455;HANGUL SYLLABLE POENG;Lo;0;L;;;;;N;;;;;
+D456;HANGUL SYLLABLE POEJ;Lo;0;L;;;;;N;;;;;
+D457;HANGUL SYLLABLE POEC;Lo;0;L;;;;;N;;;;;
+D458;HANGUL SYLLABLE POEK;Lo;0;L;;;;;N;;;;;
+D459;HANGUL SYLLABLE POET;Lo;0;L;;;;;N;;;;;
+D45A;HANGUL SYLLABLE POEP;Lo;0;L;;;;;N;;;;;
+D45B;HANGUL SYLLABLE POEH;Lo;0;L;;;;;N;;;;;
+D45C;HANGUL SYLLABLE PYO;Lo;0;L;;;;;N;;;;;
+D45D;HANGUL SYLLABLE PYOG;Lo;0;L;;;;;N;;;;;
+D45E;HANGUL SYLLABLE PYOGG;Lo;0;L;;;;;N;;;;;
+D45F;HANGUL SYLLABLE PYOGS;Lo;0;L;;;;;N;;;;;
+D460;HANGUL SYLLABLE PYON;Lo;0;L;;;;;N;;;;;
+D461;HANGUL SYLLABLE PYONI;Lo;0;L;;;;;N;;;;;
+D462;HANGUL SYLLABLE PYONH;Lo;0;L;;;;;N;;;;;
+D463;HANGUL SYLLABLE PYOD;Lo;0;L;;;;;N;;;;;
+D464;HANGUL SYLLABLE PYOL;Lo;0;L;;;;;N;;;;;
+D465;HANGUL SYLLABLE PYOLG;Lo;0;L;;;;;N;;;;;
+D466;HANGUL SYLLABLE PYOLM;Lo;0;L;;;;;N;;;;;
+D467;HANGUL SYLLABLE PYOLB;Lo;0;L;;;;;N;;;;;
+D468;HANGUL SYLLABLE PYOLS;Lo;0;L;;;;;N;;;;;
+D469;HANGUL SYLLABLE PYOLT;Lo;0;L;;;;;N;;;;;
+D46A;HANGUL SYLLABLE PYOLP;Lo;0;L;;;;;N;;;;;
+D46B;HANGUL SYLLABLE PYOLH;Lo;0;L;;;;;N;;;;;
+D46C;HANGUL SYLLABLE PYOM;Lo;0;L;;;;;N;;;;;
+D46D;HANGUL SYLLABLE PYOB;Lo;0;L;;;;;N;;;;;
+D46E;HANGUL SYLLABLE PYOBS;Lo;0;L;;;;;N;;;;;
+D46F;HANGUL SYLLABLE PYOS;Lo;0;L;;;;;N;;;;;
+D470;HANGUL SYLLABLE PYOSS;Lo;0;L;;;;;N;;;;;
+D471;HANGUL SYLLABLE PYONG;Lo;0;L;;;;;N;;;;;
+D472;HANGUL SYLLABLE PYOJ;Lo;0;L;;;;;N;;;;;
+D473;HANGUL SYLLABLE PYOC;Lo;0;L;;;;;N;;;;;
+D474;HANGUL SYLLABLE PYOK;Lo;0;L;;;;;N;;;;;
+D475;HANGUL SYLLABLE PYOT;Lo;0;L;;;;;N;;;;;
+D476;HANGUL SYLLABLE PYOP;Lo;0;L;;;;;N;;;;;
+D477;HANGUL SYLLABLE PYOH;Lo;0;L;;;;;N;;;;;
+D478;HANGUL SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+D479;HANGUL SYLLABLE PUG;Lo;0;L;;;;;N;;;;;
+D47A;HANGUL SYLLABLE PUGG;Lo;0;L;;;;;N;;;;;
+D47B;HANGUL SYLLABLE PUGS;Lo;0;L;;;;;N;;;;;
+D47C;HANGUL SYLLABLE PUN;Lo;0;L;;;;;N;;;;;
+D47D;HANGUL SYLLABLE PUNI;Lo;0;L;;;;;N;;;;;
+D47E;HANGUL SYLLABLE PUNH;Lo;0;L;;;;;N;;;;;
+D47F;HANGUL SYLLABLE PUD;Lo;0;L;;;;;N;;;;;
+D480;HANGUL SYLLABLE PUL;Lo;0;L;;;;;N;;;;;
+D481;HANGUL SYLLABLE PULG;Lo;0;L;;;;;N;;;;;
+D482;HANGUL SYLLABLE PULM;Lo;0;L;;;;;N;;;;;
+D483;HANGUL SYLLABLE PULB;Lo;0;L;;;;;N;;;;;
+D484;HANGUL SYLLABLE PULS;Lo;0;L;;;;;N;;;;;
+D485;HANGUL SYLLABLE PULT;Lo;0;L;;;;;N;;;;;
+D486;HANGUL SYLLABLE PULP;Lo;0;L;;;;;N;;;;;
+D487;HANGUL SYLLABLE PULH;Lo;0;L;;;;;N;;;;;
+D488;HANGUL SYLLABLE PUM;Lo;0;L;;;;;N;;;;;
+D489;HANGUL SYLLABLE PUB;Lo;0;L;;;;;N;;;;;
+D48A;HANGUL SYLLABLE PUBS;Lo;0;L;;;;;N;;;;;
+D48B;HANGUL SYLLABLE PUS;Lo;0;L;;;;;N;;;;;
+D48C;HANGUL SYLLABLE PUSS;Lo;0;L;;;;;N;;;;;
+D48D;HANGUL SYLLABLE PUNG;Lo;0;L;;;;;N;;;;;
+D48E;HANGUL SYLLABLE PUJ;Lo;0;L;;;;;N;;;;;
+D48F;HANGUL SYLLABLE PUC;Lo;0;L;;;;;N;;;;;
+D490;HANGUL SYLLABLE PUK;Lo;0;L;;;;;N;;;;;
+D491;HANGUL SYLLABLE PUT;Lo;0;L;;;;;N;;;;;
+D492;HANGUL SYLLABLE PUP;Lo;0;L;;;;;N;;;;;
+D493;HANGUL SYLLABLE PUH;Lo;0;L;;;;;N;;;;;
+D494;HANGUL SYLLABLE PWEO;Lo;0;L;;;;;N;;;;;
+D495;HANGUL SYLLABLE PWEOG;Lo;0;L;;;;;N;;;;;
+D496;HANGUL SYLLABLE PWEOGG;Lo;0;L;;;;;N;;;;;
+D497;HANGUL SYLLABLE PWEOGS;Lo;0;L;;;;;N;;;;;
+D498;HANGUL SYLLABLE PWEON;Lo;0;L;;;;;N;;;;;
+D499;HANGUL SYLLABLE PWEONI;Lo;0;L;;;;;N;;;;;
+D49A;HANGUL SYLLABLE PWEONH;Lo;0;L;;;;;N;;;;;
+D49B;HANGUL SYLLABLE PWEOD;Lo;0;L;;;;;N;;;;;
+D49C;HANGUL SYLLABLE PWEOL;Lo;0;L;;;;;N;;;;;
+D49D;HANGUL SYLLABLE PWEOLG;Lo;0;L;;;;;N;;;;;
+D49E;HANGUL SYLLABLE PWEOLM;Lo;0;L;;;;;N;;;;;
+D49F;HANGUL SYLLABLE PWEOLB;Lo;0;L;;;;;N;;;;;
+D4A0;HANGUL SYLLABLE PWEOLS;Lo;0;L;;;;;N;;;;;
+D4A1;HANGUL SYLLABLE PWEOLT;Lo;0;L;;;;;N;;;;;
+D4A2;HANGUL SYLLABLE PWEOLP;Lo;0;L;;;;;N;;;;;
+D4A3;HANGUL SYLLABLE PWEOLH;Lo;0;L;;;;;N;;;;;
+D4A4;HANGUL SYLLABLE PWEOM;Lo;0;L;;;;;N;;;;;
+D4A5;HANGUL SYLLABLE PWEOB;Lo;0;L;;;;;N;;;;;
+D4A6;HANGUL SYLLABLE PWEOBS;Lo;0;L;;;;;N;;;;;
+D4A7;HANGUL SYLLABLE PWEOS;Lo;0;L;;;;;N;;;;;
+D4A8;HANGUL SYLLABLE PWEOSS;Lo;0;L;;;;;N;;;;;
+D4A9;HANGUL SYLLABLE PWEONG;Lo;0;L;;;;;N;;;;;
+D4AA;HANGUL SYLLABLE PWEOJ;Lo;0;L;;;;;N;;;;;
+D4AB;HANGUL SYLLABLE PWEOC;Lo;0;L;;;;;N;;;;;
+D4AC;HANGUL SYLLABLE PWEOK;Lo;0;L;;;;;N;;;;;
+D4AD;HANGUL SYLLABLE PWEOT;Lo;0;L;;;;;N;;;;;
+D4AE;HANGUL SYLLABLE PWEOP;Lo;0;L;;;;;N;;;;;
+D4AF;HANGUL SYLLABLE PWEOH;Lo;0;L;;;;;N;;;;;
+D4B0;HANGUL SYLLABLE PWE;Lo;0;L;;;;;N;;;;;
+D4B1;HANGUL SYLLABLE PWEG;Lo;0;L;;;;;N;;;;;
+D4B2;HANGUL SYLLABLE PWEGG;Lo;0;L;;;;;N;;;;;
+D4B3;HANGUL SYLLABLE PWEGS;Lo;0;L;;;;;N;;;;;
+D4B4;HANGUL SYLLABLE PWEN;Lo;0;L;;;;;N;;;;;
+D4B5;HANGUL SYLLABLE PWENI;Lo;0;L;;;;;N;;;;;
+D4B6;HANGUL SYLLABLE PWENH;Lo;0;L;;;;;N;;;;;
+D4B7;HANGUL SYLLABLE PWED;Lo;0;L;;;;;N;;;;;
+D4B8;HANGUL SYLLABLE PWEL;Lo;0;L;;;;;N;;;;;
+D4B9;HANGUL SYLLABLE PWELG;Lo;0;L;;;;;N;;;;;
+D4BA;HANGUL SYLLABLE PWELM;Lo;0;L;;;;;N;;;;;
+D4BB;HANGUL SYLLABLE PWELB;Lo;0;L;;;;;N;;;;;
+D4BC;HANGUL SYLLABLE PWELS;Lo;0;L;;;;;N;;;;;
+D4BD;HANGUL SYLLABLE PWELT;Lo;0;L;;;;;N;;;;;
+D4BE;HANGUL SYLLABLE PWELP;Lo;0;L;;;;;N;;;;;
+D4BF;HANGUL SYLLABLE PWELH;Lo;0;L;;;;;N;;;;;
+D4C0;HANGUL SYLLABLE PWEM;Lo;0;L;;;;;N;;;;;
+D4C1;HANGUL SYLLABLE PWEB;Lo;0;L;;;;;N;;;;;
+D4C2;HANGUL SYLLABLE PWEBS;Lo;0;L;;;;;N;;;;;
+D4C3;HANGUL SYLLABLE PWES;Lo;0;L;;;;;N;;;;;
+D4C4;HANGUL SYLLABLE PWESS;Lo;0;L;;;;;N;;;;;
+D4C5;HANGUL SYLLABLE PWENG;Lo;0;L;;;;;N;;;;;
+D4C6;HANGUL SYLLABLE PWEJ;Lo;0;L;;;;;N;;;;;
+D4C7;HANGUL SYLLABLE PWEC;Lo;0;L;;;;;N;;;;;
+D4C8;HANGUL SYLLABLE PWEK;Lo;0;L;;;;;N;;;;;
+D4C9;HANGUL SYLLABLE PWET;Lo;0;L;;;;;N;;;;;
+D4CA;HANGUL SYLLABLE PWEP;Lo;0;L;;;;;N;;;;;
+D4CB;HANGUL SYLLABLE PWEH;Lo;0;L;;;;;N;;;;;
+D4CC;HANGUL SYLLABLE PWI;Lo;0;L;;;;;N;;;;;
+D4CD;HANGUL SYLLABLE PWIG;Lo;0;L;;;;;N;;;;;
+D4CE;HANGUL SYLLABLE PWIGG;Lo;0;L;;;;;N;;;;;
+D4CF;HANGUL SYLLABLE PWIGS;Lo;0;L;;;;;N;;;;;
+D4D0;HANGUL SYLLABLE PWIN;Lo;0;L;;;;;N;;;;;
+D4D1;HANGUL SYLLABLE PWINI;Lo;0;L;;;;;N;;;;;
+D4D2;HANGUL SYLLABLE PWINH;Lo;0;L;;;;;N;;;;;
+D4D3;HANGUL SYLLABLE PWID;Lo;0;L;;;;;N;;;;;
+D4D4;HANGUL SYLLABLE PWIL;Lo;0;L;;;;;N;;;;;
+D4D5;HANGUL SYLLABLE PWILG;Lo;0;L;;;;;N;;;;;
+D4D6;HANGUL SYLLABLE PWILM;Lo;0;L;;;;;N;;;;;
+D4D7;HANGUL SYLLABLE PWILB;Lo;0;L;;;;;N;;;;;
+D4D8;HANGUL SYLLABLE PWILS;Lo;0;L;;;;;N;;;;;
+D4D9;HANGUL SYLLABLE PWILT;Lo;0;L;;;;;N;;;;;
+D4DA;HANGUL SYLLABLE PWILP;Lo;0;L;;;;;N;;;;;
+D4DB;HANGUL SYLLABLE PWILH;Lo;0;L;;;;;N;;;;;
+D4DC;HANGUL SYLLABLE PWIM;Lo;0;L;;;;;N;;;;;
+D4DD;HANGUL SYLLABLE PWIB;Lo;0;L;;;;;N;;;;;
+D4DE;HANGUL SYLLABLE PWIBS;Lo;0;L;;;;;N;;;;;
+D4DF;HANGUL SYLLABLE PWIS;Lo;0;L;;;;;N;;;;;
+D4E0;HANGUL SYLLABLE PWISS;Lo;0;L;;;;;N;;;;;
+D4E1;HANGUL SYLLABLE PWING;Lo;0;L;;;;;N;;;;;
+D4E2;HANGUL SYLLABLE PWIJ;Lo;0;L;;;;;N;;;;;
+D4E3;HANGUL SYLLABLE PWIC;Lo;0;L;;;;;N;;;;;
+D4E4;HANGUL SYLLABLE PWIK;Lo;0;L;;;;;N;;;;;
+D4E5;HANGUL SYLLABLE PWIT;Lo;0;L;;;;;N;;;;;
+D4E6;HANGUL SYLLABLE PWIP;Lo;0;L;;;;;N;;;;;
+D4E7;HANGUL SYLLABLE PWIH;Lo;0;L;;;;;N;;;;;
+D4E8;HANGUL SYLLABLE PYU;Lo;0;L;;;;;N;;;;;
+D4E9;HANGUL SYLLABLE PYUG;Lo;0;L;;;;;N;;;;;
+D4EA;HANGUL SYLLABLE PYUGG;Lo;0;L;;;;;N;;;;;
+D4EB;HANGUL SYLLABLE PYUGS;Lo;0;L;;;;;N;;;;;
+D4EC;HANGUL SYLLABLE PYUN;Lo;0;L;;;;;N;;;;;
+D4ED;HANGUL SYLLABLE PYUNI;Lo;0;L;;;;;N;;;;;
+D4EE;HANGUL SYLLABLE PYUNH;Lo;0;L;;;;;N;;;;;
+D4EF;HANGUL SYLLABLE PYUD;Lo;0;L;;;;;N;;;;;
+D4F0;HANGUL SYLLABLE PYUL;Lo;0;L;;;;;N;;;;;
+D4F1;HANGUL SYLLABLE PYULG;Lo;0;L;;;;;N;;;;;
+D4F2;HANGUL SYLLABLE PYULM;Lo;0;L;;;;;N;;;;;
+D4F3;HANGUL SYLLABLE PYULB;Lo;0;L;;;;;N;;;;;
+D4F4;HANGUL SYLLABLE PYULS;Lo;0;L;;;;;N;;;;;
+D4F5;HANGUL SYLLABLE PYULT;Lo;0;L;;;;;N;;;;;
+D4F6;HANGUL SYLLABLE PYULP;Lo;0;L;;;;;N;;;;;
+D4F7;HANGUL SYLLABLE PYULH;Lo;0;L;;;;;N;;;;;
+D4F8;HANGUL SYLLABLE PYUM;Lo;0;L;;;;;N;;;;;
+D4F9;HANGUL SYLLABLE PYUB;Lo;0;L;;;;;N;;;;;
+D4FA;HANGUL SYLLABLE PYUBS;Lo;0;L;;;;;N;;;;;
+D4FB;HANGUL SYLLABLE PYUS;Lo;0;L;;;;;N;;;;;
+D4FC;HANGUL SYLLABLE PYUSS;Lo;0;L;;;;;N;;;;;
+D4FD;HANGUL SYLLABLE PYUNG;Lo;0;L;;;;;N;;;;;
+D4FE;HANGUL SYLLABLE PYUJ;Lo;0;L;;;;;N;;;;;
+D4FF;HANGUL SYLLABLE PYUC;Lo;0;L;;;;;N;;;;;
+D500;HANGUL SYLLABLE PYUK;Lo;0;L;;;;;N;;;;;
+D501;HANGUL SYLLABLE PYUT;Lo;0;L;;;;;N;;;;;
+D502;HANGUL SYLLABLE PYUP;Lo;0;L;;;;;N;;;;;
+D503;HANGUL SYLLABLE PYUH;Lo;0;L;;;;;N;;;;;
+D504;HANGUL SYLLABLE PEU;Lo;0;L;;;;;N;;;;;
+D505;HANGUL SYLLABLE PEUG;Lo;0;L;;;;;N;;;;;
+D506;HANGUL SYLLABLE PEUGG;Lo;0;L;;;;;N;;;;;
+D507;HANGUL SYLLABLE PEUGS;Lo;0;L;;;;;N;;;;;
+D508;HANGUL SYLLABLE PEUN;Lo;0;L;;;;;N;;;;;
+D509;HANGUL SYLLABLE PEUNI;Lo;0;L;;;;;N;;;;;
+D50A;HANGUL SYLLABLE PEUNH;Lo;0;L;;;;;N;;;;;
+D50B;HANGUL SYLLABLE PEUD;Lo;0;L;;;;;N;;;;;
+D50C;HANGUL SYLLABLE PEUL;Lo;0;L;;;;;N;;;;;
+D50D;HANGUL SYLLABLE PEULG;Lo;0;L;;;;;N;;;;;
+D50E;HANGUL SYLLABLE PEULM;Lo;0;L;;;;;N;;;;;
+D50F;HANGUL SYLLABLE PEULB;Lo;0;L;;;;;N;;;;;
+D510;HANGUL SYLLABLE PEULS;Lo;0;L;;;;;N;;;;;
+D511;HANGUL SYLLABLE PEULT;Lo;0;L;;;;;N;;;;;
+D512;HANGUL SYLLABLE PEULP;Lo;0;L;;;;;N;;;;;
+D513;HANGUL SYLLABLE PEULH;Lo;0;L;;;;;N;;;;;
+D514;HANGUL SYLLABLE PEUM;Lo;0;L;;;;;N;;;;;
+D515;HANGUL SYLLABLE PEUB;Lo;0;L;;;;;N;;;;;
+D516;HANGUL SYLLABLE PEUBS;Lo;0;L;;;;;N;;;;;
+D517;HANGUL SYLLABLE PEUS;Lo;0;L;;;;;N;;;;;
+D518;HANGUL SYLLABLE PEUSS;Lo;0;L;;;;;N;;;;;
+D519;HANGUL SYLLABLE PEUNG;Lo;0;L;;;;;N;;;;;
+D51A;HANGUL SYLLABLE PEUJ;Lo;0;L;;;;;N;;;;;
+D51B;HANGUL SYLLABLE PEUC;Lo;0;L;;;;;N;;;;;
+D51C;HANGUL SYLLABLE PEUK;Lo;0;L;;;;;N;;;;;
+D51D;HANGUL SYLLABLE PEUT;Lo;0;L;;;;;N;;;;;
+D51E;HANGUL SYLLABLE PEUP;Lo;0;L;;;;;N;;;;;
+D51F;HANGUL SYLLABLE PEUH;Lo;0;L;;;;;N;;;;;
+D520;HANGUL SYLLABLE PYI;Lo;0;L;;;;;N;;;;;
+D521;HANGUL SYLLABLE PYIG;Lo;0;L;;;;;N;;;;;
+D522;HANGUL SYLLABLE PYIGG;Lo;0;L;;;;;N;;;;;
+D523;HANGUL SYLLABLE PYIGS;Lo;0;L;;;;;N;;;;;
+D524;HANGUL SYLLABLE PYIN;Lo;0;L;;;;;N;;;;;
+D525;HANGUL SYLLABLE PYINI;Lo;0;L;;;;;N;;;;;
+D526;HANGUL SYLLABLE PYINH;Lo;0;L;;;;;N;;;;;
+D527;HANGUL SYLLABLE PYID;Lo;0;L;;;;;N;;;;;
+D528;HANGUL SYLLABLE PYIL;Lo;0;L;;;;;N;;;;;
+D529;HANGUL SYLLABLE PYILG;Lo;0;L;;;;;N;;;;;
+D52A;HANGUL SYLLABLE PYILM;Lo;0;L;;;;;N;;;;;
+D52B;HANGUL SYLLABLE PYILB;Lo;0;L;;;;;N;;;;;
+D52C;HANGUL SYLLABLE PYILS;Lo;0;L;;;;;N;;;;;
+D52D;HANGUL SYLLABLE PYILT;Lo;0;L;;;;;N;;;;;
+D52E;HANGUL SYLLABLE PYILP;Lo;0;L;;;;;N;;;;;
+D52F;HANGUL SYLLABLE PYILH;Lo;0;L;;;;;N;;;;;
+D530;HANGUL SYLLABLE PYIM;Lo;0;L;;;;;N;;;;;
+D531;HANGUL SYLLABLE PYIB;Lo;0;L;;;;;N;;;;;
+D532;HANGUL SYLLABLE PYIBS;Lo;0;L;;;;;N;;;;;
+D533;HANGUL SYLLABLE PYIS;Lo;0;L;;;;;N;;;;;
+D534;HANGUL SYLLABLE PYISS;Lo;0;L;;;;;N;;;;;
+D535;HANGUL SYLLABLE PYING;Lo;0;L;;;;;N;;;;;
+D536;HANGUL SYLLABLE PYIJ;Lo;0;L;;;;;N;;;;;
+D537;HANGUL SYLLABLE PYIC;Lo;0;L;;;;;N;;;;;
+D538;HANGUL SYLLABLE PYIK;Lo;0;L;;;;;N;;;;;
+D539;HANGUL SYLLABLE PYIT;Lo;0;L;;;;;N;;;;;
+D53A;HANGUL SYLLABLE PYIP;Lo;0;L;;;;;N;;;;;
+D53B;HANGUL SYLLABLE PYIH;Lo;0;L;;;;;N;;;;;
+D53C;HANGUL SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+D53D;HANGUL SYLLABLE PIG;Lo;0;L;;;;;N;;;;;
+D53E;HANGUL SYLLABLE PIGG;Lo;0;L;;;;;N;;;;;
+D53F;HANGUL SYLLABLE PIGS;Lo;0;L;;;;;N;;;;;
+D540;HANGUL SYLLABLE PIN;Lo;0;L;;;;;N;;;;;
+D541;HANGUL SYLLABLE PINI;Lo;0;L;;;;;N;;;;;
+D542;HANGUL SYLLABLE PINH;Lo;0;L;;;;;N;;;;;
+D543;HANGUL SYLLABLE PID;Lo;0;L;;;;;N;;;;;
+D544;HANGUL SYLLABLE PIL;Lo;0;L;;;;;N;;;;;
+D545;HANGUL SYLLABLE PILG;Lo;0;L;;;;;N;;;;;
+D546;HANGUL SYLLABLE PILM;Lo;0;L;;;;;N;;;;;
+D547;HANGUL SYLLABLE PILB;Lo;0;L;;;;;N;;;;;
+D548;HANGUL SYLLABLE PILS;Lo;0;L;;;;;N;;;;;
+D549;HANGUL SYLLABLE PILT;Lo;0;L;;;;;N;;;;;
+D54A;HANGUL SYLLABLE PILP;Lo;0;L;;;;;N;;;;;
+D54B;HANGUL SYLLABLE PILH;Lo;0;L;;;;;N;;;;;
+D54C;HANGUL SYLLABLE PIM;Lo;0;L;;;;;N;;;;;
+D54D;HANGUL SYLLABLE PIB;Lo;0;L;;;;;N;;;;;
+D54E;HANGUL SYLLABLE PIBS;Lo;0;L;;;;;N;;;;;
+D54F;HANGUL SYLLABLE PIS;Lo;0;L;;;;;N;;;;;
+D550;HANGUL SYLLABLE PISS;Lo;0;L;;;;;N;;;;;
+D551;HANGUL SYLLABLE PING;Lo;0;L;;;;;N;;;;;
+D552;HANGUL SYLLABLE PIJ;Lo;0;L;;;;;N;;;;;
+D553;HANGUL SYLLABLE PIC;Lo;0;L;;;;;N;;;;;
+D554;HANGUL SYLLABLE PIK;Lo;0;L;;;;;N;;;;;
+D555;HANGUL SYLLABLE PIT;Lo;0;L;;;;;N;;;;;
+D556;HANGUL SYLLABLE PIP;Lo;0;L;;;;;N;;;;;
+D557;HANGUL SYLLABLE PIH;Lo;0;L;;;;;N;;;;;
+D558;HANGUL SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+D559;HANGUL SYLLABLE HAG;Lo;0;L;;;;;N;;;;;
+D55A;HANGUL SYLLABLE HAGG;Lo;0;L;;;;;N;;;;;
+D55B;HANGUL SYLLABLE HAGS;Lo;0;L;;;;;N;;;;;
+D55C;HANGUL SYLLABLE HAN;Lo;0;L;;;;;N;;;;;
+D55D;HANGUL SYLLABLE HANI;Lo;0;L;;;;;N;;;;;
+D55E;HANGUL SYLLABLE HANH;Lo;0;L;;;;;N;;;;;
+D55F;HANGUL SYLLABLE HAD;Lo;0;L;;;;;N;;;;;
+D560;HANGUL SYLLABLE HAL;Lo;0;L;;;;;N;;;;;
+D561;HANGUL SYLLABLE HALG;Lo;0;L;;;;;N;;;;;
+D562;HANGUL SYLLABLE HALM;Lo;0;L;;;;;N;;;;;
+D563;HANGUL SYLLABLE HALB;Lo;0;L;;;;;N;;;;;
+D564;HANGUL SYLLABLE HALS;Lo;0;L;;;;;N;;;;;
+D565;HANGUL SYLLABLE HALT;Lo;0;L;;;;;N;;;;;
+D566;HANGUL SYLLABLE HALP;Lo;0;L;;;;;N;;;;;
+D567;HANGUL SYLLABLE HALH;Lo;0;L;;;;;N;;;;;
+D568;HANGUL SYLLABLE HAM;Lo;0;L;;;;;N;;;;;
+D569;HANGUL SYLLABLE HAB;Lo;0;L;;;;;N;;;;;
+D56A;HANGUL SYLLABLE HABS;Lo;0;L;;;;;N;;;;;
+D56B;HANGUL SYLLABLE HAS;Lo;0;L;;;;;N;;;;;
+D56C;HANGUL SYLLABLE HASS;Lo;0;L;;;;;N;;;;;
+D56D;HANGUL SYLLABLE HANG;Lo;0;L;;;;;N;;;;;
+D56E;HANGUL SYLLABLE HAJ;Lo;0;L;;;;;N;;;;;
+D56F;HANGUL SYLLABLE HAC;Lo;0;L;;;;;N;;;;;
+D570;HANGUL SYLLABLE HAK;Lo;0;L;;;;;N;;;;;
+D571;HANGUL SYLLABLE HAT;Lo;0;L;;;;;N;;;;;
+D572;HANGUL SYLLABLE HAP;Lo;0;L;;;;;N;;;;;
+D573;HANGUL SYLLABLE HAH;Lo;0;L;;;;;N;;;;;
+D574;HANGUL SYLLABLE HAE;Lo;0;L;;;;;N;;;;;
+D575;HANGUL SYLLABLE HAEG;Lo;0;L;;;;;N;;;;;
+D576;HANGUL SYLLABLE HAEGG;Lo;0;L;;;;;N;;;;;
+D577;HANGUL SYLLABLE HAEGS;Lo;0;L;;;;;N;;;;;
+D578;HANGUL SYLLABLE HAEN;Lo;0;L;;;;;N;;;;;
+D579;HANGUL SYLLABLE HAENI;Lo;0;L;;;;;N;;;;;
+D57A;HANGUL SYLLABLE HAENH;Lo;0;L;;;;;N;;;;;
+D57B;HANGUL SYLLABLE HAED;Lo;0;L;;;;;N;;;;;
+D57C;HANGUL SYLLABLE HAEL;Lo;0;L;;;;;N;;;;;
+D57D;HANGUL SYLLABLE HAELG;Lo;0;L;;;;;N;;;;;
+D57E;HANGUL SYLLABLE HAELM;Lo;0;L;;;;;N;;;;;
+D57F;HANGUL SYLLABLE HAELB;Lo;0;L;;;;;N;;;;;
+D580;HANGUL SYLLABLE HAELS;Lo;0;L;;;;;N;;;;;
+D581;HANGUL SYLLABLE HAELT;Lo;0;L;;;;;N;;;;;
+D582;HANGUL SYLLABLE HAELP;Lo;0;L;;;;;N;;;;;
+D583;HANGUL SYLLABLE HAELH;Lo;0;L;;;;;N;;;;;
+D584;HANGUL SYLLABLE HAEM;Lo;0;L;;;;;N;;;;;
+D585;HANGUL SYLLABLE HAEB;Lo;0;L;;;;;N;;;;;
+D586;HANGUL SYLLABLE HAEBS;Lo;0;L;;;;;N;;;;;
+D587;HANGUL SYLLABLE HAES;Lo;0;L;;;;;N;;;;;
+D588;HANGUL SYLLABLE HAESS;Lo;0;L;;;;;N;;;;;
+D589;HANGUL SYLLABLE HAENG;Lo;0;L;;;;;N;;;;;
+D58A;HANGUL SYLLABLE HAEJ;Lo;0;L;;;;;N;;;;;
+D58B;HANGUL SYLLABLE HAEC;Lo;0;L;;;;;N;;;;;
+D58C;HANGUL SYLLABLE HAEK;Lo;0;L;;;;;N;;;;;
+D58D;HANGUL SYLLABLE HAET;Lo;0;L;;;;;N;;;;;
+D58E;HANGUL SYLLABLE HAEP;Lo;0;L;;;;;N;;;;;
+D58F;HANGUL SYLLABLE HAEH;Lo;0;L;;;;;N;;;;;
+D590;HANGUL SYLLABLE HYA;Lo;0;L;;;;;N;;;;;
+D591;HANGUL SYLLABLE HYAG;Lo;0;L;;;;;N;;;;;
+D592;HANGUL SYLLABLE HYAGG;Lo;0;L;;;;;N;;;;;
+D593;HANGUL SYLLABLE HYAGS;Lo;0;L;;;;;N;;;;;
+D594;HANGUL SYLLABLE HYAN;Lo;0;L;;;;;N;;;;;
+D595;HANGUL SYLLABLE HYANI;Lo;0;L;;;;;N;;;;;
+D596;HANGUL SYLLABLE HYANH;Lo;0;L;;;;;N;;;;;
+D597;HANGUL SYLLABLE HYAD;Lo;0;L;;;;;N;;;;;
+D598;HANGUL SYLLABLE HYAL;Lo;0;L;;;;;N;;;;;
+D599;HANGUL SYLLABLE HYALG;Lo;0;L;;;;;N;;;;;
+D59A;HANGUL SYLLABLE HYALM;Lo;0;L;;;;;N;;;;;
+D59B;HANGUL SYLLABLE HYALB;Lo;0;L;;;;;N;;;;;
+D59C;HANGUL SYLLABLE HYALS;Lo;0;L;;;;;N;;;;;
+D59D;HANGUL SYLLABLE HYALT;Lo;0;L;;;;;N;;;;;
+D59E;HANGUL SYLLABLE HYALP;Lo;0;L;;;;;N;;;;;
+D59F;HANGUL SYLLABLE HYALH;Lo;0;L;;;;;N;;;;;
+D5A0;HANGUL SYLLABLE HYAM;Lo;0;L;;;;;N;;;;;
+D5A1;HANGUL SYLLABLE HYAB;Lo;0;L;;;;;N;;;;;
+D5A2;HANGUL SYLLABLE HYABS;Lo;0;L;;;;;N;;;;;
+D5A3;HANGUL SYLLABLE HYAS;Lo;0;L;;;;;N;;;;;
+D5A4;HANGUL SYLLABLE HYASS;Lo;0;L;;;;;N;;;;;
+D5A5;HANGUL SYLLABLE HYANG;Lo;0;L;;;;;N;;;;;
+D5A6;HANGUL SYLLABLE HYAJ;Lo;0;L;;;;;N;;;;;
+D5A7;HANGUL SYLLABLE HYAC;Lo;0;L;;;;;N;;;;;
+D5A8;HANGUL SYLLABLE HYAK;Lo;0;L;;;;;N;;;;;
+D5A9;HANGUL SYLLABLE HYAT;Lo;0;L;;;;;N;;;;;
+D5AA;HANGUL SYLLABLE HYAP;Lo;0;L;;;;;N;;;;;
+D5AB;HANGUL SYLLABLE HYAH;Lo;0;L;;;;;N;;;;;
+D5AC;HANGUL SYLLABLE HYAE;Lo;0;L;;;;;N;;;;;
+D5AD;HANGUL SYLLABLE HYAEG;Lo;0;L;;;;;N;;;;;
+D5AE;HANGUL SYLLABLE HYAEGG;Lo;0;L;;;;;N;;;;;
+D5AF;HANGUL SYLLABLE HYAEGS;Lo;0;L;;;;;N;;;;;
+D5B0;HANGUL SYLLABLE HYAEN;Lo;0;L;;;;;N;;;;;
+D5B1;HANGUL SYLLABLE HYAENI;Lo;0;L;;;;;N;;;;;
+D5B2;HANGUL SYLLABLE HYAENH;Lo;0;L;;;;;N;;;;;
+D5B3;HANGUL SYLLABLE HYAED;Lo;0;L;;;;;N;;;;;
+D5B4;HANGUL SYLLABLE HYAEL;Lo;0;L;;;;;N;;;;;
+D5B5;HANGUL SYLLABLE HYAELG;Lo;0;L;;;;;N;;;;;
+D5B6;HANGUL SYLLABLE HYAELM;Lo;0;L;;;;;N;;;;;
+D5B7;HANGUL SYLLABLE HYAELB;Lo;0;L;;;;;N;;;;;
+D5B8;HANGUL SYLLABLE HYAELS;Lo;0;L;;;;;N;;;;;
+D5B9;HANGUL SYLLABLE HYAELT;Lo;0;L;;;;;N;;;;;
+D5BA;HANGUL SYLLABLE HYAELP;Lo;0;L;;;;;N;;;;;
+D5BB;HANGUL SYLLABLE HYAELH;Lo;0;L;;;;;N;;;;;
+D5BC;HANGUL SYLLABLE HYAEM;Lo;0;L;;;;;N;;;;;
+D5BD;HANGUL SYLLABLE HYAEB;Lo;0;L;;;;;N;;;;;
+D5BE;HANGUL SYLLABLE HYAEBS;Lo;0;L;;;;;N;;;;;
+D5BF;HANGUL SYLLABLE HYAES;Lo;0;L;;;;;N;;;;;
+D5C0;HANGUL SYLLABLE HYAESS;Lo;0;L;;;;;N;;;;;
+D5C1;HANGUL SYLLABLE HYAENG;Lo;0;L;;;;;N;;;;;
+D5C2;HANGUL SYLLABLE HYAEJ;Lo;0;L;;;;;N;;;;;
+D5C3;HANGUL SYLLABLE HYAEC;Lo;0;L;;;;;N;;;;;
+D5C4;HANGUL SYLLABLE HYAEK;Lo;0;L;;;;;N;;;;;
+D5C5;HANGUL SYLLABLE HYAET;Lo;0;L;;;;;N;;;;;
+D5C6;HANGUL SYLLABLE HYAEP;Lo;0;L;;;;;N;;;;;
+D5C7;HANGUL SYLLABLE HYAEH;Lo;0;L;;;;;N;;;;;
+D5C8;HANGUL SYLLABLE HEO;Lo;0;L;;;;;N;;;;;
+D5C9;HANGUL SYLLABLE HEOG;Lo;0;L;;;;;N;;;;;
+D5CA;HANGUL SYLLABLE HEOGG;Lo;0;L;;;;;N;;;;;
+D5CB;HANGUL SYLLABLE HEOGS;Lo;0;L;;;;;N;;;;;
+D5CC;HANGUL SYLLABLE HEON;Lo;0;L;;;;;N;;;;;
+D5CD;HANGUL SYLLABLE HEONI;Lo;0;L;;;;;N;;;;;
+D5CE;HANGUL SYLLABLE HEONH;Lo;0;L;;;;;N;;;;;
+D5CF;HANGUL SYLLABLE HEOD;Lo;0;L;;;;;N;;;;;
+D5D0;HANGUL SYLLABLE HEOL;Lo;0;L;;;;;N;;;;;
+D5D1;HANGUL SYLLABLE HEOLG;Lo;0;L;;;;;N;;;;;
+D5D2;HANGUL SYLLABLE HEOLM;Lo;0;L;;;;;N;;;;;
+D5D3;HANGUL SYLLABLE HEOLB;Lo;0;L;;;;;N;;;;;
+D5D4;HANGUL SYLLABLE HEOLS;Lo;0;L;;;;;N;;;;;
+D5D5;HANGUL SYLLABLE HEOLT;Lo;0;L;;;;;N;;;;;
+D5D6;HANGUL SYLLABLE HEOLP;Lo;0;L;;;;;N;;;;;
+D5D7;HANGUL SYLLABLE HEOLH;Lo;0;L;;;;;N;;;;;
+D5D8;HANGUL SYLLABLE HEOM;Lo;0;L;;;;;N;;;;;
+D5D9;HANGUL SYLLABLE HEOB;Lo;0;L;;;;;N;;;;;
+D5DA;HANGUL SYLLABLE HEOBS;Lo;0;L;;;;;N;;;;;
+D5DB;HANGUL SYLLABLE HEOS;Lo;0;L;;;;;N;;;;;
+D5DC;HANGUL SYLLABLE HEOSS;Lo;0;L;;;;;N;;;;;
+D5DD;HANGUL SYLLABLE HEONG;Lo;0;L;;;;;N;;;;;
+D5DE;HANGUL SYLLABLE HEOJ;Lo;0;L;;;;;N;;;;;
+D5DF;HANGUL SYLLABLE HEOC;Lo;0;L;;;;;N;;;;;
+D5E0;HANGUL SYLLABLE HEOK;Lo;0;L;;;;;N;;;;;
+D5E1;HANGUL SYLLABLE HEOT;Lo;0;L;;;;;N;;;;;
+D5E2;HANGUL SYLLABLE HEOP;Lo;0;L;;;;;N;;;;;
+D5E3;HANGUL SYLLABLE HEOH;Lo;0;L;;;;;N;;;;;
+D5E4;HANGUL SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+D5E5;HANGUL SYLLABLE HEG;Lo;0;L;;;;;N;;;;;
+D5E6;HANGUL SYLLABLE HEGG;Lo;0;L;;;;;N;;;;;
+D5E7;HANGUL SYLLABLE HEGS;Lo;0;L;;;;;N;;;;;
+D5E8;HANGUL SYLLABLE HEN;Lo;0;L;;;;;N;;;;;
+D5E9;HANGUL SYLLABLE HENI;Lo;0;L;;;;;N;;;;;
+D5EA;HANGUL SYLLABLE HENH;Lo;0;L;;;;;N;;;;;
+D5EB;HANGUL SYLLABLE HED;Lo;0;L;;;;;N;;;;;
+D5EC;HANGUL SYLLABLE HEL;Lo;0;L;;;;;N;;;;;
+D5ED;HANGUL SYLLABLE HELG;Lo;0;L;;;;;N;;;;;
+D5EE;HANGUL SYLLABLE HELM;Lo;0;L;;;;;N;;;;;
+D5EF;HANGUL SYLLABLE HELB;Lo;0;L;;;;;N;;;;;
+D5F0;HANGUL SYLLABLE HELS;Lo;0;L;;;;;N;;;;;
+D5F1;HANGUL SYLLABLE HELT;Lo;0;L;;;;;N;;;;;
+D5F2;HANGUL SYLLABLE HELP;Lo;0;L;;;;;N;;;;;
+D5F3;HANGUL SYLLABLE HELH;Lo;0;L;;;;;N;;;;;
+D5F4;HANGUL SYLLABLE HEM;Lo;0;L;;;;;N;;;;;
+D5F5;HANGUL SYLLABLE HEB;Lo;0;L;;;;;N;;;;;
+D5F6;HANGUL SYLLABLE HEBS;Lo;0;L;;;;;N;;;;;
+D5F7;HANGUL SYLLABLE HES;Lo;0;L;;;;;N;;;;;
+D5F8;HANGUL SYLLABLE HESS;Lo;0;L;;;;;N;;;;;
+D5F9;HANGUL SYLLABLE HENG;Lo;0;L;;;;;N;;;;;
+D5FA;HANGUL SYLLABLE HEJ;Lo;0;L;;;;;N;;;;;
+D5FB;HANGUL SYLLABLE HEC;Lo;0;L;;;;;N;;;;;
+D5FC;HANGUL SYLLABLE HEK;Lo;0;L;;;;;N;;;;;
+D5FD;HANGUL SYLLABLE HET;Lo;0;L;;;;;N;;;;;
+D5FE;HANGUL SYLLABLE HEP;Lo;0;L;;;;;N;;;;;
+D5FF;HANGUL SYLLABLE HEH;Lo;0;L;;;;;N;;;;;
+D600;HANGUL SYLLABLE HYEO;Lo;0;L;;;;;N;;;;;
+D601;HANGUL SYLLABLE HYEOG;Lo;0;L;;;;;N;;;;;
+D602;HANGUL SYLLABLE HYEOGG;Lo;0;L;;;;;N;;;;;
+D603;HANGUL SYLLABLE HYEOGS;Lo;0;L;;;;;N;;;;;
+D604;HANGUL SYLLABLE HYEON;Lo;0;L;;;;;N;;;;;
+D605;HANGUL SYLLABLE HYEONI;Lo;0;L;;;;;N;;;;;
+D606;HANGUL SYLLABLE HYEONH;Lo;0;L;;;;;N;;;;;
+D607;HANGUL SYLLABLE HYEOD;Lo;0;L;;;;;N;;;;;
+D608;HANGUL SYLLABLE HYEOL;Lo;0;L;;;;;N;;;;;
+D609;HANGUL SYLLABLE HYEOLG;Lo;0;L;;;;;N;;;;;
+D60A;HANGUL SYLLABLE HYEOLM;Lo;0;L;;;;;N;;;;;
+D60B;HANGUL SYLLABLE HYEOLB;Lo;0;L;;;;;N;;;;;
+D60C;HANGUL SYLLABLE HYEOLS;Lo;0;L;;;;;N;;;;;
+D60D;HANGUL SYLLABLE HYEOLT;Lo;0;L;;;;;N;;;;;
+D60E;HANGUL SYLLABLE HYEOLP;Lo;0;L;;;;;N;;;;;
+D60F;HANGUL SYLLABLE HYEOLH;Lo;0;L;;;;;N;;;;;
+D610;HANGUL SYLLABLE HYEOM;Lo;0;L;;;;;N;;;;;
+D611;HANGUL SYLLABLE HYEOB;Lo;0;L;;;;;N;;;;;
+D612;HANGUL SYLLABLE HYEOBS;Lo;0;L;;;;;N;;;;;
+D613;HANGUL SYLLABLE HYEOS;Lo;0;L;;;;;N;;;;;
+D614;HANGUL SYLLABLE HYEOSS;Lo;0;L;;;;;N;;;;;
+D615;HANGUL SYLLABLE HYEONG;Lo;0;L;;;;;N;;;;;
+D616;HANGUL SYLLABLE HYEOJ;Lo;0;L;;;;;N;;;;;
+D617;HANGUL SYLLABLE HYEOC;Lo;0;L;;;;;N;;;;;
+D618;HANGUL SYLLABLE HYEOK;Lo;0;L;;;;;N;;;;;
+D619;HANGUL SYLLABLE HYEOT;Lo;0;L;;;;;N;;;;;
+D61A;HANGUL SYLLABLE HYEOP;Lo;0;L;;;;;N;;;;;
+D61B;HANGUL SYLLABLE HYEOH;Lo;0;L;;;;;N;;;;;
+D61C;HANGUL SYLLABLE HYE;Lo;0;L;;;;;N;;;;;
+D61D;HANGUL SYLLABLE HYEG;Lo;0;L;;;;;N;;;;;
+D61E;HANGUL SYLLABLE HYEGG;Lo;0;L;;;;;N;;;;;
+D61F;HANGUL SYLLABLE HYEGS;Lo;0;L;;;;;N;;;;;
+D620;HANGUL SYLLABLE HYEN;Lo;0;L;;;;;N;;;;;
+D621;HANGUL SYLLABLE HYENI;Lo;0;L;;;;;N;;;;;
+D622;HANGUL SYLLABLE HYENH;Lo;0;L;;;;;N;;;;;
+D623;HANGUL SYLLABLE HYED;Lo;0;L;;;;;N;;;;;
+D624;HANGUL SYLLABLE HYEL;Lo;0;L;;;;;N;;;;;
+D625;HANGUL SYLLABLE HYELG;Lo;0;L;;;;;N;;;;;
+D626;HANGUL SYLLABLE HYELM;Lo;0;L;;;;;N;;;;;
+D627;HANGUL SYLLABLE HYELB;Lo;0;L;;;;;N;;;;;
+D628;HANGUL SYLLABLE HYELS;Lo;0;L;;;;;N;;;;;
+D629;HANGUL SYLLABLE HYELT;Lo;0;L;;;;;N;;;;;
+D62A;HANGUL SYLLABLE HYELP;Lo;0;L;;;;;N;;;;;
+D62B;HANGUL SYLLABLE HYELH;Lo;0;L;;;;;N;;;;;
+D62C;HANGUL SYLLABLE HYEM;Lo;0;L;;;;;N;;;;;
+D62D;HANGUL SYLLABLE HYEB;Lo;0;L;;;;;N;;;;;
+D62E;HANGUL SYLLABLE HYEBS;Lo;0;L;;;;;N;;;;;
+D62F;HANGUL SYLLABLE HYES;Lo;0;L;;;;;N;;;;;
+D630;HANGUL SYLLABLE HYESS;Lo;0;L;;;;;N;;;;;
+D631;HANGUL SYLLABLE HYENG;Lo;0;L;;;;;N;;;;;
+D632;HANGUL SYLLABLE HYEJ;Lo;0;L;;;;;N;;;;;
+D633;HANGUL SYLLABLE HYEC;Lo;0;L;;;;;N;;;;;
+D634;HANGUL SYLLABLE HYEK;Lo;0;L;;;;;N;;;;;
+D635;HANGUL SYLLABLE HYET;Lo;0;L;;;;;N;;;;;
+D636;HANGUL SYLLABLE HYEP;Lo;0;L;;;;;N;;;;;
+D637;HANGUL SYLLABLE HYEH;Lo;0;L;;;;;N;;;;;
+D638;HANGUL SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+D639;HANGUL SYLLABLE HOG;Lo;0;L;;;;;N;;;;;
+D63A;HANGUL SYLLABLE HOGG;Lo;0;L;;;;;N;;;;;
+D63B;HANGUL SYLLABLE HOGS;Lo;0;L;;;;;N;;;;;
+D63C;HANGUL SYLLABLE HON;Lo;0;L;;;;;N;;;;;
+D63D;HANGUL SYLLABLE HONI;Lo;0;L;;;;;N;;;;;
+D63E;HANGUL SYLLABLE HONH;Lo;0;L;;;;;N;;;;;
+D63F;HANGUL SYLLABLE HOD;Lo;0;L;;;;;N;;;;;
+D640;HANGUL SYLLABLE HOL;Lo;0;L;;;;;N;;;;;
+D641;HANGUL SYLLABLE HOLG;Lo;0;L;;;;;N;;;;;
+D642;HANGUL SYLLABLE HOLM;Lo;0;L;;;;;N;;;;;
+D643;HANGUL SYLLABLE HOLB;Lo;0;L;;;;;N;;;;;
+D644;HANGUL SYLLABLE HOLS;Lo;0;L;;;;;N;;;;;
+D645;HANGUL SYLLABLE HOLT;Lo;0;L;;;;;N;;;;;
+D646;HANGUL SYLLABLE HOLP;Lo;0;L;;;;;N;;;;;
+D647;HANGUL SYLLABLE HOLH;Lo;0;L;;;;;N;;;;;
+D648;HANGUL SYLLABLE HOM;Lo;0;L;;;;;N;;;;;
+D649;HANGUL SYLLABLE HOB;Lo;0;L;;;;;N;;;;;
+D64A;HANGUL SYLLABLE HOBS;Lo;0;L;;;;;N;;;;;
+D64B;HANGUL SYLLABLE HOS;Lo;0;L;;;;;N;;;;;
+D64C;HANGUL SYLLABLE HOSS;Lo;0;L;;;;;N;;;;;
+D64D;HANGUL SYLLABLE HONG;Lo;0;L;;;;;N;;;;;
+D64E;HANGUL SYLLABLE HOJ;Lo;0;L;;;;;N;;;;;
+D64F;HANGUL SYLLABLE HOC;Lo;0;L;;;;;N;;;;;
+D650;HANGUL SYLLABLE HOK;Lo;0;L;;;;;N;;;;;
+D651;HANGUL SYLLABLE HOT;Lo;0;L;;;;;N;;;;;
+D652;HANGUL SYLLABLE HOP;Lo;0;L;;;;;N;;;;;
+D653;HANGUL SYLLABLE HOH;Lo;0;L;;;;;N;;;;;
+D654;HANGUL SYLLABLE HWA;Lo;0;L;;;;;N;;;;;
+D655;HANGUL SYLLABLE HWAG;Lo;0;L;;;;;N;;;;;
+D656;HANGUL SYLLABLE HWAGG;Lo;0;L;;;;;N;;;;;
+D657;HANGUL SYLLABLE HWAGS;Lo;0;L;;;;;N;;;;;
+D658;HANGUL SYLLABLE HWAN;Lo;0;L;;;;;N;;;;;
+D659;HANGUL SYLLABLE HWANI;Lo;0;L;;;;;N;;;;;
+D65A;HANGUL SYLLABLE HWANH;Lo;0;L;;;;;N;;;;;
+D65B;HANGUL SYLLABLE HWAD;Lo;0;L;;;;;N;;;;;
+D65C;HANGUL SYLLABLE HWAL;Lo;0;L;;;;;N;;;;;
+D65D;HANGUL SYLLABLE HWALG;Lo;0;L;;;;;N;;;;;
+D65E;HANGUL SYLLABLE HWALM;Lo;0;L;;;;;N;;;;;
+D65F;HANGUL SYLLABLE HWALB;Lo;0;L;;;;;N;;;;;
+D660;HANGUL SYLLABLE HWALS;Lo;0;L;;;;;N;;;;;
+D661;HANGUL SYLLABLE HWALT;Lo;0;L;;;;;N;;;;;
+D662;HANGUL SYLLABLE HWALP;Lo;0;L;;;;;N;;;;;
+D663;HANGUL SYLLABLE HWALH;Lo;0;L;;;;;N;;;;;
+D664;HANGUL SYLLABLE HWAM;Lo;0;L;;;;;N;;;;;
+D665;HANGUL SYLLABLE HWAB;Lo;0;L;;;;;N;;;;;
+D666;HANGUL SYLLABLE HWABS;Lo;0;L;;;;;N;;;;;
+D667;HANGUL SYLLABLE HWAS;Lo;0;L;;;;;N;;;;;
+D668;HANGUL SYLLABLE HWASS;Lo;0;L;;;;;N;;;;;
+D669;HANGUL SYLLABLE HWANG;Lo;0;L;;;;;N;;;;;
+D66A;HANGUL SYLLABLE HWAJ;Lo;0;L;;;;;N;;;;;
+D66B;HANGUL SYLLABLE HWAC;Lo;0;L;;;;;N;;;;;
+D66C;HANGUL SYLLABLE HWAK;Lo;0;L;;;;;N;;;;;
+D66D;HANGUL SYLLABLE HWAT;Lo;0;L;;;;;N;;;;;
+D66E;HANGUL SYLLABLE HWAP;Lo;0;L;;;;;N;;;;;
+D66F;HANGUL SYLLABLE HWAH;Lo;0;L;;;;;N;;;;;
+D670;HANGUL SYLLABLE HWAE;Lo;0;L;;;;;N;;;;;
+D671;HANGUL SYLLABLE HWAEG;Lo;0;L;;;;;N;;;;;
+D672;HANGUL SYLLABLE HWAEGG;Lo;0;L;;;;;N;;;;;
+D673;HANGUL SYLLABLE HWAEGS;Lo;0;L;;;;;N;;;;;
+D674;HANGUL SYLLABLE HWAEN;Lo;0;L;;;;;N;;;;;
+D675;HANGUL SYLLABLE HWAENI;Lo;0;L;;;;;N;;;;;
+D676;HANGUL SYLLABLE HWAENH;Lo;0;L;;;;;N;;;;;
+D677;HANGUL SYLLABLE HWAED;Lo;0;L;;;;;N;;;;;
+D678;HANGUL SYLLABLE HWAEL;Lo;0;L;;;;;N;;;;;
+D679;HANGUL SYLLABLE HWAELG;Lo;0;L;;;;;N;;;;;
+D67A;HANGUL SYLLABLE HWAELM;Lo;0;L;;;;;N;;;;;
+D67B;HANGUL SYLLABLE HWAELB;Lo;0;L;;;;;N;;;;;
+D67C;HANGUL SYLLABLE HWAELS;Lo;0;L;;;;;N;;;;;
+D67D;HANGUL SYLLABLE HWAELT;Lo;0;L;;;;;N;;;;;
+D67E;HANGUL SYLLABLE HWAELP;Lo;0;L;;;;;N;;;;;
+D67F;HANGUL SYLLABLE HWAELH;Lo;0;L;;;;;N;;;;;
+D680;HANGUL SYLLABLE HWAEM;Lo;0;L;;;;;N;;;;;
+D681;HANGUL SYLLABLE HWAEB;Lo;0;L;;;;;N;;;;;
+D682;HANGUL SYLLABLE HWAEBS;Lo;0;L;;;;;N;;;;;
+D683;HANGUL SYLLABLE HWAES;Lo;0;L;;;;;N;;;;;
+D684;HANGUL SYLLABLE HWAESS;Lo;0;L;;;;;N;;;;;
+D685;HANGUL SYLLABLE HWAENG;Lo;0;L;;;;;N;;;;;
+D686;HANGUL SYLLABLE HWAEJ;Lo;0;L;;;;;N;;;;;
+D687;HANGUL SYLLABLE HWAEC;Lo;0;L;;;;;N;;;;;
+D688;HANGUL SYLLABLE HWAEK;Lo;0;L;;;;;N;;;;;
+D689;HANGUL SYLLABLE HWAET;Lo;0;L;;;;;N;;;;;
+D68A;HANGUL SYLLABLE HWAEP;Lo;0;L;;;;;N;;;;;
+D68B;HANGUL SYLLABLE HWAEH;Lo;0;L;;;;;N;;;;;
+D68C;HANGUL SYLLABLE HOE;Lo;0;L;;;;;N;;;;;
+D68D;HANGUL SYLLABLE HOEG;Lo;0;L;;;;;N;;;;;
+D68E;HANGUL SYLLABLE HOEGG;Lo;0;L;;;;;N;;;;;
+D68F;HANGUL SYLLABLE HOEGS;Lo;0;L;;;;;N;;;;;
+D690;HANGUL SYLLABLE HOEN;Lo;0;L;;;;;N;;;;;
+D691;HANGUL SYLLABLE HOENI;Lo;0;L;;;;;N;;;;;
+D692;HANGUL SYLLABLE HOENH;Lo;0;L;;;;;N;;;;;
+D693;HANGUL SYLLABLE HOED;Lo;0;L;;;;;N;;;;;
+D694;HANGUL SYLLABLE HOEL;Lo;0;L;;;;;N;;;;;
+D695;HANGUL SYLLABLE HOELG;Lo;0;L;;;;;N;;;;;
+D696;HANGUL SYLLABLE HOELM;Lo;0;L;;;;;N;;;;;
+D697;HANGUL SYLLABLE HOELB;Lo;0;L;;;;;N;;;;;
+D698;HANGUL SYLLABLE HOELS;Lo;0;L;;;;;N;;;;;
+D699;HANGUL SYLLABLE HOELT;Lo;0;L;;;;;N;;;;;
+D69A;HANGUL SYLLABLE HOELP;Lo;0;L;;;;;N;;;;;
+D69B;HANGUL SYLLABLE HOELH;Lo;0;L;;;;;N;;;;;
+D69C;HANGUL SYLLABLE HOEM;Lo;0;L;;;;;N;;;;;
+D69D;HANGUL SYLLABLE HOEB;Lo;0;L;;;;;N;;;;;
+D69E;HANGUL SYLLABLE HOEBS;Lo;0;L;;;;;N;;;;;
+D69F;HANGUL SYLLABLE HOES;Lo;0;L;;;;;N;;;;;
+D6A0;HANGUL SYLLABLE HOESS;Lo;0;L;;;;;N;;;;;
+D6A1;HANGUL SYLLABLE HOENG;Lo;0;L;;;;;N;;;;;
+D6A2;HANGUL SYLLABLE HOEJ;Lo;0;L;;;;;N;;;;;
+D6A3;HANGUL SYLLABLE HOEC;Lo;0;L;;;;;N;;;;;
+D6A4;HANGUL SYLLABLE HOEK;Lo;0;L;;;;;N;;;;;
+D6A5;HANGUL SYLLABLE HOET;Lo;0;L;;;;;N;;;;;
+D6A6;HANGUL SYLLABLE HOEP;Lo;0;L;;;;;N;;;;;
+D6A7;HANGUL SYLLABLE HOEH;Lo;0;L;;;;;N;;;;;
+D6A8;HANGUL SYLLABLE HYO;Lo;0;L;;;;;N;;;;;
+D6A9;HANGUL SYLLABLE HYOG;Lo;0;L;;;;;N;;;;;
+D6AA;HANGUL SYLLABLE HYOGG;Lo;0;L;;;;;N;;;;;
+D6AB;HANGUL SYLLABLE HYOGS;Lo;0;L;;;;;N;;;;;
+D6AC;HANGUL SYLLABLE HYON;Lo;0;L;;;;;N;;;;;
+D6AD;HANGUL SYLLABLE HYONI;Lo;0;L;;;;;N;;;;;
+D6AE;HANGUL SYLLABLE HYONH;Lo;0;L;;;;;N;;;;;
+D6AF;HANGUL SYLLABLE HYOD;Lo;0;L;;;;;N;;;;;
+D6B0;HANGUL SYLLABLE HYOL;Lo;0;L;;;;;N;;;;;
+D6B1;HANGUL SYLLABLE HYOLG;Lo;0;L;;;;;N;;;;;
+D6B2;HANGUL SYLLABLE HYOLM;Lo;0;L;;;;;N;;;;;
+D6B3;HANGUL SYLLABLE HYOLB;Lo;0;L;;;;;N;;;;;
+D6B4;HANGUL SYLLABLE HYOLS;Lo;0;L;;;;;N;;;;;
+D6B5;HANGUL SYLLABLE HYOLT;Lo;0;L;;;;;N;;;;;
+D6B6;HANGUL SYLLABLE HYOLP;Lo;0;L;;;;;N;;;;;
+D6B7;HANGUL SYLLABLE HYOLH;Lo;0;L;;;;;N;;;;;
+D6B8;HANGUL SYLLABLE HYOM;Lo;0;L;;;;;N;;;;;
+D6B9;HANGUL SYLLABLE HYOB;Lo;0;L;;;;;N;;;;;
+D6BA;HANGUL SYLLABLE HYOBS;Lo;0;L;;;;;N;;;;;
+D6BB;HANGUL SYLLABLE HYOS;Lo;0;L;;;;;N;;;;;
+D6BC;HANGUL SYLLABLE HYOSS;Lo;0;L;;;;;N;;;;;
+D6BD;HANGUL SYLLABLE HYONG;Lo;0;L;;;;;N;;;;;
+D6BE;HANGUL SYLLABLE HYOJ;Lo;0;L;;;;;N;;;;;
+D6BF;HANGUL SYLLABLE HYOC;Lo;0;L;;;;;N;;;;;
+D6C0;HANGUL SYLLABLE HYOK;Lo;0;L;;;;;N;;;;;
+D6C1;HANGUL SYLLABLE HYOT;Lo;0;L;;;;;N;;;;;
+D6C2;HANGUL SYLLABLE HYOP;Lo;0;L;;;;;N;;;;;
+D6C3;HANGUL SYLLABLE HYOH;Lo;0;L;;;;;N;;;;;
+D6C4;HANGUL SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+D6C5;HANGUL SYLLABLE HUG;Lo;0;L;;;;;N;;;;;
+D6C6;HANGUL SYLLABLE HUGG;Lo;0;L;;;;;N;;;;;
+D6C7;HANGUL SYLLABLE HUGS;Lo;0;L;;;;;N;;;;;
+D6C8;HANGUL SYLLABLE HUN;Lo;0;L;;;;;N;;;;;
+D6C9;HANGUL SYLLABLE HUNI;Lo;0;L;;;;;N;;;;;
+D6CA;HANGUL SYLLABLE HUNH;Lo;0;L;;;;;N;;;;;
+D6CB;HANGUL SYLLABLE HUD;Lo;0;L;;;;;N;;;;;
+D6CC;HANGUL SYLLABLE HUL;Lo;0;L;;;;;N;;;;;
+D6CD;HANGUL SYLLABLE HULG;Lo;0;L;;;;;N;;;;;
+D6CE;HANGUL SYLLABLE HULM;Lo;0;L;;;;;N;;;;;
+D6CF;HANGUL SYLLABLE HULB;Lo;0;L;;;;;N;;;;;
+D6D0;HANGUL SYLLABLE HULS;Lo;0;L;;;;;N;;;;;
+D6D1;HANGUL SYLLABLE HULT;Lo;0;L;;;;;N;;;;;
+D6D2;HANGUL SYLLABLE HULP;Lo;0;L;;;;;N;;;;;
+D6D3;HANGUL SYLLABLE HULH;Lo;0;L;;;;;N;;;;;
+D6D4;HANGUL SYLLABLE HUM;Lo;0;L;;;;;N;;;;;
+D6D5;HANGUL SYLLABLE HUB;Lo;0;L;;;;;N;;;;;
+D6D6;HANGUL SYLLABLE HUBS;Lo;0;L;;;;;N;;;;;
+D6D7;HANGUL SYLLABLE HUS;Lo;0;L;;;;;N;;;;;
+D6D8;HANGUL SYLLABLE HUSS;Lo;0;L;;;;;N;;;;;
+D6D9;HANGUL SYLLABLE HUNG;Lo;0;L;;;;;N;;;;;
+D6DA;HANGUL SYLLABLE HUJ;Lo;0;L;;;;;N;;;;;
+D6DB;HANGUL SYLLABLE HUC;Lo;0;L;;;;;N;;;;;
+D6DC;HANGUL SYLLABLE HUK;Lo;0;L;;;;;N;;;;;
+D6DD;HANGUL SYLLABLE HUT;Lo;0;L;;;;;N;;;;;
+D6DE;HANGUL SYLLABLE HUP;Lo;0;L;;;;;N;;;;;
+D6DF;HANGUL SYLLABLE HUH;Lo;0;L;;;;;N;;;;;
+D6E0;HANGUL SYLLABLE HWEO;Lo;0;L;;;;;N;;;;;
+D6E1;HANGUL SYLLABLE HWEOG;Lo;0;L;;;;;N;;;;;
+D6E2;HANGUL SYLLABLE HWEOGG;Lo;0;L;;;;;N;;;;;
+D6E3;HANGUL SYLLABLE HWEOGS;Lo;0;L;;;;;N;;;;;
+D6E4;HANGUL SYLLABLE HWEON;Lo;0;L;;;;;N;;;;;
+D6E5;HANGUL SYLLABLE HWEONI;Lo;0;L;;;;;N;;;;;
+D6E6;HANGUL SYLLABLE HWEONH;Lo;0;L;;;;;N;;;;;
+D6E7;HANGUL SYLLABLE HWEOD;Lo;0;L;;;;;N;;;;;
+D6E8;HANGUL SYLLABLE HWEOL;Lo;0;L;;;;;N;;;;;
+D6E9;HANGUL SYLLABLE HWEOLG;Lo;0;L;;;;;N;;;;;
+D6EA;HANGUL SYLLABLE HWEOLM;Lo;0;L;;;;;N;;;;;
+D6EB;HANGUL SYLLABLE HWEOLB;Lo;0;L;;;;;N;;;;;
+D6EC;HANGUL SYLLABLE HWEOLS;Lo;0;L;;;;;N;;;;;
+D6ED;HANGUL SYLLABLE HWEOLT;Lo;0;L;;;;;N;;;;;
+D6EE;HANGUL SYLLABLE HWEOLP;Lo;0;L;;;;;N;;;;;
+D6EF;HANGUL SYLLABLE HWEOLH;Lo;0;L;;;;;N;;;;;
+D6F0;HANGUL SYLLABLE HWEOM;Lo;0;L;;;;;N;;;;;
+D6F1;HANGUL SYLLABLE HWEOB;Lo;0;L;;;;;N;;;;;
+D6F2;HANGUL SYLLABLE HWEOBS;Lo;0;L;;;;;N;;;;;
+D6F3;HANGUL SYLLABLE HWEOS;Lo;0;L;;;;;N;;;;;
+D6F4;HANGUL SYLLABLE HWEOSS;Lo;0;L;;;;;N;;;;;
+D6F5;HANGUL SYLLABLE HWEONG;Lo;0;L;;;;;N;;;;;
+D6F6;HANGUL SYLLABLE HWEOJ;Lo;0;L;;;;;N;;;;;
+D6F7;HANGUL SYLLABLE HWEOC;Lo;0;L;;;;;N;;;;;
+D6F8;HANGUL SYLLABLE HWEOK;Lo;0;L;;;;;N;;;;;
+D6F9;HANGUL SYLLABLE HWEOT;Lo;0;L;;;;;N;;;;;
+D6FA;HANGUL SYLLABLE HWEOP;Lo;0;L;;;;;N;;;;;
+D6FB;HANGUL SYLLABLE HWEOH;Lo;0;L;;;;;N;;;;;
+D6FC;HANGUL SYLLABLE HWE;Lo;0;L;;;;;N;;;;;
+D6FD;HANGUL SYLLABLE HWEG;Lo;0;L;;;;;N;;;;;
+D6FE;HANGUL SYLLABLE HWEGG;Lo;0;L;;;;;N;;;;;
+D6FF;HANGUL SYLLABLE HWEGS;Lo;0;L;;;;;N;;;;;
+D700;HANGUL SYLLABLE HWEN;Lo;0;L;;;;;N;;;;;
+D701;HANGUL SYLLABLE HWENI;Lo;0;L;;;;;N;;;;;
+D702;HANGUL SYLLABLE HWENH;Lo;0;L;;;;;N;;;;;
+D703;HANGUL SYLLABLE HWED;Lo;0;L;;;;;N;;;;;
+D704;HANGUL SYLLABLE HWEL;Lo;0;L;;;;;N;;;;;
+D705;HANGUL SYLLABLE HWELG;Lo;0;L;;;;;N;;;;;
+D706;HANGUL SYLLABLE HWELM;Lo;0;L;;;;;N;;;;;
+D707;HANGUL SYLLABLE HWELB;Lo;0;L;;;;;N;;;;;
+D708;HANGUL SYLLABLE HWELS;Lo;0;L;;;;;N;;;;;
+D709;HANGUL SYLLABLE HWELT;Lo;0;L;;;;;N;;;;;
+D70A;HANGUL SYLLABLE HWELP;Lo;0;L;;;;;N;;;;;
+D70B;HANGUL SYLLABLE HWELH;Lo;0;L;;;;;N;;;;;
+D70C;HANGUL SYLLABLE HWEM;Lo;0;L;;;;;N;;;;;
+D70D;HANGUL SYLLABLE HWEB;Lo;0;L;;;;;N;;;;;
+D70E;HANGUL SYLLABLE HWEBS;Lo;0;L;;;;;N;;;;;
+D70F;HANGUL SYLLABLE HWES;Lo;0;L;;;;;N;;;;;
+D710;HANGUL SYLLABLE HWESS;Lo;0;L;;;;;N;;;;;
+D711;HANGUL SYLLABLE HWENG;Lo;0;L;;;;;N;;;;;
+D712;HANGUL SYLLABLE HWEJ;Lo;0;L;;;;;N;;;;;
+D713;HANGUL SYLLABLE HWEC;Lo;0;L;;;;;N;;;;;
+D714;HANGUL SYLLABLE HWEK;Lo;0;L;;;;;N;;;;;
+D715;HANGUL SYLLABLE HWET;Lo;0;L;;;;;N;;;;;
+D716;HANGUL SYLLABLE HWEP;Lo;0;L;;;;;N;;;;;
+D717;HANGUL SYLLABLE HWEH;Lo;0;L;;;;;N;;;;;
+D718;HANGUL SYLLABLE HWI;Lo;0;L;;;;;N;;;;;
+D719;HANGUL SYLLABLE HWIG;Lo;0;L;;;;;N;;;;;
+D71A;HANGUL SYLLABLE HWIGG;Lo;0;L;;;;;N;;;;;
+D71B;HANGUL SYLLABLE HWIGS;Lo;0;L;;;;;N;;;;;
+D71C;HANGUL SYLLABLE HWIN;Lo;0;L;;;;;N;;;;;
+D71D;HANGUL SYLLABLE HWINI;Lo;0;L;;;;;N;;;;;
+D71E;HANGUL SYLLABLE HWINH;Lo;0;L;;;;;N;;;;;
+D71F;HANGUL SYLLABLE HWID;Lo;0;L;;;;;N;;;;;
+D720;HANGUL SYLLABLE HWIL;Lo;0;L;;;;;N;;;;;
+D721;HANGUL SYLLABLE HWILG;Lo;0;L;;;;;N;;;;;
+D722;HANGUL SYLLABLE HWILM;Lo;0;L;;;;;N;;;;;
+D723;HANGUL SYLLABLE HWILB;Lo;0;L;;;;;N;;;;;
+D724;HANGUL SYLLABLE HWILS;Lo;0;L;;;;;N;;;;;
+D725;HANGUL SYLLABLE HWILT;Lo;0;L;;;;;N;;;;;
+D726;HANGUL SYLLABLE HWILP;Lo;0;L;;;;;N;;;;;
+D727;HANGUL SYLLABLE HWILH;Lo;0;L;;;;;N;;;;;
+D728;HANGUL SYLLABLE HWIM;Lo;0;L;;;;;N;;;;;
+D729;HANGUL SYLLABLE HWIB;Lo;0;L;;;;;N;;;;;
+D72A;HANGUL SYLLABLE HWIBS;Lo;0;L;;;;;N;;;;;
+D72B;HANGUL SYLLABLE HWIS;Lo;0;L;;;;;N;;;;;
+D72C;HANGUL SYLLABLE HWISS;Lo;0;L;;;;;N;;;;;
+D72D;HANGUL SYLLABLE HWING;Lo;0;L;;;;;N;;;;;
+D72E;HANGUL SYLLABLE HWIJ;Lo;0;L;;;;;N;;;;;
+D72F;HANGUL SYLLABLE HWIC;Lo;0;L;;;;;N;;;;;
+D730;HANGUL SYLLABLE HWIK;Lo;0;L;;;;;N;;;;;
+D731;HANGUL SYLLABLE HWIT;Lo;0;L;;;;;N;;;;;
+D732;HANGUL SYLLABLE HWIP;Lo;0;L;;;;;N;;;;;
+D733;HANGUL SYLLABLE HWIH;Lo;0;L;;;;;N;;;;;
+D734;HANGUL SYLLABLE HYU;Lo;0;L;;;;;N;;;;;
+D735;HANGUL SYLLABLE HYUG;Lo;0;L;;;;;N;;;;;
+D736;HANGUL SYLLABLE HYUGG;Lo;0;L;;;;;N;;;;;
+D737;HANGUL SYLLABLE HYUGS;Lo;0;L;;;;;N;;;;;
+D738;HANGUL SYLLABLE HYUN;Lo;0;L;;;;;N;;;;;
+D739;HANGUL SYLLABLE HYUNI;Lo;0;L;;;;;N;;;;;
+D73A;HANGUL SYLLABLE HYUNH;Lo;0;L;;;;;N;;;;;
+D73B;HANGUL SYLLABLE HYUD;Lo;0;L;;;;;N;;;;;
+D73C;HANGUL SYLLABLE HYUL;Lo;0;L;;;;;N;;;;;
+D73D;HANGUL SYLLABLE HYULG;Lo;0;L;;;;;N;;;;;
+D73E;HANGUL SYLLABLE HYULM;Lo;0;L;;;;;N;;;;;
+D73F;HANGUL SYLLABLE HYULB;Lo;0;L;;;;;N;;;;;
+D740;HANGUL SYLLABLE HYULS;Lo;0;L;;;;;N;;;;;
+D741;HANGUL SYLLABLE HYULT;Lo;0;L;;;;;N;;;;;
+D742;HANGUL SYLLABLE HYULP;Lo;0;L;;;;;N;;;;;
+D743;HANGUL SYLLABLE HYULH;Lo;0;L;;;;;N;;;;;
+D744;HANGUL SYLLABLE HYUM;Lo;0;L;;;;;N;;;;;
+D745;HANGUL SYLLABLE HYUB;Lo;0;L;;;;;N;;;;;
+D746;HANGUL SYLLABLE HYUBS;Lo;0;L;;;;;N;;;;;
+D747;HANGUL SYLLABLE HYUS;Lo;0;L;;;;;N;;;;;
+D748;HANGUL SYLLABLE HYUSS;Lo;0;L;;;;;N;;;;;
+D749;HANGUL SYLLABLE HYUNG;Lo;0;L;;;;;N;;;;;
+D74A;HANGUL SYLLABLE HYUJ;Lo;0;L;;;;;N;;;;;
+D74B;HANGUL SYLLABLE HYUC;Lo;0;L;;;;;N;;;;;
+D74C;HANGUL SYLLABLE HYUK;Lo;0;L;;;;;N;;;;;
+D74D;HANGUL SYLLABLE HYUT;Lo;0;L;;;;;N;;;;;
+D74E;HANGUL SYLLABLE HYUP;Lo;0;L;;;;;N;;;;;
+D74F;HANGUL SYLLABLE HYUH;Lo;0;L;;;;;N;;;;;
+D750;HANGUL SYLLABLE HEU;Lo;0;L;;;;;N;;;;;
+D751;HANGUL SYLLABLE HEUG;Lo;0;L;;;;;N;;;;;
+D752;HANGUL SYLLABLE HEUGG;Lo;0;L;;;;;N;;;;;
+D753;HANGUL SYLLABLE HEUGS;Lo;0;L;;;;;N;;;;;
+D754;HANGUL SYLLABLE HEUN;Lo;0;L;;;;;N;;;;;
+D755;HANGUL SYLLABLE HEUNI;Lo;0;L;;;;;N;;;;;
+D756;HANGUL SYLLABLE HEUNH;Lo;0;L;;;;;N;;;;;
+D757;HANGUL SYLLABLE HEUD;Lo;0;L;;;;;N;;;;;
+D758;HANGUL SYLLABLE HEUL;Lo;0;L;;;;;N;;;;;
+D759;HANGUL SYLLABLE HEULG;Lo;0;L;;;;;N;;;;;
+D75A;HANGUL SYLLABLE HEULM;Lo;0;L;;;;;N;;;;;
+D75B;HANGUL SYLLABLE HEULB;Lo;0;L;;;;;N;;;;;
+D75C;HANGUL SYLLABLE HEULS;Lo;0;L;;;;;N;;;;;
+D75D;HANGUL SYLLABLE HEULT;Lo;0;L;;;;;N;;;;;
+D75E;HANGUL SYLLABLE HEULP;Lo;0;L;;;;;N;;;;;
+D75F;HANGUL SYLLABLE HEULH;Lo;0;L;;;;;N;;;;;
+D760;HANGUL SYLLABLE HEUM;Lo;0;L;;;;;N;;;;;
+D761;HANGUL SYLLABLE HEUB;Lo;0;L;;;;;N;;;;;
+D762;HANGUL SYLLABLE HEUBS;Lo;0;L;;;;;N;;;;;
+D763;HANGUL SYLLABLE HEUS;Lo;0;L;;;;;N;;;;;
+D764;HANGUL SYLLABLE HEUSS;Lo;0;L;;;;;N;;;;;
+D765;HANGUL SYLLABLE HEUNG;Lo;0;L;;;;;N;;;;;
+D766;HANGUL SYLLABLE HEUJ;Lo;0;L;;;;;N;;;;;
+D767;HANGUL SYLLABLE HEUC;Lo;0;L;;;;;N;;;;;
+D768;HANGUL SYLLABLE HEUK;Lo;0;L;;;;;N;;;;;
+D769;HANGUL SYLLABLE HEUT;Lo;0;L;;;;;N;;;;;
+D76A;HANGUL SYLLABLE HEUP;Lo;0;L;;;;;N;;;;;
+D76B;HANGUL SYLLABLE HEUH;Lo;0;L;;;;;N;;;;;
+D76C;HANGUL SYLLABLE HYI;Lo;0;L;;;;;N;;;;;
+D76D;HANGUL SYLLABLE HYIG;Lo;0;L;;;;;N;;;;;
+D76E;HANGUL SYLLABLE HYIGG;Lo;0;L;;;;;N;;;;;
+D76F;HANGUL SYLLABLE HYIGS;Lo;0;L;;;;;N;;;;;
+D770;HANGUL SYLLABLE HYIN;Lo;0;L;;;;;N;;;;;
+D771;HANGUL SYLLABLE HYINI;Lo;0;L;;;;;N;;;;;
+D772;HANGUL SYLLABLE HYINH;Lo;0;L;;;;;N;;;;;
+D773;HANGUL SYLLABLE HYID;Lo;0;L;;;;;N;;;;;
+D774;HANGUL SYLLABLE HYIL;Lo;0;L;;;;;N;;;;;
+D775;HANGUL SYLLABLE HYILG;Lo;0;L;;;;;N;;;;;
+D776;HANGUL SYLLABLE HYILM;Lo;0;L;;;;;N;;;;;
+D777;HANGUL SYLLABLE HYILB;Lo;0;L;;;;;N;;;;;
+D778;HANGUL SYLLABLE HYILS;Lo;0;L;;;;;N;;;;;
+D779;HANGUL SYLLABLE HYILT;Lo;0;L;;;;;N;;;;;
+D77A;HANGUL SYLLABLE HYILP;Lo;0;L;;;;;N;;;;;
+D77B;HANGUL SYLLABLE HYILH;Lo;0;L;;;;;N;;;;;
+D77C;HANGUL SYLLABLE HYIM;Lo;0;L;;;;;N;;;;;
+D77D;HANGUL SYLLABLE HYIB;Lo;0;L;;;;;N;;;;;
+D77E;HANGUL SYLLABLE HYIBS;Lo;0;L;;;;;N;;;;;
+D77F;HANGUL SYLLABLE HYIS;Lo;0;L;;;;;N;;;;;
+D780;HANGUL SYLLABLE HYISS;Lo;0;L;;;;;N;;;;;
+D781;HANGUL SYLLABLE HYING;Lo;0;L;;;;;N;;;;;
+D782;HANGUL SYLLABLE HYIJ;Lo;0;L;;;;;N;;;;;
+D783;HANGUL SYLLABLE HYIC;Lo;0;L;;;;;N;;;;;
+D784;HANGUL SYLLABLE HYIK;Lo;0;L;;;;;N;;;;;
+D785;HANGUL SYLLABLE HYIT;Lo;0;L;;;;;N;;;;;
+D786;HANGUL SYLLABLE HYIP;Lo;0;L;;;;;N;;;;;
+D787;HANGUL SYLLABLE HYIH;Lo;0;L;;;;;N;;;;;
+D788;HANGUL SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+D789;HANGUL SYLLABLE HIG;Lo;0;L;;;;;N;;;;;
+D78A;HANGUL SYLLABLE HIGG;Lo;0;L;;;;;N;;;;;
+D78B;HANGUL SYLLABLE HIGS;Lo;0;L;;;;;N;;;;;
+D78C;HANGUL SYLLABLE HIN;Lo;0;L;;;;;N;;;;;
+D78D;HANGUL SYLLABLE HINI;Lo;0;L;;;;;N;;;;;
+D78E;HANGUL SYLLABLE HINH;Lo;0;L;;;;;N;;;;;
+D78F;HANGUL SYLLABLE HID;Lo;0;L;;;;;N;;;;;
+D790;HANGUL SYLLABLE HIL;Lo;0;L;;;;;N;;;;;
+D791;HANGUL SYLLABLE HILG;Lo;0;L;;;;;N;;;;;
+D792;HANGUL SYLLABLE HILM;Lo;0;L;;;;;N;;;;;
+D793;HANGUL SYLLABLE HILB;Lo;0;L;;;;;N;;;;;
+D794;HANGUL SYLLABLE HILS;Lo;0;L;;;;;N;;;;;
+D795;HANGUL SYLLABLE HILT;Lo;0;L;;;;;N;;;;;
+D796;HANGUL SYLLABLE HILP;Lo;0;L;;;;;N;;;;;
+D797;HANGUL SYLLABLE HILH;Lo;0;L;;;;;N;;;;;
+D798;HANGUL SYLLABLE HIM;Lo;0;L;;;;;N;;;;;
+D799;HANGUL SYLLABLE HIB;Lo;0;L;;;;;N;;;;;
+D79A;HANGUL SYLLABLE HIBS;Lo;0;L;;;;;N;;;;;
+D79B;HANGUL SYLLABLE HIS;Lo;0;L;;;;;N;;;;;
+D79C;HANGUL SYLLABLE HISS;Lo;0;L;;;;;N;;;;;
+D79D;HANGUL SYLLABLE HING;Lo;0;L;;;;;N;;;;;
+D79E;HANGUL SYLLABLE HIJ;Lo;0;L;;;;;N;;;;;
+D79F;HANGUL SYLLABLE HIC;Lo;0;L;;;;;N;;;;;
+D7A0;HANGUL SYLLABLE HIK;Lo;0;L;;;;;N;;;;;
+D7A1;HANGUL SYLLABLE HIT;Lo;0;L;;;;;N;;;;;
+D7A2;HANGUL SYLLABLE HIP;Lo;0;L;;;;;N;;;;;
+D7A3;HANGUL SYLLABLE HIH;Lo;0;L;;;;;N;;;;;
+F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;;
+F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;;
+F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;;
+F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;;
+F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;;
+F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;;
+F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;;
+F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;;
+F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;;
+F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;;
+F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;;
+F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;;
+F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;;
+F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;;
+F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;;
+F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;;
+F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;;
+F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;;
+F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;;
+F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;;
+F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;;
+F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;;
+F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;;
+F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;;
+F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;;
+F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;;
+F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;;
+F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;;
+F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;;
+F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;;
+F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;;
+F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;;
+F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;;
+F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;;
+F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;;
+F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;;
+F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;;
+F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;;
+F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;;
+F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;;
+F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;;
+F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;;
+F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;;
+F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;;
+F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;;
+F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;;
+F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;;
+F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;;
+F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;;
+F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;;
+F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;;
+F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;;
+F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;;
+F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;;
+F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;;
+F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;;
+F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;;
+F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;;
+F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;;
+F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;;
+F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;;
+F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;;
+F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;;
+F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;;
+F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;;
+F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;;
+F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;;
+F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;;
+F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;;
+F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;;
+F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;;
+F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;;
+F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;;
+F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;;
+F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;;
+F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;;
+F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;;
+F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;;
+F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;;
+F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;;
+F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;;
+F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;;
+F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;;
+F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;;
+F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;;
+F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;;
+F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;;
+F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;;
+F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;;
+F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;;
+F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;;
+F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;;
+F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;;
+F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;;
+F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;;
+F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;;
+F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;;
+F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;;
+F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;;
+F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;;
+F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;;
+F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;;
+F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;;
+F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;;
+F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;;
+F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;;
+F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;;
+F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;;
+F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;;
+F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;;
+F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;;
+F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;;
+F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;;
+F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;;
+F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;;
+F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;;
+F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;;
+F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;;
+F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;;
+F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;;
+F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;;
+F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;;
+F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;;
+F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;;
+F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;;
+F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;;
+F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;;
+F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;;
+F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;;
+F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;;
+F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;;
+F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;;
+F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;;
+F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;;
+F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;;
+F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;;
+F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;;
+F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;;
+F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;;
+F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;;
+F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;;
+F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;;
+F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;;
+F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;;
+F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;;
+F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;;
+F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;;
+F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;;
+F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;;
+F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;;
+F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;;
+F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;;
+F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;;
+F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;;
+F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;;
+F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;;
+F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;;
+F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;;
+F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;;
+F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;;
+F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;;
+F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;;
+F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;;
+F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;;
+F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;;
+F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;;
+F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;;
+F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;;
+F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;;
+F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;;
+F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;;
+F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;;
+F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;;
+F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;;
+F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;;
+F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;;
+F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;;
+F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;;
+F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;;
+F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;;
+F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;;
+F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;;
+F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;;
+F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;;
+F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;;
+F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;;
+F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;;
+F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;;
+F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;;
+F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;;
+F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;;
+F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;;
+F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;;
+F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;;
+F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;;
+F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;;
+F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;;
+F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;;
+F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;;
+F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;;
+F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;;
+F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;;
+F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;;
+F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;;
+F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;;
+F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;;
+F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;;
+F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;;
+F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;;
+F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;;
+F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;;
+F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;;
+F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;;
+F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;;
+F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;;
+F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;;
+F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;;
+F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;;
+F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;;
+F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;;
+F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;;
+F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;;
+F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;;
+F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;;
+F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;;
+F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;;
+F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;;
+F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;;
+F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;;
+F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;;
+F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;;
+F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;;
+F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;;
+F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;;
+F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;;
+F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;;
+F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;;
+F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;;
+F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;;
+F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;;
+F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;;
+F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;;
+F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;;
+F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;;
+F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;;
+F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;;
+F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;;
+F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;;
+F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;;
+F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;;
+F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;;
+F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;;
+F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;;
+F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;;
+F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;;
+F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;;
+FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;;
+FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;;
+FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;;
+FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;;
+FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;;
+FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;;
+FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;;
+FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;;
+FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;;
+FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;;
+FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;;
+FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;;
+FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;;
+FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;;
+FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;;
+FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;;
+FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;;
+FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;;
+FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;;
+FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;;
+FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;;
+FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;;
+FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;;
+FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;;
+FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;;
+FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;;
+FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;;
+FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;;
+FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;;
+FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;;
+FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;;
+FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;;
+FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;;
+FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;;
+FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;;
+FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;;
+FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;;
+FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;;
+FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;;
+FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;;
+FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;;
+FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;;
+FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;;
+FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;;
+FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;;
+FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;;
+FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;;
+FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;;
+FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;;
+FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;;
+FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;;
+FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;;
+FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;;
+FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;;
+FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;;
+FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;;
+FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;;
+FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;;
+FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;;
+FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;;
+FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;;
+FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;;
+FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;;
+FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;;
+FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;;
+FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;;
+FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;;
+FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;;
+FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;;
+FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;;
+FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;;
+FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;;
+FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;;
+FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;;
+FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;;
+FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;;
+FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;;
+FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;;
+FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;;
+FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;;
+FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;;
+FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;;
+FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;;
+FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;;
+FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;;
+FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;;
+FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;;
+FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;;
+FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;;
+FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;;
+FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;;
+FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;;
+FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;;
+FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;;
+FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;;
+FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;;
+FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;;
+FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;;
+FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;;
+FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;;
+FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;;
+FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;;
+FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;;
+FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;;
+FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;;
+FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;;
+FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;;
+FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;;
+FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;;
+FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;;
+FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;;
+FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;;
+FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;;
+FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;;
+FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;;
+FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;;
+FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;;
+FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;;
+FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;;
+FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;;
+FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;;
+FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;;
+FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;;
+FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;;
+FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;;
+FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;;
+FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;;
+FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;;
+FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;;
+FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;;
+FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;;
+FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;;
+FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;;
+FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;;
+FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;;
+FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;;
+FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;;
+FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;;
+FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;;
+FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;;
+FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;;
+FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;;
+FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;;
+FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;;
+FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;;
+FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;;
+FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;;
+FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;;
+FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;;
+FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;;
+FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;;
+FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;;
+FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;;
+FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;;
+FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;;
+FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;;
+FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;;
+FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;;
+FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;;
+FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;;
+FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;;
+FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;;
+FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;;
+FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;;
+FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;;
+FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;;
+FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;;
+FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;;
+FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;;
+FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;;
+FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;;
+FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;;
+FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;;
+FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;;
+FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;;
+FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;;
+FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;;
+FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;;
+FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;;
+FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;;
+FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;;
+FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;;
+FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;;
+FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;;
+FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;;
+FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;;
+FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;;
+FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;;
+FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;;
+FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;;
+FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;;
+FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;;
+FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;;
+FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;;
+FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;;
+FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;;
+FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;;
+FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;;
+FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;;
+FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;;
+FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;;
+FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;;
+FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;;
+FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;;
+FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;;
+FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;;
+FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;;
+FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;;
+FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;;
+FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;;
+FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;;
+FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;;
+FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;;
+FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;;
+FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;;
+FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;;
+FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;;
+FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;;
+FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;;
+FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;;
+FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;;
+FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;;
+FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;;
+FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;;
+FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;;
+FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;;
+FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;;
+FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;;
+FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;;
+FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;;
+FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;;
+FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;;
+FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;;
+FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;;
+FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;;
+FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;;
+FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;;
+FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;;
+FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;;
+FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;;
+FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;;
+FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;;
+FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;;
+FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;;
+FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;;
+FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;;
+FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;;
+FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;;
+FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;;
+FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;;
+FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;;
+FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;;
+FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;;
+FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;;
+FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;;
+FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;;
+FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;;
+FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;;
+FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;;
+FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;;
+FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;;
+FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;;
+FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;;
+FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;;
+FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;;
+FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;;
+FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;;
+FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;;
+FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;;
+FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;;
+FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;;
+FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;;
+FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;;
+FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;;
+FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;;
+FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;;
+FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;;
+FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;;
+FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;;
+FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;;
+FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;;
+FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;;
+FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;;
+FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;;
+FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;;
+FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;;
+FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;;
+FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;;
+FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;;
+FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;;
+FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;;
+FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;;
+FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;;
+FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;;
+FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;;
+FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;;
+FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;;
+FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;;
+FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;;
+FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;;
+FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;;
+FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;;
+FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;;
+FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;;
+FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;;
+FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;;
+FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;;
+FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;;
+FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;;
+FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;;
+FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;;
+FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;;
+FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;;
+FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;;
+FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;;
+FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;;
+FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;;
+FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;;
+FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;;
+FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;;
+FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;;
+FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;;
+FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;;
+FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;;
+FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;;
+FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;;
+FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;;
+FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;;
+FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;;
+FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;;
+FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;;
+FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;;
+FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;;
+FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;;
+FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;;
+FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;;
+FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;;
+FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;;
+FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;;
+FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;;
+FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;;
+FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;;
+FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;;
+FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;;
+FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;;
+FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;;
+FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;;
+FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;;
+FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;;
+FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;;
+FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;;
+FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;;
+FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;;
+FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;;
+FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;;
+FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;;
+FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;;
+FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;;
+FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;;
+FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;;
+FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;;
+FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;;
+FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;;
+FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;;
+FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;;
+FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;;
+FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;;
+FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;;
+FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;;
+FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;;
+FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;;
+FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;;
+FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;;
+FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;;
+FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;;
+FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;;
+FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;;
+FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;;
+FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;;
+FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;;
+FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;;
+FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;;
+FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;;
+FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;;
+FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;;
+FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;;
+FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;;
+FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;;
+FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;;
+FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;;
+FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;;
+FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;;
+FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;;
+FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;;
+FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;;
+FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;;
+FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;;
+FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;;
+FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;;
+FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;;
+FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;;
+FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;;
+FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;;
+FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;;
+FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;;
+FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;;
+FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;;
+FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;;
+FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;;
+FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;;
+FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;;
+FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;;
+FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;;
+FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;;
+FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;;
+FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;;
+FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;;
+FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;;
+FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;;
+FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;;
+FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;;
+FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;;
+FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;;
+FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;;
+FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;;
+FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;;
+FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;;
+FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;;
+FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;;
+FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;;
+FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;;
+FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;;
+FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;;
+FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;;
+FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;;
+FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;;
+FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;;
+FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;;
+FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;;
+FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;;
+FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;;
+FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;;
+FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;;
+FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;;
+FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;;
+FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;;
+FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;;
+FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;;
+FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;;
+FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;;
+FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;;
+FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;;
+FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;;
+FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;;
+FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;;
+FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;;
+FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;;
+FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;;
+FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;;
+FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;;
+FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;;
+FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;;
+FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;;
+FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;;
+FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;;
+FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;;
+FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;;
+FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;;
+FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;;
+FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;;
+FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;;
+FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;;
+FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;;
+FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;;
+FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;;
+FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;;
+FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;;
+FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;;
+FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;;
+FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;;
+FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;;
+FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;;
+FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;;
+FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;;
+FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;;
+FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;;
+FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;;
+FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;;
+FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;;
+FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;;
+FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;;
+FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;;
+FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;;
+FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;;
+FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;;
+FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;;
+FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;;
+FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;;
+FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;;
+FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;;
+FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;;
+FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;;
+FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;;
+FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;;
+FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;;
+FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;;
+FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;;
+FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;;
+FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;;
+FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;;
+FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;;
+FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;;
+FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;;
+FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;;
+FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;;
+FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;;
+FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;;
+FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;;
+FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;;
+FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;;
+FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;;
+FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;;
+FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;;
+FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;;
+FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;;
+FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;;
+FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;;
+FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;;
+FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;;
+FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;;
+FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;;
+FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;;
+FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;;
+FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;;
+FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;;
+FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;;
+FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;;
+FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;;
+FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;;
+FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;;
+FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;;
+FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;;
+FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;;
+FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;;
+FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;;
+FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;;
+FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;;
+FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;;
+FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;;
+FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;;
+FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;;
+FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;;
+FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;;
+FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;;
+FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;;
+FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;;
+FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;;
+FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;;
+FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;;
+FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;;
+FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;;
+FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;;
+FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;;
+FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;;
+FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;;
+FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;;
+FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;;
+FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;;
+FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;;
+FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;;
+FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;;
+FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;;
+FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;;
+FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;;
+FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;;
+FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;;
+FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;;
+FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;;
+FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;;
+FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;;
+FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;;
+FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;;
+FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;;
+FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;;
+FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;;
+FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;;
+FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;;
+FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;;
+FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;;
+FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;;
+FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;;
+FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;;
+FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;;
+FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;;
+FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;;
+FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;;
+FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;;
+FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;;
+FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;;
+FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;;
+FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;;
+FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;;
+FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;;
+FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;;
+FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;;
+FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;;
+FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;;
+FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;;
+FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;;
+FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;;
+FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;;
+FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;;
+FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;;
+FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;;
+FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;;
+FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;;
+FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;;
+FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;;
+FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;;
+FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;;
+FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;;
+FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;;
+FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;;
+FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;;
+FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;;
+FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;;
+FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;;
+FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;;
+FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;;
+FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;;
+FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;;
+FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;;
+FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;;
+FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;;
+FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;;
+FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;;
+FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;;
+FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;;
+FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;;
+FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;;
+FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;;
+FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;;
+FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;;
+FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;;
+FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;;
+FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;;
+FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;;
+FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;;
+FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;;
+FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;;
+FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;;
+FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;;
+FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;;
+FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;;
+FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;;
+FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;;
+FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;;
+FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;;
+FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;;
+FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;;
+FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;;
+FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;;
+FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;;
+FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;;
+FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;;
+FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;;
+FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;;
+FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;;
+FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;;
+FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;;
+FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;;
+FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;;
+FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;;
+FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;;
+FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;;
+FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;;
+FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;;
+FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;;
+FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;;
+FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;;
+FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;;
+FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;;
+FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;;
+FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;;
+FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;;
+FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;;
+FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;;
+FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;;
+FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;;
+FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;;
+FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;;
+FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;;
+FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;;
+FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;;
+FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;;
+FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;;
+FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;;
+FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;;
+FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;;
+FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;;
+FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;;
+FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;;
+FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;;
+FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;;
+FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;;
+FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;;
+FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;;
+FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;;
+FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;;
+FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;;
+FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;;
+FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;;
+FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;;
+FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;;
+FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;;
+FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;;
+FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;;
+FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;;
+FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;;
+FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;;
+FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;;
+FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;;
+FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;;
+FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;;
+FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;;
+FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;;
+FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;;
+FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;;
+FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;;
+FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;;
+FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;;
+FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;;
+FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;;
+FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;;
+FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;;
+FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;;
+FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;;
+FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;;
+FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;;
+FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;;
+FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;;
+FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;;
+FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;;
+FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;;
+FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;;
+FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;;
+FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;;
+FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;;
+FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;;
+FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;;
+FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;;
+FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;;
+FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;;
+FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;;
+FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;;
+FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;;
+FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;;
+FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;;
+FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;;
+FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;;
+FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;;
+FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;;
+FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;;
+FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;;
+FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;;
+FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;;
+FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;;
+FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;;
+FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;;
+FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;;
+FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;;
+FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;;
+FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;;
+FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;;
+FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;;
+FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;;
+FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;;
+FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;;
+FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;;
+FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;;
+FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;;
+FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;;
+FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;;
+FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;;
+FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;;
+FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;;
+FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;;
+FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;;
+FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;;
+FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;;
+FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;;
+FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;;
+FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;;
+FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;;
+FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;;
+FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;;
+FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;;
+FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;;
+FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;;
+FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;;
+FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;;
+FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;;
+FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;;
+FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;;
+FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;;
+FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;;
+FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;;
+FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;;
+FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;;
+FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;;
+FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;;
+FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;;
+FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;;
+FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;;
+FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;;
+FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;;
+FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;;
+FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;;
+FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;;
+FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;;
+FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;;
+FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;;
+FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;;
+FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;;
+FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;;
+FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;;
+FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;;
+FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;;
+FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;;
+FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;;
+FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;;
+FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;;
+FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;;
+FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;;
+FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;;
+FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;;
+FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;;
+FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;;
+FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;;
+FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;;
+FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;;
+FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;;
+FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;;
+FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;;
+FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;;
+FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;;
+FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;;
+FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;;
+FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;;
+FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;;
+FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;;
+FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;;
+FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;;
+FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;;
+FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;;
+FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;;
+FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;;
+FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
+FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;;
+FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;;
+FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;;
+FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;;
+FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;;
+FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;;
+FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;;
+FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;;
+FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;;
+FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;;
+FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;;
+FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;;
+FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;;
+FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;;
+FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;;
+FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;;
+FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;;
+FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;;
+FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;;
+FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;;
+FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;;
+FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;;
+FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;;
+FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;;
+FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;;
+FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;;
+FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;;
+FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;;
+FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;;
+FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;;
+FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;;
+FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;;
+FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;;
+FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;;
+FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;;
+FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;;
+FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;;
+FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;;
+FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;;
+FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;;
+FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;;
+FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;;
+FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;;
+FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;;
+FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;;
+FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;;
+FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;;
+FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;;
+FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;;
+FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;;
+FE45;SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;;
+FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;;
+FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;;
+FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;;
+FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;;
+FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;;
+FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;;
+FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;;
+FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;;
+FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;;
+FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;;
+FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;;
+FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;;
+FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;;
+FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;;
+FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;;
+FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;;
+FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
+FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;;
+FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;;
+FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;;
+FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;;
+FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;;
+FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;;
+FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;;
+FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;;
+FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;;
+FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;;
+FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;;
+FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;;
+FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;;
+FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;;
+FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;;
+FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;;
+FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;;
+FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;;
+FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;;
+FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;;
+FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;;
+FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;;
+FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;;
+FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;;
+FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;;
+FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;;
+FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;;
+FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;;
+FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;;
+FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;;
+FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;;
+FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;;
+FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;;
+FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;;
+FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;;
+FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;;
+FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;;
+FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;;
+FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;;
+FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;;
+FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;;
+FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;;
+FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;;
+FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;;
+FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;;
+FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;;
+FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;;
+FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;;
+FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;;
+FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;;
+FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;;
+FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;;
+FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;;
+FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;;
+FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;;
+FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;;
+FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;;
+FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;;
+FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;;
+FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;;
+FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;;
+FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;;
+FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;;
+FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;;
+FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;;
+FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;;
+FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;;
+FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;;
+FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;;
+FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;;
+FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;;
+FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;;
+FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;;
+FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;;
+FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;;
+FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;;
+FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;;
+FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;;
+FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;;
+FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;;
+FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;;
+FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;;
+FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;;
+FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;;
+FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;;
+FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;;
+FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;;
+FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;;
+FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;;
+FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;;
+FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;;
+FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;;
+FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;;
+FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;;
+FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;;
+FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;;
+FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;;
+FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;;
+FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;;
+FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;;
+FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;;
+FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;;
+FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;;
+FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;;
+FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;;
+FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;;
+FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;;
+FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;;
+FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;;
+FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;;
+FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;;
+FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;;
+FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;;
+FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;;
+FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;;
+FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;;
+FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;;
+FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;;
+FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;;
+FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;;
+FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;;
+FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;;
+FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;;
+FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;;
+FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;;
+FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;;
+FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;;
+FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;;
+FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;;
+FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;;
+FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;;
+FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;;
+FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;;
+FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;;
+FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;;
+FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;;
+FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;;
+FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;;
+FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;;
+FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;;
+FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;;
+FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;;
+FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;;
+FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
+FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;;
+FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;;
+FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;;
+FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;;
+FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;;
+FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;;
+FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;;
+FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;;
+FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;;
+FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;;
+FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;;
+FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
+FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;;
+FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;;
+FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;;
+FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;;
+FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;;
+FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;;
+FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;;
+FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;;
+FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;;
+FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;;
+FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;;
+FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;;
+FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;;
+FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;;
+FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;;
+FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;;
+FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;;
+FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41;
+FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42;
+FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43;
+FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44;
+FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45;
+FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46;
+FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47;
+FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48;
+FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49;
+FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A;
+FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B;
+FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C;
+FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D;
+FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E;
+FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F;
+FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50;
+FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51;
+FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52;
+FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53;
+FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54;
+FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55;
+FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56;
+FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57;
+FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58;
+FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59;
+FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A;
+FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;;
+FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;;
+FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;;
+FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;;
+FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;;
+FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;;
+FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21
+FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22
+FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23
+FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24
+FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25
+FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26
+FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27
+FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28
+FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29
+FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A
+FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B
+FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C
+FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D
+FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E
+FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F
+FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30
+FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31
+FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32
+FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33
+FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34
+FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35
+FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36
+FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37
+FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38
+FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39
+FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A
+FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;;
+FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;;
+FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;;
+FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;;
+FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;*;;;
+FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;*;;;
+FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;;
+FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;;
+FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;;
+FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;;
+FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;;
+FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;;
+FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;;
+FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;;
+FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;;
+FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;;
+FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;;
+FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;;
+FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;;
+FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;;
+FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;;
+FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;;
+FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;;
+FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;;
+FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;;
+FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;;
+FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;;
+FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;;
+FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;;
+FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;;
+FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;;
+FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;;
+FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;;
+FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;;
+FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;;
+FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;;
+FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;;
+FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;;
+FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;;
+FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;;
+FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;;
+FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;;
+FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;;
+FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;;
+FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;;
+FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;;
+FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;;
+FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;;
+FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;;
+FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;;
+FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;;
+FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;;
+FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;;
+FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;;
+FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;;
+FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;;
+FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;;
+FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;;
+FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;;
+FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;;
+FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;;
+FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;;
+FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;;
+FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;;
+FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;;
+FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;;
+FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;;
+FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;;
+FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;;
+FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;;
+FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;;
+FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
+FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;;
+FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;;
+FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;;
+FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;;
+FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;;
+FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;;
+FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;;
+FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;;
+FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;;
+FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;;
+FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;;
+FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;;
+FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;;
+FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;;
+FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;;
+FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;;
+FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;;
+FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;;
+FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;;
+FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;;
+FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;;
+FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;;
+FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;;
+FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;;
+FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;;
+FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;;
+FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;;
+FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;;
+FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;;
+FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;;
+FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;;
+FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;;
+FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;;
+FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;;
+FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;;
+FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;;
+FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;;
+FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;;
+FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;;
+FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;;
+FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;;
+FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;;
+FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;;
+FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;;
+FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;;
+FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;;
+FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;;
+FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
+FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;;
+FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;;
+FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;;
+FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;;
+FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;;
+FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;;
+FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;;
+FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;;
+FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;;
+FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;;
+FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;;
+FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;;
+FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;;
+FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;;
+FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;;
+FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;;
+10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;;
+10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;;
+10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;;
+10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;;
+10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;;
+10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;;
+10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;;
+10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;;
+10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;;
+1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;;
+1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;;
+1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;;
+1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;;
+1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;;
+10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;;
+10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;;
+10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;;
+10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;;
+10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;;
+10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;;
+10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;;
+10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;;
+10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;;
+10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;;
+1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;;
+1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;;
+1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;;
+1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;;
+1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;;
+1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;;
+10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;;
+10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;;
+10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;;
+10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;;
+10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;;
+10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;;
+10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;;
+10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;;
+10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;;
+1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;;
+1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;;
+1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;;
+1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;;
+1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;;
+1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;;
+10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;;
+10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;;
+10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;;
+10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;;
+10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;;
+10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;;
+10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;;
+10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;;
+10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;;
+10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;;
+1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;;
+1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;;
+1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;;
+1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;;
+10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;;
+10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;;
+10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;;
+10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;;
+10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;;
+10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;;
+10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;;
+10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;;
+10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;;
+10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;;
+1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;;
+1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;;
+1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;;
+1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;;
+10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;;
+10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;;
+10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;;
+10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;;
+10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;;
+10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;;
+10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;;
+10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;;
+10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;;
+10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;;
+1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;;
+1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;;
+1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;;
+1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;;
+10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;;
+10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;;
+10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;;
+10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;;
+10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;;
+10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;;
+10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;;
+10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;;
+10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;;
+10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;;
+1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;;
+1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;;
+1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;;
+1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;;
+1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;;
+1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;;
+10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;;
+10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;;
+10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;;
+10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;;
+10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;;
+10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;;
+10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;;
+10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;;
+10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;;
+10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;;
+1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;;
+1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;;
+1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;;
+1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;;
+1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;;
+1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;;
+100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;;
+100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;;
+100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;;
+100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;;
+100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;;
+100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;;
+100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;;
+100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;;
+100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;;
+100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;;
+100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;;
+100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;;
+100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;;
+100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;;
+100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;;
+100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;;
+100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;;
+100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;;
+100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;;
+100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;;
+100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;;
+100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;;
+100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;;
+100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;;
+100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;;
+100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;;
+100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;;
+100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;;
+100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;;
+100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;;
+100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;;
+100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;;
+100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;;
+100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;;
+100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;;
+100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;;
+100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;;
+100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;;
+100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;;
+100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;;
+100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;;
+100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;pug;;;
+100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;;
+100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;gup;;;
+100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;;
+100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;;
+100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;;
+100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;;
+100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;;
+100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;;
+100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;;
+100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;;
+100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;;
+100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;;
+100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;;
+100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;;
+100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;;
+100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;;
+100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;;
+100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;;
+100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;;
+100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;;
+100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;;
+100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;;
+100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;;
+100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;;
+100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;;
+100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;;
+100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;;
+100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;;
+100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;;
+100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;;
+100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;;
+100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;;
+100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;;
+100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;;
+100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;;
+100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;;
+100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;;
+100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;;
+100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;;
+100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;;
+100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;;
+100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;;
+100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;;
+100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;;
+100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;;
+100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;;
+100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;;
+100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;;
+100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;;
+10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;;
+10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;;
+10102;AEGEAN CHECK MARK;So;0;L;;;;;N;;;;;
+10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;;
+10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;;
+10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;;
+1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;;
+1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;;
+1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;;
+1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;;
+1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;;
+1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;;
+10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;;
+10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;;
+10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;;
+10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;;
+1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;;
+1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;;
+1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;;
+1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;;
+1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;;
+10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;;
+10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;;
+10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;;
+10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;;
+10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;;
+10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;;
+10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;;
+10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;;
+10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;;
+1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;;
+1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;;
+1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;;
+1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;;
+1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;;
+10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;;
+10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;;
+10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;;
+10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;;
+10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;;
+10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;;
+1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;;
+10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;;
+10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;;
+10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;;
+10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;;
+10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;;
+10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;;
+10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;;
+1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;;
+1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;;
+1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;;
+1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;;
+1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;;
+1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;;
+10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;;
+10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;;
+10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;;
+10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;;
+10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;;
+10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;;
+10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;;
+10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;;
+10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;;
+10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;;
+10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;;
+10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;;
+10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;;
+10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;;
+1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;;
+1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;;
+10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;;
+10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;;
+10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;;
+10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;;
+10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;;
+10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;;
+10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;;
+1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;;
+1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;;
+1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;;
+1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;;
+10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;;
+10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;;
+10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;;
+10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;;
+10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;;
+10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;;
+10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;;
+10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;;
+1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;;
+10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;;
+10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;;
+10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;;
+10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;;
+10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;;
+10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;;
+10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;;
+10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;;
+1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;;
+1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;;
+101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;;
+101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;;
+101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;;
+101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;;
+101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;;
+101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;;
+101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;;
+101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;;
+101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;;
+101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;;
+101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;;
+101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;;
+101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;;
+101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;;
+101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;;
+101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;;
+101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;;
+101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;;
+101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;;
+101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;;
+101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;;
+101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;;
+101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;;
+101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;;
+101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;;
+101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;;
+101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;;
+101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;;
+101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;;
+101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;;
+101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;;
+101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;;
+101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;;
+101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;;
+101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;;
+101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;;
+101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;;
+101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;;
+101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;;
+101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;;
+101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;;
+101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;;
+101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;;
+101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;;
+101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;;
+101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;;
+10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;;
+10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;;
+10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;;
+10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;;
+10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;;
+10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;;
+10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;;
+10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;;
+10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;;
+10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;;
+1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;;
+1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;;
+1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;;
+1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;;
+1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;;
+10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;;
+10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;;
+10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;;
+10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;;
+10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;;
+10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;;
+10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;;
+10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;;
+1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;;
+1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;;
+1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;;
+102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;;
+102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;;
+102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;;
+102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;;
+102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;;
+102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;;
+102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;;
+102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;;
+102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;;
+102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;;
+102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;;
+102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;;
+102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;;
+102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;;
+102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;;
+102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;;
+102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;;
+102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;;
+102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;;
+102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;;
+102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;;
+102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;;
+102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;;
+102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;;
+102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;;
+102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;;
+102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;;
+102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;;
+102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;;
+102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;;
+102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;;
+102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;;
+102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;;
+102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;;
+102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;;
+102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;;
+102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;;
+102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;;
+102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;;
+102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;;
+102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;;
+102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;;
+102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;;
+102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;;
+10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;;
+10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;;
+10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;;
+10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;;
+10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;;
+10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;;
+10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;;
+10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;;
+10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;;
+10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;;
+1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;;
+1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;;
+1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;;
+1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;;
+1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;;
+1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;Faliscan;;;
+10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;;
+10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;;
+10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;;
+10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;;
+10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;;
+10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;;
+10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;;
+10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;Faliscan;;;
+10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;;
+10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;;
+1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;;
+1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;Umbrian;;;
+1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;Umbrian;;;
+1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;Oscan;;;
+1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;Oscan;;;
+10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;;
+10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;;
+10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;;
+10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;;
+10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;;
+10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;;
+10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;;
+10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;;
+10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;;
+10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;;
+10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;;
+10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;;
+10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;;
+1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;;
+1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;;
+1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;;
+1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;;
+1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;;
+1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;;
+10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;;
+10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;;
+10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;;
+10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;;
+10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;;
+10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;;
+10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;;
+10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;;
+10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;;
+10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;;
+1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;;
+10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;;
+10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;;
+10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;;
+10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;;
+10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;;
+10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;;
+10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;;
+10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;;
+10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;;
+10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;;
+1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;;
+1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;;
+1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;;
+1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;;
+1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;;
+1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;;
+10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;;
+10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;;
+10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;;
+10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;;
+10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;;
+10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;;
+10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;;
+10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;;
+10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;;
+10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;;
+1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;;
+1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;;
+1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;;
+1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;;
+1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;;
+103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;;
+103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;;
+103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;;
+103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;;
+103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;;
+103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;;
+103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;;
+103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;;
+103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;;
+103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;;
+103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;;
+103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;;
+103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;;
+103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;;
+103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;;
+103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;;
+103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;;
+103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;;
+103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;;
+103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;;
+103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;;
+103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;;
+103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;;
+103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;;
+103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;;
+103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;;
+103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;;
+103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;;
+103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;;
+103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;;
+103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;;
+103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;;
+103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;;
+103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;;
+103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;;
+103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;;
+103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;;
+103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;;
+103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;;
+103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;;
+103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;;
+103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;;
+103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;;
+103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;;
+103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;;
+103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;;
+103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;;
+103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;;
+10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
+10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429;
+10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A;
+10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B;
+10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C;
+10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D;
+10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E;
+10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F;
+10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430;
+10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431;
+1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432;
+1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433;
+1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434;
+1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435;
+1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436;
+1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437;
+10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438;
+10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439;
+10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A;
+10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B;
+10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C;
+10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D;
+10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E;
+10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F;
+10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440;
+10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441;
+1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442;
+1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443;
+1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444;
+1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445;
+1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446;
+1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447;
+10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448;
+10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449;
+10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A;
+10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B;
+10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C;
+10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D;
+10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E;
+10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
+10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
+10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401
+1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402
+1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403
+1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404
+1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405
+1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406
+1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407
+10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408
+10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409
+10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A
+10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B
+10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C
+10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D
+10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E
+10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F
+10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410
+10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411
+1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412
+1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413
+1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414
+1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415
+1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416
+1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417
+10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418
+10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419
+10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A
+10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B
+10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C
+10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D
+10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E
+10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F
+10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420
+10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421
+1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422
+1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423
+1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424
+1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425
+1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426
+1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
+10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
+10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;;
+10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;;
+10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;;
+10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;;
+10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;;
+10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;;
+10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;;
+10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;;
+10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;;
+1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;;
+1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;;
+1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;;
+1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;;
+1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;;
+1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;;
+10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;;
+10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;;
+10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;;
+10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;;
+10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;;
+10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;;
+10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;;
+10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;;
+10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;;
+10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;;
+1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;;
+1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;;
+1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;;
+1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;;
+1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;;
+1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;;
+10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;;
+10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;;
+10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;;
+10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;;
+10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;;
+10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;;
+10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;;
+10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;;
+10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;;
+10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;;
+1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;;
+1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;;
+1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;;
+1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;;
+1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;;
+1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;;
+10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;;
+10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;;
+10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;;
+10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;;
+10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;;
+10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;;
+10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;;
+10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;;
+10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;;
+1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;;
+1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;;
+1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;;
+1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;;
+1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;;
+10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;;
+10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;;
+10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;;
+10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;;
+10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;;
+10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;;
+10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;;
+10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;;
+10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;;
+10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;;
+1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;;
+1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;;
+1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;;
+1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;;
+104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;;
+10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;;
+10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;;
+10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;;
+10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;;
+10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;;
+10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;;
+1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;;
+1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;;
+1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;;
+1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;;
+1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;;
+1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;;
+10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;;
+10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;;
+10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;;
+10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;;
+10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;;
+10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;;
+10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;;
+10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;;
+10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;;
+10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;;
+1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;;
+1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;;
+1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;;
+1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;;
+1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;;
+1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;;
+10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;;
+10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;;
+10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;;
+10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;;
+10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;;
+10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;;
+10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;;
+10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;;
+10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;;
+10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;;
+1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;;
+1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;;
+1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;;
+1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;;
+1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;;
+1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;;
+10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;;
+10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;;
+10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;;
+10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;;
+10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;;
+10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;;
+10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;;
+10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;;
+1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;;
+1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;;
+10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;;
+10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;;
+10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;;
+10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;;
+10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;;
+10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;;
+10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;;
+10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;;
+10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;;
+1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;;
+1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;;
+1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;;
+1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;;
+10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;;
+10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;;
+10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;;
+10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;;
+10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;;
+10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;;
+10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;;
+10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;;
+10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;;
+10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;;
+10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;;
+10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;;
+10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;;
+10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;;
+10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;;
+1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;;
+1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;;
+1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;;
+1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;;
+1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;;
+1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;;
+10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;;
+10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;;
+10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;;
+10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;;
+10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;;
+10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;;
+10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;;
+10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;;
+10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;;
+10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;;
+1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;;
+10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;;
+10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;;
+10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;;
+10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;;
+10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;;
+10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;;
+10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;;
+10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;;
+10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;;
+10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;;
+10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;;
+10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;;
+10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;;
+10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;;
+10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;;
+10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;;
+10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;;
+10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;;
+10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;;
+10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;;
+10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;;
+10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;;
+10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;;
+10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;;
+10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;;
+10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;;
+10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;;
+10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;;
+10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;;
+10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;;
+10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;;
+10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;;
+10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;;
+10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
+10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
+10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
+10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
+10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;;
+10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;;
+10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;;
+10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;;
+10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
+10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
+10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
+10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;;
+10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;;
+10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;;
+10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;;
+10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;;
+10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;;
+12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
+12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
+12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
+12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;;
+12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;;
+12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;;
+12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;;
+12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;;
+1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;;
+1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;;
+1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;;
+12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;;
+12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;;
+12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;;
+12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;;
+12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;;
+1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;;
+1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;;
+1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;;
+12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;;
+12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;;
+12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;;
+12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;;
+12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;;
+12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;;
+12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;;
+12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;;
+12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;;
+1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;;
+1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;;
+1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;;
+1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;;
+1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;;
+12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;;
+12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;;
+12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;;
+12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;;
+12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;;
+12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;;
+12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;;
+12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;;
+12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;;
+1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;;
+1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;;
+1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;;
+12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;;
+12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;;
+12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;;
+12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;;
+12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;;
+12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;;
+12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;;
+12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;;
+12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;;
+12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;;
+1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;;
+1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;;
+1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;;
+1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;;
+1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;;
+12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;;
+12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;;
+12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;;
+12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;;
+12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;;
+12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;;
+12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;;
+12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;;
+12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;;
+12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;;
+1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;;
+1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;;
+1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;;
+1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;;
+12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;;
+12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;;
+12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;;
+12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;;
+12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;;
+12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;;
+12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;;
+12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;;
+12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;;
+1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;;
+1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;;
+1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;;
+1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;;
+1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;;
+12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;;
+12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;;
+12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;;
+12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;;
+12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;;
+12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;;
+12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;;
+12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;;
+12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;;
+1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;;
+1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;;
+1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;;
+1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;;
+1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;;
+1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;;
+12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;;
+12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;;
+12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;;
+12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;;
+12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;;
+12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;;
+12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;;
+1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;;
+1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;;
+1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;;
+1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;;
+1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;;
+12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;;
+12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;;
+12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;;
+12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;;
+12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;;
+12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;;
+12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;;
+1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;;
+1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;;
+1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;;
+1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;;
+1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;;
+120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;;
+120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;;
+120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;;
+120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;;
+120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;;
+120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;;
+120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;;
+120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;;
+120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;;
+120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;;
+120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;;
+120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;;
+120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;;
+120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;;
+120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;;
+120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;;
+120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;;
+120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;;
+120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;;
+120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;;
+120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;;
+120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;;
+120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;;
+120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;;
+120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;;
+120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;;
+120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;;
+120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;;
+120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;;
+120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;;
+120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;;
+120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;;
+120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;;
+120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;;
+120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;;
+120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;;
+120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;;
+120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;;
+120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;;
+120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;;
+120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;;
+120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;;
+120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;;
+120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;;
+120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;;
+120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;;
+120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;;
+120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;;
+120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;;
+120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;;
+120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;;
+120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;;
+120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;;
+120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;;
+120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;;
+120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;;
+120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;;
+120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;;
+120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;;
+120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;;
+120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;;
+120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;;
+120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;;
+120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;;
+12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;;
+12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;;
+12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;;
+12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;;
+12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;;
+12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;;
+12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;;
+12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;;
+12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;;
+12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;;
+1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;;
+1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;;
+1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;;
+12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;;
+12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;;
+12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;;
+12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;;
+12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;;
+12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;;
+12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;;
+12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;;
+1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;;
+1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;;
+1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;;
+12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;;
+12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;;
+12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;;
+12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;;
+12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;;
+12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;;
+12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;;
+12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;;
+1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;;
+1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;;
+1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;;
+1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;;
+1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;;
+1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;;
+12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;;
+12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;;
+12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;;
+12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;;
+12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;;
+12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;;
+12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;;
+1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;;
+1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;;
+1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;;
+12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;;
+12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;;
+12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;;
+12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;;
+12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;;
+12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;;
+12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;;
+12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;;
+12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;;
+12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;;
+1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;;
+1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;;
+1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;;
+1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;;
+1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;;
+12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;;
+12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;;
+12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;;
+12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;;
+12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;;
+12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;;
+12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;;
+12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;;
+12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;;
+1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;;
+1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;;
+1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;;
+1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;;
+12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;;
+12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;;
+12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;;
+12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;;
+12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;;
+12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;;
+12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;;
+1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;;
+1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;;
+1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;;
+1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;;
+1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;;
+12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;;
+12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;;
+12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;;
+12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;;
+12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;;
+12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;;
+12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;;
+12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;;
+12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;;
+12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;;
+1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;;
+1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;;
+1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;;
+1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;;
+1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;;
+1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;;
+12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;;
+12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;;
+12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;;
+12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;;
+12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;;
+12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;;
+12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;;
+12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;;
+12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;;
+12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;;
+1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;;
+1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;;
+1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;;
+1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;;
+1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;;
+12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;;
+12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;;
+12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;;
+12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;;
+12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;;
+12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;;
+12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;;
+12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;;
+12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;;
+1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;;
+1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;;
+1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;;
+1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;;
+121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;;
+121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;;
+121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;;
+121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;;
+121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;;
+121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;;
+121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;;
+121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;;
+121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;;
+121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;;
+121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;;
+121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;;
+121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;;
+121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;;
+121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;;
+121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;;
+121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;;
+121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;;
+121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;;
+121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;;
+121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;;
+121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;;
+121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;;
+121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;;
+121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;;
+121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;;
+121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;;
+121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;;
+121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;;
+121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;;
+121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;;
+121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;;
+121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;;
+121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;;
+121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;;
+121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;;
+121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;;
+121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;;
+121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;;
+121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;;
+121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;;
+121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;;
+121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;;
+121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;;
+121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;;
+121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;;
+121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;;
+121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;;
+121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;;
+121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;;
+121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;;
+121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;;
+121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;;
+121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;;
+121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;;
+121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;;
+121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;;
+121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;;
+121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;;
+121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;;
+121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;;
+121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;;
+121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;;
+121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;;
+121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;;
+121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;;
+121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;;
+121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;;
+121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;;
+121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;;
+121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;;
+121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;;
+121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;;
+121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;;
+121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;;
+121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;;
+121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;;
+121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;;
+12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;;
+12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;;
+12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;;
+12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;;
+1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;;
+1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;;
+12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;;
+12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;;
+12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;;
+12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;;
+12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;;
+12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;;
+12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;;
+12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;;
+12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;;
+12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;;
+1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;;
+1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;;
+1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;;
+1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;;
+1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;;
+1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;;
+12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;;
+12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;;
+12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;;
+12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;;
+12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;;
+12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;;
+12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;;
+12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;;
+1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;;
+1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;;
+1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;;
+1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;;
+1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;;
+1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;;
+12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;;
+12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;;
+12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;;
+12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;;
+12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;;
+12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;;
+12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;;
+12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;;
+1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;;
+1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;;
+1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;;
+1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;;
+1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;;
+1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;;
+12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;;
+12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;;
+12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;;
+12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;;
+12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;;
+12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;;
+12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;;
+12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;;
+12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;;
+12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;;
+1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;;
+1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;;
+1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;;
+1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;;
+1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;;
+1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;;
+12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;;
+12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;;
+1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;;
+12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;;
+12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;;
+12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;;
+12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;;
+12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;;
+12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;;
+12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;;
+12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;;
+1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;;
+1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;;
+1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;;
+1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;;
+12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;;
+12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;;
+12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;;
+12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;;
+1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;;
+1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;;
+1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;;
+1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;;
+1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;;
+1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;;
+12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;;
+12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;;
+12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;;
+12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;;
+12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;;
+12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;;
+12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;;
+12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;;
+12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;;
+12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;;
+1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;;
+1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;;
+1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;;
+1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;;
+1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;;
+1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;;
+12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;;
+12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;;
+12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;;
+12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;;
+12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;;
+12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;;
+12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;;
+12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;;
+12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;;
+12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;;
+1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;;
+1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;;
+1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;;
+1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;;
+1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;;
+122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;;
+122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;;
+122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;;
+122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;;
+122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;;
+122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;;
+122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;;
+122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;;
+122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;;
+122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;;
+122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;;
+122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;;
+122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;;
+122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;;
+122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;;
+122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;;
+122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;;
+122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;;
+122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;;
+122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;;
+122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;;
+122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;;
+122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;;
+122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;;
+122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;;
+122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;;
+122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;;
+122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;;
+122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;;
+122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;;
+122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;;
+122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;;
+122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;;
+122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;;
+122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;;
+122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;;
+122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;;
+122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;;
+122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;;
+122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;;
+122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;;
+122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;;
+122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;;
+122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;;
+122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;;
+122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;;
+122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;;
+122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;;
+122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;;
+122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;;
+122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;;
+122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;;
+122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;;
+122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;;
+122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;;
+122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;;
+122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;;
+122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;;
+122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;;
+122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;;
+122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;;
+122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;;
+122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;;
+122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;;
+122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;;
+122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;;
+122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;;
+122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;;
+122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;;
+122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;;
+122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;;
+122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;;
+122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;;
+122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;;
+122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;;
+122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;;
+122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;;
+122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;;
+122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;;
+122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;;
+122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;;
+122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;;
+122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;;
+122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;;
+122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;;
+122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;;
+122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;;
+122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;;
+122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;;
+122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;;
+122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;;
+12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;;
+12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;;
+12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;;
+12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;;
+12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;;
+12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;;
+12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;;
+12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;;
+1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;;
+1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;;
+1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;;
+1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;;
+1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;;
+12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;;
+12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;;
+12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;;
+12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;;
+12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;;
+12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;;
+12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;;
+12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;;
+12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;;
+1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;;
+1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;;
+1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;;
+1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;;
+1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;;
+12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;;
+12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;;
+12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;;
+12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;;
+12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;;
+12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;;
+12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;;
+12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;;
+1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;;
+1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;;
+1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;;
+1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;;
+12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;;
+12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;;
+12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;;
+12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;;
+12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;;
+12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;;
+12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;;
+1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;;
+1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;;
+1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;;
+1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;;
+12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;;
+12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;;
+12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;;
+12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;;
+12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;;
+12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;;
+12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;;
+12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;;
+12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;;
+12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;;
+1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;;
+1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;;
+1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;;
+1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;;
+1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;;
+12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;;
+12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;;
+12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;;
+12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;;
+12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;;
+12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;;
+12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;;
+12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;;
+1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;;
+1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;;
+1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;;
+1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;;
+1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;;
+12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;;
+12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;;
+12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;;
+12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;;
+12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;;
+12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;;
+12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;;
+12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;;
+12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;;
+12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;;
+1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;;
+1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;;
+1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;;
+1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;;
+1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;;
+12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;;
+12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;;
+12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;;
+12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;;
+12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;;
+12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;;
+12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;;
+12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;;
+12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;;
+12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;;
+1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;;
+1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;;
+1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;;
+1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;;
+1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;;
+1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;;
+12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;;
+12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;;
+12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;;
+12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;;
+12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;;
+12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;;
+12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;;
+12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;;
+12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;;
+12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;;
+1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;;
+1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;;
+1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;;
+1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;;
+1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;;
+1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;;
+12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;;
+12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;;
+12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;;
+12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;;
+12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;;
+12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;;
+12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;;
+12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;;
+12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;;
+1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;;
+1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;;
+1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;;
+1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;;
+1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;;
+1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;;
+12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;;
+12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;;
+12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;;
+12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;;
+12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;;
+12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;;
+12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;;
+12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;;
+1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;;
+1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;;
+1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;;
+1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;;
+1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;;
+1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;;
+12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;;
+12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;;
+12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;;
+12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;;
+12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;;
+12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;;
+12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;;
+12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;;
+12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;;
+12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;;
+1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;;
+1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;;
+1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;;
+1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;;
+1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;;
+1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;;
+12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;;
+12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;;
+12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;;
+12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;;
+12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;;
+12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;;
+12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;;
+12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;;
+12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;;
+12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;;
+1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;;
+1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;;
+1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;;
+1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;;
+1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;;
+1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;;
+12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;;
+12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;;
+12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;;
+12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;;
+12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;;
+12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;;
+1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
+1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
+1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
+1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;;
+1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;;
+1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;;
+1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;;
+1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;;
+1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;;
+1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;;
+1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;;
+1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;;
+1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;;
+1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;;
+1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;;
+1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;;
+1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;;
+1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;;
+1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;;
+1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;;
+1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;;
+1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;;
+1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;;
+1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;;
+1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;;
+1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;;
+1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;;
+1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;;
+1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;;
+1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;;
+1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;;
+1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;;
+1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;;
+1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;;
+1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;;
+1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;;
+1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;;
+1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;;
+1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;;
+1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;;
+1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;;
+1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;;
+1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;;
+1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;;
+1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;;
+1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;;
+1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;;
+1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;;
+1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;;
+1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;;
+1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;;
+1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;;
+1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;;
+1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;;
+1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;;
+1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;;
+1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;;
+1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;;
+1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;;
+1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;;
+1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;;
+1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;;
+1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;;
+1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;;
+1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;;
+1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;;
+1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;;
+1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;;
+1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;;
+1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;;
+1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;;
+1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;;
+1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;;
+1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;;
+1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;;
+1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;;
+1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;;
+1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;;
+1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;;
+1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;;
+1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;;
+1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;;
+1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;;
+1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;;
+1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;;
+1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;;
+1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;;
+1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;;
+1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;;
+1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;;
+1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;;
+1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;;
+1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;;
+1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;;
+1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;;
+1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;;
+1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;;
+1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;;
+1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;;
+1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;;
+1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;;
+1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;;
+1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;;
+1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;;
+1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;;
+1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;;
+1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;;
+1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;;
+1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;;
+1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;;
+1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;;
+1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;;
+1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;;
+1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;;
+1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;;
+1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;;
+1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;;
+1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;;
+1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;;
+1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;;
+1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;;
+1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;;
+1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;;
+1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;;
+1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;;
+1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;;
+1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;;
+1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;;
+1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;;
+1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;;
+1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;;
+1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;;
+1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;;
+1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;;
+1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;;
+1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;;
+1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;;
+1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;;
+1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;;
+1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;;
+1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;;
+1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;;
+1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;;
+1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;;
+1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;;
+1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;;
+1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;;
+1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;;
+1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;;
+1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;;
+1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;;
+1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;;
+1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;;
+1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;;
+1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;;
+1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;;
+1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;;
+1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;;
+1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;;
+1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;;
+1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;;
+1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;;
+1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;;
+1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;;
+1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;;
+1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;;
+1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;;
+1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;;
+1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;;
+1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;;
+1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;;
+1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;;
+1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;;
+1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;;
+1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;;
+1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;;
+1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;;
+1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;;
+1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;;
+1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;;
+1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;;
+1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;;
+1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;;
+1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;;
+1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;;
+1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;;
+1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;;
+1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;;
+1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;;
+1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;;
+1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;;
+1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;;
+1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;;
+1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;;
+1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;;
+1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;;
+1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;;
+1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;;
+1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;;
+1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;;
+1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;;
+1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;;
+1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;;
+1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;;
+1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;;
+1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;;
+1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;;
+1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;;
+1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;;
+1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;;
+1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;;
+1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;;
+1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;;
+1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;;
+1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;;
+1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;;
+1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;;
+1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;;
+1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;;
+1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;;
+1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;;
+1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;;
+1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;;
+1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;;
+1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;;
+1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;;
+1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;;
+1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;;
+1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;;
+1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;;
+1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;;
+1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;;
+1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;;
+1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;;
+1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;;
+1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;;
+1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;;
+1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;;
+1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;;
+1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;;
+1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;;
+1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;;
+1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;;
+1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;;
+1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;;
+1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;;
+1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;;
+1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;;
+1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;;
+1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;;
+1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;;
+1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;;
+1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;;
+1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;;
+1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;;
+1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;;
+1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;;
+1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;;
+1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;;
+1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;;
+1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;;
+1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;;
+1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;;
+1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;;
+1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;;
+1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;;
+1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;;
+1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;;
+1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;;
+1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;;
+1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;;
+1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;;
+1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;;
+1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;;
+1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;;
+1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;;
+1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;;
+1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;;
+1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;;
+1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;;
+1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;;
+1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;;
+1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;;
+1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;;
+1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;;
+1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;;
+1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;;
+1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;;
+1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;;
+1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;;
+1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;;
+1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;;
+1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;;
+1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;;
+1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;;
+1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;;
+1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;;
+1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;;
+1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;;
+1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;;
+1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;;
+1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;;
+1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;;
+1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;;
+1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;;
+1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;;
+1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;;
+1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;;
+1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;;
+1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;;
+1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;;
+1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;;
+1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;;
+1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;;
+1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;;
+1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;;
+1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;;
+1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;;
+1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;;
+1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;;
+1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;;
+1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;;
+1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;;
+1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;;
+1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;;
+1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;;
+1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;;
+1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;;
+1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;;
+1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;;
+1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;;
+1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;;
+1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;;
+1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;;
+1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;;
+1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;;
+1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;;
+1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;;
+1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;;
+1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;;
+1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;;
+1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;;
+1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;;
+1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;;
+1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;;
+1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;;
+1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;;
+1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;;
+1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;;
+1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;;
+1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;;
+1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;;
+1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;;
+1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;;
+1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;;
+1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;;
+1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;;
+1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;;
+1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;;
+1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;;
+1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;;
+1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;;
+1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;;
+1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;;
+1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;;
+1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;;
+1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;;
+1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;;
+1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;;
+1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;;
+1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;;
+1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;;
+1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;;
+1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;;
+1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;;
+1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
+1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
+1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;ren *;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;tian ren *;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;di ren *;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;ren tian *;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;ren di *;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;ren ren *;;;
+1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;;
+1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;;
+1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;;
+1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;;
+1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;;
+1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;;
+1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;;
+1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;;
+1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;;
+1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;;
+1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;;
+1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;;
+1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;;
+1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;;
+1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;;
+1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;;
+1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;;
+1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;;
+1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;;
+1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;;
+1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;;
+1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;;
+1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;;
+1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;;
+1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;;
+1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;;
+1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;;
+1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;;
+1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;;
+1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;;
+1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;;
+1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;;
+1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;;
+1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;;
+1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;;
+1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;;
+1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;;
+1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;;
+1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;;
+1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;;
+1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;;
+1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;;
+1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;;
+1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;;
+1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;;
+1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;;
+1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;;
+1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;;
+1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;;
+1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;;
+1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;;
+1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;;
+1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;;
+1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;;
+1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;;
+1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;;
+1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;;
+1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;;
+1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;;
+1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;;
+1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;;
+1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;;
+1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;;
+1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;;
+1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;;
+1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;;
+1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;;
+1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;;
+1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;;
+1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;;
+1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;;
+1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;;
+1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;;
+1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;;
+1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;;
+1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;;
+1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;;
+1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;;
+1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;;
+1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;;
+1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;;
+1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;;
+1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;;
+1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;;
+1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;;
+1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;;
+1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;;
+1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;;
+1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;;
+1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;;
+1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
+1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
+1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
+1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;;
+1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;;
+1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;;
+1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;;
+1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;;
+1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;;
+1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;;
+1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;;
+1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;;
+1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;;
+1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;;
+1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;;
+1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;;
+1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;;
+1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;;
+1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;;
+1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;;
+1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;;
+1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;;
+1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;;
+1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;;
+1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;;
+1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;;
+1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;;
+1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;;
+1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;;
+1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;;
+1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;;
+1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;;
+1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;;
+1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;;
+1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;;
+1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;;
+1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;;
+1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;;
+1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;;
+1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;;
+1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;;
+1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;;
+1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;;
+1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;;
+1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;;
+1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;;
+1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;;
+1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;;
+1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;;
+1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;;
+1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;;
+1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;;
+1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;;
+1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;;
+1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;;
+1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;;
+1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;;
+1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;;
+1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;;
+1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;;
+1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;;
+1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;;
+1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;;
+1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;;
+1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;;
+1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;;
+1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;;
+1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;;
+1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;;
+1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;;
+1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;;
+1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;;
+1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;;
+1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;;
+1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;;
+1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;;
+1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;;
+1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;;
+1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;;
+1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;;
+1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;;
+1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;;
+1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;;
+1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;;
+1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;;
+1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;;
+1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;;
+1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;;
+1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;;
+1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;;
+1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;;
+1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;;
+1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;;
+1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;;
+1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;;
+1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;;
+1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;;
+1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;;
+1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;;
+1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;;
+1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;;
+1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;;
+1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;;
+1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;;
+1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;;
+1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;;
+1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;;
+1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;;
+1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;;
+1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;;
+1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;;
+1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;;
+1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;;
+1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;;
+1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;;
+1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;;
+1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;;
+1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;;
+1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;;
+1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;;
+1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;;
+1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;;
+1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;;
+1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;;
+2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;;
+2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;;
+2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;;
+2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;;
+2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;;
+2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;;
+2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;;
+2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;;
+2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;;
+2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;;
+2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;;
+2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;;
+2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;;
+2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;;
+2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;;
+2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;;
+2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;;
+2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;;
+2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;;
+2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;;
+2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;;
+2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;;
+2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;;
+2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;;
+2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;;
+2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;;
+2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;;
+2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;;
+2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;;
+2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;;
+2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;;
+2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;;
+2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;;
+2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;;
+2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;;
+2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;;
+2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;;
+2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;;
+2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;;
+2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;;
+2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;;
+2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;;
+2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;;
+2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;;
+2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;;
+2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;;
+2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;;
+2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;;
+2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;;
+2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;;
+2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;;
+2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;;
+2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;;
+2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;;
+2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;;
+2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;;
+2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;;
+2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;;
+2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;;
+2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;;
+2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;;
+2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;;
+2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;;
+2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;;
+2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;;
+2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;;
+2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;;
+2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;;
+2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;;
+2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;;
+2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;;
+2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;;
+2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;;
+2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;;
+2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;;
+2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;;
+2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;;
+2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;;
+2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;;
+2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;;
+2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;;
+2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;;
+2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;;
+2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;;
+2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;;
+2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;;
+2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;;
+2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;;
+2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;;
+2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;;
+2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;;
+2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;;
+2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;;
+2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;;
+2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;;
+2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;;
+2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;;
+2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;;
+2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;;
+2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;;
+2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;;
+2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;;
+2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;;
+2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;;
+2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;;
+2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;;
+2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;;
+2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;;
+2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;;
+2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;;
+2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;;
+2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;;
+2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;;
+2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;;
+2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;;
+2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;;
+2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;;
+2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;;
+2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;;
+2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;;
+2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;;
+2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;;
+2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;;
+2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;;
+2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;;
+2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;;
+2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;;
+2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;;
+2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;;
+2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;;
+2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;;
+2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;;
+2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;;
+2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;;
+2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;;
+2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;;
+2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;;
+2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;;
+2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;;
+2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;;
+2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;;
+2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;;
+2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;;
+2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;;
+2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;;
+2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;;
+2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;;
+2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;;
+2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;;
+2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;;
+2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;;
+2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;;
+2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;;
+2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;;
+2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;;
+2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;;
+2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;;
+2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;;
+2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;;
+2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;;
+2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;;
+2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;;
+2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;;
+2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;;
+2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;;
+2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;;
+2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;;
+2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;;
+2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;;
+2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;;
+2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;;
+2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;;
+2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;;
+2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;;
+2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;;
+2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;;
+2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;;
+2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;;
+2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;;
+2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;;
+2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;;
+2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;;
+2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;;
+2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;;
+2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;;
+2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;;
+2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;;
+2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;;
+2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;;
+2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;;
+2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;;
+2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;;
+2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;;
+2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;;
+2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;;
+2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;;
+2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;;
+2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;;
+2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;;
+2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;;
+2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;;
+2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;;
+2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;;
+2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;;
+2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;;
+2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;;
+2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;;
+2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;;
+2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;;
+2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;;
+2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;;
+2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;;
+2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;;
+2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;;
+2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;;
+2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;;
+2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;;
+2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;;
+2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;;
+2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;;
+2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;;
+2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;;
+2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;;
+2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;;
+2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;;
+2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;;
+2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;;
+2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;;
+2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;;
+2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;;
+2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;;
+2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;;
+2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;;
+2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;;
+2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;;
+2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;;
+2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;;
+2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;;
+2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;;
+2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;;
+2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;;
+2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;;
+2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;;
+2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;;
+2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;;
+2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;;
+2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;;
+2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;;
+2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;;
+2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;;
+2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;;
+2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;;
+2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;;
+2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;;
+2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;;
+2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;;
+2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;;
+2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;;
+2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;;
+2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;;
+2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;;
+2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;;
+2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;;
+2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;;
+2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;;
+2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;;
+2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;;
+2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;;
+2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;;
+2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;;
+2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;;
+2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;;
+2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;;
+2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;;
+2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;;
+2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;;
+2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;;
+2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;;
+2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;;
+2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;;
+2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;;
+2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;;
+2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;;
+2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;;
+2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;;
+2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;;
+2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;;
+2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;;
+2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;;
+2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;;
+2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;;
+2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;;
+2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;;
+2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;;
+2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;;
+2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;;
+2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;;
+2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;;
+2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;;
+2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;;
+2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;;
+2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;;
+2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;;
+2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;;
+2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;;
+2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;;
+2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;;
+2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;;
+2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;;
+2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;;
+2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;;
+2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;;
+2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;;
+2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;;
+2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;;
+2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;;
+2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;;
+2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;;
+2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;;
+2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;;
+2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;;
+2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;;
+2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;;
+2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;;
+2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;;
+2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;;
+2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;;
+2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;;
+2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;;
+2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;;
+2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;;
+2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;;
+2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;;
+2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;;
+2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;;
+2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;;
+2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;;
+2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;;
+2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;;
+2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;;
+2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;;
+2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;;
+2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;;
+2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;;
+2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;;
+2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;;
+2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;;
+2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;;
+2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;;
+2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;;
+2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;;
+2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;;
+2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;;
+2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;;
+2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;;
+2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;;
+2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;;
+2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;;
+2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;;
+2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;;
+2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;;
+2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;;
+2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;;
+2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;;
+2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;;
+2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;;
+2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;;
+2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;;
+2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;;
+2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;;
+2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;;
+2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;;
+2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;;
+2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;;
+2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;;
+2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;;
+2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;;
+2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;;
+2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;;
+2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;;
+2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;;
+2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;;
+2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;;
+2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;;
+2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;;
+2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;;
+2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;;
+2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;;
+2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;;
+2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;;
+2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;;
+2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;;
+2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;;
+2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;;
+2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;;
+2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;;
+2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;;
+2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;;
+2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;;
+2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;;
+2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;;
+2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;;
+2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;;
+2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;;
+2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;;
+2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;;
+2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;;
+2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;;
+2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;;
+2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;;
+2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;;
+2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;;
+2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;;
+2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;;
+2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;;
+2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;;
+2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;;
+2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;;
+2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;;
+2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;;
+2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;;
+2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;;
+2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;;
+2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;;
+2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;;
+2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;;
+2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;;
+2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;;
+2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;;
+2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;;
+2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;;
+2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;;
+2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;;
+2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;;
+2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;;
+2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;;
+2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;;
+2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;;
+2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;;
+2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;;
+2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;;
+2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;;
+2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;;
+2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;;
+2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;;
+2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;;
+2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;;
+2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;;
+2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;;
+2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;;
+2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;;
+2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;;
+2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;;
+2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;;
+2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;;
+2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;;
+2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;;
+2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;;
+2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;;
+2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;;
+2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;;
+2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;;
+2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;;
+2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;;
+2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;;
+2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;;
+2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;;
+2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;;
+2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;;
+2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;;
+2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;;
+2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;;
+2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;;
+2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;;
+2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;;
+2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;;
+2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;;
+2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;;
+2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;;
+2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;;
+2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;;
+2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;;
+2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;;
+2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;;
+2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;;
+2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;;
+2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;;
+2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;;
+2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;;
+2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;;
+2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;;
+2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;;
+2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;;
+2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;;
+2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;;
+2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;;
+2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;;
+2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;;
+2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;;
+2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;;
+2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;;
+2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;;
+2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;;
+2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;;
+2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;;
+2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;;
+2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;;
+2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;;
+2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;;
+2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;;
+2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;;
+2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;;
+2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;;
+2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;;
+2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;;
+2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;;
+2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;;
+2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;;
+2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;;
+2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;;
+2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;;
+2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;;
+2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;;
+2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;;
+2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;;
+2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;;
+2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;;
+2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;;
+2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;;
+2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;;
+2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;;
+2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;;
+2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;;
+2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;;
+2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;;
+2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;;
+2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;;
+2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;;
+2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;;
+2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;;
+2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;;
+2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;;
+E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
+E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
+E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
+E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;;
+E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;;
+E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;;
+E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;;
+E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;;
+E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
+E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;;
+E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;;
+E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;;
+E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;;
+E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;;
+E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;;
+E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;;
+E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;;
+E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;;
+E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;;
+E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;;
+E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;;
+E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;;
+E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;;
+E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;;
+E003A;TAG COLON;Cf;0;BN;;;;;N;;;;;
+E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;;
+E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;;
+E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;;
+E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;;
+E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;;
+E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;;
+E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;;
+E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;;
+E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;;
+E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;;
+E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;;
+E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;;
+E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;;
+E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;;
+E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;;
+E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;;
+E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;;
+E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;;
+E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;;
+E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;;
+E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;;
+E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;;
+E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;;
+E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;;
+E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;;
+E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;;
+E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;;
+E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;;
+E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;;
+E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;;
+E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;;
+E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;;
+E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;;
+E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;;
+E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;;
+E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;;
+E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;;
+E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;;
+E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;;
+E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;;
+E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;;
+E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;;
+E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;;
+E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;;
+E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;;
+E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;;
+E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;;
+E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;;
+E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;;
+E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;;
+E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;;
+E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;;
+E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;;
+E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;;
+E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;;
+E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;;
+E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;;
+E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;;
+E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;;
+E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;;
+E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;;
+E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;;
+E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;;
+E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;;
+E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;;
+E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;;
+E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;;
+E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;;
+E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;;
+E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;;
+E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;;
+E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;;
+E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;;
+E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;;
+E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;;
+E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;;
+E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;;
+E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;;
+E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;;
+E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;;
+E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;;
+E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;;
+E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;;
+E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;;
+E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;;
+E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;;
+E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;;
+E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;;
+E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;;
+E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;;
+E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;;
+E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;;
+E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;;
+E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;;
+E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;;
+E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;;
+E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;;
+E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;;
+E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;;
+E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;;
+E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;;
+E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;;
+E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;;
+E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;;
+E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;;
+E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;;
+E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;;
+E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;;
+E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;;
+E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;;
+E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;;
+E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;;
+E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;;
+E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;;
+E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;;
+E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;;
+E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;;
+E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;;
+E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;;
+E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;;
+E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;;
+E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;;
+E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;;
+E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;;
+E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;;
+E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;;
+E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;;
+E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;;
+E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;;
+E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;;
+E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;;
+E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;;
+E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;;
+E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;;
+E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;;
+E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;;
+E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;;
+E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;;
+E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;;
+E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;;
+E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;;
+E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;;
+E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;;
+E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;;
+E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;;
+E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;;
+E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;;
+E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;;
+E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;;
+E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;;
+E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;;
+E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;;
+E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;;
+E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;;
+E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;;
+E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;;
+E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;;
+E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;;
+E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;;
+E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;;
+E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;;
+E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;;
+E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;;
+E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;;
+E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;;
+E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;;
+E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;;
+E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;;
+E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;;
+E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;;
+E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;;
+E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;;
+E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;;
+E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;;
+E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;;
+E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;;
+E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;;
+E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;;
+E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;;
+E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;;
+E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;;
+E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;;
+E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;;
+E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;;
+E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;;
+E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;;
+E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;;
+E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;;
+E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;;
+E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;;
+E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;;
+E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;;
+E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;;
+E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;;
+E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;;
+E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;;
+E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;;
+E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;;
+E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;;
+E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;;
+E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;;
+E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;;
+E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;;
+E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;;
+E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;;
+E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;;
+E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;;
+E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;;
+E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;;
+E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;;
+E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;;
+E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;;
+E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;;
+E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;;
+E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;;
+E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;;
+E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;;
+E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;;
+E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;;
+E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;;
+E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;;
+E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;;
+E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;;
+E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;;
+E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;;
+E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;;
+E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;;
+E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;;
+E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;;
+E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;;
+E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;;
+E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;;
+E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;;
+E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;;
+E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;;
+E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;;
+E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;;
+E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;;
+E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;;
+E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;;
+E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;;
+E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;;
+E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;;
+E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;;
+E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;;
+E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;;
+E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;;
+E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;;
+E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;;
+E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;;
+E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;;
+E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;;
+E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;;
+E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;;
+E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;;
+E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;;
+E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;;
+E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;;
+E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;;
+E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;;
+E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;;
+E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;;
diff --git a/gnulib/tests/uniname/test-uninames.c b/gnulib/tests/uniname/test-uninames.c
new file mode 100644
index 00000000..21163513
--- /dev/null
+++ b/gnulib/tests/uniname/test-uninames.c
@@ -0,0 +1,262 @@
+/* Test the Unicode character name functions.
+ Copyright (C) 2000-2003, 2005, 2007, 2009-2010 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/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+#include "uniname.h"
+#include "progname.h"
+
+/* The names according to the UnicodeData.txt file, modified to contain the
+ Hangul syllable names, as described in the Unicode 3.0 book. */
+const char * unicode_names [0x110000];
+
+/* Maximum length of a field in the UnicodeData.txt file. */
+#define FIELDLEN 120
+
+/* Reads the next field from STREAM. The buffer BUFFER has size FIELDLEN.
+ Reads up to (but excluding) DELIM.
+ Returns 1 when a field was successfully read, otherwise 0. */
+static int
+getfield (FILE *stream, char *buffer, int delim)
+{
+ int count = 0;
+ int c;
+
+ for (; (c = getc (stream)), (c != EOF && c != delim); )
+ {
+ /* Put c into the buffer. */
+ if (++count >= FIELDLEN - 1)
+ {
+ fprintf (stderr, "field too long\n");
+ exit (EXIT_FAILURE);
+ }
+ *buffer++ = c;
+ }
+
+ if (c == EOF)
+ return 0;
+
+ *buffer = '\0';
+ return 1;
+}
+
+/* Stores in unicode_names[] the relevant contents of the UnicodeData.txt
+ file. */
+static void
+fill_names (const char *unicodedata_filename)
+{
+ unsigned int i;
+ FILE *stream;
+ char field0[FIELDLEN];
+ char field1[FIELDLEN];
+ int lineno = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_names[i] = NULL;
+
+ stream = fopen (unicodedata_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", unicodedata_filename);
+ exit (EXIT_FAILURE);
+ }
+
+ for (;;)
+ {
+ int n;
+ int c;
+
+ lineno++;
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ';');
+ if (n == 0)
+ break;
+ if (n != 2)
+ {
+ fprintf (stderr, "short line in '%s':%d\n",
+ unicodedata_filename, lineno);
+ exit (EXIT_FAILURE);
+ }
+ for (; (c = getc (stream)), (c != EOF && c != '\n'); )
+ ;
+ i = strtoul (field0, NULL, 16);
+ if (i >= 0x110000)
+ {
+ fprintf (stderr, "index too large\n");
+ exit (EXIT_FAILURE);
+ }
+ unicode_names[i] = xstrdup (field1);
+ }
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", unicodedata_filename);
+ exit (1);
+ }
+}
+
+/* Perform an exhaustive test of the unicode_character_name function. */
+static int
+test_name_lookup ()
+{
+ int error = 0;
+ unsigned int i;
+ char buf[UNINAME_MAX];
+
+ for (i = 0; i < 0x11000; i++)
+ {
+ char *result = unicode_character_name (i, buf);
+
+ if (unicode_names[i] != NULL)
+ {
+ if (result == NULL)
+ {
+ fprintf (stderr, "\\u%04X name lookup failed!\n", i);
+ error = 1;
+ }
+ else if (strcmp (result, unicode_names[i]) != 0)
+ {
+ fprintf (stderr, "\\u%04X name lookup returned wrong name: %s\n",
+ i, result);
+ error = 1;
+ }
+ }
+ else
+ {
+ if (result != NULL)
+ {
+ fprintf (stderr, "\\u%04X name lookup returned wrong name: %s\n",
+ i, result);
+ error = 1;
+ }
+ }
+ }
+
+ for (i = 0x110000; i < 0x1000000; i++)
+ {
+ char *result = unicode_character_name (i, buf);
+
+ if (result != NULL)
+ {
+ fprintf (stderr, "\\u%04X name lookup returned wrong name: %s\n",
+ i, result);
+ error = 1;
+ }
+ }
+
+ return error;
+}
+
+/* Perform a test of the unicode_name_character function. */
+static int
+test_inverse_lookup ()
+{
+ int error = 0;
+ unsigned int i;
+
+ /* First, verify all valid character names are recognized. */
+ for (i = 0; i < 0x110000; i++)
+ if (unicode_names[i] != NULL)
+ {
+ unsigned int result = unicode_name_character (unicode_names[i]);
+ if (result != i)
+ {
+ if (result == UNINAME_INVALID)
+ fprintf (stderr, "inverse name lookup of \"%s\" failed\n",
+ unicode_names[i]);
+ else
+ fprintf (stderr,
+ "inverse name lookup of \"%s\" returned 0x%04X\n",
+ unicode_names[i], result);
+ error = 1;
+ }
+ }
+
+ /* Second, generate random but likely names and verify they are not
+ recognized unless really valid. */
+ for (i = 0; i < 10000; i++)
+ {
+ unsigned int i1, i2;
+ const char *s1;
+ const char *s2;
+ unsigned int l1, l2, j1, j2;
+ char buf[2*UNINAME_MAX];
+ unsigned int result;
+
+ do i1 = ((rand () % 0x11) << 16)
+ + ((rand () & 0xff) << 8)
+ + (rand () & 0xff);
+ while (unicode_names[i1] == NULL);
+
+ do i2 = ((rand () % 0x11) << 16)
+ + ((rand () & 0xff) << 8)
+ + (rand () & 0xff);
+ while (unicode_names[i2] == NULL);
+
+ s1 = unicode_names[i1];
+ l1 = strlen (s1);
+ s2 = unicode_names[i2];
+ l2 = strlen (s2);
+
+ /* Concatenate a starting piece of s1 with an ending piece of s2. */
+ for (j1 = 1; j1 <= l1; j1++)
+ if (j1 == l1 || s1[j1] == ' ')
+ for (j2 = 0; j2 < l2; j2++)
+ if (j2 == 0 || s2[j2-1] == ' ')
+ {
+ memcpy (buf, s1, j1);
+ buf[j1] = ' ';
+ memcpy (buf + j1 + 1, s2 + j2, l2 - j2 + 1);
+
+ result = unicode_name_character (buf);
+ if (result != UNINAME_INVALID
+ && !(unicode_names[result] != NULL
+ && strcmp (unicode_names[result], buf) == 0))
+ {
+ fprintf (stderr,
+ "inverse name lookup of \"%s\" returned 0x%04X\n",
+ unicode_names[i], result);
+ error = 1;
+ }
+ }
+ }
+
+ /* Third, some extreme case that used to loop. */
+ if (unicode_name_character ("A A") != UNINAME_INVALID)
+ error = 1;
+
+ return error;
+}
+
+int
+main (int argc, char *argv[])
+{
+ int error = 0;
+
+ set_program_name (argv[0]);
+
+ fill_names (argv[1]);
+
+ error |= test_name_lookup ();
+ error |= test_inverse_lookup ();
+
+ return error;
+}
diff --git a/gnulib/tests/uniname/test-uninames.sh b/gnulib/tests/uniname/test-uninames.sh
new file mode 100755
index 00000000..f26c275e
--- /dev/null
+++ b/gnulib/tests/uniname/test-uninames.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec ./test-uninames${EXEEXT} "$srcdir/uniname/UnicodeDataNames.txt"
diff --git a/gnulib/tests/uninorm/NormalizationTest.txt b/gnulib/tests/uninorm/NormalizationTest.txt
new file mode 100644
index 00000000..0bb97659
--- /dev/null
+++ b/gnulib/tests/uninorm/NormalizationTest.txt
@@ -0,0 +1,17819 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@Part0
+
+1E0A;1E0A;0044 0307;1E0A;0044 0307;
+1E0C;1E0C;0044 0323;1E0C;0044 0323;
+1E0A 0323;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307;
+1E0C 0307;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307;
+0044 0307 0323;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307;
+0044 0323 0307;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307;
+1E0A 031B;1E0A 031B;0044 031B 0307;1E0A 031B;0044 031B 0307;
+1E0C 031B;1E0C 031B;0044 031B 0323;1E0C 031B;0044 031B 0323;
+1E0A 031B 0323;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307;
+1E0C 031B 0307;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307;
+0044 031B 0307 0323;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307;
+0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307;
+00C8;00C8;0045 0300;00C8;0045 0300;
+0112;0112;0045 0304;0112;0045 0304;
+0045 0300;00C8;0045 0300;00C8;0045 0300;
+0045 0304;0112;0045 0304;0112;0045 0304;
+1E14;1E14;0045 0304 0300;1E14;0045 0304 0300;
+0112 0300;1E14;0045 0304 0300;1E14;0045 0304 0300;
+1E14 0304;1E14 0304;0045 0304 0300 0304;1E14 0304;0045 0304 0300 0304;
+0045 0304 0300;1E14;0045 0304 0300;1E14;0045 0304 0300;
+0045 0300 0304;00C8 0304;0045 0300 0304;00C8 0304;0045 0300 0304;
+05B8 05B9 05B1 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;
+0592 05B7 05BC 05A5 05B0 05C0 05C4 05AD;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;
+
+@Part1
+
+
+00A0;00A0;00A0;0020;0020;
+00A8;00A8;00A8;0020 0308;0020 0308;
+00AA;00AA;00AA;0061;0061;
+00AF;00AF;00AF;0020 0304;0020 0304;
+00B2;00B2;00B2;0032;0032;
+00B3;00B3;00B3;0033;0033;
+00B4;00B4;00B4;0020 0301;0020 0301;
+00B5;00B5;00B5;03BC;03BC;
+00B8;00B8;00B8;0020 0327;0020 0327;
+00B9;00B9;00B9;0031;0031;
+00BA;00BA;00BA;006F;006F;
+00BC;00BC;00BC;0031 2044 0034;0031 2044 0034;
+00BD;00BD;00BD;0031 2044 0032;0031 2044 0032;
+00BE;00BE;00BE;0033 2044 0034;0033 2044 0034;
+00C0;00C0;0041 0300;00C0;0041 0300;
+00C1;00C1;0041 0301;00C1;0041 0301;
+00C2;00C2;0041 0302;00C2;0041 0302;
+00C3;00C3;0041 0303;00C3;0041 0303;
+00C4;00C4;0041 0308;00C4;0041 0308;
+00C5;00C5;0041 030A;00C5;0041 030A;
+00C7;00C7;0043 0327;00C7;0043 0327;
+00C8;00C8;0045 0300;00C8;0045 0300;
+00C9;00C9;0045 0301;00C9;0045 0301;
+00CA;00CA;0045 0302;00CA;0045 0302;
+00CB;00CB;0045 0308;00CB;0045 0308;
+00CC;00CC;0049 0300;00CC;0049 0300;
+00CD;00CD;0049 0301;00CD;0049 0301;
+00CE;00CE;0049 0302;00CE;0049 0302;
+00CF;00CF;0049 0308;00CF;0049 0308;
+00D1;00D1;004E 0303;00D1;004E 0303;
+00D2;00D2;004F 0300;00D2;004F 0300;
+00D3;00D3;004F 0301;00D3;004F 0301;
+00D4;00D4;004F 0302;00D4;004F 0302;
+00D5;00D5;004F 0303;00D5;004F 0303;
+00D6;00D6;004F 0308;00D6;004F 0308;
+00D9;00D9;0055 0300;00D9;0055 0300;
+00DA;00DA;0055 0301;00DA;0055 0301;
+00DB;00DB;0055 0302;00DB;0055 0302;
+00DC;00DC;0055 0308;00DC;0055 0308;
+00DD;00DD;0059 0301;00DD;0059 0301;
+00E0;00E0;0061 0300;00E0;0061 0300;
+00E1;00E1;0061 0301;00E1;0061 0301;
+00E2;00E2;0061 0302;00E2;0061 0302;
+00E3;00E3;0061 0303;00E3;0061 0303;
+00E4;00E4;0061 0308;00E4;0061 0308;
+00E5;00E5;0061 030A;00E5;0061 030A;
+00E7;00E7;0063 0327;00E7;0063 0327;
+00E8;00E8;0065 0300;00E8;0065 0300;
+00E9;00E9;0065 0301;00E9;0065 0301;
+00EA;00EA;0065 0302;00EA;0065 0302;
+00EB;00EB;0065 0308;00EB;0065 0308;
+00EC;00EC;0069 0300;00EC;0069 0300;
+00ED;00ED;0069 0301;00ED;0069 0301;
+00EE;00EE;0069 0302;00EE;0069 0302;
+00EF;00EF;0069 0308;00EF;0069 0308;
+00F1;00F1;006E 0303;00F1;006E 0303;
+00F2;00F2;006F 0300;00F2;006F 0300;
+00F3;00F3;006F 0301;00F3;006F 0301;
+00F4;00F4;006F 0302;00F4;006F 0302;
+00F5;00F5;006F 0303;00F5;006F 0303;
+00F6;00F6;006F 0308;00F6;006F 0308;
+00F9;00F9;0075 0300;00F9;0075 0300;
+00FA;00FA;0075 0301;00FA;0075 0301;
+00FB;00FB;0075 0302;00FB;0075 0302;
+00FC;00FC;0075 0308;00FC;0075 0308;
+00FD;00FD;0079 0301;00FD;0079 0301;
+00FF;00FF;0079 0308;00FF;0079 0308;
+0100;0100;0041 0304;0100;0041 0304;
+0101;0101;0061 0304;0101;0061 0304;
+0102;0102;0041 0306;0102;0041 0306;
+0103;0103;0061 0306;0103;0061 0306;
+0104;0104;0041 0328;0104;0041 0328;
+0105;0105;0061 0328;0105;0061 0328;
+0106;0106;0043 0301;0106;0043 0301;
+0107;0107;0063 0301;0107;0063 0301;
+0108;0108;0043 0302;0108;0043 0302;
+0109;0109;0063 0302;0109;0063 0302;
+010A;010A;0043 0307;010A;0043 0307;
+010B;010B;0063 0307;010B;0063 0307;
+010C;010C;0043 030C;010C;0043 030C;
+010D;010D;0063 030C;010D;0063 030C;
+010E;010E;0044 030C;010E;0044 030C;
+010F;010F;0064 030C;010F;0064 030C;
+0112;0112;0045 0304;0112;0045 0304;
+0113;0113;0065 0304;0113;0065 0304;
+0114;0114;0045 0306;0114;0045 0306;
+0115;0115;0065 0306;0115;0065 0306;
+0116;0116;0045 0307;0116;0045 0307;
+0117;0117;0065 0307;0117;0065 0307;
+0118;0118;0045 0328;0118;0045 0328;
+0119;0119;0065 0328;0119;0065 0328;
+011A;011A;0045 030C;011A;0045 030C;
+011B;011B;0065 030C;011B;0065 030C;
+011C;011C;0047 0302;011C;0047 0302;
+011D;011D;0067 0302;011D;0067 0302;
+011E;011E;0047 0306;011E;0047 0306;
+011F;011F;0067 0306;011F;0067 0306;
+0120;0120;0047 0307;0120;0047 0307;
+0121;0121;0067 0307;0121;0067 0307;
+0122;0122;0047 0327;0122;0047 0327;
+0123;0123;0067 0327;0123;0067 0327;
+0124;0124;0048 0302;0124;0048 0302;
+0125;0125;0068 0302;0125;0068 0302;
+0128;0128;0049 0303;0128;0049 0303;
+0129;0129;0069 0303;0129;0069 0303;
+012A;012A;0049 0304;012A;0049 0304;
+012B;012B;0069 0304;012B;0069 0304;
+012C;012C;0049 0306;012C;0049 0306;
+012D;012D;0069 0306;012D;0069 0306;
+012E;012E;0049 0328;012E;0049 0328;
+012F;012F;0069 0328;012F;0069 0328;
+0130;0130;0049 0307;0130;0049 0307;
+0132;0132;0132;0049 004A;0049 004A;
+0133;0133;0133;0069 006A;0069 006A;
+0134;0134;004A 0302;0134;004A 0302;
+0135;0135;006A 0302;0135;006A 0302;
+0136;0136;004B 0327;0136;004B 0327;
+0137;0137;006B 0327;0137;006B 0327;
+0139;0139;004C 0301;0139;004C 0301;
+013A;013A;006C 0301;013A;006C 0301;
+013B;013B;004C 0327;013B;004C 0327;
+013C;013C;006C 0327;013C;006C 0327;
+013D;013D;004C 030C;013D;004C 030C;
+013E;013E;006C 030C;013E;006C 030C;
+013F;013F;013F;004C 00B7;004C 00B7;
+0140;0140;0140;006C 00B7;006C 00B7;
+0143;0143;004E 0301;0143;004E 0301;
+0144;0144;006E 0301;0144;006E 0301;
+0145;0145;004E 0327;0145;004E 0327;
+0146;0146;006E 0327;0146;006E 0327;
+0147;0147;004E 030C;0147;004E 030C;
+0148;0148;006E 030C;0148;006E 030C;
+0149;0149;0149;02BC 006E;02BC 006E;
+014C;014C;004F 0304;014C;004F 0304;
+014D;014D;006F 0304;014D;006F 0304;
+014E;014E;004F 0306;014E;004F 0306;
+014F;014F;006F 0306;014F;006F 0306;
+0150;0150;004F 030B;0150;004F 030B;
+0151;0151;006F 030B;0151;006F 030B;
+0154;0154;0052 0301;0154;0052 0301;
+0155;0155;0072 0301;0155;0072 0301;
+0156;0156;0052 0327;0156;0052 0327;
+0157;0157;0072 0327;0157;0072 0327;
+0158;0158;0052 030C;0158;0052 030C;
+0159;0159;0072 030C;0159;0072 030C;
+015A;015A;0053 0301;015A;0053 0301;
+015B;015B;0073 0301;015B;0073 0301;
+015C;015C;0053 0302;015C;0053 0302;
+015D;015D;0073 0302;015D;0073 0302;
+015E;015E;0053 0327;015E;0053 0327;
+015F;015F;0073 0327;015F;0073 0327;
+0160;0160;0053 030C;0160;0053 030C;
+0161;0161;0073 030C;0161;0073 030C;
+0162;0162;0054 0327;0162;0054 0327;
+0163;0163;0074 0327;0163;0074 0327;
+0164;0164;0054 030C;0164;0054 030C;
+0165;0165;0074 030C;0165;0074 030C;
+0168;0168;0055 0303;0168;0055 0303;
+0169;0169;0075 0303;0169;0075 0303;
+016A;016A;0055 0304;016A;0055 0304;
+016B;016B;0075 0304;016B;0075 0304;
+016C;016C;0055 0306;016C;0055 0306;
+016D;016D;0075 0306;016D;0075 0306;
+016E;016E;0055 030A;016E;0055 030A;
+016F;016F;0075 030A;016F;0075 030A;
+0170;0170;0055 030B;0170;0055 030B;
+0171;0171;0075 030B;0171;0075 030B;
+0172;0172;0055 0328;0172;0055 0328;
+0173;0173;0075 0328;0173;0075 0328;
+0174;0174;0057 0302;0174;0057 0302;
+0175;0175;0077 0302;0175;0077 0302;
+0176;0176;0059 0302;0176;0059 0302;
+0177;0177;0079 0302;0177;0079 0302;
+0178;0178;0059 0308;0178;0059 0308;
+0179;0179;005A 0301;0179;005A 0301;
+017A;017A;007A 0301;017A;007A 0301;
+017B;017B;005A 0307;017B;005A 0307;
+017C;017C;007A 0307;017C;007A 0307;
+017D;017D;005A 030C;017D;005A 030C;
+017E;017E;007A 030C;017E;007A 030C;
+017F;017F;017F;0073;0073;
+01A0;01A0;004F 031B;01A0;004F 031B;
+01A1;01A1;006F 031B;01A1;006F 031B;
+01AF;01AF;0055 031B;01AF;0055 031B;
+01B0;01B0;0075 031B;01B0;0075 031B;
+01C4;01C4;01C4;0044 017D;0044 005A 030C;
+01C5;01C5;01C5;0044 017E;0044 007A 030C;
+01C6;01C6;01C6;0064 017E;0064 007A 030C;
+01C7;01C7;01C7;004C 004A;004C 004A;
+01C8;01C8;01C8;004C 006A;004C 006A;
+01C9;01C9;01C9;006C 006A;006C 006A;
+01CA;01CA;01CA;004E 004A;004E 004A;
+01CB;01CB;01CB;004E 006A;004E 006A;
+01CC;01CC;01CC;006E 006A;006E 006A;
+01CD;01CD;0041 030C;01CD;0041 030C;
+01CE;01CE;0061 030C;01CE;0061 030C;
+01CF;01CF;0049 030C;01CF;0049 030C;
+01D0;01D0;0069 030C;01D0;0069 030C;
+01D1;01D1;004F 030C;01D1;004F 030C;
+01D2;01D2;006F 030C;01D2;006F 030C;
+01D3;01D3;0055 030C;01D3;0055 030C;
+01D4;01D4;0075 030C;01D4;0075 030C;
+01D5;01D5;0055 0308 0304;01D5;0055 0308 0304;
+01D6;01D6;0075 0308 0304;01D6;0075 0308 0304;
+01D7;01D7;0055 0308 0301;01D7;0055 0308 0301;
+01D8;01D8;0075 0308 0301;01D8;0075 0308 0301;
+01D9;01D9;0055 0308 030C;01D9;0055 0308 030C;
+01DA;01DA;0075 0308 030C;01DA;0075 0308 030C;
+01DB;01DB;0055 0308 0300;01DB;0055 0308 0300;
+01DC;01DC;0075 0308 0300;01DC;0075 0308 0300;
+01DE;01DE;0041 0308 0304;01DE;0041 0308 0304;
+01DF;01DF;0061 0308 0304;01DF;0061 0308 0304;
+01E0;01E0;0041 0307 0304;01E0;0041 0307 0304;
+01E1;01E1;0061 0307 0304;01E1;0061 0307 0304;
+01E2;01E2;00C6 0304;01E2;00C6 0304;
+01E3;01E3;00E6 0304;01E3;00E6 0304;
+01E6;01E6;0047 030C;01E6;0047 030C;
+01E7;01E7;0067 030C;01E7;0067 030C;
+01E8;01E8;004B 030C;01E8;004B 030C;
+01E9;01E9;006B 030C;01E9;006B 030C;
+01EA;01EA;004F 0328;01EA;004F 0328;
+01EB;01EB;006F 0328;01EB;006F 0328;
+01EC;01EC;004F 0328 0304;01EC;004F 0328 0304;
+01ED;01ED;006F 0328 0304;01ED;006F 0328 0304;
+01EE;01EE;01B7 030C;01EE;01B7 030C;
+01EF;01EF;0292 030C;01EF;0292 030C;
+01F0;01F0;006A 030C;01F0;006A 030C;
+01F1;01F1;01F1;0044 005A;0044 005A;
+01F2;01F2;01F2;0044 007A;0044 007A;
+01F3;01F3;01F3;0064 007A;0064 007A;
+01F4;01F4;0047 0301;01F4;0047 0301;
+01F5;01F5;0067 0301;01F5;0067 0301;
+01F8;01F8;004E 0300;01F8;004E 0300;
+01F9;01F9;006E 0300;01F9;006E 0300;
+01FA;01FA;0041 030A 0301;01FA;0041 030A 0301;
+01FB;01FB;0061 030A 0301;01FB;0061 030A 0301;
+01FC;01FC;00C6 0301;01FC;00C6 0301;
+01FD;01FD;00E6 0301;01FD;00E6 0301;
+01FE;01FE;00D8 0301;01FE;00D8 0301;
+01FF;01FF;00F8 0301;01FF;00F8 0301;
+0200;0200;0041 030F;0200;0041 030F;
+0201;0201;0061 030F;0201;0061 030F;
+0202;0202;0041 0311;0202;0041 0311;
+0203;0203;0061 0311;0203;0061 0311;
+0204;0204;0045 030F;0204;0045 030F;
+0205;0205;0065 030F;0205;0065 030F;
+0206;0206;0045 0311;0206;0045 0311;
+0207;0207;0065 0311;0207;0065 0311;
+0208;0208;0049 030F;0208;0049 030F;
+0209;0209;0069 030F;0209;0069 030F;
+020A;020A;0049 0311;020A;0049 0311;
+020B;020B;0069 0311;020B;0069 0311;
+020C;020C;004F 030F;020C;004F 030F;
+020D;020D;006F 030F;020D;006F 030F;
+020E;020E;004F 0311;020E;004F 0311;
+020F;020F;006F 0311;020F;006F 0311;
+0210;0210;0052 030F;0210;0052 030F;
+0211;0211;0072 030F;0211;0072 030F;
+0212;0212;0052 0311;0212;0052 0311;
+0213;0213;0072 0311;0213;0072 0311;
+0214;0214;0055 030F;0214;0055 030F;
+0215;0215;0075 030F;0215;0075 030F;
+0216;0216;0055 0311;0216;0055 0311;
+0217;0217;0075 0311;0217;0075 0311;
+0218;0218;0053 0326;0218;0053 0326;
+0219;0219;0073 0326;0219;0073 0326;
+021A;021A;0054 0326;021A;0054 0326;
+021B;021B;0074 0326;021B;0074 0326;
+021E;021E;0048 030C;021E;0048 030C;
+021F;021F;0068 030C;021F;0068 030C;
+0226;0226;0041 0307;0226;0041 0307;
+0227;0227;0061 0307;0227;0061 0307;
+0228;0228;0045 0327;0228;0045 0327;
+0229;0229;0065 0327;0229;0065 0327;
+022A;022A;004F 0308 0304;022A;004F 0308 0304;
+022B;022B;006F 0308 0304;022B;006F 0308 0304;
+022C;022C;004F 0303 0304;022C;004F 0303 0304;
+022D;022D;006F 0303 0304;022D;006F 0303 0304;
+022E;022E;004F 0307;022E;004F 0307;
+022F;022F;006F 0307;022F;006F 0307;
+0230;0230;004F 0307 0304;0230;004F 0307 0304;
+0231;0231;006F 0307 0304;0231;006F 0307 0304;
+0232;0232;0059 0304;0232;0059 0304;
+0233;0233;0079 0304;0233;0079 0304;
+02B0;02B0;02B0;0068;0068;
+02B1;02B1;02B1;0266;0266;
+02B2;02B2;02B2;006A;006A;
+02B3;02B3;02B3;0072;0072;
+02B4;02B4;02B4;0279;0279;
+02B5;02B5;02B5;027B;027B;
+02B6;02B6;02B6;0281;0281;
+02B7;02B7;02B7;0077;0077;
+02B8;02B8;02B8;0079;0079;
+02D8;02D8;02D8;0020 0306;0020 0306;
+02D9;02D9;02D9;0020 0307;0020 0307;
+02DA;02DA;02DA;0020 030A;0020 030A;
+02DB;02DB;02DB;0020 0328;0020 0328;
+02DC;02DC;02DC;0020 0303;0020 0303;
+02DD;02DD;02DD;0020 030B;0020 030B;
+02E0;02E0;02E0;0263;0263;
+02E1;02E1;02E1;006C;006C;
+02E2;02E2;02E2;0073;0073;
+02E3;02E3;02E3;0078;0078;
+02E4;02E4;02E4;0295;0295;
+0340;0300;0300;0300;0300;
+0341;0301;0301;0301;0301;
+0343;0313;0313;0313;0313;
+0344;0308 0301;0308 0301;0308 0301;0308 0301;
+0374;02B9;02B9;02B9;02B9;
+037A;037A;037A;0020 0345;0020 0345;
+037E;003B;003B;003B;003B;
+0384;0384;0384;0020 0301;0020 0301;
+0385;0385;00A8 0301;0020 0308 0301;0020 0308 0301;
+0386;0386;0391 0301;0386;0391 0301;
+0387;00B7;00B7;00B7;00B7;
+0388;0388;0395 0301;0388;0395 0301;
+0389;0389;0397 0301;0389;0397 0301;
+038A;038A;0399 0301;038A;0399 0301;
+038C;038C;039F 0301;038C;039F 0301;
+038E;038E;03A5 0301;038E;03A5 0301;
+038F;038F;03A9 0301;038F;03A9 0301;
+0390;0390;03B9 0308 0301;0390;03B9 0308 0301;
+03AA;03AA;0399 0308;03AA;0399 0308;
+03AB;03AB;03A5 0308;03AB;03A5 0308;
+03AC;03AC;03B1 0301;03AC;03B1 0301;
+03AD;03AD;03B5 0301;03AD;03B5 0301;
+03AE;03AE;03B7 0301;03AE;03B7 0301;
+03AF;03AF;03B9 0301;03AF;03B9 0301;
+03B0;03B0;03C5 0308 0301;03B0;03C5 0308 0301;
+03CA;03CA;03B9 0308;03CA;03B9 0308;
+03CB;03CB;03C5 0308;03CB;03C5 0308;
+03CC;03CC;03BF 0301;03CC;03BF 0301;
+03CD;03CD;03C5 0301;03CD;03C5 0301;
+03CE;03CE;03C9 0301;03CE;03C9 0301;
+03D0;03D0;03D0;03B2;03B2;
+03D1;03D1;03D1;03B8;03B8;
+03D2;03D2;03D2;03A5;03A5;
+03D3;03D3;03D2 0301;038E;03A5 0301;
+03D4;03D4;03D2 0308;03AB;03A5 0308;
+03D5;03D5;03D5;03C6;03C6;
+03D6;03D6;03D6;03C0;03C0;
+03F0;03F0;03F0;03BA;03BA;
+03F1;03F1;03F1;03C1;03C1;
+03F2;03F2;03F2;03C2;03C2;
+03F4;03F4;03F4;0398;0398;
+03F5;03F5;03F5;03B5;03B5;
+03F9;03F9;03F9;03A3;03A3;
+0400;0400;0415 0300;0400;0415 0300;
+0401;0401;0415 0308;0401;0415 0308;
+0403;0403;0413 0301;0403;0413 0301;
+0407;0407;0406 0308;0407;0406 0308;
+040C;040C;041A 0301;040C;041A 0301;
+040D;040D;0418 0300;040D;0418 0300;
+040E;040E;0423 0306;040E;0423 0306;
+0419;0419;0418 0306;0419;0418 0306;
+0439;0439;0438 0306;0439;0438 0306;
+0450;0450;0435 0300;0450;0435 0300;
+0451;0451;0435 0308;0451;0435 0308;
+0453;0453;0433 0301;0453;0433 0301;
+0457;0457;0456 0308;0457;0456 0308;
+045C;045C;043A 0301;045C;043A 0301;
+045D;045D;0438 0300;045D;0438 0300;
+045E;045E;0443 0306;045E;0443 0306;
+0476;0476;0474 030F;0476;0474 030F;
+0477;0477;0475 030F;0477;0475 030F;
+04C1;04C1;0416 0306;04C1;0416 0306;
+04C2;04C2;0436 0306;04C2;0436 0306;
+04D0;04D0;0410 0306;04D0;0410 0306;
+04D1;04D1;0430 0306;04D1;0430 0306;
+04D2;04D2;0410 0308;04D2;0410 0308;
+04D3;04D3;0430 0308;04D3;0430 0308;
+04D6;04D6;0415 0306;04D6;0415 0306;
+04D7;04D7;0435 0306;04D7;0435 0306;
+04DA;04DA;04D8 0308;04DA;04D8 0308;
+04DB;04DB;04D9 0308;04DB;04D9 0308;
+04DC;04DC;0416 0308;04DC;0416 0308;
+04DD;04DD;0436 0308;04DD;0436 0308;
+04DE;04DE;0417 0308;04DE;0417 0308;
+04DF;04DF;0437 0308;04DF;0437 0308;
+04E2;04E2;0418 0304;04E2;0418 0304;
+04E3;04E3;0438 0304;04E3;0438 0304;
+04E4;04E4;0418 0308;04E4;0418 0308;
+04E5;04E5;0438 0308;04E5;0438 0308;
+04E6;04E6;041E 0308;04E6;041E 0308;
+04E7;04E7;043E 0308;04E7;043E 0308;
+04EA;04EA;04E8 0308;04EA;04E8 0308;
+04EB;04EB;04E9 0308;04EB;04E9 0308;
+04EC;04EC;042D 0308;04EC;042D 0308;
+04ED;04ED;044D 0308;04ED;044D 0308;
+04EE;04EE;0423 0304;04EE;0423 0304;
+04EF;04EF;0443 0304;04EF;0443 0304;
+04F0;04F0;0423 0308;04F0;0423 0308;
+04F1;04F1;0443 0308;04F1;0443 0308;
+04F2;04F2;0423 030B;04F2;0423 030B;
+04F3;04F3;0443 030B;04F3;0443 030B;
+04F4;04F4;0427 0308;04F4;0427 0308;
+04F5;04F5;0447 0308;04F5;0447 0308;
+04F8;04F8;042B 0308;04F8;042B 0308;
+04F9;04F9;044B 0308;04F9;044B 0308;
+0587;0587;0587;0565 0582;0565 0582;
+0622;0622;0627 0653;0622;0627 0653;
+0623;0623;0627 0654;0623;0627 0654;
+0624;0624;0648 0654;0624;0648 0654;
+0625;0625;0627 0655;0625;0627 0655;
+0626;0626;064A 0654;0626;064A 0654;
+0675;0675;0675;0627 0674;0627 0674;
+0676;0676;0676;0648 0674;0648 0674;
+0677;0677;0677;06C7 0674;06C7 0674;
+0678;0678;0678;064A 0674;064A 0674;
+06C0;06C0;06D5 0654;06C0;06D5 0654;
+06C2;06C2;06C1 0654;06C2;06C1 0654;
+06D3;06D3;06D2 0654;06D3;06D2 0654;
+0929;0929;0928 093C;0929;0928 093C;
+0931;0931;0930 093C;0931;0930 093C;
+0934;0934;0933 093C;0934;0933 093C;
+0958;0915 093C;0915 093C;0915 093C;0915 093C;
+0959;0916 093C;0916 093C;0916 093C;0916 093C;
+095A;0917 093C;0917 093C;0917 093C;0917 093C;
+095B;091C 093C;091C 093C;091C 093C;091C 093C;
+095C;0921 093C;0921 093C;0921 093C;0921 093C;
+095D;0922 093C;0922 093C;0922 093C;0922 093C;
+095E;092B 093C;092B 093C;092B 093C;092B 093C;
+095F;092F 093C;092F 093C;092F 093C;092F 093C;
+09CB;09CB;09C7 09BE;09CB;09C7 09BE;
+09CC;09CC;09C7 09D7;09CC;09C7 09D7;
+09DC;09A1 09BC;09A1 09BC;09A1 09BC;09A1 09BC;
+09DD;09A2 09BC;09A2 09BC;09A2 09BC;09A2 09BC;
+09DF;09AF 09BC;09AF 09BC;09AF 09BC;09AF 09BC;
+0A33;0A32 0A3C;0A32 0A3C;0A32 0A3C;0A32 0A3C;
+0A36;0A38 0A3C;0A38 0A3C;0A38 0A3C;0A38 0A3C;
+0A59;0A16 0A3C;0A16 0A3C;0A16 0A3C;0A16 0A3C;
+0A5A;0A17 0A3C;0A17 0A3C;0A17 0A3C;0A17 0A3C;
+0A5B;0A1C 0A3C;0A1C 0A3C;0A1C 0A3C;0A1C 0A3C;
+0A5E;0A2B 0A3C;0A2B 0A3C;0A2B 0A3C;0A2B 0A3C;
+0B48;0B48;0B47 0B56;0B48;0B47 0B56;
+0B4B;0B4B;0B47 0B3E;0B4B;0B47 0B3E;
+0B4C;0B4C;0B47 0B57;0B4C;0B47 0B57;
+0B5C;0B21 0B3C;0B21 0B3C;0B21 0B3C;0B21 0B3C;
+0B5D;0B22 0B3C;0B22 0B3C;0B22 0B3C;0B22 0B3C;
+0B94;0B94;0B92 0BD7;0B94;0B92 0BD7;
+0BCA;0BCA;0BC6 0BBE;0BCA;0BC6 0BBE;
+0BCB;0BCB;0BC7 0BBE;0BCB;0BC7 0BBE;
+0BCC;0BCC;0BC6 0BD7;0BCC;0BC6 0BD7;
+0C48;0C48;0C46 0C56;0C48;0C46 0C56;
+0CC0;0CC0;0CBF 0CD5;0CC0;0CBF 0CD5;
+0CC7;0CC7;0CC6 0CD5;0CC7;0CC6 0CD5;
+0CC8;0CC8;0CC6 0CD6;0CC8;0CC6 0CD6;
+0CCA;0CCA;0CC6 0CC2;0CCA;0CC6 0CC2;
+0CCB;0CCB;0CC6 0CC2 0CD5;0CCB;0CC6 0CC2 0CD5;
+0D4A;0D4A;0D46 0D3E;0D4A;0D46 0D3E;
+0D4B;0D4B;0D47 0D3E;0D4B;0D47 0D3E;
+0D4C;0D4C;0D46 0D57;0D4C;0D46 0D57;
+0DDA;0DDA;0DD9 0DCA;0DDA;0DD9 0DCA;
+0DDC;0DDC;0DD9 0DCF;0DDC;0DD9 0DCF;
+0DDD;0DDD;0DD9 0DCF 0DCA;0DDD;0DD9 0DCF 0DCA;
+0DDE;0DDE;0DD9 0DDF;0DDE;0DD9 0DDF;
+0E33;0E33;0E33;0E4D 0E32;0E4D 0E32;
+0EB3;0EB3;0EB3;0ECD 0EB2;0ECD 0EB2;
+0EDC;0EDC;0EDC;0EAB 0E99;0EAB 0E99;
+0EDD;0EDD;0EDD;0EAB 0EA1;0EAB 0EA1;
+0F0C;0F0C;0F0C;0F0B;0F0B;
+0F43;0F42 0FB7;0F42 0FB7;0F42 0FB7;0F42 0FB7;
+0F4D;0F4C 0FB7;0F4C 0FB7;0F4C 0FB7;0F4C 0FB7;
+0F52;0F51 0FB7;0F51 0FB7;0F51 0FB7;0F51 0FB7;
+0F57;0F56 0FB7;0F56 0FB7;0F56 0FB7;0F56 0FB7;
+0F5C;0F5B 0FB7;0F5B 0FB7;0F5B 0FB7;0F5B 0FB7;
+0F69;0F40 0FB5;0F40 0FB5;0F40 0FB5;0F40 0FB5;
+0F73;0F71 0F72;0F71 0F72;0F71 0F72;0F71 0F72;
+0F75;0F71 0F74;0F71 0F74;0F71 0F74;0F71 0F74;
+0F76;0FB2 0F80;0FB2 0F80;0FB2 0F80;0FB2 0F80;
+0F77;0F77;0F77;0FB2 0F71 0F80;0FB2 0F71 0F80;
+0F78;0FB3 0F80;0FB3 0F80;0FB3 0F80;0FB3 0F80;
+0F79;0F79;0F79;0FB3 0F71 0F80;0FB3 0F71 0F80;
+0F81;0F71 0F80;0F71 0F80;0F71 0F80;0F71 0F80;
+0F93;0F92 0FB7;0F92 0FB7;0F92 0FB7;0F92 0FB7;
+0F9D;0F9C 0FB7;0F9C 0FB7;0F9C 0FB7;0F9C 0FB7;
+0FA2;0FA1 0FB7;0FA1 0FB7;0FA1 0FB7;0FA1 0FB7;
+0FA7;0FA6 0FB7;0FA6 0FB7;0FA6 0FB7;0FA6 0FB7;
+0FAC;0FAB 0FB7;0FAB 0FB7;0FAB 0FB7;0FAB 0FB7;
+0FB9;0F90 0FB5;0F90 0FB5;0F90 0FB5;0F90 0FB5;
+1026;1026;1025 102E;1026;1025 102E;
+10FC;10FC;10FC;10DC;10DC;
+1B06;1B06;1B05 1B35;1B06;1B05 1B35;
+1B08;1B08;1B07 1B35;1B08;1B07 1B35;
+1B0A;1B0A;1B09 1B35;1B0A;1B09 1B35;
+1B0C;1B0C;1B0B 1B35;1B0C;1B0B 1B35;
+1B0E;1B0E;1B0D 1B35;1B0E;1B0D 1B35;
+1B12;1B12;1B11 1B35;1B12;1B11 1B35;
+1B3B;1B3B;1B3A 1B35;1B3B;1B3A 1B35;
+1B3D;1B3D;1B3C 1B35;1B3D;1B3C 1B35;
+1B40;1B40;1B3E 1B35;1B40;1B3E 1B35;
+1B41;1B41;1B3F 1B35;1B41;1B3F 1B35;
+1B43;1B43;1B42 1B35;1B43;1B42 1B35;
+1D2C;1D2C;1D2C;0041;0041;
+1D2D;1D2D;1D2D;00C6;00C6;
+1D2E;1D2E;1D2E;0042;0042;
+1D30;1D30;1D30;0044;0044;
+1D31;1D31;1D31;0045;0045;
+1D32;1D32;1D32;018E;018E;
+1D33;1D33;1D33;0047;0047;
+1D34;1D34;1D34;0048;0048;
+1D35;1D35;1D35;0049;0049;
+1D36;1D36;1D36;004A;004A;
+1D37;1D37;1D37;004B;004B;
+1D38;1D38;1D38;004C;004C;
+1D39;1D39;1D39;004D;004D;
+1D3A;1D3A;1D3A;004E;004E;
+1D3C;1D3C;1D3C;004F;004F;
+1D3D;1D3D;1D3D;0222;0222;
+1D3E;1D3E;1D3E;0050;0050;
+1D3F;1D3F;1D3F;0052;0052;
+1D40;1D40;1D40;0054;0054;
+1D41;1D41;1D41;0055;0055;
+1D42;1D42;1D42;0057;0057;
+1D43;1D43;1D43;0061;0061;
+1D44;1D44;1D44;0250;0250;
+1D45;1D45;1D45;0251;0251;
+1D46;1D46;1D46;1D02;1D02;
+1D47;1D47;1D47;0062;0062;
+1D48;1D48;1D48;0064;0064;
+1D49;1D49;1D49;0065;0065;
+1D4A;1D4A;1D4A;0259;0259;
+1D4B;1D4B;1D4B;025B;025B;
+1D4C;1D4C;1D4C;025C;025C;
+1D4D;1D4D;1D4D;0067;0067;
+1D4F;1D4F;1D4F;006B;006B;
+1D50;1D50;1D50;006D;006D;
+1D51;1D51;1D51;014B;014B;
+1D52;1D52;1D52;006F;006F;
+1D53;1D53;1D53;0254;0254;
+1D54;1D54;1D54;1D16;1D16;
+1D55;1D55;1D55;1D17;1D17;
+1D56;1D56;1D56;0070;0070;
+1D57;1D57;1D57;0074;0074;
+1D58;1D58;1D58;0075;0075;
+1D59;1D59;1D59;1D1D;1D1D;
+1D5A;1D5A;1D5A;026F;026F;
+1D5B;1D5B;1D5B;0076;0076;
+1D5C;1D5C;1D5C;1D25;1D25;
+1D5D;1D5D;1D5D;03B2;03B2;
+1D5E;1D5E;1D5E;03B3;03B3;
+1D5F;1D5F;1D5F;03B4;03B4;
+1D60;1D60;1D60;03C6;03C6;
+1D61;1D61;1D61;03C7;03C7;
+1D62;1D62;1D62;0069;0069;
+1D63;1D63;1D63;0072;0072;
+1D64;1D64;1D64;0075;0075;
+1D65;1D65;1D65;0076;0076;
+1D66;1D66;1D66;03B2;03B2;
+1D67;1D67;1D67;03B3;03B3;
+1D68;1D68;1D68;03C1;03C1;
+1D69;1D69;1D69;03C6;03C6;
+1D6A;1D6A;1D6A;03C7;03C7;
+1D78;1D78;1D78;043D;043D;
+1D9B;1D9B;1D9B;0252;0252;
+1D9C;1D9C;1D9C;0063;0063;
+1D9D;1D9D;1D9D;0255;0255;
+1D9E;1D9E;1D9E;00F0;00F0;
+1D9F;1D9F;1D9F;025C;025C;
+1DA0;1DA0;1DA0;0066;0066;
+1DA1;1DA1;1DA1;025F;025F;
+1DA2;1DA2;1DA2;0261;0261;
+1DA3;1DA3;1DA3;0265;0265;
+1DA4;1DA4;1DA4;0268;0268;
+1DA5;1DA5;1DA5;0269;0269;
+1DA6;1DA6;1DA6;026A;026A;
+1DA7;1DA7;1DA7;1D7B;1D7B;
+1DA8;1DA8;1DA8;029D;029D;
+1DA9;1DA9;1DA9;026D;026D;
+1DAA;1DAA;1DAA;1D85;1D85;
+1DAB;1DAB;1DAB;029F;029F;
+1DAC;1DAC;1DAC;0271;0271;
+1DAD;1DAD;1DAD;0270;0270;
+1DAE;1DAE;1DAE;0272;0272;
+1DAF;1DAF;1DAF;0273;0273;
+1DB0;1DB0;1DB0;0274;0274;
+1DB1;1DB1;1DB1;0275;0275;
+1DB2;1DB2;1DB2;0278;0278;
+1DB3;1DB3;1DB3;0282;0282;
+1DB4;1DB4;1DB4;0283;0283;
+1DB5;1DB5;1DB5;01AB;01AB;
+1DB6;1DB6;1DB6;0289;0289;
+1DB7;1DB7;1DB7;028A;028A;
+1DB8;1DB8;1DB8;1D1C;1D1C;
+1DB9;1DB9;1DB9;028B;028B;
+1DBA;1DBA;1DBA;028C;028C;
+1DBB;1DBB;1DBB;007A;007A;
+1DBC;1DBC;1DBC;0290;0290;
+1DBD;1DBD;1DBD;0291;0291;
+1DBE;1DBE;1DBE;0292;0292;
+1DBF;1DBF;1DBF;03B8;03B8;
+1E00;1E00;0041 0325;1E00;0041 0325;
+1E01;1E01;0061 0325;1E01;0061 0325;
+1E02;1E02;0042 0307;1E02;0042 0307;
+1E03;1E03;0062 0307;1E03;0062 0307;
+1E04;1E04;0042 0323;1E04;0042 0323;
+1E05;1E05;0062 0323;1E05;0062 0323;
+1E06;1E06;0042 0331;1E06;0042 0331;
+1E07;1E07;0062 0331;1E07;0062 0331;
+1E08;1E08;0043 0327 0301;1E08;0043 0327 0301;
+1E09;1E09;0063 0327 0301;1E09;0063 0327 0301;
+1E0A;1E0A;0044 0307;1E0A;0044 0307;
+1E0B;1E0B;0064 0307;1E0B;0064 0307;
+1E0C;1E0C;0044 0323;1E0C;0044 0323;
+1E0D;1E0D;0064 0323;1E0D;0064 0323;
+1E0E;1E0E;0044 0331;1E0E;0044 0331;
+1E0F;1E0F;0064 0331;1E0F;0064 0331;
+1E10;1E10;0044 0327;1E10;0044 0327;
+1E11;1E11;0064 0327;1E11;0064 0327;
+1E12;1E12;0044 032D;1E12;0044 032D;
+1E13;1E13;0064 032D;1E13;0064 032D;
+1E14;1E14;0045 0304 0300;1E14;0045 0304 0300;
+1E15;1E15;0065 0304 0300;1E15;0065 0304 0300;
+1E16;1E16;0045 0304 0301;1E16;0045 0304 0301;
+1E17;1E17;0065 0304 0301;1E17;0065 0304 0301;
+1E18;1E18;0045 032D;1E18;0045 032D;
+1E19;1E19;0065 032D;1E19;0065 032D;
+1E1A;1E1A;0045 0330;1E1A;0045 0330;
+1E1B;1E1B;0065 0330;1E1B;0065 0330;
+1E1C;1E1C;0045 0327 0306;1E1C;0045 0327 0306;
+1E1D;1E1D;0065 0327 0306;1E1D;0065 0327 0306;
+1E1E;1E1E;0046 0307;1E1E;0046 0307;
+1E1F;1E1F;0066 0307;1E1F;0066 0307;
+1E20;1E20;0047 0304;1E20;0047 0304;
+1E21;1E21;0067 0304;1E21;0067 0304;
+1E22;1E22;0048 0307;1E22;0048 0307;
+1E23;1E23;0068 0307;1E23;0068 0307;
+1E24;1E24;0048 0323;1E24;0048 0323;
+1E25;1E25;0068 0323;1E25;0068 0323;
+1E26;1E26;0048 0308;1E26;0048 0308;
+1E27;1E27;0068 0308;1E27;0068 0308;
+1E28;1E28;0048 0327;1E28;0048 0327;
+1E29;1E29;0068 0327;1E29;0068 0327;
+1E2A;1E2A;0048 032E;1E2A;0048 032E;
+1E2B;1E2B;0068 032E;1E2B;0068 032E;
+1E2C;1E2C;0049 0330;1E2C;0049 0330;
+1E2D;1E2D;0069 0330;1E2D;0069 0330;
+1E2E;1E2E;0049 0308 0301;1E2E;0049 0308 0301;
+1E2F;1E2F;0069 0308 0301;1E2F;0069 0308 0301;
+1E30;1E30;004B 0301;1E30;004B 0301;
+1E31;1E31;006B 0301;1E31;006B 0301;
+1E32;1E32;004B 0323;1E32;004B 0323;
+1E33;1E33;006B 0323;1E33;006B 0323;
+1E34;1E34;004B 0331;1E34;004B 0331;
+1E35;1E35;006B 0331;1E35;006B 0331;
+1E36;1E36;004C 0323;1E36;004C 0323;
+1E37;1E37;006C 0323;1E37;006C 0323;
+1E38;1E38;004C 0323 0304;1E38;004C 0323 0304;
+1E39;1E39;006C 0323 0304;1E39;006C 0323 0304;
+1E3A;1E3A;004C 0331;1E3A;004C 0331;
+1E3B;1E3B;006C 0331;1E3B;006C 0331;
+1E3C;1E3C;004C 032D;1E3C;004C 032D;
+1E3D;1E3D;006C 032D;1E3D;006C 032D;
+1E3E;1E3E;004D 0301;1E3E;004D 0301;
+1E3F;1E3F;006D 0301;1E3F;006D 0301;
+1E40;1E40;004D 0307;1E40;004D 0307;
+1E41;1E41;006D 0307;1E41;006D 0307;
+1E42;1E42;004D 0323;1E42;004D 0323;
+1E43;1E43;006D 0323;1E43;006D 0323;
+1E44;1E44;004E 0307;1E44;004E 0307;
+1E45;1E45;006E 0307;1E45;006E 0307;
+1E46;1E46;004E 0323;1E46;004E 0323;
+1E47;1E47;006E 0323;1E47;006E 0323;
+1E48;1E48;004E 0331;1E48;004E 0331;
+1E49;1E49;006E 0331;1E49;006E 0331;
+1E4A;1E4A;004E 032D;1E4A;004E 032D;
+1E4B;1E4B;006E 032D;1E4B;006E 032D;
+1E4C;1E4C;004F 0303 0301;1E4C;004F 0303 0301;
+1E4D;1E4D;006F 0303 0301;1E4D;006F 0303 0301;
+1E4E;1E4E;004F 0303 0308;1E4E;004F 0303 0308;
+1E4F;1E4F;006F 0303 0308;1E4F;006F 0303 0308;
+1E50;1E50;004F 0304 0300;1E50;004F 0304 0300;
+1E51;1E51;006F 0304 0300;1E51;006F 0304 0300;
+1E52;1E52;004F 0304 0301;1E52;004F 0304 0301;
+1E53;1E53;006F 0304 0301;1E53;006F 0304 0301;
+1E54;1E54;0050 0301;1E54;0050 0301;
+1E55;1E55;0070 0301;1E55;0070 0301;
+1E56;1E56;0050 0307;1E56;0050 0307;
+1E57;1E57;0070 0307;1E57;0070 0307;
+1E58;1E58;0052 0307;1E58;0052 0307;
+1E59;1E59;0072 0307;1E59;0072 0307;
+1E5A;1E5A;0052 0323;1E5A;0052 0323;
+1E5B;1E5B;0072 0323;1E5B;0072 0323;
+1E5C;1E5C;0052 0323 0304;1E5C;0052 0323 0304;
+1E5D;1E5D;0072 0323 0304;1E5D;0072 0323 0304;
+1E5E;1E5E;0052 0331;1E5E;0052 0331;
+1E5F;1E5F;0072 0331;1E5F;0072 0331;
+1E60;1E60;0053 0307;1E60;0053 0307;
+1E61;1E61;0073 0307;1E61;0073 0307;
+1E62;1E62;0053 0323;1E62;0053 0323;
+1E63;1E63;0073 0323;1E63;0073 0323;
+1E64;1E64;0053 0301 0307;1E64;0053 0301 0307;
+1E65;1E65;0073 0301 0307;1E65;0073 0301 0307;
+1E66;1E66;0053 030C 0307;1E66;0053 030C 0307;
+1E67;1E67;0073 030C 0307;1E67;0073 030C 0307;
+1E68;1E68;0053 0323 0307;1E68;0053 0323 0307;
+1E69;1E69;0073 0323 0307;1E69;0073 0323 0307;
+1E6A;1E6A;0054 0307;1E6A;0054 0307;
+1E6B;1E6B;0074 0307;1E6B;0074 0307;
+1E6C;1E6C;0054 0323;1E6C;0054 0323;
+1E6D;1E6D;0074 0323;1E6D;0074 0323;
+1E6E;1E6E;0054 0331;1E6E;0054 0331;
+1E6F;1E6F;0074 0331;1E6F;0074 0331;
+1E70;1E70;0054 032D;1E70;0054 032D;
+1E71;1E71;0074 032D;1E71;0074 032D;
+1E72;1E72;0055 0324;1E72;0055 0324;
+1E73;1E73;0075 0324;1E73;0075 0324;
+1E74;1E74;0055 0330;1E74;0055 0330;
+1E75;1E75;0075 0330;1E75;0075 0330;
+1E76;1E76;0055 032D;1E76;0055 032D;
+1E77;1E77;0075 032D;1E77;0075 032D;
+1E78;1E78;0055 0303 0301;1E78;0055 0303 0301;
+1E79;1E79;0075 0303 0301;1E79;0075 0303 0301;
+1E7A;1E7A;0055 0304 0308;1E7A;0055 0304 0308;
+1E7B;1E7B;0075 0304 0308;1E7B;0075 0304 0308;
+1E7C;1E7C;0056 0303;1E7C;0056 0303;
+1E7D;1E7D;0076 0303;1E7D;0076 0303;
+1E7E;1E7E;0056 0323;1E7E;0056 0323;
+1E7F;1E7F;0076 0323;1E7F;0076 0323;
+1E80;1E80;0057 0300;1E80;0057 0300;
+1E81;1E81;0077 0300;1E81;0077 0300;
+1E82;1E82;0057 0301;1E82;0057 0301;
+1E83;1E83;0077 0301;1E83;0077 0301;
+1E84;1E84;0057 0308;1E84;0057 0308;
+1E85;1E85;0077 0308;1E85;0077 0308;
+1E86;1E86;0057 0307;1E86;0057 0307;
+1E87;1E87;0077 0307;1E87;0077 0307;
+1E88;1E88;0057 0323;1E88;0057 0323;
+1E89;1E89;0077 0323;1E89;0077 0323;
+1E8A;1E8A;0058 0307;1E8A;0058 0307;
+1E8B;1E8B;0078 0307;1E8B;0078 0307;
+1E8C;1E8C;0058 0308;1E8C;0058 0308;
+1E8D;1E8D;0078 0308;1E8D;0078 0308;
+1E8E;1E8E;0059 0307;1E8E;0059 0307;
+1E8F;1E8F;0079 0307;1E8F;0079 0307;
+1E90;1E90;005A 0302;1E90;005A 0302;
+1E91;1E91;007A 0302;1E91;007A 0302;
+1E92;1E92;005A 0323;1E92;005A 0323;
+1E93;1E93;007A 0323;1E93;007A 0323;
+1E94;1E94;005A 0331;1E94;005A 0331;
+1E95;1E95;007A 0331;1E95;007A 0331;
+1E96;1E96;0068 0331;1E96;0068 0331;
+1E97;1E97;0074 0308;1E97;0074 0308;
+1E98;1E98;0077 030A;1E98;0077 030A;
+1E99;1E99;0079 030A;1E99;0079 030A;
+1E9A;1E9A;1E9A;0061 02BE;0061 02BE;
+1E9B;1E9B;017F 0307;1E61;0073 0307;
+1EA0;1EA0;0041 0323;1EA0;0041 0323;
+1EA1;1EA1;0061 0323;1EA1;0061 0323;
+1EA2;1EA2;0041 0309;1EA2;0041 0309;
+1EA3;1EA3;0061 0309;1EA3;0061 0309;
+1EA4;1EA4;0041 0302 0301;1EA4;0041 0302 0301;
+1EA5;1EA5;0061 0302 0301;1EA5;0061 0302 0301;
+1EA6;1EA6;0041 0302 0300;1EA6;0041 0302 0300;
+1EA7;1EA7;0061 0302 0300;1EA7;0061 0302 0300;
+1EA8;1EA8;0041 0302 0309;1EA8;0041 0302 0309;
+1EA9;1EA9;0061 0302 0309;1EA9;0061 0302 0309;
+1EAA;1EAA;0041 0302 0303;1EAA;0041 0302 0303;
+1EAB;1EAB;0061 0302 0303;1EAB;0061 0302 0303;
+1EAC;1EAC;0041 0323 0302;1EAC;0041 0323 0302;
+1EAD;1EAD;0061 0323 0302;1EAD;0061 0323 0302;
+1EAE;1EAE;0041 0306 0301;1EAE;0041 0306 0301;
+1EAF;1EAF;0061 0306 0301;1EAF;0061 0306 0301;
+1EB0;1EB0;0041 0306 0300;1EB0;0041 0306 0300;
+1EB1;1EB1;0061 0306 0300;1EB1;0061 0306 0300;
+1EB2;1EB2;0041 0306 0309;1EB2;0041 0306 0309;
+1EB3;1EB3;0061 0306 0309;1EB3;0061 0306 0309;
+1EB4;1EB4;0041 0306 0303;1EB4;0041 0306 0303;
+1EB5;1EB5;0061 0306 0303;1EB5;0061 0306 0303;
+1EB6;1EB6;0041 0323 0306;1EB6;0041 0323 0306;
+1EB7;1EB7;0061 0323 0306;1EB7;0061 0323 0306;
+1EB8;1EB8;0045 0323;1EB8;0045 0323;
+1EB9;1EB9;0065 0323;1EB9;0065 0323;
+1EBA;1EBA;0045 0309;1EBA;0045 0309;
+1EBB;1EBB;0065 0309;1EBB;0065 0309;
+1EBC;1EBC;0045 0303;1EBC;0045 0303;
+1EBD;1EBD;0065 0303;1EBD;0065 0303;
+1EBE;1EBE;0045 0302 0301;1EBE;0045 0302 0301;
+1EBF;1EBF;0065 0302 0301;1EBF;0065 0302 0301;
+1EC0;1EC0;0045 0302 0300;1EC0;0045 0302 0300;
+1EC1;1EC1;0065 0302 0300;1EC1;0065 0302 0300;
+1EC2;1EC2;0045 0302 0309;1EC2;0045 0302 0309;
+1EC3;1EC3;0065 0302 0309;1EC3;0065 0302 0309;
+1EC4;1EC4;0045 0302 0303;1EC4;0045 0302 0303;
+1EC5;1EC5;0065 0302 0303;1EC5;0065 0302 0303;
+1EC6;1EC6;0045 0323 0302;1EC6;0045 0323 0302;
+1EC7;1EC7;0065 0323 0302;1EC7;0065 0323 0302;
+1EC8;1EC8;0049 0309;1EC8;0049 0309;
+1EC9;1EC9;0069 0309;1EC9;0069 0309;
+1ECA;1ECA;0049 0323;1ECA;0049 0323;
+1ECB;1ECB;0069 0323;1ECB;0069 0323;
+1ECC;1ECC;004F 0323;1ECC;004F 0323;
+1ECD;1ECD;006F 0323;1ECD;006F 0323;
+1ECE;1ECE;004F 0309;1ECE;004F 0309;
+1ECF;1ECF;006F 0309;1ECF;006F 0309;
+1ED0;1ED0;004F 0302 0301;1ED0;004F 0302 0301;
+1ED1;1ED1;006F 0302 0301;1ED1;006F 0302 0301;
+1ED2;1ED2;004F 0302 0300;1ED2;004F 0302 0300;
+1ED3;1ED3;006F 0302 0300;1ED3;006F 0302 0300;
+1ED4;1ED4;004F 0302 0309;1ED4;004F 0302 0309;
+1ED5;1ED5;006F 0302 0309;1ED5;006F 0302 0309;
+1ED6;1ED6;004F 0302 0303;1ED6;004F 0302 0303;
+1ED7;1ED7;006F 0302 0303;1ED7;006F 0302 0303;
+1ED8;1ED8;004F 0323 0302;1ED8;004F 0323 0302;
+1ED9;1ED9;006F 0323 0302;1ED9;006F 0323 0302;
+1EDA;1EDA;004F 031B 0301;1EDA;004F 031B 0301;
+1EDB;1EDB;006F 031B 0301;1EDB;006F 031B 0301;
+1EDC;1EDC;004F 031B 0300;1EDC;004F 031B 0300;
+1EDD;1EDD;006F 031B 0300;1EDD;006F 031B 0300;
+1EDE;1EDE;004F 031B 0309;1EDE;004F 031B 0309;
+1EDF;1EDF;006F 031B 0309;1EDF;006F 031B 0309;
+1EE0;1EE0;004F 031B 0303;1EE0;004F 031B 0303;
+1EE1;1EE1;006F 031B 0303;1EE1;006F 031B 0303;
+1EE2;1EE2;004F 031B 0323;1EE2;004F 031B 0323;
+1EE3;1EE3;006F 031B 0323;1EE3;006F 031B 0323;
+1EE4;1EE4;0055 0323;1EE4;0055 0323;
+1EE5;1EE5;0075 0323;1EE5;0075 0323;
+1EE6;1EE6;0055 0309;1EE6;0055 0309;
+1EE7;1EE7;0075 0309;1EE7;0075 0309;
+1EE8;1EE8;0055 031B 0301;1EE8;0055 031B 0301;
+1EE9;1EE9;0075 031B 0301;1EE9;0075 031B 0301;
+1EEA;1EEA;0055 031B 0300;1EEA;0055 031B 0300;
+1EEB;1EEB;0075 031B 0300;1EEB;0075 031B 0300;
+1EEC;1EEC;0055 031B 0309;1EEC;0055 031B 0309;
+1EED;1EED;0075 031B 0309;1EED;0075 031B 0309;
+1EEE;1EEE;0055 031B 0303;1EEE;0055 031B 0303;
+1EEF;1EEF;0075 031B 0303;1EEF;0075 031B 0303;
+1EF0;1EF0;0055 031B 0323;1EF0;0055 031B 0323;
+1EF1;1EF1;0075 031B 0323;1EF1;0075 031B 0323;
+1EF2;1EF2;0059 0300;1EF2;0059 0300;
+1EF3;1EF3;0079 0300;1EF3;0079 0300;
+1EF4;1EF4;0059 0323;1EF4;0059 0323;
+1EF5;1EF5;0079 0323;1EF5;0079 0323;
+1EF6;1EF6;0059 0309;1EF6;0059 0309;
+1EF7;1EF7;0079 0309;1EF7;0079 0309;
+1EF8;1EF8;0059 0303;1EF8;0059 0303;
+1EF9;1EF9;0079 0303;1EF9;0079 0303;
+1F00;1F00;03B1 0313;1F00;03B1 0313;
+1F01;1F01;03B1 0314;1F01;03B1 0314;
+1F02;1F02;03B1 0313 0300;1F02;03B1 0313 0300;
+1F03;1F03;03B1 0314 0300;1F03;03B1 0314 0300;
+1F04;1F04;03B1 0313 0301;1F04;03B1 0313 0301;
+1F05;1F05;03B1 0314 0301;1F05;03B1 0314 0301;
+1F06;1F06;03B1 0313 0342;1F06;03B1 0313 0342;
+1F07;1F07;03B1 0314 0342;1F07;03B1 0314 0342;
+1F08;1F08;0391 0313;1F08;0391 0313;
+1F09;1F09;0391 0314;1F09;0391 0314;
+1F0A;1F0A;0391 0313 0300;1F0A;0391 0313 0300;
+1F0B;1F0B;0391 0314 0300;1F0B;0391 0314 0300;
+1F0C;1F0C;0391 0313 0301;1F0C;0391 0313 0301;
+1F0D;1F0D;0391 0314 0301;1F0D;0391 0314 0301;
+1F0E;1F0E;0391 0313 0342;1F0E;0391 0313 0342;
+1F0F;1F0F;0391 0314 0342;1F0F;0391 0314 0342;
+1F10;1F10;03B5 0313;1F10;03B5 0313;
+1F11;1F11;03B5 0314;1F11;03B5 0314;
+1F12;1F12;03B5 0313 0300;1F12;03B5 0313 0300;
+1F13;1F13;03B5 0314 0300;1F13;03B5 0314 0300;
+1F14;1F14;03B5 0313 0301;1F14;03B5 0313 0301;
+1F15;1F15;03B5 0314 0301;1F15;03B5 0314 0301;
+1F18;1F18;0395 0313;1F18;0395 0313;
+1F19;1F19;0395 0314;1F19;0395 0314;
+1F1A;1F1A;0395 0313 0300;1F1A;0395 0313 0300;
+1F1B;1F1B;0395 0314 0300;1F1B;0395 0314 0300;
+1F1C;1F1C;0395 0313 0301;1F1C;0395 0313 0301;
+1F1D;1F1D;0395 0314 0301;1F1D;0395 0314 0301;
+1F20;1F20;03B7 0313;1F20;03B7 0313;
+1F21;1F21;03B7 0314;1F21;03B7 0314;
+1F22;1F22;03B7 0313 0300;1F22;03B7 0313 0300;
+1F23;1F23;03B7 0314 0300;1F23;03B7 0314 0300;
+1F24;1F24;03B7 0313 0301;1F24;03B7 0313 0301;
+1F25;1F25;03B7 0314 0301;1F25;03B7 0314 0301;
+1F26;1F26;03B7 0313 0342;1F26;03B7 0313 0342;
+1F27;1F27;03B7 0314 0342;1F27;03B7 0314 0342;
+1F28;1F28;0397 0313;1F28;0397 0313;
+1F29;1F29;0397 0314;1F29;0397 0314;
+1F2A;1F2A;0397 0313 0300;1F2A;0397 0313 0300;
+1F2B;1F2B;0397 0314 0300;1F2B;0397 0314 0300;
+1F2C;1F2C;0397 0313 0301;1F2C;0397 0313 0301;
+1F2D;1F2D;0397 0314 0301;1F2D;0397 0314 0301;
+1F2E;1F2E;0397 0313 0342;1F2E;0397 0313 0342;
+1F2F;1F2F;0397 0314 0342;1F2F;0397 0314 0342;
+1F30;1F30;03B9 0313;1F30;03B9 0313;
+1F31;1F31;03B9 0314;1F31;03B9 0314;
+1F32;1F32;03B9 0313 0300;1F32;03B9 0313 0300;
+1F33;1F33;03B9 0314 0300;1F33;03B9 0314 0300;
+1F34;1F34;03B9 0313 0301;1F34;03B9 0313 0301;
+1F35;1F35;03B9 0314 0301;1F35;03B9 0314 0301;
+1F36;1F36;03B9 0313 0342;1F36;03B9 0313 0342;
+1F37;1F37;03B9 0314 0342;1F37;03B9 0314 0342;
+1F38;1F38;0399 0313;1F38;0399 0313;
+1F39;1F39;0399 0314;1F39;0399 0314;
+1F3A;1F3A;0399 0313 0300;1F3A;0399 0313 0300;
+1F3B;1F3B;0399 0314 0300;1F3B;0399 0314 0300;
+1F3C;1F3C;0399 0313 0301;1F3C;0399 0313 0301;
+1F3D;1F3D;0399 0314 0301;1F3D;0399 0314 0301;
+1F3E;1F3E;0399 0313 0342;1F3E;0399 0313 0342;
+1F3F;1F3F;0399 0314 0342;1F3F;0399 0314 0342;
+1F40;1F40;03BF 0313;1F40;03BF 0313;
+1F41;1F41;03BF 0314;1F41;03BF 0314;
+1F42;1F42;03BF 0313 0300;1F42;03BF 0313 0300;
+1F43;1F43;03BF 0314 0300;1F43;03BF 0314 0300;
+1F44;1F44;03BF 0313 0301;1F44;03BF 0313 0301;
+1F45;1F45;03BF 0314 0301;1F45;03BF 0314 0301;
+1F48;1F48;039F 0313;1F48;039F 0313;
+1F49;1F49;039F 0314;1F49;039F 0314;
+1F4A;1F4A;039F 0313 0300;1F4A;039F 0313 0300;
+1F4B;1F4B;039F 0314 0300;1F4B;039F 0314 0300;
+1F4C;1F4C;039F 0313 0301;1F4C;039F 0313 0301;
+1F4D;1F4D;039F 0314 0301;1F4D;039F 0314 0301;
+1F50;1F50;03C5 0313;1F50;03C5 0313;
+1F51;1F51;03C5 0314;1F51;03C5 0314;
+1F52;1F52;03C5 0313 0300;1F52;03C5 0313 0300;
+1F53;1F53;03C5 0314 0300;1F53;03C5 0314 0300;
+1F54;1F54;03C5 0313 0301;1F54;03C5 0313 0301;
+1F55;1F55;03C5 0314 0301;1F55;03C5 0314 0301;
+1F56;1F56;03C5 0313 0342;1F56;03C5 0313 0342;
+1F57;1F57;03C5 0314 0342;1F57;03C5 0314 0342;
+1F59;1F59;03A5 0314;1F59;03A5 0314;
+1F5B;1F5B;03A5 0314 0300;1F5B;03A5 0314 0300;
+1F5D;1F5D;03A5 0314 0301;1F5D;03A5 0314 0301;
+1F5F;1F5F;03A5 0314 0342;1F5F;03A5 0314 0342;
+1F60;1F60;03C9 0313;1F60;03C9 0313;
+1F61;1F61;03C9 0314;1F61;03C9 0314;
+1F62;1F62;03C9 0313 0300;1F62;03C9 0313 0300;
+1F63;1F63;03C9 0314 0300;1F63;03C9 0314 0300;
+1F64;1F64;03C9 0313 0301;1F64;03C9 0313 0301;
+1F65;1F65;03C9 0314 0301;1F65;03C9 0314 0301;
+1F66;1F66;03C9 0313 0342;1F66;03C9 0313 0342;
+1F67;1F67;03C9 0314 0342;1F67;03C9 0314 0342;
+1F68;1F68;03A9 0313;1F68;03A9 0313;
+1F69;1F69;03A9 0314;1F69;03A9 0314;
+1F6A;1F6A;03A9 0313 0300;1F6A;03A9 0313 0300;
+1F6B;1F6B;03A9 0314 0300;1F6B;03A9 0314 0300;
+1F6C;1F6C;03A9 0313 0301;1F6C;03A9 0313 0301;
+1F6D;1F6D;03A9 0314 0301;1F6D;03A9 0314 0301;
+1F6E;1F6E;03A9 0313 0342;1F6E;03A9 0313 0342;
+1F6F;1F6F;03A9 0314 0342;1F6F;03A9 0314 0342;
+1F70;1F70;03B1 0300;1F70;03B1 0300;
+1F71;03AC;03B1 0301;03AC;03B1 0301;
+1F72;1F72;03B5 0300;1F72;03B5 0300;
+1F73;03AD;03B5 0301;03AD;03B5 0301;
+1F74;1F74;03B7 0300;1F74;03B7 0300;
+1F75;03AE;03B7 0301;03AE;03B7 0301;
+1F76;1F76;03B9 0300;1F76;03B9 0300;
+1F77;03AF;03B9 0301;03AF;03B9 0301;
+1F78;1F78;03BF 0300;1F78;03BF 0300;
+1F79;03CC;03BF 0301;03CC;03BF 0301;
+1F7A;1F7A;03C5 0300;1F7A;03C5 0300;
+1F7B;03CD;03C5 0301;03CD;03C5 0301;
+1F7C;1F7C;03C9 0300;1F7C;03C9 0300;
+1F7D;03CE;03C9 0301;03CE;03C9 0301;
+1F80;1F80;03B1 0313 0345;1F80;03B1 0313 0345;
+1F81;1F81;03B1 0314 0345;1F81;03B1 0314 0345;
+1F82;1F82;03B1 0313 0300 0345;1F82;03B1 0313 0300 0345;
+1F83;1F83;03B1 0314 0300 0345;1F83;03B1 0314 0300 0345;
+1F84;1F84;03B1 0313 0301 0345;1F84;03B1 0313 0301 0345;
+1F85;1F85;03B1 0314 0301 0345;1F85;03B1 0314 0301 0345;
+1F86;1F86;03B1 0313 0342 0345;1F86;03B1 0313 0342 0345;
+1F87;1F87;03B1 0314 0342 0345;1F87;03B1 0314 0342 0345;
+1F88;1F88;0391 0313 0345;1F88;0391 0313 0345;
+1F89;1F89;0391 0314 0345;1F89;0391 0314 0345;
+1F8A;1F8A;0391 0313 0300 0345;1F8A;0391 0313 0300 0345;
+1F8B;1F8B;0391 0314 0300 0345;1F8B;0391 0314 0300 0345;
+1F8C;1F8C;0391 0313 0301 0345;1F8C;0391 0313 0301 0345;
+1F8D;1F8D;0391 0314 0301 0345;1F8D;0391 0314 0301 0345;
+1F8E;1F8E;0391 0313 0342 0345;1F8E;0391 0313 0342 0345;
+1F8F;1F8F;0391 0314 0342 0345;1F8F;0391 0314 0342 0345;
+1F90;1F90;03B7 0313 0345;1F90;03B7 0313 0345;
+1F91;1F91;03B7 0314 0345;1F91;03B7 0314 0345;
+1F92;1F92;03B7 0313 0300 0345;1F92;03B7 0313 0300 0345;
+1F93;1F93;03B7 0314 0300 0345;1F93;03B7 0314 0300 0345;
+1F94;1F94;03B7 0313 0301 0345;1F94;03B7 0313 0301 0345;
+1F95;1F95;03B7 0314 0301 0345;1F95;03B7 0314 0301 0345;
+1F96;1F96;03B7 0313 0342 0345;1F96;03B7 0313 0342 0345;
+1F97;1F97;03B7 0314 0342 0345;1F97;03B7 0314 0342 0345;
+1F98;1F98;0397 0313 0345;1F98;0397 0313 0345;
+1F99;1F99;0397 0314 0345;1F99;0397 0314 0345;
+1F9A;1F9A;0397 0313 0300 0345;1F9A;0397 0313 0300 0345;
+1F9B;1F9B;0397 0314 0300 0345;1F9B;0397 0314 0300 0345;
+1F9C;1F9C;0397 0313 0301 0345;1F9C;0397 0313 0301 0345;
+1F9D;1F9D;0397 0314 0301 0345;1F9D;0397 0314 0301 0345;
+1F9E;1F9E;0397 0313 0342 0345;1F9E;0397 0313 0342 0345;
+1F9F;1F9F;0397 0314 0342 0345;1F9F;0397 0314 0342 0345;
+1FA0;1FA0;03C9 0313 0345;1FA0;03C9 0313 0345;
+1FA1;1FA1;03C9 0314 0345;1FA1;03C9 0314 0345;
+1FA2;1FA2;03C9 0313 0300 0345;1FA2;03C9 0313 0300 0345;
+1FA3;1FA3;03C9 0314 0300 0345;1FA3;03C9 0314 0300 0345;
+1FA4;1FA4;03C9 0313 0301 0345;1FA4;03C9 0313 0301 0345;
+1FA5;1FA5;03C9 0314 0301 0345;1FA5;03C9 0314 0301 0345;
+1FA6;1FA6;03C9 0313 0342 0345;1FA6;03C9 0313 0342 0345;
+1FA7;1FA7;03C9 0314 0342 0345;1FA7;03C9 0314 0342 0345;
+1FA8;1FA8;03A9 0313 0345;1FA8;03A9 0313 0345;
+1FA9;1FA9;03A9 0314 0345;1FA9;03A9 0314 0345;
+1FAA;1FAA;03A9 0313 0300 0345;1FAA;03A9 0313 0300 0345;
+1FAB;1FAB;03A9 0314 0300 0345;1FAB;03A9 0314 0300 0345;
+1FAC;1FAC;03A9 0313 0301 0345;1FAC;03A9 0313 0301 0345;
+1FAD;1FAD;03A9 0314 0301 0345;1FAD;03A9 0314 0301 0345;
+1FAE;1FAE;03A9 0313 0342 0345;1FAE;03A9 0313 0342 0345;
+1FAF;1FAF;03A9 0314 0342 0345;1FAF;03A9 0314 0342 0345;
+1FB0;1FB0;03B1 0306;1FB0;03B1 0306;
+1FB1;1FB1;03B1 0304;1FB1;03B1 0304;
+1FB2;1FB2;03B1 0300 0345;1FB2;03B1 0300 0345;
+1FB3;1FB3;03B1 0345;1FB3;03B1 0345;
+1FB4;1FB4;03B1 0301 0345;1FB4;03B1 0301 0345;
+1FB6;1FB6;03B1 0342;1FB6;03B1 0342;
+1FB7;1FB7;03B1 0342 0345;1FB7;03B1 0342 0345;
+1FB8;1FB8;0391 0306;1FB8;0391 0306;
+1FB9;1FB9;0391 0304;1FB9;0391 0304;
+1FBA;1FBA;0391 0300;1FBA;0391 0300;
+1FBB;0386;0391 0301;0386;0391 0301;
+1FBC;1FBC;0391 0345;1FBC;0391 0345;
+1FBD;1FBD;1FBD;0020 0313;0020 0313;
+1FBE;03B9;03B9;03B9;03B9;
+1FBF;1FBF;1FBF;0020 0313;0020 0313;
+1FC0;1FC0;1FC0;0020 0342;0020 0342;
+1FC1;1FC1;00A8 0342;0020 0308 0342;0020 0308 0342;
+1FC2;1FC2;03B7 0300 0345;1FC2;03B7 0300 0345;
+1FC3;1FC3;03B7 0345;1FC3;03B7 0345;
+1FC4;1FC4;03B7 0301 0345;1FC4;03B7 0301 0345;
+1FC6;1FC6;03B7 0342;1FC6;03B7 0342;
+1FC7;1FC7;03B7 0342 0345;1FC7;03B7 0342 0345;
+1FC8;1FC8;0395 0300;1FC8;0395 0300;
+1FC9;0388;0395 0301;0388;0395 0301;
+1FCA;1FCA;0397 0300;1FCA;0397 0300;
+1FCB;0389;0397 0301;0389;0397 0301;
+1FCC;1FCC;0397 0345;1FCC;0397 0345;
+1FCD;1FCD;1FBF 0300;0020 0313 0300;0020 0313 0300;
+1FCE;1FCE;1FBF 0301;0020 0313 0301;0020 0313 0301;
+1FCF;1FCF;1FBF 0342;0020 0313 0342;0020 0313 0342;
+1FD0;1FD0;03B9 0306;1FD0;03B9 0306;
+1FD1;1FD1;03B9 0304;1FD1;03B9 0304;
+1FD2;1FD2;03B9 0308 0300;1FD2;03B9 0308 0300;
+1FD3;0390;03B9 0308 0301;0390;03B9 0308 0301;
+1FD6;1FD6;03B9 0342;1FD6;03B9 0342;
+1FD7;1FD7;03B9 0308 0342;1FD7;03B9 0308 0342;
+1FD8;1FD8;0399 0306;1FD8;0399 0306;
+1FD9;1FD9;0399 0304;1FD9;0399 0304;
+1FDA;1FDA;0399 0300;1FDA;0399 0300;
+1FDB;038A;0399 0301;038A;0399 0301;
+1FDD;1FDD;1FFE 0300;0020 0314 0300;0020 0314 0300;
+1FDE;1FDE;1FFE 0301;0020 0314 0301;0020 0314 0301;
+1FDF;1FDF;1FFE 0342;0020 0314 0342;0020 0314 0342;
+1FE0;1FE0;03C5 0306;1FE0;03C5 0306;
+1FE1;1FE1;03C5 0304;1FE1;03C5 0304;
+1FE2;1FE2;03C5 0308 0300;1FE2;03C5 0308 0300;
+1FE3;03B0;03C5 0308 0301;03B0;03C5 0308 0301;
+1FE4;1FE4;03C1 0313;1FE4;03C1 0313;
+1FE5;1FE5;03C1 0314;1FE5;03C1 0314;
+1FE6;1FE6;03C5 0342;1FE6;03C5 0342;
+1FE7;1FE7;03C5 0308 0342;1FE7;03C5 0308 0342;
+1FE8;1FE8;03A5 0306;1FE8;03A5 0306;
+1FE9;1FE9;03A5 0304;1FE9;03A5 0304;
+1FEA;1FEA;03A5 0300;1FEA;03A5 0300;
+1FEB;038E;03A5 0301;038E;03A5 0301;
+1FEC;1FEC;03A1 0314;1FEC;03A1 0314;
+1FED;1FED;00A8 0300;0020 0308 0300;0020 0308 0300;
+1FEE;0385;00A8 0301;0020 0308 0301;0020 0308 0301;
+1FEF;0060;0060;0060;0060;
+1FF2;1FF2;03C9 0300 0345;1FF2;03C9 0300 0345;
+1FF3;1FF3;03C9 0345;1FF3;03C9 0345;
+1FF4;1FF4;03C9 0301 0345;1FF4;03C9 0301 0345;
+1FF6;1FF6;03C9 0342;1FF6;03C9 0342;
+1FF7;1FF7;03C9 0342 0345;1FF7;03C9 0342 0345;
+1FF8;1FF8;039F 0300;1FF8;039F 0300;
+1FF9;038C;039F 0301;038C;039F 0301;
+1FFA;1FFA;03A9 0300;1FFA;03A9 0300;
+1FFB;038F;03A9 0301;038F;03A9 0301;
+1FFC;1FFC;03A9 0345;1FFC;03A9 0345;
+1FFD;00B4;00B4;0020 0301;0020 0301;
+1FFE;1FFE;1FFE;0020 0314;0020 0314;
+2000;2002;2002;0020;0020;
+2001;2003;2003;0020;0020;
+2002;2002;2002;0020;0020;
+2003;2003;2003;0020;0020;
+2004;2004;2004;0020;0020;
+2005;2005;2005;0020;0020;
+2006;2006;2006;0020;0020;
+2007;2007;2007;0020;0020;
+2008;2008;2008;0020;0020;
+2009;2009;2009;0020;0020;
+200A;200A;200A;0020;0020;
+2011;2011;2011;2010;2010;
+2017;2017;2017;0020 0333;0020 0333;
+2024;2024;2024;002E;002E;
+2025;2025;2025;002E 002E;002E 002E;
+2026;2026;2026;002E 002E 002E;002E 002E 002E;
+202F;202F;202F;0020;0020;
+2033;2033;2033;2032 2032;2032 2032;
+2034;2034;2034;2032 2032 2032;2032 2032 2032;
+2036;2036;2036;2035 2035;2035 2035;
+2037;2037;2037;2035 2035 2035;2035 2035 2035;
+203C;203C;203C;0021 0021;0021 0021;
+203E;203E;203E;0020 0305;0020 0305;
+2047;2047;2047;003F 003F;003F 003F;
+2048;2048;2048;003F 0021;003F 0021;
+2049;2049;2049;0021 003F;0021 003F;
+2057;2057;2057;2032 2032 2032 2032;2032 2032 2032 2032;
+205F;205F;205F;0020;0020;
+2070;2070;2070;0030;0030;
+2071;2071;2071;0069;0069;
+2074;2074;2074;0034;0034;
+2075;2075;2075;0035;0035;
+2076;2076;2076;0036;0036;
+2077;2077;2077;0037;0037;
+2078;2078;2078;0038;0038;
+2079;2079;2079;0039;0039;
+207A;207A;207A;002B;002B;
+207B;207B;207B;2212;2212;
+207C;207C;207C;003D;003D;
+207D;207D;207D;0028;0028;
+207E;207E;207E;0029;0029;
+207F;207F;207F;006E;006E;
+2080;2080;2080;0030;0030;
+2081;2081;2081;0031;0031;
+2082;2082;2082;0032;0032;
+2083;2083;2083;0033;0033;
+2084;2084;2084;0034;0034;
+2085;2085;2085;0035;0035;
+2086;2086;2086;0036;0036;
+2087;2087;2087;0037;0037;
+2088;2088;2088;0038;0038;
+2089;2089;2089;0039;0039;
+208A;208A;208A;002B;002B;
+208B;208B;208B;2212;2212;
+208C;208C;208C;003D;003D;
+208D;208D;208D;0028;0028;
+208E;208E;208E;0029;0029;
+2090;2090;2090;0061;0061;
+2091;2091;2091;0065;0065;
+2092;2092;2092;006F;006F;
+2093;2093;2093;0078;0078;
+2094;2094;2094;0259;0259;
+20A8;20A8;20A8;0052 0073;0052 0073;
+2100;2100;2100;0061 002F 0063;0061 002F 0063;
+2101;2101;2101;0061 002F 0073;0061 002F 0073;
+2102;2102;2102;0043;0043;
+2103;2103;2103;00B0 0043;00B0 0043;
+2105;2105;2105;0063 002F 006F;0063 002F 006F;
+2106;2106;2106;0063 002F 0075;0063 002F 0075;
+2107;2107;2107;0190;0190;
+2109;2109;2109;00B0 0046;00B0 0046;
+210A;210A;210A;0067;0067;
+210B;210B;210B;0048;0048;
+210C;210C;210C;0048;0048;
+210D;210D;210D;0048;0048;
+210E;210E;210E;0068;0068;
+210F;210F;210F;0127;0127;
+2110;2110;2110;0049;0049;
+2111;2111;2111;0049;0049;
+2112;2112;2112;004C;004C;
+2113;2113;2113;006C;006C;
+2115;2115;2115;004E;004E;
+2116;2116;2116;004E 006F;004E 006F;
+2119;2119;2119;0050;0050;
+211A;211A;211A;0051;0051;
+211B;211B;211B;0052;0052;
+211C;211C;211C;0052;0052;
+211D;211D;211D;0052;0052;
+2120;2120;2120;0053 004D;0053 004D;
+2121;2121;2121;0054 0045 004C;0054 0045 004C;
+2122;2122;2122;0054 004D;0054 004D;
+2124;2124;2124;005A;005A;
+2126;03A9;03A9;03A9;03A9;
+2128;2128;2128;005A;005A;
+212A;004B;004B;004B;004B;
+212B;00C5;0041 030A;00C5;0041 030A;
+212C;212C;212C;0042;0042;
+212D;212D;212D;0043;0043;
+212F;212F;212F;0065;0065;
+2130;2130;2130;0045;0045;
+2131;2131;2131;0046;0046;
+2133;2133;2133;004D;004D;
+2134;2134;2134;006F;006F;
+2135;2135;2135;05D0;05D0;
+2136;2136;2136;05D1;05D1;
+2137;2137;2137;05D2;05D2;
+2138;2138;2138;05D3;05D3;
+2139;2139;2139;0069;0069;
+213B;213B;213B;0046 0041 0058;0046 0041 0058;
+213C;213C;213C;03C0;03C0;
+213D;213D;213D;03B3;03B3;
+213E;213E;213E;0393;0393;
+213F;213F;213F;03A0;03A0;
+2140;2140;2140;2211;2211;
+2145;2145;2145;0044;0044;
+2146;2146;2146;0064;0064;
+2147;2147;2147;0065;0065;
+2148;2148;2148;0069;0069;
+2149;2149;2149;006A;006A;
+2153;2153;2153;0031 2044 0033;0031 2044 0033;
+2154;2154;2154;0032 2044 0033;0032 2044 0033;
+2155;2155;2155;0031 2044 0035;0031 2044 0035;
+2156;2156;2156;0032 2044 0035;0032 2044 0035;
+2157;2157;2157;0033 2044 0035;0033 2044 0035;
+2158;2158;2158;0034 2044 0035;0034 2044 0035;
+2159;2159;2159;0031 2044 0036;0031 2044 0036;
+215A;215A;215A;0035 2044 0036;0035 2044 0036;
+215B;215B;215B;0031 2044 0038;0031 2044 0038;
+215C;215C;215C;0033 2044 0038;0033 2044 0038;
+215D;215D;215D;0035 2044 0038;0035 2044 0038;
+215E;215E;215E;0037 2044 0038;0037 2044 0038;
+215F;215F;215F;0031 2044;0031 2044;
+2160;2160;2160;0049;0049;
+2161;2161;2161;0049 0049;0049 0049;
+2162;2162;2162;0049 0049 0049;0049 0049 0049;
+2163;2163;2163;0049 0056;0049 0056;
+2164;2164;2164;0056;0056;
+2165;2165;2165;0056 0049;0056 0049;
+2166;2166;2166;0056 0049 0049;0056 0049 0049;
+2167;2167;2167;0056 0049 0049 0049;0056 0049 0049 0049;
+2168;2168;2168;0049 0058;0049 0058;
+2169;2169;2169;0058;0058;
+216A;216A;216A;0058 0049;0058 0049;
+216B;216B;216B;0058 0049 0049;0058 0049 0049;
+216C;216C;216C;004C;004C;
+216D;216D;216D;0043;0043;
+216E;216E;216E;0044;0044;
+216F;216F;216F;004D;004D;
+2170;2170;2170;0069;0069;
+2171;2171;2171;0069 0069;0069 0069;
+2172;2172;2172;0069 0069 0069;0069 0069 0069;
+2173;2173;2173;0069 0076;0069 0076;
+2174;2174;2174;0076;0076;
+2175;2175;2175;0076 0069;0076 0069;
+2176;2176;2176;0076 0069 0069;0076 0069 0069;
+2177;2177;2177;0076 0069 0069 0069;0076 0069 0069 0069;
+2178;2178;2178;0069 0078;0069 0078;
+2179;2179;2179;0078;0078;
+217A;217A;217A;0078 0069;0078 0069;
+217B;217B;217B;0078 0069 0069;0078 0069 0069;
+217C;217C;217C;006C;006C;
+217D;217D;217D;0063;0063;
+217E;217E;217E;0064;0064;
+217F;217F;217F;006D;006D;
+219A;219A;2190 0338;219A;2190 0338;
+219B;219B;2192 0338;219B;2192 0338;
+21AE;21AE;2194 0338;21AE;2194 0338;
+21CD;21CD;21D0 0338;21CD;21D0 0338;
+21CE;21CE;21D4 0338;21CE;21D4 0338;
+21CF;21CF;21D2 0338;21CF;21D2 0338;
+2204;2204;2203 0338;2204;2203 0338;
+2209;2209;2208 0338;2209;2208 0338;
+220C;220C;220B 0338;220C;220B 0338;
+2224;2224;2223 0338;2224;2223 0338;
+2226;2226;2225 0338;2226;2225 0338;
+222C;222C;222C;222B 222B;222B 222B;
+222D;222D;222D;222B 222B 222B;222B 222B 222B;
+222F;222F;222F;222E 222E;222E 222E;
+2230;2230;2230;222E 222E 222E;222E 222E 222E;
+2241;2241;223C 0338;2241;223C 0338;
+2244;2244;2243 0338;2244;2243 0338;
+2247;2247;2245 0338;2247;2245 0338;
+2249;2249;2248 0338;2249;2248 0338;
+2260;2260;003D 0338;2260;003D 0338;
+2262;2262;2261 0338;2262;2261 0338;
+226D;226D;224D 0338;226D;224D 0338;
+226E;226E;003C 0338;226E;003C 0338;
+226F;226F;003E 0338;226F;003E 0338;
+2270;2270;2264 0338;2270;2264 0338;
+2271;2271;2265 0338;2271;2265 0338;
+2274;2274;2272 0338;2274;2272 0338;
+2275;2275;2273 0338;2275;2273 0338;
+2278;2278;2276 0338;2278;2276 0338;
+2279;2279;2277 0338;2279;2277 0338;
+2280;2280;227A 0338;2280;227A 0338;
+2281;2281;227B 0338;2281;227B 0338;
+2284;2284;2282 0338;2284;2282 0338;
+2285;2285;2283 0338;2285;2283 0338;
+2288;2288;2286 0338;2288;2286 0338;
+2289;2289;2287 0338;2289;2287 0338;
+22AC;22AC;22A2 0338;22AC;22A2 0338;
+22AD;22AD;22A8 0338;22AD;22A8 0338;
+22AE;22AE;22A9 0338;22AE;22A9 0338;
+22AF;22AF;22AB 0338;22AF;22AB 0338;
+22E0;22E0;227C 0338;22E0;227C 0338;
+22E1;22E1;227D 0338;22E1;227D 0338;
+22E2;22E2;2291 0338;22E2;2291 0338;
+22E3;22E3;2292 0338;22E3;2292 0338;
+22EA;22EA;22B2 0338;22EA;22B2 0338;
+22EB;22EB;22B3 0338;22EB;22B3 0338;
+22EC;22EC;22B4 0338;22EC;22B4 0338;
+22ED;22ED;22B5 0338;22ED;22B5 0338;
+2329;3008;3008;3008;3008;
+232A;3009;3009;3009;3009;
+2460;2460;2460;0031;0031;
+2461;2461;2461;0032;0032;
+2462;2462;2462;0033;0033;
+2463;2463;2463;0034;0034;
+2464;2464;2464;0035;0035;
+2465;2465;2465;0036;0036;
+2466;2466;2466;0037;0037;
+2467;2467;2467;0038;0038;
+2468;2468;2468;0039;0039;
+2469;2469;2469;0031 0030;0031 0030;
+246A;246A;246A;0031 0031;0031 0031;
+246B;246B;246B;0031 0032;0031 0032;
+246C;246C;246C;0031 0033;0031 0033;
+246D;246D;246D;0031 0034;0031 0034;
+246E;246E;246E;0031 0035;0031 0035;
+246F;246F;246F;0031 0036;0031 0036;
+2470;2470;2470;0031 0037;0031 0037;
+2471;2471;2471;0031 0038;0031 0038;
+2472;2472;2472;0031 0039;0031 0039;
+2473;2473;2473;0032 0030;0032 0030;
+2474;2474;2474;0028 0031 0029;0028 0031 0029;
+2475;2475;2475;0028 0032 0029;0028 0032 0029;
+2476;2476;2476;0028 0033 0029;0028 0033 0029;
+2477;2477;2477;0028 0034 0029;0028 0034 0029;
+2478;2478;2478;0028 0035 0029;0028 0035 0029;
+2479;2479;2479;0028 0036 0029;0028 0036 0029;
+247A;247A;247A;0028 0037 0029;0028 0037 0029;
+247B;247B;247B;0028 0038 0029;0028 0038 0029;
+247C;247C;247C;0028 0039 0029;0028 0039 0029;
+247D;247D;247D;0028 0031 0030 0029;0028 0031 0030 0029;
+247E;247E;247E;0028 0031 0031 0029;0028 0031 0031 0029;
+247F;247F;247F;0028 0031 0032 0029;0028 0031 0032 0029;
+2480;2480;2480;0028 0031 0033 0029;0028 0031 0033 0029;
+2481;2481;2481;0028 0031 0034 0029;0028 0031 0034 0029;
+2482;2482;2482;0028 0031 0035 0029;0028 0031 0035 0029;
+2483;2483;2483;0028 0031 0036 0029;0028 0031 0036 0029;
+2484;2484;2484;0028 0031 0037 0029;0028 0031 0037 0029;
+2485;2485;2485;0028 0031 0038 0029;0028 0031 0038 0029;
+2486;2486;2486;0028 0031 0039 0029;0028 0031 0039 0029;
+2487;2487;2487;0028 0032 0030 0029;0028 0032 0030 0029;
+2488;2488;2488;0031 002E;0031 002E;
+2489;2489;2489;0032 002E;0032 002E;
+248A;248A;248A;0033 002E;0033 002E;
+248B;248B;248B;0034 002E;0034 002E;
+248C;248C;248C;0035 002E;0035 002E;
+248D;248D;248D;0036 002E;0036 002E;
+248E;248E;248E;0037 002E;0037 002E;
+248F;248F;248F;0038 002E;0038 002E;
+2490;2490;2490;0039 002E;0039 002E;
+2491;2491;2491;0031 0030 002E;0031 0030 002E;
+2492;2492;2492;0031 0031 002E;0031 0031 002E;
+2493;2493;2493;0031 0032 002E;0031 0032 002E;
+2494;2494;2494;0031 0033 002E;0031 0033 002E;
+2495;2495;2495;0031 0034 002E;0031 0034 002E;
+2496;2496;2496;0031 0035 002E;0031 0035 002E;
+2497;2497;2497;0031 0036 002E;0031 0036 002E;
+2498;2498;2498;0031 0037 002E;0031 0037 002E;
+2499;2499;2499;0031 0038 002E;0031 0038 002E;
+249A;249A;249A;0031 0039 002E;0031 0039 002E;
+249B;249B;249B;0032 0030 002E;0032 0030 002E;
+249C;249C;249C;0028 0061 0029;0028 0061 0029;
+249D;249D;249D;0028 0062 0029;0028 0062 0029;
+249E;249E;249E;0028 0063 0029;0028 0063 0029;
+249F;249F;249F;0028 0064 0029;0028 0064 0029;
+24A0;24A0;24A0;0028 0065 0029;0028 0065 0029;
+24A1;24A1;24A1;0028 0066 0029;0028 0066 0029;
+24A2;24A2;24A2;0028 0067 0029;0028 0067 0029;
+24A3;24A3;24A3;0028 0068 0029;0028 0068 0029;
+24A4;24A4;24A4;0028 0069 0029;0028 0069 0029;
+24A5;24A5;24A5;0028 006A 0029;0028 006A 0029;
+24A6;24A6;24A6;0028 006B 0029;0028 006B 0029;
+24A7;24A7;24A7;0028 006C 0029;0028 006C 0029;
+24A8;24A8;24A8;0028 006D 0029;0028 006D 0029;
+24A9;24A9;24A9;0028 006E 0029;0028 006E 0029;
+24AA;24AA;24AA;0028 006F 0029;0028 006F 0029;
+24AB;24AB;24AB;0028 0070 0029;0028 0070 0029;
+24AC;24AC;24AC;0028 0071 0029;0028 0071 0029;
+24AD;24AD;24AD;0028 0072 0029;0028 0072 0029;
+24AE;24AE;24AE;0028 0073 0029;0028 0073 0029;
+24AF;24AF;24AF;0028 0074 0029;0028 0074 0029;
+24B0;24B0;24B0;0028 0075 0029;0028 0075 0029;
+24B1;24B1;24B1;0028 0076 0029;0028 0076 0029;
+24B2;24B2;24B2;0028 0077 0029;0028 0077 0029;
+24B3;24B3;24B3;0028 0078 0029;0028 0078 0029;
+24B4;24B4;24B4;0028 0079 0029;0028 0079 0029;
+24B5;24B5;24B5;0028 007A 0029;0028 007A 0029;
+24B6;24B6;24B6;0041;0041;
+24B7;24B7;24B7;0042;0042;
+24B8;24B8;24B8;0043;0043;
+24B9;24B9;24B9;0044;0044;
+24BA;24BA;24BA;0045;0045;
+24BB;24BB;24BB;0046;0046;
+24BC;24BC;24BC;0047;0047;
+24BD;24BD;24BD;0048;0048;
+24BE;24BE;24BE;0049;0049;
+24BF;24BF;24BF;004A;004A;
+24C0;24C0;24C0;004B;004B;
+24C1;24C1;24C1;004C;004C;
+24C2;24C2;24C2;004D;004D;
+24C3;24C3;24C3;004E;004E;
+24C4;24C4;24C4;004F;004F;
+24C5;24C5;24C5;0050;0050;
+24C6;24C6;24C6;0051;0051;
+24C7;24C7;24C7;0052;0052;
+24C8;24C8;24C8;0053;0053;
+24C9;24C9;24C9;0054;0054;
+24CA;24CA;24CA;0055;0055;
+24CB;24CB;24CB;0056;0056;
+24CC;24CC;24CC;0057;0057;
+24CD;24CD;24CD;0058;0058;
+24CE;24CE;24CE;0059;0059;
+24CF;24CF;24CF;005A;005A;
+24D0;24D0;24D0;0061;0061;
+24D1;24D1;24D1;0062;0062;
+24D2;24D2;24D2;0063;0063;
+24D3;24D3;24D3;0064;0064;
+24D4;24D4;24D4;0065;0065;
+24D5;24D5;24D5;0066;0066;
+24D6;24D6;24D6;0067;0067;
+24D7;24D7;24D7;0068;0068;
+24D8;24D8;24D8;0069;0069;
+24D9;24D9;24D9;006A;006A;
+24DA;24DA;24DA;006B;006B;
+24DB;24DB;24DB;006C;006C;
+24DC;24DC;24DC;006D;006D;
+24DD;24DD;24DD;006E;006E;
+24DE;24DE;24DE;006F;006F;
+24DF;24DF;24DF;0070;0070;
+24E0;24E0;24E0;0071;0071;
+24E1;24E1;24E1;0072;0072;
+24E2;24E2;24E2;0073;0073;
+24E3;24E3;24E3;0074;0074;
+24E4;24E4;24E4;0075;0075;
+24E5;24E5;24E5;0076;0076;
+24E6;24E6;24E6;0077;0077;
+24E7;24E7;24E7;0078;0078;
+24E8;24E8;24E8;0079;0079;
+24E9;24E9;24E9;007A;007A;
+24EA;24EA;24EA;0030;0030;
+2A0C;2A0C;2A0C;222B 222B 222B 222B;222B 222B 222B 222B;
+2A74;2A74;2A74;003A 003A 003D;003A 003A 003D;
+2A75;2A75;2A75;003D 003D;003D 003D;
+2A76;2A76;2A76;003D 003D 003D;003D 003D 003D;
+2ADC;2ADD 0338;2ADD 0338;2ADD 0338;2ADD 0338;
+2C7C;2C7C;2C7C;006A;006A;
+2C7D;2C7D;2C7D;0056;0056;
+2D6F;2D6F;2D6F;2D61;2D61;
+2E9F;2E9F;2E9F;6BCD;6BCD;
+2EF3;2EF3;2EF3;9F9F;9F9F;
+2F00;2F00;2F00;4E00;4E00;
+2F01;2F01;2F01;4E28;4E28;
+2F02;2F02;2F02;4E36;4E36;
+2F03;2F03;2F03;4E3F;4E3F;
+2F04;2F04;2F04;4E59;4E59;
+2F05;2F05;2F05;4E85;4E85;
+2F06;2F06;2F06;4E8C;4E8C;
+2F07;2F07;2F07;4EA0;4EA0;
+2F08;2F08;2F08;4EBA;4EBA;
+2F09;2F09;2F09;513F;513F;
+2F0A;2F0A;2F0A;5165;5165;
+2F0B;2F0B;2F0B;516B;516B;
+2F0C;2F0C;2F0C;5182;5182;
+2F0D;2F0D;2F0D;5196;5196;
+2F0E;2F0E;2F0E;51AB;51AB;
+2F0F;2F0F;2F0F;51E0;51E0;
+2F10;2F10;2F10;51F5;51F5;
+2F11;2F11;2F11;5200;5200;
+2F12;2F12;2F12;529B;529B;
+2F13;2F13;2F13;52F9;52F9;
+2F14;2F14;2F14;5315;5315;
+2F15;2F15;2F15;531A;531A;
+2F16;2F16;2F16;5338;5338;
+2F17;2F17;2F17;5341;5341;
+2F18;2F18;2F18;535C;535C;
+2F19;2F19;2F19;5369;5369;
+2F1A;2F1A;2F1A;5382;5382;
+2F1B;2F1B;2F1B;53B6;53B6;
+2F1C;2F1C;2F1C;53C8;53C8;
+2F1D;2F1D;2F1D;53E3;53E3;
+2F1E;2F1E;2F1E;56D7;56D7;
+2F1F;2F1F;2F1F;571F;571F;
+2F20;2F20;2F20;58EB;58EB;
+2F21;2F21;2F21;5902;5902;
+2F22;2F22;2F22;590A;590A;
+2F23;2F23;2F23;5915;5915;
+2F24;2F24;2F24;5927;5927;
+2F25;2F25;2F25;5973;5973;
+2F26;2F26;2F26;5B50;5B50;
+2F27;2F27;2F27;5B80;5B80;
+2F28;2F28;2F28;5BF8;5BF8;
+2F29;2F29;2F29;5C0F;5C0F;
+2F2A;2F2A;2F2A;5C22;5C22;
+2F2B;2F2B;2F2B;5C38;5C38;
+2F2C;2F2C;2F2C;5C6E;5C6E;
+2F2D;2F2D;2F2D;5C71;5C71;
+2F2E;2F2E;2F2E;5DDB;5DDB;
+2F2F;2F2F;2F2F;5DE5;5DE5;
+2F30;2F30;2F30;5DF1;5DF1;
+2F31;2F31;2F31;5DFE;5DFE;
+2F32;2F32;2F32;5E72;5E72;
+2F33;2F33;2F33;5E7A;5E7A;
+2F34;2F34;2F34;5E7F;5E7F;
+2F35;2F35;2F35;5EF4;5EF4;
+2F36;2F36;2F36;5EFE;5EFE;
+2F37;2F37;2F37;5F0B;5F0B;
+2F38;2F38;2F38;5F13;5F13;
+2F39;2F39;2F39;5F50;5F50;
+2F3A;2F3A;2F3A;5F61;5F61;
+2F3B;2F3B;2F3B;5F73;5F73;
+2F3C;2F3C;2F3C;5FC3;5FC3;
+2F3D;2F3D;2F3D;6208;6208;
+2F3E;2F3E;2F3E;6236;6236;
+2F3F;2F3F;2F3F;624B;624B;
+2F40;2F40;2F40;652F;652F;
+2F41;2F41;2F41;6534;6534;
+2F42;2F42;2F42;6587;6587;
+2F43;2F43;2F43;6597;6597;
+2F44;2F44;2F44;65A4;65A4;
+2F45;2F45;2F45;65B9;65B9;
+2F46;2F46;2F46;65E0;65E0;
+2F47;2F47;2F47;65E5;65E5;
+2F48;2F48;2F48;66F0;66F0;
+2F49;2F49;2F49;6708;6708;
+2F4A;2F4A;2F4A;6728;6728;
+2F4B;2F4B;2F4B;6B20;6B20;
+2F4C;2F4C;2F4C;6B62;6B62;
+2F4D;2F4D;2F4D;6B79;6B79;
+2F4E;2F4E;2F4E;6BB3;6BB3;
+2F4F;2F4F;2F4F;6BCB;6BCB;
+2F50;2F50;2F50;6BD4;6BD4;
+2F51;2F51;2F51;6BDB;6BDB;
+2F52;2F52;2F52;6C0F;6C0F;
+2F53;2F53;2F53;6C14;6C14;
+2F54;2F54;2F54;6C34;6C34;
+2F55;2F55;2F55;706B;706B;
+2F56;2F56;2F56;722A;722A;
+2F57;2F57;2F57;7236;7236;
+2F58;2F58;2F58;723B;723B;
+2F59;2F59;2F59;723F;723F;
+2F5A;2F5A;2F5A;7247;7247;
+2F5B;2F5B;2F5B;7259;7259;
+2F5C;2F5C;2F5C;725B;725B;
+2F5D;2F5D;2F5D;72AC;72AC;
+2F5E;2F5E;2F5E;7384;7384;
+2F5F;2F5F;2F5F;7389;7389;
+2F60;2F60;2F60;74DC;74DC;
+2F61;2F61;2F61;74E6;74E6;
+2F62;2F62;2F62;7518;7518;
+2F63;2F63;2F63;751F;751F;
+2F64;2F64;2F64;7528;7528;
+2F65;2F65;2F65;7530;7530;
+2F66;2F66;2F66;758B;758B;
+2F67;2F67;2F67;7592;7592;
+2F68;2F68;2F68;7676;7676;
+2F69;2F69;2F69;767D;767D;
+2F6A;2F6A;2F6A;76AE;76AE;
+2F6B;2F6B;2F6B;76BF;76BF;
+2F6C;2F6C;2F6C;76EE;76EE;
+2F6D;2F6D;2F6D;77DB;77DB;
+2F6E;2F6E;2F6E;77E2;77E2;
+2F6F;2F6F;2F6F;77F3;77F3;
+2F70;2F70;2F70;793A;793A;
+2F71;2F71;2F71;79B8;79B8;
+2F72;2F72;2F72;79BE;79BE;
+2F73;2F73;2F73;7A74;7A74;
+2F74;2F74;2F74;7ACB;7ACB;
+2F75;2F75;2F75;7AF9;7AF9;
+2F76;2F76;2F76;7C73;7C73;
+2F77;2F77;2F77;7CF8;7CF8;
+2F78;2F78;2F78;7F36;7F36;
+2F79;2F79;2F79;7F51;7F51;
+2F7A;2F7A;2F7A;7F8A;7F8A;
+2F7B;2F7B;2F7B;7FBD;7FBD;
+2F7C;2F7C;2F7C;8001;8001;
+2F7D;2F7D;2F7D;800C;800C;
+2F7E;2F7E;2F7E;8012;8012;
+2F7F;2F7F;2F7F;8033;8033;
+2F80;2F80;2F80;807F;807F;
+2F81;2F81;2F81;8089;8089;
+2F82;2F82;2F82;81E3;81E3;
+2F83;2F83;2F83;81EA;81EA;
+2F84;2F84;2F84;81F3;81F3;
+2F85;2F85;2F85;81FC;81FC;
+2F86;2F86;2F86;820C;820C;
+2F87;2F87;2F87;821B;821B;
+2F88;2F88;2F88;821F;821F;
+2F89;2F89;2F89;826E;826E;
+2F8A;2F8A;2F8A;8272;8272;
+2F8B;2F8B;2F8B;8278;8278;
+2F8C;2F8C;2F8C;864D;864D;
+2F8D;2F8D;2F8D;866B;866B;
+2F8E;2F8E;2F8E;8840;8840;
+2F8F;2F8F;2F8F;884C;884C;
+2F90;2F90;2F90;8863;8863;
+2F91;2F91;2F91;897E;897E;
+2F92;2F92;2F92;898B;898B;
+2F93;2F93;2F93;89D2;89D2;
+2F94;2F94;2F94;8A00;8A00;
+2F95;2F95;2F95;8C37;8C37;
+2F96;2F96;2F96;8C46;8C46;
+2F97;2F97;2F97;8C55;8C55;
+2F98;2F98;2F98;8C78;8C78;
+2F99;2F99;2F99;8C9D;8C9D;
+2F9A;2F9A;2F9A;8D64;8D64;
+2F9B;2F9B;2F9B;8D70;8D70;
+2F9C;2F9C;2F9C;8DB3;8DB3;
+2F9D;2F9D;2F9D;8EAB;8EAB;
+2F9E;2F9E;2F9E;8ECA;8ECA;
+2F9F;2F9F;2F9F;8F9B;8F9B;
+2FA0;2FA0;2FA0;8FB0;8FB0;
+2FA1;2FA1;2FA1;8FB5;8FB5;
+2FA2;2FA2;2FA2;9091;9091;
+2FA3;2FA3;2FA3;9149;9149;
+2FA4;2FA4;2FA4;91C6;91C6;
+2FA5;2FA5;2FA5;91CC;91CC;
+2FA6;2FA6;2FA6;91D1;91D1;
+2FA7;2FA7;2FA7;9577;9577;
+2FA8;2FA8;2FA8;9580;9580;
+2FA9;2FA9;2FA9;961C;961C;
+2FAA;2FAA;2FAA;96B6;96B6;
+2FAB;2FAB;2FAB;96B9;96B9;
+2FAC;2FAC;2FAC;96E8;96E8;
+2FAD;2FAD;2FAD;9751;9751;
+2FAE;2FAE;2FAE;975E;975E;
+2FAF;2FAF;2FAF;9762;9762;
+2FB0;2FB0;2FB0;9769;9769;
+2FB1;2FB1;2FB1;97CB;97CB;
+2FB2;2FB2;2FB2;97ED;97ED;
+2FB3;2FB3;2FB3;97F3;97F3;
+2FB4;2FB4;2FB4;9801;9801;
+2FB5;2FB5;2FB5;98A8;98A8;
+2FB6;2FB6;2FB6;98DB;98DB;
+2FB7;2FB7;2FB7;98DF;98DF;
+2FB8;2FB8;2FB8;9996;9996;
+2FB9;2FB9;2FB9;9999;9999;
+2FBA;2FBA;2FBA;99AC;99AC;
+2FBB;2FBB;2FBB;9AA8;9AA8;
+2FBC;2FBC;2FBC;9AD8;9AD8;
+2FBD;2FBD;2FBD;9ADF;9ADF;
+2FBE;2FBE;2FBE;9B25;9B25;
+2FBF;2FBF;2FBF;9B2F;9B2F;
+2FC0;2FC0;2FC0;9B32;9B32;
+2FC1;2FC1;2FC1;9B3C;9B3C;
+2FC2;2FC2;2FC2;9B5A;9B5A;
+2FC3;2FC3;2FC3;9CE5;9CE5;
+2FC4;2FC4;2FC4;9E75;9E75;
+2FC5;2FC5;2FC5;9E7F;9E7F;
+2FC6;2FC6;2FC6;9EA5;9EA5;
+2FC7;2FC7;2FC7;9EBB;9EBB;
+2FC8;2FC8;2FC8;9EC3;9EC3;
+2FC9;2FC9;2FC9;9ECD;9ECD;
+2FCA;2FCA;2FCA;9ED1;9ED1;
+2FCB;2FCB;2FCB;9EF9;9EF9;
+2FCC;2FCC;2FCC;9EFD;9EFD;
+2FCD;2FCD;2FCD;9F0E;9F0E;
+2FCE;2FCE;2FCE;9F13;9F13;
+2FCF;2FCF;2FCF;9F20;9F20;
+2FD0;2FD0;2FD0;9F3B;9F3B;
+2FD1;2FD1;2FD1;9F4A;9F4A;
+2FD2;2FD2;2FD2;9F52;9F52;
+2FD3;2FD3;2FD3;9F8D;9F8D;
+2FD4;2FD4;2FD4;9F9C;9F9C;
+2FD5;2FD5;2FD5;9FA0;9FA0;
+3000;3000;3000;0020;0020;
+3036;3036;3036;3012;3012;
+3038;3038;3038;5341;5341;
+3039;3039;3039;5344;5344;
+303A;303A;303A;5345;5345;
+304C;304C;304B 3099;304C;304B 3099;
+304E;304E;304D 3099;304E;304D 3099;
+3050;3050;304F 3099;3050;304F 3099;
+3052;3052;3051 3099;3052;3051 3099;
+3054;3054;3053 3099;3054;3053 3099;
+3056;3056;3055 3099;3056;3055 3099;
+3058;3058;3057 3099;3058;3057 3099;
+305A;305A;3059 3099;305A;3059 3099;
+305C;305C;305B 3099;305C;305B 3099;
+305E;305E;305D 3099;305E;305D 3099;
+3060;3060;305F 3099;3060;305F 3099;
+3062;3062;3061 3099;3062;3061 3099;
+3065;3065;3064 3099;3065;3064 3099;
+3067;3067;3066 3099;3067;3066 3099;
+3069;3069;3068 3099;3069;3068 3099;
+3070;3070;306F 3099;3070;306F 3099;
+3071;3071;306F 309A;3071;306F 309A;
+3073;3073;3072 3099;3073;3072 3099;
+3074;3074;3072 309A;3074;3072 309A;
+3076;3076;3075 3099;3076;3075 3099;
+3077;3077;3075 309A;3077;3075 309A;
+3079;3079;3078 3099;3079;3078 3099;
+307A;307A;3078 309A;307A;3078 309A;
+307C;307C;307B 3099;307C;307B 3099;
+307D;307D;307B 309A;307D;307B 309A;
+3094;3094;3046 3099;3094;3046 3099;
+309B;309B;309B;0020 3099;0020 3099;
+309C;309C;309C;0020 309A;0020 309A;
+309E;309E;309D 3099;309E;309D 3099;
+309F;309F;309F;3088 308A;3088 308A;
+30AC;30AC;30AB 3099;30AC;30AB 3099;
+30AE;30AE;30AD 3099;30AE;30AD 3099;
+30B0;30B0;30AF 3099;30B0;30AF 3099;
+30B2;30B2;30B1 3099;30B2;30B1 3099;
+30B4;30B4;30B3 3099;30B4;30B3 3099;
+30B6;30B6;30B5 3099;30B6;30B5 3099;
+30B8;30B8;30B7 3099;30B8;30B7 3099;
+30BA;30BA;30B9 3099;30BA;30B9 3099;
+30BC;30BC;30BB 3099;30BC;30BB 3099;
+30BE;30BE;30BD 3099;30BE;30BD 3099;
+30C0;30C0;30BF 3099;30C0;30BF 3099;
+30C2;30C2;30C1 3099;30C2;30C1 3099;
+30C5;30C5;30C4 3099;30C5;30C4 3099;
+30C7;30C7;30C6 3099;30C7;30C6 3099;
+30C9;30C9;30C8 3099;30C9;30C8 3099;
+30D0;30D0;30CF 3099;30D0;30CF 3099;
+30D1;30D1;30CF 309A;30D1;30CF 309A;
+30D3;30D3;30D2 3099;30D3;30D2 3099;
+30D4;30D4;30D2 309A;30D4;30D2 309A;
+30D6;30D6;30D5 3099;30D6;30D5 3099;
+30D7;30D7;30D5 309A;30D7;30D5 309A;
+30D9;30D9;30D8 3099;30D9;30D8 3099;
+30DA;30DA;30D8 309A;30DA;30D8 309A;
+30DC;30DC;30DB 3099;30DC;30DB 3099;
+30DD;30DD;30DB 309A;30DD;30DB 309A;
+30F4;30F4;30A6 3099;30F4;30A6 3099;
+30F7;30F7;30EF 3099;30F7;30EF 3099;
+30F8;30F8;30F0 3099;30F8;30F0 3099;
+30F9;30F9;30F1 3099;30F9;30F1 3099;
+30FA;30FA;30F2 3099;30FA;30F2 3099;
+30FE;30FE;30FD 3099;30FE;30FD 3099;
+30FF;30FF;30FF;30B3 30C8;30B3 30C8;
+3131;3131;3131;1100;1100;
+3132;3132;3132;1101;1101;
+3133;3133;3133;11AA;11AA;
+3134;3134;3134;1102;1102;
+3135;3135;3135;11AC;11AC;
+3136;3136;3136;11AD;11AD;
+3137;3137;3137;1103;1103;
+3138;3138;3138;1104;1104;
+3139;3139;3139;1105;1105;
+313A;313A;313A;11B0;11B0;
+313B;313B;313B;11B1;11B1;
+313C;313C;313C;11B2;11B2;
+313D;313D;313D;11B3;11B3;
+313E;313E;313E;11B4;11B4;
+313F;313F;313F;11B5;11B5;
+3140;3140;3140;111A;111A;
+3141;3141;3141;1106;1106;
+3142;3142;3142;1107;1107;
+3143;3143;3143;1108;1108;
+3144;3144;3144;1121;1121;
+3145;3145;3145;1109;1109;
+3146;3146;3146;110A;110A;
+3147;3147;3147;110B;110B;
+3148;3148;3148;110C;110C;
+3149;3149;3149;110D;110D;
+314A;314A;314A;110E;110E;
+314B;314B;314B;110F;110F;
+314C;314C;314C;1110;1110;
+314D;314D;314D;1111;1111;
+314E;314E;314E;1112;1112;
+314F;314F;314F;1161;1161;
+3150;3150;3150;1162;1162;
+3151;3151;3151;1163;1163;
+3152;3152;3152;1164;1164;
+3153;3153;3153;1165;1165;
+3154;3154;3154;1166;1166;
+3155;3155;3155;1167;1167;
+3156;3156;3156;1168;1168;
+3157;3157;3157;1169;1169;
+3158;3158;3158;116A;116A;
+3159;3159;3159;116B;116B;
+315A;315A;315A;116C;116C;
+315B;315B;315B;116D;116D;
+315C;315C;315C;116E;116E;
+315D;315D;315D;116F;116F;
+315E;315E;315E;1170;1170;
+315F;315F;315F;1171;1171;
+3160;3160;3160;1172;1172;
+3161;3161;3161;1173;1173;
+3162;3162;3162;1174;1174;
+3163;3163;3163;1175;1175;
+3164;3164;3164;1160;1160;
+3165;3165;3165;1114;1114;
+3166;3166;3166;1115;1115;
+3167;3167;3167;11C7;11C7;
+3168;3168;3168;11C8;11C8;
+3169;3169;3169;11CC;11CC;
+316A;316A;316A;11CE;11CE;
+316B;316B;316B;11D3;11D3;
+316C;316C;316C;11D7;11D7;
+316D;316D;316D;11D9;11D9;
+316E;316E;316E;111C;111C;
+316F;316F;316F;11DD;11DD;
+3170;3170;3170;11DF;11DF;
+3171;3171;3171;111D;111D;
+3172;3172;3172;111E;111E;
+3173;3173;3173;1120;1120;
+3174;3174;3174;1122;1122;
+3175;3175;3175;1123;1123;
+3176;3176;3176;1127;1127;
+3177;3177;3177;1129;1129;
+3178;3178;3178;112B;112B;
+3179;3179;3179;112C;112C;
+317A;317A;317A;112D;112D;
+317B;317B;317B;112E;112E;
+317C;317C;317C;112F;112F;
+317D;317D;317D;1132;1132;
+317E;317E;317E;1136;1136;
+317F;317F;317F;1140;1140;
+3180;3180;3180;1147;1147;
+3181;3181;3181;114C;114C;
+3182;3182;3182;11F1;11F1;
+3183;3183;3183;11F2;11F2;
+3184;3184;3184;1157;1157;
+3185;3185;3185;1158;1158;
+3186;3186;3186;1159;1159;
+3187;3187;3187;1184;1184;
+3188;3188;3188;1185;1185;
+3189;3189;3189;1188;1188;
+318A;318A;318A;1191;1191;
+318B;318B;318B;1192;1192;
+318C;318C;318C;1194;1194;
+318D;318D;318D;119E;119E;
+318E;318E;318E;11A1;11A1;
+3192;3192;3192;4E00;4E00;
+3193;3193;3193;4E8C;4E8C;
+3194;3194;3194;4E09;4E09;
+3195;3195;3195;56DB;56DB;
+3196;3196;3196;4E0A;4E0A;
+3197;3197;3197;4E2D;4E2D;
+3198;3198;3198;4E0B;4E0B;
+3199;3199;3199;7532;7532;
+319A;319A;319A;4E59;4E59;
+319B;319B;319B;4E19;4E19;
+319C;319C;319C;4E01;4E01;
+319D;319D;319D;5929;5929;
+319E;319E;319E;5730;5730;
+319F;319F;319F;4EBA;4EBA;
+3200;3200;3200;0028 1100 0029;0028 1100 0029;
+3201;3201;3201;0028 1102 0029;0028 1102 0029;
+3202;3202;3202;0028 1103 0029;0028 1103 0029;
+3203;3203;3203;0028 1105 0029;0028 1105 0029;
+3204;3204;3204;0028 1106 0029;0028 1106 0029;
+3205;3205;3205;0028 1107 0029;0028 1107 0029;
+3206;3206;3206;0028 1109 0029;0028 1109 0029;
+3207;3207;3207;0028 110B 0029;0028 110B 0029;
+3208;3208;3208;0028 110C 0029;0028 110C 0029;
+3209;3209;3209;0028 110E 0029;0028 110E 0029;
+320A;320A;320A;0028 110F 0029;0028 110F 0029;
+320B;320B;320B;0028 1110 0029;0028 1110 0029;
+320C;320C;320C;0028 1111 0029;0028 1111 0029;
+320D;320D;320D;0028 1112 0029;0028 1112 0029;
+320E;320E;320E;0028 AC00 0029;0028 1100 1161 0029;
+320F;320F;320F;0028 B098 0029;0028 1102 1161 0029;
+3210;3210;3210;0028 B2E4 0029;0028 1103 1161 0029;
+3211;3211;3211;0028 B77C 0029;0028 1105 1161 0029;
+3212;3212;3212;0028 B9C8 0029;0028 1106 1161 0029;
+3213;3213;3213;0028 BC14 0029;0028 1107 1161 0029;
+3214;3214;3214;0028 C0AC 0029;0028 1109 1161 0029;
+3215;3215;3215;0028 C544 0029;0028 110B 1161 0029;
+3216;3216;3216;0028 C790 0029;0028 110C 1161 0029;
+3217;3217;3217;0028 CC28 0029;0028 110E 1161 0029;
+3218;3218;3218;0028 CE74 0029;0028 110F 1161 0029;
+3219;3219;3219;0028 D0C0 0029;0028 1110 1161 0029;
+321A;321A;321A;0028 D30C 0029;0028 1111 1161 0029;
+321B;321B;321B;0028 D558 0029;0028 1112 1161 0029;
+321C;321C;321C;0028 C8FC 0029;0028 110C 116E 0029;
+321D;321D;321D;0028 C624 C804 0029;0028 110B 1169 110C 1165 11AB 0029;
+321E;321E;321E;0028 C624 D6C4 0029;0028 110B 1169 1112 116E 0029;
+3220;3220;3220;0028 4E00 0029;0028 4E00 0029;
+3221;3221;3221;0028 4E8C 0029;0028 4E8C 0029;
+3222;3222;3222;0028 4E09 0029;0028 4E09 0029;
+3223;3223;3223;0028 56DB 0029;0028 56DB 0029;
+3224;3224;3224;0028 4E94 0029;0028 4E94 0029;
+3225;3225;3225;0028 516D 0029;0028 516D 0029;
+3226;3226;3226;0028 4E03 0029;0028 4E03 0029;
+3227;3227;3227;0028 516B 0029;0028 516B 0029;
+3228;3228;3228;0028 4E5D 0029;0028 4E5D 0029;
+3229;3229;3229;0028 5341 0029;0028 5341 0029;
+322A;322A;322A;0028 6708 0029;0028 6708 0029;
+322B;322B;322B;0028 706B 0029;0028 706B 0029;
+322C;322C;322C;0028 6C34 0029;0028 6C34 0029;
+322D;322D;322D;0028 6728 0029;0028 6728 0029;
+322E;322E;322E;0028 91D1 0029;0028 91D1 0029;
+322F;322F;322F;0028 571F 0029;0028 571F 0029;
+3230;3230;3230;0028 65E5 0029;0028 65E5 0029;
+3231;3231;3231;0028 682A 0029;0028 682A 0029;
+3232;3232;3232;0028 6709 0029;0028 6709 0029;
+3233;3233;3233;0028 793E 0029;0028 793E 0029;
+3234;3234;3234;0028 540D 0029;0028 540D 0029;
+3235;3235;3235;0028 7279 0029;0028 7279 0029;
+3236;3236;3236;0028 8CA1 0029;0028 8CA1 0029;
+3237;3237;3237;0028 795D 0029;0028 795D 0029;
+3238;3238;3238;0028 52B4 0029;0028 52B4 0029;
+3239;3239;3239;0028 4EE3 0029;0028 4EE3 0029;
+323A;323A;323A;0028 547C 0029;0028 547C 0029;
+323B;323B;323B;0028 5B66 0029;0028 5B66 0029;
+323C;323C;323C;0028 76E3 0029;0028 76E3 0029;
+323D;323D;323D;0028 4F01 0029;0028 4F01 0029;
+323E;323E;323E;0028 8CC7 0029;0028 8CC7 0029;
+323F;323F;323F;0028 5354 0029;0028 5354 0029;
+3240;3240;3240;0028 796D 0029;0028 796D 0029;
+3241;3241;3241;0028 4F11 0029;0028 4F11 0029;
+3242;3242;3242;0028 81EA 0029;0028 81EA 0029;
+3243;3243;3243;0028 81F3 0029;0028 81F3 0029;
+3250;3250;3250;0050 0054 0045;0050 0054 0045;
+3251;3251;3251;0032 0031;0032 0031;
+3252;3252;3252;0032 0032;0032 0032;
+3253;3253;3253;0032 0033;0032 0033;
+3254;3254;3254;0032 0034;0032 0034;
+3255;3255;3255;0032 0035;0032 0035;
+3256;3256;3256;0032 0036;0032 0036;
+3257;3257;3257;0032 0037;0032 0037;
+3258;3258;3258;0032 0038;0032 0038;
+3259;3259;3259;0032 0039;0032 0039;
+325A;325A;325A;0033 0030;0033 0030;
+325B;325B;325B;0033 0031;0033 0031;
+325C;325C;325C;0033 0032;0033 0032;
+325D;325D;325D;0033 0033;0033 0033;
+325E;325E;325E;0033 0034;0033 0034;
+325F;325F;325F;0033 0035;0033 0035;
+3260;3260;3260;1100;1100;
+3261;3261;3261;1102;1102;
+3262;3262;3262;1103;1103;
+3263;3263;3263;1105;1105;
+3264;3264;3264;1106;1106;
+3265;3265;3265;1107;1107;
+3266;3266;3266;1109;1109;
+3267;3267;3267;110B;110B;
+3268;3268;3268;110C;110C;
+3269;3269;3269;110E;110E;
+326A;326A;326A;110F;110F;
+326B;326B;326B;1110;1110;
+326C;326C;326C;1111;1111;
+326D;326D;326D;1112;1112;
+326E;326E;326E;AC00;1100 1161;
+326F;326F;326F;B098;1102 1161;
+3270;3270;3270;B2E4;1103 1161;
+3271;3271;3271;B77C;1105 1161;
+3272;3272;3272;B9C8;1106 1161;
+3273;3273;3273;BC14;1107 1161;
+3274;3274;3274;C0AC;1109 1161;
+3275;3275;3275;C544;110B 1161;
+3276;3276;3276;C790;110C 1161;
+3277;3277;3277;CC28;110E 1161;
+3278;3278;3278;CE74;110F 1161;
+3279;3279;3279;D0C0;1110 1161;
+327A;327A;327A;D30C;1111 1161;
+327B;327B;327B;D558;1112 1161;
+327C;327C;327C;CC38 ACE0;110E 1161 11B7 1100 1169;
+327D;327D;327D;C8FC C758;110C 116E 110B 1174;
+327E;327E;327E;C6B0;110B 116E;
+3280;3280;3280;4E00;4E00;
+3281;3281;3281;4E8C;4E8C;
+3282;3282;3282;4E09;4E09;
+3283;3283;3283;56DB;56DB;
+3284;3284;3284;4E94;4E94;
+3285;3285;3285;516D;516D;
+3286;3286;3286;4E03;4E03;
+3287;3287;3287;516B;516B;
+3288;3288;3288;4E5D;4E5D;
+3289;3289;3289;5341;5341;
+328A;328A;328A;6708;6708;
+328B;328B;328B;706B;706B;
+328C;328C;328C;6C34;6C34;
+328D;328D;328D;6728;6728;
+328E;328E;328E;91D1;91D1;
+328F;328F;328F;571F;571F;
+3290;3290;3290;65E5;65E5;
+3291;3291;3291;682A;682A;
+3292;3292;3292;6709;6709;
+3293;3293;3293;793E;793E;
+3294;3294;3294;540D;540D;
+3295;3295;3295;7279;7279;
+3296;3296;3296;8CA1;8CA1;
+3297;3297;3297;795D;795D;
+3298;3298;3298;52B4;52B4;
+3299;3299;3299;79D8;79D8;
+329A;329A;329A;7537;7537;
+329B;329B;329B;5973;5973;
+329C;329C;329C;9069;9069;
+329D;329D;329D;512A;512A;
+329E;329E;329E;5370;5370;
+329F;329F;329F;6CE8;6CE8;
+32A0;32A0;32A0;9805;9805;
+32A1;32A1;32A1;4F11;4F11;
+32A2;32A2;32A2;5199;5199;
+32A3;32A3;32A3;6B63;6B63;
+32A4;32A4;32A4;4E0A;4E0A;
+32A5;32A5;32A5;4E2D;4E2D;
+32A6;32A6;32A6;4E0B;4E0B;
+32A7;32A7;32A7;5DE6;5DE6;
+32A8;32A8;32A8;53F3;53F3;
+32A9;32A9;32A9;533B;533B;
+32AA;32AA;32AA;5B97;5B97;
+32AB;32AB;32AB;5B66;5B66;
+32AC;32AC;32AC;76E3;76E3;
+32AD;32AD;32AD;4F01;4F01;
+32AE;32AE;32AE;8CC7;8CC7;
+32AF;32AF;32AF;5354;5354;
+32B0;32B0;32B0;591C;591C;
+32B1;32B1;32B1;0033 0036;0033 0036;
+32B2;32B2;32B2;0033 0037;0033 0037;
+32B3;32B3;32B3;0033 0038;0033 0038;
+32B4;32B4;32B4;0033 0039;0033 0039;
+32B5;32B5;32B5;0034 0030;0034 0030;
+32B6;32B6;32B6;0034 0031;0034 0031;
+32B7;32B7;32B7;0034 0032;0034 0032;
+32B8;32B8;32B8;0034 0033;0034 0033;
+32B9;32B9;32B9;0034 0034;0034 0034;
+32BA;32BA;32BA;0034 0035;0034 0035;
+32BB;32BB;32BB;0034 0036;0034 0036;
+32BC;32BC;32BC;0034 0037;0034 0037;
+32BD;32BD;32BD;0034 0038;0034 0038;
+32BE;32BE;32BE;0034 0039;0034 0039;
+32BF;32BF;32BF;0035 0030;0035 0030;
+32C0;32C0;32C0;0031 6708;0031 6708;
+32C1;32C1;32C1;0032 6708;0032 6708;
+32C2;32C2;32C2;0033 6708;0033 6708;
+32C3;32C3;32C3;0034 6708;0034 6708;
+32C4;32C4;32C4;0035 6708;0035 6708;
+32C5;32C5;32C5;0036 6708;0036 6708;
+32C6;32C6;32C6;0037 6708;0037 6708;
+32C7;32C7;32C7;0038 6708;0038 6708;
+32C8;32C8;32C8;0039 6708;0039 6708;
+32C9;32C9;32C9;0031 0030 6708;0031 0030 6708;
+32CA;32CA;32CA;0031 0031 6708;0031 0031 6708;
+32CB;32CB;32CB;0031 0032 6708;0031 0032 6708;
+32CC;32CC;32CC;0048 0067;0048 0067;
+32CD;32CD;32CD;0065 0072 0067;0065 0072 0067;
+32CE;32CE;32CE;0065 0056;0065 0056;
+32CF;32CF;32CF;004C 0054 0044;004C 0054 0044;
+32D0;32D0;32D0;30A2;30A2;
+32D1;32D1;32D1;30A4;30A4;
+32D2;32D2;32D2;30A6;30A6;
+32D3;32D3;32D3;30A8;30A8;
+32D4;32D4;32D4;30AA;30AA;
+32D5;32D5;32D5;30AB;30AB;
+32D6;32D6;32D6;30AD;30AD;
+32D7;32D7;32D7;30AF;30AF;
+32D8;32D8;32D8;30B1;30B1;
+32D9;32D9;32D9;30B3;30B3;
+32DA;32DA;32DA;30B5;30B5;
+32DB;32DB;32DB;30B7;30B7;
+32DC;32DC;32DC;30B9;30B9;
+32DD;32DD;32DD;30BB;30BB;
+32DE;32DE;32DE;30BD;30BD;
+32DF;32DF;32DF;30BF;30BF;
+32E0;32E0;32E0;30C1;30C1;
+32E1;32E1;32E1;30C4;30C4;
+32E2;32E2;32E2;30C6;30C6;
+32E3;32E3;32E3;30C8;30C8;
+32E4;32E4;32E4;30CA;30CA;
+32E5;32E5;32E5;30CB;30CB;
+32E6;32E6;32E6;30CC;30CC;
+32E7;32E7;32E7;30CD;30CD;
+32E8;32E8;32E8;30CE;30CE;
+32E9;32E9;32E9;30CF;30CF;
+32EA;32EA;32EA;30D2;30D2;
+32EB;32EB;32EB;30D5;30D5;
+32EC;32EC;32EC;30D8;30D8;
+32ED;32ED;32ED;30DB;30DB;
+32EE;32EE;32EE;30DE;30DE;
+32EF;32EF;32EF;30DF;30DF;
+32F0;32F0;32F0;30E0;30E0;
+32F1;32F1;32F1;30E1;30E1;
+32F2;32F2;32F2;30E2;30E2;
+32F3;32F3;32F3;30E4;30E4;
+32F4;32F4;32F4;30E6;30E6;
+32F5;32F5;32F5;30E8;30E8;
+32F6;32F6;32F6;30E9;30E9;
+32F7;32F7;32F7;30EA;30EA;
+32F8;32F8;32F8;30EB;30EB;
+32F9;32F9;32F9;30EC;30EC;
+32FA;32FA;32FA;30ED;30ED;
+32FB;32FB;32FB;30EF;30EF;
+32FC;32FC;32FC;30F0;30F0;
+32FD;32FD;32FD;30F1;30F1;
+32FE;32FE;32FE;30F2;30F2;
+3300;3300;3300;30A2 30D1 30FC 30C8;30A2 30CF 309A 30FC 30C8;
+3301;3301;3301;30A2 30EB 30D5 30A1;30A2 30EB 30D5 30A1;
+3302;3302;3302;30A2 30F3 30DA 30A2;30A2 30F3 30D8 309A 30A2;
+3303;3303;3303;30A2 30FC 30EB;30A2 30FC 30EB;
+3304;3304;3304;30A4 30CB 30F3 30B0;30A4 30CB 30F3 30AF 3099;
+3305;3305;3305;30A4 30F3 30C1;30A4 30F3 30C1;
+3306;3306;3306;30A6 30A9 30F3;30A6 30A9 30F3;
+3307;3307;3307;30A8 30B9 30AF 30FC 30C9;30A8 30B9 30AF 30FC 30C8 3099;
+3308;3308;3308;30A8 30FC 30AB 30FC;30A8 30FC 30AB 30FC;
+3309;3309;3309;30AA 30F3 30B9;30AA 30F3 30B9;
+330A;330A;330A;30AA 30FC 30E0;30AA 30FC 30E0;
+330B;330B;330B;30AB 30A4 30EA;30AB 30A4 30EA;
+330C;330C;330C;30AB 30E9 30C3 30C8;30AB 30E9 30C3 30C8;
+330D;330D;330D;30AB 30ED 30EA 30FC;30AB 30ED 30EA 30FC;
+330E;330E;330E;30AC 30ED 30F3;30AB 3099 30ED 30F3;
+330F;330F;330F;30AC 30F3 30DE;30AB 3099 30F3 30DE;
+3310;3310;3310;30AE 30AC;30AD 3099 30AB 3099;
+3311;3311;3311;30AE 30CB 30FC;30AD 3099 30CB 30FC;
+3312;3312;3312;30AD 30E5 30EA 30FC;30AD 30E5 30EA 30FC;
+3313;3313;3313;30AE 30EB 30C0 30FC;30AD 3099 30EB 30BF 3099 30FC;
+3314;3314;3314;30AD 30ED;30AD 30ED;
+3315;3315;3315;30AD 30ED 30B0 30E9 30E0;30AD 30ED 30AF 3099 30E9 30E0;
+3316;3316;3316;30AD 30ED 30E1 30FC 30C8 30EB;30AD 30ED 30E1 30FC 30C8 30EB;
+3317;3317;3317;30AD 30ED 30EF 30C3 30C8;30AD 30ED 30EF 30C3 30C8;
+3318;3318;3318;30B0 30E9 30E0;30AF 3099 30E9 30E0;
+3319;3319;3319;30B0 30E9 30E0 30C8 30F3;30AF 3099 30E9 30E0 30C8 30F3;
+331A;331A;331A;30AF 30EB 30BC 30A4 30ED;30AF 30EB 30BB 3099 30A4 30ED;
+331B;331B;331B;30AF 30ED 30FC 30CD;30AF 30ED 30FC 30CD;
+331C;331C;331C;30B1 30FC 30B9;30B1 30FC 30B9;
+331D;331D;331D;30B3 30EB 30CA;30B3 30EB 30CA;
+331E;331E;331E;30B3 30FC 30DD;30B3 30FC 30DB 309A;
+331F;331F;331F;30B5 30A4 30AF 30EB;30B5 30A4 30AF 30EB;
+3320;3320;3320;30B5 30F3 30C1 30FC 30E0;30B5 30F3 30C1 30FC 30E0;
+3321;3321;3321;30B7 30EA 30F3 30B0;30B7 30EA 30F3 30AF 3099;
+3322;3322;3322;30BB 30F3 30C1;30BB 30F3 30C1;
+3323;3323;3323;30BB 30F3 30C8;30BB 30F3 30C8;
+3324;3324;3324;30C0 30FC 30B9;30BF 3099 30FC 30B9;
+3325;3325;3325;30C7 30B7;30C6 3099 30B7;
+3326;3326;3326;30C9 30EB;30C8 3099 30EB;
+3327;3327;3327;30C8 30F3;30C8 30F3;
+3328;3328;3328;30CA 30CE;30CA 30CE;
+3329;3329;3329;30CE 30C3 30C8;30CE 30C3 30C8;
+332A;332A;332A;30CF 30A4 30C4;30CF 30A4 30C4;
+332B;332B;332B;30D1 30FC 30BB 30F3 30C8;30CF 309A 30FC 30BB 30F3 30C8;
+332C;332C;332C;30D1 30FC 30C4;30CF 309A 30FC 30C4;
+332D;332D;332D;30D0 30FC 30EC 30EB;30CF 3099 30FC 30EC 30EB;
+332E;332E;332E;30D4 30A2 30B9 30C8 30EB;30D2 309A 30A2 30B9 30C8 30EB;
+332F;332F;332F;30D4 30AF 30EB;30D2 309A 30AF 30EB;
+3330;3330;3330;30D4 30B3;30D2 309A 30B3;
+3331;3331;3331;30D3 30EB;30D2 3099 30EB;
+3332;3332;3332;30D5 30A1 30E9 30C3 30C9;30D5 30A1 30E9 30C3 30C8 3099;
+3333;3333;3333;30D5 30A3 30FC 30C8;30D5 30A3 30FC 30C8;
+3334;3334;3334;30D6 30C3 30B7 30A7 30EB;30D5 3099 30C3 30B7 30A7 30EB;
+3335;3335;3335;30D5 30E9 30F3;30D5 30E9 30F3;
+3336;3336;3336;30D8 30AF 30BF 30FC 30EB;30D8 30AF 30BF 30FC 30EB;
+3337;3337;3337;30DA 30BD;30D8 309A 30BD;
+3338;3338;3338;30DA 30CB 30D2;30D8 309A 30CB 30D2;
+3339;3339;3339;30D8 30EB 30C4;30D8 30EB 30C4;
+333A;333A;333A;30DA 30F3 30B9;30D8 309A 30F3 30B9;
+333B;333B;333B;30DA 30FC 30B8;30D8 309A 30FC 30B7 3099;
+333C;333C;333C;30D9 30FC 30BF;30D8 3099 30FC 30BF;
+333D;333D;333D;30DD 30A4 30F3 30C8;30DB 309A 30A4 30F3 30C8;
+333E;333E;333E;30DC 30EB 30C8;30DB 3099 30EB 30C8;
+333F;333F;333F;30DB 30F3;30DB 30F3;
+3340;3340;3340;30DD 30F3 30C9;30DB 309A 30F3 30C8 3099;
+3341;3341;3341;30DB 30FC 30EB;30DB 30FC 30EB;
+3342;3342;3342;30DB 30FC 30F3;30DB 30FC 30F3;
+3343;3343;3343;30DE 30A4 30AF 30ED;30DE 30A4 30AF 30ED;
+3344;3344;3344;30DE 30A4 30EB;30DE 30A4 30EB;
+3345;3345;3345;30DE 30C3 30CF;30DE 30C3 30CF;
+3346;3346;3346;30DE 30EB 30AF;30DE 30EB 30AF;
+3347;3347;3347;30DE 30F3 30B7 30E7 30F3;30DE 30F3 30B7 30E7 30F3;
+3348;3348;3348;30DF 30AF 30ED 30F3;30DF 30AF 30ED 30F3;
+3349;3349;3349;30DF 30EA;30DF 30EA;
+334A;334A;334A;30DF 30EA 30D0 30FC 30EB;30DF 30EA 30CF 3099 30FC 30EB;
+334B;334B;334B;30E1 30AC;30E1 30AB 3099;
+334C;334C;334C;30E1 30AC 30C8 30F3;30E1 30AB 3099 30C8 30F3;
+334D;334D;334D;30E1 30FC 30C8 30EB;30E1 30FC 30C8 30EB;
+334E;334E;334E;30E4 30FC 30C9;30E4 30FC 30C8 3099;
+334F;334F;334F;30E4 30FC 30EB;30E4 30FC 30EB;
+3350;3350;3350;30E6 30A2 30F3;30E6 30A2 30F3;
+3351;3351;3351;30EA 30C3 30C8 30EB;30EA 30C3 30C8 30EB;
+3352;3352;3352;30EA 30E9;30EA 30E9;
+3353;3353;3353;30EB 30D4 30FC;30EB 30D2 309A 30FC;
+3354;3354;3354;30EB 30FC 30D6 30EB;30EB 30FC 30D5 3099 30EB;
+3355;3355;3355;30EC 30E0;30EC 30E0;
+3356;3356;3356;30EC 30F3 30C8 30B2 30F3;30EC 30F3 30C8 30B1 3099 30F3;
+3357;3357;3357;30EF 30C3 30C8;30EF 30C3 30C8;
+3358;3358;3358;0030 70B9;0030 70B9;
+3359;3359;3359;0031 70B9;0031 70B9;
+335A;335A;335A;0032 70B9;0032 70B9;
+335B;335B;335B;0033 70B9;0033 70B9;
+335C;335C;335C;0034 70B9;0034 70B9;
+335D;335D;335D;0035 70B9;0035 70B9;
+335E;335E;335E;0036 70B9;0036 70B9;
+335F;335F;335F;0037 70B9;0037 70B9;
+3360;3360;3360;0038 70B9;0038 70B9;
+3361;3361;3361;0039 70B9;0039 70B9;
+3362;3362;3362;0031 0030 70B9;0031 0030 70B9;
+3363;3363;3363;0031 0031 70B9;0031 0031 70B9;
+3364;3364;3364;0031 0032 70B9;0031 0032 70B9;
+3365;3365;3365;0031 0033 70B9;0031 0033 70B9;
+3366;3366;3366;0031 0034 70B9;0031 0034 70B9;
+3367;3367;3367;0031 0035 70B9;0031 0035 70B9;
+3368;3368;3368;0031 0036 70B9;0031 0036 70B9;
+3369;3369;3369;0031 0037 70B9;0031 0037 70B9;
+336A;336A;336A;0031 0038 70B9;0031 0038 70B9;
+336B;336B;336B;0031 0039 70B9;0031 0039 70B9;
+336C;336C;336C;0032 0030 70B9;0032 0030 70B9;
+336D;336D;336D;0032 0031 70B9;0032 0031 70B9;
+336E;336E;336E;0032 0032 70B9;0032 0032 70B9;
+336F;336F;336F;0032 0033 70B9;0032 0033 70B9;
+3370;3370;3370;0032 0034 70B9;0032 0034 70B9;
+3371;3371;3371;0068 0050 0061;0068 0050 0061;
+3372;3372;3372;0064 0061;0064 0061;
+3373;3373;3373;0041 0055;0041 0055;
+3374;3374;3374;0062 0061 0072;0062 0061 0072;
+3375;3375;3375;006F 0056;006F 0056;
+3376;3376;3376;0070 0063;0070 0063;
+3377;3377;3377;0064 006D;0064 006D;
+3378;3378;3378;0064 006D 0032;0064 006D 0032;
+3379;3379;3379;0064 006D 0033;0064 006D 0033;
+337A;337A;337A;0049 0055;0049 0055;
+337B;337B;337B;5E73 6210;5E73 6210;
+337C;337C;337C;662D 548C;662D 548C;
+337D;337D;337D;5927 6B63;5927 6B63;
+337E;337E;337E;660E 6CBB;660E 6CBB;
+337F;337F;337F;682A 5F0F 4F1A 793E;682A 5F0F 4F1A 793E;
+3380;3380;3380;0070 0041;0070 0041;
+3381;3381;3381;006E 0041;006E 0041;
+3382;3382;3382;03BC 0041;03BC 0041;
+3383;3383;3383;006D 0041;006D 0041;
+3384;3384;3384;006B 0041;006B 0041;
+3385;3385;3385;004B 0042;004B 0042;
+3386;3386;3386;004D 0042;004D 0042;
+3387;3387;3387;0047 0042;0047 0042;
+3388;3388;3388;0063 0061 006C;0063 0061 006C;
+3389;3389;3389;006B 0063 0061 006C;006B 0063 0061 006C;
+338A;338A;338A;0070 0046;0070 0046;
+338B;338B;338B;006E 0046;006E 0046;
+338C;338C;338C;03BC 0046;03BC 0046;
+338D;338D;338D;03BC 0067;03BC 0067;
+338E;338E;338E;006D 0067;006D 0067;
+338F;338F;338F;006B 0067;006B 0067;
+3390;3390;3390;0048 007A;0048 007A;
+3391;3391;3391;006B 0048 007A;006B 0048 007A;
+3392;3392;3392;004D 0048 007A;004D 0048 007A;
+3393;3393;3393;0047 0048 007A;0047 0048 007A;
+3394;3394;3394;0054 0048 007A;0054 0048 007A;
+3395;3395;3395;03BC 006C;03BC 006C;
+3396;3396;3396;006D 006C;006D 006C;
+3397;3397;3397;0064 006C;0064 006C;
+3398;3398;3398;006B 006C;006B 006C;
+3399;3399;3399;0066 006D;0066 006D;
+339A;339A;339A;006E 006D;006E 006D;
+339B;339B;339B;03BC 006D;03BC 006D;
+339C;339C;339C;006D 006D;006D 006D;
+339D;339D;339D;0063 006D;0063 006D;
+339E;339E;339E;006B 006D;006B 006D;
+339F;339F;339F;006D 006D 0032;006D 006D 0032;
+33A0;33A0;33A0;0063 006D 0032;0063 006D 0032;
+33A1;33A1;33A1;006D 0032;006D 0032;
+33A2;33A2;33A2;006B 006D 0032;006B 006D 0032;
+33A3;33A3;33A3;006D 006D 0033;006D 006D 0033;
+33A4;33A4;33A4;0063 006D 0033;0063 006D 0033;
+33A5;33A5;33A5;006D 0033;006D 0033;
+33A6;33A6;33A6;006B 006D 0033;006B 006D 0033;
+33A7;33A7;33A7;006D 2215 0073;006D 2215 0073;
+33A8;33A8;33A8;006D 2215 0073 0032;006D 2215 0073 0032;
+33A9;33A9;33A9;0050 0061;0050 0061;
+33AA;33AA;33AA;006B 0050 0061;006B 0050 0061;
+33AB;33AB;33AB;004D 0050 0061;004D 0050 0061;
+33AC;33AC;33AC;0047 0050 0061;0047 0050 0061;
+33AD;33AD;33AD;0072 0061 0064;0072 0061 0064;
+33AE;33AE;33AE;0072 0061 0064 2215 0073;0072 0061 0064 2215 0073;
+33AF;33AF;33AF;0072 0061 0064 2215 0073 0032;0072 0061 0064 2215 0073 0032;
+33B0;33B0;33B0;0070 0073;0070 0073;
+33B1;33B1;33B1;006E 0073;006E 0073;
+33B2;33B2;33B2;03BC 0073;03BC 0073;
+33B3;33B3;33B3;006D 0073;006D 0073;
+33B4;33B4;33B4;0070 0056;0070 0056;
+33B5;33B5;33B5;006E 0056;006E 0056;
+33B6;33B6;33B6;03BC 0056;03BC 0056;
+33B7;33B7;33B7;006D 0056;006D 0056;
+33B8;33B8;33B8;006B 0056;006B 0056;
+33B9;33B9;33B9;004D 0056;004D 0056;
+33BA;33BA;33BA;0070 0057;0070 0057;
+33BB;33BB;33BB;006E 0057;006E 0057;
+33BC;33BC;33BC;03BC 0057;03BC 0057;
+33BD;33BD;33BD;006D 0057;006D 0057;
+33BE;33BE;33BE;006B 0057;006B 0057;
+33BF;33BF;33BF;004D 0057;004D 0057;
+33C0;33C0;33C0;006B 03A9;006B 03A9;
+33C1;33C1;33C1;004D 03A9;004D 03A9;
+33C2;33C2;33C2;0061 002E 006D 002E;0061 002E 006D 002E;
+33C3;33C3;33C3;0042 0071;0042 0071;
+33C4;33C4;33C4;0063 0063;0063 0063;
+33C5;33C5;33C5;0063 0064;0063 0064;
+33C6;33C6;33C6;0043 2215 006B 0067;0043 2215 006B 0067;
+33C7;33C7;33C7;0043 006F 002E;0043 006F 002E;
+33C8;33C8;33C8;0064 0042;0064 0042;
+33C9;33C9;33C9;0047 0079;0047 0079;
+33CA;33CA;33CA;0068 0061;0068 0061;
+33CB;33CB;33CB;0048 0050;0048 0050;
+33CC;33CC;33CC;0069 006E;0069 006E;
+33CD;33CD;33CD;004B 004B;004B 004B;
+33CE;33CE;33CE;004B 004D;004B 004D;
+33CF;33CF;33CF;006B 0074;006B 0074;
+33D0;33D0;33D0;006C 006D;006C 006D;
+33D1;33D1;33D1;006C 006E;006C 006E;
+33D2;33D2;33D2;006C 006F 0067;006C 006F 0067;
+33D3;33D3;33D3;006C 0078;006C 0078;
+33D4;33D4;33D4;006D 0062;006D 0062;
+33D5;33D5;33D5;006D 0069 006C;006D 0069 006C;
+33D6;33D6;33D6;006D 006F 006C;006D 006F 006C;
+33D7;33D7;33D7;0050 0048;0050 0048;
+33D8;33D8;33D8;0070 002E 006D 002E;0070 002E 006D 002E;
+33D9;33D9;33D9;0050 0050 004D;0050 0050 004D;
+33DA;33DA;33DA;0050 0052;0050 0052;
+33DB;33DB;33DB;0073 0072;0073 0072;
+33DC;33DC;33DC;0053 0076;0053 0076;
+33DD;33DD;33DD;0057 0062;0057 0062;
+33DE;33DE;33DE;0056 2215 006D;0056 2215 006D;
+33DF;33DF;33DF;0041 2215 006D;0041 2215 006D;
+33E0;33E0;33E0;0031 65E5;0031 65E5;
+33E1;33E1;33E1;0032 65E5;0032 65E5;
+33E2;33E2;33E2;0033 65E5;0033 65E5;
+33E3;33E3;33E3;0034 65E5;0034 65E5;
+33E4;33E4;33E4;0035 65E5;0035 65E5;
+33E5;33E5;33E5;0036 65E5;0036 65E5;
+33E6;33E6;33E6;0037 65E5;0037 65E5;
+33E7;33E7;33E7;0038 65E5;0038 65E5;
+33E8;33E8;33E8;0039 65E5;0039 65E5;
+33E9;33E9;33E9;0031 0030 65E5;0031 0030 65E5;
+33EA;33EA;33EA;0031 0031 65E5;0031 0031 65E5;
+33EB;33EB;33EB;0031 0032 65E5;0031 0032 65E5;
+33EC;33EC;33EC;0031 0033 65E5;0031 0033 65E5;
+33ED;33ED;33ED;0031 0034 65E5;0031 0034 65E5;
+33EE;33EE;33EE;0031 0035 65E5;0031 0035 65E5;
+33EF;33EF;33EF;0031 0036 65E5;0031 0036 65E5;
+33F0;33F0;33F0;0031 0037 65E5;0031 0037 65E5;
+33F1;33F1;33F1;0031 0038 65E5;0031 0038 65E5;
+33F2;33F2;33F2;0031 0039 65E5;0031 0039 65E5;
+33F3;33F3;33F3;0032 0030 65E5;0032 0030 65E5;
+33F4;33F4;33F4;0032 0031 65E5;0032 0031 65E5;
+33F5;33F5;33F5;0032 0032 65E5;0032 0032 65E5;
+33F6;33F6;33F6;0032 0033 65E5;0032 0033 65E5;
+33F7;33F7;33F7;0032 0034 65E5;0032 0034 65E5;
+33F8;33F8;33F8;0032 0035 65E5;0032 0035 65E5;
+33F9;33F9;33F9;0032 0036 65E5;0032 0036 65E5;
+33FA;33FA;33FA;0032 0037 65E5;0032 0037 65E5;
+33FB;33FB;33FB;0032 0038 65E5;0032 0038 65E5;
+33FC;33FC;33FC;0032 0039 65E5;0032 0039 65E5;
+33FD;33FD;33FD;0033 0030 65E5;0033 0030 65E5;
+33FE;33FE;33FE;0033 0031 65E5;0033 0031 65E5;
+33FF;33FF;33FF;0067 0061 006C;0067 0061 006C;
+A770;A770;A770;A76F;A76F;
+AC00;AC00;1100 1161;AC00;1100 1161;
+AC01;AC01;1100 1161 11A8;AC01;1100 1161 11A8;
+AC02;AC02;1100 1161 11A9;AC02;1100 1161 11A9;
+AC03;AC03;1100 1161 11AA;AC03;1100 1161 11AA;
+AC04;AC04;1100 1161 11AB;AC04;1100 1161 11AB;
+AC05;AC05;1100 1161 11AC;AC05;1100 1161 11AC;
+AC06;AC06;1100 1161 11AD;AC06;1100 1161 11AD;
+AC07;AC07;1100 1161 11AE;AC07;1100 1161 11AE;
+AC08;AC08;1100 1161 11AF;AC08;1100 1161 11AF;
+AC09;AC09;1100 1161 11B0;AC09;1100 1161 11B0;
+AC0A;AC0A;1100 1161 11B1;AC0A;1100 1161 11B1;
+AC0B;AC0B;1100 1161 11B2;AC0B;1100 1161 11B2;
+AC0C;AC0C;1100 1161 11B3;AC0C;1100 1161 11B3;
+AC0D;AC0D;1100 1161 11B4;AC0D;1100 1161 11B4;
+AC0E;AC0E;1100 1161 11B5;AC0E;1100 1161 11B5;
+AC0F;AC0F;1100 1161 11B6;AC0F;1100 1161 11B6;
+AC10;AC10;1100 1161 11B7;AC10;1100 1161 11B7;
+AC11;AC11;1100 1161 11B8;AC11;1100 1161 11B8;
+AC12;AC12;1100 1161 11B9;AC12;1100 1161 11B9;
+AC13;AC13;1100 1161 11BA;AC13;1100 1161 11BA;
+AC14;AC14;1100 1161 11BB;AC14;1100 1161 11BB;
+AC15;AC15;1100 1161 11BC;AC15;1100 1161 11BC;
+AC16;AC16;1100 1161 11BD;AC16;1100 1161 11BD;
+AC17;AC17;1100 1161 11BE;AC17;1100 1161 11BE;
+AC18;AC18;1100 1161 11BF;AC18;1100 1161 11BF;
+AC19;AC19;1100 1161 11C0;AC19;1100 1161 11C0;
+AC1A;AC1A;1100 1161 11C1;AC1A;1100 1161 11C1;
+AC1B;AC1B;1100 1161 11C2;AC1B;1100 1161 11C2;
+AC1C;AC1C;1100 1162;AC1C;1100 1162;
+AC1D;AC1D;1100 1162 11A8;AC1D;1100 1162 11A8;
+AC1E;AC1E;1100 1162 11A9;AC1E;1100 1162 11A9;
+AC1F;AC1F;1100 1162 11AA;AC1F;1100 1162 11AA;
+AC20;AC20;1100 1162 11AB;AC20;1100 1162 11AB;
+AC21;AC21;1100 1162 11AC;AC21;1100 1162 11AC;
+AC22;AC22;1100 1162 11AD;AC22;1100 1162 11AD;
+AC23;AC23;1100 1162 11AE;AC23;1100 1162 11AE;
+AC24;AC24;1100 1162 11AF;AC24;1100 1162 11AF;
+AC25;AC25;1100 1162 11B0;AC25;1100 1162 11B0;
+AC26;AC26;1100 1162 11B1;AC26;1100 1162 11B1;
+AC27;AC27;1100 1162 11B2;AC27;1100 1162 11B2;
+AC28;AC28;1100 1162 11B3;AC28;1100 1162 11B3;
+AC29;AC29;1100 1162 11B4;AC29;1100 1162 11B4;
+AC2A;AC2A;1100 1162 11B5;AC2A;1100 1162 11B5;
+AC2B;AC2B;1100 1162 11B6;AC2B;1100 1162 11B6;
+AC2C;AC2C;1100 1162 11B7;AC2C;1100 1162 11B7;
+AC2D;AC2D;1100 1162 11B8;AC2D;1100 1162 11B8;
+AC2E;AC2E;1100 1162 11B9;AC2E;1100 1162 11B9;
+AC2F;AC2F;1100 1162 11BA;AC2F;1100 1162 11BA;
+AC30;AC30;1100 1162 11BB;AC30;1100 1162 11BB;
+AC31;AC31;1100 1162 11BC;AC31;1100 1162 11BC;
+AC32;AC32;1100 1162 11BD;AC32;1100 1162 11BD;
+AC33;AC33;1100 1162 11BE;AC33;1100 1162 11BE;
+AC34;AC34;1100 1162 11BF;AC34;1100 1162 11BF;
+AC35;AC35;1100 1162 11C0;AC35;1100 1162 11C0;
+AC36;AC36;1100 1162 11C1;AC36;1100 1162 11C1;
+AC37;AC37;1100 1162 11C2;AC37;1100 1162 11C2;
+AC38;AC38;1100 1163;AC38;1100 1163;
+AC39;AC39;1100 1163 11A8;AC39;1100 1163 11A8;
+AC3A;AC3A;1100 1163 11A9;AC3A;1100 1163 11A9;
+AC3B;AC3B;1100 1163 11AA;AC3B;1100 1163 11AA;
+AC3C;AC3C;1100 1163 11AB;AC3C;1100 1163 11AB;
+AC3D;AC3D;1100 1163 11AC;AC3D;1100 1163 11AC;
+AC3E;AC3E;1100 1163 11AD;AC3E;1100 1163 11AD;
+AC3F;AC3F;1100 1163 11AE;AC3F;1100 1163 11AE;
+AC40;AC40;1100 1163 11AF;AC40;1100 1163 11AF;
+AC41;AC41;1100 1163 11B0;AC41;1100 1163 11B0;
+AC42;AC42;1100 1163 11B1;AC42;1100 1163 11B1;
+AC43;AC43;1100 1163 11B2;AC43;1100 1163 11B2;
+AC44;AC44;1100 1163 11B3;AC44;1100 1163 11B3;
+AC45;AC45;1100 1163 11B4;AC45;1100 1163 11B4;
+AC46;AC46;1100 1163 11B5;AC46;1100 1163 11B5;
+AC47;AC47;1100 1163 11B6;AC47;1100 1163 11B6;
+AC48;AC48;1100 1163 11B7;AC48;1100 1163 11B7;
+AC49;AC49;1100 1163 11B8;AC49;1100 1163 11B8;
+AC4A;AC4A;1100 1163 11B9;AC4A;1100 1163 11B9;
+AC4B;AC4B;1100 1163 11BA;AC4B;1100 1163 11BA;
+AC4C;AC4C;1100 1163 11BB;AC4C;1100 1163 11BB;
+AC4D;AC4D;1100 1163 11BC;AC4D;1100 1163 11BC;
+AC4E;AC4E;1100 1163 11BD;AC4E;1100 1163 11BD;
+AC4F;AC4F;1100 1163 11BE;AC4F;1100 1163 11BE;
+AC50;AC50;1100 1163 11BF;AC50;1100 1163 11BF;
+AC51;AC51;1100 1163 11C0;AC51;1100 1163 11C0;
+AC52;AC52;1100 1163 11C1;AC52;1100 1163 11C1;
+AC53;AC53;1100 1163 11C2;AC53;1100 1163 11C2;
+AC54;AC54;1100 1164;AC54;1100 1164;
+AC55;AC55;1100 1164 11A8;AC55;1100 1164 11A8;
+AC56;AC56;1100 1164 11A9;AC56;1100 1164 11A9;
+AC57;AC57;1100 1164 11AA;AC57;1100 1164 11AA;
+AC58;AC58;1100 1164 11AB;AC58;1100 1164 11AB;
+AC59;AC59;1100 1164 11AC;AC59;1100 1164 11AC;
+AC5A;AC5A;1100 1164 11AD;AC5A;1100 1164 11AD;
+AC5B;AC5B;1100 1164 11AE;AC5B;1100 1164 11AE;
+AC5C;AC5C;1100 1164 11AF;AC5C;1100 1164 11AF;
+AC5D;AC5D;1100 1164 11B0;AC5D;1100 1164 11B0;
+AC5E;AC5E;1100 1164 11B1;AC5E;1100 1164 11B1;
+AC5F;AC5F;1100 1164 11B2;AC5F;1100 1164 11B2;
+AC60;AC60;1100 1164 11B3;AC60;1100 1164 11B3;
+AC61;AC61;1100 1164 11B4;AC61;1100 1164 11B4;
+AC62;AC62;1100 1164 11B5;AC62;1100 1164 11B5;
+AC63;AC63;1100 1164 11B6;AC63;1100 1164 11B6;
+AC64;AC64;1100 1164 11B7;AC64;1100 1164 11B7;
+AC65;AC65;1100 1164 11B8;AC65;1100 1164 11B8;
+AC66;AC66;1100 1164 11B9;AC66;1100 1164 11B9;
+AC67;AC67;1100 1164 11BA;AC67;1100 1164 11BA;
+AC68;AC68;1100 1164 11BB;AC68;1100 1164 11BB;
+AC69;AC69;1100 1164 11BC;AC69;1100 1164 11BC;
+AC6A;AC6A;1100 1164 11BD;AC6A;1100 1164 11BD;
+AC6B;AC6B;1100 1164 11BE;AC6B;1100 1164 11BE;
+AC6C;AC6C;1100 1164 11BF;AC6C;1100 1164 11BF;
+AC6D;AC6D;1100 1164 11C0;AC6D;1100 1164 11C0;
+AC6E;AC6E;1100 1164 11C1;AC6E;1100 1164 11C1;
+AC6F;AC6F;1100 1164 11C2;AC6F;1100 1164 11C2;
+AC70;AC70;1100 1165;AC70;1100 1165;
+AC71;AC71;1100 1165 11A8;AC71;1100 1165 11A8;
+AC72;AC72;1100 1165 11A9;AC72;1100 1165 11A9;
+AC73;AC73;1100 1165 11AA;AC73;1100 1165 11AA;
+AC74;AC74;1100 1165 11AB;AC74;1100 1165 11AB;
+AC75;AC75;1100 1165 11AC;AC75;1100 1165 11AC;
+AC76;AC76;1100 1165 11AD;AC76;1100 1165 11AD;
+AC77;AC77;1100 1165 11AE;AC77;1100 1165 11AE;
+AC78;AC78;1100 1165 11AF;AC78;1100 1165 11AF;
+AC79;AC79;1100 1165 11B0;AC79;1100 1165 11B0;
+AC7A;AC7A;1100 1165 11B1;AC7A;1100 1165 11B1;
+AC7B;AC7B;1100 1165 11B2;AC7B;1100 1165 11B2;
+AC7C;AC7C;1100 1165 11B3;AC7C;1100 1165 11B3;
+AC7D;AC7D;1100 1165 11B4;AC7D;1100 1165 11B4;
+AC7E;AC7E;1100 1165 11B5;AC7E;1100 1165 11B5;
+AC7F;AC7F;1100 1165 11B6;AC7F;1100 1165 11B6;
+AC80;AC80;1100 1165 11B7;AC80;1100 1165 11B7;
+AC81;AC81;1100 1165 11B8;AC81;1100 1165 11B8;
+AC82;AC82;1100 1165 11B9;AC82;1100 1165 11B9;
+AC83;AC83;1100 1165 11BA;AC83;1100 1165 11BA;
+AC84;AC84;1100 1165 11BB;AC84;1100 1165 11BB;
+AC85;AC85;1100 1165 11BC;AC85;1100 1165 11BC;
+AC86;AC86;1100 1165 11BD;AC86;1100 1165 11BD;
+AC87;AC87;1100 1165 11BE;AC87;1100 1165 11BE;
+AC88;AC88;1100 1165 11BF;AC88;1100 1165 11BF;
+AC89;AC89;1100 1165 11C0;AC89;1100 1165 11C0;
+AC8A;AC8A;1100 1165 11C1;AC8A;1100 1165 11C1;
+AC8B;AC8B;1100 1165 11C2;AC8B;1100 1165 11C2;
+AC8C;AC8C;1100 1166;AC8C;1100 1166;
+AC8D;AC8D;1100 1166 11A8;AC8D;1100 1166 11A8;
+AC8E;AC8E;1100 1166 11A9;AC8E;1100 1166 11A9;
+AC8F;AC8F;1100 1166 11AA;AC8F;1100 1166 11AA;
+AC90;AC90;1100 1166 11AB;AC90;1100 1166 11AB;
+AC91;AC91;1100 1166 11AC;AC91;1100 1166 11AC;
+AC92;AC92;1100 1166 11AD;AC92;1100 1166 11AD;
+AC93;AC93;1100 1166 11AE;AC93;1100 1166 11AE;
+AC94;AC94;1100 1166 11AF;AC94;1100 1166 11AF;
+AC95;AC95;1100 1166 11B0;AC95;1100 1166 11B0;
+AC96;AC96;1100 1166 11B1;AC96;1100 1166 11B1;
+AC97;AC97;1100 1166 11B2;AC97;1100 1166 11B2;
+AC98;AC98;1100 1166 11B3;AC98;1100 1166 11B3;
+AC99;AC99;1100 1166 11B4;AC99;1100 1166 11B4;
+AC9A;AC9A;1100 1166 11B5;AC9A;1100 1166 11B5;
+AC9B;AC9B;1100 1166 11B6;AC9B;1100 1166 11B6;
+AC9C;AC9C;1100 1166 11B7;AC9C;1100 1166 11B7;
+AC9D;AC9D;1100 1166 11B8;AC9D;1100 1166 11B8;
+AC9E;AC9E;1100 1166 11B9;AC9E;1100 1166 11B9;
+AC9F;AC9F;1100 1166 11BA;AC9F;1100 1166 11BA;
+ACA0;ACA0;1100 1166 11BB;ACA0;1100 1166 11BB;
+ACA1;ACA1;1100 1166 11BC;ACA1;1100 1166 11BC;
+ACA2;ACA2;1100 1166 11BD;ACA2;1100 1166 11BD;
+ACA3;ACA3;1100 1166 11BE;ACA3;1100 1166 11BE;
+ACA4;ACA4;1100 1166 11BF;ACA4;1100 1166 11BF;
+ACA5;ACA5;1100 1166 11C0;ACA5;1100 1166 11C0;
+ACA6;ACA6;1100 1166 11C1;ACA6;1100 1166 11C1;
+ACA7;ACA7;1100 1166 11C2;ACA7;1100 1166 11C2;
+ACA8;ACA8;1100 1167;ACA8;1100 1167;
+ACA9;ACA9;1100 1167 11A8;ACA9;1100 1167 11A8;
+ACAA;ACAA;1100 1167 11A9;ACAA;1100 1167 11A9;
+ACAB;ACAB;1100 1167 11AA;ACAB;1100 1167 11AA;
+ACAC;ACAC;1100 1167 11AB;ACAC;1100 1167 11AB;
+ACAD;ACAD;1100 1167 11AC;ACAD;1100 1167 11AC;
+ACAE;ACAE;1100 1167 11AD;ACAE;1100 1167 11AD;
+ACAF;ACAF;1100 1167 11AE;ACAF;1100 1167 11AE;
+ACB0;ACB0;1100 1167 11AF;ACB0;1100 1167 11AF;
+ACB1;ACB1;1100 1167 11B0;ACB1;1100 1167 11B0;
+ACB2;ACB2;1100 1167 11B1;ACB2;1100 1167 11B1;
+ACB3;ACB3;1100 1167 11B2;ACB3;1100 1167 11B2;
+ACB4;ACB4;1100 1167 11B3;ACB4;1100 1167 11B3;
+ACB5;ACB5;1100 1167 11B4;ACB5;1100 1167 11B4;
+ACB6;ACB6;1100 1167 11B5;ACB6;1100 1167 11B5;
+ACB7;ACB7;1100 1167 11B6;ACB7;1100 1167 11B6;
+ACB8;ACB8;1100 1167 11B7;ACB8;1100 1167 11B7;
+ACB9;ACB9;1100 1167 11B8;ACB9;1100 1167 11B8;
+ACBA;ACBA;1100 1167 11B9;ACBA;1100 1167 11B9;
+ACBB;ACBB;1100 1167 11BA;ACBB;1100 1167 11BA;
+ACBC;ACBC;1100 1167 11BB;ACBC;1100 1167 11BB;
+ACBD;ACBD;1100 1167 11BC;ACBD;1100 1167 11BC;
+ACBE;ACBE;1100 1167 11BD;ACBE;1100 1167 11BD;
+ACBF;ACBF;1100 1167 11BE;ACBF;1100 1167 11BE;
+ACC0;ACC0;1100 1167 11BF;ACC0;1100 1167 11BF;
+ACC1;ACC1;1100 1167 11C0;ACC1;1100 1167 11C0;
+ACC2;ACC2;1100 1167 11C1;ACC2;1100 1167 11C1;
+ACC3;ACC3;1100 1167 11C2;ACC3;1100 1167 11C2;
+ACC4;ACC4;1100 1168;ACC4;1100 1168;
+ACC5;ACC5;1100 1168 11A8;ACC5;1100 1168 11A8;
+ACC6;ACC6;1100 1168 11A9;ACC6;1100 1168 11A9;
+ACC7;ACC7;1100 1168 11AA;ACC7;1100 1168 11AA;
+ACC8;ACC8;1100 1168 11AB;ACC8;1100 1168 11AB;
+ACC9;ACC9;1100 1168 11AC;ACC9;1100 1168 11AC;
+ACCA;ACCA;1100 1168 11AD;ACCA;1100 1168 11AD;
+ACCB;ACCB;1100 1168 11AE;ACCB;1100 1168 11AE;
+ACCC;ACCC;1100 1168 11AF;ACCC;1100 1168 11AF;
+ACCD;ACCD;1100 1168 11B0;ACCD;1100 1168 11B0;
+ACCE;ACCE;1100 1168 11B1;ACCE;1100 1168 11B1;
+ACCF;ACCF;1100 1168 11B2;ACCF;1100 1168 11B2;
+ACD0;ACD0;1100 1168 11B3;ACD0;1100 1168 11B3;
+ACD1;ACD1;1100 1168 11B4;ACD1;1100 1168 11B4;
+ACD2;ACD2;1100 1168 11B5;ACD2;1100 1168 11B5;
+ACD3;ACD3;1100 1168 11B6;ACD3;1100 1168 11B6;
+ACD4;ACD4;1100 1168 11B7;ACD4;1100 1168 11B7;
+ACD5;ACD5;1100 1168 11B8;ACD5;1100 1168 11B8;
+ACD6;ACD6;1100 1168 11B9;ACD6;1100 1168 11B9;
+ACD7;ACD7;1100 1168 11BA;ACD7;1100 1168 11BA;
+ACD8;ACD8;1100 1168 11BB;ACD8;1100 1168 11BB;
+ACD9;ACD9;1100 1168 11BC;ACD9;1100 1168 11BC;
+ACDA;ACDA;1100 1168 11BD;ACDA;1100 1168 11BD;
+ACDB;ACDB;1100 1168 11BE;ACDB;1100 1168 11BE;
+ACDC;ACDC;1100 1168 11BF;ACDC;1100 1168 11BF;
+ACDD;ACDD;1100 1168 11C0;ACDD;1100 1168 11C0;
+ACDE;ACDE;1100 1168 11C1;ACDE;1100 1168 11C1;
+ACDF;ACDF;1100 1168 11C2;ACDF;1100 1168 11C2;
+ACE0;ACE0;1100 1169;ACE0;1100 1169;
+ACE1;ACE1;1100 1169 11A8;ACE1;1100 1169 11A8;
+ACE2;ACE2;1100 1169 11A9;ACE2;1100 1169 11A9;
+ACE3;ACE3;1100 1169 11AA;ACE3;1100 1169 11AA;
+ACE4;ACE4;1100 1169 11AB;ACE4;1100 1169 11AB;
+ACE5;ACE5;1100 1169 11AC;ACE5;1100 1169 11AC;
+ACE6;ACE6;1100 1169 11AD;ACE6;1100 1169 11AD;
+ACE7;ACE7;1100 1169 11AE;ACE7;1100 1169 11AE;
+ACE8;ACE8;1100 1169 11AF;ACE8;1100 1169 11AF;
+ACE9;ACE9;1100 1169 11B0;ACE9;1100 1169 11B0;
+ACEA;ACEA;1100 1169 11B1;ACEA;1100 1169 11B1;
+ACEB;ACEB;1100 1169 11B2;ACEB;1100 1169 11B2;
+ACEC;ACEC;1100 1169 11B3;ACEC;1100 1169 11B3;
+ACED;ACED;1100 1169 11B4;ACED;1100 1169 11B4;
+ACEE;ACEE;1100 1169 11B5;ACEE;1100 1169 11B5;
+ACEF;ACEF;1100 1169 11B6;ACEF;1100 1169 11B6;
+ACF0;ACF0;1100 1169 11B7;ACF0;1100 1169 11B7;
+ACF1;ACF1;1100 1169 11B8;ACF1;1100 1169 11B8;
+ACF2;ACF2;1100 1169 11B9;ACF2;1100 1169 11B9;
+ACF3;ACF3;1100 1169 11BA;ACF3;1100 1169 11BA;
+ACF4;ACF4;1100 1169 11BB;ACF4;1100 1169 11BB;
+ACF5;ACF5;1100 1169 11BC;ACF5;1100 1169 11BC;
+ACF6;ACF6;1100 1169 11BD;ACF6;1100 1169 11BD;
+ACF7;ACF7;1100 1169 11BE;ACF7;1100 1169 11BE;
+ACF8;ACF8;1100 1169 11BF;ACF8;1100 1169 11BF;
+ACF9;ACF9;1100 1169 11C0;ACF9;1100 1169 11C0;
+ACFA;ACFA;1100 1169 11C1;ACFA;1100 1169 11C1;
+ACFB;ACFB;1100 1169 11C2;ACFB;1100 1169 11C2;
+ACFC;ACFC;1100 116A;ACFC;1100 116A;
+ACFD;ACFD;1100 116A 11A8;ACFD;1100 116A 11A8;
+ACFE;ACFE;1100 116A 11A9;ACFE;1100 116A 11A9;
+ACFF;ACFF;1100 116A 11AA;ACFF;1100 116A 11AA;
+AD00;AD00;1100 116A 11AB;AD00;1100 116A 11AB;
+AD01;AD01;1100 116A 11AC;AD01;1100 116A 11AC;
+AD02;AD02;1100 116A 11AD;AD02;1100 116A 11AD;
+AD03;AD03;1100 116A 11AE;AD03;1100 116A 11AE;
+AD04;AD04;1100 116A 11AF;AD04;1100 116A 11AF;
+AD05;AD05;1100 116A 11B0;AD05;1100 116A 11B0;
+AD06;AD06;1100 116A 11B1;AD06;1100 116A 11B1;
+AD07;AD07;1100 116A 11B2;AD07;1100 116A 11B2;
+AD08;AD08;1100 116A 11B3;AD08;1100 116A 11B3;
+AD09;AD09;1100 116A 11B4;AD09;1100 116A 11B4;
+AD0A;AD0A;1100 116A 11B5;AD0A;1100 116A 11B5;
+AD0B;AD0B;1100 116A 11B6;AD0B;1100 116A 11B6;
+AD0C;AD0C;1100 116A 11B7;AD0C;1100 116A 11B7;
+AD0D;AD0D;1100 116A 11B8;AD0D;1100 116A 11B8;
+AD0E;AD0E;1100 116A 11B9;AD0E;1100 116A 11B9;
+AD0F;AD0F;1100 116A 11BA;AD0F;1100 116A 11BA;
+AD10;AD10;1100 116A 11BB;AD10;1100 116A 11BB;
+AD11;AD11;1100 116A 11BC;AD11;1100 116A 11BC;
+AD12;AD12;1100 116A 11BD;AD12;1100 116A 11BD;
+AD13;AD13;1100 116A 11BE;AD13;1100 116A 11BE;
+AD14;AD14;1100 116A 11BF;AD14;1100 116A 11BF;
+AD15;AD15;1100 116A 11C0;AD15;1100 116A 11C0;
+AD16;AD16;1100 116A 11C1;AD16;1100 116A 11C1;
+AD17;AD17;1100 116A 11C2;AD17;1100 116A 11C2;
+AD18;AD18;1100 116B;AD18;1100 116B;
+AD19;AD19;1100 116B 11A8;AD19;1100 116B 11A8;
+AD1A;AD1A;1100 116B 11A9;AD1A;1100 116B 11A9;
+AD1B;AD1B;1100 116B 11AA;AD1B;1100 116B 11AA;
+AD1C;AD1C;1100 116B 11AB;AD1C;1100 116B 11AB;
+AD1D;AD1D;1100 116B 11AC;AD1D;1100 116B 11AC;
+AD1E;AD1E;1100 116B 11AD;AD1E;1100 116B 11AD;
+AD1F;AD1F;1100 116B 11AE;AD1F;1100 116B 11AE;
+AD20;AD20;1100 116B 11AF;AD20;1100 116B 11AF;
+AD21;AD21;1100 116B 11B0;AD21;1100 116B 11B0;
+AD22;AD22;1100 116B 11B1;AD22;1100 116B 11B1;
+AD23;AD23;1100 116B 11B2;AD23;1100 116B 11B2;
+AD24;AD24;1100 116B 11B3;AD24;1100 116B 11B3;
+AD25;AD25;1100 116B 11B4;AD25;1100 116B 11B4;
+AD26;AD26;1100 116B 11B5;AD26;1100 116B 11B5;
+AD27;AD27;1100 116B 11B6;AD27;1100 116B 11B6;
+AD28;AD28;1100 116B 11B7;AD28;1100 116B 11B7;
+AD29;AD29;1100 116B 11B8;AD29;1100 116B 11B8;
+AD2A;AD2A;1100 116B 11B9;AD2A;1100 116B 11B9;
+AD2B;AD2B;1100 116B 11BA;AD2B;1100 116B 11BA;
+AD2C;AD2C;1100 116B 11BB;AD2C;1100 116B 11BB;
+AD2D;AD2D;1100 116B 11BC;AD2D;1100 116B 11BC;
+AD2E;AD2E;1100 116B 11BD;AD2E;1100 116B 11BD;
+AD2F;AD2F;1100 116B 11BE;AD2F;1100 116B 11BE;
+AD30;AD30;1100 116B 11BF;AD30;1100 116B 11BF;
+AD31;AD31;1100 116B 11C0;AD31;1100 116B 11C0;
+AD32;AD32;1100 116B 11C1;AD32;1100 116B 11C1;
+AD33;AD33;1100 116B 11C2;AD33;1100 116B 11C2;
+AD34;AD34;1100 116C;AD34;1100 116C;
+AD35;AD35;1100 116C 11A8;AD35;1100 116C 11A8;
+AD36;AD36;1100 116C 11A9;AD36;1100 116C 11A9;
+AD37;AD37;1100 116C 11AA;AD37;1100 116C 11AA;
+AD38;AD38;1100 116C 11AB;AD38;1100 116C 11AB;
+AD39;AD39;1100 116C 11AC;AD39;1100 116C 11AC;
+AD3A;AD3A;1100 116C 11AD;AD3A;1100 116C 11AD;
+AD3B;AD3B;1100 116C 11AE;AD3B;1100 116C 11AE;
+AD3C;AD3C;1100 116C 11AF;AD3C;1100 116C 11AF;
+AD3D;AD3D;1100 116C 11B0;AD3D;1100 116C 11B0;
+AD3E;AD3E;1100 116C 11B1;AD3E;1100 116C 11B1;
+AD3F;AD3F;1100 116C 11B2;AD3F;1100 116C 11B2;
+AD40;AD40;1100 116C 11B3;AD40;1100 116C 11B3;
+AD41;AD41;1100 116C 11B4;AD41;1100 116C 11B4;
+AD42;AD42;1100 116C 11B5;AD42;1100 116C 11B5;
+AD43;AD43;1100 116C 11B6;AD43;1100 116C 11B6;
+AD44;AD44;1100 116C 11B7;AD44;1100 116C 11B7;
+AD45;AD45;1100 116C 11B8;AD45;1100 116C 11B8;
+AD46;AD46;1100 116C 11B9;AD46;1100 116C 11B9;
+AD47;AD47;1100 116C 11BA;AD47;1100 116C 11BA;
+AD48;AD48;1100 116C 11BB;AD48;1100 116C 11BB;
+AD49;AD49;1100 116C 11BC;AD49;1100 116C 11BC;
+AD4A;AD4A;1100 116C 11BD;AD4A;1100 116C 11BD;
+AD4B;AD4B;1100 116C 11BE;AD4B;1100 116C 11BE;
+AD4C;AD4C;1100 116C 11BF;AD4C;1100 116C 11BF;
+AD4D;AD4D;1100 116C 11C0;AD4D;1100 116C 11C0;
+AD4E;AD4E;1100 116C 11C1;AD4E;1100 116C 11C1;
+AD4F;AD4F;1100 116C 11C2;AD4F;1100 116C 11C2;
+AD50;AD50;1100 116D;AD50;1100 116D;
+AD51;AD51;1100 116D 11A8;AD51;1100 116D 11A8;
+AD52;AD52;1100 116D 11A9;AD52;1100 116D 11A9;
+AD53;AD53;1100 116D 11AA;AD53;1100 116D 11AA;
+AD54;AD54;1100 116D 11AB;AD54;1100 116D 11AB;
+AD55;AD55;1100 116D 11AC;AD55;1100 116D 11AC;
+AD56;AD56;1100 116D 11AD;AD56;1100 116D 11AD;
+AD57;AD57;1100 116D 11AE;AD57;1100 116D 11AE;
+AD58;AD58;1100 116D 11AF;AD58;1100 116D 11AF;
+AD59;AD59;1100 116D 11B0;AD59;1100 116D 11B0;
+AD5A;AD5A;1100 116D 11B1;AD5A;1100 116D 11B1;
+AD5B;AD5B;1100 116D 11B2;AD5B;1100 116D 11B2;
+AD5C;AD5C;1100 116D 11B3;AD5C;1100 116D 11B3;
+AD5D;AD5D;1100 116D 11B4;AD5D;1100 116D 11B4;
+AD5E;AD5E;1100 116D 11B5;AD5E;1100 116D 11B5;
+AD5F;AD5F;1100 116D 11B6;AD5F;1100 116D 11B6;
+AD60;AD60;1100 116D 11B7;AD60;1100 116D 11B7;
+AD61;AD61;1100 116D 11B8;AD61;1100 116D 11B8;
+AD62;AD62;1100 116D 11B9;AD62;1100 116D 11B9;
+AD63;AD63;1100 116D 11BA;AD63;1100 116D 11BA;
+AD64;AD64;1100 116D 11BB;AD64;1100 116D 11BB;
+AD65;AD65;1100 116D 11BC;AD65;1100 116D 11BC;
+AD66;AD66;1100 116D 11BD;AD66;1100 116D 11BD;
+AD67;AD67;1100 116D 11BE;AD67;1100 116D 11BE;
+AD68;AD68;1100 116D 11BF;AD68;1100 116D 11BF;
+AD69;AD69;1100 116D 11C0;AD69;1100 116D 11C0;
+AD6A;AD6A;1100 116D 11C1;AD6A;1100 116D 11C1;
+AD6B;AD6B;1100 116D 11C2;AD6B;1100 116D 11C2;
+AD6C;AD6C;1100 116E;AD6C;1100 116E;
+AD6D;AD6D;1100 116E 11A8;AD6D;1100 116E 11A8;
+AD6E;AD6E;1100 116E 11A9;AD6E;1100 116E 11A9;
+AD6F;AD6F;1100 116E 11AA;AD6F;1100 116E 11AA;
+AD70;AD70;1100 116E 11AB;AD70;1100 116E 11AB;
+AD71;AD71;1100 116E 11AC;AD71;1100 116E 11AC;
+AD72;AD72;1100 116E 11AD;AD72;1100 116E 11AD;
+AD73;AD73;1100 116E 11AE;AD73;1100 116E 11AE;
+AD74;AD74;1100 116E 11AF;AD74;1100 116E 11AF;
+AD75;AD75;1100 116E 11B0;AD75;1100 116E 11B0;
+AD76;AD76;1100 116E 11B1;AD76;1100 116E 11B1;
+AD77;AD77;1100 116E 11B2;AD77;1100 116E 11B2;
+AD78;AD78;1100 116E 11B3;AD78;1100 116E 11B3;
+AD79;AD79;1100 116E 11B4;AD79;1100 116E 11B4;
+AD7A;AD7A;1100 116E 11B5;AD7A;1100 116E 11B5;
+AD7B;AD7B;1100 116E 11B6;AD7B;1100 116E 11B6;
+AD7C;AD7C;1100 116E 11B7;AD7C;1100 116E 11B7;
+AD7D;AD7D;1100 116E 11B8;AD7D;1100 116E 11B8;
+AD7E;AD7E;1100 116E 11B9;AD7E;1100 116E 11B9;
+AD7F;AD7F;1100 116E 11BA;AD7F;1100 116E 11BA;
+AD80;AD80;1100 116E 11BB;AD80;1100 116E 11BB;
+AD81;AD81;1100 116E 11BC;AD81;1100 116E 11BC;
+AD82;AD82;1100 116E 11BD;AD82;1100 116E 11BD;
+AD83;AD83;1100 116E 11BE;AD83;1100 116E 11BE;
+AD84;AD84;1100 116E 11BF;AD84;1100 116E 11BF;
+AD85;AD85;1100 116E 11C0;AD85;1100 116E 11C0;
+AD86;AD86;1100 116E 11C1;AD86;1100 116E 11C1;
+AD87;AD87;1100 116E 11C2;AD87;1100 116E 11C2;
+AD88;AD88;1100 116F;AD88;1100 116F;
+AD89;AD89;1100 116F 11A8;AD89;1100 116F 11A8;
+AD8A;AD8A;1100 116F 11A9;AD8A;1100 116F 11A9;
+AD8B;AD8B;1100 116F 11AA;AD8B;1100 116F 11AA;
+AD8C;AD8C;1100 116F 11AB;AD8C;1100 116F 11AB;
+AD8D;AD8D;1100 116F 11AC;AD8D;1100 116F 11AC;
+AD8E;AD8E;1100 116F 11AD;AD8E;1100 116F 11AD;
+AD8F;AD8F;1100 116F 11AE;AD8F;1100 116F 11AE;
+AD90;AD90;1100 116F 11AF;AD90;1100 116F 11AF;
+AD91;AD91;1100 116F 11B0;AD91;1100 116F 11B0;
+AD92;AD92;1100 116F 11B1;AD92;1100 116F 11B1;
+AD93;AD93;1100 116F 11B2;AD93;1100 116F 11B2;
+AD94;AD94;1100 116F 11B3;AD94;1100 116F 11B3;
+AD95;AD95;1100 116F 11B4;AD95;1100 116F 11B4;
+AD96;AD96;1100 116F 11B5;AD96;1100 116F 11B5;
+AD97;AD97;1100 116F 11B6;AD97;1100 116F 11B6;
+AD98;AD98;1100 116F 11B7;AD98;1100 116F 11B7;
+AD99;AD99;1100 116F 11B8;AD99;1100 116F 11B8;
+AD9A;AD9A;1100 116F 11B9;AD9A;1100 116F 11B9;
+AD9B;AD9B;1100 116F 11BA;AD9B;1100 116F 11BA;
+AD9C;AD9C;1100 116F 11BB;AD9C;1100 116F 11BB;
+AD9D;AD9D;1100 116F 11BC;AD9D;1100 116F 11BC;
+AD9E;AD9E;1100 116F 11BD;AD9E;1100 116F 11BD;
+AD9F;AD9F;1100 116F 11BE;AD9F;1100 116F 11BE;
+ADA0;ADA0;1100 116F 11BF;ADA0;1100 116F 11BF;
+ADA1;ADA1;1100 116F 11C0;ADA1;1100 116F 11C0;
+ADA2;ADA2;1100 116F 11C1;ADA2;1100 116F 11C1;
+ADA3;ADA3;1100 116F 11C2;ADA3;1100 116F 11C2;
+ADA4;ADA4;1100 1170;ADA4;1100 1170;
+ADA5;ADA5;1100 1170 11A8;ADA5;1100 1170 11A8;
+ADA6;ADA6;1100 1170 11A9;ADA6;1100 1170 11A9;
+ADA7;ADA7;1100 1170 11AA;ADA7;1100 1170 11AA;
+ADA8;ADA8;1100 1170 11AB;ADA8;1100 1170 11AB;
+ADA9;ADA9;1100 1170 11AC;ADA9;1100 1170 11AC;
+ADAA;ADAA;1100 1170 11AD;ADAA;1100 1170 11AD;
+ADAB;ADAB;1100 1170 11AE;ADAB;1100 1170 11AE;
+ADAC;ADAC;1100 1170 11AF;ADAC;1100 1170 11AF;
+ADAD;ADAD;1100 1170 11B0;ADAD;1100 1170 11B0;
+ADAE;ADAE;1100 1170 11B1;ADAE;1100 1170 11B1;
+ADAF;ADAF;1100 1170 11B2;ADAF;1100 1170 11B2;
+ADB0;ADB0;1100 1170 11B3;ADB0;1100 1170 11B3;
+ADB1;ADB1;1100 1170 11B4;ADB1;1100 1170 11B4;
+ADB2;ADB2;1100 1170 11B5;ADB2;1100 1170 11B5;
+ADB3;ADB3;1100 1170 11B6;ADB3;1100 1170 11B6;
+ADB4;ADB4;1100 1170 11B7;ADB4;1100 1170 11B7;
+ADB5;ADB5;1100 1170 11B8;ADB5;1100 1170 11B8;
+ADB6;ADB6;1100 1170 11B9;ADB6;1100 1170 11B9;
+ADB7;ADB7;1100 1170 11BA;ADB7;1100 1170 11BA;
+ADB8;ADB8;1100 1170 11BB;ADB8;1100 1170 11BB;
+ADB9;ADB9;1100 1170 11BC;ADB9;1100 1170 11BC;
+ADBA;ADBA;1100 1170 11BD;ADBA;1100 1170 11BD;
+ADBB;ADBB;1100 1170 11BE;ADBB;1100 1170 11BE;
+ADBC;ADBC;1100 1170 11BF;ADBC;1100 1170 11BF;
+ADBD;ADBD;1100 1170 11C0;ADBD;1100 1170 11C0;
+ADBE;ADBE;1100 1170 11C1;ADBE;1100 1170 11C1;
+ADBF;ADBF;1100 1170 11C2;ADBF;1100 1170 11C2;
+ADC0;ADC0;1100 1171;ADC0;1100 1171;
+ADC1;ADC1;1100 1171 11A8;ADC1;1100 1171 11A8;
+ADC2;ADC2;1100 1171 11A9;ADC2;1100 1171 11A9;
+ADC3;ADC3;1100 1171 11AA;ADC3;1100 1171 11AA;
+ADC4;ADC4;1100 1171 11AB;ADC4;1100 1171 11AB;
+ADC5;ADC5;1100 1171 11AC;ADC5;1100 1171 11AC;
+ADC6;ADC6;1100 1171 11AD;ADC6;1100 1171 11AD;
+ADC7;ADC7;1100 1171 11AE;ADC7;1100 1171 11AE;
+ADC8;ADC8;1100 1171 11AF;ADC8;1100 1171 11AF;
+ADC9;ADC9;1100 1171 11B0;ADC9;1100 1171 11B0;
+ADCA;ADCA;1100 1171 11B1;ADCA;1100 1171 11B1;
+ADCB;ADCB;1100 1171 11B2;ADCB;1100 1171 11B2;
+ADCC;ADCC;1100 1171 11B3;ADCC;1100 1171 11B3;
+ADCD;ADCD;1100 1171 11B4;ADCD;1100 1171 11B4;
+ADCE;ADCE;1100 1171 11B5;ADCE;1100 1171 11B5;
+ADCF;ADCF;1100 1171 11B6;ADCF;1100 1171 11B6;
+ADD0;ADD0;1100 1171 11B7;ADD0;1100 1171 11B7;
+ADD1;ADD1;1100 1171 11B8;ADD1;1100 1171 11B8;
+ADD2;ADD2;1100 1171 11B9;ADD2;1100 1171 11B9;
+ADD3;ADD3;1100 1171 11BA;ADD3;1100 1171 11BA;
+ADD4;ADD4;1100 1171 11BB;ADD4;1100 1171 11BB;
+ADD5;ADD5;1100 1171 11BC;ADD5;1100 1171 11BC;
+ADD6;ADD6;1100 1171 11BD;ADD6;1100 1171 11BD;
+ADD7;ADD7;1100 1171 11BE;ADD7;1100 1171 11BE;
+ADD8;ADD8;1100 1171 11BF;ADD8;1100 1171 11BF;
+ADD9;ADD9;1100 1171 11C0;ADD9;1100 1171 11C0;
+ADDA;ADDA;1100 1171 11C1;ADDA;1100 1171 11C1;
+ADDB;ADDB;1100 1171 11C2;ADDB;1100 1171 11C2;
+ADDC;ADDC;1100 1172;ADDC;1100 1172;
+ADDD;ADDD;1100 1172 11A8;ADDD;1100 1172 11A8;
+ADDE;ADDE;1100 1172 11A9;ADDE;1100 1172 11A9;
+ADDF;ADDF;1100 1172 11AA;ADDF;1100 1172 11AA;
+ADE0;ADE0;1100 1172 11AB;ADE0;1100 1172 11AB;
+ADE1;ADE1;1100 1172 11AC;ADE1;1100 1172 11AC;
+ADE2;ADE2;1100 1172 11AD;ADE2;1100 1172 11AD;
+ADE3;ADE3;1100 1172 11AE;ADE3;1100 1172 11AE;
+ADE4;ADE4;1100 1172 11AF;ADE4;1100 1172 11AF;
+ADE5;ADE5;1100 1172 11B0;ADE5;1100 1172 11B0;
+ADE6;ADE6;1100 1172 11B1;ADE6;1100 1172 11B1;
+ADE7;ADE7;1100 1172 11B2;ADE7;1100 1172 11B2;
+ADE8;ADE8;1100 1172 11B3;ADE8;1100 1172 11B3;
+ADE9;ADE9;1100 1172 11B4;ADE9;1100 1172 11B4;
+ADEA;ADEA;1100 1172 11B5;ADEA;1100 1172 11B5;
+ADEB;ADEB;1100 1172 11B6;ADEB;1100 1172 11B6;
+ADEC;ADEC;1100 1172 11B7;ADEC;1100 1172 11B7;
+ADED;ADED;1100 1172 11B8;ADED;1100 1172 11B8;
+ADEE;ADEE;1100 1172 11B9;ADEE;1100 1172 11B9;
+ADEF;ADEF;1100 1172 11BA;ADEF;1100 1172 11BA;
+ADF0;ADF0;1100 1172 11BB;ADF0;1100 1172 11BB;
+ADF1;ADF1;1100 1172 11BC;ADF1;1100 1172 11BC;
+ADF2;ADF2;1100 1172 11BD;ADF2;1100 1172 11BD;
+ADF3;ADF3;1100 1172 11BE;ADF3;1100 1172 11BE;
+ADF4;ADF4;1100 1172 11BF;ADF4;1100 1172 11BF;
+ADF5;ADF5;1100 1172 11C0;ADF5;1100 1172 11C0;
+ADF6;ADF6;1100 1172 11C1;ADF6;1100 1172 11C1;
+ADF7;ADF7;1100 1172 11C2;ADF7;1100 1172 11C2;
+ADF8;ADF8;1100 1173;ADF8;1100 1173;
+ADF9;ADF9;1100 1173 11A8;ADF9;1100 1173 11A8;
+ADFA;ADFA;1100 1173 11A9;ADFA;1100 1173 11A9;
+ADFB;ADFB;1100 1173 11AA;ADFB;1100 1173 11AA;
+ADFC;ADFC;1100 1173 11AB;ADFC;1100 1173 11AB;
+ADFD;ADFD;1100 1173 11AC;ADFD;1100 1173 11AC;
+ADFE;ADFE;1100 1173 11AD;ADFE;1100 1173 11AD;
+ADFF;ADFF;1100 1173 11AE;ADFF;1100 1173 11AE;
+AE00;AE00;1100 1173 11AF;AE00;1100 1173 11AF;
+AE01;AE01;1100 1173 11B0;AE01;1100 1173 11B0;
+AE02;AE02;1100 1173 11B1;AE02;1100 1173 11B1;
+AE03;AE03;1100 1173 11B2;AE03;1100 1173 11B2;
+AE04;AE04;1100 1173 11B3;AE04;1100 1173 11B3;
+AE05;AE05;1100 1173 11B4;AE05;1100 1173 11B4;
+AE06;AE06;1100 1173 11B5;AE06;1100 1173 11B5;
+AE07;AE07;1100 1173 11B6;AE07;1100 1173 11B6;
+AE08;AE08;1100 1173 11B7;AE08;1100 1173 11B7;
+AE09;AE09;1100 1173 11B8;AE09;1100 1173 11B8;
+AE0A;AE0A;1100 1173 11B9;AE0A;1100 1173 11B9;
+AE0B;AE0B;1100 1173 11BA;AE0B;1100 1173 11BA;
+AE0C;AE0C;1100 1173 11BB;AE0C;1100 1173 11BB;
+AE0D;AE0D;1100 1173 11BC;AE0D;1100 1173 11BC;
+AE0E;AE0E;1100 1173 11BD;AE0E;1100 1173 11BD;
+AE0F;AE0F;1100 1173 11BE;AE0F;1100 1173 11BE;
+AE10;AE10;1100 1173 11BF;AE10;1100 1173 11BF;
+AE11;AE11;1100 1173 11C0;AE11;1100 1173 11C0;
+AE12;AE12;1100 1173 11C1;AE12;1100 1173 11C1;
+AE13;AE13;1100 1173 11C2;AE13;1100 1173 11C2;
+AE14;AE14;1100 1174;AE14;1100 1174;
+AE15;AE15;1100 1174 11A8;AE15;1100 1174 11A8;
+AE16;AE16;1100 1174 11A9;AE16;1100 1174 11A9;
+AE17;AE17;1100 1174 11AA;AE17;1100 1174 11AA;
+AE18;AE18;1100 1174 11AB;AE18;1100 1174 11AB;
+AE19;AE19;1100 1174 11AC;AE19;1100 1174 11AC;
+AE1A;AE1A;1100 1174 11AD;AE1A;1100 1174 11AD;
+AE1B;AE1B;1100 1174 11AE;AE1B;1100 1174 11AE;
+AE1C;AE1C;1100 1174 11AF;AE1C;1100 1174 11AF;
+AE1D;AE1D;1100 1174 11B0;AE1D;1100 1174 11B0;
+AE1E;AE1E;1100 1174 11B1;AE1E;1100 1174 11B1;
+AE1F;AE1F;1100 1174 11B2;AE1F;1100 1174 11B2;
+AE20;AE20;1100 1174 11B3;AE20;1100 1174 11B3;
+AE21;AE21;1100 1174 11B4;AE21;1100 1174 11B4;
+AE22;AE22;1100 1174 11B5;AE22;1100 1174 11B5;
+AE23;AE23;1100 1174 11B6;AE23;1100 1174 11B6;
+AE24;AE24;1100 1174 11B7;AE24;1100 1174 11B7;
+AE25;AE25;1100 1174 11B8;AE25;1100 1174 11B8;
+AE26;AE26;1100 1174 11B9;AE26;1100 1174 11B9;
+AE27;AE27;1100 1174 11BA;AE27;1100 1174 11BA;
+AE28;AE28;1100 1174 11BB;AE28;1100 1174 11BB;
+AE29;AE29;1100 1174 11BC;AE29;1100 1174 11BC;
+AE2A;AE2A;1100 1174 11BD;AE2A;1100 1174 11BD;
+AE2B;AE2B;1100 1174 11BE;AE2B;1100 1174 11BE;
+AE2C;AE2C;1100 1174 11BF;AE2C;1100 1174 11BF;
+AE2D;AE2D;1100 1174 11C0;AE2D;1100 1174 11C0;
+AE2E;AE2E;1100 1174 11C1;AE2E;1100 1174 11C1;
+AE2F;AE2F;1100 1174 11C2;AE2F;1100 1174 11C2;
+AE30;AE30;1100 1175;AE30;1100 1175;
+AE31;AE31;1100 1175 11A8;AE31;1100 1175 11A8;
+AE32;AE32;1100 1175 11A9;AE32;1100 1175 11A9;
+AE33;AE33;1100 1175 11AA;AE33;1100 1175 11AA;
+AE34;AE34;1100 1175 11AB;AE34;1100 1175 11AB;
+AE35;AE35;1100 1175 11AC;AE35;1100 1175 11AC;
+AE36;AE36;1100 1175 11AD;AE36;1100 1175 11AD;
+AE37;AE37;1100 1175 11AE;AE37;1100 1175 11AE;
+AE38;AE38;1100 1175 11AF;AE38;1100 1175 11AF;
+AE39;AE39;1100 1175 11B0;AE39;1100 1175 11B0;
+AE3A;AE3A;1100 1175 11B1;AE3A;1100 1175 11B1;
+AE3B;AE3B;1100 1175 11B2;AE3B;1100 1175 11B2;
+AE3C;AE3C;1100 1175 11B3;AE3C;1100 1175 11B3;
+AE3D;AE3D;1100 1175 11B4;AE3D;1100 1175 11B4;
+AE3E;AE3E;1100 1175 11B5;AE3E;1100 1175 11B5;
+AE3F;AE3F;1100 1175 11B6;AE3F;1100 1175 11B6;
+AE40;AE40;1100 1175 11B7;AE40;1100 1175 11B7;
+AE41;AE41;1100 1175 11B8;AE41;1100 1175 11B8;
+AE42;AE42;1100 1175 11B9;AE42;1100 1175 11B9;
+AE43;AE43;1100 1175 11BA;AE43;1100 1175 11BA;
+AE44;AE44;1100 1175 11BB;AE44;1100 1175 11BB;
+AE45;AE45;1100 1175 11BC;AE45;1100 1175 11BC;
+AE46;AE46;1100 1175 11BD;AE46;1100 1175 11BD;
+AE47;AE47;1100 1175 11BE;AE47;1100 1175 11BE;
+AE48;AE48;1100 1175 11BF;AE48;1100 1175 11BF;
+AE49;AE49;1100 1175 11C0;AE49;1100 1175 11C0;
+AE4A;AE4A;1100 1175 11C1;AE4A;1100 1175 11C1;
+AE4B;AE4B;1100 1175 11C2;AE4B;1100 1175 11C2;
+AE4C;AE4C;1101 1161;AE4C;1101 1161;
+AE4D;AE4D;1101 1161 11A8;AE4D;1101 1161 11A8;
+AE4E;AE4E;1101 1161 11A9;AE4E;1101 1161 11A9;
+AE4F;AE4F;1101 1161 11AA;AE4F;1101 1161 11AA;
+AE50;AE50;1101 1161 11AB;AE50;1101 1161 11AB;
+AE51;AE51;1101 1161 11AC;AE51;1101 1161 11AC;
+AE52;AE52;1101 1161 11AD;AE52;1101 1161 11AD;
+AE53;AE53;1101 1161 11AE;AE53;1101 1161 11AE;
+AE54;AE54;1101 1161 11AF;AE54;1101 1161 11AF;
+AE55;AE55;1101 1161 11B0;AE55;1101 1161 11B0;
+AE56;AE56;1101 1161 11B1;AE56;1101 1161 11B1;
+AE57;AE57;1101 1161 11B2;AE57;1101 1161 11B2;
+AE58;AE58;1101 1161 11B3;AE58;1101 1161 11B3;
+AE59;AE59;1101 1161 11B4;AE59;1101 1161 11B4;
+AE5A;AE5A;1101 1161 11B5;AE5A;1101 1161 11B5;
+AE5B;AE5B;1101 1161 11B6;AE5B;1101 1161 11B6;
+AE5C;AE5C;1101 1161 11B7;AE5C;1101 1161 11B7;
+AE5D;AE5D;1101 1161 11B8;AE5D;1101 1161 11B8;
+AE5E;AE5E;1101 1161 11B9;AE5E;1101 1161 11B9;
+AE5F;AE5F;1101 1161 11BA;AE5F;1101 1161 11BA;
+AE60;AE60;1101 1161 11BB;AE60;1101 1161 11BB;
+AE61;AE61;1101 1161 11BC;AE61;1101 1161 11BC;
+AE62;AE62;1101 1161 11BD;AE62;1101 1161 11BD;
+AE63;AE63;1101 1161 11BE;AE63;1101 1161 11BE;
+AE64;AE64;1101 1161 11BF;AE64;1101 1161 11BF;
+AE65;AE65;1101 1161 11C0;AE65;1101 1161 11C0;
+AE66;AE66;1101 1161 11C1;AE66;1101 1161 11C1;
+AE67;AE67;1101 1161 11C2;AE67;1101 1161 11C2;
+AE68;AE68;1101 1162;AE68;1101 1162;
+AE69;AE69;1101 1162 11A8;AE69;1101 1162 11A8;
+AE6A;AE6A;1101 1162 11A9;AE6A;1101 1162 11A9;
+AE6B;AE6B;1101 1162 11AA;AE6B;1101 1162 11AA;
+AE6C;AE6C;1101 1162 11AB;AE6C;1101 1162 11AB;
+AE6D;AE6D;1101 1162 11AC;AE6D;1101 1162 11AC;
+AE6E;AE6E;1101 1162 11AD;AE6E;1101 1162 11AD;
+AE6F;AE6F;1101 1162 11AE;AE6F;1101 1162 11AE;
+AE70;AE70;1101 1162 11AF;AE70;1101 1162 11AF;
+AE71;AE71;1101 1162 11B0;AE71;1101 1162 11B0;
+AE72;AE72;1101 1162 11B1;AE72;1101 1162 11B1;
+AE73;AE73;1101 1162 11B2;AE73;1101 1162 11B2;
+AE74;AE74;1101 1162 11B3;AE74;1101 1162 11B3;
+AE75;AE75;1101 1162 11B4;AE75;1101 1162 11B4;
+AE76;AE76;1101 1162 11B5;AE76;1101 1162 11B5;
+AE77;AE77;1101 1162 11B6;AE77;1101 1162 11B6;
+AE78;AE78;1101 1162 11B7;AE78;1101 1162 11B7;
+AE79;AE79;1101 1162 11B8;AE79;1101 1162 11B8;
+AE7A;AE7A;1101 1162 11B9;AE7A;1101 1162 11B9;
+AE7B;AE7B;1101 1162 11BA;AE7B;1101 1162 11BA;
+AE7C;AE7C;1101 1162 11BB;AE7C;1101 1162 11BB;
+AE7D;AE7D;1101 1162 11BC;AE7D;1101 1162 11BC;
+AE7E;AE7E;1101 1162 11BD;AE7E;1101 1162 11BD;
+AE7F;AE7F;1101 1162 11BE;AE7F;1101 1162 11BE;
+AE80;AE80;1101 1162 11BF;AE80;1101 1162 11BF;
+AE81;AE81;1101 1162 11C0;AE81;1101 1162 11C0;
+AE82;AE82;1101 1162 11C1;AE82;1101 1162 11C1;
+AE83;AE83;1101 1162 11C2;AE83;1101 1162 11C2;
+AE84;AE84;1101 1163;AE84;1101 1163;
+AE85;AE85;1101 1163 11A8;AE85;1101 1163 11A8;
+AE86;AE86;1101 1163 11A9;AE86;1101 1163 11A9;
+AE87;AE87;1101 1163 11AA;AE87;1101 1163 11AA;
+AE88;AE88;1101 1163 11AB;AE88;1101 1163 11AB;
+AE89;AE89;1101 1163 11AC;AE89;1101 1163 11AC;
+AE8A;AE8A;1101 1163 11AD;AE8A;1101 1163 11AD;
+AE8B;AE8B;1101 1163 11AE;AE8B;1101 1163 11AE;
+AE8C;AE8C;1101 1163 11AF;AE8C;1101 1163 11AF;
+AE8D;AE8D;1101 1163 11B0;AE8D;1101 1163 11B0;
+AE8E;AE8E;1101 1163 11B1;AE8E;1101 1163 11B1;
+AE8F;AE8F;1101 1163 11B2;AE8F;1101 1163 11B2;
+AE90;AE90;1101 1163 11B3;AE90;1101 1163 11B3;
+AE91;AE91;1101 1163 11B4;AE91;1101 1163 11B4;
+AE92;AE92;1101 1163 11B5;AE92;1101 1163 11B5;
+AE93;AE93;1101 1163 11B6;AE93;1101 1163 11B6;
+AE94;AE94;1101 1163 11B7;AE94;1101 1163 11B7;
+AE95;AE95;1101 1163 11B8;AE95;1101 1163 11B8;
+AE96;AE96;1101 1163 11B9;AE96;1101 1163 11B9;
+AE97;AE97;1101 1163 11BA;AE97;1101 1163 11BA;
+AE98;AE98;1101 1163 11BB;AE98;1101 1163 11BB;
+AE99;AE99;1101 1163 11BC;AE99;1101 1163 11BC;
+AE9A;AE9A;1101 1163 11BD;AE9A;1101 1163 11BD;
+AE9B;AE9B;1101 1163 11BE;AE9B;1101 1163 11BE;
+AE9C;AE9C;1101 1163 11BF;AE9C;1101 1163 11BF;
+AE9D;AE9D;1101 1163 11C0;AE9D;1101 1163 11C0;
+AE9E;AE9E;1101 1163 11C1;AE9E;1101 1163 11C1;
+AE9F;AE9F;1101 1163 11C2;AE9F;1101 1163 11C2;
+AEA0;AEA0;1101 1164;AEA0;1101 1164;
+AEA1;AEA1;1101 1164 11A8;AEA1;1101 1164 11A8;
+AEA2;AEA2;1101 1164 11A9;AEA2;1101 1164 11A9;
+AEA3;AEA3;1101 1164 11AA;AEA3;1101 1164 11AA;
+AEA4;AEA4;1101 1164 11AB;AEA4;1101 1164 11AB;
+AEA5;AEA5;1101 1164 11AC;AEA5;1101 1164 11AC;
+AEA6;AEA6;1101 1164 11AD;AEA6;1101 1164 11AD;
+AEA7;AEA7;1101 1164 11AE;AEA7;1101 1164 11AE;
+AEA8;AEA8;1101 1164 11AF;AEA8;1101 1164 11AF;
+AEA9;AEA9;1101 1164 11B0;AEA9;1101 1164 11B0;
+AEAA;AEAA;1101 1164 11B1;AEAA;1101 1164 11B1;
+AEAB;AEAB;1101 1164 11B2;AEAB;1101 1164 11B2;
+AEAC;AEAC;1101 1164 11B3;AEAC;1101 1164 11B3;
+AEAD;AEAD;1101 1164 11B4;AEAD;1101 1164 11B4;
+AEAE;AEAE;1101 1164 11B5;AEAE;1101 1164 11B5;
+AEAF;AEAF;1101 1164 11B6;AEAF;1101 1164 11B6;
+AEB0;AEB0;1101 1164 11B7;AEB0;1101 1164 11B7;
+AEB1;AEB1;1101 1164 11B8;AEB1;1101 1164 11B8;
+AEB2;AEB2;1101 1164 11B9;AEB2;1101 1164 11B9;
+AEB3;AEB3;1101 1164 11BA;AEB3;1101 1164 11BA;
+AEB4;AEB4;1101 1164 11BB;AEB4;1101 1164 11BB;
+AEB5;AEB5;1101 1164 11BC;AEB5;1101 1164 11BC;
+AEB6;AEB6;1101 1164 11BD;AEB6;1101 1164 11BD;
+AEB7;AEB7;1101 1164 11BE;AEB7;1101 1164 11BE;
+AEB8;AEB8;1101 1164 11BF;AEB8;1101 1164 11BF;
+AEB9;AEB9;1101 1164 11C0;AEB9;1101 1164 11C0;
+AEBA;AEBA;1101 1164 11C1;AEBA;1101 1164 11C1;
+AEBB;AEBB;1101 1164 11C2;AEBB;1101 1164 11C2;
+AEBC;AEBC;1101 1165;AEBC;1101 1165;
+AEBD;AEBD;1101 1165 11A8;AEBD;1101 1165 11A8;
+AEBE;AEBE;1101 1165 11A9;AEBE;1101 1165 11A9;
+AEBF;AEBF;1101 1165 11AA;AEBF;1101 1165 11AA;
+AEC0;AEC0;1101 1165 11AB;AEC0;1101 1165 11AB;
+AEC1;AEC1;1101 1165 11AC;AEC1;1101 1165 11AC;
+AEC2;AEC2;1101 1165 11AD;AEC2;1101 1165 11AD;
+AEC3;AEC3;1101 1165 11AE;AEC3;1101 1165 11AE;
+AEC4;AEC4;1101 1165 11AF;AEC4;1101 1165 11AF;
+AEC5;AEC5;1101 1165 11B0;AEC5;1101 1165 11B0;
+AEC6;AEC6;1101 1165 11B1;AEC6;1101 1165 11B1;
+AEC7;AEC7;1101 1165 11B2;AEC7;1101 1165 11B2;
+AEC8;AEC8;1101 1165 11B3;AEC8;1101 1165 11B3;
+AEC9;AEC9;1101 1165 11B4;AEC9;1101 1165 11B4;
+AECA;AECA;1101 1165 11B5;AECA;1101 1165 11B5;
+AECB;AECB;1101 1165 11B6;AECB;1101 1165 11B6;
+AECC;AECC;1101 1165 11B7;AECC;1101 1165 11B7;
+AECD;AECD;1101 1165 11B8;AECD;1101 1165 11B8;
+AECE;AECE;1101 1165 11B9;AECE;1101 1165 11B9;
+AECF;AECF;1101 1165 11BA;AECF;1101 1165 11BA;
+AED0;AED0;1101 1165 11BB;AED0;1101 1165 11BB;
+AED1;AED1;1101 1165 11BC;AED1;1101 1165 11BC;
+AED2;AED2;1101 1165 11BD;AED2;1101 1165 11BD;
+AED3;AED3;1101 1165 11BE;AED3;1101 1165 11BE;
+AED4;AED4;1101 1165 11BF;AED4;1101 1165 11BF;
+AED5;AED5;1101 1165 11C0;AED5;1101 1165 11C0;
+AED6;AED6;1101 1165 11C1;AED6;1101 1165 11C1;
+AED7;AED7;1101 1165 11C2;AED7;1101 1165 11C2;
+AED8;AED8;1101 1166;AED8;1101 1166;
+AED9;AED9;1101 1166 11A8;AED9;1101 1166 11A8;
+AEDA;AEDA;1101 1166 11A9;AEDA;1101 1166 11A9;
+AEDB;AEDB;1101 1166 11AA;AEDB;1101 1166 11AA;
+AEDC;AEDC;1101 1166 11AB;AEDC;1101 1166 11AB;
+AEDD;AEDD;1101 1166 11AC;AEDD;1101 1166 11AC;
+AEDE;AEDE;1101 1166 11AD;AEDE;1101 1166 11AD;
+AEDF;AEDF;1101 1166 11AE;AEDF;1101 1166 11AE;
+AEE0;AEE0;1101 1166 11AF;AEE0;1101 1166 11AF;
+AEE1;AEE1;1101 1166 11B0;AEE1;1101 1166 11B0;
+AEE2;AEE2;1101 1166 11B1;AEE2;1101 1166 11B1;
+AEE3;AEE3;1101 1166 11B2;AEE3;1101 1166 11B2;
+AEE4;AEE4;1101 1166 11B3;AEE4;1101 1166 11B3;
+AEE5;AEE5;1101 1166 11B4;AEE5;1101 1166 11B4;
+AEE6;AEE6;1101 1166 11B5;AEE6;1101 1166 11B5;
+AEE7;AEE7;1101 1166 11B6;AEE7;1101 1166 11B6;
+AEE8;AEE8;1101 1166 11B7;AEE8;1101 1166 11B7;
+AEE9;AEE9;1101 1166 11B8;AEE9;1101 1166 11B8;
+AEEA;AEEA;1101 1166 11B9;AEEA;1101 1166 11B9;
+AEEB;AEEB;1101 1166 11BA;AEEB;1101 1166 11BA;
+AEEC;AEEC;1101 1166 11BB;AEEC;1101 1166 11BB;
+AEED;AEED;1101 1166 11BC;AEED;1101 1166 11BC;
+AEEE;AEEE;1101 1166 11BD;AEEE;1101 1166 11BD;
+AEEF;AEEF;1101 1166 11BE;AEEF;1101 1166 11BE;
+AEF0;AEF0;1101 1166 11BF;AEF0;1101 1166 11BF;
+AEF1;AEF1;1101 1166 11C0;AEF1;1101 1166 11C0;
+AEF2;AEF2;1101 1166 11C1;AEF2;1101 1166 11C1;
+AEF3;AEF3;1101 1166 11C2;AEF3;1101 1166 11C2;
+AEF4;AEF4;1101 1167;AEF4;1101 1167;
+AEF5;AEF5;1101 1167 11A8;AEF5;1101 1167 11A8;
+AEF6;AEF6;1101 1167 11A9;AEF6;1101 1167 11A9;
+AEF7;AEF7;1101 1167 11AA;AEF7;1101 1167 11AA;
+AEF8;AEF8;1101 1167 11AB;AEF8;1101 1167 11AB;
+AEF9;AEF9;1101 1167 11AC;AEF9;1101 1167 11AC;
+AEFA;AEFA;1101 1167 11AD;AEFA;1101 1167 11AD;
+AEFB;AEFB;1101 1167 11AE;AEFB;1101 1167 11AE;
+AEFC;AEFC;1101 1167 11AF;AEFC;1101 1167 11AF;
+AEFD;AEFD;1101 1167 11B0;AEFD;1101 1167 11B0;
+AEFE;AEFE;1101 1167 11B1;AEFE;1101 1167 11B1;
+AEFF;AEFF;1101 1167 11B2;AEFF;1101 1167 11B2;
+AF00;AF00;1101 1167 11B3;AF00;1101 1167 11B3;
+AF01;AF01;1101 1167 11B4;AF01;1101 1167 11B4;
+AF02;AF02;1101 1167 11B5;AF02;1101 1167 11B5;
+AF03;AF03;1101 1167 11B6;AF03;1101 1167 11B6;
+AF04;AF04;1101 1167 11B7;AF04;1101 1167 11B7;
+AF05;AF05;1101 1167 11B8;AF05;1101 1167 11B8;
+AF06;AF06;1101 1167 11B9;AF06;1101 1167 11B9;
+AF07;AF07;1101 1167 11BA;AF07;1101 1167 11BA;
+AF08;AF08;1101 1167 11BB;AF08;1101 1167 11BB;
+AF09;AF09;1101 1167 11BC;AF09;1101 1167 11BC;
+AF0A;AF0A;1101 1167 11BD;AF0A;1101 1167 11BD;
+AF0B;AF0B;1101 1167 11BE;AF0B;1101 1167 11BE;
+AF0C;AF0C;1101 1167 11BF;AF0C;1101 1167 11BF;
+AF0D;AF0D;1101 1167 11C0;AF0D;1101 1167 11C0;
+AF0E;AF0E;1101 1167 11C1;AF0E;1101 1167 11C1;
+AF0F;AF0F;1101 1167 11C2;AF0F;1101 1167 11C2;
+AF10;AF10;1101 1168;AF10;1101 1168;
+AF11;AF11;1101 1168 11A8;AF11;1101 1168 11A8;
+AF12;AF12;1101 1168 11A9;AF12;1101 1168 11A9;
+AF13;AF13;1101 1168 11AA;AF13;1101 1168 11AA;
+AF14;AF14;1101 1168 11AB;AF14;1101 1168 11AB;
+AF15;AF15;1101 1168 11AC;AF15;1101 1168 11AC;
+AF16;AF16;1101 1168 11AD;AF16;1101 1168 11AD;
+AF17;AF17;1101 1168 11AE;AF17;1101 1168 11AE;
+AF18;AF18;1101 1168 11AF;AF18;1101 1168 11AF;
+AF19;AF19;1101 1168 11B0;AF19;1101 1168 11B0;
+AF1A;AF1A;1101 1168 11B1;AF1A;1101 1168 11B1;
+AF1B;AF1B;1101 1168 11B2;AF1B;1101 1168 11B2;
+AF1C;AF1C;1101 1168 11B3;AF1C;1101 1168 11B3;
+AF1D;AF1D;1101 1168 11B4;AF1D;1101 1168 11B4;
+AF1E;AF1E;1101 1168 11B5;AF1E;1101 1168 11B5;
+AF1F;AF1F;1101 1168 11B6;AF1F;1101 1168 11B6;
+AF20;AF20;1101 1168 11B7;AF20;1101 1168 11B7;
+AF21;AF21;1101 1168 11B8;AF21;1101 1168 11B8;
+AF22;AF22;1101 1168 11B9;AF22;1101 1168 11B9;
+AF23;AF23;1101 1168 11BA;AF23;1101 1168 11BA;
+AF24;AF24;1101 1168 11BB;AF24;1101 1168 11BB;
+AF25;AF25;1101 1168 11BC;AF25;1101 1168 11BC;
+AF26;AF26;1101 1168 11BD;AF26;1101 1168 11BD;
+AF27;AF27;1101 1168 11BE;AF27;1101 1168 11BE;
+AF28;AF28;1101 1168 11BF;AF28;1101 1168 11BF;
+AF29;AF29;1101 1168 11C0;AF29;1101 1168 11C0;
+AF2A;AF2A;1101 1168 11C1;AF2A;1101 1168 11C1;
+AF2B;AF2B;1101 1168 11C2;AF2B;1101 1168 11C2;
+AF2C;AF2C;1101 1169;AF2C;1101 1169;
+AF2D;AF2D;1101 1169 11A8;AF2D;1101 1169 11A8;
+AF2E;AF2E;1101 1169 11A9;AF2E;1101 1169 11A9;
+AF2F;AF2F;1101 1169 11AA;AF2F;1101 1169 11AA;
+AF30;AF30;1101 1169 11AB;AF30;1101 1169 11AB;
+AF31;AF31;1101 1169 11AC;AF31;1101 1169 11AC;
+AF32;AF32;1101 1169 11AD;AF32;1101 1169 11AD;
+AF33;AF33;1101 1169 11AE;AF33;1101 1169 11AE;
+AF34;AF34;1101 1169 11AF;AF34;1101 1169 11AF;
+AF35;AF35;1101 1169 11B0;AF35;1101 1169 11B0;
+AF36;AF36;1101 1169 11B1;AF36;1101 1169 11B1;
+AF37;AF37;1101 1169 11B2;AF37;1101 1169 11B2;
+AF38;AF38;1101 1169 11B3;AF38;1101 1169 11B3;
+AF39;AF39;1101 1169 11B4;AF39;1101 1169 11B4;
+AF3A;AF3A;1101 1169 11B5;AF3A;1101 1169 11B5;
+AF3B;AF3B;1101 1169 11B6;AF3B;1101 1169 11B6;
+AF3C;AF3C;1101 1169 11B7;AF3C;1101 1169 11B7;
+AF3D;AF3D;1101 1169 11B8;AF3D;1101 1169 11B8;
+AF3E;AF3E;1101 1169 11B9;AF3E;1101 1169 11B9;
+AF3F;AF3F;1101 1169 11BA;AF3F;1101 1169 11BA;
+AF40;AF40;1101 1169 11BB;AF40;1101 1169 11BB;
+AF41;AF41;1101 1169 11BC;AF41;1101 1169 11BC;
+AF42;AF42;1101 1169 11BD;AF42;1101 1169 11BD;
+AF43;AF43;1101 1169 11BE;AF43;1101 1169 11BE;
+AF44;AF44;1101 1169 11BF;AF44;1101 1169 11BF;
+AF45;AF45;1101 1169 11C0;AF45;1101 1169 11C0;
+AF46;AF46;1101 1169 11C1;AF46;1101 1169 11C1;
+AF47;AF47;1101 1169 11C2;AF47;1101 1169 11C2;
+AF48;AF48;1101 116A;AF48;1101 116A;
+AF49;AF49;1101 116A 11A8;AF49;1101 116A 11A8;
+AF4A;AF4A;1101 116A 11A9;AF4A;1101 116A 11A9;
+AF4B;AF4B;1101 116A 11AA;AF4B;1101 116A 11AA;
+AF4C;AF4C;1101 116A 11AB;AF4C;1101 116A 11AB;
+AF4D;AF4D;1101 116A 11AC;AF4D;1101 116A 11AC;
+AF4E;AF4E;1101 116A 11AD;AF4E;1101 116A 11AD;
+AF4F;AF4F;1101 116A 11AE;AF4F;1101 116A 11AE;
+AF50;AF50;1101 116A 11AF;AF50;1101 116A 11AF;
+AF51;AF51;1101 116A 11B0;AF51;1101 116A 11B0;
+AF52;AF52;1101 116A 11B1;AF52;1101 116A 11B1;
+AF53;AF53;1101 116A 11B2;AF53;1101 116A 11B2;
+AF54;AF54;1101 116A 11B3;AF54;1101 116A 11B3;
+AF55;AF55;1101 116A 11B4;AF55;1101 116A 11B4;
+AF56;AF56;1101 116A 11B5;AF56;1101 116A 11B5;
+AF57;AF57;1101 116A 11B6;AF57;1101 116A 11B6;
+AF58;AF58;1101 116A 11B7;AF58;1101 116A 11B7;
+AF59;AF59;1101 116A 11B8;AF59;1101 116A 11B8;
+AF5A;AF5A;1101 116A 11B9;AF5A;1101 116A 11B9;
+AF5B;AF5B;1101 116A 11BA;AF5B;1101 116A 11BA;
+AF5C;AF5C;1101 116A 11BB;AF5C;1101 116A 11BB;
+AF5D;AF5D;1101 116A 11BC;AF5D;1101 116A 11BC;
+AF5E;AF5E;1101 116A 11BD;AF5E;1101 116A 11BD;
+AF5F;AF5F;1101 116A 11BE;AF5F;1101 116A 11BE;
+AF60;AF60;1101 116A 11BF;AF60;1101 116A 11BF;
+AF61;AF61;1101 116A 11C0;AF61;1101 116A 11C0;
+AF62;AF62;1101 116A 11C1;AF62;1101 116A 11C1;
+AF63;AF63;1101 116A 11C2;AF63;1101 116A 11C2;
+AF64;AF64;1101 116B;AF64;1101 116B;
+AF65;AF65;1101 116B 11A8;AF65;1101 116B 11A8;
+AF66;AF66;1101 116B 11A9;AF66;1101 116B 11A9;
+AF67;AF67;1101 116B 11AA;AF67;1101 116B 11AA;
+AF68;AF68;1101 116B 11AB;AF68;1101 116B 11AB;
+AF69;AF69;1101 116B 11AC;AF69;1101 116B 11AC;
+AF6A;AF6A;1101 116B 11AD;AF6A;1101 116B 11AD;
+AF6B;AF6B;1101 116B 11AE;AF6B;1101 116B 11AE;
+AF6C;AF6C;1101 116B 11AF;AF6C;1101 116B 11AF;
+AF6D;AF6D;1101 116B 11B0;AF6D;1101 116B 11B0;
+AF6E;AF6E;1101 116B 11B1;AF6E;1101 116B 11B1;
+AF6F;AF6F;1101 116B 11B2;AF6F;1101 116B 11B2;
+AF70;AF70;1101 116B 11B3;AF70;1101 116B 11B3;
+AF71;AF71;1101 116B 11B4;AF71;1101 116B 11B4;
+AF72;AF72;1101 116B 11B5;AF72;1101 116B 11B5;
+AF73;AF73;1101 116B 11B6;AF73;1101 116B 11B6;
+AF74;AF74;1101 116B 11B7;AF74;1101 116B 11B7;
+AF75;AF75;1101 116B 11B8;AF75;1101 116B 11B8;
+AF76;AF76;1101 116B 11B9;AF76;1101 116B 11B9;
+AF77;AF77;1101 116B 11BA;AF77;1101 116B 11BA;
+AF78;AF78;1101 116B 11BB;AF78;1101 116B 11BB;
+AF79;AF79;1101 116B 11BC;AF79;1101 116B 11BC;
+AF7A;AF7A;1101 116B 11BD;AF7A;1101 116B 11BD;
+AF7B;AF7B;1101 116B 11BE;AF7B;1101 116B 11BE;
+AF7C;AF7C;1101 116B 11BF;AF7C;1101 116B 11BF;
+AF7D;AF7D;1101 116B 11C0;AF7D;1101 116B 11C0;
+AF7E;AF7E;1101 116B 11C1;AF7E;1101 116B 11C1;
+AF7F;AF7F;1101 116B 11C2;AF7F;1101 116B 11C2;
+AF80;AF80;1101 116C;AF80;1101 116C;
+AF81;AF81;1101 116C 11A8;AF81;1101 116C 11A8;
+AF82;AF82;1101 116C 11A9;AF82;1101 116C 11A9;
+AF83;AF83;1101 116C 11AA;AF83;1101 116C 11AA;
+AF84;AF84;1101 116C 11AB;AF84;1101 116C 11AB;
+AF85;AF85;1101 116C 11AC;AF85;1101 116C 11AC;
+AF86;AF86;1101 116C 11AD;AF86;1101 116C 11AD;
+AF87;AF87;1101 116C 11AE;AF87;1101 116C 11AE;
+AF88;AF88;1101 116C 11AF;AF88;1101 116C 11AF;
+AF89;AF89;1101 116C 11B0;AF89;1101 116C 11B0;
+AF8A;AF8A;1101 116C 11B1;AF8A;1101 116C 11B1;
+AF8B;AF8B;1101 116C 11B2;AF8B;1101 116C 11B2;
+AF8C;AF8C;1101 116C 11B3;AF8C;1101 116C 11B3;
+AF8D;AF8D;1101 116C 11B4;AF8D;1101 116C 11B4;
+AF8E;AF8E;1101 116C 11B5;AF8E;1101 116C 11B5;
+AF8F;AF8F;1101 116C 11B6;AF8F;1101 116C 11B6;
+AF90;AF90;1101 116C 11B7;AF90;1101 116C 11B7;
+AF91;AF91;1101 116C 11B8;AF91;1101 116C 11B8;
+AF92;AF92;1101 116C 11B9;AF92;1101 116C 11B9;
+AF93;AF93;1101 116C 11BA;AF93;1101 116C 11BA;
+AF94;AF94;1101 116C 11BB;AF94;1101 116C 11BB;
+AF95;AF95;1101 116C 11BC;AF95;1101 116C 11BC;
+AF96;AF96;1101 116C 11BD;AF96;1101 116C 11BD;
+AF97;AF97;1101 116C 11BE;AF97;1101 116C 11BE;
+AF98;AF98;1101 116C 11BF;AF98;1101 116C 11BF;
+AF99;AF99;1101 116C 11C0;AF99;1101 116C 11C0;
+AF9A;AF9A;1101 116C 11C1;AF9A;1101 116C 11C1;
+AF9B;AF9B;1101 116C 11C2;AF9B;1101 116C 11C2;
+AF9C;AF9C;1101 116D;AF9C;1101 116D;
+AF9D;AF9D;1101 116D 11A8;AF9D;1101 116D 11A8;
+AF9E;AF9E;1101 116D 11A9;AF9E;1101 116D 11A9;
+AF9F;AF9F;1101 116D 11AA;AF9F;1101 116D 11AA;
+AFA0;AFA0;1101 116D 11AB;AFA0;1101 116D 11AB;
+AFA1;AFA1;1101 116D 11AC;AFA1;1101 116D 11AC;
+AFA2;AFA2;1101 116D 11AD;AFA2;1101 116D 11AD;
+AFA3;AFA3;1101 116D 11AE;AFA3;1101 116D 11AE;
+AFA4;AFA4;1101 116D 11AF;AFA4;1101 116D 11AF;
+AFA5;AFA5;1101 116D 11B0;AFA5;1101 116D 11B0;
+AFA6;AFA6;1101 116D 11B1;AFA6;1101 116D 11B1;
+AFA7;AFA7;1101 116D 11B2;AFA7;1101 116D 11B2;
+AFA8;AFA8;1101 116D 11B3;AFA8;1101 116D 11B3;
+AFA9;AFA9;1101 116D 11B4;AFA9;1101 116D 11B4;
+AFAA;AFAA;1101 116D 11B5;AFAA;1101 116D 11B5;
+AFAB;AFAB;1101 116D 11B6;AFAB;1101 116D 11B6;
+AFAC;AFAC;1101 116D 11B7;AFAC;1101 116D 11B7;
+AFAD;AFAD;1101 116D 11B8;AFAD;1101 116D 11B8;
+AFAE;AFAE;1101 116D 11B9;AFAE;1101 116D 11B9;
+AFAF;AFAF;1101 116D 11BA;AFAF;1101 116D 11BA;
+AFB0;AFB0;1101 116D 11BB;AFB0;1101 116D 11BB;
+AFB1;AFB1;1101 116D 11BC;AFB1;1101 116D 11BC;
+AFB2;AFB2;1101 116D 11BD;AFB2;1101 116D 11BD;
+AFB3;AFB3;1101 116D 11BE;AFB3;1101 116D 11BE;
+AFB4;AFB4;1101 116D 11BF;AFB4;1101 116D 11BF;
+AFB5;AFB5;1101 116D 11C0;AFB5;1101 116D 11C0;
+AFB6;AFB6;1101 116D 11C1;AFB6;1101 116D 11C1;
+AFB7;AFB7;1101 116D 11C2;AFB7;1101 116D 11C2;
+AFB8;AFB8;1101 116E;AFB8;1101 116E;
+AFB9;AFB9;1101 116E 11A8;AFB9;1101 116E 11A8;
+AFBA;AFBA;1101 116E 11A9;AFBA;1101 116E 11A9;
+AFBB;AFBB;1101 116E 11AA;AFBB;1101 116E 11AA;
+AFBC;AFBC;1101 116E 11AB;AFBC;1101 116E 11AB;
+AFBD;AFBD;1101 116E 11AC;AFBD;1101 116E 11AC;
+AFBE;AFBE;1101 116E 11AD;AFBE;1101 116E 11AD;
+AFBF;AFBF;1101 116E 11AE;AFBF;1101 116E 11AE;
+AFC0;AFC0;1101 116E 11AF;AFC0;1101 116E 11AF;
+AFC1;AFC1;1101 116E 11B0;AFC1;1101 116E 11B0;
+AFC2;AFC2;1101 116E 11B1;AFC2;1101 116E 11B1;
+AFC3;AFC3;1101 116E 11B2;AFC3;1101 116E 11B2;
+AFC4;AFC4;1101 116E 11B3;AFC4;1101 116E 11B3;
+AFC5;AFC5;1101 116E 11B4;AFC5;1101 116E 11B4;
+AFC6;AFC6;1101 116E 11B5;AFC6;1101 116E 11B5;
+AFC7;AFC7;1101 116E 11B6;AFC7;1101 116E 11B6;
+AFC8;AFC8;1101 116E 11B7;AFC8;1101 116E 11B7;
+AFC9;AFC9;1101 116E 11B8;AFC9;1101 116E 11B8;
+AFCA;AFCA;1101 116E 11B9;AFCA;1101 116E 11B9;
+AFCB;AFCB;1101 116E 11BA;AFCB;1101 116E 11BA;
+AFCC;AFCC;1101 116E 11BB;AFCC;1101 116E 11BB;
+AFCD;AFCD;1101 116E 11BC;AFCD;1101 116E 11BC;
+AFCE;AFCE;1101 116E 11BD;AFCE;1101 116E 11BD;
+AFCF;AFCF;1101 116E 11BE;AFCF;1101 116E 11BE;
+AFD0;AFD0;1101 116E 11BF;AFD0;1101 116E 11BF;
+AFD1;AFD1;1101 116E 11C0;AFD1;1101 116E 11C0;
+AFD2;AFD2;1101 116E 11C1;AFD2;1101 116E 11C1;
+AFD3;AFD3;1101 116E 11C2;AFD3;1101 116E 11C2;
+AFD4;AFD4;1101 116F;AFD4;1101 116F;
+AFD5;AFD5;1101 116F 11A8;AFD5;1101 116F 11A8;
+AFD6;AFD6;1101 116F 11A9;AFD6;1101 116F 11A9;
+AFD7;AFD7;1101 116F 11AA;AFD7;1101 116F 11AA;
+AFD8;AFD8;1101 116F 11AB;AFD8;1101 116F 11AB;
+AFD9;AFD9;1101 116F 11AC;AFD9;1101 116F 11AC;
+AFDA;AFDA;1101 116F 11AD;AFDA;1101 116F 11AD;
+AFDB;AFDB;1101 116F 11AE;AFDB;1101 116F 11AE;
+AFDC;AFDC;1101 116F 11AF;AFDC;1101 116F 11AF;
+AFDD;AFDD;1101 116F 11B0;AFDD;1101 116F 11B0;
+AFDE;AFDE;1101 116F 11B1;AFDE;1101 116F 11B1;
+AFDF;AFDF;1101 116F 11B2;AFDF;1101 116F 11B2;
+AFE0;AFE0;1101 116F 11B3;AFE0;1101 116F 11B3;
+AFE1;AFE1;1101 116F 11B4;AFE1;1101 116F 11B4;
+AFE2;AFE2;1101 116F 11B5;AFE2;1101 116F 11B5;
+AFE3;AFE3;1101 116F 11B6;AFE3;1101 116F 11B6;
+AFE4;AFE4;1101 116F 11B7;AFE4;1101 116F 11B7;
+AFE5;AFE5;1101 116F 11B8;AFE5;1101 116F 11B8;
+AFE6;AFE6;1101 116F 11B9;AFE6;1101 116F 11B9;
+AFE7;AFE7;1101 116F 11BA;AFE7;1101 116F 11BA;
+AFE8;AFE8;1101 116F 11BB;AFE8;1101 116F 11BB;
+AFE9;AFE9;1101 116F 11BC;AFE9;1101 116F 11BC;
+AFEA;AFEA;1101 116F 11BD;AFEA;1101 116F 11BD;
+AFEB;AFEB;1101 116F 11BE;AFEB;1101 116F 11BE;
+AFEC;AFEC;1101 116F 11BF;AFEC;1101 116F 11BF;
+AFED;AFED;1101 116F 11C0;AFED;1101 116F 11C0;
+AFEE;AFEE;1101 116F 11C1;AFEE;1101 116F 11C1;
+AFEF;AFEF;1101 116F 11C2;AFEF;1101 116F 11C2;
+AFF0;AFF0;1101 1170;AFF0;1101 1170;
+AFF1;AFF1;1101 1170 11A8;AFF1;1101 1170 11A8;
+AFF2;AFF2;1101 1170 11A9;AFF2;1101 1170 11A9;
+AFF3;AFF3;1101 1170 11AA;AFF3;1101 1170 11AA;
+AFF4;AFF4;1101 1170 11AB;AFF4;1101 1170 11AB;
+AFF5;AFF5;1101 1170 11AC;AFF5;1101 1170 11AC;
+AFF6;AFF6;1101 1170 11AD;AFF6;1101 1170 11AD;
+AFF7;AFF7;1101 1170 11AE;AFF7;1101 1170 11AE;
+AFF8;AFF8;1101 1170 11AF;AFF8;1101 1170 11AF;
+AFF9;AFF9;1101 1170 11B0;AFF9;1101 1170 11B0;
+AFFA;AFFA;1101 1170 11B1;AFFA;1101 1170 11B1;
+AFFB;AFFB;1101 1170 11B2;AFFB;1101 1170 11B2;
+AFFC;AFFC;1101 1170 11B3;AFFC;1101 1170 11B3;
+AFFD;AFFD;1101 1170 11B4;AFFD;1101 1170 11B4;
+AFFE;AFFE;1101 1170 11B5;AFFE;1101 1170 11B5;
+AFFF;AFFF;1101 1170 11B6;AFFF;1101 1170 11B6;
+B000;B000;1101 1170 11B7;B000;1101 1170 11B7;
+B001;B001;1101 1170 11B8;B001;1101 1170 11B8;
+B002;B002;1101 1170 11B9;B002;1101 1170 11B9;
+B003;B003;1101 1170 11BA;B003;1101 1170 11BA;
+B004;B004;1101 1170 11BB;B004;1101 1170 11BB;
+B005;B005;1101 1170 11BC;B005;1101 1170 11BC;
+B006;B006;1101 1170 11BD;B006;1101 1170 11BD;
+B007;B007;1101 1170 11BE;B007;1101 1170 11BE;
+B008;B008;1101 1170 11BF;B008;1101 1170 11BF;
+B009;B009;1101 1170 11C0;B009;1101 1170 11C0;
+B00A;B00A;1101 1170 11C1;B00A;1101 1170 11C1;
+B00B;B00B;1101 1170 11C2;B00B;1101 1170 11C2;
+B00C;B00C;1101 1171;B00C;1101 1171;
+B00D;B00D;1101 1171 11A8;B00D;1101 1171 11A8;
+B00E;B00E;1101 1171 11A9;B00E;1101 1171 11A9;
+B00F;B00F;1101 1171 11AA;B00F;1101 1171 11AA;
+B010;B010;1101 1171 11AB;B010;1101 1171 11AB;
+B011;B011;1101 1171 11AC;B011;1101 1171 11AC;
+B012;B012;1101 1171 11AD;B012;1101 1171 11AD;
+B013;B013;1101 1171 11AE;B013;1101 1171 11AE;
+B014;B014;1101 1171 11AF;B014;1101 1171 11AF;
+B015;B015;1101 1171 11B0;B015;1101 1171 11B0;
+B016;B016;1101 1171 11B1;B016;1101 1171 11B1;
+B017;B017;1101 1171 11B2;B017;1101 1171 11B2;
+B018;B018;1101 1171 11B3;B018;1101 1171 11B3;
+B019;B019;1101 1171 11B4;B019;1101 1171 11B4;
+B01A;B01A;1101 1171 11B5;B01A;1101 1171 11B5;
+B01B;B01B;1101 1171 11B6;B01B;1101 1171 11B6;
+B01C;B01C;1101 1171 11B7;B01C;1101 1171 11B7;
+B01D;B01D;1101 1171 11B8;B01D;1101 1171 11B8;
+B01E;B01E;1101 1171 11B9;B01E;1101 1171 11B9;
+B01F;B01F;1101 1171 11BA;B01F;1101 1171 11BA;
+B020;B020;1101 1171 11BB;B020;1101 1171 11BB;
+B021;B021;1101 1171 11BC;B021;1101 1171 11BC;
+B022;B022;1101 1171 11BD;B022;1101 1171 11BD;
+B023;B023;1101 1171 11BE;B023;1101 1171 11BE;
+B024;B024;1101 1171 11BF;B024;1101 1171 11BF;
+B025;B025;1101 1171 11C0;B025;1101 1171 11C0;
+B026;B026;1101 1171 11C1;B026;1101 1171 11C1;
+B027;B027;1101 1171 11C2;B027;1101 1171 11C2;
+B028;B028;1101 1172;B028;1101 1172;
+B029;B029;1101 1172 11A8;B029;1101 1172 11A8;
+B02A;B02A;1101 1172 11A9;B02A;1101 1172 11A9;
+B02B;B02B;1101 1172 11AA;B02B;1101 1172 11AA;
+B02C;B02C;1101 1172 11AB;B02C;1101 1172 11AB;
+B02D;B02D;1101 1172 11AC;B02D;1101 1172 11AC;
+B02E;B02E;1101 1172 11AD;B02E;1101 1172 11AD;
+B02F;B02F;1101 1172 11AE;B02F;1101 1172 11AE;
+B030;B030;1101 1172 11AF;B030;1101 1172 11AF;
+B031;B031;1101 1172 11B0;B031;1101 1172 11B0;
+B032;B032;1101 1172 11B1;B032;1101 1172 11B1;
+B033;B033;1101 1172 11B2;B033;1101 1172 11B2;
+B034;B034;1101 1172 11B3;B034;1101 1172 11B3;
+B035;B035;1101 1172 11B4;B035;1101 1172 11B4;
+B036;B036;1101 1172 11B5;B036;1101 1172 11B5;
+B037;B037;1101 1172 11B6;B037;1101 1172 11B6;
+B038;B038;1101 1172 11B7;B038;1101 1172 11B7;
+B039;B039;1101 1172 11B8;B039;1101 1172 11B8;
+B03A;B03A;1101 1172 11B9;B03A;1101 1172 11B9;
+B03B;B03B;1101 1172 11BA;B03B;1101 1172 11BA;
+B03C;B03C;1101 1172 11BB;B03C;1101 1172 11BB;
+B03D;B03D;1101 1172 11BC;B03D;1101 1172 11BC;
+B03E;B03E;1101 1172 11BD;B03E;1101 1172 11BD;
+B03F;B03F;1101 1172 11BE;B03F;1101 1172 11BE;
+B040;B040;1101 1172 11BF;B040;1101 1172 11BF;
+B041;B041;1101 1172 11C0;B041;1101 1172 11C0;
+B042;B042;1101 1172 11C1;B042;1101 1172 11C1;
+B043;B043;1101 1172 11C2;B043;1101 1172 11C2;
+B044;B044;1101 1173;B044;1101 1173;
+B045;B045;1101 1173 11A8;B045;1101 1173 11A8;
+B046;B046;1101 1173 11A9;B046;1101 1173 11A9;
+B047;B047;1101 1173 11AA;B047;1101 1173 11AA;
+B048;B048;1101 1173 11AB;B048;1101 1173 11AB;
+B049;B049;1101 1173 11AC;B049;1101 1173 11AC;
+B04A;B04A;1101 1173 11AD;B04A;1101 1173 11AD;
+B04B;B04B;1101 1173 11AE;B04B;1101 1173 11AE;
+B04C;B04C;1101 1173 11AF;B04C;1101 1173 11AF;
+B04D;B04D;1101 1173 11B0;B04D;1101 1173 11B0;
+B04E;B04E;1101 1173 11B1;B04E;1101 1173 11B1;
+B04F;B04F;1101 1173 11B2;B04F;1101 1173 11B2;
+B050;B050;1101 1173 11B3;B050;1101 1173 11B3;
+B051;B051;1101 1173 11B4;B051;1101 1173 11B4;
+B052;B052;1101 1173 11B5;B052;1101 1173 11B5;
+B053;B053;1101 1173 11B6;B053;1101 1173 11B6;
+B054;B054;1101 1173 11B7;B054;1101 1173 11B7;
+B055;B055;1101 1173 11B8;B055;1101 1173 11B8;
+B056;B056;1101 1173 11B9;B056;1101 1173 11B9;
+B057;B057;1101 1173 11BA;B057;1101 1173 11BA;
+B058;B058;1101 1173 11BB;B058;1101 1173 11BB;
+B059;B059;1101 1173 11BC;B059;1101 1173 11BC;
+B05A;B05A;1101 1173 11BD;B05A;1101 1173 11BD;
+B05B;B05B;1101 1173 11BE;B05B;1101 1173 11BE;
+B05C;B05C;1101 1173 11BF;B05C;1101 1173 11BF;
+B05D;B05D;1101 1173 11C0;B05D;1101 1173 11C0;
+B05E;B05E;1101 1173 11C1;B05E;1101 1173 11C1;
+B05F;B05F;1101 1173 11C2;B05F;1101 1173 11C2;
+B060;B060;1101 1174;B060;1101 1174;
+B061;B061;1101 1174 11A8;B061;1101 1174 11A8;
+B062;B062;1101 1174 11A9;B062;1101 1174 11A9;
+B063;B063;1101 1174 11AA;B063;1101 1174 11AA;
+B064;B064;1101 1174 11AB;B064;1101 1174 11AB;
+B065;B065;1101 1174 11AC;B065;1101 1174 11AC;
+B066;B066;1101 1174 11AD;B066;1101 1174 11AD;
+B067;B067;1101 1174 11AE;B067;1101 1174 11AE;
+B068;B068;1101 1174 11AF;B068;1101 1174 11AF;
+B069;B069;1101 1174 11B0;B069;1101 1174 11B0;
+B06A;B06A;1101 1174 11B1;B06A;1101 1174 11B1;
+B06B;B06B;1101 1174 11B2;B06B;1101 1174 11B2;
+B06C;B06C;1101 1174 11B3;B06C;1101 1174 11B3;
+B06D;B06D;1101 1174 11B4;B06D;1101 1174 11B4;
+B06E;B06E;1101 1174 11B5;B06E;1101 1174 11B5;
+B06F;B06F;1101 1174 11B6;B06F;1101 1174 11B6;
+B070;B070;1101 1174 11B7;B070;1101 1174 11B7;
+B071;B071;1101 1174 11B8;B071;1101 1174 11B8;
+B072;B072;1101 1174 11B9;B072;1101 1174 11B9;
+B073;B073;1101 1174 11BA;B073;1101 1174 11BA;
+B074;B074;1101 1174 11BB;B074;1101 1174 11BB;
+B075;B075;1101 1174 11BC;B075;1101 1174 11BC;
+B076;B076;1101 1174 11BD;B076;1101 1174 11BD;
+B077;B077;1101 1174 11BE;B077;1101 1174 11BE;
+B078;B078;1101 1174 11BF;B078;1101 1174 11BF;
+B079;B079;1101 1174 11C0;B079;1101 1174 11C0;
+B07A;B07A;1101 1174 11C1;B07A;1101 1174 11C1;
+B07B;B07B;1101 1174 11C2;B07B;1101 1174 11C2;
+B07C;B07C;1101 1175;B07C;1101 1175;
+B07D;B07D;1101 1175 11A8;B07D;1101 1175 11A8;
+B07E;B07E;1101 1175 11A9;B07E;1101 1175 11A9;
+B07F;B07F;1101 1175 11AA;B07F;1101 1175 11AA;
+B080;B080;1101 1175 11AB;B080;1101 1175 11AB;
+B081;B081;1101 1175 11AC;B081;1101 1175 11AC;
+B082;B082;1101 1175 11AD;B082;1101 1175 11AD;
+B083;B083;1101 1175 11AE;B083;1101 1175 11AE;
+B084;B084;1101 1175 11AF;B084;1101 1175 11AF;
+B085;B085;1101 1175 11B0;B085;1101 1175 11B0;
+B086;B086;1101 1175 11B1;B086;1101 1175 11B1;
+B087;B087;1101 1175 11B2;B087;1101 1175 11B2;
+B088;B088;1101 1175 11B3;B088;1101 1175 11B3;
+B089;B089;1101 1175 11B4;B089;1101 1175 11B4;
+B08A;B08A;1101 1175 11B5;B08A;1101 1175 11B5;
+B08B;B08B;1101 1175 11B6;B08B;1101 1175 11B6;
+B08C;B08C;1101 1175 11B7;B08C;1101 1175 11B7;
+B08D;B08D;1101 1175 11B8;B08D;1101 1175 11B8;
+B08E;B08E;1101 1175 11B9;B08E;1101 1175 11B9;
+B08F;B08F;1101 1175 11BA;B08F;1101 1175 11BA;
+B090;B090;1101 1175 11BB;B090;1101 1175 11BB;
+B091;B091;1101 1175 11BC;B091;1101 1175 11BC;
+B092;B092;1101 1175 11BD;B092;1101 1175 11BD;
+B093;B093;1101 1175 11BE;B093;1101 1175 11BE;
+B094;B094;1101 1175 11BF;B094;1101 1175 11BF;
+B095;B095;1101 1175 11C0;B095;1101 1175 11C0;
+B096;B096;1101 1175 11C1;B096;1101 1175 11C1;
+B097;B097;1101 1175 11C2;B097;1101 1175 11C2;
+B098;B098;1102 1161;B098;1102 1161;
+B099;B099;1102 1161 11A8;B099;1102 1161 11A8;
+B09A;B09A;1102 1161 11A9;B09A;1102 1161 11A9;
+B09B;B09B;1102 1161 11AA;B09B;1102 1161 11AA;
+B09C;B09C;1102 1161 11AB;B09C;1102 1161 11AB;
+B09D;B09D;1102 1161 11AC;B09D;1102 1161 11AC;
+B09E;B09E;1102 1161 11AD;B09E;1102 1161 11AD;
+B09F;B09F;1102 1161 11AE;B09F;1102 1161 11AE;
+B0A0;B0A0;1102 1161 11AF;B0A0;1102 1161 11AF;
+B0A1;B0A1;1102 1161 11B0;B0A1;1102 1161 11B0;
+B0A2;B0A2;1102 1161 11B1;B0A2;1102 1161 11B1;
+B0A3;B0A3;1102 1161 11B2;B0A3;1102 1161 11B2;
+B0A4;B0A4;1102 1161 11B3;B0A4;1102 1161 11B3;
+B0A5;B0A5;1102 1161 11B4;B0A5;1102 1161 11B4;
+B0A6;B0A6;1102 1161 11B5;B0A6;1102 1161 11B5;
+B0A7;B0A7;1102 1161 11B6;B0A7;1102 1161 11B6;
+B0A8;B0A8;1102 1161 11B7;B0A8;1102 1161 11B7;
+B0A9;B0A9;1102 1161 11B8;B0A9;1102 1161 11B8;
+B0AA;B0AA;1102 1161 11B9;B0AA;1102 1161 11B9;
+B0AB;B0AB;1102 1161 11BA;B0AB;1102 1161 11BA;
+B0AC;B0AC;1102 1161 11BB;B0AC;1102 1161 11BB;
+B0AD;B0AD;1102 1161 11BC;B0AD;1102 1161 11BC;
+B0AE;B0AE;1102 1161 11BD;B0AE;1102 1161 11BD;
+B0AF;B0AF;1102 1161 11BE;B0AF;1102 1161 11BE;
+B0B0;B0B0;1102 1161 11BF;B0B0;1102 1161 11BF;
+B0B1;B0B1;1102 1161 11C0;B0B1;1102 1161 11C0;
+B0B2;B0B2;1102 1161 11C1;B0B2;1102 1161 11C1;
+B0B3;B0B3;1102 1161 11C2;B0B3;1102 1161 11C2;
+B0B4;B0B4;1102 1162;B0B4;1102 1162;
+B0B5;B0B5;1102 1162 11A8;B0B5;1102 1162 11A8;
+B0B6;B0B6;1102 1162 11A9;B0B6;1102 1162 11A9;
+B0B7;B0B7;1102 1162 11AA;B0B7;1102 1162 11AA;
+B0B8;B0B8;1102 1162 11AB;B0B8;1102 1162 11AB;
+B0B9;B0B9;1102 1162 11AC;B0B9;1102 1162 11AC;
+B0BA;B0BA;1102 1162 11AD;B0BA;1102 1162 11AD;
+B0BB;B0BB;1102 1162 11AE;B0BB;1102 1162 11AE;
+B0BC;B0BC;1102 1162 11AF;B0BC;1102 1162 11AF;
+B0BD;B0BD;1102 1162 11B0;B0BD;1102 1162 11B0;
+B0BE;B0BE;1102 1162 11B1;B0BE;1102 1162 11B1;
+B0BF;B0BF;1102 1162 11B2;B0BF;1102 1162 11B2;
+B0C0;B0C0;1102 1162 11B3;B0C0;1102 1162 11B3;
+B0C1;B0C1;1102 1162 11B4;B0C1;1102 1162 11B4;
+B0C2;B0C2;1102 1162 11B5;B0C2;1102 1162 11B5;
+B0C3;B0C3;1102 1162 11B6;B0C3;1102 1162 11B6;
+B0C4;B0C4;1102 1162 11B7;B0C4;1102 1162 11B7;
+B0C5;B0C5;1102 1162 11B8;B0C5;1102 1162 11B8;
+B0C6;B0C6;1102 1162 11B9;B0C6;1102 1162 11B9;
+B0C7;B0C7;1102 1162 11BA;B0C7;1102 1162 11BA;
+B0C8;B0C8;1102 1162 11BB;B0C8;1102 1162 11BB;
+B0C9;B0C9;1102 1162 11BC;B0C9;1102 1162 11BC;
+B0CA;B0CA;1102 1162 11BD;B0CA;1102 1162 11BD;
+B0CB;B0CB;1102 1162 11BE;B0CB;1102 1162 11BE;
+B0CC;B0CC;1102 1162 11BF;B0CC;1102 1162 11BF;
+B0CD;B0CD;1102 1162 11C0;B0CD;1102 1162 11C0;
+B0CE;B0CE;1102 1162 11C1;B0CE;1102 1162 11C1;
+B0CF;B0CF;1102 1162 11C2;B0CF;1102 1162 11C2;
+B0D0;B0D0;1102 1163;B0D0;1102 1163;
+B0D1;B0D1;1102 1163 11A8;B0D1;1102 1163 11A8;
+B0D2;B0D2;1102 1163 11A9;B0D2;1102 1163 11A9;
+B0D3;B0D3;1102 1163 11AA;B0D3;1102 1163 11AA;
+B0D4;B0D4;1102 1163 11AB;B0D4;1102 1163 11AB;
+B0D5;B0D5;1102 1163 11AC;B0D5;1102 1163 11AC;
+B0D6;B0D6;1102 1163 11AD;B0D6;1102 1163 11AD;
+B0D7;B0D7;1102 1163 11AE;B0D7;1102 1163 11AE;
+B0D8;B0D8;1102 1163 11AF;B0D8;1102 1163 11AF;
+B0D9;B0D9;1102 1163 11B0;B0D9;1102 1163 11B0;
+B0DA;B0DA;1102 1163 11B1;B0DA;1102 1163 11B1;
+B0DB;B0DB;1102 1163 11B2;B0DB;1102 1163 11B2;
+B0DC;B0DC;1102 1163 11B3;B0DC;1102 1163 11B3;
+B0DD;B0DD;1102 1163 11B4;B0DD;1102 1163 11B4;
+B0DE;B0DE;1102 1163 11B5;B0DE;1102 1163 11B5;
+B0DF;B0DF;1102 1163 11B6;B0DF;1102 1163 11B6;
+B0E0;B0E0;1102 1163 11B7;B0E0;1102 1163 11B7;
+B0E1;B0E1;1102 1163 11B8;B0E1;1102 1163 11B8;
+B0E2;B0E2;1102 1163 11B9;B0E2;1102 1163 11B9;
+B0E3;B0E3;1102 1163 11BA;B0E3;1102 1163 11BA;
+B0E4;B0E4;1102 1163 11BB;B0E4;1102 1163 11BB;
+B0E5;B0E5;1102 1163 11BC;B0E5;1102 1163 11BC;
+B0E6;B0E6;1102 1163 11BD;B0E6;1102 1163 11BD;
+B0E7;B0E7;1102 1163 11BE;B0E7;1102 1163 11BE;
+B0E8;B0E8;1102 1163 11BF;B0E8;1102 1163 11BF;
+B0E9;B0E9;1102 1163 11C0;B0E9;1102 1163 11C0;
+B0EA;B0EA;1102 1163 11C1;B0EA;1102 1163 11C1;
+B0EB;B0EB;1102 1163 11C2;B0EB;1102 1163 11C2;
+B0EC;B0EC;1102 1164;B0EC;1102 1164;
+B0ED;B0ED;1102 1164 11A8;B0ED;1102 1164 11A8;
+B0EE;B0EE;1102 1164 11A9;B0EE;1102 1164 11A9;
+B0EF;B0EF;1102 1164 11AA;B0EF;1102 1164 11AA;
+B0F0;B0F0;1102 1164 11AB;B0F0;1102 1164 11AB;
+B0F1;B0F1;1102 1164 11AC;B0F1;1102 1164 11AC;
+B0F2;B0F2;1102 1164 11AD;B0F2;1102 1164 11AD;
+B0F3;B0F3;1102 1164 11AE;B0F3;1102 1164 11AE;
+B0F4;B0F4;1102 1164 11AF;B0F4;1102 1164 11AF;
+B0F5;B0F5;1102 1164 11B0;B0F5;1102 1164 11B0;
+B0F6;B0F6;1102 1164 11B1;B0F6;1102 1164 11B1;
+B0F7;B0F7;1102 1164 11B2;B0F7;1102 1164 11B2;
+B0F8;B0F8;1102 1164 11B3;B0F8;1102 1164 11B3;
+B0F9;B0F9;1102 1164 11B4;B0F9;1102 1164 11B4;
+B0FA;B0FA;1102 1164 11B5;B0FA;1102 1164 11B5;
+B0FB;B0FB;1102 1164 11B6;B0FB;1102 1164 11B6;
+B0FC;B0FC;1102 1164 11B7;B0FC;1102 1164 11B7;
+B0FD;B0FD;1102 1164 11B8;B0FD;1102 1164 11B8;
+B0FE;B0FE;1102 1164 11B9;B0FE;1102 1164 11B9;
+B0FF;B0FF;1102 1164 11BA;B0FF;1102 1164 11BA;
+B100;B100;1102 1164 11BB;B100;1102 1164 11BB;
+B101;B101;1102 1164 11BC;B101;1102 1164 11BC;
+B102;B102;1102 1164 11BD;B102;1102 1164 11BD;
+B103;B103;1102 1164 11BE;B103;1102 1164 11BE;
+B104;B104;1102 1164 11BF;B104;1102 1164 11BF;
+B105;B105;1102 1164 11C0;B105;1102 1164 11C0;
+B106;B106;1102 1164 11C1;B106;1102 1164 11C1;
+B107;B107;1102 1164 11C2;B107;1102 1164 11C2;
+B108;B108;1102 1165;B108;1102 1165;
+B109;B109;1102 1165 11A8;B109;1102 1165 11A8;
+B10A;B10A;1102 1165 11A9;B10A;1102 1165 11A9;
+B10B;B10B;1102 1165 11AA;B10B;1102 1165 11AA;
+B10C;B10C;1102 1165 11AB;B10C;1102 1165 11AB;
+B10D;B10D;1102 1165 11AC;B10D;1102 1165 11AC;
+B10E;B10E;1102 1165 11AD;B10E;1102 1165 11AD;
+B10F;B10F;1102 1165 11AE;B10F;1102 1165 11AE;
+B110;B110;1102 1165 11AF;B110;1102 1165 11AF;
+B111;B111;1102 1165 11B0;B111;1102 1165 11B0;
+B112;B112;1102 1165 11B1;B112;1102 1165 11B1;
+B113;B113;1102 1165 11B2;B113;1102 1165 11B2;
+B114;B114;1102 1165 11B3;B114;1102 1165 11B3;
+B115;B115;1102 1165 11B4;B115;1102 1165 11B4;
+B116;B116;1102 1165 11B5;B116;1102 1165 11B5;
+B117;B117;1102 1165 11B6;B117;1102 1165 11B6;
+B118;B118;1102 1165 11B7;B118;1102 1165 11B7;
+B119;B119;1102 1165 11B8;B119;1102 1165 11B8;
+B11A;B11A;1102 1165 11B9;B11A;1102 1165 11B9;
+B11B;B11B;1102 1165 11BA;B11B;1102 1165 11BA;
+B11C;B11C;1102 1165 11BB;B11C;1102 1165 11BB;
+B11D;B11D;1102 1165 11BC;B11D;1102 1165 11BC;
+B11E;B11E;1102 1165 11BD;B11E;1102 1165 11BD;
+B11F;B11F;1102 1165 11BE;B11F;1102 1165 11BE;
+B120;B120;1102 1165 11BF;B120;1102 1165 11BF;
+B121;B121;1102 1165 11C0;B121;1102 1165 11C0;
+B122;B122;1102 1165 11C1;B122;1102 1165 11C1;
+B123;B123;1102 1165 11C2;B123;1102 1165 11C2;
+B124;B124;1102 1166;B124;1102 1166;
+B125;B125;1102 1166 11A8;B125;1102 1166 11A8;
+B126;B126;1102 1166 11A9;B126;1102 1166 11A9;
+B127;B127;1102 1166 11AA;B127;1102 1166 11AA;
+B128;B128;1102 1166 11AB;B128;1102 1166 11AB;
+B129;B129;1102 1166 11AC;B129;1102 1166 11AC;
+B12A;B12A;1102 1166 11AD;B12A;1102 1166 11AD;
+B12B;B12B;1102 1166 11AE;B12B;1102 1166 11AE;
+B12C;B12C;1102 1166 11AF;B12C;1102 1166 11AF;
+B12D;B12D;1102 1166 11B0;B12D;1102 1166 11B0;
+B12E;B12E;1102 1166 11B1;B12E;1102 1166 11B1;
+B12F;B12F;1102 1166 11B2;B12F;1102 1166 11B2;
+B130;B130;1102 1166 11B3;B130;1102 1166 11B3;
+B131;B131;1102 1166 11B4;B131;1102 1166 11B4;
+B132;B132;1102 1166 11B5;B132;1102 1166 11B5;
+B133;B133;1102 1166 11B6;B133;1102 1166 11B6;
+B134;B134;1102 1166 11B7;B134;1102 1166 11B7;
+B135;B135;1102 1166 11B8;B135;1102 1166 11B8;
+B136;B136;1102 1166 11B9;B136;1102 1166 11B9;
+B137;B137;1102 1166 11BA;B137;1102 1166 11BA;
+B138;B138;1102 1166 11BB;B138;1102 1166 11BB;
+B139;B139;1102 1166 11BC;B139;1102 1166 11BC;
+B13A;B13A;1102 1166 11BD;B13A;1102 1166 11BD;
+B13B;B13B;1102 1166 11BE;B13B;1102 1166 11BE;
+B13C;B13C;1102 1166 11BF;B13C;1102 1166 11BF;
+B13D;B13D;1102 1166 11C0;B13D;1102 1166 11C0;
+B13E;B13E;1102 1166 11C1;B13E;1102 1166 11C1;
+B13F;B13F;1102 1166 11C2;B13F;1102 1166 11C2;
+B140;B140;1102 1167;B140;1102 1167;
+B141;B141;1102 1167 11A8;B141;1102 1167 11A8;
+B142;B142;1102 1167 11A9;B142;1102 1167 11A9;
+B143;B143;1102 1167 11AA;B143;1102 1167 11AA;
+B144;B144;1102 1167 11AB;B144;1102 1167 11AB;
+B145;B145;1102 1167 11AC;B145;1102 1167 11AC;
+B146;B146;1102 1167 11AD;B146;1102 1167 11AD;
+B147;B147;1102 1167 11AE;B147;1102 1167 11AE;
+B148;B148;1102 1167 11AF;B148;1102 1167 11AF;
+B149;B149;1102 1167 11B0;B149;1102 1167 11B0;
+B14A;B14A;1102 1167 11B1;B14A;1102 1167 11B1;
+B14B;B14B;1102 1167 11B2;B14B;1102 1167 11B2;
+B14C;B14C;1102 1167 11B3;B14C;1102 1167 11B3;
+B14D;B14D;1102 1167 11B4;B14D;1102 1167 11B4;
+B14E;B14E;1102 1167 11B5;B14E;1102 1167 11B5;
+B14F;B14F;1102 1167 11B6;B14F;1102 1167 11B6;
+B150;B150;1102 1167 11B7;B150;1102 1167 11B7;
+B151;B151;1102 1167 11B8;B151;1102 1167 11B8;
+B152;B152;1102 1167 11B9;B152;1102 1167 11B9;
+B153;B153;1102 1167 11BA;B153;1102 1167 11BA;
+B154;B154;1102 1167 11BB;B154;1102 1167 11BB;
+B155;B155;1102 1167 11BC;B155;1102 1167 11BC;
+B156;B156;1102 1167 11BD;B156;1102 1167 11BD;
+B157;B157;1102 1167 11BE;B157;1102 1167 11BE;
+B158;B158;1102 1167 11BF;B158;1102 1167 11BF;
+B159;B159;1102 1167 11C0;B159;1102 1167 11C0;
+B15A;B15A;1102 1167 11C1;B15A;1102 1167 11C1;
+B15B;B15B;1102 1167 11C2;B15B;1102 1167 11C2;
+B15C;B15C;1102 1168;B15C;1102 1168;
+B15D;B15D;1102 1168 11A8;B15D;1102 1168 11A8;
+B15E;B15E;1102 1168 11A9;B15E;1102 1168 11A9;
+B15F;B15F;1102 1168 11AA;B15F;1102 1168 11AA;
+B160;B160;1102 1168 11AB;B160;1102 1168 11AB;
+B161;B161;1102 1168 11AC;B161;1102 1168 11AC;
+B162;B162;1102 1168 11AD;B162;1102 1168 11AD;
+B163;B163;1102 1168 11AE;B163;1102 1168 11AE;
+B164;B164;1102 1168 11AF;B164;1102 1168 11AF;
+B165;B165;1102 1168 11B0;B165;1102 1168 11B0;
+B166;B166;1102 1168 11B1;B166;1102 1168 11B1;
+B167;B167;1102 1168 11B2;B167;1102 1168 11B2;
+B168;B168;1102 1168 11B3;B168;1102 1168 11B3;
+B169;B169;1102 1168 11B4;B169;1102 1168 11B4;
+B16A;B16A;1102 1168 11B5;B16A;1102 1168 11B5;
+B16B;B16B;1102 1168 11B6;B16B;1102 1168 11B6;
+B16C;B16C;1102 1168 11B7;B16C;1102 1168 11B7;
+B16D;B16D;1102 1168 11B8;B16D;1102 1168 11B8;
+B16E;B16E;1102 1168 11B9;B16E;1102 1168 11B9;
+B16F;B16F;1102 1168 11BA;B16F;1102 1168 11BA;
+B170;B170;1102 1168 11BB;B170;1102 1168 11BB;
+B171;B171;1102 1168 11BC;B171;1102 1168 11BC;
+B172;B172;1102 1168 11BD;B172;1102 1168 11BD;
+B173;B173;1102 1168 11BE;B173;1102 1168 11BE;
+B174;B174;1102 1168 11BF;B174;1102 1168 11BF;
+B175;B175;1102 1168 11C0;B175;1102 1168 11C0;
+B176;B176;1102 1168 11C1;B176;1102 1168 11C1;
+B177;B177;1102 1168 11C2;B177;1102 1168 11C2;
+B178;B178;1102 1169;B178;1102 1169;
+B179;B179;1102 1169 11A8;B179;1102 1169 11A8;
+B17A;B17A;1102 1169 11A9;B17A;1102 1169 11A9;
+B17B;B17B;1102 1169 11AA;B17B;1102 1169 11AA;
+B17C;B17C;1102 1169 11AB;B17C;1102 1169 11AB;
+B17D;B17D;1102 1169 11AC;B17D;1102 1169 11AC;
+B17E;B17E;1102 1169 11AD;B17E;1102 1169 11AD;
+B17F;B17F;1102 1169 11AE;B17F;1102 1169 11AE;
+B180;B180;1102 1169 11AF;B180;1102 1169 11AF;
+B181;B181;1102 1169 11B0;B181;1102 1169 11B0;
+B182;B182;1102 1169 11B1;B182;1102 1169 11B1;
+B183;B183;1102 1169 11B2;B183;1102 1169 11B2;
+B184;B184;1102 1169 11B3;B184;1102 1169 11B3;
+B185;B185;1102 1169 11B4;B185;1102 1169 11B4;
+B186;B186;1102 1169 11B5;B186;1102 1169 11B5;
+B187;B187;1102 1169 11B6;B187;1102 1169 11B6;
+B188;B188;1102 1169 11B7;B188;1102 1169 11B7;
+B189;B189;1102 1169 11B8;B189;1102 1169 11B8;
+B18A;B18A;1102 1169 11B9;B18A;1102 1169 11B9;
+B18B;B18B;1102 1169 11BA;B18B;1102 1169 11BA;
+B18C;B18C;1102 1169 11BB;B18C;1102 1169 11BB;
+B18D;B18D;1102 1169 11BC;B18D;1102 1169 11BC;
+B18E;B18E;1102 1169 11BD;B18E;1102 1169 11BD;
+B18F;B18F;1102 1169 11BE;B18F;1102 1169 11BE;
+B190;B190;1102 1169 11BF;B190;1102 1169 11BF;
+B191;B191;1102 1169 11C0;B191;1102 1169 11C0;
+B192;B192;1102 1169 11C1;B192;1102 1169 11C1;
+B193;B193;1102 1169 11C2;B193;1102 1169 11C2;
+B194;B194;1102 116A;B194;1102 116A;
+B195;B195;1102 116A 11A8;B195;1102 116A 11A8;
+B196;B196;1102 116A 11A9;B196;1102 116A 11A9;
+B197;B197;1102 116A 11AA;B197;1102 116A 11AA;
+B198;B198;1102 116A 11AB;B198;1102 116A 11AB;
+B199;B199;1102 116A 11AC;B199;1102 116A 11AC;
+B19A;B19A;1102 116A 11AD;B19A;1102 116A 11AD;
+B19B;B19B;1102 116A 11AE;B19B;1102 116A 11AE;
+B19C;B19C;1102 116A 11AF;B19C;1102 116A 11AF;
+B19D;B19D;1102 116A 11B0;B19D;1102 116A 11B0;
+B19E;B19E;1102 116A 11B1;B19E;1102 116A 11B1;
+B19F;B19F;1102 116A 11B2;B19F;1102 116A 11B2;
+B1A0;B1A0;1102 116A 11B3;B1A0;1102 116A 11B3;
+B1A1;B1A1;1102 116A 11B4;B1A1;1102 116A 11B4;
+B1A2;B1A2;1102 116A 11B5;B1A2;1102 116A 11B5;
+B1A3;B1A3;1102 116A 11B6;B1A3;1102 116A 11B6;
+B1A4;B1A4;1102 116A 11B7;B1A4;1102 116A 11B7;
+B1A5;B1A5;1102 116A 11B8;B1A5;1102 116A 11B8;
+B1A6;B1A6;1102 116A 11B9;B1A6;1102 116A 11B9;
+B1A7;B1A7;1102 116A 11BA;B1A7;1102 116A 11BA;
+B1A8;B1A8;1102 116A 11BB;B1A8;1102 116A 11BB;
+B1A9;B1A9;1102 116A 11BC;B1A9;1102 116A 11BC;
+B1AA;B1AA;1102 116A 11BD;B1AA;1102 116A 11BD;
+B1AB;B1AB;1102 116A 11BE;B1AB;1102 116A 11BE;
+B1AC;B1AC;1102 116A 11BF;B1AC;1102 116A 11BF;
+B1AD;B1AD;1102 116A 11C0;B1AD;1102 116A 11C0;
+B1AE;B1AE;1102 116A 11C1;B1AE;1102 116A 11C1;
+B1AF;B1AF;1102 116A 11C2;B1AF;1102 116A 11C2;
+B1B0;B1B0;1102 116B;B1B0;1102 116B;
+B1B1;B1B1;1102 116B 11A8;B1B1;1102 116B 11A8;
+B1B2;B1B2;1102 116B 11A9;B1B2;1102 116B 11A9;
+B1B3;B1B3;1102 116B 11AA;B1B3;1102 116B 11AA;
+B1B4;B1B4;1102 116B 11AB;B1B4;1102 116B 11AB;
+B1B5;B1B5;1102 116B 11AC;B1B5;1102 116B 11AC;
+B1B6;B1B6;1102 116B 11AD;B1B6;1102 116B 11AD;
+B1B7;B1B7;1102 116B 11AE;B1B7;1102 116B 11AE;
+B1B8;B1B8;1102 116B 11AF;B1B8;1102 116B 11AF;
+B1B9;B1B9;1102 116B 11B0;B1B9;1102 116B 11B0;
+B1BA;B1BA;1102 116B 11B1;B1BA;1102 116B 11B1;
+B1BB;B1BB;1102 116B 11B2;B1BB;1102 116B 11B2;
+B1BC;B1BC;1102 116B 11B3;B1BC;1102 116B 11B3;
+B1BD;B1BD;1102 116B 11B4;B1BD;1102 116B 11B4;
+B1BE;B1BE;1102 116B 11B5;B1BE;1102 116B 11B5;
+B1BF;B1BF;1102 116B 11B6;B1BF;1102 116B 11B6;
+B1C0;B1C0;1102 116B 11B7;B1C0;1102 116B 11B7;
+B1C1;B1C1;1102 116B 11B8;B1C1;1102 116B 11B8;
+B1C2;B1C2;1102 116B 11B9;B1C2;1102 116B 11B9;
+B1C3;B1C3;1102 116B 11BA;B1C3;1102 116B 11BA;
+B1C4;B1C4;1102 116B 11BB;B1C4;1102 116B 11BB;
+B1C5;B1C5;1102 116B 11BC;B1C5;1102 116B 11BC;
+B1C6;B1C6;1102 116B 11BD;B1C6;1102 116B 11BD;
+B1C7;B1C7;1102 116B 11BE;B1C7;1102 116B 11BE;
+B1C8;B1C8;1102 116B 11BF;B1C8;1102 116B 11BF;
+B1C9;B1C9;1102 116B 11C0;B1C9;1102 116B 11C0;
+B1CA;B1CA;1102 116B 11C1;B1CA;1102 116B 11C1;
+B1CB;B1CB;1102 116B 11C2;B1CB;1102 116B 11C2;
+B1CC;B1CC;1102 116C;B1CC;1102 116C;
+B1CD;B1CD;1102 116C 11A8;B1CD;1102 116C 11A8;
+B1CE;B1CE;1102 116C 11A9;B1CE;1102 116C 11A9;
+B1CF;B1CF;1102 116C 11AA;B1CF;1102 116C 11AA;
+B1D0;B1D0;1102 116C 11AB;B1D0;1102 116C 11AB;
+B1D1;B1D1;1102 116C 11AC;B1D1;1102 116C 11AC;
+B1D2;B1D2;1102 116C 11AD;B1D2;1102 116C 11AD;
+B1D3;B1D3;1102 116C 11AE;B1D3;1102 116C 11AE;
+B1D4;B1D4;1102 116C 11AF;B1D4;1102 116C 11AF;
+B1D5;B1D5;1102 116C 11B0;B1D5;1102 116C 11B0;
+B1D6;B1D6;1102 116C 11B1;B1D6;1102 116C 11B1;
+B1D7;B1D7;1102 116C 11B2;B1D7;1102 116C 11B2;
+B1D8;B1D8;1102 116C 11B3;B1D8;1102 116C 11B3;
+B1D9;B1D9;1102 116C 11B4;B1D9;1102 116C 11B4;
+B1DA;B1DA;1102 116C 11B5;B1DA;1102 116C 11B5;
+B1DB;B1DB;1102 116C 11B6;B1DB;1102 116C 11B6;
+B1DC;B1DC;1102 116C 11B7;B1DC;1102 116C 11B7;
+B1DD;B1DD;1102 116C 11B8;B1DD;1102 116C 11B8;
+B1DE;B1DE;1102 116C 11B9;B1DE;1102 116C 11B9;
+B1DF;B1DF;1102 116C 11BA;B1DF;1102 116C 11BA;
+B1E0;B1E0;1102 116C 11BB;B1E0;1102 116C 11BB;
+B1E1;B1E1;1102 116C 11BC;B1E1;1102 116C 11BC;
+B1E2;B1E2;1102 116C 11BD;B1E2;1102 116C 11BD;
+B1E3;B1E3;1102 116C 11BE;B1E3;1102 116C 11BE;
+B1E4;B1E4;1102 116C 11BF;B1E4;1102 116C 11BF;
+B1E5;B1E5;1102 116C 11C0;B1E5;1102 116C 11C0;
+B1E6;B1E6;1102 116C 11C1;B1E6;1102 116C 11C1;
+B1E7;B1E7;1102 116C 11C2;B1E7;1102 116C 11C2;
+B1E8;B1E8;1102 116D;B1E8;1102 116D;
+B1E9;B1E9;1102 116D 11A8;B1E9;1102 116D 11A8;
+B1EA;B1EA;1102 116D 11A9;B1EA;1102 116D 11A9;
+B1EB;B1EB;1102 116D 11AA;B1EB;1102 116D 11AA;
+B1EC;B1EC;1102 116D 11AB;B1EC;1102 116D 11AB;
+B1ED;B1ED;1102 116D 11AC;B1ED;1102 116D 11AC;
+B1EE;B1EE;1102 116D 11AD;B1EE;1102 116D 11AD;
+B1EF;B1EF;1102 116D 11AE;B1EF;1102 116D 11AE;
+B1F0;B1F0;1102 116D 11AF;B1F0;1102 116D 11AF;
+B1F1;B1F1;1102 116D 11B0;B1F1;1102 116D 11B0;
+B1F2;B1F2;1102 116D 11B1;B1F2;1102 116D 11B1;
+B1F3;B1F3;1102 116D 11B2;B1F3;1102 116D 11B2;
+B1F4;B1F4;1102 116D 11B3;B1F4;1102 116D 11B3;
+B1F5;B1F5;1102 116D 11B4;B1F5;1102 116D 11B4;
+B1F6;B1F6;1102 116D 11B5;B1F6;1102 116D 11B5;
+B1F7;B1F7;1102 116D 11B6;B1F7;1102 116D 11B6;
+B1F8;B1F8;1102 116D 11B7;B1F8;1102 116D 11B7;
+B1F9;B1F9;1102 116D 11B8;B1F9;1102 116D 11B8;
+B1FA;B1FA;1102 116D 11B9;B1FA;1102 116D 11B9;
+B1FB;B1FB;1102 116D 11BA;B1FB;1102 116D 11BA;
+B1FC;B1FC;1102 116D 11BB;B1FC;1102 116D 11BB;
+B1FD;B1FD;1102 116D 11BC;B1FD;1102 116D 11BC;
+B1FE;B1FE;1102 116D 11BD;B1FE;1102 116D 11BD;
+B1FF;B1FF;1102 116D 11BE;B1FF;1102 116D 11BE;
+B200;B200;1102 116D 11BF;B200;1102 116D 11BF;
+B201;B201;1102 116D 11C0;B201;1102 116D 11C0;
+B202;B202;1102 116D 11C1;B202;1102 116D 11C1;
+B203;B203;1102 116D 11C2;B203;1102 116D 11C2;
+B204;B204;1102 116E;B204;1102 116E;
+B205;B205;1102 116E 11A8;B205;1102 116E 11A8;
+B206;B206;1102 116E 11A9;B206;1102 116E 11A9;
+B207;B207;1102 116E 11AA;B207;1102 116E 11AA;
+B208;B208;1102 116E 11AB;B208;1102 116E 11AB;
+B209;B209;1102 116E 11AC;B209;1102 116E 11AC;
+B20A;B20A;1102 116E 11AD;B20A;1102 116E 11AD;
+B20B;B20B;1102 116E 11AE;B20B;1102 116E 11AE;
+B20C;B20C;1102 116E 11AF;B20C;1102 116E 11AF;
+B20D;B20D;1102 116E 11B0;B20D;1102 116E 11B0;
+B20E;B20E;1102 116E 11B1;B20E;1102 116E 11B1;
+B20F;B20F;1102 116E 11B2;B20F;1102 116E 11B2;
+B210;B210;1102 116E 11B3;B210;1102 116E 11B3;
+B211;B211;1102 116E 11B4;B211;1102 116E 11B4;
+B212;B212;1102 116E 11B5;B212;1102 116E 11B5;
+B213;B213;1102 116E 11B6;B213;1102 116E 11B6;
+B214;B214;1102 116E 11B7;B214;1102 116E 11B7;
+B215;B215;1102 116E 11B8;B215;1102 116E 11B8;
+B216;B216;1102 116E 11B9;B216;1102 116E 11B9;
+B217;B217;1102 116E 11BA;B217;1102 116E 11BA;
+B218;B218;1102 116E 11BB;B218;1102 116E 11BB;
+B219;B219;1102 116E 11BC;B219;1102 116E 11BC;
+B21A;B21A;1102 116E 11BD;B21A;1102 116E 11BD;
+B21B;B21B;1102 116E 11BE;B21B;1102 116E 11BE;
+B21C;B21C;1102 116E 11BF;B21C;1102 116E 11BF;
+B21D;B21D;1102 116E 11C0;B21D;1102 116E 11C0;
+B21E;B21E;1102 116E 11C1;B21E;1102 116E 11C1;
+B21F;B21F;1102 116E 11C2;B21F;1102 116E 11C2;
+B220;B220;1102 116F;B220;1102 116F;
+B221;B221;1102 116F 11A8;B221;1102 116F 11A8;
+B222;B222;1102 116F 11A9;B222;1102 116F 11A9;
+B223;B223;1102 116F 11AA;B223;1102 116F 11AA;
+B224;B224;1102 116F 11AB;B224;1102 116F 11AB;
+B225;B225;1102 116F 11AC;B225;1102 116F 11AC;
+B226;B226;1102 116F 11AD;B226;1102 116F 11AD;
+B227;B227;1102 116F 11AE;B227;1102 116F 11AE;
+B228;B228;1102 116F 11AF;B228;1102 116F 11AF;
+B229;B229;1102 116F 11B0;B229;1102 116F 11B0;
+B22A;B22A;1102 116F 11B1;B22A;1102 116F 11B1;
+B22B;B22B;1102 116F 11B2;B22B;1102 116F 11B2;
+B22C;B22C;1102 116F 11B3;B22C;1102 116F 11B3;
+B22D;B22D;1102 116F 11B4;B22D;1102 116F 11B4;
+B22E;B22E;1102 116F 11B5;B22E;1102 116F 11B5;
+B22F;B22F;1102 116F 11B6;B22F;1102 116F 11B6;
+B230;B230;1102 116F 11B7;B230;1102 116F 11B7;
+B231;B231;1102 116F 11B8;B231;1102 116F 11B8;
+B232;B232;1102 116F 11B9;B232;1102 116F 11B9;
+B233;B233;1102 116F 11BA;B233;1102 116F 11BA;
+B234;B234;1102 116F 11BB;B234;1102 116F 11BB;
+B235;B235;1102 116F 11BC;B235;1102 116F 11BC;
+B236;B236;1102 116F 11BD;B236;1102 116F 11BD;
+B237;B237;1102 116F 11BE;B237;1102 116F 11BE;
+B238;B238;1102 116F 11BF;B238;1102 116F 11BF;
+B239;B239;1102 116F 11C0;B239;1102 116F 11C0;
+B23A;B23A;1102 116F 11C1;B23A;1102 116F 11C1;
+B23B;B23B;1102 116F 11C2;B23B;1102 116F 11C2;
+B23C;B23C;1102 1170;B23C;1102 1170;
+B23D;B23D;1102 1170 11A8;B23D;1102 1170 11A8;
+B23E;B23E;1102 1170 11A9;B23E;1102 1170 11A9;
+B23F;B23F;1102 1170 11AA;B23F;1102 1170 11AA;
+B240;B240;1102 1170 11AB;B240;1102 1170 11AB;
+B241;B241;1102 1170 11AC;B241;1102 1170 11AC;
+B242;B242;1102 1170 11AD;B242;1102 1170 11AD;
+B243;B243;1102 1170 11AE;B243;1102 1170 11AE;
+B244;B244;1102 1170 11AF;B244;1102 1170 11AF;
+B245;B245;1102 1170 11B0;B245;1102 1170 11B0;
+B246;B246;1102 1170 11B1;B246;1102 1170 11B1;
+B247;B247;1102 1170 11B2;B247;1102 1170 11B2;
+B248;B248;1102 1170 11B3;B248;1102 1170 11B3;
+B249;B249;1102 1170 11B4;B249;1102 1170 11B4;
+B24A;B24A;1102 1170 11B5;B24A;1102 1170 11B5;
+B24B;B24B;1102 1170 11B6;B24B;1102 1170 11B6;
+B24C;B24C;1102 1170 11B7;B24C;1102 1170 11B7;
+B24D;B24D;1102 1170 11B8;B24D;1102 1170 11B8;
+B24E;B24E;1102 1170 11B9;B24E;1102 1170 11B9;
+B24F;B24F;1102 1170 11BA;B24F;1102 1170 11BA;
+B250;B250;1102 1170 11BB;B250;1102 1170 11BB;
+B251;B251;1102 1170 11BC;B251;1102 1170 11BC;
+B252;B252;1102 1170 11BD;B252;1102 1170 11BD;
+B253;B253;1102 1170 11BE;B253;1102 1170 11BE;
+B254;B254;1102 1170 11BF;B254;1102 1170 11BF;
+B255;B255;1102 1170 11C0;B255;1102 1170 11C0;
+B256;B256;1102 1170 11C1;B256;1102 1170 11C1;
+B257;B257;1102 1170 11C2;B257;1102 1170 11C2;
+B258;B258;1102 1171;B258;1102 1171;
+B259;B259;1102 1171 11A8;B259;1102 1171 11A8;
+B25A;B25A;1102 1171 11A9;B25A;1102 1171 11A9;
+B25B;B25B;1102 1171 11AA;B25B;1102 1171 11AA;
+B25C;B25C;1102 1171 11AB;B25C;1102 1171 11AB;
+B25D;B25D;1102 1171 11AC;B25D;1102 1171 11AC;
+B25E;B25E;1102 1171 11AD;B25E;1102 1171 11AD;
+B25F;B25F;1102 1171 11AE;B25F;1102 1171 11AE;
+B260;B260;1102 1171 11AF;B260;1102 1171 11AF;
+B261;B261;1102 1171 11B0;B261;1102 1171 11B0;
+B262;B262;1102 1171 11B1;B262;1102 1171 11B1;
+B263;B263;1102 1171 11B2;B263;1102 1171 11B2;
+B264;B264;1102 1171 11B3;B264;1102 1171 11B3;
+B265;B265;1102 1171 11B4;B265;1102 1171 11B4;
+B266;B266;1102 1171 11B5;B266;1102 1171 11B5;
+B267;B267;1102 1171 11B6;B267;1102 1171 11B6;
+B268;B268;1102 1171 11B7;B268;1102 1171 11B7;
+B269;B269;1102 1171 11B8;B269;1102 1171 11B8;
+B26A;B26A;1102 1171 11B9;B26A;1102 1171 11B9;
+B26B;B26B;1102 1171 11BA;B26B;1102 1171 11BA;
+B26C;B26C;1102 1171 11BB;B26C;1102 1171 11BB;
+B26D;B26D;1102 1171 11BC;B26D;1102 1171 11BC;
+B26E;B26E;1102 1171 11BD;B26E;1102 1171 11BD;
+B26F;B26F;1102 1171 11BE;B26F;1102 1171 11BE;
+B270;B270;1102 1171 11BF;B270;1102 1171 11BF;
+B271;B271;1102 1171 11C0;B271;1102 1171 11C0;
+B272;B272;1102 1171 11C1;B272;1102 1171 11C1;
+B273;B273;1102 1171 11C2;B273;1102 1171 11C2;
+B274;B274;1102 1172;B274;1102 1172;
+B275;B275;1102 1172 11A8;B275;1102 1172 11A8;
+B276;B276;1102 1172 11A9;B276;1102 1172 11A9;
+B277;B277;1102 1172 11AA;B277;1102 1172 11AA;
+B278;B278;1102 1172 11AB;B278;1102 1172 11AB;
+B279;B279;1102 1172 11AC;B279;1102 1172 11AC;
+B27A;B27A;1102 1172 11AD;B27A;1102 1172 11AD;
+B27B;B27B;1102 1172 11AE;B27B;1102 1172 11AE;
+B27C;B27C;1102 1172 11AF;B27C;1102 1172 11AF;
+B27D;B27D;1102 1172 11B0;B27D;1102 1172 11B0;
+B27E;B27E;1102 1172 11B1;B27E;1102 1172 11B1;
+B27F;B27F;1102 1172 11B2;B27F;1102 1172 11B2;
+B280;B280;1102 1172 11B3;B280;1102 1172 11B3;
+B281;B281;1102 1172 11B4;B281;1102 1172 11B4;
+B282;B282;1102 1172 11B5;B282;1102 1172 11B5;
+B283;B283;1102 1172 11B6;B283;1102 1172 11B6;
+B284;B284;1102 1172 11B7;B284;1102 1172 11B7;
+B285;B285;1102 1172 11B8;B285;1102 1172 11B8;
+B286;B286;1102 1172 11B9;B286;1102 1172 11B9;
+B287;B287;1102 1172 11BA;B287;1102 1172 11BA;
+B288;B288;1102 1172 11BB;B288;1102 1172 11BB;
+B289;B289;1102 1172 11BC;B289;1102 1172 11BC;
+B28A;B28A;1102 1172 11BD;B28A;1102 1172 11BD;
+B28B;B28B;1102 1172 11BE;B28B;1102 1172 11BE;
+B28C;B28C;1102 1172 11BF;B28C;1102 1172 11BF;
+B28D;B28D;1102 1172 11C0;B28D;1102 1172 11C0;
+B28E;B28E;1102 1172 11C1;B28E;1102 1172 11C1;
+B28F;B28F;1102 1172 11C2;B28F;1102 1172 11C2;
+B290;B290;1102 1173;B290;1102 1173;
+B291;B291;1102 1173 11A8;B291;1102 1173 11A8;
+B292;B292;1102 1173 11A9;B292;1102 1173 11A9;
+B293;B293;1102 1173 11AA;B293;1102 1173 11AA;
+B294;B294;1102 1173 11AB;B294;1102 1173 11AB;
+B295;B295;1102 1173 11AC;B295;1102 1173 11AC;
+B296;B296;1102 1173 11AD;B296;1102 1173 11AD;
+B297;B297;1102 1173 11AE;B297;1102 1173 11AE;
+B298;B298;1102 1173 11AF;B298;1102 1173 11AF;
+B299;B299;1102 1173 11B0;B299;1102 1173 11B0;
+B29A;B29A;1102 1173 11B1;B29A;1102 1173 11B1;
+B29B;B29B;1102 1173 11B2;B29B;1102 1173 11B2;
+B29C;B29C;1102 1173 11B3;B29C;1102 1173 11B3;
+B29D;B29D;1102 1173 11B4;B29D;1102 1173 11B4;
+B29E;B29E;1102 1173 11B5;B29E;1102 1173 11B5;
+B29F;B29F;1102 1173 11B6;B29F;1102 1173 11B6;
+B2A0;B2A0;1102 1173 11B7;B2A0;1102 1173 11B7;
+B2A1;B2A1;1102 1173 11B8;B2A1;1102 1173 11B8;
+B2A2;B2A2;1102 1173 11B9;B2A2;1102 1173 11B9;
+B2A3;B2A3;1102 1173 11BA;B2A3;1102 1173 11BA;
+B2A4;B2A4;1102 1173 11BB;B2A4;1102 1173 11BB;
+B2A5;B2A5;1102 1173 11BC;B2A5;1102 1173 11BC;
+B2A6;B2A6;1102 1173 11BD;B2A6;1102 1173 11BD;
+B2A7;B2A7;1102 1173 11BE;B2A7;1102 1173 11BE;
+B2A8;B2A8;1102 1173 11BF;B2A8;1102 1173 11BF;
+B2A9;B2A9;1102 1173 11C0;B2A9;1102 1173 11C0;
+B2AA;B2AA;1102 1173 11C1;B2AA;1102 1173 11C1;
+B2AB;B2AB;1102 1173 11C2;B2AB;1102 1173 11C2;
+B2AC;B2AC;1102 1174;B2AC;1102 1174;
+B2AD;B2AD;1102 1174 11A8;B2AD;1102 1174 11A8;
+B2AE;B2AE;1102 1174 11A9;B2AE;1102 1174 11A9;
+B2AF;B2AF;1102 1174 11AA;B2AF;1102 1174 11AA;
+B2B0;B2B0;1102 1174 11AB;B2B0;1102 1174 11AB;
+B2B1;B2B1;1102 1174 11AC;B2B1;1102 1174 11AC;
+B2B2;B2B2;1102 1174 11AD;B2B2;1102 1174 11AD;
+B2B3;B2B3;1102 1174 11AE;B2B3;1102 1174 11AE;
+B2B4;B2B4;1102 1174 11AF;B2B4;1102 1174 11AF;
+B2B5;B2B5;1102 1174 11B0;B2B5;1102 1174 11B0;
+B2B6;B2B6;1102 1174 11B1;B2B6;1102 1174 11B1;
+B2B7;B2B7;1102 1174 11B2;B2B7;1102 1174 11B2;
+B2B8;B2B8;1102 1174 11B3;B2B8;1102 1174 11B3;
+B2B9;B2B9;1102 1174 11B4;B2B9;1102 1174 11B4;
+B2BA;B2BA;1102 1174 11B5;B2BA;1102 1174 11B5;
+B2BB;B2BB;1102 1174 11B6;B2BB;1102 1174 11B6;
+B2BC;B2BC;1102 1174 11B7;B2BC;1102 1174 11B7;
+B2BD;B2BD;1102 1174 11B8;B2BD;1102 1174 11B8;
+B2BE;B2BE;1102 1174 11B9;B2BE;1102 1174 11B9;
+B2BF;B2BF;1102 1174 11BA;B2BF;1102 1174 11BA;
+B2C0;B2C0;1102 1174 11BB;B2C0;1102 1174 11BB;
+B2C1;B2C1;1102 1174 11BC;B2C1;1102 1174 11BC;
+B2C2;B2C2;1102 1174 11BD;B2C2;1102 1174 11BD;
+B2C3;B2C3;1102 1174 11BE;B2C3;1102 1174 11BE;
+B2C4;B2C4;1102 1174 11BF;B2C4;1102 1174 11BF;
+B2C5;B2C5;1102 1174 11C0;B2C5;1102 1174 11C0;
+B2C6;B2C6;1102 1174 11C1;B2C6;1102 1174 11C1;
+B2C7;B2C7;1102 1174 11C2;B2C7;1102 1174 11C2;
+B2C8;B2C8;1102 1175;B2C8;1102 1175;
+B2C9;B2C9;1102 1175 11A8;B2C9;1102 1175 11A8;
+B2CA;B2CA;1102 1175 11A9;B2CA;1102 1175 11A9;
+B2CB;B2CB;1102 1175 11AA;B2CB;1102 1175 11AA;
+B2CC;B2CC;1102 1175 11AB;B2CC;1102 1175 11AB;
+B2CD;B2CD;1102 1175 11AC;B2CD;1102 1175 11AC;
+B2CE;B2CE;1102 1175 11AD;B2CE;1102 1175 11AD;
+B2CF;B2CF;1102 1175 11AE;B2CF;1102 1175 11AE;
+B2D0;B2D0;1102 1175 11AF;B2D0;1102 1175 11AF;
+B2D1;B2D1;1102 1175 11B0;B2D1;1102 1175 11B0;
+B2D2;B2D2;1102 1175 11B1;B2D2;1102 1175 11B1;
+B2D3;B2D3;1102 1175 11B2;B2D3;1102 1175 11B2;
+B2D4;B2D4;1102 1175 11B3;B2D4;1102 1175 11B3;
+B2D5;B2D5;1102 1175 11B4;B2D5;1102 1175 11B4;
+B2D6;B2D6;1102 1175 11B5;B2D6;1102 1175 11B5;
+B2D7;B2D7;1102 1175 11B6;B2D7;1102 1175 11B6;
+B2D8;B2D8;1102 1175 11B7;B2D8;1102 1175 11B7;
+B2D9;B2D9;1102 1175 11B8;B2D9;1102 1175 11B8;
+B2DA;B2DA;1102 1175 11B9;B2DA;1102 1175 11B9;
+B2DB;B2DB;1102 1175 11BA;B2DB;1102 1175 11BA;
+B2DC;B2DC;1102 1175 11BB;B2DC;1102 1175 11BB;
+B2DD;B2DD;1102 1175 11BC;B2DD;1102 1175 11BC;
+B2DE;B2DE;1102 1175 11BD;B2DE;1102 1175 11BD;
+B2DF;B2DF;1102 1175 11BE;B2DF;1102 1175 11BE;
+B2E0;B2E0;1102 1175 11BF;B2E0;1102 1175 11BF;
+B2E1;B2E1;1102 1175 11C0;B2E1;1102 1175 11C0;
+B2E2;B2E2;1102 1175 11C1;B2E2;1102 1175 11C1;
+B2E3;B2E3;1102 1175 11C2;B2E3;1102 1175 11C2;
+B2E4;B2E4;1103 1161;B2E4;1103 1161;
+B2E5;B2E5;1103 1161 11A8;B2E5;1103 1161 11A8;
+B2E6;B2E6;1103 1161 11A9;B2E6;1103 1161 11A9;
+B2E7;B2E7;1103 1161 11AA;B2E7;1103 1161 11AA;
+B2E8;B2E8;1103 1161 11AB;B2E8;1103 1161 11AB;
+B2E9;B2E9;1103 1161 11AC;B2E9;1103 1161 11AC;
+B2EA;B2EA;1103 1161 11AD;B2EA;1103 1161 11AD;
+B2EB;B2EB;1103 1161 11AE;B2EB;1103 1161 11AE;
+B2EC;B2EC;1103 1161 11AF;B2EC;1103 1161 11AF;
+B2ED;B2ED;1103 1161 11B0;B2ED;1103 1161 11B0;
+B2EE;B2EE;1103 1161 11B1;B2EE;1103 1161 11B1;
+B2EF;B2EF;1103 1161 11B2;B2EF;1103 1161 11B2;
+B2F0;B2F0;1103 1161 11B3;B2F0;1103 1161 11B3;
+B2F1;B2F1;1103 1161 11B4;B2F1;1103 1161 11B4;
+B2F2;B2F2;1103 1161 11B5;B2F2;1103 1161 11B5;
+B2F3;B2F3;1103 1161 11B6;B2F3;1103 1161 11B6;
+B2F4;B2F4;1103 1161 11B7;B2F4;1103 1161 11B7;
+B2F5;B2F5;1103 1161 11B8;B2F5;1103 1161 11B8;
+B2F6;B2F6;1103 1161 11B9;B2F6;1103 1161 11B9;
+B2F7;B2F7;1103 1161 11BA;B2F7;1103 1161 11BA;
+B2F8;B2F8;1103 1161 11BB;B2F8;1103 1161 11BB;
+B2F9;B2F9;1103 1161 11BC;B2F9;1103 1161 11BC;
+B2FA;B2FA;1103 1161 11BD;B2FA;1103 1161 11BD;
+B2FB;B2FB;1103 1161 11BE;B2FB;1103 1161 11BE;
+B2FC;B2FC;1103 1161 11BF;B2FC;1103 1161 11BF;
+B2FD;B2FD;1103 1161 11C0;B2FD;1103 1161 11C0;
+B2FE;B2FE;1103 1161 11C1;B2FE;1103 1161 11C1;
+B2FF;B2FF;1103 1161 11C2;B2FF;1103 1161 11C2;
+B300;B300;1103 1162;B300;1103 1162;
+B301;B301;1103 1162 11A8;B301;1103 1162 11A8;
+B302;B302;1103 1162 11A9;B302;1103 1162 11A9;
+B303;B303;1103 1162 11AA;B303;1103 1162 11AA;
+B304;B304;1103 1162 11AB;B304;1103 1162 11AB;
+B305;B305;1103 1162 11AC;B305;1103 1162 11AC;
+B306;B306;1103 1162 11AD;B306;1103 1162 11AD;
+B307;B307;1103 1162 11AE;B307;1103 1162 11AE;
+B308;B308;1103 1162 11AF;B308;1103 1162 11AF;
+B309;B309;1103 1162 11B0;B309;1103 1162 11B0;
+B30A;B30A;1103 1162 11B1;B30A;1103 1162 11B1;
+B30B;B30B;1103 1162 11B2;B30B;1103 1162 11B2;
+B30C;B30C;1103 1162 11B3;B30C;1103 1162 11B3;
+B30D;B30D;1103 1162 11B4;B30D;1103 1162 11B4;
+B30E;B30E;1103 1162 11B5;B30E;1103 1162 11B5;
+B30F;B30F;1103 1162 11B6;B30F;1103 1162 11B6;
+B310;B310;1103 1162 11B7;B310;1103 1162 11B7;
+B311;B311;1103 1162 11B8;B311;1103 1162 11B8;
+B312;B312;1103 1162 11B9;B312;1103 1162 11B9;
+B313;B313;1103 1162 11BA;B313;1103 1162 11BA;
+B314;B314;1103 1162 11BB;B314;1103 1162 11BB;
+B315;B315;1103 1162 11BC;B315;1103 1162 11BC;
+B316;B316;1103 1162 11BD;B316;1103 1162 11BD;
+B317;B317;1103 1162 11BE;B317;1103 1162 11BE;
+B318;B318;1103 1162 11BF;B318;1103 1162 11BF;
+B319;B319;1103 1162 11C0;B319;1103 1162 11C0;
+B31A;B31A;1103 1162 11C1;B31A;1103 1162 11C1;
+B31B;B31B;1103 1162 11C2;B31B;1103 1162 11C2;
+B31C;B31C;1103 1163;B31C;1103 1163;
+B31D;B31D;1103 1163 11A8;B31D;1103 1163 11A8;
+B31E;B31E;1103 1163 11A9;B31E;1103 1163 11A9;
+B31F;B31F;1103 1163 11AA;B31F;1103 1163 11AA;
+B320;B320;1103 1163 11AB;B320;1103 1163 11AB;
+B321;B321;1103 1163 11AC;B321;1103 1163 11AC;
+B322;B322;1103 1163 11AD;B322;1103 1163 11AD;
+B323;B323;1103 1163 11AE;B323;1103 1163 11AE;
+B324;B324;1103 1163 11AF;B324;1103 1163 11AF;
+B325;B325;1103 1163 11B0;B325;1103 1163 11B0;
+B326;B326;1103 1163 11B1;B326;1103 1163 11B1;
+B327;B327;1103 1163 11B2;B327;1103 1163 11B2;
+B328;B328;1103 1163 11B3;B328;1103 1163 11B3;
+B329;B329;1103 1163 11B4;B329;1103 1163 11B4;
+B32A;B32A;1103 1163 11B5;B32A;1103 1163 11B5;
+B32B;B32B;1103 1163 11B6;B32B;1103 1163 11B6;
+B32C;B32C;1103 1163 11B7;B32C;1103 1163 11B7;
+B32D;B32D;1103 1163 11B8;B32D;1103 1163 11B8;
+B32E;B32E;1103 1163 11B9;B32E;1103 1163 11B9;
+B32F;B32F;1103 1163 11BA;B32F;1103 1163 11BA;
+B330;B330;1103 1163 11BB;B330;1103 1163 11BB;
+B331;B331;1103 1163 11BC;B331;1103 1163 11BC;
+B332;B332;1103 1163 11BD;B332;1103 1163 11BD;
+B333;B333;1103 1163 11BE;B333;1103 1163 11BE;
+B334;B334;1103 1163 11BF;B334;1103 1163 11BF;
+B335;B335;1103 1163 11C0;B335;1103 1163 11C0;
+B336;B336;1103 1163 11C1;B336;1103 1163 11C1;
+B337;B337;1103 1163 11C2;B337;1103 1163 11C2;
+B338;B338;1103 1164;B338;1103 1164;
+B339;B339;1103 1164 11A8;B339;1103 1164 11A8;
+B33A;B33A;1103 1164 11A9;B33A;1103 1164 11A9;
+B33B;B33B;1103 1164 11AA;B33B;1103 1164 11AA;
+B33C;B33C;1103 1164 11AB;B33C;1103 1164 11AB;
+B33D;B33D;1103 1164 11AC;B33D;1103 1164 11AC;
+B33E;B33E;1103 1164 11AD;B33E;1103 1164 11AD;
+B33F;B33F;1103 1164 11AE;B33F;1103 1164 11AE;
+B340;B340;1103 1164 11AF;B340;1103 1164 11AF;
+B341;B341;1103 1164 11B0;B341;1103 1164 11B0;
+B342;B342;1103 1164 11B1;B342;1103 1164 11B1;
+B343;B343;1103 1164 11B2;B343;1103 1164 11B2;
+B344;B344;1103 1164 11B3;B344;1103 1164 11B3;
+B345;B345;1103 1164 11B4;B345;1103 1164 11B4;
+B346;B346;1103 1164 11B5;B346;1103 1164 11B5;
+B347;B347;1103 1164 11B6;B347;1103 1164 11B6;
+B348;B348;1103 1164 11B7;B348;1103 1164 11B7;
+B349;B349;1103 1164 11B8;B349;1103 1164 11B8;
+B34A;B34A;1103 1164 11B9;B34A;1103 1164 11B9;
+B34B;B34B;1103 1164 11BA;B34B;1103 1164 11BA;
+B34C;B34C;1103 1164 11BB;B34C;1103 1164 11BB;
+B34D;B34D;1103 1164 11BC;B34D;1103 1164 11BC;
+B34E;B34E;1103 1164 11BD;B34E;1103 1164 11BD;
+B34F;B34F;1103 1164 11BE;B34F;1103 1164 11BE;
+B350;B350;1103 1164 11BF;B350;1103 1164 11BF;
+B351;B351;1103 1164 11C0;B351;1103 1164 11C0;
+B352;B352;1103 1164 11C1;B352;1103 1164 11C1;
+B353;B353;1103 1164 11C2;B353;1103 1164 11C2;
+B354;B354;1103 1165;B354;1103 1165;
+B355;B355;1103 1165 11A8;B355;1103 1165 11A8;
+B356;B356;1103 1165 11A9;B356;1103 1165 11A9;
+B357;B357;1103 1165 11AA;B357;1103 1165 11AA;
+B358;B358;1103 1165 11AB;B358;1103 1165 11AB;
+B359;B359;1103 1165 11AC;B359;1103 1165 11AC;
+B35A;B35A;1103 1165 11AD;B35A;1103 1165 11AD;
+B35B;B35B;1103 1165 11AE;B35B;1103 1165 11AE;
+B35C;B35C;1103 1165 11AF;B35C;1103 1165 11AF;
+B35D;B35D;1103 1165 11B0;B35D;1103 1165 11B0;
+B35E;B35E;1103 1165 11B1;B35E;1103 1165 11B1;
+B35F;B35F;1103 1165 11B2;B35F;1103 1165 11B2;
+B360;B360;1103 1165 11B3;B360;1103 1165 11B3;
+B361;B361;1103 1165 11B4;B361;1103 1165 11B4;
+B362;B362;1103 1165 11B5;B362;1103 1165 11B5;
+B363;B363;1103 1165 11B6;B363;1103 1165 11B6;
+B364;B364;1103 1165 11B7;B364;1103 1165 11B7;
+B365;B365;1103 1165 11B8;B365;1103 1165 11B8;
+B366;B366;1103 1165 11B9;B366;1103 1165 11B9;
+B367;B367;1103 1165 11BA;B367;1103 1165 11BA;
+B368;B368;1103 1165 11BB;B368;1103 1165 11BB;
+B369;B369;1103 1165 11BC;B369;1103 1165 11BC;
+B36A;B36A;1103 1165 11BD;B36A;1103 1165 11BD;
+B36B;B36B;1103 1165 11BE;B36B;1103 1165 11BE;
+B36C;B36C;1103 1165 11BF;B36C;1103 1165 11BF;
+B36D;B36D;1103 1165 11C0;B36D;1103 1165 11C0;
+B36E;B36E;1103 1165 11C1;B36E;1103 1165 11C1;
+B36F;B36F;1103 1165 11C2;B36F;1103 1165 11C2;
+B370;B370;1103 1166;B370;1103 1166;
+B371;B371;1103 1166 11A8;B371;1103 1166 11A8;
+B372;B372;1103 1166 11A9;B372;1103 1166 11A9;
+B373;B373;1103 1166 11AA;B373;1103 1166 11AA;
+B374;B374;1103 1166 11AB;B374;1103 1166 11AB;
+B375;B375;1103 1166 11AC;B375;1103 1166 11AC;
+B376;B376;1103 1166 11AD;B376;1103 1166 11AD;
+B377;B377;1103 1166 11AE;B377;1103 1166 11AE;
+B378;B378;1103 1166 11AF;B378;1103 1166 11AF;
+B379;B379;1103 1166 11B0;B379;1103 1166 11B0;
+B37A;B37A;1103 1166 11B1;B37A;1103 1166 11B1;
+B37B;B37B;1103 1166 11B2;B37B;1103 1166 11B2;
+B37C;B37C;1103 1166 11B3;B37C;1103 1166 11B3;
+B37D;B37D;1103 1166 11B4;B37D;1103 1166 11B4;
+B37E;B37E;1103 1166 11B5;B37E;1103 1166 11B5;
+B37F;B37F;1103 1166 11B6;B37F;1103 1166 11B6;
+B380;B380;1103 1166 11B7;B380;1103 1166 11B7;
+B381;B381;1103 1166 11B8;B381;1103 1166 11B8;
+B382;B382;1103 1166 11B9;B382;1103 1166 11B9;
+B383;B383;1103 1166 11BA;B383;1103 1166 11BA;
+B384;B384;1103 1166 11BB;B384;1103 1166 11BB;
+B385;B385;1103 1166 11BC;B385;1103 1166 11BC;
+B386;B386;1103 1166 11BD;B386;1103 1166 11BD;
+B387;B387;1103 1166 11BE;B387;1103 1166 11BE;
+B388;B388;1103 1166 11BF;B388;1103 1166 11BF;
+B389;B389;1103 1166 11C0;B389;1103 1166 11C0;
+B38A;B38A;1103 1166 11C1;B38A;1103 1166 11C1;
+B38B;B38B;1103 1166 11C2;B38B;1103 1166 11C2;
+B38C;B38C;1103 1167;B38C;1103 1167;
+B38D;B38D;1103 1167 11A8;B38D;1103 1167 11A8;
+B38E;B38E;1103 1167 11A9;B38E;1103 1167 11A9;
+B38F;B38F;1103 1167 11AA;B38F;1103 1167 11AA;
+B390;B390;1103 1167 11AB;B390;1103 1167 11AB;
+B391;B391;1103 1167 11AC;B391;1103 1167 11AC;
+B392;B392;1103 1167 11AD;B392;1103 1167 11AD;
+B393;B393;1103 1167 11AE;B393;1103 1167 11AE;
+B394;B394;1103 1167 11AF;B394;1103 1167 11AF;
+B395;B395;1103 1167 11B0;B395;1103 1167 11B0;
+B396;B396;1103 1167 11B1;B396;1103 1167 11B1;
+B397;B397;1103 1167 11B2;B397;1103 1167 11B2;
+B398;B398;1103 1167 11B3;B398;1103 1167 11B3;
+B399;B399;1103 1167 11B4;B399;1103 1167 11B4;
+B39A;B39A;1103 1167 11B5;B39A;1103 1167 11B5;
+B39B;B39B;1103 1167 11B6;B39B;1103 1167 11B6;
+B39C;B39C;1103 1167 11B7;B39C;1103 1167 11B7;
+B39D;B39D;1103 1167 11B8;B39D;1103 1167 11B8;
+B39E;B39E;1103 1167 11B9;B39E;1103 1167 11B9;
+B39F;B39F;1103 1167 11BA;B39F;1103 1167 11BA;
+B3A0;B3A0;1103 1167 11BB;B3A0;1103 1167 11BB;
+B3A1;B3A1;1103 1167 11BC;B3A1;1103 1167 11BC;
+B3A2;B3A2;1103 1167 11BD;B3A2;1103 1167 11BD;
+B3A3;B3A3;1103 1167 11BE;B3A3;1103 1167 11BE;
+B3A4;B3A4;1103 1167 11BF;B3A4;1103 1167 11BF;
+B3A5;B3A5;1103 1167 11C0;B3A5;1103 1167 11C0;
+B3A6;B3A6;1103 1167 11C1;B3A6;1103 1167 11C1;
+B3A7;B3A7;1103 1167 11C2;B3A7;1103 1167 11C2;
+B3A8;B3A8;1103 1168;B3A8;1103 1168;
+B3A9;B3A9;1103 1168 11A8;B3A9;1103 1168 11A8;
+B3AA;B3AA;1103 1168 11A9;B3AA;1103 1168 11A9;
+B3AB;B3AB;1103 1168 11AA;B3AB;1103 1168 11AA;
+B3AC;B3AC;1103 1168 11AB;B3AC;1103 1168 11AB;
+B3AD;B3AD;1103 1168 11AC;B3AD;1103 1168 11AC;
+B3AE;B3AE;1103 1168 11AD;B3AE;1103 1168 11AD;
+B3AF;B3AF;1103 1168 11AE;B3AF;1103 1168 11AE;
+B3B0;B3B0;1103 1168 11AF;B3B0;1103 1168 11AF;
+B3B1;B3B1;1103 1168 11B0;B3B1;1103 1168 11B0;
+B3B2;B3B2;1103 1168 11B1;B3B2;1103 1168 11B1;
+B3B3;B3B3;1103 1168 11B2;B3B3;1103 1168 11B2;
+B3B4;B3B4;1103 1168 11B3;B3B4;1103 1168 11B3;
+B3B5;B3B5;1103 1168 11B4;B3B5;1103 1168 11B4;
+B3B6;B3B6;1103 1168 11B5;B3B6;1103 1168 11B5;
+B3B7;B3B7;1103 1168 11B6;B3B7;1103 1168 11B6;
+B3B8;B3B8;1103 1168 11B7;B3B8;1103 1168 11B7;
+B3B9;B3B9;1103 1168 11B8;B3B9;1103 1168 11B8;
+B3BA;B3BA;1103 1168 11B9;B3BA;1103 1168 11B9;
+B3BB;B3BB;1103 1168 11BA;B3BB;1103 1168 11BA;
+B3BC;B3BC;1103 1168 11BB;B3BC;1103 1168 11BB;
+B3BD;B3BD;1103 1168 11BC;B3BD;1103 1168 11BC;
+B3BE;B3BE;1103 1168 11BD;B3BE;1103 1168 11BD;
+B3BF;B3BF;1103 1168 11BE;B3BF;1103 1168 11BE;
+B3C0;B3C0;1103 1168 11BF;B3C0;1103 1168 11BF;
+B3C1;B3C1;1103 1168 11C0;B3C1;1103 1168 11C0;
+B3C2;B3C2;1103 1168 11C1;B3C2;1103 1168 11C1;
+B3C3;B3C3;1103 1168 11C2;B3C3;1103 1168 11C2;
+B3C4;B3C4;1103 1169;B3C4;1103 1169;
+B3C5;B3C5;1103 1169 11A8;B3C5;1103 1169 11A8;
+B3C6;B3C6;1103 1169 11A9;B3C6;1103 1169 11A9;
+B3C7;B3C7;1103 1169 11AA;B3C7;1103 1169 11AA;
+B3C8;B3C8;1103 1169 11AB;B3C8;1103 1169 11AB;
+B3C9;B3C9;1103 1169 11AC;B3C9;1103 1169 11AC;
+B3CA;B3CA;1103 1169 11AD;B3CA;1103 1169 11AD;
+B3CB;B3CB;1103 1169 11AE;B3CB;1103 1169 11AE;
+B3CC;B3CC;1103 1169 11AF;B3CC;1103 1169 11AF;
+B3CD;B3CD;1103 1169 11B0;B3CD;1103 1169 11B0;
+B3CE;B3CE;1103 1169 11B1;B3CE;1103 1169 11B1;
+B3CF;B3CF;1103 1169 11B2;B3CF;1103 1169 11B2;
+B3D0;B3D0;1103 1169 11B3;B3D0;1103 1169 11B3;
+B3D1;B3D1;1103 1169 11B4;B3D1;1103 1169 11B4;
+B3D2;B3D2;1103 1169 11B5;B3D2;1103 1169 11B5;
+B3D3;B3D3;1103 1169 11B6;B3D3;1103 1169 11B6;
+B3D4;B3D4;1103 1169 11B7;B3D4;1103 1169 11B7;
+B3D5;B3D5;1103 1169 11B8;B3D5;1103 1169 11B8;
+B3D6;B3D6;1103 1169 11B9;B3D6;1103 1169 11B9;
+B3D7;B3D7;1103 1169 11BA;B3D7;1103 1169 11BA;
+B3D8;B3D8;1103 1169 11BB;B3D8;1103 1169 11BB;
+B3D9;B3D9;1103 1169 11BC;B3D9;1103 1169 11BC;
+B3DA;B3DA;1103 1169 11BD;B3DA;1103 1169 11BD;
+B3DB;B3DB;1103 1169 11BE;B3DB;1103 1169 11BE;
+B3DC;B3DC;1103 1169 11BF;B3DC;1103 1169 11BF;
+B3DD;B3DD;1103 1169 11C0;B3DD;1103 1169 11C0;
+B3DE;B3DE;1103 1169 11C1;B3DE;1103 1169 11C1;
+B3DF;B3DF;1103 1169 11C2;B3DF;1103 1169 11C2;
+B3E0;B3E0;1103 116A;B3E0;1103 116A;
+B3E1;B3E1;1103 116A 11A8;B3E1;1103 116A 11A8;
+B3E2;B3E2;1103 116A 11A9;B3E2;1103 116A 11A9;
+B3E3;B3E3;1103 116A 11AA;B3E3;1103 116A 11AA;
+B3E4;B3E4;1103 116A 11AB;B3E4;1103 116A 11AB;
+B3E5;B3E5;1103 116A 11AC;B3E5;1103 116A 11AC;
+B3E6;B3E6;1103 116A 11AD;B3E6;1103 116A 11AD;
+B3E7;B3E7;1103 116A 11AE;B3E7;1103 116A 11AE;
+B3E8;B3E8;1103 116A 11AF;B3E8;1103 116A 11AF;
+B3E9;B3E9;1103 116A 11B0;B3E9;1103 116A 11B0;
+B3EA;B3EA;1103 116A 11B1;B3EA;1103 116A 11B1;
+B3EB;B3EB;1103 116A 11B2;B3EB;1103 116A 11B2;
+B3EC;B3EC;1103 116A 11B3;B3EC;1103 116A 11B3;
+B3ED;B3ED;1103 116A 11B4;B3ED;1103 116A 11B4;
+B3EE;B3EE;1103 116A 11B5;B3EE;1103 116A 11B5;
+B3EF;B3EF;1103 116A 11B6;B3EF;1103 116A 11B6;
+B3F0;B3F0;1103 116A 11B7;B3F0;1103 116A 11B7;
+B3F1;B3F1;1103 116A 11B8;B3F1;1103 116A 11B8;
+B3F2;B3F2;1103 116A 11B9;B3F2;1103 116A 11B9;
+B3F3;B3F3;1103 116A 11BA;B3F3;1103 116A 11BA;
+B3F4;B3F4;1103 116A 11BB;B3F4;1103 116A 11BB;
+B3F5;B3F5;1103 116A 11BC;B3F5;1103 116A 11BC;
+B3F6;B3F6;1103 116A 11BD;B3F6;1103 116A 11BD;
+B3F7;B3F7;1103 116A 11BE;B3F7;1103 116A 11BE;
+B3F8;B3F8;1103 116A 11BF;B3F8;1103 116A 11BF;
+B3F9;B3F9;1103 116A 11C0;B3F9;1103 116A 11C0;
+B3FA;B3FA;1103 116A 11C1;B3FA;1103 116A 11C1;
+B3FB;B3FB;1103 116A 11C2;B3FB;1103 116A 11C2;
+B3FC;B3FC;1103 116B;B3FC;1103 116B;
+B3FD;B3FD;1103 116B 11A8;B3FD;1103 116B 11A8;
+B3FE;B3FE;1103 116B 11A9;B3FE;1103 116B 11A9;
+B3FF;B3FF;1103 116B 11AA;B3FF;1103 116B 11AA;
+B400;B400;1103 116B 11AB;B400;1103 116B 11AB;
+B401;B401;1103 116B 11AC;B401;1103 116B 11AC;
+B402;B402;1103 116B 11AD;B402;1103 116B 11AD;
+B403;B403;1103 116B 11AE;B403;1103 116B 11AE;
+B404;B404;1103 116B 11AF;B404;1103 116B 11AF;
+B405;B405;1103 116B 11B0;B405;1103 116B 11B0;
+B406;B406;1103 116B 11B1;B406;1103 116B 11B1;
+B407;B407;1103 116B 11B2;B407;1103 116B 11B2;
+B408;B408;1103 116B 11B3;B408;1103 116B 11B3;
+B409;B409;1103 116B 11B4;B409;1103 116B 11B4;
+B40A;B40A;1103 116B 11B5;B40A;1103 116B 11B5;
+B40B;B40B;1103 116B 11B6;B40B;1103 116B 11B6;
+B40C;B40C;1103 116B 11B7;B40C;1103 116B 11B7;
+B40D;B40D;1103 116B 11B8;B40D;1103 116B 11B8;
+B40E;B40E;1103 116B 11B9;B40E;1103 116B 11B9;
+B40F;B40F;1103 116B 11BA;B40F;1103 116B 11BA;
+B410;B410;1103 116B 11BB;B410;1103 116B 11BB;
+B411;B411;1103 116B 11BC;B411;1103 116B 11BC;
+B412;B412;1103 116B 11BD;B412;1103 116B 11BD;
+B413;B413;1103 116B 11BE;B413;1103 116B 11BE;
+B414;B414;1103 116B 11BF;B414;1103 116B 11BF;
+B415;B415;1103 116B 11C0;B415;1103 116B 11C0;
+B416;B416;1103 116B 11C1;B416;1103 116B 11C1;
+B417;B417;1103 116B 11C2;B417;1103 116B 11C2;
+B418;B418;1103 116C;B418;1103 116C;
+B419;B419;1103 116C 11A8;B419;1103 116C 11A8;
+B41A;B41A;1103 116C 11A9;B41A;1103 116C 11A9;
+B41B;B41B;1103 116C 11AA;B41B;1103 116C 11AA;
+B41C;B41C;1103 116C 11AB;B41C;1103 116C 11AB;
+B41D;B41D;1103 116C 11AC;B41D;1103 116C 11AC;
+B41E;B41E;1103 116C 11AD;B41E;1103 116C 11AD;
+B41F;B41F;1103 116C 11AE;B41F;1103 116C 11AE;
+B420;B420;1103 116C 11AF;B420;1103 116C 11AF;
+B421;B421;1103 116C 11B0;B421;1103 116C 11B0;
+B422;B422;1103 116C 11B1;B422;1103 116C 11B1;
+B423;B423;1103 116C 11B2;B423;1103 116C 11B2;
+B424;B424;1103 116C 11B3;B424;1103 116C 11B3;
+B425;B425;1103 116C 11B4;B425;1103 116C 11B4;
+B426;B426;1103 116C 11B5;B426;1103 116C 11B5;
+B427;B427;1103 116C 11B6;B427;1103 116C 11B6;
+B428;B428;1103 116C 11B7;B428;1103 116C 11B7;
+B429;B429;1103 116C 11B8;B429;1103 116C 11B8;
+B42A;B42A;1103 116C 11B9;B42A;1103 116C 11B9;
+B42B;B42B;1103 116C 11BA;B42B;1103 116C 11BA;
+B42C;B42C;1103 116C 11BB;B42C;1103 116C 11BB;
+B42D;B42D;1103 116C 11BC;B42D;1103 116C 11BC;
+B42E;B42E;1103 116C 11BD;B42E;1103 116C 11BD;
+B42F;B42F;1103 116C 11BE;B42F;1103 116C 11BE;
+B430;B430;1103 116C 11BF;B430;1103 116C 11BF;
+B431;B431;1103 116C 11C0;B431;1103 116C 11C0;
+B432;B432;1103 116C 11C1;B432;1103 116C 11C1;
+B433;B433;1103 116C 11C2;B433;1103 116C 11C2;
+B434;B434;1103 116D;B434;1103 116D;
+B435;B435;1103 116D 11A8;B435;1103 116D 11A8;
+B436;B436;1103 116D 11A9;B436;1103 116D 11A9;
+B437;B437;1103 116D 11AA;B437;1103 116D 11AA;
+B438;B438;1103 116D 11AB;B438;1103 116D 11AB;
+B439;B439;1103 116D 11AC;B439;1103 116D 11AC;
+B43A;B43A;1103 116D 11AD;B43A;1103 116D 11AD;
+B43B;B43B;1103 116D 11AE;B43B;1103 116D 11AE;
+B43C;B43C;1103 116D 11AF;B43C;1103 116D 11AF;
+B43D;B43D;1103 116D 11B0;B43D;1103 116D 11B0;
+B43E;B43E;1103 116D 11B1;B43E;1103 116D 11B1;
+B43F;B43F;1103 116D 11B2;B43F;1103 116D 11B2;
+B440;B440;1103 116D 11B3;B440;1103 116D 11B3;
+B441;B441;1103 116D 11B4;B441;1103 116D 11B4;
+B442;B442;1103 116D 11B5;B442;1103 116D 11B5;
+B443;B443;1103 116D 11B6;B443;1103 116D 11B6;
+B444;B444;1103 116D 11B7;B444;1103 116D 11B7;
+B445;B445;1103 116D 11B8;B445;1103 116D 11B8;
+B446;B446;1103 116D 11B9;B446;1103 116D 11B9;
+B447;B447;1103 116D 11BA;B447;1103 116D 11BA;
+B448;B448;1103 116D 11BB;B448;1103 116D 11BB;
+B449;B449;1103 116D 11BC;B449;1103 116D 11BC;
+B44A;B44A;1103 116D 11BD;B44A;1103 116D 11BD;
+B44B;B44B;1103 116D 11BE;B44B;1103 116D 11BE;
+B44C;B44C;1103 116D 11BF;B44C;1103 116D 11BF;
+B44D;B44D;1103 116D 11C0;B44D;1103 116D 11C0;
+B44E;B44E;1103 116D 11C1;B44E;1103 116D 11C1;
+B44F;B44F;1103 116D 11C2;B44F;1103 116D 11C2;
+B450;B450;1103 116E;B450;1103 116E;
+B451;B451;1103 116E 11A8;B451;1103 116E 11A8;
+B452;B452;1103 116E 11A9;B452;1103 116E 11A9;
+B453;B453;1103 116E 11AA;B453;1103 116E 11AA;
+B454;B454;1103 116E 11AB;B454;1103 116E 11AB;
+B455;B455;1103 116E 11AC;B455;1103 116E 11AC;
+B456;B456;1103 116E 11AD;B456;1103 116E 11AD;
+B457;B457;1103 116E 11AE;B457;1103 116E 11AE;
+B458;B458;1103 116E 11AF;B458;1103 116E 11AF;
+B459;B459;1103 116E 11B0;B459;1103 116E 11B0;
+B45A;B45A;1103 116E 11B1;B45A;1103 116E 11B1;
+B45B;B45B;1103 116E 11B2;B45B;1103 116E 11B2;
+B45C;B45C;1103 116E 11B3;B45C;1103 116E 11B3;
+B45D;B45D;1103 116E 11B4;B45D;1103 116E 11B4;
+B45E;B45E;1103 116E 11B5;B45E;1103 116E 11B5;
+B45F;B45F;1103 116E 11B6;B45F;1103 116E 11B6;
+B460;B460;1103 116E 11B7;B460;1103 116E 11B7;
+B461;B461;1103 116E 11B8;B461;1103 116E 11B8;
+B462;B462;1103 116E 11B9;B462;1103 116E 11B9;
+B463;B463;1103 116E 11BA;B463;1103 116E 11BA;
+B464;B464;1103 116E 11BB;B464;1103 116E 11BB;
+B465;B465;1103 116E 11BC;B465;1103 116E 11BC;
+B466;B466;1103 116E 11BD;B466;1103 116E 11BD;
+B467;B467;1103 116E 11BE;B467;1103 116E 11BE;
+B468;B468;1103 116E 11BF;B468;1103 116E 11BF;
+B469;B469;1103 116E 11C0;B469;1103 116E 11C0;
+B46A;B46A;1103 116E 11C1;B46A;1103 116E 11C1;
+B46B;B46B;1103 116E 11C2;B46B;1103 116E 11C2;
+B46C;B46C;1103 116F;B46C;1103 116F;
+B46D;B46D;1103 116F 11A8;B46D;1103 116F 11A8;
+B46E;B46E;1103 116F 11A9;B46E;1103 116F 11A9;
+B46F;B46F;1103 116F 11AA;B46F;1103 116F 11AA;
+B470;B470;1103 116F 11AB;B470;1103 116F 11AB;
+B471;B471;1103 116F 11AC;B471;1103 116F 11AC;
+B472;B472;1103 116F 11AD;B472;1103 116F 11AD;
+B473;B473;1103 116F 11AE;B473;1103 116F 11AE;
+B474;B474;1103 116F 11AF;B474;1103 116F 11AF;
+B475;B475;1103 116F 11B0;B475;1103 116F 11B0;
+B476;B476;1103 116F 11B1;B476;1103 116F 11B1;
+B477;B477;1103 116F 11B2;B477;1103 116F 11B2;
+B478;B478;1103 116F 11B3;B478;1103 116F 11B3;
+B479;B479;1103 116F 11B4;B479;1103 116F 11B4;
+B47A;B47A;1103 116F 11B5;B47A;1103 116F 11B5;
+B47B;B47B;1103 116F 11B6;B47B;1103 116F 11B6;
+B47C;B47C;1103 116F 11B7;B47C;1103 116F 11B7;
+B47D;B47D;1103 116F 11B8;B47D;1103 116F 11B8;
+B47E;B47E;1103 116F 11B9;B47E;1103 116F 11B9;
+B47F;B47F;1103 116F 11BA;B47F;1103 116F 11BA;
+B480;B480;1103 116F 11BB;B480;1103 116F 11BB;
+B481;B481;1103 116F 11BC;B481;1103 116F 11BC;
+B482;B482;1103 116F 11BD;B482;1103 116F 11BD;
+B483;B483;1103 116F 11BE;B483;1103 116F 11BE;
+B484;B484;1103 116F 11BF;B484;1103 116F 11BF;
+B485;B485;1103 116F 11C0;B485;1103 116F 11C0;
+B486;B486;1103 116F 11C1;B486;1103 116F 11C1;
+B487;B487;1103 116F 11C2;B487;1103 116F 11C2;
+B488;B488;1103 1170;B488;1103 1170;
+B489;B489;1103 1170 11A8;B489;1103 1170 11A8;
+B48A;B48A;1103 1170 11A9;B48A;1103 1170 11A9;
+B48B;B48B;1103 1170 11AA;B48B;1103 1170 11AA;
+B48C;B48C;1103 1170 11AB;B48C;1103 1170 11AB;
+B48D;B48D;1103 1170 11AC;B48D;1103 1170 11AC;
+B48E;B48E;1103 1170 11AD;B48E;1103 1170 11AD;
+B48F;B48F;1103 1170 11AE;B48F;1103 1170 11AE;
+B490;B490;1103 1170 11AF;B490;1103 1170 11AF;
+B491;B491;1103 1170 11B0;B491;1103 1170 11B0;
+B492;B492;1103 1170 11B1;B492;1103 1170 11B1;
+B493;B493;1103 1170 11B2;B493;1103 1170 11B2;
+B494;B494;1103 1170 11B3;B494;1103 1170 11B3;
+B495;B495;1103 1170 11B4;B495;1103 1170 11B4;
+B496;B496;1103 1170 11B5;B496;1103 1170 11B5;
+B497;B497;1103 1170 11B6;B497;1103 1170 11B6;
+B498;B498;1103 1170 11B7;B498;1103 1170 11B7;
+B499;B499;1103 1170 11B8;B499;1103 1170 11B8;
+B49A;B49A;1103 1170 11B9;B49A;1103 1170 11B9;
+B49B;B49B;1103 1170 11BA;B49B;1103 1170 11BA;
+B49C;B49C;1103 1170 11BB;B49C;1103 1170 11BB;
+B49D;B49D;1103 1170 11BC;B49D;1103 1170 11BC;
+B49E;B49E;1103 1170 11BD;B49E;1103 1170 11BD;
+B49F;B49F;1103 1170 11BE;B49F;1103 1170 11BE;
+B4A0;B4A0;1103 1170 11BF;B4A0;1103 1170 11BF;
+B4A1;B4A1;1103 1170 11C0;B4A1;1103 1170 11C0;
+B4A2;B4A2;1103 1170 11C1;B4A2;1103 1170 11C1;
+B4A3;B4A3;1103 1170 11C2;B4A3;1103 1170 11C2;
+B4A4;B4A4;1103 1171;B4A4;1103 1171;
+B4A5;B4A5;1103 1171 11A8;B4A5;1103 1171 11A8;
+B4A6;B4A6;1103 1171 11A9;B4A6;1103 1171 11A9;
+B4A7;B4A7;1103 1171 11AA;B4A7;1103 1171 11AA;
+B4A8;B4A8;1103 1171 11AB;B4A8;1103 1171 11AB;
+B4A9;B4A9;1103 1171 11AC;B4A9;1103 1171 11AC;
+B4AA;B4AA;1103 1171 11AD;B4AA;1103 1171 11AD;
+B4AB;B4AB;1103 1171 11AE;B4AB;1103 1171 11AE;
+B4AC;B4AC;1103 1171 11AF;B4AC;1103 1171 11AF;
+B4AD;B4AD;1103 1171 11B0;B4AD;1103 1171 11B0;
+B4AE;B4AE;1103 1171 11B1;B4AE;1103 1171 11B1;
+B4AF;B4AF;1103 1171 11B2;B4AF;1103 1171 11B2;
+B4B0;B4B0;1103 1171 11B3;B4B0;1103 1171 11B3;
+B4B1;B4B1;1103 1171 11B4;B4B1;1103 1171 11B4;
+B4B2;B4B2;1103 1171 11B5;B4B2;1103 1171 11B5;
+B4B3;B4B3;1103 1171 11B6;B4B3;1103 1171 11B6;
+B4B4;B4B4;1103 1171 11B7;B4B4;1103 1171 11B7;
+B4B5;B4B5;1103 1171 11B8;B4B5;1103 1171 11B8;
+B4B6;B4B6;1103 1171 11B9;B4B6;1103 1171 11B9;
+B4B7;B4B7;1103 1171 11BA;B4B7;1103 1171 11BA;
+B4B8;B4B8;1103 1171 11BB;B4B8;1103 1171 11BB;
+B4B9;B4B9;1103 1171 11BC;B4B9;1103 1171 11BC;
+B4BA;B4BA;1103 1171 11BD;B4BA;1103 1171 11BD;
+B4BB;B4BB;1103 1171 11BE;B4BB;1103 1171 11BE;
+B4BC;B4BC;1103 1171 11BF;B4BC;1103 1171 11BF;
+B4BD;B4BD;1103 1171 11C0;B4BD;1103 1171 11C0;
+B4BE;B4BE;1103 1171 11C1;B4BE;1103 1171 11C1;
+B4BF;B4BF;1103 1171 11C2;B4BF;1103 1171 11C2;
+B4C0;B4C0;1103 1172;B4C0;1103 1172;
+B4C1;B4C1;1103 1172 11A8;B4C1;1103 1172 11A8;
+B4C2;B4C2;1103 1172 11A9;B4C2;1103 1172 11A9;
+B4C3;B4C3;1103 1172 11AA;B4C3;1103 1172 11AA;
+B4C4;B4C4;1103 1172 11AB;B4C4;1103 1172 11AB;
+B4C5;B4C5;1103 1172 11AC;B4C5;1103 1172 11AC;
+B4C6;B4C6;1103 1172 11AD;B4C6;1103 1172 11AD;
+B4C7;B4C7;1103 1172 11AE;B4C7;1103 1172 11AE;
+B4C8;B4C8;1103 1172 11AF;B4C8;1103 1172 11AF;
+B4C9;B4C9;1103 1172 11B0;B4C9;1103 1172 11B0;
+B4CA;B4CA;1103 1172 11B1;B4CA;1103 1172 11B1;
+B4CB;B4CB;1103 1172 11B2;B4CB;1103 1172 11B2;
+B4CC;B4CC;1103 1172 11B3;B4CC;1103 1172 11B3;
+B4CD;B4CD;1103 1172 11B4;B4CD;1103 1172 11B4;
+B4CE;B4CE;1103 1172 11B5;B4CE;1103 1172 11B5;
+B4CF;B4CF;1103 1172 11B6;B4CF;1103 1172 11B6;
+B4D0;B4D0;1103 1172 11B7;B4D0;1103 1172 11B7;
+B4D1;B4D1;1103 1172 11B8;B4D1;1103 1172 11B8;
+B4D2;B4D2;1103 1172 11B9;B4D2;1103 1172 11B9;
+B4D3;B4D3;1103 1172 11BA;B4D3;1103 1172 11BA;
+B4D4;B4D4;1103 1172 11BB;B4D4;1103 1172 11BB;
+B4D5;B4D5;1103 1172 11BC;B4D5;1103 1172 11BC;
+B4D6;B4D6;1103 1172 11BD;B4D6;1103 1172 11BD;
+B4D7;B4D7;1103 1172 11BE;B4D7;1103 1172 11BE;
+B4D8;B4D8;1103 1172 11BF;B4D8;1103 1172 11BF;
+B4D9;B4D9;1103 1172 11C0;B4D9;1103 1172 11C0;
+B4DA;B4DA;1103 1172 11C1;B4DA;1103 1172 11C1;
+B4DB;B4DB;1103 1172 11C2;B4DB;1103 1172 11C2;
+B4DC;B4DC;1103 1173;B4DC;1103 1173;
+B4DD;B4DD;1103 1173 11A8;B4DD;1103 1173 11A8;
+B4DE;B4DE;1103 1173 11A9;B4DE;1103 1173 11A9;
+B4DF;B4DF;1103 1173 11AA;B4DF;1103 1173 11AA;
+B4E0;B4E0;1103 1173 11AB;B4E0;1103 1173 11AB;
+B4E1;B4E1;1103 1173 11AC;B4E1;1103 1173 11AC;
+B4E2;B4E2;1103 1173 11AD;B4E2;1103 1173 11AD;
+B4E3;B4E3;1103 1173 11AE;B4E3;1103 1173 11AE;
+B4E4;B4E4;1103 1173 11AF;B4E4;1103 1173 11AF;
+B4E5;B4E5;1103 1173 11B0;B4E5;1103 1173 11B0;
+B4E6;B4E6;1103 1173 11B1;B4E6;1103 1173 11B1;
+B4E7;B4E7;1103 1173 11B2;B4E7;1103 1173 11B2;
+B4E8;B4E8;1103 1173 11B3;B4E8;1103 1173 11B3;
+B4E9;B4E9;1103 1173 11B4;B4E9;1103 1173 11B4;
+B4EA;B4EA;1103 1173 11B5;B4EA;1103 1173 11B5;
+B4EB;B4EB;1103 1173 11B6;B4EB;1103 1173 11B6;
+B4EC;B4EC;1103 1173 11B7;B4EC;1103 1173 11B7;
+B4ED;B4ED;1103 1173 11B8;B4ED;1103 1173 11B8;
+B4EE;B4EE;1103 1173 11B9;B4EE;1103 1173 11B9;
+B4EF;B4EF;1103 1173 11BA;B4EF;1103 1173 11BA;
+B4F0;B4F0;1103 1173 11BB;B4F0;1103 1173 11BB;
+B4F1;B4F1;1103 1173 11BC;B4F1;1103 1173 11BC;
+B4F2;B4F2;1103 1173 11BD;B4F2;1103 1173 11BD;
+B4F3;B4F3;1103 1173 11BE;B4F3;1103 1173 11BE;
+B4F4;B4F4;1103 1173 11BF;B4F4;1103 1173 11BF;
+B4F5;B4F5;1103 1173 11C0;B4F5;1103 1173 11C0;
+B4F6;B4F6;1103 1173 11C1;B4F6;1103 1173 11C1;
+B4F7;B4F7;1103 1173 11C2;B4F7;1103 1173 11C2;
+B4F8;B4F8;1103 1174;B4F8;1103 1174;
+B4F9;B4F9;1103 1174 11A8;B4F9;1103 1174 11A8;
+B4FA;B4FA;1103 1174 11A9;B4FA;1103 1174 11A9;
+B4FB;B4FB;1103 1174 11AA;B4FB;1103 1174 11AA;
+B4FC;B4FC;1103 1174 11AB;B4FC;1103 1174 11AB;
+B4FD;B4FD;1103 1174 11AC;B4FD;1103 1174 11AC;
+B4FE;B4FE;1103 1174 11AD;B4FE;1103 1174 11AD;
+B4FF;B4FF;1103 1174 11AE;B4FF;1103 1174 11AE;
+B500;B500;1103 1174 11AF;B500;1103 1174 11AF;
+B501;B501;1103 1174 11B0;B501;1103 1174 11B0;
+B502;B502;1103 1174 11B1;B502;1103 1174 11B1;
+B503;B503;1103 1174 11B2;B503;1103 1174 11B2;
+B504;B504;1103 1174 11B3;B504;1103 1174 11B3;
+B505;B505;1103 1174 11B4;B505;1103 1174 11B4;
+B506;B506;1103 1174 11B5;B506;1103 1174 11B5;
+B507;B507;1103 1174 11B6;B507;1103 1174 11B6;
+B508;B508;1103 1174 11B7;B508;1103 1174 11B7;
+B509;B509;1103 1174 11B8;B509;1103 1174 11B8;
+B50A;B50A;1103 1174 11B9;B50A;1103 1174 11B9;
+B50B;B50B;1103 1174 11BA;B50B;1103 1174 11BA;
+B50C;B50C;1103 1174 11BB;B50C;1103 1174 11BB;
+B50D;B50D;1103 1174 11BC;B50D;1103 1174 11BC;
+B50E;B50E;1103 1174 11BD;B50E;1103 1174 11BD;
+B50F;B50F;1103 1174 11BE;B50F;1103 1174 11BE;
+B510;B510;1103 1174 11BF;B510;1103 1174 11BF;
+B511;B511;1103 1174 11C0;B511;1103 1174 11C0;
+B512;B512;1103 1174 11C1;B512;1103 1174 11C1;
+B513;B513;1103 1174 11C2;B513;1103 1174 11C2;
+B514;B514;1103 1175;B514;1103 1175;
+B515;B515;1103 1175 11A8;B515;1103 1175 11A8;
+B516;B516;1103 1175 11A9;B516;1103 1175 11A9;
+B517;B517;1103 1175 11AA;B517;1103 1175 11AA;
+B518;B518;1103 1175 11AB;B518;1103 1175 11AB;
+B519;B519;1103 1175 11AC;B519;1103 1175 11AC;
+B51A;B51A;1103 1175 11AD;B51A;1103 1175 11AD;
+B51B;B51B;1103 1175 11AE;B51B;1103 1175 11AE;
+B51C;B51C;1103 1175 11AF;B51C;1103 1175 11AF;
+B51D;B51D;1103 1175 11B0;B51D;1103 1175 11B0;
+B51E;B51E;1103 1175 11B1;B51E;1103 1175 11B1;
+B51F;B51F;1103 1175 11B2;B51F;1103 1175 11B2;
+B520;B520;1103 1175 11B3;B520;1103 1175 11B3;
+B521;B521;1103 1175 11B4;B521;1103 1175 11B4;
+B522;B522;1103 1175 11B5;B522;1103 1175 11B5;
+B523;B523;1103 1175 11B6;B523;1103 1175 11B6;
+B524;B524;1103 1175 11B7;B524;1103 1175 11B7;
+B525;B525;1103 1175 11B8;B525;1103 1175 11B8;
+B526;B526;1103 1175 11B9;B526;1103 1175 11B9;
+B527;B527;1103 1175 11BA;B527;1103 1175 11BA;
+B528;B528;1103 1175 11BB;B528;1103 1175 11BB;
+B529;B529;1103 1175 11BC;B529;1103 1175 11BC;
+B52A;B52A;1103 1175 11BD;B52A;1103 1175 11BD;
+B52B;B52B;1103 1175 11BE;B52B;1103 1175 11BE;
+B52C;B52C;1103 1175 11BF;B52C;1103 1175 11BF;
+B52D;B52D;1103 1175 11C0;B52D;1103 1175 11C0;
+B52E;B52E;1103 1175 11C1;B52E;1103 1175 11C1;
+B52F;B52F;1103 1175 11C2;B52F;1103 1175 11C2;
+B530;B530;1104 1161;B530;1104 1161;
+B531;B531;1104 1161 11A8;B531;1104 1161 11A8;
+B532;B532;1104 1161 11A9;B532;1104 1161 11A9;
+B533;B533;1104 1161 11AA;B533;1104 1161 11AA;
+B534;B534;1104 1161 11AB;B534;1104 1161 11AB;
+B535;B535;1104 1161 11AC;B535;1104 1161 11AC;
+B536;B536;1104 1161 11AD;B536;1104 1161 11AD;
+B537;B537;1104 1161 11AE;B537;1104 1161 11AE;
+B538;B538;1104 1161 11AF;B538;1104 1161 11AF;
+B539;B539;1104 1161 11B0;B539;1104 1161 11B0;
+B53A;B53A;1104 1161 11B1;B53A;1104 1161 11B1;
+B53B;B53B;1104 1161 11B2;B53B;1104 1161 11B2;
+B53C;B53C;1104 1161 11B3;B53C;1104 1161 11B3;
+B53D;B53D;1104 1161 11B4;B53D;1104 1161 11B4;
+B53E;B53E;1104 1161 11B5;B53E;1104 1161 11B5;
+B53F;B53F;1104 1161 11B6;B53F;1104 1161 11B6;
+B540;B540;1104 1161 11B7;B540;1104 1161 11B7;
+B541;B541;1104 1161 11B8;B541;1104 1161 11B8;
+B542;B542;1104 1161 11B9;B542;1104 1161 11B9;
+B543;B543;1104 1161 11BA;B543;1104 1161 11BA;
+B544;B544;1104 1161 11BB;B544;1104 1161 11BB;
+B545;B545;1104 1161 11BC;B545;1104 1161 11BC;
+B546;B546;1104 1161 11BD;B546;1104 1161 11BD;
+B547;B547;1104 1161 11BE;B547;1104 1161 11BE;
+B548;B548;1104 1161 11BF;B548;1104 1161 11BF;
+B549;B549;1104 1161 11C0;B549;1104 1161 11C0;
+B54A;B54A;1104 1161 11C1;B54A;1104 1161 11C1;
+B54B;B54B;1104 1161 11C2;B54B;1104 1161 11C2;
+B54C;B54C;1104 1162;B54C;1104 1162;
+B54D;B54D;1104 1162 11A8;B54D;1104 1162 11A8;
+B54E;B54E;1104 1162 11A9;B54E;1104 1162 11A9;
+B54F;B54F;1104 1162 11AA;B54F;1104 1162 11AA;
+B550;B550;1104 1162 11AB;B550;1104 1162 11AB;
+B551;B551;1104 1162 11AC;B551;1104 1162 11AC;
+B552;B552;1104 1162 11AD;B552;1104 1162 11AD;
+B553;B553;1104 1162 11AE;B553;1104 1162 11AE;
+B554;B554;1104 1162 11AF;B554;1104 1162 11AF;
+B555;B555;1104 1162 11B0;B555;1104 1162 11B0;
+B556;B556;1104 1162 11B1;B556;1104 1162 11B1;
+B557;B557;1104 1162 11B2;B557;1104 1162 11B2;
+B558;B558;1104 1162 11B3;B558;1104 1162 11B3;
+B559;B559;1104 1162 11B4;B559;1104 1162 11B4;
+B55A;B55A;1104 1162 11B5;B55A;1104 1162 11B5;
+B55B;B55B;1104 1162 11B6;B55B;1104 1162 11B6;
+B55C;B55C;1104 1162 11B7;B55C;1104 1162 11B7;
+B55D;B55D;1104 1162 11B8;B55D;1104 1162 11B8;
+B55E;B55E;1104 1162 11B9;B55E;1104 1162 11B9;
+B55F;B55F;1104 1162 11BA;B55F;1104 1162 11BA;
+B560;B560;1104 1162 11BB;B560;1104 1162 11BB;
+B561;B561;1104 1162 11BC;B561;1104 1162 11BC;
+B562;B562;1104 1162 11BD;B562;1104 1162 11BD;
+B563;B563;1104 1162 11BE;B563;1104 1162 11BE;
+B564;B564;1104 1162 11BF;B564;1104 1162 11BF;
+B565;B565;1104 1162 11C0;B565;1104 1162 11C0;
+B566;B566;1104 1162 11C1;B566;1104 1162 11C1;
+B567;B567;1104 1162 11C2;B567;1104 1162 11C2;
+B568;B568;1104 1163;B568;1104 1163;
+B569;B569;1104 1163 11A8;B569;1104 1163 11A8;
+B56A;B56A;1104 1163 11A9;B56A;1104 1163 11A9;
+B56B;B56B;1104 1163 11AA;B56B;1104 1163 11AA;
+B56C;B56C;1104 1163 11AB;B56C;1104 1163 11AB;
+B56D;B56D;1104 1163 11AC;B56D;1104 1163 11AC;
+B56E;B56E;1104 1163 11AD;B56E;1104 1163 11AD;
+B56F;B56F;1104 1163 11AE;B56F;1104 1163 11AE;
+B570;B570;1104 1163 11AF;B570;1104 1163 11AF;
+B571;B571;1104 1163 11B0;B571;1104 1163 11B0;
+B572;B572;1104 1163 11B1;B572;1104 1163 11B1;
+B573;B573;1104 1163 11B2;B573;1104 1163 11B2;
+B574;B574;1104 1163 11B3;B574;1104 1163 11B3;
+B575;B575;1104 1163 11B4;B575;1104 1163 11B4;
+B576;B576;1104 1163 11B5;B576;1104 1163 11B5;
+B577;B577;1104 1163 11B6;B577;1104 1163 11B6;
+B578;B578;1104 1163 11B7;B578;1104 1163 11B7;
+B579;B579;1104 1163 11B8;B579;1104 1163 11B8;
+B57A;B57A;1104 1163 11B9;B57A;1104 1163 11B9;
+B57B;B57B;1104 1163 11BA;B57B;1104 1163 11BA;
+B57C;B57C;1104 1163 11BB;B57C;1104 1163 11BB;
+B57D;B57D;1104 1163 11BC;B57D;1104 1163 11BC;
+B57E;B57E;1104 1163 11BD;B57E;1104 1163 11BD;
+B57F;B57F;1104 1163 11BE;B57F;1104 1163 11BE;
+B580;B580;1104 1163 11BF;B580;1104 1163 11BF;
+B581;B581;1104 1163 11C0;B581;1104 1163 11C0;
+B582;B582;1104 1163 11C1;B582;1104 1163 11C1;
+B583;B583;1104 1163 11C2;B583;1104 1163 11C2;
+B584;B584;1104 1164;B584;1104 1164;
+B585;B585;1104 1164 11A8;B585;1104 1164 11A8;
+B586;B586;1104 1164 11A9;B586;1104 1164 11A9;
+B587;B587;1104 1164 11AA;B587;1104 1164 11AA;
+B588;B588;1104 1164 11AB;B588;1104 1164 11AB;
+B589;B589;1104 1164 11AC;B589;1104 1164 11AC;
+B58A;B58A;1104 1164 11AD;B58A;1104 1164 11AD;
+B58B;B58B;1104 1164 11AE;B58B;1104 1164 11AE;
+B58C;B58C;1104 1164 11AF;B58C;1104 1164 11AF;
+B58D;B58D;1104 1164 11B0;B58D;1104 1164 11B0;
+B58E;B58E;1104 1164 11B1;B58E;1104 1164 11B1;
+B58F;B58F;1104 1164 11B2;B58F;1104 1164 11B2;
+B590;B590;1104 1164 11B3;B590;1104 1164 11B3;
+B591;B591;1104 1164 11B4;B591;1104 1164 11B4;
+B592;B592;1104 1164 11B5;B592;1104 1164 11B5;
+B593;B593;1104 1164 11B6;B593;1104 1164 11B6;
+B594;B594;1104 1164 11B7;B594;1104 1164 11B7;
+B595;B595;1104 1164 11B8;B595;1104 1164 11B8;
+B596;B596;1104 1164 11B9;B596;1104 1164 11B9;
+B597;B597;1104 1164 11BA;B597;1104 1164 11BA;
+B598;B598;1104 1164 11BB;B598;1104 1164 11BB;
+B599;B599;1104 1164 11BC;B599;1104 1164 11BC;
+B59A;B59A;1104 1164 11BD;B59A;1104 1164 11BD;
+B59B;B59B;1104 1164 11BE;B59B;1104 1164 11BE;
+B59C;B59C;1104 1164 11BF;B59C;1104 1164 11BF;
+B59D;B59D;1104 1164 11C0;B59D;1104 1164 11C0;
+B59E;B59E;1104 1164 11C1;B59E;1104 1164 11C1;
+B59F;B59F;1104 1164 11C2;B59F;1104 1164 11C2;
+B5A0;B5A0;1104 1165;B5A0;1104 1165;
+B5A1;B5A1;1104 1165 11A8;B5A1;1104 1165 11A8;
+B5A2;B5A2;1104 1165 11A9;B5A2;1104 1165 11A9;
+B5A3;B5A3;1104 1165 11AA;B5A3;1104 1165 11AA;
+B5A4;B5A4;1104 1165 11AB;B5A4;1104 1165 11AB;
+B5A5;B5A5;1104 1165 11AC;B5A5;1104 1165 11AC;
+B5A6;B5A6;1104 1165 11AD;B5A6;1104 1165 11AD;
+B5A7;B5A7;1104 1165 11AE;B5A7;1104 1165 11AE;
+B5A8;B5A8;1104 1165 11AF;B5A8;1104 1165 11AF;
+B5A9;B5A9;1104 1165 11B0;B5A9;1104 1165 11B0;
+B5AA;B5AA;1104 1165 11B1;B5AA;1104 1165 11B1;
+B5AB;B5AB;1104 1165 11B2;B5AB;1104 1165 11B2;
+B5AC;B5AC;1104 1165 11B3;B5AC;1104 1165 11B3;
+B5AD;B5AD;1104 1165 11B4;B5AD;1104 1165 11B4;
+B5AE;B5AE;1104 1165 11B5;B5AE;1104 1165 11B5;
+B5AF;B5AF;1104 1165 11B6;B5AF;1104 1165 11B6;
+B5B0;B5B0;1104 1165 11B7;B5B0;1104 1165 11B7;
+B5B1;B5B1;1104 1165 11B8;B5B1;1104 1165 11B8;
+B5B2;B5B2;1104 1165 11B9;B5B2;1104 1165 11B9;
+B5B3;B5B3;1104 1165 11BA;B5B3;1104 1165 11BA;
+B5B4;B5B4;1104 1165 11BB;B5B4;1104 1165 11BB;
+B5B5;B5B5;1104 1165 11BC;B5B5;1104 1165 11BC;
+B5B6;B5B6;1104 1165 11BD;B5B6;1104 1165 11BD;
+B5B7;B5B7;1104 1165 11BE;B5B7;1104 1165 11BE;
+B5B8;B5B8;1104 1165 11BF;B5B8;1104 1165 11BF;
+B5B9;B5B9;1104 1165 11C0;B5B9;1104 1165 11C0;
+B5BA;B5BA;1104 1165 11C1;B5BA;1104 1165 11C1;
+B5BB;B5BB;1104 1165 11C2;B5BB;1104 1165 11C2;
+B5BC;B5BC;1104 1166;B5BC;1104 1166;
+B5BD;B5BD;1104 1166 11A8;B5BD;1104 1166 11A8;
+B5BE;B5BE;1104 1166 11A9;B5BE;1104 1166 11A9;
+B5BF;B5BF;1104 1166 11AA;B5BF;1104 1166 11AA;
+B5C0;B5C0;1104 1166 11AB;B5C0;1104 1166 11AB;
+B5C1;B5C1;1104 1166 11AC;B5C1;1104 1166 11AC;
+B5C2;B5C2;1104 1166 11AD;B5C2;1104 1166 11AD;
+B5C3;B5C3;1104 1166 11AE;B5C3;1104 1166 11AE;
+B5C4;B5C4;1104 1166 11AF;B5C4;1104 1166 11AF;
+B5C5;B5C5;1104 1166 11B0;B5C5;1104 1166 11B0;
+B5C6;B5C6;1104 1166 11B1;B5C6;1104 1166 11B1;
+B5C7;B5C7;1104 1166 11B2;B5C7;1104 1166 11B2;
+B5C8;B5C8;1104 1166 11B3;B5C8;1104 1166 11B3;
+B5C9;B5C9;1104 1166 11B4;B5C9;1104 1166 11B4;
+B5CA;B5CA;1104 1166 11B5;B5CA;1104 1166 11B5;
+B5CB;B5CB;1104 1166 11B6;B5CB;1104 1166 11B6;
+B5CC;B5CC;1104 1166 11B7;B5CC;1104 1166 11B7;
+B5CD;B5CD;1104 1166 11B8;B5CD;1104 1166 11B8;
+B5CE;B5CE;1104 1166 11B9;B5CE;1104 1166 11B9;
+B5CF;B5CF;1104 1166 11BA;B5CF;1104 1166 11BA;
+B5D0;B5D0;1104 1166 11BB;B5D0;1104 1166 11BB;
+B5D1;B5D1;1104 1166 11BC;B5D1;1104 1166 11BC;
+B5D2;B5D2;1104 1166 11BD;B5D2;1104 1166 11BD;
+B5D3;B5D3;1104 1166 11BE;B5D3;1104 1166 11BE;
+B5D4;B5D4;1104 1166 11BF;B5D4;1104 1166 11BF;
+B5D5;B5D5;1104 1166 11C0;B5D5;1104 1166 11C0;
+B5D6;B5D6;1104 1166 11C1;B5D6;1104 1166 11C1;
+B5D7;B5D7;1104 1166 11C2;B5D7;1104 1166 11C2;
+B5D8;B5D8;1104 1167;B5D8;1104 1167;
+B5D9;B5D9;1104 1167 11A8;B5D9;1104 1167 11A8;
+B5DA;B5DA;1104 1167 11A9;B5DA;1104 1167 11A9;
+B5DB;B5DB;1104 1167 11AA;B5DB;1104 1167 11AA;
+B5DC;B5DC;1104 1167 11AB;B5DC;1104 1167 11AB;
+B5DD;B5DD;1104 1167 11AC;B5DD;1104 1167 11AC;
+B5DE;B5DE;1104 1167 11AD;B5DE;1104 1167 11AD;
+B5DF;B5DF;1104 1167 11AE;B5DF;1104 1167 11AE;
+B5E0;B5E0;1104 1167 11AF;B5E0;1104 1167 11AF;
+B5E1;B5E1;1104 1167 11B0;B5E1;1104 1167 11B0;
+B5E2;B5E2;1104 1167 11B1;B5E2;1104 1167 11B1;
+B5E3;B5E3;1104 1167 11B2;B5E3;1104 1167 11B2;
+B5E4;B5E4;1104 1167 11B3;B5E4;1104 1167 11B3;
+B5E5;B5E5;1104 1167 11B4;B5E5;1104 1167 11B4;
+B5E6;B5E6;1104 1167 11B5;B5E6;1104 1167 11B5;
+B5E7;B5E7;1104 1167 11B6;B5E7;1104 1167 11B6;
+B5E8;B5E8;1104 1167 11B7;B5E8;1104 1167 11B7;
+B5E9;B5E9;1104 1167 11B8;B5E9;1104 1167 11B8;
+B5EA;B5EA;1104 1167 11B9;B5EA;1104 1167 11B9;
+B5EB;B5EB;1104 1167 11BA;B5EB;1104 1167 11BA;
+B5EC;B5EC;1104 1167 11BB;B5EC;1104 1167 11BB;
+B5ED;B5ED;1104 1167 11BC;B5ED;1104 1167 11BC;
+B5EE;B5EE;1104 1167 11BD;B5EE;1104 1167 11BD;
+B5EF;B5EF;1104 1167 11BE;B5EF;1104 1167 11BE;
+B5F0;B5F0;1104 1167 11BF;B5F0;1104 1167 11BF;
+B5F1;B5F1;1104 1167 11C0;B5F1;1104 1167 11C0;
+B5F2;B5F2;1104 1167 11C1;B5F2;1104 1167 11C1;
+B5F3;B5F3;1104 1167 11C2;B5F3;1104 1167 11C2;
+B5F4;B5F4;1104 1168;B5F4;1104 1168;
+B5F5;B5F5;1104 1168 11A8;B5F5;1104 1168 11A8;
+B5F6;B5F6;1104 1168 11A9;B5F6;1104 1168 11A9;
+B5F7;B5F7;1104 1168 11AA;B5F7;1104 1168 11AA;
+B5F8;B5F8;1104 1168 11AB;B5F8;1104 1168 11AB;
+B5F9;B5F9;1104 1168 11AC;B5F9;1104 1168 11AC;
+B5FA;B5FA;1104 1168 11AD;B5FA;1104 1168 11AD;
+B5FB;B5FB;1104 1168 11AE;B5FB;1104 1168 11AE;
+B5FC;B5FC;1104 1168 11AF;B5FC;1104 1168 11AF;
+B5FD;B5FD;1104 1168 11B0;B5FD;1104 1168 11B0;
+B5FE;B5FE;1104 1168 11B1;B5FE;1104 1168 11B1;
+B5FF;B5FF;1104 1168 11B2;B5FF;1104 1168 11B2;
+B600;B600;1104 1168 11B3;B600;1104 1168 11B3;
+B601;B601;1104 1168 11B4;B601;1104 1168 11B4;
+B602;B602;1104 1168 11B5;B602;1104 1168 11B5;
+B603;B603;1104 1168 11B6;B603;1104 1168 11B6;
+B604;B604;1104 1168 11B7;B604;1104 1168 11B7;
+B605;B605;1104 1168 11B8;B605;1104 1168 11B8;
+B606;B606;1104 1168 11B9;B606;1104 1168 11B9;
+B607;B607;1104 1168 11BA;B607;1104 1168 11BA;
+B608;B608;1104 1168 11BB;B608;1104 1168 11BB;
+B609;B609;1104 1168 11BC;B609;1104 1168 11BC;
+B60A;B60A;1104 1168 11BD;B60A;1104 1168 11BD;
+B60B;B60B;1104 1168 11BE;B60B;1104 1168 11BE;
+B60C;B60C;1104 1168 11BF;B60C;1104 1168 11BF;
+B60D;B60D;1104 1168 11C0;B60D;1104 1168 11C0;
+B60E;B60E;1104 1168 11C1;B60E;1104 1168 11C1;
+B60F;B60F;1104 1168 11C2;B60F;1104 1168 11C2;
+B610;B610;1104 1169;B610;1104 1169;
+B611;B611;1104 1169 11A8;B611;1104 1169 11A8;
+B612;B612;1104 1169 11A9;B612;1104 1169 11A9;
+B613;B613;1104 1169 11AA;B613;1104 1169 11AA;
+B614;B614;1104 1169 11AB;B614;1104 1169 11AB;
+B615;B615;1104 1169 11AC;B615;1104 1169 11AC;
+B616;B616;1104 1169 11AD;B616;1104 1169 11AD;
+B617;B617;1104 1169 11AE;B617;1104 1169 11AE;
+B618;B618;1104 1169 11AF;B618;1104 1169 11AF;
+B619;B619;1104 1169 11B0;B619;1104 1169 11B0;
+B61A;B61A;1104 1169 11B1;B61A;1104 1169 11B1;
+B61B;B61B;1104 1169 11B2;B61B;1104 1169 11B2;
+B61C;B61C;1104 1169 11B3;B61C;1104 1169 11B3;
+B61D;B61D;1104 1169 11B4;B61D;1104 1169 11B4;
+B61E;B61E;1104 1169 11B5;B61E;1104 1169 11B5;
+B61F;B61F;1104 1169 11B6;B61F;1104 1169 11B6;
+B620;B620;1104 1169 11B7;B620;1104 1169 11B7;
+B621;B621;1104 1169 11B8;B621;1104 1169 11B8;
+B622;B622;1104 1169 11B9;B622;1104 1169 11B9;
+B623;B623;1104 1169 11BA;B623;1104 1169 11BA;
+B624;B624;1104 1169 11BB;B624;1104 1169 11BB;
+B625;B625;1104 1169 11BC;B625;1104 1169 11BC;
+B626;B626;1104 1169 11BD;B626;1104 1169 11BD;
+B627;B627;1104 1169 11BE;B627;1104 1169 11BE;
+B628;B628;1104 1169 11BF;B628;1104 1169 11BF;
+B629;B629;1104 1169 11C0;B629;1104 1169 11C0;
+B62A;B62A;1104 1169 11C1;B62A;1104 1169 11C1;
+B62B;B62B;1104 1169 11C2;B62B;1104 1169 11C2;
+B62C;B62C;1104 116A;B62C;1104 116A;
+B62D;B62D;1104 116A 11A8;B62D;1104 116A 11A8;
+B62E;B62E;1104 116A 11A9;B62E;1104 116A 11A9;
+B62F;B62F;1104 116A 11AA;B62F;1104 116A 11AA;
+B630;B630;1104 116A 11AB;B630;1104 116A 11AB;
+B631;B631;1104 116A 11AC;B631;1104 116A 11AC;
+B632;B632;1104 116A 11AD;B632;1104 116A 11AD;
+B633;B633;1104 116A 11AE;B633;1104 116A 11AE;
+B634;B634;1104 116A 11AF;B634;1104 116A 11AF;
+B635;B635;1104 116A 11B0;B635;1104 116A 11B0;
+B636;B636;1104 116A 11B1;B636;1104 116A 11B1;
+B637;B637;1104 116A 11B2;B637;1104 116A 11B2;
+B638;B638;1104 116A 11B3;B638;1104 116A 11B3;
+B639;B639;1104 116A 11B4;B639;1104 116A 11B4;
+B63A;B63A;1104 116A 11B5;B63A;1104 116A 11B5;
+B63B;B63B;1104 116A 11B6;B63B;1104 116A 11B6;
+B63C;B63C;1104 116A 11B7;B63C;1104 116A 11B7;
+B63D;B63D;1104 116A 11B8;B63D;1104 116A 11B8;
+B63E;B63E;1104 116A 11B9;B63E;1104 116A 11B9;
+B63F;B63F;1104 116A 11BA;B63F;1104 116A 11BA;
+B640;B640;1104 116A 11BB;B640;1104 116A 11BB;
+B641;B641;1104 116A 11BC;B641;1104 116A 11BC;
+B642;B642;1104 116A 11BD;B642;1104 116A 11BD;
+B643;B643;1104 116A 11BE;B643;1104 116A 11BE;
+B644;B644;1104 116A 11BF;B644;1104 116A 11BF;
+B645;B645;1104 116A 11C0;B645;1104 116A 11C0;
+B646;B646;1104 116A 11C1;B646;1104 116A 11C1;
+B647;B647;1104 116A 11C2;B647;1104 116A 11C2;
+B648;B648;1104 116B;B648;1104 116B;
+B649;B649;1104 116B 11A8;B649;1104 116B 11A8;
+B64A;B64A;1104 116B 11A9;B64A;1104 116B 11A9;
+B64B;B64B;1104 116B 11AA;B64B;1104 116B 11AA;
+B64C;B64C;1104 116B 11AB;B64C;1104 116B 11AB;
+B64D;B64D;1104 116B 11AC;B64D;1104 116B 11AC;
+B64E;B64E;1104 116B 11AD;B64E;1104 116B 11AD;
+B64F;B64F;1104 116B 11AE;B64F;1104 116B 11AE;
+B650;B650;1104 116B 11AF;B650;1104 116B 11AF;
+B651;B651;1104 116B 11B0;B651;1104 116B 11B0;
+B652;B652;1104 116B 11B1;B652;1104 116B 11B1;
+B653;B653;1104 116B 11B2;B653;1104 116B 11B2;
+B654;B654;1104 116B 11B3;B654;1104 116B 11B3;
+B655;B655;1104 116B 11B4;B655;1104 116B 11B4;
+B656;B656;1104 116B 11B5;B656;1104 116B 11B5;
+B657;B657;1104 116B 11B6;B657;1104 116B 11B6;
+B658;B658;1104 116B 11B7;B658;1104 116B 11B7;
+B659;B659;1104 116B 11B8;B659;1104 116B 11B8;
+B65A;B65A;1104 116B 11B9;B65A;1104 116B 11B9;
+B65B;B65B;1104 116B 11BA;B65B;1104 116B 11BA;
+B65C;B65C;1104 116B 11BB;B65C;1104 116B 11BB;
+B65D;B65D;1104 116B 11BC;B65D;1104 116B 11BC;
+B65E;B65E;1104 116B 11BD;B65E;1104 116B 11BD;
+B65F;B65F;1104 116B 11BE;B65F;1104 116B 11BE;
+B660;B660;1104 116B 11BF;B660;1104 116B 11BF;
+B661;B661;1104 116B 11C0;B661;1104 116B 11C0;
+B662;B662;1104 116B 11C1;B662;1104 116B 11C1;
+B663;B663;1104 116B 11C2;B663;1104 116B 11C2;
+B664;B664;1104 116C;B664;1104 116C;
+B665;B665;1104 116C 11A8;B665;1104 116C 11A8;
+B666;B666;1104 116C 11A9;B666;1104 116C 11A9;
+B667;B667;1104 116C 11AA;B667;1104 116C 11AA;
+B668;B668;1104 116C 11AB;B668;1104 116C 11AB;
+B669;B669;1104 116C 11AC;B669;1104 116C 11AC;
+B66A;B66A;1104 116C 11AD;B66A;1104 116C 11AD;
+B66B;B66B;1104 116C 11AE;B66B;1104 116C 11AE;
+B66C;B66C;1104 116C 11AF;B66C;1104 116C 11AF;
+B66D;B66D;1104 116C 11B0;B66D;1104 116C 11B0;
+B66E;B66E;1104 116C 11B1;B66E;1104 116C 11B1;
+B66F;B66F;1104 116C 11B2;B66F;1104 116C 11B2;
+B670;B670;1104 116C 11B3;B670;1104 116C 11B3;
+B671;B671;1104 116C 11B4;B671;1104 116C 11B4;
+B672;B672;1104 116C 11B5;B672;1104 116C 11B5;
+B673;B673;1104 116C 11B6;B673;1104 116C 11B6;
+B674;B674;1104 116C 11B7;B674;1104 116C 11B7;
+B675;B675;1104 116C 11B8;B675;1104 116C 11B8;
+B676;B676;1104 116C 11B9;B676;1104 116C 11B9;
+B677;B677;1104 116C 11BA;B677;1104 116C 11BA;
+B678;B678;1104 116C 11BB;B678;1104 116C 11BB;
+B679;B679;1104 116C 11BC;B679;1104 116C 11BC;
+B67A;B67A;1104 116C 11BD;B67A;1104 116C 11BD;
+B67B;B67B;1104 116C 11BE;B67B;1104 116C 11BE;
+B67C;B67C;1104 116C 11BF;B67C;1104 116C 11BF;
+B67D;B67D;1104 116C 11C0;B67D;1104 116C 11C0;
+B67E;B67E;1104 116C 11C1;B67E;1104 116C 11C1;
+B67F;B67F;1104 116C 11C2;B67F;1104 116C 11C2;
+B680;B680;1104 116D;B680;1104 116D;
+B681;B681;1104 116D 11A8;B681;1104 116D 11A8;
+B682;B682;1104 116D 11A9;B682;1104 116D 11A9;
+B683;B683;1104 116D 11AA;B683;1104 116D 11AA;
+B684;B684;1104 116D 11AB;B684;1104 116D 11AB;
+B685;B685;1104 116D 11AC;B685;1104 116D 11AC;
+B686;B686;1104 116D 11AD;B686;1104 116D 11AD;
+B687;B687;1104 116D 11AE;B687;1104 116D 11AE;
+B688;B688;1104 116D 11AF;B688;1104 116D 11AF;
+B689;B689;1104 116D 11B0;B689;1104 116D 11B0;
+B68A;B68A;1104 116D 11B1;B68A;1104 116D 11B1;
+B68B;B68B;1104 116D 11B2;B68B;1104 116D 11B2;
+B68C;B68C;1104 116D 11B3;B68C;1104 116D 11B3;
+B68D;B68D;1104 116D 11B4;B68D;1104 116D 11B4;
+B68E;B68E;1104 116D 11B5;B68E;1104 116D 11B5;
+B68F;B68F;1104 116D 11B6;B68F;1104 116D 11B6;
+B690;B690;1104 116D 11B7;B690;1104 116D 11B7;
+B691;B691;1104 116D 11B8;B691;1104 116D 11B8;
+B692;B692;1104 116D 11B9;B692;1104 116D 11B9;
+B693;B693;1104 116D 11BA;B693;1104 116D 11BA;
+B694;B694;1104 116D 11BB;B694;1104 116D 11BB;
+B695;B695;1104 116D 11BC;B695;1104 116D 11BC;
+B696;B696;1104 116D 11BD;B696;1104 116D 11BD;
+B697;B697;1104 116D 11BE;B697;1104 116D 11BE;
+B698;B698;1104 116D 11BF;B698;1104 116D 11BF;
+B699;B699;1104 116D 11C0;B699;1104 116D 11C0;
+B69A;B69A;1104 116D 11C1;B69A;1104 116D 11C1;
+B69B;B69B;1104 116D 11C2;B69B;1104 116D 11C2;
+B69C;B69C;1104 116E;B69C;1104 116E;
+B69D;B69D;1104 116E 11A8;B69D;1104 116E 11A8;
+B69E;B69E;1104 116E 11A9;B69E;1104 116E 11A9;
+B69F;B69F;1104 116E 11AA;B69F;1104 116E 11AA;
+B6A0;B6A0;1104 116E 11AB;B6A0;1104 116E 11AB;
+B6A1;B6A1;1104 116E 11AC;B6A1;1104 116E 11AC;
+B6A2;B6A2;1104 116E 11AD;B6A2;1104 116E 11AD;
+B6A3;B6A3;1104 116E 11AE;B6A3;1104 116E 11AE;
+B6A4;B6A4;1104 116E 11AF;B6A4;1104 116E 11AF;
+B6A5;B6A5;1104 116E 11B0;B6A5;1104 116E 11B0;
+B6A6;B6A6;1104 116E 11B1;B6A6;1104 116E 11B1;
+B6A7;B6A7;1104 116E 11B2;B6A7;1104 116E 11B2;
+B6A8;B6A8;1104 116E 11B3;B6A8;1104 116E 11B3;
+B6A9;B6A9;1104 116E 11B4;B6A9;1104 116E 11B4;
+B6AA;B6AA;1104 116E 11B5;B6AA;1104 116E 11B5;
+B6AB;B6AB;1104 116E 11B6;B6AB;1104 116E 11B6;
+B6AC;B6AC;1104 116E 11B7;B6AC;1104 116E 11B7;
+B6AD;B6AD;1104 116E 11B8;B6AD;1104 116E 11B8;
+B6AE;B6AE;1104 116E 11B9;B6AE;1104 116E 11B9;
+B6AF;B6AF;1104 116E 11BA;B6AF;1104 116E 11BA;
+B6B0;B6B0;1104 116E 11BB;B6B0;1104 116E 11BB;
+B6B1;B6B1;1104 116E 11BC;B6B1;1104 116E 11BC;
+B6B2;B6B2;1104 116E 11BD;B6B2;1104 116E 11BD;
+B6B3;B6B3;1104 116E 11BE;B6B3;1104 116E 11BE;
+B6B4;B6B4;1104 116E 11BF;B6B4;1104 116E 11BF;
+B6B5;B6B5;1104 116E 11C0;B6B5;1104 116E 11C0;
+B6B6;B6B6;1104 116E 11C1;B6B6;1104 116E 11C1;
+B6B7;B6B7;1104 116E 11C2;B6B7;1104 116E 11C2;
+B6B8;B6B8;1104 116F;B6B8;1104 116F;
+B6B9;B6B9;1104 116F 11A8;B6B9;1104 116F 11A8;
+B6BA;B6BA;1104 116F 11A9;B6BA;1104 116F 11A9;
+B6BB;B6BB;1104 116F 11AA;B6BB;1104 116F 11AA;
+B6BC;B6BC;1104 116F 11AB;B6BC;1104 116F 11AB;
+B6BD;B6BD;1104 116F 11AC;B6BD;1104 116F 11AC;
+B6BE;B6BE;1104 116F 11AD;B6BE;1104 116F 11AD;
+B6BF;B6BF;1104 116F 11AE;B6BF;1104 116F 11AE;
+B6C0;B6C0;1104 116F 11AF;B6C0;1104 116F 11AF;
+B6C1;B6C1;1104 116F 11B0;B6C1;1104 116F 11B0;
+B6C2;B6C2;1104 116F 11B1;B6C2;1104 116F 11B1;
+B6C3;B6C3;1104 116F 11B2;B6C3;1104 116F 11B2;
+B6C4;B6C4;1104 116F 11B3;B6C4;1104 116F 11B3;
+B6C5;B6C5;1104 116F 11B4;B6C5;1104 116F 11B4;
+B6C6;B6C6;1104 116F 11B5;B6C6;1104 116F 11B5;
+B6C7;B6C7;1104 116F 11B6;B6C7;1104 116F 11B6;
+B6C8;B6C8;1104 116F 11B7;B6C8;1104 116F 11B7;
+B6C9;B6C9;1104 116F 11B8;B6C9;1104 116F 11B8;
+B6CA;B6CA;1104 116F 11B9;B6CA;1104 116F 11B9;
+B6CB;B6CB;1104 116F 11BA;B6CB;1104 116F 11BA;
+B6CC;B6CC;1104 116F 11BB;B6CC;1104 116F 11BB;
+B6CD;B6CD;1104 116F 11BC;B6CD;1104 116F 11BC;
+B6CE;B6CE;1104 116F 11BD;B6CE;1104 116F 11BD;
+B6CF;B6CF;1104 116F 11BE;B6CF;1104 116F 11BE;
+B6D0;B6D0;1104 116F 11BF;B6D0;1104 116F 11BF;
+B6D1;B6D1;1104 116F 11C0;B6D1;1104 116F 11C0;
+B6D2;B6D2;1104 116F 11C1;B6D2;1104 116F 11C1;
+B6D3;B6D3;1104 116F 11C2;B6D3;1104 116F 11C2;
+B6D4;B6D4;1104 1170;B6D4;1104 1170;
+B6D5;B6D5;1104 1170 11A8;B6D5;1104 1170 11A8;
+B6D6;B6D6;1104 1170 11A9;B6D6;1104 1170 11A9;
+B6D7;B6D7;1104 1170 11AA;B6D7;1104 1170 11AA;
+B6D8;B6D8;1104 1170 11AB;B6D8;1104 1170 11AB;
+B6D9;B6D9;1104 1170 11AC;B6D9;1104 1170 11AC;
+B6DA;B6DA;1104 1170 11AD;B6DA;1104 1170 11AD;
+B6DB;B6DB;1104 1170 11AE;B6DB;1104 1170 11AE;
+B6DC;B6DC;1104 1170 11AF;B6DC;1104 1170 11AF;
+B6DD;B6DD;1104 1170 11B0;B6DD;1104 1170 11B0;
+B6DE;B6DE;1104 1170 11B1;B6DE;1104 1170 11B1;
+B6DF;B6DF;1104 1170 11B2;B6DF;1104 1170 11B2;
+B6E0;B6E0;1104 1170 11B3;B6E0;1104 1170 11B3;
+B6E1;B6E1;1104 1170 11B4;B6E1;1104 1170 11B4;
+B6E2;B6E2;1104 1170 11B5;B6E2;1104 1170 11B5;
+B6E3;B6E3;1104 1170 11B6;B6E3;1104 1170 11B6;
+B6E4;B6E4;1104 1170 11B7;B6E4;1104 1170 11B7;
+B6E5;B6E5;1104 1170 11B8;B6E5;1104 1170 11B8;
+B6E6;B6E6;1104 1170 11B9;B6E6;1104 1170 11B9;
+B6E7;B6E7;1104 1170 11BA;B6E7;1104 1170 11BA;
+B6E8;B6E8;1104 1170 11BB;B6E8;1104 1170 11BB;
+B6E9;B6E9;1104 1170 11BC;B6E9;1104 1170 11BC;
+B6EA;B6EA;1104 1170 11BD;B6EA;1104 1170 11BD;
+B6EB;B6EB;1104 1170 11BE;B6EB;1104 1170 11BE;
+B6EC;B6EC;1104 1170 11BF;B6EC;1104 1170 11BF;
+B6ED;B6ED;1104 1170 11C0;B6ED;1104 1170 11C0;
+B6EE;B6EE;1104 1170 11C1;B6EE;1104 1170 11C1;
+B6EF;B6EF;1104 1170 11C2;B6EF;1104 1170 11C2;
+B6F0;B6F0;1104 1171;B6F0;1104 1171;
+B6F1;B6F1;1104 1171 11A8;B6F1;1104 1171 11A8;
+B6F2;B6F2;1104 1171 11A9;B6F2;1104 1171 11A9;
+B6F3;B6F3;1104 1171 11AA;B6F3;1104 1171 11AA;
+B6F4;B6F4;1104 1171 11AB;B6F4;1104 1171 11AB;
+B6F5;B6F5;1104 1171 11AC;B6F5;1104 1171 11AC;
+B6F6;B6F6;1104 1171 11AD;B6F6;1104 1171 11AD;
+B6F7;B6F7;1104 1171 11AE;B6F7;1104 1171 11AE;
+B6F8;B6F8;1104 1171 11AF;B6F8;1104 1171 11AF;
+B6F9;B6F9;1104 1171 11B0;B6F9;1104 1171 11B0;
+B6FA;B6FA;1104 1171 11B1;B6FA;1104 1171 11B1;
+B6FB;B6FB;1104 1171 11B2;B6FB;1104 1171 11B2;
+B6FC;B6FC;1104 1171 11B3;B6FC;1104 1171 11B3;
+B6FD;B6FD;1104 1171 11B4;B6FD;1104 1171 11B4;
+B6FE;B6FE;1104 1171 11B5;B6FE;1104 1171 11B5;
+B6FF;B6FF;1104 1171 11B6;B6FF;1104 1171 11B6;
+B700;B700;1104 1171 11B7;B700;1104 1171 11B7;
+B701;B701;1104 1171 11B8;B701;1104 1171 11B8;
+B702;B702;1104 1171 11B9;B702;1104 1171 11B9;
+B703;B703;1104 1171 11BA;B703;1104 1171 11BA;
+B704;B704;1104 1171 11BB;B704;1104 1171 11BB;
+B705;B705;1104 1171 11BC;B705;1104 1171 11BC;
+B706;B706;1104 1171 11BD;B706;1104 1171 11BD;
+B707;B707;1104 1171 11BE;B707;1104 1171 11BE;
+B708;B708;1104 1171 11BF;B708;1104 1171 11BF;
+B709;B709;1104 1171 11C0;B709;1104 1171 11C0;
+B70A;B70A;1104 1171 11C1;B70A;1104 1171 11C1;
+B70B;B70B;1104 1171 11C2;B70B;1104 1171 11C2;
+B70C;B70C;1104 1172;B70C;1104 1172;
+B70D;B70D;1104 1172 11A8;B70D;1104 1172 11A8;
+B70E;B70E;1104 1172 11A9;B70E;1104 1172 11A9;
+B70F;B70F;1104 1172 11AA;B70F;1104 1172 11AA;
+B710;B710;1104 1172 11AB;B710;1104 1172 11AB;
+B711;B711;1104 1172 11AC;B711;1104 1172 11AC;
+B712;B712;1104 1172 11AD;B712;1104 1172 11AD;
+B713;B713;1104 1172 11AE;B713;1104 1172 11AE;
+B714;B714;1104 1172 11AF;B714;1104 1172 11AF;
+B715;B715;1104 1172 11B0;B715;1104 1172 11B0;
+B716;B716;1104 1172 11B1;B716;1104 1172 11B1;
+B717;B717;1104 1172 11B2;B717;1104 1172 11B2;
+B718;B718;1104 1172 11B3;B718;1104 1172 11B3;
+B719;B719;1104 1172 11B4;B719;1104 1172 11B4;
+B71A;B71A;1104 1172 11B5;B71A;1104 1172 11B5;
+B71B;B71B;1104 1172 11B6;B71B;1104 1172 11B6;
+B71C;B71C;1104 1172 11B7;B71C;1104 1172 11B7;
+B71D;B71D;1104 1172 11B8;B71D;1104 1172 11B8;
+B71E;B71E;1104 1172 11B9;B71E;1104 1172 11B9;
+B71F;B71F;1104 1172 11BA;B71F;1104 1172 11BA;
+B720;B720;1104 1172 11BB;B720;1104 1172 11BB;
+B721;B721;1104 1172 11BC;B721;1104 1172 11BC;
+B722;B722;1104 1172 11BD;B722;1104 1172 11BD;
+B723;B723;1104 1172 11BE;B723;1104 1172 11BE;
+B724;B724;1104 1172 11BF;B724;1104 1172 11BF;
+B725;B725;1104 1172 11C0;B725;1104 1172 11C0;
+B726;B726;1104 1172 11C1;B726;1104 1172 11C1;
+B727;B727;1104 1172 11C2;B727;1104 1172 11C2;
+B728;B728;1104 1173;B728;1104 1173;
+B729;B729;1104 1173 11A8;B729;1104 1173 11A8;
+B72A;B72A;1104 1173 11A9;B72A;1104 1173 11A9;
+B72B;B72B;1104 1173 11AA;B72B;1104 1173 11AA;
+B72C;B72C;1104 1173 11AB;B72C;1104 1173 11AB;
+B72D;B72D;1104 1173 11AC;B72D;1104 1173 11AC;
+B72E;B72E;1104 1173 11AD;B72E;1104 1173 11AD;
+B72F;B72F;1104 1173 11AE;B72F;1104 1173 11AE;
+B730;B730;1104 1173 11AF;B730;1104 1173 11AF;
+B731;B731;1104 1173 11B0;B731;1104 1173 11B0;
+B732;B732;1104 1173 11B1;B732;1104 1173 11B1;
+B733;B733;1104 1173 11B2;B733;1104 1173 11B2;
+B734;B734;1104 1173 11B3;B734;1104 1173 11B3;
+B735;B735;1104 1173 11B4;B735;1104 1173 11B4;
+B736;B736;1104 1173 11B5;B736;1104 1173 11B5;
+B737;B737;1104 1173 11B6;B737;1104 1173 11B6;
+B738;B738;1104 1173 11B7;B738;1104 1173 11B7;
+B739;B739;1104 1173 11B8;B739;1104 1173 11B8;
+B73A;B73A;1104 1173 11B9;B73A;1104 1173 11B9;
+B73B;B73B;1104 1173 11BA;B73B;1104 1173 11BA;
+B73C;B73C;1104 1173 11BB;B73C;1104 1173 11BB;
+B73D;B73D;1104 1173 11BC;B73D;1104 1173 11BC;
+B73E;B73E;1104 1173 11BD;B73E;1104 1173 11BD;
+B73F;B73F;1104 1173 11BE;B73F;1104 1173 11BE;
+B740;B740;1104 1173 11BF;B740;1104 1173 11BF;
+B741;B741;1104 1173 11C0;B741;1104 1173 11C0;
+B742;B742;1104 1173 11C1;B742;1104 1173 11C1;
+B743;B743;1104 1173 11C2;B743;1104 1173 11C2;
+B744;B744;1104 1174;B744;1104 1174;
+B745;B745;1104 1174 11A8;B745;1104 1174 11A8;
+B746;B746;1104 1174 11A9;B746;1104 1174 11A9;
+B747;B747;1104 1174 11AA;B747;1104 1174 11AA;
+B748;B748;1104 1174 11AB;B748;1104 1174 11AB;
+B749;B749;1104 1174 11AC;B749;1104 1174 11AC;
+B74A;B74A;1104 1174 11AD;B74A;1104 1174 11AD;
+B74B;B74B;1104 1174 11AE;B74B;1104 1174 11AE;
+B74C;B74C;1104 1174 11AF;B74C;1104 1174 11AF;
+B74D;B74D;1104 1174 11B0;B74D;1104 1174 11B0;
+B74E;B74E;1104 1174 11B1;B74E;1104 1174 11B1;
+B74F;B74F;1104 1174 11B2;B74F;1104 1174 11B2;
+B750;B750;1104 1174 11B3;B750;1104 1174 11B3;
+B751;B751;1104 1174 11B4;B751;1104 1174 11B4;
+B752;B752;1104 1174 11B5;B752;1104 1174 11B5;
+B753;B753;1104 1174 11B6;B753;1104 1174 11B6;
+B754;B754;1104 1174 11B7;B754;1104 1174 11B7;
+B755;B755;1104 1174 11B8;B755;1104 1174 11B8;
+B756;B756;1104 1174 11B9;B756;1104 1174 11B9;
+B757;B757;1104 1174 11BA;B757;1104 1174 11BA;
+B758;B758;1104 1174 11BB;B758;1104 1174 11BB;
+B759;B759;1104 1174 11BC;B759;1104 1174 11BC;
+B75A;B75A;1104 1174 11BD;B75A;1104 1174 11BD;
+B75B;B75B;1104 1174 11BE;B75B;1104 1174 11BE;
+B75C;B75C;1104 1174 11BF;B75C;1104 1174 11BF;
+B75D;B75D;1104 1174 11C0;B75D;1104 1174 11C0;
+B75E;B75E;1104 1174 11C1;B75E;1104 1174 11C1;
+B75F;B75F;1104 1174 11C2;B75F;1104 1174 11C2;
+B760;B760;1104 1175;B760;1104 1175;
+B761;B761;1104 1175 11A8;B761;1104 1175 11A8;
+B762;B762;1104 1175 11A9;B762;1104 1175 11A9;
+B763;B763;1104 1175 11AA;B763;1104 1175 11AA;
+B764;B764;1104 1175 11AB;B764;1104 1175 11AB;
+B765;B765;1104 1175 11AC;B765;1104 1175 11AC;
+B766;B766;1104 1175 11AD;B766;1104 1175 11AD;
+B767;B767;1104 1175 11AE;B767;1104 1175 11AE;
+B768;B768;1104 1175 11AF;B768;1104 1175 11AF;
+B769;B769;1104 1175 11B0;B769;1104 1175 11B0;
+B76A;B76A;1104 1175 11B1;B76A;1104 1175 11B1;
+B76B;B76B;1104 1175 11B2;B76B;1104 1175 11B2;
+B76C;B76C;1104 1175 11B3;B76C;1104 1175 11B3;
+B76D;B76D;1104 1175 11B4;B76D;1104 1175 11B4;
+B76E;B76E;1104 1175 11B5;B76E;1104 1175 11B5;
+B76F;B76F;1104 1175 11B6;B76F;1104 1175 11B6;
+B770;B770;1104 1175 11B7;B770;1104 1175 11B7;
+B771;B771;1104 1175 11B8;B771;1104 1175 11B8;
+B772;B772;1104 1175 11B9;B772;1104 1175 11B9;
+B773;B773;1104 1175 11BA;B773;1104 1175 11BA;
+B774;B774;1104 1175 11BB;B774;1104 1175 11BB;
+B775;B775;1104 1175 11BC;B775;1104 1175 11BC;
+B776;B776;1104 1175 11BD;B776;1104 1175 11BD;
+B777;B777;1104 1175 11BE;B777;1104 1175 11BE;
+B778;B778;1104 1175 11BF;B778;1104 1175 11BF;
+B779;B779;1104 1175 11C0;B779;1104 1175 11C0;
+B77A;B77A;1104 1175 11C1;B77A;1104 1175 11C1;
+B77B;B77B;1104 1175 11C2;B77B;1104 1175 11C2;
+B77C;B77C;1105 1161;B77C;1105 1161;
+B77D;B77D;1105 1161 11A8;B77D;1105 1161 11A8;
+B77E;B77E;1105 1161 11A9;B77E;1105 1161 11A9;
+B77F;B77F;1105 1161 11AA;B77F;1105 1161 11AA;
+B780;B780;1105 1161 11AB;B780;1105 1161 11AB;
+B781;B781;1105 1161 11AC;B781;1105 1161 11AC;
+B782;B782;1105 1161 11AD;B782;1105 1161 11AD;
+B783;B783;1105 1161 11AE;B783;1105 1161 11AE;
+B784;B784;1105 1161 11AF;B784;1105 1161 11AF;
+B785;B785;1105 1161 11B0;B785;1105 1161 11B0;
+B786;B786;1105 1161 11B1;B786;1105 1161 11B1;
+B787;B787;1105 1161 11B2;B787;1105 1161 11B2;
+B788;B788;1105 1161 11B3;B788;1105 1161 11B3;
+B789;B789;1105 1161 11B4;B789;1105 1161 11B4;
+B78A;B78A;1105 1161 11B5;B78A;1105 1161 11B5;
+B78B;B78B;1105 1161 11B6;B78B;1105 1161 11B6;
+B78C;B78C;1105 1161 11B7;B78C;1105 1161 11B7;
+B78D;B78D;1105 1161 11B8;B78D;1105 1161 11B8;
+B78E;B78E;1105 1161 11B9;B78E;1105 1161 11B9;
+B78F;B78F;1105 1161 11BA;B78F;1105 1161 11BA;
+B790;B790;1105 1161 11BB;B790;1105 1161 11BB;
+B791;B791;1105 1161 11BC;B791;1105 1161 11BC;
+B792;B792;1105 1161 11BD;B792;1105 1161 11BD;
+B793;B793;1105 1161 11BE;B793;1105 1161 11BE;
+B794;B794;1105 1161 11BF;B794;1105 1161 11BF;
+B795;B795;1105 1161 11C0;B795;1105 1161 11C0;
+B796;B796;1105 1161 11C1;B796;1105 1161 11C1;
+B797;B797;1105 1161 11C2;B797;1105 1161 11C2;
+B798;B798;1105 1162;B798;1105 1162;
+B799;B799;1105 1162 11A8;B799;1105 1162 11A8;
+B79A;B79A;1105 1162 11A9;B79A;1105 1162 11A9;
+B79B;B79B;1105 1162 11AA;B79B;1105 1162 11AA;
+B79C;B79C;1105 1162 11AB;B79C;1105 1162 11AB;
+B79D;B79D;1105 1162 11AC;B79D;1105 1162 11AC;
+B79E;B79E;1105 1162 11AD;B79E;1105 1162 11AD;
+B79F;B79F;1105 1162 11AE;B79F;1105 1162 11AE;
+B7A0;B7A0;1105 1162 11AF;B7A0;1105 1162 11AF;
+B7A1;B7A1;1105 1162 11B0;B7A1;1105 1162 11B0;
+B7A2;B7A2;1105 1162 11B1;B7A2;1105 1162 11B1;
+B7A3;B7A3;1105 1162 11B2;B7A3;1105 1162 11B2;
+B7A4;B7A4;1105 1162 11B3;B7A4;1105 1162 11B3;
+B7A5;B7A5;1105 1162 11B4;B7A5;1105 1162 11B4;
+B7A6;B7A6;1105 1162 11B5;B7A6;1105 1162 11B5;
+B7A7;B7A7;1105 1162 11B6;B7A7;1105 1162 11B6;
+B7A8;B7A8;1105 1162 11B7;B7A8;1105 1162 11B7;
+B7A9;B7A9;1105 1162 11B8;B7A9;1105 1162 11B8;
+B7AA;B7AA;1105 1162 11B9;B7AA;1105 1162 11B9;
+B7AB;B7AB;1105 1162 11BA;B7AB;1105 1162 11BA;
+B7AC;B7AC;1105 1162 11BB;B7AC;1105 1162 11BB;
+B7AD;B7AD;1105 1162 11BC;B7AD;1105 1162 11BC;
+B7AE;B7AE;1105 1162 11BD;B7AE;1105 1162 11BD;
+B7AF;B7AF;1105 1162 11BE;B7AF;1105 1162 11BE;
+B7B0;B7B0;1105 1162 11BF;B7B0;1105 1162 11BF;
+B7B1;B7B1;1105 1162 11C0;B7B1;1105 1162 11C0;
+B7B2;B7B2;1105 1162 11C1;B7B2;1105 1162 11C1;
+B7B3;B7B3;1105 1162 11C2;B7B3;1105 1162 11C2;
+B7B4;B7B4;1105 1163;B7B4;1105 1163;
+B7B5;B7B5;1105 1163 11A8;B7B5;1105 1163 11A8;
+B7B6;B7B6;1105 1163 11A9;B7B6;1105 1163 11A9;
+B7B7;B7B7;1105 1163 11AA;B7B7;1105 1163 11AA;
+B7B8;B7B8;1105 1163 11AB;B7B8;1105 1163 11AB;
+B7B9;B7B9;1105 1163 11AC;B7B9;1105 1163 11AC;
+B7BA;B7BA;1105 1163 11AD;B7BA;1105 1163 11AD;
+B7BB;B7BB;1105 1163 11AE;B7BB;1105 1163 11AE;
+B7BC;B7BC;1105 1163 11AF;B7BC;1105 1163 11AF;
+B7BD;B7BD;1105 1163 11B0;B7BD;1105 1163 11B0;
+B7BE;B7BE;1105 1163 11B1;B7BE;1105 1163 11B1;
+B7BF;B7BF;1105 1163 11B2;B7BF;1105 1163 11B2;
+B7C0;B7C0;1105 1163 11B3;B7C0;1105 1163 11B3;
+B7C1;B7C1;1105 1163 11B4;B7C1;1105 1163 11B4;
+B7C2;B7C2;1105 1163 11B5;B7C2;1105 1163 11B5;
+B7C3;B7C3;1105 1163 11B6;B7C3;1105 1163 11B6;
+B7C4;B7C4;1105 1163 11B7;B7C4;1105 1163 11B7;
+B7C5;B7C5;1105 1163 11B8;B7C5;1105 1163 11B8;
+B7C6;B7C6;1105 1163 11B9;B7C6;1105 1163 11B9;
+B7C7;B7C7;1105 1163 11BA;B7C7;1105 1163 11BA;
+B7C8;B7C8;1105 1163 11BB;B7C8;1105 1163 11BB;
+B7C9;B7C9;1105 1163 11BC;B7C9;1105 1163 11BC;
+B7CA;B7CA;1105 1163 11BD;B7CA;1105 1163 11BD;
+B7CB;B7CB;1105 1163 11BE;B7CB;1105 1163 11BE;
+B7CC;B7CC;1105 1163 11BF;B7CC;1105 1163 11BF;
+B7CD;B7CD;1105 1163 11C0;B7CD;1105 1163 11C0;
+B7CE;B7CE;1105 1163 11C1;B7CE;1105 1163 11C1;
+B7CF;B7CF;1105 1163 11C2;B7CF;1105 1163 11C2;
+B7D0;B7D0;1105 1164;B7D0;1105 1164;
+B7D1;B7D1;1105 1164 11A8;B7D1;1105 1164 11A8;
+B7D2;B7D2;1105 1164 11A9;B7D2;1105 1164 11A9;
+B7D3;B7D3;1105 1164 11AA;B7D3;1105 1164 11AA;
+B7D4;B7D4;1105 1164 11AB;B7D4;1105 1164 11AB;
+B7D5;B7D5;1105 1164 11AC;B7D5;1105 1164 11AC;
+B7D6;B7D6;1105 1164 11AD;B7D6;1105 1164 11AD;
+B7D7;B7D7;1105 1164 11AE;B7D7;1105 1164 11AE;
+B7D8;B7D8;1105 1164 11AF;B7D8;1105 1164 11AF;
+B7D9;B7D9;1105 1164 11B0;B7D9;1105 1164 11B0;
+B7DA;B7DA;1105 1164 11B1;B7DA;1105 1164 11B1;
+B7DB;B7DB;1105 1164 11B2;B7DB;1105 1164 11B2;
+B7DC;B7DC;1105 1164 11B3;B7DC;1105 1164 11B3;
+B7DD;B7DD;1105 1164 11B4;B7DD;1105 1164 11B4;
+B7DE;B7DE;1105 1164 11B5;B7DE;1105 1164 11B5;
+B7DF;B7DF;1105 1164 11B6;B7DF;1105 1164 11B6;
+B7E0;B7E0;1105 1164 11B7;B7E0;1105 1164 11B7;
+B7E1;B7E1;1105 1164 11B8;B7E1;1105 1164 11B8;
+B7E2;B7E2;1105 1164 11B9;B7E2;1105 1164 11B9;
+B7E3;B7E3;1105 1164 11BA;B7E3;1105 1164 11BA;
+B7E4;B7E4;1105 1164 11BB;B7E4;1105 1164 11BB;
+B7E5;B7E5;1105 1164 11BC;B7E5;1105 1164 11BC;
+B7E6;B7E6;1105 1164 11BD;B7E6;1105 1164 11BD;
+B7E7;B7E7;1105 1164 11BE;B7E7;1105 1164 11BE;
+B7E8;B7E8;1105 1164 11BF;B7E8;1105 1164 11BF;
+B7E9;B7E9;1105 1164 11C0;B7E9;1105 1164 11C0;
+B7EA;B7EA;1105 1164 11C1;B7EA;1105 1164 11C1;
+B7EB;B7EB;1105 1164 11C2;B7EB;1105 1164 11C2;
+B7EC;B7EC;1105 1165;B7EC;1105 1165;
+B7ED;B7ED;1105 1165 11A8;B7ED;1105 1165 11A8;
+B7EE;B7EE;1105 1165 11A9;B7EE;1105 1165 11A9;
+B7EF;B7EF;1105 1165 11AA;B7EF;1105 1165 11AA;
+B7F0;B7F0;1105 1165 11AB;B7F0;1105 1165 11AB;
+B7F1;B7F1;1105 1165 11AC;B7F1;1105 1165 11AC;
+B7F2;B7F2;1105 1165 11AD;B7F2;1105 1165 11AD;
+B7F3;B7F3;1105 1165 11AE;B7F3;1105 1165 11AE;
+B7F4;B7F4;1105 1165 11AF;B7F4;1105 1165 11AF;
+B7F5;B7F5;1105 1165 11B0;B7F5;1105 1165 11B0;
+B7F6;B7F6;1105 1165 11B1;B7F6;1105 1165 11B1;
+B7F7;B7F7;1105 1165 11B2;B7F7;1105 1165 11B2;
+B7F8;B7F8;1105 1165 11B3;B7F8;1105 1165 11B3;
+B7F9;B7F9;1105 1165 11B4;B7F9;1105 1165 11B4;
+B7FA;B7FA;1105 1165 11B5;B7FA;1105 1165 11B5;
+B7FB;B7FB;1105 1165 11B6;B7FB;1105 1165 11B6;
+B7FC;B7FC;1105 1165 11B7;B7FC;1105 1165 11B7;
+B7FD;B7FD;1105 1165 11B8;B7FD;1105 1165 11B8;
+B7FE;B7FE;1105 1165 11B9;B7FE;1105 1165 11B9;
+B7FF;B7FF;1105 1165 11BA;B7FF;1105 1165 11BA;
+B800;B800;1105 1165 11BB;B800;1105 1165 11BB;
+B801;B801;1105 1165 11BC;B801;1105 1165 11BC;
+B802;B802;1105 1165 11BD;B802;1105 1165 11BD;
+B803;B803;1105 1165 11BE;B803;1105 1165 11BE;
+B804;B804;1105 1165 11BF;B804;1105 1165 11BF;
+B805;B805;1105 1165 11C0;B805;1105 1165 11C0;
+B806;B806;1105 1165 11C1;B806;1105 1165 11C1;
+B807;B807;1105 1165 11C2;B807;1105 1165 11C2;
+B808;B808;1105 1166;B808;1105 1166;
+B809;B809;1105 1166 11A8;B809;1105 1166 11A8;
+B80A;B80A;1105 1166 11A9;B80A;1105 1166 11A9;
+B80B;B80B;1105 1166 11AA;B80B;1105 1166 11AA;
+B80C;B80C;1105 1166 11AB;B80C;1105 1166 11AB;
+B80D;B80D;1105 1166 11AC;B80D;1105 1166 11AC;
+B80E;B80E;1105 1166 11AD;B80E;1105 1166 11AD;
+B80F;B80F;1105 1166 11AE;B80F;1105 1166 11AE;
+B810;B810;1105 1166 11AF;B810;1105 1166 11AF;
+B811;B811;1105 1166 11B0;B811;1105 1166 11B0;
+B812;B812;1105 1166 11B1;B812;1105 1166 11B1;
+B813;B813;1105 1166 11B2;B813;1105 1166 11B2;
+B814;B814;1105 1166 11B3;B814;1105 1166 11B3;
+B815;B815;1105 1166 11B4;B815;1105 1166 11B4;
+B816;B816;1105 1166 11B5;B816;1105 1166 11B5;
+B817;B817;1105 1166 11B6;B817;1105 1166 11B6;
+B818;B818;1105 1166 11B7;B818;1105 1166 11B7;
+B819;B819;1105 1166 11B8;B819;1105 1166 11B8;
+B81A;B81A;1105 1166 11B9;B81A;1105 1166 11B9;
+B81B;B81B;1105 1166 11BA;B81B;1105 1166 11BA;
+B81C;B81C;1105 1166 11BB;B81C;1105 1166 11BB;
+B81D;B81D;1105 1166 11BC;B81D;1105 1166 11BC;
+B81E;B81E;1105 1166 11BD;B81E;1105 1166 11BD;
+B81F;B81F;1105 1166 11BE;B81F;1105 1166 11BE;
+B820;B820;1105 1166 11BF;B820;1105 1166 11BF;
+B821;B821;1105 1166 11C0;B821;1105 1166 11C0;
+B822;B822;1105 1166 11C1;B822;1105 1166 11C1;
+B823;B823;1105 1166 11C2;B823;1105 1166 11C2;
+B824;B824;1105 1167;B824;1105 1167;
+B825;B825;1105 1167 11A8;B825;1105 1167 11A8;
+B826;B826;1105 1167 11A9;B826;1105 1167 11A9;
+B827;B827;1105 1167 11AA;B827;1105 1167 11AA;
+B828;B828;1105 1167 11AB;B828;1105 1167 11AB;
+B829;B829;1105 1167 11AC;B829;1105 1167 11AC;
+B82A;B82A;1105 1167 11AD;B82A;1105 1167 11AD;
+B82B;B82B;1105 1167 11AE;B82B;1105 1167 11AE;
+B82C;B82C;1105 1167 11AF;B82C;1105 1167 11AF;
+B82D;B82D;1105 1167 11B0;B82D;1105 1167 11B0;
+B82E;B82E;1105 1167 11B1;B82E;1105 1167 11B1;
+B82F;B82F;1105 1167 11B2;B82F;1105 1167 11B2;
+B830;B830;1105 1167 11B3;B830;1105 1167 11B3;
+B831;B831;1105 1167 11B4;B831;1105 1167 11B4;
+B832;B832;1105 1167 11B5;B832;1105 1167 11B5;
+B833;B833;1105 1167 11B6;B833;1105 1167 11B6;
+B834;B834;1105 1167 11B7;B834;1105 1167 11B7;
+B835;B835;1105 1167 11B8;B835;1105 1167 11B8;
+B836;B836;1105 1167 11B9;B836;1105 1167 11B9;
+B837;B837;1105 1167 11BA;B837;1105 1167 11BA;
+B838;B838;1105 1167 11BB;B838;1105 1167 11BB;
+B839;B839;1105 1167 11BC;B839;1105 1167 11BC;
+B83A;B83A;1105 1167 11BD;B83A;1105 1167 11BD;
+B83B;B83B;1105 1167 11BE;B83B;1105 1167 11BE;
+B83C;B83C;1105 1167 11BF;B83C;1105 1167 11BF;
+B83D;B83D;1105 1167 11C0;B83D;1105 1167 11C0;
+B83E;B83E;1105 1167 11C1;B83E;1105 1167 11C1;
+B83F;B83F;1105 1167 11C2;B83F;1105 1167 11C2;
+B840;B840;1105 1168;B840;1105 1168;
+B841;B841;1105 1168 11A8;B841;1105 1168 11A8;
+B842;B842;1105 1168 11A9;B842;1105 1168 11A9;
+B843;B843;1105 1168 11AA;B843;1105 1168 11AA;
+B844;B844;1105 1168 11AB;B844;1105 1168 11AB;
+B845;B845;1105 1168 11AC;B845;1105 1168 11AC;
+B846;B846;1105 1168 11AD;B846;1105 1168 11AD;
+B847;B847;1105 1168 11AE;B847;1105 1168 11AE;
+B848;B848;1105 1168 11AF;B848;1105 1168 11AF;
+B849;B849;1105 1168 11B0;B849;1105 1168 11B0;
+B84A;B84A;1105 1168 11B1;B84A;1105 1168 11B1;
+B84B;B84B;1105 1168 11B2;B84B;1105 1168 11B2;
+B84C;B84C;1105 1168 11B3;B84C;1105 1168 11B3;
+B84D;B84D;1105 1168 11B4;B84D;1105 1168 11B4;
+B84E;B84E;1105 1168 11B5;B84E;1105 1168 11B5;
+B84F;B84F;1105 1168 11B6;B84F;1105 1168 11B6;
+B850;B850;1105 1168 11B7;B850;1105 1168 11B7;
+B851;B851;1105 1168 11B8;B851;1105 1168 11B8;
+B852;B852;1105 1168 11B9;B852;1105 1168 11B9;
+B853;B853;1105 1168 11BA;B853;1105 1168 11BA;
+B854;B854;1105 1168 11BB;B854;1105 1168 11BB;
+B855;B855;1105 1168 11BC;B855;1105 1168 11BC;
+B856;B856;1105 1168 11BD;B856;1105 1168 11BD;
+B857;B857;1105 1168 11BE;B857;1105 1168 11BE;
+B858;B858;1105 1168 11BF;B858;1105 1168 11BF;
+B859;B859;1105 1168 11C0;B859;1105 1168 11C0;
+B85A;B85A;1105 1168 11C1;B85A;1105 1168 11C1;
+B85B;B85B;1105 1168 11C2;B85B;1105 1168 11C2;
+B85C;B85C;1105 1169;B85C;1105 1169;
+B85D;B85D;1105 1169 11A8;B85D;1105 1169 11A8;
+B85E;B85E;1105 1169 11A9;B85E;1105 1169 11A9;
+B85F;B85F;1105 1169 11AA;B85F;1105 1169 11AA;
+B860;B860;1105 1169 11AB;B860;1105 1169 11AB;
+B861;B861;1105 1169 11AC;B861;1105 1169 11AC;
+B862;B862;1105 1169 11AD;B862;1105 1169 11AD;
+B863;B863;1105 1169 11AE;B863;1105 1169 11AE;
+B864;B864;1105 1169 11AF;B864;1105 1169 11AF;
+B865;B865;1105 1169 11B0;B865;1105 1169 11B0;
+B866;B866;1105 1169 11B1;B866;1105 1169 11B1;
+B867;B867;1105 1169 11B2;B867;1105 1169 11B2;
+B868;B868;1105 1169 11B3;B868;1105 1169 11B3;
+B869;B869;1105 1169 11B4;B869;1105 1169 11B4;
+B86A;B86A;1105 1169 11B5;B86A;1105 1169 11B5;
+B86B;B86B;1105 1169 11B6;B86B;1105 1169 11B6;
+B86C;B86C;1105 1169 11B7;B86C;1105 1169 11B7;
+B86D;B86D;1105 1169 11B8;B86D;1105 1169 11B8;
+B86E;B86E;1105 1169 11B9;B86E;1105 1169 11B9;
+B86F;B86F;1105 1169 11BA;B86F;1105 1169 11BA;
+B870;B870;1105 1169 11BB;B870;1105 1169 11BB;
+B871;B871;1105 1169 11BC;B871;1105 1169 11BC;
+B872;B872;1105 1169 11BD;B872;1105 1169 11BD;
+B873;B873;1105 1169 11BE;B873;1105 1169 11BE;
+B874;B874;1105 1169 11BF;B874;1105 1169 11BF;
+B875;B875;1105 1169 11C0;B875;1105 1169 11C0;
+B876;B876;1105 1169 11C1;B876;1105 1169 11C1;
+B877;B877;1105 1169 11C2;B877;1105 1169 11C2;
+B878;B878;1105 116A;B878;1105 116A;
+B879;B879;1105 116A 11A8;B879;1105 116A 11A8;
+B87A;B87A;1105 116A 11A9;B87A;1105 116A 11A9;
+B87B;B87B;1105 116A 11AA;B87B;1105 116A 11AA;
+B87C;B87C;1105 116A 11AB;B87C;1105 116A 11AB;
+B87D;B87D;1105 116A 11AC;B87D;1105 116A 11AC;
+B87E;B87E;1105 116A 11AD;B87E;1105 116A 11AD;
+B87F;B87F;1105 116A 11AE;B87F;1105 116A 11AE;
+B880;B880;1105 116A 11AF;B880;1105 116A 11AF;
+B881;B881;1105 116A 11B0;B881;1105 116A 11B0;
+B882;B882;1105 116A 11B1;B882;1105 116A 11B1;
+B883;B883;1105 116A 11B2;B883;1105 116A 11B2;
+B884;B884;1105 116A 11B3;B884;1105 116A 11B3;
+B885;B885;1105 116A 11B4;B885;1105 116A 11B4;
+B886;B886;1105 116A 11B5;B886;1105 116A 11B5;
+B887;B887;1105 116A 11B6;B887;1105 116A 11B6;
+B888;B888;1105 116A 11B7;B888;1105 116A 11B7;
+B889;B889;1105 116A 11B8;B889;1105 116A 11B8;
+B88A;B88A;1105 116A 11B9;B88A;1105 116A 11B9;
+B88B;B88B;1105 116A 11BA;B88B;1105 116A 11BA;
+B88C;B88C;1105 116A 11BB;B88C;1105 116A 11BB;
+B88D;B88D;1105 116A 11BC;B88D;1105 116A 11BC;
+B88E;B88E;1105 116A 11BD;B88E;1105 116A 11BD;
+B88F;B88F;1105 116A 11BE;B88F;1105 116A 11BE;
+B890;B890;1105 116A 11BF;B890;1105 116A 11BF;
+B891;B891;1105 116A 11C0;B891;1105 116A 11C0;
+B892;B892;1105 116A 11C1;B892;1105 116A 11C1;
+B893;B893;1105 116A 11C2;B893;1105 116A 11C2;
+B894;B894;1105 116B;B894;1105 116B;
+B895;B895;1105 116B 11A8;B895;1105 116B 11A8;
+B896;B896;1105 116B 11A9;B896;1105 116B 11A9;
+B897;B897;1105 116B 11AA;B897;1105 116B 11AA;
+B898;B898;1105 116B 11AB;B898;1105 116B 11AB;
+B899;B899;1105 116B 11AC;B899;1105 116B 11AC;
+B89A;B89A;1105 116B 11AD;B89A;1105 116B 11AD;
+B89B;B89B;1105 116B 11AE;B89B;1105 116B 11AE;
+B89C;B89C;1105 116B 11AF;B89C;1105 116B 11AF;
+B89D;B89D;1105 116B 11B0;B89D;1105 116B 11B0;
+B89E;B89E;1105 116B 11B1;B89E;1105 116B 11B1;
+B89F;B89F;1105 116B 11B2;B89F;1105 116B 11B2;
+B8A0;B8A0;1105 116B 11B3;B8A0;1105 116B 11B3;
+B8A1;B8A1;1105 116B 11B4;B8A1;1105 116B 11B4;
+B8A2;B8A2;1105 116B 11B5;B8A2;1105 116B 11B5;
+B8A3;B8A3;1105 116B 11B6;B8A3;1105 116B 11B6;
+B8A4;B8A4;1105 116B 11B7;B8A4;1105 116B 11B7;
+B8A5;B8A5;1105 116B 11B8;B8A5;1105 116B 11B8;
+B8A6;B8A6;1105 116B 11B9;B8A6;1105 116B 11B9;
+B8A7;B8A7;1105 116B 11BA;B8A7;1105 116B 11BA;
+B8A8;B8A8;1105 116B 11BB;B8A8;1105 116B 11BB;
+B8A9;B8A9;1105 116B 11BC;B8A9;1105 116B 11BC;
+B8AA;B8AA;1105 116B 11BD;B8AA;1105 116B 11BD;
+B8AB;B8AB;1105 116B 11BE;B8AB;1105 116B 11BE;
+B8AC;B8AC;1105 116B 11BF;B8AC;1105 116B 11BF;
+B8AD;B8AD;1105 116B 11C0;B8AD;1105 116B 11C0;
+B8AE;B8AE;1105 116B 11C1;B8AE;1105 116B 11C1;
+B8AF;B8AF;1105 116B 11C2;B8AF;1105 116B 11C2;
+B8B0;B8B0;1105 116C;B8B0;1105 116C;
+B8B1;B8B1;1105 116C 11A8;B8B1;1105 116C 11A8;
+B8B2;B8B2;1105 116C 11A9;B8B2;1105 116C 11A9;
+B8B3;B8B3;1105 116C 11AA;B8B3;1105 116C 11AA;
+B8B4;B8B4;1105 116C 11AB;B8B4;1105 116C 11AB;
+B8B5;B8B5;1105 116C 11AC;B8B5;1105 116C 11AC;
+B8B6;B8B6;1105 116C 11AD;B8B6;1105 116C 11AD;
+B8B7;B8B7;1105 116C 11AE;B8B7;1105 116C 11AE;
+B8B8;B8B8;1105 116C 11AF;B8B8;1105 116C 11AF;
+B8B9;B8B9;1105 116C 11B0;B8B9;1105 116C 11B0;
+B8BA;B8BA;1105 116C 11B1;B8BA;1105 116C 11B1;
+B8BB;B8BB;1105 116C 11B2;B8BB;1105 116C 11B2;
+B8BC;B8BC;1105 116C 11B3;B8BC;1105 116C 11B3;
+B8BD;B8BD;1105 116C 11B4;B8BD;1105 116C 11B4;
+B8BE;B8BE;1105 116C 11B5;B8BE;1105 116C 11B5;
+B8BF;B8BF;1105 116C 11B6;B8BF;1105 116C 11B6;
+B8C0;B8C0;1105 116C 11B7;B8C0;1105 116C 11B7;
+B8C1;B8C1;1105 116C 11B8;B8C1;1105 116C 11B8;
+B8C2;B8C2;1105 116C 11B9;B8C2;1105 116C 11B9;
+B8C3;B8C3;1105 116C 11BA;B8C3;1105 116C 11BA;
+B8C4;B8C4;1105 116C 11BB;B8C4;1105 116C 11BB;
+B8C5;B8C5;1105 116C 11BC;B8C5;1105 116C 11BC;
+B8C6;B8C6;1105 116C 11BD;B8C6;1105 116C 11BD;
+B8C7;B8C7;1105 116C 11BE;B8C7;1105 116C 11BE;
+B8C8;B8C8;1105 116C 11BF;B8C8;1105 116C 11BF;
+B8C9;B8C9;1105 116C 11C0;B8C9;1105 116C 11C0;
+B8CA;B8CA;1105 116C 11C1;B8CA;1105 116C 11C1;
+B8CB;B8CB;1105 116C 11C2;B8CB;1105 116C 11C2;
+B8CC;B8CC;1105 116D;B8CC;1105 116D;
+B8CD;B8CD;1105 116D 11A8;B8CD;1105 116D 11A8;
+B8CE;B8CE;1105 116D 11A9;B8CE;1105 116D 11A9;
+B8CF;B8CF;1105 116D 11AA;B8CF;1105 116D 11AA;
+B8D0;B8D0;1105 116D 11AB;B8D0;1105 116D 11AB;
+B8D1;B8D1;1105 116D 11AC;B8D1;1105 116D 11AC;
+B8D2;B8D2;1105 116D 11AD;B8D2;1105 116D 11AD;
+B8D3;B8D3;1105 116D 11AE;B8D3;1105 116D 11AE;
+B8D4;B8D4;1105 116D 11AF;B8D4;1105 116D 11AF;
+B8D5;B8D5;1105 116D 11B0;B8D5;1105 116D 11B0;
+B8D6;B8D6;1105 116D 11B1;B8D6;1105 116D 11B1;
+B8D7;B8D7;1105 116D 11B2;B8D7;1105 116D 11B2;
+B8D8;B8D8;1105 116D 11B3;B8D8;1105 116D 11B3;
+B8D9;B8D9;1105 116D 11B4;B8D9;1105 116D 11B4;
+B8DA;B8DA;1105 116D 11B5;B8DA;1105 116D 11B5;
+B8DB;B8DB;1105 116D 11B6;B8DB;1105 116D 11B6;
+B8DC;B8DC;1105 116D 11B7;B8DC;1105 116D 11B7;
+B8DD;B8DD;1105 116D 11B8;B8DD;1105 116D 11B8;
+B8DE;B8DE;1105 116D 11B9;B8DE;1105 116D 11B9;
+B8DF;B8DF;1105 116D 11BA;B8DF;1105 116D 11BA;
+B8E0;B8E0;1105 116D 11BB;B8E0;1105 116D 11BB;
+B8E1;B8E1;1105 116D 11BC;B8E1;1105 116D 11BC;
+B8E2;B8E2;1105 116D 11BD;B8E2;1105 116D 11BD;
+B8E3;B8E3;1105 116D 11BE;B8E3;1105 116D 11BE;
+B8E4;B8E4;1105 116D 11BF;B8E4;1105 116D 11BF;
+B8E5;B8E5;1105 116D 11C0;B8E5;1105 116D 11C0;
+B8E6;B8E6;1105 116D 11C1;B8E6;1105 116D 11C1;
+B8E7;B8E7;1105 116D 11C2;B8E7;1105 116D 11C2;
+B8E8;B8E8;1105 116E;B8E8;1105 116E;
+B8E9;B8E9;1105 116E 11A8;B8E9;1105 116E 11A8;
+B8EA;B8EA;1105 116E 11A9;B8EA;1105 116E 11A9;
+B8EB;B8EB;1105 116E 11AA;B8EB;1105 116E 11AA;
+B8EC;B8EC;1105 116E 11AB;B8EC;1105 116E 11AB;
+B8ED;B8ED;1105 116E 11AC;B8ED;1105 116E 11AC;
+B8EE;B8EE;1105 116E 11AD;B8EE;1105 116E 11AD;
+B8EF;B8EF;1105 116E 11AE;B8EF;1105 116E 11AE;
+B8F0;B8F0;1105 116E 11AF;B8F0;1105 116E 11AF;
+B8F1;B8F1;1105 116E 11B0;B8F1;1105 116E 11B0;
+B8F2;B8F2;1105 116E 11B1;B8F2;1105 116E 11B1;
+B8F3;B8F3;1105 116E 11B2;B8F3;1105 116E 11B2;
+B8F4;B8F4;1105 116E 11B3;B8F4;1105 116E 11B3;
+B8F5;B8F5;1105 116E 11B4;B8F5;1105 116E 11B4;
+B8F6;B8F6;1105 116E 11B5;B8F6;1105 116E 11B5;
+B8F7;B8F7;1105 116E 11B6;B8F7;1105 116E 11B6;
+B8F8;B8F8;1105 116E 11B7;B8F8;1105 116E 11B7;
+B8F9;B8F9;1105 116E 11B8;B8F9;1105 116E 11B8;
+B8FA;B8FA;1105 116E 11B9;B8FA;1105 116E 11B9;
+B8FB;B8FB;1105 116E 11BA;B8FB;1105 116E 11BA;
+B8FC;B8FC;1105 116E 11BB;B8FC;1105 116E 11BB;
+B8FD;B8FD;1105 116E 11BC;B8FD;1105 116E 11BC;
+B8FE;B8FE;1105 116E 11BD;B8FE;1105 116E 11BD;
+B8FF;B8FF;1105 116E 11BE;B8FF;1105 116E 11BE;
+B900;B900;1105 116E 11BF;B900;1105 116E 11BF;
+B901;B901;1105 116E 11C0;B901;1105 116E 11C0;
+B902;B902;1105 116E 11C1;B902;1105 116E 11C1;
+B903;B903;1105 116E 11C2;B903;1105 116E 11C2;
+B904;B904;1105 116F;B904;1105 116F;
+B905;B905;1105 116F 11A8;B905;1105 116F 11A8;
+B906;B906;1105 116F 11A9;B906;1105 116F 11A9;
+B907;B907;1105 116F 11AA;B907;1105 116F 11AA;
+B908;B908;1105 116F 11AB;B908;1105 116F 11AB;
+B909;B909;1105 116F 11AC;B909;1105 116F 11AC;
+B90A;B90A;1105 116F 11AD;B90A;1105 116F 11AD;
+B90B;B90B;1105 116F 11AE;B90B;1105 116F 11AE;
+B90C;B90C;1105 116F 11AF;B90C;1105 116F 11AF;
+B90D;B90D;1105 116F 11B0;B90D;1105 116F 11B0;
+B90E;B90E;1105 116F 11B1;B90E;1105 116F 11B1;
+B90F;B90F;1105 116F 11B2;B90F;1105 116F 11B2;
+B910;B910;1105 116F 11B3;B910;1105 116F 11B3;
+B911;B911;1105 116F 11B4;B911;1105 116F 11B4;
+B912;B912;1105 116F 11B5;B912;1105 116F 11B5;
+B913;B913;1105 116F 11B6;B913;1105 116F 11B6;
+B914;B914;1105 116F 11B7;B914;1105 116F 11B7;
+B915;B915;1105 116F 11B8;B915;1105 116F 11B8;
+B916;B916;1105 116F 11B9;B916;1105 116F 11B9;
+B917;B917;1105 116F 11BA;B917;1105 116F 11BA;
+B918;B918;1105 116F 11BB;B918;1105 116F 11BB;
+B919;B919;1105 116F 11BC;B919;1105 116F 11BC;
+B91A;B91A;1105 116F 11BD;B91A;1105 116F 11BD;
+B91B;B91B;1105 116F 11BE;B91B;1105 116F 11BE;
+B91C;B91C;1105 116F 11BF;B91C;1105 116F 11BF;
+B91D;B91D;1105 116F 11C0;B91D;1105 116F 11C0;
+B91E;B91E;1105 116F 11C1;B91E;1105 116F 11C1;
+B91F;B91F;1105 116F 11C2;B91F;1105 116F 11C2;
+B920;B920;1105 1170;B920;1105 1170;
+B921;B921;1105 1170 11A8;B921;1105 1170 11A8;
+B922;B922;1105 1170 11A9;B922;1105 1170 11A9;
+B923;B923;1105 1170 11AA;B923;1105 1170 11AA;
+B924;B924;1105 1170 11AB;B924;1105 1170 11AB;
+B925;B925;1105 1170 11AC;B925;1105 1170 11AC;
+B926;B926;1105 1170 11AD;B926;1105 1170 11AD;
+B927;B927;1105 1170 11AE;B927;1105 1170 11AE;
+B928;B928;1105 1170 11AF;B928;1105 1170 11AF;
+B929;B929;1105 1170 11B0;B929;1105 1170 11B0;
+B92A;B92A;1105 1170 11B1;B92A;1105 1170 11B1;
+B92B;B92B;1105 1170 11B2;B92B;1105 1170 11B2;
+B92C;B92C;1105 1170 11B3;B92C;1105 1170 11B3;
+B92D;B92D;1105 1170 11B4;B92D;1105 1170 11B4;
+B92E;B92E;1105 1170 11B5;B92E;1105 1170 11B5;
+B92F;B92F;1105 1170 11B6;B92F;1105 1170 11B6;
+B930;B930;1105 1170 11B7;B930;1105 1170 11B7;
+B931;B931;1105 1170 11B8;B931;1105 1170 11B8;
+B932;B932;1105 1170 11B9;B932;1105 1170 11B9;
+B933;B933;1105 1170 11BA;B933;1105 1170 11BA;
+B934;B934;1105 1170 11BB;B934;1105 1170 11BB;
+B935;B935;1105 1170 11BC;B935;1105 1170 11BC;
+B936;B936;1105 1170 11BD;B936;1105 1170 11BD;
+B937;B937;1105 1170 11BE;B937;1105 1170 11BE;
+B938;B938;1105 1170 11BF;B938;1105 1170 11BF;
+B939;B939;1105 1170 11C0;B939;1105 1170 11C0;
+B93A;B93A;1105 1170 11C1;B93A;1105 1170 11C1;
+B93B;B93B;1105 1170 11C2;B93B;1105 1170 11C2;
+B93C;B93C;1105 1171;B93C;1105 1171;
+B93D;B93D;1105 1171 11A8;B93D;1105 1171 11A8;
+B93E;B93E;1105 1171 11A9;B93E;1105 1171 11A9;
+B93F;B93F;1105 1171 11AA;B93F;1105 1171 11AA;
+B940;B940;1105 1171 11AB;B940;1105 1171 11AB;
+B941;B941;1105 1171 11AC;B941;1105 1171 11AC;
+B942;B942;1105 1171 11AD;B942;1105 1171 11AD;
+B943;B943;1105 1171 11AE;B943;1105 1171 11AE;
+B944;B944;1105 1171 11AF;B944;1105 1171 11AF;
+B945;B945;1105 1171 11B0;B945;1105 1171 11B0;
+B946;B946;1105 1171 11B1;B946;1105 1171 11B1;
+B947;B947;1105 1171 11B2;B947;1105 1171 11B2;
+B948;B948;1105 1171 11B3;B948;1105 1171 11B3;
+B949;B949;1105 1171 11B4;B949;1105 1171 11B4;
+B94A;B94A;1105 1171 11B5;B94A;1105 1171 11B5;
+B94B;B94B;1105 1171 11B6;B94B;1105 1171 11B6;
+B94C;B94C;1105 1171 11B7;B94C;1105 1171 11B7;
+B94D;B94D;1105 1171 11B8;B94D;1105 1171 11B8;
+B94E;B94E;1105 1171 11B9;B94E;1105 1171 11B9;
+B94F;B94F;1105 1171 11BA;B94F;1105 1171 11BA;
+B950;B950;1105 1171 11BB;B950;1105 1171 11BB;
+B951;B951;1105 1171 11BC;B951;1105 1171 11BC;
+B952;B952;1105 1171 11BD;B952;1105 1171 11BD;
+B953;B953;1105 1171 11BE;B953;1105 1171 11BE;
+B954;B954;1105 1171 11BF;B954;1105 1171 11BF;
+B955;B955;1105 1171 11C0;B955;1105 1171 11C0;
+B956;B956;1105 1171 11C1;B956;1105 1171 11C1;
+B957;B957;1105 1171 11C2;B957;1105 1171 11C2;
+B958;B958;1105 1172;B958;1105 1172;
+B959;B959;1105 1172 11A8;B959;1105 1172 11A8;
+B95A;B95A;1105 1172 11A9;B95A;1105 1172 11A9;
+B95B;B95B;1105 1172 11AA;B95B;1105 1172 11AA;
+B95C;B95C;1105 1172 11AB;B95C;1105 1172 11AB;
+B95D;B95D;1105 1172 11AC;B95D;1105 1172 11AC;
+B95E;B95E;1105 1172 11AD;B95E;1105 1172 11AD;
+B95F;B95F;1105 1172 11AE;B95F;1105 1172 11AE;
+B960;B960;1105 1172 11AF;B960;1105 1172 11AF;
+B961;B961;1105 1172 11B0;B961;1105 1172 11B0;
+B962;B962;1105 1172 11B1;B962;1105 1172 11B1;
+B963;B963;1105 1172 11B2;B963;1105 1172 11B2;
+B964;B964;1105 1172 11B3;B964;1105 1172 11B3;
+B965;B965;1105 1172 11B4;B965;1105 1172 11B4;
+B966;B966;1105 1172 11B5;B966;1105 1172 11B5;
+B967;B967;1105 1172 11B6;B967;1105 1172 11B6;
+B968;B968;1105 1172 11B7;B968;1105 1172 11B7;
+B969;B969;1105 1172 11B8;B969;1105 1172 11B8;
+B96A;B96A;1105 1172 11B9;B96A;1105 1172 11B9;
+B96B;B96B;1105 1172 11BA;B96B;1105 1172 11BA;
+B96C;B96C;1105 1172 11BB;B96C;1105 1172 11BB;
+B96D;B96D;1105 1172 11BC;B96D;1105 1172 11BC;
+B96E;B96E;1105 1172 11BD;B96E;1105 1172 11BD;
+B96F;B96F;1105 1172 11BE;B96F;1105 1172 11BE;
+B970;B970;1105 1172 11BF;B970;1105 1172 11BF;
+B971;B971;1105 1172 11C0;B971;1105 1172 11C0;
+B972;B972;1105 1172 11C1;B972;1105 1172 11C1;
+B973;B973;1105 1172 11C2;B973;1105 1172 11C2;
+B974;B974;1105 1173;B974;1105 1173;
+B975;B975;1105 1173 11A8;B975;1105 1173 11A8;
+B976;B976;1105 1173 11A9;B976;1105 1173 11A9;
+B977;B977;1105 1173 11AA;B977;1105 1173 11AA;
+B978;B978;1105 1173 11AB;B978;1105 1173 11AB;
+B979;B979;1105 1173 11AC;B979;1105 1173 11AC;
+B97A;B97A;1105 1173 11AD;B97A;1105 1173 11AD;
+B97B;B97B;1105 1173 11AE;B97B;1105 1173 11AE;
+B97C;B97C;1105 1173 11AF;B97C;1105 1173 11AF;
+B97D;B97D;1105 1173 11B0;B97D;1105 1173 11B0;
+B97E;B97E;1105 1173 11B1;B97E;1105 1173 11B1;
+B97F;B97F;1105 1173 11B2;B97F;1105 1173 11B2;
+B980;B980;1105 1173 11B3;B980;1105 1173 11B3;
+B981;B981;1105 1173 11B4;B981;1105 1173 11B4;
+B982;B982;1105 1173 11B5;B982;1105 1173 11B5;
+B983;B983;1105 1173 11B6;B983;1105 1173 11B6;
+B984;B984;1105 1173 11B7;B984;1105 1173 11B7;
+B985;B985;1105 1173 11B8;B985;1105 1173 11B8;
+B986;B986;1105 1173 11B9;B986;1105 1173 11B9;
+B987;B987;1105 1173 11BA;B987;1105 1173 11BA;
+B988;B988;1105 1173 11BB;B988;1105 1173 11BB;
+B989;B989;1105 1173 11BC;B989;1105 1173 11BC;
+B98A;B98A;1105 1173 11BD;B98A;1105 1173 11BD;
+B98B;B98B;1105 1173 11BE;B98B;1105 1173 11BE;
+B98C;B98C;1105 1173 11BF;B98C;1105 1173 11BF;
+B98D;B98D;1105 1173 11C0;B98D;1105 1173 11C0;
+B98E;B98E;1105 1173 11C1;B98E;1105 1173 11C1;
+B98F;B98F;1105 1173 11C2;B98F;1105 1173 11C2;
+B990;B990;1105 1174;B990;1105 1174;
+B991;B991;1105 1174 11A8;B991;1105 1174 11A8;
+B992;B992;1105 1174 11A9;B992;1105 1174 11A9;
+B993;B993;1105 1174 11AA;B993;1105 1174 11AA;
+B994;B994;1105 1174 11AB;B994;1105 1174 11AB;
+B995;B995;1105 1174 11AC;B995;1105 1174 11AC;
+B996;B996;1105 1174 11AD;B996;1105 1174 11AD;
+B997;B997;1105 1174 11AE;B997;1105 1174 11AE;
+B998;B998;1105 1174 11AF;B998;1105 1174 11AF;
+B999;B999;1105 1174 11B0;B999;1105 1174 11B0;
+B99A;B99A;1105 1174 11B1;B99A;1105 1174 11B1;
+B99B;B99B;1105 1174 11B2;B99B;1105 1174 11B2;
+B99C;B99C;1105 1174 11B3;B99C;1105 1174 11B3;
+B99D;B99D;1105 1174 11B4;B99D;1105 1174 11B4;
+B99E;B99E;1105 1174 11B5;B99E;1105 1174 11B5;
+B99F;B99F;1105 1174 11B6;B99F;1105 1174 11B6;
+B9A0;B9A0;1105 1174 11B7;B9A0;1105 1174 11B7;
+B9A1;B9A1;1105 1174 11B8;B9A1;1105 1174 11B8;
+B9A2;B9A2;1105 1174 11B9;B9A2;1105 1174 11B9;
+B9A3;B9A3;1105 1174 11BA;B9A3;1105 1174 11BA;
+B9A4;B9A4;1105 1174 11BB;B9A4;1105 1174 11BB;
+B9A5;B9A5;1105 1174 11BC;B9A5;1105 1174 11BC;
+B9A6;B9A6;1105 1174 11BD;B9A6;1105 1174 11BD;
+B9A7;B9A7;1105 1174 11BE;B9A7;1105 1174 11BE;
+B9A8;B9A8;1105 1174 11BF;B9A8;1105 1174 11BF;
+B9A9;B9A9;1105 1174 11C0;B9A9;1105 1174 11C0;
+B9AA;B9AA;1105 1174 11C1;B9AA;1105 1174 11C1;
+B9AB;B9AB;1105 1174 11C2;B9AB;1105 1174 11C2;
+B9AC;B9AC;1105 1175;B9AC;1105 1175;
+B9AD;B9AD;1105 1175 11A8;B9AD;1105 1175 11A8;
+B9AE;B9AE;1105 1175 11A9;B9AE;1105 1175 11A9;
+B9AF;B9AF;1105 1175 11AA;B9AF;1105 1175 11AA;
+B9B0;B9B0;1105 1175 11AB;B9B0;1105 1175 11AB;
+B9B1;B9B1;1105 1175 11AC;B9B1;1105 1175 11AC;
+B9B2;B9B2;1105 1175 11AD;B9B2;1105 1175 11AD;
+B9B3;B9B3;1105 1175 11AE;B9B3;1105 1175 11AE;
+B9B4;B9B4;1105 1175 11AF;B9B4;1105 1175 11AF;
+B9B5;B9B5;1105 1175 11B0;B9B5;1105 1175 11B0;
+B9B6;B9B6;1105 1175 11B1;B9B6;1105 1175 11B1;
+B9B7;B9B7;1105 1175 11B2;B9B7;1105 1175 11B2;
+B9B8;B9B8;1105 1175 11B3;B9B8;1105 1175 11B3;
+B9B9;B9B9;1105 1175 11B4;B9B9;1105 1175 11B4;
+B9BA;B9BA;1105 1175 11B5;B9BA;1105 1175 11B5;
+B9BB;B9BB;1105 1175 11B6;B9BB;1105 1175 11B6;
+B9BC;B9BC;1105 1175 11B7;B9BC;1105 1175 11B7;
+B9BD;B9BD;1105 1175 11B8;B9BD;1105 1175 11B8;
+B9BE;B9BE;1105 1175 11B9;B9BE;1105 1175 11B9;
+B9BF;B9BF;1105 1175 11BA;B9BF;1105 1175 11BA;
+B9C0;B9C0;1105 1175 11BB;B9C0;1105 1175 11BB;
+B9C1;B9C1;1105 1175 11BC;B9C1;1105 1175 11BC;
+B9C2;B9C2;1105 1175 11BD;B9C2;1105 1175 11BD;
+B9C3;B9C3;1105 1175 11BE;B9C3;1105 1175 11BE;
+B9C4;B9C4;1105 1175 11BF;B9C4;1105 1175 11BF;
+B9C5;B9C5;1105 1175 11C0;B9C5;1105 1175 11C0;
+B9C6;B9C6;1105 1175 11C1;B9C6;1105 1175 11C1;
+B9C7;B9C7;1105 1175 11C2;B9C7;1105 1175 11C2;
+B9C8;B9C8;1106 1161;B9C8;1106 1161;
+B9C9;B9C9;1106 1161 11A8;B9C9;1106 1161 11A8;
+B9CA;B9CA;1106 1161 11A9;B9CA;1106 1161 11A9;
+B9CB;B9CB;1106 1161 11AA;B9CB;1106 1161 11AA;
+B9CC;B9CC;1106 1161 11AB;B9CC;1106 1161 11AB;
+B9CD;B9CD;1106 1161 11AC;B9CD;1106 1161 11AC;
+B9CE;B9CE;1106 1161 11AD;B9CE;1106 1161 11AD;
+B9CF;B9CF;1106 1161 11AE;B9CF;1106 1161 11AE;
+B9D0;B9D0;1106 1161 11AF;B9D0;1106 1161 11AF;
+B9D1;B9D1;1106 1161 11B0;B9D1;1106 1161 11B0;
+B9D2;B9D2;1106 1161 11B1;B9D2;1106 1161 11B1;
+B9D3;B9D3;1106 1161 11B2;B9D3;1106 1161 11B2;
+B9D4;B9D4;1106 1161 11B3;B9D4;1106 1161 11B3;
+B9D5;B9D5;1106 1161 11B4;B9D5;1106 1161 11B4;
+B9D6;B9D6;1106 1161 11B5;B9D6;1106 1161 11B5;
+B9D7;B9D7;1106 1161 11B6;B9D7;1106 1161 11B6;
+B9D8;B9D8;1106 1161 11B7;B9D8;1106 1161 11B7;
+B9D9;B9D9;1106 1161 11B8;B9D9;1106 1161 11B8;
+B9DA;B9DA;1106 1161 11B9;B9DA;1106 1161 11B9;
+B9DB;B9DB;1106 1161 11BA;B9DB;1106 1161 11BA;
+B9DC;B9DC;1106 1161 11BB;B9DC;1106 1161 11BB;
+B9DD;B9DD;1106 1161 11BC;B9DD;1106 1161 11BC;
+B9DE;B9DE;1106 1161 11BD;B9DE;1106 1161 11BD;
+B9DF;B9DF;1106 1161 11BE;B9DF;1106 1161 11BE;
+B9E0;B9E0;1106 1161 11BF;B9E0;1106 1161 11BF;
+B9E1;B9E1;1106 1161 11C0;B9E1;1106 1161 11C0;
+B9E2;B9E2;1106 1161 11C1;B9E2;1106 1161 11C1;
+B9E3;B9E3;1106 1161 11C2;B9E3;1106 1161 11C2;
+B9E4;B9E4;1106 1162;B9E4;1106 1162;
+B9E5;B9E5;1106 1162 11A8;B9E5;1106 1162 11A8;
+B9E6;B9E6;1106 1162 11A9;B9E6;1106 1162 11A9;
+B9E7;B9E7;1106 1162 11AA;B9E7;1106 1162 11AA;
+B9E8;B9E8;1106 1162 11AB;B9E8;1106 1162 11AB;
+B9E9;B9E9;1106 1162 11AC;B9E9;1106 1162 11AC;
+B9EA;B9EA;1106 1162 11AD;B9EA;1106 1162 11AD;
+B9EB;B9EB;1106 1162 11AE;B9EB;1106 1162 11AE;
+B9EC;B9EC;1106 1162 11AF;B9EC;1106 1162 11AF;
+B9ED;B9ED;1106 1162 11B0;B9ED;1106 1162 11B0;
+B9EE;B9EE;1106 1162 11B1;B9EE;1106 1162 11B1;
+B9EF;B9EF;1106 1162 11B2;B9EF;1106 1162 11B2;
+B9F0;B9F0;1106 1162 11B3;B9F0;1106 1162 11B3;
+B9F1;B9F1;1106 1162 11B4;B9F1;1106 1162 11B4;
+B9F2;B9F2;1106 1162 11B5;B9F2;1106 1162 11B5;
+B9F3;B9F3;1106 1162 11B6;B9F3;1106 1162 11B6;
+B9F4;B9F4;1106 1162 11B7;B9F4;1106 1162 11B7;
+B9F5;B9F5;1106 1162 11B8;B9F5;1106 1162 11B8;
+B9F6;B9F6;1106 1162 11B9;B9F6;1106 1162 11B9;
+B9F7;B9F7;1106 1162 11BA;B9F7;1106 1162 11BA;
+B9F8;B9F8;1106 1162 11BB;B9F8;1106 1162 11BB;
+B9F9;B9F9;1106 1162 11BC;B9F9;1106 1162 11BC;
+B9FA;B9FA;1106 1162 11BD;B9FA;1106 1162 11BD;
+B9FB;B9FB;1106 1162 11BE;B9FB;1106 1162 11BE;
+B9FC;B9FC;1106 1162 11BF;B9FC;1106 1162 11BF;
+B9FD;B9FD;1106 1162 11C0;B9FD;1106 1162 11C0;
+B9FE;B9FE;1106 1162 11C1;B9FE;1106 1162 11C1;
+B9FF;B9FF;1106 1162 11C2;B9FF;1106 1162 11C2;
+BA00;BA00;1106 1163;BA00;1106 1163;
+BA01;BA01;1106 1163 11A8;BA01;1106 1163 11A8;
+BA02;BA02;1106 1163 11A9;BA02;1106 1163 11A9;
+BA03;BA03;1106 1163 11AA;BA03;1106 1163 11AA;
+BA04;BA04;1106 1163 11AB;BA04;1106 1163 11AB;
+BA05;BA05;1106 1163 11AC;BA05;1106 1163 11AC;
+BA06;BA06;1106 1163 11AD;BA06;1106 1163 11AD;
+BA07;BA07;1106 1163 11AE;BA07;1106 1163 11AE;
+BA08;BA08;1106 1163 11AF;BA08;1106 1163 11AF;
+BA09;BA09;1106 1163 11B0;BA09;1106 1163 11B0;
+BA0A;BA0A;1106 1163 11B1;BA0A;1106 1163 11B1;
+BA0B;BA0B;1106 1163 11B2;BA0B;1106 1163 11B2;
+BA0C;BA0C;1106 1163 11B3;BA0C;1106 1163 11B3;
+BA0D;BA0D;1106 1163 11B4;BA0D;1106 1163 11B4;
+BA0E;BA0E;1106 1163 11B5;BA0E;1106 1163 11B5;
+BA0F;BA0F;1106 1163 11B6;BA0F;1106 1163 11B6;
+BA10;BA10;1106 1163 11B7;BA10;1106 1163 11B7;
+BA11;BA11;1106 1163 11B8;BA11;1106 1163 11B8;
+BA12;BA12;1106 1163 11B9;BA12;1106 1163 11B9;
+BA13;BA13;1106 1163 11BA;BA13;1106 1163 11BA;
+BA14;BA14;1106 1163 11BB;BA14;1106 1163 11BB;
+BA15;BA15;1106 1163 11BC;BA15;1106 1163 11BC;
+BA16;BA16;1106 1163 11BD;BA16;1106 1163 11BD;
+BA17;BA17;1106 1163 11BE;BA17;1106 1163 11BE;
+BA18;BA18;1106 1163 11BF;BA18;1106 1163 11BF;
+BA19;BA19;1106 1163 11C0;BA19;1106 1163 11C0;
+BA1A;BA1A;1106 1163 11C1;BA1A;1106 1163 11C1;
+BA1B;BA1B;1106 1163 11C2;BA1B;1106 1163 11C2;
+BA1C;BA1C;1106 1164;BA1C;1106 1164;
+BA1D;BA1D;1106 1164 11A8;BA1D;1106 1164 11A8;
+BA1E;BA1E;1106 1164 11A9;BA1E;1106 1164 11A9;
+BA1F;BA1F;1106 1164 11AA;BA1F;1106 1164 11AA;
+BA20;BA20;1106 1164 11AB;BA20;1106 1164 11AB;
+BA21;BA21;1106 1164 11AC;BA21;1106 1164 11AC;
+BA22;BA22;1106 1164 11AD;BA22;1106 1164 11AD;
+BA23;BA23;1106 1164 11AE;BA23;1106 1164 11AE;
+BA24;BA24;1106 1164 11AF;BA24;1106 1164 11AF;
+BA25;BA25;1106 1164 11B0;BA25;1106 1164 11B0;
+BA26;BA26;1106 1164 11B1;BA26;1106 1164 11B1;
+BA27;BA27;1106 1164 11B2;BA27;1106 1164 11B2;
+BA28;BA28;1106 1164 11B3;BA28;1106 1164 11B3;
+BA29;BA29;1106 1164 11B4;BA29;1106 1164 11B4;
+BA2A;BA2A;1106 1164 11B5;BA2A;1106 1164 11B5;
+BA2B;BA2B;1106 1164 11B6;BA2B;1106 1164 11B6;
+BA2C;BA2C;1106 1164 11B7;BA2C;1106 1164 11B7;
+BA2D;BA2D;1106 1164 11B8;BA2D;1106 1164 11B8;
+BA2E;BA2E;1106 1164 11B9;BA2E;1106 1164 11B9;
+BA2F;BA2F;1106 1164 11BA;BA2F;1106 1164 11BA;
+BA30;BA30;1106 1164 11BB;BA30;1106 1164 11BB;
+BA31;BA31;1106 1164 11BC;BA31;1106 1164 11BC;
+BA32;BA32;1106 1164 11BD;BA32;1106 1164 11BD;
+BA33;BA33;1106 1164 11BE;BA33;1106 1164 11BE;
+BA34;BA34;1106 1164 11BF;BA34;1106 1164 11BF;
+BA35;BA35;1106 1164 11C0;BA35;1106 1164 11C0;
+BA36;BA36;1106 1164 11C1;BA36;1106 1164 11C1;
+BA37;BA37;1106 1164 11C2;BA37;1106 1164 11C2;
+BA38;BA38;1106 1165;BA38;1106 1165;
+BA39;BA39;1106 1165 11A8;BA39;1106 1165 11A8;
+BA3A;BA3A;1106 1165 11A9;BA3A;1106 1165 11A9;
+BA3B;BA3B;1106 1165 11AA;BA3B;1106 1165 11AA;
+BA3C;BA3C;1106 1165 11AB;BA3C;1106 1165 11AB;
+BA3D;BA3D;1106 1165 11AC;BA3D;1106 1165 11AC;
+BA3E;BA3E;1106 1165 11AD;BA3E;1106 1165 11AD;
+BA3F;BA3F;1106 1165 11AE;BA3F;1106 1165 11AE;
+BA40;BA40;1106 1165 11AF;BA40;1106 1165 11AF;
+BA41;BA41;1106 1165 11B0;BA41;1106 1165 11B0;
+BA42;BA42;1106 1165 11B1;BA42;1106 1165 11B1;
+BA43;BA43;1106 1165 11B2;BA43;1106 1165 11B2;
+BA44;BA44;1106 1165 11B3;BA44;1106 1165 11B3;
+BA45;BA45;1106 1165 11B4;BA45;1106 1165 11B4;
+BA46;BA46;1106 1165 11B5;BA46;1106 1165 11B5;
+BA47;BA47;1106 1165 11B6;BA47;1106 1165 11B6;
+BA48;BA48;1106 1165 11B7;BA48;1106 1165 11B7;
+BA49;BA49;1106 1165 11B8;BA49;1106 1165 11B8;
+BA4A;BA4A;1106 1165 11B9;BA4A;1106 1165 11B9;
+BA4B;BA4B;1106 1165 11BA;BA4B;1106 1165 11BA;
+BA4C;BA4C;1106 1165 11BB;BA4C;1106 1165 11BB;
+BA4D;BA4D;1106 1165 11BC;BA4D;1106 1165 11BC;
+BA4E;BA4E;1106 1165 11BD;BA4E;1106 1165 11BD;
+BA4F;BA4F;1106 1165 11BE;BA4F;1106 1165 11BE;
+BA50;BA50;1106 1165 11BF;BA50;1106 1165 11BF;
+BA51;BA51;1106 1165 11C0;BA51;1106 1165 11C0;
+BA52;BA52;1106 1165 11C1;BA52;1106 1165 11C1;
+BA53;BA53;1106 1165 11C2;BA53;1106 1165 11C2;
+BA54;BA54;1106 1166;BA54;1106 1166;
+BA55;BA55;1106 1166 11A8;BA55;1106 1166 11A8;
+BA56;BA56;1106 1166 11A9;BA56;1106 1166 11A9;
+BA57;BA57;1106 1166 11AA;BA57;1106 1166 11AA;
+BA58;BA58;1106 1166 11AB;BA58;1106 1166 11AB;
+BA59;BA59;1106 1166 11AC;BA59;1106 1166 11AC;
+BA5A;BA5A;1106 1166 11AD;BA5A;1106 1166 11AD;
+BA5B;BA5B;1106 1166 11AE;BA5B;1106 1166 11AE;
+BA5C;BA5C;1106 1166 11AF;BA5C;1106 1166 11AF;
+BA5D;BA5D;1106 1166 11B0;BA5D;1106 1166 11B0;
+BA5E;BA5E;1106 1166 11B1;BA5E;1106 1166 11B1;
+BA5F;BA5F;1106 1166 11B2;BA5F;1106 1166 11B2;
+BA60;BA60;1106 1166 11B3;BA60;1106 1166 11B3;
+BA61;BA61;1106 1166 11B4;BA61;1106 1166 11B4;
+BA62;BA62;1106 1166 11B5;BA62;1106 1166 11B5;
+BA63;BA63;1106 1166 11B6;BA63;1106 1166 11B6;
+BA64;BA64;1106 1166 11B7;BA64;1106 1166 11B7;
+BA65;BA65;1106 1166 11B8;BA65;1106 1166 11B8;
+BA66;BA66;1106 1166 11B9;BA66;1106 1166 11B9;
+BA67;BA67;1106 1166 11BA;BA67;1106 1166 11BA;
+BA68;BA68;1106 1166 11BB;BA68;1106 1166 11BB;
+BA69;BA69;1106 1166 11BC;BA69;1106 1166 11BC;
+BA6A;BA6A;1106 1166 11BD;BA6A;1106 1166 11BD;
+BA6B;BA6B;1106 1166 11BE;BA6B;1106 1166 11BE;
+BA6C;BA6C;1106 1166 11BF;BA6C;1106 1166 11BF;
+BA6D;BA6D;1106 1166 11C0;BA6D;1106 1166 11C0;
+BA6E;BA6E;1106 1166 11C1;BA6E;1106 1166 11C1;
+BA6F;BA6F;1106 1166 11C2;BA6F;1106 1166 11C2;
+BA70;BA70;1106 1167;BA70;1106 1167;
+BA71;BA71;1106 1167 11A8;BA71;1106 1167 11A8;
+BA72;BA72;1106 1167 11A9;BA72;1106 1167 11A9;
+BA73;BA73;1106 1167 11AA;BA73;1106 1167 11AA;
+BA74;BA74;1106 1167 11AB;BA74;1106 1167 11AB;
+BA75;BA75;1106 1167 11AC;BA75;1106 1167 11AC;
+BA76;BA76;1106 1167 11AD;BA76;1106 1167 11AD;
+BA77;BA77;1106 1167 11AE;BA77;1106 1167 11AE;
+BA78;BA78;1106 1167 11AF;BA78;1106 1167 11AF;
+BA79;BA79;1106 1167 11B0;BA79;1106 1167 11B0;
+BA7A;BA7A;1106 1167 11B1;BA7A;1106 1167 11B1;
+BA7B;BA7B;1106 1167 11B2;BA7B;1106 1167 11B2;
+BA7C;BA7C;1106 1167 11B3;BA7C;1106 1167 11B3;
+BA7D;BA7D;1106 1167 11B4;BA7D;1106 1167 11B4;
+BA7E;BA7E;1106 1167 11B5;BA7E;1106 1167 11B5;
+BA7F;BA7F;1106 1167 11B6;BA7F;1106 1167 11B6;
+BA80;BA80;1106 1167 11B7;BA80;1106 1167 11B7;
+BA81;BA81;1106 1167 11B8;BA81;1106 1167 11B8;
+BA82;BA82;1106 1167 11B9;BA82;1106 1167 11B9;
+BA83;BA83;1106 1167 11BA;BA83;1106 1167 11BA;
+BA84;BA84;1106 1167 11BB;BA84;1106 1167 11BB;
+BA85;BA85;1106 1167 11BC;BA85;1106 1167 11BC;
+BA86;BA86;1106 1167 11BD;BA86;1106 1167 11BD;
+BA87;BA87;1106 1167 11BE;BA87;1106 1167 11BE;
+BA88;BA88;1106 1167 11BF;BA88;1106 1167 11BF;
+BA89;BA89;1106 1167 11C0;BA89;1106 1167 11C0;
+BA8A;BA8A;1106 1167 11C1;BA8A;1106 1167 11C1;
+BA8B;BA8B;1106 1167 11C2;BA8B;1106 1167 11C2;
+BA8C;BA8C;1106 1168;BA8C;1106 1168;
+BA8D;BA8D;1106 1168 11A8;BA8D;1106 1168 11A8;
+BA8E;BA8E;1106 1168 11A9;BA8E;1106 1168 11A9;
+BA8F;BA8F;1106 1168 11AA;BA8F;1106 1168 11AA;
+BA90;BA90;1106 1168 11AB;BA90;1106 1168 11AB;
+BA91;BA91;1106 1168 11AC;BA91;1106 1168 11AC;
+BA92;BA92;1106 1168 11AD;BA92;1106 1168 11AD;
+BA93;BA93;1106 1168 11AE;BA93;1106 1168 11AE;
+BA94;BA94;1106 1168 11AF;BA94;1106 1168 11AF;
+BA95;BA95;1106 1168 11B0;BA95;1106 1168 11B0;
+BA96;BA96;1106 1168 11B1;BA96;1106 1168 11B1;
+BA97;BA97;1106 1168 11B2;BA97;1106 1168 11B2;
+BA98;BA98;1106 1168 11B3;BA98;1106 1168 11B3;
+BA99;BA99;1106 1168 11B4;BA99;1106 1168 11B4;
+BA9A;BA9A;1106 1168 11B5;BA9A;1106 1168 11B5;
+BA9B;BA9B;1106 1168 11B6;BA9B;1106 1168 11B6;
+BA9C;BA9C;1106 1168 11B7;BA9C;1106 1168 11B7;
+BA9D;BA9D;1106 1168 11B8;BA9D;1106 1168 11B8;
+BA9E;BA9E;1106 1168 11B9;BA9E;1106 1168 11B9;
+BA9F;BA9F;1106 1168 11BA;BA9F;1106 1168 11BA;
+BAA0;BAA0;1106 1168 11BB;BAA0;1106 1168 11BB;
+BAA1;BAA1;1106 1168 11BC;BAA1;1106 1168 11BC;
+BAA2;BAA2;1106 1168 11BD;BAA2;1106 1168 11BD;
+BAA3;BAA3;1106 1168 11BE;BAA3;1106 1168 11BE;
+BAA4;BAA4;1106 1168 11BF;BAA4;1106 1168 11BF;
+BAA5;BAA5;1106 1168 11C0;BAA5;1106 1168 11C0;
+BAA6;BAA6;1106 1168 11C1;BAA6;1106 1168 11C1;
+BAA7;BAA7;1106 1168 11C2;BAA7;1106 1168 11C2;
+BAA8;BAA8;1106 1169;BAA8;1106 1169;
+BAA9;BAA9;1106 1169 11A8;BAA9;1106 1169 11A8;
+BAAA;BAAA;1106 1169 11A9;BAAA;1106 1169 11A9;
+BAAB;BAAB;1106 1169 11AA;BAAB;1106 1169 11AA;
+BAAC;BAAC;1106 1169 11AB;BAAC;1106 1169 11AB;
+BAAD;BAAD;1106 1169 11AC;BAAD;1106 1169 11AC;
+BAAE;BAAE;1106 1169 11AD;BAAE;1106 1169 11AD;
+BAAF;BAAF;1106 1169 11AE;BAAF;1106 1169 11AE;
+BAB0;BAB0;1106 1169 11AF;BAB0;1106 1169 11AF;
+BAB1;BAB1;1106 1169 11B0;BAB1;1106 1169 11B0;
+BAB2;BAB2;1106 1169 11B1;BAB2;1106 1169 11B1;
+BAB3;BAB3;1106 1169 11B2;BAB3;1106 1169 11B2;
+BAB4;BAB4;1106 1169 11B3;BAB4;1106 1169 11B3;
+BAB5;BAB5;1106 1169 11B4;BAB5;1106 1169 11B4;
+BAB6;BAB6;1106 1169 11B5;BAB6;1106 1169 11B5;
+BAB7;BAB7;1106 1169 11B6;BAB7;1106 1169 11B6;
+BAB8;BAB8;1106 1169 11B7;BAB8;1106 1169 11B7;
+BAB9;BAB9;1106 1169 11B8;BAB9;1106 1169 11B8;
+BABA;BABA;1106 1169 11B9;BABA;1106 1169 11B9;
+BABB;BABB;1106 1169 11BA;BABB;1106 1169 11BA;
+BABC;BABC;1106 1169 11BB;BABC;1106 1169 11BB;
+BABD;BABD;1106 1169 11BC;BABD;1106 1169 11BC;
+BABE;BABE;1106 1169 11BD;BABE;1106 1169 11BD;
+BABF;BABF;1106 1169 11BE;BABF;1106 1169 11BE;
+BAC0;BAC0;1106 1169 11BF;BAC0;1106 1169 11BF;
+BAC1;BAC1;1106 1169 11C0;BAC1;1106 1169 11C0;
+BAC2;BAC2;1106 1169 11C1;BAC2;1106 1169 11C1;
+BAC3;BAC3;1106 1169 11C2;BAC3;1106 1169 11C2;
+BAC4;BAC4;1106 116A;BAC4;1106 116A;
+BAC5;BAC5;1106 116A 11A8;BAC5;1106 116A 11A8;
+BAC6;BAC6;1106 116A 11A9;BAC6;1106 116A 11A9;
+BAC7;BAC7;1106 116A 11AA;BAC7;1106 116A 11AA;
+BAC8;BAC8;1106 116A 11AB;BAC8;1106 116A 11AB;
+BAC9;BAC9;1106 116A 11AC;BAC9;1106 116A 11AC;
+BACA;BACA;1106 116A 11AD;BACA;1106 116A 11AD;
+BACB;BACB;1106 116A 11AE;BACB;1106 116A 11AE;
+BACC;BACC;1106 116A 11AF;BACC;1106 116A 11AF;
+BACD;BACD;1106 116A 11B0;BACD;1106 116A 11B0;
+BACE;BACE;1106 116A 11B1;BACE;1106 116A 11B1;
+BACF;BACF;1106 116A 11B2;BACF;1106 116A 11B2;
+BAD0;BAD0;1106 116A 11B3;BAD0;1106 116A 11B3;
+BAD1;BAD1;1106 116A 11B4;BAD1;1106 116A 11B4;
+BAD2;BAD2;1106 116A 11B5;BAD2;1106 116A 11B5;
+BAD3;BAD3;1106 116A 11B6;BAD3;1106 116A 11B6;
+BAD4;BAD4;1106 116A 11B7;BAD4;1106 116A 11B7;
+BAD5;BAD5;1106 116A 11B8;BAD5;1106 116A 11B8;
+BAD6;BAD6;1106 116A 11B9;BAD6;1106 116A 11B9;
+BAD7;BAD7;1106 116A 11BA;BAD7;1106 116A 11BA;
+BAD8;BAD8;1106 116A 11BB;BAD8;1106 116A 11BB;
+BAD9;BAD9;1106 116A 11BC;BAD9;1106 116A 11BC;
+BADA;BADA;1106 116A 11BD;BADA;1106 116A 11BD;
+BADB;BADB;1106 116A 11BE;BADB;1106 116A 11BE;
+BADC;BADC;1106 116A 11BF;BADC;1106 116A 11BF;
+BADD;BADD;1106 116A 11C0;BADD;1106 116A 11C0;
+BADE;BADE;1106 116A 11C1;BADE;1106 116A 11C1;
+BADF;BADF;1106 116A 11C2;BADF;1106 116A 11C2;
+BAE0;BAE0;1106 116B;BAE0;1106 116B;
+BAE1;BAE1;1106 116B 11A8;BAE1;1106 116B 11A8;
+BAE2;BAE2;1106 116B 11A9;BAE2;1106 116B 11A9;
+BAE3;BAE3;1106 116B 11AA;BAE3;1106 116B 11AA;
+BAE4;BAE4;1106 116B 11AB;BAE4;1106 116B 11AB;
+BAE5;BAE5;1106 116B 11AC;BAE5;1106 116B 11AC;
+BAE6;BAE6;1106 116B 11AD;BAE6;1106 116B 11AD;
+BAE7;BAE7;1106 116B 11AE;BAE7;1106 116B 11AE;
+BAE8;BAE8;1106 116B 11AF;BAE8;1106 116B 11AF;
+BAE9;BAE9;1106 116B 11B0;BAE9;1106 116B 11B0;
+BAEA;BAEA;1106 116B 11B1;BAEA;1106 116B 11B1;
+BAEB;BAEB;1106 116B 11B2;BAEB;1106 116B 11B2;
+BAEC;BAEC;1106 116B 11B3;BAEC;1106 116B 11B3;
+BAED;BAED;1106 116B 11B4;BAED;1106 116B 11B4;
+BAEE;BAEE;1106 116B 11B5;BAEE;1106 116B 11B5;
+BAEF;BAEF;1106 116B 11B6;BAEF;1106 116B 11B6;
+BAF0;BAF0;1106 116B 11B7;BAF0;1106 116B 11B7;
+BAF1;BAF1;1106 116B 11B8;BAF1;1106 116B 11B8;
+BAF2;BAF2;1106 116B 11B9;BAF2;1106 116B 11B9;
+BAF3;BAF3;1106 116B 11BA;BAF3;1106 116B 11BA;
+BAF4;BAF4;1106 116B 11BB;BAF4;1106 116B 11BB;
+BAF5;BAF5;1106 116B 11BC;BAF5;1106 116B 11BC;
+BAF6;BAF6;1106 116B 11BD;BAF6;1106 116B 11BD;
+BAF7;BAF7;1106 116B 11BE;BAF7;1106 116B 11BE;
+BAF8;BAF8;1106 116B 11BF;BAF8;1106 116B 11BF;
+BAF9;BAF9;1106 116B 11C0;BAF9;1106 116B 11C0;
+BAFA;BAFA;1106 116B 11C1;BAFA;1106 116B 11C1;
+BAFB;BAFB;1106 116B 11C2;BAFB;1106 116B 11C2;
+BAFC;BAFC;1106 116C;BAFC;1106 116C;
+BAFD;BAFD;1106 116C 11A8;BAFD;1106 116C 11A8;
+BAFE;BAFE;1106 116C 11A9;BAFE;1106 116C 11A9;
+BAFF;BAFF;1106 116C 11AA;BAFF;1106 116C 11AA;
+BB00;BB00;1106 116C 11AB;BB00;1106 116C 11AB;
+BB01;BB01;1106 116C 11AC;BB01;1106 116C 11AC;
+BB02;BB02;1106 116C 11AD;BB02;1106 116C 11AD;
+BB03;BB03;1106 116C 11AE;BB03;1106 116C 11AE;
+BB04;BB04;1106 116C 11AF;BB04;1106 116C 11AF;
+BB05;BB05;1106 116C 11B0;BB05;1106 116C 11B0;
+BB06;BB06;1106 116C 11B1;BB06;1106 116C 11B1;
+BB07;BB07;1106 116C 11B2;BB07;1106 116C 11B2;
+BB08;BB08;1106 116C 11B3;BB08;1106 116C 11B3;
+BB09;BB09;1106 116C 11B4;BB09;1106 116C 11B4;
+BB0A;BB0A;1106 116C 11B5;BB0A;1106 116C 11B5;
+BB0B;BB0B;1106 116C 11B6;BB0B;1106 116C 11B6;
+BB0C;BB0C;1106 116C 11B7;BB0C;1106 116C 11B7;
+BB0D;BB0D;1106 116C 11B8;BB0D;1106 116C 11B8;
+BB0E;BB0E;1106 116C 11B9;BB0E;1106 116C 11B9;
+BB0F;BB0F;1106 116C 11BA;BB0F;1106 116C 11BA;
+BB10;BB10;1106 116C 11BB;BB10;1106 116C 11BB;
+BB11;BB11;1106 116C 11BC;BB11;1106 116C 11BC;
+BB12;BB12;1106 116C 11BD;BB12;1106 116C 11BD;
+BB13;BB13;1106 116C 11BE;BB13;1106 116C 11BE;
+BB14;BB14;1106 116C 11BF;BB14;1106 116C 11BF;
+BB15;BB15;1106 116C 11C0;BB15;1106 116C 11C0;
+BB16;BB16;1106 116C 11C1;BB16;1106 116C 11C1;
+BB17;BB17;1106 116C 11C2;BB17;1106 116C 11C2;
+BB18;BB18;1106 116D;BB18;1106 116D;
+BB19;BB19;1106 116D 11A8;BB19;1106 116D 11A8;
+BB1A;BB1A;1106 116D 11A9;BB1A;1106 116D 11A9;
+BB1B;BB1B;1106 116D 11AA;BB1B;1106 116D 11AA;
+BB1C;BB1C;1106 116D 11AB;BB1C;1106 116D 11AB;
+BB1D;BB1D;1106 116D 11AC;BB1D;1106 116D 11AC;
+BB1E;BB1E;1106 116D 11AD;BB1E;1106 116D 11AD;
+BB1F;BB1F;1106 116D 11AE;BB1F;1106 116D 11AE;
+BB20;BB20;1106 116D 11AF;BB20;1106 116D 11AF;
+BB21;BB21;1106 116D 11B0;BB21;1106 116D 11B0;
+BB22;BB22;1106 116D 11B1;BB22;1106 116D 11B1;
+BB23;BB23;1106 116D 11B2;BB23;1106 116D 11B2;
+BB24;BB24;1106 116D 11B3;BB24;1106 116D 11B3;
+BB25;BB25;1106 116D 11B4;BB25;1106 116D 11B4;
+BB26;BB26;1106 116D 11B5;BB26;1106 116D 11B5;
+BB27;BB27;1106 116D 11B6;BB27;1106 116D 11B6;
+BB28;BB28;1106 116D 11B7;BB28;1106 116D 11B7;
+BB29;BB29;1106 116D 11B8;BB29;1106 116D 11B8;
+BB2A;BB2A;1106 116D 11B9;BB2A;1106 116D 11B9;
+BB2B;BB2B;1106 116D 11BA;BB2B;1106 116D 11BA;
+BB2C;BB2C;1106 116D 11BB;BB2C;1106 116D 11BB;
+BB2D;BB2D;1106 116D 11BC;BB2D;1106 116D 11BC;
+BB2E;BB2E;1106 116D 11BD;BB2E;1106 116D 11BD;
+BB2F;BB2F;1106 116D 11BE;BB2F;1106 116D 11BE;
+BB30;BB30;1106 116D 11BF;BB30;1106 116D 11BF;
+BB31;BB31;1106 116D 11C0;BB31;1106 116D 11C0;
+BB32;BB32;1106 116D 11C1;BB32;1106 116D 11C1;
+BB33;BB33;1106 116D 11C2;BB33;1106 116D 11C2;
+BB34;BB34;1106 116E;BB34;1106 116E;
+BB35;BB35;1106 116E 11A8;BB35;1106 116E 11A8;
+BB36;BB36;1106 116E 11A9;BB36;1106 116E 11A9;
+BB37;BB37;1106 116E 11AA;BB37;1106 116E 11AA;
+BB38;BB38;1106 116E 11AB;BB38;1106 116E 11AB;
+BB39;BB39;1106 116E 11AC;BB39;1106 116E 11AC;
+BB3A;BB3A;1106 116E 11AD;BB3A;1106 116E 11AD;
+BB3B;BB3B;1106 116E 11AE;BB3B;1106 116E 11AE;
+BB3C;BB3C;1106 116E 11AF;BB3C;1106 116E 11AF;
+BB3D;BB3D;1106 116E 11B0;BB3D;1106 116E 11B0;
+BB3E;BB3E;1106 116E 11B1;BB3E;1106 116E 11B1;
+BB3F;BB3F;1106 116E 11B2;BB3F;1106 116E 11B2;
+BB40;BB40;1106 116E 11B3;BB40;1106 116E 11B3;
+BB41;BB41;1106 116E 11B4;BB41;1106 116E 11B4;
+BB42;BB42;1106 116E 11B5;BB42;1106 116E 11B5;
+BB43;BB43;1106 116E 11B6;BB43;1106 116E 11B6;
+BB44;BB44;1106 116E 11B7;BB44;1106 116E 11B7;
+BB45;BB45;1106 116E 11B8;BB45;1106 116E 11B8;
+BB46;BB46;1106 116E 11B9;BB46;1106 116E 11B9;
+BB47;BB47;1106 116E 11BA;BB47;1106 116E 11BA;
+BB48;BB48;1106 116E 11BB;BB48;1106 116E 11BB;
+BB49;BB49;1106 116E 11BC;BB49;1106 116E 11BC;
+BB4A;BB4A;1106 116E 11BD;BB4A;1106 116E 11BD;
+BB4B;BB4B;1106 116E 11BE;BB4B;1106 116E 11BE;
+BB4C;BB4C;1106 116E 11BF;BB4C;1106 116E 11BF;
+BB4D;BB4D;1106 116E 11C0;BB4D;1106 116E 11C0;
+BB4E;BB4E;1106 116E 11C1;BB4E;1106 116E 11C1;
+BB4F;BB4F;1106 116E 11C2;BB4F;1106 116E 11C2;
+BB50;BB50;1106 116F;BB50;1106 116F;
+BB51;BB51;1106 116F 11A8;BB51;1106 116F 11A8;
+BB52;BB52;1106 116F 11A9;BB52;1106 116F 11A9;
+BB53;BB53;1106 116F 11AA;BB53;1106 116F 11AA;
+BB54;BB54;1106 116F 11AB;BB54;1106 116F 11AB;
+BB55;BB55;1106 116F 11AC;BB55;1106 116F 11AC;
+BB56;BB56;1106 116F 11AD;BB56;1106 116F 11AD;
+BB57;BB57;1106 116F 11AE;BB57;1106 116F 11AE;
+BB58;BB58;1106 116F 11AF;BB58;1106 116F 11AF;
+BB59;BB59;1106 116F 11B0;BB59;1106 116F 11B0;
+BB5A;BB5A;1106 116F 11B1;BB5A;1106 116F 11B1;
+BB5B;BB5B;1106 116F 11B2;BB5B;1106 116F 11B2;
+BB5C;BB5C;1106 116F 11B3;BB5C;1106 116F 11B3;
+BB5D;BB5D;1106 116F 11B4;BB5D;1106 116F 11B4;
+BB5E;BB5E;1106 116F 11B5;BB5E;1106 116F 11B5;
+BB5F;BB5F;1106 116F 11B6;BB5F;1106 116F 11B6;
+BB60;BB60;1106 116F 11B7;BB60;1106 116F 11B7;
+BB61;BB61;1106 116F 11B8;BB61;1106 116F 11B8;
+BB62;BB62;1106 116F 11B9;BB62;1106 116F 11B9;
+BB63;BB63;1106 116F 11BA;BB63;1106 116F 11BA;
+BB64;BB64;1106 116F 11BB;BB64;1106 116F 11BB;
+BB65;BB65;1106 116F 11BC;BB65;1106 116F 11BC;
+BB66;BB66;1106 116F 11BD;BB66;1106 116F 11BD;
+BB67;BB67;1106 116F 11BE;BB67;1106 116F 11BE;
+BB68;BB68;1106 116F 11BF;BB68;1106 116F 11BF;
+BB69;BB69;1106 116F 11C0;BB69;1106 116F 11C0;
+BB6A;BB6A;1106 116F 11C1;BB6A;1106 116F 11C1;
+BB6B;BB6B;1106 116F 11C2;BB6B;1106 116F 11C2;
+BB6C;BB6C;1106 1170;BB6C;1106 1170;
+BB6D;BB6D;1106 1170 11A8;BB6D;1106 1170 11A8;
+BB6E;BB6E;1106 1170 11A9;BB6E;1106 1170 11A9;
+BB6F;BB6F;1106 1170 11AA;BB6F;1106 1170 11AA;
+BB70;BB70;1106 1170 11AB;BB70;1106 1170 11AB;
+BB71;BB71;1106 1170 11AC;BB71;1106 1170 11AC;
+BB72;BB72;1106 1170 11AD;BB72;1106 1170 11AD;
+BB73;BB73;1106 1170 11AE;BB73;1106 1170 11AE;
+BB74;BB74;1106 1170 11AF;BB74;1106 1170 11AF;
+BB75;BB75;1106 1170 11B0;BB75;1106 1170 11B0;
+BB76;BB76;1106 1170 11B1;BB76;1106 1170 11B1;
+BB77;BB77;1106 1170 11B2;BB77;1106 1170 11B2;
+BB78;BB78;1106 1170 11B3;BB78;1106 1170 11B3;
+BB79;BB79;1106 1170 11B4;BB79;1106 1170 11B4;
+BB7A;BB7A;1106 1170 11B5;BB7A;1106 1170 11B5;
+BB7B;BB7B;1106 1170 11B6;BB7B;1106 1170 11B6;
+BB7C;BB7C;1106 1170 11B7;BB7C;1106 1170 11B7;
+BB7D;BB7D;1106 1170 11B8;BB7D;1106 1170 11B8;
+BB7E;BB7E;1106 1170 11B9;BB7E;1106 1170 11B9;
+BB7F;BB7F;1106 1170 11BA;BB7F;1106 1170 11BA;
+BB80;BB80;1106 1170 11BB;BB80;1106 1170 11BB;
+BB81;BB81;1106 1170 11BC;BB81;1106 1170 11BC;
+BB82;BB82;1106 1170 11BD;BB82;1106 1170 11BD;
+BB83;BB83;1106 1170 11BE;BB83;1106 1170 11BE;
+BB84;BB84;1106 1170 11BF;BB84;1106 1170 11BF;
+BB85;BB85;1106 1170 11C0;BB85;1106 1170 11C0;
+BB86;BB86;1106 1170 11C1;BB86;1106 1170 11C1;
+BB87;BB87;1106 1170 11C2;BB87;1106 1170 11C2;
+BB88;BB88;1106 1171;BB88;1106 1171;
+BB89;BB89;1106 1171 11A8;BB89;1106 1171 11A8;
+BB8A;BB8A;1106 1171 11A9;BB8A;1106 1171 11A9;
+BB8B;BB8B;1106 1171 11AA;BB8B;1106 1171 11AA;
+BB8C;BB8C;1106 1171 11AB;BB8C;1106 1171 11AB;
+BB8D;BB8D;1106 1171 11AC;BB8D;1106 1171 11AC;
+BB8E;BB8E;1106 1171 11AD;BB8E;1106 1171 11AD;
+BB8F;BB8F;1106 1171 11AE;BB8F;1106 1171 11AE;
+BB90;BB90;1106 1171 11AF;BB90;1106 1171 11AF;
+BB91;BB91;1106 1171 11B0;BB91;1106 1171 11B0;
+BB92;BB92;1106 1171 11B1;BB92;1106 1171 11B1;
+BB93;BB93;1106 1171 11B2;BB93;1106 1171 11B2;
+BB94;BB94;1106 1171 11B3;BB94;1106 1171 11B3;
+BB95;BB95;1106 1171 11B4;BB95;1106 1171 11B4;
+BB96;BB96;1106 1171 11B5;BB96;1106 1171 11B5;
+BB97;BB97;1106 1171 11B6;BB97;1106 1171 11B6;
+BB98;BB98;1106 1171 11B7;BB98;1106 1171 11B7;
+BB99;BB99;1106 1171 11B8;BB99;1106 1171 11B8;
+BB9A;BB9A;1106 1171 11B9;BB9A;1106 1171 11B9;
+BB9B;BB9B;1106 1171 11BA;BB9B;1106 1171 11BA;
+BB9C;BB9C;1106 1171 11BB;BB9C;1106 1171 11BB;
+BB9D;BB9D;1106 1171 11BC;BB9D;1106 1171 11BC;
+BB9E;BB9E;1106 1171 11BD;BB9E;1106 1171 11BD;
+BB9F;BB9F;1106 1171 11BE;BB9F;1106 1171 11BE;
+BBA0;BBA0;1106 1171 11BF;BBA0;1106 1171 11BF;
+BBA1;BBA1;1106 1171 11C0;BBA1;1106 1171 11C0;
+BBA2;BBA2;1106 1171 11C1;BBA2;1106 1171 11C1;
+BBA3;BBA3;1106 1171 11C2;BBA3;1106 1171 11C2;
+BBA4;BBA4;1106 1172;BBA4;1106 1172;
+BBA5;BBA5;1106 1172 11A8;BBA5;1106 1172 11A8;
+BBA6;BBA6;1106 1172 11A9;BBA6;1106 1172 11A9;
+BBA7;BBA7;1106 1172 11AA;BBA7;1106 1172 11AA;
+BBA8;BBA8;1106 1172 11AB;BBA8;1106 1172 11AB;
+BBA9;BBA9;1106 1172 11AC;BBA9;1106 1172 11AC;
+BBAA;BBAA;1106 1172 11AD;BBAA;1106 1172 11AD;
+BBAB;BBAB;1106 1172 11AE;BBAB;1106 1172 11AE;
+BBAC;BBAC;1106 1172 11AF;BBAC;1106 1172 11AF;
+BBAD;BBAD;1106 1172 11B0;BBAD;1106 1172 11B0;
+BBAE;BBAE;1106 1172 11B1;BBAE;1106 1172 11B1;
+BBAF;BBAF;1106 1172 11B2;BBAF;1106 1172 11B2;
+BBB0;BBB0;1106 1172 11B3;BBB0;1106 1172 11B3;
+BBB1;BBB1;1106 1172 11B4;BBB1;1106 1172 11B4;
+BBB2;BBB2;1106 1172 11B5;BBB2;1106 1172 11B5;
+BBB3;BBB3;1106 1172 11B6;BBB3;1106 1172 11B6;
+BBB4;BBB4;1106 1172 11B7;BBB4;1106 1172 11B7;
+BBB5;BBB5;1106 1172 11B8;BBB5;1106 1172 11B8;
+BBB6;BBB6;1106 1172 11B9;BBB6;1106 1172 11B9;
+BBB7;BBB7;1106 1172 11BA;BBB7;1106 1172 11BA;
+BBB8;BBB8;1106 1172 11BB;BBB8;1106 1172 11BB;
+BBB9;BBB9;1106 1172 11BC;BBB9;1106 1172 11BC;
+BBBA;BBBA;1106 1172 11BD;BBBA;1106 1172 11BD;
+BBBB;BBBB;1106 1172 11BE;BBBB;1106 1172 11BE;
+BBBC;BBBC;1106 1172 11BF;BBBC;1106 1172 11BF;
+BBBD;BBBD;1106 1172 11C0;BBBD;1106 1172 11C0;
+BBBE;BBBE;1106 1172 11C1;BBBE;1106 1172 11C1;
+BBBF;BBBF;1106 1172 11C2;BBBF;1106 1172 11C2;
+BBC0;BBC0;1106 1173;BBC0;1106 1173;
+BBC1;BBC1;1106 1173 11A8;BBC1;1106 1173 11A8;
+BBC2;BBC2;1106 1173 11A9;BBC2;1106 1173 11A9;
+BBC3;BBC3;1106 1173 11AA;BBC3;1106 1173 11AA;
+BBC4;BBC4;1106 1173 11AB;BBC4;1106 1173 11AB;
+BBC5;BBC5;1106 1173 11AC;BBC5;1106 1173 11AC;
+BBC6;BBC6;1106 1173 11AD;BBC6;1106 1173 11AD;
+BBC7;BBC7;1106 1173 11AE;BBC7;1106 1173 11AE;
+BBC8;BBC8;1106 1173 11AF;BBC8;1106 1173 11AF;
+BBC9;BBC9;1106 1173 11B0;BBC9;1106 1173 11B0;
+BBCA;BBCA;1106 1173 11B1;BBCA;1106 1173 11B1;
+BBCB;BBCB;1106 1173 11B2;BBCB;1106 1173 11B2;
+BBCC;BBCC;1106 1173 11B3;BBCC;1106 1173 11B3;
+BBCD;BBCD;1106 1173 11B4;BBCD;1106 1173 11B4;
+BBCE;BBCE;1106 1173 11B5;BBCE;1106 1173 11B5;
+BBCF;BBCF;1106 1173 11B6;BBCF;1106 1173 11B6;
+BBD0;BBD0;1106 1173 11B7;BBD0;1106 1173 11B7;
+BBD1;BBD1;1106 1173 11B8;BBD1;1106 1173 11B8;
+BBD2;BBD2;1106 1173 11B9;BBD2;1106 1173 11B9;
+BBD3;BBD3;1106 1173 11BA;BBD3;1106 1173 11BA;
+BBD4;BBD4;1106 1173 11BB;BBD4;1106 1173 11BB;
+BBD5;BBD5;1106 1173 11BC;BBD5;1106 1173 11BC;
+BBD6;BBD6;1106 1173 11BD;BBD6;1106 1173 11BD;
+BBD7;BBD7;1106 1173 11BE;BBD7;1106 1173 11BE;
+BBD8;BBD8;1106 1173 11BF;BBD8;1106 1173 11BF;
+BBD9;BBD9;1106 1173 11C0;BBD9;1106 1173 11C0;
+BBDA;BBDA;1106 1173 11C1;BBDA;1106 1173 11C1;
+BBDB;BBDB;1106 1173 11C2;BBDB;1106 1173 11C2;
+BBDC;BBDC;1106 1174;BBDC;1106 1174;
+BBDD;BBDD;1106 1174 11A8;BBDD;1106 1174 11A8;
+BBDE;BBDE;1106 1174 11A9;BBDE;1106 1174 11A9;
+BBDF;BBDF;1106 1174 11AA;BBDF;1106 1174 11AA;
+BBE0;BBE0;1106 1174 11AB;BBE0;1106 1174 11AB;
+BBE1;BBE1;1106 1174 11AC;BBE1;1106 1174 11AC;
+BBE2;BBE2;1106 1174 11AD;BBE2;1106 1174 11AD;
+BBE3;BBE3;1106 1174 11AE;BBE3;1106 1174 11AE;
+BBE4;BBE4;1106 1174 11AF;BBE4;1106 1174 11AF;
+BBE5;BBE5;1106 1174 11B0;BBE5;1106 1174 11B0;
+BBE6;BBE6;1106 1174 11B1;BBE6;1106 1174 11B1;
+BBE7;BBE7;1106 1174 11B2;BBE7;1106 1174 11B2;
+BBE8;BBE8;1106 1174 11B3;BBE8;1106 1174 11B3;
+BBE9;BBE9;1106 1174 11B4;BBE9;1106 1174 11B4;
+BBEA;BBEA;1106 1174 11B5;BBEA;1106 1174 11B5;
+BBEB;BBEB;1106 1174 11B6;BBEB;1106 1174 11B6;
+BBEC;BBEC;1106 1174 11B7;BBEC;1106 1174 11B7;
+BBED;BBED;1106 1174 11B8;BBED;1106 1174 11B8;
+BBEE;BBEE;1106 1174 11B9;BBEE;1106 1174 11B9;
+BBEF;BBEF;1106 1174 11BA;BBEF;1106 1174 11BA;
+BBF0;BBF0;1106 1174 11BB;BBF0;1106 1174 11BB;
+BBF1;BBF1;1106 1174 11BC;BBF1;1106 1174 11BC;
+BBF2;BBF2;1106 1174 11BD;BBF2;1106 1174 11BD;
+BBF3;BBF3;1106 1174 11BE;BBF3;1106 1174 11BE;
+BBF4;BBF4;1106 1174 11BF;BBF4;1106 1174 11BF;
+BBF5;BBF5;1106 1174 11C0;BBF5;1106 1174 11C0;
+BBF6;BBF6;1106 1174 11C1;BBF6;1106 1174 11C1;
+BBF7;BBF7;1106 1174 11C2;BBF7;1106 1174 11C2;
+BBF8;BBF8;1106 1175;BBF8;1106 1175;
+BBF9;BBF9;1106 1175 11A8;BBF9;1106 1175 11A8;
+BBFA;BBFA;1106 1175 11A9;BBFA;1106 1175 11A9;
+BBFB;BBFB;1106 1175 11AA;BBFB;1106 1175 11AA;
+BBFC;BBFC;1106 1175 11AB;BBFC;1106 1175 11AB;
+BBFD;BBFD;1106 1175 11AC;BBFD;1106 1175 11AC;
+BBFE;BBFE;1106 1175 11AD;BBFE;1106 1175 11AD;
+BBFF;BBFF;1106 1175 11AE;BBFF;1106 1175 11AE;
+BC00;BC00;1106 1175 11AF;BC00;1106 1175 11AF;
+BC01;BC01;1106 1175 11B0;BC01;1106 1175 11B0;
+BC02;BC02;1106 1175 11B1;BC02;1106 1175 11B1;
+BC03;BC03;1106 1175 11B2;BC03;1106 1175 11B2;
+BC04;BC04;1106 1175 11B3;BC04;1106 1175 11B3;
+BC05;BC05;1106 1175 11B4;BC05;1106 1175 11B4;
+BC06;BC06;1106 1175 11B5;BC06;1106 1175 11B5;
+BC07;BC07;1106 1175 11B6;BC07;1106 1175 11B6;
+BC08;BC08;1106 1175 11B7;BC08;1106 1175 11B7;
+BC09;BC09;1106 1175 11B8;BC09;1106 1175 11B8;
+BC0A;BC0A;1106 1175 11B9;BC0A;1106 1175 11B9;
+BC0B;BC0B;1106 1175 11BA;BC0B;1106 1175 11BA;
+BC0C;BC0C;1106 1175 11BB;BC0C;1106 1175 11BB;
+BC0D;BC0D;1106 1175 11BC;BC0D;1106 1175 11BC;
+BC0E;BC0E;1106 1175 11BD;BC0E;1106 1175 11BD;
+BC0F;BC0F;1106 1175 11BE;BC0F;1106 1175 11BE;
+BC10;BC10;1106 1175 11BF;BC10;1106 1175 11BF;
+BC11;BC11;1106 1175 11C0;BC11;1106 1175 11C0;
+BC12;BC12;1106 1175 11C1;BC12;1106 1175 11C1;
+BC13;BC13;1106 1175 11C2;BC13;1106 1175 11C2;
+BC14;BC14;1107 1161;BC14;1107 1161;
+BC15;BC15;1107 1161 11A8;BC15;1107 1161 11A8;
+BC16;BC16;1107 1161 11A9;BC16;1107 1161 11A9;
+BC17;BC17;1107 1161 11AA;BC17;1107 1161 11AA;
+BC18;BC18;1107 1161 11AB;BC18;1107 1161 11AB;
+BC19;BC19;1107 1161 11AC;BC19;1107 1161 11AC;
+BC1A;BC1A;1107 1161 11AD;BC1A;1107 1161 11AD;
+BC1B;BC1B;1107 1161 11AE;BC1B;1107 1161 11AE;
+BC1C;BC1C;1107 1161 11AF;BC1C;1107 1161 11AF;
+BC1D;BC1D;1107 1161 11B0;BC1D;1107 1161 11B0;
+BC1E;BC1E;1107 1161 11B1;BC1E;1107 1161 11B1;
+BC1F;BC1F;1107 1161 11B2;BC1F;1107 1161 11B2;
+BC20;BC20;1107 1161 11B3;BC20;1107 1161 11B3;
+BC21;BC21;1107 1161 11B4;BC21;1107 1161 11B4;
+BC22;BC22;1107 1161 11B5;BC22;1107 1161 11B5;
+BC23;BC23;1107 1161 11B6;BC23;1107 1161 11B6;
+BC24;BC24;1107 1161 11B7;BC24;1107 1161 11B7;
+BC25;BC25;1107 1161 11B8;BC25;1107 1161 11B8;
+BC26;BC26;1107 1161 11B9;BC26;1107 1161 11B9;
+BC27;BC27;1107 1161 11BA;BC27;1107 1161 11BA;
+BC28;BC28;1107 1161 11BB;BC28;1107 1161 11BB;
+BC29;BC29;1107 1161 11BC;BC29;1107 1161 11BC;
+BC2A;BC2A;1107 1161 11BD;BC2A;1107 1161 11BD;
+BC2B;BC2B;1107 1161 11BE;BC2B;1107 1161 11BE;
+BC2C;BC2C;1107 1161 11BF;BC2C;1107 1161 11BF;
+BC2D;BC2D;1107 1161 11C0;BC2D;1107 1161 11C0;
+BC2E;BC2E;1107 1161 11C1;BC2E;1107 1161 11C1;
+BC2F;BC2F;1107 1161 11C2;BC2F;1107 1161 11C2;
+BC30;BC30;1107 1162;BC30;1107 1162;
+BC31;BC31;1107 1162 11A8;BC31;1107 1162 11A8;
+BC32;BC32;1107 1162 11A9;BC32;1107 1162 11A9;
+BC33;BC33;1107 1162 11AA;BC33;1107 1162 11AA;
+BC34;BC34;1107 1162 11AB;BC34;1107 1162 11AB;
+BC35;BC35;1107 1162 11AC;BC35;1107 1162 11AC;
+BC36;BC36;1107 1162 11AD;BC36;1107 1162 11AD;
+BC37;BC37;1107 1162 11AE;BC37;1107 1162 11AE;
+BC38;BC38;1107 1162 11AF;BC38;1107 1162 11AF;
+BC39;BC39;1107 1162 11B0;BC39;1107 1162 11B0;
+BC3A;BC3A;1107 1162 11B1;BC3A;1107 1162 11B1;
+BC3B;BC3B;1107 1162 11B2;BC3B;1107 1162 11B2;
+BC3C;BC3C;1107 1162 11B3;BC3C;1107 1162 11B3;
+BC3D;BC3D;1107 1162 11B4;BC3D;1107 1162 11B4;
+BC3E;BC3E;1107 1162 11B5;BC3E;1107 1162 11B5;
+BC3F;BC3F;1107 1162 11B6;BC3F;1107 1162 11B6;
+BC40;BC40;1107 1162 11B7;BC40;1107 1162 11B7;
+BC41;BC41;1107 1162 11B8;BC41;1107 1162 11B8;
+BC42;BC42;1107 1162 11B9;BC42;1107 1162 11B9;
+BC43;BC43;1107 1162 11BA;BC43;1107 1162 11BA;
+BC44;BC44;1107 1162 11BB;BC44;1107 1162 11BB;
+BC45;BC45;1107 1162 11BC;BC45;1107 1162 11BC;
+BC46;BC46;1107 1162 11BD;BC46;1107 1162 11BD;
+BC47;BC47;1107 1162 11BE;BC47;1107 1162 11BE;
+BC48;BC48;1107 1162 11BF;BC48;1107 1162 11BF;
+BC49;BC49;1107 1162 11C0;BC49;1107 1162 11C0;
+BC4A;BC4A;1107 1162 11C1;BC4A;1107 1162 11C1;
+BC4B;BC4B;1107 1162 11C2;BC4B;1107 1162 11C2;
+BC4C;BC4C;1107 1163;BC4C;1107 1163;
+BC4D;BC4D;1107 1163 11A8;BC4D;1107 1163 11A8;
+BC4E;BC4E;1107 1163 11A9;BC4E;1107 1163 11A9;
+BC4F;BC4F;1107 1163 11AA;BC4F;1107 1163 11AA;
+BC50;BC50;1107 1163 11AB;BC50;1107 1163 11AB;
+BC51;BC51;1107 1163 11AC;BC51;1107 1163 11AC;
+BC52;BC52;1107 1163 11AD;BC52;1107 1163 11AD;
+BC53;BC53;1107 1163 11AE;BC53;1107 1163 11AE;
+BC54;BC54;1107 1163 11AF;BC54;1107 1163 11AF;
+BC55;BC55;1107 1163 11B0;BC55;1107 1163 11B0;
+BC56;BC56;1107 1163 11B1;BC56;1107 1163 11B1;
+BC57;BC57;1107 1163 11B2;BC57;1107 1163 11B2;
+BC58;BC58;1107 1163 11B3;BC58;1107 1163 11B3;
+BC59;BC59;1107 1163 11B4;BC59;1107 1163 11B4;
+BC5A;BC5A;1107 1163 11B5;BC5A;1107 1163 11B5;
+BC5B;BC5B;1107 1163 11B6;BC5B;1107 1163 11B6;
+BC5C;BC5C;1107 1163 11B7;BC5C;1107 1163 11B7;
+BC5D;BC5D;1107 1163 11B8;BC5D;1107 1163 11B8;
+BC5E;BC5E;1107 1163 11B9;BC5E;1107 1163 11B9;
+BC5F;BC5F;1107 1163 11BA;BC5F;1107 1163 11BA;
+BC60;BC60;1107 1163 11BB;BC60;1107 1163 11BB;
+BC61;BC61;1107 1163 11BC;BC61;1107 1163 11BC;
+BC62;BC62;1107 1163 11BD;BC62;1107 1163 11BD;
+BC63;BC63;1107 1163 11BE;BC63;1107 1163 11BE;
+BC64;BC64;1107 1163 11BF;BC64;1107 1163 11BF;
+BC65;BC65;1107 1163 11C0;BC65;1107 1163 11C0;
+BC66;BC66;1107 1163 11C1;BC66;1107 1163 11C1;
+BC67;BC67;1107 1163 11C2;BC67;1107 1163 11C2;
+BC68;BC68;1107 1164;BC68;1107 1164;
+BC69;BC69;1107 1164 11A8;BC69;1107 1164 11A8;
+BC6A;BC6A;1107 1164 11A9;BC6A;1107 1164 11A9;
+BC6B;BC6B;1107 1164 11AA;BC6B;1107 1164 11AA;
+BC6C;BC6C;1107 1164 11AB;BC6C;1107 1164 11AB;
+BC6D;BC6D;1107 1164 11AC;BC6D;1107 1164 11AC;
+BC6E;BC6E;1107 1164 11AD;BC6E;1107 1164 11AD;
+BC6F;BC6F;1107 1164 11AE;BC6F;1107 1164 11AE;
+BC70;BC70;1107 1164 11AF;BC70;1107 1164 11AF;
+BC71;BC71;1107 1164 11B0;BC71;1107 1164 11B0;
+BC72;BC72;1107 1164 11B1;BC72;1107 1164 11B1;
+BC73;BC73;1107 1164 11B2;BC73;1107 1164 11B2;
+BC74;BC74;1107 1164 11B3;BC74;1107 1164 11B3;
+BC75;BC75;1107 1164 11B4;BC75;1107 1164 11B4;
+BC76;BC76;1107 1164 11B5;BC76;1107 1164 11B5;
+BC77;BC77;1107 1164 11B6;BC77;1107 1164 11B6;
+BC78;BC78;1107 1164 11B7;BC78;1107 1164 11B7;
+BC79;BC79;1107 1164 11B8;BC79;1107 1164 11B8;
+BC7A;BC7A;1107 1164 11B9;BC7A;1107 1164 11B9;
+BC7B;BC7B;1107 1164 11BA;BC7B;1107 1164 11BA;
+BC7C;BC7C;1107 1164 11BB;BC7C;1107 1164 11BB;
+BC7D;BC7D;1107 1164 11BC;BC7D;1107 1164 11BC;
+BC7E;BC7E;1107 1164 11BD;BC7E;1107 1164 11BD;
+BC7F;BC7F;1107 1164 11BE;BC7F;1107 1164 11BE;
+BC80;BC80;1107 1164 11BF;BC80;1107 1164 11BF;
+BC81;BC81;1107 1164 11C0;BC81;1107 1164 11C0;
+BC82;BC82;1107 1164 11C1;BC82;1107 1164 11C1;
+BC83;BC83;1107 1164 11C2;BC83;1107 1164 11C2;
+BC84;BC84;1107 1165;BC84;1107 1165;
+BC85;BC85;1107 1165 11A8;BC85;1107 1165 11A8;
+BC86;BC86;1107 1165 11A9;BC86;1107 1165 11A9;
+BC87;BC87;1107 1165 11AA;BC87;1107 1165 11AA;
+BC88;BC88;1107 1165 11AB;BC88;1107 1165 11AB;
+BC89;BC89;1107 1165 11AC;BC89;1107 1165 11AC;
+BC8A;BC8A;1107 1165 11AD;BC8A;1107 1165 11AD;
+BC8B;BC8B;1107 1165 11AE;BC8B;1107 1165 11AE;
+BC8C;BC8C;1107 1165 11AF;BC8C;1107 1165 11AF;
+BC8D;BC8D;1107 1165 11B0;BC8D;1107 1165 11B0;
+BC8E;BC8E;1107 1165 11B1;BC8E;1107 1165 11B1;
+BC8F;BC8F;1107 1165 11B2;BC8F;1107 1165 11B2;
+BC90;BC90;1107 1165 11B3;BC90;1107 1165 11B3;
+BC91;BC91;1107 1165 11B4;BC91;1107 1165 11B4;
+BC92;BC92;1107 1165 11B5;BC92;1107 1165 11B5;
+BC93;BC93;1107 1165 11B6;BC93;1107 1165 11B6;
+BC94;BC94;1107 1165 11B7;BC94;1107 1165 11B7;
+BC95;BC95;1107 1165 11B8;BC95;1107 1165 11B8;
+BC96;BC96;1107 1165 11B9;BC96;1107 1165 11B9;
+BC97;BC97;1107 1165 11BA;BC97;1107 1165 11BA;
+BC98;BC98;1107 1165 11BB;BC98;1107 1165 11BB;
+BC99;BC99;1107 1165 11BC;BC99;1107 1165 11BC;
+BC9A;BC9A;1107 1165 11BD;BC9A;1107 1165 11BD;
+BC9B;BC9B;1107 1165 11BE;BC9B;1107 1165 11BE;
+BC9C;BC9C;1107 1165 11BF;BC9C;1107 1165 11BF;
+BC9D;BC9D;1107 1165 11C0;BC9D;1107 1165 11C0;
+BC9E;BC9E;1107 1165 11C1;BC9E;1107 1165 11C1;
+BC9F;BC9F;1107 1165 11C2;BC9F;1107 1165 11C2;
+BCA0;BCA0;1107 1166;BCA0;1107 1166;
+BCA1;BCA1;1107 1166 11A8;BCA1;1107 1166 11A8;
+BCA2;BCA2;1107 1166 11A9;BCA2;1107 1166 11A9;
+BCA3;BCA3;1107 1166 11AA;BCA3;1107 1166 11AA;
+BCA4;BCA4;1107 1166 11AB;BCA4;1107 1166 11AB;
+BCA5;BCA5;1107 1166 11AC;BCA5;1107 1166 11AC;
+BCA6;BCA6;1107 1166 11AD;BCA6;1107 1166 11AD;
+BCA7;BCA7;1107 1166 11AE;BCA7;1107 1166 11AE;
+BCA8;BCA8;1107 1166 11AF;BCA8;1107 1166 11AF;
+BCA9;BCA9;1107 1166 11B0;BCA9;1107 1166 11B0;
+BCAA;BCAA;1107 1166 11B1;BCAA;1107 1166 11B1;
+BCAB;BCAB;1107 1166 11B2;BCAB;1107 1166 11B2;
+BCAC;BCAC;1107 1166 11B3;BCAC;1107 1166 11B3;
+BCAD;BCAD;1107 1166 11B4;BCAD;1107 1166 11B4;
+BCAE;BCAE;1107 1166 11B5;BCAE;1107 1166 11B5;
+BCAF;BCAF;1107 1166 11B6;BCAF;1107 1166 11B6;
+BCB0;BCB0;1107 1166 11B7;BCB0;1107 1166 11B7;
+BCB1;BCB1;1107 1166 11B8;BCB1;1107 1166 11B8;
+BCB2;BCB2;1107 1166 11B9;BCB2;1107 1166 11B9;
+BCB3;BCB3;1107 1166 11BA;BCB3;1107 1166 11BA;
+BCB4;BCB4;1107 1166 11BB;BCB4;1107 1166 11BB;
+BCB5;BCB5;1107 1166 11BC;BCB5;1107 1166 11BC;
+BCB6;BCB6;1107 1166 11BD;BCB6;1107 1166 11BD;
+BCB7;BCB7;1107 1166 11BE;BCB7;1107 1166 11BE;
+BCB8;BCB8;1107 1166 11BF;BCB8;1107 1166 11BF;
+BCB9;BCB9;1107 1166 11C0;BCB9;1107 1166 11C0;
+BCBA;BCBA;1107 1166 11C1;BCBA;1107 1166 11C1;
+BCBB;BCBB;1107 1166 11C2;BCBB;1107 1166 11C2;
+BCBC;BCBC;1107 1167;BCBC;1107 1167;
+BCBD;BCBD;1107 1167 11A8;BCBD;1107 1167 11A8;
+BCBE;BCBE;1107 1167 11A9;BCBE;1107 1167 11A9;
+BCBF;BCBF;1107 1167 11AA;BCBF;1107 1167 11AA;
+BCC0;BCC0;1107 1167 11AB;BCC0;1107 1167 11AB;
+BCC1;BCC1;1107 1167 11AC;BCC1;1107 1167 11AC;
+BCC2;BCC2;1107 1167 11AD;BCC2;1107 1167 11AD;
+BCC3;BCC3;1107 1167 11AE;BCC3;1107 1167 11AE;
+BCC4;BCC4;1107 1167 11AF;BCC4;1107 1167 11AF;
+BCC5;BCC5;1107 1167 11B0;BCC5;1107 1167 11B0;
+BCC6;BCC6;1107 1167 11B1;BCC6;1107 1167 11B1;
+BCC7;BCC7;1107 1167 11B2;BCC7;1107 1167 11B2;
+BCC8;BCC8;1107 1167 11B3;BCC8;1107 1167 11B3;
+BCC9;BCC9;1107 1167 11B4;BCC9;1107 1167 11B4;
+BCCA;BCCA;1107 1167 11B5;BCCA;1107 1167 11B5;
+BCCB;BCCB;1107 1167 11B6;BCCB;1107 1167 11B6;
+BCCC;BCCC;1107 1167 11B7;BCCC;1107 1167 11B7;
+BCCD;BCCD;1107 1167 11B8;BCCD;1107 1167 11B8;
+BCCE;BCCE;1107 1167 11B9;BCCE;1107 1167 11B9;
+BCCF;BCCF;1107 1167 11BA;BCCF;1107 1167 11BA;
+BCD0;BCD0;1107 1167 11BB;BCD0;1107 1167 11BB;
+BCD1;BCD1;1107 1167 11BC;BCD1;1107 1167 11BC;
+BCD2;BCD2;1107 1167 11BD;BCD2;1107 1167 11BD;
+BCD3;BCD3;1107 1167 11BE;BCD3;1107 1167 11BE;
+BCD4;BCD4;1107 1167 11BF;BCD4;1107 1167 11BF;
+BCD5;BCD5;1107 1167 11C0;BCD5;1107 1167 11C0;
+BCD6;BCD6;1107 1167 11C1;BCD6;1107 1167 11C1;
+BCD7;BCD7;1107 1167 11C2;BCD7;1107 1167 11C2;
+BCD8;BCD8;1107 1168;BCD8;1107 1168;
+BCD9;BCD9;1107 1168 11A8;BCD9;1107 1168 11A8;
+BCDA;BCDA;1107 1168 11A9;BCDA;1107 1168 11A9;
+BCDB;BCDB;1107 1168 11AA;BCDB;1107 1168 11AA;
+BCDC;BCDC;1107 1168 11AB;BCDC;1107 1168 11AB;
+BCDD;BCDD;1107 1168 11AC;BCDD;1107 1168 11AC;
+BCDE;BCDE;1107 1168 11AD;BCDE;1107 1168 11AD;
+BCDF;BCDF;1107 1168 11AE;BCDF;1107 1168 11AE;
+BCE0;BCE0;1107 1168 11AF;BCE0;1107 1168 11AF;
+BCE1;BCE1;1107 1168 11B0;BCE1;1107 1168 11B0;
+BCE2;BCE2;1107 1168 11B1;BCE2;1107 1168 11B1;
+BCE3;BCE3;1107 1168 11B2;BCE3;1107 1168 11B2;
+BCE4;BCE4;1107 1168 11B3;BCE4;1107 1168 11B3;
+BCE5;BCE5;1107 1168 11B4;BCE5;1107 1168 11B4;
+BCE6;BCE6;1107 1168 11B5;BCE6;1107 1168 11B5;
+BCE7;BCE7;1107 1168 11B6;BCE7;1107 1168 11B6;
+BCE8;BCE8;1107 1168 11B7;BCE8;1107 1168 11B7;
+BCE9;BCE9;1107 1168 11B8;BCE9;1107 1168 11B8;
+BCEA;BCEA;1107 1168 11B9;BCEA;1107 1168 11B9;
+BCEB;BCEB;1107 1168 11BA;BCEB;1107 1168 11BA;
+BCEC;BCEC;1107 1168 11BB;BCEC;1107 1168 11BB;
+BCED;BCED;1107 1168 11BC;BCED;1107 1168 11BC;
+BCEE;BCEE;1107 1168 11BD;BCEE;1107 1168 11BD;
+BCEF;BCEF;1107 1168 11BE;BCEF;1107 1168 11BE;
+BCF0;BCF0;1107 1168 11BF;BCF0;1107 1168 11BF;
+BCF1;BCF1;1107 1168 11C0;BCF1;1107 1168 11C0;
+BCF2;BCF2;1107 1168 11C1;BCF2;1107 1168 11C1;
+BCF3;BCF3;1107 1168 11C2;BCF3;1107 1168 11C2;
+BCF4;BCF4;1107 1169;BCF4;1107 1169;
+BCF5;BCF5;1107 1169 11A8;BCF5;1107 1169 11A8;
+BCF6;BCF6;1107 1169 11A9;BCF6;1107 1169 11A9;
+BCF7;BCF7;1107 1169 11AA;BCF7;1107 1169 11AA;
+BCF8;BCF8;1107 1169 11AB;BCF8;1107 1169 11AB;
+BCF9;BCF9;1107 1169 11AC;BCF9;1107 1169 11AC;
+BCFA;BCFA;1107 1169 11AD;BCFA;1107 1169 11AD;
+BCFB;BCFB;1107 1169 11AE;BCFB;1107 1169 11AE;
+BCFC;BCFC;1107 1169 11AF;BCFC;1107 1169 11AF;
+BCFD;BCFD;1107 1169 11B0;BCFD;1107 1169 11B0;
+BCFE;BCFE;1107 1169 11B1;BCFE;1107 1169 11B1;
+BCFF;BCFF;1107 1169 11B2;BCFF;1107 1169 11B2;
+BD00;BD00;1107 1169 11B3;BD00;1107 1169 11B3;
+BD01;BD01;1107 1169 11B4;BD01;1107 1169 11B4;
+BD02;BD02;1107 1169 11B5;BD02;1107 1169 11B5;
+BD03;BD03;1107 1169 11B6;BD03;1107 1169 11B6;
+BD04;BD04;1107 1169 11B7;BD04;1107 1169 11B7;
+BD05;BD05;1107 1169 11B8;BD05;1107 1169 11B8;
+BD06;BD06;1107 1169 11B9;BD06;1107 1169 11B9;
+BD07;BD07;1107 1169 11BA;BD07;1107 1169 11BA;
+BD08;BD08;1107 1169 11BB;BD08;1107 1169 11BB;
+BD09;BD09;1107 1169 11BC;BD09;1107 1169 11BC;
+BD0A;BD0A;1107 1169 11BD;BD0A;1107 1169 11BD;
+BD0B;BD0B;1107 1169 11BE;BD0B;1107 1169 11BE;
+BD0C;BD0C;1107 1169 11BF;BD0C;1107 1169 11BF;
+BD0D;BD0D;1107 1169 11C0;BD0D;1107 1169 11C0;
+BD0E;BD0E;1107 1169 11C1;BD0E;1107 1169 11C1;
+BD0F;BD0F;1107 1169 11C2;BD0F;1107 1169 11C2;
+BD10;BD10;1107 116A;BD10;1107 116A;
+BD11;BD11;1107 116A 11A8;BD11;1107 116A 11A8;
+BD12;BD12;1107 116A 11A9;BD12;1107 116A 11A9;
+BD13;BD13;1107 116A 11AA;BD13;1107 116A 11AA;
+BD14;BD14;1107 116A 11AB;BD14;1107 116A 11AB;
+BD15;BD15;1107 116A 11AC;BD15;1107 116A 11AC;
+BD16;BD16;1107 116A 11AD;BD16;1107 116A 11AD;
+BD17;BD17;1107 116A 11AE;BD17;1107 116A 11AE;
+BD18;BD18;1107 116A 11AF;BD18;1107 116A 11AF;
+BD19;BD19;1107 116A 11B0;BD19;1107 116A 11B0;
+BD1A;BD1A;1107 116A 11B1;BD1A;1107 116A 11B1;
+BD1B;BD1B;1107 116A 11B2;BD1B;1107 116A 11B2;
+BD1C;BD1C;1107 116A 11B3;BD1C;1107 116A 11B3;
+BD1D;BD1D;1107 116A 11B4;BD1D;1107 116A 11B4;
+BD1E;BD1E;1107 116A 11B5;BD1E;1107 116A 11B5;
+BD1F;BD1F;1107 116A 11B6;BD1F;1107 116A 11B6;
+BD20;BD20;1107 116A 11B7;BD20;1107 116A 11B7;
+BD21;BD21;1107 116A 11B8;BD21;1107 116A 11B8;
+BD22;BD22;1107 116A 11B9;BD22;1107 116A 11B9;
+BD23;BD23;1107 116A 11BA;BD23;1107 116A 11BA;
+BD24;BD24;1107 116A 11BB;BD24;1107 116A 11BB;
+BD25;BD25;1107 116A 11BC;BD25;1107 116A 11BC;
+BD26;BD26;1107 116A 11BD;BD26;1107 116A 11BD;
+BD27;BD27;1107 116A 11BE;BD27;1107 116A 11BE;
+BD28;BD28;1107 116A 11BF;BD28;1107 116A 11BF;
+BD29;BD29;1107 116A 11C0;BD29;1107 116A 11C0;
+BD2A;BD2A;1107 116A 11C1;BD2A;1107 116A 11C1;
+BD2B;BD2B;1107 116A 11C2;BD2B;1107 116A 11C2;
+BD2C;BD2C;1107 116B;BD2C;1107 116B;
+BD2D;BD2D;1107 116B 11A8;BD2D;1107 116B 11A8;
+BD2E;BD2E;1107 116B 11A9;BD2E;1107 116B 11A9;
+BD2F;BD2F;1107 116B 11AA;BD2F;1107 116B 11AA;
+BD30;BD30;1107 116B 11AB;BD30;1107 116B 11AB;
+BD31;BD31;1107 116B 11AC;BD31;1107 116B 11AC;
+BD32;BD32;1107 116B 11AD;BD32;1107 116B 11AD;
+BD33;BD33;1107 116B 11AE;BD33;1107 116B 11AE;
+BD34;BD34;1107 116B 11AF;BD34;1107 116B 11AF;
+BD35;BD35;1107 116B 11B0;BD35;1107 116B 11B0;
+BD36;BD36;1107 116B 11B1;BD36;1107 116B 11B1;
+BD37;BD37;1107 116B 11B2;BD37;1107 116B 11B2;
+BD38;BD38;1107 116B 11B3;BD38;1107 116B 11B3;
+BD39;BD39;1107 116B 11B4;BD39;1107 116B 11B4;
+BD3A;BD3A;1107 116B 11B5;BD3A;1107 116B 11B5;
+BD3B;BD3B;1107 116B 11B6;BD3B;1107 116B 11B6;
+BD3C;BD3C;1107 116B 11B7;BD3C;1107 116B 11B7;
+BD3D;BD3D;1107 116B 11B8;BD3D;1107 116B 11B8;
+BD3E;BD3E;1107 116B 11B9;BD3E;1107 116B 11B9;
+BD3F;BD3F;1107 116B 11BA;BD3F;1107 116B 11BA;
+BD40;BD40;1107 116B 11BB;BD40;1107 116B 11BB;
+BD41;BD41;1107 116B 11BC;BD41;1107 116B 11BC;
+BD42;BD42;1107 116B 11BD;BD42;1107 116B 11BD;
+BD43;BD43;1107 116B 11BE;BD43;1107 116B 11BE;
+BD44;BD44;1107 116B 11BF;BD44;1107 116B 11BF;
+BD45;BD45;1107 116B 11C0;BD45;1107 116B 11C0;
+BD46;BD46;1107 116B 11C1;BD46;1107 116B 11C1;
+BD47;BD47;1107 116B 11C2;BD47;1107 116B 11C2;
+BD48;BD48;1107 116C;BD48;1107 116C;
+BD49;BD49;1107 116C 11A8;BD49;1107 116C 11A8;
+BD4A;BD4A;1107 116C 11A9;BD4A;1107 116C 11A9;
+BD4B;BD4B;1107 116C 11AA;BD4B;1107 116C 11AA;
+BD4C;BD4C;1107 116C 11AB;BD4C;1107 116C 11AB;
+BD4D;BD4D;1107 116C 11AC;BD4D;1107 116C 11AC;
+BD4E;BD4E;1107 116C 11AD;BD4E;1107 116C 11AD;
+BD4F;BD4F;1107 116C 11AE;BD4F;1107 116C 11AE;
+BD50;BD50;1107 116C 11AF;BD50;1107 116C 11AF;
+BD51;BD51;1107 116C 11B0;BD51;1107 116C 11B0;
+BD52;BD52;1107 116C 11B1;BD52;1107 116C 11B1;
+BD53;BD53;1107 116C 11B2;BD53;1107 116C 11B2;
+BD54;BD54;1107 116C 11B3;BD54;1107 116C 11B3;
+BD55;BD55;1107 116C 11B4;BD55;1107 116C 11B4;
+BD56;BD56;1107 116C 11B5;BD56;1107 116C 11B5;
+BD57;BD57;1107 116C 11B6;BD57;1107 116C 11B6;
+BD58;BD58;1107 116C 11B7;BD58;1107 116C 11B7;
+BD59;BD59;1107 116C 11B8;BD59;1107 116C 11B8;
+BD5A;BD5A;1107 116C 11B9;BD5A;1107 116C 11B9;
+BD5B;BD5B;1107 116C 11BA;BD5B;1107 116C 11BA;
+BD5C;BD5C;1107 116C 11BB;BD5C;1107 116C 11BB;
+BD5D;BD5D;1107 116C 11BC;BD5D;1107 116C 11BC;
+BD5E;BD5E;1107 116C 11BD;BD5E;1107 116C 11BD;
+BD5F;BD5F;1107 116C 11BE;BD5F;1107 116C 11BE;
+BD60;BD60;1107 116C 11BF;BD60;1107 116C 11BF;
+BD61;BD61;1107 116C 11C0;BD61;1107 116C 11C0;
+BD62;BD62;1107 116C 11C1;BD62;1107 116C 11C1;
+BD63;BD63;1107 116C 11C2;BD63;1107 116C 11C2;
+BD64;BD64;1107 116D;BD64;1107 116D;
+BD65;BD65;1107 116D 11A8;BD65;1107 116D 11A8;
+BD66;BD66;1107 116D 11A9;BD66;1107 116D 11A9;
+BD67;BD67;1107 116D 11AA;BD67;1107 116D 11AA;
+BD68;BD68;1107 116D 11AB;BD68;1107 116D 11AB;
+BD69;BD69;1107 116D 11AC;BD69;1107 116D 11AC;
+BD6A;BD6A;1107 116D 11AD;BD6A;1107 116D 11AD;
+BD6B;BD6B;1107 116D 11AE;BD6B;1107 116D 11AE;
+BD6C;BD6C;1107 116D 11AF;BD6C;1107 116D 11AF;
+BD6D;BD6D;1107 116D 11B0;BD6D;1107 116D 11B0;
+BD6E;BD6E;1107 116D 11B1;BD6E;1107 116D 11B1;
+BD6F;BD6F;1107 116D 11B2;BD6F;1107 116D 11B2;
+BD70;BD70;1107 116D 11B3;BD70;1107 116D 11B3;
+BD71;BD71;1107 116D 11B4;BD71;1107 116D 11B4;
+BD72;BD72;1107 116D 11B5;BD72;1107 116D 11B5;
+BD73;BD73;1107 116D 11B6;BD73;1107 116D 11B6;
+BD74;BD74;1107 116D 11B7;BD74;1107 116D 11B7;
+BD75;BD75;1107 116D 11B8;BD75;1107 116D 11B8;
+BD76;BD76;1107 116D 11B9;BD76;1107 116D 11B9;
+BD77;BD77;1107 116D 11BA;BD77;1107 116D 11BA;
+BD78;BD78;1107 116D 11BB;BD78;1107 116D 11BB;
+BD79;BD79;1107 116D 11BC;BD79;1107 116D 11BC;
+BD7A;BD7A;1107 116D 11BD;BD7A;1107 116D 11BD;
+BD7B;BD7B;1107 116D 11BE;BD7B;1107 116D 11BE;
+BD7C;BD7C;1107 116D 11BF;BD7C;1107 116D 11BF;
+BD7D;BD7D;1107 116D 11C0;BD7D;1107 116D 11C0;
+BD7E;BD7E;1107 116D 11C1;BD7E;1107 116D 11C1;
+BD7F;BD7F;1107 116D 11C2;BD7F;1107 116D 11C2;
+BD80;BD80;1107 116E;BD80;1107 116E;
+BD81;BD81;1107 116E 11A8;BD81;1107 116E 11A8;
+BD82;BD82;1107 116E 11A9;BD82;1107 116E 11A9;
+BD83;BD83;1107 116E 11AA;BD83;1107 116E 11AA;
+BD84;BD84;1107 116E 11AB;BD84;1107 116E 11AB;
+BD85;BD85;1107 116E 11AC;BD85;1107 116E 11AC;
+BD86;BD86;1107 116E 11AD;BD86;1107 116E 11AD;
+BD87;BD87;1107 116E 11AE;BD87;1107 116E 11AE;
+BD88;BD88;1107 116E 11AF;BD88;1107 116E 11AF;
+BD89;BD89;1107 116E 11B0;BD89;1107 116E 11B0;
+BD8A;BD8A;1107 116E 11B1;BD8A;1107 116E 11B1;
+BD8B;BD8B;1107 116E 11B2;BD8B;1107 116E 11B2;
+BD8C;BD8C;1107 116E 11B3;BD8C;1107 116E 11B3;
+BD8D;BD8D;1107 116E 11B4;BD8D;1107 116E 11B4;
+BD8E;BD8E;1107 116E 11B5;BD8E;1107 116E 11B5;
+BD8F;BD8F;1107 116E 11B6;BD8F;1107 116E 11B6;
+BD90;BD90;1107 116E 11B7;BD90;1107 116E 11B7;
+BD91;BD91;1107 116E 11B8;BD91;1107 116E 11B8;
+BD92;BD92;1107 116E 11B9;BD92;1107 116E 11B9;
+BD93;BD93;1107 116E 11BA;BD93;1107 116E 11BA;
+BD94;BD94;1107 116E 11BB;BD94;1107 116E 11BB;
+BD95;BD95;1107 116E 11BC;BD95;1107 116E 11BC;
+BD96;BD96;1107 116E 11BD;BD96;1107 116E 11BD;
+BD97;BD97;1107 116E 11BE;BD97;1107 116E 11BE;
+BD98;BD98;1107 116E 11BF;BD98;1107 116E 11BF;
+BD99;BD99;1107 116E 11C0;BD99;1107 116E 11C0;
+BD9A;BD9A;1107 116E 11C1;BD9A;1107 116E 11C1;
+BD9B;BD9B;1107 116E 11C2;BD9B;1107 116E 11C2;
+BD9C;BD9C;1107 116F;BD9C;1107 116F;
+BD9D;BD9D;1107 116F 11A8;BD9D;1107 116F 11A8;
+BD9E;BD9E;1107 116F 11A9;BD9E;1107 116F 11A9;
+BD9F;BD9F;1107 116F 11AA;BD9F;1107 116F 11AA;
+BDA0;BDA0;1107 116F 11AB;BDA0;1107 116F 11AB;
+BDA1;BDA1;1107 116F 11AC;BDA1;1107 116F 11AC;
+BDA2;BDA2;1107 116F 11AD;BDA2;1107 116F 11AD;
+BDA3;BDA3;1107 116F 11AE;BDA3;1107 116F 11AE;
+BDA4;BDA4;1107 116F 11AF;BDA4;1107 116F 11AF;
+BDA5;BDA5;1107 116F 11B0;BDA5;1107 116F 11B0;
+BDA6;BDA6;1107 116F 11B1;BDA6;1107 116F 11B1;
+BDA7;BDA7;1107 116F 11B2;BDA7;1107 116F 11B2;
+BDA8;BDA8;1107 116F 11B3;BDA8;1107 116F 11B3;
+BDA9;BDA9;1107 116F 11B4;BDA9;1107 116F 11B4;
+BDAA;BDAA;1107 116F 11B5;BDAA;1107 116F 11B5;
+BDAB;BDAB;1107 116F 11B6;BDAB;1107 116F 11B6;
+BDAC;BDAC;1107 116F 11B7;BDAC;1107 116F 11B7;
+BDAD;BDAD;1107 116F 11B8;BDAD;1107 116F 11B8;
+BDAE;BDAE;1107 116F 11B9;BDAE;1107 116F 11B9;
+BDAF;BDAF;1107 116F 11BA;BDAF;1107 116F 11BA;
+BDB0;BDB0;1107 116F 11BB;BDB0;1107 116F 11BB;
+BDB1;BDB1;1107 116F 11BC;BDB1;1107 116F 11BC;
+BDB2;BDB2;1107 116F 11BD;BDB2;1107 116F 11BD;
+BDB3;BDB3;1107 116F 11BE;BDB3;1107 116F 11BE;
+BDB4;BDB4;1107 116F 11BF;BDB4;1107 116F 11BF;
+BDB5;BDB5;1107 116F 11C0;BDB5;1107 116F 11C0;
+BDB6;BDB6;1107 116F 11C1;BDB6;1107 116F 11C1;
+BDB7;BDB7;1107 116F 11C2;BDB7;1107 116F 11C2;
+BDB8;BDB8;1107 1170;BDB8;1107 1170;
+BDB9;BDB9;1107 1170 11A8;BDB9;1107 1170 11A8;
+BDBA;BDBA;1107 1170 11A9;BDBA;1107 1170 11A9;
+BDBB;BDBB;1107 1170 11AA;BDBB;1107 1170 11AA;
+BDBC;BDBC;1107 1170 11AB;BDBC;1107 1170 11AB;
+BDBD;BDBD;1107 1170 11AC;BDBD;1107 1170 11AC;
+BDBE;BDBE;1107 1170 11AD;BDBE;1107 1170 11AD;
+BDBF;BDBF;1107 1170 11AE;BDBF;1107 1170 11AE;
+BDC0;BDC0;1107 1170 11AF;BDC0;1107 1170 11AF;
+BDC1;BDC1;1107 1170 11B0;BDC1;1107 1170 11B0;
+BDC2;BDC2;1107 1170 11B1;BDC2;1107 1170 11B1;
+BDC3;BDC3;1107 1170 11B2;BDC3;1107 1170 11B2;
+BDC4;BDC4;1107 1170 11B3;BDC4;1107 1170 11B3;
+BDC5;BDC5;1107 1170 11B4;BDC5;1107 1170 11B4;
+BDC6;BDC6;1107 1170 11B5;BDC6;1107 1170 11B5;
+BDC7;BDC7;1107 1170 11B6;BDC7;1107 1170 11B6;
+BDC8;BDC8;1107 1170 11B7;BDC8;1107 1170 11B7;
+BDC9;BDC9;1107 1170 11B8;BDC9;1107 1170 11B8;
+BDCA;BDCA;1107 1170 11B9;BDCA;1107 1170 11B9;
+BDCB;BDCB;1107 1170 11BA;BDCB;1107 1170 11BA;
+BDCC;BDCC;1107 1170 11BB;BDCC;1107 1170 11BB;
+BDCD;BDCD;1107 1170 11BC;BDCD;1107 1170 11BC;
+BDCE;BDCE;1107 1170 11BD;BDCE;1107 1170 11BD;
+BDCF;BDCF;1107 1170 11BE;BDCF;1107 1170 11BE;
+BDD0;BDD0;1107 1170 11BF;BDD0;1107 1170 11BF;
+BDD1;BDD1;1107 1170 11C0;BDD1;1107 1170 11C0;
+BDD2;BDD2;1107 1170 11C1;BDD2;1107 1170 11C1;
+BDD3;BDD3;1107 1170 11C2;BDD3;1107 1170 11C2;
+BDD4;BDD4;1107 1171;BDD4;1107 1171;
+BDD5;BDD5;1107 1171 11A8;BDD5;1107 1171 11A8;
+BDD6;BDD6;1107 1171 11A9;BDD6;1107 1171 11A9;
+BDD7;BDD7;1107 1171 11AA;BDD7;1107 1171 11AA;
+BDD8;BDD8;1107 1171 11AB;BDD8;1107 1171 11AB;
+BDD9;BDD9;1107 1171 11AC;BDD9;1107 1171 11AC;
+BDDA;BDDA;1107 1171 11AD;BDDA;1107 1171 11AD;
+BDDB;BDDB;1107 1171 11AE;BDDB;1107 1171 11AE;
+BDDC;BDDC;1107 1171 11AF;BDDC;1107 1171 11AF;
+BDDD;BDDD;1107 1171 11B0;BDDD;1107 1171 11B0;
+BDDE;BDDE;1107 1171 11B1;BDDE;1107 1171 11B1;
+BDDF;BDDF;1107 1171 11B2;BDDF;1107 1171 11B2;
+BDE0;BDE0;1107 1171 11B3;BDE0;1107 1171 11B3;
+BDE1;BDE1;1107 1171 11B4;BDE1;1107 1171 11B4;
+BDE2;BDE2;1107 1171 11B5;BDE2;1107 1171 11B5;
+BDE3;BDE3;1107 1171 11B6;BDE3;1107 1171 11B6;
+BDE4;BDE4;1107 1171 11B7;BDE4;1107 1171 11B7;
+BDE5;BDE5;1107 1171 11B8;BDE5;1107 1171 11B8;
+BDE6;BDE6;1107 1171 11B9;BDE6;1107 1171 11B9;
+BDE7;BDE7;1107 1171 11BA;BDE7;1107 1171 11BA;
+BDE8;BDE8;1107 1171 11BB;BDE8;1107 1171 11BB;
+BDE9;BDE9;1107 1171 11BC;BDE9;1107 1171 11BC;
+BDEA;BDEA;1107 1171 11BD;BDEA;1107 1171 11BD;
+BDEB;BDEB;1107 1171 11BE;BDEB;1107 1171 11BE;
+BDEC;BDEC;1107 1171 11BF;BDEC;1107 1171 11BF;
+BDED;BDED;1107 1171 11C0;BDED;1107 1171 11C0;
+BDEE;BDEE;1107 1171 11C1;BDEE;1107 1171 11C1;
+BDEF;BDEF;1107 1171 11C2;BDEF;1107 1171 11C2;
+BDF0;BDF0;1107 1172;BDF0;1107 1172;
+BDF1;BDF1;1107 1172 11A8;BDF1;1107 1172 11A8;
+BDF2;BDF2;1107 1172 11A9;BDF2;1107 1172 11A9;
+BDF3;BDF3;1107 1172 11AA;BDF3;1107 1172 11AA;
+BDF4;BDF4;1107 1172 11AB;BDF4;1107 1172 11AB;
+BDF5;BDF5;1107 1172 11AC;BDF5;1107 1172 11AC;
+BDF6;BDF6;1107 1172 11AD;BDF6;1107 1172 11AD;
+BDF7;BDF7;1107 1172 11AE;BDF7;1107 1172 11AE;
+BDF8;BDF8;1107 1172 11AF;BDF8;1107 1172 11AF;
+BDF9;BDF9;1107 1172 11B0;BDF9;1107 1172 11B0;
+BDFA;BDFA;1107 1172 11B1;BDFA;1107 1172 11B1;
+BDFB;BDFB;1107 1172 11B2;BDFB;1107 1172 11B2;
+BDFC;BDFC;1107 1172 11B3;BDFC;1107 1172 11B3;
+BDFD;BDFD;1107 1172 11B4;BDFD;1107 1172 11B4;
+BDFE;BDFE;1107 1172 11B5;BDFE;1107 1172 11B5;
+BDFF;BDFF;1107 1172 11B6;BDFF;1107 1172 11B6;
+BE00;BE00;1107 1172 11B7;BE00;1107 1172 11B7;
+BE01;BE01;1107 1172 11B8;BE01;1107 1172 11B8;
+BE02;BE02;1107 1172 11B9;BE02;1107 1172 11B9;
+BE03;BE03;1107 1172 11BA;BE03;1107 1172 11BA;
+BE04;BE04;1107 1172 11BB;BE04;1107 1172 11BB;
+BE05;BE05;1107 1172 11BC;BE05;1107 1172 11BC;
+BE06;BE06;1107 1172 11BD;BE06;1107 1172 11BD;
+BE07;BE07;1107 1172 11BE;BE07;1107 1172 11BE;
+BE08;BE08;1107 1172 11BF;BE08;1107 1172 11BF;
+BE09;BE09;1107 1172 11C0;BE09;1107 1172 11C0;
+BE0A;BE0A;1107 1172 11C1;BE0A;1107 1172 11C1;
+BE0B;BE0B;1107 1172 11C2;BE0B;1107 1172 11C2;
+BE0C;BE0C;1107 1173;BE0C;1107 1173;
+BE0D;BE0D;1107 1173 11A8;BE0D;1107 1173 11A8;
+BE0E;BE0E;1107 1173 11A9;BE0E;1107 1173 11A9;
+BE0F;BE0F;1107 1173 11AA;BE0F;1107 1173 11AA;
+BE10;BE10;1107 1173 11AB;BE10;1107 1173 11AB;
+BE11;BE11;1107 1173 11AC;BE11;1107 1173 11AC;
+BE12;BE12;1107 1173 11AD;BE12;1107 1173 11AD;
+BE13;BE13;1107 1173 11AE;BE13;1107 1173 11AE;
+BE14;BE14;1107 1173 11AF;BE14;1107 1173 11AF;
+BE15;BE15;1107 1173 11B0;BE15;1107 1173 11B0;
+BE16;BE16;1107 1173 11B1;BE16;1107 1173 11B1;
+BE17;BE17;1107 1173 11B2;BE17;1107 1173 11B2;
+BE18;BE18;1107 1173 11B3;BE18;1107 1173 11B3;
+BE19;BE19;1107 1173 11B4;BE19;1107 1173 11B4;
+BE1A;BE1A;1107 1173 11B5;BE1A;1107 1173 11B5;
+BE1B;BE1B;1107 1173 11B6;BE1B;1107 1173 11B6;
+BE1C;BE1C;1107 1173 11B7;BE1C;1107 1173 11B7;
+BE1D;BE1D;1107 1173 11B8;BE1D;1107 1173 11B8;
+BE1E;BE1E;1107 1173 11B9;BE1E;1107 1173 11B9;
+BE1F;BE1F;1107 1173 11BA;BE1F;1107 1173 11BA;
+BE20;BE20;1107 1173 11BB;BE20;1107 1173 11BB;
+BE21;BE21;1107 1173 11BC;BE21;1107 1173 11BC;
+BE22;BE22;1107 1173 11BD;BE22;1107 1173 11BD;
+BE23;BE23;1107 1173 11BE;BE23;1107 1173 11BE;
+BE24;BE24;1107 1173 11BF;BE24;1107 1173 11BF;
+BE25;BE25;1107 1173 11C0;BE25;1107 1173 11C0;
+BE26;BE26;1107 1173 11C1;BE26;1107 1173 11C1;
+BE27;BE27;1107 1173 11C2;BE27;1107 1173 11C2;
+BE28;BE28;1107 1174;BE28;1107 1174;
+BE29;BE29;1107 1174 11A8;BE29;1107 1174 11A8;
+BE2A;BE2A;1107 1174 11A9;BE2A;1107 1174 11A9;
+BE2B;BE2B;1107 1174 11AA;BE2B;1107 1174 11AA;
+BE2C;BE2C;1107 1174 11AB;BE2C;1107 1174 11AB;
+BE2D;BE2D;1107 1174 11AC;BE2D;1107 1174 11AC;
+BE2E;BE2E;1107 1174 11AD;BE2E;1107 1174 11AD;
+BE2F;BE2F;1107 1174 11AE;BE2F;1107 1174 11AE;
+BE30;BE30;1107 1174 11AF;BE30;1107 1174 11AF;
+BE31;BE31;1107 1174 11B0;BE31;1107 1174 11B0;
+BE32;BE32;1107 1174 11B1;BE32;1107 1174 11B1;
+BE33;BE33;1107 1174 11B2;BE33;1107 1174 11B2;
+BE34;BE34;1107 1174 11B3;BE34;1107 1174 11B3;
+BE35;BE35;1107 1174 11B4;BE35;1107 1174 11B4;
+BE36;BE36;1107 1174 11B5;BE36;1107 1174 11B5;
+BE37;BE37;1107 1174 11B6;BE37;1107 1174 11B6;
+BE38;BE38;1107 1174 11B7;BE38;1107 1174 11B7;
+BE39;BE39;1107 1174 11B8;BE39;1107 1174 11B8;
+BE3A;BE3A;1107 1174 11B9;BE3A;1107 1174 11B9;
+BE3B;BE3B;1107 1174 11BA;BE3B;1107 1174 11BA;
+BE3C;BE3C;1107 1174 11BB;BE3C;1107 1174 11BB;
+BE3D;BE3D;1107 1174 11BC;BE3D;1107 1174 11BC;
+BE3E;BE3E;1107 1174 11BD;BE3E;1107 1174 11BD;
+BE3F;BE3F;1107 1174 11BE;BE3F;1107 1174 11BE;
+BE40;BE40;1107 1174 11BF;BE40;1107 1174 11BF;
+BE41;BE41;1107 1174 11C0;BE41;1107 1174 11C0;
+BE42;BE42;1107 1174 11C1;BE42;1107 1174 11C1;
+BE43;BE43;1107 1174 11C2;BE43;1107 1174 11C2;
+BE44;BE44;1107 1175;BE44;1107 1175;
+BE45;BE45;1107 1175 11A8;BE45;1107 1175 11A8;
+BE46;BE46;1107 1175 11A9;BE46;1107 1175 11A9;
+BE47;BE47;1107 1175 11AA;BE47;1107 1175 11AA;
+BE48;BE48;1107 1175 11AB;BE48;1107 1175 11AB;
+BE49;BE49;1107 1175 11AC;BE49;1107 1175 11AC;
+BE4A;BE4A;1107 1175 11AD;BE4A;1107 1175 11AD;
+BE4B;BE4B;1107 1175 11AE;BE4B;1107 1175 11AE;
+BE4C;BE4C;1107 1175 11AF;BE4C;1107 1175 11AF;
+BE4D;BE4D;1107 1175 11B0;BE4D;1107 1175 11B0;
+BE4E;BE4E;1107 1175 11B1;BE4E;1107 1175 11B1;
+BE4F;BE4F;1107 1175 11B2;BE4F;1107 1175 11B2;
+BE50;BE50;1107 1175 11B3;BE50;1107 1175 11B3;
+BE51;BE51;1107 1175 11B4;BE51;1107 1175 11B4;
+BE52;BE52;1107 1175 11B5;BE52;1107 1175 11B5;
+BE53;BE53;1107 1175 11B6;BE53;1107 1175 11B6;
+BE54;BE54;1107 1175 11B7;BE54;1107 1175 11B7;
+BE55;BE55;1107 1175 11B8;BE55;1107 1175 11B8;
+BE56;BE56;1107 1175 11B9;BE56;1107 1175 11B9;
+BE57;BE57;1107 1175 11BA;BE57;1107 1175 11BA;
+BE58;BE58;1107 1175 11BB;BE58;1107 1175 11BB;
+BE59;BE59;1107 1175 11BC;BE59;1107 1175 11BC;
+BE5A;BE5A;1107 1175 11BD;BE5A;1107 1175 11BD;
+BE5B;BE5B;1107 1175 11BE;BE5B;1107 1175 11BE;
+BE5C;BE5C;1107 1175 11BF;BE5C;1107 1175 11BF;
+BE5D;BE5D;1107 1175 11C0;BE5D;1107 1175 11C0;
+BE5E;BE5E;1107 1175 11C1;BE5E;1107 1175 11C1;
+BE5F;BE5F;1107 1175 11C2;BE5F;1107 1175 11C2;
+BE60;BE60;1108 1161;BE60;1108 1161;
+BE61;BE61;1108 1161 11A8;BE61;1108 1161 11A8;
+BE62;BE62;1108 1161 11A9;BE62;1108 1161 11A9;
+BE63;BE63;1108 1161 11AA;BE63;1108 1161 11AA;
+BE64;BE64;1108 1161 11AB;BE64;1108 1161 11AB;
+BE65;BE65;1108 1161 11AC;BE65;1108 1161 11AC;
+BE66;BE66;1108 1161 11AD;BE66;1108 1161 11AD;
+BE67;BE67;1108 1161 11AE;BE67;1108 1161 11AE;
+BE68;BE68;1108 1161 11AF;BE68;1108 1161 11AF;
+BE69;BE69;1108 1161 11B0;BE69;1108 1161 11B0;
+BE6A;BE6A;1108 1161 11B1;BE6A;1108 1161 11B1;
+BE6B;BE6B;1108 1161 11B2;BE6B;1108 1161 11B2;
+BE6C;BE6C;1108 1161 11B3;BE6C;1108 1161 11B3;
+BE6D;BE6D;1108 1161 11B4;BE6D;1108 1161 11B4;
+BE6E;BE6E;1108 1161 11B5;BE6E;1108 1161 11B5;
+BE6F;BE6F;1108 1161 11B6;BE6F;1108 1161 11B6;
+BE70;BE70;1108 1161 11B7;BE70;1108 1161 11B7;
+BE71;BE71;1108 1161 11B8;BE71;1108 1161 11B8;
+BE72;BE72;1108 1161 11B9;BE72;1108 1161 11B9;
+BE73;BE73;1108 1161 11BA;BE73;1108 1161 11BA;
+BE74;BE74;1108 1161 11BB;BE74;1108 1161 11BB;
+BE75;BE75;1108 1161 11BC;BE75;1108 1161 11BC;
+BE76;BE76;1108 1161 11BD;BE76;1108 1161 11BD;
+BE77;BE77;1108 1161 11BE;BE77;1108 1161 11BE;
+BE78;BE78;1108 1161 11BF;BE78;1108 1161 11BF;
+BE79;BE79;1108 1161 11C0;BE79;1108 1161 11C0;
+BE7A;BE7A;1108 1161 11C1;BE7A;1108 1161 11C1;
+BE7B;BE7B;1108 1161 11C2;BE7B;1108 1161 11C2;
+BE7C;BE7C;1108 1162;BE7C;1108 1162;
+BE7D;BE7D;1108 1162 11A8;BE7D;1108 1162 11A8;
+BE7E;BE7E;1108 1162 11A9;BE7E;1108 1162 11A9;
+BE7F;BE7F;1108 1162 11AA;BE7F;1108 1162 11AA;
+BE80;BE80;1108 1162 11AB;BE80;1108 1162 11AB;
+BE81;BE81;1108 1162 11AC;BE81;1108 1162 11AC;
+BE82;BE82;1108 1162 11AD;BE82;1108 1162 11AD;
+BE83;BE83;1108 1162 11AE;BE83;1108 1162 11AE;
+BE84;BE84;1108 1162 11AF;BE84;1108 1162 11AF;
+BE85;BE85;1108 1162 11B0;BE85;1108 1162 11B0;
+BE86;BE86;1108 1162 11B1;BE86;1108 1162 11B1;
+BE87;BE87;1108 1162 11B2;BE87;1108 1162 11B2;
+BE88;BE88;1108 1162 11B3;BE88;1108 1162 11B3;
+BE89;BE89;1108 1162 11B4;BE89;1108 1162 11B4;
+BE8A;BE8A;1108 1162 11B5;BE8A;1108 1162 11B5;
+BE8B;BE8B;1108 1162 11B6;BE8B;1108 1162 11B6;
+BE8C;BE8C;1108 1162 11B7;BE8C;1108 1162 11B7;
+BE8D;BE8D;1108 1162 11B8;BE8D;1108 1162 11B8;
+BE8E;BE8E;1108 1162 11B9;BE8E;1108 1162 11B9;
+BE8F;BE8F;1108 1162 11BA;BE8F;1108 1162 11BA;
+BE90;BE90;1108 1162 11BB;BE90;1108 1162 11BB;
+BE91;BE91;1108 1162 11BC;BE91;1108 1162 11BC;
+BE92;BE92;1108 1162 11BD;BE92;1108 1162 11BD;
+BE93;BE93;1108 1162 11BE;BE93;1108 1162 11BE;
+BE94;BE94;1108 1162 11BF;BE94;1108 1162 11BF;
+BE95;BE95;1108 1162 11C0;BE95;1108 1162 11C0;
+BE96;BE96;1108 1162 11C1;BE96;1108 1162 11C1;
+BE97;BE97;1108 1162 11C2;BE97;1108 1162 11C2;
+BE98;BE98;1108 1163;BE98;1108 1163;
+BE99;BE99;1108 1163 11A8;BE99;1108 1163 11A8;
+BE9A;BE9A;1108 1163 11A9;BE9A;1108 1163 11A9;
+BE9B;BE9B;1108 1163 11AA;BE9B;1108 1163 11AA;
+BE9C;BE9C;1108 1163 11AB;BE9C;1108 1163 11AB;
+BE9D;BE9D;1108 1163 11AC;BE9D;1108 1163 11AC;
+BE9E;BE9E;1108 1163 11AD;BE9E;1108 1163 11AD;
+BE9F;BE9F;1108 1163 11AE;BE9F;1108 1163 11AE;
+BEA0;BEA0;1108 1163 11AF;BEA0;1108 1163 11AF;
+BEA1;BEA1;1108 1163 11B0;BEA1;1108 1163 11B0;
+BEA2;BEA2;1108 1163 11B1;BEA2;1108 1163 11B1;
+BEA3;BEA3;1108 1163 11B2;BEA3;1108 1163 11B2;
+BEA4;BEA4;1108 1163 11B3;BEA4;1108 1163 11B3;
+BEA5;BEA5;1108 1163 11B4;BEA5;1108 1163 11B4;
+BEA6;BEA6;1108 1163 11B5;BEA6;1108 1163 11B5;
+BEA7;BEA7;1108 1163 11B6;BEA7;1108 1163 11B6;
+BEA8;BEA8;1108 1163 11B7;BEA8;1108 1163 11B7;
+BEA9;BEA9;1108 1163 11B8;BEA9;1108 1163 11B8;
+BEAA;BEAA;1108 1163 11B9;BEAA;1108 1163 11B9;
+BEAB;BEAB;1108 1163 11BA;BEAB;1108 1163 11BA;
+BEAC;BEAC;1108 1163 11BB;BEAC;1108 1163 11BB;
+BEAD;BEAD;1108 1163 11BC;BEAD;1108 1163 11BC;
+BEAE;BEAE;1108 1163 11BD;BEAE;1108 1163 11BD;
+BEAF;BEAF;1108 1163 11BE;BEAF;1108 1163 11BE;
+BEB0;BEB0;1108 1163 11BF;BEB0;1108 1163 11BF;
+BEB1;BEB1;1108 1163 11C0;BEB1;1108 1163 11C0;
+BEB2;BEB2;1108 1163 11C1;BEB2;1108 1163 11C1;
+BEB3;BEB3;1108 1163 11C2;BEB3;1108 1163 11C2;
+BEB4;BEB4;1108 1164;BEB4;1108 1164;
+BEB5;BEB5;1108 1164 11A8;BEB5;1108 1164 11A8;
+BEB6;BEB6;1108 1164 11A9;BEB6;1108 1164 11A9;
+BEB7;BEB7;1108 1164 11AA;BEB7;1108 1164 11AA;
+BEB8;BEB8;1108 1164 11AB;BEB8;1108 1164 11AB;
+BEB9;BEB9;1108 1164 11AC;BEB9;1108 1164 11AC;
+BEBA;BEBA;1108 1164 11AD;BEBA;1108 1164 11AD;
+BEBB;BEBB;1108 1164 11AE;BEBB;1108 1164 11AE;
+BEBC;BEBC;1108 1164 11AF;BEBC;1108 1164 11AF;
+BEBD;BEBD;1108 1164 11B0;BEBD;1108 1164 11B0;
+BEBE;BEBE;1108 1164 11B1;BEBE;1108 1164 11B1;
+BEBF;BEBF;1108 1164 11B2;BEBF;1108 1164 11B2;
+BEC0;BEC0;1108 1164 11B3;BEC0;1108 1164 11B3;
+BEC1;BEC1;1108 1164 11B4;BEC1;1108 1164 11B4;
+BEC2;BEC2;1108 1164 11B5;BEC2;1108 1164 11B5;
+BEC3;BEC3;1108 1164 11B6;BEC3;1108 1164 11B6;
+BEC4;BEC4;1108 1164 11B7;BEC4;1108 1164 11B7;
+BEC5;BEC5;1108 1164 11B8;BEC5;1108 1164 11B8;
+BEC6;BEC6;1108 1164 11B9;BEC6;1108 1164 11B9;
+BEC7;BEC7;1108 1164 11BA;BEC7;1108 1164 11BA;
+BEC8;BEC8;1108 1164 11BB;BEC8;1108 1164 11BB;
+BEC9;BEC9;1108 1164 11BC;BEC9;1108 1164 11BC;
+BECA;BECA;1108 1164 11BD;BECA;1108 1164 11BD;
+BECB;BECB;1108 1164 11BE;BECB;1108 1164 11BE;
+BECC;BECC;1108 1164 11BF;BECC;1108 1164 11BF;
+BECD;BECD;1108 1164 11C0;BECD;1108 1164 11C0;
+BECE;BECE;1108 1164 11C1;BECE;1108 1164 11C1;
+BECF;BECF;1108 1164 11C2;BECF;1108 1164 11C2;
+BED0;BED0;1108 1165;BED0;1108 1165;
+BED1;BED1;1108 1165 11A8;BED1;1108 1165 11A8;
+BED2;BED2;1108 1165 11A9;BED2;1108 1165 11A9;
+BED3;BED3;1108 1165 11AA;BED3;1108 1165 11AA;
+BED4;BED4;1108 1165 11AB;BED4;1108 1165 11AB;
+BED5;BED5;1108 1165 11AC;BED5;1108 1165 11AC;
+BED6;BED6;1108 1165 11AD;BED6;1108 1165 11AD;
+BED7;BED7;1108 1165 11AE;BED7;1108 1165 11AE;
+BED8;BED8;1108 1165 11AF;BED8;1108 1165 11AF;
+BED9;BED9;1108 1165 11B0;BED9;1108 1165 11B0;
+BEDA;BEDA;1108 1165 11B1;BEDA;1108 1165 11B1;
+BEDB;BEDB;1108 1165 11B2;BEDB;1108 1165 11B2;
+BEDC;BEDC;1108 1165 11B3;BEDC;1108 1165 11B3;
+BEDD;BEDD;1108 1165 11B4;BEDD;1108 1165 11B4;
+BEDE;BEDE;1108 1165 11B5;BEDE;1108 1165 11B5;
+BEDF;BEDF;1108 1165 11B6;BEDF;1108 1165 11B6;
+BEE0;BEE0;1108 1165 11B7;BEE0;1108 1165 11B7;
+BEE1;BEE1;1108 1165 11B8;BEE1;1108 1165 11B8;
+BEE2;BEE2;1108 1165 11B9;BEE2;1108 1165 11B9;
+BEE3;BEE3;1108 1165 11BA;BEE3;1108 1165 11BA;
+BEE4;BEE4;1108 1165 11BB;BEE4;1108 1165 11BB;
+BEE5;BEE5;1108 1165 11BC;BEE5;1108 1165 11BC;
+BEE6;BEE6;1108 1165 11BD;BEE6;1108 1165 11BD;
+BEE7;BEE7;1108 1165 11BE;BEE7;1108 1165 11BE;
+BEE8;BEE8;1108 1165 11BF;BEE8;1108 1165 11BF;
+BEE9;BEE9;1108 1165 11C0;BEE9;1108 1165 11C0;
+BEEA;BEEA;1108 1165 11C1;BEEA;1108 1165 11C1;
+BEEB;BEEB;1108 1165 11C2;BEEB;1108 1165 11C2;
+BEEC;BEEC;1108 1166;BEEC;1108 1166;
+BEED;BEED;1108 1166 11A8;BEED;1108 1166 11A8;
+BEEE;BEEE;1108 1166 11A9;BEEE;1108 1166 11A9;
+BEEF;BEEF;1108 1166 11AA;BEEF;1108 1166 11AA;
+BEF0;BEF0;1108 1166 11AB;BEF0;1108 1166 11AB;
+BEF1;BEF1;1108 1166 11AC;BEF1;1108 1166 11AC;
+BEF2;BEF2;1108 1166 11AD;BEF2;1108 1166 11AD;
+BEF3;BEF3;1108 1166 11AE;BEF3;1108 1166 11AE;
+BEF4;BEF4;1108 1166 11AF;BEF4;1108 1166 11AF;
+BEF5;BEF5;1108 1166 11B0;BEF5;1108 1166 11B0;
+BEF6;BEF6;1108 1166 11B1;BEF6;1108 1166 11B1;
+BEF7;BEF7;1108 1166 11B2;BEF7;1108 1166 11B2;
+BEF8;BEF8;1108 1166 11B3;BEF8;1108 1166 11B3;
+BEF9;BEF9;1108 1166 11B4;BEF9;1108 1166 11B4;
+BEFA;BEFA;1108 1166 11B5;BEFA;1108 1166 11B5;
+BEFB;BEFB;1108 1166 11B6;BEFB;1108 1166 11B6;
+BEFC;BEFC;1108 1166 11B7;BEFC;1108 1166 11B7;
+BEFD;BEFD;1108 1166 11B8;BEFD;1108 1166 11B8;
+BEFE;BEFE;1108 1166 11B9;BEFE;1108 1166 11B9;
+BEFF;BEFF;1108 1166 11BA;BEFF;1108 1166 11BA;
+BF00;BF00;1108 1166 11BB;BF00;1108 1166 11BB;
+BF01;BF01;1108 1166 11BC;BF01;1108 1166 11BC;
+BF02;BF02;1108 1166 11BD;BF02;1108 1166 11BD;
+BF03;BF03;1108 1166 11BE;BF03;1108 1166 11BE;
+BF04;BF04;1108 1166 11BF;BF04;1108 1166 11BF;
+BF05;BF05;1108 1166 11C0;BF05;1108 1166 11C0;
+BF06;BF06;1108 1166 11C1;BF06;1108 1166 11C1;
+BF07;BF07;1108 1166 11C2;BF07;1108 1166 11C2;
+BF08;BF08;1108 1167;BF08;1108 1167;
+BF09;BF09;1108 1167 11A8;BF09;1108 1167 11A8;
+BF0A;BF0A;1108 1167 11A9;BF0A;1108 1167 11A9;
+BF0B;BF0B;1108 1167 11AA;BF0B;1108 1167 11AA;
+BF0C;BF0C;1108 1167 11AB;BF0C;1108 1167 11AB;
+BF0D;BF0D;1108 1167 11AC;BF0D;1108 1167 11AC;
+BF0E;BF0E;1108 1167 11AD;BF0E;1108 1167 11AD;
+BF0F;BF0F;1108 1167 11AE;BF0F;1108 1167 11AE;
+BF10;BF10;1108 1167 11AF;BF10;1108 1167 11AF;
+BF11;BF11;1108 1167 11B0;BF11;1108 1167 11B0;
+BF12;BF12;1108 1167 11B1;BF12;1108 1167 11B1;
+BF13;BF13;1108 1167 11B2;BF13;1108 1167 11B2;
+BF14;BF14;1108 1167 11B3;BF14;1108 1167 11B3;
+BF15;BF15;1108 1167 11B4;BF15;1108 1167 11B4;
+BF16;BF16;1108 1167 11B5;BF16;1108 1167 11B5;
+BF17;BF17;1108 1167 11B6;BF17;1108 1167 11B6;
+BF18;BF18;1108 1167 11B7;BF18;1108 1167 11B7;
+BF19;BF19;1108 1167 11B8;BF19;1108 1167 11B8;
+BF1A;BF1A;1108 1167 11B9;BF1A;1108 1167 11B9;
+BF1B;BF1B;1108 1167 11BA;BF1B;1108 1167 11BA;
+BF1C;BF1C;1108 1167 11BB;BF1C;1108 1167 11BB;
+BF1D;BF1D;1108 1167 11BC;BF1D;1108 1167 11BC;
+BF1E;BF1E;1108 1167 11BD;BF1E;1108 1167 11BD;
+BF1F;BF1F;1108 1167 11BE;BF1F;1108 1167 11BE;
+BF20;BF20;1108 1167 11BF;BF20;1108 1167 11BF;
+BF21;BF21;1108 1167 11C0;BF21;1108 1167 11C0;
+BF22;BF22;1108 1167 11C1;BF22;1108 1167 11C1;
+BF23;BF23;1108 1167 11C2;BF23;1108 1167 11C2;
+BF24;BF24;1108 1168;BF24;1108 1168;
+BF25;BF25;1108 1168 11A8;BF25;1108 1168 11A8;
+BF26;BF26;1108 1168 11A9;BF26;1108 1168 11A9;
+BF27;BF27;1108 1168 11AA;BF27;1108 1168 11AA;
+BF28;BF28;1108 1168 11AB;BF28;1108 1168 11AB;
+BF29;BF29;1108 1168 11AC;BF29;1108 1168 11AC;
+BF2A;BF2A;1108 1168 11AD;BF2A;1108 1168 11AD;
+BF2B;BF2B;1108 1168 11AE;BF2B;1108 1168 11AE;
+BF2C;BF2C;1108 1168 11AF;BF2C;1108 1168 11AF;
+BF2D;BF2D;1108 1168 11B0;BF2D;1108 1168 11B0;
+BF2E;BF2E;1108 1168 11B1;BF2E;1108 1168 11B1;
+BF2F;BF2F;1108 1168 11B2;BF2F;1108 1168 11B2;
+BF30;BF30;1108 1168 11B3;BF30;1108 1168 11B3;
+BF31;BF31;1108 1168 11B4;BF31;1108 1168 11B4;
+BF32;BF32;1108 1168 11B5;BF32;1108 1168 11B5;
+BF33;BF33;1108 1168 11B6;BF33;1108 1168 11B6;
+BF34;BF34;1108 1168 11B7;BF34;1108 1168 11B7;
+BF35;BF35;1108 1168 11B8;BF35;1108 1168 11B8;
+BF36;BF36;1108 1168 11B9;BF36;1108 1168 11B9;
+BF37;BF37;1108 1168 11BA;BF37;1108 1168 11BA;
+BF38;BF38;1108 1168 11BB;BF38;1108 1168 11BB;
+BF39;BF39;1108 1168 11BC;BF39;1108 1168 11BC;
+BF3A;BF3A;1108 1168 11BD;BF3A;1108 1168 11BD;
+BF3B;BF3B;1108 1168 11BE;BF3B;1108 1168 11BE;
+BF3C;BF3C;1108 1168 11BF;BF3C;1108 1168 11BF;
+BF3D;BF3D;1108 1168 11C0;BF3D;1108 1168 11C0;
+BF3E;BF3E;1108 1168 11C1;BF3E;1108 1168 11C1;
+BF3F;BF3F;1108 1168 11C2;BF3F;1108 1168 11C2;
+BF40;BF40;1108 1169;BF40;1108 1169;
+BF41;BF41;1108 1169 11A8;BF41;1108 1169 11A8;
+BF42;BF42;1108 1169 11A9;BF42;1108 1169 11A9;
+BF43;BF43;1108 1169 11AA;BF43;1108 1169 11AA;
+BF44;BF44;1108 1169 11AB;BF44;1108 1169 11AB;
+BF45;BF45;1108 1169 11AC;BF45;1108 1169 11AC;
+BF46;BF46;1108 1169 11AD;BF46;1108 1169 11AD;
+BF47;BF47;1108 1169 11AE;BF47;1108 1169 11AE;
+BF48;BF48;1108 1169 11AF;BF48;1108 1169 11AF;
+BF49;BF49;1108 1169 11B0;BF49;1108 1169 11B0;
+BF4A;BF4A;1108 1169 11B1;BF4A;1108 1169 11B1;
+BF4B;BF4B;1108 1169 11B2;BF4B;1108 1169 11B2;
+BF4C;BF4C;1108 1169 11B3;BF4C;1108 1169 11B3;
+BF4D;BF4D;1108 1169 11B4;BF4D;1108 1169 11B4;
+BF4E;BF4E;1108 1169 11B5;BF4E;1108 1169 11B5;
+BF4F;BF4F;1108 1169 11B6;BF4F;1108 1169 11B6;
+BF50;BF50;1108 1169 11B7;BF50;1108 1169 11B7;
+BF51;BF51;1108 1169 11B8;BF51;1108 1169 11B8;
+BF52;BF52;1108 1169 11B9;BF52;1108 1169 11B9;
+BF53;BF53;1108 1169 11BA;BF53;1108 1169 11BA;
+BF54;BF54;1108 1169 11BB;BF54;1108 1169 11BB;
+BF55;BF55;1108 1169 11BC;BF55;1108 1169 11BC;
+BF56;BF56;1108 1169 11BD;BF56;1108 1169 11BD;
+BF57;BF57;1108 1169 11BE;BF57;1108 1169 11BE;
+BF58;BF58;1108 1169 11BF;BF58;1108 1169 11BF;
+BF59;BF59;1108 1169 11C0;BF59;1108 1169 11C0;
+BF5A;BF5A;1108 1169 11C1;BF5A;1108 1169 11C1;
+BF5B;BF5B;1108 1169 11C2;BF5B;1108 1169 11C2;
+BF5C;BF5C;1108 116A;BF5C;1108 116A;
+BF5D;BF5D;1108 116A 11A8;BF5D;1108 116A 11A8;
+BF5E;BF5E;1108 116A 11A9;BF5E;1108 116A 11A9;
+BF5F;BF5F;1108 116A 11AA;BF5F;1108 116A 11AA;
+BF60;BF60;1108 116A 11AB;BF60;1108 116A 11AB;
+BF61;BF61;1108 116A 11AC;BF61;1108 116A 11AC;
+BF62;BF62;1108 116A 11AD;BF62;1108 116A 11AD;
+BF63;BF63;1108 116A 11AE;BF63;1108 116A 11AE;
+BF64;BF64;1108 116A 11AF;BF64;1108 116A 11AF;
+BF65;BF65;1108 116A 11B0;BF65;1108 116A 11B0;
+BF66;BF66;1108 116A 11B1;BF66;1108 116A 11B1;
+BF67;BF67;1108 116A 11B2;BF67;1108 116A 11B2;
+BF68;BF68;1108 116A 11B3;BF68;1108 116A 11B3;
+BF69;BF69;1108 116A 11B4;BF69;1108 116A 11B4;
+BF6A;BF6A;1108 116A 11B5;BF6A;1108 116A 11B5;
+BF6B;BF6B;1108 116A 11B6;BF6B;1108 116A 11B6;
+BF6C;BF6C;1108 116A 11B7;BF6C;1108 116A 11B7;
+BF6D;BF6D;1108 116A 11B8;BF6D;1108 116A 11B8;
+BF6E;BF6E;1108 116A 11B9;BF6E;1108 116A 11B9;
+BF6F;BF6F;1108 116A 11BA;BF6F;1108 116A 11BA;
+BF70;BF70;1108 116A 11BB;BF70;1108 116A 11BB;
+BF71;BF71;1108 116A 11BC;BF71;1108 116A 11BC;
+BF72;BF72;1108 116A 11BD;BF72;1108 116A 11BD;
+BF73;BF73;1108 116A 11BE;BF73;1108 116A 11BE;
+BF74;BF74;1108 116A 11BF;BF74;1108 116A 11BF;
+BF75;BF75;1108 116A 11C0;BF75;1108 116A 11C0;
+BF76;BF76;1108 116A 11C1;BF76;1108 116A 11C1;
+BF77;BF77;1108 116A 11C2;BF77;1108 116A 11C2;
+BF78;BF78;1108 116B;BF78;1108 116B;
+BF79;BF79;1108 116B 11A8;BF79;1108 116B 11A8;
+BF7A;BF7A;1108 116B 11A9;BF7A;1108 116B 11A9;
+BF7B;BF7B;1108 116B 11AA;BF7B;1108 116B 11AA;
+BF7C;BF7C;1108 116B 11AB;BF7C;1108 116B 11AB;
+BF7D;BF7D;1108 116B 11AC;BF7D;1108 116B 11AC;
+BF7E;BF7E;1108 116B 11AD;BF7E;1108 116B 11AD;
+BF7F;BF7F;1108 116B 11AE;BF7F;1108 116B 11AE;
+BF80;BF80;1108 116B 11AF;BF80;1108 116B 11AF;
+BF81;BF81;1108 116B 11B0;BF81;1108 116B 11B0;
+BF82;BF82;1108 116B 11B1;BF82;1108 116B 11B1;
+BF83;BF83;1108 116B 11B2;BF83;1108 116B 11B2;
+BF84;BF84;1108 116B 11B3;BF84;1108 116B 11B3;
+BF85;BF85;1108 116B 11B4;BF85;1108 116B 11B4;
+BF86;BF86;1108 116B 11B5;BF86;1108 116B 11B5;
+BF87;BF87;1108 116B 11B6;BF87;1108 116B 11B6;
+BF88;BF88;1108 116B 11B7;BF88;1108 116B 11B7;
+BF89;BF89;1108 116B 11B8;BF89;1108 116B 11B8;
+BF8A;BF8A;1108 116B 11B9;BF8A;1108 116B 11B9;
+BF8B;BF8B;1108 116B 11BA;BF8B;1108 116B 11BA;
+BF8C;BF8C;1108 116B 11BB;BF8C;1108 116B 11BB;
+BF8D;BF8D;1108 116B 11BC;BF8D;1108 116B 11BC;
+BF8E;BF8E;1108 116B 11BD;BF8E;1108 116B 11BD;
+BF8F;BF8F;1108 116B 11BE;BF8F;1108 116B 11BE;
+BF90;BF90;1108 116B 11BF;BF90;1108 116B 11BF;
+BF91;BF91;1108 116B 11C0;BF91;1108 116B 11C0;
+BF92;BF92;1108 116B 11C1;BF92;1108 116B 11C1;
+BF93;BF93;1108 116B 11C2;BF93;1108 116B 11C2;
+BF94;BF94;1108 116C;BF94;1108 116C;
+BF95;BF95;1108 116C 11A8;BF95;1108 116C 11A8;
+BF96;BF96;1108 116C 11A9;BF96;1108 116C 11A9;
+BF97;BF97;1108 116C 11AA;BF97;1108 116C 11AA;
+BF98;BF98;1108 116C 11AB;BF98;1108 116C 11AB;
+BF99;BF99;1108 116C 11AC;BF99;1108 116C 11AC;
+BF9A;BF9A;1108 116C 11AD;BF9A;1108 116C 11AD;
+BF9B;BF9B;1108 116C 11AE;BF9B;1108 116C 11AE;
+BF9C;BF9C;1108 116C 11AF;BF9C;1108 116C 11AF;
+BF9D;BF9D;1108 116C 11B0;BF9D;1108 116C 11B0;
+BF9E;BF9E;1108 116C 11B1;BF9E;1108 116C 11B1;
+BF9F;BF9F;1108 116C 11B2;BF9F;1108 116C 11B2;
+BFA0;BFA0;1108 116C 11B3;BFA0;1108 116C 11B3;
+BFA1;BFA1;1108 116C 11B4;BFA1;1108 116C 11B4;
+BFA2;BFA2;1108 116C 11B5;BFA2;1108 116C 11B5;
+BFA3;BFA3;1108 116C 11B6;BFA3;1108 116C 11B6;
+BFA4;BFA4;1108 116C 11B7;BFA4;1108 116C 11B7;
+BFA5;BFA5;1108 116C 11B8;BFA5;1108 116C 11B8;
+BFA6;BFA6;1108 116C 11B9;BFA6;1108 116C 11B9;
+BFA7;BFA7;1108 116C 11BA;BFA7;1108 116C 11BA;
+BFA8;BFA8;1108 116C 11BB;BFA8;1108 116C 11BB;
+BFA9;BFA9;1108 116C 11BC;BFA9;1108 116C 11BC;
+BFAA;BFAA;1108 116C 11BD;BFAA;1108 116C 11BD;
+BFAB;BFAB;1108 116C 11BE;BFAB;1108 116C 11BE;
+BFAC;BFAC;1108 116C 11BF;BFAC;1108 116C 11BF;
+BFAD;BFAD;1108 116C 11C0;BFAD;1108 116C 11C0;
+BFAE;BFAE;1108 116C 11C1;BFAE;1108 116C 11C1;
+BFAF;BFAF;1108 116C 11C2;BFAF;1108 116C 11C2;
+BFB0;BFB0;1108 116D;BFB0;1108 116D;
+BFB1;BFB1;1108 116D 11A8;BFB1;1108 116D 11A8;
+BFB2;BFB2;1108 116D 11A9;BFB2;1108 116D 11A9;
+BFB3;BFB3;1108 116D 11AA;BFB3;1108 116D 11AA;
+BFB4;BFB4;1108 116D 11AB;BFB4;1108 116D 11AB;
+BFB5;BFB5;1108 116D 11AC;BFB5;1108 116D 11AC;
+BFB6;BFB6;1108 116D 11AD;BFB6;1108 116D 11AD;
+BFB7;BFB7;1108 116D 11AE;BFB7;1108 116D 11AE;
+BFB8;BFB8;1108 116D 11AF;BFB8;1108 116D 11AF;
+BFB9;BFB9;1108 116D 11B0;BFB9;1108 116D 11B0;
+BFBA;BFBA;1108 116D 11B1;BFBA;1108 116D 11B1;
+BFBB;BFBB;1108 116D 11B2;BFBB;1108 116D 11B2;
+BFBC;BFBC;1108 116D 11B3;BFBC;1108 116D 11B3;
+BFBD;BFBD;1108 116D 11B4;BFBD;1108 116D 11B4;
+BFBE;BFBE;1108 116D 11B5;BFBE;1108 116D 11B5;
+BFBF;BFBF;1108 116D 11B6;BFBF;1108 116D 11B6;
+BFC0;BFC0;1108 116D 11B7;BFC0;1108 116D 11B7;
+BFC1;BFC1;1108 116D 11B8;BFC1;1108 116D 11B8;
+BFC2;BFC2;1108 116D 11B9;BFC2;1108 116D 11B9;
+BFC3;BFC3;1108 116D 11BA;BFC3;1108 116D 11BA;
+BFC4;BFC4;1108 116D 11BB;BFC4;1108 116D 11BB;
+BFC5;BFC5;1108 116D 11BC;BFC5;1108 116D 11BC;
+BFC6;BFC6;1108 116D 11BD;BFC6;1108 116D 11BD;
+BFC7;BFC7;1108 116D 11BE;BFC7;1108 116D 11BE;
+BFC8;BFC8;1108 116D 11BF;BFC8;1108 116D 11BF;
+BFC9;BFC9;1108 116D 11C0;BFC9;1108 116D 11C0;
+BFCA;BFCA;1108 116D 11C1;BFCA;1108 116D 11C1;
+BFCB;BFCB;1108 116D 11C2;BFCB;1108 116D 11C2;
+BFCC;BFCC;1108 116E;BFCC;1108 116E;
+BFCD;BFCD;1108 116E 11A8;BFCD;1108 116E 11A8;
+BFCE;BFCE;1108 116E 11A9;BFCE;1108 116E 11A9;
+BFCF;BFCF;1108 116E 11AA;BFCF;1108 116E 11AA;
+BFD0;BFD0;1108 116E 11AB;BFD0;1108 116E 11AB;
+BFD1;BFD1;1108 116E 11AC;BFD1;1108 116E 11AC;
+BFD2;BFD2;1108 116E 11AD;BFD2;1108 116E 11AD;
+BFD3;BFD3;1108 116E 11AE;BFD3;1108 116E 11AE;
+BFD4;BFD4;1108 116E 11AF;BFD4;1108 116E 11AF;
+BFD5;BFD5;1108 116E 11B0;BFD5;1108 116E 11B0;
+BFD6;BFD6;1108 116E 11B1;BFD6;1108 116E 11B1;
+BFD7;BFD7;1108 116E 11B2;BFD7;1108 116E 11B2;
+BFD8;BFD8;1108 116E 11B3;BFD8;1108 116E 11B3;
+BFD9;BFD9;1108 116E 11B4;BFD9;1108 116E 11B4;
+BFDA;BFDA;1108 116E 11B5;BFDA;1108 116E 11B5;
+BFDB;BFDB;1108 116E 11B6;BFDB;1108 116E 11B6;
+BFDC;BFDC;1108 116E 11B7;BFDC;1108 116E 11B7;
+BFDD;BFDD;1108 116E 11B8;BFDD;1108 116E 11B8;
+BFDE;BFDE;1108 116E 11B9;BFDE;1108 116E 11B9;
+BFDF;BFDF;1108 116E 11BA;BFDF;1108 116E 11BA;
+BFE0;BFE0;1108 116E 11BB;BFE0;1108 116E 11BB;
+BFE1;BFE1;1108 116E 11BC;BFE1;1108 116E 11BC;
+BFE2;BFE2;1108 116E 11BD;BFE2;1108 116E 11BD;
+BFE3;BFE3;1108 116E 11BE;BFE3;1108 116E 11BE;
+BFE4;BFE4;1108 116E 11BF;BFE4;1108 116E 11BF;
+BFE5;BFE5;1108 116E 11C0;BFE5;1108 116E 11C0;
+BFE6;BFE6;1108 116E 11C1;BFE6;1108 116E 11C1;
+BFE7;BFE7;1108 116E 11C2;BFE7;1108 116E 11C2;
+BFE8;BFE8;1108 116F;BFE8;1108 116F;
+BFE9;BFE9;1108 116F 11A8;BFE9;1108 116F 11A8;
+BFEA;BFEA;1108 116F 11A9;BFEA;1108 116F 11A9;
+BFEB;BFEB;1108 116F 11AA;BFEB;1108 116F 11AA;
+BFEC;BFEC;1108 116F 11AB;BFEC;1108 116F 11AB;
+BFED;BFED;1108 116F 11AC;BFED;1108 116F 11AC;
+BFEE;BFEE;1108 116F 11AD;BFEE;1108 116F 11AD;
+BFEF;BFEF;1108 116F 11AE;BFEF;1108 116F 11AE;
+BFF0;BFF0;1108 116F 11AF;BFF0;1108 116F 11AF;
+BFF1;BFF1;1108 116F 11B0;BFF1;1108 116F 11B0;
+BFF2;BFF2;1108 116F 11B1;BFF2;1108 116F 11B1;
+BFF3;BFF3;1108 116F 11B2;BFF3;1108 116F 11B2;
+BFF4;BFF4;1108 116F 11B3;BFF4;1108 116F 11B3;
+BFF5;BFF5;1108 116F 11B4;BFF5;1108 116F 11B4;
+BFF6;BFF6;1108 116F 11B5;BFF6;1108 116F 11B5;
+BFF7;BFF7;1108 116F 11B6;BFF7;1108 116F 11B6;
+BFF8;BFF8;1108 116F 11B7;BFF8;1108 116F 11B7;
+BFF9;BFF9;1108 116F 11B8;BFF9;1108 116F 11B8;
+BFFA;BFFA;1108 116F 11B9;BFFA;1108 116F 11B9;
+BFFB;BFFB;1108 116F 11BA;BFFB;1108 116F 11BA;
+BFFC;BFFC;1108 116F 11BB;BFFC;1108 116F 11BB;
+BFFD;BFFD;1108 116F 11BC;BFFD;1108 116F 11BC;
+BFFE;BFFE;1108 116F 11BD;BFFE;1108 116F 11BD;
+BFFF;BFFF;1108 116F 11BE;BFFF;1108 116F 11BE;
+C000;C000;1108 116F 11BF;C000;1108 116F 11BF;
+C001;C001;1108 116F 11C0;C001;1108 116F 11C0;
+C002;C002;1108 116F 11C1;C002;1108 116F 11C1;
+C003;C003;1108 116F 11C2;C003;1108 116F 11C2;
+C004;C004;1108 1170;C004;1108 1170;
+C005;C005;1108 1170 11A8;C005;1108 1170 11A8;
+C006;C006;1108 1170 11A9;C006;1108 1170 11A9;
+C007;C007;1108 1170 11AA;C007;1108 1170 11AA;
+C008;C008;1108 1170 11AB;C008;1108 1170 11AB;
+C009;C009;1108 1170 11AC;C009;1108 1170 11AC;
+C00A;C00A;1108 1170 11AD;C00A;1108 1170 11AD;
+C00B;C00B;1108 1170 11AE;C00B;1108 1170 11AE;
+C00C;C00C;1108 1170 11AF;C00C;1108 1170 11AF;
+C00D;C00D;1108 1170 11B0;C00D;1108 1170 11B0;
+C00E;C00E;1108 1170 11B1;C00E;1108 1170 11B1;
+C00F;C00F;1108 1170 11B2;C00F;1108 1170 11B2;
+C010;C010;1108 1170 11B3;C010;1108 1170 11B3;
+C011;C011;1108 1170 11B4;C011;1108 1170 11B4;
+C012;C012;1108 1170 11B5;C012;1108 1170 11B5;
+C013;C013;1108 1170 11B6;C013;1108 1170 11B6;
+C014;C014;1108 1170 11B7;C014;1108 1170 11B7;
+C015;C015;1108 1170 11B8;C015;1108 1170 11B8;
+C016;C016;1108 1170 11B9;C016;1108 1170 11B9;
+C017;C017;1108 1170 11BA;C017;1108 1170 11BA;
+C018;C018;1108 1170 11BB;C018;1108 1170 11BB;
+C019;C019;1108 1170 11BC;C019;1108 1170 11BC;
+C01A;C01A;1108 1170 11BD;C01A;1108 1170 11BD;
+C01B;C01B;1108 1170 11BE;C01B;1108 1170 11BE;
+C01C;C01C;1108 1170 11BF;C01C;1108 1170 11BF;
+C01D;C01D;1108 1170 11C0;C01D;1108 1170 11C0;
+C01E;C01E;1108 1170 11C1;C01E;1108 1170 11C1;
+C01F;C01F;1108 1170 11C2;C01F;1108 1170 11C2;
+C020;C020;1108 1171;C020;1108 1171;
+C021;C021;1108 1171 11A8;C021;1108 1171 11A8;
+C022;C022;1108 1171 11A9;C022;1108 1171 11A9;
+C023;C023;1108 1171 11AA;C023;1108 1171 11AA;
+C024;C024;1108 1171 11AB;C024;1108 1171 11AB;
+C025;C025;1108 1171 11AC;C025;1108 1171 11AC;
+C026;C026;1108 1171 11AD;C026;1108 1171 11AD;
+C027;C027;1108 1171 11AE;C027;1108 1171 11AE;
+C028;C028;1108 1171 11AF;C028;1108 1171 11AF;
+C029;C029;1108 1171 11B0;C029;1108 1171 11B0;
+C02A;C02A;1108 1171 11B1;C02A;1108 1171 11B1;
+C02B;C02B;1108 1171 11B2;C02B;1108 1171 11B2;
+C02C;C02C;1108 1171 11B3;C02C;1108 1171 11B3;
+C02D;C02D;1108 1171 11B4;C02D;1108 1171 11B4;
+C02E;C02E;1108 1171 11B5;C02E;1108 1171 11B5;
+C02F;C02F;1108 1171 11B6;C02F;1108 1171 11B6;
+C030;C030;1108 1171 11B7;C030;1108 1171 11B7;
+C031;C031;1108 1171 11B8;C031;1108 1171 11B8;
+C032;C032;1108 1171 11B9;C032;1108 1171 11B9;
+C033;C033;1108 1171 11BA;C033;1108 1171 11BA;
+C034;C034;1108 1171 11BB;C034;1108 1171 11BB;
+C035;C035;1108 1171 11BC;C035;1108 1171 11BC;
+C036;C036;1108 1171 11BD;C036;1108 1171 11BD;
+C037;C037;1108 1171 11BE;C037;1108 1171 11BE;
+C038;C038;1108 1171 11BF;C038;1108 1171 11BF;
+C039;C039;1108 1171 11C0;C039;1108 1171 11C0;
+C03A;C03A;1108 1171 11C1;C03A;1108 1171 11C1;
+C03B;C03B;1108 1171 11C2;C03B;1108 1171 11C2;
+C03C;C03C;1108 1172;C03C;1108 1172;
+C03D;C03D;1108 1172 11A8;C03D;1108 1172 11A8;
+C03E;C03E;1108 1172 11A9;C03E;1108 1172 11A9;
+C03F;C03F;1108 1172 11AA;C03F;1108 1172 11AA;
+C040;C040;1108 1172 11AB;C040;1108 1172 11AB;
+C041;C041;1108 1172 11AC;C041;1108 1172 11AC;
+C042;C042;1108 1172 11AD;C042;1108 1172 11AD;
+C043;C043;1108 1172 11AE;C043;1108 1172 11AE;
+C044;C044;1108 1172 11AF;C044;1108 1172 11AF;
+C045;C045;1108 1172 11B0;C045;1108 1172 11B0;
+C046;C046;1108 1172 11B1;C046;1108 1172 11B1;
+C047;C047;1108 1172 11B2;C047;1108 1172 11B2;
+C048;C048;1108 1172 11B3;C048;1108 1172 11B3;
+C049;C049;1108 1172 11B4;C049;1108 1172 11B4;
+C04A;C04A;1108 1172 11B5;C04A;1108 1172 11B5;
+C04B;C04B;1108 1172 11B6;C04B;1108 1172 11B6;
+C04C;C04C;1108 1172 11B7;C04C;1108 1172 11B7;
+C04D;C04D;1108 1172 11B8;C04D;1108 1172 11B8;
+C04E;C04E;1108 1172 11B9;C04E;1108 1172 11B9;
+C04F;C04F;1108 1172 11BA;C04F;1108 1172 11BA;
+C050;C050;1108 1172 11BB;C050;1108 1172 11BB;
+C051;C051;1108 1172 11BC;C051;1108 1172 11BC;
+C052;C052;1108 1172 11BD;C052;1108 1172 11BD;
+C053;C053;1108 1172 11BE;C053;1108 1172 11BE;
+C054;C054;1108 1172 11BF;C054;1108 1172 11BF;
+C055;C055;1108 1172 11C0;C055;1108 1172 11C0;
+C056;C056;1108 1172 11C1;C056;1108 1172 11C1;
+C057;C057;1108 1172 11C2;C057;1108 1172 11C2;
+C058;C058;1108 1173;C058;1108 1173;
+C059;C059;1108 1173 11A8;C059;1108 1173 11A8;
+C05A;C05A;1108 1173 11A9;C05A;1108 1173 11A9;
+C05B;C05B;1108 1173 11AA;C05B;1108 1173 11AA;
+C05C;C05C;1108 1173 11AB;C05C;1108 1173 11AB;
+C05D;C05D;1108 1173 11AC;C05D;1108 1173 11AC;
+C05E;C05E;1108 1173 11AD;C05E;1108 1173 11AD;
+C05F;C05F;1108 1173 11AE;C05F;1108 1173 11AE;
+C060;C060;1108 1173 11AF;C060;1108 1173 11AF;
+C061;C061;1108 1173 11B0;C061;1108 1173 11B0;
+C062;C062;1108 1173 11B1;C062;1108 1173 11B1;
+C063;C063;1108 1173 11B2;C063;1108 1173 11B2;
+C064;C064;1108 1173 11B3;C064;1108 1173 11B3;
+C065;C065;1108 1173 11B4;C065;1108 1173 11B4;
+C066;C066;1108 1173 11B5;C066;1108 1173 11B5;
+C067;C067;1108 1173 11B6;C067;1108 1173 11B6;
+C068;C068;1108 1173 11B7;C068;1108 1173 11B7;
+C069;C069;1108 1173 11B8;C069;1108 1173 11B8;
+C06A;C06A;1108 1173 11B9;C06A;1108 1173 11B9;
+C06B;C06B;1108 1173 11BA;C06B;1108 1173 11BA;
+C06C;C06C;1108 1173 11BB;C06C;1108 1173 11BB;
+C06D;C06D;1108 1173 11BC;C06D;1108 1173 11BC;
+C06E;C06E;1108 1173 11BD;C06E;1108 1173 11BD;
+C06F;C06F;1108 1173 11BE;C06F;1108 1173 11BE;
+C070;C070;1108 1173 11BF;C070;1108 1173 11BF;
+C071;C071;1108 1173 11C0;C071;1108 1173 11C0;
+C072;C072;1108 1173 11C1;C072;1108 1173 11C1;
+C073;C073;1108 1173 11C2;C073;1108 1173 11C2;
+C074;C074;1108 1174;C074;1108 1174;
+C075;C075;1108 1174 11A8;C075;1108 1174 11A8;
+C076;C076;1108 1174 11A9;C076;1108 1174 11A9;
+C077;C077;1108 1174 11AA;C077;1108 1174 11AA;
+C078;C078;1108 1174 11AB;C078;1108 1174 11AB;
+C079;C079;1108 1174 11AC;C079;1108 1174 11AC;
+C07A;C07A;1108 1174 11AD;C07A;1108 1174 11AD;
+C07B;C07B;1108 1174 11AE;C07B;1108 1174 11AE;
+C07C;C07C;1108 1174 11AF;C07C;1108 1174 11AF;
+C07D;C07D;1108 1174 11B0;C07D;1108 1174 11B0;
+C07E;C07E;1108 1174 11B1;C07E;1108 1174 11B1;
+C07F;C07F;1108 1174 11B2;C07F;1108 1174 11B2;
+C080;C080;1108 1174 11B3;C080;1108 1174 11B3;
+C081;C081;1108 1174 11B4;C081;1108 1174 11B4;
+C082;C082;1108 1174 11B5;C082;1108 1174 11B5;
+C083;C083;1108 1174 11B6;C083;1108 1174 11B6;
+C084;C084;1108 1174 11B7;C084;1108 1174 11B7;
+C085;C085;1108 1174 11B8;C085;1108 1174 11B8;
+C086;C086;1108 1174 11B9;C086;1108 1174 11B9;
+C087;C087;1108 1174 11BA;C087;1108 1174 11BA;
+C088;C088;1108 1174 11BB;C088;1108 1174 11BB;
+C089;C089;1108 1174 11BC;C089;1108 1174 11BC;
+C08A;C08A;1108 1174 11BD;C08A;1108 1174 11BD;
+C08B;C08B;1108 1174 11BE;C08B;1108 1174 11BE;
+C08C;C08C;1108 1174 11BF;C08C;1108 1174 11BF;
+C08D;C08D;1108 1174 11C0;C08D;1108 1174 11C0;
+C08E;C08E;1108 1174 11C1;C08E;1108 1174 11C1;
+C08F;C08F;1108 1174 11C2;C08F;1108 1174 11C2;
+C090;C090;1108 1175;C090;1108 1175;
+C091;C091;1108 1175 11A8;C091;1108 1175 11A8;
+C092;C092;1108 1175 11A9;C092;1108 1175 11A9;
+C093;C093;1108 1175 11AA;C093;1108 1175 11AA;
+C094;C094;1108 1175 11AB;C094;1108 1175 11AB;
+C095;C095;1108 1175 11AC;C095;1108 1175 11AC;
+C096;C096;1108 1175 11AD;C096;1108 1175 11AD;
+C097;C097;1108 1175 11AE;C097;1108 1175 11AE;
+C098;C098;1108 1175 11AF;C098;1108 1175 11AF;
+C099;C099;1108 1175 11B0;C099;1108 1175 11B0;
+C09A;C09A;1108 1175 11B1;C09A;1108 1175 11B1;
+C09B;C09B;1108 1175 11B2;C09B;1108 1175 11B2;
+C09C;C09C;1108 1175 11B3;C09C;1108 1175 11B3;
+C09D;C09D;1108 1175 11B4;C09D;1108 1175 11B4;
+C09E;C09E;1108 1175 11B5;C09E;1108 1175 11B5;
+C09F;C09F;1108 1175 11B6;C09F;1108 1175 11B6;
+C0A0;C0A0;1108 1175 11B7;C0A0;1108 1175 11B7;
+C0A1;C0A1;1108 1175 11B8;C0A1;1108 1175 11B8;
+C0A2;C0A2;1108 1175 11B9;C0A2;1108 1175 11B9;
+C0A3;C0A3;1108 1175 11BA;C0A3;1108 1175 11BA;
+C0A4;C0A4;1108 1175 11BB;C0A4;1108 1175 11BB;
+C0A5;C0A5;1108 1175 11BC;C0A5;1108 1175 11BC;
+C0A6;C0A6;1108 1175 11BD;C0A6;1108 1175 11BD;
+C0A7;C0A7;1108 1175 11BE;C0A7;1108 1175 11BE;
+C0A8;C0A8;1108 1175 11BF;C0A8;1108 1175 11BF;
+C0A9;C0A9;1108 1175 11C0;C0A9;1108 1175 11C0;
+C0AA;C0AA;1108 1175 11C1;C0AA;1108 1175 11C1;
+C0AB;C0AB;1108 1175 11C2;C0AB;1108 1175 11C2;
+C0AC;C0AC;1109 1161;C0AC;1109 1161;
+C0AD;C0AD;1109 1161 11A8;C0AD;1109 1161 11A8;
+C0AE;C0AE;1109 1161 11A9;C0AE;1109 1161 11A9;
+C0AF;C0AF;1109 1161 11AA;C0AF;1109 1161 11AA;
+C0B0;C0B0;1109 1161 11AB;C0B0;1109 1161 11AB;
+C0B1;C0B1;1109 1161 11AC;C0B1;1109 1161 11AC;
+C0B2;C0B2;1109 1161 11AD;C0B2;1109 1161 11AD;
+C0B3;C0B3;1109 1161 11AE;C0B3;1109 1161 11AE;
+C0B4;C0B4;1109 1161 11AF;C0B4;1109 1161 11AF;
+C0B5;C0B5;1109 1161 11B0;C0B5;1109 1161 11B0;
+C0B6;C0B6;1109 1161 11B1;C0B6;1109 1161 11B1;
+C0B7;C0B7;1109 1161 11B2;C0B7;1109 1161 11B2;
+C0B8;C0B8;1109 1161 11B3;C0B8;1109 1161 11B3;
+C0B9;C0B9;1109 1161 11B4;C0B9;1109 1161 11B4;
+C0BA;C0BA;1109 1161 11B5;C0BA;1109 1161 11B5;
+C0BB;C0BB;1109 1161 11B6;C0BB;1109 1161 11B6;
+C0BC;C0BC;1109 1161 11B7;C0BC;1109 1161 11B7;
+C0BD;C0BD;1109 1161 11B8;C0BD;1109 1161 11B8;
+C0BE;C0BE;1109 1161 11B9;C0BE;1109 1161 11B9;
+C0BF;C0BF;1109 1161 11BA;C0BF;1109 1161 11BA;
+C0C0;C0C0;1109 1161 11BB;C0C0;1109 1161 11BB;
+C0C1;C0C1;1109 1161 11BC;C0C1;1109 1161 11BC;
+C0C2;C0C2;1109 1161 11BD;C0C2;1109 1161 11BD;
+C0C3;C0C3;1109 1161 11BE;C0C3;1109 1161 11BE;
+C0C4;C0C4;1109 1161 11BF;C0C4;1109 1161 11BF;
+C0C5;C0C5;1109 1161 11C0;C0C5;1109 1161 11C0;
+C0C6;C0C6;1109 1161 11C1;C0C6;1109 1161 11C1;
+C0C7;C0C7;1109 1161 11C2;C0C7;1109 1161 11C2;
+C0C8;C0C8;1109 1162;C0C8;1109 1162;
+C0C9;C0C9;1109 1162 11A8;C0C9;1109 1162 11A8;
+C0CA;C0CA;1109 1162 11A9;C0CA;1109 1162 11A9;
+C0CB;C0CB;1109 1162 11AA;C0CB;1109 1162 11AA;
+C0CC;C0CC;1109 1162 11AB;C0CC;1109 1162 11AB;
+C0CD;C0CD;1109 1162 11AC;C0CD;1109 1162 11AC;
+C0CE;C0CE;1109 1162 11AD;C0CE;1109 1162 11AD;
+C0CF;C0CF;1109 1162 11AE;C0CF;1109 1162 11AE;
+C0D0;C0D0;1109 1162 11AF;C0D0;1109 1162 11AF;
+C0D1;C0D1;1109 1162 11B0;C0D1;1109 1162 11B0;
+C0D2;C0D2;1109 1162 11B1;C0D2;1109 1162 11B1;
+C0D3;C0D3;1109 1162 11B2;C0D3;1109 1162 11B2;
+C0D4;C0D4;1109 1162 11B3;C0D4;1109 1162 11B3;
+C0D5;C0D5;1109 1162 11B4;C0D5;1109 1162 11B4;
+C0D6;C0D6;1109 1162 11B5;C0D6;1109 1162 11B5;
+C0D7;C0D7;1109 1162 11B6;C0D7;1109 1162 11B6;
+C0D8;C0D8;1109 1162 11B7;C0D8;1109 1162 11B7;
+C0D9;C0D9;1109 1162 11B8;C0D9;1109 1162 11B8;
+C0DA;C0DA;1109 1162 11B9;C0DA;1109 1162 11B9;
+C0DB;C0DB;1109 1162 11BA;C0DB;1109 1162 11BA;
+C0DC;C0DC;1109 1162 11BB;C0DC;1109 1162 11BB;
+C0DD;C0DD;1109 1162 11BC;C0DD;1109 1162 11BC;
+C0DE;C0DE;1109 1162 11BD;C0DE;1109 1162 11BD;
+C0DF;C0DF;1109 1162 11BE;C0DF;1109 1162 11BE;
+C0E0;C0E0;1109 1162 11BF;C0E0;1109 1162 11BF;
+C0E1;C0E1;1109 1162 11C0;C0E1;1109 1162 11C0;
+C0E2;C0E2;1109 1162 11C1;C0E2;1109 1162 11C1;
+C0E3;C0E3;1109 1162 11C2;C0E3;1109 1162 11C2;
+C0E4;C0E4;1109 1163;C0E4;1109 1163;
+C0E5;C0E5;1109 1163 11A8;C0E5;1109 1163 11A8;
+C0E6;C0E6;1109 1163 11A9;C0E6;1109 1163 11A9;
+C0E7;C0E7;1109 1163 11AA;C0E7;1109 1163 11AA;
+C0E8;C0E8;1109 1163 11AB;C0E8;1109 1163 11AB;
+C0E9;C0E9;1109 1163 11AC;C0E9;1109 1163 11AC;
+C0EA;C0EA;1109 1163 11AD;C0EA;1109 1163 11AD;
+C0EB;C0EB;1109 1163 11AE;C0EB;1109 1163 11AE;
+C0EC;C0EC;1109 1163 11AF;C0EC;1109 1163 11AF;
+C0ED;C0ED;1109 1163 11B0;C0ED;1109 1163 11B0;
+C0EE;C0EE;1109 1163 11B1;C0EE;1109 1163 11B1;
+C0EF;C0EF;1109 1163 11B2;C0EF;1109 1163 11B2;
+C0F0;C0F0;1109 1163 11B3;C0F0;1109 1163 11B3;
+C0F1;C0F1;1109 1163 11B4;C0F1;1109 1163 11B4;
+C0F2;C0F2;1109 1163 11B5;C0F2;1109 1163 11B5;
+C0F3;C0F3;1109 1163 11B6;C0F3;1109 1163 11B6;
+C0F4;C0F4;1109 1163 11B7;C0F4;1109 1163 11B7;
+C0F5;C0F5;1109 1163 11B8;C0F5;1109 1163 11B8;
+C0F6;C0F6;1109 1163 11B9;C0F6;1109 1163 11B9;
+C0F7;C0F7;1109 1163 11BA;C0F7;1109 1163 11BA;
+C0F8;C0F8;1109 1163 11BB;C0F8;1109 1163 11BB;
+C0F9;C0F9;1109 1163 11BC;C0F9;1109 1163 11BC;
+C0FA;C0FA;1109 1163 11BD;C0FA;1109 1163 11BD;
+C0FB;C0FB;1109 1163 11BE;C0FB;1109 1163 11BE;
+C0FC;C0FC;1109 1163 11BF;C0FC;1109 1163 11BF;
+C0FD;C0FD;1109 1163 11C0;C0FD;1109 1163 11C0;
+C0FE;C0FE;1109 1163 11C1;C0FE;1109 1163 11C1;
+C0FF;C0FF;1109 1163 11C2;C0FF;1109 1163 11C2;
+C100;C100;1109 1164;C100;1109 1164;
+C101;C101;1109 1164 11A8;C101;1109 1164 11A8;
+C102;C102;1109 1164 11A9;C102;1109 1164 11A9;
+C103;C103;1109 1164 11AA;C103;1109 1164 11AA;
+C104;C104;1109 1164 11AB;C104;1109 1164 11AB;
+C105;C105;1109 1164 11AC;C105;1109 1164 11AC;
+C106;C106;1109 1164 11AD;C106;1109 1164 11AD;
+C107;C107;1109 1164 11AE;C107;1109 1164 11AE;
+C108;C108;1109 1164 11AF;C108;1109 1164 11AF;
+C109;C109;1109 1164 11B0;C109;1109 1164 11B0;
+C10A;C10A;1109 1164 11B1;C10A;1109 1164 11B1;
+C10B;C10B;1109 1164 11B2;C10B;1109 1164 11B2;
+C10C;C10C;1109 1164 11B3;C10C;1109 1164 11B3;
+C10D;C10D;1109 1164 11B4;C10D;1109 1164 11B4;
+C10E;C10E;1109 1164 11B5;C10E;1109 1164 11B5;
+C10F;C10F;1109 1164 11B6;C10F;1109 1164 11B6;
+C110;C110;1109 1164 11B7;C110;1109 1164 11B7;
+C111;C111;1109 1164 11B8;C111;1109 1164 11B8;
+C112;C112;1109 1164 11B9;C112;1109 1164 11B9;
+C113;C113;1109 1164 11BA;C113;1109 1164 11BA;
+C114;C114;1109 1164 11BB;C114;1109 1164 11BB;
+C115;C115;1109 1164 11BC;C115;1109 1164 11BC;
+C116;C116;1109 1164 11BD;C116;1109 1164 11BD;
+C117;C117;1109 1164 11BE;C117;1109 1164 11BE;
+C118;C118;1109 1164 11BF;C118;1109 1164 11BF;
+C119;C119;1109 1164 11C0;C119;1109 1164 11C0;
+C11A;C11A;1109 1164 11C1;C11A;1109 1164 11C1;
+C11B;C11B;1109 1164 11C2;C11B;1109 1164 11C2;
+C11C;C11C;1109 1165;C11C;1109 1165;
+C11D;C11D;1109 1165 11A8;C11D;1109 1165 11A8;
+C11E;C11E;1109 1165 11A9;C11E;1109 1165 11A9;
+C11F;C11F;1109 1165 11AA;C11F;1109 1165 11AA;
+C120;C120;1109 1165 11AB;C120;1109 1165 11AB;
+C121;C121;1109 1165 11AC;C121;1109 1165 11AC;
+C122;C122;1109 1165 11AD;C122;1109 1165 11AD;
+C123;C123;1109 1165 11AE;C123;1109 1165 11AE;
+C124;C124;1109 1165 11AF;C124;1109 1165 11AF;
+C125;C125;1109 1165 11B0;C125;1109 1165 11B0;
+C126;C126;1109 1165 11B1;C126;1109 1165 11B1;
+C127;C127;1109 1165 11B2;C127;1109 1165 11B2;
+C128;C128;1109 1165 11B3;C128;1109 1165 11B3;
+C129;C129;1109 1165 11B4;C129;1109 1165 11B4;
+C12A;C12A;1109 1165 11B5;C12A;1109 1165 11B5;
+C12B;C12B;1109 1165 11B6;C12B;1109 1165 11B6;
+C12C;C12C;1109 1165 11B7;C12C;1109 1165 11B7;
+C12D;C12D;1109 1165 11B8;C12D;1109 1165 11B8;
+C12E;C12E;1109 1165 11B9;C12E;1109 1165 11B9;
+C12F;C12F;1109 1165 11BA;C12F;1109 1165 11BA;
+C130;C130;1109 1165 11BB;C130;1109 1165 11BB;
+C131;C131;1109 1165 11BC;C131;1109 1165 11BC;
+C132;C132;1109 1165 11BD;C132;1109 1165 11BD;
+C133;C133;1109 1165 11BE;C133;1109 1165 11BE;
+C134;C134;1109 1165 11BF;C134;1109 1165 11BF;
+C135;C135;1109 1165 11C0;C135;1109 1165 11C0;
+C136;C136;1109 1165 11C1;C136;1109 1165 11C1;
+C137;C137;1109 1165 11C2;C137;1109 1165 11C2;
+C138;C138;1109 1166;C138;1109 1166;
+C139;C139;1109 1166 11A8;C139;1109 1166 11A8;
+C13A;C13A;1109 1166 11A9;C13A;1109 1166 11A9;
+C13B;C13B;1109 1166 11AA;C13B;1109 1166 11AA;
+C13C;C13C;1109 1166 11AB;C13C;1109 1166 11AB;
+C13D;C13D;1109 1166 11AC;C13D;1109 1166 11AC;
+C13E;C13E;1109 1166 11AD;C13E;1109 1166 11AD;
+C13F;C13F;1109 1166 11AE;C13F;1109 1166 11AE;
+C140;C140;1109 1166 11AF;C140;1109 1166 11AF;
+C141;C141;1109 1166 11B0;C141;1109 1166 11B0;
+C142;C142;1109 1166 11B1;C142;1109 1166 11B1;
+C143;C143;1109 1166 11B2;C143;1109 1166 11B2;
+C144;C144;1109 1166 11B3;C144;1109 1166 11B3;
+C145;C145;1109 1166 11B4;C145;1109 1166 11B4;
+C146;C146;1109 1166 11B5;C146;1109 1166 11B5;
+C147;C147;1109 1166 11B6;C147;1109 1166 11B6;
+C148;C148;1109 1166 11B7;C148;1109 1166 11B7;
+C149;C149;1109 1166 11B8;C149;1109 1166 11B8;
+C14A;C14A;1109 1166 11B9;C14A;1109 1166 11B9;
+C14B;C14B;1109 1166 11BA;C14B;1109 1166 11BA;
+C14C;C14C;1109 1166 11BB;C14C;1109 1166 11BB;
+C14D;C14D;1109 1166 11BC;C14D;1109 1166 11BC;
+C14E;C14E;1109 1166 11BD;C14E;1109 1166 11BD;
+C14F;C14F;1109 1166 11BE;C14F;1109 1166 11BE;
+C150;C150;1109 1166 11BF;C150;1109 1166 11BF;
+C151;C151;1109 1166 11C0;C151;1109 1166 11C0;
+C152;C152;1109 1166 11C1;C152;1109 1166 11C1;
+C153;C153;1109 1166 11C2;C153;1109 1166 11C2;
+C154;C154;1109 1167;C154;1109 1167;
+C155;C155;1109 1167 11A8;C155;1109 1167 11A8;
+C156;C156;1109 1167 11A9;C156;1109 1167 11A9;
+C157;C157;1109 1167 11AA;C157;1109 1167 11AA;
+C158;C158;1109 1167 11AB;C158;1109 1167 11AB;
+C159;C159;1109 1167 11AC;C159;1109 1167 11AC;
+C15A;C15A;1109 1167 11AD;C15A;1109 1167 11AD;
+C15B;C15B;1109 1167 11AE;C15B;1109 1167 11AE;
+C15C;C15C;1109 1167 11AF;C15C;1109 1167 11AF;
+C15D;C15D;1109 1167 11B0;C15D;1109 1167 11B0;
+C15E;C15E;1109 1167 11B1;C15E;1109 1167 11B1;
+C15F;C15F;1109 1167 11B2;C15F;1109 1167 11B2;
+C160;C160;1109 1167 11B3;C160;1109 1167 11B3;
+C161;C161;1109 1167 11B4;C161;1109 1167 11B4;
+C162;C162;1109 1167 11B5;C162;1109 1167 11B5;
+C163;C163;1109 1167 11B6;C163;1109 1167 11B6;
+C164;C164;1109 1167 11B7;C164;1109 1167 11B7;
+C165;C165;1109 1167 11B8;C165;1109 1167 11B8;
+C166;C166;1109 1167 11B9;C166;1109 1167 11B9;
+C167;C167;1109 1167 11BA;C167;1109 1167 11BA;
+C168;C168;1109 1167 11BB;C168;1109 1167 11BB;
+C169;C169;1109 1167 11BC;C169;1109 1167 11BC;
+C16A;C16A;1109 1167 11BD;C16A;1109 1167 11BD;
+C16B;C16B;1109 1167 11BE;C16B;1109 1167 11BE;
+C16C;C16C;1109 1167 11BF;C16C;1109 1167 11BF;
+C16D;C16D;1109 1167 11C0;C16D;1109 1167 11C0;
+C16E;C16E;1109 1167 11C1;C16E;1109 1167 11C1;
+C16F;C16F;1109 1167 11C2;C16F;1109 1167 11C2;
+C170;C170;1109 1168;C170;1109 1168;
+C171;C171;1109 1168 11A8;C171;1109 1168 11A8;
+C172;C172;1109 1168 11A9;C172;1109 1168 11A9;
+C173;C173;1109 1168 11AA;C173;1109 1168 11AA;
+C174;C174;1109 1168 11AB;C174;1109 1168 11AB;
+C175;C175;1109 1168 11AC;C175;1109 1168 11AC;
+C176;C176;1109 1168 11AD;C176;1109 1168 11AD;
+C177;C177;1109 1168 11AE;C177;1109 1168 11AE;
+C178;C178;1109 1168 11AF;C178;1109 1168 11AF;
+C179;C179;1109 1168 11B0;C179;1109 1168 11B0;
+C17A;C17A;1109 1168 11B1;C17A;1109 1168 11B1;
+C17B;C17B;1109 1168 11B2;C17B;1109 1168 11B2;
+C17C;C17C;1109 1168 11B3;C17C;1109 1168 11B3;
+C17D;C17D;1109 1168 11B4;C17D;1109 1168 11B4;
+C17E;C17E;1109 1168 11B5;C17E;1109 1168 11B5;
+C17F;C17F;1109 1168 11B6;C17F;1109 1168 11B6;
+C180;C180;1109 1168 11B7;C180;1109 1168 11B7;
+C181;C181;1109 1168 11B8;C181;1109 1168 11B8;
+C182;C182;1109 1168 11B9;C182;1109 1168 11B9;
+C183;C183;1109 1168 11BA;C183;1109 1168 11BA;
+C184;C184;1109 1168 11BB;C184;1109 1168 11BB;
+C185;C185;1109 1168 11BC;C185;1109 1168 11BC;
+C186;C186;1109 1168 11BD;C186;1109 1168 11BD;
+C187;C187;1109 1168 11BE;C187;1109 1168 11BE;
+C188;C188;1109 1168 11BF;C188;1109 1168 11BF;
+C189;C189;1109 1168 11C0;C189;1109 1168 11C0;
+C18A;C18A;1109 1168 11C1;C18A;1109 1168 11C1;
+C18B;C18B;1109 1168 11C2;C18B;1109 1168 11C2;
+C18C;C18C;1109 1169;C18C;1109 1169;
+C18D;C18D;1109 1169 11A8;C18D;1109 1169 11A8;
+C18E;C18E;1109 1169 11A9;C18E;1109 1169 11A9;
+C18F;C18F;1109 1169 11AA;C18F;1109 1169 11AA;
+C190;C190;1109 1169 11AB;C190;1109 1169 11AB;
+C191;C191;1109 1169 11AC;C191;1109 1169 11AC;
+C192;C192;1109 1169 11AD;C192;1109 1169 11AD;
+C193;C193;1109 1169 11AE;C193;1109 1169 11AE;
+C194;C194;1109 1169 11AF;C194;1109 1169 11AF;
+C195;C195;1109 1169 11B0;C195;1109 1169 11B0;
+C196;C196;1109 1169 11B1;C196;1109 1169 11B1;
+C197;C197;1109 1169 11B2;C197;1109 1169 11B2;
+C198;C198;1109 1169 11B3;C198;1109 1169 11B3;
+C199;C199;1109 1169 11B4;C199;1109 1169 11B4;
+C19A;C19A;1109 1169 11B5;C19A;1109 1169 11B5;
+C19B;C19B;1109 1169 11B6;C19B;1109 1169 11B6;
+C19C;C19C;1109 1169 11B7;C19C;1109 1169 11B7;
+C19D;C19D;1109 1169 11B8;C19D;1109 1169 11B8;
+C19E;C19E;1109 1169 11B9;C19E;1109 1169 11B9;
+C19F;C19F;1109 1169 11BA;C19F;1109 1169 11BA;
+C1A0;C1A0;1109 1169 11BB;C1A0;1109 1169 11BB;
+C1A1;C1A1;1109 1169 11BC;C1A1;1109 1169 11BC;
+C1A2;C1A2;1109 1169 11BD;C1A2;1109 1169 11BD;
+C1A3;C1A3;1109 1169 11BE;C1A3;1109 1169 11BE;
+C1A4;C1A4;1109 1169 11BF;C1A4;1109 1169 11BF;
+C1A5;C1A5;1109 1169 11C0;C1A5;1109 1169 11C0;
+C1A6;C1A6;1109 1169 11C1;C1A6;1109 1169 11C1;
+C1A7;C1A7;1109 1169 11C2;C1A7;1109 1169 11C2;
+C1A8;C1A8;1109 116A;C1A8;1109 116A;
+C1A9;C1A9;1109 116A 11A8;C1A9;1109 116A 11A8;
+C1AA;C1AA;1109 116A 11A9;C1AA;1109 116A 11A9;
+C1AB;C1AB;1109 116A 11AA;C1AB;1109 116A 11AA;
+C1AC;C1AC;1109 116A 11AB;C1AC;1109 116A 11AB;
+C1AD;C1AD;1109 116A 11AC;C1AD;1109 116A 11AC;
+C1AE;C1AE;1109 116A 11AD;C1AE;1109 116A 11AD;
+C1AF;C1AF;1109 116A 11AE;C1AF;1109 116A 11AE;
+C1B0;C1B0;1109 116A 11AF;C1B0;1109 116A 11AF;
+C1B1;C1B1;1109 116A 11B0;C1B1;1109 116A 11B0;
+C1B2;C1B2;1109 116A 11B1;C1B2;1109 116A 11B1;
+C1B3;C1B3;1109 116A 11B2;C1B3;1109 116A 11B2;
+C1B4;C1B4;1109 116A 11B3;C1B4;1109 116A 11B3;
+C1B5;C1B5;1109 116A 11B4;C1B5;1109 116A 11B4;
+C1B6;C1B6;1109 116A 11B5;C1B6;1109 116A 11B5;
+C1B7;C1B7;1109 116A 11B6;C1B7;1109 116A 11B6;
+C1B8;C1B8;1109 116A 11B7;C1B8;1109 116A 11B7;
+C1B9;C1B9;1109 116A 11B8;C1B9;1109 116A 11B8;
+C1BA;C1BA;1109 116A 11B9;C1BA;1109 116A 11B9;
+C1BB;C1BB;1109 116A 11BA;C1BB;1109 116A 11BA;
+C1BC;C1BC;1109 116A 11BB;C1BC;1109 116A 11BB;
+C1BD;C1BD;1109 116A 11BC;C1BD;1109 116A 11BC;
+C1BE;C1BE;1109 116A 11BD;C1BE;1109 116A 11BD;
+C1BF;C1BF;1109 116A 11BE;C1BF;1109 116A 11BE;
+C1C0;C1C0;1109 116A 11BF;C1C0;1109 116A 11BF;
+C1C1;C1C1;1109 116A 11C0;C1C1;1109 116A 11C0;
+C1C2;C1C2;1109 116A 11C1;C1C2;1109 116A 11C1;
+C1C3;C1C3;1109 116A 11C2;C1C3;1109 116A 11C2;
+C1C4;C1C4;1109 116B;C1C4;1109 116B;
+C1C5;C1C5;1109 116B 11A8;C1C5;1109 116B 11A8;
+C1C6;C1C6;1109 116B 11A9;C1C6;1109 116B 11A9;
+C1C7;C1C7;1109 116B 11AA;C1C7;1109 116B 11AA;
+C1C8;C1C8;1109 116B 11AB;C1C8;1109 116B 11AB;
+C1C9;C1C9;1109 116B 11AC;C1C9;1109 116B 11AC;
+C1CA;C1CA;1109 116B 11AD;C1CA;1109 116B 11AD;
+C1CB;C1CB;1109 116B 11AE;C1CB;1109 116B 11AE;
+C1CC;C1CC;1109 116B 11AF;C1CC;1109 116B 11AF;
+C1CD;C1CD;1109 116B 11B0;C1CD;1109 116B 11B0;
+C1CE;C1CE;1109 116B 11B1;C1CE;1109 116B 11B1;
+C1CF;C1CF;1109 116B 11B2;C1CF;1109 116B 11B2;
+C1D0;C1D0;1109 116B 11B3;C1D0;1109 116B 11B3;
+C1D1;C1D1;1109 116B 11B4;C1D1;1109 116B 11B4;
+C1D2;C1D2;1109 116B 11B5;C1D2;1109 116B 11B5;
+C1D3;C1D3;1109 116B 11B6;C1D3;1109 116B 11B6;
+C1D4;C1D4;1109 116B 11B7;C1D4;1109 116B 11B7;
+C1D5;C1D5;1109 116B 11B8;C1D5;1109 116B 11B8;
+C1D6;C1D6;1109 116B 11B9;C1D6;1109 116B 11B9;
+C1D7;C1D7;1109 116B 11BA;C1D7;1109 116B 11BA;
+C1D8;C1D8;1109 116B 11BB;C1D8;1109 116B 11BB;
+C1D9;C1D9;1109 116B 11BC;C1D9;1109 116B 11BC;
+C1DA;C1DA;1109 116B 11BD;C1DA;1109 116B 11BD;
+C1DB;C1DB;1109 116B 11BE;C1DB;1109 116B 11BE;
+C1DC;C1DC;1109 116B 11BF;C1DC;1109 116B 11BF;
+C1DD;C1DD;1109 116B 11C0;C1DD;1109 116B 11C0;
+C1DE;C1DE;1109 116B 11C1;C1DE;1109 116B 11C1;
+C1DF;C1DF;1109 116B 11C2;C1DF;1109 116B 11C2;
+C1E0;C1E0;1109 116C;C1E0;1109 116C;
+C1E1;C1E1;1109 116C 11A8;C1E1;1109 116C 11A8;
+C1E2;C1E2;1109 116C 11A9;C1E2;1109 116C 11A9;
+C1E3;C1E3;1109 116C 11AA;C1E3;1109 116C 11AA;
+C1E4;C1E4;1109 116C 11AB;C1E4;1109 116C 11AB;
+C1E5;C1E5;1109 116C 11AC;C1E5;1109 116C 11AC;
+C1E6;C1E6;1109 116C 11AD;C1E6;1109 116C 11AD;
+C1E7;C1E7;1109 116C 11AE;C1E7;1109 116C 11AE;
+C1E8;C1E8;1109 116C 11AF;C1E8;1109 116C 11AF;
+C1E9;C1E9;1109 116C 11B0;C1E9;1109 116C 11B0;
+C1EA;C1EA;1109 116C 11B1;C1EA;1109 116C 11B1;
+C1EB;C1EB;1109 116C 11B2;C1EB;1109 116C 11B2;
+C1EC;C1EC;1109 116C 11B3;C1EC;1109 116C 11B3;
+C1ED;C1ED;1109 116C 11B4;C1ED;1109 116C 11B4;
+C1EE;C1EE;1109 116C 11B5;C1EE;1109 116C 11B5;
+C1EF;C1EF;1109 116C 11B6;C1EF;1109 116C 11B6;
+C1F0;C1F0;1109 116C 11B7;C1F0;1109 116C 11B7;
+C1F1;C1F1;1109 116C 11B8;C1F1;1109 116C 11B8;
+C1F2;C1F2;1109 116C 11B9;C1F2;1109 116C 11B9;
+C1F3;C1F3;1109 116C 11BA;C1F3;1109 116C 11BA;
+C1F4;C1F4;1109 116C 11BB;C1F4;1109 116C 11BB;
+C1F5;C1F5;1109 116C 11BC;C1F5;1109 116C 11BC;
+C1F6;C1F6;1109 116C 11BD;C1F6;1109 116C 11BD;
+C1F7;C1F7;1109 116C 11BE;C1F7;1109 116C 11BE;
+C1F8;C1F8;1109 116C 11BF;C1F8;1109 116C 11BF;
+C1F9;C1F9;1109 116C 11C0;C1F9;1109 116C 11C0;
+C1FA;C1FA;1109 116C 11C1;C1FA;1109 116C 11C1;
+C1FB;C1FB;1109 116C 11C2;C1FB;1109 116C 11C2;
+C1FC;C1FC;1109 116D;C1FC;1109 116D;
+C1FD;C1FD;1109 116D 11A8;C1FD;1109 116D 11A8;
+C1FE;C1FE;1109 116D 11A9;C1FE;1109 116D 11A9;
+C1FF;C1FF;1109 116D 11AA;C1FF;1109 116D 11AA;
+C200;C200;1109 116D 11AB;C200;1109 116D 11AB;
+C201;C201;1109 116D 11AC;C201;1109 116D 11AC;
+C202;C202;1109 116D 11AD;C202;1109 116D 11AD;
+C203;C203;1109 116D 11AE;C203;1109 116D 11AE;
+C204;C204;1109 116D 11AF;C204;1109 116D 11AF;
+C205;C205;1109 116D 11B0;C205;1109 116D 11B0;
+C206;C206;1109 116D 11B1;C206;1109 116D 11B1;
+C207;C207;1109 116D 11B2;C207;1109 116D 11B2;
+C208;C208;1109 116D 11B3;C208;1109 116D 11B3;
+C209;C209;1109 116D 11B4;C209;1109 116D 11B4;
+C20A;C20A;1109 116D 11B5;C20A;1109 116D 11B5;
+C20B;C20B;1109 116D 11B6;C20B;1109 116D 11B6;
+C20C;C20C;1109 116D 11B7;C20C;1109 116D 11B7;
+C20D;C20D;1109 116D 11B8;C20D;1109 116D 11B8;
+C20E;C20E;1109 116D 11B9;C20E;1109 116D 11B9;
+C20F;C20F;1109 116D 11BA;C20F;1109 116D 11BA;
+C210;C210;1109 116D 11BB;C210;1109 116D 11BB;
+C211;C211;1109 116D 11BC;C211;1109 116D 11BC;
+C212;C212;1109 116D 11BD;C212;1109 116D 11BD;
+C213;C213;1109 116D 11BE;C213;1109 116D 11BE;
+C214;C214;1109 116D 11BF;C214;1109 116D 11BF;
+C215;C215;1109 116D 11C0;C215;1109 116D 11C0;
+C216;C216;1109 116D 11C1;C216;1109 116D 11C1;
+C217;C217;1109 116D 11C2;C217;1109 116D 11C2;
+C218;C218;1109 116E;C218;1109 116E;
+C219;C219;1109 116E 11A8;C219;1109 116E 11A8;
+C21A;C21A;1109 116E 11A9;C21A;1109 116E 11A9;
+C21B;C21B;1109 116E 11AA;C21B;1109 116E 11AA;
+C21C;C21C;1109 116E 11AB;C21C;1109 116E 11AB;
+C21D;C21D;1109 116E 11AC;C21D;1109 116E 11AC;
+C21E;C21E;1109 116E 11AD;C21E;1109 116E 11AD;
+C21F;C21F;1109 116E 11AE;C21F;1109 116E 11AE;
+C220;C220;1109 116E 11AF;C220;1109 116E 11AF;
+C221;C221;1109 116E 11B0;C221;1109 116E 11B0;
+C222;C222;1109 116E 11B1;C222;1109 116E 11B1;
+C223;C223;1109 116E 11B2;C223;1109 116E 11B2;
+C224;C224;1109 116E 11B3;C224;1109 116E 11B3;
+C225;C225;1109 116E 11B4;C225;1109 116E 11B4;
+C226;C226;1109 116E 11B5;C226;1109 116E 11B5;
+C227;C227;1109 116E 11B6;C227;1109 116E 11B6;
+C228;C228;1109 116E 11B7;C228;1109 116E 11B7;
+C229;C229;1109 116E 11B8;C229;1109 116E 11B8;
+C22A;C22A;1109 116E 11B9;C22A;1109 116E 11B9;
+C22B;C22B;1109 116E 11BA;C22B;1109 116E 11BA;
+C22C;C22C;1109 116E 11BB;C22C;1109 116E 11BB;
+C22D;C22D;1109 116E 11BC;C22D;1109 116E 11BC;
+C22E;C22E;1109 116E 11BD;C22E;1109 116E 11BD;
+C22F;C22F;1109 116E 11BE;C22F;1109 116E 11BE;
+C230;C230;1109 116E 11BF;C230;1109 116E 11BF;
+C231;C231;1109 116E 11C0;C231;1109 116E 11C0;
+C232;C232;1109 116E 11C1;C232;1109 116E 11C1;
+C233;C233;1109 116E 11C2;C233;1109 116E 11C2;
+C234;C234;1109 116F;C234;1109 116F;
+C235;C235;1109 116F 11A8;C235;1109 116F 11A8;
+C236;C236;1109 116F 11A9;C236;1109 116F 11A9;
+C237;C237;1109 116F 11AA;C237;1109 116F 11AA;
+C238;C238;1109 116F 11AB;C238;1109 116F 11AB;
+C239;C239;1109 116F 11AC;C239;1109 116F 11AC;
+C23A;C23A;1109 116F 11AD;C23A;1109 116F 11AD;
+C23B;C23B;1109 116F 11AE;C23B;1109 116F 11AE;
+C23C;C23C;1109 116F 11AF;C23C;1109 116F 11AF;
+C23D;C23D;1109 116F 11B0;C23D;1109 116F 11B0;
+C23E;C23E;1109 116F 11B1;C23E;1109 116F 11B1;
+C23F;C23F;1109 116F 11B2;C23F;1109 116F 11B2;
+C240;C240;1109 116F 11B3;C240;1109 116F 11B3;
+C241;C241;1109 116F 11B4;C241;1109 116F 11B4;
+C242;C242;1109 116F 11B5;C242;1109 116F 11B5;
+C243;C243;1109 116F 11B6;C243;1109 116F 11B6;
+C244;C244;1109 116F 11B7;C244;1109 116F 11B7;
+C245;C245;1109 116F 11B8;C245;1109 116F 11B8;
+C246;C246;1109 116F 11B9;C246;1109 116F 11B9;
+C247;C247;1109 116F 11BA;C247;1109 116F 11BA;
+C248;C248;1109 116F 11BB;C248;1109 116F 11BB;
+C249;C249;1109 116F 11BC;C249;1109 116F 11BC;
+C24A;C24A;1109 116F 11BD;C24A;1109 116F 11BD;
+C24B;C24B;1109 116F 11BE;C24B;1109 116F 11BE;
+C24C;C24C;1109 116F 11BF;C24C;1109 116F 11BF;
+C24D;C24D;1109 116F 11C0;C24D;1109 116F 11C0;
+C24E;C24E;1109 116F 11C1;C24E;1109 116F 11C1;
+C24F;C24F;1109 116F 11C2;C24F;1109 116F 11C2;
+C250;C250;1109 1170;C250;1109 1170;
+C251;C251;1109 1170 11A8;C251;1109 1170 11A8;
+C252;C252;1109 1170 11A9;C252;1109 1170 11A9;
+C253;C253;1109 1170 11AA;C253;1109 1170 11AA;
+C254;C254;1109 1170 11AB;C254;1109 1170 11AB;
+C255;C255;1109 1170 11AC;C255;1109 1170 11AC;
+C256;C256;1109 1170 11AD;C256;1109 1170 11AD;
+C257;C257;1109 1170 11AE;C257;1109 1170 11AE;
+C258;C258;1109 1170 11AF;C258;1109 1170 11AF;
+C259;C259;1109 1170 11B0;C259;1109 1170 11B0;
+C25A;C25A;1109 1170 11B1;C25A;1109 1170 11B1;
+C25B;C25B;1109 1170 11B2;C25B;1109 1170 11B2;
+C25C;C25C;1109 1170 11B3;C25C;1109 1170 11B3;
+C25D;C25D;1109 1170 11B4;C25D;1109 1170 11B4;
+C25E;C25E;1109 1170 11B5;C25E;1109 1170 11B5;
+C25F;C25F;1109 1170 11B6;C25F;1109 1170 11B6;
+C260;C260;1109 1170 11B7;C260;1109 1170 11B7;
+C261;C261;1109 1170 11B8;C261;1109 1170 11B8;
+C262;C262;1109 1170 11B9;C262;1109 1170 11B9;
+C263;C263;1109 1170 11BA;C263;1109 1170 11BA;
+C264;C264;1109 1170 11BB;C264;1109 1170 11BB;
+C265;C265;1109 1170 11BC;C265;1109 1170 11BC;
+C266;C266;1109 1170 11BD;C266;1109 1170 11BD;
+C267;C267;1109 1170 11BE;C267;1109 1170 11BE;
+C268;C268;1109 1170 11BF;C268;1109 1170 11BF;
+C269;C269;1109 1170 11C0;C269;1109 1170 11C0;
+C26A;C26A;1109 1170 11C1;C26A;1109 1170 11C1;
+C26B;C26B;1109 1170 11C2;C26B;1109 1170 11C2;
+C26C;C26C;1109 1171;C26C;1109 1171;
+C26D;C26D;1109 1171 11A8;C26D;1109 1171 11A8;
+C26E;C26E;1109 1171 11A9;C26E;1109 1171 11A9;
+C26F;C26F;1109 1171 11AA;C26F;1109 1171 11AA;
+C270;C270;1109 1171 11AB;C270;1109 1171 11AB;
+C271;C271;1109 1171 11AC;C271;1109 1171 11AC;
+C272;C272;1109 1171 11AD;C272;1109 1171 11AD;
+C273;C273;1109 1171 11AE;C273;1109 1171 11AE;
+C274;C274;1109 1171 11AF;C274;1109 1171 11AF;
+C275;C275;1109 1171 11B0;C275;1109 1171 11B0;
+C276;C276;1109 1171 11B1;C276;1109 1171 11B1;
+C277;C277;1109 1171 11B2;C277;1109 1171 11B2;
+C278;C278;1109 1171 11B3;C278;1109 1171 11B3;
+C279;C279;1109 1171 11B4;C279;1109 1171 11B4;
+C27A;C27A;1109 1171 11B5;C27A;1109 1171 11B5;
+C27B;C27B;1109 1171 11B6;C27B;1109 1171 11B6;
+C27C;C27C;1109 1171 11B7;C27C;1109 1171 11B7;
+C27D;C27D;1109 1171 11B8;C27D;1109 1171 11B8;
+C27E;C27E;1109 1171 11B9;C27E;1109 1171 11B9;
+C27F;C27F;1109 1171 11BA;C27F;1109 1171 11BA;
+C280;C280;1109 1171 11BB;C280;1109 1171 11BB;
+C281;C281;1109 1171 11BC;C281;1109 1171 11BC;
+C282;C282;1109 1171 11BD;C282;1109 1171 11BD;
+C283;C283;1109 1171 11BE;C283;1109 1171 11BE;
+C284;C284;1109 1171 11BF;C284;1109 1171 11BF;
+C285;C285;1109 1171 11C0;C285;1109 1171 11C0;
+C286;C286;1109 1171 11C1;C286;1109 1171 11C1;
+C287;C287;1109 1171 11C2;C287;1109 1171 11C2;
+C288;C288;1109 1172;C288;1109 1172;
+C289;C289;1109 1172 11A8;C289;1109 1172 11A8;
+C28A;C28A;1109 1172 11A9;C28A;1109 1172 11A9;
+C28B;C28B;1109 1172 11AA;C28B;1109 1172 11AA;
+C28C;C28C;1109 1172 11AB;C28C;1109 1172 11AB;
+C28D;C28D;1109 1172 11AC;C28D;1109 1172 11AC;
+C28E;C28E;1109 1172 11AD;C28E;1109 1172 11AD;
+C28F;C28F;1109 1172 11AE;C28F;1109 1172 11AE;
+C290;C290;1109 1172 11AF;C290;1109 1172 11AF;
+C291;C291;1109 1172 11B0;C291;1109 1172 11B0;
+C292;C292;1109 1172 11B1;C292;1109 1172 11B1;
+C293;C293;1109 1172 11B2;C293;1109 1172 11B2;
+C294;C294;1109 1172 11B3;C294;1109 1172 11B3;
+C295;C295;1109 1172 11B4;C295;1109 1172 11B4;
+C296;C296;1109 1172 11B5;C296;1109 1172 11B5;
+C297;C297;1109 1172 11B6;C297;1109 1172 11B6;
+C298;C298;1109 1172 11B7;C298;1109 1172 11B7;
+C299;C299;1109 1172 11B8;C299;1109 1172 11B8;
+C29A;C29A;1109 1172 11B9;C29A;1109 1172 11B9;
+C29B;C29B;1109 1172 11BA;C29B;1109 1172 11BA;
+C29C;C29C;1109 1172 11BB;C29C;1109 1172 11BB;
+C29D;C29D;1109 1172 11BC;C29D;1109 1172 11BC;
+C29E;C29E;1109 1172 11BD;C29E;1109 1172 11BD;
+C29F;C29F;1109 1172 11BE;C29F;1109 1172 11BE;
+C2A0;C2A0;1109 1172 11BF;C2A0;1109 1172 11BF;
+C2A1;C2A1;1109 1172 11C0;C2A1;1109 1172 11C0;
+C2A2;C2A2;1109 1172 11C1;C2A2;1109 1172 11C1;
+C2A3;C2A3;1109 1172 11C2;C2A3;1109 1172 11C2;
+C2A4;C2A4;1109 1173;C2A4;1109 1173;
+C2A5;C2A5;1109 1173 11A8;C2A5;1109 1173 11A8;
+C2A6;C2A6;1109 1173 11A9;C2A6;1109 1173 11A9;
+C2A7;C2A7;1109 1173 11AA;C2A7;1109 1173 11AA;
+C2A8;C2A8;1109 1173 11AB;C2A8;1109 1173 11AB;
+C2A9;C2A9;1109 1173 11AC;C2A9;1109 1173 11AC;
+C2AA;C2AA;1109 1173 11AD;C2AA;1109 1173 11AD;
+C2AB;C2AB;1109 1173 11AE;C2AB;1109 1173 11AE;
+C2AC;C2AC;1109 1173 11AF;C2AC;1109 1173 11AF;
+C2AD;C2AD;1109 1173 11B0;C2AD;1109 1173 11B0;
+C2AE;C2AE;1109 1173 11B1;C2AE;1109 1173 11B1;
+C2AF;C2AF;1109 1173 11B2;C2AF;1109 1173 11B2;
+C2B0;C2B0;1109 1173 11B3;C2B0;1109 1173 11B3;
+C2B1;C2B1;1109 1173 11B4;C2B1;1109 1173 11B4;
+C2B2;C2B2;1109 1173 11B5;C2B2;1109 1173 11B5;
+C2B3;C2B3;1109 1173 11B6;C2B3;1109 1173 11B6;
+C2B4;C2B4;1109 1173 11B7;C2B4;1109 1173 11B7;
+C2B5;C2B5;1109 1173 11B8;C2B5;1109 1173 11B8;
+C2B6;C2B6;1109 1173 11B9;C2B6;1109 1173 11B9;
+C2B7;C2B7;1109 1173 11BA;C2B7;1109 1173 11BA;
+C2B8;C2B8;1109 1173 11BB;C2B8;1109 1173 11BB;
+C2B9;C2B9;1109 1173 11BC;C2B9;1109 1173 11BC;
+C2BA;C2BA;1109 1173 11BD;C2BA;1109 1173 11BD;
+C2BB;C2BB;1109 1173 11BE;C2BB;1109 1173 11BE;
+C2BC;C2BC;1109 1173 11BF;C2BC;1109 1173 11BF;
+C2BD;C2BD;1109 1173 11C0;C2BD;1109 1173 11C0;
+C2BE;C2BE;1109 1173 11C1;C2BE;1109 1173 11C1;
+C2BF;C2BF;1109 1173 11C2;C2BF;1109 1173 11C2;
+C2C0;C2C0;1109 1174;C2C0;1109 1174;
+C2C1;C2C1;1109 1174 11A8;C2C1;1109 1174 11A8;
+C2C2;C2C2;1109 1174 11A9;C2C2;1109 1174 11A9;
+C2C3;C2C3;1109 1174 11AA;C2C3;1109 1174 11AA;
+C2C4;C2C4;1109 1174 11AB;C2C4;1109 1174 11AB;
+C2C5;C2C5;1109 1174 11AC;C2C5;1109 1174 11AC;
+C2C6;C2C6;1109 1174 11AD;C2C6;1109 1174 11AD;
+C2C7;C2C7;1109 1174 11AE;C2C7;1109 1174 11AE;
+C2C8;C2C8;1109 1174 11AF;C2C8;1109 1174 11AF;
+C2C9;C2C9;1109 1174 11B0;C2C9;1109 1174 11B0;
+C2CA;C2CA;1109 1174 11B1;C2CA;1109 1174 11B1;
+C2CB;C2CB;1109 1174 11B2;C2CB;1109 1174 11B2;
+C2CC;C2CC;1109 1174 11B3;C2CC;1109 1174 11B3;
+C2CD;C2CD;1109 1174 11B4;C2CD;1109 1174 11B4;
+C2CE;C2CE;1109 1174 11B5;C2CE;1109 1174 11B5;
+C2CF;C2CF;1109 1174 11B6;C2CF;1109 1174 11B6;
+C2D0;C2D0;1109 1174 11B7;C2D0;1109 1174 11B7;
+C2D1;C2D1;1109 1174 11B8;C2D1;1109 1174 11B8;
+C2D2;C2D2;1109 1174 11B9;C2D2;1109 1174 11B9;
+C2D3;C2D3;1109 1174 11BA;C2D3;1109 1174 11BA;
+C2D4;C2D4;1109 1174 11BB;C2D4;1109 1174 11BB;
+C2D5;C2D5;1109 1174 11BC;C2D5;1109 1174 11BC;
+C2D6;C2D6;1109 1174 11BD;C2D6;1109 1174 11BD;
+C2D7;C2D7;1109 1174 11BE;C2D7;1109 1174 11BE;
+C2D8;C2D8;1109 1174 11BF;C2D8;1109 1174 11BF;
+C2D9;C2D9;1109 1174 11C0;C2D9;1109 1174 11C0;
+C2DA;C2DA;1109 1174 11C1;C2DA;1109 1174 11C1;
+C2DB;C2DB;1109 1174 11C2;C2DB;1109 1174 11C2;
+C2DC;C2DC;1109 1175;C2DC;1109 1175;
+C2DD;C2DD;1109 1175 11A8;C2DD;1109 1175 11A8;
+C2DE;C2DE;1109 1175 11A9;C2DE;1109 1175 11A9;
+C2DF;C2DF;1109 1175 11AA;C2DF;1109 1175 11AA;
+C2E0;C2E0;1109 1175 11AB;C2E0;1109 1175 11AB;
+C2E1;C2E1;1109 1175 11AC;C2E1;1109 1175 11AC;
+C2E2;C2E2;1109 1175 11AD;C2E2;1109 1175 11AD;
+C2E3;C2E3;1109 1175 11AE;C2E3;1109 1175 11AE;
+C2E4;C2E4;1109 1175 11AF;C2E4;1109 1175 11AF;
+C2E5;C2E5;1109 1175 11B0;C2E5;1109 1175 11B0;
+C2E6;C2E6;1109 1175 11B1;C2E6;1109 1175 11B1;
+C2E7;C2E7;1109 1175 11B2;C2E7;1109 1175 11B2;
+C2E8;C2E8;1109 1175 11B3;C2E8;1109 1175 11B3;
+C2E9;C2E9;1109 1175 11B4;C2E9;1109 1175 11B4;
+C2EA;C2EA;1109 1175 11B5;C2EA;1109 1175 11B5;
+C2EB;C2EB;1109 1175 11B6;C2EB;1109 1175 11B6;
+C2EC;C2EC;1109 1175 11B7;C2EC;1109 1175 11B7;
+C2ED;C2ED;1109 1175 11B8;C2ED;1109 1175 11B8;
+C2EE;C2EE;1109 1175 11B9;C2EE;1109 1175 11B9;
+C2EF;C2EF;1109 1175 11BA;C2EF;1109 1175 11BA;
+C2F0;C2F0;1109 1175 11BB;C2F0;1109 1175 11BB;
+C2F1;C2F1;1109 1175 11BC;C2F1;1109 1175 11BC;
+C2F2;C2F2;1109 1175 11BD;C2F2;1109 1175 11BD;
+C2F3;C2F3;1109 1175 11BE;C2F3;1109 1175 11BE;
+C2F4;C2F4;1109 1175 11BF;C2F4;1109 1175 11BF;
+C2F5;C2F5;1109 1175 11C0;C2F5;1109 1175 11C0;
+C2F6;C2F6;1109 1175 11C1;C2F6;1109 1175 11C1;
+C2F7;C2F7;1109 1175 11C2;C2F7;1109 1175 11C2;
+C2F8;C2F8;110A 1161;C2F8;110A 1161;
+C2F9;C2F9;110A 1161 11A8;C2F9;110A 1161 11A8;
+C2FA;C2FA;110A 1161 11A9;C2FA;110A 1161 11A9;
+C2FB;C2FB;110A 1161 11AA;C2FB;110A 1161 11AA;
+C2FC;C2FC;110A 1161 11AB;C2FC;110A 1161 11AB;
+C2FD;C2FD;110A 1161 11AC;C2FD;110A 1161 11AC;
+C2FE;C2FE;110A 1161 11AD;C2FE;110A 1161 11AD;
+C2FF;C2FF;110A 1161 11AE;C2FF;110A 1161 11AE;
+C300;C300;110A 1161 11AF;C300;110A 1161 11AF;
+C301;C301;110A 1161 11B0;C301;110A 1161 11B0;
+C302;C302;110A 1161 11B1;C302;110A 1161 11B1;
+C303;C303;110A 1161 11B2;C303;110A 1161 11B2;
+C304;C304;110A 1161 11B3;C304;110A 1161 11B3;
+C305;C305;110A 1161 11B4;C305;110A 1161 11B4;
+C306;C306;110A 1161 11B5;C306;110A 1161 11B5;
+C307;C307;110A 1161 11B6;C307;110A 1161 11B6;
+C308;C308;110A 1161 11B7;C308;110A 1161 11B7;
+C309;C309;110A 1161 11B8;C309;110A 1161 11B8;
+C30A;C30A;110A 1161 11B9;C30A;110A 1161 11B9;
+C30B;C30B;110A 1161 11BA;C30B;110A 1161 11BA;
+C30C;C30C;110A 1161 11BB;C30C;110A 1161 11BB;
+C30D;C30D;110A 1161 11BC;C30D;110A 1161 11BC;
+C30E;C30E;110A 1161 11BD;C30E;110A 1161 11BD;
+C30F;C30F;110A 1161 11BE;C30F;110A 1161 11BE;
+C310;C310;110A 1161 11BF;C310;110A 1161 11BF;
+C311;C311;110A 1161 11C0;C311;110A 1161 11C0;
+C312;C312;110A 1161 11C1;C312;110A 1161 11C1;
+C313;C313;110A 1161 11C2;C313;110A 1161 11C2;
+C314;C314;110A 1162;C314;110A 1162;
+C315;C315;110A 1162 11A8;C315;110A 1162 11A8;
+C316;C316;110A 1162 11A9;C316;110A 1162 11A9;
+C317;C317;110A 1162 11AA;C317;110A 1162 11AA;
+C318;C318;110A 1162 11AB;C318;110A 1162 11AB;
+C319;C319;110A 1162 11AC;C319;110A 1162 11AC;
+C31A;C31A;110A 1162 11AD;C31A;110A 1162 11AD;
+C31B;C31B;110A 1162 11AE;C31B;110A 1162 11AE;
+C31C;C31C;110A 1162 11AF;C31C;110A 1162 11AF;
+C31D;C31D;110A 1162 11B0;C31D;110A 1162 11B0;
+C31E;C31E;110A 1162 11B1;C31E;110A 1162 11B1;
+C31F;C31F;110A 1162 11B2;C31F;110A 1162 11B2;
+C320;C320;110A 1162 11B3;C320;110A 1162 11B3;
+C321;C321;110A 1162 11B4;C321;110A 1162 11B4;
+C322;C322;110A 1162 11B5;C322;110A 1162 11B5;
+C323;C323;110A 1162 11B6;C323;110A 1162 11B6;
+C324;C324;110A 1162 11B7;C324;110A 1162 11B7;
+C325;C325;110A 1162 11B8;C325;110A 1162 11B8;
+C326;C326;110A 1162 11B9;C326;110A 1162 11B9;
+C327;C327;110A 1162 11BA;C327;110A 1162 11BA;
+C328;C328;110A 1162 11BB;C328;110A 1162 11BB;
+C329;C329;110A 1162 11BC;C329;110A 1162 11BC;
+C32A;C32A;110A 1162 11BD;C32A;110A 1162 11BD;
+C32B;C32B;110A 1162 11BE;C32B;110A 1162 11BE;
+C32C;C32C;110A 1162 11BF;C32C;110A 1162 11BF;
+C32D;C32D;110A 1162 11C0;C32D;110A 1162 11C0;
+C32E;C32E;110A 1162 11C1;C32E;110A 1162 11C1;
+C32F;C32F;110A 1162 11C2;C32F;110A 1162 11C2;
+C330;C330;110A 1163;C330;110A 1163;
+C331;C331;110A 1163 11A8;C331;110A 1163 11A8;
+C332;C332;110A 1163 11A9;C332;110A 1163 11A9;
+C333;C333;110A 1163 11AA;C333;110A 1163 11AA;
+C334;C334;110A 1163 11AB;C334;110A 1163 11AB;
+C335;C335;110A 1163 11AC;C335;110A 1163 11AC;
+C336;C336;110A 1163 11AD;C336;110A 1163 11AD;
+C337;C337;110A 1163 11AE;C337;110A 1163 11AE;
+C338;C338;110A 1163 11AF;C338;110A 1163 11AF;
+C339;C339;110A 1163 11B0;C339;110A 1163 11B0;
+C33A;C33A;110A 1163 11B1;C33A;110A 1163 11B1;
+C33B;C33B;110A 1163 11B2;C33B;110A 1163 11B2;
+C33C;C33C;110A 1163 11B3;C33C;110A 1163 11B3;
+C33D;C33D;110A 1163 11B4;C33D;110A 1163 11B4;
+C33E;C33E;110A 1163 11B5;C33E;110A 1163 11B5;
+C33F;C33F;110A 1163 11B6;C33F;110A 1163 11B6;
+C340;C340;110A 1163 11B7;C340;110A 1163 11B7;
+C341;C341;110A 1163 11B8;C341;110A 1163 11B8;
+C342;C342;110A 1163 11B9;C342;110A 1163 11B9;
+C343;C343;110A 1163 11BA;C343;110A 1163 11BA;
+C344;C344;110A 1163 11BB;C344;110A 1163 11BB;
+C345;C345;110A 1163 11BC;C345;110A 1163 11BC;
+C346;C346;110A 1163 11BD;C346;110A 1163 11BD;
+C347;C347;110A 1163 11BE;C347;110A 1163 11BE;
+C348;C348;110A 1163 11BF;C348;110A 1163 11BF;
+C349;C349;110A 1163 11C0;C349;110A 1163 11C0;
+C34A;C34A;110A 1163 11C1;C34A;110A 1163 11C1;
+C34B;C34B;110A 1163 11C2;C34B;110A 1163 11C2;
+C34C;C34C;110A 1164;C34C;110A 1164;
+C34D;C34D;110A 1164 11A8;C34D;110A 1164 11A8;
+C34E;C34E;110A 1164 11A9;C34E;110A 1164 11A9;
+C34F;C34F;110A 1164 11AA;C34F;110A 1164 11AA;
+C350;C350;110A 1164 11AB;C350;110A 1164 11AB;
+C351;C351;110A 1164 11AC;C351;110A 1164 11AC;
+C352;C352;110A 1164 11AD;C352;110A 1164 11AD;
+C353;C353;110A 1164 11AE;C353;110A 1164 11AE;
+C354;C354;110A 1164 11AF;C354;110A 1164 11AF;
+C355;C355;110A 1164 11B0;C355;110A 1164 11B0;
+C356;C356;110A 1164 11B1;C356;110A 1164 11B1;
+C357;C357;110A 1164 11B2;C357;110A 1164 11B2;
+C358;C358;110A 1164 11B3;C358;110A 1164 11B3;
+C359;C359;110A 1164 11B4;C359;110A 1164 11B4;
+C35A;C35A;110A 1164 11B5;C35A;110A 1164 11B5;
+C35B;C35B;110A 1164 11B6;C35B;110A 1164 11B6;
+C35C;C35C;110A 1164 11B7;C35C;110A 1164 11B7;
+C35D;C35D;110A 1164 11B8;C35D;110A 1164 11B8;
+C35E;C35E;110A 1164 11B9;C35E;110A 1164 11B9;
+C35F;C35F;110A 1164 11BA;C35F;110A 1164 11BA;
+C360;C360;110A 1164 11BB;C360;110A 1164 11BB;
+C361;C361;110A 1164 11BC;C361;110A 1164 11BC;
+C362;C362;110A 1164 11BD;C362;110A 1164 11BD;
+C363;C363;110A 1164 11BE;C363;110A 1164 11BE;
+C364;C364;110A 1164 11BF;C364;110A 1164 11BF;
+C365;C365;110A 1164 11C0;C365;110A 1164 11C0;
+C366;C366;110A 1164 11C1;C366;110A 1164 11C1;
+C367;C367;110A 1164 11C2;C367;110A 1164 11C2;
+C368;C368;110A 1165;C368;110A 1165;
+C369;C369;110A 1165 11A8;C369;110A 1165 11A8;
+C36A;C36A;110A 1165 11A9;C36A;110A 1165 11A9;
+C36B;C36B;110A 1165 11AA;C36B;110A 1165 11AA;
+C36C;C36C;110A 1165 11AB;C36C;110A 1165 11AB;
+C36D;C36D;110A 1165 11AC;C36D;110A 1165 11AC;
+C36E;C36E;110A 1165 11AD;C36E;110A 1165 11AD;
+C36F;C36F;110A 1165 11AE;C36F;110A 1165 11AE;
+C370;C370;110A 1165 11AF;C370;110A 1165 11AF;
+C371;C371;110A 1165 11B0;C371;110A 1165 11B0;
+C372;C372;110A 1165 11B1;C372;110A 1165 11B1;
+C373;C373;110A 1165 11B2;C373;110A 1165 11B2;
+C374;C374;110A 1165 11B3;C374;110A 1165 11B3;
+C375;C375;110A 1165 11B4;C375;110A 1165 11B4;
+C376;C376;110A 1165 11B5;C376;110A 1165 11B5;
+C377;C377;110A 1165 11B6;C377;110A 1165 11B6;
+C378;C378;110A 1165 11B7;C378;110A 1165 11B7;
+C379;C379;110A 1165 11B8;C379;110A 1165 11B8;
+C37A;C37A;110A 1165 11B9;C37A;110A 1165 11B9;
+C37B;C37B;110A 1165 11BA;C37B;110A 1165 11BA;
+C37C;C37C;110A 1165 11BB;C37C;110A 1165 11BB;
+C37D;C37D;110A 1165 11BC;C37D;110A 1165 11BC;
+C37E;C37E;110A 1165 11BD;C37E;110A 1165 11BD;
+C37F;C37F;110A 1165 11BE;C37F;110A 1165 11BE;
+C380;C380;110A 1165 11BF;C380;110A 1165 11BF;
+C381;C381;110A 1165 11C0;C381;110A 1165 11C0;
+C382;C382;110A 1165 11C1;C382;110A 1165 11C1;
+C383;C383;110A 1165 11C2;C383;110A 1165 11C2;
+C384;C384;110A 1166;C384;110A 1166;
+C385;C385;110A 1166 11A8;C385;110A 1166 11A8;
+C386;C386;110A 1166 11A9;C386;110A 1166 11A9;
+C387;C387;110A 1166 11AA;C387;110A 1166 11AA;
+C388;C388;110A 1166 11AB;C388;110A 1166 11AB;
+C389;C389;110A 1166 11AC;C389;110A 1166 11AC;
+C38A;C38A;110A 1166 11AD;C38A;110A 1166 11AD;
+C38B;C38B;110A 1166 11AE;C38B;110A 1166 11AE;
+C38C;C38C;110A 1166 11AF;C38C;110A 1166 11AF;
+C38D;C38D;110A 1166 11B0;C38D;110A 1166 11B0;
+C38E;C38E;110A 1166 11B1;C38E;110A 1166 11B1;
+C38F;C38F;110A 1166 11B2;C38F;110A 1166 11B2;
+C390;C390;110A 1166 11B3;C390;110A 1166 11B3;
+C391;C391;110A 1166 11B4;C391;110A 1166 11B4;
+C392;C392;110A 1166 11B5;C392;110A 1166 11B5;
+C393;C393;110A 1166 11B6;C393;110A 1166 11B6;
+C394;C394;110A 1166 11B7;C394;110A 1166 11B7;
+C395;C395;110A 1166 11B8;C395;110A 1166 11B8;
+C396;C396;110A 1166 11B9;C396;110A 1166 11B9;
+C397;C397;110A 1166 11BA;C397;110A 1166 11BA;
+C398;C398;110A 1166 11BB;C398;110A 1166 11BB;
+C399;C399;110A 1166 11BC;C399;110A 1166 11BC;
+C39A;C39A;110A 1166 11BD;C39A;110A 1166 11BD;
+C39B;C39B;110A 1166 11BE;C39B;110A 1166 11BE;
+C39C;C39C;110A 1166 11BF;C39C;110A 1166 11BF;
+C39D;C39D;110A 1166 11C0;C39D;110A 1166 11C0;
+C39E;C39E;110A 1166 11C1;C39E;110A 1166 11C1;
+C39F;C39F;110A 1166 11C2;C39F;110A 1166 11C2;
+C3A0;C3A0;110A 1167;C3A0;110A 1167;
+C3A1;C3A1;110A 1167 11A8;C3A1;110A 1167 11A8;
+C3A2;C3A2;110A 1167 11A9;C3A2;110A 1167 11A9;
+C3A3;C3A3;110A 1167 11AA;C3A3;110A 1167 11AA;
+C3A4;C3A4;110A 1167 11AB;C3A4;110A 1167 11AB;
+C3A5;C3A5;110A 1167 11AC;C3A5;110A 1167 11AC;
+C3A6;C3A6;110A 1167 11AD;C3A6;110A 1167 11AD;
+C3A7;C3A7;110A 1167 11AE;C3A7;110A 1167 11AE;
+C3A8;C3A8;110A 1167 11AF;C3A8;110A 1167 11AF;
+C3A9;C3A9;110A 1167 11B0;C3A9;110A 1167 11B0;
+C3AA;C3AA;110A 1167 11B1;C3AA;110A 1167 11B1;
+C3AB;C3AB;110A 1167 11B2;C3AB;110A 1167 11B2;
+C3AC;C3AC;110A 1167 11B3;C3AC;110A 1167 11B3;
+C3AD;C3AD;110A 1167 11B4;C3AD;110A 1167 11B4;
+C3AE;C3AE;110A 1167 11B5;C3AE;110A 1167 11B5;
+C3AF;C3AF;110A 1167 11B6;C3AF;110A 1167 11B6;
+C3B0;C3B0;110A 1167 11B7;C3B0;110A 1167 11B7;
+C3B1;C3B1;110A 1167 11B8;C3B1;110A 1167 11B8;
+C3B2;C3B2;110A 1167 11B9;C3B2;110A 1167 11B9;
+C3B3;C3B3;110A 1167 11BA;C3B3;110A 1167 11BA;
+C3B4;C3B4;110A 1167 11BB;C3B4;110A 1167 11BB;
+C3B5;C3B5;110A 1167 11BC;C3B5;110A 1167 11BC;
+C3B6;C3B6;110A 1167 11BD;C3B6;110A 1167 11BD;
+C3B7;C3B7;110A 1167 11BE;C3B7;110A 1167 11BE;
+C3B8;C3B8;110A 1167 11BF;C3B8;110A 1167 11BF;
+C3B9;C3B9;110A 1167 11C0;C3B9;110A 1167 11C0;
+C3BA;C3BA;110A 1167 11C1;C3BA;110A 1167 11C1;
+C3BB;C3BB;110A 1167 11C2;C3BB;110A 1167 11C2;
+C3BC;C3BC;110A 1168;C3BC;110A 1168;
+C3BD;C3BD;110A 1168 11A8;C3BD;110A 1168 11A8;
+C3BE;C3BE;110A 1168 11A9;C3BE;110A 1168 11A9;
+C3BF;C3BF;110A 1168 11AA;C3BF;110A 1168 11AA;
+C3C0;C3C0;110A 1168 11AB;C3C0;110A 1168 11AB;
+C3C1;C3C1;110A 1168 11AC;C3C1;110A 1168 11AC;
+C3C2;C3C2;110A 1168 11AD;C3C2;110A 1168 11AD;
+C3C3;C3C3;110A 1168 11AE;C3C3;110A 1168 11AE;
+C3C4;C3C4;110A 1168 11AF;C3C4;110A 1168 11AF;
+C3C5;C3C5;110A 1168 11B0;C3C5;110A 1168 11B0;
+C3C6;C3C6;110A 1168 11B1;C3C6;110A 1168 11B1;
+C3C7;C3C7;110A 1168 11B2;C3C7;110A 1168 11B2;
+C3C8;C3C8;110A 1168 11B3;C3C8;110A 1168 11B3;
+C3C9;C3C9;110A 1168 11B4;C3C9;110A 1168 11B4;
+C3CA;C3CA;110A 1168 11B5;C3CA;110A 1168 11B5;
+C3CB;C3CB;110A 1168 11B6;C3CB;110A 1168 11B6;
+C3CC;C3CC;110A 1168 11B7;C3CC;110A 1168 11B7;
+C3CD;C3CD;110A 1168 11B8;C3CD;110A 1168 11B8;
+C3CE;C3CE;110A 1168 11B9;C3CE;110A 1168 11B9;
+C3CF;C3CF;110A 1168 11BA;C3CF;110A 1168 11BA;
+C3D0;C3D0;110A 1168 11BB;C3D0;110A 1168 11BB;
+C3D1;C3D1;110A 1168 11BC;C3D1;110A 1168 11BC;
+C3D2;C3D2;110A 1168 11BD;C3D2;110A 1168 11BD;
+C3D3;C3D3;110A 1168 11BE;C3D3;110A 1168 11BE;
+C3D4;C3D4;110A 1168 11BF;C3D4;110A 1168 11BF;
+C3D5;C3D5;110A 1168 11C0;C3D5;110A 1168 11C0;
+C3D6;C3D6;110A 1168 11C1;C3D6;110A 1168 11C1;
+C3D7;C3D7;110A 1168 11C2;C3D7;110A 1168 11C2;
+C3D8;C3D8;110A 1169;C3D8;110A 1169;
+C3D9;C3D9;110A 1169 11A8;C3D9;110A 1169 11A8;
+C3DA;C3DA;110A 1169 11A9;C3DA;110A 1169 11A9;
+C3DB;C3DB;110A 1169 11AA;C3DB;110A 1169 11AA;
+C3DC;C3DC;110A 1169 11AB;C3DC;110A 1169 11AB;
+C3DD;C3DD;110A 1169 11AC;C3DD;110A 1169 11AC;
+C3DE;C3DE;110A 1169 11AD;C3DE;110A 1169 11AD;
+C3DF;C3DF;110A 1169 11AE;C3DF;110A 1169 11AE;
+C3E0;C3E0;110A 1169 11AF;C3E0;110A 1169 11AF;
+C3E1;C3E1;110A 1169 11B0;C3E1;110A 1169 11B0;
+C3E2;C3E2;110A 1169 11B1;C3E2;110A 1169 11B1;
+C3E3;C3E3;110A 1169 11B2;C3E3;110A 1169 11B2;
+C3E4;C3E4;110A 1169 11B3;C3E4;110A 1169 11B3;
+C3E5;C3E5;110A 1169 11B4;C3E5;110A 1169 11B4;
+C3E6;C3E6;110A 1169 11B5;C3E6;110A 1169 11B5;
+C3E7;C3E7;110A 1169 11B6;C3E7;110A 1169 11B6;
+C3E8;C3E8;110A 1169 11B7;C3E8;110A 1169 11B7;
+C3E9;C3E9;110A 1169 11B8;C3E9;110A 1169 11B8;
+C3EA;C3EA;110A 1169 11B9;C3EA;110A 1169 11B9;
+C3EB;C3EB;110A 1169 11BA;C3EB;110A 1169 11BA;
+C3EC;C3EC;110A 1169 11BB;C3EC;110A 1169 11BB;
+C3ED;C3ED;110A 1169 11BC;C3ED;110A 1169 11BC;
+C3EE;C3EE;110A 1169 11BD;C3EE;110A 1169 11BD;
+C3EF;C3EF;110A 1169 11BE;C3EF;110A 1169 11BE;
+C3F0;C3F0;110A 1169 11BF;C3F0;110A 1169 11BF;
+C3F1;C3F1;110A 1169 11C0;C3F1;110A 1169 11C0;
+C3F2;C3F2;110A 1169 11C1;C3F2;110A 1169 11C1;
+C3F3;C3F3;110A 1169 11C2;C3F3;110A 1169 11C2;
+C3F4;C3F4;110A 116A;C3F4;110A 116A;
+C3F5;C3F5;110A 116A 11A8;C3F5;110A 116A 11A8;
+C3F6;C3F6;110A 116A 11A9;C3F6;110A 116A 11A9;
+C3F7;C3F7;110A 116A 11AA;C3F7;110A 116A 11AA;
+C3F8;C3F8;110A 116A 11AB;C3F8;110A 116A 11AB;
+C3F9;C3F9;110A 116A 11AC;C3F9;110A 116A 11AC;
+C3FA;C3FA;110A 116A 11AD;C3FA;110A 116A 11AD;
+C3FB;C3FB;110A 116A 11AE;C3FB;110A 116A 11AE;
+C3FC;C3FC;110A 116A 11AF;C3FC;110A 116A 11AF;
+C3FD;C3FD;110A 116A 11B0;C3FD;110A 116A 11B0;
+C3FE;C3FE;110A 116A 11B1;C3FE;110A 116A 11B1;
+C3FF;C3FF;110A 116A 11B2;C3FF;110A 116A 11B2;
+C400;C400;110A 116A 11B3;C400;110A 116A 11B3;
+C401;C401;110A 116A 11B4;C401;110A 116A 11B4;
+C402;C402;110A 116A 11B5;C402;110A 116A 11B5;
+C403;C403;110A 116A 11B6;C403;110A 116A 11B6;
+C404;C404;110A 116A 11B7;C404;110A 116A 11B7;
+C405;C405;110A 116A 11B8;C405;110A 116A 11B8;
+C406;C406;110A 116A 11B9;C406;110A 116A 11B9;
+C407;C407;110A 116A 11BA;C407;110A 116A 11BA;
+C408;C408;110A 116A 11BB;C408;110A 116A 11BB;
+C409;C409;110A 116A 11BC;C409;110A 116A 11BC;
+C40A;C40A;110A 116A 11BD;C40A;110A 116A 11BD;
+C40B;C40B;110A 116A 11BE;C40B;110A 116A 11BE;
+C40C;C40C;110A 116A 11BF;C40C;110A 116A 11BF;
+C40D;C40D;110A 116A 11C0;C40D;110A 116A 11C0;
+C40E;C40E;110A 116A 11C1;C40E;110A 116A 11C1;
+C40F;C40F;110A 116A 11C2;C40F;110A 116A 11C2;
+C410;C410;110A 116B;C410;110A 116B;
+C411;C411;110A 116B 11A8;C411;110A 116B 11A8;
+C412;C412;110A 116B 11A9;C412;110A 116B 11A9;
+C413;C413;110A 116B 11AA;C413;110A 116B 11AA;
+C414;C414;110A 116B 11AB;C414;110A 116B 11AB;
+C415;C415;110A 116B 11AC;C415;110A 116B 11AC;
+C416;C416;110A 116B 11AD;C416;110A 116B 11AD;
+C417;C417;110A 116B 11AE;C417;110A 116B 11AE;
+C418;C418;110A 116B 11AF;C418;110A 116B 11AF;
+C419;C419;110A 116B 11B0;C419;110A 116B 11B0;
+C41A;C41A;110A 116B 11B1;C41A;110A 116B 11B1;
+C41B;C41B;110A 116B 11B2;C41B;110A 116B 11B2;
+C41C;C41C;110A 116B 11B3;C41C;110A 116B 11B3;
+C41D;C41D;110A 116B 11B4;C41D;110A 116B 11B4;
+C41E;C41E;110A 116B 11B5;C41E;110A 116B 11B5;
+C41F;C41F;110A 116B 11B6;C41F;110A 116B 11B6;
+C420;C420;110A 116B 11B7;C420;110A 116B 11B7;
+C421;C421;110A 116B 11B8;C421;110A 116B 11B8;
+C422;C422;110A 116B 11B9;C422;110A 116B 11B9;
+C423;C423;110A 116B 11BA;C423;110A 116B 11BA;
+C424;C424;110A 116B 11BB;C424;110A 116B 11BB;
+C425;C425;110A 116B 11BC;C425;110A 116B 11BC;
+C426;C426;110A 116B 11BD;C426;110A 116B 11BD;
+C427;C427;110A 116B 11BE;C427;110A 116B 11BE;
+C428;C428;110A 116B 11BF;C428;110A 116B 11BF;
+C429;C429;110A 116B 11C0;C429;110A 116B 11C0;
+C42A;C42A;110A 116B 11C1;C42A;110A 116B 11C1;
+C42B;C42B;110A 116B 11C2;C42B;110A 116B 11C2;
+C42C;C42C;110A 116C;C42C;110A 116C;
+C42D;C42D;110A 116C 11A8;C42D;110A 116C 11A8;
+C42E;C42E;110A 116C 11A9;C42E;110A 116C 11A9;
+C42F;C42F;110A 116C 11AA;C42F;110A 116C 11AA;
+C430;C430;110A 116C 11AB;C430;110A 116C 11AB;
+C431;C431;110A 116C 11AC;C431;110A 116C 11AC;
+C432;C432;110A 116C 11AD;C432;110A 116C 11AD;
+C433;C433;110A 116C 11AE;C433;110A 116C 11AE;
+C434;C434;110A 116C 11AF;C434;110A 116C 11AF;
+C435;C435;110A 116C 11B0;C435;110A 116C 11B0;
+C436;C436;110A 116C 11B1;C436;110A 116C 11B1;
+C437;C437;110A 116C 11B2;C437;110A 116C 11B2;
+C438;C438;110A 116C 11B3;C438;110A 116C 11B3;
+C439;C439;110A 116C 11B4;C439;110A 116C 11B4;
+C43A;C43A;110A 116C 11B5;C43A;110A 116C 11B5;
+C43B;C43B;110A 116C 11B6;C43B;110A 116C 11B6;
+C43C;C43C;110A 116C 11B7;C43C;110A 116C 11B7;
+C43D;C43D;110A 116C 11B8;C43D;110A 116C 11B8;
+C43E;C43E;110A 116C 11B9;C43E;110A 116C 11B9;
+C43F;C43F;110A 116C 11BA;C43F;110A 116C 11BA;
+C440;C440;110A 116C 11BB;C440;110A 116C 11BB;
+C441;C441;110A 116C 11BC;C441;110A 116C 11BC;
+C442;C442;110A 116C 11BD;C442;110A 116C 11BD;
+C443;C443;110A 116C 11BE;C443;110A 116C 11BE;
+C444;C444;110A 116C 11BF;C444;110A 116C 11BF;
+C445;C445;110A 116C 11C0;C445;110A 116C 11C0;
+C446;C446;110A 116C 11C1;C446;110A 116C 11C1;
+C447;C447;110A 116C 11C2;C447;110A 116C 11C2;
+C448;C448;110A 116D;C448;110A 116D;
+C449;C449;110A 116D 11A8;C449;110A 116D 11A8;
+C44A;C44A;110A 116D 11A9;C44A;110A 116D 11A9;
+C44B;C44B;110A 116D 11AA;C44B;110A 116D 11AA;
+C44C;C44C;110A 116D 11AB;C44C;110A 116D 11AB;
+C44D;C44D;110A 116D 11AC;C44D;110A 116D 11AC;
+C44E;C44E;110A 116D 11AD;C44E;110A 116D 11AD;
+C44F;C44F;110A 116D 11AE;C44F;110A 116D 11AE;
+C450;C450;110A 116D 11AF;C450;110A 116D 11AF;
+C451;C451;110A 116D 11B0;C451;110A 116D 11B0;
+C452;C452;110A 116D 11B1;C452;110A 116D 11B1;
+C453;C453;110A 116D 11B2;C453;110A 116D 11B2;
+C454;C454;110A 116D 11B3;C454;110A 116D 11B3;
+C455;C455;110A 116D 11B4;C455;110A 116D 11B4;
+C456;C456;110A 116D 11B5;C456;110A 116D 11B5;
+C457;C457;110A 116D 11B6;C457;110A 116D 11B6;
+C458;C458;110A 116D 11B7;C458;110A 116D 11B7;
+C459;C459;110A 116D 11B8;C459;110A 116D 11B8;
+C45A;C45A;110A 116D 11B9;C45A;110A 116D 11B9;
+C45B;C45B;110A 116D 11BA;C45B;110A 116D 11BA;
+C45C;C45C;110A 116D 11BB;C45C;110A 116D 11BB;
+C45D;C45D;110A 116D 11BC;C45D;110A 116D 11BC;
+C45E;C45E;110A 116D 11BD;C45E;110A 116D 11BD;
+C45F;C45F;110A 116D 11BE;C45F;110A 116D 11BE;
+C460;C460;110A 116D 11BF;C460;110A 116D 11BF;
+C461;C461;110A 116D 11C0;C461;110A 116D 11C0;
+C462;C462;110A 116D 11C1;C462;110A 116D 11C1;
+C463;C463;110A 116D 11C2;C463;110A 116D 11C2;
+C464;C464;110A 116E;C464;110A 116E;
+C465;C465;110A 116E 11A8;C465;110A 116E 11A8;
+C466;C466;110A 116E 11A9;C466;110A 116E 11A9;
+C467;C467;110A 116E 11AA;C467;110A 116E 11AA;
+C468;C468;110A 116E 11AB;C468;110A 116E 11AB;
+C469;C469;110A 116E 11AC;C469;110A 116E 11AC;
+C46A;C46A;110A 116E 11AD;C46A;110A 116E 11AD;
+C46B;C46B;110A 116E 11AE;C46B;110A 116E 11AE;
+C46C;C46C;110A 116E 11AF;C46C;110A 116E 11AF;
+C46D;C46D;110A 116E 11B0;C46D;110A 116E 11B0;
+C46E;C46E;110A 116E 11B1;C46E;110A 116E 11B1;
+C46F;C46F;110A 116E 11B2;C46F;110A 116E 11B2;
+C470;C470;110A 116E 11B3;C470;110A 116E 11B3;
+C471;C471;110A 116E 11B4;C471;110A 116E 11B4;
+C472;C472;110A 116E 11B5;C472;110A 116E 11B5;
+C473;C473;110A 116E 11B6;C473;110A 116E 11B6;
+C474;C474;110A 116E 11B7;C474;110A 116E 11B7;
+C475;C475;110A 116E 11B8;C475;110A 116E 11B8;
+C476;C476;110A 116E 11B9;C476;110A 116E 11B9;
+C477;C477;110A 116E 11BA;C477;110A 116E 11BA;
+C478;C478;110A 116E 11BB;C478;110A 116E 11BB;
+C479;C479;110A 116E 11BC;C479;110A 116E 11BC;
+C47A;C47A;110A 116E 11BD;C47A;110A 116E 11BD;
+C47B;C47B;110A 116E 11BE;C47B;110A 116E 11BE;
+C47C;C47C;110A 116E 11BF;C47C;110A 116E 11BF;
+C47D;C47D;110A 116E 11C0;C47D;110A 116E 11C0;
+C47E;C47E;110A 116E 11C1;C47E;110A 116E 11C1;
+C47F;C47F;110A 116E 11C2;C47F;110A 116E 11C2;
+C480;C480;110A 116F;C480;110A 116F;
+C481;C481;110A 116F 11A8;C481;110A 116F 11A8;
+C482;C482;110A 116F 11A9;C482;110A 116F 11A9;
+C483;C483;110A 116F 11AA;C483;110A 116F 11AA;
+C484;C484;110A 116F 11AB;C484;110A 116F 11AB;
+C485;C485;110A 116F 11AC;C485;110A 116F 11AC;
+C486;C486;110A 116F 11AD;C486;110A 116F 11AD;
+C487;C487;110A 116F 11AE;C487;110A 116F 11AE;
+C488;C488;110A 116F 11AF;C488;110A 116F 11AF;
+C489;C489;110A 116F 11B0;C489;110A 116F 11B0;
+C48A;C48A;110A 116F 11B1;C48A;110A 116F 11B1;
+C48B;C48B;110A 116F 11B2;C48B;110A 116F 11B2;
+C48C;C48C;110A 116F 11B3;C48C;110A 116F 11B3;
+C48D;C48D;110A 116F 11B4;C48D;110A 116F 11B4;
+C48E;C48E;110A 116F 11B5;C48E;110A 116F 11B5;
+C48F;C48F;110A 116F 11B6;C48F;110A 116F 11B6;
+C490;C490;110A 116F 11B7;C490;110A 116F 11B7;
+C491;C491;110A 116F 11B8;C491;110A 116F 11B8;
+C492;C492;110A 116F 11B9;C492;110A 116F 11B9;
+C493;C493;110A 116F 11BA;C493;110A 116F 11BA;
+C494;C494;110A 116F 11BB;C494;110A 116F 11BB;
+C495;C495;110A 116F 11BC;C495;110A 116F 11BC;
+C496;C496;110A 116F 11BD;C496;110A 116F 11BD;
+C497;C497;110A 116F 11BE;C497;110A 116F 11BE;
+C498;C498;110A 116F 11BF;C498;110A 116F 11BF;
+C499;C499;110A 116F 11C0;C499;110A 116F 11C0;
+C49A;C49A;110A 116F 11C1;C49A;110A 116F 11C1;
+C49B;C49B;110A 116F 11C2;C49B;110A 116F 11C2;
+C49C;C49C;110A 1170;C49C;110A 1170;
+C49D;C49D;110A 1170 11A8;C49D;110A 1170 11A8;
+C49E;C49E;110A 1170 11A9;C49E;110A 1170 11A9;
+C49F;C49F;110A 1170 11AA;C49F;110A 1170 11AA;
+C4A0;C4A0;110A 1170 11AB;C4A0;110A 1170 11AB;
+C4A1;C4A1;110A 1170 11AC;C4A1;110A 1170 11AC;
+C4A2;C4A2;110A 1170 11AD;C4A2;110A 1170 11AD;
+C4A3;C4A3;110A 1170 11AE;C4A3;110A 1170 11AE;
+C4A4;C4A4;110A 1170 11AF;C4A4;110A 1170 11AF;
+C4A5;C4A5;110A 1170 11B0;C4A5;110A 1170 11B0;
+C4A6;C4A6;110A 1170 11B1;C4A6;110A 1170 11B1;
+C4A7;C4A7;110A 1170 11B2;C4A7;110A 1170 11B2;
+C4A8;C4A8;110A 1170 11B3;C4A8;110A 1170 11B3;
+C4A9;C4A9;110A 1170 11B4;C4A9;110A 1170 11B4;
+C4AA;C4AA;110A 1170 11B5;C4AA;110A 1170 11B5;
+C4AB;C4AB;110A 1170 11B6;C4AB;110A 1170 11B6;
+C4AC;C4AC;110A 1170 11B7;C4AC;110A 1170 11B7;
+C4AD;C4AD;110A 1170 11B8;C4AD;110A 1170 11B8;
+C4AE;C4AE;110A 1170 11B9;C4AE;110A 1170 11B9;
+C4AF;C4AF;110A 1170 11BA;C4AF;110A 1170 11BA;
+C4B0;C4B0;110A 1170 11BB;C4B0;110A 1170 11BB;
+C4B1;C4B1;110A 1170 11BC;C4B1;110A 1170 11BC;
+C4B2;C4B2;110A 1170 11BD;C4B2;110A 1170 11BD;
+C4B3;C4B3;110A 1170 11BE;C4B3;110A 1170 11BE;
+C4B4;C4B4;110A 1170 11BF;C4B4;110A 1170 11BF;
+C4B5;C4B5;110A 1170 11C0;C4B5;110A 1170 11C0;
+C4B6;C4B6;110A 1170 11C1;C4B6;110A 1170 11C1;
+C4B7;C4B7;110A 1170 11C2;C4B7;110A 1170 11C2;
+C4B8;C4B8;110A 1171;C4B8;110A 1171;
+C4B9;C4B9;110A 1171 11A8;C4B9;110A 1171 11A8;
+C4BA;C4BA;110A 1171 11A9;C4BA;110A 1171 11A9;
+C4BB;C4BB;110A 1171 11AA;C4BB;110A 1171 11AA;
+C4BC;C4BC;110A 1171 11AB;C4BC;110A 1171 11AB;
+C4BD;C4BD;110A 1171 11AC;C4BD;110A 1171 11AC;
+C4BE;C4BE;110A 1171 11AD;C4BE;110A 1171 11AD;
+C4BF;C4BF;110A 1171 11AE;C4BF;110A 1171 11AE;
+C4C0;C4C0;110A 1171 11AF;C4C0;110A 1171 11AF;
+C4C1;C4C1;110A 1171 11B0;C4C1;110A 1171 11B0;
+C4C2;C4C2;110A 1171 11B1;C4C2;110A 1171 11B1;
+C4C3;C4C3;110A 1171 11B2;C4C3;110A 1171 11B2;
+C4C4;C4C4;110A 1171 11B3;C4C4;110A 1171 11B3;
+C4C5;C4C5;110A 1171 11B4;C4C5;110A 1171 11B4;
+C4C6;C4C6;110A 1171 11B5;C4C6;110A 1171 11B5;
+C4C7;C4C7;110A 1171 11B6;C4C7;110A 1171 11B6;
+C4C8;C4C8;110A 1171 11B7;C4C8;110A 1171 11B7;
+C4C9;C4C9;110A 1171 11B8;C4C9;110A 1171 11B8;
+C4CA;C4CA;110A 1171 11B9;C4CA;110A 1171 11B9;
+C4CB;C4CB;110A 1171 11BA;C4CB;110A 1171 11BA;
+C4CC;C4CC;110A 1171 11BB;C4CC;110A 1171 11BB;
+C4CD;C4CD;110A 1171 11BC;C4CD;110A 1171 11BC;
+C4CE;C4CE;110A 1171 11BD;C4CE;110A 1171 11BD;
+C4CF;C4CF;110A 1171 11BE;C4CF;110A 1171 11BE;
+C4D0;C4D0;110A 1171 11BF;C4D0;110A 1171 11BF;
+C4D1;C4D1;110A 1171 11C0;C4D1;110A 1171 11C0;
+C4D2;C4D2;110A 1171 11C1;C4D2;110A 1171 11C1;
+C4D3;C4D3;110A 1171 11C2;C4D3;110A 1171 11C2;
+C4D4;C4D4;110A 1172;C4D4;110A 1172;
+C4D5;C4D5;110A 1172 11A8;C4D5;110A 1172 11A8;
+C4D6;C4D6;110A 1172 11A9;C4D6;110A 1172 11A9;
+C4D7;C4D7;110A 1172 11AA;C4D7;110A 1172 11AA;
+C4D8;C4D8;110A 1172 11AB;C4D8;110A 1172 11AB;
+C4D9;C4D9;110A 1172 11AC;C4D9;110A 1172 11AC;
+C4DA;C4DA;110A 1172 11AD;C4DA;110A 1172 11AD;
+C4DB;C4DB;110A 1172 11AE;C4DB;110A 1172 11AE;
+C4DC;C4DC;110A 1172 11AF;C4DC;110A 1172 11AF;
+C4DD;C4DD;110A 1172 11B0;C4DD;110A 1172 11B0;
+C4DE;C4DE;110A 1172 11B1;C4DE;110A 1172 11B1;
+C4DF;C4DF;110A 1172 11B2;C4DF;110A 1172 11B2;
+C4E0;C4E0;110A 1172 11B3;C4E0;110A 1172 11B3;
+C4E1;C4E1;110A 1172 11B4;C4E1;110A 1172 11B4;
+C4E2;C4E2;110A 1172 11B5;C4E2;110A 1172 11B5;
+C4E3;C4E3;110A 1172 11B6;C4E3;110A 1172 11B6;
+C4E4;C4E4;110A 1172 11B7;C4E4;110A 1172 11B7;
+C4E5;C4E5;110A 1172 11B8;C4E5;110A 1172 11B8;
+C4E6;C4E6;110A 1172 11B9;C4E6;110A 1172 11B9;
+C4E7;C4E7;110A 1172 11BA;C4E7;110A 1172 11BA;
+C4E8;C4E8;110A 1172 11BB;C4E8;110A 1172 11BB;
+C4E9;C4E9;110A 1172 11BC;C4E9;110A 1172 11BC;
+C4EA;C4EA;110A 1172 11BD;C4EA;110A 1172 11BD;
+C4EB;C4EB;110A 1172 11BE;C4EB;110A 1172 11BE;
+C4EC;C4EC;110A 1172 11BF;C4EC;110A 1172 11BF;
+C4ED;C4ED;110A 1172 11C0;C4ED;110A 1172 11C0;
+C4EE;C4EE;110A 1172 11C1;C4EE;110A 1172 11C1;
+C4EF;C4EF;110A 1172 11C2;C4EF;110A 1172 11C2;
+C4F0;C4F0;110A 1173;C4F0;110A 1173;
+C4F1;C4F1;110A 1173 11A8;C4F1;110A 1173 11A8;
+C4F2;C4F2;110A 1173 11A9;C4F2;110A 1173 11A9;
+C4F3;C4F3;110A 1173 11AA;C4F3;110A 1173 11AA;
+C4F4;C4F4;110A 1173 11AB;C4F4;110A 1173 11AB;
+C4F5;C4F5;110A 1173 11AC;C4F5;110A 1173 11AC;
+C4F6;C4F6;110A 1173 11AD;C4F6;110A 1173 11AD;
+C4F7;C4F7;110A 1173 11AE;C4F7;110A 1173 11AE;
+C4F8;C4F8;110A 1173 11AF;C4F8;110A 1173 11AF;
+C4F9;C4F9;110A 1173 11B0;C4F9;110A 1173 11B0;
+C4FA;C4FA;110A 1173 11B1;C4FA;110A 1173 11B1;
+C4FB;C4FB;110A 1173 11B2;C4FB;110A 1173 11B2;
+C4FC;C4FC;110A 1173 11B3;C4FC;110A 1173 11B3;
+C4FD;C4FD;110A 1173 11B4;C4FD;110A 1173 11B4;
+C4FE;C4FE;110A 1173 11B5;C4FE;110A 1173 11B5;
+C4FF;C4FF;110A 1173 11B6;C4FF;110A 1173 11B6;
+C500;C500;110A 1173 11B7;C500;110A 1173 11B7;
+C501;C501;110A 1173 11B8;C501;110A 1173 11B8;
+C502;C502;110A 1173 11B9;C502;110A 1173 11B9;
+C503;C503;110A 1173 11BA;C503;110A 1173 11BA;
+C504;C504;110A 1173 11BB;C504;110A 1173 11BB;
+C505;C505;110A 1173 11BC;C505;110A 1173 11BC;
+C506;C506;110A 1173 11BD;C506;110A 1173 11BD;
+C507;C507;110A 1173 11BE;C507;110A 1173 11BE;
+C508;C508;110A 1173 11BF;C508;110A 1173 11BF;
+C509;C509;110A 1173 11C0;C509;110A 1173 11C0;
+C50A;C50A;110A 1173 11C1;C50A;110A 1173 11C1;
+C50B;C50B;110A 1173 11C2;C50B;110A 1173 11C2;
+C50C;C50C;110A 1174;C50C;110A 1174;
+C50D;C50D;110A 1174 11A8;C50D;110A 1174 11A8;
+C50E;C50E;110A 1174 11A9;C50E;110A 1174 11A9;
+C50F;C50F;110A 1174 11AA;C50F;110A 1174 11AA;
+C510;C510;110A 1174 11AB;C510;110A 1174 11AB;
+C511;C511;110A 1174 11AC;C511;110A 1174 11AC;
+C512;C512;110A 1174 11AD;C512;110A 1174 11AD;
+C513;C513;110A 1174 11AE;C513;110A 1174 11AE;
+C514;C514;110A 1174 11AF;C514;110A 1174 11AF;
+C515;C515;110A 1174 11B0;C515;110A 1174 11B0;
+C516;C516;110A 1174 11B1;C516;110A 1174 11B1;
+C517;C517;110A 1174 11B2;C517;110A 1174 11B2;
+C518;C518;110A 1174 11B3;C518;110A 1174 11B3;
+C519;C519;110A 1174 11B4;C519;110A 1174 11B4;
+C51A;C51A;110A 1174 11B5;C51A;110A 1174 11B5;
+C51B;C51B;110A 1174 11B6;C51B;110A 1174 11B6;
+C51C;C51C;110A 1174 11B7;C51C;110A 1174 11B7;
+C51D;C51D;110A 1174 11B8;C51D;110A 1174 11B8;
+C51E;C51E;110A 1174 11B9;C51E;110A 1174 11B9;
+C51F;C51F;110A 1174 11BA;C51F;110A 1174 11BA;
+C520;C520;110A 1174 11BB;C520;110A 1174 11BB;
+C521;C521;110A 1174 11BC;C521;110A 1174 11BC;
+C522;C522;110A 1174 11BD;C522;110A 1174 11BD;
+C523;C523;110A 1174 11BE;C523;110A 1174 11BE;
+C524;C524;110A 1174 11BF;C524;110A 1174 11BF;
+C525;C525;110A 1174 11C0;C525;110A 1174 11C0;
+C526;C526;110A 1174 11C1;C526;110A 1174 11C1;
+C527;C527;110A 1174 11C2;C527;110A 1174 11C2;
+C528;C528;110A 1175;C528;110A 1175;
+C529;C529;110A 1175 11A8;C529;110A 1175 11A8;
+C52A;C52A;110A 1175 11A9;C52A;110A 1175 11A9;
+C52B;C52B;110A 1175 11AA;C52B;110A 1175 11AA;
+C52C;C52C;110A 1175 11AB;C52C;110A 1175 11AB;
+C52D;C52D;110A 1175 11AC;C52D;110A 1175 11AC;
+C52E;C52E;110A 1175 11AD;C52E;110A 1175 11AD;
+C52F;C52F;110A 1175 11AE;C52F;110A 1175 11AE;
+C530;C530;110A 1175 11AF;C530;110A 1175 11AF;
+C531;C531;110A 1175 11B0;C531;110A 1175 11B0;
+C532;C532;110A 1175 11B1;C532;110A 1175 11B1;
+C533;C533;110A 1175 11B2;C533;110A 1175 11B2;
+C534;C534;110A 1175 11B3;C534;110A 1175 11B3;
+C535;C535;110A 1175 11B4;C535;110A 1175 11B4;
+C536;C536;110A 1175 11B5;C536;110A 1175 11B5;
+C537;C537;110A 1175 11B6;C537;110A 1175 11B6;
+C538;C538;110A 1175 11B7;C538;110A 1175 11B7;
+C539;C539;110A 1175 11B8;C539;110A 1175 11B8;
+C53A;C53A;110A 1175 11B9;C53A;110A 1175 11B9;
+C53B;C53B;110A 1175 11BA;C53B;110A 1175 11BA;
+C53C;C53C;110A 1175 11BB;C53C;110A 1175 11BB;
+C53D;C53D;110A 1175 11BC;C53D;110A 1175 11BC;
+C53E;C53E;110A 1175 11BD;C53E;110A 1175 11BD;
+C53F;C53F;110A 1175 11BE;C53F;110A 1175 11BE;
+C540;C540;110A 1175 11BF;C540;110A 1175 11BF;
+C541;C541;110A 1175 11C0;C541;110A 1175 11C0;
+C542;C542;110A 1175 11C1;C542;110A 1175 11C1;
+C543;C543;110A 1175 11C2;C543;110A 1175 11C2;
+C544;C544;110B 1161;C544;110B 1161;
+C545;C545;110B 1161 11A8;C545;110B 1161 11A8;
+C546;C546;110B 1161 11A9;C546;110B 1161 11A9;
+C547;C547;110B 1161 11AA;C547;110B 1161 11AA;
+C548;C548;110B 1161 11AB;C548;110B 1161 11AB;
+C549;C549;110B 1161 11AC;C549;110B 1161 11AC;
+C54A;C54A;110B 1161 11AD;C54A;110B 1161 11AD;
+C54B;C54B;110B 1161 11AE;C54B;110B 1161 11AE;
+C54C;C54C;110B 1161 11AF;C54C;110B 1161 11AF;
+C54D;C54D;110B 1161 11B0;C54D;110B 1161 11B0;
+C54E;C54E;110B 1161 11B1;C54E;110B 1161 11B1;
+C54F;C54F;110B 1161 11B2;C54F;110B 1161 11B2;
+C550;C550;110B 1161 11B3;C550;110B 1161 11B3;
+C551;C551;110B 1161 11B4;C551;110B 1161 11B4;
+C552;C552;110B 1161 11B5;C552;110B 1161 11B5;
+C553;C553;110B 1161 11B6;C553;110B 1161 11B6;
+C554;C554;110B 1161 11B7;C554;110B 1161 11B7;
+C555;C555;110B 1161 11B8;C555;110B 1161 11B8;
+C556;C556;110B 1161 11B9;C556;110B 1161 11B9;
+C557;C557;110B 1161 11BA;C557;110B 1161 11BA;
+C558;C558;110B 1161 11BB;C558;110B 1161 11BB;
+C559;C559;110B 1161 11BC;C559;110B 1161 11BC;
+C55A;C55A;110B 1161 11BD;C55A;110B 1161 11BD;
+C55B;C55B;110B 1161 11BE;C55B;110B 1161 11BE;
+C55C;C55C;110B 1161 11BF;C55C;110B 1161 11BF;
+C55D;C55D;110B 1161 11C0;C55D;110B 1161 11C0;
+C55E;C55E;110B 1161 11C1;C55E;110B 1161 11C1;
+C55F;C55F;110B 1161 11C2;C55F;110B 1161 11C2;
+C560;C560;110B 1162;C560;110B 1162;
+C561;C561;110B 1162 11A8;C561;110B 1162 11A8;
+C562;C562;110B 1162 11A9;C562;110B 1162 11A9;
+C563;C563;110B 1162 11AA;C563;110B 1162 11AA;
+C564;C564;110B 1162 11AB;C564;110B 1162 11AB;
+C565;C565;110B 1162 11AC;C565;110B 1162 11AC;
+C566;C566;110B 1162 11AD;C566;110B 1162 11AD;
+C567;C567;110B 1162 11AE;C567;110B 1162 11AE;
+C568;C568;110B 1162 11AF;C568;110B 1162 11AF;
+C569;C569;110B 1162 11B0;C569;110B 1162 11B0;
+C56A;C56A;110B 1162 11B1;C56A;110B 1162 11B1;
+C56B;C56B;110B 1162 11B2;C56B;110B 1162 11B2;
+C56C;C56C;110B 1162 11B3;C56C;110B 1162 11B3;
+C56D;C56D;110B 1162 11B4;C56D;110B 1162 11B4;
+C56E;C56E;110B 1162 11B5;C56E;110B 1162 11B5;
+C56F;C56F;110B 1162 11B6;C56F;110B 1162 11B6;
+C570;C570;110B 1162 11B7;C570;110B 1162 11B7;
+C571;C571;110B 1162 11B8;C571;110B 1162 11B8;
+C572;C572;110B 1162 11B9;C572;110B 1162 11B9;
+C573;C573;110B 1162 11BA;C573;110B 1162 11BA;
+C574;C574;110B 1162 11BB;C574;110B 1162 11BB;
+C575;C575;110B 1162 11BC;C575;110B 1162 11BC;
+C576;C576;110B 1162 11BD;C576;110B 1162 11BD;
+C577;C577;110B 1162 11BE;C577;110B 1162 11BE;
+C578;C578;110B 1162 11BF;C578;110B 1162 11BF;
+C579;C579;110B 1162 11C0;C579;110B 1162 11C0;
+C57A;C57A;110B 1162 11C1;C57A;110B 1162 11C1;
+C57B;C57B;110B 1162 11C2;C57B;110B 1162 11C2;
+C57C;C57C;110B 1163;C57C;110B 1163;
+C57D;C57D;110B 1163 11A8;C57D;110B 1163 11A8;
+C57E;C57E;110B 1163 11A9;C57E;110B 1163 11A9;
+C57F;C57F;110B 1163 11AA;C57F;110B 1163 11AA;
+C580;C580;110B 1163 11AB;C580;110B 1163 11AB;
+C581;C581;110B 1163 11AC;C581;110B 1163 11AC;
+C582;C582;110B 1163 11AD;C582;110B 1163 11AD;
+C583;C583;110B 1163 11AE;C583;110B 1163 11AE;
+C584;C584;110B 1163 11AF;C584;110B 1163 11AF;
+C585;C585;110B 1163 11B0;C585;110B 1163 11B0;
+C586;C586;110B 1163 11B1;C586;110B 1163 11B1;
+C587;C587;110B 1163 11B2;C587;110B 1163 11B2;
+C588;C588;110B 1163 11B3;C588;110B 1163 11B3;
+C589;C589;110B 1163 11B4;C589;110B 1163 11B4;
+C58A;C58A;110B 1163 11B5;C58A;110B 1163 11B5;
+C58B;C58B;110B 1163 11B6;C58B;110B 1163 11B6;
+C58C;C58C;110B 1163 11B7;C58C;110B 1163 11B7;
+C58D;C58D;110B 1163 11B8;C58D;110B 1163 11B8;
+C58E;C58E;110B 1163 11B9;C58E;110B 1163 11B9;
+C58F;C58F;110B 1163 11BA;C58F;110B 1163 11BA;
+C590;C590;110B 1163 11BB;C590;110B 1163 11BB;
+C591;C591;110B 1163 11BC;C591;110B 1163 11BC;
+C592;C592;110B 1163 11BD;C592;110B 1163 11BD;
+C593;C593;110B 1163 11BE;C593;110B 1163 11BE;
+C594;C594;110B 1163 11BF;C594;110B 1163 11BF;
+C595;C595;110B 1163 11C0;C595;110B 1163 11C0;
+C596;C596;110B 1163 11C1;C596;110B 1163 11C1;
+C597;C597;110B 1163 11C2;C597;110B 1163 11C2;
+C598;C598;110B 1164;C598;110B 1164;
+C599;C599;110B 1164 11A8;C599;110B 1164 11A8;
+C59A;C59A;110B 1164 11A9;C59A;110B 1164 11A9;
+C59B;C59B;110B 1164 11AA;C59B;110B 1164 11AA;
+C59C;C59C;110B 1164 11AB;C59C;110B 1164 11AB;
+C59D;C59D;110B 1164 11AC;C59D;110B 1164 11AC;
+C59E;C59E;110B 1164 11AD;C59E;110B 1164 11AD;
+C59F;C59F;110B 1164 11AE;C59F;110B 1164 11AE;
+C5A0;C5A0;110B 1164 11AF;C5A0;110B 1164 11AF;
+C5A1;C5A1;110B 1164 11B0;C5A1;110B 1164 11B0;
+C5A2;C5A2;110B 1164 11B1;C5A2;110B 1164 11B1;
+C5A3;C5A3;110B 1164 11B2;C5A3;110B 1164 11B2;
+C5A4;C5A4;110B 1164 11B3;C5A4;110B 1164 11B3;
+C5A5;C5A5;110B 1164 11B4;C5A5;110B 1164 11B4;
+C5A6;C5A6;110B 1164 11B5;C5A6;110B 1164 11B5;
+C5A7;C5A7;110B 1164 11B6;C5A7;110B 1164 11B6;
+C5A8;C5A8;110B 1164 11B7;C5A8;110B 1164 11B7;
+C5A9;C5A9;110B 1164 11B8;C5A9;110B 1164 11B8;
+C5AA;C5AA;110B 1164 11B9;C5AA;110B 1164 11B9;
+C5AB;C5AB;110B 1164 11BA;C5AB;110B 1164 11BA;
+C5AC;C5AC;110B 1164 11BB;C5AC;110B 1164 11BB;
+C5AD;C5AD;110B 1164 11BC;C5AD;110B 1164 11BC;
+C5AE;C5AE;110B 1164 11BD;C5AE;110B 1164 11BD;
+C5AF;C5AF;110B 1164 11BE;C5AF;110B 1164 11BE;
+C5B0;C5B0;110B 1164 11BF;C5B0;110B 1164 11BF;
+C5B1;C5B1;110B 1164 11C0;C5B1;110B 1164 11C0;
+C5B2;C5B2;110B 1164 11C1;C5B2;110B 1164 11C1;
+C5B3;C5B3;110B 1164 11C2;C5B3;110B 1164 11C2;
+C5B4;C5B4;110B 1165;C5B4;110B 1165;
+C5B5;C5B5;110B 1165 11A8;C5B5;110B 1165 11A8;
+C5B6;C5B6;110B 1165 11A9;C5B6;110B 1165 11A9;
+C5B7;C5B7;110B 1165 11AA;C5B7;110B 1165 11AA;
+C5B8;C5B8;110B 1165 11AB;C5B8;110B 1165 11AB;
+C5B9;C5B9;110B 1165 11AC;C5B9;110B 1165 11AC;
+C5BA;C5BA;110B 1165 11AD;C5BA;110B 1165 11AD;
+C5BB;C5BB;110B 1165 11AE;C5BB;110B 1165 11AE;
+C5BC;C5BC;110B 1165 11AF;C5BC;110B 1165 11AF;
+C5BD;C5BD;110B 1165 11B0;C5BD;110B 1165 11B0;
+C5BE;C5BE;110B 1165 11B1;C5BE;110B 1165 11B1;
+C5BF;C5BF;110B 1165 11B2;C5BF;110B 1165 11B2;
+C5C0;C5C0;110B 1165 11B3;C5C0;110B 1165 11B3;
+C5C1;C5C1;110B 1165 11B4;C5C1;110B 1165 11B4;
+C5C2;C5C2;110B 1165 11B5;C5C2;110B 1165 11B5;
+C5C3;C5C3;110B 1165 11B6;C5C3;110B 1165 11B6;
+C5C4;C5C4;110B 1165 11B7;C5C4;110B 1165 11B7;
+C5C5;C5C5;110B 1165 11B8;C5C5;110B 1165 11B8;
+C5C6;C5C6;110B 1165 11B9;C5C6;110B 1165 11B9;
+C5C7;C5C7;110B 1165 11BA;C5C7;110B 1165 11BA;
+C5C8;C5C8;110B 1165 11BB;C5C8;110B 1165 11BB;
+C5C9;C5C9;110B 1165 11BC;C5C9;110B 1165 11BC;
+C5CA;C5CA;110B 1165 11BD;C5CA;110B 1165 11BD;
+C5CB;C5CB;110B 1165 11BE;C5CB;110B 1165 11BE;
+C5CC;C5CC;110B 1165 11BF;C5CC;110B 1165 11BF;
+C5CD;C5CD;110B 1165 11C0;C5CD;110B 1165 11C0;
+C5CE;C5CE;110B 1165 11C1;C5CE;110B 1165 11C1;
+C5CF;C5CF;110B 1165 11C2;C5CF;110B 1165 11C2;
+C5D0;C5D0;110B 1166;C5D0;110B 1166;
+C5D1;C5D1;110B 1166 11A8;C5D1;110B 1166 11A8;
+C5D2;C5D2;110B 1166 11A9;C5D2;110B 1166 11A9;
+C5D3;C5D3;110B 1166 11AA;C5D3;110B 1166 11AA;
+C5D4;C5D4;110B 1166 11AB;C5D4;110B 1166 11AB;
+C5D5;C5D5;110B 1166 11AC;C5D5;110B 1166 11AC;
+C5D6;C5D6;110B 1166 11AD;C5D6;110B 1166 11AD;
+C5D7;C5D7;110B 1166 11AE;C5D7;110B 1166 11AE;
+C5D8;C5D8;110B 1166 11AF;C5D8;110B 1166 11AF;
+C5D9;C5D9;110B 1166 11B0;C5D9;110B 1166 11B0;
+C5DA;C5DA;110B 1166 11B1;C5DA;110B 1166 11B1;
+C5DB;C5DB;110B 1166 11B2;C5DB;110B 1166 11B2;
+C5DC;C5DC;110B 1166 11B3;C5DC;110B 1166 11B3;
+C5DD;C5DD;110B 1166 11B4;C5DD;110B 1166 11B4;
+C5DE;C5DE;110B 1166 11B5;C5DE;110B 1166 11B5;
+C5DF;C5DF;110B 1166 11B6;C5DF;110B 1166 11B6;
+C5E0;C5E0;110B 1166 11B7;C5E0;110B 1166 11B7;
+C5E1;C5E1;110B 1166 11B8;C5E1;110B 1166 11B8;
+C5E2;C5E2;110B 1166 11B9;C5E2;110B 1166 11B9;
+C5E3;C5E3;110B 1166 11BA;C5E3;110B 1166 11BA;
+C5E4;C5E4;110B 1166 11BB;C5E4;110B 1166 11BB;
+C5E5;C5E5;110B 1166 11BC;C5E5;110B 1166 11BC;
+C5E6;C5E6;110B 1166 11BD;C5E6;110B 1166 11BD;
+C5E7;C5E7;110B 1166 11BE;C5E7;110B 1166 11BE;
+C5E8;C5E8;110B 1166 11BF;C5E8;110B 1166 11BF;
+C5E9;C5E9;110B 1166 11C0;C5E9;110B 1166 11C0;
+C5EA;C5EA;110B 1166 11C1;C5EA;110B 1166 11C1;
+C5EB;C5EB;110B 1166 11C2;C5EB;110B 1166 11C2;
+C5EC;C5EC;110B 1167;C5EC;110B 1167;
+C5ED;C5ED;110B 1167 11A8;C5ED;110B 1167 11A8;
+C5EE;C5EE;110B 1167 11A9;C5EE;110B 1167 11A9;
+C5EF;C5EF;110B 1167 11AA;C5EF;110B 1167 11AA;
+C5F0;C5F0;110B 1167 11AB;C5F0;110B 1167 11AB;
+C5F1;C5F1;110B 1167 11AC;C5F1;110B 1167 11AC;
+C5F2;C5F2;110B 1167 11AD;C5F2;110B 1167 11AD;
+C5F3;C5F3;110B 1167 11AE;C5F3;110B 1167 11AE;
+C5F4;C5F4;110B 1167 11AF;C5F4;110B 1167 11AF;
+C5F5;C5F5;110B 1167 11B0;C5F5;110B 1167 11B0;
+C5F6;C5F6;110B 1167 11B1;C5F6;110B 1167 11B1;
+C5F7;C5F7;110B 1167 11B2;C5F7;110B 1167 11B2;
+C5F8;C5F8;110B 1167 11B3;C5F8;110B 1167 11B3;
+C5F9;C5F9;110B 1167 11B4;C5F9;110B 1167 11B4;
+C5FA;C5FA;110B 1167 11B5;C5FA;110B 1167 11B5;
+C5FB;C5FB;110B 1167 11B6;C5FB;110B 1167 11B6;
+C5FC;C5FC;110B 1167 11B7;C5FC;110B 1167 11B7;
+C5FD;C5FD;110B 1167 11B8;C5FD;110B 1167 11B8;
+C5FE;C5FE;110B 1167 11B9;C5FE;110B 1167 11B9;
+C5FF;C5FF;110B 1167 11BA;C5FF;110B 1167 11BA;
+C600;C600;110B 1167 11BB;C600;110B 1167 11BB;
+C601;C601;110B 1167 11BC;C601;110B 1167 11BC;
+C602;C602;110B 1167 11BD;C602;110B 1167 11BD;
+C603;C603;110B 1167 11BE;C603;110B 1167 11BE;
+C604;C604;110B 1167 11BF;C604;110B 1167 11BF;
+C605;C605;110B 1167 11C0;C605;110B 1167 11C0;
+C606;C606;110B 1167 11C1;C606;110B 1167 11C1;
+C607;C607;110B 1167 11C2;C607;110B 1167 11C2;
+C608;C608;110B 1168;C608;110B 1168;
+C609;C609;110B 1168 11A8;C609;110B 1168 11A8;
+C60A;C60A;110B 1168 11A9;C60A;110B 1168 11A9;
+C60B;C60B;110B 1168 11AA;C60B;110B 1168 11AA;
+C60C;C60C;110B 1168 11AB;C60C;110B 1168 11AB;
+C60D;C60D;110B 1168 11AC;C60D;110B 1168 11AC;
+C60E;C60E;110B 1168 11AD;C60E;110B 1168 11AD;
+C60F;C60F;110B 1168 11AE;C60F;110B 1168 11AE;
+C610;C610;110B 1168 11AF;C610;110B 1168 11AF;
+C611;C611;110B 1168 11B0;C611;110B 1168 11B0;
+C612;C612;110B 1168 11B1;C612;110B 1168 11B1;
+C613;C613;110B 1168 11B2;C613;110B 1168 11B2;
+C614;C614;110B 1168 11B3;C614;110B 1168 11B3;
+C615;C615;110B 1168 11B4;C615;110B 1168 11B4;
+C616;C616;110B 1168 11B5;C616;110B 1168 11B5;
+C617;C617;110B 1168 11B6;C617;110B 1168 11B6;
+C618;C618;110B 1168 11B7;C618;110B 1168 11B7;
+C619;C619;110B 1168 11B8;C619;110B 1168 11B8;
+C61A;C61A;110B 1168 11B9;C61A;110B 1168 11B9;
+C61B;C61B;110B 1168 11BA;C61B;110B 1168 11BA;
+C61C;C61C;110B 1168 11BB;C61C;110B 1168 11BB;
+C61D;C61D;110B 1168 11BC;C61D;110B 1168 11BC;
+C61E;C61E;110B 1168 11BD;C61E;110B 1168 11BD;
+C61F;C61F;110B 1168 11BE;C61F;110B 1168 11BE;
+C620;C620;110B 1168 11BF;C620;110B 1168 11BF;
+C621;C621;110B 1168 11C0;C621;110B 1168 11C0;
+C622;C622;110B 1168 11C1;C622;110B 1168 11C1;
+C623;C623;110B 1168 11C2;C623;110B 1168 11C2;
+C624;C624;110B 1169;C624;110B 1169;
+C625;C625;110B 1169 11A8;C625;110B 1169 11A8;
+C626;C626;110B 1169 11A9;C626;110B 1169 11A9;
+C627;C627;110B 1169 11AA;C627;110B 1169 11AA;
+C628;C628;110B 1169 11AB;C628;110B 1169 11AB;
+C629;C629;110B 1169 11AC;C629;110B 1169 11AC;
+C62A;C62A;110B 1169 11AD;C62A;110B 1169 11AD;
+C62B;C62B;110B 1169 11AE;C62B;110B 1169 11AE;
+C62C;C62C;110B 1169 11AF;C62C;110B 1169 11AF;
+C62D;C62D;110B 1169 11B0;C62D;110B 1169 11B0;
+C62E;C62E;110B 1169 11B1;C62E;110B 1169 11B1;
+C62F;C62F;110B 1169 11B2;C62F;110B 1169 11B2;
+C630;C630;110B 1169 11B3;C630;110B 1169 11B3;
+C631;C631;110B 1169 11B4;C631;110B 1169 11B4;
+C632;C632;110B 1169 11B5;C632;110B 1169 11B5;
+C633;C633;110B 1169 11B6;C633;110B 1169 11B6;
+C634;C634;110B 1169 11B7;C634;110B 1169 11B7;
+C635;C635;110B 1169 11B8;C635;110B 1169 11B8;
+C636;C636;110B 1169 11B9;C636;110B 1169 11B9;
+C637;C637;110B 1169 11BA;C637;110B 1169 11BA;
+C638;C638;110B 1169 11BB;C638;110B 1169 11BB;
+C639;C639;110B 1169 11BC;C639;110B 1169 11BC;
+C63A;C63A;110B 1169 11BD;C63A;110B 1169 11BD;
+C63B;C63B;110B 1169 11BE;C63B;110B 1169 11BE;
+C63C;C63C;110B 1169 11BF;C63C;110B 1169 11BF;
+C63D;C63D;110B 1169 11C0;C63D;110B 1169 11C0;
+C63E;C63E;110B 1169 11C1;C63E;110B 1169 11C1;
+C63F;C63F;110B 1169 11C2;C63F;110B 1169 11C2;
+C640;C640;110B 116A;C640;110B 116A;
+C641;C641;110B 116A 11A8;C641;110B 116A 11A8;
+C642;C642;110B 116A 11A9;C642;110B 116A 11A9;
+C643;C643;110B 116A 11AA;C643;110B 116A 11AA;
+C644;C644;110B 116A 11AB;C644;110B 116A 11AB;
+C645;C645;110B 116A 11AC;C645;110B 116A 11AC;
+C646;C646;110B 116A 11AD;C646;110B 116A 11AD;
+C647;C647;110B 116A 11AE;C647;110B 116A 11AE;
+C648;C648;110B 116A 11AF;C648;110B 116A 11AF;
+C649;C649;110B 116A 11B0;C649;110B 116A 11B0;
+C64A;C64A;110B 116A 11B1;C64A;110B 116A 11B1;
+C64B;C64B;110B 116A 11B2;C64B;110B 116A 11B2;
+C64C;C64C;110B 116A 11B3;C64C;110B 116A 11B3;
+C64D;C64D;110B 116A 11B4;C64D;110B 116A 11B4;
+C64E;C64E;110B 116A 11B5;C64E;110B 116A 11B5;
+C64F;C64F;110B 116A 11B6;C64F;110B 116A 11B6;
+C650;C650;110B 116A 11B7;C650;110B 116A 11B7;
+C651;C651;110B 116A 11B8;C651;110B 116A 11B8;
+C652;C652;110B 116A 11B9;C652;110B 116A 11B9;
+C653;C653;110B 116A 11BA;C653;110B 116A 11BA;
+C654;C654;110B 116A 11BB;C654;110B 116A 11BB;
+C655;C655;110B 116A 11BC;C655;110B 116A 11BC;
+C656;C656;110B 116A 11BD;C656;110B 116A 11BD;
+C657;C657;110B 116A 11BE;C657;110B 116A 11BE;
+C658;C658;110B 116A 11BF;C658;110B 116A 11BF;
+C659;C659;110B 116A 11C0;C659;110B 116A 11C0;
+C65A;C65A;110B 116A 11C1;C65A;110B 116A 11C1;
+C65B;C65B;110B 116A 11C2;C65B;110B 116A 11C2;
+C65C;C65C;110B 116B;C65C;110B 116B;
+C65D;C65D;110B 116B 11A8;C65D;110B 116B 11A8;
+C65E;C65E;110B 116B 11A9;C65E;110B 116B 11A9;
+C65F;C65F;110B 116B 11AA;C65F;110B 116B 11AA;
+C660;C660;110B 116B 11AB;C660;110B 116B 11AB;
+C661;C661;110B 116B 11AC;C661;110B 116B 11AC;
+C662;C662;110B 116B 11AD;C662;110B 116B 11AD;
+C663;C663;110B 116B 11AE;C663;110B 116B 11AE;
+C664;C664;110B 116B 11AF;C664;110B 116B 11AF;
+C665;C665;110B 116B 11B0;C665;110B 116B 11B0;
+C666;C666;110B 116B 11B1;C666;110B 116B 11B1;
+C667;C667;110B 116B 11B2;C667;110B 116B 11B2;
+C668;C668;110B 116B 11B3;C668;110B 116B 11B3;
+C669;C669;110B 116B 11B4;C669;110B 116B 11B4;
+C66A;C66A;110B 116B 11B5;C66A;110B 116B 11B5;
+C66B;C66B;110B 116B 11B6;C66B;110B 116B 11B6;
+C66C;C66C;110B 116B 11B7;C66C;110B 116B 11B7;
+C66D;C66D;110B 116B 11B8;C66D;110B 116B 11B8;
+C66E;C66E;110B 116B 11B9;C66E;110B 116B 11B9;
+C66F;C66F;110B 116B 11BA;C66F;110B 116B 11BA;
+C670;C670;110B 116B 11BB;C670;110B 116B 11BB;
+C671;C671;110B 116B 11BC;C671;110B 116B 11BC;
+C672;C672;110B 116B 11BD;C672;110B 116B 11BD;
+C673;C673;110B 116B 11BE;C673;110B 116B 11BE;
+C674;C674;110B 116B 11BF;C674;110B 116B 11BF;
+C675;C675;110B 116B 11C0;C675;110B 116B 11C0;
+C676;C676;110B 116B 11C1;C676;110B 116B 11C1;
+C677;C677;110B 116B 11C2;C677;110B 116B 11C2;
+C678;C678;110B 116C;C678;110B 116C;
+C679;C679;110B 116C 11A8;C679;110B 116C 11A8;
+C67A;C67A;110B 116C 11A9;C67A;110B 116C 11A9;
+C67B;C67B;110B 116C 11AA;C67B;110B 116C 11AA;
+C67C;C67C;110B 116C 11AB;C67C;110B 116C 11AB;
+C67D;C67D;110B 116C 11AC;C67D;110B 116C 11AC;
+C67E;C67E;110B 116C 11AD;C67E;110B 116C 11AD;
+C67F;C67F;110B 116C 11AE;C67F;110B 116C 11AE;
+C680;C680;110B 116C 11AF;C680;110B 116C 11AF;
+C681;C681;110B 116C 11B0;C681;110B 116C 11B0;
+C682;C682;110B 116C 11B1;C682;110B 116C 11B1;
+C683;C683;110B 116C 11B2;C683;110B 116C 11B2;
+C684;C684;110B 116C 11B3;C684;110B 116C 11B3;
+C685;C685;110B 116C 11B4;C685;110B 116C 11B4;
+C686;C686;110B 116C 11B5;C686;110B 116C 11B5;
+C687;C687;110B 116C 11B6;C687;110B 116C 11B6;
+C688;C688;110B 116C 11B7;C688;110B 116C 11B7;
+C689;C689;110B 116C 11B8;C689;110B 116C 11B8;
+C68A;C68A;110B 116C 11B9;C68A;110B 116C 11B9;
+C68B;C68B;110B 116C 11BA;C68B;110B 116C 11BA;
+C68C;C68C;110B 116C 11BB;C68C;110B 116C 11BB;
+C68D;C68D;110B 116C 11BC;C68D;110B 116C 11BC;
+C68E;C68E;110B 116C 11BD;C68E;110B 116C 11BD;
+C68F;C68F;110B 116C 11BE;C68F;110B 116C 11BE;
+C690;C690;110B 116C 11BF;C690;110B 116C 11BF;
+C691;C691;110B 116C 11C0;C691;110B 116C 11C0;
+C692;C692;110B 116C 11C1;C692;110B 116C 11C1;
+C693;C693;110B 116C 11C2;C693;110B 116C 11C2;
+C694;C694;110B 116D;C694;110B 116D;
+C695;C695;110B 116D 11A8;C695;110B 116D 11A8;
+C696;C696;110B 116D 11A9;C696;110B 116D 11A9;
+C697;C697;110B 116D 11AA;C697;110B 116D 11AA;
+C698;C698;110B 116D 11AB;C698;110B 116D 11AB;
+C699;C699;110B 116D 11AC;C699;110B 116D 11AC;
+C69A;C69A;110B 116D 11AD;C69A;110B 116D 11AD;
+C69B;C69B;110B 116D 11AE;C69B;110B 116D 11AE;
+C69C;C69C;110B 116D 11AF;C69C;110B 116D 11AF;
+C69D;C69D;110B 116D 11B0;C69D;110B 116D 11B0;
+C69E;C69E;110B 116D 11B1;C69E;110B 116D 11B1;
+C69F;C69F;110B 116D 11B2;C69F;110B 116D 11B2;
+C6A0;C6A0;110B 116D 11B3;C6A0;110B 116D 11B3;
+C6A1;C6A1;110B 116D 11B4;C6A1;110B 116D 11B4;
+C6A2;C6A2;110B 116D 11B5;C6A2;110B 116D 11B5;
+C6A3;C6A3;110B 116D 11B6;C6A3;110B 116D 11B6;
+C6A4;C6A4;110B 116D 11B7;C6A4;110B 116D 11B7;
+C6A5;C6A5;110B 116D 11B8;C6A5;110B 116D 11B8;
+C6A6;C6A6;110B 116D 11B9;C6A6;110B 116D 11B9;
+C6A7;C6A7;110B 116D 11BA;C6A7;110B 116D 11BA;
+C6A8;C6A8;110B 116D 11BB;C6A8;110B 116D 11BB;
+C6A9;C6A9;110B 116D 11BC;C6A9;110B 116D 11BC;
+C6AA;C6AA;110B 116D 11BD;C6AA;110B 116D 11BD;
+C6AB;C6AB;110B 116D 11BE;C6AB;110B 116D 11BE;
+C6AC;C6AC;110B 116D 11BF;C6AC;110B 116D 11BF;
+C6AD;C6AD;110B 116D 11C0;C6AD;110B 116D 11C0;
+C6AE;C6AE;110B 116D 11C1;C6AE;110B 116D 11C1;
+C6AF;C6AF;110B 116D 11C2;C6AF;110B 116D 11C2;
+C6B0;C6B0;110B 116E;C6B0;110B 116E;
+C6B1;C6B1;110B 116E 11A8;C6B1;110B 116E 11A8;
+C6B2;C6B2;110B 116E 11A9;C6B2;110B 116E 11A9;
+C6B3;C6B3;110B 116E 11AA;C6B3;110B 116E 11AA;
+C6B4;C6B4;110B 116E 11AB;C6B4;110B 116E 11AB;
+C6B5;C6B5;110B 116E 11AC;C6B5;110B 116E 11AC;
+C6B6;C6B6;110B 116E 11AD;C6B6;110B 116E 11AD;
+C6B7;C6B7;110B 116E 11AE;C6B7;110B 116E 11AE;
+C6B8;C6B8;110B 116E 11AF;C6B8;110B 116E 11AF;
+C6B9;C6B9;110B 116E 11B0;C6B9;110B 116E 11B0;
+C6BA;C6BA;110B 116E 11B1;C6BA;110B 116E 11B1;
+C6BB;C6BB;110B 116E 11B2;C6BB;110B 116E 11B2;
+C6BC;C6BC;110B 116E 11B3;C6BC;110B 116E 11B3;
+C6BD;C6BD;110B 116E 11B4;C6BD;110B 116E 11B4;
+C6BE;C6BE;110B 116E 11B5;C6BE;110B 116E 11B5;
+C6BF;C6BF;110B 116E 11B6;C6BF;110B 116E 11B6;
+C6C0;C6C0;110B 116E 11B7;C6C0;110B 116E 11B7;
+C6C1;C6C1;110B 116E 11B8;C6C1;110B 116E 11B8;
+C6C2;C6C2;110B 116E 11B9;C6C2;110B 116E 11B9;
+C6C3;C6C3;110B 116E 11BA;C6C3;110B 116E 11BA;
+C6C4;C6C4;110B 116E 11BB;C6C4;110B 116E 11BB;
+C6C5;C6C5;110B 116E 11BC;C6C5;110B 116E 11BC;
+C6C6;C6C6;110B 116E 11BD;C6C6;110B 116E 11BD;
+C6C7;C6C7;110B 116E 11BE;C6C7;110B 116E 11BE;
+C6C8;C6C8;110B 116E 11BF;C6C8;110B 116E 11BF;
+C6C9;C6C9;110B 116E 11C0;C6C9;110B 116E 11C0;
+C6CA;C6CA;110B 116E 11C1;C6CA;110B 116E 11C1;
+C6CB;C6CB;110B 116E 11C2;C6CB;110B 116E 11C2;
+C6CC;C6CC;110B 116F;C6CC;110B 116F;
+C6CD;C6CD;110B 116F 11A8;C6CD;110B 116F 11A8;
+C6CE;C6CE;110B 116F 11A9;C6CE;110B 116F 11A9;
+C6CF;C6CF;110B 116F 11AA;C6CF;110B 116F 11AA;
+C6D0;C6D0;110B 116F 11AB;C6D0;110B 116F 11AB;
+C6D1;C6D1;110B 116F 11AC;C6D1;110B 116F 11AC;
+C6D2;C6D2;110B 116F 11AD;C6D2;110B 116F 11AD;
+C6D3;C6D3;110B 116F 11AE;C6D3;110B 116F 11AE;
+C6D4;C6D4;110B 116F 11AF;C6D4;110B 116F 11AF;
+C6D5;C6D5;110B 116F 11B0;C6D5;110B 116F 11B0;
+C6D6;C6D6;110B 116F 11B1;C6D6;110B 116F 11B1;
+C6D7;C6D7;110B 116F 11B2;C6D7;110B 116F 11B2;
+C6D8;C6D8;110B 116F 11B3;C6D8;110B 116F 11B3;
+C6D9;C6D9;110B 116F 11B4;C6D9;110B 116F 11B4;
+C6DA;C6DA;110B 116F 11B5;C6DA;110B 116F 11B5;
+C6DB;C6DB;110B 116F 11B6;C6DB;110B 116F 11B6;
+C6DC;C6DC;110B 116F 11B7;C6DC;110B 116F 11B7;
+C6DD;C6DD;110B 116F 11B8;C6DD;110B 116F 11B8;
+C6DE;C6DE;110B 116F 11B9;C6DE;110B 116F 11B9;
+C6DF;C6DF;110B 116F 11BA;C6DF;110B 116F 11BA;
+C6E0;C6E0;110B 116F 11BB;C6E0;110B 116F 11BB;
+C6E1;C6E1;110B 116F 11BC;C6E1;110B 116F 11BC;
+C6E2;C6E2;110B 116F 11BD;C6E2;110B 116F 11BD;
+C6E3;C6E3;110B 116F 11BE;C6E3;110B 116F 11BE;
+C6E4;C6E4;110B 116F 11BF;C6E4;110B 116F 11BF;
+C6E5;C6E5;110B 116F 11C0;C6E5;110B 116F 11C0;
+C6E6;C6E6;110B 116F 11C1;C6E6;110B 116F 11C1;
+C6E7;C6E7;110B 116F 11C2;C6E7;110B 116F 11C2;
+C6E8;C6E8;110B 1170;C6E8;110B 1170;
+C6E9;C6E9;110B 1170 11A8;C6E9;110B 1170 11A8;
+C6EA;C6EA;110B 1170 11A9;C6EA;110B 1170 11A9;
+C6EB;C6EB;110B 1170 11AA;C6EB;110B 1170 11AA;
+C6EC;C6EC;110B 1170 11AB;C6EC;110B 1170 11AB;
+C6ED;C6ED;110B 1170 11AC;C6ED;110B 1170 11AC;
+C6EE;C6EE;110B 1170 11AD;C6EE;110B 1170 11AD;
+C6EF;C6EF;110B 1170 11AE;C6EF;110B 1170 11AE;
+C6F0;C6F0;110B 1170 11AF;C6F0;110B 1170 11AF;
+C6F1;C6F1;110B 1170 11B0;C6F1;110B 1170 11B0;
+C6F2;C6F2;110B 1170 11B1;C6F2;110B 1170 11B1;
+C6F3;C6F3;110B 1170 11B2;C6F3;110B 1170 11B2;
+C6F4;C6F4;110B 1170 11B3;C6F4;110B 1170 11B3;
+C6F5;C6F5;110B 1170 11B4;C6F5;110B 1170 11B4;
+C6F6;C6F6;110B 1170 11B5;C6F6;110B 1170 11B5;
+C6F7;C6F7;110B 1170 11B6;C6F7;110B 1170 11B6;
+C6F8;C6F8;110B 1170 11B7;C6F8;110B 1170 11B7;
+C6F9;C6F9;110B 1170 11B8;C6F9;110B 1170 11B8;
+C6FA;C6FA;110B 1170 11B9;C6FA;110B 1170 11B9;
+C6FB;C6FB;110B 1170 11BA;C6FB;110B 1170 11BA;
+C6FC;C6FC;110B 1170 11BB;C6FC;110B 1170 11BB;
+C6FD;C6FD;110B 1170 11BC;C6FD;110B 1170 11BC;
+C6FE;C6FE;110B 1170 11BD;C6FE;110B 1170 11BD;
+C6FF;C6FF;110B 1170 11BE;C6FF;110B 1170 11BE;
+C700;C700;110B 1170 11BF;C700;110B 1170 11BF;
+C701;C701;110B 1170 11C0;C701;110B 1170 11C0;
+C702;C702;110B 1170 11C1;C702;110B 1170 11C1;
+C703;C703;110B 1170 11C2;C703;110B 1170 11C2;
+C704;C704;110B 1171;C704;110B 1171;
+C705;C705;110B 1171 11A8;C705;110B 1171 11A8;
+C706;C706;110B 1171 11A9;C706;110B 1171 11A9;
+C707;C707;110B 1171 11AA;C707;110B 1171 11AA;
+C708;C708;110B 1171 11AB;C708;110B 1171 11AB;
+C709;C709;110B 1171 11AC;C709;110B 1171 11AC;
+C70A;C70A;110B 1171 11AD;C70A;110B 1171 11AD;
+C70B;C70B;110B 1171 11AE;C70B;110B 1171 11AE;
+C70C;C70C;110B 1171 11AF;C70C;110B 1171 11AF;
+C70D;C70D;110B 1171 11B0;C70D;110B 1171 11B0;
+C70E;C70E;110B 1171 11B1;C70E;110B 1171 11B1;
+C70F;C70F;110B 1171 11B2;C70F;110B 1171 11B2;
+C710;C710;110B 1171 11B3;C710;110B 1171 11B3;
+C711;C711;110B 1171 11B4;C711;110B 1171 11B4;
+C712;C712;110B 1171 11B5;C712;110B 1171 11B5;
+C713;C713;110B 1171 11B6;C713;110B 1171 11B6;
+C714;C714;110B 1171 11B7;C714;110B 1171 11B7;
+C715;C715;110B 1171 11B8;C715;110B 1171 11B8;
+C716;C716;110B 1171 11B9;C716;110B 1171 11B9;
+C717;C717;110B 1171 11BA;C717;110B 1171 11BA;
+C718;C718;110B 1171 11BB;C718;110B 1171 11BB;
+C719;C719;110B 1171 11BC;C719;110B 1171 11BC;
+C71A;C71A;110B 1171 11BD;C71A;110B 1171 11BD;
+C71B;C71B;110B 1171 11BE;C71B;110B 1171 11BE;
+C71C;C71C;110B 1171 11BF;C71C;110B 1171 11BF;
+C71D;C71D;110B 1171 11C0;C71D;110B 1171 11C0;
+C71E;C71E;110B 1171 11C1;C71E;110B 1171 11C1;
+C71F;C71F;110B 1171 11C2;C71F;110B 1171 11C2;
+C720;C720;110B 1172;C720;110B 1172;
+C721;C721;110B 1172 11A8;C721;110B 1172 11A8;
+C722;C722;110B 1172 11A9;C722;110B 1172 11A9;
+C723;C723;110B 1172 11AA;C723;110B 1172 11AA;
+C724;C724;110B 1172 11AB;C724;110B 1172 11AB;
+C725;C725;110B 1172 11AC;C725;110B 1172 11AC;
+C726;C726;110B 1172 11AD;C726;110B 1172 11AD;
+C727;C727;110B 1172 11AE;C727;110B 1172 11AE;
+C728;C728;110B 1172 11AF;C728;110B 1172 11AF;
+C729;C729;110B 1172 11B0;C729;110B 1172 11B0;
+C72A;C72A;110B 1172 11B1;C72A;110B 1172 11B1;
+C72B;C72B;110B 1172 11B2;C72B;110B 1172 11B2;
+C72C;C72C;110B 1172 11B3;C72C;110B 1172 11B3;
+C72D;C72D;110B 1172 11B4;C72D;110B 1172 11B4;
+C72E;C72E;110B 1172 11B5;C72E;110B 1172 11B5;
+C72F;C72F;110B 1172 11B6;C72F;110B 1172 11B6;
+C730;C730;110B 1172 11B7;C730;110B 1172 11B7;
+C731;C731;110B 1172 11B8;C731;110B 1172 11B8;
+C732;C732;110B 1172 11B9;C732;110B 1172 11B9;
+C733;C733;110B 1172 11BA;C733;110B 1172 11BA;
+C734;C734;110B 1172 11BB;C734;110B 1172 11BB;
+C735;C735;110B 1172 11BC;C735;110B 1172 11BC;
+C736;C736;110B 1172 11BD;C736;110B 1172 11BD;
+C737;C737;110B 1172 11BE;C737;110B 1172 11BE;
+C738;C738;110B 1172 11BF;C738;110B 1172 11BF;
+C739;C739;110B 1172 11C0;C739;110B 1172 11C0;
+C73A;C73A;110B 1172 11C1;C73A;110B 1172 11C1;
+C73B;C73B;110B 1172 11C2;C73B;110B 1172 11C2;
+C73C;C73C;110B 1173;C73C;110B 1173;
+C73D;C73D;110B 1173 11A8;C73D;110B 1173 11A8;
+C73E;C73E;110B 1173 11A9;C73E;110B 1173 11A9;
+C73F;C73F;110B 1173 11AA;C73F;110B 1173 11AA;
+C740;C740;110B 1173 11AB;C740;110B 1173 11AB;
+C741;C741;110B 1173 11AC;C741;110B 1173 11AC;
+C742;C742;110B 1173 11AD;C742;110B 1173 11AD;
+C743;C743;110B 1173 11AE;C743;110B 1173 11AE;
+C744;C744;110B 1173 11AF;C744;110B 1173 11AF;
+C745;C745;110B 1173 11B0;C745;110B 1173 11B0;
+C746;C746;110B 1173 11B1;C746;110B 1173 11B1;
+C747;C747;110B 1173 11B2;C747;110B 1173 11B2;
+C748;C748;110B 1173 11B3;C748;110B 1173 11B3;
+C749;C749;110B 1173 11B4;C749;110B 1173 11B4;
+C74A;C74A;110B 1173 11B5;C74A;110B 1173 11B5;
+C74B;C74B;110B 1173 11B6;C74B;110B 1173 11B6;
+C74C;C74C;110B 1173 11B7;C74C;110B 1173 11B7;
+C74D;C74D;110B 1173 11B8;C74D;110B 1173 11B8;
+C74E;C74E;110B 1173 11B9;C74E;110B 1173 11B9;
+C74F;C74F;110B 1173 11BA;C74F;110B 1173 11BA;
+C750;C750;110B 1173 11BB;C750;110B 1173 11BB;
+C751;C751;110B 1173 11BC;C751;110B 1173 11BC;
+C752;C752;110B 1173 11BD;C752;110B 1173 11BD;
+C753;C753;110B 1173 11BE;C753;110B 1173 11BE;
+C754;C754;110B 1173 11BF;C754;110B 1173 11BF;
+C755;C755;110B 1173 11C0;C755;110B 1173 11C0;
+C756;C756;110B 1173 11C1;C756;110B 1173 11C1;
+C757;C757;110B 1173 11C2;C757;110B 1173 11C2;
+C758;C758;110B 1174;C758;110B 1174;
+C759;C759;110B 1174 11A8;C759;110B 1174 11A8;
+C75A;C75A;110B 1174 11A9;C75A;110B 1174 11A9;
+C75B;C75B;110B 1174 11AA;C75B;110B 1174 11AA;
+C75C;C75C;110B 1174 11AB;C75C;110B 1174 11AB;
+C75D;C75D;110B 1174 11AC;C75D;110B 1174 11AC;
+C75E;C75E;110B 1174 11AD;C75E;110B 1174 11AD;
+C75F;C75F;110B 1174 11AE;C75F;110B 1174 11AE;
+C760;C760;110B 1174 11AF;C760;110B 1174 11AF;
+C761;C761;110B 1174 11B0;C761;110B 1174 11B0;
+C762;C762;110B 1174 11B1;C762;110B 1174 11B1;
+C763;C763;110B 1174 11B2;C763;110B 1174 11B2;
+C764;C764;110B 1174 11B3;C764;110B 1174 11B3;
+C765;C765;110B 1174 11B4;C765;110B 1174 11B4;
+C766;C766;110B 1174 11B5;C766;110B 1174 11B5;
+C767;C767;110B 1174 11B6;C767;110B 1174 11B6;
+C768;C768;110B 1174 11B7;C768;110B 1174 11B7;
+C769;C769;110B 1174 11B8;C769;110B 1174 11B8;
+C76A;C76A;110B 1174 11B9;C76A;110B 1174 11B9;
+C76B;C76B;110B 1174 11BA;C76B;110B 1174 11BA;
+C76C;C76C;110B 1174 11BB;C76C;110B 1174 11BB;
+C76D;C76D;110B 1174 11BC;C76D;110B 1174 11BC;
+C76E;C76E;110B 1174 11BD;C76E;110B 1174 11BD;
+C76F;C76F;110B 1174 11BE;C76F;110B 1174 11BE;
+C770;C770;110B 1174 11BF;C770;110B 1174 11BF;
+C771;C771;110B 1174 11C0;C771;110B 1174 11C0;
+C772;C772;110B 1174 11C1;C772;110B 1174 11C1;
+C773;C773;110B 1174 11C2;C773;110B 1174 11C2;
+C774;C774;110B 1175;C774;110B 1175;
+C775;C775;110B 1175 11A8;C775;110B 1175 11A8;
+C776;C776;110B 1175 11A9;C776;110B 1175 11A9;
+C777;C777;110B 1175 11AA;C777;110B 1175 11AA;
+C778;C778;110B 1175 11AB;C778;110B 1175 11AB;
+C779;C779;110B 1175 11AC;C779;110B 1175 11AC;
+C77A;C77A;110B 1175 11AD;C77A;110B 1175 11AD;
+C77B;C77B;110B 1175 11AE;C77B;110B 1175 11AE;
+C77C;C77C;110B 1175 11AF;C77C;110B 1175 11AF;
+C77D;C77D;110B 1175 11B0;C77D;110B 1175 11B0;
+C77E;C77E;110B 1175 11B1;C77E;110B 1175 11B1;
+C77F;C77F;110B 1175 11B2;C77F;110B 1175 11B2;
+C780;C780;110B 1175 11B3;C780;110B 1175 11B3;
+C781;C781;110B 1175 11B4;C781;110B 1175 11B4;
+C782;C782;110B 1175 11B5;C782;110B 1175 11B5;
+C783;C783;110B 1175 11B6;C783;110B 1175 11B6;
+C784;C784;110B 1175 11B7;C784;110B 1175 11B7;
+C785;C785;110B 1175 11B8;C785;110B 1175 11B8;
+C786;C786;110B 1175 11B9;C786;110B 1175 11B9;
+C787;C787;110B 1175 11BA;C787;110B 1175 11BA;
+C788;C788;110B 1175 11BB;C788;110B 1175 11BB;
+C789;C789;110B 1175 11BC;C789;110B 1175 11BC;
+C78A;C78A;110B 1175 11BD;C78A;110B 1175 11BD;
+C78B;C78B;110B 1175 11BE;C78B;110B 1175 11BE;
+C78C;C78C;110B 1175 11BF;C78C;110B 1175 11BF;
+C78D;C78D;110B 1175 11C0;C78D;110B 1175 11C0;
+C78E;C78E;110B 1175 11C1;C78E;110B 1175 11C1;
+C78F;C78F;110B 1175 11C2;C78F;110B 1175 11C2;
+C790;C790;110C 1161;C790;110C 1161;
+C791;C791;110C 1161 11A8;C791;110C 1161 11A8;
+C792;C792;110C 1161 11A9;C792;110C 1161 11A9;
+C793;C793;110C 1161 11AA;C793;110C 1161 11AA;
+C794;C794;110C 1161 11AB;C794;110C 1161 11AB;
+C795;C795;110C 1161 11AC;C795;110C 1161 11AC;
+C796;C796;110C 1161 11AD;C796;110C 1161 11AD;
+C797;C797;110C 1161 11AE;C797;110C 1161 11AE;
+C798;C798;110C 1161 11AF;C798;110C 1161 11AF;
+C799;C799;110C 1161 11B0;C799;110C 1161 11B0;
+C79A;C79A;110C 1161 11B1;C79A;110C 1161 11B1;
+C79B;C79B;110C 1161 11B2;C79B;110C 1161 11B2;
+C79C;C79C;110C 1161 11B3;C79C;110C 1161 11B3;
+C79D;C79D;110C 1161 11B4;C79D;110C 1161 11B4;
+C79E;C79E;110C 1161 11B5;C79E;110C 1161 11B5;
+C79F;C79F;110C 1161 11B6;C79F;110C 1161 11B6;
+C7A0;C7A0;110C 1161 11B7;C7A0;110C 1161 11B7;
+C7A1;C7A1;110C 1161 11B8;C7A1;110C 1161 11B8;
+C7A2;C7A2;110C 1161 11B9;C7A2;110C 1161 11B9;
+C7A3;C7A3;110C 1161 11BA;C7A3;110C 1161 11BA;
+C7A4;C7A4;110C 1161 11BB;C7A4;110C 1161 11BB;
+C7A5;C7A5;110C 1161 11BC;C7A5;110C 1161 11BC;
+C7A6;C7A6;110C 1161 11BD;C7A6;110C 1161 11BD;
+C7A7;C7A7;110C 1161 11BE;C7A7;110C 1161 11BE;
+C7A8;C7A8;110C 1161 11BF;C7A8;110C 1161 11BF;
+C7A9;C7A9;110C 1161 11C0;C7A9;110C 1161 11C0;
+C7AA;C7AA;110C 1161 11C1;C7AA;110C 1161 11C1;
+C7AB;C7AB;110C 1161 11C2;C7AB;110C 1161 11C2;
+C7AC;C7AC;110C 1162;C7AC;110C 1162;
+C7AD;C7AD;110C 1162 11A8;C7AD;110C 1162 11A8;
+C7AE;C7AE;110C 1162 11A9;C7AE;110C 1162 11A9;
+C7AF;C7AF;110C 1162 11AA;C7AF;110C 1162 11AA;
+C7B0;C7B0;110C 1162 11AB;C7B0;110C 1162 11AB;
+C7B1;C7B1;110C 1162 11AC;C7B1;110C 1162 11AC;
+C7B2;C7B2;110C 1162 11AD;C7B2;110C 1162 11AD;
+C7B3;C7B3;110C 1162 11AE;C7B3;110C 1162 11AE;
+C7B4;C7B4;110C 1162 11AF;C7B4;110C 1162 11AF;
+C7B5;C7B5;110C 1162 11B0;C7B5;110C 1162 11B0;
+C7B6;C7B6;110C 1162 11B1;C7B6;110C 1162 11B1;
+C7B7;C7B7;110C 1162 11B2;C7B7;110C 1162 11B2;
+C7B8;C7B8;110C 1162 11B3;C7B8;110C 1162 11B3;
+C7B9;C7B9;110C 1162 11B4;C7B9;110C 1162 11B4;
+C7BA;C7BA;110C 1162 11B5;C7BA;110C 1162 11B5;
+C7BB;C7BB;110C 1162 11B6;C7BB;110C 1162 11B6;
+C7BC;C7BC;110C 1162 11B7;C7BC;110C 1162 11B7;
+C7BD;C7BD;110C 1162 11B8;C7BD;110C 1162 11B8;
+C7BE;C7BE;110C 1162 11B9;C7BE;110C 1162 11B9;
+C7BF;C7BF;110C 1162 11BA;C7BF;110C 1162 11BA;
+C7C0;C7C0;110C 1162 11BB;C7C0;110C 1162 11BB;
+C7C1;C7C1;110C 1162 11BC;C7C1;110C 1162 11BC;
+C7C2;C7C2;110C 1162 11BD;C7C2;110C 1162 11BD;
+C7C3;C7C3;110C 1162 11BE;C7C3;110C 1162 11BE;
+C7C4;C7C4;110C 1162 11BF;C7C4;110C 1162 11BF;
+C7C5;C7C5;110C 1162 11C0;C7C5;110C 1162 11C0;
+C7C6;C7C6;110C 1162 11C1;C7C6;110C 1162 11C1;
+C7C7;C7C7;110C 1162 11C2;C7C7;110C 1162 11C2;
+C7C8;C7C8;110C 1163;C7C8;110C 1163;
+C7C9;C7C9;110C 1163 11A8;C7C9;110C 1163 11A8;
+C7CA;C7CA;110C 1163 11A9;C7CA;110C 1163 11A9;
+C7CB;C7CB;110C 1163 11AA;C7CB;110C 1163 11AA;
+C7CC;C7CC;110C 1163 11AB;C7CC;110C 1163 11AB;
+C7CD;C7CD;110C 1163 11AC;C7CD;110C 1163 11AC;
+C7CE;C7CE;110C 1163 11AD;C7CE;110C 1163 11AD;
+C7CF;C7CF;110C 1163 11AE;C7CF;110C 1163 11AE;
+C7D0;C7D0;110C 1163 11AF;C7D0;110C 1163 11AF;
+C7D1;C7D1;110C 1163 11B0;C7D1;110C 1163 11B0;
+C7D2;C7D2;110C 1163 11B1;C7D2;110C 1163 11B1;
+C7D3;C7D3;110C 1163 11B2;C7D3;110C 1163 11B2;
+C7D4;C7D4;110C 1163 11B3;C7D4;110C 1163 11B3;
+C7D5;C7D5;110C 1163 11B4;C7D5;110C 1163 11B4;
+C7D6;C7D6;110C 1163 11B5;C7D6;110C 1163 11B5;
+C7D7;C7D7;110C 1163 11B6;C7D7;110C 1163 11B6;
+C7D8;C7D8;110C 1163 11B7;C7D8;110C 1163 11B7;
+C7D9;C7D9;110C 1163 11B8;C7D9;110C 1163 11B8;
+C7DA;C7DA;110C 1163 11B9;C7DA;110C 1163 11B9;
+C7DB;C7DB;110C 1163 11BA;C7DB;110C 1163 11BA;
+C7DC;C7DC;110C 1163 11BB;C7DC;110C 1163 11BB;
+C7DD;C7DD;110C 1163 11BC;C7DD;110C 1163 11BC;
+C7DE;C7DE;110C 1163 11BD;C7DE;110C 1163 11BD;
+C7DF;C7DF;110C 1163 11BE;C7DF;110C 1163 11BE;
+C7E0;C7E0;110C 1163 11BF;C7E0;110C 1163 11BF;
+C7E1;C7E1;110C 1163 11C0;C7E1;110C 1163 11C0;
+C7E2;C7E2;110C 1163 11C1;C7E2;110C 1163 11C1;
+C7E3;C7E3;110C 1163 11C2;C7E3;110C 1163 11C2;
+C7E4;C7E4;110C 1164;C7E4;110C 1164;
+C7E5;C7E5;110C 1164 11A8;C7E5;110C 1164 11A8;
+C7E6;C7E6;110C 1164 11A9;C7E6;110C 1164 11A9;
+C7E7;C7E7;110C 1164 11AA;C7E7;110C 1164 11AA;
+C7E8;C7E8;110C 1164 11AB;C7E8;110C 1164 11AB;
+C7E9;C7E9;110C 1164 11AC;C7E9;110C 1164 11AC;
+C7EA;C7EA;110C 1164 11AD;C7EA;110C 1164 11AD;
+C7EB;C7EB;110C 1164 11AE;C7EB;110C 1164 11AE;
+C7EC;C7EC;110C 1164 11AF;C7EC;110C 1164 11AF;
+C7ED;C7ED;110C 1164 11B0;C7ED;110C 1164 11B0;
+C7EE;C7EE;110C 1164 11B1;C7EE;110C 1164 11B1;
+C7EF;C7EF;110C 1164 11B2;C7EF;110C 1164 11B2;
+C7F0;C7F0;110C 1164 11B3;C7F0;110C 1164 11B3;
+C7F1;C7F1;110C 1164 11B4;C7F1;110C 1164 11B4;
+C7F2;C7F2;110C 1164 11B5;C7F2;110C 1164 11B5;
+C7F3;C7F3;110C 1164 11B6;C7F3;110C 1164 11B6;
+C7F4;C7F4;110C 1164 11B7;C7F4;110C 1164 11B7;
+C7F5;C7F5;110C 1164 11B8;C7F5;110C 1164 11B8;
+C7F6;C7F6;110C 1164 11B9;C7F6;110C 1164 11B9;
+C7F7;C7F7;110C 1164 11BA;C7F7;110C 1164 11BA;
+C7F8;C7F8;110C 1164 11BB;C7F8;110C 1164 11BB;
+C7F9;C7F9;110C 1164 11BC;C7F9;110C 1164 11BC;
+C7FA;C7FA;110C 1164 11BD;C7FA;110C 1164 11BD;
+C7FB;C7FB;110C 1164 11BE;C7FB;110C 1164 11BE;
+C7FC;C7FC;110C 1164 11BF;C7FC;110C 1164 11BF;
+C7FD;C7FD;110C 1164 11C0;C7FD;110C 1164 11C0;
+C7FE;C7FE;110C 1164 11C1;C7FE;110C 1164 11C1;
+C7FF;C7FF;110C 1164 11C2;C7FF;110C 1164 11C2;
+C800;C800;110C 1165;C800;110C 1165;
+C801;C801;110C 1165 11A8;C801;110C 1165 11A8;
+C802;C802;110C 1165 11A9;C802;110C 1165 11A9;
+C803;C803;110C 1165 11AA;C803;110C 1165 11AA;
+C804;C804;110C 1165 11AB;C804;110C 1165 11AB;
+C805;C805;110C 1165 11AC;C805;110C 1165 11AC;
+C806;C806;110C 1165 11AD;C806;110C 1165 11AD;
+C807;C807;110C 1165 11AE;C807;110C 1165 11AE;
+C808;C808;110C 1165 11AF;C808;110C 1165 11AF;
+C809;C809;110C 1165 11B0;C809;110C 1165 11B0;
+C80A;C80A;110C 1165 11B1;C80A;110C 1165 11B1;
+C80B;C80B;110C 1165 11B2;C80B;110C 1165 11B2;
+C80C;C80C;110C 1165 11B3;C80C;110C 1165 11B3;
+C80D;C80D;110C 1165 11B4;C80D;110C 1165 11B4;
+C80E;C80E;110C 1165 11B5;C80E;110C 1165 11B5;
+C80F;C80F;110C 1165 11B6;C80F;110C 1165 11B6;
+C810;C810;110C 1165 11B7;C810;110C 1165 11B7;
+C811;C811;110C 1165 11B8;C811;110C 1165 11B8;
+C812;C812;110C 1165 11B9;C812;110C 1165 11B9;
+C813;C813;110C 1165 11BA;C813;110C 1165 11BA;
+C814;C814;110C 1165 11BB;C814;110C 1165 11BB;
+C815;C815;110C 1165 11BC;C815;110C 1165 11BC;
+C816;C816;110C 1165 11BD;C816;110C 1165 11BD;
+C817;C817;110C 1165 11BE;C817;110C 1165 11BE;
+C818;C818;110C 1165 11BF;C818;110C 1165 11BF;
+C819;C819;110C 1165 11C0;C819;110C 1165 11C0;
+C81A;C81A;110C 1165 11C1;C81A;110C 1165 11C1;
+C81B;C81B;110C 1165 11C2;C81B;110C 1165 11C2;
+C81C;C81C;110C 1166;C81C;110C 1166;
+C81D;C81D;110C 1166 11A8;C81D;110C 1166 11A8;
+C81E;C81E;110C 1166 11A9;C81E;110C 1166 11A9;
+C81F;C81F;110C 1166 11AA;C81F;110C 1166 11AA;
+C820;C820;110C 1166 11AB;C820;110C 1166 11AB;
+C821;C821;110C 1166 11AC;C821;110C 1166 11AC;
+C822;C822;110C 1166 11AD;C822;110C 1166 11AD;
+C823;C823;110C 1166 11AE;C823;110C 1166 11AE;
+C824;C824;110C 1166 11AF;C824;110C 1166 11AF;
+C825;C825;110C 1166 11B0;C825;110C 1166 11B0;
+C826;C826;110C 1166 11B1;C826;110C 1166 11B1;
+C827;C827;110C 1166 11B2;C827;110C 1166 11B2;
+C828;C828;110C 1166 11B3;C828;110C 1166 11B3;
+C829;C829;110C 1166 11B4;C829;110C 1166 11B4;
+C82A;C82A;110C 1166 11B5;C82A;110C 1166 11B5;
+C82B;C82B;110C 1166 11B6;C82B;110C 1166 11B6;
+C82C;C82C;110C 1166 11B7;C82C;110C 1166 11B7;
+C82D;C82D;110C 1166 11B8;C82D;110C 1166 11B8;
+C82E;C82E;110C 1166 11B9;C82E;110C 1166 11B9;
+C82F;C82F;110C 1166 11BA;C82F;110C 1166 11BA;
+C830;C830;110C 1166 11BB;C830;110C 1166 11BB;
+C831;C831;110C 1166 11BC;C831;110C 1166 11BC;
+C832;C832;110C 1166 11BD;C832;110C 1166 11BD;
+C833;C833;110C 1166 11BE;C833;110C 1166 11BE;
+C834;C834;110C 1166 11BF;C834;110C 1166 11BF;
+C835;C835;110C 1166 11C0;C835;110C 1166 11C0;
+C836;C836;110C 1166 11C1;C836;110C 1166 11C1;
+C837;C837;110C 1166 11C2;C837;110C 1166 11C2;
+C838;C838;110C 1167;C838;110C 1167;
+C839;C839;110C 1167 11A8;C839;110C 1167 11A8;
+C83A;C83A;110C 1167 11A9;C83A;110C 1167 11A9;
+C83B;C83B;110C 1167 11AA;C83B;110C 1167 11AA;
+C83C;C83C;110C 1167 11AB;C83C;110C 1167 11AB;
+C83D;C83D;110C 1167 11AC;C83D;110C 1167 11AC;
+C83E;C83E;110C 1167 11AD;C83E;110C 1167 11AD;
+C83F;C83F;110C 1167 11AE;C83F;110C 1167 11AE;
+C840;C840;110C 1167 11AF;C840;110C 1167 11AF;
+C841;C841;110C 1167 11B0;C841;110C 1167 11B0;
+C842;C842;110C 1167 11B1;C842;110C 1167 11B1;
+C843;C843;110C 1167 11B2;C843;110C 1167 11B2;
+C844;C844;110C 1167 11B3;C844;110C 1167 11B3;
+C845;C845;110C 1167 11B4;C845;110C 1167 11B4;
+C846;C846;110C 1167 11B5;C846;110C 1167 11B5;
+C847;C847;110C 1167 11B6;C847;110C 1167 11B6;
+C848;C848;110C 1167 11B7;C848;110C 1167 11B7;
+C849;C849;110C 1167 11B8;C849;110C 1167 11B8;
+C84A;C84A;110C 1167 11B9;C84A;110C 1167 11B9;
+C84B;C84B;110C 1167 11BA;C84B;110C 1167 11BA;
+C84C;C84C;110C 1167 11BB;C84C;110C 1167 11BB;
+C84D;C84D;110C 1167 11BC;C84D;110C 1167 11BC;
+C84E;C84E;110C 1167 11BD;C84E;110C 1167 11BD;
+C84F;C84F;110C 1167 11BE;C84F;110C 1167 11BE;
+C850;C850;110C 1167 11BF;C850;110C 1167 11BF;
+C851;C851;110C 1167 11C0;C851;110C 1167 11C0;
+C852;C852;110C 1167 11C1;C852;110C 1167 11C1;
+C853;C853;110C 1167 11C2;C853;110C 1167 11C2;
+C854;C854;110C 1168;C854;110C 1168;
+C855;C855;110C 1168 11A8;C855;110C 1168 11A8;
+C856;C856;110C 1168 11A9;C856;110C 1168 11A9;
+C857;C857;110C 1168 11AA;C857;110C 1168 11AA;
+C858;C858;110C 1168 11AB;C858;110C 1168 11AB;
+C859;C859;110C 1168 11AC;C859;110C 1168 11AC;
+C85A;C85A;110C 1168 11AD;C85A;110C 1168 11AD;
+C85B;C85B;110C 1168 11AE;C85B;110C 1168 11AE;
+C85C;C85C;110C 1168 11AF;C85C;110C 1168 11AF;
+C85D;C85D;110C 1168 11B0;C85D;110C 1168 11B0;
+C85E;C85E;110C 1168 11B1;C85E;110C 1168 11B1;
+C85F;C85F;110C 1168 11B2;C85F;110C 1168 11B2;
+C860;C860;110C 1168 11B3;C860;110C 1168 11B3;
+C861;C861;110C 1168 11B4;C861;110C 1168 11B4;
+C862;C862;110C 1168 11B5;C862;110C 1168 11B5;
+C863;C863;110C 1168 11B6;C863;110C 1168 11B6;
+C864;C864;110C 1168 11B7;C864;110C 1168 11B7;
+C865;C865;110C 1168 11B8;C865;110C 1168 11B8;
+C866;C866;110C 1168 11B9;C866;110C 1168 11B9;
+C867;C867;110C 1168 11BA;C867;110C 1168 11BA;
+C868;C868;110C 1168 11BB;C868;110C 1168 11BB;
+C869;C869;110C 1168 11BC;C869;110C 1168 11BC;
+C86A;C86A;110C 1168 11BD;C86A;110C 1168 11BD;
+C86B;C86B;110C 1168 11BE;C86B;110C 1168 11BE;
+C86C;C86C;110C 1168 11BF;C86C;110C 1168 11BF;
+C86D;C86D;110C 1168 11C0;C86D;110C 1168 11C0;
+C86E;C86E;110C 1168 11C1;C86E;110C 1168 11C1;
+C86F;C86F;110C 1168 11C2;C86F;110C 1168 11C2;
+C870;C870;110C 1169;C870;110C 1169;
+C871;C871;110C 1169 11A8;C871;110C 1169 11A8;
+C872;C872;110C 1169 11A9;C872;110C 1169 11A9;
+C873;C873;110C 1169 11AA;C873;110C 1169 11AA;
+C874;C874;110C 1169 11AB;C874;110C 1169 11AB;
+C875;C875;110C 1169 11AC;C875;110C 1169 11AC;
+C876;C876;110C 1169 11AD;C876;110C 1169 11AD;
+C877;C877;110C 1169 11AE;C877;110C 1169 11AE;
+C878;C878;110C 1169 11AF;C878;110C 1169 11AF;
+C879;C879;110C 1169 11B0;C879;110C 1169 11B0;
+C87A;C87A;110C 1169 11B1;C87A;110C 1169 11B1;
+C87B;C87B;110C 1169 11B2;C87B;110C 1169 11B2;
+C87C;C87C;110C 1169 11B3;C87C;110C 1169 11B3;
+C87D;C87D;110C 1169 11B4;C87D;110C 1169 11B4;
+C87E;C87E;110C 1169 11B5;C87E;110C 1169 11B5;
+C87F;C87F;110C 1169 11B6;C87F;110C 1169 11B6;
+C880;C880;110C 1169 11B7;C880;110C 1169 11B7;
+C881;C881;110C 1169 11B8;C881;110C 1169 11B8;
+C882;C882;110C 1169 11B9;C882;110C 1169 11B9;
+C883;C883;110C 1169 11BA;C883;110C 1169 11BA;
+C884;C884;110C 1169 11BB;C884;110C 1169 11BB;
+C885;C885;110C 1169 11BC;C885;110C 1169 11BC;
+C886;C886;110C 1169 11BD;C886;110C 1169 11BD;
+C887;C887;110C 1169 11BE;C887;110C 1169 11BE;
+C888;C888;110C 1169 11BF;C888;110C 1169 11BF;
+C889;C889;110C 1169 11C0;C889;110C 1169 11C0;
+C88A;C88A;110C 1169 11C1;C88A;110C 1169 11C1;
+C88B;C88B;110C 1169 11C2;C88B;110C 1169 11C2;
+C88C;C88C;110C 116A;C88C;110C 116A;
+C88D;C88D;110C 116A 11A8;C88D;110C 116A 11A8;
+C88E;C88E;110C 116A 11A9;C88E;110C 116A 11A9;
+C88F;C88F;110C 116A 11AA;C88F;110C 116A 11AA;
+C890;C890;110C 116A 11AB;C890;110C 116A 11AB;
+C891;C891;110C 116A 11AC;C891;110C 116A 11AC;
+C892;C892;110C 116A 11AD;C892;110C 116A 11AD;
+C893;C893;110C 116A 11AE;C893;110C 116A 11AE;
+C894;C894;110C 116A 11AF;C894;110C 116A 11AF;
+C895;C895;110C 116A 11B0;C895;110C 116A 11B0;
+C896;C896;110C 116A 11B1;C896;110C 116A 11B1;
+C897;C897;110C 116A 11B2;C897;110C 116A 11B2;
+C898;C898;110C 116A 11B3;C898;110C 116A 11B3;
+C899;C899;110C 116A 11B4;C899;110C 116A 11B4;
+C89A;C89A;110C 116A 11B5;C89A;110C 116A 11B5;
+C89B;C89B;110C 116A 11B6;C89B;110C 116A 11B6;
+C89C;C89C;110C 116A 11B7;C89C;110C 116A 11B7;
+C89D;C89D;110C 116A 11B8;C89D;110C 116A 11B8;
+C89E;C89E;110C 116A 11B9;C89E;110C 116A 11B9;
+C89F;C89F;110C 116A 11BA;C89F;110C 116A 11BA;
+C8A0;C8A0;110C 116A 11BB;C8A0;110C 116A 11BB;
+C8A1;C8A1;110C 116A 11BC;C8A1;110C 116A 11BC;
+C8A2;C8A2;110C 116A 11BD;C8A2;110C 116A 11BD;
+C8A3;C8A3;110C 116A 11BE;C8A3;110C 116A 11BE;
+C8A4;C8A4;110C 116A 11BF;C8A4;110C 116A 11BF;
+C8A5;C8A5;110C 116A 11C0;C8A5;110C 116A 11C0;
+C8A6;C8A6;110C 116A 11C1;C8A6;110C 116A 11C1;
+C8A7;C8A7;110C 116A 11C2;C8A7;110C 116A 11C2;
+C8A8;C8A8;110C 116B;C8A8;110C 116B;
+C8A9;C8A9;110C 116B 11A8;C8A9;110C 116B 11A8;
+C8AA;C8AA;110C 116B 11A9;C8AA;110C 116B 11A9;
+C8AB;C8AB;110C 116B 11AA;C8AB;110C 116B 11AA;
+C8AC;C8AC;110C 116B 11AB;C8AC;110C 116B 11AB;
+C8AD;C8AD;110C 116B 11AC;C8AD;110C 116B 11AC;
+C8AE;C8AE;110C 116B 11AD;C8AE;110C 116B 11AD;
+C8AF;C8AF;110C 116B 11AE;C8AF;110C 116B 11AE;
+C8B0;C8B0;110C 116B 11AF;C8B0;110C 116B 11AF;
+C8B1;C8B1;110C 116B 11B0;C8B1;110C 116B 11B0;
+C8B2;C8B2;110C 116B 11B1;C8B2;110C 116B 11B1;
+C8B3;C8B3;110C 116B 11B2;C8B3;110C 116B 11B2;
+C8B4;C8B4;110C 116B 11B3;C8B4;110C 116B 11B3;
+C8B5;C8B5;110C 116B 11B4;C8B5;110C 116B 11B4;
+C8B6;C8B6;110C 116B 11B5;C8B6;110C 116B 11B5;
+C8B7;C8B7;110C 116B 11B6;C8B7;110C 116B 11B6;
+C8B8;C8B8;110C 116B 11B7;C8B8;110C 116B 11B7;
+C8B9;C8B9;110C 116B 11B8;C8B9;110C 116B 11B8;
+C8BA;C8BA;110C 116B 11B9;C8BA;110C 116B 11B9;
+C8BB;C8BB;110C 116B 11BA;C8BB;110C 116B 11BA;
+C8BC;C8BC;110C 116B 11BB;C8BC;110C 116B 11BB;
+C8BD;C8BD;110C 116B 11BC;C8BD;110C 116B 11BC;
+C8BE;C8BE;110C 116B 11BD;C8BE;110C 116B 11BD;
+C8BF;C8BF;110C 116B 11BE;C8BF;110C 116B 11BE;
+C8C0;C8C0;110C 116B 11BF;C8C0;110C 116B 11BF;
+C8C1;C8C1;110C 116B 11C0;C8C1;110C 116B 11C0;
+C8C2;C8C2;110C 116B 11C1;C8C2;110C 116B 11C1;
+C8C3;C8C3;110C 116B 11C2;C8C3;110C 116B 11C2;
+C8C4;C8C4;110C 116C;C8C4;110C 116C;
+C8C5;C8C5;110C 116C 11A8;C8C5;110C 116C 11A8;
+C8C6;C8C6;110C 116C 11A9;C8C6;110C 116C 11A9;
+C8C7;C8C7;110C 116C 11AA;C8C7;110C 116C 11AA;
+C8C8;C8C8;110C 116C 11AB;C8C8;110C 116C 11AB;
+C8C9;C8C9;110C 116C 11AC;C8C9;110C 116C 11AC;
+C8CA;C8CA;110C 116C 11AD;C8CA;110C 116C 11AD;
+C8CB;C8CB;110C 116C 11AE;C8CB;110C 116C 11AE;
+C8CC;C8CC;110C 116C 11AF;C8CC;110C 116C 11AF;
+C8CD;C8CD;110C 116C 11B0;C8CD;110C 116C 11B0;
+C8CE;C8CE;110C 116C 11B1;C8CE;110C 116C 11B1;
+C8CF;C8CF;110C 116C 11B2;C8CF;110C 116C 11B2;
+C8D0;C8D0;110C 116C 11B3;C8D0;110C 116C 11B3;
+C8D1;C8D1;110C 116C 11B4;C8D1;110C 116C 11B4;
+C8D2;C8D2;110C 116C 11B5;C8D2;110C 116C 11B5;
+C8D3;C8D3;110C 116C 11B6;C8D3;110C 116C 11B6;
+C8D4;C8D4;110C 116C 11B7;C8D4;110C 116C 11B7;
+C8D5;C8D5;110C 116C 11B8;C8D5;110C 116C 11B8;
+C8D6;C8D6;110C 116C 11B9;C8D6;110C 116C 11B9;
+C8D7;C8D7;110C 116C 11BA;C8D7;110C 116C 11BA;
+C8D8;C8D8;110C 116C 11BB;C8D8;110C 116C 11BB;
+C8D9;C8D9;110C 116C 11BC;C8D9;110C 116C 11BC;
+C8DA;C8DA;110C 116C 11BD;C8DA;110C 116C 11BD;
+C8DB;C8DB;110C 116C 11BE;C8DB;110C 116C 11BE;
+C8DC;C8DC;110C 116C 11BF;C8DC;110C 116C 11BF;
+C8DD;C8DD;110C 116C 11C0;C8DD;110C 116C 11C0;
+C8DE;C8DE;110C 116C 11C1;C8DE;110C 116C 11C1;
+C8DF;C8DF;110C 116C 11C2;C8DF;110C 116C 11C2;
+C8E0;C8E0;110C 116D;C8E0;110C 116D;
+C8E1;C8E1;110C 116D 11A8;C8E1;110C 116D 11A8;
+C8E2;C8E2;110C 116D 11A9;C8E2;110C 116D 11A9;
+C8E3;C8E3;110C 116D 11AA;C8E3;110C 116D 11AA;
+C8E4;C8E4;110C 116D 11AB;C8E4;110C 116D 11AB;
+C8E5;C8E5;110C 116D 11AC;C8E5;110C 116D 11AC;
+C8E6;C8E6;110C 116D 11AD;C8E6;110C 116D 11AD;
+C8E7;C8E7;110C 116D 11AE;C8E7;110C 116D 11AE;
+C8E8;C8E8;110C 116D 11AF;C8E8;110C 116D 11AF;
+C8E9;C8E9;110C 116D 11B0;C8E9;110C 116D 11B0;
+C8EA;C8EA;110C 116D 11B1;C8EA;110C 116D 11B1;
+C8EB;C8EB;110C 116D 11B2;C8EB;110C 116D 11B2;
+C8EC;C8EC;110C 116D 11B3;C8EC;110C 116D 11B3;
+C8ED;C8ED;110C 116D 11B4;C8ED;110C 116D 11B4;
+C8EE;C8EE;110C 116D 11B5;C8EE;110C 116D 11B5;
+C8EF;C8EF;110C 116D 11B6;C8EF;110C 116D 11B6;
+C8F0;C8F0;110C 116D 11B7;C8F0;110C 116D 11B7;
+C8F1;C8F1;110C 116D 11B8;C8F1;110C 116D 11B8;
+C8F2;C8F2;110C 116D 11B9;C8F2;110C 116D 11B9;
+C8F3;C8F3;110C 116D 11BA;C8F3;110C 116D 11BA;
+C8F4;C8F4;110C 116D 11BB;C8F4;110C 116D 11BB;
+C8F5;C8F5;110C 116D 11BC;C8F5;110C 116D 11BC;
+C8F6;C8F6;110C 116D 11BD;C8F6;110C 116D 11BD;
+C8F7;C8F7;110C 116D 11BE;C8F7;110C 116D 11BE;
+C8F8;C8F8;110C 116D 11BF;C8F8;110C 116D 11BF;
+C8F9;C8F9;110C 116D 11C0;C8F9;110C 116D 11C0;
+C8FA;C8FA;110C 116D 11C1;C8FA;110C 116D 11C1;
+C8FB;C8FB;110C 116D 11C2;C8FB;110C 116D 11C2;
+C8FC;C8FC;110C 116E;C8FC;110C 116E;
+C8FD;C8FD;110C 116E 11A8;C8FD;110C 116E 11A8;
+C8FE;C8FE;110C 116E 11A9;C8FE;110C 116E 11A9;
+C8FF;C8FF;110C 116E 11AA;C8FF;110C 116E 11AA;
+C900;C900;110C 116E 11AB;C900;110C 116E 11AB;
+C901;C901;110C 116E 11AC;C901;110C 116E 11AC;
+C902;C902;110C 116E 11AD;C902;110C 116E 11AD;
+C903;C903;110C 116E 11AE;C903;110C 116E 11AE;
+C904;C904;110C 116E 11AF;C904;110C 116E 11AF;
+C905;C905;110C 116E 11B0;C905;110C 116E 11B0;
+C906;C906;110C 116E 11B1;C906;110C 116E 11B1;
+C907;C907;110C 116E 11B2;C907;110C 116E 11B2;
+C908;C908;110C 116E 11B3;C908;110C 116E 11B3;
+C909;C909;110C 116E 11B4;C909;110C 116E 11B4;
+C90A;C90A;110C 116E 11B5;C90A;110C 116E 11B5;
+C90B;C90B;110C 116E 11B6;C90B;110C 116E 11B6;
+C90C;C90C;110C 116E 11B7;C90C;110C 116E 11B7;
+C90D;C90D;110C 116E 11B8;C90D;110C 116E 11B8;
+C90E;C90E;110C 116E 11B9;C90E;110C 116E 11B9;
+C90F;C90F;110C 116E 11BA;C90F;110C 116E 11BA;
+C910;C910;110C 116E 11BB;C910;110C 116E 11BB;
+C911;C911;110C 116E 11BC;C911;110C 116E 11BC;
+C912;C912;110C 116E 11BD;C912;110C 116E 11BD;
+C913;C913;110C 116E 11BE;C913;110C 116E 11BE;
+C914;C914;110C 116E 11BF;C914;110C 116E 11BF;
+C915;C915;110C 116E 11C0;C915;110C 116E 11C0;
+C916;C916;110C 116E 11C1;C916;110C 116E 11C1;
+C917;C917;110C 116E 11C2;C917;110C 116E 11C2;
+C918;C918;110C 116F;C918;110C 116F;
+C919;C919;110C 116F 11A8;C919;110C 116F 11A8;
+C91A;C91A;110C 116F 11A9;C91A;110C 116F 11A9;
+C91B;C91B;110C 116F 11AA;C91B;110C 116F 11AA;
+C91C;C91C;110C 116F 11AB;C91C;110C 116F 11AB;
+C91D;C91D;110C 116F 11AC;C91D;110C 116F 11AC;
+C91E;C91E;110C 116F 11AD;C91E;110C 116F 11AD;
+C91F;C91F;110C 116F 11AE;C91F;110C 116F 11AE;
+C920;C920;110C 116F 11AF;C920;110C 116F 11AF;
+C921;C921;110C 116F 11B0;C921;110C 116F 11B0;
+C922;C922;110C 116F 11B1;C922;110C 116F 11B1;
+C923;C923;110C 116F 11B2;C923;110C 116F 11B2;
+C924;C924;110C 116F 11B3;C924;110C 116F 11B3;
+C925;C925;110C 116F 11B4;C925;110C 116F 11B4;
+C926;C926;110C 116F 11B5;C926;110C 116F 11B5;
+C927;C927;110C 116F 11B6;C927;110C 116F 11B6;
+C928;C928;110C 116F 11B7;C928;110C 116F 11B7;
+C929;C929;110C 116F 11B8;C929;110C 116F 11B8;
+C92A;C92A;110C 116F 11B9;C92A;110C 116F 11B9;
+C92B;C92B;110C 116F 11BA;C92B;110C 116F 11BA;
+C92C;C92C;110C 116F 11BB;C92C;110C 116F 11BB;
+C92D;C92D;110C 116F 11BC;C92D;110C 116F 11BC;
+C92E;C92E;110C 116F 11BD;C92E;110C 116F 11BD;
+C92F;C92F;110C 116F 11BE;C92F;110C 116F 11BE;
+C930;C930;110C 116F 11BF;C930;110C 116F 11BF;
+C931;C931;110C 116F 11C0;C931;110C 116F 11C0;
+C932;C932;110C 116F 11C1;C932;110C 116F 11C1;
+C933;C933;110C 116F 11C2;C933;110C 116F 11C2;
+C934;C934;110C 1170;C934;110C 1170;
+C935;C935;110C 1170 11A8;C935;110C 1170 11A8;
+C936;C936;110C 1170 11A9;C936;110C 1170 11A9;
+C937;C937;110C 1170 11AA;C937;110C 1170 11AA;
+C938;C938;110C 1170 11AB;C938;110C 1170 11AB;
+C939;C939;110C 1170 11AC;C939;110C 1170 11AC;
+C93A;C93A;110C 1170 11AD;C93A;110C 1170 11AD;
+C93B;C93B;110C 1170 11AE;C93B;110C 1170 11AE;
+C93C;C93C;110C 1170 11AF;C93C;110C 1170 11AF;
+C93D;C93D;110C 1170 11B0;C93D;110C 1170 11B0;
+C93E;C93E;110C 1170 11B1;C93E;110C 1170 11B1;
+C93F;C93F;110C 1170 11B2;C93F;110C 1170 11B2;
+C940;C940;110C 1170 11B3;C940;110C 1170 11B3;
+C941;C941;110C 1170 11B4;C941;110C 1170 11B4;
+C942;C942;110C 1170 11B5;C942;110C 1170 11B5;
+C943;C943;110C 1170 11B6;C943;110C 1170 11B6;
+C944;C944;110C 1170 11B7;C944;110C 1170 11B7;
+C945;C945;110C 1170 11B8;C945;110C 1170 11B8;
+C946;C946;110C 1170 11B9;C946;110C 1170 11B9;
+C947;C947;110C 1170 11BA;C947;110C 1170 11BA;
+C948;C948;110C 1170 11BB;C948;110C 1170 11BB;
+C949;C949;110C 1170 11BC;C949;110C 1170 11BC;
+C94A;C94A;110C 1170 11BD;C94A;110C 1170 11BD;
+C94B;C94B;110C 1170 11BE;C94B;110C 1170 11BE;
+C94C;C94C;110C 1170 11BF;C94C;110C 1170 11BF;
+C94D;C94D;110C 1170 11C0;C94D;110C 1170 11C0;
+C94E;C94E;110C 1170 11C1;C94E;110C 1170 11C1;
+C94F;C94F;110C 1170 11C2;C94F;110C 1170 11C2;
+C950;C950;110C 1171;C950;110C 1171;
+C951;C951;110C 1171 11A8;C951;110C 1171 11A8;
+C952;C952;110C 1171 11A9;C952;110C 1171 11A9;
+C953;C953;110C 1171 11AA;C953;110C 1171 11AA;
+C954;C954;110C 1171 11AB;C954;110C 1171 11AB;
+C955;C955;110C 1171 11AC;C955;110C 1171 11AC;
+C956;C956;110C 1171 11AD;C956;110C 1171 11AD;
+C957;C957;110C 1171 11AE;C957;110C 1171 11AE;
+C958;C958;110C 1171 11AF;C958;110C 1171 11AF;
+C959;C959;110C 1171 11B0;C959;110C 1171 11B0;
+C95A;C95A;110C 1171 11B1;C95A;110C 1171 11B1;
+C95B;C95B;110C 1171 11B2;C95B;110C 1171 11B2;
+C95C;C95C;110C 1171 11B3;C95C;110C 1171 11B3;
+C95D;C95D;110C 1171 11B4;C95D;110C 1171 11B4;
+C95E;C95E;110C 1171 11B5;C95E;110C 1171 11B5;
+C95F;C95F;110C 1171 11B6;C95F;110C 1171 11B6;
+C960;C960;110C 1171 11B7;C960;110C 1171 11B7;
+C961;C961;110C 1171 11B8;C961;110C 1171 11B8;
+C962;C962;110C 1171 11B9;C962;110C 1171 11B9;
+C963;C963;110C 1171 11BA;C963;110C 1171 11BA;
+C964;C964;110C 1171 11BB;C964;110C 1171 11BB;
+C965;C965;110C 1171 11BC;C965;110C 1171 11BC;
+C966;C966;110C 1171 11BD;C966;110C 1171 11BD;
+C967;C967;110C 1171 11BE;C967;110C 1171 11BE;
+C968;C968;110C 1171 11BF;C968;110C 1171 11BF;
+C969;C969;110C 1171 11C0;C969;110C 1171 11C0;
+C96A;C96A;110C 1171 11C1;C96A;110C 1171 11C1;
+C96B;C96B;110C 1171 11C2;C96B;110C 1171 11C2;
+C96C;C96C;110C 1172;C96C;110C 1172;
+C96D;C96D;110C 1172 11A8;C96D;110C 1172 11A8;
+C96E;C96E;110C 1172 11A9;C96E;110C 1172 11A9;
+C96F;C96F;110C 1172 11AA;C96F;110C 1172 11AA;
+C970;C970;110C 1172 11AB;C970;110C 1172 11AB;
+C971;C971;110C 1172 11AC;C971;110C 1172 11AC;
+C972;C972;110C 1172 11AD;C972;110C 1172 11AD;
+C973;C973;110C 1172 11AE;C973;110C 1172 11AE;
+C974;C974;110C 1172 11AF;C974;110C 1172 11AF;
+C975;C975;110C 1172 11B0;C975;110C 1172 11B0;
+C976;C976;110C 1172 11B1;C976;110C 1172 11B1;
+C977;C977;110C 1172 11B2;C977;110C 1172 11B2;
+C978;C978;110C 1172 11B3;C978;110C 1172 11B3;
+C979;C979;110C 1172 11B4;C979;110C 1172 11B4;
+C97A;C97A;110C 1172 11B5;C97A;110C 1172 11B5;
+C97B;C97B;110C 1172 11B6;C97B;110C 1172 11B6;
+C97C;C97C;110C 1172 11B7;C97C;110C 1172 11B7;
+C97D;C97D;110C 1172 11B8;C97D;110C 1172 11B8;
+C97E;C97E;110C 1172 11B9;C97E;110C 1172 11B9;
+C97F;C97F;110C 1172 11BA;C97F;110C 1172 11BA;
+C980;C980;110C 1172 11BB;C980;110C 1172 11BB;
+C981;C981;110C 1172 11BC;C981;110C 1172 11BC;
+C982;C982;110C 1172 11BD;C982;110C 1172 11BD;
+C983;C983;110C 1172 11BE;C983;110C 1172 11BE;
+C984;C984;110C 1172 11BF;C984;110C 1172 11BF;
+C985;C985;110C 1172 11C0;C985;110C 1172 11C0;
+C986;C986;110C 1172 11C1;C986;110C 1172 11C1;
+C987;C987;110C 1172 11C2;C987;110C 1172 11C2;
+C988;C988;110C 1173;C988;110C 1173;
+C989;C989;110C 1173 11A8;C989;110C 1173 11A8;
+C98A;C98A;110C 1173 11A9;C98A;110C 1173 11A9;
+C98B;C98B;110C 1173 11AA;C98B;110C 1173 11AA;
+C98C;C98C;110C 1173 11AB;C98C;110C 1173 11AB;
+C98D;C98D;110C 1173 11AC;C98D;110C 1173 11AC;
+C98E;C98E;110C 1173 11AD;C98E;110C 1173 11AD;
+C98F;C98F;110C 1173 11AE;C98F;110C 1173 11AE;
+C990;C990;110C 1173 11AF;C990;110C 1173 11AF;
+C991;C991;110C 1173 11B0;C991;110C 1173 11B0;
+C992;C992;110C 1173 11B1;C992;110C 1173 11B1;
+C993;C993;110C 1173 11B2;C993;110C 1173 11B2;
+C994;C994;110C 1173 11B3;C994;110C 1173 11B3;
+C995;C995;110C 1173 11B4;C995;110C 1173 11B4;
+C996;C996;110C 1173 11B5;C996;110C 1173 11B5;
+C997;C997;110C 1173 11B6;C997;110C 1173 11B6;
+C998;C998;110C 1173 11B7;C998;110C 1173 11B7;
+C999;C999;110C 1173 11B8;C999;110C 1173 11B8;
+C99A;C99A;110C 1173 11B9;C99A;110C 1173 11B9;
+C99B;C99B;110C 1173 11BA;C99B;110C 1173 11BA;
+C99C;C99C;110C 1173 11BB;C99C;110C 1173 11BB;
+C99D;C99D;110C 1173 11BC;C99D;110C 1173 11BC;
+C99E;C99E;110C 1173 11BD;C99E;110C 1173 11BD;
+C99F;C99F;110C 1173 11BE;C99F;110C 1173 11BE;
+C9A0;C9A0;110C 1173 11BF;C9A0;110C 1173 11BF;
+C9A1;C9A1;110C 1173 11C0;C9A1;110C 1173 11C0;
+C9A2;C9A2;110C 1173 11C1;C9A2;110C 1173 11C1;
+C9A3;C9A3;110C 1173 11C2;C9A3;110C 1173 11C2;
+C9A4;C9A4;110C 1174;C9A4;110C 1174;
+C9A5;C9A5;110C 1174 11A8;C9A5;110C 1174 11A8;
+C9A6;C9A6;110C 1174 11A9;C9A6;110C 1174 11A9;
+C9A7;C9A7;110C 1174 11AA;C9A7;110C 1174 11AA;
+C9A8;C9A8;110C 1174 11AB;C9A8;110C 1174 11AB;
+C9A9;C9A9;110C 1174 11AC;C9A9;110C 1174 11AC;
+C9AA;C9AA;110C 1174 11AD;C9AA;110C 1174 11AD;
+C9AB;C9AB;110C 1174 11AE;C9AB;110C 1174 11AE;
+C9AC;C9AC;110C 1174 11AF;C9AC;110C 1174 11AF;
+C9AD;C9AD;110C 1174 11B0;C9AD;110C 1174 11B0;
+C9AE;C9AE;110C 1174 11B1;C9AE;110C 1174 11B1;
+C9AF;C9AF;110C 1174 11B2;C9AF;110C 1174 11B2;
+C9B0;C9B0;110C 1174 11B3;C9B0;110C 1174 11B3;
+C9B1;C9B1;110C 1174 11B4;C9B1;110C 1174 11B4;
+C9B2;C9B2;110C 1174 11B5;C9B2;110C 1174 11B5;
+C9B3;C9B3;110C 1174 11B6;C9B3;110C 1174 11B6;
+C9B4;C9B4;110C 1174 11B7;C9B4;110C 1174 11B7;
+C9B5;C9B5;110C 1174 11B8;C9B5;110C 1174 11B8;
+C9B6;C9B6;110C 1174 11B9;C9B6;110C 1174 11B9;
+C9B7;C9B7;110C 1174 11BA;C9B7;110C 1174 11BA;
+C9B8;C9B8;110C 1174 11BB;C9B8;110C 1174 11BB;
+C9B9;C9B9;110C 1174 11BC;C9B9;110C 1174 11BC;
+C9BA;C9BA;110C 1174 11BD;C9BA;110C 1174 11BD;
+C9BB;C9BB;110C 1174 11BE;C9BB;110C 1174 11BE;
+C9BC;C9BC;110C 1174 11BF;C9BC;110C 1174 11BF;
+C9BD;C9BD;110C 1174 11C0;C9BD;110C 1174 11C0;
+C9BE;C9BE;110C 1174 11C1;C9BE;110C 1174 11C1;
+C9BF;C9BF;110C 1174 11C2;C9BF;110C 1174 11C2;
+C9C0;C9C0;110C 1175;C9C0;110C 1175;
+C9C1;C9C1;110C 1175 11A8;C9C1;110C 1175 11A8;
+C9C2;C9C2;110C 1175 11A9;C9C2;110C 1175 11A9;
+C9C3;C9C3;110C 1175 11AA;C9C3;110C 1175 11AA;
+C9C4;C9C4;110C 1175 11AB;C9C4;110C 1175 11AB;
+C9C5;C9C5;110C 1175 11AC;C9C5;110C 1175 11AC;
+C9C6;C9C6;110C 1175 11AD;C9C6;110C 1175 11AD;
+C9C7;C9C7;110C 1175 11AE;C9C7;110C 1175 11AE;
+C9C8;C9C8;110C 1175 11AF;C9C8;110C 1175 11AF;
+C9C9;C9C9;110C 1175 11B0;C9C9;110C 1175 11B0;
+C9CA;C9CA;110C 1175 11B1;C9CA;110C 1175 11B1;
+C9CB;C9CB;110C 1175 11B2;C9CB;110C 1175 11B2;
+C9CC;C9CC;110C 1175 11B3;C9CC;110C 1175 11B3;
+C9CD;C9CD;110C 1175 11B4;C9CD;110C 1175 11B4;
+C9CE;C9CE;110C 1175 11B5;C9CE;110C 1175 11B5;
+C9CF;C9CF;110C 1175 11B6;C9CF;110C 1175 11B6;
+C9D0;C9D0;110C 1175 11B7;C9D0;110C 1175 11B7;
+C9D1;C9D1;110C 1175 11B8;C9D1;110C 1175 11B8;
+C9D2;C9D2;110C 1175 11B9;C9D2;110C 1175 11B9;
+C9D3;C9D3;110C 1175 11BA;C9D3;110C 1175 11BA;
+C9D4;C9D4;110C 1175 11BB;C9D4;110C 1175 11BB;
+C9D5;C9D5;110C 1175 11BC;C9D5;110C 1175 11BC;
+C9D6;C9D6;110C 1175 11BD;C9D6;110C 1175 11BD;
+C9D7;C9D7;110C 1175 11BE;C9D7;110C 1175 11BE;
+C9D8;C9D8;110C 1175 11BF;C9D8;110C 1175 11BF;
+C9D9;C9D9;110C 1175 11C0;C9D9;110C 1175 11C0;
+C9DA;C9DA;110C 1175 11C1;C9DA;110C 1175 11C1;
+C9DB;C9DB;110C 1175 11C2;C9DB;110C 1175 11C2;
+C9DC;C9DC;110D 1161;C9DC;110D 1161;
+C9DD;C9DD;110D 1161 11A8;C9DD;110D 1161 11A8;
+C9DE;C9DE;110D 1161 11A9;C9DE;110D 1161 11A9;
+C9DF;C9DF;110D 1161 11AA;C9DF;110D 1161 11AA;
+C9E0;C9E0;110D 1161 11AB;C9E0;110D 1161 11AB;
+C9E1;C9E1;110D 1161 11AC;C9E1;110D 1161 11AC;
+C9E2;C9E2;110D 1161 11AD;C9E2;110D 1161 11AD;
+C9E3;C9E3;110D 1161 11AE;C9E3;110D 1161 11AE;
+C9E4;C9E4;110D 1161 11AF;C9E4;110D 1161 11AF;
+C9E5;C9E5;110D 1161 11B0;C9E5;110D 1161 11B0;
+C9E6;C9E6;110D 1161 11B1;C9E6;110D 1161 11B1;
+C9E7;C9E7;110D 1161 11B2;C9E7;110D 1161 11B2;
+C9E8;C9E8;110D 1161 11B3;C9E8;110D 1161 11B3;
+C9E9;C9E9;110D 1161 11B4;C9E9;110D 1161 11B4;
+C9EA;C9EA;110D 1161 11B5;C9EA;110D 1161 11B5;
+C9EB;C9EB;110D 1161 11B6;C9EB;110D 1161 11B6;
+C9EC;C9EC;110D 1161 11B7;C9EC;110D 1161 11B7;
+C9ED;C9ED;110D 1161 11B8;C9ED;110D 1161 11B8;
+C9EE;C9EE;110D 1161 11B9;C9EE;110D 1161 11B9;
+C9EF;C9EF;110D 1161 11BA;C9EF;110D 1161 11BA;
+C9F0;C9F0;110D 1161 11BB;C9F0;110D 1161 11BB;
+C9F1;C9F1;110D 1161 11BC;C9F1;110D 1161 11BC;
+C9F2;C9F2;110D 1161 11BD;C9F2;110D 1161 11BD;
+C9F3;C9F3;110D 1161 11BE;C9F3;110D 1161 11BE;
+C9F4;C9F4;110D 1161 11BF;C9F4;110D 1161 11BF;
+C9F5;C9F5;110D 1161 11C0;C9F5;110D 1161 11C0;
+C9F6;C9F6;110D 1161 11C1;C9F6;110D 1161 11C1;
+C9F7;C9F7;110D 1161 11C2;C9F7;110D 1161 11C2;
+C9F8;C9F8;110D 1162;C9F8;110D 1162;
+C9F9;C9F9;110D 1162 11A8;C9F9;110D 1162 11A8;
+C9FA;C9FA;110D 1162 11A9;C9FA;110D 1162 11A9;
+C9FB;C9FB;110D 1162 11AA;C9FB;110D 1162 11AA;
+C9FC;C9FC;110D 1162 11AB;C9FC;110D 1162 11AB;
+C9FD;C9FD;110D 1162 11AC;C9FD;110D 1162 11AC;
+C9FE;C9FE;110D 1162 11AD;C9FE;110D 1162 11AD;
+C9FF;C9FF;110D 1162 11AE;C9FF;110D 1162 11AE;
+CA00;CA00;110D 1162 11AF;CA00;110D 1162 11AF;
+CA01;CA01;110D 1162 11B0;CA01;110D 1162 11B0;
+CA02;CA02;110D 1162 11B1;CA02;110D 1162 11B1;
+CA03;CA03;110D 1162 11B2;CA03;110D 1162 11B2;
+CA04;CA04;110D 1162 11B3;CA04;110D 1162 11B3;
+CA05;CA05;110D 1162 11B4;CA05;110D 1162 11B4;
+CA06;CA06;110D 1162 11B5;CA06;110D 1162 11B5;
+CA07;CA07;110D 1162 11B6;CA07;110D 1162 11B6;
+CA08;CA08;110D 1162 11B7;CA08;110D 1162 11B7;
+CA09;CA09;110D 1162 11B8;CA09;110D 1162 11B8;
+CA0A;CA0A;110D 1162 11B9;CA0A;110D 1162 11B9;
+CA0B;CA0B;110D 1162 11BA;CA0B;110D 1162 11BA;
+CA0C;CA0C;110D 1162 11BB;CA0C;110D 1162 11BB;
+CA0D;CA0D;110D 1162 11BC;CA0D;110D 1162 11BC;
+CA0E;CA0E;110D 1162 11BD;CA0E;110D 1162 11BD;
+CA0F;CA0F;110D 1162 11BE;CA0F;110D 1162 11BE;
+CA10;CA10;110D 1162 11BF;CA10;110D 1162 11BF;
+CA11;CA11;110D 1162 11C0;CA11;110D 1162 11C0;
+CA12;CA12;110D 1162 11C1;CA12;110D 1162 11C1;
+CA13;CA13;110D 1162 11C2;CA13;110D 1162 11C2;
+CA14;CA14;110D 1163;CA14;110D 1163;
+CA15;CA15;110D 1163 11A8;CA15;110D 1163 11A8;
+CA16;CA16;110D 1163 11A9;CA16;110D 1163 11A9;
+CA17;CA17;110D 1163 11AA;CA17;110D 1163 11AA;
+CA18;CA18;110D 1163 11AB;CA18;110D 1163 11AB;
+CA19;CA19;110D 1163 11AC;CA19;110D 1163 11AC;
+CA1A;CA1A;110D 1163 11AD;CA1A;110D 1163 11AD;
+CA1B;CA1B;110D 1163 11AE;CA1B;110D 1163 11AE;
+CA1C;CA1C;110D 1163 11AF;CA1C;110D 1163 11AF;
+CA1D;CA1D;110D 1163 11B0;CA1D;110D 1163 11B0;
+CA1E;CA1E;110D 1163 11B1;CA1E;110D 1163 11B1;
+CA1F;CA1F;110D 1163 11B2;CA1F;110D 1163 11B2;
+CA20;CA20;110D 1163 11B3;CA20;110D 1163 11B3;
+CA21;CA21;110D 1163 11B4;CA21;110D 1163 11B4;
+CA22;CA22;110D 1163 11B5;CA22;110D 1163 11B5;
+CA23;CA23;110D 1163 11B6;CA23;110D 1163 11B6;
+CA24;CA24;110D 1163 11B7;CA24;110D 1163 11B7;
+CA25;CA25;110D 1163 11B8;CA25;110D 1163 11B8;
+CA26;CA26;110D 1163 11B9;CA26;110D 1163 11B9;
+CA27;CA27;110D 1163 11BA;CA27;110D 1163 11BA;
+CA28;CA28;110D 1163 11BB;CA28;110D 1163 11BB;
+CA29;CA29;110D 1163 11BC;CA29;110D 1163 11BC;
+CA2A;CA2A;110D 1163 11BD;CA2A;110D 1163 11BD;
+CA2B;CA2B;110D 1163 11BE;CA2B;110D 1163 11BE;
+CA2C;CA2C;110D 1163 11BF;CA2C;110D 1163 11BF;
+CA2D;CA2D;110D 1163 11C0;CA2D;110D 1163 11C0;
+CA2E;CA2E;110D 1163 11C1;CA2E;110D 1163 11C1;
+CA2F;CA2F;110D 1163 11C2;CA2F;110D 1163 11C2;
+CA30;CA30;110D 1164;CA30;110D 1164;
+CA31;CA31;110D 1164 11A8;CA31;110D 1164 11A8;
+CA32;CA32;110D 1164 11A9;CA32;110D 1164 11A9;
+CA33;CA33;110D 1164 11AA;CA33;110D 1164 11AA;
+CA34;CA34;110D 1164 11AB;CA34;110D 1164 11AB;
+CA35;CA35;110D 1164 11AC;CA35;110D 1164 11AC;
+CA36;CA36;110D 1164 11AD;CA36;110D 1164 11AD;
+CA37;CA37;110D 1164 11AE;CA37;110D 1164 11AE;
+CA38;CA38;110D 1164 11AF;CA38;110D 1164 11AF;
+CA39;CA39;110D 1164 11B0;CA39;110D 1164 11B0;
+CA3A;CA3A;110D 1164 11B1;CA3A;110D 1164 11B1;
+CA3B;CA3B;110D 1164 11B2;CA3B;110D 1164 11B2;
+CA3C;CA3C;110D 1164 11B3;CA3C;110D 1164 11B3;
+CA3D;CA3D;110D 1164 11B4;CA3D;110D 1164 11B4;
+CA3E;CA3E;110D 1164 11B5;CA3E;110D 1164 11B5;
+CA3F;CA3F;110D 1164 11B6;CA3F;110D 1164 11B6;
+CA40;CA40;110D 1164 11B7;CA40;110D 1164 11B7;
+CA41;CA41;110D 1164 11B8;CA41;110D 1164 11B8;
+CA42;CA42;110D 1164 11B9;CA42;110D 1164 11B9;
+CA43;CA43;110D 1164 11BA;CA43;110D 1164 11BA;
+CA44;CA44;110D 1164 11BB;CA44;110D 1164 11BB;
+CA45;CA45;110D 1164 11BC;CA45;110D 1164 11BC;
+CA46;CA46;110D 1164 11BD;CA46;110D 1164 11BD;
+CA47;CA47;110D 1164 11BE;CA47;110D 1164 11BE;
+CA48;CA48;110D 1164 11BF;CA48;110D 1164 11BF;
+CA49;CA49;110D 1164 11C0;CA49;110D 1164 11C0;
+CA4A;CA4A;110D 1164 11C1;CA4A;110D 1164 11C1;
+CA4B;CA4B;110D 1164 11C2;CA4B;110D 1164 11C2;
+CA4C;CA4C;110D 1165;CA4C;110D 1165;
+CA4D;CA4D;110D 1165 11A8;CA4D;110D 1165 11A8;
+CA4E;CA4E;110D 1165 11A9;CA4E;110D 1165 11A9;
+CA4F;CA4F;110D 1165 11AA;CA4F;110D 1165 11AA;
+CA50;CA50;110D 1165 11AB;CA50;110D 1165 11AB;
+CA51;CA51;110D 1165 11AC;CA51;110D 1165 11AC;
+CA52;CA52;110D 1165 11AD;CA52;110D 1165 11AD;
+CA53;CA53;110D 1165 11AE;CA53;110D 1165 11AE;
+CA54;CA54;110D 1165 11AF;CA54;110D 1165 11AF;
+CA55;CA55;110D 1165 11B0;CA55;110D 1165 11B0;
+CA56;CA56;110D 1165 11B1;CA56;110D 1165 11B1;
+CA57;CA57;110D 1165 11B2;CA57;110D 1165 11B2;
+CA58;CA58;110D 1165 11B3;CA58;110D 1165 11B3;
+CA59;CA59;110D 1165 11B4;CA59;110D 1165 11B4;
+CA5A;CA5A;110D 1165 11B5;CA5A;110D 1165 11B5;
+CA5B;CA5B;110D 1165 11B6;CA5B;110D 1165 11B6;
+CA5C;CA5C;110D 1165 11B7;CA5C;110D 1165 11B7;
+CA5D;CA5D;110D 1165 11B8;CA5D;110D 1165 11B8;
+CA5E;CA5E;110D 1165 11B9;CA5E;110D 1165 11B9;
+CA5F;CA5F;110D 1165 11BA;CA5F;110D 1165 11BA;
+CA60;CA60;110D 1165 11BB;CA60;110D 1165 11BB;
+CA61;CA61;110D 1165 11BC;CA61;110D 1165 11BC;
+CA62;CA62;110D 1165 11BD;CA62;110D 1165 11BD;
+CA63;CA63;110D 1165 11BE;CA63;110D 1165 11BE;
+CA64;CA64;110D 1165 11BF;CA64;110D 1165 11BF;
+CA65;CA65;110D 1165 11C0;CA65;110D 1165 11C0;
+CA66;CA66;110D 1165 11C1;CA66;110D 1165 11C1;
+CA67;CA67;110D 1165 11C2;CA67;110D 1165 11C2;
+CA68;CA68;110D 1166;CA68;110D 1166;
+CA69;CA69;110D 1166 11A8;CA69;110D 1166 11A8;
+CA6A;CA6A;110D 1166 11A9;CA6A;110D 1166 11A9;
+CA6B;CA6B;110D 1166 11AA;CA6B;110D 1166 11AA;
+CA6C;CA6C;110D 1166 11AB;CA6C;110D 1166 11AB;
+CA6D;CA6D;110D 1166 11AC;CA6D;110D 1166 11AC;
+CA6E;CA6E;110D 1166 11AD;CA6E;110D 1166 11AD;
+CA6F;CA6F;110D 1166 11AE;CA6F;110D 1166 11AE;
+CA70;CA70;110D 1166 11AF;CA70;110D 1166 11AF;
+CA71;CA71;110D 1166 11B0;CA71;110D 1166 11B0;
+CA72;CA72;110D 1166 11B1;CA72;110D 1166 11B1;
+CA73;CA73;110D 1166 11B2;CA73;110D 1166 11B2;
+CA74;CA74;110D 1166 11B3;CA74;110D 1166 11B3;
+CA75;CA75;110D 1166 11B4;CA75;110D 1166 11B4;
+CA76;CA76;110D 1166 11B5;CA76;110D 1166 11B5;
+CA77;CA77;110D 1166 11B6;CA77;110D 1166 11B6;
+CA78;CA78;110D 1166 11B7;CA78;110D 1166 11B7;
+CA79;CA79;110D 1166 11B8;CA79;110D 1166 11B8;
+CA7A;CA7A;110D 1166 11B9;CA7A;110D 1166 11B9;
+CA7B;CA7B;110D 1166 11BA;CA7B;110D 1166 11BA;
+CA7C;CA7C;110D 1166 11BB;CA7C;110D 1166 11BB;
+CA7D;CA7D;110D 1166 11BC;CA7D;110D 1166 11BC;
+CA7E;CA7E;110D 1166 11BD;CA7E;110D 1166 11BD;
+CA7F;CA7F;110D 1166 11BE;CA7F;110D 1166 11BE;
+CA80;CA80;110D 1166 11BF;CA80;110D 1166 11BF;
+CA81;CA81;110D 1166 11C0;CA81;110D 1166 11C0;
+CA82;CA82;110D 1166 11C1;CA82;110D 1166 11C1;
+CA83;CA83;110D 1166 11C2;CA83;110D 1166 11C2;
+CA84;CA84;110D 1167;CA84;110D 1167;
+CA85;CA85;110D 1167 11A8;CA85;110D 1167 11A8;
+CA86;CA86;110D 1167 11A9;CA86;110D 1167 11A9;
+CA87;CA87;110D 1167 11AA;CA87;110D 1167 11AA;
+CA88;CA88;110D 1167 11AB;CA88;110D 1167 11AB;
+CA89;CA89;110D 1167 11AC;CA89;110D 1167 11AC;
+CA8A;CA8A;110D 1167 11AD;CA8A;110D 1167 11AD;
+CA8B;CA8B;110D 1167 11AE;CA8B;110D 1167 11AE;
+CA8C;CA8C;110D 1167 11AF;CA8C;110D 1167 11AF;
+CA8D;CA8D;110D 1167 11B0;CA8D;110D 1167 11B0;
+CA8E;CA8E;110D 1167 11B1;CA8E;110D 1167 11B1;
+CA8F;CA8F;110D 1167 11B2;CA8F;110D 1167 11B2;
+CA90;CA90;110D 1167 11B3;CA90;110D 1167 11B3;
+CA91;CA91;110D 1167 11B4;CA91;110D 1167 11B4;
+CA92;CA92;110D 1167 11B5;CA92;110D 1167 11B5;
+CA93;CA93;110D 1167 11B6;CA93;110D 1167 11B6;
+CA94;CA94;110D 1167 11B7;CA94;110D 1167 11B7;
+CA95;CA95;110D 1167 11B8;CA95;110D 1167 11B8;
+CA96;CA96;110D 1167 11B9;CA96;110D 1167 11B9;
+CA97;CA97;110D 1167 11BA;CA97;110D 1167 11BA;
+CA98;CA98;110D 1167 11BB;CA98;110D 1167 11BB;
+CA99;CA99;110D 1167 11BC;CA99;110D 1167 11BC;
+CA9A;CA9A;110D 1167 11BD;CA9A;110D 1167 11BD;
+CA9B;CA9B;110D 1167 11BE;CA9B;110D 1167 11BE;
+CA9C;CA9C;110D 1167 11BF;CA9C;110D 1167 11BF;
+CA9D;CA9D;110D 1167 11C0;CA9D;110D 1167 11C0;
+CA9E;CA9E;110D 1167 11C1;CA9E;110D 1167 11C1;
+CA9F;CA9F;110D 1167 11C2;CA9F;110D 1167 11C2;
+CAA0;CAA0;110D 1168;CAA0;110D 1168;
+CAA1;CAA1;110D 1168 11A8;CAA1;110D 1168 11A8;
+CAA2;CAA2;110D 1168 11A9;CAA2;110D 1168 11A9;
+CAA3;CAA3;110D 1168 11AA;CAA3;110D 1168 11AA;
+CAA4;CAA4;110D 1168 11AB;CAA4;110D 1168 11AB;
+CAA5;CAA5;110D 1168 11AC;CAA5;110D 1168 11AC;
+CAA6;CAA6;110D 1168 11AD;CAA6;110D 1168 11AD;
+CAA7;CAA7;110D 1168 11AE;CAA7;110D 1168 11AE;
+CAA8;CAA8;110D 1168 11AF;CAA8;110D 1168 11AF;
+CAA9;CAA9;110D 1168 11B0;CAA9;110D 1168 11B0;
+CAAA;CAAA;110D 1168 11B1;CAAA;110D 1168 11B1;
+CAAB;CAAB;110D 1168 11B2;CAAB;110D 1168 11B2;
+CAAC;CAAC;110D 1168 11B3;CAAC;110D 1168 11B3;
+CAAD;CAAD;110D 1168 11B4;CAAD;110D 1168 11B4;
+CAAE;CAAE;110D 1168 11B5;CAAE;110D 1168 11B5;
+CAAF;CAAF;110D 1168 11B6;CAAF;110D 1168 11B6;
+CAB0;CAB0;110D 1168 11B7;CAB0;110D 1168 11B7;
+CAB1;CAB1;110D 1168 11B8;CAB1;110D 1168 11B8;
+CAB2;CAB2;110D 1168 11B9;CAB2;110D 1168 11B9;
+CAB3;CAB3;110D 1168 11BA;CAB3;110D 1168 11BA;
+CAB4;CAB4;110D 1168 11BB;CAB4;110D 1168 11BB;
+CAB5;CAB5;110D 1168 11BC;CAB5;110D 1168 11BC;
+CAB6;CAB6;110D 1168 11BD;CAB6;110D 1168 11BD;
+CAB7;CAB7;110D 1168 11BE;CAB7;110D 1168 11BE;
+CAB8;CAB8;110D 1168 11BF;CAB8;110D 1168 11BF;
+CAB9;CAB9;110D 1168 11C0;CAB9;110D 1168 11C0;
+CABA;CABA;110D 1168 11C1;CABA;110D 1168 11C1;
+CABB;CABB;110D 1168 11C2;CABB;110D 1168 11C2;
+CABC;CABC;110D 1169;CABC;110D 1169;
+CABD;CABD;110D 1169 11A8;CABD;110D 1169 11A8;
+CABE;CABE;110D 1169 11A9;CABE;110D 1169 11A9;
+CABF;CABF;110D 1169 11AA;CABF;110D 1169 11AA;
+CAC0;CAC0;110D 1169 11AB;CAC0;110D 1169 11AB;
+CAC1;CAC1;110D 1169 11AC;CAC1;110D 1169 11AC;
+CAC2;CAC2;110D 1169 11AD;CAC2;110D 1169 11AD;
+CAC3;CAC3;110D 1169 11AE;CAC3;110D 1169 11AE;
+CAC4;CAC4;110D 1169 11AF;CAC4;110D 1169 11AF;
+CAC5;CAC5;110D 1169 11B0;CAC5;110D 1169 11B0;
+CAC6;CAC6;110D 1169 11B1;CAC6;110D 1169 11B1;
+CAC7;CAC7;110D 1169 11B2;CAC7;110D 1169 11B2;
+CAC8;CAC8;110D 1169 11B3;CAC8;110D 1169 11B3;
+CAC9;CAC9;110D 1169 11B4;CAC9;110D 1169 11B4;
+CACA;CACA;110D 1169 11B5;CACA;110D 1169 11B5;
+CACB;CACB;110D 1169 11B6;CACB;110D 1169 11B6;
+CACC;CACC;110D 1169 11B7;CACC;110D 1169 11B7;
+CACD;CACD;110D 1169 11B8;CACD;110D 1169 11B8;
+CACE;CACE;110D 1169 11B9;CACE;110D 1169 11B9;
+CACF;CACF;110D 1169 11BA;CACF;110D 1169 11BA;
+CAD0;CAD0;110D 1169 11BB;CAD0;110D 1169 11BB;
+CAD1;CAD1;110D 1169 11BC;CAD1;110D 1169 11BC;
+CAD2;CAD2;110D 1169 11BD;CAD2;110D 1169 11BD;
+CAD3;CAD3;110D 1169 11BE;CAD3;110D 1169 11BE;
+CAD4;CAD4;110D 1169 11BF;CAD4;110D 1169 11BF;
+CAD5;CAD5;110D 1169 11C0;CAD5;110D 1169 11C0;
+CAD6;CAD6;110D 1169 11C1;CAD6;110D 1169 11C1;
+CAD7;CAD7;110D 1169 11C2;CAD7;110D 1169 11C2;
+CAD8;CAD8;110D 116A;CAD8;110D 116A;
+CAD9;CAD9;110D 116A 11A8;CAD9;110D 116A 11A8;
+CADA;CADA;110D 116A 11A9;CADA;110D 116A 11A9;
+CADB;CADB;110D 116A 11AA;CADB;110D 116A 11AA;
+CADC;CADC;110D 116A 11AB;CADC;110D 116A 11AB;
+CADD;CADD;110D 116A 11AC;CADD;110D 116A 11AC;
+CADE;CADE;110D 116A 11AD;CADE;110D 116A 11AD;
+CADF;CADF;110D 116A 11AE;CADF;110D 116A 11AE;
+CAE0;CAE0;110D 116A 11AF;CAE0;110D 116A 11AF;
+CAE1;CAE1;110D 116A 11B0;CAE1;110D 116A 11B0;
+CAE2;CAE2;110D 116A 11B1;CAE2;110D 116A 11B1;
+CAE3;CAE3;110D 116A 11B2;CAE3;110D 116A 11B2;
+CAE4;CAE4;110D 116A 11B3;CAE4;110D 116A 11B3;
+CAE5;CAE5;110D 116A 11B4;CAE5;110D 116A 11B4;
+CAE6;CAE6;110D 116A 11B5;CAE6;110D 116A 11B5;
+CAE7;CAE7;110D 116A 11B6;CAE7;110D 116A 11B6;
+CAE8;CAE8;110D 116A 11B7;CAE8;110D 116A 11B7;
+CAE9;CAE9;110D 116A 11B8;CAE9;110D 116A 11B8;
+CAEA;CAEA;110D 116A 11B9;CAEA;110D 116A 11B9;
+CAEB;CAEB;110D 116A 11BA;CAEB;110D 116A 11BA;
+CAEC;CAEC;110D 116A 11BB;CAEC;110D 116A 11BB;
+CAED;CAED;110D 116A 11BC;CAED;110D 116A 11BC;
+CAEE;CAEE;110D 116A 11BD;CAEE;110D 116A 11BD;
+CAEF;CAEF;110D 116A 11BE;CAEF;110D 116A 11BE;
+CAF0;CAF0;110D 116A 11BF;CAF0;110D 116A 11BF;
+CAF1;CAF1;110D 116A 11C0;CAF1;110D 116A 11C0;
+CAF2;CAF2;110D 116A 11C1;CAF2;110D 116A 11C1;
+CAF3;CAF3;110D 116A 11C2;CAF3;110D 116A 11C2;
+CAF4;CAF4;110D 116B;CAF4;110D 116B;
+CAF5;CAF5;110D 116B 11A8;CAF5;110D 116B 11A8;
+CAF6;CAF6;110D 116B 11A9;CAF6;110D 116B 11A9;
+CAF7;CAF7;110D 116B 11AA;CAF7;110D 116B 11AA;
+CAF8;CAF8;110D 116B 11AB;CAF8;110D 116B 11AB;
+CAF9;CAF9;110D 116B 11AC;CAF9;110D 116B 11AC;
+CAFA;CAFA;110D 116B 11AD;CAFA;110D 116B 11AD;
+CAFB;CAFB;110D 116B 11AE;CAFB;110D 116B 11AE;
+CAFC;CAFC;110D 116B 11AF;CAFC;110D 116B 11AF;
+CAFD;CAFD;110D 116B 11B0;CAFD;110D 116B 11B0;
+CAFE;CAFE;110D 116B 11B1;CAFE;110D 116B 11B1;
+CAFF;CAFF;110D 116B 11B2;CAFF;110D 116B 11B2;
+CB00;CB00;110D 116B 11B3;CB00;110D 116B 11B3;
+CB01;CB01;110D 116B 11B4;CB01;110D 116B 11B4;
+CB02;CB02;110D 116B 11B5;CB02;110D 116B 11B5;
+CB03;CB03;110D 116B 11B6;CB03;110D 116B 11B6;
+CB04;CB04;110D 116B 11B7;CB04;110D 116B 11B7;
+CB05;CB05;110D 116B 11B8;CB05;110D 116B 11B8;
+CB06;CB06;110D 116B 11B9;CB06;110D 116B 11B9;
+CB07;CB07;110D 116B 11BA;CB07;110D 116B 11BA;
+CB08;CB08;110D 116B 11BB;CB08;110D 116B 11BB;
+CB09;CB09;110D 116B 11BC;CB09;110D 116B 11BC;
+CB0A;CB0A;110D 116B 11BD;CB0A;110D 116B 11BD;
+CB0B;CB0B;110D 116B 11BE;CB0B;110D 116B 11BE;
+CB0C;CB0C;110D 116B 11BF;CB0C;110D 116B 11BF;
+CB0D;CB0D;110D 116B 11C0;CB0D;110D 116B 11C0;
+CB0E;CB0E;110D 116B 11C1;CB0E;110D 116B 11C1;
+CB0F;CB0F;110D 116B 11C2;CB0F;110D 116B 11C2;
+CB10;CB10;110D 116C;CB10;110D 116C;
+CB11;CB11;110D 116C 11A8;CB11;110D 116C 11A8;
+CB12;CB12;110D 116C 11A9;CB12;110D 116C 11A9;
+CB13;CB13;110D 116C 11AA;CB13;110D 116C 11AA;
+CB14;CB14;110D 116C 11AB;CB14;110D 116C 11AB;
+CB15;CB15;110D 116C 11AC;CB15;110D 116C 11AC;
+CB16;CB16;110D 116C 11AD;CB16;110D 116C 11AD;
+CB17;CB17;110D 116C 11AE;CB17;110D 116C 11AE;
+CB18;CB18;110D 116C 11AF;CB18;110D 116C 11AF;
+CB19;CB19;110D 116C 11B0;CB19;110D 116C 11B0;
+CB1A;CB1A;110D 116C 11B1;CB1A;110D 116C 11B1;
+CB1B;CB1B;110D 116C 11B2;CB1B;110D 116C 11B2;
+CB1C;CB1C;110D 116C 11B3;CB1C;110D 116C 11B3;
+CB1D;CB1D;110D 116C 11B4;CB1D;110D 116C 11B4;
+CB1E;CB1E;110D 116C 11B5;CB1E;110D 116C 11B5;
+CB1F;CB1F;110D 116C 11B6;CB1F;110D 116C 11B6;
+CB20;CB20;110D 116C 11B7;CB20;110D 116C 11B7;
+CB21;CB21;110D 116C 11B8;CB21;110D 116C 11B8;
+CB22;CB22;110D 116C 11B9;CB22;110D 116C 11B9;
+CB23;CB23;110D 116C 11BA;CB23;110D 116C 11BA;
+CB24;CB24;110D 116C 11BB;CB24;110D 116C 11BB;
+CB25;CB25;110D 116C 11BC;CB25;110D 116C 11BC;
+CB26;CB26;110D 116C 11BD;CB26;110D 116C 11BD;
+CB27;CB27;110D 116C 11BE;CB27;110D 116C 11BE;
+CB28;CB28;110D 116C 11BF;CB28;110D 116C 11BF;
+CB29;CB29;110D 116C 11C0;CB29;110D 116C 11C0;
+CB2A;CB2A;110D 116C 11C1;CB2A;110D 116C 11C1;
+CB2B;CB2B;110D 116C 11C2;CB2B;110D 116C 11C2;
+CB2C;CB2C;110D 116D;CB2C;110D 116D;
+CB2D;CB2D;110D 116D 11A8;CB2D;110D 116D 11A8;
+CB2E;CB2E;110D 116D 11A9;CB2E;110D 116D 11A9;
+CB2F;CB2F;110D 116D 11AA;CB2F;110D 116D 11AA;
+CB30;CB30;110D 116D 11AB;CB30;110D 116D 11AB;
+CB31;CB31;110D 116D 11AC;CB31;110D 116D 11AC;
+CB32;CB32;110D 116D 11AD;CB32;110D 116D 11AD;
+CB33;CB33;110D 116D 11AE;CB33;110D 116D 11AE;
+CB34;CB34;110D 116D 11AF;CB34;110D 116D 11AF;
+CB35;CB35;110D 116D 11B0;CB35;110D 116D 11B0;
+CB36;CB36;110D 116D 11B1;CB36;110D 116D 11B1;
+CB37;CB37;110D 116D 11B2;CB37;110D 116D 11B2;
+CB38;CB38;110D 116D 11B3;CB38;110D 116D 11B3;
+CB39;CB39;110D 116D 11B4;CB39;110D 116D 11B4;
+CB3A;CB3A;110D 116D 11B5;CB3A;110D 116D 11B5;
+CB3B;CB3B;110D 116D 11B6;CB3B;110D 116D 11B6;
+CB3C;CB3C;110D 116D 11B7;CB3C;110D 116D 11B7;
+CB3D;CB3D;110D 116D 11B8;CB3D;110D 116D 11B8;
+CB3E;CB3E;110D 116D 11B9;CB3E;110D 116D 11B9;
+CB3F;CB3F;110D 116D 11BA;CB3F;110D 116D 11BA;
+CB40;CB40;110D 116D 11BB;CB40;110D 116D 11BB;
+CB41;CB41;110D 116D 11BC;CB41;110D 116D 11BC;
+CB42;CB42;110D 116D 11BD;CB42;110D 116D 11BD;
+CB43;CB43;110D 116D 11BE;CB43;110D 116D 11BE;
+CB44;CB44;110D 116D 11BF;CB44;110D 116D 11BF;
+CB45;CB45;110D 116D 11C0;CB45;110D 116D 11C0;
+CB46;CB46;110D 116D 11C1;CB46;110D 116D 11C1;
+CB47;CB47;110D 116D 11C2;CB47;110D 116D 11C2;
+CB48;CB48;110D 116E;CB48;110D 116E;
+CB49;CB49;110D 116E 11A8;CB49;110D 116E 11A8;
+CB4A;CB4A;110D 116E 11A9;CB4A;110D 116E 11A9;
+CB4B;CB4B;110D 116E 11AA;CB4B;110D 116E 11AA;
+CB4C;CB4C;110D 116E 11AB;CB4C;110D 116E 11AB;
+CB4D;CB4D;110D 116E 11AC;CB4D;110D 116E 11AC;
+CB4E;CB4E;110D 116E 11AD;CB4E;110D 116E 11AD;
+CB4F;CB4F;110D 116E 11AE;CB4F;110D 116E 11AE;
+CB50;CB50;110D 116E 11AF;CB50;110D 116E 11AF;
+CB51;CB51;110D 116E 11B0;CB51;110D 116E 11B0;
+CB52;CB52;110D 116E 11B1;CB52;110D 116E 11B1;
+CB53;CB53;110D 116E 11B2;CB53;110D 116E 11B2;
+CB54;CB54;110D 116E 11B3;CB54;110D 116E 11B3;
+CB55;CB55;110D 116E 11B4;CB55;110D 116E 11B4;
+CB56;CB56;110D 116E 11B5;CB56;110D 116E 11B5;
+CB57;CB57;110D 116E 11B6;CB57;110D 116E 11B6;
+CB58;CB58;110D 116E 11B7;CB58;110D 116E 11B7;
+CB59;CB59;110D 116E 11B8;CB59;110D 116E 11B8;
+CB5A;CB5A;110D 116E 11B9;CB5A;110D 116E 11B9;
+CB5B;CB5B;110D 116E 11BA;CB5B;110D 116E 11BA;
+CB5C;CB5C;110D 116E 11BB;CB5C;110D 116E 11BB;
+CB5D;CB5D;110D 116E 11BC;CB5D;110D 116E 11BC;
+CB5E;CB5E;110D 116E 11BD;CB5E;110D 116E 11BD;
+CB5F;CB5F;110D 116E 11BE;CB5F;110D 116E 11BE;
+CB60;CB60;110D 116E 11BF;CB60;110D 116E 11BF;
+CB61;CB61;110D 116E 11C0;CB61;110D 116E 11C0;
+CB62;CB62;110D 116E 11C1;CB62;110D 116E 11C1;
+CB63;CB63;110D 116E 11C2;CB63;110D 116E 11C2;
+CB64;CB64;110D 116F;CB64;110D 116F;
+CB65;CB65;110D 116F 11A8;CB65;110D 116F 11A8;
+CB66;CB66;110D 116F 11A9;CB66;110D 116F 11A9;
+CB67;CB67;110D 116F 11AA;CB67;110D 116F 11AA;
+CB68;CB68;110D 116F 11AB;CB68;110D 116F 11AB;
+CB69;CB69;110D 116F 11AC;CB69;110D 116F 11AC;
+CB6A;CB6A;110D 116F 11AD;CB6A;110D 116F 11AD;
+CB6B;CB6B;110D 116F 11AE;CB6B;110D 116F 11AE;
+CB6C;CB6C;110D 116F 11AF;CB6C;110D 116F 11AF;
+CB6D;CB6D;110D 116F 11B0;CB6D;110D 116F 11B0;
+CB6E;CB6E;110D 116F 11B1;CB6E;110D 116F 11B1;
+CB6F;CB6F;110D 116F 11B2;CB6F;110D 116F 11B2;
+CB70;CB70;110D 116F 11B3;CB70;110D 116F 11B3;
+CB71;CB71;110D 116F 11B4;CB71;110D 116F 11B4;
+CB72;CB72;110D 116F 11B5;CB72;110D 116F 11B5;
+CB73;CB73;110D 116F 11B6;CB73;110D 116F 11B6;
+CB74;CB74;110D 116F 11B7;CB74;110D 116F 11B7;
+CB75;CB75;110D 116F 11B8;CB75;110D 116F 11B8;
+CB76;CB76;110D 116F 11B9;CB76;110D 116F 11B9;
+CB77;CB77;110D 116F 11BA;CB77;110D 116F 11BA;
+CB78;CB78;110D 116F 11BB;CB78;110D 116F 11BB;
+CB79;CB79;110D 116F 11BC;CB79;110D 116F 11BC;
+CB7A;CB7A;110D 116F 11BD;CB7A;110D 116F 11BD;
+CB7B;CB7B;110D 116F 11BE;CB7B;110D 116F 11BE;
+CB7C;CB7C;110D 116F 11BF;CB7C;110D 116F 11BF;
+CB7D;CB7D;110D 116F 11C0;CB7D;110D 116F 11C0;
+CB7E;CB7E;110D 116F 11C1;CB7E;110D 116F 11C1;
+CB7F;CB7F;110D 116F 11C2;CB7F;110D 116F 11C2;
+CB80;CB80;110D 1170;CB80;110D 1170;
+CB81;CB81;110D 1170 11A8;CB81;110D 1170 11A8;
+CB82;CB82;110D 1170 11A9;CB82;110D 1170 11A9;
+CB83;CB83;110D 1170 11AA;CB83;110D 1170 11AA;
+CB84;CB84;110D 1170 11AB;CB84;110D 1170 11AB;
+CB85;CB85;110D 1170 11AC;CB85;110D 1170 11AC;
+CB86;CB86;110D 1170 11AD;CB86;110D 1170 11AD;
+CB87;CB87;110D 1170 11AE;CB87;110D 1170 11AE;
+CB88;CB88;110D 1170 11AF;CB88;110D 1170 11AF;
+CB89;CB89;110D 1170 11B0;CB89;110D 1170 11B0;
+CB8A;CB8A;110D 1170 11B1;CB8A;110D 1170 11B1;
+CB8B;CB8B;110D 1170 11B2;CB8B;110D 1170 11B2;
+CB8C;CB8C;110D 1170 11B3;CB8C;110D 1170 11B3;
+CB8D;CB8D;110D 1170 11B4;CB8D;110D 1170 11B4;
+CB8E;CB8E;110D 1170 11B5;CB8E;110D 1170 11B5;
+CB8F;CB8F;110D 1170 11B6;CB8F;110D 1170 11B6;
+CB90;CB90;110D 1170 11B7;CB90;110D 1170 11B7;
+CB91;CB91;110D 1170 11B8;CB91;110D 1170 11B8;
+CB92;CB92;110D 1170 11B9;CB92;110D 1170 11B9;
+CB93;CB93;110D 1170 11BA;CB93;110D 1170 11BA;
+CB94;CB94;110D 1170 11BB;CB94;110D 1170 11BB;
+CB95;CB95;110D 1170 11BC;CB95;110D 1170 11BC;
+CB96;CB96;110D 1170 11BD;CB96;110D 1170 11BD;
+CB97;CB97;110D 1170 11BE;CB97;110D 1170 11BE;
+CB98;CB98;110D 1170 11BF;CB98;110D 1170 11BF;
+CB99;CB99;110D 1170 11C0;CB99;110D 1170 11C0;
+CB9A;CB9A;110D 1170 11C1;CB9A;110D 1170 11C1;
+CB9B;CB9B;110D 1170 11C2;CB9B;110D 1170 11C2;
+CB9C;CB9C;110D 1171;CB9C;110D 1171;
+CB9D;CB9D;110D 1171 11A8;CB9D;110D 1171 11A8;
+CB9E;CB9E;110D 1171 11A9;CB9E;110D 1171 11A9;
+CB9F;CB9F;110D 1171 11AA;CB9F;110D 1171 11AA;
+CBA0;CBA0;110D 1171 11AB;CBA0;110D 1171 11AB;
+CBA1;CBA1;110D 1171 11AC;CBA1;110D 1171 11AC;
+CBA2;CBA2;110D 1171 11AD;CBA2;110D 1171 11AD;
+CBA3;CBA3;110D 1171 11AE;CBA3;110D 1171 11AE;
+CBA4;CBA4;110D 1171 11AF;CBA4;110D 1171 11AF;
+CBA5;CBA5;110D 1171 11B0;CBA5;110D 1171 11B0;
+CBA6;CBA6;110D 1171 11B1;CBA6;110D 1171 11B1;
+CBA7;CBA7;110D 1171 11B2;CBA7;110D 1171 11B2;
+CBA8;CBA8;110D 1171 11B3;CBA8;110D 1171 11B3;
+CBA9;CBA9;110D 1171 11B4;CBA9;110D 1171 11B4;
+CBAA;CBAA;110D 1171 11B5;CBAA;110D 1171 11B5;
+CBAB;CBAB;110D 1171 11B6;CBAB;110D 1171 11B6;
+CBAC;CBAC;110D 1171 11B7;CBAC;110D 1171 11B7;
+CBAD;CBAD;110D 1171 11B8;CBAD;110D 1171 11B8;
+CBAE;CBAE;110D 1171 11B9;CBAE;110D 1171 11B9;
+CBAF;CBAF;110D 1171 11BA;CBAF;110D 1171 11BA;
+CBB0;CBB0;110D 1171 11BB;CBB0;110D 1171 11BB;
+CBB1;CBB1;110D 1171 11BC;CBB1;110D 1171 11BC;
+CBB2;CBB2;110D 1171 11BD;CBB2;110D 1171 11BD;
+CBB3;CBB3;110D 1171 11BE;CBB3;110D 1171 11BE;
+CBB4;CBB4;110D 1171 11BF;CBB4;110D 1171 11BF;
+CBB5;CBB5;110D 1171 11C0;CBB5;110D 1171 11C0;
+CBB6;CBB6;110D 1171 11C1;CBB6;110D 1171 11C1;
+CBB7;CBB7;110D 1171 11C2;CBB7;110D 1171 11C2;
+CBB8;CBB8;110D 1172;CBB8;110D 1172;
+CBB9;CBB9;110D 1172 11A8;CBB9;110D 1172 11A8;
+CBBA;CBBA;110D 1172 11A9;CBBA;110D 1172 11A9;
+CBBB;CBBB;110D 1172 11AA;CBBB;110D 1172 11AA;
+CBBC;CBBC;110D 1172 11AB;CBBC;110D 1172 11AB;
+CBBD;CBBD;110D 1172 11AC;CBBD;110D 1172 11AC;
+CBBE;CBBE;110D 1172 11AD;CBBE;110D 1172 11AD;
+CBBF;CBBF;110D 1172 11AE;CBBF;110D 1172 11AE;
+CBC0;CBC0;110D 1172 11AF;CBC0;110D 1172 11AF;
+CBC1;CBC1;110D 1172 11B0;CBC1;110D 1172 11B0;
+CBC2;CBC2;110D 1172 11B1;CBC2;110D 1172 11B1;
+CBC3;CBC3;110D 1172 11B2;CBC3;110D 1172 11B2;
+CBC4;CBC4;110D 1172 11B3;CBC4;110D 1172 11B3;
+CBC5;CBC5;110D 1172 11B4;CBC5;110D 1172 11B4;
+CBC6;CBC6;110D 1172 11B5;CBC6;110D 1172 11B5;
+CBC7;CBC7;110D 1172 11B6;CBC7;110D 1172 11B6;
+CBC8;CBC8;110D 1172 11B7;CBC8;110D 1172 11B7;
+CBC9;CBC9;110D 1172 11B8;CBC9;110D 1172 11B8;
+CBCA;CBCA;110D 1172 11B9;CBCA;110D 1172 11B9;
+CBCB;CBCB;110D 1172 11BA;CBCB;110D 1172 11BA;
+CBCC;CBCC;110D 1172 11BB;CBCC;110D 1172 11BB;
+CBCD;CBCD;110D 1172 11BC;CBCD;110D 1172 11BC;
+CBCE;CBCE;110D 1172 11BD;CBCE;110D 1172 11BD;
+CBCF;CBCF;110D 1172 11BE;CBCF;110D 1172 11BE;
+CBD0;CBD0;110D 1172 11BF;CBD0;110D 1172 11BF;
+CBD1;CBD1;110D 1172 11C0;CBD1;110D 1172 11C0;
+CBD2;CBD2;110D 1172 11C1;CBD2;110D 1172 11C1;
+CBD3;CBD3;110D 1172 11C2;CBD3;110D 1172 11C2;
+CBD4;CBD4;110D 1173;CBD4;110D 1173;
+CBD5;CBD5;110D 1173 11A8;CBD5;110D 1173 11A8;
+CBD6;CBD6;110D 1173 11A9;CBD6;110D 1173 11A9;
+CBD7;CBD7;110D 1173 11AA;CBD7;110D 1173 11AA;
+CBD8;CBD8;110D 1173 11AB;CBD8;110D 1173 11AB;
+CBD9;CBD9;110D 1173 11AC;CBD9;110D 1173 11AC;
+CBDA;CBDA;110D 1173 11AD;CBDA;110D 1173 11AD;
+CBDB;CBDB;110D 1173 11AE;CBDB;110D 1173 11AE;
+CBDC;CBDC;110D 1173 11AF;CBDC;110D 1173 11AF;
+CBDD;CBDD;110D 1173 11B0;CBDD;110D 1173 11B0;
+CBDE;CBDE;110D 1173 11B1;CBDE;110D 1173 11B1;
+CBDF;CBDF;110D 1173 11B2;CBDF;110D 1173 11B2;
+CBE0;CBE0;110D 1173 11B3;CBE0;110D 1173 11B3;
+CBE1;CBE1;110D 1173 11B4;CBE1;110D 1173 11B4;
+CBE2;CBE2;110D 1173 11B5;CBE2;110D 1173 11B5;
+CBE3;CBE3;110D 1173 11B6;CBE3;110D 1173 11B6;
+CBE4;CBE4;110D 1173 11B7;CBE4;110D 1173 11B7;
+CBE5;CBE5;110D 1173 11B8;CBE5;110D 1173 11B8;
+CBE6;CBE6;110D 1173 11B9;CBE6;110D 1173 11B9;
+CBE7;CBE7;110D 1173 11BA;CBE7;110D 1173 11BA;
+CBE8;CBE8;110D 1173 11BB;CBE8;110D 1173 11BB;
+CBE9;CBE9;110D 1173 11BC;CBE9;110D 1173 11BC;
+CBEA;CBEA;110D 1173 11BD;CBEA;110D 1173 11BD;
+CBEB;CBEB;110D 1173 11BE;CBEB;110D 1173 11BE;
+CBEC;CBEC;110D 1173 11BF;CBEC;110D 1173 11BF;
+CBED;CBED;110D 1173 11C0;CBED;110D 1173 11C0;
+CBEE;CBEE;110D 1173 11C1;CBEE;110D 1173 11C1;
+CBEF;CBEF;110D 1173 11C2;CBEF;110D 1173 11C2;
+CBF0;CBF0;110D 1174;CBF0;110D 1174;
+CBF1;CBF1;110D 1174 11A8;CBF1;110D 1174 11A8;
+CBF2;CBF2;110D 1174 11A9;CBF2;110D 1174 11A9;
+CBF3;CBF3;110D 1174 11AA;CBF3;110D 1174 11AA;
+CBF4;CBF4;110D 1174 11AB;CBF4;110D 1174 11AB;
+CBF5;CBF5;110D 1174 11AC;CBF5;110D 1174 11AC;
+CBF6;CBF6;110D 1174 11AD;CBF6;110D 1174 11AD;
+CBF7;CBF7;110D 1174 11AE;CBF7;110D 1174 11AE;
+CBF8;CBF8;110D 1174 11AF;CBF8;110D 1174 11AF;
+CBF9;CBF9;110D 1174 11B0;CBF9;110D 1174 11B0;
+CBFA;CBFA;110D 1174 11B1;CBFA;110D 1174 11B1;
+CBFB;CBFB;110D 1174 11B2;CBFB;110D 1174 11B2;
+CBFC;CBFC;110D 1174 11B3;CBFC;110D 1174 11B3;
+CBFD;CBFD;110D 1174 11B4;CBFD;110D 1174 11B4;
+CBFE;CBFE;110D 1174 11B5;CBFE;110D 1174 11B5;
+CBFF;CBFF;110D 1174 11B6;CBFF;110D 1174 11B6;
+CC00;CC00;110D 1174 11B7;CC00;110D 1174 11B7;
+CC01;CC01;110D 1174 11B8;CC01;110D 1174 11B8;
+CC02;CC02;110D 1174 11B9;CC02;110D 1174 11B9;
+CC03;CC03;110D 1174 11BA;CC03;110D 1174 11BA;
+CC04;CC04;110D 1174 11BB;CC04;110D 1174 11BB;
+CC05;CC05;110D 1174 11BC;CC05;110D 1174 11BC;
+CC06;CC06;110D 1174 11BD;CC06;110D 1174 11BD;
+CC07;CC07;110D 1174 11BE;CC07;110D 1174 11BE;
+CC08;CC08;110D 1174 11BF;CC08;110D 1174 11BF;
+CC09;CC09;110D 1174 11C0;CC09;110D 1174 11C0;
+CC0A;CC0A;110D 1174 11C1;CC0A;110D 1174 11C1;
+CC0B;CC0B;110D 1174 11C2;CC0B;110D 1174 11C2;
+CC0C;CC0C;110D 1175;CC0C;110D 1175;
+CC0D;CC0D;110D 1175 11A8;CC0D;110D 1175 11A8;
+CC0E;CC0E;110D 1175 11A9;CC0E;110D 1175 11A9;
+CC0F;CC0F;110D 1175 11AA;CC0F;110D 1175 11AA;
+CC10;CC10;110D 1175 11AB;CC10;110D 1175 11AB;
+CC11;CC11;110D 1175 11AC;CC11;110D 1175 11AC;
+CC12;CC12;110D 1175 11AD;CC12;110D 1175 11AD;
+CC13;CC13;110D 1175 11AE;CC13;110D 1175 11AE;
+CC14;CC14;110D 1175 11AF;CC14;110D 1175 11AF;
+CC15;CC15;110D 1175 11B0;CC15;110D 1175 11B0;
+CC16;CC16;110D 1175 11B1;CC16;110D 1175 11B1;
+CC17;CC17;110D 1175 11B2;CC17;110D 1175 11B2;
+CC18;CC18;110D 1175 11B3;CC18;110D 1175 11B3;
+CC19;CC19;110D 1175 11B4;CC19;110D 1175 11B4;
+CC1A;CC1A;110D 1175 11B5;CC1A;110D 1175 11B5;
+CC1B;CC1B;110D 1175 11B6;CC1B;110D 1175 11B6;
+CC1C;CC1C;110D 1175 11B7;CC1C;110D 1175 11B7;
+CC1D;CC1D;110D 1175 11B8;CC1D;110D 1175 11B8;
+CC1E;CC1E;110D 1175 11B9;CC1E;110D 1175 11B9;
+CC1F;CC1F;110D 1175 11BA;CC1F;110D 1175 11BA;
+CC20;CC20;110D 1175 11BB;CC20;110D 1175 11BB;
+CC21;CC21;110D 1175 11BC;CC21;110D 1175 11BC;
+CC22;CC22;110D 1175 11BD;CC22;110D 1175 11BD;
+CC23;CC23;110D 1175 11BE;CC23;110D 1175 11BE;
+CC24;CC24;110D 1175 11BF;CC24;110D 1175 11BF;
+CC25;CC25;110D 1175 11C0;CC25;110D 1175 11C0;
+CC26;CC26;110D 1175 11C1;CC26;110D 1175 11C1;
+CC27;CC27;110D 1175 11C2;CC27;110D 1175 11C2;
+CC28;CC28;110E 1161;CC28;110E 1161;
+CC29;CC29;110E 1161 11A8;CC29;110E 1161 11A8;
+CC2A;CC2A;110E 1161 11A9;CC2A;110E 1161 11A9;
+CC2B;CC2B;110E 1161 11AA;CC2B;110E 1161 11AA;
+CC2C;CC2C;110E 1161 11AB;CC2C;110E 1161 11AB;
+CC2D;CC2D;110E 1161 11AC;CC2D;110E 1161 11AC;
+CC2E;CC2E;110E 1161 11AD;CC2E;110E 1161 11AD;
+CC2F;CC2F;110E 1161 11AE;CC2F;110E 1161 11AE;
+CC30;CC30;110E 1161 11AF;CC30;110E 1161 11AF;
+CC31;CC31;110E 1161 11B0;CC31;110E 1161 11B0;
+CC32;CC32;110E 1161 11B1;CC32;110E 1161 11B1;
+CC33;CC33;110E 1161 11B2;CC33;110E 1161 11B2;
+CC34;CC34;110E 1161 11B3;CC34;110E 1161 11B3;
+CC35;CC35;110E 1161 11B4;CC35;110E 1161 11B4;
+CC36;CC36;110E 1161 11B5;CC36;110E 1161 11B5;
+CC37;CC37;110E 1161 11B6;CC37;110E 1161 11B6;
+CC38;CC38;110E 1161 11B7;CC38;110E 1161 11B7;
+CC39;CC39;110E 1161 11B8;CC39;110E 1161 11B8;
+CC3A;CC3A;110E 1161 11B9;CC3A;110E 1161 11B9;
+CC3B;CC3B;110E 1161 11BA;CC3B;110E 1161 11BA;
+CC3C;CC3C;110E 1161 11BB;CC3C;110E 1161 11BB;
+CC3D;CC3D;110E 1161 11BC;CC3D;110E 1161 11BC;
+CC3E;CC3E;110E 1161 11BD;CC3E;110E 1161 11BD;
+CC3F;CC3F;110E 1161 11BE;CC3F;110E 1161 11BE;
+CC40;CC40;110E 1161 11BF;CC40;110E 1161 11BF;
+CC41;CC41;110E 1161 11C0;CC41;110E 1161 11C0;
+CC42;CC42;110E 1161 11C1;CC42;110E 1161 11C1;
+CC43;CC43;110E 1161 11C2;CC43;110E 1161 11C2;
+CC44;CC44;110E 1162;CC44;110E 1162;
+CC45;CC45;110E 1162 11A8;CC45;110E 1162 11A8;
+CC46;CC46;110E 1162 11A9;CC46;110E 1162 11A9;
+CC47;CC47;110E 1162 11AA;CC47;110E 1162 11AA;
+CC48;CC48;110E 1162 11AB;CC48;110E 1162 11AB;
+CC49;CC49;110E 1162 11AC;CC49;110E 1162 11AC;
+CC4A;CC4A;110E 1162 11AD;CC4A;110E 1162 11AD;
+CC4B;CC4B;110E 1162 11AE;CC4B;110E 1162 11AE;
+CC4C;CC4C;110E 1162 11AF;CC4C;110E 1162 11AF;
+CC4D;CC4D;110E 1162 11B0;CC4D;110E 1162 11B0;
+CC4E;CC4E;110E 1162 11B1;CC4E;110E 1162 11B1;
+CC4F;CC4F;110E 1162 11B2;CC4F;110E 1162 11B2;
+CC50;CC50;110E 1162 11B3;CC50;110E 1162 11B3;
+CC51;CC51;110E 1162 11B4;CC51;110E 1162 11B4;
+CC52;CC52;110E 1162 11B5;CC52;110E 1162 11B5;
+CC53;CC53;110E 1162 11B6;CC53;110E 1162 11B6;
+CC54;CC54;110E 1162 11B7;CC54;110E 1162 11B7;
+CC55;CC55;110E 1162 11B8;CC55;110E 1162 11B8;
+CC56;CC56;110E 1162 11B9;CC56;110E 1162 11B9;
+CC57;CC57;110E 1162 11BA;CC57;110E 1162 11BA;
+CC58;CC58;110E 1162 11BB;CC58;110E 1162 11BB;
+CC59;CC59;110E 1162 11BC;CC59;110E 1162 11BC;
+CC5A;CC5A;110E 1162 11BD;CC5A;110E 1162 11BD;
+CC5B;CC5B;110E 1162 11BE;CC5B;110E 1162 11BE;
+CC5C;CC5C;110E 1162 11BF;CC5C;110E 1162 11BF;
+CC5D;CC5D;110E 1162 11C0;CC5D;110E 1162 11C0;
+CC5E;CC5E;110E 1162 11C1;CC5E;110E 1162 11C1;
+CC5F;CC5F;110E 1162 11C2;CC5F;110E 1162 11C2;
+CC60;CC60;110E 1163;CC60;110E 1163;
+CC61;CC61;110E 1163 11A8;CC61;110E 1163 11A8;
+CC62;CC62;110E 1163 11A9;CC62;110E 1163 11A9;
+CC63;CC63;110E 1163 11AA;CC63;110E 1163 11AA;
+CC64;CC64;110E 1163 11AB;CC64;110E 1163 11AB;
+CC65;CC65;110E 1163 11AC;CC65;110E 1163 11AC;
+CC66;CC66;110E 1163 11AD;CC66;110E 1163 11AD;
+CC67;CC67;110E 1163 11AE;CC67;110E 1163 11AE;
+CC68;CC68;110E 1163 11AF;CC68;110E 1163 11AF;
+CC69;CC69;110E 1163 11B0;CC69;110E 1163 11B0;
+CC6A;CC6A;110E 1163 11B1;CC6A;110E 1163 11B1;
+CC6B;CC6B;110E 1163 11B2;CC6B;110E 1163 11B2;
+CC6C;CC6C;110E 1163 11B3;CC6C;110E 1163 11B3;
+CC6D;CC6D;110E 1163 11B4;CC6D;110E 1163 11B4;
+CC6E;CC6E;110E 1163 11B5;CC6E;110E 1163 11B5;
+CC6F;CC6F;110E 1163 11B6;CC6F;110E 1163 11B6;
+CC70;CC70;110E 1163 11B7;CC70;110E 1163 11B7;
+CC71;CC71;110E 1163 11B8;CC71;110E 1163 11B8;
+CC72;CC72;110E 1163 11B9;CC72;110E 1163 11B9;
+CC73;CC73;110E 1163 11BA;CC73;110E 1163 11BA;
+CC74;CC74;110E 1163 11BB;CC74;110E 1163 11BB;
+CC75;CC75;110E 1163 11BC;CC75;110E 1163 11BC;
+CC76;CC76;110E 1163 11BD;CC76;110E 1163 11BD;
+CC77;CC77;110E 1163 11BE;CC77;110E 1163 11BE;
+CC78;CC78;110E 1163 11BF;CC78;110E 1163 11BF;
+CC79;CC79;110E 1163 11C0;CC79;110E 1163 11C0;
+CC7A;CC7A;110E 1163 11C1;CC7A;110E 1163 11C1;
+CC7B;CC7B;110E 1163 11C2;CC7B;110E 1163 11C2;
+CC7C;CC7C;110E 1164;CC7C;110E 1164;
+CC7D;CC7D;110E 1164 11A8;CC7D;110E 1164 11A8;
+CC7E;CC7E;110E 1164 11A9;CC7E;110E 1164 11A9;
+CC7F;CC7F;110E 1164 11AA;CC7F;110E 1164 11AA;
+CC80;CC80;110E 1164 11AB;CC80;110E 1164 11AB;
+CC81;CC81;110E 1164 11AC;CC81;110E 1164 11AC;
+CC82;CC82;110E 1164 11AD;CC82;110E 1164 11AD;
+CC83;CC83;110E 1164 11AE;CC83;110E 1164 11AE;
+CC84;CC84;110E 1164 11AF;CC84;110E 1164 11AF;
+CC85;CC85;110E 1164 11B0;CC85;110E 1164 11B0;
+CC86;CC86;110E 1164 11B1;CC86;110E 1164 11B1;
+CC87;CC87;110E 1164 11B2;CC87;110E 1164 11B2;
+CC88;CC88;110E 1164 11B3;CC88;110E 1164 11B3;
+CC89;CC89;110E 1164 11B4;CC89;110E 1164 11B4;
+CC8A;CC8A;110E 1164 11B5;CC8A;110E 1164 11B5;
+CC8B;CC8B;110E 1164 11B6;CC8B;110E 1164 11B6;
+CC8C;CC8C;110E 1164 11B7;CC8C;110E 1164 11B7;
+CC8D;CC8D;110E 1164 11B8;CC8D;110E 1164 11B8;
+CC8E;CC8E;110E 1164 11B9;CC8E;110E 1164 11B9;
+CC8F;CC8F;110E 1164 11BA;CC8F;110E 1164 11BA;
+CC90;CC90;110E 1164 11BB;CC90;110E 1164 11BB;
+CC91;CC91;110E 1164 11BC;CC91;110E 1164 11BC;
+CC92;CC92;110E 1164 11BD;CC92;110E 1164 11BD;
+CC93;CC93;110E 1164 11BE;CC93;110E 1164 11BE;
+CC94;CC94;110E 1164 11BF;CC94;110E 1164 11BF;
+CC95;CC95;110E 1164 11C0;CC95;110E 1164 11C0;
+CC96;CC96;110E 1164 11C1;CC96;110E 1164 11C1;
+CC97;CC97;110E 1164 11C2;CC97;110E 1164 11C2;
+CC98;CC98;110E 1165;CC98;110E 1165;
+CC99;CC99;110E 1165 11A8;CC99;110E 1165 11A8;
+CC9A;CC9A;110E 1165 11A9;CC9A;110E 1165 11A9;
+CC9B;CC9B;110E 1165 11AA;CC9B;110E 1165 11AA;
+CC9C;CC9C;110E 1165 11AB;CC9C;110E 1165 11AB;
+CC9D;CC9D;110E 1165 11AC;CC9D;110E 1165 11AC;
+CC9E;CC9E;110E 1165 11AD;CC9E;110E 1165 11AD;
+CC9F;CC9F;110E 1165 11AE;CC9F;110E 1165 11AE;
+CCA0;CCA0;110E 1165 11AF;CCA0;110E 1165 11AF;
+CCA1;CCA1;110E 1165 11B0;CCA1;110E 1165 11B0;
+CCA2;CCA2;110E 1165 11B1;CCA2;110E 1165 11B1;
+CCA3;CCA3;110E 1165 11B2;CCA3;110E 1165 11B2;
+CCA4;CCA4;110E 1165 11B3;CCA4;110E 1165 11B3;
+CCA5;CCA5;110E 1165 11B4;CCA5;110E 1165 11B4;
+CCA6;CCA6;110E 1165 11B5;CCA6;110E 1165 11B5;
+CCA7;CCA7;110E 1165 11B6;CCA7;110E 1165 11B6;
+CCA8;CCA8;110E 1165 11B7;CCA8;110E 1165 11B7;
+CCA9;CCA9;110E 1165 11B8;CCA9;110E 1165 11B8;
+CCAA;CCAA;110E 1165 11B9;CCAA;110E 1165 11B9;
+CCAB;CCAB;110E 1165 11BA;CCAB;110E 1165 11BA;
+CCAC;CCAC;110E 1165 11BB;CCAC;110E 1165 11BB;
+CCAD;CCAD;110E 1165 11BC;CCAD;110E 1165 11BC;
+CCAE;CCAE;110E 1165 11BD;CCAE;110E 1165 11BD;
+CCAF;CCAF;110E 1165 11BE;CCAF;110E 1165 11BE;
+CCB0;CCB0;110E 1165 11BF;CCB0;110E 1165 11BF;
+CCB1;CCB1;110E 1165 11C0;CCB1;110E 1165 11C0;
+CCB2;CCB2;110E 1165 11C1;CCB2;110E 1165 11C1;
+CCB3;CCB3;110E 1165 11C2;CCB3;110E 1165 11C2;
+CCB4;CCB4;110E 1166;CCB4;110E 1166;
+CCB5;CCB5;110E 1166 11A8;CCB5;110E 1166 11A8;
+CCB6;CCB6;110E 1166 11A9;CCB6;110E 1166 11A9;
+CCB7;CCB7;110E 1166 11AA;CCB7;110E 1166 11AA;
+CCB8;CCB8;110E 1166 11AB;CCB8;110E 1166 11AB;
+CCB9;CCB9;110E 1166 11AC;CCB9;110E 1166 11AC;
+CCBA;CCBA;110E 1166 11AD;CCBA;110E 1166 11AD;
+CCBB;CCBB;110E 1166 11AE;CCBB;110E 1166 11AE;
+CCBC;CCBC;110E 1166 11AF;CCBC;110E 1166 11AF;
+CCBD;CCBD;110E 1166 11B0;CCBD;110E 1166 11B0;
+CCBE;CCBE;110E 1166 11B1;CCBE;110E 1166 11B1;
+CCBF;CCBF;110E 1166 11B2;CCBF;110E 1166 11B2;
+CCC0;CCC0;110E 1166 11B3;CCC0;110E 1166 11B3;
+CCC1;CCC1;110E 1166 11B4;CCC1;110E 1166 11B4;
+CCC2;CCC2;110E 1166 11B5;CCC2;110E 1166 11B5;
+CCC3;CCC3;110E 1166 11B6;CCC3;110E 1166 11B6;
+CCC4;CCC4;110E 1166 11B7;CCC4;110E 1166 11B7;
+CCC5;CCC5;110E 1166 11B8;CCC5;110E 1166 11B8;
+CCC6;CCC6;110E 1166 11B9;CCC6;110E 1166 11B9;
+CCC7;CCC7;110E 1166 11BA;CCC7;110E 1166 11BA;
+CCC8;CCC8;110E 1166 11BB;CCC8;110E 1166 11BB;
+CCC9;CCC9;110E 1166 11BC;CCC9;110E 1166 11BC;
+CCCA;CCCA;110E 1166 11BD;CCCA;110E 1166 11BD;
+CCCB;CCCB;110E 1166 11BE;CCCB;110E 1166 11BE;
+CCCC;CCCC;110E 1166 11BF;CCCC;110E 1166 11BF;
+CCCD;CCCD;110E 1166 11C0;CCCD;110E 1166 11C0;
+CCCE;CCCE;110E 1166 11C1;CCCE;110E 1166 11C1;
+CCCF;CCCF;110E 1166 11C2;CCCF;110E 1166 11C2;
+CCD0;CCD0;110E 1167;CCD0;110E 1167;
+CCD1;CCD1;110E 1167 11A8;CCD1;110E 1167 11A8;
+CCD2;CCD2;110E 1167 11A9;CCD2;110E 1167 11A9;
+CCD3;CCD3;110E 1167 11AA;CCD3;110E 1167 11AA;
+CCD4;CCD4;110E 1167 11AB;CCD4;110E 1167 11AB;
+CCD5;CCD5;110E 1167 11AC;CCD5;110E 1167 11AC;
+CCD6;CCD6;110E 1167 11AD;CCD6;110E 1167 11AD;
+CCD7;CCD7;110E 1167 11AE;CCD7;110E 1167 11AE;
+CCD8;CCD8;110E 1167 11AF;CCD8;110E 1167 11AF;
+CCD9;CCD9;110E 1167 11B0;CCD9;110E 1167 11B0;
+CCDA;CCDA;110E 1167 11B1;CCDA;110E 1167 11B1;
+CCDB;CCDB;110E 1167 11B2;CCDB;110E 1167 11B2;
+CCDC;CCDC;110E 1167 11B3;CCDC;110E 1167 11B3;
+CCDD;CCDD;110E 1167 11B4;CCDD;110E 1167 11B4;
+CCDE;CCDE;110E 1167 11B5;CCDE;110E 1167 11B5;
+CCDF;CCDF;110E 1167 11B6;CCDF;110E 1167 11B6;
+CCE0;CCE0;110E 1167 11B7;CCE0;110E 1167 11B7;
+CCE1;CCE1;110E 1167 11B8;CCE1;110E 1167 11B8;
+CCE2;CCE2;110E 1167 11B9;CCE2;110E 1167 11B9;
+CCE3;CCE3;110E 1167 11BA;CCE3;110E 1167 11BA;
+CCE4;CCE4;110E 1167 11BB;CCE4;110E 1167 11BB;
+CCE5;CCE5;110E 1167 11BC;CCE5;110E 1167 11BC;
+CCE6;CCE6;110E 1167 11BD;CCE6;110E 1167 11BD;
+CCE7;CCE7;110E 1167 11BE;CCE7;110E 1167 11BE;
+CCE8;CCE8;110E 1167 11BF;CCE8;110E 1167 11BF;
+CCE9;CCE9;110E 1167 11C0;CCE9;110E 1167 11C0;
+CCEA;CCEA;110E 1167 11C1;CCEA;110E 1167 11C1;
+CCEB;CCEB;110E 1167 11C2;CCEB;110E 1167 11C2;
+CCEC;CCEC;110E 1168;CCEC;110E 1168;
+CCED;CCED;110E 1168 11A8;CCED;110E 1168 11A8;
+CCEE;CCEE;110E 1168 11A9;CCEE;110E 1168 11A9;
+CCEF;CCEF;110E 1168 11AA;CCEF;110E 1168 11AA;
+CCF0;CCF0;110E 1168 11AB;CCF0;110E 1168 11AB;
+CCF1;CCF1;110E 1168 11AC;CCF1;110E 1168 11AC;
+CCF2;CCF2;110E 1168 11AD;CCF2;110E 1168 11AD;
+CCF3;CCF3;110E 1168 11AE;CCF3;110E 1168 11AE;
+CCF4;CCF4;110E 1168 11AF;CCF4;110E 1168 11AF;
+CCF5;CCF5;110E 1168 11B0;CCF5;110E 1168 11B0;
+CCF6;CCF6;110E 1168 11B1;CCF6;110E 1168 11B1;
+CCF7;CCF7;110E 1168 11B2;CCF7;110E 1168 11B2;
+CCF8;CCF8;110E 1168 11B3;CCF8;110E 1168 11B3;
+CCF9;CCF9;110E 1168 11B4;CCF9;110E 1168 11B4;
+CCFA;CCFA;110E 1168 11B5;CCFA;110E 1168 11B5;
+CCFB;CCFB;110E 1168 11B6;CCFB;110E 1168 11B6;
+CCFC;CCFC;110E 1168 11B7;CCFC;110E 1168 11B7;
+CCFD;CCFD;110E 1168 11B8;CCFD;110E 1168 11B8;
+CCFE;CCFE;110E 1168 11B9;CCFE;110E 1168 11B9;
+CCFF;CCFF;110E 1168 11BA;CCFF;110E 1168 11BA;
+CD00;CD00;110E 1168 11BB;CD00;110E 1168 11BB;
+CD01;CD01;110E 1168 11BC;CD01;110E 1168 11BC;
+CD02;CD02;110E 1168 11BD;CD02;110E 1168 11BD;
+CD03;CD03;110E 1168 11BE;CD03;110E 1168 11BE;
+CD04;CD04;110E 1168 11BF;CD04;110E 1168 11BF;
+CD05;CD05;110E 1168 11C0;CD05;110E 1168 11C0;
+CD06;CD06;110E 1168 11C1;CD06;110E 1168 11C1;
+CD07;CD07;110E 1168 11C2;CD07;110E 1168 11C2;
+CD08;CD08;110E 1169;CD08;110E 1169;
+CD09;CD09;110E 1169 11A8;CD09;110E 1169 11A8;
+CD0A;CD0A;110E 1169 11A9;CD0A;110E 1169 11A9;
+CD0B;CD0B;110E 1169 11AA;CD0B;110E 1169 11AA;
+CD0C;CD0C;110E 1169 11AB;CD0C;110E 1169 11AB;
+CD0D;CD0D;110E 1169 11AC;CD0D;110E 1169 11AC;
+CD0E;CD0E;110E 1169 11AD;CD0E;110E 1169 11AD;
+CD0F;CD0F;110E 1169 11AE;CD0F;110E 1169 11AE;
+CD10;CD10;110E 1169 11AF;CD10;110E 1169 11AF;
+CD11;CD11;110E 1169 11B0;CD11;110E 1169 11B0;
+CD12;CD12;110E 1169 11B1;CD12;110E 1169 11B1;
+CD13;CD13;110E 1169 11B2;CD13;110E 1169 11B2;
+CD14;CD14;110E 1169 11B3;CD14;110E 1169 11B3;
+CD15;CD15;110E 1169 11B4;CD15;110E 1169 11B4;
+CD16;CD16;110E 1169 11B5;CD16;110E 1169 11B5;
+CD17;CD17;110E 1169 11B6;CD17;110E 1169 11B6;
+CD18;CD18;110E 1169 11B7;CD18;110E 1169 11B7;
+CD19;CD19;110E 1169 11B8;CD19;110E 1169 11B8;
+CD1A;CD1A;110E 1169 11B9;CD1A;110E 1169 11B9;
+CD1B;CD1B;110E 1169 11BA;CD1B;110E 1169 11BA;
+CD1C;CD1C;110E 1169 11BB;CD1C;110E 1169 11BB;
+CD1D;CD1D;110E 1169 11BC;CD1D;110E 1169 11BC;
+CD1E;CD1E;110E 1169 11BD;CD1E;110E 1169 11BD;
+CD1F;CD1F;110E 1169 11BE;CD1F;110E 1169 11BE;
+CD20;CD20;110E 1169 11BF;CD20;110E 1169 11BF;
+CD21;CD21;110E 1169 11C0;CD21;110E 1169 11C0;
+CD22;CD22;110E 1169 11C1;CD22;110E 1169 11C1;
+CD23;CD23;110E 1169 11C2;CD23;110E 1169 11C2;
+CD24;CD24;110E 116A;CD24;110E 116A;
+CD25;CD25;110E 116A 11A8;CD25;110E 116A 11A8;
+CD26;CD26;110E 116A 11A9;CD26;110E 116A 11A9;
+CD27;CD27;110E 116A 11AA;CD27;110E 116A 11AA;
+CD28;CD28;110E 116A 11AB;CD28;110E 116A 11AB;
+CD29;CD29;110E 116A 11AC;CD29;110E 116A 11AC;
+CD2A;CD2A;110E 116A 11AD;CD2A;110E 116A 11AD;
+CD2B;CD2B;110E 116A 11AE;CD2B;110E 116A 11AE;
+CD2C;CD2C;110E 116A 11AF;CD2C;110E 116A 11AF;
+CD2D;CD2D;110E 116A 11B0;CD2D;110E 116A 11B0;
+CD2E;CD2E;110E 116A 11B1;CD2E;110E 116A 11B1;
+CD2F;CD2F;110E 116A 11B2;CD2F;110E 116A 11B2;
+CD30;CD30;110E 116A 11B3;CD30;110E 116A 11B3;
+CD31;CD31;110E 116A 11B4;CD31;110E 116A 11B4;
+CD32;CD32;110E 116A 11B5;CD32;110E 116A 11B5;
+CD33;CD33;110E 116A 11B6;CD33;110E 116A 11B6;
+CD34;CD34;110E 116A 11B7;CD34;110E 116A 11B7;
+CD35;CD35;110E 116A 11B8;CD35;110E 116A 11B8;
+CD36;CD36;110E 116A 11B9;CD36;110E 116A 11B9;
+CD37;CD37;110E 116A 11BA;CD37;110E 116A 11BA;
+CD38;CD38;110E 116A 11BB;CD38;110E 116A 11BB;
+CD39;CD39;110E 116A 11BC;CD39;110E 116A 11BC;
+CD3A;CD3A;110E 116A 11BD;CD3A;110E 116A 11BD;
+CD3B;CD3B;110E 116A 11BE;CD3B;110E 116A 11BE;
+CD3C;CD3C;110E 116A 11BF;CD3C;110E 116A 11BF;
+CD3D;CD3D;110E 116A 11C0;CD3D;110E 116A 11C0;
+CD3E;CD3E;110E 116A 11C1;CD3E;110E 116A 11C1;
+CD3F;CD3F;110E 116A 11C2;CD3F;110E 116A 11C2;
+CD40;CD40;110E 116B;CD40;110E 116B;
+CD41;CD41;110E 116B 11A8;CD41;110E 116B 11A8;
+CD42;CD42;110E 116B 11A9;CD42;110E 116B 11A9;
+CD43;CD43;110E 116B 11AA;CD43;110E 116B 11AA;
+CD44;CD44;110E 116B 11AB;CD44;110E 116B 11AB;
+CD45;CD45;110E 116B 11AC;CD45;110E 116B 11AC;
+CD46;CD46;110E 116B 11AD;CD46;110E 116B 11AD;
+CD47;CD47;110E 116B 11AE;CD47;110E 116B 11AE;
+CD48;CD48;110E 116B 11AF;CD48;110E 116B 11AF;
+CD49;CD49;110E 116B 11B0;CD49;110E 116B 11B0;
+CD4A;CD4A;110E 116B 11B1;CD4A;110E 116B 11B1;
+CD4B;CD4B;110E 116B 11B2;CD4B;110E 116B 11B2;
+CD4C;CD4C;110E 116B 11B3;CD4C;110E 116B 11B3;
+CD4D;CD4D;110E 116B 11B4;CD4D;110E 116B 11B4;
+CD4E;CD4E;110E 116B 11B5;CD4E;110E 116B 11B5;
+CD4F;CD4F;110E 116B 11B6;CD4F;110E 116B 11B6;
+CD50;CD50;110E 116B 11B7;CD50;110E 116B 11B7;
+CD51;CD51;110E 116B 11B8;CD51;110E 116B 11B8;
+CD52;CD52;110E 116B 11B9;CD52;110E 116B 11B9;
+CD53;CD53;110E 116B 11BA;CD53;110E 116B 11BA;
+CD54;CD54;110E 116B 11BB;CD54;110E 116B 11BB;
+CD55;CD55;110E 116B 11BC;CD55;110E 116B 11BC;
+CD56;CD56;110E 116B 11BD;CD56;110E 116B 11BD;
+CD57;CD57;110E 116B 11BE;CD57;110E 116B 11BE;
+CD58;CD58;110E 116B 11BF;CD58;110E 116B 11BF;
+CD59;CD59;110E 116B 11C0;CD59;110E 116B 11C0;
+CD5A;CD5A;110E 116B 11C1;CD5A;110E 116B 11C1;
+CD5B;CD5B;110E 116B 11C2;CD5B;110E 116B 11C2;
+CD5C;CD5C;110E 116C;CD5C;110E 116C;
+CD5D;CD5D;110E 116C 11A8;CD5D;110E 116C 11A8;
+CD5E;CD5E;110E 116C 11A9;CD5E;110E 116C 11A9;
+CD5F;CD5F;110E 116C 11AA;CD5F;110E 116C 11AA;
+CD60;CD60;110E 116C 11AB;CD60;110E 116C 11AB;
+CD61;CD61;110E 116C 11AC;CD61;110E 116C 11AC;
+CD62;CD62;110E 116C 11AD;CD62;110E 116C 11AD;
+CD63;CD63;110E 116C 11AE;CD63;110E 116C 11AE;
+CD64;CD64;110E 116C 11AF;CD64;110E 116C 11AF;
+CD65;CD65;110E 116C 11B0;CD65;110E 116C 11B0;
+CD66;CD66;110E 116C 11B1;CD66;110E 116C 11B1;
+CD67;CD67;110E 116C 11B2;CD67;110E 116C 11B2;
+CD68;CD68;110E 116C 11B3;CD68;110E 116C 11B3;
+CD69;CD69;110E 116C 11B4;CD69;110E 116C 11B4;
+CD6A;CD6A;110E 116C 11B5;CD6A;110E 116C 11B5;
+CD6B;CD6B;110E 116C 11B6;CD6B;110E 116C 11B6;
+CD6C;CD6C;110E 116C 11B7;CD6C;110E 116C 11B7;
+CD6D;CD6D;110E 116C 11B8;CD6D;110E 116C 11B8;
+CD6E;CD6E;110E 116C 11B9;CD6E;110E 116C 11B9;
+CD6F;CD6F;110E 116C 11BA;CD6F;110E 116C 11BA;
+CD70;CD70;110E 116C 11BB;CD70;110E 116C 11BB;
+CD71;CD71;110E 116C 11BC;CD71;110E 116C 11BC;
+CD72;CD72;110E 116C 11BD;CD72;110E 116C 11BD;
+CD73;CD73;110E 116C 11BE;CD73;110E 116C 11BE;
+CD74;CD74;110E 116C 11BF;CD74;110E 116C 11BF;
+CD75;CD75;110E 116C 11C0;CD75;110E 116C 11C0;
+CD76;CD76;110E 116C 11C1;CD76;110E 116C 11C1;
+CD77;CD77;110E 116C 11C2;CD77;110E 116C 11C2;
+CD78;CD78;110E 116D;CD78;110E 116D;
+CD79;CD79;110E 116D 11A8;CD79;110E 116D 11A8;
+CD7A;CD7A;110E 116D 11A9;CD7A;110E 116D 11A9;
+CD7B;CD7B;110E 116D 11AA;CD7B;110E 116D 11AA;
+CD7C;CD7C;110E 116D 11AB;CD7C;110E 116D 11AB;
+CD7D;CD7D;110E 116D 11AC;CD7D;110E 116D 11AC;
+CD7E;CD7E;110E 116D 11AD;CD7E;110E 116D 11AD;
+CD7F;CD7F;110E 116D 11AE;CD7F;110E 116D 11AE;
+CD80;CD80;110E 116D 11AF;CD80;110E 116D 11AF;
+CD81;CD81;110E 116D 11B0;CD81;110E 116D 11B0;
+CD82;CD82;110E 116D 11B1;CD82;110E 116D 11B1;
+CD83;CD83;110E 116D 11B2;CD83;110E 116D 11B2;
+CD84;CD84;110E 116D 11B3;CD84;110E 116D 11B3;
+CD85;CD85;110E 116D 11B4;CD85;110E 116D 11B4;
+CD86;CD86;110E 116D 11B5;CD86;110E 116D 11B5;
+CD87;CD87;110E 116D 11B6;CD87;110E 116D 11B6;
+CD88;CD88;110E 116D 11B7;CD88;110E 116D 11B7;
+CD89;CD89;110E 116D 11B8;CD89;110E 116D 11B8;
+CD8A;CD8A;110E 116D 11B9;CD8A;110E 116D 11B9;
+CD8B;CD8B;110E 116D 11BA;CD8B;110E 116D 11BA;
+CD8C;CD8C;110E 116D 11BB;CD8C;110E 116D 11BB;
+CD8D;CD8D;110E 116D 11BC;CD8D;110E 116D 11BC;
+CD8E;CD8E;110E 116D 11BD;CD8E;110E 116D 11BD;
+CD8F;CD8F;110E 116D 11BE;CD8F;110E 116D 11BE;
+CD90;CD90;110E 116D 11BF;CD90;110E 116D 11BF;
+CD91;CD91;110E 116D 11C0;CD91;110E 116D 11C0;
+CD92;CD92;110E 116D 11C1;CD92;110E 116D 11C1;
+CD93;CD93;110E 116D 11C2;CD93;110E 116D 11C2;
+CD94;CD94;110E 116E;CD94;110E 116E;
+CD95;CD95;110E 116E 11A8;CD95;110E 116E 11A8;
+CD96;CD96;110E 116E 11A9;CD96;110E 116E 11A9;
+CD97;CD97;110E 116E 11AA;CD97;110E 116E 11AA;
+CD98;CD98;110E 116E 11AB;CD98;110E 116E 11AB;
+CD99;CD99;110E 116E 11AC;CD99;110E 116E 11AC;
+CD9A;CD9A;110E 116E 11AD;CD9A;110E 116E 11AD;
+CD9B;CD9B;110E 116E 11AE;CD9B;110E 116E 11AE;
+CD9C;CD9C;110E 116E 11AF;CD9C;110E 116E 11AF;
+CD9D;CD9D;110E 116E 11B0;CD9D;110E 116E 11B0;
+CD9E;CD9E;110E 116E 11B1;CD9E;110E 116E 11B1;
+CD9F;CD9F;110E 116E 11B2;CD9F;110E 116E 11B2;
+CDA0;CDA0;110E 116E 11B3;CDA0;110E 116E 11B3;
+CDA1;CDA1;110E 116E 11B4;CDA1;110E 116E 11B4;
+CDA2;CDA2;110E 116E 11B5;CDA2;110E 116E 11B5;
+CDA3;CDA3;110E 116E 11B6;CDA3;110E 116E 11B6;
+CDA4;CDA4;110E 116E 11B7;CDA4;110E 116E 11B7;
+CDA5;CDA5;110E 116E 11B8;CDA5;110E 116E 11B8;
+CDA6;CDA6;110E 116E 11B9;CDA6;110E 116E 11B9;
+CDA7;CDA7;110E 116E 11BA;CDA7;110E 116E 11BA;
+CDA8;CDA8;110E 116E 11BB;CDA8;110E 116E 11BB;
+CDA9;CDA9;110E 116E 11BC;CDA9;110E 116E 11BC;
+CDAA;CDAA;110E 116E 11BD;CDAA;110E 116E 11BD;
+CDAB;CDAB;110E 116E 11BE;CDAB;110E 116E 11BE;
+CDAC;CDAC;110E 116E 11BF;CDAC;110E 116E 11BF;
+CDAD;CDAD;110E 116E 11C0;CDAD;110E 116E 11C0;
+CDAE;CDAE;110E 116E 11C1;CDAE;110E 116E 11C1;
+CDAF;CDAF;110E 116E 11C2;CDAF;110E 116E 11C2;
+CDB0;CDB0;110E 116F;CDB0;110E 116F;
+CDB1;CDB1;110E 116F 11A8;CDB1;110E 116F 11A8;
+CDB2;CDB2;110E 116F 11A9;CDB2;110E 116F 11A9;
+CDB3;CDB3;110E 116F 11AA;CDB3;110E 116F 11AA;
+CDB4;CDB4;110E 116F 11AB;CDB4;110E 116F 11AB;
+CDB5;CDB5;110E 116F 11AC;CDB5;110E 116F 11AC;
+CDB6;CDB6;110E 116F 11AD;CDB6;110E 116F 11AD;
+CDB7;CDB7;110E 116F 11AE;CDB7;110E 116F 11AE;
+CDB8;CDB8;110E 116F 11AF;CDB8;110E 116F 11AF;
+CDB9;CDB9;110E 116F 11B0;CDB9;110E 116F 11B0;
+CDBA;CDBA;110E 116F 11B1;CDBA;110E 116F 11B1;
+CDBB;CDBB;110E 116F 11B2;CDBB;110E 116F 11B2;
+CDBC;CDBC;110E 116F 11B3;CDBC;110E 116F 11B3;
+CDBD;CDBD;110E 116F 11B4;CDBD;110E 116F 11B4;
+CDBE;CDBE;110E 116F 11B5;CDBE;110E 116F 11B5;
+CDBF;CDBF;110E 116F 11B6;CDBF;110E 116F 11B6;
+CDC0;CDC0;110E 116F 11B7;CDC0;110E 116F 11B7;
+CDC1;CDC1;110E 116F 11B8;CDC1;110E 116F 11B8;
+CDC2;CDC2;110E 116F 11B9;CDC2;110E 116F 11B9;
+CDC3;CDC3;110E 116F 11BA;CDC3;110E 116F 11BA;
+CDC4;CDC4;110E 116F 11BB;CDC4;110E 116F 11BB;
+CDC5;CDC5;110E 116F 11BC;CDC5;110E 116F 11BC;
+CDC6;CDC6;110E 116F 11BD;CDC6;110E 116F 11BD;
+CDC7;CDC7;110E 116F 11BE;CDC7;110E 116F 11BE;
+CDC8;CDC8;110E 116F 11BF;CDC8;110E 116F 11BF;
+CDC9;CDC9;110E 116F 11C0;CDC9;110E 116F 11C0;
+CDCA;CDCA;110E 116F 11C1;CDCA;110E 116F 11C1;
+CDCB;CDCB;110E 116F 11C2;CDCB;110E 116F 11C2;
+CDCC;CDCC;110E 1170;CDCC;110E 1170;
+CDCD;CDCD;110E 1170 11A8;CDCD;110E 1170 11A8;
+CDCE;CDCE;110E 1170 11A9;CDCE;110E 1170 11A9;
+CDCF;CDCF;110E 1170 11AA;CDCF;110E 1170 11AA;
+CDD0;CDD0;110E 1170 11AB;CDD0;110E 1170 11AB;
+CDD1;CDD1;110E 1170 11AC;CDD1;110E 1170 11AC;
+CDD2;CDD2;110E 1170 11AD;CDD2;110E 1170 11AD;
+CDD3;CDD3;110E 1170 11AE;CDD3;110E 1170 11AE;
+CDD4;CDD4;110E 1170 11AF;CDD4;110E 1170 11AF;
+CDD5;CDD5;110E 1170 11B0;CDD5;110E 1170 11B0;
+CDD6;CDD6;110E 1170 11B1;CDD6;110E 1170 11B1;
+CDD7;CDD7;110E 1170 11B2;CDD7;110E 1170 11B2;
+CDD8;CDD8;110E 1170 11B3;CDD8;110E 1170 11B3;
+CDD9;CDD9;110E 1170 11B4;CDD9;110E 1170 11B4;
+CDDA;CDDA;110E 1170 11B5;CDDA;110E 1170 11B5;
+CDDB;CDDB;110E 1170 11B6;CDDB;110E 1170 11B6;
+CDDC;CDDC;110E 1170 11B7;CDDC;110E 1170 11B7;
+CDDD;CDDD;110E 1170 11B8;CDDD;110E 1170 11B8;
+CDDE;CDDE;110E 1170 11B9;CDDE;110E 1170 11B9;
+CDDF;CDDF;110E 1170 11BA;CDDF;110E 1170 11BA;
+CDE0;CDE0;110E 1170 11BB;CDE0;110E 1170 11BB;
+CDE1;CDE1;110E 1170 11BC;CDE1;110E 1170 11BC;
+CDE2;CDE2;110E 1170 11BD;CDE2;110E 1170 11BD;
+CDE3;CDE3;110E 1170 11BE;CDE3;110E 1170 11BE;
+CDE4;CDE4;110E 1170 11BF;CDE4;110E 1170 11BF;
+CDE5;CDE5;110E 1170 11C0;CDE5;110E 1170 11C0;
+CDE6;CDE6;110E 1170 11C1;CDE6;110E 1170 11C1;
+CDE7;CDE7;110E 1170 11C2;CDE7;110E 1170 11C2;
+CDE8;CDE8;110E 1171;CDE8;110E 1171;
+CDE9;CDE9;110E 1171 11A8;CDE9;110E 1171 11A8;
+CDEA;CDEA;110E 1171 11A9;CDEA;110E 1171 11A9;
+CDEB;CDEB;110E 1171 11AA;CDEB;110E 1171 11AA;
+CDEC;CDEC;110E 1171 11AB;CDEC;110E 1171 11AB;
+CDED;CDED;110E 1171 11AC;CDED;110E 1171 11AC;
+CDEE;CDEE;110E 1171 11AD;CDEE;110E 1171 11AD;
+CDEF;CDEF;110E 1171 11AE;CDEF;110E 1171 11AE;
+CDF0;CDF0;110E 1171 11AF;CDF0;110E 1171 11AF;
+CDF1;CDF1;110E 1171 11B0;CDF1;110E 1171 11B0;
+CDF2;CDF2;110E 1171 11B1;CDF2;110E 1171 11B1;
+CDF3;CDF3;110E 1171 11B2;CDF3;110E 1171 11B2;
+CDF4;CDF4;110E 1171 11B3;CDF4;110E 1171 11B3;
+CDF5;CDF5;110E 1171 11B4;CDF5;110E 1171 11B4;
+CDF6;CDF6;110E 1171 11B5;CDF6;110E 1171 11B5;
+CDF7;CDF7;110E 1171 11B6;CDF7;110E 1171 11B6;
+CDF8;CDF8;110E 1171 11B7;CDF8;110E 1171 11B7;
+CDF9;CDF9;110E 1171 11B8;CDF9;110E 1171 11B8;
+CDFA;CDFA;110E 1171 11B9;CDFA;110E 1171 11B9;
+CDFB;CDFB;110E 1171 11BA;CDFB;110E 1171 11BA;
+CDFC;CDFC;110E 1171 11BB;CDFC;110E 1171 11BB;
+CDFD;CDFD;110E 1171 11BC;CDFD;110E 1171 11BC;
+CDFE;CDFE;110E 1171 11BD;CDFE;110E 1171 11BD;
+CDFF;CDFF;110E 1171 11BE;CDFF;110E 1171 11BE;
+CE00;CE00;110E 1171 11BF;CE00;110E 1171 11BF;
+CE01;CE01;110E 1171 11C0;CE01;110E 1171 11C0;
+CE02;CE02;110E 1171 11C1;CE02;110E 1171 11C1;
+CE03;CE03;110E 1171 11C2;CE03;110E 1171 11C2;
+CE04;CE04;110E 1172;CE04;110E 1172;
+CE05;CE05;110E 1172 11A8;CE05;110E 1172 11A8;
+CE06;CE06;110E 1172 11A9;CE06;110E 1172 11A9;
+CE07;CE07;110E 1172 11AA;CE07;110E 1172 11AA;
+CE08;CE08;110E 1172 11AB;CE08;110E 1172 11AB;
+CE09;CE09;110E 1172 11AC;CE09;110E 1172 11AC;
+CE0A;CE0A;110E 1172 11AD;CE0A;110E 1172 11AD;
+CE0B;CE0B;110E 1172 11AE;CE0B;110E 1172 11AE;
+CE0C;CE0C;110E 1172 11AF;CE0C;110E 1172 11AF;
+CE0D;CE0D;110E 1172 11B0;CE0D;110E 1172 11B0;
+CE0E;CE0E;110E 1172 11B1;CE0E;110E 1172 11B1;
+CE0F;CE0F;110E 1172 11B2;CE0F;110E 1172 11B2;
+CE10;CE10;110E 1172 11B3;CE10;110E 1172 11B3;
+CE11;CE11;110E 1172 11B4;CE11;110E 1172 11B4;
+CE12;CE12;110E 1172 11B5;CE12;110E 1172 11B5;
+CE13;CE13;110E 1172 11B6;CE13;110E 1172 11B6;
+CE14;CE14;110E 1172 11B7;CE14;110E 1172 11B7;
+CE15;CE15;110E 1172 11B8;CE15;110E 1172 11B8;
+CE16;CE16;110E 1172 11B9;CE16;110E 1172 11B9;
+CE17;CE17;110E 1172 11BA;CE17;110E 1172 11BA;
+CE18;CE18;110E 1172 11BB;CE18;110E 1172 11BB;
+CE19;CE19;110E 1172 11BC;CE19;110E 1172 11BC;
+CE1A;CE1A;110E 1172 11BD;CE1A;110E 1172 11BD;
+CE1B;CE1B;110E 1172 11BE;CE1B;110E 1172 11BE;
+CE1C;CE1C;110E 1172 11BF;CE1C;110E 1172 11BF;
+CE1D;CE1D;110E 1172 11C0;CE1D;110E 1172 11C0;
+CE1E;CE1E;110E 1172 11C1;CE1E;110E 1172 11C1;
+CE1F;CE1F;110E 1172 11C2;CE1F;110E 1172 11C2;
+CE20;CE20;110E 1173;CE20;110E 1173;
+CE21;CE21;110E 1173 11A8;CE21;110E 1173 11A8;
+CE22;CE22;110E 1173 11A9;CE22;110E 1173 11A9;
+CE23;CE23;110E 1173 11AA;CE23;110E 1173 11AA;
+CE24;CE24;110E 1173 11AB;CE24;110E 1173 11AB;
+CE25;CE25;110E 1173 11AC;CE25;110E 1173 11AC;
+CE26;CE26;110E 1173 11AD;CE26;110E 1173 11AD;
+CE27;CE27;110E 1173 11AE;CE27;110E 1173 11AE;
+CE28;CE28;110E 1173 11AF;CE28;110E 1173 11AF;
+CE29;CE29;110E 1173 11B0;CE29;110E 1173 11B0;
+CE2A;CE2A;110E 1173 11B1;CE2A;110E 1173 11B1;
+CE2B;CE2B;110E 1173 11B2;CE2B;110E 1173 11B2;
+CE2C;CE2C;110E 1173 11B3;CE2C;110E 1173 11B3;
+CE2D;CE2D;110E 1173 11B4;CE2D;110E 1173 11B4;
+CE2E;CE2E;110E 1173 11B5;CE2E;110E 1173 11B5;
+CE2F;CE2F;110E 1173 11B6;CE2F;110E 1173 11B6;
+CE30;CE30;110E 1173 11B7;CE30;110E 1173 11B7;
+CE31;CE31;110E 1173 11B8;CE31;110E 1173 11B8;
+CE32;CE32;110E 1173 11B9;CE32;110E 1173 11B9;
+CE33;CE33;110E 1173 11BA;CE33;110E 1173 11BA;
+CE34;CE34;110E 1173 11BB;CE34;110E 1173 11BB;
+CE35;CE35;110E 1173 11BC;CE35;110E 1173 11BC;
+CE36;CE36;110E 1173 11BD;CE36;110E 1173 11BD;
+CE37;CE37;110E 1173 11BE;CE37;110E 1173 11BE;
+CE38;CE38;110E 1173 11BF;CE38;110E 1173 11BF;
+CE39;CE39;110E 1173 11C0;CE39;110E 1173 11C0;
+CE3A;CE3A;110E 1173 11C1;CE3A;110E 1173 11C1;
+CE3B;CE3B;110E 1173 11C2;CE3B;110E 1173 11C2;
+CE3C;CE3C;110E 1174;CE3C;110E 1174;
+CE3D;CE3D;110E 1174 11A8;CE3D;110E 1174 11A8;
+CE3E;CE3E;110E 1174 11A9;CE3E;110E 1174 11A9;
+CE3F;CE3F;110E 1174 11AA;CE3F;110E 1174 11AA;
+CE40;CE40;110E 1174 11AB;CE40;110E 1174 11AB;
+CE41;CE41;110E 1174 11AC;CE41;110E 1174 11AC;
+CE42;CE42;110E 1174 11AD;CE42;110E 1174 11AD;
+CE43;CE43;110E 1174 11AE;CE43;110E 1174 11AE;
+CE44;CE44;110E 1174 11AF;CE44;110E 1174 11AF;
+CE45;CE45;110E 1174 11B0;CE45;110E 1174 11B0;
+CE46;CE46;110E 1174 11B1;CE46;110E 1174 11B1;
+CE47;CE47;110E 1174 11B2;CE47;110E 1174 11B2;
+CE48;CE48;110E 1174 11B3;CE48;110E 1174 11B3;
+CE49;CE49;110E 1174 11B4;CE49;110E 1174 11B4;
+CE4A;CE4A;110E 1174 11B5;CE4A;110E 1174 11B5;
+CE4B;CE4B;110E 1174 11B6;CE4B;110E 1174 11B6;
+CE4C;CE4C;110E 1174 11B7;CE4C;110E 1174 11B7;
+CE4D;CE4D;110E 1174 11B8;CE4D;110E 1174 11B8;
+CE4E;CE4E;110E 1174 11B9;CE4E;110E 1174 11B9;
+CE4F;CE4F;110E 1174 11BA;CE4F;110E 1174 11BA;
+CE50;CE50;110E 1174 11BB;CE50;110E 1174 11BB;
+CE51;CE51;110E 1174 11BC;CE51;110E 1174 11BC;
+CE52;CE52;110E 1174 11BD;CE52;110E 1174 11BD;
+CE53;CE53;110E 1174 11BE;CE53;110E 1174 11BE;
+CE54;CE54;110E 1174 11BF;CE54;110E 1174 11BF;
+CE55;CE55;110E 1174 11C0;CE55;110E 1174 11C0;
+CE56;CE56;110E 1174 11C1;CE56;110E 1174 11C1;
+CE57;CE57;110E 1174 11C2;CE57;110E 1174 11C2;
+CE58;CE58;110E 1175;CE58;110E 1175;
+CE59;CE59;110E 1175 11A8;CE59;110E 1175 11A8;
+CE5A;CE5A;110E 1175 11A9;CE5A;110E 1175 11A9;
+CE5B;CE5B;110E 1175 11AA;CE5B;110E 1175 11AA;
+CE5C;CE5C;110E 1175 11AB;CE5C;110E 1175 11AB;
+CE5D;CE5D;110E 1175 11AC;CE5D;110E 1175 11AC;
+CE5E;CE5E;110E 1175 11AD;CE5E;110E 1175 11AD;
+CE5F;CE5F;110E 1175 11AE;CE5F;110E 1175 11AE;
+CE60;CE60;110E 1175 11AF;CE60;110E 1175 11AF;
+CE61;CE61;110E 1175 11B0;CE61;110E 1175 11B0;
+CE62;CE62;110E 1175 11B1;CE62;110E 1175 11B1;
+CE63;CE63;110E 1175 11B2;CE63;110E 1175 11B2;
+CE64;CE64;110E 1175 11B3;CE64;110E 1175 11B3;
+CE65;CE65;110E 1175 11B4;CE65;110E 1175 11B4;
+CE66;CE66;110E 1175 11B5;CE66;110E 1175 11B5;
+CE67;CE67;110E 1175 11B6;CE67;110E 1175 11B6;
+CE68;CE68;110E 1175 11B7;CE68;110E 1175 11B7;
+CE69;CE69;110E 1175 11B8;CE69;110E 1175 11B8;
+CE6A;CE6A;110E 1175 11B9;CE6A;110E 1175 11B9;
+CE6B;CE6B;110E 1175 11BA;CE6B;110E 1175 11BA;
+CE6C;CE6C;110E 1175 11BB;CE6C;110E 1175 11BB;
+CE6D;CE6D;110E 1175 11BC;CE6D;110E 1175 11BC;
+CE6E;CE6E;110E 1175 11BD;CE6E;110E 1175 11BD;
+CE6F;CE6F;110E 1175 11BE;CE6F;110E 1175 11BE;
+CE70;CE70;110E 1175 11BF;CE70;110E 1175 11BF;
+CE71;CE71;110E 1175 11C0;CE71;110E 1175 11C0;
+CE72;CE72;110E 1175 11C1;CE72;110E 1175 11C1;
+CE73;CE73;110E 1175 11C2;CE73;110E 1175 11C2;
+CE74;CE74;110F 1161;CE74;110F 1161;
+CE75;CE75;110F 1161 11A8;CE75;110F 1161 11A8;
+CE76;CE76;110F 1161 11A9;CE76;110F 1161 11A9;
+CE77;CE77;110F 1161 11AA;CE77;110F 1161 11AA;
+CE78;CE78;110F 1161 11AB;CE78;110F 1161 11AB;
+CE79;CE79;110F 1161 11AC;CE79;110F 1161 11AC;
+CE7A;CE7A;110F 1161 11AD;CE7A;110F 1161 11AD;
+CE7B;CE7B;110F 1161 11AE;CE7B;110F 1161 11AE;
+CE7C;CE7C;110F 1161 11AF;CE7C;110F 1161 11AF;
+CE7D;CE7D;110F 1161 11B0;CE7D;110F 1161 11B0;
+CE7E;CE7E;110F 1161 11B1;CE7E;110F 1161 11B1;
+CE7F;CE7F;110F 1161 11B2;CE7F;110F 1161 11B2;
+CE80;CE80;110F 1161 11B3;CE80;110F 1161 11B3;
+CE81;CE81;110F 1161 11B4;CE81;110F 1161 11B4;
+CE82;CE82;110F 1161 11B5;CE82;110F 1161 11B5;
+CE83;CE83;110F 1161 11B6;CE83;110F 1161 11B6;
+CE84;CE84;110F 1161 11B7;CE84;110F 1161 11B7;
+CE85;CE85;110F 1161 11B8;CE85;110F 1161 11B8;
+CE86;CE86;110F 1161 11B9;CE86;110F 1161 11B9;
+CE87;CE87;110F 1161 11BA;CE87;110F 1161 11BA;
+CE88;CE88;110F 1161 11BB;CE88;110F 1161 11BB;
+CE89;CE89;110F 1161 11BC;CE89;110F 1161 11BC;
+CE8A;CE8A;110F 1161 11BD;CE8A;110F 1161 11BD;
+CE8B;CE8B;110F 1161 11BE;CE8B;110F 1161 11BE;
+CE8C;CE8C;110F 1161 11BF;CE8C;110F 1161 11BF;
+CE8D;CE8D;110F 1161 11C0;CE8D;110F 1161 11C0;
+CE8E;CE8E;110F 1161 11C1;CE8E;110F 1161 11C1;
+CE8F;CE8F;110F 1161 11C2;CE8F;110F 1161 11C2;
+CE90;CE90;110F 1162;CE90;110F 1162;
+CE91;CE91;110F 1162 11A8;CE91;110F 1162 11A8;
+CE92;CE92;110F 1162 11A9;CE92;110F 1162 11A9;
+CE93;CE93;110F 1162 11AA;CE93;110F 1162 11AA;
+CE94;CE94;110F 1162 11AB;CE94;110F 1162 11AB;
+CE95;CE95;110F 1162 11AC;CE95;110F 1162 11AC;
+CE96;CE96;110F 1162 11AD;CE96;110F 1162 11AD;
+CE97;CE97;110F 1162 11AE;CE97;110F 1162 11AE;
+CE98;CE98;110F 1162 11AF;CE98;110F 1162 11AF;
+CE99;CE99;110F 1162 11B0;CE99;110F 1162 11B0;
+CE9A;CE9A;110F 1162 11B1;CE9A;110F 1162 11B1;
+CE9B;CE9B;110F 1162 11B2;CE9B;110F 1162 11B2;
+CE9C;CE9C;110F 1162 11B3;CE9C;110F 1162 11B3;
+CE9D;CE9D;110F 1162 11B4;CE9D;110F 1162 11B4;
+CE9E;CE9E;110F 1162 11B5;CE9E;110F 1162 11B5;
+CE9F;CE9F;110F 1162 11B6;CE9F;110F 1162 11B6;
+CEA0;CEA0;110F 1162 11B7;CEA0;110F 1162 11B7;
+CEA1;CEA1;110F 1162 11B8;CEA1;110F 1162 11B8;
+CEA2;CEA2;110F 1162 11B9;CEA2;110F 1162 11B9;
+CEA3;CEA3;110F 1162 11BA;CEA3;110F 1162 11BA;
+CEA4;CEA4;110F 1162 11BB;CEA4;110F 1162 11BB;
+CEA5;CEA5;110F 1162 11BC;CEA5;110F 1162 11BC;
+CEA6;CEA6;110F 1162 11BD;CEA6;110F 1162 11BD;
+CEA7;CEA7;110F 1162 11BE;CEA7;110F 1162 11BE;
+CEA8;CEA8;110F 1162 11BF;CEA8;110F 1162 11BF;
+CEA9;CEA9;110F 1162 11C0;CEA9;110F 1162 11C0;
+CEAA;CEAA;110F 1162 11C1;CEAA;110F 1162 11C1;
+CEAB;CEAB;110F 1162 11C2;CEAB;110F 1162 11C2;
+CEAC;CEAC;110F 1163;CEAC;110F 1163;
+CEAD;CEAD;110F 1163 11A8;CEAD;110F 1163 11A8;
+CEAE;CEAE;110F 1163 11A9;CEAE;110F 1163 11A9;
+CEAF;CEAF;110F 1163 11AA;CEAF;110F 1163 11AA;
+CEB0;CEB0;110F 1163 11AB;CEB0;110F 1163 11AB;
+CEB1;CEB1;110F 1163 11AC;CEB1;110F 1163 11AC;
+CEB2;CEB2;110F 1163 11AD;CEB2;110F 1163 11AD;
+CEB3;CEB3;110F 1163 11AE;CEB3;110F 1163 11AE;
+CEB4;CEB4;110F 1163 11AF;CEB4;110F 1163 11AF;
+CEB5;CEB5;110F 1163 11B0;CEB5;110F 1163 11B0;
+CEB6;CEB6;110F 1163 11B1;CEB6;110F 1163 11B1;
+CEB7;CEB7;110F 1163 11B2;CEB7;110F 1163 11B2;
+CEB8;CEB8;110F 1163 11B3;CEB8;110F 1163 11B3;
+CEB9;CEB9;110F 1163 11B4;CEB9;110F 1163 11B4;
+CEBA;CEBA;110F 1163 11B5;CEBA;110F 1163 11B5;
+CEBB;CEBB;110F 1163 11B6;CEBB;110F 1163 11B6;
+CEBC;CEBC;110F 1163 11B7;CEBC;110F 1163 11B7;
+CEBD;CEBD;110F 1163 11B8;CEBD;110F 1163 11B8;
+CEBE;CEBE;110F 1163 11B9;CEBE;110F 1163 11B9;
+CEBF;CEBF;110F 1163 11BA;CEBF;110F 1163 11BA;
+CEC0;CEC0;110F 1163 11BB;CEC0;110F 1163 11BB;
+CEC1;CEC1;110F 1163 11BC;CEC1;110F 1163 11BC;
+CEC2;CEC2;110F 1163 11BD;CEC2;110F 1163 11BD;
+CEC3;CEC3;110F 1163 11BE;CEC3;110F 1163 11BE;
+CEC4;CEC4;110F 1163 11BF;CEC4;110F 1163 11BF;
+CEC5;CEC5;110F 1163 11C0;CEC5;110F 1163 11C0;
+CEC6;CEC6;110F 1163 11C1;CEC6;110F 1163 11C1;
+CEC7;CEC7;110F 1163 11C2;CEC7;110F 1163 11C2;
+CEC8;CEC8;110F 1164;CEC8;110F 1164;
+CEC9;CEC9;110F 1164 11A8;CEC9;110F 1164 11A8;
+CECA;CECA;110F 1164 11A9;CECA;110F 1164 11A9;
+CECB;CECB;110F 1164 11AA;CECB;110F 1164 11AA;
+CECC;CECC;110F 1164 11AB;CECC;110F 1164 11AB;
+CECD;CECD;110F 1164 11AC;CECD;110F 1164 11AC;
+CECE;CECE;110F 1164 11AD;CECE;110F 1164 11AD;
+CECF;CECF;110F 1164 11AE;CECF;110F 1164 11AE;
+CED0;CED0;110F 1164 11AF;CED0;110F 1164 11AF;
+CED1;CED1;110F 1164 11B0;CED1;110F 1164 11B0;
+CED2;CED2;110F 1164 11B1;CED2;110F 1164 11B1;
+CED3;CED3;110F 1164 11B2;CED3;110F 1164 11B2;
+CED4;CED4;110F 1164 11B3;CED4;110F 1164 11B3;
+CED5;CED5;110F 1164 11B4;CED5;110F 1164 11B4;
+CED6;CED6;110F 1164 11B5;CED6;110F 1164 11B5;
+CED7;CED7;110F 1164 11B6;CED7;110F 1164 11B6;
+CED8;CED8;110F 1164 11B7;CED8;110F 1164 11B7;
+CED9;CED9;110F 1164 11B8;CED9;110F 1164 11B8;
+CEDA;CEDA;110F 1164 11B9;CEDA;110F 1164 11B9;
+CEDB;CEDB;110F 1164 11BA;CEDB;110F 1164 11BA;
+CEDC;CEDC;110F 1164 11BB;CEDC;110F 1164 11BB;
+CEDD;CEDD;110F 1164 11BC;CEDD;110F 1164 11BC;
+CEDE;CEDE;110F 1164 11BD;CEDE;110F 1164 11BD;
+CEDF;CEDF;110F 1164 11BE;CEDF;110F 1164 11BE;
+CEE0;CEE0;110F 1164 11BF;CEE0;110F 1164 11BF;
+CEE1;CEE1;110F 1164 11C0;CEE1;110F 1164 11C0;
+CEE2;CEE2;110F 1164 11C1;CEE2;110F 1164 11C1;
+CEE3;CEE3;110F 1164 11C2;CEE3;110F 1164 11C2;
+CEE4;CEE4;110F 1165;CEE4;110F 1165;
+CEE5;CEE5;110F 1165 11A8;CEE5;110F 1165 11A8;
+CEE6;CEE6;110F 1165 11A9;CEE6;110F 1165 11A9;
+CEE7;CEE7;110F 1165 11AA;CEE7;110F 1165 11AA;
+CEE8;CEE8;110F 1165 11AB;CEE8;110F 1165 11AB;
+CEE9;CEE9;110F 1165 11AC;CEE9;110F 1165 11AC;
+CEEA;CEEA;110F 1165 11AD;CEEA;110F 1165 11AD;
+CEEB;CEEB;110F 1165 11AE;CEEB;110F 1165 11AE;
+CEEC;CEEC;110F 1165 11AF;CEEC;110F 1165 11AF;
+CEED;CEED;110F 1165 11B0;CEED;110F 1165 11B0;
+CEEE;CEEE;110F 1165 11B1;CEEE;110F 1165 11B1;
+CEEF;CEEF;110F 1165 11B2;CEEF;110F 1165 11B2;
+CEF0;CEF0;110F 1165 11B3;CEF0;110F 1165 11B3;
+CEF1;CEF1;110F 1165 11B4;CEF1;110F 1165 11B4;
+CEF2;CEF2;110F 1165 11B5;CEF2;110F 1165 11B5;
+CEF3;CEF3;110F 1165 11B6;CEF3;110F 1165 11B6;
+CEF4;CEF4;110F 1165 11B7;CEF4;110F 1165 11B7;
+CEF5;CEF5;110F 1165 11B8;CEF5;110F 1165 11B8;
+CEF6;CEF6;110F 1165 11B9;CEF6;110F 1165 11B9;
+CEF7;CEF7;110F 1165 11BA;CEF7;110F 1165 11BA;
+CEF8;CEF8;110F 1165 11BB;CEF8;110F 1165 11BB;
+CEF9;CEF9;110F 1165 11BC;CEF9;110F 1165 11BC;
+CEFA;CEFA;110F 1165 11BD;CEFA;110F 1165 11BD;
+CEFB;CEFB;110F 1165 11BE;CEFB;110F 1165 11BE;
+CEFC;CEFC;110F 1165 11BF;CEFC;110F 1165 11BF;
+CEFD;CEFD;110F 1165 11C0;CEFD;110F 1165 11C0;
+CEFE;CEFE;110F 1165 11C1;CEFE;110F 1165 11C1;
+CEFF;CEFF;110F 1165 11C2;CEFF;110F 1165 11C2;
+CF00;CF00;110F 1166;CF00;110F 1166;
+CF01;CF01;110F 1166 11A8;CF01;110F 1166 11A8;
+CF02;CF02;110F 1166 11A9;CF02;110F 1166 11A9;
+CF03;CF03;110F 1166 11AA;CF03;110F 1166 11AA;
+CF04;CF04;110F 1166 11AB;CF04;110F 1166 11AB;
+CF05;CF05;110F 1166 11AC;CF05;110F 1166 11AC;
+CF06;CF06;110F 1166 11AD;CF06;110F 1166 11AD;
+CF07;CF07;110F 1166 11AE;CF07;110F 1166 11AE;
+CF08;CF08;110F 1166 11AF;CF08;110F 1166 11AF;
+CF09;CF09;110F 1166 11B0;CF09;110F 1166 11B0;
+CF0A;CF0A;110F 1166 11B1;CF0A;110F 1166 11B1;
+CF0B;CF0B;110F 1166 11B2;CF0B;110F 1166 11B2;
+CF0C;CF0C;110F 1166 11B3;CF0C;110F 1166 11B3;
+CF0D;CF0D;110F 1166 11B4;CF0D;110F 1166 11B4;
+CF0E;CF0E;110F 1166 11B5;CF0E;110F 1166 11B5;
+CF0F;CF0F;110F 1166 11B6;CF0F;110F 1166 11B6;
+CF10;CF10;110F 1166 11B7;CF10;110F 1166 11B7;
+CF11;CF11;110F 1166 11B8;CF11;110F 1166 11B8;
+CF12;CF12;110F 1166 11B9;CF12;110F 1166 11B9;
+CF13;CF13;110F 1166 11BA;CF13;110F 1166 11BA;
+CF14;CF14;110F 1166 11BB;CF14;110F 1166 11BB;
+CF15;CF15;110F 1166 11BC;CF15;110F 1166 11BC;
+CF16;CF16;110F 1166 11BD;CF16;110F 1166 11BD;
+CF17;CF17;110F 1166 11BE;CF17;110F 1166 11BE;
+CF18;CF18;110F 1166 11BF;CF18;110F 1166 11BF;
+CF19;CF19;110F 1166 11C0;CF19;110F 1166 11C0;
+CF1A;CF1A;110F 1166 11C1;CF1A;110F 1166 11C1;
+CF1B;CF1B;110F 1166 11C2;CF1B;110F 1166 11C2;
+CF1C;CF1C;110F 1167;CF1C;110F 1167;
+CF1D;CF1D;110F 1167 11A8;CF1D;110F 1167 11A8;
+CF1E;CF1E;110F 1167 11A9;CF1E;110F 1167 11A9;
+CF1F;CF1F;110F 1167 11AA;CF1F;110F 1167 11AA;
+CF20;CF20;110F 1167 11AB;CF20;110F 1167 11AB;
+CF21;CF21;110F 1167 11AC;CF21;110F 1167 11AC;
+CF22;CF22;110F 1167 11AD;CF22;110F 1167 11AD;
+CF23;CF23;110F 1167 11AE;CF23;110F 1167 11AE;
+CF24;CF24;110F 1167 11AF;CF24;110F 1167 11AF;
+CF25;CF25;110F 1167 11B0;CF25;110F 1167 11B0;
+CF26;CF26;110F 1167 11B1;CF26;110F 1167 11B1;
+CF27;CF27;110F 1167 11B2;CF27;110F 1167 11B2;
+CF28;CF28;110F 1167 11B3;CF28;110F 1167 11B3;
+CF29;CF29;110F 1167 11B4;CF29;110F 1167 11B4;
+CF2A;CF2A;110F 1167 11B5;CF2A;110F 1167 11B5;
+CF2B;CF2B;110F 1167 11B6;CF2B;110F 1167 11B6;
+CF2C;CF2C;110F 1167 11B7;CF2C;110F 1167 11B7;
+CF2D;CF2D;110F 1167 11B8;CF2D;110F 1167 11B8;
+CF2E;CF2E;110F 1167 11B9;CF2E;110F 1167 11B9;
+CF2F;CF2F;110F 1167 11BA;CF2F;110F 1167 11BA;
+CF30;CF30;110F 1167 11BB;CF30;110F 1167 11BB;
+CF31;CF31;110F 1167 11BC;CF31;110F 1167 11BC;
+CF32;CF32;110F 1167 11BD;CF32;110F 1167 11BD;
+CF33;CF33;110F 1167 11BE;CF33;110F 1167 11BE;
+CF34;CF34;110F 1167 11BF;CF34;110F 1167 11BF;
+CF35;CF35;110F 1167 11C0;CF35;110F 1167 11C0;
+CF36;CF36;110F 1167 11C1;CF36;110F 1167 11C1;
+CF37;CF37;110F 1167 11C2;CF37;110F 1167 11C2;
+CF38;CF38;110F 1168;CF38;110F 1168;
+CF39;CF39;110F 1168 11A8;CF39;110F 1168 11A8;
+CF3A;CF3A;110F 1168 11A9;CF3A;110F 1168 11A9;
+CF3B;CF3B;110F 1168 11AA;CF3B;110F 1168 11AA;
+CF3C;CF3C;110F 1168 11AB;CF3C;110F 1168 11AB;
+CF3D;CF3D;110F 1168 11AC;CF3D;110F 1168 11AC;
+CF3E;CF3E;110F 1168 11AD;CF3E;110F 1168 11AD;
+CF3F;CF3F;110F 1168 11AE;CF3F;110F 1168 11AE;
+CF40;CF40;110F 1168 11AF;CF40;110F 1168 11AF;
+CF41;CF41;110F 1168 11B0;CF41;110F 1168 11B0;
+CF42;CF42;110F 1168 11B1;CF42;110F 1168 11B1;
+CF43;CF43;110F 1168 11B2;CF43;110F 1168 11B2;
+CF44;CF44;110F 1168 11B3;CF44;110F 1168 11B3;
+CF45;CF45;110F 1168 11B4;CF45;110F 1168 11B4;
+CF46;CF46;110F 1168 11B5;CF46;110F 1168 11B5;
+CF47;CF47;110F 1168 11B6;CF47;110F 1168 11B6;
+CF48;CF48;110F 1168 11B7;CF48;110F 1168 11B7;
+CF49;CF49;110F 1168 11B8;CF49;110F 1168 11B8;
+CF4A;CF4A;110F 1168 11B9;CF4A;110F 1168 11B9;
+CF4B;CF4B;110F 1168 11BA;CF4B;110F 1168 11BA;
+CF4C;CF4C;110F 1168 11BB;CF4C;110F 1168 11BB;
+CF4D;CF4D;110F 1168 11BC;CF4D;110F 1168 11BC;
+CF4E;CF4E;110F 1168 11BD;CF4E;110F 1168 11BD;
+CF4F;CF4F;110F 1168 11BE;CF4F;110F 1168 11BE;
+CF50;CF50;110F 1168 11BF;CF50;110F 1168 11BF;
+CF51;CF51;110F 1168 11C0;CF51;110F 1168 11C0;
+CF52;CF52;110F 1168 11C1;CF52;110F 1168 11C1;
+CF53;CF53;110F 1168 11C2;CF53;110F 1168 11C2;
+CF54;CF54;110F 1169;CF54;110F 1169;
+CF55;CF55;110F 1169 11A8;CF55;110F 1169 11A8;
+CF56;CF56;110F 1169 11A9;CF56;110F 1169 11A9;
+CF57;CF57;110F 1169 11AA;CF57;110F 1169 11AA;
+CF58;CF58;110F 1169 11AB;CF58;110F 1169 11AB;
+CF59;CF59;110F 1169 11AC;CF59;110F 1169 11AC;
+CF5A;CF5A;110F 1169 11AD;CF5A;110F 1169 11AD;
+CF5B;CF5B;110F 1169 11AE;CF5B;110F 1169 11AE;
+CF5C;CF5C;110F 1169 11AF;CF5C;110F 1169 11AF;
+CF5D;CF5D;110F 1169 11B0;CF5D;110F 1169 11B0;
+CF5E;CF5E;110F 1169 11B1;CF5E;110F 1169 11B1;
+CF5F;CF5F;110F 1169 11B2;CF5F;110F 1169 11B2;
+CF60;CF60;110F 1169 11B3;CF60;110F 1169 11B3;
+CF61;CF61;110F 1169 11B4;CF61;110F 1169 11B4;
+CF62;CF62;110F 1169 11B5;CF62;110F 1169 11B5;
+CF63;CF63;110F 1169 11B6;CF63;110F 1169 11B6;
+CF64;CF64;110F 1169 11B7;CF64;110F 1169 11B7;
+CF65;CF65;110F 1169 11B8;CF65;110F 1169 11B8;
+CF66;CF66;110F 1169 11B9;CF66;110F 1169 11B9;
+CF67;CF67;110F 1169 11BA;CF67;110F 1169 11BA;
+CF68;CF68;110F 1169 11BB;CF68;110F 1169 11BB;
+CF69;CF69;110F 1169 11BC;CF69;110F 1169 11BC;
+CF6A;CF6A;110F 1169 11BD;CF6A;110F 1169 11BD;
+CF6B;CF6B;110F 1169 11BE;CF6B;110F 1169 11BE;
+CF6C;CF6C;110F 1169 11BF;CF6C;110F 1169 11BF;
+CF6D;CF6D;110F 1169 11C0;CF6D;110F 1169 11C0;
+CF6E;CF6E;110F 1169 11C1;CF6E;110F 1169 11C1;
+CF6F;CF6F;110F 1169 11C2;CF6F;110F 1169 11C2;
+CF70;CF70;110F 116A;CF70;110F 116A;
+CF71;CF71;110F 116A 11A8;CF71;110F 116A 11A8;
+CF72;CF72;110F 116A 11A9;CF72;110F 116A 11A9;
+CF73;CF73;110F 116A 11AA;CF73;110F 116A 11AA;
+CF74;CF74;110F 116A 11AB;CF74;110F 116A 11AB;
+CF75;CF75;110F 116A 11AC;CF75;110F 116A 11AC;
+CF76;CF76;110F 116A 11AD;CF76;110F 116A 11AD;
+CF77;CF77;110F 116A 11AE;CF77;110F 116A 11AE;
+CF78;CF78;110F 116A 11AF;CF78;110F 116A 11AF;
+CF79;CF79;110F 116A 11B0;CF79;110F 116A 11B0;
+CF7A;CF7A;110F 116A 11B1;CF7A;110F 116A 11B1;
+CF7B;CF7B;110F 116A 11B2;CF7B;110F 116A 11B2;
+CF7C;CF7C;110F 116A 11B3;CF7C;110F 116A 11B3;
+CF7D;CF7D;110F 116A 11B4;CF7D;110F 116A 11B4;
+CF7E;CF7E;110F 116A 11B5;CF7E;110F 116A 11B5;
+CF7F;CF7F;110F 116A 11B6;CF7F;110F 116A 11B6;
+CF80;CF80;110F 116A 11B7;CF80;110F 116A 11B7;
+CF81;CF81;110F 116A 11B8;CF81;110F 116A 11B8;
+CF82;CF82;110F 116A 11B9;CF82;110F 116A 11B9;
+CF83;CF83;110F 116A 11BA;CF83;110F 116A 11BA;
+CF84;CF84;110F 116A 11BB;CF84;110F 116A 11BB;
+CF85;CF85;110F 116A 11BC;CF85;110F 116A 11BC;
+CF86;CF86;110F 116A 11BD;CF86;110F 116A 11BD;
+CF87;CF87;110F 116A 11BE;CF87;110F 116A 11BE;
+CF88;CF88;110F 116A 11BF;CF88;110F 116A 11BF;
+CF89;CF89;110F 116A 11C0;CF89;110F 116A 11C0;
+CF8A;CF8A;110F 116A 11C1;CF8A;110F 116A 11C1;
+CF8B;CF8B;110F 116A 11C2;CF8B;110F 116A 11C2;
+CF8C;CF8C;110F 116B;CF8C;110F 116B;
+CF8D;CF8D;110F 116B 11A8;CF8D;110F 116B 11A8;
+CF8E;CF8E;110F 116B 11A9;CF8E;110F 116B 11A9;
+CF8F;CF8F;110F 116B 11AA;CF8F;110F 116B 11AA;
+CF90;CF90;110F 116B 11AB;CF90;110F 116B 11AB;
+CF91;CF91;110F 116B 11AC;CF91;110F 116B 11AC;
+CF92;CF92;110F 116B 11AD;CF92;110F 116B 11AD;
+CF93;CF93;110F 116B 11AE;CF93;110F 116B 11AE;
+CF94;CF94;110F 116B 11AF;CF94;110F 116B 11AF;
+CF95;CF95;110F 116B 11B0;CF95;110F 116B 11B0;
+CF96;CF96;110F 116B 11B1;CF96;110F 116B 11B1;
+CF97;CF97;110F 116B 11B2;CF97;110F 116B 11B2;
+CF98;CF98;110F 116B 11B3;CF98;110F 116B 11B3;
+CF99;CF99;110F 116B 11B4;CF99;110F 116B 11B4;
+CF9A;CF9A;110F 116B 11B5;CF9A;110F 116B 11B5;
+CF9B;CF9B;110F 116B 11B6;CF9B;110F 116B 11B6;
+CF9C;CF9C;110F 116B 11B7;CF9C;110F 116B 11B7;
+CF9D;CF9D;110F 116B 11B8;CF9D;110F 116B 11B8;
+CF9E;CF9E;110F 116B 11B9;CF9E;110F 116B 11B9;
+CF9F;CF9F;110F 116B 11BA;CF9F;110F 116B 11BA;
+CFA0;CFA0;110F 116B 11BB;CFA0;110F 116B 11BB;
+CFA1;CFA1;110F 116B 11BC;CFA1;110F 116B 11BC;
+CFA2;CFA2;110F 116B 11BD;CFA2;110F 116B 11BD;
+CFA3;CFA3;110F 116B 11BE;CFA3;110F 116B 11BE;
+CFA4;CFA4;110F 116B 11BF;CFA4;110F 116B 11BF;
+CFA5;CFA5;110F 116B 11C0;CFA5;110F 116B 11C0;
+CFA6;CFA6;110F 116B 11C1;CFA6;110F 116B 11C1;
+CFA7;CFA7;110F 116B 11C2;CFA7;110F 116B 11C2;
+CFA8;CFA8;110F 116C;CFA8;110F 116C;
+CFA9;CFA9;110F 116C 11A8;CFA9;110F 116C 11A8;
+CFAA;CFAA;110F 116C 11A9;CFAA;110F 116C 11A9;
+CFAB;CFAB;110F 116C 11AA;CFAB;110F 116C 11AA;
+CFAC;CFAC;110F 116C 11AB;CFAC;110F 116C 11AB;
+CFAD;CFAD;110F 116C 11AC;CFAD;110F 116C 11AC;
+CFAE;CFAE;110F 116C 11AD;CFAE;110F 116C 11AD;
+CFAF;CFAF;110F 116C 11AE;CFAF;110F 116C 11AE;
+CFB0;CFB0;110F 116C 11AF;CFB0;110F 116C 11AF;
+CFB1;CFB1;110F 116C 11B0;CFB1;110F 116C 11B0;
+CFB2;CFB2;110F 116C 11B1;CFB2;110F 116C 11B1;
+CFB3;CFB3;110F 116C 11B2;CFB3;110F 116C 11B2;
+CFB4;CFB4;110F 116C 11B3;CFB4;110F 116C 11B3;
+CFB5;CFB5;110F 116C 11B4;CFB5;110F 116C 11B4;
+CFB6;CFB6;110F 116C 11B5;CFB6;110F 116C 11B5;
+CFB7;CFB7;110F 116C 11B6;CFB7;110F 116C 11B6;
+CFB8;CFB8;110F 116C 11B7;CFB8;110F 116C 11B7;
+CFB9;CFB9;110F 116C 11B8;CFB9;110F 116C 11B8;
+CFBA;CFBA;110F 116C 11B9;CFBA;110F 116C 11B9;
+CFBB;CFBB;110F 116C 11BA;CFBB;110F 116C 11BA;
+CFBC;CFBC;110F 116C 11BB;CFBC;110F 116C 11BB;
+CFBD;CFBD;110F 116C 11BC;CFBD;110F 116C 11BC;
+CFBE;CFBE;110F 116C 11BD;CFBE;110F 116C 11BD;
+CFBF;CFBF;110F 116C 11BE;CFBF;110F 116C 11BE;
+CFC0;CFC0;110F 116C 11BF;CFC0;110F 116C 11BF;
+CFC1;CFC1;110F 116C 11C0;CFC1;110F 116C 11C0;
+CFC2;CFC2;110F 116C 11C1;CFC2;110F 116C 11C1;
+CFC3;CFC3;110F 116C 11C2;CFC3;110F 116C 11C2;
+CFC4;CFC4;110F 116D;CFC4;110F 116D;
+CFC5;CFC5;110F 116D 11A8;CFC5;110F 116D 11A8;
+CFC6;CFC6;110F 116D 11A9;CFC6;110F 116D 11A9;
+CFC7;CFC7;110F 116D 11AA;CFC7;110F 116D 11AA;
+CFC8;CFC8;110F 116D 11AB;CFC8;110F 116D 11AB;
+CFC9;CFC9;110F 116D 11AC;CFC9;110F 116D 11AC;
+CFCA;CFCA;110F 116D 11AD;CFCA;110F 116D 11AD;
+CFCB;CFCB;110F 116D 11AE;CFCB;110F 116D 11AE;
+CFCC;CFCC;110F 116D 11AF;CFCC;110F 116D 11AF;
+CFCD;CFCD;110F 116D 11B0;CFCD;110F 116D 11B0;
+CFCE;CFCE;110F 116D 11B1;CFCE;110F 116D 11B1;
+CFCF;CFCF;110F 116D 11B2;CFCF;110F 116D 11B2;
+CFD0;CFD0;110F 116D 11B3;CFD0;110F 116D 11B3;
+CFD1;CFD1;110F 116D 11B4;CFD1;110F 116D 11B4;
+CFD2;CFD2;110F 116D 11B5;CFD2;110F 116D 11B5;
+CFD3;CFD3;110F 116D 11B6;CFD3;110F 116D 11B6;
+CFD4;CFD4;110F 116D 11B7;CFD4;110F 116D 11B7;
+CFD5;CFD5;110F 116D 11B8;CFD5;110F 116D 11B8;
+CFD6;CFD6;110F 116D 11B9;CFD6;110F 116D 11B9;
+CFD7;CFD7;110F 116D 11BA;CFD7;110F 116D 11BA;
+CFD8;CFD8;110F 116D 11BB;CFD8;110F 116D 11BB;
+CFD9;CFD9;110F 116D 11BC;CFD9;110F 116D 11BC;
+CFDA;CFDA;110F 116D 11BD;CFDA;110F 116D 11BD;
+CFDB;CFDB;110F 116D 11BE;CFDB;110F 116D 11BE;
+CFDC;CFDC;110F 116D 11BF;CFDC;110F 116D 11BF;
+CFDD;CFDD;110F 116D 11C0;CFDD;110F 116D 11C0;
+CFDE;CFDE;110F 116D 11C1;CFDE;110F 116D 11C1;
+CFDF;CFDF;110F 116D 11C2;CFDF;110F 116D 11C2;
+CFE0;CFE0;110F 116E;CFE0;110F 116E;
+CFE1;CFE1;110F 116E 11A8;CFE1;110F 116E 11A8;
+CFE2;CFE2;110F 116E 11A9;CFE2;110F 116E 11A9;
+CFE3;CFE3;110F 116E 11AA;CFE3;110F 116E 11AA;
+CFE4;CFE4;110F 116E 11AB;CFE4;110F 116E 11AB;
+CFE5;CFE5;110F 116E 11AC;CFE5;110F 116E 11AC;
+CFE6;CFE6;110F 116E 11AD;CFE6;110F 116E 11AD;
+CFE7;CFE7;110F 116E 11AE;CFE7;110F 116E 11AE;
+CFE8;CFE8;110F 116E 11AF;CFE8;110F 116E 11AF;
+CFE9;CFE9;110F 116E 11B0;CFE9;110F 116E 11B0;
+CFEA;CFEA;110F 116E 11B1;CFEA;110F 116E 11B1;
+CFEB;CFEB;110F 116E 11B2;CFEB;110F 116E 11B2;
+CFEC;CFEC;110F 116E 11B3;CFEC;110F 116E 11B3;
+CFED;CFED;110F 116E 11B4;CFED;110F 116E 11B4;
+CFEE;CFEE;110F 116E 11B5;CFEE;110F 116E 11B5;
+CFEF;CFEF;110F 116E 11B6;CFEF;110F 116E 11B6;
+CFF0;CFF0;110F 116E 11B7;CFF0;110F 116E 11B7;
+CFF1;CFF1;110F 116E 11B8;CFF1;110F 116E 11B8;
+CFF2;CFF2;110F 116E 11B9;CFF2;110F 116E 11B9;
+CFF3;CFF3;110F 116E 11BA;CFF3;110F 116E 11BA;
+CFF4;CFF4;110F 116E 11BB;CFF4;110F 116E 11BB;
+CFF5;CFF5;110F 116E 11BC;CFF5;110F 116E 11BC;
+CFF6;CFF6;110F 116E 11BD;CFF6;110F 116E 11BD;
+CFF7;CFF7;110F 116E 11BE;CFF7;110F 116E 11BE;
+CFF8;CFF8;110F 116E 11BF;CFF8;110F 116E 11BF;
+CFF9;CFF9;110F 116E 11C0;CFF9;110F 116E 11C0;
+CFFA;CFFA;110F 116E 11C1;CFFA;110F 116E 11C1;
+CFFB;CFFB;110F 116E 11C2;CFFB;110F 116E 11C2;
+CFFC;CFFC;110F 116F;CFFC;110F 116F;
+CFFD;CFFD;110F 116F 11A8;CFFD;110F 116F 11A8;
+CFFE;CFFE;110F 116F 11A9;CFFE;110F 116F 11A9;
+CFFF;CFFF;110F 116F 11AA;CFFF;110F 116F 11AA;
+D000;D000;110F 116F 11AB;D000;110F 116F 11AB;
+D001;D001;110F 116F 11AC;D001;110F 116F 11AC;
+D002;D002;110F 116F 11AD;D002;110F 116F 11AD;
+D003;D003;110F 116F 11AE;D003;110F 116F 11AE;
+D004;D004;110F 116F 11AF;D004;110F 116F 11AF;
+D005;D005;110F 116F 11B0;D005;110F 116F 11B0;
+D006;D006;110F 116F 11B1;D006;110F 116F 11B1;
+D007;D007;110F 116F 11B2;D007;110F 116F 11B2;
+D008;D008;110F 116F 11B3;D008;110F 116F 11B3;
+D009;D009;110F 116F 11B4;D009;110F 116F 11B4;
+D00A;D00A;110F 116F 11B5;D00A;110F 116F 11B5;
+D00B;D00B;110F 116F 11B6;D00B;110F 116F 11B6;
+D00C;D00C;110F 116F 11B7;D00C;110F 116F 11B7;
+D00D;D00D;110F 116F 11B8;D00D;110F 116F 11B8;
+D00E;D00E;110F 116F 11B9;D00E;110F 116F 11B9;
+D00F;D00F;110F 116F 11BA;D00F;110F 116F 11BA;
+D010;D010;110F 116F 11BB;D010;110F 116F 11BB;
+D011;D011;110F 116F 11BC;D011;110F 116F 11BC;
+D012;D012;110F 116F 11BD;D012;110F 116F 11BD;
+D013;D013;110F 116F 11BE;D013;110F 116F 11BE;
+D014;D014;110F 116F 11BF;D014;110F 116F 11BF;
+D015;D015;110F 116F 11C0;D015;110F 116F 11C0;
+D016;D016;110F 116F 11C1;D016;110F 116F 11C1;
+D017;D017;110F 116F 11C2;D017;110F 116F 11C2;
+D018;D018;110F 1170;D018;110F 1170;
+D019;D019;110F 1170 11A8;D019;110F 1170 11A8;
+D01A;D01A;110F 1170 11A9;D01A;110F 1170 11A9;
+D01B;D01B;110F 1170 11AA;D01B;110F 1170 11AA;
+D01C;D01C;110F 1170 11AB;D01C;110F 1170 11AB;
+D01D;D01D;110F 1170 11AC;D01D;110F 1170 11AC;
+D01E;D01E;110F 1170 11AD;D01E;110F 1170 11AD;
+D01F;D01F;110F 1170 11AE;D01F;110F 1170 11AE;
+D020;D020;110F 1170 11AF;D020;110F 1170 11AF;
+D021;D021;110F 1170 11B0;D021;110F 1170 11B0;
+D022;D022;110F 1170 11B1;D022;110F 1170 11B1;
+D023;D023;110F 1170 11B2;D023;110F 1170 11B2;
+D024;D024;110F 1170 11B3;D024;110F 1170 11B3;
+D025;D025;110F 1170 11B4;D025;110F 1170 11B4;
+D026;D026;110F 1170 11B5;D026;110F 1170 11B5;
+D027;D027;110F 1170 11B6;D027;110F 1170 11B6;
+D028;D028;110F 1170 11B7;D028;110F 1170 11B7;
+D029;D029;110F 1170 11B8;D029;110F 1170 11B8;
+D02A;D02A;110F 1170 11B9;D02A;110F 1170 11B9;
+D02B;D02B;110F 1170 11BA;D02B;110F 1170 11BA;
+D02C;D02C;110F 1170 11BB;D02C;110F 1170 11BB;
+D02D;D02D;110F 1170 11BC;D02D;110F 1170 11BC;
+D02E;D02E;110F 1170 11BD;D02E;110F 1170 11BD;
+D02F;D02F;110F 1170 11BE;D02F;110F 1170 11BE;
+D030;D030;110F 1170 11BF;D030;110F 1170 11BF;
+D031;D031;110F 1170 11C0;D031;110F 1170 11C0;
+D032;D032;110F 1170 11C1;D032;110F 1170 11C1;
+D033;D033;110F 1170 11C2;D033;110F 1170 11C2;
+D034;D034;110F 1171;D034;110F 1171;
+D035;D035;110F 1171 11A8;D035;110F 1171 11A8;
+D036;D036;110F 1171 11A9;D036;110F 1171 11A9;
+D037;D037;110F 1171 11AA;D037;110F 1171 11AA;
+D038;D038;110F 1171 11AB;D038;110F 1171 11AB;
+D039;D039;110F 1171 11AC;D039;110F 1171 11AC;
+D03A;D03A;110F 1171 11AD;D03A;110F 1171 11AD;
+D03B;D03B;110F 1171 11AE;D03B;110F 1171 11AE;
+D03C;D03C;110F 1171 11AF;D03C;110F 1171 11AF;
+D03D;D03D;110F 1171 11B0;D03D;110F 1171 11B0;
+D03E;D03E;110F 1171 11B1;D03E;110F 1171 11B1;
+D03F;D03F;110F 1171 11B2;D03F;110F 1171 11B2;
+D040;D040;110F 1171 11B3;D040;110F 1171 11B3;
+D041;D041;110F 1171 11B4;D041;110F 1171 11B4;
+D042;D042;110F 1171 11B5;D042;110F 1171 11B5;
+D043;D043;110F 1171 11B6;D043;110F 1171 11B6;
+D044;D044;110F 1171 11B7;D044;110F 1171 11B7;
+D045;D045;110F 1171 11B8;D045;110F 1171 11B8;
+D046;D046;110F 1171 11B9;D046;110F 1171 11B9;
+D047;D047;110F 1171 11BA;D047;110F 1171 11BA;
+D048;D048;110F 1171 11BB;D048;110F 1171 11BB;
+D049;D049;110F 1171 11BC;D049;110F 1171 11BC;
+D04A;D04A;110F 1171 11BD;D04A;110F 1171 11BD;
+D04B;D04B;110F 1171 11BE;D04B;110F 1171 11BE;
+D04C;D04C;110F 1171 11BF;D04C;110F 1171 11BF;
+D04D;D04D;110F 1171 11C0;D04D;110F 1171 11C0;
+D04E;D04E;110F 1171 11C1;D04E;110F 1171 11C1;
+D04F;D04F;110F 1171 11C2;D04F;110F 1171 11C2;
+D050;D050;110F 1172;D050;110F 1172;
+D051;D051;110F 1172 11A8;D051;110F 1172 11A8;
+D052;D052;110F 1172 11A9;D052;110F 1172 11A9;
+D053;D053;110F 1172 11AA;D053;110F 1172 11AA;
+D054;D054;110F 1172 11AB;D054;110F 1172 11AB;
+D055;D055;110F 1172 11AC;D055;110F 1172 11AC;
+D056;D056;110F 1172 11AD;D056;110F 1172 11AD;
+D057;D057;110F 1172 11AE;D057;110F 1172 11AE;
+D058;D058;110F 1172 11AF;D058;110F 1172 11AF;
+D059;D059;110F 1172 11B0;D059;110F 1172 11B0;
+D05A;D05A;110F 1172 11B1;D05A;110F 1172 11B1;
+D05B;D05B;110F 1172 11B2;D05B;110F 1172 11B2;
+D05C;D05C;110F 1172 11B3;D05C;110F 1172 11B3;
+D05D;D05D;110F 1172 11B4;D05D;110F 1172 11B4;
+D05E;D05E;110F 1172 11B5;D05E;110F 1172 11B5;
+D05F;D05F;110F 1172 11B6;D05F;110F 1172 11B6;
+D060;D060;110F 1172 11B7;D060;110F 1172 11B7;
+D061;D061;110F 1172 11B8;D061;110F 1172 11B8;
+D062;D062;110F 1172 11B9;D062;110F 1172 11B9;
+D063;D063;110F 1172 11BA;D063;110F 1172 11BA;
+D064;D064;110F 1172 11BB;D064;110F 1172 11BB;
+D065;D065;110F 1172 11BC;D065;110F 1172 11BC;
+D066;D066;110F 1172 11BD;D066;110F 1172 11BD;
+D067;D067;110F 1172 11BE;D067;110F 1172 11BE;
+D068;D068;110F 1172 11BF;D068;110F 1172 11BF;
+D069;D069;110F 1172 11C0;D069;110F 1172 11C0;
+D06A;D06A;110F 1172 11C1;D06A;110F 1172 11C1;
+D06B;D06B;110F 1172 11C2;D06B;110F 1172 11C2;
+D06C;D06C;110F 1173;D06C;110F 1173;
+D06D;D06D;110F 1173 11A8;D06D;110F 1173 11A8;
+D06E;D06E;110F 1173 11A9;D06E;110F 1173 11A9;
+D06F;D06F;110F 1173 11AA;D06F;110F 1173 11AA;
+D070;D070;110F 1173 11AB;D070;110F 1173 11AB;
+D071;D071;110F 1173 11AC;D071;110F 1173 11AC;
+D072;D072;110F 1173 11AD;D072;110F 1173 11AD;
+D073;D073;110F 1173 11AE;D073;110F 1173 11AE;
+D074;D074;110F 1173 11AF;D074;110F 1173 11AF;
+D075;D075;110F 1173 11B0;D075;110F 1173 11B0;
+D076;D076;110F 1173 11B1;D076;110F 1173 11B1;
+D077;D077;110F 1173 11B2;D077;110F 1173 11B2;
+D078;D078;110F 1173 11B3;D078;110F 1173 11B3;
+D079;D079;110F 1173 11B4;D079;110F 1173 11B4;
+D07A;D07A;110F 1173 11B5;D07A;110F 1173 11B5;
+D07B;D07B;110F 1173 11B6;D07B;110F 1173 11B6;
+D07C;D07C;110F 1173 11B7;D07C;110F 1173 11B7;
+D07D;D07D;110F 1173 11B8;D07D;110F 1173 11B8;
+D07E;D07E;110F 1173 11B9;D07E;110F 1173 11B9;
+D07F;D07F;110F 1173 11BA;D07F;110F 1173 11BA;
+D080;D080;110F 1173 11BB;D080;110F 1173 11BB;
+D081;D081;110F 1173 11BC;D081;110F 1173 11BC;
+D082;D082;110F 1173 11BD;D082;110F 1173 11BD;
+D083;D083;110F 1173 11BE;D083;110F 1173 11BE;
+D084;D084;110F 1173 11BF;D084;110F 1173 11BF;
+D085;D085;110F 1173 11C0;D085;110F 1173 11C0;
+D086;D086;110F 1173 11C1;D086;110F 1173 11C1;
+D087;D087;110F 1173 11C2;D087;110F 1173 11C2;
+D088;D088;110F 1174;D088;110F 1174;
+D089;D089;110F 1174 11A8;D089;110F 1174 11A8;
+D08A;D08A;110F 1174 11A9;D08A;110F 1174 11A9;
+D08B;D08B;110F 1174 11AA;D08B;110F 1174 11AA;
+D08C;D08C;110F 1174 11AB;D08C;110F 1174 11AB;
+D08D;D08D;110F 1174 11AC;D08D;110F 1174 11AC;
+D08E;D08E;110F 1174 11AD;D08E;110F 1174 11AD;
+D08F;D08F;110F 1174 11AE;D08F;110F 1174 11AE;
+D090;D090;110F 1174 11AF;D090;110F 1174 11AF;
+D091;D091;110F 1174 11B0;D091;110F 1174 11B0;
+D092;D092;110F 1174 11B1;D092;110F 1174 11B1;
+D093;D093;110F 1174 11B2;D093;110F 1174 11B2;
+D094;D094;110F 1174 11B3;D094;110F 1174 11B3;
+D095;D095;110F 1174 11B4;D095;110F 1174 11B4;
+D096;D096;110F 1174 11B5;D096;110F 1174 11B5;
+D097;D097;110F 1174 11B6;D097;110F 1174 11B6;
+D098;D098;110F 1174 11B7;D098;110F 1174 11B7;
+D099;D099;110F 1174 11B8;D099;110F 1174 11B8;
+D09A;D09A;110F 1174 11B9;D09A;110F 1174 11B9;
+D09B;D09B;110F 1174 11BA;D09B;110F 1174 11BA;
+D09C;D09C;110F 1174 11BB;D09C;110F 1174 11BB;
+D09D;D09D;110F 1174 11BC;D09D;110F 1174 11BC;
+D09E;D09E;110F 1174 11BD;D09E;110F 1174 11BD;
+D09F;D09F;110F 1174 11BE;D09F;110F 1174 11BE;
+D0A0;D0A0;110F 1174 11BF;D0A0;110F 1174 11BF;
+D0A1;D0A1;110F 1174 11C0;D0A1;110F 1174 11C0;
+D0A2;D0A2;110F 1174 11C1;D0A2;110F 1174 11C1;
+D0A3;D0A3;110F 1174 11C2;D0A3;110F 1174 11C2;
+D0A4;D0A4;110F 1175;D0A4;110F 1175;
+D0A5;D0A5;110F 1175 11A8;D0A5;110F 1175 11A8;
+D0A6;D0A6;110F 1175 11A9;D0A6;110F 1175 11A9;
+D0A7;D0A7;110F 1175 11AA;D0A7;110F 1175 11AA;
+D0A8;D0A8;110F 1175 11AB;D0A8;110F 1175 11AB;
+D0A9;D0A9;110F 1175 11AC;D0A9;110F 1175 11AC;
+D0AA;D0AA;110F 1175 11AD;D0AA;110F 1175 11AD;
+D0AB;D0AB;110F 1175 11AE;D0AB;110F 1175 11AE;
+D0AC;D0AC;110F 1175 11AF;D0AC;110F 1175 11AF;
+D0AD;D0AD;110F 1175 11B0;D0AD;110F 1175 11B0;
+D0AE;D0AE;110F 1175 11B1;D0AE;110F 1175 11B1;
+D0AF;D0AF;110F 1175 11B2;D0AF;110F 1175 11B2;
+D0B0;D0B0;110F 1175 11B3;D0B0;110F 1175 11B3;
+D0B1;D0B1;110F 1175 11B4;D0B1;110F 1175 11B4;
+D0B2;D0B2;110F 1175 11B5;D0B2;110F 1175 11B5;
+D0B3;D0B3;110F 1175 11B6;D0B3;110F 1175 11B6;
+D0B4;D0B4;110F 1175 11B7;D0B4;110F 1175 11B7;
+D0B5;D0B5;110F 1175 11B8;D0B5;110F 1175 11B8;
+D0B6;D0B6;110F 1175 11B9;D0B6;110F 1175 11B9;
+D0B7;D0B7;110F 1175 11BA;D0B7;110F 1175 11BA;
+D0B8;D0B8;110F 1175 11BB;D0B8;110F 1175 11BB;
+D0B9;D0B9;110F 1175 11BC;D0B9;110F 1175 11BC;
+D0BA;D0BA;110F 1175 11BD;D0BA;110F 1175 11BD;
+D0BB;D0BB;110F 1175 11BE;D0BB;110F 1175 11BE;
+D0BC;D0BC;110F 1175 11BF;D0BC;110F 1175 11BF;
+D0BD;D0BD;110F 1175 11C0;D0BD;110F 1175 11C0;
+D0BE;D0BE;110F 1175 11C1;D0BE;110F 1175 11C1;
+D0BF;D0BF;110F 1175 11C2;D0BF;110F 1175 11C2;
+D0C0;D0C0;1110 1161;D0C0;1110 1161;
+D0C1;D0C1;1110 1161 11A8;D0C1;1110 1161 11A8;
+D0C2;D0C2;1110 1161 11A9;D0C2;1110 1161 11A9;
+D0C3;D0C3;1110 1161 11AA;D0C3;1110 1161 11AA;
+D0C4;D0C4;1110 1161 11AB;D0C4;1110 1161 11AB;
+D0C5;D0C5;1110 1161 11AC;D0C5;1110 1161 11AC;
+D0C6;D0C6;1110 1161 11AD;D0C6;1110 1161 11AD;
+D0C7;D0C7;1110 1161 11AE;D0C7;1110 1161 11AE;
+D0C8;D0C8;1110 1161 11AF;D0C8;1110 1161 11AF;
+D0C9;D0C9;1110 1161 11B0;D0C9;1110 1161 11B0;
+D0CA;D0CA;1110 1161 11B1;D0CA;1110 1161 11B1;
+D0CB;D0CB;1110 1161 11B2;D0CB;1110 1161 11B2;
+D0CC;D0CC;1110 1161 11B3;D0CC;1110 1161 11B3;
+D0CD;D0CD;1110 1161 11B4;D0CD;1110 1161 11B4;
+D0CE;D0CE;1110 1161 11B5;D0CE;1110 1161 11B5;
+D0CF;D0CF;1110 1161 11B6;D0CF;1110 1161 11B6;
+D0D0;D0D0;1110 1161 11B7;D0D0;1110 1161 11B7;
+D0D1;D0D1;1110 1161 11B8;D0D1;1110 1161 11B8;
+D0D2;D0D2;1110 1161 11B9;D0D2;1110 1161 11B9;
+D0D3;D0D3;1110 1161 11BA;D0D3;1110 1161 11BA;
+D0D4;D0D4;1110 1161 11BB;D0D4;1110 1161 11BB;
+D0D5;D0D5;1110 1161 11BC;D0D5;1110 1161 11BC;
+D0D6;D0D6;1110 1161 11BD;D0D6;1110 1161 11BD;
+D0D7;D0D7;1110 1161 11BE;D0D7;1110 1161 11BE;
+D0D8;D0D8;1110 1161 11BF;D0D8;1110 1161 11BF;
+D0D9;D0D9;1110 1161 11C0;D0D9;1110 1161 11C0;
+D0DA;D0DA;1110 1161 11C1;D0DA;1110 1161 11C1;
+D0DB;D0DB;1110 1161 11C2;D0DB;1110 1161 11C2;
+D0DC;D0DC;1110 1162;D0DC;1110 1162;
+D0DD;D0DD;1110 1162 11A8;D0DD;1110 1162 11A8;
+D0DE;D0DE;1110 1162 11A9;D0DE;1110 1162 11A9;
+D0DF;D0DF;1110 1162 11AA;D0DF;1110 1162 11AA;
+D0E0;D0E0;1110 1162 11AB;D0E0;1110 1162 11AB;
+D0E1;D0E1;1110 1162 11AC;D0E1;1110 1162 11AC;
+D0E2;D0E2;1110 1162 11AD;D0E2;1110 1162 11AD;
+D0E3;D0E3;1110 1162 11AE;D0E3;1110 1162 11AE;
+D0E4;D0E4;1110 1162 11AF;D0E4;1110 1162 11AF;
+D0E5;D0E5;1110 1162 11B0;D0E5;1110 1162 11B0;
+D0E6;D0E6;1110 1162 11B1;D0E6;1110 1162 11B1;
+D0E7;D0E7;1110 1162 11B2;D0E7;1110 1162 11B2;
+D0E8;D0E8;1110 1162 11B3;D0E8;1110 1162 11B3;
+D0E9;D0E9;1110 1162 11B4;D0E9;1110 1162 11B4;
+D0EA;D0EA;1110 1162 11B5;D0EA;1110 1162 11B5;
+D0EB;D0EB;1110 1162 11B6;D0EB;1110 1162 11B6;
+D0EC;D0EC;1110 1162 11B7;D0EC;1110 1162 11B7;
+D0ED;D0ED;1110 1162 11B8;D0ED;1110 1162 11B8;
+D0EE;D0EE;1110 1162 11B9;D0EE;1110 1162 11B9;
+D0EF;D0EF;1110 1162 11BA;D0EF;1110 1162 11BA;
+D0F0;D0F0;1110 1162 11BB;D0F0;1110 1162 11BB;
+D0F1;D0F1;1110 1162 11BC;D0F1;1110 1162 11BC;
+D0F2;D0F2;1110 1162 11BD;D0F2;1110 1162 11BD;
+D0F3;D0F3;1110 1162 11BE;D0F3;1110 1162 11BE;
+D0F4;D0F4;1110 1162 11BF;D0F4;1110 1162 11BF;
+D0F5;D0F5;1110 1162 11C0;D0F5;1110 1162 11C0;
+D0F6;D0F6;1110 1162 11C1;D0F6;1110 1162 11C1;
+D0F7;D0F7;1110 1162 11C2;D0F7;1110 1162 11C2;
+D0F8;D0F8;1110 1163;D0F8;1110 1163;
+D0F9;D0F9;1110 1163 11A8;D0F9;1110 1163 11A8;
+D0FA;D0FA;1110 1163 11A9;D0FA;1110 1163 11A9;
+D0FB;D0FB;1110 1163 11AA;D0FB;1110 1163 11AA;
+D0FC;D0FC;1110 1163 11AB;D0FC;1110 1163 11AB;
+D0FD;D0FD;1110 1163 11AC;D0FD;1110 1163 11AC;
+D0FE;D0FE;1110 1163 11AD;D0FE;1110 1163 11AD;
+D0FF;D0FF;1110 1163 11AE;D0FF;1110 1163 11AE;
+D100;D100;1110 1163 11AF;D100;1110 1163 11AF;
+D101;D101;1110 1163 11B0;D101;1110 1163 11B0;
+D102;D102;1110 1163 11B1;D102;1110 1163 11B1;
+D103;D103;1110 1163 11B2;D103;1110 1163 11B2;
+D104;D104;1110 1163 11B3;D104;1110 1163 11B3;
+D105;D105;1110 1163 11B4;D105;1110 1163 11B4;
+D106;D106;1110 1163 11B5;D106;1110 1163 11B5;
+D107;D107;1110 1163 11B6;D107;1110 1163 11B6;
+D108;D108;1110 1163 11B7;D108;1110 1163 11B7;
+D109;D109;1110 1163 11B8;D109;1110 1163 11B8;
+D10A;D10A;1110 1163 11B9;D10A;1110 1163 11B9;
+D10B;D10B;1110 1163 11BA;D10B;1110 1163 11BA;
+D10C;D10C;1110 1163 11BB;D10C;1110 1163 11BB;
+D10D;D10D;1110 1163 11BC;D10D;1110 1163 11BC;
+D10E;D10E;1110 1163 11BD;D10E;1110 1163 11BD;
+D10F;D10F;1110 1163 11BE;D10F;1110 1163 11BE;
+D110;D110;1110 1163 11BF;D110;1110 1163 11BF;
+D111;D111;1110 1163 11C0;D111;1110 1163 11C0;
+D112;D112;1110 1163 11C1;D112;1110 1163 11C1;
+D113;D113;1110 1163 11C2;D113;1110 1163 11C2;
+D114;D114;1110 1164;D114;1110 1164;
+D115;D115;1110 1164 11A8;D115;1110 1164 11A8;
+D116;D116;1110 1164 11A9;D116;1110 1164 11A9;
+D117;D117;1110 1164 11AA;D117;1110 1164 11AA;
+D118;D118;1110 1164 11AB;D118;1110 1164 11AB;
+D119;D119;1110 1164 11AC;D119;1110 1164 11AC;
+D11A;D11A;1110 1164 11AD;D11A;1110 1164 11AD;
+D11B;D11B;1110 1164 11AE;D11B;1110 1164 11AE;
+D11C;D11C;1110 1164 11AF;D11C;1110 1164 11AF;
+D11D;D11D;1110 1164 11B0;D11D;1110 1164 11B0;
+D11E;D11E;1110 1164 11B1;D11E;1110 1164 11B1;
+D11F;D11F;1110 1164 11B2;D11F;1110 1164 11B2;
+D120;D120;1110 1164 11B3;D120;1110 1164 11B3;
+D121;D121;1110 1164 11B4;D121;1110 1164 11B4;
+D122;D122;1110 1164 11B5;D122;1110 1164 11B5;
+D123;D123;1110 1164 11B6;D123;1110 1164 11B6;
+D124;D124;1110 1164 11B7;D124;1110 1164 11B7;
+D125;D125;1110 1164 11B8;D125;1110 1164 11B8;
+D126;D126;1110 1164 11B9;D126;1110 1164 11B9;
+D127;D127;1110 1164 11BA;D127;1110 1164 11BA;
+D128;D128;1110 1164 11BB;D128;1110 1164 11BB;
+D129;D129;1110 1164 11BC;D129;1110 1164 11BC;
+D12A;D12A;1110 1164 11BD;D12A;1110 1164 11BD;
+D12B;D12B;1110 1164 11BE;D12B;1110 1164 11BE;
+D12C;D12C;1110 1164 11BF;D12C;1110 1164 11BF;
+D12D;D12D;1110 1164 11C0;D12D;1110 1164 11C0;
+D12E;D12E;1110 1164 11C1;D12E;1110 1164 11C1;
+D12F;D12F;1110 1164 11C2;D12F;1110 1164 11C2;
+D130;D130;1110 1165;D130;1110 1165;
+D131;D131;1110 1165 11A8;D131;1110 1165 11A8;
+D132;D132;1110 1165 11A9;D132;1110 1165 11A9;
+D133;D133;1110 1165 11AA;D133;1110 1165 11AA;
+D134;D134;1110 1165 11AB;D134;1110 1165 11AB;
+D135;D135;1110 1165 11AC;D135;1110 1165 11AC;
+D136;D136;1110 1165 11AD;D136;1110 1165 11AD;
+D137;D137;1110 1165 11AE;D137;1110 1165 11AE;
+D138;D138;1110 1165 11AF;D138;1110 1165 11AF;
+D139;D139;1110 1165 11B0;D139;1110 1165 11B0;
+D13A;D13A;1110 1165 11B1;D13A;1110 1165 11B1;
+D13B;D13B;1110 1165 11B2;D13B;1110 1165 11B2;
+D13C;D13C;1110 1165 11B3;D13C;1110 1165 11B3;
+D13D;D13D;1110 1165 11B4;D13D;1110 1165 11B4;
+D13E;D13E;1110 1165 11B5;D13E;1110 1165 11B5;
+D13F;D13F;1110 1165 11B6;D13F;1110 1165 11B6;
+D140;D140;1110 1165 11B7;D140;1110 1165 11B7;
+D141;D141;1110 1165 11B8;D141;1110 1165 11B8;
+D142;D142;1110 1165 11B9;D142;1110 1165 11B9;
+D143;D143;1110 1165 11BA;D143;1110 1165 11BA;
+D144;D144;1110 1165 11BB;D144;1110 1165 11BB;
+D145;D145;1110 1165 11BC;D145;1110 1165 11BC;
+D146;D146;1110 1165 11BD;D146;1110 1165 11BD;
+D147;D147;1110 1165 11BE;D147;1110 1165 11BE;
+D148;D148;1110 1165 11BF;D148;1110 1165 11BF;
+D149;D149;1110 1165 11C0;D149;1110 1165 11C0;
+D14A;D14A;1110 1165 11C1;D14A;1110 1165 11C1;
+D14B;D14B;1110 1165 11C2;D14B;1110 1165 11C2;
+D14C;D14C;1110 1166;D14C;1110 1166;
+D14D;D14D;1110 1166 11A8;D14D;1110 1166 11A8;
+D14E;D14E;1110 1166 11A9;D14E;1110 1166 11A9;
+D14F;D14F;1110 1166 11AA;D14F;1110 1166 11AA;
+D150;D150;1110 1166 11AB;D150;1110 1166 11AB;
+D151;D151;1110 1166 11AC;D151;1110 1166 11AC;
+D152;D152;1110 1166 11AD;D152;1110 1166 11AD;
+D153;D153;1110 1166 11AE;D153;1110 1166 11AE;
+D154;D154;1110 1166 11AF;D154;1110 1166 11AF;
+D155;D155;1110 1166 11B0;D155;1110 1166 11B0;
+D156;D156;1110 1166 11B1;D156;1110 1166 11B1;
+D157;D157;1110 1166 11B2;D157;1110 1166 11B2;
+D158;D158;1110 1166 11B3;D158;1110 1166 11B3;
+D159;D159;1110 1166 11B4;D159;1110 1166 11B4;
+D15A;D15A;1110 1166 11B5;D15A;1110 1166 11B5;
+D15B;D15B;1110 1166 11B6;D15B;1110 1166 11B6;
+D15C;D15C;1110 1166 11B7;D15C;1110 1166 11B7;
+D15D;D15D;1110 1166 11B8;D15D;1110 1166 11B8;
+D15E;D15E;1110 1166 11B9;D15E;1110 1166 11B9;
+D15F;D15F;1110 1166 11BA;D15F;1110 1166 11BA;
+D160;D160;1110 1166 11BB;D160;1110 1166 11BB;
+D161;D161;1110 1166 11BC;D161;1110 1166 11BC;
+D162;D162;1110 1166 11BD;D162;1110 1166 11BD;
+D163;D163;1110 1166 11BE;D163;1110 1166 11BE;
+D164;D164;1110 1166 11BF;D164;1110 1166 11BF;
+D165;D165;1110 1166 11C0;D165;1110 1166 11C0;
+D166;D166;1110 1166 11C1;D166;1110 1166 11C1;
+D167;D167;1110 1166 11C2;D167;1110 1166 11C2;
+D168;D168;1110 1167;D168;1110 1167;
+D169;D169;1110 1167 11A8;D169;1110 1167 11A8;
+D16A;D16A;1110 1167 11A9;D16A;1110 1167 11A9;
+D16B;D16B;1110 1167 11AA;D16B;1110 1167 11AA;
+D16C;D16C;1110 1167 11AB;D16C;1110 1167 11AB;
+D16D;D16D;1110 1167 11AC;D16D;1110 1167 11AC;
+D16E;D16E;1110 1167 11AD;D16E;1110 1167 11AD;
+D16F;D16F;1110 1167 11AE;D16F;1110 1167 11AE;
+D170;D170;1110 1167 11AF;D170;1110 1167 11AF;
+D171;D171;1110 1167 11B0;D171;1110 1167 11B0;
+D172;D172;1110 1167 11B1;D172;1110 1167 11B1;
+D173;D173;1110 1167 11B2;D173;1110 1167 11B2;
+D174;D174;1110 1167 11B3;D174;1110 1167 11B3;
+D175;D175;1110 1167 11B4;D175;1110 1167 11B4;
+D176;D176;1110 1167 11B5;D176;1110 1167 11B5;
+D177;D177;1110 1167 11B6;D177;1110 1167 11B6;
+D178;D178;1110 1167 11B7;D178;1110 1167 11B7;
+D179;D179;1110 1167 11B8;D179;1110 1167 11B8;
+D17A;D17A;1110 1167 11B9;D17A;1110 1167 11B9;
+D17B;D17B;1110 1167 11BA;D17B;1110 1167 11BA;
+D17C;D17C;1110 1167 11BB;D17C;1110 1167 11BB;
+D17D;D17D;1110 1167 11BC;D17D;1110 1167 11BC;
+D17E;D17E;1110 1167 11BD;D17E;1110 1167 11BD;
+D17F;D17F;1110 1167 11BE;D17F;1110 1167 11BE;
+D180;D180;1110 1167 11BF;D180;1110 1167 11BF;
+D181;D181;1110 1167 11C0;D181;1110 1167 11C0;
+D182;D182;1110 1167 11C1;D182;1110 1167 11C1;
+D183;D183;1110 1167 11C2;D183;1110 1167 11C2;
+D184;D184;1110 1168;D184;1110 1168;
+D185;D185;1110 1168 11A8;D185;1110 1168 11A8;
+D186;D186;1110 1168 11A9;D186;1110 1168 11A9;
+D187;D187;1110 1168 11AA;D187;1110 1168 11AA;
+D188;D188;1110 1168 11AB;D188;1110 1168 11AB;
+D189;D189;1110 1168 11AC;D189;1110 1168 11AC;
+D18A;D18A;1110 1168 11AD;D18A;1110 1168 11AD;
+D18B;D18B;1110 1168 11AE;D18B;1110 1168 11AE;
+D18C;D18C;1110 1168 11AF;D18C;1110 1168 11AF;
+D18D;D18D;1110 1168 11B0;D18D;1110 1168 11B0;
+D18E;D18E;1110 1168 11B1;D18E;1110 1168 11B1;
+D18F;D18F;1110 1168 11B2;D18F;1110 1168 11B2;
+D190;D190;1110 1168 11B3;D190;1110 1168 11B3;
+D191;D191;1110 1168 11B4;D191;1110 1168 11B4;
+D192;D192;1110 1168 11B5;D192;1110 1168 11B5;
+D193;D193;1110 1168 11B6;D193;1110 1168 11B6;
+D194;D194;1110 1168 11B7;D194;1110 1168 11B7;
+D195;D195;1110 1168 11B8;D195;1110 1168 11B8;
+D196;D196;1110 1168 11B9;D196;1110 1168 11B9;
+D197;D197;1110 1168 11BA;D197;1110 1168 11BA;
+D198;D198;1110 1168 11BB;D198;1110 1168 11BB;
+D199;D199;1110 1168 11BC;D199;1110 1168 11BC;
+D19A;D19A;1110 1168 11BD;D19A;1110 1168 11BD;
+D19B;D19B;1110 1168 11BE;D19B;1110 1168 11BE;
+D19C;D19C;1110 1168 11BF;D19C;1110 1168 11BF;
+D19D;D19D;1110 1168 11C0;D19D;1110 1168 11C0;
+D19E;D19E;1110 1168 11C1;D19E;1110 1168 11C1;
+D19F;D19F;1110 1168 11C2;D19F;1110 1168 11C2;
+D1A0;D1A0;1110 1169;D1A0;1110 1169;
+D1A1;D1A1;1110 1169 11A8;D1A1;1110 1169 11A8;
+D1A2;D1A2;1110 1169 11A9;D1A2;1110 1169 11A9;
+D1A3;D1A3;1110 1169 11AA;D1A3;1110 1169 11AA;
+D1A4;D1A4;1110 1169 11AB;D1A4;1110 1169 11AB;
+D1A5;D1A5;1110 1169 11AC;D1A5;1110 1169 11AC;
+D1A6;D1A6;1110 1169 11AD;D1A6;1110 1169 11AD;
+D1A7;D1A7;1110 1169 11AE;D1A7;1110 1169 11AE;
+D1A8;D1A8;1110 1169 11AF;D1A8;1110 1169 11AF;
+D1A9;D1A9;1110 1169 11B0;D1A9;1110 1169 11B0;
+D1AA;D1AA;1110 1169 11B1;D1AA;1110 1169 11B1;
+D1AB;D1AB;1110 1169 11B2;D1AB;1110 1169 11B2;
+D1AC;D1AC;1110 1169 11B3;D1AC;1110 1169 11B3;
+D1AD;D1AD;1110 1169 11B4;D1AD;1110 1169 11B4;
+D1AE;D1AE;1110 1169 11B5;D1AE;1110 1169 11B5;
+D1AF;D1AF;1110 1169 11B6;D1AF;1110 1169 11B6;
+D1B0;D1B0;1110 1169 11B7;D1B0;1110 1169 11B7;
+D1B1;D1B1;1110 1169 11B8;D1B1;1110 1169 11B8;
+D1B2;D1B2;1110 1169 11B9;D1B2;1110 1169 11B9;
+D1B3;D1B3;1110 1169 11BA;D1B3;1110 1169 11BA;
+D1B4;D1B4;1110 1169 11BB;D1B4;1110 1169 11BB;
+D1B5;D1B5;1110 1169 11BC;D1B5;1110 1169 11BC;
+D1B6;D1B6;1110 1169 11BD;D1B6;1110 1169 11BD;
+D1B7;D1B7;1110 1169 11BE;D1B7;1110 1169 11BE;
+D1B8;D1B8;1110 1169 11BF;D1B8;1110 1169 11BF;
+D1B9;D1B9;1110 1169 11C0;D1B9;1110 1169 11C0;
+D1BA;D1BA;1110 1169 11C1;D1BA;1110 1169 11C1;
+D1BB;D1BB;1110 1169 11C2;D1BB;1110 1169 11C2;
+D1BC;D1BC;1110 116A;D1BC;1110 116A;
+D1BD;D1BD;1110 116A 11A8;D1BD;1110 116A 11A8;
+D1BE;D1BE;1110 116A 11A9;D1BE;1110 116A 11A9;
+D1BF;D1BF;1110 116A 11AA;D1BF;1110 116A 11AA;
+D1C0;D1C0;1110 116A 11AB;D1C0;1110 116A 11AB;
+D1C1;D1C1;1110 116A 11AC;D1C1;1110 116A 11AC;
+D1C2;D1C2;1110 116A 11AD;D1C2;1110 116A 11AD;
+D1C3;D1C3;1110 116A 11AE;D1C3;1110 116A 11AE;
+D1C4;D1C4;1110 116A 11AF;D1C4;1110 116A 11AF;
+D1C5;D1C5;1110 116A 11B0;D1C5;1110 116A 11B0;
+D1C6;D1C6;1110 116A 11B1;D1C6;1110 116A 11B1;
+D1C7;D1C7;1110 116A 11B2;D1C7;1110 116A 11B2;
+D1C8;D1C8;1110 116A 11B3;D1C8;1110 116A 11B3;
+D1C9;D1C9;1110 116A 11B4;D1C9;1110 116A 11B4;
+D1CA;D1CA;1110 116A 11B5;D1CA;1110 116A 11B5;
+D1CB;D1CB;1110 116A 11B6;D1CB;1110 116A 11B6;
+D1CC;D1CC;1110 116A 11B7;D1CC;1110 116A 11B7;
+D1CD;D1CD;1110 116A 11B8;D1CD;1110 116A 11B8;
+D1CE;D1CE;1110 116A 11B9;D1CE;1110 116A 11B9;
+D1CF;D1CF;1110 116A 11BA;D1CF;1110 116A 11BA;
+D1D0;D1D0;1110 116A 11BB;D1D0;1110 116A 11BB;
+D1D1;D1D1;1110 116A 11BC;D1D1;1110 116A 11BC;
+D1D2;D1D2;1110 116A 11BD;D1D2;1110 116A 11BD;
+D1D3;D1D3;1110 116A 11BE;D1D3;1110 116A 11BE;
+D1D4;D1D4;1110 116A 11BF;D1D4;1110 116A 11BF;
+D1D5;D1D5;1110 116A 11C0;D1D5;1110 116A 11C0;
+D1D6;D1D6;1110 116A 11C1;D1D6;1110 116A 11C1;
+D1D7;D1D7;1110 116A 11C2;D1D7;1110 116A 11C2;
+D1D8;D1D8;1110 116B;D1D8;1110 116B;
+D1D9;D1D9;1110 116B 11A8;D1D9;1110 116B 11A8;
+D1DA;D1DA;1110 116B 11A9;D1DA;1110 116B 11A9;
+D1DB;D1DB;1110 116B 11AA;D1DB;1110 116B 11AA;
+D1DC;D1DC;1110 116B 11AB;D1DC;1110 116B 11AB;
+D1DD;D1DD;1110 116B 11AC;D1DD;1110 116B 11AC;
+D1DE;D1DE;1110 116B 11AD;D1DE;1110 116B 11AD;
+D1DF;D1DF;1110 116B 11AE;D1DF;1110 116B 11AE;
+D1E0;D1E0;1110 116B 11AF;D1E0;1110 116B 11AF;
+D1E1;D1E1;1110 116B 11B0;D1E1;1110 116B 11B0;
+D1E2;D1E2;1110 116B 11B1;D1E2;1110 116B 11B1;
+D1E3;D1E3;1110 116B 11B2;D1E3;1110 116B 11B2;
+D1E4;D1E4;1110 116B 11B3;D1E4;1110 116B 11B3;
+D1E5;D1E5;1110 116B 11B4;D1E5;1110 116B 11B4;
+D1E6;D1E6;1110 116B 11B5;D1E6;1110 116B 11B5;
+D1E7;D1E7;1110 116B 11B6;D1E7;1110 116B 11B6;
+D1E8;D1E8;1110 116B 11B7;D1E8;1110 116B 11B7;
+D1E9;D1E9;1110 116B 11B8;D1E9;1110 116B 11B8;
+D1EA;D1EA;1110 116B 11B9;D1EA;1110 116B 11B9;
+D1EB;D1EB;1110 116B 11BA;D1EB;1110 116B 11BA;
+D1EC;D1EC;1110 116B 11BB;D1EC;1110 116B 11BB;
+D1ED;D1ED;1110 116B 11BC;D1ED;1110 116B 11BC;
+D1EE;D1EE;1110 116B 11BD;D1EE;1110 116B 11BD;
+D1EF;D1EF;1110 116B 11BE;D1EF;1110 116B 11BE;
+D1F0;D1F0;1110 116B 11BF;D1F0;1110 116B 11BF;
+D1F1;D1F1;1110 116B 11C0;D1F1;1110 116B 11C0;
+D1F2;D1F2;1110 116B 11C1;D1F2;1110 116B 11C1;
+D1F3;D1F3;1110 116B 11C2;D1F3;1110 116B 11C2;
+D1F4;D1F4;1110 116C;D1F4;1110 116C;
+D1F5;D1F5;1110 116C 11A8;D1F5;1110 116C 11A8;
+D1F6;D1F6;1110 116C 11A9;D1F6;1110 116C 11A9;
+D1F7;D1F7;1110 116C 11AA;D1F7;1110 116C 11AA;
+D1F8;D1F8;1110 116C 11AB;D1F8;1110 116C 11AB;
+D1F9;D1F9;1110 116C 11AC;D1F9;1110 116C 11AC;
+D1FA;D1FA;1110 116C 11AD;D1FA;1110 116C 11AD;
+D1FB;D1FB;1110 116C 11AE;D1FB;1110 116C 11AE;
+D1FC;D1FC;1110 116C 11AF;D1FC;1110 116C 11AF;
+D1FD;D1FD;1110 116C 11B0;D1FD;1110 116C 11B0;
+D1FE;D1FE;1110 116C 11B1;D1FE;1110 116C 11B1;
+D1FF;D1FF;1110 116C 11B2;D1FF;1110 116C 11B2;
+D200;D200;1110 116C 11B3;D200;1110 116C 11B3;
+D201;D201;1110 116C 11B4;D201;1110 116C 11B4;
+D202;D202;1110 116C 11B5;D202;1110 116C 11B5;
+D203;D203;1110 116C 11B6;D203;1110 116C 11B6;
+D204;D204;1110 116C 11B7;D204;1110 116C 11B7;
+D205;D205;1110 116C 11B8;D205;1110 116C 11B8;
+D206;D206;1110 116C 11B9;D206;1110 116C 11B9;
+D207;D207;1110 116C 11BA;D207;1110 116C 11BA;
+D208;D208;1110 116C 11BB;D208;1110 116C 11BB;
+D209;D209;1110 116C 11BC;D209;1110 116C 11BC;
+D20A;D20A;1110 116C 11BD;D20A;1110 116C 11BD;
+D20B;D20B;1110 116C 11BE;D20B;1110 116C 11BE;
+D20C;D20C;1110 116C 11BF;D20C;1110 116C 11BF;
+D20D;D20D;1110 116C 11C0;D20D;1110 116C 11C0;
+D20E;D20E;1110 116C 11C1;D20E;1110 116C 11C1;
+D20F;D20F;1110 116C 11C2;D20F;1110 116C 11C2;
+D210;D210;1110 116D;D210;1110 116D;
+D211;D211;1110 116D 11A8;D211;1110 116D 11A8;
+D212;D212;1110 116D 11A9;D212;1110 116D 11A9;
+D213;D213;1110 116D 11AA;D213;1110 116D 11AA;
+D214;D214;1110 116D 11AB;D214;1110 116D 11AB;
+D215;D215;1110 116D 11AC;D215;1110 116D 11AC;
+D216;D216;1110 116D 11AD;D216;1110 116D 11AD;
+D217;D217;1110 116D 11AE;D217;1110 116D 11AE;
+D218;D218;1110 116D 11AF;D218;1110 116D 11AF;
+D219;D219;1110 116D 11B0;D219;1110 116D 11B0;
+D21A;D21A;1110 116D 11B1;D21A;1110 116D 11B1;
+D21B;D21B;1110 116D 11B2;D21B;1110 116D 11B2;
+D21C;D21C;1110 116D 11B3;D21C;1110 116D 11B3;
+D21D;D21D;1110 116D 11B4;D21D;1110 116D 11B4;
+D21E;D21E;1110 116D 11B5;D21E;1110 116D 11B5;
+D21F;D21F;1110 116D 11B6;D21F;1110 116D 11B6;
+D220;D220;1110 116D 11B7;D220;1110 116D 11B7;
+D221;D221;1110 116D 11B8;D221;1110 116D 11B8;
+D222;D222;1110 116D 11B9;D222;1110 116D 11B9;
+D223;D223;1110 116D 11BA;D223;1110 116D 11BA;
+D224;D224;1110 116D 11BB;D224;1110 116D 11BB;
+D225;D225;1110 116D 11BC;D225;1110 116D 11BC;
+D226;D226;1110 116D 11BD;D226;1110 116D 11BD;
+D227;D227;1110 116D 11BE;D227;1110 116D 11BE;
+D228;D228;1110 116D 11BF;D228;1110 116D 11BF;
+D229;D229;1110 116D 11C0;D229;1110 116D 11C0;
+D22A;D22A;1110 116D 11C1;D22A;1110 116D 11C1;
+D22B;D22B;1110 116D 11C2;D22B;1110 116D 11C2;
+D22C;D22C;1110 116E;D22C;1110 116E;
+D22D;D22D;1110 116E 11A8;D22D;1110 116E 11A8;
+D22E;D22E;1110 116E 11A9;D22E;1110 116E 11A9;
+D22F;D22F;1110 116E 11AA;D22F;1110 116E 11AA;
+D230;D230;1110 116E 11AB;D230;1110 116E 11AB;
+D231;D231;1110 116E 11AC;D231;1110 116E 11AC;
+D232;D232;1110 116E 11AD;D232;1110 116E 11AD;
+D233;D233;1110 116E 11AE;D233;1110 116E 11AE;
+D234;D234;1110 116E 11AF;D234;1110 116E 11AF;
+D235;D235;1110 116E 11B0;D235;1110 116E 11B0;
+D236;D236;1110 116E 11B1;D236;1110 116E 11B1;
+D237;D237;1110 116E 11B2;D237;1110 116E 11B2;
+D238;D238;1110 116E 11B3;D238;1110 116E 11B3;
+D239;D239;1110 116E 11B4;D239;1110 116E 11B4;
+D23A;D23A;1110 116E 11B5;D23A;1110 116E 11B5;
+D23B;D23B;1110 116E 11B6;D23B;1110 116E 11B6;
+D23C;D23C;1110 116E 11B7;D23C;1110 116E 11B7;
+D23D;D23D;1110 116E 11B8;D23D;1110 116E 11B8;
+D23E;D23E;1110 116E 11B9;D23E;1110 116E 11B9;
+D23F;D23F;1110 116E 11BA;D23F;1110 116E 11BA;
+D240;D240;1110 116E 11BB;D240;1110 116E 11BB;
+D241;D241;1110 116E 11BC;D241;1110 116E 11BC;
+D242;D242;1110 116E 11BD;D242;1110 116E 11BD;
+D243;D243;1110 116E 11BE;D243;1110 116E 11BE;
+D244;D244;1110 116E 11BF;D244;1110 116E 11BF;
+D245;D245;1110 116E 11C0;D245;1110 116E 11C0;
+D246;D246;1110 116E 11C1;D246;1110 116E 11C1;
+D247;D247;1110 116E 11C2;D247;1110 116E 11C2;
+D248;D248;1110 116F;D248;1110 116F;
+D249;D249;1110 116F 11A8;D249;1110 116F 11A8;
+D24A;D24A;1110 116F 11A9;D24A;1110 116F 11A9;
+D24B;D24B;1110 116F 11AA;D24B;1110 116F 11AA;
+D24C;D24C;1110 116F 11AB;D24C;1110 116F 11AB;
+D24D;D24D;1110 116F 11AC;D24D;1110 116F 11AC;
+D24E;D24E;1110 116F 11AD;D24E;1110 116F 11AD;
+D24F;D24F;1110 116F 11AE;D24F;1110 116F 11AE;
+D250;D250;1110 116F 11AF;D250;1110 116F 11AF;
+D251;D251;1110 116F 11B0;D251;1110 116F 11B0;
+D252;D252;1110 116F 11B1;D252;1110 116F 11B1;
+D253;D253;1110 116F 11B2;D253;1110 116F 11B2;
+D254;D254;1110 116F 11B3;D254;1110 116F 11B3;
+D255;D255;1110 116F 11B4;D255;1110 116F 11B4;
+D256;D256;1110 116F 11B5;D256;1110 116F 11B5;
+D257;D257;1110 116F 11B6;D257;1110 116F 11B6;
+D258;D258;1110 116F 11B7;D258;1110 116F 11B7;
+D259;D259;1110 116F 11B8;D259;1110 116F 11B8;
+D25A;D25A;1110 116F 11B9;D25A;1110 116F 11B9;
+D25B;D25B;1110 116F 11BA;D25B;1110 116F 11BA;
+D25C;D25C;1110 116F 11BB;D25C;1110 116F 11BB;
+D25D;D25D;1110 116F 11BC;D25D;1110 116F 11BC;
+D25E;D25E;1110 116F 11BD;D25E;1110 116F 11BD;
+D25F;D25F;1110 116F 11BE;D25F;1110 116F 11BE;
+D260;D260;1110 116F 11BF;D260;1110 116F 11BF;
+D261;D261;1110 116F 11C0;D261;1110 116F 11C0;
+D262;D262;1110 116F 11C1;D262;1110 116F 11C1;
+D263;D263;1110 116F 11C2;D263;1110 116F 11C2;
+D264;D264;1110 1170;D264;1110 1170;
+D265;D265;1110 1170 11A8;D265;1110 1170 11A8;
+D266;D266;1110 1170 11A9;D266;1110 1170 11A9;
+D267;D267;1110 1170 11AA;D267;1110 1170 11AA;
+D268;D268;1110 1170 11AB;D268;1110 1170 11AB;
+D269;D269;1110 1170 11AC;D269;1110 1170 11AC;
+D26A;D26A;1110 1170 11AD;D26A;1110 1170 11AD;
+D26B;D26B;1110 1170 11AE;D26B;1110 1170 11AE;
+D26C;D26C;1110 1170 11AF;D26C;1110 1170 11AF;
+D26D;D26D;1110 1170 11B0;D26D;1110 1170 11B0;
+D26E;D26E;1110 1170 11B1;D26E;1110 1170 11B1;
+D26F;D26F;1110 1170 11B2;D26F;1110 1170 11B2;
+D270;D270;1110 1170 11B3;D270;1110 1170 11B3;
+D271;D271;1110 1170 11B4;D271;1110 1170 11B4;
+D272;D272;1110 1170 11B5;D272;1110 1170 11B5;
+D273;D273;1110 1170 11B6;D273;1110 1170 11B6;
+D274;D274;1110 1170 11B7;D274;1110 1170 11B7;
+D275;D275;1110 1170 11B8;D275;1110 1170 11B8;
+D276;D276;1110 1170 11B9;D276;1110 1170 11B9;
+D277;D277;1110 1170 11BA;D277;1110 1170 11BA;
+D278;D278;1110 1170 11BB;D278;1110 1170 11BB;
+D279;D279;1110 1170 11BC;D279;1110 1170 11BC;
+D27A;D27A;1110 1170 11BD;D27A;1110 1170 11BD;
+D27B;D27B;1110 1170 11BE;D27B;1110 1170 11BE;
+D27C;D27C;1110 1170 11BF;D27C;1110 1170 11BF;
+D27D;D27D;1110 1170 11C0;D27D;1110 1170 11C0;
+D27E;D27E;1110 1170 11C1;D27E;1110 1170 11C1;
+D27F;D27F;1110 1170 11C2;D27F;1110 1170 11C2;
+D280;D280;1110 1171;D280;1110 1171;
+D281;D281;1110 1171 11A8;D281;1110 1171 11A8;
+D282;D282;1110 1171 11A9;D282;1110 1171 11A9;
+D283;D283;1110 1171 11AA;D283;1110 1171 11AA;
+D284;D284;1110 1171 11AB;D284;1110 1171 11AB;
+D285;D285;1110 1171 11AC;D285;1110 1171 11AC;
+D286;D286;1110 1171 11AD;D286;1110 1171 11AD;
+D287;D287;1110 1171 11AE;D287;1110 1171 11AE;
+D288;D288;1110 1171 11AF;D288;1110 1171 11AF;
+D289;D289;1110 1171 11B0;D289;1110 1171 11B0;
+D28A;D28A;1110 1171 11B1;D28A;1110 1171 11B1;
+D28B;D28B;1110 1171 11B2;D28B;1110 1171 11B2;
+D28C;D28C;1110 1171 11B3;D28C;1110 1171 11B3;
+D28D;D28D;1110 1171 11B4;D28D;1110 1171 11B4;
+D28E;D28E;1110 1171 11B5;D28E;1110 1171 11B5;
+D28F;D28F;1110 1171 11B6;D28F;1110 1171 11B6;
+D290;D290;1110 1171 11B7;D290;1110 1171 11B7;
+D291;D291;1110 1171 11B8;D291;1110 1171 11B8;
+D292;D292;1110 1171 11B9;D292;1110 1171 11B9;
+D293;D293;1110 1171 11BA;D293;1110 1171 11BA;
+D294;D294;1110 1171 11BB;D294;1110 1171 11BB;
+D295;D295;1110 1171 11BC;D295;1110 1171 11BC;
+D296;D296;1110 1171 11BD;D296;1110 1171 11BD;
+D297;D297;1110 1171 11BE;D297;1110 1171 11BE;
+D298;D298;1110 1171 11BF;D298;1110 1171 11BF;
+D299;D299;1110 1171 11C0;D299;1110 1171 11C0;
+D29A;D29A;1110 1171 11C1;D29A;1110 1171 11C1;
+D29B;D29B;1110 1171 11C2;D29B;1110 1171 11C2;
+D29C;D29C;1110 1172;D29C;1110 1172;
+D29D;D29D;1110 1172 11A8;D29D;1110 1172 11A8;
+D29E;D29E;1110 1172 11A9;D29E;1110 1172 11A9;
+D29F;D29F;1110 1172 11AA;D29F;1110 1172 11AA;
+D2A0;D2A0;1110 1172 11AB;D2A0;1110 1172 11AB;
+D2A1;D2A1;1110 1172 11AC;D2A1;1110 1172 11AC;
+D2A2;D2A2;1110 1172 11AD;D2A2;1110 1172 11AD;
+D2A3;D2A3;1110 1172 11AE;D2A3;1110 1172 11AE;
+D2A4;D2A4;1110 1172 11AF;D2A4;1110 1172 11AF;
+D2A5;D2A5;1110 1172 11B0;D2A5;1110 1172 11B0;
+D2A6;D2A6;1110 1172 11B1;D2A6;1110 1172 11B1;
+D2A7;D2A7;1110 1172 11B2;D2A7;1110 1172 11B2;
+D2A8;D2A8;1110 1172 11B3;D2A8;1110 1172 11B3;
+D2A9;D2A9;1110 1172 11B4;D2A9;1110 1172 11B4;
+D2AA;D2AA;1110 1172 11B5;D2AA;1110 1172 11B5;
+D2AB;D2AB;1110 1172 11B6;D2AB;1110 1172 11B6;
+D2AC;D2AC;1110 1172 11B7;D2AC;1110 1172 11B7;
+D2AD;D2AD;1110 1172 11B8;D2AD;1110 1172 11B8;
+D2AE;D2AE;1110 1172 11B9;D2AE;1110 1172 11B9;
+D2AF;D2AF;1110 1172 11BA;D2AF;1110 1172 11BA;
+D2B0;D2B0;1110 1172 11BB;D2B0;1110 1172 11BB;
+D2B1;D2B1;1110 1172 11BC;D2B1;1110 1172 11BC;
+D2B2;D2B2;1110 1172 11BD;D2B2;1110 1172 11BD;
+D2B3;D2B3;1110 1172 11BE;D2B3;1110 1172 11BE;
+D2B4;D2B4;1110 1172 11BF;D2B4;1110 1172 11BF;
+D2B5;D2B5;1110 1172 11C0;D2B5;1110 1172 11C0;
+D2B6;D2B6;1110 1172 11C1;D2B6;1110 1172 11C1;
+D2B7;D2B7;1110 1172 11C2;D2B7;1110 1172 11C2;
+D2B8;D2B8;1110 1173;D2B8;1110 1173;
+D2B9;D2B9;1110 1173 11A8;D2B9;1110 1173 11A8;
+D2BA;D2BA;1110 1173 11A9;D2BA;1110 1173 11A9;
+D2BB;D2BB;1110 1173 11AA;D2BB;1110 1173 11AA;
+D2BC;D2BC;1110 1173 11AB;D2BC;1110 1173 11AB;
+D2BD;D2BD;1110 1173 11AC;D2BD;1110 1173 11AC;
+D2BE;D2BE;1110 1173 11AD;D2BE;1110 1173 11AD;
+D2BF;D2BF;1110 1173 11AE;D2BF;1110 1173 11AE;
+D2C0;D2C0;1110 1173 11AF;D2C0;1110 1173 11AF;
+D2C1;D2C1;1110 1173 11B0;D2C1;1110 1173 11B0;
+D2C2;D2C2;1110 1173 11B1;D2C2;1110 1173 11B1;
+D2C3;D2C3;1110 1173 11B2;D2C3;1110 1173 11B2;
+D2C4;D2C4;1110 1173 11B3;D2C4;1110 1173 11B3;
+D2C5;D2C5;1110 1173 11B4;D2C5;1110 1173 11B4;
+D2C6;D2C6;1110 1173 11B5;D2C6;1110 1173 11B5;
+D2C7;D2C7;1110 1173 11B6;D2C7;1110 1173 11B6;
+D2C8;D2C8;1110 1173 11B7;D2C8;1110 1173 11B7;
+D2C9;D2C9;1110 1173 11B8;D2C9;1110 1173 11B8;
+D2CA;D2CA;1110 1173 11B9;D2CA;1110 1173 11B9;
+D2CB;D2CB;1110 1173 11BA;D2CB;1110 1173 11BA;
+D2CC;D2CC;1110 1173 11BB;D2CC;1110 1173 11BB;
+D2CD;D2CD;1110 1173 11BC;D2CD;1110 1173 11BC;
+D2CE;D2CE;1110 1173 11BD;D2CE;1110 1173 11BD;
+D2CF;D2CF;1110 1173 11BE;D2CF;1110 1173 11BE;
+D2D0;D2D0;1110 1173 11BF;D2D0;1110 1173 11BF;
+D2D1;D2D1;1110 1173 11C0;D2D1;1110 1173 11C0;
+D2D2;D2D2;1110 1173 11C1;D2D2;1110 1173 11C1;
+D2D3;D2D3;1110 1173 11C2;D2D3;1110 1173 11C2;
+D2D4;D2D4;1110 1174;D2D4;1110 1174;
+D2D5;D2D5;1110 1174 11A8;D2D5;1110 1174 11A8;
+D2D6;D2D6;1110 1174 11A9;D2D6;1110 1174 11A9;
+D2D7;D2D7;1110 1174 11AA;D2D7;1110 1174 11AA;
+D2D8;D2D8;1110 1174 11AB;D2D8;1110 1174 11AB;
+D2D9;D2D9;1110 1174 11AC;D2D9;1110 1174 11AC;
+D2DA;D2DA;1110 1174 11AD;D2DA;1110 1174 11AD;
+D2DB;D2DB;1110 1174 11AE;D2DB;1110 1174 11AE;
+D2DC;D2DC;1110 1174 11AF;D2DC;1110 1174 11AF;
+D2DD;D2DD;1110 1174 11B0;D2DD;1110 1174 11B0;
+D2DE;D2DE;1110 1174 11B1;D2DE;1110 1174 11B1;
+D2DF;D2DF;1110 1174 11B2;D2DF;1110 1174 11B2;
+D2E0;D2E0;1110 1174 11B3;D2E0;1110 1174 11B3;
+D2E1;D2E1;1110 1174 11B4;D2E1;1110 1174 11B4;
+D2E2;D2E2;1110 1174 11B5;D2E2;1110 1174 11B5;
+D2E3;D2E3;1110 1174 11B6;D2E3;1110 1174 11B6;
+D2E4;D2E4;1110 1174 11B7;D2E4;1110 1174 11B7;
+D2E5;D2E5;1110 1174 11B8;D2E5;1110 1174 11B8;
+D2E6;D2E6;1110 1174 11B9;D2E6;1110 1174 11B9;
+D2E7;D2E7;1110 1174 11BA;D2E7;1110 1174 11BA;
+D2E8;D2E8;1110 1174 11BB;D2E8;1110 1174 11BB;
+D2E9;D2E9;1110 1174 11BC;D2E9;1110 1174 11BC;
+D2EA;D2EA;1110 1174 11BD;D2EA;1110 1174 11BD;
+D2EB;D2EB;1110 1174 11BE;D2EB;1110 1174 11BE;
+D2EC;D2EC;1110 1174 11BF;D2EC;1110 1174 11BF;
+D2ED;D2ED;1110 1174 11C0;D2ED;1110 1174 11C0;
+D2EE;D2EE;1110 1174 11C1;D2EE;1110 1174 11C1;
+D2EF;D2EF;1110 1174 11C2;D2EF;1110 1174 11C2;
+D2F0;D2F0;1110 1175;D2F0;1110 1175;
+D2F1;D2F1;1110 1175 11A8;D2F1;1110 1175 11A8;
+D2F2;D2F2;1110 1175 11A9;D2F2;1110 1175 11A9;
+D2F3;D2F3;1110 1175 11AA;D2F3;1110 1175 11AA;
+D2F4;D2F4;1110 1175 11AB;D2F4;1110 1175 11AB;
+D2F5;D2F5;1110 1175 11AC;D2F5;1110 1175 11AC;
+D2F6;D2F6;1110 1175 11AD;D2F6;1110 1175 11AD;
+D2F7;D2F7;1110 1175 11AE;D2F7;1110 1175 11AE;
+D2F8;D2F8;1110 1175 11AF;D2F8;1110 1175 11AF;
+D2F9;D2F9;1110 1175 11B0;D2F9;1110 1175 11B0;
+D2FA;D2FA;1110 1175 11B1;D2FA;1110 1175 11B1;
+D2FB;D2FB;1110 1175 11B2;D2FB;1110 1175 11B2;
+D2FC;D2FC;1110 1175 11B3;D2FC;1110 1175 11B3;
+D2FD;D2FD;1110 1175 11B4;D2FD;1110 1175 11B4;
+D2FE;D2FE;1110 1175 11B5;D2FE;1110 1175 11B5;
+D2FF;D2FF;1110 1175 11B6;D2FF;1110 1175 11B6;
+D300;D300;1110 1175 11B7;D300;1110 1175 11B7;
+D301;D301;1110 1175 11B8;D301;1110 1175 11B8;
+D302;D302;1110 1175 11B9;D302;1110 1175 11B9;
+D303;D303;1110 1175 11BA;D303;1110 1175 11BA;
+D304;D304;1110 1175 11BB;D304;1110 1175 11BB;
+D305;D305;1110 1175 11BC;D305;1110 1175 11BC;
+D306;D306;1110 1175 11BD;D306;1110 1175 11BD;
+D307;D307;1110 1175 11BE;D307;1110 1175 11BE;
+D308;D308;1110 1175 11BF;D308;1110 1175 11BF;
+D309;D309;1110 1175 11C0;D309;1110 1175 11C0;
+D30A;D30A;1110 1175 11C1;D30A;1110 1175 11C1;
+D30B;D30B;1110 1175 11C2;D30B;1110 1175 11C2;
+D30C;D30C;1111 1161;D30C;1111 1161;
+D30D;D30D;1111 1161 11A8;D30D;1111 1161 11A8;
+D30E;D30E;1111 1161 11A9;D30E;1111 1161 11A9;
+D30F;D30F;1111 1161 11AA;D30F;1111 1161 11AA;
+D310;D310;1111 1161 11AB;D310;1111 1161 11AB;
+D311;D311;1111 1161 11AC;D311;1111 1161 11AC;
+D312;D312;1111 1161 11AD;D312;1111 1161 11AD;
+D313;D313;1111 1161 11AE;D313;1111 1161 11AE;
+D314;D314;1111 1161 11AF;D314;1111 1161 11AF;
+D315;D315;1111 1161 11B0;D315;1111 1161 11B0;
+D316;D316;1111 1161 11B1;D316;1111 1161 11B1;
+D317;D317;1111 1161 11B2;D317;1111 1161 11B2;
+D318;D318;1111 1161 11B3;D318;1111 1161 11B3;
+D319;D319;1111 1161 11B4;D319;1111 1161 11B4;
+D31A;D31A;1111 1161 11B5;D31A;1111 1161 11B5;
+D31B;D31B;1111 1161 11B6;D31B;1111 1161 11B6;
+D31C;D31C;1111 1161 11B7;D31C;1111 1161 11B7;
+D31D;D31D;1111 1161 11B8;D31D;1111 1161 11B8;
+D31E;D31E;1111 1161 11B9;D31E;1111 1161 11B9;
+D31F;D31F;1111 1161 11BA;D31F;1111 1161 11BA;
+D320;D320;1111 1161 11BB;D320;1111 1161 11BB;
+D321;D321;1111 1161 11BC;D321;1111 1161 11BC;
+D322;D322;1111 1161 11BD;D322;1111 1161 11BD;
+D323;D323;1111 1161 11BE;D323;1111 1161 11BE;
+D324;D324;1111 1161 11BF;D324;1111 1161 11BF;
+D325;D325;1111 1161 11C0;D325;1111 1161 11C0;
+D326;D326;1111 1161 11C1;D326;1111 1161 11C1;
+D327;D327;1111 1161 11C2;D327;1111 1161 11C2;
+D328;D328;1111 1162;D328;1111 1162;
+D329;D329;1111 1162 11A8;D329;1111 1162 11A8;
+D32A;D32A;1111 1162 11A9;D32A;1111 1162 11A9;
+D32B;D32B;1111 1162 11AA;D32B;1111 1162 11AA;
+D32C;D32C;1111 1162 11AB;D32C;1111 1162 11AB;
+D32D;D32D;1111 1162 11AC;D32D;1111 1162 11AC;
+D32E;D32E;1111 1162 11AD;D32E;1111 1162 11AD;
+D32F;D32F;1111 1162 11AE;D32F;1111 1162 11AE;
+D330;D330;1111 1162 11AF;D330;1111 1162 11AF;
+D331;D331;1111 1162 11B0;D331;1111 1162 11B0;
+D332;D332;1111 1162 11B1;D332;1111 1162 11B1;
+D333;D333;1111 1162 11B2;D333;1111 1162 11B2;
+D334;D334;1111 1162 11B3;D334;1111 1162 11B3;
+D335;D335;1111 1162 11B4;D335;1111 1162 11B4;
+D336;D336;1111 1162 11B5;D336;1111 1162 11B5;
+D337;D337;1111 1162 11B6;D337;1111 1162 11B6;
+D338;D338;1111 1162 11B7;D338;1111 1162 11B7;
+D339;D339;1111 1162 11B8;D339;1111 1162 11B8;
+D33A;D33A;1111 1162 11B9;D33A;1111 1162 11B9;
+D33B;D33B;1111 1162 11BA;D33B;1111 1162 11BA;
+D33C;D33C;1111 1162 11BB;D33C;1111 1162 11BB;
+D33D;D33D;1111 1162 11BC;D33D;1111 1162 11BC;
+D33E;D33E;1111 1162 11BD;D33E;1111 1162 11BD;
+D33F;D33F;1111 1162 11BE;D33F;1111 1162 11BE;
+D340;D340;1111 1162 11BF;D340;1111 1162 11BF;
+D341;D341;1111 1162 11C0;D341;1111 1162 11C0;
+D342;D342;1111 1162 11C1;D342;1111 1162 11C1;
+D343;D343;1111 1162 11C2;D343;1111 1162 11C2;
+D344;D344;1111 1163;D344;1111 1163;
+D345;D345;1111 1163 11A8;D345;1111 1163 11A8;
+D346;D346;1111 1163 11A9;D346;1111 1163 11A9;
+D347;D347;1111 1163 11AA;D347;1111 1163 11AA;
+D348;D348;1111 1163 11AB;D348;1111 1163 11AB;
+D349;D349;1111 1163 11AC;D349;1111 1163 11AC;
+D34A;D34A;1111 1163 11AD;D34A;1111 1163 11AD;
+D34B;D34B;1111 1163 11AE;D34B;1111 1163 11AE;
+D34C;D34C;1111 1163 11AF;D34C;1111 1163 11AF;
+D34D;D34D;1111 1163 11B0;D34D;1111 1163 11B0;
+D34E;D34E;1111 1163 11B1;D34E;1111 1163 11B1;
+D34F;D34F;1111 1163 11B2;D34F;1111 1163 11B2;
+D350;D350;1111 1163 11B3;D350;1111 1163 11B3;
+D351;D351;1111 1163 11B4;D351;1111 1163 11B4;
+D352;D352;1111 1163 11B5;D352;1111 1163 11B5;
+D353;D353;1111 1163 11B6;D353;1111 1163 11B6;
+D354;D354;1111 1163 11B7;D354;1111 1163 11B7;
+D355;D355;1111 1163 11B8;D355;1111 1163 11B8;
+D356;D356;1111 1163 11B9;D356;1111 1163 11B9;
+D357;D357;1111 1163 11BA;D357;1111 1163 11BA;
+D358;D358;1111 1163 11BB;D358;1111 1163 11BB;
+D359;D359;1111 1163 11BC;D359;1111 1163 11BC;
+D35A;D35A;1111 1163 11BD;D35A;1111 1163 11BD;
+D35B;D35B;1111 1163 11BE;D35B;1111 1163 11BE;
+D35C;D35C;1111 1163 11BF;D35C;1111 1163 11BF;
+D35D;D35D;1111 1163 11C0;D35D;1111 1163 11C0;
+D35E;D35E;1111 1163 11C1;D35E;1111 1163 11C1;
+D35F;D35F;1111 1163 11C2;D35F;1111 1163 11C2;
+D360;D360;1111 1164;D360;1111 1164;
+D361;D361;1111 1164 11A8;D361;1111 1164 11A8;
+D362;D362;1111 1164 11A9;D362;1111 1164 11A9;
+D363;D363;1111 1164 11AA;D363;1111 1164 11AA;
+D364;D364;1111 1164 11AB;D364;1111 1164 11AB;
+D365;D365;1111 1164 11AC;D365;1111 1164 11AC;
+D366;D366;1111 1164 11AD;D366;1111 1164 11AD;
+D367;D367;1111 1164 11AE;D367;1111 1164 11AE;
+D368;D368;1111 1164 11AF;D368;1111 1164 11AF;
+D369;D369;1111 1164 11B0;D369;1111 1164 11B0;
+D36A;D36A;1111 1164 11B1;D36A;1111 1164 11B1;
+D36B;D36B;1111 1164 11B2;D36B;1111 1164 11B2;
+D36C;D36C;1111 1164 11B3;D36C;1111 1164 11B3;
+D36D;D36D;1111 1164 11B4;D36D;1111 1164 11B4;
+D36E;D36E;1111 1164 11B5;D36E;1111 1164 11B5;
+D36F;D36F;1111 1164 11B6;D36F;1111 1164 11B6;
+D370;D370;1111 1164 11B7;D370;1111 1164 11B7;
+D371;D371;1111 1164 11B8;D371;1111 1164 11B8;
+D372;D372;1111 1164 11B9;D372;1111 1164 11B9;
+D373;D373;1111 1164 11BA;D373;1111 1164 11BA;
+D374;D374;1111 1164 11BB;D374;1111 1164 11BB;
+D375;D375;1111 1164 11BC;D375;1111 1164 11BC;
+D376;D376;1111 1164 11BD;D376;1111 1164 11BD;
+D377;D377;1111 1164 11BE;D377;1111 1164 11BE;
+D378;D378;1111 1164 11BF;D378;1111 1164 11BF;
+D379;D379;1111 1164 11C0;D379;1111 1164 11C0;
+D37A;D37A;1111 1164 11C1;D37A;1111 1164 11C1;
+D37B;D37B;1111 1164 11C2;D37B;1111 1164 11C2;
+D37C;D37C;1111 1165;D37C;1111 1165;
+D37D;D37D;1111 1165 11A8;D37D;1111 1165 11A8;
+D37E;D37E;1111 1165 11A9;D37E;1111 1165 11A9;
+D37F;D37F;1111 1165 11AA;D37F;1111 1165 11AA;
+D380;D380;1111 1165 11AB;D380;1111 1165 11AB;
+D381;D381;1111 1165 11AC;D381;1111 1165 11AC;
+D382;D382;1111 1165 11AD;D382;1111 1165 11AD;
+D383;D383;1111 1165 11AE;D383;1111 1165 11AE;
+D384;D384;1111 1165 11AF;D384;1111 1165 11AF;
+D385;D385;1111 1165 11B0;D385;1111 1165 11B0;
+D386;D386;1111 1165 11B1;D386;1111 1165 11B1;
+D387;D387;1111 1165 11B2;D387;1111 1165 11B2;
+D388;D388;1111 1165 11B3;D388;1111 1165 11B3;
+D389;D389;1111 1165 11B4;D389;1111 1165 11B4;
+D38A;D38A;1111 1165 11B5;D38A;1111 1165 11B5;
+D38B;D38B;1111 1165 11B6;D38B;1111 1165 11B6;
+D38C;D38C;1111 1165 11B7;D38C;1111 1165 11B7;
+D38D;D38D;1111 1165 11B8;D38D;1111 1165 11B8;
+D38E;D38E;1111 1165 11B9;D38E;1111 1165 11B9;
+D38F;D38F;1111 1165 11BA;D38F;1111 1165 11BA;
+D390;D390;1111 1165 11BB;D390;1111 1165 11BB;
+D391;D391;1111 1165 11BC;D391;1111 1165 11BC;
+D392;D392;1111 1165 11BD;D392;1111 1165 11BD;
+D393;D393;1111 1165 11BE;D393;1111 1165 11BE;
+D394;D394;1111 1165 11BF;D394;1111 1165 11BF;
+D395;D395;1111 1165 11C0;D395;1111 1165 11C0;
+D396;D396;1111 1165 11C1;D396;1111 1165 11C1;
+D397;D397;1111 1165 11C2;D397;1111 1165 11C2;
+D398;D398;1111 1166;D398;1111 1166;
+D399;D399;1111 1166 11A8;D399;1111 1166 11A8;
+D39A;D39A;1111 1166 11A9;D39A;1111 1166 11A9;
+D39B;D39B;1111 1166 11AA;D39B;1111 1166 11AA;
+D39C;D39C;1111 1166 11AB;D39C;1111 1166 11AB;
+D39D;D39D;1111 1166 11AC;D39D;1111 1166 11AC;
+D39E;D39E;1111 1166 11AD;D39E;1111 1166 11AD;
+D39F;D39F;1111 1166 11AE;D39F;1111 1166 11AE;
+D3A0;D3A0;1111 1166 11AF;D3A0;1111 1166 11AF;
+D3A1;D3A1;1111 1166 11B0;D3A1;1111 1166 11B0;
+D3A2;D3A2;1111 1166 11B1;D3A2;1111 1166 11B1;
+D3A3;D3A3;1111 1166 11B2;D3A3;1111 1166 11B2;
+D3A4;D3A4;1111 1166 11B3;D3A4;1111 1166 11B3;
+D3A5;D3A5;1111 1166 11B4;D3A5;1111 1166 11B4;
+D3A6;D3A6;1111 1166 11B5;D3A6;1111 1166 11B5;
+D3A7;D3A7;1111 1166 11B6;D3A7;1111 1166 11B6;
+D3A8;D3A8;1111 1166 11B7;D3A8;1111 1166 11B7;
+D3A9;D3A9;1111 1166 11B8;D3A9;1111 1166 11B8;
+D3AA;D3AA;1111 1166 11B9;D3AA;1111 1166 11B9;
+D3AB;D3AB;1111 1166 11BA;D3AB;1111 1166 11BA;
+D3AC;D3AC;1111 1166 11BB;D3AC;1111 1166 11BB;
+D3AD;D3AD;1111 1166 11BC;D3AD;1111 1166 11BC;
+D3AE;D3AE;1111 1166 11BD;D3AE;1111 1166 11BD;
+D3AF;D3AF;1111 1166 11BE;D3AF;1111 1166 11BE;
+D3B0;D3B0;1111 1166 11BF;D3B0;1111 1166 11BF;
+D3B1;D3B1;1111 1166 11C0;D3B1;1111 1166 11C0;
+D3B2;D3B2;1111 1166 11C1;D3B2;1111 1166 11C1;
+D3B3;D3B3;1111 1166 11C2;D3B3;1111 1166 11C2;
+D3B4;D3B4;1111 1167;D3B4;1111 1167;
+D3B5;D3B5;1111 1167 11A8;D3B5;1111 1167 11A8;
+D3B6;D3B6;1111 1167 11A9;D3B6;1111 1167 11A9;
+D3B7;D3B7;1111 1167 11AA;D3B7;1111 1167 11AA;
+D3B8;D3B8;1111 1167 11AB;D3B8;1111 1167 11AB;
+D3B9;D3B9;1111 1167 11AC;D3B9;1111 1167 11AC;
+D3BA;D3BA;1111 1167 11AD;D3BA;1111 1167 11AD;
+D3BB;D3BB;1111 1167 11AE;D3BB;1111 1167 11AE;
+D3BC;D3BC;1111 1167 11AF;D3BC;1111 1167 11AF;
+D3BD;D3BD;1111 1167 11B0;D3BD;1111 1167 11B0;
+D3BE;D3BE;1111 1167 11B1;D3BE;1111 1167 11B1;
+D3BF;D3BF;1111 1167 11B2;D3BF;1111 1167 11B2;
+D3C0;D3C0;1111 1167 11B3;D3C0;1111 1167 11B3;
+D3C1;D3C1;1111 1167 11B4;D3C1;1111 1167 11B4;
+D3C2;D3C2;1111 1167 11B5;D3C2;1111 1167 11B5;
+D3C3;D3C3;1111 1167 11B6;D3C3;1111 1167 11B6;
+D3C4;D3C4;1111 1167 11B7;D3C4;1111 1167 11B7;
+D3C5;D3C5;1111 1167 11B8;D3C5;1111 1167 11B8;
+D3C6;D3C6;1111 1167 11B9;D3C6;1111 1167 11B9;
+D3C7;D3C7;1111 1167 11BA;D3C7;1111 1167 11BA;
+D3C8;D3C8;1111 1167 11BB;D3C8;1111 1167 11BB;
+D3C9;D3C9;1111 1167 11BC;D3C9;1111 1167 11BC;
+D3CA;D3CA;1111 1167 11BD;D3CA;1111 1167 11BD;
+D3CB;D3CB;1111 1167 11BE;D3CB;1111 1167 11BE;
+D3CC;D3CC;1111 1167 11BF;D3CC;1111 1167 11BF;
+D3CD;D3CD;1111 1167 11C0;D3CD;1111 1167 11C0;
+D3CE;D3CE;1111 1167 11C1;D3CE;1111 1167 11C1;
+D3CF;D3CF;1111 1167 11C2;D3CF;1111 1167 11C2;
+D3D0;D3D0;1111 1168;D3D0;1111 1168;
+D3D1;D3D1;1111 1168 11A8;D3D1;1111 1168 11A8;
+D3D2;D3D2;1111 1168 11A9;D3D2;1111 1168 11A9;
+D3D3;D3D3;1111 1168 11AA;D3D3;1111 1168 11AA;
+D3D4;D3D4;1111 1168 11AB;D3D4;1111 1168 11AB;
+D3D5;D3D5;1111 1168 11AC;D3D5;1111 1168 11AC;
+D3D6;D3D6;1111 1168 11AD;D3D6;1111 1168 11AD;
+D3D7;D3D7;1111 1168 11AE;D3D7;1111 1168 11AE;
+D3D8;D3D8;1111 1168 11AF;D3D8;1111 1168 11AF;
+D3D9;D3D9;1111 1168 11B0;D3D9;1111 1168 11B0;
+D3DA;D3DA;1111 1168 11B1;D3DA;1111 1168 11B1;
+D3DB;D3DB;1111 1168 11B2;D3DB;1111 1168 11B2;
+D3DC;D3DC;1111 1168 11B3;D3DC;1111 1168 11B3;
+D3DD;D3DD;1111 1168 11B4;D3DD;1111 1168 11B4;
+D3DE;D3DE;1111 1168 11B5;D3DE;1111 1168 11B5;
+D3DF;D3DF;1111 1168 11B6;D3DF;1111 1168 11B6;
+D3E0;D3E0;1111 1168 11B7;D3E0;1111 1168 11B7;
+D3E1;D3E1;1111 1168 11B8;D3E1;1111 1168 11B8;
+D3E2;D3E2;1111 1168 11B9;D3E2;1111 1168 11B9;
+D3E3;D3E3;1111 1168 11BA;D3E3;1111 1168 11BA;
+D3E4;D3E4;1111 1168 11BB;D3E4;1111 1168 11BB;
+D3E5;D3E5;1111 1168 11BC;D3E5;1111 1168 11BC;
+D3E6;D3E6;1111 1168 11BD;D3E6;1111 1168 11BD;
+D3E7;D3E7;1111 1168 11BE;D3E7;1111 1168 11BE;
+D3E8;D3E8;1111 1168 11BF;D3E8;1111 1168 11BF;
+D3E9;D3E9;1111 1168 11C0;D3E9;1111 1168 11C0;
+D3EA;D3EA;1111 1168 11C1;D3EA;1111 1168 11C1;
+D3EB;D3EB;1111 1168 11C2;D3EB;1111 1168 11C2;
+D3EC;D3EC;1111 1169;D3EC;1111 1169;
+D3ED;D3ED;1111 1169 11A8;D3ED;1111 1169 11A8;
+D3EE;D3EE;1111 1169 11A9;D3EE;1111 1169 11A9;
+D3EF;D3EF;1111 1169 11AA;D3EF;1111 1169 11AA;
+D3F0;D3F0;1111 1169 11AB;D3F0;1111 1169 11AB;
+D3F1;D3F1;1111 1169 11AC;D3F1;1111 1169 11AC;
+D3F2;D3F2;1111 1169 11AD;D3F2;1111 1169 11AD;
+D3F3;D3F3;1111 1169 11AE;D3F3;1111 1169 11AE;
+D3F4;D3F4;1111 1169 11AF;D3F4;1111 1169 11AF;
+D3F5;D3F5;1111 1169 11B0;D3F5;1111 1169 11B0;
+D3F6;D3F6;1111 1169 11B1;D3F6;1111 1169 11B1;
+D3F7;D3F7;1111 1169 11B2;D3F7;1111 1169 11B2;
+D3F8;D3F8;1111 1169 11B3;D3F8;1111 1169 11B3;
+D3F9;D3F9;1111 1169 11B4;D3F9;1111 1169 11B4;
+D3FA;D3FA;1111 1169 11B5;D3FA;1111 1169 11B5;
+D3FB;D3FB;1111 1169 11B6;D3FB;1111 1169 11B6;
+D3FC;D3FC;1111 1169 11B7;D3FC;1111 1169 11B7;
+D3FD;D3FD;1111 1169 11B8;D3FD;1111 1169 11B8;
+D3FE;D3FE;1111 1169 11B9;D3FE;1111 1169 11B9;
+D3FF;D3FF;1111 1169 11BA;D3FF;1111 1169 11BA;
+D400;D400;1111 1169 11BB;D400;1111 1169 11BB;
+D401;D401;1111 1169 11BC;D401;1111 1169 11BC;
+D402;D402;1111 1169 11BD;D402;1111 1169 11BD;
+D403;D403;1111 1169 11BE;D403;1111 1169 11BE;
+D404;D404;1111 1169 11BF;D404;1111 1169 11BF;
+D405;D405;1111 1169 11C0;D405;1111 1169 11C0;
+D406;D406;1111 1169 11C1;D406;1111 1169 11C1;
+D407;D407;1111 1169 11C2;D407;1111 1169 11C2;
+D408;D408;1111 116A;D408;1111 116A;
+D409;D409;1111 116A 11A8;D409;1111 116A 11A8;
+D40A;D40A;1111 116A 11A9;D40A;1111 116A 11A9;
+D40B;D40B;1111 116A 11AA;D40B;1111 116A 11AA;
+D40C;D40C;1111 116A 11AB;D40C;1111 116A 11AB;
+D40D;D40D;1111 116A 11AC;D40D;1111 116A 11AC;
+D40E;D40E;1111 116A 11AD;D40E;1111 116A 11AD;
+D40F;D40F;1111 116A 11AE;D40F;1111 116A 11AE;
+D410;D410;1111 116A 11AF;D410;1111 116A 11AF;
+D411;D411;1111 116A 11B0;D411;1111 116A 11B0;
+D412;D412;1111 116A 11B1;D412;1111 116A 11B1;
+D413;D413;1111 116A 11B2;D413;1111 116A 11B2;
+D414;D414;1111 116A 11B3;D414;1111 116A 11B3;
+D415;D415;1111 116A 11B4;D415;1111 116A 11B4;
+D416;D416;1111 116A 11B5;D416;1111 116A 11B5;
+D417;D417;1111 116A 11B6;D417;1111 116A 11B6;
+D418;D418;1111 116A 11B7;D418;1111 116A 11B7;
+D419;D419;1111 116A 11B8;D419;1111 116A 11B8;
+D41A;D41A;1111 116A 11B9;D41A;1111 116A 11B9;
+D41B;D41B;1111 116A 11BA;D41B;1111 116A 11BA;
+D41C;D41C;1111 116A 11BB;D41C;1111 116A 11BB;
+D41D;D41D;1111 116A 11BC;D41D;1111 116A 11BC;
+D41E;D41E;1111 116A 11BD;D41E;1111 116A 11BD;
+D41F;D41F;1111 116A 11BE;D41F;1111 116A 11BE;
+D420;D420;1111 116A 11BF;D420;1111 116A 11BF;
+D421;D421;1111 116A 11C0;D421;1111 116A 11C0;
+D422;D422;1111 116A 11C1;D422;1111 116A 11C1;
+D423;D423;1111 116A 11C2;D423;1111 116A 11C2;
+D424;D424;1111 116B;D424;1111 116B;
+D425;D425;1111 116B 11A8;D425;1111 116B 11A8;
+D426;D426;1111 116B 11A9;D426;1111 116B 11A9;
+D427;D427;1111 116B 11AA;D427;1111 116B 11AA;
+D428;D428;1111 116B 11AB;D428;1111 116B 11AB;
+D429;D429;1111 116B 11AC;D429;1111 116B 11AC;
+D42A;D42A;1111 116B 11AD;D42A;1111 116B 11AD;
+D42B;D42B;1111 116B 11AE;D42B;1111 116B 11AE;
+D42C;D42C;1111 116B 11AF;D42C;1111 116B 11AF;
+D42D;D42D;1111 116B 11B0;D42D;1111 116B 11B0;
+D42E;D42E;1111 116B 11B1;D42E;1111 116B 11B1;
+D42F;D42F;1111 116B 11B2;D42F;1111 116B 11B2;
+D430;D430;1111 116B 11B3;D430;1111 116B 11B3;
+D431;D431;1111 116B 11B4;D431;1111 116B 11B4;
+D432;D432;1111 116B 11B5;D432;1111 116B 11B5;
+D433;D433;1111 116B 11B6;D433;1111 116B 11B6;
+D434;D434;1111 116B 11B7;D434;1111 116B 11B7;
+D435;D435;1111 116B 11B8;D435;1111 116B 11B8;
+D436;D436;1111 116B 11B9;D436;1111 116B 11B9;
+D437;D437;1111 116B 11BA;D437;1111 116B 11BA;
+D438;D438;1111 116B 11BB;D438;1111 116B 11BB;
+D439;D439;1111 116B 11BC;D439;1111 116B 11BC;
+D43A;D43A;1111 116B 11BD;D43A;1111 116B 11BD;
+D43B;D43B;1111 116B 11BE;D43B;1111 116B 11BE;
+D43C;D43C;1111 116B 11BF;D43C;1111 116B 11BF;
+D43D;D43D;1111 116B 11C0;D43D;1111 116B 11C0;
+D43E;D43E;1111 116B 11C1;D43E;1111 116B 11C1;
+D43F;D43F;1111 116B 11C2;D43F;1111 116B 11C2;
+D440;D440;1111 116C;D440;1111 116C;
+D441;D441;1111 116C 11A8;D441;1111 116C 11A8;
+D442;D442;1111 116C 11A9;D442;1111 116C 11A9;
+D443;D443;1111 116C 11AA;D443;1111 116C 11AA;
+D444;D444;1111 116C 11AB;D444;1111 116C 11AB;
+D445;D445;1111 116C 11AC;D445;1111 116C 11AC;
+D446;D446;1111 116C 11AD;D446;1111 116C 11AD;
+D447;D447;1111 116C 11AE;D447;1111 116C 11AE;
+D448;D448;1111 116C 11AF;D448;1111 116C 11AF;
+D449;D449;1111 116C 11B0;D449;1111 116C 11B0;
+D44A;D44A;1111 116C 11B1;D44A;1111 116C 11B1;
+D44B;D44B;1111 116C 11B2;D44B;1111 116C 11B2;
+D44C;D44C;1111 116C 11B3;D44C;1111 116C 11B3;
+D44D;D44D;1111 116C 11B4;D44D;1111 116C 11B4;
+D44E;D44E;1111 116C 11B5;D44E;1111 116C 11B5;
+D44F;D44F;1111 116C 11B6;D44F;1111 116C 11B6;
+D450;D450;1111 116C 11B7;D450;1111 116C 11B7;
+D451;D451;1111 116C 11B8;D451;1111 116C 11B8;
+D452;D452;1111 116C 11B9;D452;1111 116C 11B9;
+D453;D453;1111 116C 11BA;D453;1111 116C 11BA;
+D454;D454;1111 116C 11BB;D454;1111 116C 11BB;
+D455;D455;1111 116C 11BC;D455;1111 116C 11BC;
+D456;D456;1111 116C 11BD;D456;1111 116C 11BD;
+D457;D457;1111 116C 11BE;D457;1111 116C 11BE;
+D458;D458;1111 116C 11BF;D458;1111 116C 11BF;
+D459;D459;1111 116C 11C0;D459;1111 116C 11C0;
+D45A;D45A;1111 116C 11C1;D45A;1111 116C 11C1;
+D45B;D45B;1111 116C 11C2;D45B;1111 116C 11C2;
+D45C;D45C;1111 116D;D45C;1111 116D;
+D45D;D45D;1111 116D 11A8;D45D;1111 116D 11A8;
+D45E;D45E;1111 116D 11A9;D45E;1111 116D 11A9;
+D45F;D45F;1111 116D 11AA;D45F;1111 116D 11AA;
+D460;D460;1111 116D 11AB;D460;1111 116D 11AB;
+D461;D461;1111 116D 11AC;D461;1111 116D 11AC;
+D462;D462;1111 116D 11AD;D462;1111 116D 11AD;
+D463;D463;1111 116D 11AE;D463;1111 116D 11AE;
+D464;D464;1111 116D 11AF;D464;1111 116D 11AF;
+D465;D465;1111 116D 11B0;D465;1111 116D 11B0;
+D466;D466;1111 116D 11B1;D466;1111 116D 11B1;
+D467;D467;1111 116D 11B2;D467;1111 116D 11B2;
+D468;D468;1111 116D 11B3;D468;1111 116D 11B3;
+D469;D469;1111 116D 11B4;D469;1111 116D 11B4;
+D46A;D46A;1111 116D 11B5;D46A;1111 116D 11B5;
+D46B;D46B;1111 116D 11B6;D46B;1111 116D 11B6;
+D46C;D46C;1111 116D 11B7;D46C;1111 116D 11B7;
+D46D;D46D;1111 116D 11B8;D46D;1111 116D 11B8;
+D46E;D46E;1111 116D 11B9;D46E;1111 116D 11B9;
+D46F;D46F;1111 116D 11BA;D46F;1111 116D 11BA;
+D470;D470;1111 116D 11BB;D470;1111 116D 11BB;
+D471;D471;1111 116D 11BC;D471;1111 116D 11BC;
+D472;D472;1111 116D 11BD;D472;1111 116D 11BD;
+D473;D473;1111 116D 11BE;D473;1111 116D 11BE;
+D474;D474;1111 116D 11BF;D474;1111 116D 11BF;
+D475;D475;1111 116D 11C0;D475;1111 116D 11C0;
+D476;D476;1111 116D 11C1;D476;1111 116D 11C1;
+D477;D477;1111 116D 11C2;D477;1111 116D 11C2;
+D478;D478;1111 116E;D478;1111 116E;
+D479;D479;1111 116E 11A8;D479;1111 116E 11A8;
+D47A;D47A;1111 116E 11A9;D47A;1111 116E 11A9;
+D47B;D47B;1111 116E 11AA;D47B;1111 116E 11AA;
+D47C;D47C;1111 116E 11AB;D47C;1111 116E 11AB;
+D47D;D47D;1111 116E 11AC;D47D;1111 116E 11AC;
+D47E;D47E;1111 116E 11AD;D47E;1111 116E 11AD;
+D47F;D47F;1111 116E 11AE;D47F;1111 116E 11AE;
+D480;D480;1111 116E 11AF;D480;1111 116E 11AF;
+D481;D481;1111 116E 11B0;D481;1111 116E 11B0;
+D482;D482;1111 116E 11B1;D482;1111 116E 11B1;
+D483;D483;1111 116E 11B2;D483;1111 116E 11B2;
+D484;D484;1111 116E 11B3;D484;1111 116E 11B3;
+D485;D485;1111 116E 11B4;D485;1111 116E 11B4;
+D486;D486;1111 116E 11B5;D486;1111 116E 11B5;
+D487;D487;1111 116E 11B6;D487;1111 116E 11B6;
+D488;D488;1111 116E 11B7;D488;1111 116E 11B7;
+D489;D489;1111 116E 11B8;D489;1111 116E 11B8;
+D48A;D48A;1111 116E 11B9;D48A;1111 116E 11B9;
+D48B;D48B;1111 116E 11BA;D48B;1111 116E 11BA;
+D48C;D48C;1111 116E 11BB;D48C;1111 116E 11BB;
+D48D;D48D;1111 116E 11BC;D48D;1111 116E 11BC;
+D48E;D48E;1111 116E 11BD;D48E;1111 116E 11BD;
+D48F;D48F;1111 116E 11BE;D48F;1111 116E 11BE;
+D490;D490;1111 116E 11BF;D490;1111 116E 11BF;
+D491;D491;1111 116E 11C0;D491;1111 116E 11C0;
+D492;D492;1111 116E 11C1;D492;1111 116E 11C1;
+D493;D493;1111 116E 11C2;D493;1111 116E 11C2;
+D494;D494;1111 116F;D494;1111 116F;
+D495;D495;1111 116F 11A8;D495;1111 116F 11A8;
+D496;D496;1111 116F 11A9;D496;1111 116F 11A9;
+D497;D497;1111 116F 11AA;D497;1111 116F 11AA;
+D498;D498;1111 116F 11AB;D498;1111 116F 11AB;
+D499;D499;1111 116F 11AC;D499;1111 116F 11AC;
+D49A;D49A;1111 116F 11AD;D49A;1111 116F 11AD;
+D49B;D49B;1111 116F 11AE;D49B;1111 116F 11AE;
+D49C;D49C;1111 116F 11AF;D49C;1111 116F 11AF;
+D49D;D49D;1111 116F 11B0;D49D;1111 116F 11B0;
+D49E;D49E;1111 116F 11B1;D49E;1111 116F 11B1;
+D49F;D49F;1111 116F 11B2;D49F;1111 116F 11B2;
+D4A0;D4A0;1111 116F 11B3;D4A0;1111 116F 11B3;
+D4A1;D4A1;1111 116F 11B4;D4A1;1111 116F 11B4;
+D4A2;D4A2;1111 116F 11B5;D4A2;1111 116F 11B5;
+D4A3;D4A3;1111 116F 11B6;D4A3;1111 116F 11B6;
+D4A4;D4A4;1111 116F 11B7;D4A4;1111 116F 11B7;
+D4A5;D4A5;1111 116F 11B8;D4A5;1111 116F 11B8;
+D4A6;D4A6;1111 116F 11B9;D4A6;1111 116F 11B9;
+D4A7;D4A7;1111 116F 11BA;D4A7;1111 116F 11BA;
+D4A8;D4A8;1111 116F 11BB;D4A8;1111 116F 11BB;
+D4A9;D4A9;1111 116F 11BC;D4A9;1111 116F 11BC;
+D4AA;D4AA;1111 116F 11BD;D4AA;1111 116F 11BD;
+D4AB;D4AB;1111 116F 11BE;D4AB;1111 116F 11BE;
+D4AC;D4AC;1111 116F 11BF;D4AC;1111 116F 11BF;
+D4AD;D4AD;1111 116F 11C0;D4AD;1111 116F 11C0;
+D4AE;D4AE;1111 116F 11C1;D4AE;1111 116F 11C1;
+D4AF;D4AF;1111 116F 11C2;D4AF;1111 116F 11C2;
+D4B0;D4B0;1111 1170;D4B0;1111 1170;
+D4B1;D4B1;1111 1170 11A8;D4B1;1111 1170 11A8;
+D4B2;D4B2;1111 1170 11A9;D4B2;1111 1170 11A9;
+D4B3;D4B3;1111 1170 11AA;D4B3;1111 1170 11AA;
+D4B4;D4B4;1111 1170 11AB;D4B4;1111 1170 11AB;
+D4B5;D4B5;1111 1170 11AC;D4B5;1111 1170 11AC;
+D4B6;D4B6;1111 1170 11AD;D4B6;1111 1170 11AD;
+D4B7;D4B7;1111 1170 11AE;D4B7;1111 1170 11AE;
+D4B8;D4B8;1111 1170 11AF;D4B8;1111 1170 11AF;
+D4B9;D4B9;1111 1170 11B0;D4B9;1111 1170 11B0;
+D4BA;D4BA;1111 1170 11B1;D4BA;1111 1170 11B1;
+D4BB;D4BB;1111 1170 11B2;D4BB;1111 1170 11B2;
+D4BC;D4BC;1111 1170 11B3;D4BC;1111 1170 11B3;
+D4BD;D4BD;1111 1170 11B4;D4BD;1111 1170 11B4;
+D4BE;D4BE;1111 1170 11B5;D4BE;1111 1170 11B5;
+D4BF;D4BF;1111 1170 11B6;D4BF;1111 1170 11B6;
+D4C0;D4C0;1111 1170 11B7;D4C0;1111 1170 11B7;
+D4C1;D4C1;1111 1170 11B8;D4C1;1111 1170 11B8;
+D4C2;D4C2;1111 1170 11B9;D4C2;1111 1170 11B9;
+D4C3;D4C3;1111 1170 11BA;D4C3;1111 1170 11BA;
+D4C4;D4C4;1111 1170 11BB;D4C4;1111 1170 11BB;
+D4C5;D4C5;1111 1170 11BC;D4C5;1111 1170 11BC;
+D4C6;D4C6;1111 1170 11BD;D4C6;1111 1170 11BD;
+D4C7;D4C7;1111 1170 11BE;D4C7;1111 1170 11BE;
+D4C8;D4C8;1111 1170 11BF;D4C8;1111 1170 11BF;
+D4C9;D4C9;1111 1170 11C0;D4C9;1111 1170 11C0;
+D4CA;D4CA;1111 1170 11C1;D4CA;1111 1170 11C1;
+D4CB;D4CB;1111 1170 11C2;D4CB;1111 1170 11C2;
+D4CC;D4CC;1111 1171;D4CC;1111 1171;
+D4CD;D4CD;1111 1171 11A8;D4CD;1111 1171 11A8;
+D4CE;D4CE;1111 1171 11A9;D4CE;1111 1171 11A9;
+D4CF;D4CF;1111 1171 11AA;D4CF;1111 1171 11AA;
+D4D0;D4D0;1111 1171 11AB;D4D0;1111 1171 11AB;
+D4D1;D4D1;1111 1171 11AC;D4D1;1111 1171 11AC;
+D4D2;D4D2;1111 1171 11AD;D4D2;1111 1171 11AD;
+D4D3;D4D3;1111 1171 11AE;D4D3;1111 1171 11AE;
+D4D4;D4D4;1111 1171 11AF;D4D4;1111 1171 11AF;
+D4D5;D4D5;1111 1171 11B0;D4D5;1111 1171 11B0;
+D4D6;D4D6;1111 1171 11B1;D4D6;1111 1171 11B1;
+D4D7;D4D7;1111 1171 11B2;D4D7;1111 1171 11B2;
+D4D8;D4D8;1111 1171 11B3;D4D8;1111 1171 11B3;
+D4D9;D4D9;1111 1171 11B4;D4D9;1111 1171 11B4;
+D4DA;D4DA;1111 1171 11B5;D4DA;1111 1171 11B5;
+D4DB;D4DB;1111 1171 11B6;D4DB;1111 1171 11B6;
+D4DC;D4DC;1111 1171 11B7;D4DC;1111 1171 11B7;
+D4DD;D4DD;1111 1171 11B8;D4DD;1111 1171 11B8;
+D4DE;D4DE;1111 1171 11B9;D4DE;1111 1171 11B9;
+D4DF;D4DF;1111 1171 11BA;D4DF;1111 1171 11BA;
+D4E0;D4E0;1111 1171 11BB;D4E0;1111 1171 11BB;
+D4E1;D4E1;1111 1171 11BC;D4E1;1111 1171 11BC;
+D4E2;D4E2;1111 1171 11BD;D4E2;1111 1171 11BD;
+D4E3;D4E3;1111 1171 11BE;D4E3;1111 1171 11BE;
+D4E4;D4E4;1111 1171 11BF;D4E4;1111 1171 11BF;
+D4E5;D4E5;1111 1171 11C0;D4E5;1111 1171 11C0;
+D4E6;D4E6;1111 1171 11C1;D4E6;1111 1171 11C1;
+D4E7;D4E7;1111 1171 11C2;D4E7;1111 1171 11C2;
+D4E8;D4E8;1111 1172;D4E8;1111 1172;
+D4E9;D4E9;1111 1172 11A8;D4E9;1111 1172 11A8;
+D4EA;D4EA;1111 1172 11A9;D4EA;1111 1172 11A9;
+D4EB;D4EB;1111 1172 11AA;D4EB;1111 1172 11AA;
+D4EC;D4EC;1111 1172 11AB;D4EC;1111 1172 11AB;
+D4ED;D4ED;1111 1172 11AC;D4ED;1111 1172 11AC;
+D4EE;D4EE;1111 1172 11AD;D4EE;1111 1172 11AD;
+D4EF;D4EF;1111 1172 11AE;D4EF;1111 1172 11AE;
+D4F0;D4F0;1111 1172 11AF;D4F0;1111 1172 11AF;
+D4F1;D4F1;1111 1172 11B0;D4F1;1111 1172 11B0;
+D4F2;D4F2;1111 1172 11B1;D4F2;1111 1172 11B1;
+D4F3;D4F3;1111 1172 11B2;D4F3;1111 1172 11B2;
+D4F4;D4F4;1111 1172 11B3;D4F4;1111 1172 11B3;
+D4F5;D4F5;1111 1172 11B4;D4F5;1111 1172 11B4;
+D4F6;D4F6;1111 1172 11B5;D4F6;1111 1172 11B5;
+D4F7;D4F7;1111 1172 11B6;D4F7;1111 1172 11B6;
+D4F8;D4F8;1111 1172 11B7;D4F8;1111 1172 11B7;
+D4F9;D4F9;1111 1172 11B8;D4F9;1111 1172 11B8;
+D4FA;D4FA;1111 1172 11B9;D4FA;1111 1172 11B9;
+D4FB;D4FB;1111 1172 11BA;D4FB;1111 1172 11BA;
+D4FC;D4FC;1111 1172 11BB;D4FC;1111 1172 11BB;
+D4FD;D4FD;1111 1172 11BC;D4FD;1111 1172 11BC;
+D4FE;D4FE;1111 1172 11BD;D4FE;1111 1172 11BD;
+D4FF;D4FF;1111 1172 11BE;D4FF;1111 1172 11BE;
+D500;D500;1111 1172 11BF;D500;1111 1172 11BF;
+D501;D501;1111 1172 11C0;D501;1111 1172 11C0;
+D502;D502;1111 1172 11C1;D502;1111 1172 11C1;
+D503;D503;1111 1172 11C2;D503;1111 1172 11C2;
+D504;D504;1111 1173;D504;1111 1173;
+D505;D505;1111 1173 11A8;D505;1111 1173 11A8;
+D506;D506;1111 1173 11A9;D506;1111 1173 11A9;
+D507;D507;1111 1173 11AA;D507;1111 1173 11AA;
+D508;D508;1111 1173 11AB;D508;1111 1173 11AB;
+D509;D509;1111 1173 11AC;D509;1111 1173 11AC;
+D50A;D50A;1111 1173 11AD;D50A;1111 1173 11AD;
+D50B;D50B;1111 1173 11AE;D50B;1111 1173 11AE;
+D50C;D50C;1111 1173 11AF;D50C;1111 1173 11AF;
+D50D;D50D;1111 1173 11B0;D50D;1111 1173 11B0;
+D50E;D50E;1111 1173 11B1;D50E;1111 1173 11B1;
+D50F;D50F;1111 1173 11B2;D50F;1111 1173 11B2;
+D510;D510;1111 1173 11B3;D510;1111 1173 11B3;
+D511;D511;1111 1173 11B4;D511;1111 1173 11B4;
+D512;D512;1111 1173 11B5;D512;1111 1173 11B5;
+D513;D513;1111 1173 11B6;D513;1111 1173 11B6;
+D514;D514;1111 1173 11B7;D514;1111 1173 11B7;
+D515;D515;1111 1173 11B8;D515;1111 1173 11B8;
+D516;D516;1111 1173 11B9;D516;1111 1173 11B9;
+D517;D517;1111 1173 11BA;D517;1111 1173 11BA;
+D518;D518;1111 1173 11BB;D518;1111 1173 11BB;
+D519;D519;1111 1173 11BC;D519;1111 1173 11BC;
+D51A;D51A;1111 1173 11BD;D51A;1111 1173 11BD;
+D51B;D51B;1111 1173 11BE;D51B;1111 1173 11BE;
+D51C;D51C;1111 1173 11BF;D51C;1111 1173 11BF;
+D51D;D51D;1111 1173 11C0;D51D;1111 1173 11C0;
+D51E;D51E;1111 1173 11C1;D51E;1111 1173 11C1;
+D51F;D51F;1111 1173 11C2;D51F;1111 1173 11C2;
+D520;D520;1111 1174;D520;1111 1174;
+D521;D521;1111 1174 11A8;D521;1111 1174 11A8;
+D522;D522;1111 1174 11A9;D522;1111 1174 11A9;
+D523;D523;1111 1174 11AA;D523;1111 1174 11AA;
+D524;D524;1111 1174 11AB;D524;1111 1174 11AB;
+D525;D525;1111 1174 11AC;D525;1111 1174 11AC;
+D526;D526;1111 1174 11AD;D526;1111 1174 11AD;
+D527;D527;1111 1174 11AE;D527;1111 1174 11AE;
+D528;D528;1111 1174 11AF;D528;1111 1174 11AF;
+D529;D529;1111 1174 11B0;D529;1111 1174 11B0;
+D52A;D52A;1111 1174 11B1;D52A;1111 1174 11B1;
+D52B;D52B;1111 1174 11B2;D52B;1111 1174 11B2;
+D52C;D52C;1111 1174 11B3;D52C;1111 1174 11B3;
+D52D;D52D;1111 1174 11B4;D52D;1111 1174 11B4;
+D52E;D52E;1111 1174 11B5;D52E;1111 1174 11B5;
+D52F;D52F;1111 1174 11B6;D52F;1111 1174 11B6;
+D530;D530;1111 1174 11B7;D530;1111 1174 11B7;
+D531;D531;1111 1174 11B8;D531;1111 1174 11B8;
+D532;D532;1111 1174 11B9;D532;1111 1174 11B9;
+D533;D533;1111 1174 11BA;D533;1111 1174 11BA;
+D534;D534;1111 1174 11BB;D534;1111 1174 11BB;
+D535;D535;1111 1174 11BC;D535;1111 1174 11BC;
+D536;D536;1111 1174 11BD;D536;1111 1174 11BD;
+D537;D537;1111 1174 11BE;D537;1111 1174 11BE;
+D538;D538;1111 1174 11BF;D538;1111 1174 11BF;
+D539;D539;1111 1174 11C0;D539;1111 1174 11C0;
+D53A;D53A;1111 1174 11C1;D53A;1111 1174 11C1;
+D53B;D53B;1111 1174 11C2;D53B;1111 1174 11C2;
+D53C;D53C;1111 1175;D53C;1111 1175;
+D53D;D53D;1111 1175 11A8;D53D;1111 1175 11A8;
+D53E;D53E;1111 1175 11A9;D53E;1111 1175 11A9;
+D53F;D53F;1111 1175 11AA;D53F;1111 1175 11AA;
+D540;D540;1111 1175 11AB;D540;1111 1175 11AB;
+D541;D541;1111 1175 11AC;D541;1111 1175 11AC;
+D542;D542;1111 1175 11AD;D542;1111 1175 11AD;
+D543;D543;1111 1175 11AE;D543;1111 1175 11AE;
+D544;D544;1111 1175 11AF;D544;1111 1175 11AF;
+D545;D545;1111 1175 11B0;D545;1111 1175 11B0;
+D546;D546;1111 1175 11B1;D546;1111 1175 11B1;
+D547;D547;1111 1175 11B2;D547;1111 1175 11B2;
+D548;D548;1111 1175 11B3;D548;1111 1175 11B3;
+D549;D549;1111 1175 11B4;D549;1111 1175 11B4;
+D54A;D54A;1111 1175 11B5;D54A;1111 1175 11B5;
+D54B;D54B;1111 1175 11B6;D54B;1111 1175 11B6;
+D54C;D54C;1111 1175 11B7;D54C;1111 1175 11B7;
+D54D;D54D;1111 1175 11B8;D54D;1111 1175 11B8;
+D54E;D54E;1111 1175 11B9;D54E;1111 1175 11B9;
+D54F;D54F;1111 1175 11BA;D54F;1111 1175 11BA;
+D550;D550;1111 1175 11BB;D550;1111 1175 11BB;
+D551;D551;1111 1175 11BC;D551;1111 1175 11BC;
+D552;D552;1111 1175 11BD;D552;1111 1175 11BD;
+D553;D553;1111 1175 11BE;D553;1111 1175 11BE;
+D554;D554;1111 1175 11BF;D554;1111 1175 11BF;
+D555;D555;1111 1175 11C0;D555;1111 1175 11C0;
+D556;D556;1111 1175 11C1;D556;1111 1175 11C1;
+D557;D557;1111 1175 11C2;D557;1111 1175 11C2;
+D558;D558;1112 1161;D558;1112 1161;
+D559;D559;1112 1161 11A8;D559;1112 1161 11A8;
+D55A;D55A;1112 1161 11A9;D55A;1112 1161 11A9;
+D55B;D55B;1112 1161 11AA;D55B;1112 1161 11AA;
+D55C;D55C;1112 1161 11AB;D55C;1112 1161 11AB;
+D55D;D55D;1112 1161 11AC;D55D;1112 1161 11AC;
+D55E;D55E;1112 1161 11AD;D55E;1112 1161 11AD;
+D55F;D55F;1112 1161 11AE;D55F;1112 1161 11AE;
+D560;D560;1112 1161 11AF;D560;1112 1161 11AF;
+D561;D561;1112 1161 11B0;D561;1112 1161 11B0;
+D562;D562;1112 1161 11B1;D562;1112 1161 11B1;
+D563;D563;1112 1161 11B2;D563;1112 1161 11B2;
+D564;D564;1112 1161 11B3;D564;1112 1161 11B3;
+D565;D565;1112 1161 11B4;D565;1112 1161 11B4;
+D566;D566;1112 1161 11B5;D566;1112 1161 11B5;
+D567;D567;1112 1161 11B6;D567;1112 1161 11B6;
+D568;D568;1112 1161 11B7;D568;1112 1161 11B7;
+D569;D569;1112 1161 11B8;D569;1112 1161 11B8;
+D56A;D56A;1112 1161 11B9;D56A;1112 1161 11B9;
+D56B;D56B;1112 1161 11BA;D56B;1112 1161 11BA;
+D56C;D56C;1112 1161 11BB;D56C;1112 1161 11BB;
+D56D;D56D;1112 1161 11BC;D56D;1112 1161 11BC;
+D56E;D56E;1112 1161 11BD;D56E;1112 1161 11BD;
+D56F;D56F;1112 1161 11BE;D56F;1112 1161 11BE;
+D570;D570;1112 1161 11BF;D570;1112 1161 11BF;
+D571;D571;1112 1161 11C0;D571;1112 1161 11C0;
+D572;D572;1112 1161 11C1;D572;1112 1161 11C1;
+D573;D573;1112 1161 11C2;D573;1112 1161 11C2;
+D574;D574;1112 1162;D574;1112 1162;
+D575;D575;1112 1162 11A8;D575;1112 1162 11A8;
+D576;D576;1112 1162 11A9;D576;1112 1162 11A9;
+D577;D577;1112 1162 11AA;D577;1112 1162 11AA;
+D578;D578;1112 1162 11AB;D578;1112 1162 11AB;
+D579;D579;1112 1162 11AC;D579;1112 1162 11AC;
+D57A;D57A;1112 1162 11AD;D57A;1112 1162 11AD;
+D57B;D57B;1112 1162 11AE;D57B;1112 1162 11AE;
+D57C;D57C;1112 1162 11AF;D57C;1112 1162 11AF;
+D57D;D57D;1112 1162 11B0;D57D;1112 1162 11B0;
+D57E;D57E;1112 1162 11B1;D57E;1112 1162 11B1;
+D57F;D57F;1112 1162 11B2;D57F;1112 1162 11B2;
+D580;D580;1112 1162 11B3;D580;1112 1162 11B3;
+D581;D581;1112 1162 11B4;D581;1112 1162 11B4;
+D582;D582;1112 1162 11B5;D582;1112 1162 11B5;
+D583;D583;1112 1162 11B6;D583;1112 1162 11B6;
+D584;D584;1112 1162 11B7;D584;1112 1162 11B7;
+D585;D585;1112 1162 11B8;D585;1112 1162 11B8;
+D586;D586;1112 1162 11B9;D586;1112 1162 11B9;
+D587;D587;1112 1162 11BA;D587;1112 1162 11BA;
+D588;D588;1112 1162 11BB;D588;1112 1162 11BB;
+D589;D589;1112 1162 11BC;D589;1112 1162 11BC;
+D58A;D58A;1112 1162 11BD;D58A;1112 1162 11BD;
+D58B;D58B;1112 1162 11BE;D58B;1112 1162 11BE;
+D58C;D58C;1112 1162 11BF;D58C;1112 1162 11BF;
+D58D;D58D;1112 1162 11C0;D58D;1112 1162 11C0;
+D58E;D58E;1112 1162 11C1;D58E;1112 1162 11C1;
+D58F;D58F;1112 1162 11C2;D58F;1112 1162 11C2;
+D590;D590;1112 1163;D590;1112 1163;
+D591;D591;1112 1163 11A8;D591;1112 1163 11A8;
+D592;D592;1112 1163 11A9;D592;1112 1163 11A9;
+D593;D593;1112 1163 11AA;D593;1112 1163 11AA;
+D594;D594;1112 1163 11AB;D594;1112 1163 11AB;
+D595;D595;1112 1163 11AC;D595;1112 1163 11AC;
+D596;D596;1112 1163 11AD;D596;1112 1163 11AD;
+D597;D597;1112 1163 11AE;D597;1112 1163 11AE;
+D598;D598;1112 1163 11AF;D598;1112 1163 11AF;
+D599;D599;1112 1163 11B0;D599;1112 1163 11B0;
+D59A;D59A;1112 1163 11B1;D59A;1112 1163 11B1;
+D59B;D59B;1112 1163 11B2;D59B;1112 1163 11B2;
+D59C;D59C;1112 1163 11B3;D59C;1112 1163 11B3;
+D59D;D59D;1112 1163 11B4;D59D;1112 1163 11B4;
+D59E;D59E;1112 1163 11B5;D59E;1112 1163 11B5;
+D59F;D59F;1112 1163 11B6;D59F;1112 1163 11B6;
+D5A0;D5A0;1112 1163 11B7;D5A0;1112 1163 11B7;
+D5A1;D5A1;1112 1163 11B8;D5A1;1112 1163 11B8;
+D5A2;D5A2;1112 1163 11B9;D5A2;1112 1163 11B9;
+D5A3;D5A3;1112 1163 11BA;D5A3;1112 1163 11BA;
+D5A4;D5A4;1112 1163 11BB;D5A4;1112 1163 11BB;
+D5A5;D5A5;1112 1163 11BC;D5A5;1112 1163 11BC;
+D5A6;D5A6;1112 1163 11BD;D5A6;1112 1163 11BD;
+D5A7;D5A7;1112 1163 11BE;D5A7;1112 1163 11BE;
+D5A8;D5A8;1112 1163 11BF;D5A8;1112 1163 11BF;
+D5A9;D5A9;1112 1163 11C0;D5A9;1112 1163 11C0;
+D5AA;D5AA;1112 1163 11C1;D5AA;1112 1163 11C1;
+D5AB;D5AB;1112 1163 11C2;D5AB;1112 1163 11C2;
+D5AC;D5AC;1112 1164;D5AC;1112 1164;
+D5AD;D5AD;1112 1164 11A8;D5AD;1112 1164 11A8;
+D5AE;D5AE;1112 1164 11A9;D5AE;1112 1164 11A9;
+D5AF;D5AF;1112 1164 11AA;D5AF;1112 1164 11AA;
+D5B0;D5B0;1112 1164 11AB;D5B0;1112 1164 11AB;
+D5B1;D5B1;1112 1164 11AC;D5B1;1112 1164 11AC;
+D5B2;D5B2;1112 1164 11AD;D5B2;1112 1164 11AD;
+D5B3;D5B3;1112 1164 11AE;D5B3;1112 1164 11AE;
+D5B4;D5B4;1112 1164 11AF;D5B4;1112 1164 11AF;
+D5B5;D5B5;1112 1164 11B0;D5B5;1112 1164 11B0;
+D5B6;D5B6;1112 1164 11B1;D5B6;1112 1164 11B1;
+D5B7;D5B7;1112 1164 11B2;D5B7;1112 1164 11B2;
+D5B8;D5B8;1112 1164 11B3;D5B8;1112 1164 11B3;
+D5B9;D5B9;1112 1164 11B4;D5B9;1112 1164 11B4;
+D5BA;D5BA;1112 1164 11B5;D5BA;1112 1164 11B5;
+D5BB;D5BB;1112 1164 11B6;D5BB;1112 1164 11B6;
+D5BC;D5BC;1112 1164 11B7;D5BC;1112 1164 11B7;
+D5BD;D5BD;1112 1164 11B8;D5BD;1112 1164 11B8;
+D5BE;D5BE;1112 1164 11B9;D5BE;1112 1164 11B9;
+D5BF;D5BF;1112 1164 11BA;D5BF;1112 1164 11BA;
+D5C0;D5C0;1112 1164 11BB;D5C0;1112 1164 11BB;
+D5C1;D5C1;1112 1164 11BC;D5C1;1112 1164 11BC;
+D5C2;D5C2;1112 1164 11BD;D5C2;1112 1164 11BD;
+D5C3;D5C3;1112 1164 11BE;D5C3;1112 1164 11BE;
+D5C4;D5C4;1112 1164 11BF;D5C4;1112 1164 11BF;
+D5C5;D5C5;1112 1164 11C0;D5C5;1112 1164 11C0;
+D5C6;D5C6;1112 1164 11C1;D5C6;1112 1164 11C1;
+D5C7;D5C7;1112 1164 11C2;D5C7;1112 1164 11C2;
+D5C8;D5C8;1112 1165;D5C8;1112 1165;
+D5C9;D5C9;1112 1165 11A8;D5C9;1112 1165 11A8;
+D5CA;D5CA;1112 1165 11A9;D5CA;1112 1165 11A9;
+D5CB;D5CB;1112 1165 11AA;D5CB;1112 1165 11AA;
+D5CC;D5CC;1112 1165 11AB;D5CC;1112 1165 11AB;
+D5CD;D5CD;1112 1165 11AC;D5CD;1112 1165 11AC;
+D5CE;D5CE;1112 1165 11AD;D5CE;1112 1165 11AD;
+D5CF;D5CF;1112 1165 11AE;D5CF;1112 1165 11AE;
+D5D0;D5D0;1112 1165 11AF;D5D0;1112 1165 11AF;
+D5D1;D5D1;1112 1165 11B0;D5D1;1112 1165 11B0;
+D5D2;D5D2;1112 1165 11B1;D5D2;1112 1165 11B1;
+D5D3;D5D3;1112 1165 11B2;D5D3;1112 1165 11B2;
+D5D4;D5D4;1112 1165 11B3;D5D4;1112 1165 11B3;
+D5D5;D5D5;1112 1165 11B4;D5D5;1112 1165 11B4;
+D5D6;D5D6;1112 1165 11B5;D5D6;1112 1165 11B5;
+D5D7;D5D7;1112 1165 11B6;D5D7;1112 1165 11B6;
+D5D8;D5D8;1112 1165 11B7;D5D8;1112 1165 11B7;
+D5D9;D5D9;1112 1165 11B8;D5D9;1112 1165 11B8;
+D5DA;D5DA;1112 1165 11B9;D5DA;1112 1165 11B9;
+D5DB;D5DB;1112 1165 11BA;D5DB;1112 1165 11BA;
+D5DC;D5DC;1112 1165 11BB;D5DC;1112 1165 11BB;
+D5DD;D5DD;1112 1165 11BC;D5DD;1112 1165 11BC;
+D5DE;D5DE;1112 1165 11BD;D5DE;1112 1165 11BD;
+D5DF;D5DF;1112 1165 11BE;D5DF;1112 1165 11BE;
+D5E0;D5E0;1112 1165 11BF;D5E0;1112 1165 11BF;
+D5E1;D5E1;1112 1165 11C0;D5E1;1112 1165 11C0;
+D5E2;D5E2;1112 1165 11C1;D5E2;1112 1165 11C1;
+D5E3;D5E3;1112 1165 11C2;D5E3;1112 1165 11C2;
+D5E4;D5E4;1112 1166;D5E4;1112 1166;
+D5E5;D5E5;1112 1166 11A8;D5E5;1112 1166 11A8;
+D5E6;D5E6;1112 1166 11A9;D5E6;1112 1166 11A9;
+D5E7;D5E7;1112 1166 11AA;D5E7;1112 1166 11AA;
+D5E8;D5E8;1112 1166 11AB;D5E8;1112 1166 11AB;
+D5E9;D5E9;1112 1166 11AC;D5E9;1112 1166 11AC;
+D5EA;D5EA;1112 1166 11AD;D5EA;1112 1166 11AD;
+D5EB;D5EB;1112 1166 11AE;D5EB;1112 1166 11AE;
+D5EC;D5EC;1112 1166 11AF;D5EC;1112 1166 11AF;
+D5ED;D5ED;1112 1166 11B0;D5ED;1112 1166 11B0;
+D5EE;D5EE;1112 1166 11B1;D5EE;1112 1166 11B1;
+D5EF;D5EF;1112 1166 11B2;D5EF;1112 1166 11B2;
+D5F0;D5F0;1112 1166 11B3;D5F0;1112 1166 11B3;
+D5F1;D5F1;1112 1166 11B4;D5F1;1112 1166 11B4;
+D5F2;D5F2;1112 1166 11B5;D5F2;1112 1166 11B5;
+D5F3;D5F3;1112 1166 11B6;D5F3;1112 1166 11B6;
+D5F4;D5F4;1112 1166 11B7;D5F4;1112 1166 11B7;
+D5F5;D5F5;1112 1166 11B8;D5F5;1112 1166 11B8;
+D5F6;D5F6;1112 1166 11B9;D5F6;1112 1166 11B9;
+D5F7;D5F7;1112 1166 11BA;D5F7;1112 1166 11BA;
+D5F8;D5F8;1112 1166 11BB;D5F8;1112 1166 11BB;
+D5F9;D5F9;1112 1166 11BC;D5F9;1112 1166 11BC;
+D5FA;D5FA;1112 1166 11BD;D5FA;1112 1166 11BD;
+D5FB;D5FB;1112 1166 11BE;D5FB;1112 1166 11BE;
+D5FC;D5FC;1112 1166 11BF;D5FC;1112 1166 11BF;
+D5FD;D5FD;1112 1166 11C0;D5FD;1112 1166 11C0;
+D5FE;D5FE;1112 1166 11C1;D5FE;1112 1166 11C1;
+D5FF;D5FF;1112 1166 11C2;D5FF;1112 1166 11C2;
+D600;D600;1112 1167;D600;1112 1167;
+D601;D601;1112 1167 11A8;D601;1112 1167 11A8;
+D602;D602;1112 1167 11A9;D602;1112 1167 11A9;
+D603;D603;1112 1167 11AA;D603;1112 1167 11AA;
+D604;D604;1112 1167 11AB;D604;1112 1167 11AB;
+D605;D605;1112 1167 11AC;D605;1112 1167 11AC;
+D606;D606;1112 1167 11AD;D606;1112 1167 11AD;
+D607;D607;1112 1167 11AE;D607;1112 1167 11AE;
+D608;D608;1112 1167 11AF;D608;1112 1167 11AF;
+D609;D609;1112 1167 11B0;D609;1112 1167 11B0;
+D60A;D60A;1112 1167 11B1;D60A;1112 1167 11B1;
+D60B;D60B;1112 1167 11B2;D60B;1112 1167 11B2;
+D60C;D60C;1112 1167 11B3;D60C;1112 1167 11B3;
+D60D;D60D;1112 1167 11B4;D60D;1112 1167 11B4;
+D60E;D60E;1112 1167 11B5;D60E;1112 1167 11B5;
+D60F;D60F;1112 1167 11B6;D60F;1112 1167 11B6;
+D610;D610;1112 1167 11B7;D610;1112 1167 11B7;
+D611;D611;1112 1167 11B8;D611;1112 1167 11B8;
+D612;D612;1112 1167 11B9;D612;1112 1167 11B9;
+D613;D613;1112 1167 11BA;D613;1112 1167 11BA;
+D614;D614;1112 1167 11BB;D614;1112 1167 11BB;
+D615;D615;1112 1167 11BC;D615;1112 1167 11BC;
+D616;D616;1112 1167 11BD;D616;1112 1167 11BD;
+D617;D617;1112 1167 11BE;D617;1112 1167 11BE;
+D618;D618;1112 1167 11BF;D618;1112 1167 11BF;
+D619;D619;1112 1167 11C0;D619;1112 1167 11C0;
+D61A;D61A;1112 1167 11C1;D61A;1112 1167 11C1;
+D61B;D61B;1112 1167 11C2;D61B;1112 1167 11C2;
+D61C;D61C;1112 1168;D61C;1112 1168;
+D61D;D61D;1112 1168 11A8;D61D;1112 1168 11A8;
+D61E;D61E;1112 1168 11A9;D61E;1112 1168 11A9;
+D61F;D61F;1112 1168 11AA;D61F;1112 1168 11AA;
+D620;D620;1112 1168 11AB;D620;1112 1168 11AB;
+D621;D621;1112 1168 11AC;D621;1112 1168 11AC;
+D622;D622;1112 1168 11AD;D622;1112 1168 11AD;
+D623;D623;1112 1168 11AE;D623;1112 1168 11AE;
+D624;D624;1112 1168 11AF;D624;1112 1168 11AF;
+D625;D625;1112 1168 11B0;D625;1112 1168 11B0;
+D626;D626;1112 1168 11B1;D626;1112 1168 11B1;
+D627;D627;1112 1168 11B2;D627;1112 1168 11B2;
+D628;D628;1112 1168 11B3;D628;1112 1168 11B3;
+D629;D629;1112 1168 11B4;D629;1112 1168 11B4;
+D62A;D62A;1112 1168 11B5;D62A;1112 1168 11B5;
+D62B;D62B;1112 1168 11B6;D62B;1112 1168 11B6;
+D62C;D62C;1112 1168 11B7;D62C;1112 1168 11B7;
+D62D;D62D;1112 1168 11B8;D62D;1112 1168 11B8;
+D62E;D62E;1112 1168 11B9;D62E;1112 1168 11B9;
+D62F;D62F;1112 1168 11BA;D62F;1112 1168 11BA;
+D630;D630;1112 1168 11BB;D630;1112 1168 11BB;
+D631;D631;1112 1168 11BC;D631;1112 1168 11BC;
+D632;D632;1112 1168 11BD;D632;1112 1168 11BD;
+D633;D633;1112 1168 11BE;D633;1112 1168 11BE;
+D634;D634;1112 1168 11BF;D634;1112 1168 11BF;
+D635;D635;1112 1168 11C0;D635;1112 1168 11C0;
+D636;D636;1112 1168 11C1;D636;1112 1168 11C1;
+D637;D637;1112 1168 11C2;D637;1112 1168 11C2;
+D638;D638;1112 1169;D638;1112 1169;
+D639;D639;1112 1169 11A8;D639;1112 1169 11A8;
+D63A;D63A;1112 1169 11A9;D63A;1112 1169 11A9;
+D63B;D63B;1112 1169 11AA;D63B;1112 1169 11AA;
+D63C;D63C;1112 1169 11AB;D63C;1112 1169 11AB;
+D63D;D63D;1112 1169 11AC;D63D;1112 1169 11AC;
+D63E;D63E;1112 1169 11AD;D63E;1112 1169 11AD;
+D63F;D63F;1112 1169 11AE;D63F;1112 1169 11AE;
+D640;D640;1112 1169 11AF;D640;1112 1169 11AF;
+D641;D641;1112 1169 11B0;D641;1112 1169 11B0;
+D642;D642;1112 1169 11B1;D642;1112 1169 11B1;
+D643;D643;1112 1169 11B2;D643;1112 1169 11B2;
+D644;D644;1112 1169 11B3;D644;1112 1169 11B3;
+D645;D645;1112 1169 11B4;D645;1112 1169 11B4;
+D646;D646;1112 1169 11B5;D646;1112 1169 11B5;
+D647;D647;1112 1169 11B6;D647;1112 1169 11B6;
+D648;D648;1112 1169 11B7;D648;1112 1169 11B7;
+D649;D649;1112 1169 11B8;D649;1112 1169 11B8;
+D64A;D64A;1112 1169 11B9;D64A;1112 1169 11B9;
+D64B;D64B;1112 1169 11BA;D64B;1112 1169 11BA;
+D64C;D64C;1112 1169 11BB;D64C;1112 1169 11BB;
+D64D;D64D;1112 1169 11BC;D64D;1112 1169 11BC;
+D64E;D64E;1112 1169 11BD;D64E;1112 1169 11BD;
+D64F;D64F;1112 1169 11BE;D64F;1112 1169 11BE;
+D650;D650;1112 1169 11BF;D650;1112 1169 11BF;
+D651;D651;1112 1169 11C0;D651;1112 1169 11C0;
+D652;D652;1112 1169 11C1;D652;1112 1169 11C1;
+D653;D653;1112 1169 11C2;D653;1112 1169 11C2;
+D654;D654;1112 116A;D654;1112 116A;
+D655;D655;1112 116A 11A8;D655;1112 116A 11A8;
+D656;D656;1112 116A 11A9;D656;1112 116A 11A9;
+D657;D657;1112 116A 11AA;D657;1112 116A 11AA;
+D658;D658;1112 116A 11AB;D658;1112 116A 11AB;
+D659;D659;1112 116A 11AC;D659;1112 116A 11AC;
+D65A;D65A;1112 116A 11AD;D65A;1112 116A 11AD;
+D65B;D65B;1112 116A 11AE;D65B;1112 116A 11AE;
+D65C;D65C;1112 116A 11AF;D65C;1112 116A 11AF;
+D65D;D65D;1112 116A 11B0;D65D;1112 116A 11B0;
+D65E;D65E;1112 116A 11B1;D65E;1112 116A 11B1;
+D65F;D65F;1112 116A 11B2;D65F;1112 116A 11B2;
+D660;D660;1112 116A 11B3;D660;1112 116A 11B3;
+D661;D661;1112 116A 11B4;D661;1112 116A 11B4;
+D662;D662;1112 116A 11B5;D662;1112 116A 11B5;
+D663;D663;1112 116A 11B6;D663;1112 116A 11B6;
+D664;D664;1112 116A 11B7;D664;1112 116A 11B7;
+D665;D665;1112 116A 11B8;D665;1112 116A 11B8;
+D666;D666;1112 116A 11B9;D666;1112 116A 11B9;
+D667;D667;1112 116A 11BA;D667;1112 116A 11BA;
+D668;D668;1112 116A 11BB;D668;1112 116A 11BB;
+D669;D669;1112 116A 11BC;D669;1112 116A 11BC;
+D66A;D66A;1112 116A 11BD;D66A;1112 116A 11BD;
+D66B;D66B;1112 116A 11BE;D66B;1112 116A 11BE;
+D66C;D66C;1112 116A 11BF;D66C;1112 116A 11BF;
+D66D;D66D;1112 116A 11C0;D66D;1112 116A 11C0;
+D66E;D66E;1112 116A 11C1;D66E;1112 116A 11C1;
+D66F;D66F;1112 116A 11C2;D66F;1112 116A 11C2;
+D670;D670;1112 116B;D670;1112 116B;
+D671;D671;1112 116B 11A8;D671;1112 116B 11A8;
+D672;D672;1112 116B 11A9;D672;1112 116B 11A9;
+D673;D673;1112 116B 11AA;D673;1112 116B 11AA;
+D674;D674;1112 116B 11AB;D674;1112 116B 11AB;
+D675;D675;1112 116B 11AC;D675;1112 116B 11AC;
+D676;D676;1112 116B 11AD;D676;1112 116B 11AD;
+D677;D677;1112 116B 11AE;D677;1112 116B 11AE;
+D678;D678;1112 116B 11AF;D678;1112 116B 11AF;
+D679;D679;1112 116B 11B0;D679;1112 116B 11B0;
+D67A;D67A;1112 116B 11B1;D67A;1112 116B 11B1;
+D67B;D67B;1112 116B 11B2;D67B;1112 116B 11B2;
+D67C;D67C;1112 116B 11B3;D67C;1112 116B 11B3;
+D67D;D67D;1112 116B 11B4;D67D;1112 116B 11B4;
+D67E;D67E;1112 116B 11B5;D67E;1112 116B 11B5;
+D67F;D67F;1112 116B 11B6;D67F;1112 116B 11B6;
+D680;D680;1112 116B 11B7;D680;1112 116B 11B7;
+D681;D681;1112 116B 11B8;D681;1112 116B 11B8;
+D682;D682;1112 116B 11B9;D682;1112 116B 11B9;
+D683;D683;1112 116B 11BA;D683;1112 116B 11BA;
+D684;D684;1112 116B 11BB;D684;1112 116B 11BB;
+D685;D685;1112 116B 11BC;D685;1112 116B 11BC;
+D686;D686;1112 116B 11BD;D686;1112 116B 11BD;
+D687;D687;1112 116B 11BE;D687;1112 116B 11BE;
+D688;D688;1112 116B 11BF;D688;1112 116B 11BF;
+D689;D689;1112 116B 11C0;D689;1112 116B 11C0;
+D68A;D68A;1112 116B 11C1;D68A;1112 116B 11C1;
+D68B;D68B;1112 116B 11C2;D68B;1112 116B 11C2;
+D68C;D68C;1112 116C;D68C;1112 116C;
+D68D;D68D;1112 116C 11A8;D68D;1112 116C 11A8;
+D68E;D68E;1112 116C 11A9;D68E;1112 116C 11A9;
+D68F;D68F;1112 116C 11AA;D68F;1112 116C 11AA;
+D690;D690;1112 116C 11AB;D690;1112 116C 11AB;
+D691;D691;1112 116C 11AC;D691;1112 116C 11AC;
+D692;D692;1112 116C 11AD;D692;1112 116C 11AD;
+D693;D693;1112 116C 11AE;D693;1112 116C 11AE;
+D694;D694;1112 116C 11AF;D694;1112 116C 11AF;
+D695;D695;1112 116C 11B0;D695;1112 116C 11B0;
+D696;D696;1112 116C 11B1;D696;1112 116C 11B1;
+D697;D697;1112 116C 11B2;D697;1112 116C 11B2;
+D698;D698;1112 116C 11B3;D698;1112 116C 11B3;
+D699;D699;1112 116C 11B4;D699;1112 116C 11B4;
+D69A;D69A;1112 116C 11B5;D69A;1112 116C 11B5;
+D69B;D69B;1112 116C 11B6;D69B;1112 116C 11B6;
+D69C;D69C;1112 116C 11B7;D69C;1112 116C 11B7;
+D69D;D69D;1112 116C 11B8;D69D;1112 116C 11B8;
+D69E;D69E;1112 116C 11B9;D69E;1112 116C 11B9;
+D69F;D69F;1112 116C 11BA;D69F;1112 116C 11BA;
+D6A0;D6A0;1112 116C 11BB;D6A0;1112 116C 11BB;
+D6A1;D6A1;1112 116C 11BC;D6A1;1112 116C 11BC;
+D6A2;D6A2;1112 116C 11BD;D6A2;1112 116C 11BD;
+D6A3;D6A3;1112 116C 11BE;D6A3;1112 116C 11BE;
+D6A4;D6A4;1112 116C 11BF;D6A4;1112 116C 11BF;
+D6A5;D6A5;1112 116C 11C0;D6A5;1112 116C 11C0;
+D6A6;D6A6;1112 116C 11C1;D6A6;1112 116C 11C1;
+D6A7;D6A7;1112 116C 11C2;D6A7;1112 116C 11C2;
+D6A8;D6A8;1112 116D;D6A8;1112 116D;
+D6A9;D6A9;1112 116D 11A8;D6A9;1112 116D 11A8;
+D6AA;D6AA;1112 116D 11A9;D6AA;1112 116D 11A9;
+D6AB;D6AB;1112 116D 11AA;D6AB;1112 116D 11AA;
+D6AC;D6AC;1112 116D 11AB;D6AC;1112 116D 11AB;
+D6AD;D6AD;1112 116D 11AC;D6AD;1112 116D 11AC;
+D6AE;D6AE;1112 116D 11AD;D6AE;1112 116D 11AD;
+D6AF;D6AF;1112 116D 11AE;D6AF;1112 116D 11AE;
+D6B0;D6B0;1112 116D 11AF;D6B0;1112 116D 11AF;
+D6B1;D6B1;1112 116D 11B0;D6B1;1112 116D 11B0;
+D6B2;D6B2;1112 116D 11B1;D6B2;1112 116D 11B1;
+D6B3;D6B3;1112 116D 11B2;D6B3;1112 116D 11B2;
+D6B4;D6B4;1112 116D 11B3;D6B4;1112 116D 11B3;
+D6B5;D6B5;1112 116D 11B4;D6B5;1112 116D 11B4;
+D6B6;D6B6;1112 116D 11B5;D6B6;1112 116D 11B5;
+D6B7;D6B7;1112 116D 11B6;D6B7;1112 116D 11B6;
+D6B8;D6B8;1112 116D 11B7;D6B8;1112 116D 11B7;
+D6B9;D6B9;1112 116D 11B8;D6B9;1112 116D 11B8;
+D6BA;D6BA;1112 116D 11B9;D6BA;1112 116D 11B9;
+D6BB;D6BB;1112 116D 11BA;D6BB;1112 116D 11BA;
+D6BC;D6BC;1112 116D 11BB;D6BC;1112 116D 11BB;
+D6BD;D6BD;1112 116D 11BC;D6BD;1112 116D 11BC;
+D6BE;D6BE;1112 116D 11BD;D6BE;1112 116D 11BD;
+D6BF;D6BF;1112 116D 11BE;D6BF;1112 116D 11BE;
+D6C0;D6C0;1112 116D 11BF;D6C0;1112 116D 11BF;
+D6C1;D6C1;1112 116D 11C0;D6C1;1112 116D 11C0;
+D6C2;D6C2;1112 116D 11C1;D6C2;1112 116D 11C1;
+D6C3;D6C3;1112 116D 11C2;D6C3;1112 116D 11C2;
+D6C4;D6C4;1112 116E;D6C4;1112 116E;
+D6C5;D6C5;1112 116E 11A8;D6C5;1112 116E 11A8;
+D6C6;D6C6;1112 116E 11A9;D6C6;1112 116E 11A9;
+D6C7;D6C7;1112 116E 11AA;D6C7;1112 116E 11AA;
+D6C8;D6C8;1112 116E 11AB;D6C8;1112 116E 11AB;
+D6C9;D6C9;1112 116E 11AC;D6C9;1112 116E 11AC;
+D6CA;D6CA;1112 116E 11AD;D6CA;1112 116E 11AD;
+D6CB;D6CB;1112 116E 11AE;D6CB;1112 116E 11AE;
+D6CC;D6CC;1112 116E 11AF;D6CC;1112 116E 11AF;
+D6CD;D6CD;1112 116E 11B0;D6CD;1112 116E 11B0;
+D6CE;D6CE;1112 116E 11B1;D6CE;1112 116E 11B1;
+D6CF;D6CF;1112 116E 11B2;D6CF;1112 116E 11B2;
+D6D0;D6D0;1112 116E 11B3;D6D0;1112 116E 11B3;
+D6D1;D6D1;1112 116E 11B4;D6D1;1112 116E 11B4;
+D6D2;D6D2;1112 116E 11B5;D6D2;1112 116E 11B5;
+D6D3;D6D3;1112 116E 11B6;D6D3;1112 116E 11B6;
+D6D4;D6D4;1112 116E 11B7;D6D4;1112 116E 11B7;
+D6D5;D6D5;1112 116E 11B8;D6D5;1112 116E 11B8;
+D6D6;D6D6;1112 116E 11B9;D6D6;1112 116E 11B9;
+D6D7;D6D7;1112 116E 11BA;D6D7;1112 116E 11BA;
+D6D8;D6D8;1112 116E 11BB;D6D8;1112 116E 11BB;
+D6D9;D6D9;1112 116E 11BC;D6D9;1112 116E 11BC;
+D6DA;D6DA;1112 116E 11BD;D6DA;1112 116E 11BD;
+D6DB;D6DB;1112 116E 11BE;D6DB;1112 116E 11BE;
+D6DC;D6DC;1112 116E 11BF;D6DC;1112 116E 11BF;
+D6DD;D6DD;1112 116E 11C0;D6DD;1112 116E 11C0;
+D6DE;D6DE;1112 116E 11C1;D6DE;1112 116E 11C1;
+D6DF;D6DF;1112 116E 11C2;D6DF;1112 116E 11C2;
+D6E0;D6E0;1112 116F;D6E0;1112 116F;
+D6E1;D6E1;1112 116F 11A8;D6E1;1112 116F 11A8;
+D6E2;D6E2;1112 116F 11A9;D6E2;1112 116F 11A9;
+D6E3;D6E3;1112 116F 11AA;D6E3;1112 116F 11AA;
+D6E4;D6E4;1112 116F 11AB;D6E4;1112 116F 11AB;
+D6E5;D6E5;1112 116F 11AC;D6E5;1112 116F 11AC;
+D6E6;D6E6;1112 116F 11AD;D6E6;1112 116F 11AD;
+D6E7;D6E7;1112 116F 11AE;D6E7;1112 116F 11AE;
+D6E8;D6E8;1112 116F 11AF;D6E8;1112 116F 11AF;
+D6E9;D6E9;1112 116F 11B0;D6E9;1112 116F 11B0;
+D6EA;D6EA;1112 116F 11B1;D6EA;1112 116F 11B1;
+D6EB;D6EB;1112 116F 11B2;D6EB;1112 116F 11B2;
+D6EC;D6EC;1112 116F 11B3;D6EC;1112 116F 11B3;
+D6ED;D6ED;1112 116F 11B4;D6ED;1112 116F 11B4;
+D6EE;D6EE;1112 116F 11B5;D6EE;1112 116F 11B5;
+D6EF;D6EF;1112 116F 11B6;D6EF;1112 116F 11B6;
+D6F0;D6F0;1112 116F 11B7;D6F0;1112 116F 11B7;
+D6F1;D6F1;1112 116F 11B8;D6F1;1112 116F 11B8;
+D6F2;D6F2;1112 116F 11B9;D6F2;1112 116F 11B9;
+D6F3;D6F3;1112 116F 11BA;D6F3;1112 116F 11BA;
+D6F4;D6F4;1112 116F 11BB;D6F4;1112 116F 11BB;
+D6F5;D6F5;1112 116F 11BC;D6F5;1112 116F 11BC;
+D6F6;D6F6;1112 116F 11BD;D6F6;1112 116F 11BD;
+D6F7;D6F7;1112 116F 11BE;D6F7;1112 116F 11BE;
+D6F8;D6F8;1112 116F 11BF;D6F8;1112 116F 11BF;
+D6F9;D6F9;1112 116F 11C0;D6F9;1112 116F 11C0;
+D6FA;D6FA;1112 116F 11C1;D6FA;1112 116F 11C1;
+D6FB;D6FB;1112 116F 11C2;D6FB;1112 116F 11C2;
+D6FC;D6FC;1112 1170;D6FC;1112 1170;
+D6FD;D6FD;1112 1170 11A8;D6FD;1112 1170 11A8;
+D6FE;D6FE;1112 1170 11A9;D6FE;1112 1170 11A9;
+D6FF;D6FF;1112 1170 11AA;D6FF;1112 1170 11AA;
+D700;D700;1112 1170 11AB;D700;1112 1170 11AB;
+D701;D701;1112 1170 11AC;D701;1112 1170 11AC;
+D702;D702;1112 1170 11AD;D702;1112 1170 11AD;
+D703;D703;1112 1170 11AE;D703;1112 1170 11AE;
+D704;D704;1112 1170 11AF;D704;1112 1170 11AF;
+D705;D705;1112 1170 11B0;D705;1112 1170 11B0;
+D706;D706;1112 1170 11B1;D706;1112 1170 11B1;
+D707;D707;1112 1170 11B2;D707;1112 1170 11B2;
+D708;D708;1112 1170 11B3;D708;1112 1170 11B3;
+D709;D709;1112 1170 11B4;D709;1112 1170 11B4;
+D70A;D70A;1112 1170 11B5;D70A;1112 1170 11B5;
+D70B;D70B;1112 1170 11B6;D70B;1112 1170 11B6;
+D70C;D70C;1112 1170 11B7;D70C;1112 1170 11B7;
+D70D;D70D;1112 1170 11B8;D70D;1112 1170 11B8;
+D70E;D70E;1112 1170 11B9;D70E;1112 1170 11B9;
+D70F;D70F;1112 1170 11BA;D70F;1112 1170 11BA;
+D710;D710;1112 1170 11BB;D710;1112 1170 11BB;
+D711;D711;1112 1170 11BC;D711;1112 1170 11BC;
+D712;D712;1112 1170 11BD;D712;1112 1170 11BD;
+D713;D713;1112 1170 11BE;D713;1112 1170 11BE;
+D714;D714;1112 1170 11BF;D714;1112 1170 11BF;
+D715;D715;1112 1170 11C0;D715;1112 1170 11C0;
+D716;D716;1112 1170 11C1;D716;1112 1170 11C1;
+D717;D717;1112 1170 11C2;D717;1112 1170 11C2;
+D718;D718;1112 1171;D718;1112 1171;
+D719;D719;1112 1171 11A8;D719;1112 1171 11A8;
+D71A;D71A;1112 1171 11A9;D71A;1112 1171 11A9;
+D71B;D71B;1112 1171 11AA;D71B;1112 1171 11AA;
+D71C;D71C;1112 1171 11AB;D71C;1112 1171 11AB;
+D71D;D71D;1112 1171 11AC;D71D;1112 1171 11AC;
+D71E;D71E;1112 1171 11AD;D71E;1112 1171 11AD;
+D71F;D71F;1112 1171 11AE;D71F;1112 1171 11AE;
+D720;D720;1112 1171 11AF;D720;1112 1171 11AF;
+D721;D721;1112 1171 11B0;D721;1112 1171 11B0;
+D722;D722;1112 1171 11B1;D722;1112 1171 11B1;
+D723;D723;1112 1171 11B2;D723;1112 1171 11B2;
+D724;D724;1112 1171 11B3;D724;1112 1171 11B3;
+D725;D725;1112 1171 11B4;D725;1112 1171 11B4;
+D726;D726;1112 1171 11B5;D726;1112 1171 11B5;
+D727;D727;1112 1171 11B6;D727;1112 1171 11B6;
+D728;D728;1112 1171 11B7;D728;1112 1171 11B7;
+D729;D729;1112 1171 11B8;D729;1112 1171 11B8;
+D72A;D72A;1112 1171 11B9;D72A;1112 1171 11B9;
+D72B;D72B;1112 1171 11BA;D72B;1112 1171 11BA;
+D72C;D72C;1112 1171 11BB;D72C;1112 1171 11BB;
+D72D;D72D;1112 1171 11BC;D72D;1112 1171 11BC;
+D72E;D72E;1112 1171 11BD;D72E;1112 1171 11BD;
+D72F;D72F;1112 1171 11BE;D72F;1112 1171 11BE;
+D730;D730;1112 1171 11BF;D730;1112 1171 11BF;
+D731;D731;1112 1171 11C0;D731;1112 1171 11C0;
+D732;D732;1112 1171 11C1;D732;1112 1171 11C1;
+D733;D733;1112 1171 11C2;D733;1112 1171 11C2;
+D734;D734;1112 1172;D734;1112 1172;
+D735;D735;1112 1172 11A8;D735;1112 1172 11A8;
+D736;D736;1112 1172 11A9;D736;1112 1172 11A9;
+D737;D737;1112 1172 11AA;D737;1112 1172 11AA;
+D738;D738;1112 1172 11AB;D738;1112 1172 11AB;
+D739;D739;1112 1172 11AC;D739;1112 1172 11AC;
+D73A;D73A;1112 1172 11AD;D73A;1112 1172 11AD;
+D73B;D73B;1112 1172 11AE;D73B;1112 1172 11AE;
+D73C;D73C;1112 1172 11AF;D73C;1112 1172 11AF;
+D73D;D73D;1112 1172 11B0;D73D;1112 1172 11B0;
+D73E;D73E;1112 1172 11B1;D73E;1112 1172 11B1;
+D73F;D73F;1112 1172 11B2;D73F;1112 1172 11B2;
+D740;D740;1112 1172 11B3;D740;1112 1172 11B3;
+D741;D741;1112 1172 11B4;D741;1112 1172 11B4;
+D742;D742;1112 1172 11B5;D742;1112 1172 11B5;
+D743;D743;1112 1172 11B6;D743;1112 1172 11B6;
+D744;D744;1112 1172 11B7;D744;1112 1172 11B7;
+D745;D745;1112 1172 11B8;D745;1112 1172 11B8;
+D746;D746;1112 1172 11B9;D746;1112 1172 11B9;
+D747;D747;1112 1172 11BA;D747;1112 1172 11BA;
+D748;D748;1112 1172 11BB;D748;1112 1172 11BB;
+D749;D749;1112 1172 11BC;D749;1112 1172 11BC;
+D74A;D74A;1112 1172 11BD;D74A;1112 1172 11BD;
+D74B;D74B;1112 1172 11BE;D74B;1112 1172 11BE;
+D74C;D74C;1112 1172 11BF;D74C;1112 1172 11BF;
+D74D;D74D;1112 1172 11C0;D74D;1112 1172 11C0;
+D74E;D74E;1112 1172 11C1;D74E;1112 1172 11C1;
+D74F;D74F;1112 1172 11C2;D74F;1112 1172 11C2;
+D750;D750;1112 1173;D750;1112 1173;
+D751;D751;1112 1173 11A8;D751;1112 1173 11A8;
+D752;D752;1112 1173 11A9;D752;1112 1173 11A9;
+D753;D753;1112 1173 11AA;D753;1112 1173 11AA;
+D754;D754;1112 1173 11AB;D754;1112 1173 11AB;
+D755;D755;1112 1173 11AC;D755;1112 1173 11AC;
+D756;D756;1112 1173 11AD;D756;1112 1173 11AD;
+D757;D757;1112 1173 11AE;D757;1112 1173 11AE;
+D758;D758;1112 1173 11AF;D758;1112 1173 11AF;
+D759;D759;1112 1173 11B0;D759;1112 1173 11B0;
+D75A;D75A;1112 1173 11B1;D75A;1112 1173 11B1;
+D75B;D75B;1112 1173 11B2;D75B;1112 1173 11B2;
+D75C;D75C;1112 1173 11B3;D75C;1112 1173 11B3;
+D75D;D75D;1112 1173 11B4;D75D;1112 1173 11B4;
+D75E;D75E;1112 1173 11B5;D75E;1112 1173 11B5;
+D75F;D75F;1112 1173 11B6;D75F;1112 1173 11B6;
+D760;D760;1112 1173 11B7;D760;1112 1173 11B7;
+D761;D761;1112 1173 11B8;D761;1112 1173 11B8;
+D762;D762;1112 1173 11B9;D762;1112 1173 11B9;
+D763;D763;1112 1173 11BA;D763;1112 1173 11BA;
+D764;D764;1112 1173 11BB;D764;1112 1173 11BB;
+D765;D765;1112 1173 11BC;D765;1112 1173 11BC;
+D766;D766;1112 1173 11BD;D766;1112 1173 11BD;
+D767;D767;1112 1173 11BE;D767;1112 1173 11BE;
+D768;D768;1112 1173 11BF;D768;1112 1173 11BF;
+D769;D769;1112 1173 11C0;D769;1112 1173 11C0;
+D76A;D76A;1112 1173 11C1;D76A;1112 1173 11C1;
+D76B;D76B;1112 1173 11C2;D76B;1112 1173 11C2;
+D76C;D76C;1112 1174;D76C;1112 1174;
+D76D;D76D;1112 1174 11A8;D76D;1112 1174 11A8;
+D76E;D76E;1112 1174 11A9;D76E;1112 1174 11A9;
+D76F;D76F;1112 1174 11AA;D76F;1112 1174 11AA;
+D770;D770;1112 1174 11AB;D770;1112 1174 11AB;
+D771;D771;1112 1174 11AC;D771;1112 1174 11AC;
+D772;D772;1112 1174 11AD;D772;1112 1174 11AD;
+D773;D773;1112 1174 11AE;D773;1112 1174 11AE;
+D774;D774;1112 1174 11AF;D774;1112 1174 11AF;
+D775;D775;1112 1174 11B0;D775;1112 1174 11B0;
+D776;D776;1112 1174 11B1;D776;1112 1174 11B1;
+D777;D777;1112 1174 11B2;D777;1112 1174 11B2;
+D778;D778;1112 1174 11B3;D778;1112 1174 11B3;
+D779;D779;1112 1174 11B4;D779;1112 1174 11B4;
+D77A;D77A;1112 1174 11B5;D77A;1112 1174 11B5;
+D77B;D77B;1112 1174 11B6;D77B;1112 1174 11B6;
+D77C;D77C;1112 1174 11B7;D77C;1112 1174 11B7;
+D77D;D77D;1112 1174 11B8;D77D;1112 1174 11B8;
+D77E;D77E;1112 1174 11B9;D77E;1112 1174 11B9;
+D77F;D77F;1112 1174 11BA;D77F;1112 1174 11BA;
+D780;D780;1112 1174 11BB;D780;1112 1174 11BB;
+D781;D781;1112 1174 11BC;D781;1112 1174 11BC;
+D782;D782;1112 1174 11BD;D782;1112 1174 11BD;
+D783;D783;1112 1174 11BE;D783;1112 1174 11BE;
+D784;D784;1112 1174 11BF;D784;1112 1174 11BF;
+D785;D785;1112 1174 11C0;D785;1112 1174 11C0;
+D786;D786;1112 1174 11C1;D786;1112 1174 11C1;
+D787;D787;1112 1174 11C2;D787;1112 1174 11C2;
+D788;D788;1112 1175;D788;1112 1175;
+D789;D789;1112 1175 11A8;D789;1112 1175 11A8;
+D78A;D78A;1112 1175 11A9;D78A;1112 1175 11A9;
+D78B;D78B;1112 1175 11AA;D78B;1112 1175 11AA;
+D78C;D78C;1112 1175 11AB;D78C;1112 1175 11AB;
+D78D;D78D;1112 1175 11AC;D78D;1112 1175 11AC;
+D78E;D78E;1112 1175 11AD;D78E;1112 1175 11AD;
+D78F;D78F;1112 1175 11AE;D78F;1112 1175 11AE;
+D790;D790;1112 1175 11AF;D790;1112 1175 11AF;
+D791;D791;1112 1175 11B0;D791;1112 1175 11B0;
+D792;D792;1112 1175 11B1;D792;1112 1175 11B1;
+D793;D793;1112 1175 11B2;D793;1112 1175 11B2;
+D794;D794;1112 1175 11B3;D794;1112 1175 11B3;
+D795;D795;1112 1175 11B4;D795;1112 1175 11B4;
+D796;D796;1112 1175 11B5;D796;1112 1175 11B5;
+D797;D797;1112 1175 11B6;D797;1112 1175 11B6;
+D798;D798;1112 1175 11B7;D798;1112 1175 11B7;
+D799;D799;1112 1175 11B8;D799;1112 1175 11B8;
+D79A;D79A;1112 1175 11B9;D79A;1112 1175 11B9;
+D79B;D79B;1112 1175 11BA;D79B;1112 1175 11BA;
+D79C;D79C;1112 1175 11BB;D79C;1112 1175 11BB;
+D79D;D79D;1112 1175 11BC;D79D;1112 1175 11BC;
+D79E;D79E;1112 1175 11BD;D79E;1112 1175 11BD;
+D79F;D79F;1112 1175 11BE;D79F;1112 1175 11BE;
+D7A0;D7A0;1112 1175 11BF;D7A0;1112 1175 11BF;
+D7A1;D7A1;1112 1175 11C0;D7A1;1112 1175 11C0;
+D7A2;D7A2;1112 1175 11C1;D7A2;1112 1175 11C1;
+D7A3;D7A3;1112 1175 11C2;D7A3;1112 1175 11C2;
+F900;8C48;8C48;8C48;8C48;
+F901;66F4;66F4;66F4;66F4;
+F902;8ECA;8ECA;8ECA;8ECA;
+F903;8CC8;8CC8;8CC8;8CC8;
+F904;6ED1;6ED1;6ED1;6ED1;
+F905;4E32;4E32;4E32;4E32;
+F906;53E5;53E5;53E5;53E5;
+F907;9F9C;9F9C;9F9C;9F9C;
+F908;9F9C;9F9C;9F9C;9F9C;
+F909;5951;5951;5951;5951;
+F90A;91D1;91D1;91D1;91D1;
+F90B;5587;5587;5587;5587;
+F90C;5948;5948;5948;5948;
+F90D;61F6;61F6;61F6;61F6;
+F90E;7669;7669;7669;7669;
+F90F;7F85;7F85;7F85;7F85;
+F910;863F;863F;863F;863F;
+F911;87BA;87BA;87BA;87BA;
+F912;88F8;88F8;88F8;88F8;
+F913;908F;908F;908F;908F;
+F914;6A02;6A02;6A02;6A02;
+F915;6D1B;6D1B;6D1B;6D1B;
+F916;70D9;70D9;70D9;70D9;
+F917;73DE;73DE;73DE;73DE;
+F918;843D;843D;843D;843D;
+F919;916A;916A;916A;916A;
+F91A;99F1;99F1;99F1;99F1;
+F91B;4E82;4E82;4E82;4E82;
+F91C;5375;5375;5375;5375;
+F91D;6B04;6B04;6B04;6B04;
+F91E;721B;721B;721B;721B;
+F91F;862D;862D;862D;862D;
+F920;9E1E;9E1E;9E1E;9E1E;
+F921;5D50;5D50;5D50;5D50;
+F922;6FEB;6FEB;6FEB;6FEB;
+F923;85CD;85CD;85CD;85CD;
+F924;8964;8964;8964;8964;
+F925;62C9;62C9;62C9;62C9;
+F926;81D8;81D8;81D8;81D8;
+F927;881F;881F;881F;881F;
+F928;5ECA;5ECA;5ECA;5ECA;
+F929;6717;6717;6717;6717;
+F92A;6D6A;6D6A;6D6A;6D6A;
+F92B;72FC;72FC;72FC;72FC;
+F92C;90CE;90CE;90CE;90CE;
+F92D;4F86;4F86;4F86;4F86;
+F92E;51B7;51B7;51B7;51B7;
+F92F;52DE;52DE;52DE;52DE;
+F930;64C4;64C4;64C4;64C4;
+F931;6AD3;6AD3;6AD3;6AD3;
+F932;7210;7210;7210;7210;
+F933;76E7;76E7;76E7;76E7;
+F934;8001;8001;8001;8001;
+F935;8606;8606;8606;8606;
+F936;865C;865C;865C;865C;
+F937;8DEF;8DEF;8DEF;8DEF;
+F938;9732;9732;9732;9732;
+F939;9B6F;9B6F;9B6F;9B6F;
+F93A;9DFA;9DFA;9DFA;9DFA;
+F93B;788C;788C;788C;788C;
+F93C;797F;797F;797F;797F;
+F93D;7DA0;7DA0;7DA0;7DA0;
+F93E;83C9;83C9;83C9;83C9;
+F93F;9304;9304;9304;9304;
+F940;9E7F;9E7F;9E7F;9E7F;
+F941;8AD6;8AD6;8AD6;8AD6;
+F942;58DF;58DF;58DF;58DF;
+F943;5F04;5F04;5F04;5F04;
+F944;7C60;7C60;7C60;7C60;
+F945;807E;807E;807E;807E;
+F946;7262;7262;7262;7262;
+F947;78CA;78CA;78CA;78CA;
+F948;8CC2;8CC2;8CC2;8CC2;
+F949;96F7;96F7;96F7;96F7;
+F94A;58D8;58D8;58D8;58D8;
+F94B;5C62;5C62;5C62;5C62;
+F94C;6A13;6A13;6A13;6A13;
+F94D;6DDA;6DDA;6DDA;6DDA;
+F94E;6F0F;6F0F;6F0F;6F0F;
+F94F;7D2F;7D2F;7D2F;7D2F;
+F950;7E37;7E37;7E37;7E37;
+F951;964B;964B;964B;964B;
+F952;52D2;52D2;52D2;52D2;
+F953;808B;808B;808B;808B;
+F954;51DC;51DC;51DC;51DC;
+F955;51CC;51CC;51CC;51CC;
+F956;7A1C;7A1C;7A1C;7A1C;
+F957;7DBE;7DBE;7DBE;7DBE;
+F958;83F1;83F1;83F1;83F1;
+F959;9675;9675;9675;9675;
+F95A;8B80;8B80;8B80;8B80;
+F95B;62CF;62CF;62CF;62CF;
+F95C;6A02;6A02;6A02;6A02;
+F95D;8AFE;8AFE;8AFE;8AFE;
+F95E;4E39;4E39;4E39;4E39;
+F95F;5BE7;5BE7;5BE7;5BE7;
+F960;6012;6012;6012;6012;
+F961;7387;7387;7387;7387;
+F962;7570;7570;7570;7570;
+F963;5317;5317;5317;5317;
+F964;78FB;78FB;78FB;78FB;
+F965;4FBF;4FBF;4FBF;4FBF;
+F966;5FA9;5FA9;5FA9;5FA9;
+F967;4E0D;4E0D;4E0D;4E0D;
+F968;6CCC;6CCC;6CCC;6CCC;
+F969;6578;6578;6578;6578;
+F96A;7D22;7D22;7D22;7D22;
+F96B;53C3;53C3;53C3;53C3;
+F96C;585E;585E;585E;585E;
+F96D;7701;7701;7701;7701;
+F96E;8449;8449;8449;8449;
+F96F;8AAA;8AAA;8AAA;8AAA;
+F970;6BBA;6BBA;6BBA;6BBA;
+F971;8FB0;8FB0;8FB0;8FB0;
+F972;6C88;6C88;6C88;6C88;
+F973;62FE;62FE;62FE;62FE;
+F974;82E5;82E5;82E5;82E5;
+F975;63A0;63A0;63A0;63A0;
+F976;7565;7565;7565;7565;
+F977;4EAE;4EAE;4EAE;4EAE;
+F978;5169;5169;5169;5169;
+F979;51C9;51C9;51C9;51C9;
+F97A;6881;6881;6881;6881;
+F97B;7CE7;7CE7;7CE7;7CE7;
+F97C;826F;826F;826F;826F;
+F97D;8AD2;8AD2;8AD2;8AD2;
+F97E;91CF;91CF;91CF;91CF;
+F97F;52F5;52F5;52F5;52F5;
+F980;5442;5442;5442;5442;
+F981;5973;5973;5973;5973;
+F982;5EEC;5EEC;5EEC;5EEC;
+F983;65C5;65C5;65C5;65C5;
+F984;6FFE;6FFE;6FFE;6FFE;
+F985;792A;792A;792A;792A;
+F986;95AD;95AD;95AD;95AD;
+F987;9A6A;9A6A;9A6A;9A6A;
+F988;9E97;9E97;9E97;9E97;
+F989;9ECE;9ECE;9ECE;9ECE;
+F98A;529B;529B;529B;529B;
+F98B;66C6;66C6;66C6;66C6;
+F98C;6B77;6B77;6B77;6B77;
+F98D;8F62;8F62;8F62;8F62;
+F98E;5E74;5E74;5E74;5E74;
+F98F;6190;6190;6190;6190;
+F990;6200;6200;6200;6200;
+F991;649A;649A;649A;649A;
+F992;6F23;6F23;6F23;6F23;
+F993;7149;7149;7149;7149;
+F994;7489;7489;7489;7489;
+F995;79CA;79CA;79CA;79CA;
+F996;7DF4;7DF4;7DF4;7DF4;
+F997;806F;806F;806F;806F;
+F998;8F26;8F26;8F26;8F26;
+F999;84EE;84EE;84EE;84EE;
+F99A;9023;9023;9023;9023;
+F99B;934A;934A;934A;934A;
+F99C;5217;5217;5217;5217;
+F99D;52A3;52A3;52A3;52A3;
+F99E;54BD;54BD;54BD;54BD;
+F99F;70C8;70C8;70C8;70C8;
+F9A0;88C2;88C2;88C2;88C2;
+F9A1;8AAA;8AAA;8AAA;8AAA;
+F9A2;5EC9;5EC9;5EC9;5EC9;
+F9A3;5FF5;5FF5;5FF5;5FF5;
+F9A4;637B;637B;637B;637B;
+F9A5;6BAE;6BAE;6BAE;6BAE;
+F9A6;7C3E;7C3E;7C3E;7C3E;
+F9A7;7375;7375;7375;7375;
+F9A8;4EE4;4EE4;4EE4;4EE4;
+F9A9;56F9;56F9;56F9;56F9;
+F9AA;5BE7;5BE7;5BE7;5BE7;
+F9AB;5DBA;5DBA;5DBA;5DBA;
+F9AC;601C;601C;601C;601C;
+F9AD;73B2;73B2;73B2;73B2;
+F9AE;7469;7469;7469;7469;
+F9AF;7F9A;7F9A;7F9A;7F9A;
+F9B0;8046;8046;8046;8046;
+F9B1;9234;9234;9234;9234;
+F9B2;96F6;96F6;96F6;96F6;
+F9B3;9748;9748;9748;9748;
+F9B4;9818;9818;9818;9818;
+F9B5;4F8B;4F8B;4F8B;4F8B;
+F9B6;79AE;79AE;79AE;79AE;
+F9B7;91B4;91B4;91B4;91B4;
+F9B8;96B8;96B8;96B8;96B8;
+F9B9;60E1;60E1;60E1;60E1;
+F9BA;4E86;4E86;4E86;4E86;
+F9BB;50DA;50DA;50DA;50DA;
+F9BC;5BEE;5BEE;5BEE;5BEE;
+F9BD;5C3F;5C3F;5C3F;5C3F;
+F9BE;6599;6599;6599;6599;
+F9BF;6A02;6A02;6A02;6A02;
+F9C0;71CE;71CE;71CE;71CE;
+F9C1;7642;7642;7642;7642;
+F9C2;84FC;84FC;84FC;84FC;
+F9C3;907C;907C;907C;907C;
+F9C4;9F8D;9F8D;9F8D;9F8D;
+F9C5;6688;6688;6688;6688;
+F9C6;962E;962E;962E;962E;
+F9C7;5289;5289;5289;5289;
+F9C8;677B;677B;677B;677B;
+F9C9;67F3;67F3;67F3;67F3;
+F9CA;6D41;6D41;6D41;6D41;
+F9CB;6E9C;6E9C;6E9C;6E9C;
+F9CC;7409;7409;7409;7409;
+F9CD;7559;7559;7559;7559;
+F9CE;786B;786B;786B;786B;
+F9CF;7D10;7D10;7D10;7D10;
+F9D0;985E;985E;985E;985E;
+F9D1;516D;516D;516D;516D;
+F9D2;622E;622E;622E;622E;
+F9D3;9678;9678;9678;9678;
+F9D4;502B;502B;502B;502B;
+F9D5;5D19;5D19;5D19;5D19;
+F9D6;6DEA;6DEA;6DEA;6DEA;
+F9D7;8F2A;8F2A;8F2A;8F2A;
+F9D8;5F8B;5F8B;5F8B;5F8B;
+F9D9;6144;6144;6144;6144;
+F9DA;6817;6817;6817;6817;
+F9DB;7387;7387;7387;7387;
+F9DC;9686;9686;9686;9686;
+F9DD;5229;5229;5229;5229;
+F9DE;540F;540F;540F;540F;
+F9DF;5C65;5C65;5C65;5C65;
+F9E0;6613;6613;6613;6613;
+F9E1;674E;674E;674E;674E;
+F9E2;68A8;68A8;68A8;68A8;
+F9E3;6CE5;6CE5;6CE5;6CE5;
+F9E4;7406;7406;7406;7406;
+F9E5;75E2;75E2;75E2;75E2;
+F9E6;7F79;7F79;7F79;7F79;
+F9E7;88CF;88CF;88CF;88CF;
+F9E8;88E1;88E1;88E1;88E1;
+F9E9;91CC;91CC;91CC;91CC;
+F9EA;96E2;96E2;96E2;96E2;
+F9EB;533F;533F;533F;533F;
+F9EC;6EBA;6EBA;6EBA;6EBA;
+F9ED;541D;541D;541D;541D;
+F9EE;71D0;71D0;71D0;71D0;
+F9EF;7498;7498;7498;7498;
+F9F0;85FA;85FA;85FA;85FA;
+F9F1;96A3;96A3;96A3;96A3;
+F9F2;9C57;9C57;9C57;9C57;
+F9F3;9E9F;9E9F;9E9F;9E9F;
+F9F4;6797;6797;6797;6797;
+F9F5;6DCB;6DCB;6DCB;6DCB;
+F9F6;81E8;81E8;81E8;81E8;
+F9F7;7ACB;7ACB;7ACB;7ACB;
+F9F8;7B20;7B20;7B20;7B20;
+F9F9;7C92;7C92;7C92;7C92;
+F9FA;72C0;72C0;72C0;72C0;
+F9FB;7099;7099;7099;7099;
+F9FC;8B58;8B58;8B58;8B58;
+F9FD;4EC0;4EC0;4EC0;4EC0;
+F9FE;8336;8336;8336;8336;
+F9FF;523A;523A;523A;523A;
+FA00;5207;5207;5207;5207;
+FA01;5EA6;5EA6;5EA6;5EA6;
+FA02;62D3;62D3;62D3;62D3;
+FA03;7CD6;7CD6;7CD6;7CD6;
+FA04;5B85;5B85;5B85;5B85;
+FA05;6D1E;6D1E;6D1E;6D1E;
+FA06;66B4;66B4;66B4;66B4;
+FA07;8F3B;8F3B;8F3B;8F3B;
+FA08;884C;884C;884C;884C;
+FA09;964D;964D;964D;964D;
+FA0A;898B;898B;898B;898B;
+FA0B;5ED3;5ED3;5ED3;5ED3;
+FA0C;5140;5140;5140;5140;
+FA0D;55C0;55C0;55C0;55C0;
+FA10;585A;585A;585A;585A;
+FA12;6674;6674;6674;6674;
+FA15;51DE;51DE;51DE;51DE;
+FA16;732A;732A;732A;732A;
+FA17;76CA;76CA;76CA;76CA;
+FA18;793C;793C;793C;793C;
+FA19;795E;795E;795E;795E;
+FA1A;7965;7965;7965;7965;
+FA1B;798F;798F;798F;798F;
+FA1C;9756;9756;9756;9756;
+FA1D;7CBE;7CBE;7CBE;7CBE;
+FA1E;7FBD;7FBD;7FBD;7FBD;
+FA20;8612;8612;8612;8612;
+FA22;8AF8;8AF8;8AF8;8AF8;
+FA25;9038;9038;9038;9038;
+FA26;90FD;90FD;90FD;90FD;
+FA2A;98EF;98EF;98EF;98EF;
+FA2B;98FC;98FC;98FC;98FC;
+FA2C;9928;9928;9928;9928;
+FA2D;9DB4;9DB4;9DB4;9DB4;
+FA30;4FAE;4FAE;4FAE;4FAE;
+FA31;50E7;50E7;50E7;50E7;
+FA32;514D;514D;514D;514D;
+FA33;52C9;52C9;52C9;52C9;
+FA34;52E4;52E4;52E4;52E4;
+FA35;5351;5351;5351;5351;
+FA36;559D;559D;559D;559D;
+FA37;5606;5606;5606;5606;
+FA38;5668;5668;5668;5668;
+FA39;5840;5840;5840;5840;
+FA3A;58A8;58A8;58A8;58A8;
+FA3B;5C64;5C64;5C64;5C64;
+FA3C;5C6E;5C6E;5C6E;5C6E;
+FA3D;6094;6094;6094;6094;
+FA3E;6168;6168;6168;6168;
+FA3F;618E;618E;618E;618E;
+FA40;61F2;61F2;61F2;61F2;
+FA41;654F;654F;654F;654F;
+FA42;65E2;65E2;65E2;65E2;
+FA43;6691;6691;6691;6691;
+FA44;6885;6885;6885;6885;
+FA45;6D77;6D77;6D77;6D77;
+FA46;6E1A;6E1A;6E1A;6E1A;
+FA47;6F22;6F22;6F22;6F22;
+FA48;716E;716E;716E;716E;
+FA49;722B;722B;722B;722B;
+FA4A;7422;7422;7422;7422;
+FA4B;7891;7891;7891;7891;
+FA4C;793E;793E;793E;793E;
+FA4D;7949;7949;7949;7949;
+FA4E;7948;7948;7948;7948;
+FA4F;7950;7950;7950;7950;
+FA50;7956;7956;7956;7956;
+FA51;795D;795D;795D;795D;
+FA52;798D;798D;798D;798D;
+FA53;798E;798E;798E;798E;
+FA54;7A40;7A40;7A40;7A40;
+FA55;7A81;7A81;7A81;7A81;
+FA56;7BC0;7BC0;7BC0;7BC0;
+FA57;7DF4;7DF4;7DF4;7DF4;
+FA58;7E09;7E09;7E09;7E09;
+FA59;7E41;7E41;7E41;7E41;
+FA5A;7F72;7F72;7F72;7F72;
+FA5B;8005;8005;8005;8005;
+FA5C;81ED;81ED;81ED;81ED;
+FA5D;8279;8279;8279;8279;
+FA5E;8279;8279;8279;8279;
+FA5F;8457;8457;8457;8457;
+FA60;8910;8910;8910;8910;
+FA61;8996;8996;8996;8996;
+FA62;8B01;8B01;8B01;8B01;
+FA63;8B39;8B39;8B39;8B39;
+FA64;8CD3;8CD3;8CD3;8CD3;
+FA65;8D08;8D08;8D08;8D08;
+FA66;8FB6;8FB6;8FB6;8FB6;
+FA67;9038;9038;9038;9038;
+FA68;96E3;96E3;96E3;96E3;
+FA69;97FF;97FF;97FF;97FF;
+FA6A;983B;983B;983B;983B;
+FA70;4E26;4E26;4E26;4E26;
+FA71;51B5;51B5;51B5;51B5;
+FA72;5168;5168;5168;5168;
+FA73;4F80;4F80;4F80;4F80;
+FA74;5145;5145;5145;5145;
+FA75;5180;5180;5180;5180;
+FA76;52C7;52C7;52C7;52C7;
+FA77;52FA;52FA;52FA;52FA;
+FA78;559D;559D;559D;559D;
+FA79;5555;5555;5555;5555;
+FA7A;5599;5599;5599;5599;
+FA7B;55E2;55E2;55E2;55E2;
+FA7C;585A;585A;585A;585A;
+FA7D;58B3;58B3;58B3;58B3;
+FA7E;5944;5944;5944;5944;
+FA7F;5954;5954;5954;5954;
+FA80;5A62;5A62;5A62;5A62;
+FA81;5B28;5B28;5B28;5B28;
+FA82;5ED2;5ED2;5ED2;5ED2;
+FA83;5ED9;5ED9;5ED9;5ED9;
+FA84;5F69;5F69;5F69;5F69;
+FA85;5FAD;5FAD;5FAD;5FAD;
+FA86;60D8;60D8;60D8;60D8;
+FA87;614E;614E;614E;614E;
+FA88;6108;6108;6108;6108;
+FA89;618E;618E;618E;618E;
+FA8A;6160;6160;6160;6160;
+FA8B;61F2;61F2;61F2;61F2;
+FA8C;6234;6234;6234;6234;
+FA8D;63C4;63C4;63C4;63C4;
+FA8E;641C;641C;641C;641C;
+FA8F;6452;6452;6452;6452;
+FA90;6556;6556;6556;6556;
+FA91;6674;6674;6674;6674;
+FA92;6717;6717;6717;6717;
+FA93;671B;671B;671B;671B;
+FA94;6756;6756;6756;6756;
+FA95;6B79;6B79;6B79;6B79;
+FA96;6BBA;6BBA;6BBA;6BBA;
+FA97;6D41;6D41;6D41;6D41;
+FA98;6EDB;6EDB;6EDB;6EDB;
+FA99;6ECB;6ECB;6ECB;6ECB;
+FA9A;6F22;6F22;6F22;6F22;
+FA9B;701E;701E;701E;701E;
+FA9C;716E;716E;716E;716E;
+FA9D;77A7;77A7;77A7;77A7;
+FA9E;7235;7235;7235;7235;
+FA9F;72AF;72AF;72AF;72AF;
+FAA0;732A;732A;732A;732A;
+FAA1;7471;7471;7471;7471;
+FAA2;7506;7506;7506;7506;
+FAA3;753B;753B;753B;753B;
+FAA4;761D;761D;761D;761D;
+FAA5;761F;761F;761F;761F;
+FAA6;76CA;76CA;76CA;76CA;
+FAA7;76DB;76DB;76DB;76DB;
+FAA8;76F4;76F4;76F4;76F4;
+FAA9;774A;774A;774A;774A;
+FAAA;7740;7740;7740;7740;
+FAAB;78CC;78CC;78CC;78CC;
+FAAC;7AB1;7AB1;7AB1;7AB1;
+FAAD;7BC0;7BC0;7BC0;7BC0;
+FAAE;7C7B;7C7B;7C7B;7C7B;
+FAAF;7D5B;7D5B;7D5B;7D5B;
+FAB0;7DF4;7DF4;7DF4;7DF4;
+FAB1;7F3E;7F3E;7F3E;7F3E;
+FAB2;8005;8005;8005;8005;
+FAB3;8352;8352;8352;8352;
+FAB4;83EF;83EF;83EF;83EF;
+FAB5;8779;8779;8779;8779;
+FAB6;8941;8941;8941;8941;
+FAB7;8986;8986;8986;8986;
+FAB8;8996;8996;8996;8996;
+FAB9;8ABF;8ABF;8ABF;8ABF;
+FABA;8AF8;8AF8;8AF8;8AF8;
+FABB;8ACB;8ACB;8ACB;8ACB;
+FABC;8B01;8B01;8B01;8B01;
+FABD;8AFE;8AFE;8AFE;8AFE;
+FABE;8AED;8AED;8AED;8AED;
+FABF;8B39;8B39;8B39;8B39;
+FAC0;8B8A;8B8A;8B8A;8B8A;
+FAC1;8D08;8D08;8D08;8D08;
+FAC2;8F38;8F38;8F38;8F38;
+FAC3;9072;9072;9072;9072;
+FAC4;9199;9199;9199;9199;
+FAC5;9276;9276;9276;9276;
+FAC6;967C;967C;967C;967C;
+FAC7;96E3;96E3;96E3;96E3;
+FAC8;9756;9756;9756;9756;
+FAC9;97DB;97DB;97DB;97DB;
+FACA;97FF;97FF;97FF;97FF;
+FACB;980B;980B;980B;980B;
+FACC;983B;983B;983B;983B;
+FACD;9B12;9B12;9B12;9B12;
+FACE;9F9C;9F9C;9F9C;9F9C;
+FACF;2284A;2284A;2284A;2284A;
+FAD0;22844;22844;22844;22844;
+FAD1;233D5;233D5;233D5;233D5;
+FAD2;3B9D;3B9D;3B9D;3B9D;
+FAD3;4018;4018;4018;4018;
+FAD4;4039;4039;4039;4039;
+FAD5;25249;25249;25249;25249;
+FAD6;25CD0;25CD0;25CD0;25CD0;
+FAD7;27ED3;27ED3;27ED3;27ED3;
+FAD8;9F43;9F43;9F43;9F43;
+FAD9;9F8E;9F8E;9F8E;9F8E;
+FB00;FB00;FB00;0066 0066;0066 0066;
+FB01;FB01;FB01;0066 0069;0066 0069;
+FB02;FB02;FB02;0066 006C;0066 006C;
+FB03;FB03;FB03;0066 0066 0069;0066 0066 0069;
+FB04;FB04;FB04;0066 0066 006C;0066 0066 006C;
+FB05;FB05;FB05;0073 0074;0073 0074;
+FB06;FB06;FB06;0073 0074;0073 0074;
+FB13;FB13;FB13;0574 0576;0574 0576;
+FB14;FB14;FB14;0574 0565;0574 0565;
+FB15;FB15;FB15;0574 056B;0574 056B;
+FB16;FB16;FB16;057E 0576;057E 0576;
+FB17;FB17;FB17;0574 056D;0574 056D;
+FB1D;05D9 05B4;05D9 05B4;05D9 05B4;05D9 05B4;
+FB1F;05F2 05B7;05F2 05B7;05F2 05B7;05F2 05B7;
+FB20;FB20;FB20;05E2;05E2;
+FB21;FB21;FB21;05D0;05D0;
+FB22;FB22;FB22;05D3;05D3;
+FB23;FB23;FB23;05D4;05D4;
+FB24;FB24;FB24;05DB;05DB;
+FB25;FB25;FB25;05DC;05DC;
+FB26;FB26;FB26;05DD;05DD;
+FB27;FB27;FB27;05E8;05E8;
+FB28;FB28;FB28;05EA;05EA;
+FB29;FB29;FB29;002B;002B;
+FB2A;05E9 05C1;05E9 05C1;05E9 05C1;05E9 05C1;
+FB2B;05E9 05C2;05E9 05C2;05E9 05C2;05E9 05C2;
+FB2C;05E9 05BC 05C1;05E9 05BC 05C1;05E9 05BC 05C1;05E9 05BC 05C1;
+FB2D;05E9 05BC 05C2;05E9 05BC 05C2;05E9 05BC 05C2;05E9 05BC 05C2;
+FB2E;05D0 05B7;05D0 05B7;05D0 05B7;05D0 05B7;
+FB2F;05D0 05B8;05D0 05B8;05D0 05B8;05D0 05B8;
+FB30;05D0 05BC;05D0 05BC;05D0 05BC;05D0 05BC;
+FB31;05D1 05BC;05D1 05BC;05D1 05BC;05D1 05BC;
+FB32;05D2 05BC;05D2 05BC;05D2 05BC;05D2 05BC;
+FB33;05D3 05BC;05D3 05BC;05D3 05BC;05D3 05BC;
+FB34;05D4 05BC;05D4 05BC;05D4 05BC;05D4 05BC;
+FB35;05D5 05BC;05D5 05BC;05D5 05BC;05D5 05BC;
+FB36;05D6 05BC;05D6 05BC;05D6 05BC;05D6 05BC;
+FB38;05D8 05BC;05D8 05BC;05D8 05BC;05D8 05BC;
+FB39;05D9 05BC;05D9 05BC;05D9 05BC;05D9 05BC;
+FB3A;05DA 05BC;05DA 05BC;05DA 05BC;05DA 05BC;
+FB3B;05DB 05BC;05DB 05BC;05DB 05BC;05DB 05BC;
+FB3C;05DC 05BC;05DC 05BC;05DC 05BC;05DC 05BC;
+FB3E;05DE 05BC;05DE 05BC;05DE 05BC;05DE 05BC;
+FB40;05E0 05BC;05E0 05BC;05E0 05BC;05E0 05BC;
+FB41;05E1 05BC;05E1 05BC;05E1 05BC;05E1 05BC;
+FB43;05E3 05BC;05E3 05BC;05E3 05BC;05E3 05BC;
+FB44;05E4 05BC;05E4 05BC;05E4 05BC;05E4 05BC;
+FB46;05E6 05BC;05E6 05BC;05E6 05BC;05E6 05BC;
+FB47;05E7 05BC;05E7 05BC;05E7 05BC;05E7 05BC;
+FB48;05E8 05BC;05E8 05BC;05E8 05BC;05E8 05BC;
+FB49;05E9 05BC;05E9 05BC;05E9 05BC;05E9 05BC;
+FB4A;05EA 05BC;05EA 05BC;05EA 05BC;05EA 05BC;
+FB4B;05D5 05B9;05D5 05B9;05D5 05B9;05D5 05B9;
+FB4C;05D1 05BF;05D1 05BF;05D1 05BF;05D1 05BF;
+FB4D;05DB 05BF;05DB 05BF;05DB 05BF;05DB 05BF;
+FB4E;05E4 05BF;05E4 05BF;05E4 05BF;05E4 05BF;
+FB4F;FB4F;FB4F;05D0 05DC;05D0 05DC;
+FB50;FB50;FB50;0671;0671;
+FB51;FB51;FB51;0671;0671;
+FB52;FB52;FB52;067B;067B;
+FB53;FB53;FB53;067B;067B;
+FB54;FB54;FB54;067B;067B;
+FB55;FB55;FB55;067B;067B;
+FB56;FB56;FB56;067E;067E;
+FB57;FB57;FB57;067E;067E;
+FB58;FB58;FB58;067E;067E;
+FB59;FB59;FB59;067E;067E;
+FB5A;FB5A;FB5A;0680;0680;
+FB5B;FB5B;FB5B;0680;0680;
+FB5C;FB5C;FB5C;0680;0680;
+FB5D;FB5D;FB5D;0680;0680;
+FB5E;FB5E;FB5E;067A;067A;
+FB5F;FB5F;FB5F;067A;067A;
+FB60;FB60;FB60;067A;067A;
+FB61;FB61;FB61;067A;067A;
+FB62;FB62;FB62;067F;067F;
+FB63;FB63;FB63;067F;067F;
+FB64;FB64;FB64;067F;067F;
+FB65;FB65;FB65;067F;067F;
+FB66;FB66;FB66;0679;0679;
+FB67;FB67;FB67;0679;0679;
+FB68;FB68;FB68;0679;0679;
+FB69;FB69;FB69;0679;0679;
+FB6A;FB6A;FB6A;06A4;06A4;
+FB6B;FB6B;FB6B;06A4;06A4;
+FB6C;FB6C;FB6C;06A4;06A4;
+FB6D;FB6D;FB6D;06A4;06A4;
+FB6E;FB6E;FB6E;06A6;06A6;
+FB6F;FB6F;FB6F;06A6;06A6;
+FB70;FB70;FB70;06A6;06A6;
+FB71;FB71;FB71;06A6;06A6;
+FB72;FB72;FB72;0684;0684;
+FB73;FB73;FB73;0684;0684;
+FB74;FB74;FB74;0684;0684;
+FB75;FB75;FB75;0684;0684;
+FB76;FB76;FB76;0683;0683;
+FB77;FB77;FB77;0683;0683;
+FB78;FB78;FB78;0683;0683;
+FB79;FB79;FB79;0683;0683;
+FB7A;FB7A;FB7A;0686;0686;
+FB7B;FB7B;FB7B;0686;0686;
+FB7C;FB7C;FB7C;0686;0686;
+FB7D;FB7D;FB7D;0686;0686;
+FB7E;FB7E;FB7E;0687;0687;
+FB7F;FB7F;FB7F;0687;0687;
+FB80;FB80;FB80;0687;0687;
+FB81;FB81;FB81;0687;0687;
+FB82;FB82;FB82;068D;068D;
+FB83;FB83;FB83;068D;068D;
+FB84;FB84;FB84;068C;068C;
+FB85;FB85;FB85;068C;068C;
+FB86;FB86;FB86;068E;068E;
+FB87;FB87;FB87;068E;068E;
+FB88;FB88;FB88;0688;0688;
+FB89;FB89;FB89;0688;0688;
+FB8A;FB8A;FB8A;0698;0698;
+FB8B;FB8B;FB8B;0698;0698;
+FB8C;FB8C;FB8C;0691;0691;
+FB8D;FB8D;FB8D;0691;0691;
+FB8E;FB8E;FB8E;06A9;06A9;
+FB8F;FB8F;FB8F;06A9;06A9;
+FB90;FB90;FB90;06A9;06A9;
+FB91;FB91;FB91;06A9;06A9;
+FB92;FB92;FB92;06AF;06AF;
+FB93;FB93;FB93;06AF;06AF;
+FB94;FB94;FB94;06AF;06AF;
+FB95;FB95;FB95;06AF;06AF;
+FB96;FB96;FB96;06B3;06B3;
+FB97;FB97;FB97;06B3;06B3;
+FB98;FB98;FB98;06B3;06B3;
+FB99;FB99;FB99;06B3;06B3;
+FB9A;FB9A;FB9A;06B1;06B1;
+FB9B;FB9B;FB9B;06B1;06B1;
+FB9C;FB9C;FB9C;06B1;06B1;
+FB9D;FB9D;FB9D;06B1;06B1;
+FB9E;FB9E;FB9E;06BA;06BA;
+FB9F;FB9F;FB9F;06BA;06BA;
+FBA0;FBA0;FBA0;06BB;06BB;
+FBA1;FBA1;FBA1;06BB;06BB;
+FBA2;FBA2;FBA2;06BB;06BB;
+FBA3;FBA3;FBA3;06BB;06BB;
+FBA4;FBA4;FBA4;06C0;06D5 0654;
+FBA5;FBA5;FBA5;06C0;06D5 0654;
+FBA6;FBA6;FBA6;06C1;06C1;
+FBA7;FBA7;FBA7;06C1;06C1;
+FBA8;FBA8;FBA8;06C1;06C1;
+FBA9;FBA9;FBA9;06C1;06C1;
+FBAA;FBAA;FBAA;06BE;06BE;
+FBAB;FBAB;FBAB;06BE;06BE;
+FBAC;FBAC;FBAC;06BE;06BE;
+FBAD;FBAD;FBAD;06BE;06BE;
+FBAE;FBAE;FBAE;06D2;06D2;
+FBAF;FBAF;FBAF;06D2;06D2;
+FBB0;FBB0;FBB0;06D3;06D2 0654;
+FBB1;FBB1;FBB1;06D3;06D2 0654;
+FBD3;FBD3;FBD3;06AD;06AD;
+FBD4;FBD4;FBD4;06AD;06AD;
+FBD5;FBD5;FBD5;06AD;06AD;
+FBD6;FBD6;FBD6;06AD;06AD;
+FBD7;FBD7;FBD7;06C7;06C7;
+FBD8;FBD8;FBD8;06C7;06C7;
+FBD9;FBD9;FBD9;06C6;06C6;
+FBDA;FBDA;FBDA;06C6;06C6;
+FBDB;FBDB;FBDB;06C8;06C8;
+FBDC;FBDC;FBDC;06C8;06C8;
+FBDD;FBDD;FBDD;06C7 0674;06C7 0674;
+FBDE;FBDE;FBDE;06CB;06CB;
+FBDF;FBDF;FBDF;06CB;06CB;
+FBE0;FBE0;FBE0;06C5;06C5;
+FBE1;FBE1;FBE1;06C5;06C5;
+FBE2;FBE2;FBE2;06C9;06C9;
+FBE3;FBE3;FBE3;06C9;06C9;
+FBE4;FBE4;FBE4;06D0;06D0;
+FBE5;FBE5;FBE5;06D0;06D0;
+FBE6;FBE6;FBE6;06D0;06D0;
+FBE7;FBE7;FBE7;06D0;06D0;
+FBE8;FBE8;FBE8;0649;0649;
+FBE9;FBE9;FBE9;0649;0649;
+FBEA;FBEA;FBEA;0626 0627;064A 0654 0627;
+FBEB;FBEB;FBEB;0626 0627;064A 0654 0627;
+FBEC;FBEC;FBEC;0626 06D5;064A 0654 06D5;
+FBED;FBED;FBED;0626 06D5;064A 0654 06D5;
+FBEE;FBEE;FBEE;0626 0648;064A 0654 0648;
+FBEF;FBEF;FBEF;0626 0648;064A 0654 0648;
+FBF0;FBF0;FBF0;0626 06C7;064A 0654 06C7;
+FBF1;FBF1;FBF1;0626 06C7;064A 0654 06C7;
+FBF2;FBF2;FBF2;0626 06C6;064A 0654 06C6;
+FBF3;FBF3;FBF3;0626 06C6;064A 0654 06C6;
+FBF4;FBF4;FBF4;0626 06C8;064A 0654 06C8;
+FBF5;FBF5;FBF5;0626 06C8;064A 0654 06C8;
+FBF6;FBF6;FBF6;0626 06D0;064A 0654 06D0;
+FBF7;FBF7;FBF7;0626 06D0;064A 0654 06D0;
+FBF8;FBF8;FBF8;0626 06D0;064A 0654 06D0;
+FBF9;FBF9;FBF9;0626 0649;064A 0654 0649;
+FBFA;FBFA;FBFA;0626 0649;064A 0654 0649;
+FBFB;FBFB;FBFB;0626 0649;064A 0654 0649;
+FBFC;FBFC;FBFC;06CC;06CC;
+FBFD;FBFD;FBFD;06CC;06CC;
+FBFE;FBFE;FBFE;06CC;06CC;
+FBFF;FBFF;FBFF;06CC;06CC;
+FC00;FC00;FC00;0626 062C;064A 0654 062C;
+FC01;FC01;FC01;0626 062D;064A 0654 062D;
+FC02;FC02;FC02;0626 0645;064A 0654 0645;
+FC03;FC03;FC03;0626 0649;064A 0654 0649;
+FC04;FC04;FC04;0626 064A;064A 0654 064A;
+FC05;FC05;FC05;0628 062C;0628 062C;
+FC06;FC06;FC06;0628 062D;0628 062D;
+FC07;FC07;FC07;0628 062E;0628 062E;
+FC08;FC08;FC08;0628 0645;0628 0645;
+FC09;FC09;FC09;0628 0649;0628 0649;
+FC0A;FC0A;FC0A;0628 064A;0628 064A;
+FC0B;FC0B;FC0B;062A 062C;062A 062C;
+FC0C;FC0C;FC0C;062A 062D;062A 062D;
+FC0D;FC0D;FC0D;062A 062E;062A 062E;
+FC0E;FC0E;FC0E;062A 0645;062A 0645;
+FC0F;FC0F;FC0F;062A 0649;062A 0649;
+FC10;FC10;FC10;062A 064A;062A 064A;
+FC11;FC11;FC11;062B 062C;062B 062C;
+FC12;FC12;FC12;062B 0645;062B 0645;
+FC13;FC13;FC13;062B 0649;062B 0649;
+FC14;FC14;FC14;062B 064A;062B 064A;
+FC15;FC15;FC15;062C 062D;062C 062D;
+FC16;FC16;FC16;062C 0645;062C 0645;
+FC17;FC17;FC17;062D 062C;062D 062C;
+FC18;FC18;FC18;062D 0645;062D 0645;
+FC19;FC19;FC19;062E 062C;062E 062C;
+FC1A;FC1A;FC1A;062E 062D;062E 062D;
+FC1B;FC1B;FC1B;062E 0645;062E 0645;
+FC1C;FC1C;FC1C;0633 062C;0633 062C;
+FC1D;FC1D;FC1D;0633 062D;0633 062D;
+FC1E;FC1E;FC1E;0633 062E;0633 062E;
+FC1F;FC1F;FC1F;0633 0645;0633 0645;
+FC20;FC20;FC20;0635 062D;0635 062D;
+FC21;FC21;FC21;0635 0645;0635 0645;
+FC22;FC22;FC22;0636 062C;0636 062C;
+FC23;FC23;FC23;0636 062D;0636 062D;
+FC24;FC24;FC24;0636 062E;0636 062E;
+FC25;FC25;FC25;0636 0645;0636 0645;
+FC26;FC26;FC26;0637 062D;0637 062D;
+FC27;FC27;FC27;0637 0645;0637 0645;
+FC28;FC28;FC28;0638 0645;0638 0645;
+FC29;FC29;FC29;0639 062C;0639 062C;
+FC2A;FC2A;FC2A;0639 0645;0639 0645;
+FC2B;FC2B;FC2B;063A 062C;063A 062C;
+FC2C;FC2C;FC2C;063A 0645;063A 0645;
+FC2D;FC2D;FC2D;0641 062C;0641 062C;
+FC2E;FC2E;FC2E;0641 062D;0641 062D;
+FC2F;FC2F;FC2F;0641 062E;0641 062E;
+FC30;FC30;FC30;0641 0645;0641 0645;
+FC31;FC31;FC31;0641 0649;0641 0649;
+FC32;FC32;FC32;0641 064A;0641 064A;
+FC33;FC33;FC33;0642 062D;0642 062D;
+FC34;FC34;FC34;0642 0645;0642 0645;
+FC35;FC35;FC35;0642 0649;0642 0649;
+FC36;FC36;FC36;0642 064A;0642 064A;
+FC37;FC37;FC37;0643 0627;0643 0627;
+FC38;FC38;FC38;0643 062C;0643 062C;
+FC39;FC39;FC39;0643 062D;0643 062D;
+FC3A;FC3A;FC3A;0643 062E;0643 062E;
+FC3B;FC3B;FC3B;0643 0644;0643 0644;
+FC3C;FC3C;FC3C;0643 0645;0643 0645;
+FC3D;FC3D;FC3D;0643 0649;0643 0649;
+FC3E;FC3E;FC3E;0643 064A;0643 064A;
+FC3F;FC3F;FC3F;0644 062C;0644 062C;
+FC40;FC40;FC40;0644 062D;0644 062D;
+FC41;FC41;FC41;0644 062E;0644 062E;
+FC42;FC42;FC42;0644 0645;0644 0645;
+FC43;FC43;FC43;0644 0649;0644 0649;
+FC44;FC44;FC44;0644 064A;0644 064A;
+FC45;FC45;FC45;0645 062C;0645 062C;
+FC46;FC46;FC46;0645 062D;0645 062D;
+FC47;FC47;FC47;0645 062E;0645 062E;
+FC48;FC48;FC48;0645 0645;0645 0645;
+FC49;FC49;FC49;0645 0649;0645 0649;
+FC4A;FC4A;FC4A;0645 064A;0645 064A;
+FC4B;FC4B;FC4B;0646 062C;0646 062C;
+FC4C;FC4C;FC4C;0646 062D;0646 062D;
+FC4D;FC4D;FC4D;0646 062E;0646 062E;
+FC4E;FC4E;FC4E;0646 0645;0646 0645;
+FC4F;FC4F;FC4F;0646 0649;0646 0649;
+FC50;FC50;FC50;0646 064A;0646 064A;
+FC51;FC51;FC51;0647 062C;0647 062C;
+FC52;FC52;FC52;0647 0645;0647 0645;
+FC53;FC53;FC53;0647 0649;0647 0649;
+FC54;FC54;FC54;0647 064A;0647 064A;
+FC55;FC55;FC55;064A 062C;064A 062C;
+FC56;FC56;FC56;064A 062D;064A 062D;
+FC57;FC57;FC57;064A 062E;064A 062E;
+FC58;FC58;FC58;064A 0645;064A 0645;
+FC59;FC59;FC59;064A 0649;064A 0649;
+FC5A;FC5A;FC5A;064A 064A;064A 064A;
+FC5B;FC5B;FC5B;0630 0670;0630 0670;
+FC5C;FC5C;FC5C;0631 0670;0631 0670;
+FC5D;FC5D;FC5D;0649 0670;0649 0670;
+FC5E;FC5E;FC5E;0020 064C 0651;0020 064C 0651;
+FC5F;FC5F;FC5F;0020 064D 0651;0020 064D 0651;
+FC60;FC60;FC60;0020 064E 0651;0020 064E 0651;
+FC61;FC61;FC61;0020 064F 0651;0020 064F 0651;
+FC62;FC62;FC62;0020 0650 0651;0020 0650 0651;
+FC63;FC63;FC63;0020 0651 0670;0020 0651 0670;
+FC64;FC64;FC64;0626 0631;064A 0654 0631;
+FC65;FC65;FC65;0626 0632;064A 0654 0632;
+FC66;FC66;FC66;0626 0645;064A 0654 0645;
+FC67;FC67;FC67;0626 0646;064A 0654 0646;
+FC68;FC68;FC68;0626 0649;064A 0654 0649;
+FC69;FC69;FC69;0626 064A;064A 0654 064A;
+FC6A;FC6A;FC6A;0628 0631;0628 0631;
+FC6B;FC6B;FC6B;0628 0632;0628 0632;
+FC6C;FC6C;FC6C;0628 0645;0628 0645;
+FC6D;FC6D;FC6D;0628 0646;0628 0646;
+FC6E;FC6E;FC6E;0628 0649;0628 0649;
+FC6F;FC6F;FC6F;0628 064A;0628 064A;
+FC70;FC70;FC70;062A 0631;062A 0631;
+FC71;FC71;FC71;062A 0632;062A 0632;
+FC72;FC72;FC72;062A 0645;062A 0645;
+FC73;FC73;FC73;062A 0646;062A 0646;
+FC74;FC74;FC74;062A 0649;062A 0649;
+FC75;FC75;FC75;062A 064A;062A 064A;
+FC76;FC76;FC76;062B 0631;062B 0631;
+FC77;FC77;FC77;062B 0632;062B 0632;
+FC78;FC78;FC78;062B 0645;062B 0645;
+FC79;FC79;FC79;062B 0646;062B 0646;
+FC7A;FC7A;FC7A;062B 0649;062B 0649;
+FC7B;FC7B;FC7B;062B 064A;062B 064A;
+FC7C;FC7C;FC7C;0641 0649;0641 0649;
+FC7D;FC7D;FC7D;0641 064A;0641 064A;
+FC7E;FC7E;FC7E;0642 0649;0642 0649;
+FC7F;FC7F;FC7F;0642 064A;0642 064A;
+FC80;FC80;FC80;0643 0627;0643 0627;
+FC81;FC81;FC81;0643 0644;0643 0644;
+FC82;FC82;FC82;0643 0645;0643 0645;
+FC83;FC83;FC83;0643 0649;0643 0649;
+FC84;FC84;FC84;0643 064A;0643 064A;
+FC85;FC85;FC85;0644 0645;0644 0645;
+FC86;FC86;FC86;0644 0649;0644 0649;
+FC87;FC87;FC87;0644 064A;0644 064A;
+FC88;FC88;FC88;0645 0627;0645 0627;
+FC89;FC89;FC89;0645 0645;0645 0645;
+FC8A;FC8A;FC8A;0646 0631;0646 0631;
+FC8B;FC8B;FC8B;0646 0632;0646 0632;
+FC8C;FC8C;FC8C;0646 0645;0646 0645;
+FC8D;FC8D;FC8D;0646 0646;0646 0646;
+FC8E;FC8E;FC8E;0646 0649;0646 0649;
+FC8F;FC8F;FC8F;0646 064A;0646 064A;
+FC90;FC90;FC90;0649 0670;0649 0670;
+FC91;FC91;FC91;064A 0631;064A 0631;
+FC92;FC92;FC92;064A 0632;064A 0632;
+FC93;FC93;FC93;064A 0645;064A 0645;
+FC94;FC94;FC94;064A 0646;064A 0646;
+FC95;FC95;FC95;064A 0649;064A 0649;
+FC96;FC96;FC96;064A 064A;064A 064A;
+FC97;FC97;FC97;0626 062C;064A 0654 062C;
+FC98;FC98;FC98;0626 062D;064A 0654 062D;
+FC99;FC99;FC99;0626 062E;064A 0654 062E;
+FC9A;FC9A;FC9A;0626 0645;064A 0654 0645;
+FC9B;FC9B;FC9B;0626 0647;064A 0654 0647;
+FC9C;FC9C;FC9C;0628 062C;0628 062C;
+FC9D;FC9D;FC9D;0628 062D;0628 062D;
+FC9E;FC9E;FC9E;0628 062E;0628 062E;
+FC9F;FC9F;FC9F;0628 0645;0628 0645;
+FCA0;FCA0;FCA0;0628 0647;0628 0647;
+FCA1;FCA1;FCA1;062A 062C;062A 062C;
+FCA2;FCA2;FCA2;062A 062D;062A 062D;
+FCA3;FCA3;FCA3;062A 062E;062A 062E;
+FCA4;FCA4;FCA4;062A 0645;062A 0645;
+FCA5;FCA5;FCA5;062A 0647;062A 0647;
+FCA6;FCA6;FCA6;062B 0645;062B 0645;
+FCA7;FCA7;FCA7;062C 062D;062C 062D;
+FCA8;FCA8;FCA8;062C 0645;062C 0645;
+FCA9;FCA9;FCA9;062D 062C;062D 062C;
+FCAA;FCAA;FCAA;062D 0645;062D 0645;
+FCAB;FCAB;FCAB;062E 062C;062E 062C;
+FCAC;FCAC;FCAC;062E 0645;062E 0645;
+FCAD;FCAD;FCAD;0633 062C;0633 062C;
+FCAE;FCAE;FCAE;0633 062D;0633 062D;
+FCAF;FCAF;FCAF;0633 062E;0633 062E;
+FCB0;FCB0;FCB0;0633 0645;0633 0645;
+FCB1;FCB1;FCB1;0635 062D;0635 062D;
+FCB2;FCB2;FCB2;0635 062E;0635 062E;
+FCB3;FCB3;FCB3;0635 0645;0635 0645;
+FCB4;FCB4;FCB4;0636 062C;0636 062C;
+FCB5;FCB5;FCB5;0636 062D;0636 062D;
+FCB6;FCB6;FCB6;0636 062E;0636 062E;
+FCB7;FCB7;FCB7;0636 0645;0636 0645;
+FCB8;FCB8;FCB8;0637 062D;0637 062D;
+FCB9;FCB9;FCB9;0638 0645;0638 0645;
+FCBA;FCBA;FCBA;0639 062C;0639 062C;
+FCBB;FCBB;FCBB;0639 0645;0639 0645;
+FCBC;FCBC;FCBC;063A 062C;063A 062C;
+FCBD;FCBD;FCBD;063A 0645;063A 0645;
+FCBE;FCBE;FCBE;0641 062C;0641 062C;
+FCBF;FCBF;FCBF;0641 062D;0641 062D;
+FCC0;FCC0;FCC0;0641 062E;0641 062E;
+FCC1;FCC1;FCC1;0641 0645;0641 0645;
+FCC2;FCC2;FCC2;0642 062D;0642 062D;
+FCC3;FCC3;FCC3;0642 0645;0642 0645;
+FCC4;FCC4;FCC4;0643 062C;0643 062C;
+FCC5;FCC5;FCC5;0643 062D;0643 062D;
+FCC6;FCC6;FCC6;0643 062E;0643 062E;
+FCC7;FCC7;FCC7;0643 0644;0643 0644;
+FCC8;FCC8;FCC8;0643 0645;0643 0645;
+FCC9;FCC9;FCC9;0644 062C;0644 062C;
+FCCA;FCCA;FCCA;0644 062D;0644 062D;
+FCCB;FCCB;FCCB;0644 062E;0644 062E;
+FCCC;FCCC;FCCC;0644 0645;0644 0645;
+FCCD;FCCD;FCCD;0644 0647;0644 0647;
+FCCE;FCCE;FCCE;0645 062C;0645 062C;
+FCCF;FCCF;FCCF;0645 062D;0645 062D;
+FCD0;FCD0;FCD0;0645 062E;0645 062E;
+FCD1;FCD1;FCD1;0645 0645;0645 0645;
+FCD2;FCD2;FCD2;0646 062C;0646 062C;
+FCD3;FCD3;FCD3;0646 062D;0646 062D;
+FCD4;FCD4;FCD4;0646 062E;0646 062E;
+FCD5;FCD5;FCD5;0646 0645;0646 0645;
+FCD6;FCD6;FCD6;0646 0647;0646 0647;
+FCD7;FCD7;FCD7;0647 062C;0647 062C;
+FCD8;FCD8;FCD8;0647 0645;0647 0645;
+FCD9;FCD9;FCD9;0647 0670;0647 0670;
+FCDA;FCDA;FCDA;064A 062C;064A 062C;
+FCDB;FCDB;FCDB;064A 062D;064A 062D;
+FCDC;FCDC;FCDC;064A 062E;064A 062E;
+FCDD;FCDD;FCDD;064A 0645;064A 0645;
+FCDE;FCDE;FCDE;064A 0647;064A 0647;
+FCDF;FCDF;FCDF;0626 0645;064A 0654 0645;
+FCE0;FCE0;FCE0;0626 0647;064A 0654 0647;
+FCE1;FCE1;FCE1;0628 0645;0628 0645;
+FCE2;FCE2;FCE2;0628 0647;0628 0647;
+FCE3;FCE3;FCE3;062A 0645;062A 0645;
+FCE4;FCE4;FCE4;062A 0647;062A 0647;
+FCE5;FCE5;FCE5;062B 0645;062B 0645;
+FCE6;FCE6;FCE6;062B 0647;062B 0647;
+FCE7;FCE7;FCE7;0633 0645;0633 0645;
+FCE8;FCE8;FCE8;0633 0647;0633 0647;
+FCE9;FCE9;FCE9;0634 0645;0634 0645;
+FCEA;FCEA;FCEA;0634 0647;0634 0647;
+FCEB;FCEB;FCEB;0643 0644;0643 0644;
+FCEC;FCEC;FCEC;0643 0645;0643 0645;
+FCED;FCED;FCED;0644 0645;0644 0645;
+FCEE;FCEE;FCEE;0646 0645;0646 0645;
+FCEF;FCEF;FCEF;0646 0647;0646 0647;
+FCF0;FCF0;FCF0;064A 0645;064A 0645;
+FCF1;FCF1;FCF1;064A 0647;064A 0647;
+FCF2;FCF2;FCF2;0640 064E 0651;0640 064E 0651;
+FCF3;FCF3;FCF3;0640 064F 0651;0640 064F 0651;
+FCF4;FCF4;FCF4;0640 0650 0651;0640 0650 0651;
+FCF5;FCF5;FCF5;0637 0649;0637 0649;
+FCF6;FCF6;FCF6;0637 064A;0637 064A;
+FCF7;FCF7;FCF7;0639 0649;0639 0649;
+FCF8;FCF8;FCF8;0639 064A;0639 064A;
+FCF9;FCF9;FCF9;063A 0649;063A 0649;
+FCFA;FCFA;FCFA;063A 064A;063A 064A;
+FCFB;FCFB;FCFB;0633 0649;0633 0649;
+FCFC;FCFC;FCFC;0633 064A;0633 064A;
+FCFD;FCFD;FCFD;0634 0649;0634 0649;
+FCFE;FCFE;FCFE;0634 064A;0634 064A;
+FCFF;FCFF;FCFF;062D 0649;062D 0649;
+FD00;FD00;FD00;062D 064A;062D 064A;
+FD01;FD01;FD01;062C 0649;062C 0649;
+FD02;FD02;FD02;062C 064A;062C 064A;
+FD03;FD03;FD03;062E 0649;062E 0649;
+FD04;FD04;FD04;062E 064A;062E 064A;
+FD05;FD05;FD05;0635 0649;0635 0649;
+FD06;FD06;FD06;0635 064A;0635 064A;
+FD07;FD07;FD07;0636 0649;0636 0649;
+FD08;FD08;FD08;0636 064A;0636 064A;
+FD09;FD09;FD09;0634 062C;0634 062C;
+FD0A;FD0A;FD0A;0634 062D;0634 062D;
+FD0B;FD0B;FD0B;0634 062E;0634 062E;
+FD0C;FD0C;FD0C;0634 0645;0634 0645;
+FD0D;FD0D;FD0D;0634 0631;0634 0631;
+FD0E;FD0E;FD0E;0633 0631;0633 0631;
+FD0F;FD0F;FD0F;0635 0631;0635 0631;
+FD10;FD10;FD10;0636 0631;0636 0631;
+FD11;FD11;FD11;0637 0649;0637 0649;
+FD12;FD12;FD12;0637 064A;0637 064A;
+FD13;FD13;FD13;0639 0649;0639 0649;
+FD14;FD14;FD14;0639 064A;0639 064A;
+FD15;FD15;FD15;063A 0649;063A 0649;
+FD16;FD16;FD16;063A 064A;063A 064A;
+FD17;FD17;FD17;0633 0649;0633 0649;
+FD18;FD18;FD18;0633 064A;0633 064A;
+FD19;FD19;FD19;0634 0649;0634 0649;
+FD1A;FD1A;FD1A;0634 064A;0634 064A;
+FD1B;FD1B;FD1B;062D 0649;062D 0649;
+FD1C;FD1C;FD1C;062D 064A;062D 064A;
+FD1D;FD1D;FD1D;062C 0649;062C 0649;
+FD1E;FD1E;FD1E;062C 064A;062C 064A;
+FD1F;FD1F;FD1F;062E 0649;062E 0649;
+FD20;FD20;FD20;062E 064A;062E 064A;
+FD21;FD21;FD21;0635 0649;0635 0649;
+FD22;FD22;FD22;0635 064A;0635 064A;
+FD23;FD23;FD23;0636 0649;0636 0649;
+FD24;FD24;FD24;0636 064A;0636 064A;
+FD25;FD25;FD25;0634 062C;0634 062C;
+FD26;FD26;FD26;0634 062D;0634 062D;
+FD27;FD27;FD27;0634 062E;0634 062E;
+FD28;FD28;FD28;0634 0645;0634 0645;
+FD29;FD29;FD29;0634 0631;0634 0631;
+FD2A;FD2A;FD2A;0633 0631;0633 0631;
+FD2B;FD2B;FD2B;0635 0631;0635 0631;
+FD2C;FD2C;FD2C;0636 0631;0636 0631;
+FD2D;FD2D;FD2D;0634 062C;0634 062C;
+FD2E;FD2E;FD2E;0634 062D;0634 062D;
+FD2F;FD2F;FD2F;0634 062E;0634 062E;
+FD30;FD30;FD30;0634 0645;0634 0645;
+FD31;FD31;FD31;0633 0647;0633 0647;
+FD32;FD32;FD32;0634 0647;0634 0647;
+FD33;FD33;FD33;0637 0645;0637 0645;
+FD34;FD34;FD34;0633 062C;0633 062C;
+FD35;FD35;FD35;0633 062D;0633 062D;
+FD36;FD36;FD36;0633 062E;0633 062E;
+FD37;FD37;FD37;0634 062C;0634 062C;
+FD38;FD38;FD38;0634 062D;0634 062D;
+FD39;FD39;FD39;0634 062E;0634 062E;
+FD3A;FD3A;FD3A;0637 0645;0637 0645;
+FD3B;FD3B;FD3B;0638 0645;0638 0645;
+FD3C;FD3C;FD3C;0627 064B;0627 064B;
+FD3D;FD3D;FD3D;0627 064B;0627 064B;
+FD50;FD50;FD50;062A 062C 0645;062A 062C 0645;
+FD51;FD51;FD51;062A 062D 062C;062A 062D 062C;
+FD52;FD52;FD52;062A 062D 062C;062A 062D 062C;
+FD53;FD53;FD53;062A 062D 0645;062A 062D 0645;
+FD54;FD54;FD54;062A 062E 0645;062A 062E 0645;
+FD55;FD55;FD55;062A 0645 062C;062A 0645 062C;
+FD56;FD56;FD56;062A 0645 062D;062A 0645 062D;
+FD57;FD57;FD57;062A 0645 062E;062A 0645 062E;
+FD58;FD58;FD58;062C 0645 062D;062C 0645 062D;
+FD59;FD59;FD59;062C 0645 062D;062C 0645 062D;
+FD5A;FD5A;FD5A;062D 0645 064A;062D 0645 064A;
+FD5B;FD5B;FD5B;062D 0645 0649;062D 0645 0649;
+FD5C;FD5C;FD5C;0633 062D 062C;0633 062D 062C;
+FD5D;FD5D;FD5D;0633 062C 062D;0633 062C 062D;
+FD5E;FD5E;FD5E;0633 062C 0649;0633 062C 0649;
+FD5F;FD5F;FD5F;0633 0645 062D;0633 0645 062D;
+FD60;FD60;FD60;0633 0645 062D;0633 0645 062D;
+FD61;FD61;FD61;0633 0645 062C;0633 0645 062C;
+FD62;FD62;FD62;0633 0645 0645;0633 0645 0645;
+FD63;FD63;FD63;0633 0645 0645;0633 0645 0645;
+FD64;FD64;FD64;0635 062D 062D;0635 062D 062D;
+FD65;FD65;FD65;0635 062D 062D;0635 062D 062D;
+FD66;FD66;FD66;0635 0645 0645;0635 0645 0645;
+FD67;FD67;FD67;0634 062D 0645;0634 062D 0645;
+FD68;FD68;FD68;0634 062D 0645;0634 062D 0645;
+FD69;FD69;FD69;0634 062C 064A;0634 062C 064A;
+FD6A;FD6A;FD6A;0634 0645 062E;0634 0645 062E;
+FD6B;FD6B;FD6B;0634 0645 062E;0634 0645 062E;
+FD6C;FD6C;FD6C;0634 0645 0645;0634 0645 0645;
+FD6D;FD6D;FD6D;0634 0645 0645;0634 0645 0645;
+FD6E;FD6E;FD6E;0636 062D 0649;0636 062D 0649;
+FD6F;FD6F;FD6F;0636 062E 0645;0636 062E 0645;
+FD70;FD70;FD70;0636 062E 0645;0636 062E 0645;
+FD71;FD71;FD71;0637 0645 062D;0637 0645 062D;
+FD72;FD72;FD72;0637 0645 062D;0637 0645 062D;
+FD73;FD73;FD73;0637 0645 0645;0637 0645 0645;
+FD74;FD74;FD74;0637 0645 064A;0637 0645 064A;
+FD75;FD75;FD75;0639 062C 0645;0639 062C 0645;
+FD76;FD76;FD76;0639 0645 0645;0639 0645 0645;
+FD77;FD77;FD77;0639 0645 0645;0639 0645 0645;
+FD78;FD78;FD78;0639 0645 0649;0639 0645 0649;
+FD79;FD79;FD79;063A 0645 0645;063A 0645 0645;
+FD7A;FD7A;FD7A;063A 0645 064A;063A 0645 064A;
+FD7B;FD7B;FD7B;063A 0645 0649;063A 0645 0649;
+FD7C;FD7C;FD7C;0641 062E 0645;0641 062E 0645;
+FD7D;FD7D;FD7D;0641 062E 0645;0641 062E 0645;
+FD7E;FD7E;FD7E;0642 0645 062D;0642 0645 062D;
+FD7F;FD7F;FD7F;0642 0645 0645;0642 0645 0645;
+FD80;FD80;FD80;0644 062D 0645;0644 062D 0645;
+FD81;FD81;FD81;0644 062D 064A;0644 062D 064A;
+FD82;FD82;FD82;0644 062D 0649;0644 062D 0649;
+FD83;FD83;FD83;0644 062C 062C;0644 062C 062C;
+FD84;FD84;FD84;0644 062C 062C;0644 062C 062C;
+FD85;FD85;FD85;0644 062E 0645;0644 062E 0645;
+FD86;FD86;FD86;0644 062E 0645;0644 062E 0645;
+FD87;FD87;FD87;0644 0645 062D;0644 0645 062D;
+FD88;FD88;FD88;0644 0645 062D;0644 0645 062D;
+FD89;FD89;FD89;0645 062D 062C;0645 062D 062C;
+FD8A;FD8A;FD8A;0645 062D 0645;0645 062D 0645;
+FD8B;FD8B;FD8B;0645 062D 064A;0645 062D 064A;
+FD8C;FD8C;FD8C;0645 062C 062D;0645 062C 062D;
+FD8D;FD8D;FD8D;0645 062C 0645;0645 062C 0645;
+FD8E;FD8E;FD8E;0645 062E 062C;0645 062E 062C;
+FD8F;FD8F;FD8F;0645 062E 0645;0645 062E 0645;
+FD92;FD92;FD92;0645 062C 062E;0645 062C 062E;
+FD93;FD93;FD93;0647 0645 062C;0647 0645 062C;
+FD94;FD94;FD94;0647 0645 0645;0647 0645 0645;
+FD95;FD95;FD95;0646 062D 0645;0646 062D 0645;
+FD96;FD96;FD96;0646 062D 0649;0646 062D 0649;
+FD97;FD97;FD97;0646 062C 0645;0646 062C 0645;
+FD98;FD98;FD98;0646 062C 0645;0646 062C 0645;
+FD99;FD99;FD99;0646 062C 0649;0646 062C 0649;
+FD9A;FD9A;FD9A;0646 0645 064A;0646 0645 064A;
+FD9B;FD9B;FD9B;0646 0645 0649;0646 0645 0649;
+FD9C;FD9C;FD9C;064A 0645 0645;064A 0645 0645;
+FD9D;FD9D;FD9D;064A 0645 0645;064A 0645 0645;
+FD9E;FD9E;FD9E;0628 062E 064A;0628 062E 064A;
+FD9F;FD9F;FD9F;062A 062C 064A;062A 062C 064A;
+FDA0;FDA0;FDA0;062A 062C 0649;062A 062C 0649;
+FDA1;FDA1;FDA1;062A 062E 064A;062A 062E 064A;
+FDA2;FDA2;FDA2;062A 062E 0649;062A 062E 0649;
+FDA3;FDA3;FDA3;062A 0645 064A;062A 0645 064A;
+FDA4;FDA4;FDA4;062A 0645 0649;062A 0645 0649;
+FDA5;FDA5;FDA5;062C 0645 064A;062C 0645 064A;
+FDA6;FDA6;FDA6;062C 062D 0649;062C 062D 0649;
+FDA7;FDA7;FDA7;062C 0645 0649;062C 0645 0649;
+FDA8;FDA8;FDA8;0633 062E 0649;0633 062E 0649;
+FDA9;FDA9;FDA9;0635 062D 064A;0635 062D 064A;
+FDAA;FDAA;FDAA;0634 062D 064A;0634 062D 064A;
+FDAB;FDAB;FDAB;0636 062D 064A;0636 062D 064A;
+FDAC;FDAC;FDAC;0644 062C 064A;0644 062C 064A;
+FDAD;FDAD;FDAD;0644 0645 064A;0644 0645 064A;
+FDAE;FDAE;FDAE;064A 062D 064A;064A 062D 064A;
+FDAF;FDAF;FDAF;064A 062C 064A;064A 062C 064A;
+FDB0;FDB0;FDB0;064A 0645 064A;064A 0645 064A;
+FDB1;FDB1;FDB1;0645 0645 064A;0645 0645 064A;
+FDB2;FDB2;FDB2;0642 0645 064A;0642 0645 064A;
+FDB3;FDB3;FDB3;0646 062D 064A;0646 062D 064A;
+FDB4;FDB4;FDB4;0642 0645 062D;0642 0645 062D;
+FDB5;FDB5;FDB5;0644 062D 0645;0644 062D 0645;
+FDB6;FDB6;FDB6;0639 0645 064A;0639 0645 064A;
+FDB7;FDB7;FDB7;0643 0645 064A;0643 0645 064A;
+FDB8;FDB8;FDB8;0646 062C 062D;0646 062C 062D;
+FDB9;FDB9;FDB9;0645 062E 064A;0645 062E 064A;
+FDBA;FDBA;FDBA;0644 062C 0645;0644 062C 0645;
+FDBB;FDBB;FDBB;0643 0645 0645;0643 0645 0645;
+FDBC;FDBC;FDBC;0644 062C 0645;0644 062C 0645;
+FDBD;FDBD;FDBD;0646 062C 062D;0646 062C 062D;
+FDBE;FDBE;FDBE;062C 062D 064A;062C 062D 064A;
+FDBF;FDBF;FDBF;062D 062C 064A;062D 062C 064A;
+FDC0;FDC0;FDC0;0645 062C 064A;0645 062C 064A;
+FDC1;FDC1;FDC1;0641 0645 064A;0641 0645 064A;
+FDC2;FDC2;FDC2;0628 062D 064A;0628 062D 064A;
+FDC3;FDC3;FDC3;0643 0645 0645;0643 0645 0645;
+FDC4;FDC4;FDC4;0639 062C 0645;0639 062C 0645;
+FDC5;FDC5;FDC5;0635 0645 0645;0635 0645 0645;
+FDC6;FDC6;FDC6;0633 062E 064A;0633 062E 064A;
+FDC7;FDC7;FDC7;0646 062C 064A;0646 062C 064A;
+FDF0;FDF0;FDF0;0635 0644 06D2;0635 0644 06D2;
+FDF1;FDF1;FDF1;0642 0644 06D2;0642 0644 06D2;
+FDF2;FDF2;FDF2;0627 0644 0644 0647;0627 0644 0644 0647;
+FDF3;FDF3;FDF3;0627 0643 0628 0631;0627 0643 0628 0631;
+FDF4;FDF4;FDF4;0645 062D 0645 062F;0645 062D 0645 062F;
+FDF5;FDF5;FDF5;0635 0644 0639 0645;0635 0644 0639 0645;
+FDF6;FDF6;FDF6;0631 0633 0648 0644;0631 0633 0648 0644;
+FDF7;FDF7;FDF7;0639 0644 064A 0647;0639 0644 064A 0647;
+FDF8;FDF8;FDF8;0648 0633 0644 0645;0648 0633 0644 0645;
+FDF9;FDF9;FDF9;0635 0644 0649;0635 0644 0649;
+FDFA;FDFA;FDFA;0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;
+FDFB;FDFB;FDFB;062C 0644 0020 062C 0644 0627 0644 0647;062C 0644 0020 062C 0644 0627 0644 0647;
+FDFC;FDFC;FDFC;0631 06CC 0627 0644;0631 06CC 0627 0644;
+FE10;FE10;FE10;002C;002C;
+FE11;FE11;FE11;3001;3001;
+FE12;FE12;FE12;3002;3002;
+FE13;FE13;FE13;003A;003A;
+FE14;FE14;FE14;003B;003B;
+FE15;FE15;FE15;0021;0021;
+FE16;FE16;FE16;003F;003F;
+FE17;FE17;FE17;3016;3016;
+FE18;FE18;FE18;3017;3017;
+FE19;FE19;FE19;002E 002E 002E;002E 002E 002E;
+FE30;FE30;FE30;002E 002E;002E 002E;
+FE31;FE31;FE31;2014;2014;
+FE32;FE32;FE32;2013;2013;
+FE33;FE33;FE33;005F;005F;
+FE34;FE34;FE34;005F;005F;
+FE35;FE35;FE35;0028;0028;
+FE36;FE36;FE36;0029;0029;
+FE37;FE37;FE37;007B;007B;
+FE38;FE38;FE38;007D;007D;
+FE39;FE39;FE39;3014;3014;
+FE3A;FE3A;FE3A;3015;3015;
+FE3B;FE3B;FE3B;3010;3010;
+FE3C;FE3C;FE3C;3011;3011;
+FE3D;FE3D;FE3D;300A;300A;
+FE3E;FE3E;FE3E;300B;300B;
+FE3F;FE3F;FE3F;3008;3008;
+FE40;FE40;FE40;3009;3009;
+FE41;FE41;FE41;300C;300C;
+FE42;FE42;FE42;300D;300D;
+FE43;FE43;FE43;300E;300E;
+FE44;FE44;FE44;300F;300F;
+FE47;FE47;FE47;005B;005B;
+FE48;FE48;FE48;005D;005D;
+FE49;FE49;FE49;0020 0305;0020 0305;
+FE4A;FE4A;FE4A;0020 0305;0020 0305;
+FE4B;FE4B;FE4B;0020 0305;0020 0305;
+FE4C;FE4C;FE4C;0020 0305;0020 0305;
+FE4D;FE4D;FE4D;005F;005F;
+FE4E;FE4E;FE4E;005F;005F;
+FE4F;FE4F;FE4F;005F;005F;
+FE50;FE50;FE50;002C;002C;
+FE51;FE51;FE51;3001;3001;
+FE52;FE52;FE52;002E;002E;
+FE54;FE54;FE54;003B;003B;
+FE55;FE55;FE55;003A;003A;
+FE56;FE56;FE56;003F;003F;
+FE57;FE57;FE57;0021;0021;
+FE58;FE58;FE58;2014;2014;
+FE59;FE59;FE59;0028;0028;
+FE5A;FE5A;FE5A;0029;0029;
+FE5B;FE5B;FE5B;007B;007B;
+FE5C;FE5C;FE5C;007D;007D;
+FE5D;FE5D;FE5D;3014;3014;
+FE5E;FE5E;FE5E;3015;3015;
+FE5F;FE5F;FE5F;0023;0023;
+FE60;FE60;FE60;0026;0026;
+FE61;FE61;FE61;002A;002A;
+FE62;FE62;FE62;002B;002B;
+FE63;FE63;FE63;002D;002D;
+FE64;FE64;FE64;003C;003C;
+FE65;FE65;FE65;003E;003E;
+FE66;FE66;FE66;003D;003D;
+FE68;FE68;FE68;005C;005C;
+FE69;FE69;FE69;0024;0024;
+FE6A;FE6A;FE6A;0025;0025;
+FE6B;FE6B;FE6B;0040;0040;
+FE70;FE70;FE70;0020 064B;0020 064B;
+FE71;FE71;FE71;0640 064B;0640 064B;
+FE72;FE72;FE72;0020 064C;0020 064C;
+FE74;FE74;FE74;0020 064D;0020 064D;
+FE76;FE76;FE76;0020 064E;0020 064E;
+FE77;FE77;FE77;0640 064E;0640 064E;
+FE78;FE78;FE78;0020 064F;0020 064F;
+FE79;FE79;FE79;0640 064F;0640 064F;
+FE7A;FE7A;FE7A;0020 0650;0020 0650;
+FE7B;FE7B;FE7B;0640 0650;0640 0650;
+FE7C;FE7C;FE7C;0020 0651;0020 0651;
+FE7D;FE7D;FE7D;0640 0651;0640 0651;
+FE7E;FE7E;FE7E;0020 0652;0020 0652;
+FE7F;FE7F;FE7F;0640 0652;0640 0652;
+FE80;FE80;FE80;0621;0621;
+FE81;FE81;FE81;0622;0627 0653;
+FE82;FE82;FE82;0622;0627 0653;
+FE83;FE83;FE83;0623;0627 0654;
+FE84;FE84;FE84;0623;0627 0654;
+FE85;FE85;FE85;0624;0648 0654;
+FE86;FE86;FE86;0624;0648 0654;
+FE87;FE87;FE87;0625;0627 0655;
+FE88;FE88;FE88;0625;0627 0655;
+FE89;FE89;FE89;0626;064A 0654;
+FE8A;FE8A;FE8A;0626;064A 0654;
+FE8B;FE8B;FE8B;0626;064A 0654;
+FE8C;FE8C;FE8C;0626;064A 0654;
+FE8D;FE8D;FE8D;0627;0627;
+FE8E;FE8E;FE8E;0627;0627;
+FE8F;FE8F;FE8F;0628;0628;
+FE90;FE90;FE90;0628;0628;
+FE91;FE91;FE91;0628;0628;
+FE92;FE92;FE92;0628;0628;
+FE93;FE93;FE93;0629;0629;
+FE94;FE94;FE94;0629;0629;
+FE95;FE95;FE95;062A;062A;
+FE96;FE96;FE96;062A;062A;
+FE97;FE97;FE97;062A;062A;
+FE98;FE98;FE98;062A;062A;
+FE99;FE99;FE99;062B;062B;
+FE9A;FE9A;FE9A;062B;062B;
+FE9B;FE9B;FE9B;062B;062B;
+FE9C;FE9C;FE9C;062B;062B;
+FE9D;FE9D;FE9D;062C;062C;
+FE9E;FE9E;FE9E;062C;062C;
+FE9F;FE9F;FE9F;062C;062C;
+FEA0;FEA0;FEA0;062C;062C;
+FEA1;FEA1;FEA1;062D;062D;
+FEA2;FEA2;FEA2;062D;062D;
+FEA3;FEA3;FEA3;062D;062D;
+FEA4;FEA4;FEA4;062D;062D;
+FEA5;FEA5;FEA5;062E;062E;
+FEA6;FEA6;FEA6;062E;062E;
+FEA7;FEA7;FEA7;062E;062E;
+FEA8;FEA8;FEA8;062E;062E;
+FEA9;FEA9;FEA9;062F;062F;
+FEAA;FEAA;FEAA;062F;062F;
+FEAB;FEAB;FEAB;0630;0630;
+FEAC;FEAC;FEAC;0630;0630;
+FEAD;FEAD;FEAD;0631;0631;
+FEAE;FEAE;FEAE;0631;0631;
+FEAF;FEAF;FEAF;0632;0632;
+FEB0;FEB0;FEB0;0632;0632;
+FEB1;FEB1;FEB1;0633;0633;
+FEB2;FEB2;FEB2;0633;0633;
+FEB3;FEB3;FEB3;0633;0633;
+FEB4;FEB4;FEB4;0633;0633;
+FEB5;FEB5;FEB5;0634;0634;
+FEB6;FEB6;FEB6;0634;0634;
+FEB7;FEB7;FEB7;0634;0634;
+FEB8;FEB8;FEB8;0634;0634;
+FEB9;FEB9;FEB9;0635;0635;
+FEBA;FEBA;FEBA;0635;0635;
+FEBB;FEBB;FEBB;0635;0635;
+FEBC;FEBC;FEBC;0635;0635;
+FEBD;FEBD;FEBD;0636;0636;
+FEBE;FEBE;FEBE;0636;0636;
+FEBF;FEBF;FEBF;0636;0636;
+FEC0;FEC0;FEC0;0636;0636;
+FEC1;FEC1;FEC1;0637;0637;
+FEC2;FEC2;FEC2;0637;0637;
+FEC3;FEC3;FEC3;0637;0637;
+FEC4;FEC4;FEC4;0637;0637;
+FEC5;FEC5;FEC5;0638;0638;
+FEC6;FEC6;FEC6;0638;0638;
+FEC7;FEC7;FEC7;0638;0638;
+FEC8;FEC8;FEC8;0638;0638;
+FEC9;FEC9;FEC9;0639;0639;
+FECA;FECA;FECA;0639;0639;
+FECB;FECB;FECB;0639;0639;
+FECC;FECC;FECC;0639;0639;
+FECD;FECD;FECD;063A;063A;
+FECE;FECE;FECE;063A;063A;
+FECF;FECF;FECF;063A;063A;
+FED0;FED0;FED0;063A;063A;
+FED1;FED1;FED1;0641;0641;
+FED2;FED2;FED2;0641;0641;
+FED3;FED3;FED3;0641;0641;
+FED4;FED4;FED4;0641;0641;
+FED5;FED5;FED5;0642;0642;
+FED6;FED6;FED6;0642;0642;
+FED7;FED7;FED7;0642;0642;
+FED8;FED8;FED8;0642;0642;
+FED9;FED9;FED9;0643;0643;
+FEDA;FEDA;FEDA;0643;0643;
+FEDB;FEDB;FEDB;0643;0643;
+FEDC;FEDC;FEDC;0643;0643;
+FEDD;FEDD;FEDD;0644;0644;
+FEDE;FEDE;FEDE;0644;0644;
+FEDF;FEDF;FEDF;0644;0644;
+FEE0;FEE0;FEE0;0644;0644;
+FEE1;FEE1;FEE1;0645;0645;
+FEE2;FEE2;FEE2;0645;0645;
+FEE3;FEE3;FEE3;0645;0645;
+FEE4;FEE4;FEE4;0645;0645;
+FEE5;FEE5;FEE5;0646;0646;
+FEE6;FEE6;FEE6;0646;0646;
+FEE7;FEE7;FEE7;0646;0646;
+FEE8;FEE8;FEE8;0646;0646;
+FEE9;FEE9;FEE9;0647;0647;
+FEEA;FEEA;FEEA;0647;0647;
+FEEB;FEEB;FEEB;0647;0647;
+FEEC;FEEC;FEEC;0647;0647;
+FEED;FEED;FEED;0648;0648;
+FEEE;FEEE;FEEE;0648;0648;
+FEEF;FEEF;FEEF;0649;0649;
+FEF0;FEF0;FEF0;0649;0649;
+FEF1;FEF1;FEF1;064A;064A;
+FEF2;FEF2;FEF2;064A;064A;
+FEF3;FEF3;FEF3;064A;064A;
+FEF4;FEF4;FEF4;064A;064A;
+FEF5;FEF5;FEF5;0644 0622;0644 0627 0653;
+FEF6;FEF6;FEF6;0644 0622;0644 0627 0653;
+FEF7;FEF7;FEF7;0644 0623;0644 0627 0654;
+FEF8;FEF8;FEF8;0644 0623;0644 0627 0654;
+FEF9;FEF9;FEF9;0644 0625;0644 0627 0655;
+FEFA;FEFA;FEFA;0644 0625;0644 0627 0655;
+FEFB;FEFB;FEFB;0644 0627;0644 0627;
+FEFC;FEFC;FEFC;0644 0627;0644 0627;
+FF01;FF01;FF01;0021;0021;
+FF02;FF02;FF02;0022;0022;
+FF03;FF03;FF03;0023;0023;
+FF04;FF04;FF04;0024;0024;
+FF05;FF05;FF05;0025;0025;
+FF06;FF06;FF06;0026;0026;
+FF07;FF07;FF07;0027;0027;
+FF08;FF08;FF08;0028;0028;
+FF09;FF09;FF09;0029;0029;
+FF0A;FF0A;FF0A;002A;002A;
+FF0B;FF0B;FF0B;002B;002B;
+FF0C;FF0C;FF0C;002C;002C;
+FF0D;FF0D;FF0D;002D;002D;
+FF0E;FF0E;FF0E;002E;002E;
+FF0F;FF0F;FF0F;002F;002F;
+FF10;FF10;FF10;0030;0030;
+FF11;FF11;FF11;0031;0031;
+FF12;FF12;FF12;0032;0032;
+FF13;FF13;FF13;0033;0033;
+FF14;FF14;FF14;0034;0034;
+FF15;FF15;FF15;0035;0035;
+FF16;FF16;FF16;0036;0036;
+FF17;FF17;FF17;0037;0037;
+FF18;FF18;FF18;0038;0038;
+FF19;FF19;FF19;0039;0039;
+FF1A;FF1A;FF1A;003A;003A;
+FF1B;FF1B;FF1B;003B;003B;
+FF1C;FF1C;FF1C;003C;003C;
+FF1D;FF1D;FF1D;003D;003D;
+FF1E;FF1E;FF1E;003E;003E;
+FF1F;FF1F;FF1F;003F;003F;
+FF20;FF20;FF20;0040;0040;
+FF21;FF21;FF21;0041;0041;
+FF22;FF22;FF22;0042;0042;
+FF23;FF23;FF23;0043;0043;
+FF24;FF24;FF24;0044;0044;
+FF25;FF25;FF25;0045;0045;
+FF26;FF26;FF26;0046;0046;
+FF27;FF27;FF27;0047;0047;
+FF28;FF28;FF28;0048;0048;
+FF29;FF29;FF29;0049;0049;
+FF2A;FF2A;FF2A;004A;004A;
+FF2B;FF2B;FF2B;004B;004B;
+FF2C;FF2C;FF2C;004C;004C;
+FF2D;FF2D;FF2D;004D;004D;
+FF2E;FF2E;FF2E;004E;004E;
+FF2F;FF2F;FF2F;004F;004F;
+FF30;FF30;FF30;0050;0050;
+FF31;FF31;FF31;0051;0051;
+FF32;FF32;FF32;0052;0052;
+FF33;FF33;FF33;0053;0053;
+FF34;FF34;FF34;0054;0054;
+FF35;FF35;FF35;0055;0055;
+FF36;FF36;FF36;0056;0056;
+FF37;FF37;FF37;0057;0057;
+FF38;FF38;FF38;0058;0058;
+FF39;FF39;FF39;0059;0059;
+FF3A;FF3A;FF3A;005A;005A;
+FF3B;FF3B;FF3B;005B;005B;
+FF3C;FF3C;FF3C;005C;005C;
+FF3D;FF3D;FF3D;005D;005D;
+FF3E;FF3E;FF3E;005E;005E;
+FF3F;FF3F;FF3F;005F;005F;
+FF40;FF40;FF40;0060;0060;
+FF41;FF41;FF41;0061;0061;
+FF42;FF42;FF42;0062;0062;
+FF43;FF43;FF43;0063;0063;
+FF44;FF44;FF44;0064;0064;
+FF45;FF45;FF45;0065;0065;
+FF46;FF46;FF46;0066;0066;
+FF47;FF47;FF47;0067;0067;
+FF48;FF48;FF48;0068;0068;
+FF49;FF49;FF49;0069;0069;
+FF4A;FF4A;FF4A;006A;006A;
+FF4B;FF4B;FF4B;006B;006B;
+FF4C;FF4C;FF4C;006C;006C;
+FF4D;FF4D;FF4D;006D;006D;
+FF4E;FF4E;FF4E;006E;006E;
+FF4F;FF4F;FF4F;006F;006F;
+FF50;FF50;FF50;0070;0070;
+FF51;FF51;FF51;0071;0071;
+FF52;FF52;FF52;0072;0072;
+FF53;FF53;FF53;0073;0073;
+FF54;FF54;FF54;0074;0074;
+FF55;FF55;FF55;0075;0075;
+FF56;FF56;FF56;0076;0076;
+FF57;FF57;FF57;0077;0077;
+FF58;FF58;FF58;0078;0078;
+FF59;FF59;FF59;0079;0079;
+FF5A;FF5A;FF5A;007A;007A;
+FF5B;FF5B;FF5B;007B;007B;
+FF5C;FF5C;FF5C;007C;007C;
+FF5D;FF5D;FF5D;007D;007D;
+FF5E;FF5E;FF5E;007E;007E;
+FF5F;FF5F;FF5F;2985;2985;
+FF60;FF60;FF60;2986;2986;
+FF61;FF61;FF61;3002;3002;
+FF62;FF62;FF62;300C;300C;
+FF63;FF63;FF63;300D;300D;
+FF64;FF64;FF64;3001;3001;
+FF65;FF65;FF65;30FB;30FB;
+FF66;FF66;FF66;30F2;30F2;
+FF67;FF67;FF67;30A1;30A1;
+FF68;FF68;FF68;30A3;30A3;
+FF69;FF69;FF69;30A5;30A5;
+FF6A;FF6A;FF6A;30A7;30A7;
+FF6B;FF6B;FF6B;30A9;30A9;
+FF6C;FF6C;FF6C;30E3;30E3;
+FF6D;FF6D;FF6D;30E5;30E5;
+FF6E;FF6E;FF6E;30E7;30E7;
+FF6F;FF6F;FF6F;30C3;30C3;
+FF70;FF70;FF70;30FC;30FC;
+FF71;FF71;FF71;30A2;30A2;
+FF72;FF72;FF72;30A4;30A4;
+FF73;FF73;FF73;30A6;30A6;
+FF74;FF74;FF74;30A8;30A8;
+FF75;FF75;FF75;30AA;30AA;
+FF76;FF76;FF76;30AB;30AB;
+FF77;FF77;FF77;30AD;30AD;
+FF78;FF78;FF78;30AF;30AF;
+FF79;FF79;FF79;30B1;30B1;
+FF7A;FF7A;FF7A;30B3;30B3;
+FF7B;FF7B;FF7B;30B5;30B5;
+FF7C;FF7C;FF7C;30B7;30B7;
+FF7D;FF7D;FF7D;30B9;30B9;
+FF7E;FF7E;FF7E;30BB;30BB;
+FF7F;FF7F;FF7F;30BD;30BD;
+FF80;FF80;FF80;30BF;30BF;
+FF81;FF81;FF81;30C1;30C1;
+FF82;FF82;FF82;30C4;30C4;
+FF83;FF83;FF83;30C6;30C6;
+FF84;FF84;FF84;30C8;30C8;
+FF85;FF85;FF85;30CA;30CA;
+FF86;FF86;FF86;30CB;30CB;
+FF87;FF87;FF87;30CC;30CC;
+FF88;FF88;FF88;30CD;30CD;
+FF89;FF89;FF89;30CE;30CE;
+FF8A;FF8A;FF8A;30CF;30CF;
+FF8B;FF8B;FF8B;30D2;30D2;
+FF8C;FF8C;FF8C;30D5;30D5;
+FF8D;FF8D;FF8D;30D8;30D8;
+FF8E;FF8E;FF8E;30DB;30DB;
+FF8F;FF8F;FF8F;30DE;30DE;
+FF90;FF90;FF90;30DF;30DF;
+FF91;FF91;FF91;30E0;30E0;
+FF92;FF92;FF92;30E1;30E1;
+FF93;FF93;FF93;30E2;30E2;
+FF94;FF94;FF94;30E4;30E4;
+FF95;FF95;FF95;30E6;30E6;
+FF96;FF96;FF96;30E8;30E8;
+FF97;FF97;FF97;30E9;30E9;
+FF98;FF98;FF98;30EA;30EA;
+FF99;FF99;FF99;30EB;30EB;
+FF9A;FF9A;FF9A;30EC;30EC;
+FF9B;FF9B;FF9B;30ED;30ED;
+FF9C;FF9C;FF9C;30EF;30EF;
+FF9D;FF9D;FF9D;30F3;30F3;
+FF9E;FF9E;FF9E;3099;3099;
+FF9F;FF9F;FF9F;309A;309A;
+FFA0;FFA0;FFA0;1160;1160;
+FFA1;FFA1;FFA1;1100;1100;
+FFA2;FFA2;FFA2;1101;1101;
+FFA3;FFA3;FFA3;11AA;11AA;
+FFA4;FFA4;FFA4;1102;1102;
+FFA5;FFA5;FFA5;11AC;11AC;
+FFA6;FFA6;FFA6;11AD;11AD;
+FFA7;FFA7;FFA7;1103;1103;
+FFA8;FFA8;FFA8;1104;1104;
+FFA9;FFA9;FFA9;1105;1105;
+FFAA;FFAA;FFAA;11B0;11B0;
+FFAB;FFAB;FFAB;11B1;11B1;
+FFAC;FFAC;FFAC;11B2;11B2;
+FFAD;FFAD;FFAD;11B3;11B3;
+FFAE;FFAE;FFAE;11B4;11B4;
+FFAF;FFAF;FFAF;11B5;11B5;
+FFB0;FFB0;FFB0;111A;111A;
+FFB1;FFB1;FFB1;1106;1106;
+FFB2;FFB2;FFB2;1107;1107;
+FFB3;FFB3;FFB3;1108;1108;
+FFB4;FFB4;FFB4;1121;1121;
+FFB5;FFB5;FFB5;1109;1109;
+FFB6;FFB6;FFB6;110A;110A;
+FFB7;FFB7;FFB7;110B;110B;
+FFB8;FFB8;FFB8;110C;110C;
+FFB9;FFB9;FFB9;110D;110D;
+FFBA;FFBA;FFBA;110E;110E;
+FFBB;FFBB;FFBB;110F;110F;
+FFBC;FFBC;FFBC;1110;1110;
+FFBD;FFBD;FFBD;1111;1111;
+FFBE;FFBE;FFBE;1112;1112;
+FFC2;FFC2;FFC2;1161;1161;
+FFC3;FFC3;FFC3;1162;1162;
+FFC4;FFC4;FFC4;1163;1163;
+FFC5;FFC5;FFC5;1164;1164;
+FFC6;FFC6;FFC6;1165;1165;
+FFC7;FFC7;FFC7;1166;1166;
+FFCA;FFCA;FFCA;1167;1167;
+FFCB;FFCB;FFCB;1168;1168;
+FFCC;FFCC;FFCC;1169;1169;
+FFCD;FFCD;FFCD;116A;116A;
+FFCE;FFCE;FFCE;116B;116B;
+FFCF;FFCF;FFCF;116C;116C;
+FFD2;FFD2;FFD2;116D;116D;
+FFD3;FFD3;FFD3;116E;116E;
+FFD4;FFD4;FFD4;116F;116F;
+FFD5;FFD5;FFD5;1170;1170;
+FFD6;FFD6;FFD6;1171;1171;
+FFD7;FFD7;FFD7;1172;1172;
+FFDA;FFDA;FFDA;1173;1173;
+FFDB;FFDB;FFDB;1174;1174;
+FFDC;FFDC;FFDC;1175;1175;
+FFE0;FFE0;FFE0;00A2;00A2;
+FFE1;FFE1;FFE1;00A3;00A3;
+FFE2;FFE2;FFE2;00AC;00AC;
+FFE3;FFE3;FFE3;0020 0304;0020 0304;
+FFE4;FFE4;FFE4;00A6;00A6;
+FFE5;FFE5;FFE5;00A5;00A5;
+FFE6;FFE6;FFE6;20A9;20A9;
+FFE8;FFE8;FFE8;2502;2502;
+FFE9;FFE9;FFE9;2190;2190;
+FFEA;FFEA;FFEA;2191;2191;
+FFEB;FFEB;FFEB;2192;2192;
+FFEC;FFEC;FFEC;2193;2193;
+FFED;FFED;FFED;25A0;25A0;
+FFEE;FFEE;FFEE;25CB;25CB;
+1D15E;1D157 1D165;1D157 1D165;1D157 1D165;1D157 1D165;
+1D15F;1D158 1D165;1D158 1D165;1D158 1D165;1D158 1D165;
+1D160;1D158 1D165 1D16E;1D158 1D165 1D16E;1D158 1D165 1D16E;1D158 1D165 1D16E;
+1D161;1D158 1D165 1D16F;1D158 1D165 1D16F;1D158 1D165 1D16F;1D158 1D165 1D16F;
+1D162;1D158 1D165 1D170;1D158 1D165 1D170;1D158 1D165 1D170;1D158 1D165 1D170;
+1D163;1D158 1D165 1D171;1D158 1D165 1D171;1D158 1D165 1D171;1D158 1D165 1D171;
+1D164;1D158 1D165 1D172;1D158 1D165 1D172;1D158 1D165 1D172;1D158 1D165 1D172;
+1D1BB;1D1B9 1D165;1D1B9 1D165;1D1B9 1D165;1D1B9 1D165;
+1D1BC;1D1BA 1D165;1D1BA 1D165;1D1BA 1D165;1D1BA 1D165;
+1D1BD;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E;
+1D1BE;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E;
+1D1BF;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F;
+1D1C0;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F;
+1D400;1D400;1D400;0041;0041;
+1D401;1D401;1D401;0042;0042;
+1D402;1D402;1D402;0043;0043;
+1D403;1D403;1D403;0044;0044;
+1D404;1D404;1D404;0045;0045;
+1D405;1D405;1D405;0046;0046;
+1D406;1D406;1D406;0047;0047;
+1D407;1D407;1D407;0048;0048;
+1D408;1D408;1D408;0049;0049;
+1D409;1D409;1D409;004A;004A;
+1D40A;1D40A;1D40A;004B;004B;
+1D40B;1D40B;1D40B;004C;004C;
+1D40C;1D40C;1D40C;004D;004D;
+1D40D;1D40D;1D40D;004E;004E;
+1D40E;1D40E;1D40E;004F;004F;
+1D40F;1D40F;1D40F;0050;0050;
+1D410;1D410;1D410;0051;0051;
+1D411;1D411;1D411;0052;0052;
+1D412;1D412;1D412;0053;0053;
+1D413;1D413;1D413;0054;0054;
+1D414;1D414;1D414;0055;0055;
+1D415;1D415;1D415;0056;0056;
+1D416;1D416;1D416;0057;0057;
+1D417;1D417;1D417;0058;0058;
+1D418;1D418;1D418;0059;0059;
+1D419;1D419;1D419;005A;005A;
+1D41A;1D41A;1D41A;0061;0061;
+1D41B;1D41B;1D41B;0062;0062;
+1D41C;1D41C;1D41C;0063;0063;
+1D41D;1D41D;1D41D;0064;0064;
+1D41E;1D41E;1D41E;0065;0065;
+1D41F;1D41F;1D41F;0066;0066;
+1D420;1D420;1D420;0067;0067;
+1D421;1D421;1D421;0068;0068;
+1D422;1D422;1D422;0069;0069;
+1D423;1D423;1D423;006A;006A;
+1D424;1D424;1D424;006B;006B;
+1D425;1D425;1D425;006C;006C;
+1D426;1D426;1D426;006D;006D;
+1D427;1D427;1D427;006E;006E;
+1D428;1D428;1D428;006F;006F;
+1D429;1D429;1D429;0070;0070;
+1D42A;1D42A;1D42A;0071;0071;
+1D42B;1D42B;1D42B;0072;0072;
+1D42C;1D42C;1D42C;0073;0073;
+1D42D;1D42D;1D42D;0074;0074;
+1D42E;1D42E;1D42E;0075;0075;
+1D42F;1D42F;1D42F;0076;0076;
+1D430;1D430;1D430;0077;0077;
+1D431;1D431;1D431;0078;0078;
+1D432;1D432;1D432;0079;0079;
+1D433;1D433;1D433;007A;007A;
+1D434;1D434;1D434;0041;0041;
+1D435;1D435;1D435;0042;0042;
+1D436;1D436;1D436;0043;0043;
+1D437;1D437;1D437;0044;0044;
+1D438;1D438;1D438;0045;0045;
+1D439;1D439;1D439;0046;0046;
+1D43A;1D43A;1D43A;0047;0047;
+1D43B;1D43B;1D43B;0048;0048;
+1D43C;1D43C;1D43C;0049;0049;
+1D43D;1D43D;1D43D;004A;004A;
+1D43E;1D43E;1D43E;004B;004B;
+1D43F;1D43F;1D43F;004C;004C;
+1D440;1D440;1D440;004D;004D;
+1D441;1D441;1D441;004E;004E;
+1D442;1D442;1D442;004F;004F;
+1D443;1D443;1D443;0050;0050;
+1D444;1D444;1D444;0051;0051;
+1D445;1D445;1D445;0052;0052;
+1D446;1D446;1D446;0053;0053;
+1D447;1D447;1D447;0054;0054;
+1D448;1D448;1D448;0055;0055;
+1D449;1D449;1D449;0056;0056;
+1D44A;1D44A;1D44A;0057;0057;
+1D44B;1D44B;1D44B;0058;0058;
+1D44C;1D44C;1D44C;0059;0059;
+1D44D;1D44D;1D44D;005A;005A;
+1D44E;1D44E;1D44E;0061;0061;
+1D44F;1D44F;1D44F;0062;0062;
+1D450;1D450;1D450;0063;0063;
+1D451;1D451;1D451;0064;0064;
+1D452;1D452;1D452;0065;0065;
+1D453;1D453;1D453;0066;0066;
+1D454;1D454;1D454;0067;0067;
+1D456;1D456;1D456;0069;0069;
+1D457;1D457;1D457;006A;006A;
+1D458;1D458;1D458;006B;006B;
+1D459;1D459;1D459;006C;006C;
+1D45A;1D45A;1D45A;006D;006D;
+1D45B;1D45B;1D45B;006E;006E;
+1D45C;1D45C;1D45C;006F;006F;
+1D45D;1D45D;1D45D;0070;0070;
+1D45E;1D45E;1D45E;0071;0071;
+1D45F;1D45F;1D45F;0072;0072;
+1D460;1D460;1D460;0073;0073;
+1D461;1D461;1D461;0074;0074;
+1D462;1D462;1D462;0075;0075;
+1D463;1D463;1D463;0076;0076;
+1D464;1D464;1D464;0077;0077;
+1D465;1D465;1D465;0078;0078;
+1D466;1D466;1D466;0079;0079;
+1D467;1D467;1D467;007A;007A;
+1D468;1D468;1D468;0041;0041;
+1D469;1D469;1D469;0042;0042;
+1D46A;1D46A;1D46A;0043;0043;
+1D46B;1D46B;1D46B;0044;0044;
+1D46C;1D46C;1D46C;0045;0045;
+1D46D;1D46D;1D46D;0046;0046;
+1D46E;1D46E;1D46E;0047;0047;
+1D46F;1D46F;1D46F;0048;0048;
+1D470;1D470;1D470;0049;0049;
+1D471;1D471;1D471;004A;004A;
+1D472;1D472;1D472;004B;004B;
+1D473;1D473;1D473;004C;004C;
+1D474;1D474;1D474;004D;004D;
+1D475;1D475;1D475;004E;004E;
+1D476;1D476;1D476;004F;004F;
+1D477;1D477;1D477;0050;0050;
+1D478;1D478;1D478;0051;0051;
+1D479;1D479;1D479;0052;0052;
+1D47A;1D47A;1D47A;0053;0053;
+1D47B;1D47B;1D47B;0054;0054;
+1D47C;1D47C;1D47C;0055;0055;
+1D47D;1D47D;1D47D;0056;0056;
+1D47E;1D47E;1D47E;0057;0057;
+1D47F;1D47F;1D47F;0058;0058;
+1D480;1D480;1D480;0059;0059;
+1D481;1D481;1D481;005A;005A;
+1D482;1D482;1D482;0061;0061;
+1D483;1D483;1D483;0062;0062;
+1D484;1D484;1D484;0063;0063;
+1D485;1D485;1D485;0064;0064;
+1D486;1D486;1D486;0065;0065;
+1D487;1D487;1D487;0066;0066;
+1D488;1D488;1D488;0067;0067;
+1D489;1D489;1D489;0068;0068;
+1D48A;1D48A;1D48A;0069;0069;
+1D48B;1D48B;1D48B;006A;006A;
+1D48C;1D48C;1D48C;006B;006B;
+1D48D;1D48D;1D48D;006C;006C;
+1D48E;1D48E;1D48E;006D;006D;
+1D48F;1D48F;1D48F;006E;006E;
+1D490;1D490;1D490;006F;006F;
+1D491;1D491;1D491;0070;0070;
+1D492;1D492;1D492;0071;0071;
+1D493;1D493;1D493;0072;0072;
+1D494;1D494;1D494;0073;0073;
+1D495;1D495;1D495;0074;0074;
+1D496;1D496;1D496;0075;0075;
+1D497;1D497;1D497;0076;0076;
+1D498;1D498;1D498;0077;0077;
+1D499;1D499;1D499;0078;0078;
+1D49A;1D49A;1D49A;0079;0079;
+1D49B;1D49B;1D49B;007A;007A;
+1D49C;1D49C;1D49C;0041;0041;
+1D49E;1D49E;1D49E;0043;0043;
+1D49F;1D49F;1D49F;0044;0044;
+1D4A2;1D4A2;1D4A2;0047;0047;
+1D4A5;1D4A5;1D4A5;004A;004A;
+1D4A6;1D4A6;1D4A6;004B;004B;
+1D4A9;1D4A9;1D4A9;004E;004E;
+1D4AA;1D4AA;1D4AA;004F;004F;
+1D4AB;1D4AB;1D4AB;0050;0050;
+1D4AC;1D4AC;1D4AC;0051;0051;
+1D4AE;1D4AE;1D4AE;0053;0053;
+1D4AF;1D4AF;1D4AF;0054;0054;
+1D4B0;1D4B0;1D4B0;0055;0055;
+1D4B1;1D4B1;1D4B1;0056;0056;
+1D4B2;1D4B2;1D4B2;0057;0057;
+1D4B3;1D4B3;1D4B3;0058;0058;
+1D4B4;1D4B4;1D4B4;0059;0059;
+1D4B5;1D4B5;1D4B5;005A;005A;
+1D4B6;1D4B6;1D4B6;0061;0061;
+1D4B7;1D4B7;1D4B7;0062;0062;
+1D4B8;1D4B8;1D4B8;0063;0063;
+1D4B9;1D4B9;1D4B9;0064;0064;
+1D4BB;1D4BB;1D4BB;0066;0066;
+1D4BD;1D4BD;1D4BD;0068;0068;
+1D4BE;1D4BE;1D4BE;0069;0069;
+1D4BF;1D4BF;1D4BF;006A;006A;
+1D4C0;1D4C0;1D4C0;006B;006B;
+1D4C1;1D4C1;1D4C1;006C;006C;
+1D4C2;1D4C2;1D4C2;006D;006D;
+1D4C3;1D4C3;1D4C3;006E;006E;
+1D4C5;1D4C5;1D4C5;0070;0070;
+1D4C6;1D4C6;1D4C6;0071;0071;
+1D4C7;1D4C7;1D4C7;0072;0072;
+1D4C8;1D4C8;1D4C8;0073;0073;
+1D4C9;1D4C9;1D4C9;0074;0074;
+1D4CA;1D4CA;1D4CA;0075;0075;
+1D4CB;1D4CB;1D4CB;0076;0076;
+1D4CC;1D4CC;1D4CC;0077;0077;
+1D4CD;1D4CD;1D4CD;0078;0078;
+1D4CE;1D4CE;1D4CE;0079;0079;
+1D4CF;1D4CF;1D4CF;007A;007A;
+1D4D0;1D4D0;1D4D0;0041;0041;
+1D4D1;1D4D1;1D4D1;0042;0042;
+1D4D2;1D4D2;1D4D2;0043;0043;
+1D4D3;1D4D3;1D4D3;0044;0044;
+1D4D4;1D4D4;1D4D4;0045;0045;
+1D4D5;1D4D5;1D4D5;0046;0046;
+1D4D6;1D4D6;1D4D6;0047;0047;
+1D4D7;1D4D7;1D4D7;0048;0048;
+1D4D8;1D4D8;1D4D8;0049;0049;
+1D4D9;1D4D9;1D4D9;004A;004A;
+1D4DA;1D4DA;1D4DA;004B;004B;
+1D4DB;1D4DB;1D4DB;004C;004C;
+1D4DC;1D4DC;1D4DC;004D;004D;
+1D4DD;1D4DD;1D4DD;004E;004E;
+1D4DE;1D4DE;1D4DE;004F;004F;
+1D4DF;1D4DF;1D4DF;0050;0050;
+1D4E0;1D4E0;1D4E0;0051;0051;
+1D4E1;1D4E1;1D4E1;0052;0052;
+1D4E2;1D4E2;1D4E2;0053;0053;
+1D4E3;1D4E3;1D4E3;0054;0054;
+1D4E4;1D4E4;1D4E4;0055;0055;
+1D4E5;1D4E5;1D4E5;0056;0056;
+1D4E6;1D4E6;1D4E6;0057;0057;
+1D4E7;1D4E7;1D4E7;0058;0058;
+1D4E8;1D4E8;1D4E8;0059;0059;
+1D4E9;1D4E9;1D4E9;005A;005A;
+1D4EA;1D4EA;1D4EA;0061;0061;
+1D4EB;1D4EB;1D4EB;0062;0062;
+1D4EC;1D4EC;1D4EC;0063;0063;
+1D4ED;1D4ED;1D4ED;0064;0064;
+1D4EE;1D4EE;1D4EE;0065;0065;
+1D4EF;1D4EF;1D4EF;0066;0066;
+1D4F0;1D4F0;1D4F0;0067;0067;
+1D4F1;1D4F1;1D4F1;0068;0068;
+1D4F2;1D4F2;1D4F2;0069;0069;
+1D4F3;1D4F3;1D4F3;006A;006A;
+1D4F4;1D4F4;1D4F4;006B;006B;
+1D4F5;1D4F5;1D4F5;006C;006C;
+1D4F6;1D4F6;1D4F6;006D;006D;
+1D4F7;1D4F7;1D4F7;006E;006E;
+1D4F8;1D4F8;1D4F8;006F;006F;
+1D4F9;1D4F9;1D4F9;0070;0070;
+1D4FA;1D4FA;1D4FA;0071;0071;
+1D4FB;1D4FB;1D4FB;0072;0072;
+1D4FC;1D4FC;1D4FC;0073;0073;
+1D4FD;1D4FD;1D4FD;0074;0074;
+1D4FE;1D4FE;1D4FE;0075;0075;
+1D4FF;1D4FF;1D4FF;0076;0076;
+1D500;1D500;1D500;0077;0077;
+1D501;1D501;1D501;0078;0078;
+1D502;1D502;1D502;0079;0079;
+1D503;1D503;1D503;007A;007A;
+1D504;1D504;1D504;0041;0041;
+1D505;1D505;1D505;0042;0042;
+1D507;1D507;1D507;0044;0044;
+1D508;1D508;1D508;0045;0045;
+1D509;1D509;1D509;0046;0046;
+1D50A;1D50A;1D50A;0047;0047;
+1D50D;1D50D;1D50D;004A;004A;
+1D50E;1D50E;1D50E;004B;004B;
+1D50F;1D50F;1D50F;004C;004C;
+1D510;1D510;1D510;004D;004D;
+1D511;1D511;1D511;004E;004E;
+1D512;1D512;1D512;004F;004F;
+1D513;1D513;1D513;0050;0050;
+1D514;1D514;1D514;0051;0051;
+1D516;1D516;1D516;0053;0053;
+1D517;1D517;1D517;0054;0054;
+1D518;1D518;1D518;0055;0055;
+1D519;1D519;1D519;0056;0056;
+1D51A;1D51A;1D51A;0057;0057;
+1D51B;1D51B;1D51B;0058;0058;
+1D51C;1D51C;1D51C;0059;0059;
+1D51E;1D51E;1D51E;0061;0061;
+1D51F;1D51F;1D51F;0062;0062;
+1D520;1D520;1D520;0063;0063;
+1D521;1D521;1D521;0064;0064;
+1D522;1D522;1D522;0065;0065;
+1D523;1D523;1D523;0066;0066;
+1D524;1D524;1D524;0067;0067;
+1D525;1D525;1D525;0068;0068;
+1D526;1D526;1D526;0069;0069;
+1D527;1D527;1D527;006A;006A;
+1D528;1D528;1D528;006B;006B;
+1D529;1D529;1D529;006C;006C;
+1D52A;1D52A;1D52A;006D;006D;
+1D52B;1D52B;1D52B;006E;006E;
+1D52C;1D52C;1D52C;006F;006F;
+1D52D;1D52D;1D52D;0070;0070;
+1D52E;1D52E;1D52E;0071;0071;
+1D52F;1D52F;1D52F;0072;0072;
+1D530;1D530;1D530;0073;0073;
+1D531;1D531;1D531;0074;0074;
+1D532;1D532;1D532;0075;0075;
+1D533;1D533;1D533;0076;0076;
+1D534;1D534;1D534;0077;0077;
+1D535;1D535;1D535;0078;0078;
+1D536;1D536;1D536;0079;0079;
+1D537;1D537;1D537;007A;007A;
+1D538;1D538;1D538;0041;0041;
+1D539;1D539;1D539;0042;0042;
+1D53B;1D53B;1D53B;0044;0044;
+1D53C;1D53C;1D53C;0045;0045;
+1D53D;1D53D;1D53D;0046;0046;
+1D53E;1D53E;1D53E;0047;0047;
+1D540;1D540;1D540;0049;0049;
+1D541;1D541;1D541;004A;004A;
+1D542;1D542;1D542;004B;004B;
+1D543;1D543;1D543;004C;004C;
+1D544;1D544;1D544;004D;004D;
+1D546;1D546;1D546;004F;004F;
+1D54A;1D54A;1D54A;0053;0053;
+1D54B;1D54B;1D54B;0054;0054;
+1D54C;1D54C;1D54C;0055;0055;
+1D54D;1D54D;1D54D;0056;0056;
+1D54E;1D54E;1D54E;0057;0057;
+1D54F;1D54F;1D54F;0058;0058;
+1D550;1D550;1D550;0059;0059;
+1D552;1D552;1D552;0061;0061;
+1D553;1D553;1D553;0062;0062;
+1D554;1D554;1D554;0063;0063;
+1D555;1D555;1D555;0064;0064;
+1D556;1D556;1D556;0065;0065;
+1D557;1D557;1D557;0066;0066;
+1D558;1D558;1D558;0067;0067;
+1D559;1D559;1D559;0068;0068;
+1D55A;1D55A;1D55A;0069;0069;
+1D55B;1D55B;1D55B;006A;006A;
+1D55C;1D55C;1D55C;006B;006B;
+1D55D;1D55D;1D55D;006C;006C;
+1D55E;1D55E;1D55E;006D;006D;
+1D55F;1D55F;1D55F;006E;006E;
+1D560;1D560;1D560;006F;006F;
+1D561;1D561;1D561;0070;0070;
+1D562;1D562;1D562;0071;0071;
+1D563;1D563;1D563;0072;0072;
+1D564;1D564;1D564;0073;0073;
+1D565;1D565;1D565;0074;0074;
+1D566;1D566;1D566;0075;0075;
+1D567;1D567;1D567;0076;0076;
+1D568;1D568;1D568;0077;0077;
+1D569;1D569;1D569;0078;0078;
+1D56A;1D56A;1D56A;0079;0079;
+1D56B;1D56B;1D56B;007A;007A;
+1D56C;1D56C;1D56C;0041;0041;
+1D56D;1D56D;1D56D;0042;0042;
+1D56E;1D56E;1D56E;0043;0043;
+1D56F;1D56F;1D56F;0044;0044;
+1D570;1D570;1D570;0045;0045;
+1D571;1D571;1D571;0046;0046;
+1D572;1D572;1D572;0047;0047;
+1D573;1D573;1D573;0048;0048;
+1D574;1D574;1D574;0049;0049;
+1D575;1D575;1D575;004A;004A;
+1D576;1D576;1D576;004B;004B;
+1D577;1D577;1D577;004C;004C;
+1D578;1D578;1D578;004D;004D;
+1D579;1D579;1D579;004E;004E;
+1D57A;1D57A;1D57A;004F;004F;
+1D57B;1D57B;1D57B;0050;0050;
+1D57C;1D57C;1D57C;0051;0051;
+1D57D;1D57D;1D57D;0052;0052;
+1D57E;1D57E;1D57E;0053;0053;
+1D57F;1D57F;1D57F;0054;0054;
+1D580;1D580;1D580;0055;0055;
+1D581;1D581;1D581;0056;0056;
+1D582;1D582;1D582;0057;0057;
+1D583;1D583;1D583;0058;0058;
+1D584;1D584;1D584;0059;0059;
+1D585;1D585;1D585;005A;005A;
+1D586;1D586;1D586;0061;0061;
+1D587;1D587;1D587;0062;0062;
+1D588;1D588;1D588;0063;0063;
+1D589;1D589;1D589;0064;0064;
+1D58A;1D58A;1D58A;0065;0065;
+1D58B;1D58B;1D58B;0066;0066;
+1D58C;1D58C;1D58C;0067;0067;
+1D58D;1D58D;1D58D;0068;0068;
+1D58E;1D58E;1D58E;0069;0069;
+1D58F;1D58F;1D58F;006A;006A;
+1D590;1D590;1D590;006B;006B;
+1D591;1D591;1D591;006C;006C;
+1D592;1D592;1D592;006D;006D;
+1D593;1D593;1D593;006E;006E;
+1D594;1D594;1D594;006F;006F;
+1D595;1D595;1D595;0070;0070;
+1D596;1D596;1D596;0071;0071;
+1D597;1D597;1D597;0072;0072;
+1D598;1D598;1D598;0073;0073;
+1D599;1D599;1D599;0074;0074;
+1D59A;1D59A;1D59A;0075;0075;
+1D59B;1D59B;1D59B;0076;0076;
+1D59C;1D59C;1D59C;0077;0077;
+1D59D;1D59D;1D59D;0078;0078;
+1D59E;1D59E;1D59E;0079;0079;
+1D59F;1D59F;1D59F;007A;007A;
+1D5A0;1D5A0;1D5A0;0041;0041;
+1D5A1;1D5A1;1D5A1;0042;0042;
+1D5A2;1D5A2;1D5A2;0043;0043;
+1D5A3;1D5A3;1D5A3;0044;0044;
+1D5A4;1D5A4;1D5A4;0045;0045;
+1D5A5;1D5A5;1D5A5;0046;0046;
+1D5A6;1D5A6;1D5A6;0047;0047;
+1D5A7;1D5A7;1D5A7;0048;0048;
+1D5A8;1D5A8;1D5A8;0049;0049;
+1D5A9;1D5A9;1D5A9;004A;004A;
+1D5AA;1D5AA;1D5AA;004B;004B;
+1D5AB;1D5AB;1D5AB;004C;004C;
+1D5AC;1D5AC;1D5AC;004D;004D;
+1D5AD;1D5AD;1D5AD;004E;004E;
+1D5AE;1D5AE;1D5AE;004F;004F;
+1D5AF;1D5AF;1D5AF;0050;0050;
+1D5B0;1D5B0;1D5B0;0051;0051;
+1D5B1;1D5B1;1D5B1;0052;0052;
+1D5B2;1D5B2;1D5B2;0053;0053;
+1D5B3;1D5B3;1D5B3;0054;0054;
+1D5B4;1D5B4;1D5B4;0055;0055;
+1D5B5;1D5B5;1D5B5;0056;0056;
+1D5B6;1D5B6;1D5B6;0057;0057;
+1D5B7;1D5B7;1D5B7;0058;0058;
+1D5B8;1D5B8;1D5B8;0059;0059;
+1D5B9;1D5B9;1D5B9;005A;005A;
+1D5BA;1D5BA;1D5BA;0061;0061;
+1D5BB;1D5BB;1D5BB;0062;0062;
+1D5BC;1D5BC;1D5BC;0063;0063;
+1D5BD;1D5BD;1D5BD;0064;0064;
+1D5BE;1D5BE;1D5BE;0065;0065;
+1D5BF;1D5BF;1D5BF;0066;0066;
+1D5C0;1D5C0;1D5C0;0067;0067;
+1D5C1;1D5C1;1D5C1;0068;0068;
+1D5C2;1D5C2;1D5C2;0069;0069;
+1D5C3;1D5C3;1D5C3;006A;006A;
+1D5C4;1D5C4;1D5C4;006B;006B;
+1D5C5;1D5C5;1D5C5;006C;006C;
+1D5C6;1D5C6;1D5C6;006D;006D;
+1D5C7;1D5C7;1D5C7;006E;006E;
+1D5C8;1D5C8;1D5C8;006F;006F;
+1D5C9;1D5C9;1D5C9;0070;0070;
+1D5CA;1D5CA;1D5CA;0071;0071;
+1D5CB;1D5CB;1D5CB;0072;0072;
+1D5CC;1D5CC;1D5CC;0073;0073;
+1D5CD;1D5CD;1D5CD;0074;0074;
+1D5CE;1D5CE;1D5CE;0075;0075;
+1D5CF;1D5CF;1D5CF;0076;0076;
+1D5D0;1D5D0;1D5D0;0077;0077;
+1D5D1;1D5D1;1D5D1;0078;0078;
+1D5D2;1D5D2;1D5D2;0079;0079;
+1D5D3;1D5D3;1D5D3;007A;007A;
+1D5D4;1D5D4;1D5D4;0041;0041;
+1D5D5;1D5D5;1D5D5;0042;0042;
+1D5D6;1D5D6;1D5D6;0043;0043;
+1D5D7;1D5D7;1D5D7;0044;0044;
+1D5D8;1D5D8;1D5D8;0045;0045;
+1D5D9;1D5D9;1D5D9;0046;0046;
+1D5DA;1D5DA;1D5DA;0047;0047;
+1D5DB;1D5DB;1D5DB;0048;0048;
+1D5DC;1D5DC;1D5DC;0049;0049;
+1D5DD;1D5DD;1D5DD;004A;004A;
+1D5DE;1D5DE;1D5DE;004B;004B;
+1D5DF;1D5DF;1D5DF;004C;004C;
+1D5E0;1D5E0;1D5E0;004D;004D;
+1D5E1;1D5E1;1D5E1;004E;004E;
+1D5E2;1D5E2;1D5E2;004F;004F;
+1D5E3;1D5E3;1D5E3;0050;0050;
+1D5E4;1D5E4;1D5E4;0051;0051;
+1D5E5;1D5E5;1D5E5;0052;0052;
+1D5E6;1D5E6;1D5E6;0053;0053;
+1D5E7;1D5E7;1D5E7;0054;0054;
+1D5E8;1D5E8;1D5E8;0055;0055;
+1D5E9;1D5E9;1D5E9;0056;0056;
+1D5EA;1D5EA;1D5EA;0057;0057;
+1D5EB;1D5EB;1D5EB;0058;0058;
+1D5EC;1D5EC;1D5EC;0059;0059;
+1D5ED;1D5ED;1D5ED;005A;005A;
+1D5EE;1D5EE;1D5EE;0061;0061;
+1D5EF;1D5EF;1D5EF;0062;0062;
+1D5F0;1D5F0;1D5F0;0063;0063;
+1D5F1;1D5F1;1D5F1;0064;0064;
+1D5F2;1D5F2;1D5F2;0065;0065;
+1D5F3;1D5F3;1D5F3;0066;0066;
+1D5F4;1D5F4;1D5F4;0067;0067;
+1D5F5;1D5F5;1D5F5;0068;0068;
+1D5F6;1D5F6;1D5F6;0069;0069;
+1D5F7;1D5F7;1D5F7;006A;006A;
+1D5F8;1D5F8;1D5F8;006B;006B;
+1D5F9;1D5F9;1D5F9;006C;006C;
+1D5FA;1D5FA;1D5FA;006D;006D;
+1D5FB;1D5FB;1D5FB;006E;006E;
+1D5FC;1D5FC;1D5FC;006F;006F;
+1D5FD;1D5FD;1D5FD;0070;0070;
+1D5FE;1D5FE;1D5FE;0071;0071;
+1D5FF;1D5FF;1D5FF;0072;0072;
+1D600;1D600;1D600;0073;0073;
+1D601;1D601;1D601;0074;0074;
+1D602;1D602;1D602;0075;0075;
+1D603;1D603;1D603;0076;0076;
+1D604;1D604;1D604;0077;0077;
+1D605;1D605;1D605;0078;0078;
+1D606;1D606;1D606;0079;0079;
+1D607;1D607;1D607;007A;007A;
+1D608;1D608;1D608;0041;0041;
+1D609;1D609;1D609;0042;0042;
+1D60A;1D60A;1D60A;0043;0043;
+1D60B;1D60B;1D60B;0044;0044;
+1D60C;1D60C;1D60C;0045;0045;
+1D60D;1D60D;1D60D;0046;0046;
+1D60E;1D60E;1D60E;0047;0047;
+1D60F;1D60F;1D60F;0048;0048;
+1D610;1D610;1D610;0049;0049;
+1D611;1D611;1D611;004A;004A;
+1D612;1D612;1D612;004B;004B;
+1D613;1D613;1D613;004C;004C;
+1D614;1D614;1D614;004D;004D;
+1D615;1D615;1D615;004E;004E;
+1D616;1D616;1D616;004F;004F;
+1D617;1D617;1D617;0050;0050;
+1D618;1D618;1D618;0051;0051;
+1D619;1D619;1D619;0052;0052;
+1D61A;1D61A;1D61A;0053;0053;
+1D61B;1D61B;1D61B;0054;0054;
+1D61C;1D61C;1D61C;0055;0055;
+1D61D;1D61D;1D61D;0056;0056;
+1D61E;1D61E;1D61E;0057;0057;
+1D61F;1D61F;1D61F;0058;0058;
+1D620;1D620;1D620;0059;0059;
+1D621;1D621;1D621;005A;005A;
+1D622;1D622;1D622;0061;0061;
+1D623;1D623;1D623;0062;0062;
+1D624;1D624;1D624;0063;0063;
+1D625;1D625;1D625;0064;0064;
+1D626;1D626;1D626;0065;0065;
+1D627;1D627;1D627;0066;0066;
+1D628;1D628;1D628;0067;0067;
+1D629;1D629;1D629;0068;0068;
+1D62A;1D62A;1D62A;0069;0069;
+1D62B;1D62B;1D62B;006A;006A;
+1D62C;1D62C;1D62C;006B;006B;
+1D62D;1D62D;1D62D;006C;006C;
+1D62E;1D62E;1D62E;006D;006D;
+1D62F;1D62F;1D62F;006E;006E;
+1D630;1D630;1D630;006F;006F;
+1D631;1D631;1D631;0070;0070;
+1D632;1D632;1D632;0071;0071;
+1D633;1D633;1D633;0072;0072;
+1D634;1D634;1D634;0073;0073;
+1D635;1D635;1D635;0074;0074;
+1D636;1D636;1D636;0075;0075;
+1D637;1D637;1D637;0076;0076;
+1D638;1D638;1D638;0077;0077;
+1D639;1D639;1D639;0078;0078;
+1D63A;1D63A;1D63A;0079;0079;
+1D63B;1D63B;1D63B;007A;007A;
+1D63C;1D63C;1D63C;0041;0041;
+1D63D;1D63D;1D63D;0042;0042;
+1D63E;1D63E;1D63E;0043;0043;
+1D63F;1D63F;1D63F;0044;0044;
+1D640;1D640;1D640;0045;0045;
+1D641;1D641;1D641;0046;0046;
+1D642;1D642;1D642;0047;0047;
+1D643;1D643;1D643;0048;0048;
+1D644;1D644;1D644;0049;0049;
+1D645;1D645;1D645;004A;004A;
+1D646;1D646;1D646;004B;004B;
+1D647;1D647;1D647;004C;004C;
+1D648;1D648;1D648;004D;004D;
+1D649;1D649;1D649;004E;004E;
+1D64A;1D64A;1D64A;004F;004F;
+1D64B;1D64B;1D64B;0050;0050;
+1D64C;1D64C;1D64C;0051;0051;
+1D64D;1D64D;1D64D;0052;0052;
+1D64E;1D64E;1D64E;0053;0053;
+1D64F;1D64F;1D64F;0054;0054;
+1D650;1D650;1D650;0055;0055;
+1D651;1D651;1D651;0056;0056;
+1D652;1D652;1D652;0057;0057;
+1D653;1D653;1D653;0058;0058;
+1D654;1D654;1D654;0059;0059;
+1D655;1D655;1D655;005A;005A;
+1D656;1D656;1D656;0061;0061;
+1D657;1D657;1D657;0062;0062;
+1D658;1D658;1D658;0063;0063;
+1D659;1D659;1D659;0064;0064;
+1D65A;1D65A;1D65A;0065;0065;
+1D65B;1D65B;1D65B;0066;0066;
+1D65C;1D65C;1D65C;0067;0067;
+1D65D;1D65D;1D65D;0068;0068;
+1D65E;1D65E;1D65E;0069;0069;
+1D65F;1D65F;1D65F;006A;006A;
+1D660;1D660;1D660;006B;006B;
+1D661;1D661;1D661;006C;006C;
+1D662;1D662;1D662;006D;006D;
+1D663;1D663;1D663;006E;006E;
+1D664;1D664;1D664;006F;006F;
+1D665;1D665;1D665;0070;0070;
+1D666;1D666;1D666;0071;0071;
+1D667;1D667;1D667;0072;0072;
+1D668;1D668;1D668;0073;0073;
+1D669;1D669;1D669;0074;0074;
+1D66A;1D66A;1D66A;0075;0075;
+1D66B;1D66B;1D66B;0076;0076;
+1D66C;1D66C;1D66C;0077;0077;
+1D66D;1D66D;1D66D;0078;0078;
+1D66E;1D66E;1D66E;0079;0079;
+1D66F;1D66F;1D66F;007A;007A;
+1D670;1D670;1D670;0041;0041;
+1D671;1D671;1D671;0042;0042;
+1D672;1D672;1D672;0043;0043;
+1D673;1D673;1D673;0044;0044;
+1D674;1D674;1D674;0045;0045;
+1D675;1D675;1D675;0046;0046;
+1D676;1D676;1D676;0047;0047;
+1D677;1D677;1D677;0048;0048;
+1D678;1D678;1D678;0049;0049;
+1D679;1D679;1D679;004A;004A;
+1D67A;1D67A;1D67A;004B;004B;
+1D67B;1D67B;1D67B;004C;004C;
+1D67C;1D67C;1D67C;004D;004D;
+1D67D;1D67D;1D67D;004E;004E;
+1D67E;1D67E;1D67E;004F;004F;
+1D67F;1D67F;1D67F;0050;0050;
+1D680;1D680;1D680;0051;0051;
+1D681;1D681;1D681;0052;0052;
+1D682;1D682;1D682;0053;0053;
+1D683;1D683;1D683;0054;0054;
+1D684;1D684;1D684;0055;0055;
+1D685;1D685;1D685;0056;0056;
+1D686;1D686;1D686;0057;0057;
+1D687;1D687;1D687;0058;0058;
+1D688;1D688;1D688;0059;0059;
+1D689;1D689;1D689;005A;005A;
+1D68A;1D68A;1D68A;0061;0061;
+1D68B;1D68B;1D68B;0062;0062;
+1D68C;1D68C;1D68C;0063;0063;
+1D68D;1D68D;1D68D;0064;0064;
+1D68E;1D68E;1D68E;0065;0065;
+1D68F;1D68F;1D68F;0066;0066;
+1D690;1D690;1D690;0067;0067;
+1D691;1D691;1D691;0068;0068;
+1D692;1D692;1D692;0069;0069;
+1D693;1D693;1D693;006A;006A;
+1D694;1D694;1D694;006B;006B;
+1D695;1D695;1D695;006C;006C;
+1D696;1D696;1D696;006D;006D;
+1D697;1D697;1D697;006E;006E;
+1D698;1D698;1D698;006F;006F;
+1D699;1D699;1D699;0070;0070;
+1D69A;1D69A;1D69A;0071;0071;
+1D69B;1D69B;1D69B;0072;0072;
+1D69C;1D69C;1D69C;0073;0073;
+1D69D;1D69D;1D69D;0074;0074;
+1D69E;1D69E;1D69E;0075;0075;
+1D69F;1D69F;1D69F;0076;0076;
+1D6A0;1D6A0;1D6A0;0077;0077;
+1D6A1;1D6A1;1D6A1;0078;0078;
+1D6A2;1D6A2;1D6A2;0079;0079;
+1D6A3;1D6A3;1D6A3;007A;007A;
+1D6A4;1D6A4;1D6A4;0131;0131;
+1D6A5;1D6A5;1D6A5;0237;0237;
+1D6A8;1D6A8;1D6A8;0391;0391;
+1D6A9;1D6A9;1D6A9;0392;0392;
+1D6AA;1D6AA;1D6AA;0393;0393;
+1D6AB;1D6AB;1D6AB;0394;0394;
+1D6AC;1D6AC;1D6AC;0395;0395;
+1D6AD;1D6AD;1D6AD;0396;0396;
+1D6AE;1D6AE;1D6AE;0397;0397;
+1D6AF;1D6AF;1D6AF;0398;0398;
+1D6B0;1D6B0;1D6B0;0399;0399;
+1D6B1;1D6B1;1D6B1;039A;039A;
+1D6B2;1D6B2;1D6B2;039B;039B;
+1D6B3;1D6B3;1D6B3;039C;039C;
+1D6B4;1D6B4;1D6B4;039D;039D;
+1D6B5;1D6B5;1D6B5;039E;039E;
+1D6B6;1D6B6;1D6B6;039F;039F;
+1D6B7;1D6B7;1D6B7;03A0;03A0;
+1D6B8;1D6B8;1D6B8;03A1;03A1;
+1D6B9;1D6B9;1D6B9;0398;0398;
+1D6BA;1D6BA;1D6BA;03A3;03A3;
+1D6BB;1D6BB;1D6BB;03A4;03A4;
+1D6BC;1D6BC;1D6BC;03A5;03A5;
+1D6BD;1D6BD;1D6BD;03A6;03A6;
+1D6BE;1D6BE;1D6BE;03A7;03A7;
+1D6BF;1D6BF;1D6BF;03A8;03A8;
+1D6C0;1D6C0;1D6C0;03A9;03A9;
+1D6C1;1D6C1;1D6C1;2207;2207;
+1D6C2;1D6C2;1D6C2;03B1;03B1;
+1D6C3;1D6C3;1D6C3;03B2;03B2;
+1D6C4;1D6C4;1D6C4;03B3;03B3;
+1D6C5;1D6C5;1D6C5;03B4;03B4;
+1D6C6;1D6C6;1D6C6;03B5;03B5;
+1D6C7;1D6C7;1D6C7;03B6;03B6;
+1D6C8;1D6C8;1D6C8;03B7;03B7;
+1D6C9;1D6C9;1D6C9;03B8;03B8;
+1D6CA;1D6CA;1D6CA;03B9;03B9;
+1D6CB;1D6CB;1D6CB;03BA;03BA;
+1D6CC;1D6CC;1D6CC;03BB;03BB;
+1D6CD;1D6CD;1D6CD;03BC;03BC;
+1D6CE;1D6CE;1D6CE;03BD;03BD;
+1D6CF;1D6CF;1D6CF;03BE;03BE;
+1D6D0;1D6D0;1D6D0;03BF;03BF;
+1D6D1;1D6D1;1D6D1;03C0;03C0;
+1D6D2;1D6D2;1D6D2;03C1;03C1;
+1D6D3;1D6D3;1D6D3;03C2;03C2;
+1D6D4;1D6D4;1D6D4;03C3;03C3;
+1D6D5;1D6D5;1D6D5;03C4;03C4;
+1D6D6;1D6D6;1D6D6;03C5;03C5;
+1D6D7;1D6D7;1D6D7;03C6;03C6;
+1D6D8;1D6D8;1D6D8;03C7;03C7;
+1D6D9;1D6D9;1D6D9;03C8;03C8;
+1D6DA;1D6DA;1D6DA;03C9;03C9;
+1D6DB;1D6DB;1D6DB;2202;2202;
+1D6DC;1D6DC;1D6DC;03B5;03B5;
+1D6DD;1D6DD;1D6DD;03B8;03B8;
+1D6DE;1D6DE;1D6DE;03BA;03BA;
+1D6DF;1D6DF;1D6DF;03C6;03C6;
+1D6E0;1D6E0;1D6E0;03C1;03C1;
+1D6E1;1D6E1;1D6E1;03C0;03C0;
+1D6E2;1D6E2;1D6E2;0391;0391;
+1D6E3;1D6E3;1D6E3;0392;0392;
+1D6E4;1D6E4;1D6E4;0393;0393;
+1D6E5;1D6E5;1D6E5;0394;0394;
+1D6E6;1D6E6;1D6E6;0395;0395;
+1D6E7;1D6E7;1D6E7;0396;0396;
+1D6E8;1D6E8;1D6E8;0397;0397;
+1D6E9;1D6E9;1D6E9;0398;0398;
+1D6EA;1D6EA;1D6EA;0399;0399;
+1D6EB;1D6EB;1D6EB;039A;039A;
+1D6EC;1D6EC;1D6EC;039B;039B;
+1D6ED;1D6ED;1D6ED;039C;039C;
+1D6EE;1D6EE;1D6EE;039D;039D;
+1D6EF;1D6EF;1D6EF;039E;039E;
+1D6F0;1D6F0;1D6F0;039F;039F;
+1D6F1;1D6F1;1D6F1;03A0;03A0;
+1D6F2;1D6F2;1D6F2;03A1;03A1;
+1D6F3;1D6F3;1D6F3;0398;0398;
+1D6F4;1D6F4;1D6F4;03A3;03A3;
+1D6F5;1D6F5;1D6F5;03A4;03A4;
+1D6F6;1D6F6;1D6F6;03A5;03A5;
+1D6F7;1D6F7;1D6F7;03A6;03A6;
+1D6F8;1D6F8;1D6F8;03A7;03A7;
+1D6F9;1D6F9;1D6F9;03A8;03A8;
+1D6FA;1D6FA;1D6FA;03A9;03A9;
+1D6FB;1D6FB;1D6FB;2207;2207;
+1D6FC;1D6FC;1D6FC;03B1;03B1;
+1D6FD;1D6FD;1D6FD;03B2;03B2;
+1D6FE;1D6FE;1D6FE;03B3;03B3;
+1D6FF;1D6FF;1D6FF;03B4;03B4;
+1D700;1D700;1D700;03B5;03B5;
+1D701;1D701;1D701;03B6;03B6;
+1D702;1D702;1D702;03B7;03B7;
+1D703;1D703;1D703;03B8;03B8;
+1D704;1D704;1D704;03B9;03B9;
+1D705;1D705;1D705;03BA;03BA;
+1D706;1D706;1D706;03BB;03BB;
+1D707;1D707;1D707;03BC;03BC;
+1D708;1D708;1D708;03BD;03BD;
+1D709;1D709;1D709;03BE;03BE;
+1D70A;1D70A;1D70A;03BF;03BF;
+1D70B;1D70B;1D70B;03C0;03C0;
+1D70C;1D70C;1D70C;03C1;03C1;
+1D70D;1D70D;1D70D;03C2;03C2;
+1D70E;1D70E;1D70E;03C3;03C3;
+1D70F;1D70F;1D70F;03C4;03C4;
+1D710;1D710;1D710;03C5;03C5;
+1D711;1D711;1D711;03C6;03C6;
+1D712;1D712;1D712;03C7;03C7;
+1D713;1D713;1D713;03C8;03C8;
+1D714;1D714;1D714;03C9;03C9;
+1D715;1D715;1D715;2202;2202;
+1D716;1D716;1D716;03B5;03B5;
+1D717;1D717;1D717;03B8;03B8;
+1D718;1D718;1D718;03BA;03BA;
+1D719;1D719;1D719;03C6;03C6;
+1D71A;1D71A;1D71A;03C1;03C1;
+1D71B;1D71B;1D71B;03C0;03C0;
+1D71C;1D71C;1D71C;0391;0391;
+1D71D;1D71D;1D71D;0392;0392;
+1D71E;1D71E;1D71E;0393;0393;
+1D71F;1D71F;1D71F;0394;0394;
+1D720;1D720;1D720;0395;0395;
+1D721;1D721;1D721;0396;0396;
+1D722;1D722;1D722;0397;0397;
+1D723;1D723;1D723;0398;0398;
+1D724;1D724;1D724;0399;0399;
+1D725;1D725;1D725;039A;039A;
+1D726;1D726;1D726;039B;039B;
+1D727;1D727;1D727;039C;039C;
+1D728;1D728;1D728;039D;039D;
+1D729;1D729;1D729;039E;039E;
+1D72A;1D72A;1D72A;039F;039F;
+1D72B;1D72B;1D72B;03A0;03A0;
+1D72C;1D72C;1D72C;03A1;03A1;
+1D72D;1D72D;1D72D;0398;0398;
+1D72E;1D72E;1D72E;03A3;03A3;
+1D72F;1D72F;1D72F;03A4;03A4;
+1D730;1D730;1D730;03A5;03A5;
+1D731;1D731;1D731;03A6;03A6;
+1D732;1D732;1D732;03A7;03A7;
+1D733;1D733;1D733;03A8;03A8;
+1D734;1D734;1D734;03A9;03A9;
+1D735;1D735;1D735;2207;2207;
+1D736;1D736;1D736;03B1;03B1;
+1D737;1D737;1D737;03B2;03B2;
+1D738;1D738;1D738;03B3;03B3;
+1D739;1D739;1D739;03B4;03B4;
+1D73A;1D73A;1D73A;03B5;03B5;
+1D73B;1D73B;1D73B;03B6;03B6;
+1D73C;1D73C;1D73C;03B7;03B7;
+1D73D;1D73D;1D73D;03B8;03B8;
+1D73E;1D73E;1D73E;03B9;03B9;
+1D73F;1D73F;1D73F;03BA;03BA;
+1D740;1D740;1D740;03BB;03BB;
+1D741;1D741;1D741;03BC;03BC;
+1D742;1D742;1D742;03BD;03BD;
+1D743;1D743;1D743;03BE;03BE;
+1D744;1D744;1D744;03BF;03BF;
+1D745;1D745;1D745;03C0;03C0;
+1D746;1D746;1D746;03C1;03C1;
+1D747;1D747;1D747;03C2;03C2;
+1D748;1D748;1D748;03C3;03C3;
+1D749;1D749;1D749;03C4;03C4;
+1D74A;1D74A;1D74A;03C5;03C5;
+1D74B;1D74B;1D74B;03C6;03C6;
+1D74C;1D74C;1D74C;03C7;03C7;
+1D74D;1D74D;1D74D;03C8;03C8;
+1D74E;1D74E;1D74E;03C9;03C9;
+1D74F;1D74F;1D74F;2202;2202;
+1D750;1D750;1D750;03B5;03B5;
+1D751;1D751;1D751;03B8;03B8;
+1D752;1D752;1D752;03BA;03BA;
+1D753;1D753;1D753;03C6;03C6;
+1D754;1D754;1D754;03C1;03C1;
+1D755;1D755;1D755;03C0;03C0;
+1D756;1D756;1D756;0391;0391;
+1D757;1D757;1D757;0392;0392;
+1D758;1D758;1D758;0393;0393;
+1D759;1D759;1D759;0394;0394;
+1D75A;1D75A;1D75A;0395;0395;
+1D75B;1D75B;1D75B;0396;0396;
+1D75C;1D75C;1D75C;0397;0397;
+1D75D;1D75D;1D75D;0398;0398;
+1D75E;1D75E;1D75E;0399;0399;
+1D75F;1D75F;1D75F;039A;039A;
+1D760;1D760;1D760;039B;039B;
+1D761;1D761;1D761;039C;039C;
+1D762;1D762;1D762;039D;039D;
+1D763;1D763;1D763;039E;039E;
+1D764;1D764;1D764;039F;039F;
+1D765;1D765;1D765;03A0;03A0;
+1D766;1D766;1D766;03A1;03A1;
+1D767;1D767;1D767;0398;0398;
+1D768;1D768;1D768;03A3;03A3;
+1D769;1D769;1D769;03A4;03A4;
+1D76A;1D76A;1D76A;03A5;03A5;
+1D76B;1D76B;1D76B;03A6;03A6;
+1D76C;1D76C;1D76C;03A7;03A7;
+1D76D;1D76D;1D76D;03A8;03A8;
+1D76E;1D76E;1D76E;03A9;03A9;
+1D76F;1D76F;1D76F;2207;2207;
+1D770;1D770;1D770;03B1;03B1;
+1D771;1D771;1D771;03B2;03B2;
+1D772;1D772;1D772;03B3;03B3;
+1D773;1D773;1D773;03B4;03B4;
+1D774;1D774;1D774;03B5;03B5;
+1D775;1D775;1D775;03B6;03B6;
+1D776;1D776;1D776;03B7;03B7;
+1D777;1D777;1D777;03B8;03B8;
+1D778;1D778;1D778;03B9;03B9;
+1D779;1D779;1D779;03BA;03BA;
+1D77A;1D77A;1D77A;03BB;03BB;
+1D77B;1D77B;1D77B;03BC;03BC;
+1D77C;1D77C;1D77C;03BD;03BD;
+1D77D;1D77D;1D77D;03BE;03BE;
+1D77E;1D77E;1D77E;03BF;03BF;
+1D77F;1D77F;1D77F;03C0;03C0;
+1D780;1D780;1D780;03C1;03C1;
+1D781;1D781;1D781;03C2;03C2;
+1D782;1D782;1D782;03C3;03C3;
+1D783;1D783;1D783;03C4;03C4;
+1D784;1D784;1D784;03C5;03C5;
+1D785;1D785;1D785;03C6;03C6;
+1D786;1D786;1D786;03C7;03C7;
+1D787;1D787;1D787;03C8;03C8;
+1D788;1D788;1D788;03C9;03C9;
+1D789;1D789;1D789;2202;2202;
+1D78A;1D78A;1D78A;03B5;03B5;
+1D78B;1D78B;1D78B;03B8;03B8;
+1D78C;1D78C;1D78C;03BA;03BA;
+1D78D;1D78D;1D78D;03C6;03C6;
+1D78E;1D78E;1D78E;03C1;03C1;
+1D78F;1D78F;1D78F;03C0;03C0;
+1D790;1D790;1D790;0391;0391;
+1D791;1D791;1D791;0392;0392;
+1D792;1D792;1D792;0393;0393;
+1D793;1D793;1D793;0394;0394;
+1D794;1D794;1D794;0395;0395;
+1D795;1D795;1D795;0396;0396;
+1D796;1D796;1D796;0397;0397;
+1D797;1D797;1D797;0398;0398;
+1D798;1D798;1D798;0399;0399;
+1D799;1D799;1D799;039A;039A;
+1D79A;1D79A;1D79A;039B;039B;
+1D79B;1D79B;1D79B;039C;039C;
+1D79C;1D79C;1D79C;039D;039D;
+1D79D;1D79D;1D79D;039E;039E;
+1D79E;1D79E;1D79E;039F;039F;
+1D79F;1D79F;1D79F;03A0;03A0;
+1D7A0;1D7A0;1D7A0;03A1;03A1;
+1D7A1;1D7A1;1D7A1;0398;0398;
+1D7A2;1D7A2;1D7A2;03A3;03A3;
+1D7A3;1D7A3;1D7A3;03A4;03A4;
+1D7A4;1D7A4;1D7A4;03A5;03A5;
+1D7A5;1D7A5;1D7A5;03A6;03A6;
+1D7A6;1D7A6;1D7A6;03A7;03A7;
+1D7A7;1D7A7;1D7A7;03A8;03A8;
+1D7A8;1D7A8;1D7A8;03A9;03A9;
+1D7A9;1D7A9;1D7A9;2207;2207;
+1D7AA;1D7AA;1D7AA;03B1;03B1;
+1D7AB;1D7AB;1D7AB;03B2;03B2;
+1D7AC;1D7AC;1D7AC;03B3;03B3;
+1D7AD;1D7AD;1D7AD;03B4;03B4;
+1D7AE;1D7AE;1D7AE;03B5;03B5;
+1D7AF;1D7AF;1D7AF;03B6;03B6;
+1D7B0;1D7B0;1D7B0;03B7;03B7;
+1D7B1;1D7B1;1D7B1;03B8;03B8;
+1D7B2;1D7B2;1D7B2;03B9;03B9;
+1D7B3;1D7B3;1D7B3;03BA;03BA;
+1D7B4;1D7B4;1D7B4;03BB;03BB;
+1D7B5;1D7B5;1D7B5;03BC;03BC;
+1D7B6;1D7B6;1D7B6;03BD;03BD;
+1D7B7;1D7B7;1D7B7;03BE;03BE;
+1D7B8;1D7B8;1D7B8;03BF;03BF;
+1D7B9;1D7B9;1D7B9;03C0;03C0;
+1D7BA;1D7BA;1D7BA;03C1;03C1;
+1D7BB;1D7BB;1D7BB;03C2;03C2;
+1D7BC;1D7BC;1D7BC;03C3;03C3;
+1D7BD;1D7BD;1D7BD;03C4;03C4;
+1D7BE;1D7BE;1D7BE;03C5;03C5;
+1D7BF;1D7BF;1D7BF;03C6;03C6;
+1D7C0;1D7C0;1D7C0;03C7;03C7;
+1D7C1;1D7C1;1D7C1;03C8;03C8;
+1D7C2;1D7C2;1D7C2;03C9;03C9;
+1D7C3;1D7C3;1D7C3;2202;2202;
+1D7C4;1D7C4;1D7C4;03B5;03B5;
+1D7C5;1D7C5;1D7C5;03B8;03B8;
+1D7C6;1D7C6;1D7C6;03BA;03BA;
+1D7C7;1D7C7;1D7C7;03C6;03C6;
+1D7C8;1D7C8;1D7C8;03C1;03C1;
+1D7C9;1D7C9;1D7C9;03C0;03C0;
+1D7CA;1D7CA;1D7CA;03DC;03DC;
+1D7CB;1D7CB;1D7CB;03DD;03DD;
+1D7CE;1D7CE;1D7CE;0030;0030;
+1D7CF;1D7CF;1D7CF;0031;0031;
+1D7D0;1D7D0;1D7D0;0032;0032;
+1D7D1;1D7D1;1D7D1;0033;0033;
+1D7D2;1D7D2;1D7D2;0034;0034;
+1D7D3;1D7D3;1D7D3;0035;0035;
+1D7D4;1D7D4;1D7D4;0036;0036;
+1D7D5;1D7D5;1D7D5;0037;0037;
+1D7D6;1D7D6;1D7D6;0038;0038;
+1D7D7;1D7D7;1D7D7;0039;0039;
+1D7D8;1D7D8;1D7D8;0030;0030;
+1D7D9;1D7D9;1D7D9;0031;0031;
+1D7DA;1D7DA;1D7DA;0032;0032;
+1D7DB;1D7DB;1D7DB;0033;0033;
+1D7DC;1D7DC;1D7DC;0034;0034;
+1D7DD;1D7DD;1D7DD;0035;0035;
+1D7DE;1D7DE;1D7DE;0036;0036;
+1D7DF;1D7DF;1D7DF;0037;0037;
+1D7E0;1D7E0;1D7E0;0038;0038;
+1D7E1;1D7E1;1D7E1;0039;0039;
+1D7E2;1D7E2;1D7E2;0030;0030;
+1D7E3;1D7E3;1D7E3;0031;0031;
+1D7E4;1D7E4;1D7E4;0032;0032;
+1D7E5;1D7E5;1D7E5;0033;0033;
+1D7E6;1D7E6;1D7E6;0034;0034;
+1D7E7;1D7E7;1D7E7;0035;0035;
+1D7E8;1D7E8;1D7E8;0036;0036;
+1D7E9;1D7E9;1D7E9;0037;0037;
+1D7EA;1D7EA;1D7EA;0038;0038;
+1D7EB;1D7EB;1D7EB;0039;0039;
+1D7EC;1D7EC;1D7EC;0030;0030;
+1D7ED;1D7ED;1D7ED;0031;0031;
+1D7EE;1D7EE;1D7EE;0032;0032;
+1D7EF;1D7EF;1D7EF;0033;0033;
+1D7F0;1D7F0;1D7F0;0034;0034;
+1D7F1;1D7F1;1D7F1;0035;0035;
+1D7F2;1D7F2;1D7F2;0036;0036;
+1D7F3;1D7F3;1D7F3;0037;0037;
+1D7F4;1D7F4;1D7F4;0038;0038;
+1D7F5;1D7F5;1D7F5;0039;0039;
+1D7F6;1D7F6;1D7F6;0030;0030;
+1D7F7;1D7F7;1D7F7;0031;0031;
+1D7F8;1D7F8;1D7F8;0032;0032;
+1D7F9;1D7F9;1D7F9;0033;0033;
+1D7FA;1D7FA;1D7FA;0034;0034;
+1D7FB;1D7FB;1D7FB;0035;0035;
+1D7FC;1D7FC;1D7FC;0036;0036;
+1D7FD;1D7FD;1D7FD;0037;0037;
+1D7FE;1D7FE;1D7FE;0038;0038;
+1D7FF;1D7FF;1D7FF;0039;0039;
+2F800;4E3D;4E3D;4E3D;4E3D;
+2F801;4E38;4E38;4E38;4E38;
+2F802;4E41;4E41;4E41;4E41;
+2F803;20122;20122;20122;20122;
+2F804;4F60;4F60;4F60;4F60;
+2F805;4FAE;4FAE;4FAE;4FAE;
+2F806;4FBB;4FBB;4FBB;4FBB;
+2F807;5002;5002;5002;5002;
+2F808;507A;507A;507A;507A;
+2F809;5099;5099;5099;5099;
+2F80A;50E7;50E7;50E7;50E7;
+2F80B;50CF;50CF;50CF;50CF;
+2F80C;349E;349E;349E;349E;
+2F80D;2063A;2063A;2063A;2063A;
+2F80E;514D;514D;514D;514D;
+2F80F;5154;5154;5154;5154;
+2F810;5164;5164;5164;5164;
+2F811;5177;5177;5177;5177;
+2F812;2051C;2051C;2051C;2051C;
+2F813;34B9;34B9;34B9;34B9;
+2F814;5167;5167;5167;5167;
+2F815;518D;518D;518D;518D;
+2F816;2054B;2054B;2054B;2054B;
+2F817;5197;5197;5197;5197;
+2F818;51A4;51A4;51A4;51A4;
+2F819;4ECC;4ECC;4ECC;4ECC;
+2F81A;51AC;51AC;51AC;51AC;
+2F81B;51B5;51B5;51B5;51B5;
+2F81C;291DF;291DF;291DF;291DF;
+2F81D;51F5;51F5;51F5;51F5;
+2F81E;5203;5203;5203;5203;
+2F81F;34DF;34DF;34DF;34DF;
+2F820;523B;523B;523B;523B;
+2F821;5246;5246;5246;5246;
+2F822;5272;5272;5272;5272;
+2F823;5277;5277;5277;5277;
+2F824;3515;3515;3515;3515;
+2F825;52C7;52C7;52C7;52C7;
+2F826;52C9;52C9;52C9;52C9;
+2F827;52E4;52E4;52E4;52E4;
+2F828;52FA;52FA;52FA;52FA;
+2F829;5305;5305;5305;5305;
+2F82A;5306;5306;5306;5306;
+2F82B;5317;5317;5317;5317;
+2F82C;5349;5349;5349;5349;
+2F82D;5351;5351;5351;5351;
+2F82E;535A;535A;535A;535A;
+2F82F;5373;5373;5373;5373;
+2F830;537D;537D;537D;537D;
+2F831;537F;537F;537F;537F;
+2F832;537F;537F;537F;537F;
+2F833;537F;537F;537F;537F;
+2F834;20A2C;20A2C;20A2C;20A2C;
+2F835;7070;7070;7070;7070;
+2F836;53CA;53CA;53CA;53CA;
+2F837;53DF;53DF;53DF;53DF;
+2F838;20B63;20B63;20B63;20B63;
+2F839;53EB;53EB;53EB;53EB;
+2F83A;53F1;53F1;53F1;53F1;
+2F83B;5406;5406;5406;5406;
+2F83C;549E;549E;549E;549E;
+2F83D;5438;5438;5438;5438;
+2F83E;5448;5448;5448;5448;
+2F83F;5468;5468;5468;5468;
+2F840;54A2;54A2;54A2;54A2;
+2F841;54F6;54F6;54F6;54F6;
+2F842;5510;5510;5510;5510;
+2F843;5553;5553;5553;5553;
+2F844;5563;5563;5563;5563;
+2F845;5584;5584;5584;5584;
+2F846;5584;5584;5584;5584;
+2F847;5599;5599;5599;5599;
+2F848;55AB;55AB;55AB;55AB;
+2F849;55B3;55B3;55B3;55B3;
+2F84A;55C2;55C2;55C2;55C2;
+2F84B;5716;5716;5716;5716;
+2F84C;5606;5606;5606;5606;
+2F84D;5717;5717;5717;5717;
+2F84E;5651;5651;5651;5651;
+2F84F;5674;5674;5674;5674;
+2F850;5207;5207;5207;5207;
+2F851;58EE;58EE;58EE;58EE;
+2F852;57CE;57CE;57CE;57CE;
+2F853;57F4;57F4;57F4;57F4;
+2F854;580D;580D;580D;580D;
+2F855;578B;578B;578B;578B;
+2F856;5832;5832;5832;5832;
+2F857;5831;5831;5831;5831;
+2F858;58AC;58AC;58AC;58AC;
+2F859;214E4;214E4;214E4;214E4;
+2F85A;58F2;58F2;58F2;58F2;
+2F85B;58F7;58F7;58F7;58F7;
+2F85C;5906;5906;5906;5906;
+2F85D;591A;591A;591A;591A;
+2F85E;5922;5922;5922;5922;
+2F85F;5962;5962;5962;5962;
+2F860;216A8;216A8;216A8;216A8;
+2F861;216EA;216EA;216EA;216EA;
+2F862;59EC;59EC;59EC;59EC;
+2F863;5A1B;5A1B;5A1B;5A1B;
+2F864;5A27;5A27;5A27;5A27;
+2F865;59D8;59D8;59D8;59D8;
+2F866;5A66;5A66;5A66;5A66;
+2F867;36EE;36EE;36EE;36EE;
+2F868;36FC;36FC;36FC;36FC;
+2F869;5B08;5B08;5B08;5B08;
+2F86A;5B3E;5B3E;5B3E;5B3E;
+2F86B;5B3E;5B3E;5B3E;5B3E;
+2F86C;219C8;219C8;219C8;219C8;
+2F86D;5BC3;5BC3;5BC3;5BC3;
+2F86E;5BD8;5BD8;5BD8;5BD8;
+2F86F;5BE7;5BE7;5BE7;5BE7;
+2F870;5BF3;5BF3;5BF3;5BF3;
+2F871;21B18;21B18;21B18;21B18;
+2F872;5BFF;5BFF;5BFF;5BFF;
+2F873;5C06;5C06;5C06;5C06;
+2F874;5F53;5F53;5F53;5F53;
+2F875;5C22;5C22;5C22;5C22;
+2F876;3781;3781;3781;3781;
+2F877;5C60;5C60;5C60;5C60;
+2F878;5C6E;5C6E;5C6E;5C6E;
+2F879;5CC0;5CC0;5CC0;5CC0;
+2F87A;5C8D;5C8D;5C8D;5C8D;
+2F87B;21DE4;21DE4;21DE4;21DE4;
+2F87C;5D43;5D43;5D43;5D43;
+2F87D;21DE6;21DE6;21DE6;21DE6;
+2F87E;5D6E;5D6E;5D6E;5D6E;
+2F87F;5D6B;5D6B;5D6B;5D6B;
+2F880;5D7C;5D7C;5D7C;5D7C;
+2F881;5DE1;5DE1;5DE1;5DE1;
+2F882;5DE2;5DE2;5DE2;5DE2;
+2F883;382F;382F;382F;382F;
+2F884;5DFD;5DFD;5DFD;5DFD;
+2F885;5E28;5E28;5E28;5E28;
+2F886;5E3D;5E3D;5E3D;5E3D;
+2F887;5E69;5E69;5E69;5E69;
+2F888;3862;3862;3862;3862;
+2F889;22183;22183;22183;22183;
+2F88A;387C;387C;387C;387C;
+2F88B;5EB0;5EB0;5EB0;5EB0;
+2F88C;5EB3;5EB3;5EB3;5EB3;
+2F88D;5EB6;5EB6;5EB6;5EB6;
+2F88E;5ECA;5ECA;5ECA;5ECA;
+2F88F;2A392;2A392;2A392;2A392;
+2F890;5EFE;5EFE;5EFE;5EFE;
+2F891;22331;22331;22331;22331;
+2F892;22331;22331;22331;22331;
+2F893;8201;8201;8201;8201;
+2F894;5F22;5F22;5F22;5F22;
+2F895;5F22;5F22;5F22;5F22;
+2F896;38C7;38C7;38C7;38C7;
+2F897;232B8;232B8;232B8;232B8;
+2F898;261DA;261DA;261DA;261DA;
+2F899;5F62;5F62;5F62;5F62;
+2F89A;5F6B;5F6B;5F6B;5F6B;
+2F89B;38E3;38E3;38E3;38E3;
+2F89C;5F9A;5F9A;5F9A;5F9A;
+2F89D;5FCD;5FCD;5FCD;5FCD;
+2F89E;5FD7;5FD7;5FD7;5FD7;
+2F89F;5FF9;5FF9;5FF9;5FF9;
+2F8A0;6081;6081;6081;6081;
+2F8A1;393A;393A;393A;393A;
+2F8A2;391C;391C;391C;391C;
+2F8A3;6094;6094;6094;6094;
+2F8A4;226D4;226D4;226D4;226D4;
+2F8A5;60C7;60C7;60C7;60C7;
+2F8A6;6148;6148;6148;6148;
+2F8A7;614C;614C;614C;614C;
+2F8A8;614E;614E;614E;614E;
+2F8A9;614C;614C;614C;614C;
+2F8AA;617A;617A;617A;617A;
+2F8AB;618E;618E;618E;618E;
+2F8AC;61B2;61B2;61B2;61B2;
+2F8AD;61A4;61A4;61A4;61A4;
+2F8AE;61AF;61AF;61AF;61AF;
+2F8AF;61DE;61DE;61DE;61DE;
+2F8B0;61F2;61F2;61F2;61F2;
+2F8B1;61F6;61F6;61F6;61F6;
+2F8B2;6210;6210;6210;6210;
+2F8B3;621B;621B;621B;621B;
+2F8B4;625D;625D;625D;625D;
+2F8B5;62B1;62B1;62B1;62B1;
+2F8B6;62D4;62D4;62D4;62D4;
+2F8B7;6350;6350;6350;6350;
+2F8B8;22B0C;22B0C;22B0C;22B0C;
+2F8B9;633D;633D;633D;633D;
+2F8BA;62FC;62FC;62FC;62FC;
+2F8BB;6368;6368;6368;6368;
+2F8BC;6383;6383;6383;6383;
+2F8BD;63E4;63E4;63E4;63E4;
+2F8BE;22BF1;22BF1;22BF1;22BF1;
+2F8BF;6422;6422;6422;6422;
+2F8C0;63C5;63C5;63C5;63C5;
+2F8C1;63A9;63A9;63A9;63A9;
+2F8C2;3A2E;3A2E;3A2E;3A2E;
+2F8C3;6469;6469;6469;6469;
+2F8C4;647E;647E;647E;647E;
+2F8C5;649D;649D;649D;649D;
+2F8C6;6477;6477;6477;6477;
+2F8C7;3A6C;3A6C;3A6C;3A6C;
+2F8C8;654F;654F;654F;654F;
+2F8C9;656C;656C;656C;656C;
+2F8CA;2300A;2300A;2300A;2300A;
+2F8CB;65E3;65E3;65E3;65E3;
+2F8CC;66F8;66F8;66F8;66F8;
+2F8CD;6649;6649;6649;6649;
+2F8CE;3B19;3B19;3B19;3B19;
+2F8CF;6691;6691;6691;6691;
+2F8D0;3B08;3B08;3B08;3B08;
+2F8D1;3AE4;3AE4;3AE4;3AE4;
+2F8D2;5192;5192;5192;5192;
+2F8D3;5195;5195;5195;5195;
+2F8D4;6700;6700;6700;6700;
+2F8D5;669C;669C;669C;669C;
+2F8D6;80AD;80AD;80AD;80AD;
+2F8D7;43D9;43D9;43D9;43D9;
+2F8D8;6717;6717;6717;6717;
+2F8D9;671B;671B;671B;671B;
+2F8DA;6721;6721;6721;6721;
+2F8DB;675E;675E;675E;675E;
+2F8DC;6753;6753;6753;6753;
+2F8DD;233C3;233C3;233C3;233C3;
+2F8DE;3B49;3B49;3B49;3B49;
+2F8DF;67FA;67FA;67FA;67FA;
+2F8E0;6785;6785;6785;6785;
+2F8E1;6852;6852;6852;6852;
+2F8E2;6885;6885;6885;6885;
+2F8E3;2346D;2346D;2346D;2346D;
+2F8E4;688E;688E;688E;688E;
+2F8E5;681F;681F;681F;681F;
+2F8E6;6914;6914;6914;6914;
+2F8E7;3B9D;3B9D;3B9D;3B9D;
+2F8E8;6942;6942;6942;6942;
+2F8E9;69A3;69A3;69A3;69A3;
+2F8EA;69EA;69EA;69EA;69EA;
+2F8EB;6AA8;6AA8;6AA8;6AA8;
+2F8EC;236A3;236A3;236A3;236A3;
+2F8ED;6ADB;6ADB;6ADB;6ADB;
+2F8EE;3C18;3C18;3C18;3C18;
+2F8EF;6B21;6B21;6B21;6B21;
+2F8F0;238A7;238A7;238A7;238A7;
+2F8F1;6B54;6B54;6B54;6B54;
+2F8F2;3C4E;3C4E;3C4E;3C4E;
+2F8F3;6B72;6B72;6B72;6B72;
+2F8F4;6B9F;6B9F;6B9F;6B9F;
+2F8F5;6BBA;6BBA;6BBA;6BBA;
+2F8F6;6BBB;6BBB;6BBB;6BBB;
+2F8F7;23A8D;23A8D;23A8D;23A8D;
+2F8F8;21D0B;21D0B;21D0B;21D0B;
+2F8F9;23AFA;23AFA;23AFA;23AFA;
+2F8FA;6C4E;6C4E;6C4E;6C4E;
+2F8FB;23CBC;23CBC;23CBC;23CBC;
+2F8FC;6CBF;6CBF;6CBF;6CBF;
+2F8FD;6CCD;6CCD;6CCD;6CCD;
+2F8FE;6C67;6C67;6C67;6C67;
+2F8FF;6D16;6D16;6D16;6D16;
+2F900;6D3E;6D3E;6D3E;6D3E;
+2F901;6D77;6D77;6D77;6D77;
+2F902;6D41;6D41;6D41;6D41;
+2F903;6D69;6D69;6D69;6D69;
+2F904;6D78;6D78;6D78;6D78;
+2F905;6D85;6D85;6D85;6D85;
+2F906;23D1E;23D1E;23D1E;23D1E;
+2F907;6D34;6D34;6D34;6D34;
+2F908;6E2F;6E2F;6E2F;6E2F;
+2F909;6E6E;6E6E;6E6E;6E6E;
+2F90A;3D33;3D33;3D33;3D33;
+2F90B;6ECB;6ECB;6ECB;6ECB;
+2F90C;6EC7;6EC7;6EC7;6EC7;
+2F90D;23ED1;23ED1;23ED1;23ED1;
+2F90E;6DF9;6DF9;6DF9;6DF9;
+2F90F;6F6E;6F6E;6F6E;6F6E;
+2F910;23F5E;23F5E;23F5E;23F5E;
+2F911;23F8E;23F8E;23F8E;23F8E;
+2F912;6FC6;6FC6;6FC6;6FC6;
+2F913;7039;7039;7039;7039;
+2F914;701E;701E;701E;701E;
+2F915;701B;701B;701B;701B;
+2F916;3D96;3D96;3D96;3D96;
+2F917;704A;704A;704A;704A;
+2F918;707D;707D;707D;707D;
+2F919;7077;7077;7077;7077;
+2F91A;70AD;70AD;70AD;70AD;
+2F91B;20525;20525;20525;20525;
+2F91C;7145;7145;7145;7145;
+2F91D;24263;24263;24263;24263;
+2F91E;719C;719C;719C;719C;
+2F91F;243AB;243AB;243AB;243AB;
+2F920;7228;7228;7228;7228;
+2F921;7235;7235;7235;7235;
+2F922;7250;7250;7250;7250;
+2F923;24608;24608;24608;24608;
+2F924;7280;7280;7280;7280;
+2F925;7295;7295;7295;7295;
+2F926;24735;24735;24735;24735;
+2F927;24814;24814;24814;24814;
+2F928;737A;737A;737A;737A;
+2F929;738B;738B;738B;738B;
+2F92A;3EAC;3EAC;3EAC;3EAC;
+2F92B;73A5;73A5;73A5;73A5;
+2F92C;3EB8;3EB8;3EB8;3EB8;
+2F92D;3EB8;3EB8;3EB8;3EB8;
+2F92E;7447;7447;7447;7447;
+2F92F;745C;745C;745C;745C;
+2F930;7471;7471;7471;7471;
+2F931;7485;7485;7485;7485;
+2F932;74CA;74CA;74CA;74CA;
+2F933;3F1B;3F1B;3F1B;3F1B;
+2F934;7524;7524;7524;7524;
+2F935;24C36;24C36;24C36;24C36;
+2F936;753E;753E;753E;753E;
+2F937;24C92;24C92;24C92;24C92;
+2F938;7570;7570;7570;7570;
+2F939;2219F;2219F;2219F;2219F;
+2F93A;7610;7610;7610;7610;
+2F93B;24FA1;24FA1;24FA1;24FA1;
+2F93C;24FB8;24FB8;24FB8;24FB8;
+2F93D;25044;25044;25044;25044;
+2F93E;3FFC;3FFC;3FFC;3FFC;
+2F93F;4008;4008;4008;4008;
+2F940;76F4;76F4;76F4;76F4;
+2F941;250F3;250F3;250F3;250F3;
+2F942;250F2;250F2;250F2;250F2;
+2F943;25119;25119;25119;25119;
+2F944;25133;25133;25133;25133;
+2F945;771E;771E;771E;771E;
+2F946;771F;771F;771F;771F;
+2F947;771F;771F;771F;771F;
+2F948;774A;774A;774A;774A;
+2F949;4039;4039;4039;4039;
+2F94A;778B;778B;778B;778B;
+2F94B;4046;4046;4046;4046;
+2F94C;4096;4096;4096;4096;
+2F94D;2541D;2541D;2541D;2541D;
+2F94E;784E;784E;784E;784E;
+2F94F;788C;788C;788C;788C;
+2F950;78CC;78CC;78CC;78CC;
+2F951;40E3;40E3;40E3;40E3;
+2F952;25626;25626;25626;25626;
+2F953;7956;7956;7956;7956;
+2F954;2569A;2569A;2569A;2569A;
+2F955;256C5;256C5;256C5;256C5;
+2F956;798F;798F;798F;798F;
+2F957;79EB;79EB;79EB;79EB;
+2F958;412F;412F;412F;412F;
+2F959;7A40;7A40;7A40;7A40;
+2F95A;7A4A;7A4A;7A4A;7A4A;
+2F95B;7A4F;7A4F;7A4F;7A4F;
+2F95C;2597C;2597C;2597C;2597C;
+2F95D;25AA7;25AA7;25AA7;25AA7;
+2F95E;25AA7;25AA7;25AA7;25AA7;
+2F95F;7AEE;7AEE;7AEE;7AEE;
+2F960;4202;4202;4202;4202;
+2F961;25BAB;25BAB;25BAB;25BAB;
+2F962;7BC6;7BC6;7BC6;7BC6;
+2F963;7BC9;7BC9;7BC9;7BC9;
+2F964;4227;4227;4227;4227;
+2F965;25C80;25C80;25C80;25C80;
+2F966;7CD2;7CD2;7CD2;7CD2;
+2F967;42A0;42A0;42A0;42A0;
+2F968;7CE8;7CE8;7CE8;7CE8;
+2F969;7CE3;7CE3;7CE3;7CE3;
+2F96A;7D00;7D00;7D00;7D00;
+2F96B;25F86;25F86;25F86;25F86;
+2F96C;7D63;7D63;7D63;7D63;
+2F96D;4301;4301;4301;4301;
+2F96E;7DC7;7DC7;7DC7;7DC7;
+2F96F;7E02;7E02;7E02;7E02;
+2F970;7E45;7E45;7E45;7E45;
+2F971;4334;4334;4334;4334;
+2F972;26228;26228;26228;26228;
+2F973;26247;26247;26247;26247;
+2F974;4359;4359;4359;4359;
+2F975;262D9;262D9;262D9;262D9;
+2F976;7F7A;7F7A;7F7A;7F7A;
+2F977;2633E;2633E;2633E;2633E;
+2F978;7F95;7F95;7F95;7F95;
+2F979;7FFA;7FFA;7FFA;7FFA;
+2F97A;8005;8005;8005;8005;
+2F97B;264DA;264DA;264DA;264DA;
+2F97C;26523;26523;26523;26523;
+2F97D;8060;8060;8060;8060;
+2F97E;265A8;265A8;265A8;265A8;
+2F97F;8070;8070;8070;8070;
+2F980;2335F;2335F;2335F;2335F;
+2F981;43D5;43D5;43D5;43D5;
+2F982;80B2;80B2;80B2;80B2;
+2F983;8103;8103;8103;8103;
+2F984;440B;440B;440B;440B;
+2F985;813E;813E;813E;813E;
+2F986;5AB5;5AB5;5AB5;5AB5;
+2F987;267A7;267A7;267A7;267A7;
+2F988;267B5;267B5;267B5;267B5;
+2F989;23393;23393;23393;23393;
+2F98A;2339C;2339C;2339C;2339C;
+2F98B;8201;8201;8201;8201;
+2F98C;8204;8204;8204;8204;
+2F98D;8F9E;8F9E;8F9E;8F9E;
+2F98E;446B;446B;446B;446B;
+2F98F;8291;8291;8291;8291;
+2F990;828B;828B;828B;828B;
+2F991;829D;829D;829D;829D;
+2F992;52B3;52B3;52B3;52B3;
+2F993;82B1;82B1;82B1;82B1;
+2F994;82B3;82B3;82B3;82B3;
+2F995;82BD;82BD;82BD;82BD;
+2F996;82E6;82E6;82E6;82E6;
+2F997;26B3C;26B3C;26B3C;26B3C;
+2F998;82E5;82E5;82E5;82E5;
+2F999;831D;831D;831D;831D;
+2F99A;8363;8363;8363;8363;
+2F99B;83AD;83AD;83AD;83AD;
+2F99C;8323;8323;8323;8323;
+2F99D;83BD;83BD;83BD;83BD;
+2F99E;83E7;83E7;83E7;83E7;
+2F99F;8457;8457;8457;8457;
+2F9A0;8353;8353;8353;8353;
+2F9A1;83CA;83CA;83CA;83CA;
+2F9A2;83CC;83CC;83CC;83CC;
+2F9A3;83DC;83DC;83DC;83DC;
+2F9A4;26C36;26C36;26C36;26C36;
+2F9A5;26D6B;26D6B;26D6B;26D6B;
+2F9A6;26CD5;26CD5;26CD5;26CD5;
+2F9A7;452B;452B;452B;452B;
+2F9A8;84F1;84F1;84F1;84F1;
+2F9A9;84F3;84F3;84F3;84F3;
+2F9AA;8516;8516;8516;8516;
+2F9AB;273CA;273CA;273CA;273CA;
+2F9AC;8564;8564;8564;8564;
+2F9AD;26F2C;26F2C;26F2C;26F2C;
+2F9AE;455D;455D;455D;455D;
+2F9AF;4561;4561;4561;4561;
+2F9B0;26FB1;26FB1;26FB1;26FB1;
+2F9B1;270D2;270D2;270D2;270D2;
+2F9B2;456B;456B;456B;456B;
+2F9B3;8650;8650;8650;8650;
+2F9B4;865C;865C;865C;865C;
+2F9B5;8667;8667;8667;8667;
+2F9B6;8669;8669;8669;8669;
+2F9B7;86A9;86A9;86A9;86A9;
+2F9B8;8688;8688;8688;8688;
+2F9B9;870E;870E;870E;870E;
+2F9BA;86E2;86E2;86E2;86E2;
+2F9BB;8779;8779;8779;8779;
+2F9BC;8728;8728;8728;8728;
+2F9BD;876B;876B;876B;876B;
+2F9BE;8786;8786;8786;8786;
+2F9BF;45D7;45D7;45D7;45D7;
+2F9C0;87E1;87E1;87E1;87E1;
+2F9C1;8801;8801;8801;8801;
+2F9C2;45F9;45F9;45F9;45F9;
+2F9C3;8860;8860;8860;8860;
+2F9C4;8863;8863;8863;8863;
+2F9C5;27667;27667;27667;27667;
+2F9C6;88D7;88D7;88D7;88D7;
+2F9C7;88DE;88DE;88DE;88DE;
+2F9C8;4635;4635;4635;4635;
+2F9C9;88FA;88FA;88FA;88FA;
+2F9CA;34BB;34BB;34BB;34BB;
+2F9CB;278AE;278AE;278AE;278AE;
+2F9CC;27966;27966;27966;27966;
+2F9CD;46BE;46BE;46BE;46BE;
+2F9CE;46C7;46C7;46C7;46C7;
+2F9CF;8AA0;8AA0;8AA0;8AA0;
+2F9D0;8AED;8AED;8AED;8AED;
+2F9D1;8B8A;8B8A;8B8A;8B8A;
+2F9D2;8C55;8C55;8C55;8C55;
+2F9D3;27CA8;27CA8;27CA8;27CA8;
+2F9D4;8CAB;8CAB;8CAB;8CAB;
+2F9D5;8CC1;8CC1;8CC1;8CC1;
+2F9D6;8D1B;8D1B;8D1B;8D1B;
+2F9D7;8D77;8D77;8D77;8D77;
+2F9D8;27F2F;27F2F;27F2F;27F2F;
+2F9D9;20804;20804;20804;20804;
+2F9DA;8DCB;8DCB;8DCB;8DCB;
+2F9DB;8DBC;8DBC;8DBC;8DBC;
+2F9DC;8DF0;8DF0;8DF0;8DF0;
+2F9DD;208DE;208DE;208DE;208DE;
+2F9DE;8ED4;8ED4;8ED4;8ED4;
+2F9DF;8F38;8F38;8F38;8F38;
+2F9E0;285D2;285D2;285D2;285D2;
+2F9E1;285ED;285ED;285ED;285ED;
+2F9E2;9094;9094;9094;9094;
+2F9E3;90F1;90F1;90F1;90F1;
+2F9E4;9111;9111;9111;9111;
+2F9E5;2872E;2872E;2872E;2872E;
+2F9E6;911B;911B;911B;911B;
+2F9E7;9238;9238;9238;9238;
+2F9E8;92D7;92D7;92D7;92D7;
+2F9E9;92D8;92D8;92D8;92D8;
+2F9EA;927C;927C;927C;927C;
+2F9EB;93F9;93F9;93F9;93F9;
+2F9EC;9415;9415;9415;9415;
+2F9ED;28BFA;28BFA;28BFA;28BFA;
+2F9EE;958B;958B;958B;958B;
+2F9EF;4995;4995;4995;4995;
+2F9F0;95B7;95B7;95B7;95B7;
+2F9F1;28D77;28D77;28D77;28D77;
+2F9F2;49E6;49E6;49E6;49E6;
+2F9F3;96C3;96C3;96C3;96C3;
+2F9F4;5DB2;5DB2;5DB2;5DB2;
+2F9F5;9723;9723;9723;9723;
+2F9F6;29145;29145;29145;29145;
+2F9F7;2921A;2921A;2921A;2921A;
+2F9F8;4A6E;4A6E;4A6E;4A6E;
+2F9F9;4A76;4A76;4A76;4A76;
+2F9FA;97E0;97E0;97E0;97E0;
+2F9FB;2940A;2940A;2940A;2940A;
+2F9FC;4AB2;4AB2;4AB2;4AB2;
+2F9FD;29496;29496;29496;29496;
+2F9FE;980B;980B;980B;980B;
+2F9FF;980B;980B;980B;980B;
+2FA00;9829;9829;9829;9829;
+2FA01;295B6;295B6;295B6;295B6;
+2FA02;98E2;98E2;98E2;98E2;
+2FA03;4B33;4B33;4B33;4B33;
+2FA04;9929;9929;9929;9929;
+2FA05;99A7;99A7;99A7;99A7;
+2FA06;99C2;99C2;99C2;99C2;
+2FA07;99FE;99FE;99FE;99FE;
+2FA08;4BCE;4BCE;4BCE;4BCE;
+2FA09;29B30;29B30;29B30;29B30;
+2FA0A;9B12;9B12;9B12;9B12;
+2FA0B;9C40;9C40;9C40;9C40;
+2FA0C;9CFD;9CFD;9CFD;9CFD;
+2FA0D;4CCE;4CCE;4CCE;4CCE;
+2FA0E;4CED;4CED;4CED;4CED;
+2FA0F;9D67;9D67;9D67;9D67;
+2FA10;2A0CE;2A0CE;2A0CE;2A0CE;
+2FA11;4CF8;4CF8;4CF8;4CF8;
+2FA12;2A105;2A105;2A105;2A105;
+2FA13;2A20E;2A20E;2A20E;2A20E;
+2FA14;2A291;2A291;2A291;2A291;
+2FA15;9EBB;9EBB;9EBB;9EBB;
+2FA16;4D56;4D56;4D56;4D56;
+2FA17;9EF9;9EF9;9EF9;9EF9;
+2FA18;9EFE;9EFE;9EFE;9EFE;
+2FA19;9F05;9F05;9F05;9F05;
+2FA1A;9F0F;9F0F;9F0F;9F0F;
+2FA1B;9F16;9F16;9F16;9F16;
+2FA1C;9F3B;9F3B;9F3B;9F3B;
+2FA1D;2A600;2A600;2A600;2A600;
+
+@Part2
+
+0061 0315 0300 05AE 0300 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;
+0061 0300 0315 0300 05AE 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;
+0061 0315 0300 05AE 0301 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062;
+0061 0301 0315 0300 05AE 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062;
+0061 0315 0300 05AE 0302 0062;00E0 05AE 0302 0315 0062;0061 05AE 0300 0302 0315 0062;00E0 05AE 0302 0315 0062;0061 05AE 0300 0302 0315 0062;
+0061 0302 0315 0300 05AE 0062;1EA7 05AE 0315 0062;0061 05AE 0302 0300 0315 0062;1EA7 05AE 0315 0062;0061 05AE 0302 0300 0315 0062;
+0061 0315 0300 05AE 0303 0062;00E0 05AE 0303 0315 0062;0061 05AE 0300 0303 0315 0062;00E0 05AE 0303 0315 0062;0061 05AE 0300 0303 0315 0062;
+0061 0303 0315 0300 05AE 0062;00E3 05AE 0300 0315 0062;0061 05AE 0303 0300 0315 0062;00E3 05AE 0300 0315 0062;0061 05AE 0303 0300 0315 0062;
+0061 0315 0300 05AE 0304 0062;00E0 05AE 0304 0315 0062;0061 05AE 0300 0304 0315 0062;00E0 05AE 0304 0315 0062;0061 05AE 0300 0304 0315 0062;
+0061 0304 0315 0300 05AE 0062;0101 05AE 0300 0315 0062;0061 05AE 0304 0300 0315 0062;0101 05AE 0300 0315 0062;0061 05AE 0304 0300 0315 0062;
+0061 0315 0300 05AE 0305 0062;00E0 05AE 0305 0315 0062;0061 05AE 0300 0305 0315 0062;00E0 05AE 0305 0315 0062;0061 05AE 0300 0305 0315 0062;
+0061 0305 0315 0300 05AE 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062;
+0061 0315 0300 05AE 0306 0062;00E0 05AE 0306 0315 0062;0061 05AE 0300 0306 0315 0062;00E0 05AE 0306 0315 0062;0061 05AE 0300 0306 0315 0062;
+0061 0306 0315 0300 05AE 0062;1EB1 05AE 0315 0062;0061 05AE 0306 0300 0315 0062;1EB1 05AE 0315 0062;0061 05AE 0306 0300 0315 0062;
+0061 0315 0300 05AE 0307 0062;00E0 05AE 0307 0315 0062;0061 05AE 0300 0307 0315 0062;00E0 05AE 0307 0315 0062;0061 05AE 0300 0307 0315 0062;
+0061 0307 0315 0300 05AE 0062;0227 05AE 0300 0315 0062;0061 05AE 0307 0300 0315 0062;0227 05AE 0300 0315 0062;0061 05AE 0307 0300 0315 0062;
+0061 0315 0300 05AE 0308 0062;00E0 05AE 0308 0315 0062;0061 05AE 0300 0308 0315 0062;00E0 05AE 0308 0315 0062;0061 05AE 0300 0308 0315 0062;
+0061 0308 0315 0300 05AE 0062;00E4 05AE 0300 0315 0062;0061 05AE 0308 0300 0315 0062;00E4 05AE 0300 0315 0062;0061 05AE 0308 0300 0315 0062;
+0061 0315 0300 05AE 0309 0062;00E0 05AE 0309 0315 0062;0061 05AE 0300 0309 0315 0062;00E0 05AE 0309 0315 0062;0061 05AE 0300 0309 0315 0062;
+0061 0309 0315 0300 05AE 0062;1EA3 05AE 0300 0315 0062;0061 05AE 0309 0300 0315 0062;1EA3 05AE 0300 0315 0062;0061 05AE 0309 0300 0315 0062;
+0061 0315 0300 05AE 030A 0062;00E0 05AE 030A 0315 0062;0061 05AE 0300 030A 0315 0062;00E0 05AE 030A 0315 0062;0061 05AE 0300 030A 0315 0062;
+0061 030A 0315 0300 05AE 0062;00E5 05AE 0300 0315 0062;0061 05AE 030A 0300 0315 0062;00E5 05AE 0300 0315 0062;0061 05AE 030A 0300 0315 0062;
+0061 0315 0300 05AE 030B 0062;00E0 05AE 030B 0315 0062;0061 05AE 0300 030B 0315 0062;00E0 05AE 030B 0315 0062;0061 05AE 0300 030B 0315 0062;
+0061 030B 0315 0300 05AE 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062;
+0061 0315 0300 05AE 030C 0062;00E0 05AE 030C 0315 0062;0061 05AE 0300 030C 0315 0062;00E0 05AE 030C 0315 0062;0061 05AE 0300 030C 0315 0062;
+0061 030C 0315 0300 05AE 0062;01CE 05AE 0300 0315 0062;0061 05AE 030C 0300 0315 0062;01CE 05AE 0300 0315 0062;0061 05AE 030C 0300 0315 0062;
+0061 0315 0300 05AE 030D 0062;00E0 05AE 030D 0315 0062;0061 05AE 0300 030D 0315 0062;00E0 05AE 030D 0315 0062;0061 05AE 0300 030D 0315 0062;
+0061 030D 0315 0300 05AE 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062;
+0061 0315 0300 05AE 030E 0062;00E0 05AE 030E 0315 0062;0061 05AE 0300 030E 0315 0062;00E0 05AE 030E 0315 0062;0061 05AE 0300 030E 0315 0062;
+0061 030E 0315 0300 05AE 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062;
+0061 0315 0300 05AE 030F 0062;00E0 05AE 030F 0315 0062;0061 05AE 0300 030F 0315 0062;00E0 05AE 030F 0315 0062;0061 05AE 0300 030F 0315 0062;
+0061 030F 0315 0300 05AE 0062;0201 05AE 0300 0315 0062;0061 05AE 030F 0300 0315 0062;0201 05AE 0300 0315 0062;0061 05AE 030F 0300 0315 0062;
+0061 0315 0300 05AE 0310 0062;00E0 05AE 0310 0315 0062;0061 05AE 0300 0310 0315 0062;00E0 05AE 0310 0315 0062;0061 05AE 0300 0310 0315 0062;
+0061 0310 0315 0300 05AE 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062;
+0061 0315 0300 05AE 0311 0062;00E0 05AE 0311 0315 0062;0061 05AE 0300 0311 0315 0062;00E0 05AE 0311 0315 0062;0061 05AE 0300 0311 0315 0062;
+0061 0311 0315 0300 05AE 0062;0203 05AE 0300 0315 0062;0061 05AE 0311 0300 0315 0062;0203 05AE 0300 0315 0062;0061 05AE 0311 0300 0315 0062;
+0061 0315 0300 05AE 0312 0062;00E0 05AE 0312 0315 0062;0061 05AE 0300 0312 0315 0062;00E0 05AE 0312 0315 0062;0061 05AE 0300 0312 0315 0062;
+0061 0312 0315 0300 05AE 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062;
+0061 0315 0300 05AE 0313 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062;
+0061 0313 0315 0300 05AE 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;
+0061 0315 0300 05AE 0314 0062;00E0 05AE 0314 0315 0062;0061 05AE 0300 0314 0315 0062;00E0 05AE 0314 0315 0062;0061 05AE 0300 0314 0315 0062;
+0061 0314 0315 0300 05AE 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;
+0061 035C 0315 0300 0315 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062;
+0061 0315 035C 0315 0300 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062;
+0061 059A 0316 302A 0316 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;
+0061 0316 059A 0316 302A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;
+0061 059A 0316 302A 0317 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062;
+0061 0317 059A 0316 302A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062;
+0061 059A 0316 302A 0318 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062;
+0061 0318 059A 0316 302A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062;
+0061 059A 0316 302A 0319 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062;
+0061 0319 059A 0316 302A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062;
+0061 035C 0315 0300 031A 0062;00E0 0315 031A 035C 0062;0061 0300 0315 031A 035C 0062;00E0 0315 031A 035C 0062;0061 0300 0315 031A 035C 0062;
+0061 031A 035C 0315 0300 0062;00E0 031A 0315 035C 0062;0061 0300 031A 0315 035C 0062;00E0 031A 0315 035C 0062;0061 0300 031A 0315 035C 0062;
+0061 302A 031B 1DCE 031B 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;
+0061 031B 302A 031B 1DCE 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;
+0061 059A 0316 302A 031C 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062;
+0061 031C 059A 0316 302A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062;
+0061 059A 0316 302A 031D 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062;
+0061 031D 059A 0316 302A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062;
+0061 059A 0316 302A 031E 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062;
+0061 031E 059A 0316 302A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062;
+0061 059A 0316 302A 031F 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062;
+0061 031F 059A 0316 302A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062;
+0061 059A 0316 302A 0320 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062;
+0061 0320 059A 0316 302A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062;
+0061 1DCE 0321 0F74 0321 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;
+0061 0321 1DCE 0321 0F74 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;
+0061 1DCE 0321 0F74 0322 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062;
+0061 0322 1DCE 0321 0F74 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062;
+0061 059A 0316 302A 0323 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062;
+0061 0323 059A 0316 302A 0062;1EA1 302A 0316 059A 0062;0061 302A 0323 0316 059A 0062;1EA1 302A 0316 059A 0062;0061 302A 0323 0316 059A 0062;
+0061 059A 0316 302A 0324 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062;
+0061 0324 059A 0316 302A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062;
+0061 059A 0316 302A 0325 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062;
+0061 0325 059A 0316 302A 0062;1E01 302A 0316 059A 0062;0061 302A 0325 0316 059A 0062;1E01 302A 0316 059A 0062;0061 302A 0325 0316 059A 0062;
+0061 059A 0316 302A 0326 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062;
+0061 0326 059A 0316 302A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062;
+0061 1DCE 0321 0F74 0327 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062;
+0061 0327 1DCE 0321 0F74 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062;
+0061 1DCE 0321 0F74 0328 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062;
+0061 0328 1DCE 0321 0F74 0062;0105 0F74 0321 1DCE 0062;0061 0F74 0328 0321 1DCE 0062;0105 0F74 0321 1DCE 0062;0061 0F74 0328 0321 1DCE 0062;
+0061 059A 0316 302A 0329 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062;
+0061 0329 059A 0316 302A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062;
+0061 059A 0316 302A 032A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062;
+0061 032A 059A 0316 302A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062;
+0061 059A 0316 302A 032B 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062;
+0061 032B 059A 0316 302A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062;
+0061 059A 0316 302A 032C 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062;
+0061 032C 059A 0316 302A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062;
+0061 059A 0316 302A 032D 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062;
+0061 032D 059A 0316 302A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062;
+0061 059A 0316 302A 032E 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062;
+0061 032E 059A 0316 302A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062;
+0061 059A 0316 302A 032F 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062;
+0061 032F 059A 0316 302A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062;
+0061 059A 0316 302A 0330 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062;
+0061 0330 059A 0316 302A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062;
+0061 059A 0316 302A 0331 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062;
+0061 0331 059A 0316 302A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062;
+0061 059A 0316 302A 0332 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062;
+0061 0332 059A 0316 302A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062;
+0061 059A 0316 302A 0333 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062;
+0061 0333 059A 0316 302A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062;
+0061 093C 0334 0334 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;
+0061 0334 093C 0334 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;
+0061 093C 0334 0335 0062;0061 0334 0335 093C 0062;0061 0334 0335 093C 0062;0061 0334 0335 093C 0062;0061 0334 0335 093C 0062;
+0061 0335 093C 0334 0062;0061 0335 0334 093C 0062;0061 0335 0334 093C 0062;0061 0335 0334 093C 0062;0061 0335 0334 093C 0062;
+0061 093C 0334 0336 0062;0061 0334 0336 093C 0062;0061 0334 0336 093C 0062;0061 0334 0336 093C 0062;0061 0334 0336 093C 0062;
+0061 0336 093C 0334 0062;0061 0336 0334 093C 0062;0061 0336 0334 093C 0062;0061 0336 0334 093C 0062;0061 0336 0334 093C 0062;
+0061 093C 0334 0337 0062;0061 0334 0337 093C 0062;0061 0334 0337 093C 0062;0061 0334 0337 093C 0062;0061 0334 0337 093C 0062;
+0061 0337 093C 0334 0062;0061 0337 0334 093C 0062;0061 0337 0334 093C 0062;0061 0337 0334 093C 0062;0061 0337 0334 093C 0062;
+0061 093C 0334 0338 0062;0061 0334 0338 093C 0062;0061 0334 0338 093C 0062;0061 0334 0338 093C 0062;0061 0334 0338 093C 0062;
+0061 0338 093C 0334 0062;0061 0338 0334 093C 0062;0061 0338 0334 093C 0062;0061 0338 0334 093C 0062;0061 0338 0334 093C 0062;
+0061 059A 0316 302A 0339 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062;
+0061 0339 059A 0316 302A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062;
+0061 059A 0316 302A 033A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062;
+0061 033A 059A 0316 302A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062;
+0061 059A 0316 302A 033B 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062;
+0061 033B 059A 0316 302A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062;
+0061 059A 0316 302A 033C 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062;
+0061 033C 059A 0316 302A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062;
+0061 0315 0300 05AE 033D 0062;00E0 05AE 033D 0315 0062;0061 05AE 0300 033D 0315 0062;00E0 05AE 033D 0315 0062;0061 05AE 0300 033D 0315 0062;
+0061 033D 0315 0300 05AE 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;
+0061 0315 0300 05AE 033E 0062;00E0 05AE 033E 0315 0062;0061 05AE 0300 033E 0315 0062;00E0 05AE 033E 0315 0062;0061 05AE 0300 033E 0315 0062;
+0061 033E 0315 0300 05AE 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062;
+0061 0315 0300 05AE 033F 0062;00E0 05AE 033F 0315 0062;0061 05AE 0300 033F 0315 0062;00E0 05AE 033F 0315 0062;0061 05AE 0300 033F 0315 0062;
+0061 033F 0315 0300 05AE 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062;
+0061 0315 0300 05AE 0340 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;
+0061 0340 0315 0300 05AE 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;
+0061 0315 0300 05AE 0341 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062;
+0061 0341 0315 0300 05AE 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062;
+0061 0315 0300 05AE 0342 0062;00E0 05AE 0342 0315 0062;0061 05AE 0300 0342 0315 0062;00E0 05AE 0342 0315 0062;0061 05AE 0300 0342 0315 0062;
+0061 0342 0315 0300 05AE 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062;
+0061 0315 0300 05AE 0343 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062;
+0061 0343 0315 0300 05AE 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;
+0061 0315 0300 05AE 0344 0062;00E0 05AE 0308 0301 0315 0062;0061 05AE 0300 0308 0301 0315 0062;00E0 05AE 0308 0301 0315 0062;0061 05AE 0300 0308 0301 0315 0062;
+0061 0344 0315 0300 05AE 0062;00E4 05AE 0301 0300 0315 0062;0061 05AE 0308 0301 0300 0315 0062;00E4 05AE 0301 0300 0315 0062;0061 05AE 0308 0301 0300 0315 0062;
+0061 0345 035D 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;
+0061 0345 0345 035D 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;
+0061 0315 0300 05AE 0346 0062;00E0 05AE 0346 0315 0062;0061 05AE 0300 0346 0315 0062;00E0 05AE 0346 0315 0062;0061 05AE 0300 0346 0315 0062;
+0061 0346 0315 0300 05AE 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;
+0061 059A 0316 302A 0347 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062;
+0061 0347 059A 0316 302A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062;
+0061 059A 0316 302A 0348 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062;
+0061 0348 059A 0316 302A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062;
+0061 059A 0316 302A 0349 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062;
+0061 0349 059A 0316 302A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062;
+0061 0315 0300 05AE 034A 0062;00E0 05AE 034A 0315 0062;0061 05AE 0300 034A 0315 0062;00E0 05AE 034A 0315 0062;0061 05AE 0300 034A 0315 0062;
+0061 034A 0315 0300 05AE 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;
+0061 0315 0300 05AE 034B 0062;00E0 05AE 034B 0315 0062;0061 05AE 0300 034B 0315 0062;00E0 05AE 034B 0315 0062;0061 05AE 0300 034B 0315 0062;
+0061 034B 0315 0300 05AE 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;
+0061 0315 0300 05AE 034C 0062;00E0 05AE 034C 0315 0062;0061 05AE 0300 034C 0315 0062;00E0 05AE 034C 0315 0062;0061 05AE 0300 034C 0315 0062;
+0061 034C 0315 0300 05AE 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;
+0061 059A 0316 302A 034D 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062;
+0061 034D 059A 0316 302A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062;
+0061 059A 0316 302A 034E 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062;
+0061 034E 059A 0316 302A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062;
+0061 0315 0300 05AE 0350 0062;00E0 05AE 0350 0315 0062;0061 05AE 0300 0350 0315 0062;00E0 05AE 0350 0315 0062;0061 05AE 0300 0350 0315 0062;
+0061 0350 0315 0300 05AE 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062;
+0061 0315 0300 05AE 0351 0062;00E0 05AE 0351 0315 0062;0061 05AE 0300 0351 0315 0062;00E0 05AE 0351 0315 0062;0061 05AE 0300 0351 0315 0062;
+0061 0351 0315 0300 05AE 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062;
+0061 0315 0300 05AE 0352 0062;00E0 05AE 0352 0315 0062;0061 05AE 0300 0352 0315 0062;00E0 05AE 0352 0315 0062;0061 05AE 0300 0352 0315 0062;
+0061 0352 0315 0300 05AE 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062;
+0061 059A 0316 302A 0353 0062;0061 302A 0316 0353 059A 0062;0061 302A 0316 0353 059A 0062;0061 302A 0316 0353 059A 0062;0061 302A 0316 0353 059A 0062;
+0061 0353 059A 0316 302A 0062;0061 302A 0353 0316 059A 0062;0061 302A 0353 0316 059A 0062;0061 302A 0353 0316 059A 0062;0061 302A 0353 0316 059A 0062;
+0061 059A 0316 302A 0354 0062;0061 302A 0316 0354 059A 0062;0061 302A 0316 0354 059A 0062;0061 302A 0316 0354 059A 0062;0061 302A 0316 0354 059A 0062;
+0061 0354 059A 0316 302A 0062;0061 302A 0354 0316 059A 0062;0061 302A 0354 0316 059A 0062;0061 302A 0354 0316 059A 0062;0061 302A 0354 0316 059A 0062;
+0061 059A 0316 302A 0355 0062;0061 302A 0316 0355 059A 0062;0061 302A 0316 0355 059A 0062;0061 302A 0316 0355 059A 0062;0061 302A 0316 0355 059A 0062;
+0061 0355 059A 0316 302A 0062;0061 302A 0355 0316 059A 0062;0061 302A 0355 0316 059A 0062;0061 302A 0355 0316 059A 0062;0061 302A 0355 0316 059A 0062;
+0061 059A 0316 302A 0356 0062;0061 302A 0316 0356 059A 0062;0061 302A 0316 0356 059A 0062;0061 302A 0316 0356 059A 0062;0061 302A 0316 0356 059A 0062;
+0061 0356 059A 0316 302A 0062;0061 302A 0356 0316 059A 0062;0061 302A 0356 0316 059A 0062;0061 302A 0356 0316 059A 0062;0061 302A 0356 0316 059A 0062;
+0061 0315 0300 05AE 0357 0062;00E0 05AE 0357 0315 0062;0061 05AE 0300 0357 0315 0062;00E0 05AE 0357 0315 0062;0061 05AE 0300 0357 0315 0062;
+0061 0357 0315 0300 05AE 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062;
+0061 035C 0315 0300 0358 0062;00E0 0315 0358 035C 0062;0061 0300 0315 0358 035C 0062;00E0 0315 0358 035C 0062;0061 0300 0315 0358 035C 0062;
+0061 0358 035C 0315 0300 0062;00E0 0358 0315 035C 0062;0061 0300 0358 0315 035C 0062;00E0 0358 0315 035C 0062;0061 0300 0358 0315 035C 0062;
+0061 059A 0316 302A 0359 0062;0061 302A 0316 0359 059A 0062;0061 302A 0316 0359 059A 0062;0061 302A 0316 0359 059A 0062;0061 302A 0316 0359 059A 0062;
+0061 0359 059A 0316 302A 0062;0061 302A 0359 0316 059A 0062;0061 302A 0359 0316 059A 0062;0061 302A 0359 0316 059A 0062;0061 302A 0359 0316 059A 0062;
+0061 059A 0316 302A 035A 0062;0061 302A 0316 035A 059A 0062;0061 302A 0316 035A 059A 0062;0061 302A 0316 035A 059A 0062;0061 302A 0316 035A 059A 0062;
+0061 035A 059A 0316 302A 0062;0061 302A 035A 0316 059A 0062;0061 302A 035A 0316 059A 0062;0061 302A 035A 0316 059A 0062;0061 302A 035A 0316 059A 0062;
+0061 0315 0300 05AE 035B 0062;00E0 05AE 035B 0315 0062;0061 05AE 0300 035B 0315 0062;00E0 05AE 035B 0315 0062;0061 05AE 0300 035B 0315 0062;
+0061 035B 0315 0300 05AE 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062;
+0061 035D 035C 0315 035C 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;
+0061 035C 035D 035C 0315 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;
+0061 0345 035D 035C 035D 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;
+0061 035D 0345 035D 035C 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;
+0061 0345 035D 035C 035E 0062;0061 035C 035D 035E 0345 0062;0061 035C 035D 035E 0345 0062;0061 035C 035D 035E 0345 0062;0061 035C 035D 035E 0345 0062;
+0061 035E 0345 035D 035C 0062;0061 035C 035E 035D 0345 0062;0061 035C 035E 035D 0345 0062;0061 035C 035E 035D 0345 0062;0061 035C 035E 035D 0345 0062;
+0061 035D 035C 0315 035F 0062;0061 0315 035C 035F 035D 0062;0061 0315 035C 035F 035D 0062;0061 0315 035C 035F 035D 0062;0061 0315 035C 035F 035D 0062;
+0061 035F 035D 035C 0315 0062;0061 0315 035F 035C 035D 0062;0061 0315 035F 035C 035D 0062;0061 0315 035F 035C 035D 0062;0061 0315 035F 035C 035D 0062;
+0061 0345 035D 035C 0360 0062;0061 035C 035D 0360 0345 0062;0061 035C 035D 0360 0345 0062;0061 035C 035D 0360 0345 0062;0061 035C 035D 0360 0345 0062;
+0061 0360 0345 035D 035C 0062;0061 035C 0360 035D 0345 0062;0061 035C 0360 035D 0345 0062;0061 035C 0360 035D 0345 0062;0061 035C 0360 035D 0345 0062;
+0061 0345 035D 035C 0361 0062;0061 035C 035D 0361 0345 0062;0061 035C 035D 0361 0345 0062;0061 035C 035D 0361 0345 0062;0061 035C 035D 0361 0345 0062;
+0061 0361 0345 035D 035C 0062;0061 035C 0361 035D 0345 0062;0061 035C 0361 035D 0345 0062;0061 035C 0361 035D 0345 0062;0061 035C 0361 035D 0345 0062;
+0061 035D 035C 0315 0362 0062;0061 0315 035C 0362 035D 0062;0061 0315 035C 0362 035D 0062;0061 0315 035C 0362 035D 0062;0061 0315 035C 0362 035D 0062;
+0061 0362 035D 035C 0315 0062;0061 0315 0362 035C 035D 0062;0061 0315 0362 035C 035D 0062;0061 0315 0362 035C 035D 0062;0061 0315 0362 035C 035D 0062;
+0061 0315 0300 05AE 0363 0062;00E0 05AE 0363 0315 0062;0061 05AE 0300 0363 0315 0062;00E0 05AE 0363 0315 0062;0061 05AE 0300 0363 0315 0062;
+0061 0363 0315 0300 05AE 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062;
+0061 0315 0300 05AE 0364 0062;00E0 05AE 0364 0315 0062;0061 05AE 0300 0364 0315 0062;00E0 05AE 0364 0315 0062;0061 05AE 0300 0364 0315 0062;
+0061 0364 0315 0300 05AE 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062;
+0061 0315 0300 05AE 0365 0062;00E0 05AE 0365 0315 0062;0061 05AE 0300 0365 0315 0062;00E0 05AE 0365 0315 0062;0061 05AE 0300 0365 0315 0062;
+0061 0365 0315 0300 05AE 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062;
+0061 0315 0300 05AE 0366 0062;00E0 05AE 0366 0315 0062;0061 05AE 0300 0366 0315 0062;00E0 05AE 0366 0315 0062;0061 05AE 0300 0366 0315 0062;
+0061 0366 0315 0300 05AE 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062;
+0061 0315 0300 05AE 0367 0062;00E0 05AE 0367 0315 0062;0061 05AE 0300 0367 0315 0062;00E0 05AE 0367 0315 0062;0061 05AE 0300 0367 0315 0062;
+0061 0367 0315 0300 05AE 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062;
+0061 0315 0300 05AE 0368 0062;00E0 05AE 0368 0315 0062;0061 05AE 0300 0368 0315 0062;00E0 05AE 0368 0315 0062;0061 05AE 0300 0368 0315 0062;
+0061 0368 0315 0300 05AE 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062;
+0061 0315 0300 05AE 0369 0062;00E0 05AE 0369 0315 0062;0061 05AE 0300 0369 0315 0062;00E0 05AE 0369 0315 0062;0061 05AE 0300 0369 0315 0062;
+0061 0369 0315 0300 05AE 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062;
+0061 0315 0300 05AE 036A 0062;00E0 05AE 036A 0315 0062;0061 05AE 0300 036A 0315 0062;00E0 05AE 036A 0315 0062;0061 05AE 0300 036A 0315 0062;
+0061 036A 0315 0300 05AE 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062;
+0061 0315 0300 05AE 036B 0062;00E0 05AE 036B 0315 0062;0061 05AE 0300 036B 0315 0062;00E0 05AE 036B 0315 0062;0061 05AE 0300 036B 0315 0062;
+0061 036B 0315 0300 05AE 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062;
+0061 0315 0300 05AE 036C 0062;00E0 05AE 036C 0315 0062;0061 05AE 0300 036C 0315 0062;00E0 05AE 036C 0315 0062;0061 05AE 0300 036C 0315 0062;
+0061 036C 0315 0300 05AE 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062;
+0061 0315 0300 05AE 036D 0062;00E0 05AE 036D 0315 0062;0061 05AE 0300 036D 0315 0062;00E0 05AE 036D 0315 0062;0061 05AE 0300 036D 0315 0062;
+0061 036D 0315 0300 05AE 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062;
+0061 0315 0300 05AE 036E 0062;00E0 05AE 036E 0315 0062;0061 05AE 0300 036E 0315 0062;00E0 05AE 036E 0315 0062;0061 05AE 0300 036E 0315 0062;
+0061 036E 0315 0300 05AE 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062;
+0061 0315 0300 05AE 036F 0062;00E0 05AE 036F 0315 0062;0061 05AE 0300 036F 0315 0062;00E0 05AE 036F 0315 0062;0061 05AE 0300 036F 0315 0062;
+0061 036F 0315 0300 05AE 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062;
+0061 0315 0300 05AE 0483 0062;00E0 05AE 0483 0315 0062;0061 05AE 0300 0483 0315 0062;00E0 05AE 0483 0315 0062;0061 05AE 0300 0483 0315 0062;
+0061 0483 0315 0300 05AE 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062;
+0061 0315 0300 05AE 0484 0062;00E0 05AE 0484 0315 0062;0061 05AE 0300 0484 0315 0062;00E0 05AE 0484 0315 0062;0061 05AE 0300 0484 0315 0062;
+0061 0484 0315 0300 05AE 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062;
+0061 0315 0300 05AE 0485 0062;00E0 05AE 0485 0315 0062;0061 05AE 0300 0485 0315 0062;00E0 05AE 0485 0315 0062;0061 05AE 0300 0485 0315 0062;
+0061 0485 0315 0300 05AE 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062;
+0061 0315 0300 05AE 0486 0062;00E0 05AE 0486 0315 0062;0061 05AE 0300 0486 0315 0062;00E0 05AE 0486 0315 0062;0061 05AE 0300 0486 0315 0062;
+0061 0486 0315 0300 05AE 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;
+0061 0315 0300 05AE 0487 0062;00E0 05AE 0487 0315 0062;0061 05AE 0300 0487 0315 0062;00E0 05AE 0487 0315 0062;0061 05AE 0300 0487 0315 0062;
+0061 0487 0315 0300 05AE 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062;
+0061 059A 0316 302A 0591 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062;
+0061 0591 059A 0316 302A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062;
+0061 0315 0300 05AE 0592 0062;00E0 05AE 0592 0315 0062;0061 05AE 0300 0592 0315 0062;00E0 05AE 0592 0315 0062;0061 05AE 0300 0592 0315 0062;
+0061 0592 0315 0300 05AE 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;
+0061 0315 0300 05AE 0593 0062;00E0 05AE 0593 0315 0062;0061 05AE 0300 0593 0315 0062;00E0 05AE 0593 0315 0062;0061 05AE 0300 0593 0315 0062;
+0061 0593 0315 0300 05AE 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062;
+0061 0315 0300 05AE 0594 0062;00E0 05AE 0594 0315 0062;0061 05AE 0300 0594 0315 0062;00E0 05AE 0594 0315 0062;0061 05AE 0300 0594 0315 0062;
+0061 0594 0315 0300 05AE 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;
+0061 0315 0300 05AE 0595 0062;00E0 05AE 0595 0315 0062;0061 05AE 0300 0595 0315 0062;00E0 05AE 0595 0315 0062;0061 05AE 0300 0595 0315 0062;
+0061 0595 0315 0300 05AE 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;
+0061 059A 0316 302A 0596 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062;
+0061 0596 059A 0316 302A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062;
+0061 0315 0300 05AE 0597 0062;00E0 05AE 0597 0315 0062;0061 05AE 0300 0597 0315 0062;00E0 05AE 0597 0315 0062;0061 05AE 0300 0597 0315 0062;
+0061 0597 0315 0300 05AE 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;
+0061 0315 0300 05AE 0598 0062;00E0 05AE 0598 0315 0062;0061 05AE 0300 0598 0315 0062;00E0 05AE 0598 0315 0062;0061 05AE 0300 0598 0315 0062;
+0061 0598 0315 0300 05AE 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062;
+0061 0315 0300 05AE 0599 0062;00E0 05AE 0599 0315 0062;0061 05AE 0300 0599 0315 0062;00E0 05AE 0599 0315 0062;0061 05AE 0300 0599 0315 0062;
+0061 0599 0315 0300 05AE 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;
+0061 302E 059A 0316 059A 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;
+0061 059A 302E 059A 0316 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;
+0061 059A 0316 302A 059B 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062;
+0061 059B 059A 0316 302A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062;
+0061 0315 0300 05AE 059C 0062;00E0 05AE 059C 0315 0062;0061 05AE 0300 059C 0315 0062;00E0 05AE 059C 0315 0062;0061 05AE 0300 059C 0315 0062;
+0061 059C 0315 0300 05AE 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;
+0061 0315 0300 05AE 059D 0062;00E0 05AE 059D 0315 0062;0061 05AE 0300 059D 0315 0062;00E0 05AE 059D 0315 0062;0061 05AE 0300 059D 0315 0062;
+0061 059D 0315 0300 05AE 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062;
+0061 0315 0300 05AE 059E 0062;00E0 05AE 059E 0315 0062;0061 05AE 0300 059E 0315 0062;00E0 05AE 059E 0315 0062;0061 05AE 0300 059E 0315 0062;
+0061 059E 0315 0300 05AE 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062;
+0061 0315 0300 05AE 059F 0062;00E0 05AE 059F 0315 0062;0061 05AE 0300 059F 0315 0062;00E0 05AE 059F 0315 0062;0061 05AE 0300 059F 0315 0062;
+0061 059F 0315 0300 05AE 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062;
+0061 0315 0300 05AE 05A0 0062;00E0 05AE 05A0 0315 0062;0061 05AE 0300 05A0 0315 0062;00E0 05AE 05A0 0315 0062;0061 05AE 0300 05A0 0315 0062;
+0061 05A0 0315 0300 05AE 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;
+0061 0315 0300 05AE 05A1 0062;00E0 05AE 05A1 0315 0062;0061 05AE 0300 05A1 0315 0062;00E0 05AE 05A1 0315 0062;0061 05AE 0300 05A1 0315 0062;
+0061 05A1 0315 0300 05AE 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;
+0061 059A 0316 302A 05A2 0062;0061 302A 0316 05A2 059A 0062;0061 302A 0316 05A2 059A 0062;0061 302A 0316 05A2 059A 0062;0061 302A 0316 05A2 059A 0062;
+0061 05A2 059A 0316 302A 0062;0061 302A 05A2 0316 059A 0062;0061 302A 05A2 0316 059A 0062;0061 302A 05A2 0316 059A 0062;0061 302A 05A2 0316 059A 0062;
+0061 059A 0316 302A 05A3 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062;
+0061 05A3 059A 0316 302A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062;
+0061 059A 0316 302A 05A4 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062;
+0061 05A4 059A 0316 302A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062;
+0061 059A 0316 302A 05A5 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062;
+0061 05A5 059A 0316 302A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062;
+0061 059A 0316 302A 05A6 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062;
+0061 05A6 059A 0316 302A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062;
+0061 059A 0316 302A 05A7 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062;
+0061 05A7 059A 0316 302A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062;
+0061 0315 0300 05AE 05A8 0062;00E0 05AE 05A8 0315 0062;0061 05AE 0300 05A8 0315 0062;00E0 05AE 05A8 0315 0062;0061 05AE 0300 05A8 0315 0062;
+0061 05A8 0315 0300 05AE 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;
+0061 0315 0300 05AE 05A9 0062;00E0 05AE 05A9 0315 0062;0061 05AE 0300 05A9 0315 0062;00E0 05AE 05A9 0315 0062;0061 05AE 0300 05A9 0315 0062;
+0061 05A9 0315 0300 05AE 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;
+0061 059A 0316 302A 05AA 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062;
+0061 05AA 059A 0316 302A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062;
+0061 0315 0300 05AE 05AB 0062;00E0 05AE 05AB 0315 0062;0061 05AE 0300 05AB 0315 0062;00E0 05AE 05AB 0315 0062;0061 05AE 0300 05AB 0315 0062;
+0061 05AB 0315 0300 05AE 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;
+0061 0315 0300 05AE 05AC 0062;00E0 05AE 05AC 0315 0062;0061 05AE 0300 05AC 0315 0062;00E0 05AE 05AC 0315 0062;0061 05AE 0300 05AC 0315 0062;
+0061 05AC 0315 0300 05AE 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062;
+0061 302E 059A 0316 05AD 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062;
+0061 05AD 302E 059A 0316 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062;
+0061 0300 05AE 1D16D 05AE 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062;
+0061 05AE 0300 05AE 1D16D 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062;
+0061 0315 0300 05AE 05AF 0062;00E0 05AE 05AF 0315 0062;0061 05AE 0300 05AF 0315 0062;00E0 05AE 05AF 0315 0062;0061 05AE 0300 05AF 0315 0062;
+0061 05AF 0315 0300 05AE 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062;
+0061 05B1 05B0 094D 05B0 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;
+0061 05B0 05B1 05B0 094D 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;
+0061 05B2 05B1 05B0 05B1 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;
+0061 05B1 05B2 05B1 05B0 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;
+0061 05B3 05B2 05B1 05B2 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;
+0061 05B2 05B3 05B2 05B1 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;
+0061 05B4 05B3 05B2 05B3 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;
+0061 05B3 05B4 05B3 05B2 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;
+0061 05B5 05B4 05B3 05B4 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;
+0061 05B4 05B5 05B4 05B3 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;
+0061 05B6 05B5 05B4 05B5 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;
+0061 05B5 05B6 05B5 05B4 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;
+0061 05B7 05B6 05B5 05B6 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;
+0061 05B6 05B7 05B6 05B5 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;
+0061 05B8 05B7 05B6 05B7 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;
+0061 05B7 05B8 05B7 05B6 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;
+0061 05B9 05B8 05B7 05B8 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;
+0061 05B8 05B9 05B8 05B7 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;
+0061 05BB 05B9 05B8 05B9 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;
+0061 05B9 05BB 05B9 05B8 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;
+0061 05BB 05B9 05B8 05BA 0062;0061 05B8 05B9 05BA 05BB 0062;0061 05B8 05B9 05BA 05BB 0062;0061 05B8 05B9 05BA 05BB 0062;0061 05B8 05B9 05BA 05BB 0062;
+0061 05BA 05BB 05B9 05B8 0062;0061 05B8 05BA 05B9 05BB 0062;0061 05B8 05BA 05B9 05BB 0062;0061 05B8 05BA 05B9 05BB 0062;0061 05B8 05BA 05B9 05BB 0062;
+0061 05BC 05BB 05B9 05BB 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;
+0061 05BB 05BC 05BB 05B9 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;
+0061 05BD 05BC 05BB 05BC 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;
+0061 05BC 05BD 05BC 05BB 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;
+0061 05BF 05BD 05BC 05BD 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;
+0061 05BD 05BF 05BD 05BC 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;
+0061 05C1 05BF 05BD 05BF 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;
+0061 05BF 05C1 05BF 05BD 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;
+0061 05C2 05C1 05BF 05C1 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;
+0061 05C1 05C2 05C1 05BF 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;
+0061 FB1E 05C2 05C1 05C2 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;
+0061 05C2 FB1E 05C2 05C1 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;
+0061 0315 0300 05AE 05C4 0062;00E0 05AE 05C4 0315 0062;0061 05AE 0300 05C4 0315 0062;00E0 05AE 05C4 0315 0062;0061 05AE 0300 05C4 0315 0062;
+0061 05C4 0315 0300 05AE 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;
+0061 059A 0316 302A 05C5 0062;0061 302A 0316 05C5 059A 0062;0061 302A 0316 05C5 059A 0062;0061 302A 0316 05C5 059A 0062;0061 302A 0316 05C5 059A 0062;
+0061 05C5 059A 0316 302A 0062;0061 302A 05C5 0316 059A 0062;0061 302A 05C5 0316 059A 0062;0061 302A 05C5 0316 059A 0062;0061 302A 05C5 0316 059A 0062;
+0061 05B9 05B8 05B7 05C7 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062;
+0061 05C7 05B9 05B8 05B7 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062;
+0061 0315 0300 05AE 0610 0062;00E0 05AE 0610 0315 0062;0061 05AE 0300 0610 0315 0062;00E0 05AE 0610 0315 0062;0061 05AE 0300 0610 0315 0062;
+0061 0610 0315 0300 05AE 0062;0061 05AE 0610 0300 0315 0062;0061 05AE 0610 0300 0315 0062;0061 05AE 0610 0300 0315 0062;0061 05AE 0610 0300 0315 0062;
+0061 0315 0300 05AE 0611 0062;00E0 05AE 0611 0315 0062;0061 05AE 0300 0611 0315 0062;00E0 05AE 0611 0315 0062;0061 05AE 0300 0611 0315 0062;
+0061 0611 0315 0300 05AE 0062;0061 05AE 0611 0300 0315 0062;0061 05AE 0611 0300 0315 0062;0061 05AE 0611 0300 0315 0062;0061 05AE 0611 0300 0315 0062;
+0061 0315 0300 05AE 0612 0062;00E0 05AE 0612 0315 0062;0061 05AE 0300 0612 0315 0062;00E0 05AE 0612 0315 0062;0061 05AE 0300 0612 0315 0062;
+0061 0612 0315 0300 05AE 0062;0061 05AE 0612 0300 0315 0062;0061 05AE 0612 0300 0315 0062;0061 05AE 0612 0300 0315 0062;0061 05AE 0612 0300 0315 0062;
+0061 0315 0300 05AE 0613 0062;00E0 05AE 0613 0315 0062;0061 05AE 0300 0613 0315 0062;00E0 05AE 0613 0315 0062;0061 05AE 0300 0613 0315 0062;
+0061 0613 0315 0300 05AE 0062;0061 05AE 0613 0300 0315 0062;0061 05AE 0613 0300 0315 0062;0061 05AE 0613 0300 0315 0062;0061 05AE 0613 0300 0315 0062;
+0061 0315 0300 05AE 0614 0062;00E0 05AE 0614 0315 0062;0061 05AE 0300 0614 0315 0062;00E0 05AE 0614 0315 0062;0061 05AE 0300 0614 0315 0062;
+0061 0614 0315 0300 05AE 0062;0061 05AE 0614 0300 0315 0062;0061 05AE 0614 0300 0315 0062;0061 05AE 0614 0300 0315 0062;0061 05AE 0614 0300 0315 0062;
+0061 0315 0300 05AE 0615 0062;00E0 05AE 0615 0315 0062;0061 05AE 0300 0615 0315 0062;00E0 05AE 0615 0315 0062;0061 05AE 0300 0615 0315 0062;
+0061 0615 0315 0300 05AE 0062;0061 05AE 0615 0300 0315 0062;0061 05AE 0615 0300 0315 0062;0061 05AE 0615 0300 0315 0062;0061 05AE 0615 0300 0315 0062;
+0061 0315 0300 05AE 0616 0062;00E0 05AE 0616 0315 0062;0061 05AE 0300 0616 0315 0062;00E0 05AE 0616 0315 0062;0061 05AE 0300 0616 0315 0062;
+0061 0616 0315 0300 05AE 0062;0061 05AE 0616 0300 0315 0062;0061 05AE 0616 0300 0315 0062;0061 05AE 0616 0300 0315 0062;0061 05AE 0616 0300 0315 0062;
+0061 0315 0300 05AE 0617 0062;00E0 05AE 0617 0315 0062;0061 05AE 0300 0617 0315 0062;00E0 05AE 0617 0315 0062;0061 05AE 0300 0617 0315 0062;
+0061 0617 0315 0300 05AE 0062;0061 05AE 0617 0300 0315 0062;0061 05AE 0617 0300 0315 0062;0061 05AE 0617 0300 0315 0062;0061 05AE 0617 0300 0315 0062;
+0061 0619 0618 064D 0618 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;
+0061 0618 0619 0618 064D 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;
+0061 061A 0619 0618 0619 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;
+0061 0619 061A 0619 0618 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;
+0061 0651 061A 0619 061A 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;
+0061 061A 0651 061A 0619 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;
+0061 064C 064B FB1E 064B 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;
+0061 064B 064C 064B FB1E 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;
+0061 064D 064C 064B 064C 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;
+0061 064C 064D 064C 064B 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;
+0061 0618 064D 064C 064D 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;
+0061 064D 0618 064D 064C 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;
+0061 0619 0618 064D 064E 0062;0061 064D 0618 064E 0619 0062;0061 064D 0618 064E 0619 0062;0061 064D 0618 064E 0619 0062;0061 064D 0618 064E 0619 0062;
+0061 064E 0619 0618 064D 0062;0061 064D 064E 0618 0619 0062;0061 064D 064E 0618 0619 0062;0061 064D 064E 0618 0619 0062;0061 064D 064E 0618 0619 0062;
+0061 061A 0619 0618 064F 0062;0061 0618 0619 064F 061A 0062;0061 0618 0619 064F 061A 0062;0061 0618 0619 064F 061A 0062;0061 0618 0619 064F 061A 0062;
+0061 064F 061A 0619 0618 0062;0061 0618 064F 0619 061A 0062;0061 0618 064F 0619 061A 0062;0061 0618 064F 0619 061A 0062;0061 0618 064F 0619 061A 0062;
+0061 0651 061A 0619 0650 0062;0061 0619 061A 0650 0651 0062;0061 0619 061A 0650 0651 0062;0061 0619 061A 0650 0651 0062;0061 0619 061A 0650 0651 0062;
+0061 0650 0651 061A 0619 0062;0061 0619 0650 061A 0651 0062;0061 0619 0650 061A 0651 0062;0061 0619 0650 061A 0651 0062;0061 0619 0650 061A 0651 0062;
+0061 0652 0651 061A 0651 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;
+0061 0651 0652 0651 061A 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;
+0061 0670 0652 0651 0652 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;
+0061 0652 0670 0652 0651 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;
+0061 0315 0300 05AE 0653 0062;00E0 05AE 0653 0315 0062;0061 05AE 0300 0653 0315 0062;00E0 05AE 0653 0315 0062;0061 05AE 0300 0653 0315 0062;
+0061 0653 0315 0300 05AE 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;
+0061 0315 0300 05AE 0654 0062;00E0 05AE 0654 0315 0062;0061 05AE 0300 0654 0315 0062;00E0 05AE 0654 0315 0062;0061 05AE 0300 0654 0315 0062;
+0061 0654 0315 0300 05AE 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;
+0061 059A 0316 302A 0655 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062;
+0061 0655 059A 0316 302A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062;
+0061 059A 0316 302A 0656 0062;0061 302A 0316 0656 059A 0062;0061 302A 0316 0656 059A 0062;0061 302A 0316 0656 059A 0062;0061 302A 0316 0656 059A 0062;
+0061 0656 059A 0316 302A 0062;0061 302A 0656 0316 059A 0062;0061 302A 0656 0316 059A 0062;0061 302A 0656 0316 059A 0062;0061 302A 0656 0316 059A 0062;
+0061 0315 0300 05AE 0657 0062;00E0 05AE 0657 0315 0062;0061 05AE 0300 0657 0315 0062;00E0 05AE 0657 0315 0062;0061 05AE 0300 0657 0315 0062;
+0061 0657 0315 0300 05AE 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062;
+0061 0315 0300 05AE 0658 0062;00E0 05AE 0658 0315 0062;0061 05AE 0300 0658 0315 0062;00E0 05AE 0658 0315 0062;0061 05AE 0300 0658 0315 0062;
+0061 0658 0315 0300 05AE 0062;0061 05AE 0658 0300 0315 0062;0061 05AE 0658 0300 0315 0062;0061 05AE 0658 0300 0315 0062;0061 05AE 0658 0300 0315 0062;
+0061 0315 0300 05AE 0659 0062;00E0 05AE 0659 0315 0062;0061 05AE 0300 0659 0315 0062;00E0 05AE 0659 0315 0062;0061 05AE 0300 0659 0315 0062;
+0061 0659 0315 0300 05AE 0062;0061 05AE 0659 0300 0315 0062;0061 05AE 0659 0300 0315 0062;0061 05AE 0659 0300 0315 0062;0061 05AE 0659 0300 0315 0062;
+0061 0315 0300 05AE 065A 0062;00E0 05AE 065A 0315 0062;0061 05AE 0300 065A 0315 0062;00E0 05AE 065A 0315 0062;0061 05AE 0300 065A 0315 0062;
+0061 065A 0315 0300 05AE 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062;
+0061 0315 0300 05AE 065B 0062;00E0 05AE 065B 0315 0062;0061 05AE 0300 065B 0315 0062;00E0 05AE 065B 0315 0062;0061 05AE 0300 065B 0315 0062;
+0061 065B 0315 0300 05AE 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062;
+0061 059A 0316 302A 065C 0062;0061 302A 0316 065C 059A 0062;0061 302A 0316 065C 059A 0062;0061 302A 0316 065C 059A 0062;0061 302A 0316 065C 059A 0062;
+0061 065C 059A 0316 302A 0062;0061 302A 065C 0316 059A 0062;0061 302A 065C 0316 059A 0062;0061 302A 065C 0316 059A 0062;0061 302A 065C 0316 059A 0062;
+0061 0315 0300 05AE 065D 0062;00E0 05AE 065D 0315 0062;0061 05AE 0300 065D 0315 0062;00E0 05AE 065D 0315 0062;0061 05AE 0300 065D 0315 0062;
+0061 065D 0315 0300 05AE 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062;
+0061 0315 0300 05AE 065E 0062;00E0 05AE 065E 0315 0062;0061 05AE 0300 065E 0315 0062;00E0 05AE 065E 0315 0062;0061 05AE 0300 065E 0315 0062;
+0061 065E 0315 0300 05AE 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062;
+0061 0711 0670 0652 0670 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;
+0061 0670 0711 0670 0652 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;
+0061 0315 0300 05AE 06D6 0062;00E0 05AE 06D6 0315 0062;0061 05AE 0300 06D6 0315 0062;00E0 05AE 06D6 0315 0062;0061 05AE 0300 06D6 0315 0062;
+0061 06D6 0315 0300 05AE 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062;
+0061 0315 0300 05AE 06D7 0062;00E0 05AE 06D7 0315 0062;0061 05AE 0300 06D7 0315 0062;00E0 05AE 06D7 0315 0062;0061 05AE 0300 06D7 0315 0062;
+0061 06D7 0315 0300 05AE 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062;
+0061 0315 0300 05AE 06D8 0062;00E0 05AE 06D8 0315 0062;0061 05AE 0300 06D8 0315 0062;00E0 05AE 06D8 0315 0062;0061 05AE 0300 06D8 0315 0062;
+0061 06D8 0315 0300 05AE 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062;
+0061 0315 0300 05AE 06D9 0062;00E0 05AE 06D9 0315 0062;0061 05AE 0300 06D9 0315 0062;00E0 05AE 06D9 0315 0062;0061 05AE 0300 06D9 0315 0062;
+0061 06D9 0315 0300 05AE 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062;
+0061 0315 0300 05AE 06DA 0062;00E0 05AE 06DA 0315 0062;0061 05AE 0300 06DA 0315 0062;00E0 05AE 06DA 0315 0062;0061 05AE 0300 06DA 0315 0062;
+0061 06DA 0315 0300 05AE 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062;
+0061 0315 0300 05AE 06DB 0062;00E0 05AE 06DB 0315 0062;0061 05AE 0300 06DB 0315 0062;00E0 05AE 06DB 0315 0062;0061 05AE 0300 06DB 0315 0062;
+0061 06DB 0315 0300 05AE 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062;
+0061 0315 0300 05AE 06DC 0062;00E0 05AE 06DC 0315 0062;0061 05AE 0300 06DC 0315 0062;00E0 05AE 06DC 0315 0062;0061 05AE 0300 06DC 0315 0062;
+0061 06DC 0315 0300 05AE 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062;
+0061 0315 0300 05AE 06DF 0062;00E0 05AE 06DF 0315 0062;0061 05AE 0300 06DF 0315 0062;00E0 05AE 06DF 0315 0062;0061 05AE 0300 06DF 0315 0062;
+0061 06DF 0315 0300 05AE 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062;
+0061 0315 0300 05AE 06E0 0062;00E0 05AE 06E0 0315 0062;0061 05AE 0300 06E0 0315 0062;00E0 05AE 06E0 0315 0062;0061 05AE 0300 06E0 0315 0062;
+0061 06E0 0315 0300 05AE 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062;
+0061 0315 0300 05AE 06E1 0062;00E0 05AE 06E1 0315 0062;0061 05AE 0300 06E1 0315 0062;00E0 05AE 06E1 0315 0062;0061 05AE 0300 06E1 0315 0062;
+0061 06E1 0315 0300 05AE 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;
+0061 0315 0300 05AE 06E2 0062;00E0 05AE 06E2 0315 0062;0061 05AE 0300 06E2 0315 0062;00E0 05AE 06E2 0315 0062;0061 05AE 0300 06E2 0315 0062;
+0061 06E2 0315 0300 05AE 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;
+0061 059A 0316 302A 06E3 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062;
+0061 06E3 059A 0316 302A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062;
+0061 0315 0300 05AE 06E4 0062;00E0 05AE 06E4 0315 0062;0061 05AE 0300 06E4 0315 0062;00E0 05AE 06E4 0315 0062;0061 05AE 0300 06E4 0315 0062;
+0061 06E4 0315 0300 05AE 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;
+0061 0315 0300 05AE 06E7 0062;00E0 05AE 06E7 0315 0062;0061 05AE 0300 06E7 0315 0062;00E0 05AE 06E7 0315 0062;0061 05AE 0300 06E7 0315 0062;
+0061 06E7 0315 0300 05AE 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;
+0061 0315 0300 05AE 06E8 0062;00E0 05AE 06E8 0315 0062;0061 05AE 0300 06E8 0315 0062;00E0 05AE 06E8 0315 0062;0061 05AE 0300 06E8 0315 0062;
+0061 06E8 0315 0300 05AE 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;
+0061 059A 0316 302A 06EA 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062;
+0061 06EA 059A 0316 302A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062;
+0061 0315 0300 05AE 06EB 0062;00E0 05AE 06EB 0315 0062;0061 05AE 0300 06EB 0315 0062;00E0 05AE 06EB 0315 0062;0061 05AE 0300 06EB 0315 0062;
+0061 06EB 0315 0300 05AE 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;
+0061 0315 0300 05AE 06EC 0062;00E0 05AE 06EC 0315 0062;0061 05AE 0300 06EC 0315 0062;00E0 05AE 06EC 0315 0062;0061 05AE 0300 06EC 0315 0062;
+0061 06EC 0315 0300 05AE 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;
+0061 059A 0316 302A 06ED 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062;
+0061 06ED 059A 0316 302A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062;
+0061 0C55 0711 0670 0711 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;
+0061 0711 0C55 0711 0670 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;
+0061 0315 0300 05AE 0730 0062;00E0 05AE 0730 0315 0062;0061 05AE 0300 0730 0315 0062;00E0 05AE 0730 0315 0062;0061 05AE 0300 0730 0315 0062;
+0061 0730 0315 0300 05AE 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;
+0061 059A 0316 302A 0731 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062;
+0061 0731 059A 0316 302A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062;
+0061 0315 0300 05AE 0732 0062;00E0 05AE 0732 0315 0062;0061 05AE 0300 0732 0315 0062;00E0 05AE 0732 0315 0062;0061 05AE 0300 0732 0315 0062;
+0061 0732 0315 0300 05AE 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;
+0061 0315 0300 05AE 0733 0062;00E0 05AE 0733 0315 0062;0061 05AE 0300 0733 0315 0062;00E0 05AE 0733 0315 0062;0061 05AE 0300 0733 0315 0062;
+0061 0733 0315 0300 05AE 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;
+0061 059A 0316 302A 0734 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062;
+0061 0734 059A 0316 302A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062;
+0061 0315 0300 05AE 0735 0062;00E0 05AE 0735 0315 0062;0061 05AE 0300 0735 0315 0062;00E0 05AE 0735 0315 0062;0061 05AE 0300 0735 0315 0062;
+0061 0735 0315 0300 05AE 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;
+0061 0315 0300 05AE 0736 0062;00E0 05AE 0736 0315 0062;0061 05AE 0300 0736 0315 0062;00E0 05AE 0736 0315 0062;0061 05AE 0300 0736 0315 0062;
+0061 0736 0315 0300 05AE 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;
+0061 059A 0316 302A 0737 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062;
+0061 0737 059A 0316 302A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062;
+0061 059A 0316 302A 0738 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062;
+0061 0738 059A 0316 302A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062;
+0061 059A 0316 302A 0739 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062;
+0061 0739 059A 0316 302A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062;
+0061 0315 0300 05AE 073A 0062;00E0 05AE 073A 0315 0062;0061 05AE 0300 073A 0315 0062;00E0 05AE 073A 0315 0062;0061 05AE 0300 073A 0315 0062;
+0061 073A 0315 0300 05AE 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;
+0061 059A 0316 302A 073B 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062;
+0061 073B 059A 0316 302A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062;
+0061 059A 0316 302A 073C 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062;
+0061 073C 059A 0316 302A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062;
+0061 0315 0300 05AE 073D 0062;00E0 05AE 073D 0315 0062;0061 05AE 0300 073D 0315 0062;00E0 05AE 073D 0315 0062;0061 05AE 0300 073D 0315 0062;
+0061 073D 0315 0300 05AE 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;
+0061 059A 0316 302A 073E 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062;
+0061 073E 059A 0316 302A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062;
+0061 0315 0300 05AE 073F 0062;00E0 05AE 073F 0315 0062;0061 05AE 0300 073F 0315 0062;00E0 05AE 073F 0315 0062;0061 05AE 0300 073F 0315 0062;
+0061 073F 0315 0300 05AE 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;
+0061 0315 0300 05AE 0740 0062;00E0 05AE 0740 0315 0062;0061 05AE 0300 0740 0315 0062;00E0 05AE 0740 0315 0062;0061 05AE 0300 0740 0315 0062;
+0061 0740 0315 0300 05AE 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;
+0061 0315 0300 05AE 0741 0062;00E0 05AE 0741 0315 0062;0061 05AE 0300 0741 0315 0062;00E0 05AE 0741 0315 0062;0061 05AE 0300 0741 0315 0062;
+0061 0741 0315 0300 05AE 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;
+0061 059A 0316 302A 0742 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062;
+0061 0742 059A 0316 302A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062;
+0061 0315 0300 05AE 0743 0062;00E0 05AE 0743 0315 0062;0061 05AE 0300 0743 0315 0062;00E0 05AE 0743 0315 0062;0061 05AE 0300 0743 0315 0062;
+0061 0743 0315 0300 05AE 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;
+0061 059A 0316 302A 0744 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062;
+0061 0744 059A 0316 302A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062;
+0061 0315 0300 05AE 0745 0062;00E0 05AE 0745 0315 0062;0061 05AE 0300 0745 0315 0062;00E0 05AE 0745 0315 0062;0061 05AE 0300 0745 0315 0062;
+0061 0745 0315 0300 05AE 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;
+0061 059A 0316 302A 0746 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062;
+0061 0746 059A 0316 302A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062;
+0061 0315 0300 05AE 0747 0062;00E0 05AE 0747 0315 0062;0061 05AE 0300 0747 0315 0062;00E0 05AE 0747 0315 0062;0061 05AE 0300 0747 0315 0062;
+0061 0747 0315 0300 05AE 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;
+0061 059A 0316 302A 0748 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062;
+0061 0748 059A 0316 302A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062;
+0061 0315 0300 05AE 0749 0062;00E0 05AE 0749 0315 0062;0061 05AE 0300 0749 0315 0062;00E0 05AE 0749 0315 0062;0061 05AE 0300 0749 0315 0062;
+0061 0749 0315 0300 05AE 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;
+0061 0315 0300 05AE 074A 0062;00E0 05AE 074A 0315 0062;0061 05AE 0300 074A 0315 0062;00E0 05AE 074A 0315 0062;0061 05AE 0300 074A 0315 0062;
+0061 074A 0315 0300 05AE 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062;
+0061 0315 0300 05AE 07EB 0062;00E0 05AE 07EB 0315 0062;0061 05AE 0300 07EB 0315 0062;00E0 05AE 07EB 0315 0062;0061 05AE 0300 07EB 0315 0062;
+0061 07EB 0315 0300 05AE 0062;0061 05AE 07EB 0300 0315 0062;0061 05AE 07EB 0300 0315 0062;0061 05AE 07EB 0300 0315 0062;0061 05AE 07EB 0300 0315 0062;
+0061 0315 0300 05AE 07EC 0062;00E0 05AE 07EC 0315 0062;0061 05AE 0300 07EC 0315 0062;00E0 05AE 07EC 0315 0062;0061 05AE 0300 07EC 0315 0062;
+0061 07EC 0315 0300 05AE 0062;0061 05AE 07EC 0300 0315 0062;0061 05AE 07EC 0300 0315 0062;0061 05AE 07EC 0300 0315 0062;0061 05AE 07EC 0300 0315 0062;
+0061 0315 0300 05AE 07ED 0062;00E0 05AE 07ED 0315 0062;0061 05AE 0300 07ED 0315 0062;00E0 05AE 07ED 0315 0062;0061 05AE 0300 07ED 0315 0062;
+0061 07ED 0315 0300 05AE 0062;0061 05AE 07ED 0300 0315 0062;0061 05AE 07ED 0300 0315 0062;0061 05AE 07ED 0300 0315 0062;0061 05AE 07ED 0300 0315 0062;
+0061 0315 0300 05AE 07EE 0062;00E0 05AE 07EE 0315 0062;0061 05AE 0300 07EE 0315 0062;00E0 05AE 07EE 0315 0062;0061 05AE 0300 07EE 0315 0062;
+0061 07EE 0315 0300 05AE 0062;0061 05AE 07EE 0300 0315 0062;0061 05AE 07EE 0300 0315 0062;0061 05AE 07EE 0300 0315 0062;0061 05AE 07EE 0300 0315 0062;
+0061 0315 0300 05AE 07EF 0062;00E0 05AE 07EF 0315 0062;0061 05AE 0300 07EF 0315 0062;00E0 05AE 07EF 0315 0062;0061 05AE 0300 07EF 0315 0062;
+0061 07EF 0315 0300 05AE 0062;0061 05AE 07EF 0300 0315 0062;0061 05AE 07EF 0300 0315 0062;0061 05AE 07EF 0300 0315 0062;0061 05AE 07EF 0300 0315 0062;
+0061 0315 0300 05AE 07F0 0062;00E0 05AE 07F0 0315 0062;0061 05AE 0300 07F0 0315 0062;00E0 05AE 07F0 0315 0062;0061 05AE 0300 07F0 0315 0062;
+0061 07F0 0315 0300 05AE 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062;
+0061 0315 0300 05AE 07F1 0062;00E0 05AE 07F1 0315 0062;0061 05AE 0300 07F1 0315 0062;00E0 05AE 07F1 0315 0062;0061 05AE 0300 07F1 0315 0062;
+0061 07F1 0315 0300 05AE 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062;
+0061 059A 0316 302A 07F2 0062;0061 302A 0316 07F2 059A 0062;0061 302A 0316 07F2 059A 0062;0061 302A 0316 07F2 059A 0062;0061 302A 0316 07F2 059A 0062;
+0061 07F2 059A 0316 302A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062;
+0061 0315 0300 05AE 07F3 0062;00E0 05AE 07F3 0315 0062;0061 05AE 0300 07F3 0315 0062;00E0 05AE 07F3 0315 0062;0061 05AE 0300 07F3 0315 0062;
+0061 07F3 0315 0300 05AE 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;
+0061 3099 093C 0334 093C 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;
+0061 093C 3099 093C 0334 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;
+0061 05B0 094D 3099 094D 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;
+0061 094D 05B0 094D 3099 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;
+0061 0315 0300 05AE 0951 0062;00E0 05AE 0951 0315 0062;0061 05AE 0300 0951 0315 0062;00E0 05AE 0951 0315 0062;0061 05AE 0300 0951 0315 0062;
+0061 0951 0315 0300 05AE 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;
+0061 059A 0316 302A 0952 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062;
+0061 0952 059A 0316 302A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062;
+0061 0315 0300 05AE 0953 0062;00E0 05AE 0953 0315 0062;0061 05AE 0300 0953 0315 0062;00E0 05AE 0953 0315 0062;0061 05AE 0300 0953 0315 0062;
+0061 0953 0315 0300 05AE 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;
+0061 0315 0300 05AE 0954 0062;00E0 05AE 0954 0315 0062;0061 05AE 0300 0954 0315 0062;00E0 05AE 0954 0315 0062;0061 05AE 0300 0954 0315 0062;
+0061 0954 0315 0300 05AE 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062;
+0061 3099 093C 0334 09BC 0062;0061 0334 093C 09BC 3099 0062;0061 0334 093C 09BC 3099 0062;0061 0334 093C 09BC 3099 0062;0061 0334 093C 09BC 3099 0062;
+0061 09BC 3099 093C 0334 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062;
+0061 05B0 094D 3099 09CD 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;
+0061 09CD 05B0 094D 3099 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;
+0061 3099 093C 0334 0A3C 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062;
+0061 0A3C 3099 093C 0334 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062;
+0061 05B0 094D 3099 0A4D 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;
+0061 0A4D 05B0 094D 3099 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062;
+0061 3099 093C 0334 0ABC 0062;0061 0334 093C 0ABC 3099 0062;0061 0334 093C 0ABC 3099 0062;0061 0334 093C 0ABC 3099 0062;0061 0334 093C 0ABC 3099 0062;
+0061 0ABC 3099 093C 0334 0062;0061 0334 0ABC 093C 3099 0062;0061 0334 0ABC 093C 3099 0062;0061 0334 0ABC 093C 3099 0062;0061 0334 0ABC 093C 3099 0062;
+0061 05B0 094D 3099 0ACD 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062;
+0061 0ACD 05B0 094D 3099 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062;
+0061 3099 093C 0334 0B3C 0062;0061 0334 093C 0B3C 3099 0062;0061 0334 093C 0B3C 3099 0062;0061 0334 093C 0B3C 3099 0062;0061 0334 093C 0B3C 3099 0062;
+0061 0B3C 3099 093C 0334 0062;0061 0334 0B3C 093C 3099 0062;0061 0334 0B3C 093C 3099 0062;0061 0334 0B3C 093C 3099 0062;0061 0334 0B3C 093C 3099 0062;
+0061 05B0 094D 3099 0B4D 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062;
+0061 0B4D 05B0 094D 3099 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;
+0061 05B0 094D 3099 0BCD 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;
+0061 0BCD 05B0 094D 3099 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;
+0061 05B0 094D 3099 0C4D 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;
+0061 0C4D 05B0 094D 3099 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;
+0061 0C56 0C55 0711 0C55 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;
+0061 0C55 0C56 0C55 0711 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;
+0061 0E38 0C56 0C55 0C56 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;
+0061 0C56 0E38 0C56 0C55 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;
+0061 3099 093C 0334 0CBC 0062;0061 0334 093C 0CBC 3099 0062;0061 0334 093C 0CBC 3099 0062;0061 0334 093C 0CBC 3099 0062;0061 0334 093C 0CBC 3099 0062;
+0061 0CBC 3099 093C 0334 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062;
+0061 05B0 094D 3099 0CCD 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;
+0061 0CCD 05B0 094D 3099 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;
+0061 05B0 094D 3099 0D4D 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;
+0061 0D4D 05B0 094D 3099 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;
+0061 05B0 094D 3099 0DCA 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;
+0061 0DCA 05B0 094D 3099 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062;
+0061 0E48 0E38 0C56 0E38 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;
+0061 0E38 0E48 0E38 0C56 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;
+0061 0E48 0E38 0C56 0E39 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062;
+0061 0E39 0E48 0E38 0C56 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062;
+0061 05B0 094D 3099 0E3A 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062;
+0061 0E3A 05B0 094D 3099 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062;
+0061 0EB8 0E48 0E38 0E48 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;
+0061 0E48 0EB8 0E48 0E38 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;
+0061 0EB8 0E48 0E38 0E49 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062;
+0061 0E49 0EB8 0E48 0E38 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062;
+0061 0EB8 0E48 0E38 0E4A 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062;
+0061 0E4A 0EB8 0E48 0E38 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062;
+0061 0EB8 0E48 0E38 0E4B 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062;
+0061 0E4B 0EB8 0E48 0E38 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062;
+0061 0EC8 0EB8 0E48 0EB8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;
+0061 0EB8 0EC8 0EB8 0E48 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;
+0061 0EC8 0EB8 0E48 0EB9 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;
+0061 0EB9 0EC8 0EB8 0E48 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;
+0061 0F71 0EC8 0EB8 0EC8 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;
+0061 0EC8 0F71 0EC8 0EB8 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;
+0061 0F71 0EC8 0EB8 0EC9 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;
+0061 0EC9 0F71 0EC8 0EB8 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062;
+0061 0F71 0EC8 0EB8 0ECA 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062;
+0061 0ECA 0F71 0EC8 0EB8 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;
+0061 0F71 0EC8 0EB8 0ECB 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;
+0061 0ECB 0F71 0EC8 0EB8 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;
+0061 059A 0316 302A 0F18 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062;
+0061 0F18 059A 0316 302A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062;
+0061 059A 0316 302A 0F19 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062;
+0061 0F19 059A 0316 302A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062;
+0061 059A 0316 302A 0F35 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062;
+0061 0F35 059A 0316 302A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062;
+0061 059A 0316 302A 0F37 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062;
+0061 0F37 059A 0316 302A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062;
+0061 302A 031B 1DCE 0F39 0062;0061 1DCE 031B 0F39 302A 0062;0061 1DCE 031B 0F39 302A 0062;0061 1DCE 031B 0F39 302A 0062;0061 1DCE 031B 0F39 302A 0062;
+0061 0F39 302A 031B 1DCE 0062;0061 1DCE 0F39 031B 302A 0062;0061 1DCE 0F39 031B 302A 0062;0061 1DCE 0F39 031B 302A 0062;0061 1DCE 0F39 031B 302A 0062;
+0061 0F72 0F71 0EC8 0F71 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;
+0061 0F71 0F72 0F71 0EC8 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;
+0061 0F74 0F72 0F71 0F72 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;
+0061 0F72 0F74 0F72 0F71 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;
+0061 0321 0F74 0F72 0F74 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;
+0061 0F74 0321 0F74 0F72 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;
+0061 0F74 0F72 0F71 0F7A 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062;
+0061 0F7A 0F74 0F72 0F71 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062;
+0061 0F74 0F72 0F71 0F7B 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062;
+0061 0F7B 0F74 0F72 0F71 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062;
+0061 0F74 0F72 0F71 0F7C 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062;
+0061 0F7C 0F74 0F72 0F71 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062;
+0061 0F74 0F72 0F71 0F7D 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062;
+0061 0F7D 0F74 0F72 0F71 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062;
+0061 0F74 0F72 0F71 0F80 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062;
+0061 0F80 0F74 0F72 0F71 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062;
+0061 0315 0300 05AE 0F82 0062;00E0 05AE 0F82 0315 0062;0061 05AE 0300 0F82 0315 0062;00E0 05AE 0F82 0315 0062;0061 05AE 0300 0F82 0315 0062;
+0061 0F82 0315 0300 05AE 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062;
+0061 0315 0300 05AE 0F83 0062;00E0 05AE 0F83 0315 0062;0061 05AE 0300 0F83 0315 0062;00E0 05AE 0F83 0315 0062;0061 05AE 0300 0F83 0315 0062;
+0061 0F83 0315 0300 05AE 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062;
+0061 05B0 094D 3099 0F84 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062;
+0061 0F84 05B0 094D 3099 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062;
+0061 0315 0300 05AE 0F86 0062;00E0 05AE 0F86 0315 0062;0061 05AE 0300 0F86 0315 0062;00E0 05AE 0F86 0315 0062;0061 05AE 0300 0F86 0315 0062;
+0061 0F86 0315 0300 05AE 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;
+0061 0315 0300 05AE 0F87 0062;00E0 05AE 0F87 0315 0062;0061 05AE 0300 0F87 0315 0062;00E0 05AE 0F87 0315 0062;0061 05AE 0300 0F87 0315 0062;
+0061 0F87 0315 0300 05AE 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;
+0061 059A 0316 302A 0FC6 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062;
+0061 0FC6 059A 0316 302A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062;
+0061 3099 093C 0334 1037 0062;0061 0334 093C 1037 3099 0062;0061 0334 093C 1037 3099 0062;0061 0334 093C 1037 3099 0062;0061 0334 093C 1037 3099 0062;
+0061 1037 3099 093C 0334 0062;0061 0334 1037 093C 3099 0062;0061 0334 1037 093C 3099 0062;0061 0334 1037 093C 3099 0062;0061 0334 1037 093C 3099 0062;
+0061 05B0 094D 3099 1039 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;
+0061 1039 05B0 094D 3099 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;
+0061 05B0 094D 3099 103A 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062;
+0061 103A 05B0 094D 3099 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062;
+0061 059A 0316 302A 108D 0062;0061 302A 0316 108D 059A 0062;0061 302A 0316 108D 059A 0062;0061 302A 0316 108D 059A 0062;0061 302A 0316 108D 059A 0062;
+0061 108D 059A 0316 302A 0062;0061 302A 108D 0316 059A 0062;0061 302A 108D 0316 059A 0062;0061 302A 108D 0316 059A 0062;0061 302A 108D 0316 059A 0062;
+0061 0315 0300 05AE 135F 0062;00E0 05AE 135F 0315 0062;0061 05AE 0300 135F 0315 0062;00E0 05AE 135F 0315 0062;0061 05AE 0300 135F 0315 0062;
+0061 135F 0315 0300 05AE 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062;
+0061 05B0 094D 3099 1714 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;
+0061 1714 05B0 094D 3099 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;
+0061 05B0 094D 3099 1734 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;
+0061 1734 05B0 094D 3099 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;
+0061 05B0 094D 3099 17D2 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;
+0061 17D2 05B0 094D 3099 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;
+0061 0315 0300 05AE 17DD 0062;00E0 05AE 17DD 0315 0062;0061 05AE 0300 17DD 0315 0062;00E0 05AE 17DD 0315 0062;0061 05AE 0300 17DD 0315 0062;
+0061 17DD 0315 0300 05AE 0062;0061 05AE 17DD 0300 0315 0062;0061 05AE 17DD 0300 0315 0062;0061 05AE 17DD 0300 0315 0062;0061 05AE 17DD 0300 0315 0062;
+0061 0300 05AE 1D16D 18A9 0062;00E0 1D16D 05AE 18A9 0062;0061 1D16D 05AE 18A9 0300 0062;00E0 1D16D 05AE 18A9 0062;0061 1D16D 05AE 18A9 0300 0062;
+0061 18A9 0300 05AE 1D16D 0062;00E0 1D16D 18A9 05AE 0062;0061 1D16D 18A9 05AE 0300 0062;00E0 1D16D 18A9 05AE 0062;0061 1D16D 18A9 05AE 0300 0062;
+0061 302E 059A 0316 1939 0062;0061 0316 059A 1939 302E 0062;0061 0316 059A 1939 302E 0062;0061 0316 059A 1939 302E 0062;0061 0316 059A 1939 302E 0062;
+0061 1939 302E 059A 0316 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062;
+0061 0315 0300 05AE 193A 0062;00E0 05AE 193A 0315 0062;0061 05AE 0300 193A 0315 0062;00E0 05AE 193A 0315 0062;0061 05AE 0300 193A 0315 0062;
+0061 193A 0315 0300 05AE 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062;
+0061 059A 0316 302A 193B 0062;0061 302A 0316 193B 059A 0062;0061 302A 0316 193B 059A 0062;0061 302A 0316 193B 059A 0062;0061 302A 0316 193B 059A 0062;
+0061 193B 059A 0316 302A 0062;0061 302A 193B 0316 059A 0062;0061 302A 193B 0316 059A 0062;0061 302A 193B 0316 059A 0062;0061 302A 193B 0316 059A 0062;
+0061 0315 0300 05AE 1A17 0062;00E0 05AE 1A17 0315 0062;0061 05AE 0300 1A17 0315 0062;00E0 05AE 1A17 0315 0062;0061 05AE 0300 1A17 0315 0062;
+0061 1A17 0315 0300 05AE 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062;
+0061 059A 0316 302A 1A18 0062;0061 302A 0316 1A18 059A 0062;0061 302A 0316 1A18 059A 0062;0061 302A 0316 1A18 059A 0062;0061 302A 0316 1A18 059A 0062;
+0061 1A18 059A 0316 302A 0062;0061 302A 1A18 0316 059A 0062;0061 302A 1A18 0316 059A 0062;0061 302A 1A18 0316 059A 0062;0061 302A 1A18 0316 059A 0062;
+0061 3099 093C 0334 1B34 0062;0061 0334 093C 1B34 3099 0062;0061 0334 093C 1B34 3099 0062;0061 0334 093C 1B34 3099 0062;0061 0334 093C 1B34 3099 0062;
+0061 1B34 3099 093C 0334 0062;0061 0334 1B34 093C 3099 0062;0061 0334 1B34 093C 3099 0062;0061 0334 1B34 093C 3099 0062;0061 0334 1B34 093C 3099 0062;
+0061 05B0 094D 3099 1B44 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062;
+0061 1B44 05B0 094D 3099 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062;
+0061 0315 0300 05AE 1B6B 0062;00E0 05AE 1B6B 0315 0062;0061 05AE 0300 1B6B 0315 0062;00E0 05AE 1B6B 0315 0062;0061 05AE 0300 1B6B 0315 0062;
+0061 1B6B 0315 0300 05AE 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062;
+0061 059A 0316 302A 1B6C 0062;0061 302A 0316 1B6C 059A 0062;0061 302A 0316 1B6C 059A 0062;0061 302A 0316 1B6C 059A 0062;0061 302A 0316 1B6C 059A 0062;
+0061 1B6C 059A 0316 302A 0062;0061 302A 1B6C 0316 059A 0062;0061 302A 1B6C 0316 059A 0062;0061 302A 1B6C 0316 059A 0062;0061 302A 1B6C 0316 059A 0062;
+0061 0315 0300 05AE 1B6D 0062;00E0 05AE 1B6D 0315 0062;0061 05AE 0300 1B6D 0315 0062;00E0 05AE 1B6D 0315 0062;0061 05AE 0300 1B6D 0315 0062;
+0061 1B6D 0315 0300 05AE 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062;
+0061 0315 0300 05AE 1B6E 0062;00E0 05AE 1B6E 0315 0062;0061 05AE 0300 1B6E 0315 0062;00E0 05AE 1B6E 0315 0062;0061 05AE 0300 1B6E 0315 0062;
+0061 1B6E 0315 0300 05AE 0062;0061 05AE 1B6E 0300 0315 0062;0061 05AE 1B6E 0300 0315 0062;0061 05AE 1B6E 0300 0315 0062;0061 05AE 1B6E 0300 0315 0062;
+0061 0315 0300 05AE 1B6F 0062;00E0 05AE 1B6F 0315 0062;0061 05AE 0300 1B6F 0315 0062;00E0 05AE 1B6F 0315 0062;0061 05AE 0300 1B6F 0315 0062;
+0061 1B6F 0315 0300 05AE 0062;0061 05AE 1B6F 0300 0315 0062;0061 05AE 1B6F 0300 0315 0062;0061 05AE 1B6F 0300 0315 0062;0061 05AE 1B6F 0300 0315 0062;
+0061 0315 0300 05AE 1B70 0062;00E0 05AE 1B70 0315 0062;0061 05AE 0300 1B70 0315 0062;00E0 05AE 1B70 0315 0062;0061 05AE 0300 1B70 0315 0062;
+0061 1B70 0315 0300 05AE 0062;0061 05AE 1B70 0300 0315 0062;0061 05AE 1B70 0300 0315 0062;0061 05AE 1B70 0300 0315 0062;0061 05AE 1B70 0300 0315 0062;
+0061 0315 0300 05AE 1B71 0062;00E0 05AE 1B71 0315 0062;0061 05AE 0300 1B71 0315 0062;00E0 05AE 1B71 0315 0062;0061 05AE 0300 1B71 0315 0062;
+0061 1B71 0315 0300 05AE 0062;0061 05AE 1B71 0300 0315 0062;0061 05AE 1B71 0300 0315 0062;0061 05AE 1B71 0300 0315 0062;0061 05AE 1B71 0300 0315 0062;
+0061 0315 0300 05AE 1B72 0062;00E0 05AE 1B72 0315 0062;0061 05AE 0300 1B72 0315 0062;00E0 05AE 1B72 0315 0062;0061 05AE 0300 1B72 0315 0062;
+0061 1B72 0315 0300 05AE 0062;0061 05AE 1B72 0300 0315 0062;0061 05AE 1B72 0300 0315 0062;0061 05AE 1B72 0300 0315 0062;0061 05AE 1B72 0300 0315 0062;
+0061 0315 0300 05AE 1B73 0062;00E0 05AE 1B73 0315 0062;0061 05AE 0300 1B73 0315 0062;00E0 05AE 1B73 0315 0062;0061 05AE 0300 1B73 0315 0062;
+0061 1B73 0315 0300 05AE 0062;0061 05AE 1B73 0300 0315 0062;0061 05AE 1B73 0300 0315 0062;0061 05AE 1B73 0300 0315 0062;0061 05AE 1B73 0300 0315 0062;
+0061 05B0 094D 3099 1BAA 0062;0061 3099 094D 1BAA 05B0 0062;0061 3099 094D 1BAA 05B0 0062;0061 3099 094D 1BAA 05B0 0062;0061 3099 094D 1BAA 05B0 0062;
+0061 1BAA 05B0 094D 3099 0062;0061 3099 1BAA 094D 05B0 0062;0061 3099 1BAA 094D 05B0 0062;0061 3099 1BAA 094D 05B0 0062;0061 3099 1BAA 094D 05B0 0062;
+0061 3099 093C 0334 1C37 0062;0061 0334 093C 1C37 3099 0062;0061 0334 093C 1C37 3099 0062;0061 0334 093C 1C37 3099 0062;0061 0334 093C 1C37 3099 0062;
+0061 1C37 3099 093C 0334 0062;0061 0334 1C37 093C 3099 0062;0061 0334 1C37 093C 3099 0062;0061 0334 1C37 093C 3099 0062;0061 0334 1C37 093C 3099 0062;
+0061 0315 0300 05AE 1DC0 0062;00E0 05AE 1DC0 0315 0062;0061 05AE 0300 1DC0 0315 0062;00E0 05AE 1DC0 0315 0062;0061 05AE 0300 1DC0 0315 0062;
+0061 1DC0 0315 0300 05AE 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062;
+0061 0315 0300 05AE 1DC1 0062;00E0 05AE 1DC1 0315 0062;0061 05AE 0300 1DC1 0315 0062;00E0 05AE 1DC1 0315 0062;0061 05AE 0300 1DC1 0315 0062;
+0061 1DC1 0315 0300 05AE 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062;
+0061 059A 0316 302A 1DC2 0062;0061 302A 0316 1DC2 059A 0062;0061 302A 0316 1DC2 059A 0062;0061 302A 0316 1DC2 059A 0062;0061 302A 0316 1DC2 059A 0062;
+0061 1DC2 059A 0316 302A 0062;0061 302A 1DC2 0316 059A 0062;0061 302A 1DC2 0316 059A 0062;0061 302A 1DC2 0316 059A 0062;0061 302A 1DC2 0316 059A 0062;
+0061 0315 0300 05AE 1DC3 0062;00E0 05AE 1DC3 0315 0062;0061 05AE 0300 1DC3 0315 0062;00E0 05AE 1DC3 0315 0062;0061 05AE 0300 1DC3 0315 0062;
+0061 1DC3 0315 0300 05AE 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062;
+0061 0315 0300 05AE 1DC4 0062;00E0 05AE 1DC4 0315 0062;0061 05AE 0300 1DC4 0315 0062;00E0 05AE 1DC4 0315 0062;0061 05AE 0300 1DC4 0315 0062;
+0061 1DC4 0315 0300 05AE 0062;0061 05AE 1DC4 0300 0315 0062;0061 05AE 1DC4 0300 0315 0062;0061 05AE 1DC4 0300 0315 0062;0061 05AE 1DC4 0300 0315 0062;
+0061 0315 0300 05AE 1DC5 0062;00E0 05AE 1DC5 0315 0062;0061 05AE 0300 1DC5 0315 0062;00E0 05AE 1DC5 0315 0062;0061 05AE 0300 1DC5 0315 0062;
+0061 1DC5 0315 0300 05AE 0062;0061 05AE 1DC5 0300 0315 0062;0061 05AE 1DC5 0300 0315 0062;0061 05AE 1DC5 0300 0315 0062;0061 05AE 1DC5 0300 0315 0062;
+0061 0315 0300 05AE 1DC6 0062;00E0 05AE 1DC6 0315 0062;0061 05AE 0300 1DC6 0315 0062;00E0 05AE 1DC6 0315 0062;0061 05AE 0300 1DC6 0315 0062;
+0061 1DC6 0315 0300 05AE 0062;0061 05AE 1DC6 0300 0315 0062;0061 05AE 1DC6 0300 0315 0062;0061 05AE 1DC6 0300 0315 0062;0061 05AE 1DC6 0300 0315 0062;
+0061 0315 0300 05AE 1DC7 0062;00E0 05AE 1DC7 0315 0062;0061 05AE 0300 1DC7 0315 0062;00E0 05AE 1DC7 0315 0062;0061 05AE 0300 1DC7 0315 0062;
+0061 1DC7 0315 0300 05AE 0062;0061 05AE 1DC7 0300 0315 0062;0061 05AE 1DC7 0300 0315 0062;0061 05AE 1DC7 0300 0315 0062;0061 05AE 1DC7 0300 0315 0062;
+0061 0315 0300 05AE 1DC8 0062;00E0 05AE 1DC8 0315 0062;0061 05AE 0300 1DC8 0315 0062;00E0 05AE 1DC8 0315 0062;0061 05AE 0300 1DC8 0315 0062;
+0061 1DC8 0315 0300 05AE 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062;
+0061 0315 0300 05AE 1DC9 0062;00E0 05AE 1DC9 0315 0062;0061 05AE 0300 1DC9 0315 0062;00E0 05AE 1DC9 0315 0062;0061 05AE 0300 1DC9 0315 0062;
+0061 1DC9 0315 0300 05AE 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062;
+0061 059A 0316 302A 1DCA 0062;0061 302A 0316 1DCA 059A 0062;0061 302A 0316 1DCA 059A 0062;0061 302A 0316 1DCA 059A 0062;0061 302A 0316 1DCA 059A 0062;
+0061 1DCA 059A 0316 302A 0062;0061 302A 1DCA 0316 059A 0062;0061 302A 1DCA 0316 059A 0062;0061 302A 1DCA 0316 059A 0062;0061 302A 1DCA 0316 059A 0062;
+0061 0315 0300 05AE 1DCB 0062;00E0 05AE 1DCB 0315 0062;0061 05AE 0300 1DCB 0315 0062;00E0 05AE 1DCB 0315 0062;0061 05AE 0300 1DCB 0315 0062;
+0061 1DCB 0315 0300 05AE 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062;
+0061 0315 0300 05AE 1DCC 0062;00E0 05AE 1DCC 0315 0062;0061 05AE 0300 1DCC 0315 0062;00E0 05AE 1DCC 0315 0062;0061 05AE 0300 1DCC 0315 0062;
+0061 1DCC 0315 0300 05AE 0062;0061 05AE 1DCC 0300 0315 0062;0061 05AE 1DCC 0300 0315 0062;0061 05AE 1DCC 0300 0315 0062;0061 05AE 1DCC 0300 0315 0062;
+0061 0345 035D 035C 1DCD 0062;0061 035C 035D 1DCD 0345 0062;0061 035C 035D 1DCD 0345 0062;0061 035C 035D 1DCD 0345 0062;0061 035C 035D 1DCD 0345 0062;
+0061 1DCD 0345 035D 035C 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062;
+0061 031B 1DCE 0321 1DCE 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;
+0061 1DCE 031B 1DCE 0321 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;
+0061 059A 0316 302A 1DCF 0062;0061 302A 0316 1DCF 059A 0062;0061 302A 0316 1DCF 059A 0062;0061 302A 0316 1DCF 059A 0062;0061 302A 0316 1DCF 059A 0062;
+0061 1DCF 059A 0316 302A 0062;0061 302A 1DCF 0316 059A 0062;0061 302A 1DCF 0316 059A 0062;0061 302A 1DCF 0316 059A 0062;0061 302A 1DCF 0316 059A 0062;
+0061 1DCE 0321 0F74 1DD0 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062;
+0061 1DD0 1DCE 0321 0F74 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062;
+0061 0315 0300 05AE 1DD1 0062;00E0 05AE 1DD1 0315 0062;0061 05AE 0300 1DD1 0315 0062;00E0 05AE 1DD1 0315 0062;0061 05AE 0300 1DD1 0315 0062;
+0061 1DD1 0315 0300 05AE 0062;0061 05AE 1DD1 0300 0315 0062;0061 05AE 1DD1 0300 0315 0062;0061 05AE 1DD1 0300 0315 0062;0061 05AE 1DD1 0300 0315 0062;
+0061 0315 0300 05AE 1DD2 0062;00E0 05AE 1DD2 0315 0062;0061 05AE 0300 1DD2 0315 0062;00E0 05AE 1DD2 0315 0062;0061 05AE 0300 1DD2 0315 0062;
+0061 1DD2 0315 0300 05AE 0062;0061 05AE 1DD2 0300 0315 0062;0061 05AE 1DD2 0300 0315 0062;0061 05AE 1DD2 0300 0315 0062;0061 05AE 1DD2 0300 0315 0062;
+0061 0315 0300 05AE 1DD3 0062;00E0 05AE 1DD3 0315 0062;0061 05AE 0300 1DD3 0315 0062;00E0 05AE 1DD3 0315 0062;0061 05AE 0300 1DD3 0315 0062;
+0061 1DD3 0315 0300 05AE 0062;0061 05AE 1DD3 0300 0315 0062;0061 05AE 1DD3 0300 0315 0062;0061 05AE 1DD3 0300 0315 0062;0061 05AE 1DD3 0300 0315 0062;
+0061 0315 0300 05AE 1DD4 0062;00E0 05AE 1DD4 0315 0062;0061 05AE 0300 1DD4 0315 0062;00E0 05AE 1DD4 0315 0062;0061 05AE 0300 1DD4 0315 0062;
+0061 1DD4 0315 0300 05AE 0062;0061 05AE 1DD4 0300 0315 0062;0061 05AE 1DD4 0300 0315 0062;0061 05AE 1DD4 0300 0315 0062;0061 05AE 1DD4 0300 0315 0062;
+0061 0315 0300 05AE 1DD5 0062;00E0 05AE 1DD5 0315 0062;0061 05AE 0300 1DD5 0315 0062;00E0 05AE 1DD5 0315 0062;0061 05AE 0300 1DD5 0315 0062;
+0061 1DD5 0315 0300 05AE 0062;0061 05AE 1DD5 0300 0315 0062;0061 05AE 1DD5 0300 0315 0062;0061 05AE 1DD5 0300 0315 0062;0061 05AE 1DD5 0300 0315 0062;
+0061 0315 0300 05AE 1DD6 0062;00E0 05AE 1DD6 0315 0062;0061 05AE 0300 1DD6 0315 0062;00E0 05AE 1DD6 0315 0062;0061 05AE 0300 1DD6 0315 0062;
+0061 1DD6 0315 0300 05AE 0062;0061 05AE 1DD6 0300 0315 0062;0061 05AE 1DD6 0300 0315 0062;0061 05AE 1DD6 0300 0315 0062;0061 05AE 1DD6 0300 0315 0062;
+0061 0315 0300 05AE 1DD7 0062;00E0 05AE 1DD7 0315 0062;0061 05AE 0300 1DD7 0315 0062;00E0 05AE 1DD7 0315 0062;0061 05AE 0300 1DD7 0315 0062;
+0061 1DD7 0315 0300 05AE 0062;0061 05AE 1DD7 0300 0315 0062;0061 05AE 1DD7 0300 0315 0062;0061 05AE 1DD7 0300 0315 0062;0061 05AE 1DD7 0300 0315 0062;
+0061 0315 0300 05AE 1DD8 0062;00E0 05AE 1DD8 0315 0062;0061 05AE 0300 1DD8 0315 0062;00E0 05AE 1DD8 0315 0062;0061 05AE 0300 1DD8 0315 0062;
+0061 1DD8 0315 0300 05AE 0062;0061 05AE 1DD8 0300 0315 0062;0061 05AE 1DD8 0300 0315 0062;0061 05AE 1DD8 0300 0315 0062;0061 05AE 1DD8 0300 0315 0062;
+0061 0315 0300 05AE 1DD9 0062;00E0 05AE 1DD9 0315 0062;0061 05AE 0300 1DD9 0315 0062;00E0 05AE 1DD9 0315 0062;0061 05AE 0300 1DD9 0315 0062;
+0061 1DD9 0315 0300 05AE 0062;0061 05AE 1DD9 0300 0315 0062;0061 05AE 1DD9 0300 0315 0062;0061 05AE 1DD9 0300 0315 0062;0061 05AE 1DD9 0300 0315 0062;
+0061 0315 0300 05AE 1DDA 0062;00E0 05AE 1DDA 0315 0062;0061 05AE 0300 1DDA 0315 0062;00E0 05AE 1DDA 0315 0062;0061 05AE 0300 1DDA 0315 0062;
+0061 1DDA 0315 0300 05AE 0062;0061 05AE 1DDA 0300 0315 0062;0061 05AE 1DDA 0300 0315 0062;0061 05AE 1DDA 0300 0315 0062;0061 05AE 1DDA 0300 0315 0062;
+0061 0315 0300 05AE 1DDB 0062;00E0 05AE 1DDB 0315 0062;0061 05AE 0300 1DDB 0315 0062;00E0 05AE 1DDB 0315 0062;0061 05AE 0300 1DDB 0315 0062;
+0061 1DDB 0315 0300 05AE 0062;0061 05AE 1DDB 0300 0315 0062;0061 05AE 1DDB 0300 0315 0062;0061 05AE 1DDB 0300 0315 0062;0061 05AE 1DDB 0300 0315 0062;
+0061 0315 0300 05AE 1DDC 0062;00E0 05AE 1DDC 0315 0062;0061 05AE 0300 1DDC 0315 0062;00E0 05AE 1DDC 0315 0062;0061 05AE 0300 1DDC 0315 0062;
+0061 1DDC 0315 0300 05AE 0062;0061 05AE 1DDC 0300 0315 0062;0061 05AE 1DDC 0300 0315 0062;0061 05AE 1DDC 0300 0315 0062;0061 05AE 1DDC 0300 0315 0062;
+0061 0315 0300 05AE 1DDD 0062;00E0 05AE 1DDD 0315 0062;0061 05AE 0300 1DDD 0315 0062;00E0 05AE 1DDD 0315 0062;0061 05AE 0300 1DDD 0315 0062;
+0061 1DDD 0315 0300 05AE 0062;0061 05AE 1DDD 0300 0315 0062;0061 05AE 1DDD 0300 0315 0062;0061 05AE 1DDD 0300 0315 0062;0061 05AE 1DDD 0300 0315 0062;
+0061 0315 0300 05AE 1DDE 0062;00E0 05AE 1DDE 0315 0062;0061 05AE 0300 1DDE 0315 0062;00E0 05AE 1DDE 0315 0062;0061 05AE 0300 1DDE 0315 0062;
+0061 1DDE 0315 0300 05AE 0062;0061 05AE 1DDE 0300 0315 0062;0061 05AE 1DDE 0300 0315 0062;0061 05AE 1DDE 0300 0315 0062;0061 05AE 1DDE 0300 0315 0062;
+0061 0315 0300 05AE 1DDF 0062;00E0 05AE 1DDF 0315 0062;0061 05AE 0300 1DDF 0315 0062;00E0 05AE 1DDF 0315 0062;0061 05AE 0300 1DDF 0315 0062;
+0061 1DDF 0315 0300 05AE 0062;0061 05AE 1DDF 0300 0315 0062;0061 05AE 1DDF 0300 0315 0062;0061 05AE 1DDF 0300 0315 0062;0061 05AE 1DDF 0300 0315 0062;
+0061 0315 0300 05AE 1DE0 0062;00E0 05AE 1DE0 0315 0062;0061 05AE 0300 1DE0 0315 0062;00E0 05AE 1DE0 0315 0062;0061 05AE 0300 1DE0 0315 0062;
+0061 1DE0 0315 0300 05AE 0062;0061 05AE 1DE0 0300 0315 0062;0061 05AE 1DE0 0300 0315 0062;0061 05AE 1DE0 0300 0315 0062;0061 05AE 1DE0 0300 0315 0062;
+0061 0315 0300 05AE 1DE1 0062;00E0 05AE 1DE1 0315 0062;0061 05AE 0300 1DE1 0315 0062;00E0 05AE 1DE1 0315 0062;0061 05AE 0300 1DE1 0315 0062;
+0061 1DE1 0315 0300 05AE 0062;0061 05AE 1DE1 0300 0315 0062;0061 05AE 1DE1 0300 0315 0062;0061 05AE 1DE1 0300 0315 0062;0061 05AE 1DE1 0300 0315 0062;
+0061 0315 0300 05AE 1DE2 0062;00E0 05AE 1DE2 0315 0062;0061 05AE 0300 1DE2 0315 0062;00E0 05AE 1DE2 0315 0062;0061 05AE 0300 1DE2 0315 0062;
+0061 1DE2 0315 0300 05AE 0062;0061 05AE 1DE2 0300 0315 0062;0061 05AE 1DE2 0300 0315 0062;0061 05AE 1DE2 0300 0315 0062;0061 05AE 1DE2 0300 0315 0062;
+0061 0315 0300 05AE 1DE3 0062;00E0 05AE 1DE3 0315 0062;0061 05AE 0300 1DE3 0315 0062;00E0 05AE 1DE3 0315 0062;0061 05AE 0300 1DE3 0315 0062;
+0061 1DE3 0315 0300 05AE 0062;0061 05AE 1DE3 0300 0315 0062;0061 05AE 1DE3 0300 0315 0062;0061 05AE 1DE3 0300 0315 0062;0061 05AE 1DE3 0300 0315 0062;
+0061 0315 0300 05AE 1DE4 0062;00E0 05AE 1DE4 0315 0062;0061 05AE 0300 1DE4 0315 0062;00E0 05AE 1DE4 0315 0062;0061 05AE 0300 1DE4 0315 0062;
+0061 1DE4 0315 0300 05AE 0062;0061 05AE 1DE4 0300 0315 0062;0061 05AE 1DE4 0300 0315 0062;0061 05AE 1DE4 0300 0315 0062;0061 05AE 1DE4 0300 0315 0062;
+0061 0315 0300 05AE 1DE5 0062;00E0 05AE 1DE5 0315 0062;0061 05AE 0300 1DE5 0315 0062;00E0 05AE 1DE5 0315 0062;0061 05AE 0300 1DE5 0315 0062;
+0061 1DE5 0315 0300 05AE 0062;0061 05AE 1DE5 0300 0315 0062;0061 05AE 1DE5 0300 0315 0062;0061 05AE 1DE5 0300 0315 0062;0061 05AE 1DE5 0300 0315 0062;
+0061 0315 0300 05AE 1DE6 0062;00E0 05AE 1DE6 0315 0062;0061 05AE 0300 1DE6 0315 0062;00E0 05AE 1DE6 0315 0062;0061 05AE 0300 1DE6 0315 0062;
+0061 1DE6 0315 0300 05AE 0062;0061 05AE 1DE6 0300 0315 0062;0061 05AE 1DE6 0300 0315 0062;0061 05AE 1DE6 0300 0315 0062;0061 05AE 1DE6 0300 0315 0062;
+0061 0315 0300 05AE 1DFE 0062;00E0 05AE 1DFE 0315 0062;0061 05AE 0300 1DFE 0315 0062;00E0 05AE 1DFE 0315 0062;0061 05AE 0300 1DFE 0315 0062;
+0061 1DFE 0315 0300 05AE 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062;
+0061 059A 0316 302A 1DFF 0062;0061 302A 0316 1DFF 059A 0062;0061 302A 0316 1DFF 059A 0062;0061 302A 0316 1DFF 059A 0062;0061 302A 0316 1DFF 059A 0062;
+0061 1DFF 059A 0316 302A 0062;0061 302A 1DFF 0316 059A 0062;0061 302A 1DFF 0316 059A 0062;0061 302A 1DFF 0316 059A 0062;0061 302A 1DFF 0316 059A 0062;
+0061 0315 0300 05AE 20D0 0062;00E0 05AE 20D0 0315 0062;0061 05AE 0300 20D0 0315 0062;00E0 05AE 20D0 0315 0062;0061 05AE 0300 20D0 0315 0062;
+0061 20D0 0315 0300 05AE 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;
+0061 0315 0300 05AE 20D1 0062;00E0 05AE 20D1 0315 0062;0061 05AE 0300 20D1 0315 0062;00E0 05AE 20D1 0315 0062;0061 05AE 0300 20D1 0315 0062;
+0061 20D1 0315 0300 05AE 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062;
+0061 093C 0334 20D2 0062;0061 0334 20D2 093C 0062;0061 0334 20D2 093C 0062;0061 0334 20D2 093C 0062;0061 0334 20D2 093C 0062;
+0061 20D2 093C 0334 0062;0061 20D2 0334 093C 0062;0061 20D2 0334 093C 0062;0061 20D2 0334 093C 0062;0061 20D2 0334 093C 0062;
+0061 093C 0334 20D3 0062;0061 0334 20D3 093C 0062;0061 0334 20D3 093C 0062;0061 0334 20D3 093C 0062;0061 0334 20D3 093C 0062;
+0061 20D3 093C 0334 0062;0061 20D3 0334 093C 0062;0061 20D3 0334 093C 0062;0061 20D3 0334 093C 0062;0061 20D3 0334 093C 0062;
+0061 0315 0300 05AE 20D4 0062;00E0 05AE 20D4 0315 0062;0061 05AE 0300 20D4 0315 0062;00E0 05AE 20D4 0315 0062;0061 05AE 0300 20D4 0315 0062;
+0061 20D4 0315 0300 05AE 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062;
+0061 0315 0300 05AE 20D5 0062;00E0 05AE 20D5 0315 0062;0061 05AE 0300 20D5 0315 0062;00E0 05AE 20D5 0315 0062;0061 05AE 0300 20D5 0315 0062;
+0061 20D5 0315 0300 05AE 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062;
+0061 0315 0300 05AE 20D6 0062;00E0 05AE 20D6 0315 0062;0061 05AE 0300 20D6 0315 0062;00E0 05AE 20D6 0315 0062;0061 05AE 0300 20D6 0315 0062;
+0061 20D6 0315 0300 05AE 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062;
+0061 0315 0300 05AE 20D7 0062;00E0 05AE 20D7 0315 0062;0061 05AE 0300 20D7 0315 0062;00E0 05AE 20D7 0315 0062;0061 05AE 0300 20D7 0315 0062;
+0061 20D7 0315 0300 05AE 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062;
+0061 093C 0334 20D8 0062;0061 0334 20D8 093C 0062;0061 0334 20D8 093C 0062;0061 0334 20D8 093C 0062;0061 0334 20D8 093C 0062;
+0061 20D8 093C 0334 0062;0061 20D8 0334 093C 0062;0061 20D8 0334 093C 0062;0061 20D8 0334 093C 0062;0061 20D8 0334 093C 0062;
+0061 093C 0334 20D9 0062;0061 0334 20D9 093C 0062;0061 0334 20D9 093C 0062;0061 0334 20D9 093C 0062;0061 0334 20D9 093C 0062;
+0061 20D9 093C 0334 0062;0061 20D9 0334 093C 0062;0061 20D9 0334 093C 0062;0061 20D9 0334 093C 0062;0061 20D9 0334 093C 0062;
+0061 093C 0334 20DA 0062;0061 0334 20DA 093C 0062;0061 0334 20DA 093C 0062;0061 0334 20DA 093C 0062;0061 0334 20DA 093C 0062;
+0061 20DA 093C 0334 0062;0061 20DA 0334 093C 0062;0061 20DA 0334 093C 0062;0061 20DA 0334 093C 0062;0061 20DA 0334 093C 0062;
+0061 0315 0300 05AE 20DB 0062;00E0 05AE 20DB 0315 0062;0061 05AE 0300 20DB 0315 0062;00E0 05AE 20DB 0315 0062;0061 05AE 0300 20DB 0315 0062;
+0061 20DB 0315 0300 05AE 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062;
+0061 0315 0300 05AE 20DC 0062;00E0 05AE 20DC 0315 0062;0061 05AE 0300 20DC 0315 0062;00E0 05AE 20DC 0315 0062;0061 05AE 0300 20DC 0315 0062;
+0061 20DC 0315 0300 05AE 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062;
+0061 0315 0300 05AE 20E1 0062;00E0 05AE 20E1 0315 0062;0061 05AE 0300 20E1 0315 0062;00E0 05AE 20E1 0315 0062;0061 05AE 0300 20E1 0315 0062;
+0061 20E1 0315 0300 05AE 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062;
+0061 093C 0334 20E5 0062;0061 0334 20E5 093C 0062;0061 0334 20E5 093C 0062;0061 0334 20E5 093C 0062;0061 0334 20E5 093C 0062;
+0061 20E5 093C 0334 0062;0061 20E5 0334 093C 0062;0061 20E5 0334 093C 0062;0061 20E5 0334 093C 0062;0061 20E5 0334 093C 0062;
+0061 093C 0334 20E6 0062;0061 0334 20E6 093C 0062;0061 0334 20E6 093C 0062;0061 0334 20E6 093C 0062;0061 0334 20E6 093C 0062;
+0061 20E6 093C 0334 0062;0061 20E6 0334 093C 0062;0061 20E6 0334 093C 0062;0061 20E6 0334 093C 0062;0061 20E6 0334 093C 0062;
+0061 0315 0300 05AE 20E7 0062;00E0 05AE 20E7 0315 0062;0061 05AE 0300 20E7 0315 0062;00E0 05AE 20E7 0315 0062;0061 05AE 0300 20E7 0315 0062;
+0061 20E7 0315 0300 05AE 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;
+0061 059A 0316 302A 20E8 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062;
+0061 20E8 059A 0316 302A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062;
+0061 0315 0300 05AE 20E9 0062;00E0 05AE 20E9 0315 0062;0061 05AE 0300 20E9 0315 0062;00E0 05AE 20E9 0315 0062;0061 05AE 0300 20E9 0315 0062;
+0061 20E9 0315 0300 05AE 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;
+0061 093C 0334 20EA 0062;0061 0334 20EA 093C 0062;0061 0334 20EA 093C 0062;0061 0334 20EA 093C 0062;0061 0334 20EA 093C 0062;
+0061 20EA 093C 0334 0062;0061 20EA 0334 093C 0062;0061 20EA 0334 093C 0062;0061 20EA 0334 093C 0062;0061 20EA 0334 093C 0062;
+0061 093C 0334 20EB 0062;0061 0334 20EB 093C 0062;0061 0334 20EB 093C 0062;0061 0334 20EB 093C 0062;0061 0334 20EB 093C 0062;
+0061 20EB 093C 0334 0062;0061 20EB 0334 093C 0062;0061 20EB 0334 093C 0062;0061 20EB 0334 093C 0062;0061 20EB 0334 093C 0062;
+0061 059A 0316 302A 20EC 0062;0061 302A 0316 20EC 059A 0062;0061 302A 0316 20EC 059A 0062;0061 302A 0316 20EC 059A 0062;0061 302A 0316 20EC 059A 0062;
+0061 20EC 059A 0316 302A 0062;0061 302A 20EC 0316 059A 0062;0061 302A 20EC 0316 059A 0062;0061 302A 20EC 0316 059A 0062;0061 302A 20EC 0316 059A 0062;
+0061 059A 0316 302A 20ED 0062;0061 302A 0316 20ED 059A 0062;0061 302A 0316 20ED 059A 0062;0061 302A 0316 20ED 059A 0062;0061 302A 0316 20ED 059A 0062;
+0061 20ED 059A 0316 302A 0062;0061 302A 20ED 0316 059A 0062;0061 302A 20ED 0316 059A 0062;0061 302A 20ED 0316 059A 0062;0061 302A 20ED 0316 059A 0062;
+0061 059A 0316 302A 20EE 0062;0061 302A 0316 20EE 059A 0062;0061 302A 0316 20EE 059A 0062;0061 302A 0316 20EE 059A 0062;0061 302A 0316 20EE 059A 0062;
+0061 20EE 059A 0316 302A 0062;0061 302A 20EE 0316 059A 0062;0061 302A 20EE 0316 059A 0062;0061 302A 20EE 0316 059A 0062;0061 302A 20EE 0316 059A 0062;
+0061 059A 0316 302A 20EF 0062;0061 302A 0316 20EF 059A 0062;0061 302A 0316 20EF 059A 0062;0061 302A 0316 20EF 059A 0062;0061 302A 0316 20EF 059A 0062;
+0061 20EF 059A 0316 302A 0062;0061 302A 20EF 0316 059A 0062;0061 302A 20EF 0316 059A 0062;0061 302A 20EF 0316 059A 0062;0061 302A 20EF 0316 059A 0062;
+0061 0315 0300 05AE 20F0 0062;00E0 05AE 20F0 0315 0062;0061 05AE 0300 20F0 0315 0062;00E0 05AE 20F0 0315 0062;0061 05AE 0300 20F0 0315 0062;
+0061 20F0 0315 0300 05AE 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062;
+0061 0315 0300 05AE 2DE0 0062;00E0 05AE 2DE0 0315 0062;0061 05AE 0300 2DE0 0315 0062;00E0 05AE 2DE0 0315 0062;0061 05AE 0300 2DE0 0315 0062;
+0061 2DE0 0315 0300 05AE 0062;0061 05AE 2DE0 0300 0315 0062;0061 05AE 2DE0 0300 0315 0062;0061 05AE 2DE0 0300 0315 0062;0061 05AE 2DE0 0300 0315 0062;
+0061 0315 0300 05AE 2DE1 0062;00E0 05AE 2DE1 0315 0062;0061 05AE 0300 2DE1 0315 0062;00E0 05AE 2DE1 0315 0062;0061 05AE 0300 2DE1 0315 0062;
+0061 2DE1 0315 0300 05AE 0062;0061 05AE 2DE1 0300 0315 0062;0061 05AE 2DE1 0300 0315 0062;0061 05AE 2DE1 0300 0315 0062;0061 05AE 2DE1 0300 0315 0062;
+0061 0315 0300 05AE 2DE2 0062;00E0 05AE 2DE2 0315 0062;0061 05AE 0300 2DE2 0315 0062;00E0 05AE 2DE2 0315 0062;0061 05AE 0300 2DE2 0315 0062;
+0061 2DE2 0315 0300 05AE 0062;0061 05AE 2DE2 0300 0315 0062;0061 05AE 2DE2 0300 0315 0062;0061 05AE 2DE2 0300 0315 0062;0061 05AE 2DE2 0300 0315 0062;
+0061 0315 0300 05AE 2DE3 0062;00E0 05AE 2DE3 0315 0062;0061 05AE 0300 2DE3 0315 0062;00E0 05AE 2DE3 0315 0062;0061 05AE 0300 2DE3 0315 0062;
+0061 2DE3 0315 0300 05AE 0062;0061 05AE 2DE3 0300 0315 0062;0061 05AE 2DE3 0300 0315 0062;0061 05AE 2DE3 0300 0315 0062;0061 05AE 2DE3 0300 0315 0062;
+0061 0315 0300 05AE 2DE4 0062;00E0 05AE 2DE4 0315 0062;0061 05AE 0300 2DE4 0315 0062;00E0 05AE 2DE4 0315 0062;0061 05AE 0300 2DE4 0315 0062;
+0061 2DE4 0315 0300 05AE 0062;0061 05AE 2DE4 0300 0315 0062;0061 05AE 2DE4 0300 0315 0062;0061 05AE 2DE4 0300 0315 0062;0061 05AE 2DE4 0300 0315 0062;
+0061 0315 0300 05AE 2DE5 0062;00E0 05AE 2DE5 0315 0062;0061 05AE 0300 2DE5 0315 0062;00E0 05AE 2DE5 0315 0062;0061 05AE 0300 2DE5 0315 0062;
+0061 2DE5 0315 0300 05AE 0062;0061 05AE 2DE5 0300 0315 0062;0061 05AE 2DE5 0300 0315 0062;0061 05AE 2DE5 0300 0315 0062;0061 05AE 2DE5 0300 0315 0062;
+0061 0315 0300 05AE 2DE6 0062;00E0 05AE 2DE6 0315 0062;0061 05AE 0300 2DE6 0315 0062;00E0 05AE 2DE6 0315 0062;0061 05AE 0300 2DE6 0315 0062;
+0061 2DE6 0315 0300 05AE 0062;0061 05AE 2DE6 0300 0315 0062;0061 05AE 2DE6 0300 0315 0062;0061 05AE 2DE6 0300 0315 0062;0061 05AE 2DE6 0300 0315 0062;
+0061 0315 0300 05AE 2DE7 0062;00E0 05AE 2DE7 0315 0062;0061 05AE 0300 2DE7 0315 0062;00E0 05AE 2DE7 0315 0062;0061 05AE 0300 2DE7 0315 0062;
+0061 2DE7 0315 0300 05AE 0062;0061 05AE 2DE7 0300 0315 0062;0061 05AE 2DE7 0300 0315 0062;0061 05AE 2DE7 0300 0315 0062;0061 05AE 2DE7 0300 0315 0062;
+0061 0315 0300 05AE 2DE8 0062;00E0 05AE 2DE8 0315 0062;0061 05AE 0300 2DE8 0315 0062;00E0 05AE 2DE8 0315 0062;0061 05AE 0300 2DE8 0315 0062;
+0061 2DE8 0315 0300 05AE 0062;0061 05AE 2DE8 0300 0315 0062;0061 05AE 2DE8 0300 0315 0062;0061 05AE 2DE8 0300 0315 0062;0061 05AE 2DE8 0300 0315 0062;
+0061 0315 0300 05AE 2DE9 0062;00E0 05AE 2DE9 0315 0062;0061 05AE 0300 2DE9 0315 0062;00E0 05AE 2DE9 0315 0062;0061 05AE 0300 2DE9 0315 0062;
+0061 2DE9 0315 0300 05AE 0062;0061 05AE 2DE9 0300 0315 0062;0061 05AE 2DE9 0300 0315 0062;0061 05AE 2DE9 0300 0315 0062;0061 05AE 2DE9 0300 0315 0062;
+0061 0315 0300 05AE 2DEA 0062;00E0 05AE 2DEA 0315 0062;0061 05AE 0300 2DEA 0315 0062;00E0 05AE 2DEA 0315 0062;0061 05AE 0300 2DEA 0315 0062;
+0061 2DEA 0315 0300 05AE 0062;0061 05AE 2DEA 0300 0315 0062;0061 05AE 2DEA 0300 0315 0062;0061 05AE 2DEA 0300 0315 0062;0061 05AE 2DEA 0300 0315 0062;
+0061 0315 0300 05AE 2DEB 0062;00E0 05AE 2DEB 0315 0062;0061 05AE 0300 2DEB 0315 0062;00E0 05AE 2DEB 0315 0062;0061 05AE 0300 2DEB 0315 0062;
+0061 2DEB 0315 0300 05AE 0062;0061 05AE 2DEB 0300 0315 0062;0061 05AE 2DEB 0300 0315 0062;0061 05AE 2DEB 0300 0315 0062;0061 05AE 2DEB 0300 0315 0062;
+0061 0315 0300 05AE 2DEC 0062;00E0 05AE 2DEC 0315 0062;0061 05AE 0300 2DEC 0315 0062;00E0 05AE 2DEC 0315 0062;0061 05AE 0300 2DEC 0315 0062;
+0061 2DEC 0315 0300 05AE 0062;0061 05AE 2DEC 0300 0315 0062;0061 05AE 2DEC 0300 0315 0062;0061 05AE 2DEC 0300 0315 0062;0061 05AE 2DEC 0300 0315 0062;
+0061 0315 0300 05AE 2DED 0062;00E0 05AE 2DED 0315 0062;0061 05AE 0300 2DED 0315 0062;00E0 05AE 2DED 0315 0062;0061 05AE 0300 2DED 0315 0062;
+0061 2DED 0315 0300 05AE 0062;0061 05AE 2DED 0300 0315 0062;0061 05AE 2DED 0300 0315 0062;0061 05AE 2DED 0300 0315 0062;0061 05AE 2DED 0300 0315 0062;
+0061 0315 0300 05AE 2DEE 0062;00E0 05AE 2DEE 0315 0062;0061 05AE 0300 2DEE 0315 0062;00E0 05AE 2DEE 0315 0062;0061 05AE 0300 2DEE 0315 0062;
+0061 2DEE 0315 0300 05AE 0062;0061 05AE 2DEE 0300 0315 0062;0061 05AE 2DEE 0300 0315 0062;0061 05AE 2DEE 0300 0315 0062;0061 05AE 2DEE 0300 0315 0062;
+0061 0315 0300 05AE 2DEF 0062;00E0 05AE 2DEF 0315 0062;0061 05AE 0300 2DEF 0315 0062;00E0 05AE 2DEF 0315 0062;0061 05AE 0300 2DEF 0315 0062;
+0061 2DEF 0315 0300 05AE 0062;0061 05AE 2DEF 0300 0315 0062;0061 05AE 2DEF 0300 0315 0062;0061 05AE 2DEF 0300 0315 0062;0061 05AE 2DEF 0300 0315 0062;
+0061 0315 0300 05AE 2DF0 0062;00E0 05AE 2DF0 0315 0062;0061 05AE 0300 2DF0 0315 0062;00E0 05AE 2DF0 0315 0062;0061 05AE 0300 2DF0 0315 0062;
+0061 2DF0 0315 0300 05AE 0062;0061 05AE 2DF0 0300 0315 0062;0061 05AE 2DF0 0300 0315 0062;0061 05AE 2DF0 0300 0315 0062;0061 05AE 2DF0 0300 0315 0062;
+0061 0315 0300 05AE 2DF1 0062;00E0 05AE 2DF1 0315 0062;0061 05AE 0300 2DF1 0315 0062;00E0 05AE 2DF1 0315 0062;0061 05AE 0300 2DF1 0315 0062;
+0061 2DF1 0315 0300 05AE 0062;0061 05AE 2DF1 0300 0315 0062;0061 05AE 2DF1 0300 0315 0062;0061 05AE 2DF1 0300 0315 0062;0061 05AE 2DF1 0300 0315 0062;
+0061 0315 0300 05AE 2DF2 0062;00E0 05AE 2DF2 0315 0062;0061 05AE 0300 2DF2 0315 0062;00E0 05AE 2DF2 0315 0062;0061 05AE 0300 2DF2 0315 0062;
+0061 2DF2 0315 0300 05AE 0062;0061 05AE 2DF2 0300 0315 0062;0061 05AE 2DF2 0300 0315 0062;0061 05AE 2DF2 0300 0315 0062;0061 05AE 2DF2 0300 0315 0062;
+0061 0315 0300 05AE 2DF3 0062;00E0 05AE 2DF3 0315 0062;0061 05AE 0300 2DF3 0315 0062;00E0 05AE 2DF3 0315 0062;0061 05AE 0300 2DF3 0315 0062;
+0061 2DF3 0315 0300 05AE 0062;0061 05AE 2DF3 0300 0315 0062;0061 05AE 2DF3 0300 0315 0062;0061 05AE 2DF3 0300 0315 0062;0061 05AE 2DF3 0300 0315 0062;
+0061 0315 0300 05AE 2DF4 0062;00E0 05AE 2DF4 0315 0062;0061 05AE 0300 2DF4 0315 0062;00E0 05AE 2DF4 0315 0062;0061 05AE 0300 2DF4 0315 0062;
+0061 2DF4 0315 0300 05AE 0062;0061 05AE 2DF4 0300 0315 0062;0061 05AE 2DF4 0300 0315 0062;0061 05AE 2DF4 0300 0315 0062;0061 05AE 2DF4 0300 0315 0062;
+0061 0315 0300 05AE 2DF5 0062;00E0 05AE 2DF5 0315 0062;0061 05AE 0300 2DF5 0315 0062;00E0 05AE 2DF5 0315 0062;0061 05AE 0300 2DF5 0315 0062;
+0061 2DF5 0315 0300 05AE 0062;0061 05AE 2DF5 0300 0315 0062;0061 05AE 2DF5 0300 0315 0062;0061 05AE 2DF5 0300 0315 0062;0061 05AE 2DF5 0300 0315 0062;
+0061 0315 0300 05AE 2DF6 0062;00E0 05AE 2DF6 0315 0062;0061 05AE 0300 2DF6 0315 0062;00E0 05AE 2DF6 0315 0062;0061 05AE 0300 2DF6 0315 0062;
+0061 2DF6 0315 0300 05AE 0062;0061 05AE 2DF6 0300 0315 0062;0061 05AE 2DF6 0300 0315 0062;0061 05AE 2DF6 0300 0315 0062;0061 05AE 2DF6 0300 0315 0062;
+0061 0315 0300 05AE 2DF7 0062;00E0 05AE 2DF7 0315 0062;0061 05AE 0300 2DF7 0315 0062;00E0 05AE 2DF7 0315 0062;0061 05AE 0300 2DF7 0315 0062;
+0061 2DF7 0315 0300 05AE 0062;0061 05AE 2DF7 0300 0315 0062;0061 05AE 2DF7 0300 0315 0062;0061 05AE 2DF7 0300 0315 0062;0061 05AE 2DF7 0300 0315 0062;
+0061 0315 0300 05AE 2DF8 0062;00E0 05AE 2DF8 0315 0062;0061 05AE 0300 2DF8 0315 0062;00E0 05AE 2DF8 0315 0062;0061 05AE 0300 2DF8 0315 0062;
+0061 2DF8 0315 0300 05AE 0062;0061 05AE 2DF8 0300 0315 0062;0061 05AE 2DF8 0300 0315 0062;0061 05AE 2DF8 0300 0315 0062;0061 05AE 2DF8 0300 0315 0062;
+0061 0315 0300 05AE 2DF9 0062;00E0 05AE 2DF9 0315 0062;0061 05AE 0300 2DF9 0315 0062;00E0 05AE 2DF9 0315 0062;0061 05AE 0300 2DF9 0315 0062;
+0061 2DF9 0315 0300 05AE 0062;0061 05AE 2DF9 0300 0315 0062;0061 05AE 2DF9 0300 0315 0062;0061 05AE 2DF9 0300 0315 0062;0061 05AE 2DF9 0300 0315 0062;
+0061 0315 0300 05AE 2DFA 0062;00E0 05AE 2DFA 0315 0062;0061 05AE 0300 2DFA 0315 0062;00E0 05AE 2DFA 0315 0062;0061 05AE 0300 2DFA 0315 0062;
+0061 2DFA 0315 0300 05AE 0062;0061 05AE 2DFA 0300 0315 0062;0061 05AE 2DFA 0300 0315 0062;0061 05AE 2DFA 0300 0315 0062;0061 05AE 2DFA 0300 0315 0062;
+0061 0315 0300 05AE 2DFB 0062;00E0 05AE 2DFB 0315 0062;0061 05AE 0300 2DFB 0315 0062;00E0 05AE 2DFB 0315 0062;0061 05AE 0300 2DFB 0315 0062;
+0061 2DFB 0315 0300 05AE 0062;0061 05AE 2DFB 0300 0315 0062;0061 05AE 2DFB 0300 0315 0062;0061 05AE 2DFB 0300 0315 0062;0061 05AE 2DFB 0300 0315 0062;
+0061 0315 0300 05AE 2DFC 0062;00E0 05AE 2DFC 0315 0062;0061 05AE 0300 2DFC 0315 0062;00E0 05AE 2DFC 0315 0062;0061 05AE 0300 2DFC 0315 0062;
+0061 2DFC 0315 0300 05AE 0062;0061 05AE 2DFC 0300 0315 0062;0061 05AE 2DFC 0300 0315 0062;0061 05AE 2DFC 0300 0315 0062;0061 05AE 2DFC 0300 0315 0062;
+0061 0315 0300 05AE 2DFD 0062;00E0 05AE 2DFD 0315 0062;0061 05AE 0300 2DFD 0315 0062;00E0 05AE 2DFD 0315 0062;0061 05AE 0300 2DFD 0315 0062;
+0061 2DFD 0315 0300 05AE 0062;0061 05AE 2DFD 0300 0315 0062;0061 05AE 2DFD 0300 0315 0062;0061 05AE 2DFD 0300 0315 0062;0061 05AE 2DFD 0300 0315 0062;
+0061 0315 0300 05AE 2DFE 0062;00E0 05AE 2DFE 0315 0062;0061 05AE 0300 2DFE 0315 0062;00E0 05AE 2DFE 0315 0062;0061 05AE 0300 2DFE 0315 0062;
+0061 2DFE 0315 0300 05AE 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062;
+0061 0315 0300 05AE 2DFF 0062;00E0 05AE 2DFF 0315 0062;0061 05AE 0300 2DFF 0315 0062;00E0 05AE 2DFF 0315 0062;0061 05AE 0300 2DFF 0315 0062;
+0061 2DFF 0315 0300 05AE 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062;
+0061 0316 302A 031B 302A 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;
+0061 302A 0316 302A 031B 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;
+0061 0300 05AE 1D16D 302B 0062;00E0 1D16D 05AE 302B 0062;0061 1D16D 05AE 302B 0300 0062;00E0 1D16D 05AE 302B 0062;0061 1D16D 05AE 302B 0300 0062;
+0061 302B 0300 05AE 1D16D 0062;00E0 1D16D 302B 05AE 0062;0061 1D16D 302B 05AE 0300 0062;00E0 1D16D 302B 05AE 0062;0061 1D16D 302B 05AE 0300 0062;
+0061 035C 0315 0300 302C 0062;00E0 0315 302C 035C 0062;0061 0300 0315 302C 035C 0062;00E0 0315 302C 035C 0062;0061 0300 0315 302C 035C 0062;
+0061 302C 035C 0315 0300 0062;00E0 302C 0315 035C 0062;0061 0300 302C 0315 035C 0062;00E0 302C 0315 035C 0062;0061 0300 302C 0315 035C 0062;
+0061 302E 059A 0316 302D 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062;
+0061 302D 302E 059A 0316 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062;
+0061 1D16D 302E 059A 302E 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;
+0061 302E 1D16D 302E 059A 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;
+0061 1D16D 302E 059A 302F 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062;
+0061 302F 1D16D 302E 059A 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062;
+0061 094D 3099 093C 3099 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;
+0061 3099 094D 3099 093C 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;
+0061 094D 3099 093C 309A 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062;
+0061 309A 094D 3099 093C 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062;
+0061 0315 0300 05AE A66F 0062;00E0 05AE A66F 0315 0062;0061 05AE 0300 A66F 0315 0062;00E0 05AE A66F 0315 0062;0061 05AE 0300 A66F 0315 0062;
+0061 A66F 0315 0300 05AE 0062;0061 05AE A66F 0300 0315 0062;0061 05AE A66F 0300 0315 0062;0061 05AE A66F 0300 0315 0062;0061 05AE A66F 0300 0315 0062;
+0061 0315 0300 05AE A67C 0062;00E0 05AE A67C 0315 0062;0061 05AE 0300 A67C 0315 0062;00E0 05AE A67C 0315 0062;0061 05AE 0300 A67C 0315 0062;
+0061 A67C 0315 0300 05AE 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062;
+0061 0315 0300 05AE A67D 0062;00E0 05AE A67D 0315 0062;0061 05AE 0300 A67D 0315 0062;00E0 05AE A67D 0315 0062;0061 05AE 0300 A67D 0315 0062;
+0061 A67D 0315 0300 05AE 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062;
+0061 05B0 094D 3099 A806 0062;0061 3099 094D A806 05B0 0062;0061 3099 094D A806 05B0 0062;0061 3099 094D A806 05B0 0062;0061 3099 094D A806 05B0 0062;
+0061 A806 05B0 094D 3099 0062;0061 3099 A806 094D 05B0 0062;0061 3099 A806 094D 05B0 0062;0061 3099 A806 094D 05B0 0062;0061 3099 A806 094D 05B0 0062;
+0061 05B0 094D 3099 A8C4 0062;0061 3099 094D A8C4 05B0 0062;0061 3099 094D A8C4 05B0 0062;0061 3099 094D A8C4 05B0 0062;0061 3099 094D A8C4 05B0 0062;
+0061 A8C4 05B0 094D 3099 0062;0061 3099 A8C4 094D 05B0 0062;0061 3099 A8C4 094D 05B0 0062;0061 3099 A8C4 094D 05B0 0062;0061 3099 A8C4 094D 05B0 0062;
+0061 059A 0316 302A A92B 0062;0061 302A 0316 A92B 059A 0062;0061 302A 0316 A92B 059A 0062;0061 302A 0316 A92B 059A 0062;0061 302A 0316 A92B 059A 0062;
+0061 A92B 059A 0316 302A 0062;0061 302A A92B 0316 059A 0062;0061 302A A92B 0316 059A 0062;0061 302A A92B 0316 059A 0062;0061 302A A92B 0316 059A 0062;
+0061 059A 0316 302A A92C 0062;0061 302A 0316 A92C 059A 0062;0061 302A 0316 A92C 059A 0062;0061 302A 0316 A92C 059A 0062;0061 302A 0316 A92C 059A 0062;
+0061 A92C 059A 0316 302A 0062;0061 302A A92C 0316 059A 0062;0061 302A A92C 0316 059A 0062;0061 302A A92C 0316 059A 0062;0061 302A A92C 0316 059A 0062;
+0061 059A 0316 302A A92D 0062;0061 302A 0316 A92D 059A 0062;0061 302A 0316 A92D 059A 0062;0061 302A 0316 A92D 059A 0062;0061 302A 0316 A92D 059A 0062;
+0061 A92D 059A 0316 302A 0062;0061 302A A92D 0316 059A 0062;0061 302A A92D 0316 059A 0062;0061 302A A92D 0316 059A 0062;0061 302A A92D 0316 059A 0062;
+0061 05B0 094D 3099 A953 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062;
+0061 A953 05B0 094D 3099 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062;
+0061 064B FB1E 05C2 FB1E 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;
+0061 FB1E 064B FB1E 05C2 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;
+0061 0315 0300 05AE FE20 0062;00E0 05AE FE20 0315 0062;0061 05AE 0300 FE20 0315 0062;00E0 05AE FE20 0315 0062;0061 05AE 0300 FE20 0315 0062;
+0061 FE20 0315 0300 05AE 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062;
+0061 0315 0300 05AE FE21 0062;00E0 05AE FE21 0315 0062;0061 05AE 0300 FE21 0315 0062;00E0 05AE FE21 0315 0062;0061 05AE 0300 FE21 0315 0062;
+0061 FE21 0315 0300 05AE 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062;
+0061 0315 0300 05AE FE22 0062;00E0 05AE FE22 0315 0062;0061 05AE 0300 FE22 0315 0062;00E0 05AE FE22 0315 0062;0061 05AE 0300 FE22 0315 0062;
+0061 FE22 0315 0300 05AE 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062;
+0061 0315 0300 05AE FE23 0062;00E0 05AE FE23 0315 0062;0061 05AE 0300 FE23 0315 0062;00E0 05AE FE23 0315 0062;0061 05AE 0300 FE23 0315 0062;
+0061 FE23 0315 0300 05AE 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062;
+0061 0315 0300 05AE FE24 0062;00E0 05AE FE24 0315 0062;0061 05AE 0300 FE24 0315 0062;00E0 05AE FE24 0315 0062;0061 05AE 0300 FE24 0315 0062;
+0061 FE24 0315 0300 05AE 0062;0061 05AE FE24 0300 0315 0062;0061 05AE FE24 0300 0315 0062;0061 05AE FE24 0300 0315 0062;0061 05AE FE24 0300 0315 0062;
+0061 0315 0300 05AE FE25 0062;00E0 05AE FE25 0315 0062;0061 05AE 0300 FE25 0315 0062;00E0 05AE FE25 0315 0062;0061 05AE 0300 FE25 0315 0062;
+0061 FE25 0315 0300 05AE 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062;
+0061 0315 0300 05AE FE26 0062;00E0 05AE FE26 0315 0062;0061 05AE 0300 FE26 0315 0062;00E0 05AE FE26 0315 0062;0061 05AE 0300 FE26 0315 0062;
+0061 FE26 0315 0300 05AE 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062;
+0061 059A 0316 302A 101FD 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062;
+0061 101FD 059A 0316 302A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062;
+0061 059A 0316 302A 10A0D 0062;0061 302A 0316 10A0D 059A 0062;0061 302A 0316 10A0D 059A 0062;0061 302A 0316 10A0D 059A 0062;0061 302A 0316 10A0D 059A 0062;
+0061 10A0D 059A 0316 302A 0062;0061 302A 10A0D 0316 059A 0062;0061 302A 10A0D 0316 059A 0062;0061 302A 10A0D 0316 059A 0062;0061 302A 10A0D 0316 059A 0062;
+0061 0315 0300 05AE 10A0F 0062;00E0 05AE 10A0F 0315 0062;0061 05AE 0300 10A0F 0315 0062;00E0 05AE 10A0F 0315 0062;0061 05AE 0300 10A0F 0315 0062;
+0061 10A0F 0315 0300 05AE 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062;
+0061 0315 0300 05AE 10A38 0062;00E0 05AE 10A38 0315 0062;0061 05AE 0300 10A38 0315 0062;00E0 05AE 10A38 0315 0062;0061 05AE 0300 10A38 0315 0062;
+0061 10A38 0315 0300 05AE 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062;
+0061 093C 0334 10A39 0062;0061 0334 10A39 093C 0062;0061 0334 10A39 093C 0062;0061 0334 10A39 093C 0062;0061 0334 10A39 093C 0062;
+0061 10A39 093C 0334 0062;0061 10A39 0334 093C 0062;0061 10A39 0334 093C 0062;0061 10A39 0334 093C 0062;0061 10A39 0334 093C 0062;
+0061 059A 0316 302A 10A3A 0062;0061 302A 0316 10A3A 059A 0062;0061 302A 0316 10A3A 059A 0062;0061 302A 0316 10A3A 059A 0062;0061 302A 0316 10A3A 059A 0062;
+0061 10A3A 059A 0316 302A 0062;0061 302A 10A3A 0316 059A 0062;0061 302A 10A3A 0316 059A 0062;0061 302A 10A3A 0316 059A 0062;0061 302A 10A3A 0316 059A 0062;
+0061 05B0 094D 3099 10A3F 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062;
+0061 10A3F 05B0 094D 3099 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062;
+0061 302A 031B 1DCE 1D165 0062;0061 1DCE 031B 1D165 302A 0062;0061 1DCE 031B 1D165 302A 0062;0061 1DCE 031B 1D165 302A 0062;0061 1DCE 031B 1D165 302A 0062;
+0061 1D165 302A 031B 1DCE 0062;0061 1DCE 1D165 031B 302A 0062;0061 1DCE 1D165 031B 302A 0062;0061 1DCE 1D165 031B 302A 0062;0061 1DCE 1D165 031B 302A 0062;
+0061 302A 031B 1DCE 1D166 0062;0061 1DCE 031B 1D166 302A 0062;0061 1DCE 031B 1D166 302A 0062;0061 1DCE 031B 1D166 302A 0062;0061 1DCE 031B 1D166 302A 0062;
+0061 1D166 302A 031B 1DCE 0062;0061 1DCE 1D166 031B 302A 0062;0061 1DCE 1D166 031B 302A 0062;0061 1DCE 1D166 031B 302A 0062;0061 1DCE 1D166 031B 302A 0062;
+0061 093C 0334 1D167 0062;0061 0334 1D167 093C 0062;0061 0334 1D167 093C 0062;0061 0334 1D167 093C 0062;0061 0334 1D167 093C 0062;
+0061 1D167 093C 0334 0062;0061 1D167 0334 093C 0062;0061 1D167 0334 093C 0062;0061 1D167 0334 093C 0062;0061 1D167 0334 093C 0062;
+0061 093C 0334 1D168 0062;0061 0334 1D168 093C 0062;0061 0334 1D168 093C 0062;0061 0334 1D168 093C 0062;0061 0334 1D168 093C 0062;
+0061 1D168 093C 0334 0062;0061 1D168 0334 093C 0062;0061 1D168 0334 093C 0062;0061 1D168 0334 093C 0062;0061 1D168 0334 093C 0062;
+0061 093C 0334 1D169 0062;0061 0334 1D169 093C 0062;0061 0334 1D169 093C 0062;0061 0334 1D169 093C 0062;0061 0334 1D169 093C 0062;
+0061 1D169 093C 0334 0062;0061 1D169 0334 093C 0062;0061 1D169 0334 093C 0062;0061 1D169 0334 093C 0062;0061 1D169 0334 093C 0062;
+0061 05AE 1D16D 302E 1D16D 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;
+0061 1D16D 05AE 1D16D 302E 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;
+0061 302A 031B 1DCE 1D16E 0062;0061 1DCE 031B 1D16E 302A 0062;0061 1DCE 031B 1D16E 302A 0062;0061 1DCE 031B 1D16E 302A 0062;0061 1DCE 031B 1D16E 302A 0062;
+0061 1D16E 302A 031B 1DCE 0062;0061 1DCE 1D16E 031B 302A 0062;0061 1DCE 1D16E 031B 302A 0062;0061 1DCE 1D16E 031B 302A 0062;0061 1DCE 1D16E 031B 302A 0062;
+0061 302A 031B 1DCE 1D16F 0062;0061 1DCE 031B 1D16F 302A 0062;0061 1DCE 031B 1D16F 302A 0062;0061 1DCE 031B 1D16F 302A 0062;0061 1DCE 031B 1D16F 302A 0062;
+0061 1D16F 302A 031B 1DCE 0062;0061 1DCE 1D16F 031B 302A 0062;0061 1DCE 1D16F 031B 302A 0062;0061 1DCE 1D16F 031B 302A 0062;0061 1DCE 1D16F 031B 302A 0062;
+0061 302A 031B 1DCE 1D170 0062;0061 1DCE 031B 1D170 302A 0062;0061 1DCE 031B 1D170 302A 0062;0061 1DCE 031B 1D170 302A 0062;0061 1DCE 031B 1D170 302A 0062;
+0061 1D170 302A 031B 1DCE 0062;0061 1DCE 1D170 031B 302A 0062;0061 1DCE 1D170 031B 302A 0062;0061 1DCE 1D170 031B 302A 0062;0061 1DCE 1D170 031B 302A 0062;
+0061 302A 031B 1DCE 1D171 0062;0061 1DCE 031B 1D171 302A 0062;0061 1DCE 031B 1D171 302A 0062;0061 1DCE 031B 1D171 302A 0062;0061 1DCE 031B 1D171 302A 0062;
+0061 1D171 302A 031B 1DCE 0062;0061 1DCE 1D171 031B 302A 0062;0061 1DCE 1D171 031B 302A 0062;0061 1DCE 1D171 031B 302A 0062;0061 1DCE 1D171 031B 302A 0062;
+0061 302A 031B 1DCE 1D172 0062;0061 1DCE 031B 1D172 302A 0062;0061 1DCE 031B 1D172 302A 0062;0061 1DCE 031B 1D172 302A 0062;0061 1DCE 031B 1D172 302A 0062;
+0061 1D172 302A 031B 1DCE 0062;0061 1DCE 1D172 031B 302A 0062;0061 1DCE 1D172 031B 302A 0062;0061 1DCE 1D172 031B 302A 0062;0061 1DCE 1D172 031B 302A 0062;
+0061 059A 0316 302A 1D17B 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062;
+0061 1D17B 059A 0316 302A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062;
+0061 059A 0316 302A 1D17C 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062;
+0061 1D17C 059A 0316 302A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062;
+0061 059A 0316 302A 1D17D 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062;
+0061 1D17D 059A 0316 302A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062;
+0061 059A 0316 302A 1D17E 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062;
+0061 1D17E 059A 0316 302A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062;
+0061 059A 0316 302A 1D17F 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062;
+0061 1D17F 059A 0316 302A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062;
+0061 059A 0316 302A 1D180 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062;
+0061 1D180 059A 0316 302A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062;
+0061 059A 0316 302A 1D181 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062;
+0061 1D181 059A 0316 302A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062;
+0061 059A 0316 302A 1D182 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062;
+0061 1D182 059A 0316 302A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062;
+0061 0315 0300 05AE 1D185 0062;00E0 05AE 1D185 0315 0062;0061 05AE 0300 1D185 0315 0062;00E0 05AE 1D185 0315 0062;0061 05AE 0300 1D185 0315 0062;
+0061 1D185 0315 0300 05AE 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;
+0061 0315 0300 05AE 1D186 0062;00E0 05AE 1D186 0315 0062;0061 05AE 0300 1D186 0315 0062;00E0 05AE 1D186 0315 0062;0061 05AE 0300 1D186 0315 0062;
+0061 1D186 0315 0300 05AE 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062;
+0061 0315 0300 05AE 1D187 0062;00E0 05AE 1D187 0315 0062;0061 05AE 0300 1D187 0315 0062;00E0 05AE 1D187 0315 0062;0061 05AE 0300 1D187 0315 0062;
+0061 1D187 0315 0300 05AE 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062;
+0061 0315 0300 05AE 1D188 0062;00E0 05AE 1D188 0315 0062;0061 05AE 0300 1D188 0315 0062;00E0 05AE 1D188 0315 0062;0061 05AE 0300 1D188 0315 0062;
+0061 1D188 0315 0300 05AE 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;
+0061 0315 0300 05AE 1D189 0062;00E0 05AE 1D189 0315 0062;0061 05AE 0300 1D189 0315 0062;00E0 05AE 1D189 0315 0062;0061 05AE 0300 1D189 0315 0062;
+0061 1D189 0315 0300 05AE 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;
+0061 059A 0316 302A 1D18A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062;
+0061 1D18A 059A 0316 302A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062;
+0061 059A 0316 302A 1D18B 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062;
+0061 1D18B 059A 0316 302A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062;
+0061 0315 0300 05AE 1D1AA 0062;00E0 05AE 1D1AA 0315 0062;0061 05AE 0300 1D1AA 0315 0062;00E0 05AE 1D1AA 0315 0062;0061 05AE 0300 1D1AA 0315 0062;
+0061 1D1AA 0315 0300 05AE 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;
+0061 0315 0300 05AE 1D1AB 0062;00E0 05AE 1D1AB 0315 0062;0061 05AE 0300 1D1AB 0315 0062;00E0 05AE 1D1AB 0315 0062;0061 05AE 0300 1D1AB 0315 0062;
+0061 1D1AB 0315 0300 05AE 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062;
+0061 0315 0300 05AE 1D1AC 0062;00E0 05AE 1D1AC 0315 0062;0061 05AE 0300 1D1AC 0315 0062;00E0 05AE 1D1AC 0315 0062;0061 05AE 0300 1D1AC 0315 0062;
+0061 1D1AC 0315 0300 05AE 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062;
+0061 0315 0300 05AE 1D1AD 0062;00E0 05AE 1D1AD 0315 0062;0061 05AE 0300 1D1AD 0315 0062;00E0 05AE 1D1AD 0315 0062;0061 05AE 0300 1D1AD 0315 0062;
+0061 1D1AD 0315 0300 05AE 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062;
+0061 0315 0300 05AE 1D242 0062;00E0 05AE 1D242 0315 0062;0061 05AE 0300 1D242 0315 0062;00E0 05AE 1D242 0315 0062;0061 05AE 0300 1D242 0315 0062;
+0061 1D242 0315 0300 05AE 0062;0061 05AE 1D242 0300 0315 0062;0061 05AE 1D242 0300 0315 0062;0061 05AE 1D242 0300 0315 0062;0061 05AE 1D242 0300 0315 0062;
+0061 0315 0300 05AE 1D243 0062;00E0 05AE 1D243 0315 0062;0061 05AE 0300 1D243 0315 0062;00E0 05AE 1D243 0315 0062;0061 05AE 0300 1D243 0315 0062;
+0061 1D243 0315 0300 05AE 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062;
+0061 0315 0300 05AE 1D244 0062;00E0 05AE 1D244 0315 0062;0061 05AE 0300 1D244 0315 0062;00E0 05AE 1D244 0315 0062;0061 05AE 0300 1D244 0315 0062;
+0061 1D244 0315 0300 05AE 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062;
+
+@Part3
+
+09C7 0334 09BE;09C7 0334 09BE;09C7 0334 09BE;09C7 0334 09BE;09C7 0334 09BE;
+09C7 0334 09D7;09C7 0334 09D7;09C7 0334 09D7;09C7 0334 09D7;09C7 0334 09D7;
+0B47 0334 0B3E;0B47 0334 0B3E;0B47 0334 0B3E;0B47 0334 0B3E;0B47 0334 0B3E;
+0B47 0334 0B56;0B47 0334 0B56;0B47 0334 0B56;0B47 0334 0B56;0B47 0334 0B56;
+0B47 0334 0B57;0B47 0334 0B57;0B47 0334 0B57;0B47 0334 0B57;0B47 0334 0B57;
+0B92 0334 0BD7;0B92 0334 0BD7;0B92 0334 0BD7;0B92 0334 0BD7;0B92 0334 0BD7;
+0BC6 0334 0BBE;0BC6 0334 0BBE;0BC6 0334 0BBE;0BC6 0334 0BBE;0BC6 0334 0BBE;
+0BC6 0334 0BD7;0BC6 0334 0BD7;0BC6 0334 0BD7;0BC6 0334 0BD7;0BC6 0334 0BD7;
+0BC7 0334 0BBE;0BC7 0334 0BBE;0BC7 0334 0BBE;0BC7 0334 0BBE;0BC7 0334 0BBE;
+0CBF 0334 0CD5;0CBF 0334 0CD5;0CBF 0334 0CD5;0CBF 0334 0CD5;0CBF 0334 0CD5;
+0CC6 0334 0CC2;0CC6 0334 0CC2;0CC6 0334 0CC2;0CC6 0334 0CC2;0CC6 0334 0CC2;
+0CC6 0334 0CD5;0CC6 0334 0CD5;0CC6 0334 0CD5;0CC6 0334 0CD5;0CC6 0334 0CD5;
+0CC6 0334 0CD6;0CC6 0334 0CD6;0CC6 0334 0CD6;0CC6 0334 0CD6;0CC6 0334 0CD6;
+0CCA 0334 0CD5;0CCA 0334 0CD5;0CC6 0CC2 0334 0CD5;0CCA 0334 0CD5;0CC6 0CC2 0334 0CD5;
+0D46 0334 0D3E;0D46 0334 0D3E;0D46 0334 0D3E;0D46 0334 0D3E;0D46 0334 0D3E;
+0D46 0334 0D57;0D46 0334 0D57;0D46 0334 0D57;0D46 0334 0D57;0D46 0334 0D57;
+0D47 0334 0D3E;0D47 0334 0D3E;0D47 0334 0D3E;0D47 0334 0D3E;0D47 0334 0D3E;
+0DD9 0334 0DCF;0DD9 0334 0DCF;0DD9 0334 0DCF;0DD9 0334 0DCF;0DD9 0334 0DCF;
+0DD9 0334 0DDF;0DD9 0334 0DDF;0DD9 0334 0DDF;0DD9 0334 0DDF;0DD9 0334 0DDF;
+0F40 0334 0FB5;0F40 0334 0FB5;0F40 0334 0FB5;0F40 0334 0FB5;0F40 0334 0FB5;
+0F42 0334 0FB7;0F42 0334 0FB7;0F42 0334 0FB7;0F42 0334 0FB7;0F42 0334 0FB7;
+0F4C 0334 0FB7;0F4C 0334 0FB7;0F4C 0334 0FB7;0F4C 0334 0FB7;0F4C 0334 0FB7;
+0F51 0334 0FB7;0F51 0334 0FB7;0F51 0334 0FB7;0F51 0334 0FB7;0F51 0334 0FB7;
+0F56 0334 0FB7;0F56 0334 0FB7;0F56 0334 0FB7;0F56 0334 0FB7;0F56 0334 0FB7;
+0F5B 0334 0FB7;0F5B 0334 0FB7;0F5B 0334 0FB7;0F5B 0334 0FB7;0F5B 0334 0FB7;
+0F90 0334 0FB5;0F90 0334 0FB5;0F90 0334 0FB5;0F90 0334 0FB5;0F90 0334 0FB5;
+0F92 0334 0FB7;0F92 0334 0FB7;0F92 0334 0FB7;0F92 0334 0FB7;0F92 0334 0FB7;
+0F9C 0334 0FB7;0F9C 0334 0FB7;0F9C 0334 0FB7;0F9C 0334 0FB7;0F9C 0334 0FB7;
+0FA1 0334 0FB7;0FA1 0334 0FB7;0FA1 0334 0FB7;0FA1 0334 0FB7;0FA1 0334 0FB7;
+0FA6 0334 0FB7;0FA6 0334 0FB7;0FA6 0334 0FB7;0FA6 0334 0FB7;0FA6 0334 0FB7;
+0FAB 0334 0FB7;0FAB 0334 0FB7;0FAB 0334 0FB7;0FAB 0334 0FB7;0FAB 0334 0FB7;
+1025 0334 102E;1025 0334 102E;1025 0334 102E;1025 0334 102E;1025 0334 102E;
+1100 0334 1161;1100 0334 1161;1100 0334 1161;1100 0334 1161;1100 0334 1161;
+1100 0334 116E;1100 0334 116E;1100 0334 116E;1100 0334 116E;1100 0334 116E;
+1101 0334 1166;1101 0334 1166;1101 0334 1166;1101 0334 1166;1101 0334 1166;
+1101 0334 1173;1101 0334 1173;1101 0334 1173;1101 0334 1173;1101 0334 1173;
+1102 0334 116B;1102 0334 116B;1102 0334 116B;1102 0334 116B;1102 0334 116B;
+1103 0334 1163;1103 0334 1163;1103 0334 1163;1103 0334 1163;1103 0334 1163;
+1103 0334 1170;1103 0334 1170;1103 0334 1170;1103 0334 1170;1103 0334 1170;
+1104 0334 1168;1104 0334 1168;1104 0334 1168;1104 0334 1168;1104 0334 1168;
+1104 0334 1175;1104 0334 1175;1104 0334 1175;1104 0334 1175;1104 0334 1175;
+1105 0334 116D;1105 0334 116D;1105 0334 116D;1105 0334 116D;1105 0334 116D;
+1106 0334 1165;1106 0334 1165;1106 0334 1165;1106 0334 1165;1106 0334 1165;
+1106 0334 1172;1106 0334 1172;1106 0334 1172;1106 0334 1172;1106 0334 1172;
+1107 0334 116A;1107 0334 116A;1107 0334 116A;1107 0334 116A;1107 0334 116A;
+1108 0334 1162;1108 0334 1162;1108 0334 1162;1108 0334 1162;1108 0334 1162;
+1108 0334 116F;1108 0334 116F;1108 0334 116F;1108 0334 116F;1108 0334 116F;
+1109 0334 1167;1109 0334 1167;1109 0334 1167;1109 0334 1167;1109 0334 1167;
+1109 0334 1174;1109 0334 1174;1109 0334 1174;1109 0334 1174;1109 0334 1174;
+110A 0334 116C;110A 0334 116C;110A 0334 116C;110A 0334 116C;110A 0334 116C;
+110B 0334 1164;110B 0334 1164;110B 0334 1164;110B 0334 1164;110B 0334 1164;
+110B 0334 1171;110B 0334 1171;110B 0334 1171;110B 0334 1171;110B 0334 1171;
+110C 0334 1169;110C 0334 1169;110C 0334 1169;110C 0334 1169;110C 0334 1169;
+110D 0334 1161;110D 0334 1161;110D 0334 1161;110D 0334 1161;110D 0334 1161;
+110D 0334 116E;110D 0334 116E;110D 0334 116E;110D 0334 116E;110D 0334 116E;
+110E 0334 1166;110E 0334 1166;110E 0334 1166;110E 0334 1166;110E 0334 1166;
+110E 0334 1173;110E 0334 1173;110E 0334 1173;110E 0334 1173;110E 0334 1173;
+110F 0334 116B;110F 0334 116B;110F 0334 116B;110F 0334 116B;110F 0334 116B;
+1110 0334 1163;1110 0334 1163;1110 0334 1163;1110 0334 1163;1110 0334 1163;
+1110 0334 1170;1110 0334 1170;1110 0334 1170;1110 0334 1170;1110 0334 1170;
+1111 0334 1168;1111 0334 1168;1111 0334 1168;1111 0334 1168;1111 0334 1168;
+1111 0334 1175;1111 0334 1175;1111 0334 1175;1111 0334 1175;1111 0334 1175;
+1112 0334 116D;1112 0334 116D;1112 0334 116D;1112 0334 116D;1112 0334 116D;
+1B05 0334 1B35;1B05 0334 1B35;1B05 0334 1B35;1B05 0334 1B35;1B05 0334 1B35;
+1B07 0334 1B35;1B07 0334 1B35;1B07 0334 1B35;1B07 0334 1B35;1B07 0334 1B35;
+1B09 0334 1B35;1B09 0334 1B35;1B09 0334 1B35;1B09 0334 1B35;1B09 0334 1B35;
+1B0B 0334 1B35;1B0B 0334 1B35;1B0B 0334 1B35;1B0B 0334 1B35;1B0B 0334 1B35;
+1B0D 0334 1B35;1B0D 0334 1B35;1B0D 0334 1B35;1B0D 0334 1B35;1B0D 0334 1B35;
+1B11 0334 1B35;1B11 0334 1B35;1B11 0334 1B35;1B11 0334 1B35;1B11 0334 1B35;
+1B3A 0334 1B35;1B3A 0334 1B35;1B3A 0334 1B35;1B3A 0334 1B35;1B3A 0334 1B35;
+1B3C 0334 1B35;1B3C 0334 1B35;1B3C 0334 1B35;1B3C 0334 1B35;1B3C 0334 1B35;
+1B3E 0334 1B35;1B3E 0334 1B35;1B3E 0334 1B35;1B3E 0334 1B35;1B3E 0334 1B35;
+1B3F 0334 1B35;1B3F 0334 1B35;1B3F 0334 1B35;1B3F 0334 1B35;1B3F 0334 1B35;
+1B42 0334 1B35;1B42 0334 1B35;1B42 0334 1B35;1B42 0334 1B35;1B42 0334 1B35;
+AC54 0334 11AE;AC54 0334 11AE;1100 1164 0334 11AE;AC54 0334 11AE;1100 1164 0334 11AE;
+ACA8 0334 11B5;ACA8 0334 11B5;1100 1167 0334 11B5;ACA8 0334 11B5;1100 1167 0334 11B5;
+ACFC 0334 11BC;ACFC 0334 11BC;1100 116A 0334 11BC;ACFC 0334 11BC;1100 116A 0334 11BC;
+ADC0 0334 11AE;ADC0 0334 11AE;1100 1171 0334 11AE;ADC0 0334 11AE;1100 1171 0334 11AE;
+AE14 0334 11B5;AE14 0334 11B5;1100 1174 0334 11B5;AE14 0334 11B5;1100 1174 0334 11B5;
+AE68 0334 11BC;AE68 0334 11BC;1101 1162 0334 11BC;AE68 0334 11BC;1101 1162 0334 11BC;
+AF2C 0334 11AE;AF2C 0334 11AE;1101 1169 0334 11AE;AF2C 0334 11AE;1101 1169 0334 11AE;
+AF80 0334 11B5;AF80 0334 11B5;1101 116C 0334 11B5;AF80 0334 11B5;1101 116C 0334 11B5;
+AFD4 0334 11BC;AFD4 0334 11BC;1101 116F 0334 11BC;AFD4 0334 11BC;1101 116F 0334 11BC;
+B098 0334 11AE;B098 0334 11AE;1102 1161 0334 11AE;B098 0334 11AE;1102 1161 0334 11AE;
+B0EC 0334 11B5;B0EC 0334 11B5;1102 1164 0334 11B5;B0EC 0334 11B5;1102 1164 0334 11B5;
+B140 0334 11BC;B140 0334 11BC;1102 1167 0334 11BC;B140 0334 11BC;1102 1167 0334 11BC;
+B204 0334 11AE;B204 0334 11AE;1102 116E 0334 11AE;B204 0334 11AE;1102 116E 0334 11AE;
+B258 0334 11B5;B258 0334 11B5;1102 1171 0334 11B5;B258 0334 11B5;1102 1171 0334 11B5;
+B2AC 0334 11BC;B2AC 0334 11BC;1102 1174 0334 11BC;B2AC 0334 11BC;1102 1174 0334 11BC;
+B370 0334 11AE;B370 0334 11AE;1103 1166 0334 11AE;B370 0334 11AE;1103 1166 0334 11AE;
+B3C4 0334 11B5;B3C4 0334 11B5;1103 1169 0334 11B5;B3C4 0334 11B5;1103 1169 0334 11B5;
+B418 0334 11BC;B418 0334 11BC;1103 116C 0334 11BC;B418 0334 11BC;1103 116C 0334 11BC;
+B4DC 0334 11AE;B4DC 0334 11AE;1103 1173 0334 11AE;B4DC 0334 11AE;1103 1173 0334 11AE;
+B530 0334 11B5;B530 0334 11B5;1104 1161 0334 11B5;B530 0334 11B5;1104 1161 0334 11B5;
+B584 0334 11BC;B584 0334 11BC;1104 1164 0334 11BC;B584 0334 11BC;1104 1164 0334 11BC;
+B648 0334 11AE;B648 0334 11AE;1104 116B 0334 11AE;B648 0334 11AE;1104 116B 0334 11AE;
+B69C 0334 11B5;B69C 0334 11B5;1104 116E 0334 11B5;B69C 0334 11B5;1104 116E 0334 11B5;
+B6F0 0334 11BC;B6F0 0334 11BC;1104 1171 0334 11BC;B6F0 0334 11BC;1104 1171 0334 11BC;
+B7B4 0334 11AE;B7B4 0334 11AE;1105 1163 0334 11AE;B7B4 0334 11AE;1105 1163 0334 11AE;
+B808 0334 11B5;B808 0334 11B5;1105 1166 0334 11B5;B808 0334 11B5;1105 1166 0334 11B5;
+B85C 0334 11BC;B85C 0334 11BC;1105 1169 0334 11BC;B85C 0334 11BC;1105 1169 0334 11BC;
+B920 0334 11AE;B920 0334 11AE;1105 1170 0334 11AE;B920 0334 11AE;1105 1170 0334 11AE;
+B974 0334 11B5;B974 0334 11B5;1105 1173 0334 11B5;B974 0334 11B5;1105 1173 0334 11B5;
+B9C8 0334 11BC;B9C8 0334 11BC;1106 1161 0334 11BC;B9C8 0334 11BC;1106 1161 0334 11BC;
+BA8C 0334 11AE;BA8C 0334 11AE;1106 1168 0334 11AE;BA8C 0334 11AE;1106 1168 0334 11AE;
+BAE0 0334 11B5;BAE0 0334 11B5;1106 116B 0334 11B5;BAE0 0334 11B5;1106 116B 0334 11B5;
+BB34 0334 11BC;BB34 0334 11BC;1106 116E 0334 11BC;BB34 0334 11BC;1106 116E 0334 11BC;
+BBF8 0334 11AE;BBF8 0334 11AE;1106 1175 0334 11AE;BBF8 0334 11AE;1106 1175 0334 11AE;
+BC4C 0334 11B5;BC4C 0334 11B5;1107 1163 0334 11B5;BC4C 0334 11B5;1107 1163 0334 11B5;
+BCA0 0334 11BC;BCA0 0334 11BC;1107 1166 0334 11BC;BCA0 0334 11BC;1107 1166 0334 11BC;
+BD64 0334 11AE;BD64 0334 11AE;1107 116D 0334 11AE;BD64 0334 11AE;1107 116D 0334 11AE;
+BDB8 0334 11B5;BDB8 0334 11B5;1107 1170 0334 11B5;BDB8 0334 11B5;1107 1170 0334 11B5;
+BE0C 0334 11BC;BE0C 0334 11BC;1107 1173 0334 11BC;BE0C 0334 11BC;1107 1173 0334 11BC;
+BED0 0334 11AE;BED0 0334 11AE;1108 1165 0334 11AE;BED0 0334 11AE;1108 1165 0334 11AE;
+BF24 0334 11B5;BF24 0334 11B5;1108 1168 0334 11B5;BF24 0334 11B5;1108 1168 0334 11B5;
+BF78 0334 11BC;BF78 0334 11BC;1108 116B 0334 11BC;BF78 0334 11BC;1108 116B 0334 11BC;
+C03C 0334 11AE;C03C 0334 11AE;1108 1172 0334 11AE;C03C 0334 11AE;1108 1172 0334 11AE;
+C090 0334 11B5;C090 0334 11B5;1108 1175 0334 11B5;C090 0334 11B5;1108 1175 0334 11B5;
+C0E4 0334 11BC;C0E4 0334 11BC;1109 1163 0334 11BC;C0E4 0334 11BC;1109 1163 0334 11BC;
+C1A8 0334 11AE;C1A8 0334 11AE;1109 116A 0334 11AE;C1A8 0334 11AE;1109 116A 0334 11AE;
+C1FC 0334 11B5;C1FC 0334 11B5;1109 116D 0334 11B5;C1FC 0334 11B5;1109 116D 0334 11B5;
+C250 0334 11BC;C250 0334 11BC;1109 1170 0334 11BC;C250 0334 11BC;1109 1170 0334 11BC;
+C314 0334 11AE;C314 0334 11AE;110A 1162 0334 11AE;C314 0334 11AE;110A 1162 0334 11AE;
+C368 0334 11B5;C368 0334 11B5;110A 1165 0334 11B5;C368 0334 11B5;110A 1165 0334 11B5;
+C3BC 0334 11BC;C3BC 0334 11BC;110A 1168 0334 11BC;C3BC 0334 11BC;110A 1168 0334 11BC;
+C480 0334 11AE;C480 0334 11AE;110A 116F 0334 11AE;C480 0334 11AE;110A 116F 0334 11AE;
+C4D4 0334 11B5;C4D4 0334 11B5;110A 1172 0334 11B5;C4D4 0334 11B5;110A 1172 0334 11B5;
+C528 0334 11BC;C528 0334 11BC;110A 1175 0334 11BC;C528 0334 11BC;110A 1175 0334 11BC;
+C5EC 0334 11AE;C5EC 0334 11AE;110B 1167 0334 11AE;C5EC 0334 11AE;110B 1167 0334 11AE;
+C640 0334 11B5;C640 0334 11B5;110B 116A 0334 11B5;C640 0334 11B5;110B 116A 0334 11B5;
+C694 0334 11BC;C694 0334 11BC;110B 116D 0334 11BC;C694 0334 11BC;110B 116D 0334 11BC;
+C758 0334 11AE;C758 0334 11AE;110B 1174 0334 11AE;C758 0334 11AE;110B 1174 0334 11AE;
+C7AC 0334 11B5;C7AC 0334 11B5;110C 1162 0334 11B5;C7AC 0334 11B5;110C 1162 0334 11B5;
+C800 0334 11BC;C800 0334 11BC;110C 1165 0334 11BC;C800 0334 11BC;110C 1165 0334 11BC;
+C8C4 0334 11AE;C8C4 0334 11AE;110C 116C 0334 11AE;C8C4 0334 11AE;110C 116C 0334 11AE;
+C918 0334 11B5;C918 0334 11B5;110C 116F 0334 11B5;C918 0334 11B5;110C 116F 0334 11B5;
+C96C 0334 11BC;C96C 0334 11BC;110C 1172 0334 11BC;C96C 0334 11BC;110C 1172 0334 11BC;
+CA30 0334 11AE;CA30 0334 11AE;110D 1164 0334 11AE;CA30 0334 11AE;110D 1164 0334 11AE;
+CA84 0334 11B5;CA84 0334 11B5;110D 1167 0334 11B5;CA84 0334 11B5;110D 1167 0334 11B5;
+CAD8 0334 11BC;CAD8 0334 11BC;110D 116A 0334 11BC;CAD8 0334 11BC;110D 116A 0334 11BC;
+CB9C 0334 11AE;CB9C 0334 11AE;110D 1171 0334 11AE;CB9C 0334 11AE;110D 1171 0334 11AE;
+CBF0 0334 11B5;CBF0 0334 11B5;110D 1174 0334 11B5;CBF0 0334 11B5;110D 1174 0334 11B5;
+CC44 0334 11BC;CC44 0334 11BC;110E 1162 0334 11BC;CC44 0334 11BC;110E 1162 0334 11BC;
+CD08 0334 11AE;CD08 0334 11AE;110E 1169 0334 11AE;CD08 0334 11AE;110E 1169 0334 11AE;
+CD5C 0334 11B5;CD5C 0334 11B5;110E 116C 0334 11B5;CD5C 0334 11B5;110E 116C 0334 11B5;
+CDB0 0334 11BC;CDB0 0334 11BC;110E 116F 0334 11BC;CDB0 0334 11BC;110E 116F 0334 11BC;
+CE74 0334 11AE;CE74 0334 11AE;110F 1161 0334 11AE;CE74 0334 11AE;110F 1161 0334 11AE;
+CEC8 0334 11B5;CEC8 0334 11B5;110F 1164 0334 11B5;CEC8 0334 11B5;110F 1164 0334 11B5;
+CF1C 0334 11BC;CF1C 0334 11BC;110F 1167 0334 11BC;CF1C 0334 11BC;110F 1167 0334 11BC;
+CFE0 0334 11AE;CFE0 0334 11AE;110F 116E 0334 11AE;CFE0 0334 11AE;110F 116E 0334 11AE;
+D034 0334 11B5;D034 0334 11B5;110F 1171 0334 11B5;D034 0334 11B5;110F 1171 0334 11B5;
+D088 0334 11BC;D088 0334 11BC;110F 1174 0334 11BC;D088 0334 11BC;110F 1174 0334 11BC;
+D14C 0334 11AE;D14C 0334 11AE;1110 1166 0334 11AE;D14C 0334 11AE;1110 1166 0334 11AE;
+D1A0 0334 11B5;D1A0 0334 11B5;1110 1169 0334 11B5;D1A0 0334 11B5;1110 1169 0334 11B5;
+D1F4 0334 11BC;D1F4 0334 11BC;1110 116C 0334 11BC;D1F4 0334 11BC;1110 116C 0334 11BC;
+D2B8 0334 11AE;D2B8 0334 11AE;1110 1173 0334 11AE;D2B8 0334 11AE;1110 1173 0334 11AE;
+D30C 0334 11B5;D30C 0334 11B5;1111 1161 0334 11B5;D30C 0334 11B5;1111 1161 0334 11B5;
+D360 0334 11BC;D360 0334 11BC;1111 1164 0334 11BC;D360 0334 11BC;1111 1164 0334 11BC;
+D424 0334 11AE;D424 0334 11AE;1111 116B 0334 11AE;D424 0334 11AE;1111 116B 0334 11AE;
+D478 0334 11B5;D478 0334 11B5;1111 116E 0334 11B5;D478 0334 11B5;1111 116E 0334 11B5;
+D4CC 0334 11BC;D4CC 0334 11BC;1111 1171 0334 11BC;D4CC 0334 11BC;1111 1171 0334 11BC;
+D590 0334 11AE;D590 0334 11AE;1112 1163 0334 11AE;D590 0334 11AE;1112 1163 0334 11AE;
+D5E4 0334 11B5;D5E4 0334 11B5;1112 1166 0334 11B5;D5E4 0334 11B5;1112 1166 0334 11B5;
+D638 0334 11BC;D638 0334 11BC;1112 1169 0334 11BC;D638 0334 11BC;1112 1169 0334 11BC;
+D6FC 0334 11AE;D6FC 0334 11AE;1112 1170 0334 11AE;D6FC 0334 11AE;1112 1170 0334 11AE;
+D750 0334 11B5;D750 0334 11B5;1112 1173 0334 11B5;D750 0334 11B5;1112 1173 0334 11B5;
+
+
diff --git a/gnulib/tests/uninorm/test-canonical-decomposition.c b/gnulib/tests/uninorm/test-canonical-decomposition.c
new file mode 100644
index 00000000..f97bc443
--- /dev/null
+++ b/gnulib/tests/uninorm/test-canonical-decomposition.c
@@ -0,0 +1,143 @@
+/* Test of canonical decomposition of Unicode characters.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int ret;
+
+ /* SPACE */
+ ret = uc_canonical_decomposition (0x0020, decomposed);
+ ASSERT (ret == -1);
+
+ /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ ret = uc_canonical_decomposition (0x00C4, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x0041);
+ ASSERT (decomposed[1] == 0x0308);
+
+ /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ ret = uc_canonical_decomposition (0x01DE, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x00C4);
+ ASSERT (decomposed[1] == 0x0304);
+
+ /* GREEK DIALYTIKA AND PERISPOMENI */
+ ret = uc_canonical_decomposition (0x1FC1, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x00A8);
+ ASSERT (decomposed[1] == 0x0342);
+
+ /* SCRIPT SMALL L */
+ ret = uc_canonical_decomposition (0x2113, decomposed);
+ ASSERT (ret == -1);
+
+ /* NO-BREAK SPACE */
+ ret = uc_canonical_decomposition (0x00A0, decomposed);
+ ASSERT (ret == -1);
+
+ /* ARABIC LETTER VEH INITIAL FORM */
+ ret = uc_canonical_decomposition (0xFB6C, decomposed);
+ ASSERT (ret == -1);
+
+ /* ARABIC LETTER VEH MEDIAL FORM */
+ ret = uc_canonical_decomposition (0xFB6D, decomposed);
+ ASSERT (ret == -1);
+
+ /* ARABIC LETTER VEH FINAL FORM */
+ ret = uc_canonical_decomposition (0xFB6B, decomposed);
+ ASSERT (ret == -1);
+
+ /* ARABIC LETTER VEH ISOLATED FORM */
+ ret = uc_canonical_decomposition (0xFB6A, decomposed);
+ ASSERT (ret == -1);
+
+ /* CIRCLED NUMBER FIFTEEN */
+ ret = uc_canonical_decomposition (0x246E, decomposed);
+ ASSERT (ret == -1);
+
+ /* TRADE MARK SIGN */
+ ret = uc_canonical_decomposition (0x2122, decomposed);
+ ASSERT (ret == -1);
+
+ /* LATIN SUBSCRIPT SMALL LETTER I */
+ ret = uc_canonical_decomposition (0x1D62, decomposed);
+ ASSERT (ret == -1);
+
+ /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ ret = uc_canonical_decomposition (0xFE35, decomposed);
+ ASSERT (ret == -1);
+
+ /* FULLWIDTH LATIN CAPITAL LETTER A */
+ ret = uc_canonical_decomposition (0xFF21, decomposed);
+ ASSERT (ret == -1);
+
+ /* HALFWIDTH IDEOGRAPHIC COMMA */
+ ret = uc_canonical_decomposition (0xFF64, decomposed);
+ ASSERT (ret == -1);
+
+ /* SMALL IDEOGRAPHIC COMMA */
+ ret = uc_canonical_decomposition (0xFE51, decomposed);
+ ASSERT (ret == -1);
+
+ /* SQUARE MHZ */
+ ret = uc_canonical_decomposition (0x3392, decomposed);
+ ASSERT (ret == -1);
+
+ /* VULGAR FRACTION THREE EIGHTHS */
+ ret = uc_canonical_decomposition (0x215C, decomposed);
+ ASSERT (ret == -1);
+
+ /* MICRO SIGN */
+ ret = uc_canonical_decomposition (0x00B5, decomposed);
+ ASSERT (ret == -1);
+
+ /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ ret = uc_canonical_decomposition (0xFDFA, decomposed);
+ ASSERT (ret == -1);
+
+ /* HANGUL SYLLABLE GEUL */
+ ret = uc_canonical_decomposition (0xAE00, decomposed);
+ /* See the clarification at <http://www.unicode.org/versions/Unicode5.1.0/>,
+ section "Clarification of Hangul Jamo Handling". */
+#if 1
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0xADF8);
+ ASSERT (decomposed[1] == 0x11AF);
+#else
+ ASSERT (ret == 3);
+ ASSERT (decomposed[0] == 0x1100);
+ ASSERT (decomposed[1] == 0x1173);
+ ASSERT (decomposed[2] == 0x11AF);
+#endif
+
+ /* HANGUL SYLLABLE GEU */
+ ret = uc_canonical_decomposition (0xADF8, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x1100);
+ ASSERT (decomposed[1] == 0x1173);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-compat-decomposition.c b/gnulib/tests/uninorm/test-compat-decomposition.c
new file mode 100644
index 00000000..eeda95bc
--- /dev/null
+++ b/gnulib/tests/uninorm/test-compat-decomposition.c
@@ -0,0 +1,184 @@
+/* Test of compatibility decomposition of Unicode characters.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm/decompose-internal.h"
+
+#include "uninorm.h"
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int ret;
+
+ /* SPACE */
+ ret = uc_compat_decomposition (0x0020, decomposed);
+ ASSERT (ret == -1);
+
+ /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ ret = uc_compat_decomposition (0x00C4, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x0041);
+ ASSERT (decomposed[1] == 0x0308);
+
+ /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ ret = uc_compat_decomposition (0x01DE, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x00C4);
+ ASSERT (decomposed[1] == 0x0304);
+
+ /* GREEK DIALYTIKA AND PERISPOMENI */
+ ret = uc_compat_decomposition (0x1FC1, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x00A8);
+ ASSERT (decomposed[1] == 0x0342);
+
+ /* SCRIPT SMALL L */
+ ret = uc_compat_decomposition (0x2113, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x006C);
+
+ /* NO-BREAK SPACE */
+ ret = uc_compat_decomposition (0x00A0, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x0020);
+
+ /* ARABIC LETTER VEH INITIAL FORM */
+ ret = uc_compat_decomposition (0xFB6C, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x06A4);
+
+ /* ARABIC LETTER VEH MEDIAL FORM */
+ ret = uc_compat_decomposition (0xFB6D, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x06A4);
+
+ /* ARABIC LETTER VEH FINAL FORM */
+ ret = uc_compat_decomposition (0xFB6B, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x06A4);
+
+ /* ARABIC LETTER VEH ISOLATED FORM */
+ ret = uc_compat_decomposition (0xFB6A, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x06A4);
+
+ /* CIRCLED NUMBER FIFTEEN */
+ ret = uc_compat_decomposition (0x246E, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x0031);
+ ASSERT (decomposed[1] == 0x0035);
+
+ /* TRADE MARK SIGN */
+ ret = uc_compat_decomposition (0x2122, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x0054);
+ ASSERT (decomposed[1] == 0x004D);
+
+ /* LATIN SUBSCRIPT SMALL LETTER I */
+ ret = uc_compat_decomposition (0x1D62, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x0069);
+
+ /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ ret = uc_compat_decomposition (0xFE35, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x0028);
+
+ /* FULLWIDTH LATIN CAPITAL LETTER A */
+ ret = uc_compat_decomposition (0xFF21, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x0041);
+
+ /* HALFWIDTH IDEOGRAPHIC COMMA */
+ ret = uc_compat_decomposition (0xFF64, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x3001);
+
+ /* SMALL IDEOGRAPHIC COMMA */
+ ret = uc_compat_decomposition (0xFE51, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x3001);
+
+ /* SQUARE MHZ */
+ ret = uc_compat_decomposition (0x3392, decomposed);
+ ASSERT (ret == 3);
+ ASSERT (decomposed[0] == 0x004D);
+ ASSERT (decomposed[1] == 0x0048);
+ ASSERT (decomposed[2] == 0x007A);
+
+ /* VULGAR FRACTION THREE EIGHTHS */
+ ret = uc_compat_decomposition (0x215C, decomposed);
+ ASSERT (ret == 3);
+ ASSERT (decomposed[0] == 0x0033);
+ ASSERT (decomposed[1] == 0x2044);
+ ASSERT (decomposed[2] == 0x0038);
+
+ /* MICRO SIGN */
+ ret = uc_compat_decomposition (0x00B5, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (decomposed[0] == 0x03BC);
+
+ /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ ret = uc_compat_decomposition (0xFDFA, decomposed);
+ ASSERT (ret == 18);
+ ASSERT (decomposed[0] == 0x0635);
+ ASSERT (decomposed[1] == 0x0644);
+ ASSERT (decomposed[2] == 0x0649);
+ ASSERT (decomposed[3] == 0x0020);
+ ASSERT (decomposed[4] == 0x0627);
+ ASSERT (decomposed[5] == 0x0644);
+ ASSERT (decomposed[6] == 0x0644);
+ ASSERT (decomposed[7] == 0x0647);
+ ASSERT (decomposed[8] == 0x0020);
+ ASSERT (decomposed[9] == 0x0639);
+ ASSERT (decomposed[10] == 0x0644);
+ ASSERT (decomposed[11] == 0x064A);
+ ASSERT (decomposed[12] == 0x0647);
+ ASSERT (decomposed[13] == 0x0020);
+ ASSERT (decomposed[14] == 0x0648);
+ ASSERT (decomposed[15] == 0x0633);
+ ASSERT (decomposed[16] == 0x0644);
+ ASSERT (decomposed[17] == 0x0645);
+
+ /* HANGUL SYLLABLE GEUL */
+ ret = uc_compat_decomposition (0xAE00, decomposed);
+ /* See the clarification at <http://www.unicode.org/versions/Unicode5.1.0/>,
+ section "Clarification of Hangul Jamo Handling". */
+#if 1
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0xADF8);
+ ASSERT (decomposed[1] == 0x11AF);
+#else
+ ASSERT (ret == 3);
+ ASSERT (decomposed[0] == 0x1100);
+ ASSERT (decomposed[1] == 0x1173);
+ ASSERT (decomposed[2] == 0x11AF);
+#endif
+
+ /* HANGUL SYLLABLE GEU */
+ ret = uc_compat_decomposition (0xADF8, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (decomposed[0] == 0x1100);
+ ASSERT (decomposed[1] == 0x1173);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-composition.c b/gnulib/tests/uninorm/test-composition.c
new file mode 100644
index 00000000..bd089e6d
--- /dev/null
+++ b/gnulib/tests/uninorm/test-composition.c
@@ -0,0 +1,53 @@
+/* Test of canonical composition of Unicode characters.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ ASSERT (uc_composition (0x0041, 0x0308) == 0x00C4);
+
+ /* LATIN CAPITAL LETTER A WITH RING ABOVE */
+ ASSERT (uc_composition (0x0041, 0x030A) == 0x00C5);
+
+ /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ ASSERT (uc_composition (0x00C4, 0x0304) == 0x01DE);
+
+ /* GREEK DIALYTIKA AND PERISPOMENI */
+ ASSERT (uc_composition (0x00A8, 0x0342) == 0x1FC1);
+
+ /* CIRCLED NUMBER FIFTEEN */
+ ASSERT (uc_composition (0x0031, 0x0035) == 0);
+
+ /* TRADE MARK SIGN */
+ ASSERT (uc_composition (0x0054, 0x004D) == 0);
+
+ /* HANGUL SYLLABLE GEU */
+ ASSERT (uc_composition (0x1100, 0x1173) == 0xADF8);
+
+ /* HANGUL SYLLABLE GEUL */
+ ASSERT (uc_composition (0xADF8, 0x11AF) == 0xAE00);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-decomposing-form.c b/gnulib/tests/uninorm/test-decomposing-form.c
new file mode 100644
index 00000000..6a1b7c41
--- /dev/null
+++ b/gnulib/tests/uninorm/test-decomposing-form.c
@@ -0,0 +1,34 @@
+/* Test of decomposing variant of a normalization form.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ASSERT (uninorm_decomposing_form (UNINORM_NFC) == UNINORM_NFD);
+ ASSERT (uninorm_decomposing_form (UNINORM_NFD) == UNINORM_NFD);
+ ASSERT (uninorm_decomposing_form (UNINORM_NFKC) == UNINORM_NFKD);
+ ASSERT (uninorm_decomposing_form (UNINORM_NFKD) == UNINORM_NFKD);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-decomposition.c b/gnulib/tests/uninorm/test-decomposition.c
new file mode 100644
index 00000000..3cef3939
--- /dev/null
+++ b/gnulib/tests/uninorm/test-decomposition.c
@@ -0,0 +1,207 @@
+/* Test of decomposition of Unicode characters.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int tag;
+ int ret;
+
+ /* SPACE */
+ ret = uc_decomposition (0x0020, &tag, decomposed);
+ ASSERT (ret == -1);
+
+ /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ ret = uc_decomposition (0x00C4, &tag, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (tag == UC_DECOMP_CANONICAL);
+ ASSERT (decomposed[0] == 0x0041);
+ ASSERT (decomposed[1] == 0x0308);
+
+ /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ ret = uc_decomposition (0x01DE, &tag, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (tag == UC_DECOMP_CANONICAL);
+ ASSERT (decomposed[0] == 0x00C4);
+ ASSERT (decomposed[1] == 0x0304);
+
+ /* GREEK DIALYTIKA AND PERISPOMENI */
+ ret = uc_decomposition (0x1FC1, &tag, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (tag == UC_DECOMP_CANONICAL);
+ ASSERT (decomposed[0] == 0x00A8);
+ ASSERT (decomposed[1] == 0x0342);
+
+ /* SCRIPT SMALL L */
+ ret = uc_decomposition (0x2113, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_FONT);
+ ASSERT (decomposed[0] == 0x006C);
+
+ /* NO-BREAK SPACE */
+ ret = uc_decomposition (0x00A0, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_NOBREAK);
+ ASSERT (decomposed[0] == 0x0020);
+
+ /* ARABIC LETTER VEH INITIAL FORM */
+ ret = uc_decomposition (0xFB6C, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_INITIAL);
+ ASSERT (decomposed[0] == 0x06A4);
+
+ /* ARABIC LETTER VEH MEDIAL FORM */
+ ret = uc_decomposition (0xFB6D, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_MEDIAL);
+ ASSERT (decomposed[0] == 0x06A4);
+
+ /* ARABIC LETTER VEH FINAL FORM */
+ ret = uc_decomposition (0xFB6B, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_FINAL);
+ ASSERT (decomposed[0] == 0x06A4);
+
+ /* ARABIC LETTER VEH ISOLATED FORM */
+ ret = uc_decomposition (0xFB6A, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_ISOLATED);
+ ASSERT (decomposed[0] == 0x06A4);
+
+ /* CIRCLED NUMBER FIFTEEN */
+ ret = uc_decomposition (0x246E, &tag, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (tag == UC_DECOMP_CIRCLE);
+ ASSERT (decomposed[0] == 0x0031);
+ ASSERT (decomposed[1] == 0x0035);
+
+ /* TRADE MARK SIGN */
+ ret = uc_decomposition (0x2122, &tag, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (tag == UC_DECOMP_SUPER);
+ ASSERT (decomposed[0] == 0x0054);
+ ASSERT (decomposed[1] == 0x004D);
+
+ /* LATIN SUBSCRIPT SMALL LETTER I */
+ ret = uc_decomposition (0x1D62, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_SUB);
+ ASSERT (decomposed[0] == 0x0069);
+
+ /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ ret = uc_decomposition (0xFE35, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_VERTICAL);
+ ASSERT (decomposed[0] == 0x0028);
+
+ /* FULLWIDTH LATIN CAPITAL LETTER A */
+ ret = uc_decomposition (0xFF21, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_WIDE);
+ ASSERT (decomposed[0] == 0x0041);
+
+ /* HALFWIDTH IDEOGRAPHIC COMMA */
+ ret = uc_decomposition (0xFF64, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_NARROW);
+ ASSERT (decomposed[0] == 0x3001);
+
+ /* SMALL IDEOGRAPHIC COMMA */
+ ret = uc_decomposition (0xFE51, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_SMALL);
+ ASSERT (decomposed[0] == 0x3001);
+
+ /* SQUARE MHZ */
+ ret = uc_decomposition (0x3392, &tag, decomposed);
+ ASSERT (ret == 3);
+ ASSERT (tag == UC_DECOMP_SQUARE);
+ ASSERT (decomposed[0] == 0x004D);
+ ASSERT (decomposed[1] == 0x0048);
+ ASSERT (decomposed[2] == 0x007A);
+
+ /* VULGAR FRACTION THREE EIGHTHS */
+ ret = uc_decomposition (0x215C, &tag, decomposed);
+ ASSERT (ret == 3);
+ ASSERT (tag == UC_DECOMP_FRACTION);
+ ASSERT (decomposed[0] == 0x0033);
+ ASSERT (decomposed[1] == 0x2044);
+ ASSERT (decomposed[2] == 0x0038);
+
+ /* MICRO SIGN */
+ ret = uc_decomposition (0x00B5, &tag, decomposed);
+ ASSERT (ret == 1);
+ ASSERT (tag == UC_DECOMP_COMPAT);
+ ASSERT (decomposed[0] == 0x03BC);
+
+ /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ ret = uc_decomposition (0xFDFA, &tag, decomposed);
+ ASSERT (ret == 18);
+ ASSERT (tag == UC_DECOMP_ISOLATED);
+ ASSERT (decomposed[0] == 0x0635);
+ ASSERT (decomposed[1] == 0x0644);
+ ASSERT (decomposed[2] == 0x0649);
+ ASSERT (decomposed[3] == 0x0020);
+ ASSERT (decomposed[4] == 0x0627);
+ ASSERT (decomposed[5] == 0x0644);
+ ASSERT (decomposed[6] == 0x0644);
+ ASSERT (decomposed[7] == 0x0647);
+ ASSERT (decomposed[8] == 0x0020);
+ ASSERT (decomposed[9] == 0x0639);
+ ASSERT (decomposed[10] == 0x0644);
+ ASSERT (decomposed[11] == 0x064A);
+ ASSERT (decomposed[12] == 0x0647);
+ ASSERT (decomposed[13] == 0x0020);
+ ASSERT (decomposed[14] == 0x0648);
+ ASSERT (decomposed[15] == 0x0633);
+ ASSERT (decomposed[16] == 0x0644);
+ ASSERT (decomposed[17] == 0x0645);
+
+ /* HANGUL SYLLABLE GEUL */
+ ret = uc_decomposition (0xAE00, &tag, decomposed);
+ /* See the clarification at <http://www.unicode.org/versions/Unicode5.1.0/>,
+ section "Clarification of Hangul Jamo Handling". */
+#if 1
+ ASSERT (ret == 2);
+ ASSERT (tag == UC_DECOMP_CANONICAL);
+ ASSERT (decomposed[0] == 0xADF8);
+ ASSERT (decomposed[1] == 0x11AF);
+#else
+ ASSERT (ret == 3);
+ ASSERT (tag == UC_DECOMP_CANONICAL);
+ ASSERT (decomposed[0] == 0x1100);
+ ASSERT (decomposed[1] == 0x1173);
+ ASSERT (decomposed[2] == 0x11AF);
+#endif
+
+ /* HANGUL SYLLABLE GEU */
+ ret = uc_decomposition (0xADF8, &tag, decomposed);
+ ASSERT (ret == 2);
+ ASSERT (tag == UC_DECOMP_CANONICAL);
+ ASSERT (decomposed[0] == 0x1100);
+ ASSERT (decomposed[1] == 0x1173);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-nfc.c b/gnulib/tests/uninorm/test-nfc.c
new file mode 100644
index 00000000..6fd86d84
--- /dev/null
+++ b/gnulib/tests/uninorm/test-nfc.c
@@ -0,0 +1,44 @@
+/* Test of canonical normalization of Unicode strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#if !WOE32DLL
+/* Check that UNINORM_NFC is defined and links. */
+uninorm_t n = UNINORM_NFC;
+#endif
+
+extern void test_u8_nfc (void);
+extern void test_u16_nfc (void);
+extern void test_u32_nfc (void);
+
+int
+main ()
+{
+ /* Check that UNINORM_NFC is defined and links. */
+ uninorm_t nf = UNINORM_NFC;
+ (void) nf;
+
+ test_u32_nfc ();
+ test_u16_nfc ();
+ test_u8_nfc ();
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-nfd.c b/gnulib/tests/uninorm/test-nfd.c
new file mode 100644
index 00000000..d89ba77d
--- /dev/null
+++ b/gnulib/tests/uninorm/test-nfd.c
@@ -0,0 +1,44 @@
+/* Test of canonical decomposition of Unicode strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#if !WOE32DLL
+/* Check that UNINORM_NFD is defined and links. */
+uninorm_t n = UNINORM_NFD;
+#endif
+
+extern void test_u8_nfd (void);
+extern void test_u16_nfd (void);
+extern void test_u32_nfd (void);
+
+int
+main ()
+{
+ /* Check that UNINORM_NFD is defined and links. */
+ uninorm_t nf = UNINORM_NFD;
+ (void) nf;
+
+ test_u32_nfd ();
+ test_u16_nfd ();
+ test_u8_nfd ();
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-nfkc.c b/gnulib/tests/uninorm/test-nfkc.c
new file mode 100644
index 00000000..68474a8b
--- /dev/null
+++ b/gnulib/tests/uninorm/test-nfkc.c
@@ -0,0 +1,44 @@
+/* Test of compatibility normalization of Unicode strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#if !WOE32DLL
+/* Check that UNINORM_NFKC is defined and links. */
+uninorm_t n = UNINORM_NFKC;
+#endif
+
+extern void test_u8_nfkc (void);
+extern void test_u16_nfkc (void);
+extern void test_u32_nfkc (void);
+
+int
+main ()
+{
+ /* Check that UNINORM_NFKC is defined and links. */
+ uninorm_t nf = UNINORM_NFKC;
+ (void) nf;
+
+ test_u32_nfkc ();
+ test_u16_nfkc ();
+ test_u8_nfkc ();
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-nfkd.c b/gnulib/tests/uninorm/test-nfkd.c
new file mode 100644
index 00000000..cb8a2dfd
--- /dev/null
+++ b/gnulib/tests/uninorm/test-nfkd.c
@@ -0,0 +1,44 @@
+/* Test of compatibility decomposition of Unicode strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#if !WOE32DLL
+/* Check that UNINORM_NFKD is defined and links. */
+uninorm_t n = UNINORM_NFKD;
+#endif
+
+extern void test_u8_nfkd (void);
+extern void test_u16_nfkd (void);
+extern void test_u32_nfkd (void);
+
+int
+main ()
+{
+ /* Check that UNINORM_NFKD is defined and links. */
+ uninorm_t nf = UNINORM_NFKD;
+ (void) nf;
+
+ test_u32_nfkd ();
+ test_u16_nfkd ();
+ test_u8_nfkd ();
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-u16-nfc.c b/gnulib/tests/uninorm/test-u16-nfc.c
new file mode 100644
index 00000000..5910de2f
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u16-nfc.c
@@ -0,0 +1,332 @@
+/* Test of canonical normalization of UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U16_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_normalize (UNINORM_NFC, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_normalize (UNINORM_NFC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_normalize (UNINORM_NFC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u16_nfc (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint16_t input[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint16_t input[] = { 0x00C4 };
+ static const uint16_t decomposed[] = { 0x0041, 0x0308 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint16_t input[] = { 0x01DE };
+ static const uint16_t decomposed[] = { 0x0041, 0x0308, 0x0304 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ANGSTROM SIGN */
+ static const uint16_t input[] = { 0x212B };
+ static const uint16_t decomposed[] = { 0x0041, 0x030A };
+ static const uint16_t expected[] = { 0x00C5 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint16_t input[] = { 0x1FC1 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint16_t input[] = { 0x2113 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint16_t input[] = { 0x00A0 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint16_t input[] = { 0xFB6C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint16_t input[] = { 0xFB6D };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint16_t input[] = { 0xFB6B };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint16_t input[] = { 0xFB6A };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint16_t input[] = { 0x246E };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint16_t input[] = { 0x2122 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint16_t input[] = { 0x1D62 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint16_t input[] = { 0xFE35 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint16_t input[] = { 0xFF21 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint16_t input[] = { 0xFF64 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint16_t input[] = { 0xFE51 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint16_t input[] = { 0x3392 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint16_t input[] = { 0x215C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint16_t input[] = { 0x00B5 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint16_t input[] = { 0xFDFA };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint16_t input[] = { 0xAE00 };
+ static const uint16_t decomposed[] = { 0x1100, 0x1173, 0x11AF };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint16_t input[] = { 0xADF8 };
+ static const uint16_t decomposed[] = { 0x1100, 0x1173 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t decomposed[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint16_t *input = (uint16_t *) malloc (2 * m * sizeof (uint16_t));
+ if (input != NULL)
+ {
+ uint16_t *expected = input + m;
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint16_t *p;
+ size_t i;
+
+ input[0] = 0x0041;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0x0319;
+ *p++ = 0x0300;
+ }
+ for (; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x00C0;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2 - 1; i++)
+ *p++ = 0x0300;
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (check (input, m, expected, m - 1) == 0);
+ ASSERT (check (expected, m - 1, expected, m - 1) == 0);
+ }
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u16_nfc (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u16-nfd.c b/gnulib/tests/uninorm/test-u16-nfd.c
new file mode 100644
index 00000000..4485e3e9
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u16-nfd.c
@@ -0,0 +1,316 @@
+/* Test of canonical decomposition of UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U16_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_normalize (UNINORM_NFD, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_normalize (UNINORM_NFD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_normalize (UNINORM_NFD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u16_nfd (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint16_t input[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint16_t input[] = { 0x00C4 };
+ static const uint16_t expected[] = { 0x0041, 0x0308 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint16_t input[] = { 0x01DE };
+ static const uint16_t expected[] = { 0x0041, 0x0308, 0x0304 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint16_t input[] = { 0x1FC1 };
+ static const uint16_t expected[] = { 0x00A8, 0x0342 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint16_t input[] = { 0x2113 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint16_t input[] = { 0x00A0 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint16_t input[] = { 0xFB6C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint16_t input[] = { 0xFB6D };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint16_t input[] = { 0xFB6B };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint16_t input[] = { 0xFB6A };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint16_t input[] = { 0x246E };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint16_t input[] = { 0x2122 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint16_t input[] = { 0x1D62 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint16_t input[] = { 0xFE35 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint16_t input[] = { 0xFF21 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint16_t input[] = { 0xFF64 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint16_t input[] = { 0xFE51 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint16_t input[] = { 0x3392 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint16_t input[] = { 0x215C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint16_t input[] = { 0x00B5 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint16_t input[] = { 0xFDFA };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint16_t input[] = { 0xAE00 };
+ static const uint16_t expected[] = { 0x1100, 0x1173, 0x11AF };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint16_t input[] = { 0xADF8 };
+ static const uint16_t expected[] = { 0x1100, 0x1173 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t expected[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint16_t *input = (uint16_t *) malloc (2 * m * sizeof (uint16_t));
+ if (input != NULL)
+ {
+ uint16_t *expected = input + m;
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint16_t *p;
+ size_t i;
+
+ input[0] = 0x0041;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0x0319;
+ *p++ = 0x0300;
+ }
+ for (; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x0041;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+
+ for (; repeat > 0; repeat--)
+ ASSERT (check (input, m, expected, m) == 0);
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u16_nfd (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u16-nfkc.c b/gnulib/tests/uninorm/test-u16-nfkc.c
new file mode 100644
index 00000000..a9b673df
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u16-nfkc.c
@@ -0,0 +1,380 @@
+/* Test of compatibility normalization of UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U16_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_normalize (UNINORM_NFKC, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_normalize (UNINORM_NFKC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_normalize (UNINORM_NFKC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u16_nfkc (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint16_t input[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint16_t input[] = { 0x00C4 };
+ static const uint16_t decomposed[] = { 0x0041, 0x0308 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint16_t input[] = { 0x01DE };
+ static const uint16_t decomposed[] = { 0x0041, 0x0308, 0x0304 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ANGSTROM SIGN */
+ static const uint16_t input[] = { 0x212B };
+ static const uint16_t decomposed[] = { 0x0041, 0x030A };
+ static const uint16_t expected[] = { 0x00C5 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint16_t input[] = { 0x1FC1 };
+ static const uint16_t decomposed[] = { 0x0020, 0x0308, 0x0342 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint16_t input[] = { 0x2113 };
+ static const uint16_t decomposed[] = { 0x006C };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint16_t input[] = { 0x00A0 };
+ static const uint16_t decomposed[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint16_t input[] = { 0xFB6C };
+ static const uint16_t decomposed[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint16_t input[] = { 0xFB6D };
+ static const uint16_t decomposed[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint16_t input[] = { 0xFB6B };
+ static const uint16_t decomposed[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint16_t input[] = { 0xFB6A };
+ static const uint16_t decomposed[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint16_t input[] = { 0x246E };
+ static const uint16_t decomposed[] = { 0x0031, 0x0035 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint16_t input[] = { 0x2122 };
+ static const uint16_t decomposed[] = { 0x0054, 0x004D };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint16_t input[] = { 0x1D62 };
+ static const uint16_t decomposed[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint16_t input[] = { 0xFE35 };
+ static const uint16_t decomposed[] = { 0x0028 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint16_t input[] = { 0xFF21 };
+ static const uint16_t decomposed[] = { 0x0041 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint16_t input[] = { 0xFF64 };
+ static const uint16_t decomposed[] = { 0x3001 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint16_t input[] = { 0xFE51 };
+ static const uint16_t decomposed[] = { 0x3001 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint16_t input[] = { 0x3392 };
+ static const uint16_t decomposed[] = { 0x004D, 0x0048, 0x007A };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint16_t input[] = { 0x215C };
+ static const uint16_t decomposed[] = { 0x0033, 0x2044, 0x0038 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint16_t input[] = { 0x00B5 };
+ static const uint16_t decomposed[] = { 0x03BC };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint16_t input[] = { 0xFDFA };
+ static const uint16_t decomposed[] =
+ { 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020,
+ 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645
+ };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint16_t input[] = { 0xAE00 };
+ static const uint16_t decomposed[] = { 0x1100, 0x1173, 0x11AF };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint16_t input[] = { 0xADF8 };
+ static const uint16_t decomposed[] = { 0x1100, 0x1173 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t decomposed[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x0032,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ static const uint16_t expected[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x0032,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint16_t *input = (uint16_t *) malloc (2 * m * sizeof (uint16_t));
+ if (input != NULL)
+ {
+ uint16_t *expected = input + m;
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint16_t *p;
+ size_t i;
+
+ input[0] = 0x0041;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0x0319;
+ *p++ = 0x0300;
+ }
+ for (; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x00C0;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2 - 1; i++)
+ *p++ = 0x0300;
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (check (input, m, expected, m - 1) == 0);
+ ASSERT (check (expected, m - 1, expected, m - 1) == 0);
+ }
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u16_nfkc (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u16-nfkd.c b/gnulib/tests/uninorm/test-u16-nfkd.c
new file mode 100644
index 00000000..d729aa31
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u16-nfkd.c
@@ -0,0 +1,336 @@
+/* Test of compatibility decomposition of UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U16_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_normalize (UNINORM_NFKD, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_normalize (UNINORM_NFKD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u16_normalize (UNINORM_NFKD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u16_nfkd (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint16_t input[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint16_t input[] = { 0x00C4 };
+ static const uint16_t expected[] = { 0x0041, 0x0308 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint16_t input[] = { 0x01DE };
+ static const uint16_t expected[] = { 0x0041, 0x0308, 0x0304 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint16_t input[] = { 0x1FC1 };
+ static const uint16_t expected[] = { 0x0020, 0x0308, 0x0342 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint16_t input[] = { 0x2113 };
+ static const uint16_t expected[] = { 0x006C };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint16_t input[] = { 0x00A0 };
+ static const uint16_t expected[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint16_t input[] = { 0xFB6C };
+ static const uint16_t expected[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint16_t input[] = { 0xFB6D };
+ static const uint16_t expected[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint16_t input[] = { 0xFB6B };
+ static const uint16_t expected[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint16_t input[] = { 0xFB6A };
+ static const uint16_t expected[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint16_t input[] = { 0x246E };
+ static const uint16_t expected[] = { 0x0031, 0x0035 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint16_t input[] = { 0x2122 };
+ static const uint16_t expected[] = { 0x0054, 0x004D };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint16_t input[] = { 0x1D62 };
+ static const uint16_t expected[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint16_t input[] = { 0xFE35 };
+ static const uint16_t expected[] = { 0x0028 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint16_t input[] = { 0xFF21 };
+ static const uint16_t expected[] = { 0x0041 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint16_t input[] = { 0xFF64 };
+ static const uint16_t expected[] = { 0x3001 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint16_t input[] = { 0xFE51 };
+ static const uint16_t expected[] = { 0x3001 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint16_t input[] = { 0x3392 };
+ static const uint16_t expected[] = { 0x004D, 0x0048, 0x007A };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint16_t input[] = { 0x215C };
+ static const uint16_t expected[] = { 0x0033, 0x2044, 0x0038 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint16_t input[] = { 0x00B5 };
+ static const uint16_t expected[] = { 0x03BC };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint16_t input[] = { 0xFDFA };
+ static const uint16_t expected[] =
+ { 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020,
+ 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint16_t input[] = { 0xAE00 };
+ static const uint16_t expected[] = { 0x1100, 0x1173, 0x11AF };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint16_t input[] = { 0xADF8 };
+ static const uint16_t expected[] = { 0x1100, 0x1173 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t expected[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x0032,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint16_t *input = (uint16_t *) malloc (2 * m * sizeof (uint16_t));
+ if (input != NULL)
+ {
+ uint16_t *expected = input + m;
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint16_t *p;
+ size_t i;
+
+ input[0] = 0x0041;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0x0319;
+ *p++ = 0x0300;
+ }
+ for (; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x0041;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+
+ for (; repeat > 0; repeat--)
+ ASSERT (check (input, m, expected, m) == 0);
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u16_nfkd (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u16-normcmp.c b/gnulib/tests/uninorm/test-u16-normcmp.c
new file mode 100644
index 00000000..7adcda64
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u16-normcmp.c
@@ -0,0 +1,116 @@
+/* Test of normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+#include "test-u16-normcmp.h"
+
+static void
+test_nonascii (int (*my_normcmp) (const uint16_t *, size_t, const uint16_t *, size_t, uninorm_t, int *))
+{
+ /* Normalization effects. */
+ {
+ static const uint16_t input1[] = { 'H', 0x00F6, 'h', 'l', 'e' };
+ static const uint16_t input2[] = { 'H', 'o', 0x0308, 'h', 'l', 'e' };
+ static const uint16_t input3[] = { 'H', 0x00F6, 'h', 'l', 'e', 'n' };
+ static const uint16_t input4[] = { 'H', 'o', 0x0308, 'h', 'l', 'e', 'n' };
+ static const uint16_t input5[] = { 'H', 'u', 'r', 'z' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input3, SIZEOF (input3), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input4, SIZEOF (input4), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint16_t input1[] = { 0x00C4 };
+ static const uint16_t input2[] = { 0x0041, 0x0308 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint16_t input1[] = { 0x01DE };
+ static const uint16_t input2[] = { 0x0041, 0x0308, 0x0304 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint16_t input1[] = { 0x1FC1 };
+ static const uint16_t input2[] = { 0x00A8, 0x0342 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint16_t input1[] = { 0xAE00 };
+ static const uint16_t input2[] = { 0xADF8, 0x11AF };
+ static const uint16_t input3[] = { 0x1100, 0x1173, 0x11AF };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEU */
+ static const uint16_t input1[] = { 0xADF8 };
+ static const uint16_t input2[] = { 0x1100, 0x1173 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u16_normcmp, UNINORM_NFD);
+ test_nonascii (u16_normcmp);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-u16-normcmp.h b/gnulib/tests/uninorm/test-u16-normcmp.h
new file mode 100644
index 00000000..85cbf003
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u16-normcmp.h
@@ -0,0 +1,69 @@
+/* Test of normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_normcmp) (const uint16_t *, size_t, const uint16_t *, size_t, uninorm_t, int *),
+ uninorm_t nf)
+{
+ /* Empty string. */
+ {
+ int cmp;
+
+ ASSERT (my_normcmp (NULL, 0, NULL, 0, nf, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ {
+ static const uint16_t input[] = { 'x', 'y' };
+ int cmp;
+
+ ASSERT (my_normcmp (input, SIZEOF (input), NULL, 0, nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+
+ ASSERT (my_normcmp (NULL, 0, input, SIZEOF (input), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input, SIZEOF (input), input, SIZEOF (input), nf, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Normal lexicographic order. */
+ {
+ static const uint16_t input1[] = { 'A', 'm', 'e', 'r', 'i', 'c', 'a' };
+ static const uint16_t input2[] = { 'A', 'm', 'i', 'g', 'o' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+ }
+
+ /* Shorter and longer strings. */
+ {
+ static const uint16_t input1[] = { 'R', 'e', 'a', 'g', 'a', 'n' };
+ static const uint16_t input2[] = { 'R', 'e', 'a', 'g', 'a', 'n', 'o', 'm', 'i', 'c', 's' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+ }
+}
diff --git a/gnulib/tests/uninorm/test-u16-normcoll.c b/gnulib/tests/uninorm/test-u16-normcoll.c
new file mode 100644
index 00000000..ead1561a
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u16-normcoll.c
@@ -0,0 +1,35 @@
+/* Test of locale dependent, normalization insensitive comparison of
+ UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+#include "test-u16-normcmp.h"
+int
+main ()
+{
+ /* In the "C" locale, strcoll is equivalent to strcmp, therefore u8_normcoll
+ on ASCII strings should behave like strcmp as well. */
+ test_ascii (u16_normcoll, UNINORM_NFC);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-u32-nfc-big.c b/gnulib/tests/uninorm/test-u32-nfc-big.c
new file mode 100644
index 00000000..77eba6e8
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfc-big.c
@@ -0,0 +1,125 @@
+/* Test of Unicode compliance of canonical normalization of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include "uninorm.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "progname.h"
+#include "test-u32-normalize-big.h"
+
+static int
+check (const uint32_t *c1, size_t c1_length,
+ const uint32_t *c2, size_t c2_length,
+ const uint32_t *c3, size_t c3_length,
+ const uint32_t *c4, size_t c4_length,
+ const uint32_t *c5, size_t c5_length)
+{
+ /* Check
+ c2 == NFC(c1) == NFC(c2) == NFC(c3)
+ c4 == NFC(c4) == NFC(c5)
+ */
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFC, c1, c1_length, NULL, &length);
+ if (!(result != NULL
+ && length == c2_length
+ && u32_cmp (result, c2, c2_length) == 0))
+ return 1;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFC, c2, c2_length, NULL, &length);
+ if (!(result != NULL
+ && length == c2_length
+ && u32_cmp (result, c2, c2_length) == 0))
+ return 2;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFC, c3, c3_length, NULL, &length);
+ if (!(result != NULL
+ && length == c2_length
+ && u32_cmp (result, c2, c2_length) == 0))
+ return 3;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFC, c4, c4_length, NULL, &length);
+ if (!(result != NULL
+ && length == c4_length
+ && u32_cmp (result, c4, c4_length) == 0))
+ return 4;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFC, c5, c5_length, NULL, &length);
+ if (!(result != NULL
+ && length == c4_length
+ && u32_cmp (result, c4, c4_length) == 0))
+ return 5;
+ free (result);
+ }
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ struct normalization_test_file file;
+
+ set_program_name (argv[0]);
+ read_normalization_test_file (argv[1], &file);
+
+ test_specific (&file, check);
+ test_other (&file, UNINORM_NFC);
+
+ return 0;
+}
+
+#else
+
+#include <stdio.h>
+
+int
+main ()
+{
+ fprintf (stderr, "Skipping test: uninorm/u32-normalize module not included.\n");
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-nfc-big.sh b/gnulib/tests/uninorm/test-u32-nfc-big.sh
new file mode 100755
index 00000000..93d0003d
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfc-big.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec ./test-u32-nfc-big${EXEEXT} "$srcdir/uninorm/NormalizationTest.txt"
diff --git a/gnulib/tests/uninorm/test-u32-nfc.c b/gnulib/tests/uninorm/test-u32-nfc.c
new file mode 100644
index 00000000..1c622759
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfc.c
@@ -0,0 +1,332 @@
+/* Test of canonical normalization of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_normalize (UNINORM_NFC, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_normalize (UNINORM_NFC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_normalize (UNINORM_NFC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u32_nfc (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint32_t input[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint32_t input[] = { 0x00C4 };
+ static const uint32_t decomposed[] = { 0x0041, 0x0308 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint32_t input[] = { 0x01DE };
+ static const uint32_t decomposed[] = { 0x0041, 0x0308, 0x0304 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ANGSTROM SIGN */
+ static const uint32_t input[] = { 0x212B };
+ static const uint32_t decomposed[] = { 0x0041, 0x030A };
+ static const uint32_t expected[] = { 0x00C5 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint32_t input[] = { 0x1FC1 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint32_t input[] = { 0x2113 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint32_t input[] = { 0x00A0 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint32_t input[] = { 0xFB6C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint32_t input[] = { 0xFB6D };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint32_t input[] = { 0xFB6B };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint32_t input[] = { 0xFB6A };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint32_t input[] = { 0x246E };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint32_t input[] = { 0x2122 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint32_t input[] = { 0x1D62 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint32_t input[] = { 0xFE35 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint32_t input[] = { 0xFF21 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint32_t input[] = { 0xFF64 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint32_t input[] = { 0xFE51 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint32_t input[] = { 0x3392 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint32_t input[] = { 0x215C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint32_t input[] = { 0x00B5 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint32_t input[] = { 0xFDFA };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint32_t input[] = { 0xAE00 };
+ static const uint32_t decomposed[] = { 0x1100, 0x1173, 0x11AF };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint32_t input[] = { 0xADF8 };
+ static const uint32_t decomposed[] = { 0x1100, 0x1173 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t decomposed[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint32_t *input = (uint32_t *) malloc (2 * m * sizeof (uint32_t));
+ if (input != NULL)
+ {
+ uint32_t *expected = input + m;
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint32_t *p;
+ size_t i;
+
+ input[0] = 0x0041;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0x0319;
+ *p++ = 0x0300;
+ }
+ for (; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x00C0;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2 - 1; i++)
+ *p++ = 0x0300;
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (check (input, m, expected, m - 1) == 0);
+ ASSERT (check (expected, m - 1, expected, m - 1) == 0);
+ }
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u32_nfc (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-nfd-big.c b/gnulib/tests/uninorm/test-u32-nfd-big.c
new file mode 100644
index 00000000..bd2489ca
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfd-big.c
@@ -0,0 +1,125 @@
+/* Test of Unicode compliance of canonical decomposition of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include "uninorm.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "progname.h"
+#include "test-u32-normalize-big.h"
+
+static int
+check (const uint32_t *c1, size_t c1_length,
+ const uint32_t *c2, size_t c2_length,
+ const uint32_t *c3, size_t c3_length,
+ const uint32_t *c4, size_t c4_length,
+ const uint32_t *c5, size_t c5_length)
+{
+ /* Check
+ c3 == NFD(c1) == NFD(c2) == NFD(c3)
+ c5 == NFD(c4) == NFD(c5)
+ */
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFD, c1, c1_length, NULL, &length);
+ if (!(result != NULL
+ && length == c3_length
+ && u32_cmp (result, c3, c3_length) == 0))
+ return 1;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFD, c2, c2_length, NULL, &length);
+ if (!(result != NULL
+ && length == c3_length
+ && u32_cmp (result, c3, c3_length) == 0))
+ return 2;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFD, c3, c3_length, NULL, &length);
+ if (!(result != NULL
+ && length == c3_length
+ && u32_cmp (result, c3, c3_length) == 0))
+ return 3;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFD, c4, c4_length, NULL, &length);
+ if (!(result != NULL
+ && length == c5_length
+ && u32_cmp (result, c5, c5_length) == 0))
+ return 4;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFD, c5, c5_length, NULL, &length);
+ if (!(result != NULL
+ && length == c5_length
+ && u32_cmp (result, c5, c5_length) == 0))
+ return 5;
+ free (result);
+ }
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ struct normalization_test_file file;
+
+ set_program_name (argv[0]);
+ read_normalization_test_file (argv[1], &file);
+
+ test_specific (&file, check);
+ test_other (&file, UNINORM_NFD);
+
+ return 0;
+}
+
+#else
+
+#include <stdio.h>
+
+int
+main ()
+{
+ fprintf (stderr, "Skipping test: uninorm/u32-normalize module not included.\n");
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-nfd-big.sh b/gnulib/tests/uninorm/test-u32-nfd-big.sh
new file mode 100755
index 00000000..3cfe2c56
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfd-big.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec ./test-u32-nfd-big${EXEEXT} "$srcdir/uninorm/NormalizationTest.txt"
diff --git a/gnulib/tests/uninorm/test-u32-nfd.c b/gnulib/tests/uninorm/test-u32-nfd.c
new file mode 100644
index 00000000..027b06a7
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfd.c
@@ -0,0 +1,316 @@
+/* Test of canonical decomposition of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_normalize (UNINORM_NFD, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_normalize (UNINORM_NFD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_normalize (UNINORM_NFD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u32_nfd (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint32_t input[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint32_t input[] = { 0x00C4 };
+ static const uint32_t expected[] = { 0x0041, 0x0308 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint32_t input[] = { 0x01DE };
+ static const uint32_t expected[] = { 0x0041, 0x0308, 0x0304 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint32_t input[] = { 0x1FC1 };
+ static const uint32_t expected[] = { 0x00A8, 0x0342 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint32_t input[] = { 0x2113 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint32_t input[] = { 0x00A0 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint32_t input[] = { 0xFB6C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint32_t input[] = { 0xFB6D };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint32_t input[] = { 0xFB6B };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint32_t input[] = { 0xFB6A };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint32_t input[] = { 0x246E };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint32_t input[] = { 0x2122 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint32_t input[] = { 0x1D62 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint32_t input[] = { 0xFE35 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint32_t input[] = { 0xFF21 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint32_t input[] = { 0xFF64 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint32_t input[] = { 0xFE51 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint32_t input[] = { 0x3392 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint32_t input[] = { 0x215C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint32_t input[] = { 0x00B5 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint32_t input[] = { 0xFDFA };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint32_t input[] = { 0xAE00 };
+ static const uint32_t expected[] = { 0x1100, 0x1173, 0x11AF };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint32_t input[] = { 0xADF8 };
+ static const uint32_t expected[] = { 0x1100, 0x1173 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t expected[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint32_t *input = (uint32_t *) malloc (2 * m * sizeof (uint32_t));
+ if (input != NULL)
+ {
+ uint32_t *expected = input + m;
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint32_t *p;
+ size_t i;
+
+ input[0] = 0x0041;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0x0319;
+ *p++ = 0x0300;
+ }
+ for (; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x0041;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+
+ for (; repeat > 0; repeat--)
+ ASSERT (check (input, m, expected, m) == 0);
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u32_nfd (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-nfkc-big.c b/gnulib/tests/uninorm/test-u32-nfkc-big.c
new file mode 100644
index 00000000..8454f685
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfkc-big.c
@@ -0,0 +1,122 @@
+/* Test of Unicode compliance of compatibility normalization of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include "uninorm.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "progname.h"
+#include "test-u32-normalize-big.h"
+
+static int
+check (const uint32_t *c1, size_t c1_length,
+ const uint32_t *c2, size_t c2_length,
+ const uint32_t *c3, size_t c3_length,
+ const uint32_t *c4, size_t c4_length,
+ const uint32_t *c5, size_t c5_length)
+{
+ /* Check c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5). */
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKC, c1, c1_length, NULL, &length);
+ if (!(result != NULL
+ && length == c4_length
+ && u32_cmp (result, c4, c4_length) == 0))
+ return 1;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKC, c2, c2_length, NULL, &length);
+ if (!(result != NULL
+ && length == c4_length
+ && u32_cmp (result, c4, c4_length) == 0))
+ return 2;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKC, c3, c3_length, NULL, &length);
+ if (!(result != NULL
+ && length == c4_length
+ && u32_cmp (result, c4, c4_length) == 0))
+ return 3;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKC, c4, c4_length, NULL, &length);
+ if (!(result != NULL
+ && length == c4_length
+ && u32_cmp (result, c4, c4_length) == 0))
+ return 4;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKC, c5, c5_length, NULL, &length);
+ if (!(result != NULL
+ && length == c4_length
+ && u32_cmp (result, c4, c4_length) == 0))
+ return 5;
+ free (result);
+ }
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ struct normalization_test_file file;
+
+ set_program_name (argv[0]);
+ read_normalization_test_file (argv[1], &file);
+
+ test_specific (&file, check);
+ test_other (&file, UNINORM_NFKC);
+
+ return 0;
+}
+
+#else
+
+#include <stdio.h>
+
+int
+main ()
+{
+ fprintf (stderr, "Skipping test: uninorm/u32-normalize module not included.\n");
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-nfkc-big.sh b/gnulib/tests/uninorm/test-u32-nfkc-big.sh
new file mode 100755
index 00000000..cd816196
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfkc-big.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec ./test-u32-nfkc-big${EXEEXT} "$srcdir/uninorm/NormalizationTest.txt"
diff --git a/gnulib/tests/uninorm/test-u32-nfkc.c b/gnulib/tests/uninorm/test-u32-nfkc.c
new file mode 100644
index 00000000..ba98f13a
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfkc.c
@@ -0,0 +1,380 @@
+/* Test of compatibility normalization of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_normalize (UNINORM_NFKC, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_normalize (UNINORM_NFKC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_normalize (UNINORM_NFKC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u32_nfkc (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint32_t input[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint32_t input[] = { 0x00C4 };
+ static const uint32_t decomposed[] = { 0x0041, 0x0308 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint32_t input[] = { 0x01DE };
+ static const uint32_t decomposed[] = { 0x0041, 0x0308, 0x0304 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ANGSTROM SIGN */
+ static const uint32_t input[] = { 0x212B };
+ static const uint32_t decomposed[] = { 0x0041, 0x030A };
+ static const uint32_t expected[] = { 0x00C5 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint32_t input[] = { 0x1FC1 };
+ static const uint32_t decomposed[] = { 0x0020, 0x0308, 0x0342 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint32_t input[] = { 0x2113 };
+ static const uint32_t decomposed[] = { 0x006C };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint32_t input[] = { 0x00A0 };
+ static const uint32_t decomposed[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint32_t input[] = { 0xFB6C };
+ static const uint32_t decomposed[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint32_t input[] = { 0xFB6D };
+ static const uint32_t decomposed[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint32_t input[] = { 0xFB6B };
+ static const uint32_t decomposed[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint32_t input[] = { 0xFB6A };
+ static const uint32_t decomposed[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint32_t input[] = { 0x246E };
+ static const uint32_t decomposed[] = { 0x0031, 0x0035 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint32_t input[] = { 0x2122 };
+ static const uint32_t decomposed[] = { 0x0054, 0x004D };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint32_t input[] = { 0x1D62 };
+ static const uint32_t decomposed[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint32_t input[] = { 0xFE35 };
+ static const uint32_t decomposed[] = { 0x0028 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint32_t input[] = { 0xFF21 };
+ static const uint32_t decomposed[] = { 0x0041 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint32_t input[] = { 0xFF64 };
+ static const uint32_t decomposed[] = { 0x3001 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint32_t input[] = { 0xFE51 };
+ static const uint32_t decomposed[] = { 0x3001 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint32_t input[] = { 0x3392 };
+ static const uint32_t decomposed[] = { 0x004D, 0x0048, 0x007A };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint32_t input[] = { 0x215C };
+ static const uint32_t decomposed[] = { 0x0033, 0x2044, 0x0038 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint32_t input[] = { 0x00B5 };
+ static const uint32_t decomposed[] = { 0x03BC };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint32_t input[] = { 0xFDFA };
+ static const uint32_t decomposed[] =
+ { 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020,
+ 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645
+ };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint32_t input[] = { 0xAE00 };
+ static const uint32_t decomposed[] = { 0x1100, 0x1173, 0x11AF };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint32_t input[] = { 0xADF8 };
+ static const uint32_t decomposed[] = { 0x1100, 0x1173 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t decomposed[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x0032,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ static const uint32_t expected[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x0032,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint32_t *input = (uint32_t *) malloc (2 * m * sizeof (uint32_t));
+ if (input != NULL)
+ {
+ uint32_t *expected = input + m;
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint32_t *p;
+ size_t i;
+
+ input[0] = 0x0041;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0x0319;
+ *p++ = 0x0300;
+ }
+ for (; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x00C0;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2 - 1; i++)
+ *p++ = 0x0300;
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (check (input, m, expected, m - 1) == 0);
+ ASSERT (check (expected, m - 1, expected, m - 1) == 0);
+ }
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u32_nfkc (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-nfkd-big.c b/gnulib/tests/uninorm/test-u32-nfkd-big.c
new file mode 100644
index 00000000..f6fab501
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfkd-big.c
@@ -0,0 +1,122 @@
+/* Test of Unicode compliance of compatibility decomposition of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include "uninorm.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "progname.h"
+#include "test-u32-normalize-big.h"
+
+static int
+check (const uint32_t *c1, size_t c1_length,
+ const uint32_t *c2, size_t c2_length,
+ const uint32_t *c3, size_t c3_length,
+ const uint32_t *c4, size_t c4_length,
+ const uint32_t *c5, size_t c5_length)
+{
+ /* Check c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5). */
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKD, c1, c1_length, NULL, &length);
+ if (!(result != NULL
+ && length == c5_length
+ && u32_cmp (result, c5, c5_length) == 0))
+ return 1;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKD, c2, c2_length, NULL, &length);
+ if (!(result != NULL
+ && length == c5_length
+ && u32_cmp (result, c5, c5_length) == 0))
+ return 2;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKD, c3, c3_length, NULL, &length);
+ if (!(result != NULL
+ && length == c5_length
+ && u32_cmp (result, c5, c5_length) == 0))
+ return 3;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKD, c4, c4_length, NULL, &length);
+ if (!(result != NULL
+ && length == c5_length
+ && u32_cmp (result, c5, c5_length) == 0))
+ return 4;
+ free (result);
+ }
+ {
+ size_t length;
+ uint32_t *result;
+
+ result = u32_normalize (UNINORM_NFKD, c5, c5_length, NULL, &length);
+ if (!(result != NULL
+ && length == c5_length
+ && u32_cmp (result, c5, c5_length) == 0))
+ return 5;
+ free (result);
+ }
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ struct normalization_test_file file;
+
+ set_program_name (argv[0]);
+ read_normalization_test_file (argv[1], &file);
+
+ test_specific (&file, check);
+ test_other (&file, UNINORM_NFKD);
+
+ return 0;
+}
+
+#else
+
+#include <stdio.h>
+
+int
+main ()
+{
+ fprintf (stderr, "Skipping test: uninorm/u32-normalize module not included.\n");
+ return 77;
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-nfkd-big.sh b/gnulib/tests/uninorm/test-u32-nfkd-big.sh
new file mode 100755
index 00000000..a279c124
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfkd-big.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec ./test-u32-nfkd-big${EXEEXT} "$srcdir/uninorm/NormalizationTest.txt"
diff --git a/gnulib/tests/uninorm/test-u32-nfkd.c b/gnulib/tests/uninorm/test-u32-nfkd.c
new file mode 100644
index 00000000..be4d54a8
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-nfkd.c
@@ -0,0 +1,336 @@
+/* Test of compatibility decomposition of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_normalize (UNINORM_NFKD, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_normalize (UNINORM_NFKD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u32_normalize (UNINORM_NFKD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u32_nfkd (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint32_t input[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint32_t input[] = { 0x00C4 };
+ static const uint32_t expected[] = { 0x0041, 0x0308 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint32_t input[] = { 0x01DE };
+ static const uint32_t expected[] = { 0x0041, 0x0308, 0x0304 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint32_t input[] = { 0x1FC1 };
+ static const uint32_t expected[] = { 0x0020, 0x0308, 0x0342 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint32_t input[] = { 0x2113 };
+ static const uint32_t expected[] = { 0x006C };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint32_t input[] = { 0x00A0 };
+ static const uint32_t expected[] = { 0x0020 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint32_t input[] = { 0xFB6C };
+ static const uint32_t expected[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint32_t input[] = { 0xFB6D };
+ static const uint32_t expected[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint32_t input[] = { 0xFB6B };
+ static const uint32_t expected[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint32_t input[] = { 0xFB6A };
+ static const uint32_t expected[] = { 0x06A4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint32_t input[] = { 0x246E };
+ static const uint32_t expected[] = { 0x0031, 0x0035 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint32_t input[] = { 0x2122 };
+ static const uint32_t expected[] = { 0x0054, 0x004D };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint32_t input[] = { 0x1D62 };
+ static const uint32_t expected[] = { 0x0069 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint32_t input[] = { 0xFE35 };
+ static const uint32_t expected[] = { 0x0028 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint32_t input[] = { 0xFF21 };
+ static const uint32_t expected[] = { 0x0041 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint32_t input[] = { 0xFF64 };
+ static const uint32_t expected[] = { 0x3001 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint32_t input[] = { 0xFE51 };
+ static const uint32_t expected[] = { 0x3001 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint32_t input[] = { 0x3392 };
+ static const uint32_t expected[] = { 0x004D, 0x0048, 0x007A };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint32_t input[] = { 0x215C };
+ static const uint32_t expected[] = { 0x0033, 0x2044, 0x0038 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint32_t input[] = { 0x00B5 };
+ static const uint32_t expected[] = { 0x03BC };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint32_t input[] = { 0xFDFA };
+ static const uint32_t expected[] =
+ { 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020,
+ 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint32_t input[] = { 0xAE00 };
+ static const uint32_t expected[] = { 0x1100, 0x1173, 0x11AF };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint32_t input[] = { 0xADF8 };
+ static const uint32_t expected[] = { 0x1100, 0x1173 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t expected[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x0032,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint32_t *input = (uint32_t *) malloc (2 * m * sizeof (uint32_t));
+ if (input != NULL)
+ {
+ uint32_t *expected = input + m;
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint32_t *p;
+ size_t i;
+
+ input[0] = 0x0041;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0x0319;
+ *p++ = 0x0300;
+ }
+ for (; i < m1; i++)
+ *p++ = 0x0319;
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x0041;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ *p++ = 0x0319;
+ for (i = 0; i < m2; i++)
+ *p++ = 0x0300;
+
+ for (; repeat > 0; repeat--)
+ ASSERT (check (input, m, expected, m) == 0);
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u32_nfkd (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-normalize-big.c b/gnulib/tests/uninorm/test-u32-normalize-big.c
new file mode 100644
index 00000000..1d1bd3e0
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-normalize-big.c
@@ -0,0 +1,304 @@
+/* Test of Unicode compliance of normalization of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+/* Specification. */
+#include "test-u32-normalize-big.h"
+
+#if GNULIB_UNINORM_U32_NORMALIZE
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "xalloc.h"
+#include "unistr.h"
+#include "macros.h"
+
+#define ASSERT_WITH_LINE(expr, file, line) \
+ do \
+ { \
+ if (!(expr)) \
+ { \
+ fprintf (stderr, "%s:%d: assertion failed for %s:%u\n", \
+ __FILE__, __LINE__, file, line); \
+ fflush (stderr); \
+ abort (); \
+ } \
+ } \
+ while (0)
+
+static int
+cmp_ucs4_t (const void *a, const void *b)
+{
+ ucs4_t a_value = *(const ucs4_t *)a;
+ ucs4_t b_value = *(const ucs4_t *)b;
+ return (a_value < b_value ? -1 : a_value > b_value ? 1 : 0);
+}
+
+void
+read_normalization_test_file (const char *filename,
+ struct normalization_test_file *file)
+{
+ FILE *stream;
+ unsigned int lineno;
+ int part_index;
+ struct normalization_test_line *lines;
+ size_t lines_length;
+ size_t lines_allocated;
+
+ stream = fopen (filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", filename);
+ exit (1);
+ }
+
+ for (part_index = 0; part_index < 4; part_index++)
+ {
+ file->parts[part_index].lines = NULL;
+ file->parts[part_index].lines_length = 0;
+ }
+
+ lineno = 0;
+
+ part_index = -1;
+ lines = NULL;
+ lines_length = 0;
+ lines_allocated = 0;
+
+ for (;;)
+ {
+ char buf[1000+1];
+ char *ptr;
+ int c;
+ struct normalization_test_line line;
+ size_t sequence_index;
+
+ lineno++;
+
+ /* Read a line. */
+ ptr = buf;
+ do
+ {
+ c = getc (stream);
+ if (c == EOF || c == '\n')
+ break;
+ *ptr++ = c;
+ }
+ while (ptr < buf + 1000);
+ *ptr = '\0';
+ if (c == EOF)
+ break;
+
+ /* Ignore empty lines and comment lines. */
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ /* Handle lines that introduce a new part. */
+ if (buf[0] == '@')
+ {
+ /* Switch to the next part. */
+ if (part_index >= 0)
+ {
+ lines =
+ (struct normalization_test_line *)
+ xnrealloc (lines, lines_length, sizeof (struct normalization_test_line));
+ file->parts[part_index].lines = lines;
+ file->parts[part_index].lines_length = lines_length;
+ }
+ part_index++;
+ lines = NULL;
+ lines_length = 0;
+ lines_allocated = 0;
+ continue;
+ }
+
+ /* It's a line containing 5 sequences of Unicode characters.
+ Parse it and append it to the current part. */
+ if (!(part_index >= 0 && part_index < 4))
+ {
+ fprintf (stderr, "unexpected structure of '%s'\n", filename);
+ exit (1);
+ }
+ ptr = buf;
+ line.lineno = lineno;
+ for (sequence_index = 0; sequence_index < 5; sequence_index++)
+ line.sequences[sequence_index] = NULL;
+ for (sequence_index = 0; sequence_index < 5; sequence_index++)
+ {
+ uint32_t *sequence = XNMALLOC (1, uint32_t);
+ size_t sequence_length = 0;
+
+ for (;;)
+ {
+ char *endptr;
+ unsigned int uc;
+
+ uc = strtoul (ptr, &endptr, 16);
+ if (endptr == ptr)
+ break;
+ ptr = endptr;
+
+ /* Append uc to the sequence. */
+ sequence =
+ (uint32_t *)
+ xnrealloc (sequence, sequence_length + 2, sizeof (uint32_t));
+ sequence[sequence_length] = uc;
+ sequence_length++;
+
+ if (*ptr == ' ')
+ ptr++;
+ }
+ if (sequence_length == 0)
+ {
+ fprintf (stderr, "empty character sequence in '%s'\n", filename);
+ exit (1);
+ }
+ sequence[sequence_length] = 0; /* terminator */
+
+ line.sequences[sequence_index] = sequence;
+
+ if (*ptr != ';')
+ {
+ fprintf (stderr, "error parsing '%s'\n", filename);
+ exit (1);
+ }
+ ptr++;
+ }
+
+ /* Append the line to the current part. */
+ if (lines_length == lines_allocated)
+ {
+ lines_allocated = 2 * lines_allocated;
+ if (lines_allocated < 7)
+ lines_allocated = 7;
+ lines =
+ (struct normalization_test_line *)
+ xnrealloc (lines, lines_allocated, sizeof (struct normalization_test_line));
+ }
+ lines[lines_length] = line;
+ lines_length++;
+ }
+
+ if (part_index >= 0)
+ {
+ lines =
+ (struct normalization_test_line *)
+ xnrealloc (lines, lines_length, sizeof (struct normalization_test_line));
+ file->parts[part_index].lines = lines;
+ file->parts[part_index].lines_length = lines_length;
+ }
+
+ {
+ /* Collect all c1 values from the part 1 in an array. */
+ const struct normalization_test_part *p = &file->parts[1];
+ ucs4_t *c1_array = XNMALLOC (p->lines_length + 1, ucs4_t);
+ size_t line_index;
+
+ for (line_index = 0; line_index < p->lines_length; line_index++)
+ {
+ const uint32_t *sequence = p->lines[line_index].sequences[0];
+ /* In part 1, every sequences[0] consists of a single character. */
+ if (!(sequence[0] != 0 && sequence[1] == 0))
+ abort ();
+ c1_array[line_index] = sequence[0];
+ }
+
+ /* Sort this array. */
+ qsort (c1_array, p->lines_length, sizeof (ucs4_t), cmp_ucs4_t);
+
+ /* Add the sentinel at the end. */
+ c1_array[p->lines_length] = 0x110000;
+
+ file->part1_c1_sorted = c1_array;
+ }
+
+ file->filename = xstrdup (filename);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", filename);
+ exit (1);
+ }
+}
+
+void
+test_specific (const struct normalization_test_file *file,
+ int (*check) (const uint32_t *c1, size_t c1_length,
+ const uint32_t *c2, size_t c2_length,
+ const uint32_t *c3, size_t c3_length,
+ const uint32_t *c4, size_t c4_length,
+ const uint32_t *c5, size_t c5_length))
+{
+ size_t part_index;
+
+ for (part_index = 0; part_index < 4; part_index++)
+ {
+ const struct normalization_test_part *p = &file->parts[part_index];
+ size_t line_index;
+
+ for (line_index = 0; line_index < p->lines_length; line_index++)
+ {
+ const struct normalization_test_line *l = &p->lines[line_index];
+
+ ASSERT_WITH_LINE (check (l->sequences[0], u32_strlen (l->sequences[0]),
+ l->sequences[1], u32_strlen (l->sequences[1]),
+ l->sequences[2], u32_strlen (l->sequences[2]),
+ l->sequences[3], u32_strlen (l->sequences[3]),
+ l->sequences[4], u32_strlen (l->sequences[4]))
+ == 0,
+ file->filename, l->lineno);
+ }
+ }
+}
+
+void
+test_other (const struct normalization_test_file *file, uninorm_t nf)
+{
+ /* Check that for every character not listed in part 1 of the
+ NormalizationTest.txt file, the character maps to itself in each
+ of the four normalization forms. */
+ const ucs4_t *p = file->part1_c1_sorted;
+ ucs4_t uc;
+
+ for (uc = 0; uc < 0x110000; uc++)
+ {
+ if (uc >= 0xD800 && uc < 0xE000)
+ {
+ /* A surrogate, not a character. Skip uc. */
+ }
+ else if (uc == *p)
+ {
+ /* Skip uc. */
+ p++;
+ }
+ else
+ {
+ uint32_t input[1];
+ size_t length;
+ uint32_t *result;
+
+ input[0] = uc;
+ result = u32_normalize (nf, input, 1, NULL, &length);
+ ASSERT (result != NULL && length == 1 && result[0] == uc);
+ }
+ }
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u32-normalize-big.h b/gnulib/tests/uninorm/test-u32-normalize-big.h
new file mode 100644
index 00000000..2482a34a
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-normalize-big.h
@@ -0,0 +1,70 @@
+/* Test of Unicode compliance of normalization of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+#include <stddef.h>
+
+#include "unitypes.h"
+#include "uninorm.h"
+
+/* The NormalizationTest.txt is from www.unicode.org, with stripped comments:
+ sed -e 's| *#.*||' < .../ucd/NormalizationTest.txt \
+ > tests/uninorm/NormalizationTest.txt
+ It is only used to verify the compliance of this implementation of the
+ Unicode normalization forms. It is not used by the library code, only
+ by the unit tests. */
+
+/* Representation of a line in the NormalizationTest.txt file. */
+struct normalization_test_line
+{
+ unsigned int lineno;
+ uint32_t *sequences[5];
+};
+
+/* Representation of a delimited part of the NormalizationTest.txt file. */
+struct normalization_test_part
+{
+ struct normalization_test_line *lines;
+ size_t lines_length;
+};
+
+/* Representation of the entire NormalizationTest.txt file. */
+struct normalization_test_file
+{
+ struct normalization_test_part parts[4];
+ /* The set of c1 values from part 1, sorted in ascending order, with a
+ sentinel value of 0x110000 at the end. */
+ ucs4_t *part1_c1_sorted;
+ /* The filename of the NormalizationTest.txt file. */
+ const char *filename;
+};
+
+/* Read the NormalizationTest.txt file and return its contents. */
+extern void
+ read_normalization_test_file (const char *filename,
+ struct normalization_test_file *file);
+
+/* Perform the first compliance test. */
+extern void
+ test_specific (const struct normalization_test_file *file,
+ int (*check) (const uint32_t *c1, size_t c1_length,
+ const uint32_t *c2, size_t c2_length,
+ const uint32_t *c3, size_t c3_length,
+ const uint32_t *c4, size_t c4_length,
+ const uint32_t *c5, size_t c5_length));
+
+/* Perform the second compliance test. */
+extern void
+ test_other (const struct normalization_test_file *file, uninorm_t nf);
diff --git a/gnulib/tests/uninorm/test-u32-normcmp.c b/gnulib/tests/uninorm/test-u32-normcmp.c
new file mode 100644
index 00000000..e48ceeba
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-normcmp.c
@@ -0,0 +1,116 @@
+/* Test of normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+#include "test-u32-normcmp.h"
+
+static void
+test_nonascii (int (*my_normcmp) (const uint32_t *, size_t, const uint32_t *, size_t, uninorm_t, int *))
+{
+ /* Normalization effects. */
+ {
+ static const uint32_t input1[] = { 'H', 0x00F6, 'h', 'l', 'e' };
+ static const uint32_t input2[] = { 'H', 'o', 0x0308, 'h', 'l', 'e' };
+ static const uint32_t input3[] = { 'H', 0x00F6, 'h', 'l', 'e', 'n' };
+ static const uint32_t input4[] = { 'H', 'o', 0x0308, 'h', 'l', 'e', 'n' };
+ static const uint32_t input5[] = { 'H', 'u', 'r', 'z' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input3, SIZEOF (input3), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input4, SIZEOF (input4), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint32_t input1[] = { 0x00C4 };
+ static const uint32_t input2[] = { 0x0041, 0x0308 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint32_t input1[] = { 0x01DE };
+ static const uint32_t input2[] = { 0x0041, 0x0308, 0x0304 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint32_t input1[] = { 0x1FC1 };
+ static const uint32_t input2[] = { 0x00A8, 0x0342 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint32_t input1[] = { 0xAE00 };
+ static const uint32_t input2[] = { 0xADF8, 0x11AF };
+ static const uint32_t input3[] = { 0x1100, 0x1173, 0x11AF };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEU */
+ static const uint32_t input1[] = { 0xADF8 };
+ static const uint32_t input2[] = { 0x1100, 0x1173 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u32_normcmp, UNINORM_NFD);
+ test_nonascii (u32_normcmp);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-u32-normcmp.h b/gnulib/tests/uninorm/test-u32-normcmp.h
new file mode 100644
index 00000000..56d4cdba
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-normcmp.h
@@ -0,0 +1,69 @@
+/* Test of normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_normcmp) (const uint32_t *, size_t, const uint32_t *, size_t, uninorm_t, int *),
+ uninorm_t nf)
+{
+ /* Empty string. */
+ {
+ int cmp;
+
+ ASSERT (my_normcmp (NULL, 0, NULL, 0, nf, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ {
+ static const uint32_t input[] = { 'x', 'y' };
+ int cmp;
+
+ ASSERT (my_normcmp (input, SIZEOF (input), NULL, 0, nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+
+ ASSERT (my_normcmp (NULL, 0, input, SIZEOF (input), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input, SIZEOF (input), input, SIZEOF (input), nf, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Normal lexicographic order. */
+ {
+ static const uint32_t input1[] = { 'A', 'm', 'e', 'r', 'i', 'c', 'a' };
+ static const uint32_t input2[] = { 'A', 'm', 'i', 'g', 'o' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+ }
+
+ /* Shorter and longer strings. */
+ {
+ static const uint32_t input1[] = { 'R', 'e', 'a', 'g', 'a', 'n' };
+ static const uint32_t input2[] = { 'R', 'e', 'a', 'g', 'a', 'n', 'o', 'm', 'i', 'c', 's' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+ }
+}
diff --git a/gnulib/tests/uninorm/test-u32-normcoll.c b/gnulib/tests/uninorm/test-u32-normcoll.c
new file mode 100644
index 00000000..08777ee3
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u32-normcoll.c
@@ -0,0 +1,35 @@
+/* Test of locale dependent, normalization insensitive comparison of
+ UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+#include "test-u32-normcmp.h"
+int
+main ()
+{
+ /* In the "C" locale, strcoll is equivalent to strcmp, therefore u8_normcoll
+ on ASCII strings should behave like strcmp as well. */
+ test_ascii (u32_normcoll, UNINORM_NFC);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-u8-nfc.c b/gnulib/tests/uninorm/test-u8-nfc.c
new file mode 100644
index 00000000..1697e913
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u8-nfc.c
@@ -0,0 +1,362 @@
+/* Test of canonical normalization of UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U8_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_normalize (UNINORM_NFC, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_normalize (UNINORM_NFC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_normalize (UNINORM_NFC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u8_nfc (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint8_t input[] = { 0x20 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint8_t input[] = { 0xC3, 0x84 };
+ static const uint8_t decomposed[] = { 0x41, 0xCC, 0x88 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint8_t input[] = { 0xC7, 0x9E };
+ static const uint8_t decomposed[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ANGSTROM SIGN */
+ static const uint8_t input[] = { 0xE2, 0x84, 0xAB };
+ static const uint8_t decomposed[] = { 0x41, 0xCC, 0x8A };
+ static const uint8_t expected[] = { 0xC3, 0x85 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint8_t input[] = { 0xE1, 0xBF, 0x81 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint8_t input[] = { 0xE2, 0x84, 0x93 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint8_t input[] = { 0xC2, 0xA0 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAC };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAD };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAB };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAA };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint8_t input[] = { 0xE2, 0x91, 0xAE };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint8_t input[] = { 0xE2, 0x84, 0xA2 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint8_t input[] = { 0xE1, 0xB5, 0xA2 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint8_t input[] = { 0xEF, 0xB8, 0xB5 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint8_t input[] = { 0xEF, 0xBC, 0xA1 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint8_t input[] = { 0xEF, 0xBD, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint8_t input[] = { 0xEF, 0xB9, 0x91 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint8_t input[] = { 0xE3, 0x8E, 0x92 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint8_t input[] = { 0xE2, 0x85, 0x9C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint8_t input[] = { 0xC2, 0xB5 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint8_t input[] = { 0xEF, 0xB7, 0xBA };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint8_t input[] = { 0xEA, 0xB8, 0x80 };
+ static const uint8_t decomposed[] =
+ { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint8_t input[] = { 0xEA, 0xB7, 0xB8 };
+ static const uint8_t decomposed[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C,
+ 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t decomposed[] =
+ { 'G', 'r', 0x75, 0xCC, 0x88, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB8, 0xCC, 0x86,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xAB,
+ 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint8_t *input = (uint8_t *) malloc (2 * (2 * m - 1) * sizeof (uint8_t));
+ if (input != NULL)
+ {
+ uint8_t *expected = input + (2 * m - 1);
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint8_t *p;
+ size_t i;
+
+ input[0] = 0x41;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ for (; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0xC3;
+ expected[1] = 0x80;
+ p = expected + 2;
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ for (i = 0; i < m2 - 1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (check (input, 2 * m - 1, expected, 2 * m - 2) == 0);
+ ASSERT (check (expected, 2 * m - 2, expected, 2 * m - 2) == 0);
+ }
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u8_nfc (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u8-nfd.c b/gnulib/tests/uninorm/test-u8-nfd.c
new file mode 100644
index 00000000..8e4678f8
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u8-nfd.c
@@ -0,0 +1,345 @@
+/* Test of canonical decomposition of UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U8_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_normalize (UNINORM_NFD, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_normalize (UNINORM_NFD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_normalize (UNINORM_NFD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u8_nfd (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint8_t input[] = { 0x20 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint8_t input[] = { 0xC3, 0x84 };
+ static const uint8_t expected[] = { 0x41, 0xCC, 0x88 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint8_t input[] = { 0xC7, 0x9E };
+ static const uint8_t expected[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint8_t input[] = { 0xE1, 0xBF, 0x81 };
+ static const uint8_t expected[] = { 0xC2, 0xA8, 0xCD, 0x82 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint8_t input[] = { 0xE2, 0x84, 0x93 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint8_t input[] = { 0xC2, 0xA0 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAC };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAD };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAB };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAA };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint8_t input[] = { 0xE2, 0x91, 0xAE };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint8_t input[] = { 0xE2, 0x84, 0xA2 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint8_t input[] = { 0xE1, 0xB5, 0xA2 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint8_t input[] = { 0xEF, 0xB8, 0xB5 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint8_t input[] = { 0xEF, 0xBC, 0xA1 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint8_t input[] = { 0xEF, 0xBD, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint8_t input[] = { 0xEF, 0xB9, 0x91 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint8_t input[] = { 0xE3, 0x8E, 0x92 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint8_t input[] = { 0xE2, 0x85, 0x9C };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint8_t input[] = { 0xC2, 0xB5 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint8_t input[] = { 0xEF, 0xB7, 0xBA };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint8_t input[] = { 0xEA, 0xB8, 0x80 };
+ static const uint8_t expected[] =
+ { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint8_t input[] = { 0xEA, 0xB7, 0xB8 };
+ static const uint8_t expected[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C,
+ 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t expected[] =
+ { 'G', 'r', 0x75, 0xCC, 0x88, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB8, 0xCC, 0x86,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xAB,
+ 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint8_t *input = (uint8_t *) malloc (2 * (2 * m - 1) * sizeof (uint8_t));
+ if (input != NULL)
+ {
+ uint8_t *expected = input + (2 * m - 1);
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint8_t *p;
+ size_t i;
+
+ input[0] = 0x41;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ for (; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x41;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+
+ for (; repeat > 0; repeat--)
+ ASSERT (check (input, 2 * m - 1, expected, 2 * m - 1) == 0);
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u8_nfd (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u8-nfkc.c b/gnulib/tests/uninorm/test-u8-nfkc.c
new file mode 100644
index 00000000..38189d5d
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u8-nfkc.c
@@ -0,0 +1,414 @@
+/* Test of compatibility normalization of UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U8_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_normalize (UNINORM_NFKC, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_normalize (UNINORM_NFKC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_normalize (UNINORM_NFKC, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u8_nfkc (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint8_t input[] = { 0x20 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint8_t input[] = { 0xC3, 0x84 };
+ static const uint8_t decomposed[] = { 0x41, 0xCC, 0x88 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint8_t input[] = { 0xC7, 0x9E };
+ static const uint8_t decomposed[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* ANGSTROM SIGN */
+ static const uint8_t input[] = { 0xE2, 0x84, 0xAB };
+ static const uint8_t decomposed[] = { 0x41, 0xCC, 0x8A };
+ static const uint8_t expected[] = { 0xC3, 0x85 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint8_t input[] = { 0xE1, 0xBF, 0x81 };
+ static const uint8_t decomposed[] = { 0x20, 0xCC, 0x88, 0xCD, 0x82 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint8_t input[] = { 0xE2, 0x84, 0x93 };
+ static const uint8_t decomposed[] = { 0x6C };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint8_t input[] = { 0xC2, 0xA0 };
+ static const uint8_t decomposed[] = { 0x20 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAC };
+ static const uint8_t decomposed[] = { 0xDA, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAD };
+ static const uint8_t decomposed[] = { 0xDA, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAB };
+ static const uint8_t decomposed[] = { 0xDA, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAA };
+ static const uint8_t decomposed[] = { 0xDA, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint8_t input[] = { 0xE2, 0x91, 0xAE };
+ static const uint8_t decomposed[] = { 0x31, 0x35 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint8_t input[] = { 0xE2, 0x84, 0xA2 };
+ static const uint8_t decomposed[] = { 0x54, 0x4D };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint8_t input[] = { 0xE1, 0xB5, 0xA2 };
+ static const uint8_t decomposed[] = { 0x69 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint8_t input[] = { 0xEF, 0xB8, 0xB5 };
+ static const uint8_t decomposed[] = { 0x28 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint8_t input[] = { 0xEF, 0xBC, 0xA1 };
+ static const uint8_t decomposed[] = { 0x41 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint8_t input[] = { 0xEF, 0xBD, 0xA4 };
+ static const uint8_t decomposed[] = { 0xE3, 0x80, 0x81 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint8_t input[] = { 0xEF, 0xB9, 0x91 };
+ static const uint8_t decomposed[] = { 0xE3, 0x80, 0x81 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint8_t input[] = { 0xE3, 0x8E, 0x92 };
+ static const uint8_t decomposed[] = { 0x4D, 0x48, 0x7A };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint8_t input[] = { 0xE2, 0x85, 0x9C };
+ static const uint8_t decomposed[] = { 0x33, 0xE2, 0x81, 0x84, 0x38 };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint8_t input[] = { 0xC2, 0xB5 };
+ static const uint8_t decomposed[] = { 0xCE, 0xBC };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint8_t input[] = { 0xEF, 0xB7, 0xBA };
+ static const uint8_t decomposed[] =
+ { 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9,
+ 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87,
+ 0x20, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85
+ };
+ ASSERT (check (input, SIZEOF (input), decomposed, SIZEOF (decomposed)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), decomposed, SIZEOF (decomposed)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint8_t input[] = { 0xEA, 0xB8, 0x80 };
+ static const uint8_t decomposed[] =
+ { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint8_t input[] = { 0xEA, 0xB7, 0xB8 };
+ static const uint8_t decomposed[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C,
+ 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t decomposed[] =
+ { 'G', 'r', 0x75, 0xCC, 0x88, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB8, 0xCC, 0x86,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0x32, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xAB,
+ 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF, '\n'
+ };
+ static const uint8_t expected[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0x32, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C,
+ 0xEA, 0xB8, 0x80, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), expected, SIZEOF (expected)) == 0);
+ ASSERT (check (expected, SIZEOF (expected), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint8_t *input = (uint8_t *) malloc (2 * (2 * m - 1) * sizeof (uint8_t));
+ if (input != NULL)
+ {
+ uint8_t *expected = input + (2 * m - 1);
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint8_t *p;
+ size_t i;
+
+ input[0] = 0x41;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ for (; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0xC3;
+ expected[1] = 0x80;
+ p = expected + 2;
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ for (i = 0; i < m2 - 1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (check (input, 2 * m - 1, expected, 2 * m - 2) == 0);
+ ASSERT (check (expected, 2 * m - 2, expected, 2 * m - 2) == 0);
+ }
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u8_nfkc (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u8-nfkd.c b/gnulib/tests/uninorm/test-u8-nfkd.c
new file mode 100644
index 00000000..fb1df7db
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u8-nfkd.c
@@ -0,0 +1,366 @@
+/* Test of compatibility decomposition of UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#if GNULIB_UNINORM_U8_NORMALIZE
+
+#include "uninorm.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_normalize (UNINORM_NFKD, input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_normalize (UNINORM_NFKD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u8_normalize (UNINORM_NFKD, input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+void
+test_u8_nfkd (void)
+{
+ { /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+ }
+ { /* SPACE */
+ static const uint8_t input[] = { 0x20 };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint8_t input[] = { 0xC3, 0x84 };
+ static const uint8_t expected[] = { 0x41, 0xCC, 0x88 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint8_t input[] = { 0xC7, 0x9E };
+ static const uint8_t expected[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint8_t input[] = { 0xE1, 0xBF, 0x81 };
+ static const uint8_t expected[] = { 0x20, 0xCC, 0x88, 0xCD, 0x82 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SCRIPT SMALL L */
+ static const uint8_t input[] = { 0xE2, 0x84, 0x93 };
+ static const uint8_t expected[] = { 0x6C };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* NO-BREAK SPACE */
+ static const uint8_t input[] = { 0xC2, 0xA0 };
+ static const uint8_t expected[] = { 0x20 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH INITIAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAC };
+ static const uint8_t expected[] = { 0xDA, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH MEDIAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAD };
+ static const uint8_t expected[] = { 0xDA, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH FINAL FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAB };
+ static const uint8_t expected[] = { 0xDA, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LETTER VEH ISOLATED FORM */
+ static const uint8_t input[] = { 0xEF, 0xAD, 0xAA };
+ static const uint8_t expected[] = { 0xDA, 0xA4 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* CIRCLED NUMBER FIFTEEN */
+ static const uint8_t input[] = { 0xE2, 0x91, 0xAE };
+ static const uint8_t expected[] = { 0x31, 0x35 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* TRADE MARK SIGN */
+ static const uint8_t input[] = { 0xE2, 0x84, 0xA2 };
+ static const uint8_t expected[] = { 0x54, 0x4D };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* LATIN SUBSCRIPT SMALL LETTER I */
+ static const uint8_t input[] = { 0xE1, 0xB5, 0xA2 };
+ static const uint8_t expected[] = { 0x69 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS */
+ static const uint8_t input[] = { 0xEF, 0xB8, 0xB5 };
+ static const uint8_t expected[] = { 0x28 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* FULLWIDTH LATIN CAPITAL LETTER A */
+ static const uint8_t input[] = { 0xEF, 0xBC, 0xA1 };
+ static const uint8_t expected[] = { 0x41 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HALFWIDTH IDEOGRAPHIC COMMA */
+ static const uint8_t input[] = { 0xEF, 0xBD, 0xA4 };
+ static const uint8_t expected[] = { 0xE3, 0x80, 0x81 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SMALL IDEOGRAPHIC COMMA */
+ static const uint8_t input[] = { 0xEF, 0xB9, 0x91 };
+ static const uint8_t expected[] = { 0xE3, 0x80, 0x81 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* SQUARE MHZ */
+ static const uint8_t input[] = { 0xE3, 0x8E, 0x92 };
+ static const uint8_t expected[] = { 0x4D, 0x48, 0x7A };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* VULGAR FRACTION THREE EIGHTHS */
+ static const uint8_t input[] = { 0xE2, 0x85, 0x9C };
+ static const uint8_t expected[] = { 0x33, 0xE2, 0x81, 0x84, 0x38 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* MICRO SIGN */
+ static const uint8_t input[] = { 0xC2, 0xB5 };
+ static const uint8_t expected[] = { 0xCE, 0xBC };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM */
+ static const uint8_t input[] = { 0xEF, 0xB7, 0xBA };
+ static const uint8_t expected[] =
+ { 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9,
+ 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87,
+ 0x20, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint8_t input[] = { 0xEA, 0xB8, 0x80 };
+ static const uint8_t expected[] =
+ { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* HANGUL SYLLABLE GEU */
+ static const uint8_t input[] = { 0xEA, 0xB7, 0xB8 };
+ static const uint8_t expected[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C,
+ 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint8_t expected[] =
+ { 'G', 'r', 0x75, 0xCC, 0x88, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.',
+ ' ', 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1,
+ 0x81, 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB8, 0xCC, 0x86,
+ 0xD1, 0x82, 0xD0, 0xB5, '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1,
+ 's', 'q', 'r', 't', '(', 'b', 0x32, '-', '4', 'a', 'c', ')', ')',
+ '/', '(', '2', 'a', ')', ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC,
+ 0xE8, 0xAA, 0x9E, ',', 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xAB,
+ 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+#if HAVE_DECL_ALARM
+ /* Declare failure if test takes too long, by using default abort
+ caused by SIGALRM. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (50);
+#endif
+
+ /* Check that the sorting is not O(n²) but O(n log n). */
+ {
+ int pass;
+ for (pass = 0; pass < 3; pass++)
+ {
+ size_t repeat = 1;
+ size_t m = 100000;
+ uint8_t *input = (uint8_t *) malloc (2 * (2 * m - 1) * sizeof (uint8_t));
+ if (input != NULL)
+ {
+ uint8_t *expected = input + (2 * m - 1);
+ size_t m1 = m / 2;
+ size_t m2 = (m - 1) / 2;
+ /* NB: m1 + m2 == m - 1. */
+ uint8_t *p;
+ size_t i;
+
+ input[0] = 0x41;
+ p = input + 1;
+ switch (pass)
+ {
+ case 0:
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ break;
+
+ case 1:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ break;
+
+ case 2:
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+ for (; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ break;
+
+ default:
+ abort ();
+ }
+
+ expected[0] = 0x41;
+ p = expected + 1;
+ for (i = 0; i < m1; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x99;
+ }
+ for (i = 0; i < m2; i++)
+ {
+ *p++ = 0xCC;
+ *p++ = 0x80;
+ }
+
+ for (; repeat > 0; repeat--)
+ ASSERT (check (input, 2 * m - 1, expected, 2 * m - 1) == 0);
+
+ free (input);
+ }
+ }
+ }
+}
+
+#else
+
+void
+test_u8_nfkd (void)
+{
+}
+
+#endif
diff --git a/gnulib/tests/uninorm/test-u8-normcmp.c b/gnulib/tests/uninorm/test-u8-normcmp.c
new file mode 100644
index 00000000..4f09118f
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u8-normcmp.c
@@ -0,0 +1,116 @@
+/* Test of normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+#include "test-u8-normcmp.h"
+
+static void
+test_nonascii (int (*my_normcmp) (const uint8_t *, size_t, const uint8_t *, size_t, uninorm_t, int *))
+{
+ /* Normalization effects. */
+ {
+ static const uint8_t input1[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e' };
+ static const uint8_t input2[] = { 'H', 'o', 0xCC, 0x88, 'h', 'l', 'e' };
+ static const uint8_t input3[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e', 'n' };
+ static const uint8_t input4[] = { 'H', 'o', 0xCC, 0x88, 'h', 'l', 'e', 'n' };
+ static const uint8_t input5[] = { 'H', 'u', 'r', 'z' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input3, SIZEOF (input3), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input4, SIZEOF (input4), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == -1);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ static const uint8_t input1[] = { 0xC3, 0x84 };
+ static const uint8_t input2[] = { 0x41, 0xCC, 0x88 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ static const uint8_t input1[] = { 0xC7, 0x9E };
+ static const uint8_t input2[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* GREEK DIALYTIKA AND PERISPOMENI */
+ static const uint8_t input1[] = { 0xE1, 0xBF, 0x81 };
+ static const uint8_t input2[] = { 0xC2, 0xA8, 0xCD, 0x82 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEUL */
+ static const uint8_t input1[] = { 0xEA, 0xB8, 0x80 };
+ static const uint8_t input2[] = { 0xEA, 0xB7, 0xB8, 0xE1, 0x86, 0xAF };
+ static const uint8_t input3[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ { /* HANGUL SYLLABLE GEU */
+ static const uint8_t input1[] = { 0xEA, 0xB7, 0xB8 };
+ static const uint8_t input2[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+}
+
+int
+main ()
+{
+ test_ascii (u8_normcmp, UNINORM_NFD);
+ test_nonascii (u8_normcmp);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-u8-normcmp.h b/gnulib/tests/uninorm/test-u8-normcmp.h
new file mode 100644
index 00000000..790e3ae2
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u8-normcmp.h
@@ -0,0 +1,69 @@
+/* Test of normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+static void
+test_ascii (int (*my_normcmp) (const uint8_t *, size_t, const uint8_t *, size_t, uninorm_t, int *),
+ uninorm_t nf)
+{
+ /* Empty string. */
+ {
+ int cmp;
+
+ ASSERT (my_normcmp (NULL, 0, NULL, 0, nf, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+ {
+ static const uint8_t input[] = { 'x', 'y' };
+ int cmp;
+
+ ASSERT (my_normcmp (input, SIZEOF (input), NULL, 0, nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+
+ ASSERT (my_normcmp (NULL, 0, input, SIZEOF (input), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input, SIZEOF (input), input, SIZEOF (input), nf, &cmp) == 0);
+ ASSERT (cmp == 0);
+ }
+
+ /* Normal lexicographic order. */
+ {
+ static const uint8_t input1[] = { 'A', 'm', 'e', 'r', 'i', 'c', 'a' };
+ static const uint8_t input2[] = { 'A', 'm', 'i', 'g', 'o' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+ }
+
+ /* Shorter and longer strings. */
+ {
+ static const uint8_t input1[] = { 'R', 'e', 'a', 'g', 'a', 'n' };
+ static const uint8_t input2[] = { 'R', 'e', 'a', 'g', 'a', 'n', 'o', 'm', 'i', 'c', 's' };
+ int cmp;
+
+ ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), nf, &cmp) == 0);
+ ASSERT (cmp == -1);
+
+ ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), nf, &cmp) == 0);
+ ASSERT (cmp == 1);
+ }
+}
diff --git a/gnulib/tests/uninorm/test-u8-normcoll.c b/gnulib/tests/uninorm/test-u8-normcoll.c
new file mode 100644
index 00000000..d205f286
--- /dev/null
+++ b/gnulib/tests/uninorm/test-u8-normcoll.c
@@ -0,0 +1,35 @@
+/* Test of locale dependent, normalization insensitive comparison of
+ UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include "macros.h"
+
+#include "test-u8-normcmp.h"
+int
+main ()
+{
+ /* In the "C" locale, strcoll is equivalent to strcmp, therefore u8_normcoll
+ on ASCII strings should behave like strcmp as well. */
+ test_ascii (u8_normcoll, UNINORM_NFC);
+
+ return 0;
+}
diff --git a/gnulib/tests/uninorm/test-uninorm-filter-nfc.c b/gnulib/tests/uninorm/test-uninorm-filter-nfc.c
new file mode 100644
index 00000000..65bf8a95
--- /dev/null
+++ b/gnulib/tests/uninorm/test-uninorm-filter-nfc.c
@@ -0,0 +1,109 @@
+/* Test of canonical normalization of streams.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uninorm.h"
+
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+/* A stream of Unicode characters that simply accumulates the contents. */
+
+struct accumulator
+{
+ uint32_t *result;
+ size_t length;
+ size_t allocated;
+};
+
+static int
+write_to_accumulator (void *stream_data, ucs4_t uc)
+{
+ struct accumulator *accu = (struct accumulator *) stream_data;
+
+ if (accu->length == accu->allocated)
+ {
+ accu->allocated = 2 * accu->allocated + 1;
+ accu->result = (uint32_t *) realloc (accu->result, accu->allocated * sizeof (uint32_t));
+ }
+ accu->result[accu->length] = uc;
+ accu->length++;
+ return 0;
+}
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const uint32_t *expected, size_t expected_length)
+{
+ struct accumulator accu;
+ struct uninorm_filter *filter;
+ size_t i;
+
+ accu.result = NULL;
+ accu.length = 0;
+ accu.allocated = 0;
+
+ filter = uninorm_filter_create (UNINORM_NFC, write_to_accumulator, &accu);
+ ASSERT (filter != NULL);
+
+ for (i = 0; i < input_length; i++)
+ ASSERT (uninorm_filter_write (filter, input[i]) == 0);
+
+ ASSERT (uninorm_filter_free (filter) == 0);
+
+ if (!(accu.result != NULL))
+ return 1;
+ if (!(accu.length == expected_length))
+ return 2;
+ if (!(u32_cmp (accu.result, expected, expected_length) == 0))
+ return 3;
+ free (accu.result);
+
+ return 0;
+}
+
+int
+main ()
+{
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t decomposed[] =
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), input, SIZEOF (input)) == 0);
+ ASSERT (check (decomposed, SIZEOF (decomposed), input, SIZEOF (input)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u16-asnprintf1.c b/gnulib/tests/unistdio/test-u16-asnprintf1.c
new file mode 100644
index 00000000..3d4897cb
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-asnprintf1.c
@@ -0,0 +1,46 @@
+/* Test of u16_asnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u16-asnprintf1.h"
+
+static void
+test_asnprintf ()
+{
+ test_function (u16_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_asnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u16-asnprintf1.h b/gnulib/tests/unistdio/test-u16-asnprintf1.h
new file mode 100644
index 00000000..9d557ba8
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-asnprintf1.h
@@ -0,0 +1,60 @@
+/* Test of u16_[v]asnprintf() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_function (uint16_t * (*my_asnprintf) (uint16_t *, size_t *, const char *, ...))
+{
+ uint16_t buf[8];
+ int size;
+
+ /* Test return value convention. */
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length = size;
+ uint16_t *result = my_asnprintf (NULL, &length, "%d", 12345);
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', '5', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == 5);
+ free (result);
+ }
+
+ for (size = 0; size <= 8; size++)
+ {
+ static const uint16_t initializer[] =
+ { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F', 0 };
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', '5', 0 };
+ size_t length;
+ uint16_t *result;
+
+ u16_cpy (buf, initializer, 8);
+ length = size;
+ result = my_asnprintf (buf, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == 5);
+ if (size < 6)
+ ASSERT (result != buf);
+ ASSERT (u16_cmp (buf + size, initializer + size, 8 - size) == 0);
+ if (result != buf)
+ free (result);
+ }
+}
diff --git a/gnulib/tests/unistdio/test-u16-printf1.h b/gnulib/tests/unistdio/test-u16-printf1.h
new file mode 100644
index 00000000..1965ce98
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-printf1.h
@@ -0,0 +1,941 @@
+/* Test of u16_v[a]s[n]printf() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_xfunction (uint16_t * (*my_xasprintf) (const char *, ...))
+{
+ /* Test support of size specifiers as in C99. */
+
+ {
+ uint16_t *result =
+ my_xasprintf ("%ju %d", (uintmax_t) 12345671, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', '5', '6', '7', '1', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint16_t *result =
+ my_xasprintf ("%zu %d", (size_t) 12345672, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', '5', '6', '7', '2', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint16_t *result =
+ my_xasprintf ("%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', '5', '6', '7', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint16_t *result =
+ my_xasprintf ("%Lg %d", (long double) 1.5, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '.', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Hello";
+ {
+ uint16_t *result =
+ my_xasprintf ("%U %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10U %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint16_t *result =
+ my_xasprintf ("%-10U %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', ' ', ' ', ' ', ' ', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint16_t *result =
+ my_xasprintf ("%010U %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+ {
+ uint16_t *result =
+ my_xasprintf ("%lU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10lU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint16_t *result =
+ my_xasprintf ("%-10lU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', ' ', ' ', ' ', ' ', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint16_t *result =
+ my_xasprintf ("%010lU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+ {
+ uint16_t *result =
+ my_xasprintf ("%llU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10llU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint16_t *result =
+ my_xasprintf ("%-10llU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', ' ', ' ', ' ', ' ', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint16_t *result =
+ my_xasprintf ("%010llU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ uint16_t *result =
+ my_xasprintf ("Mr. %s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'M', 'r', '.', ' ', 'R', 'o', 'n', 'a', 'l', 'd',
+ ' ', 'R', 'e', 'a', 'g', 'a', 'n', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("Mr. %20s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'M', 'r', '.', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
+ ' ', 'R', 'o', 'n', 'a', 'l', 'd', ' ', 'R', 'e',
+ 'a', 'g', 'a', 'n', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ uint16_t *result =
+ my_xasprintf ("Mr. %-20s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'M', 'r', '.', ' ', 'R', 'o', 'n', 'a', 'l', 'd',
+ ' ', 'R', 'e', 'a', 'g', 'a', 'n', ' ', ' ', ' ',
+ ' ', ' ', ' ', ' ', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* FLAG_ZERO: no effect. */
+ uint16_t *result =
+ my_xasprintf ("Mr. %020s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'M', 'r', '.', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
+ ' ', 'R', 'o', 'n', 'a', 'l', 'd', ' ', 'R', 'e',
+ 'a', 'g', 'a', 'n', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%a %d", 3.1416015625, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '0', 'x', '1', '.', '9', '2', '2', 'p', '+', '1', ' ', '3', '3', 0 };
+ static const uint16_t expected2[] =
+ { '0', 'x', '3', '.', '2', '4', '4', 'p', '+', '0', ' ', '3', '3', 0 };
+ static const uint16_t expected3[] =
+ { '0', 'x', '6', '.', '4', '8', '8', 'p', '-', '1', ' ', '3', '3', 0 };
+ static const uint16_t expected4[] =
+ { '0', 'x', 'c', '.', '9', '1', 'p', '-', '2', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0
+ || u16_strcmp (result, expected3) == 0
+ || u16_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10a %d", 1.75, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { ' ', ' ', '0', 'x', '1', '.', 'c', 'p', '+', '0', ' ', '3', '3', 0 };
+ static const uint16_t expected2[] =
+ { ' ', ' ', '0', 'x', '3', '.', '8', 'p', '-', '1', ' ', '3', '3', 0 };
+ static const uint16_t expected3[] =
+ { ' ', ' ', ' ', ' ', '0', 'x', '7', 'p', '-', '2', ' ', '3', '3', 0 };
+ static const uint16_t expected4[] =
+ { ' ', ' ', ' ', ' ', '0', 'x', 'e', 'p', '-', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0
+ || u16_strcmp (result, expected3) == 0
+ || u16_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Small precision. */
+ uint16_t *result =
+ my_xasprintf ("%.10a %d", 1.75, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '0', 'x', '1', '.', 'c', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '+', '0', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected2[] =
+ { '0', 'x', '3', '.', '8', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '1', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected3[] =
+ { '0', 'x', '7', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '2', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected4[] =
+ { '0', 'x', 'e', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '3', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0
+ || u16_strcmp (result, expected3) == 0
+ || u16_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Large precision. */
+ uint16_t *result =
+ my_xasprintf ("%.50a %d", 1.75, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '0', 'x', '1', '.', 'c', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '+', '0', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected2[] =
+ { '0', 'x', '3', '.', '8', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '1', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected3[] =
+ { '0', 'x', '7', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '2', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected4[] =
+ { '0', 'x', 'e', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '3', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0
+ || u16_strcmp (result, expected3) == 0
+ || u16_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%La %d", 3.1416015625L, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '0', 'x', '1', '.', '9', '2', '2', 'p', '+', '1',
+ ' ', '3', '3', 0
+ };
+ static const uint16_t expected2[] =
+ { '0', 'x', '3', '.', '2', '4', '4', 'p', '+', '0',
+ ' ', '3', '3', 0
+ };
+ static const uint16_t expected3[] =
+ { '0', 'x', '6', '.', '4', '8', '8', 'p', '-', '1',
+ ' ', '3', '3', 0
+ };
+ static const uint16_t expected4[] =
+ { '0', 'x', 'c', '.', '9', '1', 'p', '-', '2', ' ',
+ '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0
+ || u16_strcmp (result, expected3) == 0
+ || u16_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10La %d", 1.75L, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { ' ', ' ', '0', 'x', '1', '.', 'c', 'p', '+', '0', ' ', '3', '3', 0 };
+ static const uint16_t expected2[] =
+ { ' ', ' ', '0', 'x', '3', '.', '8', 'p', '-', '1', ' ', '3', '3', 0 };
+ static const uint16_t expected3[] =
+ { ' ', ' ', ' ', ' ', '0', 'x', '7', 'p', '-', '2', ' ', '3', '3', 0 };
+ static const uint16_t expected4[] =
+ { ' ', ' ', ' ', ' ', '0', 'x', 'e', 'p', '-', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0
+ || u16_strcmp (result, expected3) == 0
+ || u16_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Small precision. */
+ uint16_t *result =
+ my_xasprintf ("%.10La %d", 1.75L, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '0', 'x', '1', '.', 'c', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '+', '0', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected2[] =
+ { '0', 'x', '3', '.', '8', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '1', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected3[] =
+ { '0', 'x', '7', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '2', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected4[] =
+ { '0', 'x', 'e', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '3', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0
+ || u16_strcmp (result, expected3) == 0
+ || u16_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Large precision. */
+ uint16_t *result =
+ my_xasprintf ("%.50La %d", 1.75L, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '0', 'x', '1', '.', 'c', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '+', '0', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected2[] =
+ { '0', 'x', '3', '.', '8', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '1', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected3[] =
+ { '0', 'x', '7', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '2', ' ', '3', '3',
+ 0
+ };
+ static const uint16_t expected4[] =
+ { '0', 'x', 'e', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '3', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0
+ || u16_strcmp (result, expected3) == 0
+ || u16_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %f format directive. */
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%f %d", 12.75, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10f %d", 1.75, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', '1', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint16_t *result =
+ my_xasprintf ("%.f %d", 1234.0, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%Lf %d", 12.75L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10Lf %d", 1.75L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', '1', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint16_t *result =
+ my_xasprintf ("%.Lf %d", 1234.0L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %F format directive. */
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%F %d", 12.75, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint16_t *result =
+ my_xasprintf ("%.F %d", 1234.0, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%LF %d", 12.75L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint16_t *result =
+ my_xasprintf ("%.LF %d", 1234.0L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '3', '4', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %e format directive. */
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%e %d", 12.75, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '1', '.', '2', '7', '5', '0', '0', '0', 'e', '+',
+ '0', '1', ' ', '3', '3', 0
+ };
+ static const uint16_t expected2[] =
+ { '1', '.', '2', '7', '5', '0', '0', '0', 'e', '+',
+ '0', '0', '1', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%15e %d", 1.75, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { ' ', ' ', ' ', '1', '.', '7', '5', '0', '0', '0',
+ '0', 'e', '+', '0', '0', ' ', '3', '3', 0
+ };
+ static const uint16_t expected2[] =
+ { ' ', ' ', '1', '.', '7', '5', '0', '0', '0', '0',
+ 'e', '+', '0', '0', '0', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint16_t *result =
+ my_xasprintf ("%.e %d", 1234.0, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '1', 'e', '+', '0', '3', ' ', '3', '3', 0 };
+ static const uint16_t expected2[] =
+ { '1', 'e', '+', '0', '0', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%Le %d", 12.75L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '.', '2', '7', '5', '0', '0', '0', 'e', '+',
+ '0', '1', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%15Le %d", 1.75L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', '1', '.', '7', '5', '0', '0', '0',
+ '0', 'e', '+', '0', '0', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint16_t *result =
+ my_xasprintf ("%.Le %d", 1234.0L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', 'e', '+', '0', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %g format directive. */
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%g %d", 12.75, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '.', '7', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10g %d", 1.75, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', ' ', '1', '.', '7', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint16_t *result =
+ my_xasprintf ("%.g %d", 1234.0, 33, 44, 55);
+ static const uint16_t expected1[] =
+ { '1', 'e', '+', '0', '3', ' ', '3', '3', 0 };
+ static const uint16_t expected2[] =
+ { '1', 'e', '+', '0', '0', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected1) == 0
+ || u16_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint16_t *result =
+ my_xasprintf ("%Lg %d", 12.75L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '.', '7', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%10Lg %d", 1.75L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', ' ', '1', '.', '7', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint16_t *result =
+ my_xasprintf ("%.Lg %d", 1234.0L, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', 'e', '+', '0', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %n format directive. */
+
+ {
+ int count = -1;
+ uint16_t *result =
+ my_xasprintf ("%d %n", 123, &count, 33, 44, 55);
+ static const uint16_t expected[] =
+ { '1', '2', '3', ' ', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (count == 4);
+ free (result);
+ }
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ {
+ uint16_t *result =
+ my_xasprintf ("%2$d %1$d", 33, 55);
+ static const uint16_t expected[] =
+ { '5', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the grouping flag. */
+
+ {
+ uint16_t *result =
+ my_xasprintf ("%'d %d", 1234567, 99);
+ ASSERT (result != NULL);
+ ASSERT (result[u16_strlen (result) - 1] == '9');
+ free (result);
+ }
+
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ {
+ uint16_t *result =
+ my_xasprintf ("%U %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%20U %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint16_t *result =
+ my_xasprintf ("%-20U %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint16_t *result =
+ my_xasprintf ("%020U %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ uint16_t *result =
+ my_xasprintf ("%lU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%20lU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint16_t *result =
+ my_xasprintf ("%-20lU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint16_t *result =
+ my_xasprintf ("%020lU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ uint16_t *result =
+ my_xasprintf ("%llU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint16_t *result =
+ my_xasprintf ("%20llU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint16_t *result =
+ my_xasprintf ("%-20llU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint16_t *result =
+ my_xasprintf ("%020llU %d", unicode_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ /* Test non-ASCII characters in the format string. */
+
+ {
+ uint16_t *result =
+ my_xasprintf ("\304rger", 33, 44, 55);
+ ASSERT (result == NULL && errno == EINVAL);
+ }
+}
diff --git a/gnulib/tests/unistdio/test-u16-vasnprintf1.c b/gnulib/tests/unistdio/test-u16-vasnprintf1.c
new file mode 100644
index 00000000..268b32c8
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-vasnprintf1.c
@@ -0,0 +1,75 @@
+/* Test of u16_vasnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u16-asnprintf1.h"
+#include "test-u16-printf1.h"
+
+static uint16_t *
+my_asnprintf (uint16_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint16_t *ret;
+
+ va_start (args, format);
+ ret = u16_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static uint16_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ size_t length;
+ uint16_t *ret;
+
+ va_start (args, format);
+ ret = u16_vasnprintf (NULL, &length, format, args);
+ va_end (args);
+ if (ret != NULL)
+ ASSERT (length == u16_strlen (ret));
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u16-vasnprintf2.c b/gnulib/tests/unistdio/test-u16-vasnprintf2.c
new file mode 100644
index 00000000..c43967cd
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-vasnprintf2.c
@@ -0,0 +1,119 @@
+/* Test of u16_vasnprintf() function in an ISO-8859-1 locale.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <locale.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static void
+test_function (uint16_t * (*my_asnprintf) (uint16_t *, size_t *, const char *, ...))
+{
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ const char *locale_string = "\304rger"; /* Ärger */
+ {
+ size_t length;
+ uint16_t *result =
+ my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 0x00c4, 'r', 'g', 'e', 'r', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == u16_strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ uint16_t *result =
+ my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == u16_strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ uint16_t *result =
+ my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 0x00c4, 'r', 'g', 'e', 'r', ' ', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == u16_strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ uint16_t *result =
+ my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == u16_strlen (result));
+ free (result);
+ }
+ }
+}
+
+static uint16_t *
+my_asnprintf (uint16_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint16_t *ret;
+
+ va_start (args, format);
+ ret = u16_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u16-vasnprintf2.sh b/gnulib/tests/unistdio/test-u16-vasnprintf2.sh
new file mode 100755
index 00000000..418b8aac
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-vasnprintf2.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test whether a traditional french locale is installed.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR != none; then
+ testlocale=$LOCALE_FR
+else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$testlocale \
+./test-u16-vasnprintf1${EXEEXT} \
+ || exit 1
+
+LC_ALL=$testlocale \
+./test-u16-vasnprintf2${EXEEXT}
diff --git a/gnulib/tests/unistdio/test-u16-vasnprintf3.c b/gnulib/tests/unistdio/test-u16-vasnprintf3.c
new file mode 100644
index 00000000..6e741c94
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-vasnprintf3.c
@@ -0,0 +1,119 @@
+/* Test of u16_vasnprintf() function in an UTF-8 locale.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <locale.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static void
+test_function (uint16_t * (*my_asnprintf) (uint16_t *, size_t *, const char *, ...))
+{
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ const char *locale_string = "\303\204rger"; /* Ärger */
+ {
+ size_t length;
+ uint16_t *result =
+ my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 0x00c4, 'r', 'g', 'e', 'r', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == u16_strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ uint16_t *result =
+ my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == u16_strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ uint16_t *result =
+ my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { 0x00c4, 'r', 'g', 'e', 'r', ' ', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == u16_strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ uint16_t *result =
+ my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
+ static const uint16_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u16_strcmp (result, expected) == 0);
+ ASSERT (length == u16_strlen (result));
+ free (result);
+ }
+ }
+}
+
+static uint16_t *
+my_asnprintf (uint16_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint16_t *ret;
+
+ va_start (args, format);
+ ret = u16_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u16-vasnprintf3.sh b/gnulib/tests/unistdio/test-u16-vasnprintf3.sh
new file mode 100755
index 00000000..57488c06
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-vasnprintf3.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test whether a french Unicode locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 != none; then
+ testlocale=$LOCALE_FR_UTF8
+else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$testlocale \
+./test-u16-vasnprintf1${EXEEXT} \
+ || exit 1
+
+LC_ALL=$testlocale \
+./test-u16-vasnprintf3${EXEEXT}
diff --git a/gnulib/tests/unistdio/test-u16-vasprintf1.c b/gnulib/tests/unistdio/test-u16-vasprintf1.c
new file mode 100644
index 00000000..5b602485
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-vasprintf1.c
@@ -0,0 +1,62 @@
+/* Test of u16_vasprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u16-printf1.h"
+
+static uint16_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint16_t *result;
+ int retval;
+
+ va_start (args, format);
+ retval = u16_vasprintf (&result, format, args);
+ va_end (args);
+ if (retval < 0)
+ return NULL;
+ ASSERT (result != NULL);
+ return result;
+}
+
+static void
+test_vasprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u16-vsnprintf1.c b/gnulib/tests/unistdio/test-u16-vsnprintf1.c
new file mode 100644
index 00000000..5c2d86c1
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-vsnprintf1.c
@@ -0,0 +1,71 @@
+/* Test of u16_vsnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "xalloc.h"
+#include "progname.h"
+#include "macros.h"
+
+#include "test-u16-printf1.h"
+
+static uint16_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint16_t buf[1000];
+ int retval;
+ size_t length;
+ uint16_t *result;
+
+ va_start (args, format);
+ retval = u16_vsnprintf (buf, sizeof (buf), format, args);
+ va_end (args);
+ if (retval < 0 || retval >= (int) sizeof (buf))
+ return NULL;
+ length = u16_strlen (buf);
+ result = XNMALLOC (length + 1, uint16_t);
+ u16_cpy (result, buf, length + 1);
+ return result;
+}
+
+static void
+test_vsnprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_vsnprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u16-vsprintf1.c b/gnulib/tests/unistdio/test-u16-vsprintf1.c
new file mode 100644
index 00000000..ad42e074
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u16-vsprintf1.c
@@ -0,0 +1,71 @@
+/* Test of u16_vsprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "xalloc.h"
+#include "progname.h"
+#include "macros.h"
+
+#include "test-u16-printf1.h"
+
+static uint16_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint16_t buf[1000];
+ int retval;
+ size_t length;
+ uint16_t *result;
+
+ va_start (args, format);
+ retval = u16_vsprintf (buf, format, args);
+ va_end (args);
+ if (retval < 0 || retval >= (int) sizeof (buf))
+ return NULL;
+ length = u16_strlen (buf);
+ result = XNMALLOC (length + 1, uint16_t);
+ u16_cpy (result, buf, length + 1);
+ return result;
+}
+
+static void
+test_vsprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_vsprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u32-asnprintf1.c b/gnulib/tests/unistdio/test-u32-asnprintf1.c
new file mode 100644
index 00000000..c17fcc6d
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-asnprintf1.c
@@ -0,0 +1,46 @@
+/* Test of u32_asnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u32-asnprintf1.h"
+
+static void
+test_asnprintf ()
+{
+ test_function (u32_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_asnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u32-asnprintf1.h b/gnulib/tests/unistdio/test-u32-asnprintf1.h
new file mode 100644
index 00000000..9f731161
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-asnprintf1.h
@@ -0,0 +1,60 @@
+/* Test of u32_[v]asnprintf() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_function (uint32_t * (*my_asnprintf) (uint32_t *, size_t *, const char *, ...))
+{
+ uint32_t buf[8];
+ int size;
+
+ /* Test return value convention. */
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length = size;
+ uint32_t *result = my_asnprintf (NULL, &length, "%d", 12345);
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', '5', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == 5);
+ free (result);
+ }
+
+ for (size = 0; size <= 8; size++)
+ {
+ static const uint32_t initializer[] =
+ { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F', 0 };
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', '5', 0 };
+ size_t length;
+ uint32_t *result;
+
+ u32_cpy (buf, initializer, 8);
+ length = size;
+ result = my_asnprintf (buf, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == 5);
+ if (size < 6)
+ ASSERT (result != buf);
+ ASSERT (u32_cmp (buf + size, initializer + size, 8 - size) == 0);
+ if (result != buf)
+ free (result);
+ }
+}
diff --git a/gnulib/tests/unistdio/test-u32-printf1.h b/gnulib/tests/unistdio/test-u32-printf1.h
new file mode 100644
index 00000000..00b9a609
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-printf1.h
@@ -0,0 +1,941 @@
+/* Test of u32_v[a]s[n]printf() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_xfunction (uint32_t * (*my_xasprintf) (const char *, ...))
+{
+ /* Test support of size specifiers as in C99. */
+
+ {
+ uint32_t *result =
+ my_xasprintf ("%ju %d", (uintmax_t) 12345671, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', '5', '6', '7', '1', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint32_t *result =
+ my_xasprintf ("%zu %d", (size_t) 12345672, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', '5', '6', '7', '2', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint32_t *result =
+ my_xasprintf ("%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', '5', '6', '7', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint32_t *result =
+ my_xasprintf ("%Lg %d", (long double) 1.5, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '.', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Hello";
+ {
+ uint32_t *result =
+ my_xasprintf ("%U %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10U %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint32_t *result =
+ my_xasprintf ("%-10U %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', ' ', ' ', ' ', ' ', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint32_t *result =
+ my_xasprintf ("%010U %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+ {
+ uint32_t *result =
+ my_xasprintf ("%lU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10lU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint32_t *result =
+ my_xasprintf ("%-10lU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', ' ', ' ', ' ', ' ', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint32_t *result =
+ my_xasprintf ("%010lU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+ {
+ uint32_t *result =
+ my_xasprintf ("%llU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10llU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint32_t *result =
+ my_xasprintf ("%-10llU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'H', 'e', 'l', 'l', 'o', ' ', ' ', ' ', ' ', ' ', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint32_t *result =
+ my_xasprintf ("%010llU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ uint32_t *result =
+ my_xasprintf ("Mr. %s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'M', 'r', '.', ' ', 'R', 'o', 'n', 'a', 'l', 'd',
+ ' ', 'R', 'e', 'a', 'g', 'a', 'n', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("Mr. %20s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'M', 'r', '.', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
+ ' ', 'R', 'o', 'n', 'a', 'l', 'd', ' ', 'R', 'e',
+ 'a', 'g', 'a', 'n', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ uint32_t *result =
+ my_xasprintf ("Mr. %-20s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'M', 'r', '.', ' ', 'R', 'o', 'n', 'a', 'l', 'd',
+ ' ', 'R', 'e', 'a', 'g', 'a', 'n', ' ', ' ', ' ',
+ ' ', ' ', ' ', ' ', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* FLAG_ZERO: no effect. */
+ uint32_t *result =
+ my_xasprintf ("Mr. %020s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'M', 'r', '.', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
+ ' ', 'R', 'o', 'n', 'a', 'l', 'd', ' ', 'R', 'e',
+ 'a', 'g', 'a', 'n', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%a %d", 3.1416015625, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '0', 'x', '1', '.', '9', '2', '2', 'p', '+', '1', ' ', '3', '3', 0 };
+ static const uint32_t expected2[] =
+ { '0', 'x', '3', '.', '2', '4', '4', 'p', '+', '0', ' ', '3', '3', 0 };
+ static const uint32_t expected3[] =
+ { '0', 'x', '6', '.', '4', '8', '8', 'p', '-', '1', ' ', '3', '3', 0 };
+ static const uint32_t expected4[] =
+ { '0', 'x', 'c', '.', '9', '1', 'p', '-', '2', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0
+ || u32_strcmp (result, expected3) == 0
+ || u32_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10a %d", 1.75, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { ' ', ' ', '0', 'x', '1', '.', 'c', 'p', '+', '0', ' ', '3', '3', 0 };
+ static const uint32_t expected2[] =
+ { ' ', ' ', '0', 'x', '3', '.', '8', 'p', '-', '1', ' ', '3', '3', 0 };
+ static const uint32_t expected3[] =
+ { ' ', ' ', ' ', ' ', '0', 'x', '7', 'p', '-', '2', ' ', '3', '3', 0 };
+ static const uint32_t expected4[] =
+ { ' ', ' ', ' ', ' ', '0', 'x', 'e', 'p', '-', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0
+ || u32_strcmp (result, expected3) == 0
+ || u32_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Small precision. */
+ uint32_t *result =
+ my_xasprintf ("%.10a %d", 1.75, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '0', 'x', '1', '.', 'c', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '+', '0', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected2[] =
+ { '0', 'x', '3', '.', '8', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '1', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected3[] =
+ { '0', 'x', '7', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '2', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected4[] =
+ { '0', 'x', 'e', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '3', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0
+ || u32_strcmp (result, expected3) == 0
+ || u32_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Large precision. */
+ uint32_t *result =
+ my_xasprintf ("%.50a %d", 1.75, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '0', 'x', '1', '.', 'c', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '+', '0', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected2[] =
+ { '0', 'x', '3', '.', '8', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '1', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected3[] =
+ { '0', 'x', '7', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '2', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected4[] =
+ { '0', 'x', 'e', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '3', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0
+ || u32_strcmp (result, expected3) == 0
+ || u32_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%La %d", 3.1416015625L, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '0', 'x', '1', '.', '9', '2', '2', 'p', '+', '1',
+ ' ', '3', '3', 0
+ };
+ static const uint32_t expected2[] =
+ { '0', 'x', '3', '.', '2', '4', '4', 'p', '+', '0',
+ ' ', '3', '3', 0
+ };
+ static const uint32_t expected3[] =
+ { '0', 'x', '6', '.', '4', '8', '8', 'p', '-', '1',
+ ' ', '3', '3', 0
+ };
+ static const uint32_t expected4[] =
+ { '0', 'x', 'c', '.', '9', '1', 'p', '-', '2', ' ',
+ '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0
+ || u32_strcmp (result, expected3) == 0
+ || u32_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10La %d", 1.75L, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { ' ', ' ', '0', 'x', '1', '.', 'c', 'p', '+', '0', ' ', '3', '3', 0 };
+ static const uint32_t expected2[] =
+ { ' ', ' ', '0', 'x', '3', '.', '8', 'p', '-', '1', ' ', '3', '3', 0 };
+ static const uint32_t expected3[] =
+ { ' ', ' ', ' ', ' ', '0', 'x', '7', 'p', '-', '2', ' ', '3', '3', 0 };
+ static const uint32_t expected4[] =
+ { ' ', ' ', ' ', ' ', '0', 'x', 'e', 'p', '-', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0
+ || u32_strcmp (result, expected3) == 0
+ || u32_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Small precision. */
+ uint32_t *result =
+ my_xasprintf ("%.10La %d", 1.75L, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '0', 'x', '1', '.', 'c', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '+', '0', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected2[] =
+ { '0', 'x', '3', '.', '8', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '1', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected3[] =
+ { '0', 'x', '7', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '2', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected4[] =
+ { '0', 'x', 'e', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '3', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0
+ || u32_strcmp (result, expected3) == 0
+ || u32_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Large precision. */
+ uint32_t *result =
+ my_xasprintf ("%.50La %d", 1.75L, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '0', 'x', '1', '.', 'c', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '+', '0', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected2[] =
+ { '0', 'x', '3', '.', '8', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '1', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected3[] =
+ { '0', 'x', '7', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '2', ' ', '3', '3',
+ 0
+ };
+ static const uint32_t expected4[] =
+ { '0', 'x', 'e', '.', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+ '0', '0', '0', '0', 'p', '-', '3', ' ', '3', '3',
+ 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0
+ || u32_strcmp (result, expected3) == 0
+ || u32_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %f format directive. */
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%f %d", 12.75, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10f %d", 1.75, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', '1', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint32_t *result =
+ my_xasprintf ("%.f %d", 1234.0, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%Lf %d", 12.75L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10Lf %d", 1.75L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', '1', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint32_t *result =
+ my_xasprintf ("%.Lf %d", 1234.0L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %F format directive. */
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%F %d", 12.75, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint32_t *result =
+ my_xasprintf ("%.F %d", 1234.0, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%LF %d", 12.75L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '.', '7', '5', '0', '0', '0', '0', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint32_t *result =
+ my_xasprintf ("%.LF %d", 1234.0L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '3', '4', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %e format directive. */
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%e %d", 12.75, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '1', '.', '2', '7', '5', '0', '0', '0', 'e', '+',
+ '0', '1', ' ', '3', '3', 0
+ };
+ static const uint32_t expected2[] =
+ { '1', '.', '2', '7', '5', '0', '0', '0', 'e', '+',
+ '0', '0', '1', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%15e %d", 1.75, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { ' ', ' ', ' ', '1', '.', '7', '5', '0', '0', '0',
+ '0', 'e', '+', '0', '0', ' ', '3', '3', 0
+ };
+ static const uint32_t expected2[] =
+ { ' ', ' ', '1', '.', '7', '5', '0', '0', '0', '0',
+ 'e', '+', '0', '0', '0', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint32_t *result =
+ my_xasprintf ("%.e %d", 1234.0, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '1', 'e', '+', '0', '3', ' ', '3', '3', 0 };
+ static const uint32_t expected2[] =
+ { '1', 'e', '+', '0', '0', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%Le %d", 12.75L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '.', '2', '7', '5', '0', '0', '0', 'e', '+',
+ '0', '1', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%15Le %d", 1.75L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', '1', '.', '7', '5', '0', '0', '0',
+ '0', 'e', '+', '0', '0', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint32_t *result =
+ my_xasprintf ("%.Le %d", 1234.0L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', 'e', '+', '0', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %g format directive. */
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%g %d", 12.75, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '.', '7', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10g %d", 1.75, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', ' ', '1', '.', '7', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint32_t *result =
+ my_xasprintf ("%.g %d", 1234.0, 33, 44, 55);
+ static const uint32_t expected1[] =
+ { '1', 'e', '+', '0', '3', ' ', '3', '3', 0 };
+ static const uint32_t expected2[] =
+ { '1', 'e', '+', '0', '0', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected1) == 0
+ || u32_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint32_t *result =
+ my_xasprintf ("%Lg %d", 12.75L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '.', '7', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%10Lg %d", 1.75L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', ' ', '1', '.', '7', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint32_t *result =
+ my_xasprintf ("%.Lg %d", 1234.0L, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', 'e', '+', '0', '3', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %n format directive. */
+
+ {
+ int count = -1;
+ uint32_t *result =
+ my_xasprintf ("%d %n", 123, &count, 33, 44, 55);
+ static const uint32_t expected[] =
+ { '1', '2', '3', ' ', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (count == 4);
+ free (result);
+ }
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ {
+ uint32_t *result =
+ my_xasprintf ("%2$d %1$d", 33, 55);
+ static const uint32_t expected[] =
+ { '5', '5', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the grouping flag. */
+
+ {
+ uint32_t *result =
+ my_xasprintf ("%'d %d", 1234567, 99);
+ ASSERT (result != NULL);
+ ASSERT (result[u32_strlen (result) - 1] == '9');
+ free (result);
+ }
+
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ {
+ uint32_t *result =
+ my_xasprintf ("%U %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%20U %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint32_t *result =
+ my_xasprintf ("%-20U %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint32_t *result =
+ my_xasprintf ("%020U %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ uint32_t *result =
+ my_xasprintf ("%lU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%20lU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint32_t *result =
+ my_xasprintf ("%-20lU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint32_t *result =
+ my_xasprintf ("%020lU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ uint32_t *result =
+ my_xasprintf ("%llU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint32_t *result =
+ my_xasprintf ("%20llU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint32_t *result =
+ my_xasprintf ("%-20llU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z',
+ 'k', 'o', 'w', 's', 'k', 'i', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint32_t *result =
+ my_xasprintf ("%020llU %d", unicode_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', 'R', 'a', 'f', 'a', 0x0142, ' ',
+ 'M', 'a', 's', 'z', 'k', 'o', 'w', 's', 'k', 'i',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ /* Test non-ASCII characters in the format string. */
+
+ {
+ uint32_t *result =
+ my_xasprintf ("\304rger", 33, 44, 55);
+ ASSERT (result == NULL && errno == EINVAL);
+ }
+}
diff --git a/gnulib/tests/unistdio/test-u32-vasnprintf1.c b/gnulib/tests/unistdio/test-u32-vasnprintf1.c
new file mode 100644
index 00000000..d2aa8796
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-vasnprintf1.c
@@ -0,0 +1,75 @@
+/* Test of u32_vasnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u32-asnprintf1.h"
+#include "test-u32-printf1.h"
+
+static uint32_t *
+my_asnprintf (uint32_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint32_t *ret;
+
+ va_start (args, format);
+ ret = u32_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static uint32_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ size_t length;
+ uint32_t *ret;
+
+ va_start (args, format);
+ ret = u32_vasnprintf (NULL, &length, format, args);
+ va_end (args);
+ if (ret != NULL)
+ ASSERT (length == u32_strlen (ret));
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u32-vasnprintf2.c b/gnulib/tests/unistdio/test-u32-vasnprintf2.c
new file mode 100644
index 00000000..c418e0a4
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-vasnprintf2.c
@@ -0,0 +1,119 @@
+/* Test of u32_vasnprintf() function in an ISO-8859-1 locale.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <locale.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static void
+test_function (uint32_t * (*my_asnprintf) (uint32_t *, size_t *, const char *, ...))
+{
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ const char *locale_string = "\304rger"; /* Ärger */
+ {
+ size_t length;
+ uint32_t *result =
+ my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 0x00c4, 'r', 'g', 'e', 'r', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == u32_strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ uint32_t *result =
+ my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == u32_strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ uint32_t *result =
+ my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 0x00c4, 'r', 'g', 'e', 'r', ' ', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == u32_strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ uint32_t *result =
+ my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == u32_strlen (result));
+ free (result);
+ }
+ }
+}
+
+static uint32_t *
+my_asnprintf (uint32_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint32_t *ret;
+
+ va_start (args, format);
+ ret = u32_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u32-vasnprintf2.sh b/gnulib/tests/unistdio/test-u32-vasnprintf2.sh
new file mode 100755
index 00000000..ae39dd48
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-vasnprintf2.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test whether a traditional french locale is installed.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR != none; then
+ testlocale=$LOCALE_FR
+else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$testlocale \
+./test-u32-vasnprintf1${EXEEXT} \
+ || exit 1
+
+LC_ALL=$testlocale \
+./test-u32-vasnprintf2${EXEEXT}
diff --git a/gnulib/tests/unistdio/test-u32-vasnprintf3.c b/gnulib/tests/unistdio/test-u32-vasnprintf3.c
new file mode 100644
index 00000000..f4b92d73
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-vasnprintf3.c
@@ -0,0 +1,119 @@
+/* Test of u32_vasnprintf() function in an UTF-8 locale.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <locale.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static void
+test_function (uint32_t * (*my_asnprintf) (uint32_t *, size_t *, const char *, ...))
+{
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ const char *locale_string = "\303\204rger"; /* Ärger */
+ {
+ size_t length;
+ uint32_t *result =
+ my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 0x00c4, 'r', 'g', 'e', 'r', ' ', '3', '3', 0 };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == u32_strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ uint32_t *result =
+ my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == u32_strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ uint32_t *result =
+ my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { 0x00c4, 'r', 'g', 'e', 'r', ' ', ' ', ' ', ' ', ' ',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == u32_strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ uint32_t *result =
+ my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
+ static const uint32_t expected[] =
+ { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
+ ' ', '3', '3', 0
+ };
+ ASSERT (result != NULL);
+ ASSERT (u32_strcmp (result, expected) == 0);
+ ASSERT (length == u32_strlen (result));
+ free (result);
+ }
+ }
+}
+
+static uint32_t *
+my_asnprintf (uint32_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint32_t *ret;
+
+ va_start (args, format);
+ ret = u32_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u32-vasnprintf3.sh b/gnulib/tests/unistdio/test-u32-vasnprintf3.sh
new file mode 100755
index 00000000..d2c31170
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-vasnprintf3.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test whether a french Unicode locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 != none; then
+ testlocale=$LOCALE_FR_UTF8
+else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$testlocale \
+./test-u32-vasnprintf1${EXEEXT} \
+ || exit 1
+
+LC_ALL=$testlocale \
+./test-u32-vasnprintf3${EXEEXT}
diff --git a/gnulib/tests/unistdio/test-u32-vasprintf1.c b/gnulib/tests/unistdio/test-u32-vasprintf1.c
new file mode 100644
index 00000000..41c30571
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-vasprintf1.c
@@ -0,0 +1,62 @@
+/* Test of u32_vasprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u32-printf1.h"
+
+static uint32_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint32_t *result;
+ int retval;
+
+ va_start (args, format);
+ retval = u32_vasprintf (&result, format, args);
+ va_end (args);
+ if (retval < 0)
+ return NULL;
+ ASSERT (result != NULL);
+ return result;
+}
+
+static void
+test_vasprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u32-vsnprintf1.c b/gnulib/tests/unistdio/test-u32-vsnprintf1.c
new file mode 100644
index 00000000..53317cfd
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-vsnprintf1.c
@@ -0,0 +1,71 @@
+/* Test of u32_vsnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "xalloc.h"
+#include "progname.h"
+#include "macros.h"
+
+#include "test-u32-printf1.h"
+
+static uint32_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint32_t buf[1000];
+ int retval;
+ size_t length;
+ uint32_t *result;
+
+ va_start (args, format);
+ retval = u32_vsnprintf (buf, sizeof (buf), format, args);
+ va_end (args);
+ if (retval < 0 || retval >= (int) sizeof (buf))
+ return NULL;
+ length = u32_strlen (buf);
+ result = XNMALLOC (length + 1, uint32_t);
+ u32_cpy (result, buf, length + 1);
+ return result;
+}
+
+static void
+test_vsnprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_vsnprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u32-vsprintf1.c b/gnulib/tests/unistdio/test-u32-vsprintf1.c
new file mode 100644
index 00000000..c9512e83
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u32-vsprintf1.c
@@ -0,0 +1,71 @@
+/* Test of u32_vsprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "xalloc.h"
+#include "progname.h"
+#include "macros.h"
+
+#include "test-u32-printf1.h"
+
+static uint32_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint32_t buf[1000];
+ int retval;
+ size_t length;
+ uint32_t *result;
+
+ va_start (args, format);
+ retval = u32_vsprintf (buf, format, args);
+ va_end (args);
+ if (retval < 0 || retval >= (int) sizeof (buf))
+ return NULL;
+ length = u32_strlen (buf);
+ result = XNMALLOC (length + 1, uint32_t);
+ u32_cpy (result, buf, length + 1);
+ return result;
+}
+
+static void
+test_vsprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_vsprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u8-asnprintf1.c b/gnulib/tests/unistdio/test-u8-asnprintf1.c
new file mode 100644
index 00000000..983cddf3
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-asnprintf1.c
@@ -0,0 +1,46 @@
+/* Test of u8_asnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u8-asnprintf1.h"
+
+static void
+test_asnprintf ()
+{
+ test_function (u8_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_asnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u8-asnprintf1.h b/gnulib/tests/unistdio/test-u8-asnprintf1.h
new file mode 100644
index 00000000..d4df3a3f
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-asnprintf1.h
@@ -0,0 +1,57 @@
+/* Test of u8_[v]asnprintf() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_function (uint8_t * (*my_asnprintf) (uint8_t *, size_t *, const char *, ...))
+{
+ uint8_t buf[8];
+ int size;
+
+ /* Test return value convention. */
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length = size;
+ uint8_t *result = my_asnprintf (NULL, &length, "%d", 12345);
+ static const uint8_t expected[] = "12345";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == 5);
+ free (result);
+ }
+
+ for (size = 0; size <= 8; size++)
+ {
+ static const uint8_t initializer[] = "DEADBEEF";
+ static const uint8_t expected[] = "12345";
+ size_t length;
+ uint8_t *result;
+
+ u8_cpy (buf, initializer, 8);
+ length = size;
+ result = my_asnprintf (buf, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == 5);
+ if (size < 6)
+ ASSERT (result != buf);
+ ASSERT (u8_cmp (buf + size, initializer + size, 8 - size) == 0);
+ if (result != buf)
+ free (result);
+ }
+}
diff --git a/gnulib/tests/unistdio/test-u8-printf1.h b/gnulib/tests/unistdio/test-u8-printf1.h
new file mode 100644
index 00000000..23dc5a6e
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-printf1.h
@@ -0,0 +1,704 @@
+/* Test of u8_v[a]s[n]printf() function.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_xfunction (uint8_t * (*my_xasprintf) (const char *, ...))
+{
+ /* Test support of size specifiers as in C99. */
+
+ {
+ uint8_t *result =
+ my_xasprintf ("%ju %d", (uintmax_t) 12345671, 33, 44, 55);
+ static const uint8_t expected[] = "12345671 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint8_t *result =
+ my_xasprintf ("%zu %d", (size_t) 12345672, 33, 44, 55);
+ static const uint8_t expected[] = "12345672 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint8_t *result =
+ my_xasprintf ("%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
+ static const uint8_t expected[] = "12345673 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ {
+ uint8_t *result =
+ my_xasprintf ("%Lg %d", (long double) 1.5, 33, 44, 55);
+ static const uint8_t expected[] = "1.5 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Hello";
+ {
+ uint8_t *result =
+ my_xasprintf ("%U %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10U %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint8_t *result =
+ my_xasprintf ("%-10U %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint8_t *result =
+ my_xasprintf ("%010U %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+ {
+ uint8_t *result =
+ my_xasprintf ("%lU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10lU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint8_t *result =
+ my_xasprintf ("%-10lU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint8_t *result =
+ my_xasprintf ("%010lU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+ {
+ uint8_t *result =
+ my_xasprintf ("%llU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10llU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint8_t *result =
+ my_xasprintf ("%-10llU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint8_t *result =
+ my_xasprintf ("%010llU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Hello 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ uint8_t *result =
+ my_xasprintf ("Mr. %s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint8_t expected[] = "Mr. Ronald Reagan 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("Mr. %20s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint8_t expected[] = "Mr. Ronald Reagan 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ uint8_t *result =
+ my_xasprintf ("Mr. %-20s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint8_t expected[] = "Mr. Ronald Reagan 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* FLAG_ZERO: no effect. */
+ uint8_t *result =
+ my_xasprintf ("Mr. %020s %d", "Ronald Reagan", 33, 44, 55);
+ static const uint8_t expected[] = "Mr. Ronald Reagan 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%a %d", 3.1416015625, 33, 44, 55);
+ static const uint8_t expected1[] = "0x1.922p+1 33";
+ static const uint8_t expected2[] = "0x3.244p+0 33";
+ static const uint8_t expected3[] = "0x6.488p-1 33";
+ static const uint8_t expected4[] = "0xc.91p-2 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0
+ || u8_strcmp (result, expected3) == 0
+ || u8_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10a %d", 1.75, 33, 44, 55);
+ static const uint8_t expected1[] = " 0x1.cp+0 33";
+ static const uint8_t expected2[] = " 0x3.8p-1 33";
+ static const uint8_t expected3[] = " 0x7p-2 33";
+ static const uint8_t expected4[] = " 0xep-3 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0
+ || u8_strcmp (result, expected3) == 0
+ || u8_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Small precision. */
+ uint8_t *result =
+ my_xasprintf ("%.10a %d", 1.75, 33, 44, 55);
+ static const uint8_t expected1[] = "0x1.c000000000p+0 33";
+ static const uint8_t expected2[] = "0x3.8000000000p-1 33";
+ static const uint8_t expected3[] = "0x7.0000000000p-2 33";
+ static const uint8_t expected4[] = "0xe.0000000000p-3 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0
+ || u8_strcmp (result, expected3) == 0
+ || u8_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Large precision. */
+ uint8_t *result =
+ my_xasprintf ("%.50a %d", 1.75, 33, 44, 55);
+ static const uint8_t expected1[] = "0x1.c0000000000000000000000000000000000000000000000000p+0 33";
+ static const uint8_t expected2[] = "0x3.80000000000000000000000000000000000000000000000000p-1 33";
+ static const uint8_t expected3[] = "0x7.00000000000000000000000000000000000000000000000000p-2 33";
+ static const uint8_t expected4[] = "0xe.00000000000000000000000000000000000000000000000000p-3 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0
+ || u8_strcmp (result, expected3) == 0
+ || u8_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%La %d", 3.1416015625L, 33, 44, 55);
+ static const uint8_t expected1[] = "0x1.922p+1 33";
+ static const uint8_t expected2[] = "0x3.244p+0 33";
+ static const uint8_t expected3[] = "0x6.488p-1 33";
+ static const uint8_t expected4[] = "0xc.91p-2 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0
+ || u8_strcmp (result, expected3) == 0
+ || u8_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10La %d", 1.75L, 33, 44, 55);
+ static const uint8_t expected1[] = " 0x1.cp+0 33";
+ static const uint8_t expected2[] = " 0x3.8p-1 33";
+ static const uint8_t expected3[] = " 0x7p-2 33";
+ static const uint8_t expected4[] = " 0xep-3 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0
+ || u8_strcmp (result, expected3) == 0
+ || u8_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Small precision. */
+ uint8_t *result =
+ my_xasprintf ("%.10La %d", 1.75L, 33, 44, 55);
+ static const uint8_t expected1[] = "0x1.c000000000p+0 33";
+ static const uint8_t expected2[] = "0x3.8000000000p-1 33";
+ static const uint8_t expected3[] = "0x7.0000000000p-2 33";
+ static const uint8_t expected4[] = "0xe.0000000000p-3 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0
+ || u8_strcmp (result, expected3) == 0
+ || u8_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ { /* Large precision. */
+ uint8_t *result =
+ my_xasprintf ("%.50La %d", 1.75L, 33, 44, 55);
+ static const uint8_t expected1[] = "0x1.c0000000000000000000000000000000000000000000000000p+0 33";
+ static const uint8_t expected2[] = "0x3.80000000000000000000000000000000000000000000000000p-1 33";
+ static const uint8_t expected3[] = "0x7.00000000000000000000000000000000000000000000000000p-2 33";
+ static const uint8_t expected4[] = "0xe.00000000000000000000000000000000000000000000000000p-3 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0
+ || u8_strcmp (result, expected3) == 0
+ || u8_strcmp (result, expected4) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %f format directive. */
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%f %d", 12.75, 33, 44, 55);
+ static const uint8_t expected[] = "12.750000 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10f %d", 1.75, 33, 44, 55);
+ static const uint8_t expected[] = " 1.750000 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint8_t *result =
+ my_xasprintf ("%.f %d", 1234.0, 33, 44, 55);
+ static const uint8_t expected[] = "1234 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%Lf %d", 12.75L, 33, 44, 55);
+ static const uint8_t expected[] = "12.750000 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10Lf %d", 1.75L, 33, 44, 55);
+ static const uint8_t expected[] = " 1.750000 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint8_t *result =
+ my_xasprintf ("%.Lf %d", 1234.0L, 33, 44, 55);
+ static const uint8_t expected[] = "1234 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %F format directive. */
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%F %d", 12.75, 33, 44, 55);
+ static const uint8_t expected[] = "12.750000 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint8_t *result =
+ my_xasprintf ("%.F %d", 1234.0, 33, 44, 55);
+ static const uint8_t expected[] = "1234 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%LF %d", 12.75L, 33, 44, 55);
+ static const uint8_t expected[] = "12.750000 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint8_t *result =
+ my_xasprintf ("%.LF %d", 1234.0L, 33, 44, 55);
+ static const uint8_t expected[] = "1234 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %e format directive. */
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%e %d", 12.75, 33, 44, 55);
+ static const uint8_t expected1[] = "1.275000e+01 33";
+ static const uint8_t expected2[] = "1.275000e+001 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%15e %d", 1.75, 33, 44, 55);
+ static const uint8_t expected1[] = " 1.750000e+00 33";
+ static const uint8_t expected2[] = " 1.750000e+000 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint8_t *result =
+ my_xasprintf ("%.e %d", 1234.0, 33, 44, 55);
+ static const uint8_t expected1[] = "1e+03 33";
+ static const uint8_t expected2[] = "1e+003 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%Le %d", 12.75L, 33, 44, 55);
+ static const uint8_t expected[] = "1.275000e+01 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%15Le %d", 1.75L, 33, 44, 55);
+ static const uint8_t expected[] = " 1.750000e+00 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint8_t *result =
+ my_xasprintf ("%.Le %d", 1234.0L, 33, 44, 55);
+ static const uint8_t expected[] = "1e+03 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %g format directive. */
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%g %d", 12.75, 33, 44, 55);
+ static const uint8_t expected[] = "12.75 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10g %d", 1.75, 33, 44, 55);
+ static const uint8_t expected[] = " 1.75 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint8_t *result =
+ my_xasprintf ("%.g %d", 1234.0, 33, 44, 55);
+ static const uint8_t expected1[] = "1e+03 33";
+ static const uint8_t expected2[] = "1e+003 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected1) == 0
+ || u8_strcmp (result, expected2) == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ uint8_t *result =
+ my_xasprintf ("%Lg %d", 12.75L, 33, 44, 55);
+ static const uint8_t expected[] = "12.75 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%10Lg %d", 1.75L, 33, 44, 55);
+ static const uint8_t expected[] = " 1.75 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ uint8_t *result =
+ my_xasprintf ("%.Lg %d", 1234.0L, 33, 44, 55);
+ static const uint8_t expected[] = "1e+03 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the %n format directive. */
+
+ {
+ int count = -1;
+ uint8_t *result =
+ my_xasprintf ("%d %n", 123, &count, 33, 44, 55);
+ static const uint8_t expected[] = "123 ";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (count == 4);
+ free (result);
+ }
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ {
+ uint8_t *result =
+ my_xasprintf ("%2$d %1$d", 33, 55);
+ static const uint8_t expected[] = "55 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+
+ /* Test the support of the grouping flag. */
+
+ {
+ uint8_t *result =
+ my_xasprintf ("%'d %d", 1234567, 99);
+ ASSERT (result != NULL);
+ ASSERT (result[u8_strlen (result) - 1] == '9');
+ free (result);
+ }
+
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ {
+ uint8_t *result =
+ my_xasprintf ("%U %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%20U %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint8_t *result =
+ my_xasprintf ("%-20U %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint8_t *result =
+ my_xasprintf ("%020U %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ uint8_t *result =
+ my_xasprintf ("%lU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%20lU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint8_t *result =
+ my_xasprintf ("%-20lU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint8_t *result =
+ my_xasprintf ("%020lU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ uint8_t *result =
+ my_xasprintf ("%llU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* Width. */
+ uint8_t *result =
+ my_xasprintf ("%20llU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ uint8_t *result =
+ my_xasprintf ("%-20llU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = "Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ uint8_t *result =
+ my_xasprintf ("%020llU %d", unicode_string, 33, 44, 55);
+ static const uint8_t expected[] = " Rafa\305\202 Maszkowski 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ free (result);
+ }
+ }
+
+ /* Test non-ASCII characters in the format string. */
+
+ {
+ uint8_t *result =
+ my_xasprintf ("\304rger", 33, 44, 55);
+ ASSERT (result == NULL && errno == EINVAL);
+ }
+}
diff --git a/gnulib/tests/unistdio/test-u8-vasnprintf1.c b/gnulib/tests/unistdio/test-u8-vasnprintf1.c
new file mode 100644
index 00000000..03c73a0d
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-vasnprintf1.c
@@ -0,0 +1,75 @@
+/* Test of u8_vasnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u8-asnprintf1.h"
+#include "test-u8-printf1.h"
+
+static uint8_t *
+my_asnprintf (uint8_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint8_t *ret;
+
+ va_start (args, format);
+ ret = u8_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static uint8_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ size_t length;
+ uint8_t *ret;
+
+ va_start (args, format);
+ ret = u8_vasnprintf (NULL, &length, format, args);
+ va_end (args);
+ if (ret != NULL)
+ ASSERT (length == u8_strlen (ret));
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u8-vasnprintf2.c b/gnulib/tests/unistdio/test-u8-vasnprintf2.c
new file mode 100644
index 00000000..d801ee6a
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-vasnprintf2.c
@@ -0,0 +1,109 @@
+/* Test of u8_vasnprintf() function in an ISO-8859-1 locale.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <locale.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static void
+test_function (uint8_t * (*my_asnprintf) (uint8_t *, size_t *, const char *, ...))
+{
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ const char *locale_string = "\304rger"; /* Ärger */
+ {
+ size_t length;
+ uint8_t *result =
+ my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
+ static const uint8_t expected[] = "\303\204rger 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == u8_strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ uint8_t *result =
+ my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
+ static const uint8_t expected[] = " \303\204rger 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == u8_strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ uint8_t *result =
+ my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
+ static const uint8_t expected[] = "\303\204rger 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == u8_strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ uint8_t *result =
+ my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
+ static const uint8_t expected[] = " \303\204rger 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == u8_strlen (result));
+ free (result);
+ }
+ }
+}
+
+static uint8_t *
+my_asnprintf (uint8_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint8_t *ret;
+
+ va_start (args, format);
+ ret = u8_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u8-vasnprintf2.sh b/gnulib/tests/unistdio/test-u8-vasnprintf2.sh
new file mode 100755
index 00000000..ea5fcb08
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-vasnprintf2.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test whether a traditional french locale is installed.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR != none; then
+ testlocale=$LOCALE_FR
+else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$testlocale \
+./test-u8-vasnprintf1${EXEEXT} \
+ || exit 1
+
+LC_ALL=$testlocale \
+./test-u8-vasnprintf2${EXEEXT}
diff --git a/gnulib/tests/unistdio/test-u8-vasnprintf3.c b/gnulib/tests/unistdio/test-u8-vasnprintf3.c
new file mode 100644
index 00000000..752c4c57
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-vasnprintf3.c
@@ -0,0 +1,109 @@
+/* Test of u8_vasnprintf() function in an UTF-8 locale.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <locale.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+static void
+test_function (uint8_t * (*my_asnprintf) (uint8_t *, size_t *, const char *, ...))
+{
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ const char *locale_string = "\303\204rger"; /* Ärger */
+ {
+ size_t length;
+ uint8_t *result =
+ my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
+ static const uint8_t expected[] = "\303\204rger 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == u8_strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ uint8_t *result =
+ my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
+ static const uint8_t expected[] = " \303\204rger 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == u8_strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ uint8_t *result =
+ my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
+ static const uint8_t expected[] = "\303\204rger 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == u8_strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ uint8_t *result =
+ my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
+ static const uint8_t expected[] = " \303\204rger 33";
+ ASSERT (result != NULL);
+ ASSERT (u8_strcmp (result, expected) == 0);
+ ASSERT (length == u8_strlen (result));
+ free (result);
+ }
+ }
+}
+
+static uint8_t *
+my_asnprintf (uint8_t *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ uint8_t *ret;
+
+ va_start (args, format);
+ ret = u8_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u8-vasnprintf3.sh b/gnulib/tests/unistdio/test-u8-vasnprintf3.sh
new file mode 100755
index 00000000..9df0044a
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-vasnprintf3.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test whether a french Unicode locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 != none; then
+ testlocale=$LOCALE_FR_UTF8
+else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$testlocale \
+./test-u8-vasnprintf1${EXEEXT} \
+ || exit 1
+
+LC_ALL=$testlocale \
+./test-u8-vasnprintf3${EXEEXT}
diff --git a/gnulib/tests/unistdio/test-u8-vasprintf1.c b/gnulib/tests/unistdio/test-u8-vasprintf1.c
new file mode 100644
index 00000000..4076db56
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-vasprintf1.c
@@ -0,0 +1,62 @@
+/* Test of u8_vasprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "macros.h"
+
+#include "test-u8-printf1.h"
+
+static uint8_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint8_t *result;
+ int retval;
+
+ va_start (args, format);
+ retval = u8_vasprintf (&result, format, args);
+ va_end (args);
+ if (retval < 0)
+ return NULL;
+ ASSERT (result != NULL);
+ return result;
+}
+
+static void
+test_vasprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u8-vsnprintf1.c b/gnulib/tests/unistdio/test-u8-vsnprintf1.c
new file mode 100644
index 00000000..1ae5876c
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-vsnprintf1.c
@@ -0,0 +1,71 @@
+/* Test of u8_vsnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "xalloc.h"
+#include "progname.h"
+#include "macros.h"
+
+#include "test-u8-printf1.h"
+
+static uint8_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint8_t buf[1000];
+ int retval;
+ size_t length;
+ uint8_t *result;
+
+ va_start (args, format);
+ retval = u8_vsnprintf (buf, sizeof (buf), format, args);
+ va_end (args);
+ if (retval < 0 || retval >= (int) sizeof (buf))
+ return NULL;
+ length = u8_strlen (buf);
+ result = XNMALLOC (length + 1, uint8_t);
+ u8_cpy (result, buf, length + 1);
+ return result;
+}
+
+static void
+test_vsnprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_vsnprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-u8-vsprintf1.c b/gnulib/tests/unistdio/test-u8-vsprintf1.c
new file mode 100644
index 00000000..3e13fecc
--- /dev/null
+++ b/gnulib/tests/unistdio/test-u8-vsprintf1.c
@@ -0,0 +1,71 @@
+/* Test of u8_vsprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "xalloc.h"
+#include "progname.h"
+#include "macros.h"
+
+#include "test-u8-printf1.h"
+
+static uint8_t *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ uint8_t buf[1000];
+ int retval;
+ size_t length;
+ uint8_t *result;
+
+ va_start (args, format);
+ retval = u8_vsprintf (buf, format, args);
+ va_end (args);
+ if (retval < 0 || retval >= (int) sizeof (buf))
+ return NULL;
+ length = u8_strlen (buf);
+ result = XNMALLOC (length + 1, uint8_t);
+ u8_cpy (result, buf, length + 1);
+ return result;
+}
+
+static void
+test_vsprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_vsprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-ulc-asnprintf1.c b/gnulib/tests/unistdio/test-ulc-asnprintf1.c
new file mode 100644
index 00000000..b9bd2ef7
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-asnprintf1.c
@@ -0,0 +1,44 @@
+/* Test of ulc_asnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-ulc-asnprintf1.h"
+
+static void
+test_asnprintf ()
+{
+ test_function (ulc_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_asnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-ulc-asnprintf1.h b/gnulib/tests/unistdio/test-ulc-asnprintf1.h
new file mode 100644
index 00000000..eb682486
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-asnprintf1.h
@@ -0,0 +1,54 @@
+/* Test of ulc_[v]asnprintf() functions.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
+{
+ char buf[8];
+ int size;
+
+ /* Test return value convention. */
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length = size;
+ char *result = my_asnprintf (NULL, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ ASSERT (length == 5);
+ free (result);
+ }
+
+ for (size = 0; size <= 8; size++)
+ {
+ size_t length;
+ char *result;
+
+ memcpy (buf, "DEADBEEF", 8);
+ length = size;
+ result = my_asnprintf (buf, &length, "%d", 12345);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345") == 0);
+ ASSERT (length == 5);
+ if (size < 6)
+ ASSERT (result != buf);
+ ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
+ if (result != buf)
+ free (result);
+ }
+}
diff --git a/gnulib/tests/unistdio/test-ulc-printf1.h b/gnulib/tests/unistdio/test-ulc-printf1.h
new file mode 100644
index 00000000..12149a4a
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-printf1.h
@@ -0,0 +1,498 @@
+/* Test of ulc_v[a]s[n]printf() functions.
+ Copyright (C) 2007, 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+static void
+test_xfunction (char * (*my_xasprintf) (const char *, ...))
+{
+ /* Test support of size specifiers as in C99. */
+
+ {
+ char *result =
+ my_xasprintf ("%ju %d", (uintmax_t) 12345671, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345671 33") == 0);
+ free (result);
+ }
+
+ {
+ char *result =
+ my_xasprintf ("%zu %d", (size_t) 12345672, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345672 33") == 0);
+ free (result);
+ }
+
+ {
+ char *result =
+ my_xasprintf ("%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12345673 33") == 0);
+ free (result);
+ }
+
+ {
+ char *result =
+ my_xasprintf ("%Lg %d", (long double) 1.5, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.5 33") == 0);
+ free (result);
+ }
+
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Hello";
+ {
+ char *result =
+ my_xasprintf ("%U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Hello 33") == 0);
+ free (result);
+ }
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Hello 33") == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ char *result =
+ my_xasprintf ("%-10U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Hello 33") == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ char *result =
+ my_xasprintf ("%010U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Hello 33") == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+ {
+ char *result =
+ my_xasprintf ("%lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Hello 33") == 0);
+ free (result);
+ }
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Hello 33") == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ char *result =
+ my_xasprintf ("%-10lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Hello 33") == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ char *result =
+ my_xasprintf ("%010lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Hello 33") == 0);
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+ {
+ char *result =
+ my_xasprintf ("%llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Hello 33") == 0);
+ free (result);
+ }
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Hello 33") == 0);
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ char *result =
+ my_xasprintf ("%-10llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Hello 33") == 0);
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ char *result =
+ my_xasprintf ("%010llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Hello 33") == 0);
+ free (result);
+ }
+ }
+
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ char *result =
+ my_xasprintf ("Mr. %s %d", "Ronald Reagan", 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Mr. Ronald Reagan 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("Mr. %20s %d", "Ronald Reagan", 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Mr. Ronald Reagan 33") == 0);
+ free (result);
+ }
+
+ { /* FLAG_LEFT. */
+ char *result =
+ my_xasprintf ("Mr. %-20s %d", "Ronald Reagan", 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Mr. Ronald Reagan 33") == 0);
+ free (result);
+ }
+
+ { /* FLAG_ZERO: no effect. */
+ char *result =
+ my_xasprintf ("Mr. %020s %d", "Ronald Reagan", 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Mr. Ronald Reagan 33") == 0);
+ free (result);
+ }
+
+ /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
+ output of floating-point numbers. */
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%a %d", 3.1416015625, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ free (result);
+ }
+
+ { /* Small precision. */
+ char *result =
+ my_xasprintf ("%.10a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ free (result);
+ }
+
+ { /* Large precision. */
+ char *result =
+ my_xasprintf ("%.50a %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%La %d", 3.1416015625L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.922p+1 33") == 0
+ || strcmp (result, "0x3.244p+0 33") == 0
+ || strcmp (result, "0x6.488p-1 33") == 0
+ || strcmp (result, "0xc.91p-2 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
+ || strcmp (result, " 0x3.8p-1 33") == 0
+ || strcmp (result, " 0x7p-2 33") == 0
+ || strcmp (result, " 0xep-3 33") == 0);
+ free (result);
+ }
+
+ { /* Small precision. */
+ char *result =
+ my_xasprintf ("%.10La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
+ || strcmp (result, "0x3.8000000000p-1 33") == 0
+ || strcmp (result, "0x7.0000000000p-2 33") == 0
+ || strcmp (result, "0xe.0000000000p-3 33") == 0);
+ free (result);
+ }
+
+ { /* Large precision. */
+ char *result =
+ my_xasprintf ("%.50La %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
+ || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
+ || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
+ || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
+ free (result);
+ }
+
+ /* Test the support of the %f format directive. */
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%f %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10f %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result =
+ my_xasprintf ("%.f %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%Lf %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10Lf %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000 33") == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result =
+ my_xasprintf ("%.Lf %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ free (result);
+ }
+
+ /* Test the support of the %F format directive. */
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%F %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result =
+ my_xasprintf ("%.F %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%LF %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.750000 33") == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result =
+ my_xasprintf ("%.LF %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1234 33") == 0);
+ free (result);
+ }
+
+ /* Test the support of the %e format directive. */
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%e %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0
+ || strcmp (result, "1.275000e+001 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%15e %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+ || strcmp (result, " 1.750000e+000 33") == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result =
+ my_xasprintf ("%.e %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%Le %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1.275000e+01 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%15Le %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.750000e+00 33") == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result =
+ my_xasprintf ("%.Le %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0);
+ free (result);
+ }
+
+ /* Test the support of the %g format directive. */
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%g %d", 12.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10g %d", 1.75, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result =
+ my_xasprintf ("%.g %d", 1234.0, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0
+ || strcmp (result, "1e+003 33") == 0);
+ free (result);
+ }
+
+ { /* A positive number. */
+ char *result =
+ my_xasprintf ("%Lg %d", 12.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "12.75 33") == 0);
+ free (result);
+ }
+
+ { /* Width. */
+ char *result =
+ my_xasprintf ("%10Lg %d", 1.75L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " 1.75 33") == 0);
+ free (result);
+ }
+
+ { /* Precision. */
+ char *result =
+ my_xasprintf ("%.Lg %d", 1234.0L, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "1e+03 33") == 0);
+ free (result);
+ }
+
+ /* Test the support of the %n format directive. */
+
+ {
+ int count = -1;
+ char *result =
+ my_xasprintf ("%d %n", 123, &count, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "123 ") == 0);
+ ASSERT (count == 4);
+ free (result);
+ }
+
+ /* Test the support of the POSIX/XSI format strings with positions. */
+
+ {
+ char *result =
+ my_xasprintf ("%2$d %1$d", 33, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "55 33") == 0);
+ free (result);
+ }
+
+ /* Test the support of the grouping flag. */
+
+ {
+ char *result =
+ my_xasprintf ("%'d %d", 1234567, 99);
+ ASSERT (result != NULL);
+ ASSERT (result[strlen (result) - 1] == '9');
+ free (result);
+ }
+}
diff --git a/gnulib/tests/unistdio/test-ulc-vasnprintf1.c b/gnulib/tests/unistdio/test-ulc-vasnprintf1.c
new file mode 100644
index 00000000..fa4a2c96
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-vasnprintf1.c
@@ -0,0 +1,73 @@
+/* Test of ulc_vasnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-ulc-asnprintf1.h"
+#include "test-ulc-printf1.h"
+
+static char *
+my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *ret;
+
+ va_start (args, format);
+ ret = ulc_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static char *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ size_t length;
+ char *ret;
+
+ va_start (args, format);
+ ret = ulc_vasnprintf (NULL, &length, format, args);
+ va_end (args);
+ if (ret != NULL)
+ ASSERT (length == strlen (ret));
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-ulc-vasnprintf2.c b/gnulib/tests/unistdio/test-ulc-vasnprintf2.c
new file mode 100644
index 00000000..d61c1cfc
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-vasnprintf2.c
@@ -0,0 +1,246 @@
+/* Test of ulc_vasnprintf() function in an ISO-8859-1 locale.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <locale.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+static void
+test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
+{
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
+ || strcmp (result, "Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%20U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa? Maszkowski 33") == 0
+ || strcmp (result, " Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-20U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
+ || strcmp (result, "Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%020U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa? Maszkowski 33") == 0
+ || strcmp (result, " Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
+ || strcmp (result, "Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%20lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa? Maszkowski 33") == 0
+ || strcmp (result, " Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-20lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
+ || strcmp (result, "Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%020lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa? Maszkowski 33") == 0
+ || strcmp (result, " Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
+ || strcmp (result, "Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%20llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa? Maszkowski 33") == 0
+ || strcmp (result, " Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-20llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
+ || strcmp (result, "Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%020llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa? Maszkowski 33") == 0
+ || strcmp (result, " Rafal Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ const char *locale_string = "\304rger"; /* Ärger */
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "\304rger 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " \304rger 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "\304rger 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " \304rger 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+}
+
+static char *
+my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *ret;
+
+ va_start (args, format);
+ ret = ulc_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-ulc-vasnprintf2.sh b/gnulib/tests/unistdio/test-ulc-vasnprintf2.sh
new file mode 100755
index 00000000..39056a63
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-vasnprintf2.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test whether a traditional french locale is installed.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR != none; then
+ testlocale=$LOCALE_FR
+else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$testlocale \
+./test-ulc-vasnprintf1${EXEEXT} \
+ || exit 1
+
+LC_ALL=$testlocale \
+./test-ulc-vasnprintf2${EXEEXT}
diff --git a/gnulib/tests/unistdio/test-ulc-vasnprintf3.c b/gnulib/tests/unistdio/test-ulc-vasnprintf3.c
new file mode 100644
index 00000000..5a3cd0de
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-vasnprintf3.c
@@ -0,0 +1,234 @@
+/* Test of ulc_vasnprintf() function in an UTF-8 locale.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <locale.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+static void
+test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
+{
+ /* Test the support of the 'U' conversion specifier for Unicode strings. */
+
+ {
+ static const uint8_t unicode_string[] = "Rafa\305\202 Maszkowski"; /* Rafał Maszkowski */
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%20U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-20U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%020U %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ {
+ static const uint16_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%20lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-20lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%020lU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ {
+ static const uint32_t unicode_string[] = /* Rafał Maszkowski */
+ {
+ 'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
+ 's', 'k', 'i', 0
+ };
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%20llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-20llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%020llU %d", unicode_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " Rafa\305\202 Maszkowski 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+
+ /* Test the support of the 's' conversion specifier for strings. */
+
+ {
+ const char *locale_string = "\303\204rger"; /* Ärger */
+ {
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "\303\204rger 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* Width. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " \303\204rger 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_LEFT. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, "\303\204rger 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ { /* FLAG_ZERO: no effect. */
+ size_t length;
+ char *result =
+ my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
+ ASSERT (result != NULL);
+ ASSERT (strcmp (result, " \303\204rger 33") == 0);
+ ASSERT (length == strlen (result));
+ free (result);
+ }
+ }
+}
+
+static char *
+my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *ret;
+
+ va_start (args, format);
+ ret = ulc_vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return ret;
+}
+
+static void
+test_vasnprintf ()
+{
+ test_function (my_asnprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_vasnprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-ulc-vasnprintf3.sh b/gnulib/tests/unistdio/test-ulc-vasnprintf3.sh
new file mode 100755
index 00000000..caa528a6
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-vasnprintf3.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# Test whether a french Unicode locale is installed.
+: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
+if test $LOCALE_FR_UTF8 != none; then
+ testlocale=$LOCALE_FR_UTF8
+else
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no french Unicode locale is installed"
+ else
+ echo "Skipping test: no french Unicode locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$testlocale \
+./test-ulc-vasnprintf1${EXEEXT} \
+ || exit 1
+
+LC_ALL=$testlocale \
+./test-ulc-vasnprintf3${EXEEXT}
diff --git a/gnulib/tests/unistdio/test-ulc-vasprintf1.c b/gnulib/tests/unistdio/test-ulc-vasprintf1.c
new file mode 100644
index 00000000..0db01c9e
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-vasprintf1.c
@@ -0,0 +1,60 @@
+/* Test of ulc_vasprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+#include "test-ulc-printf1.h"
+
+static char *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ char *result;
+ int retval;
+
+ va_start (args, format);
+ retval = ulc_vasprintf (&result, format, args);
+ va_end (args);
+ if (retval < 0)
+ return NULL;
+ ASSERT (result != NULL);
+ return result;
+}
+
+static void
+test_vasprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ test_vasprintf ();
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-ulc-vsnprintf1.c b/gnulib/tests/unistdio/test-ulc-vsnprintf1.c
new file mode 100644
index 00000000..7b6de1c6
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-vsnprintf1.c
@@ -0,0 +1,64 @@
+/* Test of ulc_vsnprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+#include "progname.h"
+#include "macros.h"
+
+#include "test-ulc-printf1.h"
+
+static char *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ char result[1000];
+ int retval;
+
+ va_start (args, format);
+ retval = ulc_vsnprintf (result, sizeof (result), format, args);
+ va_end (args);
+ if (retval < 0 || retval >= (int) sizeof (result))
+ return NULL;
+ return xstrdup (result);
+}
+
+static void
+test_vsnprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_vsnprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistdio/test-ulc-vsprintf1.c b/gnulib/tests/unistdio/test-ulc-vsprintf1.c
new file mode 100644
index 00000000..51ea024e
--- /dev/null
+++ b/gnulib/tests/unistdio/test-ulc-vsprintf1.c
@@ -0,0 +1,64 @@
+/* Test of ulc_vsprintf() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "unistdio.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+#include "progname.h"
+#include "macros.h"
+
+#include "test-ulc-printf1.h"
+
+static char *
+my_xasprintf (const char *format, ...)
+{
+ va_list args;
+ char result[1000];
+ int retval;
+
+ va_start (args, format);
+ retval = ulc_vsprintf (result, format, args);
+ va_end (args);
+ if (retval < 0 || retval >= (int) sizeof (result))
+ return NULL;
+ return xstrdup (result);
+}
+
+static void
+test_vsprintf ()
+{
+ test_xfunction (my_xasprintf);
+}
+
+int
+main (int argc, char *argv[])
+{
+ set_program_name (argv[0]);
+
+ test_vsprintf ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-chr.h b/gnulib/tests/unistr/test-chr.h
new file mode 100644
index 00000000..5a021c2d
--- /dev/null
+++ b/gnulib/tests/unistr/test-chr.h
@@ -0,0 +1,103 @@
+/* Test of uN_chr() functions.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Eric Blake and Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main (void)
+{
+ size_t n = 0x100000;
+ UNIT *input = (UNIT *) malloc (n * sizeof (UNIT));
+ ASSERT (input);
+
+ input[0] = 'a';
+ input[1] = 'b';
+ U_SET (input + 2, 'c', 1024);
+ U_SET (input + 1026, 'd', n - 1028);
+ input[n - 2] = 'e';
+ input[n - 1] = 'a';
+
+ /* Basic behavior tests. */
+ ASSERT (U_CHR (input, n, 'a') == input);
+
+ ASSERT (U_CHR (input, 0, 'a') == NULL);
+ ASSERT (U_CHR (zerosize_ptr (), 0, 'a') == NULL);
+
+ ASSERT (U_CHR (input, n, 'b') == input + 1);
+ ASSERT (U_CHR (input, n, 'c') == input + 2);
+ ASSERT (U_CHR (input, n, 'd') == input + 1026);
+
+ ASSERT (U_CHR (input + 1, n - 1, 'a') == input + n - 1);
+ ASSERT (U_CHR (input + 1, n - 1, 'e') == input + n - 2);
+
+ ASSERT (U_CHR (input, n, 'f') == NULL);
+ ASSERT (U_CHR (input, n, '\0') == NULL);
+
+ /* Check that a very long haystack is handled quickly if the byte is
+ found near the beginning. */
+ {
+ size_t repeat = 10000;
+ for (; repeat > 0; repeat--)
+ {
+ ASSERT (U_CHR (input, n, 'c') == input + 2);
+ }
+ }
+
+ /* Alignment tests. */
+ {
+ int i, j;
+ for (i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 128; j++)
+ input[i + j] = j;
+ for (j = 0; j < 128; j++)
+ {
+ ASSERT (U_CHR (input + i, 128, j) == input + i + j);
+ }
+ }
+ }
+
+ /* Check that uN_chr() does not read past the first occurrence of the
+ byte being searched. */
+ {
+ char *page_boundary = (char *) zerosize_ptr ();
+
+ if (page_boundary != NULL)
+ {
+ for (n = 1; n <= 500 / sizeof (UNIT); n++)
+ {
+ UNIT *mem = (UNIT *) (page_boundary - n * sizeof (UNIT));
+ U_SET (mem, 'X', n);
+ ASSERT (U_CHR (mem, n, 'U') == NULL);
+
+ {
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ mem[i] = 'U';
+ ASSERT (U_CHR (mem, 4000, 'U') == mem + i);
+ mem[i] = 'X';
+ }
+ }
+ }
+ }
+ }
+
+ free (input);
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-cmp.h b/gnulib/tests/unistr/test-cmp.h
new file mode 100644
index 00000000..e536f482
--- /dev/null
+++ b/gnulib/tests/unistr/test-cmp.h
@@ -0,0 +1,97 @@
+/* Test of uN_cmp() functions.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Simon Josefsson and Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+test_cmp (void)
+{
+ /* Test equal / not equal distinction. */
+ ASSERT (U_CMP (zerosize_ptr (), zerosize_ptr (), 0) == 0);
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 'b', 'a', 'r', 0 };
+ ASSERT (U_CMP (input1, input2, 2) == 0);
+ ASSERT (U_CMP (input1, input2, 3) == 0);
+ ASSERT (U_CMP (input1, input2, 4) != 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'b', 'a', 'r', 0 };
+ ASSERT (U_CMP (input1, input2, 1) != 0);
+ ASSERT (U_CMP (input1, input2, 3) != 0);
+ }
+
+ /* Test less / equal / greater distinction. */
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'm', 'o', 'o', 0 };
+ ASSERT (U_CMP (input1, input2, 4) < 0);
+ ASSERT (U_CMP (input2, input1, 4) > 0);
+ }
+ {
+ static const UNIT input1[] = { 'o', 'o', 'm', 'p', 'h', 0 };
+ static const UNIT input2[] = { 'o', 'o', 'p', 's', 0 };
+ ASSERT (U_CMP (input1, input2, 3) < 0);
+ ASSERT (U_CMP (input2, input1, 3) > 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 'b', 'a', 'r', 0 };
+ ASSERT (U_CMP (input1, input2, 4) < 0);
+ ASSERT (U_CMP (input2, input1, 4) > 0);
+ }
+
+ /* Some old versions of memcmp were not 8-bit clean. */
+ {
+ static const UNIT input1[] = { 0x40 };
+ static const UNIT input2[] = { 0xC2 };
+ ASSERT (U_CMP (input1, input2, 1) < 0);
+ ASSERT (U_CMP (input2, input1, 1) > 0);
+ }
+ {
+ static const UNIT input1[] = { 0xC2 };
+ static const UNIT input2[] = { 0xC3 };
+ ASSERT (U_CMP (input1, input2, 1) < 0);
+ ASSERT (U_CMP (input2, input1, 1) > 0);
+ }
+
+ /* The Next x86 OpenStep bug shows up only when comparing 16 bytes
+ or more and with at least one buffer not starting on a 4-byte boundary.
+ William Lewis provided this test program. */
+ {
+ UNIT foo[21];
+ UNIT bar[21];
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ UNIT *a = foo + i;
+ UNIT *b = bar + i;
+ int j;
+ for (j = 0; j < 8; j++)
+ a[j] = '-';
+ a[8] = '0';
+ for (j = 9; j < 16; j++)
+ a[j] = '1';
+ for (j = 0; j < 8; j++)
+ b[j] = '-';
+ b[8] = '1';
+ for (j = 9; j < 16; j++)
+ b[j] = '0';
+ ASSERT (U_CMP (a, b, 16) < 0);
+ }
+ }
+}
diff --git a/gnulib/tests/unistr/test-cmp2.h b/gnulib/tests/unistr/test-cmp2.h
new file mode 100644
index 00000000..261fe365
--- /dev/null
+++ b/gnulib/tests/unistr/test-cmp2.h
@@ -0,0 +1,56 @@
+/* Test of uN_cmp2() functions.
+ Copyright (C) 2008-2010 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/>. */
+
+/* Written by Simon Josefsson and Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ {
+ static const UNIT input1[] = { 'a' };
+ static const UNIT input2[] = { 'b' };
+ ASSERT (U_CMP2 (input1, 0, input2, 0) == 0);
+ ASSERT (U_CMP2 (input1, 1, input2, 0) > 0);
+ ASSERT (U_CMP2 (input1, 0, input2, 1) < 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 'b', 'a', 'r', 0 };
+ ASSERT (U_CMP2 (input1, 3, input2, 3) == 0);
+ ASSERT (U_CMP2 (input1, 4, input2, 3) > 0);
+ ASSERT (U_CMP2 (input2, 3, input1, 4) < 0);
+ ASSERT (U_CMP2 (input1, 3, input2, 4) < 0);
+ ASSERT (U_CMP2 (input2, 4, input1, 3) > 0);
+ ASSERT (U_CMP2 (input1, 4, input2, 4) < 0);
+ ASSERT (U_CMP2 (input2, 4, input1, 4) > 0);
+ ASSERT (U_CMP2 (input1, 3, input2, 7) < 0);
+ ASSERT (U_CMP2 (input2, 7, input1, 3) > 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o' };
+ static const UNIT input2[] = { 'm', 'o', 'o' };
+ ASSERT (U_CMP2 (input1, 3, input2, 3) < 0);
+ ASSERT (U_CMP2 (input2, 3, input1, 3) > 0);
+ }
+ {
+ static const UNIT input1[] = { 'o', 'o', 'm', 'p', 'h' };
+ static const UNIT input2[] = { 'o', 'o', 'p', 's' };
+ ASSERT (U_CMP2 (input1, 5, input2, 4) < 0);
+ ASSERT (U_CMP2 (input2, 4, input1, 5) > 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-cpy-alloc.h b/gnulib/tests/unistr/test-cpy-alloc.h
new file mode 100644
index 00000000..795e0b77
--- /dev/null
+++ b/gnulib/tests/unistr/test-cpy-alloc.h
@@ -0,0 +1,41 @@
+/* Test of uN_cpy_alloc() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ /* Test small copying operations. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e' };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (src); n++)
+ {
+ UNIT *result = U_CPY_ALLOC (src, n);
+ size_t i;
+
+ ASSERT (result != NULL);
+ for (i = 0; i < n; i++)
+ ASSERT (result[i] == src[i]);
+
+ free (result);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-cpy.h b/gnulib/tests/unistr/test-cpy.h
new file mode 100644
index 00000000..b62fd14f
--- /dev/null
+++ b/gnulib/tests/unistr/test-cpy.h
@@ -0,0 +1,44 @@
+/* Test of uN_cpy() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ /* Test small copying operations. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e' };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (src); n++)
+ {
+ UNIT dest[1 + SIZEOF (src) + 1] =
+ { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC };
+ UNIT *ret;
+ size_t i;
+
+ ret = U_CPY (dest + 1, src, n);
+ ASSERT (ret == dest + 1);
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + i] == src[i]);
+ ASSERT (dest[1 + n] == MAGIC);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-move.h b/gnulib/tests/unistr/test-move.h
new file mode 100644
index 00000000..2462367d
--- /dev/null
+++ b/gnulib/tests/unistr/test-move.h
@@ -0,0 +1,152 @@
+/* Test of uN_move() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ /* Test copying operations with disjoint source and destination. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e' };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (src); n++)
+ {
+ UNIT dest[1 + SIZEOF (src) + 1] =
+ { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC };
+ UNIT *ret;
+ size_t i;
+
+ ret = U_MOVE (dest + 1, src, n);
+ ASSERT (ret == dest + 1);
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + i] == src[i]);
+ ASSERT (dest[1 + n] == MAGIC);
+ }
+ }
+
+ /* Test copying operations with overlap, in-place. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e' };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (src); n++)
+ {
+ UNIT dest[1 + SIZEOF (src) + 1];
+ UNIT *ret;
+ size_t i;
+
+ dest[0] = MAGIC;
+ for (i = 0; i < n; i++)
+ dest[1 + i] = src[i];
+ dest[1 + n] = MAGIC;
+
+ ret = U_MOVE (dest + 1, dest + 1, n);
+ ASSERT (ret == dest + 1);
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + i] == src[i]);
+ ASSERT (dest[1 + n] == MAGIC);
+ }
+ }
+
+ /* Test copying operations with overlap, moving downward. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e' };
+ static const UNIT src2[] = { 'C', 'L', 'I', 'M', 'A', 'T', 'E' };
+ size_t d;
+
+ ASSERT (SIZEOF (src) == SIZEOF (src2));
+ for (d = 0; d <= SIZEOF (src); d++)
+ {
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (src); n++)
+ {
+ UNIT dest[1 + 2 * SIZEOF (src) + 1];
+ UNIT *ret;
+ size_t i;
+
+ dest[0] = MAGIC;
+ for (i = 0; i < SIZEOF (src2); i++)
+ dest[1 + i] = src2[i];
+ for (i = 0; i < SIZEOF (src); i++)
+ dest[1 + SIZEOF (src) + i] = src[i];
+ dest[1 + 2 * SIZEOF (src)] = MAGIC;
+
+ ret =
+ U_MOVE (dest + 1 + SIZEOF (src) - d, dest + 1 + SIZEOF (src), n);
+ ASSERT (ret == dest + 1 + SIZEOF (src) - d);
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < SIZEOF (src) - d; i++)
+ ASSERT (dest[1 + i] == src2[i]);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + SIZEOF (src) - d + i] == src[i]);
+ for (i = SIZEOF (src) - d + n; i < SIZEOF (src2); i++)
+ ASSERT (dest[1 + i] == src2[i]);
+ for (i = (n >= d ? n - d : 0); i < SIZEOF (src); i++)
+ ASSERT (dest[1 + SIZEOF (src) + i] == src[i]);
+ ASSERT (dest[1 + 2 * SIZEOF (src)] == MAGIC);
+ }
+ }
+ }
+
+ /* Test copying operations with overlap, moving upward. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e' };
+ static const UNIT src2[] = { 'C', 'L', 'I', 'M', 'A', 'T', 'E' };
+ size_t d;
+
+ ASSERT (SIZEOF (src) == SIZEOF (src2));
+ for (d = 0; d <= SIZEOF (src); d++)
+ {
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (src); n++)
+ {
+ UNIT dest[1 + 2 * SIZEOF (src) + 1];
+ UNIT *ret;
+ size_t i;
+
+ dest[0] = MAGIC;
+ for (i = 0; i < SIZEOF (src); i++)
+ dest[1 + i] = src[i];
+ for (i = 0; i < SIZEOF (src2); i++)
+ dest[1 + SIZEOF (src) + i] = src2[i];
+ dest[1 + 2 * SIZEOF (src)] = MAGIC;
+
+ ret = U_MOVE (dest + 1 + d, dest + 1, n);
+ ASSERT (ret == dest + 1 + d);
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < d; i++)
+ ASSERT (dest[1 + i] == src[i]);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + d + i] == src[i]);
+ for (i = d + n; i < SIZEOF (src); i++)
+ ASSERT (dest[1 + i] == src[i]);
+ for (i = (d + n >= SIZEOF (src) ? d + n - SIZEOF (src) : 0);
+ i < SIZEOF (src2);
+ i++)
+ ASSERT (dest[1 + SIZEOF (src) + i] == src2[i]);
+ ASSERT (dest[1 + 2 * SIZEOF (src)] == MAGIC);
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-set.h b/gnulib/tests/unistr/test-set.h
new file mode 100644
index 00000000..56924dc3
--- /dev/null
+++ b/gnulib/tests/unistr/test-set.h
@@ -0,0 +1,44 @@
+/* Test of uN_set() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ {
+#define NMAX 7
+ size_t n;
+
+ for (n = 0; n <= NMAX; n++)
+ {
+ UNIT dest[1 + NMAX + 1] =
+ { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC };
+ UNIT *ret;
+ size_t i;
+
+ ret = U_SET (dest + 1, VALUE, n);
+ ASSERT (ret == dest + 1);
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + i] == VALUE);
+ ASSERT (dest[1 + n] == MAGIC);
+ }
+#undef NMAX
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-stpcpy.h b/gnulib/tests/unistr/test-stpcpy.h
new file mode 100644
index 00000000..76065dc4
--- /dev/null
+++ b/gnulib/tests/unistr/test-stpcpy.h
@@ -0,0 +1,47 @@
+/* Test of uN_stpcpy() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ /* Test small copying operations. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e', 0 };
+ size_t n;
+
+ for (n = 1; n <= SIZEOF (src); n++)
+ {
+ UNIT dest[1 + SIZEOF (src) + 1] =
+ { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC,
+ MAGIC
+ };
+ UNIT *result;
+ size_t i;
+
+ result = U_STPCPY (dest + 1, src + SIZEOF (src) - n);
+ ASSERT (result == dest + n);
+
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + i] == src[SIZEOF (src) - n + i]);
+ ASSERT (dest[1 + n] == MAGIC);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-stpncpy.h b/gnulib/tests/unistr/test-stpncpy.h
new file mode 100644
index 00000000..bb81ff00
--- /dev/null
+++ b/gnulib/tests/unistr/test-stpncpy.h
@@ -0,0 +1,79 @@
+/* Test of uN_stpncpy() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+check_single (const UNIT *input, size_t length, size_t n)
+{
+ UNIT *dest;
+ UNIT *result;
+ size_t i;
+
+ dest = (UNIT *) malloc ((1 + n + 1) * sizeof (UNIT));
+ ASSERT (dest != NULL);
+
+ for (i = 0; i < 1 + n + 1; i++)
+ dest[i] = MAGIC;
+
+ result = U_STPNCPY (dest + 1, input, n);
+ ASSERT (result == dest + 1 + (n <= length ? n : length));
+
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < (n <= length ? n : length + 1); i++)
+ ASSERT (dest[1 + i] == input[i]);
+ for (; i < n; i++)
+ ASSERT (dest[1 + i] == 0);
+ ASSERT (dest[1 + n] == MAGIC);
+
+ free (dest);
+}
+
+static void
+check (const UNIT *input, size_t input_length)
+{
+ size_t length;
+ size_t n;
+
+ ASSERT (input_length > 0);
+ ASSERT (input[input_length - 1] == 0);
+ length = input_length - 1; /* = U_STRLEN (input) */
+
+ for (n = 0; n <= 2 * length + 2; n++)
+ check_single (input, length, n);
+
+ /* Check that U_STPNCPY (D, S, N) does not look at more than
+ MIN (U_STRLEN (S) + 1, N) units. */
+ {
+ char *page_boundary = (char *) zerosize_ptr ();
+
+ if (page_boundary != NULL)
+ {
+ for (n = 0; n <= 2 * length + 2; n++)
+ {
+ size_t n_to_copy = (n <= length ? n : length + 1);
+ UNIT *copy;
+ size_t i;
+
+ copy = (UNIT *) page_boundary - n_to_copy;
+ for (i = 0; i < n_to_copy; i++)
+ copy[i] = input[i];
+
+ check_single (copy, length, n);
+ }
+ }
+ }
+}
diff --git a/gnulib/tests/unistr/test-strcat.h b/gnulib/tests/unistr/test-strcat.h
new file mode 100644
index 00000000..6c1f90dc
--- /dev/null
+++ b/gnulib/tests/unistr/test-strcat.h
@@ -0,0 +1,56 @@
+/* Test of uN_strcat() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ /* Test small copying operations. */
+ {
+ static const UNIT base[] = { 'C', 'h', 'a', 'n', 'g', 'i', 'n', 'g', 0 };
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e', 0 };
+ size_t m;
+ size_t n;
+
+ for (m = 0; m < SIZEOF (base); m++)
+ for (n = 1; n <= SIZEOF (src); n++)
+ {
+ UNIT dest[1 + (SIZEOF (base) - 1) + SIZEOF (src) + 1] =
+ { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC,
+ MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC
+ };
+ UNIT *result;
+ size_t i;
+
+ for (i = 0; i < m; i++)
+ dest[1 + i] = base[i];
+ dest[1 + m] = 0;
+
+ result = U_STRCAT (dest + 1, src + SIZEOF (src) - n);
+ ASSERT (result == dest + 1);
+
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < m; i++)
+ ASSERT (dest[1 + i] == base[i]);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + m + i] == src[SIZEOF (src) - n + i]);
+ ASSERT (dest[1 + m + n] == MAGIC);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-strcmp.h b/gnulib/tests/unistr/test-strcmp.h
new file mode 100644
index 00000000..485b6f91
--- /dev/null
+++ b/gnulib/tests/unistr/test-strcmp.h
@@ -0,0 +1,56 @@
+/* Test of uN_strcmp() and uN_strcoll() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+test_strcmp (void)
+{
+ {
+ static const UNIT input1[] = { 0 };
+ static const UNIT input2[] = { 0 };
+ ASSERT (U_STRCMP (input1, input2) == 0);
+ }
+ {
+ static const UNIT input1[] = { 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 0 };
+ ASSERT (U_STRCMP (input1, input2) < 0);
+ ASSERT (U_STRCMP (input2, input1) > 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 0 };
+ ASSERT (U_STRCMP (input1, input2) == 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'b', 'a', 'r', 0 };
+ ASSERT (U_STRCMP (input1, input2) > 0);
+ ASSERT (U_STRCMP (input2, input1) < 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 'b', 'a', 'r', 0 };
+ ASSERT (U_STRCMP (input1, input2) < 0);
+ ASSERT (U_STRCMP (input2, input1) > 0);
+ }
+ {
+ static const UNIT input1[] = { 'o', 'o', 'm', 'p', 'h', 0 };
+ static const UNIT input2[] = { 'o', 'o', 'p', 's', 0 };
+ ASSERT (U_STRCMP (input1, input2) < 0);
+ ASSERT (U_STRCMP (input2, input1) > 0);
+ }
+}
diff --git a/gnulib/tests/unistr/test-strcpy.h b/gnulib/tests/unistr/test-strcpy.h
new file mode 100644
index 00000000..f8fe5efd
--- /dev/null
+++ b/gnulib/tests/unistr/test-strcpy.h
@@ -0,0 +1,47 @@
+/* Test of uN_strcpy() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ /* Test small copying operations. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e', 0 };
+ size_t n;
+
+ for (n = 1; n <= SIZEOF (src); n++)
+ {
+ UNIT dest[1 + SIZEOF (src) + 1] =
+ { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC, MAGIC,
+ MAGIC
+ };
+ UNIT *result;
+ size_t i;
+
+ result = U_STRCPY (dest + 1, src + SIZEOF (src) - n);
+ ASSERT (result == dest + 1);
+
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < n; i++)
+ ASSERT (dest[1 + i] == src[SIZEOF (src) - n + i]);
+ ASSERT (dest[1 + n] == MAGIC);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-strdup.h b/gnulib/tests/unistr/test-strdup.h
new file mode 100644
index 00000000..1684b39d
--- /dev/null
+++ b/gnulib/tests/unistr/test-strdup.h
@@ -0,0 +1,41 @@
+/* Test of uN_strdup() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+int
+main ()
+{
+ /* Test small copying operations. */
+ {
+ static const UNIT src[] = { 'c', 'l', 'i', 'm', 'a', 't', 'e', 0 };
+ size_t n;
+
+ for (n = 1; n <= SIZEOF (src); n++)
+ {
+ UNIT *result = U_STRDUP (src + SIZEOF (src) - n);
+ size_t i;
+
+ ASSERT (result != NULL);
+ for (i = 0; i < n; i++)
+ ASSERT (result[i] == src[SIZEOF (src) - n + i]);
+
+ free (result);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-strncat.h b/gnulib/tests/unistr/test-strncat.h
new file mode 100644
index 00000000..0445b6d9
--- /dev/null
+++ b/gnulib/tests/unistr/test-strncat.h
@@ -0,0 +1,90 @@
+/* Test of uN_strncat() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+check_single (const UNIT *input, size_t length, size_t n)
+{
+ static const UNIT base[] = { 'C', 'h', 'a', 'n', 'g', 'i', 'n', 'g', 0 };
+ size_t m;
+
+ for (m = 0; m < SIZEOF (base); m++)
+ {
+ UNIT *dest;
+ UNIT *result;
+ size_t i;
+
+ dest = (UNIT *) malloc ((1 + m + n + 2) * sizeof (UNIT));
+ ASSERT (dest != NULL);
+
+ dest[0] = MAGIC;
+ for (i = 0; i < m; i++)
+ dest[1 + i] = base[i];
+ dest[1 + m] = 0;
+ for (i = 1; i < n + 2; i++)
+ dest[1 + m + i] = MAGIC;
+
+ result = U_STRNCAT (dest + 1, input, n);
+ ASSERT (result == dest + 1);
+
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < m; i++)
+ ASSERT (dest[1 + i] == base[i]);
+ for (i = 0; i < (n <= length ? n : length); i++)
+ ASSERT (dest[1 + m + i] == input[i]);
+ ASSERT (dest[1 + m + i] == 0);
+ ASSERT (dest[1 + m + i + 1] == MAGIC);
+
+ free (dest);
+ }
+}
+
+static void
+check (const UNIT *input, size_t input_length)
+{
+ size_t length;
+ size_t n;
+
+ ASSERT (input_length > 0);
+ ASSERT (input[input_length - 1] == 0);
+ length = input_length - 1; /* = U_STRLEN (input) */
+
+ for (n = 0; n <= 2 * length + 2; n++)
+ check_single (input, length, n);
+
+ /* Check that U_STRNCAT (D, S, N) does not look at more than
+ MIN (U_STRLEN (S) + 1, N) units. */
+ {
+ char *page_boundary = (char *) zerosize_ptr ();
+
+ if (page_boundary != NULL)
+ {
+ for (n = 0; n <= 2 * length + 2; n++)
+ {
+ size_t n_to_copy = (n <= length ? n : length + 1);
+ UNIT *copy;
+ size_t i;
+
+ copy = (UNIT *) page_boundary - n_to_copy;
+ for (i = 0; i < n_to_copy; i++)
+ copy[i] = input[i];
+
+ check_single (copy, length, n);
+ }
+ }
+ }
+}
diff --git a/gnulib/tests/unistr/test-strncmp.h b/gnulib/tests/unistr/test-strncmp.h
new file mode 100644
index 00000000..628db94c
--- /dev/null
+++ b/gnulib/tests/unistr/test-strncmp.h
@@ -0,0 +1,92 @@
+/* Test of uN_strncmp() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+test_strncmp (void)
+{
+ {
+ static const UNIT input1[] = { 0 };
+ static const UNIT input2[] = { 0 };
+ ASSERT (U_STRNCMP (input1, input2, 0) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 1) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) == 0);
+ }
+ {
+ static const UNIT input1[] = { 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 0 };
+ ASSERT (U_STRNCMP (input1, input2, 0) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 1) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 1) > 0);
+ ASSERT (U_STRNCMP (input1, input2, 3) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 3) > 0);
+ ASSERT (U_STRNCMP (input1, input2, 4) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 4) > 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 1000000) > 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 0 };
+ ASSERT (U_STRNCMP (input1, input2, 0) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 1) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 2) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 3) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 4) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) == 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'b', 'a', 'r', 0 };
+ ASSERT (U_STRNCMP (input1, input2, 0) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 1) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 1) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 2) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 2) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 1000000) < 0);
+ }
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 'f', 'o', 'o', 'b', 'a', 'r', 0 };
+ ASSERT (U_STRNCMP (input1, input2, 0) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 1) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 2) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 3) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 4) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 4) > 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 1000000) > 0);
+ }
+ {
+ static const UNIT input1[] = { 'o', 'o', 'm', 'p', 'h', 0 };
+ static const UNIT input2[] = { 'o', 'o', 'p', 's', 0 };
+ ASSERT (U_STRNCMP (input1, input2, 0) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 1) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 2) == 0);
+ ASSERT (U_STRNCMP (input1, input2, 3) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 3) > 0);
+ ASSERT (U_STRNCMP (input1, input2, 4) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 4) > 0);
+ ASSERT (U_STRNCMP (input1, input2, 5) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 5) > 0);
+ ASSERT (U_STRNCMP (input1, input2, 6) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 6) > 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) < 0);
+ ASSERT (U_STRNCMP (input2, input1, 1000000) > 0);
+ }
+}
diff --git a/gnulib/tests/unistr/test-strncpy.h b/gnulib/tests/unistr/test-strncpy.h
new file mode 100644
index 00000000..6fa0d12e
--- /dev/null
+++ b/gnulib/tests/unistr/test-strncpy.h
@@ -0,0 +1,79 @@
+/* Test of uN_strncpy() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+check_single (const UNIT *input, size_t length, size_t n)
+{
+ UNIT *dest;
+ UNIT *result;
+ size_t i;
+
+ dest = (UNIT *) malloc ((1 + n + 1) * sizeof (UNIT));
+ ASSERT (dest != NULL);
+
+ for (i = 0; i < 1 + n + 1; i++)
+ dest[i] = MAGIC;
+
+ result = U_STRNCPY (dest + 1, input, n);
+ ASSERT (result == dest + 1);
+
+ ASSERT (dest[0] == MAGIC);
+ for (i = 0; i < (n <= length ? n : length + 1); i++)
+ ASSERT (dest[1 + i] == input[i]);
+ for (; i < n; i++)
+ ASSERT (dest[1 + i] == 0);
+ ASSERT (dest[1 + n] == MAGIC);
+
+ free (dest);
+}
+
+static void
+check (const UNIT *input, size_t input_length)
+{
+ size_t length;
+ size_t n;
+
+ ASSERT (input_length > 0);
+ ASSERT (input[input_length - 1] == 0);
+ length = input_length - 1; /* = U_STRLEN (input) */
+
+ for (n = 0; n <= 2 * length + 2; n++)
+ check_single (input, length, n);
+
+ /* Check that U_STRNCPY (D, S, N) does not look at more than
+ MIN (U_STRLEN (S) + 1, N) units. */
+ {
+ char *page_boundary = (char *) zerosize_ptr ();
+
+ if (page_boundary != NULL)
+ {
+ for (n = 0; n <= 2 * length + 2; n++)
+ {
+ size_t n_to_copy = (n <= length ? n : length + 1);
+ UNIT *copy;
+ size_t i;
+
+ copy = (UNIT *) page_boundary - n_to_copy;
+ for (i = 0; i < n_to_copy; i++)
+ copy[i] = input[i];
+
+ check_single (copy, length, n);
+ }
+ }
+ }
+}
diff --git a/gnulib/tests/unistr/test-strnlen.h b/gnulib/tests/unistr/test-strnlen.h
new file mode 100644
index 00000000..1199126c
--- /dev/null
+++ b/gnulib/tests/unistr/test-strnlen.h
@@ -0,0 +1,60 @@
+/* Test of uN_strnlen() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+check_single (const UNIT *input, size_t length, size_t n)
+{
+ size_t result = U_STRNLEN (input, n);
+ ASSERT (result == (n <= length ? n : length));
+}
+
+static void
+check (const UNIT *input, size_t input_length)
+{
+ size_t length;
+ size_t n;
+
+ ASSERT (input_length > 0);
+ ASSERT (input[input_length - 1] == 0);
+ length = input_length - 1; /* = U_STRLEN (input) */
+
+ for (n = 0; n <= 2 * length + 2; n++)
+ check_single (input, length, n);
+
+ /* Check that U_STRNLEN (S, N) does not look at more than
+ MIN (U_STRLEN (S) + 1, N) units. */
+ {
+ char *page_boundary = (char *) zerosize_ptr ();
+
+ if (page_boundary != NULL)
+ {
+ for (n = 0; n <= 2 * length + 2; n++)
+ {
+ size_t n_to_copy = (n <= length ? n : length + 1);
+ UNIT *copy;
+ size_t i;
+
+ copy = (UNIT *) page_boundary - n_to_copy;
+ for (i = 0; i < n_to_copy; i++)
+ copy[i] = input[i];
+
+ check_single (copy, length, n);
+ }
+ }
+ }
+}
diff --git a/gnulib/tests/unistr/test-u16-check.c b/gnulib/tests/unistr/test-u16-check.c
new file mode 100644
index 00000000..b7a9c103
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-check.c
@@ -0,0 +1,66 @@
+/* Test of u16_check() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test empty string. */
+ {
+ static const uint16_t input[] = { 0 };
+ ASSERT (u16_check (input, 0) == NULL);
+ }
+
+ /* Test valid non-empty string. */
+ {
+ static const uint16_t input[] = /* "Данило Шеган" */
+ { 0x0414, 0x0430, 0x043D, 0x0438, 0x043B, 0x043E, 0x0020, 0x0428, 0x0435, 0x0433, 0x0430, 0x043D };
+ ASSERT (u16_check (input, SIZEOF (input)) == NULL);
+ }
+
+ /* Test out-of-range character with 2 units: U+110000. */
+ {
+ static const uint16_t input[] = { 0x0414, 0x0430, 0xDBFF, 0xE000 };
+ ASSERT (u16_check (input, SIZEOF (input)) == input + 2);
+ }
+
+ /* Test surrogate codepoints. */
+ {
+ static const uint16_t input[] = { 0x0414, 0x0430, 0xDBFF, 0xDFFF };
+ ASSERT (u16_check (input, SIZEOF (input)) == NULL);
+ }
+ {
+ static const uint16_t input[] = { 0x0414, 0x0430, 0xDBFF };
+ ASSERT (u16_check (input, SIZEOF (input)) == input + 2);
+ }
+ {
+ static const uint16_t input[] = { 0x0414, 0x0430, 0xDFFF };
+ ASSERT (u16_check (input, SIZEOF (input)) == input + 2);
+ }
+ {
+ static const uint16_t input[] = { 0x0414, 0x0430, 0xDFFF, 0xDBFF };
+ ASSERT (u16_check (input, SIZEOF (input)) == input + 2);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-chr.c b/gnulib/tests/unistr/test-u16-chr.c
new file mode 100644
index 00000000..d71755c1
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-chr.c
@@ -0,0 +1,31 @@
+/* Test of u16_chr() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_CHR u16_chr
+#define U_SET u16_set
+#include "test-chr.h"
diff --git a/gnulib/tests/unistr/test-u16-cmp.c b/gnulib/tests/unistr/test-u16-cmp.c
new file mode 100644
index 00000000..1ab9019a
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-cmp.c
@@ -0,0 +1,47 @@
+/* Test of u16_cmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_CMP u16_cmp
+#define MAGIC 0xBADE
+#include "test-cmp.h"
+
+int
+main ()
+{
+ test_cmp ();
+
+ /* Test comparison with non-BMP characters, split into surrogates. */
+ {
+ static const UNIT input1[] = { 0xD835, 0xDD1E };
+ static const UNIT input2[] = { 0xFEFF, 0xFFE5 };
+ ASSERT (U_CMP (input1, input2, 2) > 0);
+ ASSERT (U_CMP (input2, input1, 2) < 0);
+ ASSERT (U_CMP (input1, input2, 1) > 0);
+ ASSERT (U_CMP (input2, input1, 1) < 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-cmp2.c b/gnulib/tests/unistr/test-u16-cmp2.c
new file mode 100644
index 00000000..3993dcdd
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-cmp2.c
@@ -0,0 +1,28 @@
+/* Test of u16_cmp2() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_CMP2 u16_cmp2
+#define MAGIC 0xBADE
+#include "test-cmp2.h"
diff --git a/gnulib/tests/unistr/test-u16-cpy-alloc.c b/gnulib/tests/unistr/test-u16-cpy-alloc.c
new file mode 100644
index 00000000..d1aa2116
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-cpy-alloc.c
@@ -0,0 +1,29 @@
+/* Test of u16_cpy_alloc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_CPY_ALLOC u16_cpy_alloc
+#include "test-cpy-alloc.h"
diff --git a/gnulib/tests/unistr/test-u16-cpy.c b/gnulib/tests/unistr/test-u16-cpy.c
new file mode 100644
index 00000000..168a459a
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-cpy.c
@@ -0,0 +1,28 @@
+/* Test of u16_cpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_CPY u16_cpy
+#define MAGIC 0xBADE
+#include "test-cpy.h"
diff --git a/gnulib/tests/unistr/test-u16-mblen.c b/gnulib/tests/unistr/test-u16-mblen.c
new file mode 100644
index 00000000..13186f3f
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-mblen.c
@@ -0,0 +1,84 @@
+/* Test of u16_mblen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ int ret;
+
+ /* Test zero-length input. */
+ {
+ static const uint16_t input[] = { 0 };
+ ret = u16_mblen (input, 0);
+ ASSERT (ret == -1);
+ }
+
+ /* Test NUL unit input. */
+ {
+ static const uint16_t input[] = { 0 };
+ ret = u16_mblen (input, 1);
+ ASSERT (ret == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint16_t buf[1];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ ret = u16_mblen (buf, 1);
+ ASSERT (ret == 1);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint16_t input[] = { 0x20AC };
+ ret = u16_mblen (input, 1);
+ ASSERT (ret == 1);
+ }
+
+ /* Test 2-units character input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0xDD1F };
+ ret = u16_mblen (input, 2);
+ ASSERT (ret == 2);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint16_t input[] = { 0xD835 };
+ ret = u16_mblen (input, 1);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint16_t input[] = { 0xDD1F };
+ ret = u16_mblen (input, 1);
+ ASSERT (ret == -1);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-mbsnlen.c b/gnulib/tests/unistr/test-u16-mbsnlen.c
new file mode 100644
index 00000000..a2d8b10f
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-mbsnlen.c
@@ -0,0 +1,68 @@
+/* Test of u16_mbsnlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (input); n++)
+ {
+ size_t len = u16_mbsnlen (input, n);
+ ASSERT (len == n);
+ }
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint16_t input[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E
+ };
+ static const size_t expected[SIZEOF (input) + 1] =
+ { 0,
+ 1, 2, 3, 3, 4, 5, 5, 6, 7,
+ 8, 8, 9, 10, 10
+ };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (input); n++)
+ {
+ size_t len = u16_mbsnlen (input, n);
+ ASSERT (len == expected[n]);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-mbtouc-unsafe.c b/gnulib/tests/unistr/test-u16-mbtouc-unsafe.c
new file mode 100644
index 00000000..a1d12149
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-mbtouc-unsafe.c
@@ -0,0 +1,33 @@
+/* Test of u16_mbtouc_unsafe() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#include "test-u16-mbtouc.h"
+
+int
+main ()
+{
+ test_function (u16_mbtouc_unsafe);
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-mbtouc.c b/gnulib/tests/unistr/test-u16-mbtouc.c
new file mode 100644
index 00000000..4545add7
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-mbtouc.c
@@ -0,0 +1,33 @@
+/* Test of u16_mbtouc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#include "test-u16-mbtouc.h"
+
+int
+main ()
+{
+ test_function (u16_mbtouc);
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-mbtouc.h b/gnulib/tests/unistr/test-u16-mbtouc.h
new file mode 100644
index 00000000..ef0fb68a
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-mbtouc.h
@@ -0,0 +1,82 @@
+/* Test of u16_mbtouc() and u16_mbtouc_unsafe() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+test_function (int (*my_u16_mbtouc) (ucs4_t *, const uint16_t *, size_t))
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint16_t input[] = { 0 };
+ uc = 0xBADFACE;
+ ret = my_u16_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint16_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ret = my_u16_mbtouc (&uc, buf, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint16_t input[] = { 0x20AC };
+ uc = 0xBADFACE;
+ ret = my_u16_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 2-units character input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0xDD1F };
+ uc = 0xBADFACE;
+ ret = my_u16_mbtouc (&uc, input, 2);
+ ASSERT (ret == 2);
+ ASSERT (uc == 0x1D51F);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint16_t input[] = { 0xD835 };
+ uc = 0xBADFACE;
+ ret = my_u16_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1 || ret == 2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint16_t input[] = { 0xDD1F };
+ uc = 0xBADFACE;
+ ret = my_u16_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0xFFFD);
+ }
+}
diff --git a/gnulib/tests/unistr/test-u16-mbtoucr.c b/gnulib/tests/unistr/test-u16-mbtoucr.c
new file mode 100644
index 00000000..fb1264d9
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-mbtoucr.c
@@ -0,0 +1,90 @@
+/* Test of u16_mbtoucr() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint16_t input[] = { 0 };
+ uc = 0xBADFACE;
+ ret = u16_mbtoucr (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint16_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ret = u16_mbtoucr (&uc, buf, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint16_t input[] = { 0x20AC };
+ uc = 0xBADFACE;
+ ret = u16_mbtoucr (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 2-units character input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0xDD1F };
+ uc = 0xBADFACE;
+ ret = u16_mbtoucr (&uc, input, 2);
+ ASSERT (ret == 2);
+ ASSERT (uc == 0x1D51F);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint16_t input[] = { 0xD835 };
+ uc = 0xBADFACE;
+ ret = u16_mbtoucr (&uc, input, 1);
+ ASSERT (ret == -2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint16_t input[] = { 0xDD1F };
+ uc = 0xBADFACE;
+ ret = u16_mbtoucr (&uc, input, 1);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-move.c b/gnulib/tests/unistr/test-u16-move.c
new file mode 100644
index 00000000..ff1e6e35
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-move.c
@@ -0,0 +1,28 @@
+/* Test of u16_move() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_MOVE u16_move
+#define MAGIC 0xBADE
+#include "test-move.h"
diff --git a/gnulib/tests/unistr/test-u16-next.c b/gnulib/tests/unistr/test-u16-next.c
new file mode 100644
index 00000000..d9ac6e93
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-next.c
@@ -0,0 +1,91 @@
+/* Test of u16_next() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ const uint16_t *ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint16_t input[] = { 0 };
+ uc = 0xBADFACE;
+ ret = u16_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint16_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ uc = 0xBADFACE;
+ ret = u16_next (&uc, buf);
+ ASSERT (ret == buf + 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint16_t input[] = { 0x20AC, 0 };
+ uc = 0xBADFACE;
+ ret = u16_next (&uc, input);
+ ASSERT (ret == input + 1);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 2-units character input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0xDD1F, 0 };
+ uc = 0xBADFACE;
+ ret = u16_next (&uc, input);
+ ASSERT (ret == input + 2);
+ ASSERT (uc == 0x1D51F);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0 };
+ uc = 0xBADFACE;
+ ret = u16_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint16_t input[] = { 0xDD1F, 0 };
+ uc = 0xBADFACE;
+ ret = u16_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-prev.c b/gnulib/tests/unistr/test-u16-prev.c
new file mode 100644
index 00000000..90e83418
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-prev.c
@@ -0,0 +1,175 @@
+/* Test of u16_prev() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length, ucs4_t *puc)
+{
+ ucs4_t uc;
+
+ /* Test recognition when at the beginning of the string. */
+ if (u16_prev (&uc, input + input_length, input) != input)
+ return 1;
+
+ /* Test recognition when preceded by a 1-unit character. */
+ {
+ uint16_t buf[100];
+ uint16_t *ptr;
+ size_t i;
+ ucs4_t uc1;
+
+ ptr = buf;
+ *ptr++ = 0x2102;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ if (u16_prev (&uc1, ptr + input_length, buf) != ptr)
+ return 2;
+ if (uc1 != uc)
+ return 3;
+ }
+
+ /* Test recognition when preceded by a 2-unit character. */
+ {
+ uint16_t buf[100];
+ uint16_t *ptr;
+ size_t i;
+ ucs4_t uc1;
+
+ ptr = buf;
+ *ptr++ = 0xD835;
+ *ptr++ = 0xDD1E;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ if (u16_prev (&uc1, ptr + input_length, buf) != ptr)
+ return 4;
+ if (uc1 != uc)
+ return 5;
+ }
+
+ *puc = uc;
+ return 0;
+}
+
+static int
+check_invalid (const uint16_t *input, size_t input_length)
+{
+ ucs4_t uc;
+
+ /* Test recognition when at the beginning of the string. */
+ uc = 0xBADFACE;
+ if (u16_prev (&uc, input + input_length, input) != NULL)
+ return 1;
+ if (uc != 0xBADFACE)
+ return 2;
+
+#if CONFIG_UNICODE_SAFETY
+ /* Test recognition when preceded by a 1-unit character. */
+ {
+ uint16_t buf[100];
+ uint16_t *ptr;
+ size_t i;
+
+ ptr = buf;
+ *ptr++ = 0x2102;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ uc = 0xBADFACE;
+ if (u16_prev (&uc, ptr + input_length, buf) != NULL)
+ return 3;
+ if (uc != 0xBADFACE)
+ return 4;
+ }
+
+ /* Test recognition when preceded by a 2-unit character. */
+ {
+ uint16_t buf[100];
+ uint16_t *ptr;
+ size_t i;
+
+ ptr = buf;
+ *ptr++ = 0xD835;
+ *ptr++ = 0xDD1E;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ uc = 0xBADFACE;
+ if (u16_prev (&uc, ptr + input_length, buf) != NULL)
+ return 5;
+ if (uc != 0xBADFACE)
+ return 6;
+ }
+#endif
+
+ return 0;
+}
+
+int
+main ()
+{
+ ucs4_t uc;
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint16_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ASSERT (check (buf, 1, &uc) == 0);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint16_t input[] = { 0x20AC };
+ uc = 0xBADFACE;
+ ASSERT (check (input, SIZEOF (input), &uc) == 0);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 2-units character input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0xDD1F };
+ uc = 0xBADFACE;
+ ASSERT (check (input, SIZEOF (input), &uc) == 0);
+ ASSERT (uc == 0x1D51F);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint16_t input[] = { 0xD835 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint16_t input[] = { 0xDD1F };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-set.c b/gnulib/tests/unistr/test-u16-set.c
new file mode 100644
index 00000000..f3e63052
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-set.c
@@ -0,0 +1,29 @@
+/* Test of u16_set() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_SET u16_set
+#define MAGIC 0xBADE
+#define VALUE 0x2102
+#include "test-set.h"
diff --git a/gnulib/tests/unistr/test-u16-stpcpy.c b/gnulib/tests/unistr/test-u16-stpcpy.c
new file mode 100644
index 00000000..6bf3ecb1
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-stpcpy.c
@@ -0,0 +1,28 @@
+/* Test of u16_stpcpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STPCPY u16_stpcpy
+#define MAGIC 0xBADE
+#include "test-stpcpy.h"
diff --git a/gnulib/tests/unistr/test-u16-stpncpy.c b/gnulib/tests/unistr/test-u16-stpncpy.c
new file mode 100644
index 00000000..e53ce6be
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-stpncpy.c
@@ -0,0 +1,59 @@
+/* Test of u16_stpncpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STPNCPY u16_stpncpy
+#define MAGIC 0xBADE
+#include "test-stpncpy.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint16_t input[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strcat.c b/gnulib/tests/unistr/test-u16-strcat.c
new file mode 100644
index 00000000..9d6032eb
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strcat.c
@@ -0,0 +1,28 @@
+/* Test of u16_strcat() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STRCAT u16_strcat
+#define MAGIC 0xBADE
+#include "test-strcat.h"
diff --git a/gnulib/tests/unistr/test-u16-strcmp.c b/gnulib/tests/unistr/test-u16-strcmp.c
new file mode 100644
index 00000000..5fc47774
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strcmp.c
@@ -0,0 +1,34 @@
+/* Test of u16_strcmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define U_STRCMP u16_strcmp
+#include "test-u16-strcmp.h"
+
+int
+main ()
+{
+ test_u16_strcmp ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strcmp.h b/gnulib/tests/unistr/test-u16-strcmp.h
new file mode 100644
index 00000000..ad54a437
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strcmp.h
@@ -0,0 +1,42 @@
+/* Test of u16_strcmp() and u16_strcoll() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#define UNIT uint16_t
+#include "test-strcmp.h"
+
+static void
+test_u16_strcmp (void)
+{
+ test_strcmp ();
+
+ /* Test comparison between ASCII and non-ASCII characters. */
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 0x2022, 0 };
+ ASSERT (U_STRCMP (input1, input2) < 0);
+ ASSERT (U_STRCMP (input2, input1) > 0);
+ }
+
+ /* Test comparison with non-BMP characters, split into surrogates. */
+ {
+ static const UNIT input1[] = { 0xD835, 0xDD1E, 0 };
+ static const UNIT input2[] = { 0xFEFF, 0 };
+ ASSERT (U_STRCMP (input1, input2) > 0);
+ ASSERT (U_STRCMP (input2, input1) < 0);
+ }
+}
diff --git a/gnulib/tests/unistr/test-u16-strcoll.c b/gnulib/tests/unistr/test-u16-strcoll.c
new file mode 100644
index 00000000..e24814a1
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strcoll.c
@@ -0,0 +1,41 @@
+/* Test of u16_strcoll() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define U_STRCMP u16_strcoll
+#include "test-u16-strcmp.h"
+
+int
+main ()
+{
+ /* This test relies on three facts:
+ - setlocale is not being called, therefore the locale is the "C" locale.
+ - In the "C" locale, strcoll is equivalent to strcmp.
+ - In the u16_strcoll implementation, Unicode strings that are not
+ convertible to the locale encoding are sorted higher than convertible
+ strings and compared according to u16_strcmp. */
+
+ test_u16_strcmp ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strcpy.c b/gnulib/tests/unistr/test-u16-strcpy.c
new file mode 100644
index 00000000..e017a112
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strcpy.c
@@ -0,0 +1,28 @@
+/* Test of u16_strcpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STRCPY u16_strcpy
+#define MAGIC 0xBADE
+#include "test-strcpy.h"
diff --git a/gnulib/tests/unistr/test-u16-strdup.c b/gnulib/tests/unistr/test-u16-strdup.c
new file mode 100644
index 00000000..f0266d1b
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strdup.c
@@ -0,0 +1,27 @@
+/* Test of u16_strdup() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STRDUP u16_strdup
+#include "test-strdup.h"
diff --git a/gnulib/tests/unistr/test-u16-strlen.c b/gnulib/tests/unistr/test-u16-strlen.c
new file mode 100644
index 00000000..7b8690be
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strlen.c
@@ -0,0 +1,57 @@
+/* Test of u16_strlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Empty string. */
+ {
+ static const uint16_t input[] = { 0 };
+ ASSERT (u16_strlen (input) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ ASSERT (u16_strlen (input) == SIZEOF (input) - 1);
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint16_t input[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E, 0
+ };
+ ASSERT (u16_strlen (input) == SIZEOF (input) - 1);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strmblen.c b/gnulib/tests/unistr/test-u16-strmblen.c
new file mode 100644
index 00000000..80371b0a
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strmblen.c
@@ -0,0 +1,78 @@
+/* Test of u16_strmblen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint16_t input[] = { 0 };
+ ret = u16_strmblen (input);
+ ASSERT (ret == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint16_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ ret = u16_strmblen (buf);
+ ASSERT (ret == 1);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint16_t input[] = { 0x20AC, 0 };
+ ret = u16_strmblen (input);
+ ASSERT (ret == 1);
+ }
+
+ /* Test 2-units character input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0xDD1F, 0 };
+ ret = u16_strmblen (input);
+ ASSERT (ret == 2);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0 };
+ ret = u16_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint16_t input[] = { 0xDD1F, 0 };
+ ret = u16_strmblen (input);
+ ASSERT (ret == -1);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strmbtouc.c b/gnulib/tests/unistr/test-u16-strmbtouc.c
new file mode 100644
index 00000000..ceeaf2cd
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strmbtouc.c
@@ -0,0 +1,91 @@
+/* Test of u16_strmbtouc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint16_t input[] = { 0 };
+ uc = 0xBADFACE;
+ ret = u16_strmbtouc (&uc, input);
+ ASSERT (ret == 0);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint16_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ uc = 0xBADFACE;
+ ret = u16_strmbtouc (&uc, buf);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint16_t input[] = { 0x20AC, 0 };
+ uc = 0xBADFACE;
+ ret = u16_strmbtouc (&uc, input);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 2-units character input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0xDD1F, 0 };
+ uc = 0xBADFACE;
+ ret = u16_strmbtouc (&uc, input);
+ ASSERT (ret == 2);
+ ASSERT (uc == 0x1D51F);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint16_t input[] = { 0xD835, 0 };
+ uc = 0xBADFACE;
+ ret = u16_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint16_t input[] = { 0xDD1F, 0 };
+ uc = 0xBADFACE;
+ ret = u16_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strncat.c b/gnulib/tests/unistr/test-u16-strncat.c
new file mode 100644
index 00000000..c875cfc8
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strncat.c
@@ -0,0 +1,59 @@
+/* Test of u16_strncat() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STRNCAT u16_strncat
+#define MAGIC 0xBADE
+#include "test-strncat.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint16_t input[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strncmp.c b/gnulib/tests/unistr/test-u16-strncmp.c
new file mode 100644
index 00000000..b04431bd
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strncmp.c
@@ -0,0 +1,47 @@
+/* Test of u16_strncmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STRNCMP u16_strncmp
+#include "test-strncmp.h"
+
+int
+main ()
+{
+ test_strncmp ();
+
+ /* Test comparison with non-BMP characters, split into surrogates. */
+ {
+ static const UNIT input1[] = { 0xD835, 0xDD1E, 0 };
+ static const UNIT input2[] = { 0xFEFF, 0 };
+ ASSERT (U_STRNCMP (input1, input2, 1) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 1) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 2) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 2) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 1000000) < 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strncpy.c b/gnulib/tests/unistr/test-u16-strncpy.c
new file mode 100644
index 00000000..102f6534
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strncpy.c
@@ -0,0 +1,59 @@
+/* Test of u16_strncpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STRNCPY u16_strncpy
+#define MAGIC 0xBADE
+#include "test-strncpy.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint16_t input[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-strnlen.c b/gnulib/tests/unistr/test-u16-strnlen.c
new file mode 100644
index 00000000..beeba64b
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-strnlen.c
@@ -0,0 +1,56 @@
+/* Test of u16_strnlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint16_t
+#define U_STRNLEN u16_strnlen
+#include "test-strnlen.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint16_t input[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-to-u32.c b/gnulib/tests/unistr/test-u16-to-u32.c
new file mode 100644
index 00000000..5b382b2f
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-to-u32.c
@@ -0,0 +1,156 @@
+/* Test of u16_to_u32() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <errno.h>
+
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_to_u32 (input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u16_to_u32 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u16_to_u32 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint32_t expected[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint16_t input[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E
+ };
+ static const uint32_t expected[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* Invalid input. */
+ {
+ static const uint16_t input[] = { 'x', 0xDD1E, 0xD835, 'y' };
+#if 0 /* Currently invalid input is rejected, not accommodated. */
+ static const uint32_t expected[] = { 'x', 0xFFFD, 0xFFFD, 'y' };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+#else
+ size_t length;
+ uint32_t *result;
+ uint32_t preallocated[10];
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_to_u32 (input, SIZEOF (input), NULL, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf too small. */
+ length = 1;
+ result = u16_to_u32 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf large enough. */
+ length = SIZEOF (preallocated);
+ result = u16_to_u32 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+#endif
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-to-u8.c b/gnulib/tests/unistr/test-u16-to-u8.c
new file mode 100644
index 00000000..4ef9b9b6
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-to-u8.c
@@ -0,0 +1,159 @@
+/* Test of u16_to_u8() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <errno.h>
+
+#include "macros.h"
+
+static int
+check (const uint16_t *input, size_t input_length,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_to_u8 (input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u16_to_u8 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u16_to_u8 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint16_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint8_t expected[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint16_t input[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E
+ };
+ static const uint8_t expected[] =
+ { '-', '(', 0xF0, 0x9D, 0x94, 0x9E, 0xC3, 0x97, 0xF0, 0x9D, 0x94, 0x9F,
+ ')', '=', 0xF0, 0x9D, 0x94, 0x9F, 0xC3, 0x97, 0xF0, 0x9D, 0x94, 0x9E
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* Invalid input. */
+ {
+ static const uint16_t input[] = { 'x', 0xDD1E, 0xD835, 'y' };
+#if 0 /* Currently invalid input is rejected, not accommodated. */
+ static const uint8_t expected[] =
+ { 'x', 0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 'y' };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+#else
+ size_t length;
+ uint8_t *result;
+ uint8_t preallocated[10];
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u16_to_u8 (input, SIZEOF (input), NULL, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf too small. */
+ length = 1;
+ result = u16_to_u8 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf large enough. */
+ length = SIZEOF (preallocated);
+ result = u16_to_u8 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+#endif
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u16-uctomb.c b/gnulib/tests/unistr/test-u16-uctomb.c
new file mode 100644
index 00000000..ba502254
--- /dev/null
+++ b/gnulib/tests/unistr/test-u16-uctomb.c
@@ -0,0 +1,110 @@
+/* Test of u16_uctomb() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define MAGIC 0xBADE
+
+int
+main ()
+{
+ /* Test ISO 646 character, in particular the NUL character. */
+ {
+ ucs4_t uc;
+
+ for (uc = 0; uc < 0x80; uc++)
+ {
+ uint16_t buf[3] = { MAGIC, MAGIC, MAGIC };
+ int ret;
+
+ ret = u16_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u16_uctomb (buf, uc, 1);
+ ASSERT (ret == 1);
+ ASSERT (buf[0] == uc);
+ ASSERT (buf[1] == MAGIC);
+ }
+ }
+
+ /* Test BMP character. */
+ {
+ ucs4_t uc = 0x20AC;
+ uint16_t buf[3] = { MAGIC, MAGIC, MAGIC };
+ int ret;
+
+ ret = u16_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u16_uctomb (buf, uc, 1);
+ ASSERT (ret == 1);
+ ASSERT (buf[0] == uc);
+ ASSERT (buf[1] == MAGIC);
+ }
+
+ /* Test non-BMP character. */
+ {
+ ucs4_t uc = 0x10FFFD;
+ uint16_t buf[3] = { MAGIC, MAGIC, MAGIC };
+ int ret;
+
+ ret = u16_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u16_uctomb (buf, uc, 1);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u16_uctomb (buf, uc, 2);
+ ASSERT (ret == 2);
+ ASSERT (buf[0] == 0xDBFF);
+ ASSERT (buf[1] == 0xDFFD);
+ ASSERT (buf[2] == MAGIC);
+ }
+
+ /* Test invalid characters. */
+ {
+ ucs4_t invalid[] = { 0x110000, 0xD800, 0xDBFF, 0xDC00, 0xDFFF };
+ uint16_t buf[3] = { MAGIC, MAGIC, MAGIC };
+ size_t i;
+
+ for (i = 0; i < SIZEOF (invalid); i++)
+ {
+ ucs4_t uc = invalid[i];
+ int n;
+
+ for (n = 0; n <= 2; n++)
+ {
+ int ret = u16_uctomb (buf, uc, n);
+ ASSERT (ret == -1);
+ ASSERT (buf[0] == MAGIC);
+ ASSERT (buf[1] == MAGIC);
+ ASSERT (buf[2] == MAGIC);
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-check.c b/gnulib/tests/unistr/test-u32-check.c
new file mode 100644
index 00000000..fdd64df6
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-check.c
@@ -0,0 +1,66 @@
+/* Test of u32_check() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test empty string. */
+ {
+ static const uint32_t input[] = { 0 };
+ ASSERT (u32_check (input, 0) == NULL);
+ }
+
+ /* Test valid non-empty string. */
+ {
+ static const uint32_t input[] = /* "Данило Шеган" */
+ { 0x0414, 0x0430, 0x043D, 0x0438, 0x043B, 0x043E, 0x0020, 0x0428, 0x0435, 0x0433, 0x0430, 0x043D };
+ ASSERT (u32_check (input, SIZEOF (input)) == NULL);
+ }
+
+ /* Test out-of-range character with 1 unit: U+110000. */
+ {
+ static const uint32_t input[] = { 0x0414, 0x0430, 0x110000 };
+ ASSERT (u32_check (input, SIZEOF (input)) == input + 2);
+ }
+
+ /* Test surrogate codepoints. */
+ {
+ static const uint32_t input[] = { 0x0414, 0x0430, 0xDBFF, 0xDFFF };
+ ASSERT (u32_check (input, SIZEOF (input)) == input + 2);
+ }
+ {
+ static const uint32_t input[] = { 0x0414, 0x0430, 0xDBFF };
+ ASSERT (u32_check (input, SIZEOF (input)) == input + 2);
+ }
+ {
+ static const uint32_t input[] = { 0x0414, 0x0430, 0xDFFF };
+ ASSERT (u32_check (input, SIZEOF (input)) == input + 2);
+ }
+ {
+ static const uint32_t input[] = { 0x0414, 0x0430, 0xDFFF, 0xDBFF };
+ ASSERT (u32_check (input, SIZEOF (input)) == input + 2);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-chr.c b/gnulib/tests/unistr/test-u32-chr.c
new file mode 100644
index 00000000..f23aa084
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-chr.c
@@ -0,0 +1,31 @@
+/* Test of u32_chr() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_CHR u32_chr
+#define U_SET u32_set
+#include "test-chr.h"
diff --git a/gnulib/tests/unistr/test-u32-cmp.c b/gnulib/tests/unistr/test-u32-cmp.c
new file mode 100644
index 00000000..ab41b31f
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-cmp.c
@@ -0,0 +1,45 @@
+/* Test of u32_cmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_CMP u32_cmp
+#define MAGIC 0xBADFACE
+#include "test-cmp.h"
+
+int
+main ()
+{
+ test_cmp ();
+
+ /* Test comparison with non-BMP characters. */
+ {
+ static const UNIT input1[] = { 0x1D51F };
+ static const UNIT input2[] = { 0xFEFF };
+ ASSERT (U_CMP (input1, input2, 1) > 0);
+ ASSERT (U_CMP (input2, input1, 1) < 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-cmp2.c b/gnulib/tests/unistr/test-u32-cmp2.c
new file mode 100644
index 00000000..84450b56
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-cmp2.c
@@ -0,0 +1,28 @@
+/* Test of u32_cmp2() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_CMP2 u32_cmp2
+#define MAGIC 0xBADFACE
+#include "test-cmp2.h"
diff --git a/gnulib/tests/unistr/test-u32-cpy-alloc.c b/gnulib/tests/unistr/test-u32-cpy-alloc.c
new file mode 100644
index 00000000..d3675dd7
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-cpy-alloc.c
@@ -0,0 +1,29 @@
+/* Test of u32_cpy_alloc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_CPY_ALLOC u32_cpy_alloc
+#include "test-cpy-alloc.h"
diff --git a/gnulib/tests/unistr/test-u32-cpy.c b/gnulib/tests/unistr/test-u32-cpy.c
new file mode 100644
index 00000000..49fc9951
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-cpy.c
@@ -0,0 +1,28 @@
+/* Test of u32_cpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_CPY u32_cpy
+#define MAGIC 0xBADFACE
+#include "test-cpy.h"
diff --git a/gnulib/tests/unistr/test-u32-mblen.c b/gnulib/tests/unistr/test-u32-mblen.c
new file mode 100644
index 00000000..1ebd93eb
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-mblen.c
@@ -0,0 +1,81 @@
+/* Test of u32_mblen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ int ret;
+
+ /* Test zero-length input. */
+ {
+ static const uint32_t input[] = { 0 };
+ ret = u32_mblen (input, 0);
+ ASSERT (ret == -1);
+ }
+
+ /* Test NUL unit input. */
+ {
+ static const uint32_t input[] = { 0 };
+ ret = u32_mblen (input, 1);
+ ASSERT (ret == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint32_t buf[1];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ ret = u32_mblen (buf, 1);
+ ASSERT (ret == 1);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x20AC };
+ ret = u32_mblen (input, 1);
+ ASSERT (ret == 1);
+ }
+
+ /* Test non-BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x1D51F };
+ ret = u32_mblen (input, 1);
+ ASSERT (ret == 1);
+ }
+
+#if CONFIG_UNICODE_SAFETY
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint32_t input[] = { 0x340000 };
+ ret = u32_mblen (input, 1);
+ ASSERT (ret == -1);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-mbsnlen.c b/gnulib/tests/unistr/test-u32-mbsnlen.c
new file mode 100644
index 00000000..d9e066ba
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-mbsnlen.c
@@ -0,0 +1,63 @@
+/* Test of u32_mbsnlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (input); n++)
+ {
+ size_t len = u32_mbsnlen (input, n);
+ ASSERT (len == n);
+ }
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint32_t input[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E
+ };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (input); n++)
+ {
+ size_t len = u32_mbsnlen (input, n);
+ ASSERT (len == n);
+ }
+ }
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-mbtouc-unsafe.c b/gnulib/tests/unistr/test-u32-mbtouc-unsafe.c
new file mode 100644
index 00000000..cb3052cb
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-mbtouc-unsafe.c
@@ -0,0 +1,33 @@
+/* Test of u32_mbtouc_unsafe() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#include "test-u32-mbtouc.h"
+
+int
+main ()
+{
+ test_function (u32_mbtouc_unsafe);
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-mbtouc.c b/gnulib/tests/unistr/test-u32-mbtouc.c
new file mode 100644
index 00000000..7c981b5c
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-mbtouc.c
@@ -0,0 +1,36 @@
+/* Test of u32_mbtouc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+/* Enable all tests that may be skipped when testing u32_mbtouc_unsafe. */
+#define FULL_SAFETY 1
+
+#include "test-u32-mbtouc.h"
+
+int
+main ()
+{
+ test_function (u32_mbtouc);
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-mbtouc.h b/gnulib/tests/unistr/test-u32-mbtouc.h
new file mode 100644
index 00000000..7d701334
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-mbtouc.h
@@ -0,0 +1,77 @@
+/* Test of u32_mbtouc() and u32_mbtouc_unsafe() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+test_function (int (*my_u32_mbtouc) (ucs4_t *, const uint32_t *, size_t))
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint32_t input[] = { 0 };
+ uc = 0xBADFACE;
+ ret = my_u32_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint32_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ret = my_u32_mbtouc (&uc, buf, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x20AC };
+ uc = 0xBADFACE;
+ ret = my_u32_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test non-BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x1D51F };
+ uc = 0xBADFACE;
+ ret = my_u32_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x1D51F);
+ }
+
+#if FULL_SAFETY || CONFIG_UNICODE_SAFETY
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint32_t input[] = { 0x340000 };
+ uc = 0xBADFACE;
+ ret = my_u32_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0xFFFD);
+ }
+#endif
+}
diff --git a/gnulib/tests/unistr/test-u32-mbtoucr.c b/gnulib/tests/unistr/test-u32-mbtoucr.c
new file mode 100644
index 00000000..7b1034c5
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-mbtoucr.c
@@ -0,0 +1,83 @@
+/* Test of u32_mbtoucr() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint32_t input[] = { 0 };
+ uc = 0xBADFACE;
+ ret = u32_mbtoucr (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint32_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ret = u32_mbtoucr (&uc, buf, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x20AC };
+ uc = 0xBADFACE;
+ ret = u32_mbtoucr (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test non-BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x1D51F };
+ uc = 0xBADFACE;
+ ret = u32_mbtoucr (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x1D51F);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint32_t input[] = { 0x340000 };
+ uc = 0xBADFACE;
+ ret = u32_mbtoucr (&uc, input, 1);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-move.c b/gnulib/tests/unistr/test-u32-move.c
new file mode 100644
index 00000000..44f95c00
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-move.c
@@ -0,0 +1,28 @@
+/* Test of u32_move() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_MOVE u32_move
+#define MAGIC 0xBADFACE
+#include "test-move.h"
diff --git a/gnulib/tests/unistr/test-u32-next.c b/gnulib/tests/unistr/test-u32-next.c
new file mode 100644
index 00000000..a5852e2c
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-next.c
@@ -0,0 +1,86 @@
+/* Test of u32_next() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ const uint32_t *ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint32_t input[] = { 0 };
+ uc = 0xBADFACE;
+ ret = u32_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint32_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ uc = 0xBADFACE;
+ ret = u32_next (&uc, buf);
+ ASSERT (ret == buf + 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x20AC, 0 };
+ uc = 0xBADFACE;
+ ret = u32_next (&uc, input);
+ ASSERT (ret == input + 1);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test non-BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x1D51F, 0 };
+ uc = 0xBADFACE;
+ ret = u32_next (&uc, input);
+ ASSERT (ret == input + 1);
+ ASSERT (uc == 0x1D51F);
+ }
+
+#if CONFIG_UNICODE_SAFETY
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint32_t input[] = { 0x340000, 0 };
+ uc = 0xBADFACE;
+ ret = u32_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-prev.c b/gnulib/tests/unistr/test-u32-prev.c
new file mode 100644
index 00000000..95187afa
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-prev.c
@@ -0,0 +1,133 @@
+/* Test of u32_prev() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length, ucs4_t *puc)
+{
+ ucs4_t uc;
+
+ /* Test recognition when at the beginning of the string. */
+ if (u32_prev (&uc, input + input_length, input) != input)
+ return 1;
+
+ /* Test recognition when preceded by a 1-unit character. */
+ {
+ uint32_t buf[100];
+ uint32_t *ptr;
+ size_t i;
+ ucs4_t uc1;
+
+ ptr = buf;
+ *ptr++ = 0x1D51E;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ if (u32_prev (&uc1, ptr + input_length, buf) != ptr)
+ return 2;
+ if (uc1 != uc)
+ return 3;
+ }
+
+ *puc = uc;
+ return 0;
+}
+
+static int
+check_invalid (const uint32_t *input, size_t input_length)
+{
+#if CONFIG_UNICODE_SAFETY
+ ucs4_t uc;
+
+ /* Test recognition when at the beginning of the string. */
+ uc = 0xBADFACE;
+ if (u32_prev (&uc, input + input_length, input) != NULL)
+ return 1;
+ if (uc != 0xBADFACE)
+ return 2;
+
+ /* Test recognition when preceded by a 1-unit character. */
+ {
+ uint32_t buf[100];
+ uint32_t *ptr;
+ size_t i;
+
+ ptr = buf;
+ *ptr++ = 0x1D51E;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ uc = 0xBADFACE;
+ if (u32_prev (&uc, ptr + input_length, buf) != NULL)
+ return 3;
+ if (uc != 0xBADFACE)
+ return 4;
+ }
+#endif
+
+ return 0;
+}
+
+int
+main ()
+{
+ ucs4_t uc;
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint32_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ASSERT (check (buf, 1, &uc) == 0);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x20AC };
+ uc = 0xBADFACE;
+ ASSERT (check (input, SIZEOF (input), &uc) == 0);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test non-BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x1D51F };
+ uc = 0xBADFACE;
+ ASSERT (check (input, SIZEOF (input), &uc) == 0);
+ ASSERT (uc == 0x1D51F);
+ }
+
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint32_t input[] = { 0x340000 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-set.c b/gnulib/tests/unistr/test-u32-set.c
new file mode 100644
index 00000000..120804f1
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-set.c
@@ -0,0 +1,29 @@
+/* Test of u32_set() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_SET u32_set
+#define MAGIC 0xBADFACE
+#define VALUE 0x1D51E
+#include "test-set.h"
diff --git a/gnulib/tests/unistr/test-u32-stpcpy.c b/gnulib/tests/unistr/test-u32-stpcpy.c
new file mode 100644
index 00000000..9c99c52a
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-stpcpy.c
@@ -0,0 +1,28 @@
+/* Test of u32_stpcpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STPCPY u32_stpcpy
+#define MAGIC 0xBADFACE
+#include "test-stpcpy.h"
diff --git a/gnulib/tests/unistr/test-u32-stpncpy.c b/gnulib/tests/unistr/test-u32-stpncpy.c
new file mode 100644
index 00000000..e29683bd
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-stpncpy.c
@@ -0,0 +1,59 @@
+/* Test of u32_stpncpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STPNCPY u32_stpncpy
+#define MAGIC 0xBADFACE
+#include "test-stpncpy.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint32_t input[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strcat.c b/gnulib/tests/unistr/test-u32-strcat.c
new file mode 100644
index 00000000..66e7c853
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strcat.c
@@ -0,0 +1,28 @@
+/* Test of u32_strcat() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STRCAT u32_strcat
+#define MAGIC 0xBADFACE
+#include "test-strcat.h"
diff --git a/gnulib/tests/unistr/test-u32-strcmp.c b/gnulib/tests/unistr/test-u32-strcmp.c
new file mode 100644
index 00000000..8364a415
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strcmp.c
@@ -0,0 +1,34 @@
+/* Test of u32_strcmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define U_STRCMP u32_strcmp
+#include "test-u32-strcmp.h"
+
+int
+main ()
+{
+ test_u32_strcmp ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strcmp.h b/gnulib/tests/unistr/test-u32-strcmp.h
new file mode 100644
index 00000000..6d24132e
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strcmp.h
@@ -0,0 +1,42 @@
+/* Test of u32_strcmp() and u32_strcoll() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#define UNIT uint32_t
+#include "test-strcmp.h"
+
+static void
+test_u32_strcmp (void)
+{
+ test_strcmp ();
+
+ /* Test comparison between ASCII and non-ASCII characters. */
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 0x2022, 0 };
+ ASSERT (U_STRCMP (input1, input2) < 0);
+ ASSERT (U_STRCMP (input2, input1) > 0);
+ }
+
+ /* Test comparison with non-BMP characters. */
+ {
+ static const UNIT input1[] = { 0x1D51F, 0 };
+ static const UNIT input2[] = { 0xFEFF, 0 };
+ ASSERT (U_STRCMP (input1, input2) > 0);
+ ASSERT (U_STRCMP (input2, input1) < 0);
+ }
+}
diff --git a/gnulib/tests/unistr/test-u32-strcoll.c b/gnulib/tests/unistr/test-u32-strcoll.c
new file mode 100644
index 00000000..36954e73
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strcoll.c
@@ -0,0 +1,41 @@
+/* Test of u32_strcoll() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define U_STRCMP u32_strcoll
+#include "test-u32-strcmp.h"
+
+int
+main ()
+{
+ /* This test relies on three facts:
+ - setlocale is not being called, therefore the locale is the "C" locale.
+ - In the "C" locale, strcoll is equivalent to strcmp.
+ - In the u32_strcoll implementation, Unicode strings that are not
+ convertible to the locale encoding are sorted higher than convertible
+ strings and compared according to u32_strcmp. */
+
+ test_u32_strcmp ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strcpy.c b/gnulib/tests/unistr/test-u32-strcpy.c
new file mode 100644
index 00000000..2e22aad4
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strcpy.c
@@ -0,0 +1,28 @@
+/* Test of u32_strcpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STRCPY u32_strcpy
+#define MAGIC 0xBADFACE
+#include "test-strcpy.h"
diff --git a/gnulib/tests/unistr/test-u32-strdup.c b/gnulib/tests/unistr/test-u32-strdup.c
new file mode 100644
index 00000000..ede8e544
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strdup.c
@@ -0,0 +1,27 @@
+/* Test of u32_strdup() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STRDUP u32_strdup
+#include "test-strdup.h"
diff --git a/gnulib/tests/unistr/test-u32-strlen.c b/gnulib/tests/unistr/test-u32-strlen.c
new file mode 100644
index 00000000..a349be75
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strlen.c
@@ -0,0 +1,57 @@
+/* Test of u32_strlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Empty string. */
+ {
+ static const uint32_t input[] = { 0 };
+ ASSERT (u32_strlen (input) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ ASSERT (u32_strlen (input) == SIZEOF (input) - 1);
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint32_t input[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E, 0
+ };
+ ASSERT (u32_strlen (input) == SIZEOF (input) - 1);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strmblen.c b/gnulib/tests/unistr/test-u32-strmblen.c
new file mode 100644
index 00000000..733f8fc8
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strmblen.c
@@ -0,0 +1,75 @@
+/* Test of u32_strmblen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint32_t input[] = { 0 };
+ ret = u32_strmblen (input);
+ ASSERT (ret == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint32_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ ret = u32_strmblen (buf);
+ ASSERT (ret == 1);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x20AC, 0 };
+ ret = u32_strmblen (input);
+ ASSERT (ret == 1);
+ }
+
+ /* Test non-BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x1D51F, 0 };
+ ret = u32_strmblen (input);
+ ASSERT (ret == 1);
+ }
+
+#if CONFIG_UNICODE_SAFETY
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint32_t input[] = { 0x340000, 0 };
+ ret = u32_strmblen (input);
+ ASSERT (ret == -1);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strmbtouc.c b/gnulib/tests/unistr/test-u32-strmbtouc.c
new file mode 100644
index 00000000..79c222e0
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strmbtouc.c
@@ -0,0 +1,86 @@
+/* Test of u32_strmbtouc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint32_t input[] = { 0 };
+ uc = 0xBADFACE;
+ ret = u32_strmbtouc (&uc, input);
+ ASSERT (ret == 0);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint32_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ uc = 0xBADFACE;
+ ret = u32_strmbtouc (&uc, buf);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x20AC, 0 };
+ uc = 0xBADFACE;
+ ret = u32_strmbtouc (&uc, input);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test non-BMP unit input. */
+ {
+ static const uint32_t input[] = { 0x1D51F, 0 };
+ uc = 0xBADFACE;
+ ret = u32_strmbtouc (&uc, input);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0x1D51F);
+ }
+
+#if CONFIG_UNICODE_SAFETY
+ /* Test incomplete/invalid 1-unit input. */
+ {
+ static const uint32_t input[] = { 0x340000, 0 };
+ uc = 0xBADFACE;
+ ret = u32_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strncat.c b/gnulib/tests/unistr/test-u32-strncat.c
new file mode 100644
index 00000000..346bafb7
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strncat.c
@@ -0,0 +1,59 @@
+/* Test of u32_strncat() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STRNCAT u32_strncat
+#define MAGIC 0xBADFACE
+#include "test-strncat.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint32_t input[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strncmp.c b/gnulib/tests/unistr/test-u32-strncmp.c
new file mode 100644
index 00000000..d69913da
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strncmp.c
@@ -0,0 +1,47 @@
+/* Test of u32_strncmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STRNCMP u32_strncmp
+#include "test-strncmp.h"
+
+int
+main ()
+{
+ test_strncmp ();
+
+ /* Test comparison with non-BMP characters. */
+ {
+ static const UNIT input1[] = { 0x1D51F, 0 };
+ static const UNIT input2[] = { 0xFEFF, 0 };
+ ASSERT (U_STRNCMP (input1, input2, 1) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 1) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 2) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 2) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 1000000) < 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strncpy.c b/gnulib/tests/unistr/test-u32-strncpy.c
new file mode 100644
index 00000000..9309c0ed
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strncpy.c
@@ -0,0 +1,59 @@
+/* Test of u32_strncpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STRNCPY u32_strncpy
+#define MAGIC 0xBADFACE
+#include "test-strncpy.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint32_t input[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-strnlen.c b/gnulib/tests/unistr/test-u32-strnlen.c
new file mode 100644
index 00000000..69299148
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-strnlen.c
@@ -0,0 +1,56 @@
+/* Test of u32_strnlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint32_t
+#define U_STRNLEN u32_strnlen
+#include "test-strnlen.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint32_t input[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E, 0
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-to-u16.c b/gnulib/tests/unistr/test-u32-to-u16.c
new file mode 100644
index 00000000..6faf5379
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-to-u16.c
@@ -0,0 +1,156 @@
+/* Test of u32_to_u16() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <errno.h>
+
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_to_u16 (input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u32_to_u16 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u32_to_u16 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint16_t expected[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint32_t input[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E
+ };
+ static const uint16_t expected[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* Invalid input. */
+ {
+ static const uint32_t input[] = { 'x', 0x340000, 0x50000000, 'y' };
+#if 0 /* Currently invalid input is rejected, not accommodated. */
+ static const uint16_t expected[] = { 'x', 0xFFFD, 0xFFFD, 'y' };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+#else
+ size_t length;
+ uint16_t *result;
+ uint16_t preallocated[10];
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_to_u16 (input, SIZEOF (input), NULL, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf too small. */
+ length = 1;
+ result = u32_to_u16 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf large enough. */
+ length = SIZEOF (preallocated);
+ result = u32_to_u16 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+#endif
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-to-u8.c b/gnulib/tests/unistr/test-u32-to-u8.c
new file mode 100644
index 00000000..933fba09
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-to-u8.c
@@ -0,0 +1,159 @@
+/* Test of u32_to_u8() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <errno.h>
+
+#include "macros.h"
+
+static int
+check (const uint32_t *input, size_t input_length,
+ const uint8_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint8_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_to_u8 (input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint8_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u32_to_u8 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint8_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint8_t *) malloc (length * sizeof (uint8_t));
+ result = u32_to_u8 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u8_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint32_t input[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ static const uint8_t expected[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint32_t input[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E
+ };
+ static const uint8_t expected[] =
+ { '-', '(', 0xF0, 0x9D, 0x94, 0x9E, 0xC3, 0x97, 0xF0, 0x9D, 0x94, 0x9F,
+ ')', '=', 0xF0, 0x9D, 0x94, 0x9F, 0xC3, 0x97, 0xF0, 0x9D, 0x94, 0x9E
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* Invalid input. */
+ {
+ static const uint32_t input[] = { 'x', 0x340000, 0x50000000, 'y' };
+#if 0 /* Currently invalid input is rejected, not accommodated. */
+ static const uint8_t expected[] =
+ { 'x', 0xEF, 0xBF, 0xBD, 0xEF, 0xBF, 0xBD, 'y' };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+#else
+ size_t length;
+ uint8_t *result;
+ uint8_t preallocated[10];
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u32_to_u8 (input, SIZEOF (input), NULL, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf too small. */
+ length = 1;
+ result = u32_to_u8 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf large enough. */
+ length = SIZEOF (preallocated);
+ result = u32_to_u8 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+#endif
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u32-uctomb.c b/gnulib/tests/unistr/test-u32-uctomb.c
new file mode 100644
index 00000000..0a25177b
--- /dev/null
+++ b/gnulib/tests/unistr/test-u32-uctomb.c
@@ -0,0 +1,104 @@
+/* Test of u32_uctomb() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define MAGIC 0xBADFACE
+
+int
+main ()
+{
+ /* Test ISO 646 character, in particular the NUL character. */
+ {
+ ucs4_t uc;
+
+ for (uc = 0; uc < 0x80; uc++)
+ {
+ uint32_t buf[2] = { MAGIC, MAGIC };
+ int ret;
+
+ ret = u32_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u32_uctomb (buf, uc, 1);
+ ASSERT (ret == 1);
+ ASSERT (buf[0] == uc);
+ ASSERT (buf[1] == MAGIC);
+ }
+ }
+
+ /* Test BMP character. */
+ {
+ ucs4_t uc = 0x20AC;
+ uint32_t buf[2] = { MAGIC, MAGIC };
+ int ret;
+
+ ret = u32_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u32_uctomb (buf, uc, 1);
+ ASSERT (ret == 1);
+ ASSERT (buf[0] == uc);
+ ASSERT (buf[1] == MAGIC);
+ }
+
+ /* Test non-BMP character. */
+ {
+ ucs4_t uc = 0x10FFFD;
+ uint32_t buf[2] = { MAGIC, MAGIC };
+ int ret;
+
+ ret = u32_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u32_uctomb (buf, uc, 1);
+ ASSERT (ret == 1);
+ ASSERT (buf[0] == uc);
+ ASSERT (buf[1] == MAGIC);
+ }
+
+ /* Test invalid characters. */
+ {
+ ucs4_t invalid[] = { 0x110000, 0xD800, 0xDBFF, 0xDC00, 0xDFFF };
+ uint32_t buf[2] = { MAGIC, MAGIC };
+ size_t i;
+
+ for (i = 0; i < SIZEOF (invalid); i++)
+ {
+ ucs4_t uc = invalid[i];
+ int n;
+
+ for (n = 0; n <= 2; n++)
+ {
+ int ret = u32_uctomb (buf, uc, n);
+ ASSERT (ret == -1);
+ ASSERT (buf[0] == MAGIC);
+ ASSERT (buf[1] == MAGIC);
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-check.c b/gnulib/tests/unistr/test-u8-check.c
new file mode 100644
index 00000000..a32d3850
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-check.c
@@ -0,0 +1,188 @@
+/* Test of u8_check() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test empty string. */
+ {
+ static const uint8_t input[] = "";
+ ASSERT (u8_check (input, 0) == NULL);
+ }
+
+ /* Test valid non-empty string. */
+ {
+ static const uint8_t input[] = /* "Данило Шеган" */
+ "\320\224\320\260\320\275\320\270\320\273\320\276 \320\250\320\265\320\263\320\260\320\275";
+ ASSERT (u8_check (input, sizeof (input) - 1) == NULL);
+ }
+
+ /* Test out-of-range character with 4 bytes: U+110000. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\364\220\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test out-of-range character with 5 bytes: U+200000. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\370\210\200\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test out-of-range character with 6 bytes: U+4000000. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\374\204\200\200\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test invalid lead byte. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\376\200\200\200\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\377\200\200\200\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test overlong 2-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\301\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test overlong 3-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\340\200\277";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test overlong 4-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\360\200\277\277";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test invalid bytes in 2-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\302\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == NULL);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\302\100";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\302\300";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test invalid bytes in 3-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\342\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == NULL);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\342\100\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\342\300\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\342\200\100";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\342\200\300";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test invalid bytes in 4-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\362\200\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == NULL);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\362\100\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\362\300\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\362\200\100\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\362\200\300\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\362\200\200\100";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\362\200\200\300";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test truncated/incomplete 2-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\302";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test truncated/incomplete 3-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\342\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test truncated/incomplete 4-byte character. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\362\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test missing lead byte. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\200\200\200\200\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ /* Test surrogate codepoints. */
+ {
+ static const uint8_t input[] = "\320\224\320\260\355\240\200\355\260\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+ {
+ static const uint8_t input[] = "\320\224\320\260\355\260\200";
+ ASSERT (u8_check (input, sizeof (input) - 1) == input + 4);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-chr.c b/gnulib/tests/unistr/test-u8-chr.c
new file mode 100644
index 00000000..7c4b9990
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-chr.c
@@ -0,0 +1,31 @@
+/* Test of u8_chr() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_CHR u8_chr
+#define U_SET u8_set
+#include "test-chr.h"
diff --git a/gnulib/tests/unistr/test-u8-cmp.c b/gnulib/tests/unistr/test-u8-cmp.c
new file mode 100644
index 00000000..73778c71
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-cmp.c
@@ -0,0 +1,45 @@
+/* Test of u8_cmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_CMP u8_cmp
+#define MAGIC 0xBA
+#include "test-cmp.h"
+
+int
+main ()
+{
+ test_cmp ();
+
+ /* Test comparison with non-BMP characters. */
+ {
+ static const UNIT input1[] = { 0xF0, 0x9D, 0x94, 0x9E };
+ static const UNIT input2[] = { 0xEF, 0xBB, 0xBF, 0x00 };
+ ASSERT (U_CMP (input1, input2, 4) > 0);
+ ASSERT (U_CMP (input2, input1, 4) < 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-cmp2.c b/gnulib/tests/unistr/test-u8-cmp2.c
new file mode 100644
index 00000000..8a7848e8
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-cmp2.c
@@ -0,0 +1,28 @@
+/* Test of u8_cmp2() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_CMP2 u8_cmp2
+#define MAGIC 0xBA
+#include "test-cmp2.h"
diff --git a/gnulib/tests/unistr/test-u8-cpy-alloc.c b/gnulib/tests/unistr/test-u8-cpy-alloc.c
new file mode 100644
index 00000000..2d35b8f4
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-cpy-alloc.c
@@ -0,0 +1,29 @@
+/* Test of u8_cpy_alloc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_CPY_ALLOC u8_cpy_alloc
+#include "test-cpy-alloc.h"
diff --git a/gnulib/tests/unistr/test-u8-cpy.c b/gnulib/tests/unistr/test-u8-cpy.c
new file mode 100644
index 00000000..8d1152dc
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-cpy.c
@@ -0,0 +1,28 @@
+/* Test of u8_cpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_CPY u8_cpy
+#define MAGIC 0xBA
+#include "test-cpy.h"
diff --git a/gnulib/tests/unistr/test-u8-mblen.c b/gnulib/tests/unistr/test-u8-mblen.c
new file mode 100644
index 00000000..75e92d68
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-mblen.c
@@ -0,0 +1,155 @@
+/* Test of u8_mblen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ int ret;
+
+ /* Test zero-length input. */
+ {
+ static const uint8_t input[] = "";
+ ret = u8_mblen (input, 0);
+ ASSERT (ret == -1);
+ }
+
+ /* Test NUL unit input. */
+ {
+ static const uint8_t input[] = "";
+ ret = u8_mblen (input, 1);
+ ASSERT (ret == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint8_t buf[1];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ ret = u8_mblen (buf, 1);
+ ASSERT (ret == 1);
+ }
+ }
+
+ /* Test 2-byte character input. */
+ {
+ static const uint8_t input[] = { 0xC3, 0x97 };
+ ret = u8_mblen (input, 2);
+ ASSERT (ret == 2);
+ }
+
+ /* Test 3-byte character input. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0xAC };
+ ret = u8_mblen (input, 3);
+ ASSERT (ret == 3);
+ }
+
+ /* Test 4-byte character input. */
+ {
+ static const uint8_t input[] = { 0xF4, 0x8F, 0xBF, 0xBD };
+ ret = u8_mblen (input, 4);
+ ASSERT (ret == 4);
+ }
+
+ /* Test incomplete/invalid 1-byte input. */
+ {
+ static const uint8_t input[] = { 0xC1 };
+ ret = u8_mblen (input, 1);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xC3 };
+ ret = u8_mblen (input, 1);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xE2 };
+ ret = u8_mblen (input, 1);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF4 };
+ ret = u8_mblen (input, 1);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xFE };
+ ret = u8_mblen (input, 1);
+ ASSERT (ret == -1);
+ }
+
+ /* Test incomplete/invalid 2-byte input. */
+ {
+ static const uint8_t input[] = { 0xE0, 0x9F };
+ ret = u8_mblen (input, 2);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x82 };
+ ret = u8_mblen (input, 2);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0xD0 };
+ ret = u8_mblen (input, 2);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF0, 0x8F };
+ ret = u8_mblen (input, 2);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F };
+ ret = u8_mblen (input, 2);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0 };
+ ret = u8_mblen (input, 2);
+ ASSERT (ret == -1);
+ }
+
+ /* Test incomplete/invalid 3-byte input. */
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xBF };
+ ret = u8_mblen (input, 3);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0xBF };
+ ret = u8_mblen (input, 3);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xD0 };
+ ret = u8_mblen (input, 3);
+ ASSERT (ret == -1);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-mbsnlen.c b/gnulib/tests/unistr/test-u8-mbsnlen.c
new file mode 100644
index 00000000..8e68550c
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-mbsnlen.c
@@ -0,0 +1,61 @@
+/* Test of u8_mbsnlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const size_t expected[SIZEOF (input) + 1] =
+ { 0,
+ 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17,
+ 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36,
+ 37, 38, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55,
+ 56, 56, 56, 57, 57, 57, 58,
+ 59, 59, 59, 60, 60, 60, 61
+ };
+ size_t n;
+
+ for (n = 0; n <= SIZEOF (input); n++)
+ {
+ size_t len = u8_mbsnlen (input, n);
+ ASSERT (len == expected[n]);
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-mbtouc-unsafe.c b/gnulib/tests/unistr/test-u8-mbtouc-unsafe.c
new file mode 100644
index 00000000..b093aa81
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-mbtouc-unsafe.c
@@ -0,0 +1,33 @@
+/* Test of u8_mbtouc_unsafe() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#include "test-u8-mbtouc.h"
+
+int
+main ()
+{
+ test_function (u8_mbtouc_unsafe);
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-mbtouc.c b/gnulib/tests/unistr/test-u8-mbtouc.c
new file mode 100644
index 00000000..f6960a68
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-mbtouc.c
@@ -0,0 +1,33 @@
+/* Test of u8_mbtouc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#include "test-u8-mbtouc.h"
+
+int
+main ()
+{
+ test_function (u8_mbtouc);
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-mbtouc.h b/gnulib/tests/unistr/test-u8-mbtouc.h
new file mode 100644
index 00000000..bcafb052
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-mbtouc.h
@@ -0,0 +1,179 @@
+/* Test of u8_mbtouc() and u8_mbtouc_unsafe() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+static void
+test_function (int (*my_u8_mbtouc) (ucs4_t *, const uint8_t *, size_t))
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint8_t input[] = "";
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint8_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, buf, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test 2-byte character input. */
+ {
+ static const uint8_t input[] = { 0xC3, 0x97 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 2);
+ ASSERT (ret == 2);
+ ASSERT (uc == 0x00D7);
+ }
+
+ /* Test 3-byte character input. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0xAC };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 3);
+ ASSERT (ret == 3);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 4-byte character input. */
+ {
+ static const uint8_t input[] = { 0xF4, 0x8F, 0xBF, 0xBD };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 4);
+ ASSERT (ret == 4);
+ ASSERT (uc == 0x10FFFD);
+ }
+
+ /* Test incomplete/invalid 1-byte input. */
+ {
+ static const uint8_t input[] = { 0xC1 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xC3 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF4 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xFE };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ /* Test incomplete/invalid 2-byte input. */
+ {
+ static const uint8_t input[] = { 0xE0, 0x9F };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 2);
+ ASSERT (ret == 1 || ret == 2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x82 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 2);
+ ASSERT (ret == 2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0xD0 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 2);
+ ASSERT (ret == 1 || ret == 2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF0, 0x8F };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 2);
+ ASSERT (ret == 1 || ret == 2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 2);
+ ASSERT (ret == 2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 2);
+ ASSERT (ret == 1 || ret == 2);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ /* Test incomplete/invalid 3-byte input. */
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xBF };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 3);
+ ASSERT (ret == 3);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0xBF };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 3);
+ ASSERT (ret == 1 || ret == 3);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xD0 };
+ uc = 0xBADFACE;
+ ret = my_u8_mbtouc (&uc, input, 3);
+ ASSERT (ret == 1 || ret == 3);
+ ASSERT (uc == 0xFFFD);
+ }
+}
diff --git a/gnulib/tests/unistr/test-u8-mbtoucr.c b/gnulib/tests/unistr/test-u8-mbtoucr.c
new file mode 100644
index 00000000..88e08d39
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-mbtoucr.c
@@ -0,0 +1,187 @@
+/* Test of u8_mbtoucr() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint8_t input[] = "";
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint8_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, buf, 1);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test 2-byte character input. */
+ {
+ static const uint8_t input[] = { 0xC3, 0x97 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 2);
+ ASSERT (ret == 2);
+ ASSERT (uc == 0x00D7);
+ }
+
+ /* Test 3-byte character input. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0xAC };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 3);
+ ASSERT (ret == 3);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 4-byte character input. */
+ {
+ static const uint8_t input[] = { 0xF4, 0x8F, 0xBF, 0xBD };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 4);
+ ASSERT (ret == 4);
+ ASSERT (uc == 0x10FFFD);
+ }
+
+ /* Test incomplete/invalid 1-byte input. */
+ {
+ static const uint8_t input[] = { 0xC1 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 1);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xC3 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 1);
+ ASSERT (ret == -2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 1);
+ ASSERT (ret == -2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF4 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 1);
+ ASSERT (ret == -2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xFE };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 1);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ /* Test incomplete/invalid 2-byte input. */
+ {
+ static const uint8_t input[] = { 0xE0, 0x9F };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 2);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x82 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 2);
+ ASSERT (ret == -2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0xD0 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 2);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF0, 0x8F };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 2);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 2);
+ ASSERT (ret == -2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 2);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ /* Test incomplete/invalid 3-byte input. */
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xBF };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 3);
+ ASSERT (ret == -2);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0xBF };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 3);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xD0 };
+ uc = 0xBADFACE;
+ ret = u8_mbtoucr (&uc, input, 3);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-move.c b/gnulib/tests/unistr/test-u8-move.c
new file mode 100644
index 00000000..d18d8dd2
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-move.c
@@ -0,0 +1,28 @@
+/* Test of u8_move() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_MOVE u8_move
+#define MAGIC 0xBA
+#include "test-move.h"
diff --git a/gnulib/tests/unistr/test-u8-next.c b/gnulib/tests/unistr/test-u8-next.c
new file mode 100644
index 00000000..c4e06b59
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-next.c
@@ -0,0 +1,188 @@
+/* Test of u8_next() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ const uint8_t *ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint8_t input[] = "";
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint8_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, buf);
+ ASSERT (ret == buf + 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test 2-byte character input. */
+ {
+ static const uint8_t input[] = { 0xC3, 0x97, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == input + 2);
+ ASSERT (uc == 0x00D7);
+ }
+
+ /* Test 3-byte character input. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0xAC, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == input + 3);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 4-byte character input. */
+ {
+ static const uint8_t input[] = { 0xF4, 0x8F, 0xBF, 0xBD, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == input + 4);
+ ASSERT (uc == 0x10FFFD);
+ }
+
+ /* Test incomplete/invalid 1-byte input. */
+ {
+ static const uint8_t input[] = { 0xC1, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xC3, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF4, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xFE, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ /* Test incomplete/invalid 2-byte input. */
+ {
+ static const uint8_t input[] = { 0xE0, 0x9F, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0xD0, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF0, 0x8F, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ /* Test incomplete/invalid 3-byte input. */
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xBF, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0xBF, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xD0, 0 };
+ uc = 0xBADFACE;
+ ret = u8_next (&uc, input);
+ ASSERT (ret == NULL);
+ ASSERT (uc == 0xFFFD);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-prev.c b/gnulib/tests/unistr/test-u8-prev.c
new file mode 100644
index 00000000..61f47ef8
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-prev.c
@@ -0,0 +1,315 @@
+/* Test of u8_prev() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length, ucs4_t *puc)
+{
+ ucs4_t uc;
+
+ /* Test recognition when at the beginning of the string. */
+ if (u8_prev (&uc, input + input_length, input) != input)
+ return 1;
+
+ /* Test recognition when preceded by a 1-unit character. */
+ {
+ uint8_t buf[100];
+ uint8_t *ptr;
+ size_t i;
+ ucs4_t uc1;
+
+ ptr = buf;
+ *ptr++ = 'x';
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ if (u8_prev (&uc1, ptr + input_length, buf) != ptr)
+ return 2;
+ if (uc1 != uc)
+ return 3;
+ }
+
+ /* Test recognition when preceded by a 2-unit character. */
+ {
+ uint8_t buf[100];
+ uint8_t *ptr;
+ size_t i;
+ ucs4_t uc1;
+
+ ptr = buf;
+ *ptr++ = 0xC3;
+ *ptr++ = 0x97;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ if (u8_prev (&uc1, ptr + input_length, buf) != ptr)
+ return 4;
+ if (uc1 != uc)
+ return 5;
+ }
+
+ /* Test recognition when preceded by a 3-unit character. */
+ {
+ uint8_t buf[100];
+ uint8_t *ptr;
+ size_t i;
+ ucs4_t uc1;
+
+ ptr = buf;
+ *ptr++ = 0xE2;
+ *ptr++ = 0x84;
+ *ptr++ = 0x82;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ if (u8_prev (&uc1, ptr + input_length, buf) != ptr)
+ return 6;
+ if (uc1 != uc)
+ return 7;
+ }
+
+ /* Test recognition when preceded by a 4-unit character. */
+ {
+ uint8_t buf[100];
+ uint8_t *ptr;
+ size_t i;
+ ucs4_t uc1;
+
+ ptr = buf;
+ *ptr++ = 0xF0;
+ *ptr++ = 0x9D;
+ *ptr++ = 0x94;
+ *ptr++ = 0x9E;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ if (u8_prev (&uc1, ptr + input_length, buf) != ptr)
+ return 8;
+ if (uc1 != uc)
+ return 9;
+ }
+
+ *puc = uc;
+ return 0;
+}
+
+static int
+check_invalid (const uint8_t *input, size_t input_length)
+{
+ ucs4_t uc;
+
+ /* Test recognition when at the beginning of the string. */
+ uc = 0xBADFACE;
+ if (u8_prev (&uc, input + input_length, input) != NULL)
+ return 1;
+ if (uc != 0xBADFACE)
+ return 2;
+
+ /* Test recognition when preceded by a 1-unit character. */
+ {
+ uint8_t buf[100];
+ uint8_t *ptr;
+ size_t i;
+
+ ptr = buf;
+ *ptr++ = 'x';
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ uc = 0xBADFACE;
+ if (u8_prev (&uc, ptr + input_length, buf) != NULL)
+ return 3;
+ if (uc != 0xBADFACE)
+ return 4;
+ }
+
+ /* Test recognition when preceded by a 2-unit character. */
+ {
+ uint8_t buf[100];
+ uint8_t *ptr;
+ size_t i;
+
+ ptr = buf;
+ *ptr++ = 0xC3;
+ *ptr++ = 0x97;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ uc = 0xBADFACE;
+ if (u8_prev (&uc, ptr + input_length, buf) != NULL)
+ return 5;
+ if (uc != 0xBADFACE)
+ return 6;
+ }
+
+ /* Test recognition when preceded by a 3-unit character. */
+ {
+ uint8_t buf[100];
+ uint8_t *ptr;
+ size_t i;
+
+ ptr = buf;
+ *ptr++ = 0xE2;
+ *ptr++ = 0x84;
+ *ptr++ = 0x82;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ uc = 0xBADFACE;
+ if (u8_prev (&uc, ptr + input_length, buf) != NULL)
+ return 7;
+ if (uc != 0xBADFACE)
+ return 8;
+ }
+
+ /* Test recognition when preceded by a 4-unit character. */
+ {
+ uint8_t buf[100];
+ uint8_t *ptr;
+ size_t i;
+
+ ptr = buf;
+ *ptr++ = 0xF0;
+ *ptr++ = 0x9D;
+ *ptr++ = 0x94;
+ *ptr++ = 0x9E;
+ for (i = 0; i < input_length; i++)
+ ptr[i] = input[i];
+
+ uc = 0xBADFACE;
+ if (u8_prev (&uc, ptr + input_length, buf) != NULL)
+ return 9;
+ if (uc != 0xBADFACE)
+ return 10;
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ ucs4_t uc;
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint8_t buf[1];
+
+ for (c = 0; c < 0x80; c++)
+ {
+ buf[0] = c;
+ uc = 0xBADFACE;
+ ASSERT (check (buf, 1, &uc) == 0);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test 2-byte character input. */
+ {
+ static const uint8_t input[] = { 0xC3, 0x97 };
+ uc = 0xBADFACE;
+ ASSERT (check (input, SIZEOF (input), &uc) == 0);
+ ASSERT (uc == 0x00D7);
+ }
+
+ /* Test 3-byte character input. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0xAC };
+ uc = 0xBADFACE;
+ ASSERT (check (input, SIZEOF (input), &uc) == 0);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 4-byte character input. */
+ {
+ static const uint8_t input[] = { 0xF4, 0x8F, 0xBF, 0xBD };
+ uc = 0xBADFACE;
+ ASSERT (check (input, SIZEOF (input), &uc) == 0);
+ ASSERT (uc == 0x10FFFD);
+ }
+
+ /* Test incomplete/invalid 1-byte input. */
+ {
+ static const uint8_t input[] = { 0xC1 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xC3 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xE2 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xF4 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xFE };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+
+ /* Test incomplete/invalid 2-byte input. */
+ {
+ static const uint8_t input[] = { 0xE0, 0x9F };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x82 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0xD0 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xF0, 0x8F };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+
+ /* Test incomplete/invalid 3-byte input. */
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xBF };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xE4, 0xBF };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xD0 };
+ ASSERT (check_invalid (input, SIZEOF (input)) == 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-set.c b/gnulib/tests/unistr/test-u8-set.c
new file mode 100644
index 00000000..e778fed9
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-set.c
@@ -0,0 +1,29 @@
+/* Test of u8_set() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_SET u8_set
+#define MAGIC 0xBA
+#define VALUE 'x'
+#include "test-set.h"
diff --git a/gnulib/tests/unistr/test-u8-stpcpy.c b/gnulib/tests/unistr/test-u8-stpcpy.c
new file mode 100644
index 00000000..94c04715
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-stpcpy.c
@@ -0,0 +1,28 @@
+/* Test of u8_stpcpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STPCPY u8_stpcpy
+#define MAGIC 0xBA
+#include "test-stpcpy.h"
diff --git a/gnulib/tests/unistr/test-u8-stpncpy.c b/gnulib/tests/unistr/test-u8-stpncpy.c
new file mode 100644
index 00000000..4809626b
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-stpncpy.c
@@ -0,0 +1,52 @@
+/* Test of u8_stpncpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STPNCPY u8_stpncpy
+#define MAGIC 0xBA
+#include "test-stpncpy.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\0'
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strcat.c b/gnulib/tests/unistr/test-u8-strcat.c
new file mode 100644
index 00000000..7fa9e84e
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strcat.c
@@ -0,0 +1,28 @@
+/* Test of u8_strcat() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STRCAT u8_strcat
+#define MAGIC 0xBA
+#include "test-strcat.h"
diff --git a/gnulib/tests/unistr/test-u8-strcmp.c b/gnulib/tests/unistr/test-u8-strcmp.c
new file mode 100644
index 00000000..313cd110
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strcmp.c
@@ -0,0 +1,34 @@
+/* Test of u8_strcmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define U_STRCMP u8_strcmp
+#include "test-u8-strcmp.h"
+
+int
+main ()
+{
+ test_u8_strcmp ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strcmp.h b/gnulib/tests/unistr/test-u8-strcmp.h
new file mode 100644
index 00000000..9c25dac4
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strcmp.h
@@ -0,0 +1,42 @@
+/* Test of u8_strcmp() and u8_strcoll() functions.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#define UNIT uint8_t
+#include "test-strcmp.h"
+
+static void
+test_u8_strcmp (void)
+{
+ test_strcmp ();
+
+ /* Test comparison between ASCII and non-ASCII characters. */
+ {
+ static const UNIT input1[] = { 'f', 'o', 'o', 0 };
+ static const UNIT input2[] = { 0xE2, 0x80, 0xA2, 0 };
+ ASSERT (U_STRCMP (input1, input2) < 0);
+ ASSERT (U_STRCMP (input2, input1) > 0);
+ }
+
+ /* Test comparison with non-BMP characters. */
+ {
+ static const UNIT input1[] = { 0xF0, 0x9D, 0x94, 0x9E, 0 };
+ static const UNIT input2[] = { 0xEF, 0xBB, 0xBF, 0 };
+ ASSERT (U_STRCMP (input1, input2) > 0);
+ ASSERT (U_STRCMP (input2, input1) < 0);
+ }
+}
diff --git a/gnulib/tests/unistr/test-u8-strcoll.c b/gnulib/tests/unistr/test-u8-strcoll.c
new file mode 100644
index 00000000..ae5c9a4e
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strcoll.c
@@ -0,0 +1,41 @@
+/* Test of u8_strcoll() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define U_STRCMP u8_strcoll
+#include "test-u8-strcmp.h"
+
+int
+main ()
+{
+ /* This test relies on three facts:
+ - setlocale is not being called, therefore the locale is the "C" locale.
+ - In the "C" locale, strcoll is equivalent to strcmp.
+ - In the u8_strcoll implementation, Unicode strings that are not
+ convertible to the locale encoding are sorted higher than convertible
+ strings and compared according to u8_strcmp. */
+
+ test_u8_strcmp ();
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strcpy.c b/gnulib/tests/unistr/test-u8-strcpy.c
new file mode 100644
index 00000000..810f9750
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strcpy.c
@@ -0,0 +1,28 @@
+/* Test of u8_strcpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STRCPY u8_strcpy
+#define MAGIC 0xBA
+#include "test-strcpy.h"
diff --git a/gnulib/tests/unistr/test-u8-strdup.c b/gnulib/tests/unistr/test-u8-strdup.c
new file mode 100644
index 00000000..6da21515
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strdup.c
@@ -0,0 +1,27 @@
+/* Test of u8_strdup() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STRDUP u8_strdup
+#include "test-strdup.h"
diff --git a/gnulib/tests/unistr/test-u8-strlen.c b/gnulib/tests/unistr/test-u8-strlen.c
new file mode 100644
index 00000000..3dfa1b01
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strlen.c
@@ -0,0 +1,50 @@
+/* Test of u8_strlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Empty string. */
+ {
+ static const uint8_t input[] = { 0 };
+ ASSERT (u8_strlen (input) == 0);
+ }
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\0'
+ };
+ ASSERT (u8_strlen (input) == SIZEOF (input) - 1);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strmblen.c b/gnulib/tests/unistr/test-u8-strmblen.c
new file mode 100644
index 00000000..bde3000e
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strmblen.c
@@ -0,0 +1,149 @@
+/* Test of u8_strmblen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint8_t input[] = "";
+ ret = u8_strmblen (input);
+ ASSERT (ret == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint8_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ ret = u8_strmblen (buf);
+ ASSERT (ret == 1);
+ }
+ }
+
+ /* Test 2-byte character input. */
+ {
+ static const uint8_t input[] = { 0xC3, 0x97, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == 2);
+ }
+
+ /* Test 3-byte character input. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0xAC, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == 3);
+ }
+
+ /* Test 4-byte character input. */
+ {
+ static const uint8_t input[] = { 0xF4, 0x8F, 0xBF, 0xBD, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == 4);
+ }
+
+ /* Test incomplete/invalid 1-byte input. */
+ {
+ static const uint8_t input[] = { 0xC1, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xC3, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF4, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xFE, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+
+ /* Test incomplete/invalid 2-byte input. */
+ {
+ static const uint8_t input[] = { 0xE0, 0x9F, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0xD0, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF0, 0x8F, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+
+ /* Test incomplete/invalid 3-byte input. */
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xBF, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0xBF, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xD0, 0 };
+ ret = u8_strmblen (input);
+ ASSERT (ret == -1);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strmbtouc.c b/gnulib/tests/unistr/test-u8-strmbtouc.c
new file mode 100644
index 00000000..55913575
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strmbtouc.c
@@ -0,0 +1,188 @@
+/* Test of u8_strmbtouc() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+ int ret;
+
+ /* Test NUL unit input. */
+ {
+ static const uint8_t input[] = "";
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == 0);
+ ASSERT (uc == 0);
+ }
+
+ /* Test ISO 646 unit input. */
+ {
+ ucs4_t c;
+ uint8_t buf[2];
+
+ for (c = 1; c < 0x80; c++)
+ {
+ buf[0] = c;
+ buf[1] = 0;
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, buf);
+ ASSERT (ret == 1);
+ ASSERT (uc == c);
+ }
+ }
+
+ /* Test 2-byte character input. */
+ {
+ static const uint8_t input[] = { 0xC3, 0x97, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == 2);
+ ASSERT (uc == 0x00D7);
+ }
+
+ /* Test 3-byte character input. */
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0xAC, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == 3);
+ ASSERT (uc == 0x20AC);
+ }
+
+ /* Test 4-byte character input. */
+ {
+ static const uint8_t input[] = { 0xF4, 0x8F, 0xBF, 0xBD, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == 4);
+ ASSERT (uc == 0x10FFFD);
+ }
+
+ /* Test incomplete/invalid 1-byte input. */
+ {
+ static const uint8_t input[] = { 0xC1, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xC3, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xF4, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xFE, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+
+ /* Test incomplete/invalid 2-byte input. */
+ {
+ static const uint8_t input[] = { 0xE0, 0x9F, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0x82, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xE2, 0xD0, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xF0, 0x8F, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+
+ /* Test incomplete/invalid 3-byte input. */
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xBF, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0xD0, 0xBF, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+ {
+ static const uint8_t input[] = { 0xF3, 0x8F, 0xD0, 0 };
+ uc = 0xBADFACE;
+ ret = u8_strmbtouc (&uc, input);
+ ASSERT (ret == -1);
+ ASSERT (uc == 0xBADFACE);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strncat.c b/gnulib/tests/unistr/test-u8-strncat.c
new file mode 100644
index 00000000..bb90041f
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strncat.c
@@ -0,0 +1,52 @@
+/* Test of u8_strncat() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STRNCAT u8_strncat
+#define MAGIC 0xBA
+#include "test-strncat.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\0'
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strncmp.c b/gnulib/tests/unistr/test-u8-strncmp.c
new file mode 100644
index 00000000..f63cdaa2
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strncmp.c
@@ -0,0 +1,53 @@
+/* Test of u8_strncmp() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STRNCMP u8_strncmp
+#include "test-strncmp.h"
+
+int
+main ()
+{
+ test_strncmp ();
+
+ /* Test comparison with non-BMP characters. */
+ {
+ static const UNIT input1[] = { 0xF0, 0x9D, 0x94, 0x9E, 0 };
+ static const UNIT input2[] = { 0xEF, 0xBB, 0xBF, 0 };
+ ASSERT (U_STRNCMP (input1, input2, 1) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 1) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 2) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 2) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 3) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 3) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 4) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 4) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 5) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 5) < 0);
+ ASSERT (U_STRNCMP (input1, input2, 1000000) > 0);
+ ASSERT (U_STRNCMP (input2, input1, 1000000) < 0);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strncpy.c b/gnulib/tests/unistr/test-u8-strncpy.c
new file mode 100644
index 00000000..64cabdc4
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strncpy.c
@@ -0,0 +1,52 @@
+/* Test of u8_strncpy() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <stdlib.h>
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STRNCPY u8_strncpy
+#define MAGIC 0xBA
+#include "test-strncpy.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\0'
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-strnlen.c b/gnulib/tests/unistr/test-u8-strnlen.c
new file mode 100644
index 00000000..98de7977
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-strnlen.c
@@ -0,0 +1,49 @@
+/* Test of u8_strnlen() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "zerosize-ptr.h"
+#include "macros.h"
+
+#define UNIT uint8_t
+#define U_STRNLEN u8_strnlen
+#include "test-strnlen.h"
+
+int
+main ()
+{
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\0'
+ };
+ check (input, SIZEOF (input));
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-to-u16.c b/gnulib/tests/unistr/test-u8-to-u16.c
new file mode 100644
index 00000000..02ef44fe
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-to-u16.c
@@ -0,0 +1,158 @@
+/* Test of u8_to_u16() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <errno.h>
+
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const uint16_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint16_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_to_u16 (input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint16_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u8_to_u16 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint16_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
+ result = u8_to_u16 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u16_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint16_t expected[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint8_t input[] =
+ { '-', '(', 0xF0, 0x9D, 0x94, 0x9E, 0xC3, 0x97, 0xF0, 0x9D, 0x94, 0x9F,
+ ')', '=', 0xF0, 0x9D, 0x94, 0x9F, 0xC3, 0x97, 0xF0, 0x9D, 0x94, 0x9E
+ };
+ static const uint16_t expected[] =
+ { '-', '(', 0xD835, 0xDD1E, 0x00D7, 0xD835, 0xDD1F, ')', '=',
+ 0xD835, 0xDD1F, 0x00D7, 0xD835, 0xDD1E
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* Invalid input. */
+ {
+ static const uint8_t input[] = { 'x', 0xC2, 0xC3, 'y' };
+#if 0 /* Currently invalid input is rejected, not accommodated. */
+ static const uint16_t expected[] = { 'x', 0xFFFD, 0xFFFD, 'y' };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+#else
+ size_t length;
+ uint16_t *result;
+ uint16_t preallocated[10];
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_to_u16 (input, SIZEOF (input), NULL, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf too small. */
+ length = 1;
+ result = u8_to_u16 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf large enough. */
+ length = SIZEOF (preallocated);
+ result = u8_to_u16 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+#endif
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-to-u32.c b/gnulib/tests/unistr/test-u8-to-u32.c
new file mode 100644
index 00000000..d148e62a
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-to-u32.c
@@ -0,0 +1,158 @@
+/* Test of u8_to_u32() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include <errno.h>
+
+#include "macros.h"
+
+static int
+check (const uint8_t *input, size_t input_length,
+ const uint32_t *expected, size_t expected_length)
+{
+ size_t length;
+ uint32_t *result;
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_to_u32 (input, input_length, NULL, &length);
+ if (!(result != NULL))
+ return 1;
+ if (!(length == expected_length))
+ return 2;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 3;
+ free (result);
+
+ /* Test return conventions with resultbuf too small. */
+ if (expected_length > 0)
+ {
+ uint32_t *preallocated;
+
+ length = expected_length - 1;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u8_to_u32 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 4;
+ if (!(result != preallocated))
+ return 5;
+ if (!(length == expected_length))
+ return 6;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 7;
+ free (result);
+ free (preallocated);
+ }
+
+ /* Test return conventions with resultbuf large enough. */
+ {
+ uint32_t *preallocated;
+
+ length = expected_length;
+ preallocated = (uint32_t *) malloc (length * sizeof (uint32_t));
+ result = u8_to_u32 (input, input_length, preallocated, &length);
+ if (!(result != NULL))
+ return 8;
+ if (!(preallocated == NULL || result == preallocated))
+ return 9;
+ if (!(length == expected_length))
+ return 10;
+ if (!(u32_cmp (result, expected, expected_length) == 0))
+ return 11;
+ free (preallocated);
+ }
+
+ return 0;
+}
+
+int
+main ()
+{
+ /* Empty string. */
+ ASSERT (check (NULL, 0, NULL, 0) == 0);
+
+ /* Simple string. */
+ { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ static const uint8_t input[] =
+ { 'G', 'r', 0xC3, 0xBC, 0xC3, 0x9F, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0xD0, 0x97, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB2, 0xD1, 0x81,
+ 0xD1, 0x82, 0xD0, 0xB2, 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5,
+ '!', ' ', 'x', '=', '(', '-', 'b', 0xC2, 0xB1, 's', 'q', 'r', 't', '(',
+ 'b', 0xC2, 0xB2, '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')',
+ ' ', ' ', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E, ',',
+ 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, ',',
+ 0xED, 0x95, 0x9C, 0xEA, 0xB8, 0x80, '\n'
+ };
+ static const uint32_t expected[] =
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* String with characters outside the BMP. */
+ {
+ static const uint8_t input[] =
+ { '-', '(', 0xF0, 0x9D, 0x94, 0x9E, 0xC3, 0x97, 0xF0, 0x9D, 0x94, 0x9F,
+ ')', '=', 0xF0, 0x9D, 0x94, 0x9F, 0xC3, 0x97, 0xF0, 0x9D, 0x94, 0x9E
+ };
+ static const uint32_t expected[] =
+ { '-', '(', 0x1D51E, 0x00D7, 0x1D51F, ')', '=',
+ 0x1D51F, 0x00D7, 0x1D51E
+ };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+ }
+
+ /* Invalid input. */
+ {
+ static const uint8_t input[] = { 'x', 0xC2, 0xC3, 'y' };
+#if 0 /* Currently invalid input is rejected, not accommodated. */
+ static const uint32_t expected[] = { 'x', 0xFFFD, 0xFFFD, 'y' };
+ ASSERT (check (input, SIZEOF (input), expected, SIZEOF (expected)) == 0);
+#else
+ size_t length;
+ uint32_t *result;
+ uint32_t preallocated[10];
+
+ /* Test return conventions with resultbuf == NULL. */
+ result = u8_to_u32 (input, SIZEOF (input), NULL, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf too small. */
+ length = 1;
+ result = u8_to_u32 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+
+ /* Test return conventions with resultbuf large enough. */
+ length = SIZEOF (preallocated);
+ result = u8_to_u32 (input, SIZEOF (input), preallocated, &length);
+ ASSERT (result == NULL);
+ ASSERT (errno == EILSEQ);
+#endif
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/unistr/test-u8-uctomb.c b/gnulib/tests/unistr/test-u8-uctomb.c
new file mode 100644
index 00000000..8fbdc429
--- /dev/null
+++ b/gnulib/tests/unistr/test-u8-uctomb.c
@@ -0,0 +1,157 @@
+/* Test of u8_uctomb() function.
+ Copyright (C) 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "unistr.h"
+
+#include "macros.h"
+
+#define MAGIC 0xBA
+
+int
+main ()
+{
+ /* Test ISO 646 character, in particular the NUL character. */
+ {
+ ucs4_t uc;
+
+ for (uc = 0; uc < 0x80; uc++)
+ {
+ uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC };
+ int ret;
+
+ ret = u8_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 1);
+ ASSERT (ret == 1);
+ ASSERT (buf[0] == uc);
+ ASSERT (buf[1] == MAGIC);
+ }
+ }
+
+ /* Test 2-byte character. */
+ {
+ ucs4_t uc = 0x00D7;
+ uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC };
+ int ret;
+
+ ret = u8_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 1);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 2);
+ ASSERT (ret == 2);
+ ASSERT (buf[0] == 0xC3);
+ ASSERT (buf[1] == 0x97);
+ ASSERT (buf[2] == MAGIC);
+ }
+
+ /* Test 3-byte character. */
+ {
+ ucs4_t uc = 0x20AC;
+ uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC };
+ int ret;
+
+ ret = u8_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 1);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 2);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+ ASSERT (buf[1] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 3);
+ ASSERT (ret == 3);
+ ASSERT (buf[0] == 0xE2);
+ ASSERT (buf[1] == 0x82);
+ ASSERT (buf[2] == 0xAC);
+ ASSERT (buf[3] == MAGIC);
+ }
+
+ /* Test 4-byte character. */
+ {
+ ucs4_t uc = 0x10FFFD;
+ uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC };
+ int ret;
+
+ ret = u8_uctomb (buf, uc, 0);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 1);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 2);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+ ASSERT (buf[1] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 3);
+ ASSERT (ret == -2);
+ ASSERT (buf[0] == MAGIC);
+ ASSERT (buf[1] == MAGIC);
+ ASSERT (buf[2] == MAGIC);
+
+ ret = u8_uctomb (buf, uc, 4);
+ ASSERT (ret == 4);
+ ASSERT (buf[0] == 0xF4);
+ ASSERT (buf[1] == 0x8F);
+ ASSERT (buf[2] == 0xBF);
+ ASSERT (buf[3] == 0xBD);
+ ASSERT (buf[4] == MAGIC);
+ }
+
+ /* Test invalid characters. */
+ {
+ ucs4_t invalid[] = { 0x110000, 0xD800, 0xDBFF, 0xDC00, 0xDFFF };
+ uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC };
+ size_t i;
+
+ for (i = 0; i < SIZEOF (invalid); i++)
+ {
+ ucs4_t uc = invalid[i];
+ int n;
+
+ for (n = 0; n <= 4; n++)
+ {
+ int ret = u8_uctomb (buf, uc, n);
+ ASSERT (ret == -1);
+ ASSERT (buf[0] == MAGIC);
+ ASSERT (buf[1] == MAGIC);
+ ASSERT (buf[2] == MAGIC);
+ ASSERT (buf[3] == MAGIC);
+ ASSERT (buf[4] == MAGIC);
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwbrk/test-u16-wordbreaks.c b/gnulib/tests/uniwbrk/test-u16-wordbreaks.c
new file mode 100644
index 00000000..c9a4f2a7
--- /dev/null
+++ b/gnulib/tests/uniwbrk/test-u16-wordbreaks.c
@@ -0,0 +1,94 @@
+/* Test of word breaks in UTF-16 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uniwbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u16_wordbreaks (NULL, 0, NULL);
+
+ {
+ static const uint16_t input[61] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u16_wordbreaks (input, SIZEOF (input), p);
+
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == ((i >= 4 && i <= 5)
+ || (i >= 9 && i <= 11)
+ || (i >= 23 && i <= 31)
+ || (i >= 35 && i <= 39)
+ || (i >= 42 && i <= 46)
+ || (i >= 48 && i <= 58)
+ || i == 60
+ ? 1 : 0));
+ }
+ free (p);
+ }
+
+ {
+ /* Same input string, decomposed. */
+ static const uint16_t input[67] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u16_wordbreaks (input, SIZEOF (input), p);
+
+ for (i = 0; i < 67; i++)
+ {
+ ASSERT (p[i] == ((i >= 5 && i <= 6)
+ || (i >= 10 && i <= 12)
+ || (i >= 25 && i <= 33)
+ || (i >= 37 && i <= 41)
+ || (i >= 44 && i <= 48)
+ || (i >= 50 && i <= 60)
+ || i == 66
+ ? 1 : 0));
+ }
+ free (p);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwbrk/test-u32-wordbreaks.c b/gnulib/tests/uniwbrk/test-u32-wordbreaks.c
new file mode 100644
index 00000000..4bb32322
--- /dev/null
+++ b/gnulib/tests/uniwbrk/test-u32-wordbreaks.c
@@ -0,0 +1,94 @@
+/* Test of word breaks in UTF-32 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uniwbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u32_wordbreaks (NULL, 0, NULL);
+
+ {
+ static const uint32_t input[61] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0439, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
+ };
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u32_wordbreaks (input, SIZEOF (input), p);
+
+ for (i = 0; i < 61; i++)
+ {
+ ASSERT (p[i] == ((i >= 4 && i <= 5)
+ || (i >= 9 && i <= 11)
+ || (i >= 23 && i <= 31)
+ || (i >= 35 && i <= 39)
+ || (i >= 42 && i <= 46)
+ || (i >= 48 && i <= 58)
+ || i == 60
+ ? 1 : 0));
+ }
+ free (p);
+ }
+
+ {
+ /* Same input string, decomposed. */
+ static const uint32_t input[67] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ { 'G', 'r', 0x0075, 0x0308, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
+ 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
+ 0x0438, 0x0306, 0x0442, 0x0435, '!', ' ',
+ 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
+ '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
+ 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',',
+ 0x1112, 0x1161, 0x11AB, 0x1100, 0x1173, 0x11AF, '\n'
+ };
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u32_wordbreaks (input, SIZEOF (input), p);
+
+ for (i = 0; i < 67; i++)
+ {
+ ASSERT (p[i] == ((i >= 5 && i <= 6)
+ || (i >= 10 && i <= 12)
+ || (i >= 25 && i <= 33)
+ || (i >= 37 && i <= 41)
+ || (i >= 44 && i <= 48)
+ || (i >= 50 && i <= 60)
+ || i == 66
+ ? 1 : 0));
+ }
+ free (p);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwbrk/test-u8-wordbreaks.c b/gnulib/tests/uniwbrk/test-u8-wordbreaks.c
new file mode 100644
index 00000000..a87ea196
--- /dev/null
+++ b/gnulib/tests/uniwbrk/test-u8-wordbreaks.c
@@ -0,0 +1,85 @@
+/* Test of word breaks in UTF-8 strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uniwbrk.h"
+
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* Test case n = 0. */
+ u8_wordbreaks (NULL, 0, NULL);
+
+ {
+ static const uint8_t input[91] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ "Gr\303\274\303\237 Gott. \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265! x=(-b\302\261sqrt(b\302\262-4ac))/(2a) \346\227\245\346\234\254\350\252\236,\344\270\255\346\226\207,\355\225\234\352\270\200\n";
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u8_wordbreaks (input, SIZEOF (input), p);
+
+ for (i = 0; i < 91; i++)
+ {
+ ASSERT (p[i] == ((i >= 6 && i <= 7)
+ || (i >= 11 && i <= 13)
+ || (i >= 37 && i <= 44)
+ || i == 46 || (i >= 50 && i <= 52)
+ || (i >= 54 && i <= 55)
+ || (i >= 58 && i <= 62) || (i >= 64 && i <= 67)
+ || i == 70 || i == 73 || i == 76
+ || i == 77 || i == 80 || i == 83
+ || i == 84 || i == 90
+ ? 1 : 0));
+ }
+ free (p);
+ }
+
+ {
+ /* Same input string, decomposed. */
+ static const uint8_t input[106] =
+ /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
+ "Gru\314\210\303\237 Gott. \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\270\314\206\321\202\320\265! x=(-b\302\261sqrt(b\302\262-4ac))/(2a) \346\227\245\346\234\254\350\252\236,\344\270\255\346\226\207,\341\204\222\341\205\241\341\206\253\341\204\200\341\205\263\341\206\257\n";
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ u8_wordbreaks (input, SIZEOF (input), p);
+
+ for (i = 0; i < 106; i++)
+ {
+ ASSERT (p[i] == ((i >= 7 && i <= 8)
+ || (i >= 12 && i <= 14)
+ || (i >= 40 && i <= 47)
+ || i == 49 || (i >= 53 && i <= 55)
+ || (i >= 57 && i <= 58)
+ || (i >= 61 && i <= 65) || (i >= 67 && i <= 70)
+ || i == 73 || i == 76 || i == 79
+ || i == 80 || i == 83 || i == 86
+ || i == 87 || i == 105
+ ? 1 : 0));
+ }
+ free (p);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwbrk/test-ulc-wordbreaks.c b/gnulib/tests/uniwbrk/test-ulc-wordbreaks.c
new file mode 100644
index 00000000..732a412c
--- /dev/null
+++ b/gnulib/tests/uniwbrk/test-ulc-wordbreaks.c
@@ -0,0 +1,62 @@
+/* Test of word breaks in strings.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+#include "uniwbrk.h"
+
+#include <locale.h>
+#include <stdlib.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ /* Test case n = 0. */
+ ulc_wordbreaks (NULL, 0, NULL);
+
+#if HAVE_ICONV
+ {
+ static const char input[36] =
+ /* "Grüß Gott. x=(-b±sqrt(b²-4ac))/(2a)" */
+ "Gr\374\337 Gott. x=(-b\261sqrt(b\262-4ac))/(2a)\n";
+ char *p = (char *) malloc (SIZEOF (input));
+ size_t i;
+
+ ulc_wordbreaks (input, SIZEOF (input), p);
+
+ for (i = 0; i < 36; i++)
+ {
+ ASSERT (p[i] == ((i >= 4 && i <= 5)
+ || (i >= 9 && i <= 17)
+ || (i >= 21 && i <= 25)
+ || (i >= 28 && i <= 32)
+ || (i >= 34 && i <= 35)
+ ? 1 : 0));
+ }
+ free (p);
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwbrk/test-ulc-wordbreaks.sh b/gnulib/tests/uniwbrk/test-ulc-wordbreaks.sh
new file mode 100755
index 00000000..96bae501
--- /dev/null
+++ b/gnulib/tests/uniwbrk/test-ulc-wordbreaks.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: ${LOCALE_FR=fr_FR}
+if test $LOCALE_FR = none; then
+ if test -f /usr/bin/localedef; then
+ echo "Skipping test: no traditional french locale is installed"
+ else
+ echo "Skipping test: no traditional french locale is supported"
+ fi
+ exit 77
+fi
+
+LC_ALL=$LOCALE_FR \
+./test-ulc-wordbreaks${EXEEXT}
diff --git a/gnulib/tests/uniwidth/test-u16-strwidth.c b/gnulib/tests/uniwidth/test-u16-strwidth.c
new file mode 100644
index 00000000..1d7750c3
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-u16-strwidth.c
@@ -0,0 +1,58 @@
+/* Test of u16_strwidth() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ {
+ static const uint16_t input[] = /* "Danilo Šegan" */
+ { 'D', 'a', 'n', 'i', 'l', 'o', ' ', 0x0160, 'e', 'g', 'a', 'n', 0 };
+ ASSERT (u16_strwidth (input, "UTF-8") == 12);
+ }
+
+ {
+ static const uint16_t input[] = /* "Danilo Šegan" decomposed */
+ { 'D', 'a', 'n', 'i', 'l', 'o', ' ', 'S', 0x030C, 'e', 'g', 'a', 'n', 0 };
+ ASSERT (u16_strwidth (input, "UTF-8") == 12);
+ }
+
+ {
+ static const uint16_t input[] = /* "Данило Шеган" */
+ {
+ 0x0414, 0x0430, 0x043D, 0x0438, 0x043B, 0x043E, ' ',
+ 0x0428, 0x0435, 0x0433, 0x0430, 0x043D, 0
+ };
+ ASSERT (u16_strwidth (input, "UTF-8") == 12);
+ ASSERT (u16_strwidth (input, "EUC-JP") == 23);
+ }
+
+ {
+ static const uint16_t input[] = /* 刘军民 */
+ { 0x5218, 0x519B, 0x6C11, 0 };
+ ASSERT (u16_strwidth (input, "UTF-8") == 6);
+ ASSERT (u16_strwidth (input, "GB2312") == 6);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwidth/test-u16-width.c b/gnulib/tests/uniwidth/test-u16-width.c
new file mode 100644
index 00000000..2d10c6cf
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-u16-width.c
@@ -0,0 +1,64 @@
+/* Test of u16_width() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ static const uint16_t input[] =
+ {
+ #define INPUT1_OFFSET 0
+ #define INPUT1_LENGTH 12
+ 'D', 'a', 'n', 'i', 'l', 'o', ' ', 0x0160, 'e', 'g', 'a', 'n',
+ #define INPUT2_OFFSET 12
+ #define INPUT2_LENGTH 13
+ 'D', 'a', 'n', 'i', 'l', 'o', ' ', 'S', 0x030C, 'e', 'g', 'a', 'n',
+ #define INPUT3_OFFSET 25
+ #define INPUT3_LENGTH 12
+ 0x0414, 0x0430, 0x043D, 0x0438, 0x043B, 0x043E, ' ',
+ 0x0428, 0x0435, 0x0433, 0x0430, 0x043D,
+ #define INPUT4_OFFSET 37
+ #define INPUT4_LENGTH 3
+ 0x5218, 0x519B, 0x6C11
+ };
+
+ { /* "Danilo Šegan" */
+ ASSERT (u16_width (input + INPUT1_OFFSET, INPUT1_LENGTH, "UTF-8") == 12);
+ }
+
+ { /* "Danilo Šegan" decomposed */
+ ASSERT (u16_width (input + INPUT2_OFFSET, INPUT2_LENGTH, "UTF-8") == 12);
+ }
+
+ { /* "Данило Шеган" */
+ ASSERT (u16_width (input + INPUT3_OFFSET, INPUT3_LENGTH, "UTF-8") == 12);
+ ASSERT (u16_width (input + INPUT3_OFFSET, INPUT3_LENGTH, "EUC-JP") == 23);
+ }
+
+ { /* 刘军民 */
+ ASSERT (u16_width (input + INPUT4_OFFSET, INPUT4_LENGTH, "UTF-8") == 6);
+ ASSERT (u16_width (input + INPUT4_OFFSET, INPUT4_LENGTH, "GB2312") == 6);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwidth/test-u32-strwidth.c b/gnulib/tests/uniwidth/test-u32-strwidth.c
new file mode 100644
index 00000000..47ae8e96
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-u32-strwidth.c
@@ -0,0 +1,58 @@
+/* Test of u32_strwidth() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ {
+ static const uint32_t input[] = /* "Danilo Šegan" */
+ { 'D', 'a', 'n', 'i', 'l', 'o', ' ', 0x0160, 'e', 'g', 'a', 'n', 0 };
+ ASSERT (u32_strwidth (input, "UTF-8") == 12);
+ }
+
+ {
+ static const uint32_t input[] = /* "Danilo Šegan" decomposed */
+ { 'D', 'a', 'n', 'i', 'l', 'o', ' ', 'S', 0x030C, 'e', 'g', 'a', 'n', 0 };
+ ASSERT (u32_strwidth (input, "UTF-8") == 12);
+ }
+
+ {
+ static const uint32_t input[] = /* "Данило Шеган" */
+ {
+ 0x0414, 0x0430, 0x043D, 0x0438, 0x043B, 0x043E, ' ',
+ 0x0428, 0x0435, 0x0433, 0x0430, 0x043D, 0
+ };
+ ASSERT (u32_strwidth (input, "UTF-8") == 12);
+ ASSERT (u32_strwidth (input, "EUC-JP") == 23);
+ }
+
+ {
+ static const uint32_t input[] = /* 刘军民 */
+ { 0x5218, 0x519B, 0x6C11, 0 };
+ ASSERT (u32_strwidth (input, "UTF-8") == 6);
+ ASSERT (u32_strwidth (input, "GB2312") == 6);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwidth/test-u32-width.c b/gnulib/tests/uniwidth/test-u32-width.c
new file mode 100644
index 00000000..ffb649f9
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-u32-width.c
@@ -0,0 +1,64 @@
+/* Test of u32_width() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ static const uint32_t input[] =
+ {
+ #define INPUT1_OFFSET 0
+ #define INPUT1_LENGTH 12
+ 'D', 'a', 'n', 'i', 'l', 'o', ' ', 0x0160, 'e', 'g', 'a', 'n',
+ #define INPUT2_OFFSET 12
+ #define INPUT2_LENGTH 13
+ 'D', 'a', 'n', 'i', 'l', 'o', ' ', 'S', 0x030C, 'e', 'g', 'a', 'n',
+ #define INPUT3_OFFSET 25
+ #define INPUT3_LENGTH 12
+ 0x0414, 0x0430, 0x043D, 0x0438, 0x043B, 0x043E, ' ',
+ 0x0428, 0x0435, 0x0433, 0x0430, 0x043D,
+ #define INPUT4_OFFSET 37
+ #define INPUT4_LENGTH 3
+ 0x5218, 0x519B, 0x6C11
+ };
+
+ { /* "Danilo Šegan" */
+ ASSERT (u32_width (input + INPUT1_OFFSET, INPUT1_LENGTH, "UTF-8") == 12);
+ }
+
+ { /* "Danilo Šegan" decomposed */
+ ASSERT (u32_width (input + INPUT2_OFFSET, INPUT2_LENGTH, "UTF-8") == 12);
+ }
+
+ { /* "Данило Шеган" */
+ ASSERT (u32_width (input + INPUT3_OFFSET, INPUT3_LENGTH, "UTF-8") == 12);
+ ASSERT (u32_width (input + INPUT3_OFFSET, INPUT3_LENGTH, "EUC-JP") == 23);
+ }
+
+ { /* 刘军民 */
+ ASSERT (u32_width (input + INPUT4_OFFSET, INPUT4_LENGTH, "UTF-8") == 6);
+ ASSERT (u32_width (input + INPUT4_OFFSET, INPUT4_LENGTH, "GB2312") == 6);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwidth/test-u8-strwidth.c b/gnulib/tests/uniwidth/test-u8-strwidth.c
new file mode 100644
index 00000000..bb739a57
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-u8-strwidth.c
@@ -0,0 +1,53 @@
+/* Test of u8_strwidth() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ {
+ static const uint8_t input[] = "Danilo \305\240egan"; /* "Danilo Šegan" */
+ ASSERT (u8_strwidth (input, "UTF-8") == 12);
+ }
+
+ {
+ static const uint8_t input[] = "Danilo S\314\214egan"; /* "Danilo Šegan" decomposed */
+ ASSERT (u8_strwidth (input, "UTF-8") == 12);
+ }
+
+ {
+ static const uint8_t input[] = /* "Данило Шеган" */
+ "\320\224\320\260\320\275\320\270\320\273\320\276 \320\250\320\265\320\263\320\260\320\275";
+ ASSERT (u8_strwidth (input, "UTF-8") == 12);
+ ASSERT (u8_strwidth (input, "EUC-JP") == 23);
+ }
+
+ {
+ static const uint8_t input[] = /* 刘军民 */
+ "\345\210\230\345\206\233\346\260\221";
+ ASSERT (u8_strwidth (input, "UTF-8") == 6);
+ ASSERT (u8_strwidth (input, "GB2312") == 6);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwidth/test-u8-width.c b/gnulib/tests/uniwidth/test-u8-width.c
new file mode 100644
index 00000000..c100d6f8
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-u8-width.c
@@ -0,0 +1,62 @@
+/* Test of u8_width() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ static const uint8_t input[] =
+ #define INPUT1_OFFSET 0
+ #define INPUT1_LENGTH 13
+ "Danilo \305\240egan"
+ #define INPUT2_OFFSET 13
+ #define INPUT2_LENGTH 14
+ "Danilo S\314\214egan"
+ #define INPUT3_OFFSET 27
+ #define INPUT3_LENGTH 23
+ "\320\224\320\260\320\275\320\270\320\273\320\276 \320\250\320\265\320\263\320\260\320\275"
+ #define INPUT4_OFFSET 50
+ #define INPUT4_LENGTH 9
+ "\345\210\230\345\206\233\346\260\221"
+ ;
+
+ { /* "Danilo Šegan" */
+ ASSERT (u8_width (input + INPUT1_OFFSET, INPUT1_LENGTH, "UTF-8") == 12);
+ }
+
+ { /* "Danilo Šegan" decomposed */
+ ASSERT (u8_width (input + INPUT2_OFFSET, INPUT2_LENGTH, "UTF-8") == 12);
+ }
+
+ { /* "Данило Шеган" */
+ ASSERT (u8_width (input + INPUT3_OFFSET, INPUT3_LENGTH, "UTF-8") == 12);
+ ASSERT (u8_width (input + INPUT3_OFFSET, INPUT3_LENGTH, "EUC-JP") == 23);
+ }
+
+ { /* 刘军民 */
+ ASSERT (u8_width (input + INPUT4_OFFSET, INPUT4_LENGTH, "UTF-8") == 6);
+ ASSERT (u8_width (input + INPUT4_OFFSET, INPUT4_LENGTH, "GB2312") == 6);
+ }
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwidth/test-uc_width.c b/gnulib/tests/uniwidth/test-uc_width.c
new file mode 100644
index 00000000..7cfab614
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-uc_width.c
@@ -0,0 +1,56 @@
+/* Test of uc_width() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include "macros.h"
+
+int
+main ()
+{
+ ucs4_t uc;
+
+ /* Test width of ASCII characters. */
+ for (uc = 0x0020; uc < 0x007F; uc++)
+ ASSERT (uc_width (uc, "ISO-8859-2") == 1);
+
+ /* Test width of some non-spacing characters. */
+ ASSERT (uc_width (0x0301, "UTF-8") == 0);
+ ASSERT (uc_width (0x05B0, "UTF-8") == 0);
+
+ /* Test width of some format control characters. */
+ ASSERT (uc_width (0x200E, "UTF-8") == 0);
+ ASSERT (uc_width (0x2060, "UTF-8") == 0);
+ ASSERT (uc_width (0xE0001, "UTF-8") == 0);
+ ASSERT (uc_width (0xE0044, "UTF-8") == 0);
+
+ /* Test width of some zero width characters. */
+ ASSERT (uc_width (0x200B, "UTF-8") == 0);
+ ASSERT (uc_width (0xFEFF, "UTF-8") == 0);
+
+ /* Test width of some CJK characters. */
+ ASSERT (uc_width (0x3000, "UTF-8") == 2);
+ ASSERT (uc_width (0xB250, "UTF-8") == 2);
+ ASSERT (uc_width (0xFF1A, "UTF-8") == 2);
+ ASSERT (uc_width (0x20369, "UTF-8") == 2);
+ ASSERT (uc_width (0x2F876, "UTF-8") == 2);
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwidth/test-uc_width2.c b/gnulib/tests/uniwidth/test-uc_width2.c
new file mode 100644
index 00000000..3126d4c3
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-uc_width2.c
@@ -0,0 +1,86 @@
+/* Test of uc_width() function.
+ Copyright (C) 2007-2010 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include <stdio.h>
+
+#include "macros.h"
+
+/* One of 0, '0', '1', 'A', '2'. */
+static char current_width;
+/* The interval for which the current_width holds. */
+static ucs4_t current_start;
+static ucs4_t current_end;
+
+static void
+finish_interval (void)
+{
+ if (current_width != 0)
+ {
+ if (current_start == current_end)
+ printf ("%04X\t\t%c\n", (unsigned) current_start, current_width);
+ else
+ printf ("%04X..%04X\t%c\n", (unsigned) current_start,
+ (unsigned) current_end, current_width);
+ current_width = 0;
+ }
+}
+
+static void
+add_to_interval (ucs4_t uc, char width)
+{
+ if (current_width == width && uc == current_end + 1)
+ current_end = uc;
+ else
+ {
+ finish_interval ();
+ current_width = width;
+ current_start = current_end = uc;
+ }
+}
+
+int
+main ()
+{
+ ucs4_t uc;
+
+ for (uc = 0; uc < 0x110000; uc++)
+ {
+ int w1 = uc_width (uc, "UTF-8");
+ int w2 = uc_width (uc, "GBK");
+ char width =
+ (w1 == 0 && w2 == 0 ? '0' :
+ w1 == 1 && w2 == 1 ? '1' :
+ w1 == 1 && w2 == 2 ? 'A' :
+ w1 == 2 && w2 == 2 ? '2' :
+ 0);
+ if (width == 0)
+ {
+ /* uc must be a control character. */
+ ASSERT (w1 < 0 && w2 < 0);
+ }
+ else
+ add_to_interval (uc, width);
+ }
+ finish_interval ();
+
+ return 0;
+}
diff --git a/gnulib/tests/uniwidth/test-uc_width2.sh b/gnulib/tests/uniwidth/test-uc_width2.sh
new file mode 100755
index 00000000..484288c9
--- /dev/null
+++ b/gnulib/tests/uniwidth/test-uc_width2.sh
@@ -0,0 +1,382 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles uc_width.out"
+./test-uc_width2${EXEEXT} | LC_ALL=C tr -d '\r' > uc_width.out
+
+tmpfiles="$tmpfiles uc_width.ok"
+cat > uc_width.ok <<\EOF
+0000 0
+0020..007E 1
+00A0 1
+00A1..00AC A
+00AD 0
+00AE..02FF A
+0300..036F 0
+0370..0482 A
+0483..0489 0
+048A..0590 A
+0591..05BD 0
+05BE A
+05BF 0
+05C0 A
+05C1..05C2 0
+05C3 A
+05C4..05C5 0
+05C6 A
+05C7 0
+05C8..05FF A
+0600..0603 0
+0604..060F A
+0610..061A 0
+061B..064A A
+064B..065E 0
+065F..066F A
+0670 0
+0671..06D5 A
+06D6..06E4 0
+06E5..06E6 A
+06E7..06E8 0
+06E9 A
+06EA..06ED 0
+06EE..070E A
+070F 0
+0710 A
+0711 0
+0712..072F A
+0730..074A 0
+074B..07A5 A
+07A6..07B0 0
+07B1..07EA A
+07EB..07F3 0
+07F4..0900 A
+0901..0902 0
+0903..093B A
+093C 0
+093D..0940 A
+0941..0948 0
+0949..094C A
+094D 0
+094E..0950 A
+0951..0954 0
+0955..0961 A
+0962..0963 0
+0964..0980 A
+0981 0
+0982..09BB A
+09BC 0
+09BD..09C0 A
+09C1..09C4 0
+09C5..09CC A
+09CD 0
+09CE..09E1 A
+09E2..09E3 0
+09E4..0A00 A
+0A01..0A02 0
+0A03..0A3B A
+0A3C 0
+0A3D..0A40 A
+0A41..0A42 0
+0A43..0A46 A
+0A47..0A48 0
+0A49..0A4A A
+0A4B..0A4D 0
+0A4E..0A50 A
+0A51 0
+0A52..0A6F A
+0A70..0A71 0
+0A72..0A74 A
+0A75 0
+0A76..0A80 A
+0A81..0A82 0
+0A83..0ABB A
+0ABC 0
+0ABD..0AC0 A
+0AC1..0AC5 0
+0AC6 A
+0AC7..0AC8 0
+0AC9..0ACC A
+0ACD 0
+0ACE..0AE1 A
+0AE2..0AE3 0
+0AE4..0B00 A
+0B01 0
+0B02..0B3B A
+0B3C 0
+0B3D..0B3E A
+0B3F 0
+0B40 A
+0B41..0B44 0
+0B45..0B4C A
+0B4D 0
+0B4E..0B55 A
+0B56 0
+0B57..0B61 A
+0B62..0B63 0
+0B64..0B81 A
+0B82 0
+0B83..0BBF A
+0BC0 0
+0BC1..0BCC A
+0BCD 0
+0BCE..0C3D A
+0C3E..0C40 0
+0C41..0C45 A
+0C46..0C48 0
+0C49 A
+0C4A..0C4D 0
+0C4E..0C54 A
+0C55..0C56 0
+0C57..0C61 A
+0C62..0C63 0
+0C64..0CBB A
+0CBC 0
+0CBD..0CCB A
+0CCC..0CCD 0
+0CCE..0CE1 A
+0CE2..0CE3 0
+0CE4..0D40 A
+0D41..0D44 0
+0D45..0D4C A
+0D4D 0
+0D4E..0D61 A
+0D62..0D63 0
+0D64..0DC9 A
+0DCA 0
+0DCB..0DD1 A
+0DD2..0DD4 0
+0DD5 A
+0DD6 0
+0DD7..0E30 A
+0E31 0
+0E32..0E33 A
+0E34..0E3A 0
+0E3B..0E46 A
+0E47..0E4E 0
+0E4F..0EB0 A
+0EB1 0
+0EB2..0EB3 A
+0EB4..0EB9 0
+0EBA A
+0EBB..0EBC 0
+0EBD..0EC7 A
+0EC8..0ECD 0
+0ECE..0F17 A
+0F18..0F19 0
+0F1A..0F34 A
+0F35 0
+0F36 A
+0F37 0
+0F38 A
+0F39 0
+0F3A..0F70 A
+0F71..0F7E 0
+0F7F A
+0F80..0F84 0
+0F85 A
+0F86..0F87 0
+0F88..0F8F A
+0F90..0F97 0
+0F98 A
+0F99..0FBC 0
+0FBD..0FC5 A
+0FC6 0
+0FC7..102C A
+102D..1030 0
+1031 A
+1032..1037 0
+1038 A
+1039..103A 0
+103B..103C A
+103D..103E 0
+103F..1057 A
+1058..1059 0
+105A..105D A
+105E..1060 0
+1061..1070 A
+1071..1074 0
+1075..1081 A
+1082 0
+1083..1084 A
+1085..1086 0
+1087..108C A
+108D 0
+108E..10FF A
+1100..115F 2
+1160..135E A
+135F 0
+1360..1711 A
+1712..1714 0
+1715..1731 A
+1732..1734 0
+1735..1751 A
+1752..1753 0
+1754..1771 A
+1772..1773 0
+1774..17B3 A
+17B4..17B5 0
+17B6 A
+17B7..17BD 0
+17BE..17C5 A
+17C6 0
+17C7..17C8 A
+17C9..17D3 0
+17D4..17DC A
+17DD 0
+17DE..180A A
+180B..180D 0
+180E..18A8 A
+18A9 0
+18AA..191F A
+1920..1922 0
+1923..1926 A
+1927..1928 0
+1929..1931 A
+1932 0
+1933..1938 A
+1939..193B 0
+193C..1A16 A
+1A17..1A18 0
+1A19..1AFF A
+1B00..1B03 0
+1B04..1B33 A
+1B34 0
+1B35 A
+1B36..1B3A 0
+1B3B A
+1B3C 0
+1B3D..1B41 A
+1B42 0
+1B43..1B6A A
+1B6B..1B73 0
+1B74..1B7F A
+1B80..1B81 0
+1B82..1BA1 A
+1BA2..1BA5 0
+1BA6..1BA7 A
+1BA8..1BA9 0
+1BAA..1C2B A
+1C2C..1C33 0
+1C34..1C35 A
+1C36..1C37 0
+1C38..1DBF A
+1DC0..1DE6 0
+1DE7..1DFD A
+1DFE..1DFF 0
+1E00..200A A
+200B..200F 0
+2010..2029 A
+202A..202E 0
+202F..205F A
+2060..2064 0
+2065..2069 A
+206A..206F 0
+2070..20A8 A
+20A9 1
+20AA..20CF A
+20D0..20F0 0
+20F1..2328 A
+2329..232A 2
+232B..2DDF A
+2DE0..2DFF 0
+2E00..2E7F A
+2E80..3029 2
+302A..302F 0
+3030..303E 2
+303F A
+3040..3098 2
+3099..309A 0
+309B..4DBF 2
+4DC0..4DFF A
+4E00..A4CF 2
+A4D0..A66E A
+A66F..A672 0
+A673..A67B A
+A67C..A67D 0
+A67E..A801 A
+A802 0
+A803..A805 A
+A806 0
+A807..A80A A
+A80B 0
+A80C..A824 A
+A825..A826 0
+A827..A8C3 A
+A8C4 0
+A8C5..A925 A
+A926..A92D 0
+A92E..A946 A
+A947..A951 0
+A952..AA28 A
+AA29..AA2E 0
+AA2F..AA30 A
+AA31..AA32 0
+AA33..AA34 A
+AA35..AA36 0
+AA37..AA42 A
+AA43 0
+AA44..AA4B A
+AA4C 0
+AA4D..ABFF A
+AC00..D7A3 2
+D7A4..F8FF A
+F900..FAFF 2
+FB00..FB1D A
+FB1E 0
+FB1F..FDFF A
+FE00..FE0F 0
+FE10..FE1F 2
+FE20..FE26 0
+FE27..FE2F A
+FE30..FE6F 2
+FE70..FEFE A
+FEFF 0
+FF00..FF60 2
+FF61..FFDF 1
+FFE0..FFE6 2
+FFE7..FFF8 1
+FFF9..FFFB 0
+FFFC..101FC 1
+101FD 0
+101FE..10A00 1
+10A01..10A03 0
+10A04 1
+10A05..10A06 0
+10A07..10A0B 1
+10A0C..10A0F 0
+10A10..10A37 1
+10A38..10A3A 0
+10A3B..10A3E 1
+10A3F 0
+10A40..1D166 1
+1D167..1D169 0
+1D16A..1D17A 1
+1D17B..1D182 0
+1D183..1D184 1
+1D185..1D18B 0
+1D18C..1D1A9 1
+1D1AA..1D1AD 0
+1D1AE..1D241 1
+1D242..1D244 0
+1D245..1FFFF 1
+20000..2A6D6 2
+2A6D7..2F7FF 1
+2F800..2FA1D 2
+2FA1E..E0000 1
+E0001 0
+E0002..E001F 1
+E0020..E007F 0
+E0080..E00FF 1
+E0100..E01EF 0
+E01F0..10FFFF 1
+EOF
+
+: ${DIFF=diff}
+${DIFF} uc_width.ok uc_width.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gnulib/tests/zerosize-ptr.h b/gnulib/tests/zerosize-ptr.h
new file mode 100644
index 00000000..cfab2008
--- /dev/null
+++ b/gnulib/tests/zerosize-ptr.h
@@ -0,0 +1,68 @@
+/* Return a pointer to a zero-size object in memory.
+ Copyright (C) 2009, 2010 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/>. */
+
+/* ISO C 99 does not allow memcmp(), memchr() etc. to be invoked with a NULL
+ argument. Therefore this file produces a non-NULL pointer which cannot
+ be dereferenced, if possible. */
+
+#include <stdlib.h>
+
+/* Test whether mmap() and mprotect() are available.
+ We don't use HAVE_MMAP, because AC_FUNC_MMAP would not define it on HP-UX.
+ HAVE_MPROTECT is not enough, because mingw does not have mmap() but has an
+ mprotect() function in libgcc.a. */
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+/* Define MAP_FILE when it isn't otherwise. */
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+#endif
+
+/* Return a pointer to a zero-size object in memory (that is, actually, a
+ pointer to a page boundary where the previous page is readable and writable
+ and the next page is neither readable not writable), if possible.
+ Return NULL otherwise. */
+
+static void *
+zerosize_ptr (void)
+{
+/* Use mmap and mprotect when they exist. Don't test HAVE_MMAP, because it is
+ not defined on HP-UX 11 (since it does not support MAP_FIXED). */
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# if HAVE_MAP_ANONYMOUS
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+ const int fd = -1;
+# else /* !HAVE_MAP_ANONYMOUS */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ int fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd >= 0)
+# endif
+ {
+ int pagesize = getpagesize ();
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ flags, fd, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ return two_pages + pagesize;
+ }
+#endif
+ return NULL;
+}
diff --git a/gnulib/top/GNUmakefile b/gnulib/top/GNUmakefile
new file mode 100644
index 00000000..40ccc061
--- /dev/null
+++ b/gnulib/top/GNUmakefile
@@ -0,0 +1,127 @@
+# Having a separate GNUmakefile lets me `include' the dynamically
+# generated rules created via cfg.mk (package-local configuration)
+# as well as maint.mk (generic maintainer rules).
+# This makefile is used only if you run GNU Make.
+# It is necessary if you want to build targets usually of interest
+# only to the maintainer.
+
+# Copyright (C) 2001, 2003, 2006-2010 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/>.
+
+# Systems where /bin/sh is not the default shell need this. The $(shell)
+# command below won't work with e.g. stock DOS/Windows shells.
+ifeq ($(wildcard /bin/s[h]),/bin/sh)
+SHELL = /bin/sh
+else
+# will be used only with the next shell-test line, then overwritten
+# by a configured-in value
+SHELL = sh
+endif
+
+# If the user runs GNU make but has not yet run ./configure,
+# give them a diagnostic.
+_have-Makefile := $(shell test -f Makefile && echo yes)
+ifeq ($(_have-Makefile),yes)
+
+# Make tar archive easier to reproduce.
+export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner
+
+# Allow the user to add to this in the Makefile.
+ALL_RECURSIVE_TARGETS =
+
+include Makefile
+
+# Some projects override e.g., _autoreconf here.
+-include $(srcdir)/cfg.mk
+include $(srcdir)/maint.mk
+
+# Allow cfg.mk to override these.
+_build-aux ?= build-aux
+_autoreconf ?= autoreconf
+
+# Ensure that $(VERSION) is up to date for dist-related targets, but not
+# for others: rerunning autoreconf and recompiling everything isn't cheap.
+_have-git-version-gen := \
+ $(shell test -f $(srcdir)/$(_build-aux)/git-version-gen && echo yes)
+ifeq ($(_have-git-version-gen)0,yes$(MAKELEVEL))
+ _is-dist-target ?= $(filter-out %clean, \
+ $(filter maintainer-% dist% alpha beta major,$(MAKECMDGOALS)))
+ _is-install-target ?= $(filter-out %check, $(filter install%,$(MAKECMDGOALS)))
+ ifneq (,$(_is-dist-target)$(_is-install-target))
+ _curr-ver := $(shell cd $(srcdir) \
+ && $(_build-aux)/git-version-gen .tarball-version)
+ ifneq ($(_curr-ver),$(VERSION))
+ ifeq ($(_curr-ver),UNKNOWN)
+ $(info WARNING: unable to verify if $(VERSION) is the correct version)
+ else
+ ifneq (,$(_is-install-target))
+ # GNU Coding Standards state that 'make install' should not cause
+ # recompilation after 'make all'. But as long as changing the version
+ # string alters config.h, the cost of having 'make all' always have an
+ # up-to-date version is prohibitive. So, as a compromise, we merely
+ # warn when installing a version string that is out of date; the user
+ # should run 'autoreconf' (or something like 'make distcheck') to
+ # fix the version, 'make all' to propagate it, then 'make install'.
+ $(info WARNING: version string $(VERSION) is out of date;)
+ $(info run '$(MAKE) _version' to fix it)
+ else
+ $(info INFO: running autoreconf for new version string: $(_curr-ver))
+ _dummy := $(shell $(MAKE) $(AM_MAKEFLAGS) _version)
+ endif
+ endif
+ endif
+ endif
+endif
+
+.PHONY: _version
+_version:
+ cd $(srcdir) && rm -rf autom4te.cache .version && $(_autoreconf)
+
+else
+
+.DEFAULT_GOAL := abort-due-to-no-makefile
+srcdir = .
+
+# The package can override .DEFAULT_GOAL to run actions like autoreconf.
+-include ./cfg.mk
+include ./maint.mk
+
+ifeq ($(.DEFAULT_GOAL),abort-due-to-no-makefile)
+$(MAKECMDGOALS): abort-due-to-no-makefile
+endif
+
+abort-due-to-no-makefile:
+ @echo There seems to be no Makefile in this directory. 1>&2
+ @echo "You must run ./configure before running \`make'." 1>&2
+ @exit 1
+
+endif
+
+# Tell version 3.79 and up of GNU make to not build goals in this
+# directory in parallel, in case someone tries to build multiple
+# targets, and one of them can cause a recursive target to be invoked.
+
+# Only set this if Automake doesn't provide it.
+AM_RECURSIVE_TARGETS ?= $(RECURSIVE_TARGETS:-recursive=) \
+ $(RECURSIVE_CLEAN_TARGETS:-recursive=) \
+ dist distcheck tags ctags
+
+ALL_RECURSIVE_TARGETS += $(AM_RECURSIVE_TARGETS)
+
+ifneq ($(word 2, $(MAKECMDGOALS)), )
+ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), )
+.NOTPARALLEL:
+endif
+endif
diff --git a/gnulib/top/maint.mk b/gnulib/top/maint.mk
new file mode 100644
index 00000000..7d84b6c3
--- /dev/null
+++ b/gnulib/top/maint.mk
@@ -0,0 +1,940 @@
+# -*-Makefile-*-
+# This Makefile fragment tries to be general-purpose enough to be
+# used by many projects via the gnulib maintainer-makefile module.
+
+## Copyright (C) 2001-2010 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/>.
+
+# This is reported not to work with make-3.79.1
+# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
+ME := maint.mk
+
+# Override this in cfg.mk if you use a non-standard build-aux directory.
+build_aux ?= $(srcdir)/build-aux
+
+# Do not save the original name or timestamp in the .tar.gz file.
+# Use --rsyncable if available.
+gzip_rsyncable := \
+ $(shell gzip --help 2>/dev/null|grep rsyncable >/dev/null && echo --rsyncable)
+GZIP_ENV = '--no-name --best $(gzip_rsyncable)'
+
+GIT = git
+VC = $(GIT)
+VC-tag = git tag -s -m '$(VERSION)' -u '$(gpg_key_ID)'
+
+VC_LIST = $(build_aux)/vc-list-files -C $(srcdir)
+
+# You can override this variable in cfg.mk to set your own regexp
+# matching files to ignore.
+VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$
+
+# This is to preprocess robustly the output of $(VC_LIST), so that even
+# when $(srcdir) is a pathological name like "....", the leading sed command
+# removes only the intended prefix.
+_dot_escaped_srcdir = $(subst .,\.,$(srcdir))
+
+# Post-process $(VC_LIST) output, prepending $(srcdir)/, but only
+# when $(srcdir) is not ".".
+ifeq ($(srcdir),.)
+_prepend_srcdir_prefix =
+else
+_prepend_srcdir_prefix = | sed 's|^|$(srcdir)/|'
+endif
+
+# In order to be able to consistently filter "."-relative names,
+# (i.e., with no $(srcdir) prefix), this definition is careful to
+# remove any $(srcdir) prefix, and to restore what it removes.
+VC_LIST_EXCEPT = \
+ $(VC_LIST) | sed 's|^$(_dot_escaped_srcdir)/||' \
+ | if test -f $(srcdir)/.x-$@; then grep -vEf $(srcdir)/.x-$@; \
+ else grep -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \
+ | grep -Ev -e '$(VC_LIST_ALWAYS_EXCLUDE_REGEX)' \
+ $(_prepend_srcdir_prefix)
+
+ifeq ($(origin prev_version_file), undefined)
+ prev_version_file = $(srcdir)/.prev-version
+endif
+
+PREV_VERSION := $(shell cat $(prev_version_file) 2>/dev/null)
+VERSION_REGEXP = $(subst .,\.,$(VERSION))
+PREV_VERSION_REGEXP = $(subst .,\.,$(PREV_VERSION))
+
+ifeq ($(VC),$(GIT))
+this-vc-tag = v$(VERSION)
+this-vc-tag-regexp = v$(VERSION_REGEXP)
+else
+tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]')
+tag-this-version = $(subst .,_,$(VERSION))
+this-vc-tag = $(tag-package)-$(tag-this-version)
+this-vc-tag-regexp = $(this-vc-tag)
+endif
+my_distdir = $(PACKAGE)-$(VERSION)
+
+# Old releases are stored here.
+release_archive_dir ?= ../release
+
+# Override gnu_rel_host and url_dir_list in cfg.mk if these are not right.
+# Use alpha.gnu.org for alpha and beta releases.
+# Use ftp.gnu.org for stable releases.
+gnu_ftp_host-alpha = alpha.gnu.org
+gnu_ftp_host-beta = alpha.gnu.org
+gnu_ftp_host-stable = ftp.gnu.org
+gnu_rel_host ?= $(gnu_ftp_host-$(RELEASE_TYPE))
+
+ifeq ($(gnu_rel_host),ftp.gnu.org)
+url_dir_list ?= http://ftpmirror.gnu.org/$(PACKAGE)
+else
+url_dir_list ?= ftp://$(gnu_rel_host)/gnu/$(PACKAGE)
+endif
+
+# Override this in cfg.mk if you are using a different format in your
+# NEWS file.
+today = $(shell date +%Y-%m-%d)
+news-check-regexp ?= '^\*.* $(VERSION_REGEXP) \($(today)\)'
+
+# Prevent programs like 'sort' from considering distinct strings to be equal.
+# Doing it here saves us from having to set LC_ALL elsewhere in this file.
+export LC_ALL = C
+
+## --------------- ##
+## Sanity checks. ##
+## --------------- ##
+
+_cfg_mk := $(shell test -f $(srcdir)/cfg.mk && echo '$(srcdir)/cfg.mk')
+
+# Collect the names of rules starting with `sc_'.
+syntax-check-rules := $(sort $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \
+ $(srcdir)/$(ME) $(_cfg_mk)))
+.PHONY: $(syntax-check-rules)
+
+local-checks-available = \
+ $(syntax-check-rules)
+.PHONY: $(local-checks-available)
+
+# Arrange to print the name of each syntax-checking rule just before running it.
+$(syntax-check-rules): %: %.m
+sc_m_rules_ = $(patsubst %, %.m, $(syntax-check-rules))
+.PHONY: $(sc_m_rules_)
+$(sc_m_rules_):
+ @echo $(patsubst sc_%.m, %, $@)
+
+local-check := $(filter-out $(local-checks-to-skip), $(local-checks-available))
+
+syntax-check: $(local-check)
+# @grep -nE '# *include <(limits|std(def|arg|bool))\.h>' \
+# $$(find -type f -name '*.[chly]') && \
+# { echo '$(ME): found conditional include' 1>&2; \
+# exit 1; } || :
+
+# grep -nE '^# *include <(string|stdlib)\.h>' \
+# $(srcdir)/{lib,src}/*.[chy] && \
+# { echo '$(ME): FIXME' 1>&2; \
+# exit 1; } || :
+# FIXME: don't allow `#include .strings\.h' anywhere
+
+# By default, _prohibit_regexp does not ignore case.
+export ignore_case =
+_ignore_case = $$(test -n "$$ignore_case" && echo -i || :)
+
+# There are many rules below that prohibit constructs in this package.
+# If the offending construct can be matched with a grep-E-style regexp,
+# use this macro. The shell variables "re" and "msg" must be defined.
+define _prohibit_regexp
+ dummy=; : so we do not need a semicolon before each use; \
+ test "x$$re" != x || { echo '$(ME): re not defined' 1>&2; exit 1; }; \
+ test "x$$msg" != x || { echo '$(ME): msg not defined' 1>&2; exit 1; };\
+ grep $(_ignore_case) -nE "$$re" $$($(VC_LIST_EXCEPT)) && \
+ { echo '$(ME): '"$$msg" 1>&2; exit 1; } || :
+endef
+
+sc_avoid_if_before_free:
+ @$(build_aux)/useless-if-before-free \
+ $(useless_free_options) \
+ $$($(VC_LIST_EXCEPT) | grep -v useless-if-before-free) && \
+ { echo '$(ME): found useless "if" before "free" above' 1>&2; \
+ exit 1; } || :
+
+sc_cast_of_argument_to_free:
+ @re='\<free *\( *\(' msg='don'\''t cast free argument' \
+ $(_prohibit_regexp)
+
+sc_cast_of_x_alloc_return_value:
+ @re='\*\) *x(m|c|re)alloc\>' \
+ msg='don'\''t cast x*alloc return value' \
+ $(_prohibit_regexp)
+
+sc_cast_of_alloca_return_value:
+ @re='\*\) *alloca\>' msg='don'\''t cast alloca return value' \
+ $(_prohibit_regexp)
+
+sc_space_tab:
+ @re='[ ] ' msg='found SPACE-TAB sequence; remove the SPACE' \
+ $(_prohibit_regexp)
+
+# Don't use *scanf or the old ato* functions in `real' code.
+# They provide no error checking mechanism.
+# Instead, use strto* functions.
+sc_prohibit_atoi_atof:
+ @re='\<([fs]?scanf|ato([filq]|ll)) *\(' \
+ msg='do not use *scan''f, ato''f, ato''i, ato''l, ato''ll or ato''q' \
+ $(_prohibit_regexp)
+
+# Use STREQ rather than comparing strcmp == 0, or != 0.
+sc_prohibit_strcmp:
+ @grep -nE '! *str''cmp *\(|\<str''cmp *\([^)]+\) *==' \
+ $$($(VC_LIST_EXCEPT)) \
+ | grep -vE ':# *define STREQ\(' && \
+ { echo '$(ME): use STREQ in place of the above uses of str''cmp' \
+ 1>&2; exit 1; } || :
+
+# Pass EXIT_*, not number, to usage, exit, and error (when exiting)
+# Convert all uses automatically, via these two commands:
+# git grep -l '\<exit *(1)' \
+# | grep -vEf .x-sc_prohibit_magic_number_exit \
+# | xargs --no-run-if-empty \
+# perl -pi -e 's/(^|[^.])\b(exit ?)\(1\)/$1$2(EXIT_FAILURE)/'
+# git grep -l '\<exit *(0)' \
+# | grep -vEf .x-sc_prohibit_magic_number_exit \
+# | xargs --no-run-if-empty \
+# perl -pi -e 's/(^|[^.])\b(exit ?)\(0\)/$1$2(EXIT_SUCCESS)/'
+sc_prohibit_magic_number_exit:
+ @re='(^|[^.])\<(usage|exit) ?\([0-9]|\<error ?\([1-9][0-9]*,' \
+ msg='use EXIT_* values rather than magic number' \
+ $(_prohibit_regexp)
+
+# Using EXIT_SUCCESS as the first argument to error is misleading,
+# since when that parameter is 0, error does not exit. Use `0' instead.
+sc_error_exit_success:
+ @grep -nE 'error \(EXIT_SUCCESS,' \
+ $$($(VC_LIST_EXCEPT) | grep -E '\.[chly]$$') && \
+ { echo '$(ME): found error (EXIT_SUCCESS' 1>&2; exit 1; } || :
+
+# `FATAL:' should be fully upper-cased in error messages
+# `WARNING:' should be fully upper-cased, or fully lower-cased
+sc_error_message_warn_fatal:
+ @grep -nEA2 '[^rp]error \(' $$($(VC_LIST_EXCEPT)) \
+ | grep -E '"Warning|"Fatal|"fatal' && \
+ { echo '$(ME): use FATAL, WARNING or warning' 1>&2; \
+ exit 1; } || :
+
+# Error messages should not start with a capital letter
+sc_error_message_uppercase:
+ @grep -nEA2 '[^rp]error \(' $$($(VC_LIST_EXCEPT)) \
+ | grep -E '"[A-Z]' \
+ | grep -vE '"FATAL|"WARNING|"Java|"C#|PRIuMAX' && \
+ { echo '$(ME): found capitalized error message' 1>&2; \
+ exit 1; } || :
+
+# Error messages should not end with a period
+sc_error_message_period:
+ @grep -nEA2 '[^rp]error \(' $$($(VC_LIST_EXCEPT)) \
+ | grep -E '[^."]\."' && \
+ { echo '$(ME): found error message ending in period' 1>&2; \
+ exit 1; } || :
+
+sc_file_system:
+ @re=file''system ignore_case=1 \
+ msg='found use of "file''system"; spell it "file system"' \
+ $(_prohibit_regexp)
+
+# Don't use cpp tests of this symbol. All code assumes config.h is included.
+sc_prohibit_have_config_h:
+ @grep -n '^# *if.*HAVE''_CONFIG_H' $$($(VC_LIST_EXCEPT)) && \
+ { echo '$(ME): found use of HAVE''_CONFIG_H; remove' \
+ 1>&2; exit 1; } || :
+
+# Nearly all .c files must include <config.h>. However, we also permit this
+# via inclusion of a package-specific header, if cfg.mk specified one.
+# config_h_header must be suitable for grep -E.
+config_h_header ?= <config\.h>
+sc_require_config_h:
+ @if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \
+ grep -EL '^# *include $(config_h_header)' \
+ $$($(VC_LIST_EXCEPT) | grep '\.c$$') \
+ | grep . && \
+ { echo '$(ME): the above files do not include <config.h>' \
+ 1>&2; exit 1; } || :; \
+ else :; \
+ fi
+
+# You must include <config.h> before including any other header file.
+# This can possibly be via a package-specific header, if given by cfg.mk.
+sc_require_config_h_first:
+ @if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \
+ fail=0; \
+ for i in $$($(VC_LIST_EXCEPT) | grep '\.c$$'); do \
+ grep '^# *include\>' $$i | sed 1q \
+ | grep -E '^# *include $(config_h_header)' > /dev/null \
+ || { echo $$i; fail=1; }; \
+ done; \
+ test $$fail = 1 && \
+ { echo '$(ME): the above files include some other header' \
+ 'before <config.h>' 1>&2; exit 1; } || :; \
+ else :; \
+ fi
+
+sc_prohibit_HAVE_MBRTOWC:
+ @re='\bHAVE_MBRTOWC\b' msg="do not use $$re; it is always defined" \
+ $(_prohibit_regexp)
+
+# To use this "command" macro, you must first define two shell variables:
+# h: the header, enclosed in <> or ""
+# re: a regular expression that matches IFF something provided by $h is used.
+define _header_without_use
+ dummy=; : so we do not need a semicolon before each use; \
+ h_esc=`echo "$$h"|sed 's/\./\\\\./g'`; \
+ if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \
+ files=$$(grep -l '^# *include '"$$h_esc" \
+ $$($(VC_LIST_EXCEPT) | grep '\.c$$')) && \
+ grep -LE "$$re" $$files | grep . && \
+ { echo "$(ME): the above files include $$h but don't use it" \
+ 1>&2; exit 1; } || :; \
+ else :; \
+ fi
+endef
+
+# Prohibit the inclusion of assert.h without an actual use of assert.
+sc_prohibit_assert_without_use:
+ @h='<assert.h>' re='\<assert *\(' $(_header_without_use)
+
+# Prohibit the inclusion of close-stream.h without an actual use.
+sc_prohibit_close_stream_without_use:
+ @h='"close-stream.h"' re='\<close_stream *\(' $(_header_without_use)
+
+# Prohibit the inclusion of getopt.h without an actual use.
+sc_prohibit_getopt_without_use:
+ @h='<getopt.h>' re='\<getopt(_long)? *\(' $(_header_without_use)
+
+# Don't include quotearg.h unless you use one of its functions.
+sc_prohibit_quotearg_without_use:
+ @h='"quotearg.h"' re='\<quotearg(_[^ ]+)? *\(' $(_header_without_use)
+
+# Don't include quote.h unless you use one of its functions.
+sc_prohibit_quote_without_use:
+ @h='"quote.h"' re='\<quote(_n)? *\(' $(_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_long_options_without_use:
+ @h='"long-options.h"' re='\<parse_long_options *\(' \
+ $(_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_inttostr_without_use:
+ @h='"inttostr.h"' re='\<(off|[iu]max|uint)tostr *\(' \
+ $(_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_ignore_value_without_use:
+ @h='"ignore-value.h"' re='\<ignore_(value|ptr) *\(' \
+ $(_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_error_without_use:
+ @h='"error.h"' \
+ re='\<error(_at_line|_print_progname|_one_per_line|_message_count)? *\('\
+ $(_header_without_use)
+
+# Don't include xalloc.h unless you use one of its functions.
+# Consider these symbols:
+# perl -lne '/^# *define (\w+)\(/ and print $1' lib/xalloc.h|grep -v '^__';
+# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) \(/ and print $1' lib/xalloc.h
+# Divide into two sets on case, and filter each through this:
+# | sort | perl -MRegexp::Assemble -le \
+# 'print Regexp::Assemble->new(file => "/dev/stdin")->as_string'|sed 's/\?://g'
+# Note this was produced by the above:
+# _xa1 = \
+#x(((2n?)?re|c(har)?|n(re|m)|z)alloc|alloc_(oversized|die)|m(alloc|emdup)|strdup)
+# But we can do better, in at least two ways:
+# 1) take advantage of two "dup"-suffixed strings:
+# x(((2n?)?re|c(har)?|n(re|m)|[mz])alloc|alloc_(oversized|die)|(mem|str)dup)
+# 2) notice that "c(har)?|[mz]" is equivalent to the shorter and more readable
+# "char|[cmz]"
+# x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
+_xa1 = x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
+_xa2 = X([CZ]|N?M)ALLOC
+sc_prohibit_xalloc_without_use:
+ @h='"xalloc.h"' \
+ re='\<($(_xa1)|$(_xa2)) *\('\
+ $(_header_without_use)
+
+# Extract function names:
+# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) \(/ and print $1' lib/hash.h
+_hash_re = \
+clear|delete|free|get_(first|next)|insert|lookup|print_statistics|reset_tuning
+_hash_fn = \<($(_hash_re)) *\(
+_hash_struct = (struct )?\<[Hh]ash_(table|tuning)\>
+sc_prohibit_hash_without_use:
+ @h='"hash.h"' \
+ re='$(_hash_fn)|$(_hash_struct)'\
+ $(_header_without_use)
+
+sc_prohibit_hash_pjw_without_use:
+ @h='"hash-pjw.h"' \
+ re='\<hash_pjw *\(' \
+ $(_header_without_use)
+
+sc_prohibit_safe_read_without_use:
+ @h='"safe-read.h"' re='(\<SAFE_READ_ERROR\>|\<safe_read *\()' \
+ $(_header_without_use)
+
+sc_prohibit_argmatch_without_use:
+ @h='"argmatch.h"' \
+ re='(\<(ARRAY_CARDINALITY|X?ARGMATCH(|_TO_ARGUMENT|_VERIFY))\>|\<argmatch(_exit_fn|_(in)?valid) *\()' \
+ $(_header_without_use)
+
+sc_prohibit_canonicalize_without_use:
+ @h='"canonicalize.h"' \
+ re='CAN_(EXISTING|ALL_BUT_LAST|MISSING)|canonicalize_(mode_t|filename_mode)' \
+ $(_header_without_use)
+
+sc_prohibit_root_dev_ino_without_use:
+ @h='"root-dev-ino.h"' \
+ re='(\<ROOT_DEV_INO_(CHECK|WARN)\>|\<get_root_dev_ino *\()' \
+ $(_header_without_use)
+
+sc_prohibit_openat_without_use:
+ @h='"openat.h"' \
+ re='\<(openat_(permissive|needs_fchdir|(save|restore)_fail)|l?(stat|ch(own|mod))at|(euid)?accessat)\>' \
+ $(_header_without_use)
+
+# Prohibit the inclusion of c-ctype.h without an actual use.
+ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\
+|isprint|ispunct|isspace|isupper|isxdigit|tolower|toupper
+sc_prohibit_c_ctype_without_use:
+ @h='[<"]c-ctype.h[">]' re='\<c_($(ctype_re)) *\(' $(_header_without_use)
+
+_empty =
+_sp = $(_empty) $(_empty)
+# The following list was generated by running:
+# man signal.h|col -b|perl -ne '/bsd_signal.*;/.../sigwaitinfo.*;/ and print' \
+# | perl -lne '/^\s+(?:int|void).*?(\w+).*/ and print $1' | fmt
+_sig_functions = \
+ bsd_signal kill killpg pthread_kill pthread_sigmask raise sigaction \
+ sigaddset sigaltstack sigdelset sigemptyset sigfillset sighold sigignore \
+ siginterrupt sigismember signal sigpause sigpending sigprocmask sigqueue \
+ sigrelse sigset sigsuspend sigtimedwait sigwait sigwaitinfo
+_sig_function_re = $(subst $(_sp),|,$(strip $(_sig_functions)))
+# The following were extracted from "man signal.h" manually.
+_sig_types_and_consts = \
+ MINSIGSTKSZ SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK \
+ SA_RESETHAND SA_RESTART SA_SIGINFO SIGEV_NONE SIGEV_SIGNAL \
+ SIGEV_THREAD SIGSTKSZ SIG_BLOCK SIG_SETMASK SIG_UNBLOCK SS_DISABLE \
+ SS_ONSTACK mcontext_t pid_t sig_atomic_t sigevent siginfo_t sigset_t \
+ sigstack sigval stack_t ucontext_t
+# generated via this:
+# perl -lne '/^#ifdef (SIG\w+)/ and print $1' lib/sig2str.c|sort -u|fmt -70
+_sig_names = \
+ SIGABRT SIGALRM SIGALRM1 SIGBUS SIGCANCEL SIGCHLD SIGCLD SIGCONT \
+ SIGDANGER SIGDIL SIGEMT SIGFPE SIGFREEZE SIGGRANT SIGHUP SIGILL \
+ SIGINFO SIGINT SIGIO SIGIOT SIGKAP SIGKILL SIGKILLTHR SIGLOST SIGLWP \
+ SIGMIGRATE SIGMSG SIGPHONE SIGPIPE SIGPOLL SIGPRE SIGPROF SIGPWR \
+ SIGQUIT SIGRETRACT SIGSAK SIGSEGV SIGSOUND SIGSTKFLT SIGSTOP SIGSYS \
+ SIGTERM SIGTHAW SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGUSR1 \
+ SIGUSR2 SIGVIRT SIGVTALRM SIGWAITING SIGWINCH SIGWIND SIGWINDOW \
+ SIGXCPU SIGXFSZ
+_sig_syms_re = $(subst $(_sp),|,$(strip $(_sig_names) $(_sig_types_and_consts)))
+
+# Prohibit the inclusion of signal.h without an actual use.
+sc_prohibit_signal_without_use:
+ @h='<signal.h>' \
+ re='\<($(_sig_function_re)) *\(|\<($(_sig_syms_re))\>' \
+ $(_header_without_use)
+
+sc_obsolete_symbols:
+ @re='\<(HAVE''_FCNTL_H|O''_NDELAY)\>' \
+ msg='do not use HAVE''_FCNTL_H or O'_NDELAY \
+ $(_prohibit_regexp)
+
+# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ
+
+# Each nonempty ChangeLog line must start with a year number, or a TAB.
+sc_changelog:
+ @if $(VC_LIST_EXCEPT) | grep -l '^ChangeLog$$' >/dev/null; then \
+ grep -n '^[^12 ]' \
+ $$($(VC_LIST_EXCEPT) | grep '^ChangeLog$$') && \
+ { echo '$(ME): found unexpected prefix in a ChangeLog' 1>&2; \
+ exit 1; } || :; \
+ fi
+
+# Ensure that each .c file containing a "main" function also
+# calls set_program_name.
+sc_program_name:
+ @if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \
+ files=$$(grep -l '^main *(' $$($(VC_LIST_EXCEPT) | grep '\.c$$')); \
+ grep -LE 'set_program_name *\(m?argv\[0\]\);' $$files \
+ | grep . && \
+ { echo '$(ME): the above files do not call set_program_name' \
+ 1>&2; exit 1; } || :; \
+ else :; \
+ fi
+
+# Require that the final line of each test-lib.sh-using test be this one:
+# Exit $fail
+# Note: this test requires GNU grep's --label= option.
+Exit_witness_file ?= tests/test-lib.sh
+Exit_base := $(notdir $(Exit_witness_file))
+sc_require_test_exit_idiom:
+ @if test -f $(srcdir)/$(Exit_witness_file); then \
+ die=0; \
+ for i in $$(grep -l -F 'srcdir/$(Exit_base)' \
+ $$($(VC_LIST) tests)); do \
+ tail -n1 $$i | grep '^Exit .' > /dev/null \
+ && : || { die=1; echo $$i; } \
+ done; \
+ test $$die = 1 && \
+ { echo 1>&2 '$(ME): the final line in each of the above is not:'; \
+ echo 1>&2 'Exit something'; \
+ exit 1; } || :; \
+ fi
+
+sc_the_the:
+ @re='\<the ''the\>' \
+ ignore_case=1 msg='found use of "the ''the";' \
+ $(_prohibit_regexp)
+
+sc_trailing_blank:
+ @re='[ ]$$' \
+ msg='found trailing blank(s)' \
+ $(_prohibit_regexp)
+
+# Match lines like the following, but where there is only one space
+# between the options and the description:
+# -D, --all-repeated[=delimit-method] print all duplicate lines\n
+longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)?
+sc_two_space_separator_in_usage:
+ @grep -nE '^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \
+ $$($(VC_LIST_EXCEPT)) && \
+ { echo "$(ME): help2man requires at least two spaces between"; \
+ echo "$(ME): an option and its description"; \
+ 1>&2; exit 1; } || :
+
+# Look for diagnostics that aren't marked for translation.
+# This won't find any for which error's format string is on a separate line.
+sc_unmarked_diagnostics:
+ @grep -nE \
+ '\<error \([^"]*"[^"]*[a-z]{3}' $$($(VC_LIST_EXCEPT)) \
+ | grep -v '_''(' && \
+ { echo '$(ME): found unmarked diagnostic(s)' 1>&2; \
+ exit 1; } || :
+
+# Avoid useless parentheses like those in this example:
+# #if defined (SYMBOL) || defined (SYM2)
+sc_useless_cpp_parens:
+ @grep -n '^# *if .*defined *(' $$($(VC_LIST_EXCEPT)) && \
+ { echo '$(ME): found useless parentheses in cpp directive' \
+ 1>&2; exit 1; } || :
+
+# Require the latest GPL.
+sc_GPL_version:
+ @re='either ''version [^3]' msg='GPL vN, N!=3' \
+ $(_prohibit_regexp)
+
+# Require the latest GFDL. Two regexp, since some .texi files end up
+# line wrapping between 'Free Documentation License,' and 'Version'.
+_GFDL_regexp = (Free ''Documentation.*Version 1\.[^3]|Version 1\.[^3] or any)
+sc_GFDL_version:
+ @re='$(_GFDL_regexp)' msg='GFDL vN, N!=3' \
+ $(_prohibit_regexp)
+
+cvs_keywords = \
+ Author|Date|Header|Id|Name|Locker|Log|RCSfile|Revision|Source|State
+
+sc_prohibit_cvs_keyword:
+ @re='\$$($(cvs_keywords))\$$' \
+ msg='do not use CVS keyword expansion' \
+ $(_prohibit_regexp)
+
+# Make sure we don't use st_blocks. Use ST_NBLOCKS instead.
+# This is a bit of a kludge, since it prevents use of the string
+# even in comments, but for now it does the job with no false positives.
+sc_prohibit_stat_st_blocks:
+ @re='[.>]st_blocks' msg='do not use st_blocks; use ST_NBLOCKS' \
+ $(_prohibit_regexp)
+
+# Make sure we don't define any S_IS* macros in src/*.c files.
+# They're already defined via gnulib's sys/stat.h replacement.
+sc_prohibit_S_IS_definition:
+ @re='^ *# *define *S_IS' \
+ msg='do not define S_IS* macros; include <sys/stat.h>' \
+ $(_prohibit_regexp)
+
+# Each program that uses proper_name_utf8 must link with one of the
+# ICONV libraries. Otherwise, some ICONV library must appear in LDADD.
+# The perl -0777 invocation below extracts the possibly-multi-line
+# definition of LDADD from the appropriate Makefile.am and exits 0
+# when it contains "ICONV".
+sc_proper_name_utf8_requires_ICONV:
+ @progs=$$(grep -l 'proper_name_utf8 ''("' $$($(VC_LIST_EXCEPT)));\
+ if test "x$$progs" != x; then \
+ fail=0; \
+ for p in $$progs; do \
+ dir=$$(dirname "$$p"); \
+ perl -0777 \
+ -ne 'exit !(/^LDADD =(.+?[^\\]\n)/ms && $$1 =~ /ICONV/)' \
+ $$dir/Makefile.am && continue; \
+ base=$$(basename "$$p" .c); \
+ grep "$${base}_LDADD.*ICONV)" $$dir/Makefile.am > /dev/null \
+ || { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \
+ done; \
+ test $$fail = 1 && \
+ { echo 1>&2 '$(ME): the above do not link with any ICONV library'; \
+ exit 1; } || :; \
+ fi
+
+# Warn about "c0nst struct Foo const foo[]",
+# but not about "char const *const foo" or "#define const const".
+sc_redundant_const:
+ @re='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b' \
+ msg='redundant "const" in declarations' \
+ $(_prohibit_regexp)
+
+sc_const_long_option:
+ @grep '^ *static.*struct option ' $$($(VC_LIST_EXCEPT)) \
+ | grep -Ev 'const struct option|struct option const' && { \
+ echo 1>&2 '$(ME): add "const" to the above declarations'; \
+ exit 1; } || :
+
+NEWS_hash = \
+ $$(sed -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \
+ $(srcdir)/NEWS \
+ | perl -0777 -pe \
+ 's/^Copyright.+?Free\sSoftware\sFoundation,\sInc\.\n//ms' \
+ | md5sum - \
+ | sed 's/ .*//')
+
+# Ensure that we don't accidentally insert an entry into an old NEWS block.
+sc_immutable_NEWS:
+ @if test -f $(srcdir)/NEWS; then \
+ test "$(NEWS_hash)" = '$(old_NEWS_hash)' && : || \
+ { echo '$(ME): you have modified old NEWS' 1>&2; exit 1; }; \
+ fi
+
+# Update the hash stored above. Do this after each release and
+# for any corrections to old entries.
+update-NEWS-hash: NEWS
+ perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \
+ $(srcdir)/cfg.mk
+
+# Ensure that we use only the standard $(VAR) notation,
+# not @...@ in Makefile.am, now that we can rely on automake
+# to emit a definition for each substituted variable.
+# We use perl rather than "grep -nE ..." to exempt a single
+# use of an @...@-delimited variable name in src/Makefile.am.
+# Allow the package to add exceptions via a hook in cfg.mk;
+# for example, @PRAGMA_SYSTEM_HEADER@ can be permitted by
+# setting this to ' && !/PRAGMA_SYSTEM_HEADER/'.
+_makefile_at_at_check_exceptions ?=
+sc_makefile_at_at_check:
+ @perl -ne '/\@[A-Z_0-9]+\@/'$(_makefile_at_at_check_exceptions) \
+ -e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}' \
+ $$($(VC_LIST_EXCEPT) | grep -E '(^|/)Makefile\.am$$') \
+ && { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || :
+
+news-check: NEWS
+ if head $(srcdir)/NEWS | grep -E $(news-check-regexp) \
+ >/dev/null; then \
+ :; \
+ else \
+ echo 'NEWS: $$(news-check-regexp) failed to match' 1>&2; \
+ exit 1; \
+ fi
+
+sc_makefile_TAB_only_indentation:
+ @grep -nE '^ [ ]{8}' \
+ $$($(VC_LIST_EXCEPT) | grep -E 'akefile|\.mk$$') \
+ && { echo '$(ME): found TAB-8-space indentation' 1>&2; \
+ exit 1; } || :
+
+sc_m4_quote_check:
+ @grep -nE '(AC_DEFINE(_UNQUOTED)?|AC_DEFUN)\([^[]' \
+ $$($(VC_LIST_EXCEPT) | grep -E '(^configure\.ac|\.m4)$$') \
+ && { echo '$(ME): quote the first arg to AC_DEF*' 1>&2; \
+ exit 1; } || :
+
+fix_po_file_diag = \
+'you have changed the set of files with translatable diagnostics;\n\
+apply the above patch\n'
+
+# Verify that all source files using _() are listed in po/POTFILES.in.
+po_file = po/POTFILES.in
+sc_po_check:
+ @if test -f $(po_file); then \
+ grep -E -v '^(#|$$)' $(po_file) \
+ | grep -v '^src/false\.c$$' | sort > $@-1; \
+ files=; \
+ for file in $$($(VC_LIST_EXCEPT)) lib/*.[ch]; do \
+ test -r $$file || continue; \
+ case $$file in \
+ *.m4|*.mk) continue ;; \
+ *.?|*.??) ;; \
+ *) continue;; \
+ esac; \
+ case $$file in \
+ *.[ch]) \
+ base=`expr " $$file" : ' \(.*\)\..'`; \
+ { test -f $$base.l || test -f $$base.y; } && continue;; \
+ esac; \
+ files="$$files $$file"; \
+ done; \
+ grep -E -l '\b(N?_|gettext *)\([^)"]*("|$$)' $$files \
+ | sort -u > $@-2; \
+ diff -u -L $(po_file) -L $(po_file) $@-1 $@-2 \
+ || { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; }; \
+ rm -f $@-1 $@-2; \
+ fi
+
+# Sometimes it is useful to change the PATH environment variable
+# in Makefiles. When doing so, it's better not to use the Unix-centric
+# path separator of `:', but rather the automake-provided `$(PATH_SEPARATOR)'.
+msg = '$(ME): Do not use `:'\'' above; use $$(PATH_SEPARATOR) instead'
+sc_makefile_path_separator_check:
+ @grep -nE 'PATH[=].*:' \
+ $$($(VC_LIST_EXCEPT) | grep -E 'akefile|\.mk$$') \
+ && { echo $(msg) 1>&2; exit 1; } || :
+
+# Check that `make alpha' will not fail at the end of the process.
+writable-files:
+ if test -d $(release_archive_dir); then :; else \
+ for file in $(distdir).tar.gz \
+ $(release_archive_dir)/$(distdir).tar.gz; do \
+ test -e $$file || continue; \
+ test -w $$file \
+ || { echo ERROR: $$file is not writable; fail=1; }; \
+ done; \
+ test "$$fail" && exit 1 || : ; \
+ fi
+
+v_etc_file = lib/version-etc.c
+sample-test = tests/sample-test
+texi = doc/$(PACKAGE).texi
+# Make sure that the copyright date in $(v_etc_file) is up to date.
+# Do the same for the $(sample-test) and the main doc/.texi file.
+sc_copyright_check:
+ @if test -f $(v_etc_file); then \
+ grep 'enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' $(v_etc_file) \
+ >/dev/null \
+ || { echo 'out of date copyright in $(v_etc_file); update it' 1>&2; \
+ exit 1; }; \
+ fi
+ @if test -f $(sample-test); then \
+ grep '# Copyright (C) '$$(date +%Y)' Free' $(sample-test) \
+ >/dev/null \
+ || { echo 'out of date copyright in $(sample-test); update it' 1>&2; \
+ exit 1; }; \
+ fi
+ @if test -f $(texi); then \
+ grep 'Copyright @copyright{} .*'$$(date +%Y)' Free' $(texi) \
+ >/dev/null \
+ || { echo 'out of date copyright in $(texi); update it' 1>&2; \
+ exit 1; }; \
+ fi
+
+# #if HAVE_... will evaluate to false for any non numeric string.
+# That would be flagged by using -Wundef, however gnulib currently
+# tests many undefined macros, and so we can't enable that option.
+# So at least preclude common boolean strings as macro values.
+sc_Wundef_boolean:
+ @grep -Ei '^#define.*(yes|no|true|false)$$' '$(CONFIG_INCLUDE)' && \
+ { echo 'Use 0 or 1 for macro values' 1>&2; exit 1; } || :
+
+sc_vulnerable_makefile_CVE-2009-4029:
+ @files=$$(find $(srcdir) -name Makefile.in); \
+ if test -n "$$files"; then \
+ grep -E \
+ 'perm -777 -exec chmod a\+rwx|chmod 777 \$$\(distdir\)' \
+ $$files && \
+ { echo '$(ME): the above files are vulnerable; beware of' \
+ 'running "make dist*" rules, and upgrade to fixed automake' \
+ 'see http://bugzilla.redhat.com/542609 for details' \
+ 1>&2; exit 1; } || :; \
+ else :; \
+ fi
+
+vc-diff-check:
+ (unset CDPATH; cd $(srcdir) && $(VC) diff) > vc-diffs || :
+ if test -s vc-diffs; then \
+ cat vc-diffs; \
+ echo "Some files are locally modified:" 1>&2; \
+ exit 1; \
+ else \
+ rm vc-diffs; \
+ fi
+
+rel-files = $(DIST_ARCHIVES)
+
+gnulib_dir ?= $(srcdir)/gnulib
+gnulib-version = $$(cd $(gnulib_dir) && git describe)
+bootstrap-tools ?= autoconf,automake,gnulib
+
+# If it's not already specified, derive the GPG key ID from
+# the signed tag we've just applied to mark this release.
+gpg_key_ID ?= \
+ $$(git cat-file tag v$(VERSION) > .ann-sig \
+ && gpgv .ann-sig - < /dev/null 2>&1 \
+ | sed -n '/.*key ID \([0-9A-F]*\)/s//\1/p'; rm -f .ann-sig)
+
+announcement: NEWS ChangeLog $(rel-files)
+ @$(build_aux)/announce-gen \
+ --release-type=$(RELEASE_TYPE) \
+ --package=$(PACKAGE) \
+ --prev=$(PREV_VERSION) \
+ --curr=$(VERSION) \
+ --gpg-key-id=$(gpg_key_ID) \
+ --news=$(srcdir)/NEWS \
+ --bootstrap-tools=$(bootstrap-tools) \
+ --gnulib-version=$(gnulib-version) \
+ --no-print-checksums \
+ $(addprefix --url-dir=, $(url_dir_list))
+
+## ---------------- ##
+## Updating files. ##
+## ---------------- ##
+
+ftp-gnu = ftp://ftp.gnu.org/gnu
+www-gnu = http://www.gnu.org
+
+upload_dest_dir_ ?= $(PACKAGE)
+emit_upload_commands:
+ @echo =====================================
+ @echo =====================================
+ @echo "$(build_aux)/gnupload $(GNUPLOADFLAGS) \\"
+ @echo " --to $(gnu_rel_host):$(upload_dest_dir_) \\"
+ @echo " $(rel-files)"
+ @echo '# send the ~/announce-$(my_distdir) e-mail'
+ @echo =====================================
+ @echo =====================================
+
+noteworthy = * Noteworthy changes in release ?.? (????-??-??) [?]
+define emit-commit-log
+ printf '%s\n' 'post-release administrivia' '' \
+ '* NEWS: Add header line for next release.' \
+ '* .prev-version: Record previous version.' \
+ '* cfg.mk (old_NEWS_hash): Auto-update.'
+endef
+
+.PHONY: no-submodule-changes
+no-submodule-changes:
+ if test -d $(srcdir)/.git; then \
+ diff=$$(cd $(srcdir) && git submodule -q foreach \
+ git diff-index --name-only HEAD) \
+ || exit 1; \
+ case $$diff in '') ;; \
+ *) echo '$(ME): submodule files are locally modified:'; \
+ echo "$$diff"; exit 1;; esac; \
+ else \
+ : ; \
+ fi
+
+.PHONY: alpha beta stable
+ALL_RECURSIVE_TARGETS += alpha beta stable
+alpha beta stable: $(local-check) writable-files no-submodule-changes
+ test $@ = stable \
+ && { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \
+ || { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\
+ || :
+ $(MAKE) vc-diff-check
+ $(MAKE) news-check
+ $(MAKE) distcheck
+ $(MAKE) dist XZ_OPT=-9ev
+ $(MAKE) $(release-prep-hook) RELEASE_TYPE=$@
+ $(MAKE) -s emit_upload_commands RELEASE_TYPE=$@
+
+# Override this in cfg.mk if you follow different procedures.
+release-prep-hook ?= release-prep
+
+.PHONY: release-prep
+release-prep:
+ case $$RELEASE_TYPE in alpha|beta|stable) ;; \
+ *) echo "invalid RELEASE_TYPE: $$RELEASE_TYPE" 1>&2; exit 1;; esac
+ $(MAKE) -s announcement > ~/announce-$(my_distdir)
+ if test -d $(release_archive_dir); then \
+ ln $(rel-files) $(release_archive_dir); \
+ chmod a-w $(rel-files); \
+ fi
+ echo $(VERSION) > $(prev_version_file)
+ $(MAKE) update-NEWS-hash
+ perl -pi -e '$$. == 3 and print "$(noteworthy)\n\n\n"' NEWS
+ $(emit-commit-log) > .ci-msg
+ $(VC) commit -F .ci-msg -a
+ rm .ci-msg
+
+.PHONY: web-manual
+web-manual:
+ @test -z "$(manual_title)" \
+ && { echo define manual_title in cfg.mk 1>&2; exit 1; } || :
+ @cd '$(srcdir)/doc'; \
+ $(SHELL) ../build-aux/gendocs.sh -o '$(abs_builddir)/doc/manual' \
+ --email $(PACKAGE_BUGREPORT) $(PACKAGE) \
+ "$(PACKAGE_NAME) - $(manual_title)"
+ @echo " *** Upload the doc/manual directory to web-cvs."
+
+# Code Coverage
+
+init-coverage:
+ $(MAKE) $(AM_MAKEFLAGS) clean
+ lcov --directory . --zerocounters
+
+COVERAGE_CCOPTS ?= "-g --coverage"
+COVERAGE_OUT ?= doc/coverage
+
+build-coverage:
+ $(MAKE) $(AM_MAKEFLAGS) CFLAGS=$(COVERAGE_CCOPTS) CXXFLAGS=$(COVERAGE_CCOPTS)
+ $(MAKE) $(AM_MAKEFLAGS) CFLAGS=$(COVERAGE_CCOPTS) CXXFLAGS=$(COVERAGE_CCOPTS) check
+ mkdir -p $(COVERAGE_OUT)
+ lcov --directory . --output-file $(COVERAGE_OUT)/$(PACKAGE).info \
+ --capture
+
+gen-coverage:
+ genhtml --output-directory $(COVERAGE_OUT) \
+ $(COVERAGE_OUT)/$(PACKAGE).info \
+ --highlight --frames --legend \
+ --title "$(PACKAGE_NAME)"
+
+coverage: init-coverage build-coverage gen-coverage
+
+# Update gettext files.
+PACKAGE ?= $(shell basename $(PWD))
+PO_DOMAIN ?= $(PACKAGE)
+POURL = http://translationproject.org/latest/$(PO_DOMAIN)/
+PODIR ?= po
+refresh-po:
+ rm -f $(PODIR)/*.po && \
+ echo "$(ME): getting translations into po (please ignore the robots.txt ERROR 404)..." && \
+ wget --no-verbose --directory-prefix $(PODIR) --no-directories --recursive --level 1 --accept .po --accept .po.1 $(POURL) && \
+ echo 'en@boldquot' > $(PODIR)/LINGUAS && \
+ echo 'en@quot' >> $(PODIR)/LINGUAS && \
+ ls $(PODIR)/*.po | sed 's/\.po//' | sed 's,$(PODIR)/,,' | sort >> $(PODIR)/LINGUAS
+
+INDENT_SOURCES ?= $(C_SOURCES)
+.PHONY: indent
+indent:
+ indent $(INDENT_SOURCES)
+
+# If you want to set UPDATE_COPYRIGHT_* environment variables,
+# put the assignments in this variable.
+update-copyright-env ?=
+
+# Run this rule once per year (usually early in January)
+# to update all FSF copyright year lists in your project.
+# If you have an additional project-specific rule,
+# add it in cfg.mk along with a line 'update-copyright: prereq'.
+# By default, exclude all variants of COPYING; you can also
+# add exemptions (such as ChangeLog..* for rotated change logs)
+# in the file .x-update-copyright.
+.PHONY: update-copyright
+update-copyright:
+ grep -l -w Copyright \
+ $$(export VC_LIST_EXCEPT_DEFAULT=COPYING && $(VC_LIST_EXCEPT)) \
+ | $(update-copyright-env) xargs $(build_aux)/$@
diff --git a/gnulib/users.txt b/gnulib/users.txt
new file mode 100644
index 00000000..f791d572
--- /dev/null
+++ b/gnulib/users.txt
@@ -0,0 +1,95 @@
+The following packages appear to be using gnulib and gnulib-tool:
+
+ Net::CDP http://search.cpan.org/src/MCHAPMAN/Net-CDP-0.09/libcdp/
+ OPeNDAP http://scm.opendap.org:8090/svn/trunk/
+ anubis http://cvs.sv.gnu.org/viewcvs/anubis/anubis/
+ augeas http://augeas.net/
+ autobuild http://josefsson.org/autobuild/
+ bison http://git.sv.gnu.org/gitweb/?p=bison.git
+ clisp http://clisp.cvs.sourceforge.net/clisp/clisp/
+ coreutils http://git.sv.gnu.org/gitweb/?p=coreutils.git
+ cpio http://cvs.sv.gnu.org/viewcvs/cpio/cpio/
+ cvs http://cvs.sv.gnu.org/viewcvs/cvs/ccvs/
+ diffutils http://git.sv.gnu.org/cgit/diffutils.git/
+ findutils http://cvs.sv.gnu.org/viewcvs/findutils/findutils/
+ gettext http://cvs.sv.gnu.org/viewcvs/gettext/gettext/
+ gnuit http://www.gnu.org/software/gnuit/
+ http://git.savannah.gnu.org/gitweb/?p=gnuit.git
+ gnutls http://cvs.gnupg.org/cgi-bin/viewcvs.cgi/gnutls/?root=GNU+TLS+Library
+ http://git.sv.gnu.org/gitweb/?p=gnutls.git
+ http://repo.or.cz/w/gnutls.git
+ gpg http://cvs.gnupg.org/cgi-bin/viewcvs.cgi/trunk/
+ gsasl http://git.sv.gnu.org/gitweb/?p=gsasl.git
+ gss http://git.sv.gnu.org/gitweb/?p=gss.git
+ gtk-vnc http://gtk-vnc.codemonkey.ws/hg/outgoing.hg
+ grep http://git.sv.gnu.org/cgit/grep.git/
+ guile http://cvs.sv.gnu.org/viewvc/guile/guile/guile-core/
+ gzip http://git.sv.gnu.org/cgit/gzip.git/
+ hello http://cvs.sv.gnu.org/viewcvs/hello/hello/
+ icoutils http://riva.ucam.org/svn/cjwatson/src/debian/icoutils/trunk/icoutils/
+ inetutils http://cvs.sv.gnu.org/viewcvs/inetutils/inetutils/
+ jwhois http://cvs.sv.gnu.org/viewvc/jwhois/jwhois/
+ libdap http://scm.opendap.org:8090/svn/trunk/libdap/
+ libffcall http://savannah.gnu.org/projects/libffcall/
+ libgnupdf http://cvs.savannah.gnu.org/viewvc/libgnupdf/?root=pdf
+ libguestfs http://libguestfs.org/
+ libiconv http://libiconv.cvs.sourceforge.net/libiconv/libiconv/
+ libidn http://git.sv.gnu.org/gitweb/?p=libidn.git
+ libksba http://cvs.gnupg.org/cgi-bin/viewcvs.cgi/trunk/?root=KSBA
+ libntlm http://git.josefsson.org/?p=libntlm.git;a=summary
+ libprelude https://trac.prelude-ids.org/browser/trunk/libprelude/
+ libpreludedb https://trac.prelude-ids.org/browser/trunk/libpreludedb/
+ libtasn1 http://cvs.gnupg.org/cgi-bin/viewcvs.cgi/libtasn1/?root=GNU+TLS+Library
+ http://repo.or.cz/w/libtasn1.git
+ libvirt http://libvirt.org/
+ http://git.et.redhat.com/?p=libvirt.git;a=summary
+ m4 http://git.sv.gnu.org/gitweb/?p=m4.git;a=summary
+ mailfromd http://svn.gnu.org.ua/viewvc/mailfromd/trunk/
+ mailutils http://cvs.sv.gnu.org/viewcvs/mailutils/mailutils/
+ man-db http://www.chiark.greenend.org.uk/~cjwatson/bzr/man-db/trunk/
+ miktex https://svn.sourceforge.net/svnroot/miktex/miktex/trunk
+ msmtp http://msmtp.cvs.sourceforge.net/msmtp/msmtp/
+ myserver http://git.sv.gnu.org/gitweb/?p=myserver.git;a=summary
+ netcf http://fedorahosted.org/netcf/
+ newts http://svn.arete.cc/newts/trunk/
+ parted http://git.debian.org/?p=parted/parted.git;a=summary
+ prelude-lml https://trac.prelude-ids.org/browser/trunk/prelude-lml/
+ prelude-manager https://trac.prelude-ids.org/browser/trunk/prelude-manager/
+ pspp http://git.sv.gnu.org/gitweb/?p=pspp.git
+ radius http://cvs.sv.gnu.org/viewcvs/radius/radius/
+ sed http://cvs.savannah.gnu.org/viewcvs/sed/?root=sed
+ shishi http://git.sv.gnu.org/gitweb/?p=shishi.git
+ tar http://cvs.sv.gnu.org/viewcvs/tar/tar/
+ texinfo http://cvs.sv.gnu.org/viewcvs/texinfo/texinfo/
+ vc-dwim http://git.sv.gnu.org/gitweb/?p=vc-dwim.git
+ wget http://hg.addictivecode.org/wget/mainline/
+ wydawca http://svn.gnu.org.ua/viewvc/wydawca/trunk/
+ wyslij-po http://svn.gnu.org.ua/viewvc/wyslij-po/trunk/
+ zile http://www.gnu.org/software/zile/
+
+The following packages are using gnulib without gnulib-tool:
+
+ libtool http://cvs.sv.gnu.org/viewcvs/libtool/libtool/
+ libgcrypt http://cvs.gnupg.org/cgi-bin/viewcvs.cgi/trunk/?root=Libgcrypt
+
+Articles:
+
+ "Using Gnulib to improve software portability",
+ by Diego 'Flameeyes' Pettenò on December 28, 2005,
+ http://www.linux.com/articles/50702
+
+-----
+
+Copyright (C) 2006-2010 Free Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation
+gives unlimited permission to copy and/or distribute it,
+with or without modifications, as long as this notice is preserved.
+
+-----
+
+Hey Emacs!
+Local Variables:
+indent-tabs-mode: nil
+whitespace-check-buffer-indent: nil
+End: